openhpi-3.6.1/0000755000175100017510000000000012605054416012156 5ustar mohanmohanopenhpi-3.6.1/ssl/0000755000175100017510000000000012605014442012752 5ustar mohanmohanopenhpi-3.6.1/ssl/Makefile.am0000644000175100017510000000127712575647301015031 0ustar mohanmohan# (C) Copyright IBM Corp 2003, 2004 # All rights reserved. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. MAINTAINERCLEANFILES = Makefile.in AM_CPPFLAGS = -DG_LOG_DOMAIN=\"ssl\" AM_CPPFLAGS += @OPENHPI_INCLUDES@ lib_LTLIBRARIES = libopenhpi_ssl.la libopenhpi_ssl_la_SOURCES = oh_ssl.c oh_ssl.h libopenhpi_ssl_la_LDFLAGS = -version-info @HPI_LIB_VERSION@ libopenhpi_ssl_la_LIBADD = @CRYPTO_LIB@ openhpi-3.6.1/ssl/oh_ssl.c0000644000175100017510000007564412575647301014441 0ustar mohanmohan/* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Bryan Sutula * Shuah Khan * Richard White * * * This file implements OpenSSL initialization and connection management * functionality such as open, close, send, and receive. * * The initialization is done here and called by the OpenHPI infrastructure, * so that individual modules and plugins don't have to worry about any * global OpenSSL initialization. Some of this initialization can only be * done once, so this is the best place for it. * * OpenSSL is a complex library, and the code to reliably communicate over * an SSL channel includes a number of subtle factors. Rather than having * each plug-in duplicate the effort to get this right, it's easier to * centralize SSL communication support in this library. * * The following functions are provided: * * oh_ssl_init() - Intializes the OpenSSL library (called by the * OpenHPI infrastructure only) * oh_ssl_ctx_init() - Creates a new SSL_CTX object * oh_ssl_ctx_free() - Free an SSL_CTX object * oh_ssl_connect() - Create and open a new ssl conection * oh_ssl_disconnect() - Close and free an SSL connection * oh_ssl_read() - Read from an SSL connection * oh_ssl_write() - Write to an SSL connection */ /* OpenSSL and other header files */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* Data types used by this module */ struct CRYPTO_dynlock_value { GMutex *mutex; }; /* Global (static) data for this module */ static int oh_ssl_init_done = 0; /* Will be set true when done */ static GMutex **mutexes = NULL; /* Holds array of SSL mutexes */ #if GLIB_CHECK_VERSION (2, 32, 0) static GMutex ssl_mutexes; /* Lock for above */ #else static GStaticMutex ssl_mutexes = G_STATIC_MUTEX_INIT; /* Lock for above */ #endif /* Local (static) functions, used by this module. Note that these aren't * necessary if we aren't compiling as a threaded implementation, so we * skip them in that case. */ /** * id_function * * SSL thread ID function * * Return value: a unique thread identifier, as an unsigned long **/ static unsigned long id_function(void) { return((unsigned long) g_thread_self()); } /** * lock_function * @mode: Includes the CRYPTO_LOCK bit if a lock is intended. Otherwise, * an unlock is desired. * @type: Ordinal number of the mutex being manipulated * @file: (unused) * @line: (unused) * * SSL mutex lock and unlock function. This is complicated, somewhat, * because we're trying to defer allocation of memory and mutexes until * they're actually needed. * * Note that OpenSSL defines that this function has no error return. In the * case where we can't allocate memory, we'll just have to return, pretending * that we did the lock. This will be a silent failure. The alternative * would be to allocate the array of mutex pointers during thread_setup(). * * Return value: (none) **/ static void lock_function(int mode, int type, const char * file, int line) { /* Do we have an array of mutex pointers yet? */ if (! mutexes) { /* Messing with this requires the static lock */ wrap_g_static_mutex_lock(&ssl_mutexes); if (! mutexes) { /* Need to check again */ mutexes = (GMutex **)g_malloc0(CRYPTO_num_locks() * sizeof(GMutex *)); if (! mutexes) { CRIT("out of memory"); wrap_g_static_mutex_unlock(&ssl_mutexes); return; } } wrap_g_static_mutex_unlock(&ssl_mutexes); } /* Have we initialized this particular mutex? */ if (! mutexes[type]) { /* Same firedrill as above */ wrap_g_static_mutex_lock(&ssl_mutexes); if (! mutexes[type]) { mutexes[type] = wrap_g_mutex_new_init(); } wrap_g_static_mutex_unlock(&ssl_mutexes); } /* Finally, go ahead and lock or unlock it */ if (mode & CRYPTO_LOCK) { g_mutex_lock(mutexes[type]); } else { g_mutex_unlock(mutexes[type]); } } /** * dyn_create_function * @file: (unused) * @line: (unused) * * Function to create and initialize dynlock mutexes * * Return value: pointer to dynlock structure, or NULL on failure (out of mem) **/ static struct CRYPTO_dynlock_value *dyn_create_function(const char *file, int line) { struct CRYPTO_dynlock_value *value; if ((value = (struct CRYPTO_dynlock_value *) g_malloc0(sizeof(struct CRYPTO_dynlock_value)))) { value->mutex = wrap_g_mutex_new_init(); } else { CRIT("out of memory"); } return(value); } /** * dyn_lock_function * @mode: Includes the CRYPTO_LOCK bit if a lock is intended. Otherwise, * an unlock is desired. * @l: Pointer to dynlock structure returned by dyn_create_function() * @file: (unused) * @line: (unused) * * Function to lock and unlock dynlock mutexes * * Return value: (none) **/ static void dyn_lock_function(int mode, struct CRYPTO_dynlock_value *l, const char *file, int line) { if (mode & CRYPTO_LOCK) { g_mutex_lock(l->mutex); } else { g_mutex_unlock(l->mutex); } } /** * dyn_destroy_function * @l: Pointer to dynlock structure returned by dyn_create_function() * @file: (unused) * @line: (unused) * * Function to destroy dynlock mutexes * * Return value: (none) **/ static void dyn_destroy_function(struct CRYPTO_dynlock_value *l, const char *file, int line) { wrap_g_mutex_free_clear(l->mutex); g_free(l); } /** * thread_setup * * Set up multi-thread protection used by the SSL library * * Return value: 0 for success, -1 for failure **/ static int thread_setup(void) { /* Register our locking functions with the SSL library */ CRYPTO_set_id_callback(id_function); CRYPTO_set_locking_callback(lock_function); CRYPTO_set_dynlock_create_callback(dyn_create_function); CRYPTO_set_dynlock_lock_callback(dyn_lock_function); CRYPTO_set_dynlock_destroy_callback(dyn_destroy_function); return(0); /* No errors */ } /** * thread_cleanup * * Clean up multi-thread protection used by the SSL library. * * Note that this function is not currently used because there is no shutdown * code for plugins. It is left here in case that happens in the future. * * Return value: 0 for success, -1 for failure (though it currently can't fail) **/ static int thread_cleanup(void) { int i; /* Nullify the locking functions we registered with the SSL library */ CRYPTO_set_id_callback(NULL); CRYPTO_set_locking_callback(NULL); CRYPTO_set_dynlock_create_callback(NULL); CRYPTO_set_dynlock_lock_callback(NULL); CRYPTO_set_dynlock_destroy_callback(NULL); /* Clean up and destroy mutexes, if we have any */ wrap_g_static_mutex_lock(&ssl_mutexes); if (mutexes) { for (i = 0; i < CRYPTO_num_locks(); i++) { if (mutexes[i]) { wrap_g_mutex_free_clear(mutexes[i]); } } g_free(mutexes); mutexes = NULL; } wrap_g_static_mutex_unlock(&ssl_mutexes); wrap_g_static_mutex_free_clear(&ssl_mutexes); return(0); /* No errors */ } /** * oh_ssl_init * * Intialize the OpenSSL library. Note that the calls used in this routine * set up global data and are only to be called once for an SSL-based program. * To enforce this while allowing multiple callers (plugins) to initialize * the library, we use a static global variable to mark when we've done the * initialization. * * Note that the thread-safe initialization portion requires that * g_thread_init() has already been called, so don't call this routine * before then. * * Return value: 0 for success, -1 for failure **/ int oh_ssl_init(void) { if (! oh_ssl_init_done) { /* Do this only once */ oh_ssl_init_done = 1; /* Load error strings to provide human-readable error * messages */ SSL_load_error_strings(); ERR_load_BIO_strings(); /* Initialize the SSL library */ if (! SSL_library_init()) { CRIT("SSL_library_init() failed"); return(-1); } #ifndef NO_SSL_RAND_SEED /* In case this isn't portable */ /* Actions to seed PRNG */ RAND_load_file("/dev/urandom", 1024); #endif /* Set up multi-thread protection functions */ if (thread_setup() ) { CRIT("SSL multi-thread protection setup call failed"); return(-1); } } return(0); /* Successful return */ } /** * oh_ssl_finit * * Finalizes the OpenSSL library. The calls used in this routine releases global * data created/initialized by the OpenSSL library. * * Note that it is the responisbility of the caller of this function to make * sure that no other threads are making the OpenSSL library calls. The openhpid * should close all the threads and call this function from the main (single) * thread. * * Return value: None **/ void oh_ssl_finit(void) { /* TODO: Check whether any other SSL library cleanup should be called */ thread_cleanup(); ENGINE_cleanup(); CONF_modules_unload(0); ERR_free_strings(); EVP_cleanup(); CRYPTO_cleanup_all_ex_data(); /* The valgrind is showing possible memory leak by * SSL_COMP_get_compression_methods() call. * * Call to SSL_free_comp_methods() may resolve the memory leak. * But not able to find this call in the openssl 0.9.8e * TODO: Find whether its a real problem or not */ } /** * oh_ssl_ctx_init * * Create a new SSL_CTX object as a framework for TLS/SSL enabled functions. * In particular: * - Creates a new CTX object with default option values * - Sets common compatibility options * - Sets the default locations for trusted CA certificates. * SSL_CTX_set_default_verify_paths() is used to add system-wide default * certificate paths to the verify CApath without having to specify a * default location. The intent is that the distribution's configured * location will be used. * * Return value: pointer to SSL_CTX or NULL for failure **/ SSL_CTX *oh_ssl_ctx_init() { SSL_CTX *ctx; ctx = SSL_CTX_new(SSLv23_client_method()); if (ctx == NULL) { CRIT("SSL_CTX_new() failed"); return(NULL); } SSL_CTX_set_options(ctx, SSL_OP_TLS_ROLLBACK_BUG | SSL_OP_ALL); if (! SSL_CTX_set_default_verify_paths(ctx)) { CRIT("SSL_CTX_set_default_verify_paths() failed"); return(NULL); } return(ctx); } /** * oh_ssl_ctx_free * @ctx: pointer to SSL_CTX as returned by oh_ssl_ctx_init() * * Free an SSL_CTX object * * Return value: 0 for success, -1 for failure **/ int oh_ssl_ctx_free(SSL_CTX *ctx) { if (ctx == NULL) { CRIT("unexpected NULL ctx pointer"); return(-1); } SSL_CTX_free(ctx); return(0); } /** * oh_ssl_connect * @hostname: Name of target host. Format: * "hostname:port" or "IPaddress:port" * @ctx: pointer to SSL_CTX as returned by oh_ssl_ctx_init() * @timeout: maximum number of seconds to wait for a connection to * hostname, or zero to wait forever * * Create and open a new ssl conection to the specified host. * * Return value: pointer to BIO, or NULL for failure **/ BIO *oh_ssl_connect(char *hostname, SSL_CTX *ctx, long timeout) { BIO *bio; SSL *ssl; int err; int len, retval = 0; int RetVal, socket_desc = 0; char *Server = NULL; char *Port = NULL; struct addrinfo Hints, *AddrInfo = NULL, *ai = NULL; memset(&Hints, 0, sizeof(Hints)); Hints.ai_family = AF_UNSPEC; Hints.ai_socktype = SOCK_STREAM; len = strlen(hostname); if (hostname == NULL) { CRIT("NULL hostname in oh_ssl_connect()"); return(NULL); } if (ctx == NULL) { CRIT("NULL ctx in oh_ssl_connect()"); return(NULL); } if (timeout < 0) { CRIT("inappropriate timeout in oh_ssl_connect()"); return(NULL); } /* Allocate memory to a char pointer "Server" */ Server = (char *) g_malloc0(sizeof(char) * len); if (Server == NULL){ CRIT("out of memory"); return NULL; } memset(Server, 0, len); /* hostname contains "Port" along with "IP Address". As, only * "IP Address" is needed for some of the below operations, so copy * "IP Address" from hostname to "Server". */ strncpy(Server, hostname, (len - 4)); /* Allocate memory to a char pointer "Port" */ Port = (char *) g_malloc0(sizeof(char) * 4); if (Port == NULL){ CRIT("out of memory"); g_free(Server); return NULL; } /* As Port number is needed separately for some of the below * operations, so copy port number from hostname to "Port". */ strncpy(Port, hostname + (len - 3), 3); /* Create socket address structure to prepare client socket */ RetVal = getaddrinfo(Server, Port, &Hints, &AddrInfo); if (RetVal != 0) { CRIT("Cannot resolve address [%s] and port [%s]," " error %d: %s", Server, Port, RetVal, gai_strerror(RetVal)); g_free(Server); g_free(Port); return NULL; } ai = AddrInfo; /* Create a socket point */ socket_desc = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol); if (socket_desc == -1) { CRIT("Socket failed with error: %s", strerror(errno)); g_free(Server); g_free(Port); freeaddrinfo(AddrInfo); return NULL; } /* Now connect to target IP Address */ retval = connect(socket_desc, ai->ai_addr, ai->ai_addrlen); if (retval != 0) { CRIT("Socket connect failed with error: %s", strerror(errno)); g_free(Server); g_free(Port); freeaddrinfo(AddrInfo); close(socket_desc); return NULL; } /* Create new SSL structure for connection */ ssl = SSL_new(ctx); /* Connect ssl object with a socket descriptor */ SSL_set_fd(ssl, socket_desc); /* Initiate SSL connection */ err = SSL_connect(ssl); if (err != 1) { CRIT("SSL connection failed"); g_free(Server); g_free(Port); freeaddrinfo(AddrInfo); close(socket_desc); return (NULL); } bio = BIO_new(BIO_f_ssl()); /* create an ssl BIO */ BIO_set_ssl(bio, ssl, BIO_CLOSE); /* assign the ssl BIO to SSL */ /* TODO: Do I need to set the client or server mode here? I don't * think so. */ g_free(Server); g_free(Port); freeaddrinfo(AddrInfo); return(bio); } /** * oh_ssl_disconnect * @bio: pointer to a BIO as returned by oh_ssl_connect() * @shutdown: Selects a uni-directional or bi-directional SSL shutdown. * See the SSL_shutdown() man page. * * Close the SSL connection and free the memory associated with it. * * Return value: 0 for success, -1 for failure **/ int oh_ssl_disconnect(BIO *bio, enum OH_SSL_SHUTDOWN_TYPE shutdown) { SSL *ssl; int ret, fd; if (bio == NULL) { CRIT("NULL bio in oh_ssl_disconnect()"); return(-1); } /* Shut down the SSL connection. This may involve a handshake with * the server. */ BIO_get_ssl(bio, &ssl); if (ssl == NULL) { CRIT("BIO_get_ssl() failed"); return(-1); } ret = SSL_shutdown(ssl); if (ret == -1) { CRIT("SSL_shutdown() failed"); /* Continuing on to free BIO memory */ } else if ((ret == 0) && (shutdown == OH_SSL_BI)) { /* Still need stage 2 shutdown (see SSL_shutdown() man page) */ ret = SSL_shutdown(ssl); if (ret == -1) { CRIT("SSL_shutdown() failed"); /* Continuing on to free BIO memory */ } else if (ret == 0) { CRIT("stage 2 of SSL_shutdown() failed"); /* Continuing on to free BIO memory */ } } /* Close the socket */ fd = SSL_get_fd(ssl); if (fd == -1) { CRIT("SSL_get_fd() failed"); return(-1); } close(fd); /* Free the connection */ BIO_free_all(bio); return(0); } /** * oh_ssl_read * @bio: pointer to a BIO as returned by oh_ssl_connect() * @buf: buffer for the data which is read from the connection * @size: maximum number of bytes to be read into buf * @timeout: maximum number of seconds to wait for input to be available, * or zero to wait forever * * Read from an existing SSL connection. The data and number of bytes read * are returned. * * Note that oh_ssl_read() and oh_ssl_write() have some subtle differences * in behavior. While oh_ssl_write() will try to write all the bytes, * oh_ssl_read() will return as soon as it has read some data. * * Return value: (as follows) * >0: number of bytes read * 0: nothing more to read; remote host closed the connection * -1: SSL or other error * -2: Timeout **/ int oh_ssl_read(BIO *bio, char *buf, int size, long timeout) { SSL *ssl; int bytes = 0; fd_set readfds; fd_set writefds; struct timeval tv; int read_wait; int done; int err; int fd; int e = 0; if (bio == NULL) { CRIT("NULL bio in oh_ssl_read()"); return(-1); } if (buf == NULL) { CRIT("NULL buf in oh_ssl_read()"); return(-1); } if (size <= 0) { CRIT("inappropriate size in oh_ssl_read()"); return(-1); } if (timeout < 0) { CRIT("inappropriate timeout in oh_ssl_read()"); return(-1); } /* Get underlying file descriptor, needed for select call */ fd = BIO_get_fd(bio, NULL); if (fd == -1) { CRIT("BIO doesn't seem to be initialized in oh_ssl_read()"); return(-1); } /* We also need the SSL connection pointer */ BIO_get_ssl(bio, &ssl); if (ssl == NULL) { CRIT("BIO_get_ssl() failed"); return(-1); } /* Because of SSL renegotiations, we may have to wait on a socket * write even though we're trying to do a read. The initial value * of read_wait indicates that we're trying to read, but it can be * set to 0 if we end up waiting for a socket write. */ read_wait = 1; done = 0; /* We have to loop on the read call, until we get something we * can return to the user. */ while (! done) { /* First, we need to wait until something happens on the * underlying socket. We are either waiting for a read * or a write (but not both). */ FD_ZERO(&readfds); FD_ZERO(&writefds); if (read_wait) { FD_SET(fd, &readfds); } else { FD_SET(fd, &writefds); } if (timeout) { tv.tv_sec = timeout; tv.tv_usec = 0; err = select(fd + 1, &readfds, &writefds, NULL, &tv); } else { /* No timeout */ err = select(fd + 1, &readfds, &writefds, NULL, NULL); } /* Evaluate select() return code */ if (err < 0) { CRIT("error during select()"); return(-1); } if (err == 0) { return(-2); /* Timeout */ } /* The socket has something. Ready to try (or re-try) * the read call. */ ERR_clear_error(); bytes = SSL_read(ssl, buf, size); switch (SSL_get_error(ssl, bytes)) { case SSL_ERROR_NONE: /* No error */ if (bytes) { done = 1; } break; case SSL_ERROR_ZERO_RETURN: /* Connection was closed. For this case, * since it's normal for the remote host * to close when it's done, we'll not signal * any error, but will return zero bytes. */ return(0); case SSL_ERROR_WANT_READ: read_wait = 1; break; case SSL_ERROR_WANT_WRITE: read_wait = 0; break; case SSL_ERROR_SSL: e = ERR_get_error(); CRIT("SSL_read reported error %s", ERR_error_string(e, NULL)); return(-1); case SSL_ERROR_SYSCALL: e = ERR_get_error(); if (bytes == 0 ) { CRIT("No bytes read"); } else if ( bytes == -1 ) { CRIT("Reading data error %s", strerror(errno)); } else { CRIT("SSL_read error %s", ERR_error_string(e, NULL)); } return(-1); default: /* Some other sort of error */ e = ERR_get_error(); CRIT("SSL_read reported error %s", ERR_error_string(e, NULL)); return(-1); } } return(bytes); } /** * oh_ssl_write * @bio: pointer to a BIO as returned by oh_ssl_connect() * @buf: buffer to write to the connection * @size: number of bytes to be written * @timeout: maximum number of seconds to wait for the remote host to * accept the data, or zero to wait forever * * Write data to an existing SSL connection. * * Note that oh_ssl_read() and oh_ssl_write() have some subtle differences * in behavior. While oh_ssl_read() returns as soon as it has data for the * caller, oh_ssl_write() does not return until all the bytes have been * written to the remote host. * * Return value: (as follows) * 0: success * -1: error * -2: timeout **/ int oh_ssl_write(BIO *bio, char *buf, int size, long timeout) { SSL *ssl; int bytes; fd_set readfds; fd_set writefds; struct timeval tv; int write_wait; int done; int err; int fd; int sent; int e = 0; if (bio == NULL) { CRIT("NULL bio in oh_ssl_write()"); return(-1); } if (buf == NULL) { CRIT("NULL buf in oh_ssl_write()"); return(-1); } if (size <= 0) { CRIT("inappropriate size in oh_ssl_write()"); return(-1); } if (timeout < 0) { CRIT("inappropriate timeout in oh_ssl_write()"); return(-1); } /* Get underlying file descriptor, needed for select call */ fd = BIO_get_fd(bio, NULL); if (fd == -1) { CRIT("BIO doesn't seem to be initialized in oh_ssl_write()"); return(-1); } /* We also need the SSL connection pointer */ BIO_get_ssl(bio, &ssl); if (ssl == NULL) { CRIT("BIO_get_ssl() failed"); return(-1); } /* Because of SSL renegotiations, we may have to wait on a socket * read even though we're trying to do a write. The initial value * of write_wait indicates that we're trying to write, but it can * be set to 0 if we end up waiting for a socket read. */ write_wait = 1; done = 0; sent = 0; /* We have to loop on the write call, until everything gets written */ while (! done) { /* First, we need to wait until something happens on the * underlying socket. We are either waiting for a read * or a write (but not both). */ FD_ZERO(&readfds); FD_ZERO(&writefds); if (write_wait) { FD_SET(fd, &writefds); } else { FD_SET(fd, &readfds); } if (timeout) { tv.tv_sec = timeout; tv.tv_usec = 0; err = select(fd + 1, &readfds, &writefds, NULL, &tv); } else { /* No timeout */ err = select(fd + 1, &readfds, &writefds, NULL, NULL); } /* Evaluate select() return code */ if (err < 0) { CRIT("error during select()"); return(-1); } if (err == 0) { return(-2); /* Timeout */ } /* The socket is ready. Ready to try (or re-try) the write * call. */ ERR_clear_error(); bytes = SSL_write(ssl, buf + sent, size - sent); switch (SSL_get_error(ssl, bytes)) { case SSL_ERROR_NONE: /* No error */ sent += bytes; if (sent == size) { done = 1; } break; case SSL_ERROR_ZERO_RETURN: /* Connection was closed. Since we're trying * to write, this is an error condition. */ CRIT("remote host unexpectedly closed" " the connection"); return(-1); case SSL_ERROR_WANT_READ: write_wait = 0; break; case SSL_ERROR_WANT_WRITE: write_wait = 1; break; case SSL_ERROR_SSL: e = ERR_get_error(); CRIT("SSL_write reported error %s", ERR_error_string(e, NULL)); return(-1); case SSL_ERROR_SYSCALL: e = ERR_get_error(); if (bytes == 0 ) { CRIT("No bytes written"); } else if ( bytes == -1 ) { CRIT("Writing data error %s", strerror(errno)); } else { CRIT("SSL_write error %s", ERR_error_string(e, NULL)); } return(-1); default: /* Some other sort of error */ e = ERR_get_error(); CRIT("SSL_write reported error %s", ERR_error_string(e, NULL)); return(-1); } } return(0); } openhpi-3.6.1/ssl/oh_ssl.h0000644000175100017510000000621012575647301014425 0ustar mohanmohan/* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Bryan Sutula * Shuah Khan * Richard White * * This file defines prototype(s) for SSL initialization and support functions. * * The contents have been #ifdef'd so that it can be included by files * needing potential SSL initialization code, but during builds without * an SSL library. In other words, it should be safe to include this * file from any OpenHPI source. */ #ifndef __OH_SSL_H #define __OH_SSL_H /* Include files */ #include #ifdef HAVE_OPENSSL #include #include #include #include #include #endif /* Data types used while using these routines */ #ifdef HAVE_OPENSSL enum OH_SSL_SHUTDOWN_TYPE { /* See SSL_shutdown man page */ OH_SSL_UNI, /* Unidirectional SSL shutdown */ OH_SSL_BI /* Bidirectional SSL shutdown */ }; #endif /* * Prototypes for the SSL connection management functions that are * implemented in oh_ssl.c */ #ifdef HAVE_OPENSSL extern int oh_ssl_init(void); extern void oh_ssl_finit(void); extern SSL_CTX *oh_ssl_ctx_init(void); extern int oh_ssl_ctx_free(SSL_CTX *ctx); extern BIO *oh_ssl_connect(char *hostname, SSL_CTX *ctx, long timeout); extern int oh_ssl_disconnect(BIO *bio, enum OH_SSL_SHUTDOWN_TYPE shutdown); extern int oh_ssl_read(BIO *bio, char *buf, int size, long timeout); extern int oh_ssl_write(BIO *bio, char *buf, int size, long timeout); #endif #endif /* __OH_SSL_H */ openhpi-3.6.1/snmp/0000755000175100017510000000000012605014442013126 5ustar mohanmohanopenhpi-3.6.1/snmp/snmp_utils.c0000644000175100017510000003716512575647301015517 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003, 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales * David Judkovics * */ #include #include #include #include /** * snmp_get * @ss: a handle to the snmp session needed to make an * snmp transaction. * @objid: string containing the OID entry. * @value: the value received from snmp will be put in this union. * * Gets a single value indicated by the objectid using snmp. * In the case of multiple values being returned, the type in @value will be * ASN_NULL (0x05). Nothing else in @value will be filled in. * * Returns: 0 if successful, <0 if there was an error. **/ SaErrorT snmp_get( void *sessp, const char *objid, struct snmp_value *value) { struct snmp_pdu *pdu; struct snmp_pdu *response; struct snmp_session *session; oid anOID[MAX_OID_LEN]; size_t anOID_len = MAX_OID_LEN; struct variable_list *vars; SaErrorT returncode = SA_OK; int status; /* * Create the PDU for the data for our request. */ pdu = snmp_pdu_create(SNMP_MSG_GET); read_objid(objid, anOID, &anOID_len); snmp_add_null_var(pdu, anOID, anOID_len); /* * Send the Request out. */ status = snmp_sess_synch_response(sessp, pdu, &response); /* * Process the response. */ if (status == STAT_SUCCESS) { if(response->errstat == SNMP_ERR_NOERROR) { vars = response->variables; value->type = vars->type; if (vars->next_variable != NULL) { /* There are more values, set return type to null. */ value->type = ASN_NULL; } else if ( !(CHECK_END(vars->type)) ) { /* This is one of the exception condition */ returncode = SA_ERR_HPI_NOT_PRESENT; DBG("Warning: OID=%s gets snmp exception %d \n",objid, vars->type); } else if ( (vars->type == ASN_INTEGER) || (vars->type == ASN_COUNTER) || (vars->type == ASN_UNSIGNED) ) { value->integer = *(vars->val.integer); } else { value->str_len = vars->val_len; if (value->str_len >= MAX_ASN_STR_LEN) value->str_len = MAX_ASN_STR_LEN; if (value->str_len > 0) memcpy(value->string, vars->val.string, value->str_len); value->string[value->str_len] = '\0'; /* guarantee NULL terminated string */ } } else { DBG("Error in packet %s\nReason: %s\n", objid, snmp_errstring(response->errstat)); returncode = errstat2hpi(response->errstat); } } else { value->type = (u_char)0x00; session = snmp_sess_session(sessp); snmp_sess_perror("snmpget", session); DBG("OID %s, error status: %d\n",objid, status); returncode = snmpstat2hpi(status); } /* Clean up: free the response */ if (response) snmp_free_pdu(response); return (returncode); } /** * snmp_set * @ss: a handle to the snmp session needed to make an snmp transaction. * @objid: string containing the OID to set. * @value: the value to set the oid with. * * Sets a value where indicated by the objectid * using snmp. * * Returns: 0 if Success, less than 0 if Failure. **/ SaErrorT snmp_set( void *sessp, char *objid, struct snmp_value value) { struct snmp_pdu *pdu; struct snmp_pdu *response; struct snmp_session *session; oid anOID[MAX_OID_LEN]; size_t anOID_len = MAX_OID_LEN; void *dataptr = NULL; int status = 0; SaErrorT rtncode = 0; /* * Create the PDU for the data for our request. */ pdu = snmp_pdu_create(SNMP_MSG_SET); read_objid(objid, anOID, &anOID_len); rtncode = 0; /* Default - All is OK */ switch (value.type) { case ASN_INTEGER: case ASN_UNSIGNED: case ASN_COUNTER: dataptr = &value.integer; break; case ASN_OCTET_STR: dataptr = value.string; break; default: rtncode = SA_ERR_HPI_INVALID_PARAMS; CRIT("datatype %c not yet supported by snmp_set()\n", value.type); break; } if (rtncode == 0) { /* * Set the data to send out */ /* Old code - int rc = snmp_add_var(pdu, objid, objid_len, datatype, dataptr) */ /* was missing checking for rc, so there was no OID and no data was */ /* included in the package. */ /* Since snmp_add_var() converts input data to string then call */ /* snmp_pdu_add_variable(), we stick with add_variable() for efficiency */ snmp_pdu_add_variable(pdu, anOID, anOID_len, value.type, dataptr, value.str_len); /* * Send the Request out. */ status = snmp_sess_synch_response(sessp, pdu, &response); /* * Process the response. */ if (status == STAT_SUCCESS) rtncode = errstat2hpi(response->errstat); else { session = snmp_sess_session(sessp); snmp_sess_perror("snmpset", session); rtncode = snmpstat2hpi(status);; } /* Clean up: free the response */ if (response) snmp_free_pdu(response); } return rtncode; } /** * snmp_get2: Gets a single value indicated by the objectid * using snmp. * @handle: a handle to the snmp session needed to make an * snmp transaction. * @objid: string containing the OID entry. * @value: the value received from snmp will be put in this union. * * In the case of multiple values being returned, the type in 'value' will be * ASN_NULL (0x05). Nothing else in 'value' will be filled in. * Use snmp_get_all for doing gets that return multiple values. * * Return value: Returns 0 if successful, <0 if there was an error. **/ SaErrorT snmp_get2(void *sessp, oid *objid, size_t objid_len, struct snmp_value *value) { struct snmp_pdu *pdu; struct snmp_pdu *response; struct snmp_session *session; struct variable_list *vars; SaErrorT returncode = SA_OK; int i; int status; /* * Create the PDU for the data for our request. */ pdu = snmp_pdu_create(SNMP_MSG_GET); snmp_add_null_var(pdu, objid, objid_len); /* * Send the Request out. */ status = snmp_sess_synch_response(sessp, pdu, &response); /* * Process the response. */ if (status == STAT_SUCCESS) { if (response->errstat == SNMP_ERR_NOERROR) { vars = response->variables; value->type = vars->type; if (vars->next_variable != NULL) { /* If there are more values, set return type to null. */ value->type = ASN_NULL; } else if ( !(CHECK_END(vars->type)) ) { /* This is one of the exception condition */ returncode = SA_ERR_HPI_NOT_PRESENT; DBG("snmp exception %d \n",vars->type); } else if ( (vars->type == ASN_INTEGER) || (vars->type == ASN_COUNTER) || (vars->type == ASN_UNSIGNED) ) { value->integer = *(vars->val.integer); } else { value->str_len = vars->val_len; if (value->str_len >= MAX_ASN_STR_LEN) value->str_len = MAX_ASN_STR_LEN; else value->string[value->str_len] = '\0'; memcpy(value->string, vars->val.string, value->str_len); } /* display data */ #ifdef DEBUG if (CHECK_END(vars->type)) { fprintf(stderr, "*** snmp_get2 ******************************************\n"); fprint_variable(stderr, vars->name, vars->name_length, vars); fprintf(stderr, "********************************************************\n"); } else { CRIT("snmp_get2(): No idea.Unknown Type: %X", vars->type); fprint_variable(stderr, vars->name, vars->name_length, vars); } #endif } else { CRIT("Error, Reason: %s", snmp_errstring(response->errstat)); fprintf(stderr, "objid: "); for(i = 0; ierrstat); } } else { session = snmp_sess_session(sessp); snmp_sess_perror("snmpget", session); returncode = snmpstat2hpi(status); } /* Clean up: free the response */ sc_free_pdu(&response); return (returncode); } /** * snmp_set2: Gets a single value indicated by the objectid * using snmp. * @handle: a handle to the snmp session needed to make an * snmp transaction. * @objid: string containing the OID entry. * @value: the value received from snmp will be put in this union. * * In the case of multiple values being returned, the type in 'value' will be * ASN_NULL (0x05). Nothing else in 'value' will be filled in. * Use snmp_get_all for doing gets that return multiple values. * * Return value: Returns 0 if successful, -1 if there was an error. **/ SaErrorT snmp_set2(void *sessp, oid *objid, size_t objid_len, struct snmp_value *value) { struct snmp_pdu *pdu; struct snmp_pdu *response; struct variable_list *vars; struct snmp_session *session; void *dataptr = NULL; int status = 0; SaErrorT rtncode = SA_OK; /* Default - All is OK */ /* * Create the PDU for the data for our request. */ pdu = snmp_pdu_create(SNMP_MSG_SET); switch (value->type) { case ASN_INTEGER: case ASN_UNSIGNED: case ASN_COUNTER: dataptr = &value->integer; break; case ASN_OCTET_STR: dataptr = value->string; break; default: rtncode = SA_ERR_HPI_INVALID_PARAMS; CRIT("datatype %c not yet supported by snmp_set2()", value->type); break; } if (rtncode == SA_OK) { /* * Set the data to send out */ /* Old code - snmp_add_var(pdu, objid, objid_len, datatype, dataptr); */ //int retcode = snmp_add_var(pdu, objid, objid_len, datatype, dataptr); snmp_pdu_add_variable(pdu, objid, objid_len, value->type, dataptr, value->str_len); /* * Send the Request out. */ status = snmp_sess_synch_response(sessp, pdu, &response); /* * Process the response. */ if (status == STAT_SUCCESS) { vars = response->variables; if (response->errstat == SNMP_ERR_NOERROR) { /* display data */ #ifdef DEBUG fprintf(stderr, "*** snmp_set2 ******************************************\n"); if (CHECK_END(response->variables->type)) { fprint_variable(stderr, response->variables->name, response->variables->name_length, response->variables); } else fprintf(stderr, "snmp_set2(): No idea.\n"); fprintf(stderr, "********************************************************\n"); #endif if (!(CHECK_END(response->variables->type)) ) { /* This is one of the exception condition */ rtncode = SA_ERR_HPI_NOT_PRESENT; CRIT("snmp exception %d \n",vars->type); } } else { CRIT("snmp_set2: Error in packet, Reason: %s", snmp_errstring(response->errstat)); rtncode = errstat2hpi(response->errstat); } } else { session = snmp_sess_session(sessp); snmp_sess_perror("snmpset", session); rtncode = snmpstat2hpi(status); } /* Clean up: free the response */ if (response) snmp_free_pdu(response); } return rtncode; } /** * snmp_getn_bulk: Builds and sends a SNMP_BET_BULK pdu using snmp * @sessp: snmp session * @bulk_objid: string containing the OID entry. * @bulk_objid_len: len of OID string * @bulk_pdu: pointer to the PDU to be created * @bulk_response: pointer to the response for this PDU request * @num_repetitions: max OIDs for this request. * Note: this is the max requested. Actual number returned can be less * than maximum. That depends on the target snmp agent. * * Return value: status from snmp_sess_synch_response(). See snmp_client.h of net-snmp library. * STAT_SUCCESS * STAT_ERROR * STAT_TIMEOUT * * Additionally, if status == STAT_SUCCESS, consumer of this routine needs to check for exception * conditions. * Possible exception conditions are SNMP_ENDOFMIBVIEW, SNMP_NOSUCHOBJECT, SNMP_NOSUCHINSTANCE **/ int snmp_getn_bulk( void *sessp, oid *bulk_objid, size_t bulk_objid_len, struct snmp_pdu *bulk_pdu, struct snmp_pdu **bulk_response, int num_repetitions ) { int status; bulk_pdu = snmp_pdu_create(SNMP_MSG_GETBULK); bulk_pdu->non_repeaters = 0; bulk_pdu->max_repetitions = num_repetitions; snmp_add_null_var(bulk_pdu, bulk_objid, bulk_objid_len); /* Send the Request out.*/ status = snmp_sess_synch_response(sessp, bulk_pdu, bulk_response); /* * Return the status. Consumer of this util has to process the response. */ return(status); } void sc_free_pdu(struct snmp_pdu **p) { if (*p) { snmp_free_pdu(*p); *p = NULL; } } SaErrorT errstat2hpi(long pdu_errstat) { SaErrorT hpicode = SA_OK; switch(pdu_errstat) { case SNMP_ERR_NOERROR: hpicode = SA_OK; break; case SNMP_ERR_TOOBIG: case SNMP_ERR_BADVALUE: case SNMP_ERR_WRONGTYPE: case SNMP_ERR_WRONGLENGTH: case SNMP_ERR_WRONGENCODING: case SNMP_ERR_WRONGVALUE: case SNMP_ERR_COMMITFAILED: case SNMP_ERR_UNDOFAILED: case SNMP_ERR_INCONSISTENTVALUE: hpicode = SA_ERR_HPI_INVALID_DATA; break; case SNMP_ERR_READONLY: case SNMP_ERR_NOTWRITABLE: hpicode = SA_ERR_HPI_READ_ONLY; break; case SNMP_ERR_NOSUCHNAME: hpicode = SA_ERR_HPI_NOT_PRESENT; break; case SNMP_ERR_NOACCESS: case SNMP_ERR_AUTHORIZATIONERROR: case SNMP_ERR_INCONSISTENTNAME: case SNMP_ERR_NOCREATION: hpicode = SA_ERR_HPI_INVALID_PARAMS; break; case SNMP_ERR_RESOURCEUNAVAILABLE: hpicode = SA_ERR_HPI_OUT_OF_SPACE; break; case SNMP_ERR_GENERR: default: hpicode = SA_ERR_HPI_UNKNOWN; break; } return(hpicode); } SaErrorT snmpstat2hpi(int snmpstat) { SaErrorT hpicode = SA_OK; switch(snmpstat) { case STAT_SUCCESS: hpicode = SA_OK; break; case STAT_TIMEOUT: hpicode = SA_ERR_HPI_TIMEOUT; break; case STAT_ERROR: default: hpicode = SA_ERR_HPI_ERROR; break; } return(hpicode); } openhpi-3.6.1/snmp/Makefile.am0000644000175100017510000000135212575647301015177 0ustar mohanmohan# (C) Copyright IBM Corp 2003, 2004 # All rights reserved. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. MAINTAINERCLEANFILES = Makefile.in AM_CPPFLAGS = -DG_LOG_DOMAIN=\"snmp\" AM_CPPFLAGS += @OPENHPI_INCLUDES@ AM_CFLAGS = @SNMPFLAGS@ lib_LTLIBRARIES = libopenhpi_snmp.la libopenhpi_snmp_la_SOURCES = snmp_utils.c snmp_utils.h libopenhpi_snmp_la_LDFLAGS = -version-info @HPI_LIB_VERSION@ libopenhpi_snmp_la_LIBADD = -luuid @SNMPLIBS@ openhpi-3.6.1/snmp/snmp_utils.h0000644000175100017510000000617312575647301015517 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003, 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #ifndef SNMP_BC_UTILS_H #define SNMP_BC_UTILS_H #include #include /****** net-snmp config template ******/ #include #include #include #ifdef HAVE_SYS_TIME_H #include #else #include #endif #ifdef WIN32 #include #endif /* * This was added to deal with net-snmp 5.1 originally, but * it appears to break SuSE, so trying another way. * * #define NETSNMP_IMPORT extern * #define NETSNMP_INLINE * #define RETSIGTYPE void * #define NET_SNMP_CONFIG_H * */ /* Added this to avoid redefinition conflict * in opteron based platforms between the linux headers * and the net-snmp headers. -- Renier 9/27/04 */ #ifdef __ssize_t_defined #define HAVE_SSIZE_T 1 #endif /**************************************/ #include #include #include #define MAX_ASN_STR_LEN 300 #define SNMP_BC_MM_BULK_MAX 45 #define SNMP_BC_BULK_DEFAULT 32 #define SNMP_BC_BULK_MIN 16 #define SA_ERR_SNMP_BASE - 10000 #define SA_ERR_SNMP_NOSUCHOBJECT (SaErrorT)(SA_ERR_SNMP_BASE - SNMP_NOSUCHOBJECT) #define SA_ERR_SNMP_NOSUCHINSTANCE (SaErrorT)(SA_ERR_SNMP_BASE - SNMP_NOSUCHINSTANCE) #define SA_ERR_SNMP_NOSUCHNAME (SaErrorT)(SA_ERR_SNMP_BASE - SNMP_ERR_NOSUCHNAME) #define SA_ERR_SNMP_ENDOFMIBVIEW (SaErrorT)(SA_ERR_SNMP_BASE - SNMP_ENDOFMIBVIEW) #define SA_ERR_SNMP_ERROR (SaErrorT)(SA_ERR_SNMP_BASE - STAT_ERROR) #define SA_ERR_SNMP_TIMEOUT (SaErrorT)(SA_ERR_SNMP_BASE - STAT_TIMEOUT) #define CHECK_END(a) ((a != SNMP_ENDOFMIBVIEW) && \ (a != SNMP_NOSUCHOBJECT) && \ (a != SNMP_NOSUCHINSTANCE))? 1:0 /* Place-holder for values set and returned by snmp */ struct snmp_value { u_char type; char string[MAX_ASN_STR_LEN]; size_t str_len; //unsigned int str_len; long integer; }; SaErrorT snmp_get( void *sessp, const char *objid, struct snmp_value *value); SaErrorT snmp_set( void *sessp, char *objid, struct snmp_value value); SaErrorT snmp_get2(void *sessp, oid *objid, size_t objid_len, struct snmp_value *value); SaErrorT snmp_set2(void *sessp, oid *objid, size_t objid_len, struct snmp_value *value); int snmp_getn_bulk( void *sessp, oid *bulk_objid, size_t bulk_objid_len, struct snmp_pdu *bulk_pdu, struct snmp_pdu **bulk_response, int num_repetitions ); void sc_free_pdu(struct snmp_pdu **p); SaErrorT snmpstat2hpi(int snmpstat); SaErrorT errstat2hpi(long pdu_errstat); #endif openhpi-3.6.1/clients/0000755000175100017510000000000012605014443013613 5ustar mohanmohanopenhpi-3.6.1/clients/ohparam.c0000644000175100017510000003067012575647264015437 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (C) Copyright Nokia Siemens Networks 2010 * (C) Copyright Ulrich Kleber 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Ulrich Kleber * * Log: * Start from hpidomain.c * This routine can display and manipulate parameters of the * openHPI daemon as specified in openhpi.conf file, using * the OpenHPI extensions as described in ohpi.c * * Changes: * 03/02/2011 ulikleber Refactoring to use glib for option parsing and * introduce common options for all clients * */ #include "oh_clients.h" #define OH_SVN_REV "$Revision: 7142 $" #define OHPARAM_HELP \ "Command get: display info about all global parameters \n" \ " no specific arguments \n" \ "Command set: \n" \ " one of the daemon's global parameters: \n" \ " (without the OPENHPI prefix) \n" \ " LOG_ON_SEV, EVT_QUEUE_LIMIT, \n" \ " DEL_SIZE_LIMIT, DEL_SAVE \n" \ " DAT_SIZE_LIMIT, DAT_USER_LIMIT, DAT_SAVE \n" \ " PATH, VARPATH, CONF \n" \ " and the desired new value. Example: \n" \ " ohparam set DEL_SIZE_LIMIT 20000 " /* * Function prototypes */ static SaErrorT execglobalparamget (void); static SaErrorT execglobalparamset (oHpiGlobalParamTypeT,char *); /* * Globals */ static oHpiCommonOptionsT copt; SaHpiSessionIdT sessionid; /* * Main */ int main(int argc, char **argv) { SaErrorT rv = SA_OK; oHpiGlobalParamTypeT paramtype = OHPI_CONF; char setparam[OH_PATH_PARAM_MAX_LENGTH]; SaHpiBoolT printusage = FALSE; int i=1; GOptionContext *context; enum cmdT {eUndefined, eGlobalParamGet, eGlobalParamSet} cmd=eUndefined; /* Print version strings */ oh_prog_version(argv[0]); /* Parsing options */ static char usetext[]="command [specific arguments] - " "Control openhpi configuration parameters.\n " OH_SVN_REV "\n\n" OHPARAM_HELP ; OHC_PREPARE_REVISION(usetext); context = g_option_context_new (usetext); if (!ohc_option_parse(&argc, argv, context, &copt, OHC_ALL_OPTIONS - OHC_ENTITY_PATH_OPTION // not applicable - OHC_VERBOSE_OPTION )) { // no verbose mode printusage = TRUE; } g_option_context_free (context); /* Parse ohparam specific commands */ while (i=argc) printusage = TRUE; } else printusage = TRUE; i++; } if (printusage == TRUE || cmd == eUndefined) { printf("\n"); printf("Usage: %s [Option...] command [specific arguments]\n\n", argv[0]); printf(OHPARAM_HELP"\n"); printf(" Options: \n"); printf(" -h, --help Show help options \n"); printf(" -D, --domain=nn Select domain id nn \n"); printf(" -X, --debug Display debug messages \n"); printf(" -N, --host=\"host<:port>\" Open session to the domain served by the daemon \n"); printf(" at the specified URL (host:port) \n"); printf(" This option overrides the OPENHPI_DAEMON_HOST and \n"); printf(" OPENHPI_DAEMON_PORT environment variables. \n"); printf(" -C, --cfgfile=\"file\" Use passed file as client configuration file \n"); printf(" This option overrides the OPENHPICLIENT_CONF \n"); printf(" environment variable. \n\n"); return 1; } rv = ohc_session_open_by_option ( &copt, &sessionid); if (rv != SA_OK) return -1; switch (cmd){ case eGlobalParamGet: rv = execglobalparamget ( ); break; case eGlobalParamSet: rv = execglobalparamset ( paramtype, setparam ); break; default: printf("\n\nSorry, this function is not implemented yet\n\n"); rv = SA_ERR_HPI_INVALID_PARAMS; } if (rv == SA_OK) { rv = saHpiSessionClose(sessionid); return 0; } printf("Param set failed with returncode %s\n", oh_lookup_error(rv)); return rv; } /* * */ static SaErrorT execglobalparamget () { SaErrorT rv = SA_OK; oHpiGlobalParamT param; if (copt.debug) DBG("Go and read global parameters in domain %u", copt.domainid); param.Type = OHPI_LOG_ON_SEV; rv = oHpiGlobalParamGet (sessionid, ¶m); if (rv!=SA_OK) { CRIT("oHpiGlobalParamGet(OHPI_LOG_ON_SEV) returned %s", oh_lookup_error(rv)); return rv; } printf("OPENHPI_LOG_ON_SEV = %s\n", oh_lookup_severity (param.u.LogOnSev)); param.Type =OHPI_EVT_QUEUE_LIMIT; rv = oHpiGlobalParamGet (sessionid, ¶m); if (rv!=SA_OK) { CRIT("oHpiGlobalParamGet(OHPI_EVT_QUEUE_LIMIT) returned %s", oh_lookup_error(rv)); return rv; } printf("OPENHPI_EVT_QUEUE_LIMIT = %u\n", param.u.EvtQueueLimit); param.Type =OHPI_DEL_SIZE_LIMIT; rv = oHpiGlobalParamGet (sessionid, ¶m); if (rv!=SA_OK) { CRIT("oHpiGlobalParamGet(OHPI_DEL_SIZE_LIMIT) returned %s", oh_lookup_error(rv)); return rv; } printf("OPENHPI_DEL_SIZE_LIMIT = %u\n", param.u.DelSizeLimit); param.Type =OHPI_DEL_SAVE; rv = oHpiGlobalParamGet (sessionid, ¶m); if (rv!=SA_OK) { CRIT("oHpiGlobalParamGet(OHPI_DEL_SAVE) returned %s", oh_lookup_error(rv)); return rv; } printf("OPENHPI_DEL_SAVE = "); if (param.u.DelSave) printf("TRUE\n"); else printf("FALSE\n"); param.Type =OHPI_DAT_SIZE_LIMIT; rv = oHpiGlobalParamGet (sessionid, ¶m); if (rv!=SA_OK) { CRIT("oHpiGlobalParamGet(OHPI_DAT_SIZE_LIMIT) returned %s", oh_lookup_error(rv)); return rv; } printf("OPENHPI_DAT_SIZE_LIMIT = %u\n", param.u.DatSizeLimit); param.Type =OHPI_DAT_USER_LIMIT; rv = oHpiGlobalParamGet (sessionid, ¶m); if (rv!=SA_OK) { CRIT("oHpiGlobalParamGet(OHPI_DAT_USER_LIMIT) returned %s", oh_lookup_error(rv)); return rv; } printf("OPENHPI_DAT_USER_LIMIT = %u\n", param.u.DatUserLimit); param.Type =OHPI_DAT_SAVE; rv = oHpiGlobalParamGet (sessionid, ¶m); if (rv!=SA_OK) { CRIT("oHpiGlobalParamGet(OHPI_DAT_SAVE) returned %s", oh_lookup_error(rv)); return rv; } printf("OPENHPI_DAT_SAVE = "); if (param.u.DatSave) printf("TRUE\n"); else printf("FALSE\n"); param.Type =OHPI_PATH; rv = oHpiGlobalParamGet (sessionid, ¶m); if (rv!=SA_OK) { CRIT("oHpiGlobalParamGet(OHPI_PATH) returned %s", oh_lookup_error(rv)); return rv; } printf("OPENHPI_PATH = %s\n",(const char*)param.u.Path); param.Type =OHPI_VARPATH; rv = oHpiGlobalParamGet (sessionid, ¶m); if (rv!=SA_OK) { CRIT("oHpiGlobalParamGet(OHPI_VARPATH) returned %s", oh_lookup_error(rv)); return rv; } printf("OPENHPI_VARPATH = %s\n",(const char*)param.u.VarPath); param.Type =OHPI_CONF; rv = oHpiGlobalParamGet (sessionid, ¶m); if (rv!=SA_OK) { CRIT("oHpiGlobalParamGet(OHPI_CONF) returned %s", oh_lookup_error(rv)); return rv; } printf("OPENHPI_CONF = %s\n",(const char*)param.u.Conf); return SA_OK; } /* * */ static SaErrorT execglobalparamset (oHpiGlobalParamTypeT ptype, char *setparam) { SaErrorT rv = SA_OK; oHpiGlobalParamT param; SaHpiTextBufferT buffer; if (copt.debug) DBG("Go and set global parameter %u in domain %u to %s", ptype, copt.domainid, setparam); param.Type = ptype; switch (ptype){ //strings case OHPI_PATH: strcpy((char*)param.u.Path, setparam);break; case OHPI_VARPATH: strcpy((char*)param.u.VarPath, setparam);break; case OHPI_CONF: strcpy((char*)param.u.Conf, setparam);break; //severity case OHPI_LOG_ON_SEV: strncpy((char *)buffer.Data, setparam, SAHPI_MAX_TEXT_BUFFER_LENGTH); if (oh_encode_severity(&buffer, ¶m.u.LogOnSev)!=SA_OK) return SA_ERR_HPI_INVALID_PARAMS; break; //integers case OHPI_EVT_QUEUE_LIMIT: param.u.EvtQueueLimit = atoi(setparam);break; case OHPI_DEL_SIZE_LIMIT: param.u.DelSizeLimit = atoi(setparam);break; case OHPI_DAT_SIZE_LIMIT: param.u.DatSizeLimit = atoi(setparam);break; case OHPI_DAT_USER_LIMIT: param.u.DatUserLimit = atoi(setparam);break; //bools case OHPI_DEL_SAVE: if (strcmp(setparam,"TRUE")==0) param.u.DelSave = SAHPI_TRUE; else if (strcmp(setparam,"FALSE")==0) param.u.DelSave = SAHPI_FALSE; else return SA_ERR_HPI_INVALID_PARAMS; break; case OHPI_DAT_SAVE: if (strcmp(setparam,"TRUE")==0) param.u.DatSave = SAHPI_TRUE; else if (strcmp(setparam,"FALSE")==0) param.u.DatSave = SAHPI_FALSE; else return SA_ERR_HPI_INVALID_PARAMS; break; default: return SA_ERR_HPI_UNSUPPORTED_PARAMS; } rv = oHpiGlobalParamSet (sessionid, ¶m); if (rv!=SA_OK) { CRIT("oHpiGlobalParamSet returned %s", oh_lookup_error(rv)); return rv; } switch (param.Type){ case OHPI_LOG_ON_SEV: printf("OPENHPI_LOG_ON_SEV = %s\n", oh_lookup_severity (param.u.LogOnSev)); break; case OHPI_EVT_QUEUE_LIMIT: printf("OPENHPI_EVT_QUEUE_LIMIT = %u\n", param.u.EvtQueueLimit); break; case OHPI_DEL_SIZE_LIMIT: printf("OPENHPI_DEL_SIZE_LIMIT = %u\n", param.u.DelSizeLimit); break; case OHPI_DEL_SAVE: printf("OPENHPI_DEL_SAVE = "); if (param.u.DelSave) printf("TRUE\n"); else printf("FALSE\n"); break; case OHPI_DAT_SIZE_LIMIT: printf("OPENHPI_DAT_SIZE_LIMIT = %u\n", param.u.DatSizeLimit); break; case OHPI_DAT_USER_LIMIT: printf("OPENHPI_DAT_USER_LIMIT = %u\n", param.u.DatUserLimit); break; case OHPI_DAT_SAVE: printf("OPENHPI_DAT_SAVE = "); if (param.u.DatSave) printf("TRUE\n"); else printf("FALSE\n"); break; case OHPI_PATH: printf("OHPENPI_PATH = %s\n",(const char*)param.u.Path);break; case OHPI_VARPATH: printf("OPENHPI_VARPATH = %s\n",(const char*)param.u.VarPath);break; case OHPI_CONF: printf("OPENHPI_CONF = %s\n",(const char*)param.u.Conf);break; default: return SA_ERR_HPI_UNSUPPORTED_PARAMS; } return SA_OK; } /* end ohparam.c */ openhpi-3.6.1/clients/hpievents.c0000644000175100017510000001652512575647264016020 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003, 2004, 2007 * (C) Copyright Nokia Siemens Networks 2010 * (C) Copyright Ulrich Kleber 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan * Steve Sherman * Renier Morales * Ulrich Kleber * * 10/13/2004 kouzmich changed -t option for infinite wait * added -d option for call saHpiDiscover after saHpiSubscribe * 11/17/2004 kouzmich linux style and checking timeout error * 09/06/2010 ulikleber New option -D to select domain * 01/02/2011 ulikleber Refactoring to use glib for option parsing and * introduce common options for all clients */ #include "oh_clients.h" #define OH_SVN_REV "$Revision: 7291 $" #define HPI_NSEC_PER_SEC 1000000000LL static gchar *timeout_str = NULL; static gboolean do_discover_after_subscribe = FALSE; static oHpiCommonOptionsT copt; static GOptionEntry my_options[] = { { "timeout", 't', 0, G_OPTION_ARG_STRING, &timeout_str, "Wait n seconds for event or infinite wait\n" " (BLOCK or SAHPI_TIMEOUT_BLOCK)", "n|BLOCK" }, { "discover", 'd', 0, G_OPTION_ARG_NONE, &do_discover_after_subscribe, "Call saHpiDiscover() after saHpiSubscribe()", NULL }, { NULL } }; int main(int argc, char **argv) { int test_fail = 0, wait = 0; SaErrorT rv; SaHpiSessionIdT sessionid; SaHpiDomainInfoT domainInfo; SaHpiRptEntryT rptentry; SaHpiEntryIdT rptentryid; SaHpiEntryIdT nextrptentryid; SaHpiResourceIdT resourceid; SaHpiEventLogInfoT info; SaHpiRdrT rdr; SaHpiTimeoutT timeout; SaHpiEventT event; GOptionContext *context; memset(&rptentry, 0, sizeof(rptentry)); /* Print version strings */ oh_prog_version(argv[0]); /* Parsing options */ static char usetext[]="- Poll for HPI events\n " OH_SVN_REV; OHC_PREPARE_REVISION(usetext); context = g_option_context_new (usetext); g_option_context_add_main_entries (context, my_options, NULL); if (!ohc_option_parse(&argc, argv, context, &copt, OHC_ALL_OPTIONS - OHC_ENTITY_PATH_OPTION //TODO: Feature 880127 - OHC_VERBOSE_OPTION )) { // no verbose mode implemented g_option_context_free (context); return 1; } g_option_context_free (context); if (timeout_str) { int i = 0; while (i < 20 && timeout_str[i] != '\0') { timeout_str[i] = toupper((char) timeout_str[i]); i++; } if ((strcmp(timeout_str, "SAHPI_TIMEOUT_BLOCK") == 0) || (strcmp(timeout_str, "BLOCK") == 0)) { timeout = SAHPI_TIMEOUT_BLOCK; } else { wait = atoi(timeout_str); timeout = (SaHpiTimeoutT)(wait * HPI_NSEC_PER_SEC); } g_free (timeout_str); } else timeout = (SaHpiTimeoutT) SAHPI_TIMEOUT_IMMEDIATE; printf("************** timeout:[%" PRId64 "] ****************\n", (uint64_t) timeout); rv = ohc_session_open_by_option ( &copt, &sessionid); if (rv != SA_OK) return -1; if (!do_discover_after_subscribe) { if (copt.debug) DBG("saHpiDiscover"); rv = saHpiDiscover(sessionid); if (rv != SA_OK) { CRIT("saHpiDiscover: %s", oh_lookup_error(rv)); return rv; } } if (copt.debug) DBG( "Subscribe to events\n"); rv = saHpiSubscribe( sessionid ); if (rv != SA_OK) { CRIT("saHpiSubscribe: %s", oh_lookup_error(rv)); return rv; } if (do_discover_after_subscribe) { if (copt.debug) DBG("saHpiDiscover after saHpiSubscribe"); rv = saHpiDiscover(sessionid); if (rv != SA_OK) { CRIT("saHpiDiscover after saHpiSubscribe: %s", oh_lookup_error(rv)); return rv; } } rv = saHpiDomainInfoGet(sessionid, &domainInfo); if (copt.debug) DBG("saHpiDomainInfoGet %s", oh_lookup_error(rv)); printf("DomainInfo: UpdateCount = %u, UpdateTime = %lx\n", domainInfo.RptUpdateCount, (unsigned long)domainInfo.RptUpdateTimestamp); /* walk the RPT list */ rptentryid = SAHPI_FIRST_ENTRY; while ((rv == SA_OK) && (rptentryid != SAHPI_LAST_ENTRY)) { printf("**********************************************\n"); rv = saHpiRptEntryGet(sessionid, rptentryid, &nextrptentryid, &rptentry); if (copt.debug) DBG("saHpiRptEntryGet %s", oh_lookup_error(rv)); if (rv == SA_OK) { resourceid = rptentry.ResourceId; if (copt.debug) DBG("RPT %x capabilities = %x", resourceid, rptentry.ResourceCapabilities); if ( (rptentry.ResourceCapabilities & SAHPI_CAPABILITY_EVENT_LOG)) { /* Using EventLogInfo to build up event queue - for now */ rv = saHpiEventLogInfoGet(sessionid, resourceid, &info); if (copt.debug) DBG("saHpiEventLogInfoGet %s", oh_lookup_error(rv)); if (rv == SA_OK) oh_print_eventloginfo(&info, 4); } else { if (copt.debug) DBG("RPT doesn't have SEL"); } rptentry.ResourceTag.Data[rptentry.ResourceTag.DataLength] = 0; printf("rptentry[%u] tag: %s\n", resourceid, rptentry.ResourceTag.Data); rptentryid = nextrptentryid; } printf("**********************************************\n"); } printf( "Go and get the event\n"); while (1) { rdr.RdrType = SAHPI_NO_RECORD; rptentry.ResourceId = 0; rv = saHpiEventGet( sessionid, timeout, &event, &rdr, &rptentry, NULL); if (rv != SA_OK) { if (rv != SA_ERR_HPI_TIMEOUT) { printf("ERROR during EventGet : %s\n", oh_lookup_error(rv)); test_fail = 1; } else { if (timeout == SAHPI_TIMEOUT_BLOCK) { printf("ERROR: Timeout while infinite wait\n"); test_fail = 1; } else if (timeout != SAHPI_TIMEOUT_IMMEDIATE) { printf("ERROR: Time, %u seconds, expired waiting" " for event\n", wait); test_fail = 1; } } break; } else { if (rdr.RdrType != SAHPI_NO_RECORD) oh_print_event(&event, &rdr.Entity, 4); else if (rptentry.ResourceId != 0) oh_print_event(&event, &rptentry.ResourceEntity, 4); else { rptentryid = event.Source; rv = saHpiRptEntryGet(sessionid, rptentryid, &nextrptentryid, &rptentry); if(rv == SA_OK) oh_print_event(&event, &rptentry.ResourceEntity, 4); else { printf("Wrong resource Id <%u> detected", event.Source); oh_print_event(&event, NULL, 4); } } } } if (test_fail == 0) printf(" Test PASS.\n"); else printf(" Test FAILED.\n"); /* Unsubscribe to future events */ if (copt.debug) DBG( "Unsubscribe"); rv = saHpiUnsubscribe( sessionid ); rv = saHpiSessionClose(sessionid); return(0); } /* end hpigetevents.c */ openhpi-3.6.1/clients/hpiinv.c0000644000175100017510000005167412575647264015314 0ustar mohanmohan/* -*- linux-c -*- * * hpiinv.c * * Copyright (c) 2003-2005 by Intel Corp. * (C) Copyright IBM Corp. 2004 * (C) Copyright Nokia Siemens Networks 2010 * (C) Copyright Ulrich Kleber 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Andy Cress * Peter D. Phan * Renier Morales * Tariq Shureih * Racing Guo * Ulrich Kleber * * Log: * 6/29/04 Copied from hpifru.c and modified for general use * 11/30/04 ver 0.2 for openhpi-2.0.0 * 2/09/05 ARCress re-merged with hpifru.c, adding IdrFieldSet, * generalized for other HPI libraris also. * 09/06/10 ulikleber New option -D to select domain * 20/01/11 ulikleber Refactoring to use glib for option parsing and * introduce common options for all clients */ #define OPENHPI_USED 1 #include "oh_clients.h" #define OH_SVN_REV "$Revision: 7291 $" #define NCT 25 #define MAX_STRSIZE 64 char *chasstypes[NCT] = { "Not Defined", "Other", "Unknown", "Desktop", "Low Profile Desktop", "Pizza Box", "Mini Tower", "Tower", "Portable", "Laptop", "Notebook", "Handheld", "Docking Station", "All in One", "Subnotebook", "Space Saving", "Lunch Box", "Main Server", "Expansion", "SubChassis", "Buss Expansion Chassis", "Peripheral Chassis", "RAID Chassis", "Rack-Mount Chassis", "New" }; static gchar *fatag = NULL; static oHpiCommonOptionsT copt; static GOptionEntry my_options[] = { { "asset-tag", 'a', 0, G_OPTION_ARG_STRING, &fatag, "Set the asset tag to the specified string", "tag" }, { NULL } }; int i,j,k = 0; SaHpiUint32T buffersize; SaHpiUint32T actualsize; char inbuff[2048]; char outbuff[1024]; int foundasset = 0; SaHpiIdrAreaHeaderT *inv; SaHpiIdrFieldTypeT chasstype; SaHpiTextBufferT *strptr; struct { SaHpiResourceIdT rid; SaHpiEntryIdT idrid; SaHpiEntryIdT areaid; SaHpiEntryIdT fieldid; char *tag; int tlen; } atag; #define NRW_ENTS 12 SaHpiEntityTypeT rw_entities[NRW_ENTS] = { /*read-writable entities*/ SAHPI_ENT_SYS_MGMNT_MODULE, SAHPI_ENT_SYSTEM_BOARD, SAHPI_ENT_FRONT_PANEL_BOARD, SAHPI_ENT_SYSTEM_CHASSIS, SAHPI_ENT_SYS_MGMNT_SOFTWARE, SAHPI_ENT_COMPACTPCI_CHASSIS, SAHPI_ENT_ADVANCEDTCA_CHASSIS, SAHPI_ENT_RACK_MOUNTED_SERVER, SAHPI_ENT_SYSTEM_BLADE, SAHPI_ENT_SWITCH_BLADE, SAHPI_ENT_SPEC_PROC_BLADE, SAHPI_ENT_ALARM_MANAGER }; #ifdef BMCONLY char bmctag[] = "Basbrd Mgmt Ctlr"; /* see IsTagBmc() */ char bmctag2[] = "Management Controller"; /* see IsTagBmc() */ /* * findmatch * returns offset of the match if found, or -1 if not found. */ static int findmatch(char *buffer, int sbuf, char *pattern, int spattern, char figncase) { int c, j, imatch; j = 0; imatch = 0; for (j = 0; j < sbuf; j++) { if (sbuf - j < spattern && imatch == 0) return (-1); c = buffer[j]; if (c == pattern[imatch]) { imatch++; if (imatch == spattern) return (++j - imatch); } else if (pattern[imatch] == '?') { /*wildcard char*/ imatch++; if (imatch == spattern) return (++j - imatch); } else if (figncase == 1) { if ((c & 0x5f) == (pattern[imatch] & 0x5f)) { imatch++; if (imatch == spattern) return (++j - imatch); } else imatch = 0; } else imatch = 0; } return (-1); } /*end findmatch */ static int IsTagBmc(char *dstr, int dlen) { int ret = 0; if (strncmp(dstr, bmctag, sizeof(bmctag)) == 0) /* Sahalee */ ret = 1; else if (findmatch(dstr,dlen,"BMC",3,1) >= 0) /* mBMC or other */ ret = 1; else if (findmatch(dstr,dlen,bmctag2,sizeof(bmctag2),1) >= 0) ret = 1; /* BMC tag for OpenHPI with ipmi plugin */ return(ret); } #else static int IsTagBmc(char *dstr, int dlen) { /* if OpenHPI, always return TRUE for any Inventory RDR */ return(1); } #endif static int ent_writable(SaHpiEntityPathT *ep, SaHpiIdrInfoT *idrinfo) { int i, rv; /* The IdrInfo ReadOnly field might be ok, but we don't even want to attempt to write to DIMMs or Power Supplies, even if the plugin reports it otherwise, so only check for known writable entity types. */ for (i = 0; i < NRW_ENTS; i++) if (rw_entities[i] == ep->Entry[0].EntityType) break; if (i >= NRW_ENTS) rv = 0; else rv = 1; return(rv); } static void fixstr(SaHpiTextBufferT *strptr, char *outstr) { size_t datalen; if (outstr == NULL) return; outstr[0] = 0; if (strptr == NULL) return; datalen = strptr->DataLength; if (datalen > MAX_STRSIZE) datalen = MAX_STRSIZE-1; if (datalen != 0) { strncpy ((char *)outstr, (char *)strptr->Data, datalen); outstr[datalen] = 0; if (copt.debug) { DBG("TextBuffer len=%u, dtype=%x lang=%u: %s", strptr->DataLength,strptr->DataType,strptr->Language, strptr->Data ); } } #ifdef LENGTH_BAD else /* may be bogus length, try anyway */ strcpy ((char *)outstr, (char *)strptr->Data); #endif } #define NAREATYP 6 static struct { SaHpiUint8T type; char *str; } map_areatype[NAREATYP] = { { SAHPI_IDR_AREATYPE_INTERNAL_USE, "Internal Area" }, { SAHPI_IDR_AREATYPE_CHASSIS_INFO, "Chassis Area" }, { SAHPI_IDR_AREATYPE_BOARD_INFO, "Board Area" }, { SAHPI_IDR_AREATYPE_PRODUCT_INFO, "Product Area" }, { SAHPI_IDR_AREATYPE_OEM, "OEM Area" }, { SAHPI_IDR_AREATYPE_UNSPECIFIED, "Unspecified Area" } }; #define NFIELDTYP 11 static struct { SaHpiUint8T type; char *str; } map_fieldtype[NFIELDTYP] = { { SAHPI_IDR_FIELDTYPE_CHASSIS_TYPE, "Chassis Type "}, { SAHPI_IDR_FIELDTYPE_MFG_DATETIME, "Mfg DateTime "}, { SAHPI_IDR_FIELDTYPE_MANUFACTURER, "Manufacturer "}, { SAHPI_IDR_FIELDTYPE_PRODUCT_NAME, "Product Name "}, { SAHPI_IDR_FIELDTYPE_PRODUCT_VERSION, "Product Versn"}, { SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER, "Serial Number"}, { SAHPI_IDR_FIELDTYPE_PART_NUMBER, "Part Number "}, { SAHPI_IDR_FIELDTYPE_FILE_ID, "File ID "}, { SAHPI_IDR_FIELDTYPE_ASSET_TAG, "Asset Tag "}, { SAHPI_IDR_FIELDTYPE_CUSTOM, "Custom Field "}, { SAHPI_IDR_FIELDTYPE_UNSPECIFIED, "Unspecified "} }; #define NEPTYPES 67 struct { SaHpiEntityTypeT type; char *str; } map_epstr[NEPTYPES] = { { SAHPI_ENT_ADD_IN_CARD, "ADD_IN_CARD" }, { SAHPI_ENT_ADVANCEDTCA_CHASSIS, "ADVANCEDTCA_CHASSIS" }, { SAHPI_ENT_ALARM_MANAGER, "ALARM_MANAGER" }, { SAHPI_ENT_BACK_PANEL_BOARD, "BACK_PANEL_BOARD" }, { SAHPI_ENT_BATTERY, "BATTERY" }, { SAHPI_ENT_BIOS, "BIOS" }, { SAHPI_ENT_BOARD_SET_SPECIFIC, "BOARD_SET_SPECIFIC" }, { SAHPI_ENT_CHASSIS_BACK_PANEL_BOARD, "CHASSIS_BACK_PANEL_BOARD" }, { SAHPI_ENT_CHASSIS_SPECIFIC, "CHASSIS_SPECIFIC" }, { SAHPI_ENT_COMPACTPCI_CHASSIS, "COMPACTPCI_CHASSIS" }, { SAHPI_ENT_COOLING_DEVICE, "COOLING_DEVICE" }, { SAHPI_ENT_COOLING_UNIT, "COOLING_UNIT" }, { SAHPI_ENT_DEVICE_BAY, "DEVICE_BAY" }, { SAHPI_ENT_DISK_BAY, "DISK_BAY" }, { SAHPI_ENT_DISK_BLADE, "DISK_BLADE" }, { SAHPI_ENT_DISK_DRIVE, "DISK_DRIVE" }, { SAHPI_ENT_DISK_DRIVE_BAY, "DISK_DRIVE_BAY" }, { SAHPI_ENT_DISPLAY_PANEL, "DISPLAY_PANEL" }, { SAHPI_ENT_DRIVE_BACKPLANE, "DRIVE_BACKPLANE" }, { SAHPI_ENT_EXTERNAL_ENVIRONMENT, "EXTERNAL_ENVIRONMENT" }, { SAHPI_ENT_FAN, "FAN" }, { SAHPI_ENT_FRONT_PANEL_BOARD, "FRONT_PANEL_BOARD" }, { SAHPI_ENT_GROUP, "GROUP" }, { SAHPI_ENT_INTERCONNECT, "INTERCONNECT" }, { SAHPI_ENT_IO_BLADE, "IO_BLADE" }, { SAHPI_ENT_IO_SUBBOARD, "IO_SUBBOARD" }, { SAHPI_ENT_MEMORY_DEVICE, "MEMORY_DEVICE" }, { SAHPI_ENT_MEMORY_MODULE, "MEMORY_MODULE" }, { SAHPI_ENT_OEM_SYSINT_SPECIFIC, "OEM_SYSINT_SPECIFIC" }, { SAHPI_ENT_OPERATING_SYSTEM, "OPERATING_SYSTEM" }, { SAHPI_ENT_OTHER, "OTHER" }, { SAHPI_ENT_OTHER_CHASSIS_BOARD, "OTHER_CHASSIS_BOARD" }, { SAHPI_ENT_OTHER_SYSTEM_BOARD, "OTHER_SYSTEM_BOARD" }, { SAHPI_ENT_PERIPHERAL_BAY, "PERIPHERAL_BAY" }, { SAHPI_ENT_PERIPHERAL_BAY_2, "PERIPHERAL_BAY_2" }, { SAHPI_ENT_PHYSICAL_SLOT, "PHYSICAL_SLOT" }, { SAHPI_ENT_POWER_DISTRIBUTION_UNIT, "POWER_DISTRIBUTION_UNIT" }, { SAHPI_ENT_POWER_MGMNT, "POWER_MGMNT" }, { SAHPI_ENT_POWER_MODULE, "POWER_MODULE" }, { SAHPI_ENT_POWER_SUPPLY, "POWER_SUPPLY" }, { SAHPI_ENT_POWER_SYSTEM_BOARD, "POWER_SYSTEM_BOARD" }, { SAHPI_ENT_POWER_UNIT, "POWER_UNIT" }, { SAHPI_ENT_PROCESSOR, "PROCESSOR" }, { SAHPI_ENT_PROCESSOR_BOARD, "PROCESSOR_BOARD" }, { SAHPI_ENT_PROCESSOR_MODULE, "PROCESSOR_MODULE" }, { SAHPI_ENT_RACK, "RACK" }, { SAHPI_ENT_RACK_MOUNTED_SERVER, "RACK_MOUNTED_SERVER" }, { SAHPI_ENT_REMOTE, "REMOTE" }, { SAHPI_ENT_ROOT, "ROOT" }, { SAHPI_ENT_SBC_BLADE, "SBC_BLADE" }, { SAHPI_ENT_SBC_SUBBOARD, "SBC_SUBBOARD" }, { SAHPI_ENT_SHELF_MANAGER, "SHELF_MANAGER" }, { SAHPI_ENT_SPEC_PROC_BLADE, "SPEC_PROC_BLADE" }, { SAHPI_ENT_SUBBOARD_CARRIER_BLADE, "SUBBOARD_CARRIER_BLADE" }, { SAHPI_ENT_SUB_CHASSIS, "SUB_CHASSIS" }, { SAHPI_ENT_SUBRACK, "SUBRACK" }, { SAHPI_ENT_SWITCH, "SWITCH" }, { SAHPI_ENT_SWITCH_BLADE, "SWITCH_BLADE" }, { SAHPI_ENT_SYS_EXPANSION_BOARD, "SYS_EXPANSION_BOARD" }, { SAHPI_ENT_SYS_MGMNT_MODULE, "SYS_MGMNT_MODULE" }, { SAHPI_ENT_SYS_MGMNT_SOFTWARE, "SYS_MGMNT_SOFTWARE" }, { SAHPI_ENT_SYSTEM_BLADE, "SYSTEM_BLADE" }, { SAHPI_ENT_SYSTEM_BOARD, "SYSTEM_BOARD" }, { SAHPI_ENT_SYSTEM_BUS, "SYSTEM_BUS" }, { SAHPI_ENT_SYSTEM_CHASSIS, "SYSTEM_CHASSIS" }, { SAHPI_ENT_UNKNOWN, "UNKNOWN" }, { SAHPI_ENT_UNSPECIFIED, "UNSPECIFIED" }, }; static void print_epath(SaHpiEntityPathT *epath, int len); static void print_epath(SaHpiEntityPathT *epath, int len) { int i,j; SaHpiEntityTypeT t; char *pstr; #ifdef OPENHPI_USED if (copt.verbose) { oh_print_ep(epath, len); } else #endif { for (i = 0; i < SAHPI_MAX_ENTITY_PATH; i++) { t = epath->Entry[i].EntityType; pstr = ""; for (j = 0; j < NEPTYPES; j++) { if (t == map_epstr[j].type) { pstr = map_epstr[j].str; break; } } if (j == NEPTYPES) j--; printf("{%s:%u} ",pstr, epath->Entry[i].EntityLocation); if (t == SAHPI_ENT_ROOT) break; } printf("\n"); } return; } static void print_idrinfo(SaHpiIdrInfoT *idrInfo,int len); static void print_idrinfo(SaHpiIdrInfoT *idrInfo,int len) { #ifdef OPENHPI_USED if (copt.verbose) { oh_print_idrinfo(idrInfo, len); } else #endif { /* don't need to show this if not verbose */ } } static void print_idrareaheader(SaHpiIdrAreaHeaderT *areaHeader, int len); static void print_idrareaheader(SaHpiIdrAreaHeaderT *areaHeader, int len) { int i; #ifdef OPENHPI_USED if (copt.verbose) { oh_print_idrareaheader(areaHeader, len); } else #endif { for (i = 0; i < NAREATYP; i++) { if (map_areatype[i].type == areaHeader->Type) break; } if (i == NAREATYP) i--; printf("AreaId[%u] %s\n",areaHeader->AreaId,map_areatype[i].str); } } static void print_tb(const SaHpiTextBufferT * tb) { size_t i; switch (tb->DataType) { case SAHPI_TL_TYPE_UNICODE: printf("UNICODE: Unsupported output"); return; case SAHPI_TL_TYPE_BCDPLUS: printf("BCD+ : "); fwrite(&tb->Data[0], tb->DataLength, 1, stdout); return; case SAHPI_TL_TYPE_ASCII6: printf("ASCII6 : "); fwrite(&tb->Data[0], tb->DataLength, 1, stdout); return; case SAHPI_TL_TYPE_TEXT: printf("TEXT : "); fwrite(&tb->Data[0], tb->DataLength, 1, stdout); return; case SAHPI_TL_TYPE_BINARY: printf("BIN :"); for (i = 0; i < tb->DataLength; ++i) { printf(" %02X", tb->Data[i]); } return; default: printf("??? : "); return; } } static void print_idrfield(SaHpiIdrFieldT *field, int len); static void print_idrfield(SaHpiIdrFieldT *field, int len) { int i; #ifdef OPENHPI_USED if (copt.verbose) { oh_print_idrfield(field, len); } else #endif { for (i = 0; i < NFIELDTYP; i++) { if (map_fieldtype[i].type == field->Type) break; } if (i == NFIELDTYP) i--; printf(" FieldId[%d] %s : ", field->FieldId,map_fieldtype[i].str); print_tb(&field->Field); printf("\n"); } } int walkInventory(SaHpiSessionIdT sessionid, SaHpiResourceIdT resourceid, SaHpiIdrInfoT *idrInfo); int walkInventory(SaHpiSessionIdT sessionid, SaHpiResourceIdT resourceid, SaHpiIdrInfoT *idrInfo) { SaErrorT rv = SA_OK, rvField = SA_OK; SaHpiUint32T numAreas; SaHpiUint32T countAreas = 0; SaHpiUint32T countFields = 0; SaHpiEntryIdT areaId; SaHpiEntryIdT nextareaId; SaHpiIdrAreaTypeT areaType; SaHpiIdrAreaHeaderT areaHeader; SaHpiEntryIdT fieldId; SaHpiEntryIdT nextFieldId; SaHpiIdrFieldTypeT fieldType; SaHpiIdrFieldT thisField; numAreas = idrInfo->NumAreas; areaType = SAHPI_IDR_AREATYPE_UNSPECIFIED; areaId = SAHPI_FIRST_ENTRY; foundasset = 0; while ((rv == SA_OK) && (areaId != SAHPI_LAST_ENTRY)) { rv = saHpiIdrAreaHeaderGet(sessionid, resourceid, idrInfo->IdrId, areaType, areaId, &nextareaId, &areaHeader); if (rv == SA_OK) { countAreas++; print_idrareaheader(&areaHeader, 8); fieldType = SAHPI_IDR_FIELDTYPE_UNSPECIFIED; fieldId = SAHPI_FIRST_ENTRY; countFields = 0; while ((rvField == SA_OK) && (fieldId != SAHPI_LAST_ENTRY)) { rvField = saHpiIdrFieldGet( sessionid, resourceid, idrInfo->IdrId, areaHeader.AreaId, fieldType, fieldId, &nextFieldId, &thisField); if (copt.debug) DBG("saHpiIdrFieldGet[%x] rv = %d type=%u", idrInfo->IdrId,rvField, thisField.Type); if (rvField == SA_OK) { countFields++; print_idrfield(&thisField, 12); if (thisField.Type == SAHPI_IDR_FIELDTYPE_ASSET_TAG) { atag.rid = resourceid; atag.idrid = idrInfo->IdrId; atag.areaid = areaHeader.AreaId; atag.fieldid = fieldId; foundasset = 1; } } fieldId = nextFieldId; } /*while fields*/ if ( countFields != areaHeader.NumFields) printf("Area Header error: areaHeader.NumFields %u, countFields %u\n", areaHeader.NumFields, countFields); } else { printf("saHpiIdrAreaHeaderGet error %d\n",rv); } areaId = nextareaId; } /*while areas*/ if ((rv == SA_OK) && (countAreas != numAreas)) printf("idrInfo error! idrInfo.NumAreas = %u; countAreas = %u\n", numAreas, countAreas); if (countFields > 0) rv = 0; return(rv); } /*end walkInventory*/ int main(int argc, char **argv) { SaErrorT rv,rv_rdr; SaHpiSessionIdT sessionid; SaHpiDomainInfoT rptinfo; SaHpiRptEntryT rptentry; SaHpiEntryIdT rptentryid; SaHpiEntryIdT nextrptentryid; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiResourceIdT resourceid; SaHpiRdrT rdr; SaHpiIdrInfoT idrInfo; SaHpiIdrIdT idrid; int invfound = 0; int nloops = 0; GOptionContext *context; atag.tlen = 0; /* Print version strings */ oh_prog_version(argv[0]); /* Parsing options */ static char usetext[]="- Shows resources' inventory records\n " OH_SVN_REV; OHC_PREPARE_REVISION(usetext); context = g_option_context_new (usetext); g_option_context_add_main_entries (context, my_options, NULL); if (!ohc_option_parse(&argc, argv, context, &copt, OHC_ALL_OPTIONS - OHC_ENTITY_PATH_OPTION )) { //TODO: Feature 880127? g_option_context_free (context); return 1; } g_option_context_free (context); if (fatag) { atag.tag = (char *)strdup(fatag); atag.tlen = strlen(fatag); g_free(fatag); } /* compile error */ // inv = (SaHpiIdrAreaHeaderT *)&inbuff[0]; inv = (SaHpiIdrAreaHeaderT *)(void *)&inbuff[0]; rv = ohc_session_open_by_option ( &copt, &sessionid); if (rv != SA_OK) return rv; rv = saHpiDomainInfoGet(sessionid,&rptinfo); if (copt.debug) DBG("saHpiDomainInfoGet rv = %d",rv); // if (copt.debug) DBG("RptInfo: UpdateCount = %x, UpdateTime = %lx", // rptinfo.UpdateCount, (unsigned long)rptinfo.UpdateTimestamp); while (!invfound && (nloops < 7)) { /* * The OpenHPI ipmi plugin has a bug whereby the FRU RDR is added * much later, and always requires a rediscovery. (bug #1095256) * This should not apply to other well-behaved plugins. */ nloops++; if (copt.debug) DBG("Starting Discovery, pass %u ...",nloops); rv = saHpiDiscover(sessionid); if (copt.debug) DBG("saHpiDiscover rv = %d",rv); if (rv != SA_OK) { CRIT("saHpiDiscover error %d",rv); break; } /* walk the RPT list */ rptentryid = SAHPI_FIRST_ENTRY; while ((rv == SA_OK) && (rptentryid != SAHPI_LAST_ENTRY)) { rv = saHpiRptEntryGet(sessionid,rptentryid,&nextrptentryid,&rptentry); if (rv != SA_OK) printf("RptEntryGet: rid=%u rv = %d\n",rptentryid,rv); if (rv == SA_OK) { /* obtain resource tag */ char tagstr[MAX_STRSIZE]; fixstr(&rptentry.ResourceTag,tagstr); /* walk the RDR list for this RPT entry */ entryid = SAHPI_FIRST_ENTRY; resourceid = rptentry.ResourceId; if (copt.debug) DBG("rptentry[%u] resourceid=%d", rptentryid,resourceid); if (rptentry.ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA) { printf("Resource[%u] Tag: %s \thas inventory capability\n", rptentryid,tagstr); rv_rdr = SA_OK; while ((rv_rdr == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) { rv_rdr = saHpiRdrGet(sessionid,resourceid, entryid,&nextentryid, &rdr); if (copt.debug) DBG("saHpiRdrGet[%u] rv = %d",entryid,rv_rdr); if (rv_rdr == SA_OK) { if (copt.debug) DBG("Rdr[%u] type = %u tag = %s",entryid, rdr.RdrType,rdr.IdString.Data); if (rdr.RdrType == SAHPI_INVENTORY_RDR) { invfound = 1; /*type 3 includes inventory records*/ rdr.IdString.Data[rdr.IdString.DataLength] = 0; idrid = rdr.RdrTypeUnion.InventoryRec.IdrId; buffersize = sizeof(inbuff); if (copt.debug) { DBG("Rdr[%x] is inventory, IdrId=%x",rdr.RecordId,idrid); DBG("Inv BufferSize=%u", buffersize); } if ( IsTagBmc((char *)rdr.IdString.Data, rdr.IdString.DataLength) ) { /* Get all of the inventory data areas and fields */ memset(inv,0,buffersize); rv_rdr = saHpiIdrInfoGet(sessionid, resourceid, idrid, &idrInfo); if (rv_rdr != SA_OK) { printf("IDR Info error: rv_rdr = %d\n",rv_rdr); } else { /* idrInfo is ok */ if (copt.debug) DBG("IDR Info: ok "); print_epath(&rptentry.ResourceEntity, 1); printf("RDR[%x]: Inventory, IdrId=%x %s\n",rdr.RecordId, idrid,rdr.IdString.Data); print_idrinfo(&idrInfo,4); rv_rdr = walkInventory(sessionid, resourceid, &idrInfo); if (copt.debug) DBG("walkInventory rv_rdr = %d",rv_rdr); } if (!ent_writable(&rptentry.ResourceEntity,&idrInfo)) foundasset = 0; if ((atag.tlen > 0) && (foundasset == 1)) { SaHpiIdrFieldT atagField; atagField.Type = SAHPI_IDR_FIELDTYPE_ASSET_TAG; atagField.ReadOnly = SAHPI_FALSE; atagField.AreaId = atag.areaid; atagField.FieldId = atag.fieldid; strptr=&(atagField.Field); strptr->DataType = SAHPI_TL_TYPE_TEXT; strptr->Language = SAHPI_LANG_ENGLISH; strptr->DataLength = (SaHpiUint8T)atag.tlen; strncpy((char *)strptr->Data, atag.tag, atag.tlen); strptr->Data[atag.tlen] = 0; printf( "Writing new asset tag: %s\n",strptr->Data); rv_rdr = saHpiIdrFieldSet(sessionid, resourceid, atag.idrid, &atagField); printf("Return Write Status = %d\n", rv_rdr); if (rv_rdr == SA_OK) { printf ("Good write - re-reading!\n"); rv_rdr = walkInventory(sessionid, resourceid, &idrInfo); if (copt.debug) DBG("walkInventory rv_rdr = %d",rv_rdr); } /* Good write - re-read */ } /*endif foundasset*/ } /*endif RDR tag ok*/ } /* Inventory Data Records - Type 3 */ else if (copt.debug) DBG("rdr type = %u", rdr.RdrType); } /*endif RdrGet ok*/ entryid = nextentryid; } /*end while rdr*/ } /*endif rpt invent capab*/ else if (copt.debug) DBG("Resource[%u] Tag: %s", rptentryid,tagstr); } /*endif rpt ok*/ rptentryid = nextrptentryid; } /*end rpt loop */ if (copt.debug) DBG("loop %u inventory found = %d",nloops,invfound); } /*end while no inv */ rv = saHpiSessionClose(sessionid); return 0; } /* end hpifru.c */ openhpi-3.6.1/clients/hpitree.c0000644000175100017510000004473612575647264015460 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * (C) Copyright IBM Corp. 2004 * (C) Copyright Nokia Siemens Networks 2010 * (C) Copyright Ulrich Kleber 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Peter D. Phan * Tariq Shureih * Ulrich Kleber * * Log: * Copied from hpifru.c and modified for general use * * Changes: * 11/03/2004 kouzmich Fixed Bug #1057934 * 09/02/2010 lwetzel Fixed Bug ResourceId 255 (0xFF) is a valid ResourceId * 07/06/2010 ulikleber New option -D to select domain * 20/01/2011 ulikleber Refactoring to use glib for option parsing and * introduce common options for all clients * */ #include "oh_clients.h" #define OH_SVN_REV "$Revision: 7343 $" /* * Function prototypes */ static SaErrorT list_resources(SaHpiSessionIdT sessionid, SaHpiResourceIdT res_id); static SaErrorT list_rpt(SaHpiRptEntryT *rptptr,SaHpiResourceIdT resourceid); static SaErrorT list_rdr(SaHpiSessionIdT sessionid, SaHpiRptEntryT *rptptr, SaHpiRdrT *rdrptr, SaHpiResourceIdT l_resourceid); static SaErrorT list_inv(SaHpiSessionIdT sessionid, SaHpiRptEntryT *rptptr, SaHpiRdrT *rdrptr, SaHpiResourceIdT l_resourceid); static SaErrorT list_sens(SaHpiSessionIdT sessionid, SaHpiRptEntryT *rptptr, SaHpiRdrT *rdrptr, SaHpiResourceIdT l_resourceid); static SaErrorT list_ctrl(SaHpiSessionIdT sessionid, SaHpiRptEntryT *rptptr, SaHpiRdrT *rdrptr, SaHpiResourceIdT l_resourceid); static SaErrorT list_wdog(SaHpiSessionIdT sessionid, SaHpiRptEntryT *rptptr, SaHpiRdrT *rdrptr, SaHpiResourceIdT l_resourceid); static SaErrorT list_ann (SaHpiSessionIdT sessionid, SaHpiRptEntryT *rptptr, SaHpiRdrT *rdrptr, SaHpiResourceIdT l_resourceid); static SaErrorT walkInventory(SaHpiSessionIdT sessionid, SaHpiResourceIdT resourceid, SaHpiIdrInfoT *idrInfo); static SaErrorT getcontrolstate(SaHpiSessionIdT sessionid, SaHpiResourceIdT l_resourceid, SaHpiCtrlNumT num); static void sensor_readingthreshold(SaHpiSessionIdT sessionid, SaHpiResourceIdT resourceid, SaHpiRdrT *rdrptr); /* * Globals for this driver */ static gboolean f_listall = FALSE; static gboolean f_rpt = FALSE; static gboolean f_rdr = FALSE; static gboolean f_inv = FALSE; static gboolean f_sensor = FALSE; static gboolean f_wdog = FALSE; //static gboolean f_dimi = FALSE; why is this implemented only in hpitop? //static gboolean f_fumi = FALSE; why is this implemented only in hpitop? static gboolean f_ann = FALSE; static gboolean f_ctrl = FALSE; static gboolean f_overview = FALSE; static gboolean f_allres = TRUE; static gint f_resourceid = 0; static oHpiCommonOptionsT copt; static GOptionEntry my_options[] = { { "all", 'a', 0, G_OPTION_ARG_NONE, &f_listall, "Display all rpts and rdrs (default)", NULL }, { "controls", 'c', 0, G_OPTION_ARG_NONE, &f_ctrl, "Display only controls", NULL }, { "rdrs", 'd', 0, G_OPTION_ARG_NONE, &f_rdr, "Display rdr records", NULL }, { "inventories", 'i', 0, G_OPTION_ARG_NONE, &f_inv, "Display only inventories", NULL }, { "rpts", 'r', 0, G_OPTION_ARG_NONE, &f_rpt, "Display only rpts", NULL }, { "sensors", 's', 0, G_OPTION_ARG_NONE, &f_sensor, "Display only sensors", NULL }, { "watchdogs", 'w', 0, G_OPTION_ARG_NONE, &f_wdog, "Display only watchdogs", NULL }, { "overview", 'o', 0, G_OPTION_ARG_NONE, &f_overview, "Display system overview: rpt & rdr headers",NULL }, // { "fumis", 'f', 0, G_OPTION_ARG_NONE, &f_fumi, "Display only fumis", NULL }, // { "dimis", 'd', 0, G_OPTION_ARG_NONE, &f_dimi, "Display only dimis", NULL }, // { "annunciators", 'a', 0, G_OPTION_ARG_NONE, &f_ann, "Display only annunciators", NULL }, // Annunciators not implemented { "resource", 'n', 0, G_OPTION_ARG_INT, &f_resourceid, "Select particular resource id to display\n\t\t\t" "(Used with [-cdirs] options)", "nn" }, { NULL } }; /* * Main */ int main(int argc, char **argv) { SaErrorT rv = SA_OK; SaHpiSessionIdT sessionid; GOptionContext *context; /* Print version strings */ oh_prog_version(argv[0]); /* Parsing options */ static char usetext[]="- Display system topology\n " OH_SVN_REV; OHC_PREPARE_REVISION(usetext); context = g_option_context_new (usetext); g_option_context_add_main_entries (context, my_options, NULL); if (!ohc_option_parse(&argc, argv, context, &copt, OHC_ALL_OPTIONS - OHC_ENTITY_PATH_OPTION //TODO: Feature 880127? - OHC_VERBOSE_OPTION )) { // no verbose mode implemented g_option_context_free (context); return 1; } g_option_context_free (context); if (!(f_rpt || f_sensor || f_inv || f_ctrl || f_rdr || f_wdog)) f_listall = TRUE; if (f_resourceid != 0) f_allres = FALSE; rv = ohc_session_open_by_option ( &copt, &sessionid); if (rv != SA_OK) return rv; /* * Resource discovery */ if (copt.debug) DBG("saHpiDiscover"); rv = saHpiDiscover(sessionid); if (rv != SA_OK) { CRIT("saHpiDiscover returns %s",oh_lookup_error(rv)); return rv; } printf("Discovery done\n"); list_resources(sessionid, (SaHpiResourceIdT) f_resourceid); rv = saHpiSessionClose(sessionid); return 0; } /* * */ static SaErrorT list_resources(SaHpiSessionIdT sessionid,SaHpiResourceIdT resourceid) { SaErrorT rv = SA_OK, rvRdrGet = SA_OK, rvRptGet = SA_OK; SaHpiRptEntryT rptentry; SaHpiEntryIdT rptentryid; SaHpiEntryIdT nextrptentryid; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiRdrT rdr; SaHpiResourceIdT l_resourceid; SaHpiTextBufferT working; oh_init_textbuffer(&working); /* walk the RPT list */ rptentryid = SAHPI_FIRST_ENTRY; do { if (copt.debug) DBG("saHpiRptEntryGet"); rvRptGet = saHpiRptEntryGet(sessionid,rptentryid,&nextrptentryid,&rptentry); if ((rvRptGet != SA_OK) || copt.debug) DBG("RptEntryGet returns %s",oh_lookup_error(rvRptGet)); rv = list_rpt(&rptentry, resourceid); if (rvRptGet == SA_OK && (rptentry.ResourceCapabilities & SAHPI_CAPABILITY_RDR) && ((f_allres) || (resourceid == rptentry.ResourceId))) { l_resourceid = rptentry.ResourceId; if (!f_allres) nextrptentryid = SAHPI_LAST_ENTRY; /* walk the RDR list for this RPT entry */ entryid = SAHPI_FIRST_ENTRY; if (copt.debug) DBG("rptentry[%u] resourceid=%u\n", entryid,resourceid); do { rvRdrGet = saHpiRdrGet(sessionid,l_resourceid, entryid,&nextentryid, &rdr); if (copt.debug) DBG("saHpiRdrGet[%u] rv = %s\n",entryid,oh_lookup_error(rvRdrGet)); if (rvRdrGet == SA_OK) { if (f_listall || f_rdr || f_overview) list_rdr(sessionid, &rptentry, &rdr, l_resourceid); if (f_listall || f_inv) list_inv(sessionid, &rptentry, &rdr, l_resourceid); if (f_listall || f_sensor) list_sens(sessionid, &rptentry, &rdr, l_resourceid); if (f_listall || f_ctrl) list_ctrl(sessionid, &rptentry, &rdr, l_resourceid); if (f_listall || f_wdog) list_wdog(sessionid, &rptentry, &rdr, l_resourceid); if (f_listall || f_ann) list_ann(sessionid, &rptentry, &rdr, l_resourceid); } entryid = nextentryid; } while ((rvRdrGet == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; } rptentryid = nextrptentryid; } while ((rvRptGet == SA_OK) && (rptentryid != SAHPI_LAST_ENTRY)); return(rv); } /* * */ static SaErrorT list_rpt(SaHpiRptEntryT *rptptr,SaHpiResourceIdT resourceid) { SaErrorT rv = SA_OK; if ((f_allres) || (resourceid == rptptr->ResourceId)) { /* Always print resource header */ if (!f_listall && !f_rpt) printf("\nRPT Tag: %s, ResourceId %u\n",rptptr->ResourceTag.Data, rptptr->ResourceId); oh_print_ep(&rptptr->ResourceEntity, 0); printf("\n"); /* Print details when asked */ if (f_listall || f_rpt) oh_print_rptentry(rptptr, 2); } return(rv); } /* * */ static SaErrorT list_inv(SaHpiSessionIdT sessionid, SaHpiRptEntryT *rptptr, SaHpiRdrT *rdrptr, SaHpiResourceIdT l_resourceid) { SaErrorT rvInvent = SA_OK; SaHpiIdrInfoT idrInfo; SaHpiIdrIdT idrid; SaHpiTextBufferT working; oh_init_textbuffer(&working); if (rdrptr->RdrType == SAHPI_INVENTORY_RDR) { idrid = rdrptr->RdrTypeUnion.InventoryRec.IdrId; rvInvent = saHpiIdrInfoGet( sessionid, l_resourceid, idrid, &idrInfo); if (rvInvent !=SA_OK) { printf("saHpiIdrInfoGet: ResourceId %u IdrId %u, error %s\n", l_resourceid, idrid, oh_lookup_error(rvInvent)); } else { oh_print_idrinfo(&idrInfo, 4); walkInventory(sessionid, l_resourceid, &idrInfo); } } return(rvInvent); } /* * This routine walks the complete inventory idr for this resource. * It does not look for a particular IdrAreaType or IdrFieldType. * Particular type tests are coverred in respecting routines. * **/ static SaErrorT walkInventory( SaHpiSessionIdT sessionid, SaHpiResourceIdT resourceid, SaHpiIdrInfoT *idrInfo) { SaErrorT rv = SA_OK, rvField = SA_OK; SaHpiUint32T numAreas; SaHpiUint32T countAreas = 0; SaHpiUint32T countFields = 0; SaHpiEntryIdT areaId; SaHpiEntryIdT nextareaId; SaHpiIdrAreaTypeT areaType; SaHpiIdrAreaHeaderT areaHeader; SaHpiEntryIdT fieldId; SaHpiEntryIdT nextFieldId; SaHpiIdrFieldTypeT fieldType; SaHpiIdrFieldT thisField; numAreas = idrInfo->NumAreas; areaType = SAHPI_IDR_AREATYPE_UNSPECIFIED; areaId = SAHPI_FIRST_ENTRY; do { rv = saHpiIdrAreaHeaderGet(sessionid, resourceid, idrInfo->IdrId, areaType, areaId, &nextareaId, &areaHeader); if (rv == SA_OK) { countFields = 0; /* Bug #1057934 */ countAreas++; oh_print_idrareaheader(&areaHeader, 8); fieldType = SAHPI_IDR_FIELDTYPE_UNSPECIFIED; fieldId = SAHPI_FIRST_ENTRY; do { rvField = saHpiIdrFieldGet( sessionid, resourceid, idrInfo->IdrId, areaHeader.AreaId, fieldType, fieldId, &nextFieldId, &thisField); if (rvField == SA_OK) { countFields++; oh_print_idrfield(&thisField, 12); } if (copt.debug) DBG("saHpiIdrFieldGet error %s",oh_lookup_error(rvField)); fieldId = nextFieldId; } while ((rvField == SA_OK) && (fieldId != SAHPI_LAST_ENTRY)); if ( countFields != areaHeader.NumFields) printf("Area Header error! areaHeader.NumFields %u, countFields %u\n", areaHeader.NumFields, countFields); } else { printf("saHpiIdrAreaHeaderGet error %s\n",oh_lookup_error(rv)); } areaId = nextareaId; } while ((rv == SA_OK) && (areaId != SAHPI_LAST_ENTRY)); if ((rv == SA_OK) && (countAreas != numAreas)) printf("idrInfo error! idrInfo.NumAreas = %u; countAreas = %u\n", numAreas, countAreas); return(rv); } /* * */ static SaErrorT list_sens(SaHpiSessionIdT sessionid, SaHpiRptEntryT *rptptr, SaHpiRdrT *rdrptr, SaHpiResourceIdT l_resourceid) { SaErrorT rv = SA_OK; SaHpiTextBufferT working; oh_init_textbuffer(&working); if (rdrptr->RdrType == SAHPI_SENSOR_RDR) { if (&rdrptr->RdrTypeUnion.SensorRec == 0) printf("ERROR! Sensor pointer NULL\n"); printf(" Sensor Name: "); rv = oh_print_text(&(rdrptr->IdString)); if (rv) printf("oh_print_text Error=%s\n", oh_lookup_error(rv)); rv = oh_print_ep(&(rdrptr->Entity), 4); if (rv) printf("oh_print_ep Error=%s\n", oh_lookup_error(rv)); rv = oh_print_sensorrec(&rdrptr->RdrTypeUnion.SensorRec, 4); if (rv) printf("oh_print_sensorrec Error=%s\n", oh_lookup_error(rv)); sensor_readingthreshold(sessionid, l_resourceid, rdrptr); } return(rv); } /* * This routine get sensor reading and threshold, and display them. * **/ static void sensor_readingthreshold(SaHpiSessionIdT sessionid, SaHpiResourceIdT resourceid, SaHpiRdrT *rdrptr) { SaHpiSensorRecT *sensorrec; SaHpiSensorNumT sensornum; SaHpiSensorReadingT reading; SaHpiSensorThresholdsT thresh; SaHpiEventStateT events; SaHpiTextBufferT text; SaErrorT rv; sensorrec = &rdrptr->RdrTypeUnion.SensorRec; sensornum = sensorrec->Num; rv = saHpiSensorReadingGet(sessionid,resourceid, sensornum, &reading, &events); if (rv != SA_OK) { printf("\nReadingGet ret=%s\n", oh_lookup_error(rv)); return; } if((rv = oh_decode_eventstate(events, sensorrec->Category, &text)) == SA_OK) { printf("\t Sensor %u state = %s\n", sensornum, text.Data); } else { printf("\n\t Sensor %u state FAILED, %s\n", sensornum, oh_lookup_error(rv)); } if (!reading.IsSupported ) { printf("\t Reading not supported for sensor %u!\n\n", sensornum); return; } if((rv = oh_decode_sensorreading(reading, sensorrec->DataFormat, &text)) == SA_OK) { printf("\t Sensor %u reading = %s\n", sensornum, text.Data); } else { printf("\n\t Sensor %u reading FAILED, %s\n", sensornum, oh_lookup_error(rv)); } rv = saHpiSensorThresholdsGet(sessionid,resourceid, sensornum, &thresh); if (rv != SA_OK) { if (rv == SA_ERR_HPI_INVALID_CMD) { printf("\t Readable thresholds not supported\n\n"); return; } else { printf("\t ThresholdsGet ret=%s\n\n", oh_lookup_error(rv)); return; } } printf( "\t Thresholds:\n" ); if (thresh.LowCritical.IsSupported) { if((rv = oh_decode_sensorreading(thresh.LowCritical, sensorrec->DataFormat, &text)) == SA_OK) { printf( "\t\tLow Critical Threshold: %s\n", text.Data); } else { printf( "\t\tLow Critical Threshold: FAILED %s\n", oh_lookup_error(rv)); } } if (thresh.LowMajor.IsSupported) { if((rv = oh_decode_sensorreading(thresh.LowMajor, sensorrec->DataFormat, &text)) == SA_OK) { printf( "\t\tLow Major Threshold: %s\n", text.Data); } else { printf( "\t\tLow Major Threshold: FAILED %s\n", oh_lookup_error(rv)); } } if (thresh.LowMinor.IsSupported) { if((rv = oh_decode_sensorreading(thresh.LowMinor, sensorrec->DataFormat, &text)) == SA_OK) { printf( "\t\tLow Minor Threshold: %s\n", text.Data); } else { printf( "\t\tLow Minor Threshold: FAILED %s\n", oh_lookup_error(rv)); } } if (thresh.UpCritical.IsSupported) { if((rv = oh_decode_sensorreading(thresh.UpCritical, sensorrec->DataFormat, &text)) == SA_OK) { printf( "\t\tUp Critical Threshold: %s\n", text.Data); } else { printf( "\t\tUp Critical Threshold: FAILED %s\n", oh_lookup_error(rv)); } } if (thresh.UpMajor.IsSupported) { if((rv = oh_decode_sensorreading(thresh.UpMajor, sensorrec->DataFormat, &text)) == SA_OK) { printf( "\t\tUp Major Threshold: %s\n", text.Data); } else { printf( "\t\tUp Major Threshold: FAILED %s\n", oh_lookup_error(rv)); } } if (thresh.UpMinor.IsSupported) { if((rv = oh_decode_sensorreading(thresh.UpMinor, sensorrec->DataFormat, &text)) == SA_OK) { printf( "\t\tUp Minor Threshold: %s\n", text.Data); } else { printf( "\t\tUp Minor Threshold: FAILED %s\n", oh_lookup_error(rv)); } } if (thresh.PosThdHysteresis.IsSupported) { if((rv = oh_decode_sensorreading(thresh.PosThdHysteresis, sensorrec->DataFormat, &text)) == SA_OK) { printf( "\t\tPos Threshold Hysteresis: %s\n", text.Data); } else { printf( "\t\tPos Threshold Hysteresis: FAILED %s\n", oh_lookup_error(rv)); } } if (thresh.NegThdHysteresis.IsSupported) { if((rv = oh_decode_sensorreading(thresh.NegThdHysteresis, sensorrec->DataFormat, &text)) == SA_OK) { printf( "\t\tNeg Threshold Hysteresis: %s\n", text.Data); } else { printf( "\t\tNeg Threshold Hysteresis: FAILED %s\n", oh_lookup_error(rv)); } } printf("\n\n\n"); } /* * */ static SaErrorT list_rdr(SaHpiSessionIdT sessionid, SaHpiRptEntryT *rptptr, SaHpiRdrT *rdrptr, SaHpiResourceIdT l_resourceid) { SaErrorT rv = SA_OK; SaHpiTextBufferT working; oh_init_textbuffer(&working); if (!f_overview) { rv = oh_print_rdr(rdrptr, 4); } else { snprintf((char *)working.Data, SAHPI_MAX_TEXT_BUFFER_LENGTH, " Found %s, RecordId %u", oh_lookup_rdrtype(rdrptr->RdrType), rdrptr->RecordId); rv = oh_print_text(&working); } return(rv); } /* * */ static SaErrorT list_ctrl(SaHpiSessionIdT sessionid, SaHpiRptEntryT *rptptr, SaHpiRdrT *rdrptr, SaHpiResourceIdT l_resourceid) { SaErrorT rv = SA_OK; SaHpiTextBufferT working; oh_init_textbuffer(&working); if (rdrptr->RdrType == SAHPI_CTRL_RDR){ rv = oh_print_ctrlrec(&rdrptr->RdrTypeUnion.CtrlRec, 4); rv = getcontrolstate(sessionid, l_resourceid, rdrptr->RdrTypeUnion.CtrlRec.Num); } return(rv); } /* * */ static SaErrorT getcontrolstate(SaHpiSessionIdT sessionid, SaHpiResourceIdT l_resourceid, SaHpiCtrlNumT num) { SaErrorT rv = SA_OK; SaHpiCtrlModeT mode; SaHpiCtrlStateT state; rv = saHpiControlGet(sessionid, l_resourceid, num, &mode, &state); if (rv == SA_OK) oh_print_ctrlstate(&state, 4); return(rv); } /* * */ static SaErrorT list_wdog(SaHpiSessionIdT sessionid, SaHpiRptEntryT *rptptr, SaHpiRdrT *rdrptr, SaHpiResourceIdT l_resourceid) { SaErrorT rv = SA_OK; SaHpiTextBufferT working; oh_init_textbuffer(&working); if (rdrptr->RdrType == SAHPI_WATCHDOG_RDR) { rv = oh_print_watchdogrec(&rdrptr->RdrTypeUnion.WatchdogRec, 4); } return(rv); } /* * */ static SaErrorT list_ann (SaHpiSessionIdT sessionid, SaHpiRptEntryT *rptptr, SaHpiRdrT *rdrptr, SaHpiResourceIdT l_resourceid) { /* Wave */ return(SA_OK); } /* end hpitree.c */ openhpi-3.6.1/clients/hpireset.c0000644000175100017510000001054112575647264015626 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * (C) Copyright Nokia Siemens Networks 2010 * (C) Copyright Ulrich Kleber 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Andy Cress * Ulrich Kleber * * Changes: * 10/13/2004 kouzmich porting to HPI B * 09/06/2010 ulikleber New option -D to select domain * 20/01/2011 ulikleber Refactoring to use glib for option parsing and * introduce common options for all clients * */ #include "oh_clients.h" #define OH_SVN_REV "$Revision: 7291 $" #define uchar unsigned char static gboolean f_hard = TRUE; // hard reset as default static gboolean f_warm = FALSE; static oHpiCommonOptionsT copt; static GOptionEntry my_options[] = { { "hard", 'r', 0, G_OPTION_ARG_NONE, &f_hard, "hard resets the system", NULL }, //{ "power-down", 'd', 0, G_OPTION_ARG_NONE, &f_, "powers Down the system", NULL }, { "warm", 'w', 0, G_OPTION_ARG_NONE, &f_warm, "warm resets the system", NULL }, //{ "power-cycle", 'c', 0, G_OPTION_ARG_NONE, &f_, "power cycles the system", NULL }, //{ "nmi", 'n', 0, G_OPTION_ARG_NONE, &f_, "sends NMI to the system", NULL }, //{ "soft-shutdown", 'o', 0, G_OPTION_ARG_NONE, &f_, "soft-shutdown OS", NULL }, //{ "service-partition",'s', 0, G_OPTION_ARG_NONE, &f_, "reboots to Service Partition", NULL }, { NULL } }; int main(int argc, char **argv) { int is_reset = 0; SaErrorT rv; SaHpiSessionIdT sessionid; SaHpiDomainInfoT domainInfo; SaHpiRptEntryT rptentry; SaHpiEntryIdT rptentryid; SaHpiEntryIdT nextrptentryid; SaHpiEntryIdT entryid; SaHpiResourceIdT resourceid; SaHpiResetActionT action = SAHPI_COLD_RESET; // hard reset as default GOptionContext *context; /* Print version strings */ oh_prog_version(argv[0]); /* Parsing options */ static char usetext[]="- Exercise HPI Reset Management APIs\n " OH_SVN_REV; OHC_PREPARE_REVISION(usetext); context = g_option_context_new (usetext); g_option_context_add_main_entries (context, my_options, NULL); if (!ohc_option_parse(&argc, argv, context, &copt, OHC_ALL_OPTIONS - OHC_ENTITY_PATH_OPTION //TODO: Feature 880127? - OHC_VERBOSE_OPTION )) { // no verbose mode implemented g_option_context_free (context); return 1; } g_option_context_free (context); if (f_warm) action = SAHPI_WARM_RESET; rv = ohc_session_open_by_option ( &copt, &sessionid); if (rv != SA_OK) return rv; rv = saHpiDiscover(sessionid); if (copt.debug) DBG("saHpiDiscover rv = %d",rv); rv = saHpiDomainInfoGet(sessionid, &domainInfo); if (copt.debug) DBG("saHpiDomainInfoGet rv = %d",rv); printf("RptInfo: UpdateCount = %x, UpdateTime = %lx\n", domainInfo.RptUpdateCount, (unsigned long)domainInfo.RptUpdateTimestamp); /* walk the RPT list */ rptentryid = SAHPI_FIRST_ENTRY; while ((rv == SA_OK) && (rptentryid != SAHPI_LAST_ENTRY)) { SaErrorT rv1; rv = saHpiRptEntryGet(sessionid,rptentryid,&nextrptentryid,&rptentry); if (rv != SA_OK) printf("saHpiRptEntryGet: rv = %d\n",rv); if (rv == SA_OK) { /* walk the RDR list for this RPT entry */ entryid = SAHPI_FIRST_ENTRY; resourceid = rptentry.ResourceId; rptentry.ResourceTag.Data[rptentry.ResourceTag.DataLength] = 0; printf("rptentry[%u] resourceid=%u tag: %s\n", entryid,resourceid, rptentry.ResourceTag.Data); if (rptentry.ResourceCapabilities & SAHPI_CAPABILITY_RESET) { is_reset = 1; rv1 = saHpiResourceResetStateSet(sessionid, resourceid, action); //resourceid, SAHPI_POWER_OFF); printf("ResetStateSet status = %d...requested %d\n",rv1, action); } } rptentryid = nextrptentryid; } rv = saHpiSessionClose(sessionid); if (is_reset == 0) printf("No resources with Reset capability found\n"); return(0); } /* end hpireset.c */ openhpi-3.6.1/clients/hpithres.c0000644000175100017510000004015512575650454015630 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * (C) Copyright Nokia Siemens Networks 2010 * (C) Copyright Ulrich Kleber 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Bill Barkely * Andy Cress * Ulrich Kleber * * Changes: * 02/26/04 ARCress - added general search for any Fan sensor. * 03/17/04 ARCress - changed to Temp sensor (always has Lower Major) * 11/03/2004 kouzmich porting to HPI B * 11/25/2004 kouzmich changed as new threshold client (first release) * 09/06/2010 ulikleber New option -D to select domain * 01/02/2011 ulikleber Refactoring to use glib for option parsing and * introduce common options for all clients * */ #include "oh_clients.h" #define OH_SVN_REV "$Revision: 7663 $" #define READ_BUF_SIZE 1024 typedef enum { UNKNOWN_TYPE = 0, LOWER_CRIT, LOWER_MAJOR, LOWER_MINOR, UPPER_CRIT, UPPER_MAJOR, UPPER_MINOR, POS_HYST, NEG_HYST } ThresTypes_t; typedef struct { int rpt_ind; int is_value; int modify; SaHpiRdrT Rdr; SaHpiSensorReadingT reading; SaHpiSensorThresholdsT thresholds; } Rdr_t; typedef struct { SaHpiRptEntryT Rpt; int nrdrs; Rdr_t *rdrs; } Rpt_t; typedef enum { COM_UNDEF = 0, COM_EXIT, COM_HELP, COM_RPT, COM_RDR, COM_SENS, COM_MOD, COM_UNDO } Com_enum_t; typedef struct { char *command_name; Com_enum_t type; } Commands_def_t; Commands_def_t Coms[] = { { "quit", COM_EXIT }, { "q", COM_EXIT }, { "exit", COM_EXIT }, { "help", COM_HELP }, { "h", COM_HELP }, { "rpt", COM_RPT }, { "rdr", COM_RDR }, { "sen", COM_SENS }, { "mod", COM_MOD }, { "undo", COM_UNDO }, { NULL, COM_UNDEF } }; Rpt_t *Rpts; int nrpts = 0; static oHpiCommonOptionsT copt; SaHpiSessionIdT sessionid; static void *resize_array(void *Ar, int item_size, int *last_num, int add_num) /* Resize array Ar: * item_size - item size (bytes) * last_num - current array size * add_num - new array size = last_num + add_num * Return: new pointer */ { void *R; int new_num = *last_num + add_num; if (new_num <= 0) return((void *)NULL); R = malloc(item_size * new_num); memset(R, 0, item_size * new_num); if (*last_num > 0) { memcpy(R, Ar, *last_num * item_size); free(Ar); } *last_num = new_num; return(R); } static void print_value(SaHpiSensorReadingT *item, char *mes) { char *val; if (item->IsSupported != SAHPI_TRUE) return; switch (item->Type) { case SAHPI_SENSOR_READING_TYPE_INT64: printf("%" PRId64 " %s\n", (int64_t) item->Value.SensorInt64, mes); return; case SAHPI_SENSOR_READING_TYPE_UINT64: printf("%" PRIu64 " %s\n", (uint64_t) item->Value.SensorUint64, mes); return; case SAHPI_SENSOR_READING_TYPE_FLOAT64: printf("%10.3f %s\n", item->Value.SensorFloat64, mes); return; case SAHPI_SENSOR_READING_TYPE_BUFFER: val = (char *)(item->Value.SensorBuffer); if (val != NULL) printf("%s %s\n", val, mes); return; } } static void ShowThres(SaHpiSensorThresholdsT *sensbuff) { printf(" Supported Thresholds:\n"); print_value(&(sensbuff->LowCritical), " Lower Critical Threshold(lc):"); print_value(&(sensbuff->LowMajor), " Lower Major Threshold(la):"); print_value(&(sensbuff->LowMinor), " Lower Minor Threshold(li):"); print_value(&(sensbuff->UpCritical), " Upper Critical Threshold(uc):"); print_value(&(sensbuff->UpMajor), " Upper Major Threshold(ua):"); print_value(&(sensbuff->UpMinor), " Upper Minor Threshold(ui):"); print_value(&(sensbuff->PosThdHysteresis), " Positive Threshold Hysteresis(ph):"); print_value(&(sensbuff->NegThdHysteresis), " Negative Threshold Hysteresis(nh):"); printf("\n"); } static void show_rpt(Rpt_t *Rpt, int ind) { printf("%3d RPT: id = %3d ResourceId = %3d Tag = %s\n", ind, Rpt->Rpt.EntryId, Rpt->Rpt.ResourceId, Rpt->Rpt.ResourceTag.Data); } static int find_rpt_by_id(SaHpiEntryIdT id) { int i; for (i = 0; i < nrpts; i++) if (Rpts[i].Rpt.EntryId == id) return(i); return(-1); } static void show_rpts(char *S) { int i, rpt; i = sscanf(S, "%d", &rpt); if (i == 1) { i = find_rpt_by_id(rpt); if (i >= 0) oh_print_rptentry(&(Rpts[i].Rpt), 1); else printf("No RPT for id: %d\n", rpt); return; } for (i = 0; i < nrpts; i++) show_rpt(Rpts + i, i); } static int find_rdr_by_id(Rpt_t *R, SaHpiEntryIdT id) { int i; for (i = 0; i < R->nrdrs; i++) if (R->rdrs[i].Rdr.RecordId == id) return(i); return(-1); } static void show_rdr(Rdr_t *Rdr, int ind) { printf(" %3d RDR: id = %3d Data = %s\n", ind, Rdr->Rdr.RecordId, Rdr->Rdr.IdString.Data); } static void show_sen(Rdr_t *Rdr, int rptid) { if (Rdr->Rdr.RdrType != SAHPI_SENSOR_RDR) return; printf(" RPT id = %3d RDR id = %3d sensornum = %3d Data = %s\n", rptid, Rdr->Rdr.RecordId, Rdr->Rdr.RdrTypeUnion.SensorRec.Num, Rdr->Rdr.IdString.Data); } static void show_sens_for_rpt(Rpt_t *R) { int j; for (j = 0; j < R->nrdrs; j++) { show_sen(R->rdrs + j, R->Rpt.EntryId); } } static void show_rdrs_for_rpt(Rpt_t *R) { int j; for (j = 0; j < R->nrdrs; j++) { show_rdr(R->rdrs + j, j); } } static void show_rdrs(char *S) { int i, j, rpt, rdr; Rpt_t *R; i = sscanf(S, "%d %d", &rpt, &rdr); if (i == 1) { i = find_rpt_by_id(rpt); if (i >= 0) { show_rpt(Rpts + i, i); show_rdrs_for_rpt(Rpts + i); } else printf("No RPT for id: %d\n", rpt); return; } if (i == 2) { i = find_rpt_by_id(rpt); if (i >= 0) { j = find_rdr_by_id(Rpts + i, rdr); if (j >= 0) oh_print_rdr(&(Rpts[i].rdrs[j].Rdr), 2); else printf("No RDR %d for rpt %d\n", rdr, rpt); } else printf("No RPT for id: %d\n", rpt); return; } for (i = 0, R = Rpts; i < nrpts; i++, R++) { show_rpt(R, i); show_rdrs_for_rpt(R); } } static void show_reading_value(Rpt_t *Rpt, Rdr_t *R) { SaHpiSensorUnitsT k; SaErrorT rv; char unit[128]; rv = saHpiSensorReadingGet(sessionid, Rpt->Rpt.ResourceId, R->Rdr.RdrTypeUnion.SensorRec.Num, &(R->reading), NULL); if (rv != SA_OK) { CRIT("ERROR: saHpiSensorReadingGet returned %s", oh_lookup_error(rv)); return; }; k = R->Rdr.RdrTypeUnion.SensorRec.DataFormat.BaseUnits; printf("Reading value: "); snprintf(unit, 128, "%s", oh_lookup_sensorunits(k)); print_value(&(R->reading), unit); } static void show_thresholds(Rpt_t *Rpt, Rdr_t *R) { SaHpiSensorThresholdsT buf; SaErrorT rv; rv = saHpiSensorThresholdsGet(sessionid, Rpt->Rpt.ResourceId, R->Rdr.RdrTypeUnion.SensorRec.Num, &buf); if (rv != SA_OK) { CRIT("ERROR: saHpiSensorThresholdsGet returned %s", oh_lookup_error(rv)); return; }; printf(" Thresholds:\n"); ShowThres(&buf); if (R->is_value == 0) { R->thresholds = buf; R->is_value = 1; } } static int find_sensor_by_num(Rpt_t *R, int num) { int i; for (i = 0; i < R->nrdrs; i++) { if (R->rdrs[i].Rdr.RdrType == SAHPI_SENSOR_RDR) { if (R->rdrs[i].Rdr.RdrTypeUnion.SensorRec.Num == num) return(i); } }; return(-1); } static void show_sens(char *S) { int i, j, rpt, num; Rpt_t *Rpt; Rdr_t *Rdr; i = sscanf(S, "%d %d", &rpt, &num); if (i == 1) { i = find_rpt_by_id(rpt); if (i >= 0) show_sens_for_rpt(Rpts + i); return; } if (i == 2) { i = find_rpt_by_id(rpt); if (i < 0) { printf("No RPT for id: %d\n", rpt); return; }; j = find_sensor_by_num(Rpts + i, num); if (j < 0) { printf("No sensor %d for rpt %d\n", num, rpt); return; }; oh_print_rdr(&(Rpts[i].rdrs[j].Rdr), 2); show_reading_value(Rpts + i, Rpts[i].rdrs + j); show_thresholds(Rpts + i, Rpts[i].rdrs + j); return; } for (i = 0, Rpt = Rpts; i < nrpts; i++, Rpt++) { for (j = 0, Rdr = Rpt->rdrs; j < Rpt->nrdrs; Rdr++, j++) show_sen(Rdr, Rpt->Rpt.EntryId); } } static int get_number(char *mes, int *res) { char buf[READ_BUF_SIZE]; char *ret; printf("%s", mes); ret = fgets(buf, READ_BUF_SIZE, stdin); if (ret) return (sscanf(buf, "%d", res)); else return -1; } static void set_thres_value(SaHpiSensorReadingT *R, double val) { if (R->IsSupported == 0) { CRIT("ERROR: this threshold isn't supported"); return; }; R->Value.SensorFloat64 = val; } static void mod_sen(void) { int i, rpt, rdr, num; char buf[READ_BUF_SIZE], *S; Rpt_t *Rpt; Rdr_t *Rdr; SaHpiSensorThresholdsT thres; SaErrorT rv; ThresTypes_t type = UNKNOWN_TYPE; float f; SaHpiEventT event; i = get_number("RPT number: ", &rpt); if (i != 1) { CRIT("ERROR: no RPT number"); return; }; i = find_rpt_by_id(rpt); if (i < 0) { CRIT("ERROR: invalid RPT number"); return; }; rpt = i; Rpt = Rpts + rpt; show_sens_for_rpt(Rpt); i = get_number("Sensor number: ", &num); if (i != 1) { CRIT("ERROR: no Sensor number"); return; }; rdr = find_sensor_by_num(Rpt, num); if (rdr < 0) { CRIT("ERROR: invalid sensor number"); return; }; Rdr = Rpt->rdrs + rdr; oh_print_rdr(&(Rdr->Rdr), 2); show_reading_value(Rpt, Rdr); rv = saHpiSensorThresholdsGet(sessionid, Rpt->Rpt.ResourceId, Rdr->Rdr.RdrTypeUnion.SensorRec.Num, &thres); if (rv != SA_OK) { CRIT("ERROR: saHpiSensorThresholdsGet returned %s", oh_lookup_error(rv)); return; }; printf(" Thresholds:\n"); ShowThres(&thres); if (Rdr->is_value == 0) { Rdr->thresholds = thres; Rdr->is_value = 1; }; printf("threshold type (lc, la, li, uc, ua, ui, ph, nh): "); S = fgets(buf, READ_BUF_SIZE, stdin); while (*S == ' ') S++; if (strlen(S) < 2) { CRIT("ERROR: invalid threshold type: %s", S); return; }; if (strncmp(S, "lc", 2) == 0) type = LOWER_CRIT; if (strncmp(S, "la", 2) == 0) type = LOWER_MAJOR; if (strncmp(S, "li", 2) == 0) type = LOWER_MINOR; if (strncmp(S, "uc", 2) == 0) type = UPPER_CRIT; if (strncmp(S, "ua", 2) == 0) type = UPPER_MAJOR; if (strncmp(S, "ui", 2) == 0) type = UPPER_MINOR; if (strncmp(S, "ph", 2) == 0) type = POS_HYST; if (strncmp(S, "nh", 2) == 0) type = NEG_HYST; if (type == UNKNOWN_TYPE) { CRIT("ERROR: unknown threshold type: %s", S); return; }; printf("new value: "); S = fgets(buf, READ_BUF_SIZE, stdin); i = sscanf(buf, "%f", &f); if (i == 0) { CRIT("ERROR: no value"); return; }; switch (type) { case LOWER_CRIT: set_thres_value(&(thres.LowCritical), (double)f); break; case LOWER_MAJOR: set_thres_value(&(thres.LowMajor), (double)f); break; case LOWER_MINOR: set_thres_value(&(thres.LowMinor), (double)f); break; case UPPER_CRIT: set_thres_value(&(thres.UpCritical), (double)f); break; case UPPER_MAJOR: set_thres_value(&(thres.UpMajor), (double)f); break; case UPPER_MINOR: set_thres_value(&(thres.UpMinor), (double)f); break; case POS_HYST: set_thres_value(&(thres.PosThdHysteresis), (double)f); break; case NEG_HYST: set_thres_value(&(thres.NegThdHysteresis), (double)f); break; default: CRIT("ERROR: unknown threshold"); }; printf("\n Nem threshold:\n"); ShowThres(&thres); printf("Is it correct (yes, no)?:"); S = fgets(buf, READ_BUF_SIZE, stdin); while (*S == ' ') S++; if (strncmp(S, "yes", 3) != 0) return; rv = saHpiSensorThresholdsSet(sessionid, Rpt->Rpt.ResourceId, Rdr->Rdr.RdrTypeUnion.SensorRec.Num, &thres); if (rv != SA_OK) { CRIT("ERROR: saHpiSensorThresholdsSet returned %s\n", oh_lookup_error(rv)); return; }; Rdr->modify = 1; for (i = 0; i < 10; i++) { rv = saHpiEventGet(sessionid, SAHPI_TIMEOUT_IMMEDIATE, &event, NULL, NULL, NULL); if (rv == SA_OK) break; if (copt.debug) DBG("sleep before saHpiEventGet"); g_usleep(G_USEC_PER_SEC); }; saHpiSensorThresholdsGet(sessionid, Rpt->Rpt.ResourceId, Rdr->Rdr.RdrTypeUnion.SensorRec.Num, &thres); printf("Current thresholds:\n"); ShowThres(&thres); } static void undo(void) { int i, j; Rpt_t *Rpt; Rdr_t *Rdr; for (i = 0, Rpt = Rpts; i < nrpts; i++, Rpt++) { for (j = 0, Rdr = Rpt->rdrs; j < Rpt->nrdrs; j++, Rdr++) { if (Rdr->modify == 0) continue; saHpiSensorThresholdsSet(sessionid, Rpt->Rpt.ResourceId, Rdr->Rdr.RdrTypeUnion.SensorRec.Num, &(Rdr->thresholds)); Rdr->modify = 0; } } } static void get_rpts(void) { SaHpiEntryIdT rptentryid, nextrptentryid; SaErrorT rv; SaHpiRptEntryT rptentry; int n; rptentryid = SAHPI_FIRST_ENTRY; while (rptentryid != SAHPI_LAST_ENTRY) { rv = saHpiRptEntryGet(sessionid, rptentryid, &nextrptentryid, &rptentry); if (rv != SA_OK) break; n = nrpts; Rpts = (Rpt_t *)resize_array(Rpts, sizeof(Rpt_t), &nrpts, 1); rptentry.ResourceTag.Data[rptentry.ResourceTag.DataLength] = 0; Rpts[n].Rpt = rptentry; rptentryid = nextrptentryid; } } static void get_rdrs(Rpt_t *Rpt) { SaHpiRdrT rdr; SaErrorT rv; int n; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiResourceIdT resourceid; entryid = SAHPI_FIRST_ENTRY; while (entryid !=SAHPI_LAST_ENTRY) { resourceid = Rpt->Rpt.ResourceId; rv = saHpiRdrGet(sessionid, resourceid, entryid, &nextentryid, &rdr); if (rv != SA_OK) break; n = Rpt->nrdrs; Rpt->rdrs = (Rdr_t *)resize_array(Rpt->rdrs, sizeof(Rdr_t), &(Rpt->nrdrs), 1); rdr.IdString.Data[rdr.IdString.DataLength] = 0; Rpt->rdrs[n].Rdr = rdr; entryid = nextentryid; } } static void help(void) { printf("Available commands:\n"); printf(" exit, quit, q - exit\n"); printf(" help, h - this instruction\n"); printf(" rpt - show all RPT entries\n"); printf(" rpt - show #id RPT entry\n"); printf(" rdr - show all RDR entries\n"); printf(" rdr - show RDRs entries for #rptid\n"); printf(" rdr - show #rdrid RDR entry for #rptid\n"); printf(" sen - show all sensors\n"); printf(" sen - show sensors for #rptid\n"); printf(" sen - show #num sensor for #rptid\n"); printf(" mod - modify thresholds\n"); printf(" undo - delete all changes\n"); } static Com_enum_t find_command(char *S) { int i; for (i = 0;; i++) { if (Coms[i].command_name == (char *)NULL) return(COM_UNDEF); if (strcmp(Coms[i].command_name, S) == 0) return(Coms[i].type); } } static int parse_command(char *Str) { int len; char *S, *S1; Com_enum_t com; // EOF if (!Str) return(-1); S = Str; while (*S != 0) { if ((*S == '\t') || (*S == '\n')) *S = ' '; S++; }; S = Str; while (*S == ' ') S++; len = strlen(S); if (len == 0) return(0); S1 = S; while ((*S1 != 0) && (*S1 != ' ')) S1++; if (*S1 != 0) *S1++ = 0; com = find_command(S); switch (com) { case COM_UNDEF: printf("Invalid command: %s\n", S); help(); break; case COM_EXIT: return(-1); case COM_RPT: show_rpts(S1); break; case COM_RDR: show_rdrs(S1); break; case COM_SENS: show_sens(S1); break; case COM_MOD: mod_sen(); break; case COM_UNDO: undo(); break; case COM_HELP: help(); break; }; return(0); } int main(int argc, char **argv) { int i; SaErrorT rv; char buf[READ_BUF_SIZE]; char *S; GOptionContext *context; /* Print version strings */ oh_prog_version(argv[0]); /* Parsing options */ static char usetext[]="- Display sensors and sensor info\n " OH_SVN_REV; OHC_PREPARE_REVISION(usetext); context = g_option_context_new (usetext); if (!ohc_option_parse(&argc, argv, context, &copt, OHC_ALL_OPTIONS - OHC_ENTITY_PATH_OPTION //TODO: Feature 880127 - OHC_VERBOSE_OPTION )) { // no verbose mode implemented g_option_context_free (context); return 1; } g_option_context_free (context); rv = ohc_session_open_by_option ( &copt, &sessionid); if (rv != SA_OK) return rv; rv = saHpiDiscover(sessionid); if (copt.debug) DBG("saHpiDiscover: %s", oh_lookup_error(rv)); rv = saHpiSubscribe(sessionid); if (rv != SA_OK) { CRIT( "saHpiSubscribe error %d",rv); return rv; } /* make the RPT list */ get_rpts(); /* get rdrs for the RPT list */ for (i = 0; i < nrpts; i++) get_rdrs(Rpts + i); help(); for (;;) { printf("==> "); S = fgets(buf, READ_BUF_SIZE, stdin); if (parse_command(S) < 0) break; }; rv = saHpiSessionClose(sessionid); return(0); } /* end hpthres.c */ openhpi-3.6.1/clients/ohhandler.c0000644000175100017510000004353512575647264015760 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (C) Copyright Nokia Siemens Networks 2010 * (C) Copyright Ulrich Kleber 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Ulrich Kleber * * Log: * Start from hpidomain.c * This routine controls the handlers loaded by OpenHPI daemons * using the OpenHPI extensions as described in ohpi.c * * Changes: * 03/02/2011 ulikleber Refactoring to use glib for option parsing and * introduce common options for all clients * */ #include "oh_clients.h" #define OH_SVN_REV "$Revision: 7133 $" #define OHHANDLER_HELP \ "Command list \n" \ " List the handlers loaded in specified domain \n\n" \ "Command info \n" \ " Display info about handler \n\n" \ "Command destroy \n" \ " Unload handler and delete its config \n\n" \ "Command getnext \n" \ " Find next valid handler id from \n\n" \ "Command find \n" \ " Find the right handler for a resource id \n\n" \ "Command retry \n" \ " Retry loading of handler \n\n" \ "Command create plugin \n" \ " Create handler with the specified parameters. \n" \ " Pairs of strings in commandline like in openhpi.conf. \n" \ " Keyword plugin to select type of handler. \n" \ " Entity root and other complex strings must be \n" \ " enclosed in \". \n" \ " Example: \n" \ " ohhandler create plugin libsimulator " \ "entity_root \"{SYSTEM_CHASSIS,1}\" name sim\n" /********************************************/ /* Function prototypes */ /********************************************/ static SaErrorT exechandlercreate(int, char **, int); static SaErrorT exechandlerdestroy(oHpiHandlerIdT); static SaErrorT exechandlerinfo(oHpiHandlerIdT); static SaErrorT exechandlergetnext(oHpiHandlerIdT); static SaErrorT exechandlerfind(SaHpiResourceIdT); static SaErrorT exechandlerretry(oHpiHandlerIdT); static SaErrorT exechandlerlist(void); /********************************************/ /* Globals */ /********************************************/ static oHpiCommonOptionsT copt; SaHpiSessionIdT sessionid; /********************************************/ /* Main */ /********************************************/ int main(int argc, char **argv) { SaErrorT rv = SA_OK; oHpiHandlerIdT handlerid = 0; SaHpiResourceIdT resid = 0; SaHpiBoolT printusage = FALSE; int i=1; GOptionContext *context; enum cmdT {eUndefined, eHandlerCreate, eHandlerDestroy, eHandlerInfo, eHandlerGetNext, eHandlerFind, eHandlerRetry, eHandlerList} cmd=eUndefined; /* Print version strings */ oh_prog_version(argv[0]); /* Parsing options */ static char usetext[]="command [specific arguments] - " "Control openhpi plugin instances (handlers).\n " OH_SVN_REV "\n\n" OHHANDLER_HELP ; OHC_PREPARE_REVISION(usetext); context = g_option_context_new (usetext); if (!ohc_option_parse(&argc, argv, context, &copt, OHC_ALL_OPTIONS - OHC_ENTITY_PATH_OPTION // not applicable - OHC_VERBOSE_OPTION )) { // no verbose mode printusage = TRUE; } g_option_context_free (context); /* Parse ohparam specific commands */ while (i\" Open session to the domain served by the daemon \n"); printf(" at the specified URL (host:port) \n"); printf(" This option overrides the OPENHPI_DAEMON_HOST and \n"); printf(" OPENHPI_DAEMON_PORT environment variables. \n"); printf(" -C, --cfgfile=\"file\" Use passed file as client configuration file \n"); printf(" This option overrides the OPENHPICLIENT_CONF \n"); printf(" environment variable. \n\n"); return 1; } rv = ohc_session_open_by_option ( &copt, &sessionid); if (rv != SA_OK) return rv; switch (cmd){ case eHandlerCreate: break; //already done case eHandlerDestroy: rv = exechandlerdestroy ( handlerid ); break; case eHandlerInfo: rv = exechandlerinfo ( handlerid ); break; case eHandlerGetNext: rv = exechandlergetnext ( handlerid ); break; case eHandlerFind: rv = exechandlerfind ( resid ); break; case eHandlerRetry: rv = exechandlerretry ( handlerid ); break; case eHandlerList: rv = exechandlerlist ( ); break; case eUndefined: break; //already done } if (copt.debug) { DBG("Internal processing returns %s", oh_lookup_error(rv)); DBG("Calling saHpiSessionClose for session %u",sessionid); } rv = saHpiSessionClose(sessionid); if (copt.debug) { DBG("saHpiSessionClose returns %s", oh_lookup_error(rv)); } return 0; } /********************************************/ /* exechandlercreate */ /********************************************/ static SaErrorT exechandlercreate (int argc, char **argv, int i) { SaErrorT rv = SA_OK; oHpiHandlerIdT handlerid = 0; GHashTable * createparams = g_hash_table_new_full ( g_str_hash, g_str_equal, g_free, g_free); SaHpiBoolT pluginnamegiven = SAHPI_FALSE; if (copt.debug) DBG ("createhandler started\n"); while (i (C) Copyright Pigeon Point Systems. 2011 This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This file is licensed under a BSD style license. See the Copying file included with the OpenHPI distribution for full licensing terms. Author(s): Anton Pak <anton.pak@pigeonpoint.com> openhpi-3.6.1/clients/hpixml/schema.h0000644000175100017510000000132612575647264016552 0ustar mohanmohan/* -*- c++ -*- * * Copyright (C) 2011, Pigeon Point Systems * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #ifndef SCHEMA_H_EC5AF80F_A79B_49D7_8371_F71504C426A6 #define SCHEMA_H_EC5AF80F_A79B_49D7_8371_F71504C426A6 extern "C" { extern char schema_begin; extern char schema_end; }; #endif /* SCHEMA_H_EC5AF80F_A79B_49D7_8371_F71504C426A6 */ openhpi-3.6.1/clients/hpixml/hpi_xml_writer.h0000644000175100017510000004104012575647264020343 0ustar mohanmohan/* -*- c++ -*- * * Copyright (C) 2011, Pigeon Point Systems * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #ifndef HPI_XML_WRITER_H_EC5AF80F_A79B_49D7_8371_F71504C426A6 #define HPI_XML_WRITER_H_EC5AF80F_A79B_49D7_8371_F71504C426A6 #include #include "xml_writer.h" /*************************************************** * class cHpiXmlWriter ***************************************************/ class cHpiXmlWriter : private cXmlWriter { public: explicit cHpiXmlWriter( int indent_step, bool use_names ); void Begin( void ); void End( void ); void VersionNode( const SaHpiVersionT& ver ); void BeginDomainNode( const SaHpiDomainInfoT& di ); void EndDomainNode(); void BeginDrtNode( const SaHpiDomainInfoT& di ); void EndDrtNode(); void DrtEntryNode( const SaHpiDrtEntryT& drte ); void BeginRptNode( const SaHpiDomainInfoT& di ); void EndRptNode(); void BeginResourceNode( const SaHpiRptEntryT& rpte, SaHpiUint32T rdr_update_count ); void EndResourceNode(); void BeginInstrumentNode( const SaHpiRdrT& rdr ); void EndInstrumentNode(); void BeginEventLogNode( SaHpiResourceIdT rid, const SaHpiEventLogInfoT& info, const SaHpiEventLogCapabilitiesT& caps ); void EndEventLogNode( SaHpiResourceIdT rid ); void LogEntryNode( const SaHpiEventLogEntryT& entry, const SaHpiRdrT& rdr, const SaHpiRptEntryT& rpte ); void BeginDatNode( const SaHpiDomainInfoT& di ); void EndDatNode(); void AlarmNode( const SaHpiAlarmT& a ); private: /**************************** * Basic Types ***************************/ void NodeSaHpiUint8T( const char * name, const SaHpiUint8T& x ); void NodeSaHpiUint16T( const char * name, const SaHpiUint16T& x ); void NodeSaHpiUint32T( const char * name, const SaHpiUint32T& x ); void NodeSaHpiUint64T( const char * name, const SaHpiUint64T& x ); void NodeSaHpiInt8T( const char * name, const SaHpiInt8T& x ); void NodeSaHpiInt16T( const char * name, const SaHpiInt16T& x ); void NodeSaHpiInt32T( const char * name, const SaHpiInt32T& x ); void NodeSaHpiInt64T( const char * name, const SaHpiInt64T& x ); void NodeSaHpiFloat64T( const char * name, const SaHpiFloat64T& x ); /**************************** * Typedefs ***************************/ void NodeSaHpiBoolT( const char * name, const SaHpiBoolT& x ); void NodeSaHpiManufacturerIdT( const char * name, const SaHpiManufacturerIdT& x ); void NodeSaHpiVersionT( const char * name, const SaHpiVersionT& x ); void NodeSaHpiDomainIdT( const char * name, const SaHpiDomainIdT& x ); void NodeSaHpiSessionIdT( const char * name, const SaHpiSessionIdT& x ); void NodeSaHpiResourceIdT( const char * name, const SaHpiResourceIdT& x ); void NodeSaHpiEntryIdT( const char * name, const SaHpiEntryIdT& x ); void NodeSaHpiTimeT( const char * name, const SaHpiTimeT& x ); void NodeSaHpiTimeoutT( const char * name, const SaHpiTimeoutT& x ); void NodeSaHpiInstrumentIdT( const char * name, const SaHpiInstrumentIdT& x ); void NodeSaHpiEntityLocationT( const char * name, const SaHpiEntityLocationT& x ); void NodeSaHpiEventStateT( const char * name, const SaHpiEventStateT& x ); void NodeSaHpiSensorNumT( const char * name, const SaHpiSensorNumT& x ); void NodeSaHpiSensorRangeFlagsT( const char * name, const SaHpiSensorRangeFlagsT& x ); void NodeSaHpiSensorThdMaskT( const char * name, const SaHpiSensorThdMaskT& x ); void NodeSaHpiCtrlNumT( const char * name, const SaHpiCtrlNumT& x ); void NodeSaHpiCtrlStateDiscreteT( const char * name, const SaHpiCtrlStateDiscreteT& x ); void NodeSaHpiCtrlStateAnalogT( const char * name, const SaHpiCtrlStateAnalogT& x ); void NodeSaHpiTxtLineNumT( const char * name, const SaHpiTxtLineNumT& x ); void NodeSaHpiIdrIdT( const char * name, const SaHpiIdrIdT& x ); void NodeSaHpiWatchdogNumT( const char * name, const SaHpiWatchdogNumT& x ); void NodeSaHpiWatchdogExpFlagsT( const char * name, const SaHpiWatchdogExpFlagsT& x ); void NodeSaHpiDimiNumT( const char * name, const SaHpiDimiNumT& x ); void NodeSaHpiDimiTestCapabilityT( const char * name, const SaHpiDimiTestCapabilityT& x ); void NodeSaHpiDimiTestNumT( const char * name, const SaHpiDimiTestNumT& x ); void NodeSaHpiDimiTestPercentCompletedT( const char * name, const SaHpiDimiTestPercentCompletedT& x ); void NodeSaHpiFumiNumT( const char * name, const SaHpiFumiNumT& x ); void NodeSaHpiBankNumT( const char * name, const SaHpiBankNumT& x ); void NodeSaHpiFumiLogicalBankStateFlagsT( const char * name, const SaHpiFumiLogicalBankStateFlagsT& x ); void NodeSaHpiFumiProtocolT( const char * name, const SaHpiFumiProtocolT& x ); void NodeSaHpiFumiCapabilityT( const char * name, const SaHpiFumiCapabilityT& x ); void NodeSaHpiSensorOptionalDataT( const char * name, const SaHpiSensorOptionalDataT& x ); void NodeSaHpiSensorEnableOptDataT( const char * name, const SaHpiSensorEnableOptDataT& x ); void NodeSaHpiEvtQueueStatusT( const char * name, const SaHpiEvtQueueStatusT& x ); void NodeSaHpiAnnunciatorNumT( const char * name, const SaHpiAnnunciatorNumT& x ); void NodeSaHpiLoadNumberT( const char * name, const SaHpiLoadNumberT& x ); void NodeSaHpiCapabilitiesT( const char * name, const SaHpiCapabilitiesT& x ); void NodeSaHpiHsCapabilitiesT( const char * name, const SaHpiHsCapabilitiesT& x ); void NodeSaHpiDomainCapabilitiesT( const char * name, const SaHpiDomainCapabilitiesT& x ); void NodeSaHpiAlarmIdT( const char * name, const SaHpiAlarmIdT& x ); void NodeSaHpiEventLogCapabilitiesT( const char * name, const SaHpiEventLogCapabilitiesT& x ); void NodeSaHpiEventLogEntryIdT( const char * name, const SaHpiEventLogEntryIdT& x ); /**************************** * Enums ***************************/ void NodeSaHpiLanguageT( const char * name, const SaHpiLanguageT& x ); void NodeSaHpiTextTypeT( const char * name, const SaHpiTextTypeT& x ); void NodeSaHpiEntityTypeT( const char * name, const SaHpiEntityTypeT& x ); void NodeSaHpiSensorTypeT( const char * name, const SaHpiSensorTypeT& x ); void NodeSaHpiSensorReadingTypeT( const char * name, const SaHpiSensorReadingTypeT& x ); void NodeSaHpiSensorEventMaskActionT( const char * name, const SaHpiSensorEventMaskActionT& x ); void NodeSaHpiSensorUnitsT( const char * name, const SaHpiSensorUnitsT& x ); void NodeSaHpiSensorModUnitUseT( const char * name, const SaHpiSensorModUnitUseT& x ); void NodeSaHpiSensorEventCtrlT( const char * name, const SaHpiSensorEventCtrlT& x ); void NodeSaHpiCtrlTypeT( const char * name, const SaHpiCtrlTypeT& x ); void NodeSaHpiCtrlStateDigitalT( const char * name, const SaHpiCtrlStateDigitalT& x ); void NodeSaHpiCtrlModeT( const char * name, const SaHpiCtrlModeT& x ); void NodeSaHpiCtrlOutputTypeT( const char * name, const SaHpiCtrlOutputTypeT& x ); void NodeSaHpiIdrAreaTypeT( const char * name, const SaHpiIdrAreaTypeT& x ); void NodeSaHpiIdrFieldTypeT( const char * name, const SaHpiIdrFieldTypeT& x ); void NodeSaHpiWatchdogActionT( const char * name, const SaHpiWatchdogActionT& x ); void NodeSaHpiWatchdogActionEventT( const char * name, const SaHpiWatchdogActionEventT& x ); void NodeSaHpiWatchdogPretimerInterruptT( const char * name, const SaHpiWatchdogPretimerInterruptT& x ); void NodeSaHpiWatchdogTimerUseT( const char * name, const SaHpiWatchdogTimerUseT& x ); void NodeSaHpiDimiTestServiceImpactT( const char * name, const SaHpiDimiTestServiceImpactT& x ); void NodeSaHpiDimiTestRunStatusT( const char * name, const SaHpiDimiTestRunStatusT& x ); void NodeSaHpiDimiTestErrCodeT( const char * name, const SaHpiDimiTestErrCodeT& x ); void NodeSaHpiDimiTestParamTypeT( const char * name, const SaHpiDimiTestParamTypeT& x ); void NodeSaHpiDimiReadyT( const char * name, const SaHpiDimiReadyT& x ); void NodeSaHpiFumiSpecInfoTypeT( const char * name, const SaHpiFumiSpecInfoTypeT& x ); void NodeSaHpiFumiSafDefinedSpecIdT( const char * name, const SaHpiFumiSafDefinedSpecIdT& x ); void NodeSaHpiFumiServiceImpactT( const char * name, const SaHpiFumiServiceImpactT& x ); void NodeSaHpiFumiSourceStatusT( const char * name, const SaHpiFumiSourceStatusT& x ); void NodeSaHpiFumiBankStateT( const char * name, const SaHpiFumiBankStateT& x ); void NodeSaHpiFumiUpgradeStatusT( const char * name, const SaHpiFumiUpgradeStatusT& x ); void NodeSaHpiHsIndicatorStateT( const char * name, const SaHpiHsIndicatorStateT& x ); void NodeSaHpiHsActionT( const char * name, const SaHpiHsActionT& x ); void NodeSaHpiHsStateT( const char * name, const SaHpiHsStateT& x ); void NodeSaHpiHsCauseOfStateChangeT( const char * name, const SaHpiHsCauseOfStateChangeT& x ); void NodeSaHpiSeverityT( const char * name, const SaHpiSeverityT& x ); void NodeSaHpiResourceEventTypeT( const char * name, const SaHpiResourceEventTypeT& x ); void NodeSaHpiDomainEventTypeT( const char * name, const SaHpiDomainEventTypeT& x ); void NodeSaHpiSwEventTypeT( const char * name, const SaHpiSwEventTypeT& x ); void NodeSaHpiEventTypeT( const char * name, const SaHpiEventTypeT& x ); void NodeSaHpiStatusCondTypeT( const char * name, const SaHpiStatusCondTypeT& x ); void NodeSaHpiAnnunciatorModeT( const char * name, const SaHpiAnnunciatorModeT& x ); void NodeSaHpiAnnunciatorTypeT( const char * name, const SaHpiAnnunciatorTypeT& x ); void NodeSaHpiRdrTypeT( const char * name, const SaHpiRdrTypeT& x ); void NodeSaHpiParmActionT( const char * name, const SaHpiParmActionT& x ); void NodeSaHpiResetActionT( const char * name, const SaHpiResetActionT& x ); void NodeSaHpiPowerStateT( const char * name, const SaHpiPowerStateT& x ); void NodeSaHpiEventLogOverflowActionT( const char * name, const SaHpiEventLogOverflowActionT& x ); /**************************** * Enum-Like Types ***************************/ void NodeSaErrorT( const char * name, const SaErrorT& x ); void NodeSaHpiEventCategoryT( const char * name, const SaHpiEventCategoryT& x ); /**************************** * Complex Types ***************************/ void NodeSaHpiTextBufferT( const char * name, const SaHpiTextBufferT& x ); void NodeSaHpiEntityPathT( const char * name, const SaHpiEntityPathT& x ); void NodeSaHpiNameT( const char * name, const SaHpiNameT& x ); void NodeSaHpiConditionT( const char * name, const SaHpiConditionT& x ); void NodeSaHpiGuidT( const char * name, const SaHpiGuidT& x ); void NodeSaHpiRptEntryT( const char * name, const SaHpiRptEntryT& x ); void NodeSaHpiCtrlStateStreamT( const char * name, const SaHpiCtrlStateStreamT& x ); void NodeSaHpiCtrlStateTextT( const char * name, const SaHpiCtrlStateTextT& x ); void NodeSaHpiCtrlStateOemT( const char * name, const SaHpiCtrlStateOemT& x ); void NodeSaHpiCtrlRecDigitalT( const char * name, const SaHpiCtrlRecDigitalT& x ); void NodeSaHpiCtrlRecDiscreteT( const char * name, const SaHpiCtrlRecDiscreteT& x ); void NodeSaHpiCtrlRecAnalogT( const char * name, const SaHpiCtrlRecAnalogT& x ); void NodeSaHpiCtrlRecStreamT( const char * name, const SaHpiCtrlRecStreamT& x ); void NodeSaHpiCtrlRecTextT( const char * name, const SaHpiCtrlRecTextT& x ); void NodeSaHpiCtrlRecOemT( const char * name, const SaHpiCtrlRecOemT& x ); void NodeSaHpiCtrlRecT( const char * name, const SaHpiCtrlRecT& x ); void NodeSaHpiSensorReadingT( const char * name, const SaHpiSensorReadingT& x ); void NodeSaHpiSensorRangeT( const char * name, const SaHpiSensorRangeT& x ); void NodeSaHpiSensorDataFormatT( const char * name, const SaHpiSensorDataFormatT& x ); void NodeSaHpiSensorThdDefnT( const char * name, const SaHpiSensorThdDefnT& x ); void NodeSaHpiSensorRecT( const char * name, const SaHpiSensorRecT& x ); void NodeSaHpiInventoryRecT( const char * name, const SaHpiInventoryRecT& x ); void NodeSaHpiWatchdogRecT( const char * name, const SaHpiWatchdogRecT& x ); void NodeSaHpiAnnunciatorRecT( const char * name, const SaHpiAnnunciatorRecT& x ); void NodeSaHpiDimiRecT( const char * name, const SaHpiDimiRecT& x ); void NodeSaHpiFumiRecT( const char * name, const SaHpiFumiRecT& x ); void NodeSaHpiRdrT( const char * name, const SaHpiRdrT& x ); void NodeSaHpiResourceEventT( const char * name, const SaHpiResourceEventT& x ); void NodeSaHpiDomainEventT( const char * name, const SaHpiDomainEventT& x ); void NodeSaHpiSensorEventT( const char * name, const SaHpiSensorEventT& x ); void NodeSaHpiSensorEnableChangeEventT( const char * name, const SaHpiSensorEnableChangeEventT& x ); void NodeSaHpiHotSwapEventT( const char * name, const SaHpiHotSwapEventT& x ); void NodeSaHpiWatchdogEventT( const char * name, const SaHpiWatchdogEventT& x ); void NodeSaHpiHpiSwEventT( const char * name, const SaHpiHpiSwEventT& x ); void NodeSaHpiOemEventT( const char * name, const SaHpiOemEventT& x ); void NodeSaHpiUserEventT( const char * name, const SaHpiUserEventT& x ); void NodeSaHpiDimiEventT( const char * name, const SaHpiDimiEventT& x ); void NodeSaHpiDimiUpdateEventT( const char * name, const SaHpiDimiUpdateEventT& x ); void NodeSaHpiFumiEventT( const char * name, const SaHpiFumiEventT& x ); void NodeSaHpiEventT( const char * name, const SaHpiEventT& x ); }; #endif /* HPI_XML_WRITER_H_EC5AF80F_A79B_49D7_8371_F71504C426A6 */ openhpi-3.6.1/clients/hpixml/flags.h0000644000175100017510000000146612575647264016413 0ustar mohanmohan/* -*- c++ -*- * * Copyright (C) 2011, Pigeon Point Systems * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #ifndef FLAGS_H_EC5AF80F_A79B_49D7_8371_F71504C426A6 #define FLAGS_H_EC5AF80F_A79B_49D7_8371_F71504C426A6 #include #include namespace Flags { const size_t Num = 32; typedef uint32_t Type; typedef const char * Names[Num]; }; /* namespace Flags */ #endif /* FLAGS_H_EC5AF80F_A79B_49D7_8371_F71504C426A6 */ openhpi-3.6.1/clients/hpixml/main.cpp0000644000175100017510000000560212575647264016572 0ustar mohanmohan/* -*- c++ -*- * * Copyright (c) 2011 by Pigeon Point Systems. * (C) Copyright Ulrich Kleber 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Anton Pak * Ulrich Kleber * * Changes: * 09/02/2011 ulikleber Use glib for option parsing and common * options for all clients * */ #define OH_SVN_REV "$Revision: 7281 $" #include #include #include #include #include "hpi.h" #include "hpi_xml_writer.h" #include "schema.h" #include static gboolean f_indent = FALSE; static gboolean f_xsd = FALSE; static gboolean f_use_names = FALSE; static oHpiCommonOptionsT copt; static GOptionEntry my_options[] = { { "indent", 'i', 0, G_OPTION_ARG_NONE, &f_indent, "Use indentation", NULL }, { "text", 't', 0, G_OPTION_ARG_NONE, &f_use_names, "Use enum and flag text names instead of raw values", NULL }, { "xsd", 's', 0, G_OPTION_ARG_NONE, &f_xsd, "Show XML schema", NULL }, { NULL } }; /*************************************************** * Main ***************************************************/ int main( int argc, char * argv[] ) { int indent_step = 0; GOptionContext *context; context = g_option_context_new ("- Display system view in XML"); /* Parsing options */ static char usetext[]="- Display system view in XML.\n " OH_SVN_REV; OHC_PREPARE_REVISION(usetext); context = g_option_context_new (usetext); g_option_context_add_main_entries (context, my_options, NULL); if (!ohc_option_parse(&argc, argv, context, &copt, OHC_ALL_OPTIONS - OHC_ENTITY_PATH_OPTION //TODO: Feature 880127? - OHC_VERBOSE_OPTION // no verbose mode implemented - OHC_DEBUG_OPTION )) { // no debug option implemented g_option_context_free (context); return 1; } g_option_context_free (context); if (f_indent) indent_step = 1; if ( f_xsd ) { for ( char * p = &schema_begin; p < &schema_end; ++p ) { fwrite( p, 1, 1, stdout ); } return 0; } bool rc; cHpi hpi( copt ); rc = hpi.Open(); if ( !rc ) { return 1; } cHpiXmlWriter writer( indent_step, f_use_names ); rc = hpi.Dump( writer ); if ( !rc ) { CRIT( "Failed to produce XML" ); return 1; } return 0; } openhpi-3.6.1/clients/hpixml/Makefile.am0000644000175100017510000000125012575647264017171 0ustar mohanmohanMAINTAINERCLEANFILES = Makefile.in MOSTLYCLEANFILES = @TEST_CLEAN@ AM_CPPFLAGS = -DG_LOG_DOMAIN=\"hpixml\" AM_CCASFLAGS = -DSCHEMA=\"$(srcdir)/schema.xsd\" AM_CPPFLAGS += @OPENHPI_INCLUDES@ EXTRA_DIST = Makefile.mingw32 schema.xsd version.rc bin_PROGRAMS = hpixml hpixml_SOURCES = \ flags.h \ hpi.cpp \ hpi.h \ hpi_xml_writer.cpp \ hpi_xml_writer.h \ main.cpp \ schema.h \ schema.S \ xml_writer.cpp \ xml_writer.h \ $(top_srcdir)/clients/clients.c \ $(top_srcdir)/clients/oh_clients.h hpixml_LDADD = $(top_builddir)/baselib/libopenhpi.la $(top_builddir)/utils/libopenhpiutils.la clean-local: rm -f *~ *.o openhpi-3.6.1/clients/hpixml/Makefile.mingw320000644000175100017510000000134712575647264020071 0ustar mohanmohaninclude ../../Makefile.mingw32.def TARGET := hpixml.exe SRC := \ ../clients.c \ hpi.cpp \ hpi_xml_writer.cpp \ main.cpp \ schema.S \ version.rc \ xml_writer.cpp OBJ := $(patsubst %.rc, %.o, $(patsubst %.S, %.o,$(patsubst %.c, %.o, $(patsubst %.cpp, %.o, ${SRC})))) DEFS := -DG_LOG_DOMAIN=\"hpixml\" -DSCHEMA=\"schema.xsd\" INCLUDES := ${GLIB_INCLUDES} INCLUDES += -I ../../mingw32 -I ../../include -I ../../utils -I ../ LIBS := ${GLIB_LIBS} LIBS += -L ../../utils -lopenhpiutils LIBS += -L ../../baselib -lopenhpi CPPFLAGS += ${DEFS} ${INCLUDES} .PHONY: all clean .SUFFIXES: .rc all : ${TARGET} ${TARGET} : ${OBJ} ${CXX} -o $@ $^ ${LIBS} .rc.o: ${RC} ${RCFLAGS} $< $@ clean: rm -f ${OBJ} ${TARGET} openhpi-3.6.1/clients/hpixml/xml_writer.h0000644000175100017510000000424512575647264017511 0ustar mohanmohan/* -*- c++ -*- * * Copyright (C) 2011, Pigeon Point Systems * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #ifndef XML_WRITER_H_EC5AF80F_A79B_49D7_8371_F71504C426A6 #define XML_WRITER_H_EC5AF80F_A79B_49D7_8371_F71504C426A6 #include #include #include #include "flags.h" /*************************************************** * class cXmlWriter ***************************************************/ class cXmlWriter { public: explicit cXmlWriter( const char * ns, const char * schema_location, int indent_step, bool use_names ); void Begin( const char * name ); void End( const char * name ); void Node( const char * name, const char * format, ... ); void NodeHex( const char * name, const uint8_t * data, size_t len ); template void NodeEnum( const char * name, T value, char * (*get_value_name)( T ) ) { const char * value_name = 0; if ( m_use_names && get_value_name ) { value_name = get_value_name( value ); } if ( value_name ) { Node( name, "%s", value_name ); } else { Node( name, "%d", (int)value ); } } void NodeFlags( const char * name, Flags::Type flags, const Flags::Names * flag_names ); void BeginNode( const char * name ); void EndNode( const char * name ); private: cXmlWriter( const cXmlWriter& ); cXmlWriter& operator =( const cXmlWriter& ); void PrintIndent( void ); private: std::string m_ns; std::string m_schema_location; int m_indent; int m_indent_step; bool m_use_names; }; #endif /* XML_WRITER_H_EC5AF80F_A79B_49D7_8371_F71504C426A6 */ openhpi-3.6.1/clients/hpixml/xml_writer.cpp0000644000175100017510000000627612575647264020052 0ustar mohanmohan/* -*- c++ -*- * * Copyright (c) 2011 by Pigeon Point Systems. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Anton Pak * */ #include #include #include "xml_writer.h" /*************************************************** * class cXmlWriter ***************************************************/ cXmlWriter::cXmlWriter( const char * ns, const char * schema_location, int indent_step, bool use_names ) : m_ns( ns ), m_schema_location( schema_location ), m_indent( 0 ), m_indent_step( indent_step ), m_use_names( use_names ) { // empty } void cXmlWriter::Begin( const char * name ) { printf( "\n" ); PrintIndent(); printf( "<%s" " xmlns=\"%s\"" " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"" " xsi:schemaLocation=\"%s\"" ">\n", name, m_ns.c_str(), m_schema_location.c_str() ); m_indent += m_indent_step; } void cXmlWriter::End( const char * name ) { EndNode( name ); } void cXmlWriter::Node( const char * name, const char * format, ... ) { PrintIndent(); printf( "<%s>", name ); va_list ap; va_start( ap, format ); vprintf( format, ap ); va_end( ap ); printf( "\n", name ); } void cXmlWriter::NodeHex( const char * name, const uint8_t * data, size_t len ) { PrintIndent(); printf( "<%s>", name ); if ( data ) { for ( size_t i = 0; i < len; ++i ) { printf( "%02X", data[i] ); } } printf( "\n", name ); } void cXmlWriter::NodeFlags( const char * name, Flags::Type flags, const Flags::Names * flag_names ) { if ( ( !m_use_names ) || ( !flag_names ) ) { Node( name, "%lu", (unsigned long)flags ); return; } PrintIndent(); printf( "<%s>", name ); uint8_t i; bool first = true; for ( i = 0; i < Flags::Num; ++i ) { Flags::Type flag = 1 << i; if ( flags & flag ) { if ( !first ) { printf( " " ); } const char * flag_name = (*flag_names)[i]; if ( flag_name ) { printf( "%s", flag_name ); } else { printf( "%lu", (unsigned long)flag ); } first = false; } } printf( "\n", name ); } void cXmlWriter::BeginNode( const char * name ) { PrintIndent(); printf( "<%s>\n", name ); m_indent += m_indent_step; } void cXmlWriter::EndNode( const char * name ) { m_indent -= m_indent_step; PrintIndent(); printf( "\n", name ); } void cXmlWriter::PrintIndent( void ) { for ( int i = 0; i < m_indent; ++i ) { putc( ' ', stdout ); } } openhpi-3.6.1/clients/hpixml/hpi.cpp0000644000175100017510000003013112575647264016421 0ustar mohanmohan/* -*- c++ -*- * * Copyright (c) 2011 by Pigeon Point Systems. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Anton Pak * */ #include #include #include #include #include "hpi.h" #include "hpi_xml_writer.h" /*************************************************** * Data Types ***************************************************/ struct LogEntry { SaHpiEventLogEntryT entry; SaHpiRdrT rdr; SaHpiRptEntryT rpte; }; struct Log { SaHpiEventLogInfoT info; SaHpiEventLogCapabilitiesT caps; std::list entries; }; struct Resource { SaHpiRptEntryT rpte; SaHpiUint32T rdr_update_count; std::list instruments; Log log; }; /*************************************************** * Helper Functions ***************************************************/ static bool GetDomainInfo( SaHpiSessionIdT sid, SaHpiDomainInfoT& di ) { SaErrorT rv; rv = saHpiDomainInfoGet( sid, &di ); if ( rv != SA_OK ) { CRIT( "saHpiDomainInfoGet returned %s", oh_lookup_error( rv ) ); } return ( rv == SA_OK ); } static bool FetchDrt( SaHpiSessionIdT sid, SaHpiDomainInfoT& di, std::list& drt ) { SaHpiDomainInfoT di2; do { drt.clear(); bool rc; rc = GetDomainInfo( sid, di ); if ( !rc ) { return false; } SaHpiEntryIdT id, next_id; SaHpiDrtEntryT drte; id = SAHPI_FIRST_ENTRY; while ( id != SAHPI_LAST_ENTRY ) { SaErrorT rv; rv = saHpiDrtEntryGet( sid, id, &next_id, &drte ); if ( rv == SA_ERR_HPI_NOT_PRESENT ) { break; } if ( rv != SA_OK ) { drt.clear(); CRIT( "saHpiDrtEntryGet returned %s", oh_lookup_error( rv ) ); return false; } drt.push_back( drte ); id = next_id; } rc = GetDomainInfo( sid, di2 ); if ( !rc ) { drt.clear(); return false; } } while ( di.DrtUpdateCount != di2.DrtUpdateCount ); return true; } static bool FetchLog( SaHpiSessionIdT sid, SaHpiResourceIdT rid, Log& log ) { SaErrorT rv; log.entries.clear(); rv = saHpiEventLogInfoGet( sid, rid, &log.info ); if ( rv != SA_OK ) { CRIT( "saHpiEventLogInfoGet returned %s", oh_lookup_error( rv ) ); return false; } rv = saHpiEventLogCapabilitiesGet( sid, rid, &log.caps ); if ( rv != SA_OK ) { CRIT( "saHpiEventLogCapabilitiesGet returned %s", oh_lookup_error( rv ) ); return false; } SaHpiEventLogEntryIdT prev_id, id, next_id; LogEntry le; id = SAHPI_OLDEST_ENTRY; while ( id != SAHPI_NO_MORE_ENTRIES ) { rv = saHpiEventLogEntryGet( sid, rid, id, &prev_id, &next_id, &le.entry, &le.rdr, &le.rpte ); if ( rv == SA_ERR_HPI_NOT_PRESENT ) { break; } if ( rv != SA_OK ) { log.entries.clear(); CRIT( "saHpiRptEntryGet returned %s", oh_lookup_error( rv ) ); return false; } log.entries.push_back( le ); id = next_id; } return true; } static SaHpiUint32T GetRdrUpdateCounter( SaHpiSessionIdT sid, SaHpiResourceIdT rid ) { SaHpiUint32T cnt; SaErrorT rv = saHpiRdrUpdateCountGet( sid, rid, &cnt ); if ( rv != SA_OK ) { CRIT( "saHpiRdrUpdateCountGet %s", oh_lookup_error( rv ) ); return 0; } return cnt; } static bool FetchInstruments( SaHpiSessionIdT sid, Resource& resource ) { SaErrorT rv; SaHpiResourceIdT rid = resource.rpte.ResourceId; SaHpiUint32T& cnt = resource.rdr_update_count; SaHpiUint32T cnt2; do { resource.instruments.clear(); cnt = GetRdrUpdateCounter( sid, rid ); SaHpiEntryIdT id, next_id; SaHpiRdrT rdr; id = SAHPI_FIRST_ENTRY; while ( id != SAHPI_LAST_ENTRY ) { rv = saHpiRdrGet( sid, rid, id, &next_id, &rdr ); if ( rv == SA_ERR_HPI_NOT_PRESENT ) { break; } if ( rv != SA_OK ) { resource.instruments.clear(); CRIT( "saHpiRdrGet returned %s", oh_lookup_error( rv ) ); return false; } resource.instruments.push_back( rdr ); id = next_id; } cnt2 = GetRdrUpdateCounter( sid, rid ); } while ( cnt != cnt2 ); return true; } static bool FetchResources( SaHpiSessionIdT sid, SaHpiDomainInfoT& di, std::list& rpt ) { SaHpiDomainInfoT di2; do { rpt.clear(); bool rc; rc = GetDomainInfo( sid, di ); if ( !rc ) { return false; } SaHpiEntryIdT id, next_id; Resource resource; id = SAHPI_FIRST_ENTRY; while ( id != SAHPI_LAST_ENTRY ) { SaErrorT rv; rv = saHpiRptEntryGet( sid, id, &next_id, &resource.rpte ); if ( rv == SA_ERR_HPI_NOT_PRESENT ) { break; } if ( rv != SA_OK ) { rpt.clear(); CRIT( "saHpiRptEntryGet returned %s", oh_lookup_error( rv ) ); return false; } resource.instruments.clear(); resource.log.entries.clear(); if ( resource.rpte.ResourceFailed == SAHPI_FALSE ) { if ( resource.rpte.ResourceCapabilities & SAHPI_CAPABILITY_RDR ) { rc = FetchInstruments( sid, resource ); if ( !rc ) { break; } } if ( resource.rpte.ResourceCapabilities & SAHPI_CAPABILITY_EVENT_LOG ) { rc = FetchLog( sid, resource.rpte.ResourceId, resource.log ); if ( !rc ) { break; } } } rpt.push_back( resource ); id = next_id; } rc = GetDomainInfo( sid, di2 ); if ( !rc ) { rpt.clear(); return false; } } while ( di.RptUpdateCount != di2.RptUpdateCount ); return true; } static bool FetchDat( SaHpiSessionIdT sid, SaHpiDomainInfoT& di, std::list& dat ) { SaHpiDomainInfoT di2; do { dat.clear(); bool rc; rc = GetDomainInfo( sid, di ); if ( !rc ) { return false; } SaHpiAlarmT a; a.AlarmId = SAHPI_FIRST_ENTRY; while ( true ) { SaErrorT rv; rv = saHpiAlarmGetNext( sid, SAHPI_ALL_SEVERITIES, SAHPI_FALSE, &a ); if ( rv == SA_ERR_HPI_NOT_PRESENT ) { break; } if ( rv != SA_OK ) { dat.clear(); CRIT( "saHpiDatEntryGet returned %s", oh_lookup_error( rv ) ); return false; } dat.push_back( a ); } rc = GetDomainInfo( sid, di2 ); if ( !rc ) { dat.clear(); return false; } } while ( di.DatUpdateCount != di2.DatUpdateCount ); return true; } static void DumpDrt( cHpiXmlWriter& writer, SaHpiDomainInfoT& di, std::list& drt ) { writer.BeginDrtNode( di ); while ( !drt.empty() ) { writer.DrtEntryNode( drt.front() ); drt.pop_front(); } writer.EndDrtNode(); } static void DumpLog( cHpiXmlWriter& writer, SaHpiResourceIdT rid, Log& log ) { writer.BeginEventLogNode( rid, log.info, log.caps ); while ( !log.entries.empty() ) { const LogEntry& le( log.entries.front() ); writer.LogEntryNode( le.entry, le.rdr, le.rpte ); log.entries.pop_front(); } writer.EndEventLogNode( rid ); } static void DumpInstruments( cHpiXmlWriter& writer, std::list& instruments ) { while ( !instruments.empty() ) { writer.BeginInstrumentNode( instruments.front() ); writer.EndInstrumentNode(); instruments.pop_front(); } } static void DumpResources( cHpiXmlWriter& writer, SaHpiDomainInfoT& di, std::list& rpt ) { writer.BeginRptNode( di ); while ( !rpt.empty() ) { Resource& resource = rpt.front(); writer.BeginResourceNode( resource.rpte, resource.rdr_update_count ); if ( resource.rpte.ResourceCapabilities & SAHPI_CAPABILITY_EVENT_LOG ) { DumpLog( writer, resource.rpte.ResourceId, resource.log ); } DumpInstruments( writer, resource.instruments ); writer.EndResourceNode(); rpt.pop_front(); } writer.EndRptNode(); } static void DumpDat( cHpiXmlWriter& writer, SaHpiDomainInfoT& di, std::list dat ) { writer.BeginDatNode( di ); while ( !dat.empty() ) { writer.AlarmNode( dat.front() ); dat.pop_front(); } writer.EndDatNode(); } /*************************************************** * class cHpi ***************************************************/ cHpi::cHpi( oHpiCommonOptionsT copt ) : m_initialized( false ), m_opened( false ), m_copt( copt ), m_sid( 0 ) { // empty } cHpi::~cHpi() { Close(); } bool cHpi::Open() { if ( m_opened ) { return true; } SaErrorT rv; if ( !m_initialized ) { rv = saHpiInitialize( SAHPI_INTERFACE_VERSION, 0, 0, 0, 0 ); if ( rv != SA_OK ) { CRIT( "saHpiInitialize returned %s", oh_lookup_error( rv ) ); return false; } m_initialized = true; } rv = ohc_session_open_by_option ( &m_copt, &m_sid); if ( rv != SA_OK ) { CRIT( "saHpiSessionOpen returned %s", oh_lookup_error( rv ) ); return false; } m_opened = true; rv = saHpiDiscover( m_sid ); if ( rv != SA_OK ) { CRIT( "saHpiDiscover returned %s", oh_lookup_error( rv ) ); return false; } return true; } void cHpi::Close() { if ( m_opened ) { saHpiSessionClose( m_sid ); m_sid = 0; m_opened = false; } if ( m_initialized ) { saHpiFinalize(); m_initialized = false; } } bool cHpi::Dump( cHpiXmlWriter& writer ) { bool rc; writer.Begin(); writer.VersionNode( saHpiVersionGet() ); SaHpiDomainInfoT di; rc = GetDomainInfo( m_sid, di ); if ( !rc ) { return false; } writer.BeginDomainNode( di ); SaHpiDomainInfoT drt_di; std::list drt; rc = FetchDrt( m_sid, drt_di, drt ); if ( !rc ) { return false; } DumpDrt( writer, drt_di, drt ); SaHpiDomainInfoT rpt_di; std::list rpt; rc = FetchResources( m_sid, rpt_di, rpt ); if ( !rc ) { return false; } DumpResources( writer, rpt_di, rpt ); Log del; rc = FetchLog( m_sid, SAHPI_UNSPECIFIED_RESOURCE_ID, del ); if ( !rc ) { return false; } DumpLog( writer, SAHPI_UNSPECIFIED_RESOURCE_ID, del ); SaHpiDomainInfoT dat_di; std::list dat; rc = FetchDat( m_sid, dat_di, dat ); if ( !rc ) { return false; } DumpDat( writer, dat_di, dat ); writer.EndDomainNode(); writer.End(); return true; } openhpi-3.6.1/clients/hpixml/hpi_xml_writer.cpp0000644000175100017510000017507212575647264020713 0ustar mohanmohan/* -*- c++ -*- * * Copyright (c) 2011 by Pigeon Point Systems. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Anton Pak * */ #include #include #include #include "flags.h" #include "hpi_xml_writer.h" /**************************** * Flags Types ***************************/ static Flags::Names NamesSaHpiEventStateT = { /* bit 0, 0x00000001 */ "STATE_00", /* bit 1, 0x00000002 */ "STATE_01", /* bit 2, 0x00000004 */ "STATE_02", /* bit 3, 0x00000008 */ "STATE_03", /* bit 4, 0x00000010 */ "STATE_04", /* bit 5, 0x00000020 */ "STATE_05", /* bit 6, 0x00000040 */ "STATE_06", /* bit 7, 0x00000080 */ "STATE_07", /* bit 8, 0x00000100 */ "STATE_08", /* bit 9, 0x00000200 */ "STATE_09", /* bit 10, 0x00000400 */ "STATE_10", /* bit 11, 0x00000800 */ "STATE_11", /* bit 12, 0x00001000 */ "STATE_12", /* bit 13, 0x00002000 */ "STATE_13", /* bit 14, 0x00004000 */ "STATE_14", /* bit 15, 0x00008000 */ 0, /* bit 16, 0x00010000 */ 0, /* bit 17, 0x00020000 */ 0, /* bit 18, 0x00040000 */ 0, /* bit 19, 0x00080000 */ 0, /* bit 20, 0x00100000 */ 0, /* bit 21, 0x00200000 */ 0, /* bit 22, 0x00400000 */ 0, /* bit 23, 0x00800000 */ 0, /* bit 24, 0x01000000 */ 0, /* bit 25, 0x02000000 */ 0, /* bit 26, 0x04000000 */ 0, /* bit 27, 0x08000000 */ 0, /* bit 28, 0x10000000 */ 0, /* bit 29, 0x20000000 */ 0, /* bit 30, 0x40000000 */ 0, /* bit 31, 0x80000000 */ 0 }; static Flags::Names NamesSaHpiSensorRangeFlagsT = { /* bit 0, 0x00000001 */ "NOMINAL", /* bit 1, 0x00000002 */ "NORMAL_MAX", /* bit 2, 0x00000004 */ "NORMAL_MIN", /* bit 3, 0x00000008 */ "MAX", /* bit 4, 0x00000010 */ "MIN", /* bit 5, 0x00000020 */ 0, /* bit 6, 0x00000040 */ 0, /* bit 7, 0x00000080 */ 0, /* bit 8, 0x00000100 */ 0, /* bit 9, 0x00000200 */ 0, /* bit 10, 0x00000400 */ 0, /* bit 11, 0x00000800 */ 0, /* bit 12, 0x00001000 */ 0, /* bit 13, 0x00002000 */ 0, /* bit 14, 0x00004000 */ 0, /* bit 15, 0x00008000 */ 0, /* bit 16, 0x00010000 */ 0, /* bit 17, 0x00020000 */ 0, /* bit 18, 0x00040000 */ 0, /* bit 19, 0x00080000 */ 0, /* bit 20, 0x00100000 */ 0, /* bit 21, 0x00200000 */ 0, /* bit 22, 0x00400000 */ 0, /* bit 23, 0x00800000 */ 0, /* bit 24, 0x01000000 */ 0, /* bit 25, 0x02000000 */ 0, /* bit 26, 0x04000000 */ 0, /* bit 27, 0x08000000 */ 0, /* bit 28, 0x10000000 */ 0, /* bit 29, 0x20000000 */ 0, /* bit 30, 0x40000000 */ 0, /* bit 31, 0x80000000 */ 0 }; static Flags::Names NamesSaHpiSensorThdMaskT = { /* bit 0, 0x00000001 */ "LOW_MINOR", /* bit 1, 0x00000002 */ "LOW_MAJOR", /* bit 2, 0x00000004 */ "LOW_CRIT", /* bit 3, 0x00000008 */ "UP_MINOR", /* bit 4, 0x00000010 */ "UP_MAJOR", /* bit 5, 0x00000020 */ "UP_CRIT", /* bit 6, 0x00000040 */ "UP_HYSTERESIS", /* bit 7, 0x00000080 */ "LOW_HYSTERESIS", /* bit 8, 0x00000100 */ 0, /* bit 9, 0x00000200 */ 0, /* bit 10, 0x00000400 */ 0, /* bit 11, 0x00000800 */ 0, /* bit 12, 0x00001000 */ 0, /* bit 13, 0x00002000 */ 0, /* bit 14, 0x00004000 */ 0, /* bit 15, 0x00008000 */ 0, /* bit 16, 0x00010000 */ 0, /* bit 17, 0x00020000 */ 0, /* bit 18, 0x00040000 */ 0, /* bit 19, 0x00080000 */ 0, /* bit 20, 0x00100000 */ 0, /* bit 21, 0x00200000 */ 0, /* bit 22, 0x00400000 */ 0, /* bit 23, 0x00800000 */ 0, /* bit 24, 0x01000000 */ 0, /* bit 25, 0x02000000 */ 0, /* bit 26, 0x04000000 */ 0, /* bit 27, 0x08000000 */ 0, /* bit 28, 0x10000000 */ 0, /* bit 29, 0x20000000 */ 0, /* bit 30, 0x40000000 */ 0, /* bit 31, 0x80000000 */ 0 }; static Flags::Names NamesSaHpiWatchdogExpFlagsT = { /* bit 0, 0x00000001 */ 0, /* bit 1, 0x00000002 */ "BIOS_FRB2", /* bit 2, 0x00000004 */ "BIOS_POST", /* bit 3, 0x00000008 */ "OS_LOAD", /* bit 4, 0x00000010 */ "SMS_OS", /* bit 5, 0x00000020 */ "OEM", /* bit 6, 0x00000040 */ 0, /* bit 7, 0x00000080 */ 0, /* bit 8, 0x00000100 */ 0, /* bit 9, 0x00000200 */ 0, /* bit 10, 0x00000400 */ 0, /* bit 11, 0x00000800 */ 0, /* bit 12, 0x00001000 */ 0, /* bit 13, 0x00002000 */ 0, /* bit 14, 0x00004000 */ 0, /* bit 15, 0x00008000 */ 0, /* bit 16, 0x00010000 */ 0, /* bit 17, 0x00020000 */ 0, /* bit 18, 0x00040000 */ 0, /* bit 19, 0x00080000 */ 0, /* bit 20, 0x00100000 */ 0, /* bit 21, 0x00200000 */ 0, /* bit 22, 0x00400000 */ 0, /* bit 23, 0x00800000 */ 0, /* bit 24, 0x01000000 */ 0, /* bit 25, 0x02000000 */ 0, /* bit 26, 0x04000000 */ 0, /* bit 27, 0x08000000 */ 0, /* bit 28, 0x10000000 */ 0, /* bit 29, 0x20000000 */ 0, /* bit 30, 0x40000000 */ 0, /* bit 31, 0x80000000 */ 0 }; static Flags::Names NamesSaHpiDimiTestCapabilityT = { /* bit 0, 0x00000001 */ "RESULTSOUTPUT", /* bit 1, 0x00000002 */ "SERVICEMODE", /* bit 2, 0x00000004 */ "LOOPCOUNT", /* bit 3, 0x00000008 */ "LOOPTIME", /* bit 4, 0x00000010 */ "LOGGING", /* bit 5, 0x00000020 */ "TESTCANCEL", /* bit 6, 0x00000040 */ 0, /* bit 7, 0x00000080 */ 0, /* bit 8, 0x00000100 */ 0, /* bit 9, 0x00000200 */ 0, /* bit 10, 0x00000400 */ 0, /* bit 11, 0x00000800 */ 0, /* bit 12, 0x00001000 */ 0, /* bit 13, 0x00002000 */ 0, /* bit 14, 0x00004000 */ 0, /* bit 15, 0x00008000 */ 0, /* bit 16, 0x00010000 */ 0, /* bit 17, 0x00020000 */ 0, /* bit 18, 0x00040000 */ 0, /* bit 19, 0x00080000 */ 0, /* bit 20, 0x00100000 */ 0, /* bit 21, 0x00200000 */ 0, /* bit 22, 0x00400000 */ 0, /* bit 23, 0x00800000 */ 0, /* bit 24, 0x01000000 */ 0, /* bit 25, 0x02000000 */ 0, /* bit 26, 0x04000000 */ 0, /* bit 27, 0x08000000 */ 0, /* bit 28, 0x10000000 */ 0, /* bit 29, 0x20000000 */ 0, /* bit 30, 0x40000000 */ 0, /* bit 31, 0x80000000 */ 0 }; static Flags::Names NamesSaHpiFumiLogicalBankStateFlagsT = { /* bit 0, 0x00000001 */ "NO_MAIN_PERSISTENT_COPY", /* bit 1, 0x00000002 */ 0, /* bit 2, 0x00000004 */ 0, /* bit 3, 0x00000008 */ 0, /* bit 4, 0x00000010 */ 0, /* bit 5, 0x00000020 */ 0, /* bit 6, 0x00000040 */ 0, /* bit 7, 0x00000080 */ 0, /* bit 8, 0x00000100 */ 0, /* bit 9, 0x00000200 */ 0, /* bit 10, 0x00000400 */ 0, /* bit 11, 0x00000800 */ 0, /* bit 12, 0x00001000 */ 0, /* bit 13, 0x00002000 */ 0, /* bit 14, 0x00004000 */ 0, /* bit 15, 0x00008000 */ 0, /* bit 16, 0x00010000 */ 0, /* bit 17, 0x00020000 */ 0, /* bit 18, 0x00040000 */ 0, /* bit 19, 0x00080000 */ 0, /* bit 20, 0x00100000 */ 0, /* bit 21, 0x00200000 */ 0, /* bit 22, 0x00400000 */ 0, /* bit 23, 0x00800000 */ 0, /* bit 24, 0x01000000 */ 0, /* bit 25, 0x02000000 */ 0, /* bit 26, 0x04000000 */ 0, /* bit 27, 0x08000000 */ 0, /* bit 28, 0x10000000 */ 0, /* bit 29, 0x20000000 */ 0, /* bit 30, 0x40000000 */ 0, /* bit 31, 0x80000000 */ 0 }; static Flags::Names NamesSaHpiFumiProtocolT = { /* bit 0, 0x00000001 */ "TFTP", /* bit 1, 0x00000002 */ "FTP", /* bit 2, 0x00000004 */ "HTTP", /* bit 3, 0x00000008 */ "LDAP", /* bit 4, 0x00000010 */ "LOCAL", /* bit 5, 0x00000020 */ "NFS", /* bit 6, 0x00000040 */ "DBACCESS", /* bit 7, 0x00000080 */ 0, /* bit 8, 0x00000100 */ 0, /* bit 9, 0x00000200 */ 0, /* bit 10, 0x00000400 */ 0, /* bit 11, 0x00000800 */ 0, /* bit 12, 0x00001000 */ 0, /* bit 13, 0x00002000 */ 0, /* bit 14, 0x00004000 */ 0, /* bit 15, 0x00008000 */ 0, /* bit 16, 0x00010000 */ 0, /* bit 17, 0x00020000 */ 0, /* bit 18, 0x00040000 */ 0, /* bit 19, 0x00080000 */ 0, /* bit 20, 0x00100000 */ 0, /* bit 21, 0x00200000 */ 0, /* bit 22, 0x00400000 */ 0, /* bit 23, 0x00800000 */ 0, /* bit 24, 0x01000000 */ 0, /* bit 25, 0x02000000 */ 0, /* bit 26, 0x04000000 */ 0, /* bit 27, 0x08000000 */ 0, /* bit 28, 0x10000000 */ 0, /* bit 29, 0x20000000 */ 0, /* bit 30, 0x40000000 */ 0, /* bit 31, 0x80000000 */ 0 }; static Flags::Names NamesSaHpiFumiCapabilityT = { /* bit 0, 0x00000001 */ "ROLLBACK", /* bit 1, 0x00000002 */ "BANKCOPY", /* bit 2, 0x00000004 */ "BANKREORDER", /* bit 3, 0x00000008 */ "BACKUP", /* bit 4, 0x00000010 */ "TARGET_VERIFY", /* bit 5, 0x00000020 */ "TARGET_VERIFY_MAIN", /* bit 6, 0x00000040 */ "COMPONENTS", /* bit 7, 0x00000080 */ "AUTOROLLBACK", /* bit 8, 0x00000100 */ "AUTOROLLBACK_CAN_BE_DISABLED", /* bit 9, 0x00000200 */ "MAIN_NOT_PERSISTENT", /* bit 10, 0x00000400 */ 0, /* bit 11, 0x00000800 */ 0, /* bit 12, 0x00001000 */ 0, /* bit 13, 0x00002000 */ 0, /* bit 14, 0x00004000 */ 0, /* bit 15, 0x00008000 */ 0, /* bit 16, 0x00010000 */ 0, /* bit 17, 0x00020000 */ 0, /* bit 18, 0x00040000 */ 0, /* bit 19, 0x00080000 */ 0, /* bit 20, 0x00100000 */ 0, /* bit 21, 0x00200000 */ 0, /* bit 22, 0x00400000 */ 0, /* bit 23, 0x00800000 */ 0, /* bit 24, 0x01000000 */ 0, /* bit 25, 0x02000000 */ 0, /* bit 26, 0x04000000 */ 0, /* bit 27, 0x08000000 */ 0, /* bit 28, 0x10000000 */ 0, /* bit 29, 0x20000000 */ 0, /* bit 30, 0x40000000 */ 0, /* bit 31, 0x80000000 */ 0 }; static Flags::Names NamesSaHpiSensorOptionalDataT = { /* bit 0, 0x00000001 */ "TRIGGER_READING", /* bit 1, 0x00000002 */ "TRIGGER_THRESHOLD", /* bit 2, 0x00000004 */ "OEM", /* bit 3, 0x00000008 */ "PREVIOUS_STATE", /* bit 4, 0x00000010 */ "CURRENT_STATE", /* bit 5, 0x00000020 */ "SENSOR_SPECIFIC", /* bit 6, 0x00000040 */ 0, /* bit 7, 0x00000080 */ 0, /* bit 8, 0x00000100 */ 0, /* bit 9, 0x00000200 */ 0, /* bit 10, 0x00000400 */ 0, /* bit 11, 0x00000800 */ 0, /* bit 12, 0x00001000 */ 0, /* bit 13, 0x00002000 */ 0, /* bit 14, 0x00004000 */ 0, /* bit 15, 0x00008000 */ 0, /* bit 16, 0x00010000 */ 0, /* bit 17, 0x00020000 */ 0, /* bit 18, 0x00040000 */ 0, /* bit 19, 0x00080000 */ 0, /* bit 20, 0x00100000 */ 0, /* bit 21, 0x00200000 */ 0, /* bit 22, 0x00400000 */ 0, /* bit 23, 0x00800000 */ 0, /* bit 24, 0x01000000 */ 0, /* bit 25, 0x02000000 */ 0, /* bit 26, 0x04000000 */ 0, /* bit 27, 0x08000000 */ 0, /* bit 28, 0x10000000 */ 0, /* bit 29, 0x20000000 */ 0, /* bit 30, 0x40000000 */ 0, /* bit 31, 0x80000000 */ 0 }; static Flags::Names NamesSaHpiSensorEnableOptDataT = { /* bit 0, 0x00000001 */ 0, /* bit 1, 0x00000002 */ 0, /* bit 2, 0x00000004 */ 0, /* bit 3, 0x00000008 */ 0, /* bit 4, 0x00000010 */ "CURRENT_STATE", /* bit 5, 0x00000020 */ 0, /* bit 6, 0x00000040 */ "ALARM_STATES", /* bit 7, 0x00000080 */ 0, /* bit 8, 0x00000100 */ 0, /* bit 9, 0x00000200 */ 0, /* bit 10, 0x00000400 */ 0, /* bit 11, 0x00000800 */ 0, /* bit 12, 0x00001000 */ 0, /* bit 13, 0x00002000 */ 0, /* bit 14, 0x00004000 */ 0, /* bit 15, 0x00008000 */ 0, /* bit 16, 0x00010000 */ 0, /* bit 17, 0x00020000 */ 0, /* bit 18, 0x00040000 */ 0, /* bit 19, 0x00080000 */ 0, /* bit 20, 0x00100000 */ 0, /* bit 21, 0x00200000 */ 0, /* bit 22, 0x00400000 */ 0, /* bit 23, 0x00800000 */ 0, /* bit 24, 0x01000000 */ 0, /* bit 25, 0x02000000 */ 0, /* bit 26, 0x04000000 */ 0, /* bit 27, 0x08000000 */ 0, /* bit 28, 0x10000000 */ 0, /* bit 29, 0x20000000 */ 0, /* bit 30, 0x40000000 */ 0, /* bit 31, 0x80000000 */ 0 }; static Flags::Names NamesSaHpiEvtQueueStatusT = { /* bit 0, 0x00000001 */ "OVERFLOW", /* bit 1, 0x00000002 */ 0, /* bit 2, 0x00000004 */ 0, /* bit 3, 0x00000008 */ 0, /* bit 4, 0x00000010 */ 0, /* bit 5, 0x00000020 */ 0, /* bit 6, 0x00000040 */ 0, /* bit 7, 0x00000080 */ 0, /* bit 8, 0x00000100 */ 0, /* bit 9, 0x00000200 */ 0, /* bit 10, 0x00000400 */ 0, /* bit 11, 0x00000800 */ 0, /* bit 12, 0x00001000 */ 0, /* bit 13, 0x00002000 */ 0, /* bit 14, 0x00004000 */ 0, /* bit 15, 0x00008000 */ 0, /* bit 16, 0x00010000 */ 0, /* bit 17, 0x00020000 */ 0, /* bit 18, 0x00040000 */ 0, /* bit 19, 0x00080000 */ 0, /* bit 20, 0x00100000 */ 0, /* bit 21, 0x00200000 */ 0, /* bit 22, 0x00400000 */ 0, /* bit 23, 0x00800000 */ 0, /* bit 24, 0x01000000 */ 0, /* bit 25, 0x02000000 */ 0, /* bit 26, 0x04000000 */ 0, /* bit 27, 0x08000000 */ 0, /* bit 28, 0x10000000 */ 0, /* bit 29, 0x20000000 */ 0, /* bit 30, 0x40000000 */ 0, /* bit 31, 0x80000000 */ 0 }; static Flags::Names NamesSaHpiCapabilitiesT = { /* bit 0, 0x00000001 */ "SENSOR", /* bit 1, 0x00000002 */ "RDR", /* bit 2, 0x00000004 */ "EVENT_LOG", /* bit 3, 0x00000008 */ "INVENTORY_DATA", /* bit 4, 0x00000010 */ "RESET", /* bit 5, 0x00000020 */ "POWER", /* bit 6, 0x00000040 */ "ANNUNCIATOR", /* bit 7, 0x00000080 */ "LOAD_ID", /* bit 8, 0x00000100 */ "FRU", /* bit 9, 0x00000200 */ "CONTROL", /* bit 10, 0x00000400 */ "WATCHDOG", /* bit 11, 0x00000800 */ "MANAGED_HOTSWAP", /* bit 12, 0x00001000 */ "CONFIGURATION", /* bit 13, 0x00002000 */ "AGGREGATE_STATUS", /* bit 14, 0x00004000 */ "DIMI", /* bit 15, 0x00008000 */ "EVT_DEASSERTS", /* bit 16, 0x00010000 */ "FUMI", /* bit 17, 0x00020000 */ 0, /* bit 18, 0x00040000 */ 0, /* bit 19, 0x00080000 */ 0, /* bit 20, 0x00100000 */ 0, /* bit 21, 0x00200000 */ 0, /* bit 22, 0x00400000 */ 0, /* bit 23, 0x00800000 */ 0, /* bit 24, 0x01000000 */ 0, /* bit 25, 0x02000000 */ 0, /* bit 26, 0x04000000 */ 0, /* bit 27, 0x08000000 */ 0, /* bit 28, 0x10000000 */ 0, /* bit 29, 0x20000000 */ 0, /* bit 30, 0x40000000 */ "RESOURCE", /* bit 31, 0x80000000 */ 0 }; static Flags::Names NamesSaHpiHsCapabilitiesT = { /* bit 0, 0x00000001 */ 0, /* bit 1, 0x00000002 */ 0, /* bit 2, 0x00000004 */ 0, /* bit 3, 0x00000008 */ 0, /* bit 4, 0x00000010 */ 0, /* bit 5, 0x00000020 */ 0, /* bit 6, 0x00000040 */ 0, /* bit 7, 0x00000080 */ 0, /* bit 8, 0x00000100 */ 0, /* bit 9, 0x00000200 */ 0, /* bit 10, 0x00000400 */ 0, /* bit 11, 0x00000800 */ 0, /* bit 12, 0x00001000 */ 0, /* bit 13, 0x00002000 */ 0, /* bit 14, 0x00004000 */ 0, /* bit 15, 0x00008000 */ 0, /* bit 16, 0x00010000 */ 0, /* bit 17, 0x00020000 */ 0, /* bit 18, 0x00040000 */ 0, /* bit 19, 0x00080000 */ 0, /* bit 20, 0x00100000 */ 0, /* bit 21, 0x00200000 */ 0, /* bit 22, 0x00400000 */ 0, /* bit 23, 0x00800000 */ 0, /* bit 24, 0x01000000 */ 0, /* bit 25, 0x02000000 */ 0, /* bit 26, 0x04000000 */ 0, /* bit 27, 0x08000000 */ 0, /* bit 28, 0x10000000 */ 0, /* bit 29, 0x20000000 */ "AUTOINSERT_IMMEDIATE", /* bit 30, 0x40000000 */ "INDICATOR_SUPPORTED", /* bit 31, 0x80000000 */ "AUTOEXTRACT_READ_ONLY" }; static Flags::Names NamesSaHpiDomainCapabilitiesT = { /* bit 0, 0x00000001 */ "AUTOINSERT_READ_ONLY", /* bit 1, 0x00000002 */ 0, /* bit 2, 0x00000004 */ 0, /* bit 3, 0x00000008 */ 0, /* bit 4, 0x00000010 */ 0, /* bit 5, 0x00000020 */ 0, /* bit 6, 0x00000040 */ 0, /* bit 7, 0x00000080 */ 0, /* bit 8, 0x00000100 */ 0, /* bit 9, 0x00000200 */ 0, /* bit 10, 0x00000400 */ 0, /* bit 11, 0x00000800 */ 0, /* bit 12, 0x00001000 */ 0, /* bit 13, 0x00002000 */ 0, /* bit 14, 0x00004000 */ 0, /* bit 15, 0x00008000 */ 0, /* bit 16, 0x00010000 */ 0, /* bit 17, 0x00020000 */ 0, /* bit 18, 0x00040000 */ 0, /* bit 19, 0x00080000 */ 0, /* bit 20, 0x00100000 */ 0, /* bit 21, 0x00200000 */ 0, /* bit 22, 0x00400000 */ 0, /* bit 23, 0x00800000 */ 0, /* bit 24, 0x01000000 */ 0, /* bit 25, 0x02000000 */ 0, /* bit 26, 0x04000000 */ 0, /* bit 27, 0x08000000 */ 0, /* bit 28, 0x10000000 */ 0, /* bit 29, 0x20000000 */ 0, /* bit 30, 0x40000000 */ 0, /* bit 31, 0x80000000 */ 0 }; static Flags::Names NamesSaHpiEventLogCapabilitiesT = { /* bit 0, 0x00000001 */ "ENTRY_ADD", /* bit 1, 0x00000002 */ "CLEAR", /* bit 2, 0x00000004 */ "TIME_SET", /* bit 3, 0x00000008 */ "STATE_SET", /* bit 4, 0x00000010 */ "OVERFLOW_RESET", /* bit 5, 0x00000020 */ 0, /* bit 6, 0x00000040 */ 0, /* bit 7, 0x00000080 */ 0, /* bit 8, 0x00000100 */ 0, /* bit 9, 0x00000200 */ 0, /* bit 10, 0x00000400 */ 0, /* bit 11, 0x00000800 */ 0, /* bit 12, 0x00001000 */ 0, /* bit 13, 0x00002000 */ 0, /* bit 14, 0x00004000 */ 0, /* bit 15, 0x00008000 */ 0, /* bit 16, 0x00010000 */ 0, /* bit 17, 0x00020000 */ 0, /* bit 18, 0x00040000 */ 0, /* bit 19, 0x00080000 */ 0, /* bit 20, 0x00100000 */ 0, /* bit 21, 0x00200000 */ 0, /* bit 22, 0x00400000 */ 0, /* bit 23, 0x00800000 */ 0, /* bit 24, 0x01000000 */ 0, /* bit 25, 0x02000000 */ 0, /* bit 26, 0x04000000 */ 0, /* bit 27, 0x08000000 */ 0, /* bit 28, 0x10000000 */ 0, /* bit 29, 0x20000000 */ 0, /* bit 30, 0x40000000 */ 0, /* bit 31, 0x80000000 */ 0 }; /*************************************************** * class cHpiXmlWriter ***************************************************/ cHpiXmlWriter::cHpiXmlWriter( int indent_step, bool use_names ) : cXmlWriter( "http://openhpi.org/SAI-HPI-B.03.02", "http://openhpi.org hpixml.xsd", indent_step, use_names ) { // empty } void cHpiXmlWriter::Begin( void ) { cXmlWriter::Begin( "HPI" ); } void cHpiXmlWriter::End( void ) { cXmlWriter::End( "HPI" ); } void cHpiXmlWriter::VersionNode( const SaHpiVersionT& ver ) { NodeSaHpiVersionT( "Version", ver ); } void cHpiXmlWriter::BeginDomainNode( const SaHpiDomainInfoT& di ) { cXmlWriter::BeginNode( "Domain" ); NodeSaHpiDomainIdT( "DomainId", di.DomainId ); NodeSaHpiDomainCapabilitiesT( "DomainCapabilities", di.DomainCapabilities ); NodeSaHpiBoolT( "IsPeer", di.IsPeer ); NodeSaHpiTextBufferT( "DomainTag", di.DomainTag ); NodeSaHpiGuidT( "Guid", di.Guid ); } void cHpiXmlWriter::EndDomainNode() { cXmlWriter::EndNode( "Domain" ); } void cHpiXmlWriter::BeginDrtNode( const SaHpiDomainInfoT& di ) { cXmlWriter::BeginNode( "DomainReferenceTable" ); NodeSaHpiUint32T( "DrtUpdateCount", di.DrtUpdateCount ); NodeSaHpiTimeT( "DrtUpdateTimestamp", di.DrtUpdateTimestamp ); } void cHpiXmlWriter::EndDrtNode() { cXmlWriter::EndNode( "DomainReferenceTable" ); } void cHpiXmlWriter::DrtEntryNode( const SaHpiDrtEntryT& drte ) { cXmlWriter::BeginNode( "Reference" ); NodeSaHpiDomainIdT( "DomainId", drte.DomainId ); NodeSaHpiBoolT( "IsPeer", drte.IsPeer ); cXmlWriter::EndNode( "Reference" ); } void cHpiXmlWriter::BeginRptNode( const SaHpiDomainInfoT& di ) { cXmlWriter::BeginNode( "ResourcePresenceTable" ); NodeSaHpiUint32T( "RptUpdateCount", di.RptUpdateCount ); NodeSaHpiTimeT( "RptUpdateTimestamp", di.RptUpdateTimestamp ); } void cHpiXmlWriter::EndRptNode() { cXmlWriter::EndNode( "ResourcePresenceTable" ); } void cHpiXmlWriter::BeginResourceNode( const SaHpiRptEntryT& rpte, SaHpiUint32T rdr_update_count ) { cXmlWriter::BeginNode( "Resource" ); NodeSaHpiRptEntryT( "RptEntry", rpte ); NodeSaHpiUint32T( "RdrUpdateCount", rdr_update_count ); } void cHpiXmlWriter::EndResourceNode() { cXmlWriter::EndNode( "Resource" ); } void cHpiXmlWriter::BeginInstrumentNode( const SaHpiRdrT& rdr ) { cXmlWriter::BeginNode( "Instrument" ); NodeSaHpiRdrT( "Rdr", rdr ); } void cHpiXmlWriter::EndInstrumentNode() { cXmlWriter::EndNode( "Instrument" ); } void cHpiXmlWriter::BeginEventLogNode( SaHpiResourceIdT rid, const SaHpiEventLogInfoT& info, const SaHpiEventLogCapabilitiesT& caps ) { if ( rid == SAHPI_UNSPECIFIED_RESOURCE_ID ) { cXmlWriter::BeginNode( "DomainEventLog" ); } else { cXmlWriter::BeginNode( "EventLog" ); } NodeSaHpiUint32T( "Entries", info.Entries ); NodeSaHpiUint32T( "Size", info.Size ); NodeSaHpiUint32T( "UserEventMaxSize", info.UserEventMaxSize ); NodeSaHpiTimeT( "UpdateTimestamp", info.UpdateTimestamp ); NodeSaHpiTimeT( "CurrentTime", info.CurrentTime ); NodeSaHpiBoolT( "Enabled", info.Enabled ); NodeSaHpiBoolT( "OverflowFlag", info.OverflowFlag ); NodeSaHpiBoolT( "OverflowResetable", info.OverflowResetable ); NodeSaHpiEventLogOverflowActionT( "OverflowAction", info.OverflowAction ); NodeSaHpiEventLogCapabilitiesT( "Capabilities", caps ); } void cHpiXmlWriter::EndEventLogNode( SaHpiResourceIdT rid ) { if ( rid == SAHPI_UNSPECIFIED_RESOURCE_ID ) { cXmlWriter::EndNode( "DomainEventLog" ); } else { cXmlWriter::EndNode( "EventLog" ); } } void cHpiXmlWriter::LogEntryNode( const SaHpiEventLogEntryT& entry, const SaHpiRdrT& rdr, const SaHpiRptEntryT& rpte ) { cXmlWriter::BeginNode( "Entry" ); NodeSaHpiTimeT( "Timestamp", entry.Timestamp ); NodeSaHpiEventT( "Event", entry.Event ); if ( rdr.RdrType != SAHPI_NO_RECORD ) { NodeSaHpiRdrT( "Rdr", rdr ); } if ( rpte.ResourceId != SAHPI_UNSPECIFIED_RESOURCE_ID ) { if ( rpte.ResourceCapabilities != 0 ) { NodeSaHpiRptEntryT( "RptEntry", rpte ); } } cXmlWriter::EndNode( "Entry" ); } void cHpiXmlWriter::BeginDatNode( const SaHpiDomainInfoT& di ) { cXmlWriter::BeginNode( "DomainAlarmTable" ); NodeSaHpiUint32T( "DatUpdateCount", di.DatUpdateCount ); NodeSaHpiTimeT( "DatUpdateTimestamp", di.DatUpdateTimestamp ); NodeSaHpiUint32T( "ActiveAlarms", di.ActiveAlarms ); NodeSaHpiUint32T( "CriticalAlarms", di.CriticalAlarms ); NodeSaHpiUint32T( "MajorAlarms", di.MajorAlarms ); NodeSaHpiUint32T( "MinorAlarms", di.MinorAlarms ); NodeSaHpiUint32T( "DatUserAlarmLimit", di.DatUserAlarmLimit ); NodeSaHpiBoolT( "DatOverflow", di.DatOverflow ); } void cHpiXmlWriter::EndDatNode() { cXmlWriter::EndNode( "DomainAlarmTable" ); } void cHpiXmlWriter::AlarmNode( const SaHpiAlarmT& a ) { cXmlWriter::BeginNode( "Alarm" ); NodeSaHpiAlarmIdT( "AlarmId", a.AlarmId ); NodeSaHpiTimeT( "Timestamp", a.Timestamp ); NodeSaHpiSeverityT( "Severity", a.Severity ); NodeSaHpiBoolT( "Acknowledged", a.Acknowledged ); NodeSaHpiConditionT( "AlarmCond", a.AlarmCond ); cXmlWriter::EndNode( "Alarm" ); } /**************************** * Basic Types ***************************/ void cHpiXmlWriter::NodeSaHpiUint8T( const char * name, const SaHpiUint8T& x ) { NodeSaHpiUint32T( name, x ); } void cHpiXmlWriter::NodeSaHpiUint16T( const char * name, const SaHpiUint16T& x ) { NodeSaHpiUint32T( name, x ); } void cHpiXmlWriter::NodeSaHpiUint32T( const char * name, const SaHpiUint32T& x ) { cXmlWriter::Node( name, "%u", x ); } void cHpiXmlWriter::NodeSaHpiUint64T( const char * name, const SaHpiUint64T& x ) { cXmlWriter::Node( name, "%llu", x ); } void cHpiXmlWriter::NodeSaHpiInt8T( const char * name, const SaHpiInt8T& x ) { NodeSaHpiInt32T( name, x ); } void cHpiXmlWriter::NodeSaHpiInt16T( const char * name, const SaHpiInt16T& x ) { NodeSaHpiInt32T( name, x ); } void cHpiXmlWriter::NodeSaHpiInt32T( const char * name, const SaHpiInt32T& x ) { cXmlWriter::Node( name, "%d", x ); } void cHpiXmlWriter::NodeSaHpiInt64T( const char * name, const SaHpiInt64T& x ) { cXmlWriter::Node( name, "%lld", x ); } void cHpiXmlWriter::NodeSaHpiFloat64T( const char * name, const SaHpiFloat64T& x ) { cXmlWriter::Node( name, "%f", x ); } /**************************** * Typedefs ***************************/ void cHpiXmlWriter::NodeSaHpiBoolT( const char * name, const SaHpiBoolT& x ) { cXmlWriter::Node( name, "%s", ( x == SAHPI_FALSE ) ? "false" : "true" ); } void cHpiXmlWriter::NodeSaHpiManufacturerIdT( const char * name, const SaHpiManufacturerIdT& x ) { NodeSaHpiUint32T( name, x ); } void cHpiXmlWriter::NodeSaHpiVersionT( const char * name, const SaHpiVersionT& x ) { SaHpiUint8T comp = ( x >> 16 ) & 0xFF; SaHpiUint8T major = ( x >> 8 ) & 0xFF; SaHpiUint8T minor = x & 0xFF; cXmlWriter::Node( name, "%c.%02u.%02u", 'A' - 1 + comp, major, minor ); } void cHpiXmlWriter::NodeSaHpiDomainIdT( const char * name, const SaHpiDomainIdT& x ) { NodeSaHpiUint32T( name, x ); } void cHpiXmlWriter::NodeSaHpiSessionIdT( const char * name, const SaHpiSessionIdT& x ) { NodeSaHpiUint32T( name, x ); } void cHpiXmlWriter::NodeSaHpiResourceIdT( const char * name, const SaHpiResourceIdT& x ) { NodeSaHpiUint32T( name, x ); } void cHpiXmlWriter::NodeSaHpiEntryIdT( const char * name, const SaHpiEntryIdT& x ) { NodeSaHpiUint32T( name, x ); } void cHpiXmlWriter::NodeSaHpiTimeT( const char * name, const SaHpiTimeT& x ) { NodeSaHpiInt64T( name, x ); } void cHpiXmlWriter::NodeSaHpiTimeoutT( const char * name, const SaHpiTimeoutT& x ) { NodeSaHpiInt64T( name, x ); } void cHpiXmlWriter::NodeSaHpiInstrumentIdT( const char * name, const SaHpiInstrumentIdT& x ) { NodeSaHpiUint32T( name, x ); } void cHpiXmlWriter::NodeSaHpiEntityLocationT( const char * name, const SaHpiEntityLocationT& x ) { NodeSaHpiUint32T( name, x ); } void cHpiXmlWriter::NodeSaHpiEventStateT( const char * name, const SaHpiEventStateT& x ) { cXmlWriter::NodeFlags( name, x, &NamesSaHpiEventStateT ); } void cHpiXmlWriter::NodeSaHpiSensorNumT( const char * name, const SaHpiSensorNumT& x ) { NodeSaHpiInstrumentIdT( name, x ); } void cHpiXmlWriter::NodeSaHpiSensorRangeFlagsT( const char * name, const SaHpiSensorRangeFlagsT& x ) { cXmlWriter::NodeFlags( name, x, &NamesSaHpiSensorRangeFlagsT ); } void cHpiXmlWriter::NodeSaHpiSensorThdMaskT( const char * name, const SaHpiSensorThdMaskT& x ) { cXmlWriter::NodeFlags( name, x, &NamesSaHpiSensorThdMaskT ); } void cHpiXmlWriter::NodeSaHpiCtrlNumT( const char * name, const SaHpiCtrlNumT& x ) { NodeSaHpiInstrumentIdT( name, x ); } void cHpiXmlWriter::NodeSaHpiCtrlStateDiscreteT( const char * name, const SaHpiCtrlStateDiscreteT& x ) { NodeSaHpiUint32T( name, x ); } void cHpiXmlWriter::NodeSaHpiCtrlStateAnalogT( const char * name, const SaHpiCtrlStateAnalogT& x ) { NodeSaHpiInt32T( name, x ); } void cHpiXmlWriter::NodeSaHpiTxtLineNumT( const char * name, const SaHpiTxtLineNumT& x ) { NodeSaHpiUint8T( name, x ); } void cHpiXmlWriter::NodeSaHpiIdrIdT( const char * name, const SaHpiIdrIdT& x ) { NodeSaHpiInstrumentIdT( name, x ); } void cHpiXmlWriter::NodeSaHpiWatchdogNumT( const char * name, const SaHpiWatchdogNumT& x ) { NodeSaHpiInstrumentIdT( name, x ); } void cHpiXmlWriter::NodeSaHpiWatchdogExpFlagsT( const char * name, const SaHpiWatchdogExpFlagsT& x ) { cXmlWriter::NodeFlags( name, x, &NamesSaHpiWatchdogExpFlagsT ); } void cHpiXmlWriter::NodeSaHpiDimiNumT( const char * name, const SaHpiDimiNumT& x ) { NodeSaHpiInstrumentIdT( name, x ); } void cHpiXmlWriter::NodeSaHpiDimiTestCapabilityT( const char * name, const SaHpiDimiTestCapabilityT& x ) { cXmlWriter::NodeFlags( name, x, &NamesSaHpiDimiTestCapabilityT ); } void cHpiXmlWriter::NodeSaHpiDimiTestNumT( const char * name, const SaHpiDimiTestNumT& x ) { NodeSaHpiUint32T( name, x ); } void cHpiXmlWriter::NodeSaHpiDimiTestPercentCompletedT( const char * name, const SaHpiDimiTestPercentCompletedT& x ) { NodeSaHpiUint8T( name, x ); } void cHpiXmlWriter::NodeSaHpiFumiNumT( const char * name, const SaHpiFumiNumT& x ) { NodeSaHpiInstrumentIdT( name, x ); } void cHpiXmlWriter::NodeSaHpiBankNumT( const char * name, const SaHpiBankNumT& x ) { NodeSaHpiUint8T( name, x ); } void cHpiXmlWriter::NodeSaHpiFumiLogicalBankStateFlagsT( const char * name, const SaHpiFumiLogicalBankStateFlagsT& x ) { cXmlWriter::NodeFlags( name, x, &NamesSaHpiFumiLogicalBankStateFlagsT ); } void cHpiXmlWriter::NodeSaHpiFumiProtocolT( const char * name, const SaHpiFumiProtocolT& x ) { cXmlWriter::NodeFlags( name, x, &NamesSaHpiFumiProtocolT ); } void cHpiXmlWriter::NodeSaHpiFumiCapabilityT( const char * name, const SaHpiFumiCapabilityT& x ) { cXmlWriter::NodeFlags( name, x, &NamesSaHpiFumiCapabilityT ); } void cHpiXmlWriter::NodeSaHpiSensorOptionalDataT( const char * name, const SaHpiSensorOptionalDataT& x ) { cXmlWriter::NodeFlags( name, x, &NamesSaHpiSensorOptionalDataT ); } void cHpiXmlWriter::NodeSaHpiSensorEnableOptDataT( const char * name, const SaHpiSensorEnableOptDataT& x ) { cXmlWriter::NodeFlags( name, x, &NamesSaHpiSensorEnableOptDataT ); } void cHpiXmlWriter::NodeSaHpiEvtQueueStatusT( const char * name, const SaHpiEvtQueueStatusT& x ) { cXmlWriter::NodeFlags( name, x, &NamesSaHpiEvtQueueStatusT ); } void cHpiXmlWriter::NodeSaHpiAnnunciatorNumT( const char * name, const SaHpiAnnunciatorNumT& x ) { NodeSaHpiInstrumentIdT( name, x ); } void cHpiXmlWriter::NodeSaHpiLoadNumberT( const char * name, const SaHpiLoadNumberT& x ) { NodeSaHpiUint32T( name, x ); } void cHpiXmlWriter::NodeSaHpiCapabilitiesT( const char * name, const SaHpiCapabilitiesT& x ) { cXmlWriter::NodeFlags( name, x, &NamesSaHpiCapabilitiesT ); } void cHpiXmlWriter::NodeSaHpiHsCapabilitiesT( const char * name, const SaHpiHsCapabilitiesT& x ) { cXmlWriter::NodeFlags( name, x, &NamesSaHpiHsCapabilitiesT ); } void cHpiXmlWriter::NodeSaHpiDomainCapabilitiesT( const char * name, const SaHpiDomainCapabilitiesT& x ) { cXmlWriter::NodeFlags( name, x, &NamesSaHpiDomainCapabilitiesT ); } void cHpiXmlWriter::NodeSaHpiAlarmIdT( const char * name, const SaHpiAlarmIdT& x ) { NodeSaHpiEntryIdT( name, x ); } void cHpiXmlWriter::NodeSaHpiEventLogCapabilitiesT( const char * name, const SaHpiEventLogCapabilitiesT& x ) { cXmlWriter::NodeFlags( name, x, &NamesSaHpiEventLogCapabilitiesT ); } void cHpiXmlWriter::NodeSaHpiEventLogEntryIdT( const char * name, const SaHpiEventLogEntryIdT& x ) { NodeSaHpiUint32T( name, x ); } /**************************** * Enums ***************************/ void cHpiXmlWriter::NodeSaHpiLanguageT( const char * name, const SaHpiLanguageT& x ) { cXmlWriter::NodeEnum( name, x, oh_lookup_language ); } void cHpiXmlWriter::NodeSaHpiTextTypeT( const char * name, const SaHpiTextTypeT& x ) { cXmlWriter::NodeEnum( name, x, oh_lookup_texttype ); } void cHpiXmlWriter::NodeSaHpiEntityTypeT( const char * name, const SaHpiEntityTypeT& x ) { cXmlWriter::NodeEnum( name, x, oh_lookup_entitytype ); } void cHpiXmlWriter::NodeSaHpiSensorTypeT( const char * name, const SaHpiSensorTypeT& x ) { cXmlWriter::NodeEnum( name, x, oh_lookup_sensortype ); } void cHpiXmlWriter::NodeSaHpiSensorReadingTypeT( const char * name, const SaHpiSensorReadingTypeT& x ) { cXmlWriter::NodeEnum( name, x, oh_lookup_sensorreadingtype ); } void cHpiXmlWriter::NodeSaHpiSensorEventMaskActionT( const char * name, const SaHpiSensorEventMaskActionT& x ) { cXmlWriter::NodeEnum( name, x, oh_lookup_sensoreventmaskaction ); } void cHpiXmlWriter::NodeSaHpiSensorUnitsT( const char * name, const SaHpiSensorUnitsT& x ) { cXmlWriter::NodeEnum( name, x, oh_lookup_sensorunits ); } void cHpiXmlWriter::NodeSaHpiSensorModUnitUseT( const char * name, const SaHpiSensorModUnitUseT& x ) { cXmlWriter::NodeEnum( name, x, oh_lookup_sensormodunituse ); } void cHpiXmlWriter::NodeSaHpiSensorEventCtrlT( const char * name, const SaHpiSensorEventCtrlT& x ) { cXmlWriter::NodeEnum( name, x, oh_lookup_sensoreventctrl ); } void cHpiXmlWriter::NodeSaHpiCtrlTypeT( const char * name, const SaHpiCtrlTypeT& x ) { cXmlWriter::NodeEnum( name, x, oh_lookup_ctrltype ); } void cHpiXmlWriter::NodeSaHpiCtrlStateDigitalT( const char * name, const SaHpiCtrlStateDigitalT& x ) { cXmlWriter::NodeEnum( name, x, oh_lookup_ctrlstatedigital ); } void cHpiXmlWriter::NodeSaHpiCtrlModeT( const char * name, const SaHpiCtrlModeT& x ) { cXmlWriter::NodeEnum( name, x, oh_lookup_ctrlmode ); } void cHpiXmlWriter::NodeSaHpiCtrlOutputTypeT( const char * name, const SaHpiCtrlOutputTypeT& x ) { cXmlWriter::NodeEnum( name, x, oh_lookup_ctrloutputtype ); } void cHpiXmlWriter::NodeSaHpiIdrAreaTypeT( const char * name, const SaHpiIdrAreaTypeT& x ) { cXmlWriter::NodeEnum( name, x, oh_lookup_idrareatype ); } void cHpiXmlWriter::NodeSaHpiIdrFieldTypeT( const char * name, const SaHpiIdrFieldTypeT& x ) { cXmlWriter::NodeEnum( name, x, oh_lookup_idrfieldtype ); } void cHpiXmlWriter::NodeSaHpiWatchdogActionT( const char * name, const SaHpiWatchdogActionT& x ) { cXmlWriter::NodeEnum( name, x, oh_lookup_watchdogaction ); } void cHpiXmlWriter::NodeSaHpiWatchdogActionEventT( const char * name, const SaHpiWatchdogActionEventT& x ) { cXmlWriter::NodeEnum( name, x, oh_lookup_watchdogactionevent ); } void cHpiXmlWriter::NodeSaHpiWatchdogPretimerInterruptT( const char * name, const SaHpiWatchdogPretimerInterruptT& x ) { cXmlWriter::NodeEnum( name, x, oh_lookup_watchdogpretimerinterrupt ); } void cHpiXmlWriter::NodeSaHpiWatchdogTimerUseT( const char * name, const SaHpiWatchdogTimerUseT& x ) { cXmlWriter::NodeEnum( name, x, oh_lookup_watchdogtimeruse ); } void cHpiXmlWriter::NodeSaHpiDimiTestServiceImpactT( const char * name, const SaHpiDimiTestServiceImpactT& x ) { cXmlWriter::NodeEnum( name, x, oh_lookup_dimitestserviceimpact ); } void cHpiXmlWriter::NodeSaHpiDimiTestRunStatusT( const char * name, const SaHpiDimiTestRunStatusT& x ) { cXmlWriter::NodeEnum( name, x, oh_lookup_dimitestrunstatus ); } void cHpiXmlWriter::NodeSaHpiDimiTestErrCodeT( const char * name, const SaHpiDimiTestErrCodeT& x ) { cXmlWriter::NodeEnum( name, x, oh_lookup_dimitesterrcode ); } void cHpiXmlWriter::NodeSaHpiDimiTestParamTypeT( const char * name, const SaHpiDimiTestParamTypeT& x ) { cXmlWriter::NodeEnum( name, x, oh_lookup_dimitestparamtype ); } void cHpiXmlWriter::NodeSaHpiDimiReadyT( const char * name, const SaHpiDimiReadyT& x ) { cXmlWriter::NodeEnum( name, x, oh_lookup_dimiready ); } void cHpiXmlWriter::NodeSaHpiFumiSpecInfoTypeT( const char * name, const SaHpiFumiSpecInfoTypeT& x ) { cXmlWriter::NodeEnum( name, x, oh_lookup_fumispecinfotype ); } void cHpiXmlWriter::NodeSaHpiFumiSafDefinedSpecIdT( const char * name, const SaHpiFumiSafDefinedSpecIdT& x ) { cXmlWriter::NodeEnum( name, x, oh_lookup_fumisafdefinedspecid ); } void cHpiXmlWriter::NodeSaHpiFumiServiceImpactT( const char * name, const SaHpiFumiServiceImpactT& x ) { cXmlWriter::NodeEnum( name, x, oh_lookup_fumiserviceimpact ); } void cHpiXmlWriter::NodeSaHpiFumiSourceStatusT( const char * name, const SaHpiFumiSourceStatusT& x ) { cXmlWriter::NodeEnum( name, x, oh_lookup_fumisourcestatus ); } void cHpiXmlWriter::NodeSaHpiFumiBankStateT( const char * name, const SaHpiFumiBankStateT& x ) { cXmlWriter::NodeEnum( name, x, oh_lookup_fumibankstate ); } void cHpiXmlWriter::NodeSaHpiFumiUpgradeStatusT( const char * name, const SaHpiFumiUpgradeStatusT& x ) { cXmlWriter::NodeEnum( name, x, oh_lookup_fumiupgradestatus ); } void cHpiXmlWriter::NodeSaHpiHsIndicatorStateT( const char * name, const SaHpiHsIndicatorStateT& x ) { cXmlWriter::NodeEnum( name, x, oh_lookup_hsindicatorstate ); } void cHpiXmlWriter::NodeSaHpiHsActionT( const char * name, const SaHpiHsActionT& x ) { cXmlWriter::NodeEnum( name, x, oh_lookup_hsaction ); } void cHpiXmlWriter::NodeSaHpiHsStateT( const char * name, const SaHpiHsStateT& x ) { cXmlWriter::NodeEnum( name, x, oh_lookup_hsstate ); } void cHpiXmlWriter::NodeSaHpiHsCauseOfStateChangeT( const char * name, const SaHpiHsCauseOfStateChangeT& x ) { cXmlWriter::NodeEnum( name, x, oh_lookup_hscauseofstatechange ); } void cHpiXmlWriter::NodeSaHpiSeverityT( const char * name, const SaHpiSeverityT& x ) { cXmlWriter::NodeEnum( name, x, oh_lookup_severity ); } void cHpiXmlWriter::NodeSaHpiResourceEventTypeT( const char * name, const SaHpiResourceEventTypeT& x ) { cXmlWriter::NodeEnum( name, x, oh_lookup_resourceeventtype ); } void cHpiXmlWriter::NodeSaHpiDomainEventTypeT( const char * name, const SaHpiDomainEventTypeT& x ) { cXmlWriter::NodeEnum( name, x, oh_lookup_domaineventtype ); } void cHpiXmlWriter::NodeSaHpiSwEventTypeT( const char * name, const SaHpiSwEventTypeT& x ) { cXmlWriter::NodeEnum( name, x, oh_lookup_sweventtype ); } void cHpiXmlWriter::NodeSaHpiEventTypeT( const char * name, const SaHpiEventTypeT& x ) { cXmlWriter::NodeEnum( name, x, oh_lookup_eventtype ); } void cHpiXmlWriter::NodeSaHpiStatusCondTypeT( const char * name, const SaHpiStatusCondTypeT& x ) { cXmlWriter::NodeEnum( name, x, oh_lookup_statuscondtype ); } void cHpiXmlWriter::NodeSaHpiAnnunciatorModeT( const char * name, const SaHpiAnnunciatorModeT& x ) { cXmlWriter::NodeEnum( name, x, oh_lookup_annunciatormode ); } void cHpiXmlWriter::NodeSaHpiAnnunciatorTypeT( const char * name, const SaHpiAnnunciatorTypeT& x ) { cXmlWriter::NodeEnum( name, x, oh_lookup_annunciatortype ); } void cHpiXmlWriter::NodeSaHpiRdrTypeT( const char * name, const SaHpiRdrTypeT& x ) { cXmlWriter::NodeEnum( name, x, oh_lookup_rdrtype ); } void cHpiXmlWriter::NodeSaHpiParmActionT( const char * name, const SaHpiParmActionT& x ) { cXmlWriter::NodeEnum( name, x, oh_lookup_parmaction ); } void cHpiXmlWriter::NodeSaHpiResetActionT( const char * name, const SaHpiResetActionT& x ) { cXmlWriter::NodeEnum( name, x, oh_lookup_resetaction ); } void cHpiXmlWriter::NodeSaHpiPowerStateT( const char * name, const SaHpiPowerStateT& x ) { cXmlWriter::NodeEnum( name, x, oh_lookup_powerstate ); } void cHpiXmlWriter::NodeSaHpiEventLogOverflowActionT( const char * name, const SaHpiEventLogOverflowActionT& x ) { cXmlWriter::NodeEnum( name, x, oh_lookup_eventlogoverflowaction ); } /**************************** * Enum-Like Types ***************************/ void cHpiXmlWriter::NodeSaErrorT( const char * name, const SaErrorT& x ) { cXmlWriter::NodeEnum( name, x, oh_lookup_error ); } void cHpiXmlWriter::NodeSaHpiEventCategoryT( const char * name, const SaHpiEventCategoryT& x ) { cXmlWriter::NodeEnum( name, x, oh_lookup_eventcategory ); } /**************************** * Complex Types ***************************/ void cHpiXmlWriter::NodeSaHpiTextBufferT( const char * name, const SaHpiTextBufferT& x ) { std::string s; cXmlWriter::BeginNode( name ); NodeSaHpiTextTypeT( "DataType", x.DataType ); NodeSaHpiLanguageT( "Language", x.Language ); NodeSaHpiUint8T( "DataLength", x.DataLength ); switch ( x.DataType ) { case SAHPI_TL_TYPE_UNICODE: // UTF-16, Little-Endian for ( size_t i = 0; i < x.DataLength; i += 2 ) { gunichar2 utf16; utf16 = ( ( (gunichar2)x.Data[i + 1] ) << 8 ) | x.Data[i]; gchar * utf8 = g_utf16_to_utf8( &utf16, 1, 0, 0, 0 ); if ( utf8 ) { s.append( utf8 ); g_free( utf8 ); } else { s.push_back( '?' ); } } cXmlWriter::Node( "Data", "%s", s.c_str() ); break; case SAHPI_TL_TYPE_BCDPLUS: case SAHPI_TL_TYPE_ASCII6: case SAHPI_TL_TYPE_TEXT: s.assign( reinterpret_cast(&x.Data[0]), x.DataLength ); cXmlWriter::Node( "Data", "%s", s.c_str() ); break; case SAHPI_TL_TYPE_BINARY: default: cXmlWriter::NodeHex( "Data", &x.Data[0], x.DataLength ); } cXmlWriter::EndNode( name ); } void cHpiXmlWriter::NodeSaHpiEntityPathT( const char * name, const SaHpiEntityPathT& x ) { SaErrorT rv; oh_big_textbuffer buf; rv = oh_init_bigtext( &buf ); if ( rv == SA_OK ) { rv = oh_decode_entitypath( &x, &buf ); } if ( rv == SA_OK ) { cXmlWriter::Node( name, "%s", reinterpret_cast(&buf.Data[0]) ); } else { cXmlWriter::Node( name, "%s", "{UNKNOWN, 0}" ); } } void cHpiXmlWriter::NodeSaHpiNameT( const char * name, const SaHpiNameT& x ) { std::string s; s.assign( reinterpret_cast(&x.Value[0]), x.Length ); cXmlWriter::BeginNode( name ); NodeSaHpiUint16T( "Length", x.Length ); cXmlWriter::Node( "Value", "%s", s.c_str() ); cXmlWriter::EndNode( name ); } void cHpiXmlWriter::NodeSaHpiConditionT( const char * name, const SaHpiConditionT& x ) { cXmlWriter::BeginNode( name ); NodeSaHpiStatusCondTypeT( "Type", x.Type ); NodeSaHpiEntityPathT( "Entity", x.Entity ); NodeSaHpiDomainIdT( "DomainId", x.DomainId ); NodeSaHpiResourceIdT( "ResourceId", x.ResourceId ); NodeSaHpiSensorNumT( "SensorNum", x.SensorNum ); NodeSaHpiEventStateT( "EventState", x.EventState ); NodeSaHpiNameT( "Name", x.Name ); NodeSaHpiManufacturerIdT( "Mid", x.Mid ); NodeSaHpiTextBufferT( "Data", x.Data ); cXmlWriter::EndNode( name ); } void cHpiXmlWriter::NodeSaHpiGuidT( const char * name, const SaHpiGuidT& x ) { cXmlWriter::NodeHex( name, &x[0], sizeof(x) ); } void cHpiXmlWriter::NodeSaHpiRptEntryT( const char * name, const SaHpiRptEntryT& x ) { const SaHpiResourceInfoT info = x.ResourceInfo; cXmlWriter::BeginNode( name ); NodeSaHpiResourceIdT( "ResourceId", x.ResourceId ); cXmlWriter::BeginNode( "ResourceInfo" ); NodeSaHpiUint8T( "ResourceRev", info.ResourceRev ); NodeSaHpiUint8T( "SpecificVer", info.SpecificVer ); NodeSaHpiUint8T( "DeviceSupport", info.DeviceSupport ); NodeSaHpiManufacturerIdT( "ManufacturerId", info.ManufacturerId ); NodeSaHpiUint16T( "ProductId", info.ProductId ); NodeSaHpiUint8T( "FirmwareMajorRev", info.FirmwareMajorRev ); NodeSaHpiUint8T( "FirmwareMinorRev", info.FirmwareMinorRev ); NodeSaHpiUint8T( "AuxFirmwareRev", info.AuxFirmwareRev ); NodeSaHpiGuidT( "Guid", info.Guid ); cXmlWriter::EndNode( "ResourceInfo" ); NodeSaHpiEntityPathT( "ResourceEntity", x.ResourceEntity ); NodeSaHpiCapabilitiesT( "ResourceCapabilities", x.ResourceCapabilities ); NodeSaHpiHsCapabilitiesT( "HotSwapCapabilities", x.HotSwapCapabilities ); NodeSaHpiSeverityT( "ResourceSeverity", x.ResourceSeverity ); NodeSaHpiBoolT( "ResourceFailed", x.ResourceFailed ); NodeSaHpiTextBufferT( "ResourceTag", x.ResourceTag ); cXmlWriter::EndNode( name ); } void cHpiXmlWriter::NodeSaHpiCtrlStateStreamT( const char * name, const SaHpiCtrlStateStreamT& x ) { cXmlWriter::BeginNode( name ); NodeSaHpiBoolT( "Repeat", x.Repeat ); NodeSaHpiUint32T( "StreamLength", x.StreamLength ); cXmlWriter::NodeHex( "Stream", &x.Stream[0], x.StreamLength ); cXmlWriter::EndNode( name ); } void cHpiXmlWriter::NodeSaHpiCtrlStateTextT( const char * name, const SaHpiCtrlStateTextT& x ) { cXmlWriter::BeginNode( name ); NodeSaHpiTxtLineNumT( "Line", x.Line ); NodeSaHpiTextBufferT( "Text", x.Text ); cXmlWriter::EndNode( name ); } void cHpiXmlWriter::NodeSaHpiCtrlStateOemT( const char * name, const SaHpiCtrlStateOemT& x ) { cXmlWriter::BeginNode( name ); NodeSaHpiManufacturerIdT( "MId", x.MId ); NodeSaHpiUint8T( "BodyLength", x.BodyLength ); cXmlWriter::NodeHex( "Body", &x.Body[0], x.BodyLength ); cXmlWriter::EndNode( name ); } void cHpiXmlWriter::NodeSaHpiCtrlRecDigitalT( const char * name, const SaHpiCtrlRecDigitalT& x ) { cXmlWriter::BeginNode( name ); NodeSaHpiCtrlStateDigitalT( "Default", x.Default ); cXmlWriter::EndNode( name ); } void cHpiXmlWriter::NodeSaHpiCtrlRecDiscreteT( const char * name, const SaHpiCtrlRecDiscreteT& x ) { cXmlWriter::BeginNode( name ); NodeSaHpiCtrlStateDiscreteT( "Default", x.Default ); cXmlWriter::EndNode( name ); } void cHpiXmlWriter::NodeSaHpiCtrlRecAnalogT( const char * name, const SaHpiCtrlRecAnalogT& x ) { cXmlWriter::BeginNode( name ); NodeSaHpiCtrlStateAnalogT( "Min", x.Min ); NodeSaHpiCtrlStateAnalogT( "Max", x.Max ); NodeSaHpiCtrlStateAnalogT( "Default", x.Default ); cXmlWriter::EndNode( name ); } void cHpiXmlWriter::NodeSaHpiCtrlRecStreamT( const char * name, const SaHpiCtrlRecStreamT& x ) { cXmlWriter::BeginNode( name ); NodeSaHpiCtrlStateStreamT( "Default", x.Default ); cXmlWriter::EndNode( name ); } void cHpiXmlWriter::NodeSaHpiCtrlRecTextT( const char * name, const SaHpiCtrlRecTextT& x ) { cXmlWriter::BeginNode( name ); NodeSaHpiUint8T( "MaxChars", x.MaxChars ); NodeSaHpiUint8T( "MaxLines", x.MaxLines ); NodeSaHpiLanguageT( "Language", x.Language ); NodeSaHpiTextTypeT( "DataType", x.DataType ); NodeSaHpiCtrlStateTextT( "Default", x.Default ); cXmlWriter::EndNode( name ); } void cHpiXmlWriter::NodeSaHpiCtrlRecOemT( const char * name, const SaHpiCtrlRecOemT& x ) { cXmlWriter::BeginNode( name ); NodeSaHpiManufacturerIdT( "MId", x.MId ); cXmlWriter::NodeHex( "ConfigData", &x.ConfigData[0], SAHPI_CTRL_OEM_CONFIG_LENGTH ); NodeSaHpiCtrlStateOemT( "Default", x.Default ); cXmlWriter::EndNode( name ); } void cHpiXmlWriter::NodeSaHpiCtrlRecT( const char * name, const SaHpiCtrlRecT& x ) { cXmlWriter::BeginNode( name ); NodeSaHpiCtrlNumT( "Num", x.Num ); NodeSaHpiCtrlOutputTypeT( "OutputType", x.OutputType ); NodeSaHpiCtrlTypeT( "Type", x.Type ); cXmlWriter::BeginNode( "TypeUnion" ); switch ( x.Type ) { case SAHPI_CTRL_TYPE_DIGITAL: NodeSaHpiCtrlRecDigitalT( "Digital", x.TypeUnion.Digital ); break; case SAHPI_CTRL_TYPE_DISCRETE: NodeSaHpiCtrlRecDiscreteT( "Discrete", x.TypeUnion.Discrete ); break; case SAHPI_CTRL_TYPE_ANALOG: NodeSaHpiCtrlRecAnalogT( "Analog", x.TypeUnion.Analog ); break; case SAHPI_CTRL_TYPE_STREAM: NodeSaHpiCtrlRecStreamT( "Stream", x.TypeUnion.Stream ); break; case SAHPI_CTRL_TYPE_TEXT: NodeSaHpiCtrlRecTextT( "Text", x.TypeUnion.Text ); break; case SAHPI_CTRL_TYPE_OEM: NodeSaHpiCtrlRecOemT( "Oem", x.TypeUnion.Oem ); break; default: break; } cXmlWriter::EndNode( "TypeUnion" ); cXmlWriter::BeginNode( "DefaultMode" ); NodeSaHpiCtrlModeT( "Mode", x.DefaultMode.Mode ); NodeSaHpiBoolT( "ReadOnly", x.DefaultMode.ReadOnly ); cXmlWriter::EndNode( "DefaultMode" ); NodeSaHpiBoolT( "WriteOnly", x.WriteOnly ); NodeSaHpiUint32T( "Oem", x.Oem ); cXmlWriter::EndNode( name ); } void cHpiXmlWriter::NodeSaHpiSensorReadingT( const char * name, const SaHpiSensorReadingT& x ) { cXmlWriter::BeginNode( name ); NodeSaHpiBoolT( "IsSupported", x.IsSupported ); if ( x.IsSupported != SAHPI_FALSE ) { NodeSaHpiSensorReadingTypeT( "Type", x.Type ); cXmlWriter::BeginNode( "Value" ); switch( x.Type ) { case SAHPI_SENSOR_READING_TYPE_INT64: NodeSaHpiInt64T( "SensorInt64", x.Value.SensorInt64 ); break; case SAHPI_SENSOR_READING_TYPE_UINT64: NodeSaHpiUint64T( "SensorUint64", x.Value.SensorUint64 ); break; case SAHPI_SENSOR_READING_TYPE_FLOAT64: NodeSaHpiFloat64T( "SensorFloat64", x.Value.SensorFloat64 ); break; case SAHPI_SENSOR_READING_TYPE_BUFFER: cXmlWriter::NodeHex( "SensorBuffer", &x.Value.SensorBuffer[0], SAHPI_SENSOR_BUFFER_LENGTH ); break; default: break; } cXmlWriter::EndNode( "Value" ); } cXmlWriter::EndNode( name ); } void cHpiXmlWriter::NodeSaHpiSensorRangeT( const char * name, const SaHpiSensorRangeT& x ) { cXmlWriter::BeginNode( name ); NodeSaHpiSensorRangeFlagsT( "Flags", x.Flags ); if ( x.Flags & SAHPI_SRF_MAX ) { NodeSaHpiSensorReadingT( "Max", x.Max ); } if ( x.Flags & SAHPI_SRF_MIN ) { NodeSaHpiSensorReadingT( "Min", x.Min ); } if ( x.Flags & SAHPI_SRF_NOMINAL ) { NodeSaHpiSensorReadingT( "Nominal", x.Nominal ); } if ( x.Flags & SAHPI_SRF_NORMAL_MAX ) { NodeSaHpiSensorReadingT( "NormalMax", x.NormalMax ); } if ( x.Flags & SAHPI_SRF_NORMAL_MIN ) { NodeSaHpiSensorReadingT( "NormalMin", x.NormalMin ); } cXmlWriter::EndNode( name ); } void cHpiXmlWriter::NodeSaHpiSensorDataFormatT( const char * name, const SaHpiSensorDataFormatT& x ) { cXmlWriter::BeginNode( name ); NodeSaHpiBoolT( "IsSupported", x.IsSupported ); if ( x.IsSupported != SAHPI_FALSE ) { NodeSaHpiSensorReadingTypeT( "ReadingType", x.ReadingType ); NodeSaHpiSensorUnitsT( "BaseUnits", x.BaseUnits ); NodeSaHpiSensorUnitsT( "ModifierUnits", x.ModifierUnits ); NodeSaHpiSensorModUnitUseT( "ModifierUse", x.ModifierUse ); NodeSaHpiBoolT( "Percentage", x.Percentage ); NodeSaHpiSensorRangeT( "Range", x.Range ); NodeSaHpiFloat64T( "AccuracyFactor", x.AccuracyFactor ); } cXmlWriter::EndNode( name ); } void cHpiXmlWriter::NodeSaHpiSensorThdDefnT( const char * name, const SaHpiSensorThdDefnT& x ) { cXmlWriter::BeginNode( name ); NodeSaHpiBoolT( "IsAccessible", x.IsAccessible ); if ( x.IsAccessible != SAHPI_FALSE ) { NodeSaHpiSensorThdMaskT( "ReadThold", x.ReadThold ); NodeSaHpiSensorThdMaskT( "WriteThold", x.WriteThold ); NodeSaHpiBoolT( "Nonlinear", x.Nonlinear ); } cXmlWriter::EndNode( name ); } void cHpiXmlWriter::NodeSaHpiSensorRecT( const char * name, const SaHpiSensorRecT& x ) { cXmlWriter::BeginNode( name ); NodeSaHpiSensorNumT( "Num", x.Num ); NodeSaHpiSensorTypeT( "Type", x.Type ); NodeSaHpiEventCategoryT( "Category", x.Category ); NodeSaHpiBoolT( "EnableCtrl", x.EnableCtrl ); NodeSaHpiSensorEventCtrlT( "EventCtrl", x.EventCtrl ); NodeSaHpiEventStateT( "Events", x.Events ); NodeSaHpiSensorDataFormatT( "DataFormat", x.DataFormat ); NodeSaHpiSensorThdDefnT( "ThresholdDefn", x.ThresholdDefn ); NodeSaHpiUint32T( "Oem", x.Oem ); cXmlWriter::EndNode( name ); } void cHpiXmlWriter::NodeSaHpiInventoryRecT( const char * name, const SaHpiInventoryRecT& x ) { cXmlWriter::BeginNode( name ); NodeSaHpiIdrIdT( "IdrId", x.IdrId ); NodeSaHpiBoolT( "Persistent", x.Persistent ); NodeSaHpiUint32T( "Oem", x.Oem ); cXmlWriter::EndNode( name ); } void cHpiXmlWriter::NodeSaHpiWatchdogRecT( const char * name, const SaHpiWatchdogRecT& x ) { cXmlWriter::BeginNode( name ); NodeSaHpiWatchdogNumT( "WatchdogNum", x.WatchdogNum ); NodeSaHpiUint32T( "Oem", x.Oem ); cXmlWriter::EndNode( name ); } void cHpiXmlWriter::NodeSaHpiAnnunciatorRecT( const char * name, const SaHpiAnnunciatorRecT& x ) { cXmlWriter::BeginNode( name ); NodeSaHpiAnnunciatorNumT( "AnnunciatorNum", x.AnnunciatorNum ); NodeSaHpiAnnunciatorTypeT( "AnnunciatorType", x.AnnunciatorType ); NodeSaHpiBoolT( "ModeReadOnly", x.ModeReadOnly ); NodeSaHpiUint32T( "MaxConditions", x.MaxConditions ); NodeSaHpiUint32T( "Oem", x.Oem ); cXmlWriter::EndNode( name ); } void cHpiXmlWriter::NodeSaHpiDimiRecT( const char * name, const SaHpiDimiRecT& x ) { cXmlWriter::BeginNode( name ); NodeSaHpiDimiNumT( "DimiNum", x.DimiNum ); NodeSaHpiUint32T( "Oem", x.Oem ); cXmlWriter::EndNode( name ); } void cHpiXmlWriter::NodeSaHpiFumiRecT( const char * name, const SaHpiFumiRecT& x ) { cXmlWriter::BeginNode( name ); NodeSaHpiFumiNumT( "Num", x.Num ); NodeSaHpiFumiProtocolT( "AccessProt", x.AccessProt ); NodeSaHpiFumiCapabilityT( "Capability", x.Capability ); NodeSaHpiUint8T( "NumBanks", x.NumBanks ); NodeSaHpiUint32T( "Oem", x.Oem ); cXmlWriter::EndNode( name ); } void cHpiXmlWriter::NodeSaHpiRdrT( const char * name, const SaHpiRdrT& x ) { cXmlWriter::BeginNode( name ); NodeSaHpiRdrTypeT( "RdrType", x.RdrType ); NodeSaHpiEntityPathT( "Entity", x.Entity ); NodeSaHpiBoolT( "IsFru", x.IsFru ); cXmlWriter::BeginNode( "RdrTypeUnion" ); switch ( x.RdrType ) { case SAHPI_CTRL_RDR: NodeSaHpiCtrlRecT( "CtrlRec", x.RdrTypeUnion.CtrlRec ); break; case SAHPI_SENSOR_RDR: NodeSaHpiSensorRecT( "SensorRec", x.RdrTypeUnion.SensorRec ); break; case SAHPI_INVENTORY_RDR: NodeSaHpiInventoryRecT( "InventoryRec", x.RdrTypeUnion.InventoryRec ); break; case SAHPI_WATCHDOG_RDR: NodeSaHpiWatchdogRecT( "WatchdogRec", x.RdrTypeUnion.WatchdogRec ); break; case SAHPI_ANNUNCIATOR_RDR: NodeSaHpiAnnunciatorRecT( "AnnunciatorRec", x.RdrTypeUnion.AnnunciatorRec ); break; case SAHPI_DIMI_RDR: NodeSaHpiDimiRecT( "DimiRec", x.RdrTypeUnion.DimiRec ); break; case SAHPI_FUMI_RDR: NodeSaHpiFumiRecT( "FumiRec", x.RdrTypeUnion.FumiRec ); break; default: break; } cXmlWriter::EndNode( "RdrTypeUnion" ); NodeSaHpiTextBufferT( "IdString", x.IdString ); cXmlWriter::EndNode( name ); } void cHpiXmlWriter::NodeSaHpiResourceEventT( const char * name, const SaHpiResourceEventT& x ) { cXmlWriter::BeginNode( name ); NodeSaHpiResourceEventTypeT( "ResourceEventType", x.ResourceEventType ); cXmlWriter::EndNode( name ); } void cHpiXmlWriter::NodeSaHpiDomainEventT( const char * name, const SaHpiDomainEventT& x ) { cXmlWriter::BeginNode( name ); NodeSaHpiDomainEventTypeT( "Type", x.Type ); NodeSaHpiDomainIdT( "DomainId", x.DomainId ); cXmlWriter::EndNode( name ); } void cHpiXmlWriter::NodeSaHpiSensorEventT( const char * name, const SaHpiSensorEventT& x ) { cXmlWriter::BeginNode( name ); NodeSaHpiSensorNumT( "SensorNum", x.SensorNum ); NodeSaHpiSensorTypeT( "SensorType", x.SensorType ); NodeSaHpiEventCategoryT( "EventCategory", x.EventCategory ); NodeSaHpiBoolT( "Assertion", x.Assertion ); NodeSaHpiEventStateT( "EventState", x.EventState ); NodeSaHpiSensorOptionalDataT( "OptionalDataPresent", x.OptionalDataPresent ); if ( x.OptionalDataPresent & SAHPI_SOD_TRIGGER_READING ) { NodeSaHpiSensorReadingT( "TriggerReading", x.TriggerReading ); } if ( x.OptionalDataPresent & SAHPI_SOD_TRIGGER_THRESHOLD ) { NodeSaHpiSensorReadingT( "TriggerThreshold", x.TriggerThreshold ); } if ( x.OptionalDataPresent & SAHPI_SOD_PREVIOUS_STATE ) { NodeSaHpiEventStateT( "PreviousState", x.PreviousState ); } if ( x.OptionalDataPresent & SAHPI_SOD_CURRENT_STATE ) { NodeSaHpiEventStateT( "CurrentState", x.CurrentState ); } if ( x.OptionalDataPresent & SAHPI_SOD_OEM ) { NodeSaHpiUint32T( "Oem", x.Oem ); } if ( x.OptionalDataPresent & SAHPI_SOD_SENSOR_SPECIFIC ) { NodeSaHpiUint32T( "SensorSpecific", x.SensorSpecific ); } cXmlWriter::EndNode( name ); } void cHpiXmlWriter::NodeSaHpiSensorEnableChangeEventT( const char * name, const SaHpiSensorEnableChangeEventT& x ) { cXmlWriter::BeginNode( name ); NodeSaHpiSensorNumT( "SensorNum", x.SensorNum ); NodeSaHpiSensorTypeT( "SensorType", x.SensorType ); NodeSaHpiEventCategoryT( "EventCategory", x.EventCategory ); NodeSaHpiBoolT( "SensorEnable", x.SensorEnable ); NodeSaHpiBoolT( "SensorEventEnable", x.SensorEventEnable ); NodeSaHpiEventStateT( "AssertEventMask", x.AssertEventMask ); NodeSaHpiEventStateT( "DeassertEventMask", x.DeassertEventMask ); NodeSaHpiSensorEnableOptDataT( "OptionalDataPresent", x.OptionalDataPresent ); if ( x.OptionalDataPresent & SAHPI_SEOD_CURRENT_STATE ) { NodeSaHpiEventStateT( "CurrentState", x.CurrentState ); } if ( x.OptionalDataPresent & SAHPI_SEOD_ALARM_STATES ) { NodeSaHpiEventStateT( "CriticalAlarms", x.CriticalAlarms ); NodeSaHpiEventStateT( "MajorAlarms", x.MajorAlarms ); NodeSaHpiEventStateT( "MinorAlarms", x.MinorAlarms ); } cXmlWriter::EndNode( name ); } void cHpiXmlWriter::NodeSaHpiHotSwapEventT( const char * name, const SaHpiHotSwapEventT& x ) { cXmlWriter::BeginNode( name ); NodeSaHpiHsStateT( "HotSwapState", x.HotSwapState ); NodeSaHpiHsStateT( "PreviousHotSwapState", x.PreviousHotSwapState ); NodeSaHpiHsCauseOfStateChangeT( "CauseOfStateChange", x.CauseOfStateChange ); cXmlWriter::EndNode( name ); } void cHpiXmlWriter::NodeSaHpiWatchdogEventT( const char * name, const SaHpiWatchdogEventT& x ) { cXmlWriter::BeginNode( name ); NodeSaHpiWatchdogNumT( "WatchdogNum", x.WatchdogNum ); NodeSaHpiWatchdogActionEventT( "WatchdogAction", x.WatchdogAction ); NodeSaHpiWatchdogPretimerInterruptT( "WatchdogPreTimerAction", x.WatchdogPreTimerAction ); NodeSaHpiWatchdogTimerUseT( "WatchdogUse", x.WatchdogUse ); cXmlWriter::EndNode( name ); } void cHpiXmlWriter::NodeSaHpiHpiSwEventT( const char * name, const SaHpiHpiSwEventT& x ) { cXmlWriter::BeginNode( name ); NodeSaHpiManufacturerIdT( "MId", x.MId ); NodeSaHpiSwEventTypeT( "Type", x.Type ); NodeSaHpiTextBufferT( "EventData", x.EventData ); cXmlWriter::EndNode( name ); } void cHpiXmlWriter::NodeSaHpiOemEventT( const char * name, const SaHpiOemEventT& x ) { cXmlWriter::BeginNode( name ); NodeSaHpiManufacturerIdT( "MId", x.MId ); NodeSaHpiTextBufferT( "OemEventData", x.OemEventData ); cXmlWriter::EndNode( name ); } void cHpiXmlWriter::NodeSaHpiUserEventT( const char * name, const SaHpiUserEventT& x ) { cXmlWriter::BeginNode( name ); NodeSaHpiTextBufferT( "UserEventData", x.UserEventData ); cXmlWriter::EndNode( name ); } void cHpiXmlWriter::NodeSaHpiDimiEventT( const char * name, const SaHpiDimiEventT& x ) { cXmlWriter::BeginNode( name ); NodeSaHpiDimiNumT( "DimiNum", x.DimiNum ); NodeSaHpiDimiTestNumT( "TestNum", x.TestNum ); NodeSaHpiDimiTestRunStatusT( "DimiTestRunStatus", x.DimiTestRunStatus ); NodeSaHpiDimiTestPercentCompletedT( "DimiTestPercentCompleted", x.DimiTestPercentCompleted ); cXmlWriter::EndNode( name ); } void cHpiXmlWriter::NodeSaHpiDimiUpdateEventT( const char * name, const SaHpiDimiUpdateEventT& x ) { cXmlWriter::BeginNode( name ); NodeSaHpiDimiNumT( "DimiNum", x.DimiNum ); cXmlWriter::EndNode( name ); } void cHpiXmlWriter::NodeSaHpiFumiEventT( const char * name, const SaHpiFumiEventT& x ) { cXmlWriter::BeginNode( name ); NodeSaHpiFumiNumT( "FumiNum", x.FumiNum ); NodeSaHpiUint8T( "BankNum", x.BankNum ); NodeSaHpiFumiUpgradeStatusT( "UpgradeStatus", x.UpgradeStatus ); cXmlWriter::EndNode( name ); } void cHpiXmlWriter::NodeSaHpiEventT( const char * name, const SaHpiEventT& x ) { cXmlWriter::BeginNode( name ); NodeSaHpiResourceIdT( "Source", x.Source ); NodeSaHpiEventTypeT( "EventType", x.EventType ); NodeSaHpiTimeT( "Timestamp", x.Timestamp ); NodeSaHpiSeverityT( "Severity", x.Severity ); cXmlWriter::BeginNode( "EventDataUnion" ); switch ( x.EventType ) { case SAHPI_ET_RESOURCE: NodeSaHpiResourceEventT( "ResourceEvent", x.EventDataUnion.ResourceEvent ); break; case SAHPI_ET_DOMAIN: NodeSaHpiDomainEventT( "DomainEvent", x.EventDataUnion.DomainEvent ); break; case SAHPI_ET_SENSOR: NodeSaHpiSensorEventT( "SensorEvent", x.EventDataUnion.SensorEvent ); break; case SAHPI_ET_SENSOR_ENABLE_CHANGE: NodeSaHpiSensorEnableChangeEventT( "SensorEnableChangeEvent", x.EventDataUnion.SensorEnableChangeEvent ); break; case SAHPI_ET_HOTSWAP: NodeSaHpiHotSwapEventT( "HotSwapEvent", x.EventDataUnion.HotSwapEvent ); break; case SAHPI_ET_WATCHDOG: NodeSaHpiWatchdogEventT( "WatchdogEvent", x.EventDataUnion.WatchdogEvent ); break; case SAHPI_ET_HPI_SW: NodeSaHpiHpiSwEventT( "HpiSwEvent", x.EventDataUnion.HpiSwEvent ); break; case SAHPI_ET_OEM: NodeSaHpiOemEventT( "OemEvent", x.EventDataUnion.OemEvent ); break; case SAHPI_ET_USER: NodeSaHpiUserEventT( "UserEvent", x.EventDataUnion.UserEvent ); break; case SAHPI_ET_DIMI: NodeSaHpiDimiEventT( "DimiEvent", x.EventDataUnion.DimiEvent ); break; case SAHPI_ET_DIMI_UPDATE: NodeSaHpiDimiUpdateEventT( "DimiUpdateEvent", x.EventDataUnion.DimiUpdateEvent ); break; case SAHPI_ET_FUMI: NodeSaHpiFumiEventT( "FumiEvent", x.EventDataUnion.FumiEvent ); break; default: break; } cXmlWriter::EndNode( "EventDataUnion" ); cXmlWriter::EndNode( name ); } openhpi-3.6.1/clients/hpixml/schema.S0000644000175100017510000000036512575647264016527 0ustar mohanmohan.data .globl schema_begin .globl _schema_begin .globl schema_end .globl _schema_end schema_begin: _schema_begin: .incbin SCHEMA schema_end: _schema_end: #if defined(__linux__) && defined(__ELF__) .section .note.GNU-stack, "", %progbits #endif openhpi-3.6.1/clients/hpixml/version.rc0000644000175100017510000000160212575647264017151 0ustar mohanmohan#include LANGUAGE 0x09,0x01 // English(US) VS_VERSION_INFO VERSIONINFO FILEVERSION BINARY_VERSION PRODUCTVERSION BINARY_VERSION FILEFLAGSMASK 0 FILEFLAGS 0 FILEOS VOS_NT_WINDOWS32 FILETYPE VFT_APP FILESUBTYPE VFT2_UNKNOWN BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904E4" // English(US), Multilingual BEGIN VALUE "Comments", "" VALUE "CompanyName", "OpenHPI Community (http://openhpi.org/)" VALUE "FileDescription", "OpenHPI XML Client" VALUE "FileVersion", VERSION VALUE "InternalName", "hpixml" VALUE "LegalCopyright", "OpenHPI is distributed under BSD license" VALUE "OriginalFilename", "hpixml.exe" VALUE "ProductName", "OpenHPI" VALUE "ProductVersion", VERSION END END END openhpi-3.6.1/clients/hpixml/hpi.h0000644000175100017510000000226412575647264016074 0ustar mohanmohan/* -*- c++ -*- * * Copyright (C) 2011, Pigeon Point Systems * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #ifndef HPI_H_EC5AF80F_A79B_49D7_8371_F71504C426A6 #define HPI_H_EC5AF80F_A79B_49D7_8371_F71504C426A6 #include #include class cHpiXmlWriter; /*************************************************** * class cHpi ***************************************************/ class cHpi { public: explicit cHpi( oHpiCommonOptionsT copt ); ~cHpi(); bool Open(); void Close(); bool Dump( cHpiXmlWriter& writer ); private: cHpi( const cHpi& ); cHpi& operator =( const cHpi& ); private: bool m_initialized; bool m_opened; oHpiCommonOptionsT m_copt; SaHpiSessionIdT m_sid; }; #endif /* HPI_H_EC5AF80F_A79B_49D7_8371_F71504C426A6 */ openhpi-3.6.1/clients/hpifan.c0000644000175100017510000002210212575647264015244 0ustar mohanmohan/* -*- linux-c -*- * hpifan.cpp * * Copyright (c) 2003,2004 by FORCE Computers * (C) Copyright Nokia Siemens Networks 2010 * (C) Copyright Ulrich Kleber 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Ulrich Kleber * * Changes: * 10/13/2004 kouzmich porting to HPI B * 09/06/2010 ulikleber New option -D to select domain * 01/02/2011 ulikleber Refactoring to use glib for option parsing and * introduce common options for all clients * */ #include "oh_clients.h" #define OH_SVN_REV "$Revision: 7291 $" static SaHpiBoolT set_new = SAHPI_FALSE; static SaHpiCtrlModeT new_mode = SAHPI_CTRL_MODE_MANUAL; static int new_speed = -1; static gchar *f_speed = NULL; static oHpiCommonOptionsT copt; static GOptionEntry my_options[] = { { "speed", 's', 0, G_OPTION_ARG_STRING, &f_speed, "Set fan speed for ALL fans in domain\n" " speed is a number or \"auto\" for setting fan in auto mode", "auto|nn" }, { NULL } }; static SaErrorT get_fan_speed( SaHpiSessionIdT session_id, SaHpiResourceIdT resource_id, SaHpiCtrlNumT ctrl_num, SaHpiCtrlStateAnalogT *speed, SaHpiCtrlModeT *mode ) { SaHpiCtrlStateT state; if (copt.debug) DBG("get fan speed for resource %u, control %u", resource_id, ctrl_num); SaErrorT rv = saHpiControlGet( session_id, resource_id, ctrl_num, mode, &state ); if ( rv != SA_OK ) { fprintf( stderr, "cannot get fan state: %s!\n", oh_lookup_error( rv ) ); return rv; } if ( state.Type != SAHPI_CTRL_TYPE_ANALOG ) { fprintf( stderr, "cannot handle non analog fan state !\n" ); return SA_ERR_HPI_ERROR; } *speed = state.StateUnion.Analog; return SA_OK; } static SaErrorT set_fan_speed( SaHpiSessionIdT session_id, SaHpiResourceIdT resource_id, SaHpiCtrlNumT ctrl_num, SaHpiCtrlStateAnalogT speed, SaHpiCtrlModeT mode ) { SaErrorT rv; SaHpiCtrlStateT state; state.Type = SAHPI_CTRL_TYPE_ANALOG; state.StateUnion.Analog = speed; if (copt.debug) DBG("set fan speed for resource %u, control %u", resource_id, ctrl_num); rv = saHpiControlSet( session_id, resource_id, ctrl_num, mode, &state ); if ( rv != SA_OK ) { fprintf( stderr, "cannot set fan state: %s!\n", oh_lookup_error( rv ) ); return rv; } return SA_OK; } static int do_fan( SaHpiSessionIdT session_id, SaHpiResourceIdT resource_id, SaHpiRdrT *rdr ) { SaErrorT rv; SaHpiCtrlRecT *ctrl_rec = &rdr->RdrTypeUnion.CtrlRec; SaHpiCtrlModeT ctrl_mode; printf( "\tfan: num %u, id ", ctrl_rec->Num ); oh_print_text ( &rdr->IdString ); printf( "\n" ); if ( ctrl_rec->Type != SAHPI_CTRL_TYPE_ANALOG ) { fprintf( stderr, "cannot handle non analog fan controls !\n" ); return 0; } printf( "\t\tmin %d\n", ctrl_rec->TypeUnion.Analog.Min ); printf( "\t\tmax %d\n", ctrl_rec->TypeUnion.Analog.Max ); printf( "\t\tdefault %d\n", ctrl_rec->TypeUnion.Analog.Default ); SaHpiCtrlStateAnalogT speed; rv = get_fan_speed( session_id, resource_id, ctrl_rec->Num, &speed, &ctrl_mode); if ( rv != SA_OK ) return 0; printf( "\t\tmode %s\n", ctrl_mode == SAHPI_CTRL_MODE_AUTO ? "auto" : "manual" ); printf( "\t\tcurrent %d\n", speed ); if ( set_new == SAHPI_FALSE ) { return 0; } if ( new_mode == SAHPI_CTRL_MODE_AUTO ) { new_speed = speed; } if ( new_speed < ctrl_rec->TypeUnion.Analog.Min || new_speed > ctrl_rec->TypeUnion.Analog.Max ) { fprintf( stderr, "fan speed %d out of range [%d,%d] !\n", new_speed, ctrl_rec->TypeUnion.Analog.Min, ctrl_rec->TypeUnion.Analog.Max ); return 0; } rv = set_fan_speed( session_id, resource_id, ctrl_rec->Num, new_speed, new_mode); if ( rv != SA_OK ) return 0; rv = get_fan_speed( session_id, resource_id, ctrl_rec->Num, &speed, &ctrl_mode); if ( rv != SA_OK ) return 0; printf( "\t\tnew mode %s\n", ctrl_mode == SAHPI_CTRL_MODE_AUTO ? "auto" : "manual" ); printf( "\t\tnew speed %d\n", speed ); return 0; } static int discover_domain( SaHpiSessionIdT session_id ) { /* walk the RPT list */ SaErrorT rv; SaHpiEntryIdT next = SAHPI_FIRST_ENTRY; int found = 0; do { SaHpiRptEntryT entry; SaHpiEntryIdT current = next; rv = saHpiRptEntryGet( session_id, current, &next, &entry ); if ( rv != SA_OK ) { printf( "saHpiRptEntryGet: %s\n", oh_lookup_error( rv ) ); return 1; } // check for control rdr if ( !(entry.ResourceCapabilities & SAHPI_CAPABILITY_RDR) || !(entry.ResourceCapabilities & SAHPI_CAPABILITY_CONTROL) ) continue; /* walk the RDR list for this RPT entry */ SaHpiEntryIdT next_rdr = SAHPI_FIRST_ENTRY; SaHpiResourceIdT resource_id = entry.ResourceId; int epath_out = 1; do { SaHpiEntryIdT current_rdr = next_rdr; SaHpiRdrT rdr; rv = saHpiRdrGet( session_id, resource_id, current_rdr, &next_rdr, &rdr ); if ( rv != SA_OK ) { printf( "saHpiRdrGet: %s\n", oh_lookup_error( rv ) ); return 1; } // check for control if ( rdr.RdrType != SAHPI_CTRL_RDR ) continue; // check for fan if ( rdr.RdrTypeUnion.CtrlRec.OutputType != SAHPI_CTRL_FAN_SPEED ) continue; if ( epath_out ) { oh_print_ep(&entry.ResourceEntity, 0); epath_out = 0; } do_fan( session_id, resource_id, &rdr ); found++; } while( next_rdr != SAHPI_LAST_ENTRY ); } while( next != SAHPI_LAST_ENTRY ); if ( found == 0 ) printf( "no fans found.\n" ); return 0; } int main( int argc, char *argv[] ) { SaErrorT rv; SaHpiSessionIdT sessionid; GOptionContext *context; /* Print version strings */ oh_prog_version(argv[0]); /* Parsing options */ static char usetext[]="- Show \"Fan Control\" management instruments\n " OH_SVN_REV; OHC_PREPARE_REVISION(usetext); context = g_option_context_new (usetext); g_option_context_add_main_entries (context, my_options, NULL); if (!ohc_option_parse(&argc, argv, context, &copt, OHC_ALL_OPTIONS - OHC_ENTITY_PATH_OPTION //TODO: Feature 880127 - OHC_VERBOSE_OPTION )) { // no verbose mode implemented g_option_context_free (context); return 1; } g_option_context_free (context); if (f_speed) { set_new = SAHPI_TRUE; if ( strcmp( f_speed, "auto" ) == 0 ) { new_mode = SAHPI_CTRL_MODE_AUTO; } else if ( strcmp( f_speed, "0" ) == 0 ) { new_speed = 0; } else { new_speed = atoi( f_speed ); if (new_speed == 0) { CRIT ("please enter a valid speed: \"auto\" or a number.\n"); g_free (f_speed); return 1; } } g_free(f_speed); } rv = ohc_session_open_by_option ( &copt, &sessionid); if (rv != SA_OK) return rv; /* * Resource discovery */ if (copt.debug) DBG("saHpiDiscover"); rv = saHpiDiscover(sessionid); if ( rv != SA_OK ) { CRIT( "saHpiDiscover: %s", oh_lookup_error( rv ) ); return rv; } if (copt.debug) DBG("Discovery done"); int rc = discover_domain( sessionid ); rv = saHpiSessionClose( sessionid ); if ( rv != SA_OK ) CRIT( "saHpiSessionClose: %s", oh_lookup_error( rv ) ); return rc; } openhpi-3.6.1/clients/Makefile.mingw320000644000175100017510000000204012575647264016557 0ustar mohanmohaninclude ../Makefile.mingw32.def TARGETS := hpialarms.exe \ hpidomain.exe \ hpiel.exe \ hpievents.exe \ hpifan.exe \ hpigensimdata.exe \ hpiinv.exe \ hpionIBMblade.exe \ hpipower.exe \ hpireset.exe \ hpisensor.exe \ hpisettime.exe \ hpithres.exe \ hpitop.exe \ hpitree.exe \ hpiwdt.exe \ ohdomainlist.exe \ ohhandler.exe \ ohparam.exe OBJS := $(patsubst %.exe, %.o, ${TARGETS}) clients.o version.o DEFS := -DG_LOG_DOMAIN=\"client\" DEFS += -DSAHPI_API="__declspec(dllimport)" INCLUDES := ${GLIB_INCLUDES} -I ../mingw32 -I ../include -I ../utils LIBS := ${GLIB_LIBS} LIBS += -L ../baselib -lopenhpi LIBS += -L ../utils -lopenhpiutils CPPFLAGS += ${DEFS} ${INCLUDES} .PHONY: all clean .SUFFIXES: .rc all : ${TARGETS} %.exe : %.o clients.o version.o ${CXX} -o $@ $^ ${LIBS} .rc.o: ${RC} ${RCFLAGS} $< $@ clean: rm -f ${OBJS} ${TARGETS} clients.o openhpi-3.6.1/clients/hpionIBMblade.c0000644000175100017510000006070512575647264016447 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * 2006 by IBM Corp. * (C) Copyright Ulrich Kleber 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Description: * This client application shows how two (2) openhpi plugins can be used to display * and manage resources of an IBM Blade with Basedboard Management Controller (BMC). * * Both the ipmi and snmp_bc plugin have the same IBM Blade target. Resources from * both plugins are combined to show a complete view of the IBM Blade. * * @@ WARNING @@ RESTRICTIONS @@ WARNING @@ RESTRICTIONS @@ WARNING @@ RESTRICTIONS @@ * * - This client application is designed to run **only** on an IBM Blade with Basedboard * Management Controller (BMC) * * - This Openhpi and application run on (inband) an IBM Blade. * * - Version 0.1 of the application only functions correctly in non-daemon Openhpi env * Openhpi configure parms: ./configure --disabled-daemon --enable-ipmi --enable-snmp_bc * * - openhpi.conf file for this application should look similar to the following * plugin libipmi * * handler libipmi { * entity_root = "{SYSTEM_CHASSIS,2}" * name = "smi" * addr = 0 * } * * plugin libsnmp_bc * * handler libsnmp_bc { * host = "bc.mm.ip.address" * version = "3" * community = "bc_community" * entity_root = "{SYSTEM_CHASSIS,1}" * security_name = "myid" * passphrase = "mypassword" * security_level = "authNoPriv" * auth_type = "MD5" * } * * * @@ WARNING @@ RESTRICTIONS @@ WARNING @@ RESTRICTIONS @@ WARNING @@ RESTRICTIONS @@ * * Authors: * 11/25/2004 kouzmich Changed as new threshold client (first release) * Changes: * 10/13/2006 pdphan Copy from kouzmich's hpithres.c to hpionIBMblade.c * Add functions specifically for * an IBM blade with Baseboard Management Controller (BMC) * 20/01/2011 ulikleber Refactoring to use glib for option parsing and * introduce common options for all clients, * e.g. --domain and --host */ #include "oh_clients.h" #define OH_SVN_REV "$Revision: 6412 $" #define READ_BUF_SIZE 1024 #define MAX_BYTE_COUNT 128 typedef enum { UNKNOWN_TYPE = 0, LOWER_CRIT, LOWER_MAJOR, LOWER_MINOR, UPPER_CRIT, UPPER_MAJOR, UPPER_MINOR, POS_HYST, NEG_HYST } ThresTypes_t; typedef struct { int rpt_ind; int is_value; int modify; SaHpiRdrT Rdr; SaHpiSensorReadingT reading; SaHpiSensorThresholdsT thresholds; } Rdr_t; typedef struct { SaHpiRptEntryT Rpt; int nrdrs; Rdr_t *rdrs; } Rpt_t; typedef enum { COM_UNDEF = 0, COM_EXIT, COM_HELP, COM_RPT, COM_RDR, COM_SENS, COM_MOD, COM_UNDO } Com_enum_t; typedef struct { char *command_name; Com_enum_t type; } Commands_def_t; Commands_def_t Coms[] = { { "quit", COM_EXIT }, { "q", COM_EXIT }, { "exit", COM_EXIT }, { "help", COM_HELP }, { "h", COM_HELP }, { "rpt", COM_RPT }, { "rdr", COM_RDR }, { "sen", COM_SENS }, { "mod", COM_MOD }, { "undo", COM_UNDO }, { NULL, COM_UNDEF } }; Rpt_t *Rpts; int nrpts = 0; long int blade_slot = 0; static oHpiCommonOptionsT copt; SaHpiSessionIdT sessionid; static void *resize_array(void *Ar, int item_size, int *last_num, int add_num) /* Resize array Ar: * item_size - item size (bytes) * last_num - current array size * add_num - new array size = last_num + add_num * Return: new pointer */ { void *R; int new_num = *last_num + add_num; if (new_num <= 0) return((void *)NULL); R = malloc(item_size * new_num); memset(R, 0, item_size * new_num); if (*last_num > 0) { memcpy(R, Ar, *last_num * item_size); free(Ar); } *last_num = new_num; return(R); } static void print_value(SaHpiSensorReadingT *item, char *mes) { char *val; if (item->IsSupported != SAHPI_TRUE) return; switch (item->Type) { case SAHPI_SENSOR_READING_TYPE_INT64: printf("%" PRId64 " %s\n", (int64_t) item->Value.SensorInt64, mes); return; case SAHPI_SENSOR_READING_TYPE_UINT64: printf("%" PRIu64 " %s\n", (uint64_t) item->Value.SensorUint64, mes); return; case SAHPI_SENSOR_READING_TYPE_FLOAT64: printf("%10.3f %s\n", item->Value.SensorFloat64, mes); return; case SAHPI_SENSOR_READING_TYPE_BUFFER: val = (char *)(item->Value.SensorBuffer); if (val != NULL) printf("%s %s\n", val, mes); return; } } static void ShowThres(SaHpiSensorThresholdsT *sensbuff) { printf(" Supported Thresholds:\n"); print_value(&(sensbuff->LowCritical), " Lower Critical Threshold(lc):"); print_value(&(sensbuff->LowMajor), " Lower Major Threshold(la):"); print_value(&(sensbuff->LowMinor), " Lower Minor Threshold(li):"); print_value(&(sensbuff->UpCritical), " Upper Critical Threshold(uc):"); print_value(&(sensbuff->UpMajor), " Upper Major Threshold(ua):"); print_value(&(sensbuff->UpMinor), " Upper Minor Threshold(ui):"); print_value(&(sensbuff->PosThdHysteresis), " Positive Threshold Hysteresis(ph):"); print_value(&(sensbuff->NegThdHysteresis), " Negative Threshold Hysteresis(nh):"); printf("\n"); } static void show_rpt(Rpt_t *Rpt, int ind) { printf("%3d RPT: id = %3d ResourceId = %3d Tag = %s\n", ind, Rpt->Rpt.EntryId, Rpt->Rpt.ResourceId, Rpt->Rpt.ResourceTag.Data); } static int find_rpt_by_id(SaHpiEntryIdT id) { int i; for (i = 0; i < nrpts; i++) if (Rpts[i].Rpt.EntryId == id) return(i); return(-1); } static int select_ep(Rpt_t *Rpt) { SaErrorT rv; unsigned int i; oHpiHandlerIdT this_handler_id; oHpiHandlerInfoT handler_info; GHashTable *config = g_hash_table_new_full( g_str_hash, g_str_equal, g_free, g_free ); rv = oHpiHandlerFind(sessionid, Rpt->Rpt.ResourceId, &this_handler_id); if (rv) { if (copt.debug) DBG("oHpiHandlerFind returns %s", oh_lookup_error(rv)); return(0); } rv = oHpiHandlerInfo(sessionid, this_handler_id, &handler_info, config); if (rv) { if (copt.debug) DBG("oHpiHandlerInfo returns %s", oh_lookup_error(rv)); return(0); } /* If this resource belongs to the ipmi handler, then display it*/ if (strcmp((const char*)handler_info.plugin_name, "libipmi") == 0) { return(1); } else if(strcmp((const char*)handler_info.plugin_name, "libsnmp_bc") == 0) { for (i=0; iRpt.ResourceEntity.Entry[i].EntityType == SAHPI_ENT_PHYSICAL_SLOT) && (Rpt->Rpt.ResourceEntity.Entry[i].EntityLocation == blade_slot)) return(1); } } return 0; } static void show_rpts(char *S) { int i, rpt; i = sscanf(S, "%d", &rpt); if (i == 1) { i = find_rpt_by_id(rpt); if (i >= 0) oh_print_rptentry(&(Rpts[i].Rpt), 1); else printf("No RPT for id: %d\n", rpt); return; } for (i = 0; i < nrpts; i++) { if (select_ep(Rpts+i) == 1) show_rpt(Rpts + i, i); } } static int find_rdr_by_id(Rpt_t *R, SaHpiEntryIdT id) { int i; for (i = 0; i < R->nrdrs; i++) if (R->rdrs[i].Rdr.RecordId == id) return(i); return(-1); } static void show_rdr(Rdr_t *Rdr, int ind) { printf(" %3d RDR: id = %3d Data = %s\n", ind, Rdr->Rdr.RecordId, Rdr->Rdr.IdString.Data); } static void show_sen(Rdr_t *Rdr, int rptid) { if (Rdr->Rdr.RdrType != SAHPI_SENSOR_RDR) return; printf(" RPT id = %3d RDR id = %3d sensornum = %3d Data = %s\n", rptid, Rdr->Rdr.RecordId, Rdr->Rdr.RdrTypeUnion.SensorRec.Num, Rdr->Rdr.IdString.Data); } static void show_sens_for_rpt(Rpt_t *R) { int j; for (j = 0; j < R->nrdrs; j++) { show_sen(R->rdrs + j, R->Rpt.EntryId); } } static void show_rdrs_for_rpt(Rpt_t *R) { int j; for (j = 0; j < R->nrdrs; j++) { show_rdr(R->rdrs + j, j); } } static void show_rdrs(char *S) { int i, j, rpt, rdr; Rpt_t *R; i = sscanf(S, "%d %d", &rpt, &rdr); if (i == 1) { i = find_rpt_by_id(rpt); if (i >= 0) { show_rpt(Rpts + i, i); show_rdrs_for_rpt(Rpts + i); } else printf("No RPT for id: %d\n", rpt); return; } if (i == 2) { i = find_rpt_by_id(rpt); if (i >= 0) { j = find_rdr_by_id(Rpts + i, rdr); if (j >= 0) oh_print_rdr(&(Rpts[i].rdrs[j].Rdr), 2); else printf("No RDR %d for rpt %d\n", rdr, rpt); } else printf("No RPT for id: %d\n", rpt); return; } for (i = 0, R = Rpts; i < nrpts; i++, R++) { if (select_ep(R) == 1) show_rpt(R, i); if (select_ep(R) == 1) show_rdrs_for_rpt(R); } } static void show_reading_value(Rpt_t *Rpt, Rdr_t *R) { SaHpiSensorUnitsT k; SaErrorT rv; char unit[128]; rv = saHpiSensorReadingGet(sessionid, Rpt->Rpt.ResourceId, R->Rdr.RdrTypeUnion.SensorRec.Num, &(R->reading), NULL); if (rv != SA_OK) { CRIT("ERROR: saHpiSensorReadingGet returns %s", oh_lookup_error(rv)); return; }; k = R->Rdr.RdrTypeUnion.SensorRec.DataFormat.BaseUnits; printf("Reading value: "); snprintf(unit, 128, "%s", oh_lookup_sensorunits(k)); print_value(&(R->reading), unit); } static void show_thresholds(Rpt_t *Rpt, Rdr_t *R) { SaHpiSensorThresholdsT buf; SaErrorT rv; rv = saHpiSensorThresholdsGet(sessionid, Rpt->Rpt.ResourceId, R->Rdr.RdrTypeUnion.SensorRec.Num, &buf); if (rv != SA_OK) { CRIT("ERROR: saHpiSensorThresholdsGet returns %s\n", oh_lookup_error(rv)); return; }; printf(" Thresholds:\n"); ShowThres(&buf); if (R->is_value == 0) { R->thresholds = buf; R->is_value = 1; } } static int find_sensor_by_num(Rpt_t *R, int num) { int i; for (i = 0; i < R->nrdrs; i++) { if (R->rdrs[i].Rdr.RdrType == SAHPI_SENSOR_RDR) { if (R->rdrs[i].Rdr.RdrTypeUnion.SensorRec.Num == num) return(i); } }; return(-1); } static void show_sens(char *S) { int i, j, rpt, num; Rpt_t *Rpt; Rdr_t *Rdr; i = sscanf(S, "%d %d", &rpt, &num); if (i == 1) { i = find_rpt_by_id(rpt); if (i >= 0) show_sens_for_rpt(Rpts + i); return; } if (i == 2) { i = find_rpt_by_id(rpt); if (i < 0) { printf("No RPT for id: %d\n", rpt); return; }; j = find_sensor_by_num(Rpts + i, num); if (j < 0) { printf("No sensor %d for rpt %d\n", num, rpt); return; }; oh_print_rdr(&(Rpts[i].rdrs[j].Rdr), 2); show_reading_value(Rpts + i, Rpts[i].rdrs + j); show_thresholds(Rpts + i, Rpts[i].rdrs + j); return; } for (i = 0, Rpt = Rpts; i < nrpts; i++, Rpt++) { if (select_ep(Rpt) == 1) { for (j = 0, Rdr = Rpt->rdrs; j < Rpt->nrdrs; Rdr++, j++) show_sen(Rdr, Rpt->Rpt.EntryId); } } } static int get_number(char *mes, int *res) { char buf[READ_BUF_SIZE]; char *ret ; printf("%s", mes); ret = fgets(buf, READ_BUF_SIZE, stdin); if (ret) return (sscanf(buf, "%d", res)); else return -1; } static void set_thres_value(SaHpiSensorReadingT *R, double val) { if (R->IsSupported == 0) { printf("ERROR: this threshold isn't supported\n"); return; }; R->Value.SensorFloat64 = val; } static void mod_sen(void) { int i, rpt, rdr, num; char buf[READ_BUF_SIZE], *S; Rpt_t *Rpt; Rdr_t *Rdr; SaHpiSensorThresholdsT thres; SaErrorT rv; ThresTypes_t type = UNKNOWN_TYPE; float f; SaHpiEventT event; i = get_number("RPT number: ", &rpt); if (i != 1) { printf("ERROR: no RPT number\n"); return; }; i = find_rpt_by_id(rpt); if (i < 0) { printf("ERROR: invalid RPT number\n"); return; }; rpt = i; Rpt = Rpts + rpt; show_sens_for_rpt(Rpt); i = get_number("Sensor number: ", &num); if (i != 1) { printf("ERROR: no Sensor number\n"); return; }; rdr = find_sensor_by_num(Rpt, num); if (rdr < 0) { printf("ERROR: invalid sensor number\n"); return; }; Rdr = Rpt->rdrs + rdr; oh_print_rdr(&(Rdr->Rdr), 2); show_reading_value(Rpt, Rdr); rv = saHpiSensorThresholdsGet(sessionid, Rpt->Rpt.ResourceId, Rdr->Rdr.RdrTypeUnion.SensorRec.Num, &thres); if (rv != SA_OK) { printf("ERROR: %s\n", oh_lookup_error(rv)); return; }; printf(" Thresholds:\n"); ShowThres(&thres); if (Rdr->is_value == 0) { Rdr->thresholds = thres; Rdr->is_value = 1; }; printf("threshold type (lc, la, li, uc, ua, ui, ph, nh): "); S = fgets(buf, READ_BUF_SIZE, stdin); while (*S == ' ') S++; if (strlen(S) < 2) { printf("ERROR: invalid threshold type: %s\n", S); return; }; if (strncmp(S, "lc", 2) == 0) type = LOWER_CRIT; if (strncmp(S, "la", 2) == 0) type = LOWER_MAJOR; if (strncmp(S, "li", 2) == 0) type = LOWER_MINOR; if (strncmp(S, "uc", 2) == 0) type = UPPER_CRIT; if (strncmp(S, "ua", 2) == 0) type = UPPER_MAJOR; if (strncmp(S, "ui", 2) == 0) type = UPPER_MINOR; if (strncmp(S, "ph", 2) == 0) type = POS_HYST; if (strncmp(S, "nh", 2) == 0) type = NEG_HYST; if (type == UNKNOWN_TYPE) { printf("ERROR: unknown threshold type: %s\n", S); return; }; printf("new value: "); S = fgets(buf, READ_BUF_SIZE, stdin); i = sscanf(buf, "%f", &f); if (i == 0) { printf("ERROR: no value\n"); return; }; switch (type) { case LOWER_CRIT: set_thres_value(&(thres.LowCritical), (double)f); break; case LOWER_MAJOR: set_thres_value(&(thres.LowMajor), (double)f); break; case LOWER_MINOR: set_thres_value(&(thres.LowMinor), (double)f); break; case UPPER_CRIT: set_thres_value(&(thres.UpCritical), (double)f); break; case UPPER_MAJOR: set_thres_value(&(thres.UpMajor), (double)f); break; case UPPER_MINOR: set_thres_value(&(thres.UpMinor), (double)f); break; case POS_HYST: set_thres_value(&(thres.PosThdHysteresis), (double)f); break; case NEG_HYST: set_thres_value(&(thres.NegThdHysteresis), (double)f); break; default: printf("ERROR: unknown threshold\n"); }; printf("\n Nem threshold:\n"); ShowThres(&thres); printf("Is it correct (yes, no)?:"); S = fgets(buf, READ_BUF_SIZE, stdin); while (*S == ' ') S++; if (strncmp(S, "yes", 3) != 0) return; rv = saHpiSensorThresholdsSet(sessionid, Rpt->Rpt.ResourceId, Rdr->Rdr.RdrTypeUnion.SensorRec.Num, &thres); if (rv != SA_OK) { CRIT("ERROR: saHpiSensorThresholdsSet: %s", oh_lookup_error(rv)); return; }; Rdr->modify = 1; for (i = 0; i < 10; i++) { rv = saHpiEventGet(sessionid, SAHPI_TIMEOUT_IMMEDIATE, &event, NULL, NULL, NULL); if (rv == SA_OK) break; if (copt.debug) DBG("sleep before saHpiEventGet\n"); g_usleep(G_USEC_PER_SEC); }; saHpiSensorThresholdsGet(sessionid, Rpt->Rpt.ResourceId, Rdr->Rdr.RdrTypeUnion.SensorRec.Num, &thres); printf("Current thresholds:\n"); ShowThres(&thres); } static void undo(void) { int i, j; Rpt_t *Rpt; Rdr_t *Rdr; for (i = 0, Rpt = Rpts; i < nrpts; i++, Rpt++) { for (j = 0, Rdr = Rpt->rdrs; j < Rpt->nrdrs; j++, Rdr++) { if (Rdr->modify == 0) continue; saHpiSensorThresholdsSet(sessionid, Rpt->Rpt.ResourceId, Rdr->Rdr.RdrTypeUnion.SensorRec.Num, &(Rdr->thresholds)); Rdr->modify = 0; } } } static void get_rpts(void) { SaHpiEntryIdT rptentryid, nextrptentryid; SaErrorT rv; SaHpiRptEntryT rptentry; int n; rptentryid = SAHPI_FIRST_ENTRY; while (rptentryid != SAHPI_LAST_ENTRY) { rv = saHpiRptEntryGet(sessionid, rptentryid, &nextrptentryid, &rptentry); if (rv != SA_OK) break; n = nrpts; Rpts = (Rpt_t *)resize_array(Rpts, sizeof(Rpt_t), &nrpts, 1); rptentry.ResourceTag.Data[rptentry.ResourceTag.DataLength] = 0; Rpts[n].Rpt = rptentry; rptentryid = nextrptentryid; } } static void get_rdrs(Rpt_t *Rpt) { SaHpiRdrT rdr; SaErrorT rv; int n; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiResourceIdT resourceid; entryid = SAHPI_FIRST_ENTRY; while (entryid !=SAHPI_LAST_ENTRY) { resourceid = Rpt->Rpt.ResourceId; rv = saHpiRdrGet(sessionid, resourceid, entryid, &nextentryid, &rdr); if (rv != SA_OK) break; n = Rpt->nrdrs; Rpt->rdrs = (Rdr_t *)resize_array(Rpt->rdrs, sizeof(Rdr_t), &(Rpt->nrdrs), 1); rdr.IdString.Data[rdr.IdString.DataLength] = 0; Rpt->rdrs[n].Rdr = rdr; entryid = nextentryid; } } static void help(void) { printf("Available commands:\n"); printf(" exit, quit, q - exit\n"); printf(" help, h - this instruction\n"); printf(" rpt - show all RPT entries\n"); printf(" rpt - show #id RPT entry\n"); printf(" rdr - show all RDR entries\n"); printf(" rdr - show RDRs entries for #rptid\n"); printf(" rdr - show #rdrid RDR entry for #rptid\n"); printf(" sen - show all sensors\n"); printf(" sen - show sensors for #rptid\n"); printf(" sen - show #num sensor for #rptid\n"); printf(" mod - modify thresholds\n"); printf(" undo - delete all changes\n"); } static Com_enum_t find_command(char *S) { int i; for (i = 0;; i++) { if (Coms[i].command_name == (char *)NULL) return(COM_UNDEF); if (strcmp(Coms[i].command_name, S) == 0) return(Coms[i].type); } } static int parse_command(char *Str) { int len; char *S, *S1; Com_enum_t com; S = Str; while (*S != 0) { if ((*S == '\t') || (*S == '\n')) *S = ' '; S++; }; S = Str; while (*S == ' ') S++; len = strlen(S); if (len == 0) return(0); S1 = S; while ((*S1 != 0) && (*S1 != ' ')) S1++; if (*S1 != 0) *S1++ = 0; com = find_command(S); switch (com) { case COM_UNDEF: printf("Invalid command: %s\n", S); help(); break; case COM_EXIT: return(-1); case COM_RPT: show_rpts(S1); break; case COM_RDR: show_rdrs(S1); break; case COM_SENS: show_sens(S1); break; case COM_MOD: mod_sen(); break; case COM_UNDO: undo(); break; case COM_HELP: help(); break; }; return(0); } static SaErrorT hpiIBMspecial_find_blade_slot(void) { #define NETFN "0x2e" // IPMI OEM command #define CMD_READ_VPD "0x0a" // Read Legacy Format VPD command #define CMD_WRITE_VPD "0x09" // Write Legacy Format VPD command #define IANA "0xd0 0x51 0x00" // x-Series IANA #define IANA_OLD "0x02 0x00 0x00" // IBM IANA used by some older blades (e.g. 8843) #define DEV_ID "0x10" // #define OFFSET_BLOCK2 "0xca 0x00" // VPD block 2 offset in VPD block 0 // (contains the number of the most recent log entry) char shell_command[MAX_BYTE_COUNT]; char VPD_DATA[MAX_BYTE_COUNT]; char str2[3]; char str[5]; int sys_rv = 0; FILE *Fp = NULL; unsigned long int CH_SLOT = 0, BLOCK2_BASE = 0, ENTRY_NUM = 0, ENTRY_NUM_BASE = 0, LOG_BASE = 0, ENTRY_BASE = 0, ENTRY_BASE_LSB = 0, ENTRY_BASE_MSB = 0, ENTRY_NUM_BASE_LSB = 0, ENTRY_NUM_BASE_MSB = 0; int byte_count; char BYTE_READ; char *USE_IANA; memset(str2, '\0', 3); memset(str, '\0',5); /* printf("Find offset to VPD Block 2.\n"); */ USE_IANA = IANA; snprintf(shell_command, MAX_BYTE_COUNT, "ipmitool raw %s %s %s %s %s 0x02 > /tmp/hpiS01\n", NETFN, CMD_READ_VPD, USE_IANA, OFFSET_BLOCK2, DEV_ID); sys_rv = system(shell_command); if (sys_rv != 0) { USE_IANA = IANA_OLD; snprintf(shell_command, MAX_BYTE_COUNT, "ipmitool raw %s %s %s %s %s 0x02 > /tmp/hpiS01\n", NETFN, CMD_READ_VPD, USE_IANA, OFFSET_BLOCK2, DEV_ID); sys_rv = system(shell_command); if (sys_rv != 0) { printf("\"Finding offset to VPD Block 2\" has FAILED.\n"); return(-1); } } Fp = fopen("/tmp/hpiS01", "r"); byte_count = 0; while(fscanf(Fp, "%c", &BYTE_READ) != -1){ if (BYTE_READ != 0x20) VPD_DATA[byte_count++]=BYTE_READ; } fclose(Fp); if (byte_count >= 3) { memcpy(&str, &VPD_DATA[6], 4); BLOCK2_BASE = strtol(str,NULL, 16); } else { printf("Can not find BLOCK2_BASE.\n"); return(-1); } /* Find offsets to History Log and History Log Entry Pointer in Block 2 #define OFFSET_LOG "108" // History Log offset in VPD block 2 #define OFFSET_LOG_ENTRY_NUM "107" // History Log Entry Pointer offset in VPD block 2 */ LOG_BASE = BLOCK2_BASE + 0x108; ENTRY_NUM_BASE = BLOCK2_BASE + 0x107; /* # Find most recent entry in History Log # Convert log entry offset to LSB and MSB for Little Endian */ ENTRY_NUM_BASE_LSB = (ENTRY_NUM_BASE & 0x00FF); ENTRY_NUM_BASE_MSB = (ENTRY_NUM_BASE & 0xFF00); ENTRY_NUM_BASE_MSB = (ENTRY_NUM_BASE_MSB >> 8); /* X=`ipmitool raw $NETFN $CMD_READ_VPD $IANA $ENTRY_NUM_BASE_LSB $ENTRY_NUM_BASE_MSB $DEV_ID 0x 01` */ snprintf(shell_command, MAX_BYTE_COUNT, "ipmitool raw %s %s %s 0x%x 0x%x %s 0x01 > /tmp/hpiS02\n", NETFN, CMD_READ_VPD, USE_IANA, (unsigned int)ENTRY_NUM_BASE_LSB, (unsigned int)ENTRY_NUM_BASE_MSB, DEV_ID); sys_rv = system(shell_command); if (sys_rv != 0) { printf("\"Find most recent entry\" has FAILED.\n"); return(-1); } Fp = fopen("/tmp/hpiS02", "r"); byte_count = 0; while(fscanf(Fp, "%c", &BYTE_READ) != -1){ if (BYTE_READ != 0x20) VPD_DATA[byte_count++]=BYTE_READ; } fclose(Fp); if (byte_count >= 3) { memcpy(&str2, &VPD_DATA[6], 2); ENTRY_NUM= strtol(str2,NULL,16); } /* # Find Entry Offset - Each entry is 26 bytes */ ENTRY_BASE = LOG_BASE + (ENTRY_NUM * 0x1A); /* # Read Most recent log entry and parse out information */ ENTRY_BASE_LSB = (ENTRY_BASE & 0x00FF); ENTRY_BASE_MSB = (ENTRY_BASE & 0xFF00); ENTRY_BASE_MSB = (ENTRY_BASE_MSB >> 8); /* X=`ipmitool raw $NETFN $CMD_READ_VPD $IANA $ENTRY_BASE_LSB $ENTRY_BASE_MSB $DEV_ID 0x1a` */ snprintf(shell_command, MAX_BYTE_COUNT, "ipmitool raw %s %s %s 0x%x 0x%x %s 0x1a > /tmp/hpiS02\n", NETFN, CMD_READ_VPD, USE_IANA, (unsigned int)ENTRY_BASE_LSB, (unsigned int)ENTRY_BASE_MSB, DEV_ID); sys_rv = system(shell_command); if (sys_rv != 0) { printf("\"Read Most recent log entry\" has FAILED.\n"); return(-1); } Fp = fopen("/tmp/hpiS02", "r"); byte_count = 0; while(fscanf(Fp, "%c", &BYTE_READ) != -1){ if (BYTE_READ != 0x20) VPD_DATA[byte_count++]=BYTE_READ; } fclose(Fp); /* CH_SLOT=`echo $X | gawk '{i=20; x=x $i; print x}'` */ if (byte_count >= 3) { memcpy(&str2, &VPD_DATA[39], 2); CH_SLOT= strtol(str2,NULL, 16); } else { CH_SLOT= 0; printf("\"Read Most recent log entry\" has FAILED.\n"); return(-1); } printf("Blade is installed in slot number %d.\n", (int)CH_SLOT); blade_slot = CH_SLOT; return(SA_OK); } int main(int argc, char **argv) { int i; SaErrorT rv; char buf[READ_BUF_SIZE]; char *S; GOptionContext *context; /* Print version strings */ oh_prog_version(argv[0]); /* Parsing options */ static char usetext[]="- Shows how to use two (2) openhpi\n " "plugins to display and manage resources of an IBM Blade\n " "with Basedboard Management Controller (BMC)\n " OH_SVN_REV; OHC_PREPARE_REVISION(usetext); context = g_option_context_new (usetext); if (!ohc_option_parse(&argc, argv, context, &copt, OHC_ALL_OPTIONS - OHC_ENTITY_PATH_OPTION // not implemented - OHC_VERBOSE_OPTION )) { // no verbose mode implemented g_option_context_free (context); return 1; } g_option_context_free (context); rv = hpiIBMspecial_find_blade_slot(); if (rv != SA_OK) { CRIT("ipmitool can not find slot number in which this blade resides."); return(-1); } rv = ohc_session_open_by_option ( &copt, &sessionid); if (rv != SA_OK) return rv; rv = saHpiDiscover(sessionid); if (copt.debug) DBG("saHpiDiscover: %s", oh_lookup_error(rv)); rv = saHpiSubscribe(sessionid); if (rv != SA_OK) { CRIT( "saHpiSubscribe error %d",rv); return rv; } /* make the RPT list */ get_rpts(); /* get rdrs for the RPT list */ for (i = 0; i < nrpts; i++) get_rdrs(Rpts + i); help(); for (;;) { printf("==> "); S = fgets(buf, READ_BUF_SIZE, stdin); if (parse_command(S) < 0) break; }; rv = saHpiSessionClose(sessionid); return(0); } /* end hpionIBMblade.c */ openhpi-3.6.1/clients/hpialarms.c0000644000175100017510000002412412575647264015765 0ustar mohanmohan/* * Copyright (c) 2003 Intel Corporation. * (C) Copyright IBM Corp 2007 * (C) Copyright Nokia Siemens Networks 2010 * (C) Copyright Ulrich Kleber 2011 * * 04/15/03 Andy Cress - created * 04/17/03 Andy Cress - mods for resourceid, first good run * 04/23/03 Andy Cress - first run with good ControlStateGet * 04/24/03 Andy Cress - v0.5 with good ControlStateSet * 04/29/03 Andy Cress - v0.6 changed control.oem values * 06/06/03 Andy Cress - v1.0 check for Analog States * 02/23/04 Andy Cress - v1.1 add checking/setting disk LEDs * 10/13/04 Andy Cress - v1.2 add ifdefs for HPI_A & HPI_B, added -d/raw * < ...for more changes look at svn logs... > * 09/06/2010 ulikleber New option -D to select domain * 01/02/2011 ulikleber Refactoring to use glib for option parsing and * introduce common options for all clients * * Author(s): * Andy Cress * Renier Morales * Ulrich Kleber */ /*M* Copyright (c) 2003, Intel Corporation All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: a.. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. b.. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. c.. Neither the name of Intel Corporation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *M*/ #include "oh_clients.h" #define OH_SVN_REV "$Revision: 7291 $" #define uchar unsigned char #define SAHPI_OEM_ALARM_LED 0x10 #define SAHPI_OEM_DISK_LED 0x20 static char *states[3] = {"off", "ON ", "unknown" }; static gint fid = -1; // set chassis id #define NLEDS 6 static gint leds[NLEDS] = { /* rdr.RdrTypeUnion.CtrlRec.Oem is an index for this */ /*pwr*/ -1, /*crt*/ -1, /*maj*/ -1, /*min*/ -1, /*diska*/ -1, /*diskb*/ -1}; static gboolean fall = FALSE; static oHpiCommonOptionsT copt; static GOptionEntry my_options[] = { { "critical", 'c', 0, G_OPTION_ARG_INT, &leds[1], "Set critical alarm on|off", "1|0" }, { "major", 'm', 0, G_OPTION_ARG_INT, &leds[2], "Set major alarm on|off", "1|0" }, { "minor", 'n', 0, G_OPTION_ARG_INT, &leds[3], "Set minor alarm on|off", "1|0" }, { "diska", 'a', 0, G_OPTION_ARG_INT, &leds[4], "Set diska alarm on|off", "1|0" }, { "diskb", 'b', 0, G_OPTION_ARG_INT, &leds[5], "Set diskb alarm on|off", "1|0" }, { "power", 'p', 0, G_OPTION_ARG_INT, &leds[0], "Set power alarm on|off", "1|0" }, { "chassisid", 'i', 0, G_OPTION_ARG_INT, &fid, "Set chassis id on for n seconds", "n" }, { "all", 'o', 0, G_OPTION_ARG_NONE, &fall, "Set all alarms off", NULL }, { NULL } }; int main(int argc, char **argv) { SaErrorT rv; SaHpiSessionIdT sessionid; SaHpiRptEntryT rptentry; SaHpiEntryIdT rptentryid; SaHpiEntryIdT nextrptentryid; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiResourceIdT resourceid; SaHpiRdrT rdr; SaHpiCtrlTypeT ctltype; SaHpiCtrlNumT ctlnum; SaHpiCtrlStateT ctlstate; //int raw_val = 0; Option d for raw alarm byte not implemented int b, j; GOptionContext *context; /* Print version strings */ oh_prog_version(argv[0]); /* Parsing options */ static char usetext[]="- Control alarm management instruments\n " OH_SVN_REV; OHC_PREPARE_REVISION(usetext); context = g_option_context_new (usetext); g_option_context_add_main_entries (context, my_options, NULL); if (!ohc_option_parse(&argc, argv, context, &copt, OHC_ALL_OPTIONS - OHC_ENTITY_PATH_OPTION //TODO: Feature 880127 ? - OHC_VERBOSE_OPTION )) { // no verbose mode implemented g_option_context_free (context); return 1; } g_option_context_free (context); if (fall) { /* set all alarms off */ fid=0; for (j = 0; j < NLEDS; j++) leds[j] = 0; } rv = ohc_session_open_by_option ( &copt, &sessionid); if (rv != SA_OK) return rv; rv = saHpiDiscover(sessionid); if (copt.debug) DBG("saHpiDiscover complete, rv = %d",rv); /* walk the RPT list */ rptentryid = SAHPI_FIRST_ENTRY; while ((rv == SA_OK) && (rptentryid != SAHPI_LAST_ENTRY)) { rv = saHpiRptEntryGet(sessionid,rptentryid,&nextrptentryid,&rptentry); if (rv != SA_OK) DBG("RptEntryGet: rv = %d\n",rv); if (rv == SA_OK) { /* Walk the RDR list for this RPT entry */ entryid = SAHPI_FIRST_ENTRY; resourceid = rptentry.ResourceId; /* * Don't stringify here, since OpenHPI returns a valid string, but * a DataLength of zero here (for processor, bios). * rptentry.ResourceTag.Data[rptentry.ResourceTag.DataLength] = 0; */ //if (copt.debug) printf("rptentry[%u] resourceid=%u tlen=%u tag: %s\n", entryid, resourceid, rptentry.ResourceTag.DataLength, rptentry.ResourceTag.Data); while ((rv == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) { rv = saHpiRdrGet(sessionid,resourceid, entryid,&nextentryid, &rdr); if (copt.debug) DBG("saHpiRdrGet[%u] rv = %d",entryid,rv); if (rv == SA_OK) { if (rdr.RdrType == SAHPI_CTRL_RDR) { /*type 1 includes alarm LEDs*/ ctlnum = rdr.RdrTypeUnion.CtrlRec.Num; rdr.IdString.Data[rdr.IdString.DataLength] = 0; if (copt.debug) DBG("Ctl[%u]: %u %u %s", ctlnum, rdr.RdrTypeUnion.CtrlRec.Type, rdr.RdrTypeUnion.CtrlRec.OutputType, rdr.IdString.Data); rv = saHpiControlTypeGet(sessionid,resourceid, ctlnum,&ctltype); if (copt.debug) DBG("saHpiControlTypeGet[%u] rv = %d, type = %u", ctlnum,rv,ctltype); rv = saHpiControlGet(sessionid, resourceid, ctlnum, NULL, &ctlstate); if (copt.debug) DBG("saHpiControlStateGet[%u] rv = %d v = %x", ctlnum,rv,ctlstate.StateUnion.Digital); printf("RDR[%u]: ctltype=%u:%u oem=%02x %s \t", rdr.RecordId, rdr.RdrTypeUnion.CtrlRec.Type, rdr.RdrTypeUnion.CtrlRec.OutputType, rdr.RdrTypeUnion.CtrlRec.Oem, rdr.IdString.Data); if (rv == SA_OK) { if (ctlstate.Type == SAHPI_CTRL_TYPE_ANALOG) b = 2; /*Identify*/ else { b = ctlstate.StateUnion.Digital; if (b > 2) b = 2; } printf("state = %s\n",states[b]); } else { printf("\n"); } if (rdr.RdrTypeUnion.CtrlRec.Type == SAHPI_CTRL_TYPE_ANALOG && rdr.RdrTypeUnion.CtrlRec.OutputType == SAHPI_CTRL_LED) { /* This is a Chassis Identify */ if (fid>=0) { printf("Setting ID led to %u sec\n", fid); ctlstate.Type = SAHPI_CTRL_TYPE_ANALOG; ctlstate.StateUnion.Analog = fid; rv = saHpiControlSet(sessionid, resourceid, ctlnum, SAHPI_CTRL_MODE_MANUAL, &ctlstate); printf("saHpiControlStateSet[%u] rv = %d\n",ctlnum,rv); } } else if (rdr.RdrTypeUnion.CtrlRec.Type == SAHPI_CTRL_TYPE_DIGITAL && (rdr.RdrTypeUnion.CtrlRec.Oem & 0xf0) == SAHPI_OEM_ALARM_LED && rdr.RdrTypeUnion.CtrlRec.OutputType == SAHPI_CTRL_LED) { /* this is an alarm LED */ b = (uchar)rdr.RdrTypeUnion.CtrlRec.Oem & 0x0f; if ((b < NLEDS) && leds[b]>=0) { printf("Setting alarm led %u to %u\n",b,leds[b]); if (leds[b] == 0) ctlstate.StateUnion.Digital = SAHPI_CTRL_STATE_OFF; else ctlstate.StateUnion.Digital = SAHPI_CTRL_STATE_ON; rv = saHpiControlSet(sessionid, resourceid, ctlnum, SAHPI_CTRL_MODE_MANUAL, &ctlstate); /* if (copt.debug) */ printf("saHpiControlStateSet[%u] rv = %d\n",ctlnum,rv); } } else if (rdr.RdrTypeUnion.CtrlRec.Type == SAHPI_CTRL_TYPE_DIGITAL && (rdr.RdrTypeUnion.CtrlRec.Oem & 0xf0) == SAHPI_OEM_DISK_LED && rdr.RdrTypeUnion.CtrlRec.OutputType == SAHPI_CTRL_LED) { /* this is a disk LED */ b = (uchar)rdr.RdrTypeUnion.CtrlRec.Oem & 0x0f; if ((b < NLEDS) && leds[b]>=0) { printf("Setting disk led %u to %u\n",b,leds[b]); if (leds[b] == 0) ctlstate.StateUnion.Digital = SAHPI_CTRL_STATE_OFF; else ctlstate.StateUnion.Digital = SAHPI_CTRL_STATE_ON; rv = saHpiControlSet(sessionid, resourceid, ctlnum, SAHPI_CTRL_MODE_MANUAL, &ctlstate); printf("saHpiControlStateSet[%u] rv = %d\n",ctlnum,rv); } } rv = SA_OK; /* ignore errors & continue */ } j++; entryid = nextentryid; } } rptentryid = nextrptentryid; } } rv = saHpiSessionClose(sessionid); return(0); } /*-----------Sample output----------------------------------- hpialarmpanel ver 0.6 RptInfo: UpdateCount = 5, UpdateTime = 8a2dc6c0 rptentry[0] resourceid=1 tag: Mullins RDR[45]: ctltype=2:1 oem=0 Chassis Identify Control RDR[48]: ctltype=0:1 oem=10 Front Panel Power Alarm LED state = off RDR[51]: ctltype=0:1 oem=13 Front Panel Minor Alarm LED state = ON RDR[46]: ctltype=0:0 oem=0 Cold Reset Control RDR[49]: ctltype=0:1 oem=11 Front Panel Critical Alarm LED state = off RDR[50]: ctltype=0:1 oem=12 Front Panel Major Alarm LED state = off *-----------------------------------------------------------*/ /* end hpialarmpanel.c */ openhpi-3.6.1/clients/hpicrypt.c0000644000175100017510000001102612575647264015644 0ustar mohanmohan/* * * Copyright (C) 2013, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Mohan Devarajulu */ #include #define OH_SVN_REV "$Revision: 1.3 $" /************************************************************ * Globals here ***********************************************************/ static int hpicrypt_usage(char* program_name) { printf("Usage:\n"); printf("%s [-d] -c config file\n",program_name); printf("-d for decrypting\n"); printf("-c config file to encrypt or decrypt\n"); printf("backup the file before encrypting\n"); printf("\n"); return(0); } int main(int argc, char *argv[]) { char *file_path = NULL; char *file_contents = NULL; char *program = argv[0]; int crypt_type = OHPI_ENCRYPT; while ((argc > 1) && (argv[1][0] == '-')) { switch (argv[1][1]) { case 'd': crypt_type = OHPI_DECRYPT; break; case 'c': ++argv; --argc; file_path=argv[1]; break; default: printf("Wrong Argument: %s\n", argv[1]); hpicrypt_usage(program); return(1); } ++argv; --argc; } if ((argc > 1) || (file_path == NULL)) { hpicrypt_usage(program); return(1); } /* * Right now all the file handling is done in oh_crypt function. * The file_contents could be used to move the file handling here. */ if ( crypt_type ==OHPI_ENCRYPT ) { file_contents=oh_crypt(file_path, crypt_type); if (file_contents == NULL) { CRIT("The encryption of %s failed\n",file_path); return(1); } printf("File was encrypted and overwritten. If you like a backup,\n"); printf("please decrypt with hpicrypt -d and save the text file securely\n"); g_free(file_contents); file_contents=NULL; return(0); } else if ( crypt_type == OHPI_DECRYPT ) { file_contents = oh_crypt(file_path, crypt_type); if (file_contents == NULL) { CRIT("The decryption of %s failed\n",file_path); return(1); } printf("%s",file_contents); printf("# Redirect above contents to a file to add/remove/edit handlers.\n"); printf("# Last two comment lines could be removed before saving.\n"); g_free(file_contents); file_contents=NULL; return(0); } else { printf("Unknown crypt type %d. %d and %d are only valid\n",crypt_type, OHPI_ENCRYPT, OHPI_DECRYPT); return(1); } return(0); } openhpi-3.6.1/clients/hpisettime.c0000644000175100017510000001744412575647264016167 0ustar mohanmohan/* -*- linux-c -*- * * * (C) Copyright IBM Corp 2003,2004 * (C) Copyright Nokia Siemens Networks 2010 * (C) Copyright Ulrich Kleber 2011 * * Authors: * Peter D.Phan pdphan@users.sourceforge.net * Ulrich Kleber * * 01/13/2004 pdphan module created * Change clock for event log on IBM Blade Center E. * 03/10/2004 pdphan Remove reference to IBM Blade Center. * 10/12/2004 kouzmich porting to HPI B. * check month, day, year, hours, minutes and seconds * for correctness * 07/06/2010 ulikleber New option -D to select domain * 20/01/2011 ulikleber Refactoring to use glib for option parsing and * introduce common options for all clients */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: a.. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. b.. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. c.. Neither the name of Intel Corporation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "oh_clients.h" #define OH_SVN_REV "$Revision: 7633 $" static gchar *findate = NULL; static gchar *fintime = NULL; static oHpiCommonOptionsT copt; static GOptionEntry my_options[] = { { "date", 'd', 0, G_OPTION_ARG_STRING, &findate, "New date", "mm/dd/yyyy" }, { "time", 't', 0, G_OPTION_ARG_STRING, &fintime, "New time of day in 24-hr format", "24:12:60" }, { NULL } }; #define EXIT1 g_free(findate);g_free(fintime);return 1; int main(int argc, char **argv) { int month, day, year; int day_array[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; struct tm new_tm_time; SaErrorT rv; SaHpiSessionIdT sessionid; SaHpiDomainInfoT domainInfo; SaHpiRptEntryT rptentry; SaHpiEntryIdT rptentryid; SaHpiEntryIdT nextrptentryid; SaHpiResourceIdT resourceid; SaHpiTimeT oldtime; SaHpiTimeT newtime; SaHpiTimeT readbacktime; SaHpiTextBufferT buffer; GOptionContext *context; /* Print version strings */ oh_prog_version(argv[0]); /* Parsing options */ static char usetext[]="- Exercises Event Log clock APIs.\n " OH_SVN_REV; OHC_PREPARE_REVISION(usetext); context = g_option_context_new (usetext); g_option_context_add_main_entries (context, my_options, NULL); if (!ohc_option_parse(&argc, argv, context, &copt, OHC_ALL_OPTIONS - OHC_ENTITY_PATH_OPTION // not applicable - OHC_VERBOSE_OPTION )) { // no verbose mode g_option_context_free (context); EXIT1; } g_option_context_free (context); if ( !findate || !fintime) { CRIT("Please enter date and time to be set, or try --help."); EXIT1; } if (findate) { if (copt.debug) printf("New date to be set: %s\n",findate); if (sscanf(findate,"%2d/%2d/%4d", &month, &day, &year) != 3) { CRIT("%s: Invalid date", argv[0]); EXIT1; } /* check month, day and year for correctness */ if ((month < 1) || (month > 12)) { CRIT("%s: Month out of range: (%d)", argv[0], month); EXIT1; }; if (year < 1900) { CRIT("%s: Year out of range: (%d)", argv[0], year); EXIT1; }; month--; if (month == 1) { /* if the given year is a leap year */ if ((((year % 4) == 0) && ((year % 100) != 0)) || ((year % 400) == 0)) day_array[1] = 29; }; if ((day < 1) || (day > day_array[month])) { CRIT("%s: Day out of range: (%d)", argv[0], day); EXIT1; }; new_tm_time.tm_mon = month; new_tm_time.tm_mday = day; new_tm_time.tm_year = year - 1900; } if (fintime) { if (copt.debug) DBG("New time to be set: %s",fintime); if (sscanf(fintime,"%2d:%2d:%2d", &new_tm_time.tm_hour, &new_tm_time.tm_min, &new_tm_time.tm_sec) != 3) { CRIT("%s: Invalid time", argv[0]); EXIT1; } /* check hours, minutes and seconds for correctness */ if ((new_tm_time.tm_hour < 0) || (new_tm_time.tm_hour > 24)) { CRIT("%s: Hours out of range: (%d)", argv[0], new_tm_time.tm_hour); EXIT1; }; if ((new_tm_time.tm_min < 0) || (new_tm_time.tm_min > 60)) { CRIT("%s: Minutes out of range: (%d)", argv[0], new_tm_time.tm_min); EXIT1; }; if ((new_tm_time.tm_sec < 0) || (new_tm_time.tm_sec > 60)) { CRIT("%s: Seconds out of range: (%d)", argv[0], new_tm_time.tm_sec); EXIT1; } } if (copt.debug) DBG("Values passed to mktime():\n\tmon %d\n\tday %d\n\tyear %d\n\tHH %d\n\tMM %d\n\tSS %d", new_tm_time.tm_mon, new_tm_time.tm_mday, new_tm_time.tm_year, new_tm_time.tm_hour, new_tm_time.tm_min, new_tm_time.tm_sec); newtime = (SaHpiTimeT) mktime(&new_tm_time) * 1000000000; if (copt.debug) DBG("New date and time in SaHpiTimeT %" PRId64 "\n", (int64_t)newtime); rv = ohc_session_open_by_option ( &copt, &sessionid); if (rv != SA_OK) { EXIT1; } if (copt.debug) DBG("saHpiDiscover"); rv = saHpiDiscover(sessionid); if (copt.debug) DBG("saHpiDiscover %s", oh_lookup_error(rv)); rv = saHpiDomainInfoGet(sessionid, &domainInfo); if (copt.debug) DBG("saHpiDomainInfoGet %s", oh_lookup_error(rv)); printf("DomainInfo: RptUpdateCount = %u, RptUpdateTimestamp = %lx\n", domainInfo.RptUpdateCount, (unsigned long)domainInfo.RptUpdateTimestamp); /* walk the RPT list */ rptentryid = SAHPI_FIRST_ENTRY; while ((rv == SA_OK) && (rptentryid != SAHPI_LAST_ENTRY)) { rv = saHpiRptEntryGet(sessionid,rptentryid,&nextrptentryid,&rptentry); if (copt.debug) DBG("saHpiRptEntryGet %s", oh_lookup_error(rv)); if ((rv == SA_OK) && (rptentry.ResourceCapabilities & SAHPI_CAPABILITY_EVENT_LOG)) { resourceid = rptentry.ResourceId; if (copt.debug) DBG("RPT %x capabilities = %x", resourceid, rptentry.ResourceCapabilities); rv = saHpiEventLogTimeGet(sessionid, resourceid, &oldtime); oh_decode_time(oldtime, &buffer); printf ("\nCurrent event log time on HPI target: %s\n", buffer.Data); printf ("Setting new event log time on HPI target ...\n"); rv = saHpiEventLogTimeSet(sessionid, resourceid, newtime); if (rv != SA_OK) { CRIT("saHpiEventLogTimeSet returned %s", oh_lookup_error(rv)); } rv = saHpiEventLogTimeGet(sessionid, resourceid, &readbacktime); oh_decode_time(readbacktime, &buffer); printf ("Read-Back-Check event log time: %s\n", buffer.Data); } // entryid = SAHPI_OLDEST_ENTRY; rptentryid = nextrptentryid; } rv = saHpiSessionClose(sessionid); g_free(findate); g_free(fintime); return(0); } /* end hpisettime.c */ openhpi-3.6.1/clients/hpiwdt.c0000644000175100017510000002021212575647264015276 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (c) 2004 by Intel Corp. * (C) Copyright Nokia Siemens Networks 2010 * (C) Copyright Ulrich Kleber 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Filename: hpiwdt.c * Authors: Andy Cress * Ulrich Kleber * * Changes: * 03/15/04 Andy Cress - v1.0 added strings for use & actions in show_wdt * 10/13/04 kouzmich - porting to HPI B * 12/02/04 Andy Cress - v1.1 fixed domain/RPT loop, added some decoding * 09/06/2010 ulikleber New option -D to select domain * 01/02/2011 ulikleber Refactoring to use glib for option parsing and * introduce common options for all clients * */ /* * This tool reads and enables the watchdog timer via HPI. * Note that there are other methods for doing this, and the * standard interface is for the driver to expose a /dev/watchdog * device interface. * WARNING: If you enable the watchdog, make sure you have something * set up to keep resetting the timer at regular intervals, or it * will reset your system. */ #include "oh_clients.h" #define uchar unsigned char #define OH_SVN_REV "$Revision: 7438 $" #define NUSE 6 char *usedesc[NUSE] = {"reserved", "BIOS FRB2", "BIOS/POST", "OS Load", "SMS/OS", "OEM" }; #define NACT 5 char *actions[NACT] = {"No action", "Hard Reset", "Power down", "Power cycle", "Reserved" }; static gboolean fenable = FALSE; static gboolean fdisable = FALSE; static gboolean freset = FALSE; static gint ftimeout = 0; static oHpiCommonOptionsT copt; static GOptionEntry my_options[] = { { "enable", 'e', 0, G_OPTION_ARG_NONE, &fenable, "enables the watchdog timer", NULL }, { "disable", 'd', 0, G_OPTION_ARG_NONE, &fdisable, "disables the watchdog timer", NULL }, { "reset", 'r', 0, G_OPTION_ARG_NONE, &freset, "resets the watchdog timer", NULL }, { "timeout", 't', 0, G_OPTION_ARG_INT, &ftimeout, "sets timeout to n seconds", "n" }, { NULL } }; static void show_wdt(SaHpiWatchdogNumT wdnum, SaHpiWatchdogT *wdt) { int icount, pcount; char ustr[12]; char astr[16]; char estr[30]; char *pstr; icount = wdt->InitialCount /1000; /*1000 msec = 1 sec*/ pcount = wdt->PresentCount /1000; if (wdt->TimerUse > NUSE) sprintf(ustr,"%u", wdt->TimerUse ); else strcpy(ustr, usedesc[wdt->TimerUse]); if (wdt->TimerAction > NACT) sprintf(astr,"%u", wdt->TimerAction ); else strcpy(astr, actions[wdt->TimerAction]); printf("Watchdog: Num=%u, Log=%d, Running=%d, TimerUse=%s, TimerAction=%s\n", wdnum,wdt->Log,wdt->Running,ustr, astr); if (wdt->TimerUseExpFlags == 0) strcpy(estr,"none"); else { estr[0] = 0; if (wdt->TimerUseExpFlags & 0x01) strcat(estr,"FRB2 "); if (wdt->TimerUseExpFlags & 0x02) strcat(estr,"POST "); if (wdt->TimerUseExpFlags & 0x04) strcat(estr,"OS_Load "); if (wdt->TimerUseExpFlags & 0x08) strcat(estr,"SMS_OS "); if (wdt->TimerUseExpFlags & 0x10) strcat(estr,"OEM "); } printf(" ExpiredUse=%s, Timeout=%u sec, Counter=%u sec\n", estr, icount,pcount); switch(wdt->PretimerInterrupt) { case 1: pstr = "SMI"; break; case 2: pstr = "NMI"; break; case 3: pstr = "MsgInt"; break; default: pstr = "none"; break; } printf(" PreTimerInterrupt=%s, PreTimeoutInterval=%u msec\n", pstr,wdt->PreTimeoutInterval); return; } int main(int argc, char **argv) { SaErrorT rv; SaHpiSessionIdT sessionid; SaHpiDomainInfoT domainInfo; SaHpiRptEntryT rptentry; SaHpiEntryIdT rptentryid; SaHpiEntryIdT nextrptentryid; SaHpiResourceIdT resourceid; SaHpiWatchdogNumT wdnum; SaHpiWatchdogT wdt; GOptionContext *context; /* Print version strings */ oh_prog_version(argv[0]); /* Parsing options */ static char usetext[]="- Read and Enables the watchdog timer.\n " OH_SVN_REV; OHC_PREPARE_REVISION(usetext); context = g_option_context_new (usetext); g_option_context_add_main_entries (context, my_options, NULL); if (!ohc_option_parse(&argc, argv, context, &copt, OHC_ALL_OPTIONS - OHC_ENTITY_PATH_OPTION //TODO: Feature 880127 - OHC_VERBOSE_OPTION )) { // no verbose mode implemented g_option_context_free (context); return 1; } g_option_context_free (context); if (ftimeout == 0) ftimeout = 120; else fenable = TRUE; rv = ohc_session_open_by_option ( &copt, &sessionid); if (rv != SA_OK) return rv; rv = saHpiDiscover(sessionid); if (copt.debug) DBG("saHpiDiscover rv = %s",oh_lookup_error(rv)); rv = saHpiDomainInfoGet(sessionid, &domainInfo); if (copt.debug) DBG("saHpiDomainInfoGet rv = %s",oh_lookup_error(rv)); printf("DomainInfo: UpdateCount = %x, UpdateTime = %lx\n", domainInfo.RptUpdateCount, (unsigned long)domainInfo.RptUpdateTimestamp); /* walk the RPT list */ rptentryid = SAHPI_FIRST_ENTRY; while ((rv == SA_OK) && (rptentryid != SAHPI_LAST_ENTRY)) { rv = saHpiRptEntryGet(sessionid,rptentryid,&nextrptentryid,&rptentry); if (rv != SA_OK) printf("RptEntryGet: rv = %s\n",oh_lookup_error(rv)); if (rv == SA_OK) { /* handle WDT for this RPT entry */ resourceid = rptentry.ResourceId; rptentry.ResourceTag.Data[rptentry.ResourceTag.DataLength] = 0; if (copt.debug) printf("rptentry[%u] resourceid=%u capab=%x tag: %s\n", rptentryid, resourceid, rptentry.ResourceCapabilities, rptentry.ResourceTag.Data); if (rptentry.ResourceCapabilities & SAHPI_CAPABILITY_WATCHDOG) { printf("%s has watchdog capability\n",rptentry.ResourceTag.Data); wdnum = SAHPI_DEFAULT_WATCHDOG_NUM; rv = saHpiWatchdogTimerGet(sessionid,resourceid,wdnum,&wdt); if (copt.debug) DBG("saHpiWatchdogTimerGet rv = %s",oh_lookup_error(rv)); if (rv != 0) { printf("saHpiWatchdogTimerGet error = %s\n",oh_lookup_error(rv)); rv = 0; rptentryid = nextrptentryid; continue; } show_wdt(wdnum,&wdt); if (fdisable) { printf("Disabling watchdog timer ...\n"); /* clear FRB2, timeout back to 120 sec */ /* TODO: add setting wdt values here */ wdt.TimerUse = SAHPI_WTU_NONE; /* 1=FRB2 2=POST 3=OSLoad 4=SMS_OS 5=OEM */ wdt.TimerAction = SAHPI_WA_NO_ACTION; /* 0=none 1=reset 2=powerdown 3=powercycle */ wdt.PretimerInterrupt = SAHPI_WPI_NONE; /* 0=none 1=SMI 2=NMI 3=message */ wdt.PreTimeoutInterval = 60000; /*msec*/ wdt.InitialCount = 120000; /*msec*/ wdt.PresentCount = 120000; /*msec*/ rv = saHpiWatchdogTimerSet(sessionid,resourceid,wdnum,&wdt); if (copt.debug) DBG("saHpiWatchdogTimerSet rv = %s",oh_lookup_error(rv)); if (rv == 0) show_wdt(wdnum,&wdt); } else if (fenable) { printf("Enabling watchdog timer ...\n"); /* hard reset action, no pretimeout, clear SMS/OS when done */ /* use ftimeout for timeout */ wdt.TimerUse = SAHPI_WTU_SMS_OS; /* 1=FRB2 2=POST 3=OSLoad 4=SMS_OS 5=OEM */ wdt.TimerAction = SAHPI_WA_RESET; /* 0=none 1=reset 2=powerdown 3=powercycle */ wdt.PretimerInterrupt = SAHPI_WPI_NMI; /* 0=none 1=SMI 2=NMI 3=message */ wdt.PreTimeoutInterval = (ftimeout / 2) * 1000; /*msec*/ wdt.InitialCount = ftimeout * 1000; /*msec*/ wdt.PresentCount = ftimeout * 1000; /*msec*/ rv = saHpiWatchdogTimerSet(sessionid,resourceid,wdnum,&wdt); if (copt.debug) DBG("saHpiWatchdogTimerSet rv = %s",oh_lookup_error(rv)); if (rv == 0) show_wdt(wdnum,&wdt); } if (freset && !fdisable) { printf("Resetting watchdog timer ...\n"); rv = saHpiWatchdogTimerReset(sessionid,resourceid,wdnum); if (copt.debug) DBG("saHpiWatchdogTimerReset rv = %s",oh_lookup_error(rv)); } } /*watchdog capability*/ rptentryid = nextrptentryid; /* get next RPT (usu only one anyway) */ } /*endif RPT ok*/ } /*end while loop*/ rv = saHpiSessionClose(sessionid); return 0; } /* end hpiwdt.c */ openhpi-3.6.1/clients/hpisensor.c0000644000175100017510000003455012575647264016023 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * (C) Copyright IBM Corp. 2004 * (C) Copyright Nokia Siemens Networks 2010 * (C) Copyright Ulrich Kleber 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Andy Cress * Renier Morales * Ulrich Kleber * * ChangeLog: * 09/08/04 pdphan@users.sf.net Add sensor number to the display. * 01/06/05 arcress reduce number of display lines per sensor * 09/06/10 ulikleber New option -D to select domain * 02/02/11 ulikleber Refactoring to use glib for option parsing and * introduce common options for all clients */ #include "oh_clients.h" #define OH_SVN_REV "$Revision: 7291 $" static gboolean fshowthr = FALSE; static gboolean fshowrange = FALSE; static gboolean fshowstate = FALSE; static oHpiCommonOptionsT copt; static GOptionEntry my_options[] = { { "threshold", 't', 0, G_OPTION_ARG_NONE, &fshowthr, "Show Thresholds also", NULL }, { "range", 'r', 0, G_OPTION_ARG_NONE, &fshowrange, "Show Range values also", NULL }, { "eventstate", 's', 0, G_OPTION_ARG_NONE, &fshowstate, "Show EventState also", NULL }, { NULL } }; static void ShowSensor(SaHpiSessionIdT sessionid, SaHpiResourceIdT resourceid, SaHpiSensorRecT *sensorrec ) { SaHpiSensorNumT sensornum; SaHpiSensorReadingT reading; SaHpiSensorThresholdsT thresh; SaHpiEventStateT events; SaHpiTextBufferT text; SaErrorT rv; sensornum = sensorrec->Num; rv = saHpiSensorReadingGet(sessionid,resourceid, sensornum, &reading, &events); if (rv != SA_OK) { printf("ReadingGet ret=%s\n", oh_lookup_error(rv)); return; } if (reading.IsSupported ) { if((rv = oh_decode_sensorreading(reading, sensorrec->DataFormat, &text)) == SA_OK) { printf("= %s\n", text.Data); } else { printf("= FAILED, %s\n", oh_lookup_error(rv)); } } else { printf("\n Sensor reading is not supported\n"); } if (fshowstate) { if ((rv = oh_decode_eventstate(events, sensorrec->Category, &text)) == SA_OK) { printf(" Current Sensor State = %s\n", text.Data); } else { printf(" Can not decode Sensor EventState value %d\n", (int) events); } } if (fshowrange) { // show ranges printf("\t Ranges::\n"); if ( sensorrec->DataFormat.Range.Flags & SAHPI_SRF_NOMINAL ) { if((rv = oh_decode_sensorreading(sensorrec->DataFormat.Range.Nominal, sensorrec->DataFormat, &text)) == SA_OK) { printf( "\t\tNominal of Range: %s\n", text.Data); } else { printf( "\t\tNominal of Range: FAILED %s\n", oh_lookup_error(rv)); } } if ( sensorrec->DataFormat.Range.Flags & SAHPI_SRF_MAX ) { if((rv = oh_decode_sensorreading(sensorrec->DataFormat.Range.Max, sensorrec->DataFormat, &text)) == SA_OK) { printf( "\t\tMax of Range: %s\n", text.Data); } else { printf( "\t\tMax of Range: FAILED %s\n", oh_lookup_error(rv)); } } if ( sensorrec->DataFormat.Range.Flags & SAHPI_SRF_MIN ) { if((rv = oh_decode_sensorreading(sensorrec->DataFormat.Range.Min, sensorrec->DataFormat, &text)) == SA_OK) { printf( "\t\tMin of Range: %s\n", text.Data); } else { printf( "\t\tMin of Range: FAILED %s\n", oh_lookup_error(rv)); } } if ( sensorrec->DataFormat.Range.Flags & SAHPI_SRF_NORMAL_MAX ) { if((rv = oh_decode_sensorreading(sensorrec->DataFormat.Range.NormalMax, sensorrec->DataFormat, &text)) == SA_OK) { printf( "\t\tNormal Max of Range: %s\n", text.Data); } else { printf( "\t\tNormal Max of Range: FAILED %s\n", oh_lookup_error(rv)); } } if ( sensorrec->DataFormat.Range.Flags & SAHPI_SRF_NORMAL_MIN ) { if((rv = oh_decode_sensorreading(sensorrec->DataFormat.Range.NormalMin, sensorrec->DataFormat, &text)) == SA_OK) { printf( "\t\tNormal Min of Range: %s\n", text.Data); } else { printf( "\t\tNormal Min of Range: FAILED %s\n", oh_lookup_error(rv)); } } } if(fshowthr) { // show thresholds rv = saHpiSensorThresholdsGet(sessionid,resourceid, sensornum, &thresh); if (rv != SA_OK) { printf("\t ThresholdsGet ret=%s\n", oh_lookup_error(rv)); return; } printf( "\t Thresholds::\n" ); if (thresh.LowCritical.IsSupported) { if((rv = oh_decode_sensorreading(thresh.LowCritical, sensorrec->DataFormat, &text)) == SA_OK) { printf( "\t\tLow Critical Threshold: %s\n", text.Data); } else { printf( "\t\tLow Critical Threshold: FAILED %s\n", oh_lookup_error(rv)); } } if (thresh.LowMajor.IsSupported) { if((rv = oh_decode_sensorreading(thresh.LowMajor, sensorrec->DataFormat, &text)) == SA_OK) { printf( "\t\tLow Major Threshold: %s\n", text.Data); } else { printf( "\t\tLow Major Threshold: FAILED %s\n", oh_lookup_error(rv)); } } if (thresh.LowMinor.IsSupported) { if((rv = oh_decode_sensorreading(thresh.LowMinor, sensorrec->DataFormat, &text)) == SA_OK) { printf( "\t\tLow Minor Threshold: %s\n", text.Data); } else { printf( "\t\tLow Minor Threshold: FAILED %s\n", oh_lookup_error(rv)); } } if (thresh.UpCritical.IsSupported) { if((rv = oh_decode_sensorreading(thresh.UpCritical, sensorrec->DataFormat, &text)) == SA_OK) { printf( "\t\tUp Critical Threshold: %s\n", text.Data); } else { printf( "\t\tUp Critical Threshold: FAILED %s\n", oh_lookup_error(rv)); } } if (thresh.UpMajor.IsSupported) { if((rv = oh_decode_sensorreading(thresh.UpMajor, sensorrec->DataFormat, &text)) == SA_OK) { printf( "\t\tUp Major Threshold: %s\n", text.Data); } else { printf( "\t\tUp Major Threshold: FAILED %s\n", oh_lookup_error(rv)); } } if (thresh.UpMinor.IsSupported) { if((rv = oh_decode_sensorreading(thresh.UpMinor, sensorrec->DataFormat, &text)) == SA_OK) { printf( "\t\tUp Minor Threshold: %s\n", text.Data); } else { printf( "\t\tUp Minor Threshold: FAILED %s\n", oh_lookup_error(rv)); } } if (thresh.PosThdHysteresis.IsSupported) { if((rv = oh_decode_sensorreading(thresh.PosThdHysteresis, sensorrec->DataFormat, &text)) == SA_OK) { printf( "\t\tPos Threshold Hysteresis: %s\n", text.Data); } else { printf( "\t\tPos Threshold Hysteresis: FAILED %s\n", oh_lookup_error(rv)); } } if (thresh.NegThdHysteresis.IsSupported) { if((rv = oh_decode_sensorreading(thresh.NegThdHysteresis, sensorrec->DataFormat, &text)) == SA_OK) { printf( "\t\tNeg Threshold Hysteresis: %s\n", text.Data); } else { printf( "\t\tNeg Threshold Hysteresis: FAILED %s\n", oh_lookup_error(rv)); } } } /* if extra lines, double-space output */ if (fshowthr || fshowrange) printf("\n"); return; } int main(int argc, char **argv) { SaErrorT rv; SaHpiDomainInfoT dinfo; SaHpiSessionIdT sessionid; SaHpiRptEntryT rptentry; SaHpiEntryIdT rptentryid; SaHpiEntryIdT nextrptentryid; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiResourceIdT resourceid; SaHpiRdrT rdr; GOptionContext *context; /* Print version strings */ oh_prog_version(argv[0]); /* Parsing options */ static char usetext[]="- Display sensor info for resources with Sensor Capability\n " OH_SVN_REV; OHC_PREPARE_REVISION(usetext); context = g_option_context_new (usetext); g_option_context_add_main_entries (context, my_options, NULL); if (!ohc_option_parse(&argc, argv, context, &copt, OHC_ALL_OPTIONS - OHC_VERBOSE_OPTION )) { // no verbose mode implemented g_option_context_free (context); return 1; } g_option_context_free (context); rv = ohc_session_open_by_option ( &copt, &sessionid); if (rv != SA_OK) return rv; if (copt.debug) DBG("Starting Discovery "); rv = saHpiDiscover(sessionid); if (copt.debug) DBG("saHpiDiscover returned %s", oh_lookup_error(rv)); rv = saHpiDomainInfoGet(sessionid,&dinfo); if (copt.debug) DBG("saHpiDomainInfoGet returned %s", oh_lookup_error(rv)); printf("RptInfo: UpdateCount = %u, UpdateTime = %lx\n", dinfo.RptUpdateCount, (unsigned long)dinfo.RptUpdateTimestamp); /* walk the RPT list */ rptentryid = SAHPI_FIRST_ENTRY; while ((rv == SA_OK) && (rptentryid != SAHPI_LAST_ENTRY)) { rv = saHpiRptEntryGet(sessionid,rptentryid,&nextrptentryid,&rptentry); if (copt.debug) DBG("saHpiRptEntryGet returned %s", oh_lookup_error(rv)); if (rv == SA_OK) { /* Walk the RDR list for this RPT entry */ /* Filter by entity path if specified */ if (copt.withentitypath && !oh_cmp_ep(&copt.entitypath, &(rptentry.ResourceEntity))) { rptentryid = nextrptentryid; continue; } entryid = SAHPI_FIRST_ENTRY; resourceid = rptentry.ResourceId; rptentry.ResourceTag.Data[rptentry.ResourceTag.DataLength] = 0; printf("\nRPTEntry[%u] tag: %s\n", resourceid,rptentry.ResourceTag.Data); oh_print_ep(&rptentry.ResourceEntity, 0); while ((rv == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) { rv = saHpiRdrGet(sessionid,resourceid, entryid,&nextentryid, &rdr); if (copt.debug) DBG("saHpiRdrGet[%u] returned %s",entryid,oh_lookup_error(rv)); if (rv == SA_OK) { rdr.IdString.Data[rdr.IdString.DataLength] = 0; if (rdr.RdrType == SAHPI_SENSOR_RDR) { printf(" RDR[%6d]: Sensor[%3d] %s \t", rdr.RecordId, rdr.RdrTypeUnion.SensorRec.Num, rdr.IdString.Data); ShowSensor(sessionid,resourceid, &rdr.RdrTypeUnion.SensorRec); } else { printf(" RDR[%6d]: %s %s\n", rdr.RecordId, oh_lookup_rdrtype(rdr.RdrType), rdr.IdString.Data); } entryid = nextentryid; } else { rv = SA_OK; entryid = SAHPI_LAST_ENTRY; } } rptentryid = nextrptentryid; } } rv = saHpiSessionClose(sessionid); return(0); } /* end hpisensor.c */ openhpi-3.6.1/clients/ohdomainlist.c0000644000175100017510000001455312575647264016504 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (C) Copyright Nokia Siemens Networks 2010 * (C) Copyright Ulrich Kleber 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Ulrich Kleber * * Log: * Start from hpitop.c * This routine display highlevel domain topology for a managed * openHPI complex * * Changes: * 03/02/2011 ulikleber Refactoring to use glib for option parsing and * introduce common options for all clients * */ #include "oh_clients.h" #define OH_SVN_REV "$Revision: 7112 $" /* * Function prototypes */ static SaErrorT show_domains(void); static SaErrorT print_domaininfo(SaHpiDomainInfoT info, int shift); /* * Globals for this driver */ static oHpiCommonOptionsT copt; /* * Main */ int main(int argc, char **argv) { GOptionContext *context; /* Print version strings */ oh_prog_version(argv[0]); /* Parsing options */ static char usetext[]="- Show information about domains" " on the level of the openhpi base library.\n " OH_SVN_REV; OHC_PREPARE_REVISION(usetext); context = g_option_context_new (usetext); if (!ohc_option_parse(&argc, argv, context, &copt, OHC_ALL_OPTIONS - OHC_ENTITY_PATH_OPTION )) { // not applicable g_option_context_free (context); return 1; } g_option_context_free (context); show_domains(); return 0; } /* * */ static SaErrorT show_domains(void) { SaErrorT rv = SA_OK; oHpiDomainEntryT domainentry; SaHpiEntryIdT domainentryid; SaHpiEntryIdT nextdomainentryid; SaHpiDomainInfoT relateddomaininfo; SaHpiDomainIdT relateddomainid = SAHPI_UNSPECIFIED_DOMAIN_ID; SaHpiSessionIdT relatedsessionid; /* walk the Domain Table */ domainentryid = SAHPI_FIRST_ENTRY; do { if (copt.debug) DBG("oHpiDomainEntryGet called with entry=%u", domainentryid); rv = oHpiDomainEntryGet( domainentryid,&nextdomainentryid,&domainentry); if ((rv != SA_OK) || copt.debug) printf("oHpiDomainEntryGet returns %s\n", oh_lookup_error(rv)); if (rv == SA_OK ) { if (copt.debug) DBG("oHpiDomainEntryGet provides domainid=%u," " nextentryid=%u\n", domainentry.id, nextdomainentryid); printf("Domain defined on host(%s:%u) with id: %u\n", (char *)domainentry.host.Data, domainentry.port, domainentry.id); if (copt.verbose) { /* display the domaininfo for that related domain */ relateddomainid = domainentry.id; rv = saHpiSessionOpen(relateddomainid, &relatedsessionid,NULL); if (rv != SA_OK) { printf("Domain %u cannot be opened\n", relateddomainid); continue; } if (copt.debug) { DBG("saHpiSessionOpen returns with SessionId %u\n", relatedsessionid); DBG("saHpiDomainInfoGet for domain %u\n", relateddomainid); } rv = saHpiDomainInfoGet(relatedsessionid, &relateddomaininfo); if (rv!=SA_OK) { printf("\nDomaininfo of domain %u cannot be " "retrieved.\n", relateddomainid); if (copt.debug) DBG("saHpiDomainInfoGet for domain " "%u failed with returncode %s\n", relateddomainid, oh_lookup_error(rv)); } else { /* Print info about related domain */ rv = print_domaininfo(relateddomaininfo,1); } rv = saHpiSessionClose(relatedsessionid); if (copt.debug) DBG("saHpiSessionClose returns %s\n", oh_lookup_error(rv)); } //verbose } else if (rv == SA_ERR_HPI_NOT_PRESENT) { if (domainentryid == SAHPI_FIRST_ENTRY) printf("Domain list is empty. \n"); else printf("Internal error while walking the Domainlist\n"); } else printf("Internal error while walking the Domainlist\n"); domainentryid = nextdomainentryid; } while ((rv == SA_OK) && (domainentryid != SAHPI_LAST_ENTRY)); return(rv); } /* * */ static SaErrorT print_domaininfo(SaHpiDomainInfoT info, int shift) { SaHpiTextBufferT buf; SaErrorT rv; int i; for (i=0;i * Ulrich Kleber * * hpiel - Displays HPI event log entries. * * * Changes: * 09/06/2010 ulikleber New option -D to select domain * 01/02/2011 ulikleber Refactoring to use glib for option parsing and * introduce common options for all clients */ #include "oh_clients.h" #define OH_SVN_REV "$Revision: 7291 $" #define show_error_quit(msg) \ do { \ if (error) { \ CRIT(msg, oh_lookup_error(error)); \ return error; \ } \ } while(0) /* Globals */ static struct hpiel_opts { gboolean del; /* Domain Event Log option. */ gboolean clear; /* Clear the event log before traversing it. */ gboolean resource; /* Get resource along with event log entry. */ gboolean rdr; /* Get RDR along with event log entry. */ } opts = { FALSE, FALSE, FALSE, FALSE }; static oHpiCommonOptionsT copt; static GOptionEntry my_options[] = { { "del", 'd', 0, G_OPTION_ARG_NONE, &opts.del, "Display domain event log entries", NULL }, { "clear", 'c', 0, G_OPTION_ARG_NONE, &opts.clear, "Clear log before reading event log entries", NULL }, { "resource", 'p', 0, G_OPTION_ARG_NONE, &opts.resource, "Pull resource info along with log entry", NULL }, { "rdr", 'r', 0, G_OPTION_ARG_NONE, &opts.rdr, "Pull RDR info along with log entry", NULL }, { NULL } }; SaHpiDomainIdT domainid = SAHPI_UNSPECIFIED_DOMAIN_ID; /* Prototypes */ SaErrorT parse_options(int argc, char ***argv); SaErrorT harvest_sels(SaHpiSessionIdT sid, SaHpiDomainInfoT *dinfo); SaErrorT display_el(SaHpiSessionIdT sid, SaHpiResourceIdT rid, SaHpiTextBufferT *tag); int main(int argc, char **argv) { SaErrorT error = SA_OK; SaHpiSessionIdT sid; SaHpiDomainInfoT dinfo; GOptionContext *context; /* Print version strings */ oh_prog_version(argv[0]); /* Parsing options */ static char usetext[]="- Displays HPI event log entries\n\n" "Option E (entity-path) displays resource event log entries.\n" "If neither -d or -E \"\" are specified, event log entries will be\n" "shown for all supporting resources by default.\n" OH_SVN_REV; OHC_PREPARE_REVISION(usetext); context = g_option_context_new (usetext); g_option_context_add_main_entries (context, my_options, NULL); if (!ohc_option_parse(&argc, argv, context, &copt, OHC_ALL_OPTIONS - OHC_VERBOSE_OPTION )) { // no verbose mode implemented g_option_context_free (context); return 1; } g_option_context_free (context); /* Program really begins here - all options parsed at this point */ error = ohc_session_open_by_option ( &copt, &sid); show_error_quit("saHpiSessionOpen() returned %s. Exiting.\n"); error = saHpiDiscover(sid); show_error_quit("saHpiDiscover() returned %s. Exiting.\n"); error = saHpiDomainInfoGet(sid, &dinfo); show_error_quit("saHpiDomainInfoGet() returned %s. Exiting.\n"); printf("Domain Info: UpdateCount = %u, UpdateTime = %lx\n", dinfo.RptUpdateCount, (unsigned long)dinfo.RptUpdateTimestamp); if (copt.withentitypath) { /* Entity path specified */ error = harvest_sels(sid, &dinfo); } else if (opts.del) { /* Domain event log specified */ error = display_el(sid, SAHPI_UNSPECIFIED_RESOURCE_ID, &dinfo.DomainTag); } else { /* Else, show SELs of all supporting resources */ error = harvest_sels(sid, &dinfo); } if (error) CRIT("Gathering event log entries returned %s", oh_lookup_error(error)); error = saHpiSessionClose(sid); if (error) CRIT("saHpiSessionClose() returned %s.", oh_lookup_error(error)); return error; } SaErrorT harvest_sels(SaHpiSessionIdT sid, SaHpiDomainInfoT *dinfo) { SaErrorT error = SA_OK; SaHpiRptEntryT rptentry; SaHpiEntryIdT entryid, nextentryid; SaHpiResourceIdT rid; oh_big_textbuffer bigbuf; SaHpiBoolT found_entry = SAHPI_FALSE; if (!sid || !dinfo) { if (copt.debug) CRIT("Invalid parameters in havest_sels()\n"); return SA_ERR_HPI_INVALID_PARAMS; } entryid = SAHPI_FIRST_ENTRY; while (error == SA_OK && entryid != SAHPI_LAST_ENTRY) { error = saHpiRptEntryGet(sid, entryid, &nextentryid, &rptentry); if (copt.debug) CRIT("saHpiRptEntryGet() returned %s", oh_lookup_error(error)); if (error == SA_OK) { if (copt.withentitypath) { if (!oh_cmp_ep(&copt.entitypath, &rptentry.ResourceEntity)) { entryid = nextentryid; continue; } } if (!(rptentry.ResourceCapabilities & SAHPI_CAPABILITY_EVENT_LOG)) { if (copt.debug) CRIT("RPT doesn't have SEL"); entryid = nextentryid; continue; /* no SEL here, try next RPT */ } found_entry = SAHPI_TRUE; rid = rptentry.ResourceId; if (copt.debug) CRIT("RPT %u capabilities = %x", rid, rptentry.ResourceCapabilities); rptentry.ResourceTag.Data[rptentry.ResourceTag.DataLength] = 0; oh_init_bigtext(&bigbuf); error = oh_decode_entitypath(&rptentry.ResourceEntity, &bigbuf); printf("%s\n", bigbuf.Data); printf("rptentry[%u] tag: %s\n", rid, rptentry.ResourceTag.Data); error = display_el(sid, rid, &rptentry.ResourceTag); if (copt.withentitypath) return SA_OK; } entryid = nextentryid; } if (!found_entry) { if (copt.withentitypath) { CRIT("Could not find resource matching entity path."); } else { if (copt.debug) CRIT("No resources supporting event logs were found."); } } return error; } SaErrorT display_el(SaHpiSessionIdT sid, SaHpiResourceIdT rid, SaHpiTextBufferT *tag) { SaErrorT error = SA_OK; SaHpiEventLogEntryIdT entryid, nextentryid, preventryid; SaHpiEventLogInfoT elinfo; SaHpiEventLogEntryT elentry; SaHpiRdrT rdr; SaHpiRptEntryT res; if (!sid || !rid) { if (copt.debug) CRIT("Invalid parameters in display_el()."); return SA_ERR_HPI_INVALID_PARAMS; } error = saHpiEventLogInfoGet(sid, rid, &elinfo); if (error) { if (copt.debug) CRIT("saHpiEventLogInfoGet() returned %s. Exiting\n", oh_lookup_error(error)); return error; } printf("EventLogInfo for %s, ResourceId %u\n", tag->Data, rid); oh_print_eventloginfo(&elinfo, 4); if (elinfo.Entries == 0) { printf("%s Resource %u has an empty event log.\n", tag->Data, rid); return SA_OK; } if (opts.clear) { error = saHpiEventLogClear(sid, rid); if (error == SA_OK) printf("EventLog successfully cleared\n"); else { printf("saHpiEventLogClear() returned %s\n", oh_lookup_error(error)); return error; } } entryid = SAHPI_OLDEST_ENTRY; while (entryid != SAHPI_NO_MORE_ENTRIES) { error = saHpiEventLogEntryGet(sid, rid, entryid, &preventryid, &nextentryid, &elentry, &rdr, &res); if (copt.debug) CRIT ("saHpiEventLogEntryGet() returned %s\n", oh_lookup_error(error)); if (error == SA_OK) { SaHpiEntityPathT *ep = NULL; /* Get a reference to the entity path for this log entry */ if (res.ResourceCapabilities) { ep = &res.ResourceEntity; } else if (rdr.RdrType != SAHPI_NO_RECORD) { ep = &rdr.Entity; } /* Print the event log entry */ oh_print_eventlogentry(&elentry, ep, 6); if (opts.rdr) { if (rdr.RdrType == SAHPI_NO_RECORD) printf(" No RDR associated with EventType = %s\n\n", oh_lookup_eventtype(elentry.Event.EventType)); else oh_print_rdr(&rdr, 12); } if (opts.resource) { if (res.ResourceCapabilities == 0) printf(" No RPT associated with EventType = %s\n\n", oh_lookup_eventtype(elentry.Event.EventType)); else oh_print_rptentry(&res, 10); } preventryid = entryid; entryid = nextentryid; } else { return error; } } return SA_OK; } openhpi-3.6.1/clients/hpigensimdata.c0000644000175100017510000022355312575647264016631 0ustar mohanmohan/* * hpigensimdata.c * * Copyright (c) 2010 by Lars Wetzel * (c) 2011 Ulrich Kleber, Lars Wetzel * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Lars Wetzel (klw) * Ulrich Kleber * * Changes: * 10/02/09 (klw) Release 0.9 * 04/20/10 (klw) Fix in fumi data structure FumiNum -> Num * (klw) Fix in fumi data structure spaces are printed correctly * 02/01/11 ulikleber Refactoring to use glib for option parsing and * introduce common options for all clients * 05/18/11 (klw) Fix in fumi data encapsulate FUMI_DATA * * Open: * - print all events of a system (not clear if necessary) * - check update mode (depends on NewSimulator Fumi implementation) * - maybe more selection criteria at the command line (eg. only sensor) * depends on user which needs this client for some other reasons * * Changes: * 01/02/2011 ulikleber Refactoring to use glib for option parsing and * introduce common options for all clients */ #include "oh_clients.h" #define OH_SVN_REV "$Revision: 6571 $" #define GEN_SIM_DATA_VERSION "0.901000" #define OFFSET_STEP 3 #define OFFSET_FILLER ' ' #define MAX_OFFSETS 20 #define MAX_CHAR 256 #define MAX_SHORT_CHAR 10 #define MODE_INIT 0 #define MODE_UPD 1 #define CONF_SECTION "CONFIGURATION" #define SENS_SECTION "SENSOR" #define CONT_SECTION "CONTROL" #define INV_SECTION "INVENTORY" #define WDT_SECTION "WATCHDOG" #define ANN_SECTION "ANNUNCIATOR" #define DIMI_SECTION "DIMI" #define FUMI_SECTION "FUMI" #define RPT_SECTION "RPT" #define RDR_SECTION "RDR" #define RDR_DETAIL "RDR_DETAIL" #define CONTROL_GET "CONTROL_GET" #define SENSOR_DATA "SENSOR_DATA" #define INVENTORY_DATA "INVENTORY_DATA" #define INV_AREA_DATA "INV_AREA" #define INV_FIELD_DATA "INV_FIELD" #define WDT_GET "WDT_GET" #define ANN_DATA "ANNUNCIATOR_DATA" #define ANNOUNCEMENT "ANNOUNCEMENT" #define DIMI_DATA "DIMI_DATA" #define DIMI_TEST "DIMI_TESTCASE" #define DIMI_TEST_DATA "DIMI_TEST_DATA" #define FUMI_DATA "FUMI_DATA" #define FUMI_SOURCE "FUMI_SOURCE_DATA" #define FUMI_TARGET "FUMI_TARGET_DATA" #define FUMI_LOG_TARGET "FUMI_LOG_TARGET_DATA" typedef struct { int mode; } ConfigurationDataT; /* * Globals */ static gint g_resourceid = (gint) SAHPI_UNSPECIFIED_RESOURCE_ID; static gchar *g_file = NULL; static gchar *g_mode = NULL; static oHpiCommonOptionsT copt; static GOptionEntry my_options[] = { { "resource", 'r', 0, G_OPTION_ARG_INT, &g_resourceid, "Select particular resource id for an update file", "res_id" }, { "file", 'f', 0, G_OPTION_ARG_FILENAME, &g_file, "Name of the file to be generated", "filename" }, { "mode", 'm', 0, G_OPTION_ARG_STRING, &g_mode, "Write update or initial file", "UPD|INIT" }, { NULL } }; #define GFREE g_option_context_free (context);g_free(g_file);g_free(g_mode); char offSet[MAX_OFFSETS][MAX_CHAR]; /* * Function prototypes */ static void print_header(FILE *out, int offset, ConfigurationDataT data); static SaErrorT print_resources(FILE *out, int offset, SaHpiSessionIdT sessionid, SaHpiResourceIdT res_id); static SaErrorT print_rpt(FILE *out, int offset, SaHpiRptEntryT *rptptr); static void print_resourceInfo(FILE *out, int offset, SaHpiResourceInfoT resinfo); static SaErrorT print_rdr(FILE *out, int offset, SaHpiSessionIdT sessionid, SaHpiResourceIdT resId, SaHpiRdrT *rdrptr); static void print_common_rdr(FILE *out, int offset, SaHpiRdrT *rdrptr); static SaErrorT print_control_rdr(FILE *out, int offset, SaHpiSessionIdT sessionid, SaHpiResourceIdT resId, SaHpiCtrlRecT *ctrl); static void print_control_state_stream(FILE *out, int offset, SaHpiCtrlStateStreamT data); static void print_control_state_text(FILE *out, int offset, SaHpiCtrlStateTextT data); static void print_control_state_oem(FILE *out, int offset, SaHpiCtrlStateOemT data); static void print_sensor_rdr(FILE *out, int offset, SaHpiSensorRecT *sens); static SaErrorT print_sensor_data(FILE *out, int offset, SaHpiSessionIdT sessionId, SaHpiResourceIdT resId, SaHpiSensorRecT *sens); static int print_sensor_thresholds(FILE *out, int myoffset, SaHpiSensorThresholdsT thres, SaHpiSensorDataFormatT format); static int check_sensor_reading(SaHpiSensorReadingT *read, SaHpiSensorDataFormatT format); static void print_sensor_data_format(FILE *out, int offset, SaHpiSensorDataFormatT data); static void print_sensor_threshold_definition(FILE *out, int offset, SaHpiSensorThdDefnT def); static void print_sensor_reading(FILE *out, int offset, SaHpiSensorReadingT val); static void print_inventory_rdr(FILE *out, int offset, SaHpiInventoryRecT *inv); static SaErrorT print_inventory_data(FILE *out, int offset, SaHpiSessionIdT sessionId, SaHpiResourceIdT resId, SaHpiInventoryRecT *inv); static SaErrorT print_inventory_area_data(FILE *out, int offset, SaHpiSessionIdT sessionId, SaHpiResourceIdT resId, SaHpiInventoryRecT *inv, SaHpiIdrAreaHeaderT *area); static void print_inventory_field(FILE *out, int offset, SaHpiIdrFieldT field); static SaErrorT print_watchdog_rdr(FILE *out, int offset, SaHpiSessionIdT sessionId, SaHpiResourceIdT resId, SaHpiWatchdogRecT *wdt); static void print_annunciator_rdr(FILE *out, int offset, SaHpiAnnunciatorRecT *ann); static SaErrorT print_annunciator_data(FILE *out, int offset, SaHpiSessionIdT sessionId, SaHpiResourceIdT resId, SaHpiAnnunciatorRecT *ann); static void print_annunciator_cond(FILE *out, int offset, SaHpiConditionT cond); static void print_dimi_rdr(FILE *out, int offset, SaHpiDimiRecT *dimi); static SaErrorT print_dimi_data(FILE *out, int offset, SaHpiSessionIdT sessionId, SaHpiResourceIdT resId, SaHpiDimiRecT *dimi); static void print_dimi_testparameter(FILE *out, int offset, SaHpiDimiTestParamsDefinitionT param); static void print_dimi_test_data(FILE *out, int offset, SaHpiDimiTestResultsT test); static void print_fumi_rdr(FILE *out, int offset, SaHpiFumiRecT *fumi); static SaErrorT print_fumi_data(FILE *out, int offset, SaHpiSessionIdT sessionId, SaHpiResourceIdT resId, SaHpiFumiRecT *fumi); static void print_fumi_source_info(FILE *out, int offset, SaHpiSessionIdT sessionId, SaHpiResourceIdT resId, SaHpiFumiRecT *fumi, SaHpiBankNumT bnum); static void print_fumi_target_info(FILE *out, int offset, SaHpiSessionIdT sessionId, SaHpiResourceIdT resId, SaHpiFumiRecT *fumi, SaHpiBankNumT bnum); static void print_fumi_logical_target_info(FILE *out, int offset, SaHpiSessionIdT sessionId, SaHpiResourceIdT resId, SaHpiFumiRecT *fumi); static void print_fumi_logical_component_info(FILE *out, int offset, SaHpiFumiLogicalComponentInfoT cinfo); static void print_fumi_component_info(FILE *out, int offset, SaHpiFumiComponentInfoT cinfo); static void print_fumi_fw_info(FILE *out, int offset, SaHpiFumiFirmwareInstanceInfoT data); static void print_textbuffer(FILE *out, int offset, SaHpiTextBufferT data); static SaErrorT print_ep(FILE *out, int offset, const SaHpiEntityPathT *ep); /* * Main */ int main(int argc, char **argv) { SaErrorT rv = SA_OK; SaHpiSessionIdT sessionid; FILE *outfile = stdout; ConfigurationDataT confdata; GOptionContext *context; confdata.mode = MODE_INIT; /* Print version strings */ oh_prog_version(argv[0]); /* Parsing options */ static char usetext[]="- Version " GEN_SIM_DATA_VERSION "\nThe client will print all HPI information in a format that can be parsed by Dynamic" "\nSimulator plugin.\n" OH_SVN_REV; OHC_PREPARE_REVISION(usetext); context = g_option_context_new (usetext); g_option_context_add_main_entries (context, my_options, NULL); if (!ohc_option_parse(&argc, argv, context, &copt, OHC_ALL_OPTIONS - OHC_ENTITY_PATH_OPTION //TODO: Feature 880127 - OHC_VERBOSE_OPTION // no verbose mode - OHC_DEBUG_OPTION )) { // no debug mode GFREE return 1; } if (g_file) { outfile = fopen(g_file, "w"); if (outfile == NULL) { CRIT("%s couldn't be opened for writing.", g_file); GFREE return 1; } } if (g_mode) { int i = 0; while (i < MAX_SHORT_CHAR && g_mode[i] != '\0') { g_mode[i] = toupper((char) g_mode[i]); i++; } if (!strcmp(g_mode, "UPD")) { confdata.mode = MODE_UPD; } else if (!strcmp(g_mode, "INIT")) { confdata.mode = MODE_INIT; } else { fprintf(stderr, "\nUnknown mode %s.\n", g_mode); if (g_file) fclose(outfile); GFREE return 1; } } /** * Initialize the offset strings **/ int i, j; for(j=0; j < MAX_OFFSETS; j++) { for (i=0; i < MAX_OFFSETS*OFFSET_STEP; i++) { offSet[j][i] = OFFSET_FILLER; } offSet[j][OFFSET_STEP*j] = '\0'; } print_header(outfile, 0, confdata); rv = ohc_session_open_by_option ( &copt, &sessionid); if (rv != SA_OK) { if (g_file) fclose(outfile); GFREE return rv; } /* * Resource discovery */ rv = saHpiDiscover(sessionid); if (rv != SA_OK) { printf("saHpiDiscover returns %s\n",oh_lookup_error(rv)); if (g_file) fclose(outfile); GFREE return rv; } print_resources(outfile, 0, sessionid, (SaHpiResourceIdT) g_resourceid); rv = saHpiSessionClose(sessionid); if (g_file) fclose(outfile); GFREE return 0; } /* * */ static void print_header(FILE *out, int offset, ConfigurationDataT data) { int myoffset = offset; char strMode[MAX_CHAR]; if (data.mode == MODE_INIT) { strcpy(strMode, "INIT"); } else { strcpy(strMode, "UPD"); } fprintf(out, "%s%s {\n", offSet[myoffset++], CONF_SECTION); fprintf(out, "%sMODE=%s\n", offSet[myoffset], strMode); fprintf(out, "%sVERSION=%s\n", offSet[myoffset], GEN_SIM_DATA_VERSION); fprintf(out, "%s}\n", offSet[--myoffset]); } static SaErrorT print_resources(FILE *out, int offset, SaHpiSessionIdT sessionid, SaHpiResourceIdT resourceid) { SaErrorT rv = SA_OK, rvRptGet = SA_OK; SaHpiRptEntryT rptentry; SaHpiEntryIdT rptentryid; SaHpiEntryIdT nextrptentryid; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiRdrT rdr; SaHpiTextBufferT working; int myoffset = offset; oh_init_textbuffer(&working); /* walk the RPT list */ rptentryid = SAHPI_FIRST_ENTRY; do { rvRptGet = saHpiRptEntryGet(sessionid,rptentryid,&nextrptentryid,&rptentry); if (rvRptGet != SA_OK) { fprintf(stderr, "RptEntryGet returns %s\n",oh_lookup_error(rvRptGet)); return rvRptGet; } if ((resourceid == SAHPI_UNSPECIFIED_RESOURCE_ID) || (resourceid == rptentry.ResourceId)) { fprintf(out, "%s%s {\n", offSet[myoffset], RPT_SECTION); myoffset++; rv = print_rpt(out, myoffset, &rptentry); if (rptentry.ResourceCapabilities & SAHPI_CAPABILITY_RDR) { /* walk the RDR list for this RPT entry */ entryid = SAHPI_FIRST_ENTRY; fprintf(out, "%s%s {\n", offSet[myoffset], RDR_SECTION); myoffset++; do { rv = saHpiRdrGet(sessionid,rptentry.ResourceId, entryid, &nextentryid, &rdr); if (rv != SA_OK) { fprintf(stderr, "saHpiRdrGet[%u, %u] rv = %s\n", rptentry.ResourceId, entryid, oh_lookup_error(rv)); } rv = print_rdr(out, myoffset, sessionid, rptentry.ResourceId, &rdr); entryid = nextentryid; } while ((rv == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; fprintf(out, "%s}\n", offSet[--myoffset]); } } rptentryid = nextrptentryid; fprintf(out, "%s}\n", offSet[--myoffset]); } while (rptentryid != SAHPI_LAST_ENTRY); return(rv); } /** * print the rpt entries **/ static SaErrorT print_rpt(FILE *out, int offset, SaHpiRptEntryT *rptptr) { SaErrorT rv = SA_OK; int myoffset = offset; fprintf(out, "%sEntryId=%u\n",offSet[myoffset],rptptr->EntryId); fprintf(out, "%sResourceId=%u\n",offSet[myoffset],rptptr->ResourceId); print_resourceInfo(out, myoffset, rptptr->ResourceInfo); fprintf(out, "%sResourceEntity={\n",offSet[myoffset]); myoffset++; rv = print_ep(out, myoffset, &rptptr->ResourceEntity); myoffset--; fprintf(out, "%s}\n", offSet[myoffset]); fprintf(out, "%sResourceCapabilities=0x%08X\n",offSet[myoffset],rptptr->ResourceCapabilities); fprintf(out, "%sHotSwapCapabilities=0x%08X\n",offSet[myoffset],rptptr->HotSwapCapabilities); fprintf(out, "%sResourceSeverity=%u\n",offSet[myoffset],rptptr->ResourceSeverity); fprintf(out, "%sResourceFailed=%u\n",offSet[myoffset],rptptr->ResourceFailed); fprintf(out, "%sResourceTag={\n",offSet[myoffset]); myoffset++; print_textbuffer(out, myoffset, rptptr->ResourceTag); myoffset--; fprintf(out, "%s}\n", offSet[myoffset]); return(rv); } static void print_resourceInfo(FILE *out, int offset, SaHpiResourceInfoT resinfo) { int myoffset = offset; int i; fprintf(out,"%sResourceInfo={\n", offSet[offset]); myoffset++; fprintf(out,"%sResourceRev=0x%02X\n", offSet[myoffset],resinfo.ResourceRev); fprintf(out,"%sSpecificVer=0x%02X\n", offSet[myoffset],resinfo.SpecificVer); fprintf(out,"%sDeviceSupport=0x%02X\n", offSet[myoffset],resinfo.DeviceSupport); fprintf(out,"%sManufacturerId=0x%08X\n", offSet[myoffset],resinfo.ManufacturerId); fprintf(out,"%sProductId=0x%04X\n", offSet[myoffset],resinfo.ProductId); fprintf(out,"%sFirmwareMajorRev=0x%02X\n", offSet[myoffset],resinfo.FirmwareMajorRev); fprintf(out,"%sFirmwareMinorRev=0x%02X\n", offSet[myoffset],resinfo.FirmwareMinorRev); fprintf(out,"%sAuxFirmwareRev=0x%02X\n", offSet[myoffset],resinfo.AuxFirmwareRev); fprintf(out,"%sGuid=\"", offSet[myoffset]); for (i=0; i<16 ; i++) fprintf(out,"%02X", resinfo.Guid[i]); fprintf(out,"\"\n"); fprintf(out,"%s}\n",offSet[offset]); } static SaErrorT print_rdr(FILE *out, int offset, SaHpiSessionIdT sessionid, SaHpiResourceIdT resId, SaHpiRdrT *rdrptr) { int myoffset = offset; SaErrorT rv = SA_OK; switch (rdrptr->RdrType) { case SAHPI_CTRL_RDR: fprintf(out, "%s%s {\n",offSet[myoffset++], CONT_SECTION); print_common_rdr(out, myoffset, rdrptr); fprintf(out, "%s%s {\n",offSet[myoffset++], RDR_DETAIL); rv = print_control_rdr(out, myoffset, sessionid, resId, &rdrptr->RdrTypeUnion.CtrlRec); fprintf(out, "%s}\n", offSet[--myoffset]); break; case SAHPI_SENSOR_RDR: fprintf(out, "%s%s {\n",offSet[myoffset++], SENS_SECTION); print_common_rdr(out, myoffset, rdrptr); fprintf(out, "%s%s {\n",offSet[myoffset++], RDR_DETAIL); print_sensor_rdr(out, myoffset, &rdrptr->RdrTypeUnion.SensorRec); rv = print_sensor_data(out, myoffset, sessionid, resId, &rdrptr->RdrTypeUnion.SensorRec); fprintf(out, "%s}\n", offSet[--myoffset]); break; case SAHPI_INVENTORY_RDR: fprintf(out, "%s%s {\n",offSet[myoffset++], INV_SECTION); print_common_rdr(out, myoffset, rdrptr); fprintf(out, "%s%s {\n",offSet[myoffset++], RDR_DETAIL); print_inventory_rdr(out, myoffset, &rdrptr->RdrTypeUnion.InventoryRec); rv = print_inventory_data(out, myoffset, sessionid, resId, &rdrptr->RdrTypeUnion.InventoryRec); fprintf(out, "%s}\n", offSet[--myoffset]); break; case SAHPI_WATCHDOG_RDR: fprintf(out, "%s%s {\n",offSet[myoffset++], WDT_SECTION); print_common_rdr(out, myoffset, rdrptr); fprintf(out, "%s%s {\n",offSet[myoffset++], RDR_DETAIL); rv = print_watchdog_rdr(out, myoffset, sessionid, resId, &rdrptr->RdrTypeUnion.WatchdogRec); fprintf(out, "%s}\n", offSet[--myoffset]); break; case SAHPI_ANNUNCIATOR_RDR: fprintf(out, "%s%s {\n",offSet[myoffset++], ANN_SECTION); print_common_rdr(out, myoffset, rdrptr); fprintf(out, "%s%s {\n",offSet[myoffset++], RDR_DETAIL); print_annunciator_rdr(out, myoffset, &rdrptr->RdrTypeUnion.AnnunciatorRec); rv = print_annunciator_data(out, myoffset, sessionid, resId, &rdrptr->RdrTypeUnion.AnnunciatorRec); fprintf(out, "%s}\n", offSet[--myoffset]); break; case SAHPI_DIMI_RDR: fprintf(out, "%s%s {\n",offSet[myoffset++], DIMI_SECTION); print_common_rdr(out, myoffset, rdrptr); fprintf(out, "%s%s {\n",offSet[myoffset++], RDR_DETAIL); print_dimi_rdr(out, myoffset, &rdrptr->RdrTypeUnion.DimiRec); rv = print_dimi_data(out, myoffset, sessionid, resId, &rdrptr->RdrTypeUnion.DimiRec); fprintf(out, "%s}\n", offSet[--myoffset]); break; case SAHPI_FUMI_RDR: fprintf(out, "%s%s {\n",offSet[myoffset++], FUMI_SECTION); print_common_rdr(out, myoffset, rdrptr); fprintf(out, "%s%s {\n",offSet[myoffset++], RDR_DETAIL); print_fumi_rdr(out, myoffset, &rdrptr->RdrTypeUnion.FumiRec); rv = print_fumi_data(out, myoffset, sessionid, resId, &rdrptr->RdrTypeUnion.FumiRec); fprintf(out, "%s}\n", offSet[--myoffset]); break; default: fprintf(out, "%sUNKNOWN_RDR={\n",offSet[myoffset++]); } fprintf(out, "%s}\n", offSet[--myoffset]); return rv; } static void print_common_rdr(FILE *out, int offset, SaHpiRdrT *rdrptr) { int myoffset = offset; fprintf(out,"%sRecordId=%u\n",offSet[myoffset], rdrptr->RecordId); fprintf(out,"%sRdrType=%u\n",offSet[myoffset], rdrptr->RdrType); fprintf(out,"%sEntity={\n",offSet[myoffset++]); print_ep(out, myoffset, &rdrptr->Entity); fprintf(out, "%s}\n", offSet[--myoffset]); fprintf(out,"%sIsFru=%u\n",offSet[myoffset], rdrptr->IsFru); fprintf(out,"%sIdString={\n",offSet[myoffset]); myoffset++; print_textbuffer(out, myoffset, rdrptr->IdString); myoffset--; fprintf(out, "%s}\n", offSet[myoffset]); } /** * Fumi functions **/ static void print_fumi_rdr(FILE *out, int offset, SaHpiFumiRecT *fumi) { int myoffset = offset; fprintf(out,"%sNum=%u\n",offSet[myoffset], fumi->Num); fprintf(out,"%sAccessProt=%u\n",offSet[myoffset], fumi->AccessProt); fprintf(out,"%sCapability=%u\n",offSet[myoffset], fumi->Capability); fprintf(out,"%sNumBanks=%u\n",offSet[myoffset], fumi->NumBanks); fprintf(out,"%sOem=%u\n", offSet[myoffset], fumi->Oem); } static SaErrorT print_fumi_data(FILE *out, int offset, SaHpiSessionIdT sessionId, SaHpiResourceIdT resId, SaHpiFumiRecT *fumi) { int myoffset = offset; SaErrorT rv = SA_OK; int printData = TRUE; int i; // Get the fumi specification SaHpiFumiSpecInfoT fumispec; rv = saHpiFumiSpecInfoGet(sessionId, resId, fumi->Num, &fumispec); if (rv != SA_OK) { fprintf(stderr, "saHpiFumiSpecInfoGet returns %s for ResId %u Num %u -" " no fumi data will be printed\n", oh_lookup_error(rv), resId, fumi->Num); printData = FALSE; } SaHpiFumiServiceImpactDataT fumiimpact; rv = saHpiFumiServiceImpactGet(sessionId, resId, fumi->Num, &fumiimpact); if (rv != SA_OK) { fprintf(stderr, "saHpiFumiServiceImpactGet returns %s for ResId %u Num %u -" " no fumi data will be printed\n", oh_lookup_error(rv), resId, fumi->Num); printData = FALSE; rv = SA_OK; // Should not lead to an interruption } if (printData) { fprintf(out,"%s%s={\n", offSet[myoffset++], FUMI_DATA); // Fumi Spec Info fprintf(out,"%sSpecInfoType=%u\n", offSet[myoffset], fumispec.SpecInfoType); if (fumispec.SpecInfoType == SAHPI_FUMI_SPEC_INFO_SAF_DEFINED) { fprintf(out,"%sSafDefined={\n",offSet[myoffset++]); fprintf(out,"%sSpecID=%u\n",offSet[myoffset], fumispec.SpecInfoTypeUnion.SafDefined.SpecID); fprintf(out,"%sRevisionID=%u\n",offSet[myoffset], fumispec.SpecInfoTypeUnion.SafDefined.RevisionID); fprintf(out, "%s}\n",offSet[--myoffset]); } else if (fumispec.SpecInfoType == SAHPI_FUMI_SPEC_INFO_OEM_DEFINED) { fprintf(out,"%sOemDefined={\n",offSet[myoffset++]); fprintf(out,"%sMid=0x%08X\n", offSet[myoffset], fumispec.SpecInfoTypeUnion.OemDefined.Mid); fprintf(out,"%sBodyLength=%u\n",offSet[myoffset], fumispec.SpecInfoTypeUnion.OemDefined.BodyLength); fprintf(out,"%sBody=\"",offSet[myoffset]); for (i = 0; i < fumispec.SpecInfoTypeUnion.OemDefined.BodyLength; i++) fprintf(out,"%02X", fumispec.SpecInfoTypeUnion.OemDefined.Body[i]); fprintf(out,"\"\n"); fprintf(out, "%s}\n", offSet[--myoffset]); } // Fumi AutoRollback if (fumi->Capability & SAHPI_FUMI_CAP_AUTOROLLBACK) { SaHpiBoolT disabled; rv = saHpiFumiAutoRollbackDisableGet(sessionId, resId, fumi->Num, &disabled); if (rv != SA_OK) { fprintf(stderr, " saHpiFumiAutoRollbackDisableGet returns %s for ResId %u Num %u -" " no data is printed\n", oh_lookup_error(rv), resId, fumi->Num); } else { fprintf(out,"%sAutoRollbackDisable=%u\n", offSet[myoffset], disabled); } } // Fumi Service Impact fprintf(out,"%sNumEntities=%u\n", offSet[myoffset], fumiimpact.NumEntities); for ( i = 0; i < fumiimpact.NumEntities; i++) { fprintf(out,"%sImpactedEntities={\n", offSet[myoffset++]); fprintf(out,"%sImpactedEntity={\n", offSet[myoffset++]); print_ep(out, myoffset, &fumiimpact.ImpactedEntities[i].ImpactedEntity); fprintf(out, "%s}\n", offSet[--myoffset]); //ImpactedEntity fprintf(out,"%sServiceImpact=%u\n",offSet[myoffset],fumiimpact.ImpactedEntities[i].ServiceImpact); fprintf(out, "%s}\n", offSet[--myoffset]); // ImpactedEntities } // Fumi Source and Target Information for (i = 0; i <= fumi->NumBanks; i++) { print_fumi_target_info(out, myoffset, sessionId, resId, fumi, i); print_fumi_source_info(out, myoffset, sessionId, resId, fumi, i); } // Fumi logical Target Information print_fumi_logical_target_info(out, myoffset, sessionId, resId, fumi); fprintf(out, "%s}\n", offSet[--myoffset]); // FUMI_DATA } return rv; } static void print_fumi_logical_target_info(FILE *out, int offset, SaHpiSessionIdT sessionId, SaHpiResourceIdT resId, SaHpiFumiRecT *fumi) { int myoffset = offset; SaErrorT rv = SA_OK; SaHpiFumiLogicalBankInfoT logbank; int printHeader = FALSE; rv = saHpiFumiLogicalTargetInfoGet(sessionId, resId, fumi->Num, &logbank); if (rv == SA_OK) { printHeader = TRUE; fprintf(out,"%s%s={\n",offSet[myoffset++], FUMI_LOG_TARGET); fprintf(out,"%sFirmwarePersistentLocationCount=%u\n",offSet[myoffset], logbank.FirmwarePersistentLocationCount); fprintf(out,"%sBankStateFlags=0x%08X\n",offSet[myoffset], logbank.BankStateFlags); fprintf(out,"%sPendingFwInstance={\n",offSet[myoffset++]); print_fumi_fw_info(out, myoffset, logbank.PendingFwInstance); fprintf(out, "%s}\n", offSet[--myoffset]); fprintf(out,"%sRollbackFwInstance={\n",offSet[myoffset++]); print_fumi_fw_info(out, myoffset, logbank.RollbackFwInstance); fprintf(out, "%s}\n", offSet[--myoffset]); } if (fumi->Capability & SAHPI_FUMI_CAP_COMPONENTS) { SaHpiEntryIdT entry = SAHPI_FIRST_ENTRY; SaHpiEntryIdT next; SaHpiFumiLogicalComponentInfoT cinfo; rv = SA_OK; while ((entry != SAHPI_LAST_ENTRY) && (rv == SA_OK)) { rv = saHpiFumiLogicalTargetComponentInfoGet(sessionId, resId, fumi->Num, entry, &next, &cinfo); if (rv == SA_OK) { fprintf(out,"%s%s={\n",offSet[myoffset++], FUMI_LOG_TARGET); printHeader = TRUE; print_fumi_logical_component_info(out, myoffset, cinfo); fprintf(out, "%s}\n", offSet[--myoffset]); // FUMI_TARGET } entry = next; } } if (printHeader) fprintf(out, "%s}\n", offSet[--myoffset]); // FUMI_TARGET } static void print_fumi_target_info(FILE *out, int offset, SaHpiSessionIdT sessionId, SaHpiResourceIdT resId, SaHpiFumiRecT *fumi, SaHpiBankNumT bnum) { int myoffset = offset; SaErrorT rv = SA_OK; SaHpiFumiBankInfoT bank; int printHeader = FALSE; rv = saHpiFumiTargetInfoGet(sessionId, resId, fumi->Num, bnum, &bank); if (rv == SA_OK) { printHeader = TRUE; fprintf(out,"%s%s={\n",offSet[myoffset++], FUMI_TARGET); fprintf(out,"%sBankId=%u\n", offSet[myoffset], bank.BankId); fprintf(out,"%sBankSize=%u\n", offSet[myoffset], bank.BankSize); fprintf(out,"%sPosition=%u\n", offSet[myoffset], bank.Position); fprintf(out,"%sBankState=%u\n", offSet[myoffset], bank.BankState); fprintf(out,"%sIdentifier={\n",offSet[myoffset++]); print_textbuffer(out, myoffset, bank.Identifier); fprintf(out, "%s}\n", offSet[--myoffset]); fprintf(out,"%sDescription={\n",offSet[myoffset++]); print_textbuffer(out, myoffset, bank.Description); fprintf(out, "%s}\n", offSet[--myoffset]); fprintf(out,"%sDateTime={\n",offSet[myoffset++]); print_textbuffer(out, myoffset, bank.DateTime); fprintf(out, "%s}\n", offSet[--myoffset]); fprintf(out, "%sMajorVersion=%u\n", offSet[myoffset], bank.MajorVersion); fprintf(out, "%sMinorVersion=%u\n", offSet[myoffset], bank.MinorVersion); fprintf(out, "%sAuxVersion=%u\n", offSet[myoffset], bank.AuxVersion); } if (fumi->Capability & SAHPI_FUMI_CAP_COMPONENTS) { SaHpiEntryIdT entry = SAHPI_FIRST_ENTRY; SaHpiEntryIdT next; SaHpiFumiComponentInfoT cinfo; rv = SA_OK; while ((entry != SAHPI_LAST_ENTRY) && (rv == SA_OK)) { rv = saHpiFumiTargetComponentInfoGet(sessionId, resId, fumi->Num, bnum, entry, &next, &cinfo); if (rv == SA_OK) { fprintf(out,"%s%s={\n",offSet[myoffset++], FUMI_TARGET); printHeader = TRUE; print_fumi_component_info(out, myoffset, cinfo); fprintf(out, "%s}\n", offSet[--myoffset]); // FUMI_TARGET } entry = next; } } if (printHeader) fprintf(out, "%s}\n", offSet[--myoffset]); // FUMI_TARGET } static void print_fumi_source_info(FILE *out, int offset, SaHpiSessionIdT sessionId, SaHpiResourceIdT resId, SaHpiFumiRecT *fumi, SaHpiBankNumT bnum) { int myoffset = offset; SaErrorT rv = SA_OK; SaHpiFumiSourceInfoT source; int printHeader = FALSE; rv = saHpiFumiSourceInfoGet(sessionId, resId, fumi->Num, bnum, &source); if (rv == SA_OK) { printHeader = TRUE; fprintf(out,"%s%s={\n",offSet[myoffset++], FUMI_SOURCE); fprintf(out,"%sForBank=%u\n", offSet[myoffset], bnum); fprintf(out,"%sSourceUri={\n",offSet[myoffset++]); print_textbuffer(out, myoffset, source.SourceUri); fprintf(out, "%s}\n", offSet[--myoffset]); fprintf(out,"%sSourceStatus=%u\n", offSet[myoffset], source.SourceStatus); fprintf(out,"%sIdentifier={\n",offSet[myoffset++]); print_textbuffer(out, myoffset, source.Identifier); fprintf(out, "%s}\n", offSet[--myoffset]); fprintf(out,"%sDescription={\n",offSet[myoffset++]); print_textbuffer(out, myoffset, source.Description); fprintf(out, "%s}\n", offSet[--myoffset]); fprintf(out,"%sDateTime={\n",offSet[myoffset++]); print_textbuffer(out, myoffset, source.DateTime); fprintf(out, "%s}\n", offSet[--myoffset]); fprintf(out, "%sMajorVersion=%u\n", offSet[myoffset], source.MajorVersion); fprintf(out, "%sMinorVersion=%u\n", offSet[myoffset], source.MinorVersion); fprintf(out, "%sAuxVersion=%u\n", offSet[myoffset], source.AuxVersion); } if (fumi->Capability & SAHPI_FUMI_CAP_COMPONENTS) { SaHpiEntryIdT entry = SAHPI_FIRST_ENTRY; SaHpiEntryIdT next; SaHpiFumiComponentInfoT cinfo; rv = SA_OK; while ((entry != SAHPI_LAST_ENTRY) && (rv == SA_OK)) { rv = saHpiFumiSourceComponentInfoGet(sessionId, resId, fumi->Num, bnum, entry, &next, &cinfo); if (rv == SA_OK) { fprintf(out,"%s%s={\n",offSet[myoffset++], FUMI_SOURCE); printHeader = TRUE; print_fumi_component_info(out, myoffset, cinfo); fprintf(out, "%s}\n", offSet[--myoffset]); // FUMI_SOURCE } entry = next; } } if (printHeader) fprintf(out, "%s}\n", offSet[--myoffset]); // FUMI_SOURCE } static void print_fumi_logical_component_info(FILE *out, int offset, SaHpiFumiLogicalComponentInfoT cinfo) { int myoffset = offset; fprintf(out, "%sEntryId=%u\n", offSet[myoffset], cinfo.EntryId); fprintf(out, "%sComponentId=%u\n", offSet[myoffset], cinfo.ComponentId); fprintf(out, "%sPendingFwInstance={\n",offSet[myoffset++]); print_fumi_fw_info(out, myoffset, cinfo.PendingFwInstance); fprintf(out, "%s}\n", offSet[--myoffset]); // PendingFwInstance fprintf(out, "%sRollbackFwInstance={\n",offSet[myoffset++]); print_fumi_fw_info(out, myoffset, cinfo.RollbackFwInstance); fprintf(out, "%s}\n", offSet[--myoffset]); // RollbackFwInstance fprintf(out, "%sComponentFlags=%u\n",offSet[myoffset], cinfo.ComponentFlags); } static void print_fumi_component_info(FILE *out, int offset, SaHpiFumiComponentInfoT cinfo) { int myoffset = offset; fprintf(out, "%sEntryId=%u\n", offSet[myoffset], cinfo.EntryId); fprintf(out, "%sComponentId=%u\n", offSet[myoffset], cinfo.ComponentId); fprintf(out, "%sMainFwInstance={\n",offSet[myoffset++]); print_fumi_fw_info(out, myoffset, cinfo.MainFwInstance); fprintf(out, "%s}\n", offSet[--myoffset]); // MainFwInstance fprintf(out, "%sComponentFlags=%u\n",offSet[myoffset], cinfo.ComponentFlags); } static void print_fumi_fw_info(FILE *out, int offset, SaHpiFumiFirmwareInstanceInfoT data) { int myoffset = offset; fprintf(out,"%sInstancePresent=%u\n",offSet[myoffset], data.InstancePresent); fprintf(out,"%sIdentifier={\n",offSet[myoffset++]); print_textbuffer(out, myoffset, data.Identifier); fprintf(out, "%s}\n", offSet[--myoffset]); fprintf(out,"%sDescription={\n",offSet[myoffset++]); print_textbuffer(out, myoffset, data.Description); fprintf(out, "%s}\n", offSet[--myoffset]); fprintf(out,"%sDateTime={\n",offSet[myoffset++]); print_textbuffer(out, myoffset, data.DateTime); fprintf(out, "%s}\n", offSet[--myoffset]); fprintf(out, "%sMajorVersion=%u\n", offSet[myoffset], data.MajorVersion); fprintf(out, "%sMinorVersion=%u\n", offSet[myoffset], data.MinorVersion); fprintf(out, "%sAuxVersion=%u\n", offSet[myoffset], data.AuxVersion); } /** * Dimi functions **/ static void print_dimi_rdr(FILE *out, int offset, SaHpiDimiRecT *dimi) { int myoffset = offset; fprintf(out,"%sDimiNum=%u\n",offSet[myoffset], dimi->DimiNum); fprintf(out,"%sOem=%u\n", offSet[myoffset], dimi->Oem); } static SaErrorT print_dimi_data(FILE *out, int offset, SaHpiSessionIdT sessionId, SaHpiResourceIdT resId, SaHpiDimiRecT *dimi) { int myoffset = offset; int i,j; SaErrorT rv = SA_OK; SaHpiDimiInfoT testinfo; rv = saHpiDimiInfoGet(sessionId, resId, dimi->DimiNum, &testinfo); if (rv != SA_OK) { fprintf(stderr, "saHpiDimiInfoGet returns %s for ResId %u Num %u - will be Ignored, all is set to 0\n", oh_lookup_error(rv), resId, dimi->DimiNum); testinfo.NumberOfTests = 0; testinfo.TestNumUpdateCounter = 0; rv = SA_OK; } fprintf(out,"%s%s={\n", offSet[myoffset++], DIMI_DATA); fprintf(out,"%sNumberOfTests=%u\n", offSet[myoffset], testinfo.NumberOfTests); fprintf(out,"%sTestNumUpdateCounter=%u\n", offSet[myoffset], testinfo.TestNumUpdateCounter); for (i = 0; i < testinfo.NumberOfTests; i++) { SaHpiDimiTestT testcase; rv = saHpiDimiTestInfoGet(sessionId, resId, dimi->DimiNum, i, &testcase); if (rv != SA_OK) { fprintf(stderr, "saHpiDimiTestInfoGet returns %s for ResId %u DimiNum %u Test %u-" "will be Ignored, no data is printed\n", oh_lookup_error(rv), resId, dimi->DimiNum, i); rv = SA_OK; } else { // Testcase fprintf(out,"%s%s={\n", offSet[myoffset++], DIMI_TEST); fprintf(out,"%sTestName={\n", offSet[myoffset++]); print_textbuffer(out, myoffset, testcase.TestName); fprintf(out, "%s}\n", offSet[--myoffset]); fprintf(out,"%sServiceImpact=%u\n",offSet[myoffset], testcase.ServiceImpact); for (j = 0; j < SAHPI_DIMITEST_MAX_ENTITIESIMPACTED; j++) { fprintf(out,"%sEntitiesImpacted={\n", offSet[myoffset++]); fprintf(out,"%sEntityImpacted={\n", offSet[myoffset++]); print_ep(out, myoffset, &testcase.EntitiesImpacted[j].EntityImpacted); fprintf(out, "%s}\n", offSet[--myoffset]); fprintf(out,"%sServiceImpact=%u\n",offSet[myoffset],testcase.EntitiesImpacted[j].ServiceImpact); fprintf(out, "%s}\n", offSet[--myoffset]); } fprintf(out,"%sNeedServiceOS=%u\n",offSet[myoffset], testcase.NeedServiceOS); fprintf(out,"%sServiceOS={\n", offSet[myoffset++]); print_textbuffer(out, myoffset, testcase.ServiceOS); fprintf(out, "%s}\n", offSet[--myoffset]); fprintf(out,"%sExpectedRunDuration=%ld\n",offSet[myoffset], (long int) testcase.ExpectedRunDuration); fprintf(out,"%sTestCapabilities=%u\n",offSet[myoffset], testcase.TestCapabilities); for (j = 0; j < SAHPI_DIMITEST_MAX_PARAMETERS; j++) { fprintf(out,"%sTestParameters={\n", offSet[myoffset++]); print_dimi_testparameter(out, myoffset, testcase.TestParameters[j]); fprintf(out, "%s}\n", offSet[--myoffset]); // TestParameters } // Testcase readiness SaErrorT rv_testdata = SA_OK; SaHpiDimiReadyT testready; rv_testdata = saHpiDimiTestReadinessGet(sessionId, resId, dimi->DimiNum, i, &testready); if (rv_testdata != SA_OK) { fprintf(stderr, "saHpiDimiTestReadinessGet returns %s for ResId %u DimiNum %u Test %u-" "SAHPI_DIMI_WRONG_STATE is used instead\n", oh_lookup_error(rv), resId, dimi->DimiNum, i); testready = SAHPI_DIMI_WRONG_STATE; } fprintf(out,"%sTestReadiness=%u\n", offSet[myoffset], testready); // Testcase data SaHpiDimiTestResultsT testresult; rv_testdata = saHpiDimiTestResultsGet(sessionId, resId, dimi->DimiNum, i, &testresult); if (rv_testdata != SA_OK) { fprintf(stderr, "saHpiDimiTestResultsGet returns %s for ResId %u DimiNum %u Test %u -" "will be Ignored, no data is printed\n", oh_lookup_error(rv), resId, dimi->DimiNum, i); } else { fprintf(out,"%s%s={\n", offSet[myoffset++], DIMI_TEST_DATA); print_dimi_test_data(out, myoffset, testresult); fprintf(out, "%s}\n", offSet[--myoffset]); // DIMI_TEST_DATA } fprintf(out, "%s}\n", offSet[--myoffset]); // DIMI_TEST } } fprintf(out, "%s}\n", offSet[--myoffset]); // DIMI_DATA return rv; } static void print_dimi_testparameter(FILE *out, int offset, SaHpiDimiTestParamsDefinitionT param) { int myoffset = offset; fprintf(out,"%sParamName=\"%s\"\n", offSet[myoffset], (char *) param.ParamName); fprintf(out,"%sParamInfo={\n", offSet[myoffset++]); print_textbuffer(out, myoffset, param.ParamInfo); fprintf(out, "%s}\n", offSet[--myoffset]); fprintf(out,"%sParamType=%u\n", offSet[myoffset],param.ParamType); switch (param.ParamType) { case SAHPI_DIMITEST_PARAM_TYPE_BOOLEAN: fprintf(out,"%sDefaultParam=%u\n", offSet[myoffset], param.DefaultParam.parambool); break; case SAHPI_DIMITEST_PARAM_TYPE_INT32: fprintf(out,"%sMinValue=%d\n", offSet[myoffset], param.MinValue.IntValue); fprintf(out,"%sMaxValue=%d\n", offSet[myoffset], param.MaxValue.IntValue); fprintf(out,"%sDefaultParam=%d\n", offSet[myoffset], param.DefaultParam.paramint); break; case SAHPI_DIMITEST_PARAM_TYPE_FLOAT64: fprintf(out,"%sMinValue=%lf\n", offSet[myoffset], param.MinValue.FloatValue); fprintf(out,"%sMaxValue=%lf\n", offSet[myoffset], param.MaxValue.FloatValue); fprintf(out,"%sDefaultParam=%lf\n", offSet[myoffset], param.DefaultParam.paramfloat); break; case SAHPI_DIMITEST_PARAM_TYPE_TEXT: fprintf(out,"%sDefaultParam={\n", offSet[myoffset++]); print_textbuffer(out, myoffset, param.DefaultParam.paramtext); fprintf(out, "%s}\n", offSet[--myoffset]); default: fprintf(out,"%sUNKNOWN_PARAM_TYPE\n", offSet[myoffset]); } } static void print_dimi_test_data(FILE *out, int offset, SaHpiDimiTestResultsT test) { int myoffset = offset; fprintf(out,"%sResultTimeStamp=%ld\n", offSet[myoffset], (long int) test.ResultTimeStamp); fprintf(out,"%sRunDuration=%ld\n", offSet[myoffset], (long int) test.RunDuration); fprintf(out,"%sLastRunStatus=%u\n", offSet[myoffset], test.LastRunStatus); fprintf(out,"%sTestErrorCode=%u\n", offSet[myoffset], test.TestErrorCode); fprintf(out,"%sTestResultString={\n", offSet[myoffset++]); print_textbuffer(out, myoffset, test.TestResultString); fprintf(out, "%s}\n", offSet[--myoffset]); fprintf(out,"%sTestResultStringIsURI=%d\n", offSet[myoffset], test.TestResultStringIsURI); } /** * Annunciator functions **/ static void print_annunciator_rdr(FILE *out, int offset, SaHpiAnnunciatorRecT *ann) { int myoffset = offset; fprintf(out,"%sAnnunciatorNum=%u\n",offSet[myoffset], ann->AnnunciatorNum); fprintf(out,"%sAnnunciatorType=0x%02X\n",offSet[myoffset], ann->AnnunciatorType); fprintf(out,"%sModeReadOnly=%d\n",offSet[myoffset], ann->ModeReadOnly); fprintf(out,"%sMaxConditions=%u\n", offSet[myoffset], ann->MaxConditions); fprintf(out,"%sOem=%u\n", offSet[myoffset], ann->Oem); } static SaErrorT print_annunciator_data(FILE *out, int offset, SaHpiSessionIdT sessionId, SaHpiResourceIdT resId, SaHpiAnnunciatorRecT *ann) { int myoffset = offset; SaErrorT rv = SA_OK; SaErrorT rv_loop = SA_OK; SaHpiAnnunciatorModeT annMode; // Due to the fact that the Annunciator is supported only by few implementations // An error in the following function will not stop the processing rv = saHpiAnnunciatorModeGet(sessionId, resId, ann->AnnunciatorNum, &annMode); if (rv != SA_OK) { fprintf(stderr, "AnnunciatorModeGet returns %s for ResId %u Num %u - will be Ignored\n", oh_lookup_error(rv), resId, ann->AnnunciatorNum); annMode = SAHPI_ANNUNCIATOR_MODE_AUTO; rv = SA_OK; } fprintf(out,"%s%s={\n", offSet[myoffset++], ANN_DATA); fprintf(out,"%sMode=%u\n", offSet[myoffset], annMode); SaHpiAnnouncementT announcement; announcement.EntryId = SAHPI_FIRST_ENTRY; while (rv_loop == SA_OK) { rv_loop = saHpiAnnunciatorGetNext(sessionId, resId, ann->AnnunciatorNum, SAHPI_ALL_SEVERITIES, SAHPI_FALSE, &announcement); if (rv_loop == SA_OK) { fprintf(out,"%s%s={\n", offSet[myoffset++], ANNOUNCEMENT); fprintf(out,"%sEntryId=%u\n", offSet[myoffset], announcement.EntryId); fprintf(out,"%sTimestamp=%ld\n", offSet[myoffset], (long int) announcement.Timestamp); fprintf(out,"%sAddedByUser=%d\n", offSet[myoffset], announcement.AddedByUser); fprintf(out,"%sSeverity=%u\n", offSet[myoffset], announcement.Severity); fprintf(out,"%sAcknowledged=%d\n", offSet[myoffset], announcement.Acknowledged); fprintf(out,"%sStatusCond={\n", offSet[myoffset++]); print_annunciator_cond(out, myoffset, announcement.StatusCond); fprintf(out, "%s}\n", offSet[--myoffset]); // StatusCond fprintf(out, "%s}\n", offSet[--myoffset]); // ANNOUNCEMENT } } fprintf(out, "%s}\n", offSet[--myoffset]); // ANN_DATA return rv; } static void print_annunciator_cond(FILE *out, int offset, SaHpiConditionT cond) { int myoffset = offset; int i; fprintf(out,"%sType=%u\n", offSet[myoffset], cond.Type); fprintf(out,"%sEntity={\n",offSet[myoffset++]); print_ep(out, myoffset, &cond.Entity); fprintf(out, "%s}\n", offSet[--myoffset]); fprintf(out, "%sDomainId=%u\n", offSet[myoffset], cond.DomainId); fprintf(out, "%sResourceId=%u\n", offSet[myoffset], cond.ResourceId); if (cond.Type == SAHPI_STATUS_COND_TYPE_SENSOR) { fprintf(out, "%sSensorNum=%u\n", offSet[myoffset], cond.SensorNum); fprintf(out, "%sEventState=0x%04X\n", offSet[myoffset], cond.EventState); } fprintf(out,"%sName={\n",offSet[myoffset++]); fprintf(out, "%sLength=%u\n",offSet[myoffset], cond.Name.Length); fprintf(out, "%sValue=\"",offSet[myoffset]); for (i = 0; i < cond.Name.Length; i++) fprintf(out, "%c", cond.Name.Value[i]); fprintf(out, "\"\n"); fprintf(out, "%s}\n", offSet[--myoffset]); if (cond.Type == SAHPI_STATUS_COND_TYPE_OEM) { fprintf(out, "%sMid=0x%08X\n", offSet[myoffset], cond.Mid); } fprintf(out,"%sData={\n",offSet[myoffset++]); print_textbuffer(out, myoffset, cond.Data); fprintf(out, "%s}\n", offSet[--myoffset]); } /** * Watchdog functions **/ static SaErrorT print_watchdog_rdr(FILE *out, int offset, SaHpiSessionIdT sessionId, SaHpiResourceIdT resId, SaHpiWatchdogRecT *wdt) { int myoffset = offset; SaErrorT rv = SA_OK; fprintf(out,"%sWatchdogNum=%u\n", offSet[myoffset], wdt->WatchdogNum); fprintf(out,"%sOem=%u\n", offSet[myoffset], wdt->Oem); SaHpiWatchdogT wdtTimer; rv = saHpiWatchdogTimerGet(sessionId, resId, wdt->WatchdogNum, &wdtTimer); if (rv != SA_OK) { fprintf(stderr, "WatchdogTimerGet returns %s for ResId %u Num %u\n", oh_lookup_error(rv), resId, wdt->WatchdogNum); return rv; } fprintf(out,"%s%s={\n",offSet[myoffset++],WDT_GET); fprintf(out,"%sLog=%d\n", offSet[myoffset], wdtTimer.Log); fprintf(out,"%sRunning=%d\n", offSet[myoffset], wdtTimer.Running); fprintf(out,"%sTimerUse=0x%02X\n", offSet[myoffset], wdtTimer.TimerUse); fprintf(out,"%sTimerAction=0x%02X\n", offSet[myoffset], wdtTimer.TimerAction); fprintf(out,"%sPretimerInterrupt=0x%02X\n", offSet[myoffset], wdtTimer.PretimerInterrupt); fprintf(out,"%sPreTimeoutInterval=%u\n", offSet[myoffset], wdtTimer.PreTimeoutInterval); fprintf(out,"%sTimerUseExpFlags=0x%02X\n", offSet[myoffset], wdtTimer.TimerUseExpFlags); fprintf(out,"%sInitialCount=%u\n", offSet[myoffset], wdtTimer.InitialCount); fprintf(out,"%sPresentCount=%u\n", offSet[myoffset], wdtTimer.PresentCount); fprintf(out, "%s}\n", offSet[--myoffset]); // WDT_GET return rv; } /** * Inventory functions **/ static void print_inventory_rdr(FILE *out, int offset, SaHpiInventoryRecT *inv) { int myoffset = offset; fprintf(out,"%sIdrId=%u\n", offSet[myoffset], inv->IdrId); fprintf(out,"%sPersistent=%d\n", offSet[myoffset], inv->Persistent); fprintf(out,"%sOem=%u\n", offSet[myoffset], inv->Oem); } static SaErrorT print_inventory_data(FILE *out, int offset, SaHpiSessionIdT sessionId, SaHpiResourceIdT resId, SaHpiInventoryRecT *inv) { int myoffset = offset; SaErrorT rv = SA_OK; SaHpiIdrInfoT idrInfo; rv = saHpiIdrInfoGet(sessionId, resId, inv->IdrId, &idrInfo); if (rv != SA_OK) { fprintf(stderr, "IdrInfoGet returns %s for ResId %u IdrId %u\n", oh_lookup_error(rv), resId, inv->IdrId); return rv; } fprintf(out,"%s%s={\n",offSet[myoffset++],INVENTORY_DATA); fprintf(out,"%sIdrId=%u\n", offSet[myoffset], idrInfo.IdrId); fprintf(out,"%sUpdateCount=%u\n", offSet[myoffset], idrInfo.UpdateCount); fprintf(out,"%sReadOnly=%d\n", offSet[myoffset], idrInfo.ReadOnly); fprintf(out,"%sNumAreas=%u\n", offSet[myoffset], idrInfo.NumAreas); SaHpiEntryIdT areaId = SAHPI_FIRST_ENTRY; SaHpiEntryIdT nextId; SaHpiIdrAreaHeaderT header; int numAreas = 0; while ((areaId != SAHPI_LAST_ENTRY) && (rv == SA_OK) && (numAreas <= idrInfo.NumAreas)) { rv = saHpiIdrAreaHeaderGet(sessionId, resId, inv->IdrId, SAHPI_IDR_AREATYPE_UNSPECIFIED, areaId, &nextId, &header); if (rv != SA_OK) { fprintf(stderr, "IdrAreaHeaderGet returns %s for ResId %u IdrId %u areaId %u\n", oh_lookup_error(rv), resId, inv->IdrId, areaId); break; } numAreas++; areaId = nextId; rv = print_inventory_area_data(out, myoffset, sessionId, resId, inv, &header); } fprintf(out, "%s}\n", offSet[--myoffset]); //INVENTORY_DATA return rv; } static SaErrorT print_inventory_area_data(FILE *out, int offset, SaHpiSessionIdT sessionId, SaHpiResourceIdT resId, SaHpiInventoryRecT *inv, SaHpiIdrAreaHeaderT *area) { int myoffset = offset; SaErrorT rv = SA_OK; fprintf(out,"%s%s={\n", offSet[myoffset++], INV_AREA_DATA); fprintf(out,"%sAreaId=%u\n", offSet[myoffset], area->AreaId); fprintf(out,"%sType=%u\n", offSet[myoffset], area->Type); fprintf(out,"%sReadOnly=%d\n", offSet[myoffset], area->ReadOnly); fprintf(out,"%sNumFields=%u\n", offSet[myoffset], area->NumFields); SaHpiEntryIdT fieldId = SAHPI_FIRST_ENTRY; SaHpiEntryIdT nextId; SaHpiIdrFieldT field; int numFields = 0; while ((fieldId != SAHPI_LAST_ENTRY) && (rv == SA_OK) && (numFields <= area->NumFields)) { rv = saHpiIdrFieldGet(sessionId, resId, inv->IdrId, area->AreaId, SAHPI_IDR_FIELDTYPE_UNSPECIFIED, fieldId, &nextId, &field); if (rv != SA_OK) { fprintf(stderr, "IdrFieldGet returns %s for ResId %u IdrId %u areaId %u fieldId %u\n", oh_lookup_error(rv), resId, inv->IdrId, area->AreaId, fieldId); break; } fieldId = nextId; numFields++; fprintf(out,"%s%s={\n", offSet[myoffset++], INV_FIELD_DATA); print_inventory_field(out, myoffset, field); fprintf(out,"%s}\n", offSet[--myoffset]); // INV_FIELD_DATA } fprintf(out,"%s}\n", offSet[--myoffset]); // INV_AREA_DATA return rv; } static void print_inventory_field(FILE *out, int offset, SaHpiIdrFieldT field) { int myoffset = offset; fprintf(out,"%sAreaId=%u\n", offSet[myoffset], field.AreaId); fprintf(out,"%sFieldId=%u\n", offSet[myoffset], field.FieldId); fprintf(out,"%sType=%u\n", offSet[myoffset], field.Type); fprintf(out,"%sReadOnly=%d\n", offSet[myoffset], field.ReadOnly); fprintf(out,"%sField={\n", offSet[myoffset++]); print_textbuffer(out, myoffset, field.Field); fprintf(out,"%s}\n", offSet[--myoffset]); } /** * Control functions **/ static SaErrorT print_control_rdr(FILE *out, int offset, SaHpiSessionIdT sessionId, SaHpiResourceIdT resId, SaHpiCtrlRecT *ctrl) { int myoffset = offset; int i; SaErrorT rv = SA_OK; SaHpiCtrlModeT modeGet; SaHpiCtrlStateT stateGet; SaHpiBoolT allowGet = ( ctrl->WriteOnly != SAHPI_FALSE ) ? SAHPI_FALSE : SAHPI_TRUE; if (allowGet) rv = saHpiControlGet(sessionId, resId, ctrl->Num, &modeGet, &stateGet); if (rv != SA_OK) { fprintf(stderr, "ControlGet returns %s for ResId %u ControlNum %u\n", oh_lookup_error(rv), resId, ctrl->Num); } fprintf(out, "%sNum=%u\n", offSet[myoffset], ctrl->Num); fprintf(out, "%sOutputType=%u\n", offSet[myoffset], ctrl->OutputType); fprintf(out, "%sType=%u\n", offSet[myoffset], ctrl->Type); switch (ctrl->Type) { case SAHPI_CTRL_TYPE_DIGITAL: fprintf(out, "%sTypeUnion.Digital={\n", offSet[myoffset]); myoffset++; fprintf(out,"%sDefault=%u\n", offSet[myoffset], ctrl->TypeUnion.Digital.Default); if (allowGet) if (stateGet.StateUnion.Digital != ctrl->TypeUnion.Digital.Default) fprintf(out,"%s%s=%u\n", offSet[myoffset], CONTROL_GET, stateGet.StateUnion.Digital); break; case SAHPI_CTRL_TYPE_DISCRETE: fprintf(out, "%sTypeUnion.Discrete={\n", offSet[myoffset]); myoffset++; fprintf(out,"%sDefault=%u\n", offSet[myoffset], ctrl->TypeUnion.Discrete.Default); if (allowGet) if (stateGet.StateUnion.Discrete != ctrl->TypeUnion.Discrete.Default) fprintf(out,"%s%s=%u\n", offSet[myoffset], CONTROL_GET, stateGet.StateUnion.Discrete); break; case SAHPI_CTRL_TYPE_ANALOG: fprintf(out, "%sTypeUnion.Analog={\n", offSet[myoffset]); myoffset++; fprintf(out,"%sMin=%d\n", offSet[myoffset], ctrl->TypeUnion.Analog.Min); fprintf(out,"%sMax=%d\n", offSet[myoffset], ctrl->TypeUnion.Analog.Max); fprintf(out,"%sDefault=%d\n", offSet[myoffset], ctrl->TypeUnion.Analog.Default); if (allowGet) if (stateGet.StateUnion.Analog != ctrl->TypeUnion.Analog.Default) fprintf(out,"%s%s=%u\n", offSet[myoffset], CONTROL_GET, stateGet.StateUnion.Analog); break; case SAHPI_CTRL_TYPE_STREAM: fprintf(out, "%sTypeUnion.Stream={\n", offSet[myoffset]); myoffset++; fprintf(out, "%sDefault={\n",offSet[myoffset]); myoffset++; print_control_state_stream(out, myoffset, ctrl->TypeUnion.Stream.Default); myoffset--; fprintf(out, "%s}\n", offSet[myoffset]); if (allowGet) { if (memcmp(&ctrl->TypeUnion.Stream.Default, &stateGet.StateUnion.Stream, sizeof(SaHpiCtrlStateStreamT))) { fprintf(out, "%s%s={\n",offSet[myoffset], CONTROL_GET); myoffset++; print_control_state_stream(out, myoffset, stateGet.StateUnion.Stream); myoffset--; fprintf(out, "%s}\n", offSet[myoffset]); } } break; case SAHPI_CTRL_TYPE_TEXT: fprintf(out, "%sTypeUnion.Text={\n", offSet[myoffset]); myoffset++; fprintf(out, "%sMaxChars=%u\n",offSet[myoffset], ctrl->TypeUnion.Text.MaxChars); fprintf(out, "%sMaxLines=%u\n",offSet[myoffset], ctrl->TypeUnion.Text.MaxLines); fprintf(out, "%sLanguage=%u\n",offSet[myoffset], ctrl->TypeUnion.Text.Language); fprintf(out, "%sDataType=%u\n",offSet[myoffset], ctrl->TypeUnion.Text.DataType); fprintf(out, "%sDefault={\n",offSet[myoffset]); myoffset++; print_control_state_text(out, myoffset, ctrl->TypeUnion.Text.Default); myoffset--; fprintf(out, "%s}\n", offSet[myoffset]); if(allowGet) { // To make sure we've got all lines, we call ControlGet a second time stateGet.StateUnion.Text.Line = SAHPI_TLN_ALL_LINES; rv = saHpiControlGet(sessionId, resId, ctrl->Num, &modeGet, &stateGet); if (rv != SA_OK) { fprintf(stderr, "ControlGet returns %s for ResId %u ControlNum %u\n", oh_lookup_error(rv), resId, ctrl->Num); } if (memcmp(&ctrl->TypeUnion.Text.Default, &stateGet.StateUnion.Text, sizeof(SaHpiCtrlStateTextT))) { fprintf(out, "%s%s={\n",offSet[myoffset], CONTROL_GET); myoffset++; print_control_state_text(out, myoffset, stateGet.StateUnion.Text); myoffset--; fprintf(out, "%s}\n", offSet[myoffset]); } } break; case SAHPI_CTRL_TYPE_OEM: fprintf(out, "%sTypeUnion.Oem={\n",offSet[myoffset++]); fprintf(out, "%sMId=0x%08X\n", offSet[myoffset], ctrl->TypeUnion.Oem.MId); fprintf(out, "%sConfigData=\"", offSet[myoffset]); for (i = 0; i < SAHPI_CTRL_OEM_CONFIG_LENGTH; i++) fprintf(out,"%02X", ctrl->TypeUnion.Oem.ConfigData[i]); fprintf(out,"\"\n"); fprintf(out, "%sDefault={\n",offSet[myoffset++]); print_control_state_oem(out, myoffset, ctrl->TypeUnion.Oem.Default); fprintf(out, "%s}\n", offSet[--myoffset]); if(allowGet) { if (memcmp(&ctrl->TypeUnion.Oem.Default, &stateGet.StateUnion.Oem, sizeof(SaHpiCtrlStateOemT))) { fprintf(out, "%s%s={\n",offSet[myoffset++], CONTROL_GET); print_control_state_oem(out, myoffset, stateGet.StateUnion.Oem); fprintf(out, "%s}\n", offSet[--myoffset]); } } break; default: fprintf(out, "%sCTRL_TYPE_UNKNOWN={\n",offSet[myoffset++]); } fprintf(out, "%s}\n", offSet[--myoffset]); fprintf(out, "%sDefaultMode={\n", offSet[myoffset++]); fprintf(out, "%sMode=%u\n", offSet[myoffset], ctrl->DefaultMode.Mode); fprintf(out, "%sReadOnly=%d\n", offSet[myoffset], ctrl->DefaultMode.ReadOnly); fprintf(out, "%s}\n", offSet[--myoffset]); if(allowGet) { // Check whether the mode was changed if ( ctrl->DefaultMode.Mode != modeGet ) { fprintf(out, "%s%s={\n",offSet[myoffset++], CONTROL_GET); fprintf(out, "%sMode=%u\n", offSet[myoffset], modeGet); fprintf(out, "%s}\n", offSet[--myoffset]); } } fprintf(out, "%sWriteOnly=%d\n", offSet[myoffset], ctrl->WriteOnly); fprintf(out, "%sOem=%d\n", offSet[myoffset], ctrl->Oem); return rv; } static void print_control_state_stream(FILE *out, int offset, SaHpiCtrlStateStreamT data) { int i; fprintf(out,"%sRepeat=%d\n", offSet[offset], data.Repeat); fprintf(out,"%sStreamLength=%u\n", offSet[offset], data.StreamLength); fprintf(out,"%sStream=\"", offSet[offset]); for (i = 0; i < data.StreamLength; i++) fprintf(out,"%02X", data.Stream[i]); fprintf(out,"\"\n"); } static void print_control_state_text(FILE *out, int offset, SaHpiCtrlStateTextT data) { int myoffset = offset; fprintf(out, "%sLine=%u\n",offSet[myoffset], data.Line); fprintf(out, "%sText={\n",offSet[myoffset++]); print_textbuffer(out, myoffset, data.Text); fprintf(out, "%s}\n", offSet[--myoffset]); } static void print_control_state_oem(FILE *out, int offset, SaHpiCtrlStateOemT data) { int i; fprintf(out, "%sMId=0x%08X\n", offSet[offset], data.MId); fprintf(out, "%sBodyLength=%u\n",offSet[offset], data.BodyLength); fprintf(out, "%sBody=\"",offSet[offset]); for (i = 0; i < data.BodyLength; i++) fprintf(out,"%02X", data.Body[i]); fprintf(out,"\"\n"); } /** * Sensor functions **/ static void print_sensor_rdr(FILE *out, int offset, SaHpiSensorRecT *sens) { int myoffset = offset; fprintf(out, "%sNum=%u\n", offSet[myoffset], sens->Num); fprintf(out, "%sType=%u\n", offSet[myoffset], sens->Type); fprintf(out, "%sCategory=0x%02X\n", offSet[myoffset], sens->Category); fprintf(out, "%sEnableCtrl=%u\n", offSet[myoffset], sens->EnableCtrl); fprintf(out, "%sEventCtrl=%u\n", offSet[myoffset], sens->EventCtrl); fprintf(out, "%sEvents=0x%04X\n", offSet[myoffset], sens->Events); fprintf(out, "%sDataFormat={\n", offSet[myoffset++]); print_sensor_data_format(out, myoffset, sens->DataFormat); fprintf(out, "%s}\n", offSet[--myoffset]); fprintf(out, "%sThresholdDefn={\n", offSet[myoffset++]); print_sensor_threshold_definition(out, myoffset, sens->ThresholdDefn); fprintf(out, "%s}\n", offSet[--myoffset]); fprintf(out, "%sOem=%u\n", offSet[myoffset], sens->Oem); } static void print_sensor_threshold_definition(FILE *out, int offset, SaHpiSensorThdDefnT def) { int myoffset = offset; fprintf(out, "%sIsAccessible=%d\n", offSet[myoffset], def.IsAccessible); if (def.IsAccessible) { fprintf(out, "%sReadThold=0x%02X\n", offSet[myoffset], def.ReadThold); fprintf(out, "%sWriteThold=0x%02X\n", offSet[myoffset], def.WriteThold); fprintf(out, "%sNonlinear=%d\n", offSet[myoffset], def.Nonlinear); } } static void print_sensor_data_format(FILE *out, int offset, SaHpiSensorDataFormatT data) { int myoffset = offset; fprintf(out, "%sIsSupported=%d\n", offSet[myoffset], data.IsSupported); fprintf(out, "%sReadingType=%u\n", offSet[myoffset], data.ReadingType); fprintf(out, "%sBaseUnits=%u\n", offSet[myoffset], data.BaseUnits); fprintf(out, "%sModifierUnits=%u\n", offSet[myoffset], data.ModifierUnits); fprintf(out, "%sModifierUse=%u\n", offSet[myoffset], data.ModifierUse); fprintf(out, "%sPercentage=%u\n", offSet[myoffset], data.Percentage); fprintf(out, "%sRange={\n", offSet[myoffset++]); fprintf(out, "%sFlags=0x%02X\n", offSet[myoffset], data.Range.Flags); fprintf(out, "%sMax={\n", offSet[myoffset++]); print_sensor_reading(out, myoffset, data.Range.Max); fprintf(out, "%s}\n", offSet[--myoffset]); fprintf(out, "%sMin={\n", offSet[myoffset++]); print_sensor_reading(out, myoffset, data.Range.Min); fprintf(out, "%s}\n", offSet[--myoffset]); fprintf(out, "%sNominal={\n", offSet[myoffset++]); print_sensor_reading(out, myoffset, data.Range.Nominal); fprintf(out, "%s}\n", offSet[--myoffset]); fprintf(out, "%sNormalMax={\n", offSet[myoffset++]); print_sensor_reading(out, myoffset, data.Range.NormalMax); fprintf(out, "%s}\n", offSet[--myoffset]); fprintf(out, "%sNormalMin={\n", offSet[myoffset++]); print_sensor_reading(out, myoffset, data.Range.NormalMin); fprintf(out, "%s}\n", offSet[--myoffset]); fprintf(out, "%s}\n", offSet[--myoffset]); // End of Range fprintf(out, "%sAccuracyFactor=%lf\n", offSet[myoffset], data.AccuracyFactor); } // READING static SaErrorT print_sensor_data(FILE *out, int offset, SaHpiSessionIdT sessionId, SaHpiResourceIdT resId, SaHpiSensorRecT *sens) { int rv = SA_OK; int myoffset = offset; int corflag = 0; SaHpiSensorReadingT read; SaHpiEventStateT event; SaHpiBoolT sensEnabled; rv = saHpiSensorEnableGet(sessionId, resId, sens->Num, &sensEnabled); if (rv != SA_OK) { fprintf(stderr, "saHpiSensorEnableGet returns %s for ResId %u sensNum %u\n", oh_lookup_error(rv), resId, sens->Num); return rv; } if (!sensEnabled) { // Check whether it is temporarily not enabled if (sens->EnableCtrl) { rv = saHpiSensorEnableSet(sessionId, resId, sens->Num, SAHPI_TRUE); if (rv != SA_OK) { fprintf(stderr, "saHpiSensorEnableSet returns %s for ResId %u sensNum %u\n", oh_lookup_error(rv), resId, sens->Num); return rv; } } else { // Sensor isn't enabled and the state couldn't be changed -> forget DATA return SA_OK; } } rv = saHpiSensorReadingGet(sessionId, resId, sens->Num, &read, &event); if (rv != SA_OK) { fprintf(stderr, "SensorReadingGet returns %s for ResId %u sensNum %u\n", oh_lookup_error(rv), resId, sens->Num); return rv; } fprintf(out,"%s%s {\n",offSet[myoffset++],SENSOR_DATA); // SensorEnabled fprintf(out,"%sSensorEnable=%d\n",offSet[myoffset], sensEnabled); // SensorEventEnable SaHpiBoolT evtenb; rv = saHpiSensorEventEnableGet(sessionId, resId, sens->Num, &evtenb); if (rv != SA_OK) { fprintf(stderr, "SensorEventEnableGet returns %s for ResId %u sensNum %u\n", oh_lookup_error(rv), resId, sens->Num); } else { fprintf(out,"%sSensorEventEnable=%d\n",offSet[myoffset], evtenb); } // SensorReading fprintf(out,"%sEventState=0x%04X\n", offSet[myoffset], event); fprintf(out,"%sSensorReading={\n",offSet[myoffset++]); if ((sens->DataFormat.IsSupported == SAHPI_TRUE) && (read.IsSupported == SAHPI_FALSE)) { read.IsSupported = SAHPI_TRUE; read.Type = sens->DataFormat.ReadingType; fprintf(stderr, "WARNING: SensorReading.IsSupported value must be changed for ResId %u sensNum %u\n", resId, sens->Num); } print_sensor_reading(out, myoffset, read); fprintf(out, "%s}\n", offSet[--myoffset]); // SensorThresholds if (sens->ThresholdDefn.IsAccessible) { SaHpiSensorThresholdsT thres; rv = saHpiSensorThresholdsGet(sessionId, resId, sens->Num, &thres); if (rv != SA_OK) { fprintf(stderr, "saHpiSensorThresholdsGet returns %s for ResId %u sensNum %u\n", oh_lookup_error(rv), resId, sens->Num); } else { fprintf(out,"%sSensorThresholds={\n",offSet[myoffset++]); corflag = print_sensor_thresholds(out, myoffset, thres, sens->DataFormat); fprintf(out, "%s}\n", offSet[--myoffset]); if (corflag) fprintf(stderr, "WARNING: Reading for %d threshold value(s) must be changed for ResId %u sensNum %u\n", corflag, resId, sens->Num); } } // SensorEventMasks SaHpiEventStateT assert, deassert; rv = saHpiSensorEventMasksGet(sessionId, resId, sens->Num, &assert, &deassert); if (rv != SA_OK) { fprintf(stderr, "saHpiSensorEventMasksGet returns %s for ResId %u sensNum %u\n", oh_lookup_error(rv), resId, sens->Num); } else { fprintf(out,"%sAssertEventMask=0x%04X\n",offSet[myoffset], assert); fprintf(out,"%sDeassertEventMask=0x%04X\n",offSet[myoffset], deassert); } fprintf(out, "%s}\n", offSet[--myoffset]); // SENSOR_DATA if (!sensEnabled) { // The enabled status was changed, set it back rv = saHpiSensorEnableSet(sessionId, resId, sens->Num, sensEnabled); if (rv != SA_OK) { fprintf(stderr, "saHpiSensorEnableSet returns %s for ResId %u sensNum %u\n", oh_lookup_error(rv), resId, sens->Num); return rv; } } return rv; } static int check_sensor_reading(SaHpiSensorReadingT *read, SaHpiSensorDataFormatT format) { if (format.IsSupported) { if (read->IsSupported == SAHPI_TRUE) { if (read->Type != format.ReadingType) { read->Type = format.ReadingType; return 1; } } } return 0; } static int print_sensor_thresholds(FILE *out, int offset, SaHpiSensorThresholdsT thres, SaHpiSensorDataFormatT format) { int myoffset = offset; int check_val = 0; fprintf(out, "%sLowCritical={\n", offSet[myoffset++]); if (check_sensor_reading(&thres.LowCritical, format)) check_val++; print_sensor_reading(out, myoffset, thres.LowCritical); fprintf(out, "%s}\n", offSet[--myoffset]); fprintf(out, "%sLowMajor={\n", offSet[myoffset++]); if (check_sensor_reading(&thres.LowMajor, format)) check_val++; print_sensor_reading(out, myoffset, thres.LowMajor); fprintf(out, "%s}\n", offSet[--myoffset]); fprintf(out, "%sLowMinor={\n", offSet[myoffset++]); if (check_sensor_reading(&thres.LowMinor, format)) check_val++; print_sensor_reading(out, myoffset, thres.LowMinor); fprintf(out, "%s}\n", offSet[--myoffset]); fprintf(out, "%sUpCritical={\n", offSet[myoffset++]); if (check_sensor_reading(&thres.UpCritical, format)) check_val++; print_sensor_reading(out, myoffset, thres.UpCritical); fprintf(out, "%s}\n", offSet[--myoffset]); fprintf(out, "%sUpMajor={\n", offSet[myoffset++]); if (check_sensor_reading(&thres.UpMajor, format)) check_val++; print_sensor_reading(out, myoffset, thres.UpMajor); fprintf(out, "%s}\n", offSet[--myoffset]); fprintf(out, "%sUpMinor={\n", offSet[myoffset++]); if (check_sensor_reading(&thres.UpMinor, format)) check_val++; print_sensor_reading(out, myoffset, thres.UpMinor); fprintf(out, "%s}\n", offSet[--myoffset]); fprintf(out, "%sPosThdHysteresis={\n", offSet[myoffset++]); if (check_sensor_reading(&thres.PosThdHysteresis, format)) check_val++; print_sensor_reading(out, myoffset, thres.PosThdHysteresis); fprintf(out, "%s}\n", offSet[--myoffset]); fprintf(out, "%sNegThdHysteresis={\n", offSet[myoffset++]); if (check_sensor_reading(&thres.NegThdHysteresis, format)) check_val++; print_sensor_reading(out, myoffset, thres.NegThdHysteresis); fprintf(out, "%s}\n", offSet[--myoffset]); return check_val; } static void print_sensor_reading(FILE *out, int offset, SaHpiSensorReadingT val) { int myoffset = offset; int i; fprintf(out, "%sIsSupported=%u\n", offSet[myoffset], val.IsSupported); if (val.IsSupported) { fprintf(out, "%sType=%u\n",offSet[myoffset], val.Type); switch( val.Type ) { case SAHPI_SENSOR_READING_TYPE_INT64: fprintf(out, "%svalue.SensorInt64=%" PRId64 "\n", offSet[myoffset], (int64_t) val.Value.SensorInt64); break; case SAHPI_SENSOR_READING_TYPE_UINT64: fprintf(out, "%svalue.SensorUint64=%" PRIu64 "\n", offSet[myoffset], (uint64_t) val.Value.SensorUint64); break; case SAHPI_SENSOR_READING_TYPE_FLOAT64: fprintf(out, "%svalue.SensorFloat64=%lf\n", offSet[myoffset], val.Value.SensorFloat64); break; case SAHPI_SENSOR_READING_TYPE_BUFFER: fprintf(out, "%svalue.SensorBuffer=\"", offSet[myoffset]); for (i = 0; i < SAHPI_SENSOR_BUFFER_LENGTH; i++) fprintf(out, "%02X", val.Value.SensorBuffer[i]); fprintf(out, "\"\n"); break; default: fprintf(out, "%sERROR MISSING_READING_TYPE\n", offSet[myoffset]); } } } /** * Common data structure functions **/ static void print_textbuffer(FILE *out, int offset, SaHpiTextBufferT data) { fprintf(out,"%sDataType=%u\n",offSet[offset], data.DataType); fprintf(out,"%sLanguage=%u\n",offSet[offset], data.Language); fprintf(out,"%sDataLength=%u\n",offSet[offset], data.DataLength); fprintf(out,"%sData=\"",offSet[offset]); switch(data.DataType) { case SAHPI_TL_TYPE_UNICODE: // TODO fprintf(out, "UNICODE DATA TYPE NOT SUPPORTED"); break; case SAHPI_TL_TYPE_BCDPLUS: case SAHPI_TL_TYPE_ASCII6: case SAHPI_TL_TYPE_TEXT: fwrite(data.Data, data.DataLength, 1, out); break; case SAHPI_TL_TYPE_BINARY: // TODO fprintf(out, "BINARY DATA TYPE NOT SUPPORTED"); break; default: fprintf(out, "UNSUPPORTED DATA TYPE"); break; } fprintf(out,"\"\n"); } /** * print_ep: * @ep: Pointer to entity path stucture. * * Prints the string form of an entity path structure. * * Returns: * SA_OK - normal operations. * SA_ERR_HPI_INVALID_PARAMS - @ep is NULL. * SA_ERR_HPI_INVALID_DATA - Location value too big for OpenHpi. * SA_ERR_HPI_OUT_OF_SPACE - No memory for internal storage. **/ SaErrorT print_ep(FILE *out, int offset, const SaHpiEntityPathT *ep) { oh_big_textbuffer bigbuf1, bigbuf2; SaErrorT err; if (!ep) { fprintf(stderr, "Invalid parameter for entity path."); return(SA_ERR_HPI_INVALID_PARAMS); } err = oh_init_bigtext(&bigbuf1); if (err) return(err); err = oh_init_bigtext(&bigbuf2); if (err) return(err); err = oh_append_bigtext(&bigbuf1, offSet[offset]); if (err) return(err); err = oh_append_bigtext(&bigbuf1, "\""); if (err) return(err); err = oh_decode_entitypath(ep, &bigbuf2); if (err) return(err); err = oh_append_bigtext(&bigbuf1, (char *)bigbuf2.Data); if (err) return(err); err = oh_append_bigtext(&bigbuf1, "\"\n"); if (err) return(err); fprintf(out, "%s", bigbuf1.Data); return(SA_OK); } /** an oh_encode function for entitypath still exist, using the original functions instead * of the following * static void print_entitypath(FILE *out, int offset, const SaHpiEntityPathT *ep) { int i=0, lastentry = FALSE; int myoffset=offset; myoffset++; while ((i < SAHPI_MAX_ENTITY_PATH) && (lastentry == FALSE)) { if (ep->Entry[i].EntityType == SAHPI_ENT_ROOT) lastentry = TRUE; fprintf(out,"%s{\n",offSet[offset]); fprintf(out,"%sEntityType=%d\n",offSet[myoffset], ep->Entry[i].EntityType); fprintf(out,"%sEntityLocation=%d\n",offSet[myoffset], ep->Entry[i].EntityLocation); fprintf(out,"%s}\n",offSet[offset]); i++; } } **/ openhpi-3.6.1/clients/version.rc0000644000175100017510000000155612575647264015660 0ustar mohanmohan#include LANGUAGE 0x09,0x01 // English(US) VS_VERSION_INFO VERSIONINFO FILEVERSION BINARY_VERSION PRODUCTVERSION BINARY_VERSION FILEFLAGSMASK 0 FILEFLAGS 0 FILEOS VOS_NT_WINDOWS32 FILETYPE VFT_APP FILESUBTYPE VFT2_UNKNOWN BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904E4" // English(US), Multilingual BEGIN VALUE "Comments", "" VALUE "CompanyName", "OpenHPI Community (http://openhpi.org/)" VALUE "FileDescription", "OpenHPI Client" VALUE "FileVersion", VERSION VALUE "InternalName", "" VALUE "LegalCopyright", "OpenHPI is distributed under BSD license" VALUE "OriginalFilename", "" VALUE "ProductName", "OpenHPI" VALUE "ProductVersion", VERSION END END END openhpi-3.6.1/clients/hpidomain.c0000644000175100017510000002053712575647264015761 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (C) Copyright Nokia Siemens Networks 2010 * (C) Copyright Ulrich Kleber 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Ulrich Kleber * * Log: * Start from hpitop.c * This routine display highlevel domain topology for a managed * openHPI complex * * Changes: * 20/01/2011 ulikleber Refactoring to use glib for option parsing and * introduce common options for all clients * */ #include "oh_clients.h" #define OH_SVN_REV "$Revision: 7112 $" /* * Function prototypes */ static SaErrorT show_domain(SaHpiSessionIdT sessionid); static SaErrorT print_domaininfo(SaHpiDomainInfoT info, int shift); static SaErrorT set_domaintag(SaHpiSessionIdT sessionid, SaHpiTextBufferT domtag); /* * Globals for this driver */ static gchar *f_domtag = NULL; static oHpiCommonOptionsT copt; static GOptionEntry my_options[] = { { "tag", 't', 0, G_OPTION_ARG_STRING, &f_domtag, "Set domain tag to the specified string", "tttt" }, { NULL } }; /* * Main */ int main(int argc, char **argv) { SaErrorT rv = SA_OK; SaHpiSessionIdT sessionid; SaHpiTextBufferT domtag; GOptionContext *context; oh_init_textbuffer(&domtag); /* Print version strings */ oh_prog_version(argv[0]); /* Parsing options */ static char usetext[]="- Display info about domains or set domain tag\n " OH_SVN_REV; OHC_PREPARE_REVISION(usetext); context = g_option_context_new (usetext); g_option_context_add_main_entries (context, my_options, NULL); if (!ohc_option_parse(&argc, argv, context, &copt, OHC_ALL_OPTIONS - OHC_ENTITY_PATH_OPTION)) { //TODO: Feature 880127? g_option_context_free (context); return 1; } g_option_context_free (context); rv = ohc_session_open_by_option ( &copt, &sessionid); if (rv != SA_OK) { g_free(f_domtag); return rv; } if (f_domtag){ oh_append_textbuffer(&domtag, f_domtag); g_free (f_domtag); if (copt.debug) DBG ("Let's go change the tag to %s", f_domtag); set_domaintag(sessionid, domtag); } if (copt.debug) DBG ("Let's go and list the domains!"); show_domain(sessionid); rv = saHpiSessionClose(sessionid); return 0; } /* * */ static SaErrorT show_domain(SaHpiSessionIdT sessionid) { SaErrorT rv = SA_OK; SaHpiDomainInfoT domaininfo; SaHpiDrtEntryT drtentry; SaHpiEntryIdT drtentryid; SaHpiEntryIdT nextdrtentryid; SaHpiDomainInfoT relateddomaininfo; SaHpiDomainIdT relateddomainid = SAHPI_UNSPECIFIED_DOMAIN_ID; SaHpiSessionIdT relatedsessionid; if (copt.debug) DBG("saHpiDomainInfoGet"); rv = saHpiDomainInfoGet(sessionid,&domaininfo); if (rv!=SA_OK) { CRIT("saHpiDomainInfoGet failed with returncode %s", oh_lookup_error(rv)); return rv; } /* Print info about this domain */ rv = print_domaininfo(domaininfo,0); /* walk the DRT */ drtentryid = SAHPI_FIRST_ENTRY; do { if (copt.debug) DBG("saHpiDrtEntryGet"); rv = saHpiDrtEntryGet(sessionid, drtentryid,&nextdrtentryid,&drtentry); if ((rv != SA_OK && rv != SA_ERR_HPI_NOT_PRESENT) || copt.debug) DBG("DrtEntryGet returns %s",oh_lookup_error(rv)); if (rv == SA_OK ) { if (copt.verbose) { /* display the domaininfo for that related domain */ relateddomainid = drtentry.DomainId; rv = saHpiSessionOpen(relateddomainid, &relatedsessionid,NULL); if (rv != SA_OK) { printf("Related domain found: %u IsPeer: %u\n", drtentry.DomainId,drtentry.IsPeer); printf("saHpiSessionOpen to related domain %u " "returns %s\n", relateddomainid,oh_lookup_error(rv)); continue; } if (copt.debug) { DBG("saHpiSessionOpen returns with SessionId %u", relatedsessionid); DBG("saHpiDomainInfoGet for related domain %u", relateddomainid); } rv = saHpiDomainInfoGet(relatedsessionid, &relateddomaininfo); if (rv!=SA_OK) { printf("\nRelated domain found: %u IsPeer: %u\n", drtentry.DomainId,drtentry.IsPeer); printf("saHpiDomainInfoGet for related domain " "%u failed with returncode %s\n", relateddomainid,oh_lookup_error(rv)); } else { printf("\nRelated domain found:\n"); /* Print info about related domain */ rv = print_domaininfo(relateddomaininfo,1); } rv = saHpiSessionClose(relatedsessionid); if (copt.debug) DBG("saHpiSessionClose returns %s", oh_lookup_error(rv)); } else { printf("Related domain found: %u IsPeer: %u\n", drtentry.DomainId,drtentry.IsPeer); } } else if (rv == SA_ERR_HPI_NOT_PRESENT) { if (drtentryid == SAHPI_FIRST_ENTRY) printf(" DRT is empty. \n"); else CRIT("Internal error while walking the DRT"); } else CRIT("Internal error while walking the DRT"); drtentryid = nextdrtentryid; } while ((rv == SA_OK) && (drtentryid != SAHPI_LAST_ENTRY)); return(rv); } /* * */ static SaErrorT print_domaininfo(SaHpiDomainInfoT info, int shift) { SaHpiTextBufferT buf; SaErrorT rv; int i; oHpiDomainEntryT ohdomainentry; for (i=0;i * Ulrich Kleber * * Changes: * 20/01/2011 ulikleber Refactoring to use glib for option parsing and * introduce common options for all clients * */ #ifndef __OH_CLIENTS_H #define __OH_CLIENTS_H #include #include #include #include #include #include #include #include #include #include #define OHC_ALL_OPTIONS (SaHpiUint8T) 0x03F #define OHC_DEBUG_OPTION (SaHpiUint8T) 0x001 #define OHC_DOMAIN_OPTION (SaHpiUint8T) 0x002 #define OHC_VERBOSE_OPTION (SaHpiUint8T) 0x004 #define OHC_ENTITY_PATH_OPTION (SaHpiUint8T) 0x008 #define OHC_HOST_OPTION (SaHpiUint8T) 0x010 #define OHC_CLIENTCONF_OPTION (SaHpiUint8T) 0x020 #define OHC_SESSION_OPTIONS (SaHpiUint8T) 0x032 // -D -N and -C //Macro to replace $ with () in OH_SVN_REV string for print #define OHC_PREPARE_REVISION(txt) \ char *dollar=strchr(txt, '$'); \ if (dollar!=NULL) *dollar = '('; \ dollar=strchr(txt, '$'); \ if (dollar!=NULL) *dollar = ')'; #ifdef __cplusplus extern "C" { #endif typedef struct { gboolean debug; gboolean verbose; SaHpiDomainIdT domainid; gboolean withentitypath; SaHpiEntityPathT entitypath; gboolean withdaemonhost; SaHpiTextBufferT daemonhost; SaHpiUint16T daemonport; SaHpiTextBufferT clientconf; } oHpiCommonOptionsT; void oh_prog_version(const char *prog_name); gboolean ohc_option_parse(int *argc, char *argv[], GOptionContext *context, oHpiCommonOptionsT *common_options, SaHpiUint8T optionmask); SaErrorT ohc_session_open_by_option ( oHpiCommonOptionsT *opt, SaHpiSessionIdT *SessionId); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* __OH_CLIENTS_H */ openhpi-3.6.1/clients/hpipower.c0000755000175100017510000003606012575647264015647 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004-2006 * (C) Copyright Nokia Siemens Networks 2010 * (C) Copyright Ulrich Kleber 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Carl McAdams * Ulrich Kleber * * Changes: * 09/06/2010 ulikleber New option -D to select domain * 20/01/2011 ulikleber Refactoring to use glib for option parsing and * introduce common options for all clients */ #include "oh_clients.h" #define OH_SVN_REV "$Revision: 7527 $" #define MAX_MANAGED_SYSTEMS 80 #define HPI_POWER_DEBUG_PRINT(a) if(copt.debug==TRUE)DBG(a) #define HPI_POWER_DEBUG_PRINT1(a) if(copt.debug==TRUE)printf(a) typedef struct COMPUTER_DATA_ { SaHpiResourceIdT ResID; SaHpiInt32T number; //Enumeration of which computer or blade SaHpiEntityLocationT Instance; SaHpiRdrT ResDataRec; char NameStr[80];//Text Name for the computer or plade } COMPUTER_DATA; static gboolean f_down = FALSE; static gboolean f_up = FALSE; static gboolean f_reset = FALSE; static gboolean f_unattended = FALSE; static gint f_blade = 0; static oHpiCommonOptionsT copt; static GOptionEntry my_options[] = { { "power-down", 'd', 0, G_OPTION_ARG_NONE, &f_down, "Power down target object", NULL }, { "power-up", 'p', 0, G_OPTION_ARG_NONE, &f_up, "Power on target object", NULL }, { "reset", 'r', 0, G_OPTION_ARG_NONE, &f_reset, "Reset target object", NULL }, { "unattended", 'u', 0, G_OPTION_ARG_NONE, &f_unattended, "Unattended", NULL }, { "blade", 'b', 0, G_OPTION_ARG_INT, &f_blade, "Specify blade n (1...n)", "n" }, { NULL } }; /* Utility function to work with SaHpiTextBufferT */ static void HpiTextBuffer2CString( const SaHpiTextBufferT * tb, char * cstr ) { if ( (!tb) || (!cstr) ) { return; } memcpy( cstr, &tb->Data[0], tb->DataLength ); cstr[tb->DataLength] = '\0'; } /* Prototypes */ void UsageMessage(char *ProgramName); /**************************************** * main * * Hpi Power Utility Entry point routine ************************************************/ int main(int argc, char **argv) { SaHpiInt32T ComputerNumber = 0; //0..n-1 SaHpiInt32T SelectedSystem = 0; //0..n-1 SaHpiPowerStateT Action = 255; //set it out of range to stand for status; COMPUTER_DATA *ComputerPtr; SaHpiBoolT BladeSelected = FALSE; SaHpiBoolT MultipleBlades = FALSE; SaHpiBoolT ActionSelected = FALSE; GSList* Computer; GSList* ComputerListHead; SaHpiSessionIdT SessionId; SaErrorT Status; SaHpiEntryIdT RptEntry = SAHPI_FIRST_ENTRY; SaHpiEntryIdT RptNextEntry; SaHpiRptEntryT Report; SaHpiInt32T Index, EntityElement; SaHpiPowerStateT PowerState; char PowerStateString[3][7]={"off\0","on\0","cycled\0"}; GOptionContext *context; /* Print version strings */ oh_prog_version(argv[0]); /* Parsing options */ static char usetext[]="- Exercise HPI Power Management APIs\n " OH_SVN_REV; OHC_PREPARE_REVISION(usetext); context = g_option_context_new (usetext); g_option_context_add_main_entries (context, my_options, NULL); if (!ohc_option_parse(&argc, argv, context, &copt, OHC_ALL_OPTIONS - OHC_ENTITY_PATH_OPTION //TODO: Feature 880127 - OHC_VERBOSE_OPTION )) { // no verbose mode implemented g_option_context_free (context); return 1; } g_option_context_free (context); if (f_down) { Action = SAHPI_POWER_OFF; ActionSelected = TRUE; } if (f_up) { Action = SAHPI_POWER_ON; ActionSelected = TRUE; } if (f_reset) { Action = SAHPI_POWER_CYCLE; ActionSelected = TRUE; } if (f_unattended) { BladeSelected = TRUE; ActionSelected = TRUE; } if (f_blade > 0) { BladeSelected = TRUE; SelectedSystem = f_blade - 1; //Normalizing to 0...n-1 if ((SelectedSystem > MAX_MANAGED_SYSTEMS) || (SelectedSystem < 0)) { CRIT("hpipower: blade number out of range"); return 1; //When we exit here, there is nothing to clean up } } /* Initialize the first of a list of computers */ HPI_POWER_DEBUG_PRINT("Initializing the List Structure for the computers"); Computer = g_slist_alloc(); ComputerListHead = Computer; HPI_POWER_DEBUG_PRINT("Allocating space for the information on each computer"); ComputerPtr = (COMPUTER_DATA*)malloc(sizeof(COMPUTER_DATA)); Computer->data = (gpointer)ComputerPtr; /* Initialize HPI domain and session */ HPI_POWER_DEBUG_PRINT("Initalizing HPI Session"); Status = ohc_session_open_by_option ( &copt, &SessionId); if (Status == SA_OK) { /* Find all of the individual systems */ // regenerate the Resource Presence Table(RPT) HPI_POWER_DEBUG_PRINT("Hpi Discovery"); Status = saHpiDiscover(SessionId); } else { CRIT("Initalizing HPI Session FAILED, code %s", oh_lookup_error(Status)); return -1; } HPI_POWER_DEBUG_PRINT("Walking through all of the Report Tables"); while ((Status == SA_OK) && (RptEntry != SAHPI_LAST_ENTRY)) { HPI_POWER_DEBUG_PRINT1("@"); Status = saHpiRptEntryGet(SessionId, RptEntry, &RptNextEntry, &Report); RptEntry = RptNextEntry; // Blades will have the first Element of the Entity Path set to SBC_BLADE EntityElement = 0; HPI_POWER_DEBUG_PRINT1("."); if (Report.ResourceCapabilities & SAHPI_CAPABILITY_POWER) { char tagbuf[SAHPI_MAX_TEXT_BUFFER_LENGTH + 1]; HPI_POWER_DEBUG_PRINT1("#"); // We have found a Blade ComputerPtr->ResID = Report.ResourceId; /* enumerate this list as created */ ComputerPtr->number = ComputerNumber; ComputerNumber++; ComputerPtr->Instance = Report.ResourceEntity.Entry[EntityElement].EntityLocation; // find a Name string for this blade HpiTextBuffer2CString( &Report.ResourceTag, tagbuf ); snprintf(ComputerPtr->NameStr, sizeof(ComputerPtr->NameStr), "%s %d", tagbuf, (int) ComputerPtr->Instance); // Create a new allocation for another system ComputerPtr = (COMPUTER_DATA*)malloc(sizeof(COMPUTER_DATA)); // Add another member to the list Computer = g_slist_append(Computer,(gpointer)ComputerPtr); // set a flag that we are working with blades MultipleBlades = TRUE; } } HPI_POWER_DEBUG_PRINT("Generating Listing of options to choose from:"); /* If parsed option does not select blade and more than one is found */ if ((MultipleBlades == TRUE) && (BladeSelected == FALSE) && (Status == SA_OK)) { HPI_POWER_DEBUG_PRINT("Printing out a listing of all the blades"); for (Index = 0; Index < ComputerNumber; Index++) { HPI_POWER_DEBUG_PRINT1("$"); // obtain the information for this computer ComputerPtr = g_slist_nth_data(ComputerListHead, Index); if (ComputerPtr == NULL) { printf("Call returned a NULL\n"); break; } // retrieve the power status for this computer HPI_POWER_DEBUG_PRINT1("%%"); PowerState = 0; Status = saHpiResourcePowerStateGet(SessionId, ComputerPtr->ResID, &PowerState); if (Status != SA_OK) { printf("%s does not support PowerStateGet", ComputerPtr->NameStr); } /* Print out all of the systems */ printf("%2d) %20s - %s \n\r", (Index + 1), ComputerPtr->NameStr, PowerStateString[PowerState]); } /* Prompt user to select one */ while ((Index >= ComputerNumber) || (Index < 0)) { printf("\nEnter the number for the desired blade: "); if (scanf("%d",&Index) == 0) { printf("Incorrect number\n"); } Index--; //normalize to 0..n-1 printf("\n"); } BladeSelected = TRUE; SelectedSystem = Index; } HPI_POWER_DEBUG_PRINT("Generating Listing of Actions to choose from"); /* If action is not selected */ if ((ActionSelected == FALSE) && (Status == SA_OK)) { /* prompt user to select an action */ printf("\nSelect Action: 0 - Off; 1 - On; 2 - Reset; 3 - Status \n\r"); printf("Enter a number 0 to 3: "); if (scanf("%d", &Index) == 0) { Index = -1; } switch (Index) { case 0: Action = SAHPI_POWER_OFF; break; case 1: Action = SAHPI_POWER_ON; break; case 2: Action = SAHPI_POWER_CYCLE; break; default: Action = 255; //Out of Range for "Status" break; } } /* execute the command */ if (Status == SA_OK) { HPI_POWER_DEBUG_PRINT("Executing the command"); // obtain the information for this computer ComputerPtr = g_slist_nth_data(ComputerListHead, SelectedSystem); if (ComputerPtr == NULL) { printf("Error: Selected system %d was not found.\n", SelectedSystem); return -1; } if (Action <= SAHPI_POWER_CYCLE) { PowerState = 0; Status = saHpiResourcePowerStateGet(SessionId, ComputerPtr->ResID, &PowerState); if (Status != SA_OK) { printf("%s does not support PowerStateGet",ComputerPtr->NameStr); } if (Action == PowerState) { printf("\n%s -- %20s is already powered %s\n",argv[0], ComputerPtr->NameStr, PowerStateString[Action]); } else { HPI_POWER_DEBUG_PRINT("Setting a New Power State"); // Set the new power status for this computer Status = saHpiResourcePowerStateSet(SessionId, ComputerPtr->ResID, Action); /* return status */ if (Status == SA_OK) { printf("\n%s -- %20s has been successfully powered %s\n", argv[0], ComputerPtr->NameStr, PowerStateString[Action]); } } } else // Report Power status for the system { HPI_POWER_DEBUG_PRINT("Getting the Power Status\r"); // retrieve the power status for this computer PowerState = 0; Status = saHpiResourcePowerStateGet(SessionId, ComputerPtr->ResID, &PowerState); if (Status != SA_OK) { printf("%s does not support PowerStateGet", ComputerPtr->NameStr); } /* Print out Status for this system */ printf("%2d) %20s - %s \n\r", (ComputerPtr->number + 1), ComputerPtr->NameStr, PowerStateString[PowerState]); } } HPI_POWER_DEBUG_PRINT("Clean up"); /* clean up */ saHpiSessionClose(SessionId); //Free all of the Allocations for the Computer data Computer = ComputerListHead; while (Computer != NULL) { free(Computer->data); Computer = g_slist_next(Computer); } //Free the whole List g_slist_free(ComputerListHead); /* return status code and exit */ if (Status != SA_OK) { HPI_POWER_DEBUG_PRINT("Reporting Bad Status"); CRIT("Error: %s", oh_lookup_error(Status)); } return(Status); } /* end hpipower.c */ openhpi-3.6.1/clients/hpitop.c0000644000175100017510000004472712575647264015323 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * (C) Copyright IBM Corp. 2004, 2005 * (C) Copyright Nokia Siemens Networks 2010 * (C) Copyright Ulrich Kleber 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Peter D. Phan * Ulrich Kleber * * Log: * Start from hpitree.c * This routine display highlevel topology for a managed openHPI complex * * Changes: * 09/02/2010 lwetzel Fixed Bug: ResourceId 255 (0xFF) is a valid ResourceId * 07/06/2010 ulikleber New option -D to select domain * 20/01/2011 ulikleber Refactoring to use glib for option parsing and * introduce common options for all clients * */ #include "oh_clients.h" #define OH_SVN_REV "$Revision: 7291 $" /* * Function prototypes */ static SaErrorT list_resources(SaHpiSessionIdT sessionid, SaHpiResourceIdT res_id); static SaErrorT list_rpt(SaHpiRptEntryT *rptptr); static SaErrorT list_rdr(SaHpiSessionIdT sessionid, SaHpiRptEntryT *rptptr, SaHpiRdrT *rdrptr, SaHpiResourceIdT l_resourceid); static SaErrorT show_rpt(SaHpiRptEntryT *rptptr,SaHpiResourceIdT resourceid); static SaErrorT show_rdr(oh_big_textbuffer *buffer); static SaErrorT show_inv(SaHpiSessionIdT sessionid, SaHpiRptEntryT *rptptr, SaHpiRdrT *rdrptr, SaHpiResourceIdT l_resourceid); static SaErrorT show_sens(SaHpiSessionIdT sessionid, SaHpiRptEntryT *rptptr, SaHpiRdrT *rdrptr, SaHpiResourceIdT l_resourceid); static SaErrorT show_ann(SaHpiSessionIdT sessionid, SaHpiRptEntryT *rptptr, SaHpiRdrT *rdrptr, SaHpiResourceIdT l_resourceid); static SaErrorT show_ctrl(SaHpiSessionIdT sessionid, SaHpiRptEntryT *rptptr, SaHpiRdrT *rdrptr, SaHpiResourceIdT l_resourceid); static SaErrorT show_wdog(SaHpiSessionIdT sessionid, SaHpiRptEntryT *rptptr, SaHpiRdrT *rdrptr, SaHpiResourceIdT l_resourceid); static SaErrorT show_fumi(SaHpiSessionIdT sessionid, SaHpiRptEntryT *rptptr, SaHpiRdrT *rdrptr, SaHpiResourceIdT l_resourceid); static SaErrorT show_dimi(SaHpiSessionIdT sessionid, SaHpiRptEntryT *rptptr, SaHpiRdrT *rdrptr, SaHpiResourceIdT l_resourceid); void same_system(oh_big_textbuffer *bigbuf); void show_trailer(char *system); #define EPATHSTRING_END_DELIMITER "}" #define rpt_startblock " |\n +--- " #define rdr_startblock " | |__ " /* * Globals for this driver */ static gboolean f_rpt = FALSE; static gboolean f_inv = FALSE; static gboolean f_sensor = FALSE; static gboolean f_wdog = FALSE; static gboolean f_dimi = FALSE; static gboolean f_fumi = FALSE; static gboolean f_ann = FALSE; static gboolean f_ctrl = FALSE; static gboolean f_overview = TRUE; static gboolean f_allres = TRUE; static gint resourceid = 0; static oHpiCommonOptionsT copt; static GOptionEntry my_options[] = { { "rpts", 'r', 0, G_OPTION_ARG_NONE, &f_rpt, "Display only rpts", NULL }, { "sensors", 's', 0, G_OPTION_ARG_NONE, &f_sensor, "Display only sensors", NULL }, { "controls", 'c', 0, G_OPTION_ARG_NONE, &f_ctrl, "Display only controls", NULL }, { "watchdogs", 'w', 0, G_OPTION_ARG_NONE, &f_wdog, "Display only watchdogs", NULL }, { "inventories", 'i', 0, G_OPTION_ARG_NONE, &f_inv, "Display only inventories", NULL }, { "annunciators", 'a', 0, G_OPTION_ARG_NONE, &f_ann, "Display only annunciators", NULL }, { "fumis", 'f', 0, G_OPTION_ARG_NONE, &f_fumi, "Display only fumis", NULL }, { "dimis", 'd', 0, G_OPTION_ARG_NONE, &f_dimi, "Display only dimis", NULL }, { "resource", 'n', 0, G_OPTION_ARG_INT, &resourceid, "Display only resource nn and its topology", "nn" }, { NULL } }; char previous_system[SAHPI_MAX_TEXT_BUFFER_LENGTH] = ""; /* * Main */ int main(int argc, char **argv) { SaErrorT rv = SA_OK; SaHpiSessionIdT sessionid; GOptionContext *context; /* Print version strings */ oh_prog_version(argv[0]); /* Parsing options */ static char usetext[]="- Display system topology\n " OH_SVN_REV; OHC_PREPARE_REVISION(usetext); context = g_option_context_new (usetext); g_option_context_add_main_entries (context, my_options, NULL); if (!ohc_option_parse(&argc, argv, context, &copt, OHC_ALL_OPTIONS - OHC_ENTITY_PATH_OPTION //TODO: Feature 880127 - OHC_VERBOSE_OPTION )) { // no verbose mode implemented g_option_context_free (context); return 1; } g_option_context_free (context); if (f_rpt || f_sensor || f_ctrl || f_wdog || f_inv || f_ann || f_fumi || f_dimi || resourceid>0) f_overview = FALSE; memset (previous_system, 0, SAHPI_MAX_TEXT_BUFFER_LENGTH); rv = ohc_session_open_by_option ( &copt, &sessionid); if (rv != SA_OK) return rv; /* * Resource discovery */ if (copt.debug) DBG("saHpiDiscover"); rv = saHpiDiscover(sessionid); if (rv != SA_OK) { CRIT("saHpiDiscover returns %s",oh_lookup_error(rv)); return rv; } if (copt.debug) DBG("Discovery done"); list_resources(sessionid, resourceid); rv = saHpiSessionClose(sessionid); return 0; } /* * */ static SaErrorT list_resources(SaHpiSessionIdT sessionid,SaHpiResourceIdT resourceid) { SaErrorT rv = SA_OK, rvRdrGet = SA_OK, rvRptGet = SA_OK; SaHpiRptEntryT rptentry; SaHpiEntryIdT rptentryid; SaHpiEntryIdT nextrptentryid; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiRdrT rdr; SaHpiResourceIdT l_resourceid; SaHpiTextBufferT working; oh_init_textbuffer(&working); /* walk the RPT list */ rptentryid = SAHPI_FIRST_ENTRY; do { if (copt.debug) DBG("saHpiRptEntryGet"); rvRptGet = saHpiRptEntryGet(sessionid,rptentryid,&nextrptentryid,&rptentry); if ((rvRptGet != SA_OK) || copt.debug) DBG("RptEntryGet returns %s",oh_lookup_error(rvRptGet)); rv = show_rpt(&rptentry, resourceid); if (rvRptGet == SA_OK && (rptentry.ResourceCapabilities & SAHPI_CAPABILITY_RDR) && ((f_allres) || (resourceid == rptentry.ResourceId))) { l_resourceid = rptentry.ResourceId; if (!f_allres) nextrptentryid = SAHPI_LAST_ENTRY; /* walk the RDR list for this RPT entry */ entryid = SAHPI_FIRST_ENTRY; if (copt.debug) DBG("rptentry[%u] resourceid=%u", entryid,resourceid); do { rvRdrGet = saHpiRdrGet(sessionid,l_resourceid, entryid,&nextentryid, &rdr); if (copt.debug) DBG("saHpiRdrGet[%u] rv = %s",entryid,oh_lookup_error(rvRdrGet)); if (rvRdrGet == SA_OK) { // Add zero terminator to RDR Id String SaHpiUint32T last = rdr.IdString.DataLength; if ( last >= SAHPI_MAX_TEXT_BUFFER_LENGTH ) { last = SAHPI_MAX_TEXT_BUFFER_LENGTH - 1; } rdr.IdString.Data[last] = '\0'; if (f_overview) list_rdr(sessionid, &rptentry, &rdr, l_resourceid); if (f_inv) show_inv(sessionid, &rptentry, &rdr, l_resourceid); if (f_sensor) show_sens(sessionid, &rptentry, &rdr, l_resourceid); if (f_ctrl) show_ctrl(sessionid, &rptentry, &rdr, l_resourceid); if (f_wdog) show_wdog(sessionid, &rptentry, &rdr, l_resourceid); if (f_fumi) show_fumi(sessionid, &rptentry, &rdr, l_resourceid); if (f_dimi) show_dimi(sessionid, &rptentry, &rdr, l_resourceid); if (f_ann) show_ann(sessionid, &rptentry, &rdr, l_resourceid); } entryid = nextentryid; } while ((rvRdrGet == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; } rptentryid = nextrptentryid; } while ((rvRptGet == SA_OK) && (rptentryid != SAHPI_LAST_ENTRY)); show_trailer(previous_system); return(rv); } /* * */ void same_system(oh_big_textbuffer *bigbuf) { int size = strcspn((char *)bigbuf->Data, EPATHSTRING_END_DELIMITER); int old_size = strcspn(previous_system, EPATHSTRING_END_DELIMITER); if ( (old_size != size) || (strncmp((char *)bigbuf->Data, previous_system, size+1) != 0)) { if (previous_system[0] == '{') show_trailer(previous_system); memset (previous_system, 0, SAHPI_MAX_TEXT_BUFFER_LENGTH); strncpy (previous_system, (char *)(bigbuf->Data), size+1); previous_system[size+2] = '\0'; printf("\n\n%s\n", previous_system); } } /* * */ void show_trailer(char *system) { printf(" |\nEnd of %s\n\n", system); } /* * */ static SaErrorT show_rpt(SaHpiRptEntryT *rptptr,SaHpiResourceIdT resourceid) { SaErrorT rv = SA_OK, err = SA_OK; oh_big_textbuffer bigbuf1, bigbuf2; SaHpiTextBufferT textbuffer; err = oh_init_textbuffer(&textbuffer); if (err) return(err); err = oh_init_bigtext(&bigbuf1); if (err) return(err); err = oh_init_bigtext(&bigbuf2); if (err) return(err); if ((f_allres) || (resourceid == rptptr->ResourceId)) { rv = oh_decode_entitypath(&rptptr->ResourceEntity, &bigbuf2); same_system(&bigbuf2); /* printf("ResourceId: %u", rptptr->ResourceId); */ err = oh_append_bigtext(&bigbuf1, rpt_startblock); err = oh_append_bigtext(&bigbuf1, (char *)bigbuf2.Data); if (err) return(err); err = oh_append_bigtext(&bigbuf1, "\n"); if (err) return(err); printf("%s", bigbuf1.Data); if (f_rpt) list_rpt(rptptr); } return(rv); } /* * */ static SaErrorT list_rpt(SaHpiRptEntryT *rptptr) { SaErrorT rv = SA_OK, err = SA_OK; oh_big_textbuffer bigbuf1; char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; SaHpiTextBufferT textbuffer; err = oh_init_textbuffer(&textbuffer); if (err) return(err); err = oh_init_bigtext(&bigbuf1); if (err) return(err); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, " | ResourceId: %u\n", rptptr->ResourceId); oh_append_bigtext(&bigbuf1, str); oh_decode_capabilities(rptptr->ResourceCapabilities, &textbuffer); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, " | Capability: %s\n",(char *)textbuffer.Data); oh_append_bigtext(&bigbuf1, str); if ( rptptr->ResourceTag.DataType == SAHPI_TL_TYPE_TEXT ) { oh_append_bigtext(&bigbuf1, " | Tag: "); snprintf(str, rptptr->ResourceTag.DataLength+1, "%s", rptptr->ResourceTag.Data); oh_append_bigtext(&bigbuf1, str); oh_append_bigtext(&bigbuf1, "\n"); } printf("%s", bigbuf1.Data); return(rv); } /* * */ static SaErrorT show_inv(SaHpiSessionIdT sessionid, SaHpiRptEntryT *rptptr, SaHpiRdrT *rdrptr, SaHpiResourceIdT l_resourceid) { SaErrorT rvInvent = SA_OK; SaHpiIdrInfoT idrInfo; SaHpiIdrIdT idrid; char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; oh_big_textbuffer buffer; rvInvent = oh_init_bigtext(&buffer); if (rdrptr->RdrType == SAHPI_INVENTORY_RDR) { idrid = rdrptr->RdrTypeUnion.InventoryRec.IdrId; rvInvent = saHpiIdrInfoGet( sessionid, l_resourceid, idrid, &idrInfo); if (rvInvent !=SA_OK) { snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Inventory: ResourceId %u IdrId %u, error %s\n", l_resourceid, idrid, oh_lookup_error(rvInvent)); oh_append_bigtext(&buffer, str); show_rdr(&buffer); } else { snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Inventory Num: %u, ", rdrptr->RdrTypeUnion.InventoryRec.IdrId); oh_append_bigtext(&buffer, str); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Num Areas: %u, ", idrInfo.NumAreas); oh_append_bigtext(&buffer, str); if ( rdrptr->IdString.DataType == SAHPI_TL_TYPE_TEXT ) { oh_append_bigtext(&buffer, "Tag: "); snprintf(str, rdrptr->IdString.DataLength+1, "%s", rdrptr->IdString.Data); oh_append_bigtext(&buffer, str); oh_append_bigtext(&buffer, "\n"); } show_rdr(&buffer); } } return(rvInvent); } /* * */ static SaErrorT show_sens(SaHpiSessionIdT sessionid, SaHpiRptEntryT *rptptr, SaHpiRdrT *rdrptr, SaHpiResourceIdT l_resourceid) { SaErrorT rv = SA_OK; char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; oh_big_textbuffer buffer; rv = oh_init_bigtext(&buffer); if (rdrptr->RdrType == SAHPI_SENSOR_RDR) { /* Sensor Num */ snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Sensor Num: %u, ", rdrptr->RdrTypeUnion.SensorRec.Num); oh_append_bigtext(&buffer, str); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Type: %s, ", oh_lookup_sensortype(rdrptr->RdrTypeUnion.SensorRec.Type)); oh_append_bigtext(&buffer, str); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Category: %s, ", oh_lookup_eventcategory(rdrptr->RdrTypeUnion.SensorRec.Category)); oh_append_bigtext(&buffer, str); if ( rdrptr->IdString.DataType == SAHPI_TL_TYPE_TEXT ) { oh_append_bigtext(&buffer, "Tag: "); snprintf(str, rdrptr->IdString.DataLength+1, "%s", rdrptr->IdString.Data); oh_append_bigtext(&buffer, str); oh_append_bigtext(&buffer, "\n"); } show_rdr(&buffer); } return(rv); } /* * */ static SaErrorT show_rdr(oh_big_textbuffer *buffer) { SaErrorT rv = SA_OK; oh_big_textbuffer buffer1; rv = oh_init_bigtext(&buffer1); oh_append_bigtext(&buffer1, rdr_startblock); oh_append_bigtext(&buffer1, (char *) buffer->Data); printf("%s", buffer1.Data); return(rv); } /* * */ static SaErrorT list_rdr(SaHpiSessionIdT sessionid, SaHpiRptEntryT *rptptr, SaHpiRdrT *rdrptr, SaHpiResourceIdT l_resourceid) { SaErrorT rv = SA_OK; show_inv(sessionid, rptptr, rdrptr, l_resourceid); show_sens(sessionid, rptptr, rdrptr, l_resourceid); show_ctrl(sessionid, rptptr, rdrptr, l_resourceid); show_wdog(sessionid, rptptr, rdrptr, l_resourceid); show_ann(sessionid, rptptr, rdrptr, l_resourceid); show_dimi(sessionid, rptptr, rdrptr, l_resourceid); show_fumi(sessionid, rptptr, rdrptr, l_resourceid); return(rv); } /* * */ static SaErrorT show_ctrl(SaHpiSessionIdT sessionid, SaHpiRptEntryT *rptptr, SaHpiRdrT *rdrptr, SaHpiResourceIdT l_resourceid) { SaErrorT rv = SA_OK; char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; oh_big_textbuffer buffer; rv = oh_init_bigtext(&buffer); if (rdrptr->RdrType == SAHPI_CTRL_RDR){ snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Control Num: %u, ", rdrptr->RdrTypeUnion.CtrlRec.Num); oh_append_bigtext(&buffer, str); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Type: %s, ", oh_lookup_ctrltype(rdrptr->RdrTypeUnion.CtrlRec.Type)); oh_append_bigtext(&buffer, str); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Output Type: %s, ", oh_lookup_ctrloutputtype(rdrptr->RdrTypeUnion.CtrlRec.OutputType)); oh_append_bigtext(&buffer, str); if ( rdrptr->IdString.DataType == SAHPI_TL_TYPE_TEXT ) { oh_append_bigtext(&buffer, "Tag: "); snprintf(str, rdrptr->IdString.DataLength+1, "%s", rdrptr->IdString.Data); oh_append_bigtext(&buffer, str); oh_append_bigtext(&buffer, "\n"); } show_rdr(&buffer); } return(rv); } /* * */ static SaErrorT show_wdog(SaHpiSessionIdT sessionid, SaHpiRptEntryT *rptptr, SaHpiRdrT *rdrptr, SaHpiResourceIdT l_resourceid) { SaErrorT rv = SA_OK; char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; oh_big_textbuffer buffer; rv = oh_init_bigtext(&buffer); if (rdrptr->RdrType == SAHPI_WATCHDOG_RDR) { snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Watchdog Num: %u, ", rdrptr->RdrTypeUnion.WatchdogRec.WatchdogNum); oh_append_bigtext(&buffer, str); if ( rdrptr->IdString.DataType == SAHPI_TL_TYPE_TEXT ) { oh_append_bigtext(&buffer, "Tag: "); snprintf(str, rdrptr->IdString.DataLength+1, "%s", rdrptr->IdString.Data); oh_append_bigtext(&buffer, str); oh_append_bigtext(&buffer, "\n"); } show_rdr(&buffer); } return(rv); } /* * */ static SaErrorT show_dimi(SaHpiSessionIdT sessionid, SaHpiRptEntryT *rptptr, SaHpiRdrT *rdrptr, SaHpiResourceIdT l_resourceid) { SaErrorT rv = SA_OK; char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; oh_big_textbuffer buffer; rv = oh_init_bigtext(&buffer); if (rdrptr->RdrType == SAHPI_DIMI_RDR) { snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "DIMI Num: %u, ", rdrptr->RdrTypeUnion.DimiRec.DimiNum); oh_append_bigtext(&buffer, str); if ( rdrptr->IdString.DataType == SAHPI_TL_TYPE_TEXT ) { oh_append_bigtext(&buffer, "Tag: "); snprintf(str, rdrptr->IdString.DataLength+1, "%s", rdrptr->IdString.Data); oh_append_bigtext(&buffer, str); oh_append_bigtext(&buffer, "\n"); } show_rdr(&buffer); } return(rv); } /* * */ static SaErrorT show_fumi(SaHpiSessionIdT sessionid, SaHpiRptEntryT *rptptr, SaHpiRdrT *rdrptr, SaHpiResourceIdT l_resourceid) { SaErrorT rv = SA_OK; char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; oh_big_textbuffer buffer; rv = oh_init_bigtext(&buffer); if (rdrptr->RdrType == SAHPI_FUMI_RDR) { snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "FUMI Num: %u, ", rdrptr->RdrTypeUnion.FumiRec.Num); oh_append_bigtext(&buffer, str); if ( rdrptr->IdString.DataType == SAHPI_TL_TYPE_TEXT ) { oh_append_bigtext(&buffer, "Tag: "); snprintf(str, rdrptr->IdString.DataLength+1, "%s", rdrptr->IdString.Data); oh_append_bigtext(&buffer, str); oh_append_bigtext(&buffer, "\n"); } show_rdr(&buffer); } return(rv); } /* * */ static SaErrorT show_ann (SaHpiSessionIdT sessionid, SaHpiRptEntryT *rptptr, SaHpiRdrT *rdrptr, SaHpiResourceIdT l_resourceid) { SaErrorT rv = SA_OK; char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; oh_big_textbuffer buffer; rv = oh_init_bigtext(&buffer); if (rdrptr->RdrType == SAHPI_ANNUNCIATOR_RDR) { snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Annunciator Num: %u, ", rdrptr->RdrTypeUnion.AnnunciatorRec.AnnunciatorNum); oh_append_bigtext(&buffer, str); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Type: %s, ", oh_lookup_annunciatortype(rdrptr->RdrTypeUnion.AnnunciatorRec.AnnunciatorType)); oh_append_bigtext(&buffer, str); if ( rdrptr->IdString.DataType == SAHPI_TL_TYPE_TEXT ) { oh_append_bigtext(&buffer, "Tag: "); snprintf(str, rdrptr->IdString.DataLength+1, "%s", rdrptr->IdString.Data); oh_append_bigtext(&buffer, str); oh_append_bigtext(&buffer, "\n"); } show_rdr(&buffer); } return(rv); } /* end hpitop.c */ openhpi-3.6.1/clients/clients.c0000644000175100017510000003053312575647264015447 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * (C) Copyright IBM Corp. 2007 * (C) Copyright Ulrich Kleber 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Shuah Khan * Renier Morales * Ulrich Kleber * * Changes: * 20/01/2011 ulikleber Refactoring to use glib for option parsing and * introduce common options for all clients * */ #include "oh_clients.h" static gint optdid = SAHPI_UNSPECIFIED_DOMAIN_ID; static gboolean optdebug = FALSE; static gboolean optverbose = FALSE; static gchar *optep = NULL; static gchar *optdaemon = NULL; static gchar *optcfgfile = NULL; static GOptionEntry domain_option[] = { { "domain", 'D', 0, G_OPTION_ARG_INT, &optdid, "Select domain id nn", "nn" }, { NULL } }; static GOptionEntry debug_option[] = { { "debug", 'X', 0, G_OPTION_ARG_NONE, &optdebug, "Display debug messages", NULL }, { NULL } }; static GOptionEntry verbose_option[] = { { "verbose", 'V', 0, G_OPTION_ARG_NONE, &optverbose, "Verbose mode", NULL }, { NULL } }; static GOptionEntry entity_path_option[] = { { "entity-path", 'E', 0, G_OPTION_ARG_STRING, &optep, "Use entity path epath", "\"epath\"" }, { NULL } }; static GOptionEntry host_option[] = { { "host", 'N', 0, G_OPTION_ARG_STRING, &optdaemon, "Open session to the domain served by the daemon\n" " at the specified URL (host:port)\n" " This option overrides the OPENHPI_DAEMON_HOST and\n" " OPENHPI_DAEMON_PORT environment variables.", "\"host<:port>\"" }, { NULL } }; static GOptionEntry clientconf_option[] = { { "cfgfile", 'C', 0, G_OPTION_ARG_FILENAME, &optcfgfile, "Use passed file as client configuration file\n" " This option overrides the OPENHPICLIENT_CONF\n" " environment variable.", "\"file\"" }, { NULL } }; #ifdef _WIN32 /*--------------------------------------------------------------------*/ /* Function: setenv */ /*--------------------------------------------------------------------*/ static int setenv(const char * var, const char * val, int overwrite) { static const size_t BUFSIZE = 1024; char buf[BUFSIZE]; snprintf(buf, BUFSIZE, "%s=%s", var, val); return _putenv(buf); } #endif /* _WIN32 */ /*--------------------------------------------------------------------*/ /* ohc_domain_add_by_options */ /*--------------------------------------------------------------------*/ static SaErrorT ohc_domain_add_by_options(oHpiCommonOptionsT *opt) { SaErrorT rv = SA_OK; SaHpiDomainIdT did_N = SAHPI_UNSPECIFIED_DOMAIN_ID; SaHpiEntityPathT entity_root; const char *envhoststr, *envportstr; unsigned short envport; SaHpiTextBufferT envhost; SaHpiDomainIdT did_env = SAHPI_UNSPECIFIED_DOMAIN_ID; oh_init_ep(&entity_root); // Add a domain for the -N option if (opt->withdaemonhost) {// add a domain for that host if (opt->domainid == SAHPI_UNSPECIFIED_DOMAIN_ID) { // add with generated did rv = oHpiDomainAdd ( &opt->daemonhost, opt->daemonport, &entity_root, &did_N ); if (rv != SA_OK) { CRIT("Domain could not be created for given daemonhost"); return rv; } if (opt->debug) DBG("Added domain %u for daemonhost", did_N); // use this did (thus -N option will override environment variables) opt->domainid = did_N; } else { // add with given domain id rv = oHpiDomainAddById ( opt->domainid, &opt->daemonhost, opt->daemonport, &entity_root ); if (rv != SA_OK) { CRIT("Domain %u could not be created for given daemonhost", opt->domainid); return rv; } if (opt->debug) DBG("Added domain %u for daemonhost", opt->domainid); } } // check always for the environment variables. envhoststr = getenv("OPENHPI_DAEMON_HOST"); if (envhoststr != NULL) { // add a domain for this host oh_init_textbuffer(&envhost); rv = oh_append_textbuffer(&envhost, envhoststr); envportstr = getenv("OPENHPI_DAEMON_PORT"); if (envportstr == NULL) envport = OPENHPI_DEFAULT_DAEMON_PORT; else envport = atoi(envportstr); if (opt->withdaemonhost) { // we will add the domain with a new did, but // we will not use it now. rv = oHpiDomainAdd ( &envhost, envport, &entity_root, &did_env ); if (rv != SA_OK) { CRIT("Domain could not be created for OPENHPI_DAEMON_HOST %s:%u", envhoststr, envport); return rv; } if (opt->debug) DBG("Added domain %u for OPENHPI_DAEMON_HOST %s:%u", did_env, envhoststr, envport); } else if (opt->domainid == SAHPI_UNSPECIFIED_DOMAIN_ID) { // add with generated did (here we don't have -N or -D options) rv = oHpiDomainAdd ( &envhost, envport, &entity_root, &did_env ); if (rv != SA_OK) { CRIT("Domain could not be created for OPENHPI_DAEMON_HOST %s:%u", envhoststr, envport); return rv; } if (opt->debug) DBG("Added domain %u for OPENHPI_DAEMON_HOST %s:%u", did_env, envhoststr, envport); opt->domainid = did_env; } else { // use the given did for OPENHPI_DAEMON_HOST rv = oHpiDomainAddById ( opt->domainid, &envhost, envport, &entity_root ); if (rv != SA_OK) { CRIT("Domain %u could not be created for OPENHPI_DAEMON_HOST %s:%u", opt->domainid, envhoststr, envport); return rv; } if (opt->debug) DBG("Added domain %u for OPENHPI_DAEMON_HOST %s:%u", opt->domainid, envhoststr, envport); } } return SA_OK; } /*--------------------------------------------------------------------*/ /* oh_prog_version */ /*--------------------------------------------------------------------*/ void oh_prog_version(const char *prog_name) { SaHpiUint32T ohpi_major = oHpiVersionGet() >> 48; SaHpiUint32T ohpi_minor = (oHpiVersionGet() << 16) >> 48; SaHpiUint32T ohpi_patch = (oHpiVersionGet() << 32) >> 48; SaHpiVersionT hpiver; printf("%s - This program came with OpenHPI %u.%u.%u\n", prog_name, ohpi_major, ohpi_minor, ohpi_patch); hpiver = saHpiVersionGet(); printf("SAF HPI Version %c.0%d.0%d\n\n", (hpiver >> 16) + ('A' - 1), (hpiver & 0x0000FF00) >> 8, hpiver & 0x000000FF); } /*--------------------------------------------------------------------*/ /* ohc_option_parse */ /*--------------------------------------------------------------------*/ gboolean ohc_option_parse(int *argc, char *argv[], GOptionContext *context, oHpiCommonOptionsT *common_options, SaHpiUint8T optionmask ) { GError *error = NULL; SaErrorT rv = SA_OK; if (!argc || !argv || !context || !common_options) { CRIT ("Internal error. Terminating."); return FALSE; } if (optionmask & OHC_DOMAIN_OPTION) g_option_context_add_main_entries (context, domain_option, NULL); if (optionmask & OHC_DEBUG_OPTION) g_option_context_add_main_entries (context, debug_option, NULL); if (optionmask & OHC_VERBOSE_OPTION) g_option_context_add_main_entries (context, verbose_option, NULL); if (optionmask & OHC_ENTITY_PATH_OPTION) g_option_context_add_main_entries (context, entity_path_option, NULL); if (optionmask & OHC_HOST_OPTION) g_option_context_add_main_entries (context, host_option, NULL); if (optionmask & OHC_CLIENTCONF_OPTION) g_option_context_add_main_entries (context, clientconf_option, NULL); if (!g_option_context_parse (context, argc, &argv, &error)) { CRIT ("option parsing failed: %s\n",error->message); // CRIT ("\n%s", g_option_context_get_help (context, FALSE, NULL)); // Needs glib-2.14 return FALSE; } common_options->withentitypath = (optep != NULL); common_options->withdaemonhost = (optdaemon != NULL); if (optdebug && optverbose) { DBG("Parsing of options completed. Common options:\n --debug --verbose"); if (optdid >= 0) DBG(" --domain=%u ",optdid); if (common_options->withentitypath) DBG(" --entity-path=%s ",optep); if (common_options->withdaemonhost) DBG(" --daemon=%s ",optdaemon); } /* prepare output */ common_options->debug = optdebug; common_options->verbose = optverbose; common_options->domainid = optdid; oh_init_ep(&common_options->entitypath); if (common_options->withentitypath) { rv = oh_encode_entitypath(optep, &common_options->entitypath); if (optdebug) DBG("oh_encode_entitypath returned %s", oh_lookup_error(rv)); if (rv) { CRIT ("oh_encode_entitypath() returned %s", oh_lookup_error(rv)); CRIT ("Invalid entity path: %s", optep); return FALSE; } if (optdebug && optverbose) { DBG("Entity Path encoded successfully: "); oh_print_ep(&common_options->entitypath, 0); } } oh_init_textbuffer(&common_options->daemonhost); if (common_options->withdaemonhost) { char * hostbegin = NULL; char * hostend = NULL; char * portbegin = NULL; if ( *optdaemon == '[' ) { hostbegin = optdaemon + 1; hostend = strchr(hostbegin, ']'); if (hostend==NULL) { CRIT("Ill-formed host: %s", optdaemon); return FALSE; } } else { hostbegin = optdaemon; hostend = strchr(hostbegin, ':'); } if (hostend) { portbegin = strchr(hostend, ':' ); if (portbegin) { ++portbegin; } *hostend = '\0'; } rv = oh_append_textbuffer(&common_options->daemonhost, hostbegin); if (portbegin) { common_options->daemonport = atoi(portbegin); } else { common_options->daemonport = OPENHPI_DEFAULT_DAEMON_PORT; } if (optdebug && optverbose) { DBG("Daemon host:port scanned successfully: host=%s", hostbegin); DBG("Daemon host:port scanned successfully: port=%u", common_options->daemonport); } } oh_init_textbuffer(&common_options->clientconf); if (optcfgfile) { rv = oh_append_textbuffer(&common_options->clientconf, optcfgfile); setenv("OPENHPICLIENT_CONF", optcfgfile, 1); // -C option overrides environment var } g_free (optep); g_free (optdaemon); g_free (optcfgfile); // add domains for -N option and environment variables ohc_domain_add_by_options ( common_options ); return TRUE; } /*--------------------------------------------------------------------*/ /* ohc_session_open_by_option */ /*--------------------------------------------------------------------*/ SaErrorT ohc_session_open_by_option ( oHpiCommonOptionsT *opt, SaHpiSessionIdT *sessionid) { SaErrorT rv = SA_OK; if (opt->debug) { if (opt->domainid==SAHPI_UNSPECIFIED_DOMAIN_ID) DBG("saHpiSessionOpen"); else DBG("saHpiSessionOpen to domain %u",opt->domainid); } rv = saHpiSessionOpen(opt->domainid, sessionid, NULL); if (rv != SA_OK) { CRIT("saHpiSessionOpen returns %s",oh_lookup_error(rv)); return rv; } if (opt->debug) DBG("saHpiSessionOpen returns with SessionId %u", *sessionid); return SA_OK; } /* end clients.c */ openhpi-3.6.1/marshal/0000755000175100017510000000000012605014450013577 5ustar mohanmohanopenhpi-3.6.1/marshal/marshal_hpi.h0000644000175100017510000001744312575647264016275 0ustar mohanmohan/* * marshaling/demarshaling of hpi functions * * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * W. David Ashley * Anton Pak */ #ifndef dMarshalHpi_h #define dMarshalHpi_h #include #ifndef dMarshalHpiTypes_h #include "marshal_hpi_types.h" #endif #ifdef __cplusplus extern "C" { #endif typedef enum { eFsaHpiNull, eFsaHpiSessionOpen, eFsaHpiSessionClose, eFsaHpiDiscover, eFsaHpiDomainInfoGet, eFsaHpiDrtEntryGet, eFsaHpiDomainTagSet, eFsaHpiRptEntryGet, eFsaHpiRptEntryGetByResourceId, eFsaHpiResourceSeveritySet, eFsaHpiResourceTagSet, eFsaHpiResourceIdGet, eFsaHpiGetIdByEntityPath, eFsaHpiGetChildEntityPath, eFsaHpiResourceFailedRemove, eFsaHpiEventLogInfoGet, eFsaHpiEventLogCapabilitiesGet, eFsaHpiEventLogEntryGet, eFsaHpiEventLogEntryAdd, eFsaHpiEventLogClear, eFsaHpiEventLogTimeGet, eFsaHpiEventLogTimeSet, eFsaHpiEventLogStateGet, eFsaHpiEventLogStateSet, eFsaHpiEventLogOverflowReset, eFsaHpiSubscribe, eFsaHpiUnsubscribe, eFsaHpiEventGet, eFsaHpiEventAdd, eFsaHpiAlarmGetNext, eFsaHpiAlarmGet, eFsaHpiAlarmAcknowledge, eFsaHpiAlarmAdd, eFsaHpiAlarmDelete, eFsaHpiRdrGet, eFsaHpiRdrGetByInstrumentId, eFsaHpiSensorReadingGet, eFsaHpiSensorThresholdsGet, eFsaHpiSensorThresholdsSet, eFsaHpiSensorTypeGet, eFsaHpiSensorEnableGet, eFsaHpiSensorEnableSet, eFsaHpiSensorEventEnableGet, eFsaHpiSensorEventEnableSet, eFsaHpiSensorEventMasksGet, eFsaHpiSensorEventMasksSet, eFsaHpiControlTypeGet, eFsaHpiControlGet, eFsaHpiControlSet, eFsaHpiIdrInfoGet, eFsaHpiIdrAreaHeaderGet, eFsaHpiIdrAreaAdd, eFsaHpiIdrAreaAddById, eFsaHpiIdrAreaDelete, eFsaHpiIdrFieldGet, eFsaHpiIdrFieldAdd, eFsaHpiIdrFieldAddById, eFsaHpiIdrFieldSet, eFsaHpiIdrFieldDelete, eFsaHpiWatchdogTimerGet, eFsaHpiWatchdogTimerSet, eFsaHpiWatchdogTimerReset, eFsaHpiAnnunciatorGetNext, eFsaHpiAnnunciatorGet, eFsaHpiAnnunciatorAcknowledge, eFsaHpiAnnunciatorAdd, eFsaHpiAnnunciatorDelete, eFsaHpiAnnunciatorModeGet, eFsaHpiAnnunciatorModeSet, eFsaHpiDimiInfoGet, eFsaHpiDimiTestInfoGet, eFsaHpiDimiTestReadinessGet, eFsaHpiDimiTestStart, eFsaHpiDimiTestCancel, eFsaHpiDimiTestStatusGet, eFsaHpiDimiTestResultsGet, eFsaHpiFumiSourceSet, eFsaHpiFumiSourceInfoValidateStart, eFsaHpiFumiSourceInfoGet, eFsaHpiFumiTargetInfoGet, eFsaHpiFumiBackupStart, eFsaHpiFumiBankBootOrderSet, eFsaHpiFumiBankCopyStart, eFsaHpiFumiInstallStart, eFsaHpiFumiUpgradeStatusGet, eFsaHpiFumiTargetVerifyStart, eFsaHpiFumiUpgradeCancel, eFsaHpiFumiRollbackStart, eFsaHpiFumiActivate, eFsaHpiHotSwapPolicyCancel, eFsaHpiResourceActiveSet, eFsaHpiResourceInactiveSet, eFsaHpiAutoInsertTimeoutGet, eFsaHpiAutoInsertTimeoutSet, eFsaHpiAutoExtractTimeoutGet, eFsaHpiAutoExtractTimeoutSet, eFsaHpiHotSwapStateGet, eFsaHpiHotSwapActionRequest, eFsaHpiHotSwapIndicatorStateGet, eFsaHpiHotSwapIndicatorStateSet, eFsaHpiParmControl, eFsaHpiResourceLoadIdGet, eFsaHpiResourceLoadIdSet, eFsaHpiResourceResetStateGet, eFsaHpiResourceResetStateSet, eFsaHpiResourcePowerStateGet, eFsaHpiResourcePowerStateSet, eFoHpiHandlerCreate, eFoHpiHandlerDestroy, eFoHpiHandlerInfo, eFoHpiHandlerGetNext, eFoHpiHandlerFind, eFoHpiHandlerRetry, eFoHpiGlobalParamGet, eFoHpiGlobalParamSet, eFoHpiInjectEvent, // New B.03.01 functions // They are added to the end of enum in order to keep ABI compatibility eFsaHpiMyEntityPathGet, eFsaHpiRdrUpdateCountGet, eFsaHpiFumiSpecInfoGet, eFsaHpiFumiServiceImpactGet, eFsaHpiFumiSourceComponentInfoGet, eFsaHpiFumiTargetComponentInfoGet, eFsaHpiFumiLogicalTargetInfoGet, eFsaHpiFumiLogicalTargetComponentInfoGet, eFsaHpiFumiTargetVerifyMainStart, eFsaHpiFumiAutoRollbackDisableGet, eFsaHpiFumiAutoRollbackDisableSet, eFsaHpiFumiActivateStart, eFsaHpiFumiCleanup, } tHpiFucntionId; typedef struct { int m_id; const char *m_name; const cMarshalType **m_request; const cMarshalType **m_reply; // the first param is the result } cHpiMarshal; #define dHpiMarshalEntry(name) \ { \ eF ## name, \ #name, \ name ## In, \ name ## Out \ } cHpiMarshal *HpiMarshalFind( int id ); int HpiMarshalRequest ( cHpiMarshal *m, void *buffer, const void **params ); int HpiMarshalRequest1( cHpiMarshal *m, void *buffer, const void *p1 ); int HpiMarshalRequest2( cHpiMarshal *m, void *buffer, const void *p1, const void *p2 ); int HpiMarshalRequest3( cHpiMarshal *m, void *buffer, const void *p1, const void *p2, const void *p3 ); int HpiMarshalRequest4( cHpiMarshal *m, void *buffer, const void *p1, const void *p2, const void *p3, const void *p4 ); int HpiMarshalRequest5( cHpiMarshal *m, void *buffer, const void *p1, const void *p2, const void *p3, const void *p4, const void *p5 ); int HpiMarshalRequest6( cHpiMarshal *m, void *buffer, const void *p1, const void *p2, const void *p3, const void *p4, const void *p5, const void * p6 ); int HpiDemarshalRequest ( int byte_order, cHpiMarshal *m, const void *buffer, void **params ); int HpiDemarshalRequest1( int byte_order, cHpiMarshal *m, const void *buffer, void *p1 ); int HpiDemarshalRequest2( int byte_order, cHpiMarshal *m, const void *buffer, void *p1, void *p2 ); int HpiDemarshalRequest3( int byte_order, cHpiMarshal *m, const void *buffer, void *p1, void *p2, void *p3 ); int HpiDemarshalRequest4( int byte_order, cHpiMarshal *m, const void *buffer, void *p1, void *p2, void *p3, void *p4 ); int HpiDemarshalRequest5( int byte_order, cHpiMarshal *m, const void *buffer, void *p1, void *p2, void *p3, void *p4, void *p5 ); int HpiDemarshalRequest6( int byte_order, cHpiMarshal *m, const void *buffer, void *p1, void *p2, void *p3, void *p4, void *p5, void *p6 ); int HpiMarshalReply ( cHpiMarshal *m, void *buffer, const void **params ); int HpiMarshalReply0( cHpiMarshal *m, void *buffer, const void *result ); int HpiMarshalReply1( cHpiMarshal *m, void *buffer, const void *result, const void *p1 ); int HpiMarshalReply2( cHpiMarshal *m, void *buffer, const void *result, const void *p1, const void *p2 ); int HpiMarshalReply3( cHpiMarshal *m, void *buffer, const void *result, const void *p1, const void *p2, const void *p3 ); int HpiMarshalReply4( cHpiMarshal *m, void *buffer, const void *result, const void *p1, const void *p2, const void *p3, const void *p4 ); int HpiMarshalReply5( cHpiMarshal *m, void *buffer, const void *result, const void *p1, const void *p2, const void *p3, const void *p4, const void *p5 ); int HpiDemarshalReply ( int byte_order, cHpiMarshal *m, const void *buffer, void **params ); int HpiDemarshalReply0( int byte_order, cHpiMarshal *m, const void *buffer, void *result ); int HpiDemarshalReply1( int byte_order, cHpiMarshal *m, const void *buffer, void *result, void *p1 ); int HpiDemarshalReply2( int byte_order, cHpiMarshal *m, const void *buffer, void *result, void *p1, void *p2 ); int HpiDemarshalReply3( int byte_order, cHpiMarshal *m, const void *buffer, void *result, void *p1, void *p2, void *p3 ); int HpiDemarshalReply4( int byte_order, cHpiMarshal *m, const void *buffer, void *result, void *p1, void *p2, void *p3, void *p4 ); int HpiDemarshalReply5( int byte_order, cHpiMarshal *m, const void *buffer, void *result, void *p1, void *p2, void *p3, void *p4, void *p5 ); #ifdef __cplusplus } #endif #endif openhpi-3.6.1/marshal/marshal_hpi_types.c0000644000175100017510000013557612575647264017524 0ustar mohanmohan/* * marshaling/demarshaling of hpi data types * * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * W. David Ashley * Renier Morales * Anton Pak */ #include "marshal_hpi_types.h" #include #include #include #include #include // SaHpiTextBuffer static cMarshalType SaHpiTextBufferDataArray = dArray( "SaHpiTextBufferDataArray", SAHPI_MAX_TEXT_BUFFER_LENGTH, SaHpiUint8T, SaHpiUint8Type ); static cMarshalType SaHpiTextBufferElements[] = { dStructElement( SaHpiTextBufferT, DataType, SaHpiTextTypeType ), dStructElement( SaHpiTextBufferT, Language, SaHpiLanguageType ), dStructElement( SaHpiTextBufferT, DataLength, SaHpiUint8Type ), dStructElement( SaHpiTextBufferT, Data, SaHpiTextBufferDataArray ), dStructElementEnd() }; cMarshalType SaHpiTextBufferType = dStruct( SaHpiTextBufferElements ); // oHpi static cMarshalType oHpiHandlerConfigParamTypeNameArray = dArray( "oHpiHandlerConfigParamTypeNameArray", SAHPI_MAX_TEXT_BUFFER_LENGTH, SaHpiUint8T, SaHpiUint8Type ); static cMarshalType oHpiHandlerConfigParamTypeValueArray = dArray( "oHpiHandlerConfigParamTypeValueArray", SAHPI_MAX_TEXT_BUFFER_LENGTH, SaHpiUint8T, SaHpiUint8Type ); static cMarshalType oHpiHandlerConfigParamTypeElements[] = { dStructElement( oHpiHandlerConfigParamT, Name, oHpiHandlerConfigParamTypeNameArray ), dStructElement( oHpiHandlerConfigParamT, Value, oHpiHandlerConfigParamTypeValueArray ), dStructElementEnd() }; cMarshalType oHpiHandlerConfigParamType = dStruct( oHpiHandlerConfigParamTypeElements ); static cMarshalType HandlerConfigParamsArray = dVarArray( "HandlerConfigParamsArray", 0, oHpiHandlerConfigParamT, oHpiHandlerConfigParamType ); static cMarshalType oHpiHandlerConfigTypeElements[] = { dStructElement( oHpiHandlerConfigT, NumberOfParams, SaHpiUint8Type ), dStructElement( oHpiHandlerConfigT, Params, HandlerConfigParamsArray ), dStructElementEnd() }; cMarshalType oHpiHandlerConfigType = dStruct( oHpiHandlerConfigTypeElements ); // entity static cMarshalType SaHpiEntityElements[] = { dStructElement( SaHpiEntityT, EntityType, SaHpiEntityTypeType ), dStructElement( SaHpiEntityT, EntityLocation, SaHpiEntityLocationType ), dStructElementEnd() }; cMarshalType SaHpiEntityType = dStruct( SaHpiEntityElements ); // entity path static cMarshalType SaHpiEntityPathEntryArray = dArray( "SaHpiEntityPathEntryArray", SAHPI_MAX_ENTITY_PATH, SaHpiEntityT, SaHpiEntityType ); static cMarshalType SaHpiEntityPathElements[] = { dStructElement( SaHpiEntityPathT, Entry, SaHpiEntityPathEntryArray ), dStructElementEnd() }; cMarshalType SaHpiEntityPathType = dStruct( SaHpiEntityPathElements ); // sensors static cMarshalType SaHpiSensorInterpretedUnionBufferArray = dArray( "SaHpiSensorInterpretedUnionBufferArray", SAHPI_SENSOR_BUFFER_LENGTH, SaHpiUint8T, SaHpiUint8Type ); static cMarshalType SaHpiSensorReadingUnionElements[] = { dUnionElement( SAHPI_SENSOR_READING_TYPE_INT64, SaHpiInt64Type ), dUnionElement( SAHPI_SENSOR_READING_TYPE_UINT64, SaHpiUint64Type ), dUnionElement( SAHPI_SENSOR_READING_TYPE_FLOAT64, SaHpiFloat64Type ), dUnionElement( SAHPI_SENSOR_READING_TYPE_BUFFER , SaHpiSensorInterpretedUnionBufferArray ), dUnionElementEnd() }; static cMarshalType SaHpiSensorReadingUnionType = dUnion( 1, SaHpiSensorReadingUnionElements ); // sensor reading static cMarshalType SaHpiSensorReadingTElements[] = { dStructElement( SaHpiSensorReadingT, IsSupported, SaHpiBoolType ), dStructElement( SaHpiSensorReadingT, Type, SaHpiSensorReadingTypeType ), dStructElement( SaHpiSensorReadingT, Value, SaHpiSensorReadingUnionType ), dStructElementEnd() }; cMarshalType SaHpiSensorReadingType = dStruct( SaHpiSensorReadingTElements ); // sensor threshold values static cMarshalType SaHpiSensorThresholdsElements[] = { dStructElement( SaHpiSensorThresholdsT, LowCritical , SaHpiSensorReadingType ), dStructElement( SaHpiSensorThresholdsT, LowMajor , SaHpiSensorReadingType ), dStructElement( SaHpiSensorThresholdsT, LowMinor , SaHpiSensorReadingType ), dStructElement( SaHpiSensorThresholdsT, UpCritical , SaHpiSensorReadingType ), dStructElement( SaHpiSensorThresholdsT, UpMajor , SaHpiSensorReadingType ), dStructElement( SaHpiSensorThresholdsT, UpMinor , SaHpiSensorReadingType ), dStructElement( SaHpiSensorThresholdsT, PosThdHysteresis, SaHpiSensorReadingType ), dStructElement( SaHpiSensorThresholdsT, NegThdHysteresis, SaHpiSensorReadingType ), dStructElementEnd() }; cMarshalType SaHpiSensorThresholdsType = dStruct( SaHpiSensorThresholdsElements ); // sensor range static cMarshalType SaHpiSensorRangeElements[] = { dStructElement( SaHpiSensorRangeT, Flags , SaHpiSensorRangeFlagsType ), dStructElement( SaHpiSensorRangeT, Max , SaHpiSensorReadingType ), dStructElement( SaHpiSensorRangeT, Min , SaHpiSensorReadingType ), dStructElement( SaHpiSensorRangeT, Nominal , SaHpiSensorReadingType ), dStructElement( SaHpiSensorRangeT, NormalMax, SaHpiSensorReadingType ), dStructElement( SaHpiSensorRangeT, NormalMin, SaHpiSensorReadingType ), dStructElementEnd() }; cMarshalType SaHpiSensorRangeType = dStruct( SaHpiSensorRangeElements ); // sensor units static cMarshalType SaHpiSensorDataFormatElements[] = { dStructElement( SaHpiSensorDataFormatT, IsSupported, SaHpiBoolType ), dStructElement( SaHpiSensorDataFormatT, ReadingType, SaHpiSensorReadingTypeType ), dStructElement( SaHpiSensorDataFormatT, BaseUnits, SaHpiSensorUnitsType ), dStructElement( SaHpiSensorDataFormatT, ModifierUnits, SaHpiSensorUnitsType ), dStructElement( SaHpiSensorDataFormatT, ModifierUse, SaHpiSensorModUnitUseType ), dStructElement( SaHpiSensorDataFormatT, Percentage, SaHpiBoolType ), dStructElement( SaHpiSensorDataFormatT, Range, SaHpiSensorRangeType ), dStructElement( SaHpiSensorDataFormatT, AccuracyFactor,SaHpiFloat64Type ), dStructElementEnd() }; cMarshalType SaHpiSensorDataFormatType = dStruct( SaHpiSensorDataFormatElements ); // threshold support static cMarshalType SaHpiSensorThdDefnElements[] = { dStructElement( SaHpiSensorThdDefnT, IsAccessible, SaHpiBoolType ), dStructElement( SaHpiSensorThdDefnT, ReadThold, SaHpiSensorThdMaskType ), dStructElement( SaHpiSensorThdDefnT, WriteThold, SaHpiSensorThdMaskType ), dStructElement( SaHpiSensorThdDefnT, Nonlinear, SaHpiBoolType ), dStructElementEnd() }; cMarshalType SaHpiSensorThdDefnType = dStruct( SaHpiSensorThdDefnElements ); // sensor record static cMarshalType SaHpiSensorRecElements[] = { dStructElement( SaHpiSensorRecT, Num, SaHpiSensorNumType ), dStructElement( SaHpiSensorRecT, Type, SaHpiSensorTypeType ), dStructElement( SaHpiSensorRecT, Category, SaHpiEventCategoryType ), dStructElement( SaHpiSensorRecT, EnableCtrl,SaHpiBoolType ), dStructElement( SaHpiSensorRecT, EventCtrl, SaHpiSensorEventCtrlType ), dStructElement( SaHpiSensorRecT, Events, SaHpiEventStateType ), dStructElement( SaHpiSensorRecT, DataFormat, SaHpiSensorDataFormatType ), dStructElement( SaHpiSensorRecT, ThresholdDefn, SaHpiSensorThdDefnType ), dStructElement( SaHpiSensorRecT, Oem, SaHpiUint32Type ), dStructElementEnd() }; cMarshalType SaHpiSensorRecType = dStruct( SaHpiSensorRecElements ); // stream control state static cMarshalType SaHpiCtrlStateStreamArray = dArray( "SaHpiCtrlStateStreamArray", SAHPI_CTRL_MAX_STREAM_LENGTH, SaHpiUint8T, SaHpiUint8Type ); static cMarshalType SaHpiCtrlStateStreamElements[] = { dStructElement( SaHpiCtrlStateStreamT, Repeat, SaHpiBoolType ), dStructElement( SaHpiCtrlStateStreamT, StreamLength, SaHpiUint32Type ), dStructElement( SaHpiCtrlStateStreamT, Stream, SaHpiCtrlStateStreamArray ), dStructElementEnd() }; cMarshalType SaHpiCtrlStateStreamType = dStruct( SaHpiCtrlStateStreamElements ); // text control state static cMarshalType SaHpiCtrlStateTextElements[] = { dStructElement( SaHpiCtrlStateTextT, Line, SaHpiTxtLineNumType ), dStructElement( SaHpiCtrlStateTextT, Text, SaHpiTextBufferType ), dStructElementEnd() }; cMarshalType SaHpiCtrlStateTextType = dStruct( SaHpiCtrlStateTextElements ); // OEM control state static cMarshalType SaHpiCtrlStateOemBodyArray = dArray( "SaHpiCtrlStateOemBodyArray", SAHPI_CTRL_MAX_OEM_BODY_LENGTH, SaHpiUint8T, SaHpiUint8Type ); static cMarshalType SaHpiCtrlStateOemElements[] = { dStructElement( SaHpiCtrlStateOemT, MId, SaHpiManufacturerIdType ), dStructElement( SaHpiCtrlStateOemT, BodyLength, SaHpiUint8Type ), dStructElement( SaHpiCtrlStateOemT, Body, SaHpiCtrlStateOemBodyArray ), dStructElementEnd() }; cMarshalType SaHpiCtrlStateOemType = dStruct( SaHpiCtrlStateOemElements ); static cMarshalType SaHpiCtrlStateUnionElements[] = { dUnionElement( SAHPI_CTRL_TYPE_DIGITAL, SaHpiCtrlStateDigitalType ), dUnionElement( SAHPI_CTRL_TYPE_DISCRETE, SaHpiCtrlStateDiscreteType ), dUnionElement( SAHPI_CTRL_TYPE_ANALOG, SaHpiCtrlStateAnalogType ), dUnionElement( SAHPI_CTRL_TYPE_STREAM, SaHpiCtrlStateStreamType ), dUnionElement( SAHPI_CTRL_TYPE_TEXT, SaHpiCtrlStateTextType ), dUnionElement( SAHPI_CTRL_TYPE_OEM, SaHpiCtrlStateOemType ), dUnionElementEnd() }; static cMarshalType SaHpiCtrlStateUnionType = dUnion( 0, SaHpiCtrlStateUnionElements ); static cMarshalType SaHpiCtrlStateElements[] = { dStructElement( SaHpiCtrlStateT, Type, SaHpiCtrlTypeType ), dStructElement( SaHpiCtrlStateT, StateUnion, SaHpiCtrlStateUnionType ), dStructElementEnd() }; cMarshalType SaHpiCtrlStateType = dStruct( SaHpiCtrlStateElements ); // control rdr record types static cMarshalType SaHpiCtrlRecDigitalElements[] = { dStructElement( SaHpiCtrlRecDigitalT, Default, SaHpiCtrlStateDigitalType ), dStructElementEnd() }; cMarshalType SaHpiCtrlRecDigitalType = dStruct( SaHpiCtrlRecDigitalElements ); static cMarshalType SaHpiCtrlRecDiscreteElements[] = { dStructElement( SaHpiCtrlRecDiscreteT, Default, SaHpiCtrlStateDiscreteType ), dStructElementEnd() }; cMarshalType SaHpiCtrlRecDiscreteType = dStruct( SaHpiCtrlRecDiscreteElements ); static cMarshalType SaHpiCtrlRecAnalogElements[] = { dStructElement( SaHpiCtrlRecAnalogT, Min, SaHpiCtrlStateAnalogType ), dStructElement( SaHpiCtrlRecAnalogT, Max, SaHpiCtrlStateAnalogType ), dStructElement( SaHpiCtrlRecAnalogT, Default, SaHpiCtrlStateAnalogType ), dStructElementEnd() }; cMarshalType SaHpiCtrlRecAnalogType = dStruct( SaHpiCtrlRecAnalogElements ); static cMarshalType SaHpiCtrlRecStreamElements[] = { dStructElement( SaHpiCtrlRecStreamT, Default, SaHpiCtrlStateStreamType ), dStructElementEnd() }; cMarshalType SaHpiCtrlRecStreamType = dStruct( SaHpiCtrlRecStreamElements ); static cMarshalType SaHpiCtrlRecTextElements[] = { dStructElement( SaHpiCtrlRecTextT, MaxChars, SaHpiUint8Type ), dStructElement( SaHpiCtrlRecTextT, MaxLines, SaHpiUint8Type ), dStructElement( SaHpiCtrlRecTextT, Language, SaHpiLanguageType ), dStructElement( SaHpiCtrlRecTextT, DataType, SaHpiTextTypeType ), dStructElement( SaHpiCtrlRecTextT, Default, SaHpiCtrlStateTextType ), dStructElementEnd() }; cMarshalType SaHpiCtrlRecTextType = dStruct( SaHpiCtrlRecTextElements ); static cMarshalType SaHpiCtrlRecOemConfigDataArray = dArray( "SaHpiCtrlRecOemConfigDataArray", SAHPI_CTRL_OEM_CONFIG_LENGTH, SaHpiUint8T, SaHpiUint8Type ); static cMarshalType SaHpiCtrlRecOemElements[] = { dStructElement( SaHpiCtrlRecOemT, MId, SaHpiManufacturerIdType ), dStructElement( SaHpiCtrlRecOemT, ConfigData, SaHpiCtrlRecOemConfigDataArray ), dStructElement( SaHpiCtrlRecOemT, Default, SaHpiCtrlStateOemType ), dStructElementEnd() }; cMarshalType SaHpiCtrlRecOemType = dStruct( SaHpiCtrlRecOemElements ); static cMarshalType SaHpiCtrlRecUnionElements[] = { dUnionElement( SAHPI_CTRL_TYPE_DIGITAL, SaHpiCtrlRecDigitalType ), dUnionElement( SAHPI_CTRL_TYPE_DISCRETE, SaHpiCtrlRecDiscreteType ), dUnionElement( SAHPI_CTRL_TYPE_ANALOG, SaHpiCtrlRecAnalogType ), dUnionElement( SAHPI_CTRL_TYPE_STREAM, SaHpiCtrlRecStreamType ), dUnionElement( SAHPI_CTRL_TYPE_TEXT, SaHpiCtrlRecTextType ), dUnionElement( SAHPI_CTRL_TYPE_OEM, SaHpiCtrlRecOemType ), dUnionElementEnd() }; static cMarshalType SaHpiCtrlRecUnionType = dUnion( 2, SaHpiCtrlRecUnionElements ); // control rdr mode static cMarshalType SaHpiCtrlDefaultModeElements[] = { dStructElement( SaHpiCtrlDefaultModeT, Mode, SaHpiCtrlModeType ), dStructElement( SaHpiCtrlDefaultModeT, ReadOnly, SaHpiBoolType), dStructElementEnd() }; cMarshalType SaHpiCtrlDefaultModeType = dStruct( SaHpiCtrlDefaultModeElements ); static cMarshalType SaHpiCtrlRecElements[] = { dStructElement( SaHpiCtrlRecT, Num, SaHpiCtrlNumType ), dStructElement( SaHpiCtrlRecT, OutputType, SaHpiCtrlOutputTypeType ), dStructElement( SaHpiCtrlRecT, Type, SaHpiCtrlTypeType ), dStructElement( SaHpiCtrlRecT, TypeUnion, SaHpiCtrlRecUnionType ), dStructElement( SaHpiCtrlRecT, DefaultMode, SaHpiCtrlDefaultModeType ), dStructElement( SaHpiCtrlRecT, WriteOnly, SaHpiBoolType ), dStructElement( SaHpiCtrlRecT, Oem, SaHpiUint32Type), dStructElementEnd() }; cMarshalType SaHpiCtrlRecType = dStruct( SaHpiCtrlRecElements ); // entity inventory data static cMarshalType SaHpiIdrFieldTElements[] = { dStructElement( SaHpiIdrFieldT, AreaId, SaHpiEntryIdType ), dStructElement( SaHpiIdrFieldT, FieldId, SaHpiEntryIdType ), dStructElement( SaHpiIdrFieldT, Type, SaHpiIdrFieldTypeType ), dStructElement( SaHpiIdrFieldT, ReadOnly, SaHpiBoolType ), dStructElement( SaHpiIdrFieldT, Field, SaHpiTextBufferType ), dStructElementEnd() }; cMarshalType SaHpiIdrFieldType = dStruct( SaHpiIdrFieldTElements ); static cMarshalType SaHpiIdrAreaHeaderTElements[] = { dStructElement( SaHpiIdrAreaHeaderT, AreaId, SaHpiEntryIdType ), dStructElement( SaHpiIdrAreaHeaderT, Type, SaHpiIdrAreaTypeType ), dStructElement( SaHpiIdrAreaHeaderT, ReadOnly, SaHpiBoolType ), dStructElement( SaHpiIdrAreaHeaderT, NumFields, SaHpiUint32Type ), dStructElementEnd() }; cMarshalType SaHpiIdrAreaHeaderType = dStruct( SaHpiIdrAreaHeaderTElements ); static cMarshalType SaHpiIdrInfoTElements[] = { dStructElement( SaHpiIdrInfoT, IdrId, SaHpiIdrIdType ), dStructElement( SaHpiIdrInfoT, UpdateCount, SaHpiUint32Type ), dStructElement( SaHpiIdrInfoT, ReadOnly, SaHpiBoolType ), dStructElement( SaHpiIdrInfoT, NumAreas, SaHpiUint32Type ), dStructElementEnd() }; cMarshalType SaHpiIdrInfoType = dStruct( SaHpiIdrInfoTElements ); // inventory resource data records static cMarshalType SaHpiInventoryRecElements[] = { dStructElement( SaHpiInventoryRecT, IdrId, SaHpiUint32Type ), dStructElement( SaHpiInventoryRecT, Persistent, SaHpiBoolType ), dStructElement( SaHpiInventoryRecT, Oem, SaHpiUint32Type ), dStructElementEnd() }; cMarshalType SaHpiInventoryRecType = dStruct( SaHpiInventoryRecElements ); // watchdogs static cMarshalType SaHpiWatchdogElements[] = { dStructElement( SaHpiWatchdogT, Log, SaHpiBoolType ), dStructElement( SaHpiWatchdogT, Running, SaHpiBoolType ), dStructElement( SaHpiWatchdogT, TimerUse, SaHpiWatchdogTimerUseType ), dStructElement( SaHpiWatchdogT, TimerAction, SaHpiWatchdogActionType ), dStructElement( SaHpiWatchdogT, PretimerInterrupt, SaHpiWatchdogPretimerInterruptType ), dStructElement( SaHpiWatchdogT, PreTimeoutInterval, SaHpiUint32Type ), dStructElement( SaHpiWatchdogT, TimerUseExpFlags, SaHpiWatchdogExpFlagsType ), dStructElement( SaHpiWatchdogT, InitialCount, SaHpiUint32Type ), dStructElement( SaHpiWatchdogT, PresentCount, SaHpiUint32Type ), dStructElementEnd() }; cMarshalType SaHpiWatchdogType = dStruct( SaHpiWatchdogElements ); // watchdog resource data records static cMarshalType SaHpiWatchdogRecElements[] = { dStructElement( SaHpiWatchdogRecT, WatchdogNum, SaHpiWatchdogNumType ), dStructElement( SaHpiWatchdogRecT, Oem, SaHpiUint32Type ), dStructElementEnd() }; cMarshalType SaHpiWatchdogRecType = dStruct( SaHpiWatchdogRecElements ); // annunciators static cMarshalType SaHpiNameDataArray = dArray( "SaHpiNameDataArray", SA_HPI_MAX_NAME_LENGTH, SaHpiUint8T, SaHpiUint8Type ); static cMarshalType SaHpiNameElements[] = { dStructElement( SaHpiNameT, Length, SaHpiUint16Type ), dStructElement( SaHpiNameT, Value, SaHpiNameDataArray ), dStructElementEnd() }; cMarshalType SaHpiNameType = dStruct( SaHpiNameElements ); static cMarshalType SaHpiConditionTypeElements[] = { dStructElement( SaHpiConditionT, Type, SaHpiStatusCondTypeType ), dStructElement( SaHpiConditionT, Entity, SaHpiEntityPathType ), dStructElement( SaHpiConditionT, DomainId, SaHpiDomainIdType ), dStructElement( SaHpiConditionT, ResourceId, SaHpiResourceIdType ), dStructElement( SaHpiConditionT, SensorNum, SaHpiSensorNumType ), dStructElement( SaHpiConditionT, EventState, SaHpiEventStateType ), dStructElement( SaHpiConditionT, Name, SaHpiNameType ), dStructElement( SaHpiConditionT, Mid, SaHpiManufacturerIdType ), dStructElement( SaHpiConditionT, Data, SaHpiTextBufferType ), dStructElementEnd() }; cMarshalType SaHpiConditionType = dStruct( SaHpiConditionTypeElements ); static cMarshalType SaHpiAnnouncementTypeElements[] = { dStructElement( SaHpiAnnouncementT, EntryId, SaHpiEntryIdType ), dStructElement( SaHpiAnnouncementT, Timestamp, SaHpiTimeType ), dStructElement( SaHpiAnnouncementT, AddedByUser, SaHpiBoolType ), dStructElement( SaHpiAnnouncementT, Severity, SaHpiSeverityType ), dStructElement( SaHpiAnnouncementT, Acknowledged, SaHpiBoolType ), dStructElement( SaHpiAnnouncementT, StatusCond, SaHpiConditionType ), dStructElementEnd() }; cMarshalType SaHpiAnnouncementType = dStruct( SaHpiAnnouncementTypeElements ); // annunciators rdr static cMarshalType SaHpiAnnunciatorRecElements[] = { dStructElement( SaHpiAnnunciatorRecT, AnnunciatorNum, SaHpiAnnunciatorNumType ), dStructElement( SaHpiAnnunciatorRecT, AnnunciatorType, SaHpiAnnunciatorTypeType ), dStructElement( SaHpiAnnunciatorRecT, ModeReadOnly, SaHpiBoolType ), dStructElement( SaHpiAnnunciatorRecT, MaxConditions, SaHpiUint32Type ), dStructElement( SaHpiAnnunciatorRecT, Oem, SaHpiUint32Type ), dStructElementEnd() }; cMarshalType SaHpiAnnunciatorRecType = dStruct( SaHpiAnnunciatorRecElements ); //DIMIs static cMarshalType SaHpiDimiInfoElements[] = { dStructElement( SaHpiDimiInfoT, NumberOfTests, SaHpiDimiTotalTestsType ), dStructElement( SaHpiDimiInfoT, TestNumUpdateCounter, SaHpiUint32Type ), dStructElementEnd() }; cMarshalType SaHpiDimiInfoType = dStruct( SaHpiDimiInfoElements ); static cMarshalType SaHpiDimiTestParameterValueUnionTypeElements[] = { dUnionElement( SAHPI_DIMITEST_PARAM_TYPE_INT32, SaHpiInt32Type ), dUnionElement( SAHPI_DIMITEST_PARAM_TYPE_FLOAT64, SaHpiFloat64Type ), /* These two types are disregarded but must be spepcified */ dUnionElement( SAHPI_DIMITEST_PARAM_TYPE_BOOLEAN, SaHpiFloat64Type ), dUnionElement( SAHPI_DIMITEST_PARAM_TYPE_TEXT, SaHpiFloat64Type ), dUnionElementEnd() }; cMarshalType SaHpiDimiTestParameterValueUnionType = dUnion( 2, SaHpiDimiTestParameterValueUnionTypeElements ); static cMarshalType SaHpiDimiTestParamValue2TypeElements[] = { dUnionElement( SAHPI_DIMITEST_PARAM_TYPE_INT32, SaHpiInt32Type ), dUnionElement( SAHPI_DIMITEST_PARAM_TYPE_FLOAT64, SaHpiFloat64Type ), dUnionElement( SAHPI_DIMITEST_PARAM_TYPE_BOOLEAN, SaHpiBoolType ), dUnionElement( SAHPI_DIMITEST_PARAM_TYPE_TEXT, SaHpiTextBufferType ), dUnionElementEnd() }; cMarshalType SaHpiDimiTestParamValue2Type = dUnion( 2, SaHpiDimiTestParamValue2TypeElements ); static cMarshalType SaHpiDimiTestParamValue1TypeElements[] = { dUnionElement( SAHPI_DIMITEST_PARAM_TYPE_INT32, SaHpiInt32Type ), dUnionElement( SAHPI_DIMITEST_PARAM_TYPE_FLOAT64, SaHpiFloat64Type ), dUnionElement( SAHPI_DIMITEST_PARAM_TYPE_BOOLEAN, SaHpiBoolType ), dUnionElement( SAHPI_DIMITEST_PARAM_TYPE_TEXT, SaHpiTextBufferType ), dUnionElementEnd() }; cMarshalType SaHpiDimiTestParamValue1Type = dUnion( 1, SaHpiDimiTestParamValue1TypeElements ); static cMarshalType ParamNameArray = dArray( "ParamNameArray", SAHPI_DIMITEST_PARAM_NAME_LEN, SaHpiUint8T, SaHpiUint8Type ); static cMarshalType SaHpiDimiTestParamsDefinitionTypeElements[] = { dStructElement( SaHpiDimiTestParamsDefinitionT, ParamName, ParamNameArray ), dStructElement( SaHpiDimiTestParamsDefinitionT, ParamInfo, SaHpiTextBufferType ), dStructElement( SaHpiDimiTestParamsDefinitionT, ParamType, SaHpiDimiTestParamTypeType ), dStructElement( SaHpiDimiTestParamsDefinitionT, MinValue, SaHpiDimiTestParameterValueUnionType ), dStructElement( SaHpiDimiTestParamsDefinitionT, MaxValue, SaHpiDimiTestParameterValueUnionType ), dStructElement( SaHpiDimiTestParamsDefinitionT, DefaultParam, SaHpiDimiTestParamValue2Type ), dStructElementEnd() }; cMarshalType SaHpiDimiTestParamsDefinitionType = dStruct( SaHpiDimiTestParamsDefinitionTypeElements ); static cMarshalType SaHpiDimiTestAffectedEntityTypeElements[] = { dStructElement( SaHpiDimiTestAffectedEntityT, EntityImpacted, SaHpiEntityPathType ), dStructElement( SaHpiDimiTestAffectedEntityT, ServiceImpact, SaHpiDimiTestServiceImpactType ), dStructElementEnd() }; cMarshalType SaHpiDimiTestAffectedEntityType = dStruct( SaHpiDimiTestAffectedEntityTypeElements ); static cMarshalType EntitiesImpactedArray = dArray( "EntitiesImpactedArray", SAHPI_DIMITEST_MAX_ENTITIESIMPACTED, SaHpiDimiTestAffectedEntityT, SaHpiDimiTestAffectedEntityType ); static cMarshalType TestParametersArray = dArray( "TestParametersArray", SAHPI_DIMITEST_MAX_PARAMETERS, SaHpiDimiTestParamsDefinitionT, SaHpiDimiTestParamsDefinitionType ); static cMarshalType SaHpiDimiTestTypeElements[] = { dStructElement( SaHpiDimiTestT, TestName, SaHpiTextBufferType ), dStructElement( SaHpiDimiTestT, ServiceImpact, SaHpiDimiTestServiceImpactType ), dStructElement( SaHpiDimiTestT, EntitiesImpacted, EntitiesImpactedArray ), dStructElement( SaHpiDimiTestT, NeedServiceOS, SaHpiBoolType ), dStructElement( SaHpiDimiTestT, ServiceOS, SaHpiTextBufferType ), dStructElement( SaHpiDimiTestT, ExpectedRunDuration, SaHpiTimeType ), dStructElement( SaHpiDimiTestT, TestCapabilities, SaHpiDimiTestCapabilityType ), dStructElement( SaHpiDimiTestT, TestParameters, TestParametersArray ), dStructElementEnd() }; cMarshalType SaHpiDimiTestType = dStruct( SaHpiDimiTestTypeElements ); static cMarshalType SaHpiDimiTestResultsTypeElements[] = { dStructElement( SaHpiDimiTestResultsT, ResultTimeStamp, SaHpiTimeType ), dStructElement( SaHpiDimiTestResultsT, RunDuration, SaHpiTimeoutType ), dStructElement( SaHpiDimiTestResultsT, LastRunStatus, SaHpiDimiTestRunStatusType ), dStructElement( SaHpiDimiTestResultsT, TestErrorCode, SaHpiDimiTestErrCodeType ), dStructElement( SaHpiDimiTestResultsT, TestResultString, SaHpiTextBufferType ), dStructElement( SaHpiDimiTestResultsT, TestResultStringIsURI, SaHpiBoolType ), dStructElementEnd() }; cMarshalType SaHpiDimiTestResultsType = dStruct( SaHpiDimiTestResultsTypeElements ); static cMarshalType SaHpiDimiTestVariableParamsTypeElements[] = { dStructElement( SaHpiDimiTestVariableParamsT, ParamName, ParamNameArray ), dStructElement( SaHpiDimiTestVariableParamsT, ParamType, SaHpiDimiTestParamTypeType ), dStructElement( SaHpiDimiTestVariableParamsT, Value, SaHpiDimiTestParamValue1Type ), dStructElementEnd() }; cMarshalType SaHpiDimiTestVariableParamsType = dStruct( SaHpiDimiTestVariableParamsTypeElements ); static cMarshalType ParamsListArray = dVarArray( "ParamsListArray", 0, SaHpiDimiTestVariableParamsT, SaHpiDimiTestVariableParamsType ); static cMarshalType SaHpiDimiTestVariableParamsListTypeElements[] = { dStructElement( SaHpiDimiTestVariableParamsListT, NumberOfParams, SaHpiUint8Type ), dStructElement( SaHpiDimiTestVariableParamsListT, ParamsList, ParamsListArray ), dStructElementEnd() }; cMarshalType SaHpiDimiTestVariableParamsListType = dStruct( SaHpiDimiTestVariableParamsListTypeElements ); // DIMI rdr static cMarshalType SaHpiDimiRecElements[] = { dStructElement( SaHpiDimiRecT, DimiNum, SaHpiDimiNumType ), dStructElement( SaHpiDimiRecT, Oem, SaHpiUint32Type ), dStructElementEnd() }; cMarshalType SaHpiDimiRecType = dStruct( SaHpiDimiRecElements ); // FUMIs static cMarshalType SaHpiFumiSafDefinedSpecInfoElements[] = { dStructElement( SaHpiFumiSafDefinedSpecInfoT, SpecID, SaHpiFumiSafDefinedSpecIdType ), dStructElement( SaHpiFumiSafDefinedSpecInfoT, RevisionID, SaHpiUint32Type ), dStructElementEnd() }; static cMarshalType SaHpiFumiSafDefinedSpecInfoType = dStruct( SaHpiFumiSafDefinedSpecInfoElements ); static cMarshalType SaHpiFumiOemDefinedSpecInfoBodyArray = dArray( "SaHpiFumiOemDefinedSpecInfoBodyArray", SAHPI_FUMI_MAX_OEM_BODY_LENGTH, SaHpiUint8T, SaHpiUint8Type ); static cMarshalType SaHpiFumiOemDefinedSpecInfoElements[] = { dStructElement( SaHpiFumiOemDefinedSpecInfoT, Mid, SaHpiManufacturerIdType ), dStructElement( SaHpiFumiOemDefinedSpecInfoT, BodyLength, SaHpiUint8Type ), dStructElement( SaHpiFumiOemDefinedSpecInfoT, Body, SaHpiFumiOemDefinedSpecInfoBodyArray ), dStructElementEnd() }; static cMarshalType SaHpiFumiOemDefinedSpecInfoType = dStruct( SaHpiFumiOemDefinedSpecInfoElements ); static cMarshalType SaHpiFumiSpecInfoTypeUnionElements[] = { dUnionElement( SAHPI_FUMI_SPEC_INFO_NONE, SaHpiVoidType ), dUnionElement( SAHPI_FUMI_SPEC_INFO_SAF_DEFINED, SaHpiFumiSafDefinedSpecInfoType ), dUnionElement( SAHPI_FUMI_SPEC_INFO_OEM_DEFINED, SaHpiFumiOemDefinedSpecInfoType ), dUnionElementEnd() }; static cMarshalType SaHpiFumiSpecInfoTypeUnionType = dUnion( 0, SaHpiFumiSpecInfoTypeUnionElements ); static cMarshalType SaHpiFumiSpecInfoTypeElements[] = { dStructElement( SaHpiFumiSpecInfoT, SpecInfoType, SaHpiFumiSpecInfoTypeType ), dStructElement( SaHpiFumiSpecInfoT, SpecInfoTypeUnion, SaHpiFumiSpecInfoTypeUnionType ), dStructElementEnd() }; cMarshalType SaHpiFumiSpecInfoType = dStruct( SaHpiFumiSpecInfoTypeElements ); static cMarshalType SaHpiFumiImpactedEntityTypeElements[] = { dStructElement( SaHpiFumiImpactedEntityT, ImpactedEntity, SaHpiEntityPathType ), dStructElement( SaHpiFumiImpactedEntityT, ServiceImpact, SaHpiFumiServiceImpactType ), dStructElementEnd() }; static cMarshalType SaHpiFumiImpactedEntityType = dStruct( SaHpiFumiImpactedEntityTypeElements ); static cMarshalType SaHpiFumiServiceImpactDataImpactedEntitiesArray = dArray( "SaHpiFumiServiceImpactDataImpactedEntitiesArray", SAHPI_FUMI_MAX_ENTITIES_IMPACTED, SaHpiFumiImpactedEntityT, SaHpiFumiImpactedEntityType ); static cMarshalType SaHpiFumiServiceImpactDataElements[] = { dStructElement( SaHpiFumiServiceImpactDataT, NumEntities, SaHpiUint32Type ), dStructElement( SaHpiFumiServiceImpactDataT, ImpactedEntities, SaHpiFumiServiceImpactDataImpactedEntitiesArray ), dStructElementEnd() }; cMarshalType SaHpiFumiServiceImpactDataType = dStruct( SaHpiFumiServiceImpactDataElements ); static cMarshalType SaHpiFumiSourceInfoTypeElements[] = { dStructElement( SaHpiFumiSourceInfoT, SourceUri, SaHpiTextBufferType ), dStructElement( SaHpiFumiSourceInfoT, SourceStatus, SaHpiFumiSourceStatusType ), dStructElement( SaHpiFumiSourceInfoT, Identifier, SaHpiTextBufferType ), dStructElement( SaHpiFumiSourceInfoT, Description, SaHpiTextBufferType ), dStructElement( SaHpiFumiSourceInfoT, DateTime, SaHpiTextBufferType ), dStructElement( SaHpiFumiSourceInfoT, MajorVersion, SaHpiUint32Type ), dStructElement( SaHpiFumiSourceInfoT, MinorVersion, SaHpiUint32Type ), dStructElement( SaHpiFumiSourceInfoT, AuxVersion, SaHpiUint32Type ), dStructElementEnd() }; cMarshalType SaHpiFumiSourceInfoType = dStruct( SaHpiFumiSourceInfoTypeElements ); static cMarshalType SaHpiFumiBankInfoTypeElements[] = { dStructElement( SaHpiFumiBankInfoT, BankId, SaHpiUint8Type ), dStructElement( SaHpiFumiBankInfoT, BankSize, SaHpiUint32Type ), dStructElement( SaHpiFumiBankInfoT, Position, SaHpiUint32Type ), dStructElement( SaHpiFumiBankInfoT, BankState, SaHpiFumiBankStateType ), dStructElement( SaHpiFumiBankInfoT, Identifier, SaHpiTextBufferType ), dStructElement( SaHpiFumiBankInfoT, Description, SaHpiTextBufferType ), dStructElement( SaHpiFumiBankInfoT, DateTime, SaHpiTextBufferType ), dStructElement( SaHpiFumiBankInfoT, MajorVersion, SaHpiUint32Type ), dStructElement( SaHpiFumiBankInfoT, MinorVersion, SaHpiUint32Type ), dStructElement( SaHpiFumiBankInfoT, AuxVersion, SaHpiUint32Type ), dStructElementEnd() }; cMarshalType SaHpiFumiBankInfoType = dStruct( SaHpiFumiBankInfoTypeElements ); static cMarshalType SaHpiFumiFirmwareInstanceInfoTypeElements[] = { dStructElement( SaHpiFumiFirmwareInstanceInfoT, InstancePresent, SaHpiBoolType ), dStructElement( SaHpiFumiFirmwareInstanceInfoT, Identifier, SaHpiTextBufferType ), dStructElement( SaHpiFumiFirmwareInstanceInfoT, Description, SaHpiTextBufferType ), dStructElement( SaHpiFumiFirmwareInstanceInfoT, DateTime, SaHpiTextBufferType ), dStructElement( SaHpiFumiFirmwareInstanceInfoT, MajorVersion, SaHpiUint32Type ), dStructElement( SaHpiFumiFirmwareInstanceInfoT, MinorVersion, SaHpiUint32Type ), dStructElement( SaHpiFumiFirmwareInstanceInfoT, AuxVersion, SaHpiUint32Type ), dStructElementEnd() }; static cMarshalType SaHpiFumiFirmwareInstanceInfoType = dStruct( SaHpiFumiFirmwareInstanceInfoTypeElements ); static cMarshalType SaHpiFumiLogicalBankInfoTypeElements[] = { dStructElement( SaHpiFumiLogicalBankInfoT, FirmwarePersistentLocationCount, SaHpiUint8Type ), dStructElement( SaHpiFumiLogicalBankInfoT, BankStateFlags, SaHpiFumiLogicalBankStateFlagsType ), dStructElement( SaHpiFumiLogicalBankInfoT, PendingFwInstance, SaHpiFumiFirmwareInstanceInfoType ), dStructElement( SaHpiFumiLogicalBankInfoT, RollbackFwInstance, SaHpiFumiFirmwareInstanceInfoType ), dStructElementEnd() }; cMarshalType SaHpiFumiLogicalBankInfoType = dStruct( SaHpiFumiLogicalBankInfoTypeElements ); static cMarshalType SaHpiFumiComponentInfoTypeElements[] = { dStructElement( SaHpiFumiComponentInfoT, EntryId, SaHpiEntryIdType ), dStructElement( SaHpiFumiComponentInfoT, ComponentId, SaHpiUint32Type ), dStructElement( SaHpiFumiComponentInfoT, MainFwInstance, SaHpiFumiFirmwareInstanceInfoType ), dStructElement( SaHpiFumiComponentInfoT, ComponentFlags, SaHpiUint32Type ), dStructElementEnd() }; cMarshalType SaHpiFumiComponentInfoType = dStruct( SaHpiFumiComponentInfoTypeElements ); static cMarshalType SaHpiFumiLogicalComponentInfoTypeElements[] = { dStructElement( SaHpiFumiLogicalComponentInfoT, EntryId, SaHpiEntryIdType ), dStructElement( SaHpiFumiLogicalComponentInfoT, ComponentId, SaHpiUint32Type ), dStructElement( SaHpiFumiLogicalComponentInfoT, PendingFwInstance, SaHpiFumiFirmwareInstanceInfoType ), dStructElement( SaHpiFumiLogicalComponentInfoT, RollbackFwInstance, SaHpiFumiFirmwareInstanceInfoType ), dStructElement( SaHpiFumiLogicalComponentInfoT, ComponentFlags, SaHpiUint32Type ), dStructElementEnd() }; cMarshalType SaHpiFumiLogicalComponentInfoType = dStruct( SaHpiFumiLogicalComponentInfoTypeElements ); // FUMI rdr static cMarshalType SaHpiFumiRecElements[] = { dStructElement( SaHpiFumiRecT, Num, SaHpiFumiNumType ), dStructElement( SaHpiFumiRecT, AccessProt, SaHpiFumiProtocolType ), dStructElement( SaHpiFumiRecT, Capability, SaHpiFumiCapabilityType ), dStructElement( SaHpiFumiRecT, NumBanks, SaHpiUint8Type ), dStructElement( SaHpiFumiRecT, Oem, SaHpiUint32Type ), dStructElementEnd() }; cMarshalType SaHpiFumiRecType = dStruct( SaHpiFumiRecElements ); // rdr static cMarshalType SaHpiRdrTypeUnionTypeElements[] = { dUnionElement( SAHPI_NO_RECORD, SaHpiVoidType ), dUnionElement( SAHPI_CTRL_RDR, SaHpiCtrlRecType ), dUnionElement( SAHPI_SENSOR_RDR, SaHpiSensorRecType ), dUnionElement( SAHPI_INVENTORY_RDR, SaHpiInventoryRecType ), dUnionElement( SAHPI_WATCHDOG_RDR, SaHpiWatchdogRecType ), dUnionElement( SAHPI_ANNUNCIATOR_RDR, SaHpiAnnunciatorRecType ), dUnionElement( SAHPI_DIMI_RDR, SaHpiDimiRecType ), dUnionElement( SAHPI_FUMI_RDR, SaHpiFumiRecType ), dUnionElementEnd() }; static cMarshalType SaHpiRdrTypeUnionType = dUnion( 1, SaHpiRdrTypeUnionTypeElements ); static cMarshalType SaHpiRdrElements[] = { dStructElement( SaHpiRdrT, RecordId, SaHpiEntryIdType ), dStructElement( SaHpiRdrT, RdrType, SaHpiRdrTypeType ), dStructElement( SaHpiRdrT, Entity, SaHpiEntityPathType ), dStructElement( SaHpiRdrT, IsFru, SaHpiBoolType ), dStructElement( SaHpiRdrT, RdrTypeUnion, SaHpiRdrTypeUnionType ), dStructElement( SaHpiRdrT, IdString, SaHpiTextBufferType ), dStructElementEnd() }; cMarshalType SaHpiRdrType = dStruct( SaHpiRdrElements ); // events part 2 static cMarshalType SaHpiResourceEventTypeElements[] = { dStructElement( SaHpiResourceEventT, ResourceEventType, SaHpiResourceEventTypeType ), dStructElementEnd() }; cMarshalType SaHpiResourceEventType = dStruct( SaHpiResourceEventTypeElements ); static cMarshalType SaHpiDomainEventTypeElements[] = { dStructElement( SaHpiDomainEventT, Type, SaHpiDomainEventTypeType ), dStructElement( SaHpiDomainEventT, DomainId, SaHpiDomainIdType ), dStructElementEnd() }; cMarshalType SaHpiDomainEventType = dStruct( SaHpiDomainEventTypeElements ); static cMarshalType SaHpiSensorEventElements[] = { dStructElement( SaHpiSensorEventT, SensorNum, SaHpiSensorNumType ), dStructElement( SaHpiSensorEventT, SensorType, SaHpiSensorTypeType ), dStructElement( SaHpiSensorEventT, EventCategory, SaHpiEventCategoryType ), dStructElement( SaHpiSensorEventT, Assertion, SaHpiBoolType ), dStructElement( SaHpiSensorEventT, EventState, SaHpiEventStateType ), dStructElement( SaHpiSensorEventT, OptionalDataPresent, SaHpiSensorOptionalDataType ), dStructElement( SaHpiSensorEventT, TriggerReading, SaHpiSensorReadingType ), dStructElement( SaHpiSensorEventT, TriggerThreshold, SaHpiSensorReadingType ), dStructElement( SaHpiSensorEventT, PreviousState, SaHpiEventStateType ), dStructElement( SaHpiSensorEventT, CurrentState, SaHpiEventStateType ), dStructElement( SaHpiSensorEventT, Oem, SaHpiUint32Type ), dStructElement( SaHpiSensorEventT, SensorSpecific, SaHpiUint32Type ), dStructElementEnd() }; cMarshalType SaHpiSensorEventType = dStruct( SaHpiSensorEventElements ); static cMarshalType SaHpiSensorEnableChangeEventTElements[] = { dStructElement( SaHpiSensorEnableChangeEventT, SensorNum, SaHpiSensorNumType ), dStructElement( SaHpiSensorEnableChangeEventT, SensorType, SaHpiSensorTypeType ), dStructElement( SaHpiSensorEnableChangeEventT, EventCategory, SaHpiEventCategoryType ), dStructElement( SaHpiSensorEnableChangeEventT, SensorEnable, SaHpiBoolType ), dStructElement( SaHpiSensorEnableChangeEventT, SensorEventEnable, SaHpiBoolType ), dStructElement( SaHpiSensorEnableChangeEventT, AssertEventMask, SaHpiEventStateType ), dStructElement( SaHpiSensorEnableChangeEventT, DeassertEventMask, SaHpiEventStateType ), dStructElement( SaHpiSensorEnableChangeEventT, OptionalDataPresent, SaHpiSensorEnableOptDataType ), dStructElement( SaHpiSensorEnableChangeEventT, CurrentState, SaHpiEventStateType ), dStructElementEnd() }; cMarshalType SaHpiSensorEnableChangeEventType = dStruct( SaHpiSensorEnableChangeEventTElements ); static cMarshalType SaHpiHotSwapEventElements[] = { dStructElement( SaHpiHotSwapEventT, HotSwapState, SaHpiHsStateType ), dStructElement( SaHpiHotSwapEventT, PreviousHotSwapState, SaHpiHsStateType ), dStructElement( SaHpiHotSwapEventT, CauseOfStateChange, SaHpiHsCauseOfStateChangeType ), dStructElementEnd() }; cMarshalType SaHpiHotSwapEventType = dStruct( SaHpiHotSwapEventElements ); static cMarshalType SaHpiWatchdogEventElements[] = { dStructElement( SaHpiWatchdogEventT, WatchdogNum, SaHpiWatchdogNumType ), dStructElement( SaHpiWatchdogEventT, WatchdogAction, SaHpiWatchdogActionEventType ), dStructElement( SaHpiWatchdogEventT, WatchdogPreTimerAction, SaHpiWatchdogPretimerInterruptType ), dStructElement( SaHpiWatchdogEventT, WatchdogUse, SaHpiWatchdogTimerUseType ), dStructElementEnd() }; cMarshalType SaHpiWatchdogEventType = dStruct( SaHpiWatchdogEventElements ); static cMarshalType SaHpiHpiSwEventTypeElements[] = { dStructElement( SaHpiHpiSwEventT, MId, SaHpiManufacturerIdType ), dStructElement( SaHpiHpiSwEventT, Type, SaHpiSwEventTypeType ), dStructElement( SaHpiHpiSwEventT, EventData, SaHpiTextBufferType ), dStructElementEnd() }; cMarshalType SaHpiHpiSwEventType = dStruct( SaHpiHpiSwEventTypeElements ); static cMarshalType SaHpiOemEventTypeElements[] = { dStructElement( SaHpiOemEventT, MId, SaHpiManufacturerIdType ), dStructElement( SaHpiOemEventT, OemEventData, SaHpiTextBufferType ), dStructElementEnd() }; cMarshalType SaHpiOemEventType = dStruct( SaHpiOemEventTypeElements ); static cMarshalType SaHpiUserEventElements[] = { dStructElement( SaHpiUserEventT, UserEventData, SaHpiTextBufferType ), dStructElementEnd() }; cMarshalType SaHpiUserEventType = dStruct( SaHpiUserEventElements ); static cMarshalType SaHpiDimiEventElements[] = { dStructElement( SaHpiDimiEventT, DimiNum, SaHpiDimiNumType ), dStructElement( SaHpiDimiEventT, TestNum, SaHpiDimiTestNumType ), dStructElement( SaHpiDimiEventT, DimiTestRunStatus, SaHpiDimiTestRunStatusType ), dStructElement( SaHpiDimiEventT, DimiTestPercentCompleted, SaHpiDimiTestPercentCompletedType ), dStructElementEnd() }; cMarshalType SaHpiDimiEventType = dStruct( SaHpiDimiEventElements ); static cMarshalType SaHpiDimiUpdateEventElements[] = { dStructElement( SaHpiDimiUpdateEventT, DimiNum, SaHpiDimiNumType ), dStructElementEnd() }; cMarshalType SaHpiDimiUpdateEventType = dStruct( SaHpiDimiUpdateEventElements ); static cMarshalType SaHpiFumiEventElements[] = { dStructElement( SaHpiFumiEventT, FumiNum, SaHpiFumiNumType ), dStructElement( SaHpiFumiEventT, BankNum, SaHpiUint8Type ), dStructElement( SaHpiFumiEventT, UpgradeStatus, SaHpiFumiUpgradeStatusType ), dStructElementEnd() }; cMarshalType SaHpiFumiEventType = dStruct( SaHpiFumiEventElements ); static cMarshalType SaHpiEventUnionElements[] = { dUnionElement( SAHPI_ET_RESOURCE, SaHpiResourceEventType ), dUnionElement( SAHPI_ET_DOMAIN, SaHpiDomainEventType ), dUnionElement( SAHPI_ET_SENSOR, SaHpiSensorEventType ), dUnionElement( SAHPI_ET_SENSOR_ENABLE_CHANGE, SaHpiSensorEnableChangeEventType ), dUnionElement( SAHPI_ET_HOTSWAP, SaHpiHotSwapEventType ), dUnionElement( SAHPI_ET_WATCHDOG, SaHpiWatchdogEventType ), dUnionElement( SAHPI_ET_HPI_SW, SaHpiHpiSwEventType ), dUnionElement( SAHPI_ET_OEM, SaHpiOemEventType ), dUnionElement( SAHPI_ET_USER, SaHpiUserEventType ), dUnionElement( SAHPI_ET_DIMI, SaHpiDimiEventType ), dUnionElement( SAHPI_ET_DIMI_UPDATE, SaHpiDimiUpdateEventType ), dUnionElement( SAHPI_ET_FUMI, SaHpiFumiEventType ), dUnionElementEnd() }; static cMarshalType SaHpiEventUnionType = dUnion( 1, SaHpiEventUnionElements ); static cMarshalType SaHpiEventElements[] = { dStructElement( SaHpiEventT, Source, SaHpiResourceIdType ), dStructElement( SaHpiEventT, EventType, SaHpiEventTypeType ), dStructElement( SaHpiEventT, Timestamp, SaHpiTimeType ), dStructElement( SaHpiEventT, Severity, SaHpiSeverityType ), dStructElement( SaHpiEventT, EventDataUnion, SaHpiEventUnionType ), dStructElementEnd() }; cMarshalType SaHpiEventType = dStruct( SaHpiEventElements ); // resource presence table static cMarshalType GuidDataArray = dArray( "GuidDataArray", 16, SaHpiUint8T, SaHpiUint8Type ); static cMarshalType SaHpiResourceInfoElements[] = { dStructElement( SaHpiResourceInfoT, ResourceRev, SaHpiUint8Type ), dStructElement( SaHpiResourceInfoT, SpecificVer, SaHpiUint8Type ), dStructElement( SaHpiResourceInfoT, DeviceSupport, SaHpiUint8Type ), dStructElement( SaHpiResourceInfoT, ManufacturerId, SaHpiManufacturerIdType ), dStructElement( SaHpiResourceInfoT, ProductId, SaHpiUint16Type ), dStructElement( SaHpiResourceInfoT, FirmwareMajorRev, SaHpiUint8Type ), dStructElement( SaHpiResourceInfoT, FirmwareMinorRev, SaHpiUint8Type ), dStructElement( SaHpiResourceInfoT, AuxFirmwareRev, SaHpiUint8Type ), dStructElement( SaHpiResourceInfoT, Guid, GuidDataArray ), dStructElementEnd() }; cMarshalType SaHpiResourceInfoType = dStruct( SaHpiResourceInfoElements ); static cMarshalType SaHpiRptEntryElements[] = { dStructElement( SaHpiRptEntryT, EntryId, SaHpiEntryIdType ), dStructElement( SaHpiRptEntryT, ResourceId, SaHpiResourceIdType ), dStructElement( SaHpiRptEntryT, ResourceInfo, SaHpiResourceInfoType ), dStructElement( SaHpiRptEntryT, ResourceEntity, SaHpiEntityPathType ), dStructElement( SaHpiRptEntryT, ResourceCapabilities,SaHpiCapabilitiesType ), dStructElement( SaHpiRptEntryT, HotSwapCapabilities, SaHpiHsCapabilitiesType ), dStructElement( SaHpiRptEntryT, ResourceSeverity, SaHpiSeverityType ), dStructElement( SaHpiRptEntryT, ResourceFailed, SaHpiBoolType ), dStructElement( SaHpiRptEntryT, ResourceTag, SaHpiTextBufferType ), dStructElementEnd() }; cMarshalType SaHpiRptEntryType = dStruct( SaHpiRptEntryElements ); static cMarshalType SaHpiLoadIdElements[] = { dStructElement( SaHpiLoadIdT, LoadNumber, SaHpiLoadNumberType ), dStructElement( SaHpiLoadIdT, LoadName, SaHpiTextBufferType ), dStructElementEnd() }; cMarshalType SaHpiLoadIdType = dStruct( SaHpiLoadIdElements ); // domains static cMarshalType SaHpiDomainInfoTElements[] = { dStructElement( SaHpiDomainInfoT, DomainId, SaHpiDomainIdType ), dStructElement( SaHpiDomainInfoT, DomainCapabilities, SaHpiDomainCapabilitiesType ), dStructElement( SaHpiDomainInfoT, IsPeer, SaHpiBoolType ), dStructElement( SaHpiDomainInfoT, DomainTag, SaHpiTextBufferType ), dStructElement( SaHpiDomainInfoT, DrtUpdateCount, SaHpiUint32Type ), dStructElement( SaHpiDomainInfoT, DrtUpdateTimestamp, SaHpiTimeType ), dStructElement( SaHpiDomainInfoT, RptUpdateCount, SaHpiUint32Type ), dStructElement( SaHpiDomainInfoT, RptUpdateTimestamp, SaHpiTimeType ), dStructElement( SaHpiDomainInfoT, DatUpdateCount, SaHpiUint32Type ), dStructElement( SaHpiDomainInfoT, DatUpdateTimestamp, SaHpiTimeType ), dStructElement( SaHpiDomainInfoT, ActiveAlarms, SaHpiUint32Type ), dStructElement( SaHpiDomainInfoT, CriticalAlarms, SaHpiUint32Type ), dStructElement( SaHpiDomainInfoT, MajorAlarms, SaHpiUint32Type ), dStructElement( SaHpiDomainInfoT, MinorAlarms, SaHpiUint32Type ), dStructElement( SaHpiDomainInfoT, DatUserAlarmLimit, SaHpiUint32Type ), dStructElement( SaHpiDomainInfoT, DatOverflow, SaHpiBoolType ), dStructElement( SaHpiDomainInfoT, Guid, GuidDataArray ), dStructElementEnd() }; cMarshalType SaHpiDomainInfoType = dStruct( SaHpiDomainInfoTElements ); static cMarshalType SaHpiDrtEntryTElements[] = { dStructElement( SaHpiDrtEntryT, EntryId, SaHpiEntryIdType ), dStructElement( SaHpiDrtEntryT, DomainId, SaHpiDomainIdType ), dStructElement( SaHpiDrtEntryT, IsPeer, SaHpiBoolType ), dStructElementEnd() }; cMarshalType SaHpiDrtEntryType = dStruct( SaHpiDrtEntryTElements ); static cMarshalType SaHpiAlarmTElements[] = { dStructElement( SaHpiAlarmT, AlarmId, SaHpiAlarmIdType ), dStructElement( SaHpiAlarmT, Timestamp, SaHpiTimeType ), dStructElement( SaHpiAlarmT, Severity, SaHpiSeverityType ), dStructElement( SaHpiAlarmT, Acknowledged, SaHpiBoolType ), dStructElement( SaHpiAlarmT, AlarmCond, SaHpiConditionType ), dStructElementEnd() }; cMarshalType SaHpiAlarmType = dStruct( SaHpiAlarmTElements ); // event log static cMarshalType SaHpiEventLogInfoTElements[] = { dStructElement( SaHpiEventLogInfoT, Entries, SaHpiUint32Type ), dStructElement( SaHpiEventLogInfoT, Size, SaHpiUint32Type ), dStructElement( SaHpiEventLogInfoT, UserEventMaxSize, SaHpiUint32Type ), dStructElement( SaHpiEventLogInfoT, UpdateTimestamp, SaHpiTimeType ), dStructElement( SaHpiEventLogInfoT, CurrentTime, SaHpiTimeType ), dStructElement( SaHpiEventLogInfoT, Enabled, SaHpiBoolType ), dStructElement( SaHpiEventLogInfoT, OverflowFlag, SaHpiBoolType ), dStructElement( SaHpiEventLogInfoT, OverflowResetable, SaHpiBoolType ), dStructElement( SaHpiEventLogInfoT, OverflowAction, SaHpiSelOverflowActionType ), dStructElementEnd() }; cMarshalType SaHpiEventLogInfoType = dStruct( SaHpiEventLogInfoTElements ); static cMarshalType SaHpiEventLogEntryElements[] = { dStructElement( SaHpiEventLogEntryT, EntryId, SaHpiEventLogEntryIdType ), dStructElement( SaHpiEventLogEntryT, Timestamp, SaHpiTimeType ), dStructElement( SaHpiEventLogEntryT, Event, SaHpiEventType ), dStructElementEnd() }; cMarshalType SaHpiEventLogEntryType = dStruct( SaHpiEventLogEntryElements ); // handler info static cMarshalType plugin_nameBufferArray = dArray( "plugin_nameBufferArray", MAX_PLUGIN_NAME_LENGTH, SaHpiUint8T, SaHpiUint8Type ); static cMarshalType oHpiHandlerInfoElements[] = { dStructElement( oHpiHandlerInfoT, id, oHpiHandlerIdType), dStructElement( oHpiHandlerInfoT, plugin_name, plugin_nameBufferArray ), dStructElement( oHpiHandlerInfoT, entity_root, SaHpiEntityPathType ), dStructElement( oHpiHandlerInfoT, load_failed, SaHpiInt32Type ), dStructElementEnd() }; cMarshalType oHpiHandlerInfoType = dStruct( oHpiHandlerInfoElements ); // global param static cMarshalType GlobalParamPathArray = dArray( "GlobalParamPathArray", OH_PATH_PARAM_MAX_LENGTH, SaHpiUint8T, SaHpiUint8Type ); static cMarshalType GlobalParamVarPathArray = dArray( "GlobalParamVarPathArray", OH_PATH_PARAM_MAX_LENGTH, SaHpiUint8T, SaHpiUint8Type ); static cMarshalType GlobalParamConfArray = dArray( "GlobalParamConfArray", OH_PATH_PARAM_MAX_LENGTH, SaHpiUint8T, SaHpiUint8Type ); static cMarshalType oHpiGlobalParamUnionTypeElements[] = { dUnionElement( OHPI_ON_EP, SaHpiEntityPathType ), dUnionElement( OHPI_LOG_ON_SEV, SaHpiSeverityType ), dUnionElement( OHPI_EVT_QUEUE_LIMIT, SaHpiUint32Type ), dUnionElement( OHPI_DEL_SIZE_LIMIT, SaHpiUint32Type ), dUnionElement( OHPI_DEL_SAVE, SaHpiBoolType ), dUnionElement( OHPI_DAT_SIZE_LIMIT, SaHpiUint32Type ), dUnionElement( OHPI_DAT_USER_LIMIT, SaHpiUint32Type ), dUnionElement( OHPI_DAT_SAVE, SaHpiBoolType ), dUnionElement( OHPI_PATH, GlobalParamPathArray ), dUnionElement( OHPI_VARPATH, GlobalParamVarPathArray ), dUnionElement( OHPI_CONF, GlobalParamConfArray ), dUnionElementEnd() }; static cMarshalType oHpiGlobalParamUnionType = dUnion( 0, oHpiGlobalParamUnionTypeElements ); static cMarshalType oHpiGlobalParamTypeElements[] = { dStructElement( oHpiGlobalParamT, Type, oHpiGlobalParamTypeType ), dStructElement( oHpiGlobalParamT, u, oHpiGlobalParamUnionType ), dStructElementEnd() }; cMarshalType oHpiGlobalParamType = dStruct( oHpiGlobalParamTypeElements ); openhpi-3.6.1/marshal/marshal_hpi_types.h0000644000175100017510000002400512575647263017510 0ustar mohanmohan/* * marshaling/demarshaling of hpi data types * * Copyright (c) 2004 by FORCE Computers. * (C) Copyright IBM Corp. 2008 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * W. David Ashley * Renier Morales * Anton Pak */ #ifndef dMarshalHpiTypes_h #define dMarshalHpiTypes_h #include #ifndef dMarshal_h #include "marshal.h" #endif #ifdef __cplusplus extern "C" { #endif #define SaHpiVoidType Marshal_Uint8Type #define SaHpiUint8Type Marshal_Uint8Type #define SaHpiUint16Type Marshal_Uint16Type #define SaHpiUint32Type Marshal_Uint32Type #define SaHpiInt8Type Marshal_Int8Type #define SaHpiInt16Type Marshal_Int16Type #define SaHpiInt32Type Marshal_Int32Type #define SaHpiInt64Type Marshal_Int64Type #define SaHpiUint64Type Marshal_Uint64Type #define SaHpiFloat32Type Marshal_Float32Type #define SaHpiFloat64Type Marshal_Float64Type #define SaHpiBoolType SaHpiUint8Type #define SaHpiManufacturerIdType SaHpiUint32Type #define SaHpiVersionType SaHpiUint32Type #define SaErrorType SaHpiInt32Type #define SaHpiDomainIdType SaHpiUint32Type #define SaHpiSessionIdType SaHpiUint32Type #define SaHpiResourceIdType SaHpiUint32Type #define SaHpiHsCapabilitiesType SaHpiUint32Type #define SaHpiEntryIdType SaHpiUint32Type #define SaHpiTimeType SaHpiInt64Type #define SaHpiTimeoutType SaHpiInt64Type #define SaHpiLoadNumberType SaHpiUint32Type #define SaHpiEventLogCapabilitiesType SaHpiUint32Type // text buffer #define SaHpiTextTypeType SaHpiUint32Type #define SaHpiLanguageType SaHpiUint32Type extern cMarshalType SaHpiTextBufferType; #define SaHpiInstrumentIdType SaHpiUint32Type // entity #define SaHpiEntityTypeType SaHpiUint32Type #define SaHpiEntityLocationType SaHpiUint32Type extern cMarshalType SaHpiEntityType; extern cMarshalType SaHpiEntityPathType; // events #define SaHpiEventCategoryType SaHpiUint8Type #define SaHpiEventStateType SaHpiUint16Type // sensors #define SaHpiSensorNumType SaHpiUint32Type #define SaHpiSensorTypeType SaHpiUint32Type // sensor reading type #define SaHpiSensorReadingTypeType SaHpiUint32Type extern cMarshalType SaHpiSensorReadingType; // sensor thresholds extern cMarshalType SaHpiSensorThresholdsType; #define SaHpiSensorRangeFlagsType SaHpiUint8Type extern cMarshalType SaHpiSensorRangeType; // sensor rdr sensor units #define SaHpiSensorUnitsType SaHpiUint32Type #define SaHpiSensorModUnitUseType SaHpiUint32Type extern cMarshalType SaHpiSensorDataFormatType; // sensor rdr threshold support #define SaHpiSensorThdMaskType SaHpiUint8Type extern cMarshalType SaHpiSensorThdDefnType; // sensor rdr event control #define SaHpiSensorEventCtrlType SaHpiUint32Type // sensor rdr record extern cMarshalType SaHpiSensorRecType; // controls #define SaHpiCtrlNumType SaHpiUint32Type #define SaHpiCtrlTypeType SaHpiUint32Type #define SaHpiCtrlStateDigitalType SaHpiUint32Type #define SaHpiCtrlStateDiscreteType SaHpiUint32Type #define SaHpiCtrlStateAnalogType SaHpiInt32Type extern cMarshalType SaHpiCtrlStateStreamType; #define SaHpiCtrlModeType SaHpiUint32Type // control text controls #define SaHpiTxtLineNumType SaHpiUint8Type extern cMarshalType SaHpiCtrlStateTextType; extern cMarshalType SaHpiCtrlStateOemType; extern cMarshalType SaHpiCtrlStateType; // control resource data records #define SaHpiCtrlOutputTypeType SaHpiUint32Type extern cMarshalType SaHpiCtrlRecDigitalType; extern cMarshalType SaHpiCtrlRecDiscreteType; extern cMarshalType SaHpiCtrlRecAnalogType; extern cMarshalType SaHpiCtrlRecStreamType; extern cMarshalType SaHpiCtrlRecTextType; extern cMarshalType SaHpiCtrlRecOemType; extern cMarshalType SaHpiCtrlDefaultModeType; extern cMarshalType SaHpiCtrlRecType; // entity inventory data #define SaHpiIdrIdType SaHpiUint32Type #define SaHpiIdrAreaTypeType SaHpiUint32Type #define SaHpiIdrFieldTypeType SaHpiUint32Type extern cMarshalType SaHpiIdrFieldType; extern cMarshalType SaHpiIdrAreaHeaderType; extern cMarshalType SaHpiIdrInfoType; // inventory data resource records extern cMarshalType SaHpiInventoryRecType; // watchdogs #define SaHpiWatchdogNumType SaHpiUint32Type #define SaHpiWatchdogActionType SaHpiUint32Type #define SaHpiWatchdogActionEventType SaHpiUint32Type #define SaHpiWatchdogPretimerInterruptType SaHpiUint32Type #define SaHpiWatchdogTimerUseType SaHpiUint32Type #define SaHpiWatchdogExpFlagsType SaHpiUint8Type extern cMarshalType SaHpiWatchdogType; // watchdog resource data records extern cMarshalType SaHpiWatchdogRecType; // Annunciators #define SaHpiAnnunciatorNumType SaHpiUint32Type #define SaHpiStatusCondTypeType SaHpiUint32Type extern cMarshalType SaHpiNameType; extern cMarshalType SaHpiConditionType; extern cMarshalType SaHpiAnnouncementType; #define SaHpiAnnunciatorModeType SaHpiUint32Type // annunciator resource data records #define SaHpiAnnunciatorTypeType SaHpiUint32Type extern cMarshalType SaHpiAnnunciatorRecType; // DIMIs #define SaHpiDimiNumType SaHpiUint32Type #define SaHpiDimiTestNumType SaHpiUint32Type #define SaHpiDimiTotalTestsType SaHpiUint32Type #define SaHpiDimiTestServiceImpactType SaHpiUint32Type #define SaHpiDimiTestCapabilityType SaHpiUint32Type #define SaHpiDimiTestServiceImpactType SaHpiUint32Type #define SaHpiDimiTestParamTypeType SaHpiUint32Type #define SaHpiDimiReadyType SaHpiUint32Type #define SaHpiDimiTestPercentCompletedType SaHpiUint32Type #define SaHpiDimiTestRunStatusType SaHpiUint32Type #define SaHpiDimiTestErrCodeType SaHpiUint32Type extern cMarshalType SaHpiDimiInfoType; extern cMarshalType SaHpiDimiTestParameterValueUnionType; extern cMarshalType SaHpiDimiTestParamValue1Type; extern cMarshalType SaHpiDimiTestParamValue2Type; extern cMarshalType SaHpiDimiTestParamsDefinitionType; extern cMarshalType SaHpiDimiTestAffectedEntityType; extern cMarshalType SaHpiDimiTestType; extern cMarshalType SaHpiDimiTestResultsType; typedef struct { SaHpiUint8T NumberOfParams; SaHpiDimiTestVariableParamsT *ParamsList; } SaHpiDimiTestVariableParamsListT; extern cMarshalType SaHpiDimiTestVariableParamsType; extern cMarshalType SaHpiDimiTestVariableParamsListType; // FUMIs #define SaHpiFumiNumType SaHpiUint32Type #define SaHpiBankNumType SaHpiUint8Type #define SaHpiFumiProtocolType SaHpiUint32Type #define SaHpiFumiCapabilityType SaHpiUint32Type #define SaHpiFumiUpgradeStatusType SaHpiUint32Type #define SaHpiFumiSourceStatusType SaHpiUint32Type #define SaHpiFumiBankStateType SaHpiUint32Type #define SaHpiFumiSafDefinedSpecIdType SaHpiUint32Type #define SaHpiFumiSpecInfoTypeType SaHpiUint32Type #define SaHpiFumiServiceImpactType SaHpiUint32Type #define SaHpiFumiLogicalBankStateFlagsType SaHpiUint32Type extern cMarshalType SaHpiFumiSpecInfoType; extern cMarshalType SaHpiFumiServiceImpactDataType; extern cMarshalType SaHpiFumiSourceInfoType; extern cMarshalType SaHpiFumiBankInfoType; extern cMarshalType SaHpiFumiLogicalBankInfoType; extern cMarshalType SaHpiFumiComponentInfoType; extern cMarshalType SaHpiFumiLogicalComponentInfoType; // resource data record #define SaHpiRdrTypeType SaHpiUint32Type extern cMarshalType SaHpiRdrType; // hot swap #define SaHpiHsIndicatorStateType SaHpiUint32Type #define SaHpiHsActionType SaHpiUint32Type #define SaHpiHsStateType SaHpiUint32Type // events part 2 #define SaHpiSeverityType SaHpiUint32Type #define SaHpiResourceEventTypeType SaHpiUint32Type extern cMarshalType SaHpiResourceEventType; #define SaHpiDomainEventTypeType SaHpiUint32Type extern cMarshalType SaHpiDomainEventType; #define SaHpiSensorOptionalDataType SaHpiUint8Type extern cMarshalType SaHpiSensorEventType; #define SaHpiSensorEnableOptDataType SaHpiUint8Type extern cMarshalType SaHpiSensorEnableChangeEventType; #define SaHpiHsCauseOfStateChangeType SaHpiUint32Type extern cMarshalType SaHpiHotSwapEventType; extern cMarshalType SaHpiWatchdogEventType; #define SaHpiSwEventTypeType SaHpiUint32Type extern cMarshalType SaHpiHpiSwEventType; extern cMarshalType SaHpiOemEventType; extern cMarshalType SaHpiUserEventType; #define SaHpiEventTypeType SaHpiUint32Type extern cMarshalType SaHpiEventType; #define SaHpiEvtQueueStatusType SaHpiUint32Type // param control #define SaHpiParmActionType SaHpiUint32Type // reset #define SaHpiResetActionType SaHpiUint32Type // power #define SaHpiPowerStateType SaHpiUint32Type // resource presence table extern cMarshalType SaHpiResourceInfoType; // resource capabilities #define SaHpiCapabilitiesType SaHpiUint32Type // resource hot swap capabilities #define SaHpiHsCapabilitiesType SaHpiUint32Type // rpt entry extern cMarshalType SaHpiRptEntryType; extern cMarshalType SaHpiLoadIdType; // domains #define SaHpiDomainCapabilitiesType SaHpiUint32Type extern cMarshalType SaHpiDomainInfoType; extern cMarshalType SaHpiDrtEntryType; #define SaHpiAlarmIdType SaHpiUint32Type extern cMarshalType SaHpiAlarmType; // system event log #define SaHpiSelOverflowActionType SaHpiUint32Type extern cMarshalType SaHpiEventLogInfoType; #define SaHpiEventLogEntryIdType SaHpiUint32Type extern cMarshalType SaHpiEventLogEntryType; //---------------------------------------------------------------------------- // The following support the oHpi dynamic configuration APIs //---------------------------------------------------------------------------- typedef struct { SaHpiUint8T Name[SAHPI_MAX_TEXT_BUFFER_LENGTH]; SaHpiUint8T Value[SAHPI_MAX_TEXT_BUFFER_LENGTH]; } oHpiHandlerConfigParamT; extern cMarshalType oHpiHandlerConfigParamType; typedef struct { SaHpiUint8T NumberOfParams; oHpiHandlerConfigParamT *Params; } oHpiHandlerConfigT; extern cMarshalType oHpiHandlerConfigType; // handler stuff #define oHpiHandlerIdType SaHpiUint32Type extern cMarshalType oHpiHandlerInfoType; #define oHpiGlobalParamTypeType SaHpiUint32Type extern cMarshalType oHpiGlobalParamType; #ifdef __cplusplus } #endif #endif openhpi-3.6.1/marshal/marshal.h0000644000175100017510000001626012575647264015431 0ustar mohanmohan/* * marshaling/demarshaling * * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * W. David Ashley * Anton Pak */ #ifndef dMarshal_h #define dMarshal_h #include #ifdef __cplusplus extern "C" { #endif // TODO use (u)int_xxx_t or SaHpi types instead typedef unsigned char tUint8; typedef unsigned short tUint16; typedef unsigned int tUint32; typedef unsigned long long tUint64; typedef char tInt8; typedef short tInt16; typedef int tInt32; typedef long long tInt64; typedef float tFloat32; typedef double tFloat64; typedef enum { eMtUnknown, eMtVoid, // do nothing eMtUint8, eMtUint16, eMtUint32, eMtUint64, eMtInt8, eMtInt16, eMtInt32, eMtInt64, eMtFloat32, eMtFloat64, eMtArray, eMtVarArray, eMtStruct, eMtStructElement, eMtUnion, eMtUnionElement, eMtUserDefined // user defined marshalling } tMarshalType; // NB // // VarArray can be used as a structure element only // The struct must have "number of elements" field before the VarArray field // // Union can be used as a structure element only // The struct must have "union modifier" field before the Union field // // helper macro for arrays #define dArray( name, nelements, element_type, element ) \ { \ .m_type = eMtArray, \ .m_name = name, \ .u.m_array = \ { \ .m_nelements = nelements, \ .m_element_sizeof = sizeof( element_type ), \ .m_element = &element \ } \ } // helper macro for var arrays #define dVarArray( name, nelements_idx, element_type, element ) \ { \ .m_type = eMtVarArray, \ .m_name = name, \ .u.m_var_array = \ { \ .m_nelements_idx = nelements_idx, \ .m_element_sizeof = sizeof( element_type ), \ .m_element = &element \ } \ } // helper marco for struct #define dStruct( elements ) \ { \ .m_type = eMtStruct, \ .m_name = #elements, \ .u.m_struct = \ { \ .m_elements = &elements[0] \ } \ } // helper marco for struct elements #define dStructElement( struct_type, field, element ) \ { \ .m_type = eMtStructElement, \ .m_name = #field, \ .u.m_struct_element = \ { \ .m_offset = offsetof( struct_type, field ), \ .m_element = &element \ } \ } // helper marco for struct end #define dStructElementEnd() \ { \ .m_type = eMtUnknown, \ .m_name = "" \ } // helper marco for unions #define dUnion( mod_idx, elements ) \ { \ .m_type = eMtUnion, \ .m_name = #elements, \ .u.m_union = \ { \ .m_mod_idx = mod_idx, \ .m_elements = &elements[0] \ } \ } // helper marco for union elements #define dUnionElement( mod, element ) \ { \ .m_type = eMtUnionElement, \ .m_name = #mod, \ .u.m_union_element = \ { \ .m_mod = mod, \ .m_element = &element \ } \ } // helper marco for union end #define dUnionElementEnd() \ { \ .m_type = eMtUnknown, \ .m_name = "" \ } // helper macro for user define mashaller #define dUserDefined( marshaller, demarshaller, user_data ) \ { \ .m_type = eMtUserDefined, \ .m_name = "user", \ .u.m_user_defined = \ { \ .m_marshaller = marshaller, \ .m_demarshaller = demarshaller, \ .m_user_data = user_data \ } \ } struct sMarshalType; typedef struct sMarshalType cMarshalType; typedef int (*tMarshalFunction)( const cMarshalType *type, const void *data, void *buffer, void *user_data ); typedef int (*tDemarshalFunction)( int byte_order, const cMarshalType *type, void *data, const void *buffer, void *user_data ); struct sMarshalType { tMarshalType m_type; const char * m_name; union { struct { size_t m_nelements; size_t m_element_sizeof; cMarshalType *m_element; } m_array; struct { size_t m_nelements_idx; // nelements field ids in parent struct size_t m_element_sizeof; cMarshalType *m_element; } m_var_array; struct { cMarshalType *m_elements; } m_struct; struct { size_t m_offset; // element offset in parent struct cMarshalType *m_element; } m_struct_element; struct { size_t m_mod_idx; // mod field index in parent struct cMarshalType *m_elements; } m_union; struct { size_t m_mod; cMarshalType *m_element; } m_union_element; struct { tMarshalFunction m_marshaller; tDemarshalFunction m_demarshaller; void *m_user_data; } m_user_defined; } u; }; // some simple types extern cMarshalType Marshal_VoidType; extern cMarshalType Marshal_Uint8Type; extern cMarshalType Marshal_Uint16Type; extern cMarshalType Marshal_Uint32Type; extern cMarshalType Marshal_Uint64Type; extern cMarshalType Marshal_Int8Type; extern cMarshalType Marshal_Int16Type; extern cMarshalType Marshal_Int32Type; extern cMarshalType Marshal_Int64Type; extern cMarshalType Marshal_Float32Type; extern cMarshalType Marshal_Float64Type; // marshal data into buffer int Marshal( const cMarshalType *type, const void *data, void *buffer ); int MarshalArray( const cMarshalType **types, const void **data, void *buffer ); // demarshal buffer into data int Demarshal( int byte_order, const cMarshalType *type, void *data, const void *buffer ); int DemarshalArray( int byte_order, const cMarshalType **types, void **data, const void *buffer ); #ifdef __cplusplus } #endif #endif openhpi-3.6.1/marshal/Makefile.am0000644000175100017510000000215612575647264015664 0ustar mohanmohan# # Copyright (c) 2004 by FORCE Computers. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # # Authors: # Thomas Kanngieser # .NOTPARALLEL: SUBDIRS = t DIST_SUBDIRS = t MAINTAINERCLEANFILES = Makefile.in *~ AM_CPPFLAGS = -DG_LOG_DOMAIN=\"marshal\" EXTRA_DIST = Makefile.mingw32 version.rc AM_CPPFLAGS += @OPENHPI_INCLUDES@ # just to clear LIBS LIBS = # marshal and connection used by the daemon and client library lib_LTLIBRARIES = libopenhpimarshal.la libopenhpimarshal_la_SOURCES = \ marshal_hpi.c \ marshal_hpi.h \ marshal_hpi_types.c \ marshal_hpi_types.h \ marshal.c \ marshal.h # we need glib-2.0 for gmalloc libopenhpimarshal_la_LDFLAGS = -version-info @HPI_LIB_VERSION@ libopenhpimarshal_la_LIBADD = @GLIB_ONLY_LIBS@ clean-local: rm -f *~ core core.* openhpi-3.6.1/marshal/Makefile.mingw320000644000175100017510000000104012575647263016543 0ustar mohanmohaninclude ../Makefile.mingw32.def TARGET := libopenhpimarshal.dll SRC := marshal.c \ marshal_hpi.c \ marshal_hpi_types.c \ version.rc OBJ := $(patsubst %.rc, %.o, $(patsubst %.c, %.o, ${SRC})) DEFS := -DG_LOG_DOMAIN=\"marshal\" INCLUDES := ${GLIB_INCLUDES} -I ../mingw32 -I ../include -I ../utils LIBS := ${GLIB_LIBS} CPPFLAGS += ${DEFS} ${INCLUDES} .PHONY: all clean .SUFFIXES: .rc all : ${TARGET} ${TARGET} : ${OBJ} ${CC} -shared -o $@ $^ ${LIBS} .rc.o: ${RC} ${RCFLAGS} $< $@ clean: rm -f ${OBJ} ${TARGET} openhpi-3.6.1/marshal/marshal.c0000644000175100017510000004164112575647264015425 0ustar mohanmohan/* * marshaling/demarshaling * * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * W. David Ashley * Anton Pak */ #include #include #include #include #include #include #include #include "marshal.h" cMarshalType Marshal_VoidType = { .m_type = eMtVoid, .m_name = "Void" }; cMarshalType Marshal_Uint8Type = { .m_type = eMtUint8, .m_name = "Uint8" }; cMarshalType Marshal_Uint16Type = { .m_type = eMtUint16, .m_name = "Uint16" }; cMarshalType Marshal_Uint32Type = { .m_type = eMtUint32, .m_name = "Uint32" }; cMarshalType Marshal_Uint64Type = { .m_type = eMtUint64, .m_name = "Uint64" }; cMarshalType Marshal_Int8Type = { .m_type = eMtInt8, .m_name = "Int8" }; cMarshalType Marshal_Int16Type = { .m_type = eMtInt16, .m_name = "Int16" }; cMarshalType Marshal_Int32Type = { .m_type = eMtInt32, .m_name = "Int32" }; cMarshalType Marshal_Int64Type = { .m_type = eMtInt64, .m_name = "Int64" }; cMarshalType Marshal_Float32Type = { .m_type = eMtFloat32, .m_name = "Float32" }; cMarshalType Marshal_Float64Type = { .m_type = eMtFloat64, .m_name = "Float64" }; static gboolean IsSimpleType( tMarshalType type ) { switch( type ) { case eMtVoid: case eMtInt8: case eMtUint8: case eMtInt16: case eMtUint16: case eMtInt32: case eMtUint32: case eMtInt64: case eMtUint64: case eMtFloat32: case eMtFloat64: return TRUE; case eMtArray: case eMtVarArray: case eMtStruct: case eMtStructElement: case eMtUnion: case eMtUnionElement: case eMtUserDefined: return FALSE; default: CRIT( "Unknown marshal type %d!", type ); return FALSE; } } static int MarshalSimpleType( tMarshalType type, const void *data, void *buffer ) { switch( type ) { case eMtVoid: return 0; case eMtInt8: memcpy(buffer, data, sizeof(tInt8)); return sizeof(tInt8); case eMtUint8: memcpy(buffer, data, sizeof(tUint8)); return sizeof(tUint8); case eMtInt16: memcpy(buffer, data, sizeof(tInt16)); return sizeof(tInt16); case eMtUint16: memcpy(buffer, data, sizeof(tUint16)); return sizeof(tUint16); case eMtInt32: memcpy(buffer, data, sizeof(tInt32)); return sizeof(tInt32); case eMtUint32: memcpy(buffer, data, sizeof(tUint32)); return sizeof(tUint32); case eMtInt64: memcpy(buffer, data, sizeof(tInt64)); return sizeof(tInt64); case eMtUint64: memcpy(buffer, data, sizeof(tUint64)); return sizeof(tUint64); case eMtFloat32: memcpy(buffer, data, sizeof(tFloat32)); return sizeof(tFloat32); case eMtFloat64: memcpy(buffer, data, sizeof(tFloat64)); return sizeof(tFloat64); default: CRIT( "Unknown marshal type %d!", type ); return -ENOSYS; } } /*********************************************************** * Gets value of integer structure element * @type - marshal type of the structure * @idx - element index in the structure * @data - raw pointer to the structure data * * structure element shall be of * eMtUint{8,16,32} and eMtInt{8,16,32} type * * returns obtained integer value (casted to size_t) * or * returns SIZE_MAX * * NB * function does NOT check for * - type is valid pointer * - type is pointer to marshal type for a structure * - idx is valid for the type * - data is valid pointer ***********************************************************/ static size_t GetStructElementIntegerValue( const cMarshalType *type, size_t idx, const void * data ) { const cMarshalType *elems = &type->u.m_struct.m_elements[0]; const cMarshalType *elem = elems[idx].u.m_struct_element.m_element; const size_t offset = elems[idx].u.m_struct_element.m_offset; union { const void *raw; const tInt8 *i8; const tUint8 *ui8; const tInt16 *i16; const tUint16 *ui16; const tInt32 *i32; const tUint32 *ui32; const tInt64 *i64; const tUint64 *ui64; } u; u.raw = (const unsigned char *)data + offset; switch( elem->m_type ) { case eMtInt8: return (size_t)(*u.i8); case eMtUint8: return (size_t)(*u.ui8); case eMtInt16: return (size_t)(*u.i16); case eMtUint16: return (size_t)(*u.ui16); case eMtInt32: return (size_t)(*u.i32); case eMtUint32: return (size_t)(*u.ui32); case eMtInt64: return (size_t)(*u.i64); case eMtUint64: return (size_t)(*u.ui64); default: CRIT( "GetStructElementIntegerValue: Unsupported type %d!", elem->m_type ); return SIZE_MAX; } } /*********************************************************** * Gets marshal type for union element specified by modifier * @type - marshal type of the union * @modifier - modifier value * * returns union element or 0 * * NB * function does NOT check for * - type is valid pointer * - type is pointer to marshal type for a union ***********************************************************/ static const cMarshalType * GetUnionElement( const cMarshalType *type, size_t modifier ) { const cMarshalType *elems = &type->u.m_union.m_elements[0]; size_t i; for( i = 0; elems[i].m_type == eMtUnionElement; i++ ) { const size_t mod = elems[i].u.m_union_element.m_mod; if ( mod == modifier ) { const cMarshalType *elem = elems[i].u.m_union_element.m_element; return elem; } } return 0; } int Marshal( const cMarshalType *type, const void *d, void *b ) { if ( IsSimpleType( type->m_type ) ) { return MarshalSimpleType( type->m_type, d, b ); } int size = 0; const unsigned char *data = d; unsigned char *buffer = b; switch( type->m_type ) { case eMtArray: { const size_t nelems = type->u.m_array.m_nelements; size_t i; for( i = 0; i < nelems; i++ ) { const cMarshalType *elem = type->u.m_array.m_element; const size_t elem_sizeof = type->u.m_array.m_element_sizeof; int cc = Marshal( elem, data, buffer ); if ( cc < 0 ) { CRIT( "Marshal: %s[%zd]: failure, cc = %d!", type->m_name, i, cc ); return cc; } data += elem_sizeof; buffer += cc; size += cc; } } break; case eMtStruct: { const cMarshalType *elems = &type->u.m_struct.m_elements[0]; size_t i; for( i = 0; elems[i].m_type == eMtStructElement; i++ ) { const cMarshalType *elem = elems[i].u.m_struct_element.m_element; const size_t offset = elems[i].u.m_struct_element.m_offset; int cc = 0; if ( elem->m_type == eMtUnion ) { const size_t mod2_idx = elem->u.m_union.m_mod_idx; const size_t mod2 = GetStructElementIntegerValue( type, mod2_idx, data ); const cMarshalType *elem2 = GetUnionElement( elem, mod2 ); if ( !elem2 ) { CRIT( "Marshal: %s:%s: invalid mod value %u!", type->m_name, elems[i].m_name, (unsigned int)mod2 ); return -EINVAL; } cc = Marshal( elem2, data + offset, buffer ); if ( cc < 0 ) { CRIT( "Marshal: %s:%s, mod %u: failure, cc = %d!", type->m_name, elems[i].m_name, (unsigned int)mod2, cc ); return -EINVAL; } } else if ( elem->m_type == eMtVarArray ) { const size_t nelems2_idx = elem->u.m_var_array.m_nelements_idx; const cMarshalType *elem2 = elem->u.m_var_array.m_element; const size_t elem2_sizeof = elem->u.m_var_array.m_element_sizeof; const size_t nelems2 = GetStructElementIntegerValue( type, nelems2_idx, data ); // (data + offset ) points to pointer to var array content const unsigned char *data2; memcpy(&data2, data + offset, sizeof(void *)); unsigned char *buffer2 = buffer; size_t i2; for( i2 = 0; i2 < nelems2; i2++ ) { int cc2 = Marshal( elem2, data2, buffer2 ); if ( cc2 < 0 ) { CRIT( "Marshal: %s:%s[%zd]: failure, cc = %d!", type->m_name, elems[i].m_name, i2, cc2 ); return cc2; } data2 += elem2_sizeof; buffer2 += cc2; cc += cc2; } } else { cc = Marshal( elem, data + offset, buffer ); if ( cc < 0 ) { CRIT( "Marshal: %s:%s: failure, cc = %d!", type->m_name, elems[i].m_name, cc ); return cc; } } buffer += cc; size += cc; } } break; case eMtUserDefined: { tMarshalFunction marshaller = type->u.m_user_defined.m_marshaller; void * user_data = type->u.m_user_defined.m_user_data; size = marshaller ? marshaller( type, d, b, user_data ) : 0; } break; default: return -ENOSYS; } return size; } int MarshalArray( const cMarshalType **types, const void **data, void *b ) { int size = 0; unsigned char *buffer = b; int i; for( i = 0; types[i]; i++ ) { int cc = Marshal( types[i], data[i], buffer ); if ( cc < 0 ) { CRIT( "MarshalArray[%d]: %s: failure, cc = %d!", i, types[i]->m_name, cc ); return cc; } size += cc; buffer += cc; } return size; } static int DemarshalSimpleTypes( int byte_order, tMarshalType type, void *data, const void *buffer ) { union { tInt16 i16; tUint16 ui16; tInt32 i32; tUint32 ui32; tInt64 i64; tUint64 ui64; tFloat32 f32; tFloat64 f64; } u; // NB Glib does not provide SWAP_LE_BE macro for signed types! switch( type ) { case eMtVoid: return 0; case eMtInt8: memcpy(data, buffer, sizeof(tInt8)); return sizeof(tInt8); case eMtUint8: memcpy(data, buffer, sizeof(tUint8)); return sizeof(tUint8); case eMtInt16: memcpy(&u.i16, buffer, sizeof(tInt16)); if ( G_BYTE_ORDER != byte_order ) { u.ui16 = GUINT16_SWAP_LE_BE( u.ui16 ); } memcpy(data, &u.i16, sizeof(tInt16)); return sizeof(tInt16); case eMtUint16: memcpy(&u.ui16, buffer, sizeof(tUint16)); if ( G_BYTE_ORDER != byte_order ) { u.ui16 = GUINT16_SWAP_LE_BE( u.ui16 ); } memcpy(data, &u.ui16, sizeof(tUint16)); return sizeof(tUint16); case eMtInt32: memcpy(&u.i32, buffer, sizeof(tInt32)); if ( G_BYTE_ORDER != byte_order ) { u.ui32 = GUINT32_SWAP_LE_BE( u.ui32 ); } memcpy(data, &u.i32, sizeof(tInt32)); return sizeof(tInt32); case eMtUint32: memcpy(&u.ui32, buffer, sizeof(tUint32)); if ( G_BYTE_ORDER != byte_order ) { u.ui32 = GUINT32_SWAP_LE_BE( u.ui32 ); } memcpy(data, &u.ui32, sizeof(tUint32)); return sizeof(tUint32); case eMtInt64: memcpy(&u.i64, buffer, sizeof(tInt64)); if ( G_BYTE_ORDER != byte_order ) { u.ui64 = GUINT64_SWAP_LE_BE( u.ui64 ); } memcpy(data, &u.i64, sizeof(tInt64)); return sizeof(tInt64); case eMtUint64: memcpy(&u.ui64, buffer, sizeof(tUint64)); if ( G_BYTE_ORDER != byte_order ) { u.ui64 = GUINT64_SWAP_LE_BE( u.ui64 ); } memcpy(data, &u.ui64, sizeof(tUint64)); return sizeof(tUint64); case eMtFloat32: memcpy(&u.f32, buffer, sizeof(tFloat32)); if ( G_BYTE_ORDER != byte_order ) { u.ui32 = GUINT32_SWAP_LE_BE( u.ui32 ); } memcpy(data, &u.f32, sizeof(tFloat32)); return sizeof(tFloat32); case eMtFloat64: memcpy(&u.f64, buffer, sizeof(tFloat64)); if ( G_BYTE_ORDER != byte_order ) { u.ui64 = GUINT64_SWAP_LE_BE( u.ui64 ); } memcpy(data, &u.f64, sizeof(tFloat64)); return sizeof(tFloat64); default: CRIT( "Unknown marshal type %d!", type ); return -ENOSYS; } } int Demarshal( int byte_order, const cMarshalType *type, void *d, const void *b ) { if ( IsSimpleType( type->m_type ) ) { return DemarshalSimpleTypes( byte_order, type->m_type, d, b ); } int size = 0; unsigned char *data = d; const unsigned char *buffer = b; switch( type->m_type ) { case eMtArray: { const size_t nelems = type->u.m_array.m_nelements; size_t i; for( i = 0; i < nelems; i++ ) { const cMarshalType *elem = type->u.m_array.m_element; const size_t elem_sizeof = type->u.m_array.m_element_sizeof; int cc = Demarshal( byte_order, elem, data, buffer ); if ( cc < 0 ) { CRIT( "Demarshal: %s[%zd]: failure, cc = %d!", type->m_name, i, cc ); return cc; } data += elem_sizeof; buffer += cc; size += cc; } } break; case eMtStruct: { const cMarshalType *elems = &type->u.m_struct.m_elements[0]; size_t i; for( i = 0; elems[i].m_type == eMtStructElement; i++ ) { const cMarshalType *elem = elems[i].u.m_struct_element.m_element; const size_t offset = elems[i].u.m_struct_element.m_offset; int cc = 0; if ( elem->m_type == eMtUnion ) { const size_t mod2_idx = elem->u.m_union.m_mod_idx; if ( mod2_idx >= i ) { // NB: this is a limitation of demarshaling of unions CRIT( "Demarshal: %s:%s: mod field must be before union!", type->m_name, elems[i].m_name ); return -EINVAL; } const size_t mod2 = GetStructElementIntegerValue( type, mod2_idx, data ); const cMarshalType *elem2 = GetUnionElement( elem, mod2 ); if ( !elem2 ) { CRIT( "Demarshal: %s:%s: invalid mod value %u!", type->m_name, elems[i].m_name, (unsigned int)mod2 ); return -EINVAL; } cc = Demarshal( byte_order, elem2, data + offset, buffer ); if ( cc < 0 ) { CRIT( "Demarshal: %s:%s, mod %u: failure, cc = %d!", type->m_name, elems[i].m_name, (unsigned int)mod2, cc ); return cc; } } else if ( elem->m_type == eMtVarArray ) { const size_t nelems2_idx = elem->u.m_var_array.m_nelements_idx; const cMarshalType *elem2 = elem->u.m_var_array.m_element; const size_t elem2_sizeof = elem->u.m_var_array.m_element_sizeof; if ( nelems2_idx >= i ) { // NB: this is a limitation of demarshaling of var arrays CRIT( "Demarshal: %s:%s: nelements field must be before vararray!", type->m_name, elems[i].m_name ); return -EINVAL; } const size_t nelems2 = GetStructElementIntegerValue( type, nelems2_idx, data ); // allocate storage for var array content unsigned char *data2 = g_new0(unsigned char, nelems2 * elem2_sizeof ); // (data + offset ) points to pointer to var array content memcpy(data + offset, &data2, sizeof(void *)); const unsigned char *buffer2 = buffer; size_t i2; for( i2 = 0; i2 < nelems2; i2++ ) { int cc2 = Demarshal( byte_order, elem2, data2, buffer2 ); if ( cc2 < 0 ) { CRIT( "Demarshal: %s:%s[%zd]: failure, cc = %d!", type->m_name, elems[i].m_name, i2, cc2 ); return cc2; } data2 += elem2_sizeof; buffer2 += cc2; cc += cc2; } } else { cc = Demarshal( byte_order, elem, data + offset, buffer ); if ( cc < 0 ) { CRIT( "Demarshal: %s:%s: failure, cc = %d!", type->m_name, elems[i].m_name, cc ); return cc; } } buffer += cc; size += cc; } } break; case eMtUserDefined: { tDemarshalFunction demarshaller = type->u.m_user_defined.m_demarshaller; void * user_data = type->u.m_user_defined.m_user_data; size = demarshaller ? demarshaller( byte_order, type, d, b, user_data ) : 0; } break; default: return -ENOSYS; } return size; } int DemarshalArray( int byte_order, const cMarshalType **types, void **data, const void *b ) { int size = 0; const unsigned char *buffer = b; int i; for( i = 0; types[i]; i++ ) { int cc = Demarshal( byte_order, types[i], data[i], buffer ); if ( cc < 0 ) { CRIT( "DemarshalArray[%d]: %s: failure, cc = %d!", i, types[i]->m_name, cc ); return cc; } size += cc; buffer += cc; } return size; } openhpi-3.6.1/marshal/t/0000755000175100017510000000000012605014447014050 5ustar mohanmohanopenhpi-3.6.1/marshal/t/marshal_hpi_types_002.c0000644000175100017510000000630012575647264020326 0ustar mohanmohan/* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include "marshal_hpi_types.h" #include #include #include static int cmp_entities( SaHpiEntityT *d1, SaHpiEntityT *d2 ) { if ( d1->EntityType != d2->EntityType ) return 0; if ( d1->EntityLocation != d2->EntityLocation ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiEntityPathT m_v1; tUint8 m_pad2; SaHpiEntityPathT m_v2; SaHpiEntityPathT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiEntityPathType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiEntityPathType ), dStructElement( cTest, m_v3 , SaHpiEntityPathType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.Entry[0].EntityType = SAHPI_ENT_SYSTEM_BOARD, .m_v1.Entry[0].EntityLocation = 1, .m_v1.Entry[1].EntityType = SAHPI_ENT_BATTERY, .m_v1.Entry[1].EntityLocation = 2, .m_pad2 = 48, .m_v2.Entry[0].EntityType = SAHPI_ENT_POWER_MODULE, .m_v2.Entry[0].EntityLocation = 2, .m_v2.Entry[1].EntityType = SAHPI_ENT_SYSTEM_BUS, .m_v2.Entry[1].EntityLocation = 3, .m_v3.Entry[0].EntityType = SAHPI_ENT_SWITCH, .m_v3.Entry[0].EntityLocation = 3, .m_v3.Entry[1].EntityType = SAHPI_ENT_SYSTEM_BLADE, .m_v3.Entry[1].EntityLocation = 4, .m_v3.Entry[2].EntityType = SAHPI_ENT_RACK_MOUNTED_SERVER, .m_v3.Entry[2].EntityLocation = 5, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_entities( &value.m_v1.Entry[0], &result.m_v1.Entry[0] ) ) return 1; if ( !cmp_entities( &value.m_v1.Entry[1], &result.m_v1.Entry[1] ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_entities( &value.m_v2.Entry[0], &result.m_v2.Entry[0] ) ) return 1; if ( !cmp_entities( &value.m_v2.Entry[1], &result.m_v2.Entry[1] ) ) return 1; if ( !cmp_entities( &value.m_v3.Entry[0], &result.m_v3.Entry[0] ) ) return 1; if ( !cmp_entities( &value.m_v3.Entry[1], &result.m_v3.Entry[1] ) ) return 1; if ( !cmp_entities( &value.m_v3.Entry[2], &result.m_v3.Entry[2] ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_hpi_types_045.c0000644000175100017510000000534212575647263020341 0ustar mohanmohan/* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include "marshal_hpi_types.h" #include #include #include static int cmp_drtentry( SaHpiDrtEntryT *d1, SaHpiDrtEntryT *d2 ) { if ( d1->EntryId != d2->EntryId ) return 0; if ( d1->DomainId != d2->DomainId ) return 0; if ( d1->IsPeer != d2->IsPeer ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiDrtEntryT m_v1; tUint8 m_pad2; SaHpiDrtEntryT m_v2; SaHpiDrtEntryT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiDrtEntryType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiDrtEntryType ), dStructElement( cTest, m_v3 , SaHpiDrtEntryType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.EntryId = 1, .m_v1.DomainId = 1, .m_v1.IsPeer = TRUE, .m_pad2 = 48, .m_v2.EntryId = 2, .m_v2.DomainId = 2, .m_v2.IsPeer = TRUE, .m_v3.EntryId = 3, .m_v3.DomainId = 3, .m_v3.IsPeer = FALSE, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_drtentry( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_drtentry( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_drtentry( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_hpi_types_012.c0000644000175100017510000000462012575647263020331 0ustar mohanmohan/* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include "marshal_hpi_types.h" #include #include #include static int cmp_ctrlstate( SaHpiCtrlStateT *d1, SaHpiCtrlStateT *d2 ) { if ( d1->Type != d2->Type ) return 0; if ( d1->StateUnion.Discrete != d2->StateUnion.Discrete ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiCtrlStateT m_v1; tUint8 m_pad2; SaHpiCtrlStateT m_v2; SaHpiCtrlStateT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiCtrlStateType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiCtrlStateType ), dStructElement( cTest, m_v3 , SaHpiCtrlStateType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.Type = SAHPI_CTRL_TYPE_DISCRETE, .m_v1.StateUnion.Discrete = 1, .m_pad2 = 48, .m_v1.Type = SAHPI_CTRL_TYPE_DISCRETE, .m_v1.StateUnion.Discrete = 2, .m_v1.Type = SAHPI_CTRL_TYPE_DISCRETE, .m_v1.StateUnion.Discrete = 16, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_ctrlstate( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_ctrlstate( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_ctrlstate( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_029.c0000644000175100017510000000712612575647263016261 0ustar mohanmohan/* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include #include "marshal.h" #include #define dArraySize 12 typedef struct { tUint8 m_u8; tUint16 m_u16; tUint32 m_u32; tInt8 m_i8; tInt16 m_i16; tInt32 m_i32; tFloat32 m_f32; tFloat64 m_f64; tInt8 m_array[dArraySize]; } cTest1; cMarshalType ArrayType = dArray("ArrayType", dArraySize, tInt8, Marshal_Int8Type ); cMarshalType Test1Elements[] = { dStructElement( cTest1, m_u8 , Marshal_Uint8Type ), dStructElement( cTest1, m_u16, Marshal_Uint16Type ), dStructElement( cTest1, m_u16, Marshal_Uint16Type ), dStructElement( cTest1, m_u32, Marshal_Uint32Type ), dStructElement( cTest1, m_i8, Marshal_Int8Type ), dStructElement( cTest1, m_i16, Marshal_Int16Type ), dStructElement( cTest1, m_i32, Marshal_Int32Type ), dStructElement( cTest1, m_f32, Marshal_Float32Type ), dStructElement( cTest1, m_f64, Marshal_Float64Type ), dStructElement( cTest1, m_array, ArrayType ), dStructElementEnd() }; cMarshalType Test1Type = dStruct( Test1Elements ); typedef struct { tUint16 m_u16; tUint8 m_u8; tUint64 m_u64; tInt64 m_i64; } cTest2; cMarshalType Test2Elements[] = { dStructElement( cTest2, m_u16, Marshal_Uint16Type ), dStructElement( cTest2, m_u8 , Marshal_Uint8Type ), dStructElement( cTest2, m_u64, Marshal_Uint64Type ), dStructElement( cTest2, m_i64, Marshal_Int64Type ), dStructElementEnd() }; cMarshalType Test2Type = dStruct( Test2Elements ); int main( int argc, char *argv[] ) { cTest1 value1 = { .m_u8 = 0x42, .m_u16 = 0x1234, .m_u32 = 0x12345678, .m_i8 = -48, .m_i16 = -12345, .m_i32 = -12345667, .m_f32 = 0.123456, .m_f64 = -12345.345566, .m_array = "hui jui" }; cTest2 value2 = { .m_u16 = 0x4434, .m_u8 = 0x47, .m_u64 = 0x1234567812345678LL, .m_i64 = 0x8765432187654321LL, }; unsigned char buffer[1024]; cTest1 result1; cTest2 result2; const cMarshalType *type_array[] = { &Test1Type, &Test2Type, 0 }; const void *value_array[] = { &value1, &value2 }; void *result_array[] = { &result1, &result2 }; unsigned int s1 = MarshalArray( type_array, value_array, buffer ); unsigned int s2 = DemarshalArray( G_BYTE_ORDER, type_array, result_array, buffer ); if ( s1 != s2 ) return 1; if ( value1.m_u8 != result1.m_u8 ) return 1; if ( value1.m_u16 != result1.m_u16 ) return 1; if ( value1.m_u32 != result1.m_u32 ) return 1; if ( value1.m_i8 != result1.m_i8 ) return 1; if ( value1.m_i16 != result1.m_i16 ) return 1; if ( value1.m_i32 != result1.m_i32 ) return 1; if ( value1.m_f32 != result1.m_f32 ) return 1; if ( value1.m_f64 != result1.m_f64 ) return 1; if ( strcmp( value1.m_array, result1.m_array ) ) return 1; if ( value2.m_u8 != result2.m_u8 ) return 1; if ( value2.m_u16 != result2.m_u16 ) return 1; if ( value2.m_u64 != result2.m_u64 ) return 1; if ( value2.m_i64 != result2.m_i64 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_019.c0000644000175100017510000000522312575647264016255 0ustar mohanmohan/* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include #include "marshal.h" #include #define dModU8 0 #define dModU16 1 #define dModU32 2 #define dModU64 3 #define dModI8 4 #define dModI16 5 #define dModI32 6 #define dModI64 7 #define dModF32 8 #define dModF64 9 typedef union { tUint8 m_u8; tUint16 m_u16; tUint32 m_u32; tUint64 m_u64; tInt8 m_i8; tInt16 m_i16; tInt32 m_i32; tInt64 m_i64; tFloat32 m_f32; tFloat64 m_f64; } cUnion; typedef struct { tUint8 m_pad1; tUint8 m_mod; tUint8 m_pad2; cUnion m_union; tUint8 m_pad3; } cTest; cMarshalType UnionElements[] = { dUnionElement( dModU8 , Marshal_Uint8Type ), dUnionElement( dModU16, Marshal_Uint16Type ), dUnionElement( dModU32, Marshal_Uint32Type ), dUnionElement( dModU64, Marshal_Uint64Type ), dUnionElement( dModI8 , Marshal_Int8Type ), dUnionElement( dModI16, Marshal_Int16Type ), dUnionElement( dModI32, Marshal_Int32Type ), dUnionElement( dModI64, Marshal_Int64Type ), dUnionElement( dModF32, Marshal_Float32Type ), dUnionElement( dModF64, Marshal_Float64Type ), dUnionElementEnd() }; cMarshalType TestUnionType = dUnion( 1, UnionElements ); cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_mod , Marshal_Uint8Type ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_union, TestUnionType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_mod = dModU8, .m_pad2 = 48, .m_union.m_u8 = 11, .m_pad3 = 49 }; unsigned char buffer[256]; cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( value.m_mod != result.m_mod ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; if ( value.m_union.m_u8 != result.m_union.m_u8 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_021.c0000644000175100017510000000523712575647263016252 0ustar mohanmohan/* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include #include "marshal.h" #include #define dModU8 0 #define dModU16 1 #define dModU32 2 #define dModU64 3 #define dModI8 4 #define dModI16 5 #define dModI32 6 #define dModI64 7 #define dModF32 8 #define dModF64 9 typedef union { tUint8 m_u8; tUint16 m_u16; tUint32 m_u32; tUint64 m_u64; tInt8 m_i8; tInt16 m_i16; tInt32 m_i32; tInt64 m_i64; tFloat32 m_f32; tFloat64 m_f64; } cUnion; typedef struct { tUint8 m_pad1; tUint8 m_mod; tUint8 m_pad2; cUnion m_union; tUint8 m_pad3; } cTest; cMarshalType UnionElements[] = { dUnionElement( dModU8 , Marshal_Uint8Type ), dUnionElement( dModU16, Marshal_Uint16Type ), dUnionElement( dModU32, Marshal_Uint32Type ), dUnionElement( dModU64, Marshal_Uint64Type ), dUnionElement( dModI8 , Marshal_Int8Type ), dUnionElement( dModI16, Marshal_Int16Type ), dUnionElement( dModI32, Marshal_Int32Type ), dUnionElement( dModI64, Marshal_Int64Type ), dUnionElement( dModF32, Marshal_Float32Type ), dUnionElement( dModF64, Marshal_Float64Type ), dUnionElementEnd() }; cMarshalType TestUnionType = dUnion( 1, UnionElements ); cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_mod , Marshal_Uint8Type ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_union, TestUnionType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_mod = dModU32, .m_pad2 = 48, .m_union.m_u32 = 0xabcd1234, .m_pad3 = 49 }; unsigned char buffer[256]; cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( value.m_mod != result.m_mod ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; if ( value.m_union.m_u32 != result.m_union.m_u32 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_hpi_types_041.c0000644000175100017510000001024312575647263020331 0ustar mohanmohan/* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include "marshal_hpi_types.h" #include #include #include static int cmp_text_buffer( SaHpiTextBufferT *d1, SaHpiTextBufferT *d2 ) { if ( d1->DataType != d2->DataType ) return 0; if ( d1->Language != d2->Language ) return 0; if ( d1->DataLength != d2->DataLength ) return 0; return memcmp( d1->Data, d2->Data, d1->DataLength ) ? 0 : 1; } static int cmp_userevent( SaHpiUserEventT *d1, SaHpiUserEventT *d2 ) { if ( !cmp_text_buffer( &d1->UserEventData, &d2->UserEventData ) ) return 0; return 1; } static int cmp_event( SaHpiEventT *d1, SaHpiEventT *d2 ) { if ( d1->Source != d2->Source ) return 0; if ( d1->EventType != d2->EventType ) return 0; if ( d1->Timestamp != d2->Timestamp ) return 0; if ( !cmp_userevent( &d1->EventDataUnion.UserEvent, &d2->EventDataUnion.UserEvent ) ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiEventT m_v1; tUint8 m_pad2; SaHpiEventT m_v2; SaHpiEventT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiEventType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiEventType ), dStructElement( cTest, m_v3 , SaHpiEventType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.Source = 1, .m_v1.EventType = SAHPI_ET_USER, .m_v1.Timestamp = 1000, .m_v1.EventDataUnion.UserEvent.UserEventData.DataType = SAHPI_TL_TYPE_BINARY, .m_v1.EventDataUnion.UserEvent.UserEventData.Language = SAHPI_LANG_TSONGA, .m_v1.EventDataUnion.UserEvent.UserEventData.DataLength = 3, .m_v1.EventDataUnion.UserEvent.UserEventData.Data = "AB", .m_pad2 = 48, .m_v2.Source = 2, .m_v2.EventType = SAHPI_ET_USER, .m_v2.Timestamp = 1200, .m_v2.EventDataUnion.UserEvent.UserEventData.DataType = SAHPI_TL_TYPE_BCDPLUS, .m_v2.EventDataUnion.UserEvent.UserEventData.Language = SAHPI_LANG_SANGRO, .m_v2.EventDataUnion.UserEvent.UserEventData.DataLength = 21, .m_v2.EventDataUnion.UserEvent.UserEventData.Data = "12345678901234567890", .m_v3.Source = 3, .m_v3.EventType = SAHPI_ET_USER, .m_v3.Timestamp = 1030, .m_v3.EventDataUnion.UserEvent.UserEventData.DataType = SAHPI_TL_TYPE_ASCII6, .m_v3.EventDataUnion.UserEvent.UserEventData.Language = SAHPI_LANG_TAJIK, .m_v3.EventDataUnion.UserEvent.UserEventData.DataLength = 0, .m_v3.EventDataUnion.UserEvent.UserEventData.Data = "", .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_event( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_event( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_event( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_hpi_types_035.c0000644000175100017510000001022212575647263020331 0ustar mohanmohan/* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include "marshal_hpi_types.h" #include #include #include static int cmp_sensorenablechangeevent( SaHpiSensorEnableChangeEventT *d1, SaHpiSensorEnableChangeEventT *d2 ) { if ( d1->SensorNum != d2->SensorNum ) return 0; if ( d1->SensorType != d2->SensorType ) return 0; if ( d1->EventCategory != d2->EventCategory ) return 0; if ( d1->SensorEnable != d2->SensorEnable ) return 0; if ( d1->SensorEventEnable != d2->SensorEventEnable ) return 0; if ( d1->AssertEventMask != d2->AssertEventMask ) return 0; if ( d1->DeassertEventMask != d2->DeassertEventMask ) return 0; if ( d1->OptionalDataPresent != d2->OptionalDataPresent ) return 0; if ( d1->CurrentState != d2->CurrentState ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiSensorEnableChangeEventT m_v1; tUint8 m_pad2; SaHpiSensorEnableChangeEventT m_v2; SaHpiSensorEnableChangeEventT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiSensorEnableChangeEventType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiSensorEnableChangeEventType ), dStructElement( cTest, m_v3 , SaHpiSensorEnableChangeEventType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.SensorNum = 1, .m_v1.SensorType = SAHPI_TEMPERATURE, .m_v1.EventCategory = SAHPI_EC_THRESHOLD, .m_v1.SensorEnable = TRUE, .m_v1.SensorEventEnable = TRUE, .m_v1.AssertEventMask = 0, .m_v1.DeassertEventMask = 0, .m_v1.OptionalDataPresent = 1, .m_v1.CurrentState = SAHPI_ES_UPPER_MAJOR, .m_pad2 = 48, .m_v2.SensorNum = 2, .m_v2.SensorType = SAHPI_BATTERY, .m_v2.EventCategory = SAHPI_EC_THRESHOLD, .m_v2.SensorEnable = TRUE, .m_v2.SensorEventEnable = FALSE, .m_v2.AssertEventMask = 0, .m_v2.DeassertEventMask = 0, .m_v2.OptionalDataPresent = 1, .m_v2.CurrentState = SAHPI_ES_UPPER_MAJOR, .m_v3.SensorNum = 3, .m_v3.SensorType = SAHPI_VOLTAGE, .m_v3.EventCategory = SAHPI_EC_THRESHOLD, .m_v3.SensorEnable = FALSE, .m_v3.SensorEventEnable = TRUE, .m_v3.AssertEventMask = 1, .m_v3.DeassertEventMask = 1, .m_v3.OptionalDataPresent = 1, .m_v3.CurrentState = SAHPI_ES_UPPER_MAJOR, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_sensorenablechangeevent( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_sensorenablechangeevent( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_sensorenablechangeevent( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_hpi_types_006.c0000644000175100017510000002330112575647264020332 0ustar mohanmohan/* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include "marshal_hpi_types.h" #include #include #include static int cmp_sensorreading( SaHpiSensorReadingT *d1, SaHpiSensorReadingT *d2 ) { if ( d1->IsSupported != d2->IsSupported ) return 0; if ( d1->Type != d2->Type ) return 0; if ( d1->Value.SensorInt64 != d2->Value.SensorInt64 ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiSensorDataFormatT m_v1; tUint8 m_pad2; SaHpiSensorDataFormatT m_v2; SaHpiSensorDataFormatT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiSensorDataFormatType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiSensorDataFormatType ), dStructElement( cTest, m_v3 , SaHpiSensorDataFormatType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.IsSupported = TRUE, .m_v1.ReadingType = SAHPI_SENSOR_READING_TYPE_INT64, .m_v1.BaseUnits = SAHPI_SU_DEGREES_C, .m_v1.ModifierUnits = SAHPI_SU_DEGREES_C, .m_v1.ModifierUse = SAHPI_SMUU_NONE, .m_v1.Percentage = TRUE, .m_v1.Range.Flags = SAHPI_SRF_MIN | SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MIN | SAHPI_SRF_NORMAL_MAX | SAHPI_SRF_NOMINAL, .m_v1.Range.Max.IsSupported = TRUE, .m_v1.Range.Max.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v1.Range.Max.Value = {10}, .m_v1.Range.Min.IsSupported = TRUE, .m_v1.Range.Min.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v1.Range.Min.Value = {-10}, .m_v1.Range.Nominal.IsSupported = TRUE, .m_v1.Range.Nominal.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v1.Range.Nominal.Value = {0}, .m_v1.Range.NormalMax.IsSupported = TRUE, .m_v1.Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v1.Range.NormalMax.Value = {5}, .m_v1.Range.NormalMin.IsSupported = TRUE, .m_v1.Range.NormalMin.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v1.Range.NormalMin.Value = {-5}, .m_v1.AccuracyFactor = 0, .m_pad2 = 48, .m_v2.IsSupported = TRUE, .m_v2.ReadingType = SAHPI_SENSOR_READING_TYPE_INT64, .m_v2.BaseUnits = SAHPI_SU_DEGREES_F, .m_v2.ModifierUnits = SAHPI_SU_DEGREES_F, .m_v2.ModifierUse = SAHPI_SMUU_NONE, .m_v2.Percentage = FALSE, .m_v2.Range.Flags = SAHPI_SRF_MIN | SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MIN | SAHPI_SRF_NORMAL_MAX | SAHPI_SRF_NOMINAL, .m_v2.Range.Max.IsSupported = TRUE, .m_v2.Range.Max.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v2.Range.Max.Value = {10}, .m_v2.Range.Min.IsSupported = TRUE, .m_v2.Range.Min.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v2.Range.Min.Value = {-10}, .m_v2.Range.Nominal.IsSupported = TRUE, .m_v2.Range.Nominal.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v2.Range.Nominal.Value = {0}, .m_v2.Range.NormalMax.IsSupported = TRUE, .m_v2.Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v2.Range.NormalMax.Value = {5}, .m_v2.Range.NormalMin.IsSupported = TRUE, .m_v2.Range.NormalMin.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v2.Range.NormalMin.Value = {-5}, .m_v2.AccuracyFactor = 0, .m_v3.IsSupported = TRUE, .m_v3.ReadingType = SAHPI_SENSOR_READING_TYPE_INT64, .m_v3.BaseUnits = SAHPI_SU_DEGREES_F, .m_v3.ModifierUnits = SAHPI_SU_DEGREES_F, .m_v3.ModifierUse = SAHPI_SMUU_NONE, .m_v3.Percentage = FALSE, .m_v3.Range.Flags = SAHPI_SRF_MIN | SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MIN | SAHPI_SRF_NORMAL_MAX | SAHPI_SRF_NOMINAL, .m_v3.Range.Max.IsSupported = TRUE, .m_v3.Range.Max.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v3.Range.Max.Value = {10}, .m_v3.Range.Min.IsSupported = TRUE, .m_v3.Range.Min.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v3.Range.Min.Value = {-10}, .m_v3.Range.Nominal.IsSupported = TRUE, .m_v3.Range.Nominal.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v3.Range.Nominal.Value = {0}, .m_v3.Range.NormalMax.IsSupported = FALSE, .m_v3.Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v3.Range.NormalMax.Value = {5}, .m_v3.Range.NormalMin.IsSupported = FALSE, .m_v3.Range.NormalMin.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v3.Range.NormalMin.Value = {-5}, .m_v3.AccuracyFactor = 0, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( value.m_v1.IsSupported != result.m_v1.IsSupported ) return 1; if ( value.m_v1.ReadingType != result.m_v1.ReadingType ) return 1; if ( value.m_v1.BaseUnits != result.m_v1.BaseUnits ) return 1; if ( value.m_v1.ModifierUnits != result.m_v1.ModifierUnits ) return 1; if ( value.m_v1.ModifierUse != result.m_v1.ModifierUse ) return 1; if ( value.m_v1.Percentage != result.m_v1.Percentage ) return 1; if ( !cmp_sensorreading( &value.m_v1.Range.Max, &result.m_v1.Range.Max ) ) return 1; if ( !cmp_sensorreading( &value.m_v1.Range.Min, &result.m_v1.Range.Min ) ) return 1; if ( !cmp_sensorreading( &value.m_v1.Range.Nominal, &result.m_v1.Range.Nominal ) ) return 1; if ( !cmp_sensorreading( &value.m_v1.Range.NormalMax, &result.m_v1.Range.NormalMax ) ) return 1; if ( !cmp_sensorreading( &value.m_v1.Range.NormalMin, &result.m_v1.Range.NormalMin ) ) return 1; if ( value.m_v1.AccuracyFactor != result.m_v1.AccuracyFactor ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( value.m_v2.IsSupported != result.m_v2.IsSupported ) return 1; if ( value.m_v2.ReadingType != result.m_v2.ReadingType ) return 1; if ( value.m_v2.BaseUnits != result.m_v2.BaseUnits ) return 1; if ( value.m_v2.ModifierUnits != result.m_v2.ModifierUnits ) return 1; if ( value.m_v2.ModifierUse != result.m_v2.ModifierUse ) return 1; if ( value.m_v2.Percentage != result.m_v2.Percentage ) return 1; if ( !cmp_sensorreading( &value.m_v2.Range.Max, &result.m_v2.Range.Max ) ) return 1; if ( !cmp_sensorreading( &value.m_v2.Range.Min, &result.m_v2.Range.Min ) ) return 1; if ( !cmp_sensorreading( &value.m_v2.Range.Nominal, &result.m_v2.Range.Nominal ) ) return 1; if ( !cmp_sensorreading( &value.m_v2.Range.NormalMax, &result.m_v2.Range.NormalMax ) ) return 1; if ( !cmp_sensorreading( &value.m_v2.Range.NormalMin, &result.m_v2.Range.NormalMin ) ) return 1; if ( value.m_v2.AccuracyFactor != result.m_v2.AccuracyFactor ) return 1; if ( value.m_v3.IsSupported != result.m_v3.IsSupported ) return 1; if ( value.m_v3.ReadingType != result.m_v3.ReadingType ) return 1; if ( value.m_v3.BaseUnits != result.m_v3.BaseUnits ) return 1; if ( value.m_v3.ModifierUnits != result.m_v3.ModifierUnits ) return 1; if ( value.m_v3.ModifierUse != result.m_v3.ModifierUse ) return 1; if ( value.m_v3.Percentage != result.m_v3.Percentage ) return 1; if ( !cmp_sensorreading( &value.m_v3.Range.Max, &result.m_v3.Range.Max ) ) return 1; if ( !cmp_sensorreading( &value.m_v3.Range.Min, &result.m_v3.Range.Min ) ) return 1; if ( !cmp_sensorreading( &value.m_v3.Range.Nominal, &result.m_v3.Range.Nominal ) ) return 1; if ( !cmp_sensorreading( &value.m_v3.Range.NormalMax, &result.m_v3.Range.NormalMax ) ) return 1; if ( !cmp_sensorreading( &value.m_v3.Range.NormalMin, &result.m_v3.Range.NormalMin ) ) return 1; if ( value.m_v3.AccuracyFactor != result.m_v3.AccuracyFactor ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_023.c0000644000175100017510000000534112575647263016250 0ustar mohanmohan/* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include #include "marshal.h" #include #define dModU8 0xf001 #define dModU16 0xf002 #define dModU32 0xf003 #define dModU64 0xf004 #define dModI8 0xf005 #define dModI16 0xf006 #define dModI32 0xf007 #define dModI64 0xf008 #define dModF32 0xf009 #define dModF64 0xf010 typedef union { tUint8 m_u8; tUint16 m_u16; tUint32 m_u32; tUint64 m_u64; tInt8 m_i8; tInt16 m_i16; tInt32 m_i32; tInt64 m_i64; tFloat32 m_f32; tFloat64 m_f64; } cUnion; typedef struct { tUint8 m_pad1; tUint16 m_mod; tUint8 m_pad2; cUnion m_union; tUint8 m_pad3; } cTest; cMarshalType UnionElements[] = { dUnionElement( dModU8 , Marshal_Uint8Type ), dUnionElement( dModU16, Marshal_Uint16Type ), dUnionElement( dModU32, Marshal_Uint32Type ), dUnionElement( dModU64, Marshal_Uint64Type ), dUnionElement( dModI8 , Marshal_Int8Type ), dUnionElement( dModI16, Marshal_Int16Type ), dUnionElement( dModI32, Marshal_Int32Type ), dUnionElement( dModI64, Marshal_Int64Type ), dUnionElement( dModF32, Marshal_Float32Type ), dUnionElement( dModF64, Marshal_Float64Type ), dUnionElementEnd() }; cMarshalType TestUnionType = dUnion( 1, UnionElements ); cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_mod , Marshal_Uint16Type ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_union, TestUnionType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_mod = dModU64, .m_pad2 = 48, .m_union.m_u64 = 0xabcd123456780123LL, .m_pad3 = 49 }; unsigned char buffer[256]; cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( value.m_mod != result.m_mod ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; if ( value.m_union.m_u64 != result.m_union.m_u64 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_hpi_types_018.c0000644000175100017510000000631112575647263020336 0ustar mohanmohan/* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include "marshal_hpi_types.h" #include #include #include static int cmp_ctrlstateoem( SaHpiCtrlStateOemT *d1, SaHpiCtrlStateOemT *d2 ) { if ( d1->MId != d2->MId ) return 0; if ( d1->BodyLength != d2->BodyLength ) return 0; if ( memcmp(d1->Body, d2->Body, SAHPI_CTRL_MAX_OEM_BODY_LENGTH) != 0 ) return 0; return 1; } static int cmp_ctrlrecoem( SaHpiCtrlRecOemT *d1, SaHpiCtrlRecOemT *d2 ) { if ( d1->MId != d2->MId ) return 0; if ( memcmp(d1->ConfigData, d2->ConfigData, SAHPI_CTRL_OEM_CONFIG_LENGTH) != 0 ) return 0; if ( !cmp_ctrlstateoem( &d1->Default, &d2->Default ) ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiCtrlRecOemT m_v1; tUint8 m_pad2; SaHpiCtrlRecOemT m_v2; SaHpiCtrlRecOemT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiCtrlRecOemType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiCtrlRecOemType ), dStructElement( cTest, m_v3 , SaHpiCtrlRecOemType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.MId = 0, .m_v1.ConfigData = {'A', 'B', 'c', 'd'}, .m_v1.Default.MId = 0, .m_v1.Default.BodyLength = 4, .m_v1.Default.Body = {'A', 'B', 'c', 'd'}, .m_pad2 = 48, .m_v2.MId = 0, .m_v2.ConfigData = {'d', 'c', 'B', 'A'}, .m_v2.Default.MId = 1, .m_v2.Default.BodyLength = 4, .m_v2.Default.Body = {'d', 'c', 'B', 'A'}, .m_v3.MId = 0, .m_v3.ConfigData = {'A'}, .m_v3.Default.MId = 1, .m_v3.Default.BodyLength = 1, .m_v3.Default.Body = {'A'}, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_ctrlrecoem( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_ctrlrecoem( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_ctrlrecoem( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_hpi_types_005.c0000644000175100017510000001556712575647263020347 0ustar mohanmohan/* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include "marshal_hpi_types.h" #include #include #include static int cmp_sensorreading( SaHpiSensorReadingT *d1, SaHpiSensorReadingT *d2 ) { if ( d1->IsSupported != d2->IsSupported ) return 0; if ( d1->Type != d2->Type ) return 0; if ( d1->Value.SensorInt64 != d2->Value.SensorInt64 ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiSensorRangeT m_v1; tUint8 m_pad2; SaHpiSensorRangeT m_v2; SaHpiSensorRangeT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiSensorRangeType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiSensorRangeType ), dStructElement( cTest, m_v3 , SaHpiSensorRangeType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.Flags = SAHPI_SRF_MIN | SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MIN | SAHPI_SRF_NORMAL_MAX | SAHPI_SRF_NOMINAL, .m_v1.Max.IsSupported = TRUE, .m_v1.Max.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v1.Max.Value = {21}, .m_v1.Min.IsSupported = TRUE, .m_v1.Min.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v1.Min.Value = {-21}, .m_v1.Nominal.IsSupported = TRUE, .m_v1.Nominal.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v1.Nominal.Value = {0}, .m_v1.NormalMax.IsSupported = TRUE, .m_v1.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v1.NormalMax.Value = {5}, .m_v1.NormalMin.IsSupported = TRUE, .m_v1.NormalMin.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v1.NormalMin.Value = {-5}, .m_pad2 = 48, .m_v2.Flags = SAHPI_SRF_MIN | SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MIN | SAHPI_SRF_NORMAL_MAX | SAHPI_SRF_NOMINAL, .m_v2.Max.IsSupported = TRUE, .m_v2.Max.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v2.Max.Value = {10}, .m_v2.Min.IsSupported = TRUE, .m_v2.Min.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v2.Min.Value = {-10}, .m_v2.Nominal.IsSupported = TRUE, .m_v2.Nominal.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v2.Nominal.Value = {0}, .m_v2.NormalMax.IsSupported = TRUE, .m_v2.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v2.NormalMax.Value = {5}, .m_v2.NormalMin.IsSupported = TRUE, .m_v2.NormalMin.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v2.NormalMin.Value = {-5}, .m_v3.Flags = SAHPI_SRF_MIN | SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MIN | SAHPI_SRF_NORMAL_MAX | SAHPI_SRF_NOMINAL, .m_v3.Max.IsSupported = TRUE, .m_v3.Max.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v3.Max.Value = {10}, .m_v3.Min.IsSupported = TRUE, .m_v3.Min.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v3.Min.Value = {-10}, .m_v3.Nominal.IsSupported = TRUE, .m_v3.Nominal.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v3.Nominal.Value = {3}, .m_v3.NormalMax.IsSupported = TRUE, .m_v3.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v3.NormalMax.Value = {7}, .m_v3.NormalMin.IsSupported = TRUE, .m_v3.NormalMin.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v3.NormalMin.Value = {-7}, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( value.m_v1.Flags != result.m_v1.Flags ) return 1; if ( !cmp_sensorreading( &value.m_v1.Max, &result.m_v1.Max ) ) return 1; if ( !cmp_sensorreading( &value.m_v1.Min, &result.m_v1.Min ) ) return 1; if ( !cmp_sensorreading( &value.m_v1.Nominal, &result.m_v1.Nominal ) ) return 1; if ( !cmp_sensorreading( &value.m_v1.NormalMax, &result.m_v1.NormalMax ) ) return 1; if ( !cmp_sensorreading( &value.m_v1.NormalMin, &result.m_v1.NormalMin ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( value.m_v2.Flags != result.m_v2.Flags ) return 1; if ( !cmp_sensorreading( &value.m_v2.Max, &result.m_v2.Max ) ) return 1; if ( !cmp_sensorreading( &value.m_v2.Min, &result.m_v2.Min ) ) return 1; if ( !cmp_sensorreading( &value.m_v2.Nominal, &result.m_v2.Nominal ) ) return 1; if ( !cmp_sensorreading( &value.m_v2.NormalMax, &result.m_v2.NormalMax ) ) return 1; if ( !cmp_sensorreading( &value.m_v2.NormalMin, &result.m_v2.NormalMin ) ) return 1; if ( value.m_v3.Flags != result.m_v3.Flags ) return 1; if ( !cmp_sensorreading( &value.m_v3.Max, &result.m_v3.Max ) ) return 1; if ( !cmp_sensorreading( &value.m_v3.Min, &result.m_v3.Min ) ) return 1; if ( !cmp_sensorreading( &value.m_v3.Nominal, &result.m_v3.Nominal ) ) return 1; if ( !cmp_sensorreading( &value.m_v3.NormalMax, &result.m_v3.NormalMax ) ) return 1; if ( !cmp_sensorreading( &value.m_v3.NormalMin, &result.m_v3.NormalMin ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_014.c0000644000175100017510000000166012575647263016250 0ustar mohanmohan/* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include #include "marshal.h" #include int main( int argc, char *argv[] ) { tUint64 value = 0xfedc12345678abcdLL; tUint64 swap = GUINT64_SWAP_LE_BE( value ); tUint64 result; unsigned int s = Demarshal( G_BYTE_ORDER == G_LITTLE_ENDIAN ? G_BIG_ENDIAN : G_LITTLE_ENDIAN, &Marshal_Uint64Type, &result, &swap ); if ( s != sizeof( tUint64 ) ) return 1; if ( value != result ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_008.c0000644000175100017510000000167612575647263016262 0ustar mohanmohan/* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include #include "marshal.h" int main( int argc, char *argv[] ) { tFloat32 value = 12.2345678; tFloat32 result; unsigned char buffer[256]; unsigned int s1 = Marshal( &Marshal_Float32Type, &value, buffer ); if ( s1 != sizeof( tFloat32 ) ) return 1; unsigned int s2 = Demarshal( G_BYTE_ORDER, &Marshal_Float32Type, &result, buffer ); if ( s2 != sizeof( tFloat32 ) ) return 1; if ( value != result ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_hpi_types_037.c0000644000175100017510000000602712575647263020343 0ustar mohanmohan/* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include "marshal_hpi_types.h" #include #include #include static int cmp_watchdogevent( SaHpiWatchdogEventT *d1, SaHpiWatchdogEventT *d2 ) { if ( d1->WatchdogNum != d2->WatchdogNum ) return 0; if ( d1->WatchdogAction != d2->WatchdogAction ) return 0; if ( d1->WatchdogPreTimerAction != d2->WatchdogPreTimerAction ) return 0; if ( d1->WatchdogUse != d2->WatchdogUse ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiWatchdogEventT m_v1; tUint8 m_pad2; SaHpiWatchdogEventT m_v2; SaHpiWatchdogEventT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiWatchdogEventType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiWatchdogEventType ), dStructElement( cTest, m_v3 , SaHpiWatchdogEventType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.WatchdogNum = 1, .m_v1.WatchdogAction = SAHPI_WA_RESET, .m_v1.WatchdogPreTimerAction = SAHPI_WPI_SMI, .m_v1.WatchdogUse = SAHPI_WTU_NONE, .m_pad2 = 48, .m_v2.WatchdogNum = 2, .m_v2.WatchdogAction = SAHPI_WA_POWER_DOWN, .m_v2.WatchdogPreTimerAction = SAHPI_WPI_NMI, .m_v2.WatchdogUse = SAHPI_WTU_BIOS_POST, .m_v3.WatchdogNum = 3, .m_v3.WatchdogAction = SAHPI_WA_POWER_CYCLE, .m_v3.WatchdogPreTimerAction = SAHPI_WPI_OEM, .m_v3.WatchdogUse = SAHPI_WTU_OS_LOAD, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_watchdogevent( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_watchdogevent( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_watchdogevent( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_020.c0000644000175100017510000000523312575647264016246 0ustar mohanmohan/* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include #include "marshal.h" #include #define dModU8 0 #define dModU16 1 #define dModU32 2 #define dModU64 3 #define dModI8 4 #define dModI16 5 #define dModI32 6 #define dModI64 7 #define dModF32 8 #define dModF64 9 typedef union { tUint8 m_u8; tUint16 m_u16; tUint32 m_u32; tUint64 m_u64; tInt8 m_i8; tInt16 m_i16; tInt32 m_i32; tInt64 m_i64; tFloat32 m_f32; tFloat64 m_f64; } cUnion; typedef struct { tUint8 m_pad1; tUint8 m_mod; tUint8 m_pad2; cUnion m_union; tUint8 m_pad3; } cTest; cMarshalType UnionElements[] = { dUnionElement( dModU8 , Marshal_Uint8Type ), dUnionElement( dModU16, Marshal_Uint16Type ), dUnionElement( dModU32, Marshal_Uint32Type ), dUnionElement( dModU64, Marshal_Uint64Type ), dUnionElement( dModI8 , Marshal_Int8Type ), dUnionElement( dModI16, Marshal_Int16Type ), dUnionElement( dModI32, Marshal_Int32Type ), dUnionElement( dModI64, Marshal_Int64Type ), dUnionElement( dModF32, Marshal_Float32Type ), dUnionElement( dModF64, Marshal_Float64Type ), dUnionElementEnd() }; cMarshalType TestUnionType = dUnion( 1, UnionElements ); cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_mod , Marshal_Uint8Type ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_union, TestUnionType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_mod = dModU16, .m_pad2 = 48, .m_union.m_u16 = 0x4711, .m_pad3 = 49 }; unsigned char buffer[256]; cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( value.m_mod != result.m_mod ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; if ( value.m_union.m_u16 != result.m_union.m_u16 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_hpi_types_023.c0000644000175100017510000000515712575647264020342 0ustar mohanmohan/* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include "marshal_hpi_types.h" #include #include #include static int cmp_idrinfo( SaHpiIdrInfoT *d1, SaHpiIdrInfoT *d2 ) { if ( d1->IdrId != d2->IdrId ) return 0; if ( d1->UpdateCount != d2->UpdateCount ) return 0; if ( d1->ReadOnly != d2->ReadOnly ) return 0; if ( d1->NumAreas != d2->NumAreas ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiIdrInfoT m_v1; tUint8 m_pad2; SaHpiIdrInfoT m_v2; SaHpiIdrInfoT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiIdrInfoType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiIdrInfoType ), dStructElement( cTest, m_v3 , SaHpiIdrInfoType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.IdrId = 1, .m_v1.UpdateCount = 1, .m_v1.ReadOnly = FALSE, .m_v1.NumAreas = 1, .m_pad2 = 48, .m_v2.IdrId = 2, .m_v2.UpdateCount = 23, .m_v2.ReadOnly = FALSE, .m_v2.NumAreas = 3, .m_v3.IdrId = 3, .m_v3.UpdateCount = 10, .m_v3.ReadOnly = TRUE, .m_v3.NumAreas = 2, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_idrinfo( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_idrinfo( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_idrinfo( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_hpi_types_044.c0000644000175100017510000001631712575647264020345 0ustar mohanmohan/* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include "marshal_hpi_types.h" #include #include #include static int cmp_text_buffer( SaHpiTextBufferT *d1, SaHpiTextBufferT *d2 ) { if ( d1->DataType != d2->DataType ) return 0; if ( d1->Language != d2->Language ) return 0; if ( d1->DataLength != d2->DataLength ) return 0; return memcmp( d1->Data, d2->Data, d1->DataLength ) ? 0 : 1; } static int cmp_domaininfo( SaHpiDomainInfoT *d1, SaHpiDomainInfoT *d2 ) { int i; if ( d1->DomainId != d2->DomainId ) return 0; if ( d1->DomainCapabilities != d2->DomainCapabilities ) return 0; if ( d1->IsPeer != d2->IsPeer ) return 0; if ( !cmp_text_buffer( &d1->DomainTag, &d2->DomainTag ) ) return 0; if ( d1->DrtUpdateCount != d2->DrtUpdateCount ) return 0; if ( d1->DrtUpdateTimestamp != d2->DrtUpdateTimestamp ) return 0; if ( d1->RptUpdateCount != d2->RptUpdateCount ) return 0; if ( d1->RptUpdateTimestamp != d2->RptUpdateTimestamp ) return 0; if ( d1->DatUpdateCount != d2->DatUpdateCount ) return 0; if ( d1->DatUpdateTimestamp != d2->DatUpdateTimestamp ) return 0; if ( d1->ActiveAlarms != d2->ActiveAlarms ) return 0; if ( d1->CriticalAlarms != d2->CriticalAlarms ) return 0; if ( d1->MajorAlarms != d2->MajorAlarms ) return 0; if ( d1->MinorAlarms != d2->MinorAlarms ) return 0; if ( d1->DatUserAlarmLimit != d2->DatUserAlarmLimit ) return 0; if ( d1->DatOverflow != d2->DatOverflow ) return 0; for (i = 0; i < 16; i++) { if ( d1->Guid[i] != d2->Guid[i] ) return 0; } return 1; } typedef struct { tUint8 m_pad1; SaHpiDomainInfoT m_v1; tUint8 m_pad2; SaHpiDomainInfoT m_v2; SaHpiDomainInfoT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiDomainInfoType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiDomainInfoType ), dStructElement( cTest, m_v3 , SaHpiDomainInfoType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.DomainId = 1, .m_v1.DomainCapabilities = 1, .m_v1.IsPeer = TRUE, .m_v1.DomainTag.DataType = SAHPI_TL_TYPE_BINARY, .m_v1.DomainTag.Language = SAHPI_LANG_TSONGA, .m_v1.DomainTag.DataLength = 3, .m_v1.DomainTag.Data = "AB", .m_v1.DrtUpdateCount = 1, .m_v1.DrtUpdateTimestamp = 1006, .m_v1.RptUpdateCount = 1, .m_v1.RptUpdateTimestamp = 1050, .m_v1.DatUpdateCount = 1, .m_v1.DatUpdateTimestamp = 1400, .m_v1.ActiveAlarms = 1, .m_v1.CriticalAlarms = 1, .m_v1.MajorAlarms = 1, .m_v1.MinorAlarms = 1, .m_v1.DatUserAlarmLimit = 1, .m_v1.DatOverflow = FALSE, .m_v1.Guid = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, .m_pad2 = 48, .m_v2.DomainId = 2, .m_v2.DomainCapabilities = 2, .m_v2.IsPeer = TRUE, .m_v2.DomainTag.DataType = SAHPI_TL_TYPE_BINARY, .m_v2.DomainTag.Language = SAHPI_LANG_TSONGA, .m_v2.DomainTag.DataLength = 3, .m_v2.DomainTag.Data = "AB", .m_v2.DrtUpdateCount = 1, .m_v2.DrtUpdateTimestamp = 1100, .m_v2.RptUpdateCount = 1, .m_v2.RptUpdateTimestamp = 1020, .m_v2.DatUpdateCount = 1, .m_v2.DatUpdateTimestamp = 1003, .m_v2.ActiveAlarms = 0, .m_v2.CriticalAlarms = 1, .m_v2.MajorAlarms = 0, .m_v2.MinorAlarms = 1, .m_v2.DatUserAlarmLimit = 1, .m_v2.DatOverflow = TRUE, .m_v2.Guid = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, .m_v3.DomainId = 3, .m_v3.DomainCapabilities = 3, .m_v3.IsPeer = FALSE, .m_v3.DomainTag.DataType = SAHPI_TL_TYPE_BINARY, .m_v3.DomainTag.Language = SAHPI_LANG_TSONGA, .m_v3.DomainTag.DataLength = 3, .m_v3.DomainTag.Data = "AB", .m_v3.DrtUpdateCount = 2, .m_v3.DrtUpdateTimestamp = 1300, .m_v3.RptUpdateCount = 1, .m_v3.RptUpdateTimestamp = 1020, .m_v3.DatUpdateCount = 6, .m_v3.DatUpdateTimestamp = 1001, .m_v3.ActiveAlarms = 1, .m_v3.CriticalAlarms = 0, .m_v3.MajorAlarms = 0, .m_v3.MinorAlarms = 0, .m_v3.DatUserAlarmLimit = 1, .m_v3.DatOverflow = TRUE, .m_v3.Guid = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_domaininfo( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_domaininfo( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_domaininfo( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_031.c0000644000175100017510000000177612575647263016257 0ustar mohanmohan/* * Copyright (c) 2007 by Sun Microsystems, Inc. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Chris Rinaldo */ #include #include "marshal.h" #include #include int main( int argc, char *argv[] ) { tFloat64 value = -2.3480639908310873e-146; tFloat64 result; tUint64 swap; memcpy( &swap, &value, sizeof( tUint64 ) ); swap = GUINT64_SWAP_LE_BE( swap ); unsigned int s = Demarshal( G_BYTE_ORDER == G_LITTLE_ENDIAN ? G_BIG_ENDIAN : G_LITTLE_ENDIAN, &Marshal_Float64Type, &result, &swap ); if ( s != sizeof( tFloat64 ) ) return 1; if ( value != result ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_hpi_types_038.c0000644000175100017510000000675612575647263020355 0ustar mohanmohan/* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include "marshal_hpi_types.h" #include #include #include static int cmp_text_buffer( SaHpiTextBufferT *d1, SaHpiTextBufferT *d2 ) { if ( d1->DataType != d2->DataType ) return 0; if ( d1->Language != d2->Language ) return 0; if ( d1->DataLength != d2->DataLength ) return 0; return memcmp( d1->Data, d2->Data, d1->DataLength ) ? 0 : 1; } static int cmp_swevent( SaHpiHpiSwEventT *d1, SaHpiHpiSwEventT *d2 ) { if ( d1->MId != d2->MId ) return 0; if ( d1->Type != d2->Type ) return 0; if ( !cmp_text_buffer( &d1->EventData, &d2->EventData ) ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiHpiSwEventT m_v1; tUint8 m_pad2; SaHpiHpiSwEventT m_v2; SaHpiHpiSwEventT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiHpiSwEventType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiHpiSwEventType ), dStructElement( cTest, m_v3 , SaHpiHpiSwEventType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.MId = 1, .m_v1.Type = SAHPI_HPIE_AUDIT, .m_v1.EventData.DataType = SAHPI_TL_TYPE_BINARY, .m_v1.EventData.Language = SAHPI_LANG_TSONGA, .m_v1.EventData.DataLength = 3, .m_v1.EventData.Data = "AB", .m_pad2 = 48, .m_v2.MId = 2, .m_v2.Type = SAHPI_HPIE_STARTUP, .m_v2.EventData.DataType = SAHPI_TL_TYPE_BCDPLUS, .m_v2.EventData.Language = SAHPI_LANG_SANGRO, .m_v2.EventData.DataLength = 21, .m_v2.EventData.Data = "12345678901234567890", .m_v3.MId = 3, .m_v3.Type = SAHPI_HPIE_OTHER, .m_v3.EventData.DataType = SAHPI_TL_TYPE_ASCII6, .m_v3.EventData.Language = SAHPI_LANG_TAJIK, .m_v3.EventData.DataLength = 0, .m_v3.EventData.Data = "", .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_swevent( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_swevent( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_swevent( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_hpi_types_046.c0000644000175100017510000002027612575647264020346 0ustar mohanmohan/* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include "marshal_hpi_types.h" #include #include #include static int cmp_text_buffer( SaHpiTextBufferT *d1, SaHpiTextBufferT *d2 ) { if ( d1->DataType != d2->DataType ) return 0; if ( d1->Language != d2->Language ) return 0; if ( d1->DataLength != d2->DataLength ) return 0; return memcmp( d1->Data, d2->Data, d1->DataLength ) ? 0 : 1; } static int cmp_entity( SaHpiEntityT *d1, SaHpiEntityT *d2 ) { if ( d1->EntityType != d2->EntityType ) return 0; if ( d1->EntityLocation != d2->EntityLocation ) return 0; return 1; } static int cmp_entitypath( SaHpiEntityPathT *d1, SaHpiEntityPathT *d2 ) { int i; for (i = 0; ; i++) { if (d1->Entry[i].EntityType == SAHPI_ENT_ROOT && d2->Entry[i].EntityType == SAHPI_ENT_ROOT) { return 1; } if ( cmp_entity(&d1->Entry[i], &d2->Entry[i]) == 0 ) return 0; } return 1; } static int cmp_name( SaHpiNameT *d1, SaHpiNameT *d2 ) { if ( d1->Length != d2->Length ) return 0; if ( memcmp(&d1->Value, &d2->Value, SA_HPI_MAX_NAME_LENGTH) != 0 ) return 0; return 1; } static int cmp_condition( SaHpiConditionT *d1, SaHpiConditionT *d2 ) { if ( d1->Type != d2->Type ) return 0; if ( !cmp_entitypath( &d1->Entity, &d2->Entity ) ) return 0; if ( d1->DomainId != d2->DomainId ) return 0; if ( d1->ResourceId != d2->ResourceId ) return 0; if ( d1->SensorNum != d2->SensorNum ) return 0; if ( d1->SensorNum != d2->SensorNum ) return 0; if ( d1->EventState != d2->EventState ) return 0; if ( !cmp_name( &d1->Name, &d2->Name ) ) return 0; if ( d1->Mid != d2->Mid ) return 0; if ( !cmp_text_buffer( &d1->Data, &d2->Data ) ) return 0; return 1; } static int cmp_alarm( SaHpiAlarmT *d1, SaHpiAlarmT *d2 ) { if ( d1->AlarmId != d2->AlarmId ) return 0; if ( d1->Timestamp != d2->Timestamp ) return 0; if ( d1->Severity != d2->Severity ) return 0; if ( d1->Acknowledged != d2->Acknowledged ) return 0; if ( !cmp_condition( &d1->AlarmCond, &d2->AlarmCond ) ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiAlarmT m_v1; tUint8 m_pad2; SaHpiAlarmT m_v2; SaHpiAlarmT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiAlarmType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiAlarmType ), dStructElement( cTest, m_v3 , SaHpiAlarmType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.AlarmId = 1, .m_v1.Timestamp = 1000, .m_v1.Severity = 0, .m_v1.Acknowledged = TRUE, .m_v1.AlarmCond.Type = SAHPI_STATUS_COND_TYPE_SENSOR, .m_v1.AlarmCond.Entity.Entry[0].EntityType = SAHPI_ENT_SYSTEM_BOARD, .m_v1.AlarmCond.Entity.Entry[0].EntityLocation = 1, .m_v1.AlarmCond.Entity.Entry[1].EntityType = SAHPI_ENT_POWER_UNIT, .m_v1.AlarmCond.Entity.Entry[1].EntityLocation = 2, .m_v1.AlarmCond.Entity.Entry[2].EntityType = SAHPI_ENT_ROOT, .m_v1.AlarmCond.Entity.Entry[2].EntityLocation = 0, .m_v1.AlarmCond.DomainId = SAHPI_UNSPECIFIED_DOMAIN_ID, .m_v1.AlarmCond.ResourceId = 1, .m_v1.AlarmCond.SensorNum = 1, .m_v1.AlarmCond.EventState = SAHPI_ES_LOWER_MINOR, .m_v1.AlarmCond.Name.Length = 9, .m_v1.AlarmCond.Name.Value = "Next text", .m_v1.AlarmCond.Mid = 3, .m_v1.AlarmCond.Data.DataType = SAHPI_TL_TYPE_TEXT, .m_v1.AlarmCond.Data.Language = SAHPI_LANG_ENGLISH, .m_v1.AlarmCond.Data.DataLength = 3, .m_v1.AlarmCond.Data.Data = "AB", .m_pad2 = 48, .m_v2.AlarmId = 1, .m_v2.Timestamp = 1020, .m_v2.Severity = 1, .m_v2.Acknowledged = FALSE, .m_v2.AlarmCond.Type = SAHPI_STATUS_COND_TYPE_RESOURCE, .m_v2.AlarmCond.Entity.Entry[0].EntityType = SAHPI_ENT_SUB_CHASSIS, .m_v2.AlarmCond.Entity.Entry[0].EntityLocation = 1, .m_v2.AlarmCond.Entity.Entry[1].EntityType = SAHPI_ENT_SYSTEM_BUS, .m_v2.AlarmCond.Entity.Entry[1].EntityLocation = 2, .m_v2.AlarmCond.Entity.Entry[2].EntityType = SAHPI_ENT_COOLING_DEVICE, .m_v2.AlarmCond.Entity.Entry[2].EntityLocation = 3, .m_v2.AlarmCond.Entity.Entry[3].EntityType = SAHPI_ENT_ROOT, .m_v2.AlarmCond.Entity.Entry[3].EntityLocation = 0, .m_v2.AlarmCond.DomainId = SAHPI_UNSPECIFIED_DOMAIN_ID, .m_v2.AlarmCond.ResourceId = 2, .m_v2.AlarmCond.SensorNum = 4, .m_v2.AlarmCond.EventState = SAHPI_ES_LOWER_CRIT, .m_v2.AlarmCond.Name.Length = 9, .m_v2.AlarmCond.Name.Value = "Next text", .m_v2.AlarmCond.Mid = 3, .m_v2.AlarmCond.Data.DataType = SAHPI_TL_TYPE_TEXT, .m_v2.AlarmCond.Data.Language = SAHPI_LANG_ENGLISH, .m_v2.AlarmCond.Data.DataLength = 3, .m_v2.AlarmCond.Data.Data = "AB", .m_v3.AlarmId = 1, .m_v3.Timestamp = 1040, .m_v3.Severity = 2, .m_v3.Acknowledged = TRUE, .m_v3.AlarmCond.Type = SAHPI_STATUS_COND_TYPE_OEM, .m_v3.AlarmCond.Entity.Entry[0].EntityType = SAHPI_ENT_PROCESSOR, .m_v3.AlarmCond.Entity.Entry[0].EntityLocation = 1, .m_v3.AlarmCond.Entity.Entry[1].EntityType = SAHPI_ENT_ROOT, .m_v3.AlarmCond.Entity.Entry[1].EntityLocation = 0, .m_v3.AlarmCond.DomainId = SAHPI_UNSPECIFIED_DOMAIN_ID, .m_v3.AlarmCond.ResourceId = 3, .m_v3.AlarmCond.SensorNum = 5, .m_v3.AlarmCond.EventState = SAHPI_ES_UPPER_MAJOR, .m_v3.AlarmCond.Name.Length = 9, .m_v3.AlarmCond.Name.Value = "Next text", .m_v3.AlarmCond.Mid = 3, .m_v3.AlarmCond.Data.DataType = SAHPI_TL_TYPE_BINARY, .m_v3.AlarmCond.Data.Language = SAHPI_LANG_ENGLISH, .m_v3.AlarmCond.Data.DataLength = 3, .m_v3.AlarmCond.Data.Data = "AB", .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_alarm( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_alarm( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_alarm( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_024.c0000644000175100017510000000540512575647264016253 0ustar mohanmohan/* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include #include "marshal.h" #include #define dModU8 0xabcdf001 #define dModU16 0xabcdf002 #define dModU32 0xabcdf003 #define dModU64 0xabcdf004 #define dModI8 0xabcdf005 #define dModI16 0xabcdf006 #define dModI32 0xabcdf007 #define dModI64 0xabcdf008 #define dModF32 0xabcdf009 #define dModF64 0xabcdf010 typedef union { tUint8 m_u8; tUint16 m_u16; tUint32 m_u32; tUint64 m_u64; tInt8 m_i8; tInt16 m_i16; tInt32 m_i32; tInt64 m_i64; tFloat32 m_f32; tFloat64 m_f64; } cUnion; typedef struct { tUint8 m_pad1; tUint32 m_mod; tUint8 m_pad2; cUnion m_union; tUint8 m_pad3; } cTest; cMarshalType UnionElements[] = { dUnionElement( dModU8 , Marshal_Uint8Type ), dUnionElement( dModU16, Marshal_Uint16Type ), dUnionElement( dModU32, Marshal_Uint32Type ), dUnionElement( dModU64, Marshal_Uint64Type ), dUnionElement( dModI8 , Marshal_Int8Type ), dUnionElement( dModI16, Marshal_Int16Type ), dUnionElement( dModI32, Marshal_Int32Type ), dUnionElement( dModI64, Marshal_Int64Type ), dUnionElement( dModF32, Marshal_Float32Type ), dUnionElement( dModF64, Marshal_Float64Type ), dUnionElementEnd() }; cMarshalType TestUnionType = dUnion( 1, UnionElements ); cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_mod , Marshal_Uint32Type ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_union, TestUnionType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_mod = dModU64, .m_pad2 = 48, .m_union.m_u64 = 0xabcd123456780123LL, .m_pad3 = 49 }; unsigned char buffer[256]; cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( value.m_mod != result.m_mod ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; if ( value.m_union.m_u64 != result.m_union.m_u64 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_hpi_types_019.c0000644000175100017510000000500512575647263020336 0ustar mohanmohan/* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include "marshal_hpi_types.h" #include #include #include static int cmp_ctrldefaultmode( SaHpiCtrlDefaultModeT *d1, SaHpiCtrlDefaultModeT *d2 ) { if ( d1->Mode != d2->Mode ) return 0; if ( d1->ReadOnly != d2->ReadOnly ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiCtrlDefaultModeT m_v1; tUint8 m_pad2; SaHpiCtrlDefaultModeT m_v2; SaHpiCtrlDefaultModeT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiCtrlDefaultModeType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiCtrlDefaultModeType ), dStructElement( cTest, m_v3 , SaHpiCtrlDefaultModeType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.Mode = SAHPI_CTRL_MODE_AUTO, .m_v1.ReadOnly = TRUE, .m_pad2 = 48, .m_v2.Mode = SAHPI_CTRL_MODE_AUTO, .m_v2.ReadOnly = FALSE, .m_v3.Mode = SAHPI_CTRL_MODE_MANUAL, .m_v3.ReadOnly = TRUE, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_ctrldefaultmode( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_ctrldefaultmode( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_ctrldefaultmode( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_hpi_types_015.c0000644000175100017510000000505112575647263020333 0ustar mohanmohan/* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include "marshal_hpi_types.h" #include #include #include static int cmp_ctrlrecanalog( SaHpiCtrlRecAnalogT *d1, SaHpiCtrlRecAnalogT *d2 ) { if ( d1->Min != d2->Min ) return 0; if ( d1->Max != d2->Max ) return 0; if ( d1->Default != d2->Default ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiCtrlRecAnalogT m_v1; tUint8 m_pad2; SaHpiCtrlRecAnalogT m_v2; SaHpiCtrlRecAnalogT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiCtrlRecAnalogType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiCtrlRecAnalogType ), dStructElement( cTest, m_v3 , SaHpiCtrlRecAnalogType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.Min = 0, .m_v1.Max = 27, .m_v1.Default = 10, .m_pad2 = 48, .m_v1.Min = -5, .m_v1.Max = 5, .m_v1.Default = 0, .m_v1.Min = -100, .m_v1.Max = 100, .m_v1.Default = 10, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_ctrlrecanalog( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_ctrlrecanalog( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_ctrlrecanalog( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_hpi_types_008.c0000644000175100017510000003473112575647264020345 0ustar mohanmohan/* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include "marshal_hpi_types.h" #include #include #include static int cmp_sensorreading( SaHpiSensorReadingT *d1, SaHpiSensorReadingT *d2 ) { if ( d1->IsSupported != d2->IsSupported ) return 0; if ( d1->Type != d2->Type ) return 0; if ( d1->Value.SensorInt64 != d2->Value.SensorInt64 ) return 0; return 1; } static int cmp_thddefn( SaHpiSensorThdDefnT *d1, SaHpiSensorThdDefnT *d2 ) { if ( d1->IsAccessible != d2->IsAccessible ) return 0; if ( d1->ReadThold != d2->ReadThold ) return 0; if ( d1->WriteThold != d2->WriteThold ) return 0; if ( d1->Nonlinear != d2->Nonlinear ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiSensorRecT m_v1; tUint8 m_pad2; SaHpiSensorRecT m_v2; SaHpiSensorRecT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiSensorRecType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiSensorRecType ), dStructElement( cTest, m_v3 , SaHpiSensorRecType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.Num = 1, .m_v1.Type = SAHPI_TEMPERATURE, .m_v1.Category = SAHPI_EC_GENERIC || SAHPI_EC_SENSOR_SPECIFIC, .m_v1.EnableCtrl = TRUE, .m_v1.EventCtrl = SAHPI_SEC_READ_ONLY, .m_v1.Events = SAHPI_EC_GENERIC || SAHPI_EC_SENSOR_SPECIFIC, .m_v1.DataFormat.IsSupported = TRUE, .m_v1.DataFormat.ReadingType = SAHPI_SENSOR_READING_TYPE_INT64, .m_v1.DataFormat.BaseUnits = SAHPI_SU_DEGREES_C, .m_v1.DataFormat.ModifierUnits = SAHPI_SU_DEGREES_C, .m_v1.DataFormat.ModifierUse = SAHPI_SMUU_NONE, .m_v1.DataFormat.Percentage = TRUE, .m_v1.DataFormat.Range.Flags = SAHPI_SRF_MIN | SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MIN | SAHPI_SRF_NORMAL_MAX | SAHPI_SRF_NOMINAL, .m_v1.DataFormat.Range.Max.IsSupported = TRUE, .m_v1.DataFormat.Range.Max.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v1.DataFormat.Range.Max.Value = {10}, .m_v1.DataFormat.Range.Min.IsSupported = TRUE, .m_v1.DataFormat.Range.Min.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v1.DataFormat.Range.Min.Value = {-10}, .m_v1.DataFormat.Range.Nominal.IsSupported = TRUE, .m_v1.DataFormat.Range.Nominal.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v1.DataFormat.Range.Nominal.Value = {0}, .m_v1.DataFormat.Range.NormalMax.IsSupported = TRUE, .m_v1.DataFormat.Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v1.DataFormat.Range.NormalMax.Value = {5}, .m_v1.DataFormat.Range.NormalMin.IsSupported = TRUE, .m_v1.DataFormat.Range.NormalMin.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v1.DataFormat.Range.NormalMin.Value = {-5}, .m_v1.DataFormat.AccuracyFactor = 0, .m_v1.ThresholdDefn.IsAccessible = TRUE, .m_v1.ThresholdDefn.ReadThold = SAHPI_STM_LOW_MINOR, .m_v1.ThresholdDefn.WriteThold = SAHPI_STM_UP_CRIT, .m_v1.ThresholdDefn.Nonlinear = FALSE, .m_v1.Oem = 0, .m_pad2 = 48, .m_v2.Num = 2, .m_v2.Type = SAHPI_TEMPERATURE, .m_v2.Category = SAHPI_EC_GENERIC || SAHPI_EC_SENSOR_SPECIFIC, .m_v2.EnableCtrl = FALSE, .m_v2.EventCtrl = SAHPI_SEC_READ_ONLY, .m_v2.Events = SAHPI_EC_GENERIC || SAHPI_EC_SENSOR_SPECIFIC, .m_v2.DataFormat.IsSupported = TRUE, .m_v2.DataFormat.ReadingType = SAHPI_SENSOR_READING_TYPE_INT64, .m_v2.DataFormat.BaseUnits = SAHPI_SU_DEGREES_C, .m_v2.DataFormat.ModifierUnits = SAHPI_SU_DEGREES_C, .m_v2.DataFormat.ModifierUse = SAHPI_SMUU_NONE, .m_v2.DataFormat.Percentage = FALSE, .m_v2.DataFormat.Range.Flags = SAHPI_SRF_MIN | SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MIN | SAHPI_SRF_NORMAL_MAX | SAHPI_SRF_NOMINAL, .m_v2.DataFormat.Range.Max.IsSupported = TRUE, .m_v2.DataFormat.Range.Max.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v2.DataFormat.Range.Max.Value = {10}, .m_v2.DataFormat.Range.Min.IsSupported = FALSE, .m_v2.DataFormat.Range.Min.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v2.DataFormat.Range.Min.Value = {-10}, .m_v2.DataFormat.Range.Nominal.IsSupported = TRUE, .m_v2.DataFormat.Range.Nominal.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v2.DataFormat.Range.Nominal.Value = {0}, .m_v2.DataFormat.Range.NormalMax.IsSupported = TRUE, .m_v2.DataFormat.Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v2.DataFormat.Range.NormalMax.Value = {5}, .m_v2.DataFormat.Range.NormalMin.IsSupported = TRUE, .m_v2.DataFormat.Range.NormalMin.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v2.DataFormat.Range.NormalMin.Value = {-5}, .m_v2.DataFormat.AccuracyFactor = 0, .m_v2.ThresholdDefn.IsAccessible = FALSE, .m_v2.ThresholdDefn.ReadThold = SAHPI_STM_LOW_MINOR, .m_v2.ThresholdDefn.WriteThold = SAHPI_STM_UP_CRIT, .m_v2.ThresholdDefn.Nonlinear = FALSE, .m_v2.Oem = 0, .m_v3.Num = 3, .m_v3.Type = SAHPI_TEMPERATURE, .m_v3.Category = SAHPI_EC_GENERIC || SAHPI_EC_SENSOR_SPECIFIC, .m_v3.EnableCtrl = TRUE, .m_v3.EventCtrl = SAHPI_SEC_READ_ONLY, .m_v3.Events = SAHPI_EC_GENERIC || SAHPI_EC_SENSOR_SPECIFIC, .m_v3.DataFormat.IsSupported = TRUE, .m_v3.DataFormat.ReadingType = SAHPI_SENSOR_READING_TYPE_INT64, .m_v3.DataFormat.BaseUnits = SAHPI_SU_DEGREES_C, .m_v3.DataFormat.ModifierUnits = SAHPI_SU_DEGREES_C, .m_v3.DataFormat.ModifierUse = SAHPI_SMUU_NONE, .m_v3.DataFormat.Percentage = TRUE, .m_v3.DataFormat.Range.Flags = SAHPI_SRF_MIN | SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MIN | SAHPI_SRF_NORMAL_MAX | SAHPI_SRF_NOMINAL, .m_v3.DataFormat.Range.Max.IsSupported = FALSE, .m_v3.DataFormat.Range.Max.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v3.DataFormat.Range.Max.Value = {10}, .m_v3.DataFormat.Range.Min.IsSupported = FALSE, .m_v3.DataFormat.Range.Min.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v3.DataFormat.Range.Min.Value = {-10}, .m_v3.DataFormat.Range.Nominal.IsSupported = TRUE, .m_v3.DataFormat.Range.Nominal.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v3.DataFormat.Range.Nominal.Value = {0}, .m_v3.DataFormat.Range.NormalMax.IsSupported = FALSE, .m_v3.DataFormat.Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v3.DataFormat.Range.NormalMax.Value = {5}, .m_v3.DataFormat.Range.NormalMin.IsSupported = TRUE, .m_v3.DataFormat.Range.NormalMin.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v3.DataFormat.Range.NormalMin.Value = {-5}, .m_v3.DataFormat.AccuracyFactor = 0, .m_v3.ThresholdDefn.IsAccessible = TRUE, .m_v3.ThresholdDefn.ReadThold = SAHPI_STM_LOW_MINOR, .m_v3.ThresholdDefn.WriteThold = SAHPI_STM_UP_CRIT, .m_v3.ThresholdDefn.Nonlinear = TRUE, .m_v2.Oem = 0, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( value.m_v1.Num != result.m_v1.Num ) return 1; if ( value.m_v1.Type != result.m_v1.Type ) return 1; if ( value.m_v1.Category != result.m_v1.Category ) return 1; if ( value.m_v1.EnableCtrl != result.m_v1.EnableCtrl ) return 1; if ( value.m_v1.EventCtrl != result.m_v1.EventCtrl ) return 1; if ( value.m_v1.Events != result.m_v1.Events ) return 1; if ( value.m_v1.DataFormat.IsSupported != result.m_v1.DataFormat.IsSupported ) return 1; if ( value.m_v1.DataFormat.ReadingType != result.m_v1.DataFormat.ReadingType ) return 1; if ( value.m_v1.DataFormat.BaseUnits != result.m_v1.DataFormat.BaseUnits ) return 1; if ( value.m_v1.DataFormat.ModifierUnits != result.m_v1.DataFormat.ModifierUnits ) return 1; if ( value.m_v1.DataFormat.ModifierUse != result.m_v1.DataFormat.ModifierUse ) return 1; if ( value.m_v1.DataFormat.Percentage != result.m_v1.DataFormat.Percentage ) return 1; if ( !cmp_sensorreading( &value.m_v1.DataFormat.Range.Max, &result.m_v1.DataFormat.Range.Max ) ) return 1; if ( !cmp_sensorreading( &value.m_v1.DataFormat.Range.Min, &result.m_v1.DataFormat.Range.Min ) ) return 1; if ( !cmp_sensorreading( &value.m_v1.DataFormat.Range.Nominal, &result.m_v1.DataFormat.Range.Nominal ) ) return 1; if ( !cmp_sensorreading( &value.m_v1.DataFormat.Range.NormalMax, &result.m_v1.DataFormat.Range.NormalMax ) ) return 1; if ( !cmp_sensorreading( &value.m_v1.DataFormat.Range.NormalMin, &result.m_v1.DataFormat.Range.NormalMin ) ) return 1; if ( value.m_v1.DataFormat.AccuracyFactor != result.m_v1.DataFormat.AccuracyFactor ) return 1; if ( !cmp_thddefn( &value.m_v1.ThresholdDefn, &result.m_v1.ThresholdDefn ) ) return 1; if ( value.m_v1.Oem != result.m_v1.Oem ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( value.m_v2.Num != result.m_v2.Num ) return 1; if ( value.m_v2.Type != result.m_v2.Type ) return 1; if ( value.m_v2.Category != result.m_v2.Category ) return 1; if ( value.m_v2.EnableCtrl != result.m_v2.EnableCtrl ) return 1; if ( value.m_v2.EventCtrl != result.m_v2.EventCtrl ) return 1; if ( value.m_v2.Events != result.m_v2.Events ) return 1; if ( value.m_v2.DataFormat.IsSupported != result.m_v2.DataFormat.IsSupported ) return 1; if ( value.m_v2.DataFormat.ReadingType != result.m_v2.DataFormat.ReadingType ) return 1; if ( value.m_v2.DataFormat.BaseUnits != result.m_v2.DataFormat.BaseUnits ) return 1; if ( value.m_v2.DataFormat.ModifierUnits != result.m_v2.DataFormat.ModifierUnits ) return 1; if ( value.m_v2.DataFormat.ModifierUse != result.m_v2.DataFormat.ModifierUse ) return 1; if ( value.m_v2.DataFormat.Percentage != result.m_v2.DataFormat.Percentage ) return 1; if ( !cmp_sensorreading( &value.m_v2.DataFormat.Range.Max, &result.m_v2.DataFormat.Range.Max ) ) return 1; if ( !cmp_sensorreading( &value.m_v2.DataFormat.Range.Min, &result.m_v2.DataFormat.Range.Min ) ) return 1; if ( !cmp_sensorreading( &value.m_v2.DataFormat.Range.Nominal, &result.m_v2.DataFormat.Range.Nominal ) ) return 1; if ( !cmp_sensorreading( &value.m_v2.DataFormat.Range.NormalMax, &result.m_v2.DataFormat.Range.NormalMax ) ) return 1; if ( !cmp_sensorreading( &value.m_v2.DataFormat.Range.NormalMin, &result.m_v2.DataFormat.Range.NormalMin ) ) return 1; if ( value.m_v2.DataFormat.AccuracyFactor != result.m_v2.DataFormat.AccuracyFactor ) return 1; if ( !cmp_thddefn( &value.m_v2.ThresholdDefn, &result.m_v2.ThresholdDefn ) ) return 1; if ( value.m_v2.Oem != result.m_v2.Oem ) return 1; if ( value.m_v3.Num != result.m_v3.Num ) return 1; if ( value.m_v3.Type != result.m_v3.Type ) return 1; if ( value.m_v3.Category != result.m_v3.Category ) return 1; if ( value.m_v3.EnableCtrl != result.m_v3.EnableCtrl ) return 1; if ( value.m_v3.EventCtrl != result.m_v3.EventCtrl ) return 1; if ( value.m_v3.Events != result.m_v3.Events ) return 1; if ( value.m_v3.DataFormat.IsSupported != result.m_v3.DataFormat.IsSupported ) return 1; if ( value.m_v3.DataFormat.ReadingType != result.m_v3.DataFormat.ReadingType ) return 1; if ( value.m_v3.DataFormat.BaseUnits != result.m_v3.DataFormat.BaseUnits ) return 1; if ( value.m_v3.DataFormat.ModifierUnits != result.m_v3.DataFormat.ModifierUnits ) return 1; if ( value.m_v3.DataFormat.ModifierUse != result.m_v3.DataFormat.ModifierUse ) return 1; if ( value.m_v3.DataFormat.Percentage != result.m_v3.DataFormat.Percentage ) return 1; if ( !cmp_sensorreading( &value.m_v3.DataFormat.Range.Max, &result.m_v3.DataFormat.Range.Max ) ) return 1; if ( !cmp_sensorreading( &value.m_v3.DataFormat.Range.Min, &result.m_v3.DataFormat.Range.Min ) ) return 1; if ( !cmp_sensorreading( &value.m_v3.DataFormat.Range.Nominal, &result.m_v3.DataFormat.Range.Nominal ) ) return 1; if ( !cmp_sensorreading( &value.m_v3.DataFormat.Range.NormalMax, &result.m_v3.DataFormat.Range.NormalMax ) ) return 1; if ( !cmp_sensorreading( &value.m_v3.DataFormat.Range.NormalMin, &result.m_v3.DataFormat.Range.NormalMin ) ) return 1; if ( value.m_v3.DataFormat.AccuracyFactor != result.m_v3.DataFormat.AccuracyFactor ) return 1; if ( !cmp_thddefn( &value.m_v3.ThresholdDefn, &result.m_v3.ThresholdDefn ) ) return 1; if ( value.m_v3.Oem != result.m_v3.Oem ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_015.c0000644000175100017510000000153112575647264016247 0ustar mohanmohan/* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include #include "marshal.h" int main( int argc, char *argv[] ) { tInt8 value = 0xfa; tInt8 result; unsigned int s = Demarshal( G_BYTE_ORDER == G_LITTLE_ENDIAN ? G_BIG_ENDIAN : G_LITTLE_ENDIAN, &Marshal_Int8Type, &result, &value ); if ( s != sizeof( tInt8 ) ) return 1; if ( value != result ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_hpi_types_040.c0000644000175100017510000000614112575647264020333 0ustar mohanmohan/* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include "marshal_hpi_types.h" #include #include #include static int cmp_text_buffer( SaHpiTextBufferT *d1, SaHpiTextBufferT *d2 ) { if ( d1->DataType != d2->DataType ) return 0; if ( d1->Language != d2->Language ) return 0; if ( d1->DataLength != d2->DataLength ) return 0; return memcmp( d1->Data, d2->Data, d1->DataLength ) ? 0 : 1; } static int cmp_userevent( SaHpiUserEventT *d1, SaHpiUserEventT *d2 ) { if ( !cmp_text_buffer( &d1->UserEventData, &d2->UserEventData ) ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiUserEventT m_v1; tUint8 m_pad2; SaHpiUserEventT m_v2; SaHpiUserEventT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiUserEventType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiUserEventType ), dStructElement( cTest, m_v3 , SaHpiUserEventType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.UserEventData.DataType = SAHPI_TL_TYPE_BINARY, .m_v1.UserEventData.Language = SAHPI_LANG_TSONGA, .m_v1.UserEventData.DataLength = 3, .m_v1.UserEventData.Data = "AB", .m_pad2 = 48, .m_v2.UserEventData.DataType = SAHPI_TL_TYPE_BCDPLUS, .m_v2.UserEventData.Language = SAHPI_LANG_SANGRO, .m_v2.UserEventData.DataLength = 21, .m_v2.UserEventData.Data = "12345678901234567890", .m_v3.UserEventData.DataType = SAHPI_TL_TYPE_ASCII6, .m_v3.UserEventData.Language = SAHPI_LANG_TAJIK, .m_v3.UserEventData.DataLength = 0, .m_v3.UserEventData.Data = "", .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_userevent( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_userevent( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_userevent( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_hpi_types_033.c0000644000175100017510000000505712575647263020341 0ustar mohanmohan/* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include "marshal_hpi_types.h" #include #include #include static int cmp_domainevent( SaHpiDomainEventT *d1, SaHpiDomainEventT *d2 ) { if ( d1->Type != d2->Type ) return 0; if ( d1->DomainId != d2->DomainId ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiDomainEventT m_v1; tUint8 m_pad2; SaHpiDomainEventT m_v2; SaHpiDomainEventT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiDomainEventType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiDomainEventType ), dStructElement( cTest, m_v3 , SaHpiDomainEventType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.Type = SAHPI_DOMAIN_REF_ADDED, .m_v1.DomainId = 1, .m_pad2 = 48, .m_v2.Type = SAHPI_DOMAIN_REF_REMOVED, .m_v2.DomainId = 10, .m_v3.Type = SAHPI_DOMAIN_REF_REMOVED, .m_v3.DomainId = 17, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_domainevent( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_domainevent( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_domainevent( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_hpi_types_022.c0000644000175100017510000000540112575647263020330 0ustar mohanmohan/* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include "marshal_hpi_types.h" #include #include #include static int cmp_idrareaheader( SaHpiIdrAreaHeaderT *d1, SaHpiIdrAreaHeaderT *d2 ) { if ( d1->AreaId != d2->AreaId ) return 0; if ( d1->Type != d2->Type ) return 0; if ( d1->ReadOnly != d2->ReadOnly ) return 0; if ( d1->NumFields != d2->NumFields ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiIdrAreaHeaderT m_v1; tUint8 m_pad2; SaHpiIdrAreaHeaderT m_v2; SaHpiIdrAreaHeaderT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiIdrAreaHeaderType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiIdrAreaHeaderType ), dStructElement( cTest, m_v3 , SaHpiIdrAreaHeaderType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.AreaId = 1, .m_v1.Type = SAHPI_IDR_FIELDTYPE_CUSTOM, .m_v1.ReadOnly = FALSE, .m_v1.NumFields = 1, .m_pad2 = 48, .m_v2.AreaId = 2, .m_v2.Type = SAHPI_IDR_FIELDTYPE_PART_NUMBER, .m_v2.ReadOnly = FALSE, .m_v2.NumFields = 3, .m_v3.AreaId = 3, .m_v3.Type = SAHPI_IDR_FIELDTYPE_CHASSIS_TYPE, .m_v3.ReadOnly = TRUE, .m_v3.NumFields = 2, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_idrareaheader( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_idrareaheader( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_idrareaheader( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_000.c0000644000175100017510000000171712575647263016246 0ustar mohanmohan/* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include #include "marshal.h" int main( int argc, char *argv[] ) { tUint8 value = 0x42; tUint8 result; unsigned char buffer[256]; unsigned int s1 = Marshal( &Marshal_Uint8Type, &value, buffer ); if ( s1 != sizeof( tUint8 ) ) return 1; unsigned int s2 = Demarshal( G_BYTE_ORDER, &Marshal_Uint8Type, &result, buffer ); if ( s2 != sizeof( tUint8 ) ) return 1; if ( value != result ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_hpi_types_036.c0000644000175100017510000000517312575647263020343 0ustar mohanmohan/* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include "marshal_hpi_types.h" #include #include #include static int cmp_hotswapevent( SaHpiHotSwapEventT *d1, SaHpiHotSwapEventT *d2 ) { if ( d1->HotSwapState != d2->HotSwapState ) return 0; if ( d1->PreviousHotSwapState != d2->PreviousHotSwapState ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiHotSwapEventT m_v1; tUint8 m_pad2; SaHpiHotSwapEventT m_v2; SaHpiHotSwapEventT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiHotSwapEventType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiHotSwapEventType ), dStructElement( cTest, m_v3 , SaHpiHotSwapEventType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.HotSwapState = SAHPI_HS_STATE_INACTIVE, .m_v1.PreviousHotSwapState = SAHPI_HS_STATE_ACTIVE, .m_pad2 = 48, .m_v2.HotSwapState = SAHPI_HS_STATE_ACTIVE, .m_v2.PreviousHotSwapState = SAHPI_HS_STATE_INACTIVE, .m_v3.HotSwapState = SAHPI_HS_STATE_NOT_PRESENT, .m_v3.PreviousHotSwapState = SAHPI_HS_STATE_ACTIVE, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_hotswapevent( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_hotswapevent( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_hotswapevent( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_hpi_types_009.c0000644000175100017510000000511312575647263020335 0ustar mohanmohan/* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include "marshal_hpi_types.h" #include #include #include static int cmp_ctrlstatestream( SaHpiCtrlStateStreamT *d1, SaHpiCtrlStateStreamT *d2 ) { if ( d1->Repeat != d2->Repeat ) return 0; if ( d1->StreamLength != d2->StreamLength ) return 0; if ( memcmp(d1->Stream, d2->Stream, SAHPI_CTRL_MAX_STREAM_LENGTH) != 0 ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiCtrlStateStreamT m_v1; tUint8 m_pad2; SaHpiCtrlStateStreamT m_v2; SaHpiCtrlStateStreamT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiCtrlStateStreamType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiCtrlStateStreamType ), dStructElement( cTest, m_v3 , SaHpiCtrlStateStreamType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.Repeat = 0, .m_v1.StreamLength = 4, .m_v1.Stream = {'A', 'B', 'c', 'd'}, .m_pad2 = 48, .m_v2.Repeat = 1, .m_v2.StreamLength = 4, .m_v2.Stream = {'d', 'c', 'B', 'A'}, .m_v3.Repeat = 1, .m_v3.StreamLength = 1, .m_v3.Stream = {'A'}, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_ctrlstatestream( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_ctrlstatestream( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_ctrlstatestream( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_hpi_types_042.c0000644000175100017510000001061312575647264020334 0ustar mohanmohan/* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include "marshal_hpi_types.h" #include #include #include static int cmp_resourceinfo( SaHpiResourceInfoT *d1, SaHpiResourceInfoT *d2 ) { int i; if ( d1->ResourceRev != d2->ResourceRev ) return 0; if ( d1->SpecificVer != d2->SpecificVer ) return 0; if ( d1->DeviceSupport != d2->DeviceSupport ) return 0; if ( d1->ManufacturerId != d2->ManufacturerId ) return 0; if ( d1->ProductId != d2->ProductId ) return 0; if ( d1->FirmwareMajorRev != d2->FirmwareMajorRev ) return 0; if ( d1->FirmwareMinorRev != d2->FirmwareMinorRev ) return 0; if ( d1->AuxFirmwareRev != d2->AuxFirmwareRev ) return 0; for (i = 0; i < 16; i++) { if ( d1->Guid[i] != d2->Guid[i] ) return 0; } return 1; } typedef struct { tUint8 m_pad1; SaHpiResourceInfoT m_v1; tUint8 m_pad2; SaHpiResourceInfoT m_v2; SaHpiResourceInfoT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiResourceInfoType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiResourceInfoType ), dStructElement( cTest, m_v3 , SaHpiResourceInfoType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.ResourceRev = 1, .m_v1.SpecificVer = 1, .m_v1.DeviceSupport = 0, .m_v1.ManufacturerId = 10, .m_v1.ProductId = 10, .m_v1.FirmwareMajorRev = 3, .m_v1.FirmwareMinorRev = 3, .m_v1.AuxFirmwareRev = 0, .m_v1.Guid = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, .m_pad2 = 48, .m_v2.ResourceRev = 1, .m_v2.SpecificVer = 1, .m_v2.DeviceSupport = 0, .m_v2.ManufacturerId = 10, .m_v2.ProductId = 10, .m_v2.FirmwareMajorRev = 3, .m_v2.FirmwareMinorRev = 3, .m_v2.AuxFirmwareRev = 0, .m_v2.Guid = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, .m_v3.ResourceRev = 1, .m_v3.SpecificVer = 1, .m_v3.DeviceSupport = 0, .m_v3.ManufacturerId = 10, .m_v3.ProductId = 10, .m_v3.FirmwareMajorRev = 3, .m_v3.FirmwareMinorRev = 3, .m_v3.AuxFirmwareRev = 0, .m_v3.Guid = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_resourceinfo( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_resourceinfo( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_resourceinfo( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-3.6.1/marshal/t/Makefile.am0000644000175100017510000003064312575647264016131 0ustar mohanmohan# # Copyright (c) 2004 by FORCE Computers. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # # Authors: # Thomas Kanngieser # MARSHAL_SRCDIR = $(top_srcdir)/marshal REMOTE_SOURCES = marshal.c MARSHAL_SOURCES = marshal_hpi_types.c MOSTLYCLEANFILES = $(REMOTE_SOURCES) $(MARSHAL_SOURCES) @TEST_CLEAN@ MAINTAINERCLEANFILES = Makefile.in *~ AM_CPPFLAGS = -DG_LOG_DOMAIN=\"t\" AM_CPPFLAGS += -I $(MARSHAL_SRCDIR) @OPENHPI_INCLUDES@ noinst_PROGRAMS = float_format float_format_SOURCES = float_format.c CLEANFILES=float32.bin float64.bin *~ $(REMOTE_SOURCES): if test ! -f $@ -a ! -L $@; then \ ln -s $(MARSHAL_SRCDIR)/$@; \ fi $(MARSHAL_SOURCES): if test ! -f $@ -a ! -L $@; then \ ln -s $(MARSHAL_SRCDIR)/$@; \ fi TESTS = \ marshal_000 \ marshal_001 \ marshal_002 \ marshal_003 \ marshal_004 \ marshal_005 \ marshal_006 \ marshal_007 \ marshal_008 \ marshal_009 \ marshal_010 \ marshal_011 \ marshal_012 \ marshal_013 \ marshal_014 \ marshal_015 \ marshal_016 \ marshal_017 \ marshal_018 \ marshal_019 \ marshal_020 \ marshal_021 \ marshal_022 \ marshal_023 \ marshal_024 \ marshal_025 \ marshal_026 \ marshal_027 \ marshal_028 \ marshal_029 \ marshal_030 \ marshal_031 \ marshal_hpi_types_000 \ marshal_hpi_types_001 \ marshal_hpi_types_002 \ marshal_hpi_types_003 \ marshal_hpi_types_004 \ marshal_hpi_types_005 \ marshal_hpi_types_006 \ marshal_hpi_types_007 \ marshal_hpi_types_008 \ marshal_hpi_types_009 \ marshal_hpi_types_010 \ marshal_hpi_types_011 \ marshal_hpi_types_012 \ marshal_hpi_types_013 \ marshal_hpi_types_014 \ marshal_hpi_types_015 \ marshal_hpi_types_016 \ marshal_hpi_types_017 \ marshal_hpi_types_018 \ marshal_hpi_types_019 \ marshal_hpi_types_020 \ marshal_hpi_types_021 \ marshal_hpi_types_022 \ marshal_hpi_types_023 \ marshal_hpi_types_024 \ marshal_hpi_types_025 \ marshal_hpi_types_026 \ marshal_hpi_types_027 \ marshal_hpi_types_028 \ marshal_hpi_types_029 \ marshal_hpi_types_030 \ marshal_hpi_types_031 \ marshal_hpi_types_032 \ marshal_hpi_types_033 \ marshal_hpi_types_034 \ marshal_hpi_types_035 \ marshal_hpi_types_036 \ marshal_hpi_types_037 \ marshal_hpi_types_038 \ marshal_hpi_types_039 \ marshal_hpi_types_040 \ marshal_hpi_types_041 \ marshal_hpi_types_042 \ marshal_hpi_types_043 \ marshal_hpi_types_044 \ marshal_hpi_types_045 \ marshal_hpi_types_046 \ marshal_hpi_types_047 \ marshal_hpi_types_048 # connection_seq_000 \ # connection_000 \ # connection_001 check_PROGRAMS = $(TESTS) #connection_000_SOURCES = connection_000.c $(REMOTE_SOURCES) #connection_seq_000_SOURCES = connection_seq_000.c $(REMOTE_SOURCES) #connection_001_SOURCES = connection_001.c $(REMOTE_SOURCES) marshal_000_SOURCES = marshal_000.c nodist_marshal_000_SOURCES = $(REMOTE_SOURCES) marshal_001_SOURCES = marshal_001.c nodist_marshal_001_SOURCES = $(REMOTE_SOURCES) marshal_002_SOURCES = marshal_002.c nodist_marshal_002_SOURCES = $(REMOTE_SOURCES) marshal_003_SOURCES = marshal_003.c nodist_marshal_003_SOURCES = $(REMOTE_SOURCES) marshal_004_SOURCES = marshal_004.c nodist_marshal_004_SOURCES = $(REMOTE_SOURCES) marshal_005_SOURCES = marshal_005.c nodist_marshal_005_SOURCES = $(REMOTE_SOURCES) marshal_006_SOURCES = marshal_006.c nodist_marshal_006_SOURCES = $(REMOTE_SOURCES) marshal_007_SOURCES = marshal_007.c nodist_marshal_007_SOURCES = $(REMOTE_SOURCES) marshal_008_SOURCES = marshal_008.c nodist_marshal_008_SOURCES = $(REMOTE_SOURCES) marshal_009_SOURCES = marshal_009.c nodist_marshal_009_SOURCES = $(REMOTE_SOURCES) marshal_010_SOURCES = marshal_010.c nodist_marshal_010_SOURCES = $(REMOTE_SOURCES) marshal_011_SOURCES = marshal_011.c nodist_marshal_011_SOURCES = $(REMOTE_SOURCES) marshal_012_SOURCES = marshal_012.c nodist_marshal_012_SOURCES = $(REMOTE_SOURCES) marshal_013_SOURCES = marshal_013.c nodist_marshal_013_SOURCES = $(REMOTE_SOURCES) marshal_014_SOURCES = marshal_014.c nodist_marshal_014_SOURCES = $(REMOTE_SOURCES) marshal_015_SOURCES = marshal_015.c nodist_marshal_015_SOURCES = $(REMOTE_SOURCES) marshal_016_SOURCES = marshal_016.c nodist_marshal_016_SOURCES = $(REMOTE_SOURCES) marshal_017_SOURCES = marshal_017.c nodist_marshal_017_SOURCES = $(REMOTE_SOURCES) marshal_018_SOURCES = marshal_018.c nodist_marshal_018_SOURCES = $(REMOTE_SOURCES) marshal_019_SOURCES = marshal_019.c nodist_marshal_019_SOURCES = $(REMOTE_SOURCES) marshal_020_SOURCES = marshal_020.c nodist_marshal_020_SOURCES = $(REMOTE_SOURCES) marshal_021_SOURCES = marshal_021.c nodist_marshal_021_SOURCES = $(REMOTE_SOURCES) marshal_022_SOURCES = marshal_022.c nodist_marshal_022_SOURCES = $(REMOTE_SOURCES) marshal_023_SOURCES = marshal_023.c nodist_marshal_023_SOURCES = $(REMOTE_SOURCES) marshal_024_SOURCES = marshal_024.c nodist_marshal_024_SOURCES = $(REMOTE_SOURCES) marshal_025_SOURCES = marshal_025.c nodist_marshal_025_SOURCES = $(REMOTE_SOURCES) marshal_026_SOURCES = marshal_026.c nodist_marshal_026_SOURCES = $(REMOTE_SOURCES) marshal_027_SOURCES = marshal_027.c nodist_marshal_027_SOURCES = $(REMOTE_SOURCES) marshal_028_SOURCES = marshal_028.c nodist_marshal_028_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_029_SOURCES = marshal_029.c nodist_marshal_029_SOURCES = $(REMOTE_SOURCES) marshal_030_SOURCES = marshal_030.c nodist_marshal_030_SOURCES = $(REMOTE_SOURCES) marshal_031_SOURCES = marshal_031.c nodist_marshal_031_SOURCES = $(REMOTE_SOURCES) marshal_hpi_types_000_SOURCES = marshal_hpi_types_000.c nodist_marshal_hpi_types_000_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_001_SOURCES = marshal_hpi_types_001.c nodist_marshal_hpi_types_001_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_002_SOURCES = marshal_hpi_types_002.c nodist_marshal_hpi_types_002_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_003_SOURCES = marshal_hpi_types_003.c nodist_marshal_hpi_types_003_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_004_SOURCES = marshal_hpi_types_004.c nodist_marshal_hpi_types_004_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_005_SOURCES = marshal_hpi_types_005.c nodist_marshal_hpi_types_005_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_006_SOURCES = marshal_hpi_types_006.c nodist_marshal_hpi_types_006_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_007_SOURCES = marshal_hpi_types_007.c nodist_marshal_hpi_types_007_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_008_SOURCES = marshal_hpi_types_008.c nodist_marshal_hpi_types_008_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_009_SOURCES = marshal_hpi_types_009.c nodist_marshal_hpi_types_009_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_010_SOURCES = marshal_hpi_types_010.c nodist_marshal_hpi_types_010_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_011_SOURCES = marshal_hpi_types_011.c nodist_marshal_hpi_types_011_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_012_SOURCES = marshal_hpi_types_012.c nodist_marshal_hpi_types_012_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_013_SOURCES = marshal_hpi_types_013.c nodist_marshal_hpi_types_013_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_014_SOURCES = marshal_hpi_types_014.c nodist_marshal_hpi_types_014_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_015_SOURCES = marshal_hpi_types_015.c nodist_marshal_hpi_types_015_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_016_SOURCES = marshal_hpi_types_016.c nodist_marshal_hpi_types_016_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_017_SOURCES = marshal_hpi_types_017.c nodist_marshal_hpi_types_017_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_018_SOURCES = marshal_hpi_types_018.c nodist_marshal_hpi_types_018_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_019_SOURCES = marshal_hpi_types_019.c nodist_marshal_hpi_types_019_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_020_SOURCES = marshal_hpi_types_020.c nodist_marshal_hpi_types_020_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_021_SOURCES = marshal_hpi_types_021.c nodist_marshal_hpi_types_021_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_022_SOURCES = marshal_hpi_types_022.c nodist_marshal_hpi_types_022_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_023_SOURCES = marshal_hpi_types_023.c nodist_marshal_hpi_types_023_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_024_SOURCES = marshal_hpi_types_024.c nodist_marshal_hpi_types_024_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_025_SOURCES = marshal_hpi_types_025.c nodist_marshal_hpi_types_025_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_026_SOURCES = marshal_hpi_types_026.c nodist_marshal_hpi_types_026_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_027_SOURCES = marshal_hpi_types_027.c nodist_marshal_hpi_types_027_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_028_SOURCES = marshal_hpi_types_028.c nodist_marshal_hpi_types_028_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_029_SOURCES = marshal_hpi_types_029.c nodist_marshal_hpi_types_029_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_030_SOURCES = marshal_hpi_types_030.c nodist_marshal_hpi_types_030_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_031_SOURCES = marshal_hpi_types_031.c nodist_marshal_hpi_types_031_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_032_SOURCES = marshal_hpi_types_032.c nodist_marshal_hpi_types_032_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_033_SOURCES = marshal_hpi_types_033.c nodist_marshal_hpi_types_033_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_034_SOURCES = marshal_hpi_types_034.c nodist_marshal_hpi_types_034_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_035_SOURCES = marshal_hpi_types_035.c nodist_marshal_hpi_types_035_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_036_SOURCES = marshal_hpi_types_036.c nodist_marshal_hpi_types_036_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_037_SOURCES = marshal_hpi_types_037.c nodist_marshal_hpi_types_037_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_038_SOURCES = marshal_hpi_types_038.c nodist_marshal_hpi_types_038_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_039_SOURCES = marshal_hpi_types_039.c nodist_marshal_hpi_types_039_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_040_SOURCES = marshal_hpi_types_040.c nodist_marshal_hpi_types_040_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_041_SOURCES = marshal_hpi_types_041.c nodist_marshal_hpi_types_041_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_042_SOURCES = marshal_hpi_types_042.c nodist_marshal_hpi_types_042_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_043_SOURCES = marshal_hpi_types_043.c nodist_marshal_hpi_types_043_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_044_SOURCES = marshal_hpi_types_044.c nodist_marshal_hpi_types_044_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_045_SOURCES = marshal_hpi_types_045.c nodist_marshal_hpi_types_045_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_046_SOURCES = marshal_hpi_types_046.c nodist_marshal_hpi_types_046_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_047_SOURCES = marshal_hpi_types_047.c nodist_marshal_hpi_types_047_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_048_SOURCES = marshal_hpi_types_048.c nodist_marshal_hpi_types_048_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) openhpi-3.6.1/marshal/t/marshal_017.c0000644000175100017510000000164012575647264016252 0ustar mohanmohan/* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include #include "marshal.h" #include int main( int argc, char *argv[] ) { tInt32 value = 0x42aa1234; tInt32 swap = GUINT32_SWAP_LE_BE( value ); tInt32 result; unsigned int s = Demarshal( G_BYTE_ORDER == G_LITTLE_ENDIAN ? G_BIG_ENDIAN : G_LITTLE_ENDIAN, &Marshal_Int32Type, &result, &swap ); if ( s != sizeof( tInt32 ) ) return 1; if ( value != result ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_hpi_types_021.c0000644000175100017510000000710412575647264020332 0ustar mohanmohan/* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include "marshal_hpi_types.h" #include #include #include static int cmp_text_buffer( SaHpiTextBufferT *d1, SaHpiTextBufferT *d2 ) { if ( d1->DataType != d2->DataType ) return 0; if ( d1->Language != d2->Language ) return 0; if ( d1->DataLength != d2->DataLength ) return 0; return memcmp( d1->Data, d2->Data, d1->DataLength ) ? 0 : 1; } static int cmp_idrfield( SaHpiIdrFieldT *d1, SaHpiIdrFieldT *d2 ) { if ( d1->AreaId != d2->AreaId ) return 0; if ( d1->FieldId != d2->FieldId ) return 0; if ( d1->Type != d2->Type ) return 0; if ( d1->ReadOnly != d2->ReadOnly ) return 0; if ( !cmp_text_buffer( &d1->Field, &d2->Field ) ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiIdrFieldT m_v1; tUint8 m_pad2; SaHpiIdrFieldT m_v2; SaHpiIdrFieldT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiIdrFieldType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiIdrFieldType ), dStructElement( cTest, m_v3 , SaHpiIdrFieldType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.AreaId = 1, .m_v1.FieldId = 1, .m_v1.Type = SAHPI_IDR_FIELDTYPE_CUSTOM, .m_v1.ReadOnly = FALSE, .m_v1.Field.DataType = SAHPI_TL_TYPE_BINARY, .m_v1.Field.Language = SAHPI_LANG_TSONGA, .m_v1.Field.DataLength = 3, .m_v1.Field.Data = "AB", .m_pad2 = 48, .m_v2.AreaId = 2, .m_v2.FieldId = 2, .m_v2.Type = SAHPI_IDR_FIELDTYPE_PART_NUMBER, .m_v2.ReadOnly = FALSE, .m_v2.Field.DataType = SAHPI_TL_TYPE_BCDPLUS, .m_v2.Field.Language = SAHPI_LANG_SANGRO, .m_v2.Field.DataLength = 21, .m_v2.Field.Data = "12345678901234567890", .m_v3.AreaId = 3, .m_v3.FieldId = 3, .m_v3.Type = SAHPI_IDR_FIELDTYPE_CHASSIS_TYPE, .m_v3.ReadOnly = TRUE, .m_v3.Field.DataType = SAHPI_TL_TYPE_ASCII6, .m_v3.Field.Language = SAHPI_LANG_TAJIK, .m_v3.Field.DataLength = 0, .m_v3.Field.Data = "", .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_idrfield( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_idrfield( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_idrfield( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_hpi_types_025.c0000644000175100017510000000732012575647264020336 0ustar mohanmohan/* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include "marshal_hpi_types.h" #include #include #include static int cmp_watchdog( SaHpiWatchdogT *d1, SaHpiWatchdogT *d2 ) { if ( d1->Log != d2->Log ) return 0; if ( d1->Running != d2->Running ) return 0; if ( d1->TimerUse != d2->TimerUse ) return 0; if ( d1->TimerAction != d2->TimerAction ) return 0; if ( d1->PretimerInterrupt != d2->PretimerInterrupt ) return 0; if ( d1->PreTimeoutInterval != d2->PreTimeoutInterval ) return 0; if ( d1->TimerUseExpFlags != d2->TimerUseExpFlags ) return 0; if ( d1->InitialCount != d2->InitialCount ) return 0; if ( d1->PresentCount != d2->PresentCount ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiWatchdogT m_v1; tUint8 m_pad2; SaHpiWatchdogT m_v2; SaHpiWatchdogT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiWatchdogType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiWatchdogType ), dStructElement( cTest, m_v3 , SaHpiWatchdogType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.Log = TRUE, .m_v1.Running = TRUE, .m_v1.TimerUse = SAHPI_WTU_NONE, .m_v1.TimerAction = SAHPI_WA_NO_ACTION, .m_v1.PretimerInterrupt = SAHPI_WPI_NONE, .m_v1.PreTimeoutInterval = 100, .m_v1.TimerUseExpFlags = SAHPI_WATCHDOG_EXP_BIOS_FRB2, .m_v1.InitialCount = 0, .m_v1.PresentCount = 0, .m_pad2 = 48, .m_v2.Log = FALSE, .m_v2.Running = FALSE, .m_v2.TimerUse = SAHPI_WTU_BIOS_FRB2, .m_v2.TimerAction = SAHPI_WA_RESET, .m_v2.PretimerInterrupt = SAHPI_WPI_SMI, .m_v2.PreTimeoutInterval = 1100, .m_v2.TimerUseExpFlags = SAHPI_WATCHDOG_EXP_BIOS_FRB2, .m_v2.InitialCount = 1, .m_v2.PresentCount = 1, .m_v3.Log = TRUE, .m_v3.Running = FALSE, .m_v3.TimerUse = SAHPI_WTU_BIOS_POST, .m_v3.TimerAction = SAHPI_WA_POWER_CYCLE, .m_v3.PretimerInterrupt = SAHPI_WPI_OEM, .m_v3.PreTimeoutInterval = 100, .m_v3.TimerUseExpFlags = SAHPI_WATCHDOG_EXP_OEM, .m_v3.InitialCount = 1, .m_v3.PresentCount = 0, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_watchdog( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_watchdog( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_watchdog( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_hpi_types_007.c0000644000175100017510000000534512575647263020342 0ustar mohanmohan/* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include "marshal_hpi_types.h" #include #include #include static int cmp_thddefn( SaHpiSensorThdDefnT *d1, SaHpiSensorThdDefnT *d2 ) { if ( d1->IsAccessible != d2->IsAccessible ) return 0; if ( d1->ReadThold != d2->ReadThold ) return 0; if ( d1->WriteThold != d2->WriteThold ) return 0; if ( d1->Nonlinear != d2->Nonlinear ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiSensorThdDefnT m_v1; tUint8 m_pad2; SaHpiSensorThdDefnT m_v2; SaHpiSensorThdDefnT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiSensorThdDefnType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiSensorThdDefnType ), dStructElement( cTest, m_v3 , SaHpiSensorThdDefnType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.IsAccessible = TRUE, .m_v1.ReadThold = SAHPI_STM_LOW_MINOR, .m_v1.WriteThold = SAHPI_STM_UP_CRIT, .m_v1.Nonlinear = FALSE, .m_pad2 = 48, .m_v2.IsAccessible = TRUE, .m_v2.ReadThold = SAHPI_STM_LOW_MAJOR, .m_v2.WriteThold = SAHPI_STM_UP_MAJOR, .m_v2.Nonlinear = FALSE, .m_v3.IsAccessible = TRUE, .m_v3.ReadThold = SAHPI_STM_UP_CRIT, .m_v3.WriteThold = SAHPI_STM_LOW_CRIT, .m_v3.Nonlinear = FALSE, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_thddefn( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_thddefn( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_thddefn( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_hpi_types_004.c0000644000175100017510000002114212575647264020331 0ustar mohanmohan/* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include "marshal_hpi_types.h" #include #include #include static int cmp_sensorreading( SaHpiSensorReadingT *d1, SaHpiSensorReadingT *d2 ) { if ( d1->IsSupported != d2->IsSupported ) return 0; if ( d1->Type != d2->Type ) return 0; if ( d1->Value.SensorInt64 != d2->Value.SensorInt64 ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiSensorThresholdsT m_v1; tUint8 m_pad2; SaHpiSensorThresholdsT m_v2; SaHpiSensorThresholdsT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiSensorThresholdsType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiSensorThresholdsType ), dStructElement( cTest, m_v3 , SaHpiSensorThresholdsType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.LowCritical.IsSupported = TRUE, .m_v1.LowCritical.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v1.LowCritical.Value = {-21}, .m_v1.LowMajor.IsSupported = TRUE, .m_v1.LowMajor.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v1.LowMajor.Value = {-21}, .m_v1.LowMinor.IsSupported = TRUE, .m_v1.LowMinor.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v1.LowMinor.Value = {-10}, .m_v1.UpCritical.IsSupported = TRUE, .m_v1.UpCritical.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v1.UpCritical.Value = {21}, .m_v1.UpMajor.IsSupported = TRUE, .m_v1.UpMajor.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v1.UpMajor.Value = {21}, .m_v1.UpMinor.IsSupported = TRUE, .m_v1.UpMinor.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v1.UpMinor.Value = {10}, .m_v1.PosThdHysteresis.IsSupported = TRUE, .m_v1.PosThdHysteresis.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v1.PosThdHysteresis.Value = {5}, .m_v1.NegThdHysteresis.IsSupported = TRUE, .m_v1.NegThdHysteresis.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v1.NegThdHysteresis.Value = {-5}, .m_pad2 = 48, .m_v2.LowCritical.IsSupported = TRUE, .m_v2.LowCritical.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v2.LowCritical.Value = {-21}, .m_v2.LowMajor.IsSupported = FALSE, .m_v2.LowMajor.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v2.LowMajor.Value = {-21}, .m_v2.LowMinor.IsSupported = TRUE, .m_v2.LowMinor.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v2.LowMinor.Value = {-10}, .m_v2.UpCritical.IsSupported = TRUE, .m_v2.UpCritical.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v2.UpCritical.Value = {21}, .m_v2.UpMajor.IsSupported = FALSE, .m_v2.UpMajor.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v2.UpMajor.Value = {21}, .m_v2.UpMinor.IsSupported = TRUE, .m_v2.UpMinor.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v2.UpMinor.Value = {10}, .m_v2.PosThdHysteresis.IsSupported = TRUE, .m_v2.PosThdHysteresis.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v2.PosThdHysteresis.Value = {5}, .m_v2.NegThdHysteresis.IsSupported = TRUE, .m_v2.NegThdHysteresis.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v2.NegThdHysteresis.Value = {-5}, .m_v3.LowCritical.IsSupported = TRUE, .m_v3.LowCritical.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v3.LowCritical.Value = {-21}, .m_v3.LowMajor.IsSupported = TRUE, .m_v3.LowMajor.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v3.LowMajor.Value = {-21}, .m_v3.LowMinor.IsSupported = TRUE, .m_v3.LowMinor.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v3.LowMinor.Value = {-10}, .m_v3.UpCritical.IsSupported = TRUE, .m_v3.UpCritical.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v3.UpCritical.Value = {21}, .m_v3.UpMajor.IsSupported = TRUE, .m_v3.UpMajor.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v3.UpMajor.Value = {21}, .m_v3.UpMinor.IsSupported = TRUE, .m_v3.UpMinor.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v3.UpMinor.Value = {10}, .m_v3.PosThdHysteresis.IsSupported = FALSE, .m_v3.PosThdHysteresis.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v3.PosThdHysteresis.Value = {5}, .m_v3.NegThdHysteresis.IsSupported = FALSE, .m_v3.NegThdHysteresis.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v3.NegThdHysteresis.Value = {-5}, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_sensorreading( &value.m_v1.LowCritical, &result.m_v1.LowCritical ) ) return 1; if ( !cmp_sensorreading( &value.m_v1.LowMajor, &result.m_v1.LowMajor ) ) return 1; if ( !cmp_sensorreading( &value.m_v1.LowMinor, &result.m_v1.LowMinor ) ) return 1; if ( !cmp_sensorreading( &value.m_v1.UpCritical, &result.m_v1.UpCritical ) ) return 1; if ( !cmp_sensorreading( &value.m_v1.UpMajor, &result.m_v1.UpMajor ) ) return 1; if ( !cmp_sensorreading( &value.m_v1.UpMinor, &result.m_v1.UpMinor ) ) return 1; if ( !cmp_sensorreading( &value.m_v1.PosThdHysteresis, &result.m_v1.PosThdHysteresis ) ) return 1; if ( !cmp_sensorreading( &value.m_v1.NegThdHysteresis, &result.m_v1.NegThdHysteresis ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_sensorreading( &value.m_v2.LowCritical, &result.m_v2.LowCritical ) ) return 1; if ( !cmp_sensorreading( &value.m_v2.LowMajor, &result.m_v2.LowMajor ) ) return 1; if ( !cmp_sensorreading( &value.m_v2.LowMinor, &result.m_v2.LowMinor ) ) return 1; if ( !cmp_sensorreading( &value.m_v2.UpCritical, &result.m_v2.UpCritical ) ) return 1; if ( !cmp_sensorreading( &value.m_v2.UpMajor, &result.m_v2.UpMajor ) ) return 1; if ( !cmp_sensorreading( &value.m_v2.UpMinor, &result.m_v2.UpMinor ) ) return 1; if ( !cmp_sensorreading( &value.m_v2.PosThdHysteresis, &result.m_v2.PosThdHysteresis ) ) return 1; if ( !cmp_sensorreading( &value.m_v2.NegThdHysteresis, &result.m_v2.NegThdHysteresis ) ) return 1; if ( !cmp_sensorreading( &value.m_v3.LowCritical, &result.m_v3.LowCritical ) ) return 1; if ( !cmp_sensorreading( &value.m_v3.LowMajor, &result.m_v3.LowMajor ) ) return 1; if ( !cmp_sensorreading( &value.m_v3.LowMinor, &result.m_v3.LowMinor ) ) return 1; if ( !cmp_sensorreading( &value.m_v3.UpCritical, &result.m_v3.UpCritical ) ) return 1; if ( !cmp_sensorreading( &value.m_v3.UpMajor, &result.m_v3.UpMajor ) ) return 1; if ( !cmp_sensorreading( &value.m_v3.UpMinor, &result.m_v3.UpMinor ) ) return 1; if ( !cmp_sensorreading( &value.m_v3.PosThdHysteresis, &result.m_v3.PosThdHysteresis ) ) return 1; if ( !cmp_sensorreading( &value.m_v3.NegThdHysteresis, &result.m_v3.NegThdHysteresis ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_hpi_types_034.c0000644000175100017510000001326112575647263020336 0ustar mohanmohan/* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include "marshal_hpi_types.h" #include #include #include static int cmp_sensorreading( SaHpiSensorReadingT *d1, SaHpiSensorReadingT *d2 ) { if ( d1->IsSupported != d2->IsSupported ) return 0; if ( d1->Type != d2->Type ) return 0; if ( d1->Value.SensorInt64 != d2->Value.SensorInt64 ) return 0; return 1; } static int cmp_sensorevent( SaHpiSensorEventT *d1, SaHpiSensorEventT *d2 ) { if ( d1->SensorNum != d2->SensorNum ) return 0; if ( d1->SensorType != d2->SensorType ) return 0; if ( d1->EventCategory != d2->EventCategory ) return 0; if ( d1->Assertion != d2->Assertion ) return 0; if ( d1->EventState != d2->EventState ) return 0; if ( d1->OptionalDataPresent != d2->OptionalDataPresent ) return 0; if ( !cmp_sensorreading( &d1->TriggerReading, &d2->TriggerReading ) ) return 0; if ( !cmp_sensorreading( &d1->TriggerThreshold, &d2->TriggerThreshold ) ) return 0; if ( d1->PreviousState != d2->PreviousState ) return 0; if ( d1->CurrentState != d2->CurrentState ) return 0; if ( d1->Oem != d2->Oem ) return 0; if ( d1->SensorSpecific != d2->SensorSpecific ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiSensorEventT m_v1; tUint8 m_pad2; SaHpiSensorEventT m_v2; SaHpiSensorEventT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiSensorEventType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiSensorEventType ), dStructElement( cTest, m_v3 , SaHpiSensorEventType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.SensorNum = 1, .m_v1.SensorType = SAHPI_TEMPERATURE, .m_v1.EventCategory = SAHPI_EC_THRESHOLD, .m_v1.Assertion = TRUE, .m_v1.EventState = SAHPI_ES_UPPER_MAJOR, .m_v1.OptionalDataPresent = 1, .m_v1.TriggerReading.IsSupported = TRUE, .m_v1.TriggerReading.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v1.TriggerReading.Value = {21}, .m_v1.TriggerThreshold.IsSupported = TRUE, .m_v1.TriggerThreshold.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v1.TriggerThreshold.Value = {20}, .m_v1.PreviousState = SAHPI_ES_ACTIVE, .m_v1.CurrentState = SAHPI_ES_UPPER_MAJOR, .m_v1.Oem = 0, .m_v1.SensorSpecific = 0, .m_pad2 = 48, .m_v2.SensorNum = 2, .m_v2.SensorType = SAHPI_BATTERY, .m_v2.EventCategory = SAHPI_EC_THRESHOLD, .m_v2.Assertion = TRUE, .m_v2.EventState = SAHPI_ES_UPPER_MAJOR, .m_v2.OptionalDataPresent = 1, .m_v2.TriggerReading.IsSupported = TRUE, .m_v2.TriggerReading.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v2.TriggerReading.Value = {11}, .m_v2.TriggerThreshold.IsSupported = TRUE, .m_v2.TriggerThreshold.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v2.TriggerThreshold.Value = {10}, .m_v2.PreviousState = SAHPI_ES_ACTIVE, .m_v2.CurrentState = SAHPI_ES_UPPER_MAJOR, .m_v2.Oem = 1, .m_v2.SensorSpecific = 1, .m_v3.SensorNum = 3, .m_v3.SensorType = SAHPI_VOLTAGE, .m_v3.EventCategory = SAHPI_EC_THRESHOLD, .m_v3.Assertion = TRUE, .m_v3.EventState = SAHPI_ES_UPPER_MAJOR, .m_v3.OptionalDataPresent = 1, .m_v3.TriggerReading.IsSupported = TRUE, .m_v3.TriggerReading.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v3.TriggerReading.Value = {6}, .m_v3.TriggerThreshold.IsSupported = TRUE, .m_v3.TriggerThreshold.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v3.TriggerThreshold.Value = {5}, .m_v3.PreviousState = SAHPI_ES_ACTIVE, .m_v3.CurrentState = SAHPI_ES_UPPER_MAJOR, .m_v3.Oem = 10, .m_v3.SensorSpecific = 10, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_sensorevent( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_sensorevent( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_sensorevent( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_hpi_types_020.c0000644000175100017510000001042012575647263020323 0ustar mohanmohan/* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include "marshal_hpi_types.h" #include #include #include static int cmp_ctrlrecanalog( SaHpiCtrlRecAnalogT *d1, SaHpiCtrlRecAnalogT *d2 ) { if ( d1->Min != d2->Min ) return 0; if ( d1->Max != d2->Max ) return 0; if ( d1->Default != d2->Default ) return 0; return 1; } static int cmp_ctrldefaultmode( SaHpiCtrlDefaultModeT *d1, SaHpiCtrlDefaultModeT *d2 ) { if ( d1->Mode != d2->Mode ) return 0; if ( d1->ReadOnly != d2->ReadOnly ) return 0; return 1; } static int cmp_ctrlrec( SaHpiCtrlRecT *d1, SaHpiCtrlRecT *d2 ) { if ( d1->Num != d2->Num ) return 0; if ( d1->OutputType != d2->OutputType ) return 0; if ( d1->Type != d2->Type ) return 0; if ( !cmp_ctrlrecanalog( &d1->TypeUnion.Analog, &d2->TypeUnion.Analog ) ) return 0; if ( !cmp_ctrldefaultmode( &d1->DefaultMode, &d2->DefaultMode ) ) return 0; if ( d1->WriteOnly != d2->WriteOnly ) return 0; if ( d1->Oem != d2->Oem ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiCtrlRecT m_v1; tUint8 m_pad2; SaHpiCtrlRecT m_v2; SaHpiCtrlRecT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiCtrlRecType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiCtrlRecType ), dStructElement( cTest, m_v3 , SaHpiCtrlRecType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.Num = 1, .m_v1.OutputType = SAHPI_CTRL_GENERIC, .m_v1.Type = SAHPI_CTRL_TYPE_ANALOG, .m_v1.TypeUnion.Analog.Min = -5, .m_v1.TypeUnion.Analog.Max = 5, .m_v1.TypeUnion.Analog.Default = 0, .m_v1.DefaultMode.Mode = SAHPI_CTRL_MODE_AUTO, .m_v1.DefaultMode.ReadOnly = FALSE, .m_v1.WriteOnly = FALSE, .m_v1.Oem = 0, .m_pad2 = 48, .m_v2.Num = 1, .m_v2.OutputType = SAHPI_CTRL_FAN_SPEED, .m_v2.Type = SAHPI_CTRL_TYPE_ANALOG, .m_v2.TypeUnion.Analog.Min = -10, .m_v2.TypeUnion.Analog.Max = 3, .m_v2.TypeUnion.Analog.Default = 1, .m_v2.DefaultMode.Mode = SAHPI_CTRL_MODE_AUTO, .m_v2.DefaultMode.ReadOnly = TRUE, .m_v2.WriteOnly = FALSE, .m_v2.Oem = 0, .m_v3.Num = 1, .m_v3.OutputType = SAHPI_CTRL_AUDIBLE, .m_v3.Type = SAHPI_CTRL_TYPE_ANALOG, .m_v3.TypeUnion.Analog.Min = 0, .m_v3.TypeUnion.Analog.Max = 20, .m_v3.TypeUnion.Analog.Default = 10, .m_v3.DefaultMode.Mode = SAHPI_CTRL_MODE_MANUAL, .m_v3.DefaultMode.ReadOnly = FALSE, .m_v3.WriteOnly = TRUE, .m_v3.Oem = 0, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_ctrlrec( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_ctrlrec( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_ctrlrec( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_hpi_types_001.c0000644000175100017510000000451312575647263020330 0ustar mohanmohan/* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include "marshal_hpi_types.h" #include #include #include static int cmp_entities( SaHpiEntityT *d1, SaHpiEntityT *d2 ) { if ( d1->EntityType != d2->EntityType ) return 0; if ( d1->EntityLocation != d2->EntityLocation ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiEntityT m_v1; tUint8 m_pad2; SaHpiEntityT m_v2; SaHpiEntityT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiEntityType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiEntityType ), dStructElement( cTest, m_v3 , SaHpiEntityType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.EntityType = SAHPI_ENT_SYSTEM_BOARD, .m_v1.EntityLocation = 1, .m_pad2 = 48, .m_v2.EntityType = SAHPI_ENT_POWER_MODULE, .m_v2.EntityLocation = 2, .m_v3.EntityType = SAHPI_ENT_SWITCH, .m_v3.EntityLocation = 3, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_entities( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_entities( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_entities( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_hpi_types_043.c0000644000175100017510000002205312575647263020335 0ustar mohanmohan/* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include "marshal_hpi_types.h" #include #include #include static int cmp_resourceinfo( SaHpiResourceInfoT *d1, SaHpiResourceInfoT *d2 ) { int i; if ( d1->ResourceRev != d2->ResourceRev ) return 0; if ( d1->SpecificVer != d2->SpecificVer ) return 0; if ( d1->DeviceSupport != d2->DeviceSupport ) return 0; if ( d1->ManufacturerId != d2->ManufacturerId ) return 0; if ( d1->ProductId != d2->ProductId ) return 0; if ( d1->FirmwareMajorRev != d2->FirmwareMajorRev ) return 0; if ( d1->FirmwareMinorRev != d2->FirmwareMinorRev ) return 0; if ( d1->AuxFirmwareRev != d2->AuxFirmwareRev ) return 0; for (i = 0; i < 16; i++) { if ( d1->Guid[i] != d2->Guid[i] ) return 0; } return 1; } static int cmp_entities( SaHpiEntityT *d1, SaHpiEntityT *d2 ) { if ( d1->EntityType != d2->EntityType ) return 0; if ( d1->EntityLocation != d2->EntityLocation ) return 0; return 1; } static int cmp_text_buffer( SaHpiTextBufferT *d1, SaHpiTextBufferT *d2 ) { if ( d1->DataType != d2->DataType ) return 0; if ( d1->Language != d2->Language ) return 0; if ( d1->DataLength != d2->DataLength ) return 0; return memcmp( d1->Data, d2->Data, d1->DataLength ) ? 0 : 1; } static int cmp_rptentry( SaHpiRptEntryT *d1, SaHpiRptEntryT *d2 ) { if ( d1->EntryId != d2->EntryId ) return 0; if ( d1->ResourceId != d2->ResourceId ) return 0; if ( !cmp_resourceinfo( &d1->ResourceInfo, &d2->ResourceInfo ) ) return 0; /* entity path is not compared here */ if ( d1->ResourceCapabilities != d2->ResourceCapabilities ) return 0; if ( d1->HotSwapCapabilities != d2->HotSwapCapabilities ) return 0; if ( d1->ResourceSeverity != d2->ResourceSeverity ) return 0; if ( d1->ResourceFailed != d2->ResourceFailed ) return 0; if ( !cmp_text_buffer( &d1->ResourceTag, &d2->ResourceTag ) ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiRptEntryT m_v1; tUint8 m_pad2; SaHpiRptEntryT m_v2; SaHpiRptEntryT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiRptEntryType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiRptEntryType ), dStructElement( cTest, m_v3 , SaHpiRptEntryType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.EntryId = 1, .m_v1.ResourceId = 1, .m_v1.ResourceInfo.ResourceRev = 1, .m_v1.ResourceInfo.SpecificVer = 1, .m_v1.ResourceInfo.DeviceSupport = 0, .m_v1.ResourceInfo.ManufacturerId = 10, .m_v1.ResourceInfo.ProductId = 10, .m_v1.ResourceInfo.FirmwareMajorRev = 3, .m_v1.ResourceInfo.FirmwareMinorRev = 3, .m_v1.ResourceInfo.AuxFirmwareRev = 0, .m_v1.ResourceInfo.Guid = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, .m_v1.ResourceEntity.Entry[0].EntityType = SAHPI_ENT_SYSTEM_BOARD, .m_v1.ResourceEntity.Entry[0].EntityLocation = 1, .m_v1.ResourceEntity.Entry[1].EntityType = SAHPI_ENT_BATTERY, .m_v1.ResourceEntity.Entry[1].EntityLocation = 2, .m_v1.ResourceCapabilities = 1, .m_v1.HotSwapCapabilities = 1, .m_v1.ResourceSeverity = 1, .m_v1.ResourceFailed = TRUE, .m_v1.ResourceTag.DataType = SAHPI_TL_TYPE_BINARY, .m_v1.ResourceTag.Language = SAHPI_LANG_TSONGA, .m_v1.ResourceTag.DataLength = 3, .m_v1.ResourceTag.Data = "AB", .m_pad2 = 48, .m_v2.EntryId = 2, .m_v2.ResourceId = 2, .m_v2.ResourceInfo.ResourceRev = 1, .m_v2.ResourceInfo.SpecificVer = 1, .m_v2.ResourceInfo.DeviceSupport = 0, .m_v2.ResourceInfo.ManufacturerId = 10, .m_v2.ResourceInfo.ProductId = 10, .m_v2.ResourceInfo.FirmwareMajorRev = 3, .m_v2.ResourceInfo.FirmwareMinorRev = 3, .m_v2.ResourceInfo.AuxFirmwareRev = 0, .m_v2.ResourceInfo.Guid = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, .m_v2.ResourceEntity.Entry[0].EntityType = SAHPI_ENT_POWER_MODULE, .m_v2.ResourceEntity.Entry[0].EntityLocation = 2, .m_v2.ResourceEntity.Entry[1].EntityType = SAHPI_ENT_SYSTEM_BUS, .m_v2.ResourceEntity.Entry[1].EntityLocation = 3, .m_v2.ResourceCapabilities = 1, .m_v2.HotSwapCapabilities = 1, .m_v2.ResourceSeverity = 1, .m_v2.ResourceFailed = FALSE, .m_v2.ResourceTag.DataType = SAHPI_TL_TYPE_BCDPLUS, .m_v2.ResourceTag.Language = SAHPI_LANG_SANGRO, .m_v2.ResourceTag.DataLength = 21, .m_v2.ResourceTag.Data = "12345678901234567890", .m_v3.EntryId = 3, .m_v3.ResourceId = 3, .m_v3.ResourceInfo.ResourceRev = 1, .m_v3.ResourceInfo.SpecificVer = 1, .m_v3.ResourceInfo.DeviceSupport = 0, .m_v3.ResourceInfo.ManufacturerId = 10, .m_v3.ResourceInfo.ProductId = 10, .m_v3.ResourceInfo.FirmwareMajorRev = 3, .m_v3.ResourceInfo.FirmwareMinorRev = 3, .m_v3.ResourceInfo.AuxFirmwareRev = 0, .m_v3.ResourceInfo.Guid = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, .m_v3.ResourceEntity.Entry[0].EntityType = SAHPI_ENT_SWITCH, .m_v3.ResourceEntity.Entry[0].EntityLocation = 3, .m_v3.ResourceEntity.Entry[1].EntityType = SAHPI_ENT_SYSTEM_BLADE, .m_v3.ResourceEntity.Entry[1].EntityLocation = 4, .m_v3.ResourceEntity.Entry[2].EntityType = SAHPI_ENT_RACK_MOUNTED_SERVER, .m_v3.ResourceEntity.Entry[2].EntityLocation = 5, .m_v3.ResourceCapabilities = 1, .m_v3.HotSwapCapabilities = 1, .m_v3.ResourceSeverity = 1, .m_v3.ResourceFailed = FALSE, .m_v3.ResourceTag.DataType = SAHPI_TL_TYPE_ASCII6, .m_v3.ResourceTag.Language = SAHPI_LANG_TAJIK, .m_v3.ResourceTag.DataLength = 0, .m_v3.ResourceTag.Data = "", .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_rptentry( &value.m_v1, &result.m_v1 ) ) return 1; if ( !cmp_entities( &value.m_v1.ResourceEntity.Entry[0], &result.m_v1.ResourceEntity.Entry[0] ) ) return 1; if ( !cmp_entities( &value.m_v1.ResourceEntity.Entry[1], &result.m_v1.ResourceEntity.Entry[1] ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_rptentry( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_entities( &value.m_v2.ResourceEntity.Entry[0], &result.m_v2.ResourceEntity.Entry[0] ) ) return 1; if ( !cmp_entities( &value.m_v2.ResourceEntity.Entry[1], &result.m_v2.ResourceEntity.Entry[1] ) ) return 1; if ( !cmp_rptentry( &value.m_v3, &result.m_v3 ) ) return 1; if ( !cmp_entities( &value.m_v3.ResourceEntity.Entry[0], &result.m_v3.ResourceEntity.Entry[0] ) ) return 1; if ( !cmp_entities( &value.m_v3.ResourceEntity.Entry[1], &result.m_v3.ResourceEntity.Entry[1] ) ) return 1; if ( !cmp_entities( &value.m_v3.ResourceEntity.Entry[2], &result.m_v3.ResourceEntity.Entry[2] ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_hpi_types_013.c0000644000175100017510000000442212575647263020332 0ustar mohanmohan/* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include "marshal_hpi_types.h" #include #include #include static int cmp_ctrlrecdigital( SaHpiCtrlRecDigitalT *d1, SaHpiCtrlRecDigitalT *d2 ) { if ( d1->Default != d2->Default ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiCtrlRecDigitalT m_v1; tUint8 m_pad2; SaHpiCtrlRecDigitalT m_v2; SaHpiCtrlRecDigitalT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiCtrlRecDigitalType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiCtrlRecDigitalType ), dStructElement( cTest, m_v3 , SaHpiCtrlRecDigitalType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.Default = SAHPI_CTRL_STATE_OFF, .m_pad2 = 48, .m_v1.Default = SAHPI_CTRL_STATE_ON, .m_v1.Default = SAHPI_CTRL_STATE_PULSE_ON, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_ctrlrecdigital( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_ctrlrecdigital( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_ctrlrecdigital( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_hpi_types_026.c0000644000175100017510000000456012575647263020341 0ustar mohanmohan/* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include "marshal_hpi_types.h" #include #include #include static int cmp_watchdogrec( SaHpiWatchdogRecT *d1, SaHpiWatchdogRecT *d2 ) { if ( d1->WatchdogNum != d2->WatchdogNum ) return 0; if ( d1->Oem != d2->Oem ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiWatchdogRecT m_v1; tUint8 m_pad2; SaHpiWatchdogRecT m_v2; SaHpiWatchdogRecT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiWatchdogRecType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiWatchdogRecType ), dStructElement( cTest, m_v3 , SaHpiWatchdogRecType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.WatchdogNum = 1, .m_v1.Oem = 0, .m_pad2 = 48, .m_v1.WatchdogNum = 2, .m_v1.Oem = 1, .m_v1.WatchdogNum = 3, .m_v1.Oem = 2, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_watchdogrec( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_watchdogrec( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_watchdogrec( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_012.c0000644000175100017510000000164212575647263016246 0ustar mohanmohan/* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include #include "marshal.h" #include int main( int argc, char *argv[] ) { tUint16 value = 0x42aa; tUint16 swap = GUINT16_SWAP_LE_BE( value ); tUint16 result; unsigned int s = Demarshal( G_BYTE_ORDER == G_LITTLE_ENDIAN ? G_BIG_ENDIAN : G_LITTLE_ENDIAN, &Marshal_Uint16Type, &result, &swap ); if ( s != sizeof( tUint16 ) ) return 1; if ( value != result ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_010.c0000644000175100017510000000463212575647263016246 0ustar mohanmohan/* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include #include "marshal.h" #include typedef struct { tUint8 m_u8; tUint16 m_u16; tUint32 m_u32; tUint64 m_u64; tInt8 m_i8; tInt16 m_i16; tInt32 m_i32; tInt64 m_i64; tFloat32 m_f32; tFloat64 m_f64; } cTest; cMarshalType Elements[] = { dStructElement( cTest, m_u8 , Marshal_Uint8Type ), dStructElement( cTest, m_u16, Marshal_Uint16Type ), dStructElement( cTest, m_u32, Marshal_Uint32Type ), dStructElement( cTest, m_u64, Marshal_Uint64Type ), dStructElement( cTest, m_i8 , Marshal_Int8Type ), dStructElement( cTest, m_i16, Marshal_Int16Type ), dStructElement( cTest, m_i32, Marshal_Int32Type ), dStructElement( cTest, m_i64, Marshal_Int64Type ), dStructElement( cTest, m_f32, Marshal_Float32Type ), dStructElement( cTest, m_f64, Marshal_Float64Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( Elements ); int main( int argc, char *argv[] ) { cTest value = { .m_u8 = 42, .m_u16 = 0x1234, .m_u32 = 0x23456789, .m_u64 = 0x1234234534564567LL, .m_i8 = 43, .m_i16 = 0x7654, .m_i32 = 0x98765432, .m_i64 = 0x9876543210987654LL, .m_f32 = -12.5, .m_f64 = 34.5 }; unsigned char buffer[256]; cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_u8 != result.m_u8 ) return 1; if ( value.m_u16 != result.m_u16 ) return 1; if ( value.m_u32 != result.m_u32 ) return 1; if ( value.m_u64 != result.m_u64 ) return 1; if ( value.m_i8 != result.m_i8 ) return 1; if ( value.m_i16 != result.m_i16 ) return 1; if ( value.m_i32 != result.m_i32 ) return 1; if ( value.m_i64 != result.m_i64 ) return 1; if ( value.m_f32 != result.m_f32 ) return 1; if ( value.m_f64 != result.m_f64 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_027.c0000644000175100017510000000432412575647263016254 0ustar mohanmohan/* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include #include "marshal.h" #include static unsigned int my_user_data = 42; static int MyMarshalFunction( const cMarshalType *type, const void *data, void *buffer, void *user_data ) { unsigned int *ud = (unsigned int *)user_data; if ( ud != &my_user_data ) exit( 1 ); if ( *ud != my_user_data ) exit( 1 ); const tUint8 *d = (const tUint8 *)data; tUint8 *b = (tUint8 *)buffer; tUint8 v1 = *d++; tUint8 v2 = *d++; tUint8 v3 = *d++; *b++ = v2; *b++ = v3; *b++ = v1; return 3; } static int MyDemarshalFunction( int byte_order, const cMarshalType *type, void *data, const void *buffer, void *user_data ) { unsigned int *ud = (unsigned int *)user_data; if ( ud != &my_user_data ) exit( 1 ); if ( *ud != my_user_data ) exit( 1 ); tUint8 *d = (tUint8 *)data; const tUint8 *b = (const tUint8 *)buffer; tUint8 v2 = *b++; tUint8 v3 = *b++; tUint8 v1 = *b++; *d++ = v1; *d++ = v2; *d++ = v3; return 3; } static cMarshalType UserDefinedType = dUserDefined( MyMarshalFunction, MyDemarshalFunction, &my_user_data ); int main( int argc, char *argv[] ) { tUint8 value[4] = { 0x42, 0X43, 0X44, 0X45 }; tUint8 result[4] = { 0x11, 0x12, 0x13, 0x14 }; unsigned char buffer[256]; unsigned int s1 = Marshal( &UserDefinedType, value, buffer ); if ( s1 != 3 ) return 1; unsigned int s2 = Demarshal( G_BYTE_ORDER, &UserDefinedType, result, buffer ); if ( s2 != 3 ) return 1; if ( value[0] != result[0] ) return 1; if ( value[1] != result[1] ) return 1; if ( value[2] != result[2] ) return 1; if ( result[3] != 0x14 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_001.c0000644000175100017510000000172512575647264016247 0ustar mohanmohan/* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include #include "marshal.h" int main( int argc, char *argv[] ) { tUint16 value = 0x42aa; tUint16 result; unsigned char buffer[256]; unsigned int s1 = Marshal( &Marshal_Uint16Type, &value, buffer ); if ( s1 != sizeof( tUint16 ) ) return 1; unsigned int s2 = Demarshal( G_BYTE_ORDER, &Marshal_Uint16Type, &result, buffer ); if ( s2 != sizeof( tUint16 ) ) return 1; if ( value != result ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_hpi_types_031.c0000644000175100017510000001630712575647263020337 0ustar mohanmohan/* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include "marshal_hpi_types.h" #include #include #include static int cmp_annunciatorrec( SaHpiAnnunciatorRecT *d1, SaHpiAnnunciatorRecT *d2 ) { if ( d1->AnnunciatorNum != d2->AnnunciatorNum ) return 0; if ( d1->AnnunciatorType != d2->AnnunciatorType ) return 0; if ( d1->ModeReadOnly != d2->ModeReadOnly ) return 0; if ( d1->MaxConditions != d2->MaxConditions ) return 0; if ( d1->Oem != d2->Oem ) return 0; return 1; } static int cmp_entity( SaHpiEntityT *d1, SaHpiEntityT *d2 ) { if ( d1->EntityType != d2->EntityType ) return 0; if ( d1->EntityLocation != d2->EntityLocation ) return 0; return 1; } static int cmp_text_buffer( SaHpiTextBufferT *d1, SaHpiTextBufferT *d2 ) { if ( d1->DataType != d2->DataType ) return 0; if ( d1->Language != d2->Language ) return 0; if ( d1->DataLength != d2->DataLength ) return 0; return memcmp( d1->Data, d2->Data, d1->DataLength ) ? 0 : 1; } static int cmp_rdr( SaHpiRdrT *d1, SaHpiRdrT *d2 ) { int i; if ( d1->RecordId != d2->RecordId ) return 0; if ( d1->RdrType != d2->RdrType ) return 0; for (i = 0; i < SAHPI_MAX_ENTITY_PATH; i++) { if (d1->Entity.Entry[i].EntityType == SAHPI_ENT_ROOT_VALUE && d2->Entity.Entry[i].EntityType == SAHPI_ENT_ROOT_VALUE ) { break; } if ( !cmp_entity( &d1->Entity.Entry[i], &d2->Entity.Entry[i] ) ) return 0; } if ( d1->IsFru != d2->IsFru ) return 0; if ( !cmp_annunciatorrec( &d1->RdrTypeUnion.AnnunciatorRec, &d2->RdrTypeUnion.AnnunciatorRec ) ) return 0; if ( !cmp_text_buffer( &d1->IdString, &d2->IdString ) ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiRdrT m_v1; tUint8 m_pad2; SaHpiRdrT m_v2; SaHpiRdrT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiRdrType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiRdrType ), dStructElement( cTest, m_v3 , SaHpiRdrType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.RecordId = 1, .m_v1.RdrType = SAHPI_ANNUNCIATOR_RDR, .m_v1.Entity.Entry[0].EntityType = SAHPI_ENT_SYSTEM_BOARD, .m_v1.Entity.Entry[0].EntityLocation = 1, .m_v1.Entity.Entry[1].EntityType = SAHPI_ENT_POWER_UNIT, .m_v1.Entity.Entry[1].EntityLocation = 2, .m_v1.Entity.Entry[2].EntityType = SAHPI_ENT_ROOT, .m_v1.Entity.Entry[2].EntityLocation = 0, .m_v1.IsFru = FALSE, .m_v1.RdrTypeUnion.AnnunciatorRec.AnnunciatorNum = 1, .m_v1.RdrTypeUnion.AnnunciatorRec.AnnunciatorType = SAHPI_ANNUNCIATOR_TYPE_LED, .m_v1.RdrTypeUnion.AnnunciatorRec.ModeReadOnly = FALSE, .m_v1.RdrTypeUnion.AnnunciatorRec.MaxConditions = 0, .m_v1.RdrTypeUnion.AnnunciatorRec.Oem = 0, .m_v1.IdString.DataType = SAHPI_TL_TYPE_BINARY, .m_v1.IdString.Language = SAHPI_LANG_TSONGA, .m_v1.IdString.DataLength = 3, .m_v1.IdString.Data = "AB", .m_pad2 = 48, .m_v2.RecordId = 1, .m_v2.RdrType = SAHPI_ANNUNCIATOR_RDR, .m_v2.Entity.Entry[0].EntityType = SAHPI_ENT_SUB_CHASSIS, .m_v2.Entity.Entry[0].EntityLocation = 1, .m_v2.Entity.Entry[1].EntityType = SAHPI_ENT_SYSTEM_BUS, .m_v2.Entity.Entry[1].EntityLocation = 2, .m_v2.Entity.Entry[2].EntityType = SAHPI_ENT_COOLING_DEVICE, .m_v2.Entity.Entry[2].EntityLocation = 3, .m_v2.Entity.Entry[3].EntityType = SAHPI_ENT_ROOT, .m_v2.Entity.Entry[3].EntityLocation = 0, .m_v2.IsFru = FALSE, .m_v2.RdrTypeUnion.AnnunciatorRec.AnnunciatorNum = 2, .m_v2.RdrTypeUnion.AnnunciatorRec.AnnunciatorType = SAHPI_ANNUNCIATOR_TYPE_AUDIBLE, .m_v2.RdrTypeUnion.AnnunciatorRec.ModeReadOnly = TRUE, .m_v2.RdrTypeUnion.AnnunciatorRec.MaxConditions = 3, .m_v2.RdrTypeUnion.AnnunciatorRec.Oem = 1000, .m_v2.IdString.DataType = SAHPI_TL_TYPE_BCDPLUS, .m_v2.IdString.Language = SAHPI_LANG_SANGRO, .m_v2.IdString.DataLength = 21, .m_v2.IdString.Data = "12345678901234567890", .m_v3.RecordId = 1, .m_v3.RdrType = SAHPI_ANNUNCIATOR_RDR, .m_v3.Entity.Entry[0].EntityType = SAHPI_ENT_PROCESSOR, .m_v3.Entity.Entry[0].EntityLocation = 1, .m_v3.Entity.Entry[1].EntityType = SAHPI_ENT_ROOT, .m_v3.Entity.Entry[1].EntityLocation = 0, .m_v3.IsFru = TRUE, .m_v3.RdrTypeUnion.AnnunciatorRec.AnnunciatorNum = 100, .m_v3.RdrTypeUnion.AnnunciatorRec.AnnunciatorType = SAHPI_ANNUNCIATOR_TYPE_MESSAGE, .m_v3.RdrTypeUnion.AnnunciatorRec.ModeReadOnly = FALSE, .m_v3.RdrTypeUnion.AnnunciatorRec.MaxConditions = 10, .m_v3.RdrTypeUnion.AnnunciatorRec.Oem = 20, .m_v3.IdString.DataType = SAHPI_TL_TYPE_ASCII6, .m_v3.IdString.Language = SAHPI_LANG_TAJIK, .m_v3.IdString.DataLength = 0, .m_v3.IdString.Data = "", .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_rdr( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_rdr( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_rdr( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_022.c0000644000175100017510000000525112575647264016250 0ustar mohanmohan/* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include #include "marshal.h" #include #define dModU8 0 #define dModU16 1 #define dModU32 2 #define dModU64 3 #define dModI8 4 #define dModI16 5 #define dModI32 6 #define dModI64 7 #define dModF32 8 #define dModF64 9 typedef union { tUint8 m_u8; tUint16 m_u16; tUint32 m_u32; tUint64 m_u64; tInt8 m_i8; tInt16 m_i16; tInt32 m_i32; tInt64 m_i64; tFloat32 m_f32; tFloat64 m_f64; } cUnion; typedef struct { tUint8 m_pad1; tUint8 m_mod; tUint8 m_pad2; cUnion m_union; tUint8 m_pad3; } cTest; cMarshalType UnionElements[] = { dUnionElement( dModU8 , Marshal_Uint8Type ), dUnionElement( dModU16, Marshal_Uint16Type ), dUnionElement( dModU32, Marshal_Uint32Type ), dUnionElement( dModU64, Marshal_Uint64Type ), dUnionElement( dModI8 , Marshal_Int8Type ), dUnionElement( dModI16, Marshal_Int16Type ), dUnionElement( dModI32, Marshal_Int32Type ), dUnionElement( dModI64, Marshal_Int64Type ), dUnionElement( dModF32, Marshal_Float32Type ), dUnionElement( dModF64, Marshal_Float64Type ), dUnionElementEnd() }; cMarshalType TestUnionType = dUnion( 1, UnionElements ); cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_mod , Marshal_Uint8Type ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_union, TestUnionType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_mod = dModU64, .m_pad2 = 48, .m_union.m_u64 = 0xabcd123456780123LL, .m_pad3 = 49 }; unsigned char buffer[256]; cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( value.m_mod != result.m_mod ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; if ( value.m_union.m_u64 != result.m_union.m_u64 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_hpi_types_014.c0000644000175100017510000000443612575647263020340 0ustar mohanmohan/* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include "marshal_hpi_types.h" #include #include #include static int cmp_ctrlrecdiscrete( SaHpiCtrlRecDiscreteT *d1, SaHpiCtrlRecDiscreteT *d2 ) { if ( d1->Default != d2->Default ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiCtrlRecDiscreteT m_v1; tUint8 m_pad2; SaHpiCtrlRecDiscreteT m_v2; SaHpiCtrlRecDiscreteT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiCtrlRecDiscreteType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiCtrlRecDiscreteType ), dStructElement( cTest, m_v3 , SaHpiCtrlRecDiscreteType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.Default = SAHPI_CTRL_STATE_OFF, .m_pad2 = 48, .m_v1.Default = SAHPI_CTRL_STATE_ON, .m_v1.Default = SAHPI_CTRL_STATE_PULSE_ON, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_ctrlrecdiscrete( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_ctrlrecdiscrete( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_ctrlrecdiscrete( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_hpi_types_039.c0000644000175100017510000000640512575647264020346 0ustar mohanmohan/* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include "marshal_hpi_types.h" #include #include #include static int cmp_text_buffer( SaHpiTextBufferT *d1, SaHpiTextBufferT *d2 ) { if ( d1->DataType != d2->DataType ) return 0; if ( d1->Language != d2->Language ) return 0; if ( d1->DataLength != d2->DataLength ) return 0; return memcmp( d1->Data, d2->Data, d1->DataLength ) ? 0 : 1; } static int cmp_oemevent( SaHpiOemEventT *d1, SaHpiOemEventT *d2 ) { if ( d1->MId != d2->MId ) return 0; if ( !cmp_text_buffer( &d1->OemEventData, &d2->OemEventData ) ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiOemEventT m_v1; tUint8 m_pad2; SaHpiOemEventT m_v2; SaHpiOemEventT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiOemEventType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiOemEventType ), dStructElement( cTest, m_v3 , SaHpiOemEventType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.MId = 1, .m_v1.OemEventData.DataType = SAHPI_TL_TYPE_BINARY, .m_v1.OemEventData.Language = SAHPI_LANG_TSONGA, .m_v1.OemEventData.DataLength = 3, .m_v1.OemEventData.Data = "AB", .m_pad2 = 48, .m_v2.MId = 2, .m_v2.OemEventData.DataType = SAHPI_TL_TYPE_BCDPLUS, .m_v2.OemEventData.Language = SAHPI_LANG_SANGRO, .m_v2.OemEventData.DataLength = 21, .m_v2.OemEventData.Data = "12345678901234567890", .m_v3.MId = 3, .m_v3.OemEventData.DataType = SAHPI_TL_TYPE_ASCII6, .m_v3.OemEventData.Language = SAHPI_LANG_TAJIK, .m_v3.OemEventData.DataLength = 0, .m_v3.OemEventData.Data = "", .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_oemevent( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_oemevent( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_oemevent( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_013.c0000644000175100017510000000164512575647264016253 0ustar mohanmohan/* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include #include "marshal.h" #include int main( int argc, char *argv[] ) { tUint32 value = 0xba098765; tUint32 swap = GUINT32_SWAP_LE_BE( value ); tUint32 result; unsigned int s = Demarshal( G_BYTE_ORDER == G_LITTLE_ENDIAN ? G_BIG_ENDIAN : G_LITTLE_ENDIAN, &Marshal_Uint32Type, &result, &swap ); if ( s != sizeof( tUint32 ) ) return 1; if ( value != result ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_hpi_types_016.c0000644000175100017510000000554412575647263020343 0ustar mohanmohan/* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include "marshal_hpi_types.h" #include #include #include static int cmp_ctrlstatestream( SaHpiCtrlStateStreamT *d1, SaHpiCtrlStateStreamT *d2 ) { if ( d1->Repeat != d2->Repeat ) return 0; if ( d1->StreamLength != d2->StreamLength ) return 0; if ( memcmp(d1->Stream, d2->Stream, SAHPI_CTRL_MAX_STREAM_LENGTH) != 0 ) return 0; return 1; } static int cmp_ctrlrecstream( SaHpiCtrlRecStreamT *d1, SaHpiCtrlRecStreamT *d2 ) { if ( !cmp_ctrlstatestream( &d1->Default, &d2->Default ) ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiCtrlRecStreamT m_v1; tUint8 m_pad2; SaHpiCtrlRecStreamT m_v2; SaHpiCtrlRecStreamT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiCtrlRecStreamType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiCtrlRecStreamType ), dStructElement( cTest, m_v3 , SaHpiCtrlRecStreamType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.Default.Repeat = 0, .m_v1.Default.StreamLength = 4, .m_v1.Default.Stream = {'A', 'B', 'c', 'd'}, .m_pad2 = 48, .m_v2.Default.Repeat = 1, .m_v2.Default.StreamLength = 4, .m_v2.Default.Stream = {'d', 'c', 'B', 'A'}, .m_v3.Default.Repeat = 1, .m_v3.Default.StreamLength = 1, .m_v3.Default.Stream = {'A'}, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_ctrlrecstream( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_ctrlrecstream( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_ctrlrecstream( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_030.c0000644000175100017510000000177512575647264016256 0ustar mohanmohan/* * Copyright (c) 2007 by Sun Microsystems, Inc. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Chris Rinaldo */ #include #include "marshal.h" #include #include int main( int argc, char *argv[] ) { tFloat32 value = -1.2113584441986872e-18; tFloat32 result; tUint32 swap; memcpy( &swap, &value, sizeof( tUint32 ) ); swap = GUINT32_SWAP_LE_BE( swap ); unsigned int s = Demarshal( G_BYTE_ORDER == G_LITTLE_ENDIAN ? G_BIG_ENDIAN : G_LITTLE_ENDIAN, &Marshal_Float32Type, &result, &swap ); if ( s != sizeof( tFloat32 ) ) return 1; if ( value != result ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_hpi_types_017.c0000644000175100017510000001022512575647263020334 0ustar mohanmohan/* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include "marshal_hpi_types.h" #include #include #include static int cmp_text_buffer( SaHpiTextBufferT *d1, SaHpiTextBufferT *d2 ) { if ( d1->DataType != d2->DataType ) return 0; if ( d1->Language != d2->Language ) return 0; if ( d1->DataLength != d2->DataLength ) return 0; return memcmp( d1->Data, d2->Data, d1->DataLength ) ? 0 : 1; } static int cmp_ctrlstatetext( SaHpiCtrlStateTextT *d1, SaHpiCtrlStateTextT *d2 ) { if ( d1->Line != d2->Line ) return 0; if ( !cmp_text_buffer( &d1->Text, &d2->Text ) ) return 0; return 1; } static int cmp_ctrlrectext( SaHpiCtrlRecTextT *d1, SaHpiCtrlRecTextT *d2 ) { if ( d1->MaxChars != d2->MaxChars ) return 0; if ( d1->MaxLines != d2->MaxLines ) return 0; if ( d1->Language != d2->Language ) return 0; if ( d1->DataType != d2->DataType ) return 0; if ( !cmp_ctrlstatetext( &d1->Default, &d2->Default ) ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiCtrlRecTextT m_v1; tUint8 m_pad2; SaHpiCtrlRecTextT m_v2; SaHpiCtrlRecTextT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiCtrlRecTextType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiCtrlRecTextType ), dStructElement( cTest, m_v3 , SaHpiCtrlRecTextType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.MaxChars = 80, .m_v1.MaxLines = 10, .m_v1.Language = SAHPI_LANG_ENGLISH, .m_v1.DataType = SAHPI_TL_TYPE_TEXT, .m_v1.Default.Line = 1, .m_v1.Default.Text.DataType = SAHPI_TL_TYPE_TEXT, .m_v1.Default.Text.Language = SAHPI_LANG_ENGLISH, .m_v1.Default.Text.DataLength = 7, .m_v1.Default.Text.Data = "My text", .m_pad2 = 48, .m_v2.MaxChars = 80, .m_v2.MaxLines = 10, .m_v2.Language = SAHPI_LANG_ENGLISH, .m_v2.DataType = SAHPI_TL_TYPE_TEXT, .m_v2.Default.Line = 1, .m_v2.Default.Text.DataType = SAHPI_TL_TYPE_TEXT, .m_v2.Default.Text.Language = SAHPI_LANG_ENGLISH, .m_v2.Default.Text.DataLength = 8, .m_v2.Default.Text.Data = "My text1", .m_v3.MaxChars = 80, .m_v3.MaxLines = 10, .m_v3.Language = SAHPI_LANG_ENGLISH, .m_v3.DataType = SAHPI_TL_TYPE_TEXT, .m_v3.Default.Line = 1, .m_v3.Default.Text.DataType = SAHPI_TL_TYPE_TEXT, .m_v3.Default.Text.Language = SAHPI_LANG_ENGLISH, .m_v3.Default.Text.DataLength = 15, .m_v2.Default.Text.Data = "My text My text", .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_ctrlrectext( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_ctrlrectext( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_ctrlrectext( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_hpi_types_029.c0000644000175100017510000002115612575647264020345 0ustar mohanmohan/* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include "marshal_hpi_types.h" #include #include #include static int cmp_text_buffer( SaHpiTextBufferT *d1, SaHpiTextBufferT *d2 ) { if ( d1->DataType != d2->DataType ) return 0; if ( d1->Language != d2->Language ) return 0; if ( d1->DataLength != d2->DataLength ) return 0; return memcmp( d1->Data, d2->Data, d1->DataLength ) ? 0 : 1; } static int cmp_entity( SaHpiEntityT *d1, SaHpiEntityT *d2 ) { if ( d1->EntityType != d2->EntityType ) return 0; if ( d1->EntityLocation != d2->EntityLocation ) return 0; return 1; } static int cmp_entitypath( SaHpiEntityPathT *d1, SaHpiEntityPathT *d2 ) { int i; for (i = 0; ; i++) { if (d1->Entry[i].EntityType == SAHPI_ENT_ROOT && d2->Entry[i].EntityType == SAHPI_ENT_ROOT) { return 1; } if ( cmp_entity(&d1->Entry[i], &d2->Entry[i]) == 0 ) return 0; } return 1; } static int cmp_name( SaHpiNameT *d1, SaHpiNameT *d2 ) { if ( d1->Length != d2->Length ) return 0; if ( memcmp(&d1->Value, &d2->Value, SA_HPI_MAX_NAME_LENGTH) != 0 ) return 0; return 1; } static int cmp_condition( SaHpiConditionT *d1, SaHpiConditionT *d2 ) { if ( d1->Type != d2->Type ) return 0; if ( !cmp_entitypath( &d1->Entity, &d2->Entity ) ) return 0; if ( d1->DomainId != d2->DomainId ) return 0; if ( d1->ResourceId != d2->ResourceId ) return 0; if ( d1->SensorNum != d2->SensorNum ) return 0; if ( d1->SensorNum != d2->SensorNum ) return 0; if ( d1->EventState != d2->EventState ) return 0; if ( !cmp_name( &d1->Name, &d2->Name ) ) return 0; if ( d1->Mid != d2->Mid ) return 0; if ( !cmp_text_buffer( &d1->Data, &d2->Data ) ) return 0; return 1; } static int cmp_announcement( SaHpiAnnouncementT *d1, SaHpiAnnouncementT *d2 ) { if ( d1->EntryId != d2->EntryId ) return 0; if ( d1->Timestamp != d2->Timestamp ) return 0; if ( d1->AddedByUser != d2->AddedByUser ) return 0; if ( d1->Severity != d2->Severity ) return 0; if ( d1->Acknowledged != d2->Acknowledged ) return 0; if ( !cmp_condition( &d1->StatusCond, &d2->StatusCond ) ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiAnnouncementT m_v1; tUint8 m_pad2; SaHpiAnnouncementT m_v2; SaHpiAnnouncementT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiAnnouncementType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiAnnouncementType ), dStructElement( cTest, m_v3 , SaHpiAnnouncementType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.EntryId = 1, .m_v1.Timestamp = 1000, .m_v1.AddedByUser = FALSE, .m_v1.Severity = SAHPI_CRITICAL, .m_v1.Acknowledged = FALSE, .m_v1.StatusCond.Type = SAHPI_STATUS_COND_TYPE_SENSOR, .m_v1.StatusCond.Entity.Entry[0].EntityType = SAHPI_ENT_SYSTEM_BOARD, .m_v1.StatusCond.Entity.Entry[0].EntityLocation = 1, .m_v1.StatusCond.Entity.Entry[1].EntityType = SAHPI_ENT_POWER_UNIT, .m_v1.StatusCond.Entity.Entry[1].EntityLocation = 2, .m_v1.StatusCond.Entity.Entry[2].EntityType = SAHPI_ENT_ROOT, .m_v1.StatusCond.Entity.Entry[2].EntityLocation = 0, .m_v1.StatusCond.DomainId = SAHPI_UNSPECIFIED_DOMAIN_ID, .m_v1.StatusCond.ResourceId = 1, .m_v1.StatusCond.SensorNum = 1, .m_v1.StatusCond.EventState = SAHPI_ES_LOWER_MINOR, .m_v1.StatusCond.Name.Length = 9, .m_v1.StatusCond.Name.Value = "Next text", .m_v1.StatusCond.Mid = 3, .m_v1.StatusCond.Data.DataType = SAHPI_TL_TYPE_TEXT, .m_v1.StatusCond.Data.Language = SAHPI_LANG_ENGLISH, .m_v1.StatusCond.Data.DataLength = 3, .m_v1.StatusCond.Data.Data = "AB", .m_pad2 = 48, .m_v2.EntryId = 10, .m_v2.Timestamp = 2000, .m_v2.AddedByUser = TRUE, .m_v2.Severity = SAHPI_OK, .m_v2.Acknowledged = FALSE, .m_v2.StatusCond.Type = SAHPI_STATUS_COND_TYPE_RESOURCE, .m_v2.StatusCond.Entity.Entry[0].EntityType = SAHPI_ENT_SUB_CHASSIS, .m_v2.StatusCond.Entity.Entry[0].EntityLocation = 1, .m_v2.StatusCond.Entity.Entry[1].EntityType = SAHPI_ENT_SYSTEM_BUS, .m_v2.StatusCond.Entity.Entry[1].EntityLocation = 2, .m_v2.StatusCond.Entity.Entry[2].EntityType = SAHPI_ENT_COOLING_DEVICE, .m_v2.StatusCond.Entity.Entry[2].EntityLocation = 3, .m_v2.StatusCond.Entity.Entry[3].EntityType = SAHPI_ENT_ROOT, .m_v2.StatusCond.Entity.Entry[3].EntityLocation = 0, .m_v2.StatusCond.DomainId = SAHPI_UNSPECIFIED_DOMAIN_ID, .m_v2.StatusCond.ResourceId = 2, .m_v2.StatusCond.SensorNum = 4, .m_v2.StatusCond.EventState = SAHPI_ES_LOWER_CRIT, .m_v2.StatusCond.Name.Length = 9, .m_v2.StatusCond.Name.Value = "Next text", .m_v2.StatusCond.Mid = 3, .m_v2.StatusCond.Data.DataType = SAHPI_TL_TYPE_TEXT, .m_v2.StatusCond.Data.Language = SAHPI_LANG_ENGLISH, .m_v2.StatusCond.Data.DataLength = 3, .m_v2.StatusCond.Data.Data = "AB", .m_v3.EntryId = 11, .m_v3.Timestamp = 3000, .m_v3.AddedByUser = FALSE, .m_v3.Severity = SAHPI_MAJOR, .m_v3.Acknowledged = TRUE, .m_v3.StatusCond.Type = SAHPI_STATUS_COND_TYPE_OEM, .m_v3.StatusCond.Entity.Entry[0].EntityType = SAHPI_ENT_PROCESSOR, .m_v3.StatusCond.Entity.Entry[0].EntityLocation = 1, .m_v3.StatusCond.Entity.Entry[1].EntityType = SAHPI_ENT_ROOT, .m_v3.StatusCond.Entity.Entry[1].EntityLocation = 0, .m_v3.StatusCond.DomainId = SAHPI_UNSPECIFIED_DOMAIN_ID, .m_v3.StatusCond.ResourceId = 3, .m_v3.StatusCond.SensorNum = 5, .m_v3.StatusCond.EventState = SAHPI_ES_UPPER_MAJOR, .m_v3.StatusCond.Name.Length = 9, .m_v3.StatusCond.Name.Value = "Next text", .m_v3.StatusCond.Mid = 3, .m_v3.StatusCond.Data.DataType = SAHPI_TL_TYPE_BINARY, .m_v3.StatusCond.Data.Language = SAHPI_LANG_ENGLISH, .m_v3.StatusCond.Data.DataLength = 3, .m_v3.StatusCond.Data.Data = "AB", .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_announcement( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_announcement( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_announcement( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_028.c0000644000175100017510000000411012575647264016247 0ustar mohanmohan/* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include #include "marshal.h" #include "marshal_hpi_types.h" #include #include typedef struct { tUint8 m_pad1; tUint8 m_size; tUint8 m_pad2; SaHpiDimiTestVariableParamsT *m_array; tUint8 m_pad3; } cTest; cMarshalType TestVarArrayType = dVarArray("TestVarArrayType", 1, SaHpiDimiTestVariableParamsT, SaHpiDimiTestVariableParamsType ); cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_size , Marshal_Uint8Type ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_array, TestVarArrayType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( StructElements ); SaHpiDimiTestVariableParamsT params_list[] = { { .ParamName = "Test Param", .ParamType = SAHPI_DIMITEST_PARAM_TYPE_INT32, .Value.paramint = 5 } }; int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_size = 1, .m_pad2 = 48, .m_array = params_list, .m_pad3 = 49 }; unsigned char buffer[256]; cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( value.m_size != result.m_size ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; if ( memcmp( value.m_array, result.m_array, sizeof(SaHpiDimiTestVariableParamsT )) ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_009.c0000644000175100017510000000167312575647264016261 0ustar mohanmohan/* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include #include "marshal.h" int main( int argc, char *argv[] ) { tFloat64 value = -47.345566; tFloat64 result; unsigned char buffer[256]; unsigned int s1 = Marshal( &Marshal_Float64Type, &value, buffer ); if ( s1 != sizeof( tFloat64 ) ) return 1; unsigned int s2 = Demarshal( G_BYTE_ORDER, &Marshal_Float64Type, &result, buffer ); if ( s2 != sizeof( tFloat64 ) ) return 1; if ( value != result ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_hpi_types_030.c0000644000175100017510000000577112575647264020342 0ustar mohanmohan/* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include "marshal_hpi_types.h" #include #include #include static int cmp_annunciatorrec( SaHpiAnnunciatorRecT *d1, SaHpiAnnunciatorRecT *d2 ) { if ( d1->AnnunciatorNum != d2->AnnunciatorNum ) return 0; if ( d1->AnnunciatorType != d2->AnnunciatorType ) return 0; if ( d1->ModeReadOnly != d2->ModeReadOnly ) return 0; if ( d1->MaxConditions != d2->MaxConditions ) return 0; if ( d1->Oem != d2->Oem ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiAnnunciatorRecT m_v1; tUint8 m_pad2; SaHpiAnnunciatorRecT m_v2; SaHpiAnnunciatorRecT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiAnnunciatorRecType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiAnnunciatorRecType ), dStructElement( cTest, m_v3 , SaHpiAnnunciatorRecType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.AnnunciatorNum = 1, .m_v1.AnnunciatorType = SAHPI_ANNUNCIATOR_TYPE_LED, .m_v1.ModeReadOnly = FALSE, .m_v1.MaxConditions = 0, .m_v1.Oem = 0, .m_pad2 = 48, .m_v2.AnnunciatorNum = 2, .m_v2.AnnunciatorType = SAHPI_ANNUNCIATOR_TYPE_AUDIBLE, .m_v2.ModeReadOnly = TRUE, .m_v2.MaxConditions = 3, .m_v2.Oem = 1000, .m_v3.AnnunciatorNum = 100, .m_v3.AnnunciatorType = SAHPI_ANNUNCIATOR_TYPE_MESSAGE, .m_v3.ModeReadOnly = FALSE, .m_v3.MaxConditions = 10, .m_v3.Oem = 20, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_annunciatorrec( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_annunciatorrec( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_annunciatorrec( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_002.c0000644000175100017510000000173112575647263016244 0ustar mohanmohan/* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include #include "marshal.h" int main( int argc, char *argv[] ) { tUint32 value = 0xba098765; tUint32 result; unsigned char buffer[256]; unsigned int s1 = Marshal( &Marshal_Uint32Type, &value, buffer ); if ( s1 != sizeof( tUint32 ) ) return 1; unsigned int s2 = Demarshal( G_BYTE_ORDER, &Marshal_Uint32Type, &result, buffer ); if ( s2 != sizeof( tUint32 ) ) return 1; if ( value != result ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_hpi_types_003.c0000644000175100017510000000520412575647263020330 0ustar mohanmohan/* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include "marshal_hpi_types.h" #include #include #include static int cmp_sensorreading( SaHpiSensorReadingT *d1, SaHpiSensorReadingT *d2 ) { if ( d1->IsSupported != d2->IsSupported ) return 0; if ( d1->Type != d2->Type ) return 0; if ( d1->Value.SensorInt64 != d2->Value.SensorInt64 ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiSensorReadingT m_v1; tUint8 m_pad2; SaHpiSensorReadingT m_v2; SaHpiSensorReadingT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiSensorReadingType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiSensorReadingType ), dStructElement( cTest, m_v3 , SaHpiSensorReadingType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.IsSupported = TRUE, .m_v1.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v1.Value = {-21}, .m_pad2 = 48, .m_v2.IsSupported = TRUE, .m_v2.Type = SAHPI_SENSOR_READING_TYPE_UINT64, .m_v2.Value = {21}, .m_v3.IsSupported = FALSE, .m_v3.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v3.Value = {0}, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_sensorreading( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_sensorreading( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_sensorreading( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_025.c0000644000175100017510000000663012575647263016254 0ustar mohanmohan/* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include #include "marshal.h" #include #define dModU8 0 #define dModU16 1 #define dModU32 2 #define dModU64 3 #define dModI8 4 #define dModI16 5 #define dModI32 6 #define dModI64 7 #define dModF32 8 #define dModF64 9 typedef union { tUint8 m_u8; tUint16 m_u16; tUint32 m_u32; tUint64 m_u64; tInt8 m_i8; tInt16 m_i16; tInt32 m_i32; tInt64 m_i64; tFloat32 m_f32; tFloat64 m_f64; } cUnion; typedef struct { tUint8 m_pad1; tUint8 m_mod; tUint8 m_pad2; cUnion m_union; tUint8 m_pad3; } cTest; cMarshalType UnionElements[] = { dUnionElement( dModU8 , Marshal_Uint8Type ), dUnionElement( dModU16, Marshal_Uint16Type ), dUnionElement( dModU32, Marshal_Uint32Type ), dUnionElement( dModU64, Marshal_Uint64Type ), dUnionElement( dModI8 , Marshal_Int8Type ), dUnionElement( dModI16, Marshal_Int16Type ), dUnionElement( dModI32, Marshal_Int32Type ), dUnionElement( dModI64, Marshal_Int64Type ), dUnionElement( dModF32, Marshal_Float32Type ), dUnionElement( dModF64, Marshal_Float64Type ), dUnionElementEnd() }; cMarshalType TestUnionType = dUnion( 1, UnionElements ); cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_mod , Marshal_Uint8Type ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_union, TestUnionType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( StructElements ); static int CheckValue( cTest *v, cTest *r ) { unsigned char buffer[256]; unsigned int s1 = Marshal( &TestType, v, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, r, buffer ); if ( s1 != s2 ) return 1; if ( v->m_pad1 != r->m_pad1 ) return 1; if ( v->m_mod != r->m_mod ) return 1; if ( v->m_pad2 != r->m_pad2 ) return 1; if ( v->m_pad3 != r->m_pad3 ) return 1; return 0; } int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_mod = 43, // unknown .m_pad2 = 48, .m_union.m_u64 = 0xabcd123456780123LL, .m_pad3 = 49 }; cTest result; // Uint8 value.m_mod = dModU8; value.m_union.m_u8 = 0x43; if ( CheckValue( &value, &result ) ) return 1; if ( value.m_union.m_u8 != result.m_union.m_u8 ) return 1; // Uint16 value.m_mod = dModU16; value.m_union.m_u16 = 0x1234; if ( CheckValue( &value, &result ) ) return 1; if ( value.m_union.m_u16 != result.m_union.m_u16 ) return 1; // Uint32 value.m_mod = dModU32; value.m_union.m_u32 = 0x23458765; if ( CheckValue( &value, &result ) ) return 1; if ( value.m_union.m_u32 != result.m_union.m_u32 ) return 1; // Uint64 value.m_mod = dModU64; value.m_union.m_u64 = 0x1234567823453456LL; if ( CheckValue( &value, &result ) ) return 1; if ( value.m_union.m_u64 != result.m_union.m_u64 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_hpi_types_032.c0000644000175100017510000000464112575647263020336 0ustar mohanmohan/* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include "marshal_hpi_types.h" #include #include #include static int cmp_resourceevent( SaHpiResourceEventT *d1, SaHpiResourceEventT *d2 ) { if ( d1->ResourceEventType != d2->ResourceEventType ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiResourceEventT m_v1; tUint8 m_pad2; SaHpiResourceEventT m_v2; SaHpiResourceEventT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiResourceEventType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiResourceEventType ), dStructElement( cTest, m_v3 , SaHpiResourceEventType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.ResourceEventType = SAHPI_RESE_RESOURCE_FAILURE, .m_pad2 = 48, .m_v2.ResourceEventType = SAHPI_RESE_RESOURCE_RESTORED, .m_v3.ResourceEventType = SAHPI_RESE_RESOURCE_ADDED, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_resourceevent( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_resourceevent( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_resourceevent( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_004.c0000644000175100017510000000165112575647263016247 0ustar mohanmohan/* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include #include "marshal.h" int main( int argc, char *argv[] ) { tInt8 value = 0xfa; tInt8 result; unsigned char buffer[256]; unsigned int s1 = Marshal( &Marshal_Int8Type, &value, buffer ); if ( s1 != sizeof( tInt8 ) ) return 1; unsigned int s2 = Demarshal( G_BYTE_ORDER, &Marshal_Int8Type, &result, buffer ); if ( s2 != sizeof( tInt8 ) ) return 1; if ( value != result ) return 1; return 0; } openhpi-3.6.1/marshal/t/float_format.c0000644000175100017510000001043412575647263016711 0ustar mohanmohan/* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include "marshal.h" #include #include #include #include #include #include #include #include #include #include void ReadFile( const char *filename, void *p, int size ); void WriteFile( const char *filename, void *p, int size ); static tFloat32 float32_data[] = { 0.0, 1.0, 2.0, 3.0, 0.5, 0.25, 0.75, -1.0, -2.0, -3.0, M_PI }; static int float32_data_num = sizeof( float32_data ) / sizeof( tFloat32 ); static tFloat64 float64_data[] = { 0.0, 1.0, 2.0, 3.0, 0.5, 0.25, 0.75, -1.0, -2.0, -3.0, M_PI }; static int float64_data_num = sizeof( float64_data ) / sizeof( tFloat64 ); void ReadFile( const char *filename, void *p, int size ) { int fd = open( filename, O_RDONLY ); if ( fd == -1 ) { fprintf( stderr, "cannot open %s: %s !\n", filename, strerror( errno ) ); close( fd ); return; } int rv = read( fd, p, size ); if ( rv != size ) fprintf( stderr, "cannot read %s: %s !\n", filename, strerror( errno ) ); close( fd ); } void WriteFile( const char *filename, void *p, int size ) { int fd = open(filename, O_CREAT|O_TRUNC|O_WRONLY, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH); if ( fd == -1 ) { fprintf( stderr, "cannot create %s: %s !\n", filename, strerror( errno ) ); close( fd ); return; } int rv = write( fd, p, size ); if ( rv != size ) fprintf( stderr, "cannot write to %s: %s !\n", filename, strerror( errno ) ); close( fd ); } int main( int argc, char *argv[] ) { int i; // float 32 WriteFile( "Float32.bin", float32_data, sizeof( float32_data ) ); tFloat32 f32[sizeof( float32_data ) / sizeof( tFloat32 )]; ReadFile( "Float32.bin", f32, sizeof( float32_data ) ); if ( memcmp( float32_data, f32, sizeof( float32_data ) ) ) { fprintf( stderr, "read/write float 32 error !\n" ); return 1; } // float 64 WriteFile( "Float64.bin", float64_data, sizeof( float64_data ) ); tFloat64 f64[sizeof( float64_data ) / sizeof( tFloat64 )]; ReadFile( "Float64.bin", f64, sizeof( float64_data ) ); if ( memcmp( float64_data, f64, sizeof( float64_data ) ) ) { fprintf( stderr, "read/write float 64 error !\n" ); return 1; } // conversion if ( G_BYTE_ORDER == G_LITTLE_ENDIAN ) ReadFile( "Float32.bin.ppc", f32, sizeof( float32_data ) ); else ReadFile( "Float32.bin.i386", f32, sizeof( float32_data ) ); char *p = (char *)f32; for( i = 0; i < float32_data_num; i++, p += sizeof( tFloat32 ) ) { /* compile error */ // unsigned int v = *(unsigned int *)p; unsigned int v = *(unsigned int *)(void *)p; v = GUINT32_SWAP_LE_BE( v ); /* compile error */ // *(unsigned int *)p = v; *(unsigned int *)(void *)p = v; } if ( memcmp( float32_data, f32, sizeof( float32_data ) ) ) { fprintf( stderr, "byteswap float 32 fail !\n" ); return 1; } // conversion if ( G_BYTE_ORDER == G_LITTLE_ENDIAN ) ReadFile( "Float64.bin.ppc", f64, sizeof( float64_data ) ); else ReadFile( "Float64.bin.i386", f64, sizeof( float64_data ) ); p = (char *)f64; for( i = 0; i < float64_data_num; i++, p += sizeof( tFloat64 ) ) { /* compile error */ // unsigned long long v = *(unsigned long long *)p; unsigned long long v = *(unsigned long long *)(void *)p; v = GUINT64_SWAP_LE_BE( v ); /* compile error */ // *(unsigned long long *)p = v; *(unsigned long long *)(void *)p = v; } if ( memcmp( float64_data, f64, sizeof( float64_data ) ) ) { fprintf( stderr, "byteswap float 64 fail !\n" ); return 1; } return 0; } openhpi-3.6.1/marshal/t/marshal_hpi_types_027.c0000644000175100017510000000453612575647264020346 0ustar mohanmohan/* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include "marshal_hpi_types.h" #include #include #include static int cmp_name( SaHpiNameT *d1, SaHpiNameT *d2 ) { if ( d1->Length != d2->Length ) return 0; if ( memcmp(&d1->Value, &d2->Value, SA_HPI_MAX_NAME_LENGTH) != 0 ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiNameT m_v1; tUint8 m_pad2; SaHpiNameT m_v2; SaHpiNameT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiNameType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiNameType ), dStructElement( cTest, m_v3 , SaHpiNameType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.Length = 7, .m_v1.Value = "My text", .m_pad2 = 48, .m_v2.Length = 9, .m_v2.Value = "Next text", .m_v3.Length = 15, .m_v3.Value = "My text my text", .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_name( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_name( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_name( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_hpi_types_024.c0000644000175100017510000000500412575647263020331 0ustar mohanmohan/* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include "marshal_hpi_types.h" #include #include #include static int cmp_inventoryrec( SaHpiInventoryRecT *d1, SaHpiInventoryRecT *d2 ) { if ( d1->IdrId != d2->IdrId ) return 0; if ( d1->Persistent != d2->Persistent ) return 0; if ( d1->Oem != d2->Oem ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiInventoryRecT m_v1; tUint8 m_pad2; SaHpiInventoryRecT m_v2; SaHpiInventoryRecT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiInventoryRecType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiInventoryRecType ), dStructElement( cTest, m_v3 , SaHpiInventoryRecType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.IdrId = 1, .m_v1.Persistent = TRUE, .m_v1.Oem = 0, .m_pad2 = 48, .m_v2.IdrId = 2, .m_v2.Persistent = FALSE, .m_v2.Oem = 3, .m_v3.IdrId = 3, .m_v3.Persistent = TRUE, .m_v3.Oem = 2, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_inventoryrec( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_inventoryrec( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_inventoryrec( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_003.c0000644000175100017510000000170112575647264016243 0ustar mohanmohan/* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include #include "marshal.h" int main( int argc, char *argv[] ) { tUint64 value = 0xfedc12345678abcdLL; tUint64 result; unsigned char buffer[256]; unsigned int s1 = Marshal( &Marshal_Uint64Type, &value, buffer ); if ( s1 != sizeof( tUint64 ) ) return 1; unsigned int s2 = Demarshal( G_BYTE_ORDER, &Marshal_Uint64Type, &result, buffer ); if ( s2 != sizeof( tUint64 ) ) return 1; if ( value != result ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_hpi_types_010.c0000644000175100017510000000605512575647263020333 0ustar mohanmohan/* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include "marshal_hpi_types.h" #include #include #include static int cmp_text_buffer( SaHpiTextBufferT *d1, SaHpiTextBufferT *d2 ) { if ( d1->DataType != d2->DataType ) return 0; if ( d1->Language != d2->Language ) return 0; if ( d1->DataLength != d2->DataLength ) return 0; return memcmp( d1->Data, d2->Data, d1->DataLength ) ? 0 : 1; } static int cmp_ctrlstatetext( SaHpiCtrlStateTextT *d1, SaHpiCtrlStateTextT *d2 ) { if ( d1->Line != d2->Line ) return 0; if ( !cmp_text_buffer( &d1->Text, &d2->Text ) ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiCtrlStateTextT m_v1; tUint8 m_pad2; SaHpiCtrlStateTextT m_v2; SaHpiCtrlStateTextT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiCtrlStateTextType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiCtrlStateTextType ), dStructElement( cTest, m_v3 , SaHpiCtrlStateTextType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.Line = 1, .m_v1.Text.DataType = SAHPI_TL_TYPE_BINARY, .m_v1.Text.Language = SAHPI_LANG_TSONGA, .m_v1.Text.DataLength = 3, .m_v1.Text.Data = "AB", .m_pad2 = 48, .m_v2.Line = 1, .m_v2.Text.DataType = SAHPI_TL_TYPE_BCDPLUS, .m_v2.Text.Language = SAHPI_LANG_SANGRO, .m_v2.Text.DataLength = 21, .m_v2.Text.Data = "12345678901234567890", .m_v3.Line = 1, .m_v3.Text.DataType = SAHPI_TL_TYPE_ASCII6, .m_v3.Text.Language = SAHPI_LANG_TAJIK, .m_v3.Text.DataLength = 0, .m_v3.Text.Data = "", .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_ctrlstatetext( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_ctrlstatetext( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_ctrlstatetext( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_018.c0000644000175100017510000000165212575647263016255 0ustar mohanmohan/* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include #include "marshal.h" #include int main( int argc, char *argv[] ) { tInt64 value = 0x1234567890abcdefLL; tInt64 swap = GUINT64_SWAP_LE_BE( value ); tInt64 result; unsigned int s = Demarshal( G_BYTE_ORDER == G_LITTLE_ENDIAN ? G_BIG_ENDIAN : G_LITTLE_ENDIAN, &Marshal_Int64Type, &result, &swap ); if ( s != sizeof( tInt64 ) ) return 1; if ( value != result ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_026.c0000644000175100017510000000526112575647264016255 0ustar mohanmohan/* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include #include "marshal.h" #include typedef struct { tUint8 m_u8; tUint16 m_u16; } cTest2; cMarshalType Test2Elements[] = { dStructElement( cTest2, m_u8 , Marshal_Uint8Type ), dStructElement( cTest2, m_u16, Marshal_Uint16Type ), dStructElementEnd() }; cMarshalType Test2Type = dStruct( Test2Elements ); typedef struct { tUint16 m_u16; tUint8 m_u8; } cTest3; cMarshalType Test3Elements[] = { dStructElement( cTest3, m_u16, Marshal_Uint16Type ), dStructElement( cTest3, m_u8 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType Test3Type = dStruct( Test3Elements ); typedef struct { tUint8 m_u81; tUint16 m_u16; cTest2 m_struct2; tUint8 m_u82; cTest3 m_struct3; tUint8 m_u83; } cTest1; cMarshalType Test1Elements[] = { dStructElement( cTest1, m_u81, Marshal_Uint8Type ), dStructElement( cTest1, m_u16, Marshal_Uint16Type ), dStructElement( cTest1, m_struct2, Test2Type ), dStructElement( cTest1, m_u82, Marshal_Uint8Type ), dStructElement( cTest1, m_struct3, Test3Type ), dStructElement( cTest1, m_u83, Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType Test1Type = dStruct( Test1Elements ); int main( int argc, char *argv[] ) { cTest1 value = { .m_u81 = 0x42, .m_u16 = 0x1234, .m_struct2.m_u8 = 0x17, .m_struct2.m_u16 = 0x6789, .m_u82 = 0x43, .m_struct3.m_u16 = 0x3456, .m_struct3.m_u8 = 0x18, .m_u83 = 0x44 }; unsigned char buffer[256]; cTest1 result; unsigned int s1 = Marshal( &Test1Type, &value, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &Test1Type, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_u81 != result.m_u81 ) return 1; if ( value.m_u16 != result.m_u16 ) return 1; if ( value.m_struct2.m_u8 != result.m_struct2.m_u8 ) return 1; if ( value.m_struct2.m_u16 != result.m_struct2.m_u16 ) return 1; if ( value.m_u82 != result.m_u82 ) return 1; if ( value.m_struct3.m_u16 != result.m_struct3.m_u16 ) return 1; if ( value.m_struct3.m_u8 != result.m_struct3.m_u8 ) return 1; if ( value.m_u83 != result.m_u83 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_hpi_types_047.c0000644000175100017510000001035312575647263020341 0ustar mohanmohan/* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include "marshal_hpi_types.h" #include #include #include static int cmp_eventloginfo( SaHpiEventLogInfoT *d1, SaHpiEventLogInfoT *d2 ) { if ( d1->Entries != d2->Entries ) return 0; if ( d1->Size != d2->Size ) return 0; if ( d1->UserEventMaxSize != d2->UserEventMaxSize ) return 0; if ( d1->UpdateTimestamp != d2->UpdateTimestamp ) return 0; if ( d1->CurrentTime != d2->CurrentTime ) return 0; if ( d1->Enabled != d2->Enabled ) return 0; if ( d1->OverflowFlag != d2->OverflowFlag ) return 0; if ( d1->OverflowResetable != d2->OverflowResetable ) return 0; if ( d1->OverflowAction != d2->OverflowAction ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiEventLogInfoT m_v1; tUint8 m_pad2; SaHpiEventLogInfoT m_v2; SaHpiEventLogInfoT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiEventLogInfoType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiEventLogInfoType ), dStructElement( cTest, m_v3 , SaHpiEventLogInfoType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.Entries = 1, .m_v1.Size = 100, .m_v1.UserEventMaxSize = 100, .m_v1.UpdateTimestamp = 2000, .m_v1.CurrentTime = 2010, .m_v1.Enabled = TRUE, .m_v1.OverflowFlag = FALSE, .m_v1.OverflowResetable = TRUE, .m_v1.OverflowAction = SAHPI_EL_OVERFLOW_DROP, .m_pad2 = 48, .m_v2.Entries = 100, .m_v2.Size = 110, .m_v2.UserEventMaxSize = 100, .m_v2.UpdateTimestamp = 4000, .m_v2.CurrentTime = 4010, .m_v2.Enabled = FALSE, .m_v2.OverflowFlag = TRUE, .m_v2.OverflowResetable = FALSE, .m_v2.OverflowAction = SAHPI_EL_OVERFLOW_OVERWRITE, .m_v3.Entries = 1000, .m_v3.Size = 10, .m_v3.UserEventMaxSize = 20, .m_v3.UpdateTimestamp = 3000, .m_v3.CurrentTime = 3010, .m_v3.Enabled = TRUE, .m_v3.OverflowFlag = TRUE, .m_v3.OverflowResetable = TRUE, .m_v3.OverflowAction = SAHPI_EL_OVERFLOW_DROP, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_eventloginfo( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_eventloginfo( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_eventloginfo( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_011.c0000644000175100017510000000153412575647264016246 0ustar mohanmohan/* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include #include "marshal.h" int main( int argc, char *argv[] ) { tUint8 value = 0x42; tUint8 result; unsigned int s = Demarshal( G_BYTE_ORDER == G_LITTLE_ENDIAN ? G_BIG_ENDIAN : G_LITTLE_ENDIAN, &Marshal_Uint8Type, &result, &value ); if ( s != sizeof( tUint8 ) ) return 1; if ( value != result ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_hpi_types_028.c0000644000175100017510000001513612575647263020344 0ustar mohanmohan/* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include "marshal_hpi_types.h" #include #include #include static int cmp_text_buffer( SaHpiTextBufferT *d1, SaHpiTextBufferT *d2 ) { if ( d1->DataType != d2->DataType ) return 0; if ( d1->Language != d2->Language ) return 0; if ( d1->DataLength != d2->DataLength ) return 0; return memcmp( d1->Data, d2->Data, d1->DataLength ) ? 0 : 1; } static int cmp_entity( SaHpiEntityT *d1, SaHpiEntityT *d2 ) { if ( d1->EntityType != d2->EntityType ) return 0; if ( d1->EntityLocation != d2->EntityLocation ) return 0; return 1; } static int cmp_entitypath( SaHpiEntityPathT *d1, SaHpiEntityPathT *d2 ) { int i; for (i = 0; ; i++) { if (d1->Entry[i].EntityType == SAHPI_ENT_ROOT && d2->Entry[i].EntityType == SAHPI_ENT_ROOT) { return 1; } if ( cmp_entity(&d1->Entry[i], &d2->Entry[i]) == 0 ) return 0; } return 1; } static int cmp_name( SaHpiNameT *d1, SaHpiNameT *d2 ) { if ( d1->Length != d2->Length ) return 0; if ( memcmp(&d1->Value, &d2->Value, SA_HPI_MAX_NAME_LENGTH) != 0 ) return 0; return 1; } static int cmp_condition( SaHpiConditionT *d1, SaHpiConditionT *d2 ) { if ( d1->Type != d2->Type ) return 0; if ( !cmp_entitypath( &d1->Entity, &d2->Entity ) ) return 0; if ( d1->DomainId != d2->DomainId ) return 0; if ( d1->ResourceId != d2->ResourceId ) return 0; if ( d1->SensorNum != d2->SensorNum ) return 0; if ( d1->SensorNum != d2->SensorNum ) return 0; if ( d1->EventState != d2->EventState ) return 0; if ( !cmp_name( &d1->Name, &d2->Name ) ) return 0; if ( d1->Mid != d2->Mid ) return 0; if ( !cmp_text_buffer( &d1->Data, &d2->Data ) ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiConditionT m_v1; tUint8 m_pad2; SaHpiConditionT m_v2; SaHpiConditionT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiConditionType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiConditionType ), dStructElement( cTest, m_v3 , SaHpiConditionType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.Type = SAHPI_STATUS_COND_TYPE_SENSOR, .m_v1.Entity.Entry[0].EntityType = SAHPI_ENT_SYSTEM_BOARD, .m_v1.Entity.Entry[0].EntityLocation = 1, .m_v1.Entity.Entry[1].EntityType = SAHPI_ENT_POWER_UNIT, .m_v1.Entity.Entry[1].EntityLocation = 2, .m_v1.Entity.Entry[2].EntityType = SAHPI_ENT_ROOT, .m_v1.Entity.Entry[2].EntityLocation = 0, .m_v1.DomainId = SAHPI_UNSPECIFIED_DOMAIN_ID, .m_v1.ResourceId = 1, .m_v1.SensorNum = 1, .m_v1.EventState = SAHPI_ES_LOWER_MINOR, .m_v1.Name.Length = 9, .m_v1.Name.Value = "Next text", .m_v1.Mid = 3, .m_v1.Data.DataType = SAHPI_TL_TYPE_TEXT, .m_v1.Data.Language = SAHPI_LANG_ENGLISH, .m_v1.Data.DataLength = 3, .m_v1.Data.Data = "AB", .m_pad2 = 48, .m_v2.Type = SAHPI_STATUS_COND_TYPE_RESOURCE, .m_v2.Entity.Entry[0].EntityType = SAHPI_ENT_SUB_CHASSIS, .m_v2.Entity.Entry[0].EntityLocation = 1, .m_v2.Entity.Entry[1].EntityType = SAHPI_ENT_SYSTEM_BUS, .m_v2.Entity.Entry[1].EntityLocation = 2, .m_v2.Entity.Entry[2].EntityType = SAHPI_ENT_COOLING_DEVICE, .m_v2.Entity.Entry[2].EntityLocation = 3, .m_v2.Entity.Entry[3].EntityType = SAHPI_ENT_ROOT, .m_v2.Entity.Entry[3].EntityLocation = 0, .m_v2.DomainId = SAHPI_UNSPECIFIED_DOMAIN_ID, .m_v2.ResourceId = 2, .m_v2.SensorNum = 4, .m_v2.EventState = SAHPI_ES_LOWER_CRIT, .m_v2.Name.Length = 9, .m_v2.Name.Value = "Next text", .m_v2.Mid = 3, .m_v2.Data.DataType = SAHPI_TL_TYPE_TEXT, .m_v2.Data.Language = SAHPI_LANG_ENGLISH, .m_v2.Data.DataLength = 3, .m_v2.Data.Data = "AB", .m_v3.Type = SAHPI_STATUS_COND_TYPE_OEM, .m_v3.Entity.Entry[0].EntityType = SAHPI_ENT_PROCESSOR, .m_v3.Entity.Entry[0].EntityLocation = 1, .m_v3.Entity.Entry[1].EntityType = SAHPI_ENT_ROOT, .m_v3.Entity.Entry[1].EntityLocation = 0, .m_v3.DomainId = SAHPI_UNSPECIFIED_DOMAIN_ID, .m_v3.ResourceId = 3, .m_v3.SensorNum = 5, .m_v3.EventState = SAHPI_ES_UPPER_MAJOR, .m_v3.Name.Length = 9, .m_v3.Name.Value = "Next text", .m_v3.Mid = 3, .m_v3.Data.DataType = SAHPI_TL_TYPE_BINARY, .m_v3.Data.Language = SAHPI_LANG_ENGLISH, .m_v3.Data.DataLength = 3, .m_v3.Data.Data = "AB", .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_condition( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_condition( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_condition( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_hpi_types_000.c0000644000175100017510000000525712575647264020336 0ustar mohanmohan/* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include #include "marshal_hpi_types.h" #include #include #include static int cmp_text_buffer( SaHpiTextBufferT *d1, SaHpiTextBufferT *d2 ) { if ( d1->DataType != d2->DataType ) return 0; if ( d1->Language != d2->Language ) return 0; if ( d1->DataLength != d2->DataLength ) return 0; return memcmp( d1->Data, d2->Data, d1->DataLength ) ? 0 : 1; } typedef struct { tUint8 m_pad1; SaHpiTextBufferT m_tb1; tUint8 m_pad2; SaHpiTextBufferT m_tb2; SaHpiTextBufferT m_tb3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_tb1 , SaHpiTextBufferType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_tb2 , SaHpiTextBufferType ), dStructElement( cTest, m_tb3 , SaHpiTextBufferType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_tb1.DataType = SAHPI_TL_TYPE_BINARY, .m_tb1.Language = SAHPI_LANG_TSONGA, .m_tb1.DataLength = 3, .m_tb1.Data = "AB", .m_pad2 = 48, .m_tb2.DataType = SAHPI_TL_TYPE_BCDPLUS, .m_tb2.Language = SAHPI_LANG_SANGRO, .m_tb2.DataLength = 21, .m_tb2.Data = "12345678901234567890", .m_tb3.DataType = SAHPI_TL_TYPE_ASCII6, .m_tb3.Language = SAHPI_LANG_TAJIK, .m_tb3.DataLength = 0, .m_tb3.Data = "", .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_text_buffer( &value.m_tb1, &result.m_tb1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_text_buffer( &value.m_tb2, &result.m_tb2 ) ) return 1; if ( !cmp_text_buffer( &value.m_tb3, &result.m_tb3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_hpi_types_011.c0000644000175100017510000000503312575647264020330 0ustar mohanmohan/* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include "marshal_hpi_types.h" #include #include #include static int cmp_ctrlstateoem( SaHpiCtrlStateOemT *d1, SaHpiCtrlStateOemT *d2 ) { if ( d1->MId != d2->MId ) return 0; if ( d1->BodyLength != d2->BodyLength ) return 0; if ( memcmp(d1->Body, d2->Body, SAHPI_CTRL_MAX_OEM_BODY_LENGTH) != 0 ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiCtrlStateOemT m_v1; tUint8 m_pad2; SaHpiCtrlStateOemT m_v2; SaHpiCtrlStateOemT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiCtrlStateOemType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiCtrlStateOemType ), dStructElement( cTest, m_v3 , SaHpiCtrlStateOemType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.MId = 0, .m_v1.BodyLength = 4, .m_v1.Body = {'A', 'B', 'c', 'd'}, .m_pad2 = 48, .m_v2.MId = 1, .m_v2.BodyLength = 4, .m_v2.Body = {'d', 'c', 'B', 'A'}, .m_v3.MId = 1, .m_v3.BodyLength = 1, .m_v3.Body = {'A'}, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_ctrlstateoem( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_ctrlstateoem( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_ctrlstateoem( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_005.c0000644000175100017510000000166212575647264016253 0ustar mohanmohan/* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include #include "marshal.h" int main( int argc, char *argv[] ) { tInt16 value = 0x42aa; tInt16 result; unsigned char buffer[256]; unsigned int s1 = Marshal( &Marshal_Int16Type, &value, buffer ); if ( s1 != sizeof( tInt16 ) ) return 1; unsigned int s2 = Demarshal( G_BYTE_ORDER, &Marshal_Int16Type, &result, buffer ); if ( s2 != sizeof( tInt16 ) ) return 1; if ( value != result ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_006.c0000644000175100017510000000166612575647263016257 0ustar mohanmohan/* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include #include "marshal.h" int main( int argc, char *argv[] ) { tInt32 value = 0x42aa1234; tInt32 result; unsigned char buffer[256]; unsigned int s1 = Marshal( &Marshal_Int32Type, &value, buffer ); if ( s1 != sizeof( tInt32 ) ) return 1; unsigned int s2 = Demarshal( G_BYTE_ORDER, &Marshal_Int32Type, &result, buffer ); if ( s2 != sizeof( tInt32 ) ) return 1; if ( value != result ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_hpi_types_048.c0000644000175100017510000001175512575647264020352 0ustar mohanmohan/* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include "marshal_hpi_types.h" #include #include #include static int cmp_text_buffer( SaHpiTextBufferT *d1, SaHpiTextBufferT *d2 ) { if ( d1->DataType != d2->DataType ) return 0; if ( d1->Language != d2->Language ) return 0; if ( d1->DataLength != d2->DataLength ) return 0; return memcmp( d1->Data, d2->Data, d1->DataLength ) ? 0 : 1; } static int cmp_userevent( SaHpiUserEventT *d1, SaHpiUserEventT *d2 ) { if ( !cmp_text_buffer( &d1->UserEventData, &d2->UserEventData ) ) return 0; return 1; } static int cmp_event( SaHpiEventT *d1, SaHpiEventT *d2 ) { if ( d1->Source != d2->Source ) return 0; if ( d1->EventType != d2->EventType ) return 0; if ( d1->Timestamp != d2->Timestamp ) return 0; if ( !cmp_userevent( &d1->EventDataUnion.UserEvent, &d2->EventDataUnion.UserEvent ) ) return 0; return 1; } static int cmp_eventlogentry( SaHpiEventLogEntryT *d1, SaHpiEventLogEntryT *d2 ) { if ( d1->EntryId != d2->EntryId ) return 0; if ( d1->Timestamp != d2->Timestamp ) return 0; if ( !cmp_event( &d1->Event, &d2->Event ) ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiEventLogEntryT m_v1; tUint8 m_pad2; SaHpiEventLogEntryT m_v2; SaHpiEventLogEntryT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiEventLogEntryType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiEventLogEntryType ), dStructElement( cTest, m_v3 , SaHpiEventLogEntryType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.EntryId = 1, .m_v1.Timestamp = 1000, .m_v1.Event.Source = 1, .m_v1.Event.EventType = SAHPI_ET_USER, .m_v1.Event.Timestamp = 1000, .m_v1.Event.EventDataUnion.UserEvent.UserEventData.DataType = SAHPI_TL_TYPE_BINARY, .m_v1.Event.EventDataUnion.UserEvent.UserEventData.Language = SAHPI_LANG_TSONGA, .m_v1.Event.EventDataUnion.UserEvent.UserEventData.DataLength = 3, .m_v1.Event.EventDataUnion.UserEvent.UserEventData.Data = "AB", .m_pad2 = 48, .m_v2.EntryId = 2, .m_v2.Timestamp = 2000, .m_v2.Event.Source = 2, .m_v2.Event.EventType = SAHPI_ET_USER, .m_v2.Event.Timestamp = 1200, .m_v2.Event.EventDataUnion.UserEvent.UserEventData.DataType = SAHPI_TL_TYPE_BCDPLUS, .m_v2.Event.EventDataUnion.UserEvent.UserEventData.Language = SAHPI_LANG_SANGRO, .m_v2.Event.EventDataUnion.UserEvent.UserEventData.DataLength = 21, .m_v2.Event.EventDataUnion.UserEvent.UserEventData.Data = "12345678901234567890", .m_v3.EntryId = 3, .m_v3.Timestamp = 3000, .m_v3.Event.Source = 3, .m_v3.Event.EventType = SAHPI_ET_USER, .m_v3.Event.Timestamp = 1030, .m_v3.Event.EventDataUnion.UserEvent.UserEventData.DataType = SAHPI_TL_TYPE_ASCII6, .m_v3.Event.EventDataUnion.UserEvent.UserEventData.Language = SAHPI_LANG_TAJIK, .m_v3.Event.EventDataUnion.UserEvent.UserEventData.DataLength = 0, .m_v3.Event.EventDataUnion.UserEvent.UserEventData.Data = "", .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( G_BYTE_ORDER, &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_eventlogentry( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_eventlogentry( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_eventlogentry( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_016.c0000644000175100017510000000163512575647263016254 0ustar mohanmohan/* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include #include "marshal.h" #include int main( int argc, char *argv[] ) { tInt16 value = 0x42aa; tInt16 swap = GUINT16_SWAP_LE_BE( value ); tInt16 result; unsigned int s = Demarshal( G_BYTE_ORDER == G_LITTLE_ENDIAN ? G_BIG_ENDIAN : G_LITTLE_ENDIAN, &Marshal_Int16Type, &result, &swap ); if ( s != sizeof( tInt16 ) ) return 1; if ( value != result ) return 1; return 0; } openhpi-3.6.1/marshal/t/marshal_007.c0000644000175100017510000000167512575647264016261 0ustar mohanmohan/* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include #include "marshal.h" int main( int argc, char *argv[] ) { tInt64 value = 0x1234567890abcdefLL; tInt64 result; unsigned char buffer[256]; unsigned int s1 = Marshal( &Marshal_Int64Type, &value, buffer ); if ( s1 != sizeof( tInt64 ) ) return 1; unsigned int s2 = Demarshal( G_BYTE_ORDER, &Marshal_Int64Type, &result, buffer ); if ( s2 != sizeof( tInt64 ) ) return 1; if ( value != result ) return 1; return 0; } openhpi-3.6.1/marshal/marshal_hpi.c0000644000175100017510000014543212575647264016270 0ustar mohanmohan/* * marshaling/demarshaling of hpi functions * * Copyright (c) 2004 by FORCE Computers. * (C) Copyright Pigeon Point Systems. 2010 * (C) Copyright Nokia Siemens Networks 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * W. David Ashley * Renier Morales * Anton Pak * Ulrich Kleber */ #include #include #include "marshal_hpi.h" static const cMarshalType *saHpiSessionOpenIn[] = { &SaHpiDomainIdType, // domain id (SaHpiDomainIdT) 0 }; static const cMarshalType *saHpiSessionOpenOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiSessionIdType, // session id (SaHpiSessionIdT) 0 }; static const cMarshalType *saHpiSessionCloseIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) 0 }; static const cMarshalType *saHpiSessionCloseOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiDiscoverIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) 0 }; static const cMarshalType *saHpiDiscoverOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiDomainInfoGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) 0 }; static const cMarshalType *saHpiDomainInfoGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiDomainInfoType, 0 }; static const cMarshalType *saHpiDrtEntryGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiEntryIdType, // entry id (SaHpiEntryIdT) 0 }; static const cMarshalType *saHpiDrtEntryGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiEntryIdType, &SaHpiDrtEntryType, 0 }; static const cMarshalType *saHpiDomainTagSetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiTextBufferType, // domain tag (SaHpiTextBufferT) 0 }; static const cMarshalType *saHpiDomainTagSetOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiRptEntryGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiEntryIdType, 0 }; static const cMarshalType *saHpiRptEntryGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiEntryIdType, &SaHpiRptEntryType, 0 }; static const cMarshalType *saHpiRptEntryGetByResourceIdIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, 0 }; static const cMarshalType *saHpiRptEntryGetByResourceIdOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiRptEntryType, 0 }; static const cMarshalType *saHpiResourceSeveritySetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiSeverityType, 0 }; static const cMarshalType *saHpiResourceSeveritySetOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiResourceTagSetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiTextBufferType, 0 }; static const cMarshalType *saHpiResourceTagSetOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiMyEntityPathGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) 0 }; static const cMarshalType *saHpiMyEntityPathGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiEntityPathType, 0 }; static const cMarshalType *saHpiResourceIdGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) 0 }; static const cMarshalType *saHpiResourceIdGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiResourceIdType, 0 }; static const cMarshalType *saHpiGetIdByEntityPathIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiEntityPathType, &SaHpiRdrTypeType, &SaHpiUint32Type, 0 }; static const cMarshalType *saHpiGetIdByEntityPathOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiUint32Type, &SaHpiResourceIdType, &SaHpiInstrumentIdType, &SaHpiUint32Type, 0 }; static const cMarshalType *saHpiGetChildEntityPathIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiEntityPathType, &SaHpiUint32Type, 0 }; static const cMarshalType *saHpiGetChildEntityPathOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiUint32Type, &SaHpiEntityPathType, &SaHpiUint32Type, 0 }; static const cMarshalType *saHpiResourceFailedRemoveIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, 0 }; static const cMarshalType *saHpiResourceFailedRemoveOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiEventLogInfoGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, 0 }; static const cMarshalType *saHpiEventLogInfoGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiEventLogInfoType, 0 }; static const cMarshalType *saHpiEventLogCapabilitiesGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, 0 }; static const cMarshalType *saHpiEventLogCapabilitiesGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiEventLogCapabilitiesType, 0 }; static const cMarshalType *saHpiEventLogEntryGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiEventLogEntryIdType, 0 }; static const cMarshalType *saHpiEventLogEntryGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiEventLogEntryIdType, &SaHpiEventLogEntryIdType, &SaHpiEventLogEntryType, &SaHpiRdrType, &SaHpiRptEntryType, 0 }; static const cMarshalType *saHpiEventLogEntryAddIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiEventType, 0 }; static const cMarshalType *saHpiEventLogEntryAddOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiEventLogClearIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, 0 }; static const cMarshalType *saHpiEventLogClearOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiEventLogTimeGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, 0 }; static const cMarshalType *saHpiEventLogTimeGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiTimeType, 0 }; static const cMarshalType *saHpiEventLogTimeSetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiTimeType, 0 }; static const cMarshalType *saHpiEventLogTimeSetOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiEventLogStateGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, 0 }; static const cMarshalType *saHpiEventLogStateGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiBoolType, 0 }; static const cMarshalType *saHpiEventLogStateSetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiBoolType, 0 }; static const cMarshalType *saHpiEventLogStateSetOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiEventLogOverflowResetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, 0 }; static const cMarshalType *saHpiEventLogOverflowResetOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiSubscribeIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) 0 }; static const cMarshalType *saHpiSubscribeOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiUnsubscribeIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) 0 }; static const cMarshalType *saHpiUnsubscribeOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiEventGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiTimeoutType, 0 }; static const cMarshalType *saHpiEventGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiEventType, &SaHpiRdrType, &SaHpiRptEntryType, &SaHpiEvtQueueStatusType, 0 }; static const cMarshalType *saHpiEventAddIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiEventType, 0 }; static const cMarshalType *saHpiEventAddOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiAlarmGetNextIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiSeverityType, &SaHpiBoolType, &SaHpiAlarmType, 0 }; static const cMarshalType *saHpiAlarmGetNextOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiAlarmType, 0 }; static const cMarshalType *saHpiAlarmGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiAlarmIdType, 0 }; static const cMarshalType *saHpiAlarmGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiAlarmType, 0 }; static const cMarshalType *saHpiAlarmAcknowledgeIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiAlarmIdType, &SaHpiSeverityType, 0 }; static const cMarshalType *saHpiAlarmAcknowledgeOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiAlarmAddIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiAlarmType, 0 }; static const cMarshalType *saHpiAlarmAddOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiAlarmType, 0 }; static const cMarshalType *saHpiAlarmDeleteIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiAlarmIdType, &SaHpiSeverityType, 0 }; static const cMarshalType *saHpiAlarmDeleteOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiRdrGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiEntryIdType, 0 }; static const cMarshalType *saHpiRdrGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiEntryIdType, &SaHpiRdrType, 0 }; static const cMarshalType *saHpiRdrGetByInstrumentIdIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiRdrTypeType, &SaHpiInstrumentIdType, 0 }; static const cMarshalType *saHpiRdrGetByInstrumentIdOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiRdrType, 0 }; static const cMarshalType *saHpiRdrUpdateCountGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, 0 }; static const cMarshalType *saHpiRdrUpdateCountGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiUint32Type, 0 }; static const cMarshalType *saHpiSensorReadingGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiSensorNumType, 0 }; static const cMarshalType *saHpiSensorReadingGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiSensorReadingType, &SaHpiEventStateType, 0 }; static const cMarshalType *saHpiSensorThresholdsGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiSensorNumType, 0 }; static const cMarshalType *saHpiSensorThresholdsGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiSensorThresholdsType, 0 }; static const cMarshalType *saHpiSensorThresholdsSetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiSensorNumType, &SaHpiSensorThresholdsType, 0 }; static const cMarshalType *saHpiSensorThresholdsSetOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiSensorTypeGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiSensorNumType, 0 }; static const cMarshalType *saHpiSensorTypeGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiSensorTypeType, &SaHpiEventCategoryType, 0 }; static const cMarshalType *saHpiSensorEnableGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiSensorNumType, 0 }; static const cMarshalType *saHpiSensorEnableGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiBoolType, 0 }; static const cMarshalType *saHpiSensorEnableSetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiSensorNumType, &SaHpiBoolType, 0 }; static const cMarshalType *saHpiSensorEnableSetOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiSensorEventEnableGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiSensorNumType, 0 }; static const cMarshalType *saHpiSensorEventEnableGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiBoolType, 0 }; static const cMarshalType *saHpiSensorEventEnableSetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiSensorNumType, &SaHpiBoolType, 0 }; static const cMarshalType *saHpiSensorEventEnableSetOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiSensorEventMasksGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiSensorNumType, &SaHpiEventStateType, &SaHpiEventStateType, 0 }; static const cMarshalType *saHpiSensorEventMasksGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiEventStateType, &SaHpiEventStateType, 0 }; static const cMarshalType *saHpiSensorEventMasksSetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiSensorNumType, &SaHpiUint32Type, &SaHpiEventStateType, &SaHpiEventStateType, 0 }; static const cMarshalType *saHpiSensorEventMasksSetOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiControlTypeGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiCtrlNumType, 0 }; static const cMarshalType *saHpiControlTypeGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiCtrlTypeType, 0 }; static const cMarshalType *saHpiControlGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiCtrlNumType, &SaHpiCtrlStateType, 0 }; static const cMarshalType *saHpiControlGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiCtrlModeType, &SaHpiCtrlStateType, 0 }; static const cMarshalType *saHpiControlSetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiCtrlNumType, &SaHpiCtrlModeType, &SaHpiCtrlStateType, 0 }; static const cMarshalType *saHpiControlSetOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiIdrInfoGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiIdrIdType, 0 }; static const cMarshalType *saHpiIdrInfoGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiIdrInfoType, 0 }; static const cMarshalType *saHpiIdrAreaHeaderGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiIdrIdType, &SaHpiIdrAreaTypeType, &SaHpiEntryIdType, 0 }; static const cMarshalType *saHpiIdrAreaHeaderGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiEntryIdType, &SaHpiIdrAreaHeaderType, 0 }; static const cMarshalType *saHpiIdrAreaAddIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiIdrIdType, &SaHpiIdrAreaTypeType, 0 }; static const cMarshalType *saHpiIdrAreaAddOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiEntryIdType, 0 }; static const cMarshalType *saHpiIdrAreaAddByIdIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiIdrIdType, &SaHpiIdrAreaTypeType, &SaHpiEntryIdType, 0 }; static const cMarshalType *saHpiIdrAreaAddByIdOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiIdrAreaDeleteIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiIdrIdType, &SaHpiEntryIdType, 0 }; static const cMarshalType *saHpiIdrAreaDeleteOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiIdrFieldGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiIdrIdType, &SaHpiEntryIdType, &SaHpiIdrFieldTypeType, &SaHpiEntryIdType, 0 }; static const cMarshalType *saHpiIdrFieldGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiEntryIdType, &SaHpiIdrFieldType, 0 }; static const cMarshalType *saHpiIdrFieldAddIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiIdrIdType, &SaHpiIdrFieldType, 0 }; static const cMarshalType *saHpiIdrFieldAddOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiIdrFieldType, 0 }; static const cMarshalType *saHpiIdrFieldAddByIdIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiIdrIdType, &SaHpiIdrFieldType, 0 }; static const cMarshalType *saHpiIdrFieldAddByIdOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiIdrFieldType, 0 }; static const cMarshalType *saHpiIdrFieldSetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiIdrIdType, &SaHpiIdrFieldType, 0 }; static const cMarshalType *saHpiIdrFieldSetOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiIdrFieldDeleteIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiIdrIdType, &SaHpiEntryIdType, &SaHpiEntryIdType, 0 }; static const cMarshalType *saHpiIdrFieldDeleteOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiWatchdogTimerGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiWatchdogNumType, 0 }; static const cMarshalType *saHpiWatchdogTimerGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiWatchdogType, 0 }; static const cMarshalType *saHpiWatchdogTimerSetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiWatchdogNumType, &SaHpiWatchdogType, 0 }; static const cMarshalType *saHpiWatchdogTimerSetOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiWatchdogTimerResetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiWatchdogNumType, 0 }; static const cMarshalType *saHpiWatchdogTimerResetOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiAnnunciatorGetNextIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiAnnunciatorNumType, &SaHpiSeverityType, &SaHpiBoolType, &SaHpiAnnouncementType, 0 }; static const cMarshalType *saHpiAnnunciatorGetNextOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiAnnouncementType, 0 }; static const cMarshalType *saHpiAnnunciatorGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiAnnunciatorNumType, &SaHpiEntryIdType, 0 }; static const cMarshalType *saHpiAnnunciatorGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiAnnouncementType, 0 }; static const cMarshalType *saHpiAnnunciatorAcknowledgeIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiAnnunciatorNumType, &SaHpiEntryIdType, &SaHpiSeverityType, 0 }; static const cMarshalType *saHpiAnnunciatorAcknowledgeOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiAnnunciatorAddIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiAnnunciatorNumType, &SaHpiAnnouncementType, 0 }; static const cMarshalType *saHpiAnnunciatorAddOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiAnnouncementType, 0 }; static const cMarshalType *saHpiAnnunciatorDeleteIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiAnnunciatorNumType, &SaHpiEntryIdType, &SaHpiSeverityType, 0 }; static const cMarshalType *saHpiAnnunciatorDeleteOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiAnnunciatorModeGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiAnnunciatorNumType, 0 }; static const cMarshalType *saHpiAnnunciatorModeGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiAnnunciatorModeType, 0 }; static const cMarshalType *saHpiAnnunciatorModeSetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiAnnunciatorNumType, &SaHpiAnnunciatorModeType, 0 }; static const cMarshalType *saHpiAnnunciatorModeSetOut[] = { &SaErrorType, // result (SaErrorT) 0 }; // DIMIs static const cMarshalType *saHpiDimiInfoGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiDimiNumType, 0 }; static const cMarshalType *saHpiDimiInfoGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiDimiInfoType, 0 }; static const cMarshalType *saHpiDimiTestInfoGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiDimiNumType, &SaHpiDimiTestNumType, 0 }; static const cMarshalType *saHpiDimiTestInfoGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiDimiTestType, 0 }; static const cMarshalType *saHpiDimiTestReadinessGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiDimiNumType, &SaHpiDimiTestNumType, 0 }; static const cMarshalType *saHpiDimiTestReadinessGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiDimiReadyType, 0 }; static const cMarshalType *saHpiDimiTestStartIn[] = { &SaHpiSessionIdType, &SaHpiResourceIdType, &SaHpiDimiNumType, &SaHpiDimiTestNumType, &SaHpiDimiTestVariableParamsListType, 0 }; static const cMarshalType *saHpiDimiTestStartOut[] = { &SaErrorType, 0 }; static const cMarshalType *saHpiDimiTestCancelIn[] = { &SaHpiSessionIdType, &SaHpiResourceIdType, &SaHpiDimiNumType, &SaHpiDimiTestNumType, 0 }; static const cMarshalType *saHpiDimiTestCancelOut[] = { &SaErrorType, 0 }; static const cMarshalType *saHpiDimiTestStatusGetIn[] = { &SaHpiSessionIdType, &SaHpiResourceIdType, &SaHpiDimiNumType, &SaHpiDimiTestNumType, 0 }; static const cMarshalType *saHpiDimiTestStatusGetOut[] = { &SaErrorType, &SaHpiDimiTestPercentCompletedType, &SaHpiDimiTestRunStatusType, 0 }; static const cMarshalType *saHpiDimiTestResultsGetIn[] = { &SaHpiSessionIdType, &SaHpiResourceIdType, &SaHpiDimiNumType, &SaHpiDimiTestNumType, 0 }; static const cMarshalType *saHpiDimiTestResultsGetOut[] = { &SaErrorType, &SaHpiDimiTestResultsType, 0 }; // FUMIs static const cMarshalType *saHpiFumiSpecInfoGetIn[]= { &SaHpiSessionIdType, &SaHpiResourceIdType, &SaHpiFumiNumType, 0 }; static const cMarshalType *saHpiFumiSpecInfoGetOut[] = { &SaErrorType, &SaHpiFumiSpecInfoType, 0 }; static const cMarshalType *saHpiFumiServiceImpactGetIn[]= { &SaHpiSessionIdType, &SaHpiResourceIdType, &SaHpiFumiNumType, 0 }; static const cMarshalType *saHpiFumiServiceImpactGetOut[] = { &SaErrorType, &SaHpiFumiServiceImpactDataType, 0 }; static const cMarshalType *saHpiFumiSourceSetIn[]= { &SaHpiSessionIdType, &SaHpiResourceIdType, &SaHpiFumiNumType, &SaHpiBankNumType, &SaHpiTextBufferType, 0 }; static const cMarshalType *saHpiFumiSourceSetOut[] = { &SaErrorType, 0 }; static const cMarshalType *saHpiFumiSourceInfoValidateStartIn[]= { &SaHpiSessionIdType, &SaHpiResourceIdType, &SaHpiFumiNumType, &SaHpiBankNumType, 0 }; static const cMarshalType *saHpiFumiSourceInfoValidateStartOut[] = { &SaErrorType, 0 }; static const cMarshalType *saHpiFumiSourceInfoGetIn[]= { &SaHpiSessionIdType, &SaHpiResourceIdType, &SaHpiFumiNumType, &SaHpiBankNumType, 0 }; static const cMarshalType *saHpiFumiSourceInfoGetOut[] = { &SaErrorType, &SaHpiFumiSourceInfoType, 0 }; static const cMarshalType *saHpiFumiSourceComponentInfoGetIn[]= { &SaHpiSessionIdType, &SaHpiResourceIdType, &SaHpiFumiNumType, &SaHpiBankNumType, &SaHpiEntryIdType, 0 }; static const cMarshalType *saHpiFumiSourceComponentInfoGetOut[] = { &SaErrorType, &SaHpiEntryIdType, &SaHpiFumiComponentInfoType, 0 }; static const cMarshalType *saHpiFumiTargetInfoGetIn[]= { &SaHpiSessionIdType, &SaHpiResourceIdType, &SaHpiFumiNumType, &SaHpiBankNumType, 0 }; static const cMarshalType *saHpiFumiTargetInfoGetOut[] = { &SaErrorType, &SaHpiFumiBankInfoType, 0 }; static const cMarshalType *saHpiFumiTargetComponentInfoGetIn[]= { &SaHpiSessionIdType, &SaHpiResourceIdType, &SaHpiFumiNumType, &SaHpiBankNumType, &SaHpiEntryIdType, 0 }; static const cMarshalType *saHpiFumiTargetComponentInfoGetOut[] = { &SaErrorType, &SaHpiEntryIdType, &SaHpiFumiComponentInfoType, 0 }; static const cMarshalType *saHpiFumiLogicalTargetInfoGetIn[]= { &SaHpiSessionIdType, &SaHpiResourceIdType, &SaHpiFumiNumType, 0 }; static const cMarshalType *saHpiFumiLogicalTargetInfoGetOut[] = { &SaErrorType, &SaHpiFumiLogicalBankInfoType, 0 }; static const cMarshalType *saHpiFumiLogicalTargetComponentInfoGetIn[]= { &SaHpiSessionIdType, &SaHpiResourceIdType, &SaHpiFumiNumType, &SaHpiEntryIdType, 0 }; static const cMarshalType *saHpiFumiLogicalTargetComponentInfoGetOut[] = { &SaErrorType, &SaHpiEntryIdType, &SaHpiFumiLogicalComponentInfoType, 0 }; static const cMarshalType *saHpiFumiBackupStartIn[]= { &SaHpiSessionIdType, &SaHpiResourceIdType, &SaHpiFumiNumType, 0 }; static const cMarshalType *saHpiFumiBackupStartOut[] = { &SaErrorType, 0 }; static const cMarshalType *saHpiFumiBankBootOrderSetIn[]= { &SaHpiSessionIdType, &SaHpiResourceIdType, &SaHpiFumiNumType, &SaHpiBankNumType, &SaHpiUint32Type, 0 }; static const cMarshalType *saHpiFumiBankBootOrderSetOut[] = { &SaErrorType, 0 }; static const cMarshalType *saHpiFumiBankCopyStartIn[]= { &SaHpiSessionIdType, &SaHpiResourceIdType, &SaHpiFumiNumType, &SaHpiBankNumType, &SaHpiBankNumType, 0 }; static const cMarshalType *saHpiFumiBankCopyStartOut[] = { &SaErrorType, 0 }; static const cMarshalType *saHpiFumiInstallStartIn[]= { &SaHpiSessionIdType, &SaHpiResourceIdType, &SaHpiFumiNumType, &SaHpiBankNumType, 0 }; static const cMarshalType *saHpiFumiInstallStartOut[] = { &SaErrorType, 0 }; static const cMarshalType *saHpiFumiUpgradeStatusGetIn[]= { &SaHpiSessionIdType, &SaHpiResourceIdType, &SaHpiFumiNumType, &SaHpiBankNumType, 0 }; static const cMarshalType *saHpiFumiUpgradeStatusGetOut[] = { &SaErrorType, &SaHpiFumiUpgradeStatusType, 0 }; static const cMarshalType *saHpiFumiTargetVerifyStartIn[]= { &SaHpiSessionIdType, &SaHpiResourceIdType, &SaHpiFumiNumType, &SaHpiBankNumType, 0 }; static const cMarshalType *saHpiFumiTargetVerifyStartOut[] = { &SaErrorType, 0 }; static const cMarshalType *saHpiFumiTargetVerifyMainStartIn[]= { &SaHpiSessionIdType, &SaHpiResourceIdType, &SaHpiFumiNumType, 0 }; static const cMarshalType *saHpiFumiTargetVerifyMainStartOut[] = { &SaErrorType, 0 }; static const cMarshalType *saHpiFumiUpgradeCancelIn[]= { &SaHpiSessionIdType, &SaHpiResourceIdType, &SaHpiFumiNumType, &SaHpiBankNumType, 0 }; static const cMarshalType *saHpiFumiUpgradeCancelOut[] = { &SaErrorType, 0 }; static const cMarshalType *saHpiFumiAutoRollbackDisableGetIn[] = { &SaHpiSessionIdType, &SaHpiResourceIdType, &SaHpiFumiNumType, 0 }; static const cMarshalType *saHpiFumiAutoRollbackDisableGetOut[] = { &SaErrorType, &SaHpiBoolType, 0 }; static const cMarshalType *saHpiFumiAutoRollbackDisableSetIn[] = { &SaHpiSessionIdType, &SaHpiResourceIdType, &SaHpiFumiNumType, &SaHpiBoolType, 0 }; static const cMarshalType *saHpiFumiAutoRollbackDisableSetOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiFumiRollbackStartIn[]= { &SaHpiSessionIdType, &SaHpiResourceIdType, &SaHpiFumiNumType, 0 }; static const cMarshalType *saHpiFumiRollbackStartOut[] = { &SaErrorType, 0 }; static const cMarshalType *saHpiFumiActivateIn[]= { &SaHpiSessionIdType, &SaHpiResourceIdType, &SaHpiFumiNumType, 0 }; static const cMarshalType *saHpiFumiActivateOut[] = { &SaErrorType, 0 }; static const cMarshalType *saHpiFumiActivateStartIn[]= { &SaHpiSessionIdType, &SaHpiResourceIdType, &SaHpiFumiNumType, &SaHpiBoolType, 0 }; static const cMarshalType *saHpiFumiActivateStartOut[] = { &SaErrorType, 0 }; static const cMarshalType *saHpiFumiCleanupIn[]= { &SaHpiSessionIdType, &SaHpiResourceIdType, &SaHpiFumiNumType, &SaHpiBankNumType, 0 }; static const cMarshalType *saHpiFumiCleanupOut[] = { &SaErrorType, 0 }; // Hotswap static const cMarshalType *saHpiHotSwapPolicyCancelIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, 0 }; static const cMarshalType *saHpiHotSwapPolicyCancelOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiResourceActiveSetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, 0 }; static const cMarshalType *saHpiResourceActiveSetOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiResourceInactiveSetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, 0 }; static const cMarshalType *saHpiResourceInactiveSetOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiAutoInsertTimeoutGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) 0 }; static const cMarshalType *saHpiAutoInsertTimeoutGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiTimeoutType, 0 }; static const cMarshalType *saHpiAutoInsertTimeoutSetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiTimeoutType, 0 }; static const cMarshalType *saHpiAutoInsertTimeoutSetOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiAutoExtractTimeoutGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, 0 }; static const cMarshalType *saHpiAutoExtractTimeoutGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiTimeoutType, 0 }; static const cMarshalType *saHpiAutoExtractTimeoutSetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiTimeoutType, 0 }; static const cMarshalType *saHpiAutoExtractTimeoutSetOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiHotSwapStateGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, 0 }; static const cMarshalType *saHpiHotSwapStateGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiHsStateType, 0 }; static const cMarshalType *saHpiHotSwapActionRequestIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiHsActionType, 0 }; static const cMarshalType *saHpiHotSwapActionRequestOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiHotSwapIndicatorStateGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, 0 }; static const cMarshalType *saHpiHotSwapIndicatorStateGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiHsIndicatorStateType, 0 }; static const cMarshalType *saHpiHotSwapIndicatorStateSetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiHsIndicatorStateType, 0 }; static const cMarshalType *saHpiHotSwapIndicatorStateSetOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiParmControlIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiParmActionType, 0 }; static const cMarshalType *saHpiParmControlOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiResourceLoadIdGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, 0 }; static const cMarshalType *saHpiResourceLoadIdGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiLoadIdType, 0 }; static const cMarshalType *saHpiResourceLoadIdSetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiLoadIdType, 0 }; static const cMarshalType *saHpiResourceLoadIdSetOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiResourceResetStateGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, 0 }; static const cMarshalType *saHpiResourceResetStateGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiResetActionType, 0 }; static const cMarshalType *saHpiResourceResetStateSetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiResetActionType, 0 }; static const cMarshalType *saHpiResourceResetStateSetOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiResourcePowerStateGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, 0 }; static const cMarshalType *saHpiResourcePowerStateGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiPowerStateType, 0 }; static const cMarshalType *saHpiResourcePowerStateSetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiPowerStateType, 0 }; static const cMarshalType *saHpiResourcePowerStateSetOut[] = { &SaErrorType, // result (SaErrorT) 0 }; // oHpi static const cMarshalType *oHpiHandlerCreateIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &oHpiHandlerConfigType, // handler config params 0 }; static const cMarshalType *oHpiHandlerCreateOut[] = { &SaErrorType, // result (SaErrorT) &oHpiHandlerIdType, // handler id 0 }; static const cMarshalType *oHpiHandlerDestroyIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &oHpiHandlerIdType, // handler id 0 }; static const cMarshalType *oHpiHandlerDestroyOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *oHpiHandlerInfoIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &oHpiHandlerIdType, // handler id 0 }; static const cMarshalType *oHpiHandlerInfoOut[] = { &SaErrorType, // result (SaErrorT) &oHpiHandlerInfoType, // handler info &oHpiHandlerConfigType, // handler config params 0 }; static const cMarshalType *oHpiHandlerGetNextIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &oHpiHandlerIdType, // handler id 0 }; static const cMarshalType *oHpiHandlerGetNextOut[] = { &SaErrorType, // result (SaErrorT) &oHpiHandlerIdType, // handler id 0 }; static const cMarshalType *oHpiHandlerFindIn[] = { &SaHpiSessionIdType, // session id &SaHpiResourceIdType, // resource id 0 }; static const cMarshalType *oHpiHandlerFindOut[] = { &SaErrorType, // result (SaErrorT) &oHpiHandlerIdType, // handler id 0 }; static const cMarshalType *oHpiHandlerRetryIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &oHpiHandlerIdType, // handler id 0 }; static const cMarshalType *oHpiHandlerRetryOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *oHpiGlobalParamGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &oHpiGlobalParamType, // global param 0 }; static const cMarshalType *oHpiGlobalParamGetOut[] = { &SaErrorType, // result (SaErrorT) &oHpiGlobalParamType, // global param 0 }; static const cMarshalType *oHpiGlobalParamSetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &oHpiGlobalParamType, // global param 0 }; static const cMarshalType *oHpiGlobalParamSetOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *oHpiInjectEventIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &oHpiHandlerIdType, // global param &SaHpiEventType, &SaHpiRptEntryType, &SaHpiRdrType, //TODO....needs to be an arrary...not sure what to do 0 }; static const cMarshalType *oHpiInjectEventOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static cHpiMarshal hpi_marshal[] = { dHpiMarshalEntry( saHpiSessionOpen ), dHpiMarshalEntry( saHpiSessionClose ), dHpiMarshalEntry( saHpiDiscover ), dHpiMarshalEntry( saHpiDomainInfoGet ), dHpiMarshalEntry( saHpiDrtEntryGet ), dHpiMarshalEntry( saHpiDomainTagSet ), dHpiMarshalEntry( saHpiRptEntryGet ), dHpiMarshalEntry( saHpiRptEntryGetByResourceId ), dHpiMarshalEntry( saHpiResourceSeveritySet ), dHpiMarshalEntry( saHpiResourceTagSet ), dHpiMarshalEntry( saHpiResourceIdGet ), dHpiMarshalEntry( saHpiGetIdByEntityPath ), dHpiMarshalEntry( saHpiGetChildEntityPath ), dHpiMarshalEntry( saHpiResourceFailedRemove ), dHpiMarshalEntry( saHpiEventLogInfoGet ), dHpiMarshalEntry( saHpiEventLogCapabilitiesGet ), dHpiMarshalEntry( saHpiEventLogEntryGet ), dHpiMarshalEntry( saHpiEventLogEntryAdd ), dHpiMarshalEntry( saHpiEventLogClear ), dHpiMarshalEntry( saHpiEventLogTimeGet ), dHpiMarshalEntry( saHpiEventLogTimeSet ), dHpiMarshalEntry( saHpiEventLogStateGet ), dHpiMarshalEntry( saHpiEventLogStateSet ), dHpiMarshalEntry( saHpiEventLogOverflowReset ), dHpiMarshalEntry( saHpiSubscribe ), dHpiMarshalEntry( saHpiUnsubscribe ), dHpiMarshalEntry( saHpiEventGet ), dHpiMarshalEntry( saHpiEventAdd ), dHpiMarshalEntry( saHpiAlarmGetNext ), dHpiMarshalEntry( saHpiAlarmGet ), dHpiMarshalEntry( saHpiAlarmAcknowledge ), dHpiMarshalEntry( saHpiAlarmAdd ), dHpiMarshalEntry( saHpiAlarmDelete ), dHpiMarshalEntry( saHpiRdrGet ), dHpiMarshalEntry( saHpiRdrGetByInstrumentId ), dHpiMarshalEntry( saHpiSensorReadingGet ), dHpiMarshalEntry( saHpiSensorThresholdsGet ), dHpiMarshalEntry( saHpiSensorThresholdsSet ), dHpiMarshalEntry( saHpiSensorTypeGet ), dHpiMarshalEntry( saHpiSensorEnableGet ), dHpiMarshalEntry( saHpiSensorEnableSet ), dHpiMarshalEntry( saHpiSensorEventEnableGet ), dHpiMarshalEntry( saHpiSensorEventEnableSet ), dHpiMarshalEntry( saHpiSensorEventMasksGet ), dHpiMarshalEntry( saHpiSensorEventMasksSet ), dHpiMarshalEntry( saHpiControlTypeGet ), dHpiMarshalEntry( saHpiControlGet ), dHpiMarshalEntry( saHpiControlSet ), dHpiMarshalEntry( saHpiIdrInfoGet ), dHpiMarshalEntry( saHpiIdrAreaHeaderGet ), dHpiMarshalEntry( saHpiIdrAreaAdd ), dHpiMarshalEntry( saHpiIdrAreaAddById ), dHpiMarshalEntry( saHpiIdrAreaDelete ), dHpiMarshalEntry( saHpiIdrFieldGet ), dHpiMarshalEntry( saHpiIdrFieldAdd ), dHpiMarshalEntry( saHpiIdrFieldAddById ), dHpiMarshalEntry( saHpiIdrFieldSet ), dHpiMarshalEntry( saHpiIdrFieldDelete ), dHpiMarshalEntry( saHpiWatchdogTimerGet ), dHpiMarshalEntry( saHpiWatchdogTimerSet ), dHpiMarshalEntry( saHpiWatchdogTimerReset ), dHpiMarshalEntry( saHpiAnnunciatorGetNext ), dHpiMarshalEntry( saHpiAnnunciatorGet ), dHpiMarshalEntry( saHpiAnnunciatorAcknowledge ), dHpiMarshalEntry( saHpiAnnunciatorAdd ), dHpiMarshalEntry( saHpiAnnunciatorDelete ), dHpiMarshalEntry( saHpiAnnunciatorModeGet ), dHpiMarshalEntry( saHpiAnnunciatorModeSet ), dHpiMarshalEntry( saHpiDimiInfoGet ), dHpiMarshalEntry( saHpiDimiTestInfoGet ), dHpiMarshalEntry( saHpiDimiTestReadinessGet ), dHpiMarshalEntry( saHpiDimiTestStart ), dHpiMarshalEntry( saHpiDimiTestCancel ), dHpiMarshalEntry( saHpiDimiTestStatusGet ), dHpiMarshalEntry( saHpiDimiTestResultsGet ), dHpiMarshalEntry( saHpiFumiSourceSet ), dHpiMarshalEntry( saHpiFumiSourceInfoValidateStart ), dHpiMarshalEntry( saHpiFumiSourceInfoGet ), dHpiMarshalEntry( saHpiFumiTargetInfoGet ), dHpiMarshalEntry( saHpiFumiBackupStart ), dHpiMarshalEntry( saHpiFumiBankBootOrderSet ), dHpiMarshalEntry( saHpiFumiBankCopyStart ), dHpiMarshalEntry( saHpiFumiInstallStart ), dHpiMarshalEntry( saHpiFumiUpgradeStatusGet ), dHpiMarshalEntry( saHpiFumiTargetVerifyStart ), dHpiMarshalEntry( saHpiFumiUpgradeCancel ), dHpiMarshalEntry( saHpiFumiRollbackStart ), dHpiMarshalEntry( saHpiFumiActivate ), dHpiMarshalEntry( saHpiHotSwapPolicyCancel ), dHpiMarshalEntry( saHpiResourceActiveSet ), dHpiMarshalEntry( saHpiResourceInactiveSet ), dHpiMarshalEntry( saHpiAutoInsertTimeoutGet ), dHpiMarshalEntry( saHpiAutoInsertTimeoutSet ), dHpiMarshalEntry( saHpiAutoExtractTimeoutGet ), dHpiMarshalEntry( saHpiAutoExtractTimeoutSet ), dHpiMarshalEntry( saHpiHotSwapStateGet ), dHpiMarshalEntry( saHpiHotSwapActionRequest ), dHpiMarshalEntry( saHpiHotSwapIndicatorStateGet ), dHpiMarshalEntry( saHpiHotSwapIndicatorStateSet ), dHpiMarshalEntry( saHpiParmControl ), dHpiMarshalEntry( saHpiResourceLoadIdGet ), dHpiMarshalEntry( saHpiResourceLoadIdSet ), dHpiMarshalEntry( saHpiResourceResetStateGet ), dHpiMarshalEntry( saHpiResourceResetStateSet ), dHpiMarshalEntry( saHpiResourcePowerStateGet ), dHpiMarshalEntry( saHpiResourcePowerStateSet ), dHpiMarshalEntry( oHpiHandlerCreate ), dHpiMarshalEntry( oHpiHandlerDestroy ), dHpiMarshalEntry( oHpiHandlerInfo ), dHpiMarshalEntry( oHpiHandlerGetNext ), dHpiMarshalEntry( oHpiHandlerFind ), dHpiMarshalEntry( oHpiHandlerRetry ), dHpiMarshalEntry( oHpiGlobalParamGet ), dHpiMarshalEntry( oHpiGlobalParamSet ), dHpiMarshalEntry( oHpiInjectEvent ), // New B.03.01 functions // They are added to the end of enum in order to keep ABI compatibility dHpiMarshalEntry( saHpiMyEntityPathGet ), dHpiMarshalEntry( saHpiRdrUpdateCountGet ), dHpiMarshalEntry( saHpiFumiSpecInfoGet ), dHpiMarshalEntry( saHpiFumiServiceImpactGet ), dHpiMarshalEntry( saHpiFumiSourceComponentInfoGet ), dHpiMarshalEntry( saHpiFumiTargetComponentInfoGet ), dHpiMarshalEntry( saHpiFumiLogicalTargetInfoGet ), dHpiMarshalEntry( saHpiFumiLogicalTargetComponentInfoGet ), dHpiMarshalEntry( saHpiFumiTargetVerifyMainStart ), dHpiMarshalEntry( saHpiFumiAutoRollbackDisableGet ), dHpiMarshalEntry( saHpiFumiAutoRollbackDisableSet ), dHpiMarshalEntry( saHpiFumiActivateStart ), dHpiMarshalEntry( saHpiFumiCleanup ), }; static size_t hpi_marshal_num = sizeof( hpi_marshal ) / sizeof( cHpiMarshal ); cHpiMarshal * HpiMarshalFind( int id ) { id--; if ( id < 0 || id >= hpi_marshal_num ) return 0; return &hpi_marshal[id]; } int HpiMarshalRequest( cHpiMarshal *m, void *buffer, const void **param ) { int cc = MarshalArray( m->m_request, param, buffer ); if ( cc < 0 ) { CRIT( "%s: HpiMarshalRequest: failure, cc = %d", m->m_name, cc ); } return cc; } int HpiMarshalRequest1( cHpiMarshal *m, void *buffer, const void *p1 ) { const void *param[1]; param[0] = p1; return HpiMarshalRequest( m, buffer, param ); } int HpiMarshalRequest2( cHpiMarshal *m, void *buffer, const void *p1, const void *p2 ) { const void *param[2]; param[0] = p1; param[1] = p2; return HpiMarshalRequest( m, buffer, param ); } int HpiMarshalRequest3( cHpiMarshal *m, void *buffer, const void *p1, const void *p2, const void *p3 ) { const void *param[3]; param[0] = p1; param[1] = p2; param[2] = p3; return HpiMarshalRequest( m, buffer, param ); } int HpiMarshalRequest4( cHpiMarshal *m, void *buffer, const void *p1, const void *p2, const void *p3, const void *p4 ) { const void *param[4]; param[0] = p1; param[1] = p2; param[2] = p3; param[3] = p4; return HpiMarshalRequest( m, buffer, param ); } int HpiMarshalRequest5( cHpiMarshal *m, void *buffer, const void *p1, const void *p2, const void *p3, const void *p4, const void *p5 ) { const void *param[5]; param[0] = p1; param[1] = p2; param[2] = p3; param[3] = p4; param[4] = p5; return HpiMarshalRequest( m, buffer, param ); } int HpiMarshalRequest6( cHpiMarshal *m, void *buffer, const void *p1, const void *p2, const void *p3, const void *p4, const void *p5, const void *p6 ) { const void *param[6]; param[0] = p1; param[1] = p2; param[2] = p3; param[3] = p4; param[4] = p5; param[5] = p6; return HpiMarshalRequest( m, buffer, param ); } int HpiDemarshalRequest( int byte_order, cHpiMarshal *m, const void *buffer, void **params ) { int cc = DemarshalArray( byte_order, m->m_request, params, buffer ); if ( cc < 0 ) { CRIT( "%s: HpiDemarshalRequest: failure, cc = %d", m->m_name, cc ); } return cc; } int HpiDemarshalRequest1( int byte_order, cHpiMarshal *m, const void *buffer, void *p1 ) { void *param[1]; param[0] = p1; return HpiDemarshalRequest( byte_order, m, buffer, param ); } int HpiDemarshalRequest2( int byte_order, cHpiMarshal *m, const void *buffer, void *p1, void *p2 ) { void *param[2]; param[0] = p1; param[1] = p2; return HpiDemarshalRequest( byte_order, m, buffer, param ); } int HpiDemarshalRequest3( int byte_order, cHpiMarshal *m, const void *buffer, void *p1, void *p2, void *p3 ) { void *param[3]; param[0] = p1; param[1] = p2; param[2] = p3; return HpiDemarshalRequest( byte_order, m, buffer, param ); } int HpiDemarshalRequest4( int byte_order, cHpiMarshal *m, const void *buffer, void *p1, void *p2, void *p3, void *p4 ) { void *param[4]; param[0] = p1; param[1] = p2; param[2] = p3; param[3] = p4; return HpiDemarshalRequest( byte_order, m, buffer, param ); } int HpiDemarshalRequest5( int byte_order, cHpiMarshal *m, const void *buffer, void *p1, void *p2, void *p3, void *p4, void *p5 ) { void *param[5]; param[0] = p1; param[1] = p2; param[2] = p3; param[3] = p4; param[4] = p5; return HpiDemarshalRequest( byte_order, m, buffer, param ); } int HpiDemarshalRequest6( int byte_order, cHpiMarshal *m, const void *buffer, void *p1, void *p2, void *p3, void *p4, void *p5, void *p6 ) { void *param[6]; param[0] = p1; param[1] = p2; param[2] = p3; param[3] = p4; param[4] = p5; param[5] = p6; return HpiDemarshalRequest( byte_order, m, buffer, param ); } int HpiMarshalReply( cHpiMarshal *m, void *buffer, const void **params ) { // the first value is the result. SaErrorT err = *(const SaErrorT *)params[0]; int cc; if ( err == SA_OK ) { cc = MarshalArray( m->m_reply, params, buffer ); } else { cc = Marshal( &SaErrorType, &err, buffer ); } if ( cc < 0 ) { CRIT( "%s: HpiMarshalReply: failure, cc = %d", m->m_name, cc ); } return cc; } int HpiMarshalReply0( cHpiMarshal *m, void *buffer, const void *result ) { const void *param[1]; param[0] = result; return HpiMarshalReply( m, buffer, param ); } int HpiMarshalReply1( cHpiMarshal *m, void *buffer, const void *result, const void *p1 ) { const void *param[2]; param[0] = result; param[1] = p1; return HpiMarshalReply( m, buffer, param ); } int HpiMarshalReply2( cHpiMarshal *m, void *buffer, const void *result, const void *p1, const void *p2 ) { const void *param[3]; param[0] = result; param[1] = p1; param[2] = p2; return HpiMarshalReply( m, buffer, param ); } int HpiMarshalReply3( cHpiMarshal *m, void *buffer, const void *result, const void *p1, const void *p2, const void *p3 ) { const void *param[4]; param[0] = result; param[1] = p1; param[2] = p2; param[3] = p3; return HpiMarshalReply( m, buffer, param ); } int HpiMarshalReply4( cHpiMarshal *m, void *buffer, const void *result, const void *p1, const void *p2, const void *p3, const void *p4 ) { const void *param[5]; param[0] = result; param[1] = p1; param[2] = p2; param[3] = p3; param[4] = p4; return HpiMarshalReply( m, buffer, param ); } int HpiMarshalReply5( cHpiMarshal *m, void *buffer, const void *result, const void *p1, const void *p2, const void *p3, const void *p4, const void *p5 ) { const void *param[6]; param[0] = result; param[1] = p1; param[2] = p2; param[3] = p3; param[4] = p4; param[5] = p5; return HpiMarshalReply( m, buffer, param ); } int HpiDemarshalReply( int byte_order, cHpiMarshal *m, const void *buffer, void **params ) { int cc; // the first value is the error code cc = Demarshal( byte_order, &SaErrorType, params[0], buffer ); if ( cc > 0 ) { SaErrorT err = *(SaErrorT *)params[0]; if ( err == SA_OK ) { cc = DemarshalArray( byte_order, m->m_reply, params, buffer ); } } if ( cc < 0 ) { CRIT( "%s: HpiDemarshalReply: failure, cc = %d", m->m_name, cc ); } return cc; } int HpiDemarshalReply0( int byte_order, cHpiMarshal *m, const void *buffer, void *result ) { void *param[1]; param[0] = result; return HpiDemarshalReply( byte_order, m, buffer, param ); } int HpiDemarshalReply1( int byte_order, cHpiMarshal *m, const void *buffer, void *result, void *p1 ) { void *param[2]; param[0] = result; param[1] = p1; return HpiDemarshalReply( byte_order, m, buffer, param ); } int HpiDemarshalReply2( int byte_order, cHpiMarshal *m, const void *buffer, void *result, void *p1, void *p2 ) { void *param[3]; param[0] = result; param[1] = p1; param[2] = p2; return HpiDemarshalReply( byte_order, m, buffer, param ); } int HpiDemarshalReply3( int byte_order, cHpiMarshal *m, const void *buffer, void *result, void *p1, void *p2, void *p3 ) { void *param[4]; param[0] = result; param[1] = p1; param[2] = p2; param[3] = p3; return HpiDemarshalReply( byte_order, m, buffer, param ); } int HpiDemarshalReply4( int byte_order, cHpiMarshal *m, const void *buffer, void *result, void *p1, void *p2, void *p3, void *p4 ) { void *param[5]; param[0] = result; param[1] = p1; param[2] = p2; param[3] = p3; param[4] = p4; return HpiDemarshalReply( byte_order, m, buffer, param ); } int HpiDemarshalReply5( int byte_order, cHpiMarshal *m, const void *buffer, void *result, void *p1, void *p2, void *p3, void *p4, void *p5 ) { void *param[6]; param[0] = result; param[1] = p1; param[2] = p2; param[3] = p3; param[4] = p4; param[5] = p5; return HpiDemarshalReply( byte_order, m, buffer, param ); } openhpi-3.6.1/marshal/version.rc0000644000175100017510000000163512575647264015644 0ustar mohanmohan#include LANGUAGE 0x09,0x01 // English(US) VS_VERSION_INFO VERSIONINFO FILEVERSION BINARY_VERSION PRODUCTVERSION BINARY_VERSION FILEFLAGSMASK 0 FILEFLAGS 0 FILEOS VOS_NT_WINDOWS32 FILETYPE VFT_DLL FILESUBTYPE VFT2_UNKNOWN BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904E4" // English(US), Multilingual BEGIN VALUE "Comments", "" VALUE "CompanyName", "OpenHPI Community (http://openhpi.org/)" VALUE "FileDescription", "OpenHPI Marshal Library" VALUE "FileVersion", VERSION VALUE "InternalName", "libopenhpimarshal" VALUE "LegalCopyright", "OpenHPI is distributed under BSD license" VALUE "OriginalFilename", "libopenhpimarshal.dll" VALUE "ProductName", "OpenHPI" VALUE "ProductVersion", VERSION END END END openhpi-3.6.1/README.csharp0000644000175100017510000000006112575647301014321 0ustar mohanmohanSee baselibs/README and baselibs/csharp/README. openhpi-3.6.1/acinclude.m40000644000175100017510000001606212575647301014363 0ustar mohanmohan################################################## # # OpenHPI Macros # # Copyright (C) IBM Corp 2003-2006 # # Author(s): # Sean Dague # Renier Morales # # This file is licensed under the same terms as OpenHPI itself. # See the COPYING file in the top level of OpenHPI for more info. # # This is a set of common macros to be used by the top # level configure.in. # ################################################## AC_DEFUN([OH_SET_SIZES], [ if test "x$cross_compiling" != "xno"; then if test "x$OH_SIZEOF_UCHAR" = x; then OH_SIZEOF_UCHAR=$ac_cv_sizeof_uchar fi if test "x$OH_SIZEOF_USHORT" = x; then OH_SIZEOF_USHORT=$ac_cv_sizeof_ushort fi if test "x$OH_SIZEOF_UINT" = x; then OH_SIZEOF_UINT=$ac_cv_sizeof_uint fi if test "x$OH_SIZEOF_CHAR" = x; then OH_SIZEOF_CHAR=$ac_cv_sizeof_char fi if test "x$OH_SIZEOF_SHORT" = x; then OH_SIZEOF_SHORT=$ac_cv_sizeof_short fi if test "x$OH_SIZEOF_INT" = x; then OH_SIZEOF_INT=$ac_cv_sizeof_int fi if test "x$OH_SIZEOF_LLONG" = x; then OH_SIZEOF_LLONG=$ac_cv_sizeof_longlong fi if test "x$OH_SIZEOF_FLOAT" = x; then OH_SIZEOF_FLOAT=$ac_cv_sizeof_float fi if test "x$OH_SIZEOF_DOUBLE" = x; then OH_SIZEOF_DOUBLE=$ac_cv_sizeof_double fi else OH_SSFILE=testsize OH_SSSOURCE="$OH_SSFILE.c" echo "#include " > $OH_SSSOURCE echo "#include " >> $OH_SSSOURCE echo "int main() {" >> $OH_SSSOURCE # add more here if you need them # the lots of slashes are needed to do the processing below right echo "printf(\"unsigned char %u\\\\n\",(unsigned int)sizeof(unsigned char));" >> $OH_SSSOURCE echo "printf(\"unsigned short %u\\\\n\",(unsigned int)sizeof(unsigned short));" >> $OH_SSSOURCE echo "printf(\"unsigned int %u\\\\n\",(unsigned int)sizeof(unsigned int));" >> $OH_SSSOURCE echo "printf(\"char %u\\\\n\",(unsigned int)sizeof(char));" >> $OH_SSSOURCE echo "printf(\"short %u\\\\n\",(unsigned int)sizeof(short));" >> $OH_SSSOURCE echo "printf(\"int %u\\\\n\",(unsigned int)sizeof(int));" >> $OH_SSSOURCE echo "printf(\"long long %u\\\\n\",(unsigned int)sizeof(long long));" >> $OH_SSSOURCE echo "printf(\"float %u\\\\n\",(unsigned int)sizeof(float));" >> $OH_SSSOURCE echo "printf(\"double %u\\\\n\",(unsigned int)sizeof(double));" >> $OH_SSSOURCE echo "return 0;" >> $OH_SSSOURCE echo "}" >> $OH_SSSOURCE $CC -o $OH_SSFILE $OH_SSSOURCE OH_TYPE_SIZES=`./$OH_SSFILE` # feel free to define more logic here if we need it OH_SIZEOF_UCHAR=`echo -e $OH_TYPE_SIZES | grep "^unsigned char" | awk '{print $[3]}'` OH_SIZEOF_USHORT=`echo -e $OH_TYPE_SIZES | grep "^unsigned short" | awk '{print $[3]}'` OH_SIZEOF_UINT=`echo -e $OH_TYPE_SIZES | grep "^unsigned int" | awk '{print $[3]}'` OH_SIZEOF_CHAR=`echo -e $OH_TYPE_SIZES | grep "^char" | awk '{print $[2]}'` OH_SIZEOF_SHORT=`echo -e $OH_TYPE_SIZES | grep "^short" | awk '{print $[2]}'` OH_SIZEOF_INT=`echo -e $OH_TYPE_SIZES | grep "^int" | awk '{print $[2]}'` OH_SIZEOF_LLONG=`echo -e $OH_TYPE_SIZES | grep "^long long" | awk '{print $[3]}'` OH_SIZEOF_FLOAT=`echo -e $OH_TYPE_SIZES | grep "^float" | awk '{print $[2]}'` OH_SIZEOF_DOUBLE=`echo -e $OH_TYPE_SIZES | grep "^double" | awk '{print $[2]}'` rm -f $OH_SSFILE $OH_SSSOURCE fi ]) # # OH_CHECK_FAIL($LIBNAME,$PACKAGE_SUGGEST,$URL,$EXTRA) # AC_DEFUN([OH_CHECK_FAIL], [ OH_MSG=`echo -e "- $1 not found!\n"` if test "x" != "x$4"; then OH_MSG=`echo -e "$OH_MSG\n- $4"` fi if test "x$2" != "x"; then OH_MSG=`echo -e "$OH_MSG\n- Try installing the $2 package\n"` fi if test "x$3" != "x"; then OH_MSG=`echo -e "$OH_MSG\n- or get the latest software from $3\n"` fi AC_MSG_ERROR( ! ************************************************************ $OH_MSG ************************************************************ ) ] ) # # gcc version check. # AC_DEFUN([OH_CHECK_GCC], [ GCCVERSIONOK=`gcc -dumpversion | \ sed 's/\./ /g' | \ awk '{ \ if ( $[1] > $1) { \ print "OK"; \ } \ if ( $[1] == $1 ) { \ if( $[2] > $2 ) { \ print "OK"; \ } \ if( $[2] == $2 ) { \ print "OK"; \ } \ } \ }'` \ if test "$GCCVERSIONOK" = "OK"; then AC_MSG_RESULT(yes) else OH_CHECK_FAIL(gcc >= $1.$2 is required to build OpenHPI) fi ]) # it is worth noting that we have to strip # optimization from the cflags for net-snmp # hopefully they'll fix that bug in the future AC_DEFUN([OH_CHECK_NETSNMP], [ AC_MSG_CHECKING(for net-snmp) AC_TRY_LINK( [ #include #include ], [ struct snmp_session session ], [ have_netsnmp=yes SNMPFLAGS=`${net_snmp_config:-net-snmp-config} --cflags | perl -p -e 's/-O\S*//g'` SNMPLIBS=`${net_snmp_config:-net-snmp-config} --libs` AC_MSG_RESULT(yes) ], [AC_MSG_RESULT(no. No SNMP based plugins can be built!)]) ]) AC_DEFUN([OH_CHECK_OPENIPMI], [ AC_MSG_CHECKING(for OpenIPMI) OH_OI_FILE=ipmi_ver OH_OI_SRC="ipmi_ver.c" echo "#include " > $OH_OI_SRC echo "#include " >> $OH_OI_SRC echo "int main() {" >> $OH_OI_SRC echo "printf(\"%d.%d.%d\", OPENIPMI_VERSION_MAJOR, \ OPENIPMI_VERSION_MINOR, \ OPENIPMI_VERSION_RELEASE);" >> $OH_OI_SRC echo "return 0;}" >> $OH_OI_SRC gcc -o $OH_OI_FILE $CFLAGS $CPPFLAGS $LDFLAGS $OH_OI_SRC >& /dev/null if test -f "ipmi_ver"; then OPENIPMI_VERSION=`./ipmi_ver | \ awk -F. '{ \ if ( $[1] == $1 ) { \ if ( $[2] == $2 ) { \ if ( $[3] >= $3 ) { \ print "OK"; \ } \ } } }'` fi if test "$OPENIPMI_VERSION" = "OK"; then have_openipmi=yes AC_MSG_RESULT(yes) else AC_MSG_RESULT(no...OpenIPMI missing or wrong version IPMI plug-in can't build) have_openipmi=no fi rm -rf $OH_OI_FILE $OH_OI_SRC ]) AC_DEFUN([PKG_CFG_SETPATH], [ if test "x$cross_compiling" != "xyes"; then if test -f "/etc/ld.so.conf"; then TEMP=`cat /etc/ld.so.conf | grep "/lib$"` TEMP=`echo $TEMP | sed -e 's/\/lib \|\/lib$/\/lib\/pkgconfig:/g'` PKG_CONFIG_PATH="${PKG_CONFIG_PATH}:${TEMP}" export PKG_CONFIG_PATH fi fi ]) AC_DEFUN([OH_CHECK_RTAS], [ AC_MSG_CHECKING(for RTAS libary) AC_TRY_COMPILE( [ #include #include ], [ rtas_activate_firmware(); ], [ if test -f "/usr/bin/lsvpd"; then have_rtas_lib=yes AC_MSG_RESULT(yes) else AC_MSG_RESULT(no) fi ], [AC_MSG_RESULT(no)] )]) openhpi-3.6.1/rt-env.sh.in0000644000175100017510000000222112575647300014335 0ustar mohanmohan#!/bin/sh -x # #OPENHPI_LOCK_DEBUG=YES OPENHPI_ERROR=YES #OPENHPI_DEBUG=YES OPENHPI_UID_MAP=@abs_top_srcdir@/uid_map OPENHPI_CONF=@abs_top_srcdir@/openhpi.conf OPENHPICLIENT_CONF=@abs_top_srcdir@/openhpiclient.conf OPENHPI_PLUGIN_ROOT=@abs_top_builddir@/plugins OPENHPI_PATH=${OPENHPI_PLUGIN_ROOT}/dummy:${OPENHPI_PLUGIN_ROOT}/ipmi:${OPENHPI_PLUGIN_ROOT}/ipmidirect:${OPENHPI_PLUGIN_ROOT}/watchdog:${OPENHPI_PLUGIN_ROOT}/sysfs:${OPENHPI_PLUGIN_ROOT}/snmp_bc:${OPENHPI_PLUGIN_ROOT}/simulator:${OPENHPI_PLUGIN_ROOT}/dynamic_simulator:${LTDL_LIBRARY_PATH} # the following entries are for the hpi daemon and client OPENHPI_DAEMON_HOST=localhost OPENHPI_DAEMON_PORT=4743 OPENHPI_GCRYPT=0 if [ ! -f @abs_top_srcdir@/openhpi.conf ]; then cp @abs_top_srcdir@/openhpi.conf.example @abs_top_srcdir@/openhpi.conf chmod 600 @abs_top_srcdir@/openhpi.conf fi if [ ! -f @abs_top_srcdir@/openhpiclient.conf ]; then cp @abs_top_srcdir@/openhpiclient.conf.example @abs_top_srcdir@/openhpiclient.conf fi export OPENHPI_DEBUG OPENHPI_DEBUG_TRACE OPENHPI_UID_MAP OPENHPI_CONF OPENHPI_PATH OPENHPICLIENT_CONF export OPENHPI_DAEMON_HOST OPENHPI_DAEMON_PORT OPENHPI_GCRYPT openhpi-3.6.1/README.java0000644000175100017510000000005712575647301013767 0ustar mohanmohanSee baselibs/README and baselibs/java/README. openhpi-3.6.1/include/0000755000175100017510000000000012575650553013613 5ustar mohanmohanopenhpi-3.6.1/include/oh_plugin.h0000644000175100017510000001015712575647300015750 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copright IBM Corp 2004-2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #ifndef __OH_PLUGIN_H #define __OH_PLUGIN_H #include #include #include #include #ifdef __cplusplus extern "C" { #endif /* * Plugins are kept in a list within the oh_plugins struct */ struct oh_plugins { GSList *list; #if GLIB_CHECK_VERSION (2, 32, 0) GRecMutex lock; #else GStaticRecMutex lock; #endif }; struct oh_plugin { char *name; /* Name of plugin preceded by 'lib' (e.g. "libdummy"). */ /* handle returned by lt_dlopenext or 0 for static plugins */ GModule *dl_handle; struct oh_abi_v2 *abi; /* pointer to associated plugin interface */ int handler_count; /* How many handlers use this plugin */ /* Synchronization - used internally by plugin interfaces below. */ #if GLIB_CHECK_VERSION (2, 32, 0) GRecMutex lock; /* Exclusive lock for working with plugin */ /* These are used to keep the plugin from being unloaded while it * is being referenced. */ GRecMutex refcount_lock; #else GStaticRecMutex lock; /* Exclusive lock for working with plugin */ /* These are used to keep the plugin from being unloaded while it * is being referenced. */ GStaticRecMutex refcount_lock; #endif int refcount; }; extern struct oh_plugins oh_plugins; /* * Representation of a handler (plugin instance) */ struct oh_handlers { GHashTable *table; GSList *list; #if GLIB_CHECK_VERSION (2, 32, 0) GRecMutex lock; #else GStaticRecMutex lock; #endif }; struct oh_handler { unsigned int id; /* id of handler */ char *plugin_name; GHashTable *config; /* pointer to handler configuration */ struct oh_abi_v2 *abi; /* pointer to associated plugin interface */ /* * private pointer used by plugin implementations to distinguish * between different instances */ void *hnd; /* Synchronization - used internally by handler interfaces below. */ #if GLIB_CHECK_VERSION (2, 32, 0) GRecMutex lock; /* Exclusive lock for working with handler */ /* These are used to keep the handler from being destroyed while it * is being referenced. */ GRecMutex refcount_lock; #else GStaticRecMutex lock; /* Exclusive lock for working with handler */ /* These are used to keep the handler from being destroyed while it * is being referenced. */ GStaticRecMutex refcount_lock; #endif int refcount; }; extern struct oh_handlers oh_handlers; /* Finalization of plugins and handlers. */ void oh_close_handlers(void); /* Plugin interface functions */ struct oh_plugin *oh_get_plugin(char *plugin_name); void oh_release_plugin(struct oh_plugin *plugin); int oh_getnext_plugin_name(char *plugin_name, char *next_plugin_name, unsigned int size); int oh_load_plugin(char *plugin_name); int oh_unload_plugin(char *plugin_name); /* Handler (plugin instances) interface functions */ struct oh_handler *oh_get_handler(unsigned int hid); void oh_release_handler(struct oh_handler *handler); int oh_getnext_handler_id(unsigned int hid, unsigned int *next_hid); SaErrorT oh_create_handler(GHashTable *handler_config, unsigned int *hid); int oh_destroy_handler(unsigned int hid); SaErrorT oh_get_handler_info(unsigned int hid, oHpiHandlerInfoT *info, GHashTable *conf_params); SaErrorT oh_discovery(void); /* Bind abi functions into plugin */ int oh_load_plugin_functions(struct oh_plugin *plugin, struct oh_abi_v2 **abi); #ifdef __cplusplus } /* extern "C" */ #endif #endif /*__OH_PLUGIN_H*/ openhpi-3.6.1/include/sahpimacros.h0000644000175100017510000001003512575647300016270 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003, 2004, 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague * Renier Morales */ #ifndef __SAHPIMACROS_H #define __SAHPIMACROS_H /************************************************************** * * These macros are defined for clarity of the sahpi.c * source file. They provide standard mechanisms for * checking for and populating standard types, as well * as providing consistent debug and error functionality. * * Yes, macros are evil, but they make this code much * more readable. * ***********************************************************/ #define OH_CHECK_INIT_STATE(sid) \ { \ SaHpiBoolT state; \ SaErrorT init_error; \ if ((init_error = oh_get_session_subscription(sid,&state)) != SA_OK) { \ return init_error; \ } \ } /* * OH_GET_DID gets the domain id of a session and * checks its validity (nonzero). * */ #define OH_GET_DID(sid, did) \ { \ did = oh_get_session_domain(sid); \ if (did == SAHPI_UNSPECIFIED_DOMAIN_ID) { \ return SA_ERR_HPI_INVALID_SESSION; \ } \ } /* * OH_GET_DOMAIN gets the domain object which locks it. * Need to call oh_release_domain(domain) after this to unlock it. */ #define OH_GET_DOMAIN(did, d) \ { \ if (!(d = oh_get_domain(did))) { \ return SA_ERR_HPI_INVALID_DOMAIN; \ } \ } /* * OH_HANDLER_GET gets the hander for the rpt and resource id. It * returns INVALID PARAMS if the handler isn't there */ #define OH_HANDLER_GET(d, rid, h) \ { \ unsigned int *hid = NULL; \ hid = oh_get_resource_data(&(d->rpt), rid); \ if (!hid) { \ oh_release_domain(d); \ return SA_ERR_HPI_INVALID_RESOURCE; \ } \ h = oh_get_handler(*hid); \ if (h && !h->hnd) { \ oh_release_handler(h); \ h = NULL; \ } \ } /* * OH_RESOURCE_GET gets the resource for an resource id and rpt * it returns invalid resource if no resource id is found */ #define OH_RESOURCE_GET(d, rid, r) \ { \ r = oh_get_resource_by_id(&(d->rpt), rid); \ if (!r) { \ oh_release_domain(d); \ return SA_ERR_HPI_INVALID_RESOURCE; \ } \ } /* * OH_RESOURCE_GET_CHECK gets the resource for an resource id and rpt * it returns invalid resource if no resource id is found. It will * return NO_RESPONSE if the resource is marked as being failed. */ #define OH_RESOURCE_GET_CHECK(d, rid, r) \ { \ r = oh_get_resource_by_id(&(d->rpt), rid); \ if (!r) { \ oh_release_domain(d); \ return SA_ERR_HPI_INVALID_RESOURCE; \ } else if (r->ResourceFailed != SAHPI_FALSE) { \ oh_release_domain(d); \ return SA_ERR_HPI_NO_RESPONSE; \ } \ } /* * OH_CALL_ABI will check for a valid handler struct and existing plugin abi. * If a valid abi or handler is not found, it returns error. Once it passes * this validity check, it will call the plugin abi function with the passed * parameters. */ #define OH_CALL_ABI(handler, func, err, ret, params...) \ { \ if (!handler || !handler->abi->func) { \ oh_release_handler(handler); \ return err; \ } \ ret = handler->abi->func(handler->hnd, params); \ } #endif openhpi-3.6.1/include/oh_domain.h0000644000175100017510000000614512575647300015723 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * */ #ifndef __OH_DOMAIN_H #define __OH_DOMAIN_H #include #include #include #ifdef __cplusplus extern "C" { #endif /* * Global table of all active domains (oh_domain). * Encapsulated in a struct to store a lock alongside of it. */ struct oh_domain_table { GHashTable *table; GList *list; #if GLIB_CHECK_VERSION (2, 32, 0) GRecMutex lock; #else GStaticRecMutex lock; #endif }; #define OH_DOMAIN_SINGLE (SaHpiUint8T)0x00 #define OH_DOMAIN_CHILD (SaHpiUint8T)0x01 #define OH_DOMAIN_PARENT (SaHpiUint8T)0x02 #define OH_DOMAIN_PEER (SaHpiUint8T)0x04 struct oh_dat { /* Domain Alarm Table */ SaHpiAlarmIdT next_id; GSList *list; SaHpiUint32T update_count; SaHpiTimeT update_timestamp; SaHpiBoolT overflow; }; struct oh_drt { /* Domain Reference Table */ SaHpiEntryIdT next_id; SaHpiDomainIdT parent_id; GSList *list; SaHpiUint32T update_count; SaHpiTimeT update_timestamp; }; extern struct oh_domain_table oh_domains; /* * Representation of an domain */ struct oh_domain { /* id number of domain */ SaHpiDomainIdT id; /* Name tag of this domain */ SaHpiTextBufferT tag; /* Auto insert timeout for this domain */ SaHpiTimeoutT ai_timeout; /* Domain Capabilities */ SaHpiDomainCapabilitiesT capabilities; SaHpiGuidT guid; /* Resource Presence Table */ RPTable rpt; /* Domain Alarm Table */ struct oh_dat dat; /* Domain Reference Table */ struct oh_drt drt; /* Domain Event Log */ oh_el *del; /* Synchronization - used internally by domain interfaces */ #if GLIB_CHECK_VERSION (2, 32, 0) GRecMutex lock; GRecMutex refcount_lock; #else GStaticRecMutex lock; GStaticRecMutex refcount_lock; #endif int refcount; }; SaErrorT oh_create_domain(SaHpiDomainIdT id, char *tag, SaHpiDomainIdT tier_of, SaHpiDomainIdT peer_of, SaHpiDomainCapabilitiesT capabilities, SaHpiTimeoutT ai_timeout ); SaErrorT oh_destroy_domain(SaHpiDomainIdT did); struct oh_domain *oh_get_domain(SaHpiDomainIdT did); SaErrorT oh_release_domain(struct oh_domain *domain); GArray *oh_query_domains(void); SaErrorT oh_drt_entry_get(SaHpiDomainIdT did, SaHpiEntryIdT entryid, SaHpiEntryIdT *nextentryid, SaHpiDrtEntryT *drt); #ifdef __cplusplus } #endif #endif /* __OH_DOMAIN_H */ openhpi-3.6.1/include/SaHpi.h0000644000175100017510000173461612575647300015006 0ustar mohanmohan/******************************************************************************* ** ** FILE: ** SaHpi.h ** ** DESCRIPTION: ** This file provides the C language binding for the Service ** Availability(TM) Hardware Forum Platform Interface (HPI). ** It contains all of the prototypes and type definitions. ** Note that this file was generated from the Hardware Platform ** Interface specification document. ** ** SPECIFICATION VERSION: ** SAI-HPI-B.03.02 ** ** DATE: ** Tue Aug 4 2009 ** ** LEGAL: ** OWNERSHIP OF SPECIFICATION AND COPYRIGHTS. ** The Specification and all worldwide copyrights therein are ** the exclusive property of Licensor. You may not remove, obscure, or ** alter any copyright or other proprietary rights notices that are in or ** on the copy of the Specification you download. You must reproduce all ** such notices on all copies of the Specification you make. Licensor ** may make changes to the Specification, or to items referenced therein, ** at any time without notice. Licensor is not obligated to support or ** update the Specification. ** ** Copyright(c) 2004, 2009, Service Availability(TM) Forum. All rights ** reserved. ** ** Permission to use, copy, modify, and distribute this software for any ** purpose without fee is hereby granted, provided that this entire notice ** is included in all copies of any software which is or includes a copy ** or modification of this software and in all copies of the supporting ** documentation for such software. ** ** THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED ** WARRANTY. IN PARTICULAR, THE SERVICE AVAILABILITY FORUM DOES NOT MAKE ANY ** REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY ** OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. ** *******************************************************************************/ #ifndef __SAHPI_H #define __SAHPI_H #ifdef __cplusplus extern "C" { #endif /******************************************************************************* ******************************************************************************** ********** ********** ********** Basic Data Types and Values ********** ********** ********** ******************************************************************************** *******************************************************************************/ /* General Types - need to be specified correctly for the host architecture */ /* ** It is recommended that these types be defined such that the data sizes ** and alignment of each data type are as indicated. The only requirement ** for source compatibility is that the types be defined to be able to ** contain at least the required data (e.g., at least signed 8-bit values ** must be contained in the data type defined as SaHpiInt8T, etc.) ** Following the full recommendations for data size and alignment, however, ** may promote more binary compatibility. */ #ifndef __SAHPI_BASIC_TYPES /* The following definitions produce the recommended sizes and alignments ** using the gcc compiler for the i386 (IA-32) platform. */ /* unsigned 8-bit data, 1-byte alignment */ typedef unsigned char SaHpiUint8T; /* unsigned 16-bit data, 2-byte alignment */ typedef unsigned short SaHpiUint16T; /* unsigned 32-bit data, 4-byte alignment */ typedef unsigned int SaHpiUint32T; /* unsigned 64-bit data, 8-byte alignment */ typedef unsigned long long int SaHpiUint64T __attribute__((__aligned__(8))); /* signed 8-bit data, 1-byte alignment */ typedef signed char SaHpiInt8T; /* signed 16-bit data, 2-byte alignment */ typedef signed short SaHpiInt16T; /* signed 32-bit data, 4-byte alignment */ typedef signed int SaHpiInt32T; /* signed 64-bit data, 8-byte alignment */ typedef signed long long int SaHpiInt64T __attribute__((__aligned__(8))); /* 64-bit floating point, 8-byte alignment */ typedef double SaHpiFloat64T __attribute__((__aligned__(8))); #endif /* enum types are recommended to be 32-bit values, with 4-byte alignment */ typedef SaHpiUint8T SaHpiBoolT; #define SAHPI_TRUE 1 /* While SAHPI_TRUE = 1, any non-zero value is also considered to be True and HPI Users/Implementers of this specification should not test for equality against SAHPI_TRUE. */ #define SAHPI_FALSE 0 /* Platform, O/S, or Vendor dependent */ #ifndef SAHPI_API #define SAHPI_API #endif #ifndef SAHPI_IN #define SAHPI_IN #endif #ifndef SAHPI_OUT #define SAHPI_OUT #endif #ifndef SAHPI_INOUT #define SAHPI_INOUT #endif #ifndef SAHPI_OUTNN #define SAHPI_OUTNN SAHPI_INOUT #endif /* ** Identifier for the manufacturer ** ** This is the IANA-assigned private enterprise number for the ** manufacturer of the resource or FRU, or of the manufacturer ** defining an OEM Control or event type. A list of current ** IANA-assigned private enterprise numbers may be obtained at ** ** http://www.iana.org/assignments/enterprise-numbers ** ** If a manufacturer does not currently have an assigned number, one ** may be obtained by following the instructions located at ** ** http://www.iana.org/cgi-bin/enterprise.pl */ typedef SaHpiUint32T SaHpiManufacturerIdT; #define SAHPI_MANUFACTURER_ID_UNSPECIFIED (SaHpiManufacturerIdT)0 /* Version Types */ typedef SaHpiUint32T SaHpiVersionT; /* ** Interface Version ** ** The interface version is the version of the actual interface and not the ** version of the implementation. It is a 24 bit value where ** the most significant 8 bits represent the compatibility level ** (with letters represented as the corresponding numbers); ** the next 8 bits represent the major version number; and ** the least significant 8 bits represent the minor version number. */ #define SAHPI_INTERFACE_VERSION (SaHpiVersionT)0x020302 /* B.03.02 */ /* ** Return Codes ** ** SaErrorT is defined in the HPI specification. In the future a ** common SAF types definition may be created to contain this type. At ** that time, this typedef should be removed. Each of the return codes ** is defined in Section 4.1 of the specification. ** ** Future version of the specification may add new return codes. User ** programs should accept unknown return codes as indicating an unknown ** error. ** */ typedef SaHpiInt32T SaErrorT; /* Return code */ /* ** SA_OK: */ #define SA_OK (SaErrorT)0x0000 /* This value is the base for all HPI-specific error codes. */ #define SA_HPI_ERR_BASE -1000 #define SA_ERR_HPI_ERROR (SaErrorT)(SA_HPI_ERR_BASE - 1) #define SA_ERR_HPI_UNSUPPORTED_API (SaErrorT)(SA_HPI_ERR_BASE - 2) #define SA_ERR_HPI_BUSY (SaErrorT)(SA_HPI_ERR_BASE - 3) #define SA_ERR_HPI_INTERNAL_ERROR (SaErrorT)(SA_HPI_ERR_BASE - 4) #define SA_ERR_HPI_INVALID_CMD (SaErrorT)(SA_HPI_ERR_BASE - 5) #define SA_ERR_HPI_TIMEOUT (SaErrorT)(SA_HPI_ERR_BASE - 6) #define SA_ERR_HPI_OUT_OF_SPACE (SaErrorT)(SA_HPI_ERR_BASE - 7) #define SA_ERR_HPI_OUT_OF_MEMORY (SaErrorT)(SA_HPI_ERR_BASE - 8) #define SA_ERR_HPI_INVALID_PARAMS (SaErrorT)(SA_HPI_ERR_BASE - 9) #define SA_ERR_HPI_INVALID_DATA (SaErrorT)(SA_HPI_ERR_BASE - 10) #define SA_ERR_HPI_NOT_PRESENT (SaErrorT)(SA_HPI_ERR_BASE - 11) #define SA_ERR_HPI_NO_RESPONSE (SaErrorT)(SA_HPI_ERR_BASE - 12) #define SA_ERR_HPI_DUPLICATE (SaErrorT)(SA_HPI_ERR_BASE - 13) #define SA_ERR_HPI_INVALID_SESSION (SaErrorT)(SA_HPI_ERR_BASE - 14) #define SA_ERR_HPI_INVALID_DOMAIN (SaErrorT)(SA_HPI_ERR_BASE - 15) #define SA_ERR_HPI_INVALID_RESOURCE (SaErrorT)(SA_HPI_ERR_BASE - 16) #define SA_ERR_HPI_INVALID_REQUEST (SaErrorT)(SA_HPI_ERR_BASE - 17) #define SA_ERR_HPI_ENTITY_NOT_PRESENT (SaErrorT)(SA_HPI_ERR_BASE - 18) #define SA_ERR_HPI_READ_ONLY (SaErrorT)(SA_HPI_ERR_BASE - 19) #define SA_ERR_HPI_CAPABILITY (SaErrorT)(SA_HPI_ERR_BASE - 20) #define SA_ERR_HPI_UNKNOWN (SaErrorT)(SA_HPI_ERR_BASE - 21) #define SA_ERR_HPI_INVALID_STATE (SaErrorT)(SA_HPI_ERR_BASE - 22) #define SA_ERR_HPI_UNSUPPORTED_PARAMS (SaErrorT)(SA_HPI_ERR_BASE - 23) /* ** Domain, Session, and Resource Type Definitions */ /* Domain ID. */ typedef SaHpiUint32T SaHpiDomainIdT; /* The SAHPI_UNSPECIFIED_DOMAIN_ID value is used to specify the default ** domain. */ #define SAHPI_UNSPECIFIED_DOMAIN_ID (SaHpiDomainIdT) 0xFFFFFFFF /* Session ID. */ typedef SaHpiUint32T SaHpiSessionIdT; /* Resource identifier. */ typedef SaHpiUint32T SaHpiResourceIdT; /* The SAHPI_UNSPECIFIED_RESOURCE_ID value is used to specify the Domain ** Event Log and to specify that there is no resource for such things as HPI ** User events/alarms. */ #define SAHPI_UNSPECIFIED_RESOURCE_ID (SaHpiResourceIdT) 0xFFFFFFFF /* Table Related Type Definitions */ typedef SaHpiUint32T SaHpiEntryIdT; #define SAHPI_FIRST_ENTRY (SaHpiEntryIdT)0x00000000 #define SAHPI_LAST_ENTRY (SaHpiEntryIdT)0xFFFFFFFF #define SAHPI_ENTRY_UNSPECIFIED SAHPI_FIRST_ENTRY /* ** Time Related Type Definitions ** ** An HPI time value represents time as either the number of nanoseconds ** since startup (called "relative time") or as the number of ** nanoseconds since 00:00:00, January 1, 1970 (called "absolute time"). ** Any time value less than or equal to 0x0C00000000000000 is ** interpreted as "relative time". Any time value greater than this ** value is interpreted as "absolute time". ** ** When reporting a relative time, the specific meaning of "startup" ** is implementation dependent. It may mean, for example, system boot, ** startup of the HPI implementation, startup of a particular resource, etc. ** ** With the exception of event log entry timestamps, it is implementation- ** dependent whether absolute or relative time is used for each time value ** passed to an HPI User. For event log entry timestamps, the default ** representation is implementation-specific. However, an HPI User can ** change the representation used on subsequent event log entries by calling ** saHpiEventLogTimeSet(). ** ** HPI time values can represent relative times in a range of 0 to 27 years ** and absolute times from 1997 through 2262. Specific HPI implementations ** may not be able to support these entire ranges. However, all HPI ** implementations must be able to report appropriate time values during the ** life of the system. ** ** For event log timestamps, all HPI implementations must support relative ** times in the range of 0 to the longest time since "startup" that is ever ** expected to be encountered and absolute times representing current time ** throughout the expected life of the system. ** ** It should be noted that although nano-second resolution is supported ** in the data type, the actual resolution provided by an implementation ** may be more limited than this. ** ** The value -2**63, which is 0x8000000000000000, is used to indicate ** "unknown/unspecified time". ** ** Conversion to/from POSIX and other common time representations is ** relatively straightforward. The following code framgment converts ** between SaHpiTimeT and time_t: ** ** time_t tt1, tt2; ** SaHpiTimeT saHpiTime; ** ** time(&tt1); ** saHpiTime = (SaHpiTimeT) tt1 * 1000000000; ** tt2 = saHpiTime / 1000000000; ** ** The following fragment converts between SaHpiTimeT and a struct timeval: ** ** struct timeval tv1, tv2; ** SaHpiTimeT saHpiTime; ** ** gettimeofday(&tv1, NULL); ** saHpiTime = (SaHpiTimeT) tv1.tv_sec * 1000000000 + tv1.tv_usec * 1000; ** tv2.tv_sec = saHpiTime / 1000000000; ** tv2.tv_usec = saHpiTime % 1000000000 / 1000; ** ** The following fragment converts between SaHpiTimeT and a struct timespec: ** ** struct timespec ts1, ts2; ** SaHpiTimeT saHpiTime; ** ** clock_gettime(CLOCK_REALTIME, &ts1); ** saHpiTime = (SaHpiTimeT) ts1.tv_sec * 1000000000 + ts1.tv_nsec; ** ts2.tv_sec = saHpiTime / 1000000000; ** ts2.tv_nsec = saHpiTime % 1000000000; ** ** Note, however, that since time_t is (effectively) universally 32 bits, ** all of these conversions will cease to work on January 18, 2038. ** In any of these conversions, if the SaHpiTimeT value is less than or ** equal to 0x0C00000000000000, then the POSIX time structure represents ** time since startup. If the SaHpiTimeT value is greater than this ** value, then the POSIX time structure represents absolute time of day. ** */ typedef SaHpiInt64T SaHpiTimeT; /* Time in nanoseconds */ /* Unspecified or unknown time */ #define SAHPI_TIME_UNSPECIFIED (SaHpiTimeT) 0x8000000000000000LL /* Maximum time that can be specified as relative */ #define SAHPI_TIME_MAX_RELATIVE (SaHpiTimeT) 0x0C00000000000000LL typedef SaHpiInt64T SaHpiTimeoutT; /* Timeout in nanoseconds */ /* Non-blocking call */ #define SAHPI_TIMEOUT_IMMEDIATE (SaHpiTimeoutT) 0x0000000000000000LL /* Blocking call, wait indefinitely for call to complete */ #define SAHPI_TIMEOUT_BLOCK (SaHpiTimeoutT) -1LL /* ** Language ** ** This enumeration lists all of the languages that can be associated with text. ** ** SAHPI_LANG_UNDEF indicates that the language is unspecified or ** unknown. ** ** This enumerated list may grow in future versions of this specification ** as more languages are added. Legacy HPI Users should consider these new ** languages 'valid but unknown'. */ typedef enum { SAHPI_LANG_UNDEF = 0, SAHPI_LANG_AFAR, SAHPI_LANG_ABKHAZIAN, SAHPI_LANG_AFRIKAANS, SAHPI_LANG_AMHARIC, SAHPI_LANG_ARABIC, SAHPI_LANG_ASSAMESE, SAHPI_LANG_AYMARA, SAHPI_LANG_AZERBAIJANI, SAHPI_LANG_BASHKIR, SAHPI_LANG_BYELORUSSIAN, SAHPI_LANG_BULGARIAN, SAHPI_LANG_BIHARI, SAHPI_LANG_BISLAMA, SAHPI_LANG_BENGALI, SAHPI_LANG_TIBETAN, SAHPI_LANG_BRETON, SAHPI_LANG_CATALAN, SAHPI_LANG_CORSICAN, SAHPI_LANG_CZECH, SAHPI_LANG_WELSH, SAHPI_LANG_DANISH, SAHPI_LANG_GERMAN, SAHPI_LANG_BHUTANI, SAHPI_LANG_GREEK, SAHPI_LANG_ENGLISH, SAHPI_LANG_ESPERANTO, SAHPI_LANG_SPANISH, SAHPI_LANG_ESTONIAN, SAHPI_LANG_BASQUE, SAHPI_LANG_PERSIAN, SAHPI_LANG_FINNISH, SAHPI_LANG_FIJI, SAHPI_LANG_FAEROESE, SAHPI_LANG_FRENCH, SAHPI_LANG_FRISIAN, SAHPI_LANG_IRISH, SAHPI_LANG_SCOTSGAELIC, SAHPI_LANG_GALICIAN, SAHPI_LANG_GUARANI, SAHPI_LANG_GUJARATI, SAHPI_LANG_HAUSA, SAHPI_LANG_HINDI, SAHPI_LANG_CROATIAN, SAHPI_LANG_HUNGARIAN, SAHPI_LANG_ARMENIAN, SAHPI_LANG_INTERLINGUA, SAHPI_LANG_INTERLINGUE, SAHPI_LANG_INUPIAK, SAHPI_LANG_INDONESIAN, SAHPI_LANG_ICELANDIC, SAHPI_LANG_ITALIAN, SAHPI_LANG_HEBREW, SAHPI_LANG_JAPANESE, SAHPI_LANG_YIDDISH, SAHPI_LANG_JAVANESE, SAHPI_LANG_GEORGIAN, SAHPI_LANG_KAZAKH, SAHPI_LANG_GREENLANDIC, SAHPI_LANG_CAMBODIAN, SAHPI_LANG_KANNADA, SAHPI_LANG_KOREAN, SAHPI_LANG_KASHMIRI, SAHPI_LANG_KURDISH, SAHPI_LANG_KIRGHIZ, SAHPI_LANG_LATIN, SAHPI_LANG_LINGALA, SAHPI_LANG_LAOTHIAN, SAHPI_LANG_LITHUANIAN, SAHPI_LANG_LATVIANLETTISH, SAHPI_LANG_MALAGASY, SAHPI_LANG_MAORI, SAHPI_LANG_MACEDONIAN, SAHPI_LANG_MALAYALAM, SAHPI_LANG_MONGOLIAN, SAHPI_LANG_MOLDAVIAN, SAHPI_LANG_MARATHI, SAHPI_LANG_MALAY, SAHPI_LANG_MALTESE, SAHPI_LANG_BURMESE, SAHPI_LANG_NAURU, SAHPI_LANG_NEPALI, SAHPI_LANG_DUTCH, SAHPI_LANG_NORWEGIAN, SAHPI_LANG_OCCITAN, SAHPI_LANG_AFANOROMO, SAHPI_LANG_ORIYA, SAHPI_LANG_PUNJABI, SAHPI_LANG_POLISH, SAHPI_LANG_PASHTOPUSHTO, SAHPI_LANG_PORTUGUESE, SAHPI_LANG_QUECHUA, SAHPI_LANG_RHAETOROMANCE, SAHPI_LANG_KIRUNDI, SAHPI_LANG_ROMANIAN, SAHPI_LANG_RUSSIAN, SAHPI_LANG_KINYARWANDA, SAHPI_LANG_SANSKRIT, SAHPI_LANG_SINDHI, SAHPI_LANG_SANGRO, SAHPI_LANG_SERBOCROATIAN, SAHPI_LANG_SINGHALESE, SAHPI_LANG_SLOVAK, SAHPI_LANG_SLOVENIAN, SAHPI_LANG_SAMOAN, SAHPI_LANG_SHONA, SAHPI_LANG_SOMALI, SAHPI_LANG_ALBANIAN, SAHPI_LANG_SERBIAN, SAHPI_LANG_SISWATI, SAHPI_LANG_SESOTHO, SAHPI_LANG_SUDANESE, SAHPI_LANG_SWEDISH, SAHPI_LANG_SWAHILI, SAHPI_LANG_TAMIL, SAHPI_LANG_TELUGU, SAHPI_LANG_TAJIK, SAHPI_LANG_THAI, SAHPI_LANG_TIGRINYA, SAHPI_LANG_TURKMEN, SAHPI_LANG_TAGALOG, SAHPI_LANG_SETSWANA, SAHPI_LANG_TONGA, SAHPI_LANG_TURKISH, SAHPI_LANG_TSONGA, SAHPI_LANG_TATAR, SAHPI_LANG_TWI, SAHPI_LANG_UKRAINIAN, SAHPI_LANG_URDU, SAHPI_LANG_UZBEK, SAHPI_LANG_VIETNAMESE, SAHPI_LANG_VOLAPUK, SAHPI_LANG_WOLOF, SAHPI_LANG_XHOSA, SAHPI_LANG_YORUBA, SAHPI_LANG_CHINESE, SAHPI_LANG_ZULU, SAHPI_LANG_MAX_VALID = SAHPI_LANG_ZULU } SaHpiLanguageT; /* ** Text Buffers ** ** These structures are used for defining the type of data in the text buffer ** and the length of the buffer. Text buffers are used in many places for ** variable length strings of data. ** ** The encoding of the Data field in the SaHpiTextBufferT structure is defined ** by the value of the DataType field in the buffer. The following table ** describes the various encodings: ** ** DataType Encoding ** -------- -------- ** ** SAHPI_TL_TYPE_UNICODE 16-bit Unicode. See Note 3 below. ** ** SAHPI_TL_TYPE_BCDPLUS 8-bit ASCII, "0"-"9" or space, dash, period, ** colon, comma, or underscore only. ** See Note 2 below. ** ** SAHPI_TL_TYPE_ASCII6 8-bit ASCII, reduced set, 0x20=0x5f only. ** See Note 2 below. ** ** SAHPI_TL_TYPE_TEXT 8-bit ASCII+Latin 1. See Note 1 below. ** ** SAHPI_TL_TYPE_BINARY 8-bit bytes, any values legal ** ** Note 1: "ASCII+Latin 1" is derived from the first 256 characters of ** Unicode 2.0. The first 256 codes of Unicode follow ISO 646 (ASCII) ** and ISO 8859/1 (Latin 1). The Unicode "C0 Controls and Basic Latin" ** set defines the first 128 8-bit characters (00h-7Fh) and the ** "C1 Controls and Latin 1 Supplement" defines the second 128 (80h-FFh). ** ** Note 2: The SAHPI_TL_TYPE_BCDPLUS and SAHPI_TL_TYPE_ASCII6 encodings ** use normal ASCII character encodings, but restrict the allowed ** characters to a subset of the entire ASCII character set. These ** encodings are used when the target device contains restrictions ** on which characters it can store or display. SAHPI_TL_TYPE_BCDPLUS ** data may be stored externally as 4-bit values, and ** SAHPI_TL_TYPE_ASCII6 may be stored externally as 6-bit values. ** But, regardless of how the data is stored externally, it is ** encoded as 8-bit ASCII in the SaHpiTextBufferT structure passed ** across the HPI. ** ** Note 3: Unicode data is encoded according to the UTF-16LE encoding scheme ** as defined in the UNICODE 4.0 standard. This encoding scheme stores ** 21-bit UNICODE code points in a series of 16-bit values stored ** least-siginficant-byte first in the SaHpiTextBufferT Data field. ** The SaHpiTextBufferT DataLength field contains the number of bytes, ** so must always be an even number (maximum 0xFE) when the DataType is ** SAHPI_TL_TYPE_UNICODE. In addition to containing an even number of ** bytes, the text buffer must also contain a well-formed UTF-16LE ** sequence (meaning no "unmatched surrogates" may be present), and ** must not include encodings of any UNICODE "Non-Characters" in order ** to be considered valid. More details can be found in the Unicode ** specification available at www.unicode.org. */ #define SAHPI_MAX_TEXT_BUFFER_LENGTH 255 typedef enum { SAHPI_TL_TYPE_UNICODE = 0, /* 2-byte UNICODE characters; DataLength must be even. */ SAHPI_TL_TYPE_BCDPLUS, /* String of ASCII characters, "0"-"9", space, dash, period, colon, comma or underscore ONLY */ SAHPI_TL_TYPE_ASCII6, /* Reduced ASCII character set: 0x20-0x5F ONLY */ SAHPI_TL_TYPE_TEXT, /* ASCII+Latin 1 */ SAHPI_TL_TYPE_BINARY, /* Binary data, any values legal */ SAHPI_TL_TYPE_MAX_VALID = SAHPI_TL_TYPE_BINARY } SaHpiTextTypeT; typedef struct { SaHpiTextTypeT DataType; SaHpiLanguageT Language; /* Language the text is in. */ SaHpiUint8T DataLength; /* Bytes used in Data buffer */ SaHpiUint8T Data[SAHPI_MAX_TEXT_BUFFER_LENGTH]; /* Data buffer */ } SaHpiTextBufferT; /* ** Instrument Id ** ** The following data type is used for all management instrument identifiers - ** Sensor numbers, Control numbers, Watchdog Timer numbers, etc. ** */ typedef SaHpiUint32T SaHpiInstrumentIdT; /******************************************************************************* ******************************************************************************** ********** ********** ********** Entities ********** ********** ********** ******************************************************************************** *******************************************************************************/ /* ** Entity Types ** ** An Entity is a physical hardware component of the system. Entities are ** defined with an entity type enumeration, and an entity location number ** (to identify the physical location of a particular type of entity). ** ** Entities are uniquely identified in a system with an ordered series of ** Entity Type / Entity Location pairs called an "Entity Path". Each subsequent ** Entity Type/Entity Location in the path is the next higher "containing" ** entity. The "root" of the Entity Path (the outermost level of containment) ** is designated with an Entity Type of SAHPI_ENT_ROOT if the entire Entity Path ** is fewer than SAHPI_MAX_ENTITY_PATH entries in length. ** ** Enumerated Entity Types include those types enumerated by the IPMI Consortium ** for IPMI-managed entities, as well as additional types defined by the ** HPI specification. ** Future versions of this specification may add new Entity Types to this ** enumerated type. Room is left in the enumeration for the inclusion of Entity ** Types taken from other lists, if needed in the future. ** Legacy HPI Users should consider these new entity types 'valid but unknown' ** even if they are values greater than SAHPI_ENT_MAX_VALID. */ /* Base values for entity types from various sources. */ #define SAHPI_ENT_IPMI_GROUP 0 #define SAHPI_ENT_SAFHPI_GROUP 0x10000 #define SAHPI_ENT_ROOT_VALUE 0xFFFF typedef enum { SAHPI_ENT_UNSPECIFIED = SAHPI_ENT_IPMI_GROUP, SAHPI_ENT_OTHER, SAHPI_ENT_UNKNOWN, SAHPI_ENT_PROCESSOR, SAHPI_ENT_DISK_BAY, /* Disk or disk bay */ SAHPI_ENT_PERIPHERAL_BAY, SAHPI_ENT_SYS_MGMNT_MODULE, /* System management module */ SAHPI_ENT_SYSTEM_BOARD, /* Main system board, may also be processor board and/or internal expansion board */ SAHPI_ENT_MEMORY_MODULE, /* Board holding memory devices */ SAHPI_ENT_PROCESSOR_MODULE, /* Holds processors, use this designation when processors are not mounted on system board */ SAHPI_ENT_POWER_SUPPLY, /* Main power supply (supplies) for the system */ SAHPI_ENT_ADD_IN_CARD, SAHPI_ENT_FRONT_PANEL_BOARD, /* Control panel */ SAHPI_ENT_BACK_PANEL_BOARD, SAHPI_ENT_POWER_SYSTEM_BOARD, SAHPI_ENT_DRIVE_BACKPLANE, SAHPI_ENT_SYS_EXPANSION_BOARD, /* System internal expansion board (contains expansion slots). */ SAHPI_ENT_OTHER_SYSTEM_BOARD, /* Part of board set */ SAHPI_ENT_PROCESSOR_BOARD, /* Holds 1 or more processors. Includes boards that hold SECC modules */ SAHPI_ENT_POWER_UNIT, /* Power unit / power domain (typically used as a pre-defined logical entity for grouping power supplies)*/ SAHPI_ENT_POWER_MODULE, /* Power module / DC-to-DC converter. Use this value for internal converters. Note: You should use entity ID (power supply) for the main power supply even if the main supply is a DC-to-DC converter */ SAHPI_ENT_POWER_MGMNT, /* Power management/distribution board */ SAHPI_ENT_CHASSIS_BACK_PANEL_BOARD, SAHPI_ENT_SYSTEM_CHASSIS, SAHPI_ENT_SUB_CHASSIS, SAHPI_ENT_OTHER_CHASSIS_BOARD, SAHPI_ENT_DISK_DRIVE_BAY, SAHPI_ENT_PERIPHERAL_BAY_2, SAHPI_ENT_DEVICE_BAY, SAHPI_ENT_COOLING_DEVICE, /* Fan/cooling device */ SAHPI_ENT_COOLING_UNIT, /* Can be used as a pre-defined logical entity for grouping fans or other cooling devices. */ SAHPI_ENT_INTERCONNECT, /* Cable / interconnect */ SAHPI_ENT_MEMORY_DEVICE, /* This Entity ID should be used for replaceable memory devices, e.g. DIMM/SIMM. It is recommended that Entity IDs not be used for individual non-replaceable memory devices. Rather, monitoring and error reporting should be associated with the FRU [e.g. memory card] holding the memory. */ SAHPI_ENT_SYS_MGMNT_SOFTWARE, /* System Management Software */ SAHPI_ENT_BIOS, SAHPI_ENT_OPERATING_SYSTEM, SAHPI_ENT_SYSTEM_BUS, SAHPI_ENT_GROUP, /* This is a logical entity for use with Entity Association records. It is provided to allow a Sensor data record to point to an entity- association record when there is no appropriate pre-defined logical entity for the entity grouping. This Entity should not be used as a physical entity. */ SAHPI_ENT_REMOTE, /* Out of band management communication device */ SAHPI_ENT_EXTERNAL_ENVIRONMENT, SAHPI_ENT_BATTERY, SAHPI_ENT_RESERVED_1, SAHPI_ENT_RESERVED_2, SAHPI_ENT_RESERVED_3, SAHPI_ENT_RESERVED_4, SAHPI_ENT_RESERVED_5, /** * The following five symbols are not defined by the SAF HPI specification, * but are included here to align with the IPMI 2.0 specification **/ /* Processing blade (a blade module that contain processor, memory, and I/O connections that enable it to operate as a processing entity) */ SAHPI_ENT_PROCESSING_BLADE = SAHPI_ENT_RESERVED_1, /* Connectivity switch (a blade module that provides the fabric or network connection for one or more processing blades or modules) */ SAHPI_ENT_CONNECTIVITY_SWITCH = SAHPI_ENT_RESERVED_2, /* Processor/memory module (processor and memory together on a module) */ SAHPI_ENT_PROCESSOR_MEMORY_MODULE = SAHPI_ENT_RESERVED_3, /* I/O module (a module that contains the main elements of an I/O interface) */ SAHPI_ENT_IO_MODULE = SAHPI_ENT_RESERVED_4, /* Processor/ IO module (a module that contains the main elements of an I/O interface combination processor and i/O module) */ SAHPI_ENT_PROCESSOR_IO_MODULE = SAHPI_ENT_RESERVED_5, SAHPI_ENT_MC_FIRMWARE , /* Management Controller Firmware, represents firmware or software running on a management controller */ SAHPI_ENT_IPMI_CHANNEL, /* This Entity ID enables associating Sensors with the IPMI communication channels - for example a Redundancy Sensor could be used to report redundancy status for a channel that is composed of multiple physical links. By convention, the Entity Instance corresponds to the channel number. */ SAHPI_ENT_PCI_BUS, SAHPI_ENT_PCI_EXPRESS_BUS, SAHPI_ENT_SCSI_BUS, SAHPI_ENT_SATA_BUS, SAHPI_ENT_PROC_FSB, /* Processor, front side bus */ SAHPI_ENT_CLOCK, /* e.g. Real Time Clock (RTC) */ SAHPI_ENT_SYSTEM_FIRMWARE, /* e.g. BIOS/ EFI */ /* The range from SAHPI_ENT_SYSTEM_FIRMWARE + 1 to SAHPI_ENT_CHASSIS_SPECIFIC - 1 is Reserved for future use by this specification */ SAHPI_ENT_CHASSIS_SPECIFIC = SAHPI_ENT_IPMI_GROUP + 0x90, SAHPI_ENT_CHASSIS_SPECIFIC01, /* include numbers from SaHpiXtca.h to */ SAHPI_ENT_CHASSIS_SPECIFIC02, /* avoid gcc-4.6 warning */ SAHPI_ENT_CHASSIS_SPECIFIC03, /* from -Wswitch check */ SAHPI_ENT_CHASSIS_SPECIFIC04, SAHPI_ENT_CHASSIS_SPECIFIC05, SAHPI_ENT_CHASSIS_SPECIFIC06, SAHPI_ENT_CHASSIS_SPECIFIC07, SAHPI_ENT_CHASSIS_SPECIFIC08, SAHPI_ENT_CHASSIS_SPECIFIC09, SAHPI_ENT_CHASSIS_SPECIFIC10, SAHPI_ENT_CHASSIS_SPECIFIC11, SAHPI_ENT_CHASSIS_SPECIFIC12, SAHPI_ENT_CHASSIS_SPECIFIC13, SAHPI_ENT_BOARD_SET_SPECIFIC = SAHPI_ENT_IPMI_GROUP + 0xB0, SAHPI_ENT_OEM_SYSINT_SPECIFIC = SAHPI_ENT_IPMI_GROUP + 0xD0, SAHPI_ENT_ROOT = SAHPI_ENT_ROOT_VALUE, SAHPI_ENT_RACK = SAHPI_ENT_SAFHPI_GROUP, SAHPI_ENT_SUBRACK, SAHPI_ENT_COMPACTPCI_CHASSIS, SAHPI_ENT_ADVANCEDTCA_CHASSIS, SAHPI_ENT_RACK_MOUNTED_SERVER, SAHPI_ENT_SYSTEM_BLADE, SAHPI_ENT_SWITCH, /* Network switch, such as a rack-mounted ethernet or fabric switch. */ SAHPI_ENT_SWITCH_BLADE, /* Network switch, as above, but in a bladed system. */ SAHPI_ENT_SBC_BLADE, SAHPI_ENT_IO_BLADE, SAHPI_ENT_DISK_BLADE, SAHPI_ENT_DISK_DRIVE, SAHPI_ENT_FAN, SAHPI_ENT_POWER_DISTRIBUTION_UNIT, SAHPI_ENT_SPEC_PROC_BLADE, /* Special Processing Blade, including DSP */ SAHPI_ENT_IO_SUBBOARD, /* I/O Sub-Board, including PMC I/O board */ SAHPI_ENT_SBC_SUBBOARD, /* SBC Sub-Board, including PMC SBC board */ SAHPI_ENT_ALARM_MANAGER, /* Chassis alarm manager board */ SAHPI_ENT_SHELF_MANAGER, /* Blade-based shelf manager */ SAHPI_ENT_DISPLAY_PANEL, /* Display panel, such as an alarm display panel. */ SAHPI_ENT_SUBBOARD_CARRIER_BLADE, /* Includes PMC Carrier Blade -- Use only if "carrier" is only function of blade. Else use primary function (SBC_BLADE, SPEC_PROC_BLADE, etc.). */ SAHPI_ENT_PHYSICAL_SLOT, /* Indicates the physical slot into which a FRU is inserted. */ SAHPI_ENT_PICMG_FRONT_BLADE, /* Any blade conforming to a PICMG Standard. E.g. AdvancedTCA */ SAHPI_ENT_SYSTEM_INVENTORY_DEVICE, /* Inventory storage device for storing system definitions */ SAHPI_ENT_FILTRATION_UNIT, /* E.g. a fan filter */ SAHPI_ENT_AMC, /* Advanced Mezzannine Card */ /* The range from SAHPI_ENT_AMC + 0x01 to SAHPI_ENT_SAFHPI_GROUP + 0x2F is reserved for future use by this specification */ SAHPI_ENT_BMC = SAHPI_ENT_SAFHPI_GROUP + 0x30, /* Baseboard Management Controller */ SAHPI_ENT_IPMC, /* IPM controller */ SAHPI_ENT_MMC, /* Module Management controller */ SAHPI_ENT_SHMC, /* Shelf Mangement Controller */ SAHPI_ENT_CPLD, /* Complex Programmable Logic Device */ SAHPI_ENT_EPLD, /* Electrically Programmable Logic Device */ SAHPI_ENT_FPGA, /* Field Prorammable Gate Array */ SAHPI_ENT_DASD, /* Direct Access Storage Device */ SAHPI_ENT_NIC, /* Network Interface Card */ SAHPI_ENT_DSP, /* Digital Signal Processor */ SAHPI_ENT_UCODE, /* Microcode */ SAHPI_ENT_NPU, /* Network Processor */ SAHPI_ENT_OEM, /* Proprietary device */ SAHPI_ENT_INTERFACE, SAHPI_ENT_MICROTCA_CHASSIS, SAHPI_ENT_CARRIER, /* non-blade carrier module, such as microTCA carrier */ SAHPI_ENT_CARRIER_MANAGER, /* management module for a carrier module */ SAHPI_ENT_CONFIG_DATA, /* Special entity to designate configuration data held by a management instrument. */ SAHPI_ENT_INDICATOR, /* Indicator device, LED, Beeper */ SAHPI_ENT_MAX_VALID = SAHPI_ENT_INDICATOR /* The range from SAHPI_ENT_OEM + 0x01 to SAHPI_ENT_SAFHPI_GROUP + 0xFF is reserved for future use by this specification */ } SaHpiEntityTypeT; typedef SaHpiUint32T SaHpiEntityLocationT; typedef struct { SaHpiEntityTypeT EntityType; SaHpiEntityLocationT EntityLocation; } SaHpiEntityT; #define SAHPI_MAX_ENTITY_PATH 16 typedef struct { SaHpiEntityT Entry[SAHPI_MAX_ENTITY_PATH]; } SaHpiEntityPathT; /******************************************************************************* ******************************************************************************** ********** ********** ********** Sensor Event States ********** ********** ********** ******************************************************************************** *******************************************************************************/ /* ** Category ** ** Sensor events contain an event category and event state. Depending on the ** event category, the event states take on different meanings for events ** generated by specific Sensors. ** ** It is recommended that implementations map their Sensor specific ** event categories into the set of categories listed here. When such a mapping ** is impractical or impossible, the SAHPI_EC_SENSOR_SPECIFIC category should ** be used. ** ** The SAHPI_EC_GENERIC category can be used for discrete Sensors which have ** state meanings other than those identified with other event categories. ** ** Future versions of this specification may add new event categories to this ** list. Legacy HPI Users should consider these new event categories as being ** equivalent to SAHPI_EC_GENERIC. */ typedef SaHpiUint8T SaHpiEventCategoryT; #define SAHPI_EC_UNSPECIFIED (SaHpiEventCategoryT)0x00 /* Unspecified */ #define SAHPI_EC_THRESHOLD (SaHpiEventCategoryT)0x01 /* Threshold events */ #define SAHPI_EC_USAGE (SaHpiEventCategoryT)0x02 /* Usage state events */ #define SAHPI_EC_STATE (SaHpiEventCategoryT)0x03 /* Generic state events */ #define SAHPI_EC_PRED_FAIL (SaHpiEventCategoryT)0x04 /* Predictive fail events */ #define SAHPI_EC_LIMIT (SaHpiEventCategoryT)0x05 /* Limit events */ #define SAHPI_EC_PERFORMANCE (SaHpiEventCategoryT)0x06 /* Performance events */ #define SAHPI_EC_SEVERITY (SaHpiEventCategoryT)0x07 /* Severity indicating events */ #define SAHPI_EC_PRESENCE (SaHpiEventCategoryT)0x08 /* Device presence events */ #define SAHPI_EC_ENABLE (SaHpiEventCategoryT)0x09 /* Device enabled events */ #define SAHPI_EC_AVAILABILITY (SaHpiEventCategoryT)0x0A /* Availability state events */ #define SAHPI_EC_REDUNDANCY (SaHpiEventCategoryT)0x0B /* Redundancy state events */ #define SAHPI_EC_SENSOR_SPECIFIC (SaHpiEventCategoryT)0x7E /* Sensor- specific events */ #define SAHPI_EC_GENERIC (SaHpiEventCategoryT)0x7F /* OEM defined events */ /* ** Event States ** ** The following event states are specified relative to the categories listed ** above. The event types are only valid for their given category. Each set of ** events is labeled as to which category it belongs to. ** Each event has only one event state associated with it. When retrieving ** the event status or event enabled status a bit mask of all applicable event ** states is used. Similarly, when setting the event enabled status a bit mask ** of all applicable event states is used. */ typedef SaHpiUint16T SaHpiEventStateT; /* ** SaHpiEventCategoryT == */ #define SAHPI_ES_UNSPECIFIED (SaHpiEventStateT)0x0000 /* ** SaHpiEventCategoryT == SAHPI_EC_THRESHOLD ** When using these event states, the event state should match ** the event severity (for example SAHPI_ES_LOWER_MINOR should have an ** event severity of SAHPI_MINOR). */ #define SAHPI_ES_LOWER_MINOR (SaHpiEventStateT)0x0001 #define SAHPI_ES_LOWER_MAJOR (SaHpiEventStateT)0x0002 #define SAHPI_ES_LOWER_CRIT (SaHpiEventStateT)0x0004 #define SAHPI_ES_UPPER_MINOR (SaHpiEventStateT)0x0008 #define SAHPI_ES_UPPER_MAJOR (SaHpiEventStateT)0x0010 #define SAHPI_ES_UPPER_CRIT (SaHpiEventStateT)0x0020 /* SaHpiEventCategoryT == SAHPI_EC_USAGE */ #define SAHPI_ES_IDLE (SaHpiEventStateT)0x0001 #define SAHPI_ES_ACTIVE (SaHpiEventStateT)0x0002 #define SAHPI_ES_BUSY (SaHpiEventStateT)0x0004 /* SaHpiEventCategoryT == SAHPI_EC_STATE */ #define SAHPI_ES_STATE_DEASSERTED (SaHpiEventStateT)0x0001 #define SAHPI_ES_STATE_ASSERTED (SaHpiEventStateT)0x0002 /* SaHpiEventCategoryT == SAHPI_EC_PRED_FAIL */ #define SAHPI_ES_PRED_FAILURE_DEASSERT (SaHpiEventStateT)0x0001 #define SAHPI_ES_PRED_FAILURE_ASSERT (SaHpiEventStateT)0x0002 /* SaHpiEventCategoryT == SAHPI_EC_LIMIT */ #define SAHPI_ES_LIMIT_NOT_EXCEEDED (SaHpiEventStateT)0x0001 #define SAHPI_ES_LIMIT_EXCEEDED (SaHpiEventStateT)0x0002 /* SaHpiEventCategoryT == SAHPI_EC_PERFORMANCE */ #define SAHPI_ES_PERFORMANCE_MET (SaHpiEventStateT)0x0001 #define SAHPI_ES_PERFORMANCE_LAGS (SaHpiEventStateT)0x0002 /* ** SaHpiEventCategoryT == SAHPI_EC_SEVERITY ** When using these event states, the event state should match ** the event severity */ #define SAHPI_ES_OK (SaHpiEventStateT)0x0001 #define SAHPI_ES_MINOR_FROM_OK (SaHpiEventStateT)0x0002 #define SAHPI_ES_MAJOR_FROM_LESS (SaHpiEventStateT)0x0004 #define SAHPI_ES_CRITICAL_FROM_LESS (SaHpiEventStateT)0x0008 #define SAHPI_ES_MINOR_FROM_MORE (SaHpiEventStateT)0x0010 #define SAHPI_ES_MAJOR_FROM_CRITICAL (SaHpiEventStateT)0x0020 #define SAHPI_ES_CRITICAL (SaHpiEventStateT)0x0040 #define SAHPI_ES_MONITOR (SaHpiEventStateT)0x0080 #define SAHPI_ES_INFORMATIONAL (SaHpiEventStateT)0x0100 /* SaHpiEventCategoryT == SAHPI_EC_PRESENCE */ #define SAHPI_ES_ABSENT (SaHpiEventStateT)0x0001 #define SAHPI_ES_PRESENT (SaHpiEventStateT)0x0002 /* SaHpiEventCategoryT == SAHPI_EC_ENABLE */ #define SAHPI_ES_DISABLED (SaHpiEventStateT)0x0001 #define SAHPI_ES_ENABLED (SaHpiEventStateT)0x0002 /* SaHpiEventCategoryT == SAHPI_EC_AVAILABILITY */ #define SAHPI_ES_RUNNING (SaHpiEventStateT)0x0001 #define SAHPI_ES_TEST (SaHpiEventStateT)0x0002 #define SAHPI_ES_POWER_OFF (SaHpiEventStateT)0x0004 #define SAHPI_ES_ON_LINE (SaHpiEventStateT)0x0008 #define SAHPI_ES_OFF_LINE (SaHpiEventStateT)0x0010 #define SAHPI_ES_OFF_DUTY (SaHpiEventStateT)0x0020 #define SAHPI_ES_DEGRADED (SaHpiEventStateT)0x0040 #define SAHPI_ES_POWER_SAVE (SaHpiEventStateT)0x0080 #define SAHPI_ES_INSTALL_ERROR (SaHpiEventStateT)0x0100 /* SaHpiEventCategoryT == SAHPI_EC_REDUNDANCY */ #define SAHPI_ES_FULLY_REDUNDANT (SaHpiEventStateT)0x0001 #define SAHPI_ES_REDUNDANCY_LOST (SaHpiEventStateT)0x0002 #define SAHPI_ES_REDUNDANCY_DEGRADED (SaHpiEventStateT)0x0004 #define SAHPI_ES_REDUNDANCY_LOST_SUFFICIENT_RESOURCES \ (SaHpiEventStateT)0x0008 #define SAHPI_ES_NON_REDUNDANT_SUFFICIENT_RESOURCES \ (SaHpiEventStateT)0x0010 #define SAHPI_ES_NON_REDUNDANT_INSUFFICIENT_RESOURCES \ (SaHpiEventStateT)0x0020 #define SAHPI_ES_REDUNDANCY_DEGRADED_FROM_FULL (SaHpiEventStateT)0x0040 #define SAHPI_ES_REDUNDANCY_DEGRADED_FROM_NON (SaHpiEventStateT)0x0080 /* ** SaHpiEventCategoryT == SAHPI_EC_GENERIC || SAHPI_EC_SENSOR_SPECIFIC ** These event states are implementation-specific. */ #define SAHPI_ES_STATE_00 (SaHpiEventStateT)0x0001 #define SAHPI_ES_STATE_01 (SaHpiEventStateT)0x0002 #define SAHPI_ES_STATE_02 (SaHpiEventStateT)0x0004 #define SAHPI_ES_STATE_03 (SaHpiEventStateT)0x0008 #define SAHPI_ES_STATE_04 (SaHpiEventStateT)0x0010 #define SAHPI_ES_STATE_05 (SaHpiEventStateT)0x0020 #define SAHPI_ES_STATE_06 (SaHpiEventStateT)0x0040 #define SAHPI_ES_STATE_07 (SaHpiEventStateT)0x0080 #define SAHPI_ES_STATE_08 (SaHpiEventStateT)0x0100 #define SAHPI_ES_STATE_09 (SaHpiEventStateT)0x0200 #define SAHPI_ES_STATE_10 (SaHpiEventStateT)0x0400 #define SAHPI_ES_STATE_11 (SaHpiEventStateT)0x0800 #define SAHPI_ES_STATE_12 (SaHpiEventStateT)0x1000 #define SAHPI_ES_STATE_13 (SaHpiEventStateT)0x2000 #define SAHPI_ES_STATE_14 (SaHpiEventStateT)0x4000 /******************************************************************************* ******************************************************************************** ********** ********** ********** Sensors ********** ********** ********** ******************************************************************************** *******************************************************************************/ /* Sensor Number */ typedef SaHpiInstrumentIdT SaHpiSensorNumT; /* ** The following specifies the named range for Sensor numbers reserved ** by the HPI specification. ** HPI Implementations shall not assign Sensor numbers within this ** number range, except for the specific Sensors identified in the ** specification. For example, currently, three aggregate Sensors are named in ** this range. Other Sensors exposed by the HPI Implementation (e.g., a ** temperature Sensor) must be assigned a number outside of this range. **/ #define SAHPI_STANDARD_SENSOR_MIN (SaHpiSensorNumT)0x00000100 #define SAHPI_STANDARD_SENSOR_MAX (SaHpiSensorNumT)0x000001FF #define SAHPI_SENSOR_TYPE_SAFHPI_GROUP 0x10000 /* Type of Sensor ** Future versions of this specification may add new Sensor types as required. ** Legacy HPI Users should consider these new types 'valid but unknown' ** even if the value is greater than SAHPI_SENSOR_TYPE_MAX_VALID. ** Note that the values from SAHPI_OEM_SENSOR through SAHPI_OEM_SENSOR+03Fh ** are reserved for OEM sensor types. */ typedef enum { SAHPI_TEMPERATURE = 0x01, SAHPI_VOLTAGE, SAHPI_CURRENT, SAHPI_FAN, SAHPI_PHYSICAL_SECURITY, SAHPI_PLATFORM_VIOLATION, SAHPI_PROCESSOR, SAHPI_POWER_SUPPLY, SAHPI_POWER_UNIT, SAHPI_COOLING_DEVICE, SAHPI_OTHER_UNITS_BASED_SENSOR, SAHPI_MEMORY, SAHPI_DRIVE_SLOT, SAHPI_POST_MEMORY_RESIZE, SAHPI_SYSTEM_FW_PROGRESS, SAHPI_EVENT_LOGGING_DISABLED, SAHPI_RESERVED1, SAHPI_SYSTEM_EVENT, SAHPI_CRITICAL_INTERRUPT, SAHPI_BUTTON, SAHPI_MODULE_BOARD, SAHPI_MICROCONTROLLER_COPROCESSOR, SAHPI_ADDIN_CARD, SAHPI_CHASSIS, SAHPI_CHIP_SET, SAHPI_OTHER_FRU, SAHPI_CABLE_INTERCONNECT, SAHPI_TERMINATOR, SAHPI_SYSTEM_BOOT_INITIATED, SAHPI_BOOT_ERROR, SAHPI_OS_BOOT, SAHPI_OS_CRITICAL_STOP, SAHPI_SLOT_CONNECTOR, SAHPI_SYSTEM_ACPI_POWER_STATE, SAHPI_RESERVED2, SAHPI_PLATFORM_ALERT, SAHPI_ENTITY_PRESENCE, SAHPI_MONITOR_ASIC_IC, SAHPI_LAN, SAHPI_MANAGEMENT_SUBSYSTEM_HEALTH, SAHPI_BATTERY, SAHPI_SESSION_AUDIT, SAHPI_VERSION_CHANGE, SAHPI_OPERATIONAL = 0xA0, SAHPI_OEM_SENSOR=0xC0, SAHPI_COMM_CHANNEL_LINK_STATE = SAHPI_SENSOR_TYPE_SAFHPI_GROUP + 0x1, SAHPI_MANAGEMENT_BUS_STATE, SAHPI_COMM_CHANNEL_BUS_STATE, SAHPI_CONFIG_DATA, SAHPI_POWER_BUDGET, SAHPI_SENSOR_TYPE_MAX_VALID = SAHPI_POWER_BUDGET } SaHpiSensorTypeT; /* ** Sensor Reading Type ** ** These definitions list the available data types that can be ** used for Sensor readings. ** */ #define SAHPI_SENSOR_BUFFER_LENGTH 32 typedef enum { SAHPI_SENSOR_READING_TYPE_INT64, SAHPI_SENSOR_READING_TYPE_UINT64, SAHPI_SENSOR_READING_TYPE_FLOAT64, SAHPI_SENSOR_READING_TYPE_BUFFER, /* 32 byte array. The format of the buffer is implementation- specific. Sensors that use this reading type may not have thresholds that are settable or readable. */ SAHPI_SENSOR_READING_TYPE_MAX_VALID = SAHPI_SENSOR_READING_TYPE_BUFFER } SaHpiSensorReadingTypeT; typedef union { SaHpiInt64T SensorInt64; SaHpiUint64T SensorUint64; SaHpiFloat64T SensorFloat64; SaHpiUint8T SensorBuffer[SAHPI_SENSOR_BUFFER_LENGTH]; } SaHpiSensorReadingUnionT; /* ** Sensor Reading ** ** The Sensor reading data structure is returned from a call to get ** Sensor reading. The structure is also used when setting and getting Sensor ** threshold values and reporting Sensor ranges. ** ** IsSupported is set to True if a Sensor reading/threshold value is available. ** Otherwise, if no reading or threshold is supported, this flag is set to ** False. ** */ typedef struct { SaHpiBoolT IsSupported; SaHpiSensorReadingTypeT Type; SaHpiSensorReadingUnionT Value; } SaHpiSensorReadingT; /* Sensor Event Mask Actions - used with saHpiSensorEventMasksSet() */ typedef enum { SAHPI_SENS_ADD_EVENTS_TO_MASKS, SAHPI_SENS_REMOVE_EVENTS_FROM_MASKS, SAHPI_SENS_EVENT_MASK_ACTION_MAX_VALID = SAHPI_SENS_REMOVE_EVENTS_FROM_MASKS } SaHpiSensorEventMaskActionT; /* Value to use for AssertEvents or DeassertEvents parameter in saHpiSensorEventMasksSet() to set or clear all supported event states for a Sensor in the mask */ #define SAHPI_ALL_EVENT_STATES (SaHpiEventStateT)0xFFFF /* ** Threshold Values ** This structure encompasses all of the thresholds that can be set. ** These are set and read with the same units as Sensors report in ** saHpiSensorReadingGet(). When hysteresis is not constant over the ** range of Sensor values, it is calculated at the nominal Sensor reading, ** as given in the Range field of the Sensor RDR. ** ** Thresholds are required to be set in-order (such that the setting for ** UpCritical is greater than or equal to the setting for UpMajor, etc.). ** ** A high-going threshold asserts an event state when the reading is ** greater-than or equal-to the threshold value. And a low-going threshold ** asserts an event state when the reading is less-than or equal-to the ** threshold value. ** ** The PosThdHysteresis and NegThdHysteresis factor into when the deassertion ** events occur. A high-going threshold must have the reading drop to a ** value that is less than PosThdHysteresis below the threshold value in ** order for the deassertion event to occur. A low-going threshold must have ** the reading rise to a value that is greater than NegThdHysteresis above the ** threshold to become deasserted. ** ** Note that a zero hysteresis value still leads to a difference between where ** the deassertion events occur. An event cannot be in the asserted and ** deasserted states simultaneously. Thus, for zero hysteresis a high-going ** threshold event becomes asserted when the reading is greater-than or ** equal-to the threshold, and becomes deasserted when the reading goes ** less-than the threshold. A low-going threshold event becomes asserted when ** the reading goes less-than or equal-to the threshold, and becomes deasserted ** when the reading goes greater-than the threshold.*/ typedef struct { SaHpiSensorReadingT LowCritical; /* Lower Critical Threshold */ SaHpiSensorReadingT LowMajor; /* Lower Major Threshold */ SaHpiSensorReadingT LowMinor; /* Lower Minor Threshold */ SaHpiSensorReadingT UpCritical; /* Upper critical Threshold */ SaHpiSensorReadingT UpMajor; /* Upper major Threshold */ SaHpiSensorReadingT UpMinor; /* Upper minor Threshold */ SaHpiSensorReadingT PosThdHysteresis; /* Positive Threshold Hysteresis */ SaHpiSensorReadingT NegThdHysteresis; /* Negative Threshold Hysteresis */ }SaHpiSensorThresholdsT; /******************************************************************************* ******************************************************************************** ********** ********** ********** Sensor Resource Data Records ********** ********** ********** ******************************************************************************** *******************************************************************************/ /* ** Sensor Range ** Sensor range values can include minimum, maximum, normal minimum, normal ** maximum, and nominal values. ** ** Sensor thresholds cannot be set outside of the range defined by SAHPI_SRF_MIN ** through SAHPI_SRF_MAX, if these limits are present (as indicated by the ** SaHpiSensorRangeFlagsT). If the MIN limit is not present, no lower bound ** is enforced on Sensor thresholds. If the MAX limit is not present, no ** upper bound is enforced on Sensor thresholds. */ typedef SaHpiUint8T SaHpiSensorRangeFlagsT; #define SAHPI_SRF_MIN (SaHpiSensorRangeFlagsT)0x10 #define SAHPI_SRF_MAX (SaHpiSensorRangeFlagsT)0x08 #define SAHPI_SRF_NORMAL_MIN (SaHpiSensorRangeFlagsT)0x04 #define SAHPI_SRF_NORMAL_MAX (SaHpiSensorRangeFlagsT)0x02 #define SAHPI_SRF_NOMINAL (SaHpiSensorRangeFlagsT)0x01 typedef struct { SaHpiSensorRangeFlagsT Flags; SaHpiSensorReadingT Max; SaHpiSensorReadingT Min; SaHpiSensorReadingT Nominal; SaHpiSensorReadingT NormalMax; SaHpiSensorReadingT NormalMin; } SaHpiSensorRangeT; /* ** Sensor Units ** This is a list of all the Sensor units supported by HPI. ** Future versions of this specification may add new Sensor units as required. ** Legacy HPI Users should consider these new units 'valid but unknown' ** even if the value is greater than SAHPI_SU_MAX_VALID. */ typedef enum { SAHPI_SU_UNSPECIFIED = 0, SAHPI_SU_DEGREES_C, SAHPI_SU_DEGREES_F, SAHPI_SU_DEGREES_K, SAHPI_SU_VOLTS, SAHPI_SU_AMPS, SAHPI_SU_WATTS, SAHPI_SU_JOULES, SAHPI_SU_COULOMBS, SAHPI_SU_VA, SAHPI_SU_NITS, SAHPI_SU_LUMEN, SAHPI_SU_LUX, SAHPI_SU_CANDELA, SAHPI_SU_KPA, SAHPI_SU_PSI, SAHPI_SU_NEWTON, SAHPI_SU_CFM, SAHPI_SU_RPM, SAHPI_SU_HZ, SAHPI_SU_MICROSECOND, SAHPI_SU_MILLISECOND, SAHPI_SU_SECOND, SAHPI_SU_MINUTE, SAHPI_SU_HOUR, SAHPI_SU_DAY, SAHPI_SU_WEEK, SAHPI_SU_MIL, SAHPI_SU_INCHES, SAHPI_SU_FEET, SAHPI_SU_CU_IN, SAHPI_SU_CU_FEET, SAHPI_SU_MM, SAHPI_SU_CM, SAHPI_SU_M, SAHPI_SU_CU_CM, SAHPI_SU_CU_M, SAHPI_SU_LITERS, SAHPI_SU_FLUID_OUNCE, SAHPI_SU_RADIANS, SAHPI_SU_STERADIANS, SAHPI_SU_REVOLUTIONS, SAHPI_SU_CYCLES, SAHPI_SU_GRAVITIES, SAHPI_SU_OUNCE, SAHPI_SU_POUND, SAHPI_SU_FT_LB, SAHPI_SU_OZ_IN, SAHPI_SU_GAUSS, SAHPI_SU_GILBERTS, SAHPI_SU_HENRY, SAHPI_SU_MILLIHENRY, SAHPI_SU_FARAD, SAHPI_SU_MICROFARAD, SAHPI_SU_OHMS, SAHPI_SU_SIEMENS, SAHPI_SU_MOLE, SAHPI_SU_BECQUEREL, SAHPI_SU_PPM, SAHPI_SU_RESERVED, SAHPI_SU_DECIBELS, SAHPI_SU_DBA, SAHPI_SU_DBC, SAHPI_SU_GRAY, SAHPI_SU_SIEVERT, SAHPI_SU_COLOR_TEMP_DEG_K, SAHPI_SU_BIT, SAHPI_SU_KILOBIT, SAHPI_SU_MEGABIT, SAHPI_SU_GIGABIT, SAHPI_SU_BYTE, SAHPI_SU_KILOBYTE, SAHPI_SU_MEGABYTE, SAHPI_SU_GIGABYTE, SAHPI_SU_WORD, SAHPI_SU_DWORD, SAHPI_SU_QWORD, SAHPI_SU_LINE, SAHPI_SU_HIT, SAHPI_SU_MISS, SAHPI_SU_RETRY, SAHPI_SU_RESET, SAHPI_SU_OVERRUN, SAHPI_SU_UNDERRUN, SAHPI_SU_COLLISION, SAHPI_SU_PACKETS, SAHPI_SU_MESSAGES, SAHPI_SU_CHARACTERS, SAHPI_SU_ERRORS, SAHPI_SU_CORRECTABLE_ERRORS, SAHPI_SU_UNCORRECTABLE_ERRORS, SAHPI_SU_MAX_VALID = SAHPI_SU_UNCORRECTABLE_ERRORS } SaHpiSensorUnitsT; /* ** Modifier Unit Use ** This type defines how the modifier unit is used. For example: base unit == ** meter, modifier unit == seconds, and modifier unit use == ** SAHPI_SMUU_BASIC_OVER_MODIFIER. The resulting unit would be meters per ** second. */ typedef enum { SAHPI_SMUU_NONE = 0, SAHPI_SMUU_BASIC_OVER_MODIFIER, /* Basic Unit / Modifier Unit */ SAHPI_SMUU_BASIC_TIMES_MODIFIER, /* Basic Unit * Modifier Unit */ SAHPI_SMUU_MAX_VALID = SAHPI_SMUU_BASIC_TIMES_MODIFIER } SaHpiSensorModUnitUseT; /* ** Data Format ** When IsSupported is False, the Sensor does not support data readings ** (it only supports event states). A False setting for this flag ** indicates that the rest of the structure is not meaningful. ** ** This structure encapsulates all of the various types that make up the ** definition of Sensor data. For reading type of ** SAHPI_SENSOR_READING_TYPE_BUFFER, the rest of the structure ** (beyond ReadingType) is not meaningful. ** ** The Accuracy Factor is expressed as a floating point percentage ** (e.g. 0.05 = 5%) and represents statistically how close the measured ** reading is to the actual value. It is an interpreted value that ** figures in all Sensor accuracies, resolutions, and tolerances. */ typedef struct { SaHpiBoolT IsSupported; /* Indicates if Sensor data readings are supported.*/ SaHpiSensorReadingTypeT ReadingType; /* Type of value for Sensor reading. */ SaHpiSensorUnitsT BaseUnits; /* Base units (meters, etc.) */ SaHpiSensorUnitsT ModifierUnits; /* Modifier unit (second, etc.)*/ SaHpiSensorModUnitUseT ModifierUse; /* Modifier use(m/sec, etc.) */ SaHpiBoolT Percentage; /* Is value a percentage */ SaHpiSensorRangeT Range; /* Valid range of Sensor */ SaHpiFloat64T AccuracyFactor; /* Accuracy */ } SaHpiSensorDataFormatT; /* ** Threshold Support ** ** These types define what threshold values are readable and writable. ** Thresholds are read/written in the same ReadingType as is used for Sensor ** readings. */ typedef SaHpiUint8T SaHpiSensorThdMaskT; #define SAHPI_STM_LOW_MINOR (SaHpiSensorThdMaskT)0x01 #define SAHPI_STM_LOW_MAJOR (SaHpiSensorThdMaskT)0x02 #define SAHPI_STM_LOW_CRIT (SaHpiSensorThdMaskT)0x04 #define SAHPI_STM_UP_MINOR (SaHpiSensorThdMaskT)0x08 #define SAHPI_STM_UP_MAJOR (SaHpiSensorThdMaskT)0x10 #define SAHPI_STM_UP_CRIT (SaHpiSensorThdMaskT)0x20 #define SAHPI_STM_UP_HYSTERESIS (SaHpiSensorThdMaskT)0x40 #define SAHPI_STM_LOW_HYSTERESIS (SaHpiSensorThdMaskT)0x80 typedef struct { SaHpiBoolT IsAccessible; /* True if the Sensor supports readable or writable thresholds. If False, rest of structure is not meaningful. Sensors that have the IsAccessible flag set to True must also support the threshold event category. A Sensor of reading type SAHPI_ SENSOR_READING_TYPE_BUFFER cannot have accessible thresholds.*/ SaHpiSensorThdMaskT ReadThold; /* Readable thresholds */ SaHpiSensorThdMaskT WriteThold; /* Writable thresholds */ SaHpiBoolT Nonlinear; /* If this flag is set to True, hysteresis values are calculated at the nominal Sensor value. */ } SaHpiSensorThdDefnT; /* ** Event Control ** ** This type defines how Sensor event messages can be controlled (can be turned ** off and on for each type of event, etc.). */ typedef enum { SAHPI_SEC_PER_EVENT = 0, /* Event message control per event, or by entire Sensor; Sensor event enable status can be changed, and assert/deassert masks can be changed */ SAHPI_SEC_READ_ONLY_MASKS, /* Control for entire Sensor only; Sensor event enable status can be changed, but assert/deassert masks cannot be changed */ SAHPI_SEC_READ_ONLY, /* Event control not supported; Sensor event enable status cannot be changed and assert/deassert masks cannot be changed */ SAHPI_SEC_MAX_VALID = SAHPI_SEC_READ_ONLY } SaHpiSensorEventCtrlT; /* ** Record ** ** This is the Sensor resource data record which describes all of the static ** data associated with a Sensor. */ typedef struct { SaHpiSensorNumT Num; /* Sensor Number/Index */ SaHpiSensorTypeT Type; /* General Sensor Type */ SaHpiEventCategoryT Category; /* Event category */ SaHpiBoolT EnableCtrl; /* True if HPI User can enable or disable Sensor via saHpiSensorEnableSet() */ SaHpiSensorEventCtrlT EventCtrl; /* How events can be controlled */ SaHpiEventStateT Events; /* Bit mask of event states supported */ SaHpiSensorDataFormatT DataFormat; /* Format of the data */ SaHpiSensorThdDefnT ThresholdDefn; /* Threshold Definition */ SaHpiUint32T Oem; /* Reserved for OEM use */ } SaHpiSensorRecT; /******************************************************************************* ******************************************************************************** ********** ********** ********** Aggregate Status ********** ********** ********** ******************************************************************************** *******************************************************************************/ /* These are the default Sensor numbers for aggregate status. */ #define SAHPI_DEFAGSENS_OPER (SaHpiSensorNumT)0x00000100 #define SAHPI_DEFAGSENS_PWR (SaHpiSensorNumT)0x00000101 #define SAHPI_DEFAGSENS_TEMP (SaHpiSensorNumT)0x00000102 /* The following specifies the named range for aggregate status. */ #define SAHPI_DEFAGSENS_MIN (SaHpiSensorNumT)0x00000100 #define SAHPI_DEFAGSENS_MAX (SaHpiSensorNumT)0x0000010F /******************************************************************************* ******************************************************************************** ********** ********** ********** Controls ********** ********** ********** ******************************************************************************** *******************************************************************************/ /* Control Number */ typedef SaHpiInstrumentIdT SaHpiCtrlNumT; /* ** Type of Control ** ** This enumerated type defines the different types of generic Controls. ** Future versions of this specification may add new Control types to this ** enumerated type. Legacy HPI Users should consider these new Control types ** 'valid but unknown' and should not attempt to interpret the resource data ** records or Control states of such Controls. This applies even if the ** value is greater than SAHPI_CTRL_TYPE_MAX_VALID. */ typedef enum { SAHPI_CTRL_TYPE_DIGITAL = 0x00, SAHPI_CTRL_TYPE_DISCRETE, SAHPI_CTRL_TYPE_ANALOG, SAHPI_CTRL_TYPE_STREAM, SAHPI_CTRL_TYPE_TEXT, SAHPI_CTRL_TYPE_OEM = 0xC0, SAHPI_CTRL_TYPE_MAX_VALID = SAHPI_CTRL_TYPE_OEM } SaHpiCtrlTypeT; /* ** Control State Type Definitions */ /* ** Digital Control State Definition ** ** Defines the types of digital Control states. ** Any of the four states may be set using saHpiControlSet(). ** Only ON or OFF are appropriate returns from saHpiControlGet(). ** (PULSE_ON and PULSE_OFF are transitory and end in OFF and ON states, ** respectively.) ** OFF - the Control is off ** ON - the Control is on ** PULSE_OFF - the Control is briefly turned off, and then turned back on ** PULSE_ON - the Control is briefly turned on, and then turned back off ** */ typedef enum { SAHPI_CTRL_STATE_OFF = 0, SAHPI_CTRL_STATE_ON, SAHPI_CTRL_STATE_PULSE_OFF, SAHPI_CTRL_STATE_PULSE_ON, SAHPI_CTRL_STATE_MAX_VALID = SAHPI_CTRL_STATE_PULSE_ON } SaHpiCtrlStateDigitalT; /* ** Discrete Control State Definition */ typedef SaHpiUint32T SaHpiCtrlStateDiscreteT; /* ** Analog Control State Definition */ typedef SaHpiInt32T SaHpiCtrlStateAnalogT; /* ** Stream Control State Definition */ #define SAHPI_CTRL_MAX_STREAM_LENGTH 4 typedef struct { SaHpiBoolT Repeat; /* Repeat flag */ SaHpiUint32T StreamLength; /* Length of the data, in bytes, stored in the stream. */ SaHpiUint8T Stream[SAHPI_CTRL_MAX_STREAM_LENGTH]; } SaHpiCtrlStateStreamT; /* ** Text Control State Definition */ typedef SaHpiUint8T SaHpiTxtLineNumT; /* Reserved number for sending output to all lines */ #define SAHPI_TLN_ALL_LINES (SaHpiTxtLineNumT)0x00 typedef struct { SaHpiTxtLineNumT Line; /* Operate on line # */ SaHpiTextBufferT Text; /* Text to display */ } SaHpiCtrlStateTextT; /* ** OEM Control State Definition */ #define SAHPI_CTRL_MAX_OEM_BODY_LENGTH 255 typedef struct { SaHpiManufacturerIdT MId; SaHpiUint8T BodyLength; SaHpiUint8T Body[SAHPI_CTRL_MAX_OEM_BODY_LENGTH]; /* OEM Specific */ } SaHpiCtrlStateOemT; typedef union { SaHpiCtrlStateDigitalT Digital; SaHpiCtrlStateDiscreteT Discrete; SaHpiCtrlStateAnalogT Analog; SaHpiCtrlStateStreamT Stream; SaHpiCtrlStateTextT Text; SaHpiCtrlStateOemT Oem; } SaHpiCtrlStateUnionT; typedef struct { SaHpiCtrlTypeT Type; /* Type of Control */ SaHpiCtrlStateUnionT StateUnion; /* Data for Control type */ } SaHpiCtrlStateT; /* ** Control Mode Type Definition ** ** Controls may be in either AUTO mode or MANUAL mode. ** */ typedef enum { SAHPI_CTRL_MODE_AUTO, SAHPI_CTRL_MODE_MANUAL, SAHPI_CTRL_MODE_MAX_VALID = SAHPI_CTRL_MODE_MANUAL } SaHpiCtrlModeT; /******************************************************************************* ******************************************************************************** ********** ********** ********** Control Resource Data Records ********** ********** ********** ******************************************************************************** *******************************************************************************/ /* ** Output Type ** ** This enumeration defines the Control's output. ** Future versions of this specification may add new Control output types to ** this enumerated type. Legacy HPI Users should consider these new types ** 'valid but unknown'even if the value is greater than ** SAHPI_CTRL_OUTPUT_TYPE_MAX_VALID. */ typedef enum { SAHPI_CTRL_GENERIC = 0, SAHPI_CTRL_LED, SAHPI_CTRL_FAN_SPEED, SAHPI_CTRL_DRY_CONTACT_CLOSURE, SAHPI_CTRL_POWER_SUPPLY_INHIBIT, SAHPI_CTRL_AUDIBLE, SAHPI_CTRL_FRONT_PANEL_LOCKOUT, SAHPI_CTRL_POWER_INTERLOCK, SAHPI_CTRL_POWER_STATE, SAHPI_CTRL_LCD_DISPLAY, SAHPI_CTRL_OEM, SAHPI_CTRL_GENERIC_ADDRESS, SAHPI_CTRL_IP_ADDRESS, SAHPI_CTRL_RESOURCE_ID, SAHPI_CTRL_POWER_BUDGET, SAHPI_CTRL_ACTIVATE, SAHPI_CTRL_RESET, SAHPI_CTRL_OUTPUT_TYPE_MAX_VALID = SAHPI_CTRL_RESET } SaHpiCtrlOutputTypeT; /* ** Specific Record Types ** These types represent the specific types of Control resource data records. */ typedef struct { SaHpiCtrlStateDigitalT Default; } SaHpiCtrlRecDigitalT; typedef struct { SaHpiCtrlStateDiscreteT Default; } SaHpiCtrlRecDiscreteT; typedef struct { SaHpiCtrlStateAnalogT Min; /* Minimum Value */ SaHpiCtrlStateAnalogT Max; /* Maximum Value */ SaHpiCtrlStateAnalogT Default; } SaHpiCtrlRecAnalogT; typedef struct { SaHpiCtrlStateStreamT Default; } SaHpiCtrlRecStreamT; typedef struct { SaHpiUint8T MaxChars; /* Maximum chars per line. If the Control DataType is SAHPI_TL_TYPE_UNICODE, there are two bytes required for each character. This field reports the number of characters per line- not the number of bytes. MaxChars must not be larger than the number of characters that can be placed in a single SaHpiTextBufferT structure. */ SaHpiUint8T MaxLines; /* Maximum # of lines */ SaHpiLanguageT Language; /* Language Code */ SaHpiTextTypeT DataType; /* Permitted Data */ SaHpiCtrlStateTextT Default; } SaHpiCtrlRecTextT; #define SAHPI_CTRL_OEM_CONFIG_LENGTH 10 typedef struct { SaHpiManufacturerIdT MId; SaHpiUint8T ConfigData[SAHPI_CTRL_OEM_CONFIG_LENGTH]; SaHpiCtrlStateOemT Default; } SaHpiCtrlRecOemT; typedef union { SaHpiCtrlRecDigitalT Digital; SaHpiCtrlRecDiscreteT Discrete; SaHpiCtrlRecAnalogT Analog; SaHpiCtrlRecStreamT Stream; SaHpiCtrlRecTextT Text; SaHpiCtrlRecOemT Oem; } SaHpiCtrlRecUnionT; /* ** Default Control Mode Structure ** This structure tells an HPI User if the Control comes up in Auto mode or ** in Manual mode, by default. It also indicates if the mode can be ** changed (using saHpiControlSet()). When ReadOnly is False, the mode ** can be changed from its default setting; otherwise attempting to ** change the mode results in an error. */ typedef struct { SaHpiCtrlModeT Mode; /* Auto or Manual */ SaHpiBoolT ReadOnly; /* Indicates if mode is read-only */ } SaHpiCtrlDefaultModeT; /* ** Record Definition ** Definition of the Control resource data record. */ typedef struct { SaHpiCtrlNumT Num; /* Control Number/Index */ SaHpiCtrlOutputTypeT OutputType; SaHpiCtrlTypeT Type; /* Type of Control */ SaHpiCtrlRecUnionT TypeUnion; /* Specific Control record */ SaHpiCtrlDefaultModeT DefaultMode; /*Indicates if the Control comes up in Auto or Manual mode. */ SaHpiBoolT WriteOnly; /* Indicates if the Control is write-only. */ SaHpiUint32T Oem; /* Reserved for OEM use */ } SaHpiCtrlRecT; /******************************************************************************* ******************************************************************************** ********** ********** ********** Inventory Data Repositories ********** ********** ********** ******************************************************************************** *******************************************************************************/ /* ** These structures are used to read and write inventory data to entity ** Inventory Data Repositories within a resource. */ /* ** Inventory Data Repository ID ** Identifier for an Inventory Data Repository. */ typedef SaHpiInstrumentIdT SaHpiIdrIdT; #define SAHPI_DEFAULT_INVENTORY_ID (SaHpiIdrIdT)0x00000000 /* Inventory Data Area type definitions ** Future versions of this specification may add new area types to ** this enumerated type. Legacy HPI Users should consider these new types ** 'valid but unknown'even if the value is greater than ** SAHPI_IDR_AREATYPE_MAX_VALID. */ typedef enum { SAHPI_IDR_AREATYPE_INTERNAL_USE = 0xB0, SAHPI_IDR_AREATYPE_CHASSIS_INFO, SAHPI_IDR_AREATYPE_BOARD_INFO, SAHPI_IDR_AREATYPE_PRODUCT_INFO, SAHPI_IDR_AREATYPE_OEM = 0xC0, SAHPI_IDR_AREATYPE_UNSPECIFIED = 0xFF, SAHPI_IDR_AREATYPE_MAX_VALID = SAHPI_IDR_AREATYPE_UNSPECIFIED } SaHpiIdrAreaTypeT; /* Inventory Data Field type definitions ** Future versions of this specification may add new field types to ** this enumerated type. Legacy HPI Users should consider these new types ** 'valid but unknown'even if the value is greater than ** SAHPI_IDR_FIELDTYPE_MAX_VALID. */ typedef enum { SAHPI_IDR_FIELDTYPE_CHASSIS_TYPE, SAHPI_IDR_FIELDTYPE_MFG_DATETIME, SAHPI_IDR_FIELDTYPE_MANUFACTURER, SAHPI_IDR_FIELDTYPE_PRODUCT_NAME, SAHPI_IDR_FIELDTYPE_PRODUCT_VERSION, SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER, SAHPI_IDR_FIELDTYPE_PART_NUMBER, SAHPI_IDR_FIELDTYPE_FILE_ID, SAHPI_IDR_FIELDTYPE_ASSET_TAG, SAHPI_IDR_FIELDTYPE_CUSTOM, SAHPI_IDR_FIELDTYPE_UNSPECIFIED = 0xFF, SAHPI_IDR_FIELDTYPE_MAX_VALID = SAHPI_IDR_FIELDTYPE_UNSPECIFIED } SaHpiIdrFieldTypeT; /* Inventory Data Field structure definition */ typedef struct { SaHpiEntryIdT AreaId; /* AreaId for the IDA to which */ /* the Field belongs */ SaHpiEntryIdT FieldId; /* Field Identifier */ SaHpiIdrFieldTypeT Type; /* Field Type */ SaHpiBoolT ReadOnly; /* Describes if a field is read-only. */ SaHpiTextBufferT Field; /* Field Data */ } SaHpiIdrFieldT; /* Inventory Data Area header structure definition */ typedef struct { SaHpiEntryIdT AreaId; /* Area Identifier */ SaHpiIdrAreaTypeT Type; /* Type of area */ SaHpiBoolT ReadOnly; /* Describes if an area is read-only. */ SaHpiUint32T NumFields; /* Number of Fields contained in Area */ } SaHpiIdrAreaHeaderT; /* Inventory Data Repository Information structure definition */ typedef struct { SaHpiIdrIdT IdrId; /* Repository Identifier */ SaHpiUint32T UpdateCount; /* The count is incremented any time the */ /* IDR is changed. It rolls over to zero */ /* when the maximum value is reached */ SaHpiBoolT ReadOnly; /* Describes if the IDR is read-only. */ SaHpiUint32T NumAreas; /* Number of Areas contained in IDR */ } SaHpiIdrInfoT; /******************************************************************************* ******************************************************************************** ********** ********** ********** Inventory Data Repository Resource Data Records ********** ********** ********** ******************************************************************************** *******************************************************************************/ /* ** All inventory data contained in an Inventory Data Repository ** must be represented in the RDR repository ** with an SaHpiInventoryRecT. */ typedef struct { SaHpiIdrIdT IdrId; SaHpiBoolT Persistent; /* True indicates that updates to IDR are automatically and immediately persisted. False indicates that updates are not immediately persisted; but optionally may be persisted via saHpiParmControl() function, as defined in implementation documentation.*/ SaHpiUint32T Oem; } SaHpiInventoryRecT; /******************************************************************************* ******************************************************************************** ********** ********** ********** Watchdogs ********** ********** ********** ******************************************************************************** *******************************************************************************/ /* ** This section defines all of the data types associated with Watchdog Timers. */ /* Watchdog Number - Identifier for a Watchdog Timer. */ typedef SaHpiInstrumentIdT SaHpiWatchdogNumT; #define SAHPI_DEFAULT_WATCHDOG_NUM (SaHpiWatchdogNumT)0x00000000 /* ** Watchdog Timer Action ** ** These enumerations represent the possible actions to be taken upon Watchdog ** Timer timeout and the events that are generated for Watchdog actions. */ typedef enum { SAHPI_WA_NO_ACTION = 0, SAHPI_WA_RESET, SAHPI_WA_POWER_DOWN, SAHPI_WA_POWER_CYCLE, SAHPI_WA_MAX_VALID = SAHPI_WA_POWER_CYCLE } SaHpiWatchdogActionT; typedef enum { SAHPI_WAE_NO_ACTION = 0, SAHPI_WAE_RESET, SAHPI_WAE_POWER_DOWN, SAHPI_WAE_POWER_CYCLE, SAHPI_WAE_TIMER_INT=0x08, /* Used if Timer Preinterrupt only */ SAHPI_WAE_MAX_VALID = SAHPI_WAE_TIMER_INT } SaHpiWatchdogActionEventT; /* ** Watchdog Pre-timer Interrupt ** ** These enumerations represent the possible types of interrupts that may be ** triggered by a Watchdog pre-timer event. The actual meaning of these ** operations may differ depending on the hardware architecture. */ typedef enum { SAHPI_WPI_NONE = 0, SAHPI_WPI_SMI, SAHPI_WPI_NMI, SAHPI_WPI_MESSAGE_INTERRUPT, SAHPI_WPI_OEM = 0x0F, SAHPI_WPI_MAX_VALID = SAHPI_WPI_OEM } SaHpiWatchdogPretimerInterruptT; /* ** Watchdog Timer Use ** ** These enumerations represent the possible Watchdog users that may have caused ** the Watchdog to expire. For instance, if a Watchdog is used during power ** on self test (POST), and it expires, the SAHPI_WTU_BIOS_POST expiration type ** is set. Most specific uses for Watchdog timer by users of HPI should ** indicate SAHPI_WTU_SMS_OS if the use is to provide an OS-healthy heartbeat, ** or SAHPI_WTU_OEM if it is used for some other purpose. */ typedef enum { SAHPI_WTU_NONE = 0, SAHPI_WTU_BIOS_FRB2, SAHPI_WTU_BIOS_POST, SAHPI_WTU_OS_LOAD, SAHPI_WTU_SMS_OS, /* System Management System providing heartbeat for OS */ SAHPI_WTU_OEM, SAHPI_WTU_UNSPECIFIED = 0x0F, SAHPI_WTU_MAX_VALID = SAHPI_WTU_UNSPECIFIED } SaHpiWatchdogTimerUseT; /* ** Timer Use Expiration Flags ** These values are used for the Watchdog Timer Use Expiration flags in the ** SaHpiWatchdogT structure. */ typedef SaHpiUint8T SaHpiWatchdogExpFlagsT; #define SAHPI_WATCHDOG_EXP_BIOS_FRB2 (SaHpiWatchdogExpFlagsT)0x02 #define SAHPI_WATCHDOG_EXP_BIOS_POST (SaHpiWatchdogExpFlagsT)0x04 #define SAHPI_WATCHDOG_EXP_OS_LOAD (SaHpiWatchdogExpFlagsT)0x08 #define SAHPI_WATCHDOG_EXP_SMS_OS (SaHpiWatchdogExpFlagsT)0x10 #define SAHPI_WATCHDOG_EXP_OEM (SaHpiWatchdogExpFlagsT)0x20 /* ** Watchdog Structure ** ** This structure is used by the saHpiWatchdogTimerGet() and ** saHpiWatchdogTimerSet() functions. The use of the structure varies slightly ** by each function. ** ** For saHpiWatchdogTimerGet() : ** ** Log - indicates whether the Watchdog is configured to ** issue events. True=events are generated. ** Running - indicates whether the Watchdog is currently ** running or stopped. True=Watchdog is running. ** TimerUse - indicates the current use of the timer; one of the ** enumerated preset uses which was included on the last ** saHpiWatchdogTimerSet() function call, or through some ** other implementation-dependent means to start the ** Watchdog timer. ** TimerAction - indicates what action will be taken when the Watchdog ** times out. ** PretimerInterrupt - indicates which action will be taken ** "PreTimeoutInterval" milliseconds prior to Watchdog ** timer expiration. ** PreTimeoutInterval - indicates how many milliseconds prior to timer time ** out the PretimerInterrupt action will be taken. If ** "PreTimeoutInterval" = 0, the PretimerInterrupt action ** occurs concurrently with "TimerAction." HPI ** implementations may not be able to support millisecond ** resolution, and because of this may have rounded the ** set value to whatever resolution could be supported. ** The HPI implementation returns this rounded value. ** TimerUseExpFlags - set of five bit flags which indicate that a Watchdog ** timer timeout has occurred while the corresponding ** TimerUse value was set. Once set, these flags stay ** set until specifically cleared with a ** saHpiWatchdogTimerSet() call, or by some other ** implementation-dependent means. ** InitialCount - The time, in milliseconds, before the timer will time ** out after the Watchdog is started/restarted, or some ** other implementation-dependent strobe is ** sent to the Watchdog. HPI implementations may not be ** able to support millisecond resolution, and because ** of this may have rounded the set value to whatever ** resolution could be supported. The HPI implementation ** returns this rounded value. ** PresentCount - The remaining time in milliseconds before the timer ** times out unless an saHpiWatchdogTimerReset() ** function call is made, or some other implementation- ** dependent strobe is sent to the Watchdog. ** HPI implementations may not be able to support ** millisecond resolution on Watchdog Timers, but ** returns the number of clock ticks remaining times the ** number of milliseconds between each tick. ** ** For saHpiWatchdogTimerSet(): ** ** Log - indicates whether the Watchdog should issue ** events. True=events are generated. ** Running - indicates whether the Watchdog should be ** stopped before updating. ** True = Watchdog is not stopped. If it is ** already stopped, it remains stopped, ** but if it is running, it continues ** to run, with the countown timer reset ** to the new InitialCount. Note that ** there is a race condition possible ** with this setting, so it should be used ** with care. ** False = Watchdog is stopped. After ** saHpiWatchdogTimerSet() is called, a ** subsequent call to ** saHpiWatchdogTimerReset() is required ** to start the timer. ** TimerUse - indicates the current use of the timer. Controls ** which TimerUseExpFlag will be set if the timer ** expires. ** TimerAction - indicates what action will be taken when the Watchdog ** times out. ** PretimerInterrupt - indicates which action will be taken ** "PreTimeoutInterval" milliseconds prior to Watchdog ** timer expiration. ** PreTimeoutInterval - indicates how many milliseconds prior to timer time ** out the PretimerInterrupt action will be taken. If ** "PreTimeoutInterval" = 0, the PretimerInterrupt action ** occurs concurrently with "TimerAction." HPI ** implementations may not be able to support millisecond ** resolution and may have a maximum value restriction. ** These restrictions should be documented by the ** provider of the HPI interface. ** TimerUseExpFlags - Set of five bit flags corresponding to the five ** TimerUse values. For each bit set to "1", the ** corresponding Timer Use Expiration Flag is cleared, ** that is, set to "0". Generally, a program should only ** clear the Timer Use Expiration Flag corresponding to ** its own TimerUse, so that other software, which may ** have used the timer for another purpose in the past ** can still read its TimerUseExpFlag to determine ** whether the timer expired during that use. ** InitialCount - The time, in milliseconds, before the timer will time ** out after an saHpiWatchdogTimerReset() function call is ** made, or some other implementation-dependent strobe is ** sent to the Watchdog. HPI implementations may not be ** able to support millisecond resolution and may have a ** maximum value restriction. These restrictions should ** be documented by the provider of the HPI interface. ** PresentCount - Not used on saHpiWatchdogTimerSet() function. Ignored. ** */ typedef struct { SaHpiBoolT Log; SaHpiBoolT Running; SaHpiWatchdogTimerUseT TimerUse; SaHpiWatchdogActionT TimerAction; SaHpiWatchdogPretimerInterruptT PretimerInterrupt; SaHpiUint32T PreTimeoutInterval; SaHpiWatchdogExpFlagsT TimerUseExpFlags; SaHpiUint32T InitialCount; SaHpiUint32T PresentCount; } SaHpiWatchdogT; /******************************************************************************* ******************************************************************************** ********** ********** ********** Watchdog Resource Data Records ********** ********** ********** ******************************************************************************** *******************************************************************************/ /* ** When the "Watchdog" capability is set in a resource, a Watchdog with an ** identifier of SAHPI_DEFAULT_WATCHDOG_NUM is required. All Watchdogs must be ** represented in the RDR repository with an SaHpiWatchdogRecT, including the ** Watchdog with an identifier of SAHPI_DEFAULT_WATCHDOG_NUM. */ typedef struct { SaHpiWatchdogNumT WatchdogNum; SaHpiUint32T Oem; } SaHpiWatchdogRecT; /******************************************************************************* ******************************************************************************** ********** ********** ********** DIMI ********** ********** ********** ******************************************************************************** *******************************************************************************/ /* ** This section defines all of the data types associated with a DIMI */ /* DIMI Number - numeric identifier for a DIMI */ typedef SaHpiInstrumentIdT SaHpiDimiNumT; /* ** Test Service Impact Levels */ typedef enum { SAHPI_DIMITEST_NONDEGRADING, SAHPI_DIMITEST_DEGRADING, SAHPI_DIMITEST_VENDOR_DEFINED_LEVEL, /* VENDOR_DEFINED_LEVEL can be used to indicate severity of degrading test */ SAHPI_DIMITEST_SERVICE_IMPACT_MAX_VALID = SAHPI_DIMITEST_VENDOR_DEFINED_LEVEL } SaHpiDimiTestServiceImpactT; /* A test may affect the entity corresponding to DIMI it runs on. The same test ** may also affect other entities as well. This stuct defines the entity path & ** the service impact (as defined by SaHpiDimiTestServiceImpactT) on that ** affected entity. */ typedef struct { SaHpiEntityPathT EntityImpacted; /* Entity path of impacted entity */ SaHpiDimiTestServiceImpactT ServiceImpact; /* Service Impact on affected entity */ } SaHpiDimiTestAffectedEntityT; typedef enum { SAHPI_DIMITEST_STATUS_NOT_RUN, /* Only returned if test has never been executed on the DIMI */ SAHPI_DIMITEST_STATUS_FINISHED_NO_ERRORS, /* Test is not running. Last run finished without any errors */ SAHPI_DIMITEST_STATUS_FINISHED_ERRORS, /* Test is not running. But the last run finished with error */ SAHPI_DIMITEST_STATUS_CANCELED, /* This is returned when a test has canceled using the saHpiDimiTestCancel() function */ SAHPI_DIMITEST_STATUS_RUNNING, /* This is returned when a test is in progress */ SAHPI_DIMITEST_STATUS_MAX_VALID = SAHPI_DIMITEST_STATUS_RUNNING } SaHpiDimiTestRunStatusT; /* Error codes that can be generated by a test ** Future versions of this specification may add new error codes to ** this enumerated type. Legacy HPI Users should consider these new values ** undefined errors even if the value is greater than ** SAHPI_DIMITEST_STATUSERR_MAX_VALID. */ typedef enum { SAHPI_DIMITEST_STATUSERR_NOERR = 0, /* No Error was generated */ SAHPI_DIMITEST_STATUSERR_RUNERR, /* Run time error was generated */ SAHPI_DIMITEST_STATUSERR_UNDEF, /* Undefined Error*/ SAHPI_DIMITEST_STATUSERR_MAX_VALID = SAHPI_DIMITEST_STATUSERR_UNDEF } SaHpiDimiTestErrCodeT; /* Test results from last run of test */ typedef struct { SaHpiTimeT ResultTimeStamp; /* TimeStamp when the results are generated. When test ends, ResultTimeStamp captures the time test ended */ SaHpiTimeoutT RunDuration; /* Implementation provides the duration from the start of last run until the time results were generated */ SaHpiDimiTestRunStatusT LastRunStatus; SaHpiDimiTestErrCodeT TestErrorCode; SaHpiTextBufferT TestResultString; /* String contains either in line Test result or URI to the file name containing results from last run */ SaHpiBoolT TestResultStringIsURI; /* True = URI to file name, False = in-line test result, If True, the DataType of the TestResultString text buffer must be SAHPI_TL_TYPE_TEXT. */ } SaHpiDimiTestResultsT; /* SaHpiDimiTestParamsDefinitionT struct defines test parameters. The test ** parameter definition consists of Parameter Name, human readable text for ** parameters information, parameters type and value (min, max, default). ** HPI User can use APIs to obtain the parameters definition along with test ** information. Based on test parameters definition a proper parameter can ** be defined and passed together with the test invocation. */ /* Possible types of parameters for a test. */ typedef enum { SAHPI_DIMITEST_PARAM_TYPE_BOOLEAN, /* HPI type SaHpiBoolT */ SAHPI_DIMITEST_PARAM_TYPE_INT32, /* HPI type SaHpiUint32T */ SAHPI_DIMITEST_PARAM_TYPE_FLOAT64, /* HPI type SaHpiFloat64T */ SAHPI_DIMITEST_PARAM_TYPE_TEXT, /* HPI type SaHpiTextBufferT */ SAHPI_DIMITEST_PARAM_TYPE_MAX_VALID = SAHPI_DIMITEST_PARAM_TYPE_TEXT } SaHpiDimiTestParamTypeT; /* This union is defining the values for the test parameter*/ typedef union { SaHpiInt32T paramint; SaHpiBoolT parambool; SaHpiFloat64T paramfloat; SaHpiTextBufferT paramtext; /* Must be DataType = SAHPI_TL_TYPE_TEXT */ } SaHpiDimiTestParamValueT; /* maximum number of possible parameters for any DIMI test */ #define SAHPI_DIMITEST_MAX_PARAMETERS 10 /* Test parameter name length */ #define SAHPI_DIMITEST_PARAM_NAME_LEN 20 typedef union { SaHpiInt32T IntValue; SaHpiFloat64T FloatValue; } SaHpiDimiTestParameterValueUnionT; typedef struct { SaHpiUint8T ParamName[SAHPI_DIMITEST_PARAM_NAME_LEN]; /* Name of the parameter, case sensitive */ SaHpiTextBufferT ParamInfo; /* This is a human readable text */ SaHpiDimiTestParamTypeT ParamType; SaHpiDimiTestParameterValueUnionT MinValue; /* Only valid for integer and float parameters */ SaHpiDimiTestParameterValueUnionT MaxValue; /* Only valid for integer and float parameters */ SaHpiDimiTestParamValueT DefaultParam; /* Default value */ } SaHpiDimiTestParamsDefinitionT; /* The following defines the standard capabilities available for DIMI tests. ** Each test in a DIMI may support any number of capabilities using the bit ** mask. If a test supports one of these capabilities then the corresponding ** bit is set in the bit mask. ** There is a close relationship between capabilities and parameters of a ** test. A test may support some standard parameters if specific capability ** bits are set. Some capabilities might not have test parameters. ** ** Future versions of the HPI specification may define additional DIMI test ** capabilities and associate them with currently undefined bit positions in ** the SaHpiDimiTestCapabilitiesT bit mask. Implementations conforming to ** this version of the HPI specification should set all undefined bit values ** to zero in the TestCapabilities field of the SaHpiDimiTestT structure. ** However, HPI Users should not assume undefined bit values are zero, to ** remain compatible with HPI implementations that implement future versions ** of the specification. ** ** SAHPI_DIMITEST_CAPABILITY_NO_CAPABILITY ** Test does not support any of the standard capabilities ** ** SAHPI_DIMITEST_CAPABILITY_LOOPCOUNT ** Test supports looping for a specified count of times. When this capability ** is set for a test the standard parameter SAHPI_DIMITEST_LOOP_COUNT_PARAM ** is also supported by the test. Loop count parameter can be configured ** loop the test n number of times. Minimum and default is 1 time so that ** test is executed at least one time. ** ** SAHPI_DIMITEST_CAPABILITY_LOOPTIME ** Test supports looping for a specified amount of time (in seconds). When ** this capability is set for a test the standard parameter ** SAHPI_DIMITEST_LOOP_TIME_PARAM is also supported by the test. ** ** SAHPI_DIMITEST_CAPABILITY_SERVICEMODE ** Test supports a basic as well as extended mode. When this capability is ** set for a test the standard parameter SAHPI_DIMITEST_SERVICE_MODE_PARAM ** is also supported by the test. ** ** SAHPI_DIMITEST_CAPABILITY_LOGGING ** Test supports logging capability. When capability is set for a test the ** standard parameter SAHPI_DIMITEST_LOGGING_PARAM is also supported ** by the test. ** ** SAHPI_DIMITEST_CAPABILITY_RESULTSOUTPUT ** Test supports FINALONLY, ONDEMAND, ASYNC results output capablilities. ** When capability is set for a test the standard parameter ** SAHPI_DIMITEST_RESULTS_OUTPUT_PARAM is also supported by the test. ** ** SAHPI_DIMITEST_CAPABILITY_TESTCANCEL ** Test supports TESTCANCEL capability. This capability has no corresponding ** test parameter. */ typedef SaHpiUint32T SaHpiDimiTestCapabilityT; #define SAHPI_DIMITEST_CAPABILITY_NO_CAPABILITY \ (SaHpiDimiTestCapabilityT)0x00000000 #define SAHPI_DIMITEST_CAPABILITY_RESULTSOUTPUT \ (SaHpiDimiTestCapabilityT)0x00000001 #define SAHPI_DIMITEST_CAPABILITY_SERVICEMODE \ (SaHpiDimiTestCapabilityT)0x00000002 #define SAHPI_DIMITEST_CAPABILITY_LOOPCOUNT \ (SaHpiDimiTestCapabilityT)0x00000004 #define SAHPI_DIMITEST_CAPABILITY_LOOPTIME \ (SaHpiDimiTestCapabilityT)0x00000008 #define SAHPI_DIMITEST_CAPABILITY_LOGGING \ (SaHpiDimiTestCapabilityT)0x00000010 #define SAHPI_DIMITEST_CAPABILITY_TESTCANCEL \ (SaHpiDimiTestCapabilityT)0x00000020 /* The following are the standard test parameters available for use with DIMI ** tests. These parameters are applicable only if the corresponding test ** capability is supported by a DIMI test. HPI User can check the capabilities ** through the bit-stream defined through SaHpiDimiTestCapabilityT. If a test ** supports certain capability, corresponding test parameter is defined in ** standard format. The parameters are defined here as macros. For tests ** supporting these parameters they are returned as type ** SaHpiDimiTestParamsDefinitionT with the SaHpiDimiTestT structure. */ #ifndef SAHPI_DIMITEST_LOOP_COUNT_PARAM #define SAHPI_DIMITEST_LOOP_COUNT_PARAM_NAME "Loop Count" #define SAHPI_DIMITEST_LOOP_COUNT_PARAM \ { \ SAHPI_DIMITEST_LOOP_COUNT_PARAM_NAME, \ { \ SAHPI_TL_TYPE_TEXT, \ SAHPI_LANG_ENGLISH, \ 15, \ "Test Loop Count" \ }, \ SAHPI_DIMITEST_PARAM_TYPE_INT32, \ 1, \ 0xFFFFFFFF, \ { 1 } \ } #endif // SAHPI_DIMITEST_LOOP_COUNT_PARAM #ifndef SAHPI_DIMITEST_LOOP_TIME_PARAM #define SAHPI_DIMITEST_LOOP_TIME_PARAM_NAME "Loop Time" #define SAHPI_DIMITEST_LOOP_TIME_PARAM \ { \ SAHPI_DIMITEST_LOOP_TIME_PARAM_NAME, \ { \ SAHPI_TL_TYPE_TEXT, \ SAHPI_LANG_ENGLISH, \ 14, \ "Test Loop Time" \ }, \ SAHPI_DIMITEST_PARAM_TYPE_INT32, \ 0, \ 0xFFFFFFFF, \ { 1 } \ } #endif // SAHPI_DIMITEST_LOOP_TIME_PARAM #ifndef SAHPI_DIMITEST_SERVICE_MODE_PARAM #define SAHPI_DIMITEST_SERVICE_MODE_PARAM_NAME "Service Mode" #define SAHPI_DIMITEST_SERVICE_MODE_PARAM { \ { \ SAHPI_DIMITEST_SERVICE_MODE_PARAM_NAME, \ { \ SAHPI_TL_TYPE_TEXT, \ SAHPI_LANG_ENGLISH, \ 14, \ "Operating Mode" \ }, \ SAHPI_DIMITEST_PARAM_TYPE_INT32, \ 0, /* basic mode */ \ 1, /* extended mode */ \ { 0 } /* default is basic mode */ \ } #endif // SAHPI_DIMITEST_SERVICE_MODE_PARAM #ifndef SAHPI_DIMITEST_LOGGING_PARAM #define SAHPI_DIMITEST_LOGGING_PARAM_NAME "Logging" #define SAHPI_DIMITEST_LOGGING_PARAM \ { \ SAHPI_DIMITEST_LOGGING_PARAM_NAME, \ { \ SAHPI_TL_TYPE_TEXT, \ SAHPI_LANG_ENGLISH, \ 18, \ "Logging Capability" \ }, \ SAHPI_DIMITEST_PARAM_TYPE_INT32, \ 0, /* No Logging */ \ 5, /* Verbose Logging*/ \ { 0 } \ } #endif // SAHPI_DIMITEST_LOGGING_PARAM /* ResultsOutputParam: Standard parameter describing the capability of a ** DIMI to output the results. ** DIMI can generate results in FINALONLY, ONDEMAND, and ASYNC enumerated ** types. */ #ifndef SAHPI_DIMITEST_RESULTS_OUTPUT_PARAM #define SAHPI_DIMITEST_CAPAB_RES_FINALONLY 0 #define SAHPI_DIMITEST_CAPAB_RES_ONDEMAND 1 #define SAHPI_DIMITEST_CAPAB_RES_ASYNC 2 #define SAHPI_DIMITEST_RESULTS_OUTPUT_PARAM_NAME "Results Output" #define SAHPI_DIMITEST_RESULTS_OUTPUT_PARAM { \ { \ SAHPI_DIMITEST_RESULTS_OUTPUT_PARAM_NAME,\ { \ SAHPI_TL_TYPE_TEXT, \ SAHPI_LANG_ENGLISH, \ 25, \ "Results Output Capability" \ }, \ SAHPI_DIMITEST_PARAM_TYPE_INT32, \ 0, \ 2, \ { 0 } \ } #endif // SAHPI_DIMITEST_RESULTS_OUTPUT_PARAM /* ** SaHpiDimiTestT */ /* DIMI test number */ typedef SaHpiUint32T SaHpiDimiTestNumT; /* Maximum number entities that can be affected by a test */ #define SAHPI_DIMITEST_MAX_ENTITIESIMPACTED 5 typedef struct { SaHpiTextBufferT TestName; SaHpiDimiTestServiceImpactT ServiceImpact; /* Service Impact on DIMI itself */ SaHpiDimiTestAffectedEntityT EntitiesImpacted[SAHPI_DIMITEST_MAX_ENTITIESIMPACTED]; /* Entities affected by the Test. If entity contains other entities then contained entities are considered affected as well. If Entities affected by Test are more than Max number, its recommended to associate test with higher level entity DIMI. */ SaHpiBoolT NeedServiceOS; /* True if a special Service OS is needed for this test */ SaHpiTextBufferT ServiceOS; /* If a special Service OS is needed to be run for the test, the HPI User is required to load the particular Service OS before running the tests, else DIMI returns an error code.*/ SaHpiTimeT ExpectedRunDuration; /* Expected run duration for a test with default parameters */ SaHpiDimiTestCapabilityT TestCapabilities; SaHpiDimiTestParamsDefinitionT TestParameters[SAHPI_DIMITEST_MAX_PARAMETERS]; } SaHpiDimiTestT; /* This struct defines the format of parameter which is passed ** to the test on invocation */ typedef struct { SaHpiUint8T ParamName[SAHPI_DIMITEST_PARAM_NAME_LEN]; /* Must exactly match the one returned by the ParamsDefinition */ SaHpiDimiTestParamTypeT ParamType; /* Must exactly match the one returned by the ParamsDefinition */ SaHpiDimiTestParamValueT Value; } SaHpiDimiTestVariableParamsT; /* Percentage of test completed. Based on DIMI test capability, Value range is 0 - 100, 0xFF returned if capability not available. */ typedef SaHpiUint8T SaHpiDimiTestPercentCompletedT; typedef enum { SAHPI_DIMI_READY, /* DIMI is in ready state to run a particular test */ SAHPI_DIMI_WRONG_STATE, /* DIMI is in the wrong state to run a particular test. For example, need to load a correct ServiceOS before this test can run */ SAHPI_DIMI_BUSY, /* DIMI cannot start a particular test at this time. User can try again later. */ SAHPI_DIMI_READY_MAX_VALID = SAHPI_DIMI_BUSY } SaHpiDimiReadyT; typedef struct { SaHpiUint32T NumberOfTests; /* It is recommended that the DIMI advertise all available tests regardless of ServiceImpact or Service OS */ SaHpiUint32T TestNumUpdateCounter; /* If number of tests change for DIMI this counter is incremented and Event is generated*/ } SaHpiDimiInfoT; /******************************************************************************* ******************************************************************************** ********** ********** ********** DIMI Resource Data Records ********** ********** ********** ******************************************************************************** *******************************************************************************/ /* ** All DIMIs must be represented in the ** RDR repository with an SaHpiDimiRecT */ typedef struct { SaHpiDimiNumT DimiNum; SaHpiUint32T Oem; /* Reserved for OEM use */ } SaHpiDimiRecT; /******************************************************************************* ******************************************************************************** ********** ********** ********** FUMI ********** ********** ********** ******************************************************************************** *******************************************************************************/ /* FUMI Number - identifier for a FUMI */ typedef SaHpiInstrumentIdT SaHpiFumiNumT; /* Bank Number in FUMI */ typedef SaHpiUint8T SaHpiBankNumT; /* ** Spec framework underlying a FUMI implementation ** ** This information can be presented in two ways: ** ** 1) If SAF recognizes underlying spec framework: ** a well-known assigned Spec Identifier and Spec ** revision (SaHpiFumiSafDefinedSpecInfoT). ** ** 2) Otherwise, an OEM defined identifier (SaHpiFumiOemDefinedSpecInfoT) */ /* ** Underlying spec framework information type */ typedef enum { SAHPI_FUMI_SPEC_INFO_NONE, SAHPI_FUMI_SPEC_INFO_SAF_DEFINED, SAHPI_FUMI_SPEC_INFO_OEM_DEFINED, SAHPI_FUMI_SPEC_INFO_MAX_VALID = SAHPI_FUMI_SPEC_INFO_OEM_DEFINED } SaHpiFumiSpecInfoTypeT; /* ** SAF-recognized underlying spec framework information */ typedef enum { SAHPI_FUMI_SPEC_HPM1 = 0, /* future revisions of HPI specification will define more constants. Legacy HPI Users should consider these 'valid but undefined' even if the value is greater than SAHPI_FUMI_SPEC_MAX_VALID. */ SAHPI_FUMI_SPEC_MAX_VALID = SAHPI_FUMI_SPEC_HPM1 } SaHpiFumiSafDefinedSpecIdT; typedef struct { SaHpiFumiSafDefinedSpecIdT SpecID; SaHpiUint32T RevisionID; } SaHpiFumiSafDefinedSpecInfoT; /* ** OEM-defined underlying spec framework information */ #define SAHPI_FUMI_MAX_OEM_BODY_LENGTH 255 typedef struct { SaHpiManufacturerIdT Mid; SaHpiUint8T BodyLength; SaHpiUint8T Body[SAHPI_FUMI_MAX_OEM_BODY_LENGTH]; } SaHpiFumiOemDefinedSpecInfoT; /* ** Underlying spec framework information */ typedef union { SaHpiFumiSafDefinedSpecInfoT SafDefined; SaHpiFumiOemDefinedSpecInfoT OemDefined; } SaHpiFumiSpecInfoTypeUnionT; typedef struct { SaHpiFumiSpecInfoTypeT SpecInfoType; SaHpiFumiSpecInfoTypeUnionT SpecInfoTypeUnion; } SaHpiFumiSpecInfoT; /* ** Firmware instance info. ** InstancePresent indicates whether the firmware instance is present or not. ** Identifier contains file name. ** Description contains the description string for the firmware instance. ** DateTime contains the firmware build date-time ** Version further identifies the firmware instance. ** Text buffers may have zero length if data is not available. ** Version field values may be 0 if version data is not available. */ typedef struct { SaHpiBoolT InstancePresent; SaHpiTextBufferT Identifier; SaHpiTextBufferT Description; SaHpiTextBufferT DateTime; SaHpiUint32T MajorVersion; SaHpiUint32T MinorVersion; SaHpiUint32T AuxVersion; } SaHpiFumiFirmwareInstanceInfoT; /* ** FUMI Service Impact Levels */ typedef enum { SAHPI_FUMI_PROCESS_NONDEGRADING, SAHPI_FUMI_PROCESS_DEGRADING, SAHPI_FUMI_PROCESS_VENDOR_DEFINED_IMPACT_LEVEL, SAHPI_FUMI_PROCESS_IMPACT_MAX_VALID = SAHPI_FUMI_PROCESS_VENDOR_DEFINED_IMPACT_LEVEL } SaHpiFumiServiceImpactT; /* ** An upgrade process on FUMI may affect the entity corresponding to FUMI ** resource. It also may affect other entities as well. ** This struct defines the entity path and the service impact for an affected ** entity. */ typedef struct { SaHpiEntityPathT ImpactedEntity; SaHpiFumiServiceImpactT ServiceImpact; } SaHpiFumiImpactedEntityT; /* ** Maximum number of entities that can be affected by an upgrade process ** on a FUMI */ #define SAHPI_FUMI_MAX_ENTITIES_IMPACTED 5 /* ** This structure lists the entities affected by an upgrade process on a FUMI. ** If an entity is in the list, all its contained entities are implicitly ** considered affected as well (and with the same impact description). ** If both container and contained entity are in list, impact description for ** contained entity is explicitly taken from the corresponding list element. */ typedef struct { SaHpiUint32T NumEntities; SaHpiFumiImpactedEntityT ImpactedEntities[SAHPI_FUMI_MAX_ENTITIES_IMPACTED]; } SaHpiFumiServiceImpactDataT; /* ** FUMI Source Validation Status codes */ typedef enum { SAHPI_FUMI_SRC_VALID = 0, SAHPI_FUMI_SRC_PROTOCOL_NOT_SUPPORTED, /* The source URI specifies a protocol that is not supported by the FUMI */ SAHPI_FUMI_SRC_UNREACHABLE, /* Destination designated by source URI is not reachable, or does not respond */ SAHPI_FUMI_SRC_VALIDATION_NOT_STARTED, /* Validation process has not been started, e.g., no call to saHpiFumiSourceInfoValidate(). */ SAHPI_FUMI_SRC_VALIDATION_INITIATED, /* Validation process is in process */ SAHPI_FUMI_SRC_VALIDATION_FAIL, /* Validation process failed, unable to determine if source image is valid */ SAHPI_FUMI_SRC_TYPE_MISMATCH, /* If the source image does not match the target */ SAHPI_FUMI_SRC_INVALID, /* If the source image fails validation such as failed checksum, corrupted etc. */ SAHPI_FUMI_SRC_VALIDITY_UNKNOWN, /* If the source image validity cannot be determined */ SAHPI_FUMI_SRC_STATUS_MAX_VALID = SAHPI_FUMI_SRC_VALIDITY_UNKNOWN } SaHpiFumiSourceStatusT; /* ** FUMI Bank States */ typedef enum { SAHPI_FUMI_BANK_VALID = 0x00, SAHPI_FUMI_BANK_UPGRADE_IN_PROGRESS, SAHPI_FUMI_BANK_CORRUPTED, SAHPI_FUMI_BANK_ACTIVE, /* Bank has become active bank */ SAHPI_FUMI_BANK_BUSY, /* FUMI operations targeting bank are not currently possible */ SAHPI_FUMI_BANK_UNKNOWN, SAHPI_FUMI_BANK_STATE_MAX_VALID = SAHPI_FUMI_BANK_UNKNOWN } SaHpiFumiBankStateT; /* ** FUMI Upgrade Status */ typedef enum { SAHPI_FUMI_OPERATION_NOTSTARTED = 0x00, /* Only returned in response to saHpiFumiUpgradeStatusGet() */ SAHPI_FUMI_SOURCE_VALIDATION_INITIATED, SAHPI_FUMI_SOURCE_VALIDATION_FAILED, SAHPI_FUMI_SOURCE_VALIDATION_DONE, SAHPI_FUMI_SOURCE_VALIDATION_CANCELLED, SAHPI_FUMI_INSTALL_INITIATED, SAHPI_FUMI_INSTALL_FAILED_ROLLBACK_NEEDED, SAHPI_FUMI_INSTALL_FAILED_ROLLBACK_INITIATED, SAHPI_FUMI_INSTALL_FAILED_ROLLBACK_NOT_POSSIBLE, SAHPI_FUMI_INSTALL_DONE, SAHPI_FUMI_INSTALL_CANCELLED, /* User cancelled operation */ SAHPI_FUMI_ROLLBACK_INITIATED, SAHPI_FUMI_ROLLBACK_FAILED, SAHPI_FUMI_ROLLBACK_DONE, SAHPI_FUMI_ROLLBACK_CANCELLED, SAHPI_FUMI_BACKUP_INITIATED, SAHPI_FUMI_BACKUP_FAILED, SAHPI_FUMI_BACKUP_DONE, SAHPI_FUMI_BACKUP_CANCELLED, SAHPI_FUMI_BANK_COPY_INITIATED, SAHPI_FUMI_BANK_COPY_FAILED, SAHPI_FUMI_BANK_COPY_DONE, SAHPI_FUMI_BANK_COPY_CANCELLED, SAHPI_FUMI_TARGET_VERIFY_INITIATED, SAHPI_FUMI_TARGET_VERIFY_FAILED, SAHPI_FUMI_TARGET_VERIFY_DONE, SAHPI_FUMI_TARGET_VERIFY_CANCELLED, SAHPI_FUMI_ACTIVATE_INITIATED, SAHPI_FUMI_ACTIVATE_FAILED_ROLLBACK_NEEDED, SAHPI_FUMI_ACTIVATE_FAILED_ROLLBACK_INITIATED, SAHPI_FUMI_ACTIVATE_FAILED_ROLLBACK_NOT_POSSIBLE, SAHPI_FUMI_ACTIVATE_DONE, SAHPI_FUMI_ACTIVATE_CANCELLED, SAHPI_FUMI_UPGRADE_STATUS_MAX_VALID = SAHPI_FUMI_ACTIVATE_CANCELLED } SaHpiFumiUpgradeStatusT; /* ** FUMI Source Information - ** Source name contains the file in the identifier section, manufacturer and ** build date-time in description section and version number to correctly ** identify the firmware. Text buffers may have zero length if data is not ** available. Version values may be 0 if version data is not available. */ typedef struct { SaHpiTextBufferT SourceUri; /* Value set for the source information with saHpiFumiSourceSet(). */ SaHpiFumiSourceStatusT SourceStatus; /* Result of validation */ SaHpiTextBufferT Identifier; /* File name */ SaHpiTextBufferT Description; /* Description */ SaHpiTextBufferT DateTime; /* Build Date-Time */ SaHpiUint32T MajorVersion; /* Major Version */ SaHpiUint32T MinorVersion; /* Minor Version */ SaHpiUint32T AuxVersion; /* Auxiliary Version */ } SaHpiFumiSourceInfoT; /* ** FUMI subsidiary component information */ typedef struct { SaHpiEntryIdT EntryId; SaHpiUint32T ComponentId; SaHpiFumiFirmwareInstanceInfoT MainFwInstance; SaHpiUint32T ComponentFlags; /* Reserved for future use */ } SaHpiFumiComponentInfoT; /* ** FUMI Bank Information - ** Text buffers may have zero length if data is not ** available. Version values may be 0 if version data is not available. */ typedef struct { SaHpiUint8T BankId; /* Identifier for bank */ SaHpiUint32T BankSize; /* Bank Size in KBytes */ SaHpiUint32T Position; /* Bank Position in boot order. If only one bank, will always be set to "1" */ SaHpiFumiBankStateT BankState; /* Validity state of bank */ SaHpiTextBufferT Identifier; /* File name */ SaHpiTextBufferT Description; /* Description */ SaHpiTextBufferT DateTime; /* Build Date-Time */ SaHpiUint32T MajorVersion; /* Major Version */ SaHpiUint32T MinorVersion; /* Minor Version */ SaHpiUint32T AuxVersion; /* Auxiliary Version */ } SaHpiFumiBankInfoT; /* ** FUMI Logical Bank State Flags ** Currently only one state flag is defined. It indicates that the currently executing main ** firmware instance does not have a persistent copy. ** Additional state flags may be defined in future versions of this specification. */ typedef SaHpiUint32T SaHpiFumiLogicalBankStateFlagsT; #define SAHPI_FUMI_NO_MAIN_PERSISTENT_COPY (SaHpiFumiLogicalBankStateFlagsT)0x00000001 /* ** FUMI Logical Bank Information */ typedef struct { /* The max number of persistent firmware instances that this */ /* FUMI logical bank can have at the same time */ SaHpiUint8T FirmwarePersistentLocationCount; SaHpiFumiLogicalBankStateFlagsT BankStateFlags; SaHpiFumiFirmwareInstanceInfoT PendingFwInstance; SaHpiFumiFirmwareInstanceInfoT RollbackFwInstance; } SaHpiFumiLogicalBankInfoT; /* ** Logical FUMI Bank Component Information */ typedef struct { SaHpiEntryIdT EntryId; SaHpiUint32T ComponentId; SaHpiFumiFirmwareInstanceInfoT PendingFwInstance; SaHpiFumiFirmwareInstanceInfoT RollbackFwInstance; SaHpiUint32T ComponentFlags; /* Reserved for future use */ } SaHpiFumiLogicalComponentInfoT; /******************************************************************************* ******************************************************************************** ********** ********** ********** FUMI Resource Data Records ********** ********** ********** ******************************************************************************** *******************************************************************************/ /* ** Supported Access Protocols are stored as a bit map for all the different ** access mechanisms that the FUMI implementation supports for accessing the ** firmware binary from the source repository. ** ** Future versions of the HPI specification may define additional access ** protocols and associate them with currently undefined bit positions in ** the SaHpiFumiProtocolT bit mask. Implementations conforming to ** this version of the HPI specification should set all undefined bit values ** to zero in the AccessProt field of the FUMI Resource Data Record. ** However, HPI Users should not assume undefined bit values are zero, to ** remain compatible with HPI implementations that implement future versions ** of the specification. ** */ typedef SaHpiUint32T SaHpiFumiProtocolT; #define SAHPI_FUMI_PROT_TFTP (SaHpiFumiProtocolT)0x00000001 #define SAHPI_FUMI_PROT_FTP (SaHpiFumiProtocolT)0x00000002 #define SAHPI_FUMI_PROT_HTTP (SaHpiFumiProtocolT)0x00000004 #define SAHPI_FUMI_PROT_LDAP (SaHpiFumiProtocolT)0x00000008 #define SAHPI_FUMI_PROT_LOCAL (SaHpiFumiProtocolT)0x00000010 /* Local Copy */ #define SAHPI_FUMI_PROT_NFS (SaHpiFumiProtocolT)0x00000020 #define SAHPI_FUMI_PROT_DBACCESS (SaHpiFumiProtocolT)0x00000040 /* ** Capability flag of FUMI is a bitmap of supported capabilities ** ** Future versions of the HPI specification may define additional FUMI ** capabilities and associate them with currently undefined bit positions in ** the SaHpiFumiCapabilityT bit mask. Implementations conforming to ** this version of the HPI specification should set all undefined bit values ** to zero in the Capability field of the FUMI Resource Data Record. ** However, HPI Users should not assume undefined bit values are zero, to ** remain compatible with HPI implementations that implement future versions ** of the specification. ** */ typedef SaHpiUint32T SaHpiFumiCapabilityT; #define SAHPI_FUMI_CAP_ROLLBACK (SaHpiFumiCapabilityT)0x00000001 #define SAHPI_FUMI_CAP_BANKCOPY (SaHpiFumiCapabilityT)0x00000002 #define SAHPI_FUMI_CAP_BANKREORDER (SaHpiFumiCapabilityT)0x00000004 #define SAHPI_FUMI_CAP_BACKUP (SaHpiFumiCapabilityT)0x00000008 #define SAHPI_FUMI_CAP_TARGET_VERIFY (SaHpiFumiCapabilityT)0x00000010 #define SAHPI_FUMI_CAP_TARGET_VERIFY_MAIN (SaHpiFumiCapabilityT)0x00000020 #define SAHPI_FUMI_CAP_COMPONENTS (SaHpiFumiCapabilityT)0x00000040 #define SAHPI_FUMI_CAP_AUTOROLLBACK (SaHpiFumiCapabilityT)0x00000080 #define SAHPI_FUMI_CAP_AUTOROLLBACK_CAN_BE_DISABLED \ (SaHpiFumiCapabilityT)0x00000100 #define SAHPI_FUMI_CAP_MAIN_NOT_PERSISTENT \ (SaHpiFumiCapabilityT)0x00000200 /* ** Record Definition ** Definition of the FUMI resource data record. */ typedef struct { SaHpiFumiNumT Num; /* FUMI Number/Index */ SaHpiFumiProtocolT AccessProt; /* Supported protocols for repository access */ SaHpiFumiCapabilityT Capability; /* Optional capbilities supported by FUMI */ SaHpiUint8T NumBanks; /* Number of explicit banks supported. Set to "0" if no explicit banks are supported */ SaHpiUint32T Oem; /* Reserved for OEM use */ } SaHpiFumiRecT; /******************************************************************************* ******************************************************************************** ********** ********** ********** Hot Swap ********** ********** ********** ******************************************************************************** *******************************************************************************/ /* Hot Swap Indicator State */ typedef enum { SAHPI_HS_INDICATOR_OFF = 0, SAHPI_HS_INDICATOR_ON, SAHPI_HS_INDICATOR_STATE_MAX_VALID = SAHPI_HS_INDICATOR_ON } SaHpiHsIndicatorStateT; /* Hot Swap Action */ typedef enum { SAHPI_HS_ACTION_INSERTION = 0, SAHPI_HS_ACTION_EXTRACTION, SAHPI_HS_ACTION_MAX_VALID = SAHPI_HS_ACTION_EXTRACTION } SaHpiHsActionT; /* Hot Swap State */ typedef enum { SAHPI_HS_STATE_INACTIVE = 0, SAHPI_HS_STATE_INSERTION_PENDING, SAHPI_HS_STATE_ACTIVE, SAHPI_HS_STATE_EXTRACTION_PENDING, SAHPI_HS_STATE_NOT_PRESENT, SAHPI_HS_STATE_MAX_VALID = SAHPI_HS_STATE_NOT_PRESENT } SaHpiHsStateT; /* Cause of Hot Swap State Change */ typedef enum { SAHPI_HS_CAUSE_AUTO_POLICY = 0, SAHPI_HS_CAUSE_EXT_SOFTWARE, SAHPI_HS_CAUSE_OPERATOR_INIT, SAHPI_HS_CAUSE_USER_UPDATE, SAHPI_HS_CAUSE_UNEXPECTED_DEACTIVATION, SAHPI_HS_CAUSE_SURPRISE_EXTRACTION, SAHPI_HS_CAUSE_EXTRACTION_UPDATE, SAHPI_HS_CAUSE_HARDWARE_FAULT, SAHPI_HS_CAUSE_CONTAINING_FRU, SAHPI_HS_CAUSE_UNKNOWN = 0xFFFF, SAHPI_HS_CAUSE_MAX_VALID = SAHPI_HS_CAUSE_UNKNOWN } SaHpiHsCauseOfStateChangeT; /******************************************************************************* ******************************************************************************** ********** ********** ********** Events ********** ********** ********** ******************************************************************************** *******************************************************************************/ /* Event Data Structures */ typedef enum { SAHPI_CRITICAL = 0, SAHPI_MAJOR, SAHPI_MINOR, SAHPI_INFORMATIONAL, SAHPI_OK, SAHPI_DEBUG = 0xF0, SAHPI_ALL_SEVERITIES = 0xFF, /* Only used with some DAT and */ /* Annunciator functions. This is */ /* not a valid severity for events, */ /* alarms, or announcements */ SAHPI_SEVERITY_MAX_VALID = SAHPI_DEBUG } SaHpiSeverityT; /* ** Resource Event Types ** ** Future versions of this specification may add new types of resource events ** to this enumerated type. Legacy HPI Users should consider these new types ** 'valid but unknown'even if the value is greater than ** SAHPI_RESE_TYPE_MAX_VALID. */ typedef enum { SAHPI_RESE_RESOURCE_FAILURE, SAHPI_RESE_RESOURCE_RESTORED, SAHPI_RESE_RESOURCE_ADDED, SAHPI_RESE_RESOURCE_REMOVED, SAHPI_RESE_RESOURCE_INACCESSIBLE, SAHPI_RESE_RESOURCE_UPDATED, SAHPI_RESE_TYPE_MAX_VALID = SAHPI_RESE_RESOURCE_UPDATED } SaHpiResourceEventTypeT; typedef struct { SaHpiResourceEventTypeT ResourceEventType; } SaHpiResourceEventT; /* ** Domain events are used to announce the addition of domain references ** and the removal of domain references to the DRT. ** ** ** Future versions of this specification may add new types of domain events ** to this enumerated type. Legacy HPI Users should consider these new types ** 'valid but unknown'even if the value is greater than ** SAHPI_DOMAIN_EVENT_TYPE_MAX_VALID. */ typedef enum { SAHPI_DOMAIN_REF_ADDED, SAHPI_DOMAIN_REF_REMOVED, SAHPI_DOMAIN_EVENT_TYPE_MAX_VALID = SAHPI_DOMAIN_REF_REMOVED } SaHpiDomainEventTypeT; typedef struct { SaHpiDomainEventTypeT Type; /* Type of domain event */ SaHpiDomainIdT DomainId; /* Domain Id of domain added to or removed from DRT. */ } SaHpiDomainEventT; /* ** Sensor events and Sensor enable change events are issued to report ** changes in status of Sensors. These events are associated with ** specific Sensor management instruments, identified by the SensorNum ** field in the event. */ /* ** Sensor Optional Data ** ** Sensor events may contain optional data items passed and stored with the ** event. If these optional data items are present, they are included with ** the event data returned in response to an saHpiEventGet() or ** saHpiEventLogEntryGet() function call. Also, the optional data items may be ** included with the event data passed to the saHpiEventLogEntryAdd() function. ** ** Specific implementations of HPI may have restrictions on how much data may ** be passed to saHpiEventLogEntryAdd(). These restrictions should be documented ** by the provider of the HPI interface. ** ** Future versions of the HPI specification may define additional Sensor ** optional data items and associate them with currently undefined bit positions ** in the SaHpiSensorOptionalDataT bit mask. Implementations conforming to ** this version of the HPI specification should set all undefined bit values ** to zero in the OptionalDataPresent field of Sensor events. ** However, HPI Users should not assume undefined bit values are zero, to ** remain compatible with HPI implementations that implement future versions ** of the specification. ** */ typedef SaHpiUint8T SaHpiSensorOptionalDataT; #define SAHPI_SOD_TRIGGER_READING (SaHpiSensorOptionalDataT)0x01 #define SAHPI_SOD_TRIGGER_THRESHOLD (SaHpiSensorOptionalDataT)0x02 #define SAHPI_SOD_OEM (SaHpiSensorOptionalDataT)0x04 #define SAHPI_SOD_PREVIOUS_STATE (SaHpiSensorOptionalDataT)0x08 #define SAHPI_SOD_CURRENT_STATE (SaHpiSensorOptionalDataT)0x10 #define SAHPI_SOD_SENSOR_SPECIFIC (SaHpiSensorOptionalDataT)0x20 typedef struct { SaHpiSensorNumT SensorNum; SaHpiSensorTypeT SensorType; SaHpiEventCategoryT EventCategory; SaHpiBoolT Assertion; /* True = Event State asserted False = deasserted */ SaHpiEventStateT EventState; /* single state being asserted or deasserted*/ SaHpiSensorOptionalDataT OptionalDataPresent; /* the following fields are only valid if the corresponding flag is set in the OptionalDataPresent field */ SaHpiSensorReadingT TriggerReading; /* Reading that triggered the event */ SaHpiSensorReadingT TriggerThreshold; /* Value of the threshold that was crossed. Is not present if threshold is not readable. */ SaHpiEventStateT PreviousState; /* Previous set of asserted event states. If multiple event states change at once, multiple events may be generated for each changing event state. This field should indicate the status of the Sensor event states prior to any of the simultaneous changes. Thus, it is the same in each event generated due to multiple simultaneous event state changes. */ SaHpiEventStateT CurrentState; /* Current set of asserted event states. */ SaHpiUint32T Oem; SaHpiUint32T SensorSpecific; } SaHpiSensorEventT; /* ** Sensor Enable Change Optional Data ** ** Sensor enable change events may contain optional data items passed and ** stored with the event. ** ** Future versions of the HPI specification may define additional Sensor enable ** change optional data items and associate them with currently undefined bit ** positions in the SaHpiSensorEnableOptDataT bit mask. Implementations ** conforming to this version of the HPI specification should set all undefined ** bit values to zero in the OptionalDataPresent field of Sensor Enable Change ** events. However, HPI Users should not assume undefined bit values are zero, ** to remain compatible with HPI implementations that implement future versions ** of the specification. ** */ typedef SaHpiUint8T SaHpiSensorEnableOptDataT; #define SAHPI_SEOD_CURRENT_STATE (SaHpiSensorEnableOptDataT)0x10 #define SAHPI_SEOD_ALARM_STATES (SaHpiSensorEnableOptDataT)0x40 typedef struct { SaHpiSensorNumT SensorNum; SaHpiSensorTypeT SensorType; SaHpiEventCategoryT EventCategory; SaHpiBoolT SensorEnable; /* current Sensor enable status */ SaHpiBoolT SensorEventEnable; /* current evt enable status */ SaHpiEventStateT AssertEventMask; /* current assert event mask */ SaHpiEventStateT DeassertEventMask; /* current deassert evt mask */ SaHpiSensorEnableOptDataT OptionalDataPresent; /* The CurrentState field is valid only if the SAHPI_SEOD_CURRENT_STATE flag is set in the OptionalDataPresent field. */ SaHpiEventStateT CurrentState; /* Current set of asserted Event states. */ /* The CriticalAlarms, MajorAlarms, and MinorAlarms fields are valid only if the SAHPI_SEOD_ALARM_STATES flag is set in the OptionalDataPresent field. These fields indicate which of the currently asserted event states are critical, major, or minor alarms, respectively. An asserted event state is an alarm only if the Sensor is enabled, Sensor events are enabled, the corresponding AssertEventMask bit is set, and the event generated for that event state assertion has a severity of SAHPI_CRITICAL, SAHPI_MAJOR, or SAHPI_MINOR. Thus, if the event is reporting that the Sensor is disabled or Sensor events are disabled, then these three fields, if present, must all be equal to 0000. Similarly, there should never be a bit set in any of these three fields that is not also set in the AssertEventMask field, and, if the SAHPI_SEOD_CURRENT_STATE flag is Set, in the CurrentState field. */ SaHpiEventStateT CriticalAlarms; /* current set of asserted Event states that are critical alarms.*/ SaHpiEventStateT MajorAlarms; /* current set of asserted Event states that are major alarms.*/ SaHpiEventStateT MinorAlarms; /* current set of asserted Event states that are minor alarms.*/ } SaHpiSensorEnableChangeEventT; typedef struct { SaHpiHsStateT HotSwapState; SaHpiHsStateT PreviousHotSwapState; SaHpiHsCauseOfStateChangeT CauseOfStateChange; } SaHpiHotSwapEventT; /* ** Watchdog events are issued to report changes in status of Sensors. These ** events are associated with specific Watchdog Timer management instruments, ** identified by the WatchdogNum field in the event. */ typedef struct { SaHpiWatchdogNumT WatchdogNum; SaHpiWatchdogActionEventT WatchdogAction; SaHpiWatchdogPretimerInterruptT WatchdogPreTimerAction; SaHpiWatchdogTimerUseT WatchdogUse; } SaHpiWatchdogEventT; /* ** The following type defines the types of events that can be reported ** by the HPI software implementation. ** ** Audit events report a discrepancy in the audit process. Audits are typically ** performed by HA software to detect problems. Audits may look for such things ** as corrupted data stores, inconsistent RPT information, or improperly managed ** queues. ** ** Startup events report a failure to start-up properly, or inconsistencies in ** persisted data. ** ** ** Future versions of this specification may add new types of software events ** to this enumerated type. Legacy HPI Users should consider these new types ** 'valid but unknown'even if the value is greater than ** SAHPI_HPIE_TYPE_MAX_VALID. */ typedef enum { SAHPI_HPIE_AUDIT, SAHPI_HPIE_STARTUP, SAHPI_HPIE_OTHER, SAHPI_HPIE_TYPE_MAX_VALID = SAHPI_HPIE_OTHER } SaHpiSwEventTypeT; typedef struct { SaHpiManufacturerIdT MId; SaHpiSwEventTypeT Type; SaHpiTextBufferT EventData; } SaHpiHpiSwEventT; typedef struct { SaHpiManufacturerIdT MId; SaHpiTextBufferT OemEventData; } SaHpiOemEventT; /* ** User events may be used for storing custom events created by an HPI User ** when injecting events into the Event Log using saHpiEventLogEntryAdd(). */ typedef struct { SaHpiTextBufferT UserEventData; } SaHpiUserEventT; /* ** DIMI events and DIMI Update events are issued to report changes in status ** of DIMIs or tests initiated by DIMIs. These events are associated with ** specific Diagnotic Initiator management instruments, identified by the ** DimiNum field in the event. */ /* ** DIMI events are generated by DIMI implementation asynchronously when ** status of a test changes (For example when a test starts, ends, gets ** canceled or generated for % completed). The test run status is enumerated ** in SaHpiDimiTestRunStatusT */ typedef struct { SaHpiDimiNumT DimiNum; SaHpiDimiTestNumT TestNum; SaHpiDimiTestRunStatusT DimiTestRunStatus; SaHpiDimiTestPercentCompletedT DimiTestPercentCompleted; /* Percentage of test completed. Based on implementation capability, value 0 - 100, 0xFF returned if capability not available */ } SaHpiDimiEventT; /* ** DIMI update events are generated when the set of tests for a DIMI changes. ** For example, when new tests are added or deleted from DIMI. When this event ** is generated, HPI User is expected to retrieve updated test information ** using DimiInfoGet function with the DIMI number provided in the event. */ typedef struct { SaHpiDimiNumT DimiNum; } SaHpiDimiUpdateEventT; /* ** FUMI events are issued to report changes in status of firmware upgrade ** operations. These events are associated with specific Firmware Upgrade ** management instruments, identified by the FumiNum field in the event. */ /* ** FUMI event definition ** */ typedef struct { SaHpiFumiNumT FumiNum; /* FUMI Number */ SaHpiUint8T BankNum; /* Bank Number */ SaHpiFumiUpgradeStatusT UpgradeStatus; /* Upgrade status of bank */ } SaHpiFumiEventT; /* HPI Event Types ** ** Future versions of this specification may add new event types to this ** enumerated type. Legacy HPI Users should consider these new event types ** 'valid but unknown' and should not attempt to interpret such events. ** This applies even if the value is greater than SAHPI_ET_MAX_VALID. ** In general, if an event of unknown type is found in an event log or ** received via an event subscription it should be ignored by the HPI User. */ typedef enum { SAHPI_ET_RESOURCE, SAHPI_ET_DOMAIN, SAHPI_ET_SENSOR, SAHPI_ET_SENSOR_ENABLE_CHANGE, SAHPI_ET_HOTSWAP, SAHPI_ET_WATCHDOG, SAHPI_ET_HPI_SW, SAHPI_ET_OEM, SAHPI_ET_USER, SAHPI_ET_DIMI, SAHPI_ET_DIMI_UPDATE, SAHPI_ET_FUMI, SAHPI_ET_MAX_VALID = SAHPI_ET_FUMI } SaHpiEventTypeT; typedef union { SaHpiResourceEventT ResourceEvent; SaHpiDomainEventT DomainEvent; SaHpiSensorEventT SensorEvent; SaHpiSensorEnableChangeEventT SensorEnableChangeEvent; SaHpiHotSwapEventT HotSwapEvent; SaHpiWatchdogEventT WatchdogEvent; SaHpiHpiSwEventT HpiSwEvent; SaHpiOemEventT OemEvent; SaHpiUserEventT UserEvent; SaHpiDimiEventT DimiEvent; SaHpiDimiUpdateEventT DimiUpdateEvent; SaHpiFumiEventT FumiEvent; } SaHpiEventUnionT; typedef struct { SaHpiResourceIdT Source; SaHpiEventTypeT EventType; SaHpiTimeT Timestamp; /*Equal to SAHPI_TIME_UNSPECIFIED if time is not available; Absolute time if greater than SAHPI_TIME_MAX_RELATIVE, Relative time if less than or equal to SAHPI_TIME_MAX_RELATIVE */ SaHpiSeverityT Severity; SaHpiEventUnionT EventDataUnion; } SaHpiEventT; /* ** Event Queue Status ** ** This status word is returned to HPI Users that request it ** when saHpiEventGet() is called. ** */ typedef SaHpiUint32T SaHpiEvtQueueStatusT; #define SAHPI_EVT_QUEUE_OVERFLOW (SaHpiEvtQueueStatusT)0x0001 /******************************************************************************* ******************************************************************************** ********** ********** ********** Annunciators ********** ********** ********** ******************************************************************************** *******************************************************************************/ /* ** Annunciator Number ** Identifier for an Annunciator management instrument. */ typedef SaHpiInstrumentIdT SaHpiAnnunciatorNumT; /* ** The following data type is equivalent to the AIS data type SaNameT. ** it is defined in this header file, so that inclusion of the AIS ** header file is not required. This data type is based on version 1.0 ** of the AIS specification */ #define SA_HPI_MAX_NAME_LENGTH 256 typedef struct { SaHpiUint16T Length; unsigned char Value[SA_HPI_MAX_NAME_LENGTH]; } SaHpiNameT; /* ** Enumeration of Announcement Types ** ** Future versions of this specification may add new types of announcements ** to this enumerated type. Legacy HPI Users should consider these new types ** 'valid but unknown'even if the value is greater than ** SAHPI_STATUS_COND_TYPE_MAX_VALID. */ typedef enum { SAHPI_STATUS_COND_TYPE_SENSOR, SAHPI_STATUS_COND_TYPE_RESOURCE, SAHPI_STATUS_COND_TYPE_OEM, SAHPI_STATUS_COND_TYPE_USER, SAHPI_STATUS_COND_TYPE_MAX_VALID = SAHPI_STATUS_COND_TYPE_USER } SaHpiStatusCondTypeT; /* Condition structure definition */ typedef struct { SaHpiStatusCondTypeT Type; /* Status Condition Type */ SaHpiEntityPathT Entity; /* Entity assoc. with status condition */ SaHpiDomainIdT DomainId; /* Domain associated with status. May be SAHPI_UNSPECIFIED_DOMAIN_ID meaning current domain, or domain not meaningful for status condition*/ SaHpiResourceIdT ResourceId; /* Resource associated with status. May be SAHPI_UNSPECIFIED_RESOURCE_ID if Type is SAHPI_STATUS_COND_USER. Must be set to valid ResourceId in domain specified by DomainId, or in current domain, if DomainId is SAHPI_UNSPECIFIED_DOMAIN_ID */ SaHpiSensorNumT SensorNum; /* Sensor associated with status Only valid if Type is SAHPI_STATUS_COND_TYPE_SENSOR */ SaHpiEventStateT EventState; /* Sensor event state. Only valid if Type is SAHPI_STATUS_COND_TYPE_SENSOR. */ SaHpiNameT Name; /* AIS compatible identifier associated with Status condition */ SaHpiManufacturerIdT Mid; /* Manufacturer Id associated with status condition, required when type is SAHPI_STATUS_COND_TYPE_OEM. */ SaHpiTextBufferT Data; /* Optional Data associated with Status condition */ } SaHpiConditionT; /* Announcement structure definition */ typedef struct { SaHpiEntryIdT EntryId; /* Announcment Entry Id */ SaHpiTimeT Timestamp; /* Time when announcement added to set */ SaHpiBoolT AddedByUser; /* True if added to set by HPI User, False if added automatically by HPI implementation */ SaHpiSeverityT Severity; /* Severity of announcement */ SaHpiBoolT Acknowledged; /* Acknowledged flag */ SaHpiConditionT StatusCond; /* Detailed status condition */ } SaHpiAnnouncementT; /* Annunciator Mode - defines who may add or delete entries in set. */ typedef enum { SAHPI_ANNUNCIATOR_MODE_AUTO, SAHPI_ANNUNCIATOR_MODE_USER, SAHPI_ANNUNCIATOR_MODE_SHARED, SAHPI_ANNUNCIATOR_MODE_MAX_VALID = SAHPI_ANNUNCIATOR_MODE_SHARED } SaHpiAnnunciatorModeT; /******************************************************************************* ******************************************************************************** ********** ********** ********** Annunciator Resource Data Records ********** ********** ********** ******************************************************************************** *******************************************************************************/ /* ** The following enumerated type defines the possible output types ** which can be associated with an Annunciator Management Instrument ** ** Future versions of this specification may add new types of announcement ** output types to this enumerated type. Legacy HPI Users should consider ** these new types 'valid but unknown'. */ typedef enum { SAHPI_ANNUNCIATOR_TYPE_LED = 0, SAHPI_ANNUNCIATOR_TYPE_DRY_CONTACT_CLOSURE, SAHPI_ANNUNCIATOR_TYPE_AUDIBLE, SAHPI_ANNUNCIATOR_TYPE_LCD_DISPLAY, SAHPI_ANNUNCIATOR_TYPE_MESSAGE, SAHPI_ANNUNCIATOR_TYPE_COMPOSITE, SAHPI_ANNUNCIATOR_TYPE_OEM, SAHPI_ANNUNCIATOR_TYPE_MAX_VALID = SAHPI_ANNUNCIATOR_TYPE_OEM } SaHpiAnnunciatorTypeT; /* ** All Annunciator management instruments ** must be represented in the RDR repository ** with an SaHpiAnnunciatorRecT. */ typedef struct { SaHpiAnnunciatorNumT AnnunciatorNum; SaHpiAnnunciatorTypeT AnnunciatorType; /* Annunciator Output Type */ SaHpiBoolT ModeReadOnly; /* if True, Mode may not be changed by HPI User */ SaHpiUint32T MaxConditions; /* maximum number of conditions that can be held in current set. 0 means no fixed limit. */ SaHpiUint32T Oem; } SaHpiAnnunciatorRecT; /******************************************************************************* ******************************************************************************** ********** ********** ********** Resource Data Record ********** ********** ********** ******************************************************************************** *******************************************************************************/ /* ** The following describes the different types of records that exist within a ** RDR repository and the RDR super-structure to all of the specific RDR types ** (Sensor, Inventory Data, Watchdog, etc.). ** ** Future versions of this specification may add new resource data record ** types to this enumerated type. Legacy HPI Users should consider these new ** RDR types 'valid but unknown' and should not attempt to interpret such ** records. This applies even if the value is greater than ** SAHPI_RDR_TYPE_MAX_VALID. In general, if an RDR of unknown type is found ** within a RDR repository the HPI User should ignore it. */ typedef enum { SAHPI_NO_RECORD, SAHPI_CTRL_RDR, SAHPI_SENSOR_RDR, SAHPI_INVENTORY_RDR, SAHPI_WATCHDOG_RDR, SAHPI_ANNUNCIATOR_RDR, SAHPI_DIMI_RDR, SAHPI_FUMI_RDR, SAHPI_RDR_TYPE_MAX_VALID = SAHPI_FUMI_RDR } SaHpiRdrTypeT; typedef union { SaHpiCtrlRecT CtrlRec; SaHpiSensorRecT SensorRec; SaHpiInventoryRecT InventoryRec; SaHpiWatchdogRecT WatchdogRec; SaHpiAnnunciatorRecT AnnunciatorRec; SaHpiDimiRecT DimiRec; SaHpiFumiRecT FumiRec; } SaHpiRdrTypeUnionT; typedef struct { SaHpiEntryIdT RecordId; SaHpiRdrTypeT RdrType; SaHpiEntityPathT Entity; /* Entity to which this RDR relates. */ SaHpiBoolT IsFru; /* Entity is a FRU. This field is Only valid if the Entity path given in the "Entity" field is different from the Entity path in the RPT entry for the resource. */ SaHpiRdrTypeUnionT RdrTypeUnion; SaHpiTextBufferT IdString; } SaHpiRdrT; /******************************************************************************* ******************************************************************************** ********** ********** ********** Parameter Control ********** ********** ********** ******************************************************************************** *******************************************************************************/ typedef enum { SAHPI_DEFAULT_PARM = 0, SAHPI_SAVE_PARM, SAHPI_RESTORE_PARM, SAHPI_PARM_ACTION_MAX_VALID = SAHPI_RESTORE_PARM } SaHpiParmActionT; /******************************************************************************* ******************************************************************************** ********** ********** ********** Reset ********** ********** ********** ******************************************************************************** *******************************************************************************/ typedef enum { SAHPI_COLD_RESET = 0, SAHPI_WARM_RESET, SAHPI_RESET_ASSERT, SAHPI_RESET_DEASSERT, SAHPI_RESET_MAX_VALID = SAHPI_RESET_DEASSERT } SaHpiResetActionT; /******************************************************************************* ******************************************************************************** ********** ********** ********** Power ********** ********** ********** ******************************************************************************** *******************************************************************************/ typedef enum { SAHPI_POWER_OFF = 0, SAHPI_POWER_ON, SAHPI_POWER_CYCLE, SAHPI_POWER_STATE_MAX_VALID = SAHPI_POWER_CYCLE } SaHpiPowerStateT; /******************************************************************************* ******************************************************************************** ********** ********** ********** Load ID ********** ********** ********** ******************************************************************************** *******************************************************************************/ typedef SaHpiUint32T SaHpiLoadNumberT; #define SAHPI_LOAD_ID_DEFAULT (SaHpiLoadNumberT)0 #define SAHPI_LOAD_ID_BYNAME (SaHpiLoadNumberT)0xffffffff typedef struct { SaHpiLoadNumberT LoadNumber; SaHpiTextBufferT LoadName; } SaHpiLoadIdT; /******************************************************************************* ******************************************************************************** ********** ********** ********** Resource Presence Table ********** ********** ********** ******************************************************************************** *******************************************************************************/ /* This section defines the types associated with the RPT. */ /* ** GUID - Globally Unique Identifier ** ** The format of the ID follows that specified by the Wired for Management ** Baseline, Version 2.0 specification. HPI uses version 1 of the GUID ** format, with a 3-bit variant field of 10x (where x indicates "don't care") */ typedef SaHpiUint8T SaHpiGuidT[16]; /* ** Resource Info Type Definitions ** ** ** SaHpiResourceInfoT contains static configuration data concerning the ** management controller associated with the resource, or the resource itself. ** Note this information is used to describe the resource; that is, the piece of ** infrastructure which manages an entity (or multiple entities) - NOT the ** entities for which the resource provides management. The purpose of the ** SaHpiResourceInfoT structure is to provide information that an HPI User may ** need to interact correctly with the resource (e.g., recognize a ** specific management controller which may have defined OEM fields in Sensors, ** OEM Controls, etc.). ** ** The fields of the SaHpiResourceInfoT structure are intended to uniquely ** identify an implementation of the functionality modeled by an HPI resource. ** Multiple instances of a resource implementation may be present in an HPI ** implementation with different configurations, so it is not required that ** this data be unique in each resource present in an HPI implemenation. ** ** The GUID is used to uniquely identify a Resource. A GUID value of zero ** indicates that the Resource does not have an associated GUID. ** ** All of the fields in the following structure may or may not be used by a ** given resource. */ typedef struct { SaHpiUint8T ResourceRev; SaHpiUint8T SpecificVer; SaHpiUint8T DeviceSupport; SaHpiManufacturerIdT ManufacturerId; SaHpiUint16T ProductId; SaHpiUint8T FirmwareMajorRev; SaHpiUint8T FirmwareMinorRev; SaHpiUint8T AuxFirmwareRev; SaHpiGuidT Guid; } SaHpiResourceInfoT; /* ** Resource Capabilities ** ** This definition defines the capabilities of a given resource. One resource ** may support any number of capabilities using the bit mask. Because each entry ** in an RPT has the SAHPI_CAPABILITY_RESOURCE bit set, zero is not a ** valid value for the capability flag, and is thus used to indicate "no RPT ** entry present" in some function calls. ** ** Future versions of the HPI specification may define additional resource ** capabilities and associate them with currently undefined bit positions in ** the SaHpiCapabilitiesT bit mask. Implementations conforming to this ** version of the HPI specification should set all undefined bit values to ** zero in the ResourceCapabilities field of all Rpt entries. However, ** HPI Users should not assume undefined bit values are zero, to ** remain compatible with HPI implementations that implement future versions ** of the specification. ** ** SAHPI_CAPABILITY_RESOURCE ** SAHPI_CAPABILITY_EVT_DEASSERTS ** Indicates that all Sensors on the resource have the property that their ** Assertion and Deassertion event enable flags are the same. That is, ** for all event states whose assertion triggers an event, it is ** guaranteed that the deassertion of that event state also ** triggers an event. Thus, an HPI User may track the state of Sensors on the ** resource by monitoring events rather than polling for event state changes. ** SAHPI_CAPABILITY_AGGREGATE_STATUS ** SAHPI_CAPABILITY_CONFIGURATION ** SAHPI_CAPABILITY_MANAGED_HOTSWAP ** Indicates that the resource supports managed hot swap. ** Since hot swap only makes sense for field-replaceable units, the ** SAHPI_CAPABILITY_FRU capability bit must also be set for this resource. ** SAHPI_CAPABILITY_WATCHDOG ** SAHPI_CAPABILITY_CONTROL ** SAHPI_CAPABILITY_FRU ** Indicates that the resource is associated with an entity that is a ** field-replaceable unit; i.e., it is capable of being removed and ** replaced in a live system, and the resource reports hot swap events ** for the FRU. ** SAHPI_CAPABILITY_LOAD_ID ** SAHPI_CAPABILITY_DIMI ** SAHPI_CAPABILITY_FUMI ** SAHPI_CAPABILITY_ANNUNCIATOR ** SAHPI_CAPABILITY_POWER ** SAHPI_CAPABILITY_RESET ** SAHPI_CAPABILITY_INVENTORY_DATA ** SAHPI_CAPABILITY_EVENT_LOG ** SAHPI_CAPABILITY_RDR ** Indicates that a resource data record (RDR) repository is supplied ** by the resource. Since the existence of an RDR is mandatory for all ** management instruments, this ** capability must be asserted if the resource ** contains any Sensors, Controls, Watchdog Timers, Annunciators, ** Inventory Data Repositories, FUMIs or DIMIs. ** SAHPI_CAPABILITY_SENSOR */ typedef SaHpiUint32T SaHpiCapabilitiesT; #define SAHPI_CAPABILITY_RESOURCE (SaHpiCapabilitiesT)0x40000000 #define SAHPI_CAPABILITY_FUMI (SaHpiCapabilitiesT)0x00010000 #define SAHPI_CAPABILITY_EVT_DEASSERTS (SaHpiCapabilitiesT)0x00008000 #define SAHPI_CAPABILITY_DIMI (SaHpiCapabilitiesT)0x00004000 #define SAHPI_CAPABILITY_AGGREGATE_STATUS (SaHpiCapabilitiesT)0x00002000 #define SAHPI_CAPABILITY_CONFIGURATION (SaHpiCapabilitiesT)0x00001000 #define SAHPI_CAPABILITY_MANAGED_HOTSWAP (SaHpiCapabilitiesT)0x00000800 #define SAHPI_CAPABILITY_WATCHDOG (SaHpiCapabilitiesT)0x00000400 #define SAHPI_CAPABILITY_CONTROL (SaHpiCapabilitiesT)0x00000200 #define SAHPI_CAPABILITY_FRU (SaHpiCapabilitiesT)0x00000100 #define SAHPI_CAPABILITY_LOAD_ID (SaHpiCapabilitiesT)0x00000080 #define SAHPI_CAPABILITY_ANNUNCIATOR (SaHpiCapabilitiesT)0x00000040 #define SAHPI_CAPABILITY_POWER (SaHpiCapabilitiesT)0x00000020 #define SAHPI_CAPABILITY_RESET (SaHpiCapabilitiesT)0x00000010 #define SAHPI_CAPABILITY_INVENTORY_DATA (SaHpiCapabilitiesT)0x00000008 #define SAHPI_CAPABILITY_EVENT_LOG (SaHpiCapabilitiesT)0x00000004 #define SAHPI_CAPABILITY_RDR (SaHpiCapabilitiesT)0x00000002 #define SAHPI_CAPABILITY_SENSOR (SaHpiCapabilitiesT)0x00000001 /* ** Resource Managed Hot Swap Capabilities ** ** This definition defines the managed hot swap capabilities of a given ** resource. ** ** Future versions of the HPI specification may define additional hot swap ** capabilities and associate them with currently undefined bit positions ** in the SaHpiHsCapabilitiesT bit mask. Implementations conforming to ** this version of the HPI specification should set all undefined bit values ** to zero in the HotSwapCapabilities field of all RPT entries. ** However, HPI Users should not assume undefined bit values are zero, to ** remain compatible with HPI implementations that implement future versions ** of the specification. ** ** SAHPI_HS_CAPABILITY_AUTOEXTRACT_READ_ONLY ** This capability indicates if the hot swap autoextract timer is read-only. ** SAHPI_HS_CAPABILITY_INDICATOR_SUPPORTED ** Indicates whether the resource has a hot swap indicator. ** SAHPI_HS_CAPABILITY_AUTOINSERT_IMMEDIATE ** This capability indicates that the resource ignores the auto insertion ** timeout value(s) configured for the domain(s) of which it is a member, ** but instead begins its auto insertion policy immediately upon insertion. */ typedef SaHpiUint32T SaHpiHsCapabilitiesT; #define SAHPI_HS_CAPABILITY_AUTOEXTRACT_READ_ONLY \ (SaHpiHsCapabilitiesT)0x80000000 #define SAHPI_HS_CAPABILITY_INDICATOR_SUPPORTED \ (SaHpiHsCapabilitiesT)0X40000000 #define SAHPI_HS_CAPABILITY_AUTOINSERT_IMMEDIATE\ (SaHpiHsCapabilitiesT)0x20000000 /* ** RPT Entry ** ** This structure is used to store the RPT entry information. ** ** The ResourceCapabilities field defines the capabilities of the resource. ** This field must be non-zero for all valid resources. ** ** The HotSwapCapabilities field denotes the capabilities of the resource, ** specifically related to hot swap. This field is only valid if the ** resource supports managed hot swap, as indicated by the ** SAHPI_CAPABILITY_MANAGED_HOT_SWAP resource capability. ** ** The ResourceTag is a data field within an RPT entry available to the HPI ** User for associating application specific data with a resource. The HPI ** User supplied data is purely informational and is not used by the HPI ** implementation, domain, or associated resource. For example, an HPI User ** can set the resource tag to a "descriptive" value, which can be used to ** identify the resource in messages to a human operator. */ typedef struct { SaHpiEntryIdT EntryId; SaHpiResourceIdT ResourceId; SaHpiResourceInfoT ResourceInfo; SaHpiEntityPathT ResourceEntity; /* If resource manages a FRU, entity path of the FRU */ /* If resource manages a single entity, entity path of that entity. */ /* If resource manages multiple entities, the entity path of the "primary" entity managed by the resource */ /* Must be set to the same value in every domain which contains this resource */ SaHpiCapabilitiesT ResourceCapabilities; /* Must be non-0. */ SaHpiHsCapabilitiesT HotSwapCapabilities; /* Indicates the hot swap capabilities of the resource */ SaHpiSeverityT ResourceSeverity; /* Indicates the criticality that should be raised when the resource is not responding */ SaHpiBoolT ResourceFailed; /* Indicates that the resource is not currently accessible */ SaHpiTextBufferT ResourceTag; } SaHpiRptEntryT; /******************************************************************************* ******************************************************************************** ********** ********** ********** Domain Information ********** ********** ********** ******************************************************************************** *******************************************************************************/ /* This section defines the types associated with the domain controller. */ /* ** Domain Capabilities ** ** This definition defines the capabilities of a given domain. A domain ** may support any number of capabilities using the bit mask. ** ** Future versions of the HPI specification may define additional domain ** capabilities and associate them with currently undefined bit positions ** in the SaHpiDomainCapabilitiesT bit mask. Implementations conforming to ** this version of the HPI specification should set all undefined bit values ** to zero in the DomainCapabilities field of the SaHpiDomainInfoT structure. ** However, HPI Users should not assume undefined bit values are zero, to ** remain compatible with HPI implementations that implement future versions ** of the specification. ** ** SAHPI_DOMAIN_CAP_AUTOINSERT_READ_ONLY ** Indicates that the domain auto insert timeout value is read-only ** and may not be modified using the saHpiHotSwapAutoInsertTimeoutSet() ** function. */ typedef SaHpiUint32T SaHpiDomainCapabilitiesT; #define SAHPI_DOMAIN_CAP_AUTOINSERT_READ_ONLY \ (SaHpiDomainCapabilitiesT)0X00000001 /* ** Domain Info ** ** This structure is used to store the information regarding the domain ** including information regarding the domain reference table (DRT) and ** the resource presence table (RPT). ** ** The DomainTag field is an informational value that supplies an HPI User ** with naming information for the domain. ** ** NOTE: Regarding timestamps - If the implementation cannot supply an absolute ** timestamp, then it may supply a timestamp relative to some system-defined ** epoch, such as system boot. The value SAHPI_TIME_UNSPECIFIED indicates that ** the time of the update cannot be determined. Otherwise, If the value is less ** than or equal to SAHPI_TIME_MAX_RELATIVE, then it is relative; if it is ** greater than SAHPI_TIME_MAX_RELATIVE, then it is absolute. ** ** The GUID is used to uniquely identify a domain. A GUID value of zero is not ** valid and indicates that the domain does not have an associated GUID. */ typedef struct { SaHpiDomainIdT DomainId; /* Unique Domain Id associated with domain */ SaHpiDomainCapabilitiesT DomainCapabilities; /* Domain Capabilities */ SaHpiBoolT IsPeer; /* Indicates that this domain participates in a peer relationship. */ SaHpiTextBufferT DomainTag; /* Information tag associated with domain */ SaHpiUint32T DrtUpdateCount; /* This count is incremented any time the table is changed. It rolls over to zero when the maximum value is reached */ SaHpiTimeT DrtUpdateTimestamp; /* This timestamp is set any time the DRT table is changed. */ SaHpiUint32T RptUpdateCount; /* This count is incremented any time the RPT is changed. It rolls over to zero when the maximum value is reached */ SaHpiTimeT RptUpdateTimestamp; /* This timestamp is set any time the RPT table is changed. */ SaHpiUint32T DatUpdateCount; /* This count is incremented any time the DAT is changed. It rolls over to zero when the maximum value is reached */ SaHpiTimeT DatUpdateTimestamp; /* This timestamp is set any time the DAT is changed. */ SaHpiUint32T ActiveAlarms; /* Count of active alarms in the DAT */ SaHpiUint32T CriticalAlarms; /* Count of active critical alarms in the DAT */ SaHpiUint32T MajorAlarms; /* Count of active major alarms in the DAT */ SaHpiUint32T MinorAlarms; /* Count of active minor alarms in the DAT */ SaHpiUint32T DatUserAlarmLimit; /* Maximum User Alarms that can be added to DAT. 0=no fixed limit */ SaHpiBoolT DatOverflow; /* Set to True if there are one or more non-User Alarms that are missing from the DAT because of space limitations */ SaHpiGuidT Guid; /* GUID associated with domain.*/ } SaHpiDomainInfoT; /* ** DRT Entry ** ** This structure is used to store the DRT entry information. ** */ typedef struct { SaHpiEntryIdT EntryId; SaHpiDomainIdT DomainId; /* The Domain ID referenced by this entry */ SaHpiBoolT IsPeer; /* Indicates if this domain reference is a peer. */ } SaHpiDrtEntryT; /* ** DAT Entry ** ** This structure is used to store alarm information in the DAT ** */ typedef SaHpiEntryIdT SaHpiAlarmIdT; typedef struct { SaHpiAlarmIdT AlarmId; /* Alarm Id */ SaHpiTimeT Timestamp; /* Time when alarm added to DAT */ SaHpiSeverityT Severity; /* Severity of alarm */ SaHpiBoolT Acknowledged; /* Acknowledged flag */ SaHpiConditionT AlarmCond; /* Detailed alarm condition */ } SaHpiAlarmT; /******************************************************************************* ******************************************************************************** ********** ********** ********** Event Log ********** ********** ********** ******************************************************************************** *******************************************************************************/ /* This section defines the types associated with the Event Log. */ /* ** Event Log Information ** ** The Entries entry denotes the number of active entries contained in the Event ** Log. ** The Size entry denotes the total number of entries the Event Log is able to ** hold. ** The UserEventMaxSize entry indicates the maximum size of the text buffer ** data field in an HPI User event that is supported by the Event Log ** implementation. If the implementation does not enforce a more restrictive ** data length, it should be set to SAHPI_MAX_TEXT_BUFFER_LENGTH. ** The UpdateTimestamp entry denotes the time of the last update to the Event ** Log. ** The CurrentTime entry denotes the Event Log's idea of the current time; i.e ** the timestamp that would be placed on an entry if it was added now. ** The Enabled entry indicates whether the Event Log is enabled. If the Event ** Log is "disabled" no events generated within the HPI implementation are ** added to the Event Log. Events may still be added to the Event Log with ** the saHpiEventLogEntryAdd() function. When the Event Log is "enabled" ** events may be automatically added to the Event Log as they are generated ** in a resource or a domain, however, it is implementation-specific which ** events are automatically added to any Event Log. ** The OverflowFlag entry indicates the Event Log has overflowed. Events have ** been dropped or overwritten due to a table overflow. ** The OverflowAction entry indicates the behavior of the Event Log when an ** overflow occurs. ** The OverflowResetable entry indicates if the overflow flag can be ** cleared by an HPI User with the saHpiEventLogOverflowReset() function. */ typedef enum { SAHPI_EL_OVERFLOW_DROP, /* New entries are dropped when Event Log is full*/ SAHPI_EL_OVERFLOW_OVERWRITE, /* Event Log overwrites existing entries when Event Log is full */ SAHPI_EL_OVERFLOW_ACTION_MAX_TYPE = SAHPI_EL_OVERFLOW_OVERWRITE } SaHpiEventLogOverflowActionT; typedef struct { SaHpiUint32T Entries; SaHpiUint32T Size; SaHpiUint32T UserEventMaxSize; SaHpiTimeT UpdateTimestamp; SaHpiTimeT CurrentTime; SaHpiBoolT Enabled; SaHpiBoolT OverflowFlag; SaHpiBoolT OverflowResetable; SaHpiEventLogOverflowActionT OverflowAction; } SaHpiEventLogInfoT; /* ** Event Log Capabilities ** ** A value of the following type, SaHpiEventLogCapabilitiesT, is returned by ** the saHpiEventLogCapabilitiesGet() function. It is defined as a 32-bit ** value with individual bits representing various optional capabilities ** provided by specific event logs in an HPI implementation. A separate ** value is returned for each event log maintained by an HPI implementation, ** so different event logs may have different capabilities. ** ** For each bit value defined below, if the event log supports the ** corresponding capability, the bit is set to "1" in the value returned ** by saHpiEventLogCapabilitiesGet(). If the event log does not support the ** corresponding capability, the bit is set to "0". ** ** Future versions of the HPI specification may define additional event log ** capabilities and associate them with currently undefined bit positions ** in the SaHpiEventLogCapabilitiesT bit mask. Implementations conforming to ** this version of the HPI specification should set all undefined bit values ** to zero in the SaHpiEentLogCapabilitiesT value for all event logs. ** However, HPI Users should not assume undefined bit values are zero, to ** remain compatible with HPI implementations that implement future versions ** of the specification. ** ** ** The optional event log capabilities, and the corresponding bit values are: ** ** SAHPI_EVTLOG_CAPABILITY_ENTRY_ADD ** The saHpiEventLogEntryAdd() function may be used to add events to the ** event log. Note that this capability only addresses whether ** users can add entries directly to the event log via the ** saHpiEventLogEntryAdd() function. Even without this capability, user ** events added to a domain via the saHpiEventAdd() function may be added ** to an event log by the HPI implementation. ** SAHPI_EVTLOG_CAPABILITY_CLEAR ** The saHpiEventLogClear() function may be used to clear the event log. ** SAHPI_EVTLOG_CAPABILITY_TIME_SET ** The saHpiEventLogTimeSet() function may be used to set the event log ** clock. ** SAHPI_EVTLOG_CAPABILITY_STATE_SET ** The saHpiEventLogStateSet() function may be used to enable or disable ** automatic logging of events in the event log. ** SAHPI_EVTLOG_CAPABILITY_OVERFLOW_RESET ** The saHpiEventLogOverflowReset() function may be used to clear the ** OverflowFlag in the event log info record. ** */ typedef SaHpiUint32T SaHpiEventLogCapabilitiesT; #define SAHPI_EVTLOG_CAPABILITY_ENTRY_ADD (SaHpiEventLogCapabilitiesT)0x00000001 #define SAHPI_EVTLOG_CAPABILITY_CLEAR (SaHpiEventLogCapabilitiesT)0x00000002 #define SAHPI_EVTLOG_CAPABILITY_TIME_SET (SaHpiEventLogCapabilitiesT)0x00000004 #define SAHPI_EVTLOG_CAPABILITY_STATE_SET (SaHpiEventLogCapabilitiesT)0x00000008 #define SAHPI_EVTLOG_CAPABILITY_OVERFLOW_RESET \ (SaHpiEventLogCapabilitiesT)0x00000010 /* ** Event Log Entry ** These types define the Event Log entry. */ typedef SaHpiUint32T SaHpiEventLogEntryIdT; /* Reserved values for Event Log entry IDs */ #define SAHPI_OLDEST_ENTRY (SaHpiEventLogEntryIdT)0x00000000 #define SAHPI_NEWEST_ENTRY (SaHpiEventLogEntryIdT)0xFFFFFFFF #define SAHPI_NO_MORE_ENTRIES (SaHpiEventLogEntryIdT)0xFFFFFFFE typedef struct { SaHpiEventLogEntryIdT EntryId; /* Entry ID for record */ SaHpiTimeT Timestamp; /* Time at which the event was placed in the Event Log. If less than or equal to SAHPI_TIME_MAX_RELATIVE, then it is relative; if it is greater than SAHPI_TIME_ MAX_RELATIVE, then it is absolute. */ SaHpiEventT Event; /* Logged Event */ } SaHpiEventLogEntryT; /******************************************************************************* ******************************************************************************** ********** ********** ********** Initialization and Finalization ********** ********** ********** ******************************************************************************** *******************************************************************************/ /* ** Options are passed in using the following structure. The OptionId is set ** to the particular option, and IntVal and PointerVal are set based on the ** requirements of the particular option. See the specific options for details. */ typedef struct { SaHpiUint32T OptionId; union { SaHpiInt32T IntVal; void *PointerVal; } u; } SaHpiInitOptionT; /* ** An implementation may define OEM options. For an OEM option, OptionId ** must be greater than or equal to the following value: */ #define SA_HPI_INITOPTION_FIRST_OEM 0x40000000U /* ** Provide a function to create threads for the library. A library ** implementation may create threads for internal use; programs may need to ** monitor these threads or set their priority. This option allows the user ** to pass a function of type SaHpiCreateThreadFuncT with the PointerVal field; ** if this option is specified, the library will use only this function to create ** threads. ** ** When the function of type SaHpiCreateThreadFuncT is called, ** it should create a new thread, and from that thread, call the function ** specified by the StartFunction parameter, and providing in this call ** the FunctionData parameter. ** The return value of StartFunction is not used; it is provided only for ** compatibility with some operating systems. ** ** All threads will return when saHpiShutdown() is called. Threads may return at ** any other time; this is not an error. ** ** This option cannot fail, so it has no error codes. */ #define SA_HPI_INITOPTION_HANDLE_CREATE_THREAD 1 typedef SaErrorT (*SaHpiCreateThreadFuncT)(void *(*StartFunction)(void *), void *FunctionData); /******************************************************************************* ** ** Name: saHpiVersionGet() ** ** Description: ** This function returns the version identifier of the SaHpi specification ** version supported by the HPI implementation. ** ** Parameters: ** None. ** ** Return Value: ** The interface version identifier, of type SaHpiVersionT is returned. ** ** Remarks: ** This function differs from all other interface functions in that it returns ** the version identifier rather than a standard return code. This is because ** the version itself is necessary for an HPI User to properly interpret ** subsequent API return codes. Thus, the saHpiVersionGet() function returns ** the interface version identifier unconditionally. ** ** This function returns the value of the header file symbol ** SAHPI_INTERFACE_VERSION in the SaHpi.h header file used when the library ** was compiled. An HPI User may compare the returned value to the ** SAHPI_INTERFACE_VERSION symbol in the SaHpi.h header file used by the ** calling program to determine if the accessed library is compatible with the ** calling program. ** ** An HPI implementation may be designed to support multiple versions of the ** specification. In such a case, the value returned shall be the latest ** supported version of the specification. ** *******************************************************************************/ SaHpiVersionT SAHPI_API saHpiVersionGet ( void ); /******************************************************************************* ** ** Name: saHpiInitialize() ** ** Description: ** This function allows an HPI User to initialize an HPI library. The usage ** of this function is not mandatory; however, if it is used, it must be ** invoked when the library is in an initial state, that is, before any other ** HPI function has been called or after saHpiFinalize() has been called. ** This function allows aspects of the HPI library to be controlled. The ** options themselves are defined in Section 8.29. ** ** Parameters: ** RequestedVersion - [in] The version of the specification to which the HPI ** User complies. ** NumOptions - [in] The number of options in the Options array. ** Options - [in/out] An array of option information. The user passes ** option-specified information in this field if the option requires it. ** If information is returned to the user, it is also done through this ** field. If no options are required or supplied, this parameter may be ** NULL. ** FailedOption - [out] If this function returns SA_ERR_HPI_INVALID_DATA, this ** parameter will be set to the index of the first invalid option. Passing ** in NULL is valid. In this case, the function will operate normally, but ** if the function returns SA_ERR_HPI_INVALID_DATA, the user will not know ** which option failed. ** OptionError - [out] If this function returns SA_ERR_HPI_INVALID_DATA, this ** parameter will be set to an option-specific error code. Passing in NULL ** is valid. In this case; the function will operate normally, but if the ** function returns SA_ERR_HPI_INVALID_DATA, the user will not know the ** specific reason for the failure. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_UNSUPPORTED_API is returned if the HPI Library does not support ** the RequestedVersion. ** SA_ERR_HPI_INVALID_PARAMS is returned if the Options array is passed in as ** NULL and NumOptions is not zero. ** SA_ERR_HPI_INVALID_DATA is returned if an option has an invalid OptionID, ** or if a parameter in an option is not valid. ** SA_ERR_HPI_INVALID_REQUEST is returned if the HPI library is not in initial ** state. ** ** Remarks: ** It is not mandatory for the HPI User to call this function before using the ** HPI library. If the function is not called, the library will make ** reasonable assumptions for the options available. ** ** If this function returns an error, the library's state will not be ** modified. ** ** The FailedOption and OptionError parameters will be updated if the function ** returns SA_ERR_HPI_INVALID_PARAMS; otherwise, the library will not modify ** FailedOption or OptionError. This overrides the rule described in Section ** 4.3. ** ** The RequestedVersion parameter does not have to match the version returned ** by saHpiVersionGet(). Because all versions of the specification with the ** same compatibility level identifier are backward compatible, the ** RequestedVersion may be any earlier version of the specification with the ** same compatibility level, and the library shall accept the version. For ** example, if the library supports B.03.01, it shall accept users specifying ** a RequestedVersion of B.01.01 or B.02.01. ** ** An HPI implementation may accept a RequestedVersion that is not backward ** compatible with the version returned by saHpiVersionGet(). If the library ** does this, all API functions shall work as specified in the ** RequestedVersion, including semantics and data structure layout. Using API ** functions, constants, or semantics defined in versions later than the ** RequestedVersion may result in undefined behavior. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiInitialize ( SAHPI_IN SaHpiVersionT RequestedVersion, SAHPI_IN SaHpiUint32T NumOptions, SAHPI_INOUT SaHpiInitOptionT *Options, SAHPI_OUTNN SaHpiUint32T *FailedOption, SAHPI_OUTNN SaErrorT *OptionError ); /******************************************************************************* ** ** Name: saHpiFinalize() ** ** Description: ** This function allows an HPI User to return the library to its initial ** state. ** ** Parameters: ** None. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_INVALID_REQUEST is returned if the HPI library is already in ** initial state. ** ** Remarks: ** Calling this function is not mandatory. The HPI User can just shut down ** without calling it. ** ** This function will return the library to the initial state at startup. All ** sessions will be closed by this function. ** ** ** ** ** ** ** ** ** *******************************************************************************/ SaErrorT SAHPI_API saHpiFinalize ( void ); /******************************************************************************* ** ** Name: saHpiSessionOpen() ** ** Description: ** This function opens an HPI session for a given domain and set of security ** characteristics (future). ** ** Parameters: ** DomainId - [in] Domain identifier of the domain to be accessed by the HPI ** User. A domain identifier of SAHPI_UNSPECIFIED_DOMAIN_ID requests that a ** session be opened to a default domain. ** SessionId - [out] Pointer to a location to store an identifier for the ** newly opened session. This identifier is used for subsequent access to ** domain resources and events. ** SecurityParams - [in] Pointer to security and permissions data structure. ** This parameter is reserved for future use, and must be set to NULL. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_INVALID_DOMAIN is returned if no domain matching the specified ** domain identifier exists. ** SA_ERR_HPI_INVALID_PARAMS is returned if: ** * A non-NULL SecurityParams pointer is passed. ** * The SessionId pointer is passed in as NULL. ** SA_ERR_HPI_OUT_OF_SPACE is returned if no more sessions can be opened. ** ** Remarks: ** None. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiSessionOpen ( SAHPI_IN SaHpiDomainIdT DomainId, SAHPI_OUT SaHpiSessionIdT *SessionId, SAHPI_IN void *SecurityParams ); /******************************************************************************* ** ** Name: saHpiSessionClose() ** ** Description: ** This function closes an HPI session. After closing a session, the SessionId ** is no longer valid. ** ** Parameters: ** SessionId - [in] Session identifier previously obtained using ** saHpiSessionOpen(). ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** ** Remarks: ** None. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiSessionClose ( SAHPI_IN SaHpiSessionIdT SessionId ); /******************************************************************************* ** ** Name: saHpiDiscover() ** ** Description: ** This function requests the HPI implementation service to update information ** about resources and domains that have recently been added to the system or ** removed from the system. This function also updates RPT entries for ** resources that have changed 'failed' status. ** ** An HPI implementation may exhibit latency between when hardware changes ** occur and when the domain DRT and RPT are updated. To overcome this ** latency, the saHpiDiscover() function may be called. When this function ** returns, the DRT and RPT should be updated to reflect the current system ** configuration and status. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** ** Remarks: ** The saHpiDiscover() function is only meant to overcome latencies between ** actual hardware changes and the time it takes for them to get reflected ** into the DRT and RPT, and it should be used as such. ** ** It should be noted that the RPT is not dependent on the saHpiDiscover() ** function to be populated, and it is not required to call this function to ** discover Resources in a Domain after opening a Session. The HPI User is ** expected follow the procedure described in Section 3.5 - Discovery to ** gather information about the Domain after a Session has been opened. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiDiscover ( SAHPI_IN SaHpiSessionIdT SessionId ); /******************************************************************************* ** ** Name: saHpiDomainInfoGet() ** ** Description: ** This function is used for requesting information about the domain, the ** Domain Reference Table (DRT), the Resource Presence Table (RPT), and the ** Domain Alarm Table (DAT), such as table update counters and timestamps, and ** the unique domain identifier associated with the domain. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** DomainInfo - [out] Pointer to the information describing the domain and ** DRT. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_INVALID_PARAMS is returned if the DomainInfo pointer is passed ** in as NULL. ** ** Remarks: ** None. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiDomainInfoGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_OUT SaHpiDomainInfoT *DomainInfo ); /******************************************************************************* ** ** Name: saHpiDrtEntryGet() ** ** Description: ** This function retrieves domain information for the specified entry of the ** DRT. This function allows an HPI User to read the DRT entry-by-entry. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** EntryId - [in] Identifier of the DRT entry to retrieve. Reserved EntryId ** values: ** * SAHPI_FIRST_ENTRY Get first entry ** * SAHPI_LAST_ENTRY Reserved as delimiter for end of list. Not a valid ** entry identifier. ** NextEntryId - [out] Pointer to location to store the EntryId of next entry ** in DRT. ** DrtEntry - [out] Pointer to the structure to hold the returned DRT entry. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_NOT_PRESENT is returned if the: ** * Entry identified by EntryId is not present. ** * EntryId is SAHPI_FIRST_ENTRY and the DRT is empty. ** SA_ERR_HPI_INVALID_PARAMS is returned if the: ** * DrtEntry pointer is passed in as NULL. ** * NextEntryId pointer is passed in as NULL. ** * EntryId is an invalid reserved value such as SAHPI_LAST_ENTRY. ** ** Remarks: ** If the EntryId parameter is set to SAHPI_FIRST_ENTRY, the first entry in ** the DRT is returned. When an entry is successfully retrieved, NextEntryId ** is set to the identifier of the next valid entry; however, when the last ** entry has been retrieved, NextEntryId is set to SAHPI_LAST_ENTRY. To ** retrieve an entire list of entries, call this function first with an ** EntryId of SAHPI_FIRST_ENTRY and then use the returned NextEntryId in the ** next call. Proceed until the NextEntryId returned is SAHPI_LAST_ENTRY. ** ** If an HPI User has not subscribed to receive events and a DRT entry is ** added while the DRT is being read, that new entry may be missed. The ** update counter provides a means for insuring that no domains are missed ** when stepping through the DRT. To use this feature, an HPI User should call ** saHpiDomainInfoGet() to get the update counter value before retrieving the ** first DRT entry. After reading the last entry, the HPI User should again ** call saHpiDomainInfoGet() to get the update counter value. If the update ** counter has not been incremented, no new entries have been added. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiDrtEntryGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiEntryIdT EntryId, SAHPI_OUT SaHpiEntryIdT *NextEntryId, SAHPI_OUT SaHpiDrtEntryT *DrtEntry ); /******************************************************************************* ** ** Name: saHpiDomainTagSet() ** ** Description: ** This function allows an HPI User to set a descriptive tag for a particular ** domain. The domain tag is an informational value that supplies an HPI User ** with naming information for the domain. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** DomainTag - [in] Pointer to SaHpiTextBufferT containing the domain tag. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_INVALID_PARAMS is returned if the SaHpiTextBufferT structure ** passed as DomainTag is not valid. This would occur when: ** * The DataType is not one of the enumerated values for that type, or ** * The data field contains characters that are not legal according to the ** value of DataType, or ** * The Language is not one of the enumerated values for that type when the ** DataType is SAHPI_TL_TYPE_UNICODE or SAHPI_TL_TYPE_TEXT. ** SA_ERR_HPI_INVALID_PARAMS is returned if the DomainTag pointer is passed in ** as NULL. ** ** Remarks: ** The HPI implementation provides an appropriate default value for the domain ** tag; this function is provided so that an HPI User can override the ** default, if desired. The value of the domain tag may be retrieved from the ** domain's information structure. ** ** The domain tag is not necessarily persistent and may return to its default ** value if the domain controller function for the domain restarts. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiDomainTagSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiTextBufferT *DomainTag ); /******************************************************************************* ** ** Name: saHpiRptEntryGet() ** ** Description: ** This function retrieves resource information for the specified entry of the ** resource presence table. This function allows an HPI User to read the RPT ** entry-by-entry. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** EntryId - [in] Identifier of the RPT entry to retrieve. Reserved EntryId ** values: ** * SAHPI_FIRST_ENTRY Get first entry. ** * SAHPI_LAST_ENTRY Reserved as delimiter for end of list. Not a valid ** entry identifier. ** NextEntryId - [out] Pointer to the location to store the EntryId of next ** entry in RPT. ** RptEntry - [out] Pointer to the structure to hold the returned RPT entry. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_NOT_PRESENT is returned when the: ** * Entry identified by EntryId is not present. ** * EntryId is SAHPI_FIRST_ENTRY and the RPT is empty. ** SA_ERR_HPI_INVALID_PARAMS is returned if the: ** * RptEntry pointer is passed in as NULL. ** * NextEntryId pointer is passed in as NULL. ** * EntryId is an invalid reserved value such as SAHPI_LAST_ENTRY. ** ** Remarks: ** If the EntryId parameter is set to SAHPI_FIRST_ENTRY, the first entry in ** the RPT is returned. When an entry is successfully retrieved, NextEntryId ** is set to the identifier of the next valid entry; however, when the last ** entry has been retrieved, NextEntryId is set to SAHPI_LAST_ENTRY. To ** retrieve an entire list of entries, call this function first with an ** EntryId of SAHPI_FIRST_ENTRY, and then use the returned NextEntryId in the ** next call. Proceed until the NextEntryId returned is SAHPI_LAST_ENTRY. ** ** At initialization, an HPI User may not wish to receive HPI events, since ** the context of the events, as provided by the RPT, is not known. In this ** instance, if a FRU is inserted into the system while the RPT is being read ** entry by entry, the resource associated with that FRU may be missed. (Keep ** in mind that there is no specified ordering for the RPT entries.) The ** update counter provides a means for insuring that no resources are missed ** when stepping through the RPT. To use this feature, an HPI User should ** invoke saHpiDomainInfoGet() to obtain the update counter value before ** retrieving the first RPT entry. After reading the last entry, an HPI User ** should again invoke the saHpiDomainInfoGet(). If the update counter has not ** changed, no new records have been added. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiRptEntryGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiEntryIdT EntryId, SAHPI_OUT SaHpiEntryIdT *NextEntryId, SAHPI_OUT SaHpiRptEntryT *RptEntry ); /******************************************************************************* ** ** Name: saHpiRptEntryGetByResourceId() ** ** Description: ** This function retrieves resource information from the resource presence ** table for the specified resource using its ResourceId. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** RptEntry - [out] Pointer to structure to hold the returned RPT entry. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_INVALID_PARAMS is returned if the RptEntry pointer is passed in ** as NULL. ** ** Remarks: ** Typically at start-up, the RPT is read entry-by-entry, using ** saHpiRptEntryGet(). From this, an HPI User can establish the set of ** ResourceIds to use for future calls to the HPI functions. ** ** However, there may be other ways of learning ResourceIds without first ** reading the RPT. For example, resources may be added to the domain while ** the system is running in response to a hot swap action. When a resource is ** added, the application receives a hot swap event containing the ResourceId ** of the new resource. The application may then want to search the RPT for ** more detailed information on the newly added resource. In this case, the ** ResourceId can be used to locate the applicable RPT entry information. ** ** Note that saHpiRptEntryGetByResourceId() is valid in any hot swap state, ** except for SAHPI_HS_STATE_NOT_PRESENT. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiRptEntryGetByResourceId ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiRptEntryT *RptEntry ); /******************************************************************************* ** ** Name: saHpiResourceSeveritySet() ** ** Description: ** This function allows an HPI User to set the severity level applied to an ** event issued if a resource unexpectedly becomes unavailable to the HPI. A ** resource may become unavailable for several reasons including: ** ** * The FRU associated with the resource is no longer present in the system ** (a surprise extraction has occurred.) ** ** * A catastrophic failure has occurred. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** Severity - [in] Severity level of event issued when the resource ** unexpectedly becomes unavailable to the HPI. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_INVALID_PARAMS is returned when the value for Severity is not ** one of the valid enumerated values for this type, or it is equal to ** SAHPI_ALL_SEVERITIES. ** ** Remarks: ** Since the resource severity is contained within an RPT entry, its scope is ** limited to a single domain. A resource that exists in more than one domain ** has independent resource severity values within each domain. ** ** The HPI implementation provides a default value for the resource severity, ** which may vary by resource, when an RPT entry is added to a domain; an HPI ** User can override this default value by use of this function. ** ** If a resource is removed from, then re-added to the RPT (e.g., because of a ** hot swap action), the HPI implementation may reset the value of the ** resource severity. ** ** ** *******************************************************************************/ SaErrorT SAHPI_API saHpiResourceSeveritySet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSeverityT Severity ); /******************************************************************************* ** ** Name: saHpiResourceTagSet() ** ** Description: ** This function allows an HPI User to set the resource tag of an RPT entry ** for a particular resource. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** ResourceTag - [in] Pointer to SaHpiTextBufferT containing the resource tag. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_INVALID_PARAMS is returned if the SaHpiTextBufferT structure ** passed as ResourceTag is not valid. This would occur when: ** * The DataType is not one of the enumerated values for that type, or ** * The data field contains characters that are not legal according to the ** value of DataType, or ** * The Language is not one of the enumerated values for that type when the ** DataType is SAHPI_TL_TYPE_UNICODE or SAHPI_TL_TYPE_TEXT. ** SA_ERR_HPI_INVALID_PARAMS is returned if the ResourceTag pointer is passed ** in as NULL. ** ** Remarks: ** The resource tag is a data field within an RPT entry available to an HPI ** User for associating application specific data with a resource. HPI User ** supplied data is purely informational and is not used by the HPI ** implementation, domain, or associated resource. For example, an HPI User ** can set the resource tag to a "descriptive" value, which can be used to ** identify the resource in messages to a human operator. ** ** Since the resource tag is contained within an RPT entry, its scope is ** limited to a single domain. A resource that exists in more than one domain ** has independent resource tags within each domain. ** ** The HPI implementation provides a default value for the resource tag when ** an RPT entry is added to a domain; this function is provided so that an HPI ** User can override the default, if desired. The value of the resource tag ** may be retrieved from the resource's RPT entry. ** ** If a resource is removed from, then re-added to the RPT (e.g., because of a ** hot swap action), the HPI implementation may reset the value of the ** resource tag. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiResourceTagSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiTextBufferT *ResourceTag ); /******************************************************************************* ** ** Name: saHpiMyEntityPathGet() ** ** Description: ** This function returns the EntityPath of the entity upon which the HPI User ** is running. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** EntityPath - [out] Pointer to location to hold the returned EntityPath. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_INVALID_PARAMS is returned if the EntityPath pointer is passed ** in as NULL. ** SA_ERR_HPI_UNKNOWN is returned if the appropriate EntityPath to return ** cannot be determined. ** ** Remarks: ** To support user authentication, an HPI User must have an open session to ** call this function, but the entity path returned will be the same ** regardless of which domain is associated with the session. Thus, it is ** possible that the entity path returned may not be manageable through the ** domain associated with the passed SessionId. When there are multiple ** domains, an HPI User may call saHpiMyEntityPathGet() using a session open ** to any domain to get the entity path, then call saHpiGetIdByEntityPath() on ** all available domains to find management capabilities for that entity. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiMyEntityPathGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_OUT SaHpiEntityPathT *EntityPath ); /******************************************************************************* ** ** Name: saHpiResourceIdGet() ** ** Description: ** Note: this function should not be used in new HPI User programs. The ** function saHpiMyEntityPathGet() should be used instead. ** ** This function returns the ResourceId of the resource associated with the ** entity upon which the HPI User is running. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [out] Pointer to location to hold the returned ResourceId. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_INVALID_PARAMS is returned if the ResourceId pointer is passed ** in as NULL. ** SA_ERR_HPI_NOT_PRESENT is returned if the entity the HPI User is running on ** is not manageable in the addressed domain. ** SA_ERR_HPI_UNKNOWN is returned if the domain controller cannot determine an ** appropriate response. That is, there may be an appropriate ResourceId in ** the domain to return, but it cannot be determined. ** ** Remarks: ** As in some cases (some described below), it is not well defined which ** ResourceId should be returned by this function, it should not be used in ** new HPI User programs. The function must be supported in HPI ** implementations for backward compatibility with previous versions of the ** HPI specification, but HPI Users should use the saHpiMyEntityPathGet() ** function instead. With the entity path returned by that function, other HPI ** calls can be made to find specific management capabilities. ** ** This function must be issued within a session to a domain that includes a ** resource associated with the entity upon which the HPI User is running, or ** the SA_ERR_HPI_NOT_PRESENT return is issued. ** ** Since entities are contained within other entities, there may be multiple ** possible resources that could be returned to this call. For example, if ** there is a ResourceId associated with a particular compute blade upon which ** the HPI User is running, and another ResourceId associated with the chassis ** that contains the compute blade, either could logically be returned as an ** indication of a resource associated with the entity upon which the HPI User ** was running. The function should return the ResourceId of the "smallest" ** resource that is associated with the HPI User. So, in the example above, ** the function should return the ResourceId of the compute blade. ** ** If there are multiple resources that could be returned, each with the same ** entity path, it is implementation-specific which one is selected. However, ** in making the selection, the implementation should consider what management ** capabilities are associated with each resource. Preference may be given, ** for example, to a resource that provides a Watchdog Timer or managed hot ** swap capability for the entity, as these are capabilities that are likely ** to be of particular interest to HPI Users running on the entity itself. ** ** When the function has returned the ResourceId, the HPI User may issue ** further HPI calls using that ResourceId to learn the type of resource that ** has been identified. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiResourceIdGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_OUT SaHpiResourceIdT *ResourceId ); /******************************************************************************* ** ** Name: saHpiGetIdByEntityPath() ** ** Description: ** This function, given an entity path, retrieves the ResourceId of a Resource ** that provides management access to the indicated entity. It can also be ** used to find a management instrument (Sensor, Control, DIMI, FUMI, etc.) ** associated with the entity if the instrument type is provided. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** EntityPath - [in] EntityPath of entity for which resources or management ** instruments are being searched. ** InstrumentType - [in] Type of management instrument to find. The instrument ** type is designated by setting this value to the corresponding RDR type. ** It may be set to SAHPI_NO_RECORD to search for resources that provide ** any management access to the entity. For more information, see Remarks. ** InstanceId - [in/out] Pointer to the instance number of the resource or ** management instrument associated with the entity path to be returned. On ** return, this value is updated to the instance number of the next ** resource or management instrument associated with the entity path, or to ** SAHPI_LAST_ENTRY if there are no more. Reserved InstanceId values: ** * SAHPI_FIRST_ENTRY Get first match that is associated with EntityPath ** and InstrumentType. ** * SAHPI_LAST_ENTRY Reserved as delimiter for end of list. Not a valid ** entry identifier. ** ResourceId - [out] Pointer to a location to store the ResourceId of a ** resource found that provides management access to the designated entity. ** If InstrumentType is not SAHPI_NO_RECORD then a resource is selected ** only if it contains a management instrument of the appropriate type for ** the designated entity. ** InstrumentId - [out] Pointer to a location to store the Instrument Id ** (Sensor number, Control number, etc.) of a management instrument of the ** selected type that provides management access to the designated entity. ** Ignored if InstrumentType is SAHPI_NO_RECORD. ** RptUpdateCount - [out] Pointer to a location to store the current value of ** the RptUpdateCount field from the domain info data for the domain. This ** value is stored when the function returns either SA_OK or ** SA_ERR_HPI_NOT_PRESENT. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_INVALID_PARAMS is returned if the: ** * InstanceId pointer is passed in as NULL. ** * ResourceId pointer is passed in as NULL. ** * InstanceId points to an invalid reserved value such as SAHPI_LAST_ENTRY. ** * InstrumentId pointer is passed in as NULL and InstrumentType is not ** SAHPI_NO_RECORD. ** * RptUpdateCount pointer is passed in as NULL ** SA_ERR_HPI_NOT_PRESENT is returned if there is not an appropriate ** ResourceId or InstrumentId that can be returned based on the passed ** input parameters. For more information, see Remarks. ** ** Remarks: ** This function can be used two ways. ** ** If InstrumentType is set to SAHPI_NO_RECORD, then it returns the ResourceId ** of a resource that provides management access to the requested entity. A ** resource provides management access to an entity if any management ** instrument contained in that resource is associated with the entity, or if ** the resource's other (non-management-instrument) capabilities are ** associated with the entity. In other words, given an entity path, a ** resource is found to provide management access to the entity if the entity ** path in the RPT entry for the resource matches, or if the entity path in ** any RDR contained in the resource matches. Entity paths must match ** exactly. ** ** If InstrumentType is set to indicate a particular type of management ** instrument, then the function returns both the ResourceId and InstrumentId ** (e.g., Sensor number, Control number, DIMI number, FUMI number, etc.) for a ** management instrument of the requested type that provides management access ** to the requested entity. Entity paths must match exactly. In this case, ** it only returns the ResourceId of a resource that has a management ** instrument of the requested type associated with the requested entity, and ** it may return the same ResourceId several times, each time with a different ** InstrumentId. ** ** For any entity, it is possible that there are multiple resources that ** provide management access, or that there are multiple management ** instruments of the requested type in one or more resources providing ** management access. To retrieve all appropriate ResourceId values or all ** appropriate ResourceId/InstrumentId pairs, multiple calls to ** saHpiGetIdByEntityPath() must be made. The first call should set ** InstanceId to SAHPI_FIRST_ENTRY. On subsequent calls, the InstanceId value ** set upon return can be passed as input on a subsequent call to get the next ** appropriate ResourceId or ResourceId/InstrumentId pair. When the last ** appropriate ResourceId or ResourceId/InstrumentId pair is returned, the ** returned InstanceId value is SAHPI_LAST_ENTRY. The order in which ** ResourceId or ResourceId/InstrumentId pairs are returned is ** implementation-specific. ** ** It is possible that resources in a domain may be added, removed, or updated ** between successive calls to this function. As a result, the InstanceId ** returned in a previous call to this function may become invalid. The ** RptUpdateCount is provided to notify the HPI User of this condition. The ** returned RptUpdateCount value should be checked against the last returned ** value every time this function is called with InstanceId other than ** SAHPI_FIRST_ENTRY. If it differs, then the RPT or one of the resources ** referred to by the RPT has been updated and the search should be restarted ** with InstanceId set to SAHPI_FIRST_ENTRY. The HPI User should also check ** RptUpdateCount when SA_ERR_HPI_NOT_PRESENT is returned while calling this ** function with InstanceId set to a value other than SAHPI_FIRST_ENTRY. If ** it has changed from the previous call, the error return is probably due to ** the change in the RPT, and the search process should be restarted. ** ** The values returned by this function for ResourceId, InstrumentId, and ** InstanceId are only valid if: ** ** a) the function was called with InstanceId equal to SAHPI_FIRST_ENTRY, or ** ** b) the function was called with InstanceId equal to the value returned by a ** previous call to the function on the same session, passing the same values ** for EntityPath and InstrumentType, and with the same value for ** RptUpdateCount returned on both calls. ** ** In all other cases, even if the function returns SA_OK, the values returned ** for ResourceId, InstrumentId, and InstanceId are not valid, and should be ** ignored. ** ** ** *******************************************************************************/ SaErrorT SAHPI_API saHpiGetIdByEntityPath ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiEntityPathT EntityPath, SAHPI_IN SaHpiRdrTypeT InstrumentType, SAHPI_INOUT SaHpiUint32T *InstanceId, SAHPI_OUT SaHpiResourceIdT *ResourceId, SAHPI_OUT SaHpiInstrumentIdT *InstrumentId, SAHPI_OUT SaHpiUint32T *RptUpdateCount ); /******************************************************************************* ** ** Name: saHpiGetChildEntityPath() ** ** Description: ** This function retrieves entities that are contained within a given entity. ** The entity path of a containing entity ("parent") is passed to the function ** and the entity path of a contained entity ("child"), if available, is ** returned. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ParentEntityPath - [in] EntityPath of parent entity. ** InstanceId - [in/out] Pointer to the instance number of the child entity ** path to be returned. On return, this value is updated to the instance ** number of the next child entity path for the passed parent entity path, ** or to SAHPI_LAST_ENTRY if there are no more. Reserved InstanceId values: ** * SAHPI_FIRST_ENTRY Get first child entity for entity described by ** ParentEntityPath. ** * SAHPI_LAST_ENTRY Reserved as delimiter for end of list. Not a valid ** entry identifier. ** ChildEntityPath - [out] Pointer to the entity path of a child entity. ** RptUpdateCount - [out] Pointer to a location to store the current value of ** the RptUpdateCount field from the domain info data for the domain. This ** value is stored when the function returns SA_OK, ** SA_ERR_HPI_INVALID_DATA, or SA_ERR_HPI_NOT_PRESENT. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_INVALID_PARAMS is returned if the: ** * InstanceId pointer is passed in as NULL. ** * InstanceId points to an invalid reserved value such as SAHPI_LAST_ENTRY. ** * ChildEntityPath pointer is passed in as NULL. ** * RptUpdateCount pointer is passed in as NULL. ** SA_ERR_HPI_INVALID_DATA is returned if the entity represented by ** ParentEntityPath is not present in the current Domain Entity Tree. ** SA_ERR_HPI_NOT_PRESENT is returned when: ** * InstanceId is SAHPI_FIRST_ENTRY and no child entity for entity described ** by ParentEntityPath is present. ** * InstanceId is not SAHPI_FIRST_ENTRY and no child entity corresponding to ** InstanceId for entity described by ParentEntityPath is present. ** ** Remarks: ** This function provides access to the Domain Entity Tree for the domain ** associated with the open SessionId. Passed an entity path that identifies ** a node in the Domain Entity Tree, the function returns entity paths that ** identify the immediate children of that node; that is, the entity paths for ** entities in the Domain Entity Tree that are immediately contained by the ** entity whose entity path was passed as ParentEntityPath. ** ** For any entity path, it is possible that there are multiple immediate ** children in the Domain Entity Tree. To retrieve the entity paths for all ** children or a particular ParentEntityPath, multiple calls to ** saHpiGetChildEntityPath() must be made. On each call, the InstanceId value ** set upon return can be passed as input on a subsequent call to get the ** entity path for the next child. When the entity path for the last child of ** the passed ParentEntityPath is returned, then InstanceId is set to ** SAHPI_LAST_ENTRY. The order in which ChildEntityPath values are returned ** is implementation-specific. ** ** To retrieve the entire Domain Entity Tree, an HPI User can start by calling ** this function with an entity path containing only { { SAHPI_ROOT, 0 } } to ** retrieve children of the root node, then calling the function recursively ** for each of those children, and so forth. ** ** Resources in a domain may be added, removed, or updated between successive ** calls to this function. As a result, the Domain Entity Tree may change, ** invalidating data previously returned. The RptUpdateCount is provided to ** notify the HPI User of this condition. The returned RptUpdateCount value ** should be checked against the last returned value every time this function ** is called with InstanceId other than SAHPI_FIRST_ENTRY. If it differs, then ** the RPT or one of the resources referred to by the RPT has been updated and ** the entire sequence of calls should be restarted. The HPI User should also ** check RptUpdateCount when SA_ERR_HPI_INVALID_DATA or SA_ERR_HPI_NOT_PRESENT ** is returned while calling this function with InstanceId set to a value ** other than SAHPI_FIRST_ENTRY. If it has changed from the previous call, ** the error return is probably due to the change in the RPT, and the search ** entire sequence of calls should be restarted. ** ** The values returned by this function for ChildEntityPath, and InstanceId ** are only valid if: ** ** a) the function was called with InstanceId equal to SAHPI_FIRST_ENTRY, or ** if ** ** b) the function was called with InstanceId equal to the value returned by a ** previous call to the function on the same session, passing the same value ** for ParentEntityPath, and with the same value for RptUpdateCount returned ** on both calls. ** ** In all other cases, even if the function returns SA_OK, the values returned ** for ChildEntityPath and InstanceId are not valid, and should be ignored. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiGetChildEntityPath ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiEntityPathT ParentEntityPath, SAHPI_INOUT SaHpiUint32T *InstanceId, SAHPI_OUT SaHpiEntityPathT *ChildEntityPath, SAHPI_OUT SaHpiUint32T *RptUpdateCount ); /******************************************************************************* ** ** Name: saHpiResourceFailedRemove() ** ** Description: ** This function allows an HPI User to remove an RPT entry for a failed ** resource from the domain containing it. It can be used to remove the RPT ** entry for a resource that is not functional or has lost management access. ** If the HPI User acquires knowledge that the FRU associated with such a ** resource has been physically removed or that a non-FRU resource has been ** shut down, this function provides the means to update the RPT, so that it ** no longer contains an entry for that resource. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_NOT_PRESENT is returned if an entry for the resource identified ** by ResourceId is not present in the RPT. ** SA_ERR_HPI_INVALID_REQUEST is returned if the ResourceFailed flag in the ** resource's RPT entry is not set to True. ** ** Remarks: ** This function can be used only on resources marked as inaccessible in the ** RPT. Resources that do not have the ResourceFailed flag in their RPT entry ** set to True cannot be removed by this function. For more information on ** failed resources, see Section 3.8. ** ** When the HPI User calls this function for a failed resource, the HPI ** implementation removes the RPT entry for the failed resource and issues an ** event. The event issued depends on whether the resource has the FRU ** capability set indicating that it provides hot swap management. If it is a ** FRU resource, a "user update" hot swap event is issued for transition of ** the resource to the SAHPI_HS_STATE_NOT_PRESENT state from its last known ** state. If it is not a FRU resource, a "Resource Removed" event is issued. ** ** If a FRU resource is removed as the result of an HPI User calling this ** function, any nested resources are also removed from the RPT, and ** appropriate events are issued for those nested resources. For more ** information on nested resources, see Section 3.3. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiResourceFailedRemove ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId ); /******************************************************************************* ** ** Name: saHpiEventLogInfoGet() ** ** Description: ** This function retrieves the current number of entries in the Event Log, ** total size of the Event Log, the time of the most recent update to the ** Event Log, the current value of the Event Log's clock (that is, the ** timestamp that would be placed on an entry at this moment), the ** enabled/disabled status of the Event Log (see Section 6.4.9), the overflow ** flag, and the action taken by the Event Log if an overflow occurs. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Identifier for the Resource containing the Event Log. ** Set to SAHPI_UNSPECIFIED_RESOURCE_ID to address the Domain Event Log. ** Info - [out] Pointer to the returned Event Log information. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not have an Event ** Log capability (SAHPI_CAPABILITY_EVENT_LOG) set. Note this condition ** only applies to Resource Event Logs. Domain Event Logs are mandatory, ** and should not return this code. ** SA_ERR_HPI_INVALID_PARAMS is returned if the Info pointer is passed in as ** NULL. ** ** Remarks: ** The size field in the returned Event Log information indicates the maximum ** number of entries that can be held in the Event Log. This number should be ** constant for a particular Event Log. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiEventLogInfoGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiEventLogInfoT *Info ); /******************************************************************************* ** ** Name: saHpiEventLogCapabilitiesGet() ** ** Description: ** This function retrieves a set of flags that indicate various optional ** capabilities that may be supported by the event log. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Identifier for the Resource containing the Event Log. ** Set to SAHPI_UNSPECIFIED_RESOURCE_ID to address the Domain Event Log. ** EventLogCapabilities - [out] Pointer to a location to store the Event Log ** Capabilities value. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not have an Event ** Log capability (SAHPI_CAPABILITY_EVENT_LOG) set. Note this condition ** only applies to Resource Event Logs. Domain Event Logs are mandatory, ** and should not return this code. ** SA_ERR_HPI_INVALID_PARAMS is returned if the EventLogCapabilities pointer ** is passed in as NULL. ** ** Remarks: ** The SaHpiEventLogCapabilitiesT type is defined as an unsigned 32-bit value. ** Specific capabilities are defined as individual bits within this value. ** For each defined bit value that is set to a "1", the event log supports the ** corresponding capability. For each defined bit value that is set to a "0", ** the event log does not support the corresponding capability. Undefined ** bits in the capability value are reserved, and may be assigned to indicate ** support for other capabilities in future versions of the specification. ** ** See Section 8.28 for a definition of the event log capabilities and the ** corresponding bits in the returned EventLogCapabilities value that indicate ** support for each capability. ** ** For backward compatibility with the B.01.01 specification, the "Overflow ** Resetable" capability, represented in the returned EventLogCapabilities ** value as SAHPI_EVTLOG_CAPABILITY_OVERFLOW_RESETABLE is also represented in ** the Event Log Info record returned by saHpiEventLogInfoGet() function, in ** the OverflowResetable Boolean field. These two items should agree for a ** particular event log. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiEventLogCapabilitiesGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiEventLogCapabilitiesT *EventLogCapabilities ); /******************************************************************************* ** ** Name: saHpiEventLogEntryGet() ** ** Description: ** This function retrieves an Event Log entry. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Identifier for the Resource containing the Event Log. ** Set to SAHPI_UNSPECIFIED_RESOURCE_ID to address the Domain Event Log. ** EntryId - [in] Identifier of event log entry to retrieve. Reserved values: ** * SAHPI_OLDEST_ENTRY Oldest entry in the Event Log. ** * SAHPI_NEWEST_ENTRY Newest entry in the Event Log. ** * SAHPI_NO_MORE_ENTRIES Not valid for this parameter. Used only when ** retrieving the next and previous EntryIds. ** PrevEntryId - [out] Event Log entry identifier for the previous (older ** adjacent) entry. Reserved values: ** * SAHPI_OLDEST_ENTRY Not valid for this parameter. Used only for the ** EntryId parameter. ** * SAHPI_NEWEST_ENTRY Not valid for this parameter. Used only for the ** EntryId parameter. ** * SAHPI_NO_MORE_ENTRIES No more entries in the Event Log before the one ** referenced by the EntryId parameter. ** NextEntryId - [out] Event Log entry identifier for the next (newer ** adjacent) entry. Reserved values: ** * SAHPI_OLDEST_ENTRY Not valid for this parameter. Used only for the ** EntryId parameter. ** * SAHPI_NEWEST_ENTRY Not valid for this parameter. Used only for the ** EntryId parameter. ** * SAHPI_NO_MORE_ENTRIES No more entries in the Event Log after the one ** referenced by the EntryId parameter. ** EventLogEntry - [out] Pointer to retrieved Event Log entry. ** Rdr - [out] Pointer to structure to receive resource data record associated ** with the Event Log entry, if available. If NULL, no RDR data is ** returned. ** RptEntry - [out] Pointer to structure to receive RPT entry associated with ** the Event Log entry, if available. If NULL, no RPT entry data is ** returned. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not have an Event ** Log capability (SAHPI_CAPABILITY_EVENT_LOG) set. Note this condition ** only applies to Resource Event Logs. Domain Event Logs are mandatory, ** and should not return this code. ** SA_ERR_HPI_NOT_PRESENT is returned when: ** * The Event Log has no entries. ** * The entry identified by EntryId is not present. ** SA_ERR_HPI_INVALID_PARAMS is returned when: ** * Any of PrevEntryId, NextEntryId and EventLogEntry pointers are passed in ** as NULL. ** * SAHPI_NO_MORE_ENTRIES is passed in to EntryId. ** ** Remarks: ** The special EntryIds SAHPI_OLDEST_ENTRY and SAHPI_NEWEST_ENTRY are used to ** select the oldest and newest entries, respectively, in the Event Log being ** read. A returned NextEntryId of SAHPI_NO_MORE_ENTRIES indicates that the ** newest entry has been returned; there are no more entries going forward ** (time-wise) in the Event Log. A returned PrevEntryId of ** SAHPI_NO_MORE_ENTRIES indicates that the oldest entry has been returned. ** ** To retrieve an entire list of entries going forward (oldest entry to newest ** entry) in the Event Log, call this function first with an EntryId of ** SAHPI_OLDEST_ENTRY and then use the returned NextEntryId as the EntryId in ** the next call. Proceed until the NextEntryId returned is ** SAHPI_NO_MORE_ENTRIES. ** ** To retrieve an entire list of entries going backward (newest entry to ** oldest entry) in the Event Log, call this function first with an EntryId of ** SAHPI_NEWEST_ENTRY and then use the returned PrevEntryId as the EntryId in ** the next call. Proceed until the PrevEntryId returned is ** SAHPI_NO_MORE_ENTRIES. ** ** Event Logs may include RPT entries and resource data records associated ** with the resource and Sensor issuing an event along with the basic event ** data in the Event Log. Because the system may be reconfigured after the ** event was entered in the Event Log, this stored information may be ** important to interpret the event. If the Event Log includes logged RPT ** entries and/or RDRs, and if an HPI User provides a pointer to a structure ** to receive this information, it is returned along with the Event Log entry. ** ** If an HPI User provides a pointer for an RPT entry, but the Event Log does ** not include a logged RPT entry for the Event Log entry being returned, ** RptEntry->ResourceCapabilities is set to zero. No valid RptEntry has a ** zero Capabilities field value. ** ** If an HPI User provides a pointer for an RDR, but the Event Log does not ** include a logged RDR for the Event Log entry being returned, Rdr->RdrType ** is set to SAHPI_NO_RECORD. ** ** The EntryIds returned via the PrevEntryId and NextEntryId parameters may ** not be in sequential order, but will reflect the previous and next entries ** in a chronological ordering of the Event Log, respectively. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiEventLogEntryGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiEventLogEntryIdT EntryId, SAHPI_OUT SaHpiEventLogEntryIdT *PrevEntryId, SAHPI_OUT SaHpiEventLogEntryIdT *NextEntryId, SAHPI_OUT SaHpiEventLogEntryT *EventLogEntry, SAHPI_OUTNN SaHpiRdrT *Rdr, SAHPI_OUTNN SaHpiRptEntryT *RptEntry ); /******************************************************************************* ** ** Name: saHpiEventLogEntryAdd() ** ** Description: ** This function enables an HPI User to add entries to the Event Log. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Identifier for the Resource containing the Event Log. ** Set to SAHPI_UNSPECIFIED_RESOURCE_ID to address the Domain Event Log. ** EvtEntry - [in] Pointer to event data to write to the Event Log. The Event ** field must be of type SAHPI_ET_USER, and the Source field must be ** SAHPI_UNSPECIFIED_RESOURCE_ID. ** ** Return Value: ** SA_OK is returned if the event is successfully written in the Event Log; ** otherwise, an error code is returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not have an Event ** Log capability (SAHPI_CAPABILITY_EVENT_LOG) set. Note this condition ** only applies to Resource Event Logs. Domain Event Logs are mandatory, ** and should not return this code. ** SA_ERR_HPI_INVALID_CMD is returned if the addressed event log does not ** support this function. ** SA_ERR_HPI_INVALID_DATA is returned if the event DataLength is larger than ** that supported by the implementation and reported in the Event Log info ** record. ** SA_ERR_HPI_INVALID_PARAMS is returned if the: ** * EvtEntry pointer is passed in as NULL. ** * Event structure passed via the EvtEntry parameter is not an event of type ** SAHPI_ET_USER with the Source field set to ** SAHPI_UNSPECIFIED_RESOURCE_ID. ** * Severity field within the EvtEntry parameter is not one of the valid ** enumerated values for this type, or it is equal to SAHPI_ALL_SEVERITIES. ** * SaHpiTextBufferT structure passed as part of the User Event structure is ** not valid. This would occur when: ** * The DataType is not one of the enumerated values for that type, or ** * The data field contains characters that are not legal according to the ** value of DataType, or ** * The Language is not one of the enumerated values for that type when the ** DataType is SAHPI_TL_TYPE_UNICODE or SAHPI_TL_TYPE_TEXT. ** SA_ERR_HPI_OUT_OF_SPACE is returned if the event cannot be written to the ** Event Log because the Event Log is full, and the Event Log ** OverflowAction is SAHPI_EL_OVERFLOW_DROP. ** ** Remarks: ** This function writes an event in the addressed Event Log. Nothing else is ** done with the event. ** ** If the Event Log is full, overflow processing occurs as defined by the ** Event Log's OverflowAction setting, reported in the Event Log info record. ** If, due to an overflow condition, the event is not written, or if existing ** events are overwritten, then the OverflowFlag in the Event Log info record ** is set to True, just as it would be if an internally generated event caused ** an overflow condition. If the Event Log's OverflowAction is ** SAHPI_EL_OVERFLOW_DROP, then an error is returned (SA_ERR_HPI_OUT_OF_SPACE) ** indicating that the saHpiEventLogEntryAdd() function did not add the event ** to the Event Log. If the Event Log's OverflowAction is ** SAHPI_EL_OVERFLOW_OVERWRITE, then the saHpiEventLogEntryAdd() function ** returns SA_OK, indicating that the event was added to the Event Log, even ** though an overflow occurred as a side effect of this operation. The ** overflow may be detected by checking the OverflowFlag in the Event Log info ** record. ** ** Specific implementations of HPI may have restrictions on how much data may ** be passed to the saHpiEventLogEntryAdd() function. The Event Log info ** record reports the maximum DataLength that is supported by the Event Log ** for User Events. If saHpiEventLogEntryAdd() is called with a User Event ** that has a larger DataLength than is supported, the event is not added to ** the Event Log, and an error is returned. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiEventLogEntryAdd ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiEventT *EvtEntry ); /******************************************************************************* ** ** Name: saHpiEventLogClear() ** ** Description: ** This function erases the contents of the specified Event Log. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Identifier for the Resource containing the Event Log. ** Set to SAHPI_UNSPECIFIED_RESOURCE_ID to address the Domain Event Log. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not have an Event ** Log capability (SAHPI_CAPABILITY_EVENT_LOG) set. Note this condition ** only applies to Resource Event Logs. Domain Event Logs are mandatory, ** and should not return this code. ** SA_ERR_HPI_INVALID_CMD is returned if the addressed event log does not ** support this function. ** ** Remarks: ** The OverflowFlag field in the Event Log info record is reset when the event ** log is cleared. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiEventLogClear ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId ); /******************************************************************************* ** ** Name: saHpiEventLogTimeGet() ** ** Description: ** This function retrieves the current time from the Event Log's clock. This ** clock is used to timestamp entries written into the Event Log. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Identifier for the Resource containing the Event Log. ** Set to SAHPI_UNSPECIFIED_RESOURCE_ID to address the Domain Event Log. ** Time - [out] Pointer to the returned current Event Log time. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not have an Event ** Log capability (SAHPI_CAPABILITY_EVENT_LOG) set. Note this condition ** only applies to Resource Event Logs. Domain Event Logs are mandatory, ** and should not return this code. ** SA_ERR_HPI_INVALID_PARAMS is returned if the Time pointer is passed in as ** NULL. ** ** Remarks: ** If the implementation cannot supply an absolute time value, then it may ** supply a time relative to some system-defined epoch, such as system ** startup. If the time value is less than or equal to ** SAHPI_TIME_MAX_RELATIVE, then it is relative; if it is greater than ** SAHPI_TIME_MAX_RELATIVE, then it is absolute. The HPI implementation must ** provide valid timestamps for Event Log entries, using a default time base ** if no time has been set. Thus, the value SAHPI_TIME_UNSPECIFIED is never ** returned. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiEventLogTimeGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiTimeT *Time ); /******************************************************************************* ** ** Name: saHpiEventLogTimeSet() ** ** Description: ** This function sets the Event Log's clock, which is used to timestamp events ** written into the Event Log. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Identifier for the Resource containing the Event Log. ** Set to SAHPI_UNSPECIFIED_RESOURCE_ID to address the Domain Event Log. ** Time - [in] Time to which the Event Log clock should be set. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not have an Event ** Log capability (SAHPI_CAPABILITY_EVENT_LOG) set. Note this condition ** only applies to Resource Event Logs. Domain Event Logs are mandatory, ** and should not return this code. ** SA_ERR_HPI_INVALID_CMD is returned if the addressed event log does not ** support this function. ** SA_ERR_HPI_INVALID_PARAMS is returned when the Time parameter is set to ** SAHPI_TIME_UNSPECIFIED. ** For situations when the underlying implementation cannot represent a time ** value that is specified in Time, SA_ERR_HPI_INVALID_DATA is returned. ** ** Remarks: ** If the Time parameter value is less than or equal to ** SAHPI_TIME_MAX_RELATIVE, but not SAHPI_TIME_UNSPECIFIED, then it is ** relative; if it is greater than SAHPI_TIME_MAX_RELATIVE, then it is ** absolute. Setting this parameter to the value SAHPI_TIME_UNSPECIFIED is ** invalid and results in an error return code of SA_ERR_HPI_INVALID_PARAMS. ** ** Entries placed in the Event Log after this function is called will have ** Event Log timestamps (that is, the Timestamp field in the ** SaHpiEventLogEntryT structure) based on the new time. Setting the clock ** does not affect existing Event Log entries. If the time is set to a ** relative time, subsequent entries placed in the Event Log will have an ** Event Log timestamp expressed as a relative time; if the time is set to an ** absolute time, subsequent entries will have an Event Log timestamp ** expressed as an absolute time. ** ** This function only sets the Event Log time clock and does not have any ** direct bearing on the timestamps placed on events (that is, the Timestamp ** field in the SaHpiEventT structure), or the timestamps placed in the domain ** RPT info record. Setting the clocks used to generate timestamps other than ** Event Log timestamps is implementation-dependent, and should be documented ** by the HPI implementation provider. ** ** Some underlying implementations may not be able to handle the same relative ** and absolute time ranges, as those defined in HPI. Such limitations should ** be documented. When a time value is set in a region that is not supported ** by the implementation, an error code of SA_ERR_HPI_INVALID_DATA is ** returned. However, all HPI implementations must support setting the event ** log time to relative times in the range of 0 to the longest time since ** "startup" that is ever expected to be encountered and absolute times ** representing current time throughout the expected life of the system. See ** Section 8.1 for more details on time ranges. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiEventLogTimeSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiTimeT Time ); /******************************************************************************* ** ** Name: saHpiEventLogStateGet() ** ** Description: ** This function enables an HPI User to get the Event Log state. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Identifier for the Resource containing the Event Log. ** Set to SAHPI_UNSPECIFIED_RESOURCE_ID to address the Domain Event Log. ** EnableState - [out] Pointer to the current Event Log enable state. True ** indicates that the Event Log is enabled; False indicates that it is ** disabled. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not have an Event ** Log capability (SAHPI_CAPABILITY_EVENT_LOG) set. Note this condition ** only applies to Resource Event Logs. Domain Event Logs are mandatory, ** and should not return this code. ** SA_ERR_HPI_INVALID_PARAMS is returned if the EnableState pointer is passed ** in as NULL. ** ** Remarks: ** If the Event Log is disabled, no events generated within the HPI ** implementation are added to the Event Log. Events may still be added to ** the Event Log with the saHpiEventLogEntryAdd() function. When the Event Log ** is enabled, events may be automatically added to the Event Log as they are ** generated in a resource or a domain; however, it is implementation-specific ** which events are automatically added to any Event Log. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiEventLogStateGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiBoolT *EnableState ); /******************************************************************************* ** ** Name: saHpiEventLogStateSet() ** ** Description: ** This function enables an HPI User to set the Event Log enabled state. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Identifier for the Resource containing the Event Log. ** Set to SAHPI_UNSPECIFIED_RESOURCE_ID to address the Domain Event Log. ** EnableState - [in] Event Log state to be set. True indicates that the Event ** Log is to be enabled; False indicates that it is to be disabled. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not have an Event ** Log capability (SAHPI_CAPABILITY_EVENT_LOG) set. Note this condition ** only applies to Resource Event Logs. Domain Event Logs are mandatory, ** and should not return this code. ** SA_ERR_HPI_INVALID_CMD is returned if the addressed event log does not ** support this function. ** ** Remarks: ** If the Event Log is disabled, no events generated within the HPI ** implementation are added to the Event Log. Events may still be added to ** the Event Log using the saHpiEventLogEntryAdd() function. When the Event ** Log is enabled, events may be automatically added to the Event Log as they ** are generated in a resource or a domain. The actual set of events that are ** automatically added to any Event Log is implementation-specific. ** ** The HPI implementation provides an appropriate default value for this ** parameter, which may vary by resource. This function is provided so that an ** HPI User can override the default, if desired. ** ** If a resource hosting an Event Log is re-initialized (e.g., because of a ** hot swap action), the HPI implementation may reset the value of this ** parameter. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiEventLogStateSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiBoolT EnableState ); /******************************************************************************* ** ** Name: saHpiEventLogOverflowReset() ** ** Description: ** This function clears the OverflowFlag in the Event Log info record of the ** specified Event Log, that is, it sets it to False. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Identifier for the Resource containing the Event Log. ** Set to SAHPI_UNSPECIFIED_RESOURCE_ID to address the Domain Event Log. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not have an Event ** Log capability (SAHPI_CAPABILITY_EVENT_LOG) set. Note this condition ** only applies to Resource Event Logs. Domain Event Logs are mandatory, ** and should not return this code. ** SA_ERR_HPI_INVALID_CMD is returned if the addressed event log does not ** support this function. ** ** Remarks: ** The only effect of this function is to clear the OverflowFlag field in the ** Event Log info record for the specified Event Log, that is, to set it to ** False. If the Event Log is still full, the OverflowFlag will be set to ** True again as soon as another entry needs to be added to the Event Log. ** ** Some Event Log implementations may not allow resetting of the OverflowFlag ** except as a by-product of clearing the entire Event Log with the ** saHpiEventLogClear() function, or at all. Such an implementation returns ** the error code, SA_ERR_HPI_INVALID_CMD to this function. The ** OverflowResetable flag in the Event Log info record and the ** SAHPI_EVTLOG_CAPABILITY_OVERFLOW_RESETABLE bit in the value returned by ** saHpiEventLogCapabilitiesGet() indicate whether the implementation supports ** resetting the OverflowFlag with this function. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiEventLogOverflowReset ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId ); /******************************************************************************* ** ** Name: saHpiSubscribe() ** ** Description: ** This function allows an HPI User to subscribe for events. This single call ** provides subscription to all session events, regardless of event type or ** event severity. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_DUPLICATE is returned when a subscription is already in place ** for this session. ** ** Remarks: ** Only one subscription is allowed per session, and additional subscribers ** receive an appropriate error code. No event filtering is done by the HPI ** implementation. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiSubscribe ( SAHPI_IN SaHpiSessionIdT SessionId ); /******************************************************************************* ** ** Name: saHpiUnsubscribe() ** ** Description: ** This function removes the event subscription for the session. ** ** Parameters: ** SessionId - [in] Session for which event subscription is to be closed. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_INVALID_REQUEST is returned if the session is not currently ** subscribed for events. ** ** Remarks: ** After removal of a subscription, additional saHpiEventGet() calls are not ** allowed on the session, unless an HPI User re-subscribes for events on the ** session first. Any events that are still in the event queue when this ** function is called are cleared from the event queue. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiUnsubscribe ( SAHPI_IN SaHpiSessionIdT SessionId ); /******************************************************************************* ** ** Name: saHpiEventGet() ** ** Description: ** This function allows an HPI User to get an event. This call is only valid ** within a session that has subscribed for events. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** Timeout - [in] The number of nanoseconds to wait for an event to arrive. ** Reserved time out values: ** * SAHPI_TIMEOUT_IMMEDIATE Time out immediately if there are no events ** available ** (non-blocking call). ** * SAHPI_TIMEOUT_BLOCK Call should not return until an event is ** retrieved. ** Event - [out] Pointer to the next available event. ** Rdr - [out] Pointer to structure to receive the resource data associated ** with the event. If NULL, no RDR is returned. ** RptEntry - [out] Pointer to structure to receive the RPT entry associated ** with the resource that generated the event. If NULL, no RPT entry is ** returned. ** EventQueueStatus - [out] Pointer to location to store event queue status. ** If NULL, event queue status is not returned. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_INVALID_REQUEST is returned if an HPI User is not currently ** subscribed for events in this session. ** SA_ERR_HPI_INVALID_PARAMS is returned if the: ** * Event pointer is passed in as NULL. ** * Timeout parameter is not set to SAHPI_TIMEOUT_BLOCK, ** SAHPI_TIMEOUT_IMMEDIATE or a positive value. ** SA_ERR_HPI_TIMEOUT is returned if no event is available to return within ** the timeout period. If SAHPI_TIMEOUT_IMMEDIATE is passed in the Timeout ** parameter, this error return is used if there is no event queued when ** the function is called. ** ** Remarks: ** The saHpiEventGet()function also returns an EventQueueStatus flag to an HPI ** User. This flag indicates whether a queue overflow has occurred. The ** overflow flag is set if any events were unable to be queued because of ** space limitations in the interface implementation. The overflow flag is ** reset whenever saHpiEventGet() is called. ** ** If there are one or more events on the event queue when this function is ** called, it immediately returns the next event on the queue; otherwise, if ** the Timeout parameter is SAHPI_TIMEOUT_IMMEDIATE, this function returns ** SA_ERR_HPI_TIMEOUT immediately; otherwise, it blocks for the time ** specified by the timeout parameter; if an event is added to the queue ** within that time it is returned immediately when added; if not, ** saHpiEventGet() returns SA_ERR_HPI_TIMEOUT at the end of the timeout ** period. If the Timeout parameter is SAHPI_TIMEOUT_BLOCK, the ** saHpiEventGet()blocks indefinitely, until an event becomes available and ** then returns that event. This provides for notification of events as they ** occur. ** ** If an HPI User provides a pointer for an RPT entry, but the event does not ** include a valid ResourceId for a resource in the domain, then the ** RptEntry->ResourceCapabilities field is set to zero. No valid RPT entry ** has a ResourceCapabilities field equal to zero. ** ** If an HPI User provides a pointer for an RDR, but there is no valid RDR ** associated with the event being returned, then the Rdr->RdrType field is ** set to SAHPI_NO_RECORD. RDRs should be returned for events associated with ** management instruments. Event types that are associated with management ** instruments are identified in Section 8.18. ** ** The timestamp reported in the returned event structure is the best ** approximation an implementation has to when the event actually occurred. ** The implementation may need to make an approximation (such as the time the ** event was placed on the event queue) because it may not have access to the ** actual time the event occurred. The value SAHPI_TIME_UNSPECIFIED indicates ** that the time of the event cannot be determined. ** ** If the implementation cannot supply an absolute timestamp, then it may ** supply a timestamp relative to some system-defined epoch, such as system ** startup. If the timestamp value is less than or equal to ** SAHPI_TIME_MAX_RELATIVE, but not SAHPI_TIME_UNSPECIFIED, then it is ** relative; if it is greater than SAHPI_TIME_MAX_RELATIVE, then it is ** absolute. ** ** If an HPI User passes a NULL pointer for the returned EventQueueStatus ** pointer, the event status is not returned, but the overflow flag, if set, ** is still reset. Thus, if an HPI User needs to know about event queue ** overflows, the EventQueueStatus parameter should never be NULL, and the ** overflow flag should be checked after every call to saHpiEventGet(). ** ** If saHpiEventGet() is called with a timeout value other than ** SAHPI_TIMEOUT_IMMEDIATE, and the session is subsequently closed from ** another thread, this function returns with SA_ERR_HPI_INVALID_SESSION. If ** saHpiEventGet() is called with a timeout value other than ** SAHPI_TIMEOUT_IMMEDIATE, and an HPI User subsequently calls ** saHpiUnsubscribe() from another thread, this function returns with ** SA_ERR_HPI_INVALID_REQUEST. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiEventGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiTimeoutT Timeout, SAHPI_OUT SaHpiEventT *Event, SAHPI_OUTNN SaHpiRdrT *Rdr, SAHPI_OUTNN SaHpiRptEntryT *RptEntry, SAHPI_OUTNN SaHpiEvtQueueStatusT *EventQueueStatus ); /******************************************************************************* ** ** Name: saHpiEventAdd() ** ** Description: ** This function enables an HPI User to add events to the HPI domain ** identified by the SessionId. The domain controller processes an event ** added with this function as if the event originated from within the domain. ** The domain controller attempts to publish events to all active event ** subscribers and may attempt to log events in the Domain Event Log, if room ** is available. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** EvtEntry - [in] Pointer to event to add to the domain. Event must be of ** type SAHPI_ET_USER, and the Source field must be ** SAHPI_UNSPECIFIED_RESOURCE_ID. ** ** Return Value: ** SA_OK is returned if the event is successfully added to the domain; ** otherwise, an error code is returned. ** SA_ERR_HPI_INVALID_PARAMS is returned if the: ** * EvtEntry parameter is NULL. ** * Event structure passed via the EvtEntry parameter is not an event of type ** SAHPI_ET_USER with the Source field being SAHPI_UNSPECIFIED_RESOURCE_ID. ** * Severity field within the EvtEntry parameter is not one of the valid ** enumerated values for this type, or it is equal to SAHPI_ALL_SEVERITIES. ** * SaHpiTextBufferT structure passed as part of the User Event structure is ** not valid. This would occur when: ** * The DataType is not one of the enumerated values for that type, or ** * The data field contains characters that are not legal according to the ** value of DataType, or ** * The Language is not one of the enumerated values for that type when the ** DataType is SAHPI_TL_TYPE_UNICODE or SAHPI_TL_TYPE_TEXT. ** SA_ERR_HPI_INVALID_DATA is returned if the event data does not meet ** implementation-specific restrictions on how much event data may be ** provided in an SAHPI_ET_USER event. ** ** Remarks: ** Specific implementations of HPI may have restrictions on how much data may ** be included in an SAHPI_ET_USER event. If more event data is provided than ** can be processed, an error is returned. The event data size restriction ** for the SAHPI_ET_USER event type is provided in the UserEventMaxSize field ** in the domain Event Log info structure. An HPI User should call the ** function saHpiEventLogInfoGet() to retrieve the Event Log info structure. ** ** The domain controller attempts to publish the event to all sessions within ** the domain with active event subscriptions; however, a session's event ** queue may overflow due to the addition of the new event. ** ** The domain controller may attempt to log the event in the Domain Event Log; ** however, because it is implementation-specific what events are added to ** event logs, the domain controller is not required to add the event to the ** Domain Event Log. Also, an attempt to add the event to the Domain Event ** Log may fail if the log overflows. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiEventAdd ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiEventT *EvtEntry ); /******************************************************************************* ** ** Name: saHpiAlarmGetNext() ** ** Description: ** This function allows retrieval of an alarm from the current set of alarms ** held in the Domain Alarm Table (DAT). ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** Severity - [in] Severity level of alarms to retrieve. Set to ** SAHPI_ALL_SEVERITIES to retrieve alarms of any severity; otherwise, set ** to requested severity level. ** UnacknowledgedOnly - [in] Set to True to indicate only unacknowledged ** alarms should be returned. Set to False to indicate either an ** acknowledged or unacknowledged alarm may be returned. ** Alarm - [in/out] Pointer to the structure to hold the returned alarm entry. ** Also, on input, Alarm->AlarmId and Alarm->Timestamp are used to ** identify the previous alarm. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_INVALID_PARAMS is returned when: ** * Severity is not one of the valid enumerated values for this type. ** * The Alarm parameter is passed in as NULL. ** SA_ERR_HPI_NOT_PRESENT is returned: ** * If there are no additional alarms in the DAT that meet the criteria ** specified by the Severity and UnacknowledgedOnly parameters: ** * If the passed Alarm->AlarmId field was set to SAHPI_FIRST_ENTRY and there ** are no alarms in the DAT that meet the criteria specified by the ** Severity and UnacknowledgedOnly parameters. ** SA_ERR_HPI_INVALID_DATA is returned if the passed Alarm->AlarmId matches an ** alarm in the DAT, but the passed Alarm->Timestamp does not match the ** timestamp of that alarm. ** ** Remarks: ** All alarms contained in the DAT are maintained in the order in which they ** were added. This function returns the next alarm meeting the ** specifications given by an HPI User that was added to the DAT after the ** alarm whose AlarmId and Timestamp is passed by an HPI User, even if the ** alarm associated with the AlarmId and Timestamp has been deleted. If ** SAHPI_FIRST_ENTRY is passed as the AlarmId, the first alarm in the DAT ** meeting the specifications given by an HPI User is returned. ** ** Alarm selection can be restricted to only alarms of a specified severity, ** and/or only unacknowledged alarms. ** ** To retrieve all alarms contained within the DAT meeting specific ** requirements, call saHpiAlarmGetNext() with the Alarm->AlarmId field set to ** SAHPI_FIRST_ENTRY and the Severity and UnacknowledgedOnly parameters set to ** select what alarms should be returned. Then, repeatedly call ** saHpiAlarmGetNext() passing the previously returned alarm as the Alarm ** parameter, and the same values for Severity and UnacknowledgedOnly until ** the function returns with the error code SA_ERR_HPI_NOT_PRESENT. ** ** SAHPI_FIRST_ENTRY and SAHPI_LAST_ENTRY are reserved AlarmId values, and are ** never assigned to an alarm in the DAT. ** ** The elements AlarmId and Timestamp are used in the Alarm parameter to ** identify the previous alarm; the next alarm added to the table after this ** alarm that meets the Severity and UnacknowledgedOnly requirements is ** returned. Alarm->AlarmId may be set to SAHPI_FIRST_ENTRY to select the ** first alarm in the DAT meeting the Severity and UnacknowledgedOnly ** requirements. If Alarm->AlarmId is SAHPI_FIRST_ENTRY, then ** Alarm->Timestamp is ignored. ** ** ** *******************************************************************************/ SaErrorT SAHPI_API saHpiAlarmGetNext( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiSeverityT Severity, SAHPI_IN SaHpiBoolT UnacknowledgedOnly, SAHPI_INOUT SaHpiAlarmT *Alarm ); /******************************************************************************* ** ** Name: saHpiAlarmGet() ** ** Description: ** This function allows retrieval of a specific alarm in the Domain Alarm ** Table (DAT) by referencing its AlarmId. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** AlarmId - [in] AlarmId of the alarm to be retrieved from the DAT. ** Alarm - [out] Pointer to the structure to hold the returned alarm entry. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_NOT_PRESENT is returned if the requested AlarmId does not ** correspond to an alarm contained in the DAT. ** SA_ERR_HPI_INVALID_PARAMS is returned if: ** * The Alarm parameter is passed in as NULL. ** * The AlarmId parameter passed is SAHPI_FIRST_ENTRY or SAHPI_LAST_ENTRY. ** ** Remarks: ** SAHPI_FIRST_ENTRY and SAHPI_LAST_ENTRY are reserved AlarmId values, and are ** never assigned to an alarm in the DAT. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiAlarmGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiAlarmIdT AlarmId, SAHPI_OUT SaHpiAlarmT *Alarm ); /******************************************************************************* ** ** Name: saHpiAlarmAcknowledge() ** ** Description: ** This function allows an HPI User to acknowledge a single alarm entry or a ** group of alarm entries by severity. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** AlarmId - [in] Identifier of the alarm to be acknowledged. Reserved ** AlarmId values: ** * SAHPI_ENTRY_UNSPECIFIED Ignore this parameter. ** Severity - [in] Severity level of alarms to acknowledge. Ignored unless ** AlarmId is SAHPI_ENTRY_UNSPECIFIED. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_NOT_PRESENT is returned if an alarm entry identified by the ** AlarmId parameter does not exist in the DAT. ** SA_ERR_HPI_INVALID_PARAMS is returned if AlarmId is SAHPI_ENTRY_UNSPECIFIED ** and Severity is not one of the valid enumerated values for this type. ** ** Remarks: ** An HPI User acknowledges an alarm to indicate that it is aware of the alarm ** and to influence platform-specific alarm annunciation that may be provided ** by the implementation. Typically, an implementation ignores acknowledged ** alarms when announcing an alarm on annunciation devices such as audible ** sirens and dry contact closures. However, alarm annunciation is ** implementation-specific. ** ** An acknowledged alarm has the Acknowledged field in the alarm entry set to ** True. ** ** Alarms are acknowledged one of two ways: a single alarm entry by AlarmId ** regardless of severity or a group of alarm entries by Severity regardless ** of AlarmId. ** ** To acknowledge all alarms contained within the DAT, set the Severity ** parameter to SAHPI_ALL_SEVERITIES, and set the AlarmId parameter to ** SAHPI_ENTRY_UNSPECIFIED. ** ** To acknowledge all alarms of a specific severity contained within the DAT, ** set the Severity parameter to the appropriate value, and set the AlarmId ** parameter to SAHPI_ENTRY_UNSPECIFIED. ** ** To acknowledge a single alarm entry, set the AlarmId parameter to a value ** other than SAHPI_ENTRY_UNSPECIFIED. The AlarmId must be a valid identifier ** for an alarm entry present in the DAT at the time of the function call. ** ** If an alarm has been previously acknowledged, acknowledging it again has no ** effect. However, this is not an error. ** ** If the AlarmId parameter has a value other than SAHPI_ENTRY_UNSPECIFIED, ** the Severity parameter is ignored. ** ** If the AlarmId parameter is passed as SAHPI_ENTRY_UNSPECIFIED, and no ** alarms are present that meet the requested Severity, this function has no ** effect. However, this is not an error. ** ** SAHPI_ENTRY_UNSPECIFIED is defined as the same value as SAHPI_FIRST_ENTRY, ** so using either symbol has the same effect. However, ** SAHPI_ENTRY_UNSPECIFIED should be used with this function for clarity. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiAlarmAcknowledge( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiAlarmIdT AlarmId, SAHPI_IN SaHpiSeverityT Severity ); /******************************************************************************* ** ** Name: saHpiAlarmAdd() ** ** Description: ** This function is used to add a User Alarm to the DAT. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** Alarm- [in/out] Pointer to the alarm entry structure that contains the new ** User Alarm to add to the DAT. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_INVALID_PARAMS is returned if the: ** * Alarm pointer is passed in as NULL. ** * Alarm->Severity is not one of the following enumerated values: ** SAHPI_MINOR, SAHPI_MAJOR, or SAHPI_CRITICAL. ** * Alarm->AlarmCond.Type is not SAHPI_STATUS_COND_TYPE_USER. ** * SaHpiTextBufferT structure passed as part of the Alarm structure is not ** valid. This would occur when: ** * The DataType is not one of the enumerated values for that type, or ** * The data field contains characters that are not legal according to the ** value of DataType, or ** * The Language is not one of the enumerated values for that type when the ** DataType is SAHPI_TL_TYPE_UNICODE or SAHPI_TL_TYPE_TEXT. ** SA_ERR_HPI_OUT_OF_SPACE is returned if the DAT is not able to add an ** additional User Alarm due to space limits or limits imposed on the ** number of User Alarms permitted in the DAT. ** ** Remarks: ** The AlarmId and Timestamp fields within the Alarm parameter are not used by ** this function. Instead, on successful completion, these fields are set to ** new values associated with the added alarm. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiAlarmAdd( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_INOUT SaHpiAlarmT *Alarm ); /******************************************************************************* ** ** Name: saHpiAlarmDelete() ** ** Description: ** This function allows an HPI User to delete a single User Alarm or a group ** of User Alarms from the DAT. Alarms may be deleted individually by ** specifying a specific AlarmId, or they may be deleted as a group by ** specifying a Severity. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** AlarmId - [in] Alarm identifier of the alarm entry to delete. Reserved ** values: ** * SAHPI_ENTRY_UNSPECIFIED Ignore this parameter. ** Severity - [in] Severity level of alarms to delete. Ignored unless AlarmId ** is SAHPI_ENTRY_UNSPECIFIED. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_INVALID_PARAMS is returned if AlarmId is SAHPI_ENTRY_UNSPECIFIED ** and Severity is not one of the valid enumerated values for this type. ** SA_ERR_HPI_NOT_PRESENT is returned if an alarm entry identified by the ** AlarmId parameter does not exist in the DAT. ** SA_ERR_HPI_READ_ONLY is returned if the AlarmId parameter indicates a ** non-User Alarm. ** ** Remarks: ** Only User Alarms added to the DAT can be deleted. When deleting alarms by ** severity, only User Alarms of the requested severity are deleted. ** ** To delete a single, specific alarm, set the AlarmId parameter to a value ** representing an actual User Alarm in the DAT. The Severity parameter is ** ignored when the AlarmId parameter is set to a value other than ** SAHPI_ENTRY_UNSPECIFIED. ** ** To delete a group of User Alarms, set the AlarmId parameter to ** SAHPI_ENTRY_UNSPECIFIED, and set the Severity parameter to identify which ** severity of alarms should be deleted. To clear all User Alarms contained ** within the DAT, set the Severity parameter to SAHPI_ALL_SEVERITIES. ** ** If the AlarmId parameter is passed as SAHPI_ENTRY_UNSPECIFIED, and no User ** Alarms are present that meet the specified Severity, this function has no ** effect. However, this is not an error. ** ** SAHPI_ENTRY_UNSPECIFIED is defined as the same value as SAHPI_FIRST_ENTRY, ** so using either symbol has the same effect. However, ** SAHPI_ENTRY_UNSPECIFIED should be used with this function for clarity. ** ** ** *******************************************************************************/ SaErrorT SAHPI_API saHpiAlarmDelete( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiAlarmIdT AlarmId, SAHPI_IN SaHpiSeverityT Severity ); /******************************************************************************* ** ** Name: saHpiRdrGet() ** ** Description: ** This function returns a resource data record from the addressed resource. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** EntryId - [in] Identifier of the RDR entry to retrieve. Reserved EntryId ** values: ** * SAHPI_FIRST_ENTRY Get first entry. ** * SAHPI_LAST_ENTRY Reserved as delimiter for end of list. Not a valid ** entry identifier. ** NextEntryId - [out] Pointer to location to store EntryId of next entry in ** RDR repository. ** Rdr - [out] Pointer to the structure to receive the requested resource data ** record. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource contains no RDR records ** (and thus does not have the SAHPI_CAPABILITY_RDR flag set in its RPT ** entry). ** SA_ERR_HPI_NOT_PRESENT is returned if an EntryId (other than ** SAHPI_FIRST_ENTRY) is passed that does not correspond to an actual ** EntryId in the resource's RDR repository. ** SA_ERR_HPI_INVALID_PARAMS is returned if: ** * SAHPI_LAST_ENTRY is passed in to EntryId. ** * NextEntryId pointer is passed in as NULL. ** * Rdr pointer is passed in as NULL. ** ** Remarks: ** Submitting an EntryId of SAHPI_FIRST_ENTRY results in the first RDR being ** read. A returned NextEntryId of SAHPI_LAST_ENTRY indicates the last RDR ** has been returned. A successful retrieval includes the next valid EntryId. ** To retrieve the entire list of RDRs, call this function first with an ** EntryId of SAHPI_FIRST_ENTRY and then use the returned NextEntryId in the ** next call. Proceed until the NextEntryId returned is SAHPI_LAST_ENTRY. ** ** If the resource configuration changes, and a "Resource Updated" event is ** issued, the contents of the RDR repository can change. If this happens ** while an HPI User is reading the repository with this function, ** inconsistent data may be read. To protect against this, an HPI User may ** examine the RDR update counter before and after reading the RDR repository ** to make sure no configuration change occurred while the repository was ** being read. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiRdrGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiEntryIdT EntryId, SAHPI_OUT SaHpiEntryIdT *NextEntryId, SAHPI_OUT SaHpiRdrT *Rdr ); /******************************************************************************* ** ** Name: saHpiRdrGetByInstrumentId() ** ** Description: ** This function returns the Resource Data Record (RDR) for a specific ** management instrument hosted by the addressed resource. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** RdrType - [in] Type of RDR being requested. ** InstrumentId - [in] Instrument number identifying the specific RDR to be ** returned. This is a Sensor number, Control number, Watchdog Timer ** number, IDR number, Annunciator number, FUMI number, or DIMI number ** depending on the value of the RdrType parameter. ** Rdr - [out] Pointer to the structure to receive the requested RDR. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the: ** * Resource contains no RDR records (and thus does not have the ** SAHPI_CAPABILITY_RDR flag set in its RPT entry). ** * Type of management instrument specified in the RdrType parameter is not ** supported by the resource, as indicated by the Capability field in its ** RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the specific management instrument ** identified in the InstrumentId parameter is not present in the addressed ** resource. ** SA_ERR_HPI_INVALID_PARAMS is returned when the: ** * RdrType parameter is not a valid enumerated value for the type. ** * RdrType is SAHPI_NO_RECORD. ** * Rdr pointer is passed in as NULL. ** ** Remarks: ** The RDR to be returned is identified by RdrType and InstrumentId for the ** specific management instrument for the RDR being requested. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiRdrGetByInstrumentId ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiRdrTypeT RdrType, SAHPI_IN SaHpiInstrumentIdT InstrumentId, SAHPI_OUT SaHpiRdrT *Rdr ); /******************************************************************************* ** ** Name: saHpiRdrUpdateCountGet() ** ** Description: ** This function returns an update counter for the resource data records for ** the addressed resource. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** UpdateCount - [out] Pointer to the update counter. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource contains no RDR records ** (and thus does not have the SAHPI_CAPABILITY_RDR flag set in its RPT ** entry). ** SA_ERR_HPI_INVALID_RESOURCE is returned if the specified resource does not ** exist. ** SA_ERR_HPI_INVALID_PARAMS is returned if the UpdateCount pointer is passed ** in as NULL. ** ** Remarks: ** This function provides a mechanism for the user to detect updates of the ** RDR for a resource. This can happen while the user is reading the RDRs. To ** protect against these updates, an HPI User may use this function before and ** after reading the RDR repository to make sure no configuration change ** occurred while the repository was being read. An HPI user may also use this ** function after receiving a "Resource Updated" or "Resource Restored" event ** to detect whether the RDR repository has changed. ** ** There is no significance attached to the value of the RDR update counter, ** except that it must change any time the RDR data for a resource is updated ** and should remain constant when no changes are made to the RDR data. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiRdrUpdateCountGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiUint32T *UpdateCount ); /******************************************************************************* ** ** Name: saHpiSensorReadingGet() ** ** Description: ** This function is used to retrieve a Sensor reading. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** SensorNum - [in] Sensor number for which the Sensor reading is being ** retrieved. ** Reading - [out] Pointer to a structure to receive Sensor reading values. ** If NULL, the Sensor reading value is not returned. ** EventState - [out] Pointer to location to receive Sensor event states. If ** NULL, the Sensor event states is not returned. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support Sensors, ** as indicated by SAHPI_CAPABILITY_SENSOR in the resource's RPT entry. ** SA_ERR_HPI_INVALID_REQUEST is returned if the Sensor is currently disabled. ** SA_ERR_HPI_NOT_PRESENT is returned if the Sensor is not present. ** ** Remarks: ** For Sensors that return a type of SAHPI_SENSOR_READING_TYPE_BUFFER, the ** format of the returned data buffer is implementation-specific. ** ** If the Sensor does not provide a reading, the Reading structure returned by ** the saHpiSensorReadingGet() function indicates the reading is not supported ** by setting the IsSupported flag to False. ** ** If the Sensor does not support any event states, a value of 0x0000 is ** returned for the EventState value. This is indistinguishable from the ** return for a Sensor that does support event states, but currently has no ** event states asserted. The Sensor RDR Events field can be examined to ** determine if the Sensor supports any event states. ** ** It is legal for both the Reading parameter and the EventState parameter to ** be NULL. In this case, no data is returned other than the return code. ** This can be used to determine if a Sensor is present and enabled without ** actually returning current Sensor data. If the Sensor is present and ** enabled, SA_OK is returned; otherwise, an error code is returned. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiSensorReadingGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_OUTNN SaHpiSensorReadingT *Reading, SAHPI_OUTNN SaHpiEventStateT *EventState ); /******************************************************************************* ** ** Name: saHpiSensorThresholdsGet() ** ** Description: ** This function retrieves the thresholds for the given Sensor. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** SensorNum - [in] Sensor number for which threshold values are being ** retrieved. ** SensorThresholds - [out] Pointer to returned Sensor thresholds. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support Sensors, ** as indicated by SAHPI_CAPABILITY_SENSOR in the resource's RPT entry. ** SA_ERR_HPI_INVALID_PARAMS is returned if the SensorThresholds pointer is ** passed in as NULL. ** SA_ERR_HPI_INVALID_CMD is returned if: ** * Getting a threshold on a Sensor that is not a threshold type. ** * The Sensor does not have any readable threshold values. ** SA_ERR_HPI_NOT_PRESENT is returned if the Sensor is not present. ** ** Remarks: ** This function only applies to Sensors that support readable thresholds, as ** indicated by the IsAccessible field in the SaHpiSensorThdDefnT structure of ** the Sensor's RDR being set to True and the ReadThold field in the same ** structure having a non-zero value. ** ** For thresholds that do not apply to the identified Sensor, the IsSupported ** flag of the threshold value field is set to False. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiSensorThresholdsGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_OUT SaHpiSensorThresholdsT *SensorThresholds ); /******************************************************************************* ** ** Name: saHpiSensorThresholdsSet() ** ** Description: ** This function sets the specified thresholds for the given Sensor. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** SensorNum - [in] Sensor number for which threshold values are being set. ** SensorThresholds - [in] Pointer to the Sensor thresholds values being set. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_INVALID_DATA is returned if any of the threshold values are ** provided in a format not supported by the Sensor. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support Sensors, ** as indicated by SAHPI_CAPABILITY_SENSOR in the resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the Sensor is not present. ** SA_ERR_HPI_INVALID_CMD is returned when: ** * Writing to a threshold that is not writable. ** * Setting a threshold on a Sensor that is not a threshold type as indicated ** by the IsAccessible field of the SaHpiSensorThdDefnT structure. ** * Setting a threshold outside of the Min-Max range as defined by the Range ** field of the SensorDataFormat of the RDR. ** * Setting a hysteresis value to a positive value greater than an ** implementation-specific limit. ** SA_ERR_HPI_INVALID_DATA is returned when: ** * Thresholds are set out-of-order (see Remarks). ** * A negative number is provided for either the postive hysteresis value ** (SensorThresholds -> PosThdHysteresis), or for the negative hysteresis ** value ** (SensorThresholds -> NegThdHysteresis). ** SA_ERR_HPI_INVALID_PARAMS is returned if the SensorThresholds pointer is ** passed in as NULL. ** ** Remarks: ** This function only applies to Sensors that support writable thresholds, as ** indicated by the IsAccessible field in the SaHpiSensorThdDefnT structure of ** the Sensor's RDR being set to True and the WriteThold field in the same ** structure having a non-zero value. ** ** In the SaHpiSensorThresholdsT structure pointed to by the SensorThresholds ** parameter, each sensor threshold or hysteresis value to be set is indicated ** by setting the IsSupported field in the corresponding SaHpiSensorReadingT ** sub-structure to TRUE. For each SaHpiSensorReadingT sub-structure that has ** its IsSupported field set to FALSE, no change is made to the corresponding ** sensor threshold or hysteresis value. ** ** The type of value provided for each threshold or hysteresis setting to be ** updated must correspond to the reading format supported by the Sensor, as ** defined by the reading type in the DataFormat field of the Sensor's RDR ** (SaHpiSensorRecT). Each value to be updated must be defined as writable in ** the ThresholdDefn field of the Sensor's RDR. ** ** Sensor threshold values cannot be set outside of the range defined by the ** Range field of the SensorDataFormat of the Sensor RDR. If SAHPI_SRF_MAX ** indicates that a maximum reading exists, no Sensor threshold may be set ** greater than the Max value. If SAHPI_SRF_MIN indicates that a minimum ** reading exists, no Sensor threshold may be set less than the Min value. ** This limit applies only to the threshold values, not hysteresis values. ** ** The sensor threshold hysteresis values must be specified as non-negative ** values. An implementation-specific upper limit may be imposed. ** ** Thresholds are required to be set progressively in-order, so that, for all ** threshold values that are defined on a Sensor, Upper Critical >= Upper ** Major >= Upper Minor >= Lower Minor >= Lower Major >= Lower Critical. If ** this condition would not be true after updating the thresholds indicated by ** the HPI User, then an error of SA_ERR_HPI_INVALID_DATA shall be returned. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiSensorThresholdsSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_IN SaHpiSensorThresholdsT *SensorThresholds ); /******************************************************************************* ** ** Name: saHpiSensorTypeGet() ** ** Description: ** This function retrieves the Sensor type and event category for the ** specified Sensor. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** SensorNum - [in] Sensor number for which the type is being retrieved. ** Type - [out] Pointer to returned enumerated Sensor type for the specified ** Sensor. ** Category - [out] Pointer to location to receive the returned Sensor event ** category. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support Sensors, ** as indicated by SAHPI_CAPABILITY_SENSOR in the resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the Sensor is not present. ** SA_ERR_HPI_INVALID_PARAMS is returned if the: ** * Type pointer is passed in as NULL. ** * Category pointer is passed in as NULL. ** ** Remarks: ** None. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiSensorTypeGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_OUT SaHpiSensorTypeT *Type, SAHPI_OUT SaHpiEventCategoryT *Category ); /******************************************************************************* ** ** Name: saHpiSensorEnableGet() ** ** Description: ** This function returns the current Sensor enable status for an addressed ** Sensor. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** SensorNum - [in] Sensor number for which the Sensor enable status is being ** requested. ** SensorEnabled - [out] Pointer to the location to store the Sensor enable ** status. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support Sensors, ** as indicated by SAHPI_CAPABILITY_SENSOR in the resource's RPT entry. ** SA_ERR_HPI_INVALID_PARAMS is returned when the SensorEnabled pointer is set ** to NULL. ** SA_ERR_HPI_NOT_PRESENT is returned if the Sensor is not present. ** ** Remarks: ** The SaHpiBoolT value pointed to by the SensorEnabled parameter is set to ** True if the Sensor is enabled, or to False if the Sensor is disabled. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiSensorEnableGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_OUT SaHpiBoolT *SensorEnabled ); /******************************************************************************* ** ** Name: saHpiSensorEnableSet() ** ** Description: ** This function sets the Sensor enable status for an addressed Sensor. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** SensorNum - [in] Sensor number for which the Sensor enable status is being ** set. ** SensorEnabled - [in] Sensor enable status to be set for the Sensor. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support Sensors, ** as indicated by SAHPI_CAPABILITY_SENSOR in the resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the Sensor is not present. ** SA_ERR_HPI_READ_ONLY is returned if the Sensor does not support changing ** the enable status (that is, the EnableCtrl field in the Sensor RDR is ** set to False). ** ** Remarks: ** If a Sensor is disabled, any calls to saHpiSensorReadingGet() for that ** Sensor return an error, and no events are generated for the Sensor. ** ** Calling saHpiSensorEnableSet() with a SensorEnabled parameter of True ** enables the Sensor. A SensorEnabled parameter of False disables the ** Sensor. ** ** If the Sensor enable status changes as the result of this function call, an ** event is generated. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiSensorEnableSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_IN SaHpiBoolT SensorEnabled ); /******************************************************************************* ** ** Name: saHpiSensorEventEnableGet() ** ** Description: ** This function returns the current Sensor event enable status for an ** addressed Sensor. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** SensorNum - [in] Sensor number for which the Sensor event enable status is ** being requested. ** SensorEventsEnabled - [out] Pointer to the location to store the Sensor ** event enable status. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support Sensors, ** as indicated by SAHPI_CAPABILITY_SENSOR in the resource's RPT entry. ** SA_ERR_HPI_INVALID_PARAMS is returned when the SensorEventsEnabled pointer ** is set to NULL. ** SA_ERR_HPI_NOT_PRESENT is returned if the Sensor is not present. ** ** Remarks: ** The SaHpiBoolT value pointed to by the SensorEventsEnabled parameter is set ** to True if event generation for the Sensor is enabled, or False if event ** generation for the Sensor is disabled. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiSensorEventEnableGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_OUT SaHpiBoolT *SensorEventsEnabled ); /******************************************************************************* ** ** Name: saHpiSensorEventEnableSet() ** ** Description: ** This function sets the Sensor event enable status for an addressed Sensor. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** SensorNum - [in] Sensor number for which the Sensor enable status is being ** set. ** SensorEventsEnabled - [in] Sensor event enable status to be set for the ** Sensor. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support Sensors, ** as indicated by SAHPI_CAPABILITY_SENSOR in the resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the Sensor is not present. ** SA_ERR_HPI_READ_ONLY is returned if the Sensor does not support changing ** the event enable status (that is., the EventCtrl field in the Sensor RDR ** is set to SAHPI_SEC_READ_ONLY). ** ** Remarks: ** If event generation for a Sensor is disabled, no events are generated as a ** result of the assertion or deassertion of any event state, regardless of ** the setting of the assert or deassert event masks for the Sensor. If event ** generation for a Sensor is enabled, events are generated when event states ** are asserted or deasserted, according to the settings of the assert and ** deassert event masks for the Sensor. Event states may still be read for a ** Sensor (by invoking the saHpiSensorReadingGet() function), even if event ** generation is disabled. ** ** Calling saHpiSensorEventEnableSet() with a SensorEventsEnabled parameter of ** True enables event generation for the Sensor. A SensorEventsEnabled ** parameter of False disables event generation for the Sensor. ** ** If the Sensor event enabled status changes as a result of this function ** call, an event is generated. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiSensorEventEnableSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_IN SaHpiBoolT SensorEventsEnabled ); /******************************************************************************* ** ** Name: saHpiSensorEventMasksGet() ** ** Description: ** This function returns the assert and deassert event masks for a Sensor. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** SensorNum - [in] Sensor number for which the event enable configuration is ** being requested. ** AssertEventMask - [out] Pointer to location to store Sensor assert event ** mask. If NULL, assert event mask is not returned. ** DeassertEventMask - [out] Pointer to location to store Sensor deassert ** event mask. If NULL, deassert event mask is not returned. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support Sensors, ** as indicated by SAHPI_CAPABILITY_SENSOR in the resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the Sensor is not present. ** ** Remarks: ** Two bit-mask values are returned by the saHpiSensorEventMasksGet() ** function; one for the Sensor assert event mask and one for the Sensor ** deassert event mask. A bit set to "1" in the AssertEventMask value ** indicates that an event is generated by the Sensor when the corresponding ** event state for that Sensor changes from deasserted to asserted. A bit set ** to "1" in the DeassertEventMask value indicates that an event is generated ** by the Sensor when the corresponding event state for that Sensor changes ** from asserted to deasserted. ** ** Events are only generated by the Sensor if the appropriate AssertEventMask ** or DeassertEventMask bit is set, Sensor events are enabled, and the Sensor ** is enabled. ** ** For Sensors hosted by resources that have the ** SAHPI_CAPABILITY_EVT_DEASSERTS flag set in its RPT entry, the ** AssertEventMask and the DeassertEventMask values are always the same. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiSensorEventMasksGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_OUTNN SaHpiEventStateT *AssertEventMask, SAHPI_OUTNN SaHpiEventStateT *DeassertEventMask ); /******************************************************************************* ** ** Name: saHpiSensorEventMasksSet() ** ** Description: ** This function provides the ability to change the settings of the Sensor ** assert and deassert event masks. Two parameters contain bit-mask values ** indicating which bits in the Sensor assert and deassert event masks should ** be updated. In addition, there is an Action parameter. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** SensorNum - [in] Sensor number for which the event enable configuration is ** being set. ** Action - [in] Enumerated value describing what change should be made to the ** Sensor event masks: ** * SAHPI_SENS_ADD_EVENTS_TO_MASKS - for each bit set to "1" in the ** AssertEventMask and DeassertEventMask parameters, set the corresponding ** bit in the Sensor's assert and deassert event masks, respectively, to ** "1". ** * SAHPI_SENS_REMOVE_EVENTS_FROM_MASKS - for each bit set to "1" in the ** AssertEventMask and DeassertEventMask parameters, clear the ** corresponding bit in the Sensor's assert and deassert event masks, ** respectively, that is, set the corresponding bits in the event masks to ** "0". ** AssertEventMask - [in] Bit mask or special value indicating which bits in ** the Sensor's assert event mask should be set or cleared. See Remarks ** concerning resources with the SAHPI_CAPABILITY_EVT_DEASSERTS flag set. ** DeassertEventMask - [in] Bit mask or special value indicating which bits in ** the Sensor's deassert event mask should be set or cleared. See Remarks ** concerning resources with the SAHPI_CAPABILITY_EVT_DEASSERTS flag set. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support Sensors, ** as indicated by SAHPI_CAPABILITY_SENSOR in the resource's RPT entry. ** SA_ERR_HPI_INVALID_DATA is returned if the Action parameter is ** SAHPI_SENS_ADD_EVENTS_TO_MASKS, and: ** * The AssertEventMask parameter is not SAHPI_ALL_EVENT_STATES, and it ** includes a bit for an event state that is not supported by the Sensor. ** * The resource does not have the SAHPI_CAPABILITY_EVT_DEASSERTS capability ** set, and the DeassertEventMask parameter is not SAHPI_ALL_EVENT_STATES, ** and it includes a bit for an event state that is not supported by the ** Sensor. ** SA_ERR_HPI_INVALID_PARAMS is returned if the Action parameter is out of ** range. ** SA_ERR_HPI_NOT_PRESENT is returned if the Sensor is not present. ** SA_ERR_HPI_READ_ONLY is returned if the Sensor does not support updating ** the assert and deassert event masks (that is, the EventCtrl field in the ** Sensor RDR is set to SAHPI_SEC_READ_ONLY_MASKS or SAHPI_SEC_READ_ONLY). ** ** Remarks: ** The bits in the Sensor assert and deassert event masks that correspond to ** "1" bits in the bit-mask parameters are set or cleared, as indicated by the ** Action parameter. The bits in the Sensor assert and deassert event masks ** corresponding to "0" bits in the bit-mask parameters are unchanged. ** ** Assuming that a Sensor is enabled and also that event generation for the ** Sensor is enabled, then for each bit set in the Sensor's assert event mask, ** an event is generated when the Sensor's corresponding event state changes ** from deasserted to asserted. Similarly, for each bit set in the Sensor's ** deassert event mask, an event is generated when the Sensor's corresponding ** event state changes from asserted to deasserted. ** ** For Sensors hosted by a resource that has the ** SAHPI_CAPABILITY_EVT_DEASSERTS flag set in its RPT entry, the assert and ** deassert event masks cannot be independently configured. When ** saHpiSensorEventMasksSet() is called for Sensors in a resource with this ** capability, the DeassertEventMask parameter is ignored, and the ** AssertEventMask parameter is used to determine which bits to set or clear ** in both the assert event mask and deassert event mask for the Sensor. ** ** The AssertEventMask or DeassertEventMask parameter may be set to the ** special value, SAHPI_ALL_EVENT_STATES, indicating that all event states ** supported by the Sensor should be added to or removed from, the ** corresponding Sensor event mask. ** ** If the Sensor assert and/or deassert event masks change as a result of this ** function call, an event is generated. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiSensorEventMasksSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_IN SaHpiSensorEventMaskActionT Action, SAHPI_IN SaHpiEventStateT AssertEventMask, SAHPI_IN SaHpiEventStateT DeassertEventMask ); /******************************************************************************* ** ** Name: saHpiControlTypeGet() ** ** Description: ** This function retrieves the Control type of a Control object. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** CtrlNum - [in] Control number for which the type is being retrieved. ** Type - [out] Pointer to SaHpiCtrlTypeT variable to receive the enumerated ** Control type for the specified Control. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support ** Controls, as indicated by SAHPI_CAPABILITY_CONTROL in the resource's RPT ** entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the Control is not present. ** SA_ERR_HPI_INVALID_PARAMS is returned if the Type pointer is passed in as ** NULL. ** ** Remarks: ** The Type parameter must point to a variable of type SaHpiCtrlTypeT. Upon ** successful completion, the enumerated Control type is returned in the ** variable pointed to by Type. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiControlTypeGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiCtrlNumT CtrlNum, SAHPI_OUT SaHpiCtrlTypeT *Type ); /******************************************************************************* ** ** Name: saHpiControlGet() ** ** Description: ** This function retrieves the current state and mode of a Control object. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** CtrlNum - [in] Control number for which the state and mode are being ** retrieved. ** CtrlMode - [out] Pointer to the mode of the Control. If NULL, the ** Control's mode is not returned. ** CtrlState - [in/out] Pointer to a Control data structure into which the ** current Control state is placed. For text Controls, the line number to ** read is passed in via CtrlState->StateUnion.Text.Line. If NULL, the ** Control's state is not returned. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_INVALID_CMD is returned if the Control is a write-only Control, ** as indicated by the WriteOnly flag in the Control's RDR (see remarks). ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support ** Controls, as indicated by the SAHPI_CAPABILITY_CONTROL in the resource's ** RPT entry. ** SA_ERR_HPI_INVALID_DATA is returned if the addressed Control is a text ** Control, and the line number passed in CtrlState->StateUnion.Text.Line ** does not exist in the Control and is not SAHPI_TLN_ALL_LINES. ** SA_ERR_HPI_NOT_PRESENT is returned if the Control is not present. ** ** Remarks: ** Note that the CtrlState parameter is both an input and an output parameter ** for this function. This is necessary to support line number inputs for ** text Controls, as discussed below. ** ** As an input parameter, the CtrlState->Type value is not significant for ** this function and is ignored. It is thus not necessary to set ** CtrlState->Type to any valid value, even when CtrlState is being used to ** provide input parameters for specific types of Controls. ** ** In some cases, the state of a Control may be set, but the corresponding ** state cannot be read later. Such Controls are delineated with the ** WriteOnly flag in the Control's RDR. ** ** Note that text Controls are unique in that they have a state associated ** with each line of the Control - the state being the text on that line. The ** line number to be read is passed in to saHpiControlGet() via ** ** CtrlState->StateUnion.Text.Line; the contents of that line of the Control ** are returned in ** ** CtrlState->StateUnion.Text.Text. The first line of the text Control is ** line number "1". ** ** If the line number passed in is SAHPI_TLN_ALL_LINES, then saHpiControlGet() ** returns the entire text of the Control, or as much of it as can fit in a ** single SaHpiTextBufferT, in CtrlState->StateUnion.Text.Text. This value ** consists of the text of all the lines concatenated, whereby the maximum ** number of characters for each line (no trimming of trailing blanks) is ** used. ** ** Note that depending on the data type and language, the text may be encoded ** in 2-byte Unicode, which requires two bytes of data per character. ** ** Note that the number of lines and columns in a text Control can be obtained ** from the Control's Resource Data Record. ** ** Write-only Controls allow the Control's state to be set, but the Control ** state cannot be subsequently read. Such Controls are indicated in the RDR ** when the WriteOnly flag is set to True. SA_ERR_HPI_INVALID_CMD is returned ** when calling this function for a write-only Control. ** ** It is legal for both the CtrlMode parameter and the CtrlState parameter to ** be NULL. In this case, no data is returned other than the return code. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiControlGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiCtrlNumT CtrlNum, SAHPI_OUTNN SaHpiCtrlModeT *CtrlMode, SAHPI_INOUT SaHpiCtrlStateT *CtrlState ); /******************************************************************************* ** ** Name: saHpiControlSet() ** ** Description: ** This function is used for setting the state and/or mode of the specified ** Control object. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** CtrlNum - [in] Control number for which the state and/or mode is being set. ** CtrlMode - [in] The mode to set on the Control. ** CtrlState - [in] Pointer to a Control state data structure holding the ** state to be set. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support ** Controls, as indicated by the SAHPI_CAPABILITY_CONTROL in the resource's ** RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the Control is not present. ** SA_ERR_HPI_INVALID_DATA is returned when the: ** * CtrlState->Type field is not the correct type for the Control identified ** by the CtrlNum parameter. ** * CtrlState->StateUnion.Analog is out of range of the Control record's ** analog Min and Max values. ** * CtrlState->StateUnion.Text.Text.DataLength, combined with the ** CtrlState->StateUnion.Text.Line, overflows the remaining text Control ** space. ** * CtrlState->StateUnion.Text.Text.DataType is not set to the DataType ** specified in the RDR. ** * DataType specified in the RDR is SAHPI_TL_TYPE_UNICODE or ** SAHPI_TL_TYPE_TEXT and ** CtrlState->StateUnion.Text.Text.Language is not set to the Language ** specified in the RDR. ** * OEM Control data is invalid (see remarks below). ** SA_ERR_HPI_INVALID_PARAMS is returned if the: ** * CtrlMode is not one of the valid enumerated values for this type. ** * CtrlMode parameter is not SAHPI_CTRL_MODE_AUTO and the CtrlState pointer ** is passed in as NULL. ** * CtrlState->StateUnion.Digital is not one of the valid enumerated values ** for this type. ** * CtrlState->StateUnion.Stream.StreamLength is bigger than ** SAHPI_CTRL_MAX_STREAM_LENGTH. ** * SaHpiTextBufferT structure passed as CtrlState->StateUnion.Text.Text ** contains text characters that are not allowed according to the value of ** CtrlState->StateUnion.Text.Text.DataType. ** SA_ERR_HPI_INVALID_REQUEST is returned when SAHPI_CTRL_STATE_PULSE_ON is ** issued to a digital Control, which is ON (in either manual or auto ** mode). It is also returned when SAHPI_CTRL_STATE_PULSE_OFF is issued to ** a digital Control, which is OFF (in either manual or auto mode). ** SA_ERR_HPI_READ_ONLY is returned when attempting to change the mode of a ** Control with a read-only mode. ** SA_ERR_HPI_UNSUPPORTED_PARAMS is returned if an otherwise legal CtrlState ** value passed is not supported by the addressed Control. For example, a ** Discrete Control may only be settable to certain values, or a Digital ** Control may only be able to accept a "Pulse" operation. The HPI ** implementation should provide documentation describing the limitations ** of specific Controls that may result in this return value. ** ** Remarks: ** If the CtrlMode parameter is set to SAHPI_CTRL_MODE_AUTO, then the ** CtrlState parameter is not evaluated, and may be set to any value by an HPI ** User, including a NULL pointer. When CtrlMode is SAHPI_CTRL_MODE_MANUAL, ** the CtrlState parameter must be of the correct type for the specified ** Control. ** ** Text Controls include a line number and a line of text in the CtrlState ** parameter, allowing update of just a single line of a text Control. The ** first line of the text Control is line number "1". If less than a full ** line of data is written, the Control clears all spaces beyond those written ** on the line. Thus, writing a zero-length string clears the addressed line. ** It is also possible to include more characters in the text passed in the ** CtrlState structure than fits on one line; in this case, the Control wraps ** to the next line (still clearing the trailing characters on the last line ** written). Thus, there are two ways to write multiple lines to a text ** Control: (a) call saHpiControlSet() repeatedly for each line, or (b) call ** saHpiControlSet() once and send more characters than fit on one line. An ** HPI User should not assume any "cursor positioning" characters are ** available to use, but rather should always write full lines and allow ** "wrapping" to occur. When calling saHpiControlSet() for a text Control, an ** HPI User may set the line number to SAHPI_TLN_ALL_LINES; in this case, the ** entire Control is cleared, and the data is written starting on line 1. ** (This is different from simply writing at line 1, which only alters the ** lines written to.) ** ** This feature may be used to clear the entire Control, which can be ** accomplished by setting: ** ** CtrlState->StateUnion.Text.Line = SAHPI_TLN_ALL_LINES; ** ** CtrlState->StateUnion.Text.Text.DataLength = 0; ** ** Note that the number of lines and columns in a text Control can be obtained ** from the Control's RDR. ** ** The ManufacturerId (MId) field of an OEM Control is ignored by the ** implementation when calling saHpiControlSet(). ** ** On an OEM Control, it is up to the implementation to determine what invalid ** data is, and to return the specified error code. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiControlSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiCtrlNumT CtrlNum, SAHPI_IN SaHpiCtrlModeT CtrlMode, SAHPI_IN SaHpiCtrlStateT *CtrlState ); /******************************************************************************* ** ** Name: saHpiIdrInfoGet() ** ** Description: ** This function returns the Inventory Data Repository information including ** the number of areas contained within the IDR and the update counter. The ** Inventory Data Repository is associated with a specific entity. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** IdrId - [in] Identifier for the Inventory Data Repository. ** IdrInfo - [out] Pointer to the information describing the requested ** Inventory Data Repository. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support an ** Inventory Data Repository, as indicated by ** SAHPI_CAPABILITY_INVENTORY_DATA in the resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the IDR is not present. ** SA_ERR_HPI_INVALID_PARAMS is returned if the IdrInfo pointer is passed in ** as NULL. ** ** Remarks: ** The update counter provides a means for insuring that no additions or ** changes are missed when retrieving the IDR data. To use this feature, an ** HPI User should call saHpiIdrInfoGet(), and retrieve the update counter ** value before retrieving the first Area. After retrieving all Areas and ** Fields of the IDR, the HPI User should again call saHpiIdrInfoGet(). If the ** update counter value has not been incremented, no modification or additions ** were made to the IDR during data retrieval. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiIdrInfoGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT IdrId, SAHPI_OUT SaHpiIdrInfoT *IdrInfo ); /******************************************************************************* ** ** Name: saHpiIdrAreaHeaderGet() ** ** Description: ** This function returns the Inventory Data Area header information for a ** specific area associated with a particular Inventory Data Repository. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** IdrId - [in] Identifier for the Inventory Data Repository. ** AreaType - [in] Type of Inventory Data Area. ** AreaId - [in] Identifier of Area entry to retrieve from the IDR. Reserved ** AreaId values: ** * SAHPI_FIRST_ENTRY Get first entry. ** * SAHPI_LAST_ENTRY Reserved as a delimiter for end of list. Not a valid ** AreaId. ** NextAreaId - [out] Pointer to location to store the AreaId of next area of ** the requested type within the IDR. ** Header - [out] Pointer to Inventory Data Area Header into which the header ** information is placed. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support an ** Inventory Data Repository, as indicated by ** SAHPI_CAPABILITY_INVENTORY_DATA in the resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the: ** * IDR is not present. ** * AreaType parameter is set to SAHPI_IDR_AREATYPE_UNSPECIFIED, and the area ** specified by the AreaId parameter does not exist in the IDR. ** * AreaType parameter is set to a specific area type, but an area matching ** both the AreaId parameter and AreaType parameter does not exist. ** SA_ERR_HPI_INVALID_PARAMS is returned if: ** * AreaType is not one of the valid enumerated values for this type. ** * The AreaId is an invalid reserved value such as SAHPI_LAST_ENTRY. ** * The NextAreaId pointer is passed in as NULL. ** * The Header pointer is passed in as NULL. ** ** Remarks: ** This function allows retrieval of an Inventory Data Area Header by one of ** two ways: by AreaId regardless of type or by AreaType and AreaId. ** ** To retrieve all areas contained within an IDR, set the AreaType parameter ** to SAHPI_IDR_AREATYPE_UNSPECIFIED, and set the AreaId parameter to ** SAHPI_FIRST_ENTRY for the first call. For each subsequent call, set the ** AreaId parameter to the value returned in the NextAreaId parameter. ** Continue calling this function until the NextAreaId parameter contains the ** value SAHPI_LAST_ENTRY. ** ** To retrieve areas of specific type within an IDR, set the AreaType ** parameter to a valid AreaType enumeration. Use the AreaId parameter in the ** same manner described above to retrieve all areas of the specified type. ** Set the AreaId parameter to SAHPI_FIRST_ENTRY to retrieve the first area of ** that type. Use the value returned in NextAreaId to retrieve the remaining ** areas of that type until SAHPI_LAST_ENTRY is returned. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiIdrAreaHeaderGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT IdrId, SAHPI_IN SaHpiIdrAreaTypeT AreaType, SAHPI_IN SaHpiEntryIdT AreaId, SAHPI_OUT SaHpiEntryIdT *NextAreaId, SAHPI_OUT SaHpiIdrAreaHeaderT *Header ); /******************************************************************************* ** ** Name: saHpiIdrAreaAdd() ** ** Description: ** This function is used to add an Area to the specified Inventory Data ** Repository. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** IdrId - [in] Identifier for the Inventory Data Repository. ** AreaType - [in] Type of Area to add. ** AreaId- [out] Pointer to location to store the AreaId of the newly created ** area. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support an ** Inventory Data Repository, as indicated by ** SAHPI_CAPABILITY_INVENTORY_DATA in the resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the IDR is not present. ** SA_ERR_HPI_INVALID_DATA is returned when attempting to add an area with an ** AreaType of SAHPI_IDR_AREATYPE_UNSPECIFIED or when adding an area that ** does not meet the implementation-specific restrictions. ** SA_ERR_HPI_OUT_OF_SPACE is returned if the IDR does not have enough free ** space to allow the addition of the area. ** SA_ERR_HPI_INVALID_PARAMS is returned if the: ** * AreaId pointer is passed in as NULL. ** * AreaType is not one of the valid enumerated values for this type. ** SA_ERR_HPI_READ_ONLY is returned if the IDR is read-only and does not allow ** the addition of the area. ** ** Remarks: ** On successful completion, the AreaId parameter contains the AreaId of the ** newly created area. ** ** On successful completion, the ReadOnly element in the new Area's header is ** always False. ** ** SAHPI_IDR_AREATYPE_UNSPECIFIED is not a valid area type, and should not be ** used with this function. If SAHPI_IDR_AREATYPE_UNSPECIFIED is specified as ** the area type, an error code of SA_ERR_HPI_INVALID_DATA is returned. This ** area type is only valid when used with the saHpiIdrAreaHeaderGet() function ** to retrieve areas of an unspecified type. ** ** Some implementations may restrict the types of areas that may be added. ** These restrictions should be documented. SA_ERR_HPI_INVALID_DATA is ** returned when attempting to add an invalid area type. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiIdrAreaAdd( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT IdrId, SAHPI_IN SaHpiIdrAreaTypeT AreaType, SAHPI_OUT SaHpiEntryIdT *AreaId ); /******************************************************************************* ** ** Name: saHpiIdrAreaAddById() ** ** Description: ** This function is used to add an Area with a specified AreaId to a given ** Inventory Data Repository. This function differs from saHpiIdrAreaAdd() in ** that it allows the HPI User to add an Area with a specific AreaId. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** IdrId - [in] Identifier for the Inventory Data Repository. ** AreaType - [in] Type of Area to add. ** AreaId- [in] AreaId for the new Area to be created. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support an ** Inventory Data Repository, as indicated by ** SAHPI_CAPABILITY_INVENTORY_DATA in the resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the IDR is not present. ** SA_ERR_HPI_INVALID_DATA is returned when attempting to add an area with an ** AreaType of SAHPI_IDR_AREATYPE_UNSPECIFIED or when adding an area that ** does not meet the implementation-specific restrictions. ** SA_ERR_HPI_OUT_OF_SPACE is returned if the IDR does not have enough free ** space to allow the addition of the Area. ** SA_ERR_HPI_INVALID_PARAMS is returned if the: ** * The AreaId is an invalid reserved value such as SAHPI_LAST_ENTRY. ** * AreaType is not one of the valid enumerated values for this type. ** SA_ERR_HPI_DUPLICATE is returned if Area identified with AreaId already ** exists in the IDR. ** SA_ERR_HPI_READ_ONLY is returned if the IDR is read-only and does not allow ** the addition of the area. ** ** Remarks: ** On successful completion, a new Area with the specified AreaId and AreaType ** is added to the IDR. ** ** On successful completion, the ReadOnly element in the new Area's header is ** always False. ** ** SAHPI_IDR_AREATYPE_UNSPECIFIED is not a valid area type and should not be ** used with this function. If SAHPI_IDR_AREATYPE_UNSPECIFIED is specified as ** the area type, an error code of SA_ERR_HPI_INVALID_DATA is returned. This ** area type is only valid when used with the saHpiIdrAreaHeaderGet() function ** to retrieve areas of an unspecified type. ** ** SAHPI_FIRST_ENTRY is a valid AreaId and can be used with this function, ** provided the IDR does not have a pre-existing Area with that AreaId. Upon ** successful addition, this new Area becomes the first Area in the IDR and is ** returned when retrieving Areas using saHpiIdrAreaHeaderGet() with ** AreaId=SAHPI_FIRST_ENTRY. Implementations should document how added Areas ** are ordered in an IDR. ** ** Some implementations may restrict the types of Areas that may be added. ** These restrictions should be documented. SA_ERR_HPI_INVALID_DATA is ** returned when attempting to add an invalid area type. ** ** ** *******************************************************************************/ SaErrorT SAHPI_API saHpiIdrAreaAddById( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT IdrId, SAHPI_IN SaHpiIdrAreaTypeT AreaType, SAHPI_IN SaHpiEntryIdT AreaId ); /******************************************************************************* ** ** Name: saHpiIdrAreaDelete() ** ** Description: ** This function is used to delete an Inventory Data Area, including the Area ** header and all fields contained with the area, from a particular Inventory ** Data Repository. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** IdrId - [in] Identifier for the Inventory Data Repository. ** AreaId - [in] Identifier of Area entry to delete from the IDR. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support an ** Inventory Data Repository, as indicated by ** SAHPI_CAPABILITY_INVENTORY_DATA in the resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the: ** * IDR is not present. ** * Area identified by the AreaId parameter does not exist within the IDR. ** SA_ERR_HPI_INVALID_PARAMS is returned when the AreaId is an invalid ** reserved value such as SAHPI_LAST_ENTRY. ** SA_ERR_HPI_READ_ONLY is returned if the: ** * IDA is read-only and therefore cannot be deleted. ** * IDA contains a read-only Field and therefore cannot be deleted. ** * IDR is read-only as deletions are not permitted for an area from a ** read-only IDR. ** ** Remarks: ** Deleting an Inventory Data Area also deletes all fields contained within ** the area. ** ** In some implementations, certain Areas are intrinsically read-only. The ** ReadOnly flag in the area header indicates if the Area is read-only. ** ** If the Inventory Data Area is not read-only, but contains a Field that is ** read-only, the Area cannot be deleted. An attempt to delete an Area that ** contains a read-only Field returns an error. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiIdrAreaDelete( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT IdrId, SAHPI_IN SaHpiEntryIdT AreaId ); /******************************************************************************* ** ** Name: saHpiIdrFieldGet() ** ** Description: ** This function returns the Inventory Data Field information from a ** particular Inventory Data Area and Repository. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** IdrId - [in] Identifier for the Inventory Data Repository. ** AreaId - [in] Area identifier for the IDA. ** FieldType - [in] Type of Inventory Data Field. ** FieldId - [in] Identifier of Field to retrieve from the IDA. Reserved ** FieldId values: ** * SAHPI_FIRST_ENTRY Get first entry. ** * SAHPI_LAST_ENTRY Reserved as a delimiter for end of list. Not a valid ** FieldId. ** NextFieldId - [out] Pointer to location to store the FieldId of next field ** of the requested type in the IDA. ** Field - [out] Pointer to Inventory Data Field into which the field ** information is placed. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support an ** Inventory Data Repository, as indicated by ** SAHPI_CAPABILITY_INVENTORY_DATA in the resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the: ** * IDR is not present. ** * Area identified by AreaId is not present. ** * FieldType parameter is set to SAHPI_IDR_FIELDTYPE_UNSPECIFIED, and the ** field specified by the FieldId parameter does not exist in the IDA. ** * FieldType parameter is set to a specific field type, but a field matching ** both the FieldId parameter and FieldType parameter does not exist. ** SA_ERR_HPI_INVALID_PARAMS is returned if: ** * FieldType is not one of the valid enumerated values for this type. ** * The AreaId or FieldId is an invalid reserved value such as ** SAHPI_LAST_ENTRY. ** * The NextFieldId pointer is passed in as NULL. ** * The Field pointer is passed in as NULL. ** ** Remarks: ** This function allows retrieval of an Inventory Data Field by one of two ** ways: by FieldId regardless of type or by FieldType and FieldId. ** ** To retrieve all fields contained within an IDA, set the FieldType parameter ** to SAHPI_IDR_FIELDTYPE_UNSPECIFIED, and set the FieldId parameter to ** SAHPI_FIRST_ENTRY for the first call. For each subsequent call, set the ** FieldId parameter to the value returned in the NextFieldId parameter. ** Continue calling this function until the NextFieldId parameter contains the ** value SAHPI_LAST_ENTRY. ** ** To retrieve fields of a specific type within an IDA, set the FieldType ** parameter to a valid Field type enumeration. Use the FieldId parameter in ** the same manner described above to retrieve all fields of the specified ** type. Set the FieldId parameter to SAHPI_FIRST_ENTRY to retrieve the first ** field of that type. Use the value returned in NextFieldId to retrieve the ** remaining fields of that type until SAHPI_LAST_ENTRY is returned. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiIdrFieldGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT IdrId, SAHPI_IN SaHpiEntryIdT AreaId, SAHPI_IN SaHpiIdrFieldTypeT FieldType, SAHPI_IN SaHpiEntryIdT FieldId, SAHPI_OUT SaHpiEntryIdT *NextFieldId, SAHPI_OUT SaHpiIdrFieldT *Field ); /******************************************************************************* ** ** Name: saHpiIdrFieldAdd() ** ** Description: ** This function is used to add a field to the specified Inventory Data Area ** with a specific Inventory Data Repository. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** IdrId - [in] Identifier for the Inventory Data Repository. ** Field- [in/out] Pointer to Inventory Data Field, which contains the new ** field information to add to the IDA. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support an ** Inventory Data Repository, as indicated by ** SAHPI_CAPABILITY_INVENTORY_DATA in the resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the: ** * IDR is not present. ** * Area identified by Field->AreaId does not exist within the IDR. ** SA_ERR_HPI_INVALID_DATA is returned if the Field data is incorrectly ** formatted or does not meet the restrictions for the implementation. ** SA_ERR_HPI_OUT_OF_SPACE is returned if the IDR does not have enough free ** space to allow the addition of the field. ** SA_ERR_HPI_READ_ONLY is returned if the Area identified by Field->AreaId is ** read-only and does not allow addition of fields. ** SA_ERR_HPI_INVALID_PARAMS is returned if the: ** * The Field type is not one of the valid field type enumerated values. ** * Field type, Field->Type, is set to SAHPI_IDR_FIELDTYPE_UNSPECIFIED. ** * SaHpiTextBufferT structure passed as part of the Field parameter is not ** valid. This occurs when: ** * The DataType is not one of the enumerated values for that type, or ** * The data field contains characters that are not legal according to the ** value of DataType, or ** * The Language is not one of the enumerated values for that type when the ** DataType is SAHPI_TL_TYPE_UNICODE or SAHPI_TL_TYPE_TEXT. ** * Field pointer is passed in as NULL. ** ** Remarks: ** The FieldId element within the Field parameter is not used by this ** function. Instead, on successful completion, the FieldId field is set to ** the new value associated with the added Field. ** ** The ReadOnly element in the Field parameter is not used by this function. ** On successful completion, the ReadOnly element in the new Field is always ** False. ** ** Addition of a read-only Inventory Data Field is not allowed; therefore, the ** ReadOnly element in the Field parameter is ignored. ** ** SAHPI_IDR_FIELDTYPE_UNSPECIFIED is not a valid field type and should not be ** used with this function. If SAHPI_IDR_FIELDTYPE_UNSPECIFIED is specified ** as the field type, an error code of SA_ERR_HPI_INVALID_PARAMS is returned. ** This field type is only valid when used with the saHpiIdrFieldGet() ** function to retrieve fields of an unspecified type. ** ** Some implementations have restrictions on what fields are valid in specific ** areas and/or the data format of some fields. These restrictions should be ** documented. SA_ERR_HPI_INVALID_DATA is returned when the field type or ** field data does not meet the implementation-specific restrictions. ** ** The AreaId element within the Field parameter identifies the specific IDA ** into which the new field is added. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiIdrFieldAdd( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT IdrId, SAHPI_INOUT SaHpiIdrFieldT *Field ); /******************************************************************************* ** ** Name: saHpiIdrFieldAddById() ** ** Description: ** This function is used to add a field with a specific FieldId to the ** specified Inventory Data Area of a specific Inventory Data Repository. This ** function differs from saHpiIdrFieldAdd() in that it allows the HPI User to ** add a Field with a specific FieldId. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** IdrId - [in] Identifier for the Inventory Data Repository. ** Field- [in] Pointer to Inventory Data Field, which contains the new field ** information to add to the IDA. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support an ** Inventory Data Repository, as indicated by ** SAHPI_CAPABILITY_INVENTORY_DATA in the resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the: ** * IDR is not present. ** * Area identified by Field->AreaId does not exist within the IDR. ** SA_ERR_HPI_INVALID_DATA is returned if the Field data is incorrectly ** formatted or does not meet the restrictions for the implementation. ** SA_ERR_HPI_DUPLICATE is returned if a Field identified with Field->FieldId ** already exists in the IDA. ** SA_ERR_HPI_OUT_OF_SPACE is returned if the IDR does not have enough free ** space to allow the addition of the field. ** SA_ERR_HPI_READ_ONLY is returned if the Area identified by Field->AreaId is ** read-only and does not allow addition of Fields. ** SA_ERR_HPI_INVALID_PARAMS is returned if the: ** * Field->FieldId or Field->AreaId is an invalid reserved value such as ** SAHPI_LAST_ENTRY. ** * The Field type is not one of the valid field type enumerated values. ** * Field type, Field->Type, is set to SAHPI_IDR_FIELDTYPE_UNSPECIFIED. ** * SaHpiTextBufferT structure passed as part of the Field parameter is not ** valid. This occurs when: ** * The DataType is not one of the enumerated values for that type, or ** * The data field contains characters that are not legal according to the ** value of DataType, or ** * The Language is not one of the enumerated values for that type when the ** DataType is SAHPI_TL_TYPE_UNICODE or SAHPI_TL_TYPE_TEXT. ** * Field pointer is passed in as NULL. ** ** Remarks: ** On successful completion a new Field with the FieldId specified within the ** Field parameter is added to the IDA identified by Field->AreaId. Thus, this ** function can be used to add Fields with user specified FieldId to non ** read-only Areas. ** ** The ReadOnly element in the Field parameter is not used by this function. ** On successful completion, the ReadOnly element in the new Field is always ** False. ** ** Addition of a read-only Inventory Data Field is not allowed; therefore, the ** ReadOnly element in the Field parameter is ignored. ** ** SAHPI_IDR_FIELDTYPE_UNSPECIFIED is not a valid field type and should not be ** used with this function. If SAHPI_IDR_FIELDTYPE_UNSPECIFIED is specified ** as the field type, an error code of SA_ERR_HPI_INVALID_PARAMS is returned. ** This field type is only valid when used with the saHpiIdrFieldGet() ** function to retrieve fields of an unspecified type. ** ** Some implementations have restrictions on what fields are valid in specific ** areas and/or the data format of some fields. These restrictions should be ** documented. SA_ERR_HPI_INVALID_DATA is returned when the field type or ** field data does not meet the implementation-specific restrictions. ** ** SAHPI_FIRST_ENTRY is a valid FieldId and can be used with this function, ** provided the IDA does not have a pre-existing Field with that FieldId. Upon ** successful addition, this new Field becomes the first field in the IDA and ** is returned when retrieving a Field using saHpiIdrFieldGet() with ** FieldId=SAHPI_FIRST_ENTRY. Implementations should document how added Fields ** are ordered in IDAs. ** ** The AreaId element within the Field parameter identifies the specific IDA ** into which the new field is added. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiIdrFieldAddById( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT IdrId, SAHPI_IN SaHpiIdrFieldT *Field ); /******************************************************************************* ** ** Name: saHpiIdrFieldSet() ** ** Description: ** This function is used to update an Inventory Data Field for a particular ** Inventory Data Area and Repository. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** IdrId - [in] Identifier for the Inventory Data Repository. ** Field - [in] Pointer to Inventory Data Field that contains the updated ** field information. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support an ** Inventory Data Repository, as indicated by ** SAHPI_CAPABILITY_INVENTORY_DATA in the resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the: ** * IDR is not present. ** * Area identified by Field->AreaId does not exist within the IDR or if the ** Field does not exist within the Inventory Data Area. ** SA_ERR_HPI_INVALID_PARAMS is returned if the: ** * Field pointer is passed in as NULL. ** * Field type, Field->Type, is not set to one of the valid field type ** enumerated values. ** * Field type, Field->Type, is set to SAHPI_IDR_FIELDTYPE_UNSPECIFIED. ** SA_ERR_HPI_INVALID_DATA is returned if the field data is incorrectly ** formatted or does not meet the restrictions for the implementation. ** SA_ERR_HPI_OUT_OF_SPACE is returned if the IDR does not have enough free ** space to allow the modification of the field due to an increase in the ** field size. ** SA_ERR_HPI_READ_ONLY is returned if the Field is read-only and does not ** allow modifications. ** SA_ERR_HPI_INVALID_PARAMS is returned if the SaHpiTextBufferT structure ** passed as part of the Field parameter is not valid. This occurs when: ** * The DataType is not one of the enumerated values for that type, or ** * The data field contains characters that are not legal according to the ** value of DataType, or ** * The Language is not one of the enumerated values for that type when the ** DataType is SAHPI_TL_TYPE_UNICODE or SAHPI_TL_TYPE_TEXT. ** ** Remarks: ** This function allows modification of both the FieldType and Field data of a ** given Inventory Data Field. This function does not allow modification of ** the read-only attribute of the Inventory Data Field; therefore after a ** successful update, the ReadOnly element in the updated Field is always ** False. The input value for ReadOnly is ignored. ** ** SAHPI_IDR_FIELDTYPE_UNSPECIFIED is not a valid field type and should not be ** used with this function. If SAHPI_IDR_FIELDTYPE_UNSPECIFIED is specified ** as the new field type, an error code of SA_ERR_HPI_INVALID_DATA is ** returned. This field type is only valid when used with the ** saHpiIdrFieldGet() function to retrieve fields of an unspecified type. ** ** Some implementations have restrictions on what fields are valid in specific ** areas and/or the data format of some fields. These restrictions should be ** documented. SA_ERR_HPI_INVALID_DATA is returned when the field type or ** field data does not meet the implementation-specific restrictions. ** ** In some implementations, certain Fields are intrinsically read-only. The ** ReadOnly flag, in the field structure, indicates if the Field is read-only. ** ** SAHPI_FIRST_ENTRY is a valid FieldId for this function and can be used to ** update the first Field in the Area. If a Field with FieldId equal to ** SAHPI_FIRST_ENTRY exists within the Area then it is always the first Field ** in the Area. ** ** The Field to update is identified by the AreaId and FieldId elements within ** the Field parameter. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiIdrFieldSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT IdrId, SAHPI_IN SaHpiIdrFieldT *Field ); /******************************************************************************* ** ** Name: saHpiIdrFieldDelete() ** ** Description: ** This function is used to delete an Inventory Data Field from a particular ** Inventory Data Area and Repository. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** IdrId - [in] Identifier for the Inventory Data Repository. ** AreaId - [in] Area identifier for the IDA. ** FieldId - [in] Identifier of Field to delete from the IDA. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support an ** Inventory Data Repository, as indicated by ** SAHPI_CAPABILITY_INVENTORY_DATA in the resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the: ** * IDR is not present. ** * Area identified by the AreaId parameter does not exist within the IDR, or ** if the Field identified by the FieldId parameter does not exist within ** the IDA. ** SA_ERR_HPI_READ_ONLY is returned if the Field or the IDA it exists in is ** read-only and does not allow deletion. ** SA_ERR_HPI_INVALID_PARAMS is returned when the AreaId or FieldId is an ** invalid reserved value such as SAHPI_LAST_ENTRY. ** ** Remarks: ** In some implementations, certain fields are intrinsically read-only. The ** ReadOnly flag, in the field structure, indicates if the field is read-only. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiIdrFieldDelete( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT IdrId, SAHPI_IN SaHpiEntryIdT AreaId, SAHPI_IN SaHpiEntryIdT FieldId ); /******************************************************************************* ** ** Name: saHpiWatchdogTimerGet() ** ** Description: ** This function retrieves the current Watchdog Timer settings and ** configuration. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** WatchdogNum - [in] Watchdog number that specifies the Watchdog Timer on a ** resource. ** Watchdog - [out] Pointer to Watchdog data structure. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support a ** Watchdog Timer, as indicated by SAHPI_CAPABILITY_WATCHDOG in the ** resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the WatchdogNum is not present. ** SA_ERR_HPI_INVALID_PARAMS is returned when the Watchdog pointer is passed ** in as NULL. ** ** Remarks: ** See the description of the SaHpiWatchdogT structure in Section 8.11 for ** details on what information is returned by this function. ** ** When the Watchdog action is SAHPI_WA_RESET, the type of reset (warm or ** cold) is implementation-dependent. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiWatchdogTimerGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiWatchdogNumT WatchdogNum, SAHPI_OUT SaHpiWatchdogT *Watchdog ); /******************************************************************************* ** ** Name: saHpiWatchdogTimerSet() ** ** Description: ** This function provides a method for initializing the Watchdog Timer ** configuration. ** ** Once the appropriate configuration has been set using ** saHpiWatchdogTimerSet(), an HPI User must then call ** saHpiWatchdogTimerReset() to initially start the Watchdog Timer, unless the ** Watchdog Timer was already running prior to calling saHpiWatchdogTimerSet() ** and the Running field in the passed Watchdog structure is True. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** WatchdogNum - [in] The Watchdog number specifying the specific Watchdog ** Timer on a resource. ** Watchdog - [in] Pointer to Watchdog data structure. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support a ** Watchdog Timer, as indicated by SAHPI_CAPABILITY_WATCHDOG in the ** resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the WatchdogNum is not present. ** SA_ERR_HPI_INVALID_PARAMS is returned when the: ** * Watchdog->TimerUse is not one of the valid enumerated values for this ** type. ** * Watchdog->TimerAction is not one of the valid enumerated values for this ** type. ** * Watchdog->PretimerInterrupt is not one of the valid enumerated values for ** this type. ** * Watchdog pointer is passed in as NULL. ** SA_ERR_HPI_INVALID_DATA is returned when the: ** * Watchdog->PreTimeoutInterval is outside the acceptable range for the ** implementation. ** * Watchdog->InitialCount is outside the acceptable range for the ** implementation. ** * Value of Watchdog->PreTimeoutInterval is greater than the value of ** Watchdog->InitialCount. ** * Watchdog->PretimerInterrupt is set to an unsupported value. See remarks. ** * Watchdog->TimerAction is set to an unsupported value. See remarks. ** * Watchdog->TimerUse is set to an unsupported value. See remarks. ** ** Remarks: ** Configuring the Watchdog Timer with the saHpiWatchdogTimerSet() function ** does not start the timer running. If the timer was previously stopped when ** this function is called, then it remains stopped, and it must be started by ** calling saHpiWatchdogTimerReset(). If the timer was previously running, ** then it continues to run if the Watchdog->Running field passed is True, or ** is stopped if the Watchdog->Running field passed is False. If it continues ** to run, it restarts its count-down from the newly configured initial count ** value. ** ** If the initial counter value is set to 0, any configured pre-timer ** interrupt action or Watchdog Timer expiration action is taken immediately ** when the Watchdog Timer is started. This provides a mechanism for software ** to force an immediate recovery action should that be dependent on a ** Watchdog timeout occurring. ** ** For more details on the effects of this command related to specific data ** passed in that structure, see the description of the SaHpiWatchdogT ** structure. ** ** Some implementations impose a limit on the acceptable ranges for the ** PreTimeoutInterval or InitialCount. These limitations must be documented. ** SA_ERR_HPI_INVALID_DATA is returned if an attempt is made to set a value ** outside of the supported range. ** ** Some implementations cannot accept all of the enumerated values for ** TimerUse, TimerAction, or PretimerInterrupt. These restrictions should be ** documented. SA_ERR_HPI_INVALID_DATA is returned if an attempt is made to ** select an unsupported option. ** ** When the Watchdog action is set to SAHPI_WA_RESET, the type of reset (warm ** or cold) is implementation-dependent. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiWatchdogTimerSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiWatchdogNumT WatchdogNum, SAHPI_IN SaHpiWatchdogT *Watchdog ); /******************************************************************************* ** ** Name: saHpiWatchdogTimerReset() ** ** Description: ** This function provides a method to start or restart the Watchdog Timer from ** the initial countdown value. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** WatchdogNum - [in] The Watchdog number specifying the specific Watchdog ** Timer on a resource. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support a ** Watchdog Timer, as indicated by SAHPI_CAPABILITY_WATCHDOG in the ** resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the WatchdogNum is not present. ** SA_ERR_HPI_INVALID_REQUEST is returned if the current Watchdog state does ** not allow a reset. ** ** Remarks: ** If the Watchdog has been configured to issue a Pre-Timeout interrupt, and ** that interrupt has already occurred, the saHpiWatchdogTimerReset() function ** cannot be used to reset the Watchdog Timer. The only way to stop a ** Watchdog from timing out when a Pre-Timeout interrupt has occurred is to ** use the saHpiWatchdogTimerSet() function to reconfigure and/or stop the ** timer. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiWatchdogTimerReset ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiWatchdogNumT WatchdogNum ); /******************************************************************************* ** ** Name: saHpiAnnunciatorGetNext() ** ** Description: ** This function allows retrieval of an announcement from the current set of ** announcements held in the Annunciator. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** AnnunciatorNum - [in] Annunciator number for the addressed Annunciator. ** Severity - [in] Severity level of announcements to retrieve. Set to ** SAHPI_ALL_SEVERITIES to retrieve announcement of any severity; ** otherwise, set to requested severity level. ** UnacknowledgedOnly - [in] Set to True to indicate only unacknowledged ** announcements should be returned. Set to False to indicate either an ** acknowledged or an unacknowledged announcement may be returned. ** Announcement - [in/out] Pointer to the structure to hold the returned ** announcement. Also, on input, Announcement->EntryId and ** Announcement->Timestamp are used to identify the "previous" ** announcement. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support ** Annunciators, as indicated by SAHPI_CAPABILITY_ANNUNCIATOR in the ** resource's RPT entry. ** SA_ERR_HPI_INVALID_PARAMS is returned when Severity is not one of the valid ** enumerated values for this type. ** SA_ERR_HPI_NOT_PRESENT is returned if: ** * The AnnunciatorNum passed does not address a valid Annunciator supported ** by the resource. ** * There are no announcements (or no unacknowledged announcements if ** UnacknowledgedOnly is True) that meet the specified Severity in the ** current set after the announcement identified by ** Announcement->EntryId and Announcement->Timestamp. ** * There are no announcements (or no unacknowledged announcements if ** UnacknowledgedOnly is True) that meet the specified Severity in the ** current set if the passed Announcement->EntryId field was set to ** SAHPI_FIRST_ENTRY. ** SA_ERR_HPI_INVALID_PARAMS is returned when the Announcement parameter is ** passed in as NULL. ** SA_ERR_HPI_INVALID_DATA is returned if the passed Announcement->EntryId ** matches an announcement in the current set, but the passed ** Announcement->Timestamp does not match the timestamp of that ** announcement. ** ** Remarks: ** All announcements contained in the set are maintained in the order in which ** they were added. This function returns the next announcement meeting the ** specifications given by an HPI User that was added to the set after the ** announcement whose EntryId and timestamp is passed by an HPI User. If ** SAHPI_FIRST_ENTRY is passed as the EntryId, the first announcement in the ** set meeting the specifications given by an HPI User is returned. This ** function should operate even if the announcement associated with the ** EntryId and Timestamp passed by an HPI User has been deleted. ** ** Selection can be restricted to only announcements of a specified severity, ** and/or only unacknowledged announcements. To retrieve all announcements ** contained meeting specific requirements, call saHpiAnnunciatorGetNext() ** with the Status->EntryId field set to SAHPI_FIRST_ENTRY and the Severity ** and UnacknowledgedOnly parameters set to select what announcements should ** be returned. Then, repeatedly call saHpiAnnunciatorGetNext() passing the ** previously returned announcement as the Announcement parameter, and the ** same values for Severity and UnacknowledgedOnly until the function returns ** with the error code SA_ERR_HPI_NOT_PRESENT. ** ** SAHPI_FIRST_ENTRY and SAHPI_LAST_ENTRY are reserved EntryId values, and are ** never assigned to an announcement. ** ** The elements EntryId and Timestamp are used in the Announcement parameter ** to identify the "previous" announcement; the next announcement added to the ** table after this announcement that meets the Severity and ** UnacknowledgedOnly requirements is returned. Announcement->EntryId may be ** set to SAHPI_FIRST_ENTRY to select the first announcement in the current ** set meeting the Severity and UnacknowledgedOnly requirements. If ** Announcement->EntryId is SAHPI_FIRST_ENTRY, then Announcement->Timestamp is ** ignored. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiAnnunciatorGetNext( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiAnnunciatorNumT AnnunciatorNum, SAHPI_IN SaHpiSeverityT Severity, SAHPI_IN SaHpiBoolT UnacknowledgedOnly, SAHPI_INOUT SaHpiAnnouncementT *Announcement ); /******************************************************************************* ** ** Name: saHpiAnnunciatorGet() ** ** Description: ** This function allows retrieval of a specific announcement in the ** Annunciator's current set by referencing its EntryId. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** AnnunciatorNum - [in] Annunciator number for the addressed Annunciator. ** EntryId - [in] Identifier of the announcement to retrieve from the ** Annunciator. ** Announcement - [out] Pointer to the structure to hold the returned ** announcement. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support ** Annunciators, as indicated by SAHPI_CAPABILITY_ANNUNCIATOR in the ** resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if: ** * The AnnunciatorNum passed does not address a valid Annunciator supported ** by the resource. ** * The requested EntryId does not correspond to an announcement contained in ** the Annunciator. ** SA_ERR_HPI_INVALID_PARAMS is returned if: ** * The Announcement parameter is passed in as NULL. ** * The EntryId parameter passed is SAHPI_FIRST_ENTRY or SAHPI_LAST_ENTRY. ** ** Remarks: ** SAHPI_FIRST_ENTRY and SAHPI_LAST_ENTRY are reserved EntryId values and are ** never assigned to announcements. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiAnnunciatorGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiAnnunciatorNumT AnnunciatorNum, SAHPI_IN SaHpiEntryIdT EntryId, SAHPI_OUT SaHpiAnnouncementT *Announcement ); /******************************************************************************* ** ** Name: saHpiAnnunciatorAcknowledge() ** ** Description: ** This function allows an HPI User to acknowledge a single announcement or a ** group of announcements by severity. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** AnnunciatorNum - [in] Annunciator number for the addressed Annunciator. ** EntryId - [in] Entry identifier of the announcement to acknowledge. ** Reserved EntryId values: ** * SAHPI_ENTRY_UNSPECIFIED Ignore this parameter. ** Severity - [in] Severity level of announcements to acknowledge. Ignored ** unless EntryId is SAHPI_ENTRY_UNSPECIFIED. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support ** Annunciators, as indicated by SAHPI_CAPABILITY_ANNUNCIATOR in the ** resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if: ** * The AnnunciatorNum passed does not address a valid Annunciator supported ** by the resource. ** * An announcement identified by the EntryId parameter does not exist in the ** current set. ** SA_ERR_HPI_INVALID_PARAMS is returned if EntryId is SAHPI_ENTRY_UNSPECIFIED ** and Severity is not one of the valid enumerated values for this type. ** ** Remarks: ** Announcements are acknowledged one of two ways: a single announcement by ** EntryId regardless of severity or a group of announcements by severity ** regardless of EntryId. ** ** An HPI User acknowledges an announcement to influence the platform-specific ** annunciation provided by the Annunciator management instrument. ** ** An acknowledged announcement has the Acknowledged field set to True. ** ** To acknowledge all announcements contained within the current set, set the ** Severity parameter to SAHPI_ALL_SEVERITIES, and set the EntryId parameter ** to SAHPI_ENTRY_UNSPECIFIED. ** ** To acknowledge all announcements of a specific severity, set the Severity ** parameter to the appropriate value, and set the EntryId parameter to ** SAHPI_ENTRY_UNSPECIFIED. ** ** To acknowledge a single announcement, set the EntryId parameter to a value ** other than SAHPI_ENTRY_UNSPECIFIED. The EntryId must be a valid identifier ** for an announcement present in the current set. ** ** If an announcement has been previously acknowledged, acknowledging it again ** has no effect. However, this is not an error. ** ** If the EntryId parameter has a value other than SAHPI_ENTRY_UNSPECIFIED, ** the Severity parameter is ignored. ** ** If the EntryId parameter is passed as SAHPI_ENTRY_UNSPECIFIED, and no ** announcements are present that meet the requested Severity, this function ** has no effect. However, this is not an error. ** ** SAHPI_ENTRY_UNSPECIFIED is defined as the same value as SAHPI_FIRST_ENTRY, ** so using either symbol has the same effect. However, ** SAHPI_ENTRY_UNSPECIFIED should be used with this function for clarity. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiAnnunciatorAcknowledge( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiAnnunciatorNumT AnnunciatorNum, SAHPI_IN SaHpiEntryIdT EntryId, SAHPI_IN SaHpiSeverityT Severity ); /******************************************************************************* ** ** Name: saHpiAnnunciatorAdd() ** ** Description: ** This function is used to add an announcement to the set of items held by an ** Annunciator management instrument. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** AnnunciatorNum - [in] Annunciator number for the addressed Annunciator. ** Announcement - [in/out] Pointer to structure that contains the new ** announcement to add to the set. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support ** Annunciators, as indicated by SAHPI_CAPABILITY_ANNUNCIATOR in the ** resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the AnnunciatorNum passed does not ** address a valid Annunciator supported by the resource. ** SA_ERR_HPI_INVALID_PARAMS is returned when: ** * The Announcement pointer is passed in as NULL. ** * The Announcement->Severity field is not one of the enumerated values for ** that type, or it is equal to SAHPI_ALL_SEVERITIES. ** * The Announcement->StatusCond.Type field is not one of the enumerated ** values for that type. ** * The SaHpiNameT structure passed as part of the Announcement structure has ** a Length field greater than SA_HPI_MAX_NAME_LENGTH. ** * The SaHpiTextBufferT structure passed as part of the Announcement ** structure is not valid. This would occur when: ** * The DataType is not one of the enumerated values for that type, or ** * The Data field contains characters that are not legal according to the ** value of DataType, or ** * The Language is not one of the enumerated values for that type when the ** DataType is SAHPI_TL_TYPE_UNICODE or SAHPI_TL_TYPE_TEXT. ** SA_ERR_HPI_OUT_OF_SPACE is returned if the Annunciator is not able to add ** an additional announcement due to resource limits. ** SA_ERR_HPI_READ_ONLY is returned if the Annunciator is in auto mode. ** ** Remarks: ** The EntryId, Timestamp, and AddedByUser fields within the Announcement ** parameter are not used by this function. Instead, on successful ** completion, these fields are set to new values associated with the added ** announcement. AddedByUser is always set to True. ** ** The Entity, DomainId, ResourceId, SensorNum, Name, and Mid fields in the ** SaHpiConditionT structure passed as part of the Announcement parameter ** should not be validated by the HPI implementation. Any values passed by an ** HPI User in these fields should be accepted. ** ** Unless one of the error conditions described above are detected, or a ** generic error condition from Section 4.2 is returned, the announcement ** should be added to the set of items held by the Annunciator. Note, ** however, that unless the Annunciator is in "User" mode, the announcement ** may be removed by the implementation at any time. Other actions taken by ** the HPI implementation when announcements are added to the Annunciator are ** implementation-specific. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiAnnunciatorAdd( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiAnnunciatorNumT AnnunciatorNum, SAHPI_INOUT SaHpiAnnouncementT *Announcement ); /******************************************************************************* ** ** Name: saHpiAnnunciatorDelete() ** ** Description: ** This function allows an HPI User to delete a single announcement or a group ** of announcements from the current set of an Annunciator. Announcements may ** be deleted individually by specifying a specific EntryId, or they may be ** deleted as a group by specifying a severity. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** AnnunciatorNum - [in] Annunciator number for the addressed Annunciator. ** EntryId - [in] Entry identifier of the announcement to delete. Reserved ** EntryId values: ** * SAHPI_ENTRY_UNSPECIFIED Ignore this parameter. ** Severity - [in] Severity level of announcements to delete. Ignored unless ** EntryId is SAHPI_ENTRY_UNSPECIFIED. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support ** Annunciators, as indicated by SAHPI_CAPABILITY_ANNUNCIATOR in the ** resource's RPT entry. ** SA_ERR_HPI_INVALID_PARAMS is returned if EntryId is SAHPI_ENTRY_UNSPECIFIED ** and Severity is not one of the valid enumerated values for this type. ** SA_ERR_HPI_NOT_PRESENT is returned if: ** * The AnnunciatorNum passed does not address a valid Annunciator supported ** by the resource. ** * An announcement identified by the EntryId parameter does not exist in the ** current set of the Annunciator. ** SA_ERR_HPI_READ_ONLY is returned if the Annunciator is in auto mode. ** ** Remarks: ** To delete a single, specific announcement, set the EntryId parameter to a ** value representing an actual announcement in the current set. The Severity ** parameter is ignored when the EntryId parameter is set to a value other ** than SAHPI_ENTRY_UNSPECIFIED. ** ** To delete a group of announcements, set the EntryId parameter to ** SAHPI_ENTRY_UNSPECIFIED, and set the Severity parameter to identify which ** severity of announcements should be deleted. To clear all announcements ** contained within the Annunciator, set the Severity parameter to ** SAHPI_ALL_SEVERITIES. ** ** If the EntryId parameter is passed as SAHPI_ENTRY_UNSPECIFIED, and no ** announcements are present that meet the specified Severity, this function ** has no effect. However, this is not an error. ** ** SAHPI_ENTRY_UNSPECIFIED is defined as the same value as SAHPI_FIRST_ENTRY, ** so using either symbol has the same effect. However, ** SAHPI_ENTRY_UNSPECIFIED should be used with this function for clarity. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiAnnunciatorDelete( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiAnnunciatorNumT AnnunciatorNum, SAHPI_IN SaHpiEntryIdT EntryId, SAHPI_IN SaHpiSeverityT Severity ); /******************************************************************************* ** ** Name: saHpiAnnunciatorModeGet() ** ** Description: ** This function allows an HPI User to retrieve the current operating mode of ** an Annunciator. The mode indicates whether an HPI User is allowed to add or ** delete items in the set, and whether the HPI implementation automatically ** adds or deletes items in the set. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** AnnunciatorNum - [in] Annunciator number for the addressed Annunciator. ** Mode - [out] Pointer to location to store the current operating mode of the ** Annunciator where the returned value is one of the following: ** * SAHPI_ANNUNCIATOR_MODE_AUTO - the HPI implementation may add or delete ** announcements in the set; an HPI User may not add or delete ** announcements in the set. ** * SAHPI_ANNUNCIATOR_MODE_USER - the HPI implementation may not add or ** delete announcements in the set; an HPI User may add or delete ** announcements in the set. ** * SAHPI_ANNUNCIATOR_MODE_SHARED - both the HPI implementation and an HPI ** User may add or delete announcements in the set. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support ** Annunciators, as indicated by SAHPI_CAPABILITY_ANNUNCIATOR in the ** resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the AnnunciatorNum passed does not ** address a valid Annunciator supported by the resource. ** SA_ERR_HPI_INVALID_PARAMS is returned if Mode is passed in as NULL. ** ** Remarks: ** None. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiAnnunciatorModeGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiAnnunciatorNumT AnnunciatorNum, SAHPI_OUT SaHpiAnnunciatorModeT *Mode ); /******************************************************************************* ** ** Name: saHpiAnnunciatorModeSet() ** ** Description: ** This function allows an HPI User to change the current operating mode of an ** Annunciator. The mode indicates whether an HPI User is allowed to add or ** delete announcements in the set, and whether the HPI implementation ** automatically adds or deletes announcements in the set. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** AnnunciatorNum - [in] Annunciator number for the addressed Annunciator. ** Mode - [out] Mode to set for the Annunciator: ** * SAHPI_ANNUNCIATOR_MODE_AUTO - the HPI implementation may add or delete ** announcements in the set; an HPI User may not add or delete ** announcements in the set. ** * SAHPI_ANNUNCIATOR_MODE_USER - the HPI implementation may not add or ** delete announcements in the set; an HPI User may add or delete ** announcements in the set. ** * SAHPI_ANNUNCIATOR_MODE_SHARED - both the HPI implementation and an HPI ** User may add or delete announcements in the set. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support ** Annunciators, as indicated by SAHPI_CAPABILITY_ANNUNCIATOR in the ** resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the AnnunciatorNum passed does not ** address a valid Annunciator supported by the resource. ** SA_ERR_HPI_INVALID_PARAMS is returned if Mode is not a valid enumerated ** value for this type. ** SA_ERR_HPI_READ_ONLY is returned if mode changing is not permitted for this ** Annunciator. ** ** Remarks: ** None. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiAnnunciatorModeSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiAnnunciatorNumT AnnunciatorNum, SAHPI_IN SaHpiAnnunciatorModeT Mode ); /******************************************************************************* ** ** Name: saHpiDimiInfoGet() ** ** Description: ** This function gets information about the DIMI. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** DimiNum- [in] DIMI number ** DimiInfo- [out] DIMI Info ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support DIMI, as ** indicated by SAHPI_CAPABILITY_DIMI in the resource's RPT entry. ** SA_ERR_HPI_INVALID_PARAMS is returned if DimiInfo is passed as NULL. ** SA_ERR_HPI_NOT_PRESENT is returned if the: ** * DimiNum does not address a vaild DIMI supported by the resource. ** ** Remarks: ** An HPI User uses this function to get the number of tests provided by DIMI ** at any given time. An Update Counter is also returned; it can be used to ** detect whether the set of tests has changed since a previous call to this ** function. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiDimiInfoGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiDimiNumT DimiNum, SAHPI_OUT SaHpiDimiInfoT *DimiInfo ); /******************************************************************************* ** ** Name: saHpiDimiTestInfoGet() ** ** Description: ** This function gets information about a particular test. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** DimiNum- [in] DIMI number ** TestNum- [in] Test number ** DimiTest- [out] Pointer to location to store test information ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support DIMI, as ** indicated by SAHPI_CAPABILITY_DIMI in the resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the: ** * DimiNum does not address a valid DIMI supported by the resource. ** * TestNum is not a valid test number currently supported by the DIMI. ** SA_ERR_HPI_INVALID_PARAMS is returned if DimiTest is passed as NULL. ** ** Remarks: ** The HPI User can use this function to create a list of all available tests ** on a DIMI and get information for each test. Any time a DIMI is updated ** (the user is notified by an event), the HPI User should obtain the new test ** list by calling this function repeatedly for each TestNum. The output ** parameter DimiTest points to the structure providing the test information. ** DIMI test numbering is sequential, starting at 0. If there are 'n' tests ** in a DIMI, the first test is always 0, and the last test is (n-1). ** ** The test information returned by this call can contain a list of test ** parameters. Each parameter is defined by its name, type, minimum, and ** maximum values (if applicable for the type), and a default value. A short ** human readable description can also be provided. This parameter list can ** be used to populate a user interface, which is used to control the tests. ** The HPI User should use the definition of the test parameters to build a ** parameter list for invoking the test. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiDimiTestInfoGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiDimiNumT DimiNum, SAHPI_IN SaHpiDimiTestNumT TestNum, SAHPI_OUT SaHpiDimiTestT *DimiTest ); /******************************************************************************* ** ** Name: saHpiDimiTestReadinessGet() ** ** Description: ** This function provides the readiness of a DIMI to run a particular test. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** DimiNum- [in] DIMI number ** TestNum- [in] Test number ** DimiReady - [out] Pointer to location to store value that indicates if DIMI ** is ready to run indicated test ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support DIMIs, ** as indicated by SAHPI_CAPABILITY_DIMI in the resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the: ** * DimiNum does not address a valid DIMI supported by the resource. ** * TestNum is not a valid test number currently supported by the DIMI. ** SA_ERR_HPI_INVALID_PARAMS is returned if DimiReady is passed as NULL. ** ** Remarks: ** None. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiDimiTestReadinessGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiDimiNumT DimiNum, SAHPI_IN SaHpiDimiTestNumT TestNum, SAHPI_OUT SaHpiDimiReadyT *DimiReady ); /******************************************************************************* ** ** Name: saHpiDimiTestStart() ** ** Description: ** This function starts execution of a given test on the DIMI. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** DimiNum- [in] DIMI number ** TestNum- [in] Test number ** NumberOfParams - [in] Number of variable parameters that are contained in ** the array to which ParamsList points. ** ParamsList - [in] Pointer to array containing variable parameters for the ** test. The parameters must be created based on the information returned ** by the saHpiDimiTestInfoGet() function. The names and parameter types ** must match exactly. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support DIMI, as ** indicated by SAHPI_CAPABILITY_DIMI in the resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the: ** * DimiNum does not address a valid DIMI supported by the resource. ** * TestNum is not a valid test number currently supported by the DIMI. ** SA_ERR_HPI_INVALID_STATE is returned if the Test Readiness status for the ** requested test is not SAHPI_DIMI_READY ** SA_ERR_HPI_INVALID_PARAMS is returned if ParamsList is NULL and ** NumberOfParams is non-zero. ** SA_ERR_HPI_INVALID_DATA is returned if a passed parameter ** * Has a name that does not correspond to any of the parameters for the test ** * Is of the wrong type for the named parameter ** * Has an invalid value for the named parameter ** ** Remarks: ** The saHpiDimiTestStart() function starts execution of given test. An HPI ** User should prepare the system before running a test. When the system is ** prepared to run a test, the DIMI will report a status of SAHPI_DIMI_READY ** to the saHpiDimiTestReadinessGet() function. If an attempt is made to ** start a test that does not report that status, no action is taken, and ** SA_ERR_HPI_INVALID_REQUEST is returned. HPI Events are generated when the ** test is started and when it ends. ** ** ParamsList is a pointer to an array of SaHpiDimiTestVariableParamsT ** structures, the number of elements given by NumberOfParams. The parameters ** list is created based on the information returned by the ** saHpiDimiTestInfoGet() function. The names and parameter types must match ** exactly. For unspecified parameters, the test is started using the default ** parameters defined in the test structure. If NumberOfParams is zero, ** ParamsList is ignored and may be NULL. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiDimiTestStart ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiDimiNumT DimiNum, SAHPI_IN SaHpiDimiTestNumT TestNum, SAHPI_IN SaHpiUint8T NumberOfParams, SAHPI_IN SaHpiDimiTestVariableParamsT *ParamsList ); /******************************************************************************* ** ** Name: saHpiDimiTestCancel() ** ** Description: ** This function cancels the test running on the DIMI. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** DimiNum- [in] DIMI number ** TestNum- [in] Test number ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support DIMI, as ** indicated by SAHPI_CAPABILITY_DIMI in the resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the: ** * DimiNum does not address a valid DIMI supported by the resource. ** * TestNum is not a valid test number currently supported by the DIMI. ** SA_ERR_HPI_INVALID_STATE is returned if the test is not running ** SA_ERR_INVALID_REQUEST returned if DIMI cannot cancel the test. ** ** Remarks: ** The saHpiDimiTestCancel() function is used to stop a running test. An HPI ** User must stop each test individually. An asynchronous event is generated ** to indicate test completion or cancellation. The saHpiDimiTestStatusGet() ** and saHpiDimiTestResultsGet() functions also reflect the status of the ** stopped test. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiDimiTestCancel ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiDimiNumT DimiNum, SAHPI_IN SaHpiDimiTestNumT TestNum ); /******************************************************************************* ** ** Name: saHpiDimiTestStatusGet() ** ** Description: ** This function returns the status of a particular test. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** DimiNum- [in] DIMI number ** TestNum- [in] Test number ** PercentCompleted- [out] Pointer to location to store percentage of test ** completed, based on implementation capability. Value = 0 - 100, 0xFF ** returned if capability not available. If NULL, no value will be ** returned. ** RunStatus- [out] Pointer to location to store the status of the last run of ** the test. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support DIMI, as ** indicated by SAHPI_CAPABILITY_DIMI in the resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the: ** * DimiNum does not address a valid DIMI supported by the resource. ** * TestNum is not a valid test number currently supported by the DIMI. ** SA_ERR_HPI_INVALID_PARAMS is returned if RunStatus is passed as NULL. ** ** Remarks: ** The saHpiDimiTestStatusGet() function is used to obtain the current status ** of tests. If PercentCompleted is passed as NULL, the function returns only ** RunStatus. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiDimiTestStatusGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiDimiNumT DimiNum, SAHPI_IN SaHpiDimiTestNumT TestNum, SAHPI_OUTNN SaHpiDimiTestPercentCompletedT *PercentCompleted, SAHPI_OUT SaHpiDimiTestRunStatusT *RunStatus ); /******************************************************************************* ** ** Name: saHpiDimiTestResultsGet() ** ** Description: ** This function retrieves the results from the last run of a Test on the ** DIMI. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** DimiNum- [in] DIMI number ** TestNum- [in] Test number ** TestResults- [out] Pointer to SaHpiDimiTestResultsT for results from last ** run. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support DIMI, as ** indicated by SAHPI_CAPABILITY_DIMI in the resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the: ** * DimiNum does not address a valid DIMI supported by the resource. ** * TestNum is not a valid test number currently supported by the DIMI. ** SA_ERR_HPI_INVALID_PARAMS is returned if TestResults is passed as NULL. ** ** Remarks: ** The saHpiDimiTestResultsGet() function is used to obtain the result of last ** run of a test. TestResultString in the TestResults structure can return a ** string or an URI that has the entire results stored (e.g. file, etc). This ** URI is interpreted by the HPI User. ** ** If the test is cancelled, TestResults still provides results from the ** cancelled run. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiDimiTestResultsGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiDimiNumT DimiNum, SAHPI_IN SaHpiDimiTestNumT TestNum, SAHPI_OUT SaHpiDimiTestResultsT *TestResults ); /******************************************************************************* ** ** Name: saHpiFumiSpecInfoGet() ** ** Description: ** This function is used to identify the specification-defined framework, if ** any, underlying a FUMI implementation. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** FumiNum - [in] FUMI number for which the spec information is to be ** returned. ** SpecInfo - [out] Pointer to the location to store spec information. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support Firmware ** Upgrade management instruments, as indicated by SAHPI_CAPABILITY_FUMI in ** the resource's RPT entry. ** SA_ERR_HPI_INVALID_PARAMS is returned if the SpecInfo parameter is passed ** as NULL. ** SA_ERR_HPI_NOT_PRESENT is returned if the FumiNum does not address a valid ** FUMI supported by the resource. ** ** Remarks: ** A FUMI provides a high-level abstraction of the firmware upgrade process. ** FUMI implementations can use any mechanisms or upgrade protocol to ** accomplish the actual upgrade. Some FUMIs use a specification-defined ** framework, and it may be helpful for an HPI User to be aware of any such ** framework that underlies the FUMI implementation. For some such ** frameworks, for instance, there may be additional sensors or controls ** associated with the FUMI that provide supplementary functionality specific ** to that framework. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiFumiSpecInfoGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_OUT SaHpiFumiSpecInfoT *SpecInfo ); /******************************************************************************* ** ** Name: saHpiFumiServiceImpactGet() ** ** Description: ** This function is used to obtain information about the potential service ** impact of an upgrade process on a FUMI. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** FumiNum - [in] FUMI number for which the service impact information is to ** be returned. ** ServiceImpact - [out] Pointer to the location to store information about ** the service impact. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support Firmware ** Upgrade management instruments, as indicated by SAHPI_CAPABILITY_FUMI in ** the resource's RPT entry. ** SA_ERR_HPI_INVALID_PARAMS is returned if the ServiceImpact parameter is ** passed as NULL. ** SA_ERR_HPI_NOT_PRESENT is returned if the FumiNum does not address a valid ** FUMI supported by the resource. ** ** Remarks: ** An upgrade process on a FUMI can affect one or more entities associated ** with the resource that implements a FUMI. For instance, new FPGA content ** may not take effect until the FPGA, and possibly other entities, are reset. ** ** An HPI User may call this function to check possible consequences of an ** upgrade process on a FUMI. ** ** The function returns a list of affected entities and the level of impact ** for each entity. If a listed entity has other entities below it in an ** entity tree, they are also assumed to be affected. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiFumiServiceImpactGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_OUT SaHpiFumiServiceImpactDataT *ServiceImpact ); /******************************************************************************* ** ** Name: saHpiFumiSourceSet() ** ** Description: ** This function is used to set new source information to the target. When ** explicit banks are supported, different source information can be assigned ** to each bank. This allows the FUMI to support loading different sources to ** different banks. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** FumiNum - [in] FUMI number for which the source information is being set. ** BankNum - [in] Bank number; 0 for the logical bank. ** SourceUri - [in] Text buffer containing URI of the source. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support Firmware ** Upgrade management instruments, as indicated by SAHPI_CAPABILITY_FUMI in ** the resource's RPT entry. ** SA_ERR_HPI_INVALID_PARAMS is returned if: ** * SourceUri is passed as NULL. ** * the SaHpiTextBufferT structure passed as SourceUri does not have a ** DataType of SAHPI_TL_TYPE_TEXT. ** * the SourceUri text buffer does not contain a properly formatted URI as ** defined by RFC 3986. ** SA_ERR_HPI_NOT_PRESENT is returned if the: ** * FumiNum does not address a valid FUMI supported by the resource. ** * BankNum is not 0 and not a valid bank number supported by the FUMI. ** ** Remarks: ** A FUMI identifies the location of the source data using the URI provided by ** the HPI User. The URI also identifies the protocol for accessing the source ** data. Protocols that the FUMI supports are reported by the FUMI's RDR. An ** HPI User shall make sure that the source URI corresponds to one of the ** supported protocols and that the location of the source data is accessible ** by the FUMI. ** ** An HPI User calls this function to provide the source information to the ** FUMI. The actual upgrade process can only be initiated after this ** information has been set. ** ** When a FUMI supports explicit banks, each bank has separate source ** information. The Bank ID of 0 is used to set the source information for ** the logical bank. When a FUMI does not support explicit banks, only Bank 0 ** can be used with this function. ** ** This function does not necessarily validate the source image. If it does ** not, it may execute successfully, even if the image is not correct. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiFumiSourceSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum, SAHPI_IN SaHpiTextBufferT *SourceUri ); /******************************************************************************* ** ** Name: saHpiFumiSourceInfoValidateStart() ** ** Description: ** This function initiates the validation of the integrity of the source image ** associated with the designated bank. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** FumiNum - [in] FUMI number for which the source information is to be ** validated. ** BankNum - [in] Bank number on FUMI; 0 for the logical bank. ** ** Return Value: ** SA_OK is returned when the source validation is successfully started; ** otherwise, an error code is returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support Firmware ** Upgrade management instruments, as indicated by SAHPI_CAPABILITY_FUMI in ** the resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the: ** * FumiNum does not address a valid FUMI supported by the resource. ** * BankNum is not 0 and not a valid bank number supported by the FUMI. ** SA_ERR_HPI_INVALID_REQUEST is returned if the source was not set prior to ** calling this function. ** ** Remarks: ** This function checks the validity of the source image. It should also ** report whether the image represented by the URI can be understood by the ** FUMI logic and programmed into the underlying hardware. It could also do ** any type of implementation-dependent validation of the source. Some of the ** examples are hash key or message digest validation. ** ** The FUMI validates the URI on invocation of this API. Optionally, the FUMI ** can start the validation process internally after the saHpiFumiSourceSet() ** function is called and can store the result internally. It can then return ** the result of the validation immediately, when the ** saHpiFumiValidateSource() function is called. ** ** When a FUMI supports explicit banks, each bank has separate source ** information, which should be separately validated. The Bank ID of 0 is ** used to validate the source information for the logical bank. When a FUMI ** does not support explicit banks, only Bank 0 can be used with this ** function. ** ** The status of a source validate operation is reported via events and can be ** queried with the saHpiFumiUpgradeStatusGet() function for the appropriate ** bank. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiFumiSourceInfoValidateStart ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum ); /******************************************************************************* ** ** Name: saHpiFumiSourceInfoGet() ** ** Description: ** This function returns the information about the source image assigned to ** the designated bank. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** FumiNum - [in] FUMI number for which source information is to be returned. ** BankNum - [in] Bank number on FUMI; 0 for the logical bank. ** SourceInfo - [out] Pointer to the location to store source information. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support Firmware ** Upgrade management instruments, as indicated by SAHPI_CAPABILITY_FUMI in ** the resource's RPT entry. ** SA_ERR_HPI_INVALID_PARAMS is returned if the SourceInfo parameter is NULL. ** SA_ERR_HPI_INVALID_REQUEST is returned if the source was not set prior to ** calling this function. ** SA_ERR_HPI_NOT_PRESENT is returned if the: ** * FumiNum does not address a valid FUMI supported by the resource. ** * BankNum is not 0 and not a valid bank number supported by the FUMI. ** ** Remarks: ** This function returns information about the firmware image addressed by the ** URI set previously. To be meaningful, this function can only be called ** after the source is set and validated. This information can be used to ** identify the firmware to be downloaded by the FUMI. This information ** contains the image name, version, and build date-time. ** ** When a FUMI supports explicit banks, each bank has separate source ** information, which should be separately read. The Bank ID of 0 is used to ** get the source information for the logical bank. When a FUMI does not ** support explicit banks, only Bank 0 can be used with this function. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiFumiSourceInfoGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum, SAHPI_OUT SaHpiFumiSourceInfoT *SourceInfo ); /******************************************************************************* ** ** Name: saHpiFumiSourceComponentInfoGet() ** ** Description: ** This function returns the information about the specified subsidiary ** firmware component in the source image assigned to the designated bank. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** FumiNum - [in] FUMI number for which source firmware component information ** is to be returned. ** BankNum - [in] Bank number on FUMI; 0 for the logical bank. ** ComponentEntryId - [in] Identifier of the component to retrieve. Reserved ** ComponentEntryId values: ** * SAHPI_FIRST_ENTRY Get first component. ** * SAHPI_LAST_ENTRY Reserved as delimiter for end of list. Not a valid ** component identifier. ** NextComponentEntryId - [out] Pointer to location to store the ** ComponentEntryId of the next component. ** ComponentInfo - [out] Pointer to the location to store the component ** information. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the: ** * resource does not support Firmware Upgrade management instruments, as ** indicated by SAHPI_CAPABILITY_FUMI in the resource's RPT entry. ** * FUMI does not support subsidiary firmware component structures, as ** indicated by SAHPI_FUMI_CAP_COMPONENTS in the FUMI RDR. ** SA_ERR_HPI_INVALID_PARAMS is returned if the: ** * ComponentInfo parameter is NULL. ** * NextComponentEntryId pointer is passed in as NULL. ** * ComponentEntryId is an invalid reserved value such as SAHPI_LAST_ENTRY. ** SA_ERR_HPI_INVALID_REQUEST is returned if the source was not set prior to ** calling this function. ** SA_ERR_HPI_NOT_PRESENT is returned if the: ** * FumiNum does not address a valid FUMI supported by the resource. ** * BankNum is not 0 and not a valid bank number supported by the FUMI. ** * Component identified by ComponentEntryId is not present. ** * ComponentEntryId is SAHPI_FIRST_ENTRY and no components are avaliable in ** source image ** ** Remarks: ** This function returns information about the subsidiary firmware ** component(s) in the source image represented by the URI set previously. To ** be meaningful, this function can only be called after the source is set and ** validated. This information contains component firmware version, ** description, and build date-time and can be used to further characterize ** the firmware to be installed by the FUMI. ** ** When a FUMI supports explicit banks, each bank may have separate component ** structure in source image, which should be separately read. The Bank ID of ** 0 can be used to get the component structure information for the logical ** bank. When a FUMI does not support explicit banks, only Bank 0 can be used ** with this function. ** ** If the ComponentEntryId parameter is set to SAHPI_FIRST_ENTRY, the first ** component in firmware source image is returned. When an entry is ** successfully retrieved, NextComponentEntryId is set to the identifier of ** the next valid entry; however, when the last entry has been retrieved, ** NextComponentEntryId is set to SAHPI_LAST_ENTRY. To retrieve an entire list ** of entries, an HPI User needs to call this function first with a ** ComponentEntryId of SAHPI_FIRST_ENTRY and then use the returned ** NextComponentEntryId in the next call, until the NextComponentEntryId ** returned is SAHPI_LAST_ENTRY. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiFumiSourceComponentInfoGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum, SAHPI_IN SaHpiEntryIdT ComponentEntryId, SAHPI_OUT SaHpiEntryIdT *NextComponentEntryId, SAHPI_OUT SaHpiFumiComponentInfoT *ComponentInfo ); /******************************************************************************* ** ** Name: saHpiFumiTargetInfoGet() ** ** Description: ** This function returns information about the specified bank. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** FumiNum - [in] FUMI number that contains the bank. ** BankNum - [in] Bank number on FUMI; 0 for the logical bank. ** BankInfo - [out] Pointer to location to store information about the bank. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support Firmware ** Upgrade management instruments, as indicated by SAHPI_CAPABILITY_FUMI in ** the resource's RPT entry. ** SA_ERR_HPI_INVALID_PARAMS is returned if BankInfo is NULL. ** SA_ERR_HPI_NOT_PRESENT is returned if the: ** * FumiNum does not address a valid FUMI supported by the resource. ** * BankNum is not 0 and not a valid bank number supported by the FUMI. ** ** Remarks: ** This function returns information about the current image on the target ** including bank number, validity state, executable firmware name, version ** number, build date-time, and position in the boot order. The validity ** state and position in the boot order information is applicable only to ** explicit banks. ** ** When a FUMI supports explicit banks, each bank has separate information, ** which should be separately read. The Bank ID of 0 is used to get ** information about the main firmware instance in the logical bank. This is ** the instance that is executing or, if no instance is currently executing, ** this is the instance that will execute when execution starts. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiFumiTargetInfoGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum, SAHPI_OUT SaHpiFumiBankInfoT *BankInfo ); /******************************************************************************* ** ** Name: saHpiFumiTargetComponentInfoGet() ** ** Description: ** This function returns the information about the specified subsidiary ** firmware component in the designated bank. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** FumiNum - [in] FUMI number for which firmware component information is to ** be returned. ** BankNum - [in] Bank number on FUMI; 0 for the logical bank. ** ComponentEntryId - [in] Identifier of the component to retrieve. Reserved ** ComponentEntryId values: ** * SAHPI_FIRST_ENTRY Get first component. ** * SAHPI_LAST_ENTRY Reserved as delimiter for end of list. Not a valid ** component identifier. ** NextComponentEntryId - [out] Pointer to location to store the ** ComponentEntryId of next component. ** ComponentInfo - [out] Pointer to the location to store component ** information. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the: ** * resource does not support Firmware Upgrade management instruments, as ** indicated by SAHPI_CAPABILITY_FUMI in the resource's RPT entry. ** * FUMI does not support subsidiary firmware component structure, as ** indicated by SAHPI_FUMI_CAP_COMPONENTS in FUMI RDR. ** SA_ERR_HPI_INVALID_PARAMS is returned if the: ** * ComponentInfo parameter is NULL. ** * NextComponentEntryId pointer is passed in as NULL. ** * ComponentEntryId is an invalid reserved value such as SAHPI_LAST_ENTRY. ** SA_ERR_HPI_NOT_PRESENT is returned if the: ** * FumiNum does not address a valid FUMI supported by the resource. ** * BankNum is not 0 and not a valid bank number supported by the FUMI. ** * Component identified by ComponentEntryId is not present. ** * ComponentEntryId is SAHPI_FIRST_ENTRY and no components are avaliable in ** the designated bank. ** ** Remarks: ** This function returns information about the subsidiary firmware ** component(s) within the current firmware of the designated bank. This ** information contains component firmware version, description, and build ** date-time. ** ** When a FUMI supports explicit banks, each bank's component structure is ** independent and, therefore, queried separately. The Bank ID of 0 can be ** used to get the component structure information for the main firmware ** instance in the logical bank. If the ComponentEntryId parameter is set to ** SAHPI_FIRST_ENTRY, the first component in the bank firmware is returned. ** When an entry is successfully retrieved, NextComponentEntryId is set to the ** identifier of the next valid entry; however, when the last entry has been ** retrieved, NextComponentEntryId is set to SAHPI_LAST_ENTRY. To retrieve an ** entire list of entries, call this function first with a ComponentEntryId of ** SAHPI_FIRST_ENTRY and then use the returned NextComponentEntryId in the ** next call. Proceed until the NextComponentEntryId returned is ** SAHPI_LAST_ENTRY. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiFumiTargetComponentInfoGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum, SAHPI_IN SaHpiEntryIdT ComponentEntryId, SAHPI_OUT SaHpiEntryIdT *NextComponentEntryId, SAHPI_OUT SaHpiFumiComponentInfoT *ComponentInfo ); /******************************************************************************* ** ** Name: saHpiFumiLogicalTargetInfoGet() ** ** Description: ** This function returns additional target information about the logical bank. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** FumiNum - [in] FUMI number that contains the bank. ** BankInfo - [out] Pointer to location to store additional information about ** the bank. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support Firmware ** Upgrade management instruments, as indicated by SAHPI_CAPABILITY_FUMI in ** the resource's RPT entry. ** SA_ERR_HPI_INVALID_PARAMS is returned if BankInfo is NULL. ** SA_ERR_HPI_NOT_PRESENT is returned if the FumiNum does not address a valid ** FUMI supported by the resource. ** ** Remarks: ** As previously described, there can be up to three logical locations for the ** firmware instances in the logical bank. Those locations are all accessed ** using Bank ID 0, and their contents changes automatically depending on the ** executed function. Therefore, a special function is necessary to return ** additional information about the firmware instances in the logical bank ** target, specifically regarding the rollback and pending firmware instances. ** This information also includes the number of persistent locations for ** firmware instances and a flag indicating whether the currently executing ** main firmware instance has a persistent copy or not. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiFumiLogicalTargetInfoGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_OUT SaHpiFumiLogicalBankInfoT *BankInfo ); /******************************************************************************* ** ** Name: saHpiFumiLogicalTargetComponentInfoGet() ** ** Description: ** This function returns additional information about the specified subsidiary ** firmware component in the logical bank. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** FumiNum - [in] FUMI number for which firmware component information is to ** be returned. ** ComponentEntryId - [in] Identifier of the component to retrieve. Reserved ** ComponentEntryId values: ** * SAHPI_FIRST_ENTRY Get first component. ** * SAHPI_LAST_ENTRY Reserved as delimiter for end of list. Not a valid ** component identifier. ** NextComponentEntryId - [out] Pointer to location to store the ** ComponentEntryId of next component. ** ComponentInfo - [out] Pointer to the location to store component ** information. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the: ** * resource does not support Firmware Upgrade management instruments, as ** indicated by SAHPI_CAPABILITY_FUMI in the resource's RPT entry. ** * FUMI does not support subsidiary firmware component structure, as ** indicated by SAHPI_FUMI_CAP_COMPONENTS in FUMI RDR. ** SA_ERR_HPI_INVALID_PARAMS is returned if the: ** * ComponentInfo parameter is NULL. ** * NextComponentEntryId pointer is passed in as NULL. ** * ComponentEntryId is an invalid reserved value such as SAHPI_LAST_ENTRY. ** SA_ERR_HPI_NOT_PRESENT is returned if the: ** * FumiNum does not address a valid FUMI supported by the resource. ** * Component identified by ComponentEntryId is not present. ** * ComponentEntryId is SAHPI_FIRST_ENTRY and no components are avaliable. ** ** Remarks: ** This function returns additional information about the subsidiary firmware ** component in the logical bank, specifically regarding the subsidiary ** components of the rollback and pending firmware instances. ** ** If the ComponentEntryId parameter is set to SAHPI_FIRST_ENTRY, the first ** component in a firmware instance is returned. When an entry is successfully ** retrieved, NextComponentEntryId is set to the identifier of the next valid ** entry; however, when the last entry has been retrieved, ** NextComponentEntryId is set to SAHPI_LAST_ENTRY. To retrieve an entire list ** of entries, call this function first with a ComponentEntryId of ** SAHPI_FIRST_ENTRY and then use the returned NextComponentEntryId in the ** next call. Proceed until the NextComponentEntryId returned is ** SAHPI_LAST_ENTRY. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiFumiLogicalTargetComponentInfoGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiEntryIdT ComponentEntryId, SAHPI_OUT SaHpiEntryIdT *NextComponentEntryId, SAHPI_OUT SaHpiFumiLogicalComponentInfoT *ComponentInfo ); /******************************************************************************* ** ** Name: saHpiFumiBackupStart() ** ** Description: ** This function initiates a backup of the main instance in the logical bank ** on the target, resulting in a rollback instance in the logical bank. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** FumiNum - [in] Number of the FUMI that should perform the backup operation. ** ** Return Value: ** SA_OK is returned if the backup operation is successfully started; ** otherwise, an error code is returned. ** SA_ERR_HPI_CAPABILITY is returned if: ** * the resource does not support Firmware Upgrade management instruments, as ** indicated by SAHPI_CAPABILITY_FUMI in the resource's RPT entry; ** * the FUMI does not support backup capability, as indicated by ** SAHPI_FUMI_CAP_BACKUP in the FUMI's RDR. ** SA_ERR_HPI_NOT_PRESENT is returned if the FumiNum does not address a valid ** FUMI supported by the resource. ** ** Remarks: ** This function is used for taking a backup of the main firmware instance in ** the logical bank on the target in preparation for upgrades. Depending on ** the implementation, this may mean taking a backup on the hard drive or into ** another bank, or in any other location. If the logical bank already has a ** copy of the main instance as the rollback instance, the FUMI may ** immediately report the backup is complete without making an additional ** copy. ** ** The status of a backup operation is reported via events and can be queried ** with the saHpiFumiUpgradeStatusGet() function. ** ** The saHpiFumiBackupStart() function cannot be directly targeted to an ** explicit bank, but may have undefined side effects on an explicit bank if ** the FUMI implements explicit banks. To copy an image to a specific bank, ** the saHpiFumiBankCopy() function should be used. ** ** If an implementation supports HPI Users initiating backups of the logical ** bank, it is reflected in the FUMI capability flag SAHPI_FUMI_CAP_BACKUP in ** the RDR. If an implementation does not support this capability, backups ** may be created automatically during the upgrade operation by the ** implementation; such automatic backups are available if ** SAHPI_FUMI_CAP_ROLLBACK is set and SAHPI_FUMI_CAP_BACKUP is not set. If an ** implementation does support the backup capability using this function, it ** does not create automatic backups that would override the ones created by ** this function. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiFumiBackupStart( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum ); /******************************************************************************* ** ** Name: saHpiFumiBankBootOrderSet() ** ** Description: ** This function sets the position of an explicit bank in the boot order. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** FumiNum - [in] FUMI number that contains the bank. ** BankNum - [in] Explicit bank number; a logical bank reference (BankNum = 0) ** is not allowed. ** Position - [in] Position of the bank in boot order. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if: ** * the resource does not support Firmware Upgrade management instruments, as ** indicated by SAHPI_CAPABILITY_FUMI in the resource's RPT entry. ** * the FUMI does not support bank reorder capability, as indicated by ** SAHPI_FUMI_CAP_BANKREORDER in the FUMI's RDR. ** SA_ERR_HPI_INVALID_DATA is returned if the Position is more than number of ** banks on the FUMI. ** SA_ERR_HPI_NOT_PRESENT is returned if the: ** * FumiNum does not address a valid FUMI supported by the resource. ** * BankNum is not a valid explicit bank number supported by the FUMI. ** ** Remarks: ** For boot ordering, explicit banks are assigned positions between 1 and n, ** inclusive, where n is the number of explicit banks in a FUMI. ** ** Boot order can be represented as a list. Setting a bank to a certain ** position causes all the subsequent banks to move to next higher positions. ** For example, suppose the ordered list for a FUMI has four explicit banks in ** following order: ** ** bank3, bank 2, bank 4, bank 1. ** ** Moving the bank 1 to second position causes the list to get rearranged as ** ** bank 3, bank 1, bank 2, bank4. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiFumiBankBootOrderSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum, SAHPI_IN SaHpiUint32T Position ); /******************************************************************************* ** ** Name: saHpiFumiBankCopyStart() ** ** Description: ** This function initiates the copy of the contents of one explicit bank to ** another explicit bank in the same FUMI. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** FumiNum - [in] FUMI number that contains the source and destination ** explicit banks. ** SourceBankNum - [in] Explicit Source Bank number to copy from; a logical ** bank reference ** (SourceBankNum = 0) is not allowed. ** TargetBankNum - [in] Explicit Target Bank number to copy to; a logical bank ** reference ** (TargetBankNum = 0) is not allowed. ** ** Return Value: ** SA_OK is returned if the bank copy operation is successfully started; ** otherwise, an error code is returned. ** SA_ERR_HPI_CAPABILITY is returned if: ** * the resource does not support Firmware Upgrade management instruments, as ** indicated by SAHPI_CAPABILITY_FUMI in the resource's RPT entry. ** * the FUMI does not support bank copy capability, as indicated by ** SAHPI_FUMI_CAP_BANKCOPY in the FUMI's RDR. ** SA_ERR_HPI_INVALID_REQUEST is returned if SourceBankNum and TargetBankNum ** are the same. ** SA_ERR_HPI_NOT_PRESENT is returned if FumiNum does not address a valid FUMI ** supported by the resource. ** SA_ERR_HPI_INVALID_DATA is returned if SourceBankNum or TargetBankNum is ** not a valid explicit bank number supported by the FUMI. ** ** Remarks: ** The status of a bank copy operation is reported via events and can be ** queried with the saHpiFumiUpgradeStatusGet() function, using the source ** bank as the value of the BankNum parameter. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiFumiBankCopyStart( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT SourceBankNum, SAHPI_IN SaHpiBankNumT TargetBankNum ); /******************************************************************************* ** ** Name: saHpiFumiInstallStart() ** ** Description: ** This function starts an installation process, loading firmware to the ** logical bank or to a specified explicit bank. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** FumiNum - [in] FUMI number that should perform the install operation. ** BankNum - [in] Target bank number; 0 for the logical bank. ** ** Return Value: ** SA_OK is returned if the install operation is successfully started; ** otherwise, an error code is returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support Firmware ** Upgrade management instruments, as indicated by SAHPI_CAPABILITY_FUMI in ** the resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the: ** * FumiNum does not address a valid FUMI supported by the resource. ** * BankNum is not 0 and not a valid bank number supported by the FUMI. ** SA_ERR_HPI_INVALID_REQUEST is returned if the source is not valid. That ** is, if saHpiFumiSourceInfoGet() returns any value other than ** SAHPI_FUMI_SRC_VALID or SAHPI_FUMI_SRC_VALIDITY_UNKNOWN for ** SourceInfo->SourceStatus. ** ** Remarks: ** This function can be called after setting up and optionally validating the ** source for the given target. It initiates the install process. The target ** is programmed with the new source image on completion of the upgrade ** process. The whole process is atomic to an HPI User. ** ** If the install process on the logical bank fails, the FUMI can ** automatically initiate a rollback process if the FUMI's RDR indicates the ** capability SAHPI_FUMI_CAP_AUTOROLLBACK. However, if that capability is ** present, the capability SAHPI_FUMI_CAP_AUTOROLLBACK_CAN_BE_DISABLED ** indicates that the automatic rollback can be disabled and enabled via the ** corresponding FUMI function. ** ** When a FUMI supports explicit banks, each bank can be individually ** installed. The Bank ID of 0 can be used to install the logical bank. When ** a FUMI does not support explicit banks, an HPI User shall use Bank 0 with ** this function. ** ** The status of the install operation is reported via events, and can be ** queried with the saHpiFumiUpgradeStatusGet() function, using the source ** bank as the value of the BankNum. Some events (and the corresponding status ** values) indicate that an HPI User should take follow up action, such as ** initiating an explicit rollback operation. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiFumiInstallStart ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum ); /******************************************************************************* ** ** Name: saHpiFumiUpgradeStatusGet() ** ** Description: ** This function is used to query the upgrade status of the FUMI. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** FumiNum - [in] FUMI number for which status is to be returned. ** BankNum - [in] Target bank number; 0 for the logical bank. ** UpgradeStatus - [out] Pointer to location to store upgrade status for the ** bank. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support Firmware ** Upgrade management instruments, as indicated by SAHPI_CAPABILITY_FUMI in ** the resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the: ** * FumiNum does not address a valid FUMI supported by the resource. ** * BankNum is not 0 and not a valid bank number supported by the FUMI. ** SA_ERR_HPI_INVALID_PARAMS is returned if UpgradeStatus is passed as NULL. ** ** Remarks: ** This function can be used by an HPI User to determine the status of an ** asynchronous operation that may be active on a particular bank. ** ** The status of an asynchronous operation is reported via events and can be ** queried with the saHpiFumiUpgradeStatusGet() function. When a FUMI ** supports explicit banks, asynchronous operations are associated with ** individual banks, so this function returns the status of an operation for a ** specified bank. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiFumiUpgradeStatusGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum, SAHPI_OUT SaHpiFumiUpgradeStatusT *UpgradeStatus ); /******************************************************************************* ** ** Name: saHpiFumiTargetVerifyStart() ** ** Description: ** This function starts the verification process of the upgraded image. ** Verification compares the programmed data with the source assigned for the ** bank. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** FumiNum - [in] FUMI number that should perform the target verify operation. ** BankNum - [in] Bank number; 0 for the logical bank. ** ** Return Value: ** SA_OK is returned when the target verify operation is successfully started; ** otherwise, an error code is returned. ** SA_ERR_HPI_CAPABILITY is returned if: ** * the resource does not support Firmware Upgrade management instruments, as ** indicated by SAHPI_CAPABILITY_FUMI in the resource's RPT entry. ** * the FUMI does not support target verify capability, as indicated by ** SAHPI_FUMI_CAP_TARGET_VERIFY in the FUMI's RDR. ** SA_ERR_HPI_NOT_PRESENT is returned if the: ** * FumiNum does not address a valid FUMI supported by the resource. ** * BankNum is not 0 and not a valid bank number supported by the FUMI. ** SA_ERR_HPI_INVALID_REQUEST is returned if: ** * the source for the target to be verified is not valid. That is, if ** saHpiFumiSourceInfoGet() returns any value other than ** SAHPI_FUMI_SRC_VALID or SAHPI_FUMI_SRC_VALIDITY_UNKNOWN for ** SourceInfo->SourceStatus. ** * BankNum is 0, but there is no pending firmware instance avaliable to be ** verified. ** ** Remarks: ** This function verifies that the installed image at the target bank matches ** with the source image that was assigned to it. ** ** The Bank ID of 0 can be used to validate the source information for the ** logical bank. In this case, this function verifies that the pending ** firmware instance at the target matches the source image that was set for ** the bank. ** ** The status of a target verify operation is reported via events and can be ** queried with the saHpiFumiUpgradeStatusGet() function, using the target ** bank as the value of the BankNum parameter. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiFumiTargetVerifyStart ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum ); /******************************************************************************* ** ** Name: saHpiFumiTargetVerifyMainStart() ** ** Description: ** This function starts the verification process of the main firmware instance ** in the logical bank. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** FumiNum - [in] FUMI number that should perform the target verify operation. ** ** Return Value: ** SA_OK is returned when the target verify operation is successfully started; ** otherwise, an error code is returned. ** SA_ERR_HPI_CAPABILITY is returned if: ** * the resource does not support Firmware Upgrade management instruments, as ** indicated by SAHPI_CAPABILITY_FUMI in the resource's RPT entry. ** * the FUMI does not support target verify capability, as indicated by ** SAHPI_FUMI_CAP_TARGET_VERIFY_MAIN in the FUMI's RDR. ** SA_ERR_HPI_NOT_PRESENT is returned if the FumiNum does not address a valid ** FUMI supported by the resource. ** SA_ERR_HPI_INVALID_REQUEST is returned if the: ** * source for the target to be verified is not valid. That is, if ** saHpiFumiSourceInfoGet() returns any value other than ** SAHPI_FUMI_SRC_VALID or SAHPI_FUMI_SRC_VALIDITY_UNKNOWN for ** SourceInfo->SourceStatus. ** * main firmware instance is not avaliable. This can happen in the case of a ** failed activation or a failed rollback. ** ** Remarks: ** Verification compares the main firmware instance with the source assigned ** for the logical bank. Note that an explicit source set operation may be ** needed to align the source with the main firmware instance on the target. ** ** The logical bank may hold up to three instances of the firmware. Two of ** these, the main and pending instances, can be verified against the source. ** This function verifies the main instance. To verify the pending instance, ** use the saHpiFumiVerifyTargetStart() function with a Bank ID of 0. ** ** The status of a target verify against main firmware instance operation is ** reported via the same events as target verification against pending ** firmware instance and can be queried with the saHpiFumiUpgradeStatusGet() ** function, using 0 as the value of the BankNum parameter. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiFumiTargetVerifyMainStart ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum ); /******************************************************************************* ** ** Name: saHpiFumiUpgradeCancel() ** ** Description: ** This function stops an asynchronous operation in process on a designated ** bank. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** FumiNum - [in] FUMI number that contains this bank. ** BankNum - [in] Target bank number; 0 for the logical bank. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support Firmware ** Upgrade management instruments, as indicated by SAHPI_CAPABILITY_FUMI in ** the resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the: ** * FumiNum does not address a valid FUMI supported by the resource. ** * BankNum is not 0 and not a valid bank number supported by the FUMI. ** SA_ERR_HPI_INVALID_REQUEST is returned if an asynchronous operation is not ** in progress. ** ** Remarks: ** This function cancels any asynchronous operation running on a specific bank ** of a FUMI. Asynchronous operations are started by ** saHpiFumiSourceInfoVerifyStart(), saHpiFumiInstallStart(), ** saHpiFumiTargetVerifyStart(), saHpiFumiRollbackStart(), ** saHpiFumiActivateStart(), saHpiFumiBankCopyStart(), and ** saHpiFumiBackupStart(). ** ** The only mandatory result of this function is an event issued by the FUMI ** identifying the operation that was cancelled. Other persistent effects of ** such a cancellation are implementation-specific. Some implementations may ** automatically roll back to a previous version. Target bank firmware ** instances may be corrupted and not available after the cancellation. ** ** Asynchronous operations are activated for specific banks. The Bank ID of 0 ** can be used to cancel an asynchronous operation on the logical bank. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiFumiUpgradeCancel ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum ); /******************************************************************************* ** ** Name: saHpiFumiAutoRollbackDisableGet() ** ** Description: ** This function is used to query whether automatic rollback is disabled or ** not on the FUMI logical bank. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** FumiNum - [in] FUMI number for which automatic rollback policy is to be ** returned. ** Disable - [out] Pointer to location to store information about automatic ** rollback disable status. Set to True if automatic rollback is disabled, ** or False automatic rollback is enabled. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the: ** * resource does not support Firmware Upgrade management instruments, as ** indicated by SAHPI_CAPABILITY_FUMI in the resource's RPT entry. ** * FUMI does not support automatic rollback, as indicated by ** SAHPI_FUMI_CAP_AUTOROLLBACK in FUMI RDR. ** SA_ERR_HPI_NOT_PRESENT is returned if the: ** * FumiNum does not address a valid FUMI supported by the resource. ** SA_ERR_HPI_INVALID_PARAMS is returned if Disable is passed as NULL. ** ** Remarks: ** This function can be used by an HPI User to determine whether automatic ** rollback is disabled or not on the FUMI logical bank. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiFumiAutoRollbackDisableGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_OUT SaHpiBoolT *Disable ); /******************************************************************************* ** ** Name: saHpiFumiAutoRollbackDisableSet() ** ** Description: ** This function is used to disable or enable automatic rollback on the FUMI ** logical bank. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** FumiNum - [in] FUMI number for which automatic rollback policy is to be ** set. ** Disable - [in] Boolean variable that indicates whether an HPI User requests ** disabling or enabling automatic rollback. Set to True to disable ** automatic rollback or to False to enable automatic rollback. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the: ** * resource does not support Firmware Upgrade management instruments, as ** indicated by SAHPI_CAPABILITY_FUMI in the resource's RPT entry. ** * FUMI does not support automatic rollback, as indicated by ** SAHPI_FUMI_CAP_AUTOROLLBACK in FUMI RDR. ** * FUMI does not support disabling the automatic rollback policy, as ** indicated by SAHPI_FUMI_CAP_AUTOROLLBACK_CAN_BE_DISABLED in FUMI RDR. ** SA_ERR_HPI_NOT_PRESENT is returned if the: ** * FumiNum does not address a valid FUMI supported by the resource. ** ** Remarks: ** This function can be used by an HPI User to enable or disable automatic ** rollback on the FUMI logical bank. By default, automatic rollback is ** enabled. For some implementations, automatic rollback cannot be disabled. ** To change the automatic rollback policy, an HPI User must call this ** function before calling a function (typically an install or activate) that ** could result in the rollback. The state of the rollback policy is intended ** to persist until explicitly changed. Entities that use multiple firmware ** instances for reliability benefits beyond protecting the upgrade process ** itself may apply this policy in those broader contexts as well. For ** instance, an implementation may have the capability to switch to a rollback ** firmware instance if the main instance becomes inoperable for some reason ** not associated with a firmware upgrade; such an implementation may inhibit ** that switch if automatic rollback has been disabled via a FUMI operation. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiFumiAutoRollbackDisableSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBoolT Disable ); /******************************************************************************* ** ** Name: saHpiFumiRollbackStart() ** ** Description: ** This function initiates a rollback operation to replace the main firmware ** instance of the logical bank with the rollback instance. The rollback ** instance may have been explicitly created with saHpiFumiBackupStart(), or ** automatically by the implementation. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** FumiNum - [in] FUMI number that should perform the rollback operation. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if: ** * the resource does not support Firmware Upgrade management instruments, as ** indicated by SAHPI_CAPABILITY_FUMI in the resource's RPT entry. ** * the FUMI does not support rollback capability, as indicated by ** SAHPI_FUMI_CAP_ROLLBACK in the FUMI's RDR. ** SA_ERR_HPI_NOT_PRESENT is returned if FumiNum does not address a valid FUMI ** supported by the resource. ** SA_ERR_HPI_INVALID_REQUEST is returned if rollback firmware instance is not ** available. ** ** Remarks: ** The intent of this function is to roll back to the backed up version. Some ** implementations may not support it; in those cases, if an upgrade failure ** happens, an HPI User will need to explicitly restore the target by ** initiating a new upgrade process or copying an image from a redundant ** location. ** ** The status of a rollback operation is reported via events and can be ** queried with the saHpiFumiUpgradeStatusGet() function. This function ** starts the rollback operation for the logical bank. The status of the ** rollback operation will be associated with that bank. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiFumiRollbackStart ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum ); /******************************************************************************* ** ** Name: saHpiFumiActivate() ** ** Description: ** Note: this function should not be used in new HPI User programs. The ** function saHpiFumiActivateStart() should be used instead. ** ** This function starts execution of the firmware in the first valid explicit ** bank in the boot order list on the FUMI, if the FUMI supports explicit ** banks, or activates an appropriate firmware instance on the logical bank, ** if FUMI does not support explicit banks. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** FumiNum - [in] FUMI number ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support Firmware ** Upgrade management instruments, as indicated by SAHPI_CAPABILITY_FUMI in ** the resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if FumiNum does not address a valid FUMI ** supported by the resource. ** SA_ERR_HPI_INVALID_REQUEST is returned if: ** * NumBanks is 0, but there is no valid firmware instance in the logical ** bank to execute on the entity; that is, if there is no valid pending or ** main instance. ** * NumBanks is positive, but no explicit bank has both a valid BankState and ** a positive Position in the boot order list. ** ** Remarks: ** This function provides a synchronous method for firmware activation. ** ** When a FUMI supports explicit banks, this function ensures that the ** firmware loaded in the first valid explicit bank in the boot order list is ** executing. If the required firmware instance is already executing before ** this function was called, the function has no effect. If the entity is not ** executing any firmware, or is executing some inappropriate instance, ** calling this function will cause the entity to be restarted with the ** correct firmware. ** ** When a FUMI does not support explicit banks, this function ensures that the ** pending firmware instance becomes the main firmware instance and starts ** executing. If there is no pending instance, this function ensures that the ** main instance is executing, if necessary by restarting the entity with that ** instance. If the main instance is already executing, this function has no ** effect. ** ** This function is preserved for compatibility with previous HPI ** specification revisions. The more flexible asynchronous function ** saHpiFumiActivateStart() is preferred for new applications. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiFumiActivate ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum ); /******************************************************************************* ** ** Name: saHpiFumiActivateStart() ** ** Description: ** This function initiates firmware activation in either the logical bank or ** the explicit banks on the FUMI. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** FumiNum - [in] FUMI number ** Logical - [in] Boolean variable. When True, indicates a logical bank ** activation. When False, indicates an explicit bank activation according ** to the boot order list. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support Firmware ** Upgrade management instruments, as indicated by SAHPI_CAPABILITY_FUMI in ** the resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if FumiNum does not address a valid FUMI ** supported by the resource. ** SA_ERR_HPI_INVALID_REQUEST is returned if: ** * Logical is False, but NumBanks is 0 indicating that the FUMI does not ** support explicit banks. ** * Logical is False, NumBanks is positive, but no explicit bank has both a ** valid BankState and a positive Position in the boot order list. ** * Logical is True, but there is no valid firmware instance in the logical ** bank to execute on the entity; that is, if there is no valid pending or ** main instance. ** ** Remarks: ** This function provides an asynchronous method for firmware activation. Some ** implementations may require a long time to start execution of a new image ** on the FUMI. For example, an implementation may need to copy firmware from ** a non-executable SEEPROM to an executable flash location. Alternatively, ** the old firmware may need a long time to shut down or the new firmware may ** need a long time to start up. ** ** If Logical is True, this function ensures that the pending firmware ** instance become the main firmware instance and starts executing. If there ** is no pending instance, this function ensures that the main instance is ** executing, if necessary by restarting the entity with that instance. If ** the main instance is already executing, this function has no effect. ** ** If Logical is True and the activate process fails, the FUMI can ** automatically restore the rollback firmware instance if the FUMI's RDR ** indicates the capability SAHPI_FUMI_CAP_AUTOROLLBACK. However, if that ** capability is present, the capability ** SAHPI_FUMI_CAP_AUTOROLLBACK_CAN_BE_DISABLED indicates that the automatic ** rollback can be disabled and enabled via the corresponding FUMI functions. ** ** If Logical is False, this function ensures that the firmware loaded in the ** first valid explicit bank in the boot order list is executing. If the ** required firmware instance is already executing before this function was ** called, the function has no effect. If the entity is not executing any ** firmware, or is executing some inappropriate instance, calling this ** function will cause the entity to be restarted with the correct firmware. ** ** The status of an asynchronous activation operation is reported via events ** and can be queried with the saHpiFumiUpgradeStatusGet() function. Some ** events (and the corresponding status values) indicate that an HPI User ** should take follow up action, such as initiating an explicit rollback ** operation. ** ** There are some considerations that make this function more flexible than ** the saHpiFumiActivate() variant. One such consideration is that the ** asynchronous variant is better suited to FUMI implementations that require ** a long time to start execution of a new image. For example, an ** implementation may need to copy firmware from a non-executable SEEPROM to ** an executable flash location. Alternatively, the old firmware may need a ** long time to shut down, or the new firmware may need a long time to start ** up. Doing firmware activation synchronously can lead to timeout problems ** in the HPI implementation. ** ** Another such consideration is that the saHpiFumiActivateStart() function ** has an additional parameter that explicitly states whether the logical bank ** or explicit bank activation is intended. For FUMIs that support explicit ** banks, this parameter allows an HPI User to unambiguously determine the ** activation type. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiFumiActivateStart ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBoolT Logical ); /******************************************************************************* ** ** Name: saHpiFumiCleanup() ** ** Description: ** This function performs cleanup after an upgrade process on the specified ** bank, returning it to a predefined state. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** FumiNum - [in] FUMI number ** BankNum - [in] Target bank number; 0 for the logical bank. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support Firmware ** Upgrade management instruments, as indicated by SAHPI_CAPABILITY_FUMI in ** the resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the: ** * FumiNum does not address a valid FUMI supported by the resource. ** * BankNum is not 0 and not a valid bank number supported by the FUMI. ** ** Remarks: ** This function takes the following actions: ** ** * Cancels all asynchronous operations in progress or scheduled for the ** designated bank. An asynchronous bank to bank copying operation is ** canceled only if the designated bank is the source bank for the operation. ** ** * Unsets the source for designated bank. ** ** * Returns the designated bank state to SAHPI_FUMI_OPERATION_NOTSTARTED. ** ** * Does any other cleanup (such as deleting a downloaded source file or ** freeing allocated memory) that is needed by the implementation. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiFumiCleanup ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum ); /******************************************************************************* ** ** Name: saHpiHotSwapPolicyCancel() ** ** Description: ** A resource supporting managed hot swap has defined policies for insertion ** and extraction. On insertion, the auto insertion policy may be for the ** resource to turn the associated FRU's local power on and to de-assert ** reset. On extraction, the auto extraction policy may be for the resource ** to immediately power off the FRU and turn on a hot swap indicator. This ** function allows an HPI User, after receiving a hot swap event with ** HotSwapState equal to SAHPI_HS_STATE_INSERTION_PENDING or ** SAHPI_HS_STATE_EXTRACTION_PENDING, to prevent the auto insertion or auto ** extraction policy from being automatically executed by the HPI ** implementation. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support managed ** hot swap, as indicated by SAHPI_CAPABILITY_MANAGED_HOTSWAP in the ** resource's RPT entry. ** SA_ERR_HPI_INVALID_REQUEST is returned if the resource is: ** * Not in the INSERTION PENDING or EXTRACTION PENDING state. ** * Already processing an auto insertion or auto extraction policy. ** ** Remarks: ** Each time the resource transitions to either the INSERTION PENDING or ** EXTRACTION PENDING state, the auto insertion or auto extraction policy ** executes after the configured timeout period, unless canceled using ** saHpiHotSwapPolicyCancel() after the transition to INSERTION PENDING or ** EXTRACTION PENDING state and before the timeout expires. The policy cannot ** be canceled once it has begun to execute. ** ** This function is only supported by resources that support Managed Hot Swap. ** If a resource with the FRU capability set but without the Managed Hot Swap ** capability set transitions to INSERTION PENDING or EXTRACTION PENDING, ** there is no way for an HPI User to control its insertion or extraction ** policy. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiHotSwapPolicyCancel ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId ); /******************************************************************************* ** ** Name: saHpiResourceActiveSet() ** ** Description: ** This function allows an HPI User to request a resource to transition to the ** ACTIVE state from the INSERTION PENDING or EXTRACTION PENDING state, ** executing the auto insertion policy to condition the hardware ** appropriately. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support managed ** hot swap, as indicated by SAHPI_CAPABILITY_MANAGED_HOTSWAP in the ** resource's RPT entry. ** SA_ERR_HPI_INVALID_REQUEST is returned if the resource is: ** * Not in the INSERTION PENDING or EXTRACTION PENDING state. ** * Already processing an auto insertion or auto extraction policy. ** ** Remarks: ** During insertion, a resource supporting managed hot swap generates an event ** to indicate that it is in the INSERTION PENDING state. While the resource ** is in this state, and before it begins execution of the auto insertion ** policy, an HPI User may call this function to request that the auto ** insertion policy be started immediately. ** ** If an HPI User calls saHpiHotSwapPolicyCancel() before the resource begins ** executing the auto insertion policy, the resource remains in INSERTION ** PENDING state while actions can be taken to integrate the FRU associated ** with this resource into the system. Once completed with the integration of ** the FRU, an HPI User must call this function to signal that the resource ** should now execute the auto insertion policy and transition into the ACTIVE ** state. ** ** An HPI User may also use this function to request a resource to return to ** the ACTIVE state from the EXTRACTION PENDING state to reject an extraction ** request. ** ** This function is only supported by resources that support Managed Hot Swap. ** It is only valid if the resource is in INSERTION PENDING or EXTRACTION ** PENDING state, and an auto insertion or auto extraction policy has not been ** initiated. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiResourceActiveSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId ); /******************************************************************************* ** ** Name: saHpiResourceInactiveSet() ** ** Description: ** This function allows an HPI User to request a resource to transition to the ** INACTIVE state from the INSERTION PENDING or EXTRACTION PENDING state, ** executing the auto extraction policy to condition the hardware ** appropriately. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support managed ** hot swap, as indicated by SAHPI_CAPABILITY_MANAGED_HOTSWAP in the ** resource's RPT entry. ** SA_ERR_HPI_INVALID_REQUEST is returned if the resource is: ** * Not in the INSERTION PENDING or EXTRACTION PENDING state. ** * Already processing an auto insertion or auto extraction policy. ** ** Remarks: ** During extraction, a resource supporting managed hot swap generates an ** event to indicate that it is in the EXTRACTION PENDING state. While the ** resource is in this state, and before it begins execution of the auto ** extraction policy, an HPI User may call this function to request that the ** auto extraction policy be started immediately. ** ** If an HPI User calls saHpiHotSwapPolicyCancel() before the resource begins ** executing the auto extraction policy, the resource remains in EXTRACTION ** PENDING state while actions can be taken to prepare the system for the FRU ** associated with this resource to be out of service. Once the system is ** prepared for the shutdown of the FRU, an HPI User must call this function ** to signal that the resource should now execute the auto extraction policy ** and transition into the INACTIVE state. ** ** An HPI User may also use this function to request a resource to return to ** the INACTIVE state from the INSERTION PENDING state to abort a hot-swap ** insertion action. ** ** This function is only supported by resources that support Managed Hot Swap. ** It is only valid if the resource is in EXTRACTION PENDING or INSERTION ** PENDING state, and an auto extraction or auto insertion policy has not been ** initiated. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiResourceInactiveSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId ); /******************************************************************************* ** ** Name: saHpiAutoInsertTimeoutGet() ** ** Description: ** This function allows an HPI User to request the auto insert timeout value ** within a specific domain. This value indicates how long a resource that ** supports managed hot swap waits after transitioning to INSERTION PENDING ** state before the default auto insertion policy is invoked. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** Timeout - [out] Pointer to location to store the number of nanoseconds to ** wait before autonomous handling of the hot swap event. Reserved time out ** values: ** * SAHPI_TIMEOUT_IMMEDIATE indicates autonomous handling is immediate. ** * SAHPI_TIMEOUT_BLOCK indicates autonomous handling does not occur. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_INVALID_PARAMS is returned if the Timeout pointer is passed in ** as NULL. ** ** Remarks: ** Each domain maintains a single auto insertion timeout value and it is ** applied to all contained resources upon insertion, which support managed ** hot swap. Further information on the auto insertion timeout can be found ** in the function saHpiAutoInsertTimeoutSet(). ** *******************************************************************************/ SaErrorT SAHPI_API saHpiAutoInsertTimeoutGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_OUT SaHpiTimeoutT *Timeout ); /******************************************************************************* ** ** Name: saHpiAutoInsertTimeoutSet() ** ** Description: ** This function allows an HPI User to configure a timeout for how long to ** wait before the default auto insertion policy is invoked on a resource that ** supports managed hot swap within a specific domain. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** Timeout - [in] The number of nanoseconds to wait before autonomous handling ** of the hot swap event. Reserved time out values: ** * SAHPI_TIMEOUT_IMMEDIATE indicates proceed immediately to autonomous ** handling. ** * SAHPI_TIMEOUT_BLOCK indicates prevent autonomous handling. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_READ_ONLY is returned if the auto insertion timeout for the ** domain is fixed as indicated by the ** SAHPI_DOMAIN_CAP_AUTOINSERT_READ_ONLY flag in the DomainInfo structure. ** SA_ERR_HPI_INVALID_PARAMS is returned when the Timeout parameter is not set ** to SAHPI_TIMEOUT_BLOCK, SAHPI_TIMEOUT_IMMEDIATE or a positive value. ** ** Remarks: ** This function accepts a parameter instructing each resource that supports ** managed hot swap to impose a delay before performing its hot swap policy ** for auto insertion. The parameter may be set to SAHPI_TIMEOUT_IMMEDIATE to ** direct resources to proceed immediately to auto insertion, or to ** SAHPI_TIMEOUT_BLOCK to prevent auto insertion policy from running until an ** HPI User calls saHpiResourceActiveSet(). If the parameter is set to ** another value, it defines the number of nanoseconds between the time a hot ** swap event with HotSwapState = SAHPI_HS_STATE_INSERTION_PENDING is ** generated and the time that the auto insertion policy is started for that ** resource. If, during this time period, an saHpiHotSwapPolicyCancel() ** function call is processed, the timer is stopped, and the auto insertion ** policy is not invoked. Each domain maintains a single auto insertion ** timeout value, and this value is applied to all contained resources that ** support managed hot swap. ** ** Once the auto insertion policy begins, an HPI User is not allowed to cancel ** it; hence, the timeout should be set appropriately to allow for this ** condition. Note that the timeout period begins when the hot swap event ** with HotSwapState = SAHPI_HS_STATE_INSERTION_PENDING is initially ** generated; not when it is received by an HPI User with an saHpiEventGet() ** function call, or even when it is placed in a session event queue. ** ** A resource may exist in multiple domains, which themselves may have ** different auto insertion timeout values. Upon insertion, the resource ** begins its auto insertion policy based on the smallest auto insertion ** timeout value. As an example, if a resource is inserted into two domains, ** into one with an auto insertion timeout of 5 seconds and into one with an ** auto insertion timeout of 10 seconds, the resource begins its auto ** insertion policy after 5 seconds. A resource may also be designed to ** always immediately begin execution of its auto insertion policy upon ** insertion. The SAHPI_HS_CAPABILITY_AUTOINSERT_IMMEDIATE flag will be set ** in the RPT entry of such a resource. ** ** A domain may have a fixed, preset timeout value used for all resources. In ** such cases, the SAHPI_DOMAIN_CAP_AUTOINSERT_READ_ONLY flag is set to ** indicate that an HPI User cannot change the auto insertion timeout value. ** SA_ERR_HPI_READ_ONLY is returned if an HPI User attempts to change a ** read-only timeout. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiAutoInsertTimeoutSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiTimeoutT Timeout ); /******************************************************************************* ** ** Name: saHpiAutoExtractTimeoutGet() ** ** Description: ** This function allows an HPI User to request the timeout for how long a ** resource that supports managed hot swap waits after transitioning to ** EXTRACTION PENDING state before the default auto extraction policy is ** invoked. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** Timeout - [out] Pointer to location to store the number of nanoseconds to ** wait before autonomous handling of the hot swap event. Reserved time out ** values: ** * SAHPI_TIMEOUT_IMMEDIATE indicates autonomous handling is immediate. ** * SAHPI_TIMEOUT_BLOCK indicates autonomous handling does not occur. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support managed ** hot swap, as indicated by SAHPI_CAPABILITY_MANAGED_HOTSWAP in the ** resource's RPT entry. ** SA_ERR_HPI_INVALID_PARAMS is returned if the Timeout pointer is passed in ** as NULL. ** ** Remarks: ** This function is only supported by resources that support Managed Hot Swap. ** Further information on auto extraction timeouts is detailed in ** saHpiAutoExtractTimeoutSet(). ** *******************************************************************************/ SaErrorT SAHPI_API saHpiAutoExtractTimeoutGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiTimeoutT *Timeout ); /******************************************************************************* ** ** Name: saHpiAutoExtractTimeoutSet() ** ** Description: ** This function allows an HPI User to configure a timeout for how long a ** resource that supports managed hot swap will wait before the auto ** extraction policy is invoked. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** Timeout - [in] The number of nanoseconds to wait before autonomous handling ** of the hot swap event. Reserved timeout values: ** * SAHPI_TIMEOUT_IMMEDIATE indicates proceed immediately to autonomous ** handling. ** * SAHPI_TIMEOUT_BLOCK indicates prevent autonomous handling. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support managed ** hot swap, as indicated by SAHPI_CAPABILITY_MANAGED_HOTSWAP in the ** resource's RPT entry. ** SA_ERR_HPI_INVALID_PARAMS is returned when the Timeout parameter is not set ** to SAHPI_TIMEOUT_BLOCK, SAHPI_TIMEOUT_IMMEDIATE or a positive value. ** SA_ERR_HPI_READ_ONLY is returned if the auto extraction timeout for the ** resource is fixed, as indicated by the ** SAHPI_HS_CAPABILITY_AUTOEXTRACT_READ_ONLY in the resource's RPT entry. ** ** Remarks: ** This function accepts a parameter instructing the resource to impose a ** delay before performing its hot swap policy for auto extraction. The ** parameter may be set to SAHPI_TIMEOUT_IMMEDIATE to direct the resource to ** proceed immediately to auto extraction, or to SAHPI_TIMEOUT_BLOCK to ** prevent the auto extraction policy from running until an HPI User calls ** saHpiResourceInactiveSet(). If the parameter is set to another value, it ** defines the number of nanoseconds between the time a hot swap event with ** HotSwapState = SAHPI_HS_STATE_EXTRACTION_PENDING is generated and the time ** that the auto extraction policy is invoked for the resource. If, during ** this time period, an saHpiHotSwapPolicyCancel() function call is processed, ** the timer is stopped, and the auto extraction policy is not invoked. ** ** Once the auto extraction policy begins, an HPI User is not allowed to ** cancel the extraction policy; hence, the timeout should be set ** appropriately to allow for this condition. Note that the timeout period ** begins when the hot swap event with HotSwapState = ** SAHPI_HS_STATE_EXTRACTION_PENDING is initially generated; not when it is ** received by an HPI User with an saHpiEventGet() function call, or even when ** it is placed in a session event queue. ** ** The auto extraction timeout period is set at the resource level and is only ** supported by resources supporting the Managed Hot Swap capability. After ** discovering that a newly inserted resource supports Managed Hot Swap, an ** HPI User may use this function to change the timeout of the auto extraction ** policy for that resource. ** ** An implementation may enforce a fixed, preset timeout value. In such ** cases, the RPT entry for the resource will have the ** SAHPI_HS_CAPABILITY_AUTOEXTRACT_READ_ONLY flag set to indicate that an HPI ** User cannot change the auto extraction timeout value. SA_ERR_HPI_READ_ONLY ** is returned if an HPI User attempts to change a read-only timeout. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiAutoExtractTimeoutSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiTimeoutT Timeout ); /******************************************************************************* ** ** Name: saHpiHotSwapStateGet() ** ** Description: ** This function allows an HPI User to retrieve the current hot swap state of ** a resource. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** State - [out] Pointer to location to store returned state information. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support hot ** swap, as indicated by SAHPI_CAPABILITY_FRU in the resource's RPT entry. ** SA_ERR_HPI_INVALID_PARAMS is returned if the State pointer is passed in as ** NULL. ** ** Remarks: ** The returned state is one of the following four states: ** ** * SAHPI_HS_STATE_INSERTION_PENDING ** ** * SAHPI_HS_STATE_ACTIVE ** ** * SAHPI_HS_STATE_EXTRACTION_PENDING ** ** * SAHPI_HS_STATE_INACTIVE ** ** The state SAHPI_HS_STATE_NOT_PRESENT is never returned, because a resource ** that is not present cannot be addressed by this function in the first ** place. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiHotSwapStateGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiHsStateT *State ); /******************************************************************************* ** ** Name: saHpiHotSwapActionRequest() ** ** Description: ** This function allows an HPI User to invoke an insertion or extraction ** process via software on a resource that supports managed hot swap. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** Action - [in] Requested action: ** * SAHPI_HS_ACTION_INSERTION ** * SAHPI_HS_ACTION_EXTRACTION ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support managed ** hot swap, as indicated by SAHPI_CAPABILITY_MANAGED_HOTSWAP in the ** resource's RPT entry. ** SA_ERR_HPI_INVALID_REQUEST is returned if the resource is not in an ** appropriate hot swap state, or if the requested action is inappropriate ** for the current hot swap state. See the Remarks section below. ** SA_ERR_HPI_INVALID_PARAMS is returned when Action is not one of the valid ** enumerated values for this type. ** ** Remarks: ** A resource supporting hot swap typically requires a physical action on the ** associated FRU to invoke an insertion or extraction process. An insertion ** process is invoked by physically inserting the FRU into a chassis. ** Physically opening an ejector latch or pressing a button invokes the ** extraction process. For a resource that supports managed hot swap, this ** function provides an alternative means to invoke an insertion or extraction ** process via software. ** ** This function may only be called: ** ** * To request an insertion action when the resource is in INACTIVE state. ** ** * To request an extraction action when the resource is in the ACTIVE state. ** ** The function may not be called when the resource is in any other state. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiHotSwapActionRequest ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiHsActionT Action ); /******************************************************************************* ** ** Name: saHpiHotSwapIndicatorStateGet() ** ** Description: ** This function allows an HPI User to retrieve the state of the hot swap ** indicator. A FRU associated with a resource that supports managed hot swap ** may include a hot swap indicator such as a blue LED. This indicator ** signifies that the FRU is ready for removal. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** State - [out] Pointer to location to store state of hot swap indicator. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support: ** * Managed hot swap, as indicated by SAHPI_CAPABILITY_MANAGED_HOTSWAP in the ** resource's RPT entry. ** * A hot swap indicator on the FRU as indicated by the ** SAHPI_HS_CAPABILITY_INDICATOR_SUPPORTED in the resource's RPT entry. ** SA_ERR_HPI_INVALID_PARAMS is returned if the State pointer is passed in as ** NULL. ** ** Remarks: ** The returned state is either SAHPI_HS_INDICATOR_OFF or ** SAHPI_HS_INDICATOR_ON. This function returns the state of the indicator, ** regardless of what hot swap state the resource is in. ** ** This function is only supported by resources that support managed hot swap. ** Furthermore, not all resources supporting managed hot swap necessarily ** support this function. Whether a resource supports the hot swap indicator ** is specified in the Hot Swap Capabilities field of the RPT entry. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiHotSwapIndicatorStateGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiHsIndicatorStateT *State ); /******************************************************************************* ** ** Name: saHpiHotSwapIndicatorStateSet() ** ** Description: ** This function allows an HPI User to set the state of the hot swap ** indicator. A FRU associated with a resource that supports managed hot swap ** may include a hot swap indicator such as a blue LED. This indicator ** signifies that the FRU is ready for removal. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** State - [in] State of hot swap indicator to be set. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support: ** * Managed hot swap, as indicated by SAHPI_CAPABILITY_MANAGED_HOTSWAP in the ** resource's RPT entry. ** * A hot swap indicator on the FRU as indicated by the ** SAHPI_HS_CAPABILITY_INDICATOR_SUPPORTED in the resource's RPT entry. ** SA_ERR_HPI_INVALID_PARAMS is returned when State is not one of the valid ** enumerated values for this type. ** ** Remarks: ** Valid states include SAHPI_HS_INDICATOR_OFF or SAHPI_HS_INDICATOR_ON. This ** function sets the indicator regardless of what hot swap state the resource ** is in, though it is recommended that this function be used only in ** conjunction with moving the resource to the appropriate hot swap state. ** ** This function is only supported by resources that support managed hot swap. ** Furthermore, not all resources supporting managed hot swap necessarily ** support this function. Whether a resource supports the hot swap indicator ** is specified in the Hot Swap Capabilities field of the RPT entry. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiHotSwapIndicatorStateSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiHsIndicatorStateT State ); /******************************************************************************* ** ** Name: saHpiParmControl() ** ** Description: ** This function allows an HPI User to save and restore parameters associated ** with a specific resource. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** Action - [in] Action to perform on resource parameters. ** * SAHPI_DEFAULT_PARM Restores the factory default settings for a ** specific resource. Factory defaults include Sensor thresholds and ** configurations, and resource- specific configuration parameters. ** * SAHPI_SAVE_PARM Stores the resource configuration parameters in ** non-volatile storage. Resource configuration parameters stored in ** non-volatile storage survive power cycles and resource resets. ** * SAHPI_RESTORE_PARM Restores resource configuration parameters from ** non-volatile storage. Resource configuration parameters include Sensor ** thresholds and Sensor configurations, as well as resource-specific ** parameters. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support ** parameter control, as indicated by SAHPI_CAPABILITY_CONFIGURATION in the ** resource's RPT entry. ** SA_ERR_HPI_INVALID_PARAMS is returned when Action is not set to a proper ** value. ** ** Remarks: ** Resource-specific parameters should be documented in an implementation ** guide for the HPI implementation. ** ** When this API is called with SAHPI_RESTORE_PARM as the action prior to ** having made a call with this API where the action parameter was set to ** SAHPI_SAVE_PARM, the default parameters are restored. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiParmControl ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiParmActionT Action ); /******************************************************************************* ** ** Name: saHpiResourceLoadIdGet() ** ** Description: ** This function gets the Load Id of an entity, allowing an HPI User to ** discover what software the entity will load the next time it initiates a ** software load. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. The entity ** defined in the RPT entry for the Resource is the entity addressed by ** this API. ** LoadId - [out] The current Load Id. Load Id is determined by the contents ** of LoadId->LoadNumber and LoadId->LoadName. If LoadId->LoadNumber is: ** * SAHPI_LOAD_ID_DEFAULT: The entity will load implementation-defined ** default software, ** * SAHPI_LOAD_ID_BYNAME: The entity will load software identified by the ** contents of ** LoadId->LoadName, ** * Any other value: The entity will load software identified by the value ** of LoadId->LoadNumber. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support load id ** management, as indicated by SAHPI_CAPABILITY_LOAD_ID in the resource's ** RPT entry. ** SA_ERR_HPI_INVALID_PARAMS is returned if the LoadId pointer is passed in as ** NULL. ** ** Remarks: ** Mapping of LoadId->LoadNumber and LoadId->LoadName to specific software ** loads is implementation-specific. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiResourceLoadIdGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiLoadIdT *LoadId ); /******************************************************************************* ** ** Name: saHpiResourceLoadIdSet() ** ** Description: ** This function sets the Load Id of an entity, allowing an HPI User to ** control which software the entity will load the next time it initiates a ** software load. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. The entity ** defined in the RPT entry for the Resource is the entity addressed by ** this API. ** LoadId - [in] The Load Id to be set. Load Id is determined by the contents ** of LoadId->LoadNumber and LoadId->LoadName. If LoadId->LoadNumber is: ** * SAHPI_LOAD_ID_DEFAULT: The entity will load implementation-defined ** default software, ** * SAHPI_LOAD_ID_BYNAME: The entity will load software identified by the ** contents of ** LoadId->LoadName, ** * Any other value: The entity will load software identified by the value ** of LoadId->LoadNumber. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support load ** management, as indicated by SAHPI_CAPABILITY_LOAD in the resource's RPT ** entry. ** SA_ERR_HPI_INVALID_DATA is returned if - ** * LoadId->LoadNumber is SAHPI_LOAD_DEFAULT and the resource does not have a ** default load defined. ** * LoadId->LoadNumber is SAHPI_LOAD_BYNAME and the resource does not support ** identifying loads by name. ** * LoadId->LoadNumber is SAHPI_LOAD_BYNAME and the contents of ** LoadId->LoadName do not correspond to a currently valid software load. ** * LoadId->LoadNumber is some value other than SAHPI_LOAD_DEFAULT or ** SAHPI_LOAD_BYNAME and the value of LoadId->LoadNumber does not ** correspond to a currently valid software load. ** ** Remarks: ** Interpretation of LoadId->LoadNumber and LoadId->LoadName is ** implementation-specific. Any particular value or contents of the ** LoadId->LoadName may be invalid for an implementation. If an invalid value ** is passed, the function returns an error. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiResourceLoadIdSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiLoadIdT *LoadId ); /******************************************************************************* ** ** Name: saHpiResourceResetStateGet() ** ** Description: ** This function gets the reset state of an entity, allowing an HPI User to ** determine if the entity is being held with its reset asserted. This ** function addresses the entity that is identified in the RPT entry for the ** resource. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** ResetAction - [out] The current reset state of the entity. Valid reset ** states are: ** * SAHPI_RESET_ASSERT: The entity's reset is asserted, e.g., for hot ** swap insertion/extraction purposes. ** * SAHPI_RESET_DEASSERT: The entity's reset is not asserted. ** ** Return Value: ** SA_OK is returned if the resource has reset control, and the reset state ** has successfully been determined; otherwise, an error code is returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support reset ** control as indicated by SAHPI_CAPABILITY_RESET in the resource's RPT ** entry. ** SA_ERR_HPI_INVALID_PARAMS is returned if the ResetAction pointer is passed ** in as NULL. ** ** Remarks: ** SAHPI_COLD_RESET and SAHPI_WARM_RESET are pulsed resets and are not valid ** values to be returned in ResetAction. If the entity is not being held in ** reset (using SAHPI_RESET_ASSERT), the appropriate value is ** SAHPI_RESET_DEASSERT. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiResourceResetStateGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiResetActionT *ResetAction ); /******************************************************************************* ** ** Name: saHpiResourceResetStateSet() ** ** Description: ** This function directs the resource to perform the specified reset type on ** the entity that it manages. This function addresses the entity that is ** identified in the RPT entry for the resource. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** ResetAction - [in] Type of reset to perform on the entity. Valid reset ** actions are: ** * SAHPI_COLD_RESET: Perform a "Cold Reset" on the entity (pulse), ** leaving reset de-asserted, ** * SAHPI_WARM_RESET: Perform a "Warm Reset" on the entity (pulse), ** leaving reset de-asserted, ** * SAHPI_RESET_ASSERT: Put the entity into reset state and hold reset ** asserted, e.g., for hot swap insertion/extraction purposes, ** * SAHPI_RESET_DEASSERT: Bring the entity out of the reset state. ** ** Return Value: ** SA_OK is returned if the resource has reset control, and the requested ** reset action has succeeded; otherwise, an error code is returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support resource ** reset control, as indicated by SAHPI_CAPABILITY_RESET in the resource's ** RPT entry. ** SA_ERR_HPI_INVALID_PARAMS is returned when the ResetAction is not one of ** the valid enumerated values for this type. ** SA_ERR_HPI_INVALID_CMD is returned if the requested ResetAction is ** SAHPI_RESET_ASSERT or SAHPI_WARM_RESET and the resource does not support ** this action. ** SA_ERR_HPI_INVALID_REQUEST is returned if the ResetAction is ** SAHPI_COLD_RESET or SAHPI_WARM_RESET and reset is currently asserted. ** ** Remarks: ** Some resources may not support holding the entity in reset or performing a ** warm reset. If this is the case, the resource should return ** SA_ERR_HPI_INVALID_CMD if the unsupported action is requested. All ** resources that have the SAHPI_CAPABILITY_RESET flag set in their RPTs must ** support SAHPI_COLD_RESET. ** ** SAHPI_RESET_ASSERT is used to hold an entity in reset, and ** SAHPI_RESET_DEASSERT is used to bring the entity out of an asserted reset ** state. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiResourceResetStateSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiResetActionT ResetAction ); /******************************************************************************* ** ** Name: saHpiResourcePowerStateGet() ** ** Description: ** This function gets the power state of an entity, allowing an HPI User to ** determine if the entity is currently powered on or off. This function ** addresses the entity which is identified in the RPT entry for the resource. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** State - [out] Pointer to a location to contain the current power state of ** the resource. Valid power states are: ** * SAHPI_POWER_OFF: The entity's primary power is OFF, ** * SAHPI_POWER_ON: The entity's primary power is ON. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support power ** management, as indicated by SAHPI_CAPABILITY_POWER in the resource's RPT ** entry. ** SA_ERR_HPI_INVALID_PARAMS is returned if the State pointer is passed in as ** NULL. ** ** Remarks: ** SAHPI_POWER_CYCLE is a pulsed power operation and is not a valid return for ** the power state. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiResourcePowerStateGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiPowerStateT *State ); /******************************************************************************* ** ** Name: saHpiResourcePowerStateSet() ** ** Description: ** This function directs the resource to perform a power control action on the ** entity that is identified in the RPT entry for the resource. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** State - [in] The requested power control action. Valid values are: ** * SAHPI_POWER_OFF: The entity's primary power is turned OFF, ** * SAHPI_POWER_ON: The entity's primary power is turned ON, ** * SAHPI_POWER_CYCLE: The entity's primary power is turned OFF, then turned ** ON. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support power ** management, as indicated by SAHPI_CAPABILITY_POWER in the resource's RPT ** entry. ** SA_ERR_HPI_INVALID_PARAMS is returned when State is not one of the valid ** enumerated values for this type. ** ** Remarks: ** This function controls the hardware power on a FRU entity regardless of ** what hot-swap state the resource is in. For example, it is legal (and may ** be desirable) to cycle power on the FRU even while it is in ACTIVE state to ** attempt to clear a fault condition. Similarly, a resource could be ** instructed to power on a FRU even while it is in INACTIVE state, for ** example, to run off-line diagnostics. ** ** This function may also be supported for non-FRU entities if power control ** is available for those entities. ** ** ** ** ** *******************************************************************************/ SaErrorT SAHPI_API saHpiResourcePowerStateSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiPowerStateT State ); #ifdef __cplusplus } #endif #endif /* __SAHPI_H */ openhpi-3.6.1/include/oHpi.h0000644000175100017510000005671312575647300014673 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copright IBM Corp 2004-2006 * (C) Copyright Pigeon Point Systems. 2010-2011 * (C) Copyright Nokia Siemens Networks 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales * Anton Pak * Ulrich Kleber * Michael Thompson */ #ifndef __OHPI_H #define __OHPI_H #include #include #include #define OH_DEFAULT_DOMAIN_ID 0 #define OPENHPI_DEFAULT_DAEMON_PORT 4743 #define MAX_PLUGIN_NAME_LENGTH 32 #define OH_SAHPI_INTERFACE_VERSION_MIN_SUPPORTED (SaHpiVersionT)0x020101 /* B.01.01 */ #define OH_SAHPI_INTERFACE_VERSION_MAX_SUPPORTED SAHPI_INTERFACE_VERSION #define OH_PATH_PARAM_MAX_LENGTH 2048 #ifdef __cplusplus extern "C" { #endif typedef SaHpiUint32T oHpiHandlerIdT; typedef struct { oHpiHandlerIdT id; SaHpiUint8T plugin_name[MAX_PLUGIN_NAME_LENGTH]; SaHpiEntityPathT entity_root; SaHpiInt32T load_failed; } oHpiHandlerInfoT; typedef struct { SaHpiDomainIdT id; SaHpiTextBufferT host; SaHpiUint16T port; SaHpiEntityPathT entity_root; } oHpiDomainEntryT; typedef enum { OHPI_ON_EP = 1, // Not used now OHPI_LOG_ON_SEV, OHPI_EVT_QUEUE_LIMIT, OHPI_DEL_SIZE_LIMIT, OHPI_DEL_SAVE, OHPI_DAT_SIZE_LIMIT, OHPI_DAT_USER_LIMIT, OHPI_DAT_SAVE, //OHPI_DEBUG, //OHPI_DEBUG_TRACE, //OHPI_DEBUG_LOCK, OHPI_PATH, OHPI_VARPATH, OHPI_CONF } oHpiGlobalParamTypeT; typedef union { SaHpiEntityPathT OnEP; /* Not used now */ /* Log events of severity equal to ore more critical than this */ SaHpiSeverityT LogOnSev; SaHpiUint32T EvtQueueLimit; /* Max events # allowed in session queue */ SaHpiUint32T DelSizeLimit; /* Maximum size of domain event log */ SaHpiBoolT DelSave; /* True if domain event log is to be saved to disk */ SaHpiUint32T DatSizeLimit; /* Max alarms allowed in alarm table */ SaHpiUint32T DatUserLimit; /* Max number of user alarms allowed */ SaHpiBoolT DatSave; /* True if domain alarm table is to be saved to disk */ //unsigned char Debug; /* 1 = YES, 0 = NO */ //unsigned char DebugTrace; /* !0 = YES, 0 = NO */ //unsigned char DebugLock; /* !0 = YES, 0 = NO */ SaHpiUint8T Path[OH_PATH_PARAM_MAX_LENGTH]; /* Dir path to openhpi plugins */ SaHpiUint8T VarPath[OH_PATH_PARAM_MAX_LENGTH]; /* Dir path for openhpi data */ SaHpiUint8T Conf[OH_PATH_PARAM_MAX_LENGTH]; /* File path of openhpi configuration */ } oHpiGlobalParamUnionT; typedef struct { oHpiGlobalParamTypeT Type; oHpiGlobalParamUnionT u; } oHpiGlobalParamT; /*************************************************************************** ** ** Name: oHpiVersionGet() ** ** Description: ** This function returns the version of the Base Library. ** ** Remarks: ** This is a Base Library level function. ** The SaHpiUint64T version consists of 3 16-bit blocks: MAJOR, MINOR, and PATCH. ** MAJOR occupies bytes[7:6]. ** MINOR occupies bytes[5:4]. ** PATCH occupies bytes[3:2]. ** Bytes[1:0] are zeroed. ** For example version 2.17.0 is returned as 0x0002001100000000. ** ***************************************************************************/ SaHpiUint64T SAHPI_API oHpiVersionGet(void); /*************************************************************************** ** ** Name: oHpiHandlerCreate() ** ** Description: ** This function creates a new handler (instance of a plugin) on the ** OpenHPI daemon side. ** ** Parameters: ** sid - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** config - [in] Hash table. Holds configuration information used by the handler. ** The table key is a configuration parameter name (as a string). ** The table item is the configuration parameter value (as a string). ** id - [out] Unique (for the targeted OpenHPI daemon) id associated ** with the created handler. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_INVALID_PARAMS is returned when the: ** * config is is passed in as NULL. ** * id is is passed in as NULL. ** SA_ERR_HPI_INTERNAL_ERROR is returned if a handler is created, ** but failed to open. ** SA_ERR_HPI_ERROR is returned: ** * when config doesn't have "plugin" parameter ** * in other error cases. ** ** Remarks: ** This is a Daemon level function. ** The config table must have an entry for "plugin" in order to know for which ** plugin the handler is being created. ** If the handler failed to open the oHpiHandlerRetry can be used to retry ** opening the handler. ** ***************************************************************************/ SaErrorT SAHPI_API oHpiHandlerCreate ( SAHPI_IN SaHpiSessionIdT sid, SAHPI_IN GHashTable *config, SAHPI_OUT oHpiHandlerIdT *id ); /*************************************************************************** ** ** Name: oHpiHandlerDestroy() ** ** Description: ** This function destroys the specified handler on the OpenHPI daemon side. ** ** Parameters: ** sid - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** id - [in] Unique (for the targeted OpenHPI daemon) id associated ** with the handler. Reserved id values: ** * SAHPI_FIRST_ENTRY Get first handler. ** * SAHPI_LAST_ENTRY Reserved as delimiter for end of list. Not a valid ** handler identifier. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_ERROR is returned: ** * when the daemon failed to destroy the handler. ** * in other error cases. ** ** Remarks: ** This is Daemon level function. ** TODO: Improve the current set of error codes for the function. ** ***************************************************************************/ SaErrorT SAHPI_API oHpiHandlerDestroy ( SAHPI_IN SaHpiSessionIdT sid, SAHPI_IN oHpiHandlerIdT id ); /*************************************************************************** ** ** Name: oHpiHandlerInfo() ** ** Description: ** This function is used for requesting information about specified handler. ** ** Parameters: ** sid - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** id - [in] Unique (for the targeted OpenHPI daemon) id associated ** with the handler. Reserved id values: ** * SAHPI_FIRST_ENTRY Get first handler. ** * SAHPI_LAST_ENTRY Reserved as delimiter for end of list. Not a valid ** handler identifier. ** info - [out] Pointer to struct to hold the handler information. ** conf_params - [out] Pointer to to pre-allocated hash-table to hold ** the handler's configuration parameters. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_INVALID_PARAMS is returned when the: ** * info is passed in as NULL ** * conf_params is passed in as NULL ** * id is passed in as SAHPI_FIRST_ENTRY ** SA_ERR_HPI_NOT_PRESENT is returned when the specified the targeted ** OpenHPI daemon has no handler with the specified id. ** ** Remarks: ** This is Daemon level function. ** ***************************************************************************/ SaErrorT SAHPI_API oHpiHandlerInfo ( SAHPI_IN SaHpiSessionIdT sid, SAHPI_IN oHpiHandlerIdT id, SAHPI_OUT oHpiHandlerInfoT *info, SAHPI_INOUT GHashTable *conf_params ); /*************************************************************************** ** ** Name: oHpiHandlerGetNext() ** ** Description: ** This function is used for iterating through all loaded handlers on the ** targeted OpenHPI daemon. ** ** Parameters: ** sid - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** id - [in] Unique (for the targeted OpenHPI daemon) id associated ** with the handler. Reserved id values: ** * SAHPI_FIRST_ENTRY Get first handler. ** * SAHPI_LAST_ENTRY Reserved as delimiter for end of list. Not a valid ** handler identifier. ** next_id - [out] Pointer to the location to store the id of the next handler. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_NOT_PRESENT is returned when the: ** * handler identified by id is not present. * * there is no next handler after the specified one. ** * id is SAHPI_FIRST_ENTRY and there are no loaded handlers in the targeted ** OpenHPI daemon. ** SA_ERR_HPI_INVALID_PARAMS is returned if the: ** * next_id pointer is passed in as NULL. ** * id is an invalid reserved value such as SAHPI_LAST_ENTRY. ** ** Remarks: ** This is a Daemon level function. ** If the id parameter is set to SAHPI_FIRST_ENTRY, the function sets ** the next_id parameter to the id of the first handler for the targeted ** OpenHPI daemon. To retrieve an entire list of ids for the targeted ** OpenHPI daemon call this function first with an id of SAHPI_FIRST_ENTRY, ** and then use the returned next_id the next call. ** Proceed until the next_id returned is SAHPI_LAST_ENTRY or ** the call returned SA_ERR_HPI_NOT_PRESENT. ** TODO: Implement a check that the id is and invalid reserved value. ** ***************************************************************************/ SaErrorT SAHPI_API oHpiHandlerGetNext ( SAHPI_IN SaHpiSessionIdT sid, SAHPI_IN oHpiHandlerIdT id, SAHPI_OUT oHpiHandlerIdT *next_id ); /*************************************************************************** ** ** Name: oHpiHandlerFind() ** ** Description: ** This function is used for requesting a handler id that manages the specified ** resource. ** ** Parameters: ** sid - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** rid - [in] Resource id. ** id - [out] Pointer to the location to store the handler id. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_INVALID_RESOURCE is returned if resource id does not match ** any resource in the targeted OpenHPI daemon. ** ** Remarks: ** This is Daemon level function. ** Every resource that the OpenHPI daemon exposes is created and managed by ** some handler. This function allows to know the id of the handler ** responsible for the specified resource. ** ***************************************************************************/ SaErrorT SAHPI_API oHpiHandlerFind ( SAHPI_IN SaHpiSessionIdT sid, SAHPI_IN SaHpiResourceIdT rid, SAHPI_OUT oHpiHandlerIdT *id ); /*************************************************************************** ** ** Name: oHpiHandlerRetry() ** ** Description: ** This function is used for retrying initialization of the failed handler. ** ** Parameters: ** sid - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** id - [in] Unique (for the targeted OpenHPI daemon) id associated ** with the handler. Reserved id values: ** * SAHPI_FIRST_ENTRY Get first handler. ** * SAHPI_LAST_ENTRY Reserved as delimiter for end of list. Not a valid ** handler identifier. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_OK is returned if the handler was already successfully initialized. ** SA_ERR_HPI_NOT_PRESENT is returned when the targeted OpenHPI daemon ** has no handler with the specified id. ** ** Remarks: ** This is Daemon level function. ** It is possible that the handler has failed to initialize. ** For example because of a connection failure to the managed entity. ** This function allows an HPI User to retry the handler initialization process. ** ***************************************************************************/ SaErrorT SAHPI_API oHpiHandlerRetry ( SAHPI_IN SaHpiSessionIdT sid, SAHPI_IN oHpiHandlerIdT id ); /*************************************************************************** ** ** Name: oHpiGlobalParamGet() ** ** Description: ** This function is used for requesting global configuration parameters ** from the targeted OpenHPI daemon. ** ** Parameters: ** sid - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** param - [in/out] Pointer to a Parameter data structure into which the ** requested parameter is placed. The requested parameter type is ** passed in via param->Type. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_INVALID_PARAMS is returned if param is passed in as NULL. ** SA_ERR_HPI_UNKNOWN is returned if param->Type is unknown to the ** targeted OpenHPI daemon. ** ** Remarks: ** This is Daemon level function. ** ***************************************************************************/ SaErrorT SAHPI_API oHpiGlobalParamGet ( SAHPI_IN SaHpiSessionIdT sid, SAHPI_INOUT oHpiGlobalParamT *param ); /*************************************************************************** ** ** Name: oHpiGlobalParamSet() ** ** Description: ** This function is used for setting the value of the specified global ** configuration parameters for the targeted OpenHPI daemon. ** ** Parameters: ** sid - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** param - [in] Pointer to a Parameter data structure holding the ** data to be set. The requested parameter type is passed in via ** param->Type. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_INVALID_PARAMS is returned if param is passed in as NULL. ** SA_ERR_HPI_ERROR is returned: ** * when the param->Type is unknown to the targeted OpenHPI daemon. ** * in other error cases ** ** Remarks: ** This is Daemon level function. ** TODO: Improve the current set of error codes for the function. ** ***************************************************************************/ SaErrorT SAHPI_API oHpiGlobalParamSet ( SAHPI_IN SaHpiSessionIdT sid, SAHPI_IN oHpiGlobalParamT *param ); /*************************************************************************** ** ** Name: oHpiInjectEvent() ** ** Description: ** This function is used to inject an HPI event into the targeted handler as if ** it originated from the handler. ** This call will set the event.Source, rpte.ResourceId, rpte.ResourceEntity ** so that the caller knows what the final assigned values were. ** For rpte.ResourceEntity, the entity_root configuration parameter for the plugin ** is used to complete it. In addition, for each rdr in rdr, a Num, RecordId, ** and Entity will be assigned. This will also be reflected in the passed rdr ** list so that the caller can know what the assigned values were. ** ** Parameters: ** sid - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** id - [in] Unique (for the targeted OpenHPI daemon) id associated ** with the handler for which the event will be injected. ** event - [in] pointer to the event to be injected. ** rpte - [in] pointer to the resource to be injected. ** rdr - [in] pointer to the list of RDRs to be injected along with rpte ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_INVALID_SESSION is returned if sid is null. ** SA_ERR_HPI_INVALID_PARAMS is returned if ** id is null. ** event, rpte, or rdr pointer are passed in as NULL ** ** Remarks: ** This is Daemon level function. ** Currently only the simulator plug-in supports this function. ** id and event are required parameters. rpte is only required if the event ** is of RESOURCE type or HOTSWAP type. rdr is an optional argument in all ** cases and can be NULL. If @rdrs is passed, it will be copied. It is the ** responsibility of the caller to clean up the RDRs list once it is used here. ** ***************************************************************************/ SaErrorT SAHPI_API oHpiInjectEvent ( SAHPI_IN SaHpiSessionIdT sid, SAHPI_IN oHpiHandlerIdT id, SAHPI_IN SaHpiEventT *event, SAHPI_IN SaHpiRptEntryT *rpte, SAHPI_IN SaHpiRdrT *rdr); /*************************************************************************** ** ** Name: oHpiDomainAdd() ** ** Description: ** This function informs the Base Library about the existence of an HPI domain ** and returns a Unique Domain Id that Base Library associates with the domain. ** In other words the function adds a new entry in Base Library known domain ** table. ** ** Parameters: ** host - [in] The hostname of the domain host. ** port - [in] The port number on the domain host. ** entity_root - [in] This entity_root will be added to all entity paths ** exposed in the domain. ** domain_id - [out] Unique Domain Id associated with the new domain ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_INVALID_PARAMS is returned if the host, port, or entity_root ** is passed in as NULL. ** SA_ERR_HPI_INVALID_DATA is returned if the host is not ** SAHPI_TL_TYPE_BCDPLUS, SAHPI_TL_TYPE_ASCII6, or SAHPI_TL_TYPE_TEXT. ** SA_ERR_HPI_OUT_OF_SPACE is returned if the domain cannot be added. ** ** Remarks: ** This is Base Library level function. ** It only informs Base Library about existence of HPI service with the ** specified connectivity parameters. ** ***************************************************************************/ SaErrorT SAHPI_API oHpiDomainAdd ( SAHPI_IN const SaHpiTextBufferT *host, SAHPI_IN SaHpiUint16T port, SAHPI_IN const SaHpiEntityPathT *entity_root, SAHPI_OUT SaHpiDomainIdT *domain_id ); /*************************************************************************** ** ** Name: oHpiDomainAddById() ** ** Description: ** This function informs the Base Library about the existence of an HPI domain. ** The function allows an HPI User to specify a Unique Domain Id that Base Library ** associates with the domain. ** In other words the function adds new entry in the Base Library known domain ** table. ** ** Parameters: ** host - [in] The hostname of the domain host. ** port - [in] The port number on the domain host. ** entity_root - [in] This entity_root will be added to all entity paths ** exposed in the domain. ** domain_id - [in] Unique Domain Id that User wants to be associated with ** the new domain. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_INVALID_PARAMS is returned if the host, port, or entity_root ** is passed in as NULL. ** SA_ERR_HPI_INVALID_DATA is returned if the host is not ** SAHPI_TL_TYPE_BCDPLUS, SAHPI_TL_TYPE_ASCII6, or SAHPI_TL_TYPE_TEXT. ** SA_ERR_HPI_DUPLICATE is returned if the specified domain_id is already ** in use. ** SA_ERR_HPI_OUT_OF_SPACE is returned if the domain cannot be added. ** ** Remarks: ** This is Base Library level function. ** It only informs Base Library about existence of HPI service with the ** specified connectivity parameters. ** ***************************************************************************/ SaErrorT SAHPI_API oHpiDomainAddById ( SAHPI_IN SaHpiDomainIdT domain_id, SAHPI_IN const SaHpiTextBufferT *host, SAHPI_IN SaHpiUint16T port, SAHPI_IN const SaHpiEntityPathT *entity_root ); /*************************************************************************** ** ** Name: oHpiDomainEntryGet() ** ** Description: ** This function retrieves resource information for the specified entry of the ** Base Library known domain table. This function allows an HPI User to read ** the table entry-by-entry. ** ** Parameters: ** EntryId - [in] Identifier of the domain entry to retrieve. Reserved EntryId ** values: ** * SAHPI_FIRST_ENTRY Get first entry. ** * SAHPI_LAST_ENTRY Reserved as delimiter for end of list. Not a valid ** entry identifier. ** NextEntryId - [out] Pointer to the location to store the EntryId of next ** domain entry. ** DomainEntry - [out] Pointer to the structure to hold the returned domain ** entry. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_NOT_PRESENT is returned when the: ** * Entry identified by EntryId is not present. ** * EntryId is SAHPI_FIRST_ENTRY and the Base Library domain table is empty. ** SA_ERR_HPI_INVALID_PARAMS is returned if the: ** * DomainEntry pointer is passed in as NULL. ** * NextEntryId pointer is passed in as NULL. ** * EntryId is an invalid reserved value such as SAHPI_LAST_ENTRY. ** ** Remarks: ** This is Base Library level function. ** If the EntryId parameter is set to SAHPI_FIRST_ENTRY, the first entry in ** the Base Library domain table is returned. When an entry is successfully ** retrieved, NextEntryId is set to the identifier of the next valid entry; ** however, when the last entry has been retrieved, NextEntryId is set to ** SAHPI_LAST_ENTRY. To retrieve an entire list of entries, call this function ** first with an EntryId of SAHPI_FIRST_ENTRY, and then use the returned ** NextEntryId in the next call. Proceed until the NextEntryId returned is ** SAHPI_LAST_ENTRY. ***************************************************************************/ SaErrorT SAHPI_API oHpiDomainEntryGet ( SAHPI_IN SaHpiEntryIdT EntryId, SAHPI_OUT SaHpiEntryIdT *NextEntryId, SAHPI_OUT oHpiDomainEntryT *DomainEntry ); /******************************************************************************* ** ** Name: oHpiDomainEntryGetByDomainId() ** ** Description: ** This function retrieves resource information from the Base Library known ** domain table for the specified domain using its DomainId. ** ** Parameters: ** DomainId - [in] Domain identified for this operation. ** DomainEntry - [out] Pointer to the structure to hold the returned domain ** entry. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_NOT_PRESENT is returned when the specified DomainId is unknown ** to the Base Library. ** SA_ERR_HPI_INVALID_PARAMS is returned if the DomainEntry pointer is passed in ** as NULL. ** ** Remarks: ** This is Base Library level function. ** ***************************************************************************/ SaErrorT SAHPI_API oHpiDomainEntryGetByDomainId ( SAHPI_IN SaHpiDomainIdT DomainId, SAHPI_OUT oHpiDomainEntryT *DomainEntry ); #define OHPI_VERSION_GET(v, VER) \ { \ char version[] = VER; \ char *start = version; \ char *end = version; \ v += (strtoull(start, &end, 10) << 48); \ end++; \ start = end; \ v += (strtoull(start, &end, 10) << 32); \ end++; \ start = end; \ v += (strtoull(start, &end, 10) << 16); \ } #ifdef __cplusplus } /* extern "C" */ #endif #endif /*__OHPI_H*/ openhpi-3.6.1/include/oh_handler.h0000644000175100017510000007554312575647300016101 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * (C) Copright IBM Corp 2003-2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Louis Zhuang * Sean Dague * Renier Morales * Racing Guo * Anton Pak */ #ifndef __OH_HANDLER_H #define __OH_HANDLER_H #include #include #include #include #ifdef __cplusplus extern "C" { #endif /* * Common OpenHPI implementation specific definitions * -------------------------------------------------- * * plugin - software component contained in a shared library that exports * a function named 'get_interface'. Loading a plugin entails * performing a dlopen on the library, finding 'get_interface' with * dl_sym, and calling 'get_interface' to get an interface pointer * (referred to as the 'abi'.) * * abi - pointer to a structure of type oh_abi_XX where XX represents a * version of the structure. This structure is a bundle of function * pointers that represents the interface between a given plug-in * instance (known as a handler), and the OpenHPI infrastructure. * * handler - an instance of a plugin represented by a structure of type * oh_handler which contains an abi and a pointer to an instance * specific data structure that is private to the plug-in. */ /* * How plugins are instantiated * ---------------------------- * * When an HPI application initializes OpenHPI by calling saHpiInitialize(), * the OpenHPI infrastructure will seek out all configured plug-ins * (see oh_config.h for details on how a plug-in is configured), and: * 1. load the plug-in into memory * 2. extract an abi from the plug-in * 3. create a new oh_plugin containing the name of the plugin and * the abi extracted from the plugin * 4. add the oh_plugin to the global list of plugins * * The first time the HPI application creates a new session by calling * saHpiSessionOpen(), the OpenHPI infrastructure will once again examine * the implementation configuration and create new plug-in instances * (i.e. a handler) as the configuration dictates. * * Each handler configuration item will specify: * 1. name of plugin in question * 2. additional arguments understood by the plug-in * * Each new handler is created by: * 1. finding the oh_plugin containing the same plugin name as the * configuration item * 2. using the abi found in the oh_plugin to call abi->open(), passing * the additional plug-in specific arguments to the open function. * The open call will return a void* pointer (known as hnd) that is * required to be passed back to the plug-in for all further abi * function calls. * 3. creating a new oh_handler that contains a pointer to the associated * abi, and the hnd returned by the open function. */ /* * How plugins can have multiple instances open at the same time * ------------------------------------------------------------- * * The key to a plugin being able to support multiple instances * is in the 'void *hnd' passed to all abi functions (except open().) * The intent is that hnd is used as a private pointer to an instance specific * data structure. * * For example, if a plug-in were created to allow an HPI implementation * running a remote server to inter-operate with the local OpenHPI * implementation, then the plug-in could be written such that: * 1. the plugin defines a new structure containing an event queue and tcp * socket to the remote machine * 2. the plugin requires that handler configuration entries for this * plugin to contain the IP address of the remote machine to connect * 3. when open() is called, the plugin * - opens a socket to the new machine * - allocates a new event queue * - allocates a new instance structure * - stores the event queue and socket in the instance structure * - returns a pointer to the structure as 'hnd'. * 4. as other abi functions are called, the 'hnd' passed in with those * functions is cast back to a pointer to the instance data, and then * communicates over the socket in that structure to service the given * request. * */ struct oh_handler_state { unsigned int hid; oh_evt_queue *eventq; GHashTable *config; RPTable *rptcache; oh_el *elcache; GThread *thread_handle; void *data; }; struct oh_abi_v2 { /*** * open * handler_config: instance's configuration data. * hid: id of this intance. * eventq: pointer to queue to place events in. * * The function creates a pluing instance. * * Returns: pointer to the handler of the instance **/ void *(*open)(GHashTable *handler_config, unsigned int hid, oh_evt_queue *eventq); void (*close)(void *hnd); /******************************************************************** * PLUGIN HPI ABIs - These plugin functions implement a large part of * the HPI APIs from the specification. ********************************************************************/ /*** * saHpiEventGet - passed down to plugin * * @remark at the start-up, plugins must send out res/rdr event for all * resources and rdrs so as to OpenHPI can build up RPT/RDR. * @return >0 if an event is returned; 0 if timeout; otherwise an error * occur. **/ SaErrorT (*get_event)(void *hnd); /*** * saHpiDiscover, passed down to plugin **/ SaErrorT (*discover_resources)(void *hnd); /*** * saHpiResourceTagSet, this is passed down so the device has * a chance to set it in nv storage if it likes **/ SaErrorT (*set_resource_tag)(void *hnd, SaHpiResourceIdT id, SaHpiTextBufferT *tag); /*** * saHpiResourceSeveritySet is pushed down so the device has * a chance to set it in nv storage **/ SaErrorT (*set_resource_severity)(void *hnd, SaHpiResourceIdT id, SaHpiSeverityT sev); /*** * saHpiResourceFailedRemove, passed down to plugin **/ SaErrorT (*resource_failed_remove)(void *hnd, SaHpiResourceIdT rid); /***************** * EVENT LOG ABIs *****************/ /*** * saHpiEventLogInfoGet **/ SaErrorT (*get_el_info)(void *hnd, SaHpiResourceIdT id, SaHpiEventLogInfoT *info); /*** * saHpiEventLogCapabilitiesGet **/ SaErrorT (*get_el_caps)(void *hnd, SaHpiResourceIdT id, SaHpiEventLogCapabilitiesT *caps); /*** * saHpiEventLogTimeSet **/ SaErrorT (*set_el_time)(void *hnd, SaHpiResourceIdT id, SaHpiTimeT time); /*** * saHpiEventLogEntryAdd **/ SaErrorT (*add_el_entry)(void *hnd, SaHpiResourceIdT id, const SaHpiEventT *Event); /*** * saHpiEventLogEntryGet **/ SaErrorT (*get_el_entry)(void *hnd, SaHpiResourceIdT id, SaHpiEventLogEntryIdT current, SaHpiEventLogEntryIdT *prev, SaHpiEventLogEntryIdT *next, SaHpiEventLogEntryT *entry, SaHpiRdrT *rdr, SaHpiRptEntryT *rptentry); /*** * saHpiEventLogClear **/ SaErrorT (*clear_el)(void *hnd, SaHpiResourceIdT id); /*** * saHpiEventLogStateSet **/ SaErrorT (*set_el_state)(void *hnd, SaHpiResourceIdT id, SaHpiBoolT e); /*** * saHpiEventLogOverflowReset **/ SaErrorT (*reset_el_overflow)(void *hnd, SaHpiResourceIdT id); /************** * SENSOR ABIs **************/ /*** * saHpiSensorReadingGet **/ SaErrorT (*get_sensor_reading)(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiSensorReadingT *reading, SaHpiEventStateT *state); /*** * saHpiSensorThresholdsGet **/ SaErrorT (*get_sensor_thresholds)(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiSensorThresholdsT *thres); /*** * saHpiSensorThresholdsSet **/ SaErrorT (*set_sensor_thresholds)(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, const SaHpiSensorThresholdsT *thres); /*** * saHpiSensorEnableGet **/ SaErrorT (*get_sensor_enable)(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiBoolT *enable); /*** * saHpiSensorEnableSet **/ SaErrorT (*set_sensor_enable)(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiBoolT enable); /*** * saHpiSensorEventEnableGet **/ SaErrorT (*get_sensor_event_enables)(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiBoolT *enables); /*** * saHpiSensorEventEnableSet **/ SaErrorT (*set_sensor_event_enables)(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, const SaHpiBoolT enables); /*** * saHpiSensorEventMasksGet **/ SaErrorT (*get_sensor_event_masks)(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiEventStateT *AssertEventMask, SaHpiEventStateT *DeassertEventMask); /*** * saHpiSensorEventMasksSet **/ SaErrorT (*set_sensor_event_masks)(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiSensorEventMaskActionT act, SaHpiEventStateT AssertEventMask, SaHpiEventStateT DeassertEventMask); /*************** * CONTROL ABIs ***************/ /*** * saHpiControlGet **/ SaErrorT (*get_control_state)(void *hnd, SaHpiResourceIdT id, SaHpiCtrlNumT num, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state); /*** * saHpiControlSet **/ SaErrorT (*set_control_state)(void *hnd, SaHpiResourceIdT id, SaHpiCtrlNumT num, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state); /***************** * INVENTORY ABIs *****************/ /*** * saHpiIdrInfoGet **/ SaErrorT (*get_idr_info)(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrInfoT *idrinfo); /*** * saHpiIdrAreaHeaderGet **/ SaErrorT (*get_idr_area_header)(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrAreaTypeT areatype, SaHpiEntryIdT areaid, SaHpiEntryIdT *nextareaid, SaHpiIdrAreaHeaderT *header); /*** * saHpiIdrAreaAdd **/ SaErrorT (*add_idr_area)(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrAreaTypeT areatype, SaHpiEntryIdT *areaid); /*** * saHpiIdrAreaAddById **/ SaErrorT (*add_idr_area_id)(void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrAreaTypeT, SaHpiEntryIdT); /*** * saHpiIdrAreaDelete **/ SaErrorT (*del_idr_area)(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiEntryIdT areaid); /*** * saHpiIdrFieldGet **/ SaErrorT (*get_idr_field)(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiEntryIdT areaid, SaHpiIdrFieldTypeT fieldtype, SaHpiEntryIdT fieldid, SaHpiEntryIdT *nextfieldid, SaHpiIdrFieldT *field); /*** * saHpiIdrFieldAdd **/ SaErrorT (*add_idr_field)(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrFieldT *field); /*** * saHpiIdrFieldAddById **/ SaErrorT (*add_idr_field_id)(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrFieldT *field); /*** * saHpiIdrFieldSet **/ SaErrorT (*set_idr_field)(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrFieldT *field); /*** * saHpiIdrFieldDelete **/ SaErrorT (*del_idr_field)(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiEntryIdT areaid, SaHpiEntryIdT fieldid); /*** * saHpiWatchdogTimerGet **/ SaErrorT (*get_watchdog_info)(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num, SaHpiWatchdogT *wdt); /*** * saHpiWatchdogTimerSet **/ SaErrorT (*set_watchdog_info)(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num, SaHpiWatchdogT *wdt); /*** * saHpiWatchdogTimerReset **/ SaErrorT (*reset_watchdog)(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num); /****************** * ANNUCIATOR ABIs ******************/ /* the first 5 Annunciator functions are really operating on a single Annunciator and doing things to the announcements that it contains. For this reason the functions are named _announce */ /*** * saHpiAnnunciatorGetNext **/ SaErrorT (*get_next_announce)(void *hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiSeverityT sev, SaHpiBoolT ack, SaHpiAnnouncementT *ann); /*** * saHpiAnnunciatorGet **/ SaErrorT (*get_announce)(void *hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiEntryIdT annid, SaHpiAnnouncementT *ann); /*** * saHpiAnnunciatorAcknowledge **/ SaErrorT (*ack_announce)(void *hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiEntryIdT annid, SaHpiSeverityT sev); /*** * saHpiAnnunciatorAdd **/ SaErrorT (*add_announce)(void *hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiAnnouncementT *ann); /*** * saHpiAnnunciatorDelete **/ SaErrorT (*del_announce)(void *hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiEntryIdT annid, SaHpiSeverityT sev); /* the last 2 functions deal with Annunciator mode setting */ /*** * saHpiAnnunciatorModeGet **/ SaErrorT (*get_annunc_mode)(void *hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiAnnunciatorModeT *mode); /*** * saHpiAnnunciatorModeSet **/ SaErrorT (*set_annunc_mode)(void *hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiAnnunciatorModeT mode); /*************** * DIMI ABIs ***************/ /*** * saHpiDimiInfoGet **/ SaErrorT (*get_dimi_info)(void *hnd, SaHpiResourceIdT id, SaHpiDimiNumT num, SaHpiDimiInfoT *info); /*** * saHpiDimiTestInfoGet **/ SaErrorT (*get_dimi_test)(void *hnd, SaHpiResourceIdT id, SaHpiDimiNumT num, SaHpiDimiTestNumT testnum, SaHpiDimiTestT *test); /*** * saHpiDimiTestReadinessGet **/ SaErrorT (*get_dimi_test_ready)( void *hnd, SaHpiResourceIdT id, SaHpiDimiNumT num, SaHpiDimiTestNumT testnum, SaHpiDimiReadyT *ready); /*** * saHpiDimiTestStart **/ SaErrorT (*start_dimi_test)( void *hnd, SaHpiResourceIdT id, SaHpiDimiNumT num, SaHpiDimiTestNumT testnum, SaHpiUint8T numparams, SaHpiDimiTestVariableParamsT *paramslist); /*** * saHpiDimiTestCancel **/ SaErrorT (*cancel_dimi_test)( void *hnd, SaHpiResourceIdT id, SaHpiDimiNumT num, SaHpiDimiTestNumT testnum); /*** * saHpiDimiTestStatusGet **/ SaErrorT (*get_dimi_test_status)( void *hnd, SaHpiResourceIdT id, SaHpiDimiNumT num, SaHpiDimiTestNumT testnum, SaHpiDimiTestPercentCompletedT *percentcompleted, SaHpiDimiTestRunStatusT *runstatus); /*** * saHpiDimiTestResultsGet **/ SaErrorT (*get_dimi_test_results)( void *hnd, SaHpiResourceIdT id, SaHpiDimiNumT num, SaHpiDimiTestNumT testnum, SaHpiDimiTestResultsT *testresults); /*************** * FUMI ABIs ***************/ /*** * saHpiFumiSpecInfoGet **/ SaErrorT (*get_fumi_spec)( void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiFumiSpecInfoT *specinfo ); /*** * saHpiFumiServiceImpactGet **/ SaErrorT (*get_fumi_service_impact)( void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiFumiServiceImpactDataT *serviceimpact ); /*** * saHpiFumiSourceSet **/ SaErrorT (*set_fumi_source)( void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiTextBufferT *sourceuri); /*** * saHpiFumiSourceInfoValidateStart **/ SaErrorT (*validate_fumi_source)( void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT banknum); /*** * saHpiFumiSourceInfoGet **/ SaErrorT (*get_fumi_source)( void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiFumiSourceInfoT *sourceinfo); /*** * saHpiFumiSourceComponentInfoGet **/ SaErrorT (*get_fumi_source_component)( void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiEntryIdT compid, SaHpiEntryIdT *nextcompid, SaHpiFumiComponentInfoT *compinfo); /*** * saHpiFumiTargetInfoGet **/ SaErrorT (*get_fumi_target)( void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiFumiBankInfoT *bankinfo); /*** * saHpiFumiTargetComponentInfoGet **/ SaErrorT (*get_fumi_target_component)( void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiEntryIdT compid, SaHpiEntryIdT *nextcompid, SaHpiFumiComponentInfoT *compinfo); /*** * saHpiFumiLogicalTargetInfoGet **/ SaErrorT (*get_fumi_logical_target)( void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiFumiLogicalBankInfoT *bankinfo); /*** * saHpiFumiLogicalTargetComponentInfoGet **/ SaErrorT (*get_fumi_logical_target_component)( void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiEntryIdT compid, SaHpiEntryIdT *nextcompid, SaHpiFumiLogicalComponentInfoT *compinfo); /*** * saHpiFumiBackupStart **/ SaErrorT (*start_fumi_backup)( void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num); /*** * saHpiFumiBankBootOrderSet **/ SaErrorT (*set_fumi_bank_order)( void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiUint32T position); /*** * saHpiFumiBankBootOrderSet **/ SaErrorT (*start_fumi_bank_copy)( void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT sourcebanknum, SaHpiBankNumT targetbanknum); /*** * saHpiFumiInstallStart **/ SaErrorT (*start_fumi_install)( void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT banknum); /*** * saHpiFumiUpgradeStatusGet **/ SaErrorT (*get_fumi_status)( void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiFumiUpgradeStatusT *status); /*** * saHpiFumiTargetVerifyStart **/ SaErrorT (*start_fumi_verify)( void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT banknum); /*** * saHpiFumiTargetVerifyMainStart **/ SaErrorT (*start_fumi_verify_main)( void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num ); /*** * saHpiFumiUpgradeCancel **/ SaErrorT (*cancel_fumi_upgrade)( void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT banknum); /*** * saHpiFumiAutoRollbackDisableGet **/ SaErrorT (*get_fumi_autorollback_disable)( void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBoolT *disable); /*** * saHpiFumiAutoRollbackDisableSet **/ SaErrorT (*set_fumi_autorollback_disable)( void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBoolT disable); /*** * saHpiFumiRollbackStart **/ SaErrorT (*start_fumi_rollback)( void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num); /*** * saHpiFumiActivate **/ SaErrorT (*activate_fumi)( void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num); /*** * saHpiFumiActivateStart **/ SaErrorT (*start_fumi_activate)( void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBoolT logical); /*** * saHpiFumiCleanup **/ SaErrorT (*cleanup_fumi)( void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT banknum); /*************** * HOTSWAP ABIs ***************/ /*** * saHpiHotSwapPolycyCancel **/ SaErrorT (*hotswap_policy_cancel)(void *hnd, SaHpiResourceIdT id, SaHpiTimeoutT timeout); /*** * saHpiAutoInsertTimeoutSet **/ SaErrorT (*set_autoinsert_timeout)(void *hnd, SaHpiTimeoutT timeout); /*** * saHpiAutoExtractTimeoutGet **/ SaErrorT (*get_autoextract_timeout)(void *hnd, SaHpiResourceIdT id, SaHpiTimeoutT *timeout); /*** * saHpiAutoExtractTimeoutSet **/ SaErrorT (*set_autoextract_timeout)(void *hnd, SaHpiResourceIdT id, SaHpiTimeoutT timeout); /*** * saHpiHotSwapStateGet **/ SaErrorT (*get_hotswap_state)(void *hnd, SaHpiResourceIdT id, SaHpiHsStateT *state); /*** * saHpiHotSwapStateSet **/ SaErrorT (*set_hotswap_state)(void *hnd, SaHpiResourceIdT id, SaHpiHsStateT state); /*** * saHpiHotSwapActionRequest **/ SaErrorT (*request_hotswap_action)(void *hnd, SaHpiResourceIdT id, SaHpiHsActionT act); /*** * saHpiHotSwapIndicatorStateGet **/ SaErrorT (*get_indicator_state)(void *hnd, SaHpiResourceIdT id, SaHpiHsIndicatorStateT *state); /*** * saHpiHotSwapIndicatorStateSet **/ SaErrorT (*set_indicator_state)(void *hnd, SaHpiResourceIdT id, SaHpiHsIndicatorStateT state); /************* * POWER ABIs *************/ /*** * saHpiResourcePowerStateGet **/ SaErrorT (*get_power_state)(void *hnd, SaHpiResourceIdT id, SaHpiPowerStateT *state); /*** * saHpiResourcePowerStateSet **/ SaErrorT (*set_power_state)(void *hnd, SaHpiResourceIdT id, SaHpiPowerStateT state); /***************** * PARAMETER ABIs *****************/ /*** * saHpiParmControl **/ SaErrorT (*control_parm)(void *hnd, SaHpiResourceIdT id, SaHpiParmActionT act); /*********************** * Load Management ABIs ***********************/ /*** * saHpiResourceLoadIdGet **/ SaErrorT (*load_id_get)(void *hnd, SaHpiResourceIdT rid, SaHpiLoadIdT *load_id); /*** * saHpiResourceLoadIdSet **/ SaErrorT (*load_id_set)(void *hnd, SaHpiResourceIdT rid, SaHpiLoadIdT *load_id); /************* * RESET ABIs *************/ /*** * saHpiResourceResetStateGet **/ SaErrorT (*get_reset_state)(void *hnd, SaHpiResourceIdT id, SaHpiResetActionT *act); /*** * saHpiResourceResetStateSet **/ SaErrorT (*set_reset_state)(void *hnd, SaHpiResourceIdT id, SaHpiResetActionT act); /********************************** * INJECTOR ABIs - OpenHPI specific **********************************/ /*** * oHpiInjectEvent **/ SaErrorT (*inject_event)(void *hnd, SaHpiEventT *event, SaHpiRptEntryT *rpte, SaHpiRdrT *rdr); }; #ifdef __cplusplus } #endif /* Macors for use in handlers to walk a single linked list such as * eventq */ #define g_slist_for_each(pos, head) \ for (pos = head; pos != NULL; pos = g_slist_next(pos)) #define g_slist_for_each_safe(pos, pos1, head) \ for (pos = head, pos1 = g_slist_next(pos); pos; pos = pos1, pos1 = g_slist_next(pos1)) #endif/*__OH_HANDLER_H*/ openhpi-3.6.1/include/SaHpiBladeCenter.h0000644000175100017510000000272512575647300017063 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #ifndef __SAHPIBLADECENTER_H #define __SAHPIBLADECENTER_H /* Slot Entity Path Numbers */ #define BLADECENTER_SWITCH_SLOT SAHPI_ENT_CHASSIS_SPECIFIC + 0x10 #define BLADECENTER_POWER_SUPPLY_SLOT SAHPI_ENT_CHASSIS_SPECIFIC + 0x11 #define BLADECENTER_PERIPHERAL_BAY_SLOT SAHPI_ENT_CHASSIS_SPECIFIC + 0x12 #define BLADECENTER_SYS_MGMNT_MODULE_SLOT SAHPI_ENT_CHASSIS_SPECIFIC + 0x13 #define BLADECENTER_BLOWER_SLOT SAHPI_ENT_CHASSIS_SPECIFIC + 0x14 #define BLADECENTER_ALARM_PANEL_SLOT SAHPI_ENT_CHASSIS_SPECIFIC + 0x15 #define BLADECENTER_MUX_SLOT SAHPI_ENT_CHASSIS_SPECIFIC + 0x16 #define BLADECENTER_CLOCK_SLOT SAHPI_ENT_CHASSIS_SPECIFIC + 0x17 /* Slot Sensor Numbers */ #define BLADECENTER_SENSOR_NUM_SLOT_STATE (SaHpiSensorNumT) 0x1010 #define BLADECENTER_SENSOR_NUM_MAX_POWER (SaHpiSensorNumT) 0x1012 #define BLADECENTER_SENSOR_NUM_ASSIGNED_POWER (SaHpiSensorNumT) 0x1011 #define BLADECENTER_SENSOR_NUM_MIN_POWER (SaHpiSensorNumT) 0x1013 #endif openhpi-3.6.1/include/oh_session.h0000644000175100017510000000477312575647300016144 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * */ #ifndef __OH_SESSION_H #define __OH_SESSION_H #include #include #include #ifdef __cplusplus extern "C" { #endif /* * Global table of all active sessions (oh_session). This table is * populated and depopulated by calls to saHpiSessionOpen() and * saHpiSessionClose(). The table has been encapsulated to have a lock * alongside of it. */ struct oh_session_table { GHashTable *table; GSList *list; #if GLIB_CHECK_VERSION (2, 32, 0) GRecMutex lock; #else GStaticRecMutex lock; #endif }; extern struct oh_session_table oh_sessions; /* * Representation of an HPI session */ struct oh_session { /* Session ID as returned by saHpiSessionOpen() */ SaHpiSessionIdT id; /* A session is always associated with exactly one domain */ SaHpiDomainIdT did; SaHpiBoolT subscribed; /* Initialized to false. Will be set to true*/ SaHpiEvtQueueStatusT eventq_status; /* Even if multiple sessions are opened for the same domain, each session could receive different events depending on what events the caller signs up for. This is the session specific event queue */ GAsyncQueue *eventq; }; SaHpiSessionIdT oh_create_session(SaHpiDomainIdT did); SaHpiDomainIdT oh_get_session_domain(SaHpiSessionIdT sid); GArray *oh_list_sessions(SaHpiDomainIdT did); SaErrorT oh_get_session_subscription(SaHpiSessionIdT sid, SaHpiBoolT *state); SaErrorT oh_set_session_subscription(SaHpiSessionIdT sid, SaHpiBoolT state); SaErrorT oh_queue_session_event(SaHpiSessionIdT sid, struct oh_event *event); SaErrorT oh_dequeue_session_event(SaHpiSessionIdT sid, SaHpiTimeoutT timeout, struct oh_event *event, SaHpiEvtQueueStatusT *eventq_status); SaErrorT oh_destroy_session(SaHpiSessionIdT sid); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* __OH_SESSION_H */ openhpi-3.6.1/include/SaHpiXtca.h0000644000175100017510000005354012575647300015613 0ustar mohanmohan/******************************************************************************* ** ** FILE: ** SaHpiXtca.h ** ** DESCRIPTION: ** This file provides the C language binding for the Service ** Availability(TM) Forum HPI to AdvancedTCA(R) and MicroTCA(R) ** Mapping. ** It contains all of the required prototypes and type definitions. ** This file was generated from the Mapping Specification document. ** ** SPECIFICATION VERSION: ** SAIM-HPI-B.03.02-xTCA ** ** DATE: ** Sat Oct 31 2009 ** ** LEGAL: ** OWNERSHIP OF SPECIFICATION AND COPYRIGHTS. ** ** Copyright(c) 2009, Service Availability(TM) Forum. All rights reserved. ** ** Permission to use, copy, modify, and distribute this software for any ** purpose without fee is hereby granted, provided that this entire notice ** is included in all copies of any software which is or includes a copy ** or modification of this software and in all copies of the supporting ** documentation for such software. ** ** THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED ** WARRANTY. IN PARTICULAR, THE SERVICE AVAILABILITY FORUM DOES NOT MAKE ANY ** REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY ** OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. ** *******************************************************************************/ #ifndef __SAHPI_xTCA_H #define __SAHPI_xTCA_H /* * SaHpi.h contains the basic data types that are used in this section, * e.g., SaHpiCtrlNumT. */ #include /******************************************************************************* * Basic Data Types and Values *******************************************************************************/ #ifdef __cplusplus extern "C" { #endif /* Specification version */ #define XTCAHPI_SPEC_VERSION "SAIM-HPI-B.03.02.XTCA" /* PICMG manufacturer identifier */ #define XTCAHPI_PICMG_MID 0x00315A /******************************************************************************* * Entities *******************************************************************************/ /* * Common Entity Definitions * These definitions describe the ATCA and MicroTCA Entity Types defined * in this specification. * * XTCAHPI_ENT_POWER_SLOT - ATCA Power Entry Module Slot/ * MicroTCA Power Module Slot * XTCAHPI_ENT_SHELF_FRU_DEVICE_SLOT - ATCA Shelf FRU information device Slot * XTCAHPI_ENT_SHELF_MANAGER_SLOT - Dedicated Shelf Manager Slot * XTCAHPI_ENT_FAN_TRAY_SLOT - Fan Tray Slot/Cooling Unit Slot * XTCAHPI_ENT_FAN_FILTER_TRAY_SLOT - Fan Tray Filter Slot * XTCAHPI_ENT_ALARM_SLOT - Alarm Module Slot * XTCAHPI_ENT_AMC_SLOT - ATCA AMC Slot * XTCAHPI_ENT_PMC_SLOT - PMC Module Slot * XTCAHPI_ENT_RTM_SLOT - Rear Transition Module Slot * XTCAHPI_ENT_CARRIER_MANAGER_SLOT - MicroTCA MCH Slot * XTCAHPI_ENT_CARRIER_ SLOT - MicroTCA Carrier Slot * XTCAHPI_ENT_COM_E_SLOT - COM-E Module Slot * */ #define XTCAHPI_ENT_POWER_SLOT \ ((SaHpiEntityTypeT)(SAHPI_ENT_CHASSIS_SPECIFIC + 1)) #define XTCAHPI_ENT_SHELF_FRU_DEVICE_SLOT \ ((SaHpiEntityTypeT)(SAHPI_ENT_CHASSIS_SPECIFIC + 2)) #define XTCAHPI_ENT_SHELF_MANAGER_SLOT \ ((SaHpiEntityTypeT)(SAHPI_ENT_CHASSIS_SPECIFIC + 3)) #define XTCAHPI_ENT_FAN_TRAY_SLOT \ ((SaHpiEntityTypeT)(SAHPI_ENT_CHASSIS_SPECIFIC + 4)) #define XTCAHPI_ENT_FAN_FILTER_TRAY_SLOT \ ((SaHpiEntityTypeT)(SAHPI_ENT_CHASSIS_SPECIFIC + 5)) #define XTCAHPI_ENT_ALARM_SLOT \ ((SaHpiEntityTypeT)(SAHPI_ENT_CHASSIS_SPECIFIC + 6)) #define XTCAHPI_ENT_AMC_SLOT \ ((SaHpiEntityTypeT)(SAHPI_ENT_CHASSIS_SPECIFIC + 7)) #define XTCAHPI_ENT_PMC_SLOT \ ((SaHpiEntityTypeT)(SAHPI_ENT_CHASSIS_SPECIFIC + 8)) #define XTCAHPI_ENT_RTM_SLOT \ ((SaHpiEntityTypeT)(SAHPI_ENT_CHASSIS_SPECIFIC + 9)) #define XTCAHPI_ENT_CARRIER_MANAGER_SLOT \ ((SaHpiEntityTypeT)(SAHPI_ENT_CHASSIS_SPECIFIC + 0xA)) #define XTCAHPI_ENT_CARRIER_SLOT \ ((SaHpiEntityTypeT)(SAHPI_ENT_CHASSIS_SPECIFIC + 0xB)) #define XTCAHPI_ENT_COM_E_SLOT \ ((SaHpiEntityTypeT)(SAHPI_ENT_CHASSIS_SPECIFIC + 0xC)) /******************************************************************************* * Common Management Instruments *******************************************************************************/ /* * Instrument numbers for: * IP Address 0 Control * IP Address 1 Control * Power On Sequence Controls * - Note that the Control numbers from * XTCAHPI_CTRL_NUM_POWER_ON_SEQUENCE to * XTCAHPI_CTRL_NUM_POWER_ON_SEQUENCE + FEh * are reserved for Power On Sequence Controls. * * Power On Sequence Commit Control * Power On Sequence Commit Status Sensor * Telco Alarm Annunciator * Redundancy Sensor * Active Instance Sensor * Standby Instance Sensor * Failover Control * Slot State Sensor * Activation Control * Deactivation Control * FRU Info Valid Sensor * Assigned Power Sensors * - Note that the Sensor numbers from * XTCAHPI_SENSOR_NUM_SLOT_ASSIGNED_PWR to * XTCAHPI_SENSOR_NUM_SLOT_ASSIGNED_PWR + FEh * are reserved for Assigned Power Sensors. * */ #define XTCAHPI_CTRL_NUM_IP_ADDRESS_0 ((SaHpiCtrlNumT)0x1001) #define XTCAHPI_CTRL_NUM_IP_ADDRESS_1 ((SaHpiCtrlNumT)0x1003) #define XTCAHPI_CTRL_NUM_POWER_ON_SEQUENCE ((SaHpiCtrlNumT)0x1301) #define XTCAHPI_CTRL_NUM_POWER_ON_SEQUENCE_COMMIT ((SaHpiCtrlNumT)0x1300) #define XTCAHPI_SENSOR_NUM_PWRONSEQ_COMMIT_STATUS ((SaHpiSensorNumT)0x1300) #define XTCAHPI_ANN_NUM_TELCO_ALARM ((SaHpiAnnunciatorNumT)0x1000) #define XTCAHPI_SENSOR_NUM_REDUNDANCY ((SaHpiSensorNumT)0x1001) #define XTCAHPI_SENSOR_NUM_ACTIVE ((SaHpiSensorNumT)0x1002) #define XTCAHPI_SENSOR_NUM_STANDBY ((SaHpiSensorNumT)0x1003) #define XTCAHPI_CTRL_NUM_FAILOVER ((SaHpiCtrlNumT)0x1010) #define XTCAHPI_CTRL_NUM_ACTIVATION ((SaHpiCtrlNumT)0x1020) #define XTCAHPI_CTRL_NUM_DEACTIVATION ((SaHpiCtrlNumT)0x1021) #define XTCAHPI_SENSOR_NUM_FRU_INFO_VALID ((SaHpiSensorNumT)0x1000) /* * Instrument numbers for: * ATCA Assigned Power Sensor in Slot Resource */ #define XTCAHPI_SENSOR_NUM_ASSIGNED_PWR ((SaHpiSensorNumT)0x1011) /* * Instrument numbers for: * ATCA Assigned Power Sensors in Containing entity Resource */ #define XTCAHPI_SENSOR_NUM_SLOT_ASSIGNED_PWR ((SaHpiSensorNumT)0x1800) /******************************************************************************* * Shelf Resource Instruments *******************************************************************************/ /* * Instrument numbers for: * Shelf Configuration Information IDR * Shelf Address Control * Chassis Status Control */ #define XTCAHPI_IDR_NUM_CONFIG_INFO ((SaHpiIdrIdT)0x0001) #define XTCAHPI_CTRL_NUM_SHELF_ADDRESS ((SaHpiCtrlNumT)0x1000) #define XTCAHPI_CTRL_NUM_SHELF_STATUS ((SaHpiCtrlNumT)0x1002) /******************************************************************************* * MicroTCA Carrier Resource Instruments *******************************************************************************/ /* * Instrument numbers for: * Shelf Manager RMCP Username Control * Shelf Manager RMCP Password Control */ #define XTCAHPI_CTRL_NUM_SHELF_MANAGER_RMCP_USERNAME ((SaHpiCtrlNumT)0x1051) #define XTCAHPI_CTRL_NUM_SHELF_MANAGER_RMCP_PASSWORD ((SaHpiCtrlNumT)0x1052) /******************************************************************************* * MicroTCA Module Slot Instruments *******************************************************************************/ /* * Instrument numbers for: * In-Shelf Module Activation Control * In-Shelf Module Dectivation Control */ #define XTCAHPI_CTRL_NUM_IN_SHELF_ACTIVATION ((SaHpiCtrlNumT)0x1060) #define XTCAHPI_CTRL_NUM_IN_SHELF_DEACTIVATION ((SaHpiCtrlNumT)0x1061) /******************************************************************************* * FRU/Module Resource Instruments *******************************************************************************/ /* * Instrument numbers for: * Desired Power Control * IPMB0 Sensor * - Note that the Sensor numbers from XTCAHPI_SENSOR_NUM_IPMB0 to * XTCAHPI_SENSOR_NUM_IPMB0 + 0x5F (0x1100-0x115F) are reserved for * systems supporting a radial IPMB requiring multiple IPMB0 Sensors. * * IPMI A/B State Control * - Note that the Control numbers from XTCAHPI_CTRL_NUM_IPMB_A_STATE to * XTCAHPI_CTRL_NUM_IPMB_B_STATE + 2*0x5F (0x1101-0x11C0) are reserved * for systems supporting a radial IPMB requiring multiple IPMB0 controls * * FRU Reset and Diagnostics Control * FRU IPM Controller Reset Control * LED Controls * - Note that Control numbers from XTCAHPI_CTRL_NUM_APP_LED * to XTCAHPI_CTRL_NUM_APP_LED + 0xFA * are reserved for Application Specific LED Controls. * * AMC Power On Sequence Control * - Note that the Control numbers from XTCAHPI_CTRL_NUM_AMC_POWER_ON_SEQUENCE * to XTCAHPI_CTRL_NUM_AMC_POWER_ON_SEQUENCE + Fh * are reserved for AMC Power On Sequence Controls. * * AMC Power On Sequence Commit Control * AMC Power On Sequence Commit Status Sensor * Fan Speed Control * HPM.1 Global IPMC Upgrade Capabilities Sensor * HPM.1 Upgrade Image Capabilities Sensor * HPM.1 Rollback Timeout Period Sensor */ #define XTCAHPI_CTRL_NUM_DESIRED_PWR ((SaHpiCtrlNumT)0x1030) #define XTCAHPI_SENSOR_NUM_IPMB0 ((SaHpiSensorNumT)0x1100) #define XTCAHPI_CTRL_NUM_IPMB_A_STATE ((SaHpiCtrlNumT)0x1101) #define XTCAHPI_CTRL_NUM_IPMB_B_STATE ((SaHpiCtrlNumT)0x1102) #define XTCAHPI_CTRL_NUM_FRU_CONTROL ((SaHpiCtrlNumT)0x1200) #define XTCAHPI_CTRL_NUM_FRU_IPMC_RESET ((SaHpiCtrlNumT)0x1201) #define XTCAHPI_CTRL_NUM_BLUE_LED ((SaHpiCtrlNumT)0x00) #define XTCAHPI_CTRL_NUM_LED1 ((SaHpiCtrlNumT)0x01) #define XTCAHPI_CTRL_NUM_LED2 ((SaHpiCtrlNumT)0x02) #define XTCAHPI_CTRL_NUM_LED3 ((SaHpiCtrlNumT)0x03) #define XTCAHPI_CTRL_NUM_APP_LED ((SaHpiCtrlNumT)0x04) #define XTCAHPI_RESOURCE_AGGREGATE_LED ((SaHpiCtrlNumT)0xFF) #define XTCAHPI_CTRL_NUM_AMC_POWER_ON_SEQUENCE ((SaHpiCtrlNumT)0x1501) #define XTCAHPI_CTRL_NUM_AMC_POWER_ON_SEQUENCE_COMMIT ((SaHpiCtrlNumT)0x1500) #define XTCAHPI_SENSOR_NUM_AMC_PWRONSEQ_COMMIT_STATUS ((SaHpiSensorNumT)0x1500) #define XTCAHPI_CTRL_NUM_FAN_SPEED ((SaHpiCtrlNumT)0x1400) #define XTCAHPI_SENSOR_NUM_HPM1_IPMC_GLOBAL_CAPS ((SaHpiSensorNumT)0x1700) #define XTCAHPI_SENSOR_NUM_HPM1_IMAGE_CAPS ((SaHpiSensorNumT)0x1701) #define XTCAHPI_SENSOR_NUM_HPM1_ROLLBACK_TIMEOUT ((SaHpiSensorNumT)0x1702) /******************************************************************************* * Virtual Telco Alarm Resource Instruments *******************************************************************************/ /* * Instrument numbers for: * Minor Telco Alarm Control * Major Telco Alarm Control * Critical Telco Alarm Control * Power Telco Alarm Control * Telco Alarm Cutoff Control * Telco Alarm Input Sensor */ #define XTCAHPI_CTRL_NUM_CRITICAL_TELCO_ALARM ((SaHpiCtrlNumT)0x1600) #define XTCAHPI_CTRL_NUM_MAJOR_TELCO_ALARM ((SaHpiCtrlNumT)0x1601) #define XTCAHPI_CTRL_NUM_MINOR_TELCO_ALARM ((SaHpiCtrlNumT)0x1602) #define XTCAHPI_CTRL_NUM_POWER_TELCO_ALARM ((SaHpiCtrlNumT)0x1603) #define XTCAHPI_CTRL_NUM_TELCO_ALARM_CUTOFF ((SaHpiCtrlNumT)0x1604) #define XTCAHPI_SENSOR_NUM_TELCO_ALARM_INPUT ((SaHpiSensorNumT)0x1600) /* * Telco Alarm Control Entity Locations. * These entity location values are used for Telco Alarm Controls. */ #define XTCAHPI_INDICATOR_LOC_MINOR_ALARM ((SaHpiEntityLocationT)0x0000) #define XTCAHPI_INDICATOR_LOC_MAJOR_ALARM ((SaHpiEntityLocationT)0x0001) #define XTCAHPI_INDICATOR_LOC_CRITICAL_ALARM ((SaHpiEntityLocationT)0x0002) #define XTCAHPI_INDICATOR_LOC_POWER_ALARM ((SaHpiEntityLocationT)0x0003) /******************************************************************************* * Shelf Configuration Information IDR Data Types *******************************************************************************/ /* * Shelf Configuration Information IDR Area and Field IDs. */ #define XTCAHPI_CONFIG_DATA_AREA_SPEC_VERSION ((SaHpiEntryIdT)0x0000) #define XTCAHPI_CONFIG_DATA_FIELD_LABEL ((SaHpiEntryIdT)0x0000) /******************************************************************************* * Chassis Status Control Data Types *******************************************************************************/ /* Bitmask for Current Power State */ /* Maps to OEM Control state byte [2] for the Chassis Status Control */ typedef SaHpiUint8T XtcaHpiCsCurrentPwrState; /* If bit is set, powered on, powered off otherwise */ #define XTCAHPI_CS_CPS_PWR_ON ((XtcaHpiCsCurrentPwrState) 0x01) /* If bit is set, chassis shut down due to power overload */ #define XTCAHPI_CS_CPS_PWR_OVERLOAD ((XtcaHpiCsCurrentPwrState) 0x02) /* If bit is set, chassis shut down due to interlock switch being active */ #define XTCAHPI_CS_CPS_INTERLOCK ((XtcaHpiCsCurrentPwrState) 0x04) /* If bit is set, fault detected in main power subsystem */ #define XTCAHPI_CS_CPS_PWR_FAULT ((XtcaHpiCsCurrentPwrState) 0x08) /* If bit is set, fault in power Control to power up/down */ #define XTCAHPI_CS_CPS_PWR_CTRL_FAULT ((XtcaHpiCsCurrentPwrState) 0x10) /* If bit is set, after power restoration, chassis is restored to the state it was in, else chassis stays powered off after power restoration */ #define XTCAHPI_CS_CPS_PWR_RESTORE_PWR_UP_PREV ((XtcaHpiCsCurrentPwrState) 0x20) /* If bit is set, chassis powers up after power restoration */ #define XTCAHPI_CS_CPS_PWR_RESTORE_PWR_UP ((XtcaHpiCsCurrentPwrState) 0x40) /* If bits are set, unknown */ #define XTCAHPI_CS_CPS_PWR_RESTORE_UNKNOWN ((XtcaHpiCsCurrentPwrState) 0x60) /* Bitmask for Last Power Event */ /* maps to OEM Control state byte [3] for the Chassis Status Control */ typedef SaHpiUint8T XtcaHpiCsLastPwrEvent; /* If bit is set, AC failed */ #define XTCAHPI_CS_LPEVT_AC_FAILED ((XtcaHpiCsLastPwrEvent) 0x01) /* If bit is set, last power down caused by a Power overload */ #define XTCAHPI_CS_LPEVT_PWR_OVERLOAD ((XtcaHpiCsLastPwrEvent) 0x02) /* If bit is set, last power down caused by a power interlock being activated */ #define XTCAHPI_CS_LPEVT_PWR_INTERLOCK ((XtcaHpiCsLastPwrEvent) 0x04) /* If bit is set, last power down caused by power fault */ #define XTCAHPI_CS_LPEVT_PWR_FAULT ((XtcaHpiCsLastPwrEvent) 0x08) /* If bit is set, last 'Power is on' state was entered via IPMI command */ #define XTCAHPI_CS_LPEVT_PWRON_IPMI ((XtcaHpiCsLastPwrEvent) 0x10) /* Bitmask for Miscellaneous Chassis State */ /* maps to OEM Control state byte [4] for the Chassis Status Control */ typedef SaHpiUint8T XtcaHpiCsMiscChassisState; /* If bit is set, Chassis intrusion is active */ #define XTCAHPI_CS_MISC_CS_INTRUSION_ACTIVE ((XtcaHpiCsMiscChassisState) 0x01) /* If bit is set, Front Panel Lockout is active (power off and reset via chassis push-buttons disabled) */ #define XTCAHPI_CS_MISC_CS_FP_LOCKOUT_ACTIVE ((XtcaHpiCsMiscChassisState) 0x02) /* If bit is set, indicates Drive Fault */ #define XTCAHPI_CS_MISC_CS_DRIVE_FAULT ((XtcaHpiCsMiscChassisState) 0x04) /* If bit is set, Cooling/fan fault detected */ #define XTCAHPI_CS_MISC_CS_COOLING_FAULT ((XtcaHpiCsMiscChassisState) 0x08) /* Bitmask for Front Panel Button Capabilities and disable/enable status */ /* maps to OEM Control state byte [5] for the Chassis Status Control */ typedef SaHpiUint8T XtcaHpiCsFpButtonCap; /* If bit is set, power off button is disabled */ #define XTCAHPI_CS_FP_BUTTON_PWR_OFF ((XtcaHpiCsFpButtonCap) 0x01) /* If bit is set, reset button is disabled */ #define XTCAHPI_CS_FP_BUTTON_RESET_OFF ((XtcaHpiCsFpButtonCap) 0x02) /* If bit is set, diagnostic interrupt button is disabled */ #define XTCAHPI_CS_FP_BUTTON_DIAGINTR_OFF ((XtcaHpiCsFpButtonCap) 0x04) /* If bit is set, standby button is disabled */ #define XTCAHPI_CS_FP_BUTTON_STANDBY_OFF ((XtcaHpiCsFpButtonCap) 0x08) /* If bit is set, power off button disable is allowed */ #define XTCAHPI_CS_FP_BUTTON_ALLOW_PWR_OFF ((XtcaHpiCsFpButtonCap) 0x10) /* If bit is set, reset button disable is allowed */ #define XTCAHPI_CS_FP_BUTTON_ALLOW_RESET_OFF ((XtcaHpiCsFpButtonCap) 0x20) /* If bit is set, diagnostic interrupt button disable is allowed */ #define XTCAHPI_CS_FP_BUTTON_ALLOW_DIAGINTR_OFF ((XtcaHpiCsFpButtonCap) 0x40) /* If bit is set, standby button disable is allowed */ #define XTCAHPI_CS_FP_BUTTON_ALLOW_STANDBY_OFF ((XtcaHpiCsFpButtonCap) 0x80) /******************************************************************************* * xTCA LED Common Data Types *******************************************************************************/ /* * Color Capabilities * * This defines the possible color capabilities for an individual LED. * One LED may support any number of colors using the bit mask. * * XTCAHPI_LED_WHITE * - Indicates that the LED supports illumination in WHITE. * XTCAHPI_LED_ORANGE * - Indicates that the LED supports illumination in ORANGE. * XTCAHPI_LED_AMBER * - Indicates that the LED supports illumination in AMBER. * XTCAHPI_LED_GREEN * - Indicates that the LED supports illumination in GREEN. * XTCAHPI_LED_RED * - Indicates that the LED supports illumination in RED. * XTCAHPI_LED_BLUE * - Indicates that the LED supports illumination in BLUE. * */ typedef SaHpiUint8T XtcaHpiColorCapabilitiesT; #define XTCAHPI_BLINK_COLOR_LED ((XtcaHpiColorCapabilitiesT)0x80) #define XTCAHPI_LED_WHITE ((XtcaHpiColorCapabilitiesT)0x40) #define XTCAHPI_LED_ORANGE ((XtcaHpiColorCapabilitiesT)0x20) #define XTCAHPI_LED_AMBER ((XtcaHpiColorCapabilitiesT)0x10) #define XTCAHPI_LED_GREEN ((XtcaHpiColorCapabilitiesT)0x08) #define XTCAHPI_LED_RED ((XtcaHpiColorCapabilitiesT)0x04) #define XTCAHPI_LED_BLUE ((XtcaHpiColorCapabilitiesT)0x02) typedef enum { XTCAHPI_LED_COLOR_RESERVED = 0, XTCAHPI_LED_COLOR_BLUE, XTCAHPI_LED_COLOR_RED, XTCAHPI_LED_COLOR_GREEN, XTCAHPI_LED_COLOR_AMBER, XTCAHPI_LED_COLOR_ORANGE, XTCAHPI_LED_COLOR_WHITE, XTCAHPI_LED_COLOR_NO_CHANGE = 0x0E, XTCAHPI_LED_COLOR_USE_DEFAULT = 0x0F } XtcaHpiLedColorT; typedef enum { XTCAHPI_LED_AUTO, /* Set all LEDs under this Resource to Auto mode */ XTCAHPI_LED_MANUAL, /* Set all LEDs under this Resource to Manual mode */ XTCAHPI_LED_LAMP_TEST /* Put all LEDs under this Resource in Lamp Test */ } XtcaHpiResourceLedModeT; typedef enum { XTCAHPI_LED_BR_SUPPORTED, /* Blinking Rates are Supported */ XTCAHPI_LED_BR_NOT_SUPPORTED, /* Blinking Rates are Not Supported */ XTCAHPI_LED_BR_UNKNOWN, /* The HPI implementation cannot determine whether or not Blinking Rates are supported. */ } XtcaHpiLedBrSupportT; /******************************************************************************* * Electronic Keying Data Types *******************************************************************************/ /* * Interface types for: * P2P Fabric links * Bused Clock links, Clock links * P2P Base links * P2P Update Channel links * Metallic Test Bus links * Ringing Generator Bus links */ #define XTCAHPI_IF_FABRIC ((SaHpiEntityLocationT)0x00001) #define XTCAHPI_IF_SYNC_CLOCK ((SaHpiEntityLocationT)0x00002) #define XTCAHPI_IF_BASE ((SaHpiEntityLocationT)0x00003) #define XTCAHPI_IF_UPDATE_CHANNEL ((SaHpiEntityLocationT)0x00004) #define XTCAHPI_IF_METALLIC_TEST ((SaHpiEntityLocationT)0x00005) #define XTCAHPI_IF_RINGING_GENERATOR_BUS ((SaHpiEntityLocationT)0x00006) /******************************************************************************* * ConfigData Entity Locations *******************************************************************************/ /* * ConfigData Entity Locations. * These entity location values are used for management instruments that are * defined with the SAHPI_ENT_CONFIG_DATA entity type to hold various items * of configuration information. */ #define XTCAHPI_CONFIG_DATA_LOC_DEFAULT ((SaHpiEntityLocationT)0x00) #define XTCAHPI_CONFIG_DATA_LOC_SHELF_ADDRESS ((SaHpiEntityLocationT)0x01) #define XTCAHPI_CONFIG_DATA_LOC_POWER_ON_SEQUENCE ((SaHpiEntityLocationT)0x02) #define XTCAHPI_CONFIG_DATA_LOC_CHASSIS_STATUS ((SaHpiEntityLocationT)0x03) #define XTCAHPI_CONFIG_DATA_LOC_ACTIVATION ((SaHpiEntityLocationT)0x04) #define XTCAHPI_CONFIG_DATA_LOC_DEACTIVATION ((SaHpiEntityLocationT)0x05) #define XTCAHPI_CONFIG_DATA_LOC_IN_SHELF_ACTIVATION ((SaHpiEntityLocationT)0x06) #define XTCAHPI_CONFIG_DATA_LOC_IN_SHELF_DEACTIVATION \ ((SaHpiEntityLocationT)0x07) #define XTCAHPI_CONFIG_DATA_LOC_USERNAME ((SaHpiEntityLocationT)0x08) #define XTCAHPI_CONFIG_DATA_LOC_PASSWORD ((SaHpiEntityLocationT)0x09) #define XTCAHPI_CONFIG_DATA_LOC_FUMI_GLOBAL_UPGRADE_CAP \ ((SaHpiEntityLocationT)0x0A) #define XTCAHPI_CONFIG_DATA_LOC_FUMI_UPGRADE_IMAGE_CAP \ ((SaHpiEntityLocationT)0x0B) #define XTCAHPI_CONFIG_DATA_LOC_FUMI_ROLLBACK_TIMEOUT \ ((SaHpiEntityLocationT)0x0C) #ifdef __cplusplus } #endif #endif /* __SAHPI_xTCA_H */ openhpi-3.6.1/include/oh_rpc_params.h0000644000175100017510000000352512575647300016602 0ustar mohanmohan/* -*- c++ -*- * * (C) Pigeon Point Systems. 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak * */ #ifndef __OH_RPC_PARAMS_H #define __OH_RPC_PARAMS_H /********************************************************************** * struct RpcParams * Just a convenient container to pointers array. * Used in Marshall Layer. *********************************************************************/ struct RpcParams { explicit RpcParams( void * p1 = 0, void * p2 = 0, void * p3 = 0, void * p4 = 0, void * p5 = 0, void * p6 = 0 ) { array[0] = p1; array[1] = p2; array[2] = p3; array[3] = p4; array[4] = p5; array[5] = p6; } union { void * array[6]; const void * const_array[6]; }; }; /********************************************************************** * struct ClientRpcParams * Just a convenient container to pointers array. * Allows to set in CTOR only p2-p6 * For p1 there is a separate function * Used in Marshall Layer. *********************************************************************/ struct ClientRpcParams : public RpcParams { explicit ClientRpcParams( void * p2 = 0, void * p3 = 0, void * p4 = 0, void * p5 = 0, void * p6 = 0 ) : RpcParams( 0, p2, p3, p4, p5, p6 ) { // empty } void SetFirst( void * p1 ) { array[0] = p1; } }; #endif /* __OH_RPC_PARAMS_H */ openhpi-3.6.1/include/SaHpiAtca.h0000644000175100017510000005123712575647300015565 0ustar mohanmohan/******************************************************************************* ** ** FILE: ** SaHpiAtca.h ** ** DESCRIPTION: ** This file provides the C language binding for the Service ** Availability(TM) Forum HPI-to-AdvancedTCA Mapping Specification. ** It contains all of the prototypes and type definitions. Note, this ** file was generated from the HPI-to-AdvancedTCA mapping specification ** document. ** ** SPECIFICATION VERSION: ** SAIM-HPI-B.01.01-ATCA ** ** DATE: ** Fri Nov 18 2005 010:11 ** ** LEGAL: ** OWNERSHIP OF SPECIFICATION AND COPYRIGHTS. ** The Specification and all worldwide copyrights therein are ** the exclusive property of Licensor. You may not remove, obscure, or ** alter any copyright or other proprietary rights notices that are in or ** on the copy of the Specification you download. You must reproduce all ** such notices on all copies of the Specification you make. Licensor ** may make changes to the Specification, or to items referenced therein, ** at any time without notice. Licensor is not obligated to support or ** update the Specification. ** ** Copyright 2004 by the Service Availability Forum. All rights reserved. ** ** Permission to use, copy, modify, and distribute this software for any ** purpose without fee is hereby granted, provided that this entire notice ** is included in all copies of any software which is or includes a copy ** or modification of this software and in all copies of the supporting ** documentation for such software. ** ** THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED ** WARRANTY. IN PARTICULAR, THE SERVICE AVAILABILITY FORUM DOES NOT MAKE ANY ** REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY ** OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. ** *******************************************************************************/ #ifndef __SAHPIATCA_H #define __SAHPIATCA_H /* * SaHpi.h contains the HPI data types that are used in this section */ #include "SaHpi.h" /*********************************************************************** ******** ************************************************************************ ******** ********** ********** ********** Basic Data Types and Values ********** ********** ********** ************************************************************************ ******** ************************************************************************ *******/ /* PICMG manufacturer identifier */ #define ATCAHPI_PICMG_MID 0x00315A /*********************************************************************** ******** ************************************************************************ ******** ********** ********** ********** LED Specific Data Types ********** ********** ********** ************************************************************************ ******** ************************************************************************ *******/ /* ** Color Capabilities ** ** This definition defines the possible color capabilities for an individual ** LED. One LED may support any number of colors using the bit mask. ** ** ATCAHPI_LED_WHITE ** Indicates that the LED supports illumination in WHITE. ** ATCAHPI_LED_ORANGE ** Indicates that the LED supports illumination in ORANGE. ** ATCAHPI_LED_AMBER ** Indicates that the LED supports illumination in AMBER. ** ATCAHPI_LED_GREEN ** Indicates that the LED supports illumination in GREEN. ** ATCAHPI_LED_RED ** Indicates that the LED supports illumination in RED. ** ATCAHPI_LED_BLUE ** Indicates that the LED supports illumination in BLUE. ** */ typedef SaHpiUint8T AtcaHpiColorCapabilitiesT; #define ATCAHPI_BLINK_COLOR_LED (AtcaHpiColorCapabilitiesT)0X80 #define ATCAHPI_LED_WHITE (AtcaHpiColorCapabilitiesT)0x40 #define ATCAHPI_LED_ORANGE (AtcaHpiColorCapabilitiesT)0x20 #define ATCAHPI_LED_AMBER (AtcaHpiColorCapabilitiesT)0x10 #define ATCAHPI_LED_GREEN (AtcaHpiColorCapabilitiesT)0x08 #define ATCAHPI_LED_RED (AtcaHpiColorCapabilitiesT)0x04 #define ATCAHPI_LED_BLUE (AtcaHpiColorCapabilitiesT)0x02 typedef enum { ATCAHPI_LED_COLOR_RESERVED = 0, ATCAHPI_LED_COLOR_BLUE, ATCAHPI_LED_COLOR_RED, ATCAHPI_LED_COLOR_GREEN, ATCAHPI_LED_COLOR_AMBER, ATCAHPI_LED_COLOR_ORANGE, ATCAHPI_LED_COLOR_WHITE, ATCAHPI_LED_COLOR_NO_CHANGE = 0x0E, ATCAHPI_LED_COLOR_USE_DEFAULT = 0x0F } AtcaHpiLedColorT; typedef enum { ATCAHPI_LED_AUTO, /*Set all LEDs under this Resource to Auto mode */ ATCAHPI_LED_MANUAL, /*Set all LEDs under this Resource to Manual mode*/ ATCAHPI_LED_LAMP_TEST /*Put all LEDs under this Resource in Lamp Test */ } AtcaHpiResourceLedModeT; typedef enum { ATCAHPI_LED_BR_SUPPORTED, /*Blinking Rates are Supported */ ATCAHPI_LED_BR_NOT_SUPPORTED, /*Blinking Rates are Not Supported */ ATCAHPI_LED_BR_UNKNOWN /*The HPI Implementation cannot determine whether or not Blinking Rates are supported. */ } AtcaHpiLedBrSupportT; /* * Control numbers for LED Controls. * Note: * 1. The Control numbers from ATCAHPI_CTRL_NUM_BLUE_LED to * ATCAHPI_CTRL_NUM_APP_LED + 0xFA are reserved for Application * Specific LED Controls. */ #define ATCAHPI_CTRL_NUM_BLUE_LED (SaHpiCtrlNumT)0x00 #define ATCAHPI_CTRL_NUM_LED1 (SaHpiCtrlNumT)0x01 #define ATCAHPI_CTRL_NUM_LED2 (SaHpiCtrlNumT)0x02 #define ATCAHPI_CTRL_NUM_LED3 (SaHpiCtrlNumT)0x03 #define ATCAHPI_CTRL_NUM_APP_LED (SaHpiCtrlNumT)0x04 /* * Indicator in the Resource level LED Control RDR that indicates * that this is a Control that aggregates all LEDs of a particular Resource. */ #define ATCAHPI_RESOURCE_AGGREGATE_LED 0xFF /*********************************************************************** ******** ************************************************************************ ******** ********** ********** ********** Entity Data Types ********** ********** ********** ************************************************************************ ******** ************************************************************************ *******/ /* ** ATCA Entity Definitions ** These definitions describe the ATCA specific Entity Types defined ** in this specification. ** Note that the entity types from, SAHPI_ENT_PHYSICAL_SLOT + 1 to ** SAHPI_ENT_PHYSICAL_SLOT + 20h and SAHPI_ENT_BATTERY + 1 to ** SAHPI_ENT_CHASSIS_SPECIFIC + Fh are reserved by this specification. ** ** ATCAHPI_ENT_POWER_ENTRY_MODULE_SLOT - Power Entry Module slot ** ATCAHPI_ENT_SHELF_FRU_DEVICE_SLOT - ATCA Shelf FRU information device slot ** ATCAHPI_ENT_SHELF_MANAGER_SLOT - Dedicated Shelf Managemer Slot ** ATCAHPI_ENT_FAN_TRAY_SLOT - Fan Tray slot ** ATCAHPI_ENT_FAN_FILTER_TRAY_SLOT - Fan Tray Filter slot ** ATCAHPI_ENT_ALARM_SLOT - Alarm Module slot ** ATCAHPI_ENT_AMC_SLOT - ATCA AMC card slot ** ATCAHPI_ENT_PMC_SLOT - PMC card slot ** ATCAHPI_ENT_RTM_SLOT - Rear Transition Module slot ** ** ATCAHPI_ENT_PICMG_FRONT_BLADE - ATCA Field Replaceable Front Board ** ATCAHPI_ENT_SHELF_FRU_DEVICE - ATCA Shelf FRU Information Device ** ATCAHPI_ENT_FILTRATION_UNIT - Air Filtration module ** ATCAHPI_ENT_AMC - ATCA AMC card ** */ typedef SaHpiEntityTypeT AtcaHpiEntityTypeT; #define ATCAHPI_ENT_POWER_ENTRY_MODULE_SLOT \ (AtcaHpiEntityTypeT)(SAHPI_ENT_CHASSIS_SPECIFIC + 1) #define ATCAHPI_ENT_SHELF_FRU_DEVICE_SLOT \ (AtcaHpiEntityTypeT)(SAHPI_ENT_CHASSIS_SPECIFIC + 2) #define ATCAHPI_ENT_SHELF_MANAGER_SLOT \ (AtcaHpiEntityTypeT)(SAHPI_ENT_CHASSIS_SPECIFIC + 3) #define ATCAHPI_ENT_FAN_TRAY_SLOT \ (AtcaHpiEntityTypeT)(SAHPI_ENT_CHASSIS_SPECIFIC + 4) #define ATCAHPI_ENT_FAN_FILTER_TRAY_SLOT \ (AtcaHpiEntityTypeT)(SAHPI_ENT_CHASSIS_SPECIFIC + 5) #define ATCAHPI_ENT_ALARM_SLOT \ (AtcaHpiEntityTypeT)(SAHPI_ENT_CHASSIS_SPECIFIC + 6) #define ATCAHPI_ENT_AMC_SLOT \ (AtcaHpiEntityTypeT)(SAHPI_ENT_CHASSIS_SPECIFIC + 7) #define ATCAHPI_ENT_PMC_SLOT \ (AtcaHpiEntityTypeT)(SAHPI_ENT_CHASSIS_SPECIFIC + 8) #define ATCAHPI_ENT_RTM_SLOT \ (AtcaHpiEntityTypeT)(SAHPI_ENT_CHASSIS_SPECIFIC + 9) #define ATCAHPI_ENT_PICMG_FRONT_BLADE \ (AtcaHpiEntityTypeT)(SAHPI_ENT_PHYSICAL_SLOT + 1) #define ATCAHPI_ENT_SHELF_FRU_DEVICE \ (AtcaHpiEntityTypeT)(SAHPI_ENT_PHYSICAL_SLOT + 2) #define ATCAHPI_ENT_FILTRATION_UNIT \ (AtcaHpiEntityTypeT)(SAHPI_ENT_PHYSICAL_SLOT + 3) #define ATCAHPI_ENT_AMC \ (AtcaHpiEntityTypeT)(SAHPI_ENT_PHYSICAL_SLOT + 4) /*********************************************************************** ******** ************************************************************************ ******** ********** ********** ********** Shelf Resource Data Types ********** ********** ********** ************************************************************************ ******** ************************************************************************ *******/ /* * Sensor/Control numbers for: * Shelf FRU Info Valid Sensor * Shelf Address Control * Shelf Manager IP Address Control * Chassis Status Control */ #define ATCAHPI_SENSOR_NUM_SHELF_INFO_VALID (SaHpiSensorNumT)0x1000 #define ATCAHPI_CTRL_NUM_SHELF_ADDRESS (SaHpiCtrlNumT)0x1000 #define ATCAHPI_CTRL_NUM_SHELF_IP_ADDRESS (SaHpiCtrlNumT)0x1001 #define ATCAHPI_CTRL_NUM_SHELF_STATUS (SaHpiCtrlNumT)0x1002 /* * Sensor/Control numbers for: * FRU Power On Sequence Control * Note that the Control numbers from ATCAHPI_CTRL_NUM_FRU_POWER_ON_SEQUENCE to * ATCAHPI_CTRL_NUM_FRU_POWER_ON_SEQUENCE + FEh are reserved for FRU Power On * Sequence Controls. */ #define ATCAHPI_SENSOR_NUM_PWRONSEQ_COMMIT_STATUS (SaHpiSensorNumT)0x1300 #define ATCAHPI_CTRL_NUM_FRU_POWER_ON_SEQUENCE_COMMIT (SaHpiCtrlNumT)0x1300 #define ATCAHPI_CTRL_NUM_FRU_POWER_ON_SEQUENCE (SaHpiCtrlNumT)0x1301 /* * Chassis Status Control */ /* Bitmask for Current Power State */ typedef SaHpiUint8T AtcaHpiCsCurrentPwrState; /* Maps to OEM Control state byte [2] for the Chassis Status Control */ #define ATCAHPI_CS_CPS_PWR_ON (AtcaHpiCsCurrentPwrState)0x01 /* If bit is set, powered on, powered off otherwise */ #define ATCAHPI_CS_CPS_PWR_OVERLOAD (AtcaHpiCsCurrentPwrState)0x02 /* If bit is set, chassis shut down due to power overload */ #define ATCAHPI_CS_CPS_INTERLOCK (AtcaHpiCsCurrentPwrState)0x04 /* If bit is set, chassis shut down due to interlock switch being active */ #define ATCAHPI_CS_CPS_PWR_FAULT (AtcaHpiCsCurrentPwrState)0x08 /* If bit is set, fault detected in main power subsystem */ #define ATCAHPI_CS_CPS__PWR_CTRL_FAULT (AtcaHpiCsCurrentPwrState)0x10 /* If bit is set, fault in power Control to power up/down */ #define ATCAHPI_CS_CPS_PWR_RESTORE_PWR_UP_PREV (AtcaHpiCsCurrentPwrState)0x20 /* If bit is set, after power restoration, chassis is restored to the state it was in, else chassis stays powered off after power restoration */ #define ATCAHPI_CS_CPS_PWR_RESTORE_PWR_UP (AtcaHpiCsCurrentPwrState)0x40 /* If bit is set, chassis powers up after power restoration */ #define ATCAHPI_CS_CPS_PWR_RESTORE_UNKNOWN (AtcaHpiCsCurrentPwrState)0x60 /* If bits are set, unknown */ /* Bitmask for Last Power Event */ typedef SaHpiUint8T AtcaHpiCsLastPwrEvent; /* maps to OEM Control state byte [3]for the Chassis Status Control */ #define ATCAHPI_CS_LPEVT_AC_FAILED (AtcaHpiCsLastPwrEvent)0x01 /* If bit is set, AC failed */ #define ATCAHPI_CS_LPEVT_PWR_OVERLOAD (AtcaHpiCsLastPwrEvent)0x02 /* If bit is set, last power down caused by a Power overload */ #define ATCAHPI_CS_LPEVT_PWR_INTERLOCK (AtcaHpiCsLastPwrEvent)0x04 /* If bit is set, last power down caused by a power interlock being activated */ #define ATCAHPI_CS_LPEVT_PWR_FAULT (AtcaHpiCsLastPwrEvent)0x08 /* If bit is set, last power down caused by power fault */ #define ATCAHPI_CS_LPEVT_PWRON_IPMI (AtcaHpiCsLastPwrEvent)0x10 /* If bit is set, last 'Power is on' state was entered via IPMI command */ /* Bitmask for Miscellaneous Chassis State */ typedef SaHpiUint8T AtcaHpiCsMiscChassisState; /* maps to OEM Control state byte [4] for the Chassis Status Control */ #define ATCAHPI_CS_MISC_CS_INTRUSION_ACTIVE (AtcaHpiCsMiscChassisState)0x01 /* If bit is set, Chassis intrusion is active */ #define ATCAHPI_CS_MISC_CS_FP_LOCKOUT_ACTIVE (AtcaHpiCsMiscChassisState)0x02 /* If bit is set, Front Panel Lockout is active (power off and reset via chassis push-buttons disabled) */ #define ATCAHPI_CS_MISC_CS_DRIVE_FAULT (AtcaHpiCsMiscChassisState)0x04 /* If bit is set, indicates Drive Fault */ #define ATCAHPI_CS_MISC_CS_COOLING_FAULT (AtcaHpiCsMiscChassisState)0x08 /* If bit is set, Cooling/fan fault detected */ /* Bitmask for Front Panel Button Capabilities and disable/enable status */ typedef SaHpiUint8T AtcaHpiCsFpButtonCap; /* maps to OEM Control state byte [5] for the Chassis Status Control */ #define ATCAHPI_CS_FP_BUTTON_PWR_OFF (AtcaHpiCsFpButtonCap)0x01 /* If bit is set, power off button is disabled */ #define ATCAHPI_CS_FP_BUTTON_RESET_OFF (AtcaHpiCsFpButtonCap)0x02 /* If bit is set, reset button is disabled */ #define ATCAHPI_CS_FP_BUTTON_DIAGINTR_OFF (AtcaHpiCsFpButtonCap)0x04 /* If bit is set, diagnostic interrupt button is disabled */ #define ATCAHPI_CS_FP_BUTTON_STANDBY_OFF (AtcaHpiCsFpButtonCap)0x08 /* If bit is set, standby button is disabled */ #define ATCAHPI_CS_FP_BUTTON_ALLOW_PWR_OFF (AtcaHpiCsFpButtonCap)0x10 /* If bit is set, power off button disable is allowed */ #define ATCAHPI_CS_FP_BUTTON_ALLOW_RESET_OFF (AtcaHpiCsFpButtonCap)0x20 /* If bit is set, reset button disable is allowed */ #define ATCAHPI_CS_FP_BUTTON_ALLOW_DIAGINTR_OFF (AtcaHpiCsFpButtonCap)0x40 /* If bit is set, diagnostic interrupt button disable is allowed */ #define ATCAHPI_CS_FP_BUTTON_ALLOW_STANDBY_OFF (AtcaHpiCsFpButtonCap)0x80 /* If bit is set, standby button disable is allowed */ /*********************************************************************** ******** ************************************************************************ ******** ********** ********** ********** Shelf Manager Resource Data Types ********** ********** ********** ************************************************************************ ******** ************************************************************************ *******/ /* * Sensor/Control numbers for: * Shelf Manager Failover Control * Shelf Manager Redundancy Sensor * Active Shelf Manager Sensor * Standby Shelf Manager Sensor */ #define ATCAHPI_SENSOR_NUM_SHMGR_REDUNDANCY (SaHpiSensorNumT)0x1001 #define ATCAHPI_SENSOR_NUM_SHMGR_ACTIVE (SaHpiSensorNumT)0x1002 #define ATCAHPI_SENSOR_NUM_SHMGR_STANDBY (SaHpiSensorNumT)0x1003 #define ATCAHPI_CTRL_NUM_SHMGR_FAILOVER (SaHpiCtrlNumT)0x1010 #define ATCAHPI_CTRL_NUM_FAILED_RESOURCE_EXTRACT (SaHpiCtrlNumT)0x101E /*********************************************************************** ******** ************************************************************************ ******** ********** ********** ********** FRU Slot Resource Data Types ********** ********** ********** ************************************************************************ ******** ************************************************************************ *******/ /* * Control/Sensor numbers for: * FRU Activation Control * Slot State Sensor * Assigned Power Sensor * Maximum Power Sensor */ #define ATCAHPI_SENSOR_NUM_SLOT_STATE (SaHpiSensorNumT)0x1010 #define ATCAHPI_SENSOR_NUM_ASSIGNED_PWR (SaHpiSensorNumT)0x1011 #define ATCAHPI_SENSOR_NUM_MAX_PWR (SaHpiSensorNumT)0x1012 #define ATCAHPI_CTRL_NUM_FRU_ACTIVATION (SaHpiCtrlNumT)0x1020 /*********************************************************************** ******** ************************************************************************ ******** ********** ********** ********** FRU Resource Data Types ********** ********** ********** ************************************************************************ ******** ************************************************************************ *******/ /* * Sensor/Control numbers for: * IPMB0 Sensor * - Note that the Sensor numbers from ATCAHPI_SENSOR_NUM_IPMB0 to * ATCAHPI_SENSOR_NUM_IPMB0 + 0x5F are reserved for systems supporting a * radial IPMB requiring multiple IPMB0 Sensors. * Desired Power Control * IPMI A/B State Control */ #define ATCAHPI_SENSOR_NUM_IPMB0 (SaHpiSensorNumT)0x1100 #define ATCAHPI_CTRL_NUM_DESIRED_PWR (SaHpiCtrlNumT)0x1030 #define ATCAHPI_CTRL_NUM_IPMB_A_STATE (SaHpiCtrlNumT)0x1101 #define ATCAHPI_CTRL_NUM_IPMB_B_STATE (SaHpiCtrlNumT)0x1102 /* * Control numbers for FRU Control and FRU IPM Controller reset. */ #define ATCAHPI_CTRL_NUM_FRU_CONTROL (SaHpiCtrlNumT)0x1200 #define ATCAHPI_CTRL_NUM_FRU_IPMC_RESET (SaHpiCtrlNumT)0x1201 /* * Sensor/Control numbers for: * AMC Power On Sequence Control * Note that the Control numbers from ATCAHPI_CTRL_NUM_AMC_POWER_ON_SEQUENCE to * ATCAHPI_CTRL_NUM_AMC_POWER_ON_SEQUENCE + Fh are reserved for AMC Power On * Sequence Controls. */ #define ATCAHPI_SENSOR_NUM_AMC_PWRONSEQ_COMMIT_STATUS (SaHpiSensorNumT)0x1500 #define ATCAHPI_CTRL_NUM_AMC_POWER_ON_SEQUENCE_COMMIT (SaHpiCtrlNumT)0x1500 #define ATCAHPI_CTRL_NUM_AMC_POWER_ON_SEQUENCE (SaHpiCtrlNumT)0x1501 /*********************************************************************** ******** ************************************************************************ ******** ********** ********** ********** Fan Control Data Types ********** ********** ********** ************************************************************************ ******** ************************************************************************ *******/ /* * Control number for fan speed. */ #define ATCAHPI_CTRL_NUM_FAN_SPEED (SaHpiCtrlNumT)0x1400 /*********************************************************************** ******** ************************************************************************ ******** ********** ********** ********** OEM Control Data Types ********** ********** ********** ************************************************************************ ******** ************************************************************************ *******/ /* * Well-known OEM values assigned to RDR entries for OEM Controls defined by * this document. */ #define ATCAHPI_PICMG_CT_CHASSIS_STATUS 0x0100315A #define ATCAHPI_PICMG_CT_ATCA_LED 0x0200315A #endif // __SAHPIATCA_H openhpi-3.6.1/include/oh_error.h0000644000175100017510000000347212575647300015605 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004-2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * */ #ifndef __OH_ERROR_H #define __OH_ERROR_H #include #ifdef OH_DBG_MSGS #include #define CRIT( fmt, ... ) \ g_critical( "%s:%d: " fmt, __FILE__, __LINE__,## __VA_ARGS__ ) #define WARN( fmt, ... ) \ g_warning( "%s:%d: " fmt, __FILE__, __LINE__,## __VA_ARGS__ ) #define MSG( fmt, ... ) \ g_message( "%s:%d: " fmt, __FILE__, __LINE__,## __VA_ARGS__ ) #define INFO( fmt, ... ) \ g_log (G_LOG_DOMAIN, G_LOG_LEVEL_INFO, \ "%s:%d: " fmt, __FILE__, __LINE__,## __VA_ARGS__ ) #define DBG( fmt, ... ) \ g_debug( "%s:%d: " fmt, __FILE__, __LINE__,## __VA_ARGS__ ) /****************************************************************** * Use CRIT, WARN, DBG macros intead of legacy err, warn, dbg ******************************************************************/ #define err( fmt, ... ) \ g_critical( "%s:%d: " fmt, __FILE__, __LINE__,## __VA_ARGS__ ) #define warn( fmt, ... ) \ g_warning( "%s:%d: " fmt, __FILE__, __LINE__,## __VA_ARGS__ ) #define dbg( fmt, ... ) \ g_debug( "%s:%d: " fmt, __FILE__, __LINE__,## __VA_ARGS__ ) #else /* OH_DBG_MSGS */ #define CRIT( fmt, ... ) #define WARN( fmt, ... ) #define MSG( fmt, ... ) #define INFO( fmt, ... ) #define DBG( fmt, ... ) #define err( fmt, ... ) #define warn( fmt, ... ) #define dbg( fmt, ... ) #endif /* OH_DBG_MSGS */ #endif /* __OH_ERROR_H */ openhpi-3.6.1/include/SaHpiOaSoap.h0000644000175100017510000003510212575647300016070 0ustar mohanmohan/* * Copyright (C) 2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. * Raghavendra M.S. */ #ifndef __SAHPIOASOAP_H #define __SAHPIOASOAP_H /* Sensor Numbers used in OA SOAP plugin * * On adding new sensor, the following data structures may require updation. * Please update accordingly. * 1. New sensor class in plugin/oa_soap/oa_soap_sensor.h * 2. Max sensor class in plugin/oa_soap/oa_soap_resources.h * 3. New sensor event assert state in plugin/oa_soap/oa_soap_sensor.h * 4. Max sensor event assert state mapping array in * plugin/oa_soap/oa_soap_resources.c * 5. Max sensor enum value mapping array in plugin/oa_soap/oa_soap_resources.c * 6. Global sensor array in plugin/oa_soap/oa_soap_resources.c * 7. Sensor event array in global sensor array in * plugin/oa_soap/oa_soap_resources.c * 8. Global sensor enum value mapping array in * plugin/oa_soap/oa_soap_resources.c * 9. Global sensor event assert state mapping array in * plugin/oa_soap/oa_soap_resources.c */ /* Operational status sensor */ #define OA_SOAP_SEN_OPER_STATUS (SaHpiSensorNumT) 0x000 /* Predictive faliure sensor */ #define OA_SOAP_SEN_PRED_FAIL (SaHpiSensorNumT) 0x001 /* Thermal reading sensor */ #define OA_SOAP_SEN_TEMP_STATUS (SaHpiSensorNumT) 0x002 /* Redundancy sensor */ #define OA_SOAP_SEN_REDUND (SaHpiSensorNumT) 0x003 /* Fan speed sensor */ #define OA_SOAP_SEN_FAN_SPEED (SaHpiSensorNumT) 0x004 /* Power reading sensor */ #define OA_SOAP_SEN_PWR_STATUS (SaHpiSensorNumT) 0x005 /* Internal data error sensor */ #define OA_SOAP_SEN_INT_DATA_ERR (SaHpiSensorNumT) 0x006 /* Management processor error sensor */ #define OA_SOAP_SEN_MP_ERR (SaHpiSensorNumT) 0x007 /* Power supply subsystem power input sensor */ #define OA_SOAP_SEN_IN_PWR (SaHpiSensorNumT) 0x008 /* Power supply subsystem power output sensor */ #define OA_SOAP_SEN_OUT_PWR (SaHpiSensorNumT) 0x009 /* Power supply subsystem power capacity sensor */ #define OA_SOAP_SEN_PWR_CAPACITY (SaHpiSensorNumT) 0x00a /* Thermal warning sensor */ #define OA_SOAP_SEN_THERM_WARN (SaHpiSensorNumT) 0x00b /* Thermal danger sensor */ #define OA_SOAP_SEN_THERM_DANGER (SaHpiSensorNumT) 0x00c /* IO configuration error sensor */ #define OA_SOAP_SEN_IO_CONFIG_ERR (SaHpiSensorNumT) 0x00d /* Device power request error sensor */ #define OA_SOAP_SEN_DEV_PWR_REQ (SaHpiSensorNumT) 0x00e /* Insufficient cooling error sensor */ #define OA_SOAP_SEN_INSUF_COOL (SaHpiSensorNumT) 0x00f /* Device location error sensor */ #define OA_SOAP_SEN_DEV_LOC_ERR (SaHpiSensorNumT) 0x010 /* Device failure sensor */ #define OA_SOAP_SEN_DEV_FAIL (SaHpiSensorNumT) 0x011 /* Device degraded sensor */ #define OA_SOAP_SEN_DEV_DEGRAD (SaHpiSensorNumT) 0x012 /* AC failure sensor */ #define OA_SOAP_SEN_AC_FAIL (SaHpiSensorNumT) 0x013 /* i2c buses sensor */ #define OA_SOAP_SEN_I2C_BUS (SaHpiSensorNumT) 0x014 /* Redundancy error sensor */ #define OA_SOAP_SEN_REDUND_ERR (SaHpiSensorNumT) 0x015 /* Enclosure aggregate operational status sensor */ #define OA_SOAP_SEN_ENC_AGR_OPER (SaHpiSensorNumT) 0x016 /* Enclosure aggregate predictive failure sensor */ #define OA_SOAP_SEN_ENC_AGR_PRED_FAIL (SaHpiSensorNumT) 0x017 /* Enclosure OA redundancy sensor */ #define OA_SOAP_SEN_OA_REDUND (SaHpiSensorNumT) 0x018 /* Enclosure OA link status sensor */ #define OA_SOAP_SEN_OA_LINK_STATUS (SaHpiSensorNumT) 0x019 /* Interconnect CPU fault sensor */ #define OA_SOAP_SEN_CPU_FAULT (SaHpiSensorNumT) 0x01a /* Interconnect health LED sensor */ #define OA_SOAP_SEN_HEALTH_LED (SaHpiSensorNumT) 0x01b /* Health status operational sensor */ #define OA_SOAP_SEN_HEALTH_OPER (SaHpiSensorNumT) 0x01c /* Health status predictive failure sensor */ #define OA_SOAP_SEN_HEALTH_PRED_FAIL (SaHpiSensorNumT) 0x01d /* Device missing sensor */ #define OA_SOAP_SEN_DEV_MISS (SaHpiSensorNumT) 0x01e /* Device power sequence sensor */ #define OA_SOAP_SEN_DEV_PWR_SEQ (SaHpiSensorNumT) 0x01f /* Device bonding sensor */ #define OA_SOAP_SEN_DEV_BOND (SaHpiSensorNumT) 0x020 /* Network configuration sensor */ #define OA_SOAP_SEN_NET_CONFIG (SaHpiSensorNumT) 0x021 /* Firmware mismatch */ #define OA_SOAP_SEN_FW_MISMATCH (SaHpiSensorNumT) 0x022 /* Profile unassigned error sensor */ #define OA_SOAP_SEN_PROF_UNASSIGN_ERR (SaHpiSensorNumT) 0x023 /* Device not supported sensor */ #define OA_SOAP_SEN_DEV_NOT_SUPPORT (SaHpiSensorNumT) 0x024 /* Too low power request sensor */ #define OA_SOAP_SEN_TOO_LOW_PWR_REQ (SaHpiSensorNumT) 0x025 /* Call HP sensor */ #define OA_SOAP_SEN_CALL_HP (SaHpiSensorNumT) 0x026 /* Device informational sensor */ #define OA_SOAP_SEN_DEV_INFO (SaHpiSensorNumT) 0x027 /* Storage device missing sensor */ #define OA_SOAP_SEN_STORAGE_DEV_MISS (SaHpiSensorNumT) 0x028 /* Enclosure ID mismatch sensor */ #define OA_SOAP_SEN_ENC_ID_MISMATCH (SaHpiSensorNumT) 0x029 /* Device mix match sensor */ #define OA_SOAP_SEN_DEV_MIX_MATCH (SaHpiSensorNumT) 0x02a /* Power capping error sensor */ #define OA_SOAP_SEN_GRPCAP_ERR (SaHpiSensorNumT) 0x02b /* IML recorded errors sensor */ #define OA_SOAP_SEN_IML_ERR (SaHpiSensorNumT) 0x02c /* Duplicate management IP address sensor */ #define OA_SOAP_SEN_DUP_MGMT_IP_ADDR (SaHpiSensorNumT) 0x02d /* Server Blade System zone1 */ #define OA_SOAP_SEN_BLADE_SYSTEM_ZONE1 (SaHpiSensorNumT) 0x02e /* Server Blade System zone2 */ #define OA_SOAP_SEN_BLADE_SYSTEM_ZONE2 (SaHpiSensorNumT) 0x02f /* Server Blade System zone3 */ #define OA_SOAP_SEN_BLADE_SYSTEM_ZONE3 (SaHpiSensorNumT) 0x030 /* Server Blade System zone4 */ #define OA_SOAP_SEN_BLADE_SYSTEM_ZONE4 (SaHpiSensorNumT) 0x031 /* Server Blade System zone5 */ #define OA_SOAP_SEN_BLADE_SYSTEM_ZONE5 (SaHpiSensorNumT) 0x032 /* Server Blade System zone6 */ #define OA_SOAP_SEN_BLADE_SYSTEM_ZONE6 (SaHpiSensorNumT) 0x033 /* Server Blade System zone7 */ #define OA_SOAP_SEN_BLADE_SYSTEM_ZONE7 (SaHpiSensorNumT) 0x034 /* Server Blade System zone8 */ #define OA_SOAP_SEN_BLADE_SYSTEM_ZONE8 (SaHpiSensorNumT) 0x035 /* Server Blade CPU zone1 */ #define OA_SOAP_SEN_BLADE_CPU_ZONE1 (SaHpiSensorNumT) 0x036 /* Server Blade CPU zone2 */ #define OA_SOAP_SEN_BLADE_CPU_ZONE2 (SaHpiSensorNumT) 0x037 /* Server Blade CPU zone3 */ #define OA_SOAP_SEN_BLADE_CPU_ZONE3 (SaHpiSensorNumT) 0x038 /* Server Blade CPU zone4 */ #define OA_SOAP_SEN_BLADE_CPU_ZONE4 (SaHpiSensorNumT) 0x039 /* Server Blade Memory zone1 */ #define OA_SOAP_SEN_BLADE_MEM_ZONE1 (SaHpiSensorNumT) 0x03a /* Server Blade Memory zone2 */ #define OA_SOAP_SEN_BLADE_MEM_ZONE2 (SaHpiSensorNumT) 0x03b /* Server Blade Memory zone3 */ #define OA_SOAP_SEN_BLADE_MEM_ZONE3 (SaHpiSensorNumT) 0x03c /* Server Blade Memory zone4 */ #define OA_SOAP_SEN_BLADE_MEM_ZONE4 (SaHpiSensorNumT) 0x03d /* Server Blade Memory zone5 */ #define OA_SOAP_SEN_BLADE_MEM_ZONE5 (SaHpiSensorNumT) 0x03e /* Server Blade Memory zone6 */ #define OA_SOAP_SEN_BLADE_MEM_ZONE6 (SaHpiSensorNumT) 0x03f /* Server Blade Memory zone7 */ #define OA_SOAP_SEN_BLADE_MEM_ZONE7 (SaHpiSensorNumT) 0x040 /* Server Blade Memory zone8 */ #define OA_SOAP_SEN_BLADE_MEM_ZONE8 (SaHpiSensorNumT) 0x041 /* Storage Blade Disk zone1 */ #define OA_SOAP_SEN_BLADE_DISK_ZONE1 (SaHpiSensorNumT) 0x042 /* Storage Blade Disk zone2 */ #define OA_SOAP_SEN_BLADE_DISK_ZONE2 (SaHpiSensorNumT) 0x043 /* Storage Blade Disk zone3 */ #define OA_SOAP_SEN_BLADE_DISK_ZONE3 (SaHpiSensorNumT) 0x044 /* Storage Blade Disk zone4 */ #define OA_SOAP_SEN_BLADE_DISK_ZONE4 (SaHpiSensorNumT) 0x045 /* Server Blade CPU1 */ #define OA_SOAP_SEN_BLADE_CPU1_1 (SaHpiSensorNumT) 0x046 /* Server Blade CPU1 */ #define OA_SOAP_SEN_BLADE_CPU1_2 (SaHpiSensorNumT) 0x047 /* Server Blade CPU1 */ #define OA_SOAP_SEN_BLADE_CPU1_3 (SaHpiSensorNumT) 0x048 /* Server Blade CPU1 */ #define OA_SOAP_SEN_BLADE_CPU1_4 (SaHpiSensorNumT) 0x049 /* Server Blade CPU2 */ #define OA_SOAP_SEN_BLADE_CPU2_1 (SaHpiSensorNumT) 0x04a /* Server Blade CPU2 */ #define OA_SOAP_SEN_BLADE_CPU2_2 (SaHpiSensorNumT) 0x04b /* Server Blade CPU2 */ #define OA_SOAP_SEN_BLADE_CPU2_3 (SaHpiSensorNumT) 0x04c /* Server Blade CPU2 */ #define OA_SOAP_SEN_BLADE_CPU2_4 (SaHpiSensorNumT) 0x04d /* Server Blade CPU3 */ #define OA_SOAP_SEN_BLADE_CPU3_1 (SaHpiSensorNumT) 0x04e /* Server Blade CPU3 */ #define OA_SOAP_SEN_BLADE_CPU3_2 (SaHpiSensorNumT) 0x04f /* Server Blade CPU3 */ #define OA_SOAP_SEN_BLADE_CPU3_3 (SaHpiSensorNumT) 0x050 /* Server Blade CPU3 */ #define OA_SOAP_SEN_BLADE_CPU3_4 (SaHpiSensorNumT) 0x051 /* Server Blade CPU4 */ #define OA_SOAP_SEN_BLADE_CPU4_1 (SaHpiSensorNumT) 0x052 /* Server Blade CPU4 */ #define OA_SOAP_SEN_BLADE_CPU4_2 (SaHpiSensorNumT) 0x053 /* Server Blade CPU4 */ #define OA_SOAP_SEN_BLADE_CPU4_3 (SaHpiSensorNumT) 0x054 /* Server Blade CPU4 */ #define OA_SOAP_SEN_BLADE_CPU4_4 (SaHpiSensorNumT) 0x055 /* Server Blade Storage zone1 */ #define OA_SOAP_SEN_BLADE_STORAGE_ZONE1 (SaHpiSensorNumT) 0x056 /* Server Blade Storage zone2 */ #define OA_SOAP_SEN_BLADE_STORAGE_ZONE2 (SaHpiSensorNumT) 0x057 /* Server Blade Storage zone3 */ #define OA_SOAP_SEN_BLADE_STORAGE_ZONE3 (SaHpiSensorNumT) 0x058 /* Server Blade Storage zone4 */ #define OA_SOAP_SEN_BLADE_STORAGE_ZONE4 (SaHpiSensorNumT) 0x059 /* Server Blade I/O Board zone1 */ #define OA_SOAP_SEN_BLADE_IO_BOARD_ZONE1 (SaHpiSensorNumT) 0x05a /* Server Blade I/O Board zone2 */ #define OA_SOAP_SEN_BLADE_IO_BOARD_ZONE2 (SaHpiSensorNumT) 0x05b /* Server Blade I/O Board zone3 */ #define OA_SOAP_SEN_BLADE_IO_BOARD_ZONE3 (SaHpiSensorNumT) 0x05c /* Server Blade I/O Board zone4 */ #define OA_SOAP_SEN_BLADE_IO_BOARD_ZONE4 (SaHpiSensorNumT) 0x05d /* Server Blade I/O Board zone5 */ #define OA_SOAP_SEN_BLADE_IO_BOARD_ZONE5 (SaHpiSensorNumT) 0x05e /* Server Blade I/O Board zone6 */ #define OA_SOAP_SEN_BLADE_IO_BOARD_ZONE6 (SaHpiSensorNumT) 0x05f /* Server Blade I/O Board zone7 */ #define OA_SOAP_SEN_BLADE_IO_BOARD_ZONE7 (SaHpiSensorNumT) 0x060 /* Server Blade I/O Board zone8 */ #define OA_SOAP_SEN_BLADE_IO_BOARD_ZONE8 (SaHpiSensorNumT) 0x061 /* Server Blade Power Supply zone1 */ #define OA_SOAP_SEN_BLADE_POWER_SUPPLY_ZONE1 (SaHpiSensorNumT) 0x062 /* Server Blade Power Supply zone2 */ #define OA_SOAP_SEN_BLADE_POWER_SUPPLY_ZONE2 (SaHpiSensorNumT) 0x063 /* Server Blade Power Supply zone3 */ #define OA_SOAP_SEN_BLADE_POWER_SUPPLY_ZONE3 (SaHpiSensorNumT) 0x064 /* Server Blade Power Supply zone4 */ #define OA_SOAP_SEN_BLADE_POWER_SUPPLY_ZONE4 (SaHpiSensorNumT) 0x065 /* Server Blade Power Supply zone5 */ #define OA_SOAP_SEN_BLADE_POWER_SUPPLY_ZONE5 (SaHpiSensorNumT) 0x066 /* Server Blade Power Supply zone6 */ #define OA_SOAP_SEN_BLADE_POWER_SUPPLY_ZONE6 (SaHpiSensorNumT) 0x067 /* Server Blade Power Supply zone7 */ #define OA_SOAP_SEN_BLADE_POWER_SUPPLY_ZONE7 (SaHpiSensorNumT) 0x068 /* Server Blade Power Supply zone8 */ #define OA_SOAP_SEN_BLADE_POWER_SUPPLY_ZONE8 (SaHpiSensorNumT) 0x069 /* Server Blade Chassis Zone zone 1*/ #define OA_SOAP_SEN_BLADE_CHASSIS_ZONE1 (SaHpiSensorNumT) 0x06a /* Server Blade Chassis Zone zone 2*/ #define OA_SOAP_SEN_BLADE_CHASSIS_ZONE2 (SaHpiSensorNumT) 0x06b /* Main Memory Errors sensor */ #define OA_SOAP_SEN_MAIN_MEMORY_ERRORS (SaHpiSensorNumT) 0x06c /* Control numbers used in OA SOAP plugin * On adding new control, control array in in plugin/oa_soap/oa_soap_resources.c * may require updation. */ /* UID control */ #define OA_SOAP_UID_CNTRL (SaHpiCtrlNumT) 0x000 /* Power control */ #define OA_SOAP_PWR_CNTRL (SaHpiCtrlNumT) 0x001 /* LCD Button Lock control */ #define OA_SOAP_LCD_BUTN_LCK_CNTRL (SaHpiCtrlNumT) 0x002 /* Power Mode Control */ #define OA_SOAP_PWR_MODE_CNTRL (SaHpiCtrlNumT) 0x003 /* Dynamic Power Control */ #define OA_SOAP_DYNAMIC_PWR_CNTRL (SaHpiCtrlNumT) 0x004 /* Power Limit Mode Control */ #define OA_SOAP_PWR_LIMIT_MODE_CNTRL (SaHpiCtrlNumT) 0x005 /* Static Power Limit Control */ #define OA_SOAP_STATIC_PWR_LIMIT_CNTRL (SaHpiCtrlNumT) 0x006 /* Dynamic Power Cap Control */ #define OA_SOAP_DYNAMIC_PWR_CAP_CNTRL (SaHpiCtrlNumT) 0x007 /* The following 2 controls are only available in OA Firmware */ /* version 3.00 and higher. */ /* Derated Circuit Cap Control */ #define OA_SOAP_DERATED_CIRCUIT_CAP_CNTRL (SaHpiCtrlNumT) 0x008 /* Rated Circuit Cap Control */ #define OA_SOAP_RATED_CIRCUIT_CAP_CNTRL (SaHpiCtrlNumT) 0x009 /* HP c7000 Power Modes */ #define C7000_PWR_NON_REDUNDANT 1 #define C7000_PWR_AC_REDUNDANT 2 #define C7000_PWR_SUPPLY_REDUNDANT 3 /* HP c7000 Power Limit Modes */ #define C7000_PWR_LIMIT_NONE 0 #define C7000_PWR_LIMIT_STATIC 1 #define C7000_PWR_LIMIT_DYNAMIC_CAP 2 /* Custom inventory Area and fields used in OA SOAP plugin * On adding new inventory area or field, fan zone mapping rray in in * plugin/oa_soap/oa_soap_resources.c may require updation. */ /* Fan Zone field type for storing the device bays */ #define OA_SOAP_INV_FZ_DEV_BAY (SaHpiIdrIdT) 0x100 /* Fan Zone field type for storing the fan bays */ #define OA_SOAP_INV_FZ_FAN_BAY (SaHpiIdrIdT) 0x101 /* Fan field type for storing the shared status */ #define OA_SOAP_INV_FAN_SHARED (SaHpiIdrIdT) 0x102 /* Fan field type for storing the Fan zone number */ #define OA_SOAP_INV_FZ_NUM (SaHpiIdrIdT) 0x103 #endif openhpi-3.6.1/Makefile.am0000644000175100017510000001764312575647301014234 0ustar mohanmohan# # Copyright (c) 2003, Intel Corporation # (C) Copyright IBM Corp 2003-2006 # All rights reserved. # # Redistribution and use in source and binary forms, with or # without modification, are permitted provided that the following # conditions are met: # # Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the distribution. # # Neither the name of Intel Corporation nor the names # of its contributors may be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, # OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # #AUTOMAKE_OPTIONS = 1.8 TARFILE = $(PACKAGE_NAME)-$(VERSION).tar.gz DESTDIR = RPM = @RPM@ RPMFLAGS = -ba EXTRA_DIST = openhpi.spec.in \ openhpi.conf.example \ simulation.data.example \ test_agent.data.example \ openhpiclient.conf.example \ README.csharp \ README.daemon \ README.java \ README.python \ README.windows \ Makefile.mingw32 \ Makefile.mingw32.def \ mingw32/config.h \ mingw32/openhpi.conf.example \ $(shell find $(srcdir)/include -name '*.h') AUTOMAKE_OPTIONS = foreign MAINTAINERCLEANFILES = Makefile.in aclocal.m4 configure config.guess config.sub \ depcomp install-sh ltmain.sh missing mkinstalldirs config.h.in \ stamp-h.in cscope.files cscope.out $(distdir).tar.gz compile MOSTLYCLEANFILES = tags SUBDIRS = utils scripts @SSLDIR@ @SNMPDIR@ transport marshal baselib @ENABLED_DIRS@ plugins docs hpi_shell DIST_SUBDIRS = utils scripts ssl snmp transport marshal baselib openhpid plugins docs clients cpp hpi_shell baselibs DISTCHECK_CONFIGURE_FLAGS = --with-initdir=prefix ALLSOURCES = \ $(shell find $(top_srcdir)/include -name .svn -o -name CVS -prune -o \ -name '*.[chS]' -print | grep -v '/t/') \ $(shell find $(top_srcdir)/baselib -name .svn -o -name CVS -prune -o \ -name '*.[chS]' -print | grep -v '/t/') \ $(shell find $(top_srcdir)/utils -name .svn -o -name CVS -prune -o \ -name '*.[chS]' -print | grep -v '/t/') \ $(shell find $(top_srcdir)/openhpid -name .svn -o -name CVS -prune -o \ -name '*.[chS]' -print -o -name '*.cpp' -print | grep -v '/t/') \ $(shell find $(top_srcdir)/plugins -name .svn -o -name CVS -prune -o \ -name '*.[chS]' -print -o -name '*.cpp' -print | grep -v '/t/') \ $(shell find $(top_srcdir)/snmp -name .svn -o -name CVS -prune -o \ -name '*.[chS]' -print | grep -v '/t/') \ $(shell find $(top_srcdir)/ssl -name .svn -o -name CVS -prune -o \ -name '*.[chS]' -print | grep -v '/t/') \ $(shell find $(top_srcdir)/transport -name .svn -o -name CVS -prune -o \ -name '*.[chS]' -print | grep -v '/t/') \ $(shell find $(top_srcdir)/marshal -name .svn -o -name CVS -prune -o \ -name '*.[chS]' -print | grep -v '/t/') \ $(shell find $(top_srcdir)/clients -name .svn -o -name CVS -prune -o \ -name '*.[chS]' -print | grep -v '/t/') \ $(shell find $(top_srcdir)/cpp -name .svn -o -name CVS -prune -o \ -name '*.[ch]pp' -print | grep -v '/t/') includedir=$(base_includedir)/openhpi # These are the only headers that users should have any access to include_HEADERS = $(top_srcdir)/include/SaHpi.h \ $(top_srcdir)/include/SaHpiXtca.h \ $(top_srcdir)/include/SaHpiAtca.h \ $(top_srcdir)/include/SaHpiBladeCenter.h \ $(top_srcdir)/include/oHpi.h \ $(top_srcdir)/utils/oh_utils.h \ $(top_srcdir)/utils/announcement_utils.h \ $(top_srcdir)/utils/rpt_utils.h \ $(top_srcdir)/utils/sahpi_enum_utils.h \ $(top_srcdir)/utils/sahpi_gcrypt_utils.h \ $(top_srcdir)/utils/sahpixtca_enum_utils.h \ $(top_srcdir)/utils/sahpiatca_enum_utils.h \ $(top_srcdir)/utils/sahpi_event_encode.h \ $(top_srcdir)/utils/sahpi_event_utils.h \ $(top_srcdir)/utils/sahpi_struct_utils.h \ $(top_srcdir)/utils/sahpi_time_utils.h \ $(top_srcdir)/utils/uid_utils.h \ $(top_srcdir)/utils/epath_utils.h \ $(top_srcdir)/utils/el_utils.h \ $(top_srcdir)/utils/event_utils.h \ $(top_srcdir)/clients/oh_clients.h doc_DATA = README README.daemon COPYING ChangeLog $(top_srcdir)/utils/sahpi_enum_utils.h: make -C $(top_builddir)/utils sahpi_enum_utils.h $(top_srcdir)/utils/sahpixtca_enum_utils.h: make -C $(top_builddir)/utils sahpixtca_enum_utils.h $(top_srcdir)/utils/sahpiatca_enum_utils.h: make -C $(top_builddir)/utils sahpiatca_enum_utils.h install-data-local: openhpi.pc openhpi.conf.example simulation.data.example openhpiclient.conf.example $(mkinstalldirs) $(DESTDIR)$(libdir)/pkgconfig $(INSTALL_DATA) openhpi.pc $(DESTDIR)$(libdir)/pkgconfig $(mkinstalldirs) $(DESTDIR)$(VARPATH) chmod 755 $(DESTDIR)$(VARPATH) $(mkinstalldirs) $(DESTDIR)$(sysconfdir)/openhpi if test ! -e $(DESTDIR)$(sysconfdir)/openhpi/openhpi.conf; then \ $(INSTALL) -m 600 $(top_srcdir)/openhpi.conf.example $(DESTDIR)$(sysconfdir)/openhpi/openhpi.conf; \ fi if test ! -e $(DESTDIR)$(sysconfdir)/openhpi/simulation.data; then \ $(INSTALL) -m 600 $(top_srcdir)/simulation.data.example $(DESTDIR)$(sysconfdir)/openhpi/simulation.data; \ fi if test ! -e $(DESTDIR)$(sysconfdir)/openhpi/openhpiclient.conf; then \ $(INSTALL_DATA) $(top_srcdir)/openhpiclient.conf.example $(DESTDIR)$(sysconfdir)/openhpi/openhpiclient.conf; \ fi uninstall-local: rm -f $(DESTDIR)$(libdir)/pkgconfig/openhpi.pc if cmp $(top_srcdir)/openhpi.conf.example $(DESTDIR)$(sysconfdir)/openhpi/openhpi.conf; then \ rm -f $(DESTDIR)$(sysconfdir)/openhpi/openhpi.conf; \ fi if cmp $(top_srcdir)/simulation.data.example $(DESTDIR)$(sysconfdir)/openhpi/simulation.data; then \ rm -f $(DESTDIR)$(sysconfdir)/openhpi/simulation.data; \ fi if cmp $(top_srcdir)/openhpiclient.conf.example $(DESTDIR)$(sysconfdir)/openhpi/openhpiclient.conf; then \ rm -f $(DESTDIR)$(sysconfdir)/openhpi/openhpiclient.conf; \ fi rpm: dist rm -rf $(top_srcdir)/rpm mkdir -p $(top_srcdir)/rpm/RPMS mkdir $(top_srcdir)/rpm/SRPMS mkdir $(top_srcdir)/rpm/BUILD mkdir $(top_srcdir)/rpm/INSTALL $(RPM) $(RPMFLAGS) $(PACKAGE_NAME).spec cscope.files cscope -b .PHONY: FORCE openhpi-3.6.1/openhpiclient.conf.example0000644000175100017510000000323512575647265017343 0ustar mohanmohan### OpenHPI client library configuration example file ### ####### ## Section: My Entity ## Specifies the EntityPath of the entity upon which the HPI User is running. # ## Example entity declaration: # # my_entity = "{RACK,1}{SYSTEM_CHASSIS,2}" ####### ## Section: Domains ## Since each openhpi daemon instance manages a hpi domain, # each domain declaration specifies domain number, hpi daemon host and hpi daemon port. # ## Example domain declarations: # #domain default { # Has to be string "default", no quote. # # Number 0 is not allowed. # host = "my_default_domain_host" # String value. Double quotes required. # port = my_defaultdomain_port # Integer value # entity_root = "my_entity_root" # String value. Double quotes required. # # This entity_root will be added to all # # entity paths exposed in the domain #} # # If no "default" stanza is declared, # # host = "localhost" and port = 4743 # # are used. # # #domain 1 { # host = "my_domain1_host" # String value. Double quotes required. # port = my_domain1_port # Integer value # entity_root = "{RACK,1}" #} #domain 2 { # host = "my_domain2_host" # String value. Double quotes required. # port = my_domain2_port # Integer value #} #domain 3 { # host = "my_domain3_host" # String value. Double quotes required. # port = my_domain3_port # Integer value #} openhpi-3.6.1/baselib/0000755000175100017510000000000012605014452013553 5ustar mohanmohanopenhpi-3.6.1/baselib/init.cpp0000644000175100017510000000250312575647301015235 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004-2008 * (C) Copyright Pigeon Point Systems. 2010 * (C) Copyright Nokia Siemens Networks 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley * Renier Morales * Anton Pak * Ulrich Kleber * */ #include #include #include "conf.h" #include "init.h" #include "session.h" #include "sahpi_wrappers.h" SaErrorT ohc_init(void) { static SaHpiBoolT initialized = SAHPI_FALSE; if (initialized != SAHPI_FALSE) { return SA_OK; } initialized = SAHPI_TRUE; // Initialize GLIB thread engine if (g_thread_supported() == FALSE) { wrap_g_thread_init(0); } ohc_conf_init(); ohc_sess_init(); return SA_OK; } SaErrorT ohc_finit(void) { SaErrorT rv; rv = ohc_sess_close_all(); if ( rv != SA_OK ) { return rv; } return SA_OK; } openhpi-3.6.1/baselib/lock.c0000644000175100017510000000153012575647301014661 0ustar mohanmohan/* -*- c -*- * * (C) Copyright Nokia Siemens Networks 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak * */ #include #include "lock.h" #include "sahpi_wrappers.h" #if GLIB_CHECK_VERSION (2, 32, 0) static GRecMutex ohc_main_lock; #else static GStaticRecMutex ohc_main_lock = G_STATIC_REC_MUTEX_INIT; #endif void ohc_lock( void ) { wrap_g_static_rec_mutex_lock(&ohc_main_lock); } void ohc_unlock( void ) { wrap_g_static_rec_mutex_unlock(&ohc_main_lock); } openhpi-3.6.1/baselib/Makefile.am0000644000175100017510000000263612575647301015631 0ustar mohanmohan# # Copyright (c) 2004-2006 by IBM Corporation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # # Authors: # W. David Ashley # Renier Morales # .NOTPARALLEL: MAINTAINERCLEANFILES = Makefile.in *~ AM_CPPFLAGS = -DG_LOG_DOMAIN=\"baselib\" AM_CPPFLAGS += \ @OPENHPI_INCLUDES@ -I$(top_srcdir)/transport -I$(top_srcdir)/marshal @OH_SSL_INCLUDES@ EXTRA_DIST = Makefile.mingw32 version.rc lib_LTLIBRARIES = libopenhpi.la libopenhpi_la_SOURCES = conf.c \ conf.h \ init.cpp \ init.h \ lock.c \ lock.h \ ohpi.cpp \ safhpi.cpp \ session.cpp \ session.h libopenhpi_la_LDFLAGS = -version-info @HPI_LIB_VERSION@ libopenhpi_la_LIBADD = $(top_builddir)/transport/libopenhpitransport.la -lstdc++ \ $(top_builddir)/marshal/libopenhpimarshal.la \ $(top_builddir)/utils/libopenhpiutils.la clean-local: rm -f *~ core core.* openhpi-3.6.1/baselib/conf.h0000644000175100017510000000344112575647301014666 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2008 * (C) Copyright Pigeon Point Systems. 2010 * (C) Copyright Nokia Siemens Networks 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Anton Pak * Ulrich Kleber * */ #ifndef __BASELIB_CONFIG_H #define __BASELIB_CONFIG_H #include #include #ifdef __cplusplus extern "C" { #endif struct ohc_domain_conf { SaHpiDomainIdT did; char host[SAHPI_MAX_TEXT_BUFFER_LENGTH]; unsigned short port; SaHpiEntityPathT entity_root; }; void ohc_conf_init(void); const SaHpiEntityPathT * ohc_get_my_entity(void); const struct ohc_domain_conf * ohc_get_domain_conf(SaHpiDomainIdT did); const struct ohc_domain_conf * ohc_get_next_domain_conf(SaHpiEntryIdT entry_id, SaHpiEntryIdT *next_entry_id); SaErrorT ohc_add_domain_conf(const char *host, unsigned short port, const SaHpiEntityPathT *entity_root, SaHpiDomainIdT *did); SaErrorT ohc_add_domain_conf_by_id(SaHpiDomainIdT did, const char *host, unsigned short port, const SaHpiEntityPathT *entity_root); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* __BASELIB_CONFIG_H */ openhpi-3.6.1/baselib/Makefile.mingw320000644000175100017510000000164312575647301016517 0ustar mohanmohaninclude ../Makefile.mingw32.def TARGET := libopenhpi.dll SRC := conf.c \ init.cpp \ lock.c \ ohpi.cpp \ safhpi.cpp \ session.cpp \ version.rc OBJ := $(patsubst %.rc, %.o, $(patsubst %.c, %.o, $(patsubst %.cpp, %.o, ${SRC}))) DEFS := -DG_LOG_DOMAIN=\"baselib\" DEFS += -DSAHPI_API="__declspec(dllexport)" INCLUDES := ${GLIB_INCLUDES} INCLUDES += -I ../mingw32 -I ../include -I ../utils -I ../transport -I ../marshal LIBS := ${GLIB_LIBS} ${GTHREAD_LIBS} LIBS += -L ../utils -lopenhpiutils LIBS += -L ../transport -lopenhpitransport LIBS += -L ../marshal -lopenhpimarshal CPPFLAGS += ${DEFS} ${INCLUDES} .PHONY: all clean .SUFFIXES: .rc all : ${TARGET} ${TARGET} : ${OBJ} ${CXX} -shared -o $@ $^ ${LIBS} \ -Wl,--out-implib,${@:.dll=.a} \ -Wl,--output-def,${@:.dll=.def} .rc.o: ${RC} ${RCFLAGS} $< $@ clean: rm -f ${OBJ} ${TARGET} ${TARGET:.dll=.a} ${TARGET:.dll=.def} openhpi-3.6.1/baselib/session.cpp0000644000175100017510000002576312575647301015772 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004-2008 * (C) Copyright Pigeon Point Systems. 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley * Renier Morales * Anton Pak * */ #include #include #include #include #include #include "conf.h" #include "init.h" #include "lock.h" #include "session.h" #include /*************************************************************** * Session Layer: class cSession **************************************************************/ class cSession { public: explicit cSession(); ~cSession(); void Ref() { ++m_ref_cnt; } void Unref() { --m_ref_cnt; } int GetRefCnf() const { return m_ref_cnt; } SaHpiDomainIdT GetDomainId() const { return m_did; } SaHpiSessionIdT GetSid() const { return m_sid; } void SetSid( SaHpiSessionIdT sid ) { m_sid = sid; } SaErrorT GetEntityRoot( SaHpiEntityPathT& entity_root ) const; SaErrorT RpcOpen( SaHpiDomainIdT did ); SaErrorT RpcClose(); SaErrorT Rpc( uint32_t id, ClientRpcParams& iparams, ClientRpcParams& oparams ); private: cSession( const cSession& ); cSession& operator =( cSession& ); SaErrorT DoRpc( uint32_t id, ClientRpcParams& iparams, ClientRpcParams& oparams ); SaErrorT GetSock( cClientStreamSock * & sock ); static void DeleteSock( gpointer ptr ); private: static const size_t RPC_ATTEMPTS = 2; static const gulong NEXT_RPC_ATTEMPT_TIMEOUT = 2 * G_USEC_PER_SEC; // data volatile int m_ref_cnt; SaHpiDomainIdT m_did; SaHpiSessionIdT m_sid; SaHpiSessionIdT m_remote_sid; #if GLIB_CHECK_VERSION (2, 32, 0) GPrivate m_sockets; #else GStaticPrivate m_sockets; #endif }; cSession::cSession() : m_ref_cnt( 0 ), m_did( SAHPI_UNSPECIFIED_DOMAIN_ID ), m_sid( 0 ), m_remote_sid( 0 ) { #if GLIB_CHECK_VERSION (2, 32, 0) m_sockets = G_PRIVATE_INIT (g_free); #else wrap_g_static_private_init( &m_sockets ); #endif } cSession::~cSession() { wrap_g_static_private_free( &m_sockets ); } SaErrorT cSession::GetEntityRoot( SaHpiEntityPathT& entity_root ) const { ohc_lock(); const struct ohc_domain_conf * dc = ohc_get_domain_conf( m_did ); if ( dc ) { memcpy( &entity_root, &dc->entity_root, sizeof(SaHpiEntityPathT) ); } ohc_unlock(); if (!dc) { return SA_ERR_HPI_INVALID_DOMAIN; } return SA_OK; } SaErrorT cSession::RpcOpen( SaHpiDomainIdT did ) { m_did = did; SaHpiDomainIdT remote_did = SAHPI_UNSPECIFIED_DOMAIN_ID; ClientRpcParams iparams, oparams( &m_remote_sid ); iparams.SetFirst( &remote_did ); return DoRpc( eFsaHpiSessionOpen, iparams, oparams ); } SaErrorT cSession::RpcClose() { ClientRpcParams iparams, oparams; iparams.SetFirst( &m_remote_sid ); return DoRpc( eFsaHpiSessionClose, iparams, oparams ); } SaErrorT cSession::Rpc( uint32_t id, ClientRpcParams& iparams, ClientRpcParams& oparams ) { iparams.SetFirst( &m_remote_sid ); return DoRpc( id, iparams, oparams ); } SaErrorT cSession::DoRpc( uint32_t id, ClientRpcParams& iparams, ClientRpcParams& oparams ) { SaErrorT rv; cHpiMarshal * hm = HpiMarshalFind( id ); if ( !hm ) { return SA_ERR_HPI_UNSUPPORTED_API; } int cc; char data[dMaxPayloadLength]; uint32_t data_len; uint8_t rp_type; uint32_t rp_id; int rp_byte_order; cc = HpiMarshalRequest( hm, data, iparams.const_array ); if ( cc < 0 ) { return SA_ERR_HPI_INTERNAL_ERROR; } data_len = cc; bool rc = false; for ( size_t attempt = 0; attempt < RPC_ATTEMPTS; ++attempt ) { if ( attempt > 0 ) { DBG( "Session: RPC request %u, Attempt %u\n", id, (unsigned int)attempt ); } cClientStreamSock * sock; rv = GetSock( sock ); if ( rv != SA_OK ) { return rv; } rc = sock->WriteMsg( eMhMsg, id, data, data_len ); if ( rc ) { rc = sock->ReadMsg( rp_type, rp_id, data, data_len, rp_byte_order ); if ( rc ) { break; } } #if GLIB_CHECK_VERSION (2, 32, 0) wrap_g_static_private_set( &m_sockets, 0);// close socket #else wrap_g_static_private_set( &m_sockets, 0, 0 ); // close socket #endif g_usleep( NEXT_RPC_ATTEMPT_TIMEOUT ); } if ( !rc ) { return SA_ERR_HPI_NO_RESPONSE; } oparams.SetFirst( &rv ); cc = HpiDemarshalReply( rp_byte_order, hm, data, oparams.array ); if ( ( cc <= 0 ) || ( rp_type != eMhMsg ) || ( id != rp_id ) ) { //Closing main socket(the socket that was used for saHpiSessionOpen) // may disrupt HPI session on remote side. // TODO: Investigate and fix on OpenHPI daemon side and then uncomment. //g_static_private_set( &m_sockets, 0, 0 ); // close socket return SA_ERR_HPI_NO_RESPONSE; } return rv; } SaErrorT cSession::GetSock( cClientStreamSock * & sock ) { gpointer ptr = wrap_g_static_private_get( &m_sockets ); if ( ptr ) { sock = reinterpret_cast(ptr); } else { ohc_lock(); const struct ohc_domain_conf * dc = ohc_get_domain_conf( m_did ); ohc_unlock(); if (!dc) { return SA_ERR_HPI_INVALID_DOMAIN; } sock = new cClientStreamSock; bool rc = sock->Create( dc->host, dc->port ); if ( !rc ) { delete sock; CRIT("Session: cannot open connection to domain %u.", m_did ); return SA_ERR_HPI_NO_RESPONSE; } // TODO configuration file, env vars? sock->EnableKeepAliveProbes( /* keepalive_time*/ 1, /* keepalive_intvl */ 1, /* keepalive_probes */ 3 ); #if GLIB_CHECK_VERSION (2, 32, 0) wrap_g_static_private_set( &m_sockets, sock ); #else wrap_g_static_private_set( &m_sockets, sock, DeleteSock ); #endif } return SA_OK; } void cSession::DeleteSock( gpointer ptr ) { cClientStreamSock * sock = reinterpret_cast(ptr); delete sock; } /*************************************************************** * Session Layer: Session Table **************************************************************/ static GHashTable * sessions = 0; gpointer sid_key( SaHpiSessionIdT sid ) { char * key = 0; key += sid; return key; } static void sessions_init() { ohc_lock(); if ( !sessions ) { sessions = g_hash_table_new( g_direct_hash, g_direct_equal ); } ohc_unlock(); } static SaHpiSessionIdT sessions_add( cSession * session ) { static SaHpiSessionIdT next_sid = 1; ohc_lock(); SaHpiSessionIdT sid = next_sid; ++next_sid; session->SetSid( sid ); g_hash_table_insert( sessions, sid_key( sid ), session ); ohc_unlock(); return sid; } static cSession * sessions_get_ref( SaHpiSessionIdT sid ) { ohc_lock(); gpointer value = g_hash_table_lookup( sessions, sid_key( sid ) ); cSession * session = reinterpret_cast(value); if ( session ) { session->Ref(); } ohc_unlock(); return session; } static void dehash_func( gpointer /* key */, gpointer value, gpointer user_data ) { GList ** pvalues = reinterpret_cast(user_data); cSession * session = reinterpret_cast(value); session->Ref(); *pvalues = g_list_append( *pvalues, value ); } static GList * sessions_get_ref_all() { ohc_lock(); GList * sessions_list = 0; if ( sessions ) { g_hash_table_foreach( sessions, dehash_func, &sessions_list ); } ohc_unlock(); return sessions_list; } static void sessions_unref( cSession * session, bool closed = false ) { ohc_lock(); session->Unref(); if ( closed ) { session->Unref(); g_hash_table_remove( sessions, sid_key( session->GetSid() ) ); } if ( session->GetRefCnf() < 0 ) { delete session; } ohc_unlock(); } /*************************************************************** * Session Layer: Interface **************************************************************/ void ohc_sess_init() { sessions_init(); } SaErrorT ohc_sess_open( SaHpiDomainIdT did, SaHpiSessionIdT& sid ) { ohc_init(); // TODO investigate cSession * session = new cSession; SaErrorT rv = session->RpcOpen( did ); if ( rv == SA_OK ) { sid = sessions_add( session ); } else { delete session; } return rv; } SaErrorT ohc_sess_close( SaHpiSessionIdT sid ) { cSession * session = sessions_get_ref( sid ); if ( !session ) { return SA_ERR_HPI_INVALID_SESSION; } SaErrorT rv = session->RpcClose(); sessions_unref( session, ( rv == SA_OK ) ); return rv; } SaErrorT ohc_sess_close_all() { SaErrorT rv = SA_OK; GList * sessions_list = sessions_get_ref_all(); if ( g_list_length( sessions_list ) == 0 ) { //rv = SA_ERR_HPI_INVALID_REQUEST; rv = SA_OK; } else { GList * item = sessions_list; while ( item ) { cSession * session = reinterpret_cast(item->data); session->RpcClose(); sessions_unref( session, true ); item = item->next; } } g_list_free( sessions_list ); return rv; } SaErrorT ohc_sess_rpc( uint32_t id, SaHpiSessionIdT sid, ClientRpcParams& iparams, ClientRpcParams& oparams ) { cSession * session = sessions_get_ref( sid ); if ( !session ) { return SA_ERR_HPI_INVALID_SESSION; } SaErrorT rv = session->Rpc( id, iparams, oparams ); sessions_unref( session ); return rv; } SaErrorT ohc_sess_get_did( SaHpiSessionIdT sid, SaHpiDomainIdT& did ) { cSession * session = sessions_get_ref( sid ); if ( !session ) { return SA_ERR_HPI_INVALID_SESSION; } did = session->GetDomainId(); sessions_unref( session ); return SA_OK; } SaErrorT ohc_sess_get_entity_root( SaHpiSessionIdT sid, SaHpiEntityPathT& ep ) { cSession * session = sessions_get_ref( sid ); if ( !session ) { return SA_ERR_HPI_INVALID_SESSION; } SaErrorT rv = session->GetEntityRoot( ep ); sessions_unref( session ); return rv; } openhpi-3.6.1/baselib/conf.c0000644000175100017510000005044512575647301014667 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2008 * (C) Copyright Pigeon Point Systems. 2010 * (C) Copyright Nokia Siemens Networks 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales * Anton Pak * Ulrich Kleber */ #include #include #include #ifdef _WIN32 #include #endif /* _WIN32 */ #include #include #include #include #include #include "conf.h" #include "init.h" #include "lock.h" static GHashTable *ohc_domains = NULL; static SaHpiEntityPathT my_entity = { .Entry[0] = { .EntityType = SAHPI_ENT_UNSPECIFIED, .EntityLocation = 0 } }; static int load_client_config(const char *filename); static void add_domain_conf(SaHpiDomainIdT did, const char *host, unsigned short port, const SaHpiEntityPathT *entity_root); static void extract_keys(gpointer key, gpointer val, gpointer user_data); static gint compare_keys(const gint *a, const gint *b); void ohc_conf_init(void) { ohc_lock(); // Create domain table if (!ohc_domains) { // Create domain table char * config_file; const struct ohc_domain_conf *default_conf; ohc_domains = g_hash_table_new_full(g_int_hash, g_int_equal, NULL, g_free); /* TODO: Have a default openhpiclient.conf file in /etc */ config_file = getenv("OPENHPICLIENT_CONF"); if (config_file != NULL) { load_client_config(config_file); } else { #ifdef _WIN32 char buf[MAX_PATH]; config_file = &buf[0]; DWORD cc = ExpandEnvironmentStrings(OH_CLIENT_DEFAULT_CONF, config_file, MAX_PATH); if ((cc != 0) && (cc < MAX_PATH)) { load_client_config(config_file); } #else load_client_config(OH_CLIENT_DEFAULT_CONF); #endif /* _WIN32 */ } /* Check to see if a default domain exists, if not, add it */ default_conf = ohc_get_domain_conf(OH_DEFAULT_DOMAIN_ID); if (default_conf == NULL) { const char *host, *portstr; unsigned short port; SaHpiEntityPathT entity_root; /* TODO: change these envs to have DEFAULT in the name*/ host = getenv("OPENHPI_DAEMON_HOST"); if (host == NULL) { host = "localhost"; } portstr = getenv("OPENHPI_DAEMON_PORT"); if (portstr == NULL) { port = OPENHPI_DEFAULT_DAEMON_PORT; } else { port = atoi(portstr); } oh_init_ep(&entity_root); add_domain_conf(OH_DEFAULT_DOMAIN_ID, host, port, &entity_root); } } ohc_unlock(); } const SaHpiEntityPathT * ohc_get_my_entity(void) { // NB: Since my_entity is assigned on initialization // we don't need to aquire lock if ( my_entity.Entry[0].EntityType == SAHPI_ENT_UNSPECIFIED ) { if ( my_entity.Entry[0].EntityLocation == 0 ) { return 0; } } return &my_entity; } const struct ohc_domain_conf * ohc_get_domain_conf(SaHpiDomainIdT did) { struct ohc_domain_conf *dc; ohc_lock(); dc = (struct ohc_domain_conf *)g_hash_table_lookup(ohc_domains, &did); ohc_unlock(); return dc; } SaErrorT ohc_add_domain_conf(const char *host, unsigned short port, const SaHpiEntityPathT *entity_root, SaHpiDomainIdT *did) { ohc_lock(); // get all known domain ids and sort them GList *keys = 0; g_hash_table_foreach(ohc_domains, extract_keys, &keys); keys = g_list_sort(keys, (GCompareFunc)compare_keys); // found prev = a gap in domain ids list or max domain id // so that new did will be prev + 1 SaHpiDomainIdT prev_did = 0; GList *item; for (item = keys; item != NULL; item = item->next) { SaHpiDomainIdT item_did = *(const SaHpiDomainIdT *)(item->data); if ((prev_did + 1) < item_did) { break; } prev_did = item_did; } g_list_free(keys); if (prev_did == SAHPI_UNSPECIFIED_DOMAIN_ID) { ohc_unlock(); return SA_ERR_HPI_OUT_OF_SPACE; } if ((prev_did + 1) == SAHPI_UNSPECIFIED_DOMAIN_ID) { ohc_unlock(); return SA_ERR_HPI_OUT_OF_SPACE; } *did = prev_did + 1; add_domain_conf(*did, host, port, entity_root); ohc_unlock(); return SA_OK; } SaErrorT ohc_add_domain_conf_by_id(SaHpiDomainIdT did, const char *host, unsigned short port, const SaHpiEntityPathT *entity_root) { if (did==SAHPI_UNSPECIFIED_DOMAIN_ID || did==OH_DEFAULT_DOMAIN_ID) return SA_ERR_HPI_INVALID_PARAMS; ohc_lock(); // check new did against all known domain ids if (ohc_get_domain_conf(did) != NULL) { ohc_unlock(); return SA_ERR_HPI_DUPLICATE; } add_domain_conf(did, host, port, entity_root); ohc_unlock(); return SA_OK; } const struct ohc_domain_conf * ohc_get_next_domain_conf(SaHpiEntryIdT entry_id, SaHpiEntryIdT *next_entry_id) { struct ohc_domain_conf *dc; int did, nextdid = SAHPI_UNSPECIFIED_DOMAIN_ID; ohc_lock(); // get all known domain ids and sort them GList *keys = 0; g_hash_table_foreach(ohc_domains, extract_keys, &keys); keys = g_list_sort(keys, (GCompareFunc)compare_keys); // DomainId is used for EntryId if (entry_id == SAHPI_FIRST_ENTRY) // get first valid domain id did = *(const SaHpiDomainIdT *)(keys->data); else // EntryId already must be a valid domain id did = (SaHpiDomainIdT) entry_id; dc = (struct ohc_domain_conf *)g_hash_table_lookup(ohc_domains, &did); if (dc != NULL) { // search first domain id > did GList *item; item = keys; while (item != NULL && nextdid <= did) { nextdid = *(const SaHpiDomainIdT *)(item->data); item = item->next; } if (nextdid == did) // no next domain id found *next_entry_id = SAHPI_LAST_ENTRY; else *next_entry_id = (SaHpiEntryIdT) nextdid; } else *next_entry_id = SAHPI_LAST_ENTRY; g_list_free(keys); ohc_unlock(); return dc; } static void extract_keys(gpointer key, gpointer val, gpointer user_data) { GList ** key_list = (GList **)(user_data); *key_list = g_list_append(*key_list, key); } static gint compare_keys(const gint *a, const gint *b) { if ( *a < *b ) { return -1; } else if ( *a > *b ) { return 1; } else { return 0; } } /******************************************************************************* * In order to use the glib lexical parser we need to define token * types which we want to switch on ******************************************************************************/ enum { HPI_CLIENT_CONF_TOKEN_DOMAIN = G_TOKEN_LAST, HPI_CLIENT_CONF_TOKEN_DEFAULT, HPI_CLIENT_CONF_TOKEN_HOST, HPI_CLIENT_CONF_TOKEN_PORT, HPI_CLIENT_CONF_TOKEN_ROOT, HPI_CLIENT_CONF_TOKEN_MY_EP, } hpiClientConfType; struct tokens { gchar *name; guint token; }; static struct tokens ohc_conf_tokens[] = { { .name = "domain", .token = HPI_CLIENT_CONF_TOKEN_DOMAIN }, { .name = "default", .token = HPI_CLIENT_CONF_TOKEN_DEFAULT }, { .name = "host", .token = HPI_CLIENT_CONF_TOKEN_HOST }, { .name = "port", .token = HPI_CLIENT_CONF_TOKEN_PORT }, { .name = "entity_root", .token = HPI_CLIENT_CONF_TOKEN_ROOT }, { .name = "my_entity", .token = HPI_CLIENT_CONF_TOKEN_MY_EP }, }; /******************************************************************************* * In order to initialize the lexical scanner, you need the following config. * This config was figured out by reading the glib sources, and lots of * trial and error (documentation for this isn't very good). * * G_TOKEN_STRING will be created when anything starts with a-zA-z_/. * due to cset_identifier_first and identifier2string values below. * Therefor, if you want 0 to be scanned as a string, you need to quote * it (e.g. "0") * *******************************************************************************/ static GScannerConfig oh_scanner_conf = { ( " \t\n" ) /* cset_skip_characters */, ( G_CSET_a_2_z "_/." G_CSET_A_2_Z ) /* cset_identifier_first */, ( G_CSET_a_2_z "_-0123456789/." G_CSET_A_2_Z ) /* cset_identifier_nth */, ( "#\n" ) /* cpair_comment_single */, FALSE /* case_sensitive */, TRUE /* skip_comment_multi */, TRUE /* skip_comment_single */, TRUE /* scan_comment_multi */, TRUE /* scan_identifier */, TRUE /* scan_identifier_1char */, TRUE /* scan_identifier_NULL */, TRUE /* scan_symbols */, TRUE /* scan_binary */, TRUE /* scan_octal */, TRUE /* scan_float */, TRUE /* scan_hex */, TRUE /* scan_hex_dollar */, TRUE /* scan_string_sq */, TRUE /* scan_string_dq */, TRUE /* numbers_2_int */, FALSE /* int_2_float */, TRUE /* identifier_2_string */, TRUE /* char_2_token */, TRUE /* symbol_2_token */, FALSE /* scope_0_fallback */, }; static int get_next_good_token_in_domain_stanza(GScanner *oh_scanner) { int next_token; next_token = g_scanner_get_next_token(oh_scanner); while (next_token != G_TOKEN_RIGHT_CURLY && next_token != HPI_CLIENT_CONF_TOKEN_HOST && next_token != HPI_CLIENT_CONF_TOKEN_PORT && next_token != HPI_CLIENT_CONF_TOKEN_ROOT) { if (next_token == G_TOKEN_EOF) break; next_token = g_scanner_get_next_token(oh_scanner); } return next_token; } static void add_domain_conf(SaHpiDomainIdT did, const char *host, unsigned short port, const SaHpiEntityPathT * entity_root) { struct ohc_domain_conf *domain_conf; domain_conf = g_new0(struct ohc_domain_conf, 1); domain_conf->did = did; strncpy(domain_conf->host, host, SAHPI_MAX_TEXT_BUFFER_LENGTH); domain_conf->port = port; memcpy(&domain_conf->entity_root, entity_root, sizeof(SaHpiEntityPathT)); g_hash_table_insert(ohc_domains, &domain_conf->did, domain_conf); } static int process_domain_token (GScanner *oh_scanner) { SaHpiDomainIdT did; char host[SAHPI_MAX_TEXT_BUFFER_LENGTH]; unsigned int port; SaHpiEntityPathT entity_root; int next_token; host[0] = '\0'; port = OPENHPI_DEFAULT_DAEMON_PORT; oh_init_ep(&entity_root); next_token = g_scanner_get_next_token(oh_scanner); if (next_token != HPI_CLIENT_CONF_TOKEN_DOMAIN) { CRIT("Processing domain: Expected a domain token"); return -1; } /* Get the domain id and store in Hash Table */ next_token = g_scanner_get_next_token(oh_scanner); if (next_token == HPI_CLIENT_CONF_TOKEN_DEFAULT) { did = OH_DEFAULT_DOMAIN_ID; } else if (next_token == G_TOKEN_INT) { if (oh_scanner->value.v_int == 0) { // Domain Id of 0 is invalid CRIT("Processing domain: A domain id of 0 is invalid"); return -2; } did = (SaHpiDomainIdT)oh_scanner->value.v_int; } else { CRIT("Processing domain: Expected int or string ('default') token"); return -3; } /* Check for Left Brace token type. If we have it, then continue parsing. */ if (g_scanner_get_next_token(oh_scanner) != G_TOKEN_LEFT_CURLY) { CRIT("Processing domain: Expected left curly token."); return -10; } next_token = get_next_good_token_in_domain_stanza(oh_scanner); while (next_token != G_TOKEN_EOF && next_token != G_TOKEN_RIGHT_CURLY) { if (next_token == HPI_CLIENT_CONF_TOKEN_HOST) { next_token = g_scanner_get_next_token(oh_scanner); if (next_token != G_TOKEN_EQUAL_SIGN) { CRIT("Processing domain: Expected equal sign"); return -10; } next_token = g_scanner_get_next_token(oh_scanner); if (next_token != G_TOKEN_STRING) { CRIT("Processing domain: Expected a string"); return -10; } if (host[0] == '\0') { strncpy(host, oh_scanner->value.v_string, SAHPI_MAX_TEXT_BUFFER_LENGTH); } } else if (next_token == HPI_CLIENT_CONF_TOKEN_PORT) { next_token = g_scanner_get_next_token(oh_scanner); if (next_token != G_TOKEN_EQUAL_SIGN) { CRIT("Processing domain: Expected equal sign"); return -10; } next_token = g_scanner_get_next_token(oh_scanner); if (next_token != G_TOKEN_INT) { CRIT("Processing domain: Expected an integer"); return -10; } port = oh_scanner->value.v_int; } else if (next_token == HPI_CLIENT_CONF_TOKEN_ROOT) { next_token = g_scanner_get_next_token(oh_scanner); if (next_token != G_TOKEN_EQUAL_SIGN) { CRIT("Processing entity_root: Expected equal sign"); return -10; } next_token = g_scanner_get_next_token(oh_scanner); if (next_token != G_TOKEN_STRING) { CRIT("Processing entity_root: Expected a string"); return -10; } if ( oh_encode_entitypath(oh_scanner->value.v_string, &entity_root) != SA_OK ) { CRIT("Processing entity_root: Invalid entity path"); return -10; } } else { CRIT("Processing domain: Should not get here!"); return -10; } next_token = g_scanner_get_next_token(oh_scanner); } if (next_token == G_TOKEN_EOF) { CRIT("Processing domain: Expected a right curly"); return -10; } else if (host[0] == '\0') { CRIT("Processing domain: Did not find the host parameter"); return -10; } add_domain_conf(did, host, port, &entity_root); return 0; } static int process_my_entity_token(GScanner *oh_scanner) { int next_token; SaHpiEntityPathT ep; next_token = g_scanner_get_next_token(oh_scanner); if (next_token != HPI_CLIENT_CONF_TOKEN_MY_EP) { CRIT("Processing my_entity: Expected a my_entity token"); return -1; } next_token = g_scanner_get_next_token(oh_scanner); if (next_token != G_TOKEN_EQUAL_SIGN) { CRIT("Processing my_entity: Expected equal sign"); return -2; } next_token = g_scanner_get_next_token(oh_scanner); if (next_token != G_TOKEN_STRING) { CRIT("Processing my_entity: Expected a string"); return -3; } if ( oh_encode_entitypath(oh_scanner->value.v_string, &ep) != SA_OK ) { CRIT("Processing my_entity: Invalid entity path"); return -4; } // NB: Since this code works only on initialization // we don't need to acquire lock memcpy( &my_entity, &ep, sizeof(SaHpiEntityPathT) ); return 0; } static void scanner_msg_handler (GScanner *scanner, gchar *message, gboolean is_error) { g_return_if_fail (scanner != NULL); CRIT("%s:%d: %s%s\n", scanner->input_name ? scanner->input_name : "", scanner->line, is_error ? "error: " : "", message ); } static int load_client_config(const char *filename) { int i, done = 0; GScanner *oh_scanner; int num_tokens = sizeof(ohc_conf_tokens) / sizeof(ohc_conf_tokens[0]); if (!filename) { CRIT("Error. Invalid parameters"); return -1; } oh_scanner = g_scanner_new(&oh_scanner_conf); if (!oh_scanner) { CRIT("Couldn't allocate g_scanner for file parsing"); return -2; } oh_scanner->msg_handler = scanner_msg_handler; oh_scanner->input_name = filename; FILE * fp = fopen(filename, "r"); if (!fp) { CRIT("Client configuration file '%s' could not be opened", filename); g_scanner_destroy(oh_scanner); return -3; } #ifdef _WIN32 g_scanner_input_file(oh_scanner, _fileno(fp)); #else g_scanner_input_file(oh_scanner, fileno(fp)); #endif for (i = 0; i < num_tokens; i++) { g_scanner_scope_add_symbol( oh_scanner, 0, ohc_conf_tokens[i].name, GUINT_TO_POINTER(ohc_conf_tokens[i].token)); } while (!done) { guint my_token; my_token = g_scanner_peek_next_token(oh_scanner); switch (my_token) { case G_TOKEN_EOF: done = 1; break; case HPI_CLIENT_CONF_TOKEN_DOMAIN: process_domain_token(oh_scanner); break; case HPI_CLIENT_CONF_TOKEN_MY_EP: process_my_entity_token(oh_scanner); break; default: /* need to advance it */ my_token = g_scanner_get_next_token(oh_scanner); g_scanner_unexp_token(oh_scanner, G_TOKEN_SYMBOL, NULL, "\"domain\" or \"my_entity\"", NULL, NULL, 1); break; } } fclose(fp); done = oh_scanner->parse_errors; g_scanner_destroy(oh_scanner); return 0; } openhpi-3.6.1/baselib/init.h0000644000175100017510000000161712575647301014707 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2008 * (C) Copyright Pigeon Point Systems. 2010 * (C) Copyright Nokia Siemens Networks 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Anton Pak * Ulrich Kleber * */ #ifndef __BASELIB_INIT_H #define __BASELIB_INIT_H #include #ifdef __cplusplus extern "C" { #endif SaErrorT ohc_init(void); SaErrorT ohc_finit(void); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* __BASELIB_INIT_H */ openhpi-3.6.1/baselib/session.h0000644000175100017510000000240112575647301015417 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004-2008 * (C) Copyright Pigeon Point Systems. 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley * Renier Morales * Anton Pak * */ #ifndef __BASELIB_SESSION_H #define __BASELIB_SESSION_H #include #include #include void ohc_sess_init(); SaErrorT ohc_sess_open( SaHpiDomainIdT did, SaHpiSessionIdT& sid ); SaErrorT ohc_sess_close( SaHpiSessionIdT sid ); SaErrorT ohc_sess_close_all(); SaErrorT ohc_sess_rpc( uint32_t id, SaHpiSessionIdT sid, ClientRpcParams& iparams, ClientRpcParams& oparams ); SaErrorT ohc_sess_get_did( SaHpiSessionIdT sid, SaHpiDomainIdT& did ); SaErrorT ohc_sess_get_entity_root( SaHpiSessionIdT sid, SaHpiEntityPathT& ep ); #endif /* __BASELIB_SESSION_H */ openhpi-3.6.1/baselib/version.rc0000644000175100017510000000165012575647301015603 0ustar mohanmohan#include LANGUAGE 0x09,0x01 // English(US) VS_VERSION_INFO VERSIONINFO FILEVERSION BINARY_VERSION PRODUCTVERSION BINARY_VERSION FILEFLAGSMASK 0 FILEFLAGS 0 FILEOS VOS_NT_WINDOWS32 FILETYPE VFT_DLL FILESUBTYPE VFT2_UNKNOWN BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904E4" // English(US), Multilingual BEGIN VALUE "Comments", "" VALUE "CompanyName", "OpenHPI Community (http://openhpi.org/)" VALUE "FileDescription", "OpenHPI Base Library (SAI-HPI-B.03.02 compliant)" VALUE "FileVersion", VERSION VALUE "InternalName", "libopenhpi" VALUE "LegalCopyright", "OpenHPI is distributed under BSD license" VALUE "OriginalFilename", "libopenhpi.dll" VALUE "ProductName", "OpenHPI" VALUE "ProductVersion", VERSION END END END openhpi-3.6.1/baselib/ohpi.cpp0000644000175100017510000003206012575647301015232 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004-2008 * (C) Copyright Pigeon Point Systems. 2010 * (C) Copyright Nokia Siemens Networks 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley * Renier Morales * Anton Pak * Ulrich Kleber * */ #include #include #include #include #include #include #include #include #include #include "conf.h" #include "init.h" #include "session.h" /*----------------------------------------------------------------------------*/ /* Utility functions */ /*----------------------------------------------------------------------------*/ static void __dehash_config(gpointer key, gpointer value, gpointer data) { oHpiHandlerConfigT *hc = (oHpiHandlerConfigT *)data; strncpy((char *)hc->Params[hc->NumberOfParams].Name, (const char *)key, SAHPI_MAX_TEXT_BUFFER_LENGTH); strncpy((char *)hc->Params[hc->NumberOfParams].Value, (const char *)value, SAHPI_MAX_TEXT_BUFFER_LENGTH); ++hc->NumberOfParams; } /*----------------------------------------------------------------------------*/ /* oHpiVersionGet */ /*----------------------------------------------------------------------------*/ SaHpiUint64T SAHPI_API oHpiVersionGet(void) { SaHpiUint64T v = 0; OHPI_VERSION_GET(v, VERSION); return v; } /*----------------------------------------------------------------------------*/ /* oHpiHandlerCreate */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API oHpiHandlerCreate ( SAHPI_IN SaHpiSessionIdT sid, SAHPI_IN GHashTable *config, SAHPI_OUT oHpiHandlerIdT *id) { SaErrorT rv; oHpiHandlerConfigT handler_config; if (!config || !id) { return SA_ERR_HPI_INVALID_PARAMS; } if (g_hash_table_size(config) == 0) { return SA_ERR_HPI_INVALID_PARAMS; } handler_config.Params = g_new0(oHpiHandlerConfigParamT, g_hash_table_size(config)); handler_config.NumberOfParams = 0; // add each hash table entry to the marshable handler_config g_hash_table_foreach(config, __dehash_config, &handler_config); // now create the handler ClientRpcParams iparams(&handler_config); ClientRpcParams oparams(id); rv = ohc_sess_rpc(eFoHpiHandlerCreate, sid, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* oHpiHandlerDestroy */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API oHpiHandlerDestroy ( SAHPI_IN SaHpiSessionIdT sid, SAHPI_IN oHpiHandlerIdT id) { SaErrorT rv; if (id == 0) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&id); ClientRpcParams oparams; rv = ohc_sess_rpc(eFoHpiHandlerDestroy, sid, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* oHpiHandlerInfo */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API oHpiHandlerInfo ( SAHPI_IN SaHpiSessionIdT sid, SAHPI_IN oHpiHandlerIdT id, SAHPI_OUT oHpiHandlerInfoT *info, SAHPI_INOUT GHashTable *conf_params) { SaErrorT rv; oHpiHandlerConfigT config; if (id == 0 || !info || !conf_params) { return SA_ERR_HPI_INVALID_PARAMS; } if (g_hash_table_size(conf_params) != 0) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&id); ClientRpcParams oparams(info, &config); rv = ohc_sess_rpc(eFoHpiHandlerInfo, sid, iparams, oparams); for (unsigned int n = 0; n < config.NumberOfParams; n++) { g_hash_table_insert(conf_params, g_strdup((const gchar *)config.Params[n].Name), g_strdup((const gchar *)config.Params[n].Value)); } g_free(config.Params); return rv; } /*----------------------------------------------------------------------------*/ /* oHpiHandlerGetNext */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API oHpiHandlerGetNext ( SAHPI_IN SaHpiSessionIdT sid, SAHPI_IN oHpiHandlerIdT id, SAHPI_OUT oHpiHandlerIdT *next_id) { SaErrorT rv; if (!next_id) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&id); ClientRpcParams oparams(next_id); rv = ohc_sess_rpc(eFoHpiHandlerGetNext, sid, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* oHpiHandlerFind */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API oHpiHandlerFind ( SAHPI_IN SaHpiSessionIdT sid, SAHPI_IN SaHpiResourceIdT rid, SAHPI_OUT oHpiHandlerIdT *id) { SaErrorT rv; if (!id || !rid) { return SA_ERR_HPI_INVALID_PARAMS; } *id = 0; //Initialize output var ClientRpcParams iparams(&sid, &rid); ClientRpcParams oparams(id); rv = ohc_sess_rpc(eFoHpiHandlerFind, sid, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* oHpiHandlerRetry */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API oHpiHandlerRetry ( SAHPI_IN SaHpiSessionIdT sid, SAHPI_IN oHpiHandlerIdT id) { SaErrorT rv; if (id == 0) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&id); ClientRpcParams oparams; rv = ohc_sess_rpc(eFoHpiHandlerRetry, sid, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* oHpiGlobalParamGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API oHpiGlobalParamGet ( SAHPI_IN SaHpiSessionIdT sid, SAHPI_INOUT oHpiGlobalParamT *param) { SaErrorT rv; if (!param) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(param); ClientRpcParams oparams(param); rv = ohc_sess_rpc(eFoHpiGlobalParamGet, sid, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* oHpiGlobalParamSet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API oHpiGlobalParamSet ( SAHPI_IN SaHpiSessionIdT sid, SAHPI_IN oHpiGlobalParamT *param) { SaErrorT rv; if (!param) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(param); ClientRpcParams oparams; rv = ohc_sess_rpc(eFoHpiGlobalParamSet, sid, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* oHpiInjectEvent */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API oHpiInjectEvent ( SAHPI_IN SaHpiSessionIdT sid, SAHPI_IN oHpiHandlerIdT id, SAHPI_IN SaHpiEventT *event, SAHPI_IN SaHpiRptEntryT *rpte, SAHPI_IN SaHpiRdrT *rdr) { SaErrorT rv; if (id == 0 || !event || !rpte || !rdr) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&id, event, rpte, rdr); ClientRpcParams oparams; rv = ohc_sess_rpc(eFoHpiInjectEvent, sid, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* oHpiDomainAdd */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API oHpiDomainAdd ( SAHPI_IN const SaHpiTextBufferT *host, SAHPI_IN SaHpiUint16T port, SAHPI_IN const SaHpiEntityPathT *entity_root, SAHPI_OUT SaHpiDomainIdT *domain_id) { if (!host) { return SA_ERR_HPI_INVALID_PARAMS; } if (!domain_id) { return SA_ERR_HPI_INVALID_PARAMS; } if (!entity_root) { return SA_ERR_HPI_INVALID_PARAMS; } if ((host->DataType != SAHPI_TL_TYPE_BCDPLUS) && (host->DataType != SAHPI_TL_TYPE_ASCII6) && (host->DataType != SAHPI_TL_TYPE_TEXT)) { return SA_ERR_HPI_INVALID_DATA; } // Function may be called before first session was opened, // so we may need to initialize ohc_init(); char buf[SAHPI_MAX_TEXT_BUFFER_LENGTH+1]; memcpy(&buf[0], &host->Data[0], host->DataLength); buf[host->DataLength] = '\0'; return ohc_add_domain_conf(buf, port, entity_root, domain_id); } /*----------------------------------------------------------------------------*/ /* oHpiDomainAddById */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API oHpiDomainAddById ( SAHPI_IN SaHpiDomainIdT domain_id, SAHPI_IN const SaHpiTextBufferT *host, SAHPI_IN SaHpiUint16T port, SAHPI_IN const SaHpiEntityPathT *entity_root) { if (!host) { return SA_ERR_HPI_INVALID_PARAMS; } if (!entity_root) { return SA_ERR_HPI_INVALID_PARAMS; } if ((host->DataType != SAHPI_TL_TYPE_BCDPLUS) && (host->DataType != SAHPI_TL_TYPE_ASCII6) && (host->DataType != SAHPI_TL_TYPE_TEXT)) { return SA_ERR_HPI_INVALID_DATA; } // Function may be called before first session was opened, // so we may need to initialize ohc_init(); char buf[SAHPI_MAX_TEXT_BUFFER_LENGTH+1]; memcpy(&buf[0], &host->Data[0], host->DataLength); buf[host->DataLength] = '\0'; return ohc_add_domain_conf_by_id(domain_id, buf, port, entity_root); } /*----------------------------------------------------------------------------*/ /* oHpiDomainEntryGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API oHpiDomainEntryGet ( SAHPI_IN SaHpiEntryIdT EntryId, SAHPI_OUT SaHpiEntryIdT *NextEntryId, SAHPI_OUT oHpiDomainEntryT *DomainEntry) { if (!NextEntryId || !DomainEntry) { return SA_ERR_HPI_INVALID_PARAMS; } // Function may be called before first session was opened, // so we may need to initialize ohc_init(); const ohc_domain_conf *dc = ohc_get_next_domain_conf(EntryId, NextEntryId); if (dc == 0) { // no config for did found return SA_ERR_HPI_NOT_PRESENT; } DomainEntry->id = (SaHpiDomainIdT) EntryId; if (oh_init_textbuffer(&DomainEntry->host) != SA_OK) { return SA_ERR_HPI_INVALID_PARAMS; } if (oh_append_textbuffer(&DomainEntry->host, dc->host)!= SA_OK) { return SA_ERR_HPI_INVALID_PARAMS; } DomainEntry->port = dc->port; memcpy(&DomainEntry->entity_root, &dc->entity_root, sizeof(SaHpiEntityPathT)); return SA_OK; } /*----------------------------------------------------------------------------*/ /* oHpiDomainEntryGetByDomainId */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API oHpiDomainEntryGetByDomainId ( SAHPI_IN SaHpiDomainIdT DomainId, SAHPI_OUT oHpiDomainEntryT *DomainEntry) { if (!DomainEntry) { return SA_ERR_HPI_INVALID_PARAMS; } // Function may be called before first session was opened, // so we may need to initialize ohc_init(); const ohc_domain_conf *entry = ohc_get_domain_conf(DomainId); if (entry == 0) { // no config for did found return SA_ERR_HPI_NOT_PRESENT; } DomainEntry->id = DomainId; if (oh_init_textbuffer(&DomainEntry->host) != SA_OK) { return SA_ERR_HPI_INVALID_PARAMS; } if (oh_append_textbuffer(&DomainEntry->host, entry->host)!= SA_OK) { return SA_ERR_HPI_INVALID_PARAMS; } DomainEntry->port = entry->port; memcpy(&DomainEntry->entity_root, &entry->entity_root, sizeof(SaHpiEntityPathT)); return SA_OK; } openhpi-3.6.1/baselib/safhpi.cpp0000644000175100017510000030151512575647301015551 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004-2008 * (C) Copyright Pigeon Point Systems. 2010 * (C) Copyright Nokia Siemens Networks 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley * Renier Morales * Anton Pak * Ulrich Kleber * */ #include #include #include #include #include #include #include #include #include "conf.h" #include "init.h" #include "session.h" #include /*----------------------------------------------------------------------------*/ /* Utility functions */ /*----------------------------------------------------------------------------*/ static SaErrorT clean_reading(SaHpiSensorReadingT *read_in, SaHpiSensorReadingT *read_out) { /* This is a workaround against unknown bugs in the marshal code */ if (!read_in || !read_out) return SA_ERR_HPI_INVALID_PARAMS; memset(read_out, 0, sizeof(SaHpiSensorReadingT)); read_out->IsSupported = read_in->IsSupported; if (read_in->IsSupported == SAHPI_TRUE) { if (!oh_lookup_sensorreadingtype(read_in->Type)) { return SA_ERR_HPI_INVALID_DATA; } read_out->Type = read_in->Type; } else { // TODO: Do we need to set dummy & reading type // just to keep marshalling happy? read_out->Type = SAHPI_SENSOR_READING_TYPE_INT64; read_out->Value.SensorInt64 = 0; return SA_OK; } if (read_in->Type == SAHPI_SENSOR_READING_TYPE_INT64) { read_out->Value.SensorInt64 = read_in->Value.SensorInt64; } else if (read_in->Type == SAHPI_SENSOR_READING_TYPE_UINT64) { read_out->Value.SensorUint64 = read_in->Value.SensorUint64; } else if (read_in->Type == SAHPI_SENSOR_READING_TYPE_FLOAT64) { read_out->Value.SensorFloat64 = read_in->Value.SensorFloat64; } else if (read_in->Type == SAHPI_SENSOR_READING_TYPE_BUFFER) { memcpy(read_out->Value.SensorBuffer, read_in->Value.SensorBuffer, SAHPI_SENSOR_BUFFER_LENGTH); } return SA_OK; } static SaErrorT clean_thresholds(SaHpiSensorThresholdsT *thrds_in, SaHpiSensorThresholdsT *thrds_out) { /* This is a workaround against unknown bugs in the marshal code */ SaErrorT rv; if (!thrds_in || !thrds_out) return SA_ERR_HPI_INVALID_PARAMS; rv = clean_reading(&thrds_in->LowCritical, &thrds_out->LowCritical); if (rv != SA_OK) return rv; rv = clean_reading(&thrds_in->LowMajor, &thrds_out->LowMajor); if (rv != SA_OK) return rv; rv = clean_reading(&thrds_in->LowMinor, &thrds_out->LowMinor); if (rv != SA_OK) return rv; rv = clean_reading(&thrds_in->UpCritical, &thrds_out->UpCritical); if (rv != SA_OK) return rv; rv = clean_reading(&thrds_in->UpMajor, &thrds_out->UpMajor); if (rv != SA_OK) return rv; rv = clean_reading(&thrds_in->UpMinor, &thrds_out->UpMinor); if (rv != SA_OK) return rv; rv = clean_reading(&thrds_in->PosThdHysteresis, &thrds_out->PosThdHysteresis); if (rv != SA_OK) return rv; rv = clean_reading(&thrds_in->NegThdHysteresis, &thrds_out->NegThdHysteresis); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiVersionGet */ /*----------------------------------------------------------------------------*/ SaHpiVersionT SAHPI_API saHpiVersionGet (void) { return SAHPI_INTERFACE_VERSION; } /*----------------------------------------------------------------------------*/ /* saHpiInitialize */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiInitialize( SAHPI_IN SaHpiVersionT RequestedVersion, SAHPI_IN SaHpiUint32T NumOptions, SAHPI_INOUT SaHpiInitOptionT *Options, SAHPI_OUT SaHpiUint32T *FailedOption, SAHPI_OUT SaErrorT *OptionError) { if (RequestedVersion < OH_SAHPI_INTERFACE_VERSION_MIN_SUPPORTED || RequestedVersion > OH_SAHPI_INTERFACE_VERSION_MAX_SUPPORTED) { return SA_ERR_HPI_UNSUPPORTED_API; } if ((NumOptions != 0) && (Options == 0)) { return SA_ERR_HPI_INVALID_PARAMS; } for ( size_t i = 0; i < NumOptions; ++i ) { const SaHpiInitOptionT& o = Options[i]; if (o.OptionId >= SA_HPI_INITOPTION_FIRST_OEM ) { continue; } if ( o.OptionId != SA_HPI_INITOPTION_HANDLE_CREATE_THREAD ) { if ( FailedOption ) { *FailedOption = i; } if ( OptionError ) { *OptionError = SA_ERR_HPI_UNKNOWN; } return SA_ERR_HPI_INVALID_DATA; } } // TODO implement more checks from section 5.2.1 of B.03.01 spec // Current implementation does not cover options check // TODO implement any library initialization code here // Current implementation does not utilize this function // return ohc_init(); } /*----------------------------------------------------------------------------*/ /* saHpiFinalize */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiFinalize() { // TODO implement // TODO implement any library finalization code here // Current implementation does not utilize this function return ohc_finit(); } /*----------------------------------------------------------------------------*/ /* saHpiSessionOpen */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiSessionOpen( SAHPI_IN SaHpiDomainIdT DomainId, SAHPI_OUT SaHpiSessionIdT *SessionId, SAHPI_IN void *SecurityParams) { if (!SessionId || SecurityParams) { return SA_ERR_HPI_INVALID_PARAMS; } if (DomainId == SAHPI_UNSPECIFIED_DOMAIN_ID) { DomainId = OH_DEFAULT_DOMAIN_ID; } return ohc_sess_open(DomainId, *SessionId); } /*----------------------------------------------------------------------------*/ /* saHpiSessionClose */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiSessionClose( SAHPI_IN SaHpiSessionIdT SessionId) { return ohc_sess_close(SessionId); } /*----------------------------------------------------------------------------*/ /* saHpiDiscover */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiDiscover( SAHPI_IN SaHpiSessionIdT SessionId) { SaErrorT rv; ClientRpcParams iparams; ClientRpcParams oparams; rv = ohc_sess_rpc(eFsaHpiDiscover, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiDomainInfoGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiDomainInfoGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_OUT SaHpiDomainInfoT *DomainInfo) { SaErrorT rv; if (!DomainInfo) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams; ClientRpcParams oparams(DomainInfo); rv = ohc_sess_rpc(eFsaHpiDomainInfoGet, SessionId, iparams, oparams); /* Set Domain Id to real Domain Id */ if (rv == SA_OK) { rv = ohc_sess_get_did(SessionId, DomainInfo->DomainId); } return rv; } /*----------------------------------------------------------------------------*/ /* saHpiDrtEntryGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiDrtEntryGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiEntryIdT EntryId, SAHPI_OUT SaHpiEntryIdT *NextEntryId, SAHPI_OUT SaHpiDrtEntryT *DrtEntry) { SaErrorT rv; if ((!DrtEntry) || (!NextEntryId) || (EntryId == SAHPI_LAST_ENTRY)) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&EntryId); ClientRpcParams oparams(NextEntryId, DrtEntry); rv = ohc_sess_rpc(eFsaHpiDrtEntryGet, SessionId, iparams, oparams); /* Set Domain Id to real Domain Id */ if (rv == SA_OK) { // TODO: fix me rv = ohc_sess_get_did(SessionId, DrtEntry->DomainId); } return rv; } /*----------------------------------------------------------------------------*/ /* saHpiDomainTagSet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiDomainTagSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiTextBufferT *DomainTag) { SaErrorT rv; if (!DomainTag) { return SA_ERR_HPI_INVALID_PARAMS; } if (!oh_lookup_texttype(DomainTag->DataType)) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(DomainTag); ClientRpcParams oparams; rv = ohc_sess_rpc(eFsaHpiDomainTagSet, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiRptEntryGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiRptEntryGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiEntryIdT EntryId, SAHPI_OUT SaHpiEntryIdT *NextEntryId, SAHPI_OUT SaHpiRptEntryT *RptEntry) { SaErrorT rv; if ((!NextEntryId) || (!RptEntry)) { return SA_ERR_HPI_INVALID_PARAMS; } if (EntryId == SAHPI_LAST_ENTRY) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&EntryId); ClientRpcParams oparams(NextEntryId, RptEntry); rv = ohc_sess_rpc(eFsaHpiRptEntryGet, SessionId, iparams, oparams); if (rv == SA_OK) { SaHpiEntityPathT entity_root; rv = ohc_sess_get_entity_root(SessionId, entity_root); if (rv == SA_OK) { oh_concat_ep(&RptEntry->ResourceEntity, &entity_root); } } return rv; } /*----------------------------------------------------------------------------*/ /* saHpiRptEntryGetByResourceId */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiRptEntryGetByResourceId( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiRptEntryT *RptEntry) { SaErrorT rv; if (ResourceId == SAHPI_UNSPECIFIED_RESOURCE_ID || (!RptEntry)) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&ResourceId); ClientRpcParams oparams(RptEntry); rv = ohc_sess_rpc(eFsaHpiRptEntryGetByResourceId, SessionId, iparams, oparams); if (rv == SA_OK) { SaHpiEntityPathT entity_root; rv = ohc_sess_get_entity_root(SessionId, entity_root); if (rv == SA_OK) { oh_concat_ep(&RptEntry->ResourceEntity, &entity_root); } } return rv; } /*----------------------------------------------------------------------------*/ /* saHpiResourceSeveritySet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiResourceSeveritySet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSeverityT Severity) { SaErrorT rv; if (ResourceId == SAHPI_UNSPECIFIED_RESOURCE_ID) { return SA_ERR_HPI_INVALID_PARAMS; } if (!oh_lookup_severity(Severity)) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&ResourceId, &Severity); ClientRpcParams oparams; rv = ohc_sess_rpc(eFsaHpiResourceSeveritySet, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiResourceTagSet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiResourceTagSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiTextBufferT *ResourceTag) { SaErrorT rv; if (!ResourceTag) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&ResourceId, ResourceTag); ClientRpcParams oparams; rv = ohc_sess_rpc(eFsaHpiResourceTagSet, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiMyEntityPathGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiMyEntityPathGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_OUT SaHpiEntityPathT *EntityPath) { if (!EntityPath) { return SA_ERR_HPI_INVALID_PARAMS; } const SaHpiEntityPathT *my_entity = ohc_get_my_entity(); if ( !my_entity) { return SA_ERR_HPI_UNKNOWN; } *EntityPath = *my_entity; return SA_OK; } /*----------------------------------------------------------------------------*/ /* saHpiResourceIdGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiResourceIdGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_OUT SaHpiResourceIdT *ResourceId) { if (!ResourceId) { return SA_ERR_HPI_INVALID_PARAMS; } SaErrorT rv; SaHpiEntityPathT ep; rv = saHpiMyEntityPathGet( SessionId, &ep ); if ( rv != SA_OK ) { return SA_ERR_HPI_UNKNOWN; } SaHpiUint32T instance = SAHPI_FIRST_ENTRY; SaHpiUint32T rpt_update_count; rv = saHpiGetIdByEntityPath( SessionId, ep, SAHPI_NO_RECORD, &instance, ResourceId, 0, &rpt_update_count ); if ( rv == SA_ERR_HPI_NOT_PRESENT ) { return SA_ERR_HPI_NOT_PRESENT; } else if ( rv != SA_OK ) { return SA_ERR_HPI_UNKNOWN; } return SA_OK; } /*----------------------------------------------------------------------------*/ /* saHpiGetIdByEntityPath */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiGetIdByEntityPath( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiEntityPathT EntityPath, SAHPI_IN SaHpiRdrTypeT InstrumentType, SAHPI_INOUT SaHpiUint32T *InstanceId, SAHPI_OUT SaHpiResourceIdT *ResourceId, SAHPI_OUT SaHpiInstrumentIdT *InstrumentId, SAHPI_OUT SaHpiUint32T *RptUpdateCount) { SaErrorT rv; SaHpiInstrumentIdT instrument_id; if ((!ResourceId) || (!InstanceId) || (*InstanceId == SAHPI_LAST_ENTRY) || (!RptUpdateCount) || ((!InstrumentId) && (InstrumentType != SAHPI_NO_RECORD))) { return SA_ERR_HPI_INVALID_PARAMS; } if (!InstrumentId) { InstrumentId = &instrument_id; } SaHpiEntityPathT entity_root; rv = ohc_sess_get_entity_root(SessionId, entity_root); if (rv != SA_OK) { return rv; } // Remove domain entity_root from the EntityPath SaHpiEntityPathT ep; rv = oh_get_child_ep(&EntityPath, &entity_root, &ep); if (rv != SA_OK) { return rv; } ClientRpcParams iparams(&ep, &InstrumentType, InstanceId); ClientRpcParams oparams(InstanceId, ResourceId, InstrumentId, RptUpdateCount); rv = ohc_sess_rpc(eFsaHpiGetIdByEntityPath, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiGetChildEntityPath */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiGetChildEntityPath( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiEntityPathT ParentEntityPath, SAHPI_INOUT SaHpiUint32T *InstanceId, SAHPI_OUT SaHpiEntityPathT *ChildEntityPath, SAHPI_OUT SaHpiUint32T *RptUpdateCount) { SaErrorT rv; if ((!InstanceId) || (*InstanceId == SAHPI_LAST_ENTRY) || (!RptUpdateCount)) { return SA_ERR_HPI_INVALID_PARAMS; } if (!ChildEntityPath) { return SA_ERR_HPI_INVALID_PARAMS; } SaHpiEntityPathT entity_root; rv = ohc_sess_get_entity_root(SessionId, entity_root); if (rv != SA_OK) { return rv; } // Remove domain entity_root from the ParentEntityPath SaHpiEntityPathT parent; oh_init_ep(&parent); if (oh_ep_len(&ParentEntityPath) > 0) { rv = oh_get_child_ep(&ParentEntityPath, &entity_root, &parent); if (rv != SA_OK) { if ( rv == SA_ERR_HPI_NOT_PRESENT ) { rv = SA_ERR_HPI_INVALID_DATA; } return rv; } } ClientRpcParams iparams(&parent, InstanceId); ClientRpcParams oparams(InstanceId, ChildEntityPath, RptUpdateCount); rv = ohc_sess_rpc(eFsaHpiGetChildEntityPath, SessionId, iparams, oparams); // Add domain entity_root to obtained child if (rv == SA_OK) { oh_concat_ep(ChildEntityPath, &entity_root); } return rv; } /*----------------------------------------------------------------------------*/ /* saHpiResourceFailedRemove */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiResourceFailedRemove( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId) { SaErrorT rv; ClientRpcParams iparams(&ResourceId); ClientRpcParams oparams; rv = ohc_sess_rpc(eFsaHpiResourceFailedRemove, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiEventLogInfoGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiEventLogInfoGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiEventLogInfoT *Info) { SaErrorT rv; if (!Info) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&ResourceId); ClientRpcParams oparams(Info); rv = ohc_sess_rpc(eFsaHpiEventLogInfoGet, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiEventLogCapabilitiesGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiEventLogCapabilitiesGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiEventLogCapabilitiesT *EventLogCapabilities) { SaErrorT rv; if (!EventLogCapabilities) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&ResourceId); ClientRpcParams oparams(EventLogCapabilities); rv = ohc_sess_rpc(eFsaHpiEventLogCapabilitiesGet, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiEventLogEntryGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiEventLogEntryGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiEntryIdT EntryId, SAHPI_OUT SaHpiEventLogEntryIdT *PrevEntryId, SAHPI_OUT SaHpiEventLogEntryIdT *NextEntryId, SAHPI_OUT SaHpiEventLogEntryT *EventLogEntry, SAHPI_INOUT SaHpiRdrT *Rdr, SAHPI_INOUT SaHpiRptEntryT *RptEntry) { SaErrorT rv; if ((!PrevEntryId) || (!EventLogEntry) || (!NextEntryId) || (EntryId == SAHPI_NO_MORE_ENTRIES)) { return SA_ERR_HPI_INVALID_PARAMS; } SaHpiRdrT rdr; SaHpiRptEntryT rpte; ClientRpcParams iparams(&ResourceId, &EntryId); ClientRpcParams oparams(PrevEntryId, NextEntryId, EventLogEntry, &rdr, &rpte); rv = ohc_sess_rpc(eFsaHpiEventLogEntryGet, SessionId, iparams, oparams); if (Rdr) { memcpy(Rdr, &rdr, sizeof(SaHpiRdrT)); } if (RptEntry) { memcpy(RptEntry, &rpte, sizeof(SaHpiRptEntryT)); } /* If this event is Domain Event, then adjust DomainId */ if ((ResourceId == SAHPI_UNSPECIFIED_RESOURCE_ID) && (EventLogEntry->Event.EventType == SAHPI_ET_DOMAIN)) { if (rv == SA_OK) { SaHpiDomainIdT did; rv = ohc_sess_get_did(SessionId, did ); EventLogEntry->Event.EventDataUnion.DomainEvent.DomainId = did; } } if (rv == SA_OK) { SaHpiEntityPathT entity_root; rv = ohc_sess_get_entity_root(SessionId, entity_root); if ((rv == SA_OK) && RptEntry) { oh_concat_ep(&RptEntry->ResourceEntity, &entity_root); } if ((rv == SA_OK) && Rdr) { oh_concat_ep(&Rdr->Entity, &entity_root); } } return rv; } /*----------------------------------------------------------------------------*/ /* saHpiEventLogEntryAdd */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiEventLogEntryAdd( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiEventT *EvtEntry) { SaErrorT rv; if (!EvtEntry) { return SA_ERR_HPI_INVALID_PARAMS; } if (EvtEntry->EventType != SAHPI_ET_USER || EvtEntry->Source != SAHPI_UNSPECIFIED_RESOURCE_ID) { return SA_ERR_HPI_INVALID_PARAMS; } if (!oh_lookup_severity(EvtEntry->Severity)) { return SA_ERR_HPI_INVALID_PARAMS; } if (!oh_valid_textbuffer(&EvtEntry->EventDataUnion.UserEvent.UserEventData)) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&ResourceId, EvtEntry); ClientRpcParams oparams; rv = ohc_sess_rpc(eFsaHpiEventLogEntryAdd, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiEventLogClear */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiEventLogClear( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId) { SaErrorT rv; ClientRpcParams iparams(&ResourceId); ClientRpcParams oparams; rv = ohc_sess_rpc(eFsaHpiEventLogClear, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiEventLogTimeGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiEventLogTimeGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiTimeT *Time) { SaErrorT rv; if (!Time) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&ResourceId); ClientRpcParams oparams(Time); rv = ohc_sess_rpc(eFsaHpiEventLogTimeGet, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiEventLogTimeSet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiEventLogTimeSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiTimeT Time) { SaErrorT rv; ClientRpcParams iparams(&ResourceId, &Time); ClientRpcParams oparams; rv = ohc_sess_rpc(eFsaHpiEventLogTimeSet, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiEventLogStateGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiEventLogStateGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiBoolT *EnableState) { SaErrorT rv; if (!EnableState) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&ResourceId); ClientRpcParams oparams(EnableState); rv = ohc_sess_rpc(eFsaHpiEventLogStateGet, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiEventLogStateSet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiEventLogStateSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiBoolT EnableState) { SaErrorT rv; ClientRpcParams iparams(&ResourceId, &EnableState); ClientRpcParams oparams; rv = ohc_sess_rpc(eFsaHpiEventLogStateSet, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiEventLogOverflowReset */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiEventLogOverflowReset( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId) { SaErrorT rv; ClientRpcParams iparams(&ResourceId); ClientRpcParams oparams; rv = ohc_sess_rpc(eFsaHpiEventLogOverflowReset, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiSubscribe */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiSubscribe( SAHPI_IN SaHpiSessionIdT SessionId) { SaErrorT rv; ClientRpcParams iparams; ClientRpcParams oparams; rv = ohc_sess_rpc(eFsaHpiSubscribe, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiUnsSubscribe */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiUnsubscribe( SAHPI_IN SaHpiSessionIdT SessionId) { SaErrorT rv; ClientRpcParams iparams; ClientRpcParams oparams; rv = ohc_sess_rpc(eFsaHpiUnsubscribe, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiEventGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiEventGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiTimeoutT Timeout, SAHPI_OUT SaHpiEventT *Event, SAHPI_INOUT SaHpiRdrT *Rdr, SAHPI_INOUT SaHpiRptEntryT *RptEntry, SAHPI_INOUT SaHpiEvtQueueStatusT *EventQueueStatus) { SaErrorT rv; if (Timeout < SAHPI_TIMEOUT_BLOCK || !Event) { return SA_ERR_HPI_INVALID_PARAMS; } SaHpiRdrT rdr; SaHpiRptEntryT rpte; SaHpiEvtQueueStatusT status; ClientRpcParams iparams(&Timeout); ClientRpcParams oparams(Event, &rdr, &rpte, &status); rv = ohc_sess_rpc(eFsaHpiEventGet, SessionId, iparams, oparams); if (Rdr) { memcpy(Rdr, &rdr, sizeof(SaHpiRdrT)); } if (RptEntry) { memcpy(RptEntry, &rpte, sizeof(SaHpiRptEntryT)); } if (EventQueueStatus) { memcpy(EventQueueStatus, &status, sizeof(SaHpiEvtQueueStatusT)); } if (rv == SA_OK) { SaHpiEntityPathT entity_root; rv = ohc_sess_get_entity_root(SessionId, entity_root); if ((rv == SA_OK) && RptEntry) { oh_concat_ep(&RptEntry->ResourceEntity, &entity_root); } if ((rv == SA_OK) && Rdr) { oh_concat_ep(&Rdr->Entity, &entity_root); } } return rv; } /*----------------------------------------------------------------------------*/ /* saHpiEventAdd */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiEventAdd( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiEventT *Event) { SaErrorT rv; rv = oh_valid_addevent(Event); if (rv != SA_OK) return rv; ClientRpcParams iparams(Event); ClientRpcParams oparams; rv = ohc_sess_rpc(eFsaHpiEventAdd, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiAlarmGetNext */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiAlarmGetNext( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiSeverityT Severity, SAHPI_IN SaHpiBoolT Unack, SAHPI_INOUT SaHpiAlarmT *Alarm) { SaErrorT rv; if (!Alarm) { return SA_ERR_HPI_INVALID_PARAMS; } if (!oh_lookup_severity(Severity)) { return SA_ERR_HPI_INVALID_PARAMS; } if (Alarm->AlarmId == SAHPI_LAST_ENTRY) { return SA_ERR_HPI_NOT_PRESENT; } ClientRpcParams iparams(&Severity, &Unack, Alarm); ClientRpcParams oparams(Alarm); rv = ohc_sess_rpc(eFsaHpiAlarmGetNext, SessionId, iparams, oparams); /* Set Alarm DomainId to DomainId that HPI Application sees */ if (rv == SA_OK) { rv = ohc_sess_get_did(SessionId, Alarm->AlarmCond.DomainId); } if (rv == SA_OK) { SaHpiEntityPathT entity_root; rv = ohc_sess_get_entity_root(SessionId, entity_root); if (rv == SA_OK) { if (Alarm->AlarmCond.Type != SAHPI_STATUS_COND_TYPE_USER) { // We do not append entity root to user added alarm oh_concat_ep(&Alarm->AlarmCond.Entity, &entity_root); } } } return rv; } /*----------------------------------------------------------------------------*/ /* saHpiAlarmGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiAlarmGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiAlarmIdT AlarmId, SAHPI_OUT SaHpiAlarmT *Alarm) { SaErrorT rv; if (!Alarm) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&AlarmId); ClientRpcParams oparams(Alarm); rv = ohc_sess_rpc(eFsaHpiAlarmGet, SessionId, iparams, oparams); /* Set Alarm DomainId to DomainId that HPI Application sees */ if (rv == SA_OK) { rv = ohc_sess_get_did(SessionId, Alarm->AlarmCond.DomainId); } if (rv == SA_OK) { SaHpiEntityPathT entity_root; rv = ohc_sess_get_entity_root(SessionId, entity_root); if (rv == SA_OK) { if (Alarm->AlarmCond.Type != SAHPI_STATUS_COND_TYPE_USER) { // We do not append entity root to user added alarm oh_concat_ep(&Alarm->AlarmCond.Entity, &entity_root); } } } return rv; } /*----------------------------------------------------------------------------*/ /* saHpiAlarmAcknowledge */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiAlarmAcknowledge( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiAlarmIdT AlarmId, SAHPI_IN SaHpiSeverityT Severity) { SaErrorT rv; if (AlarmId == SAHPI_ENTRY_UNSPECIFIED && !oh_lookup_severity(Severity)) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&AlarmId, &Severity); ClientRpcParams oparams; rv = ohc_sess_rpc(eFsaHpiAlarmAcknowledge, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiAlarmAdd */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiAlarmAdd( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_INOUT SaHpiAlarmT *Alarm) { SaErrorT rv; if (!Alarm || !oh_lookup_severity(Alarm->Severity) || Alarm->AlarmCond.Type != SAHPI_STATUS_COND_TYPE_USER) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(Alarm); ClientRpcParams oparams(Alarm); rv = ohc_sess_rpc(eFsaHpiAlarmAdd, SessionId, iparams, oparams); /* Set Alarm DomainId to DomainId that HPI Application sees */ if (rv == SA_OK) { rv = ohc_sess_get_did(SessionId, Alarm->AlarmCond.DomainId); } /* NB: We do not modify entity path here. */ return rv; } /*----------------------------------------------------------------------------*/ /* saHpiAlarmDelete */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiAlarmDelete( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiAlarmIdT AlarmId, SAHPI_IN SaHpiSeverityT Severity) { SaErrorT rv; if (AlarmId == SAHPI_ENTRY_UNSPECIFIED && !oh_lookup_severity(Severity)) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&AlarmId, &Severity); ClientRpcParams oparams; rv = ohc_sess_rpc(eFsaHpiAlarmDelete, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiRdrGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiRdrGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiEntryIdT EntryId, SAHPI_OUT SaHpiEntryIdT *NextEntryId, SAHPI_OUT SaHpiRdrT *Rdr) { SaErrorT rv; if (EntryId == SAHPI_LAST_ENTRY || !Rdr || !NextEntryId) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&ResourceId, &EntryId); ClientRpcParams oparams(NextEntryId, Rdr); rv = ohc_sess_rpc(eFsaHpiRdrGet, SessionId, iparams, oparams); if (rv == SA_OK) { SaHpiEntityPathT entity_root; rv = ohc_sess_get_entity_root(SessionId, entity_root); if (rv == SA_OK) { oh_concat_ep(&Rdr->Entity, &entity_root); } } return rv; } /*----------------------------------------------------------------------------*/ /* saHpiRdrGetByInstrumentId */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiRdrGetByInstrumentId( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiRdrTypeT RdrType, SAHPI_IN SaHpiInstrumentIdT InstrumentId, SAHPI_OUT SaHpiRdrT *Rdr) { SaErrorT rv; if (!oh_lookup_rdrtype(RdrType) || RdrType == SAHPI_NO_RECORD || !Rdr) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&ResourceId, &RdrType, &InstrumentId); ClientRpcParams oparams(Rdr); rv = ohc_sess_rpc(eFsaHpiRdrGetByInstrumentId, SessionId, iparams, oparams); if (rv == SA_OK) { SaHpiEntityPathT entity_root; rv = ohc_sess_get_entity_root(SessionId, entity_root); if (rv == SA_OK) { oh_concat_ep(&Rdr->Entity, &entity_root); } } return rv; } /*----------------------------------------------------------------------------*/ /* saHpiRdrUpdateCountGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiRdrUpdateCountGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiUint32T *UpdateCount) { SaErrorT rv; if (!UpdateCount) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&ResourceId); ClientRpcParams oparams(UpdateCount); rv = ohc_sess_rpc(eFsaHpiRdrUpdateCountGet, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiSensorReadingGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiSensorReadingGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_INOUT SaHpiSensorReadingT *Reading, SAHPI_INOUT SaHpiEventStateT *EventState) { SaErrorT rv; SaHpiSensorReadingT reading; SaHpiEventStateT state; ClientRpcParams iparams(&ResourceId, &SensorNum); ClientRpcParams oparams(&reading, &state); rv = ohc_sess_rpc(eFsaHpiSensorReadingGet, SessionId, iparams, oparams); if (Reading) { memcpy(Reading, &reading, sizeof(SaHpiSensorReadingT)); } if (EventState) { memcpy(EventState, &state, sizeof(SaHpiEventStateT)); } return rv; } /*----------------------------------------------------------------------------*/ /* saHpiSensorThresholdsGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiSensorThresholdsGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_OUT SaHpiSensorThresholdsT *Thresholds) { SaErrorT rv; if (!Thresholds) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&ResourceId, &SensorNum); ClientRpcParams oparams(Thresholds); rv = ohc_sess_rpc(eFsaHpiSensorThresholdsGet, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiSensorThresholdsSet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiSensorThresholdsSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_IN SaHpiSensorThresholdsT *Thresholds) { SaErrorT rv; SaHpiSensorThresholdsT tholds; if (!Thresholds) { return SA_ERR_HPI_INVALID_PARAMS; } rv = clean_thresholds(Thresholds, &tholds); if (rv != SA_OK) return rv; ClientRpcParams iparams(&ResourceId, &SensorNum, &tholds); ClientRpcParams oparams; rv = ohc_sess_rpc(eFsaHpiSensorThresholdsSet, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiSensorTypeGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiSensorTypeGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_OUT SaHpiSensorTypeT *Type, SAHPI_OUT SaHpiEventCategoryT *Category) { SaErrorT rv; if (!Type || !Category) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&ResourceId, &SensorNum); ClientRpcParams oparams(Type, Category); rv = ohc_sess_rpc(eFsaHpiSensorTypeGet, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiSensorEnableGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiSensorEnableGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_OUT SaHpiBoolT *Enabled) { SaErrorT rv; if (!Enabled) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&ResourceId, &SensorNum); ClientRpcParams oparams(Enabled); rv = ohc_sess_rpc(eFsaHpiSensorEnableGet, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiSensorEnableSet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiSensorEnableSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_IN SaHpiBoolT Enabled) { SaErrorT rv; ClientRpcParams iparams(&ResourceId, &SensorNum, &Enabled); ClientRpcParams oparams; rv = ohc_sess_rpc(eFsaHpiSensorEnableSet, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiSensorEventEnableGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiSensorEventEnableGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_OUT SaHpiBoolT *Enabled) { SaErrorT rv; if (!Enabled) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&ResourceId, &SensorNum); ClientRpcParams oparams(Enabled); rv = ohc_sess_rpc(eFsaHpiSensorEventEnableGet, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiSensorEventEnableSet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiSensorEventEnableSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_IN SaHpiBoolT Enabled) { SaErrorT rv; ClientRpcParams iparams(&ResourceId, &SensorNum, &Enabled); ClientRpcParams oparams; rv = ohc_sess_rpc(eFsaHpiSensorEventEnableSet, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiSensorEventMasksGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiSensorEventMasksGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_INOUT SaHpiEventStateT *Assert, SAHPI_INOUT SaHpiEventStateT *Deassert) { SaErrorT rv; SaHpiEventStateT assert, deassert; ClientRpcParams iparams(&ResourceId, &SensorNum, &assert, &deassert); ClientRpcParams oparams(&assert, &deassert); rv = ohc_sess_rpc(eFsaHpiSensorEventMasksGet, SessionId, iparams, oparams); if (Assert) { *Assert = assert; } if (Deassert) { *Deassert = deassert; } return rv; } /*----------------------------------------------------------------------------*/ /* saHpiSensorEventMasksSet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiSensorEventMasksSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_IN SaHpiSensorEventMaskActionT Action, SAHPI_IN SaHpiEventStateT Assert, SAHPI_IN SaHpiEventStateT Deassert) { SaErrorT rv; ClientRpcParams iparams(&ResourceId, &SensorNum, &Action, &Assert, &Deassert); ClientRpcParams oparams; rv = ohc_sess_rpc(eFsaHpiSensorEventMasksSet, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiControlTypeGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiControlTypeGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiCtrlNumT CtrlNum, SAHPI_OUT SaHpiCtrlTypeT *Type) { SaErrorT rv; if (!Type) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&ResourceId, &CtrlNum); ClientRpcParams oparams(Type); rv = ohc_sess_rpc(eFsaHpiControlTypeGet, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiControlGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiControlGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiCtrlNumT CtrlNum, SAHPI_OUT SaHpiCtrlModeT *Mode, SAHPI_INOUT SaHpiCtrlStateT *State) { SaErrorT rv; SaHpiCtrlModeT mode; SaHpiCtrlStateT state; if (State) { memcpy(&state, State, sizeof(SaHpiCtrlStateT)); if (!oh_lookup_ctrltype(state.Type)) { state.Type = SAHPI_CTRL_TYPE_TEXT; state.StateUnion.Text.Line = SAHPI_TLN_ALL_LINES; } } else { state.Type = SAHPI_CTRL_TYPE_TEXT; state.StateUnion.Text.Line = SAHPI_TLN_ALL_LINES; } ClientRpcParams iparams(&ResourceId, &CtrlNum, &state); ClientRpcParams oparams(&mode, &state); rv = ohc_sess_rpc(eFsaHpiControlGet, SessionId, iparams, oparams); if (Mode) { memcpy(Mode, &mode, sizeof(SaHpiCtrlModeT)); } if (State) { memcpy(State, &state, sizeof(SaHpiCtrlStateT)); } return rv; } /*----------------------------------------------------------------------------*/ /* saHpiControlSet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiControlSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiCtrlNumT CtrlNum, SAHPI_IN SaHpiCtrlModeT Mode, SAHPI_IN SaHpiCtrlStateT *State) { SaErrorT rv; SaHpiCtrlStateT mystate, *pmystate = 0; if (!oh_lookup_ctrlmode(Mode) || (Mode != SAHPI_CTRL_MODE_AUTO && !State) || (State && State->Type == SAHPI_CTRL_TYPE_DIGITAL && !oh_lookup_ctrlstatedigital(State->StateUnion.Digital)) || (State && State->Type == SAHPI_CTRL_TYPE_STREAM && State->StateUnion.Stream.StreamLength > SAHPI_CTRL_MAX_STREAM_LENGTH)) { return SA_ERR_HPI_INVALID_PARAMS; } memset(&mystate, 0, sizeof(SaHpiCtrlStateT)); if (Mode == SAHPI_CTRL_MODE_AUTO) { pmystate = &mystate; } else if (State && !oh_lookup_ctrltype(State->Type)) { return SA_ERR_HPI_INVALID_DATA; } else { pmystate = State; } ClientRpcParams iparams(&ResourceId, &CtrlNum, &Mode, pmystate); ClientRpcParams oparams; rv = ohc_sess_rpc(eFsaHpiControlSet, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiIdrInfoGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiIdrInfoGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT Idrid, SAHPI_OUT SaHpiIdrInfoT *Info) { SaErrorT rv; if (!Info) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&ResourceId, &Idrid); ClientRpcParams oparams(Info); rv = ohc_sess_rpc(eFsaHpiIdrInfoGet, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiIdrAreaHeaderGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiIdrAreaHeaderGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT Idrid, SAHPI_IN SaHpiIdrAreaTypeT AreaType, SAHPI_IN SaHpiEntryIdT AreaId, SAHPI_OUT SaHpiEntryIdT *NextAreaId, SAHPI_OUT SaHpiIdrAreaHeaderT *Header) { SaErrorT rv; if (((AreaType < SAHPI_IDR_AREATYPE_INTERNAL_USE) || ((AreaType > SAHPI_IDR_AREATYPE_PRODUCT_INFO) && (AreaType != SAHPI_IDR_AREATYPE_UNSPECIFIED) && (AreaType != SAHPI_IDR_AREATYPE_OEM)) || (AreaId == SAHPI_LAST_ENTRY)|| (!NextAreaId) || (!Header))) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&ResourceId, &Idrid, &AreaType, &AreaId); ClientRpcParams oparams(NextAreaId, Header); rv = ohc_sess_rpc(eFsaHpiIdrAreaHeaderGet, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiIdrAreaAdd */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiIdrAreaAdd( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT Idrid, SAHPI_IN SaHpiIdrAreaTypeT AreaType, SAHPI_OUT SaHpiEntryIdT *AreaId) { SaErrorT rv; if (!oh_lookup_idrareatype(AreaType) || (!AreaId) ) { return SA_ERR_HPI_INVALID_PARAMS; } else if (AreaType == SAHPI_IDR_AREATYPE_UNSPECIFIED) { return SA_ERR_HPI_INVALID_DATA; } ClientRpcParams iparams(&ResourceId, &Idrid, &AreaType); ClientRpcParams oparams(AreaId); rv = ohc_sess_rpc(eFsaHpiIdrAreaAdd, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiIdrAreaAddById */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiIdrAreaAddById( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT Idrid, SAHPI_IN SaHpiIdrAreaTypeT AreaType, SAHPI_IN SaHpiEntryIdT AreaId) { SaErrorT rv; if (!oh_lookup_idrareatype(AreaType)) { return SA_ERR_HPI_INVALID_PARAMS; } else if (AreaType == SAHPI_IDR_AREATYPE_UNSPECIFIED) { return SA_ERR_HPI_INVALID_DATA; } ClientRpcParams iparams(&ResourceId, &Idrid, &AreaType, &AreaId); ClientRpcParams oparams; rv = ohc_sess_rpc(eFsaHpiIdrAreaAddById, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiIdrAreaDelete */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiIdrAreaDelete( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT Idrid, SAHPI_IN SaHpiEntryIdT AreaId) { SaErrorT rv; if (AreaId == SAHPI_LAST_ENTRY) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&ResourceId, &Idrid, &AreaId); ClientRpcParams oparams; rv = ohc_sess_rpc(eFsaHpiIdrAreaDelete, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiIdrFieldGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiIdrFieldGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT Idrid, SAHPI_IN SaHpiEntryIdT AreaId, SAHPI_IN SaHpiIdrFieldTypeT FieldType, SAHPI_IN SaHpiEntryIdT FieldId, SAHPI_OUT SaHpiEntryIdT *NextId, SAHPI_OUT SaHpiIdrFieldT *Field) { SaErrorT rv; if (!Field || !oh_lookup_idrfieldtype(FieldType) || AreaId == SAHPI_LAST_ENTRY || FieldId == SAHPI_LAST_ENTRY || !NextId) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&ResourceId, &Idrid, &AreaId, &FieldType, &FieldId); ClientRpcParams oparams(NextId, Field); rv = ohc_sess_rpc(eFsaHpiIdrFieldGet, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiIdrFieldAdd */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiIdrFieldAdd( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT Idrid, SAHPI_INOUT SaHpiIdrFieldT *Field) { SaErrorT rv; if (!Field) { return SA_ERR_HPI_INVALID_PARAMS; } else if (!oh_lookup_idrfieldtype(Field->Type)) { return SA_ERR_HPI_INVALID_PARAMS; } else if (Field->Type == SAHPI_IDR_FIELDTYPE_UNSPECIFIED) { return SA_ERR_HPI_INVALID_PARAMS; } else if (oh_valid_textbuffer(&Field->Field) != SAHPI_TRUE) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&ResourceId, &Idrid, Field); ClientRpcParams oparams(Field); rv = ohc_sess_rpc(eFsaHpiIdrFieldAdd, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiIdrFieldAddById */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiIdrFieldAddById( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT Idrid, SAHPI_INOUT SaHpiIdrFieldT *Field) { SaErrorT rv; if (!Field) { return SA_ERR_HPI_INVALID_PARAMS; } else if (!oh_lookup_idrfieldtype(Field->Type)) { return SA_ERR_HPI_INVALID_PARAMS; } else if (Field->Type == SAHPI_IDR_FIELDTYPE_UNSPECIFIED) { return SA_ERR_HPI_INVALID_PARAMS; } else if (oh_valid_textbuffer(&Field->Field) != SAHPI_TRUE) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&ResourceId, &Idrid, Field); ClientRpcParams oparams(Field); rv = ohc_sess_rpc(eFsaHpiIdrFieldAddById, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiIdrFieldSet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiIdrFieldSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT Idrid, SAHPI_IN SaHpiIdrFieldT *Field) { SaErrorT rv; if (!Field) { return SA_ERR_HPI_INVALID_PARAMS; } if (Field->Type > SAHPI_IDR_FIELDTYPE_CUSTOM) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&ResourceId, &Idrid, Field); ClientRpcParams oparams; rv = ohc_sess_rpc(eFsaHpiIdrFieldSet, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiIdrFieldDelete */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiIdrFieldDelete( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT Idrid, SAHPI_IN SaHpiEntryIdT AreaId, SAHPI_IN SaHpiEntryIdT FieldId) { SaErrorT rv; if (FieldId == SAHPI_LAST_ENTRY || AreaId == SAHPI_LAST_ENTRY) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&ResourceId, &Idrid, &AreaId, &FieldId); ClientRpcParams oparams; rv = ohc_sess_rpc(eFsaHpiIdrFieldDelete, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiWatchdogTimerGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiWatchdogTimerGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiWatchdogNumT WatchdogNum, SAHPI_OUT SaHpiWatchdogT *Watchdog) { SaErrorT rv; if (!Watchdog) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&ResourceId, &WatchdogNum); ClientRpcParams oparams(Watchdog); rv = ohc_sess_rpc(eFsaHpiWatchdogTimerGet, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiWatchdogTimerSet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiWatchdogTimerSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiWatchdogNumT WatchdogNum, SAHPI_IN SaHpiWatchdogT *Watchdog) { SaErrorT rv; if (!Watchdog || !oh_lookup_watchdogtimeruse(Watchdog->TimerUse) || !oh_lookup_watchdogaction(Watchdog->TimerAction) || !oh_lookup_watchdogpretimerinterrupt(Watchdog->PretimerInterrupt)) { return SA_ERR_HPI_INVALID_PARAMS; } if (Watchdog->PreTimeoutInterval > Watchdog->InitialCount) { return SA_ERR_HPI_INVALID_DATA; } ClientRpcParams iparams(&ResourceId, &WatchdogNum, Watchdog); ClientRpcParams oparams; rv = ohc_sess_rpc(eFsaHpiWatchdogTimerSet, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiWatchdogTimerReset */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiWatchdogTimerReset( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiWatchdogNumT WatchdogNum) { SaErrorT rv; ClientRpcParams iparams(&ResourceId, &WatchdogNum); ClientRpcParams oparams; rv = ohc_sess_rpc(eFsaHpiWatchdogTimerReset, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiAnnunciatorGetNext */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiAnnunciatorGetNext( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiAnnunciatorNumT AnnNum, SAHPI_IN SaHpiSeverityT Severity, SAHPI_IN SaHpiBoolT Unack, SAHPI_INOUT SaHpiAnnouncementT *Announcement) { SaErrorT rv; if (!Announcement) { return SA_ERR_HPI_INVALID_PARAMS; } if (!oh_lookup_severity(Severity)) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&ResourceId, &AnnNum, &Severity, &Unack, Announcement); ClientRpcParams oparams(Announcement); rv = ohc_sess_rpc(eFsaHpiAnnunciatorGetNext, SessionId, iparams, oparams); /* Set Announcement DomainId to DomainId that HPI Application sees */ if (rv == SA_OK) { rv = ohc_sess_get_did(SessionId, Announcement->StatusCond.DomainId); } if (rv == SA_OK) { SaHpiEntityPathT entity_root; rv = ohc_sess_get_entity_root(SessionId, entity_root); if ((rv == SA_OK) && (Announcement->AddedByUser == SAHPI_FALSE)) { // We do not append entity root to user added announcement oh_concat_ep(&Announcement->StatusCond.Entity, &entity_root); } } return rv; } /*----------------------------------------------------------------------------*/ /* saHpiAnnunciatorGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiAnnunciatorGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiAnnunciatorNumT AnnNum, SAHPI_IN SaHpiEntryIdT EntryId, SAHPI_OUT SaHpiAnnouncementT *Announcement) { SaErrorT rv; if (!Announcement) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&ResourceId, &AnnNum, &EntryId); ClientRpcParams oparams(Announcement); rv = ohc_sess_rpc(eFsaHpiAnnunciatorGet, SessionId, iparams, oparams); /* Set Announcement DomainId to DomainId that HPI Application sees */ if (rv == SA_OK) { rv = ohc_sess_get_did(SessionId, Announcement->StatusCond.DomainId); } if (rv == SA_OK) { SaHpiEntityPathT entity_root; rv = ohc_sess_get_entity_root(SessionId, entity_root); if ((rv == SA_OK) && (Announcement->AddedByUser == SAHPI_FALSE)) { // We do not append entity root to user added announcement oh_concat_ep(&Announcement->StatusCond.Entity, &entity_root); } } return rv; } /*----------------------------------------------------------------------------*/ /* saHpiAnnunciatorAcknowledge */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiAnnunciatorAcknowledge( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiAnnunciatorNumT AnnNum, SAHPI_IN SaHpiEntryIdT EntryId, SAHPI_IN SaHpiSeverityT Severity) { SaErrorT rv; SaHpiSeverityT sev = SAHPI_DEBUG; if (EntryId == SAHPI_ENTRY_UNSPECIFIED) { if (!oh_lookup_severity(Severity)) { return SA_ERR_HPI_INVALID_PARAMS; } else { sev = Severity; } } ClientRpcParams iparams(&ResourceId, &AnnNum, &EntryId, &sev); ClientRpcParams oparams; rv = ohc_sess_rpc(eFsaHpiAnnunciatorAcknowledge, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiAnnunciatorAdd */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiAnnunciatorAdd( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiAnnunciatorNumT AnnNum, SAHPI_INOUT SaHpiAnnouncementT *Announcement) { SaErrorT rv; if (!Announcement) { return SA_ERR_HPI_INVALID_PARAMS; } if (Announcement->Severity == SAHPI_ALL_SEVERITIES || !oh_lookup_severity(Announcement->Severity) || !oh_valid_textbuffer(&Announcement->StatusCond.Data) || !oh_lookup_statuscondtype(Announcement->StatusCond.Type)) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&ResourceId, &AnnNum, Announcement); ClientRpcParams oparams(Announcement); rv = ohc_sess_rpc(eFsaHpiAnnunciatorAdd, SessionId, iparams, oparams); /* NB: We do not modify entity path here. */ return rv; } /*----------------------------------------------------------------------------*/ /* saHpiAnnunciatorDelete */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiAnnunciatorDelete( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiAnnunciatorNumT AnnNum, SAHPI_IN SaHpiEntryIdT EntryId, SAHPI_IN SaHpiSeverityT Severity) { SaErrorT rv; SaHpiSeverityT sev = SAHPI_DEBUG; if (EntryId == SAHPI_ENTRY_UNSPECIFIED) { if (!oh_lookup_severity(Severity)) { return SA_ERR_HPI_INVALID_PARAMS; } else { sev = Severity; } } ClientRpcParams iparams(&ResourceId, &AnnNum, &EntryId, &sev); ClientRpcParams oparams; rv = ohc_sess_rpc(eFsaHpiAnnunciatorDelete, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiAnnunciatorModeGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiAnnunciatorModeGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiAnnunciatorNumT AnnNum, SAHPI_OUT SaHpiAnnunciatorModeT *Mode) { SaErrorT rv; if (!Mode) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&ResourceId, &AnnNum); ClientRpcParams oparams(Mode); rv = ohc_sess_rpc(eFsaHpiAnnunciatorModeGet, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiAnnunciatorModeSet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiAnnunciatorModeSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiAnnunciatorNumT AnnNum, SAHPI_IN SaHpiAnnunciatorModeT Mode) { SaErrorT rv; if (!oh_lookup_annunciatormode(Mode)) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&ResourceId, &AnnNum, &Mode); ClientRpcParams oparams; rv = ohc_sess_rpc(eFsaHpiAnnunciatorModeSet, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiDimiInfoGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiDimiInfoGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiDimiNumT DimiNum, SAHPI_OUT SaHpiDimiInfoT *DimiInfo) { SaErrorT rv; if (!DimiInfo) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&ResourceId, &DimiNum); ClientRpcParams oparams(DimiInfo); rv = ohc_sess_rpc(eFsaHpiDimiInfoGet, SessionId, iparams, oparams); return rv; } SaErrorT SAHPI_API saHpiDimiTestInfoGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiDimiNumT DimiNum, SAHPI_IN SaHpiDimiTestNumT TestNum, SAHPI_OUT SaHpiDimiTestT *DimiTest) { SaErrorT rv; if (!DimiTest) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&ResourceId, &DimiNum, &TestNum); ClientRpcParams oparams(DimiTest); rv = ohc_sess_rpc(eFsaHpiDimiTestInfoGet, SessionId, iparams, oparams); if (rv == SA_OK) { SaHpiEntityPathT entity_root; rv = ohc_sess_get_entity_root(SessionId, entity_root); if (rv == SA_OK) { for ( size_t i = 0; i < SAHPI_DIMITEST_MAX_ENTITIESIMPACTED; ++i ) { oh_concat_ep(&DimiTest->EntitiesImpacted[i].EntityImpacted, &entity_root); } } } return rv; } SaErrorT SAHPI_API saHpiDimiTestReadinessGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiDimiNumT DimiNum, SAHPI_IN SaHpiDimiTestNumT TestNum, SAHPI_OUT SaHpiDimiReadyT *DimiReady) { SaErrorT rv; if (!DimiReady) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&ResourceId, &DimiNum, &TestNum); ClientRpcParams oparams(DimiReady); rv = ohc_sess_rpc(eFsaHpiDimiTestReadinessGet, SessionId, iparams, oparams); return rv; } SaErrorT SAHPI_API saHpiDimiTestStart( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiDimiNumT DimiNum, SAHPI_IN SaHpiDimiTestNumT TestNum, SAHPI_IN SaHpiUint8T NumberOfParams, SAHPI_IN SaHpiDimiTestVariableParamsT *ParamsList) { SaErrorT rv; SaHpiDimiTestVariableParamsListT params_list; if ((!ParamsList) && (NumberOfParams != 0)) { return SA_ERR_HPI_INVALID_PARAMS; } params_list.NumberOfParams = NumberOfParams; params_list.ParamsList = ParamsList; ClientRpcParams iparams(&ResourceId, &DimiNum, &TestNum, ¶ms_list); ClientRpcParams oparams; rv = ohc_sess_rpc(eFsaHpiDimiTestStart, SessionId, iparams, oparams); return rv; } SaErrorT SAHPI_API saHpiDimiTestCancel( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiDimiNumT DimiNum, SAHPI_IN SaHpiDimiTestNumT TestNum) { SaErrorT rv; ClientRpcParams iparams(&ResourceId, &DimiNum, &TestNum); ClientRpcParams oparams; rv = ohc_sess_rpc(eFsaHpiDimiTestCancel, SessionId, iparams, oparams); return rv; } SaErrorT SAHPI_API saHpiDimiTestStatusGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiDimiNumT DimiNum, SAHPI_IN SaHpiDimiTestNumT TestNum, SAHPI_OUT SaHpiDimiTestPercentCompletedT *PercentCompleted, SAHPI_OUT SaHpiDimiTestRunStatusT *RunStatus) { SaErrorT rv; SaHpiDimiTestPercentCompletedT percent; SaHpiDimiTestPercentCompletedT *ppercent = &percent; if (!RunStatus) { return SA_ERR_HPI_INVALID_PARAMS; } if (PercentCompleted) { ppercent = PercentCompleted; } ClientRpcParams iparams(&ResourceId, &DimiNum, &TestNum); ClientRpcParams oparams(ppercent, RunStatus); rv = ohc_sess_rpc(eFsaHpiDimiTestStatusGet, SessionId, iparams, oparams); return rv; } SaErrorT SAHPI_API saHpiDimiTestResultsGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiDimiNumT DimiNum, SAHPI_IN SaHpiDimiTestNumT TestNum, SAHPI_OUT SaHpiDimiTestResultsT *TestResults) { SaErrorT rv; if (!TestResults) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&ResourceId, &DimiNum, &TestNum); ClientRpcParams oparams(TestResults); rv = ohc_sess_rpc(eFsaHpiDimiTestResultsGet, SessionId, iparams, oparams); return rv; } /******************************************************************************* * * FUMI Functions * ******************************************************************************/ SaErrorT SAHPI_API saHpiFumiSpecInfoGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_OUT SaHpiFumiSpecInfoT *SpecInfo) { SaErrorT rv; if (!SpecInfo) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&ResourceId, &FumiNum); ClientRpcParams oparams(SpecInfo); rv = ohc_sess_rpc(eFsaHpiFumiSpecInfoGet, SessionId, iparams, oparams); return rv; } SaErrorT SAHPI_API saHpiFumiServiceImpactGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_OUT SaHpiFumiServiceImpactDataT *ServiceImpact) { SaErrorT rv; if (!ServiceImpact) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&ResourceId, &FumiNum); ClientRpcParams oparams(ServiceImpact); rv = ohc_sess_rpc(eFsaHpiFumiServiceImpactGet, SessionId, iparams, oparams); if (rv == SA_OK) { SaHpiEntityPathT entity_root; rv = ohc_sess_get_entity_root(SessionId, entity_root); if (rv == SA_OK) { for ( size_t i = 0; i < ServiceImpact->NumEntities; ++i ) { oh_concat_ep(&ServiceImpact->ImpactedEntities[i].ImpactedEntity, &entity_root); } } } return rv; } SaErrorT SAHPI_API saHpiFumiSourceSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum, SAHPI_IN SaHpiTextBufferT *SourceUri) { SaErrorT rv; if ((!SourceUri) || SourceUri->DataType != SAHPI_TL_TYPE_TEXT) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&ResourceId, &FumiNum, &BankNum, SourceUri); ClientRpcParams oparams; rv = ohc_sess_rpc(eFsaHpiFumiSourceSet, SessionId, iparams, oparams); return rv; } SaErrorT SAHPI_API saHpiFumiSourceInfoValidateStart ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum) { SaErrorT rv; ClientRpcParams iparams(&ResourceId, &FumiNum, &BankNum); ClientRpcParams oparams; rv = ohc_sess_rpc(eFsaHpiFumiSourceInfoValidateStart, SessionId, iparams, oparams); return rv; } SaErrorT SAHPI_API saHpiFumiSourceInfoGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum, SAHPI_OUT SaHpiFumiSourceInfoT *SourceInfo) { SaErrorT rv; if (!SourceInfo) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&ResourceId, &FumiNum, &BankNum); ClientRpcParams oparams(SourceInfo); rv = ohc_sess_rpc(eFsaHpiFumiSourceInfoGet, SessionId, iparams, oparams); return rv; } SaErrorT SAHPI_API saHpiFumiSourceComponentInfoGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum, SAHPI_IN SaHpiEntryIdT ComponentEntryId, SAHPI_OUT SaHpiEntryIdT *NextComponentEntryId, SAHPI_OUT SaHpiFumiComponentInfoT *ComponentInfo) { SaErrorT rv; if ((!NextComponentEntryId) || (!ComponentInfo)) { return SA_ERR_HPI_INVALID_PARAMS; } if (ComponentEntryId == SAHPI_LAST_ENTRY) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&ResourceId, &FumiNum, &BankNum, &ComponentEntryId); ClientRpcParams oparams(NextComponentEntryId, ComponentInfo); rv = ohc_sess_rpc(eFsaHpiFumiSourceComponentInfoGet, SessionId, iparams, oparams); return rv; } SaErrorT SAHPI_API saHpiFumiTargetInfoGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum, SAHPI_OUT SaHpiFumiBankInfoT *BankInfo) { SaErrorT rv; if (!BankInfo) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&ResourceId, &FumiNum, &BankNum); ClientRpcParams oparams(BankInfo); rv = ohc_sess_rpc(eFsaHpiFumiTargetInfoGet, SessionId, iparams, oparams); return rv; } SaErrorT SAHPI_API saHpiFumiTargetComponentInfoGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum, SAHPI_IN SaHpiEntryIdT ComponentEntryId, SAHPI_OUT SaHpiEntryIdT *NextComponentEntryId, SAHPI_OUT SaHpiFumiComponentInfoT *ComponentInfo) { SaErrorT rv; if ((!NextComponentEntryId) || (!ComponentInfo)) { return SA_ERR_HPI_INVALID_PARAMS; } if (ComponentEntryId == SAHPI_LAST_ENTRY) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&ResourceId, &FumiNum, &BankNum, &ComponentEntryId); ClientRpcParams oparams(NextComponentEntryId, ComponentInfo); rv = ohc_sess_rpc(eFsaHpiFumiTargetComponentInfoGet, SessionId, iparams, oparams); return rv; } SaErrorT SAHPI_API saHpiFumiLogicalTargetInfoGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_OUT SaHpiFumiLogicalBankInfoT *BankInfo) { SaErrorT rv; if (!BankInfo) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&ResourceId, &FumiNum); ClientRpcParams oparams(BankInfo); rv = ohc_sess_rpc(eFsaHpiFumiLogicalTargetInfoGet, SessionId, iparams, oparams); return rv; } SaErrorT SAHPI_API saHpiFumiLogicalTargetComponentInfoGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiEntryIdT ComponentEntryId, SAHPI_OUT SaHpiEntryIdT *NextComponentEntryId, SAHPI_OUT SaHpiFumiLogicalComponentInfoT *ComponentInfo) { SaErrorT rv; if ((!NextComponentEntryId) || (!ComponentInfo)) { return SA_ERR_HPI_INVALID_PARAMS; } if (ComponentEntryId == SAHPI_LAST_ENTRY) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&ResourceId, &FumiNum, &ComponentEntryId); ClientRpcParams oparams(NextComponentEntryId, ComponentInfo); rv = ohc_sess_rpc(eFsaHpiFumiLogicalTargetComponentInfoGet, SessionId, iparams, oparams); return rv; } SaErrorT SAHPI_API saHpiFumiBackupStart( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum) { SaErrorT rv; ClientRpcParams iparams(&ResourceId, &FumiNum); ClientRpcParams oparams; rv = ohc_sess_rpc(eFsaHpiFumiBackupStart, SessionId, iparams, oparams); return rv; } SaErrorT SAHPI_API saHpiFumiBankBootOrderSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum, SAHPI_IN SaHpiUint32T Position) { SaErrorT rv; ClientRpcParams iparams(&ResourceId, &FumiNum, &BankNum, &Position); ClientRpcParams oparams; rv = ohc_sess_rpc(eFsaHpiFumiBankBootOrderSet, SessionId, iparams, oparams); return rv; } SaErrorT SAHPI_API saHpiFumiBankCopyStart( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT SourceBankNum, SAHPI_IN SaHpiBankNumT TargetBankNum) { SaErrorT rv; ClientRpcParams iparams(&ResourceId, &FumiNum, &SourceBankNum, &TargetBankNum); ClientRpcParams oparams; rv = ohc_sess_rpc(eFsaHpiFumiBankCopyStart, SessionId, iparams, oparams); return rv; } SaErrorT SAHPI_API saHpiFumiInstallStart ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum) { SaErrorT rv; ClientRpcParams iparams(&ResourceId, &FumiNum, &BankNum); ClientRpcParams oparams; rv = ohc_sess_rpc(eFsaHpiFumiInstallStart, SessionId, iparams, oparams); return rv; } SaErrorT SAHPI_API saHpiFumiUpgradeStatusGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum, SAHPI_OUT SaHpiFumiUpgradeStatusT *UpgradeStatus) { SaErrorT rv; if (!UpgradeStatus) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&ResourceId, &FumiNum, &BankNum); ClientRpcParams oparams(UpgradeStatus); rv = ohc_sess_rpc(eFsaHpiFumiUpgradeStatusGet, SessionId, iparams, oparams); return rv; } SaErrorT SAHPI_API saHpiFumiTargetVerifyStart ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum) { SaErrorT rv; ClientRpcParams iparams(&ResourceId, &FumiNum, &BankNum); ClientRpcParams oparams; rv = ohc_sess_rpc(eFsaHpiFumiTargetVerifyStart, SessionId, iparams, oparams); return rv; } SaErrorT SAHPI_API saHpiFumiTargetVerifyMainStart( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum) { SaErrorT rv; ClientRpcParams iparams(&ResourceId, &FumiNum); ClientRpcParams oparams; rv = ohc_sess_rpc(eFsaHpiFumiTargetVerifyMainStart, SessionId, iparams, oparams); return rv; } SaErrorT SAHPI_API saHpiFumiUpgradeCancel ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum) { SaErrorT rv; ClientRpcParams iparams(&ResourceId, &FumiNum, &BankNum); ClientRpcParams oparams; rv = ohc_sess_rpc(eFsaHpiFumiUpgradeCancel, SessionId, iparams, oparams); return rv; } SaErrorT SAHPI_API saHpiFumiAutoRollbackDisableGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_OUT SaHpiBoolT *Disable) { SaErrorT rv; if (!Disable) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&ResourceId, &FumiNum); ClientRpcParams oparams(Disable); rv = ohc_sess_rpc(eFsaHpiFumiAutoRollbackDisableGet, SessionId, iparams, oparams); return rv; } SaErrorT SAHPI_API saHpiFumiAutoRollbackDisableSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBoolT Disable) { SaErrorT rv; ClientRpcParams iparams(&ResourceId, &FumiNum, &Disable); ClientRpcParams oparams; rv = ohc_sess_rpc(eFsaHpiFumiAutoRollbackDisableSet, SessionId, iparams, oparams); return rv; } SaErrorT SAHPI_API saHpiFumiRollbackStart ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum) { SaErrorT rv; ClientRpcParams iparams(&ResourceId, &FumiNum); ClientRpcParams oparams; rv = ohc_sess_rpc(eFsaHpiFumiRollbackStart, SessionId, iparams, oparams); return rv; } SaErrorT SAHPI_API saHpiFumiActivate ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum) { SaErrorT rv; ClientRpcParams iparams(&ResourceId, &FumiNum); ClientRpcParams oparams; rv = ohc_sess_rpc(eFsaHpiFumiActivate, SessionId, iparams, oparams); return rv; } SaErrorT SAHPI_API saHpiFumiActivateStart( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBoolT Logical) { SaErrorT rv; ClientRpcParams iparams(&ResourceId, &FumiNum, &Logical); ClientRpcParams oparams; rv = ohc_sess_rpc(eFsaHpiFumiActivateStart, SessionId, iparams, oparams); return rv; } SaErrorT SAHPI_API saHpiFumiCleanup( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum) { SaErrorT rv; ClientRpcParams iparams(&ResourceId, &FumiNum, &BankNum); ClientRpcParams oparams; rv = ohc_sess_rpc(eFsaHpiFumiCleanup, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiHotSwapPolicyCancel */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiHotSwapPolicyCancel( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId) { SaErrorT rv; ClientRpcParams iparams(&ResourceId); ClientRpcParams oparams; rv = ohc_sess_rpc(eFsaHpiHotSwapPolicyCancel, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiResourceActiveSet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiResourceActiveSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId) { SaErrorT rv; ClientRpcParams iparams(&ResourceId); ClientRpcParams oparams; rv = ohc_sess_rpc(eFsaHpiResourceActiveSet, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiResourceInactiveSet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiResourceInactiveSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId) { SaErrorT rv; ClientRpcParams iparams(&ResourceId); ClientRpcParams oparams; rv = ohc_sess_rpc(eFsaHpiResourceInactiveSet, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiAutoInsertTimeoutGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiAutoInsertTimeoutGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_OUT SaHpiTimeoutT *Timeout) { SaErrorT rv; if (!Timeout) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams; ClientRpcParams oparams(Timeout); rv = ohc_sess_rpc(eFsaHpiAutoInsertTimeoutGet, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiAutoInsertTimeoutSet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiAutoInsertTimeoutSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiTimeoutT Timeout) { SaErrorT rv; if (Timeout != SAHPI_TIMEOUT_IMMEDIATE && Timeout != SAHPI_TIMEOUT_BLOCK && Timeout < 0) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&Timeout); ClientRpcParams oparams; rv = ohc_sess_rpc(eFsaHpiAutoInsertTimeoutSet, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiAutoExtractGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiAutoExtractTimeoutGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiTimeoutT *Timeout) { SaErrorT rv; if (!Timeout) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&ResourceId); ClientRpcParams oparams(Timeout); rv = ohc_sess_rpc(eFsaHpiAutoExtractTimeoutGet, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiAutoExtractTimeoutSet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiAutoExtractTimeoutSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiTimeoutT Timeout) { SaErrorT rv; if (Timeout != SAHPI_TIMEOUT_IMMEDIATE && Timeout != SAHPI_TIMEOUT_BLOCK && Timeout < 0) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&ResourceId, &Timeout); ClientRpcParams oparams; rv = ohc_sess_rpc(eFsaHpiAutoExtractTimeoutSet, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiHotSwapStateGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiHotSwapStateGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiHsStateT *State) { SaErrorT rv; if (!State) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&ResourceId); ClientRpcParams oparams(State); rv = ohc_sess_rpc(eFsaHpiHotSwapStateGet, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiHotSwapActionRequest */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiHotSwapActionRequest( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiHsActionT Action) { SaErrorT rv; if (!oh_lookup_hsaction(Action)) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&ResourceId, &Action); ClientRpcParams oparams; rv = ohc_sess_rpc(eFsaHpiHotSwapActionRequest, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiHotSwapIndicatorStateGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiHotSwapIndicatorStateGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiHsIndicatorStateT *State) { SaErrorT rv; if (!State) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&ResourceId); ClientRpcParams oparams(State); rv = ohc_sess_rpc(eFsaHpiHotSwapIndicatorStateGet, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiHotSwapIndicatorStateSet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiHotSwapIndicatorStateSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiHsIndicatorStateT State) { SaErrorT rv; if (!oh_lookup_hsindicatorstate(State)) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&ResourceId, &State); ClientRpcParams oparams; rv = ohc_sess_rpc(eFsaHpiHotSwapIndicatorStateSet, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiParmControl */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiParmControl( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiParmActionT Action) { SaErrorT rv; if (!oh_lookup_parmaction(Action)) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&ResourceId, &Action); ClientRpcParams oparams; rv = ohc_sess_rpc(eFsaHpiParmControl, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiResourceLoadIdGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiResourceLoadIdGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiLoadIdT *LoadId) { SaErrorT rv; ClientRpcParams iparams(&ResourceId); ClientRpcParams oparams(LoadId); rv = ohc_sess_rpc(eFsaHpiResourceLoadIdGet, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiResourceLoadIdSet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiResourceLoadIdSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiLoadIdT *LoadId) { SaErrorT rv; if (!LoadId) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&ResourceId, LoadId); ClientRpcParams oparams; rv = ohc_sess_rpc(eFsaHpiResourceLoadIdSet, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiResourceResetStateGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiResourceResetStateGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiResetActionT *Action) { SaErrorT rv; if (!Action) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&ResourceId); ClientRpcParams oparams(Action); rv = ohc_sess_rpc(eFsaHpiResourceResetStateGet, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiResourceResetStateSet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiResourceResetStateSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiResetActionT Action) { SaErrorT rv; if (!oh_lookup_resetaction(Action)) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&ResourceId, &Action); ClientRpcParams oparams; rv = ohc_sess_rpc(eFsaHpiResourceResetStateSet, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiResourcePowerStateGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiResourcePowerStateGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiPowerStateT *State) { SaErrorT rv; if (!State) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&ResourceId); ClientRpcParams oparams(State); rv = ohc_sess_rpc(eFsaHpiResourcePowerStateGet, SessionId, iparams, oparams); return rv; } /*----------------------------------------------------------------------------*/ /* saHpiResourcePowerStateSet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiResourcePowerStateSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiPowerStateT State) { SaErrorT rv; if (!oh_lookup_powerstate(State)) { return SA_ERR_HPI_INVALID_PARAMS; } ClientRpcParams iparams(&ResourceId, &State); ClientRpcParams oparams; rv = ohc_sess_rpc(eFsaHpiResourcePowerStateSet, SessionId, iparams, oparams); return rv; } openhpi-3.6.1/baselib/lock.h0000644000175100017510000000130112575647301014662 0ustar mohanmohan/* -*- c -*- * * (C) Copyright Nokia Siemens Networks 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak * */ #ifndef __BASELIB_LOCK_H #define __BASELIB_LOCK_H #ifdef __cplusplus extern "C" { #endif void ohc_lock( void ); void ohc_unlock( void ); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* __BASELIB_LOCK_H */ openhpi-3.6.1/COPYING0000644000175100017510000000303712575647265013234 0ustar mohanmohan Copyright (c) 2003, Intel Corporation (C) Copyright IBM Corp. 2003-2007 All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. Neither the name of Intel Corporation, IBM Corp., nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. openhpi-3.6.1/utils/0000755000175100017510000000000012605014523013311 5ustar mohanmohanopenhpi-3.6.1/utils/el_utils.c0000644000175100017510000002514012575647300015312 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003, 2004, 2006 * Copyright (c) 2003 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * David Ashley * Renier Morales */ #include #include #include #include #include /* allocate and initialize an EL */ oh_el *oh_el_create(SaHpiUint32T size) { oh_el *el; el = g_new0(oh_el, 1); if (el != NULL) { el->basetime = 0; el->sysbasetime = 0; el->nextid = SAHPI_OLDEST_ENTRY + 1; el->gentimestamp = SAHPI_TRUE; el->info.Entries = 0; el->info.Size = size; el->info.UserEventMaxSize = SAHPI_MAX_TEXT_BUFFER_LENGTH; el->info.UpdateTimestamp = SAHPI_TIME_UNSPECIFIED; el->info.CurrentTime = SAHPI_TIME_UNSPECIFIED; el->info.Enabled = SAHPI_TRUE; el->info.OverflowFlag = SAHPI_FALSE; el->info.OverflowResetable = SAHPI_TRUE; el->info.OverflowAction = SAHPI_EL_OVERFLOW_OVERWRITE; el->list = NULL; } return el; } /* close and free all memory associated with an EL */ SaErrorT oh_el_close(oh_el *el) { if (el == NULL) return SA_ERR_HPI_INVALID_PARAMS; oh_el_clear(el); g_free(el); return SA_OK; } /* append a new entry to the EL */ SaErrorT oh_el_append(oh_el *el, const SaHpiEventT *event, const SaHpiRdrT *rdr, const SaHpiRptEntryT *res) { oh_el_entry *entry; SaHpiTimeT cursystime; /* check for valid el params and state */ if (el == NULL || event == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } else if (el->info.Enabled == FALSE && event->EventType != SAHPI_ET_USER) { return SA_ERR_HPI_INVALID_REQUEST; } /* alloc the new entry */ entry = g_new0(oh_el_entry, 1); if (entry == NULL) { el->info.OverflowFlag = TRUE; return SA_ERR_HPI_OUT_OF_SPACE; } if (rdr) entry->rdr = *rdr; if (res) entry->res = *res; /* if necessary, wrap the el entries */ if (el->info.Size != OH_EL_MAX_SIZE && g_list_length(el->list) == el->info.Size) { g_free(el->list->data); el->list = g_list_delete_link(el->list, el->list); el->info.OverflowFlag = SAHPI_TRUE; } /* Set the event log entry id and timestamp */ entry->event.EntryId = el->nextid++; if (el->gentimestamp) { oh_gettimeofday(&cursystime); el->info.UpdateTimestamp = el->basetime + (cursystime - el->sysbasetime); } else { el->info.UpdateTimestamp = event->Timestamp; /* Setting time based on the event to have some sense of what * the current time is going to be when providing the el info. */ oh_el_timeset(el, event->Timestamp); } entry->event.Timestamp = el->info.UpdateTimestamp; /* append the new entry */ entry->event.Event = *event; el->list = g_list_append(el->list, entry); return SA_OK; } /* prepend a new entry to the EL */ SaErrorT oh_el_prepend(oh_el *el, const SaHpiEventT *event, const SaHpiRdrT *rdr, const SaHpiRptEntryT *res) { GList *node = NULL; oh_el_entry *entry; SaHpiTimeT cursystime; /* check for valid el params and state */ if (el == NULL || event == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } else if (el->info.Enabled == FALSE && event->EventType != SAHPI_ET_USER) { return SA_ERR_HPI_INVALID_REQUEST; } /* see if el is full */ if (el->info.Size != OH_EL_MAX_SIZE && g_list_length(el->list) == el->info.Size) { return SA_ERR_HPI_OUT_OF_SPACE; } /* alloc the new entry */ entry = g_new0(oh_el_entry, 1); if (entry == NULL) { el->info.OverflowFlag = TRUE; return SA_ERR_HPI_OUT_OF_SPACE; } if (rdr) entry->rdr = *rdr; if (res) entry->res = *res; /* since we are adding entries in reverse order we have to renumber * existing entries */ for (node = el->list; node; node = node->next) { oh_el_entry *tmpentry = (oh_el_entry *)node->data; tmpentry->event.EntryId++; } el->nextid++; /* prepare & prepend the new entry */ entry->event.EntryId = SAHPI_OLDEST_ENTRY + 1; if (el->gentimestamp) { oh_gettimeofday(&cursystime); el->info.UpdateTimestamp = el->basetime + (cursystime - el->sysbasetime); } else { el->info.UpdateTimestamp = event->Timestamp; /* Setting time based on the event to have some sense of what * the current time is going to be when providing the el info. */ oh_el_timeset(el, event->Timestamp); } entry->event.Timestamp = el->info.UpdateTimestamp; /* prepend the new entry to the list */ entry->event.Event = *event; el->list = g_list_prepend(el->list, entry); return SA_OK; } /* clear all EL entries */ SaErrorT oh_el_clear(oh_el *el) { GList *node; if (el == NULL) return SA_ERR_HPI_INVALID_PARAMS; /* free the data for every element in the list */ for (node = el->list; node; node = node->next) { g_free(node->data); } /* free the list nodes */ g_list_free(el->list); /* reset the control structure */ el->info.OverflowFlag = SAHPI_FALSE; el->info.UpdateTimestamp = SAHPI_TIME_UNSPECIFIED; el->info.Entries = 0; el->nextid = SAHPI_OLDEST_ENTRY + 1; // always start at 1 el->list = NULL; return SA_OK; } /* get an EL entry */ SaErrorT oh_el_get(oh_el *el, SaHpiEventLogEntryIdT entryid, SaHpiEventLogEntryIdT *prev, SaHpiEventLogEntryIdT *next, oh_el_entry **entry) { SaHpiEventLogEntryIdT eid; GList *node = NULL; oh_el_entry *elentry = NULL; if (!el || !prev || !next || !entry || entryid == SAHPI_NO_MORE_ENTRIES) { return SA_ERR_HPI_INVALID_PARAMS; } if (g_list_length(el->list) == 0) { return SA_ERR_HPI_NOT_PRESENT; } /* FIXME: There is a bug here because this does not take into account * the case when oh_el_prepend would have been used. In such case the * OLDEST entry would technically not be the first one in the list. * To be continued... * -- Renier Morales (08/30/06) */ if (entryid == SAHPI_OLDEST_ENTRY) { node = g_list_first(el->list); } else if (entryid == SAHPI_NEWEST_ENTRY) { node = g_list_last(el->list); } if (node) { elentry = (oh_el_entry *)node->data; eid = elentry->event.EntryId; } else { eid = entryid; } for (node = el->list; node; node = node->next) { elentry = (oh_el_entry *)node->data; if (eid == elentry->event.EntryId) { *entry = elentry; if (node->prev) { elentry = (oh_el_entry *)node->prev->data; *prev = elentry->event.EntryId; } else { *prev = SAHPI_NO_MORE_ENTRIES; } if (node->next) { elentry = (oh_el_entry *)node->next->data; *next = elentry->event.EntryId; } else { *next = SAHPI_NO_MORE_ENTRIES; } return SA_OK; } } return SA_ERR_HPI_NOT_PRESENT; } /* get EL info */ SaErrorT oh_el_info(oh_el *el, SaHpiEventLogInfoT *info) { SaHpiTimeT cursystime; if (el == NULL || info == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } *info = el->info; info->Entries = g_list_length(el->list); oh_gettimeofday(&cursystime); info->CurrentTime = el->basetime + (cursystime - el->sysbasetime); return SA_OK; } /* reset EL overflowflag */ SaErrorT oh_el_overflowreset(oh_el *el) { if (el == NULL) return SA_ERR_HPI_INVALID_PARAMS; if (el->info.OverflowResetable) { el->info.OverflowFlag = SAHPI_FALSE; return SA_OK; } else { return SA_ERR_HPI_INVALID_CMD; } } SaErrorT oh_el_overflowset(oh_el *el, SaHpiBoolT flag) { if (!el) return SA_ERR_HPI_INVALID_PARAMS; el->info.OverflowFlag = flag; return SA_OK; } /* write a EL entry list to a file */ SaErrorT oh_el_map_to_file(oh_el *el, char *filename) { FILE *fp; GList *node = NULL; if (el == NULL || filename == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } fp = fopen(filename, "wb"); if (!fp) { CRIT("EL file '%s' could not be opened", filename); return SA_ERR_HPI_ERROR; } for (node = el->list; node; node = node->next) { if (fwrite((void *)node->data, sizeof(oh_el_entry), 1, fp) != 1) { CRIT("Couldn't write to file '%s'.", filename); fclose(fp); return SA_ERR_HPI_ERROR; } } fclose(fp); return SA_OK; } /* read a EL entry list from a file */ SaErrorT oh_el_map_from_file(oh_el *el, char *filename) { FILE *fp; oh_el_entry entry; /* check el params and state */ if (el == NULL || filename == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } else if (el->info.Enabled == FALSE) { return SA_ERR_HPI_INVALID_REQUEST; } fp = fopen(filename, "rb"); if (!fp) { CRIT("EL file '%s' could not be opened", filename); return SA_ERR_HPI_ERROR; } oh_el_clear(el); // ensure list is empty while (fread(&entry, sizeof(oh_el_entry), 1, fp) == 1) { oh_el_entry *elentry = g_new0(oh_el_entry, 1); el->nextid = entry.event.EntryId; el->nextid++; *elentry = entry; el->list = g_list_append(el->list, elentry); } fclose(fp); return SA_OK; } /* set the EL timestamp offset */ SaErrorT oh_el_timeset(oh_el *el, SaHpiTimeT timestamp) { if (el == NULL || timestamp == SAHPI_TIME_UNSPECIFIED) { return SA_ERR_HPI_INVALID_PARAMS; } oh_gettimeofday(&el->sysbasetime); el->basetime = timestamp; return SA_OK; } /* set the timestamp generate flag */ SaErrorT oh_el_setgentimestampflag(oh_el *el, SaHpiBoolT flag) { if (el == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } el->gentimestamp = flag; return SA_OK; } SaErrorT oh_el_enableset(oh_el *el, SaHpiBoolT flag) { if (!el) return SA_ERR_HPI_INVALID_PARAMS; el->info.Enabled = flag; return SA_OK; } openhpi-3.6.1/utils/sahpi_struct_utils.h0000644000175100017510000001747412575647300017442 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004,2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman * Renier Morales */ #ifndef __SAHPI_STRUCT_UTILS_H #define __SAHPI_STRUCT_UTILS_H #ifndef __OH_UTILS_H #warning *** Include oh_utils.h instead of individual utility header files *** #endif #include #ifdef __cplusplus extern "C" { #endif /*********************** * Text buffer utilities ***********************/ SaErrorT oh_init_textbuffer(SaHpiTextBufferT *buffer); SaErrorT oh_append_textbuffer(SaHpiTextBufferT *buffer, const char *from); SaErrorT oh_copy_textbuffer(SaHpiTextBufferT *dest, const SaHpiTextBufferT *from); /* Print just the Data portions of the text structures */ #define oh_print_text(buf_ptr) oh_fprint_text(stdout, buf_ptr) SaErrorT oh_fprint_text(FILE *stream, const SaHpiTextBufferT *buffer); /* Same as SaHpiTextBufferT, only more Data */ #define OH_MAX_TEXT_BUFFER_LENGTH 2048 typedef struct { SaHpiTextTypeT DataType; SaHpiLanguageT Language; SaHpiUint16T DataLength; SaHpiUint8T Data[OH_MAX_TEXT_BUFFER_LENGTH]; } oh_big_textbuffer; SaErrorT oh_init_bigtext(oh_big_textbuffer *big_buffer); SaErrorT oh_append_bigtext(oh_big_textbuffer *big_buffer, const char *from); SaErrorT oh_copy_bigtext(oh_big_textbuffer *dest, const oh_big_textbuffer *from); /* Print just the Data portions of the text structures */ #define oh_print_bigtext(bigbuf_ptr) oh_fprint_bigtext(stdout, bigbuf_ptr) SaErrorT oh_fprint_bigtext(FILE *stream, const oh_big_textbuffer *big_buffer); /************************************ * HPI structure to string conversion ************************************/ SaErrorT oh_decode_manufacturerid(SaHpiManufacturerIdT value, SaHpiTextBufferT *buffer); SaErrorT oh_decode_sensorreading(SaHpiSensorReadingT reading, SaHpiSensorDataFormatT format, SaHpiTextBufferT *buffer); SaErrorT oh_encode_sensorreading(SaHpiTextBufferT *buffer, SaHpiSensorReadingTypeT type, SaHpiSensorReadingT *reading); SaErrorT oh_decode_capabilities(SaHpiCapabilitiesT ResourceCapabilities, SaHpiTextBufferT *buffer); SaErrorT oh_decode_hscapabilities(SaHpiHsCapabilitiesT HsCapabilities, SaHpiTextBufferT *buffer); SaErrorT oh_decode_sensoroptionaldata(SaHpiSensorOptionalDataT sensor_opt_data, SaHpiTextBufferT *buffer); SaErrorT oh_decode_sensorenableoptdata(SaHpiSensorEnableOptDataT sensor_enable_opt_data, SaHpiTextBufferT *buffer); SaErrorT oh_decode_dimitestcapabilities(SaHpiDimiTestCapabilityT capabilities, SaHpiTextBufferT *buffer); SaErrorT oh_decode_fumiprotocols(SaHpiFumiProtocolT protocols, SaHpiTextBufferT *buffer); SaErrorT oh_decode_fumicapabilities(SaHpiFumiCapabilityT capabilities, SaHpiTextBufferT *buffer); SaErrorT oh_decode_guid(const SaHpiGuidT *guid, oh_big_textbuffer *buffer); /************************* * Validate HPI structures *************************/ SaHpiBoolT oh_valid_textbuffer(SaHpiTextBufferT *buffer); SaErrorT oh_valid_ordering(SaHpiSensorThresholdsT *thds, SaHpiRdrT *rdr); SaErrorT oh_valid_thresholds(SaHpiSensorThresholdsT *thds, SaHpiRdrT *rdr); SaErrorT oh_valid_ctrl_state_mode(SaHpiCtrlRecT *ctrl_rdr, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state); /************************ * Compare HPI structures ************************/ int oh_compare_sensorreading(SaHpiSensorReadingTypeT type, SaHpiSensorReadingT *reading1, SaHpiSensorReadingT *reading2); /*************************** * Print HPI data structures ***************************/ #define OH_PRINT_OFFSET " " /* Offset string */ SaErrorT oh_append_offset(oh_big_textbuffer *buffer, int offsets); SaErrorT oh_append_char_bigtext(oh_big_textbuffer * big_buffer, unsigned char c); SaErrorT oh_append_hex_bigtext(oh_big_textbuffer * buf, unsigned char c); #define oh_print_event(event_ptr, ep, offsets) oh_fprint_event(stdout, event_ptr, ep, offsets) SaErrorT oh_fprint_event(FILE *stream, const SaHpiEventT *event, const SaHpiEntityPathT *entitypath, int offsets); #define oh_print_idrfield(thisfield, offsets) oh_fprint_idrfield(stdout, thisfield, offsets) SaErrorT oh_fprint_idrfield(FILE *stream, const SaHpiIdrFieldT *thisfield, int offsets); #define oh_print_idrinfo(idrInfo, offsets) oh_fprint_idrinfo(stdout, idrInfo, offsets) SaErrorT oh_fprint_idrinfo(FILE *stream, const SaHpiIdrInfoT *idrInfo, int offsets); #define oh_print_idrareaheader(areaHeader, offsets) oh_fprint_idrareaheader(stdout, areaHeader, offsets) SaErrorT oh_fprint_idrareaheader(FILE *stream, const SaHpiIdrAreaHeaderT *areaHeader, int offsets); #define oh_print_rptentry(rptEntry, offsets) oh_fprint_rptentry(stdout, rptEntry, offsets) SaErrorT oh_fprint_rptentry(FILE *stream, const SaHpiRptEntryT *rptEntry, int offsets); #define oh_print_sensorrec(sensor_ptr, offsets) oh_fprint_sensorrec(stdout, sensor_ptr, offsets) SaErrorT oh_fprint_sensorrec(FILE *stream, const SaHpiSensorRecT *sensor, int offsets); #define oh_print_rdr(rdr, offsets) oh_fprint_rdr(stdout, rdr, offsets) SaErrorT oh_fprint_rdr(FILE *stream, const SaHpiRdrT *rdrEntry, int offsets); #define oh_print_textbuffer(buf_ptr, offsets) oh_fprint_textbuffer(stdout, buf_ptr, offsets) SaErrorT oh_fprint_textbuffer(FILE *stream, const SaHpiTextBufferT *textbuffer, int offsets); #define oh_print_ctrlrec(ctrl_ptr, offsets) oh_fprint_ctrlrec(stdout, ctrl_ptr, offsets) SaErrorT oh_fprint_ctrlrec(FILE *stream, const SaHpiCtrlRecT *control, int offsets); #define oh_print_watchdogrec(watchdog_ptr, offsets) oh_fprint_watchdogrec(stdout, watchdog_ptr, offsets) SaErrorT oh_fprint_watchdogrec(FILE *stream, const SaHpiWatchdogRecT *watchdog, int offsets); #define oh_print_eventloginfo(elinfo_ptr, offsets) oh_fprint_eventloginfo(stdout, elinfo_ptr, offsets) SaErrorT oh_fprint_eventloginfo(FILE *stream, const SaHpiEventLogInfoT *thiselinfo, int offsets); #define oh_print_eventlogentry(eventlog_ptr, ep, offsets) oh_fprint_eventlogentry(stdout, eventlog_ptr, ep, offsets) SaErrorT oh_fprint_eventlogentry(FILE *stream, const SaHpiEventLogEntryT *thiseventlog, const SaHpiEntityPathT *entitypath, int offsets); #define oh_print_ctrlstate(ctrlstate_ptr, offsets) oh_fprint_ctrlstate(stdout, ctrlstate_ptr, offsets) SaErrorT oh_fprint_ctrlstate(FILE *stream, const SaHpiCtrlStateT *thisctrlstate, int offsets); #define oh_print_thresholds(thresholds, format, offsets) oh_fprint_thresholds(stdout, thresholds, format, offsets) SaErrorT oh_fprint_thresholds(FILE *stream, const SaHpiSensorThresholdsT *thresholds, const SaHpiSensorDataFormatT *format, int offsets); SaErrorT oh_build_event(oh_big_textbuffer *buffer, const SaHpiEventT *event, const SaHpiEntityPathT *entitypath, int offsets); SaErrorT oh_build_threshold_mask(oh_big_textbuffer *buffer, const SaHpiSensorThdMaskT tmask, int offsets); #ifdef __cplusplus } #endif #endif openhpi-3.6.1/utils/sahpi_enum_utils.h0000644000175100017510000004041412575647300017050 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./SaHpi2code.pl. * Do not change this file manually. Update script instead *******************************************************************/ #ifndef __SAHPI_ENUM_UTILS_H #define __SAHPI_ENUM_UTILS_H #ifndef __OH_UTILS_H #warning *** Include oh_utils.h instead of individual utility header files *** #endif #ifdef __cplusplus extern "C" { #endif #define OH_MAX_LANGUAGE 137 extern struct oh_language_map { SaHpiLanguageT entity_type; char *str; } language_strings[OH_MAX_LANGUAGE]; char * oh_lookup_language(SaHpiLanguageT value); SaErrorT oh_encode_language(SaHpiTextBufferT *buffer, SaHpiLanguageT *type); #define OH_MAX_TEXTTYPE 5 extern struct oh_texttype_map { SaHpiTextTypeT entity_type; char *str; } texttype_strings[OH_MAX_TEXTTYPE]; char * oh_lookup_texttype(SaHpiTextTypeT value); SaErrorT oh_encode_texttype(SaHpiTextBufferT *buffer, SaHpiTextTypeT *type); #define OH_MAX_ENTITYTYPE 104 extern struct oh_entitytype_map { SaHpiEntityTypeT entity_type; char *str; } entitytype_strings[OH_MAX_ENTITYTYPE]; char * oh_lookup_entitytype(SaHpiEntityTypeT value); SaErrorT oh_encode_entitytype(SaHpiTextBufferT *buffer, SaHpiEntityTypeT *type); #define OH_MAX_SENSORTYPE 50 extern struct oh_sensortype_map { SaHpiSensorTypeT entity_type; char *str; } sensortype_strings[OH_MAX_SENSORTYPE]; char * oh_lookup_sensortype(SaHpiSensorTypeT value); SaErrorT oh_encode_sensortype(SaHpiTextBufferT *buffer, SaHpiSensorTypeT *type); #define OH_MAX_SENSORREADINGTYPE 4 extern struct oh_sensorreadingtype_map { SaHpiSensorReadingTypeT entity_type; char *str; } sensorreadingtype_strings[OH_MAX_SENSORREADINGTYPE]; char * oh_lookup_sensorreadingtype(SaHpiSensorReadingTypeT value); SaErrorT oh_encode_sensorreadingtype(SaHpiTextBufferT *buffer, SaHpiSensorReadingTypeT *type); #define OH_MAX_SENSOREVENTMASKACTION 2 extern struct oh_sensoreventmaskaction_map { SaHpiSensorEventMaskActionT entity_type; char *str; } sensoreventmaskaction_strings[OH_MAX_SENSOREVENTMASKACTION]; char * oh_lookup_sensoreventmaskaction(SaHpiSensorEventMaskActionT value); SaErrorT oh_encode_sensoreventmaskaction(SaHpiTextBufferT *buffer, SaHpiSensorEventMaskActionT *type); #define OH_MAX_SENSORUNITS 91 extern struct oh_sensorunits_map { SaHpiSensorUnitsT entity_type; char *str; } sensorunits_strings[OH_MAX_SENSORUNITS]; char * oh_lookup_sensorunits(SaHpiSensorUnitsT value); SaErrorT oh_encode_sensorunits(SaHpiTextBufferT *buffer, SaHpiSensorUnitsT *type); #define OH_MAX_SENSORMODUNITUSE 3 extern struct oh_sensormodunituse_map { SaHpiSensorModUnitUseT entity_type; char *str; } sensormodunituse_strings[OH_MAX_SENSORMODUNITUSE]; char * oh_lookup_sensormodunituse(SaHpiSensorModUnitUseT value); SaErrorT oh_encode_sensormodunituse(SaHpiTextBufferT *buffer, SaHpiSensorModUnitUseT *type); #define OH_MAX_SENSOREVENTCTRL 3 extern struct oh_sensoreventctrl_map { SaHpiSensorEventCtrlT entity_type; char *str; } sensoreventctrl_strings[OH_MAX_SENSOREVENTCTRL]; char * oh_lookup_sensoreventctrl(SaHpiSensorEventCtrlT value); SaErrorT oh_encode_sensoreventctrl(SaHpiTextBufferT *buffer, SaHpiSensorEventCtrlT *type); #define OH_MAX_CTRLTYPE 6 extern struct oh_ctrltype_map { SaHpiCtrlTypeT entity_type; char *str; } ctrltype_strings[OH_MAX_CTRLTYPE]; char * oh_lookup_ctrltype(SaHpiCtrlTypeT value); SaErrorT oh_encode_ctrltype(SaHpiTextBufferT *buffer, SaHpiCtrlTypeT *type); #define OH_MAX_CTRLSTATEDIGITAL 4 extern struct oh_ctrlstatedigital_map { SaHpiCtrlStateDigitalT entity_type; char *str; } ctrlstatedigital_strings[OH_MAX_CTRLSTATEDIGITAL]; char * oh_lookup_ctrlstatedigital(SaHpiCtrlStateDigitalT value); SaErrorT oh_encode_ctrlstatedigital(SaHpiTextBufferT *buffer, SaHpiCtrlStateDigitalT *type); #define OH_MAX_CTRLMODE 2 extern struct oh_ctrlmode_map { SaHpiCtrlModeT entity_type; char *str; } ctrlmode_strings[OH_MAX_CTRLMODE]; char * oh_lookup_ctrlmode(SaHpiCtrlModeT value); SaErrorT oh_encode_ctrlmode(SaHpiTextBufferT *buffer, SaHpiCtrlModeT *type); #define OH_MAX_CTRLOUTPUTTYPE 17 extern struct oh_ctrloutputtype_map { SaHpiCtrlOutputTypeT entity_type; char *str; } ctrloutputtype_strings[OH_MAX_CTRLOUTPUTTYPE]; char * oh_lookup_ctrloutputtype(SaHpiCtrlOutputTypeT value); SaErrorT oh_encode_ctrloutputtype(SaHpiTextBufferT *buffer, SaHpiCtrlOutputTypeT *type); #define OH_MAX_IDRAREATYPE 6 extern struct oh_idrareatype_map { SaHpiIdrAreaTypeT entity_type; char *str; } idrareatype_strings[OH_MAX_IDRAREATYPE]; char * oh_lookup_idrareatype(SaHpiIdrAreaTypeT value); SaErrorT oh_encode_idrareatype(SaHpiTextBufferT *buffer, SaHpiIdrAreaTypeT *type); #define OH_MAX_IDRFIELDTYPE 11 extern struct oh_idrfieldtype_map { SaHpiIdrFieldTypeT entity_type; char *str; } idrfieldtype_strings[OH_MAX_IDRFIELDTYPE]; char * oh_lookup_idrfieldtype(SaHpiIdrFieldTypeT value); SaErrorT oh_encode_idrfieldtype(SaHpiTextBufferT *buffer, SaHpiIdrFieldTypeT *type); #define OH_MAX_WATCHDOGACTION 4 extern struct oh_watchdogaction_map { SaHpiWatchdogActionT entity_type; char *str; } watchdogaction_strings[OH_MAX_WATCHDOGACTION]; char * oh_lookup_watchdogaction(SaHpiWatchdogActionT value); SaErrorT oh_encode_watchdogaction(SaHpiTextBufferT *buffer, SaHpiWatchdogActionT *type); #define OH_MAX_WATCHDOGACTIONEVENT 5 extern struct oh_watchdogactionevent_map { SaHpiWatchdogActionEventT entity_type; char *str; } watchdogactionevent_strings[OH_MAX_WATCHDOGACTIONEVENT]; char * oh_lookup_watchdogactionevent(SaHpiWatchdogActionEventT value); SaErrorT oh_encode_watchdogactionevent(SaHpiTextBufferT *buffer, SaHpiWatchdogActionEventT *type); #define OH_MAX_WATCHDOGPRETIMERINTERRUPT 5 extern struct oh_watchdogpretimerinterrupt_map { SaHpiWatchdogPretimerInterruptT entity_type; char *str; } watchdogpretimerinterrupt_strings[OH_MAX_WATCHDOGPRETIMERINTERRUPT]; char * oh_lookup_watchdogpretimerinterrupt(SaHpiWatchdogPretimerInterruptT value); SaErrorT oh_encode_watchdogpretimerinterrupt(SaHpiTextBufferT *buffer, SaHpiWatchdogPretimerInterruptT *type); #define OH_MAX_WATCHDOGTIMERUSE 7 extern struct oh_watchdogtimeruse_map { SaHpiWatchdogTimerUseT entity_type; char *str; } watchdogtimeruse_strings[OH_MAX_WATCHDOGTIMERUSE]; char * oh_lookup_watchdogtimeruse(SaHpiWatchdogTimerUseT value); SaErrorT oh_encode_watchdogtimeruse(SaHpiTextBufferT *buffer, SaHpiWatchdogTimerUseT *type); #define OH_MAX_DIMITESTSERVICEIMPACT 3 extern struct oh_dimitestserviceimpact_map { SaHpiDimiTestServiceImpactT entity_type; char *str; } dimitestserviceimpact_strings[OH_MAX_DIMITESTSERVICEIMPACT]; char * oh_lookup_dimitestserviceimpact(SaHpiDimiTestServiceImpactT value); SaErrorT oh_encode_dimitestserviceimpact(SaHpiTextBufferT *buffer, SaHpiDimiTestServiceImpactT *type); #define OH_MAX_DIMITESTRUNSTATUS 5 extern struct oh_dimitestrunstatus_map { SaHpiDimiTestRunStatusT entity_type; char *str; } dimitestrunstatus_strings[OH_MAX_DIMITESTRUNSTATUS]; char * oh_lookup_dimitestrunstatus(SaHpiDimiTestRunStatusT value); SaErrorT oh_encode_dimitestrunstatus(SaHpiTextBufferT *buffer, SaHpiDimiTestRunStatusT *type); #define OH_MAX_DIMITESTERRCODE 3 extern struct oh_dimitesterrcode_map { SaHpiDimiTestErrCodeT entity_type; char *str; } dimitesterrcode_strings[OH_MAX_DIMITESTERRCODE]; char * oh_lookup_dimitesterrcode(SaHpiDimiTestErrCodeT value); SaErrorT oh_encode_dimitesterrcode(SaHpiTextBufferT *buffer, SaHpiDimiTestErrCodeT *type); #define OH_MAX_DIMITESTPARAMTYPE 4 extern struct oh_dimitestparamtype_map { SaHpiDimiTestParamTypeT entity_type; char *str; } dimitestparamtype_strings[OH_MAX_DIMITESTPARAMTYPE]; char * oh_lookup_dimitestparamtype(SaHpiDimiTestParamTypeT value); SaErrorT oh_encode_dimitestparamtype(SaHpiTextBufferT *buffer, SaHpiDimiTestParamTypeT *type); #define OH_MAX_DIMIREADY 3 extern struct oh_dimiready_map { SaHpiDimiReadyT entity_type; char *str; } dimiready_strings[OH_MAX_DIMIREADY]; char * oh_lookup_dimiready(SaHpiDimiReadyT value); SaErrorT oh_encode_dimiready(SaHpiTextBufferT *buffer, SaHpiDimiReadyT *type); #define OH_MAX_FUMISPECINFOTYPE 3 extern struct oh_fumispecinfotype_map { SaHpiFumiSpecInfoTypeT entity_type; char *str; } fumispecinfotype_strings[OH_MAX_FUMISPECINFOTYPE]; char * oh_lookup_fumispecinfotype(SaHpiFumiSpecInfoTypeT value); SaErrorT oh_encode_fumispecinfotype(SaHpiTextBufferT *buffer, SaHpiFumiSpecInfoTypeT *type); #define OH_MAX_FUMISAFDEFINEDSPECID 1 extern struct oh_fumisafdefinedspecid_map { SaHpiFumiSafDefinedSpecIdT entity_type; char *str; } fumisafdefinedspecid_strings[OH_MAX_FUMISAFDEFINEDSPECID]; char * oh_lookup_fumisafdefinedspecid(SaHpiFumiSafDefinedSpecIdT value); SaErrorT oh_encode_fumisafdefinedspecid(SaHpiTextBufferT *buffer, SaHpiFumiSafDefinedSpecIdT *type); #define OH_MAX_FUMISERVICEIMPACT 3 extern struct oh_fumiserviceimpact_map { SaHpiFumiServiceImpactT entity_type; char *str; } fumiserviceimpact_strings[OH_MAX_FUMISERVICEIMPACT]; char * oh_lookup_fumiserviceimpact(SaHpiFumiServiceImpactT value); SaErrorT oh_encode_fumiserviceimpact(SaHpiTextBufferT *buffer, SaHpiFumiServiceImpactT *type); #define OH_MAX_FUMISOURCESTATUS 9 extern struct oh_fumisourcestatus_map { SaHpiFumiSourceStatusT entity_type; char *str; } fumisourcestatus_strings[OH_MAX_FUMISOURCESTATUS]; char * oh_lookup_fumisourcestatus(SaHpiFumiSourceStatusT value); SaErrorT oh_encode_fumisourcestatus(SaHpiTextBufferT *buffer, SaHpiFumiSourceStatusT *type); #define OH_MAX_FUMIBANKSTATE 6 extern struct oh_fumibankstate_map { SaHpiFumiBankStateT entity_type; char *str; } fumibankstate_strings[OH_MAX_FUMIBANKSTATE]; char * oh_lookup_fumibankstate(SaHpiFumiBankStateT value); SaErrorT oh_encode_fumibankstate(SaHpiTextBufferT *buffer, SaHpiFumiBankStateT *type); #define OH_MAX_FUMIUPGRADESTATUS 33 extern struct oh_fumiupgradestatus_map { SaHpiFumiUpgradeStatusT entity_type; char *str; } fumiupgradestatus_strings[OH_MAX_FUMIUPGRADESTATUS]; char * oh_lookup_fumiupgradestatus(SaHpiFumiUpgradeStatusT value); SaErrorT oh_encode_fumiupgradestatus(SaHpiTextBufferT *buffer, SaHpiFumiUpgradeStatusT *type); #define OH_MAX_HSINDICATORSTATE 2 extern struct oh_hsindicatorstate_map { SaHpiHsIndicatorStateT entity_type; char *str; } hsindicatorstate_strings[OH_MAX_HSINDICATORSTATE]; char * oh_lookup_hsindicatorstate(SaHpiHsIndicatorStateT value); SaErrorT oh_encode_hsindicatorstate(SaHpiTextBufferT *buffer, SaHpiHsIndicatorStateT *type); #define OH_MAX_HSACTION 2 extern struct oh_hsaction_map { SaHpiHsActionT entity_type; char *str; } hsaction_strings[OH_MAX_HSACTION]; char * oh_lookup_hsaction(SaHpiHsActionT value); SaErrorT oh_encode_hsaction(SaHpiTextBufferT *buffer, SaHpiHsActionT *type); #define OH_MAX_HSSTATE 5 extern struct oh_hsstate_map { SaHpiHsStateT entity_type; char *str; } hsstate_strings[OH_MAX_HSSTATE]; char * oh_lookup_hsstate(SaHpiHsStateT value); SaErrorT oh_encode_hsstate(SaHpiTextBufferT *buffer, SaHpiHsStateT *type); #define OH_MAX_HSCAUSEOFSTATECHANGE 10 extern struct oh_hscauseofstatechange_map { SaHpiHsCauseOfStateChangeT entity_type; char *str; } hscauseofstatechange_strings[OH_MAX_HSCAUSEOFSTATECHANGE]; char * oh_lookup_hscauseofstatechange(SaHpiHsCauseOfStateChangeT value); SaErrorT oh_encode_hscauseofstatechange(SaHpiTextBufferT *buffer, SaHpiHsCauseOfStateChangeT *type); #define OH_MAX_SEVERITY 7 extern struct oh_severity_map { SaHpiSeverityT entity_type; char *str; } severity_strings[OH_MAX_SEVERITY]; char * oh_lookup_severity(SaHpiSeverityT value); SaErrorT oh_encode_severity(SaHpiTextBufferT *buffer, SaHpiSeverityT *type); #define OH_MAX_RESOURCEEVENTTYPE 6 extern struct oh_resourceeventtype_map { SaHpiResourceEventTypeT entity_type; char *str; } resourceeventtype_strings[OH_MAX_RESOURCEEVENTTYPE]; char * oh_lookup_resourceeventtype(SaHpiResourceEventTypeT value); SaErrorT oh_encode_resourceeventtype(SaHpiTextBufferT *buffer, SaHpiResourceEventTypeT *type); #define OH_MAX_DOMAINEVENTTYPE 2 extern struct oh_domaineventtype_map { SaHpiDomainEventTypeT entity_type; char *str; } domaineventtype_strings[OH_MAX_DOMAINEVENTTYPE]; char * oh_lookup_domaineventtype(SaHpiDomainEventTypeT value); SaErrorT oh_encode_domaineventtype(SaHpiTextBufferT *buffer, SaHpiDomainEventTypeT *type); #define OH_MAX_SWEVENTTYPE 3 extern struct oh_sweventtype_map { SaHpiSwEventTypeT entity_type; char *str; } sweventtype_strings[OH_MAX_SWEVENTTYPE]; char * oh_lookup_sweventtype(SaHpiSwEventTypeT value); SaErrorT oh_encode_sweventtype(SaHpiTextBufferT *buffer, SaHpiSwEventTypeT *type); #define OH_MAX_EVENTTYPE 12 extern struct oh_eventtype_map { SaHpiEventTypeT entity_type; char *str; } eventtype_strings[OH_MAX_EVENTTYPE]; char * oh_lookup_eventtype(SaHpiEventTypeT value); SaErrorT oh_encode_eventtype(SaHpiTextBufferT *buffer, SaHpiEventTypeT *type); #define OH_MAX_STATUSCONDTYPE 4 extern struct oh_statuscondtype_map { SaHpiStatusCondTypeT entity_type; char *str; } statuscondtype_strings[OH_MAX_STATUSCONDTYPE]; char * oh_lookup_statuscondtype(SaHpiStatusCondTypeT value); SaErrorT oh_encode_statuscondtype(SaHpiTextBufferT *buffer, SaHpiStatusCondTypeT *type); #define OH_MAX_ANNUNCIATORMODE 3 extern struct oh_annunciatormode_map { SaHpiAnnunciatorModeT entity_type; char *str; } annunciatormode_strings[OH_MAX_ANNUNCIATORMODE]; char * oh_lookup_annunciatormode(SaHpiAnnunciatorModeT value); SaErrorT oh_encode_annunciatormode(SaHpiTextBufferT *buffer, SaHpiAnnunciatorModeT *type); #define OH_MAX_ANNUNCIATORTYPE 7 extern struct oh_annunciatortype_map { SaHpiAnnunciatorTypeT entity_type; char *str; } annunciatortype_strings[OH_MAX_ANNUNCIATORTYPE]; char * oh_lookup_annunciatortype(SaHpiAnnunciatorTypeT value); SaErrorT oh_encode_annunciatortype(SaHpiTextBufferT *buffer, SaHpiAnnunciatorTypeT *type); #define OH_MAX_RDRTYPE 8 extern struct oh_rdrtype_map { SaHpiRdrTypeT entity_type; char *str; } rdrtype_strings[OH_MAX_RDRTYPE]; char * oh_lookup_rdrtype(SaHpiRdrTypeT value); SaErrorT oh_encode_rdrtype(SaHpiTextBufferT *buffer, SaHpiRdrTypeT *type); #define OH_MAX_PARMACTION 3 extern struct oh_parmaction_map { SaHpiParmActionT entity_type; char *str; } parmaction_strings[OH_MAX_PARMACTION]; char * oh_lookup_parmaction(SaHpiParmActionT value); SaErrorT oh_encode_parmaction(SaHpiTextBufferT *buffer, SaHpiParmActionT *type); #define OH_MAX_RESETACTION 4 extern struct oh_resetaction_map { SaHpiResetActionT entity_type; char *str; } resetaction_strings[OH_MAX_RESETACTION]; char * oh_lookup_resetaction(SaHpiResetActionT value); SaErrorT oh_encode_resetaction(SaHpiTextBufferT *buffer, SaHpiResetActionT *type); #define OH_MAX_POWERSTATE 3 extern struct oh_powerstate_map { SaHpiPowerStateT entity_type; char *str; } powerstate_strings[OH_MAX_POWERSTATE]; char * oh_lookup_powerstate(SaHpiPowerStateT value); SaErrorT oh_encode_powerstate(SaHpiTextBufferT *buffer, SaHpiPowerStateT *type); #define OH_MAX_EVENTLOGOVERFLOWACTION 2 extern struct oh_eventlogoverflowaction_map { SaHpiEventLogOverflowActionT entity_type; char *str; } eventlogoverflowaction_strings[OH_MAX_EVENTLOGOVERFLOWACTION]; char * oh_lookup_eventlogoverflowaction(SaHpiEventLogOverflowActionT value); SaErrorT oh_encode_eventlogoverflowaction(SaHpiTextBufferT *buffer, SaHpiEventLogOverflowActionT *type); #define OH_MAX_ERROR 24 extern struct oh_error_map { SaErrorT entity_type; char *str; } error_strings[OH_MAX_ERROR]; char * oh_lookup_error(SaErrorT value); SaErrorT oh_encode_error(SaHpiTextBufferT *buffer, SaErrorT *type); #define OH_MAX_EVENTCATEGORY 14 extern struct oh_eventcategory_map { SaHpiEventCategoryT entity_type; char *str; } eventcategory_strings[OH_MAX_EVENTCATEGORY]; char * oh_lookup_eventcategory(SaHpiEventCategoryT value); SaErrorT oh_encode_eventcategory(SaHpiTextBufferT *buffer, SaHpiEventCategoryT *type); #ifdef __cplusplus } #endif #endif openhpi-3.6.1/utils/sahpiatca_enum_utils.c0000644000175100017510000002472612575647300017704 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./SaHpi2code.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * oh_lookup_atcahpiledcolor: * @value: enum value of type AtcaHpiLedColorT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid AtcaHpiLedColorT. **/ char * oh_lookup_atcahpiledcolor(AtcaHpiLedColorT value) { switch (value) { case ATCAHPI_LED_COLOR_RESERVED: return "COLOR_RESERVED"; case ATCAHPI_LED_COLOR_BLUE: return "COLOR_BLUE"; case ATCAHPI_LED_COLOR_RED: return "COLOR_RED"; case ATCAHPI_LED_COLOR_GREEN: return "COLOR_GREEN"; case ATCAHPI_LED_COLOR_AMBER: return "COLOR_AMBER"; case ATCAHPI_LED_COLOR_ORANGE: return "COLOR_ORANGE"; case ATCAHPI_LED_COLOR_WHITE: return "COLOR_WHITE"; case ATCAHPI_LED_COLOR_NO_CHANGE: return "COLOR_NO_CHANGE"; case ATCAHPI_LED_COLOR_USE_DEFAULT: return "COLOR_USE_DEFAULT"; default: return NULL; } } struct oh_atcahpiledcolor_map atcahpiledcolor_strings[] = { {ATCAHPI_LED_COLOR_RESERVED, "COLOR_RESERVED"}, {ATCAHPI_LED_COLOR_BLUE, "COLOR_BLUE"}, {ATCAHPI_LED_COLOR_RED, "COLOR_RED"}, {ATCAHPI_LED_COLOR_GREEN, "COLOR_GREEN"}, {ATCAHPI_LED_COLOR_AMBER, "COLOR_AMBER"}, {ATCAHPI_LED_COLOR_ORANGE, "COLOR_ORANGE"}, {ATCAHPI_LED_COLOR_WHITE, "COLOR_WHITE"}, {ATCAHPI_LED_COLOR_NO_CHANGE, "COLOR_NO_CHANGE"}, {ATCAHPI_LED_COLOR_USE_DEFAULT, "COLOR_USE_DEFAULT"}, }; /** * oh_encode_atcahpiledcolor: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of AtcaHpiLedColorT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_atcahpiledcolor(), back * into an AtcaHpiLedColorT type. * * Returns: * AtcaHpiLedColorT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_atcahpiledcolor(SaHpiTextBufferT *buffer, AtcaHpiLedColorT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, atcahpiledcolor_strings[i].str) == 0) { found++; break; } } if (found) { *type = atcahpiledcolor_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_atcahpiresourceledmode: * @value: enum value of type AtcaHpiResourceLedModeT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid AtcaHpiResourceLedModeT. **/ char * oh_lookup_atcahpiresourceledmode(AtcaHpiResourceLedModeT value) { switch (value) { case ATCAHPI_LED_AUTO: return "AUTO"; case ATCAHPI_LED_MANUAL: return "MANUAL"; case ATCAHPI_LED_LAMP_TEST: return "LAMP_TEST"; default: return NULL; } } struct oh_atcahpiresourceledmode_map atcahpiresourceledmode_strings[] = { {ATCAHPI_LED_AUTO, "AUTO"}, {ATCAHPI_LED_MANUAL, "MANUAL"}, {ATCAHPI_LED_LAMP_TEST, "LAMP_TEST"}, }; /** * oh_encode_atcahpiresourceledmode: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of AtcaHpiResourceLedModeT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_atcahpiresourceledmode(), back * into an AtcaHpiResourceLedModeT type. * * Returns: * AtcaHpiResourceLedModeT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_atcahpiresourceledmode(SaHpiTextBufferT *buffer, AtcaHpiResourceLedModeT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, atcahpiresourceledmode_strings[i].str) == 0) { found++; break; } } if (found) { *type = atcahpiresourceledmode_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_atcahpiledbrsupport: * @value: enum value of type AtcaHpiLedBrSupportT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid AtcaHpiLedBrSupportT. **/ char * oh_lookup_atcahpiledbrsupport(AtcaHpiLedBrSupportT value) { switch (value) { case ATCAHPI_LED_BR_SUPPORTED: return "BR_SUPPORTED"; case ATCAHPI_LED_BR_NOT_SUPPORTED: return "BR_NOT_SUPPORTED"; case ATCAHPI_LED_BR_UNKNOWN: return "BR_UNKNOWN"; default: return NULL; } } struct oh_atcahpiledbrsupport_map atcahpiledbrsupport_strings[] = { {ATCAHPI_LED_BR_SUPPORTED, "BR_SUPPORTED"}, {ATCAHPI_LED_BR_NOT_SUPPORTED, "BR_NOT_SUPPORTED"}, {ATCAHPI_LED_BR_UNKNOWN, "BR_UNKNOWN"}, }; /** * oh_encode_atcahpiledbrsupport: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of AtcaHpiLedBrSupportT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_atcahpiledbrsupport(), back * into an AtcaHpiLedBrSupportT type. * * Returns: * AtcaHpiLedBrSupportT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_atcahpiledbrsupport(SaHpiTextBufferT *buffer, AtcaHpiLedBrSupportT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, atcahpiledbrsupport_strings[i].str) == 0) { found++; break; } } if (found) { *type = atcahpiledbrsupport_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_atcahpientitytype: * @value: enum value of type AtcaHpiEntityTypeT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid AtcaHpiEntityTypeT. **/ char * oh_lookup_atcahpientitytype(AtcaHpiEntityTypeT value) { switch (value) { case ATCAHPI_ENT_POWER_ENTRY_MODULE_SLOT: return "POWER_ENTRY_MODULE_SLOT"; case ATCAHPI_ENT_SHELF_FRU_DEVICE_SLOT: return "SHELF_FRU_DEVICE_SLOT"; case ATCAHPI_ENT_SHELF_MANAGER_SLOT: return "SHELF_MANAGER_SLOT"; case ATCAHPI_ENT_FAN_TRAY_SLOT: return "FAN_TRAY_SLOT"; case ATCAHPI_ENT_FAN_FILTER_TRAY_SLOT: return "FAN_FILTER_TRAY_SLOT"; case ATCAHPI_ENT_ALARM_SLOT: return "ALARM_SLOT"; case ATCAHPI_ENT_AMC_SLOT: return "AMC_SLOT"; case ATCAHPI_ENT_PMC_SLOT: return "PMC_SLOT"; case ATCAHPI_ENT_RTM_SLOT: return "RTM_SLOT"; case ATCAHPI_ENT_PICMG_FRONT_BLADE: return "PICMG_FRONT_BLADE"; case ATCAHPI_ENT_SHELF_FRU_DEVICE: return "SHELF_FRU_DEVICE"; case ATCAHPI_ENT_FILTRATION_UNIT: return "FILTRATION_UNIT"; case ATCAHPI_ENT_AMC: return "AMC"; default: return NULL; } } struct oh_atcahpientitytype_map atcahpientitytype_strings[] = { {ATCAHPI_ENT_POWER_ENTRY_MODULE_SLOT, "POWER_ENTRY_MODULE_SLOT"}, {ATCAHPI_ENT_SHELF_FRU_DEVICE_SLOT, "SHELF_FRU_DEVICE_SLOT"}, {ATCAHPI_ENT_SHELF_MANAGER_SLOT, "SHELF_MANAGER_SLOT"}, {ATCAHPI_ENT_FAN_TRAY_SLOT, "FAN_TRAY_SLOT"}, {ATCAHPI_ENT_FAN_FILTER_TRAY_SLOT, "FAN_FILTER_TRAY_SLOT"}, {ATCAHPI_ENT_ALARM_SLOT, "ALARM_SLOT"}, {ATCAHPI_ENT_AMC_SLOT, "AMC_SLOT"}, {ATCAHPI_ENT_PMC_SLOT, "PMC_SLOT"}, {ATCAHPI_ENT_RTM_SLOT, "RTM_SLOT"}, {ATCAHPI_ENT_PICMG_FRONT_BLADE, "PICMG_FRONT_BLADE"}, {ATCAHPI_ENT_SHELF_FRU_DEVICE, "SHELF_FRU_DEVICE"}, {ATCAHPI_ENT_FILTRATION_UNIT, "FILTRATION_UNIT"}, {ATCAHPI_ENT_AMC, "AMC"}, }; /** * oh_encode_atcahpientitytype: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of AtcaHpiEntityTypeT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_atcahpientitytype(), back * into an AtcaHpiEntityTypeT type. * * Returns: * AtcaHpiEntityTypeT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_atcahpientitytype(SaHpiTextBufferT *buffer, AtcaHpiEntityTypeT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, atcahpientitytype_strings[i].str) == 0) { found++; break; } } if (found) { *type = atcahpientitytype_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } openhpi-3.6.1/utils/sahpi_wrappers.h0000644000175100017510000000674612575647301016542 0ustar mohanmohan/* * * Copyright (C) 2013, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Mohan Devarajulu */ #ifndef __SAHPI_WRAPPERS_H #define __SAHPI_WRAPPERS_H #include #ifdef __cplusplus extern "C" { #endif GThread *wrap_g_thread_create_new(const gchar *name, GThreadFunc func, gpointer data, gboolean joinable, GError **error); GMutex* wrap_g_mutex_new_init(void); void wrap_g_mutex_free_clear(GMutex *mutex); void wrap_g_mutex_lock(GMutex *mutex); gboolean wrap_g_mutex_trylock(GMutex *mutex); void wrap_g_mutex_unlock(GMutex *mutex); void wrap_g_thread_init(gpointer nul); void wrap_g_static_rec_mutex_lock(void *mutex); gboolean wrap_g_static_rec_mutex_trylock (void *mutex); void wrap_g_static_rec_mutex_unlock( void *mutex); void wrap_g_static_private_init(void *key); void wrap_g_static_private_free(void * key); #if GLIB_CHECK_VERSION (2, 32, 0) void wrap_g_static_private_set(void* key, gpointer value); #else void wrap_g_static_private_set(void* key, gpointer value, GDestroyNotify notify); #endif gpointer wrap_g_static_private_get(void *key); void wrap_g_static_rec_mutex_init(void *mutex); void wrap_g_static_rec_mutex_free_clear(void *mutex); #if GLIB_CHECK_VERSION (2, 32, 0) gpointer wrap_g_async_queue_timed_pop(GAsyncQueue *queue, guint64 end_time); #else gpointer wrap_g_async_queue_timed_pop(GAsyncQueue *queue, GTimeVal *end_time); #endif #if GLIB_CHECK_VERSION (2, 32, 0) gboolean wrap_g_cond_timed_wait (GCond *cond, GMutex *mutex, gint64 abs_time); #else gboolean wrap_g_cond_timed_wait (GCond *cond, GMutex *mutex, GTimeVal *abs_time); #endif GCond* wrap_g_cond_new_init(void); void wrap_g_cond_free (GCond *cond); void wrap_g_static_mutex_init (void *mutex); void wrap_g_static_mutex_free_clear(void *mutex); void wrap_g_static_mutex_unlock(void *mutex); void wrap_g_static_mutex_lock(void *mutex); void wrap_g_free(void *ptr); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* __SAHPI_WRAPPERS_H */ openhpi-3.6.1/utils/sahpi_gcrypt_utils.h0000644000175100017510000000455312575647300017420 0ustar mohanmohan/* * * Copyright (C) 2013, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Mohan Devarajulu */ #ifndef __SAHPI_GCRYPT_UTILS_H #define __SAHPI_GCRYPT_UTILS_H #ifndef __OH_UTILS_H #warning *** Include oh_utils.h instead of individual utility header files *** #endif #ifdef HAVE_ENCRYPT #include #ifdef __cplusplus extern "C" { #endif #define OHPI_ENCRYPT 1 #define OHPI_DECRYPT 2 /* The following one needs to be changed if the location changes *Sigh* */ #define PUUID_PATH "/sys/devices/virtual/dmi/id/product_uuid" #define SAHPI_DEFKEY "20030116" SaErrorT oh_initialize_gcrypt(gcry_cipher_hd_t *h1, gcry_cipher_hd_t *h2, gchar *key); gchar * oh_crypt(gchar *file_path, SaHpiUint32T type); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* HAVE_ENCRYPT */ #endif /* __SAHPI_GCRYPT_UTILS_H */ openhpi-3.6.1/utils/rpt_utils.h0000644000175100017510000000666312575647300015535 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003, 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #ifndef __RPT_UTILS_H #define __RPT_UTILS_H #ifndef __OH_UTILS_H #warning *** Include oh_utils.h instead of individual utility header files *** #endif #include #include /* oh_add_resource/rdr free-data flag */ #define FREE_RPT_DATA SAHPI_FALSE #define KEEP_RPT_DATA SAHPI_TRUE #ifdef __cplusplus extern "C" { #endif typedef struct { SaHpiUint32T update_count; SaHpiTimeT update_timestamp; /* The structure to hold this is subject to change. */ /* No one should touch this. */ GSList *rptlist; /* Contains RPTEntrys for sequence lookups */ GHashTable *rptable; /* Contains RPTEntrys for fast EntryId lookups */ } RPTable; /* General RPT calls */ SaErrorT oh_init_rpt(RPTable *table); SaErrorT oh_flush_rpt(RPTable *table); SaErrorT rpt_diff(RPTable *cur_rpt, RPTable *new_rpt, GSList **res_new, GSList **rdr_new, GSList **res_gone, GSList **rdr_gone); SaErrorT oh_get_rpt_info(RPTable *table, SaHpiUint32T *update_count, SaHpiTimeT *update_timestamp); /* Resource calls */ SaErrorT oh_add_resource(RPTable *table, SaHpiRptEntryT *entry, void *data, int owndata); SaErrorT oh_remove_resource(RPTable *table, SaHpiResourceIdT rid); void *oh_get_resource_data(RPTable *table, SaHpiResourceIdT rid); SaHpiRptEntryT *oh_get_resource_by_id(RPTable *table, SaHpiResourceIdT rid); SaHpiRptEntryT *oh_get_resource_by_ep(RPTable *table, SaHpiEntityPathT *ep); SaHpiRptEntryT *oh_get_resource_next(RPTable *table, SaHpiResourceIdT rid_prev); SaErrorT oh_get_rdr_update_count(RPTable *table, SaHpiResourceIdT rid, SaHpiUint32T *update_count); /* RDR calls */ SaErrorT oh_add_rdr(RPTable *table, SaHpiResourceIdT rid, SaHpiRdrT *rdr, void *data, int owndata); SaErrorT oh_remove_rdr(RPTable *table, SaHpiResourceIdT rid, SaHpiEntryIdT rdrid); void *oh_get_rdr_data(RPTable *table, SaHpiResourceIdT rid, SaHpiEntryIdT rdrid); SaHpiRdrT *oh_get_rdr_by_id(RPTable *table, SaHpiResourceIdT rid, SaHpiEntryIdT rdrid); SaHpiRdrT *oh_get_rdr_by_type(RPTable *table, SaHpiResourceIdT rid, SaHpiRdrTypeT type, SaHpiInstrumentIdT num); SaHpiRdrT *oh_get_rdr_next(RPTable *table, SaHpiResourceIdT rid, SaHpiEntryIdT rdrid_prev); SaHpiRdrT *oh_get_rdr_by_type_first(RPTable *table, SaHpiResourceIdT rid, SaHpiRdrTypeT type); SaHpiRdrT *oh_get_rdr_by_type_next(RPTable *table, SaHpiResourceIdT rid, SaHpiRdrTypeT type, SaHpiInstrumentIdT num); SaHpiUint32T oh_get_rdr_uid(SaHpiRdrTypeT type, SaHpiInstrumentIdT num); SaHpiInstrumentIdT oh_get_rdr_num(SaHpiEntryIdT rdrid); SaHpiInstrumentIdT oh_get_instrument_id(const SaHpiRdrT *rdr); #ifdef __cplusplus } #endif #endif openhpi-3.6.1/utils/el_utils.h0000644000175100017510000000530212575647301015316 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004,2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * David Ashley * Renier Morales */ #ifndef __EL_UTILS_H #define __EL_UTILS_H #ifndef __OH_UTILS_H #warning *** Include oh_utils.h instead of individual utility header files *** #endif #include #include #ifdef __cplusplus extern "C" { #endif #define OH_EL_MAX_SIZE 0 /* this struct encapsulates all the data for a system event log */ /* the log records themselves are stored in the el GList */ typedef struct { SaHpiTimeT basetime; // Time clock reference for this event log SaHpiTimeT sysbasetime; // The system time when the basetime was set SaHpiEventLogEntryIdT nextid; // id for next log entry SaHpiBoolT gentimestamp; // generate timestamp for entries. SaHpiEventLogInfoT info; /* Contains enabled state, overflow flag, timestamp of last update, and the max size for this log. */ GList *list; // list of event log entries for prev and next lookups } oh_el; /* this structure encapsulates the actual log entry and its context */ typedef struct { SaHpiEventLogEntryT event; SaHpiRdrT rdr; // All 0's means no associated rdr SaHpiRptEntryT res; // All 0's means no associated rpt } oh_el_entry; /* General EL utility calls */ oh_el *oh_el_create(SaHpiUint32T size); SaErrorT oh_el_close(oh_el *el); SaErrorT oh_el_append(oh_el *el, const SaHpiEventT *event, const SaHpiRdrT *rdr, const SaHpiRptEntryT *res); SaErrorT oh_el_prepend(oh_el *el, const SaHpiEventT *event, const SaHpiRdrT *rdr, const SaHpiRptEntryT *res); SaErrorT oh_el_clear(oh_el *el); SaErrorT oh_el_get(oh_el *el, SaHpiEventLogEntryIdT entryid, SaHpiEventLogEntryIdT *prev, SaHpiEventLogEntryIdT *next, oh_el_entry **entry); SaErrorT oh_el_info(oh_el *el, SaHpiEventLogInfoT *info); SaErrorT oh_el_overflowreset(oh_el *el); SaErrorT oh_el_overflowset(oh_el *el, SaHpiBoolT flag); SaErrorT oh_el_map_to_file(oh_el *el, char *filename); SaErrorT oh_el_map_from_file(oh_el *el, char *filename); SaErrorT oh_el_timeset(oh_el *el, SaHpiTimeT timestamp); SaErrorT oh_el_setgentimestampflag(oh_el *el, SaHpiBoolT flag); SaErrorT oh_el_enableset(oh_el *el, SaHpiBoolT flag); #ifdef __cplusplus } #endif #endif openhpi-3.6.1/utils/Makefile.am0000644000175100017510000000643112575647301015365 0ustar mohanmohan# # Copyright (c) 2003 Intel Corporation # (C) Copyright IBM Corp 2003, 2004 # All rights reserved. # # Redistribution and use in source and binary forms, with or # without modification, are permitted provided that the following # conditions are met: # # Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the distribution. # # Neither the name of Intel Corporation nor the names # of its contributors may be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, # OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. MAINTAINERCLEANFILES = Makefile.in AM_CPPFLAGS = -DG_LOG_DOMAIN=\"utils\" @CRYPT_FLAG@ AM_CFLAGS = @CRYPT_FLAG@ GENERATED_HEADER_FILES = \ sahpi_enum_utils.h \ sahpixtca_enum_utils.h \ sahpiatca_enum_utils.h \ sahpi_event_encode.h GENERATED_SRC_FILES = \ sahpi_enum_utils.c \ sahpixtca_enum_utils.c \ sahpiatca_enum_utils.c \ sahpi_event_encode.c GENERATED_FILES = $(GENERATED_HEADER_FILES) $(GENERATED_SRC_FILES) EXTRA_DIST = Makefile.mingw32 version.rc MOSTLYCLEANFILES = @TEST_CLEAN@ # FIXME:: Add when we can auto-generate files for SMP systems # MOSTLYCLEANFILES += $(GENERATED_FILES) AM_CPPFLAGS += @OPENHPI_INCLUDES@ SUBDIRS = t DIST_SUBDIRS = t pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = openhpiutils.pc lib_LTLIBRARIES = libopenhpiutils.la # Generated files (e.g.sahpi_enum_utils.c) must be listed first libopenhpiutils_la_SOURCES = \ $(GENERATED_SRC_FILES) \ $(GENERATED_HEADER_FILES) \ announcement_utils.c \ announcement_utils.h \ el_utils.c \ el_utils.h \ event_utils.c \ event_utils.h \ epath_utils.c \ epath_utils.h \ oh_utils.h \ rpt_utils.c \ rpt_utils.h \ sahpi_event_utils.c \ sahpi_event_utils.h \ sahpi_struct_utils.c \ sahpi_struct_utils.h \ sahpi_time_utils.c \ sahpi_time_utils.h \ sahpi_gcrypt_utils.c \ sahpi_gcrypt_utils.h \ sahpi_wrappers.c \ sahpi_wrappers.h \ uid_utils.c \ uid_utils.h libopenhpiutils_la_LDFLAGS = -version-info @HPI_LIB_VERSION@ libopenhpiutils_la_LIBADD = @GCRYPT_LIB@ # FIXME:: Add when we can auto-generate files for SMP systems #$(GENERATED_FILES): $(top_srcdir)/include/SaHpi.h $(top_srcdir)/scripts/SaHpi2code.pl # $(top_srcdir)/scripts/SaHpi2code.pl -ifile $(top_srcdir)/include/SaHpi.h openhpi-3.6.1/utils/sahpi_event_encode.c0000644000175100017510000001276612575647301017327 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./SaHpi2code.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include oh_categorystate_map state_global_strings[] = { {SAHPI_EC_UNSPECIFIED, SAHPI_ES_UNSPECIFIED, "UNSPECIFIED"}, }; oh_categorystate_map state_strings[] = { {SAHPI_EC_LIMIT, SAHPI_ES_LIMIT_NOT_EXCEEDED, "LIMIT_NOT_EXCEEDED"}, {SAHPI_EC_LIMIT, SAHPI_ES_LIMIT_EXCEEDED, "LIMIT_EXCEEDED"}, {SAHPI_EC_SENSOR_SPECIFIC, SAHPI_ES_STATE_00, "STATE_00"}, {SAHPI_EC_SENSOR_SPECIFIC, SAHPI_ES_STATE_01, "STATE_01"}, {SAHPI_EC_SENSOR_SPECIFIC, SAHPI_ES_STATE_02, "STATE_02"}, {SAHPI_EC_SENSOR_SPECIFIC, SAHPI_ES_STATE_03, "STATE_03"}, {SAHPI_EC_SENSOR_SPECIFIC, SAHPI_ES_STATE_04, "STATE_04"}, {SAHPI_EC_SENSOR_SPECIFIC, SAHPI_ES_STATE_05, "STATE_05"}, {SAHPI_EC_SENSOR_SPECIFIC, SAHPI_ES_STATE_06, "STATE_06"}, {SAHPI_EC_SENSOR_SPECIFIC, SAHPI_ES_STATE_07, "STATE_07"}, {SAHPI_EC_SENSOR_SPECIFIC, SAHPI_ES_STATE_08, "STATE_08"}, {SAHPI_EC_SENSOR_SPECIFIC, SAHPI_ES_STATE_09, "STATE_09"}, {SAHPI_EC_SENSOR_SPECIFIC, SAHPI_ES_STATE_10, "STATE_10"}, {SAHPI_EC_SENSOR_SPECIFIC, SAHPI_ES_STATE_11, "STATE_11"}, {SAHPI_EC_SENSOR_SPECIFIC, SAHPI_ES_STATE_12, "STATE_12"}, {SAHPI_EC_SENSOR_SPECIFIC, SAHPI_ES_STATE_13, "STATE_13"}, {SAHPI_EC_SENSOR_SPECIFIC, SAHPI_ES_STATE_14, "STATE_14"}, {SAHPI_EC_USAGE, SAHPI_ES_IDLE, "IDLE"}, {SAHPI_EC_USAGE, SAHPI_ES_ACTIVE, "ACTIVE"}, {SAHPI_EC_USAGE, SAHPI_ES_BUSY, "BUSY"}, {SAHPI_EC_PRED_FAIL, SAHPI_ES_PRED_FAILURE_DEASSERT, "PRED_FAILURE_DEASSERT"}, {SAHPI_EC_PRED_FAIL, SAHPI_ES_PRED_FAILURE_ASSERT, "PRED_FAILURE_ASSERT"}, {SAHPI_EC_THRESHOLD, SAHPI_ES_LOWER_MINOR, "LOWER_MINOR"}, {SAHPI_EC_THRESHOLD, SAHPI_ES_LOWER_MAJOR, "LOWER_MAJOR"}, {SAHPI_EC_THRESHOLD, SAHPI_ES_LOWER_CRIT, "LOWER_CRIT"}, {SAHPI_EC_THRESHOLD, SAHPI_ES_UPPER_MINOR, "UPPER_MINOR"}, {SAHPI_EC_THRESHOLD, SAHPI_ES_UPPER_MAJOR, "UPPER_MAJOR"}, {SAHPI_EC_THRESHOLD, SAHPI_ES_UPPER_CRIT, "UPPER_CRIT"}, {SAHPI_EC_ENABLE, SAHPI_ES_DISABLED, "DISABLED"}, {SAHPI_EC_ENABLE, SAHPI_ES_ENABLED, "ENABLED"}, {SAHPI_EC_PRESENCE, SAHPI_ES_ABSENT, "ABSENT"}, {SAHPI_EC_PRESENCE, SAHPI_ES_PRESENT, "PRESENT"}, {SAHPI_EC_SEVERITY, SAHPI_ES_OK, "OK"}, {SAHPI_EC_SEVERITY, SAHPI_ES_MINOR_FROM_OK, "MINOR_FROM_OK"}, {SAHPI_EC_SEVERITY, SAHPI_ES_MAJOR_FROM_LESS, "MAJOR_FROM_LESS"}, {SAHPI_EC_SEVERITY, SAHPI_ES_CRITICAL_FROM_LESS, "CRITICAL_FROM_LESS"}, {SAHPI_EC_SEVERITY, SAHPI_ES_MINOR_FROM_MORE, "MINOR_FROM_MORE"}, {SAHPI_EC_SEVERITY, SAHPI_ES_MAJOR_FROM_CRITICAL, "MAJOR_FROM_CRITICAL"}, {SAHPI_EC_SEVERITY, SAHPI_ES_CRITICAL, "CRITICAL"}, {SAHPI_EC_SEVERITY, SAHPI_ES_MONITOR, "MONITOR"}, {SAHPI_EC_SEVERITY, SAHPI_ES_INFORMATIONAL, "INFORMATIONAL"}, {SAHPI_EC_PERFORMANCE, SAHPI_ES_PERFORMANCE_MET, "PERFORMANCE_MET"}, {SAHPI_EC_PERFORMANCE, SAHPI_ES_PERFORMANCE_LAGS, "PERFORMANCE_LAGS"}, {SAHPI_EC_STATE, SAHPI_ES_STATE_DEASSERTED, "STATE_DEASSERTED"}, {SAHPI_EC_STATE, SAHPI_ES_STATE_ASSERTED, "STATE_ASSERTED"}, {SAHPI_EC_AVAILABILITY, SAHPI_ES_RUNNING, "RUNNING"}, {SAHPI_EC_AVAILABILITY, SAHPI_ES_TEST, "TEST"}, {SAHPI_EC_AVAILABILITY, SAHPI_ES_POWER_OFF, "POWER_OFF"}, {SAHPI_EC_AVAILABILITY, SAHPI_ES_ON_LINE, "ON_LINE"}, {SAHPI_EC_AVAILABILITY, SAHPI_ES_OFF_LINE, "OFF_LINE"}, {SAHPI_EC_AVAILABILITY, SAHPI_ES_OFF_DUTY, "OFF_DUTY"}, {SAHPI_EC_AVAILABILITY, SAHPI_ES_DEGRADED, "DEGRADED"}, {SAHPI_EC_AVAILABILITY, SAHPI_ES_POWER_SAVE, "POWER_SAVE"}, {SAHPI_EC_AVAILABILITY, SAHPI_ES_INSTALL_ERROR, "INSTALL_ERROR"}, {SAHPI_EC_REDUNDANCY, SAHPI_ES_FULLY_REDUNDANT, "FULLY_REDUNDANT"}, {SAHPI_EC_REDUNDANCY, SAHPI_ES_REDUNDANCY_LOST, "REDUNDANCY_LOST"}, {SAHPI_EC_REDUNDANCY, SAHPI_ES_REDUNDANCY_DEGRADED, "REDUNDANCY_DEGRADED"}, {SAHPI_EC_REDUNDANCY, SAHPI_ES_REDUNDANCY_LOST_SUFFICIENT_RESOURCES, "REDUNDANCY_LOST_SUFFICIENT_RESOURCES"}, {SAHPI_EC_REDUNDANCY, SAHPI_ES_NON_REDUNDANT_SUFFICIENT_RESOURCES, "NON_REDUNDANT_SUFFICIENT_RESOURCES"}, {SAHPI_EC_REDUNDANCY, SAHPI_ES_NON_REDUNDANT_INSUFFICIENT_RESOURCES, "NON_REDUNDANT_INSUFFICIENT_RESOURCES"}, {SAHPI_EC_REDUNDANCY, SAHPI_ES_REDUNDANCY_DEGRADED_FROM_FULL, "REDUNDANCY_DEGRADED_FROM_FULL"}, {SAHPI_EC_REDUNDANCY, SAHPI_ES_REDUNDANCY_DEGRADED_FROM_NON, "REDUNDANCY_DEGRADED_FROM_NON"}, {SAHPI_EC_GENERIC, SAHPI_ES_STATE_00, "STATE_00"}, {SAHPI_EC_GENERIC, SAHPI_ES_STATE_01, "STATE_01"}, {SAHPI_EC_GENERIC, SAHPI_ES_STATE_02, "STATE_02"}, {SAHPI_EC_GENERIC, SAHPI_ES_STATE_03, "STATE_03"}, {SAHPI_EC_GENERIC, SAHPI_ES_STATE_04, "STATE_04"}, {SAHPI_EC_GENERIC, SAHPI_ES_STATE_05, "STATE_05"}, {SAHPI_EC_GENERIC, SAHPI_ES_STATE_06, "STATE_06"}, {SAHPI_EC_GENERIC, SAHPI_ES_STATE_07, "STATE_07"}, {SAHPI_EC_GENERIC, SAHPI_ES_STATE_08, "STATE_08"}, {SAHPI_EC_GENERIC, SAHPI_ES_STATE_09, "STATE_09"}, {SAHPI_EC_GENERIC, SAHPI_ES_STATE_10, "STATE_10"}, {SAHPI_EC_GENERIC, SAHPI_ES_STATE_11, "STATE_11"}, {SAHPI_EC_GENERIC, SAHPI_ES_STATE_12, "STATE_12"}, {SAHPI_EC_GENERIC, SAHPI_ES_STATE_13, "STATE_13"}, {SAHPI_EC_GENERIC, SAHPI_ES_STATE_14, "STATE_14"}, }; openhpi-3.6.1/utils/event_utils.h0000644000175100017510000001055112575647300016040 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004-2006 * (C) Copyright Pigeon Point Systems. 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Sean Dague * Renier Morales * Anton Pak * */ #ifndef __EVENT_UTILS_H #define __EVENT_UTILS_H #ifndef __OH_UTILS_H #warning *** Include oh_utils.h instead of individual utility header files *** #endif #include #include #ifdef __cplusplus extern "C" { #endif /*** * Instructions for using oh_event ********************************* * oh_event is primarily used by the plugins to report HPI events. * * Required Fields: * .hid, .event * * Optional Fields: * .resource, .rdrs * * * Any Resource oh_events: * Use RESOURCE_UPDATED event for updating RPT entry. * * FRU Resource oh_events: * If reporting a resource, the plugin sets the appropiate event in .event. * For example, if reporting a new FRU resource, then the event should be * a hotswap type showing the correct hotswap state (any except NOT_PRESENT) * indicating the library that it should add it to the RPT. * If the plugin needs to report an extracted FRU, then the hotswap * event has to show the NOT_PRESENT current state, indicating to the library * that it should remove it from the RPT. * Hotswap events must have their accompaining resource set its capability bit * for FRU to 1 or it will be dropped by the infrastructure. * The .resource.ResourceCapabilities field can be zero. * If so, the RPT will not be updated, but the SaHpiEventT will be passed * on to the session queues and domain event log normally. * * Non-FRU Resource oh_events: * For adding or updating Non-FRU resources, the .event should be a resource * type HPI event and the ResourceEventType should be RESOURCE_ADDED or * RESOURCE_RESTORED. The resource itself should have its capability bit for * FRU set to zero or the event will be dropped by the infrastructure. * Use RESOURCE_REMOVED for removing Non-FRU resource from the RPT. * If a resource is failed, then the oh_event should * have a resource event type with the resource state as RESOURCE_FAILED. * The .resource field should have the RPT entry for resource in question. * This is used by the infrastructure to update the RPT and mark the resource * as failed (ResourceFailed == True). * The .resource.ResourceCapabilities field can be zero. If so, * the RPT will not be updated, but the SaHpiEventT will be passed on to the * session queues and domain event log normally. * * RDRs: * If the event is for a resource, be it FRU or Non-FRU, and the resource did * not previously exist in the RPT for the domain, then the .rdrs field is * scanned for valid SaHpiRdrTs (RdrType != SAHPI_NO_RECORD) objects and each * one is added as an rdr for the resource to the RPT. If the resource is * already in the RPT, then the rdrs field will be ignored for all * event except RESOURCE_UPDATED. * In addition to updating RPT entry, the RESOURCE_UPDATED event * can be used for adding, updating or removing RDRs. * * Other event types: * If the event is of type SENSOR, SENSOR_ENABLE_CHANGE, WATCHDOG, or OEM, then * The .resource field is scanned for a valid resource to use as reference for * the domain event log. Also, the .rdrs field is scanned for exactly one * SaHpiRdrT to be used as reference for the domain event log and session event * queue. If multiple rdrs are passed for these event types, only the first one * will be used. **/ struct oh_event { unsigned int hid; /* handler id for the event */ SaHpiEventT event; /* If no resource, ResourceCapabilities must be 0 */ SaHpiRptEntryT resource; GSList *rdrs; GSList *rdrs_to_remove; }; typedef GAsyncQueue oh_evt_queue; #define oh_new_event() g_new0(struct oh_event, 1) void oh_event_free(struct oh_event *e, int only_rdrs); struct oh_event *oh_dup_event(struct oh_event *old_event); void oh_evt_queue_push(oh_evt_queue *equeue, gpointer data); #ifdef __cplusplus } #endif #endif /* __EVENT_UTILS_H */ openhpi-3.6.1/utils/oh_utils.h0000644000175100017510000000202612575647301015324 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Steve Sherman */ #ifndef __OH_UTILS_H #define __OH_UTILS_H /* Order is important */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #endif openhpi-3.6.1/utils/sahpiatca_enum_utils.h0000644000175100017510000000454412575647300017705 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./SaHpi2code.pl. * Do not change this file manually. Update script instead *******************************************************************/ #ifndef __SAHPIATCA_ENUM_UTILS_H #define __SAHPIATCA_ENUM_UTILS_H #ifndef __OH_UTILS_H #warning *** Include oh_utils.h instead of individual utility header files *** #endif #ifdef __cplusplus extern "C" { #endif #define OH_MAX_ATCAHPILEDCOLOR 9 extern struct oh_atcahpiledcolor_map { AtcaHpiLedColorT entity_type; char *str; } atcahpiledcolor_strings[OH_MAX_ATCAHPILEDCOLOR]; char * oh_lookup_atcahpiledcolor(AtcaHpiLedColorT value); SaErrorT oh_encode_atcahpiledcolor(SaHpiTextBufferT *buffer, AtcaHpiLedColorT *type); #define OH_MAX_ATCAHPIRESOURCELEDMODE 3 extern struct oh_atcahpiresourceledmode_map { AtcaHpiResourceLedModeT entity_type; char *str; } atcahpiresourceledmode_strings[OH_MAX_ATCAHPIRESOURCELEDMODE]; char * oh_lookup_atcahpiresourceledmode(AtcaHpiResourceLedModeT value); SaErrorT oh_encode_atcahpiresourceledmode(SaHpiTextBufferT *buffer, AtcaHpiResourceLedModeT *type); #define OH_MAX_ATCAHPILEDBRSUPPORT 3 extern struct oh_atcahpiledbrsupport_map { AtcaHpiLedBrSupportT entity_type; char *str; } atcahpiledbrsupport_strings[OH_MAX_ATCAHPILEDBRSUPPORT]; char * oh_lookup_atcahpiledbrsupport(AtcaHpiLedBrSupportT value); SaErrorT oh_encode_atcahpiledbrsupport(SaHpiTextBufferT *buffer, AtcaHpiLedBrSupportT *type); #define OH_MAX_ATCAHPIENTITYTYPE 13 extern struct oh_atcahpientitytype_map { AtcaHpiEntityTypeT entity_type; char *str; } atcahpientitytype_strings[OH_MAX_ATCAHPIENTITYTYPE]; char * oh_lookup_atcahpientitytype(AtcaHpiEntityTypeT value); SaErrorT oh_encode_atcahpientitytype(SaHpiTextBufferT *buffer, AtcaHpiEntityTypeT *type); #ifdef __cplusplus } #endif #endif openhpi-3.6.1/utils/Makefile.mingw320000644000175100017510000000170312575647300016252 0ustar mohanmohaninclude ../Makefile.mingw32.def TARGET := libopenhpiutils.dll SRC := announcement_utils.c \ el_utils.c \ epath_utils.c \ event_utils.c \ rpt_utils.c \ sahpi_enum_utils.c \ sahpi_event_encode.c \ sahpi_event_utils.c \ sahpi_struct_utils.c \ sahpi_time_utils.c \ sahpiatca_enum_utils.c \ sahpixtca_enum_utils.c \ sahpi_wrappers.c \ uid_utils.c \ version.rc OBJ := $(patsubst %.rc, %.o, $(patsubst %.c, %.o, ${SRC})) DEFS := -DG_LOG_DOMAIN=\"utils\" INCLUDES := ${GLIB_INCLUDES} -I ../mingw32 -I ../include -I . LIBS := ${GLIB_LIBS} ${GTHREAD_LIBS} CPPFLAGS += ${DEFS} ${INCLUDES} .PHONY: all clean .SUFFIXES: .rc all : ${TARGET} ${TARGET} : ${OBJ} ${CC} -shared -o $@ $^ ${LIBS} \ -Wl,--out-implib,${@:.dll=.a} \ -Wl,--output-def,${@:.dll=.def} .rc.o: ${RC} ${RCFLAGS} $< $@ clean: rm -f ${OBJ} ${TARGET} ${TARGET:.dll=.a} ${TARGET:.dll=.def} openhpi-3.6.1/utils/epath_utils.c0000644000175100017510000010113712575647300016014 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman * Renier Morales * Thomas Kanngieser */ #include #include #include #include #include #include #include /* Defines to create canonical entity path strings */ #define ELEMENTS_IN_SaHpiEntityT 2 #define EPATHSTRING_START_DELIMITER "{" #define EPATHSTRING_START_DELIMITER_CHAR '{' #define EPATHSTRING_END_DELIMITER "}" #define EPATHSTRING_END_DELIMITER_CHAR '}' #define EPATHSTRING_VALUE_DELIMITER "," #define EPATHSTRING_VALUE_DELIMITER_CHAR ',' #define EPATHPATTERN_SPLAT '*' #define EPATHPATTERN_DOT '.' /** * oh_encode_entitypath: * @epstr: Pointer to canonical entity path string. * @ep: Location to store HPI's entity path structure. * * Converts an entity path canonical string (generally generated * by oh_decode_entitypath()) into an SaHpiEntityPathT structure. * * Returns: * SA_OK - normal operation. * SA_ERR_HPI_INVALID_PARAMS - Input pointer(s) NULL. * SA_ERR_HPI_INVALID_DATA - Invalid canonical entity path string. * SA_ERR_HPI_OUT_OF_SPACE - No memory for internal storage. **/ SaErrorT oh_encode_entitypath(const gchar *epstr, SaHpiEntityPathT *ep) { gchar **epathdefs = NULL, **epathvalues = NULL; gchar *gstr = NULL, *endptr = NULL; GSList *epath_list = NULL, *lst = NULL; int i, location, num_entities = 0; SaErrorT err = SA_OK; SaHpiEntityT *entityptr = NULL; SaHpiTextBufferT tmpbuffer; SaHpiEntityTypeT eptype; if (!epstr || !ep) { return(SA_ERR_HPI_INVALID_PARAMS); } /* Check for runaway string */ if (strlen(epstr) > OH_MAX_TEXT_BUFFER_LENGTH) { return(SA_ERR_HPI_INVALID_DATA); } /* Split out {xxx,yyy} definition pairs */ gstr = g_strstrip(g_strdup(epstr)); if (gstr == NULL) { CRIT("Stripped entity path string is NULL"); err = SA_ERR_HPI_INVALID_DATA; goto CLEANUP; } if (gstr[0] == '\0') { oh_init_ep(ep); err = SA_OK; goto CLEANUP; } epathdefs = g_strsplit(gstr, EPATHSTRING_END_DELIMITER, -1); if (epathdefs == NULL) { CRIT("Cannot split entity path string."); err = SA_ERR_HPI_INTERNAL_ERROR; goto CLEANUP; } /* Split out HPI entity type and location strings */ for (i=0; epathdefs[i] != NULL && epathdefs[i][0] != '\0'; i++) { epathdefs[i] = g_strstrip(epathdefs[i]); /* Check format - for starting delimiter and a comma */ if ((epathdefs[i][0] != EPATHSTRING_START_DELIMITER_CHAR) || (strpbrk(epathdefs[i], EPATHSTRING_VALUE_DELIMITER) == NULL)) { CRIT("Invalid entity path format."); err = SA_ERR_HPI_INVALID_DATA; goto CLEANUP; } epathvalues = g_strsplit(epathdefs[i], EPATHSTRING_VALUE_DELIMITER, ELEMENTS_IN_SaHpiEntityT); epathvalues[0] = g_strdelimit(epathvalues[0], EPATHSTRING_START_DELIMITER, ' '); /* Find entity type */ oh_init_textbuffer(&tmpbuffer); oh_append_textbuffer(&tmpbuffer, g_strstrip(epathvalues[0])); err = oh_encode_entitytype(&tmpbuffer, &eptype); /* If not an HPI type - support a numeric type. Needed by IPMI Direct plugin */ if (err) { err = SA_OK; int num = strtol(g_strstrip(epathvalues[0]), &endptr, 0); if (num <= 0 || endptr[0] != '\0') { CRIT("Invalid entity type string"); err = SA_ERR_HPI_INVALID_DATA; goto CLEANUP; } eptype = num; } /* Find entity location */ location = strtol(g_strstrip(epathvalues[1]), &endptr, 10); if (endptr[0] != '\0') { CRIT("Invalid location character"); err = SA_ERR_HPI_INVALID_DATA; goto CLEANUP; } /* Save entity path definitions; reverse order */ if (num_entities < SAHPI_MAX_ENTITY_PATH) { entityptr = g_new0(SaHpiEntityT, 1); if (entityptr == NULL) { err = SA_ERR_HPI_OUT_OF_SPACE; goto CLEANUP; } entityptr->EntityType = eptype; entityptr->EntityLocation = location; epath_list = g_slist_prepend(epath_list, (gpointer)entityptr); } num_entities++; g_strfreev(epathvalues); epathvalues = NULL; } /* Initialize and write HPI entity path structure */ oh_init_ep(ep); for (i = 0; epath_list != NULL; i++) { lst = epath_list; if (i < SAHPI_MAX_ENTITY_PATH) { ep->Entry[i].EntityType = ((SaHpiEntityT *)(lst->data))->EntityType; ep->Entry[i].EntityLocation = ((SaHpiEntityT *)(lst->data))->EntityLocation; } epath_list = g_slist_remove_link(epath_list,lst); g_free(lst->data); g_slist_free(lst); } if (num_entities > SAHPI_MAX_ENTITY_PATH) { CRIT("Too many entity defs"); err = SA_ERR_HPI_INVALID_DATA; } CLEANUP: g_free(gstr); g_strfreev(epathdefs); if (epathvalues) g_strfreev(epathvalues); lst = epath_list; while (lst != NULL) { free(lst->data); lst = g_slist_next(lst); } g_slist_free(epath_list); return(err); } /** * oh_decode_entitypath: * @ep: Pointer to HPI's entity path structure. * @bigbuf: Location to store canonical entity path string. * * Converts an entity path structure into its canonical string version. * The canonical string is formed by removing the "SAHPI_ENT_" prefix * from the HPI types, and creating tuples for the entity types. * Order of significance is inverted to make entity paths look more * like Unix directory structure. It is also assumed that {ROOT,0} * exists implicitly before all of these entries. For example: * * {SYSTEM_CHASSIS,2}{PROCESSOR_BOARD,0} * * SAHPI_ENT_ROOT is used to identify end element of an entity path. * Fully populated entity path may not have an SAHPI_ENT_ROOT. * Duplicate names in SaHPIEntityTypeT enumeration aren't handled * and won't be preserved across conversion calls. * * Returns: * SA_OK - normal case. * SA_ERR_HPI_INVALID_PARAMS - Input pointer(s) NULL. * SA_ERR_HPI_INVALID_DATA - Location value too big for OpenHpi. * SA_ERR_HPI_OUT_OF_SPACE - No memory for internal storage. **/ SaErrorT oh_decode_entitypath(const SaHpiEntityPathT *ep, oh_big_textbuffer *bigbuf) { char *typestr; gchar *locstr, *catstr; gchar typestr_buffer[20]; int i; oh_big_textbuffer tmpbuf; SaErrorT err = SA_OK; if (!bigbuf || !ep) { return(SA_ERR_HPI_INVALID_PARAMS); } err = oh_init_bigtext(&tmpbuf); if (err) return(err); locstr = g_new0(gchar, OH_MAX_LOCATION_DIGITS + 1); if (locstr == NULL) { err = SA_ERR_HPI_OUT_OF_SPACE; goto CLEANUP; } /* Find last element of structure. Disregard ROOT element * and count as last in entity path. */ for (i=0; iEntry[i].EntityType == SAHPI_ENT_ROOT) { break; } } /* Parse entity path into a string */ for (i--; i >= 0; i--) { guint num_digits, work_location_num; /* Validate and convert data */ work_location_num = ep->Entry[i].EntityLocation; for (num_digits=1; (work_location_num = work_location_num/10) > 0; num_digits++); if (num_digits > OH_MAX_LOCATION_DIGITS) { CRIT("Location value too big"); err = SA_ERR_HPI_INVALID_DATA; goto CLEANUP; } memset(locstr, 0, OH_MAX_LOCATION_DIGITS + 1); snprintf(locstr, OH_MAX_LOCATION_DIGITS + 1, "%d", ep->Entry[i].EntityLocation); /* Find string for current entity type */ typestr = oh_lookup_entitytype(ep->Entry[i].EntityType); /* Support numeric entity types - need by IPMI Direct plugin */ if (typestr == NULL) { snprintf(typestr_buffer, 20, "%d", ep->Entry[i].EntityType); typestr = typestr_buffer; } catstr = g_strconcat(EPATHSTRING_START_DELIMITER, typestr, EPATHSTRING_VALUE_DELIMITER, locstr, EPATHSTRING_END_DELIMITER, NULL); oh_append_bigtext(&tmpbuf, catstr); g_free(catstr); } /* Write string */ oh_init_bigtext(bigbuf); oh_append_bigtext(bigbuf, (char *)tmpbuf.Data); CLEANUP: g_free(locstr); return(err); } /** * oh_init_ep: * @ep: Pointer to SaHpiEntityPathT structure to initialize. * * Initializes an entity path to all {ROOT,0} elements. * * Returns: * SA_OK - normal operations. * SA_ERR_HPI_INVALID_PARAMS - @ep is NULL. **/ SaErrorT oh_init_ep(SaHpiEntityPathT *ep) { int i; if (!ep) { return(SA_ERR_HPI_INVALID_PARAMS); } for (i=0; iEntry[i].EntityType = SAHPI_ENT_ROOT; ep->Entry[i].EntityLocation = 0; } return(SA_OK); } /** * oh_ep_len: * @ep: Pointer to SaHpiEntityPathT structure to get length. * * Returns entity path length - number of entries before {ROOT,0} element. * Returns 0 in case of NULL ep pointer. **/ SaHpiUint8T oh_ep_len( const SaHpiEntityPathT * ep ) { if ( !ep ) { return 0; } size_t i; for ( i = 0; i < SAHPI_MAX_ENTITY_PATH; ++i ) { if ( ep->Entry[i].EntityType == SAHPI_ENT_ROOT ) { break; } } return i; } /** * oh_get_child_ep: * @ep: Pointer to entity path. * @parent: Pointer to parent entity path. * @child: Pointer to location that will be filled with child entity path * * Checks if the given entity path(@ep) consists of of the parent entity path * and some child entity path. * If it is so then fills child entity path. * * Returns: * SA_OK - @ep consists of the @parent and some child. * SA_ERR_HPI_INVALID_PARAMS - one of @ep, @parent, @child is NULL. * SA_ERR_HPI_NOT_PRESENT - @ep doesn't consist of the @parent and some child. **/ SaErrorT oh_get_child_ep( const SaHpiEntityPathT * ep, const SaHpiEntityPathT * parent, SaHpiEntityPathT * child ) { if ( ( !ep ) || ( !parent ) || ( !child ) ) { return SA_ERR_HPI_INVALID_PARAMS; } oh_init_ep( child ); size_t l_ep = oh_ep_len( ep ); size_t l_parent = oh_ep_len( parent ); if ( l_ep < l_parent ) { return SA_ERR_HPI_NOT_PRESENT; } else if ( l_ep == l_parent ) { return SA_OK; } size_t l_child = l_ep - l_parent; size_t i; for ( i = 0; i < l_parent; ++i ) { const SaHpiEntityT * x = &ep->Entry[i + l_child]; const SaHpiEntityT * y = &parent->Entry[i]; if ( x->EntityType != y->EntityType ) { return SA_ERR_HPI_NOT_PRESENT; } if ( x->EntityLocation != y->EntityLocation ) { return SA_ERR_HPI_NOT_PRESENT; } } for ( i = 0; i < l_child; ++i ) { child->Entry[i] = ep->Entry[i]; } return SA_OK; } /** * oh_concat_ep: * @dest: Pointer to entity path. Gets appended with @append. * @append: Pointer to entity path to append. * * Concatenate two entity path structures (SaHpiEntityPathT). * @append is appeded to @dest. If @dest doesn't have enough room, @append * will be truncated into @dest. * * Returns: * SA_OK - normal operations. * SA_ERR_HPI_INVALID_PARAMS - @dest is NULL. **/ SaErrorT oh_concat_ep(SaHpiEntityPathT *dest, const SaHpiEntityPathT *append) { int i, j; if (!dest) { return(SA_ERR_HPI_INVALID_PARAMS); } if (!append) return(SA_OK); for (i=0; iEntry[i].EntityType == SAHPI_ENT_ROOT) break; } for (j=0; iEntry[i].EntityLocation = append->Entry[j].EntityLocation; dest->Entry[i].EntityType = append->Entry[j].EntityType; if (append->Entry[j].EntityType == SAHPI_ENT_ROOT) break; j++; } return(SA_OK); } /** * oh_valid_ep: * @ep: Pointer to an SaHpiEntityPathT structure. * * Check an entity path to make sure it does not contain * any invalid entity types. The entity path is checked up to * the first root element or to the end of the array, if there * are no root elements in the structure. * * Returns: * SAHPI_TRUE - Valid entity path. * SAHPI_FALSE - Invalid entity path. **/ SaHpiBoolT oh_valid_ep(const SaHpiEntityPathT *ep) { int i; for (i=0; iEntry[i].EntityType == SAHPI_ENT_ROOT) break; /* FIXME:: Add explicit check for types with HPI resolves its conflicts with IPMI types */ /* Right now we're allowing users to specify any numeric type */ #if 0 char *typestr; typestr = oh_lookup_entitytype(ep->Entry[i].EntityType); if (typestr == NULL) return(SAHPI_FALSE); #endif } return(SAHPI_TRUE); } /** * oh_set_ep_location: * @ep: Pointer to entity path to work on * @et: entity type to look for * @ei: entity location to set when entity type is found * * Set an location number in the entity path given at the first * position (from least significant to most) the specified entity type is found. * * Returns: * SA_OK - normal operations. * SA_ERR_HPI_INVALID_PARAMS - @ep is NULL. * SA_ERR_HPI_INVALID_DATA - @ep invalid entity path. **/ SaErrorT oh_set_ep_location(SaHpiEntityPathT *ep, SaHpiEntityTypeT et, SaHpiEntityLocationT ei) { int i; if (!ep) { return(SA_ERR_HPI_INVALID_PARAMS); } if (!oh_valid_ep(ep)) { return(SA_ERR_HPI_INVALID_DATA); } for (i=0; iEntry[i].EntityType == et) { ep->Entry[i].EntityLocation = ei; break; } else { if (ep->Entry[i].EntityType == SAHPI_ENT_ROOT) break; } } return(SA_OK); } /** * oh_cmp_ep: * @ep1: Pointer to entity path structure. * @ep2: Pointer to entity path structure. * * Compares two entity paths up to their root element. * To be equal, they must have the same number of elements and each element * (type and location pair) must be equal to the corresponding element * in the other entity path. * * Returns: * SAHPI_TRUE - if equal. * SAHPI_FALSE - if not equal. **/ SaHpiBoolT oh_cmp_ep(const SaHpiEntityPathT *ep1, const SaHpiEntityPathT *ep2) { unsigned int i, j; if (!ep1 || !ep2) { return(SAHPI_FALSE); } for (i=0; i Entry[i].EntityType == SAHPI_ENT_ROOT) { i++; break; } } for (j=0; jEntry[j].EntityType == SAHPI_ENT_ROOT) { j++; break; } } if (i != j) return(SAHPI_FALSE); for (i=0; iEntry[i].EntityType != ep2->Entry[i].EntityType || ep1->Entry[i].EntityLocation != ep2->Entry[i].EntityLocation) { /* DBG("Entity element %d: EP1 {%d,%d} != EP2 {%d,%d}", i, ep1->Entry[i].EntityType, ep1->Entry[i].EntityLocation, ep2->Entry[i].EntityType, ep2->Entry[i].EntityLocation); */ return(SAHPI_FALSE); } } return(SAHPI_TRUE); } /** * oh_fprint_ep: * @ep: Pointer to entity path stucture. * * Prints the string form of an entity path structure. * The MACRO oh_print_ep(), uses this function to print to STDOUT. * * Returns: * SA_OK - normal operations. * SA_ERR_HPI_INVALID_PARAMS - @ep is NULL. **/ SaErrorT oh_fprint_ep(FILE *stream, const SaHpiEntityPathT *ep, int offsets) { oh_big_textbuffer bigbuf1, bigbuf2; SaErrorT err; if (!ep) { return(SA_ERR_HPI_INVALID_PARAMS); } err = oh_init_bigtext(&bigbuf1); if (err) return(err); err = oh_init_bigtext(&bigbuf2); if (err) return(err); err = oh_append_offset(&bigbuf1, offsets); if (err) return(err); err = oh_append_bigtext(&bigbuf1, "Entity Path: "); if (err) return(err); err = oh_decode_entitypath(ep, &bigbuf2); if (err) return(err); err = oh_append_bigtext(&bigbuf1, (char *)bigbuf2.Data); if (err) return(err); err = oh_append_bigtext(&bigbuf1, "\n"); if (err) return(err); fprintf(stream, "%s", bigbuf1.Data); return(SA_OK); } /********************************************************************** * oh_derive_string: * @ep - Pointer to entity's HPI SaHpiEntityPathT. * @offset - Offset to add to Entity Path location. * @base - Base for numeric conversion and display. * @str - Un-normalized character string. * * This function "normalizes" a string (such as an SNMP OID) * based on entity path. Starting from the end of @str, this routine * replaces the letter 'x', with the last location number of entity path, * the process is repeated until all 'x' are replaced by an location number. * For example, * * @str = ".1.3.6.1.4.1.2.3.x.2.22.1.5.1.1.5.x" * @ep = {SAHPI_ENT_CHASSIS, 51}{SAHPI_ENT_SBC_BLADE, 3} * * Returns a normalized string of ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.5.3". * * An @offset is supported and is added to all substituted numbers. * For example, * * @offset = 3 * @str = ".1.3.6.1.4.1.2.3.x.2.22.1.5.1.1.5.x" * @ep = {SAHPI_ENT_CHASSIS, 51}{SAHPI_ENT_SBC_BLADE, 3} * * Returns a normalized string of ".1.3.6.1.4.1.2.3.54.2.22.1.5.1.1.5.6". * * A @base parameter is also supported to allow hex and decimal connversions. * For example, * @base = 10 * @str = "123x" * @ep = {SAHPI_ENT_CHASSIS, 51}{SAHPI_ENT_SBC_BLADE, 11} * * Returns a normalized string of "12311". * * @base = 16 * @str = "123x" * @ep = {SAHPI_ENT_CHASSIS, 51}{SAHPI_ENT_SBC_BLADE, 11} * * Returns a normalized string of "123B". * * If @str does not contain any 'x' characters, this routine still * allocates memory and returns a "normalized" string. In this case, * the normalized string is identical to @str. * * Note! * Caller of this routine MUST g_free() the returned normalized string * when finished with it. * * Returns: * Pointer to normalize string - Normal case. * NULL - Error. **********************************************************************/ gchar * oh_derive_string(SaHpiEntityPathT *ep, SaHpiEntityLocationT offset, int base, const gchar *str) { gchar *new_str = NULL, *str_walker = NULL; gchar **fragments = NULL, **str_nodes = NULL; guint num_epe, num_blanks, str_strlen = 0; guint total_num_digits, i, work_location_num, num_digits; if (!ep || !str) { return(NULL); } if (!(base == 10 || base == 16)) { CRIT("Invalid base."); return(NULL); } for (num_epe = 0; ep->Entry[num_epe].EntityType != SAHPI_ENT_ROOT && num_epe < SAHPI_MAX_ENTITY_PATH; num_epe++); /* DBG("Number of elements in entity path: %d", num_epe); */ if (num_epe == 0) { CRIT("Entity Path is null."); return(NULL); } if ((str_strlen = strlen(str)) == 0) return(NULL); /* Str is zero length */ if (!strrchr(str, OH_DERIVE_BLANK_CHAR)) return(g_strdup(str)); /* Nothing to replace */ for (num_blanks=0, i=0; i num_epe) { CRIT("Number of replacements=%d > entity path elements=%d", num_blanks, num_epe); return(NULL); } fragments = g_strsplit(str, OH_DERIVE_BLANK_STR, - 1); if (!fragments) { CRIT("Cannot split string"); goto CLEANUP; } str_nodes = g_new0(gchar *, num_blanks + 1); if (!str_nodes) { CRIT("Out of memory."); goto CLEANUP; } total_num_digits = 0; for (i=0; iEntry[num_blanks-1-i].EntityLocation; if (offset) { work_location_num = work_location_num + offset; } for (num_digits = 1; (work_location_num = work_location_num/base) > 0; num_digits++); str_nodes[i] = g_new0(gchar, num_digits+1); if (!str_nodes[i]) {CRIT("Out of memory."); goto CLEANUP;} if (base == 10) { snprintf(str_nodes[i], (num_digits + 1) * sizeof(gchar), "%d", ep->Entry[num_blanks - 1 - i].EntityLocation + offset); } else { /* Base 16 */ snprintf(str_nodes[i], (num_digits + 1) * sizeof(gchar), "%X", ep->Entry[num_blanks - 1 - i].EntityLocation + offset); } /* DBG("Location number: %s", str_nodes[i]); */ total_num_digits = total_num_digits + num_digits; } new_str = g_new0(gchar, str_strlen-num_blanks + total_num_digits + 1); if (!new_str) { CRIT("Out of memory."); goto CLEANUP; } str_walker = new_str; for (i=0; fragments[i]; i++) { str_walker = strcpy(str_walker, fragments[i]); str_walker = str_walker + strlen(fragments[i]); if (str_nodes[i]) { str_walker = strcpy(str_walker, str_nodes[i]); /* DBG("Location number: %s", str_nodes[i]); */ str_walker = str_walker + strlen(str_nodes[i]); } /* DBG("New str: %s", new_str); */ } CLEANUP: g_strfreev(fragments); g_strfreev(str_nodes); return(new_str); } /** * oh_compile_entitypath_pattern * @epp_str: entity path pattern string * @epp: place where to put the compiled entity path pattern * * This will create an entitypath pattern structure out of an entity path * pattern string. * * Entity paths are in this format: * {type0,number0}{type1,number1}{type2,number2}...{typen,numbern} * Each {typex,numberx} is refered to as a tuple in the entity path. The number * part of the tuple is also refered to as the location. The type part is an * entity type based on the SaHpiEntityTypeT types defined in SaHpi.h, with the * SAHPI_ENT prefix cut out. * * An entity path pattern is defined as: * <*|{,}> * A splat (*) can take the place of a tuple. It means 0 or more tuples of any * type and any number. * A dot (.) can take the place of a type and also the place of a number within * the tuple. It means any type or any number depending of where it is used. * * Returns: SA_OK on success. **/ SaErrorT oh_compile_entitypath_pattern(const char *epp_str, oh_entitypath_pattern *epp) { int i, j, len, in_tuple = 0, in_entity = 0, start = -1; oh_entitypath_pattern pattern; if (!epp_str || !epp) { return SA_ERR_HPI_INVALID_PARAMS; } memset(&pattern, 0, sizeof(oh_entitypath_pattern)); len = strlen(epp_str); for (i = 0, j = 0; i < len; i++) { if (j >= OH_MAX_EP_TUPLES) return SA_ERR_HPI_ERROR; if (in_tuple) { /* We are scanning inside a tuple */ if (in_entity) { /* Scanning inside the entity type */ if (epp_str[i] == EPATHSTRING_VALUE_DELIMITER_CHAR) { if (start == -1 || i-start > SAHPI_MAX_ENTITY_PATH) { return SA_ERR_HPI_ERROR; } else { SaHpiTextBufferT buf; SaHpiEntityTypeT etype; oh_init_textbuffer(&buf); strncpy((char *)buf.Data, epp_str + start, i-start); buf.DataLength = strlen((char *)buf.Data); if (oh_encode_entitytype(&buf, &etype)) return SA_ERR_HPI_ERROR; pattern.epattern[j].etp.type = etype; in_entity = 0; start = -1; } } else if (epp_str[i] == EPATHSTRING_END_DELIMITER_CHAR || epp_str[i] == EPATHSTRING_START_DELIMITER_CHAR) { return SA_ERR_HPI_ERROR; } else if (epp_str[i] == EPATHPATTERN_DOT) { pattern.epattern[j].is_splat = SAHPI_FALSE; pattern.epattern[j].etp.is_dot = SAHPI_TRUE; in_entity = 0; if (epp_str[i+1] != EPATHSTRING_VALUE_DELIMITER_CHAR) { return SA_ERR_HPI_ERROR; } i++; } else { if (start == -1) start = i; } } else { /* Scanning inside the location number */ if (epp_str[i] == EPATHSTRING_VALUE_DELIMITER_CHAR) { return SA_ERR_HPI_ERROR; } else if (epp_str[i] == EPATHSTRING_START_DELIMITER_CHAR) { return SA_ERR_HPI_ERROR; } else if (epp_str[i] == EPATHSTRING_END_DELIMITER_CHAR) { if (start == -1 || i-start > OH_MAX_LOCATION_DIGITS) { return SA_ERR_HPI_ERROR; } else { char buf[OH_MAX_LOCATION_DIGITS+1], *endptr = NULL; SaHpiEntityLocationT loc; memset(buf, 0, OH_MAX_LOCATION_DIGITS+1); strncpy(buf, epp_str + start, i-start); loc = (SaHpiEntityLocationT)strtoul(buf, &endptr, 10); if (endptr && endptr[0] != '\0') return SA_ERR_HPI_ERROR; pattern.epattern[j].elp.location = loc; in_tuple = 0; start = -1; j++; } } else if (epp_str[i] == EPATHPATTERN_DOT) { pattern.epattern[j].elp.is_dot = SAHPI_TRUE; j++; in_tuple = 0; if (epp_str[i+1] != EPATHSTRING_END_DELIMITER_CHAR) { return SA_ERR_HPI_ERROR; } i++; } else { if (start == -1) start = i; } } } else { /* We are not yet inside a tuple. Could find a splat here. */ if (epp_str[i] == EPATHSTRING_START_DELIMITER_CHAR) { in_tuple = 1; in_entity = 1; } else if (epp_str[i] == EPATHPATTERN_SPLAT) { if (epp_str[i+1] == EPATHPATTERN_SPLAT) return SA_ERR_HPI_ERROR; pattern.epattern[j].is_splat = SAHPI_TRUE; j++; } else { return SA_ERR_HPI_ERROR; } } } memset(epp, 0, sizeof(oh_entitypath_pattern)); for (i = 0, j--; j > -1; j--, i++) { memcpy(epp->epattern + i, pattern.epattern + j, sizeof(oh_entity_pattern)); } epp->epattern[i].etp.type = SAHPI_ENT_ROOT; return SA_OK; } static int ep_ended(SaHpiEntityPathT *ep, int i) { if (!ep || i < 0) return 1; if (i >= SAHPI_MAX_ENTITY_PATH) return 1; if (ep->Entry[i].EntityType == SAHPI_ENT_ROOT) return 1; else return 0; } static int epp_ended(oh_entitypath_pattern *epp, int j) { if (!epp || j < 0) return 1; if (j >= OH_MAX_EP_TUPLES) return 1; if (!epp->epattern[j].is_splat && epp->epattern[j].etp.type == SAHPI_ENT_ROOT) return 1; else return 0; } static int matches(oh_entity_pattern *ep, SaHpiEntityT *e) { if (!ep || !e) return 0; if (ep->is_splat) return 1; if (!ep->etp.is_dot && ep->etp.type != e->EntityType) return 0; else if (!ep->elp.is_dot && ep->elp.location != e->EntityLocation) return 0; else return 1; } /** * oh_match_entitipath_pattern * @epp: entity path pattern * @ep: entity path * * This will match an entity path pattern to an entity path. * * Returns: SAHPI_TRUE if its a match, SAHPI_FALSE if its not. **/ SaHpiBoolT oh_match_entitypath_pattern(oh_entitypath_pattern *epp, SaHpiEntityPathT *ep) { int i = 0, j = 0, splatmode = 0; if (!epp || !ep) return SAHPI_FALSE; if (ep->Entry[0].EntityType == SAHPI_ENT_ROOT) { return SAHPI_FALSE; } else if (!epp->epattern[0].is_splat && epp->epattern[0].etp.type == SAHPI_ENT_ROOT) { return SAHPI_FALSE; } while (i < SAHPI_MAX_ENTITY_PATH) { if (epp->epattern[j].is_splat) { splatmode = 1; j++; /* next item in pattern */ if (epp_ended(epp, j)) break; } else { /* If we saw a splat then non-matches are ok. * Otherwise, they are not ok. */ if (matches(&epp->epattern[j], &ep->Entry[i])) { if (epp_ended(epp, j+1) && ep_ended(ep, i+1)) { break; } else if (epp_ended(epp, j+1) && !ep_ended(ep, i+1)) { if (epp->epattern[j].etp.is_dot && epp->epattern[j].elp.is_dot && splatmode) { i++; continue; } else { return SAHPI_FALSE; } } else if (ep_ended(ep, i+1) && !epp_ended(epp, j+1)) { if (epp->epattern[j+1].is_splat && epp_ended(epp, j+2)) break; else return SAHPI_FALSE; } if (splatmode && !(epp->epattern[j].etp.is_dot && epp->epattern[j].elp.is_dot)) splatmode = 0; i++; /* next tuple in entitypath */ j++; /* next item in pattern */ } else { if (splatmode) i++; /* next tuple in entitypath */ if (!splatmode || ep_ended(ep, i)) return SAHPI_FALSE; } } } return SAHPI_TRUE; } openhpi-3.6.1/utils/sahpi_event_utils.c0000644000175100017510000004212412575647300017220 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #include #include #include #include #include #include #include /** * oh_decode_eventstate: * @event_state: Event state bit map to be converted to a string. * @event_cat: Event category of @event_state. * @buffer: Pointer to buffer to store generated string. * * Converts @event_state into a string based on @event_state's HPI definition. * For example, @event_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR * is returned as the string "UPPER_MINOR | UPPER_MAJOR". * String is stored in an SaHpiTextBufferT data structure. * * Function validates that the @event_state bit map is valid for @event_cat. * * SAHPI_ES_UNSPECIFIED definitions are stripped from @event_state, if there are * other valid non-global states defined. For example, @event_state = * SAHPI_ES_IDLE | SAHPI_ES_UNSPECIFIED, returns the string "IDLE". * * Returns: * SA_OK - normal operation. * SA_ERR_HPI_INVALID_PARAMS - @buffer is NULL; Invalid @event_state or @event_cat. * SA_ERR_HPI_OUT_OF_SPACE - @buffer too small. **/ SaErrorT oh_decode_eventstate(SaHpiEventStateT event_state, SaHpiEventCategoryT event_cat, SaHpiTextBufferT *buffer) { int i, found; SaErrorT err; SaHpiTextBufferT working; /* Don't check for mutual exclusive events, since we want to see them all */ if (!buffer || !oh_valid_eventstate(event_state, event_cat, SAHPI_FALSE)) { return(SA_ERR_HPI_INVALID_PARAMS); } err = oh_init_textbuffer(&working); if (err != SA_OK) { return(err); } found = 0; /* Look for category's event states */ for (i=0; iData == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } if (buffer->DataLength < SAHPI_MAX_TEXT_BUFFER_LENGTH) { buffer->Data[buffer->DataLength] = '\0'; } /* Split out event definitions */ if (buffer->DataLength < SAHPI_MAX_TEXT_BUFFER_LENGTH) { buffer->Data[buffer->DataLength] = '\0'; } gstr = g_strstrip(g_strndup((gchar *)buffer->Data, SAHPI_MAX_TEXT_BUFFER_LENGTH)); if (gstr == NULL || gstr[0] == '\0') { CRIT("g_strstrip failed"); rtncode = SA_ERR_HPI_INTERNAL_ERROR; goto CLEANUP; } eventdefs = g_strsplit(gstr, OH_ENCODE_DELIMITER_CHAR, -1); if (eventdefs == NULL) { rtncode = SA_ERR_HPI_INVALID_PARAMS; goto CLEANUP; } for (i=0; eventdefs[i] != NULL && eventdefs[i][0] != '\0'; i++) { eventdefs[i] = g_strstrip(eventdefs[i]); found_event = found_global_event = 0; /* Look for category event states */ for (j=0; jSource != SAHPI_UNSPECIFIED_RESOURCE_ID || event->EventType != SAHPI_ET_USER || NULL == oh_lookup_severity(event->Severity) || event->Severity == SAHPI_ALL_SEVERITIES || !oh_valid_textbuffer(&(event->EventDataUnion.UserEvent.UserEventData))) { return(SA_ERR_HPI_INVALID_PARAMS); } /* No check for implementation-specific restriction on to how much data may be provided in the SAHPI_ET_USER event */ return(SA_OK); } openhpi-3.6.1/utils/sahpi_enum_utils.c0000644000175100017510000045442012575647300017051 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./SaHpi2code.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * oh_lookup_language: * @value: enum value of type SaHpiLanguageT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiLanguageT. **/ char * oh_lookup_language(SaHpiLanguageT value) { switch (value) { case SAHPI_LANG_UNDEF: return "UNDEF"; case SAHPI_LANG_AFAR: return "AFAR"; case SAHPI_LANG_ABKHAZIAN: return "ABKHAZIAN"; case SAHPI_LANG_AFRIKAANS: return "AFRIKAANS"; case SAHPI_LANG_AMHARIC: return "AMHARIC"; case SAHPI_LANG_ARABIC: return "ARABIC"; case SAHPI_LANG_ASSAMESE: return "ASSAMESE"; case SAHPI_LANG_AYMARA: return "AYMARA"; case SAHPI_LANG_AZERBAIJANI: return "AZERBAIJANI"; case SAHPI_LANG_BASHKIR: return "BASHKIR"; case SAHPI_LANG_BYELORUSSIAN: return "BYELORUSSIAN"; case SAHPI_LANG_BULGARIAN: return "BULGARIAN"; case SAHPI_LANG_BIHARI: return "BIHARI"; case SAHPI_LANG_BISLAMA: return "BISLAMA"; case SAHPI_LANG_BENGALI: return "BENGALI"; case SAHPI_LANG_TIBETAN: return "TIBETAN"; case SAHPI_LANG_BRETON: return "BRETON"; case SAHPI_LANG_CATALAN: return "CATALAN"; case SAHPI_LANG_CORSICAN: return "CORSICAN"; case SAHPI_LANG_CZECH: return "CZECH"; case SAHPI_LANG_WELSH: return "WELSH"; case SAHPI_LANG_DANISH: return "DANISH"; case SAHPI_LANG_GERMAN: return "GERMAN"; case SAHPI_LANG_BHUTANI: return "BHUTANI"; case SAHPI_LANG_GREEK: return "GREEK"; case SAHPI_LANG_ENGLISH: return "ENGLISH"; case SAHPI_LANG_ESPERANTO: return "ESPERANTO"; case SAHPI_LANG_SPANISH: return "SPANISH"; case SAHPI_LANG_ESTONIAN: return "ESTONIAN"; case SAHPI_LANG_BASQUE: return "BASQUE"; case SAHPI_LANG_PERSIAN: return "PERSIAN"; case SAHPI_LANG_FINNISH: return "FINNISH"; case SAHPI_LANG_FIJI: return "FIJI"; case SAHPI_LANG_FAEROESE: return "FAEROESE"; case SAHPI_LANG_FRENCH: return "FRENCH"; case SAHPI_LANG_FRISIAN: return "FRISIAN"; case SAHPI_LANG_IRISH: return "IRISH"; case SAHPI_LANG_SCOTSGAELIC: return "SCOTSGAELIC"; case SAHPI_LANG_GALICIAN: return "GALICIAN"; case SAHPI_LANG_GUARANI: return "GUARANI"; case SAHPI_LANG_GUJARATI: return "GUJARATI"; case SAHPI_LANG_HAUSA: return "HAUSA"; case SAHPI_LANG_HINDI: return "HINDI"; case SAHPI_LANG_CROATIAN: return "CROATIAN"; case SAHPI_LANG_HUNGARIAN: return "HUNGARIAN"; case SAHPI_LANG_ARMENIAN: return "ARMENIAN"; case SAHPI_LANG_INTERLINGUA: return "INTERLINGUA"; case SAHPI_LANG_INTERLINGUE: return "INTERLINGUE"; case SAHPI_LANG_INUPIAK: return "INUPIAK"; case SAHPI_LANG_INDONESIAN: return "INDONESIAN"; case SAHPI_LANG_ICELANDIC: return "ICELANDIC"; case SAHPI_LANG_ITALIAN: return "ITALIAN"; case SAHPI_LANG_HEBREW: return "HEBREW"; case SAHPI_LANG_JAPANESE: return "JAPANESE"; case SAHPI_LANG_YIDDISH: return "YIDDISH"; case SAHPI_LANG_JAVANESE: return "JAVANESE"; case SAHPI_LANG_GEORGIAN: return "GEORGIAN"; case SAHPI_LANG_KAZAKH: return "KAZAKH"; case SAHPI_LANG_GREENLANDIC: return "GREENLANDIC"; case SAHPI_LANG_CAMBODIAN: return "CAMBODIAN"; case SAHPI_LANG_KANNADA: return "KANNADA"; case SAHPI_LANG_KOREAN: return "KOREAN"; case SAHPI_LANG_KASHMIRI: return "KASHMIRI"; case SAHPI_LANG_KURDISH: return "KURDISH"; case SAHPI_LANG_KIRGHIZ: return "KIRGHIZ"; case SAHPI_LANG_LATIN: return "LATIN"; case SAHPI_LANG_LINGALA: return "LINGALA"; case SAHPI_LANG_LAOTHIAN: return "LAOTHIAN"; case SAHPI_LANG_LITHUANIAN: return "LITHUANIAN"; case SAHPI_LANG_LATVIANLETTISH: return "LATVIANLETTISH"; case SAHPI_LANG_MALAGASY: return "MALAGASY"; case SAHPI_LANG_MAORI: return "MAORI"; case SAHPI_LANG_MACEDONIAN: return "MACEDONIAN"; case SAHPI_LANG_MALAYALAM: return "MALAYALAM"; case SAHPI_LANG_MONGOLIAN: return "MONGOLIAN"; case SAHPI_LANG_MOLDAVIAN: return "MOLDAVIAN"; case SAHPI_LANG_MARATHI: return "MARATHI"; case SAHPI_LANG_MALAY: return "MALAY"; case SAHPI_LANG_MALTESE: return "MALTESE"; case SAHPI_LANG_BURMESE: return "BURMESE"; case SAHPI_LANG_NAURU: return "NAURU"; case SAHPI_LANG_NEPALI: return "NEPALI"; case SAHPI_LANG_DUTCH: return "DUTCH"; case SAHPI_LANG_NORWEGIAN: return "NORWEGIAN"; case SAHPI_LANG_OCCITAN: return "OCCITAN"; case SAHPI_LANG_AFANOROMO: return "AFANOROMO"; case SAHPI_LANG_ORIYA: return "ORIYA"; case SAHPI_LANG_PUNJABI: return "PUNJABI"; case SAHPI_LANG_POLISH: return "POLISH"; case SAHPI_LANG_PASHTOPUSHTO: return "PASHTOPUSHTO"; case SAHPI_LANG_PORTUGUESE: return "PORTUGUESE"; case SAHPI_LANG_QUECHUA: return "QUECHUA"; case SAHPI_LANG_RHAETOROMANCE: return "RHAETOROMANCE"; case SAHPI_LANG_KIRUNDI: return "KIRUNDI"; case SAHPI_LANG_ROMANIAN: return "ROMANIAN"; case SAHPI_LANG_RUSSIAN: return "RUSSIAN"; case SAHPI_LANG_KINYARWANDA: return "KINYARWANDA"; case SAHPI_LANG_SANSKRIT: return "SANSKRIT"; case SAHPI_LANG_SINDHI: return "SINDHI"; case SAHPI_LANG_SANGRO: return "SANGRO"; case SAHPI_LANG_SERBOCROATIAN: return "SERBOCROATIAN"; case SAHPI_LANG_SINGHALESE: return "SINGHALESE"; case SAHPI_LANG_SLOVAK: return "SLOVAK"; case SAHPI_LANG_SLOVENIAN: return "SLOVENIAN"; case SAHPI_LANG_SAMOAN: return "SAMOAN"; case SAHPI_LANG_SHONA: return "SHONA"; case SAHPI_LANG_SOMALI: return "SOMALI"; case SAHPI_LANG_ALBANIAN: return "ALBANIAN"; case SAHPI_LANG_SERBIAN: return "SERBIAN"; case SAHPI_LANG_SISWATI: return "SISWATI"; case SAHPI_LANG_SESOTHO: return "SESOTHO"; case SAHPI_LANG_SUDANESE: return "SUDANESE"; case SAHPI_LANG_SWEDISH: return "SWEDISH"; case SAHPI_LANG_SWAHILI: return "SWAHILI"; case SAHPI_LANG_TAMIL: return "TAMIL"; case SAHPI_LANG_TELUGU: return "TELUGU"; case SAHPI_LANG_TAJIK: return "TAJIK"; case SAHPI_LANG_THAI: return "THAI"; case SAHPI_LANG_TIGRINYA: return "TIGRINYA"; case SAHPI_LANG_TURKMEN: return "TURKMEN"; case SAHPI_LANG_TAGALOG: return "TAGALOG"; case SAHPI_LANG_SETSWANA: return "SETSWANA"; case SAHPI_LANG_TONGA: return "TONGA"; case SAHPI_LANG_TURKISH: return "TURKISH"; case SAHPI_LANG_TSONGA: return "TSONGA"; case SAHPI_LANG_TATAR: return "TATAR"; case SAHPI_LANG_TWI: return "TWI"; case SAHPI_LANG_UKRAINIAN: return "UKRAINIAN"; case SAHPI_LANG_URDU: return "URDU"; case SAHPI_LANG_UZBEK: return "UZBEK"; case SAHPI_LANG_VIETNAMESE: return "VIETNAMESE"; case SAHPI_LANG_VOLAPUK: return "VOLAPUK"; case SAHPI_LANG_WOLOF: return "WOLOF"; case SAHPI_LANG_XHOSA: return "XHOSA"; case SAHPI_LANG_YORUBA: return "YORUBA"; case SAHPI_LANG_CHINESE: return "CHINESE"; case SAHPI_LANG_ZULU: return "ZULU"; default: return NULL; } } struct oh_language_map language_strings[] = { {SAHPI_LANG_UNDEF, "UNDEF"}, {SAHPI_LANG_AFAR, "AFAR"}, {SAHPI_LANG_ABKHAZIAN, "ABKHAZIAN"}, {SAHPI_LANG_AFRIKAANS, "AFRIKAANS"}, {SAHPI_LANG_AMHARIC, "AMHARIC"}, {SAHPI_LANG_ARABIC, "ARABIC"}, {SAHPI_LANG_ASSAMESE, "ASSAMESE"}, {SAHPI_LANG_AYMARA, "AYMARA"}, {SAHPI_LANG_AZERBAIJANI, "AZERBAIJANI"}, {SAHPI_LANG_BASHKIR, "BASHKIR"}, {SAHPI_LANG_BYELORUSSIAN, "BYELORUSSIAN"}, {SAHPI_LANG_BULGARIAN, "BULGARIAN"}, {SAHPI_LANG_BIHARI, "BIHARI"}, {SAHPI_LANG_BISLAMA, "BISLAMA"}, {SAHPI_LANG_BENGALI, "BENGALI"}, {SAHPI_LANG_TIBETAN, "TIBETAN"}, {SAHPI_LANG_BRETON, "BRETON"}, {SAHPI_LANG_CATALAN, "CATALAN"}, {SAHPI_LANG_CORSICAN, "CORSICAN"}, {SAHPI_LANG_CZECH, "CZECH"}, {SAHPI_LANG_WELSH, "WELSH"}, {SAHPI_LANG_DANISH, "DANISH"}, {SAHPI_LANG_GERMAN, "GERMAN"}, {SAHPI_LANG_BHUTANI, "BHUTANI"}, {SAHPI_LANG_GREEK, "GREEK"}, {SAHPI_LANG_ENGLISH, "ENGLISH"}, {SAHPI_LANG_ESPERANTO, "ESPERANTO"}, {SAHPI_LANG_SPANISH, "SPANISH"}, {SAHPI_LANG_ESTONIAN, "ESTONIAN"}, {SAHPI_LANG_BASQUE, "BASQUE"}, {SAHPI_LANG_PERSIAN, "PERSIAN"}, {SAHPI_LANG_FINNISH, "FINNISH"}, {SAHPI_LANG_FIJI, "FIJI"}, {SAHPI_LANG_FAEROESE, "FAEROESE"}, {SAHPI_LANG_FRENCH, "FRENCH"}, {SAHPI_LANG_FRISIAN, "FRISIAN"}, {SAHPI_LANG_IRISH, "IRISH"}, {SAHPI_LANG_SCOTSGAELIC, "SCOTSGAELIC"}, {SAHPI_LANG_GALICIAN, "GALICIAN"}, {SAHPI_LANG_GUARANI, "GUARANI"}, {SAHPI_LANG_GUJARATI, "GUJARATI"}, {SAHPI_LANG_HAUSA, "HAUSA"}, {SAHPI_LANG_HINDI, "HINDI"}, {SAHPI_LANG_CROATIAN, "CROATIAN"}, {SAHPI_LANG_HUNGARIAN, "HUNGARIAN"}, {SAHPI_LANG_ARMENIAN, "ARMENIAN"}, {SAHPI_LANG_INTERLINGUA, "INTERLINGUA"}, {SAHPI_LANG_INTERLINGUE, "INTERLINGUE"}, {SAHPI_LANG_INUPIAK, "INUPIAK"}, {SAHPI_LANG_INDONESIAN, "INDONESIAN"}, {SAHPI_LANG_ICELANDIC, "ICELANDIC"}, {SAHPI_LANG_ITALIAN, "ITALIAN"}, {SAHPI_LANG_HEBREW, "HEBREW"}, {SAHPI_LANG_JAPANESE, "JAPANESE"}, {SAHPI_LANG_YIDDISH, "YIDDISH"}, {SAHPI_LANG_JAVANESE, "JAVANESE"}, {SAHPI_LANG_GEORGIAN, "GEORGIAN"}, {SAHPI_LANG_KAZAKH, "KAZAKH"}, {SAHPI_LANG_GREENLANDIC, "GREENLANDIC"}, {SAHPI_LANG_CAMBODIAN, "CAMBODIAN"}, {SAHPI_LANG_KANNADA, "KANNADA"}, {SAHPI_LANG_KOREAN, "KOREAN"}, {SAHPI_LANG_KASHMIRI, "KASHMIRI"}, {SAHPI_LANG_KURDISH, "KURDISH"}, {SAHPI_LANG_KIRGHIZ, "KIRGHIZ"}, {SAHPI_LANG_LATIN, "LATIN"}, {SAHPI_LANG_LINGALA, "LINGALA"}, {SAHPI_LANG_LAOTHIAN, "LAOTHIAN"}, {SAHPI_LANG_LITHUANIAN, "LITHUANIAN"}, {SAHPI_LANG_LATVIANLETTISH, "LATVIANLETTISH"}, {SAHPI_LANG_MALAGASY, "MALAGASY"}, {SAHPI_LANG_MAORI, "MAORI"}, {SAHPI_LANG_MACEDONIAN, "MACEDONIAN"}, {SAHPI_LANG_MALAYALAM, "MALAYALAM"}, {SAHPI_LANG_MONGOLIAN, "MONGOLIAN"}, {SAHPI_LANG_MOLDAVIAN, "MOLDAVIAN"}, {SAHPI_LANG_MARATHI, "MARATHI"}, {SAHPI_LANG_MALAY, "MALAY"}, {SAHPI_LANG_MALTESE, "MALTESE"}, {SAHPI_LANG_BURMESE, "BURMESE"}, {SAHPI_LANG_NAURU, "NAURU"}, {SAHPI_LANG_NEPALI, "NEPALI"}, {SAHPI_LANG_DUTCH, "DUTCH"}, {SAHPI_LANG_NORWEGIAN, "NORWEGIAN"}, {SAHPI_LANG_OCCITAN, "OCCITAN"}, {SAHPI_LANG_AFANOROMO, "AFANOROMO"}, {SAHPI_LANG_ORIYA, "ORIYA"}, {SAHPI_LANG_PUNJABI, "PUNJABI"}, {SAHPI_LANG_POLISH, "POLISH"}, {SAHPI_LANG_PASHTOPUSHTO, "PASHTOPUSHTO"}, {SAHPI_LANG_PORTUGUESE, "PORTUGUESE"}, {SAHPI_LANG_QUECHUA, "QUECHUA"}, {SAHPI_LANG_RHAETOROMANCE, "RHAETOROMANCE"}, {SAHPI_LANG_KIRUNDI, "KIRUNDI"}, {SAHPI_LANG_ROMANIAN, "ROMANIAN"}, {SAHPI_LANG_RUSSIAN, "RUSSIAN"}, {SAHPI_LANG_KINYARWANDA, "KINYARWANDA"}, {SAHPI_LANG_SANSKRIT, "SANSKRIT"}, {SAHPI_LANG_SINDHI, "SINDHI"}, {SAHPI_LANG_SANGRO, "SANGRO"}, {SAHPI_LANG_SERBOCROATIAN, "SERBOCROATIAN"}, {SAHPI_LANG_SINGHALESE, "SINGHALESE"}, {SAHPI_LANG_SLOVAK, "SLOVAK"}, {SAHPI_LANG_SLOVENIAN, "SLOVENIAN"}, {SAHPI_LANG_SAMOAN, "SAMOAN"}, {SAHPI_LANG_SHONA, "SHONA"}, {SAHPI_LANG_SOMALI, "SOMALI"}, {SAHPI_LANG_ALBANIAN, "ALBANIAN"}, {SAHPI_LANG_SERBIAN, "SERBIAN"}, {SAHPI_LANG_SISWATI, "SISWATI"}, {SAHPI_LANG_SESOTHO, "SESOTHO"}, {SAHPI_LANG_SUDANESE, "SUDANESE"}, {SAHPI_LANG_SWEDISH, "SWEDISH"}, {SAHPI_LANG_SWAHILI, "SWAHILI"}, {SAHPI_LANG_TAMIL, "TAMIL"}, {SAHPI_LANG_TELUGU, "TELUGU"}, {SAHPI_LANG_TAJIK, "TAJIK"}, {SAHPI_LANG_THAI, "THAI"}, {SAHPI_LANG_TIGRINYA, "TIGRINYA"}, {SAHPI_LANG_TURKMEN, "TURKMEN"}, {SAHPI_LANG_TAGALOG, "TAGALOG"}, {SAHPI_LANG_SETSWANA, "SETSWANA"}, {SAHPI_LANG_TONGA, "TONGA"}, {SAHPI_LANG_TURKISH, "TURKISH"}, {SAHPI_LANG_TSONGA, "TSONGA"}, {SAHPI_LANG_TATAR, "TATAR"}, {SAHPI_LANG_TWI, "TWI"}, {SAHPI_LANG_UKRAINIAN, "UKRAINIAN"}, {SAHPI_LANG_URDU, "URDU"}, {SAHPI_LANG_UZBEK, "UZBEK"}, {SAHPI_LANG_VIETNAMESE, "VIETNAMESE"}, {SAHPI_LANG_VOLAPUK, "VOLAPUK"}, {SAHPI_LANG_WOLOF, "WOLOF"}, {SAHPI_LANG_XHOSA, "XHOSA"}, {SAHPI_LANG_YORUBA, "YORUBA"}, {SAHPI_LANG_CHINESE, "CHINESE"}, {SAHPI_LANG_ZULU, "ZULU"}, }; /** * oh_encode_language: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiLanguageT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_language(), back * into an SaHpiLanguageT type. * * Returns: * SaHpiLanguageT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_language(SaHpiTextBufferT *buffer, SaHpiLanguageT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, language_strings[i].str) == 0) { found++; break; } } if (found) { *type = language_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_texttype: * @value: enum value of type SaHpiTextTypeT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiTextTypeT. **/ char * oh_lookup_texttype(SaHpiTextTypeT value) { switch (value) { case SAHPI_TL_TYPE_UNICODE: return "UNICODE"; case SAHPI_TL_TYPE_BCDPLUS: return "BCDPLUS"; case SAHPI_TL_TYPE_ASCII6: return "ASCII6"; case SAHPI_TL_TYPE_TEXT: return "TEXT"; case SAHPI_TL_TYPE_BINARY: return "BINARY"; default: return NULL; } } struct oh_texttype_map texttype_strings[] = { {SAHPI_TL_TYPE_UNICODE, "UNICODE"}, {SAHPI_TL_TYPE_BCDPLUS, "BCDPLUS"}, {SAHPI_TL_TYPE_ASCII6, "ASCII6"}, {SAHPI_TL_TYPE_TEXT, "TEXT"}, {SAHPI_TL_TYPE_BINARY, "BINARY"}, }; /** * oh_encode_texttype: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiTextTypeT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_texttype(), back * into an SaHpiTextTypeT type. * * Returns: * SaHpiTextTypeT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_texttype(SaHpiTextBufferT *buffer, SaHpiTextTypeT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, texttype_strings[i].str) == 0) { found++; break; } } if (found) { *type = texttype_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_entitytype: * @value: enum value of type SaHpiEntityTypeT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiEntityTypeT. **/ char * oh_lookup_entitytype(SaHpiEntityTypeT value) { switch (value) { case SAHPI_ENT_UNSPECIFIED: return "UNSPECIFIED"; case SAHPI_ENT_OTHER: return "OTHER"; case SAHPI_ENT_UNKNOWN: return "UNKNOWN"; case SAHPI_ENT_PROCESSOR: return "PROCESSOR"; case SAHPI_ENT_DISK_BAY: return "DISK_BAY"; case SAHPI_ENT_PERIPHERAL_BAY: return "PERIPHERAL_BAY"; case SAHPI_ENT_SYS_MGMNT_MODULE: return "SYS_MGMNT_MODULE"; case SAHPI_ENT_SYSTEM_BOARD: return "SYSTEM_BOARD"; case SAHPI_ENT_MEMORY_MODULE: return "MEMORY_MODULE"; case SAHPI_ENT_PROCESSOR_MODULE: return "PROCESSOR_MODULE"; case SAHPI_ENT_POWER_SUPPLY: return "POWER_SUPPLY"; case SAHPI_ENT_ADD_IN_CARD: return "ADD_IN_CARD"; case SAHPI_ENT_FRONT_PANEL_BOARD: return "FRONT_PANEL_BOARD"; case SAHPI_ENT_BACK_PANEL_BOARD: return "BACK_PANEL_BOARD"; case SAHPI_ENT_POWER_SYSTEM_BOARD: return "POWER_SYSTEM_BOARD"; case SAHPI_ENT_DRIVE_BACKPLANE: return "DRIVE_BACKPLANE"; case SAHPI_ENT_SYS_EXPANSION_BOARD: return "SYS_EXPANSION_BOARD"; case SAHPI_ENT_OTHER_SYSTEM_BOARD: return "OTHER_SYSTEM_BOARD"; case SAHPI_ENT_PROCESSOR_BOARD: return "PROCESSOR_BOARD"; case SAHPI_ENT_POWER_UNIT: return "POWER_UNIT"; case SAHPI_ENT_POWER_MODULE: return "POWER_MODULE"; case SAHPI_ENT_POWER_MGMNT: return "POWER_MGMNT"; case SAHPI_ENT_CHASSIS_BACK_PANEL_BOARD: return "CHASSIS_BACK_PANEL_BOARD"; case SAHPI_ENT_SYSTEM_CHASSIS: return "SYSTEM_CHASSIS"; case SAHPI_ENT_SUB_CHASSIS: return "SUB_CHASSIS"; case SAHPI_ENT_OTHER_CHASSIS_BOARD: return "OTHER_CHASSIS_BOARD"; case SAHPI_ENT_DISK_DRIVE_BAY: return "DISK_DRIVE_BAY"; case SAHPI_ENT_PERIPHERAL_BAY_2: return "PERIPHERAL_BAY_2"; case SAHPI_ENT_DEVICE_BAY: return "DEVICE_BAY"; case SAHPI_ENT_COOLING_DEVICE: return "COOLING_DEVICE"; case SAHPI_ENT_COOLING_UNIT: return "COOLING_UNIT"; case SAHPI_ENT_INTERCONNECT: return "INTERCONNECT"; case SAHPI_ENT_MEMORY_DEVICE: return "MEMORY_DEVICE"; case SAHPI_ENT_SYS_MGMNT_SOFTWARE: return "SYS_MGMNT_SOFTWARE"; case SAHPI_ENT_BIOS: return "BIOS"; case SAHPI_ENT_OPERATING_SYSTEM: return "OPERATING_SYSTEM"; case SAHPI_ENT_SYSTEM_BUS: return "SYSTEM_BUS"; case SAHPI_ENT_GROUP: return "GROUP"; case SAHPI_ENT_REMOTE: return "REMOTE"; case SAHPI_ENT_EXTERNAL_ENVIRONMENT: return "EXTERNAL_ENVIRONMENT"; case SAHPI_ENT_BATTERY: return "BATTERY"; case SAHPI_ENT_PROCESSING_BLADE: return "PROCESSING_BLADE"; case SAHPI_ENT_CONNECTIVITY_SWITCH: return "CONNECTIVITY_SWITCH"; case SAHPI_ENT_PROCESSOR_MEMORY_MODULE: return "PROCESSOR_MEMORY_MODULE"; case SAHPI_ENT_IO_MODULE: return "IO_MODULE"; case SAHPI_ENT_PROCESSOR_IO_MODULE: return "PROCESSOR_IO_MODULE"; case SAHPI_ENT_MC_FIRMWARE: return "MC_FIRMWARE"; case SAHPI_ENT_IPMI_CHANNEL: return "IPMI_CHANNEL"; case SAHPI_ENT_PCI_BUS: return "PCI_BUS"; case SAHPI_ENT_PCI_EXPRESS_BUS: return "PCI_EXPRESS_BUS"; case SAHPI_ENT_SCSI_BUS: return "SCSI_BUS"; case SAHPI_ENT_SATA_BUS: return "SATA_BUS"; case SAHPI_ENT_PROC_FSB: return "PROC_FSB"; case SAHPI_ENT_CLOCK: return "CLOCK"; case SAHPI_ENT_SYSTEM_FIRMWARE: return "SYSTEM_FIRMWARE"; case SAHPI_ENT_CHASSIS_SPECIFIC: return "CHASSIS_SPECIFIC"; case SAHPI_ENT_BOARD_SET_SPECIFIC: return "BOARD_SET_SPECIFIC"; case SAHPI_ENT_OEM_SYSINT_SPECIFIC: return "OEM_SYSINT_SPECIFIC"; case SAHPI_ENT_ROOT: return "ROOT"; case SAHPI_ENT_RACK: return "RACK"; case SAHPI_ENT_SUBRACK: return "SUBRACK"; case SAHPI_ENT_COMPACTPCI_CHASSIS: return "COMPACTPCI_CHASSIS"; case SAHPI_ENT_ADVANCEDTCA_CHASSIS: return "ADVANCEDTCA_CHASSIS"; case SAHPI_ENT_RACK_MOUNTED_SERVER: return "RACK_MOUNTED_SERVER"; case SAHPI_ENT_SYSTEM_BLADE: return "SYSTEM_BLADE"; case SAHPI_ENT_SWITCH: return "SWITCH"; case SAHPI_ENT_SWITCH_BLADE: return "SWITCH_BLADE"; case SAHPI_ENT_SBC_BLADE: return "SBC_BLADE"; case SAHPI_ENT_IO_BLADE: return "IO_BLADE"; case SAHPI_ENT_DISK_BLADE: return "DISK_BLADE"; case SAHPI_ENT_DISK_DRIVE: return "DISK_DRIVE"; case SAHPI_ENT_FAN: return "FAN"; case SAHPI_ENT_POWER_DISTRIBUTION_UNIT: return "POWER_DISTRIBUTION_UNIT"; case SAHPI_ENT_SPEC_PROC_BLADE: return "SPEC_PROC_BLADE"; case SAHPI_ENT_IO_SUBBOARD: return "IO_SUBBOARD"; case SAHPI_ENT_SBC_SUBBOARD: return "SBC_SUBBOARD"; case SAHPI_ENT_ALARM_MANAGER: return "ALARM_MANAGER"; case SAHPI_ENT_SHELF_MANAGER: return "SHELF_MANAGER"; case SAHPI_ENT_DISPLAY_PANEL: return "DISPLAY_PANEL"; case SAHPI_ENT_SUBBOARD_CARRIER_BLADE: return "SUBBOARD_CARRIER_BLADE"; case SAHPI_ENT_PHYSICAL_SLOT: return "PHYSICAL_SLOT"; case SAHPI_ENT_PICMG_FRONT_BLADE: return "PICMG_FRONT_BLADE"; case SAHPI_ENT_SYSTEM_INVENTORY_DEVICE: return "SYSTEM_INVENTORY_DEVICE"; case SAHPI_ENT_FILTRATION_UNIT: return "FILTRATION_UNIT"; case SAHPI_ENT_AMC: return "AMC"; case SAHPI_ENT_BMC: return "BMC"; case SAHPI_ENT_IPMC: return "IPMC"; case SAHPI_ENT_MMC: return "MMC"; case SAHPI_ENT_SHMC: return "SHMC"; case SAHPI_ENT_CPLD: return "CPLD"; case SAHPI_ENT_EPLD: return "EPLD"; case SAHPI_ENT_FPGA: return "FPGA"; case SAHPI_ENT_DASD: return "DASD"; case SAHPI_ENT_NIC: return "NIC"; case SAHPI_ENT_DSP: return "DSP"; case SAHPI_ENT_UCODE: return "UCODE"; case SAHPI_ENT_NPU: return "NPU"; case SAHPI_ENT_OEM: return "OEM"; case SAHPI_ENT_INTERFACE: return "INTERFACE"; case SAHPI_ENT_MICROTCA_CHASSIS: return "MICROTCA_CHASSIS"; case SAHPI_ENT_CARRIER: return "CARRIER"; case SAHPI_ENT_CARRIER_MANAGER: return "CARRIER_MANAGER"; case SAHPI_ENT_CONFIG_DATA: return "CONFIG_DATA"; case SAHPI_ENT_INDICATOR: return "INDICATOR"; default: return oh_lookup_xtcahpientitytype(value); } } struct oh_entitytype_map entitytype_strings[] = { {SAHPI_ENT_UNSPECIFIED, "UNSPECIFIED"}, {SAHPI_ENT_OTHER, "OTHER"}, {SAHPI_ENT_UNKNOWN, "UNKNOWN"}, {SAHPI_ENT_PROCESSOR, "PROCESSOR"}, {SAHPI_ENT_DISK_BAY, "DISK_BAY"}, {SAHPI_ENT_PERIPHERAL_BAY, "PERIPHERAL_BAY"}, {SAHPI_ENT_SYS_MGMNT_MODULE, "SYS_MGMNT_MODULE"}, {SAHPI_ENT_SYSTEM_BOARD, "SYSTEM_BOARD"}, {SAHPI_ENT_MEMORY_MODULE, "MEMORY_MODULE"}, {SAHPI_ENT_PROCESSOR_MODULE, "PROCESSOR_MODULE"}, {SAHPI_ENT_POWER_SUPPLY, "POWER_SUPPLY"}, {SAHPI_ENT_ADD_IN_CARD, "ADD_IN_CARD"}, {SAHPI_ENT_FRONT_PANEL_BOARD, "FRONT_PANEL_BOARD"}, {SAHPI_ENT_BACK_PANEL_BOARD, "BACK_PANEL_BOARD"}, {SAHPI_ENT_POWER_SYSTEM_BOARD, "POWER_SYSTEM_BOARD"}, {SAHPI_ENT_DRIVE_BACKPLANE, "DRIVE_BACKPLANE"}, {SAHPI_ENT_SYS_EXPANSION_BOARD, "SYS_EXPANSION_BOARD"}, {SAHPI_ENT_OTHER_SYSTEM_BOARD, "OTHER_SYSTEM_BOARD"}, {SAHPI_ENT_PROCESSOR_BOARD, "PROCESSOR_BOARD"}, {SAHPI_ENT_POWER_UNIT, "POWER_UNIT"}, {SAHPI_ENT_POWER_MODULE, "POWER_MODULE"}, {SAHPI_ENT_POWER_MGMNT, "POWER_MGMNT"}, {SAHPI_ENT_CHASSIS_BACK_PANEL_BOARD, "CHASSIS_BACK_PANEL_BOARD"}, {SAHPI_ENT_SYSTEM_CHASSIS, "SYSTEM_CHASSIS"}, {SAHPI_ENT_SUB_CHASSIS, "SUB_CHASSIS"}, {SAHPI_ENT_OTHER_CHASSIS_BOARD, "OTHER_CHASSIS_BOARD"}, {SAHPI_ENT_DISK_DRIVE_BAY, "DISK_DRIVE_BAY"}, {SAHPI_ENT_PERIPHERAL_BAY_2, "PERIPHERAL_BAY_2"}, {SAHPI_ENT_DEVICE_BAY, "DEVICE_BAY"}, {SAHPI_ENT_COOLING_DEVICE, "COOLING_DEVICE"}, {SAHPI_ENT_COOLING_UNIT, "COOLING_UNIT"}, {SAHPI_ENT_INTERCONNECT, "INTERCONNECT"}, {SAHPI_ENT_MEMORY_DEVICE, "MEMORY_DEVICE"}, {SAHPI_ENT_SYS_MGMNT_SOFTWARE, "SYS_MGMNT_SOFTWARE"}, {SAHPI_ENT_BIOS, "BIOS"}, {SAHPI_ENT_OPERATING_SYSTEM, "OPERATING_SYSTEM"}, {SAHPI_ENT_SYSTEM_BUS, "SYSTEM_BUS"}, {SAHPI_ENT_GROUP, "GROUP"}, {SAHPI_ENT_REMOTE, "REMOTE"}, {SAHPI_ENT_EXTERNAL_ENVIRONMENT, "EXTERNAL_ENVIRONMENT"}, {SAHPI_ENT_BATTERY, "BATTERY"}, {SAHPI_ENT_PROCESSING_BLADE, "PROCESSING_BLADE"}, {SAHPI_ENT_CONNECTIVITY_SWITCH, "CONNECTIVITY_SWITCH"}, {SAHPI_ENT_PROCESSOR_MEMORY_MODULE, "PROCESSOR_MEMORY_MODULE"}, {SAHPI_ENT_IO_MODULE, "IO_MODULE"}, {SAHPI_ENT_PROCESSOR_IO_MODULE, "PROCESSOR_IO_MODULE"}, {SAHPI_ENT_MC_FIRMWARE, "MC_FIRMWARE"}, {SAHPI_ENT_IPMI_CHANNEL, "IPMI_CHANNEL"}, {SAHPI_ENT_PCI_BUS, "PCI_BUS"}, {SAHPI_ENT_PCI_EXPRESS_BUS, "PCI_EXPRESS_BUS"}, {SAHPI_ENT_SCSI_BUS, "SCSI_BUS"}, {SAHPI_ENT_SATA_BUS, "SATA_BUS"}, {SAHPI_ENT_PROC_FSB, "PROC_FSB"}, {SAHPI_ENT_CLOCK, "CLOCK"}, {SAHPI_ENT_SYSTEM_FIRMWARE, "SYSTEM_FIRMWARE"}, {SAHPI_ENT_CHASSIS_SPECIFIC, "CHASSIS_SPECIFIC"}, {SAHPI_ENT_BOARD_SET_SPECIFIC, "BOARD_SET_SPECIFIC"}, {SAHPI_ENT_OEM_SYSINT_SPECIFIC, "OEM_SYSINT_SPECIFIC"}, {SAHPI_ENT_ROOT, "ROOT"}, {SAHPI_ENT_RACK, "RACK"}, {SAHPI_ENT_SUBRACK, "SUBRACK"}, {SAHPI_ENT_COMPACTPCI_CHASSIS, "COMPACTPCI_CHASSIS"}, {SAHPI_ENT_ADVANCEDTCA_CHASSIS, "ADVANCEDTCA_CHASSIS"}, {SAHPI_ENT_RACK_MOUNTED_SERVER, "RACK_MOUNTED_SERVER"}, {SAHPI_ENT_SYSTEM_BLADE, "SYSTEM_BLADE"}, {SAHPI_ENT_SWITCH, "SWITCH"}, {SAHPI_ENT_SWITCH_BLADE, "SWITCH_BLADE"}, {SAHPI_ENT_SBC_BLADE, "SBC_BLADE"}, {SAHPI_ENT_IO_BLADE, "IO_BLADE"}, {SAHPI_ENT_DISK_BLADE, "DISK_BLADE"}, {SAHPI_ENT_DISK_DRIVE, "DISK_DRIVE"}, {SAHPI_ENT_FAN, "FAN"}, {SAHPI_ENT_POWER_DISTRIBUTION_UNIT, "POWER_DISTRIBUTION_UNIT"}, {SAHPI_ENT_SPEC_PROC_BLADE, "SPEC_PROC_BLADE"}, {SAHPI_ENT_IO_SUBBOARD, "IO_SUBBOARD"}, {SAHPI_ENT_SBC_SUBBOARD, "SBC_SUBBOARD"}, {SAHPI_ENT_ALARM_MANAGER, "ALARM_MANAGER"}, {SAHPI_ENT_SHELF_MANAGER, "SHELF_MANAGER"}, {SAHPI_ENT_DISPLAY_PANEL, "DISPLAY_PANEL"}, {SAHPI_ENT_SUBBOARD_CARRIER_BLADE, "SUBBOARD_CARRIER_BLADE"}, {SAHPI_ENT_PHYSICAL_SLOT, "PHYSICAL_SLOT"}, {SAHPI_ENT_PICMG_FRONT_BLADE, "PICMG_FRONT_BLADE"}, {SAHPI_ENT_SYSTEM_INVENTORY_DEVICE, "SYSTEM_INVENTORY_DEVICE"}, {SAHPI_ENT_FILTRATION_UNIT, "FILTRATION_UNIT"}, {SAHPI_ENT_AMC, "AMC"}, {SAHPI_ENT_BMC, "BMC"}, {SAHPI_ENT_IPMC, "IPMC"}, {SAHPI_ENT_MMC, "MMC"}, {SAHPI_ENT_SHMC, "SHMC"}, {SAHPI_ENT_CPLD, "CPLD"}, {SAHPI_ENT_EPLD, "EPLD"}, {SAHPI_ENT_FPGA, "FPGA"}, {SAHPI_ENT_DASD, "DASD"}, {SAHPI_ENT_NIC, "NIC"}, {SAHPI_ENT_DSP, "DSP"}, {SAHPI_ENT_UCODE, "UCODE"}, {SAHPI_ENT_NPU, "NPU"}, {SAHPI_ENT_OEM, "OEM"}, {SAHPI_ENT_INTERFACE, "INTERFACE"}, {SAHPI_ENT_MICROTCA_CHASSIS, "MICROTCA_CHASSIS"}, {SAHPI_ENT_CARRIER, "CARRIER"}, {SAHPI_ENT_CARRIER_MANAGER, "CARRIER_MANAGER"}, {SAHPI_ENT_CONFIG_DATA, "CONFIG_DATA"}, {SAHPI_ENT_INDICATOR, "INDICATOR"}, }; /** * oh_encode_entitytype: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiEntityTypeT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_entitytype(), back * into an SaHpiEntityTypeT type. * * Returns: * SaHpiEntityTypeT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_entitytype(SaHpiTextBufferT *buffer, SaHpiEntityTypeT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, entitytype_strings[i].str) == 0) { found++; break; } } if (found) { *type = entitytype_strings[i].entity_type; } else { return(oh_encode_xtcahpientitytype(buffer, type)); } return(SA_OK); } /** * oh_lookup_sensortype: * @value: enum value of type SaHpiSensorTypeT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiSensorTypeT. **/ char * oh_lookup_sensortype(SaHpiSensorTypeT value) { // OEM Sensor Type if ((value >= SAHPI_OEM_SENSOR) && (value <= (SAHPI_OEM_SENSOR + 0x3F))) { return "OEM_SENSOR"; } switch (value) { case SAHPI_TEMPERATURE: return "TEMPERATURE"; case SAHPI_VOLTAGE: return "VOLTAGE"; case SAHPI_CURRENT: return "CURRENT"; case SAHPI_FAN: return "FAN"; case SAHPI_PHYSICAL_SECURITY: return "PHYSICAL_SECURITY"; case SAHPI_PLATFORM_VIOLATION: return "PLATFORM_VIOLATION"; case SAHPI_PROCESSOR: return "PROCESSOR"; case SAHPI_POWER_SUPPLY: return "POWER_SUPPLY"; case SAHPI_POWER_UNIT: return "POWER_UNIT"; case SAHPI_COOLING_DEVICE: return "COOLING_DEVICE"; case SAHPI_OTHER_UNITS_BASED_SENSOR: return "OTHER_UNITS_BASED_SENSOR"; case SAHPI_MEMORY: return "MEMORY"; case SAHPI_DRIVE_SLOT: return "DRIVE_SLOT"; case SAHPI_POST_MEMORY_RESIZE: return "POST_MEMORY_RESIZE"; case SAHPI_SYSTEM_FW_PROGRESS: return "SYSTEM_FW_PROGRESS"; case SAHPI_EVENT_LOGGING_DISABLED: return "EVENT_LOGGING_DISABLED"; case SAHPI_RESERVED1: return "RESERVED1"; case SAHPI_SYSTEM_EVENT: return "SYSTEM_EVENT"; case SAHPI_CRITICAL_INTERRUPT: return "CRITICAL_INTERRUPT"; case SAHPI_BUTTON: return "BUTTON"; case SAHPI_MODULE_BOARD: return "MODULE_BOARD"; case SAHPI_MICROCONTROLLER_COPROCESSOR: return "MICROCONTROLLER_COPROCESSOR"; case SAHPI_ADDIN_CARD: return "ADDIN_CARD"; case SAHPI_CHASSIS: return "CHASSIS"; case SAHPI_CHIP_SET: return "CHIP_SET"; case SAHPI_OTHER_FRU: return "OTHER_FRU"; case SAHPI_CABLE_INTERCONNECT: return "CABLE_INTERCONNECT"; case SAHPI_TERMINATOR: return "TERMINATOR"; case SAHPI_SYSTEM_BOOT_INITIATED: return "SYSTEM_BOOT_INITIATED"; case SAHPI_BOOT_ERROR: return "BOOT_ERROR"; case SAHPI_OS_BOOT: return "OS_BOOT"; case SAHPI_OS_CRITICAL_STOP: return "OS_CRITICAL_STOP"; case SAHPI_SLOT_CONNECTOR: return "SLOT_CONNECTOR"; case SAHPI_SYSTEM_ACPI_POWER_STATE: return "SYSTEM_ACPI_POWER_STATE"; case SAHPI_RESERVED2: return "RESERVED2"; case SAHPI_PLATFORM_ALERT: return "PLATFORM_ALERT"; case SAHPI_ENTITY_PRESENCE: return "ENTITY_PRESENCE"; case SAHPI_MONITOR_ASIC_IC: return "MONITOR_ASIC_IC"; case SAHPI_LAN: return "LAN"; case SAHPI_MANAGEMENT_SUBSYSTEM_HEALTH: return "MANAGEMENT_SUBSYSTEM_HEALTH"; case SAHPI_BATTERY: return "BATTERY"; case SAHPI_SESSION_AUDIT: return "SESSION_AUDIT"; case SAHPI_VERSION_CHANGE: return "VERSION_CHANGE"; case SAHPI_OPERATIONAL: return "OPERATIONAL"; case SAHPI_COMM_CHANNEL_LINK_STATE: return "COMM_CHANNEL_LINK_STATE"; case SAHPI_MANAGEMENT_BUS_STATE: return "MANAGEMENT_BUS_STATE"; case SAHPI_COMM_CHANNEL_BUS_STATE: return "COMM_CHANNEL_BUS_STATE"; case SAHPI_CONFIG_DATA: return "CONFIG_DATA"; case SAHPI_POWER_BUDGET: return "POWER_BUDGET"; default: return NULL; } } struct oh_sensortype_map sensortype_strings[] = { {SAHPI_TEMPERATURE, "TEMPERATURE"}, {SAHPI_VOLTAGE, "VOLTAGE"}, {SAHPI_CURRENT, "CURRENT"}, {SAHPI_FAN, "FAN"}, {SAHPI_PHYSICAL_SECURITY, "PHYSICAL_SECURITY"}, {SAHPI_PLATFORM_VIOLATION, "PLATFORM_VIOLATION"}, {SAHPI_PROCESSOR, "PROCESSOR"}, {SAHPI_POWER_SUPPLY, "POWER_SUPPLY"}, {SAHPI_POWER_UNIT, "POWER_UNIT"}, {SAHPI_COOLING_DEVICE, "COOLING_DEVICE"}, {SAHPI_OTHER_UNITS_BASED_SENSOR, "OTHER_UNITS_BASED_SENSOR"}, {SAHPI_MEMORY, "MEMORY"}, {SAHPI_DRIVE_SLOT, "DRIVE_SLOT"}, {SAHPI_POST_MEMORY_RESIZE, "POST_MEMORY_RESIZE"}, {SAHPI_SYSTEM_FW_PROGRESS, "SYSTEM_FW_PROGRESS"}, {SAHPI_EVENT_LOGGING_DISABLED, "EVENT_LOGGING_DISABLED"}, {SAHPI_RESERVED1, "RESERVED1"}, {SAHPI_SYSTEM_EVENT, "SYSTEM_EVENT"}, {SAHPI_CRITICAL_INTERRUPT, "CRITICAL_INTERRUPT"}, {SAHPI_BUTTON, "BUTTON"}, {SAHPI_MODULE_BOARD, "MODULE_BOARD"}, {SAHPI_MICROCONTROLLER_COPROCESSOR, "MICROCONTROLLER_COPROCESSOR"}, {SAHPI_ADDIN_CARD, "ADDIN_CARD"}, {SAHPI_CHASSIS, "CHASSIS"}, {SAHPI_CHIP_SET, "CHIP_SET"}, {SAHPI_OTHER_FRU, "OTHER_FRU"}, {SAHPI_CABLE_INTERCONNECT, "CABLE_INTERCONNECT"}, {SAHPI_TERMINATOR, "TERMINATOR"}, {SAHPI_SYSTEM_BOOT_INITIATED, "SYSTEM_BOOT_INITIATED"}, {SAHPI_BOOT_ERROR, "BOOT_ERROR"}, {SAHPI_OS_BOOT, "OS_BOOT"}, {SAHPI_OS_CRITICAL_STOP, "OS_CRITICAL_STOP"}, {SAHPI_SLOT_CONNECTOR, "SLOT_CONNECTOR"}, {SAHPI_SYSTEM_ACPI_POWER_STATE, "SYSTEM_ACPI_POWER_STATE"}, {SAHPI_RESERVED2, "RESERVED2"}, {SAHPI_PLATFORM_ALERT, "PLATFORM_ALERT"}, {SAHPI_ENTITY_PRESENCE, "ENTITY_PRESENCE"}, {SAHPI_MONITOR_ASIC_IC, "MONITOR_ASIC_IC"}, {SAHPI_LAN, "LAN"}, {SAHPI_MANAGEMENT_SUBSYSTEM_HEALTH, "MANAGEMENT_SUBSYSTEM_HEALTH"}, {SAHPI_BATTERY, "BATTERY"}, {SAHPI_SESSION_AUDIT, "SESSION_AUDIT"}, {SAHPI_VERSION_CHANGE, "VERSION_CHANGE"}, {SAHPI_OPERATIONAL, "OPERATIONAL"}, {SAHPI_OEM_SENSOR, "OEM_SENSOR"}, {SAHPI_COMM_CHANNEL_LINK_STATE, "COMM_CHANNEL_LINK_STATE"}, {SAHPI_MANAGEMENT_BUS_STATE, "MANAGEMENT_BUS_STATE"}, {SAHPI_COMM_CHANNEL_BUS_STATE, "COMM_CHANNEL_BUS_STATE"}, {SAHPI_CONFIG_DATA, "CONFIG_DATA"}, {SAHPI_POWER_BUDGET, "POWER_BUDGET"}, }; /** * oh_encode_sensortype: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiSensorTypeT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_sensortype(), back * into an SaHpiSensorTypeT type. * * Returns: * SaHpiSensorTypeT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_sensortype(SaHpiTextBufferT *buffer, SaHpiSensorTypeT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, sensortype_strings[i].str) == 0) { found++; break; } } if (found) { *type = sensortype_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_sensorreadingtype: * @value: enum value of type SaHpiSensorReadingTypeT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiSensorReadingTypeT. **/ char * oh_lookup_sensorreadingtype(SaHpiSensorReadingTypeT value) { switch (value) { case SAHPI_SENSOR_READING_TYPE_INT64: return "INT64"; case SAHPI_SENSOR_READING_TYPE_UINT64: return "UINT64"; case SAHPI_SENSOR_READING_TYPE_FLOAT64: return "FLOAT64"; case SAHPI_SENSOR_READING_TYPE_BUFFER: return "BUFFER"; default: return NULL; } } struct oh_sensorreadingtype_map sensorreadingtype_strings[] = { {SAHPI_SENSOR_READING_TYPE_INT64, "INT64"}, {SAHPI_SENSOR_READING_TYPE_UINT64, "UINT64"}, {SAHPI_SENSOR_READING_TYPE_FLOAT64, "FLOAT64"}, {SAHPI_SENSOR_READING_TYPE_BUFFER, "BUFFER"}, }; /** * oh_encode_sensorreadingtype: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiSensorReadingTypeT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_sensorreadingtype(), back * into an SaHpiSensorReadingTypeT type. * * Returns: * SaHpiSensorReadingTypeT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_sensorreadingtype(SaHpiTextBufferT *buffer, SaHpiSensorReadingTypeT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, sensorreadingtype_strings[i].str) == 0) { found++; break; } } if (found) { *type = sensorreadingtype_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_sensoreventmaskaction: * @value: enum value of type SaHpiSensorEventMaskActionT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiSensorEventMaskActionT. **/ char * oh_lookup_sensoreventmaskaction(SaHpiSensorEventMaskActionT value) { switch (value) { case SAHPI_SENS_ADD_EVENTS_TO_MASKS: return "ADD_EVENTS_TO_MASKS"; case SAHPI_SENS_REMOVE_EVENTS_FROM_MASKS: return "REMOVE_EVENTS_FROM_MASKS"; default: return NULL; } } struct oh_sensoreventmaskaction_map sensoreventmaskaction_strings[] = { {SAHPI_SENS_ADD_EVENTS_TO_MASKS, "ADD_EVENTS_TO_MASKS"}, {SAHPI_SENS_REMOVE_EVENTS_FROM_MASKS, "REMOVE_EVENTS_FROM_MASKS"}, }; /** * oh_encode_sensoreventmaskaction: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiSensorEventMaskActionT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_sensoreventmaskaction(), back * into an SaHpiSensorEventMaskActionT type. * * Returns: * SaHpiSensorEventMaskActionT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_sensoreventmaskaction(SaHpiTextBufferT *buffer, SaHpiSensorEventMaskActionT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, sensoreventmaskaction_strings[i].str) == 0) { found++; break; } } if (found) { *type = sensoreventmaskaction_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_sensorunits: * @value: enum value of type SaHpiSensorUnitsT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiSensorUnitsT. **/ char * oh_lookup_sensorunits(SaHpiSensorUnitsT value) { switch (value) { case SAHPI_SU_UNSPECIFIED: return "Unspecified"; case SAHPI_SU_DEGREES_C: return "Degrees C"; case SAHPI_SU_DEGREES_F: return "Degrees F"; case SAHPI_SU_DEGREES_K: return "Degrees K"; case SAHPI_SU_VOLTS: return "Volts"; case SAHPI_SU_AMPS: return "Amps"; case SAHPI_SU_WATTS: return "Watts"; case SAHPI_SU_JOULES: return "Joules"; case SAHPI_SU_COULOMBS: return "Coulombs"; case SAHPI_SU_VA: return "Va"; case SAHPI_SU_NITS: return "Nits"; case SAHPI_SU_LUMEN: return "Lumen"; case SAHPI_SU_LUX: return "Lux"; case SAHPI_SU_CANDELA: return "Candela"; case SAHPI_SU_KPA: return "Kpa"; case SAHPI_SU_PSI: return "Psi"; case SAHPI_SU_NEWTON: return "Newton"; case SAHPI_SU_CFM: return "Cfm"; case SAHPI_SU_RPM: return "Rpm"; case SAHPI_SU_HZ: return "Hz"; case SAHPI_SU_MICROSECOND: return "Microsecond"; case SAHPI_SU_MILLISECOND: return "Millisecond"; case SAHPI_SU_SECOND: return "Second"; case SAHPI_SU_MINUTE: return "Minute"; case SAHPI_SU_HOUR: return "Hour"; case SAHPI_SU_DAY: return "Day"; case SAHPI_SU_WEEK: return "Week"; case SAHPI_SU_MIL: return "Mil"; case SAHPI_SU_INCHES: return "Inches"; case SAHPI_SU_FEET: return "Feet"; case SAHPI_SU_CU_IN: return "Cu In"; case SAHPI_SU_CU_FEET: return "Cu Feet"; case SAHPI_SU_MM: return "Mm"; case SAHPI_SU_CM: return "Cm"; case SAHPI_SU_M: return "M"; case SAHPI_SU_CU_CM: return "Cu Cm"; case SAHPI_SU_CU_M: return "Cu M"; case SAHPI_SU_LITERS: return "Liters"; case SAHPI_SU_FLUID_OUNCE: return "Fluid Ounce"; case SAHPI_SU_RADIANS: return "Radians"; case SAHPI_SU_STERADIANS: return "Steradians"; case SAHPI_SU_REVOLUTIONS: return "Revolutions"; case SAHPI_SU_CYCLES: return "Cycles"; case SAHPI_SU_GRAVITIES: return "Gravities"; case SAHPI_SU_OUNCE: return "Ounce"; case SAHPI_SU_POUND: return "Pound"; case SAHPI_SU_FT_LB: return "Ft Lb"; case SAHPI_SU_OZ_IN: return "Oz In"; case SAHPI_SU_GAUSS: return "Gauss"; case SAHPI_SU_GILBERTS: return "Gilberts"; case SAHPI_SU_HENRY: return "Henry"; case SAHPI_SU_MILLIHENRY: return "Millihenry"; case SAHPI_SU_FARAD: return "Farad"; case SAHPI_SU_MICROFARAD: return "Microfarad"; case SAHPI_SU_OHMS: return "Ohms"; case SAHPI_SU_SIEMENS: return "Siemens"; case SAHPI_SU_MOLE: return "Mole"; case SAHPI_SU_BECQUEREL: return "Becquerel"; case SAHPI_SU_PPM: return "Ppm"; case SAHPI_SU_RESERVED: return "Reserved"; case SAHPI_SU_DECIBELS: return "Decibels"; case SAHPI_SU_DBA: return "Dba"; case SAHPI_SU_DBC: return "Dbc"; case SAHPI_SU_GRAY: return "Gray"; case SAHPI_SU_SIEVERT: return "Sievert"; case SAHPI_SU_COLOR_TEMP_DEG_K: return "Color Temp Deg K"; case SAHPI_SU_BIT: return "Bit"; case SAHPI_SU_KILOBIT: return "Kilobit"; case SAHPI_SU_MEGABIT: return "Megabit"; case SAHPI_SU_GIGABIT: return "Gigabit"; case SAHPI_SU_BYTE: return "Byte"; case SAHPI_SU_KILOBYTE: return "Kilobyte"; case SAHPI_SU_MEGABYTE: return "Megabyte"; case SAHPI_SU_GIGABYTE: return "Gigabyte"; case SAHPI_SU_WORD: return "Word"; case SAHPI_SU_DWORD: return "Dword"; case SAHPI_SU_QWORD: return "Qword"; case SAHPI_SU_LINE: return "Line"; case SAHPI_SU_HIT: return "Hit"; case SAHPI_SU_MISS: return "Miss"; case SAHPI_SU_RETRY: return "Retry"; case SAHPI_SU_RESET: return "Reset"; case SAHPI_SU_OVERRUN: return "Overrun"; case SAHPI_SU_UNDERRUN: return "Underrun"; case SAHPI_SU_COLLISION: return "Collision"; case SAHPI_SU_PACKETS: return "Packets"; case SAHPI_SU_MESSAGES: return "Messages"; case SAHPI_SU_CHARACTERS: return "Characters"; case SAHPI_SU_ERRORS: return "Errors"; case SAHPI_SU_CORRECTABLE_ERRORS: return "Correctable Errors"; case SAHPI_SU_UNCORRECTABLE_ERRORS: return "Uncorrectable Errors"; default: return NULL; } } struct oh_sensorunits_map sensorunits_strings[] = { {SAHPI_SU_UNSPECIFIED, "Unspecified"}, {SAHPI_SU_DEGREES_C, "Degrees C"}, {SAHPI_SU_DEGREES_F, "Degrees F"}, {SAHPI_SU_DEGREES_K, "Degrees K"}, {SAHPI_SU_VOLTS, "Volts"}, {SAHPI_SU_AMPS, "Amps"}, {SAHPI_SU_WATTS, "Watts"}, {SAHPI_SU_JOULES, "Joules"}, {SAHPI_SU_COULOMBS, "Coulombs"}, {SAHPI_SU_VA, "Va"}, {SAHPI_SU_NITS, "Nits"}, {SAHPI_SU_LUMEN, "Lumen"}, {SAHPI_SU_LUX, "Lux"}, {SAHPI_SU_CANDELA, "Candela"}, {SAHPI_SU_KPA, "Kpa"}, {SAHPI_SU_PSI, "Psi"}, {SAHPI_SU_NEWTON, "Newton"}, {SAHPI_SU_CFM, "Cfm"}, {SAHPI_SU_RPM, "Rpm"}, {SAHPI_SU_HZ, "Hz"}, {SAHPI_SU_MICROSECOND, "Microsecond"}, {SAHPI_SU_MILLISECOND, "Millisecond"}, {SAHPI_SU_SECOND, "Second"}, {SAHPI_SU_MINUTE, "Minute"}, {SAHPI_SU_HOUR, "Hour"}, {SAHPI_SU_DAY, "Day"}, {SAHPI_SU_WEEK, "Week"}, {SAHPI_SU_MIL, "Mil"}, {SAHPI_SU_INCHES, "Inches"}, {SAHPI_SU_FEET, "Feet"}, {SAHPI_SU_CU_IN, "Cu In"}, {SAHPI_SU_CU_FEET, "Cu Feet"}, {SAHPI_SU_MM, "Mm"}, {SAHPI_SU_CM, "Cm"}, {SAHPI_SU_M, "M"}, {SAHPI_SU_CU_CM, "Cu Cm"}, {SAHPI_SU_CU_M, "Cu M"}, {SAHPI_SU_LITERS, "Liters"}, {SAHPI_SU_FLUID_OUNCE, "Fluid Ounce"}, {SAHPI_SU_RADIANS, "Radians"}, {SAHPI_SU_STERADIANS, "Steradians"}, {SAHPI_SU_REVOLUTIONS, "Revolutions"}, {SAHPI_SU_CYCLES, "Cycles"}, {SAHPI_SU_GRAVITIES, "Gravities"}, {SAHPI_SU_OUNCE, "Ounce"}, {SAHPI_SU_POUND, "Pound"}, {SAHPI_SU_FT_LB, "Ft Lb"}, {SAHPI_SU_OZ_IN, "Oz In"}, {SAHPI_SU_GAUSS, "Gauss"}, {SAHPI_SU_GILBERTS, "Gilberts"}, {SAHPI_SU_HENRY, "Henry"}, {SAHPI_SU_MILLIHENRY, "Millihenry"}, {SAHPI_SU_FARAD, "Farad"}, {SAHPI_SU_MICROFARAD, "Microfarad"}, {SAHPI_SU_OHMS, "Ohms"}, {SAHPI_SU_SIEMENS, "Siemens"}, {SAHPI_SU_MOLE, "Mole"}, {SAHPI_SU_BECQUEREL, "Becquerel"}, {SAHPI_SU_PPM, "Ppm"}, {SAHPI_SU_RESERVED, "Reserved"}, {SAHPI_SU_DECIBELS, "Decibels"}, {SAHPI_SU_DBA, "Dba"}, {SAHPI_SU_DBC, "Dbc"}, {SAHPI_SU_GRAY, "Gray"}, {SAHPI_SU_SIEVERT, "Sievert"}, {SAHPI_SU_COLOR_TEMP_DEG_K, "Color Temp Deg K"}, {SAHPI_SU_BIT, "Bit"}, {SAHPI_SU_KILOBIT, "Kilobit"}, {SAHPI_SU_MEGABIT, "Megabit"}, {SAHPI_SU_GIGABIT, "Gigabit"}, {SAHPI_SU_BYTE, "Byte"}, {SAHPI_SU_KILOBYTE, "Kilobyte"}, {SAHPI_SU_MEGABYTE, "Megabyte"}, {SAHPI_SU_GIGABYTE, "Gigabyte"}, {SAHPI_SU_WORD, "Word"}, {SAHPI_SU_DWORD, "Dword"}, {SAHPI_SU_QWORD, "Qword"}, {SAHPI_SU_LINE, "Line"}, {SAHPI_SU_HIT, "Hit"}, {SAHPI_SU_MISS, "Miss"}, {SAHPI_SU_RETRY, "Retry"}, {SAHPI_SU_RESET, "Reset"}, {SAHPI_SU_OVERRUN, "Overrun"}, {SAHPI_SU_UNDERRUN, "Underrun"}, {SAHPI_SU_COLLISION, "Collision"}, {SAHPI_SU_PACKETS, "Packets"}, {SAHPI_SU_MESSAGES, "Messages"}, {SAHPI_SU_CHARACTERS, "Characters"}, {SAHPI_SU_ERRORS, "Errors"}, {SAHPI_SU_CORRECTABLE_ERRORS, "Correctable Errors"}, {SAHPI_SU_UNCORRECTABLE_ERRORS, "Uncorrectable Errors"}, }; /** * oh_encode_sensorunits: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiSensorUnitsT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_sensorunits(), back * into an SaHpiSensorUnitsT type. * * Returns: * SaHpiSensorUnitsT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_sensorunits(SaHpiTextBufferT *buffer, SaHpiSensorUnitsT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, sensorunits_strings[i].str) == 0) { found++; break; } } if (found) { *type = sensorunits_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_sensormodunituse: * @value: enum value of type SaHpiSensorModUnitUseT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiSensorModUnitUseT. **/ char * oh_lookup_sensormodunituse(SaHpiSensorModUnitUseT value) { switch (value) { case SAHPI_SMUU_NONE: return "NONE"; case SAHPI_SMUU_BASIC_OVER_MODIFIER: return "BASIC_OVER_MODIFIER"; case SAHPI_SMUU_BASIC_TIMES_MODIFIER: return "BASIC_TIMES_MODIFIER"; default: return NULL; } } struct oh_sensormodunituse_map sensormodunituse_strings[] = { {SAHPI_SMUU_NONE, "NONE"}, {SAHPI_SMUU_BASIC_OVER_MODIFIER, "BASIC_OVER_MODIFIER"}, {SAHPI_SMUU_BASIC_TIMES_MODIFIER, "BASIC_TIMES_MODIFIER"}, }; /** * oh_encode_sensormodunituse: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiSensorModUnitUseT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_sensormodunituse(), back * into an SaHpiSensorModUnitUseT type. * * Returns: * SaHpiSensorModUnitUseT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_sensormodunituse(SaHpiTextBufferT *buffer, SaHpiSensorModUnitUseT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, sensormodunituse_strings[i].str) == 0) { found++; break; } } if (found) { *type = sensormodunituse_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_sensoreventctrl: * @value: enum value of type SaHpiSensorEventCtrlT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiSensorEventCtrlT. **/ char * oh_lookup_sensoreventctrl(SaHpiSensorEventCtrlT value) { switch (value) { case SAHPI_SEC_PER_EVENT: return "PER_EVENT"; case SAHPI_SEC_READ_ONLY_MASKS: return "READ_ONLY_MASKS"; case SAHPI_SEC_READ_ONLY: return "READ_ONLY"; default: return NULL; } } struct oh_sensoreventctrl_map sensoreventctrl_strings[] = { {SAHPI_SEC_PER_EVENT, "PER_EVENT"}, {SAHPI_SEC_READ_ONLY_MASKS, "READ_ONLY_MASKS"}, {SAHPI_SEC_READ_ONLY, "READ_ONLY"}, }; /** * oh_encode_sensoreventctrl: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiSensorEventCtrlT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_sensoreventctrl(), back * into an SaHpiSensorEventCtrlT type. * * Returns: * SaHpiSensorEventCtrlT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_sensoreventctrl(SaHpiTextBufferT *buffer, SaHpiSensorEventCtrlT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, sensoreventctrl_strings[i].str) == 0) { found++; break; } } if (found) { *type = sensoreventctrl_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_ctrltype: * @value: enum value of type SaHpiCtrlTypeT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiCtrlTypeT. **/ char * oh_lookup_ctrltype(SaHpiCtrlTypeT value) { switch (value) { case SAHPI_CTRL_TYPE_DIGITAL: return "DIGITAL"; case SAHPI_CTRL_TYPE_DISCRETE: return "DISCRETE"; case SAHPI_CTRL_TYPE_ANALOG: return "ANALOG"; case SAHPI_CTRL_TYPE_STREAM: return "STREAM"; case SAHPI_CTRL_TYPE_TEXT: return "TEXT"; case SAHPI_CTRL_TYPE_OEM: return "OEM"; default: return NULL; } } struct oh_ctrltype_map ctrltype_strings[] = { {SAHPI_CTRL_TYPE_DIGITAL, "DIGITAL"}, {SAHPI_CTRL_TYPE_DISCRETE, "DISCRETE"}, {SAHPI_CTRL_TYPE_ANALOG, "ANALOG"}, {SAHPI_CTRL_TYPE_STREAM, "STREAM"}, {SAHPI_CTRL_TYPE_TEXT, "TEXT"}, {SAHPI_CTRL_TYPE_OEM, "OEM"}, }; /** * oh_encode_ctrltype: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiCtrlTypeT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_ctrltype(), back * into an SaHpiCtrlTypeT type. * * Returns: * SaHpiCtrlTypeT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_ctrltype(SaHpiTextBufferT *buffer, SaHpiCtrlTypeT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, ctrltype_strings[i].str) == 0) { found++; break; } } if (found) { *type = ctrltype_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_ctrlstatedigital: * @value: enum value of type SaHpiCtrlStateDigitalT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiCtrlStateDigitalT. **/ char * oh_lookup_ctrlstatedigital(SaHpiCtrlStateDigitalT value) { switch (value) { case SAHPI_CTRL_STATE_OFF: return "OFF"; case SAHPI_CTRL_STATE_ON: return "ON"; case SAHPI_CTRL_STATE_PULSE_OFF: return "PULSE_OFF"; case SAHPI_CTRL_STATE_PULSE_ON: return "PULSE_ON"; default: return NULL; } } struct oh_ctrlstatedigital_map ctrlstatedigital_strings[] = { {SAHPI_CTRL_STATE_OFF, "OFF"}, {SAHPI_CTRL_STATE_ON, "ON"}, {SAHPI_CTRL_STATE_PULSE_OFF, "PULSE_OFF"}, {SAHPI_CTRL_STATE_PULSE_ON, "PULSE_ON"}, }; /** * oh_encode_ctrlstatedigital: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiCtrlStateDigitalT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_ctrlstatedigital(), back * into an SaHpiCtrlStateDigitalT type. * * Returns: * SaHpiCtrlStateDigitalT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_ctrlstatedigital(SaHpiTextBufferT *buffer, SaHpiCtrlStateDigitalT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, ctrlstatedigital_strings[i].str) == 0) { found++; break; } } if (found) { *type = ctrlstatedigital_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_ctrlmode: * @value: enum value of type SaHpiCtrlModeT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiCtrlModeT. **/ char * oh_lookup_ctrlmode(SaHpiCtrlModeT value) { switch (value) { case SAHPI_CTRL_MODE_AUTO: return "AUTO"; case SAHPI_CTRL_MODE_MANUAL: return "MANUAL"; default: return NULL; } } struct oh_ctrlmode_map ctrlmode_strings[] = { {SAHPI_CTRL_MODE_AUTO, "AUTO"}, {SAHPI_CTRL_MODE_MANUAL, "MANUAL"}, }; /** * oh_encode_ctrlmode: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiCtrlModeT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_ctrlmode(), back * into an SaHpiCtrlModeT type. * * Returns: * SaHpiCtrlModeT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_ctrlmode(SaHpiTextBufferT *buffer, SaHpiCtrlModeT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, ctrlmode_strings[i].str) == 0) { found++; break; } } if (found) { *type = ctrlmode_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_ctrloutputtype: * @value: enum value of type SaHpiCtrlOutputTypeT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiCtrlOutputTypeT. **/ char * oh_lookup_ctrloutputtype(SaHpiCtrlOutputTypeT value) { switch (value) { case SAHPI_CTRL_GENERIC: return "GENERIC"; case SAHPI_CTRL_LED: return "LED"; case SAHPI_CTRL_FAN_SPEED: return "FAN_SPEED"; case SAHPI_CTRL_DRY_CONTACT_CLOSURE: return "DRY_CONTACT_CLOSURE"; case SAHPI_CTRL_POWER_SUPPLY_INHIBIT: return "POWER_SUPPLY_INHIBIT"; case SAHPI_CTRL_AUDIBLE: return "AUDIBLE"; case SAHPI_CTRL_FRONT_PANEL_LOCKOUT: return "FRONT_PANEL_LOCKOUT"; case SAHPI_CTRL_POWER_INTERLOCK: return "POWER_INTERLOCK"; case SAHPI_CTRL_POWER_STATE: return "POWER_STATE"; case SAHPI_CTRL_LCD_DISPLAY: return "LCD_DISPLAY"; case SAHPI_CTRL_OEM: return "OEM"; case SAHPI_CTRL_GENERIC_ADDRESS: return "GENERIC_ADDRESS"; case SAHPI_CTRL_IP_ADDRESS: return "IP_ADDRESS"; case SAHPI_CTRL_RESOURCE_ID: return "RESOURCE_ID"; case SAHPI_CTRL_POWER_BUDGET: return "POWER_BUDGET"; case SAHPI_CTRL_ACTIVATE: return "ACTIVATE"; case SAHPI_CTRL_RESET: return "RESET"; default: return NULL; } } struct oh_ctrloutputtype_map ctrloutputtype_strings[] = { {SAHPI_CTRL_GENERIC, "GENERIC"}, {SAHPI_CTRL_LED, "LED"}, {SAHPI_CTRL_FAN_SPEED, "FAN_SPEED"}, {SAHPI_CTRL_DRY_CONTACT_CLOSURE, "DRY_CONTACT_CLOSURE"}, {SAHPI_CTRL_POWER_SUPPLY_INHIBIT, "POWER_SUPPLY_INHIBIT"}, {SAHPI_CTRL_AUDIBLE, "AUDIBLE"}, {SAHPI_CTRL_FRONT_PANEL_LOCKOUT, "FRONT_PANEL_LOCKOUT"}, {SAHPI_CTRL_POWER_INTERLOCK, "POWER_INTERLOCK"}, {SAHPI_CTRL_POWER_STATE, "POWER_STATE"}, {SAHPI_CTRL_LCD_DISPLAY, "LCD_DISPLAY"}, {SAHPI_CTRL_OEM, "OEM"}, {SAHPI_CTRL_GENERIC_ADDRESS, "GENERIC_ADDRESS"}, {SAHPI_CTRL_IP_ADDRESS, "IP_ADDRESS"}, {SAHPI_CTRL_RESOURCE_ID, "RESOURCE_ID"}, {SAHPI_CTRL_POWER_BUDGET, "POWER_BUDGET"}, {SAHPI_CTRL_ACTIVATE, "ACTIVATE"}, {SAHPI_CTRL_RESET, "RESET"}, }; /** * oh_encode_ctrloutputtype: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiCtrlOutputTypeT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_ctrloutputtype(), back * into an SaHpiCtrlOutputTypeT type. * * Returns: * SaHpiCtrlOutputTypeT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_ctrloutputtype(SaHpiTextBufferT *buffer, SaHpiCtrlOutputTypeT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, ctrloutputtype_strings[i].str) == 0) { found++; break; } } if (found) { *type = ctrloutputtype_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_idrareatype: * @value: enum value of type SaHpiIdrAreaTypeT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiIdrAreaTypeT. **/ char * oh_lookup_idrareatype(SaHpiIdrAreaTypeT value) { switch (value) { case SAHPI_IDR_AREATYPE_INTERNAL_USE: return "INTERNAL_USE"; case SAHPI_IDR_AREATYPE_CHASSIS_INFO: return "CHASSIS_INFO"; case SAHPI_IDR_AREATYPE_BOARD_INFO: return "BOARD_INFO"; case SAHPI_IDR_AREATYPE_PRODUCT_INFO: return "PRODUCT_INFO"; case SAHPI_IDR_AREATYPE_OEM: return "OEM"; case SAHPI_IDR_AREATYPE_UNSPECIFIED: return "UNSPECIFIED"; default: return NULL; } } struct oh_idrareatype_map idrareatype_strings[] = { {SAHPI_IDR_AREATYPE_INTERNAL_USE, "INTERNAL_USE"}, {SAHPI_IDR_AREATYPE_CHASSIS_INFO, "CHASSIS_INFO"}, {SAHPI_IDR_AREATYPE_BOARD_INFO, "BOARD_INFO"}, {SAHPI_IDR_AREATYPE_PRODUCT_INFO, "PRODUCT_INFO"}, {SAHPI_IDR_AREATYPE_OEM, "OEM"}, {SAHPI_IDR_AREATYPE_UNSPECIFIED, "UNSPECIFIED"}, }; /** * oh_encode_idrareatype: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiIdrAreaTypeT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_idrareatype(), back * into an SaHpiIdrAreaTypeT type. * * Returns: * SaHpiIdrAreaTypeT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_idrareatype(SaHpiTextBufferT *buffer, SaHpiIdrAreaTypeT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, idrareatype_strings[i].str) == 0) { found++; break; } } if (found) { *type = idrareatype_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_idrfieldtype: * @value: enum value of type SaHpiIdrFieldTypeT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiIdrFieldTypeT. **/ char * oh_lookup_idrfieldtype(SaHpiIdrFieldTypeT value) { switch (value) { case SAHPI_IDR_FIELDTYPE_CHASSIS_TYPE: return "CHASSIS_TYPE"; case SAHPI_IDR_FIELDTYPE_MFG_DATETIME: return "MFG_DATETIME"; case SAHPI_IDR_FIELDTYPE_MANUFACTURER: return "MANUFACTURER"; case SAHPI_IDR_FIELDTYPE_PRODUCT_NAME: return "PRODUCT_NAME"; case SAHPI_IDR_FIELDTYPE_PRODUCT_VERSION: return "PRODUCT_VERSION"; case SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER: return "SERIAL_NUMBER"; case SAHPI_IDR_FIELDTYPE_PART_NUMBER: return "PART_NUMBER"; case SAHPI_IDR_FIELDTYPE_FILE_ID: return "FILE_ID"; case SAHPI_IDR_FIELDTYPE_ASSET_TAG: return "ASSET_TAG"; case SAHPI_IDR_FIELDTYPE_CUSTOM: return "CUSTOM"; case SAHPI_IDR_FIELDTYPE_UNSPECIFIED: return "UNSPECIFIED"; default: return NULL; } } struct oh_idrfieldtype_map idrfieldtype_strings[] = { {SAHPI_IDR_FIELDTYPE_CHASSIS_TYPE, "CHASSIS_TYPE"}, {SAHPI_IDR_FIELDTYPE_MFG_DATETIME, "MFG_DATETIME"}, {SAHPI_IDR_FIELDTYPE_MANUFACTURER, "MANUFACTURER"}, {SAHPI_IDR_FIELDTYPE_PRODUCT_NAME, "PRODUCT_NAME"}, {SAHPI_IDR_FIELDTYPE_PRODUCT_VERSION, "PRODUCT_VERSION"}, {SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER, "SERIAL_NUMBER"}, {SAHPI_IDR_FIELDTYPE_PART_NUMBER, "PART_NUMBER"}, {SAHPI_IDR_FIELDTYPE_FILE_ID, "FILE_ID"}, {SAHPI_IDR_FIELDTYPE_ASSET_TAG, "ASSET_TAG"}, {SAHPI_IDR_FIELDTYPE_CUSTOM, "CUSTOM"}, {SAHPI_IDR_FIELDTYPE_UNSPECIFIED, "UNSPECIFIED"}, }; /** * oh_encode_idrfieldtype: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiIdrFieldTypeT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_idrfieldtype(), back * into an SaHpiIdrFieldTypeT type. * * Returns: * SaHpiIdrFieldTypeT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_idrfieldtype(SaHpiTextBufferT *buffer, SaHpiIdrFieldTypeT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, idrfieldtype_strings[i].str) == 0) { found++; break; } } if (found) { *type = idrfieldtype_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_watchdogaction: * @value: enum value of type SaHpiWatchdogActionT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiWatchdogActionT. **/ char * oh_lookup_watchdogaction(SaHpiWatchdogActionT value) { switch (value) { case SAHPI_WA_NO_ACTION: return "NO_ACTION"; case SAHPI_WA_RESET: return "RESET"; case SAHPI_WA_POWER_DOWN: return "POWER_DOWN"; case SAHPI_WA_POWER_CYCLE: return "POWER_CYCLE"; default: return NULL; } } struct oh_watchdogaction_map watchdogaction_strings[] = { {SAHPI_WA_NO_ACTION, "NO_ACTION"}, {SAHPI_WA_RESET, "RESET"}, {SAHPI_WA_POWER_DOWN, "POWER_DOWN"}, {SAHPI_WA_POWER_CYCLE, "POWER_CYCLE"}, }; /** * oh_encode_watchdogaction: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiWatchdogActionT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_watchdogaction(), back * into an SaHpiWatchdogActionT type. * * Returns: * SaHpiWatchdogActionT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_watchdogaction(SaHpiTextBufferT *buffer, SaHpiWatchdogActionT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, watchdogaction_strings[i].str) == 0) { found++; break; } } if (found) { *type = watchdogaction_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_watchdogactionevent: * @value: enum value of type SaHpiWatchdogActionEventT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiWatchdogActionEventT. **/ char * oh_lookup_watchdogactionevent(SaHpiWatchdogActionEventT value) { switch (value) { case SAHPI_WAE_NO_ACTION: return "NO_ACTION"; case SAHPI_WAE_RESET: return "RESET"; case SAHPI_WAE_POWER_DOWN: return "POWER_DOWN"; case SAHPI_WAE_POWER_CYCLE: return "POWER_CYCLE"; case SAHPI_WAE_TIMER_INT: return "TIMER_INT"; default: return NULL; } } struct oh_watchdogactionevent_map watchdogactionevent_strings[] = { {SAHPI_WAE_NO_ACTION, "NO_ACTION"}, {SAHPI_WAE_RESET, "RESET"}, {SAHPI_WAE_POWER_DOWN, "POWER_DOWN"}, {SAHPI_WAE_POWER_CYCLE, "POWER_CYCLE"}, {SAHPI_WAE_TIMER_INT, "TIMER_INT"}, }; /** * oh_encode_watchdogactionevent: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiWatchdogActionEventT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_watchdogactionevent(), back * into an SaHpiWatchdogActionEventT type. * * Returns: * SaHpiWatchdogActionEventT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_watchdogactionevent(SaHpiTextBufferT *buffer, SaHpiWatchdogActionEventT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, watchdogactionevent_strings[i].str) == 0) { found++; break; } } if (found) { *type = watchdogactionevent_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_watchdogpretimerinterrupt: * @value: enum value of type SaHpiWatchdogPretimerInterruptT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiWatchdogPretimerInterruptT. **/ char * oh_lookup_watchdogpretimerinterrupt(SaHpiWatchdogPretimerInterruptT value) { switch (value) { case SAHPI_WPI_NONE: return "NONE"; case SAHPI_WPI_SMI: return "SMI"; case SAHPI_WPI_NMI: return "NMI"; case SAHPI_WPI_MESSAGE_INTERRUPT: return "MESSAGE_INTERRUPT"; case SAHPI_WPI_OEM: return "OEM"; default: return NULL; } } struct oh_watchdogpretimerinterrupt_map watchdogpretimerinterrupt_strings[] = { {SAHPI_WPI_NONE, "NONE"}, {SAHPI_WPI_SMI, "SMI"}, {SAHPI_WPI_NMI, "NMI"}, {SAHPI_WPI_MESSAGE_INTERRUPT, "MESSAGE_INTERRUPT"}, {SAHPI_WPI_OEM, "OEM"}, }; /** * oh_encode_watchdogpretimerinterrupt: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiWatchdogPretimerInterruptT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_watchdogpretimerinterrupt(), back * into an SaHpiWatchdogPretimerInterruptT type. * * Returns: * SaHpiWatchdogPretimerInterruptT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_watchdogpretimerinterrupt(SaHpiTextBufferT *buffer, SaHpiWatchdogPretimerInterruptT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, watchdogpretimerinterrupt_strings[i].str) == 0) { found++; break; } } if (found) { *type = watchdogpretimerinterrupt_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_watchdogtimeruse: * @value: enum value of type SaHpiWatchdogTimerUseT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiWatchdogTimerUseT. **/ char * oh_lookup_watchdogtimeruse(SaHpiWatchdogTimerUseT value) { switch (value) { case SAHPI_WTU_NONE: return "NONE"; case SAHPI_WTU_BIOS_FRB2: return "BIOS_FRB2"; case SAHPI_WTU_BIOS_POST: return "BIOS_POST"; case SAHPI_WTU_OS_LOAD: return "OS_LOAD"; case SAHPI_WTU_SMS_OS: return "SMS_OS"; case SAHPI_WTU_OEM: return "OEM"; case SAHPI_WTU_UNSPECIFIED: return "UNSPECIFIED"; default: return NULL; } } struct oh_watchdogtimeruse_map watchdogtimeruse_strings[] = { {SAHPI_WTU_NONE, "NONE"}, {SAHPI_WTU_BIOS_FRB2, "BIOS_FRB2"}, {SAHPI_WTU_BIOS_POST, "BIOS_POST"}, {SAHPI_WTU_OS_LOAD, "OS_LOAD"}, {SAHPI_WTU_SMS_OS, "SMS_OS"}, {SAHPI_WTU_OEM, "OEM"}, {SAHPI_WTU_UNSPECIFIED, "UNSPECIFIED"}, }; /** * oh_encode_watchdogtimeruse: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiWatchdogTimerUseT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_watchdogtimeruse(), back * into an SaHpiWatchdogTimerUseT type. * * Returns: * SaHpiWatchdogTimerUseT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_watchdogtimeruse(SaHpiTextBufferT *buffer, SaHpiWatchdogTimerUseT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, watchdogtimeruse_strings[i].str) == 0) { found++; break; } } if (found) { *type = watchdogtimeruse_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_dimitestserviceimpact: * @value: enum value of type SaHpiDimiTestServiceImpactT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiDimiTestServiceImpactT. **/ char * oh_lookup_dimitestserviceimpact(SaHpiDimiTestServiceImpactT value) { switch (value) { case SAHPI_DIMITEST_NONDEGRADING: return "NONDEGRADING"; case SAHPI_DIMITEST_DEGRADING: return "DEGRADING"; case SAHPI_DIMITEST_VENDOR_DEFINED_LEVEL: return "VENDOR_DEFINED_LEVEL"; default: return NULL; } } struct oh_dimitestserviceimpact_map dimitestserviceimpact_strings[] = { {SAHPI_DIMITEST_NONDEGRADING, "NONDEGRADING"}, {SAHPI_DIMITEST_DEGRADING, "DEGRADING"}, {SAHPI_DIMITEST_VENDOR_DEFINED_LEVEL, "VENDOR_DEFINED_LEVEL"}, }; /** * oh_encode_dimitestserviceimpact: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiDimiTestServiceImpactT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_dimitestserviceimpact(), back * into an SaHpiDimiTestServiceImpactT type. * * Returns: * SaHpiDimiTestServiceImpactT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_dimitestserviceimpact(SaHpiTextBufferT *buffer, SaHpiDimiTestServiceImpactT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, dimitestserviceimpact_strings[i].str) == 0) { found++; break; } } if (found) { *type = dimitestserviceimpact_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_dimitestrunstatus: * @value: enum value of type SaHpiDimiTestRunStatusT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiDimiTestRunStatusT. **/ char * oh_lookup_dimitestrunstatus(SaHpiDimiTestRunStatusT value) { switch (value) { case SAHPI_DIMITEST_STATUS_NOT_RUN: return "STATUS_NOT_RUN"; case SAHPI_DIMITEST_STATUS_FINISHED_NO_ERRORS: return "STATUS_FINISHED_NO_ERRORS"; case SAHPI_DIMITEST_STATUS_FINISHED_ERRORS: return "STATUS_FINISHED_ERRORS"; case SAHPI_DIMITEST_STATUS_CANCELED: return "STATUS_CANCELED"; case SAHPI_DIMITEST_STATUS_RUNNING: return "STATUS_RUNNING"; default: return NULL; } } struct oh_dimitestrunstatus_map dimitestrunstatus_strings[] = { {SAHPI_DIMITEST_STATUS_NOT_RUN, "STATUS_NOT_RUN"}, {SAHPI_DIMITEST_STATUS_FINISHED_NO_ERRORS, "STATUS_FINISHED_NO_ERRORS"}, {SAHPI_DIMITEST_STATUS_FINISHED_ERRORS, "STATUS_FINISHED_ERRORS"}, {SAHPI_DIMITEST_STATUS_CANCELED, "STATUS_CANCELED"}, {SAHPI_DIMITEST_STATUS_RUNNING, "STATUS_RUNNING"}, }; /** * oh_encode_dimitestrunstatus: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiDimiTestRunStatusT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_dimitestrunstatus(), back * into an SaHpiDimiTestRunStatusT type. * * Returns: * SaHpiDimiTestRunStatusT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_dimitestrunstatus(SaHpiTextBufferT *buffer, SaHpiDimiTestRunStatusT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, dimitestrunstatus_strings[i].str) == 0) { found++; break; } } if (found) { *type = dimitestrunstatus_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_dimitesterrcode: * @value: enum value of type SaHpiDimiTestErrCodeT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiDimiTestErrCodeT. **/ char * oh_lookup_dimitesterrcode(SaHpiDimiTestErrCodeT value) { switch (value) { case SAHPI_DIMITEST_STATUSERR_NOERR: return "STATUSERR_NOERR"; case SAHPI_DIMITEST_STATUSERR_RUNERR: return "STATUSERR_RUNERR"; case SAHPI_DIMITEST_STATUSERR_UNDEF: return "STATUSERR_UNDEF"; default: return NULL; } } struct oh_dimitesterrcode_map dimitesterrcode_strings[] = { {SAHPI_DIMITEST_STATUSERR_NOERR, "STATUSERR_NOERR"}, {SAHPI_DIMITEST_STATUSERR_RUNERR, "STATUSERR_RUNERR"}, {SAHPI_DIMITEST_STATUSERR_UNDEF, "STATUSERR_UNDEF"}, }; /** * oh_encode_dimitesterrcode: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiDimiTestErrCodeT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_dimitesterrcode(), back * into an SaHpiDimiTestErrCodeT type. * * Returns: * SaHpiDimiTestErrCodeT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_dimitesterrcode(SaHpiTextBufferT *buffer, SaHpiDimiTestErrCodeT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, dimitesterrcode_strings[i].str) == 0) { found++; break; } } if (found) { *type = dimitesterrcode_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_dimitestparamtype: * @value: enum value of type SaHpiDimiTestParamTypeT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiDimiTestParamTypeT. **/ char * oh_lookup_dimitestparamtype(SaHpiDimiTestParamTypeT value) { switch (value) { case SAHPI_DIMITEST_PARAM_TYPE_BOOLEAN: return "PARAM_TYPE_BOOLEAN"; case SAHPI_DIMITEST_PARAM_TYPE_INT32: return "PARAM_TYPE_INT32"; case SAHPI_DIMITEST_PARAM_TYPE_FLOAT64: return "PARAM_TYPE_FLOAT64"; case SAHPI_DIMITEST_PARAM_TYPE_TEXT: return "PARAM_TYPE_TEXT"; default: return NULL; } } struct oh_dimitestparamtype_map dimitestparamtype_strings[] = { {SAHPI_DIMITEST_PARAM_TYPE_BOOLEAN, "PARAM_TYPE_BOOLEAN"}, {SAHPI_DIMITEST_PARAM_TYPE_INT32, "PARAM_TYPE_INT32"}, {SAHPI_DIMITEST_PARAM_TYPE_FLOAT64, "PARAM_TYPE_FLOAT64"}, {SAHPI_DIMITEST_PARAM_TYPE_TEXT, "PARAM_TYPE_TEXT"}, }; /** * oh_encode_dimitestparamtype: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiDimiTestParamTypeT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_dimitestparamtype(), back * into an SaHpiDimiTestParamTypeT type. * * Returns: * SaHpiDimiTestParamTypeT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_dimitestparamtype(SaHpiTextBufferT *buffer, SaHpiDimiTestParamTypeT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, dimitestparamtype_strings[i].str) == 0) { found++; break; } } if (found) { *type = dimitestparamtype_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_dimiready: * @value: enum value of type SaHpiDimiReadyT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiDimiReadyT. **/ char * oh_lookup_dimiready(SaHpiDimiReadyT value) { switch (value) { case SAHPI_DIMI_READY: return "READY"; case SAHPI_DIMI_WRONG_STATE: return "WRONG_STATE"; case SAHPI_DIMI_BUSY: return "BUSY"; default: return NULL; } } struct oh_dimiready_map dimiready_strings[] = { {SAHPI_DIMI_READY, "READY"}, {SAHPI_DIMI_WRONG_STATE, "WRONG_STATE"}, {SAHPI_DIMI_BUSY, "BUSY"}, }; /** * oh_encode_dimiready: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiDimiReadyT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_dimiready(), back * into an SaHpiDimiReadyT type. * * Returns: * SaHpiDimiReadyT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_dimiready(SaHpiTextBufferT *buffer, SaHpiDimiReadyT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, dimiready_strings[i].str) == 0) { found++; break; } } if (found) { *type = dimiready_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_fumispecinfotype: * @value: enum value of type SaHpiFumiSpecInfoTypeT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiFumiSpecInfoTypeT. **/ char * oh_lookup_fumispecinfotype(SaHpiFumiSpecInfoTypeT value) { switch (value) { case SAHPI_FUMI_SPEC_INFO_NONE: return "SPEC_INFO_NONE"; case SAHPI_FUMI_SPEC_INFO_SAF_DEFINED: return "SPEC_INFO_SAF_DEFINED"; case SAHPI_FUMI_SPEC_INFO_OEM_DEFINED: return "SPEC_INFO_OEM_DEFINED"; default: return NULL; } } struct oh_fumispecinfotype_map fumispecinfotype_strings[] = { {SAHPI_FUMI_SPEC_INFO_NONE, "SPEC_INFO_NONE"}, {SAHPI_FUMI_SPEC_INFO_SAF_DEFINED, "SPEC_INFO_SAF_DEFINED"}, {SAHPI_FUMI_SPEC_INFO_OEM_DEFINED, "SPEC_INFO_OEM_DEFINED"}, }; /** * oh_encode_fumispecinfotype: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiFumiSpecInfoTypeT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_fumispecinfotype(), back * into an SaHpiFumiSpecInfoTypeT type. * * Returns: * SaHpiFumiSpecInfoTypeT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_fumispecinfotype(SaHpiTextBufferT *buffer, SaHpiFumiSpecInfoTypeT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, fumispecinfotype_strings[i].str) == 0) { found++; break; } } if (found) { *type = fumispecinfotype_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_fumisafdefinedspecid: * @value: enum value of type SaHpiFumiSafDefinedSpecIdT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiFumiSafDefinedSpecIdT. **/ char * oh_lookup_fumisafdefinedspecid(SaHpiFumiSafDefinedSpecIdT value) { switch (value) { case SAHPI_FUMI_SPEC_HPM1: return "SPEC_HPM1"; default: return NULL; } } struct oh_fumisafdefinedspecid_map fumisafdefinedspecid_strings[] = { {SAHPI_FUMI_SPEC_HPM1, "SPEC_HPM1"}, }; /** * oh_encode_fumisafdefinedspecid: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiFumiSafDefinedSpecIdT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_fumisafdefinedspecid(), back * into an SaHpiFumiSafDefinedSpecIdT type. * * Returns: * SaHpiFumiSafDefinedSpecIdT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_fumisafdefinedspecid(SaHpiTextBufferT *buffer, SaHpiFumiSafDefinedSpecIdT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, fumisafdefinedspecid_strings[i].str) == 0) { found++; break; } } if (found) { *type = fumisafdefinedspecid_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_fumiserviceimpact: * @value: enum value of type SaHpiFumiServiceImpactT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiFumiServiceImpactT. **/ char * oh_lookup_fumiserviceimpact(SaHpiFumiServiceImpactT value) { switch (value) { case SAHPI_FUMI_PROCESS_NONDEGRADING: return "PROCESS_NONDEGRADING"; case SAHPI_FUMI_PROCESS_DEGRADING: return "PROCESS_DEGRADING"; case SAHPI_FUMI_PROCESS_VENDOR_DEFINED_IMPACT_LEVEL: return "PROCESS_VENDOR_DEFINED_IMPACT_LEVEL"; default: return NULL; } } struct oh_fumiserviceimpact_map fumiserviceimpact_strings[] = { {SAHPI_FUMI_PROCESS_NONDEGRADING, "PROCESS_NONDEGRADING"}, {SAHPI_FUMI_PROCESS_DEGRADING, "PROCESS_DEGRADING"}, {SAHPI_FUMI_PROCESS_VENDOR_DEFINED_IMPACT_LEVEL, "PROCESS_VENDOR_DEFINED_IMPACT_LEVEL"}, }; /** * oh_encode_fumiserviceimpact: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiFumiServiceImpactT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_fumiserviceimpact(), back * into an SaHpiFumiServiceImpactT type. * * Returns: * SaHpiFumiServiceImpactT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_fumiserviceimpact(SaHpiTextBufferT *buffer, SaHpiFumiServiceImpactT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, fumiserviceimpact_strings[i].str) == 0) { found++; break; } } if (found) { *type = fumiserviceimpact_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_fumisourcestatus: * @value: enum value of type SaHpiFumiSourceStatusT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiFumiSourceStatusT. **/ char * oh_lookup_fumisourcestatus(SaHpiFumiSourceStatusT value) { switch (value) { case SAHPI_FUMI_SRC_VALID: return "SRC_VALID"; case SAHPI_FUMI_SRC_PROTOCOL_NOT_SUPPORTED: return "SRC_PROTOCOL_NOT_SUPPORTED"; case SAHPI_FUMI_SRC_UNREACHABLE: return "SRC_UNREACHABLE"; case SAHPI_FUMI_SRC_VALIDATION_NOT_STARTED: return "SRC_VALIDATION_NOT_STARTED"; case SAHPI_FUMI_SRC_VALIDATION_INITIATED: return "SRC_VALIDATION_INITIATED"; case SAHPI_FUMI_SRC_VALIDATION_FAIL: return "SRC_VALIDATION_FAIL"; case SAHPI_FUMI_SRC_TYPE_MISMATCH: return "SRC_TYPE_MISMATCH"; case SAHPI_FUMI_SRC_INVALID: return "SRC_INVALID"; case SAHPI_FUMI_SRC_VALIDITY_UNKNOWN: return "SRC_VALIDITY_UNKNOWN"; default: return NULL; } } struct oh_fumisourcestatus_map fumisourcestatus_strings[] = { {SAHPI_FUMI_SRC_VALID, "SRC_VALID"}, {SAHPI_FUMI_SRC_PROTOCOL_NOT_SUPPORTED, "SRC_PROTOCOL_NOT_SUPPORTED"}, {SAHPI_FUMI_SRC_UNREACHABLE, "SRC_UNREACHABLE"}, {SAHPI_FUMI_SRC_VALIDATION_NOT_STARTED, "SRC_VALIDATION_NOT_STARTED"}, {SAHPI_FUMI_SRC_VALIDATION_INITIATED, "SRC_VALIDATION_INITIATED"}, {SAHPI_FUMI_SRC_VALIDATION_FAIL, "SRC_VALIDATION_FAIL"}, {SAHPI_FUMI_SRC_TYPE_MISMATCH, "SRC_TYPE_MISMATCH"}, {SAHPI_FUMI_SRC_INVALID, "SRC_INVALID"}, {SAHPI_FUMI_SRC_VALIDITY_UNKNOWN, "SRC_VALIDITY_UNKNOWN"}, }; /** * oh_encode_fumisourcestatus: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiFumiSourceStatusT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_fumisourcestatus(), back * into an SaHpiFumiSourceStatusT type. * * Returns: * SaHpiFumiSourceStatusT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_fumisourcestatus(SaHpiTextBufferT *buffer, SaHpiFumiSourceStatusT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, fumisourcestatus_strings[i].str) == 0) { found++; break; } } if (found) { *type = fumisourcestatus_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_fumibankstate: * @value: enum value of type SaHpiFumiBankStateT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiFumiBankStateT. **/ char * oh_lookup_fumibankstate(SaHpiFumiBankStateT value) { switch (value) { case SAHPI_FUMI_BANK_VALID: return "BANK_VALID"; case SAHPI_FUMI_BANK_UPGRADE_IN_PROGRESS: return "BANK_UPGRADE_IN_PROGRESS"; case SAHPI_FUMI_BANK_CORRUPTED: return "BANK_CORRUPTED"; case SAHPI_FUMI_BANK_ACTIVE: return "BANK_ACTIVE"; case SAHPI_FUMI_BANK_BUSY: return "BANK_BUSY"; case SAHPI_FUMI_BANK_UNKNOWN: return "BANK_UNKNOWN"; default: return NULL; } } struct oh_fumibankstate_map fumibankstate_strings[] = { {SAHPI_FUMI_BANK_VALID, "BANK_VALID"}, {SAHPI_FUMI_BANK_UPGRADE_IN_PROGRESS, "BANK_UPGRADE_IN_PROGRESS"}, {SAHPI_FUMI_BANK_CORRUPTED, "BANK_CORRUPTED"}, {SAHPI_FUMI_BANK_ACTIVE, "BANK_ACTIVE"}, {SAHPI_FUMI_BANK_BUSY, "BANK_BUSY"}, {SAHPI_FUMI_BANK_UNKNOWN, "BANK_UNKNOWN"}, }; /** * oh_encode_fumibankstate: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiFumiBankStateT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_fumibankstate(), back * into an SaHpiFumiBankStateT type. * * Returns: * SaHpiFumiBankStateT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_fumibankstate(SaHpiTextBufferT *buffer, SaHpiFumiBankStateT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, fumibankstate_strings[i].str) == 0) { found++; break; } } if (found) { *type = fumibankstate_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_fumiupgradestatus: * @value: enum value of type SaHpiFumiUpgradeStatusT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiFumiUpgradeStatusT. **/ char * oh_lookup_fumiupgradestatus(SaHpiFumiUpgradeStatusT value) { switch (value) { case SAHPI_FUMI_OPERATION_NOTSTARTED: return "OPERATION_NOTSTARTED"; case SAHPI_FUMI_SOURCE_VALIDATION_INITIATED: return "SOURCE_VALIDATION_INITIATED"; case SAHPI_FUMI_SOURCE_VALIDATION_FAILED: return "SOURCE_VALIDATION_FAILED"; case SAHPI_FUMI_SOURCE_VALIDATION_DONE: return "SOURCE_VALIDATION_DONE"; case SAHPI_FUMI_SOURCE_VALIDATION_CANCELLED: return "SOURCE_VALIDATION_CANCELLED"; case SAHPI_FUMI_INSTALL_INITIATED: return "INSTALL_INITIATED"; case SAHPI_FUMI_INSTALL_FAILED_ROLLBACK_NEEDED: return "INSTALL_FAILED_ROLLBACK_NEEDED"; case SAHPI_FUMI_INSTALL_FAILED_ROLLBACK_INITIATED: return "INSTALL_FAILED_ROLLBACK_INITIATED"; case SAHPI_FUMI_INSTALL_FAILED_ROLLBACK_NOT_POSSIBLE: return "INSTALL_FAILED_ROLLBACK_NOT_POSSIBLE"; case SAHPI_FUMI_INSTALL_DONE: return "INSTALL_DONE"; case SAHPI_FUMI_INSTALL_CANCELLED: return "INSTALL_CANCELLED"; case SAHPI_FUMI_ROLLBACK_INITIATED: return "ROLLBACK_INITIATED"; case SAHPI_FUMI_ROLLBACK_FAILED: return "ROLLBACK_FAILED"; case SAHPI_FUMI_ROLLBACK_DONE: return "ROLLBACK_DONE"; case SAHPI_FUMI_ROLLBACK_CANCELLED: return "ROLLBACK_CANCELLED"; case SAHPI_FUMI_BACKUP_INITIATED: return "BACKUP_INITIATED"; case SAHPI_FUMI_BACKUP_FAILED: return "BACKUP_FAILED"; case SAHPI_FUMI_BACKUP_DONE: return "BACKUP_DONE"; case SAHPI_FUMI_BACKUP_CANCELLED: return "BACKUP_CANCELLED"; case SAHPI_FUMI_BANK_COPY_INITIATED: return "BANK_COPY_INITIATED"; case SAHPI_FUMI_BANK_COPY_FAILED: return "BANK_COPY_FAILED"; case SAHPI_FUMI_BANK_COPY_DONE: return "BANK_COPY_DONE"; case SAHPI_FUMI_BANK_COPY_CANCELLED: return "BANK_COPY_CANCELLED"; case SAHPI_FUMI_TARGET_VERIFY_INITIATED: return "TARGET_VERIFY_INITIATED"; case SAHPI_FUMI_TARGET_VERIFY_FAILED: return "TARGET_VERIFY_FAILED"; case SAHPI_FUMI_TARGET_VERIFY_DONE: return "TARGET_VERIFY_DONE"; case SAHPI_FUMI_TARGET_VERIFY_CANCELLED: return "TARGET_VERIFY_CANCELLED"; case SAHPI_FUMI_ACTIVATE_INITIATED: return "ACTIVATE_INITIATED"; case SAHPI_FUMI_ACTIVATE_FAILED_ROLLBACK_NEEDED: return "ACTIVATE_FAILED_ROLLBACK_NEEDED"; case SAHPI_FUMI_ACTIVATE_FAILED_ROLLBACK_INITIATED: return "ACTIVATE_FAILED_ROLLBACK_INITIATED"; case SAHPI_FUMI_ACTIVATE_FAILED_ROLLBACK_NOT_POSSIBLE: return "ACTIVATE_FAILED_ROLLBACK_NOT_POSSIBLE"; case SAHPI_FUMI_ACTIVATE_DONE: return "ACTIVATE_DONE"; case SAHPI_FUMI_ACTIVATE_CANCELLED: return "ACTIVATE_CANCELLED"; default: return NULL; } } struct oh_fumiupgradestatus_map fumiupgradestatus_strings[] = { {SAHPI_FUMI_OPERATION_NOTSTARTED, "OPERATION_NOTSTARTED"}, {SAHPI_FUMI_SOURCE_VALIDATION_INITIATED, "SOURCE_VALIDATION_INITIATED"}, {SAHPI_FUMI_SOURCE_VALIDATION_FAILED, "SOURCE_VALIDATION_FAILED"}, {SAHPI_FUMI_SOURCE_VALIDATION_DONE, "SOURCE_VALIDATION_DONE"}, {SAHPI_FUMI_SOURCE_VALIDATION_CANCELLED, "SOURCE_VALIDATION_CANCELLED"}, {SAHPI_FUMI_INSTALL_INITIATED, "INSTALL_INITIATED"}, {SAHPI_FUMI_INSTALL_FAILED_ROLLBACK_NEEDED, "INSTALL_FAILED_ROLLBACK_NEEDED"}, {SAHPI_FUMI_INSTALL_FAILED_ROLLBACK_INITIATED, "INSTALL_FAILED_ROLLBACK_INITIATED"}, {SAHPI_FUMI_INSTALL_FAILED_ROLLBACK_NOT_POSSIBLE, "INSTALL_FAILED_ROLLBACK_NOT_POSSIBLE"}, {SAHPI_FUMI_INSTALL_DONE, "INSTALL_DONE"}, {SAHPI_FUMI_INSTALL_CANCELLED, "INSTALL_CANCELLED"}, {SAHPI_FUMI_ROLLBACK_INITIATED, "ROLLBACK_INITIATED"}, {SAHPI_FUMI_ROLLBACK_FAILED, "ROLLBACK_FAILED"}, {SAHPI_FUMI_ROLLBACK_DONE, "ROLLBACK_DONE"}, {SAHPI_FUMI_ROLLBACK_CANCELLED, "ROLLBACK_CANCELLED"}, {SAHPI_FUMI_BACKUP_INITIATED, "BACKUP_INITIATED"}, {SAHPI_FUMI_BACKUP_FAILED, "BACKUP_FAILED"}, {SAHPI_FUMI_BACKUP_DONE, "BACKUP_DONE"}, {SAHPI_FUMI_BACKUP_CANCELLED, "BACKUP_CANCELLED"}, {SAHPI_FUMI_BANK_COPY_INITIATED, "BANK_COPY_INITIATED"}, {SAHPI_FUMI_BANK_COPY_FAILED, "BANK_COPY_FAILED"}, {SAHPI_FUMI_BANK_COPY_DONE, "BANK_COPY_DONE"}, {SAHPI_FUMI_BANK_COPY_CANCELLED, "BANK_COPY_CANCELLED"}, {SAHPI_FUMI_TARGET_VERIFY_INITIATED, "TARGET_VERIFY_INITIATED"}, {SAHPI_FUMI_TARGET_VERIFY_FAILED, "TARGET_VERIFY_FAILED"}, {SAHPI_FUMI_TARGET_VERIFY_DONE, "TARGET_VERIFY_DONE"}, {SAHPI_FUMI_TARGET_VERIFY_CANCELLED, "TARGET_VERIFY_CANCELLED"}, {SAHPI_FUMI_ACTIVATE_INITIATED, "ACTIVATE_INITIATED"}, {SAHPI_FUMI_ACTIVATE_FAILED_ROLLBACK_NEEDED, "ACTIVATE_FAILED_ROLLBACK_NEEDED"}, {SAHPI_FUMI_ACTIVATE_FAILED_ROLLBACK_INITIATED, "ACTIVATE_FAILED_ROLLBACK_INITIATED"}, {SAHPI_FUMI_ACTIVATE_FAILED_ROLLBACK_NOT_POSSIBLE, "ACTIVATE_FAILED_ROLLBACK_NOT_POSSIBLE"}, {SAHPI_FUMI_ACTIVATE_DONE, "ACTIVATE_DONE"}, {SAHPI_FUMI_ACTIVATE_CANCELLED, "ACTIVATE_CANCELLED"}, }; /** * oh_encode_fumiupgradestatus: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiFumiUpgradeStatusT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_fumiupgradestatus(), back * into an SaHpiFumiUpgradeStatusT type. * * Returns: * SaHpiFumiUpgradeStatusT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_fumiupgradestatus(SaHpiTextBufferT *buffer, SaHpiFumiUpgradeStatusT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, fumiupgradestatus_strings[i].str) == 0) { found++; break; } } if (found) { *type = fumiupgradestatus_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_hsindicatorstate: * @value: enum value of type SaHpiHsIndicatorStateT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiHsIndicatorStateT. **/ char * oh_lookup_hsindicatorstate(SaHpiHsIndicatorStateT value) { switch (value) { case SAHPI_HS_INDICATOR_OFF: return "OFF"; case SAHPI_HS_INDICATOR_ON: return "ON"; default: return NULL; } } struct oh_hsindicatorstate_map hsindicatorstate_strings[] = { {SAHPI_HS_INDICATOR_OFF, "OFF"}, {SAHPI_HS_INDICATOR_ON, "ON"}, }; /** * oh_encode_hsindicatorstate: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiHsIndicatorStateT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_hsindicatorstate(), back * into an SaHpiHsIndicatorStateT type. * * Returns: * SaHpiHsIndicatorStateT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_hsindicatorstate(SaHpiTextBufferT *buffer, SaHpiHsIndicatorStateT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, hsindicatorstate_strings[i].str) == 0) { found++; break; } } if (found) { *type = hsindicatorstate_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_hsaction: * @value: enum value of type SaHpiHsActionT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiHsActionT. **/ char * oh_lookup_hsaction(SaHpiHsActionT value) { switch (value) { case SAHPI_HS_ACTION_INSERTION: return "INSERTION"; case SAHPI_HS_ACTION_EXTRACTION: return "EXTRACTION"; default: return NULL; } } struct oh_hsaction_map hsaction_strings[] = { {SAHPI_HS_ACTION_INSERTION, "INSERTION"}, {SAHPI_HS_ACTION_EXTRACTION, "EXTRACTION"}, }; /** * oh_encode_hsaction: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiHsActionT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_hsaction(), back * into an SaHpiHsActionT type. * * Returns: * SaHpiHsActionT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_hsaction(SaHpiTextBufferT *buffer, SaHpiHsActionT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, hsaction_strings[i].str) == 0) { found++; break; } } if (found) { *type = hsaction_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_hsstate: * @value: enum value of type SaHpiHsStateT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiHsStateT. **/ char * oh_lookup_hsstate(SaHpiHsStateT value) { switch (value) { case SAHPI_HS_STATE_INACTIVE: return "INACTIVE"; case SAHPI_HS_STATE_INSERTION_PENDING: return "INSERTION_PENDING"; case SAHPI_HS_STATE_ACTIVE: return "ACTIVE"; case SAHPI_HS_STATE_EXTRACTION_PENDING: return "EXTRACTION_PENDING"; case SAHPI_HS_STATE_NOT_PRESENT: return "NOT_PRESENT"; default: return NULL; } } struct oh_hsstate_map hsstate_strings[] = { {SAHPI_HS_STATE_INACTIVE, "INACTIVE"}, {SAHPI_HS_STATE_INSERTION_PENDING, "INSERTION_PENDING"}, {SAHPI_HS_STATE_ACTIVE, "ACTIVE"}, {SAHPI_HS_STATE_EXTRACTION_PENDING, "EXTRACTION_PENDING"}, {SAHPI_HS_STATE_NOT_PRESENT, "NOT_PRESENT"}, }; /** * oh_encode_hsstate: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiHsStateT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_hsstate(), back * into an SaHpiHsStateT type. * * Returns: * SaHpiHsStateT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_hsstate(SaHpiTextBufferT *buffer, SaHpiHsStateT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, hsstate_strings[i].str) == 0) { found++; break; } } if (found) { *type = hsstate_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_hscauseofstatechange: * @value: enum value of type SaHpiHsCauseOfStateChangeT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiHsCauseOfStateChangeT. **/ char * oh_lookup_hscauseofstatechange(SaHpiHsCauseOfStateChangeT value) { switch (value) { case SAHPI_HS_CAUSE_AUTO_POLICY: return "CAUSE_AUTO_POLICY"; case SAHPI_HS_CAUSE_EXT_SOFTWARE: return "CAUSE_EXT_SOFTWARE"; case SAHPI_HS_CAUSE_OPERATOR_INIT: return "CAUSE_OPERATOR_INIT"; case SAHPI_HS_CAUSE_USER_UPDATE: return "CAUSE_USER_UPDATE"; case SAHPI_HS_CAUSE_UNEXPECTED_DEACTIVATION: return "CAUSE_UNEXPECTED_DEACTIVATION"; case SAHPI_HS_CAUSE_SURPRISE_EXTRACTION: return "CAUSE_SURPRISE_EXTRACTION"; case SAHPI_HS_CAUSE_EXTRACTION_UPDATE: return "CAUSE_EXTRACTION_UPDATE"; case SAHPI_HS_CAUSE_HARDWARE_FAULT: return "CAUSE_HARDWARE_FAULT"; case SAHPI_HS_CAUSE_CONTAINING_FRU: return "CAUSE_CONTAINING_FRU"; case SAHPI_HS_CAUSE_UNKNOWN: return "CAUSE_UNKNOWN"; default: return NULL; } } struct oh_hscauseofstatechange_map hscauseofstatechange_strings[] = { {SAHPI_HS_CAUSE_AUTO_POLICY, "CAUSE_AUTO_POLICY"}, {SAHPI_HS_CAUSE_EXT_SOFTWARE, "CAUSE_EXT_SOFTWARE"}, {SAHPI_HS_CAUSE_OPERATOR_INIT, "CAUSE_OPERATOR_INIT"}, {SAHPI_HS_CAUSE_USER_UPDATE, "CAUSE_USER_UPDATE"}, {SAHPI_HS_CAUSE_UNEXPECTED_DEACTIVATION, "CAUSE_UNEXPECTED_DEACTIVATION"}, {SAHPI_HS_CAUSE_SURPRISE_EXTRACTION, "CAUSE_SURPRISE_EXTRACTION"}, {SAHPI_HS_CAUSE_EXTRACTION_UPDATE, "CAUSE_EXTRACTION_UPDATE"}, {SAHPI_HS_CAUSE_HARDWARE_FAULT, "CAUSE_HARDWARE_FAULT"}, {SAHPI_HS_CAUSE_CONTAINING_FRU, "CAUSE_CONTAINING_FRU"}, {SAHPI_HS_CAUSE_UNKNOWN, "CAUSE_UNKNOWN"}, }; /** * oh_encode_hscauseofstatechange: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiHsCauseOfStateChangeT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_hscauseofstatechange(), back * into an SaHpiHsCauseOfStateChangeT type. * * Returns: * SaHpiHsCauseOfStateChangeT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_hscauseofstatechange(SaHpiTextBufferT *buffer, SaHpiHsCauseOfStateChangeT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, hscauseofstatechange_strings[i].str) == 0) { found++; break; } } if (found) { *type = hscauseofstatechange_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_severity: * @value: enum value of type SaHpiSeverityT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiSeverityT. **/ char * oh_lookup_severity(SaHpiSeverityT value) { switch (value) { case SAHPI_CRITICAL: return "CRITICAL"; case SAHPI_MAJOR: return "MAJOR"; case SAHPI_MINOR: return "MINOR"; case SAHPI_INFORMATIONAL: return "INFORMATIONAL"; case SAHPI_OK: return "OK"; case SAHPI_DEBUG: return "DEBUG"; case SAHPI_ALL_SEVERITIES: return "ALL_SEVERITIES"; default: return NULL; } } struct oh_severity_map severity_strings[] = { {SAHPI_CRITICAL, "CRITICAL"}, {SAHPI_MAJOR, "MAJOR"}, {SAHPI_MINOR, "MINOR"}, {SAHPI_INFORMATIONAL, "INFORMATIONAL"}, {SAHPI_OK, "OK"}, {SAHPI_DEBUG, "DEBUG"}, {SAHPI_ALL_SEVERITIES, "ALL_SEVERITIES"}, }; /** * oh_encode_severity: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiSeverityT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_severity(), back * into an SaHpiSeverityT type. * * Returns: * SaHpiSeverityT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_severity(SaHpiTextBufferT *buffer, SaHpiSeverityT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, severity_strings[i].str) == 0) { found++; break; } } if (found) { *type = severity_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_resourceeventtype: * @value: enum value of type SaHpiResourceEventTypeT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiResourceEventTypeT. **/ char * oh_lookup_resourceeventtype(SaHpiResourceEventTypeT value) { switch (value) { case SAHPI_RESE_RESOURCE_FAILURE: return "FAILURE"; case SAHPI_RESE_RESOURCE_RESTORED: return "RESTORED"; case SAHPI_RESE_RESOURCE_ADDED: return "ADDED"; case SAHPI_RESE_RESOURCE_REMOVED: return "REMOVED"; case SAHPI_RESE_RESOURCE_INACCESSIBLE: return "INACCESSIBLE"; case SAHPI_RESE_RESOURCE_UPDATED: return "UPDATED"; default: return NULL; } } struct oh_resourceeventtype_map resourceeventtype_strings[] = { {SAHPI_RESE_RESOURCE_FAILURE, "FAILURE"}, {SAHPI_RESE_RESOURCE_RESTORED, "RESTORED"}, {SAHPI_RESE_RESOURCE_ADDED, "ADDED"}, {SAHPI_RESE_RESOURCE_REMOVED, "REMOVED"}, {SAHPI_RESE_RESOURCE_INACCESSIBLE, "INACCESSIBLE"}, {SAHPI_RESE_RESOURCE_UPDATED, "UPDATED"}, }; /** * oh_encode_resourceeventtype: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiResourceEventTypeT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_resourceeventtype(), back * into an SaHpiResourceEventTypeT type. * * Returns: * SaHpiResourceEventTypeT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_resourceeventtype(SaHpiTextBufferT *buffer, SaHpiResourceEventTypeT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, resourceeventtype_strings[i].str) == 0) { found++; break; } } if (found) { *type = resourceeventtype_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_domaineventtype: * @value: enum value of type SaHpiDomainEventTypeT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiDomainEventTypeT. **/ char * oh_lookup_domaineventtype(SaHpiDomainEventTypeT value) { switch (value) { case SAHPI_DOMAIN_REF_ADDED: return "ADDED"; case SAHPI_DOMAIN_REF_REMOVED: return "REMOVED"; default: return NULL; } } struct oh_domaineventtype_map domaineventtype_strings[] = { {SAHPI_DOMAIN_REF_ADDED, "ADDED"}, {SAHPI_DOMAIN_REF_REMOVED, "REMOVED"}, }; /** * oh_encode_domaineventtype: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiDomainEventTypeT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_domaineventtype(), back * into an SaHpiDomainEventTypeT type. * * Returns: * SaHpiDomainEventTypeT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_domaineventtype(SaHpiTextBufferT *buffer, SaHpiDomainEventTypeT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, domaineventtype_strings[i].str) == 0) { found++; break; } } if (found) { *type = domaineventtype_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_sweventtype: * @value: enum value of type SaHpiSwEventTypeT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiSwEventTypeT. **/ char * oh_lookup_sweventtype(SaHpiSwEventTypeT value) { switch (value) { case SAHPI_HPIE_AUDIT: return "AUDIT"; case SAHPI_HPIE_STARTUP: return "STARTUP"; case SAHPI_HPIE_OTHER: return "OTHER"; default: return NULL; } } struct oh_sweventtype_map sweventtype_strings[] = { {SAHPI_HPIE_AUDIT, "AUDIT"}, {SAHPI_HPIE_STARTUP, "STARTUP"}, {SAHPI_HPIE_OTHER, "OTHER"}, }; /** * oh_encode_sweventtype: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiSwEventTypeT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_sweventtype(), back * into an SaHpiSwEventTypeT type. * * Returns: * SaHpiSwEventTypeT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_sweventtype(SaHpiTextBufferT *buffer, SaHpiSwEventTypeT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, sweventtype_strings[i].str) == 0) { found++; break; } } if (found) { *type = sweventtype_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_eventtype: * @value: enum value of type SaHpiEventTypeT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiEventTypeT. **/ char * oh_lookup_eventtype(SaHpiEventTypeT value) { switch (value) { case SAHPI_ET_RESOURCE: return "RESOURCE"; case SAHPI_ET_DOMAIN: return "DOMAIN"; case SAHPI_ET_SENSOR: return "SENSOR"; case SAHPI_ET_SENSOR_ENABLE_CHANGE: return "SENSOR_ENABLE_CHANGE"; case SAHPI_ET_HOTSWAP: return "HOTSWAP"; case SAHPI_ET_WATCHDOG: return "WATCHDOG"; case SAHPI_ET_HPI_SW: return "HPI_SW"; case SAHPI_ET_OEM: return "OEM"; case SAHPI_ET_USER: return "USER"; case SAHPI_ET_DIMI: return "DIMI"; case SAHPI_ET_DIMI_UPDATE: return "DIMI_UPDATE"; case SAHPI_ET_FUMI: return "FUMI"; default: return NULL; } } struct oh_eventtype_map eventtype_strings[] = { {SAHPI_ET_RESOURCE, "RESOURCE"}, {SAHPI_ET_DOMAIN, "DOMAIN"}, {SAHPI_ET_SENSOR, "SENSOR"}, {SAHPI_ET_SENSOR_ENABLE_CHANGE, "SENSOR_ENABLE_CHANGE"}, {SAHPI_ET_HOTSWAP, "HOTSWAP"}, {SAHPI_ET_WATCHDOG, "WATCHDOG"}, {SAHPI_ET_HPI_SW, "HPI_SW"}, {SAHPI_ET_OEM, "OEM"}, {SAHPI_ET_USER, "USER"}, {SAHPI_ET_DIMI, "DIMI"}, {SAHPI_ET_DIMI_UPDATE, "DIMI_UPDATE"}, {SAHPI_ET_FUMI, "FUMI"}, }; /** * oh_encode_eventtype: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiEventTypeT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_eventtype(), back * into an SaHpiEventTypeT type. * * Returns: * SaHpiEventTypeT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_eventtype(SaHpiTextBufferT *buffer, SaHpiEventTypeT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, eventtype_strings[i].str) == 0) { found++; break; } } if (found) { *type = eventtype_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_statuscondtype: * @value: enum value of type SaHpiStatusCondTypeT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiStatusCondTypeT. **/ char * oh_lookup_statuscondtype(SaHpiStatusCondTypeT value) { switch (value) { case SAHPI_STATUS_COND_TYPE_SENSOR: return "SENSOR"; case SAHPI_STATUS_COND_TYPE_RESOURCE: return "RESOURCE"; case SAHPI_STATUS_COND_TYPE_OEM: return "OEM"; case SAHPI_STATUS_COND_TYPE_USER: return "USER"; default: return NULL; } } struct oh_statuscondtype_map statuscondtype_strings[] = { {SAHPI_STATUS_COND_TYPE_SENSOR, "SENSOR"}, {SAHPI_STATUS_COND_TYPE_RESOURCE, "RESOURCE"}, {SAHPI_STATUS_COND_TYPE_OEM, "OEM"}, {SAHPI_STATUS_COND_TYPE_USER, "USER"}, }; /** * oh_encode_statuscondtype: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiStatusCondTypeT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_statuscondtype(), back * into an SaHpiStatusCondTypeT type. * * Returns: * SaHpiStatusCondTypeT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_statuscondtype(SaHpiTextBufferT *buffer, SaHpiStatusCondTypeT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, statuscondtype_strings[i].str) == 0) { found++; break; } } if (found) { *type = statuscondtype_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_annunciatormode: * @value: enum value of type SaHpiAnnunciatorModeT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiAnnunciatorModeT. **/ char * oh_lookup_annunciatormode(SaHpiAnnunciatorModeT value) { switch (value) { case SAHPI_ANNUNCIATOR_MODE_AUTO: return "AUTO"; case SAHPI_ANNUNCIATOR_MODE_USER: return "USER"; case SAHPI_ANNUNCIATOR_MODE_SHARED: return "SHARED"; default: return NULL; } } struct oh_annunciatormode_map annunciatormode_strings[] = { {SAHPI_ANNUNCIATOR_MODE_AUTO, "AUTO"}, {SAHPI_ANNUNCIATOR_MODE_USER, "USER"}, {SAHPI_ANNUNCIATOR_MODE_SHARED, "SHARED"}, }; /** * oh_encode_annunciatormode: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiAnnunciatorModeT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_annunciatormode(), back * into an SaHpiAnnunciatorModeT type. * * Returns: * SaHpiAnnunciatorModeT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_annunciatormode(SaHpiTextBufferT *buffer, SaHpiAnnunciatorModeT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, annunciatormode_strings[i].str) == 0) { found++; break; } } if (found) { *type = annunciatormode_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_annunciatortype: * @value: enum value of type SaHpiAnnunciatorTypeT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiAnnunciatorTypeT. **/ char * oh_lookup_annunciatortype(SaHpiAnnunciatorTypeT value) { switch (value) { case SAHPI_ANNUNCIATOR_TYPE_LED: return "LED"; case SAHPI_ANNUNCIATOR_TYPE_DRY_CONTACT_CLOSURE: return "DRY_CONTACT_CLOSURE"; case SAHPI_ANNUNCIATOR_TYPE_AUDIBLE: return "AUDIBLE"; case SAHPI_ANNUNCIATOR_TYPE_LCD_DISPLAY: return "LCD_DISPLAY"; case SAHPI_ANNUNCIATOR_TYPE_MESSAGE: return "MESSAGE"; case SAHPI_ANNUNCIATOR_TYPE_COMPOSITE: return "COMPOSITE"; case SAHPI_ANNUNCIATOR_TYPE_OEM: return "OEM"; default: return NULL; } } struct oh_annunciatortype_map annunciatortype_strings[] = { {SAHPI_ANNUNCIATOR_TYPE_LED, "LED"}, {SAHPI_ANNUNCIATOR_TYPE_DRY_CONTACT_CLOSURE, "DRY_CONTACT_CLOSURE"}, {SAHPI_ANNUNCIATOR_TYPE_AUDIBLE, "AUDIBLE"}, {SAHPI_ANNUNCIATOR_TYPE_LCD_DISPLAY, "LCD_DISPLAY"}, {SAHPI_ANNUNCIATOR_TYPE_MESSAGE, "MESSAGE"}, {SAHPI_ANNUNCIATOR_TYPE_COMPOSITE, "COMPOSITE"}, {SAHPI_ANNUNCIATOR_TYPE_OEM, "OEM"}, }; /** * oh_encode_annunciatortype: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiAnnunciatorTypeT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_annunciatortype(), back * into an SaHpiAnnunciatorTypeT type. * * Returns: * SaHpiAnnunciatorTypeT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_annunciatortype(SaHpiTextBufferT *buffer, SaHpiAnnunciatorTypeT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, annunciatortype_strings[i].str) == 0) { found++; break; } } if (found) { *type = annunciatortype_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_rdrtype: * @value: enum value of type SaHpiRdrTypeT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiRdrTypeT. **/ char * oh_lookup_rdrtype(SaHpiRdrTypeT value) { switch (value) { case SAHPI_NO_RECORD: return "NO_RECORD"; case SAHPI_CTRL_RDR: return "CTRL_RDR"; case SAHPI_SENSOR_RDR: return "SENSOR_RDR"; case SAHPI_INVENTORY_RDR: return "INVENTORY_RDR"; case SAHPI_WATCHDOG_RDR: return "WATCHDOG_RDR"; case SAHPI_ANNUNCIATOR_RDR: return "ANNUNCIATOR_RDR"; case SAHPI_DIMI_RDR: return "DIMI_RDR"; case SAHPI_FUMI_RDR: return "FUMI_RDR"; default: return NULL; } } struct oh_rdrtype_map rdrtype_strings[] = { {SAHPI_NO_RECORD, "NO_RECORD"}, {SAHPI_CTRL_RDR, "CTRL_RDR"}, {SAHPI_SENSOR_RDR, "SENSOR_RDR"}, {SAHPI_INVENTORY_RDR, "INVENTORY_RDR"}, {SAHPI_WATCHDOG_RDR, "WATCHDOG_RDR"}, {SAHPI_ANNUNCIATOR_RDR, "ANNUNCIATOR_RDR"}, {SAHPI_DIMI_RDR, "DIMI_RDR"}, {SAHPI_FUMI_RDR, "FUMI_RDR"}, }; /** * oh_encode_rdrtype: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiRdrTypeT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_rdrtype(), back * into an SaHpiRdrTypeT type. * * Returns: * SaHpiRdrTypeT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_rdrtype(SaHpiTextBufferT *buffer, SaHpiRdrTypeT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, rdrtype_strings[i].str) == 0) { found++; break; } } if (found) { *type = rdrtype_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_parmaction: * @value: enum value of type SaHpiParmActionT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiParmActionT. **/ char * oh_lookup_parmaction(SaHpiParmActionT value) { switch (value) { case SAHPI_DEFAULT_PARM: return "DEFAULT_PARM"; case SAHPI_SAVE_PARM: return "SAVE_PARM"; case SAHPI_RESTORE_PARM: return "RESTORE_PARM"; default: return NULL; } } struct oh_parmaction_map parmaction_strings[] = { {SAHPI_DEFAULT_PARM, "DEFAULT_PARM"}, {SAHPI_SAVE_PARM, "SAVE_PARM"}, {SAHPI_RESTORE_PARM, "RESTORE_PARM"}, }; /** * oh_encode_parmaction: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiParmActionT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_parmaction(), back * into an SaHpiParmActionT type. * * Returns: * SaHpiParmActionT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_parmaction(SaHpiTextBufferT *buffer, SaHpiParmActionT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, parmaction_strings[i].str) == 0) { found++; break; } } if (found) { *type = parmaction_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_resetaction: * @value: enum value of type SaHpiResetActionT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiResetActionT. **/ char * oh_lookup_resetaction(SaHpiResetActionT value) { switch (value) { case SAHPI_COLD_RESET: return "COLD_RESET"; case SAHPI_WARM_RESET: return "WARM_RESET"; case SAHPI_RESET_ASSERT: return "RESET_ASSERT"; case SAHPI_RESET_DEASSERT: return "RESET_DEASSERT"; default: return NULL; } } struct oh_resetaction_map resetaction_strings[] = { {SAHPI_COLD_RESET, "COLD_RESET"}, {SAHPI_WARM_RESET, "WARM_RESET"}, {SAHPI_RESET_ASSERT, "RESET_ASSERT"}, {SAHPI_RESET_DEASSERT, "RESET_DEASSERT"}, }; /** * oh_encode_resetaction: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiResetActionT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_resetaction(), back * into an SaHpiResetActionT type. * * Returns: * SaHpiResetActionT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_resetaction(SaHpiTextBufferT *buffer, SaHpiResetActionT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, resetaction_strings[i].str) == 0) { found++; break; } } if (found) { *type = resetaction_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_powerstate: * @value: enum value of type SaHpiPowerStateT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiPowerStateT. **/ char * oh_lookup_powerstate(SaHpiPowerStateT value) { switch (value) { case SAHPI_POWER_OFF: return "OFF"; case SAHPI_POWER_ON: return "ON"; case SAHPI_POWER_CYCLE: return "CYCLE"; default: return NULL; } } struct oh_powerstate_map powerstate_strings[] = { {SAHPI_POWER_OFF, "OFF"}, {SAHPI_POWER_ON, "ON"}, {SAHPI_POWER_CYCLE, "CYCLE"}, }; /** * oh_encode_powerstate: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiPowerStateT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_powerstate(), back * into an SaHpiPowerStateT type. * * Returns: * SaHpiPowerStateT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_powerstate(SaHpiTextBufferT *buffer, SaHpiPowerStateT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, powerstate_strings[i].str) == 0) { found++; break; } } if (found) { *type = powerstate_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_eventlogoverflowaction: * @value: enum value of type SaHpiEventLogOverflowActionT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiEventLogOverflowActionT. **/ char * oh_lookup_eventlogoverflowaction(SaHpiEventLogOverflowActionT value) { switch (value) { case SAHPI_EL_OVERFLOW_DROP: return "OVERFLOW_DROP"; case SAHPI_EL_OVERFLOW_OVERWRITE: return "OVERFLOW_OVERWRITE"; default: return NULL; } } struct oh_eventlogoverflowaction_map eventlogoverflowaction_strings[] = { {SAHPI_EL_OVERFLOW_DROP, "OVERFLOW_DROP"}, {SAHPI_EL_OVERFLOW_OVERWRITE, "OVERFLOW_OVERWRITE"}, }; /** * oh_encode_eventlogoverflowaction: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiEventLogOverflowActionT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_eventlogoverflowaction(), back * into an SaHpiEventLogOverflowActionT type. * * Returns: * SaHpiEventLogOverflowActionT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_eventlogoverflowaction(SaHpiTextBufferT *buffer, SaHpiEventLogOverflowActionT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, eventlogoverflowaction_strings[i].str) == 0) { found++; break; } } if (found) { *type = eventlogoverflowaction_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_error: * @value: enum value of type SaErrorT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaErrorT. **/ char * oh_lookup_error(SaErrorT value) { switch (value) { case SA_OK: return "SA_OK"; case SA_ERR_HPI_ERROR: return "ERROR"; case SA_ERR_HPI_UNSUPPORTED_API: return "UNSUPPORTED_API"; case SA_ERR_HPI_BUSY: return "BUSY"; case SA_ERR_HPI_INTERNAL_ERROR: return "INTERNAL_ERROR"; case SA_ERR_HPI_INVALID_CMD: return "INVALID_CMD"; case SA_ERR_HPI_TIMEOUT: return "TIMEOUT"; case SA_ERR_HPI_OUT_OF_SPACE: return "OUT_OF_SPACE"; case SA_ERR_HPI_OUT_OF_MEMORY: return "OUT_OF_MEMORY"; case SA_ERR_HPI_INVALID_PARAMS: return "INVALID_PARAMS"; case SA_ERR_HPI_INVALID_DATA: return "INVALID_DATA"; case SA_ERR_HPI_NOT_PRESENT: return "NOT_PRESENT"; case SA_ERR_HPI_NO_RESPONSE: return "NO_RESPONSE"; case SA_ERR_HPI_DUPLICATE: return "DUPLICATE"; case SA_ERR_HPI_INVALID_SESSION: return "INVALID_SESSION"; case SA_ERR_HPI_INVALID_DOMAIN: return "INVALID_DOMAIN"; case SA_ERR_HPI_INVALID_RESOURCE: return "INVALID_RESOURCE"; case SA_ERR_HPI_INVALID_REQUEST: return "INVALID_REQUEST"; case SA_ERR_HPI_ENTITY_NOT_PRESENT: return "ENTITY_NOT_PRESENT"; case SA_ERR_HPI_READ_ONLY: return "READ_ONLY"; case SA_ERR_HPI_CAPABILITY: return "CAPABILITY"; case SA_ERR_HPI_UNKNOWN: return "UNKNOWN"; case SA_ERR_HPI_INVALID_STATE: return "INVALID_STATE"; case SA_ERR_HPI_UNSUPPORTED_PARAMS: return "UNSUPPORTED_PARAMS"; default: return NULL; } } struct oh_error_map error_strings[] = { {SA_OK, "SA_OK"}, {SA_ERR_HPI_ERROR, "ERROR"}, {SA_ERR_HPI_UNSUPPORTED_API, "UNSUPPORTED_API"}, {SA_ERR_HPI_BUSY, "BUSY"}, {SA_ERR_HPI_INTERNAL_ERROR, "INTERNAL_ERROR"}, {SA_ERR_HPI_INVALID_CMD, "INVALID_CMD"}, {SA_ERR_HPI_TIMEOUT, "TIMEOUT"}, {SA_ERR_HPI_OUT_OF_SPACE, "OUT_OF_SPACE"}, {SA_ERR_HPI_OUT_OF_MEMORY, "OUT_OF_MEMORY"}, {SA_ERR_HPI_INVALID_PARAMS, "INVALID_PARAMS"}, {SA_ERR_HPI_INVALID_DATA, "INVALID_DATA"}, {SA_ERR_HPI_NOT_PRESENT, "NOT_PRESENT"}, {SA_ERR_HPI_NO_RESPONSE, "NO_RESPONSE"}, {SA_ERR_HPI_DUPLICATE, "DUPLICATE"}, {SA_ERR_HPI_INVALID_SESSION, "INVALID_SESSION"}, {SA_ERR_HPI_INVALID_DOMAIN, "INVALID_DOMAIN"}, {SA_ERR_HPI_INVALID_RESOURCE, "INVALID_RESOURCE"}, {SA_ERR_HPI_INVALID_REQUEST, "INVALID_REQUEST"}, {SA_ERR_HPI_ENTITY_NOT_PRESENT, "ENTITY_NOT_PRESENT"}, {SA_ERR_HPI_READ_ONLY, "READ_ONLY"}, {SA_ERR_HPI_CAPABILITY, "CAPABILITY"}, {SA_ERR_HPI_UNKNOWN, "UNKNOWN"}, {SA_ERR_HPI_INVALID_STATE, "INVALID_STATE"}, {SA_ERR_HPI_UNSUPPORTED_PARAMS, "UNSUPPORTED_PARAMS"}, }; /** * oh_encode_error: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaErrorT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_error(), back * into an SaErrorT type. * * Returns: * SaErrorT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_error(SaHpiTextBufferT *buffer, SaErrorT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, error_strings[i].str) == 0) { found++; break; } } if (found) { *type = error_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_eventcategory: * @value: enum value of type SaHpiEventCategoryT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiEventCategoryT. **/ char * oh_lookup_eventcategory(SaHpiEventCategoryT value) { switch (value) { case SAHPI_EC_UNSPECIFIED: return "UNSPECIFIED"; case SAHPI_EC_THRESHOLD: return "THRESHOLD"; case SAHPI_EC_USAGE: return "USAGE"; case SAHPI_EC_STATE: return "STATE"; case SAHPI_EC_PRED_FAIL: return "PRED_FAIL"; case SAHPI_EC_LIMIT: return "LIMIT"; case SAHPI_EC_PERFORMANCE: return "PERFORMANCE"; case SAHPI_EC_SEVERITY: return "SEVERITY"; case SAHPI_EC_PRESENCE: return "PRESENCE"; case SAHPI_EC_ENABLE: return "ENABLE"; case SAHPI_EC_AVAILABILITY: return "AVAILABILITY"; case SAHPI_EC_REDUNDANCY: return "REDUNDANCY"; case SAHPI_EC_SENSOR_SPECIFIC: return "SENSOR_SPECIFIC"; case SAHPI_EC_GENERIC: return "GENERIC"; default: return NULL; } } struct oh_eventcategory_map eventcategory_strings[] = { {SAHPI_EC_UNSPECIFIED, "UNSPECIFIED"}, {SAHPI_EC_THRESHOLD, "THRESHOLD"}, {SAHPI_EC_USAGE, "USAGE"}, {SAHPI_EC_STATE, "STATE"}, {SAHPI_EC_PRED_FAIL, "PRED_FAIL"}, {SAHPI_EC_LIMIT, "LIMIT"}, {SAHPI_EC_PERFORMANCE, "PERFORMANCE"}, {SAHPI_EC_SEVERITY, "SEVERITY"}, {SAHPI_EC_PRESENCE, "PRESENCE"}, {SAHPI_EC_ENABLE, "ENABLE"}, {SAHPI_EC_AVAILABILITY, "AVAILABILITY"}, {SAHPI_EC_REDUNDANCY, "REDUNDANCY"}, {SAHPI_EC_SENSOR_SPECIFIC, "SENSOR_SPECIFIC"}, {SAHPI_EC_GENERIC, "GENERIC"}, }; /** * oh_encode_eventcategory: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiEventCategoryT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_eventcategory(), back * into an SaHpiEventCategoryT type. * * Returns: * SaHpiEventCategoryT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_eventcategory(SaHpiTextBufferT *buffer, SaHpiEventCategoryT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, eventcategory_strings[i].str) == 0) { found++; break; } } if (found) { *type = eventcategory_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } openhpi-3.6.1/utils/sahpi_struct_utils.c0000644000175100017510000052421312575647300017427 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004-2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Sean Dague * Steve Sherman * Racing Guo * Renier Morales * Lars Wetzel */ #include #include #include #include #include #include #include #include #include #include #define U_IS_SURROGATE(c) (((c)&0xfffff800)==0xd800) #define U_IS_LEAD(c) (((c)&0xfffffc00)==0xd800) #define U_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00) static inline SaErrorT oh_append_data(oh_big_textbuffer *big_buffer, const SaHpiUint8T *from, SaHpiUint8T len); static SaErrorT oh_build_resourceinfo(oh_big_textbuffer *buffer, const SaHpiResourceInfoT *ResourceInfo, int offsets); static SaErrorT oh_build_sensorrec(oh_big_textbuffer *buffer, const SaHpiSensorRecT *sensor, int offsets); static SaErrorT oh_build_sensordataformat(oh_big_textbuffer *buffer, const SaHpiSensorDataFormatT *format, int offsets); static SaErrorT oh_build_sensorthddefn(oh_big_textbuffer *buffer, const SaHpiSensorThdDefnT *tdef, int offsets); static SaErrorT oh_build_textbuffer(oh_big_textbuffer *buffer, const SaHpiTextBufferT *textbuffer, int offsets); static SaErrorT oh_build_ctrlrec(oh_big_textbuffer *textbuf, const SaHpiCtrlRecT *ctrlrec, int offsets); static SaErrorT oh_build_invrec(oh_big_textbuffer *textbuff, const SaHpiInventoryRecT *invrec, int offsets); static SaErrorT oh_build_wdogrec(oh_big_textbuffer *textbuff, const SaHpiWatchdogRecT *wdogrec, int offsets); static SaErrorT oh_build_annrec(oh_big_textbuffer *textbuff, const SaHpiAnnunciatorRecT *annrec, int offsets); static SaErrorT oh_build_dimirec(oh_big_textbuffer *textbuff, const SaHpiDimiRecT *dimirec, int offsets); static SaErrorT oh_build_fumirec(oh_big_textbuffer *textbuff, const SaHpiFumiRecT *fumirec, int offsets); static SaErrorT oh_build_event_resource(oh_big_textbuffer *buffer, const SaHpiEventT *event, int offsets); static SaErrorT oh_build_event_domain(oh_big_textbuffer *buffer, const SaHpiEventT *event, int offsets); static SaErrorT oh_build_event_sensor(oh_big_textbuffer *buffer, const SaHpiEventT *event, int offsets); static SaErrorT oh_build_event_sensor_enable_change(oh_big_textbuffer *buffer, const SaHpiEventT *event, int offsets); static SaErrorT oh_build_event_hotswap(oh_big_textbuffer *buffer, const SaHpiEventT *event, int offsets); static SaErrorT oh_build_event_watchdog(oh_big_textbuffer *buffer, const SaHpiEventT *event, int offsets); static SaErrorT oh_build_event_hpi_sw(oh_big_textbuffer *buffer, const SaHpiEventT *event, int offsets); static SaErrorT oh_build_event_oem(oh_big_textbuffer *buffer, const SaHpiEventT *event, int offsets); static SaErrorT oh_build_event_user(oh_big_textbuffer *buffer, const SaHpiEventT *event, int offsets); static SaErrorT oh_build_event_dimi(oh_big_textbuffer *buffer, const SaHpiEventT *event, int offsets); static SaErrorT oh_build_event_dimi_update(oh_big_textbuffer *buffer, const SaHpiEventT *event, int offsets); static SaErrorT oh_build_event_fumi(oh_big_textbuffer *buffer, const SaHpiEventT *event, int offsets); /************************************************************************ * NOTES! * * - Several error checks can be removed if valid_xxx routines are defined * for input structures. If this happens, several of the default switch * statements should also return SA_ERR_HPI_INTERNAL_ERROR instead * of SA_ERR_HPI_INVALID_PARMS. ************************************************************************/ /** * oh_lookup_manufacturerid: * @value: enum value of type SaHpiManufacturerIdT. * @buffer: Location to store the string. * * Converts @value into a string based on @value's enum definition * in http://www.iana.org/assignments/enterprise-numbers. * String is stored in an SaHpiTextBufferT data structure. * * Only a few of the manufacturers in that list have been defined. * For all others, this routine returns "Unknown Manufacturer". * Feel free to add your own favorite manufacturer to this routine. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - @buffer is NULL. **/ SaErrorT oh_decode_manufacturerid(SaHpiManufacturerIdT value, SaHpiTextBufferT *buffer) { SaErrorT err; SaHpiTextBufferT working; if (!buffer) { return(SA_ERR_HPI_INVALID_PARAMS); } err = oh_init_textbuffer(&working); if (err) { return(err); } switch(value) { case SAHPI_MANUFACTURER_ID_UNSPECIFIED: err = oh_append_textbuffer(&working, "Unspecified"); if (err) { return(err); } break; case 2: /* 2 is IANA number */ case 20944: /* 20944 is IANA code for Modular Blade Server */ err = oh_append_textbuffer(&working,"IBM"); if (err) { return(err); } break; case ATCAHPI_PICMG_MID: /* ATCAHPI_PICMG_MID is IANA code for PICMG manufacturer identifier */ err = oh_append_textbuffer(&working,"PICMG"); if (err) { return(err); } break; case 11: err = oh_append_textbuffer(&working, "Hewlett-Packard"); if (err) { return(err); } break; case 42: err = oh_append_textbuffer(&working, "Sun Microsystems"); if (err) { return(err); } break; case 161: err = oh_append_textbuffer(&working, "Motorola"); if (err) { return(err); } break; case 185: err = oh_append_textbuffer(&working, "Interphase"); if (err) { return(err); } break; case 343: err = oh_append_textbuffer(&working, "Intel Corporation"); if (err) { return(err); } break; case 398: err = oh_append_textbuffer(&working, "Tyco Electronics"); if (err) { return(err); } break; case 688: err = oh_append_textbuffer(&working, "Znyx Advanced Systems Division, Inc."); if (err) { return(err); } break; case 912: err = oh_append_textbuffer(&working, "Adax Inc."); if (err) { return(err); } break; case 1458: err = oh_append_textbuffer(&working, "AMCC"); if (err) { return(err); } break; case 1556: err = oh_append_textbuffer(&working, "Performance Technologies, Inc."); if (err) { return(err); } break; case 2012: err = oh_append_textbuffer(&working, "Schroff GmbH"); if (err) { return(err); } break; case 2537: err = oh_append_textbuffer(&working, "Diversified Technology, Inc."); if (err) { return(err); } break; case 2606: err = oh_append_textbuffer(&working, "Rittal-Werk Rudolf Loh GmbH & Co.KG"); if (err) { return(err); } break; case 2628: err = oh_append_textbuffer(&working, "Natural MicroSystems"); if (err) { return(err); } break; case 3028: err = oh_append_textbuffer(&working, "Dialogic Corporation"); if (err) { return(err); } break; case 3442: err = oh_append_textbuffer(&working, "Advantech Inc."); if (err) { return(err); } break; case 4127: err = oh_append_textbuffer(&working, "Mercury Computer Systems"); if (err) { return(err); } break; case 4337: err = oh_append_textbuffer(&working, "RadiSys Corporation"); if (err) { return(err); } break; case 5380: err = oh_append_textbuffer(&working, "CDOT"); if (err) { return(err); } break; case 6629: err = oh_append_textbuffer(&working, "Ulticom"); if (err) { return(err); } break; case 7994: err = oh_append_textbuffer(&working, "Continuous Computing Corp."); if (err) { return(err); } break; case 8337: err = oh_append_textbuffer(&working, "Hybricon Corp"); if (err) { return(err); } break; case 10297: err = oh_append_textbuffer(&working, "Advantech Co., Ltd."); if (err) { return(err); } break; case 10520: err = oh_append_textbuffer(&working, "Tyco Electronics Power Systems"); if (err) { return(err); } break; case 10728: err = oh_append_textbuffer(&working, "Redline Communications Inc."); if (err) { return(err); } break; case 13400: err = oh_append_textbuffer(&working, "Emerson Network Power"); if (err) { return(err); } break; case 13427: err = oh_append_textbuffer(&working, "Artesyn Technologies"); if (err) { return(err); } break; case 15000: err = oh_append_textbuffer(&working, "Kontron Canada Inc"); if (err) { return(err); } break; case 15563: err = oh_append_textbuffer(&working, "Adtron"); if (err) { return(err); } break; case 16394: err = oh_append_textbuffer(&working, "Pigeon Point Systems"); if (err) { return(err); } break; case 16446: err = oh_append_textbuffer(&working, "Adlink"); if (err) { return(err); } break; case 18765: err = oh_append_textbuffer(&working, "Comtel Electronics GmbH"); if (err) { return(err); } break; case 19911: err = oh_append_textbuffer(&working, "Global Velocity Inc."); if (err) { return(err); } break; case 20974: err = oh_append_textbuffer(&working, "American Megatrends, Inc"); if (err) { return(err); } break; case 22341: err = oh_append_textbuffer(&working, "ESO Technologies"); if (err) { return(err); } break; case 23858: err = oh_append_textbuffer(&working, "VadaTech Inc."); if (err) { return(err); } break; case 24632: err = oh_append_textbuffer(&working, "CorEdge Networks"); if (err) { return(err); } break; case 25635: err = oh_append_textbuffer(&working, "Carlo Gavazzi Computing Solutions"); if (err) { return(err); } break; case 26609: err = oh_append_textbuffer(&working, "Pentair Technical Products"); if (err) { return(err); } break; case 24893: err = oh_append_textbuffer(&working, "GE Fanuc Embedded Systems"); if (err) { return(err); } break; case 26061: err = oh_append_textbuffer(&working, "Artesyn Communication Products Ltd"); if (err) { return(err); } break; case 26655: err = oh_append_textbuffer(&working, "Advantech Co., Ltd"); if (err) { return(err); } break; case 27317: err = oh_append_textbuffer(&working, "Extreme Engineering Solutions, Inc"); if (err) { return(err); } break; case 27768: err = oh_append_textbuffer(&working, "Gesellschaft f�r Netzwerk- und Automatisierungs-Technologie GmbH"); if (err) { return(err); } break; case 29333: err = oh_append_textbuffer(&working, "JBlade LLC"); if (err) { return(err); } break; case 186: err = oh_append_textbuffer(&working, "Toshiba"); if (err) { return(err); } break; case 116: err = oh_append_textbuffer(&working, "Hitachi"); if (err) { return(err); } break; case 399: err = oh_append_textbuffer(&working, "Hitachi"); if (err) { return(err); } break; case 119: err = oh_append_textbuffer(&working, "NEC"); if (err) { return(err); } break; case 373: err = oh_append_textbuffer(&working, "Tatung"); if (err) { return(err); } break; case 802: err = oh_append_textbuffer(&working, "National Semiconductor"); if (err) { return(err); } break; case 674: err = oh_append_textbuffer(&working, "Dell"); if (err) { return(err); } break; case 2168: err = oh_append_textbuffer(&working, "LMC"); if (err) { return(err); } break; case 6653: err = oh_append_textbuffer(&working, "Tyan"); if (err) { return(err); } break; case 10368: err = oh_append_textbuffer(&working, "Fujitsu-Siemens"); if (err) { return(err); } break; case 10876: err = oh_append_textbuffer(&working, "SuperMicro"); if (err) { return(err); } break; case 13742: err = oh_append_textbuffer(&working, "Raritan"); if (err) { return(err); } break; case 10437: err = oh_append_textbuffer(&working, "Peppercon"); if (err) { return(err); } break; case 10418: err = oh_append_textbuffer(&working, "Avocent"); if (err) { return(err); } break; case 11102: err = oh_append_textbuffer(&working, "OSA"); if (err) { return(err); } break; case 9: err = oh_append_textbuffer(&working, "Cisco Systems, Inc."); if (err) { return(err); } break; default: err = oh_append_textbuffer(&working, "Unknown"); if (err) { return(err); } } oh_copy_textbuffer(buffer, &working); return(SA_OK); } /** * oh_decode_sensorreading: * @reading: SaHpiSensorReadingT to convert. * @format: SaHpiDataFormatT for the sensor reading. * @buffer: Location to store the converted string. * * Converts an HPI sensor reading and format into a string. * String is stored in an SaHpiTextBufferT data structure. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_CMD - @format or @reading have IsSupported == FALSE. * SA_ERR_HPI_INVALID_DATA - @format and @reading types don't match. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL; @reading type != @format type. * SA_ERR_HPI_OUT_OF_SPACE - @buffer not big enough to accomodate appended string **/ SaErrorT oh_decode_sensorreading(SaHpiSensorReadingT reading, SaHpiSensorDataFormatT format, SaHpiTextBufferT *buffer) { char text[SAHPI_MAX_TEXT_BUFFER_LENGTH]; SaErrorT err; SaHpiTextBufferT working; char str[SAHPI_SENSOR_BUFFER_LENGTH + 1]; if (!buffer) { return(SA_ERR_HPI_INVALID_PARAMS); } if (!reading.IsSupported || !format.IsSupported) { return(SA_ERR_HPI_INVALID_CMD); } if (reading.Type != format.ReadingType) { return(SA_ERR_HPI_INVALID_DATA); } oh_init_textbuffer(&working); memset(text, 0, SAHPI_MAX_TEXT_BUFFER_LENGTH); switch(reading.Type) { case SAHPI_SENSOR_READING_TYPE_INT64: snprintf(text, SAHPI_MAX_TEXT_BUFFER_LENGTH, "%" PRId64, (int64_t)reading.Value.SensorInt64); err = oh_append_textbuffer(&working, text); if (err) { return(err); } break; case SAHPI_SENSOR_READING_TYPE_UINT64: snprintf(text, SAHPI_MAX_TEXT_BUFFER_LENGTH, "%" PRIu64, (uint64_t)reading.Value.SensorUint64); err = oh_append_textbuffer(&working, text); if (err) { return(err); } break; case SAHPI_SENSOR_READING_TYPE_FLOAT64: snprintf(text, SAHPI_MAX_TEXT_BUFFER_LENGTH, "%5.3lf", reading.Value.SensorFloat64); err = oh_append_textbuffer(&working, text); if (err) { return(err); } break; case SAHPI_SENSOR_READING_TYPE_BUFFER: /* In case Sensor Buffer contains no end of string deliminter */ memset(str, 0, SAHPI_SENSOR_BUFFER_LENGTH + 1); strncpy(str, (char *)reading.Value.SensorBuffer, SAHPI_SENSOR_BUFFER_LENGTH); err = oh_append_textbuffer(&working, str); if (err) { return(err); } break; default: return(SA_ERR_HPI_INVALID_PARAMS); } if (format.Percentage) { err = oh_append_textbuffer(&working, "%"); if (err) { return(err); } } else { /* Add units */ if (format.BaseUnits != SAHPI_SU_UNSPECIFIED) { char *str; err = oh_append_textbuffer(&working, " "); if (err) { return(err); } str = oh_lookup_sensorunits(format.BaseUnits); if (str == NULL) { return(SA_ERR_HPI_INVALID_PARAMS); } err = oh_append_textbuffer(&working, str); if (err) { return(err); } } /* Add modifier units, if appropriate */ if (format.BaseUnits != SAHPI_SU_UNSPECIFIED && format.ModifierUse != SAHPI_SMUU_NONE) { char *str; switch(format.ModifierUse) { case SAHPI_SMUU_BASIC_OVER_MODIFIER: err = oh_append_textbuffer(&working, " / "); if (err) { return(err); } break; case SAHPI_SMUU_BASIC_TIMES_MODIFIER: err = oh_append_textbuffer(&working, " * "); if (err) { return(err); } break; default: return(SA_ERR_HPI_INVALID_PARAMS); } str = oh_lookup_sensorunits(format.ModifierUnits); if (str == NULL) { return(SA_ERR_HPI_INVALID_PARAMS); } err = oh_append_textbuffer(&working, str); if (err) { return(err); } } } oh_copy_textbuffer(buffer, &working); return(SA_OK); } /** * oh_encode_sensorreading: * @buffer: Location of SaHpiTextBufferT containing the string to * convert into a SaHpiSensorReadingT. * @type: SaHpiSensorReadingTypeT of converted reading. * @reading: SaHpiSensorReadingT location to store converted string. * * Converts @buffer->Data string to an HPI SaHpiSensorReadingT structure. * Generally @buffer->Data is created by oh_decode_sensorreading() or has * been built by a plugin, which gets string values for sensor readings (e.g. * through SNMP OID commands). Any non-numeric portion of the string is * discarded. For example, the string "-1.43 Volts" is converted to -1.43 * of type @type. * * If type = SAHPI_SENSOR_READING_TYPE_BUFFER, and @buffer->Data > * SAHPI_SENSOR_BUFFER_LENGTH, data is truncated to fit into the reading * buffer. * * Notes! * - Numerical strings can contain commas but it is assummed that strings follow. * US format (e.g. "1,000,000" = 1 million; not "1.000.000"). * - Decimal points are always preceded by at least one number (e.g. "0.9"). * - Numerical percentage strings like "89%" are stripped of their percent sign. * - Hex notation is not supported (e.g. "0x23"). * - Scientific notation is not supported (e.g. "e+02"). * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL; Invalid @type. * SA_ERR_HPI_INVALID_DATA - Converted @buffer->Data too large for @type; cannot * convert string into valid number; @type incorrect * for resulting number. **/ SaErrorT oh_encode_sensorreading(SaHpiTextBufferT *buffer, SaHpiSensorReadingTypeT type, SaHpiSensorReadingT *reading) { char *endptr; char numstr[SAHPI_MAX_TEXT_BUFFER_LENGTH]; int i, j, skip; int found_sign, found_number, found_float, in_number; SaHpiFloat64T num_float64 = 0.0; SaHpiInt64T num_int64 = 0; SaHpiUint64T num_uint64 = 0; SaHpiSensorReadingT working; if (!buffer || !reading || buffer->Data == NULL || buffer->Data[0] == '\0' || !oh_lookup_sensorreadingtype(type)) { return(SA_ERR_HPI_INVALID_PARAMS); } if (type == SAHPI_SENSOR_READING_TYPE_BUFFER) { reading->IsSupported = SAHPI_TRUE; reading->Type = type; strncpy((char *)reading->Value.SensorBuffer, (char *)buffer->Data, SAHPI_SENSOR_BUFFER_LENGTH); return(SA_OK); } memset(numstr, 0, SAHPI_MAX_TEXT_BUFFER_LENGTH); memset(&working, 0, sizeof(SaHpiSensorReadingT)); working.IsSupported = SAHPI_TRUE; working.Type = type; /* Search string and pull out first numeric string. The strtol type * functions below are pretty good at handling non-numeric junk in * string, but they don't handle spaces after a sign or commas within * a number. So we normalize the string a bit first. */ /* Skip any characters before an '=' sign */ for (skip = 0; skip < buffer->DataLength; ++skip) { if (buffer->Data[skip] == '=') { ++skip; break; } } if (skip >= buffer->DataLength) { skip = 0; } j = found_sign = in_number = found_number = found_float = 0; for (i=skip; iDataLength && !found_number; i++) { if (buffer->Data[i] == '+' || buffer->Data[i] == '-') { if (found_sign) { CRIT("Cannot parse multiple sign values"); return(SA_ERR_HPI_INVALID_DATA); } found_sign = 1; numstr[j] = buffer->Data[i]; j++; } if (isdigit(buffer->Data[i])) { if (!found_number) { in_number = 1; numstr[j] = buffer->Data[i]; j++; } } else { /* Strip non-numerics */ if (buffer->Data[i] == '.') { /* Unless its a decimal point */ if (in_number) { if (found_float) { CRIT("Cannot parse multiple decimal points"); return(SA_ERR_HPI_INVALID_DATA); } found_float = 1; numstr[j] = buffer->Data[i]; j++; } } else { /* Delete commas but don't end search for more numbers */ if (in_number && buffer->Data[i] != ',') { found_number = 1; } } } } if (found_number || in_number) { /* in_number means string ended in a digit character */ found_number = 1; } if (found_float && type != SAHPI_SENSOR_READING_TYPE_FLOAT64) { CRIT("Number and type incompatible"); return(SA_ERR_HPI_INVALID_DATA); } /* Convert string to number */ switch (type) { case SAHPI_SENSOR_READING_TYPE_INT64: if (found_number) { errno = 0; num_int64 = strtoll(numstr, &endptr, 10); if (errno) { CRIT("strtoll failed, errno=%d", errno); return(SA_ERR_HPI_INVALID_DATA); } if (*endptr != '\0') { CRIT("strtoll failed: End Pointer=%s", endptr); return(SA_ERR_HPI_INVALID_DATA); } } else { /* No number in string */ num_int64 = 0; } working.Value.SensorInt64 = num_int64; break; case SAHPI_SENSOR_READING_TYPE_UINT64: if (found_number) { errno = 0; num_uint64 = strtoull(numstr, &endptr, 10); if (errno) { CRIT("strtoull failed, errno=%d", errno); return(SA_ERR_HPI_INVALID_DATA); } if (*endptr != '\0') { CRIT("strtoull failed: End Pointer=%s", endptr); return(SA_ERR_HPI_INVALID_DATA); } } else { /* No number in string */ num_uint64 = 0; } working.Value.SensorUint64 = num_uint64; break; case SAHPI_SENSOR_READING_TYPE_FLOAT64: if (found_number) { errno = 0; num_float64 = strtold(numstr, &endptr); if (errno) { CRIT("strtold failed, errno=%d", errno); return(SA_ERR_HPI_INVALID_DATA); } if (*endptr != '\0') { CRIT("strtold failed: End Pointer=%s", endptr); return(SA_ERR_HPI_INVALID_DATA); } working.Value.SensorFloat64 = num_float64; } else { /* No number in string */ num_float64 = 0; } break; default: /* Should never get here */ CRIT("Invalid type=%d", type); return(SA_ERR_HPI_INTERNAL_ERROR); } *reading = working; return(SA_OK); } /** * oh_fprint_text: * @stream: File handle. * @buffer: Pointer to SaHpiTextBufferT to be printed. * * Prints the text data contained in SaHpiTextBufferT to a file. Data must * be of type SAHPI_TL_TYPE_TEXT. @buffer->DataLength is ignored. * The MACRO oh_print_text(), uses this function to print to STDOUT. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_DATA - @buffer->DataType not SAHPI_TL_TYPE_TEXT. **/ SaErrorT oh_fprint_text(FILE *stream, const SaHpiTextBufferT *buffer) { SaErrorT err; if (buffer->DataType == SAHPI_TL_TYPE_TEXT) { err = fwrite( buffer->Data, buffer->DataLength, 1, stream); if (err < 0) { return(SA_ERR_HPI_INVALID_PARAMS); } } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_fprint_bigtext: * @stream: File handle. * @big_buffer: Pointer to oh_big_textbuffer to be printed. * * Prints the text data contained in oh_big_textbuffer to a file. Data must * be of type SAHPI_TL_TYPE_TEXT. @big_buffer->DataLength is ignored. * The MACRO oh_print_bigtext(), uses this function to print to STDOUT. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_DATA - @big_buffer->DataType not SAHPI_TL_TYPE_TEXT. **/ SaErrorT oh_fprint_bigtext(FILE *stream, const oh_big_textbuffer *big_buffer) { SaErrorT err; if (big_buffer->DataType == SAHPI_TL_TYPE_TEXT) { err = fprintf(stream, "%s\n", big_buffer->Data); if (err < 0) { CRIT("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_init_textbuffer: * @buffer: Pointer to an SaHpiTextBufferT. * * Initializes an SaHpiTextBufferT. Assumes an English language set. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - @buffer is NULL. **/ SaErrorT oh_init_textbuffer(SaHpiTextBufferT *buffer) { if (!buffer) { return(SA_ERR_HPI_INVALID_PARAMS); } memset(buffer, 0, sizeof(*buffer)); buffer->DataType = SAHPI_TL_TYPE_TEXT; buffer->Language = SAHPI_LANG_ENGLISH; buffer->DataLength = 0; return(SA_OK); } SaErrorT oh_init_bigtext(oh_big_textbuffer *big_buffer) { if (!big_buffer) { return(SA_ERR_HPI_INVALID_PARAMS); } memset(big_buffer, 0, sizeof(*big_buffer)); big_buffer->DataType = SAHPI_TL_TYPE_TEXT; big_buffer->Language = SAHPI_LANG_ENGLISH; big_buffer->DataLength = 0; return(SA_OK); } /** * oh_copy_textbuffer: * @dest: SaHpiTextBufferT to copy into. * @from:SaHpiTextBufferT to copy from. * * Copies one SaHpiTextBufferT structure to another. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT oh_copy_textbuffer(SaHpiTextBufferT *dest, const SaHpiTextBufferT *from) { if (!dest || !from) { return(SA_ERR_HPI_INVALID_PARAMS); } dest->DataType = from->DataType; dest->Language = from->Language; dest->DataLength = from->DataLength; memcpy(dest->Data, from->Data, SAHPI_MAX_TEXT_BUFFER_LENGTH); return(SA_OK); } SaErrorT oh_copy_bigtext(oh_big_textbuffer *dest, const oh_big_textbuffer *from) { if (!dest || !from) { return(SA_ERR_HPI_INVALID_PARAMS); } dest->DataType = from->DataType; dest->Language = from->Language; dest->DataLength = from->DataLength; memcpy(dest->Data, from->Data, OH_MAX_TEXT_BUFFER_LENGTH); return(SA_OK); } /** * oh_append_textbuffer: * @buffer: SaHpiTextBufferT to append to. * @from: String to be appended. * * Appends a string to @buffer->Data. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. * SA_ERR_HPI_OUT_OF_SPACE - @buffer not big enough to accomodate appended string. **/ SaErrorT oh_append_textbuffer(SaHpiTextBufferT *buffer, const char *from) { char *p; size_t size; if (!buffer || !from) { return(SA_ERR_HPI_INVALID_PARAMS); } size = strlen(from); if ((size + buffer->DataLength) >= SAHPI_MAX_TEXT_BUFFER_LENGTH) { CRIT("Cannot append to text buffer. Bufsize=%u, size=%lu", buffer->DataLength, (unsigned long)size); return(SA_ERR_HPI_OUT_OF_SPACE); } /* Can't trust NULLs to be right, so use a targeted strncpy instead */ p = (char *)buffer->Data; p += buffer->DataLength; strncpy(p, from, size); buffer->DataLength += size; return(SA_OK); } SaErrorT oh_append_bigtext(oh_big_textbuffer *big_buffer, const char *from) { char *p; size_t size; if (!big_buffer || !from) { return(SA_ERR_HPI_INVALID_PARAMS); } size = strlen(from); if ((size + big_buffer->DataLength) >= OH_MAX_TEXT_BUFFER_LENGTH) { CRIT("Cannot append to buffer. Bufsize=%u, size=%lu", big_buffer->DataLength, (unsigned long)size); return(SA_ERR_HPI_INTERNAL_ERROR); } /* Can't trust NULLs to be right, so use a targeted strncpy instead */ p = (char *)big_buffer->Data; p += big_buffer->DataLength; strncpy(p, from, size); big_buffer->DataLength += size; return(SA_OK); } static inline SaErrorT oh_append_data(oh_big_textbuffer *big_buffer, const SaHpiUint8T *from, SaHpiUint8T len) { SaHpiUint8T i; if (!big_buffer || !from || len == 0) { return(SA_ERR_HPI_INVALID_PARAMS); } for (i=0; iDataLength) >= OH_MAX_TEXT_BUFFER_LENGTH) { CRIT("Cannot append to buffer. Bufsize=%u, len=%u", big_buffer->DataLength, len); return(SA_ERR_HPI_INTERNAL_ERROR); } p = (char *)big_buffer->Data; p += big_buffer->DataLength; strncpy(p, buff, slen); big_buffer->DataLength += slen; } return(SA_OK); } /* Append an arbitrary number of fixed offset strings to a big text buffer */ SaErrorT oh_append_offset(oh_big_textbuffer *buffer, int offsets) { int i; for (i=0; i < offsets; i++) { oh_append_bigtext(buffer, OH_PRINT_OFFSET); } return(SA_OK); } SaErrorT oh_append_char_bigtext(oh_big_textbuffer * big_buffer, unsigned char c) { big_buffer->Data[big_buffer->DataLength] = c; ++big_buffer->DataLength; return(SA_OK); } SaErrorT oh_append_hex_bigtext(oh_big_textbuffer * buf, unsigned char c) { static const unsigned char tt[] = "0123456789abcdef"; oh_append_char_bigtext(buf, tt[c >> 4]); oh_append_char_bigtext(buf, tt[c & 0xF]); return(SA_OK); } /** * oh_fprint_ctrlrec: * @stream: File handle. * @control: Pointer to SaHpiCtrlRecT to be printed. * @offsets: Number of offsets to start printing structure. * * Prints a control's SaHpiCtrlRecT data to a file. * The MACRO oh_print_ctrlrec(), uses this function to print to STDOUT. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT oh_fprint_ctrlrec(FILE *stream, const SaHpiCtrlRecT *control, int offsets) { SaErrorT err; oh_big_textbuffer buffer; if (!stream || !control) { return(SA_ERR_HPI_INVALID_PARAMS); } oh_init_bigtext(&buffer); err = oh_build_ctrlrec(&buffer, control, offsets); if (err) { return(err); } err = oh_fprint_bigtext(stream, &buffer); if (err) { return(err); } return(SA_OK); } /** * oh_fprint_watchdogrec: * @stream: File handle. * @watchdog: Pointer to SaHpiWatchdogRecT to be printed. * @offsets: Number of offsets to start printing structure. * * Prints a watchdog's SaHpiWatchdogRecT data to a file. * The MACRO oh_print_watchdogrec(), uses this function to print to STDOUT. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT oh_fprint_watchdogrec(FILE *stream, const SaHpiWatchdogRecT *watchdog, int offsets) { SaErrorT err; oh_big_textbuffer buffer; if (!stream || !watchdog) { return(SA_ERR_HPI_INVALID_PARAMS); } oh_init_bigtext(&buffer); err = oh_build_wdogrec(&buffer, watchdog, offsets); if (err) { return(err); } err = oh_fprint_bigtext(stream, &buffer); if (err) { return(err); } return(SA_OK); } /** * oh_fprint_sensorrec: * @stream: File handle. * @sensor: Pointer to SaHpiSensorRecT to be printed. * @offsets: Number of offsets to start printing structure. * * Prints a sensor's SaHpiSensorRecT data to a file. * The MACRO oh_print_sensorrec(), uses this function to print to STDOUT. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT oh_fprint_sensorrec(FILE *stream, const SaHpiSensorRecT *sensor, int offsets) { SaErrorT err; oh_big_textbuffer buffer; if (!stream || !sensor) { return(SA_ERR_HPI_INVALID_PARAMS); } oh_init_bigtext(&buffer); err = oh_build_sensorrec(&buffer, sensor, offsets); if (err) { return(err); } err = oh_fprint_bigtext(stream, &buffer); if (err) { return(err); } return(SA_OK); } static SaErrorT oh_build_resourceinfo(oh_big_textbuffer *buffer, const SaHpiResourceInfoT *ResourceInfo, int offsets) { char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; int found; oh_big_textbuffer working; SaHpiTextBufferT tmpbuffer; SaErrorT err; if (!buffer || !ResourceInfo) { return(SA_ERR_HPI_INVALID_PARAMS); } oh_append_offset(buffer, offsets); oh_append_bigtext(buffer, "Resource Information: "); /* Initial temp buffer - assumming we find something to print */ err = oh_init_bigtext(&working); if (err) { return(err); } err = oh_append_bigtext(&working, "\n"); if (err) { return(err); } offsets++; found = 0; if (ResourceInfo->ResourceRev) { oh_append_offset(&working, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Resource Revision: %d\n", ResourceInfo->ResourceRev); oh_append_bigtext(&working, str); found++; } if (ResourceInfo->SpecificVer) { oh_append_offset(&working, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Specific Version: %d\n", ResourceInfo->SpecificVer); oh_append_bigtext(&working, str); found++; } if (ResourceInfo->DeviceSupport) { oh_append_offset(&working, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Device Support: %x\n", ResourceInfo->DeviceSupport); oh_append_bigtext(&working, str); found++; } if (ResourceInfo->ManufacturerId) { oh_append_offset(&working, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Manufacturer ID: "); oh_append_bigtext(&working, str); oh_decode_manufacturerid(ResourceInfo->ManufacturerId, &tmpbuffer); oh_append_bigtext(&working, (char *)tmpbuffer.Data); oh_append_bigtext(&working, "\n"); found++; } if (ResourceInfo->ProductId) { oh_append_offset(&working, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Product ID: %d\n", ResourceInfo->ProductId); oh_append_bigtext(&working, str); found++; } if (ResourceInfo->FirmwareMajorRev || ResourceInfo->FirmwareMinorRev) { oh_append_offset(&working, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Firmware Major Revision: %d\n", ResourceInfo->FirmwareMajorRev); oh_append_bigtext(&working, str); found++; oh_append_offset(&working, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Firmware Minor Revision: %d\n", ResourceInfo->FirmwareMinorRev); oh_append_bigtext(&working, str); found++; } if (ResourceInfo->AuxFirmwareRev) { oh_append_offset(&working, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Aux Firmware Revision: %d\n", ResourceInfo->AuxFirmwareRev); oh_append_bigtext(&working, str); found++; } { SaHpiGuidT empty_guid; memset(empty_guid, 0, sizeof(SaHpiGuidT)); if (memcmp(empty_guid, ResourceInfo->Guid, sizeof(SaHpiGuidT))) { oh_append_offset(&working, offsets); oh_append_bigtext(&working, "GUID: "); oh_decode_guid( &ResourceInfo->Guid, &working); oh_append_char_bigtext(&working, '\n'); found++; } } if (!found) { oh_init_bigtext(&working); oh_append_bigtext(&working, "None\n"); } oh_append_bigtext(buffer, (char *)working.Data); return(SA_OK); } static SaErrorT oh_build_sensorrec(oh_big_textbuffer *buffer, const SaHpiSensorRecT *sensor, int offsets) { char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; SaErrorT err; SaHpiTextBufferT tmpbuffer; /* Sensor Num */ oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Sensor Num: %d (%x hex)\n", sensor->Num, sensor->Num); oh_append_bigtext(buffer, str); offsets++; /* Sensor Type */ oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Type: %s\n", oh_lookup_sensortype(sensor->Type)); oh_append_bigtext(buffer, str); /* Sensor Category */ oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Category: %s\n", oh_lookup_eventcategory(sensor->Category)); oh_append_bigtext(buffer, str); /* Sensor Enable Control */ oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "EnableCtrl: %s\n", (sensor->EnableCtrl == SAHPI_TRUE) ? "TRUE" : "FALSE"); oh_append_bigtext(buffer, str); /* Sensor Event Control */ oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "EventCtrl: %s\n", oh_lookup_sensoreventctrl(sensor->EventCtrl)); oh_append_bigtext(buffer, str); /* Sensor Supported Events */ oh_append_offset(buffer, offsets); oh_append_bigtext(buffer, "Events: "); err = oh_decode_eventstate(sensor->Events, sensor->Category, &tmpbuffer); if (err) {oh_append_bigtext(buffer, "\n"); return(err); } oh_append_bigtext(buffer, (char *)tmpbuffer.Data); oh_append_bigtext(buffer, "\n"); /* Sensor Data Format */ err = oh_build_sensordataformat(buffer, &(sensor->DataFormat), offsets); if (err) { return(err); } /* Sensor Threshold Definition */ err = oh_build_sensorthddefn(buffer, &(sensor->ThresholdDefn), offsets); if (err) { return(err); } /* Sensor OEM Data */ oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "OEM: %x\n", sensor->Oem); oh_append_bigtext(buffer, str); /* printf("SENSOR LENGTH = %d\n", strlen(buffer->Data)); */ return(SA_OK); } static SaErrorT oh_build_sensordataformat(oh_big_textbuffer *buffer, const SaHpiSensorDataFormatT *format, int offsets) { char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; SaErrorT err; SaHpiTextBufferT reading_buffer; /* Sensor Data Format Title */ oh_append_offset(buffer, offsets); oh_append_bigtext(buffer, "Data Format:\n"); offsets++; /* Sensor Data Format IsSupported */ oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "IsSupported: %s\n", (format->IsSupported == SAHPI_TRUE) ? "TRUE" : "FALSE"); oh_append_bigtext(buffer, str); if (format->IsSupported) { /* Sensor Data Format Reading Type */ oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Reading Type: %s\n", oh_lookup_sensorreadingtype(format->ReadingType)); oh_append_bigtext(buffer, str); if (format->ReadingType != SAHPI_SENSOR_READING_TYPE_BUFFER) { /* Sensor Data Format Base Units */ oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Base Unit: %s\n", oh_lookup_sensorunits(format->BaseUnits)); oh_append_bigtext(buffer, str); /* Sensor Data Format Modifier Units */ if (format->ModifierUnits) { oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Modifier Unit: %s\n", oh_lookup_sensorunits(format->ModifierUnits)); oh_append_bigtext(buffer, str); /* Sensor Data Format Modifier Use */ oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Modifier Use: %s\n", oh_lookup_sensormodunituse(format->ModifierUse)); oh_append_bigtext(buffer, str); } /* Sensor Data Format Percentage */ oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Percentage: %s\n", (format->Percentage == SAHPI_TRUE) ? "TRUE" : "FALSE"); oh_append_bigtext(buffer, str); /* Sensor Data Format Max Range */ if (format->Range.Flags & SAHPI_SRF_MAX && format->Range.Max.IsSupported) { oh_append_offset(buffer, offsets); oh_append_bigtext(buffer, "Range Max: "); err = oh_decode_sensorreading(format->Range.Max, *format, &reading_buffer); if (err) { return(err); } oh_append_bigtext(buffer, (char *)reading_buffer.Data); oh_append_bigtext(buffer, "\n"); } /* Sensor Data Format Min Range */ if (format->Range.Flags & SAHPI_SRF_MIN && format->Range.Min.IsSupported) { oh_append_offset(buffer, offsets); oh_append_bigtext(buffer, "Range Min: "); err = oh_decode_sensorreading(format->Range.Min, *format, &reading_buffer); if (err) { return(err); } oh_append_bigtext(buffer, (char *)reading_buffer.Data); oh_append_bigtext(buffer, "\n"); } /* Sensor Data Format Nominal Range */ if (format->Range.Flags & SAHPI_SRF_NOMINAL && format->Range.Nominal.IsSupported) { oh_append_offset(buffer, offsets); oh_append_bigtext(buffer, "Range Nominal: "); err = oh_decode_sensorreading(format->Range.Nominal, *format, &reading_buffer); if (err) { return(err); } oh_append_bigtext(buffer, (char *)reading_buffer.Data); oh_append_bigtext(buffer, "\n"); } /* Sensor Data Format Normal Max Range */ if (format->Range.Flags & SAHPI_SRF_NORMAL_MAX && format->Range.NormalMax.IsSupported) { oh_append_offset(buffer, offsets); oh_append_bigtext(buffer, "Range Normal Max: "); err = oh_decode_sensorreading(format->Range.NormalMax, *format, &reading_buffer); if (err) { return(err); } oh_append_bigtext(buffer, (char *)reading_buffer.Data); oh_append_bigtext(buffer, "\n"); } /* Sensor Data Format Normal Min Range */ if (format->Range.Flags & SAHPI_SRF_NORMAL_MIN && format->Range.NormalMin.IsSupported) { oh_append_offset(buffer, offsets); oh_append_bigtext(buffer, "Range Normal Min: "); err = oh_decode_sensorreading(format->Range.NormalMin, *format, &reading_buffer); if (err) { return(err); } oh_append_bigtext(buffer, (char *)reading_buffer.Data); oh_append_bigtext(buffer, "\n"); } /* Sensor Data Format Accuracy Factor */ oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Accuracy: %lf\n", format->AccuracyFactor); oh_append_bigtext(buffer, str); } } return(SA_OK); } static SaErrorT oh_build_sensorthddefn(oh_big_textbuffer *buffer, const SaHpiSensorThdDefnT *tdef, int offsets) { char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; SaErrorT err; /* Sensor Threshold Definition Title */ oh_append_offset(buffer, offsets); oh_append_bigtext(buffer, "Threshold Definitions:\n"); offsets++; /* Sensor Threshold Definition IsAccessible */ oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "IsAccessible: %s\n", (tdef->IsAccessible == SAHPI_TRUE) ? "TRUE" : "FALSE"); oh_append_bigtext(buffer, str); if (tdef->IsAccessible) { /* Sensor Threshold Read Threshold */ if (tdef->ReadThold) { oh_append_offset(buffer, offsets); oh_append_bigtext(buffer, "Readable Thresholds:\n"); err = oh_build_threshold_mask(buffer, tdef->ReadThold, offsets + 1); if (err) { return(err); } } /* Sensor Threshold Write Threshold */ if (tdef->WriteThold) { oh_append_offset(buffer, offsets); oh_append_bigtext(buffer, "Writeable Thresholds:\n"); err = oh_build_threshold_mask(buffer, tdef->WriteThold, offsets + 1); if (err) { return(err); } } /* Sensor Threshold Nonlinear */ oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Nonlinear: %s\n", (tdef->Nonlinear == SAHPI_TRUE) ? "TRUE" : "FALSE"); oh_append_bigtext(buffer, str); } return(SA_OK); } SaErrorT oh_build_threshold_mask(oh_big_textbuffer *buffer, const SaHpiSensorThdMaskT tmask, int offsets) { oh_append_offset(buffer, offsets); if (tmask == 0) { oh_append_bigtext(buffer, "None"); oh_append_bigtext(buffer, "\n"); return SA_OK; } if (tmask & SAHPI_STM_LOW_MINOR) { oh_append_bigtext(buffer, "LOW_MINOR"); oh_append_bigtext(buffer, OH_ENCODE_DELIMITER); } if (tmask & SAHPI_STM_LOW_MAJOR) { oh_append_bigtext(buffer, "LOW_MAJOR"); oh_append_bigtext(buffer, OH_ENCODE_DELIMITER); } if (tmask & SAHPI_STM_LOW_CRIT) { oh_append_bigtext(buffer, "LOW_CRIT"); oh_append_bigtext(buffer, OH_ENCODE_DELIMITER); } if (tmask & SAHPI_STM_LOW_HYSTERESIS) { oh_append_bigtext(buffer, "LOW_HYSTERESIS"); oh_append_bigtext(buffer, OH_ENCODE_DELIMITER); } if (tmask & SAHPI_STM_UP_MINOR) { oh_append_bigtext(buffer, "UP_MINOR"); oh_append_bigtext(buffer, OH_ENCODE_DELIMITER); } if (tmask & SAHPI_STM_UP_MAJOR) { oh_append_bigtext(buffer, "UP_MAJOR"); oh_append_bigtext(buffer, OH_ENCODE_DELIMITER); } if (tmask & SAHPI_STM_UP_CRIT) { oh_append_bigtext(buffer, "UP_CRIT"); oh_append_bigtext(buffer, OH_ENCODE_DELIMITER); } if (tmask & SAHPI_STM_UP_HYSTERESIS) { oh_append_bigtext(buffer, "UP_HYSTERESIS"); oh_append_bigtext(buffer, OH_ENCODE_DELIMITER); } /* Remove last delimiter; add NL */ buffer->Data[buffer->DataLength-OH_ENCODE_DELIMITER_LENGTH] = '\0'; buffer->DataLength = buffer->DataLength - OH_ENCODE_DELIMITER_LENGTH; oh_append_bigtext(buffer, "\n"); return(SA_OK); } /** * oh_fprint_idrfield: * @stream: File handle. * @thisfield: Pointer to SaHpiIdrFieldT to be printed. * @offsets: Number of offsets to start printing structure. * * Prints the member data contained in SaHpiIdrFieldT struct to a file. * The MACRO oh_print_idrfield(), uses this function to print to STDOUT. * * Returns: * SA_OK - Normal operation. **/ SaErrorT oh_fprint_idrfield(FILE *stream, const SaHpiIdrFieldT *thisfield, int offsets) { char str[SAHPI_MAX_TEXT_BUFFER_LENGTH+1]; oh_big_textbuffer mybuf; SaErrorT err; if (!stream || !thisfield) return(SA_ERR_HPI_INVALID_PARAMS); oh_init_bigtext(&mybuf); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Field Id: %d\n", thisfield->FieldId); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Field Type: %s\n", oh_lookup_idrfieldtype(thisfield->Type)); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "ReadOnly: %s\n", (thisfield->ReadOnly == SAHPI_TRUE) ? "TRUE" : "FALSE"); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Data Type: %s\n", oh_lookup_texttype(thisfield->Field.DataType)); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Language: %s\n", oh_lookup_language(thisfield->Field.Language)); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); oh_append_bigtext(&mybuf, "Content: "); if (thisfield->Field.DataLength == 0) oh_append_bigtext(&mybuf, "NULL\n"); else { if (thisfield->Field.DataType == SAHPI_TL_TYPE_BINARY) oh_append_data(&mybuf, thisfield->Field.Data, thisfield->Field.DataLength); else { memcpy( str, thisfield->Field.Data, thisfield->Field.DataLength ); str[thisfield->Field.DataLength] = '\0'; oh_append_bigtext(&mybuf, str); } } err = oh_fprint_bigtext(stream, &mybuf); return(err); } /** * oh_fprint_idrareaheader: * @stream: File handle. * @areaheader: Pointer to SaHpiIdrAreaHeaderT to be printed. * @offsets: Number of offsets to start printing structure. * * Prints the member data contained in SaHpiIdrAreaHeaderT struct to a file. * The MACRO oh_print_idrareaheader(), uses this function to print to STDOUT. * * Returns: * SA_OK - Normal operation. **/ SaErrorT oh_fprint_idrareaheader(FILE *stream, const SaHpiIdrAreaHeaderT *areaheader, int offsets) { char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; oh_big_textbuffer mybuf; SaErrorT err; if (!stream || !areaheader) return(SA_ERR_HPI_INVALID_PARAMS); oh_init_bigtext(&mybuf); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "AreaId: %d\n", areaheader->AreaId); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "AreaType: %s\n", oh_lookup_idrareatype(areaheader->Type)); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "ReadOnly: %s\n", (areaheader->ReadOnly == SAHPI_TRUE) ? "TRUE" : "FALSE" ); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "NumFields: %d\n", areaheader->NumFields); oh_append_bigtext(&mybuf, str); err = oh_fprint_bigtext(stream, &mybuf); return(err); } /** * oh_fprint_idrinfo: * @stream: File handle. * @idrinfo: Pointer to SaHpiIdrInfoT to be printed. * @offsets: Number of offsets to start printing structure. * * Prints the member data contained in SaHpiIdrInfoT struct to a file. * The MACRO oh_print_idrinfo(), uses this function to print to STDOUT. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT oh_fprint_idrinfo(FILE *stream, const SaHpiIdrInfoT *idrinfo, int offsets) { SaErrorT err; char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; oh_big_textbuffer mybuf; if (!stream || !idrinfo) { return(SA_ERR_HPI_INVALID_PARAMS); } oh_init_bigtext(&mybuf); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "IdrId: %d\n", idrinfo->IdrId); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "UpdateCount: %d\n", idrinfo->UpdateCount); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "ReadOnly: %s\n", (idrinfo->ReadOnly == SAHPI_TRUE) ? "TRUE" : "FALSE" ); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "NumAreas: %d\n", idrinfo->NumAreas); oh_append_bigtext(&mybuf, str); err = oh_fprint_bigtext(stream, &mybuf); return(err); } SaErrorT oh_fprint_textbuffer(FILE *stream, const SaHpiTextBufferT *textbuffer, int offsets) { SaErrorT err; oh_big_textbuffer buffer; if (!stream || !textbuffer) { return(SA_ERR_HPI_INVALID_PARAMS); } oh_init_bigtext(&buffer); err = oh_build_textbuffer(&buffer, textbuffer, offsets); if (err) { return(err); } err = oh_fprint_bigtext(stream, &buffer); return(err); } static SaErrorT oh_build_textbuffer(oh_big_textbuffer *buffer, const SaHpiTextBufferT *textbuffer, int offsets) { char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; SaHpiTextBufferT working_textbuffer; memset(&working_textbuffer, 0, sizeof(working_textbuffer)); oh_copy_textbuffer(&working_textbuffer, textbuffer); /* Text Buffer Data Type */ oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Data Type: %s\n", oh_lookup_texttype(textbuffer->DataType)); oh_append_bigtext(buffer, str); /* Text Buffer Language */ oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Language: %s\n", oh_lookup_language(textbuffer->Language)); oh_append_bigtext(buffer, str); /* Text Buffer Data Length */ oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Data Length: %d\n", textbuffer->DataLength); oh_append_bigtext(buffer, str); /* Text Buffer Data */ if (textbuffer->DataLength) { oh_append_offset(buffer, offsets); memset(str, 0, SAHPI_MAX_TEXT_BUFFER_LENGTH); oh_append_bigtext(buffer, "Data: "); if (textbuffer->DataType == SAHPI_TL_TYPE_BINARY) oh_append_data(buffer, textbuffer->Data, textbuffer->DataLength); else { working_textbuffer.Data[working_textbuffer.DataLength] = '\0'; oh_append_bigtext(buffer, (const char *)&working_textbuffer.Data); } oh_append_bigtext(buffer, "\n"); } return(SA_OK); } /** * oh_decode_capabilities: * @ResourceCapabilities: enum value of type SaHpiCapabilitiesT. * @buffer: Location to store the string. * * Converts @ResourceCapabilities type into a string based on * @ResourceCapabilities HPI definition. For example: * @ResourceCapabilities = SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_EVENT_LOG * returns a string "RESOURCE | EVENT_LOG". * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - @buffer is NULL **/ SaErrorT oh_decode_capabilities(SaHpiCapabilitiesT ResourceCapabilities, SaHpiTextBufferT *buffer) { int found; SaErrorT err; SaHpiTextBufferT working; if (!buffer) { return(SA_ERR_HPI_INVALID_PARAMS); } err = oh_init_textbuffer(&working); if (err) { return(err); } found = 0; if (ResourceCapabilities & SAHPI_CAPABILITY_AGGREGATE_STATUS) { found++; err = oh_append_textbuffer(&working, "AGGREGATE_STATUS | "); if (err) { return(err); } } if (ResourceCapabilities & SAHPI_CAPABILITY_ANNUNCIATOR) { found++; err = oh_append_textbuffer(&working, "ANNUNCIATOR | "); if (err) { return(err); } } if (ResourceCapabilities & SAHPI_CAPABILITY_CONFIGURATION) { found++; err = oh_append_textbuffer(&working, "CONFIGURATION | "); if (err) { return(err); } } if (ResourceCapabilities & SAHPI_CAPABILITY_CONTROL) { found++; err = oh_append_textbuffer(&working, "CONTROL | "); if (err) { return(err); } } if (ResourceCapabilities & SAHPI_CAPABILITY_DIMI) { found++; err = oh_append_textbuffer(&working, "DIMI | "); if (err) { return(err); } } if (ResourceCapabilities & SAHPI_CAPABILITY_EVENT_LOG) { found++; err = oh_append_textbuffer(&working, "EVENT_LOG | "); if (err) { return(err); } } if (ResourceCapabilities & SAHPI_CAPABILITY_EVT_DEASSERTS) { found++; err = oh_append_textbuffer(&working, "EVT_DEASSERTS | "); if (err) { return(err); } } if (ResourceCapabilities & SAHPI_CAPABILITY_FRU) { found++; err = oh_append_textbuffer(&working, "FRU | "); if (err) { return(err); } } if (ResourceCapabilities & SAHPI_CAPABILITY_FUMI) { found++; err = oh_append_textbuffer(&working, "FUMI | "); if (err) { return(err); } } if (ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA) { found++; err = oh_append_textbuffer(&working, "INVENTORY_DATA | "); if (err) { return(err); } } if (ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP) { found++; err = oh_append_textbuffer(&working, "MANAGED_HOTSWAP | "); if (err) { return(err); } } if (ResourceCapabilities & SAHPI_CAPABILITY_POWER) { found++; err = oh_append_textbuffer(&working, "POWER | "); if (err) { return(err); } } if (ResourceCapabilities & SAHPI_CAPABILITY_RDR) { found++; err = oh_append_textbuffer(&working, "RDR | "); if (err) { return(err); } } if (ResourceCapabilities & SAHPI_CAPABILITY_RESET) { found++; err = oh_append_textbuffer(&working, "RESET | "); if (err) { return(err); } } if (ResourceCapabilities & SAHPI_CAPABILITY_RESOURCE) { found++; err = oh_append_textbuffer(&working, "RESOURCE | "); if (err) { return(err); } } if (ResourceCapabilities & SAHPI_CAPABILITY_SENSOR) { found++; err = oh_append_textbuffer(&working, "SENSOR | "); if (err) { return(err); } } if (ResourceCapabilities & SAHPI_CAPABILITY_WATCHDOG) { found++; err = oh_append_textbuffer(&working, "WATCHDOG | "); if (err) { return(err); } } if (found) { working.DataLength -= OH_ENCODE_DELIMITER_LENGTH; working.Data[working.DataLength] = 0; } oh_copy_textbuffer(buffer, &working); return(SA_OK); } /** * oh_decode_hscapabilities: * @HsCapabilities: enum value of type SaHpiHsCapabilitiesT. * @buffer: Location to store the string. * * Converts @HsCapabilities type into a string based on HPI definition. For example: * @HsCapabilities = SAHPI_HS_CAPABILITY_AUTOEXTRACT_READ_ONLY | SAHPI_HS_CAPABILITY_INDICATOR_SUPPORTED * returns a string "AUTOEXTRACT_READ_ONLY | INDICATOR_SUPPORTED". * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - @buffer is NULL **/ SaErrorT oh_decode_hscapabilities(SaHpiHsCapabilitiesT HsCapabilities, SaHpiTextBufferT *buffer) { int found; SaErrorT err; SaHpiTextBufferT working; if (!buffer) { return(SA_ERR_HPI_INVALID_PARAMS); } err = oh_init_textbuffer(&working); if (err) { return(err); } found = 0; if (HsCapabilities & SAHPI_HS_CAPABILITY_AUTOEXTRACT_READ_ONLY) { found++; err = oh_append_textbuffer(&working, "AUTOEXTRACT_READ_ONLY | "); if (err) { return(err); } } if (HsCapabilities & SAHPI_HS_CAPABILITY_INDICATOR_SUPPORTED) { found++; err = oh_append_textbuffer(&working, "INDICATOR_SUPPORTED | "); if (err) { return(err); } } if (HsCapabilities & SAHPI_HS_CAPABILITY_AUTOINSERT_IMMEDIATE) { found++; err = oh_append_textbuffer(&working, "AUTOINSERT_IMMEDIATE | "); if (err) { return(err); } } if (found) { working.DataLength -= OH_ENCODE_DELIMITER_LENGTH; working.Data[working.DataLength] = 0; } else { oh_append_textbuffer(&working, "None"); } oh_copy_textbuffer(buffer, &working); return(SA_OK); } /** * oh_fprint_rptentry: * @stream: File handle. * @rptentry: Pointer to SaHpiRptEntryT to be printed. * @offsets: Number of offsets to start printing structure. * * Prints the member data contained in SaHpiRptEntryT struct to a file. * The MACRO oh_print_rptentry(), uses this function to print to STDOUT. * * Returns: * SA_OK - Normal operation. **/ SaErrorT oh_fprint_rptentry(FILE *stream, const SaHpiRptEntryT *rptentry, int offsets) { SaErrorT err = SA_OK; oh_big_textbuffer mybuf; SaHpiTextBufferT tmpbuffer; char* str = (char *)tmpbuffer.Data; if (!stream || !rptentry) { return(SA_ERR_HPI_INVALID_PARAMS); } oh_init_bigtext(&mybuf); offsets++; oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "EntryId: %d\n", rptentry->EntryId); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "ResourceId: %d\n", rptentry->ResourceId); oh_append_bigtext(&mybuf, str); err = oh_build_resourceinfo(&mybuf, &(rptentry->ResourceInfo), offsets); if (err) { return(err); } oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Entity Path: "); oh_append_bigtext(&mybuf, str); { oh_big_textbuffer tmpbuf; oh_init_bigtext(&tmpbuf); oh_decode_entitypath(&rptentry->ResourceEntity, &tmpbuf); oh_append_bigtext(&mybuf, (char *)tmpbuf.Data); } oh_append_bigtext(&mybuf, "\n"); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Capabilities: \n"); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets + 1); oh_decode_capabilities(rptentry->ResourceCapabilities, &tmpbuffer); oh_append_bigtext(&mybuf, (char *)tmpbuffer.Data); oh_append_bigtext(&mybuf, "\n"); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "HotSwap Capabilities: "); oh_append_bigtext(&mybuf, str); oh_decode_hscapabilities(rptentry->HotSwapCapabilities, &tmpbuffer); oh_append_bigtext(&mybuf, (char *)tmpbuffer.Data); oh_append_bigtext(&mybuf, "\n"); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Resource Severity: %s\n", oh_lookup_severity(rptentry->ResourceSeverity)); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "ResourceFailed: %s\n", (rptentry->ResourceFailed == SAHPI_TRUE) ? "TRUE" : "FALSE" ); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "ResourceTag:\n"); oh_append_bigtext(&mybuf, str); oh_build_textbuffer(&mybuf, &(rptentry->ResourceTag), offsets + 1); err = oh_fprint_bigtext(stream, &mybuf); return(err); } /** * oh_fprint_rdr: * @stream: File handle. * @thisrdr: Pointer to SaHpiRdrT to be printed. * @offsets: Number of offsets to start printing structure. * * Prints the member data contained in SaHpiRdrT struct to a file. * The MACRO oh_print_rdr(), uses this function to print to STDOUT. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT oh_fprint_rdr(FILE *stream, const SaHpiRdrT *thisrdr, int offsets) { SaErrorT err; char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; oh_big_textbuffer mybuf, mybuf1; if (!stream || !thisrdr) { return(SA_ERR_HPI_INVALID_PARAMS); } oh_init_bigtext(&mybuf); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "RecordId: %d\n", thisrdr->RecordId); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "RdrType: %s\n", oh_lookup_rdrtype(thisrdr->RdrType)); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Entity Path: "); oh_append_bigtext(&mybuf, str); { oh_big_textbuffer tmpbuf; oh_init_bigtext(&tmpbuf); oh_decode_entitypath(&thisrdr->Entity, &tmpbuf); oh_append_bigtext(&mybuf, (char *)tmpbuf.Data); } oh_append_bigtext(&mybuf, "\n"); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "IsFru: %s\n", (thisrdr->IsFru == SAHPI_TRUE) ? "TRUE" : "FALSE" ); oh_append_bigtext(&mybuf, str); oh_init_bigtext(&mybuf1); switch(thisrdr->RdrType) { case SAHPI_CTRL_RDR: err = oh_build_ctrlrec(&mybuf1, (const SaHpiCtrlRecT*) &thisrdr->RdrTypeUnion.CtrlRec, offsets); break; case SAHPI_SENSOR_RDR: err = oh_build_sensorrec(&mybuf1, (const SaHpiSensorRecT*) &thisrdr->RdrTypeUnion.SensorRec, offsets); break; case SAHPI_INVENTORY_RDR: err = oh_build_invrec(&mybuf1, (const SaHpiInventoryRecT*) &thisrdr->RdrTypeUnion.InventoryRec, offsets); break; case SAHPI_WATCHDOG_RDR: err = oh_build_wdogrec(&mybuf1, (const SaHpiWatchdogRecT*) &thisrdr->RdrTypeUnion.WatchdogRec, offsets); break; case SAHPI_ANNUNCIATOR_RDR: err = oh_build_annrec(&mybuf1, (const SaHpiAnnunciatorRecT*) &thisrdr->RdrTypeUnion.AnnunciatorRec, offsets); break; case SAHPI_DIMI_RDR: err = oh_build_dimirec(&mybuf1, (const SaHpiDimiRecT*) &thisrdr->RdrTypeUnion.DimiRec, offsets); break; case SAHPI_FUMI_RDR: err = oh_build_fumirec(&mybuf1, (const SaHpiFumiRecT*) &thisrdr->RdrTypeUnion.FumiRec, offsets); break; case SAHPI_NO_RECORD: oh_append_offset(&mybuf1, offsets); oh_append_bigtext(&mybuf1, oh_lookup_rdrtype(thisrdr->RdrType)); break; default: oh_append_bigtext(&mybuf1, "Invalid/Unknown RDR Type\n"); } oh_append_bigtext(&mybuf, (char *)mybuf1.Data); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "IdString:\n"); oh_append_bigtext(&mybuf, str); oh_build_textbuffer(&mybuf, &(thisrdr->IdString), offsets + 1); err = oh_fprint_bigtext(stream, &mybuf); return(err); } /** * oh_build_ctrlrec: * @textbuff: Buffer into which to store flattened ctrl rec structure. * @thisrdrunion: Pointer to SaHpiRdrTypeUnionT to be flattened. * @offsets: Number of offsets to start printing structure. * * Flatten member data contained in SaHpiCtrlRecT struct to a text buffer. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ static SaErrorT oh_build_ctrlrec(oh_big_textbuffer *textbuf, const SaHpiCtrlRecT *ctrlrec, int offsets) { SaErrorT err; char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; oh_big_textbuffer mybuf; SaHpiTextBufferT smallbuf; if (!textbuf || !ctrlrec) { return(SA_ERR_HPI_INVALID_PARAMS); } oh_init_bigtext(&mybuf); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Control Num: %d (%x hex)\n", ctrlrec->Num, ctrlrec->Num); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Control Output Type: %s\n", oh_lookup_ctrloutputtype(ctrlrec->OutputType)); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Control Type: %s\n", oh_lookup_ctrltype(ctrlrec->Type)); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); switch(ctrlrec->Type) { case SAHPI_CTRL_TYPE_DIGITAL: snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Digital Default: %s\n", oh_lookup_ctrlstatedigital(ctrlrec->TypeUnion.Digital.Default)); oh_append_bigtext(&mybuf, str); break; case SAHPI_CTRL_TYPE_DISCRETE: snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Discrete Default: %d\n", ctrlrec->TypeUnion.Discrete.Default); oh_append_bigtext(&mybuf, str); break; case SAHPI_CTRL_TYPE_ANALOG: snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Analog Min: %d\n", ctrlrec->TypeUnion.Analog.Min); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Analog Max: %d\n", ctrlrec->TypeUnion.Analog.Max); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Analog Default: %d\n", ctrlrec->TypeUnion.Analog.Default); oh_append_bigtext(&mybuf, str); break; case SAHPI_CTRL_TYPE_STREAM: snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Stream Default:\n"); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets + 1); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Repeat: %s\n", (ctrlrec->TypeUnion.Stream.Default.Repeat == SAHPI_TRUE) ? "TRUE" : "FALSE"); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets + 1); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "StreamLength: %d\n", ctrlrec->TypeUnion.Stream.Default.StreamLength); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets + 1); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Stream Default: %s\n", ctrlrec->TypeUnion.Stream.Default.Stream); oh_append_bigtext(&mybuf, str); break; case SAHPI_CTRL_TYPE_TEXT: snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Max Chars: %d\n", ctrlrec->TypeUnion.Text.MaxChars); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Max Lines: %d\n", ctrlrec->TypeUnion.Text.MaxLines); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Language: %s\n", oh_lookup_language(ctrlrec->TypeUnion.Text.Language)); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Data Type: %s\n", oh_lookup_texttype(ctrlrec->TypeUnion.Text.DataType)); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Default:\n"); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets + 1); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Line: %d\n", ctrlrec->TypeUnion.Text.Default.Line); oh_append_bigtext(&mybuf, str); oh_build_textbuffer(&mybuf, &(ctrlrec->TypeUnion.Text.Default.Text), offsets + 1); break; case SAHPI_CTRL_TYPE_OEM: err = oh_decode_manufacturerid(ctrlrec->TypeUnion.Oem.MId, &smallbuf); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "ManufacturerId: %s\n", smallbuf.Data); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "ConfigData: %s\n", ctrlrec->TypeUnion.Oem.ConfigData); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Default:\n"); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets + 1); err = oh_decode_manufacturerid(ctrlrec->TypeUnion.Oem.Default.MId, &smallbuf); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "ManufacturerId: %s\n", smallbuf.Data); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets + 1); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "BodyLength: %d\n", ctrlrec->TypeUnion.Oem.Default.BodyLength); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets + 1); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Body: %s\n", ctrlrec->TypeUnion.Oem.Default.Body); oh_append_bigtext(&mybuf, str); break; default: snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Invalid ControlType Detected\n"); oh_append_bigtext(&mybuf, str); } oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "DefaultMode:\n"); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets + 1); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Mode: %s\n", oh_lookup_ctrlmode(ctrlrec->DefaultMode.Mode)); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets + 1); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "ReadOnly: %s\n", (ctrlrec->DefaultMode.ReadOnly == SAHPI_TRUE) ? "TRUE" : "FALSE"); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "WriteOnly: %s\n", (ctrlrec->WriteOnly == SAHPI_TRUE) ? "TRUE" : "FALSE"); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "OEM: %d\n", ctrlrec->Oem); oh_append_bigtext(&mybuf, str); err = oh_copy_bigtext(textbuf, &mybuf); return(err); } /** * oh_build_invrec: * @textbuff: Buffer into which to store flattened ctrl rdr structure. * @invrec: Pointer to SaHpiInventoryRecT to be flattened. * @offsets: Number of offsets to start printing structure. * * Flatten member data contained in SaHpiInventoryRecT struct to a text buffer. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ static SaErrorT oh_build_invrec(oh_big_textbuffer *textbuff,const SaHpiInventoryRecT *invrec, int offsets) { SaErrorT err; char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; oh_big_textbuffer mybuf; if (!textbuff || !invrec) { return(SA_ERR_HPI_INVALID_PARAMS); } oh_init_bigtext(&mybuf); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "IdrId: %d\n",invrec->IdrId); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Persistent: %s\n", (invrec->Persistent == SAHPI_TRUE) ? "TRUE" : "FALSE" ); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Oem: %d\n",invrec->Oem); oh_append_bigtext(&mybuf, str); err = oh_copy_bigtext(textbuff, &mybuf); return(err); } /** * oh_build_wdogrec: * @textbuff: Buffer into which to store flattened watchdog rec structure. * @wdogrec: Pointer to SaHpiWatchdogRecT to be flattened. * @offsets: Number of offsets to start printing structure. * * Flatten member data contained in SaHpiWatchdogRecT struct to a text buffer. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ static SaErrorT oh_build_wdogrec(oh_big_textbuffer *textbuff,const SaHpiWatchdogRecT *wdogrec, int offsets) { SaErrorT err; char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; oh_big_textbuffer mybuf; if (!textbuff || !wdogrec) { return(SA_ERR_HPI_INVALID_PARAMS); } oh_init_bigtext(&mybuf); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Watchdog Num: %d (%x hex)\n", wdogrec->WatchdogNum, wdogrec->WatchdogNum); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Oem: %d\n",wdogrec->Oem); oh_append_bigtext(&mybuf, str); err = oh_copy_bigtext(textbuff, &mybuf); return(err); } /** * oh_build_annrec: * @textbuff: Buffer into which to store flattened structure. * @annrec: Pointer to SaHpiAnnunciatorRecT to be flattened. * @offsets: Number of offsets to start printing structure. * * Flatten member data contained in SaHpiAnnunciatorRecT struct to a text buffer. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ static SaErrorT oh_build_annrec(oh_big_textbuffer *textbuff,const SaHpiAnnunciatorRecT *annrec, int offsets) { SaErrorT err; char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; oh_big_textbuffer mybuf; if (!textbuff || !annrec) { return(SA_ERR_HPI_INVALID_PARAMS); } oh_init_bigtext(&mybuf); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Annunciator Num: %d (%x hex)\n", annrec->AnnunciatorNum, annrec->AnnunciatorNum); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Annunciator Type: %s\n", oh_lookup_annunciatortype(annrec->AnnunciatorType)); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "ModeReadOnly: %s\n", (annrec->ModeReadOnly == SAHPI_TRUE) ? "TRUE" : "FALSE" ); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "MaxCondition: %d\n", annrec->MaxConditions); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Oem: %d\n", annrec->Oem); oh_append_bigtext(&mybuf, str); err = oh_copy_bigtext(textbuff, &mybuf); return(err); } /** * oh_build_dimirec: * @textbuff: Buffer into which to store flattened structure. * @annrec: Pointer to SaHpiDimiRecT to be flattened. * @offsets: Number of offsets to start printing structure. * * Flatten member data contained in SaHpiDimiRecT struct to a text buffer. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ static SaErrorT oh_build_dimirec(oh_big_textbuffer *textbuff, const SaHpiDimiRecT *dimirec, int offsets) { SaErrorT err; char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; oh_big_textbuffer mybuf; if (!textbuff || !dimirec) { DBG("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } oh_init_bigtext(&mybuf); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "DIMI Num: %d (%x hex)\n", dimirec->DimiNum, dimirec->DimiNum); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Oem: %d\n", dimirec->Oem); oh_append_bigtext(&mybuf, str); err = oh_copy_bigtext(textbuff, &mybuf); return(err); } /** * oh_decode_dimitestcapabilities: * @DimiTestCapabilities: enum value of type SaHpiDimiTestCapabilityT. * @buffer: Location to store the string. * * Converts @DimiTestCapabilities type into a string based on HPI definition. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - @buffer is NULL **/ SaErrorT oh_decode_dimitestcapabilities(SaHpiDimiTestCapabilityT capabilities, SaHpiTextBufferT *buffer) { int found; SaErrorT err; SaHpiTextBufferT working; if (!buffer) { DBG("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } err = oh_init_textbuffer(&working); if (err) { return(err); } found = 0; if (capabilities & SAHPI_DIMITEST_CAPABILITY_RESULTSOUTPUT) { found++; err = oh_append_textbuffer(&working, "RESULTS_OUTPUT | "); if (err) { return(err); } } if (capabilities & SAHPI_DIMITEST_CAPABILITY_SERVICEMODE) { found++; err = oh_append_textbuffer(&working, "SERVICE_MODE | "); if (err) { return(err); } } if (capabilities & SAHPI_DIMITEST_CAPABILITY_LOOPCOUNT) { found++; err = oh_append_textbuffer(&working, "LOOP_COUNT | "); if (err) { return(err); } } if (capabilities & SAHPI_DIMITEST_CAPABILITY_LOOPTIME) { found++; err = oh_append_textbuffer(&working, "LOOP_TIME | "); if (err) { return(err); } } if (capabilities & SAHPI_DIMITEST_CAPABILITY_LOGGING) { found++; err = oh_append_textbuffer(&working, "LOGGING | "); if (err) { return(err); } } if (capabilities & SAHPI_DIMITEST_CAPABILITY_TESTCANCEL) { found++; err = oh_append_textbuffer(&working, "TEST_CANCEL | "); if (err) { return(err); } } if (found) { working.DataLength -= OH_ENCODE_DELIMITER_LENGTH; working.Data[working.DataLength] = 0; } else { oh_append_textbuffer(&working, "None"); } oh_copy_textbuffer(buffer, &working); return(SA_OK); } /** * oh_decode_fumiprotocols: * @FumiProtocol: enum value of type SaHpiFumiProtocolT. * @buffer: Location to store the string. * * Converts @FumiProtocol type into a string based on HPI definition. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - @buffer is NULL **/ SaErrorT oh_decode_fumiprotocols(SaHpiFumiProtocolT protocols, SaHpiTextBufferT *buffer) { int found; SaErrorT err; SaHpiTextBufferT working; if (!buffer) { DBG("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } err = oh_init_textbuffer(&working); if (err) { return(err); } found = 0; if (protocols & SAHPI_FUMI_PROT_TFTP) { found++; err = oh_append_textbuffer(&working, "TFTP | "); if (err) { return(err); } } if (protocols & SAHPI_FUMI_PROT_FTP) { found++; err = oh_append_textbuffer(&working, "FTP | "); if (err) { return(err); } } if (protocols & SAHPI_FUMI_PROT_HTTP) { found++; err = oh_append_textbuffer(&working, "HTTP | "); if (err) { return(err); } } if (protocols & SAHPI_FUMI_PROT_LDAP) { found++; err = oh_append_textbuffer(&working, "LDAP | "); if (err) { return(err); } } if (protocols & SAHPI_FUMI_PROT_LOCAL) { found++; err = oh_append_textbuffer(&working, "LOCAL | "); if (err) { return(err); } } if (protocols & SAHPI_FUMI_PROT_NFS) { found++; err = oh_append_textbuffer(&working, "NFS | "); if (err) { return(err); } } if (protocols & SAHPI_FUMI_PROT_DBACCESS) { found++; err = oh_append_textbuffer(&working, "DBACCESS | "); if (err) { return(err); } } if (found) { working.DataLength -= OH_ENCODE_DELIMITER_LENGTH; working.Data[working.DataLength] = 0; } else { oh_append_textbuffer(&working, "None"); } oh_copy_textbuffer(buffer, &working); return(SA_OK); } /** * oh_decode_fumicapabilities: * @HsCapabilities: enum value of type SaHpiFumiCapabilityT. * @buffer: Location to store the string. * * Converts @FumiCapability type into a string based on HPI definition. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - @buffer is NULL **/ SaErrorT oh_decode_fumicapabilities(SaHpiFumiCapabilityT capabilities, SaHpiTextBufferT *buffer) { int found; SaErrorT err; SaHpiTextBufferT working; if (!buffer) { DBG("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } err = oh_init_textbuffer(&working); if (err) { return(err); } found = 0; if (capabilities & SAHPI_FUMI_CAP_ROLLBACK) { found++; err = oh_append_textbuffer(&working, "ROLLBACK | "); if (err) { return(err); } } if (capabilities & SAHPI_FUMI_CAP_BANKCOPY) { found++; err = oh_append_textbuffer(&working, "BANKCOPY | "); if (err) { return(err); } } if (capabilities & SAHPI_FUMI_CAP_BANKREORDER) { found++; err = oh_append_textbuffer(&working, "BANKREORDER | "); if (err) { return(err); } } if (capabilities & SAHPI_FUMI_CAP_BACKUP) { found++; err = oh_append_textbuffer(&working, "BACKUP | "); if (err) { return(err); } } if (capabilities & SAHPI_FUMI_CAP_TARGET_VERIFY) { found++; err = oh_append_textbuffer(&working, "TARGET_VERIFY | "); if (err) { return(err); } } if (found) { working.DataLength -= OH_ENCODE_DELIMITER_LENGTH; working.Data[working.DataLength] = 0; } else { oh_append_textbuffer(&working, "None"); } oh_copy_textbuffer(buffer, &working); return(SA_OK); } /** * oh_decode_guid: * @guid: pointer to GUID data of type SaHpiGuidT. * @buffer: Location to store the string. * * Converts @guid type into a string based. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - @buffer is NULL **/ SaErrorT oh_decode_guid(const SaHpiGuidT *guid, oh_big_textbuffer *buffer) { unsigned int i; if (!buffer) { DBG("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } for (i = 0; i < 16; ++i) { if ((i == 4) || (i == 6) || (i == 8) || (i == 10)) { oh_append_char_bigtext(buffer, '-'); } oh_append_hex_bigtext(buffer, (*guid)[i]); } return(SA_OK); } //========================== /** * oh_build_fumirec: * @textbuff: Buffer into which to store flattened structure. * @annrec: Pointer to SaHpiFumiRecT to be flattened. * @offsets: Number of offsets to start printing structure. * * Flatten member data contained in SaHpiFumiRecT struct to a text buffer. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ static SaErrorT oh_build_fumirec(oh_big_textbuffer *textbuff, const SaHpiFumiRecT *fumirec, int offsets) { SaErrorT err; char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; oh_big_textbuffer mybuf; SaHpiTextBufferT tmpbuffer; if (!textbuff || !fumirec) { DBG("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } oh_init_bigtext(&mybuf); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "FUMI Num: %d (%x hex)\n", fumirec->Num, fumirec->Num); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Supported protocols: "); oh_append_bigtext(&mybuf, str); oh_decode_fumiprotocols(fumirec->AccessProt, &tmpbuffer); oh_append_bigtext(&mybuf, (char *)tmpbuffer.Data); oh_append_bigtext(&mybuf, "\n"); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Optional capabilities: "); oh_append_bigtext(&mybuf, str); oh_decode_fumicapabilities(fumirec->Capability, &tmpbuffer); oh_append_bigtext(&mybuf, (char *)tmpbuffer.Data); oh_append_bigtext(&mybuf, "\n"); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Number of banks: %d\n", fumirec->NumBanks); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Oem: %d\n", fumirec->Oem); oh_append_bigtext(&mybuf, str); err = oh_copy_bigtext(textbuff, &mybuf); return(err); } /** * oh_fprint_eventloginfo: * @stream: File handle. * @thiselinfo: Pointer to SaHpiEventLogInfoT to be printed. * @offsets: Number of offsets to start printing structure. * * Prints the member data contained in SaHpiEventLogInfoT struct to a file. * The MACRO oh_print_evenloginfo(), uses this function to print to STDOUT. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT oh_fprint_eventloginfo(FILE *stream, const SaHpiEventLogInfoT *thiselinfo, int offsets) { SaErrorT err; oh_big_textbuffer mybuf; char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; SaHpiTextBufferT minibuf; if (!stream || !thiselinfo) { return(SA_ERR_HPI_INVALID_PARAMS); } oh_init_bigtext(&mybuf); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Entries: %d\n", thiselinfo->Entries); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Size: %d\n", thiselinfo->Size); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "UserEventMaxSize: %d\n", thiselinfo->UserEventMaxSize); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); err = oh_decode_time(thiselinfo->UpdateTimestamp, &minibuf); if (err) memcpy(minibuf.Data, "SAHPI_TIME_UNSPECIFIED", sizeof("SAHPI_TIME_UNSPECIFIED")); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "UpdateTimestamp: %s\n", minibuf.Data); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); err = oh_decode_time(thiselinfo->CurrentTime, &minibuf); if (err) memcpy(minibuf.Data, "SAHPI_TIME_UNSPECIFIED", sizeof("SAHPI_TIME_UNSPECIFIED")); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "CurrentTime: %s\n", minibuf.Data); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Enabled: %s\n", (thiselinfo->Enabled == SAHPI_TRUE) ? "TRUE" : "FALSE" ); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "OverflowFlag: %s\n", (thiselinfo->OverflowFlag == SAHPI_TRUE) ? "TRUE" : "FALSE" ); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "OverflowResetable: %s\n", (thiselinfo->OverflowResetable == SAHPI_TRUE) ? "TRUE" : "FALSE" ); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "OverflowAction: %s\n", oh_lookup_eventlogoverflowaction(thiselinfo->OverflowAction)); oh_append_bigtext(&mybuf, str); err = oh_fprint_bigtext(stream, &mybuf); return(err); } /** * oh_fprint_eventlogentry: * @stream: File handle. * @thiseventlog: Pointer to SaHpiEventLogEntryT to be printed. * @entitypath: Pointer to entity path. * @offsets: Number of offsets to start printing structure. * * Prints the member data contained in SaHpiEventLogEntryT struct to a file. * The MACRO oh_print_evenlogentry(), uses this function to print to STDOUT. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT oh_fprint_eventlogentry(FILE *stream, const SaHpiEventLogEntryT *thiseventlog, const SaHpiEntityPathT *entitypath, int offsets) { SaErrorT err; oh_big_textbuffer mybuf, mybufX; char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; SaHpiTextBufferT minibuf; if (!stream || !thiseventlog) { return(SA_ERR_HPI_INVALID_PARAMS); } oh_init_bigtext(&mybuf); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "EntryId: %d\n", thiseventlog->EntryId); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); err = oh_decode_time(thiseventlog->Timestamp, &minibuf); if (err) memcpy(minibuf.Data, "SAHPI_TIME_UNSPECIFIED", sizeof("SAHPI_TIME_UNSPECIFIED")); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Timestamp: %s\n", minibuf.Data); oh_append_bigtext(&mybuf, str); oh_init_bigtext(&mybufX); err = oh_build_event(&mybufX, &thiseventlog->Event, entitypath, offsets); oh_append_bigtext(&mybuf, (char *)mybufX.Data); err = oh_fprint_bigtext(stream, &mybuf); return(err); } /** * oh_fprint_event: * @stream: File handle. * @event: Pointer to SaHpiEventT to be printed. * @entitypath: Pointer to entitypath. * @offsets: Number of offsets to start printing structure. * * Prints the member data contained in SaHpiEventT struct to a file. * The MACRO oh_print_event(), uses this function to print to STDOUT. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT oh_fprint_event(FILE *stream, const SaHpiEventT *event, const SaHpiEntityPathT *entitypath, int offsets) { SaErrorT err; oh_big_textbuffer buffer; if (!stream || !event) { return(SA_ERR_HPI_INVALID_PARAMS); } oh_init_bigtext(&buffer); err = oh_build_event(&buffer, event, entitypath, offsets); if (err) { return(err); } err = oh_fprint_bigtext(stream, &buffer); if (err) { return(err); } return(SA_OK); } /** * oh_build_event: * @buffer: Pointer to space to decipher SaHpiEventT struct * @event: Pointer to the event to be deciphered * @offset: Number of offsets to start printing structure. * * Builds SaHpiEventT data into a string buffer. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT oh_build_event(oh_big_textbuffer *buffer, const SaHpiEventT *event, const SaHpiEntityPathT *entitypath, int offsets) { char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; guint id; SaErrorT err = SA_OK; SaHpiEntityPathT ep; SaHpiTextBufferT tmpbuffer; oh_big_textbuffer bigbuf; memset( buffer->Data, 0, OH_MAX_TEXT_BUFFER_LENGTH ); memset( tmpbuffer.Data, 0, sizeof( tmpbuffer.Data ) ); id = event->Source; if (entitypath) { ep = *entitypath; err = oh_decode_entitypath(&ep, &bigbuf); } else { err = oh_entity_path_lookup(id, &ep); if (err) { CRIT("Could not determine entity path."); } else { /* Only if we were able to get the entity path */ err = oh_decode_entitypath(&ep, &bigbuf); } } /* Event Type */ oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Event Type: %s\n", oh_lookup_eventtype(event->EventType)); oh_append_bigtext(buffer, str); /* Entity Path */ if (err == SA_OK) { /* Skip this if we failed to get/decode entity path earlier */ oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "From Resource: %s\n", bigbuf.Data); oh_append_bigtext(buffer, str); } offsets++; /* Event Source */ oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Event Resource ID: %d\n", event->Source); oh_append_bigtext(buffer, str); /* Event Time */ oh_append_offset(buffer, offsets); oh_decode_time(event->Timestamp, &tmpbuffer); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Event Timestamp: %s\n", tmpbuffer.Data); oh_append_bigtext(buffer, str); /* Event Severity */ oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Event Severity: %s\n", oh_lookup_severity(event->Severity)); oh_append_bigtext(buffer, str); switch (event->EventType) { case SAHPI_ET_RESOURCE: err = oh_build_event_resource(buffer, event, offsets); break; case SAHPI_ET_DOMAIN: err = oh_build_event_domain(buffer, event, offsets); break; case SAHPI_ET_SENSOR: err = oh_build_event_sensor(buffer, event, offsets); break; case SAHPI_ET_SENSOR_ENABLE_CHANGE: err = oh_build_event_sensor_enable_change(buffer, event, offsets); break; case SAHPI_ET_HOTSWAP: err = oh_build_event_hotswap(buffer, event, offsets); break; case SAHPI_ET_WATCHDOG: err = oh_build_event_watchdog(buffer, event, offsets); break; case SAHPI_ET_HPI_SW: err = oh_build_event_hpi_sw(buffer, event, offsets); break; case SAHPI_ET_OEM: err = oh_build_event_oem(buffer, event, offsets); break; case SAHPI_ET_USER: err = oh_build_event_user(buffer, event, offsets); break; case SAHPI_ET_DIMI: err = oh_build_event_dimi(buffer, event, offsets); break; case SAHPI_ET_DIMI_UPDATE: err = oh_build_event_dimi_update(buffer, event, offsets); break; case SAHPI_ET_FUMI: err = oh_build_event_fumi(buffer, event, offsets); break; default: CRIT("Unrecognized Event Type=%d.", event->EventType); return(SA_ERR_HPI_INVALID_PARAMS); } if (err) { return(err); } return(SA_OK); } /** * oh_build_event_resource: * @buffer: Pointer to space to decipher SaHpiEventT struct * @event: Pointer to the event to be deciphered * @offset: Number of offsets to start printing structure. * * Builds ResourceEventTypeT data into string buffer. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ static SaErrorT oh_build_event_resource(oh_big_textbuffer *buffer, const SaHpiEventT *event, int offsets) { char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; if (!buffer || !event) { return(SA_ERR_HPI_INVALID_PARAMS); } oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "ResourceEventType: %s\n", oh_lookup_resourceeventtype(event->EventDataUnion.ResourceEvent.ResourceEventType)); oh_append_bigtext(buffer, str); return(SA_OK); } /** * oh_build_event_domain: * @buffer: Pointer to space to decipher SaHpiEventT struct * @event: Pointer to the event to be deciphered * @offset: Number of offsets to start printing structure. * * Build event domain value structure values into string buffer. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ static SaErrorT oh_build_event_domain(oh_big_textbuffer *buffer, const SaHpiEventT *event, int offsets) { char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; if (!buffer || !event) { return(SA_ERR_HPI_INVALID_PARAMS); } oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "DomainEvent:\n"); oh_append_bigtext(buffer, str); oh_append_offset(buffer, offsets + 1); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Type: %s\n", oh_lookup_domaineventtype(event->EventDataUnion.DomainEvent.Type)); oh_append_bigtext(buffer, str); oh_append_offset(buffer, offsets + 1); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "DomainId: %d\n", event->EventDataUnion.DomainEvent.DomainId); oh_append_bigtext(buffer, str); return(SA_OK); } #define OH_MAX_SENSOROPTIONALDATA 6 typedef struct { SaHpiSensorOptionalDataT datadef; char *str; } oh_sensor_opt_data_map; oh_sensor_opt_data_map sensor_event_optdata_strings[] = { {SAHPI_SOD_TRIGGER_READING, "TRIGGER_READING"}, {SAHPI_SOD_TRIGGER_THRESHOLD, "TRIGGER_THRESHOLD"}, {SAHPI_SOD_OEM, "OEM"}, {SAHPI_SOD_PREVIOUS_STATE, "PREVIOUS_STATE"}, {SAHPI_SOD_CURRENT_STATE, "CURRENT_STATE"}, {SAHPI_SOD_SENSOR_SPECIFIC, "SENSOR_SPECIFIC"}, }; /** * oh_encode_sensoroptionaldata: * @buffer: Pointer to space to decipher SaHpiSensorOptionalDataT struct * @sensor_opt_data: Sensor's optional data bit mask. * * Converts a sensor's optional data bit mask field into a string. For example, * if the optional data bit mask is SAHPI_SOD_TRIGGER_READING | SAHPI_SOD_CURRENT_STATE, * this routine returns the string "TRIGGER_READING | CURRENT_STATE" in a * SaHpiTextBufferT structure. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT oh_decode_sensoroptionaldata(SaHpiSensorOptionalDataT sensor_opt_data, SaHpiTextBufferT *buffer) { int i, found; SaErrorT err; SaHpiTextBufferT working; if (!buffer) { return(SA_ERR_HPI_INVALID_PARAMS); } err = oh_init_textbuffer(&working); if (err) { return(err); } found = 0; /* Look for sensor optional data definitions */ for (i=0; iEventDataUnion.SensorEvent.SensorNum, event->EventDataUnion.SensorEvent.SensorNum); oh_append_bigtext(buffer, str); /* Event Sensor Type */ oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Event Sensor Type: %s\n", oh_lookup_sensortype(event->EventDataUnion.SensorEvent.SensorType)); oh_append_bigtext(buffer, str); /* Event Sensor Category */ oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Event Sensor Category: %s\n", oh_lookup_eventcategory(event->EventDataUnion.SensorEvent.EventCategory)); oh_append_bigtext(buffer, str); /* Event Sensor Assertion */ oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Event Sensor Assertion: %s\n", (event->EventDataUnion.SensorEvent.Assertion == SAHPI_TRUE) ? "TRUE" : "FALSE"); oh_append_bigtext(buffer, str); /* Event Sensor State */ oh_append_offset(buffer, offsets); oh_append_bigtext(buffer, "Event Sensor State: "); err = oh_decode_eventstate(event->EventDataUnion.SensorEvent.EventState, event->EventDataUnion.SensorEvent.EventCategory, &tmpbuffer); if (err) { return(err); } oh_append_bigtext(buffer, (char *)tmpbuffer.Data); oh_append_bigtext(buffer, "\n"); /* Sensor Event - Sensor Optional Data */ oh_append_offset(buffer, offsets); oh_append_bigtext(buffer, "Optional Data: "); err = oh_decode_sensoroptionaldata(event->EventDataUnion.SensorEvent.OptionalDataPresent, &tmpbuffer); if (err) { return(err); } oh_append_bigtext(buffer, (char *)tmpbuffer.Data); oh_append_bigtext(buffer, "\n"); /* Sensor Event - Sensor Optional Trigger Reading Data */ if (event->EventDataUnion.SensorEvent.OptionalDataPresent & SAHPI_SOD_TRIGGER_READING) { SaHpiSensorDataFormatT format; memset(&format, 0, sizeof(SaHpiSensorDataFormatT)); oh_append_offset(buffer, offsets + 1); oh_append_bigtext(buffer, "Trigger Reading: "); format.IsSupported = SAHPI_TRUE; format.ReadingType = event->EventDataUnion.SensorEvent.TriggerReading.Type; format.BaseUnits = SAHPI_SU_UNSPECIFIED; err = oh_decode_sensorreading(event->EventDataUnion.SensorEvent.TriggerReading, format, &tmpbuffer); if (err) { return(err); } oh_append_bigtext(buffer, (char *)tmpbuffer.Data); oh_append_bigtext(buffer, "\n"); } /* Sensor Event - Sensor Optional Trigger Threshold Data */ if (event->EventDataUnion.SensorEvent.OptionalDataPresent & SAHPI_SOD_TRIGGER_THRESHOLD) { SaHpiSensorDataFormatT format; memset(&format, 0, sizeof(SaHpiSensorDataFormatT)); oh_append_offset(buffer, offsets + 1); oh_append_bigtext(buffer, "Trigger Threshold: "); format.IsSupported = SAHPI_TRUE; format.ReadingType = event->EventDataUnion.SensorEvent.TriggerThreshold.Type; format.BaseUnits = SAHPI_SU_UNSPECIFIED; err = oh_decode_sensorreading(event->EventDataUnion.SensorEvent.TriggerThreshold, format, &tmpbuffer); if (err) { return(err); } oh_append_bigtext(buffer, (char *)tmpbuffer.Data); oh_append_bigtext(buffer, "\n"); } /* Sensor Event - Sensor Optional Previous State Data */ if (event->EventDataUnion.SensorEvent.OptionalDataPresent & SAHPI_SOD_PREVIOUS_STATE) { oh_append_offset(buffer, offsets + 1); oh_append_bigtext(buffer, "Previous Sensor State: "); err = oh_decode_eventstate(event->EventDataUnion.SensorEvent.PreviousState, event->EventDataUnion.SensorEvent.EventCategory, &tmpbuffer); if (err) { return(err); } oh_append_bigtext(buffer, (char *)tmpbuffer.Data); oh_append_bigtext(buffer, "\n"); } /* Sensor Event - Sensor Optional Current State Data */ if (event->EventDataUnion.SensorEvent.OptionalDataPresent & SAHPI_SOD_CURRENT_STATE) { oh_append_offset(buffer, offsets + 1); oh_append_bigtext(buffer, "Current Sensor State: "); err = oh_decode_eventstate(event->EventDataUnion.SensorEvent.CurrentState, event->EventDataUnion.SensorEvent.EventCategory, &tmpbuffer); if (err) { return(err); } oh_append_bigtext(buffer, (char *)tmpbuffer.Data); oh_append_bigtext(buffer, "\n"); } /* Sensor Event - Sensor Optional OEM Data */ if (event->EventDataUnion.SensorEvent.OptionalDataPresent & SAHPI_SOD_OEM) { oh_append_offset(buffer, offsets + 1); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "OEM: %x\n", event->EventDataUnion.SensorEvent.Oem); oh_append_bigtext(buffer, str); } /* Sensor Event - Sensor Optional Sensor Specific Data */ if (event->EventDataUnion.SensorEvent.OptionalDataPresent & SAHPI_SOD_SENSOR_SPECIFIC) { oh_append_offset(buffer, offsets + 1); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Sensor Specific: %x\n", event->EventDataUnion.SensorEvent.SensorSpecific ); oh_append_bigtext(buffer, str); } return(SA_OK); } /** * oh_build_event_sensor_enable_change: * @buffer: Pointer to space to decipher SaHpiEventT struct * @event: Pointer to the event to be deciphered * @offset: Number of offsets to start printing structure. * * Build SaHpiSensorEnableChangeEventT data into a string buffer. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ static SaErrorT oh_build_event_sensor_enable_change(oh_big_textbuffer *buffer, const SaHpiEventT *event, int offsets) { char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; SaErrorT err; SaHpiTextBufferT tmpbuffer; if ( !buffer || !event) { return(SA_ERR_HPI_INVALID_PARAMS); } oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "SensorEnableChangeEvent: \n"); oh_append_bigtext(buffer, str); /* Sensor Enable Change Event - Sensor Number */ oh_append_offset(buffer, offsets + 1); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Sensor Num: %d (%x hex)\n", event->EventDataUnion.SensorEnableChangeEvent.SensorNum, event->EventDataUnion.SensorEnableChangeEvent.SensorNum); oh_append_bigtext(buffer, str); /* Sensor Enable Change Event - Sensor Type */ oh_append_offset(buffer, offsets + 1); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Sensor Type: %s\n", oh_lookup_sensortype(event->EventDataUnion.SensorEnableChangeEvent.SensorType)); oh_append_bigtext(buffer, str); /* Sensor Enable Change Event - Sensor Category */ oh_append_offset(buffer, offsets + 1); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "EventCategory: %s\n", oh_lookup_eventcategory(event->EventDataUnion.SensorEnableChangeEvent.EventCategory)); oh_append_bigtext(buffer, str); /* Sensor Enable Change Event - Sensor Enabled */ oh_append_offset(buffer, offsets + 1); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "SensorEnable: %s\n", (event->EventDataUnion.SensorEnableChangeEvent.SensorEnable == SAHPI_TRUE) ? "TRUE" : "FALSE"); oh_append_bigtext(buffer, str); /* Sensor Enable Change Event - Sensor Events Enabled */ oh_append_offset(buffer, offsets + 1); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "SensorEventEnable: %s\n", (event->EventDataUnion.SensorEnableChangeEvent.SensorEventEnable == SAHPI_TRUE) ? "TRUE" : "FALSE"); oh_append_bigtext(buffer, str); /* Sensor Enable Change Event - Event Assert Mask */ oh_append_offset(buffer, offsets + 1); oh_append_bigtext(buffer, "AssertEventMask: "); err = oh_decode_eventstate(event->EventDataUnion.SensorEnableChangeEvent.AssertEventMask, event->EventDataUnion.SensorEnableChangeEvent.EventCategory, &tmpbuffer); if (err) { return(err); } oh_append_bigtext(buffer, (char *)tmpbuffer.Data); oh_append_bigtext(buffer, "\n"); /* Sensor Enable Change Event - Event Deassert Mask */ oh_append_offset(buffer, offsets + 1); oh_append_bigtext(buffer, "DeassertEventMask: "); err = oh_decode_eventstate(event->EventDataUnion.SensorEnableChangeEvent.DeassertEventMask, event->EventDataUnion.SensorEnableChangeEvent.EventCategory, &tmpbuffer); if (err) { return(err); } oh_append_bigtext(buffer, (char *)tmpbuffer.Data); oh_append_bigtext(buffer, "\n"); /* Sensor Enable Change Event - Optional Data */ oh_append_offset(buffer, offsets + 1); oh_append_bigtext(buffer, "Optional Data: "); err = oh_decode_sensorenableoptdata(event->EventDataUnion.SensorEnableChangeEvent.OptionalDataPresent, &tmpbuffer); if (err) { return(err); } oh_append_bigtext(buffer, (char *)tmpbuffer.Data); oh_append_bigtext(buffer, "\n"); /* Sensor Enable Change Event - Optional Data - Current State */ if (event->EventDataUnion.SensorEnableChangeEvent.OptionalDataPresent & SAHPI_SEOD_CURRENT_STATE) { oh_append_offset(buffer, offsets + 2); oh_append_bigtext(buffer, "Current State: "); err = oh_decode_eventstate(event->EventDataUnion.SensorEnableChangeEvent.CurrentState, event->EventDataUnion.SensorEnableChangeEvent.EventCategory, &tmpbuffer); if (err) { return(err); } oh_append_bigtext(buffer, (char *)tmpbuffer.Data); oh_append_bigtext(buffer, "\n"); } return(SA_OK); } /** * oh_build_event_hotswap: * @buffer: Pointer to space to decipher SaHpiEventT struct * @event: Pointer to the event to be deciphered * @offset: Number of offsets to start printing structure. * * Builds SaHpiHotSwapEventT data into a string buffer. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ static SaErrorT oh_build_event_hotswap(oh_big_textbuffer *buffer, const SaHpiEventT *event, int offsets) { char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; if ( !buffer || !event) { return(SA_ERR_HPI_INVALID_PARAMS); } oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "HotswapEvent: \n"); oh_append_bigtext(buffer, str); oh_append_offset(buffer, offsets + 1); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "HotSwapState: %s\n", oh_lookup_hsstate(event->EventDataUnion.HotSwapEvent.HotSwapState)); oh_append_bigtext(buffer, str); oh_append_offset(buffer, offsets + 1); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "PreviousHotSwapState: %s\n", oh_lookup_hsstate(event->EventDataUnion.HotSwapEvent.PreviousHotSwapState)); oh_append_bigtext(buffer, str); oh_append_offset(buffer, offsets + 1); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "CauseOfStateChange: %s\n", oh_lookup_hscauseofstatechange(event->EventDataUnion.HotSwapEvent.CauseOfStateChange)); oh_append_bigtext(buffer, str); return(SA_OK); } /** * oh_build_event_watchdog: * @buffer: Pointer to space to decipher SaHpiEventT struct * @event: Pointer to the event to be deciphered * @offset: Number of offsets to start printing structure. * * Builds SaHpiWatchdogEventT data into a string buffer. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ static SaErrorT oh_build_event_watchdog(oh_big_textbuffer *buffer, const SaHpiEventT *event, int offsets) { char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; int i; SaHpiBoolT matchFound = SAHPI_FALSE; if ( !buffer || !event) { return(SA_ERR_HPI_INVALID_PARAMS); } oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Watchdog Event: \n"); oh_append_bigtext(buffer, str); oh_append_offset(buffer, offsets + 1); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Watchdog Num: %d (%x hex)\n", event->EventDataUnion.WatchdogEvent.WatchdogNum, event->EventDataUnion.WatchdogEvent.WatchdogNum); oh_append_bigtext(buffer, str); oh_append_offset(buffer, offsets + 1); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "WatchdogActionEvent: %s\n", oh_lookup_watchdogactionevent(event->EventDataUnion.WatchdogEvent.WatchdogAction)); oh_append_bigtext(buffer, str); oh_append_offset(buffer, offsets + 1); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "WatchdogPreTimerAction: %s\n", oh_lookup_watchdogpretimerinterrupt(event->EventDataUnion.WatchdogEvent.WatchdogPreTimerAction)); oh_append_bigtext(buffer, str); oh_append_offset(buffer, offsets + 1); for (i = 0; i < OH_MAX_WATCHDOGTIMERUSE; i++) { if (event->EventDataUnion.WatchdogEvent.WatchdogUse == watchdogtimeruse_strings[i].entity_type) { matchFound = SAHPI_TRUE; snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "WatchdogUse: %s\n", watchdogtimeruse_strings[i].str); break; } } if (!matchFound) snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "WatchdogUse: %s\n", "Invalid data"); oh_append_bigtext(buffer, str); return(SA_OK); } /** * oh_build_event_hpi_sw: * @buffer: Pointer to space to decipher SaHpiEventT struct * @event: Pointer to the event to be deciphered * @offset: Number of offsets to start printing structure. * * Builds SaHpiHpiSwEventT data into a string buffer. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ static SaErrorT oh_build_event_hpi_sw(oh_big_textbuffer *buffer, const SaHpiEventT *event, int offsets) { char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; SaHpiTextBufferT tmpbuffer; if ( !buffer || !event) { return(SA_ERR_HPI_INVALID_PARAMS); } oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "HpiSwEvent: \n"); oh_append_bigtext(buffer, str); offsets++; oh_append_offset(buffer, offsets); oh_decode_manufacturerid(event->EventDataUnion.HpiSwEvent.MId, &tmpbuffer); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "ManufacturerId: %s\n", tmpbuffer.Data); oh_append_bigtext(buffer, str); oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "EventData: \n"); oh_append_bigtext(buffer, str); offsets++; oh_build_textbuffer(buffer, &event->EventDataUnion.HpiSwEvent.EventData, offsets); return(SA_OK); } /** * oh_build_event_oem: * @buffer: Pointer to space to decipher SaHpiEventT struct * @event: Pointer to the event to be deciphered * @offset: Number of offsets to start printing structure. * * Builds SaHpiOemEventT data into a string buffer. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ static SaErrorT oh_build_event_oem(oh_big_textbuffer *buffer, const SaHpiEventT *event, int offsets) { char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; SaHpiTextBufferT tmpbuffer; if ( !buffer || !event) { return(SA_ERR_HPI_INVALID_PARAMS); } oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "OemEvent:\n"); oh_append_bigtext(buffer, str); offsets++; oh_append_offset(buffer, offsets); oh_decode_manufacturerid(event->EventDataUnion.OemEvent.MId, &tmpbuffer); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "ManufacturerId: %s\n", tmpbuffer.Data); oh_append_bigtext(buffer, str); oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "OemEventData:\n"); oh_append_bigtext(buffer, str); offsets++; oh_build_textbuffer(buffer, &event->EventDataUnion.OemEvent.OemEventData, offsets); return(SA_OK); } /** * oh_build_event_user: * @buffer: Pointer to space to decipher SaHpiEventT struct * @event: Pointer to the event to be deciphered * @offset: Number of offsets to start printing structure. * * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ static SaErrorT oh_build_event_user(oh_big_textbuffer *buffer, const SaHpiEventT *event, int offsets) { char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; if ( !buffer || !event) { return(SA_ERR_HPI_INVALID_PARAMS); } /* * oh_append_offset(buffer, offsets); * snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "UserEvent:\n"); * oh_append_bigtext(buffer, str); * offsets++ */ oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "UserEventData:\n"); oh_append_bigtext(buffer, str); offsets++; oh_build_textbuffer(buffer, &event->EventDataUnion.UserEvent.UserEventData, offsets); return(SA_OK); } /** * oh_build_event_dimi: * @buffer: Pointer to space to decipher SaHpiEventT struct * @event: Pointer to the event to be deciphered * @offset: Number of offsets to start printing structure. * * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ static SaErrorT oh_build_event_dimi(oh_big_textbuffer *buffer, const SaHpiEventT *event, int offsets) { char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; const SaHpiDimiEventT* de; if ( !buffer || !event) { DBG("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } de = &(event->EventDataUnion.DimiEvent); oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "DimiEventData:\n"); oh_append_bigtext(buffer, str); offsets++; oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "DimiNum: %d\n", de->DimiNum); oh_append_bigtext(buffer, str); oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "TestNum: %d\n", de->TestNum); oh_append_bigtext(buffer, str); oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "TestRunStatus: %s\n", oh_lookup_dimitestrunstatus(de->DimiTestRunStatus)); oh_append_bigtext(buffer, str); if ( de->DimiTestPercentCompleted != 0xff ) { oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Percent completed: %d\n", de->DimiTestPercentCompleted); oh_append_bigtext(buffer, str); } return(SA_OK); } /** * oh_build_event_dimi_update: * @buffer: Pointer to space to decipher SaHpiEventT struct * @event: Pointer to the event to be deciphered * @offset: Number of offsets to start printing structure. * * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ static SaErrorT oh_build_event_dimi_update(oh_big_textbuffer *buffer, const SaHpiEventT *event, int offsets) { char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; const SaHpiDimiUpdateEventT* de; if ( !buffer || !event) { DBG("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } de = &(event->EventDataUnion.DimiUpdateEvent); oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "DimiUpdateEventData:\n"); oh_append_bigtext(buffer, str); offsets++; oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "DimiNum: %d\n", de->DimiNum); oh_append_bigtext(buffer, str); return(SA_OK); } /** * oh_build_event_fumi: * @buffer: Pointer to space to decipher SaHpiEventT struct * @event: Pointer to the event to be deciphered * @offset: Number of offsets to start printing structure. * * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ static SaErrorT oh_build_event_fumi(oh_big_textbuffer *buffer, const SaHpiEventT *event, int offsets) { char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; const SaHpiFumiEventT* fe; if ( !buffer || !event) { DBG("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } fe = &(event->EventDataUnion.FumiEvent); oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "FumiEventData:\n"); oh_append_bigtext(buffer, str); offsets++; oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "FumiNum: %d\n", fe->FumiNum); oh_append_bigtext(buffer, str); oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "BankNum: %d\n", fe->BankNum); oh_append_bigtext(buffer, str); oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "UpgradeStatus: %s\n", oh_lookup_fumiupgradestatus(fe->UpgradeStatus)); oh_append_bigtext(buffer, str); return(SA_OK); } /** * oh_fprint_ctrlstate: * @stream: File handle. * @event: Pointer to SaHpitrlStateT to be printed. * @offsets: Number of offsets to start printing structure. * * Prints the member data contained in SaHpiCtrlStateT struct to a file. * The MACRO oh_print_ctrlstate(), uses this function to print to STDOUT. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT oh_fprint_ctrlstate(FILE *stream, const SaHpiCtrlStateT *thisctrlstate, int offsets) { SaErrorT rv = SA_OK; oh_big_textbuffer buffer; SaHpiTextBufferT smallbuf; char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; if (!stream || !thisctrlstate) { return(SA_ERR_HPI_INVALID_PARAMS); } oh_init_bigtext(&buffer); oh_append_offset(&buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Type: %s\n", oh_lookup_ctrltype(thisctrlstate->Type)); oh_append_bigtext(&buffer, str); oh_append_offset(&buffer, offsets); switch(thisctrlstate->Type) { case SAHPI_CTRL_TYPE_DIGITAL: snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "State: %s\n", oh_lookup_ctrlstatedigital(thisctrlstate->StateUnion.Digital)); break; case SAHPI_CTRL_TYPE_DISCRETE: snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "State: %d\n", thisctrlstate->StateUnion.Discrete); break; case SAHPI_CTRL_TYPE_ANALOG: snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Analog: %d\n", thisctrlstate->StateUnion.Analog); break; case SAHPI_CTRL_TYPE_STREAM: snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Stream:\n"); oh_append_bigtext(&buffer, str); oh_append_offset(&buffer, offsets + 1); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Repeat: %s\n", (thisctrlstate->StateUnion.Stream.Repeat == SAHPI_TRUE) ? "TRUE" : "FALSE"); oh_append_bigtext(&buffer, str); oh_append_offset(&buffer, offsets + 1); snprintf(str, thisctrlstate->StateUnion.Stream.StreamLength, "%s\n", thisctrlstate->StateUnion.Stream.Stream); break; case SAHPI_CTRL_TYPE_TEXT: snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Line: %d\n", thisctrlstate->StateUnion.Text.Line); oh_append_bigtext(&buffer, str); oh_append_offset(&buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "%s\n", thisctrlstate->StateUnion.Text.Text.Data); break; case SAHPI_CTRL_TYPE_OEM: snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Oem:\n"); oh_append_bigtext(&buffer, str); oh_append_offset(&buffer, offsets + 1); rv = oh_decode_manufacturerid(thisctrlstate->StateUnion.Oem.MId, &smallbuf); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "ManufacturerId: %s\n", smallbuf.Data); oh_append_bigtext(&buffer, str); oh_append_offset(&buffer, offsets + 1); snprintf(str, thisctrlstate->StateUnion.Oem.BodyLength, "%s\n", thisctrlstate->StateUnion.Oem.Body); break; default: snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Invalid Control Type\n"); rv = SA_ERR_HPI_INVALID_DATA; break; } oh_append_bigtext(&buffer, str); rv = oh_fprint_bigtext(stream, &buffer); return(rv); } /** * oh_valid_textbuffer: * @buffer: Pointer to a SaHpiTextBufferT structure. * * Verifies @buffer is a valid SaHpiTextBufferT structure. * Used in routines where the user can set SaHpiTextBufferT values. * * Returns: * SAHPI_TRUE - if @buffer is valid. * SAHPI_FALSE - if @buffer not valid. **/ SaHpiBoolT oh_valid_textbuffer(SaHpiTextBufferT *buffer) { int i; SaHpiUint16T c1, c2; if (!buffer) return SAHPI_FALSE; if (oh_lookup_texttype(buffer->DataType) == NULL) return SAHPI_FALSE; /* Compiler checks DataLength <= SAHPI_MAX_TEXT_BUFFER_LENGTH */ switch (buffer->DataType) { case SAHPI_TL_TYPE_UNICODE: /* Validate language and length */ if (oh_lookup_language(buffer->Language) == NULL) return SAHPI_FALSE; if (buffer->DataLength % 2 != 0) return SAHPI_FALSE; /* Validate utf-16 buffers in the case of surrogates */ for (i = 0; i < buffer->DataLength; i = i + 2) { /* here I am assuming that the least * significant byte is first */ c1 = buffer->Data[i]; c1 |= buffer->Data[i+1] << 8; if (U_IS_SURROGATE(c1)) { if (buffer->DataLength > i+3) { c2 = buffer->Data[i+2]; c2 |= buffer->Data[i+3] << 8; if (U_IS_LEAD(c1) && U_IS_TRAIL(c2)) { /* already checked for trail .. * so increment i by 2 */ i = i + 2; } else { /* found a unpaired surrogate */ return SAHPI_FALSE; } } else { /* found a unpaired surrogate */ return SAHPI_FALSE; } } } break; case SAHPI_TL_TYPE_BCDPLUS: /* 8-bit ASCII, '0'-'9', space, dash, period, colon, comma, or underscore. Always encoded in HPI as 8-bit values */ for (i = 0; i < buffer->DataLength && i < SAHPI_MAX_TEXT_BUFFER_LENGTH; i++) { if ((buffer->Data[i] < 0x30 || buffer->Data[i] > 0x39) && buffer->Data[i] != 0x20 && buffer->Data[i] != 0x2d && buffer->Data[i] != 0x2e && buffer->Data[i] != 0x3a && buffer->Data[i] != 0x2c && buffer->Data[i] != 0x5f) return SAHPI_FALSE; } break; case SAHPI_TL_TYPE_ASCII6: /* reduced set, 0x20-0x5f only. Always encoded in HPI as 8-bit values */ for (i = 0; i < buffer->DataLength && i < SAHPI_MAX_TEXT_BUFFER_LENGTH; i++) { if (buffer->Data[i] < 0x20 || buffer->Data[i] > 0x5f) return SAHPI_FALSE; } break; case SAHPI_TL_TYPE_TEXT: if (oh_lookup_language(buffer->Language) == NULL) { return(SAHPI_FALSE); } /* all character values are good 0x00 - 0xff */ break; case SAHPI_TL_TYPE_BINARY: /* No check possible */ break; default: CRIT("Invalid data type"); return(SAHPI_FALSE); } return(SAHPI_TRUE); } #define validate_threshold(thdname, thdmask) \ do { \ if (thds->thdname.IsSupported) { \ if (!(writable_thds & thdmask)) return(SA_ERR_HPI_INVALID_CMD); \ if (format.ReadingType != thds->thdname.Type) return(SA_ERR_HPI_INVALID_DATA); \ switch (format.ReadingType) { \ case SAHPI_SENSOR_READING_TYPE_INT64: \ if (thdmask == SAHPI_STM_UP_HYSTERESIS || thdmask == SAHPI_STM_LOW_HYSTERESIS) { \ if (thds->thdname.Value.SensorInt64 < 0) return(SA_ERR_HPI_INVALID_DATA); \ } else { \ if (format.Range.Flags & SAHPI_SRF_MAX) { \ if (thds->thdname.Value.SensorInt64 > format.Range.Max.Value.SensorInt64) \ return(SA_ERR_HPI_INVALID_CMD); \ } \ if (format.Range.Flags & SAHPI_SRF_MIN) { \ if (thds->thdname.Value.SensorInt64 < format.Range.Min.Value.SensorInt64) \ return(SA_ERR_HPI_INVALID_CMD); \ } \ } \ break; \ case SAHPI_SENSOR_READING_TYPE_FLOAT64: \ if (thdmask == SAHPI_STM_UP_HYSTERESIS || thdmask == SAHPI_STM_LOW_HYSTERESIS) { \ if (thds->thdname.Value.SensorFloat64 < 0) return(SA_ERR_HPI_INVALID_DATA); \ } else { \ if (format.Range.Flags & SAHPI_SRF_MAX) { \ if (thds->thdname.Value.SensorFloat64 > format.Range.Max.Value.SensorFloat64) \ return(SA_ERR_HPI_INVALID_CMD); \ } \ if (format.Range.Flags & SAHPI_SRF_MIN) { \ if (thds->thdname.Value.SensorFloat64 < format.Range.Min.Value.SensorFloat64) \ return(SA_ERR_HPI_INVALID_CMD); \ } \ } \ break; \ case SAHPI_SENSOR_READING_TYPE_UINT64: \ if (thdmask == SAHPI_STM_UP_HYSTERESIS || thdmask == SAHPI_STM_LOW_HYSTERESIS) { \ } else { \ if (format.Range.Flags & SAHPI_SRF_MAX) { \ if (thds->thdname.Value.SensorUint64 > format.Range.Max.Value.SensorUint64) \ return(SA_ERR_HPI_INVALID_CMD); \ } \ if (format.Range.Flags & SAHPI_SRF_MIN) { \ if (thds->thdname.Value.SensorUint64 < format.Range.Min.Value.SensorUint64) \ return(SA_ERR_HPI_INVALID_CMD); \ } \ } \ break; \ case SAHPI_SENSOR_READING_TYPE_BUFFER: \ break; \ default: \ CRIT("Invalid threshold reading type."); \ return(SA_ERR_HPI_INVALID_CMD); \ } \ } \ } while(0) #define validate_threshold_order(thdtype) \ do { \ if (thds->UpCritical.IsSupported == SAHPI_TRUE) { \ if (thds->UpMajor.IsSupported == SAHPI_TRUE) { \ if (thds->UpCritical.Value.thdtype < thds->UpMajor.Value.thdtype) \ return(SA_ERR_HPI_INVALID_DATA); \ } \ if (thds->UpMinor.IsSupported == SAHPI_TRUE) { \ if (thds->UpCritical.Value.thdtype < thds->UpMinor.Value.thdtype) \ return(SA_ERR_HPI_INVALID_DATA); \ } \ if (thds->LowMinor.IsSupported == SAHPI_TRUE) { \ if (thds->UpCritical.Value.thdtype < thds->LowMinor.Value.thdtype) \ return(SA_ERR_HPI_INVALID_DATA); \ } \ if (thds->LowMajor.IsSupported == SAHPI_TRUE) { \ if (thds->UpCritical.Value.thdtype < thds->LowMajor.Value.thdtype) \ return(SA_ERR_HPI_INVALID_DATA); \ } \ if (thds->LowCritical.IsSupported == SAHPI_TRUE) { \ if (thds->UpCritical.Value.thdtype < thds->LowCritical.Value.thdtype) \ return(SA_ERR_HPI_INVALID_DATA); \ } \ } \ if (thds->UpMajor.IsSupported == SAHPI_TRUE) { \ if (thds->UpMinor.IsSupported == SAHPI_TRUE) { \ if (thds->UpMajor.Value.thdtype < thds->UpMinor.Value.thdtype) \ return(SA_ERR_HPI_INVALID_DATA); \ } \ if (thds->LowMinor.IsSupported == SAHPI_TRUE) { \ if (thds->UpMajor.Value.thdtype < thds->LowMinor.Value.thdtype) \ return(SA_ERR_HPI_INVALID_DATA); \ } \ if (thds->LowMajor.IsSupported == SAHPI_TRUE) { \ if (thds->UpMajor.Value.thdtype < thds->LowMajor.Value.thdtype) \ return(SA_ERR_HPI_INVALID_DATA); \ } \ if (thds->LowCritical.IsSupported == SAHPI_TRUE) { \ if (thds->UpMajor.Value.thdtype < thds->LowCritical.Value.thdtype) \ return(SA_ERR_HPI_INVALID_DATA); \ } \ } \ if (thds->UpMinor.IsSupported == SAHPI_TRUE) { \ if (thds->LowMinor.IsSupported == SAHPI_TRUE) { \ if (thds->UpMinor.Value.thdtype < thds->LowMinor.Value.thdtype) \ return(SA_ERR_HPI_INVALID_DATA); \ } \ if (thds->LowMajor.IsSupported == SAHPI_TRUE) { \ if (thds->UpMinor.Value.thdtype < thds->LowMajor.Value.thdtype) \ return(SA_ERR_HPI_INVALID_DATA); \ } \ if (thds->LowCritical.IsSupported == SAHPI_TRUE) { \ if (thds->UpMinor.Value.thdtype < thds->LowCritical.Value.thdtype) \ return(SA_ERR_HPI_INVALID_DATA); \ } \ } \ if (thds->LowMinor.IsSupported == SAHPI_TRUE) { \ if (thds->LowMajor.IsSupported == SAHPI_TRUE) { \ if (thds->LowMinor.Value.thdtype < thds->LowMajor.Value.thdtype) \ return(SA_ERR_HPI_INVALID_DATA); \ } \ if (thds->LowCritical.IsSupported == SAHPI_TRUE) { \ if (thds->LowMinor.Value.thdtype < thds->LowCritical.Value.thdtype) \ return(SA_ERR_HPI_INVALID_DATA); \ } \ } \ if (thds->LowMajor.IsSupported == SAHPI_TRUE) { \ if (thds->LowCritical.IsSupported == SAHPI_TRUE) { \ if (thds->LowMajor.Value.thdtype < thds->LowCritical.Value.thdtype) \ return(SA_ERR_HPI_INVALID_DATA); \ } \ } \ } while(0) /** * oh_valid_ordering: * @thds: Location of threshold definitions to verify. * @rdr: Location of sensor's RDR. * * Validates the ordering of threshold values * * Return values: * SA_OK - normal case. * SA_ERR_HPI_INVALID_CMD - invalid data type. * SA_ERR_HPI_INVALID_DATA - Threshold values out of order. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT oh_valid_ordering(SaHpiSensorThresholdsT *thds, SaHpiRdrT *rdr) { SaHpiSensorDataFormatT format; /* Validate defined thresholds are in order: * upper critical >= upper major >= upper minor >= * lower minor >= lower major >= lower critical */ if (!thds || !rdr) { return(SA_ERR_HPI_INVALID_PARAMS); } if (rdr->RdrType != SAHPI_SENSOR_RDR) { return(SA_ERR_HPI_INVALID_PARAMS); } format = rdr->RdrTypeUnion.SensorRec.DataFormat; DBG("Start of ordering validation."); switch (format.ReadingType) { case SAHPI_SENSOR_READING_TYPE_INT64: validate_threshold_order(SensorInt64); break; case SAHPI_SENSOR_READING_TYPE_FLOAT64: validate_threshold_order(SensorFloat64); break; case SAHPI_SENSOR_READING_TYPE_UINT64: validate_threshold_order(SensorUint64); break; case SAHPI_SENSOR_READING_TYPE_BUFFER: break; default: CRIT("Invalid threshold reading type."); return(SA_ERR_HPI_INVALID_CMD); } return(SA_OK); } /** * oh_valid_thresholds: * @thds: Location of threshold definitions to verify. * @rdr: Location of sensor's RDR. * * Validates that the threshold values defined in @thds are valid for a sensor * described by @rdr. The caller may need to read the sensor's existing * sensors first, since @thds may only contain a subset of the possible * writable thresholds. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_INVALID_CMD - Non-writable thresholds, invalid thresholds values, or invalid data type. * SA_ERR_HPI_INVALID_DATA - negative hysteresis value. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT oh_valid_thresholds(SaHpiSensorThresholdsT *thds, SaHpiRdrT *rdr) { SaHpiSensorThdMaskT writable_thds; SaHpiSensorDataFormatT format; if (!thds || !rdr) { return(SA_ERR_HPI_INVALID_PARAMS); } if (rdr->RdrType != SAHPI_SENSOR_RDR) { return(SA_ERR_HPI_INVALID_PARAMS); } writable_thds = rdr->RdrTypeUnion.SensorRec.ThresholdDefn.WriteThold; format = rdr->RdrTypeUnion.SensorRec.DataFormat; if (rdr->RdrTypeUnion.SensorRec.Category != SAHPI_EC_THRESHOLD || rdr->RdrTypeUnion.SensorRec.ThresholdDefn.IsAccessible == SAHPI_FALSE || rdr->RdrTypeUnion.SensorRec.ThresholdDefn.WriteThold == 0) return(SA_ERR_HPI_INVALID_CMD); DBG("Start of threshold validation:"); DBG("Check SAHPI_STM_LOW_CRIT"); validate_threshold(LowCritical, SAHPI_STM_LOW_CRIT); DBG("Check SAHPI_STM_LOW_MAJOR"); validate_threshold(LowMajor, SAHPI_STM_LOW_MAJOR); DBG("Check SAHPI_STM_LOW_MINOR"); validate_threshold(LowMinor, SAHPI_STM_LOW_MINOR); DBG("Check SAHPI_STM_UP_CRIT"); validate_threshold(UpCritical, SAHPI_STM_UP_CRIT); DBG("Check SAHPI_STM_UP_MAJOR"); validate_threshold(UpMajor, SAHPI_STM_UP_MAJOR); DBG("Check SAHPI_STM_UP_MINOR"); validate_threshold(UpMinor, SAHPI_STM_UP_MINOR); DBG("Check SAHPI_STM_UP_HYSTERESIS"); validate_threshold(PosThdHysteresis, SAHPI_STM_UP_HYSTERESIS); DBG("Check SAHPI_STM_LOW_HYSTERESIS"); validate_threshold(NegThdHysteresis, SAHPI_STM_LOW_HYSTERESIS); return (SA_OK); } /** * oh_fprint_thresholds * @stream: file handle * @thresholds: sensor thresholds to be printed * @format: data format for corresponding sensor * @offsets: indentation for printing structure * * * Returns: * SA_ERR_HPI_INVALID_PARAMS - one or more of the parameters is NULL. * SA_ERR_HPI_INVALID_DATA - a value is not one of the enumerated values for the type. * SA_OK - Normal operation. **/ SaErrorT oh_fprint_thresholds(FILE *stream, const SaHpiSensorThresholdsT *thresholds, const SaHpiSensorDataFormatT *format, int offsets) { oh_big_textbuffer bigbuf; if (!stream || !thresholds || !format) { return SA_ERR_HPI_INVALID_PARAMS; } oh_init_bigtext(&bigbuf); oh_append_offset(&bigbuf, offsets); if (thresholds->LowCritical.IsSupported) { SaHpiTextBufferT smallbuf; memset(&smallbuf, 0, sizeof(SaHpiTextBufferT)); oh_append_bigtext(&bigbuf, "Low Critical: "); oh_decode_sensorreading(thresholds->LowCritical, *format, &smallbuf); oh_append_bigtext(&bigbuf, (char *)smallbuf.Data); oh_append_bigtext(&bigbuf, "\n"); oh_append_offset(&bigbuf, offsets); } if (thresholds->LowMajor.IsSupported) { SaHpiTextBufferT smallbuf; memset(&smallbuf, 0, sizeof(SaHpiTextBufferT)); oh_append_bigtext(&bigbuf, "Low Major: "); oh_decode_sensorreading(thresholds->LowMajor, *format, &smallbuf); oh_append_bigtext(&bigbuf, (char *)smallbuf.Data); oh_append_bigtext(&bigbuf, "\n"); oh_append_offset(&bigbuf, offsets); } if (thresholds->LowMinor.IsSupported) { SaHpiTextBufferT smallbuf; memset(&smallbuf, 0, sizeof(SaHpiTextBufferT)); oh_append_bigtext(&bigbuf, "Low Minor: "); oh_decode_sensorreading(thresholds->LowMinor, *format, &smallbuf); oh_append_bigtext(&bigbuf, (char *)smallbuf.Data); oh_append_bigtext(&bigbuf, "\n"); oh_append_offset(&bigbuf, offsets); } if (thresholds->UpCritical.IsSupported) { SaHpiTextBufferT smallbuf; memset(&smallbuf, 0, sizeof(SaHpiTextBufferT)); oh_append_bigtext(&bigbuf, "Up Critical: "); oh_decode_sensorreading(thresholds->UpCritical, *format, &smallbuf); oh_append_bigtext(&bigbuf, (char *)smallbuf.Data); oh_append_bigtext(&bigbuf, "\n"); oh_append_offset(&bigbuf, offsets); } if (thresholds->UpMajor.IsSupported) { SaHpiTextBufferT smallbuf; memset(&smallbuf, 0, sizeof(SaHpiTextBufferT)); oh_append_bigtext(&bigbuf, "Up Major: "); oh_decode_sensorreading(thresholds->UpMajor, *format, &smallbuf); oh_append_bigtext(&bigbuf, (char *)smallbuf.Data); oh_append_bigtext(&bigbuf, "\n"); oh_append_offset(&bigbuf, offsets); } if (thresholds->UpMinor.IsSupported) { SaHpiTextBufferT smallbuf; memset(&smallbuf, 0, sizeof(SaHpiTextBufferT)); oh_append_bigtext(&bigbuf, "Up Minor: "); oh_decode_sensorreading(thresholds->UpMinor, *format, &smallbuf); oh_append_bigtext(&bigbuf, (char *)smallbuf.Data); oh_append_bigtext(&bigbuf, "\n"); oh_append_offset(&bigbuf, offsets); } if (thresholds->PosThdHysteresis.IsSupported) { SaHpiTextBufferT smallbuf; memset(&smallbuf, 0, sizeof(SaHpiTextBufferT)); oh_append_bigtext(&bigbuf, "Positive Hysteresis: "); oh_decode_sensorreading(thresholds->PosThdHysteresis, *format, &smallbuf); oh_append_bigtext(&bigbuf, (char *)smallbuf.Data); oh_append_bigtext(&bigbuf, "\n"); oh_append_offset(&bigbuf, offsets); } if (thresholds->NegThdHysteresis.IsSupported) { SaHpiTextBufferT smallbuf; memset(&smallbuf, 0, sizeof(SaHpiTextBufferT)); oh_append_bigtext(&bigbuf, "Negative Hysteresis: "); oh_decode_sensorreading(thresholds->NegThdHysteresis, *format, &smallbuf); oh_append_bigtext(&bigbuf, (char *)smallbuf.Data); oh_append_bigtext(&bigbuf, "\n"); oh_append_offset(&bigbuf, offsets); } return oh_fprint_bigtext(stream, &bigbuf); } /** * oh_compare_sensorreading: * @type: Type of both sensor readings. * @reading1: Pointer to sensor reading. * @reading1: Pointer to sensor reading. * * Compares the Value field of two sensor readings. Sensor readings must be of the * same Type. * * Return values: * -1 - @reading1 < @reading2 * 0 - @reading1 = @reading2 * +1 - @reading1 > @reading2 **/ int oh_compare_sensorreading(SaHpiSensorReadingTypeT type, SaHpiSensorReadingT *reading1, SaHpiSensorReadingT *reading2) { int res; switch(type) { case SAHPI_SENSOR_READING_TYPE_INT64: if (reading1->Value.SensorInt64 < reading2->Value.SensorInt64) { return -1; } else { if (reading1->Value.SensorInt64 == reading2->Value.SensorInt64) { return 0; } else { return 1; } } break; case SAHPI_SENSOR_READING_TYPE_UINT64: if (reading1->Value.SensorUint64 < reading2->Value.SensorUint64) { return -1; } else { if (reading1->Value.SensorUint64 == reading2->Value.SensorUint64) { return 0; } else { return 1; } } break; case SAHPI_SENSOR_READING_TYPE_FLOAT64: if (reading1->Value.SensorFloat64 < reading2->Value.SensorFloat64) { return -1; } else { if (reading1->Value.SensorFloat64 == reading2->Value.SensorFloat64) { return 0; } else { return 1; } } break; case SAHPI_SENSOR_READING_TYPE_BUFFER: res = memcmp(reading1->Value.SensorBuffer, reading2->Value.SensorBuffer, SAHPI_SENSOR_BUFFER_LENGTH); if (res < 0) { return -1; } else if (res > 0) { return 1; } else { return 0; } break; default: CRIT("Invalid sensor reading type."); return 0; } } /** * oh_valid_ctrl_state_mode: * @ctrl_rdr: Pointer to control's RDR information. * @mode: Control's mode. * @state: Pointer to contol's state. * * Verifies that the @mode and @state data are compatible with a control's RDR information. * This routine performs all the static checks defined in the HPI spec but the caller must * perform the following checks: * - Verify control's resource has SAHPI_CAPABILITY_CONTROL set. * - Check to see if control is on, if SAHPI_STATE_PULSE_ON is supported and set; * Check to see if control is off, if SAHPI_STATE_PULSE_OFF is supported and set. * Caller needs to return SA_ERR_HPI_INVALID_REQUEST in either of these cases. * * As specified in the HPI spec, if @mode = SAHPI_CTRL_MODE_AUTO, this routine * ignores @state. * * Return values: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - See HPI spec. * SA_ERR_HPI_INVALID_DATA - See HPI spec. * SA_ERR_HPI_READ_ONLY - See HPI spec. **/ SaErrorT oh_valid_ctrl_state_mode(SaHpiCtrlRecT *ctrl_rdr, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state) { /* Check for valid mode operations */ if (NULL == oh_lookup_ctrlmode(mode)) return(SA_ERR_HPI_INVALID_PARAMS); if (ctrl_rdr->DefaultMode.ReadOnly == SAHPI_TRUE) { if (mode != ctrl_rdr->DefaultMode.Mode) return(SA_ERR_HPI_READ_ONLY); } if (mode != SAHPI_CTRL_MODE_AUTO && !state) return(SA_ERR_HPI_INVALID_PARAMS); /* Check for valid state operations */ if (mode != SAHPI_CTRL_MODE_AUTO) { if (ctrl_rdr->Type != state->Type) return(SA_ERR_HPI_INVALID_DATA); if (NULL == oh_lookup_ctrltype(state->Type)) return(SA_ERR_HPI_INVALID_DATA); switch(state->Type) { case SAHPI_CTRL_TYPE_DIGITAL: if (NULL == oh_lookup_ctrlstatedigital(state->StateUnion.Digital)) return(SA_ERR_HPI_INVALID_PARAMS); break; case SAHPI_CTRL_TYPE_DISCRETE: /* No HPI spec error check - leave to caller, if needed */ break; case SAHPI_CTRL_TYPE_ANALOG: if (state->StateUnion.Analog < ctrl_rdr->TypeUnion.Analog.Min) return(SA_ERR_HPI_INVALID_DATA); if (state->StateUnion.Analog > ctrl_rdr->TypeUnion.Analog.Max) return(SA_ERR_HPI_INVALID_DATA); break; case SAHPI_CTRL_TYPE_STREAM: if (state->StateUnion.Stream.StreamLength > SAHPI_CTRL_MAX_STREAM_LENGTH) return(SA_ERR_HPI_INVALID_PARAMS); break; case SAHPI_CTRL_TYPE_TEXT: if (state->StateUnion.Text.Text.DataType != ctrl_rdr->TypeUnion.Text.DataType) return(SA_ERR_HPI_INVALID_DATA); if (state->StateUnion.Text.Text.DataType == SAHPI_TL_TYPE_UNICODE || state->StateUnion.Text.Text.DataType == SAHPI_TL_TYPE_TEXT) { if (state->StateUnion.Text.Text.Language != ctrl_rdr->TypeUnion.Text.Language) return(SA_ERR_HPI_INVALID_DATA); } if (!oh_valid_textbuffer(&(state->StateUnion.Text.Text))) return (SA_ERR_HPI_INVALID_PARAMS); { /* Check for text buffer overflow */ int char_num; if (state->StateUnion.Text.Line > ctrl_rdr->TypeUnion.Text.MaxLines) return(SA_ERR_HPI_INVALID_DATA); if (state->StateUnion.Text.Text.DataType == SAHPI_TL_TYPE_UNICODE) { char_num = state->StateUnion.Text.Text.DataLength/2; } else { char_num = state->StateUnion.Text.Text.DataLength; } if (char_num) { int max_chars; if (state->StateUnion.Text.Line == SAHPI_TLN_ALL_LINES) { max_chars = ctrl_rdr->TypeUnion.Text.MaxLines * ctrl_rdr->TypeUnion.Text.MaxChars; } else { max_chars = (ctrl_rdr->TypeUnion.Text.MaxLines * ctrl_rdr->TypeUnion.Text.MaxChars) - ((state->StateUnion.Text.Line - 1) * ctrl_rdr->TypeUnion.Text.MaxChars); } if (char_num > max_chars) return(SA_ERR_HPI_INVALID_DATA); } } break; case SAHPI_CTRL_TYPE_OEM: /* No HPI spec error check - leave to caller, if needed */ break; default: CRIT("Invalid control state"); return(SA_ERR_HPI_INTERNAL_ERROR); } } return(SA_OK); } openhpi-3.6.1/utils/epath_utils.h0000644000175100017510000000555212575647300016025 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman * Renier Morales */ #ifndef __EPATH_UTILS_H #define __EPATH_UTILS_H #ifndef __OH_UTILS_H #warning *** Include oh_utils.h instead of individual utility header files *** #endif #include #include /* Character for blanking out normalized strings based on entity path */ #define OH_DERIVE_BLANK_CHAR 'x' #define OH_DERIVE_BLANK_STR "x" /* Max number of digits an enitity instance has */ #define OH_MAX_LOCATION_DIGITS 6 /* Definitions for describing entity path patterns */ #define OH_MAX_EP_TUPLES SAHPI_MAX_ENTITY_PATH+1 #ifdef __cplusplus extern "C" { #endif typedef struct { SaHpiBoolT is_dot; SaHpiEntityTypeT type; } oh_entity_type_pattern; typedef struct { SaHpiBoolT is_dot; SaHpiEntityLocationT location; } oh_entity_location_pattern; typedef struct { SaHpiBoolT is_splat; oh_entity_type_pattern etp; oh_entity_location_pattern elp; } oh_entity_pattern; typedef struct { oh_entity_pattern epattern[OH_MAX_EP_TUPLES]; } oh_entitypath_pattern; SaHpiBoolT oh_cmp_ep(const SaHpiEntityPathT *ep1, const SaHpiEntityPathT *ep2); SaErrorT oh_concat_ep(SaHpiEntityPathT *dest, const SaHpiEntityPathT *append); SaErrorT oh_decode_entitypath(const SaHpiEntityPathT *ep, oh_big_textbuffer *bigbuf); SaErrorT oh_encode_entitypath(const gchar *epstr, SaHpiEntityPathT *ep); SaHpiUint8T oh_ep_len( const SaHpiEntityPathT * ep ); SaErrorT oh_get_child_ep( const SaHpiEntityPathT * ep, const SaHpiEntityPathT * parent, SaHpiEntityPathT * child ); SaErrorT oh_init_ep(SaHpiEntityPathT *ep); #define oh_print_ep(ep_ptr, offsets) oh_fprint_ep(stdout, ep_ptr, offsets) SaErrorT oh_fprint_ep(FILE *stream, const SaHpiEntityPathT *ep, int offsets); SaErrorT oh_set_ep_location(SaHpiEntityPathT *ep, SaHpiEntityTypeT et, SaHpiEntityLocationT ei); SaHpiBoolT oh_valid_ep(const SaHpiEntityPathT *ep); gchar * oh_derive_string(SaHpiEntityPathT *ep, SaHpiEntityLocationT offset, int base, const gchar *str); SaErrorT oh_compile_entitypath_pattern(const char *epp_str, oh_entitypath_pattern *epp); SaHpiBoolT oh_match_entitypath_pattern(oh_entitypath_pattern *epp, SaHpiEntityPathT *ep); #ifdef __cplusplus } #endif #endif openhpi-3.6.1/utils/announcement_utils.c0000644000175100017510000002301312575647300017401 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003-2006 * Copyright (c) 2003 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * David Ashley * Renier Morales */ #include #include #include #include #include /* allocate and initialize an announcement list */ oh_announcement *oh_announcement_create(void) { oh_announcement *ann; ann = g_new0(oh_announcement, 1); if (ann != NULL) { ann->nextId = SAHPI_OLDEST_ENTRY + 1; // always start at 1 ann->annentries = NULL; } return ann; } /* close and free all memory associated with an announcement list */ SaErrorT oh_announcement_close(oh_announcement *ann) { if (ann == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } oh_announcement_clear(ann); g_free(ann); return SA_OK; } /* append a new entry to the announcement list */ SaErrorT oh_announcement_append(oh_announcement *ann, SaHpiAnnouncementT *myann) { oh_ann_entry *entry; /* check for valid el params and state */ if (ann == NULL || myann == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } /* alloc and copy the new entry */ entry = g_new0(oh_ann_entry, 1); if (entry == NULL) { return SA_ERR_HPI_OUT_OF_SPACE; } memcpy(&entry->annentry, myann, sizeof(SaHpiAnnouncementT)); /* initialize the struct and append the new entry */ entry->annentry.EntryId = ann->nextId++; oh_gettimeofday(&entry->annentry.Timestamp); entry->annentry.AddedByUser = TRUE; ann->annentries = g_list_append(ann->annentries, entry); /* copy the new generated info back to the user's announcement */ memcpy(myann, &entry->annentry, sizeof(SaHpiAnnouncementT)); return SA_OK; } /* clear all announcement entries */ SaErrorT oh_announcement_clear(oh_announcement *ann) { GList *temp; if (ann == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } /* free the list data elements */ temp = g_list_first(ann->annentries); while (temp != NULL) { g_free(temp->data); temp = g_list_next(temp); } /* free the list nodes */ g_list_free(ann->annentries); /* reset the control structure */ ann->nextId = SAHPI_OLDEST_ENTRY + 1; // always start at 1 ann->annentries = NULL; return SA_OK; } /* get an announcement entry */ SaErrorT oh_announcement_get(oh_announcement *ann, SaHpiEntryIdT srchid, SaHpiAnnouncementT *entry) { oh_ann_entry *myentry; GList *annlist; if (ann == NULL || entry == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } annlist = g_list_first(ann->annentries); if (annlist == NULL) return SA_ERR_HPI_NOT_PRESENT; if (srchid == SAHPI_FIRST_ENTRY && annlist != NULL) { myentry = (oh_ann_entry *) annlist->data; memcpy(entry, &myentry->annentry, sizeof(SaHpiAnnouncementT)); return SA_OK; } if (srchid == SAHPI_LAST_ENTRY && annlist != NULL) { annlist = g_list_last(ann->annentries); myentry = (oh_ann_entry *) annlist->data; memcpy(entry, &myentry->annentry, sizeof(SaHpiAnnouncementT)); return SA_OK; } while (annlist != NULL) { myentry = (oh_ann_entry *) annlist->data; if (srchid == myentry->annentry.EntryId) { memcpy(entry, &myentry->annentry, sizeof(SaHpiAnnouncementT)); return SA_OK; } annlist = g_list_next(annlist); } return SA_ERR_HPI_NOT_PRESENT; } /* get next announcement entry */ SaErrorT oh_announcement_get_next(oh_announcement *ann, SaHpiSeverityT sev, SaHpiBoolT ack, SaHpiAnnouncementT *entry) { GList *annlist = NULL; if (ann == NULL || entry == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } if (entry->EntryId == SAHPI_FIRST_ENTRY) { annlist = ann->annentries; /* start search at beginning */ } else { /* find the previous matching entry */ for (annlist = ann->annentries; annlist; annlist = annlist->next) { oh_ann_entry *annentry = annlist->data; if (entry->EntryId == annentry->annentry.EntryId) { if (entry->Timestamp == annentry->annentry.Timestamp) { break; } else { return SA_ERR_HPI_INVALID_DATA; } } } /* Set list node for searching for next matching entry */ if (annlist) annlist = g_list_next(annlist); else { DBG("Did not find previous entry." " Searching from first one."); annlist = g_list_first(ann->annentries); } } /* Find the matching entry based on severity and ack */ for (; annlist; annlist = annlist->next) { oh_ann_entry *annentry = annlist->data; if (annentry && (sev == SAHPI_ALL_SEVERITIES || sev == annentry->annentry.Severity) && (ack ? !annentry->annentry.Acknowledged : 1)) { DBG("Severity searched for is %d." " Severity found is %d", sev, annentry->annentry.Severity); *entry = annentry->annentry; return SA_OK; } } return SA_ERR_HPI_NOT_PRESENT; } SaErrorT oh_announcement_ack(oh_announcement *ann, SaHpiEntryIdT srchid, SaHpiSeverityT sev) { oh_ann_entry *myentry; GList *annlist; if (ann == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } /* Search for one announcement if entryid is specified */ if (srchid != SAHPI_ENTRY_UNSPECIFIED) { annlist = g_list_first(ann->annentries); while (annlist != NULL) { myentry = (oh_ann_entry *) annlist->data; if (srchid == myentry->annentry.EntryId) { myentry->annentry.Acknowledged = TRUE; return SA_OK; } annlist = g_list_next(annlist); } return SA_ERR_HPI_NOT_PRESENT; } /* EntryId not specified, so ack announcements which have the specified severity */ annlist = g_list_first(ann->annentries); if (annlist == NULL) return SA_OK; while (annlist != NULL) { myentry = (oh_ann_entry *) annlist->data; if (sev == SAHPI_ALL_SEVERITIES || sev == myentry->annentry.Severity) { myentry->annentry.Acknowledged = TRUE; } annlist = g_list_next(annlist); } return SA_OK; } SaErrorT oh_announcement_del(oh_announcement *ann, SaHpiEntryIdT srchid, SaHpiSeverityT sev) { oh_ann_entry *myentry; GList *annlist; if (ann == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } /* Search for one announcement if entryid is specified */ if (srchid != SAHPI_ENTRY_UNSPECIFIED) { annlist = g_list_first(ann->annentries); while (annlist != NULL) { myentry = (oh_ann_entry *) annlist->data; if (srchid == myentry->annentry.EntryId) { g_free(annlist->data); ann->annentries = g_list_remove(ann->annentries, myentry); return SA_OK; } annlist = g_list_next(annlist); } return SA_ERR_HPI_NOT_PRESENT; } /* remove all announcements with a specified severity */ annlist = g_list_first(ann->annentries); if (annlist == NULL) return SA_OK; while (annlist != NULL) { myentry = (oh_ann_entry *) annlist->data; if (sev == SAHPI_ALL_SEVERITIES || sev == myentry->annentry.Severity) { g_free(annlist->data); ann->annentries = g_list_remove(ann->annentries, myentry); annlist = g_list_first(ann->annentries); } else { annlist = g_list_next(annlist); } } return SA_OK; } openhpi-3.6.1/utils/t/0000755000175100017510000000000012605014516013556 5ustar mohanmohanopenhpi-3.6.1/utils/t/rpt/0000755000175100017510000000000012605014457014367 5ustar mohanmohanopenhpi-3.6.1/utils/t/rpt/rpt_utils_003.c0000644000175100017510000000423212575647301017151 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include #include /** * main: Starts with an RPTable of 10 resources and fetches * them randomly by the ResourceId and compares them against the original * resource. A failed comparison means the test failed, * otherwise the test passed. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); guint i = 0, k = 0; GSList *resources = NULL; for (i = 0; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries + i, NULL, 0)) return 1; else resources = g_slist_append(resources, rptentries + i); } for (; resources; i--) { SaHpiRptEntryT *randentry = NULL, *tmpentry = NULL; GSList *tmpnode = NULL; k = (guint) (((gfloat)i)*rand()/(RAND_MAX+1.0)); tmpnode = g_slist_nth(resources, k); randentry = (SaHpiRptEntryT *)tmpnode->data; tmpentry = oh_get_resource_by_id(rptable, randentry->ResourceId); if (!tmpentry || memcmp(randentry, tmpentry, sizeof(SaHpiRptEntryT))) return 1; else { resources = g_slist_remove_link(resources, tmpnode); g_slist_free_1(tmpnode); } } return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_043.c0000644000175100017510000000216312575647301017156 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds 1 resource to it * and then adds 1 NULL rdr to it. * Passes the test if the interface returns an error, else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); if (oh_add_resource(rptable, rptentries, NULL, 0)) return 1; if (!oh_add_rdr(rptable, rptentries[0].ResourceId, NULL, NULL, 1)) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_051.c0000644000175100017510000000253612575647301017161 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starts with an RPTable of 1 resource, adds 5 sensors ++to first resource. * Fetches an rdr by id using a NULL table. * Success if the interface returns an error, otherwise there was a failure. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); guint i; if (oh_add_resource(rptable, rptentries, NULL, 1)) return 1; for (i = 0; i < 5; i++) { if (oh_add_rdr(rptable, rptentries[0].ResourceId, sensors+i, NULL, 1)) return 1; } if (oh_get_rdr_by_id(NULL, rptentries[0].ResourceId, sensors[0].RecordId)) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_018.c0000644000175100017510000000344612575647301017165 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starts with an RPTable of 10 resources, multiple rdrs * on some resources. Remove rdr. Check if resource was removed * searching for it by type. If not fail, else passed test. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); SaHpiRdrT *tmprdr = NULL; guint i = 0; for (i = 0; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries + i, NULL, 0)) return 1; } for (i = 0; i < 5; i++) { if (oh_add_rdr(rptable, SAHPI_FIRST_ENTRY, sensors + i, NULL,0)) return 1; } for (; i < 7; i++) { if (oh_add_rdr(rptable, rptentries[9].ResourceId, sensors + i, NULL,0)) return 1; } oh_remove_rdr(rptable, rptentries[0].ResourceId, sensors[1].RecordId); tmprdr = oh_get_rdr_by_type(rptable, rptentries[0].ResourceId, sensors[1].RdrType, sensors[1].RdrTypeUnion.SensorRec.Num); if (tmprdr) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_075.c0000644000175100017510000000246512575647301017170 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Invokes rpt_diff with new_rdr param as NULL. * If it returns error, the test passes, otherwise it failed. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *curr_table = (RPTable *)g_malloc0(sizeof(RPTable)); RPTable *new_table = (RPTable *)g_malloc0(sizeof(RPTable)); GSList *new_res = NULL, *gone_res = NULL, *gone_rdr = NULL; oh_init_rpt(curr_table); oh_init_rpt(new_table); if (oh_add_resource(curr_table, rptentries, NULL, 0)) return 1; if (oh_add_resource(new_table, rptentries + 1, NULL, 0)) return 1; if (!rpt_diff(curr_table, new_table, &new_res, NULL, &gone_res, &gone_rdr)) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_000.c0000644000175100017510000000245112575647301017147 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds 1 resource to it * and tries to fetch it by the ResourceId and compare it against * the original resource. A failed comparison means the test * failed, otherwise the test passed. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); SaHpiRptEntryT *tmpentry = NULL; if (oh_add_resource(rptable, rptentries, NULL, 0)) return 1; tmpentry = oh_get_resource_by_id(rptable, rptentries[0].ResourceId); if (!tmpentry || memcmp(rptentries, tmpentry, sizeof(SaHpiRptEntryT))) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_014.c0000644000175100017510000000326012575647301017153 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starts with an RPTable of 10 resources, multiple rdrs * on some resources. Remove resource. Check if resource was removed * searching for it by id. If not fail, else passed test. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); SaHpiRptEntryT *tmpentry = NULL; guint i = 0; for (i = 0; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries + i, NULL, 0)) return 1; } for (i = 0; i < 5; i++) { if (oh_add_rdr(rptable, SAHPI_FIRST_ENTRY, sensors + i, NULL,0)) return 1; } for (; i < 7; i++) { if (oh_add_rdr(rptable, rptentries[9].ResourceId, sensors + i, NULL,0)) return 1; } oh_remove_resource(rptable, rptentries[0].ResourceId); tmpentry = oh_get_resource_by_id(rptable, rptentries[0].ResourceId); if (tmpentry) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_029.c0000644000175100017510000000262012575647301017160 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds 2 resources to it with data. * Fetches the data back using SAHPI_FIRST_ENTRY as the Resource Id. * Passes the test if the interface returns the data, else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); gchar *data1 = "My data 1"; gchar *data2 = "My data 2"; gchar *tmpdata = NULL; if (oh_add_resource(rptable, rptentries, data1, KEEP_RPT_DATA)) return 1; if (oh_add_resource(rptable, rptentries+1, data2, KEEP_RPT_DATA)) return 1; tmpdata = oh_get_resource_data(rptable, SAHPI_FIRST_ENTRY); if (data1 != tmpdata) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_009.c0000644000175100017510000000336512575647301017165 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starts with an RPTable of 10 resources, adds 1 rdr * to first resource. Fetches rdr by record id and compares * with original. A failed comparison means the test failed, * otherwise the test passed. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); SaHpiEntryIdT record_id; SaHpiRdrT *tmprdr = NULL; guint i = 0; for (i = 0; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries + i, NULL, 0)) return 1; } if (oh_add_rdr(rptable, SAHPI_FIRST_ENTRY, sensors, NULL,0)) { return 1; } record_id = oh_get_rdr_uid(sensors[0].RdrType, sensors[0].RdrTypeUnion.SensorRec.Num); sensors[0].RecordId = record_id; tmprdr = oh_get_rdr_by_id(rptable, SAHPI_FIRST_ENTRY, record_id); if (!tmprdr || memcmp(sensors, tmprdr, sizeof(SaHpiRdrT))) { return 1; } return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_026.c0000644000175100017510000000261112575647301017155 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds 10 resources to it * and removes one by specifying SAHPI_FIRST_ENTRY as the Resource Id. * Removes again to make sure it is not there anymore. * Passes the test if the interface returns 0 (success), else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); guint i; for (i = 0; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries+i, NULL, 0)) return 1; } if (oh_remove_resource(rptable, SAHPI_FIRST_ENTRY)) return 1; if (!oh_remove_resource(rptable, rptentries[0].ResourceId)) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_037.c0000644000175100017510000000232512575647301017161 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Adds 2 resources to an rpt table. * Fetches the 2nd resource through the get_next call * using a NULL table. * Passes the test if the interface returns NULL, else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); if (oh_add_resource(rptable, rptentries, NULL, 1)) return 1; if (oh_add_resource(rptable, rptentries + 1, NULL, 1)) return 1; if (oh_get_resource_next(NULL, rptentries[0].ResourceId)) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_069.c0000644000175100017510000000250512575647301017166 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds a resource to it * twice. Checks to see if the udpate count was updated the * second time. If it was the test failed, otherwise the test passed. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); SaHpiUint32T update_count; if (oh_add_resource(rptable, rptentries, NULL, 0)) return 1; update_count = rptable->update_count; if (oh_add_resource(rptable, rptentries, NULL, 0)) return 1; if (rptable->update_count != update_count) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_034.c0000644000175100017510000000221312575647301017152 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds 1 resource to it. * Fetches the resource back by entity path using a NULL table. * Passes the test if the interface returns NULL, else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); if (oh_add_resource(rptable, rptentries, NULL, 1)) return 1; if (oh_get_resource_by_ep(NULL, &(rptentries[0].ResourceEntity))) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_049.c0000644000175100017510000000245712575647301017172 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starts with an RPTable of 1 resource, adds 1 rdr with data * to first resource. Fetches data using a Resource Id not present in the table. * Success if the interface returns an error, otherwise there was a failure. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); gchar *data = "My data"; if (oh_add_resource(rptable, rptentries, NULL, 1)) return 1; if (oh_add_rdr(rptable, rptentries[0].ResourceId, sensors, data, 1)) return 1; if (oh_get_rdr_data(rptable, 1234567, sensors[0].RecordId)) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_042.c0000644000175100017510000000237012575647301017155 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds 10 resources to it * and then adds 1 rdr to it using a Resource Id not present in the table. * Passes the test if the interface returns an error, else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); guint i; for (i = 0; rptentries[i].ResourceId; i++) { if (oh_add_resource(rptable, rptentries+i, NULL, 0)) return 1; } if (!oh_add_rdr(rptable, 1234567, sensors, NULL, 1)) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_040.c0000644000175100017510000000234012575647301017150 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Adds 10 resources to an rpt table. * Uses the get_next call with the table's last Resource Id. * Passes the test if the interface returns NULL, else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); guint i; for (i = 0; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries+i, NULL, 1)) return 1; } if (oh_get_resource_next(rptable, rptentries[i-1].ResourceId)) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_006.c0000644000175100017510000000304012575647301017150 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starts with an RPTable of 10 resources, starting at * the beginning on going on to the next, compares * resource ids against the originals. A failed comparison * means the test failed, otherwise the test passed. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); SaHpiRptEntryT *tmpentry = NULL; guint i = 0; for (i = 0; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries + i, NULL, 0)) return 1; } for (i = 0, tmpentry = oh_get_resource_by_id(rptable, SAHPI_FIRST_ENTRY); tmpentry; tmpentry = oh_get_resource_next(rptable, tmpentry->ResourceId)) { if (rptentries[i++].ResourceId != tmpentry->ResourceId) return 1; } return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_045.c0000644000175100017510000000237312575647301017163 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds 1 resource to it * and then adds 1 rdr to it. Removes rdr using a NULL table. * Passes the test if the interface returns an error, else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); if (oh_add_resource(rptable, rptentries, NULL, 0)) return 1; if (oh_add_rdr(rptable, rptentries[0].ResourceId, sensors, NULL, 1)) return 1; if (!oh_remove_rdr(NULL, rptentries[0].ResourceId, sensors[0].RecordId)) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_039.c0000644000175100017510000000274212575647301017166 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Adds 10 resources to an rpt table. * Fetches the 1st resource through the get_next call * using SAHPI_FIRST_ENTRY for the Resource Id. Makes sure that the resource * returned is the 1st resource. * Passes the test if the interface returns a valid entry, else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); SaHpiRptEntryT *tmpentry = NULL; guint i; for (i = 0; rptentries[i].ResourceId; i++) { if (oh_add_resource(rptable, rptentries+i, NULL, 1)) return 1; } tmpentry = oh_get_resource_next(rptable, SAHPI_FIRST_ENTRY); if (!tmpentry) return 1; if (tmpentry->ResourceId != rptentries[0].ResourceId) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_070.c0000644000175100017510000000257212575647301017162 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds 1 resource to it. * Checks rpt info to see if update count was updated, but it passes * NULL for a table. * If oh_get_rpt_info returns error, the test passes, otherwise it failed. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); SaHpiUint32T update_count, update_count_new; SaHpiTimeT update_timestamp; update_count = rptable->update_count; if (oh_get_rpt_info(rptable, &update_count, &update_timestamp)) return 1; if (oh_add_resource(rptable, rptentries, NULL, 0)) return 1; if (!oh_get_rpt_info(NULL, &update_count_new, &update_timestamp)) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_024.c0000644000175100017510000000216312575647301017155 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds 1 resource to it * and removes it by specifying a NULL table. * Passes the test if the interface returns an error, else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); if (oh_add_resource(rptable, rptentries, NULL, 0)) return 1; if (!oh_remove_resource(NULL, rptentries[0].ResourceId)) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_076.c0000644000175100017510000000246412575647301017170 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Invokes rpt_diff with gone_res param as NULL. * If it returns error, the test passes, otherwise it failed. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *curr_table = (RPTable *)g_malloc0(sizeof(RPTable)); RPTable *new_table = (RPTable *)g_malloc0(sizeof(RPTable)); GSList *new_res = NULL, *new_rdr = NULL, *gone_rdr = NULL; oh_init_rpt(curr_table); oh_init_rpt(new_table); if (oh_add_resource(curr_table, rptentries, NULL, 0)) return 1; if (oh_add_resource(new_table, rptentries + 1, NULL, 0)) return 1; if (!rpt_diff(curr_table, new_table, &new_res, &new_rdr, NULL, &gone_rdr)) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_057.c0000644000175100017510000000257212575647301017167 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starts with an RPTable of 1 resource, adds 5 sensors ++to first resource. * Fetches an rdr using get_next with a Resource Id not present in the table. * Success if the interface returns an error, otherwise there was a failure. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); guint i; if (oh_add_resource(rptable, rptentries, NULL, 1)) return 1; for (i = 0; i < 5; i++) { if (oh_add_rdr(rptable, rptentries[0].ResourceId, sensors+i, NULL, 1)) return 1; } if (oh_get_rdr_next(rptable, rptentries[1].ResourceId, sensors[0].RecordId)) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/Makefile.am0000644000175100017510000002413412575647301016435 0ustar mohanmohan# (C) Copyright IBM Corp 2003, 2004 # All rights reserved. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. MAINTAINERCLEANFILES = Makefile.in REMOTE_SOURCES = rpt_utils.c \ epath_utils.c \ uid_utils.c \ sahpi_enum_utils.c \ sahpiatca_enum_utils.c \ sahpixtca_enum_utils.c \ sahpi_event_encode.c \ sahpi_event_utils.c \ sahpi_struct_utils.c \ sahpi_wrappers.c \ sahpi_time_utils.c MOSTLYCLEANFILES = $(REMOTE_SOURCES) @TEST_CLEAN@ AM_CPPFLAGS = -DG_LOG_DOMAIN=\"t\" AM_CPPFLAGS += @OPENHPI_INCLUDES@ EXTRA_DIST = rpt_resources.h $(REMOTE_SOURCES): if test ! -f $@ -a ! -L $@; then \ $(LN_S) $(top_srcdir)/utils/$@; \ fi TESTS = rpt_utils_000 \ rpt_utils_001 \ rpt_utils_002 \ rpt_utils_003 \ rpt_utils_004 \ rpt_utils_005 \ rpt_utils_006 \ rpt_utils_007 \ rpt_utils_008 \ rpt_utils_009 \ rpt_utils_010 \ rpt_utils_011 \ rpt_utils_012 \ rpt_utils_013 \ rpt_utils_014 \ rpt_utils_015 \ rpt_utils_016 \ rpt_utils_017 \ rpt_utils_018 \ rpt_utils_019 \ rpt_utils_020 \ rpt_utils_021 \ rpt_utils_022 \ rpt_utils_023 \ rpt_utils_024 \ rpt_utils_025 \ rpt_utils_026 \ rpt_utils_027 \ rpt_utils_028 \ rpt_utils_029 \ rpt_utils_030 \ rpt_utils_031 \ rpt_utils_032 \ rpt_utils_033 \ rpt_utils_034 \ rpt_utils_035 \ rpt_utils_037 \ rpt_utils_038 \ rpt_utils_039 \ rpt_utils_040 \ rpt_utils_041 \ rpt_utils_042 \ rpt_utils_043 \ rpt_utils_044 \ rpt_utils_045 \ rpt_utils_046 \ rpt_utils_047 \ rpt_utils_048 \ rpt_utils_049 \ rpt_utils_050 \ rpt_utils_051 \ rpt_utils_052 \ rpt_utils_053 \ rpt_utils_054 \ rpt_utils_055 \ rpt_utils_056 \ rpt_utils_057 \ rpt_utils_058 \ rpt_utils_059 \ rpt_utils_060 \ rpt_utils_061 \ rpt_utils_062 \ rpt_utils_063 \ rpt_utils_064 \ rpt_utils_065 \ rpt_utils_066 \ rpt_utils_067 \ rpt_utils_068 \ rpt_utils_069 \ rpt_utils_070 \ rpt_utils_071 \ rpt_utils_072 \ rpt_utils_073 \ rpt_utils_074 \ rpt_utils_075 \ rpt_utils_076 \ rpt_utils_077 \ rpt_utils_078 \ rpt_utils_079 \ rpt_utils_080 \ rpt_utils_081 \ rpt_utils_082 \ rpt_utils_1000 check_PROGRAMS = $(TESTS) rpt_utils_000_SOURCES = rpt_utils_000.c nodist_rpt_utils_000_SOURCES = $(REMOTE_SOURCES) rpt_utils_001_SOURCES = rpt_utils_001.c nodist_rpt_utils_001_SOURCES = $(REMOTE_SOURCES) rpt_utils_002_SOURCES = rpt_utils_002.c nodist_rpt_utils_002_SOURCES = $(REMOTE_SOURCES) rpt_utils_003_SOURCES = rpt_utils_003.c nodist_rpt_utils_003_SOURCES = $(REMOTE_SOURCES) rpt_utils_004_SOURCES = rpt_utils_004.c nodist_rpt_utils_004_SOURCES = $(REMOTE_SOURCES) rpt_utils_005_SOURCES = rpt_utils_005.c nodist_rpt_utils_005_SOURCES = $(REMOTE_SOURCES) rpt_utils_006_SOURCES = rpt_utils_006.c nodist_rpt_utils_006_SOURCES = $(REMOTE_SOURCES) rpt_utils_007_SOURCES = rpt_utils_007.c nodist_rpt_utils_007_SOURCES = $(REMOTE_SOURCES) rpt_utils_008_SOURCES = rpt_utils_008.c nodist_rpt_utils_008_SOURCES = $(REMOTE_SOURCES) rpt_utils_009_SOURCES = rpt_utils_009.c nodist_rpt_utils_009_SOURCES = $(REMOTE_SOURCES) rpt_utils_010_SOURCES = rpt_utils_010.c nodist_rpt_utils_010_SOURCES = $(REMOTE_SOURCES) rpt_utils_011_SOURCES = rpt_utils_011.c nodist_rpt_utils_011_SOURCES = $(REMOTE_SOURCES) rpt_utils_012_SOURCES = rpt_utils_012.c nodist_rpt_utils_012_SOURCES = $(REMOTE_SOURCES) rpt_utils_013_SOURCES = rpt_utils_013.c nodist_rpt_utils_013_SOURCES = $(REMOTE_SOURCES) rpt_utils_014_SOURCES = rpt_utils_014.c nodist_rpt_utils_014_SOURCES = $(REMOTE_SOURCES) rpt_utils_015_SOURCES = rpt_utils_015.c nodist_rpt_utils_015_SOURCES = $(REMOTE_SOURCES) rpt_utils_016_SOURCES = rpt_utils_016.c nodist_rpt_utils_016_SOURCES = $(REMOTE_SOURCES) rpt_utils_017_SOURCES = rpt_utils_017.c nodist_rpt_utils_017_SOURCES = $(REMOTE_SOURCES) rpt_utils_018_SOURCES = rpt_utils_018.c nodist_rpt_utils_018_SOURCES = $(REMOTE_SOURCES) rpt_utils_019_SOURCES = rpt_utils_019.c nodist_rpt_utils_019_SOURCES = $(REMOTE_SOURCES) rpt_utils_020_SOURCES = rpt_utils_020.c nodist_rpt_utils_020_SOURCES = $(REMOTE_SOURCES) rpt_utils_021_SOURCES = rpt_utils_021.c nodist_rpt_utils_021_SOURCES = $(REMOTE_SOURCES) rpt_utils_022_SOURCES = rpt_utils_022.c nodist_rpt_utils_022_SOURCES = $(REMOTE_SOURCES) rpt_utils_023_SOURCES = rpt_utils_023.c nodist_rpt_utils_023_SOURCES = $(REMOTE_SOURCES) rpt_utils_024_SOURCES = rpt_utils_024.c nodist_rpt_utils_024_SOURCES = $(REMOTE_SOURCES) rpt_utils_025_SOURCES = rpt_utils_025.c nodist_rpt_utils_025_SOURCES = $(REMOTE_SOURCES) rpt_utils_026_SOURCES = rpt_utils_026.c nodist_rpt_utils_026_SOURCES = $(REMOTE_SOURCES) rpt_utils_027_SOURCES = rpt_utils_027.c nodist_rpt_utils_027_SOURCES = $(REMOTE_SOURCES) rpt_utils_028_SOURCES = rpt_utils_028.c nodist_rpt_utils_028_SOURCES = $(REMOTE_SOURCES) rpt_utils_029_SOURCES = rpt_utils_029.c nodist_rpt_utils_029_SOURCES = $(REMOTE_SOURCES) rpt_utils_030_SOURCES = rpt_utils_030.c nodist_rpt_utils_030_SOURCES = $(REMOTE_SOURCES) rpt_utils_031_SOURCES = rpt_utils_031.c nodist_rpt_utils_031_SOURCES = $(REMOTE_SOURCES) rpt_utils_032_SOURCES = rpt_utils_032.c nodist_rpt_utils_032_SOURCES = $(REMOTE_SOURCES) rpt_utils_033_SOURCES = rpt_utils_033.c nodist_rpt_utils_033_SOURCES = $(REMOTE_SOURCES) rpt_utils_034_SOURCES = rpt_utils_034.c nodist_rpt_utils_034_SOURCES = $(REMOTE_SOURCES) rpt_utils_035_SOURCES = rpt_utils_035.c nodist_rpt_utils_035_SOURCES = $(REMOTE_SOURCES) rpt_utils_037_SOURCES = rpt_utils_037.c nodist_rpt_utils_037_SOURCES = $(REMOTE_SOURCES) rpt_utils_038_SOURCES = rpt_utils_038.c nodist_rpt_utils_038_SOURCES = $(REMOTE_SOURCES) rpt_utils_039_SOURCES = rpt_utils_039.c nodist_rpt_utils_039_SOURCES = $(REMOTE_SOURCES) rpt_utils_040_SOURCES = rpt_utils_040.c nodist_rpt_utils_040_SOURCES = $(REMOTE_SOURCES) rpt_utils_041_SOURCES = rpt_utils_041.c nodist_rpt_utils_041_SOURCES = $(REMOTE_SOURCES) rpt_utils_042_SOURCES = rpt_utils_042.c nodist_rpt_utils_042_SOURCES = $(REMOTE_SOURCES) rpt_utils_043_SOURCES = rpt_utils_043.c nodist_rpt_utils_043_SOURCES = $(REMOTE_SOURCES) rpt_utils_044_SOURCES = rpt_utils_044.c nodist_rpt_utils_044_SOURCES = $(REMOTE_SOURCES) rpt_utils_045_SOURCES = rpt_utils_045.c nodist_rpt_utils_045_SOURCES = $(REMOTE_SOURCES) rpt_utils_046_SOURCES = rpt_utils_046.c nodist_rpt_utils_046_SOURCES = $(REMOTE_SOURCES) rpt_utils_047_SOURCES = rpt_utils_047.c nodist_rpt_utils_047_SOURCES = $(REMOTE_SOURCES) rpt_utils_048_SOURCES = rpt_utils_048.c nodist_rpt_utils_048_SOURCES = $(REMOTE_SOURCES) rpt_utils_049_SOURCES = rpt_utils_049.c nodist_rpt_utils_049_SOURCES = $(REMOTE_SOURCES) rpt_utils_050_SOURCES = rpt_utils_050.c nodist_rpt_utils_050_SOURCES = $(REMOTE_SOURCES) rpt_utils_051_SOURCES = rpt_utils_051.c nodist_rpt_utils_051_SOURCES = $(REMOTE_SOURCES) rpt_utils_052_SOURCES = rpt_utils_052.c nodist_rpt_utils_052_SOURCES = $(REMOTE_SOURCES) rpt_utils_053_SOURCES = rpt_utils_053.c nodist_rpt_utils_053_SOURCES = $(REMOTE_SOURCES) rpt_utils_054_SOURCES = rpt_utils_054.c nodist_rpt_utils_054_SOURCES = $(REMOTE_SOURCES) rpt_utils_055_SOURCES = rpt_utils_055.c nodist_rpt_utils_055_SOURCES = $(REMOTE_SOURCES) rpt_utils_056_SOURCES = rpt_utils_056.c nodist_rpt_utils_056_SOURCES = $(REMOTE_SOURCES) rpt_utils_057_SOURCES = rpt_utils_057.c nodist_rpt_utils_057_SOURCES = $(REMOTE_SOURCES) rpt_utils_058_SOURCES = rpt_utils_058.c nodist_rpt_utils_058_SOURCES = $(REMOTE_SOURCES) rpt_utils_059_SOURCES = rpt_utils_059.c nodist_rpt_utils_059_SOURCES = $(REMOTE_SOURCES) rpt_utils_060_SOURCES = rpt_utils_060.c nodist_rpt_utils_060_SOURCES = $(REMOTE_SOURCES) rpt_utils_061_SOURCES = rpt_utils_061.c nodist_rpt_utils_061_SOURCES = $(REMOTE_SOURCES) rpt_utils_062_SOURCES = rpt_utils_062.c nodist_rpt_utils_062_SOURCES = $(REMOTE_SOURCES) rpt_utils_063_SOURCES = rpt_utils_063.c nodist_rpt_utils_063_SOURCES = $(REMOTE_SOURCES) rpt_utils_064_SOURCES = rpt_utils_064.c nodist_rpt_utils_064_SOURCES = $(REMOTE_SOURCES) rpt_utils_065_SOURCES = rpt_utils_065.c nodist_rpt_utils_065_SOURCES = $(REMOTE_SOURCES) rpt_utils_066_SOURCES = rpt_utils_066.c nodist_rpt_utils_066_SOURCES = $(REMOTE_SOURCES) rpt_utils_067_SOURCES = rpt_utils_067.c nodist_rpt_utils_067_SOURCES = $(REMOTE_SOURCES) rpt_utils_068_SOURCES = rpt_utils_068.c nodist_rpt_utils_068_SOURCES = $(REMOTE_SOURCES) rpt_utils_069_SOURCES = rpt_utils_069.c nodist_rpt_utils_069_SOURCES = $(REMOTE_SOURCES) rpt_utils_070_SOURCES = rpt_utils_070.c nodist_rpt_utils_070_SOURCES = $(REMOTE_SOURCES) rpt_utils_071_SOURCES = rpt_utils_071.c nodist_rpt_utils_071_SOURCES = $(REMOTE_SOURCES) rpt_utils_072_SOURCES = rpt_utils_072.c nodist_rpt_utils_072_SOURCES = $(REMOTE_SOURCES) rpt_utils_073_SOURCES = rpt_utils_073.c nodist_rpt_utils_073_SOURCES = $(REMOTE_SOURCES) rpt_utils_074_SOURCES = rpt_utils_074.c nodist_rpt_utils_074_SOURCES = $(REMOTE_SOURCES) rpt_utils_075_SOURCES = rpt_utils_075.c nodist_rpt_utils_075_SOURCES = $(REMOTE_SOURCES) rpt_utils_076_SOURCES = rpt_utils_076.c nodist_rpt_utils_076_SOURCES = $(REMOTE_SOURCES) rpt_utils_077_SOURCES = rpt_utils_077.c nodist_rpt_utils_077_SOURCES = $(REMOTE_SOURCES) rpt_utils_078_SOURCES = rpt_utils_078.c nodist_rpt_utils_078_SOURCES = $(REMOTE_SOURCES) rpt_utils_079_SOURCES = rpt_utils_079.c nodist_rpt_utils_079_SOURCES = $(REMOTE_SOURCES) rpt_utils_080_SOURCES = rpt_utils_080.c nodist_rpt_utils_080_SOURCES = $(REMOTE_SOURCES) rpt_utils_081_SOURCES = rpt_utils_081.c nodist_rpt_utils_081_SOURCES = $(REMOTE_SOURCES) rpt_utils_082_SOURCES = rpt_utils_082.c nodist_rpt_utils_082_SOURCES = $(REMOTE_SOURCES) rpt_utils_1000_SOURCES = rpt_utils_1000.c nodist_rpt_utils_1000_SOURCES = $(REMOTE_SOURCES) openhpi-3.6.1/utils/t/rpt/rpt_utils_020.c0000644000175100017510000000171112575647301017147 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds 1 resource to it * with a null table. Passes the test if the interface returns an error, * else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = NULL; if (!oh_add_resource(rptable, rptentries, NULL, 0)) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_074.c0000644000175100017510000000246512575647301017167 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Invokes rpt_diff with new_res param as NULL. * If it returns error, the test passes, otherwise it failed. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *curr_table = (RPTable *)g_malloc0(sizeof(RPTable)); RPTable *new_table = (RPTable *)g_malloc0(sizeof(RPTable)); GSList *new_rdr = NULL, *gone_res = NULL, *gone_rdr = NULL; oh_init_rpt(curr_table); oh_init_rpt(new_table); if (oh_add_resource(curr_table, rptentries, NULL, 0)) return 1; if (oh_add_resource(new_table, rptentries + 1, NULL, 0)) return 1; if (!rpt_diff(curr_table, new_table, NULL, &new_rdr, &gone_res, &gone_rdr)) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_054.c0000644000175100017510000000263712575647301017166 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starts with an RPTable of 1 resource, adds 5 sensors ++to first resource. * Fetches an rdr by type using a NULL table. * Success if the interface returns an error, otherwise there was a failure. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); guint i; if (oh_add_resource(rptable, rptentries, NULL, 1)) return 1; for (i = 0; i < 5; i++) { if (oh_add_rdr(rptable, rptentries[0].ResourceId, sensors+i, NULL, 1)) return 1; } if (oh_get_rdr_by_type(NULL, rptentries[0].ResourceId, sensors[0].RdrType, sensors[0].RdrTypeUnion.SensorRec.Num)) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_048.c0000644000175100017510000000244312575647301017164 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starts with an RPTable of 1 resource, adds 1 rdr with data * to first resource. Fetches data using a NULL table. * Success if the interface returns an error, otherwise there was a failure. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); gchar *data = "My data"; if (oh_add_resource(rptable, rptentries, NULL, 1)) return 1; if (oh_add_rdr(rptable, rptentries[0].ResourceId, sensors, data, 1)) return 1; if (oh_get_rdr_data(NULL, rptentries[0].ResourceId, sensors[0].RecordId)) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_033.c0000644000175100017510000000267512575647301017165 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds 10 resources to it. * Fetches the first resource back by id using SAHPI_FIRST_ENTRY for a Resource Id. * Passes the test if the interface returns the resource, else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); SaHpiRptEntryT *tmpentry = NULL; guint i; for (i = 0; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries+i, NULL, 1)) return 1; } tmpentry = oh_get_resource_by_id(rptable, SAHPI_FIRST_ENTRY); if (!tmpentry) return 1; if (tmpentry->ResourceId != rptentries[0].ResourceId) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_059.c0000644000175100017510000000257412575647301017173 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starts with an RPTable of 1 resource, adds 5 sensors ++to first resource. * Fetches an rdr using get_next with the Record Id as SAHPI_FIRST_ENTRY. * Success if the interface returns a valid pointer, otherwise there was a failure. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); guint i; if (oh_add_resource(rptable, rptentries, NULL, 1)) return 1; for (i = 0; i < 5; i++) { if (oh_add_rdr(rptable, rptentries[0].ResourceId, sensors+i, NULL, 1)) return 1; } if (!oh_get_rdr_next(rptable, rptentries[0].ResourceId, SAHPI_FIRST_ENTRY)) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_071.c0000644000175100017510000000151012575647301017152 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Invoke oh_init_rpt with a NULL param. * If it returns error, the test passes, otherwise it failed. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { if (!oh_init_rpt(NULL)) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_032.c0000644000175100017510000000241012575647301017147 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds 10 resources to it. * Fetches the resource back by id using a Resource Id not present in the table. * Passes the test if the interface returns NULL, else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); guint i; for (i = 0; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries+i, NULL, 1)) return 1; } if (oh_get_resource_by_id(rptable, 1234567)) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_073.c0000644000175100017510000000250712575647301017163 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Invokes rpt_diff with new table param as NULL. * If it returns error, the test passes, otherwise it failed. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *curr_table = (RPTable *)g_malloc0(sizeof(RPTable)); RPTable *new_table = (RPTable *)g_malloc0(sizeof(RPTable)); GSList *new_res = NULL, *new_rdr = NULL, *gone_res = NULL, *gone_rdr = NULL; oh_init_rpt(curr_table); oh_init_rpt(new_table); if (oh_add_resource(curr_table, rptentries, NULL, 0)) return 1; if (oh_add_resource(new_table, rptentries + 1, NULL, 0)) return 1; if (!rpt_diff(curr_table, NULL, &new_res, &new_rdr, &gone_res, &gone_rdr)) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_063.c0000644000175100017510000000257112575647301017163 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds 1 resource to it * and then adds 1 rdr to it. Removes rdr using a special value like * SAHPI_FIRST_ENTRY. * Passes the test if the interface returns ok, else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); guint i; for (i = 0; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries+i, NULL, 0)) return 1; } if (oh_add_rdr(rptable, rptentries[0].ResourceId, sensors, NULL, 1)) return 1; if (oh_remove_rdr(rptable, rptentries[0].ResourceId, SAHPI_FIRST_ENTRY)) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_004.c0000644000175100017510000000407612575647301017160 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include #include /** * main: Starts with an RPTable of 10 resources and fetches * them randomly by the Entity Path and compares them against the original * resource. A failed comparison means the test failed, * otherwise the test passed. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); guint i = 0, k = 0; GSList *resources = NULL; for (i = 0; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries + i, NULL, 0)) return 1; else resources = g_slist_append(resources, rptentries + i); } for (; resources; i--) { SaHpiRptEntryT *randentry = NULL, *tmpentry = NULL; GSList *tmpnode = NULL; k = (guint) (((gfloat)i)*rand()/(RAND_MAX+1.0)); tmpnode = g_slist_nth(resources, k); randentry = (SaHpiRptEntryT *)tmpnode->data; tmpentry = oh_get_resource_by_ep(rptable, &(randentry->ResourceEntity)); if (!tmpentry || memcmp(randentry, tmpentry, sizeof(SaHpiRptEntryT))) return 1; else { resources = g_slist_remove_link(resources, tmpnode); g_slist_free_1(tmpnode); } } return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_005.c0000644000175100017510000000426212575647301017156 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include #include /** * main: Starts with an RPTable of 10 resources with data and fetches * them randomly by the Resource Id and compares the data against * the original data. A failed comparison means the test failed, * otherwise the test passed. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); guint i = 0, k = 0; GSList *resources = NULL; for (i = 0; rptentries[i].ResourceId != 0; i++) { guint *data = (guint *)g_malloc0(sizeof(guint)); *data = rptentries[i].ResourceId; if (oh_add_resource(rptable, rptentries + i, data, 0)) return 1; else resources = g_slist_append(resources, rptentries + i); } for (; resources; i--) { SaHpiRptEntryT *randentry = NULL; guint *data = NULL; GSList *tmpnode = NULL; k = (guint) (((gfloat)i)*rand()/(RAND_MAX+1.0)); tmpnode = g_slist_nth(resources, k); randentry = (SaHpiRptEntryT *)tmpnode->data; data = (guint *) oh_get_resource_data(rptable, randentry->ResourceId); if (!data || *data != randentry->ResourceId) return 1; else { resources = g_slist_remove_link(resources, tmpnode); g_slist_free_1(tmpnode); } } return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_013.c0000644000175100017510000000333212575647301017152 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales * */ #include #include #include #include #include /** * main: Starts with an RPTable of 10 resources, adds 5 rdr * to first resource. Fetches sensors ++in sequence by record id and compares * with original. A failed comparison means the test failed, * otherwise the test passed. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); SaHpiRdrT *tmprdr = NULL; guint i = 0; for (i = 0; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries + i, NULL, 0)) return 1; } for (i = 0; i < 5; i++) { if (oh_add_rdr(rptable, SAHPI_FIRST_ENTRY, sensors + i, NULL,0)) return 1; } for (i = 0, tmprdr = oh_get_rdr_by_id(rptable, SAHPI_FIRST_ENTRY, SAHPI_FIRST_ENTRY); tmprdr; tmprdr = oh_get_rdr_next(rptable, SAHPI_FIRST_ENTRY, tmprdr->RecordId)) { if (memcmp(sensors + (i++), tmprdr, sizeof(SaHpiRdrT))) return 1; } return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_025.c0000644000175100017510000000235112575647301017155 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds 10 resources to it * and removes one by specifying a Resource Id not present in the table. * Passes the test if the interface returns an error, else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); guint i; for (i = 0; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries+i, NULL, 0)) return 1; } if (!oh_remove_resource(rptable, 1234567)) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_077.c0000644000175100017510000000246412575647301017171 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Invokes rpt_diff with gone_rdr param as NULL. * If it returns error, the test passes, otherwise it failed. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *curr_table = (RPTable *)g_malloc0(sizeof(RPTable)); RPTable *new_table = (RPTable *)g_malloc0(sizeof(RPTable)); GSList *new_res = NULL, *new_rdr = NULL, *gone_res = NULL; oh_init_rpt(curr_table); oh_init_rpt(new_table); if (oh_add_resource(curr_table, rptentries, NULL, 0)) return 1; if (oh_add_resource(new_table, rptentries + 1, NULL, 0)) return 1; if (!rpt_diff(curr_table, new_table, &new_res, &new_rdr, &gone_res, NULL)) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_011.c0000644000175100017510000000460412575647301017153 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include #include /** * main: Starts with an RPTable of 10 resources, adds 5 rdr * to first resource. Fetches sensors ++randomly by record id and compares * with original. A failed comparison means the test failed, * otherwise the test passed. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); GSList *records = NULL; guint i = 0; for (i = 0; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries + i, NULL, 0)) return 1; } for (i = 0; i < 5; i++) { if (oh_add_rdr(rptable, SAHPI_FIRST_ENTRY, sensors + i, NULL,0)) return 1; else records = g_slist_append(records, sensors + i); } for (; records; i--) { SaHpiRdrT *tmprdr = NULL, *randrdr = NULL; GSList *tmpnode = NULL; guint k = (guint) (((gfloat)i)*rand()/(RAND_MAX+1.0)); tmpnode = g_slist_nth(records, k); randrdr = (SaHpiRdrT *)tmpnode->data; randrdr->RecordId = oh_get_rdr_uid(randrdr->RdrType, randrdr->RdrTypeUnion.SensorRec.Num); tmprdr = oh_get_rdr_by_id(rptable, SAHPI_FIRST_ENTRY, randrdr->RecordId); if (!tmprdr || memcmp(randrdr, tmprdr, sizeof(SaHpiRdrT))) return 1; else { records = g_slist_remove_link(records, tmpnode); g_slist_free_1(tmpnode); } } return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_044.c0000644000175100017510000000220212575647301017151 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds 1 resource to it * and then adds 1 NULL rdr to it using a NULL table. * Passes the test if the interface returns an error, else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); if (oh_add_resource(rptable, rptentries, NULL, 0)) return 1; if (!oh_add_rdr(NULL, rptentries[0].ResourceId, NULL, NULL, 1)) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_058.c0000644000175100017510000000255712575647301017173 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starts with an RPTable of 1 resource, adds 5 sensors ++to first resource. * Fetches an rdr using get_next with a Record Id not present in the resource. * Success if the interface returns an error, otherwise there was a failure. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); guint i; if (oh_add_resource(rptable, rptentries, NULL, 1)) return 1; for (i = 0; i < 5; i++) { if (oh_add_rdr(rptable, rptentries[0].ResourceId, sensors+i, NULL, 1)) return 1; } if (oh_get_rdr_next(rptable, rptentries[0].ResourceId, 1234567)) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_078.c0000644000175100017510000000325112575647301017165 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: resource must NOT have SAHPI_CAPABILITY_AGGREGATE_STATUS capability, * sensor num should be between SAHPI_STANDARD_SENSOR_MIN and * SAHPI_STANDARD_SENSOR_MAX and less than SENSOR_AGGREGATE_MAX. * With these conditions, oh_add_rdr is expected to return an error. * This is because for a sensor to have a num in the reserved range, * the resource must have SAHPI_CAPABILITY_AGGREGATE_STATUS capability * set. * If so, the test passes, otherwise it failed. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); guint i; rptentries[0].ResourceCapabilities = rptentries[0].ResourceCapabilities & 0xFFFFDFFF; for (i = 0; rptentries[i].ResourceId; i++) { if (oh_add_resource(rptable, rptentries+i, NULL, 0)) return 1; } sensors[0].RdrTypeUnion.SensorRec.Num = SAHPI_STANDARD_SENSOR_MIN; if (!oh_add_rdr(rptable, SAHPI_FIRST_ENTRY, sensors, NULL, 1)) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_068.c0000644000175100017510000000262312575647301017166 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds 1 resource to it. * Checks rpt info to see if update count was updated. * If not updated, the test failed, otherwise the test passed. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); SaHpiUint32T update_count, update_count_new; SaHpiTimeT update_timestamp; update_count = rptable->update_count; if (oh_get_rpt_info(rptable, &update_count, &update_timestamp)) return 1; if (oh_add_resource(rptable, rptentries, NULL, 0)) return 1; if (oh_get_rpt_info(rptable, &update_count_new, &update_timestamp)) return 1; if (update_count_new != update_count + 1) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_052.c0000644000175100017510000000256312575647301017162 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starts with an RPTable of 1 resource, adds 5 sensors ++to first resource. * Fetches an rdr by id using a Resource Id not present in the table. * Success if the interface returns an error, otherwise there was a failure. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); guint i; if (oh_add_resource(rptable, rptentries, NULL, 1)) return 1; for (i = 0; i < 5; i++) { if (oh_add_rdr(rptable, rptentries[0].ResourceId, sensors+i, NULL, 1)) return 1; } if (oh_get_rdr_by_id(rptable, rptentries[1].ResourceId, sensors[0].RecordId)) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_081.c0000644000175100017510000000461512575647301017164 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include #include /** * main: Starts with an RPTable of 10 resources, adds 5 watchdog rdr * to first resource. Fetches watchdogs ++randomly by record id and compares * with original. A failed comparison means the test failed, * otherwise the test passed. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); GSList *records = NULL; guint i = 0; for (i = 0; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries + i, NULL, 0)) return 1; } for (i = 0; i < 5; i++) { if (oh_add_rdr(rptable, SAHPI_FIRST_ENTRY, watchdogs + i, NULL,0)) return 1; else records = g_slist_append(records, watchdogs + i); } for (; records; i--) { SaHpiRdrT *tmprdr = NULL, *randrdr = NULL; GSList *tmpnode = NULL; guint k = (guint) (((gfloat)i)*rand()/(RAND_MAX+1.0)); tmpnode = g_slist_nth(records, k); randrdr = (SaHpiRdrT *)tmpnode->data; randrdr->RecordId = oh_get_rdr_uid(randrdr->RdrType, randrdr->RdrTypeUnion.WatchdogRec.WatchdogNum); tmprdr = oh_get_rdr_by_id(rptable, SAHPI_FIRST_ENTRY, randrdr->RecordId); if (!tmprdr || memcmp(randrdr, tmprdr, sizeof(SaHpiRdrT))) return 1; else { records = g_slist_remove_link(records, tmpnode); g_slist_free_1(tmpnode); } } return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_001.c0000644000175100017510000000246112575647301017151 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds 1 resource to it * and tries to fetch it by the entity path and compare it against * the original resource. A failed comparison means the test * failed, otherwise the test passed. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); SaHpiRptEntryT *tmpentry = NULL; if (oh_add_resource(rptable, rptentries, NULL, 0)) return 1; tmpentry = oh_get_resource_by_ep(rptable, &(rptentries[0].ResourceEntity)); if (!tmpentry || memcmp(rptentries, tmpentry, sizeof(SaHpiRptEntryT))) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_035.c0000644000175100017510000000236612575647301017164 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds 2 resources to it. * Fetches the resource back by using an entity path not present in the table. * Passes the test if the interface returns NULL, else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); if (oh_add_resource(rptable, rptentries, NULL, 1)) return 1; if (oh_add_resource(rptable, rptentries+1, NULL, 1)) return 1; if (oh_get_resource_by_ep(rptable, &(rptentries[2].ResourceEntity))) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_079.c0000644000175100017510000000457512575647301017200 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include #include /** * main: Starts with an RPTable of 10 resources, adds 5 control rdr * to first resource. Fetches controls ++randomly by record id and compares * with original. A failed comparison means the test failed, * otherwise the test passed. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); GSList *records = NULL; guint i = 0; for (i = 0; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries + i, NULL, 0)) return 1; } for (i = 0; i < 5; i++) { if (oh_add_rdr(rptable, SAHPI_FIRST_ENTRY, controls + i, NULL,0)) return 1; else records = g_slist_append(records, controls + i); } for (; records; i--) { SaHpiRdrT *tmprdr = NULL, *randrdr = NULL; GSList *tmpnode = NULL; guint k = (guint) (((gfloat)i)*rand()/(RAND_MAX+1.0)); tmpnode = g_slist_nth(records, k); randrdr = (SaHpiRdrT *)tmpnode->data; randrdr->RecordId = oh_get_rdr_uid(randrdr->RdrType, randrdr->RdrTypeUnion.CtrlRec.Num); tmprdr = oh_get_rdr_by_id(rptable, SAHPI_FIRST_ENTRY, randrdr->RecordId); if (!tmprdr || memcmp(randrdr, tmprdr, sizeof(SaHpiRdrT))) return 1; else { records = g_slist_remove_link(records, tmpnode); g_slist_free_1(tmpnode); } } return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_067.c0000644000175100017510000000250012575647301017157 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds 10 resources to it * and then adds 1 rdr to it with an out-of-range instrument id. * Passes the test if the interface returns an error, else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); guint i; for (i = 0; rptentries[i].ResourceId; i++) { if (oh_add_resource(rptable, rptentries+i, NULL, 0)) return 1; } sensors[0].RdrTypeUnion.SensorRec.Num = SAHPI_STANDARD_SENSOR_MAX - 1; if (!oh_add_rdr(rptable, SAHPI_FIRST_ENTRY, sensors, NULL, 1)) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_047.c0000644000175100017510000000256212575647301017165 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds 1 resource to it * and then adds 1 rdr to it. Removes rdr using a Record Id not present * in the resource. * Passes the test if the interface returns an error, else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); guint i; for (i = 0; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries+i, NULL, 0)) return 1; } if (oh_add_rdr(rptable, rptentries[0].ResourceId, sensors, NULL, 1)) return 1; if (!oh_remove_rdr(rptable, rptentries[0].ResourceId, 20)) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_012.c0000644000175100017510000000470312575647301017154 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include #include /** * main: Starts with an RPTable of 10 resources, adds 5 rdr * to first resource. Fetches sensors ++randomly by type and compares * with original. A failed comparison means the test failed, * otherwise the test passed. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); GSList *records = NULL; guint i = 0; for (i = 0; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries + i, NULL, 0)) return 1; } for (i = 0; i < 5; i++) { if (oh_add_rdr(rptable, SAHPI_FIRST_ENTRY, sensors + i, NULL,0)) return 1; else records = g_slist_append(records, sensors + i); } for (; records; i--) { SaHpiRdrT *tmprdr = NULL, *randrdr = NULL; GSList *tmpnode = NULL; guint k = (guint) (((gfloat)i)*rand()/(RAND_MAX+1.0)); tmpnode = g_slist_nth(records, k); randrdr = (SaHpiRdrT *)tmpnode->data; randrdr->RecordId = oh_get_rdr_uid(randrdr->RdrType, randrdr->RdrTypeUnion.SensorRec.Num); tmprdr = oh_get_rdr_by_type(rptable, SAHPI_FIRST_ENTRY, randrdr->RdrType, randrdr->RdrTypeUnion.SensorRec.Num); if (!tmprdr || memcmp(randrdr, tmprdr, sizeof(SaHpiRdrT))) return 1; else { records = g_slist_remove_link(records, tmpnode); g_slist_free_1(tmpnode); } } return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_064.c0000644000175100017510000000247212575647301017164 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starts with an RPTable of 1 resource, adds 1 rdr with data * to first resource. Fetches data using a SAHPI_FIRST_ENTRY as the Record Id. * Success if the interface returns an ok, otherwise there was a failure. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); gchar *data = "My data"; if (oh_add_resource(rptable, rptentries, NULL, 1)) return 1; if (oh_add_rdr(rptable, rptentries[0].ResourceId, sensors, data, 1)) return 1; if (!oh_get_rdr_data(rptable, rptentries[0].ResourceId, SAHPI_FIRST_ENTRY)) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_066.c0000644000175100017510000000216012575647301017160 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds 1 resource to it * that has an invalid Resource Id like SAHPI_UNSPECIFIED_DOMAIN_ID. * Passes the test if the interface returns an error, else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); rptentries[0].ResourceId = SAHPI_UNSPECIFIED_DOMAIN_ID; if (!oh_add_resource(rptable, rptentries, NULL, 0)) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_019.c0000644000175100017510000000356412575647301017167 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starts with an RPTable of 10 resources, multiple rdrs * on some resources. Remove rdr. Check if resource was removed * searching for it in sequence. If not fail, else passed test. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); SaHpiRdrT *tmprdr = NULL; guint i = 0; for (i = 0; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries + i, NULL, 0)) return 1; } for (i = 0; i < 5; i++) { if (oh_add_rdr(rptable, SAHPI_FIRST_ENTRY, sensors + i, NULL,0)) return 1; } for (; i < 7; i++) { if (oh_add_rdr(rptable, rptentries[9].ResourceId, sensors + i, NULL,0)) return 1; } oh_remove_rdr(rptable, rptentries[0].ResourceId, sensors[1].RecordId); for (tmprdr = oh_get_rdr_by_id(rptable, rptentries[0].ResourceId, SAHPI_FIRST_ENTRY); tmprdr; tmprdr = oh_get_rdr_next(rptable, rptentries[0].ResourceId, tmprdr->RecordId)) { if (tmprdr->RecordId == sensors[1].RecordId) return 1; } return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_060.c0000644000175100017510000000256212575647301017160 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starts with an RPTable of 1 resource, adds 5 sensors ++to first resource. * Fetches an rdr using get_next with the last Record Id in the resource. * Success if the interface returns NULL, otherwise there was a failure. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); guint i; if (oh_add_resource(rptable, rptentries, NULL, 1)) return 1; for (i = 0; i < 5; i++) { if (oh_add_rdr(rptable, rptentries[0].ResourceId, sensors+i, NULL, 1)) return 1; } if (oh_get_rdr_next(rptable, rptentries[0].ResourceId, sensors[4].RecordId)) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_027.c0000644000175100017510000000226612575647301017164 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds 1 resource to it with data. * Fetches the data back using a NULL table as a parameter. * Passes the test if the interface returns NULL, else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); gchar *data = "My data"; if (oh_add_resource(rptable, rptentries, data, KEEP_RPT_DATA)) return 1; if (oh_get_resource_data(NULL, rptentries[0].ResourceId)) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_072.c0000644000175100017510000000245712575647301017166 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Invokes rpt_diff with current table param as NULL. * If it returns error, the test passes, otherwise it failed. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *curr_table = (RPTable *)g_malloc0(sizeof(RPTable)); RPTable *new_table = (RPTable *)g_malloc0(sizeof(RPTable)); GSList *new_res, *new_rdr, *gone_res, *gone_rdr; oh_init_rpt(curr_table); oh_init_rpt(new_table); if (oh_add_resource(curr_table, rptentries, NULL, 0)) return 1; if (oh_add_resource(new_table, rptentries + 1, NULL, 0)) return 1; if (!rpt_diff(NULL, new_table, &new_res, &new_rdr, &gone_res, &gone_rdr)) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_017.c0000644000175100017510000000333412575647301017160 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starts with an RPTable of 10 resources, multiple rdrs * on some resources. Remove rdr. Check if resource was removed * searching for it by id. If not fail, else passed test. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); SaHpiRdrT *tmprdr = NULL; guint i = 0; for (i = 0; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries + i, NULL, 0)) return 1; } for (i = 0; i < 5; i++) { if (oh_add_rdr(rptable, SAHPI_FIRST_ENTRY, sensors + i, NULL,0)) return 1; } for (; i < 7; i++) { if (oh_add_rdr(rptable, rptentries[9].ResourceId, sensors + i, NULL,0)) return 1; } oh_remove_rdr(rptable, rptentries[0].ResourceId, sensors[1].RecordId); tmprdr = oh_get_rdr_by_id(rptable, rptentries[0].ResourceId, sensors[1].RecordId); if (tmprdr) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_065.c0000644000175100017510000000255112575647301017163 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starts with an RPTable of 1 resource, adds 5 sensors ++to first resource. * Fetches an rdr by id using SAHPI_FIRST_ENTRY for the Record Id. * Success if the interface returns ok, otherwise there was a failure. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); guint i; if (oh_add_resource(rptable, rptentries, NULL, 1)) return 1; for (i = 0; i < 5; i++) { if (oh_add_rdr(rptable, rptentries[0].ResourceId, sensors+i, NULL, 1)) return 1; } if (!oh_get_rdr_by_id(rptable, rptentries[0].ResourceId, SAHPI_FIRST_ENTRY)) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_053.c0000644000175100017510000000255012575647301017157 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starts with an RPTable of 1 resource, adds 5 sensors ++to first resource. * Fetches an rdr by id using a Record Id not present in the resource. * Success if the interface returns an error, otherwise there was a failure. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); guint i; if (oh_add_resource(rptable, rptentries, NULL, 1)) return 1; for (i = 0; i < 5; i++) { if (oh_add_rdr(rptable, rptentries[0].ResourceId, sensors+i, NULL, 1)) return 1; } if (oh_get_rdr_by_id(rptable, rptentries[0].ResourceId, 1234567)) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_031.c0000644000175100017510000000217312575647301017154 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds 1 resource to it. * Fetches the resource back by id using a NULL table. * Passes the test if the interface returns NULL, else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); if (oh_add_resource(rptable, rptentries, NULL, 1)) return 1; if (oh_get_resource_by_id(NULL, rptentries[0].ResourceId)) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_016.c0000644000175100017510000000355412575647301017163 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starts with an RPTable of 10 resources, multiple rdrs * on some resources. Remove resource. Check if resource was removed * searching for it in sequence. If not fail, else passed test. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); SaHpiRptEntryT *tmpentry = NULL; guint i = 0; for (i = 0; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries + i, NULL, 0)) return 1; } for (i = 0; i < 5; i++) { if (oh_add_rdr(rptable, SAHPI_FIRST_ENTRY, sensors + i, NULL,0)) return 1; } for (; i < 7; i++) { if (oh_add_rdr(rptable, rptentries[9].ResourceId, sensors + i, NULL,0)) return 1; } oh_remove_resource(rptable, rptentries[0].ResourceId); for (tmpentry = oh_get_resource_by_id(rptable, SAHPI_FIRST_ENTRY); tmpentry; tmpentry = oh_get_resource_next(rptable, tmpentry->ResourceId)) { if (tmpentry->ResourceId == rptentries[0].ResourceId) return 1; } return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_041.c0000644000175100017510000000220612575647301017152 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds 1 resource to it * and then adds 1 rdr to it using NULL table. * Passes the test if the interface returns an error, else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); if (oh_add_resource(rptable, rptentries, NULL, 0)) return 1; if (!oh_add_rdr(NULL, rptentries[0].ResourceId, sensors, NULL, 1)) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_038.c0000644000175100017510000000235612575647301017166 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Adds 2 resources to an rpt table. * Fetches the 2nd resource through the get_next call * using a Resource Id not present in the table. * Passes the test if the interface returns NULL, else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); guint i; for (i = 0; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries+i, NULL, 1)) return 1; } if (oh_get_resource_next(rptable, 1234567)) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_056.c0000644000175100017510000000253512575647301017165 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starts with an RPTable of 1 resource, adds 5 sensors ++to first resource. * Fetches an rdr using get_next with a NULL table. * Success if the interface returns an error, otherwise there was a failure. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); guint i; if (oh_add_resource(rptable, rptentries, NULL, 1)) return 1; for (i = 0; i < 5; i++) { if (oh_add_rdr(rptable, rptentries[0].ResourceId, sensors+i, NULL, 1)) return 1; } if (oh_get_rdr_next(NULL, rptentries[0].ResourceId, sensors[0].RecordId)) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_030.c0000644000175100017510000000244412575647301017154 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds one resource to it with NULL data * and another with data. * Fetches the resource's NULL data back. * Passes the test if the interface returns the NULL data, else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); gchar *data = "My data"; if (oh_add_resource(rptable, rptentries, data, 1)) return 1; if (oh_add_resource(rptable, rptentries+1, NULL, 1)) return 1; if (oh_get_resource_data(rptable, rptentries[1].ResourceId)) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_1000.c0000644000175100017510000000330412575647301017226 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include #include /** * main: Adds 100 resources to RPTable. Fetches the hundredth resource * and times how long it took to fetch it. Fails if it can't get the resource. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); guint i = 0; struct timeval start, end; SaHpiRptEntryT *tmpentry = NULL; for (i = 1; i <= 10000; i++) { rptentries[0].ResourceId = i; rptentries[0].ResourceEntity.Entry[0].EntityLocation = i; oh_add_resource(rptable, rptentries, NULL, 0); } gettimeofday(&start, NULL); /*printf("Started at %ld.%ld\n",start.tv_sec,start.tv_usec);*/ if (!(tmpentry = oh_get_resource_by_ep(rptable, &(rptentries[0].ResourceEntity)))) return 1; gettimeofday(&end, NULL); /*printf("Ended at %ld.%ld\n",end.tv_sec,end.tv_usec);*/ printf("%ld.%ld seconds elapsed.\n",(long)(end.tv_sec - start.tv_sec),(long)(end.tv_usec - start.tv_usec)); return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_080.c0000644000175100017510000000461712575647301017165 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include #include /** * main: Starts with an RPTable of 10 resources, adds 5 inventory rdr * to first resource. Fetches inventories ++randomly by record id and compares * with original. A failed comparison means the test failed, * otherwise the test passed. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); GSList *records = NULL; guint i = 0; for (i = 0; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries + i, NULL, 0)) return 1; } for (i = 0; i < 5; i++) { if (oh_add_rdr(rptable, SAHPI_FIRST_ENTRY, inventories + i, NULL,0)) return 1; else records = g_slist_append(records, inventories + i); } for (; records; i--) { SaHpiRdrT *tmprdr = NULL, *randrdr = NULL; GSList *tmpnode = NULL; guint k = (guint) (((gfloat)i)*rand()/(RAND_MAX+1.0)); tmpnode = g_slist_nth(records, k); randrdr = (SaHpiRdrT *)tmpnode->data; randrdr->RecordId = oh_get_rdr_uid(randrdr->RdrType, randrdr->RdrTypeUnion.InventoryRec.IdrId); tmprdr = oh_get_rdr_by_id(rptable, SAHPI_FIRST_ENTRY, randrdr->RecordId); if (!tmprdr || memcmp(randrdr, tmprdr, sizeof(SaHpiRdrT))) return 1; else { records = g_slist_remove_link(records, tmpnode); g_slist_free_1(tmpnode); } } return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_061.c0000644000175100017510000000145512575647301017161 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starts with an empty RPTable. Invokes oh_flush on it. * Should return without crashing. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_flush_rpt(NULL); return 0; } openhpi-3.6.1/utils/t/rpt/rpt_resources.h0000644000175100017510000021017312575647301017451 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales * */ #ifndef RPT_RESOURCES_H #define RPT_RESOURCES_H #include SaHpiRptEntryT rptentries[] = { { .EntryId = 1, .ResourceId = 1, .ResourceInfo = { .ResourceRev = 1, .SpecificVer = 1, .DeviceSupport = 1, .ManufacturerId = 1, .ProductId = 1, .FirmwareMajorRev = 1, .FirmwareMinorRev = 1, .AuxFirmwareRev = 1 }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 14 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .ResourceCapabilities = SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_MAJOR, .ResourceTag = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 26, .Data = "This is data for blade 14." } }, { .EntryId = 2, .ResourceId = 2, .ResourceInfo = { .ResourceRev = 2, .SpecificVer = 2, .DeviceSupport = 2, .ManufacturerId = 2, .ProductId = 2, .FirmwareMajorRev = 2, .FirmwareMinorRev = 2, .AuxFirmwareRev = 2 }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 13 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .ResourceCapabilities = SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_MAJOR, .ResourceTag = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 26, .Data = "This is data for blade 13." } }, { .EntryId = 3, .ResourceId = 3, .ResourceInfo = { .ResourceRev = 3, .SpecificVer = 3, .DeviceSupport = 3, .ManufacturerId = 3, .ProductId = 3, .FirmwareMajorRev = 3, .FirmwareMinorRev = 3, .AuxFirmwareRev = 3 }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 12 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .ResourceCapabilities = SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_MAJOR, .ResourceTag = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 26, .Data = "This is data for blade 12." } }, { .EntryId = 4, .ResourceId = 4, .ResourceInfo = { .ResourceRev = 4, .SpecificVer = 4, .DeviceSupport = 4, .ManufacturerId = 4, .ProductId = 4, .FirmwareMajorRev = 4, .FirmwareMinorRev = 4, .AuxFirmwareRev = 4 }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 11 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 2 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .ResourceCapabilities = SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_MAJOR, .ResourceTag = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 26, .Data = "This is data for blade 11." } }, { .EntryId = 5, .ResourceId = 5, .ResourceInfo = { .ResourceRev = 5, .SpecificVer = 5, .DeviceSupport = 5, .ManufacturerId = 5, .ProductId = 5, .FirmwareMajorRev = 5, .FirmwareMinorRev = 5, .AuxFirmwareRev = 5 }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 10 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 2 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .ResourceCapabilities = SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_MAJOR, .ResourceTag = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 26, .Data = "This is data for blade 10." } }, { .EntryId = 6, .ResourceId = 6, .ResourceInfo = { .ResourceRev = 6, .SpecificVer = 6, .DeviceSupport = 6, .ManufacturerId = 6, .ProductId = 6, .FirmwareMajorRev = 6, .FirmwareMinorRev = 6, .AuxFirmwareRev = 6 }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 9 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 2 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .ResourceCapabilities = SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_MAJOR, .ResourceTag = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 25, .Data = "This is data for blade 9." } }, { .EntryId = 7, .ResourceId = 7, .ResourceInfo = { .ResourceRev = 7, .SpecificVer = 7, .DeviceSupport = 7, .ManufacturerId = 7, .ProductId = 7, .FirmwareMajorRev = 7, .FirmwareMinorRev = 7, .AuxFirmwareRev = 7 }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_SYS_MGMNT_MODULE, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .ResourceCapabilities = SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE, .ResourceSeverity = SAHPI_MAJOR, .ResourceTag = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 39, .Data = "This is data for the management module." } }, { .EntryId = 8, .ResourceId = 8, .ResourceInfo = { .ResourceRev = 8, .SpecificVer = 8, .DeviceSupport = 8, .ManufacturerId = 8, .ProductId = 8, .FirmwareMajorRev = 8, .FirmwareMinorRev = 8, .AuxFirmwareRev = 8 }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_INTERCONNECT, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .ResourceCapabilities = SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE, .ResourceSeverity = SAHPI_MAJOR, .ResourceTag = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 35, .Data = "This is data for the switch module." } }, { .EntryId = 9, .ResourceId = 9, .ResourceInfo = { .ResourceRev = 9, .SpecificVer = 9, .DeviceSupport = 9, .ManufacturerId = 9, .ProductId = 9, .FirmwareMajorRev = 9, .FirmwareMinorRev = 9, .AuxFirmwareRev = 9 }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_POWER_SUPPLY, .EntityLocation = 3 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 2 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .ResourceCapabilities = SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE, .ResourceSeverity = SAHPI_MAJOR, .ResourceTag = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 34, .Data = "This is data for the power module." } }, { .EntryId = 10, .ResourceId = 10, .ResourceInfo = { .ResourceRev = 10, .SpecificVer = 10, .DeviceSupport = 10, .ManufacturerId = 10, .ProductId = 10, .FirmwareMajorRev = 10, .FirmwareMinorRev = 10, .AuxFirmwareRev = 10 }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .ResourceCapabilities = SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_EVENT_LOG | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_CRITICAL, .ResourceTag = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 25, .Data = "This is data for chassis." } }, {} }; /***************** * Start of RDRs * *****************/ SaHpiRdrT sensors[] = { { .RdrType = SAHPI_SENSOR_RDR, .Entity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 14 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .RdrTypeUnion = { .SensorRec = { .Num = 1, .Type = SAHPI_PLATFORM_VIOLATION, .Category = SAHPI_EC_SEVERITY, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_OK | SAHPI_ES_CRITICAL, .EnableCtrl = SAHPI_FALSE, .DataFormat = { .BaseUnits = SAHPI_SU_UNSPECIFIED, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MIN | SAHPI_SRF_MAX, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value.SensorFloat64 = 1.0 }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value.SensorFloat64 = 0.0 } } }, .Oem = 1 } }, .IdString = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 22, .Data = "Sensor 1 for Blade 14." } }, { .RdrType = SAHPI_SENSOR_RDR, .Entity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 14 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .RdrTypeUnion = { .SensorRec = { .Num = 2, .Type = SAHPI_PLATFORM_VIOLATION, .Category = SAHPI_EC_SEVERITY, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_OK | SAHPI_ES_CRITICAL, .EnableCtrl = SAHPI_FALSE, .DataFormat = { .BaseUnits = SAHPI_SU_UNSPECIFIED, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MIN | SAHPI_SRF_MAX, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value.SensorFloat64 = 1.0 }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value.SensorFloat64 = 0.0 } } }, .Oem = 2 } }, .IdString = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 22, .Data = "Sensor 2 for Blade 14." } }, { .RdrType = SAHPI_SENSOR_RDR, .Entity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 14 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .RdrTypeUnion = { .SensorRec = { .Num = 3, .Type = SAHPI_PLATFORM_VIOLATION, .Category = SAHPI_EC_SEVERITY, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_OK | SAHPI_ES_CRITICAL, .EnableCtrl = SAHPI_FALSE, .DataFormat = { .BaseUnits = SAHPI_SU_UNSPECIFIED, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MIN | SAHPI_SRF_MAX, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value.SensorFloat64 = 1.0 }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value.SensorFloat64 = 0.0 } } }, .Oem = 3 } }, .IdString = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 22, .Data = "Sensor 3 for Blade 14." } }, { .RdrType = SAHPI_SENSOR_RDR, .Entity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 14 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .RdrTypeUnion = { .SensorRec = { .Num = 4, .Type = SAHPI_PLATFORM_VIOLATION, .Category = SAHPI_EC_SEVERITY, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_OK | SAHPI_ES_CRITICAL, .EnableCtrl = SAHPI_FALSE, .DataFormat = { .BaseUnits = SAHPI_SU_UNSPECIFIED, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MIN | SAHPI_SRF_MAX, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value.SensorFloat64 = 1.0 }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value.SensorFloat64 = 0.0 } } }, .Oem = 4 } }, .IdString = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 22, .Data = "Sensor 4 for Blade 14." } }, { .RdrType = SAHPI_SENSOR_RDR, .Entity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 14 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .RdrTypeUnion = { .SensorRec = { .Num = 5, .Type = SAHPI_PLATFORM_VIOLATION, .Category = SAHPI_EC_SEVERITY, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_OK | SAHPI_ES_CRITICAL, .EnableCtrl = SAHPI_FALSE, .DataFormat = { .BaseUnits = SAHPI_SU_UNSPECIFIED, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MIN | SAHPI_SRF_MAX, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value.SensorFloat64 = 1.0 }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value.SensorFloat64 = 0.0 } } }, .Oem = 5 } }, .IdString = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 22, .Data = "Sensor 5 for Blade 14." } }, { .RdrType = SAHPI_SENSOR_RDR, .Entity = { .Entry[0] = { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .RdrTypeUnion = { .SensorRec = { .Num = 1, .Type = SAHPI_PLATFORM_VIOLATION, .Category = SAHPI_EC_SEVERITY, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_OK | SAHPI_ES_CRITICAL, .EnableCtrl = SAHPI_FALSE, .DataFormat = { .BaseUnits = SAHPI_SU_UNSPECIFIED, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MIN | SAHPI_SRF_MAX, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value.SensorFloat64 = 1.0 }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value.SensorFloat64 = 0.0 } } }, .Oem = 6 } }, .IdString = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 21, .Data = "Sensor 1 for Chassis." } }, { .RdrType = SAHPI_SENSOR_RDR, .Entity = { .Entry[0] = { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .RdrTypeUnion = { .SensorRec = { .Num = 2, .Type = SAHPI_PLATFORM_VIOLATION, .Category = SAHPI_EC_SEVERITY, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_OK | SAHPI_ES_CRITICAL, .EnableCtrl = SAHPI_FALSE, .DataFormat = { .BaseUnits = SAHPI_SU_UNSPECIFIED, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MIN | SAHPI_SRF_MAX, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value.SensorFloat64 = 1.0 }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value.SensorFloat64 = 0.0 } } }, .Oem = 7 } }, .IdString = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 22, .Data = "Sensor 2 for Chassis." } }, {} }; SaHpiRdrT controls[] = { { .RdrType = SAHPI_CTRL_RDR, .Entity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 14 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .RdrTypeUnion = { .CtrlRec = { .Num = 1, .OutputType = SAHPI_CTRL_GENERIC, .Type = SAHPI_CTRL_TYPE_DIGITAL, .TypeUnion = { .Digital = { .Default = SAHPI_CTRL_STATE_OFF } }, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_MANUAL, .ReadOnly = SAHPI_TRUE }, .WriteOnly = SAHPI_FALSE, .Oem = 1 } }, .IdString = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 23, .Data = "Control 1 for Blade 14." } }, { .RdrType = SAHPI_CTRL_RDR, .Entity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 14 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .RdrTypeUnion = { .CtrlRec = { .Num = 2, .OutputType = SAHPI_CTRL_GENERIC, .Type = SAHPI_CTRL_TYPE_DIGITAL, .TypeUnion = { .Digital = { .Default = SAHPI_CTRL_STATE_OFF } }, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_MANUAL, .ReadOnly = SAHPI_TRUE }, .WriteOnly = SAHPI_FALSE, .Oem = 2 } }, .IdString = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 23, .Data = "Control 2 for Blade 14." } }, { .RdrType = SAHPI_CTRL_RDR, .Entity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 14 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .RdrTypeUnion = { .CtrlRec = { .Num = 3, .OutputType = SAHPI_CTRL_GENERIC, .Type = SAHPI_CTRL_TYPE_DIGITAL, .TypeUnion = { .Digital = { .Default = SAHPI_CTRL_STATE_OFF } }, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_MANUAL, .ReadOnly = SAHPI_TRUE }, .WriteOnly = SAHPI_FALSE, .Oem = 3 } }, .IdString = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 23, .Data = "Control 3 for Blade 14." } }, { .RdrType = SAHPI_CTRL_RDR, .Entity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 14 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .RdrTypeUnion = { .CtrlRec = { .Num = 4, .OutputType = SAHPI_CTRL_GENERIC, .Type = SAHPI_CTRL_TYPE_DIGITAL, .TypeUnion = { .Digital = { .Default = SAHPI_CTRL_STATE_OFF } }, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_MANUAL, .ReadOnly = SAHPI_TRUE }, .WriteOnly = SAHPI_FALSE, .Oem = 4 } }, .IdString = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 23, .Data = "Control 4 for Blade 14." } }, { .RdrType = SAHPI_CTRL_RDR, .Entity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 14 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .RdrTypeUnion = { .CtrlRec = { .Num = 5, .OutputType = SAHPI_CTRL_GENERIC, .Type = SAHPI_CTRL_TYPE_DIGITAL, .TypeUnion = { .Digital = { .Default = SAHPI_CTRL_STATE_OFF } }, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_MANUAL, .ReadOnly = SAHPI_TRUE }, .WriteOnly = SAHPI_FALSE, .Oem = 5 } }, .IdString = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 23, .Data = "Control 5 for Blade 14." } }, {} }; SaHpiRdrT inventories[] = { { .RdrType = SAHPI_INVENTORY_RDR, .Entity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 14 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .RdrTypeUnion = { .InventoryRec = { .IdrId = 1, .Persistent = SAHPI_TRUE, .Oem = 1 } }, .IdString = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 25, .Data = "Inventory 1 for Blade 14." } }, { .RdrType = SAHPI_INVENTORY_RDR, .Entity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 14 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .RdrTypeUnion = { .InventoryRec = { .IdrId = 2, .Persistent = SAHPI_TRUE, .Oem = 2 } }, .IdString = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 25, .Data = "Inventory 2 for Blade 14." } }, { .RdrType = SAHPI_INVENTORY_RDR, .Entity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 14 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .RdrTypeUnion = { .InventoryRec = { .IdrId = 3, .Persistent = SAHPI_TRUE, .Oem = 3 } }, .IdString = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 25, .Data = "Inventory 3 for Blade 14." } }, { .RdrType = SAHPI_INVENTORY_RDR, .Entity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 14 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .RdrTypeUnion = { .InventoryRec = { .IdrId = 4, .Persistent = SAHPI_TRUE, .Oem = 4 } }, .IdString = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 25, .Data = "Inventory 4 for Blade 14." } }, { .RdrType = SAHPI_INVENTORY_RDR, .Entity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 14 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .RdrTypeUnion = { .InventoryRec = { .IdrId = 5, .Persistent = SAHPI_TRUE, .Oem = 5 } }, .IdString = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 25, .Data = "Inventory 5 for Blade 14." } }, {} }; SaHpiRdrT watchdogs[] = { { .RdrType = SAHPI_WATCHDOG_RDR, .Entity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 14 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .RdrTypeUnion = { .WatchdogRec = { .WatchdogNum = 1, .Oem = 1 } }, .IdString = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 24, .Data = "Watchdog 1 for Blade 14." } }, { .RdrType = SAHPI_WATCHDOG_RDR, .Entity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 14 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .RdrTypeUnion = { .WatchdogRec = { .WatchdogNum = 2, .Oem = 2 } }, .IdString = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 24, .Data = "Watchdog 2 for Blade 14." } }, { .RdrType = SAHPI_WATCHDOG_RDR, .Entity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 14 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .RdrTypeUnion = { .WatchdogRec = { .WatchdogNum = 3, .Oem = 3 } }, .IdString = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 24, .Data = "Watchdog 3 for Blade 14." } }, { .RdrType = SAHPI_WATCHDOG_RDR, .Entity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 14 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .RdrTypeUnion = { .WatchdogRec = { .WatchdogNum = 4, .Oem = 4 } }, .IdString = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 24, .Data = "Watchdog 4 for Blade 14." } }, { .RdrType = SAHPI_WATCHDOG_RDR, .Entity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 14 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .RdrTypeUnion = { .WatchdogRec = { .WatchdogNum = 5, .Oem = 5 } }, .IdString = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 24, .Data = "Watchdog 5 for Blade 14." } }, {} }; SaHpiRdrT annunciators[] = { { .RdrType = SAHPI_ANNUNCIATOR_RDR, .Entity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 14 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .RdrTypeUnion = { .AnnunciatorRec = { .AnnunciatorNum = 1, .AnnunciatorType = SAHPI_ANNUNCIATOR_TYPE_LED, .ModeReadOnly = SAHPI_FALSE, .MaxConditions = 2, .Oem = 1 } }, .IdString = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 27, .Data = "Annunciator 1 for Blade 14." } }, { .RdrType = SAHPI_ANNUNCIATOR_RDR, .Entity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 14 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .RdrTypeUnion = { .AnnunciatorRec = { .AnnunciatorNum = 2, .AnnunciatorType = SAHPI_ANNUNCIATOR_TYPE_LED, .ModeReadOnly = SAHPI_FALSE, .MaxConditions = 2, .Oem = 2 } }, .IdString = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 27, .Data = "Annunciator 2 for Blade 14." } }, { .RdrType = SAHPI_ANNUNCIATOR_RDR, .Entity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 14 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .RdrTypeUnion = { .AnnunciatorRec = { .AnnunciatorNum = 3, .AnnunciatorType = SAHPI_ANNUNCIATOR_TYPE_LED, .ModeReadOnly = SAHPI_FALSE, .MaxConditions = 2, .Oem = 3 } }, .IdString = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 27, .Data = "Annunciator 3 for Blade 14." } }, { .RdrType = SAHPI_ANNUNCIATOR_RDR, .Entity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 14 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .RdrTypeUnion = { .AnnunciatorRec = { .AnnunciatorNum = 4, .AnnunciatorType = SAHPI_ANNUNCIATOR_TYPE_LED, .ModeReadOnly = SAHPI_FALSE, .MaxConditions = 2, .Oem = 4 } }, .IdString = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 27, .Data = "Annunciator 4 for Blade 14." } }, { .RdrType = SAHPI_ANNUNCIATOR_RDR, .Entity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 14 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .RdrTypeUnion = { .AnnunciatorRec = { .AnnunciatorNum = 5, .AnnunciatorType = SAHPI_ANNUNCIATOR_TYPE_LED, .ModeReadOnly = SAHPI_FALSE, .MaxConditions = 2, .Oem = 5 } }, .IdString = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 27, .Data = "Annunciator 5 for Blade 14." } }, {} }; #endif /* RPT_RESOURCES_H */ openhpi-3.6.1/utils/t/rpt/rpt_utils_002.c0000644000175100017510000000257312575647301017156 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds 1 resource to it * with data and then fetches the data of that resource to compare * it with the original data. * A failed comparison means the test failed, otherwise the test passed. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); void *data = NULL; char *res_data = "This is the resource's data...It's private."; unsigned int res_data_len = strlen(res_data); if (oh_add_resource(rptable, rptentries, res_data, 0)) return 1; data = oh_get_resource_data(rptable, rptentries[0].ResourceId); if (!data || memcmp(data, res_data, res_data_len)) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_055.c0000644000175100017510000000267412575647301017170 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starts with an RPTable of 1 resource, adds 5 sensors ++to first resource. * Fetches an rdr by type using a Resource Id not present in the table. * Success if the interface returns an error, otherwise there was a failure. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); guint i; if (oh_add_resource(rptable, rptentries, NULL, 1)) return 1; for (i = 0; i < 5; i++) { if (oh_add_rdr(rptable, rptentries[0].ResourceId, sensors+i, NULL, 1)) return 1; } if (oh_get_rdr_by_type(rptable, rptentries[1].ResourceId, sensors[0].RdrType, sensors[0].RdrTypeUnion.SensorRec.Num)) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_062.c0000644000175100017510000000336712575647301017166 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starts with an RPTable of 10 resources (one with data), adds 5 rdr * to first resource and 2 to the last one. * Invokes oh_flush on the table. * Should return without crashing and there should be no resources left * in the table. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); guint i; gchar *data = "My data."; if (oh_add_resource(rptable, rptentries, data, 1)) return 1; for (i = 1; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries + i, NULL, 0)) return 1; } for (i = 0; i < 5; i++) { if (oh_add_rdr(rptable, SAHPI_FIRST_ENTRY, sensors + i, NULL, 0)) return 1; } for (; i < 7; i++) { if (oh_add_rdr(rptable, rptentries[9].ResourceId, sensors + i, NULL, 0)) return 1; } oh_flush_rpt(rptable); if (oh_get_resource_by_id(rptable, SAHPI_FIRST_ENTRY)) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_007.c0000644000175100017510000000301712575647301017155 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starts with an RPTable of 10 resources, starting at * the beginning on going on to the next, compares * rpt entries against the originals. A failed comparison * means the test failed, otherwise the test passed. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); SaHpiRptEntryT *tmpentry = NULL; guint i = 0; for (i = 0; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries + i, NULL, 0)) return 1; } for (i = 0, tmpentry = oh_get_resource_by_id(rptable, SAHPI_FIRST_ENTRY); tmpentry; tmpentry = oh_get_resource_next(rptable, tmpentry->ResourceId)) { if (memcmp(rptentries+(i++), tmpentry, sizeof(SaHpiRptEntryT))) return 1; } return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_023.c0000644000175100017510000000155112575647301017154 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include /** * main: Starting with a NULL RPTable, adds a NULL resource to it. * Passes the test if the interface returns an error, else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { if (!oh_add_resource(NULL, NULL, NULL, 0)) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_021.c0000644000175100017510000000176212575647301017156 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds 1 NULL resource to it. * Passes the test if the interface returns an error, else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); if (!oh_add_resource(rptable, NULL, NULL, 0)) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_082.c0000644000175100017510000000461712575647301017167 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include #include /** * main: Starts with an RPTable of 10 resources, adds 5 annunciator rdr * to first resource. Fetches annunciators ++randomly by record id and compares * with original. A failed comparison means the test failed, * otherwise the test passed. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); GSList *records = NULL; guint i = 0; for (i = 0; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries + i, NULL, 0)) return 1; } for (i = 0; i < 5; i++) { if (oh_add_rdr(rptable, SAHPI_FIRST_ENTRY, annunciators + i, NULL,0)) return 1; else records = g_slist_append(records, annunciators + i); } for (; records; i--) { SaHpiRdrT *tmprdr = NULL, *randrdr = NULL; GSList *tmpnode = NULL; guint k = (guint) (((gfloat)i)*rand()/(RAND_MAX+1.0)); tmpnode = g_slist_nth(records, k); randrdr = (SaHpiRdrT *)tmpnode->data; randrdr->RecordId = oh_get_rdr_uid(randrdr->RdrType, randrdr->RdrTypeUnion.SensorRec.Num); tmprdr = oh_get_rdr_by_id(rptable, SAHPI_FIRST_ENTRY, randrdr->RecordId); if (!tmprdr || memcmp(randrdr, tmprdr, sizeof(SaHpiRdrT))) return 1; else { records = g_slist_remove_link(records, tmpnode); g_slist_free_1(tmpnode); } } return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_028.c0000644000175100017510000000252512575647301017163 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales * */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds 2 resources to it with data. * Fetches the data back using a Resource Id not present in the table. * Passes the test if the interface returns NULL, else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); gchar *data1 = "My data 1"; gchar *data2 = "My data 2"; if (oh_add_resource(rptable, rptentries, data1, KEEP_RPT_DATA)) return 1; if (oh_add_resource(rptable, rptentries+1, data2, KEEP_RPT_DATA)) return 1; if (oh_get_resource_data(rptable, rptentries[2].ResourceId)) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_015.c0000644000175100017510000000332012575647301017151 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starts with an RPTable of 10 resources, multiple rdrs * on some resources. Remove resource. Check if resource was removed * searching for it by entity path. If not fail, else passed test. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); SaHpiRptEntryT *tmpentry = NULL; guint i = 0; for (i = 0; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries + i, NULL, 0)) return 1; } for (i = 0; i < 5; i++) { if (oh_add_rdr(rptable, SAHPI_FIRST_ENTRY, sensors + i, NULL,0)) return 1; } for (; i < 7; i++) { if (oh_add_rdr(rptable, rptentries[9].ResourceId, sensors + i, NULL,0)) return 1; } oh_remove_resource(rptable, rptentries[0].ResourceId); tmpentry = oh_get_resource_by_ep(rptable, &(rptentries[0].ResourceEntity)); if (tmpentry) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_022.c0000644000175100017510000000213412575647301017151 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds 1 resource to it * that has an invalid Resource Id like SAHPI_FIRST_ENTRY. * Passes the test if the interface returns an error, else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); rptentries[0].ResourceId = SAHPI_FIRST_ENTRY; if (!oh_add_resource(rptable, rptentries, NULL, 0)) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_046.c0000644000175100017510000000257112575647301017164 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds 1 resource to it * and then adds 1 rdr to it. Removes rdr using a Resource Id not present * in the table. * Passes the test if the interface returns an error, else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); guint i; for (i = 0; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries+i, NULL, 0)) return 1; } if (oh_add_rdr(rptable, rptentries[0].ResourceId, sensors, NULL, 1)) return 1; if (!oh_remove_rdr(rptable, 1234567, sensors[0].RecordId)) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_008.c0000644000175100017510000000314112575647301017154 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include #include /** * main: Starts with an RPTable of 10 resources, starting at * a random resource on going on to the next, compares * resource ids against the originals. A failed comparison * means the test failed, otherwise the test passed. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); SaHpiRptEntryT *tmpentry = NULL; guint i = 0, k = 0; for (i = 0; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries + i, NULL, 0)) return 1; } k = (guint) (((gfloat)i)*rand()/(RAND_MAX+1.0)); for (tmpentry = oh_get_resource_by_id(rptable, rptentries[k].ResourceId); tmpentry; tmpentry = oh_get_resource_next(rptable, tmpentry->ResourceId)) { if (rptentries[k++].ResourceId != tmpentry->ResourceId) return 1; } return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_010.c0000644000175100017510000000344412575647301017153 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starts with an RPTable of 10 resources, adds 1 rdr * to first resource. Fetches rdr by its type and num and compares * with original. A failed comparison means the test failed, * otherwise the test passed. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); SaHpiEntryIdT record_id; SaHpiRdrT *tmprdr = NULL; guint i = 0; for (i = 0; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries + i, NULL, 0)) return 1; } if (oh_add_rdr(rptable, SAHPI_FIRST_ENTRY, sensors, NULL,0)) return 1; record_id = oh_get_rdr_uid(sensors[0].RdrType, sensors[0].RdrTypeUnion.SensorRec.Num); sensors[0].RecordId = record_id; tmprdr = oh_get_rdr_by_type(rptable, SAHPI_FIRST_ENTRY, sensors[0].RdrType, sensors[0].RdrTypeUnion.SensorRec.Num); if (!tmprdr || memcmp(sensors, tmprdr, sizeof(SaHpiRdrT))) return 1; return 0; } openhpi-3.6.1/utils/t/rpt/rpt_utils_050.c0000644000175100017510000000263712575647301017162 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include #include /** * main: Starts with an RPTable of 1 resource, adds 1 rdr with data * to first resource. Fetches data using a Record Id not present in the resource. * Success if the interface returns an error, otherwise there was a failure. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); gchar *data = "My data"; if (oh_add_resource(rptable, rptentries, NULL, 1)) return 1; if (oh_add_rdr(rptable, rptentries[0].ResourceId, sensors, data, 1)) return 1; if (oh_get_rdr_data(rptable, rptentries[0].ResourceId, 255)) { printf("Data: %s\n",(char *)oh_get_rdr_data(rptable, rptentries[0].ResourceId, 0)); return 1; } return 0; } openhpi-3.6.1/utils/t/Makefile.am0000644000175100017510000000325012575647301015624 0ustar mohanmohan# # Copyright (c) 2003, Intel Corporation # All rights reserved. # # Redistribution and use in source and binary forms, with or # without modification, are permitted provided that the following # conditions are met: # # Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the distribution. # # Neither the name of Intel Corporation nor the names # of its contributors may be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, # OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # MAINTAINERCLEANFILES = Makefile.in #EXTRA_DIST = SUBDIRS = epath rpt sahpi el uid ann DIST_SUBDIRS = epath rpt sahpi el uid ann openhpi-3.6.1/utils/t/ann/0000755000175100017510000000000012605014461014331 5ustar mohanmohanopenhpi-3.6.1/utils/t/ann/ann_test_004.c0000644000175100017510000000475312575647301016717 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include #include #include #include #include #include #include #include /** * main: Announcement test * * This test adds one announcement to the list * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_announcement *ann; SaHpiAnnouncementT announ; SaErrorT rc; announ.EntryId = 0; // modified by oh_announcement_append announ.Timestamp = 0; // modified by oh_announcement_append announ.AddedByUser = FALSE; // modified by oh_announcement_append announ.Severity = SAHPI_CRITICAL; announ.Acknowledged = FALSE; announ.StatusCond.Type= SAHPI_STATUS_COND_TYPE_SENSOR; announ.StatusCond.Entity.Entry[0].EntityType = SAHPI_ENT_SYSTEM_BOARD; announ.StatusCond.Entity.Entry[0].EntityLocation = 1; announ.StatusCond.Entity.Entry[1].EntityType = SAHPI_ENT_ROOT; announ.StatusCond.Entity.Entry[1].EntityLocation = 0; announ.StatusCond.DomainId = 1; announ.StatusCond.ResourceId = 1; announ.StatusCond.SensorNum = 1; announ.StatusCond.EventState = SAHPI_ES_UNSPECIFIED; announ.StatusCond.Name.Length = 5; memcpy(&announ.StatusCond.Name.Value,"announ", 5); announ.StatusCond.Mid = 123; /* we will not worry about the Data field for this test */ ann = oh_announcement_create(); rc = oh_announcement_append(ann, &announ); announ.Severity = SAHPI_MAJOR; rc = oh_announcement_append(ann, &announ); announ.Severity = SAHPI_MINOR; rc = oh_announcement_append(ann, &announ); rc = oh_announcement_get(ann, 2, &announ); if(announ.EntryId != 2) { CRIT("announ.EntryId invalid."); return 1; } if(announ.Severity != SAHPI_MAJOR) { CRIT("announ.Severity invalid."); return 1; } return 0; } openhpi-3.6.1/utils/t/ann/ann_test_007.c0000644000175100017510000000500712575647301016713 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include #include #include #include #include #include #include #include /** * main: Announcement test * * This test adds one announcement to the list * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_announcement *ann; SaHpiAnnouncementT announ; SaErrorT rc; announ.EntryId = 0; // modified by oh_announcement_append announ.Timestamp = 0; // modified by oh_announcement_append announ.AddedByUser = FALSE; // modified by oh_announcement_append announ.Severity = SAHPI_CRITICAL; announ.Acknowledged = FALSE; announ.StatusCond.Type= SAHPI_STATUS_COND_TYPE_SENSOR; announ.StatusCond.Entity.Entry[0].EntityType = SAHPI_ENT_SYSTEM_BOARD; announ.StatusCond.Entity.Entry[0].EntityLocation = 1; announ.StatusCond.Entity.Entry[1].EntityType = SAHPI_ENT_ROOT; announ.StatusCond.Entity.Entry[1].EntityLocation = 0; announ.StatusCond.DomainId = 1; announ.StatusCond.ResourceId = 1; announ.StatusCond.SensorNum = 1; announ.StatusCond.EventState = SAHPI_ES_UNSPECIFIED; announ.StatusCond.Name.Length = 5; memcpy(&announ.StatusCond.Name.Value,"announ", 5); announ.StatusCond.Mid = 123; /* we will not worry about the Data field for this test */ ann = oh_announcement_create(); rc = oh_announcement_append(ann, &announ); announ.Severity = SAHPI_MAJOR; rc = oh_announcement_append(ann, &announ); announ.Severity = SAHPI_MINOR; rc = oh_announcement_append(ann, &announ); rc = oh_announcement_del(ann, 2, SAHPI_MAJOR); if(rc != SA_OK) { CRIT("on_announcement_del returned %d.", rc); return 1; } if(g_list_length(ann->annentries) != 2) { CRIT("invalid number of announcements in list."); return 1; } return 0; } openhpi-3.6.1/utils/t/ann/ann_test_002.c0000644000175100017510000000441112575647301016704 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include #include #include #include #include #include #include #include /** * main: Announcement test * * This test adds one announcement to the list * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_announcement *ann; SaHpiAnnouncementT announ; SaErrorT rc; announ.EntryId = 0; // modified by oh_announcement_append announ.Timestamp = 0; // modified by oh_announcement_append announ.AddedByUser = FALSE; // modified by oh_announcement_append announ.Severity = SAHPI_CRITICAL; announ.Acknowledged = FALSE; announ.StatusCond.Type= SAHPI_STATUS_COND_TYPE_SENSOR; announ.StatusCond.Entity.Entry[0].EntityType = SAHPI_ENT_SYSTEM_BOARD; announ.StatusCond.Entity.Entry[0].EntityLocation = 1; announ.StatusCond.Entity.Entry[1].EntityType = SAHPI_ENT_ROOT; announ.StatusCond.Entity.Entry[1].EntityLocation = 0; announ.StatusCond.DomainId = 1; announ.StatusCond.ResourceId = 1; announ.StatusCond.SensorNum = 1; announ.StatusCond.EventState = SAHPI_ES_UNSPECIFIED; announ.StatusCond.Name.Length = 5; memcpy(&announ.StatusCond.Name.Value,"announ", 5); announ.StatusCond.Mid = 123; /* we will not worry about the Data field for this test */ ann = oh_announcement_create(); rc = oh_announcement_append(ann, &announ); if(ann->nextId != SAHPI_OLDEST_ENTRY + 2) { CRIT("ann->nextId invalid."); return 1; } if(ann->annentries == NULL) { CRIT("ann->annentries invalid."); return 1; } return 0; } openhpi-3.6.1/utils/t/ann/Makefile.am0000644000175100017510000000416412575647301016405 0ustar mohanmohan# (C) Copyright IBM Corp 2005 # All rights reserved. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. MAINTAINERCLEANFILES = Makefile.in REMOTE_SOURCES = announcement_utils.c \ el_utils.c \ epath_utils.c \ rpt_utils.c \ sahpi_enum_utils.c \ sahpi_event_encode.c \ sahpi_event_utils.c \ sahpi_struct_utils.c \ sahpi_time_utils.c \ sahpiatca_enum_utils.c \ sahpixtca_enum_utils.c \ sahpi_wrappers.c \ uid_utils.c MOSTLYCLEANFILES = $(shell ls *data) $(REMOTE_SOURCES) @TEST_CLEAN@ AM_CPPFLAGS = -DG_LOG_DOMAIN=\"t\" AM_CPPFLAGS += @OPENHPI_INCLUDES@ $(REMOTE_SOURCES): if test ! -f $@ -a ! -L $@; then \ $(LN_S) $(top_srcdir)/utils/$@; \ fi TESTS = ann_test_001 \ ann_test_002 \ ann_test_003 \ ann_test_004 \ ann_test_005 \ ann_test_006 \ ann_test_007 \ ann_test_008 check_PROGRAMS = $(TESTS) ann_test_001_SOURCES = ann_test_001.c nodist_ann_test_001_SOURCES = $(REMOTE_SOURCES) ann_test_002_SOURCES = ann_test_002.c nodist_ann_test_002_SOURCES = $(REMOTE_SOURCES) ann_test_003_SOURCES = ann_test_003.c nodist_ann_test_003_SOURCES = $(REMOTE_SOURCES) ann_test_004_SOURCES = ann_test_004.c nodist_ann_test_004_SOURCES = $(REMOTE_SOURCES) ann_test_005_SOURCES = ann_test_005.c nodist_ann_test_005_SOURCES = $(REMOTE_SOURCES) ann_test_006_SOURCES = ann_test_006.c nodist_ann_test_006_SOURCES = $(REMOTE_SOURCES) ann_test_007_SOURCES = ann_test_007.c nodist_ann_test_007_SOURCES = $(REMOTE_SOURCES) ann_test_008_SOURCES = ann_test_008.c nodist_ann_test_008_SOURCES = $(REMOTE_SOURCES) openhpi-3.6.1/utils/t/ann/ann_test_006.c0000644000175100017510000000524212575647301016713 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include #include #include #include #include #include #include #include /** * main: Announcement test * * This test adds one announcement to the list * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_announcement *ann; SaHpiAnnouncementT announ; SaErrorT rc; announ.EntryId = 0; // modified by oh_announcement_append announ.Timestamp = 0; // modified by oh_announcement_append announ.AddedByUser = FALSE; // modified by oh_announcement_append announ.Severity = SAHPI_CRITICAL; announ.Acknowledged = FALSE; announ.StatusCond.Type= SAHPI_STATUS_COND_TYPE_SENSOR; announ.StatusCond.Entity.Entry[0].EntityType = SAHPI_ENT_SYSTEM_BOARD; announ.StatusCond.Entity.Entry[0].EntityLocation = 1; announ.StatusCond.Entity.Entry[1].EntityType = SAHPI_ENT_ROOT; announ.StatusCond.Entity.Entry[1].EntityLocation = 0; announ.StatusCond.DomainId = 1; announ.StatusCond.ResourceId = 1; announ.StatusCond.SensorNum = 1; announ.StatusCond.EventState = SAHPI_ES_UNSPECIFIED; announ.StatusCond.Name.Length = 5; memcpy(&announ.StatusCond.Name.Value,"announ", 5); announ.StatusCond.Mid = 123; /* we will not worry about the Data field for this test */ ann = oh_announcement_create(); rc = oh_announcement_append(ann, &announ); announ.Severity = SAHPI_MAJOR; rc = oh_announcement_append(ann, &announ); announ.Severity = SAHPI_MINOR; rc = oh_announcement_append(ann, &announ); rc = oh_announcement_ack(ann, 2, SAHPI_MAJOR); if(rc != SA_OK) { CRIT("on_announcement_ack returned %d.", rc); return 1; } rc = oh_announcement_get(ann, 2, &announ); if(rc != SA_OK) { CRIT("on_announcement_get returned %d.", rc); return 1; } if(announ.Acknowledged != TRUE) { CRIT("announ.Acknowledged invalid"); return 1; } return 0; } openhpi-3.6.1/utils/t/ann/ann_test_005.c0000644000175100017510000000747112575647301016720 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005-2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley * Renier Morales */ #include #include #include #include #include #include #include #include #include /** * main: Announcement test * * This test adds one announcement to the list * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_announcement *ann; SaHpiAnnouncementT announ; SaErrorT rc; announ.EntryId = 0; // modified by oh_announcement_append announ.Timestamp = 0; // modified by oh_announcement_append announ.AddedByUser = FALSE; // modified by oh_announcement_append announ.Severity = SAHPI_CRITICAL; announ.Acknowledged = FALSE; announ.StatusCond.Type= SAHPI_STATUS_COND_TYPE_SENSOR; announ.StatusCond.Entity.Entry[0].EntityType = SAHPI_ENT_SYSTEM_BOARD; announ.StatusCond.Entity.Entry[0].EntityLocation = 1; announ.StatusCond.Entity.Entry[1].EntityType = SAHPI_ENT_ROOT; announ.StatusCond.Entity.Entry[1].EntityLocation = 0; announ.StatusCond.DomainId = 1; announ.StatusCond.ResourceId = 1; announ.StatusCond.SensorNum = 1; announ.StatusCond.EventState = SAHPI_ES_UNSPECIFIED; announ.StatusCond.Name.Length = 5; memcpy(&announ.StatusCond.Name.Value,"announ", 5); announ.StatusCond.Mid = 123; /* we will not worry about the Data field for this test */ ann = oh_announcement_create(); rc = oh_announcement_append(ann, &announ); if (rc != SA_OK) { CRIT("1 oh_announcement_append failed."); return 1; } announ.Severity = SAHPI_MAJOR; rc = oh_announcement_append(ann, &announ); if (rc != SA_OK) { CRIT("2 oh_announcement_append failed."); return 1; } announ.Severity = SAHPI_MINOR; rc = oh_announcement_append(ann, &announ); if (rc != SA_OK) { CRIT("3 oh_announcement_append failed."); return 1; } announ.Severity = SAHPI_CRITICAL; rc = oh_announcement_append(ann, &announ); if (rc != SA_OK) { CRIT("4 oh_announcement_append failed."); return 1; } announ.EntryId = SAHPI_FIRST_ENTRY; announ.Timestamp = 0; rc = oh_announcement_get_next(ann, SAHPI_ALL_SEVERITIES, FALSE, &announ); if(rc != SA_OK) { CRIT("on_announcement_get_next returned %d.", rc); return 1; } CRIT("EntryId %d returned with Severity %d.", announ.EntryId, announ.Severity); rc = oh_announcement_get_next(ann, SAHPI_ALL_SEVERITIES, FALSE, &announ); if(rc != SA_OK) { CRIT("on_announcement_get_next returned %d.", rc); return 1; } CRIT("EntryId %d returned with Severity %d.", announ.EntryId, announ.Severity); rc = oh_announcement_get(ann, 1, &announ); if (rc != SA_OK) { CRIT("oh_announcement_get did not find anything."); return 1; } rc = oh_announcement_get_next(ann, SAHPI_CRITICAL, FALSE, &announ); if(rc != SA_OK || announ.Severity != SAHPI_CRITICAL) { CRIT("on_announcement_get_next returned %d." " Severity returned is %d. EntryId %d.", rc, announ.Severity, announ.EntryId); return 1; } CRIT("EntryId %d returned.", announ.EntryId); return 0; } openhpi-3.6.1/utils/t/ann/ann_test_008.c0000644000175100017510000000454312575647301016720 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include #include #include #include #include #include #include #include /** * main: Announcement test * * This test adds one announcement to the list * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_announcement *ann; SaHpiAnnouncementT announ; SaErrorT rc; announ.EntryId = 0; // modified by oh_announcement_append announ.Timestamp = 0; // modified by oh_announcement_append announ.AddedByUser = FALSE; // modified by oh_announcement_append announ.Severity = SAHPI_CRITICAL; announ.Acknowledged = FALSE; announ.StatusCond.Type= SAHPI_STATUS_COND_TYPE_SENSOR; announ.StatusCond.Entity.Entry[0].EntityType = SAHPI_ENT_SYSTEM_BOARD; announ.StatusCond.Entity.Entry[0].EntityLocation = 1; announ.StatusCond.Entity.Entry[1].EntityType = SAHPI_ENT_ROOT; announ.StatusCond.Entity.Entry[1].EntityLocation = 0; announ.StatusCond.DomainId = 1; announ.StatusCond.ResourceId = 1; announ.StatusCond.SensorNum = 1; announ.StatusCond.EventState = SAHPI_ES_UNSPECIFIED; announ.StatusCond.Name.Length = 5; memcpy(&announ.StatusCond.Name.Value,"announ", 5); announ.StatusCond.Mid = 123; /* we will not worry about the Data field for this test */ ann = oh_announcement_create(); rc = oh_announcement_append(ann, &announ); announ.Severity = SAHPI_MAJOR; rc = oh_announcement_append(ann, &announ); announ.Severity = SAHPI_MINOR; rc = oh_announcement_append(ann, &announ); rc = oh_announcement_close(ann); if(rc != SA_OK) { CRIT("on_announcement_close returned %d.", rc); return 1; } return 0; } openhpi-3.6.1/utils/t/ann/ann_test_003.c0000644000175100017510000000467712575647301016723 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include #include #include #include #include #include #include #include /** * main: Announcement test * * This test adds one announcement to the list * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_announcement *ann; SaHpiAnnouncementT announ; SaErrorT rc; announ.EntryId = 0; // modified by oh_announcement_append announ.Timestamp = 0; // modified by oh_announcement_append announ.AddedByUser = FALSE; // modified by oh_announcement_append announ.Severity = SAHPI_CRITICAL; announ.Acknowledged = FALSE; announ.StatusCond.Type= SAHPI_STATUS_COND_TYPE_SENSOR; announ.StatusCond.Entity.Entry[0].EntityType = SAHPI_ENT_SYSTEM_BOARD; announ.StatusCond.Entity.Entry[0].EntityLocation = 1; announ.StatusCond.Entity.Entry[1].EntityType = SAHPI_ENT_ROOT; announ.StatusCond.Entity.Entry[1].EntityLocation = 0; announ.StatusCond.DomainId = 1; announ.StatusCond.ResourceId = 1; announ.StatusCond.SensorNum = 1; announ.StatusCond.EventState = SAHPI_ES_UNSPECIFIED; announ.StatusCond.Name.Length = 5; memcpy(&announ.StatusCond.Name.Value,"announ", 5); announ.StatusCond.Mid = 123; /* we will not worry about the Data field for this test */ ann = oh_announcement_create(); rc = oh_announcement_append(ann, &announ); announ.Severity = SAHPI_MAJOR; rc = oh_announcement_append(ann, &announ); announ.Severity = SAHPI_MINOR; rc = oh_announcement_append(ann, &announ); if(ann->nextId != SAHPI_OLDEST_ENTRY + 4) { CRIT("ann->nextId invalid."); return 1; } if(ann->annentries == NULL) { CRIT("ann->annentries invalid."); return 1; } return 0; } openhpi-3.6.1/utils/t/ann/ann_test_001.c0000644000175100017510000000242012575647301016701 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include #include #include #include #include #include #include #include /** * main: Announcement test * * This test tests the creation of an announcement list. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_announcement *ann; ann = oh_announcement_create(); if(ann == NULL) { CRIT("ann pointer == NULL."); return 1; } if(ann->nextId != SAHPI_OLDEST_ENTRY + 1) { CRIT("ann->nextId invalid."); return 1; } if(ann->annentries != NULL) { CRIT("ann->annentries invalid."); return 1; } return 0; } openhpi-3.6.1/utils/t/epath/0000755000175100017510000000000012605014506014656 5ustar mohanmohanopenhpi-3.6.1/utils/t/epath/epath_pattern_429.c0000644000175100017510000000324512575647301020275 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}{BIOS,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_069.c0000644000175100017510000000513612575647301017566 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{POWER_SYSTEM_BOARD,93}{COMPACTPCI_CHASSIS,11}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_COMPACTPCI_CHASSIS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_COMPACTPCI_CHASSIS); return -1; } if (ep.Entry[0].EntityLocation != 11) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 11); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_POWER_SYSTEM_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_POWER_SYSTEM_BOARD); return -1; } if (ep.Entry[1].EntityLocation != 93) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 93); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_320.c0000644000175100017510000000323712575647301020264 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{.,.}*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_331.c0000644000175100017510000000325112575647301020262 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_220.c0000644000175100017510000000325312575647301020261 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}"; char *epp_str = "*{.,.}*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_006.c0000644000175100017510000000506412575647301017555 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{PERIPHERAL_BAY,12}{DISK_BAY,62}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_DISK_BAY) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_DISK_BAY); return -1; } if (ep.Entry[0].EntityLocation != 62) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 62); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_PERIPHERAL_BAY) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_PERIPHERAL_BAY); return -1; } if (ep.Entry[1].EntityLocation != 12) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 12); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_132.c0000644000175100017510000000321712575647301020263 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}"; char *epp_str = "{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_014.c0000644000175100017510000000505312575647301017552 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{BATTERY,37}{SYSTEM_BOARD,40}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_SYSTEM_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_SYSTEM_BOARD); return -1; } if (ep.Entry[0].EntityLocation != 40) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 40); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_BATTERY) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_BATTERY); return -1; } if (ep.Entry[1].EntityLocation != 37) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 37); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_070.c0000644000175100017510000000502612575647301017554 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{RACK,66}{IO_BLADE,57}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_IO_BLADE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_IO_BLADE); return -1; } if (ep.Entry[0].EntityLocation != 57) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 57); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_RACK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_RACK); return -1; } if (ep.Entry[1].EntityLocation != 66) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 66); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_301.c0000644000175100017510000000326312575647301020262 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_235.c0000644000175100017510000000320212575647301020261 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}"; char *epp_str = "*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_349.c0000644000175100017510000000322712575647301020276 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_024.c0000644000175100017510000000511112575647301017546 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{FRONT_PANEL_BOARD,9}{PHYSICAL_SLOT,79}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_PHYSICAL_SLOT) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_PHYSICAL_SLOT); return -1; } if (ep.Entry[0].EntityLocation != 79) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 79); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_FRONT_PANEL_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_FRONT_PANEL_BOARD); return -1; } if (ep.Entry[1].EntityLocation != 9) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 9); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_287.c0000644000175100017510000000324512575647301020277 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "*{SYSTEM_CHASSIS,.}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_312.c0000644000175100017510000000326412575647301020265 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SYSTEM_CHASSIS,.}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_126.c0000644000175100017510000000324112575647301020263 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_078.c0000644000175100017510000000513312575647301017563 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{SYS_MGMNT_SOFTWARE,23}{COMPACTPCI_CHASSIS,0}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_COMPACTPCI_CHASSIS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_COMPACTPCI_CHASSIS); return -1; } if (ep.Entry[0].EntityLocation != 0) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 0); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_SYS_MGMNT_SOFTWARE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_SYS_MGMNT_SOFTWARE); return -1; } if (ep.Entry[1].EntityLocation != 23) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 23); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_372.c0000644000175100017510000000317312575647301020272 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}"; char *epp_str = "{.,.}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_138.c0000644000175100017510000000324312575647301020270 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_063.c0000644000175100017510000000510312575647301017552 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{CHASSIS_SPECIFIC,53}{SUB_CHASSIS,82}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_SUB_CHASSIS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_SUB_CHASSIS); return -1; } if (ep.Entry[0].EntityLocation != 82) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 82); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_CHASSIS_SPECIFIC) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_CHASSIS_SPECIFIC); return -1; } if (ep.Entry[1].EntityLocation != 53) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 53); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_210.c0000644000175100017510000000325612575647301020263 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}"; char *epp_str = "*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_053.c0000644000175100017510000000507212575647301017556 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{UNKNOWN,87}{BOARD_SET_SPECIFIC,0}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_BOARD_SET_SPECIFIC) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_BOARD_SET_SPECIFIC); return -1; } if (ep.Entry[0].EntityLocation != 0) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 0); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_UNKNOWN) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_UNKNOWN); return -1; } if (ep.Entry[1].EntityLocation != 87) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 87); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_413.c0000644000175100017510000000324612575647301020267 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_197.c0000644000175100017510000000325012575647301020273 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{.,.}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_295.c0000644000175100017510000000322012575647301020267 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "*{.,.}*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_265.c0000644000175100017510000000322512575647301020271 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_015.c0000644000175100017510000000506112575647301017552 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{IO_BLADE,64}{MEMORY_DEVICE,59}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_MEMORY_DEVICE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_MEMORY_DEVICE); return -1; } if (ep.Entry[0].EntityLocation != 59) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 59); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_IO_BLADE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_IO_BLADE); return -1; } if (ep.Entry[1].EntityLocation != 64) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 64); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/ep_concat_007.c0000644000175100017510000000621712575647301017364 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_concat_ep: concatenate a 4 and a 12 element entity path */ int main(int argc, char **argv) { SaErrorT err; SaHpiEntityPathT ep1 = {{{SAHPI_ENT_POWER_UNIT,199}, {SAHPI_ENT_CHASSIS_BACK_PANEL_BOARD,202}, {SAHPI_ENT_SYSTEM_CHASSIS,211}, {SAHPI_ENT_SUB_CHASSIS,222}, {SAHPI_ENT_ROOT,0}}}; SaHpiEntityPathT ep2 = {{{SAHPI_ENT_OTHER_CHASSIS_BOARD,233}, {SAHPI_ENT_DISK_DRIVE_BAY,244}, {SAHPI_ENT_PERIPHERAL_BAY_2,255}, {SAHPI_ENT_DEVICE_BAY,255}, {SAHPI_ENT_COOLING_DEVICE,277}, {SAHPI_ENT_COOLING_UNIT,288}, {SAHPI_ENT_INTERCONNECT,299}, {SAHPI_ENT_MEMORY_DEVICE,303}, {SAHPI_ENT_SYS_MGMNT_SOFTWARE,311}, {SAHPI_ENT_BIOS,322}, {SAHPI_ENT_OPERATING_SYSTEM,333}, {SAHPI_ENT_SYSTEM_BUS,344}, {SAHPI_ENT_ROOT,0}}}; SaHpiEntityPathT ep3 = {{{SAHPI_ENT_POWER_UNIT,199}, {SAHPI_ENT_CHASSIS_BACK_PANEL_BOARD,202}, {SAHPI_ENT_SYSTEM_CHASSIS,211}, {SAHPI_ENT_SUB_CHASSIS,222}, {SAHPI_ENT_OTHER_CHASSIS_BOARD,233}, {SAHPI_ENT_DISK_DRIVE_BAY,244}, {SAHPI_ENT_PERIPHERAL_BAY_2,255}, {SAHPI_ENT_DEVICE_BAY,255}, {SAHPI_ENT_COOLING_DEVICE,277}, {SAHPI_ENT_COOLING_UNIT,288}, {SAHPI_ENT_INTERCONNECT,299}, {SAHPI_ENT_MEMORY_DEVICE,303}, {SAHPI_ENT_SYS_MGMNT_SOFTWARE,311}, {SAHPI_ENT_BIOS,322}, {SAHPI_ENT_OPERATING_SYSTEM,333}, {SAHPI_ENT_SYSTEM_BUS,344}}}; err = oh_concat_ep(&ep1, &ep2); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (!oh_cmp_ep(&ep1, &ep3)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_302.c0000644000175100017510000000326412575647301020264 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_092.c0000644000175100017510000000513612575647301017562 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{ALARM_MANAGER,99}{POWER_DISTRIBUTION_UNIT,54}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_POWER_DISTRIBUTION_UNIT) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_POWER_DISTRIBUTION_UNIT); return -1; } if (ep.Entry[0].EntityLocation != 54) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 54); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_ALARM_MANAGER) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_ALARM_MANAGER); return -1; } if (ep.Entry[1].EntityLocation != 99) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 99); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_039.c0000644000175100017510000000502312575647301017556 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{OTHER,51}{SWITCH,55}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_SWITCH) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_SWITCH); return -1; } if (ep.Entry[0].EntityLocation != 55) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 55); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_OTHER) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_OTHER); return -1; } if (ep.Entry[1].EntityLocation != 51) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 51); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_011.c0000644000175100017510000000505012575647301017544 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{CHASSIS_SPECIFIC,8}{BIOS,8}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_BIOS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_BIOS); return -1; } if (ep.Entry[0].EntityLocation != 8) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 8); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_CHASSIS_SPECIFIC) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_CHASSIS_SPECIFIC); return -1; } if (ep.Entry[1].EntityLocation != 8) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 8); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_143.c0000644000175100017510000000320712575647301020264 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}"; char *epp_str = "{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_072.c0000644000175100017510000000323712575647301020270 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{.,.}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_060.c0000644000175100017510000000507512575647301017557 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{SYSTEM_BLADE,58}{PHYSICAL_SLOT,77}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_PHYSICAL_SLOT) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_PHYSICAL_SLOT); return -1; } if (ep.Entry[0].EntityLocation != 77) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 77); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_SYSTEM_BLADE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_SYSTEM_BLADE); return -1; } if (ep.Entry[1].EntityLocation != 58) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 58); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_324.c0000644000175100017510000000322412575647301020264 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_024.c0000644000175100017510000000320612575647301020261 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_030.c0000644000175100017510000000511712575647301017551 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{SPEC_PROC_BLADE,26}{BACK_PANEL_BOARD,36}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_BACK_PANEL_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_BACK_PANEL_BOARD); return -1; } if (ep.Entry[0].EntityLocation != 36) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 36); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_SPEC_PROC_BLADE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_SPEC_PROC_BLADE); return -1; } if (ep.Entry[1].EntityLocation != 26) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 26); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_079.c0000644000175100017510000000507512575647301017571 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{DISPLAY_PANEL,22}{POWER_MODULE,60}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_POWER_MODULE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_POWER_MODULE); return -1; } if (ep.Entry[0].EntityLocation != 60) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 60); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_DISPLAY_PANEL) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_DISPLAY_PANEL); return -1; } if (ep.Entry[1].EntityLocation != 22) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 22); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_203.c0000644000175100017510000000326712575647301020267 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_202.c0000644000175100017510000000330012575647301020252 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_195.c0000644000175100017510000000325112575647301020272 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{.,.}*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_352.c0000644000175100017510000000322012575647301020261 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_026.c0000644000175100017510000000323012575647301020260 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_031.c0000644000175100017510000000504212575647301017547 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{POWER_MGMNT,36}{OTHER,18}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_OTHER) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_OTHER); return -1; } if (ep.Entry[0].EntityLocation != 18) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 18); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_POWER_MGMNT) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_POWER_MGMNT); return -1; } if (ep.Entry[1].EntityLocation != 36) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 36); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_051.c0000644000175100017510000000326412575647301020265 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_050.c0000644000175100017510000000326412575647301020264 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_010.c0000644000175100017510000000506712575647301017553 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{SYSTEM_CHASSIS,4}{DISK_DRIVE,48}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_DISK_DRIVE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_DISK_DRIVE); return -1; } if (ep.Entry[0].EntityLocation != 48) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 48); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_SYSTEM_CHASSIS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_SYSTEM_CHASSIS); return -1; } if (ep.Entry[1].EntityLocation != 4) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 4); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_027.c0000644000175100017510000000323112575647301020262 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_342.c0000644000175100017510000000323412575647301020265 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_115.c0000644000175100017510000000330112575647301020256 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_426.c0000644000175100017510000000325412575647301020272 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}{BIOS,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_150.c0000644000175100017510000000325612575647301020266 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_339.c0000644000175100017510000000327012575647301020273 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_038.c0000644000175100017510000000511412575647301017556 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{SUB_CHASSIS,18}{SYS_EXPANSION_BOARD,54}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_SYS_EXPANSION_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_SYS_EXPANSION_BOARD); return -1; } if (ep.Entry[0].EntityLocation != 54) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 54); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_SUB_CHASSIS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_SUB_CHASSIS); return -1; } if (ep.Entry[1].EntityLocation != 18) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 18); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/ep_concat_008.c0000644000175100017510000000277212575647301017367 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_concat_ep: concatenate two full entity path */ int main(int argc, char **argv) { int i; SaErrorT err; SaHpiEntityPathT ep1; SaHpiEntityPathT ep2; SaHpiEntityPathT ep3; for (i=0; i */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SYSTEM_CHASSIS,.}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_058.c0000644000175100017510000000324312575647301020271 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_375.c0000644000175100017510000000323212575647301020271 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}{SUBRACK,5}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_037.c0000644000175100017510000000323112575647301020263 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}"; char *epp_str = "*{SYSTEM_CHASSIS,.}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_167.c0000644000175100017510000000322412575647301020271 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_105.c0000644000175100017510000000330212575647301020256 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_395.c0000644000175100017510000000320612575647301020274 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}{SUBRACK,5}"; char *epp_str = "*{.,.}*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_291.c0000644000175100017510000000321212575647301020264 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_266.c0000644000175100017510000000321012575647301020264 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_149.c0000644000175100017510000000320212575647301020265 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}"; char *epp_str = "*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_158.c0000644000175100017510000000323412575647301020272 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "*{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_066.c0000644000175100017510000000511112575647301017554 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{SYS_EXPANSION_BOARD,24}{POWER_UNIT,49}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_POWER_UNIT) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_POWER_UNIT); return -1; } if (ep.Entry[0].EntityLocation != 49) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 49); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_SYS_EXPANSION_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_SYS_EXPANSION_BOARD); return -1; } if (ep.Entry[1].EntityLocation != 24) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 24); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_217.c0000644000175100017510000000324512575647301020270 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}"; char *epp_str = "*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_226.c0000644000175100017510000000322312575647301020264 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_099.c0000644000175100017510000000514712575647301017573 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{EXTERNAL_ENVIRONMENT,92}{OTHER_CHASSIS_BOARD,25}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_OTHER_CHASSIS_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_OTHER_CHASSIS_BOARD); return -1; } if (ep.Entry[0].EntityLocation != 25) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 25); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_EXTERNAL_ENVIRONMENT) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_EXTERNAL_ENVIRONMENT); return -1; } if (ep.Entry[1].EntityLocation != 92) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 92); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_386.c0000644000175100017510000000323412575647301020275 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}{SUBRACK,5}"; char *epp_str = "*{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_406.c0000644000175100017510000000322712575647301020270 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}"; char *epp_str = "{SYSTEM_CHASSIS,1}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_362.c0000644000175100017510000000322012575647301020262 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}"; char *epp_str = "*{SYSTEM_CHASSIS,.}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_334.c0000644000175100017510000000324412575647301020267 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_370.c0000644000175100017510000000317412575647301020271 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}"; char *epp_str = "*{.,.}*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_410.c0000644000175100017510000000322412575647301020260 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}"; char *epp_str = "*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_159.c0000644000175100017510000000323412575647301020273 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_098.c0000644000175100017510000000504512575647301017567 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{SUBRACK,47}{DISK_DRIVE,66}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_DISK_DRIVE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_DISK_DRIVE); return -1; } if (ep.Entry[0].EntityLocation != 66) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 66); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_SUBRACK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_SUBRACK); return -1; } if (ep.Entry[1].EntityLocation != 47) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 47); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_034.c0000644000175100017510000000506712575647301017561 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{UNSPECIFIED,69}{INTERCONNECT,99}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_INTERCONNECT) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_INTERCONNECT); return -1; } if (ep.Entry[0].EntityLocation != 99) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 99); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_UNSPECIFIED) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_UNSPECIFIED); return -1; } if (ep.Entry[1].EntityLocation != 69) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 69); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_002.c0000644000175100017510000000510312575647301017543 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{SUB_CHASSIS,26}{SYS_MGMNT_MODULE,76}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_SYS_MGMNT_MODULE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_SYS_MGMNT_MODULE); return -1; } if (ep.Entry[0].EntityLocation != 76) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 76); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_SUB_CHASSIS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_SUB_CHASSIS); return -1; } if (ep.Entry[1].EntityLocation != 26) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 26); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/ep_cmp_003.c0000644000175100017510000000266112575647301016667 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_cmp_ep: multi-element entity path testcase. */ int main(int argc, char **argv) { SaHpiEntityPathT ep1 = {{{SAHPI_ENT_ADD_IN_CARD,11}, {SAHPI_ENT_FRONT_PANEL_BOARD,22}, {SAHPI_ENT_BACK_PANEL_BOARD,33}, {SAHPI_ENT_POWER_SYSTEM_BOARD,44}, {SAHPI_ENT_ROOT, 0}}}; SaHpiEntityPathT ep2 = {{{SAHPI_ENT_ADD_IN_CARD,11}, {SAHPI_ENT_FRONT_PANEL_BOARD,22}, {SAHPI_ENT_BACK_PANEL_BOARD,33}, {SAHPI_ENT_POWER_SYSTEM_BOARD,44}, {SAHPI_ENT_ROOT, 0}}}; if (!oh_cmp_ep(&ep1, &ep2)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_103.c0000644000175100017510000000330612575647301020260 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_434.c0000644000175100017510000000323312575647301020266 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}{BIOS,8}"; char *epp_str = "*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_196.c0000644000175100017510000000325112575647301020273 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{.,.}*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_019.c0000644000175100017510000000321412575647301020264 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_086.c0000644000175100017510000000330712575647301020273 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_405.c0000644000175100017510000000323012575647301020261 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}"; char *epp_str = "{SYSTEM_CHASSIS,1}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_049.c0000644000175100017510000000513312575647301017561 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{OTHER_CHASSIS_BOARD,50}{BACK_PANEL_BOARD,80}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_BACK_PANEL_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_BACK_PANEL_BOARD); return -1; } if (ep.Entry[0].EntityLocation != 80) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 80); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_OTHER_CHASSIS_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_OTHER_CHASSIS_BOARD); return -1; } if (ep.Entry[1].EntityLocation != 50) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 50); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_163.c0000644000175100017510000000325712575647301020273 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_421.c0000644000175100017510000000322012575647301020256 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}"; char *epp_str = "{.,.}*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_106.c0000644000175100017510000000330112575647301020256 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_344.c0000644000175100017510000000323512575647301020270 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_408.c0000644000175100017510000000322312575647301020266 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}"; char *epp_str = "*{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_151.c0000644000175100017510000000325612575647301020267 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_384.c0000644000175100017510000000321112575647301020266 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}{SUBRACK,5}"; char *epp_str = "*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_377.c0000644000175100017510000000323312575647301020274 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}{SUBRACK,5}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_177.c0000644000175100017510000000327612575647301020301 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_357.c0000644000175100017510000000317512575647301020277 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}"; char *epp_str = "{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_232.c0000644000175100017510000000320012575647301020254 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}"; char *epp_str = "{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_009.c0000644000175100017510000000507212575647301017557 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{SYS_MGMNT_SOFTWARE,13}{SWITCH,20}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_SWITCH) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_SWITCH); return -1; } if (ep.Entry[0].EntityLocation != 20) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 20); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_SYS_MGMNT_SOFTWARE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_SYS_MGMNT_SOFTWARE); return -1; } if (ep.Entry[1].EntityLocation != 13) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 13); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/ep_concat_009.c0000644000175100017510000000265512575647301017370 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_concat_ep: concatenate a zero element and a full entity path */ int main(int argc, char **argv) { int i; SaErrorT err; SaHpiEntityPathT ep1 = {{{SAHPI_ENT_ROOT,0}}}; SaHpiEntityPathT ep2; SaHpiEntityPathT ep3; for (i=0; i #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{PROCESSOR_BOARD,43}{OPERATING_SYSTEM,51}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_OPERATING_SYSTEM) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_OPERATING_SYSTEM); return -1; } if (ep.Entry[0].EntityLocation != 51) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 51); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_PROCESSOR_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_PROCESSOR_BOARD); return -1; } if (ep.Entry[1].EntityLocation != 43) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 43); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_094.c0000644000175100017510000000325412575647301020273 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_193.c0000644000175100017510000000324312575647301020271 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_420.c0000644000175100017510000000322012575647301020255 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}"; char *epp_str = "*{.,.}*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_172.c0000644000175100017510000000323112575647301020263 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "{.,.}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_048.c0000644000175100017510000000510312575647301017555 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{PROCESSOR,17}{COMPACTPCI_CHASSIS,33}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_COMPACTPCI_CHASSIS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_COMPACTPCI_CHASSIS); return -1; } if (ep.Entry[0].EntityLocation != 33) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 33); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_PROCESSOR) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_PROCESSOR); return -1; } if (ep.Entry[1].EntityLocation != 17) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 17); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_097.c0000644000175100017510000000507212575647301017566 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{OTHER_SYSTEM_BOARD,91}{SWITCH,62}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_SWITCH) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_SWITCH); return -1; } if (ep.Entry[0].EntityLocation != 62) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 62); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_OTHER_SYSTEM_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_OTHER_SYSTEM_BOARD); return -1; } if (ep.Entry[1].EntityLocation != 91) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 91); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_056.c0000644000175100017510000000511712575647301017561 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{INTERCONNECT,65}{RACK_MOUNTED_SERVER,76}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_RACK_MOUNTED_SERVER) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_RACK_MOUNTED_SERVER); return -1; } if (ep.Entry[0].EntityLocation != 76) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 76); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_INTERCONNECT) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_INTERCONNECT); return -1; } if (ep.Entry[1].EntityLocation != 65) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 65); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_010.c0000644000175100017510000000322412575647301020254 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_numeric_000.c0000644000175100017510000000262112575647301020240 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright FORCE Computers 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Thomas Kanngieser */ #include #include #include #include #include int main (int argc, char **argv) { gchar *test_string, *expected_string; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; test_string = "{7,11}"; expected_string = "{SYSTEM_BOARD,11}"; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, expected_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_258.c0000644000175100017510000000322112575647301020267 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/ep_concat_001.c0000644000175100017510000000223612575647301017353 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Steve Sherman */ #include #include #include /* oh_concat_ep test. NULL as the second parameter testcase. */ int main(int argc, char **argv) { char *test_string = "{CHASSIS_SPECIFIC,89}{OPERATING_SYSTEM,46}"; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } err = oh_concat_ep(&ep, NULL); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_016.c0000644000175100017510000000321312575647301020260 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/set_ep_loc_007.c0000755000175100017510000000463212575647301017547 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_set_ep_location: Entity path has 4 elements, victim element * in middle. Only victim element's instance number changed */ int main(int argc, char **argv) { SaErrorT err; SaHpiEntityPathT ep = {{{SAHPI_ENT_INTERCONNECT, 1515}, {SAHPI_ENT_PHYSICAL_SLOT, 2525}, {SAHPI_ENT_SUBRACK, 3535}, {SAHPI_ENT_IO_SUBBOARD, 4545}, {0}}}; SaHpiEntityLocationT x = 98765; err = oh_set_ep_location(&ep, SAHPI_ENT_PHYSICAL_SLOT, x); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[1].EntityLocation != x) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_PHYSICAL_SLOT) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[0].EntityLocation != 1515) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_INTERCONNECT) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[2].EntityLocation != 3535) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[2].EntityType != SAHPI_ENT_SUBRACK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[3].EntityLocation != 4545) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[3].EntityType != SAHPI_ENT_IO_SUBBOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/set_ep_loc_000.c0000755000175100017510000000172212575647301017535 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Steve Sherman */ #include #include #include /* oh_set_ep_location test: NULL first parameter testcase. */ int main(int argc, char **argv) { SaErrorT err, expected_err; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_set_ep_location(NULL, SAHPI_ENT_ROOT, 5); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_212.c0000644000175100017510000000330012575647301020253 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}"; char *epp_str = "*{SYSTEM_CHASSIS,.}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_280.c0000644000175100017510000000323012575647301020262 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_385.c0000644000175100017510000000321212575647301020270 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}{SUBRACK,5}"; char *epp_str = "*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/set_ep_loc_006.c0000755000175100017510000000453512575647301017550 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_set_ep_location: Entity path has 4 elements, victim element in the middle. Only victim element's instance number changed */ int main(int argc, char **argv) { SaErrorT err; SaHpiEntityPathT ep = {{{SAHPI_ENT_FAN, 11099}, {SAHPI_ENT_BATTERY, 2002}, {SAHPI_ENT_RACK, 37373}, {SAHPI_ENT_DISK_BAY, 440044}, {0}}}; SaHpiEntityLocationT x = 123456; err = oh_set_ep_location(&ep, SAHPI_ENT_RACK, x); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[2].EntityLocation != x) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[2].EntityType != SAHPI_ENT_RACK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[0].EntityLocation != 11099) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_FAN) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[1].EntityLocation != 2002) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_BATTERY) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[3].EntityLocation != 440044) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[3].EntityType != SAHPI_ENT_DISK_BAY) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_153.c0000644000175100017510000000324612575647301020270 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_117.c0000644000175100017510000000326412575647301020270 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_447.c0000644000175100017510000000322712575647301020275 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}{BIOS,8}"; char *epp_str = "{.,.}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_269.c0000644000175100017510000000321112575647301020270 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_237.c0000644000175100017510000000322412575647301020267 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}"; char *epp_str = "*{SYSTEM_CHASSIS,.}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_206.c0000644000175100017510000000326212575647301020265 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_102.c0000644000175100017510000000331712575647301020261 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_439.c0000644000175100017510000000325712575647301020301 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}{BIOS,8}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_165.c0000644000175100017510000000324112575647301020266 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_279.c0000644000175100017510000000323512575647301020277 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_211.c0000644000175100017510000000330112575647301020253 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}"; char *epp_str = "*{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_181.c0000644000175100017510000000326012575647301020265 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_027.c0000644000175100017510000000504512575647301017557 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{OTHER,55}{SYSTEM_BOARD,63}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_SYSTEM_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_SYSTEM_BOARD); return -1; } if (ep.Entry[0].EntityLocation != 63) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 63); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_OTHER) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_OTHER); return -1; } if (ep.Entry[1].EntityLocation != 55) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 55); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_257.c0000644000175100017510000000322012575647301020265 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_298.c0000644000175100017510000000321712575647301020300 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "*{.,.}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_390.c0000644000175100017510000000321512575647301020267 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}{SUBRACK,5}"; char *epp_str = "{SYSTEM_CHASSIS,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_435.c0000644000175100017510000000323412575647301020270 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}{BIOS,8}"; char *epp_str = "*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_431.c0000644000175100017510000000323712575647301020267 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}{BIOS,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_035.c0000644000175100017510000000321012575647301020256 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}"; char *epp_str = "*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_329.c0000644000175100017510000000325612575647301020276 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_309.c0000644000175100017510000000324212575647301020267 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_346.c0000644000175100017510000000324212575647301020270 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "{.,.}*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_077.c0000644000175100017510000000330612575647301020272 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_038.c0000644000175100017510000000323212575647301020265 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/set_ep_loc_008.c0000755000175100017510000000462312575647301017550 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_set_ep_location: 4 element entity path, victim element at head. * Only head element's instance number changed. */ int main(int argc, char **argv) { SaErrorT err; SaHpiEntityPathT ep = {{{SAHPI_ENT_ADD_IN_CARD, 101}, {SAHPI_ENT_POWER_MODULE, 2020}, {SAHPI_ENT_POWER_MGMNT, 30303}, {SAHPI_ENT_SUB_CHASSIS, 404040}, {0}}}; SaHpiEntityLocationT x = 555555; err = oh_set_ep_location(&ep, SAHPI_ENT_ADD_IN_CARD, x); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityLocation != x) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_ADD_IN_CARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[1].EntityLocation != 2020) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_POWER_MODULE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[2].EntityLocation != 30303) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[2].EntityType != SAHPI_ENT_POWER_MGMNT) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[3].EntityLocation != 404040) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[3].EntityType != SAHPI_ENT_SUB_CHASSIS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/ep_cmp_006.c0000644000175100017510000000150212575647301016663 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_cmp_ep: null pointer testcase. */ int main(int argc, char **argv) { SaHpiEntityPathT ep; if (oh_cmp_ep(NULL, &ep)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_290.c0000644000175100017510000000322712575647301020271 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/ep_concat_011.c0000644000175100017510000000442712575647301017360 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_concat_ep: concatenate a zero element and a 9 element entity path */ int main(int argc, char **argv) { SaErrorT err; SaHpiEntityPathT ep1 = {{{SAHPI_ENT_ROOT,0}}}; SaHpiEntityPathT ep2 = {{{SAHPI_ENT_GROUP,101}, {SAHPI_ENT_REMOTE,102}, {SAHPI_ENT_EXTERNAL_ENVIRONMENT,103}, {SAHPI_ENT_BATTERY,104}, {SAHPI_ENT_CHASSIS_SPECIFIC,105}, {SAHPI_ENT_BOARD_SET_SPECIFIC,106}, {SAHPI_ENT_OEM_SYSINT_SPECIFIC,107}, {SAHPI_ENT_FAN,108}, {SAHPI_ENT_RACK,109}, {SAHPI_ENT_ROOT,0}}}; SaHpiEntityPathT ep3 = {{{SAHPI_ENT_GROUP,101}, {SAHPI_ENT_REMOTE,102}, {SAHPI_ENT_EXTERNAL_ENVIRONMENT,103}, {SAHPI_ENT_BATTERY,104}, {SAHPI_ENT_CHASSIS_SPECIFIC,105}, {SAHPI_ENT_BOARD_SET_SPECIFIC,106}, {SAHPI_ENT_OEM_SYSINT_SPECIFIC,107}, {SAHPI_ENT_FAN,108}, {SAHPI_ENT_RACK,109}, {SAHPI_ENT_ROOT,0}}}; err = oh_concat_ep(&ep1, &ep2); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (!oh_cmp_ep(&ep1, &ep3)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_033.c0000644000175100017510000000506712575647301017560 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{POWER_MGMNT,21}{POWER_SUPPLY,36}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_POWER_SUPPLY) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_POWER_SUPPLY); return -1; } if (ep.Entry[0].EntityLocation != 36) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 36); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_POWER_MGMNT) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_POWER_MGMNT); return -1; } if (ep.Entry[1].EntityLocation != 21) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 21); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_412.c0000644000175100017510000000324512575647301020265 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}"; char *epp_str = "*{SYSTEM_CHASSIS,.}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_445.c0000644000175100017510000000323012575647301020265 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}{BIOS,8}"; char *epp_str = "*{.,.}*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_091.c0000644000175100017510000000325312575647301020267 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_142.c0000644000175100017510000000320712575647301020263 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}"; char *epp_str = "*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_297.c0000644000175100017510000000321712575647301020277 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "{.,.}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_040.c0000644000175100017510000000513312575647301017550 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{FRONT_PANEL_BOARD,21}{POWER_SYSTEM_BOARD,15}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_POWER_SYSTEM_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_POWER_SYSTEM_BOARD); return -1; } if (ep.Entry[0].EntityLocation != 15) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 15); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_FRONT_PANEL_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_FRONT_PANEL_BOARD); return -1; } if (ep.Entry[1].EntityLocation != 21) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 21); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_252.c0000644000175100017510000000324312575647301020265 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_247.c0000644000175100017510000000317712575647301020277 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}"; char *epp_str = "{.,.}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_005.c0000644000175100017510000000323012575647301020255 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_366.c0000644000175100017510000000316412575647301020275 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}"; char *epp_str = "{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_numeric_003.c0000644000175100017510000000251612575647301020246 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright FORCE Computers 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Thomas Kanngieser */ #include #include #include #include #include int main (int argc, char **argv) { gchar *test_string; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; test_string = "{217,11}"; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_157.c0000644000175100017510000000323412575647301020271 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_036.c0000644000175100017510000000514712575647301017562 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{PROCESSOR_BOARD,16}{CHASSIS_BACK_PANEL_BOARD,22}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_CHASSIS_BACK_PANEL_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_CHASSIS_BACK_PANEL_BOARD); return -1; } if (ep.Entry[0].EntityLocation != 22) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 22); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_PROCESSOR_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_PROCESSOR_BOARD); return -1; } if (ep.Entry[1].EntityLocation != 16) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 16); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_017.c0000644000175100017510000000321312575647301020261 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_147.c0000644000175100017510000000321412575647301020266 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}"; char *epp_str = "{.,.}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_085.c0000644000175100017510000000326412575647301020274 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_323.c0000644000175100017510000000323612575647301020266 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{.,.}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_442.c0000644000175100017510000000322212575647301020263 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}{BIOS,8}"; char *epp_str = "*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_077.c0000644000175100017510000000506412575647301017565 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{SWITCH,85}{PERIPHERAL_BAY_2,28}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_PERIPHERAL_BAY_2) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_PERIPHERAL_BAY_2); return -1; } if (ep.Entry[0].EntityLocation != 28) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 28); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_SWITCH) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_SWITCH); return -1; } if (ep.Entry[1].EntityLocation != 85) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 85); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_240.c0000644000175100017510000000320612575647301020261 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_183.c0000644000175100017510000000325412575647301020272 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_019.c0000644000175100017510000000511112575647301017552 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{PROCESSOR_MODULE,55}{SYSTEM_CHASSIS,0}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_SYSTEM_CHASSIS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_SYSTEM_CHASSIS); return -1; } if (ep.Entry[0].EntityLocation != 0) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 0); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_PROCESSOR_MODULE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_PROCESSOR_MODULE); return -1; } if (ep.Entry[1].EntityLocation != 55) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 55); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_262.c0000644000175100017510000000324312575647301020266 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SYSTEM_CHASSIS,.}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/set_ep_loc_004.c0000755000175100017510000000370012575647301017537 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_set_ep_location: Entity path that has 3 elements testcase */ int main(int argc, char **argv) { SaErrorT err; SaHpiEntityPathT ep = {{{SAHPI_ENT_GROUP, 11}, {SAHPI_ENT_REMOTE, 12}, {SAHPI_ENT_FAN, 13}, {0}}}; SaHpiEntityLocationT x = 99999; err = oh_set_ep_location(&ep, SAHPI_ENT_FAN, x); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[2].EntityLocation != x) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[2].EntityType != SAHPI_ENT_FAN) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[0].EntityLocation != 11) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_GROUP) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[1].EntityLocation != 12) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_REMOTE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_090.c0000644000175100017510000000505612575647301017561 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{POWER_MODULE,6}{PROCESSOR,65}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_PROCESSOR) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_PROCESSOR); return -1; } if (ep.Entry[0].EntityLocation != 65) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 65); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_POWER_MODULE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_POWER_MODULE); return -1; } if (ep.Entry[1].EntityLocation != 6) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 6); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_095.c0000644000175100017510000000326112575647301020272 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{.,.}*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_127.c0000644000175100017510000000324212575647301020265 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_119.c0000644000175100017510000000326512575647301020273 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/ep_concat_000.c0000644000175100017510000000232412575647301017350 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Steve Sherman */ #include #include #include /* oh_concat_ep: NULL parameter testcase. */ int main(int argc, char **argv) { char *test_string = "{CHASSIS_SPECIFIC,89}{OPERATING_SYSTEM,46}"; SaErrorT err, expected_err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_concat_ep(NULL, &ep); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_204.c0000644000175100017510000000327012575647301020262 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_188.c0000644000175100017510000000327712575647301020304 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_415.c0000644000175100017510000000322712575647301020270 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}"; char *epp_str = "{SYSTEM_CHASSIS,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_083.c0000644000175100017510000000326412575647301020272 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_175.c0000644000175100017510000000327512575647301020276 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_200.c0000644000175100017510000000327712575647301020265 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_259.c0000644000175100017510000000322112575647301020270 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_443.c0000644000175100017510000000322212575647301020264 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}{BIOS,8}"; char *epp_str = "{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_071.c0000644000175100017510000000505612575647301017560 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{BIOS,49}{SYS_MGMNT_MODULE,50}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_SYS_MGMNT_MODULE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_SYS_MGMNT_MODULE); return -1; } if (ep.Entry[0].EntityLocation != 50) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 50); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_BIOS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_BIOS); return -1; } if (ep.Entry[1].EntityLocation != 49) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 49); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_047.c0000644000175100017510000000320412575647301020264 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}"; char *epp_str = "{.,.}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_267.c0000644000175100017510000000321012575647301020265 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_205.c0000644000175100017510000000326312575647301020265 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_087.c0000644000175100017510000000510312575647301017560 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{SYSTEM_BUS,29}{SYS_MGMNT_SOFTWARE,1}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_SYS_MGMNT_SOFTWARE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_SYS_MGMNT_SOFTWARE); return -1; } if (ep.Entry[0].EntityLocation != 1) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 1); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_SYSTEM_BUS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_SYSTEM_BUS); return -1; } if (ep.Entry[1].EntityLocation != 29) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 29); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/ep_cmp_000.c0000644000175100017510000000137612575647301016666 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #include #include #include #include /* oh_cmp_ep: null pointer testcase. */ int main(int argc, char **argv) { if (oh_cmp_ep(NULL, NULL)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_365.c0000644000175100017510000000320212575647301020265 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}"; char *epp_str = "{SYSTEM_CHASSIS,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_222.c0000644000175100017510000000325212575647301020262 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}"; char *epp_str = "{.,.}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_337.c0000644000175100017510000000326712575647301020277 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "*{SYSTEM_CHASSIS,.}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_096.c0000644000175100017510000000510312575647301017560 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{PHYSICAL_SLOT,73}{SPEC_PROC_BLADE,7}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_SPEC_PROC_BLADE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_SPEC_PROC_BLADE); return -1; } if (ep.Entry[0].EntityLocation != 7) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 7); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_PHYSICAL_SLOT) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_PHYSICAL_SLOT); return -1; } if (ep.Entry[1].EntityLocation != 73) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 73); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_398.c0000644000175100017510000000320512575647301020276 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}{SUBRACK,5}"; char *epp_str = "*{.,.}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_072.c0000644000175100017510000000505612575647301017561 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{SYS_MGMNT_MODULE,4}{OTHER,38}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_OTHER) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_OTHER); return -1; } if (ep.Entry[0].EntityLocation != 38) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 38); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_SYS_MGMNT_MODULE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_SYS_MGMNT_MODULE); return -1; } if (ep.Entry[1].EntityLocation != 4) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 4); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_419.c0000644000175100017510000000321312575647301020267 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}"; char *epp_str = "*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_348.c0000644000175100017510000000324112575647301020271 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "*{.,.}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_303.c0000644000175100017510000000325312575647301020263 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_032.c0000644000175100017510000000507512575647301017556 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{UNKNOWN,38}{POWER_SYSTEM_BOARD,15}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_POWER_SYSTEM_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_POWER_SYSTEM_BOARD); return -1; } if (ep.Entry[0].EntityLocation != 15) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 15); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_UNKNOWN) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_UNKNOWN); return -1; } if (ep.Entry[1].EntityLocation != 38) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 38); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_332.c0000644000175100017510000000324412575647301020265 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_191.c0000644000175100017510000000324312575647301020267 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_numeric_001.c0000644000175100017510000000202012575647301020232 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright FORCE Computers 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Thomas Kanngieser */ #include #include #include #include #include int main (int argc, char **argv) { gchar *test_string; SaErrorT err, expected_err; SaHpiEntityPathT ep; /* Invalid string */ test_string = "{17string,11}"; expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_entitypath(test_string, &ep); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_141.c0000644000175100017510000000320712575647301020262 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}"; char *epp_str = "{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_088.c0000644000175100017510000000514712575647301017571 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{POWER_DISTRIBUTION_UNIT,45}{CHASSIS_SPECIFIC,26}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_CHASSIS_SPECIFIC) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_CHASSIS_SPECIFIC); return -1; } if (ep.Entry[0].EntityLocation != 26) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 26); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_POWER_DISTRIBUTION_UNIT) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_POWER_DISTRIBUTION_UNIT); return -1; } if (ep.Entry[1].EntityLocation != 45) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 45); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_278.c0000644000175100017510000000323412575647301020275 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_101.c0000644000175100017510000000371612575647301017553 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{OEM_SYSINT_SPECIFIC,6}{BOARD_SET_SPECIFIC,30}"; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_BOARD_SET_SPECIFIC) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_BOARD_SET_SPECIFIC); return -1; } if (ep.Entry[0].EntityLocation != 30) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 30); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_OEM_SYSINT_SPECIFIC) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_OEM_SYSINT_SPECIFIC); return -1; } if (ep.Entry[1].EntityLocation != 6) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 6); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_108.c0000644000175100017510000000327512575647301020272 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_199.c0000644000175100017510000000323612575647301020301 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/print_ep_004.c0000644000175100017510000000252212575647301017241 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_print_ep: Multi-element numeric entity path testcase. */ int main(int argc, char **argv) { int offsets = 1; SaErrorT err; SaHpiEntityPathT ep = {{{210,8}, {211,7}, {212,6}, {213,5}, {214,4}, {215,3}, {216,2}, {255,1}, {SAHPI_ENT_ROOT,1}, {0}}}; printf("Good multi-element numeric testcase. Offset\n"); err = oh_print_ep(&ep, offsets); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_338.c0000644000175100017510000000326712575647301020300 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_070.c0000644000175100017510000000324012575647301020260 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{.,.}*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/ep_cmp_001.c0000644000175100017510000000163412575647301016664 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_cmp_ep: zero element entity path testcase. */ int main(int argc, char **argv) { SaHpiEntityPathT ep1 = {{{SAHPI_ENT_ROOT, 0}}}; SaHpiEntityPathT ep2 = {{{SAHPI_ENT_ROOT, 0}}}; if (!oh_cmp_ep(&ep1, &ep2)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_068.c0000644000175100017510000000507212575647301017564 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{DISPLAY_PANEL,38}{SUB_CHASSIS,52}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_SUB_CHASSIS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_SUB_CHASSIS); return -1; } if (ep.Entry[0].EntityLocation != 52) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 52); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_DISPLAY_PANEL) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_DISPLAY_PANEL); return -1; } if (ep.Entry[1].EntityLocation != 38) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 38); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_002.c0000644000175100017510000000324512575647301020260 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/Makefile.am0000644000175100017510000022170012575647301016727 0ustar mohanmohan# # Copyright (c) 2003, 2004 Intel Corporation # All rights reserved. # # Redistribution and use in source and binary forms, with or # without modification, are permitted provided that the following # conditions are met: # # Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the distribution. # # Neither the name of Intel Corporation nor the names # of its contributors may be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, # OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # MAINTAINERCLEANFILES = Makefile.in REMOTE_SOURCES = \ epath_utils.c \ sahpi_enum_utils.c \ sahpiatca_enum_utils.c \ sahpixtca_enum_utils.c \ sahpi_event_encode.c \ sahpi_event_utils.c \ sahpi_struct_utils.c \ sahpi_time_utils.c \ sahpi_wrappers.c \ uid_utils.c MOSTLYCLEANFILES = $(REMOTE_SOURCES) @TEST_CLEAN@ AM_CPPFLAGS = -DG_LOG_DOMAIN=\"t\" AM_CPPFLAGS += @OPENHPI_INCLUDES@ $(REMOTE_SOURCES): if test ! -f $@ -a ! -L $@; then \ if test -f $(top_srcdir)/utils/$@; then \ $(LN_S) $(top_srcdir)/utils/$@; \ else \ $(LN_S) $(top_builddir)/utils/$@; \ fi; \ fi # FIXME:: Remove epath_conv_xxx files when we can auto-generate file for SMP systems # Create rule using gen_epath_conv_tests.pl. # Do same for epath_pattern_xxx which use gen_epath_pattern_tests.py TESTS = \ epath_utils_test \ epath_numeric_000 \ epath_numeric_001 \ epath_numeric_002 \ epath_numeric_003 \ epath_numeric_004 \ epath_numeric_005 \ epath_conv_000 \ epath_conv_001 \ epath_conv_002 \ epath_conv_003 \ epath_conv_004 \ epath_conv_005 \ epath_conv_006 \ epath_conv_007 \ epath_conv_008 \ epath_conv_009 \ epath_conv_010 \ epath_conv_011 \ epath_conv_012 \ epath_conv_013 \ epath_conv_014 \ epath_conv_015 \ epath_conv_016 \ epath_conv_017 \ epath_conv_018 \ epath_conv_019 \ epath_conv_020 \ epath_conv_021 \ epath_conv_022 \ epath_conv_023 \ epath_conv_024 \ epath_conv_025 \ epath_conv_026 \ epath_conv_027 \ epath_conv_028 \ epath_conv_029 \ epath_conv_030 \ epath_conv_031 \ epath_conv_032 \ epath_conv_033 \ epath_conv_034 \ epath_conv_035 \ epath_conv_036 \ epath_conv_037 \ epath_conv_038 \ epath_conv_039 \ epath_conv_040 \ epath_conv_041 \ epath_conv_042 \ epath_conv_043 \ epath_conv_044 \ epath_conv_045 \ epath_conv_046 \ epath_conv_047 \ epath_conv_048 \ epath_conv_049 \ epath_conv_050 \ epath_conv_051 \ epath_conv_052 \ epath_conv_053 \ epath_conv_054 \ epath_conv_055 \ epath_conv_056 \ epath_conv_057 \ epath_conv_058 \ epath_conv_059 \ epath_conv_060 \ epath_conv_061 \ epath_conv_062 \ epath_conv_063 \ epath_conv_064 \ epath_conv_065 \ epath_conv_066 \ epath_conv_067 \ epath_conv_068 \ epath_conv_069 \ epath_conv_070 \ epath_conv_071 \ epath_conv_072 \ epath_conv_073 \ epath_conv_074 \ epath_conv_075 \ epath_conv_076 \ epath_conv_077 \ epath_conv_078 \ epath_conv_079 \ epath_conv_080 \ epath_conv_081 \ epath_conv_082 \ epath_conv_083 \ epath_conv_084 \ epath_conv_085 \ epath_conv_086 \ epath_conv_087 \ epath_conv_088 \ epath_conv_089 \ epath_conv_090 \ epath_conv_091 \ epath_conv_092 \ epath_conv_093 \ epath_conv_094 \ epath_conv_095 \ epath_conv_096 \ epath_conv_097 \ epath_conv_098 \ epath_conv_099 \ epath_conv_100 \ epath_conv_101 \ ep_cmp_000 \ ep_cmp_001 \ ep_cmp_002 \ ep_cmp_003 \ ep_cmp_004 \ ep_cmp_005 \ ep_cmp_006 \ ep_cmp_007 \ ep_cmp_008 \ ep_cmp_009 \ ep_cmp_010 \ ep_cmp_011 \ ep_concat_000 \ ep_concat_001 \ ep_concat_002 \ ep_concat_003 \ ep_concat_004 \ ep_concat_005 \ ep_concat_006 \ ep_concat_007 \ ep_concat_008 \ ep_concat_009 \ ep_concat_010 \ ep_concat_011 \ ep_concat_012 \ ep_concat_013 \ ep_concat_014 \ ep_concat_015 \ ep_derive_001 \ set_ep_loc_000 \ set_ep_loc_001 \ set_ep_loc_002 \ set_ep_loc_003 \ set_ep_loc_004 \ set_ep_loc_005 \ set_ep_loc_006 \ set_ep_loc_007 \ set_ep_loc_008 \ set_ep_loc_009 \ set_ep_loc_010 \ set_ep_loc_011 \ set_ep_loc_012 \ set_ep_loc_013 \ print_ep_000 \ print_ep_001 \ print_ep_002 \ print_ep_003 \ print_ep_004 \ print_ep_005 \ epath_pattern_000 \ epath_pattern_001 \ epath_pattern_002 \ epath_pattern_003 \ epath_pattern_004 \ epath_pattern_005 \ epath_pattern_006 \ epath_pattern_007 \ epath_pattern_008 \ epath_pattern_009 \ epath_pattern_010 \ epath_pattern_011 \ epath_pattern_012 \ epath_pattern_013 \ epath_pattern_014 \ epath_pattern_015 \ epath_pattern_016 \ epath_pattern_017 \ epath_pattern_018 \ epath_pattern_019 \ epath_pattern_020 \ epath_pattern_021 \ epath_pattern_022 \ epath_pattern_023 \ epath_pattern_024 \ epath_pattern_025 \ epath_pattern_026 \ epath_pattern_027 \ epath_pattern_028 \ epath_pattern_029 \ epath_pattern_030 \ epath_pattern_031 \ epath_pattern_032 \ epath_pattern_033 \ epath_pattern_034 \ epath_pattern_035 \ epath_pattern_036 \ epath_pattern_037 \ epath_pattern_038 \ epath_pattern_039 \ epath_pattern_040 \ epath_pattern_041 \ epath_pattern_042 \ epath_pattern_043 \ epath_pattern_044 \ epath_pattern_045 \ epath_pattern_046 \ epath_pattern_047 \ epath_pattern_048 \ epath_pattern_049 \ epath_pattern_050 \ epath_pattern_051 \ epath_pattern_052 \ epath_pattern_053 \ epath_pattern_054 \ epath_pattern_055 \ epath_pattern_056 \ epath_pattern_057 \ epath_pattern_058 \ epath_pattern_059 \ epath_pattern_060 \ epath_pattern_061 \ epath_pattern_062 \ epath_pattern_063 \ epath_pattern_064 \ epath_pattern_065 \ epath_pattern_066 \ epath_pattern_067 \ epath_pattern_068 \ epath_pattern_069 \ epath_pattern_070 \ epath_pattern_071 \ epath_pattern_072 \ epath_pattern_073 \ epath_pattern_074 \ epath_pattern_075 \ epath_pattern_076 \ epath_pattern_077 \ epath_pattern_078 \ epath_pattern_079 \ epath_pattern_080 \ epath_pattern_081 \ epath_pattern_082 \ epath_pattern_083 \ epath_pattern_084 \ epath_pattern_085 \ epath_pattern_086 \ epath_pattern_087 \ epath_pattern_088 \ epath_pattern_089 \ epath_pattern_090 \ epath_pattern_091 \ epath_pattern_092 \ epath_pattern_093 \ epath_pattern_094 \ epath_pattern_095 \ epath_pattern_096 \ epath_pattern_097 \ epath_pattern_098 \ epath_pattern_099 \ epath_pattern_100 \ epath_pattern_101 \ epath_pattern_102 \ epath_pattern_103 \ epath_pattern_104 \ epath_pattern_105 \ epath_pattern_106 \ epath_pattern_107 \ epath_pattern_108 \ epath_pattern_109 \ epath_pattern_110 \ epath_pattern_111 \ epath_pattern_112 \ epath_pattern_113 \ epath_pattern_114 \ epath_pattern_115 \ epath_pattern_116 \ epath_pattern_117 \ epath_pattern_118 \ epath_pattern_119 \ epath_pattern_120 \ epath_pattern_121 \ epath_pattern_122 \ epath_pattern_123 \ epath_pattern_124 \ epath_pattern_125 \ epath_pattern_126 \ epath_pattern_127 \ epath_pattern_128 \ epath_pattern_129 \ epath_pattern_130 \ epath_pattern_131 \ epath_pattern_132 \ epath_pattern_133 \ epath_pattern_134 \ epath_pattern_135 \ epath_pattern_136 \ epath_pattern_137 \ epath_pattern_138 \ epath_pattern_139 \ epath_pattern_140 \ epath_pattern_141 \ epath_pattern_142 \ epath_pattern_143 \ epath_pattern_144 \ epath_pattern_145 \ epath_pattern_146 \ epath_pattern_147 \ epath_pattern_148 \ epath_pattern_149 \ epath_pattern_150 \ epath_pattern_151 \ epath_pattern_152 \ epath_pattern_153 \ epath_pattern_154 \ epath_pattern_155 \ epath_pattern_156 \ epath_pattern_157 \ epath_pattern_158 \ epath_pattern_159 \ epath_pattern_160 \ epath_pattern_161 \ epath_pattern_162 \ epath_pattern_163 \ epath_pattern_164 \ epath_pattern_165 \ epath_pattern_166 \ epath_pattern_167 \ epath_pattern_168 \ epath_pattern_169 \ epath_pattern_170 \ epath_pattern_171 \ epath_pattern_172 \ epath_pattern_173 \ epath_pattern_174 \ epath_pattern_175 \ epath_pattern_176 \ epath_pattern_177 \ epath_pattern_178 \ epath_pattern_179 \ epath_pattern_180 \ epath_pattern_181 \ epath_pattern_182 \ epath_pattern_183 \ epath_pattern_184 \ epath_pattern_185 \ epath_pattern_186 \ epath_pattern_187 \ epath_pattern_188 \ epath_pattern_189 \ epath_pattern_190 \ epath_pattern_191 \ epath_pattern_192 \ epath_pattern_193 \ epath_pattern_194 \ epath_pattern_195 \ epath_pattern_196 \ epath_pattern_197 \ epath_pattern_198 \ epath_pattern_199 \ epath_pattern_200 \ epath_pattern_201 \ epath_pattern_202 \ epath_pattern_203 \ epath_pattern_204 \ epath_pattern_205 \ epath_pattern_206 \ epath_pattern_207 \ epath_pattern_208 \ epath_pattern_209 \ epath_pattern_210 \ epath_pattern_211 \ epath_pattern_212 \ epath_pattern_213 \ epath_pattern_214 \ epath_pattern_215 \ epath_pattern_216 \ epath_pattern_217 \ epath_pattern_218 \ epath_pattern_219 \ epath_pattern_220 \ epath_pattern_221 \ epath_pattern_222 \ epath_pattern_223 \ epath_pattern_224 \ epath_pattern_225 \ epath_pattern_226 \ epath_pattern_227 \ epath_pattern_228 \ epath_pattern_229 \ epath_pattern_230 \ epath_pattern_231 \ epath_pattern_232 \ epath_pattern_233 \ epath_pattern_234 \ epath_pattern_235 \ epath_pattern_236 \ epath_pattern_237 \ epath_pattern_238 \ epath_pattern_239 \ epath_pattern_240 \ epath_pattern_241 \ epath_pattern_242 \ epath_pattern_243 \ epath_pattern_244 \ epath_pattern_245 \ epath_pattern_246 \ epath_pattern_247 \ epath_pattern_248 \ epath_pattern_249 \ epath_pattern_250 \ epath_pattern_251 \ epath_pattern_252 \ epath_pattern_253 \ epath_pattern_254 \ epath_pattern_255 \ epath_pattern_256 \ epath_pattern_257 \ epath_pattern_258 \ epath_pattern_259 \ epath_pattern_260 \ epath_pattern_261 \ epath_pattern_262 \ epath_pattern_263 \ epath_pattern_264 \ epath_pattern_265 \ epath_pattern_266 \ epath_pattern_267 \ epath_pattern_268 \ epath_pattern_269 \ epath_pattern_270 \ epath_pattern_271 \ epath_pattern_272 \ epath_pattern_273 \ epath_pattern_274 \ epath_pattern_275 \ epath_pattern_276 \ epath_pattern_277 \ epath_pattern_278 \ epath_pattern_279 \ epath_pattern_280 \ epath_pattern_281 \ epath_pattern_282 \ epath_pattern_283 \ epath_pattern_284 \ epath_pattern_285 \ epath_pattern_286 \ epath_pattern_287 \ epath_pattern_288 \ epath_pattern_289 \ epath_pattern_290 \ epath_pattern_291 \ epath_pattern_292 \ epath_pattern_293 \ epath_pattern_294 \ epath_pattern_295 \ epath_pattern_296 \ epath_pattern_297 \ epath_pattern_298 \ epath_pattern_299 \ epath_pattern_300 \ epath_pattern_301 \ epath_pattern_302 \ epath_pattern_303 \ epath_pattern_304 \ epath_pattern_305 \ epath_pattern_306 \ epath_pattern_307 \ epath_pattern_308 \ epath_pattern_309 \ epath_pattern_310 \ epath_pattern_311 \ epath_pattern_312 \ epath_pattern_313 \ epath_pattern_314 \ epath_pattern_315 \ epath_pattern_316 \ epath_pattern_317 \ epath_pattern_318 \ epath_pattern_319 \ epath_pattern_320 \ epath_pattern_321 \ epath_pattern_322 \ epath_pattern_323 \ epath_pattern_324 \ epath_pattern_325 \ epath_pattern_326 \ epath_pattern_327 \ epath_pattern_328 \ epath_pattern_329 \ epath_pattern_330 \ epath_pattern_331 \ epath_pattern_332 \ epath_pattern_333 \ epath_pattern_334 \ epath_pattern_335 \ epath_pattern_336 \ epath_pattern_337 \ epath_pattern_338 \ epath_pattern_339 \ epath_pattern_340 \ epath_pattern_341 \ epath_pattern_342 \ epath_pattern_343 \ epath_pattern_344 \ epath_pattern_345 \ epath_pattern_346 \ epath_pattern_347 \ epath_pattern_348 \ epath_pattern_349 \ epath_pattern_350 \ epath_pattern_351 \ epath_pattern_352 \ epath_pattern_353 \ epath_pattern_354 \ epath_pattern_355 \ epath_pattern_356 \ epath_pattern_357 \ epath_pattern_358 \ epath_pattern_359 \ epath_pattern_360 \ epath_pattern_361 \ epath_pattern_362 \ epath_pattern_363 \ epath_pattern_364 \ epath_pattern_365 \ epath_pattern_366 \ epath_pattern_367 \ epath_pattern_368 \ epath_pattern_369 \ epath_pattern_370 \ epath_pattern_371 \ epath_pattern_372 \ epath_pattern_373 \ epath_pattern_374 \ epath_pattern_375 \ epath_pattern_376 \ epath_pattern_377 \ epath_pattern_378 \ epath_pattern_379 \ epath_pattern_380 \ epath_pattern_381 \ epath_pattern_382 \ epath_pattern_383 \ epath_pattern_384 \ epath_pattern_385 \ epath_pattern_386 \ epath_pattern_387 \ epath_pattern_388 \ epath_pattern_389 \ epath_pattern_390 \ epath_pattern_391 \ epath_pattern_392 \ epath_pattern_393 \ epath_pattern_394 \ epath_pattern_395 \ epath_pattern_396 \ epath_pattern_397 \ epath_pattern_398 \ epath_pattern_399 \ epath_pattern_400 \ epath_pattern_401 \ epath_pattern_402 \ epath_pattern_403 \ epath_pattern_404 \ epath_pattern_405 \ epath_pattern_406 \ epath_pattern_407 \ epath_pattern_408 \ epath_pattern_409 \ epath_pattern_410 \ epath_pattern_411 \ epath_pattern_412 \ epath_pattern_413 \ epath_pattern_414 \ epath_pattern_415 \ epath_pattern_416 \ epath_pattern_417 \ epath_pattern_418 \ epath_pattern_419 \ epath_pattern_420 \ epath_pattern_421 \ epath_pattern_422 \ epath_pattern_423 \ epath_pattern_424 \ epath_pattern_425 \ epath_pattern_426 \ epath_pattern_427 \ epath_pattern_428 \ epath_pattern_429 \ epath_pattern_430 \ epath_pattern_431 \ epath_pattern_432 \ epath_pattern_433 \ epath_pattern_434 \ epath_pattern_435 \ epath_pattern_436 \ epath_pattern_437 \ epath_pattern_438 \ epath_pattern_439 \ epath_pattern_440 \ epath_pattern_441 \ epath_pattern_442 \ epath_pattern_443 \ epath_pattern_444 \ epath_pattern_445 \ epath_pattern_446 \ epath_pattern_447 \ epath_pattern_448 \ epath_pattern_449 check_PROGRAMS = $(TESTS) epath_utils_test_SOURCES = epath_utils_test.c nodist_epath_utils_test_SOURCES = $(REMOTE_SOURCES) epath_numeric_000_SOURCES = epath_numeric_000.c nodist_epath_numeric_000_SOURCES = $(REMOTE_SOURCES) epath_numeric_001_SOURCES = epath_numeric_001.c nodist_epath_numeric_001_SOURCES = $(REMOTE_SOURCES) epath_numeric_002_SOURCES = epath_numeric_002.c nodist_epath_numeric_002_SOURCES = $(REMOTE_SOURCES) epath_numeric_003_SOURCES = epath_numeric_003.c nodist_epath_numeric_003_SOURCES = $(REMOTE_SOURCES) epath_numeric_004_SOURCES = epath_numeric_004.c nodist_epath_numeric_004_SOURCES = $(REMOTE_SOURCES) epath_numeric_005_SOURCES = epath_numeric_005.c nodist_epath_numeric_005_SOURCES = $(REMOTE_SOURCES) epath_conv_000_SOURCES = epath_conv_000.c nodist_epath_conv_000_SOURCES = $(REMOTE_SOURCES) epath_conv_001_SOURCES = epath_conv_001.c nodist_epath_conv_001_SOURCES = $(REMOTE_SOURCES) epath_conv_002_SOURCES = epath_conv_002.c nodist_epath_conv_002_SOURCES = $(REMOTE_SOURCES) epath_conv_003_SOURCES = epath_conv_003.c nodist_epath_conv_003_SOURCES = $(REMOTE_SOURCES) epath_conv_004_SOURCES = epath_conv_004.c nodist_epath_conv_004_SOURCES = $(REMOTE_SOURCES) epath_conv_005_SOURCES = epath_conv_005.c nodist_epath_conv_005_SOURCES = $(REMOTE_SOURCES) epath_conv_006_SOURCES = epath_conv_006.c nodist_epath_conv_006_SOURCES = $(REMOTE_SOURCES) epath_conv_007_SOURCES = epath_conv_007.c nodist_epath_conv_007_SOURCES = $(REMOTE_SOURCES) epath_conv_008_SOURCES = epath_conv_008.c nodist_epath_conv_008_SOURCES = $(REMOTE_SOURCES) epath_conv_009_SOURCES = epath_conv_009.c nodist_epath_conv_009_SOURCES = $(REMOTE_SOURCES) epath_conv_010_SOURCES = epath_conv_010.c nodist_epath_conv_010_SOURCES = $(REMOTE_SOURCES) epath_conv_011_SOURCES = epath_conv_011.c nodist_epath_conv_011_SOURCES = $(REMOTE_SOURCES) epath_conv_012_SOURCES = epath_conv_012.c nodist_epath_conv_012_SOURCES = $(REMOTE_SOURCES) epath_conv_013_SOURCES = epath_conv_013.c nodist_epath_conv_013_SOURCES = $(REMOTE_SOURCES) epath_conv_014_SOURCES = epath_conv_014.c nodist_epath_conv_014_SOURCES = $(REMOTE_SOURCES) epath_conv_015_SOURCES = epath_conv_015.c nodist_epath_conv_015_SOURCES = $(REMOTE_SOURCES) epath_conv_016_SOURCES = epath_conv_016.c nodist_epath_conv_016_SOURCES = $(REMOTE_SOURCES) epath_conv_017_SOURCES = epath_conv_017.c nodist_epath_conv_017_SOURCES = $(REMOTE_SOURCES) epath_conv_018_SOURCES = epath_conv_018.c nodist_epath_conv_018_SOURCES = $(REMOTE_SOURCES) epath_conv_019_SOURCES = epath_conv_019.c nodist_epath_conv_019_SOURCES = $(REMOTE_SOURCES) epath_conv_020_SOURCES = epath_conv_020.c nodist_epath_conv_020_SOURCES = $(REMOTE_SOURCES) epath_conv_021_SOURCES = epath_conv_021.c nodist_epath_conv_021_SOURCES = $(REMOTE_SOURCES) epath_conv_022_SOURCES = epath_conv_022.c nodist_epath_conv_022_SOURCES = $(REMOTE_SOURCES) epath_conv_023_SOURCES = epath_conv_023.c nodist_epath_conv_023_SOURCES = $(REMOTE_SOURCES) epath_conv_024_SOURCES = epath_conv_024.c nodist_epath_conv_024_SOURCES = $(REMOTE_SOURCES) epath_conv_025_SOURCES = epath_conv_025.c nodist_epath_conv_025_SOURCES = $(REMOTE_SOURCES) epath_conv_026_SOURCES = epath_conv_026.c nodist_epath_conv_026_SOURCES = $(REMOTE_SOURCES) epath_conv_027_SOURCES = epath_conv_027.c nodist_epath_conv_027_SOURCES = $(REMOTE_SOURCES) epath_conv_028_SOURCES = epath_conv_028.c nodist_epath_conv_028_SOURCES = $(REMOTE_SOURCES) epath_conv_029_SOURCES = epath_conv_029.c nodist_epath_conv_029_SOURCES = $(REMOTE_SOURCES) epath_conv_030_SOURCES = epath_conv_030.c nodist_epath_conv_030_SOURCES = $(REMOTE_SOURCES) epath_conv_031_SOURCES = epath_conv_031.c nodist_epath_conv_031_SOURCES = $(REMOTE_SOURCES) epath_conv_032_SOURCES = epath_conv_032.c nodist_epath_conv_032_SOURCES = $(REMOTE_SOURCES) epath_conv_033_SOURCES = epath_conv_033.c nodist_epath_conv_033_SOURCES = $(REMOTE_SOURCES) epath_conv_034_SOURCES = epath_conv_034.c nodist_epath_conv_034_SOURCES = $(REMOTE_SOURCES) epath_conv_035_SOURCES = epath_conv_035.c nodist_epath_conv_035_SOURCES = $(REMOTE_SOURCES) epath_conv_036_SOURCES = epath_conv_036.c nodist_epath_conv_036_SOURCES = $(REMOTE_SOURCES) epath_conv_037_SOURCES = epath_conv_037.c nodist_epath_conv_037_SOURCES = $(REMOTE_SOURCES) epath_conv_038_SOURCES = epath_conv_038.c nodist_epath_conv_038_SOURCES = $(REMOTE_SOURCES) epath_conv_039_SOURCES = epath_conv_039.c nodist_epath_conv_039_SOURCES = $(REMOTE_SOURCES) epath_conv_040_SOURCES = epath_conv_040.c nodist_epath_conv_040_SOURCES = $(REMOTE_SOURCES) epath_conv_041_SOURCES = epath_conv_041.c nodist_epath_conv_041_SOURCES = $(REMOTE_SOURCES) epath_conv_042_SOURCES = epath_conv_042.c nodist_epath_conv_042_SOURCES = $(REMOTE_SOURCES) epath_conv_043_SOURCES = epath_conv_043.c nodist_epath_conv_043_SOURCES = $(REMOTE_SOURCES) epath_conv_044_SOURCES = epath_conv_044.c nodist_epath_conv_044_SOURCES = $(REMOTE_SOURCES) epath_conv_045_SOURCES = epath_conv_045.c nodist_epath_conv_045_SOURCES = $(REMOTE_SOURCES) epath_conv_046_SOURCES = epath_conv_046.c nodist_epath_conv_046_SOURCES = $(REMOTE_SOURCES) epath_conv_047_SOURCES = epath_conv_047.c nodist_epath_conv_047_SOURCES = $(REMOTE_SOURCES) epath_conv_048_SOURCES = epath_conv_048.c nodist_epath_conv_048_SOURCES = $(REMOTE_SOURCES) epath_conv_049_SOURCES = epath_conv_049.c nodist_epath_conv_049_SOURCES = $(REMOTE_SOURCES) epath_conv_050_SOURCES = epath_conv_050.c nodist_epath_conv_050_SOURCES = $(REMOTE_SOURCES) epath_conv_051_SOURCES = epath_conv_051.c nodist_epath_conv_051_SOURCES = $(REMOTE_SOURCES) epath_conv_052_SOURCES = epath_conv_052.c nodist_epath_conv_052_SOURCES = $(REMOTE_SOURCES) epath_conv_053_SOURCES = epath_conv_053.c nodist_epath_conv_053_SOURCES = $(REMOTE_SOURCES) epath_conv_054_SOURCES = epath_conv_054.c nodist_epath_conv_054_SOURCES = $(REMOTE_SOURCES) epath_conv_055_SOURCES = epath_conv_055.c nodist_epath_conv_055_SOURCES = $(REMOTE_SOURCES) epath_conv_056_SOURCES = epath_conv_056.c nodist_epath_conv_056_SOURCES = $(REMOTE_SOURCES) epath_conv_057_SOURCES = epath_conv_057.c nodist_epath_conv_057_SOURCES = $(REMOTE_SOURCES) epath_conv_058_SOURCES = epath_conv_058.c nodist_epath_conv_058_SOURCES = $(REMOTE_SOURCES) epath_conv_059_SOURCES = epath_conv_059.c nodist_epath_conv_059_SOURCES = $(REMOTE_SOURCES) epath_conv_060_SOURCES = epath_conv_060.c nodist_epath_conv_060_SOURCES = $(REMOTE_SOURCES) epath_conv_061_SOURCES = epath_conv_061.c nodist_epath_conv_061_SOURCES = $(REMOTE_SOURCES) epath_conv_062_SOURCES = epath_conv_062.c nodist_epath_conv_062_SOURCES = $(REMOTE_SOURCES) epath_conv_063_SOURCES = epath_conv_063.c nodist_epath_conv_063_SOURCES = $(REMOTE_SOURCES) epath_conv_064_SOURCES = epath_conv_064.c nodist_epath_conv_064_SOURCES = $(REMOTE_SOURCES) epath_conv_065_SOURCES = epath_conv_065.c nodist_epath_conv_065_SOURCES = $(REMOTE_SOURCES) epath_conv_066_SOURCES = epath_conv_066.c nodist_epath_conv_066_SOURCES = $(REMOTE_SOURCES) epath_conv_067_SOURCES = epath_conv_067.c nodist_epath_conv_067_SOURCES = $(REMOTE_SOURCES) epath_conv_068_SOURCES = epath_conv_068.c nodist_epath_conv_068_SOURCES = $(REMOTE_SOURCES) epath_conv_069_SOURCES = epath_conv_069.c nodist_epath_conv_069_SOURCES = $(REMOTE_SOURCES) epath_conv_070_SOURCES = epath_conv_070.c nodist_epath_conv_070_SOURCES = $(REMOTE_SOURCES) epath_conv_071_SOURCES = epath_conv_071.c nodist_epath_conv_071_SOURCES = $(REMOTE_SOURCES) epath_conv_072_SOURCES = epath_conv_072.c nodist_epath_conv_072_SOURCES = $(REMOTE_SOURCES) epath_conv_073_SOURCES = epath_conv_073.c nodist_epath_conv_073_SOURCES = $(REMOTE_SOURCES) epath_conv_074_SOURCES = epath_conv_074.c nodist_epath_conv_074_SOURCES = $(REMOTE_SOURCES) epath_conv_075_SOURCES = epath_conv_075.c nodist_epath_conv_075_SOURCES = $(REMOTE_SOURCES) epath_conv_076_SOURCES = epath_conv_076.c nodist_epath_conv_076_SOURCES = $(REMOTE_SOURCES) epath_conv_077_SOURCES = epath_conv_077.c nodist_epath_conv_077_SOURCES = $(REMOTE_SOURCES) epath_conv_078_SOURCES = epath_conv_078.c nodist_epath_conv_078_SOURCES = $(REMOTE_SOURCES) epath_conv_079_SOURCES = epath_conv_079.c nodist_epath_conv_079_SOURCES = $(REMOTE_SOURCES) epath_conv_080_SOURCES = epath_conv_080.c nodist_epath_conv_080_SOURCES = $(REMOTE_SOURCES) epath_conv_081_SOURCES = epath_conv_081.c nodist_epath_conv_081_SOURCES = $(REMOTE_SOURCES) epath_conv_082_SOURCES = epath_conv_082.c nodist_epath_conv_082_SOURCES = $(REMOTE_SOURCES) epath_conv_083_SOURCES = epath_conv_083.c nodist_epath_conv_083_SOURCES = $(REMOTE_SOURCES) epath_conv_084_SOURCES = epath_conv_084.c nodist_epath_conv_084_SOURCES = $(REMOTE_SOURCES) epath_conv_085_SOURCES = epath_conv_085.c nodist_epath_conv_085_SOURCES = $(REMOTE_SOURCES) epath_conv_086_SOURCES = epath_conv_086.c nodist_epath_conv_086_SOURCES = $(REMOTE_SOURCES) epath_conv_087_SOURCES = epath_conv_087.c nodist_epath_conv_087_SOURCES = $(REMOTE_SOURCES) epath_conv_088_SOURCES = epath_conv_088.c nodist_epath_conv_088_SOURCES = $(REMOTE_SOURCES) epath_conv_089_SOURCES = epath_conv_089.c nodist_epath_conv_089_SOURCES = $(REMOTE_SOURCES) epath_conv_090_SOURCES = epath_conv_090.c nodist_epath_conv_090_SOURCES = $(REMOTE_SOURCES) epath_conv_091_SOURCES = epath_conv_091.c nodist_epath_conv_091_SOURCES = $(REMOTE_SOURCES) epath_conv_092_SOURCES = epath_conv_092.c nodist_epath_conv_092_SOURCES = $(REMOTE_SOURCES) epath_conv_093_SOURCES = epath_conv_093.c nodist_epath_conv_093_SOURCES = $(REMOTE_SOURCES) epath_conv_094_SOURCES = epath_conv_094.c nodist_epath_conv_094_SOURCES = $(REMOTE_SOURCES) epath_conv_095_SOURCES = epath_conv_095.c nodist_epath_conv_095_SOURCES = $(REMOTE_SOURCES) epath_conv_096_SOURCES = epath_conv_096.c nodist_epath_conv_096_SOURCES = $(REMOTE_SOURCES) epath_conv_097_SOURCES = epath_conv_097.c nodist_epath_conv_097_SOURCES = $(REMOTE_SOURCES) epath_conv_098_SOURCES = epath_conv_098.c nodist_epath_conv_098_SOURCES = $(REMOTE_SOURCES) epath_conv_099_SOURCES = epath_conv_099.c nodist_epath_conv_099_SOURCES = $(REMOTE_SOURCES) epath_conv_100_SOURCES = epath_conv_100.c nodist_epath_conv_100_SOURCES = $(REMOTE_SOURCES) epath_conv_101_SOURCES = epath_conv_101.c nodist_epath_conv_101_SOURCES = $(REMOTE_SOURCES) ep_cmp_000_SOURCES = ep_cmp_000.c nodist_ep_cmp_000_SOURCES = $(REMOTE_SOURCES) ep_cmp_001_SOURCES = ep_cmp_001.c nodist_ep_cmp_001_SOURCES = $(REMOTE_SOURCES) ep_cmp_002_SOURCES = ep_cmp_002.c nodist_ep_cmp_002_SOURCES = $(REMOTE_SOURCES) ep_cmp_003_SOURCES = ep_cmp_003.c nodist_ep_cmp_003_SOURCES = $(REMOTE_SOURCES) ep_cmp_004_SOURCES = ep_cmp_004.c nodist_ep_cmp_004_SOURCES = $(REMOTE_SOURCES) ep_cmp_005_SOURCES = ep_cmp_005.c nodist_ep_cmp_005_SOURCES = $(REMOTE_SOURCES) ep_cmp_006_SOURCES = ep_cmp_006.c nodist_ep_cmp_006_SOURCES = $(REMOTE_SOURCES) ep_cmp_007_SOURCES = ep_cmp_007.c nodist_ep_cmp_007_SOURCES = $(REMOTE_SOURCES) ep_cmp_008_SOURCES = ep_cmp_008.c nodist_ep_cmp_008_SOURCES = $(REMOTE_SOURCES) ep_cmp_009_SOURCES = ep_cmp_009.c nodist_ep_cmp_009_SOURCES = $(REMOTE_SOURCES) ep_cmp_010_SOURCES = ep_cmp_010.c nodist_ep_cmp_010_SOURCES = $(REMOTE_SOURCES) ep_cmp_011_SOURCES = ep_cmp_011.c nodist_ep_cmp_011_SOURCES = $(REMOTE_SOURCES) ep_concat_000_SOURCES = ep_concat_000.c nodist_ep_concat_000_SOURCES = $(REMOTE_SOURCES) ep_concat_001_SOURCES = ep_concat_001.c nodist_ep_concat_001_SOURCES = $(REMOTE_SOURCES) ep_concat_002_SOURCES = ep_concat_002.c nodist_ep_concat_002_SOURCES = $(REMOTE_SOURCES) ep_concat_003_SOURCES = ep_concat_003.c nodist_ep_concat_003_SOURCES = $(REMOTE_SOURCES) ep_concat_004_SOURCES = ep_concat_004.c nodist_ep_concat_004_SOURCES = $(REMOTE_SOURCES) ep_concat_005_SOURCES = ep_concat_005.c nodist_ep_concat_005_SOURCES = $(REMOTE_SOURCES) ep_concat_006_SOURCES = ep_concat_006.c nodist_ep_concat_006_SOURCES = $(REMOTE_SOURCES) ep_concat_007_SOURCES = ep_concat_007.c nodist_ep_concat_007_SOURCES = $(REMOTE_SOURCES) ep_concat_008_SOURCES = ep_concat_008.c nodist_ep_concat_008_SOURCES = $(REMOTE_SOURCES) ep_concat_009_SOURCES = ep_concat_009.c nodist_ep_concat_009_SOURCES = $(REMOTE_SOURCES) ep_concat_010_SOURCES = ep_concat_010.c nodist_ep_concat_010_SOURCES = $(REMOTE_SOURCES) ep_concat_011_SOURCES = ep_concat_011.c nodist_ep_concat_011_SOURCES = $(REMOTE_SOURCES) ep_concat_012_SOURCES = ep_concat_012.c nodist_ep_concat_012_SOURCES = $(REMOTE_SOURCES) ep_concat_013_SOURCES = ep_concat_013.c nodist_ep_concat_013_SOURCES = $(REMOTE_SOURCES) ep_concat_014_SOURCES = ep_concat_014.c nodist_ep_concat_014_SOURCES = $(REMOTE_SOURCES) ep_concat_015_SOURCES = ep_concat_015.c nodist_ep_concat_015_SOURCES = $(REMOTE_SOURCES) ep_derive_001_SOURCES = ep_derive_001.c nodist_ep_derive_001_SOURCES = $(REMOTE_SOURCES) set_ep_loc_000_SOURCES = set_ep_loc_000.c nodist_set_ep_loc_000_SOURCES = $(REMOTE_SOURCES) set_ep_loc_001_SOURCES = set_ep_loc_001.c nodist_set_ep_loc_001_SOURCES = $(REMOTE_SOURCES) set_ep_loc_002_SOURCES = set_ep_loc_002.c nodist_set_ep_loc_002_SOURCES = $(REMOTE_SOURCES) set_ep_loc_003_SOURCES = set_ep_loc_003.c nodist_set_ep_loc_003_SOURCES = $(REMOTE_SOURCES) set_ep_loc_004_SOURCES = set_ep_loc_004.c nodist_set_ep_loc_004_SOURCES = $(REMOTE_SOURCES) set_ep_loc_005_SOURCES = set_ep_loc_005.c nodist_set_ep_loc_005_SOURCES = $(REMOTE_SOURCES) set_ep_loc_006_SOURCES = set_ep_loc_006.c nodist_set_ep_loc_006_SOURCES = $(REMOTE_SOURCES) set_ep_loc_007_SOURCES = set_ep_loc_007.c nodist_set_ep_loc_007_SOURCES = $(REMOTE_SOURCES) set_ep_loc_008_SOURCES = set_ep_loc_008.c nodist_set_ep_loc_008_SOURCES = $(REMOTE_SOURCES) set_ep_loc_009_SOURCES = set_ep_loc_009.c nodist_set_ep_loc_009_SOURCES = $(REMOTE_SOURCES) set_ep_loc_010_SOURCES = set_ep_loc_010.c nodist_set_ep_loc_010_SOURCES = $(REMOTE_SOURCES) set_ep_loc_011_SOURCES = set_ep_loc_011.c nodist_set_ep_loc_011_SOURCES = $(REMOTE_SOURCES) set_ep_loc_012_SOURCES = set_ep_loc_012.c nodist_set_ep_loc_012_SOURCES = $(REMOTE_SOURCES) set_ep_loc_013_SOURCES = set_ep_loc_013.c nodist_set_ep_loc_013_SOURCES = $(REMOTE_SOURCES) print_ep_000_SOURCES = print_ep_000.c nodist_print_ep_000_SOURCES = $(REMOTE_SOURCES) print_ep_001_SOURCES = print_ep_001.c nodist_print_ep_001_SOURCES = $(REMOTE_SOURCES) print_ep_002_SOURCES = print_ep_002.c nodist_print_ep_002_SOURCES = $(REMOTE_SOURCES) print_ep_003_SOURCES = print_ep_003.c nodist_print_ep_003_SOURCES = $(REMOTE_SOURCES) print_ep_004_SOURCES = print_ep_004.c nodist_print_ep_004_SOURCES = $(REMOTE_SOURCES) print_ep_005_SOURCES = print_ep_005.c nodist_print_ep_005_SOURCES = $(REMOTE_SOURCES) epath_pattern_000_SOURCES = epath_pattern_000.c nodist_epath_pattern_000_SOURCES = $(REMOTE_SOURCES) epath_pattern_001_SOURCES = epath_pattern_001.c nodist_epath_pattern_001_SOURCES = $(REMOTE_SOURCES) epath_pattern_002_SOURCES = epath_pattern_002.c nodist_epath_pattern_002_SOURCES = $(REMOTE_SOURCES) epath_pattern_003_SOURCES = epath_pattern_003.c nodist_epath_pattern_003_SOURCES = $(REMOTE_SOURCES) epath_pattern_004_SOURCES = epath_pattern_004.c nodist_epath_pattern_004_SOURCES = $(REMOTE_SOURCES) epath_pattern_005_SOURCES = epath_pattern_005.c nodist_epath_pattern_005_SOURCES = $(REMOTE_SOURCES) epath_pattern_006_SOURCES = epath_pattern_006.c nodist_epath_pattern_006_SOURCES = $(REMOTE_SOURCES) epath_pattern_007_SOURCES = epath_pattern_007.c nodist_epath_pattern_007_SOURCES = $(REMOTE_SOURCES) epath_pattern_008_SOURCES = epath_pattern_008.c nodist_epath_pattern_008_SOURCES = $(REMOTE_SOURCES) epath_pattern_009_SOURCES = epath_pattern_009.c nodist_epath_pattern_009_SOURCES = $(REMOTE_SOURCES) epath_pattern_010_SOURCES = epath_pattern_010.c nodist_epath_pattern_010_SOURCES = $(REMOTE_SOURCES) epath_pattern_011_SOURCES = epath_pattern_011.c nodist_epath_pattern_011_SOURCES = $(REMOTE_SOURCES) epath_pattern_012_SOURCES = epath_pattern_012.c nodist_epath_pattern_012_SOURCES = $(REMOTE_SOURCES) epath_pattern_013_SOURCES = epath_pattern_013.c nodist_epath_pattern_013_SOURCES = $(REMOTE_SOURCES) epath_pattern_014_SOURCES = epath_pattern_014.c nodist_epath_pattern_014_SOURCES = $(REMOTE_SOURCES) epath_pattern_015_SOURCES = epath_pattern_015.c nodist_epath_pattern_015_SOURCES = $(REMOTE_SOURCES) epath_pattern_016_SOURCES = epath_pattern_016.c nodist_epath_pattern_016_SOURCES = $(REMOTE_SOURCES) epath_pattern_017_SOURCES = epath_pattern_017.c nodist_epath_pattern_017_SOURCES = $(REMOTE_SOURCES) epath_pattern_018_SOURCES = epath_pattern_018.c nodist_epath_pattern_018_SOURCES = $(REMOTE_SOURCES) epath_pattern_019_SOURCES = epath_pattern_019.c nodist_epath_pattern_019_SOURCES = $(REMOTE_SOURCES) epath_pattern_020_SOURCES = epath_pattern_020.c nodist_epath_pattern_020_SOURCES = $(REMOTE_SOURCES) epath_pattern_021_SOURCES = epath_pattern_021.c nodist_epath_pattern_021_SOURCES = $(REMOTE_SOURCES) epath_pattern_022_SOURCES = epath_pattern_022.c nodist_epath_pattern_022_SOURCES = $(REMOTE_SOURCES) epath_pattern_023_SOURCES = epath_pattern_023.c nodist_epath_pattern_023_SOURCES = $(REMOTE_SOURCES) epath_pattern_024_SOURCES = epath_pattern_024.c nodist_epath_pattern_024_SOURCES = $(REMOTE_SOURCES) epath_pattern_025_SOURCES = epath_pattern_025.c nodist_epath_pattern_025_SOURCES = $(REMOTE_SOURCES) epath_pattern_026_SOURCES = epath_pattern_026.c nodist_epath_pattern_026_SOURCES = $(REMOTE_SOURCES) epath_pattern_027_SOURCES = epath_pattern_027.c nodist_epath_pattern_027_SOURCES = $(REMOTE_SOURCES) epath_pattern_028_SOURCES = epath_pattern_028.c nodist_epath_pattern_028_SOURCES = $(REMOTE_SOURCES) epath_pattern_029_SOURCES = epath_pattern_029.c nodist_epath_pattern_029_SOURCES = $(REMOTE_SOURCES) epath_pattern_030_SOURCES = epath_pattern_030.c nodist_epath_pattern_030_SOURCES = $(REMOTE_SOURCES) epath_pattern_031_SOURCES = epath_pattern_031.c nodist_epath_pattern_031_SOURCES = $(REMOTE_SOURCES) epath_pattern_032_SOURCES = epath_pattern_032.c nodist_epath_pattern_032_SOURCES = $(REMOTE_SOURCES) epath_pattern_033_SOURCES = epath_pattern_033.c nodist_epath_pattern_033_SOURCES = $(REMOTE_SOURCES) epath_pattern_034_SOURCES = epath_pattern_034.c nodist_epath_pattern_034_SOURCES = $(REMOTE_SOURCES) epath_pattern_035_SOURCES = epath_pattern_035.c nodist_epath_pattern_035_SOURCES = $(REMOTE_SOURCES) epath_pattern_036_SOURCES = epath_pattern_036.c nodist_epath_pattern_036_SOURCES = $(REMOTE_SOURCES) epath_pattern_037_SOURCES = epath_pattern_037.c nodist_epath_pattern_037_SOURCES = $(REMOTE_SOURCES) epath_pattern_038_SOURCES = epath_pattern_038.c nodist_epath_pattern_038_SOURCES = $(REMOTE_SOURCES) epath_pattern_039_SOURCES = epath_pattern_039.c nodist_epath_pattern_039_SOURCES = $(REMOTE_SOURCES) epath_pattern_040_SOURCES = epath_pattern_040.c nodist_epath_pattern_040_SOURCES = $(REMOTE_SOURCES) epath_pattern_041_SOURCES = epath_pattern_041.c nodist_epath_pattern_041_SOURCES = $(REMOTE_SOURCES) epath_pattern_042_SOURCES = epath_pattern_042.c nodist_epath_pattern_042_SOURCES = $(REMOTE_SOURCES) epath_pattern_043_SOURCES = epath_pattern_043.c nodist_epath_pattern_043_SOURCES = $(REMOTE_SOURCES) epath_pattern_044_SOURCES = epath_pattern_044.c nodist_epath_pattern_044_SOURCES = $(REMOTE_SOURCES) epath_pattern_045_SOURCES = epath_pattern_045.c nodist_epath_pattern_045_SOURCES = $(REMOTE_SOURCES) epath_pattern_046_SOURCES = epath_pattern_046.c nodist_epath_pattern_046_SOURCES = $(REMOTE_SOURCES) epath_pattern_047_SOURCES = epath_pattern_047.c nodist_epath_pattern_047_SOURCES = $(REMOTE_SOURCES) epath_pattern_048_SOURCES = epath_pattern_048.c nodist_epath_pattern_048_SOURCES = $(REMOTE_SOURCES) epath_pattern_049_SOURCES = epath_pattern_049.c nodist_epath_pattern_049_SOURCES = $(REMOTE_SOURCES) epath_pattern_050_SOURCES = epath_pattern_050.c nodist_epath_pattern_050_SOURCES = $(REMOTE_SOURCES) epath_pattern_051_SOURCES = epath_pattern_051.c nodist_epath_pattern_051_SOURCES = $(REMOTE_SOURCES) epath_pattern_052_SOURCES = epath_pattern_052.c nodist_epath_pattern_052_SOURCES = $(REMOTE_SOURCES) epath_pattern_053_SOURCES = epath_pattern_053.c nodist_epath_pattern_053_SOURCES = $(REMOTE_SOURCES) epath_pattern_054_SOURCES = epath_pattern_054.c nodist_epath_pattern_054_SOURCES = $(REMOTE_SOURCES) epath_pattern_055_SOURCES = epath_pattern_055.c nodist_epath_pattern_055_SOURCES = $(REMOTE_SOURCES) epath_pattern_056_SOURCES = epath_pattern_056.c nodist_epath_pattern_056_SOURCES = $(REMOTE_SOURCES) epath_pattern_057_SOURCES = epath_pattern_057.c nodist_epath_pattern_057_SOURCES = $(REMOTE_SOURCES) epath_pattern_058_SOURCES = epath_pattern_058.c nodist_epath_pattern_058_SOURCES = $(REMOTE_SOURCES) epath_pattern_059_SOURCES = epath_pattern_059.c nodist_epath_pattern_059_SOURCES = $(REMOTE_SOURCES) epath_pattern_060_SOURCES = epath_pattern_060.c nodist_epath_pattern_060_SOURCES = $(REMOTE_SOURCES) epath_pattern_061_SOURCES = epath_pattern_061.c nodist_epath_pattern_061_SOURCES = $(REMOTE_SOURCES) epath_pattern_062_SOURCES = epath_pattern_062.c nodist_epath_pattern_062_SOURCES = $(REMOTE_SOURCES) epath_pattern_063_SOURCES = epath_pattern_063.c nodist_epath_pattern_063_SOURCES = $(REMOTE_SOURCES) epath_pattern_064_SOURCES = epath_pattern_064.c nodist_epath_pattern_064_SOURCES = $(REMOTE_SOURCES) epath_pattern_065_SOURCES = epath_pattern_065.c nodist_epath_pattern_065_SOURCES = $(REMOTE_SOURCES) epath_pattern_066_SOURCES = epath_pattern_066.c nodist_epath_pattern_066_SOURCES = $(REMOTE_SOURCES) epath_pattern_067_SOURCES = epath_pattern_067.c nodist_epath_pattern_067_SOURCES = $(REMOTE_SOURCES) epath_pattern_068_SOURCES = epath_pattern_068.c nodist_epath_pattern_068_SOURCES = $(REMOTE_SOURCES) epath_pattern_069_SOURCES = epath_pattern_069.c nodist_epath_pattern_069_SOURCES = $(REMOTE_SOURCES) epath_pattern_070_SOURCES = epath_pattern_070.c nodist_epath_pattern_070_SOURCES = $(REMOTE_SOURCES) epath_pattern_071_SOURCES = epath_pattern_071.c nodist_epath_pattern_071_SOURCES = $(REMOTE_SOURCES) epath_pattern_072_SOURCES = epath_pattern_072.c nodist_epath_pattern_072_SOURCES = $(REMOTE_SOURCES) epath_pattern_073_SOURCES = epath_pattern_073.c nodist_epath_pattern_073_SOURCES = $(REMOTE_SOURCES) epath_pattern_074_SOURCES = epath_pattern_074.c nodist_epath_pattern_074_SOURCES = $(REMOTE_SOURCES) epath_pattern_075_SOURCES = epath_pattern_075.c nodist_epath_pattern_075_SOURCES = $(REMOTE_SOURCES) epath_pattern_076_SOURCES = epath_pattern_076.c nodist_epath_pattern_076_SOURCES = $(REMOTE_SOURCES) epath_pattern_077_SOURCES = epath_pattern_077.c nodist_epath_pattern_077_SOURCES = $(REMOTE_SOURCES) epath_pattern_078_SOURCES = epath_pattern_078.c nodist_epath_pattern_078_SOURCES = $(REMOTE_SOURCES) epath_pattern_079_SOURCES = epath_pattern_079.c nodist_epath_pattern_079_SOURCES = $(REMOTE_SOURCES) epath_pattern_080_SOURCES = epath_pattern_080.c nodist_epath_pattern_080_SOURCES = $(REMOTE_SOURCES) epath_pattern_081_SOURCES = epath_pattern_081.c nodist_epath_pattern_081_SOURCES = $(REMOTE_SOURCES) epath_pattern_082_SOURCES = epath_pattern_082.c nodist_epath_pattern_082_SOURCES = $(REMOTE_SOURCES) epath_pattern_083_SOURCES = epath_pattern_083.c nodist_epath_pattern_083_SOURCES = $(REMOTE_SOURCES) epath_pattern_084_SOURCES = epath_pattern_084.c nodist_epath_pattern_084_SOURCES = $(REMOTE_SOURCES) epath_pattern_085_SOURCES = epath_pattern_085.c nodist_epath_pattern_085_SOURCES = $(REMOTE_SOURCES) epath_pattern_086_SOURCES = epath_pattern_086.c nodist_epath_pattern_086_SOURCES = $(REMOTE_SOURCES) epath_pattern_087_SOURCES = epath_pattern_087.c nodist_epath_pattern_087_SOURCES = $(REMOTE_SOURCES) epath_pattern_088_SOURCES = epath_pattern_088.c nodist_epath_pattern_088_SOURCES = $(REMOTE_SOURCES) epath_pattern_089_SOURCES = epath_pattern_089.c nodist_epath_pattern_089_SOURCES = $(REMOTE_SOURCES) epath_pattern_090_SOURCES = epath_pattern_090.c nodist_epath_pattern_090_SOURCES = $(REMOTE_SOURCES) epath_pattern_091_SOURCES = epath_pattern_091.c nodist_epath_pattern_091_SOURCES = $(REMOTE_SOURCES) epath_pattern_092_SOURCES = epath_pattern_092.c nodist_epath_pattern_092_SOURCES = $(REMOTE_SOURCES) epath_pattern_093_SOURCES = epath_pattern_093.c nodist_epath_pattern_093_SOURCES = $(REMOTE_SOURCES) epath_pattern_094_SOURCES = epath_pattern_094.c nodist_epath_pattern_094_SOURCES = $(REMOTE_SOURCES) epath_pattern_095_SOURCES = epath_pattern_095.c nodist_epath_pattern_095_SOURCES = $(REMOTE_SOURCES) epath_pattern_096_SOURCES = epath_pattern_096.c nodist_epath_pattern_096_SOURCES = $(REMOTE_SOURCES) epath_pattern_097_SOURCES = epath_pattern_097.c nodist_epath_pattern_097_SOURCES = $(REMOTE_SOURCES) epath_pattern_098_SOURCES = epath_pattern_098.c nodist_epath_pattern_098_SOURCES = $(REMOTE_SOURCES) epath_pattern_099_SOURCES = epath_pattern_099.c nodist_epath_pattern_099_SOURCES = $(REMOTE_SOURCES) epath_pattern_100_SOURCES = epath_pattern_100.c nodist_epath_pattern_100_SOURCES = $(REMOTE_SOURCES) epath_pattern_101_SOURCES = epath_pattern_101.c nodist_epath_pattern_101_SOURCES = $(REMOTE_SOURCES) epath_pattern_102_SOURCES = epath_pattern_102.c nodist_epath_pattern_102_SOURCES = $(REMOTE_SOURCES) epath_pattern_103_SOURCES = epath_pattern_103.c nodist_epath_pattern_103_SOURCES = $(REMOTE_SOURCES) epath_pattern_104_SOURCES = epath_pattern_104.c nodist_epath_pattern_104_SOURCES = $(REMOTE_SOURCES) epath_pattern_105_SOURCES = epath_pattern_105.c nodist_epath_pattern_105_SOURCES = $(REMOTE_SOURCES) epath_pattern_106_SOURCES = epath_pattern_106.c nodist_epath_pattern_106_SOURCES = $(REMOTE_SOURCES) epath_pattern_107_SOURCES = epath_pattern_107.c nodist_epath_pattern_107_SOURCES = $(REMOTE_SOURCES) epath_pattern_108_SOURCES = epath_pattern_108.c nodist_epath_pattern_108_SOURCES = $(REMOTE_SOURCES) epath_pattern_109_SOURCES = epath_pattern_109.c nodist_epath_pattern_109_SOURCES = $(REMOTE_SOURCES) epath_pattern_110_SOURCES = epath_pattern_110.c nodist_epath_pattern_110_SOURCES = $(REMOTE_SOURCES) epath_pattern_111_SOURCES = epath_pattern_111.c nodist_epath_pattern_111_SOURCES = $(REMOTE_SOURCES) epath_pattern_112_SOURCES = epath_pattern_112.c nodist_epath_pattern_112_SOURCES = $(REMOTE_SOURCES) epath_pattern_113_SOURCES = epath_pattern_113.c nodist_epath_pattern_113_SOURCES = $(REMOTE_SOURCES) epath_pattern_114_SOURCES = epath_pattern_114.c nodist_epath_pattern_114_SOURCES = $(REMOTE_SOURCES) epath_pattern_115_SOURCES = epath_pattern_115.c nodist_epath_pattern_115_SOURCES = $(REMOTE_SOURCES) epath_pattern_116_SOURCES = epath_pattern_116.c nodist_epath_pattern_116_SOURCES = $(REMOTE_SOURCES) epath_pattern_117_SOURCES = epath_pattern_117.c nodist_epath_pattern_117_SOURCES = $(REMOTE_SOURCES) epath_pattern_118_SOURCES = epath_pattern_118.c nodist_epath_pattern_118_SOURCES = $(REMOTE_SOURCES) epath_pattern_119_SOURCES = epath_pattern_119.c nodist_epath_pattern_119_SOURCES = $(REMOTE_SOURCES) epath_pattern_120_SOURCES = epath_pattern_120.c nodist_epath_pattern_120_SOURCES = $(REMOTE_SOURCES) epath_pattern_121_SOURCES = epath_pattern_121.c nodist_epath_pattern_121_SOURCES = $(REMOTE_SOURCES) epath_pattern_122_SOURCES = epath_pattern_122.c nodist_epath_pattern_122_SOURCES = $(REMOTE_SOURCES) epath_pattern_123_SOURCES = epath_pattern_123.c nodist_epath_pattern_123_SOURCES = $(REMOTE_SOURCES) epath_pattern_124_SOURCES = epath_pattern_124.c nodist_epath_pattern_124_SOURCES = $(REMOTE_SOURCES) epath_pattern_125_SOURCES = epath_pattern_125.c nodist_epath_pattern_125_SOURCES = $(REMOTE_SOURCES) epath_pattern_126_SOURCES = epath_pattern_126.c nodist_epath_pattern_126_SOURCES = $(REMOTE_SOURCES) epath_pattern_127_SOURCES = epath_pattern_127.c nodist_epath_pattern_127_SOURCES = $(REMOTE_SOURCES) epath_pattern_128_SOURCES = epath_pattern_128.c nodist_epath_pattern_128_SOURCES = $(REMOTE_SOURCES) epath_pattern_129_SOURCES = epath_pattern_129.c nodist_epath_pattern_129_SOURCES = $(REMOTE_SOURCES) epath_pattern_130_SOURCES = epath_pattern_130.c nodist_epath_pattern_130_SOURCES = $(REMOTE_SOURCES) epath_pattern_131_SOURCES = epath_pattern_131.c nodist_epath_pattern_131_SOURCES = $(REMOTE_SOURCES) epath_pattern_132_SOURCES = epath_pattern_132.c nodist_epath_pattern_132_SOURCES = $(REMOTE_SOURCES) epath_pattern_133_SOURCES = epath_pattern_133.c nodist_epath_pattern_133_SOURCES = $(REMOTE_SOURCES) epath_pattern_134_SOURCES = epath_pattern_134.c nodist_epath_pattern_134_SOURCES = $(REMOTE_SOURCES) epath_pattern_135_SOURCES = epath_pattern_135.c nodist_epath_pattern_135_SOURCES = $(REMOTE_SOURCES) epath_pattern_136_SOURCES = epath_pattern_136.c nodist_epath_pattern_136_SOURCES = $(REMOTE_SOURCES) epath_pattern_137_SOURCES = epath_pattern_137.c nodist_epath_pattern_137_SOURCES = $(REMOTE_SOURCES) epath_pattern_138_SOURCES = epath_pattern_138.c nodist_epath_pattern_138_SOURCES = $(REMOTE_SOURCES) epath_pattern_139_SOURCES = epath_pattern_139.c nodist_epath_pattern_139_SOURCES = $(REMOTE_SOURCES) epath_pattern_140_SOURCES = epath_pattern_140.c nodist_epath_pattern_140_SOURCES = $(REMOTE_SOURCES) epath_pattern_141_SOURCES = epath_pattern_141.c nodist_epath_pattern_141_SOURCES = $(REMOTE_SOURCES) epath_pattern_142_SOURCES = epath_pattern_142.c nodist_epath_pattern_142_SOURCES = $(REMOTE_SOURCES) epath_pattern_143_SOURCES = epath_pattern_143.c nodist_epath_pattern_143_SOURCES = $(REMOTE_SOURCES) epath_pattern_144_SOURCES = epath_pattern_144.c nodist_epath_pattern_144_SOURCES = $(REMOTE_SOURCES) epath_pattern_145_SOURCES = epath_pattern_145.c nodist_epath_pattern_145_SOURCES = $(REMOTE_SOURCES) epath_pattern_146_SOURCES = epath_pattern_146.c nodist_epath_pattern_146_SOURCES = $(REMOTE_SOURCES) epath_pattern_147_SOURCES = epath_pattern_147.c nodist_epath_pattern_147_SOURCES = $(REMOTE_SOURCES) epath_pattern_148_SOURCES = epath_pattern_148.c nodist_epath_pattern_148_SOURCES = $(REMOTE_SOURCES) epath_pattern_149_SOURCES = epath_pattern_149.c nodist_epath_pattern_149_SOURCES = $(REMOTE_SOURCES) epath_pattern_150_SOURCES = epath_pattern_150.c nodist_epath_pattern_150_SOURCES = $(REMOTE_SOURCES) epath_pattern_151_SOURCES = epath_pattern_151.c nodist_epath_pattern_151_SOURCES = $(REMOTE_SOURCES) epath_pattern_152_SOURCES = epath_pattern_152.c nodist_epath_pattern_152_SOURCES = $(REMOTE_SOURCES) epath_pattern_153_SOURCES = epath_pattern_153.c nodist_epath_pattern_153_SOURCES = $(REMOTE_SOURCES) epath_pattern_154_SOURCES = epath_pattern_154.c nodist_epath_pattern_154_SOURCES = $(REMOTE_SOURCES) epath_pattern_155_SOURCES = epath_pattern_155.c nodist_epath_pattern_155_SOURCES = $(REMOTE_SOURCES) epath_pattern_156_SOURCES = epath_pattern_156.c nodist_epath_pattern_156_SOURCES = $(REMOTE_SOURCES) epath_pattern_157_SOURCES = epath_pattern_157.c nodist_epath_pattern_157_SOURCES = $(REMOTE_SOURCES) epath_pattern_158_SOURCES = epath_pattern_158.c nodist_epath_pattern_158_SOURCES = $(REMOTE_SOURCES) epath_pattern_159_SOURCES = epath_pattern_159.c nodist_epath_pattern_159_SOURCES = $(REMOTE_SOURCES) epath_pattern_160_SOURCES = epath_pattern_160.c nodist_epath_pattern_160_SOURCES = $(REMOTE_SOURCES) epath_pattern_161_SOURCES = epath_pattern_161.c nodist_epath_pattern_161_SOURCES = $(REMOTE_SOURCES) epath_pattern_162_SOURCES = epath_pattern_162.c nodist_epath_pattern_162_SOURCES = $(REMOTE_SOURCES) epath_pattern_163_SOURCES = epath_pattern_163.c nodist_epath_pattern_163_SOURCES = $(REMOTE_SOURCES) epath_pattern_164_SOURCES = epath_pattern_164.c nodist_epath_pattern_164_SOURCES = $(REMOTE_SOURCES) epath_pattern_165_SOURCES = epath_pattern_165.c nodist_epath_pattern_165_SOURCES = $(REMOTE_SOURCES) epath_pattern_166_SOURCES = epath_pattern_166.c nodist_epath_pattern_166_SOURCES = $(REMOTE_SOURCES) epath_pattern_167_SOURCES = epath_pattern_167.c nodist_epath_pattern_167_SOURCES = $(REMOTE_SOURCES) epath_pattern_168_SOURCES = epath_pattern_168.c nodist_epath_pattern_168_SOURCES = $(REMOTE_SOURCES) epath_pattern_169_SOURCES = epath_pattern_169.c nodist_epath_pattern_169_SOURCES = $(REMOTE_SOURCES) epath_pattern_170_SOURCES = epath_pattern_170.c nodist_epath_pattern_170_SOURCES = $(REMOTE_SOURCES) epath_pattern_171_SOURCES = epath_pattern_171.c nodist_epath_pattern_171_SOURCES = $(REMOTE_SOURCES) epath_pattern_172_SOURCES = epath_pattern_172.c nodist_epath_pattern_172_SOURCES = $(REMOTE_SOURCES) epath_pattern_173_SOURCES = epath_pattern_173.c nodist_epath_pattern_173_SOURCES = $(REMOTE_SOURCES) epath_pattern_174_SOURCES = epath_pattern_174.c nodist_epath_pattern_174_SOURCES = $(REMOTE_SOURCES) epath_pattern_175_SOURCES = epath_pattern_175.c nodist_epath_pattern_175_SOURCES = $(REMOTE_SOURCES) epath_pattern_176_SOURCES = epath_pattern_176.c nodist_epath_pattern_176_SOURCES = $(REMOTE_SOURCES) epath_pattern_177_SOURCES = epath_pattern_177.c nodist_epath_pattern_177_SOURCES = $(REMOTE_SOURCES) epath_pattern_178_SOURCES = epath_pattern_178.c nodist_epath_pattern_178_SOURCES = $(REMOTE_SOURCES) epath_pattern_179_SOURCES = epath_pattern_179.c nodist_epath_pattern_179_SOURCES = $(REMOTE_SOURCES) epath_pattern_180_SOURCES = epath_pattern_180.c nodist_epath_pattern_180_SOURCES = $(REMOTE_SOURCES) epath_pattern_181_SOURCES = epath_pattern_181.c nodist_epath_pattern_181_SOURCES = $(REMOTE_SOURCES) epath_pattern_182_SOURCES = epath_pattern_182.c nodist_epath_pattern_182_SOURCES = $(REMOTE_SOURCES) epath_pattern_183_SOURCES = epath_pattern_183.c nodist_epath_pattern_183_SOURCES = $(REMOTE_SOURCES) epath_pattern_184_SOURCES = epath_pattern_184.c nodist_epath_pattern_184_SOURCES = $(REMOTE_SOURCES) epath_pattern_185_SOURCES = epath_pattern_185.c nodist_epath_pattern_185_SOURCES = $(REMOTE_SOURCES) epath_pattern_186_SOURCES = epath_pattern_186.c nodist_epath_pattern_186_SOURCES = $(REMOTE_SOURCES) epath_pattern_187_SOURCES = epath_pattern_187.c nodist_epath_pattern_187_SOURCES = $(REMOTE_SOURCES) epath_pattern_188_SOURCES = epath_pattern_188.c nodist_epath_pattern_188_SOURCES = $(REMOTE_SOURCES) epath_pattern_189_SOURCES = epath_pattern_189.c nodist_epath_pattern_189_SOURCES = $(REMOTE_SOURCES) epath_pattern_190_SOURCES = epath_pattern_190.c nodist_epath_pattern_190_SOURCES = $(REMOTE_SOURCES) epath_pattern_191_SOURCES = epath_pattern_191.c nodist_epath_pattern_191_SOURCES = $(REMOTE_SOURCES) epath_pattern_192_SOURCES = epath_pattern_192.c nodist_epath_pattern_192_SOURCES = $(REMOTE_SOURCES) epath_pattern_193_SOURCES = epath_pattern_193.c nodist_epath_pattern_193_SOURCES = $(REMOTE_SOURCES) epath_pattern_194_SOURCES = epath_pattern_194.c nodist_epath_pattern_194_SOURCES = $(REMOTE_SOURCES) epath_pattern_195_SOURCES = epath_pattern_195.c nodist_epath_pattern_195_SOURCES = $(REMOTE_SOURCES) epath_pattern_196_SOURCES = epath_pattern_196.c nodist_epath_pattern_196_SOURCES = $(REMOTE_SOURCES) epath_pattern_197_SOURCES = epath_pattern_197.c nodist_epath_pattern_197_SOURCES = $(REMOTE_SOURCES) epath_pattern_198_SOURCES = epath_pattern_198.c nodist_epath_pattern_198_SOURCES = $(REMOTE_SOURCES) epath_pattern_199_SOURCES = epath_pattern_199.c nodist_epath_pattern_199_SOURCES = $(REMOTE_SOURCES) epath_pattern_200_SOURCES = epath_pattern_200.c nodist_epath_pattern_200_SOURCES = $(REMOTE_SOURCES) epath_pattern_201_SOURCES = epath_pattern_201.c nodist_epath_pattern_201_SOURCES = $(REMOTE_SOURCES) epath_pattern_202_SOURCES = epath_pattern_202.c nodist_epath_pattern_202_SOURCES = $(REMOTE_SOURCES) epath_pattern_203_SOURCES = epath_pattern_203.c nodist_epath_pattern_203_SOURCES = $(REMOTE_SOURCES) epath_pattern_204_SOURCES = epath_pattern_204.c nodist_epath_pattern_204_SOURCES = $(REMOTE_SOURCES) epath_pattern_205_SOURCES = epath_pattern_205.c nodist_epath_pattern_205_SOURCES = $(REMOTE_SOURCES) epath_pattern_206_SOURCES = epath_pattern_206.c nodist_epath_pattern_206_SOURCES = $(REMOTE_SOURCES) epath_pattern_207_SOURCES = epath_pattern_207.c nodist_epath_pattern_207_SOURCES = $(REMOTE_SOURCES) epath_pattern_208_SOURCES = epath_pattern_208.c nodist_epath_pattern_208_SOURCES = $(REMOTE_SOURCES) epath_pattern_209_SOURCES = epath_pattern_209.c nodist_epath_pattern_209_SOURCES = $(REMOTE_SOURCES) epath_pattern_210_SOURCES = epath_pattern_210.c nodist_epath_pattern_210_SOURCES = $(REMOTE_SOURCES) epath_pattern_211_SOURCES = epath_pattern_211.c nodist_epath_pattern_211_SOURCES = $(REMOTE_SOURCES) epath_pattern_212_SOURCES = epath_pattern_212.c nodist_epath_pattern_212_SOURCES = $(REMOTE_SOURCES) epath_pattern_213_SOURCES = epath_pattern_213.c nodist_epath_pattern_213_SOURCES = $(REMOTE_SOURCES) epath_pattern_214_SOURCES = epath_pattern_214.c nodist_epath_pattern_214_SOURCES = $(REMOTE_SOURCES) epath_pattern_215_SOURCES = epath_pattern_215.c nodist_epath_pattern_215_SOURCES = $(REMOTE_SOURCES) epath_pattern_216_SOURCES = epath_pattern_216.c nodist_epath_pattern_216_SOURCES = $(REMOTE_SOURCES) epath_pattern_217_SOURCES = epath_pattern_217.c nodist_epath_pattern_217_SOURCES = $(REMOTE_SOURCES) epath_pattern_218_SOURCES = epath_pattern_218.c nodist_epath_pattern_218_SOURCES = $(REMOTE_SOURCES) epath_pattern_219_SOURCES = epath_pattern_219.c nodist_epath_pattern_219_SOURCES = $(REMOTE_SOURCES) epath_pattern_220_SOURCES = epath_pattern_220.c nodist_epath_pattern_220_SOURCES = $(REMOTE_SOURCES) epath_pattern_221_SOURCES = epath_pattern_221.c nodist_epath_pattern_221_SOURCES = $(REMOTE_SOURCES) epath_pattern_222_SOURCES = epath_pattern_222.c nodist_epath_pattern_222_SOURCES = $(REMOTE_SOURCES) epath_pattern_223_SOURCES = epath_pattern_223.c nodist_epath_pattern_223_SOURCES = $(REMOTE_SOURCES) epath_pattern_224_SOURCES = epath_pattern_224.c nodist_epath_pattern_224_SOURCES = $(REMOTE_SOURCES) epath_pattern_225_SOURCES = epath_pattern_225.c nodist_epath_pattern_225_SOURCES = $(REMOTE_SOURCES) epath_pattern_226_SOURCES = epath_pattern_226.c nodist_epath_pattern_226_SOURCES = $(REMOTE_SOURCES) epath_pattern_227_SOURCES = epath_pattern_227.c nodist_epath_pattern_227_SOURCES = $(REMOTE_SOURCES) epath_pattern_228_SOURCES = epath_pattern_228.c nodist_epath_pattern_228_SOURCES = $(REMOTE_SOURCES) epath_pattern_229_SOURCES = epath_pattern_229.c nodist_epath_pattern_229_SOURCES = $(REMOTE_SOURCES) epath_pattern_230_SOURCES = epath_pattern_230.c nodist_epath_pattern_230_SOURCES = $(REMOTE_SOURCES) epath_pattern_231_SOURCES = epath_pattern_231.c nodist_epath_pattern_231_SOURCES = $(REMOTE_SOURCES) epath_pattern_232_SOURCES = epath_pattern_232.c nodist_epath_pattern_232_SOURCES = $(REMOTE_SOURCES) epath_pattern_233_SOURCES = epath_pattern_233.c nodist_epath_pattern_233_SOURCES = $(REMOTE_SOURCES) epath_pattern_234_SOURCES = epath_pattern_234.c nodist_epath_pattern_234_SOURCES = $(REMOTE_SOURCES) epath_pattern_235_SOURCES = epath_pattern_235.c nodist_epath_pattern_235_SOURCES = $(REMOTE_SOURCES) epath_pattern_236_SOURCES = epath_pattern_236.c nodist_epath_pattern_236_SOURCES = $(REMOTE_SOURCES) epath_pattern_237_SOURCES = epath_pattern_237.c nodist_epath_pattern_237_SOURCES = $(REMOTE_SOURCES) epath_pattern_238_SOURCES = epath_pattern_238.c nodist_epath_pattern_238_SOURCES = $(REMOTE_SOURCES) epath_pattern_239_SOURCES = epath_pattern_239.c nodist_epath_pattern_239_SOURCES = $(REMOTE_SOURCES) epath_pattern_240_SOURCES = epath_pattern_240.c nodist_epath_pattern_240_SOURCES = $(REMOTE_SOURCES) epath_pattern_241_SOURCES = epath_pattern_241.c nodist_epath_pattern_241_SOURCES = $(REMOTE_SOURCES) epath_pattern_242_SOURCES = epath_pattern_242.c nodist_epath_pattern_242_SOURCES = $(REMOTE_SOURCES) epath_pattern_243_SOURCES = epath_pattern_243.c nodist_epath_pattern_243_SOURCES = $(REMOTE_SOURCES) epath_pattern_244_SOURCES = epath_pattern_244.c nodist_epath_pattern_244_SOURCES = $(REMOTE_SOURCES) epath_pattern_245_SOURCES = epath_pattern_245.c nodist_epath_pattern_245_SOURCES = $(REMOTE_SOURCES) epath_pattern_246_SOURCES = epath_pattern_246.c nodist_epath_pattern_246_SOURCES = $(REMOTE_SOURCES) epath_pattern_247_SOURCES = epath_pattern_247.c nodist_epath_pattern_247_SOURCES = $(REMOTE_SOURCES) epath_pattern_248_SOURCES = epath_pattern_248.c nodist_epath_pattern_248_SOURCES = $(REMOTE_SOURCES) epath_pattern_249_SOURCES = epath_pattern_249.c nodist_epath_pattern_249_SOURCES = $(REMOTE_SOURCES) epath_pattern_250_SOURCES = epath_pattern_250.c nodist_epath_pattern_250_SOURCES = $(REMOTE_SOURCES) epath_pattern_251_SOURCES = epath_pattern_251.c nodist_epath_pattern_251_SOURCES = $(REMOTE_SOURCES) epath_pattern_252_SOURCES = epath_pattern_252.c nodist_epath_pattern_252_SOURCES = $(REMOTE_SOURCES) epath_pattern_253_SOURCES = epath_pattern_253.c nodist_epath_pattern_253_SOURCES = $(REMOTE_SOURCES) epath_pattern_254_SOURCES = epath_pattern_254.c nodist_epath_pattern_254_SOURCES = $(REMOTE_SOURCES) epath_pattern_255_SOURCES = epath_pattern_255.c nodist_epath_pattern_255_SOURCES = $(REMOTE_SOURCES) epath_pattern_256_SOURCES = epath_pattern_256.c nodist_epath_pattern_256_SOURCES = $(REMOTE_SOURCES) epath_pattern_257_SOURCES = epath_pattern_257.c nodist_epath_pattern_257_SOURCES = $(REMOTE_SOURCES) epath_pattern_258_SOURCES = epath_pattern_258.c nodist_epath_pattern_258_SOURCES = $(REMOTE_SOURCES) epath_pattern_259_SOURCES = epath_pattern_259.c nodist_epath_pattern_259_SOURCES = $(REMOTE_SOURCES) epath_pattern_260_SOURCES = epath_pattern_260.c nodist_epath_pattern_260_SOURCES = $(REMOTE_SOURCES) epath_pattern_261_SOURCES = epath_pattern_261.c nodist_epath_pattern_261_SOURCES = $(REMOTE_SOURCES) epath_pattern_262_SOURCES = epath_pattern_262.c nodist_epath_pattern_262_SOURCES = $(REMOTE_SOURCES) epath_pattern_263_SOURCES = epath_pattern_263.c nodist_epath_pattern_263_SOURCES = $(REMOTE_SOURCES) epath_pattern_264_SOURCES = epath_pattern_264.c nodist_epath_pattern_264_SOURCES = $(REMOTE_SOURCES) epath_pattern_265_SOURCES = epath_pattern_265.c nodist_epath_pattern_265_SOURCES = $(REMOTE_SOURCES) epath_pattern_266_SOURCES = epath_pattern_266.c nodist_epath_pattern_266_SOURCES = $(REMOTE_SOURCES) epath_pattern_267_SOURCES = epath_pattern_267.c nodist_epath_pattern_267_SOURCES = $(REMOTE_SOURCES) epath_pattern_268_SOURCES = epath_pattern_268.c nodist_epath_pattern_268_SOURCES = $(REMOTE_SOURCES) epath_pattern_269_SOURCES = epath_pattern_269.c nodist_epath_pattern_269_SOURCES = $(REMOTE_SOURCES) epath_pattern_270_SOURCES = epath_pattern_270.c nodist_epath_pattern_270_SOURCES = $(REMOTE_SOURCES) epath_pattern_271_SOURCES = epath_pattern_271.c nodist_epath_pattern_271_SOURCES = $(REMOTE_SOURCES) epath_pattern_272_SOURCES = epath_pattern_272.c nodist_epath_pattern_272_SOURCES = $(REMOTE_SOURCES) epath_pattern_273_SOURCES = epath_pattern_273.c nodist_epath_pattern_273_SOURCES = $(REMOTE_SOURCES) epath_pattern_274_SOURCES = epath_pattern_274.c nodist_epath_pattern_274_SOURCES = $(REMOTE_SOURCES) epath_pattern_275_SOURCES = epath_pattern_275.c nodist_epath_pattern_275_SOURCES = $(REMOTE_SOURCES) epath_pattern_276_SOURCES = epath_pattern_276.c nodist_epath_pattern_276_SOURCES = $(REMOTE_SOURCES) epath_pattern_277_SOURCES = epath_pattern_277.c nodist_epath_pattern_277_SOURCES = $(REMOTE_SOURCES) epath_pattern_278_SOURCES = epath_pattern_278.c nodist_epath_pattern_278_SOURCES = $(REMOTE_SOURCES) epath_pattern_279_SOURCES = epath_pattern_279.c nodist_epath_pattern_279_SOURCES = $(REMOTE_SOURCES) epath_pattern_280_SOURCES = epath_pattern_280.c nodist_epath_pattern_280_SOURCES = $(REMOTE_SOURCES) epath_pattern_281_SOURCES = epath_pattern_281.c nodist_epath_pattern_281_SOURCES = $(REMOTE_SOURCES) epath_pattern_282_SOURCES = epath_pattern_282.c nodist_epath_pattern_282_SOURCES = $(REMOTE_SOURCES) epath_pattern_283_SOURCES = epath_pattern_283.c nodist_epath_pattern_283_SOURCES = $(REMOTE_SOURCES) epath_pattern_284_SOURCES = epath_pattern_284.c nodist_epath_pattern_284_SOURCES = $(REMOTE_SOURCES) epath_pattern_285_SOURCES = epath_pattern_285.c nodist_epath_pattern_285_SOURCES = $(REMOTE_SOURCES) epath_pattern_286_SOURCES = epath_pattern_286.c nodist_epath_pattern_286_SOURCES = $(REMOTE_SOURCES) epath_pattern_287_SOURCES = epath_pattern_287.c nodist_epath_pattern_287_SOURCES = $(REMOTE_SOURCES) epath_pattern_288_SOURCES = epath_pattern_288.c nodist_epath_pattern_288_SOURCES = $(REMOTE_SOURCES) epath_pattern_289_SOURCES = epath_pattern_289.c nodist_epath_pattern_289_SOURCES = $(REMOTE_SOURCES) epath_pattern_290_SOURCES = epath_pattern_290.c nodist_epath_pattern_290_SOURCES = $(REMOTE_SOURCES) epath_pattern_291_SOURCES = epath_pattern_291.c nodist_epath_pattern_291_SOURCES = $(REMOTE_SOURCES) epath_pattern_292_SOURCES = epath_pattern_292.c nodist_epath_pattern_292_SOURCES = $(REMOTE_SOURCES) epath_pattern_293_SOURCES = epath_pattern_293.c nodist_epath_pattern_293_SOURCES = $(REMOTE_SOURCES) epath_pattern_294_SOURCES = epath_pattern_294.c nodist_epath_pattern_294_SOURCES = $(REMOTE_SOURCES) epath_pattern_295_SOURCES = epath_pattern_295.c nodist_epath_pattern_295_SOURCES = $(REMOTE_SOURCES) epath_pattern_296_SOURCES = epath_pattern_296.c nodist_epath_pattern_296_SOURCES = $(REMOTE_SOURCES) epath_pattern_297_SOURCES = epath_pattern_297.c nodist_epath_pattern_297_SOURCES = $(REMOTE_SOURCES) epath_pattern_298_SOURCES = epath_pattern_298.c nodist_epath_pattern_298_SOURCES = $(REMOTE_SOURCES) epath_pattern_299_SOURCES = epath_pattern_299.c nodist_epath_pattern_299_SOURCES = $(REMOTE_SOURCES) epath_pattern_300_SOURCES = epath_pattern_300.c nodist_epath_pattern_300_SOURCES = $(REMOTE_SOURCES) epath_pattern_301_SOURCES = epath_pattern_301.c nodist_epath_pattern_301_SOURCES = $(REMOTE_SOURCES) epath_pattern_302_SOURCES = epath_pattern_302.c nodist_epath_pattern_302_SOURCES = $(REMOTE_SOURCES) epath_pattern_303_SOURCES = epath_pattern_303.c nodist_epath_pattern_303_SOURCES = $(REMOTE_SOURCES) epath_pattern_304_SOURCES = epath_pattern_304.c nodist_epath_pattern_304_SOURCES = $(REMOTE_SOURCES) epath_pattern_305_SOURCES = epath_pattern_305.c nodist_epath_pattern_305_SOURCES = $(REMOTE_SOURCES) epath_pattern_306_SOURCES = epath_pattern_306.c nodist_epath_pattern_306_SOURCES = $(REMOTE_SOURCES) epath_pattern_307_SOURCES = epath_pattern_307.c nodist_epath_pattern_307_SOURCES = $(REMOTE_SOURCES) epath_pattern_308_SOURCES = epath_pattern_308.c nodist_epath_pattern_308_SOURCES = $(REMOTE_SOURCES) epath_pattern_309_SOURCES = epath_pattern_309.c nodist_epath_pattern_309_SOURCES = $(REMOTE_SOURCES) epath_pattern_310_SOURCES = epath_pattern_310.c nodist_epath_pattern_310_SOURCES = $(REMOTE_SOURCES) epath_pattern_311_SOURCES = epath_pattern_311.c nodist_epath_pattern_311_SOURCES = $(REMOTE_SOURCES) epath_pattern_312_SOURCES = epath_pattern_312.c nodist_epath_pattern_312_SOURCES = $(REMOTE_SOURCES) epath_pattern_313_SOURCES = epath_pattern_313.c nodist_epath_pattern_313_SOURCES = $(REMOTE_SOURCES) epath_pattern_314_SOURCES = epath_pattern_314.c nodist_epath_pattern_314_SOURCES = $(REMOTE_SOURCES) epath_pattern_315_SOURCES = epath_pattern_315.c nodist_epath_pattern_315_SOURCES = $(REMOTE_SOURCES) epath_pattern_316_SOURCES = epath_pattern_316.c nodist_epath_pattern_316_SOURCES = $(REMOTE_SOURCES) epath_pattern_317_SOURCES = epath_pattern_317.c nodist_epath_pattern_317_SOURCES = $(REMOTE_SOURCES) epath_pattern_318_SOURCES = epath_pattern_318.c nodist_epath_pattern_318_SOURCES = $(REMOTE_SOURCES) epath_pattern_319_SOURCES = epath_pattern_319.c nodist_epath_pattern_319_SOURCES = $(REMOTE_SOURCES) epath_pattern_320_SOURCES = epath_pattern_320.c nodist_epath_pattern_320_SOURCES = $(REMOTE_SOURCES) epath_pattern_321_SOURCES = epath_pattern_321.c nodist_epath_pattern_321_SOURCES = $(REMOTE_SOURCES) epath_pattern_322_SOURCES = epath_pattern_322.c nodist_epath_pattern_322_SOURCES = $(REMOTE_SOURCES) epath_pattern_323_SOURCES = epath_pattern_323.c nodist_epath_pattern_323_SOURCES = $(REMOTE_SOURCES) epath_pattern_324_SOURCES = epath_pattern_324.c nodist_epath_pattern_324_SOURCES = $(REMOTE_SOURCES) epath_pattern_325_SOURCES = epath_pattern_325.c nodist_epath_pattern_325_SOURCES = $(REMOTE_SOURCES) epath_pattern_326_SOURCES = epath_pattern_326.c nodist_epath_pattern_326_SOURCES = $(REMOTE_SOURCES) epath_pattern_327_SOURCES = epath_pattern_327.c nodist_epath_pattern_327_SOURCES = $(REMOTE_SOURCES) epath_pattern_328_SOURCES = epath_pattern_328.c nodist_epath_pattern_328_SOURCES = $(REMOTE_SOURCES) epath_pattern_329_SOURCES = epath_pattern_329.c nodist_epath_pattern_329_SOURCES = $(REMOTE_SOURCES) epath_pattern_330_SOURCES = epath_pattern_330.c nodist_epath_pattern_330_SOURCES = $(REMOTE_SOURCES) epath_pattern_331_SOURCES = epath_pattern_331.c nodist_epath_pattern_331_SOURCES = $(REMOTE_SOURCES) epath_pattern_332_SOURCES = epath_pattern_332.c nodist_epath_pattern_332_SOURCES = $(REMOTE_SOURCES) epath_pattern_333_SOURCES = epath_pattern_333.c nodist_epath_pattern_333_SOURCES = $(REMOTE_SOURCES) epath_pattern_334_SOURCES = epath_pattern_334.c nodist_epath_pattern_334_SOURCES = $(REMOTE_SOURCES) epath_pattern_335_SOURCES = epath_pattern_335.c nodist_epath_pattern_335_SOURCES = $(REMOTE_SOURCES) epath_pattern_336_SOURCES = epath_pattern_336.c nodist_epath_pattern_336_SOURCES = $(REMOTE_SOURCES) epath_pattern_337_SOURCES = epath_pattern_337.c nodist_epath_pattern_337_SOURCES = $(REMOTE_SOURCES) epath_pattern_338_SOURCES = epath_pattern_338.c nodist_epath_pattern_338_SOURCES = $(REMOTE_SOURCES) epath_pattern_339_SOURCES = epath_pattern_339.c nodist_epath_pattern_339_SOURCES = $(REMOTE_SOURCES) epath_pattern_340_SOURCES = epath_pattern_340.c nodist_epath_pattern_340_SOURCES = $(REMOTE_SOURCES) epath_pattern_341_SOURCES = epath_pattern_341.c nodist_epath_pattern_341_SOURCES = $(REMOTE_SOURCES) epath_pattern_342_SOURCES = epath_pattern_342.c nodist_epath_pattern_342_SOURCES = $(REMOTE_SOURCES) epath_pattern_343_SOURCES = epath_pattern_343.c nodist_epath_pattern_343_SOURCES = $(REMOTE_SOURCES) epath_pattern_344_SOURCES = epath_pattern_344.c nodist_epath_pattern_344_SOURCES = $(REMOTE_SOURCES) epath_pattern_345_SOURCES = epath_pattern_345.c nodist_epath_pattern_345_SOURCES = $(REMOTE_SOURCES) epath_pattern_346_SOURCES = epath_pattern_346.c nodist_epath_pattern_346_SOURCES = $(REMOTE_SOURCES) epath_pattern_347_SOURCES = epath_pattern_347.c nodist_epath_pattern_347_SOURCES = $(REMOTE_SOURCES) epath_pattern_348_SOURCES = epath_pattern_348.c nodist_epath_pattern_348_SOURCES = $(REMOTE_SOURCES) epath_pattern_349_SOURCES = epath_pattern_349.c nodist_epath_pattern_349_SOURCES = $(REMOTE_SOURCES) epath_pattern_350_SOURCES = epath_pattern_350.c nodist_epath_pattern_350_SOURCES = $(REMOTE_SOURCES) epath_pattern_351_SOURCES = epath_pattern_351.c nodist_epath_pattern_351_SOURCES = $(REMOTE_SOURCES) epath_pattern_352_SOURCES = epath_pattern_352.c nodist_epath_pattern_352_SOURCES = $(REMOTE_SOURCES) epath_pattern_353_SOURCES = epath_pattern_353.c nodist_epath_pattern_353_SOURCES = $(REMOTE_SOURCES) epath_pattern_354_SOURCES = epath_pattern_354.c nodist_epath_pattern_354_SOURCES = $(REMOTE_SOURCES) epath_pattern_355_SOURCES = epath_pattern_355.c nodist_epath_pattern_355_SOURCES = $(REMOTE_SOURCES) epath_pattern_356_SOURCES = epath_pattern_356.c nodist_epath_pattern_356_SOURCES = $(REMOTE_SOURCES) epath_pattern_357_SOURCES = epath_pattern_357.c nodist_epath_pattern_357_SOURCES = $(REMOTE_SOURCES) epath_pattern_358_SOURCES = epath_pattern_358.c nodist_epath_pattern_358_SOURCES = $(REMOTE_SOURCES) epath_pattern_359_SOURCES = epath_pattern_359.c nodist_epath_pattern_359_SOURCES = $(REMOTE_SOURCES) epath_pattern_360_SOURCES = epath_pattern_360.c nodist_epath_pattern_360_SOURCES = $(REMOTE_SOURCES) epath_pattern_361_SOURCES = epath_pattern_361.c nodist_epath_pattern_361_SOURCES = $(REMOTE_SOURCES) epath_pattern_362_SOURCES = epath_pattern_362.c nodist_epath_pattern_362_SOURCES = $(REMOTE_SOURCES) epath_pattern_363_SOURCES = epath_pattern_363.c nodist_epath_pattern_363_SOURCES = $(REMOTE_SOURCES) epath_pattern_364_SOURCES = epath_pattern_364.c nodist_epath_pattern_364_SOURCES = $(REMOTE_SOURCES) epath_pattern_365_SOURCES = epath_pattern_365.c nodist_epath_pattern_365_SOURCES = $(REMOTE_SOURCES) epath_pattern_366_SOURCES = epath_pattern_366.c nodist_epath_pattern_366_SOURCES = $(REMOTE_SOURCES) epath_pattern_367_SOURCES = epath_pattern_367.c nodist_epath_pattern_367_SOURCES = $(REMOTE_SOURCES) epath_pattern_368_SOURCES = epath_pattern_368.c nodist_epath_pattern_368_SOURCES = $(REMOTE_SOURCES) epath_pattern_369_SOURCES = epath_pattern_369.c nodist_epath_pattern_369_SOURCES = $(REMOTE_SOURCES) epath_pattern_370_SOURCES = epath_pattern_370.c nodist_epath_pattern_370_SOURCES = $(REMOTE_SOURCES) epath_pattern_371_SOURCES = epath_pattern_371.c nodist_epath_pattern_371_SOURCES = $(REMOTE_SOURCES) epath_pattern_372_SOURCES = epath_pattern_372.c nodist_epath_pattern_372_SOURCES = $(REMOTE_SOURCES) epath_pattern_373_SOURCES = epath_pattern_373.c nodist_epath_pattern_373_SOURCES = $(REMOTE_SOURCES) epath_pattern_374_SOURCES = epath_pattern_374.c nodist_epath_pattern_374_SOURCES = $(REMOTE_SOURCES) epath_pattern_375_SOURCES = epath_pattern_375.c nodist_epath_pattern_375_SOURCES = $(REMOTE_SOURCES) epath_pattern_376_SOURCES = epath_pattern_376.c nodist_epath_pattern_376_SOURCES = $(REMOTE_SOURCES) epath_pattern_377_SOURCES = epath_pattern_377.c nodist_epath_pattern_377_SOURCES = $(REMOTE_SOURCES) epath_pattern_378_SOURCES = epath_pattern_378.c nodist_epath_pattern_378_SOURCES = $(REMOTE_SOURCES) epath_pattern_379_SOURCES = epath_pattern_379.c nodist_epath_pattern_379_SOURCES = $(REMOTE_SOURCES) epath_pattern_380_SOURCES = epath_pattern_380.c nodist_epath_pattern_380_SOURCES = $(REMOTE_SOURCES) epath_pattern_381_SOURCES = epath_pattern_381.c nodist_epath_pattern_381_SOURCES = $(REMOTE_SOURCES) epath_pattern_382_SOURCES = epath_pattern_382.c nodist_epath_pattern_382_SOURCES = $(REMOTE_SOURCES) epath_pattern_383_SOURCES = epath_pattern_383.c nodist_epath_pattern_383_SOURCES = $(REMOTE_SOURCES) epath_pattern_384_SOURCES = epath_pattern_384.c nodist_epath_pattern_384_SOURCES = $(REMOTE_SOURCES) epath_pattern_385_SOURCES = epath_pattern_385.c nodist_epath_pattern_385_SOURCES = $(REMOTE_SOURCES) epath_pattern_386_SOURCES = epath_pattern_386.c nodist_epath_pattern_386_SOURCES = $(REMOTE_SOURCES) epath_pattern_387_SOURCES = epath_pattern_387.c nodist_epath_pattern_387_SOURCES = $(REMOTE_SOURCES) epath_pattern_388_SOURCES = epath_pattern_388.c nodist_epath_pattern_388_SOURCES = $(REMOTE_SOURCES) epath_pattern_389_SOURCES = epath_pattern_389.c nodist_epath_pattern_389_SOURCES = $(REMOTE_SOURCES) epath_pattern_390_SOURCES = epath_pattern_390.c nodist_epath_pattern_390_SOURCES = $(REMOTE_SOURCES) epath_pattern_391_SOURCES = epath_pattern_391.c nodist_epath_pattern_391_SOURCES = $(REMOTE_SOURCES) epath_pattern_392_SOURCES = epath_pattern_392.c nodist_epath_pattern_392_SOURCES = $(REMOTE_SOURCES) epath_pattern_393_SOURCES = epath_pattern_393.c nodist_epath_pattern_393_SOURCES = $(REMOTE_SOURCES) epath_pattern_394_SOURCES = epath_pattern_394.c nodist_epath_pattern_394_SOURCES = $(REMOTE_SOURCES) epath_pattern_395_SOURCES = epath_pattern_395.c nodist_epath_pattern_395_SOURCES = $(REMOTE_SOURCES) epath_pattern_396_SOURCES = epath_pattern_396.c nodist_epath_pattern_396_SOURCES = $(REMOTE_SOURCES) epath_pattern_397_SOURCES = epath_pattern_397.c nodist_epath_pattern_397_SOURCES = $(REMOTE_SOURCES) epath_pattern_398_SOURCES = epath_pattern_398.c nodist_epath_pattern_398_SOURCES = $(REMOTE_SOURCES) epath_pattern_399_SOURCES = epath_pattern_399.c nodist_epath_pattern_399_SOURCES = $(REMOTE_SOURCES) epath_pattern_400_SOURCES = epath_pattern_400.c nodist_epath_pattern_400_SOURCES = $(REMOTE_SOURCES) epath_pattern_401_SOURCES = epath_pattern_401.c nodist_epath_pattern_401_SOURCES = $(REMOTE_SOURCES) epath_pattern_402_SOURCES = epath_pattern_402.c nodist_epath_pattern_402_SOURCES = $(REMOTE_SOURCES) epath_pattern_403_SOURCES = epath_pattern_403.c nodist_epath_pattern_403_SOURCES = $(REMOTE_SOURCES) epath_pattern_404_SOURCES = epath_pattern_404.c nodist_epath_pattern_404_SOURCES = $(REMOTE_SOURCES) epath_pattern_405_SOURCES = epath_pattern_405.c nodist_epath_pattern_405_SOURCES = $(REMOTE_SOURCES) epath_pattern_406_SOURCES = epath_pattern_406.c nodist_epath_pattern_406_SOURCES = $(REMOTE_SOURCES) epath_pattern_407_SOURCES = epath_pattern_407.c nodist_epath_pattern_407_SOURCES = $(REMOTE_SOURCES) epath_pattern_408_SOURCES = epath_pattern_408.c nodist_epath_pattern_408_SOURCES = $(REMOTE_SOURCES) epath_pattern_409_SOURCES = epath_pattern_409.c nodist_epath_pattern_409_SOURCES = $(REMOTE_SOURCES) epath_pattern_410_SOURCES = epath_pattern_410.c nodist_epath_pattern_410_SOURCES = $(REMOTE_SOURCES) epath_pattern_411_SOURCES = epath_pattern_411.c nodist_epath_pattern_411_SOURCES = $(REMOTE_SOURCES) epath_pattern_412_SOURCES = epath_pattern_412.c nodist_epath_pattern_412_SOURCES = $(REMOTE_SOURCES) epath_pattern_413_SOURCES = epath_pattern_413.c nodist_epath_pattern_413_SOURCES = $(REMOTE_SOURCES) epath_pattern_414_SOURCES = epath_pattern_414.c nodist_epath_pattern_414_SOURCES = $(REMOTE_SOURCES) epath_pattern_415_SOURCES = epath_pattern_415.c nodist_epath_pattern_415_SOURCES = $(REMOTE_SOURCES) epath_pattern_416_SOURCES = epath_pattern_416.c nodist_epath_pattern_416_SOURCES = $(REMOTE_SOURCES) epath_pattern_417_SOURCES = epath_pattern_417.c nodist_epath_pattern_417_SOURCES = $(REMOTE_SOURCES) epath_pattern_418_SOURCES = epath_pattern_418.c nodist_epath_pattern_418_SOURCES = $(REMOTE_SOURCES) epath_pattern_419_SOURCES = epath_pattern_419.c nodist_epath_pattern_419_SOURCES = $(REMOTE_SOURCES) epath_pattern_420_SOURCES = epath_pattern_420.c nodist_epath_pattern_420_SOURCES = $(REMOTE_SOURCES) epath_pattern_421_SOURCES = epath_pattern_421.c nodist_epath_pattern_421_SOURCES = $(REMOTE_SOURCES) epath_pattern_422_SOURCES = epath_pattern_422.c nodist_epath_pattern_422_SOURCES = $(REMOTE_SOURCES) epath_pattern_423_SOURCES = epath_pattern_423.c nodist_epath_pattern_423_SOURCES = $(REMOTE_SOURCES) epath_pattern_424_SOURCES = epath_pattern_424.c nodist_epath_pattern_424_SOURCES = $(REMOTE_SOURCES) epath_pattern_425_SOURCES = epath_pattern_425.c nodist_epath_pattern_425_SOURCES = $(REMOTE_SOURCES) epath_pattern_426_SOURCES = epath_pattern_426.c nodist_epath_pattern_426_SOURCES = $(REMOTE_SOURCES) epath_pattern_427_SOURCES = epath_pattern_427.c nodist_epath_pattern_427_SOURCES = $(REMOTE_SOURCES) epath_pattern_428_SOURCES = epath_pattern_428.c nodist_epath_pattern_428_SOURCES = $(REMOTE_SOURCES) epath_pattern_429_SOURCES = epath_pattern_429.c nodist_epath_pattern_429_SOURCES = $(REMOTE_SOURCES) epath_pattern_430_SOURCES = epath_pattern_430.c nodist_epath_pattern_430_SOURCES = $(REMOTE_SOURCES) epath_pattern_431_SOURCES = epath_pattern_431.c nodist_epath_pattern_431_SOURCES = $(REMOTE_SOURCES) epath_pattern_432_SOURCES = epath_pattern_432.c nodist_epath_pattern_432_SOURCES = $(REMOTE_SOURCES) epath_pattern_433_SOURCES = epath_pattern_433.c nodist_epath_pattern_433_SOURCES = $(REMOTE_SOURCES) epath_pattern_434_SOURCES = epath_pattern_434.c nodist_epath_pattern_434_SOURCES = $(REMOTE_SOURCES) epath_pattern_435_SOURCES = epath_pattern_435.c nodist_epath_pattern_435_SOURCES = $(REMOTE_SOURCES) epath_pattern_436_SOURCES = epath_pattern_436.c nodist_epath_pattern_436_SOURCES = $(REMOTE_SOURCES) epath_pattern_437_SOURCES = epath_pattern_437.c nodist_epath_pattern_437_SOURCES = $(REMOTE_SOURCES) epath_pattern_438_SOURCES = epath_pattern_438.c nodist_epath_pattern_438_SOURCES = $(REMOTE_SOURCES) epath_pattern_439_SOURCES = epath_pattern_439.c nodist_epath_pattern_439_SOURCES = $(REMOTE_SOURCES) epath_pattern_440_SOURCES = epath_pattern_440.c nodist_epath_pattern_440_SOURCES = $(REMOTE_SOURCES) epath_pattern_441_SOURCES = epath_pattern_441.c nodist_epath_pattern_441_SOURCES = $(REMOTE_SOURCES) epath_pattern_442_SOURCES = epath_pattern_442.c nodist_epath_pattern_442_SOURCES = $(REMOTE_SOURCES) epath_pattern_443_SOURCES = epath_pattern_443.c nodist_epath_pattern_443_SOURCES = $(REMOTE_SOURCES) epath_pattern_444_SOURCES = epath_pattern_444.c nodist_epath_pattern_444_SOURCES = $(REMOTE_SOURCES) epath_pattern_445_SOURCES = epath_pattern_445.c nodist_epath_pattern_445_SOURCES = $(REMOTE_SOURCES) epath_pattern_446_SOURCES = epath_pattern_446.c nodist_epath_pattern_446_SOURCES = $(REMOTE_SOURCES) epath_pattern_447_SOURCES = epath_pattern_447.c nodist_epath_pattern_447_SOURCES = $(REMOTE_SOURCES) epath_pattern_448_SOURCES = epath_pattern_448.c nodist_epath_pattern_448_SOURCES = $(REMOTE_SOURCES) epath_pattern_449_SOURCES = epath_pattern_449.c nodist_epath_pattern_449_SOURCES = $(REMOTE_SOURCES) openhpi-3.6.1/utils/t/epath/epath_pattern_031.c0000644000175100017510000000321212575647301020254 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}"; char *epp_str = "{SYSTEM_CHASSIS,1}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_328.c0000644000175100017510000000325612575647301020275 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/set_ep_loc_005.c0000755000175100017510000000445712575647301017552 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_set_ep_location: Entity path that has 4 elements testcase. */ int main(int argc, char **argv) { SaErrorT err; SaHpiEntityPathT ep = {{{SAHPI_ENT_PROCESSOR, 111}, {SAHPI_ENT_DISK_BAY, 2222}, {SAHPI_ENT_BATTERY, 33333}, {SAHPI_ENT_IO_SUBBOARD, 444444}, {0}}}; SaHpiEntityLocationT x = 10101010; err = oh_set_ep_location(&ep, SAHPI_ENT_IO_SUBBOARD, x); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[3].EntityLocation != x) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[3].EntityType != SAHPI_ENT_IO_SUBBOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[0].EntityLocation != 111) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_PROCESSOR) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[1].EntityLocation != 2222) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_DISK_BAY) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[2].EntityLocation != 33333) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[2].EntityType != SAHPI_ENT_BATTERY) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_065.c0000644000175100017510000000506112575647301017557 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{SWITCH,39}{PROCESSOR_BOARD,20}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_PROCESSOR_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_PROCESSOR_BOARD); return -1; } if (ep.Entry[0].EntityLocation != 20) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 20); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_SWITCH) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_SWITCH); return -1; } if (ep.Entry[1].EntityLocation != 39) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 39); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_325.c0000644000175100017510000000326612575647301020273 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_270.c0000644000175100017510000000321612575647301020265 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{.,.}*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_012.c0000644000175100017510000000324512575647301020261 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "*{SYSTEM_CHASSIS,.}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_023.c0000644000175100017510000000322012575647301020254 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "*{.,.}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_080.c0000644000175100017510000000505312575647301017555 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{SYSTEM_BUS,85}{PROCESSOR,22}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_PROCESSOR) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_PROCESSOR); return -1; } if (ep.Entry[0].EntityLocation != 22) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 22); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_SYSTEM_BUS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_SYSTEM_BUS); return -1; } if (ep.Entry[1].EntityLocation != 85) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 85); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_082.c0000644000175100017510000000326312575647301020270 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_028.c0000644000175100017510000000322012575647301020261 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_358.c0000644000175100017510000000317612575647301020301 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}"; char *epp_str = "*{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_192.c0000644000175100017510000000324312575647301020270 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_145.c0000644000175100017510000000321512575647301020265 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}"; char *epp_str = "*{.,.}*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_214.c0000644000175100017510000000330112575647301020256 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_292.c0000644000175100017510000000321212575647301020265 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/print_ep_005.c0000644000175100017510000000221012575647301017234 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_print_ep: Full entity path testcase. */ int main(int argc, char **argv) { int i, offsets = 1; SaErrorT err; SaHpiEntityPathT ep; for (i=0; i */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_174.c0000644000175100017510000000321712575647301020271 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_296.c0000644000175100017510000000322012575647301020270 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "{.,.}*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_264.c0000644000175100017510000000324512575647301020272 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/print_ep_003.c0000644000175100017510000000225612575647301017244 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_print_ep: Multi-element entity path testcase. */ int main(int argc, char **argv) { int offsets = 0; SaErrorT err; SaHpiEntityPathT ep = {{{SAHPI_ENT_FAN,4}, {SAHPI_ENT_SBC_BLADE,3}, {SAHPI_ENT_RACK,2}, {SAHPI_ENT_ROOT,1}, {0}}}; printf("Good multi-element testcase\n"); err = oh_print_ep(&ep, offsets); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_245.c0000644000175100017510000000320012575647301020260 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}"; char *epp_str = "*{.,.}*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_030.c0000644000175100017510000000321312575647301020254 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}"; char *epp_str = "{SYSTEM_CHASSIS,1}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_000.c0000644000175100017510000000512512575647301017545 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{EXTERNAL_ENVIRONMENT,73}{PHYSICAL_SLOT,61}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_PHYSICAL_SLOT) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_PHYSICAL_SLOT); return -1; } if (ep.Entry[0].EntityLocation != 61) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 61); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_EXTERNAL_ENVIRONMENT) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_EXTERNAL_ENVIRONMENT); return -1; } if (ep.Entry[1].EntityLocation != 73) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 73); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_118.c0000644000175100017510000000326412575647301020271 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_023.c0000644000175100017510000000513312575647301017551 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{FRONT_PANEL_BOARD,49}{BOARD_SET_SPECIFIC,36}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_BOARD_SET_SPECIFIC) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_BOARD_SET_SPECIFIC); return -1; } if (ep.Entry[0].EntityLocation != 36) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 36); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_FRONT_PANEL_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_FRONT_PANEL_BOARD); return -1; } if (ep.Entry[1].EntityLocation != 49) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 49); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_371.c0000644000175100017510000000317412575647301020272 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}"; char *epp_str = "{.,.}*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_399.c0000644000175100017510000000317312575647301020303 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}{SUBRACK,5}"; char *epp_str = "*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/print_ep_001.c0000644000175100017510000000201112575647301017227 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_print_ep: Zero elements entity path testcase. */ int main(int argc, char **argv) { int offsets = 0; SaHpiEntityPathT ep; SaErrorT err; memset(&ep, 0, sizeof(SaHpiEntityPathT)); printf("Zero entity path testcase\n"); err = oh_print_ep(&ep, offsets); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_333.c0000644000175100017510000000324412575647301020266 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "*{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_109.c0000644000175100017510000000327512575647301020273 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_230.c0000644000175100017510000000320712575647301020261 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_268.c0000644000175100017510000000321012575647301020266 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_068.c0000644000175100017510000000323212575647301020270 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_260.c0000644000175100017510000000322112575647301020260 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_294.c0000644000175100017510000000321312575647301020270 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_186.c0000644000175100017510000000327612575647301020301 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_016.c0000644000175100017510000000507512575647301017560 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{SUBRACK,19}{OTHER_CHASSIS_BOARD,1}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_OTHER_CHASSIS_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_OTHER_CHASSIS_BOARD); return -1; } if (ep.Entry[0].EntityLocation != 1) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 1); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_SUBRACK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_SUBRACK); return -1; } if (ep.Entry[1].EntityLocation != 19) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 19); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_053.c0000644000175100017510000000325412575647301020266 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_043.c0000644000175100017510000000317612575647301020270 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}"; char *epp_str = "{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_064.c0000644000175100017510000000506712575647301017564 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{COOLING_DEVICE,18}{PROCESSOR,42}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_PROCESSOR) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_PROCESSOR); return -1; } if (ep.Entry[0].EntityLocation != 42) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 42); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_COOLING_DEVICE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_COOLING_DEVICE); return -1; } if (ep.Entry[1].EntityLocation != 18) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 18); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_255.c0000644000175100017510000000322612575647301020271 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_007.c0000644000175100017510000000322312575647301020261 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_209.c0000644000175100017510000000325512575647301020272 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}"; char *epp_str = "*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_381.c0000644000175100017510000000321512575647301020267 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}{SUBRACK,5}"; char *epp_str = "{SYSTEM_CHASSIS,1}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_424.c0000644000175100017510000000320512575647301020264 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}"; char *epp_str = "*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_207.c0000644000175100017510000000325512575647301020270 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}"; char *epp_str = "{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_073.c0000644000175100017510000000323712575647301020271 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{.,.}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_093.c0000644000175100017510000000325312575647301020271 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_040.c0000644000175100017510000000321212575647301020254 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}"; char *epp_str = "{SYSTEM_CHASSIS,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_099.c0000644000175100017510000000324612575647301020301 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/print_ep_002.c0000644000175100017510000000174712575647301017247 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_print_ep: Single element entity path testcase. */ int main(int argc, char **argv) { int offsets = 0; SaHpiEntityPathT ep; SaErrorT err; oh_init_ep(&ep); printf("Root only entity path testcase\n"); err = oh_print_ep(&ep, offsets); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_383.c0000644000175100017510000000321112575647301020265 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}{SUBRACK,5}"; char *epp_str = "*{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_397.c0000644000175100017510000000320512575647301020275 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}{SUBRACK,5}"; char *epp_str = "{.,.}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_241.c0000644000175100017510000000317012575647301020262 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}"; char *epp_str = "{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_054.c0000644000175100017510000000504212575647301017554 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{REMOTE,53}{DISK_DRIVE,31}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_DISK_DRIVE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_DISK_DRIVE); return -1; } if (ep.Entry[0].EntityLocation != 31) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 31); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_REMOTE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_REMOTE); return -1; } if (ep.Entry[1].EntityLocation != 53) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 53); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_407.c0000644000175100017510000000322212575647301020264 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}"; char *epp_str = "{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_176.c0000644000175100017510000000327512575647301020277 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_055.c0000644000175100017510000000324712575647301020272 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_124.c0000644000175100017510000000325712575647301020270 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_039.c0000644000175100017510000000323312575647301020267 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_090.c0000644000175100017510000000327012575647301020265 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_414.c0000644000175100017510000000324712575647301020271 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_364.c0000644000175100017510000000322212575647301020266 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_098.c0000644000175100017510000000326012575647301020274 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{.,.}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_052.c0000644000175100017510000000511712575647301017555 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{OTHER_SYSTEM_BOARD,90}{MEMORY_MODULE,12}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_MEMORY_MODULE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_MEMORY_MODULE); return -1; } if (ep.Entry[0].EntityLocation != 12) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 12); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_OTHER_SYSTEM_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_OTHER_SYSTEM_BOARD); return -1; } if (ep.Entry[1].EntityLocation != 90) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 90); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_171.c0000644000175100017510000000323212575647301020263 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "{.,.}*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_351.c0000644000175100017510000000321712575647301020266 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_006.c0000644000175100017510000000323012575647301020256 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_289.c0000644000175100017510000000324712575647301020303 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_044.c0000644000175100017510000000317712575647301020272 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}"; char *epp_str = "*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_300.c0000644000175100017510000000326312575647301020261 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_045.c0000644000175100017510000000505612575647301017561 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{POWER_MODULE,9}{SBC_BLADE,46}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_SBC_BLADE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_SBC_BLADE); return -1; } if (ep.Entry[0].EntityLocation != 46) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 46); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_POWER_MODULE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_POWER_MODULE); return -1; } if (ep.Entry[1].EntityLocation != 9) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 9); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_082.c0000644000175100017510000000511412575647301017555 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{SYSTEM_BOARD,83}{OTHER_SYSTEM_BOARD,25}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_OTHER_SYSTEM_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_OTHER_SYSTEM_BOARD); return -1; } if (ep.Entry[0].EntityLocation != 25) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 25); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_SYSTEM_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_SYSTEM_BOARD); return -1; } if (ep.Entry[1].EntityLocation != 83) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 83); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_304.c0000644000175100017510000000325412575647301020265 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_045.c0000644000175100017510000000320512575647301020263 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}"; char *epp_str = "*{.,.}*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_100.c0000644000175100017510000000331612575647301020256 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_326.c0000644000175100017510000000326612575647301020274 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_389.c0000644000175100017510000000323512575647301020301 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}{SUBRACK,5}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_005.c0000644000175100017510000000506112575647301017551 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{BATTERY,11}{COOLING_DEVICE,12}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_COOLING_DEVICE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_COOLING_DEVICE); return -1; } if (ep.Entry[0].EntityLocation != 12) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 12); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_BATTERY) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_BATTERY); return -1; } if (ep.Entry[1].EntityLocation != 11) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 11); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_361.c0000644000175100017510000000322112575647301020262 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}"; char *epp_str = "*{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_272.c0000644000175100017510000000321512575647301020266 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{.,.}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_430.c0000644000175100017510000000324012575647301020260 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}{BIOS,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_433.c0000644000175100017510000000323312575647301020265 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}{BIOS,8}"; char *epp_str = "*{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_345.c0000644000175100017510000000324212575647301020267 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "*{.,.}*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/ep_cmp_005.c0000644000175100017510000000224412575647301016666 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_cmp_ep: full element entity path testcase. */ int main(int argc, char **argv) { int i; SaHpiEntityPathT ep1; SaHpiEntityPathT ep2; for (i=0; i */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_305.c0000644000175100017510000000324712575647301020270 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_221.c0000644000175100017510000000325312575647301020262 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}"; char *epp_str = "{.,.}*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_285.c0000644000175100017510000000322312575647301020271 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_064.c0000644000175100017510000000326612575647301020273 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_223.c0000644000175100017510000000325212575647301020263 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}"; char *epp_str = "*{.,.}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_229.c0000644000175100017510000000321412575647301020267 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_000.c0000644000175100017510000000324412575647301020255 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_050.c0000644000175100017510000000505012575647301017547 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{ALARM_MANAGER,84}{OTHER,91}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_OTHER) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_OTHER); return -1; } if (ep.Entry[0].EntityLocation != 91) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 91); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_ALARM_MANAGER) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_ALARM_MANAGER); return -1; } if (ep.Entry[1].EntityLocation != 84) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 84); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_056.c0000644000175100017510000000324712575647301020273 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_128.c0000644000175100017510000000323112575647301020264 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_021.c0000644000175100017510000000510312575647301017544 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{PROCESSOR,93}{OTHER_SYSTEM_BOARD,25}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_OTHER_SYSTEM_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_OTHER_SYSTEM_BOARD); return -1; } if (ep.Entry[0].EntityLocation != 25) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 25); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_PROCESSOR) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_PROCESSOR); return -1; } if (ep.Entry[1].EntityLocation != 93) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 93); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_051.c0000644000175100017510000000507512575647301017557 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{IO_BLADE,6}{COMPACTPCI_CHASSIS,66}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_COMPACTPCI_CHASSIS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_COMPACTPCI_CHASSIS); return -1; } if (ep.Entry[0].EntityLocation != 66) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 66); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_IO_BLADE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_IO_BLADE); return -1; } if (ep.Entry[1].EntityLocation != 6) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 6); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_189.c0000644000175100017510000000327712575647301020305 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_286.c0000644000175100017510000000324612575647301020277 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "*{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_350.c0000644000175100017510000000321712575647301020265 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_319.c0000644000175100017510000000323212575647301020267 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_012.c0000644000175100017510000000507212575647301017551 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{UNSPECIFIED,57}{SHELF_MANAGER,95}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_SHELF_MANAGER) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_SHELF_MANAGER); return -1; } if (ep.Entry[0].EntityLocation != 95) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 95); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_UNSPECIFIED) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_UNSPECIFIED); return -1; } if (ep.Entry[1].EntityLocation != 57) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 57); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_011.c0000644000175100017510000000324612575647301020261 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "*{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_170.c0000644000175100017510000000323212575647301020262 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "*{.,.}*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_256.c0000644000175100017510000000322512575647301020271 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_160.c0000644000175100017510000000323512575647301020264 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_107.c0000644000175100017510000000327412575647301020270 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_208.c0000644000175100017510000000325512575647301020271 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}"; char *epp_str = "*{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_067.c0000644000175100017510000000506112575647301017561 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{UNSPECIFIED,59}{SYSTEM_BUS,65}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_SYSTEM_BUS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_SYSTEM_BUS); return -1; } if (ep.Entry[0].EntityLocation != 65) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 65); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_UNSPECIFIED) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_UNSPECIFIED); return -1; } if (ep.Entry[1].EntityLocation != 59) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 59); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_133.c0000644000175100017510000000322012575647301020256 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}"; char *epp_str = "*{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_014.c0000644000175100017510000000324712575647301020265 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_238.c0000644000175100017510000000322512575647301020271 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_168.c0000644000175100017510000000322412575647301020272 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_066.c0000644000175100017510000000323212575647301020266 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_184.c0000644000175100017510000000325412575647301020273 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_341.c0000644000175100017510000000323412575647301020264 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_025.c0000644000175100017510000000503112575647301017550 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{FAN,45}{DEVICE_BAY,14}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_DEVICE_BAY) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_DEVICE_BAY); return -1; } if (ep.Entry[0].EntityLocation != 14) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 14); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_FAN) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_FAN); return -1; } if (ep.Entry[1].EntityLocation != 45) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 45); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/ep_cmp_008.c0000644000175100017510000000221312575647301016665 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_cmp_ep: compare zero to multi-element entity path testcase. */ int main(int argc, char **argv) { SaHpiEntityPathT ep1 = {{{SAHPI_ENT_ROOT, 0}}}; SaHpiEntityPathT ep2 = {{{SAHPI_ENT_FAN,4}, {SAHPI_ENT_SBC_BLADE,3}, {SAHPI_ENT_RACK,2}, {SAHPI_ENT_ROOT,1}, {SAHPI_ENT_ROOT, 0}}}; if (oh_cmp_ep(&ep1, &ep2)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_062.c0000644000175100017510000000507512575647301017561 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{BACK_PANEL_BOARD,28}{PROCESSOR,36}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_PROCESSOR) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_PROCESSOR); return -1; } if (ep.Entry[0].EntityLocation != 36) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 36); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_BACK_PANEL_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_BACK_PANEL_BOARD); return -1; } if (ep.Entry[1].EntityLocation != 28) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 28); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_021.c0000644000175100017510000000322112575647301020253 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "{.,.}*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_036.c0000644000175100017510000000323212575647301020263 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}"; char *epp_str = "*{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_261.c0000644000175100017510000000324412575647301020266 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_059.c0000644000175100017510000000324312575647301020272 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_063.c0000644000175100017510000000326612575647301020272 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/set_ep_loc_009.c0000755000175100017510000000243112575647301017544 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #include #include #include #include /** * oh_set_ep_location: Entity type not in entity path. * OK but no changed results. **/ int main(int argc, char **argv) { SaErrorT err; SaHpiEntityPathT ep = {{{SAHPI_ENT_FAN, 494949},{0}}}; SaHpiEntityLocationT x = 6767; err = oh_set_ep_location(&ep, SAHPI_ENT_DISK_BLADE, x); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityLocation != 494949) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_FAN) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/set_ep_loc_002.c0000755000175100017510000000243212575647301017536 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_set_ep_location: Entity path that has 1 element testcase. */ int main(int argc, char **argv) { SaErrorT err; SaHpiEntityPathT ep = {{{SAHPI_ENT_OTHER, 1},{0}}}; SaHpiEntityLocationT x = 5; err = oh_set_ep_location(&ep, SAHPI_ENT_OTHER, x); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityLocation != x) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_OTHER) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_061.c0000644000175100017510000000510012575647301017545 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{IO_SUBBOARD,39}{SPEC_PROC_BLADE,78}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_SPEC_PROC_BLADE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_SPEC_PROC_BLADE); return -1; } if (ep.Entry[0].EntityLocation != 78) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 78); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_IO_SUBBOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_IO_SUBBOARD); return -1; } if (ep.Entry[1].EntityLocation != 39) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 39); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_437.c0000644000175100017510000000325512575647301020275 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}{BIOS,8}"; char *epp_str = "*{SYSTEM_CHASSIS,.}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_008.c0000644000175100017510000000322312575647301020262 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "*{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_042.c0000644000175100017510000000317612575647301020267 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}"; char *epp_str = "*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_057.c0000644000175100017510000000324212575647301020267 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_368.c0000644000175100017510000000316512575647301020300 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}"; char *epp_str = "{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/ep_concat_006.c0000644000175100017510000000433512575647301017362 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_concat_ep: concatenate two 4 element entity path */ int main(int argc, char **argv) { SaErrorT err; SaHpiEntityPathT ep1 = {{{SAHPI_ENT_ADD_IN_CARD,111}, {SAHPI_ENT_FRONT_PANEL_BOARD,122}, {SAHPI_ENT_BACK_PANEL_BOARD,133}, {SAHPI_ENT_POWER_SYSTEM_BOARD,144}, {SAHPI_ENT_ROOT,0}}}; SaHpiEntityPathT ep2 = {{{SAHPI_ENT_DRIVE_BACKPLANE,155}, {SAHPI_ENT_SYS_EXPANSION_BOARD,166}, {SAHPI_ENT_OTHER_SYSTEM_BOARD,177}, {SAHPI_ENT_PROCESSOR_BOARD,188}, {SAHPI_ENT_ROOT,0}}}; SaHpiEntityPathT ep3 = {{{SAHPI_ENT_ADD_IN_CARD,111}, {SAHPI_ENT_FRONT_PANEL_BOARD,122}, {SAHPI_ENT_BACK_PANEL_BOARD,133}, {SAHPI_ENT_POWER_SYSTEM_BOARD,144}, {SAHPI_ENT_DRIVE_BACKPLANE,155}, {SAHPI_ENT_SYS_EXPANSION_BOARD,166}, {SAHPI_ENT_OTHER_SYSTEM_BOARD,177}, {SAHPI_ENT_PROCESSOR_BOARD,188}, {SAHPI_ENT_ROOT,0}}}; err = oh_concat_ep(&ep1, &ep2); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (!oh_cmp_ep(&ep1, &ep3)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/ep_cmp_009.c0000644000175100017510000000213512575647301016671 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_cmp_ep: compare multi-element to zero element entity path testcase. */ int main(int argc, char **argv) { SaHpiEntityPathT ep1 = {{{SAHPI_ENT_FAN,4}, {SAHPI_ENT_SBC_BLADE,3}, {SAHPI_ENT_RACK,2}, {SAHPI_ENT_ROOT,0}}}; SaHpiEntityPathT ep2 = {{{SAHPI_ENT_ROOT, 0}}}; if (oh_cmp_ep(&ep1, &ep2)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_003.c0000644000175100017510000000507212575647301017551 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{REMOTE,11}{COMPACTPCI_CHASSIS,96}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_COMPACTPCI_CHASSIS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_COMPACTPCI_CHASSIS); return -1; } if (ep.Entry[0].EntityLocation != 96) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 96); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_REMOTE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_REMOTE); return -1; } if (ep.Entry[1].EntityLocation != 11) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 11); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/ep_concat_002.c0000644000175100017510000000251112575647301017350 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_concat_ep: concatenate 2 single element entity path testcase */ int main(int argc, char **argv) { SaErrorT err; SaHpiEntityPathT ep1 = {{{SAHPI_ENT_BACK_PANEL_BOARD,1},{SAHPI_ENT_ROOT,0}}}; SaHpiEntityPathT ep2 = {{{SAHPI_ENT_POWER_UNIT,9},{SAHPI_ENT_ROOT,0}}}; SaHpiEntityPathT ep3 = {{{SAHPI_ENT_BACK_PANEL_BOARD,1},{SAHPI_ENT_POWER_UNIT,9}, {SAHPI_ENT_ROOT,0}}}; err = oh_concat_ep(&ep1, &ep2); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (!oh_cmp_ep(&ep1, &ep3)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_248.c0000644000175100017510000000317712575647301020300 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}"; char *epp_str = "*{.,.}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_169.c0000644000175100017510000000322512575647301020274 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_125.c0000644000175100017510000000324112575647301020262 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_336.c0000644000175100017510000000327012575647301020270 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "*{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_085.c0000644000175100017510000000506712575647301017567 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{SUBRACK,72}{PERIPHERAL_BAY_2,20}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_PERIPHERAL_BAY_2) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_PERIPHERAL_BAY_2); return -1; } if (ep.Entry[0].EntityLocation != 20) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 20); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_SUBRACK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_SUBRACK); return -1; } if (ep.Entry[1].EntityLocation != 72) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 72); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_096.c0000644000175100017510000000326112575647301020273 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{.,.}*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_081.c0000644000175100017510000000506712575647301017563 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{SPEC_PROC_BLADE,68}{DISK_BAY,82}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_DISK_BAY) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_DISK_BAY); return -1; } if (ep.Entry[0].EntityLocation != 82) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 82); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_SPEC_PROC_BLADE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_SPEC_PROC_BLADE); return -1; } if (ep.Entry[1].EntityLocation != 68) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 68); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_173.c0000644000175100017510000000323112575647301020264 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "*{.,.}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_060.c0000644000175100017510000000324312575647301020262 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_046.c0000644000175100017510000000320512575647301020264 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}"; char *epp_str = "{.,.}*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_246.c0000644000175100017510000000320012575647301020261 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}"; char *epp_str = "{.,.}*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_018.c0000644000175100017510000000502312575647301017553 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{DISK_BAY,95}{FAN,78}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_FAN) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_FAN); return -1; } if (ep.Entry[0].EntityLocation != 78) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 78); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_DISK_BAY) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_DISK_BAY); return -1; } if (ep.Entry[1].EntityLocation != 95) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 95); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_251.c0000644000175100017510000000324212575647301020263 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_432.c0000644000175100017510000000323212575647301020263 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}{BIOS,8}"; char *epp_str = "{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_033.c0000644000175100017510000000320712575647301020262 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}"; char *epp_str = "*{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_282.c0000644000175100017510000000322212575647301020265 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_213.c0000644000175100017510000000330012575647301020254 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_253.c0000644000175100017510000000323212575647301020264 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_227.c0000644000175100017510000000322412575647301020266 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_263.c0000644000175100017510000000324412575647301020270 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_028.c0000644000175100017510000000511412575647301017555 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{OPERATING_SYSTEM,80}{DISK_DRIVE_BAY,86}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_DISK_DRIVE_BAY) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_DISK_DRIVE_BAY); return -1; } if (ep.Entry[0].EntityLocation != 86) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 86); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_OPERATING_SYSTEM) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_OPERATING_SYSTEM); return -1; } if (ep.Entry[1].EntityLocation != 80) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 80); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_393.c0000644000175100017510000000320012575647301020264 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}{SUBRACK,5}"; char *epp_str = "{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_076.c0000644000175100017510000000502612575647301017562 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{OTHER,78}{BATTERY,84}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_BATTERY) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_BATTERY); return -1; } if (ep.Entry[0].EntityLocation != 84) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 84); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_OTHER) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_OTHER); return -1; } if (ep.Entry[1].EntityLocation != 78) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 78); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_374.c0000644000175100017510000000316012575647301020270 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}"; char *epp_str = "*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/ep_concat_003.c0000644000175100017510000000246512575647301017361 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_concat_ep: concatenate 2 single element entity path. */ int main(int argc, char **argv) { SaErrorT err; SaHpiEntityPathT ep1 = {{{SAHPI_ENT_UNKNOWN,11},{SAHPI_ENT_ROOT,0}}}; SaHpiEntityPathT ep2 = {{{SAHPI_ENT_POWER_MGMNT,99},{SAHPI_ENT_ROOT,0}}}; SaHpiEntityPathT ep3 = {{{SAHPI_ENT_UNKNOWN,11},{SAHPI_ENT_POWER_MGMNT,99}, {SAHPI_ENT_ROOT,0}}}; err = oh_concat_ep(&ep1, &ep2); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (!oh_cmp_ep(&ep1, &ep3)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_288.c0000644000175100017510000000324612575647301020301 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_394.c0000644000175100017510000000320112575647301020266 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}{SUBRACK,5}"; char *epp_str = "*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_219.c0000644000175100017510000000324612575647301020273 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}"; char *epp_str = "*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_110.c0000644000175100017510000000327512575647301020263 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_293.c0000644000175100017510000000321212575647301020266 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_004.c0000644000175100017510000000511112575647301017544 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{MEMORY_MODULE,95}{SYS_MGMNT_MODULE,93}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_SYS_MGMNT_MODULE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_SYS_MGMNT_MODULE); return -1; } if (ep.Entry[0].EntityLocation != 93) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 93); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_MEMORY_MODULE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_MEMORY_MODULE); return -1; } if (ep.Entry[1].EntityLocation != 95) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 95); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_307.c0000644000175100017510000000324112575647301020264 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_402.c0000644000175100017510000000324512575647301020264 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_244.c0000644000175100017510000000317212575647301020267 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}"; char *epp_str = "*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_093.c0000644000175100017510000000511412575647301017557 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{OTHER_CHASSIS_BOARD,20}{SUB_CHASSIS,60}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_SUB_CHASSIS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_SUB_CHASSIS); return -1; } if (ep.Entry[0].EntityLocation != 60) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 60); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_OTHER_CHASSIS_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_OTHER_CHASSIS_BOARD); return -1; } if (ep.Entry[1].EntityLocation != 20) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 20); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_152.c0000644000175100017510000000325712575647301020271 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_360.c0000644000175100017510000000317712575647301020273 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}"; char *epp_str = "*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_100.c0000644000175100017510000000367112575647301017552 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{CHASSIS_SPECIFIC,97}{BOARD_SET_SPECIFIC,-5}"; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_BOARD_SET_SPECIFIC) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_BOARD_SET_SPECIFIC); return -1; } if (ep.Entry[0].EntityLocation != -5) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, -5); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_CHASSIS_SPECIFIC) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_CHASSIS_SPECIFIC); return -1; } if (ep.Entry[1].EntityLocation != 97) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 97); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_306.c0000644000175100017510000000324612575647301020270 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_078.c0000644000175100017510000000327512575647301020300 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/set_ep_loc_013.c0000755000175100017510000000274512575647301017547 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #include #include #include #include /* oh_set_ep_location: Entity type not in entity path. * OK but nothing changed. */ int main(int argc, char **argv) { unsigned int y = 45321; unsigned int i = 0; SaErrorT err; SaHpiEntityPathT ep; SaHpiEntityTypeT w = SAHPI_ENT_IO_BLADE; SaHpiEntityLocationT x = 56873; for (i=0; i * Steve Sherman */ #include #include #include #include /* oh_set_ep_location: Full entity path, victim element at end. * Only end element's instance number changed */ int main(int argc, char **argv) { unsigned int y = 77; unsigned int z = 29; unsigned int i = 0; SaErrorT err; SaHpiEntityPathT ep; SaHpiEntityTypeT w = SAHPI_ENT_POWER_DISTRIBUTION_UNIT; SaHpiEntityLocationT x = 87654; for (i=0; i #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{DRIVE_BACKPLANE,57}{BIOS,8}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_BIOS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_BIOS); return -1; } if (ep.Entry[0].EntityLocation != 8) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 8); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_DRIVE_BACKPLANE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_DRIVE_BACKPLANE); return -1; } if (ep.Entry[1].EntityLocation != 57) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 57); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/ep_cmp_007.c0000644000175100017510000000150212575647301016664 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_cmp_ep: null pointer testcase. */ int main(int argc, char **argv) { SaHpiEntityPathT ep; if (oh_cmp_ep(&ep, NULL)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_113.c0000644000175100017510000000332012575647301020255 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_330.c0000644000175100017510000000325112575647301020261 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_058.c0000644000175100017510000000503112575647301017556 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{DISK_BLADE,2}{RACK,36}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_RACK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_RACK); return -1; } if (ep.Entry[0].EntityLocation != 36) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 36); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_DISK_BLADE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_DISK_BLADE); return -1; } if (ep.Entry[1].EntityLocation != 2) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 2); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_215.c0000644000175100017510000000326212575647301020265 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/ep_concat_005.c0000644000175100017510000000365312575647301017363 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_concat_ep: concatenate two 3 element entity path */ int main(int argc, char **argv) { SaErrorT err; SaHpiEntityPathT ep1 = {{{SAHPI_ENT_PERIPHERAL_BAY,55}, {SAHPI_ENT_SYS_MGMNT_MODULE,66}, {SAHPI_ENT_SYSTEM_BOARD,77}, {SAHPI_ENT_ROOT,0}}}; SaHpiEntityPathT ep2 = {{{SAHPI_ENT_MEMORY_MODULE,88}, {SAHPI_ENT_PROCESSOR_MODULE,99}, {SAHPI_ENT_POWER_SUPPLY,101}, {SAHPI_ENT_ROOT,0}}}; SaHpiEntityPathT ep3 = {{{SAHPI_ENT_PERIPHERAL_BAY,55}, {SAHPI_ENT_SYS_MGMNT_MODULE,66}, {SAHPI_ENT_SYSTEM_BOARD,77}, {SAHPI_ENT_MEMORY_MODULE,88}, {SAHPI_ENT_PROCESSOR_MODULE,99}, {SAHPI_ENT_POWER_SUPPLY,101}, {SAHPI_ENT_ROOT,0}}}; err = oh_concat_ep(&ep1, &ep2); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (!oh_cmp_ep(&ep1, &ep3)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_363.c0000644000175100017510000000322112575647301020264 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_009.c0000644000175100017510000000322312575647301020263 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_136.c0000644000175100017510000000324312575647301020266 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}"; char *epp_str = "*{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_321.c0000644000175100017510000000323712575647301020265 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{.,.}*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_373.c0000644000175100017510000000317312575647301020273 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}"; char *epp_str = "*{.,.}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_071.c0000644000175100017510000000324012575647301020261 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{.,.}*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_311.c0000644000175100017510000000326512575647301020265 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_367.c0000644000175100017510000000316512575647301020277 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}"; char *epp_str = "*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_281.c0000644000175100017510000000322712575647301020271 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_061.c0000644000175100017510000000326512575647301020267 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_417.c0000644000175100017510000000321212575647301020264 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}"; char *epp_str = "*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_441.c0000644000175100017510000000322212575647301020262 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}{BIOS,8}"; char *epp_str = "{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_422.c0000644000175100017510000000321712575647301020265 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}"; char *epp_str = "{.,.}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_076.c0000644000175100017510000000330512575647301020270 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_322.c0000644000175100017510000000323612575647301020265 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{.,.}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_347.c0000644000175100017510000000324112575647301020270 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "{.,.}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_427.c0000644000175100017510000000325512575647301020274 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}{BIOS,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_067.c0000644000175100017510000000323212575647301020267 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_156.c0000644000175100017510000000324112575647301020266 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_049.c0000644000175100017510000000317112575647301020271 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}"; char *epp_str = "*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/ep_concat_012.c0000644000175100017510000000573712575647301017366 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_concat_ep: concatenate a 15 element and a zero element entity path */ int main(int argc, char **argv) { SaErrorT err; SaHpiEntityPathT ep1 = {{{SAHPI_ENT_GROUP,1}, {SAHPI_ENT_REMOTE,2}, {SAHPI_ENT_EXTERNAL_ENVIRONMENT,3}, {SAHPI_ENT_BATTERY,4}, {SAHPI_ENT_CHASSIS_SPECIFIC,5}, {SAHPI_ENT_BOARD_SET_SPECIFIC,6}, {SAHPI_ENT_OEM_SYSINT_SPECIFIC,7}, {SAHPI_ENT_FAN,8}, {SAHPI_ENT_RACK,9}, {SAHPI_ENT_SUBRACK,10}, {SAHPI_ENT_COMPACTPCI_CHASSIS,11}, {SAHPI_ENT_ADVANCEDTCA_CHASSIS,12}, {SAHPI_ENT_PHYSICAL_SLOT,13}, {SAHPI_ENT_SBC_BLADE,14}, {SAHPI_ENT_IO_BLADE,15}, {SAHPI_ENT_ROOT,0}}}; SaHpiEntityPathT ep2 = {{{SAHPI_ENT_ROOT,0}}}; SaHpiEntityPathT ep3 = {{{SAHPI_ENT_GROUP,1}, {SAHPI_ENT_REMOTE,2}, {SAHPI_ENT_EXTERNAL_ENVIRONMENT,3}, {SAHPI_ENT_BATTERY,4}, {SAHPI_ENT_CHASSIS_SPECIFIC,5}, {SAHPI_ENT_BOARD_SET_SPECIFIC,6}, {SAHPI_ENT_OEM_SYSINT_SPECIFIC,7}, {SAHPI_ENT_FAN,8}, {SAHPI_ENT_RACK,9}, {SAHPI_ENT_SUBRACK,10}, {SAHPI_ENT_COMPACTPCI_CHASSIS,11}, {SAHPI_ENT_ADVANCEDTCA_CHASSIS,12}, {SAHPI_ENT_PHYSICAL_SLOT,13}, {SAHPI_ENT_SBC_BLADE,14}, {SAHPI_ENT_IO_BLADE,15}, {SAHPI_ENT_ROOT,0}}}; err = oh_concat_ep(&ep1, &ep2); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (!oh_cmp_ep(&ep1, &ep3)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_313.c0000644000175100017510000000326512575647301020267 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_391.c0000644000175100017510000000320012575647301020262 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}{SUBRACK,5}"; char *epp_str = "{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_182.c0000644000175100017510000000325312575647301020270 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_401.c0000644000175100017510000000324412575647301020262 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_411.c0000644000175100017510000000324612575647301020265 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}"; char *epp_str = "*{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_449.c0000644000175100017510000000321512575647301020274 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}{BIOS,8}"; char *epp_str = "*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_317.c0000644000175100017510000000323112575647301020264 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_048.c0000644000175100017510000000320412575647301020265 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}"; char *epp_str = "*{.,.}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_022.c0000644000175100017510000000322012575647301020253 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "{.,.}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_164.c0000644000175100017510000000326012575647301020266 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_130.c0000644000175100017510000000322512575647301020260 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}"; char *epp_str = "{SYSTEM_CHASSIS,1}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_273.c0000644000175100017510000000321512575647301020267 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{.,.}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_277.c0000644000175100017510000000324512575647301020276 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_359.c0000644000175100017510000000317612575647301020302 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}"; char *epp_str = "*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_101.c0000644000175100017510000000331612575647301020257 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_409.c0000644000175100017510000000322312575647301020267 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}"; char *epp_str = "*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_187.c0000644000175100017510000000327612575647301020302 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SYSTEM_CHASSIS,.}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_425.c0000644000175100017510000000325412575647301020271 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}{BIOS,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/set_ep_loc_001.c0000755000175100017510000000240012575647301017530 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #include #include #include #include /* oh_set_ep_location: Zero entry entity path testcase. * Call should be ok but not change anything. */ int main(int argc, char **argv) { SaErrorT err; SaHpiEntityPathT ep = {{{0,0}}}; SaHpiEntityLocationT x = 3; err = oh_set_ep_location(&ep, SAHPI_ENT_BACK_PANEL_BOARD, x); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityLocation != 0) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[0].EntityType != 0) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_440.c0000644000175100017510000000323712575647301020267 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}{BIOS,8}"; char *epp_str = "{SYSTEM_CHASSIS,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_004.c0000644000175100017510000000323512575647301020261 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_418.c0000644000175100017510000000321212575647301020265 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}"; char *epp_str = "{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_120.c0000644000175100017510000000327212575647301020261 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{.,.}*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_179.c0000644000175100017510000000326612575647301020302 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_376.c0000644000175100017510000000323212575647301020272 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}{SUBRACK,5}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_122.c0000644000175100017510000000327112575647301020262 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{.,.}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/ep_cmp_011.c0000644000175100017510000000371112575647301016663 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_cmp_ep: unidentical multi-element entity path testcase. */ int main(int argc, char **argv) { SaHpiEntityPathT ep1 = {{{SAHPI_ENT_ADD_IN_CARD,51}, {SAHPI_ENT_FRONT_PANEL_BOARD,52}, {SAHPI_ENT_BACK_PANEL_BOARD,53}, {SAHPI_ENT_POWER_SYSTEM_BOARD,54}, {SAHPI_ENT_DRIVE_BACKPLANE,55}, {SAHPI_ENT_SYS_EXPANSION_BOARD,56}, {SAHPI_ENT_OTHER_SYSTEM_BOARD,57}, {SAHPI_ENT_PROCESSOR_BOARD,58}, {SAHPI_ENT_ROOT,0}}}; SaHpiEntityPathT ep2 = {{{SAHPI_ENT_ADD_IN_CARD,51}, {SAHPI_ENT_FRONT_PANEL_BOARD,52}, {SAHPI_ENT_BACK_PANEL_BOARD,53}, {SAHPI_ENT_POWER_SYSTEM_BOARD,54}, {SAHPI_ENT_DRIVE_BACKPLANE,55}, {SAHPI_ENT_SYS_EXPANSION_BOARD,56}, {SAHPI_ENT_POWER_MODULE,57}, {SAHPI_ENT_PROCESSOR_BOARD,58}, {SAHPI_ENT_ROOT,0}}}; if (oh_cmp_ep(&ep1, &ep2)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_074.c0000644000175100017510000000506712575647301017565 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{EXTERNAL_ENVIRONMENT,19}{BIOS,1}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_BIOS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_BIOS); return -1; } if (ep.Entry[0].EntityLocation != 1) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 1); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_EXTERNAL_ENVIRONMENT) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_EXTERNAL_ENVIRONMENT); return -1; } if (ep.Entry[1].EntityLocation != 19) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 19); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_327.c0000644000175100017510000000326712575647301020276 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_069.c0000644000175100017510000000323312575647301020272 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_123.c0000644000175100017510000000327112575647301020263 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{.,.}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_numeric_004.c0000644000175100017510000000263112575647301020245 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright FORCE Computers 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Thomas Kanngieser */ #include #include #include #include #include int main (int argc, char **argv) { gchar *test_string; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; /* check if we can convert the last entry of the list */ test_string = "{PHYSICAL_SLOT,12}"; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_088.c0000644000175100017510000000330712575647301020275 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_396.c0000644000175100017510000000320612575647301020275 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}{SUBRACK,5}"; char *epp_str = "{.,.}*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_018.c0000644000175100017510000000321312575647301020262 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_423.c0000644000175100017510000000321712575647301020266 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}"; char *epp_str = "*{.,.}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_046.c0000644000175100017510000000507212575647301017560 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{SYS_MGMNT_SOFTWARE,58}{REMOTE,76}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_REMOTE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_REMOTE); return -1; } if (ep.Entry[0].EntityLocation != 76) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 76); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_SYS_MGMNT_SOFTWARE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_SYS_MGMNT_SOFTWARE); return -1; } if (ep.Entry[1].EntityLocation != 58) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 58); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_404.c0000644000175100017510000000323512575647301020265 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_218.c0000644000175100017510000000324512575647301020271 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}"; char *epp_str = "{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_032.c0000644000175100017510000000320612575647301020260 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}"; char *epp_str = "{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_198.c0000644000175100017510000000325012575647301020274 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{.,.}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_080.c0000644000175100017510000000327012575647301020264 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_044.c0000644000175100017510000000510612575647301017554 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{SUBBOARD_CARRIER_BLADE,91}{SWITCH,44}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_SWITCH) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_SWITCH); return -1; } if (ep.Entry[0].EntityLocation != 44) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 44); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_SUBBOARD_CARRIER_BLADE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_SUBBOARD_CARRIER_BLADE); return -1; } if (ep.Entry[1].EntityLocation != 91) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 91); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_003.c0000644000175100017510000000323412575647301020257 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_403.c0000644000175100017510000000323412575647301020263 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_271.c0000644000175100017510000000321612575647301020266 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{.,.}*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_231.c0000644000175100017510000000320612575647301020261 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_274.c0000644000175100017510000000320312575647301020265 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/ep_concat_004.c0000644000175100017510000000316512575647301017360 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_concat_ep: concatenate 2 two element entity path */ int main(int argc, char **argv) { SaErrorT err; SaHpiEntityPathT ep1 = {{{SAHPI_ENT_UNKNOWN,11}, {SAHPI_ENT_OTHER,22}, {SAHPI_ENT_ROOT,0}}}; SaHpiEntityPathT ep2 = {{{SAHPI_ENT_PROCESSOR,39}, {SAHPI_ENT_DISK_BAY,44}, {SAHPI_ENT_ROOT,0}}}; SaHpiEntityPathT ep3 = {{{SAHPI_ENT_UNKNOWN,11}, {SAHPI_ENT_OTHER,22}, {SAHPI_ENT_PROCESSOR,39}, {SAHPI_ENT_DISK_BAY,44}, {SAHPI_ENT_ROOT,0}}}; err = oh_concat_ep(&ep1, &ep2); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (!oh_cmp_ep(&ep1, &ep3)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_355.c0000644000175100017510000000320312575647301020265 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}"; char *epp_str = "{SYSTEM_CHASSIS,1}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_112.c0000644000175100017510000000331712575647301020262 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SYSTEM_CHASSIS,.}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_356.c0000644000175100017510000000320212575647301020265 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}"; char *epp_str = "{SYSTEM_CHASSIS,1}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_233.c0000644000175100017510000000320112575647301020256 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}"; char *epp_str = "*{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_144.c0000644000175100017510000000321012575647301020257 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}"; char *epp_str = "*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_315.c0000644000175100017510000000324612575647301020270 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_041.c0000644000175100017510000000513312575647301017551 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{POWER_SYSTEM_BOARD,6}{OTHER_SYSTEM_BOARD,11}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_OTHER_SYSTEM_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_OTHER_SYSTEM_BOARD); return -1; } if (ep.Entry[0].EntityLocation != 11) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 11); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_POWER_SYSTEM_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_POWER_SYSTEM_BOARD); return -1; } if (ep.Entry[1].EntityLocation != 6) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 6); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_416.c0000644000175100017510000000321212575647301020263 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}"; char *epp_str = "{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_134.c0000644000175100017510000000322012575647301020257 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}"; char *epp_str = "*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_243.c0000644000175100017510000000317112575647301020265 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}"; char *epp_str = "{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_446.c0000644000175100017510000000323012575647301020266 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}{BIOS,8}"; char *epp_str = "{.,.}*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_091.c0000644000175100017510000000507512575647301017563 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{DISPLAY_PANEL,86}{SYSTEM_BOARD,90}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_SYSTEM_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_SYSTEM_BOARD); return -1; } if (ep.Entry[0].EntityLocation != 90) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 90); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_DISPLAY_PANEL) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_DISPLAY_PANEL); return -1; } if (ep.Entry[1].EntityLocation != 86) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 86); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_448.c0000644000175100017510000000322712575647301020276 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}{BIOS,8}"; char *epp_str = "*{.,.}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_131.c0000644000175100017510000000322412575647301020260 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}"; char *epp_str = "{SYSTEM_CHASSIS,1}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_276.c0000644000175100017510000000324412575647301020274 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_029.c0000644000175100017510000000506412575647301017562 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{SBC_BLADE,34}{PERIPHERAL_BAY,8}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_PERIPHERAL_BAY) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_PERIPHERAL_BAY); return -1; } if (ep.Entry[0].EntityLocation != 8) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 8); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_SBC_BLADE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_SBC_BLADE); return -1; } if (ep.Entry[1].EntityLocation != 34) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 34); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_129.c0000644000175100017510000000323212575647301020266 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_387.c0000644000175100017510000000323312575647301020275 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}{SUBRACK,5}"; char *epp_str = "*{SYSTEM_CHASSIS,.}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_428.c0000644000175100017510000000324412575647301020273 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}{BIOS,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_025.c0000644000175100017510000000323012575647301020257 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_178.c0000644000175100017510000000326512575647301020300 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_224.c0000644000175100017510000000324012575647301020261 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}"; char *epp_str = "*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_062.c0000644000175100017510000000326512575647301020270 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SYSTEM_CHASSIS,.}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_378.c0000644000175100017510000000322212575647301020273 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}{SUBRACK,5}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_436.c0000644000175100017510000000325612575647301020275 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}{BIOS,8}"; char *epp_str = "*{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_310.c0000644000175100017510000000324212575647301020257 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_111.c0000644000175100017510000000332012575647301020253 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_400.c0000644000175100017510000000324412575647301020261 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_299.c0000644000175100017510000000320512575647301020276 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/ep_concat_010.c0000644000175100017510000000265512575647301017360 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_concat_ep: concatenate a full and a zero element entity path */ int main(int argc, char **argv) { int i; SaErrorT err; SaHpiEntityPathT ep1; SaHpiEntityPathT ep2 = {{{SAHPI_ENT_ROOT,0}}}; SaHpiEntityPathT ep3; for (i=0; i */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_013.c0000644000175100017510000000324612575647301020263 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/ep_cmp_002.c0000644000175100017510000000204312575647301016660 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_cmp_ep: single element entity path testcase. */ int main(int argc, char **argv) { SaHpiEntityPathT ep1 = {{{SAHPI_ENT_ADD_IN_CARD,1111}, {SAHPI_ENT_ROOT, 0}}}; SaHpiEntityPathT ep2 = {{{SAHPI_ENT_ADD_IN_CARD,1111}, {SAHPI_ENT_ROOT, 0}}}; if (!oh_cmp_ep(&ep1, &ep2)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_137.c0000644000175100017510000000324212575647301020266 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}"; char *epp_str = "*{SYSTEM_CHASSIS,.}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_041.c0000644000175100017510000000317512575647301020265 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}"; char *epp_str = "{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/ep_concat_014.c0000644000175100017510000000363512575647301017363 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_concat_ep: concatenate two one less than full entity path */ int main(int argc, char **argv) { int i; SaErrorT err; SaHpiEntityPathT ep1; SaHpiEntityPathT ep2; SaHpiEntityPathT ep3; for (i=0; i */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_084.c0000644000175100017510000000326412575647301020273 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_369.c0000644000175100017510000000316612575647301020302 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}"; char *epp_str = "*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_340.c0000644000175100017510000000325112575647301020262 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_242.c0000644000175100017510000000317112575647301020264 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}"; char *epp_str = "*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_utils_test.c0000644000175100017510000002062612575647301020423 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #include #include #include #include #include int main (int argc, char **argv) { gchar *test_string, *expected_string; oh_big_textbuffer bigbuf; SaErrorT err, expected_err; SaHpiEntityPathT ep; /************************************************ * oh_encode_entitypath - Null parameter testcase ************************************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_entitypath(0, &ep); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /******************************************** * oh_encode_entitypath - All blanks testcase ********************************************/ test_string = " "; expected_err = SA_OK; err = oh_encode_entitypath(test_string, &ep); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /******************************************** * oh_encode_entitypath - Begin junk testcase ********************************************/ test_string = "junk{SYSTEM_CHASSIS,11}{SUBBOARD_CARRIER_BLADE,9}"; expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_entitypath(test_string, &ep); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /********************************************* * oh_encode_entitypath - Middle junk testcase *********************************************/ test_string = "{SYSTEM_CHASSIS,11}junk{SUBBOARD_CARRIER_BLADE,9}"; expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_entitypath(test_string, &ep); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /****************************************** * oh_encode_entitypath - End junk testcase ******************************************/ test_string = "{SYSTEM_CHASSIS,11}{SUBBOARD_CARRIER_BLADE,9}junk"; expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_entitypath(test_string, &ep); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /****************************************** * oh_encode_entitypath - No comma testcase ******************************************/ test_string = "{SYSTEM_CHASSIS.11}{SUBBOARD_CARRIER_BLADE,9}"; expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_entitypath(test_string, &ep); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /********************************************** * oh_encode_entitypath - Bad HPI type testcase **********************************************/ test_string = "{SYSTEM_CHASSIS,11}{WRONG_HPI_TYPE,9}"; expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_entitypath(test_string, &ep); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /************************************************** * oh_encode_entitypath - Bad HPI instance testcase **************************************************/ test_string = "{SYSTEM_CHASSIS,1abc1}{SYSTEM_SUB_CHASSIS,9}"; expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_entitypath(test_string, &ep); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /************************************************** * oh_encode_entitypath - Extra parameters testcase **************************************************/ test_string = "{SYSTEM_CHASSIS,2}{SYSTEM_SUB_CHASSIS,9,2}"; expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_entitypath(test_string, &ep); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /***************************************** * oh_encode_entitypath - Nominal testcase *****************************************/ test_string = "{SYSTEM_CHASSIS,1}{SUB_CHASSIS,2}"; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } /**************************************** * oh_encode_entitypath - Blanks testcase ****************************************/ test_string = " {SYSTEM_CHASSIS, 1111} { CHASSIS_BACK_PANEL_BOARD ,32 } "; expected_string = "{SYSTEM_CHASSIS,1111}{CHASSIS_BACK_PANEL_BOARD,32}"; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, expected_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } /******************************** * oh_decode_entitypath testcases ********************************/ { SaHpiEntityPathT test_ep; oh_init_ep(&test_ep); test_ep.Entry[0].EntityType = SAHPI_ENT_SUB_CHASSIS; test_ep.Entry[0].EntityLocation = 109; test_ep.Entry[1].EntityType = SAHPI_ENT_SYSTEM_CHASSIS; test_ep.Entry[1].EntityLocation = 112; /*************************************** * oh_decode_entitypath - Null testcase ***************************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_decode_entitypath(&test_ep, 0); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /*********************************************** * oh_decode_entitypath - Bad instance testcase ***********************************************/ test_ep.Entry[0].EntityLocation = 1234567; expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_decode_entitypath(&test_ep, &bigbuf); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } test_ep.Entry[0].EntityLocation = 109; /****************************************** * oh_decode_entitypath - Nominal testcase ******************************************/ expected_string = "{SYSTEM_CHASSIS,112}{SUB_CHASSIS,109}"; oh_init_bigtext(&bigbuf); oh_append_bigtext(&bigbuf, test_string); err = oh_decode_entitypath(&test_ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, expected_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_135.c0000644000175100017510000000322112575647301020261 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}"; char *epp_str = "*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_284.c0000644000175100017510000000322212575647301020267 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_392.c0000644000175100017510000000320012575647301020263 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}{SUBRACK,5}"; char *epp_str = "*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_001.c0000644000175100017510000000324412575647301020256 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_216.c0000644000175100017510000000324512575647301020267 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}"; char *epp_str = "{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_154.c0000644000175100017510000000324712575647301020272 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_042.c0000644000175100017510000000507212575647301017554 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{GROUP,2}{EXTERNAL_ENVIRONMENT,41}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_EXTERNAL_ENVIRONMENT) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_EXTERNAL_ENVIRONMENT); return -1; } if (ep.Entry[0].EntityLocation != 41) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 41); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_GROUP) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_GROUP); return -1; } if (ep.Entry[1].EntityLocation != 2) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 2); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_201.c0000644000175100017510000000327712575647301020266 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_139.c0000644000175100017510000000324412575647301020272 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/set_ep_loc_010.c0000755000175100017510000000543312575647301017541 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #include #include #include #include /* oh_set_ep_location: Entity type not in multi-element entity path. * OK but nothing changed */ int main(int argc, char **argv) { SaErrorT err; SaHpiEntityPathT ep = {{{SAHPI_ENT_GROUP, 100}, {SAHPI_ENT_REMOTE, 200}, {SAHPI_ENT_EXTERNAL_ENVIRONMENT, 300}, {SAHPI_ENT_BATTERY, 400}, {SAHPI_ENT_CHASSIS_SPECIFIC, 500}, {SAHPI_ENT_BOARD_SET_SPECIFIC, 600}, {SAHPI_ENT_OEM_SYSINT_SPECIFIC, 700}, {SAHPI_ENT_ROOT, 800}, {SAHPI_ENT_RACK, 900}, {SAHPI_ENT_SUBRACK, 1000}, {0}}}; SaHpiEntityLocationT x = 11000; err = oh_set_ep_location(&ep, SAHPI_ENT_FAN, x); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if((ep.Entry[0].EntityLocation != 100) || (ep.Entry[0].EntityType != SAHPI_ENT_GROUP) || (ep.Entry[1].EntityLocation != 200) || (ep.Entry[1].EntityType != SAHPI_ENT_REMOTE) || (ep.Entry[2].EntityLocation != 300) || (ep.Entry[2].EntityType != SAHPI_ENT_EXTERNAL_ENVIRONMENT) || (ep.Entry[3].EntityLocation != 400) || (ep.Entry[3].EntityType != SAHPI_ENT_BATTERY) || (ep.Entry[4].EntityLocation != 500) || (ep.Entry[4].EntityType != SAHPI_ENT_CHASSIS_SPECIFIC) || (ep.Entry[5].EntityLocation != 600) || (ep.Entry[5].EntityType != SAHPI_ENT_BOARD_SET_SPECIFIC) || (ep.Entry[6].EntityLocation != 700) || (ep.Entry[6].EntityType != SAHPI_ENT_OEM_SYSINT_SPECIFIC) || (ep.Entry[7].EntityLocation != 800) || (ep.Entry[7].EntityType != SAHPI_ENT_ROOT) || (ep.Entry[8].EntityLocation != 900) || (ep.Entry[8].EntityType != SAHPI_ENT_RACK) || (ep.Entry[9].EntityLocation != 1000) || (ep.Entry[9].EntityType != SAHPI_ENT_SUBRACK)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_084.c0000644000175100017510000000513312575647301017560 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{ADD_IN_CARD,43}{CHASSIS_BACK_PANEL_BOARD,83}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_CHASSIS_BACK_PANEL_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_CHASSIS_BACK_PANEL_BOARD); return -1; } if (ep.Entry[0].EntityLocation != 83) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 83); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_ADD_IN_CARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_ADD_IN_CARD); return -1; } if (ep.Entry[1].EntityLocation != 43) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 43); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_059.c0000644000175100017510000000511412575647301017561 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{PERIPHERAL_BAY,82}{SYS_MGMNT_MODULE,87}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_SYS_MGMNT_MODULE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_SYS_MGMNT_MODULE); return -1; } if (ep.Entry[0].EntityLocation != 87) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 87); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_PERIPHERAL_BAY) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_PERIPHERAL_BAY); return -1; } if (ep.Entry[1].EntityLocation != 82) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 82); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_438.c0000644000175100017510000000325612575647301020277 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}{BIOS,8}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_228.c0000644000175100017510000000321312575647301020265 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_155.c0000644000175100017510000000324212575647301020266 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_254.c0000644000175100017510000000323312575647301020266 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_073.c0000644000175100017510000000505312575647301017557 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{REMOTE,51}{ALARM_MANAGER,19}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_ALARM_MANAGER) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_ALARM_MANAGER); return -1; } if (ep.Entry[0].EntityLocation != 19) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 19); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_REMOTE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_REMOTE); return -1; } if (ep.Entry[1].EntityLocation != 51) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 51); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_015.c0000644000175100017510000000323012575647301020256 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_379.c0000644000175100017510000000322312575647301020275 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}{SUBRACK,5}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_194.c0000644000175100017510000000324412575647301020273 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_166.c0000644000175100017510000000322412575647301020270 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_055.c0000644000175100017510000000511112575647301017552 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{MEMORY_DEVICE,50}{OPERATING_SYSTEM,20}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_OPERATING_SYSTEM) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_OPERATING_SYSTEM); return -1; } if (ep.Entry[0].EntityLocation != 20) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 20); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_MEMORY_DEVICE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_MEMORY_DEVICE); return -1; } if (ep.Entry[1].EntityLocation != 50) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 50); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_314.c0000644000175100017510000000326612575647301020271 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_095.c0000644000175100017510000000510012575647301017554 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{DISK_DRIVE,81}{BACK_PANEL_BOARD,87}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_BACK_PANEL_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_BACK_PANEL_BOARD); return -1; } if (ep.Entry[0].EntityLocation != 87) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 87); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_DISK_DRIVE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_DISK_DRIVE); return -1; } if (ep.Entry[1].EntityLocation != 81) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 81); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/ep_concat_015.c0000644000175100017510000000506712575647301017365 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_concat_ep: concatenate a 5 element entity path that has garbage beyond end element with a 5 element. Garbage should be gone at end result. */ int main(int argc, char **argv) { SaErrorT err; SaHpiEntityPathT ep1 = {{{SAHPI_ENT_GROUP,1}, {SAHPI_ENT_REMOTE,2}, {SAHPI_ENT_EXTERNAL_ENVIRONMENT,3}, {SAHPI_ENT_BATTERY,4}, {SAHPI_ENT_CHASSIS_SPECIFIC,5}, {SAHPI_ENT_ROOT,0}, {SAHPI_ENT_FAN,11}, {SAHPI_ENT_RACK,12}}}; SaHpiEntityPathT ep2 = {{{SAHPI_ENT_GROUP,101}, {SAHPI_ENT_REMOTE,102}, {SAHPI_ENT_EXTERNAL_ENVIRONMENT,103}, {SAHPI_ENT_BATTERY,104}, {SAHPI_ENT_CHASSIS_SPECIFIC,105}, {SAHPI_ENT_ROOT,0}}}; SaHpiEntityPathT ep3 = {{{SAHPI_ENT_GROUP,1}, {SAHPI_ENT_REMOTE,2}, {SAHPI_ENT_EXTERNAL_ENVIRONMENT,3}, {SAHPI_ENT_BATTERY,4}, {SAHPI_ENT_CHASSIS_SPECIFIC,5}, {SAHPI_ENT_GROUP,101}, {SAHPI_ENT_REMOTE,102}, {SAHPI_ENT_EXTERNAL_ENVIRONMENT,103}, {SAHPI_ENT_BATTERY,104}, {SAHPI_ENT_CHASSIS_SPECIFIC,105}, {SAHPI_ENT_ROOT,0}}}; err = oh_concat_ep(&ep1, &ep2); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (!oh_cmp_ep(&ep1, &ep3)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/ep_cmp_010.c0000644000175100017510000000373712575647301016672 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_cmp_ep: unidentical multi element entity path testcase. */ int main(int argc, char **argv) { SaHpiEntityPathT ep1 = {{{SAHPI_ENT_ADD_IN_CARD,151}, {SAHPI_ENT_FRONT_PANEL_BOARD,252}, {SAHPI_ENT_BACK_PANEL_BOARD,353}, {SAHPI_ENT_POWER_SYSTEM_BOARD,454}, {SAHPI_ENT_DRIVE_BACKPLANE,555}, {SAHPI_ENT_SYS_EXPANSION_BOARD,656}, {SAHPI_ENT_OTHER_SYSTEM_BOARD,757}, {SAHPI_ENT_PROCESSOR_BOARD,858}, {SAHPI_ENT_ROOT,0}}}; SaHpiEntityPathT ep2 = {{{SAHPI_ENT_ADD_IN_CARD,151}, {SAHPI_ENT_FRONT_PANEL_BOARD,252}, {SAHPI_ENT_BACK_PANEL_BOARD,353}, {SAHPI_ENT_POWER_SYSTEM_BOARD,454}, {SAHPI_ENT_DRIVE_BACKPLANE,555}, {SAHPI_ENT_SYS_EXPANSION_BOARD,656}, {SAHPI_ENT_OTHER_SYSTEM_BOARD,757}, {SAHPI_ENT_PROCESSOR_BOARD,859}, {SAHPI_ENT_ROOT,0}}}; if (oh_cmp_ep(&ep1, &ep2)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_308.c0000644000175100017510000000324212575647301020266 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_numeric_005.c0000644000175100017510000000262412575647301020250 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright FORCE Computers 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Thomas Kanngieser */ #include #include #include #include #include int main (int argc, char **argv) { gchar test_string[512]; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; snprintf(test_string, 512, "{%d,13}", SAHPI_ENT_ROOT_VALUE*2); err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_026.c0000644000175100017510000000510012575647301017546 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{CHASSIS_SPECIFIC,12}{SYSTEM_BUS,32}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_SYSTEM_BUS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_SYSTEM_BUS); return -1; } if (ep.Entry[0].EntityLocation != 32) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 32); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_CHASSIS_SPECIFIC) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_CHASSIS_SPECIFIC); return -1; } if (ep.Entry[1].EntityLocation != 12) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 12); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_081.c0000644000175100017510000000327012575647301020265 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_249.c0000644000175100017510000000316412575647301020275 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}"; char *epp_str = "*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_020.c0000644000175100017510000000322112575647301020252 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "*{.,.}*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_054.c0000644000175100017510000000325412575647301020267 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_116.c0000644000175100017510000000326412575647301020267 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_354.c0000644000175100017510000000321012575647301020262 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_185.c0000644000175100017510000000325412575647301020274 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_013.c0000644000175100017510000000506412575647301017553 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{SYSTEM_CHASSIS,77}{IO_BLADE,55}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_IO_BLADE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_IO_BLADE); return -1; } if (ep.Entry[0].EntityLocation != 55) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 55); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_SYSTEM_CHASSIS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_SYSTEM_CHASSIS); return -1; } if (ep.Entry[1].EntityLocation != 77) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 77); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_022.c0000644000175100017510000000510612575647301017550 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{COOLING_UNIT,79}{CHASSIS_SPECIFIC,79}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_CHASSIS_SPECIFIC) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_CHASSIS_SPECIFIC); return -1; } if (ep.Entry[0].EntityLocation != 79) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 79); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_COOLING_UNIT) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_COOLING_UNIT); return -1; } if (ep.Entry[1].EntityLocation != 79) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 79); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_180.c0000644000175100017510000000326112575647301020265 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_190.c0000644000175100017510000000326012575647301020265 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_353.c0000644000175100017510000000320712575647301020267 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_057.c0000644000175100017510000000506412575647301017563 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{INTERCONNECT,94}{DEVICE_BAY,18}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_DEVICE_BAY) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_DEVICE_BAY); return -1; } if (ep.Entry[0].EntityLocation != 18) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 18); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_INTERCONNECT) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_INTERCONNECT); return -1; } if (ep.Entry[1].EntityLocation != 94) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 94); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/ep_cmp_004.c0000644000175100017510000000372712575647301016674 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_cmp_ep: multi-element entity path testcase. */ int main(int argc, char **argv) { SaHpiEntityPathT ep1 = {{{SAHPI_ENT_ADD_IN_CARD,151}, {SAHPI_ENT_FRONT_PANEL_BOARD,252}, {SAHPI_ENT_BACK_PANEL_BOARD,353}, {SAHPI_ENT_POWER_SYSTEM_BOARD,454}, {SAHPI_ENT_DRIVE_BACKPLANE,555}, {SAHPI_ENT_SYS_EXPANSION_BOARD,656}, {SAHPI_ENT_OTHER_SYSTEM_BOARD,757}, {SAHPI_ENT_PROCESSOR_BOARD,858}, {SAHPI_ENT_ROOT, 0}}}; SaHpiEntityPathT ep2 = {{{SAHPI_ENT_ADD_IN_CARD,151}, {SAHPI_ENT_FRONT_PANEL_BOARD,252}, {SAHPI_ENT_BACK_PANEL_BOARD,353}, {SAHPI_ENT_POWER_SYSTEM_BOARD,454}, {SAHPI_ENT_DRIVE_BACKPLANE,555}, {SAHPI_ENT_SYS_EXPANSION_BOARD,656}, {SAHPI_ENT_OTHER_SYSTEM_BOARD,757}, {SAHPI_ENT_PROCESSOR_BOARD,858}, {SAHPI_ENT_ROOT, 0}}}; if (!oh_cmp_ep(&ep1, &ep2)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_250.c0000644000175100017510000000324212575647301020262 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_020.c0000644000175100017510000000510312575647301017543 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{ALARM_MANAGER,25}{DISK_DRIVE_BAY,52}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_DISK_DRIVE_BAY) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_DISK_DRIVE_BAY); return -1; } if (ep.Entry[0].EntityLocation != 52) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 52); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_ALARM_MANAGER) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_ALARM_MANAGER); return -1; } if (ep.Entry[1].EntityLocation != 25) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 25); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_234.c0000644000175100017510000000320112575647301020257 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}"; char *epp_str = "*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_382.c0000644000175100017510000000321012575647301020263 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}{SUBRACK,5}"; char *epp_str = "{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_146.c0000644000175100017510000000321512575647301020266 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}"; char *epp_str = "{.,.}*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/ep_derive_001.c0000644000175100017510000000612312575647301017361 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #include #include #include #include #include /** * Tests string derive function - success case * - multiple substitutions * - expanded returned oid string * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { /***************************** * oh_derive_string testcases *****************************/ gchar *oid, *in_oid, *expected_oid; SaHpiEntityPathT ep = { .Entry[0] = { .EntityType = SAHPI_ENT_SYS_MGMNT_MODULE, .EntityLocation = 100 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 99 } }; /* Multiple character/digit expansion testcase */ in_oid = "1.x.3.x"; expected_oid = "1.99.3.100"; oid = oh_derive_string(&ep, 0, 10, in_oid); if (strcmp(expected_oid, oid)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received OID=%s; Expected OID=%s\n", oid, expected_oid); g_free(oid); return -1; } g_free(oid); /* location offset testcase */ in_oid = "1.x.3.x"; expected_oid = "1.109.3.110"; oid = oh_derive_string(&ep, 10, 10, in_oid); if (strcmp(expected_oid, oid)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received OID=%s; Expected OID=%s\n", oid, expected_oid); g_free(oid); return -1; } g_free(oid); /* base and offset testcase */ in_oid = "1.x.3.x"; expected_oid = "1.6D.3.6E"; oid = oh_derive_string(&ep, 10, 16, in_oid); if (strcmp(expected_oid, oid)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received OID=%s; Expected OID=%s\n", oid, expected_oid); g_free(oid); return -1; } g_free(oid); /* No expansion testcase */ in_oid = "1.99.3.100"; expected_oid = "1.99.3.100"; oid = oh_derive_string(&ep, 0, 10, in_oid); if (strcmp(expected_oid, oid)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received OID=%s; Expected OID=%s\n", oid, expected_oid); g_free(oid); return -1; } g_free(oid); /* Event testcase */ SaHpiEntityPathT ep2 = { .Entry[0] = { .EntityType = SAHPI_ENT_SYS_MGMNT_MODULE, .EntityLocation = 11 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 14 } }; in_oid = "1.x.3.x"; expected_oid = "1.E.3.B"; oid = oh_derive_string(&ep2, 0, 16, in_oid); if (strcmp(expected_oid, oid)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received OID=%s; Expected OID=%s\n", oid, expected_oid); g_free(oid); return -1; } g_free(oid); return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_161.c0000644000175100017510000000325712575647301020271 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "*{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_034.c0000644000175100017510000000320712575647301020263 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}"; char *epp_str = "*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_092.c0000644000175100017510000000325312575647301020270 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_388.c0000644000175100017510000000323412575647301020277 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}{SUBRACK,5}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_380.c0000644000175100017510000000321612575647301020267 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}{SUBRACK,5}"; char *epp_str = "{SYSTEM_CHASSIS,1}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_075.c0000644000175100017510000000507512575647301017565 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{COOLING_UNIT,97}{ALARM_MANAGER,20}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_ALARM_MANAGER) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_ALARM_MANAGER); return -1; } if (ep.Entry[0].EntityLocation != 20) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 20); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_COOLING_UNIT) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_COOLING_UNIT); return -1; } if (ep.Entry[1].EntityLocation != 97) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 97); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_140.c0000644000175100017510000000322412575647301020260 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}"; char *epp_str = "{SYSTEM_CHASSIS,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_052.c0000644000175100017510000000326412575647301020266 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_083.c0000644000175100017510000000506112575647301017557 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{POWER_MODULE,78}{DISK_DRIVE,6}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_DISK_DRIVE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_DISK_DRIVE); return -1; } if (ep.Entry[0].EntityLocation != 6) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 6); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_POWER_MODULE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_POWER_MODULE); return -1; } if (ep.Entry[1].EntityLocation != 78) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 78); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_086.c0000644000175100017510000000511112575647301017556 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{DEVICE_BAY,69}{OTHER_CHASSIS_BOARD,50}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_OTHER_CHASSIS_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_OTHER_CHASSIS_BOARD); return -1; } if (ep.Entry[0].EntityLocation != 50) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 50); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_DEVICE_BAY) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_DEVICE_BAY); return -1; } if (ep.Entry[1].EntityLocation != 69) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 69); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/set_ep_loc_003.c0000755000175100017510000000306112575647301017536 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_set_ep_location: Entity path that has 2 elements testcase. */ int main(int argc, char **argv) { SaErrorT err; SaHpiEntityPathT ep = {{{SAHPI_ENT_BIOS, 1},{SAHPI_ENT_UNKNOWN, 2},{0}}}; SaHpiEntityLocationT x = 777; err = oh_set_ep_location(&ep, SAHPI_ENT_UNKNOWN, x); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[1].EntityLocation != x) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_UNKNOWN) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[0].EntityLocation != 1) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_BIOS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/print_ep_000.c0000644000175100017510000000171012575647301017233 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_print_ep: NULL pointer testcase. */ int main(int argc, char **argv) { int offsets = 0; SaErrorT err; SaErrorT expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_print_ep(NULL, offsets); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_074.c0000644000175100017510000000322512575647301020267 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_079.c0000644000175100017510000000327512575647301020301 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_283.c0000644000175100017510000000322212575647301020266 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "*{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_121.c0000644000175100017510000000327212575647301020262 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{.,.}*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_239.c0000644000175100017510000000322612575647301020273 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_236.c0000644000175100017510000000322512575647301020267 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}"; char *epp_str = "*{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_094.c0000644000175100017510000000505312575647301017562 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{SWITCH_BLADE,1}{IO_BLADE,42}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_IO_BLADE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_IO_BLADE); return -1; } if (ep.Entry[0].EntityLocation != 42) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 42); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_SWITCH_BLADE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_SWITCH_BLADE); return -1; } if (ep.Entry[1].EntityLocation != 1) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 1); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_275.c0000644000175100017510000000324412575647301020273 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_104.c0000644000175100017510000000330712575647301020262 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_035.c0000644000175100017510000000510312575647301017551 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{ALARM_MANAGER,3}{PROCESSOR_MODULE,5}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_PROCESSOR_MODULE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_PROCESSOR_MODULE); return -1; } if (ep.Entry[0].EntityLocation != 5) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 5); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_ALARM_MANAGER) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_ALARM_MANAGER); return -1; } if (ep.Entry[1].EntityLocation != 3) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 3); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_037.c0000644000175100017510000000510312575647301017553 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{MEMORY_MODULE,76}{DISK_DRIVE_BAY,27}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_DISK_DRIVE_BAY) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_DISK_DRIVE_BAY); return -1; } if (ep.Entry[0].EntityLocation != 27) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 27); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_MEMORY_MODULE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_MEMORY_MODULE); return -1; } if (ep.Entry[1].EntityLocation != 76) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 76); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/set_ep_loc_012.c0000755000175100017510000000447612575647301017551 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_set_ep_location: Dull entity path and victim element in the middle. * Only victim element's instance number changed. */ int main(int argc, char **argv) { unsigned int y = 77002; unsigned int z = 3; unsigned int i = 0; SaErrorT err; SaHpiEntityPathT ep; SaHpiEntityTypeT w = SAHPI_ENT_SBC_BLADE; SaHpiEntityLocationT x = 56873; for (i=0; i */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_335.c0000644000175100017510000000324512575647301020271 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_316.c0000644000175100017510000000323112575647301020263 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_097.c0000644000175100017510000000326012575647301020273 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{.,.}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_065.c0000644000175100017510000000324712575647301020273 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/ep_concat_013.c0000644000175100017510000000225612575647301017360 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_concat_ep: concatenate two zero element entity path */ int main(int argc, char **argv) { SaErrorT err; SaHpiEntityPathT ep1 = {{{SAHPI_ENT_ROOT,0}}}; SaHpiEntityPathT ep2 = {{{SAHPI_ENT_ROOT,0}}}; SaHpiEntityPathT ep3 = {{{SAHPI_ENT_ROOT,0}}}; err = oh_concat_ep(&ep1, &ep2); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (!oh_cmp_ep(&ep1, &ep3)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_007.c0000644000175100017510000000511112575647301017547 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{DISPLAY_PANEL,41}{PERIPHERAL_BAY_2,39}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_PERIPHERAL_BAY_2) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_PERIPHERAL_BAY_2); return -1; } if (ep.Entry[0].EntityLocation != 39) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 39); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_DISPLAY_PANEL) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_DISPLAY_PANEL); return -1; } if (ep.Entry[1].EntityLocation != 41) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 41); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_008.c0000644000175100017510000000506412575647301017557 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{POWER_UNIT,91}{INTERCONNECT,87}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_INTERCONNECT) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_INTERCONNECT); return -1; } if (ep.Entry[0].EntityLocation != 87) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 87); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_POWER_UNIT) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_POWER_UNIT); return -1; } if (ep.Entry[1].EntityLocation != 91) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 91); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_017.c0000644000175100017510000000510312575647301017551 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{ALARM_MANAGER,53}{SYSTEM_CHASSIS,49}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_SYSTEM_CHASSIS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_SYSTEM_CHASSIS); return -1; } if (ep.Entry[0].EntityLocation != 49) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 49); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_ALARM_MANAGER) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_ALARM_MANAGER); return -1; } if (ep.Entry[1].EntityLocation != 53) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 53); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_numeric_002.c0000644000175100017510000000203312575647301020237 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright FORCE Computers 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Thomas Kanngieser */ #include #include #include #include #include int main (int argc, char **argv) { gchar *test_string; SaErrorT err, expected_err; SaHpiEntityPathT ep; /* Negative values are not allowed */ test_string = "{-7,11}"; expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_entitypath(test_string, &ep); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_148.c0000644000175100017510000000321412575647301020267 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}"; char *epp_str = "*{.,.}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_162.c0000644000175100017510000000325612575647301020271 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "*{SYSTEM_CHASSIS,.}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_343.c0000644000175100017510000000323412575647301020266 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_047.c0000644000175100017510000000507212575647301017561 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{EXTERNAL_ENVIRONMENT,42}{RACK,79}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_RACK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_RACK); return -1; } if (ep.Entry[0].EntityLocation != 79) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 79); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_EXTERNAL_ENVIRONMENT) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_EXTERNAL_ENVIRONMENT); return -1; } if (ep.Entry[1].EntityLocation != 42) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 42); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_conv_043.c0000644000175100017510000000513012575647301017550 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{SYS_MGMNT_MODULE,71}{COMPACTPCI_CHASSIS,87}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_COMPACTPCI_CHASSIS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_COMPACTPCI_CHASSIS); return -1; } if (ep.Entry[0].EntityLocation != 87) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 87); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_SYS_MGMNT_MODULE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_SYS_MGMNT_MODULE); return -1; } if (ep.Entry[1].EntityLocation != 71) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 71); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_444.c0000644000175100017510000000322312575647301020266 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}{BIOS,8}"; char *epp_str = "*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/epath/epath_pattern_318.c0000644000175100017510000000323112575647301020265 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-3.6.1/utils/t/sahpi/0000755000175100017510000000000012605014516014662 5ustar mohanmohanopenhpi-3.6.1/utils/t/sahpi/sahpi_struct_idrarea_test.c0000644000175100017510000000570212575647301022302 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * pdphan */ #include #include #include #include #include int main(int argc, char **argv) { SaErrorT err; SaHpiIdrAreaHeaderT thisIdrArea; SaHpiBoolT test1Fail = SAHPI_FALSE, test2Fail = SAHPI_FALSE, test3Fail = SAHPI_FALSE, test4Fail = SAHPI_FALSE, test5Fail = SAHPI_FALSE; FILE *fp; const char *name = "/tmp/idrareatmp"; const char *mode = "a"; fp = fopen(name, mode); if (fp == NULL) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } /* ------------------------------------------------ */ /* NULL Pointer tests */ /* ------------------------------------------------ */ err = oh_fprint_idrareaheader(NULL , &thisIdrArea, 3); if (err != SA_ERR_HPI_INVALID_PARAMS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); test1Fail = SAHPI_TRUE; } err = oh_fprint_idrareaheader(fp, NULL, 3); if (err != SA_ERR_HPI_INVALID_PARAMS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); test2Fail = SAHPI_TRUE; } err = oh_fprint_idrareaheader(NULL , NULL, 3); if (err != SA_ERR_HPI_INVALID_PARAMS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); test3Fail = SAHPI_TRUE; } /* ------------------------------------------------ */ /* Normal write to file test */ /* ------------------------------------------------ */ thisIdrArea.AreaId = 3; thisIdrArea.Type = 1; thisIdrArea.ReadOnly = SAHPI_TRUE; thisIdrArea.NumFields = 1; err = oh_fprint_idrareaheader(fp, &thisIdrArea, 3); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); test4Fail = SAHPI_TRUE; } /* ------------------------------------------------ */ /* Normal write to stdout test */ /* ------------------------------------------------ */ err = oh_print_idrareaheader(&thisIdrArea, 3); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); test5Fail = SAHPI_TRUE; } /* ------------------------------------------------ */ /* Write to invalid file handle test */ /* ------------------------------------------------ */ /* TBD */ fclose(fp); unlink(name); if (!test1Fail && !test2Fail && !test3Fail && !test4Fail && !test5Fail) return(0); else return(-1); } openhpi-3.6.1/utils/t/sahpi/sahpi_struct_idrinfo_test.c0000644000175100017510000000564612575647301022334 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * pdphan */ #include #include #include #include #include int main(int argc, char **argv) { SaErrorT err; SaHpiIdrInfoT thisIdrInfo; SaHpiBoolT test1Fail = SAHPI_FALSE, test2Fail = SAHPI_FALSE, test3Fail = SAHPI_FALSE, test4Fail = SAHPI_FALSE, test5Fail = SAHPI_FALSE; FILE *fp; const char *name = "/tmp/idrinfotmp"; const char *mode = "a"; fp = fopen(name, mode); if (fp == NULL) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } /* ------------------------------------------------ */ /* NULL Pointer tests */ /* ------------------------------------------------ */ err = oh_fprint_idrinfo(NULL , &thisIdrInfo, 3); if (err != SA_ERR_HPI_INVALID_PARAMS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); test1Fail = SAHPI_TRUE; } err = oh_fprint_idrinfo(fp, NULL, 3); if (err != SA_ERR_HPI_INVALID_PARAMS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); test2Fail = SAHPI_TRUE; } err = oh_fprint_idrinfo(NULL , NULL, 3); if (err != SA_ERR_HPI_INVALID_PARAMS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); test3Fail = SAHPI_TRUE; } /* ------------------------------------------------ */ /* Normal write to file test */ /* ------------------------------------------------ */ thisIdrInfo.IdrId = 1; thisIdrInfo.UpdateCount = 2; thisIdrInfo.ReadOnly = SAHPI_FALSE; thisIdrInfo.NumAreas = 100; err = oh_fprint_idrinfo(fp, &thisIdrInfo, 3); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); test4Fail = SAHPI_TRUE; } /* ------------------------------------------------ */ /* Normal write to stdout test */ /* ------------------------------------------------ */ err = oh_print_idrinfo(&thisIdrInfo, 3); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); test5Fail = SAHPI_TRUE; } /* ------------------------------------------------ */ /* Write to invalid file handle test */ /* ------------------------------------------------ */ /* TBD */ fclose(fp); unlink(name); if (!test1Fail && !test2Fail && !test3Fail && !test4Fail && !test5Fail) return(0); else return(-1); } openhpi-3.6.1/utils/t/sahpi/sahpi_event_utils_test.c0000644000175100017510000003235612575647301021635 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #include #include #include #include #define BAD_CAT -1 #define BAD_TYPE -1 int main(int argc, char **argv) { const char *expected_str; SaErrorT err, expected_err; SaHpiEventStateT event_state, expected_state; SaHpiEventCategoryT event_cat, expected_cat; SaHpiTextBufferT buffer; /******************************** * oh_decode_eventstate testcases ********************************/ /* oh_decode_eventstate: Bad event category testcase */ { expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_decode_eventstate(SAHPI_ES_UNSPECIFIED, BAD_CAT, &buffer); if (expected_err != err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d, Expected error=%d\n", err, expected_err); return -1; } } /* oh_decode_eventstate: NULL buffer testcase */ { expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_decode_eventstate(SAHPI_ES_UNSPECIFIED, SAHPI_EC_UNSPECIFIED, 0); if (expected_err != err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d, Expected error=%d\n", err, expected_err); return -1; } } /* oh_decode_eventstate: print UNSPECIFIED testcase */ { event_state = SAHPI_ES_UNSPECIFIED; event_cat = SAHPI_EC_GENERIC; expected_str = "UNSPECIFIED"; err = oh_decode_eventstate(event_state, event_cat, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", buffer.Data, expected_str); return -1; } } /* oh_decode_eventstate: strip extra UNSPECIFIED testcase */ { event_state = SAHPI_ES_STATE_01 | SAHPI_ES_STATE_03 | SAHPI_ES_UNSPECIFIED; expected_str = "STATE_01 | STATE_03"; err = oh_decode_eventstate(event_state, event_cat, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", buffer.Data, expected_str); return -1; } } /******************************** * oh_encode_eventstate testcases ********************************/ /* oh_encode_eventstate testcases - NULL parameters testcase */ { expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_eventstate(0, 0, 0); if (expected_err != err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d, Expected error=%d\n", err, expected_err); return -1; } } /* oh_encode_eventstate testcases - No Data testcase */ { expected_err = SA_ERR_HPI_INVALID_PARAMS; buffer.Data[0] = 0x00; err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (expected_err != err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d, Expected error=%d\n", err, expected_err); return -1; } } /* oh_encode_eventstate testcases - handle blanks testcase */ { strcpy((char *)buffer.Data, " LOWER_MINOR | LOWER_MAJOR|LOWER_CRIT "); buffer.DataLength = strlen(" LOWER_MINOR | LOWER_MAJOR|LOWER_CRIT "); expected_cat = SAHPI_EC_THRESHOLD; expected_state = SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_CRIT; err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || (expected_cat != event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Receive state:d state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* oh_encode_eventstate testcases - valid states but different categories testcase */ { strcpy((char *)buffer.Data, "LOWER_MINOR | STATE_13 | IDLE"); buffer.DataLength = strlen("LOWER_MINOR | STATE_13 | IDLE"); expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (expected_err != err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d, Expected error=%d\n", err, expected_err); return -1; } } /* oh_encode_eventstate testcases - garbage state testcase */ { strcpy((char *)buffer.Data, "GARBAGE_STATE"); buffer.DataLength = strlen("GARBAGE_STATE"); expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (expected_err != err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d, Expected error=%d\n", err, expected_err); return -1; } } /******************************* * oh_valid_eventstate testcases *******************************/ #if 0 /* oh_valid_eventstate: SAHPI_EC_THRESHOLD Completeness (lower crit; no lower major) testcase */ { event_state = SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_CRIT; if (oh_valid_eventstate(event_state, SAHPI_EC_THRESHOLD, SAHPI_TRUE)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } /* oh_valid_eventstate: SAHPI_EC_THRESHOLD Completeness (lower major; no lower minor) testcase */ { event_state = SAHPI_ES_LOWER_MAJOR; if (oh_valid_eventstate(event_state, SAHPI_EC_THRESHOLD, SAHPI_TRUE)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } /* oh_valid_eventstate: SAHPI_EC_THRESHOLD Completeness (upper crit; no upper major) testcase */ { event_state = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_CRIT; if (oh_valid_eventstate(event_state, SAHPI_EC_THRESHOLD, SAHPI_TRUE)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } /* oh_valid_eventstate: SAHPI_EC_THRESHOLD Completeness (upper major; no upper minor) testcase */ { event_state = SAHPI_ES_UPPER_MAJOR; if (oh_valid_eventstate(event_state, SAHPI_EC_THRESHOLD, SAHPI_TRUE)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } #endif /* oh_valid_eventstate: SAHPI_EC_STATE exclusion testcase */ { event_state = SAHPI_ES_STATE_DEASSERTED | SAHPI_ES_STATE_ASSERTED; if (oh_valid_eventstate(event_state, SAHPI_EC_STATE, SAHPI_TRUE)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } /* oh_valid_eventstate: SAHPI_EC_PRED_FAIL exclusion testcase */ { event_state = SAHPI_ES_PRED_FAILURE_DEASSERT | SAHPI_ES_PRED_FAILURE_ASSERT; if (oh_valid_eventstate(event_state, SAHPI_EC_PRED_FAIL, SAHPI_TRUE)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } /* oh_valid_eventstate: SAHPI_EC_LIMIT exclusion testcase */ { event_state = SAHPI_ES_LIMIT_NOT_EXCEEDED | SAHPI_ES_LIMIT_EXCEEDED; if (oh_valid_eventstate(event_state, SAHPI_EC_LIMIT, SAHPI_TRUE)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } /* oh_valid_eventstate: SAHPI_EC_PERFORMANCE exclusion testcase */ { event_state = SAHPI_ES_PERFORMANCE_MET | SAHPI_ES_PERFORMANCE_LAGS; if (oh_valid_eventstate(event_state, SAHPI_EC_PERFORMANCE, SAHPI_TRUE)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } /* oh_valid_eventstate: SAHPI_EC_PRESENCE exclusion testcase */ { event_state = SAHPI_ES_ABSENT | SAHPI_ES_PRESENT; if (oh_valid_eventstate(event_state, SAHPI_EC_PRESENCE, SAHPI_TRUE)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } /* oh_valid_eventstate: SAHPI_EC_ENABLE exclusion testcase */ { event_state = SAHPI_ES_DISABLED | SAHPI_ES_ENABLED; if (oh_valid_eventstate(event_state, SAHPI_EC_ENABLE, SAHPI_TRUE)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } /* oh_valid_eventstate: SAHPI_EC_REDUNDANCY - SAHPI_ES_FULLY_REDUNDANT exclusion testcase */ { event_state = SAHPI_ES_FULLY_REDUNDANT | SAHPI_ES_REDUNDANCY_LOST; if (oh_valid_eventstate(event_state, SAHPI_EC_REDUNDANCY, SAHPI_TRUE)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } /* oh_valid_eventstate: SAHPI_EC_REDUNDANCY - SAHPI_ES_REDUNDANCY_DEGRADED exclusion testcase */ { event_state = SAHPI_ES_REDUNDANCY_DEGRADED | SAHPI_ES_REDUNDANCY_LOST_SUFFICIENT_RESOURCES; if (oh_valid_eventstate(event_state, SAHPI_EC_REDUNDANCY, SAHPI_TRUE)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } /* oh_valid_eventstate: SAHPI_EC_REDUNDANCY - SAHPI_ES_REDUNDANCY_LOST exclusion testcase */ { event_state = SAHPI_ES_REDUNDANCY_LOST | SAHPI_ES_REDUNDANCY_DEGRADED_FROM_FULL; if (oh_valid_eventstate(event_state, SAHPI_EC_REDUNDANCY, SAHPI_TRUE)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } /* oh_valid_eventstate: SAHPI_EC_REDUNDANCY - SAHPI_ES_REDUNDANCY_DEGRADED_FROM_FULL exclusion testcase */ { event_state = SAHPI_ES_REDUNDANCY_DEGRADED | SAHPI_ES_REDUNDANCY_DEGRADED_FROM_FULL | SAHPI_ES_REDUNDANCY_DEGRADED_FROM_NON; if (oh_valid_eventstate(event_state, SAHPI_EC_REDUNDANCY, SAHPI_TRUE)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } /* oh_valid_eventstate: SAHPI_EC_REDUNDANCY - SAHPI_ES_REDUNDANCY_LOST_SUFFICIENT_RESOURCES exclusion testcase */ { event_state = SAHPI_ES_REDUNDANCY_LOST | SAHPI_ES_REDUNDANCY_LOST_SUFFICIENT_RESOURCES | SAHPI_ES_NON_REDUNDANT_SUFFICIENT_RESOURCES; if (oh_valid_eventstate(event_state, SAHPI_EC_REDUNDANCY, SAHPI_TRUE)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } /****************************** * oh_valid_add_event testcases ******************************/ { SaHpiEventT default_event, event; memset(&default_event, 0, sizeof(SaHpiEventT)); default_event.Source = SAHPI_UNSPECIFIED_RESOURCE_ID; default_event.EventType = SAHPI_ET_USER; default_event.Severity = SAHPI_CRITICAL; default_event.EventDataUnion.UserEvent.UserEventData.DataType = SAHPI_TL_TYPE_TEXT; default_event.EventDataUnion.UserEvent.UserEventData.Language = SAHPI_LANG_ENGLISH; default_event.EventDataUnion.UserEvent.UserEventData.DataLength = strlen("Test"); strncpy((char *)(default_event.EventDataUnion.UserEvent.UserEventData.Data), "Test", strlen("Test")); /* oh_valid_add_event: Normal testcase */ event = default_event; expected_err = SA_OK; err = oh_valid_addevent(&event); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* oh_valid_add_event: Bad Source testcase */ event = default_event; event.Source = 1; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_valid_addevent(&event); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* oh_valid_add_event: Bad Type testcase */ event = default_event; event.EventType = BAD_TYPE; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_valid_addevent(&event); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* oh_valid_add_event: Bad Text testcase */ event = default_event; event.EventDataUnion.UserEvent.UserEventData.DataType = SAHPI_TL_TYPE_TEXT; event.EventDataUnion.UserEvent.UserEventData.Language = BAD_TYPE; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_valid_addevent(&event); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } } return 0; } openhpi-3.6.1/utils/t/sahpi/sahpi_text_utils_test.c0000644000175100017510000001432712575647301021476 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Sean Dague */ #include #include #include #include #include #include #define fill_text_buffer(b, chartype, string) \ do { \ b.DataType = chartype; \ b.Language = SAHPI_LANG_ENGLISH; \ b.DataLength = sizeof(string) - 1; \ strncpy((char *)b.Data,string,sizeof(string) - 1); \ } while(0) #define TEXTT SAHPI_TL_TYPE_TEXT #define UNICODET SAHPI_TL_TYPE_UNICODE #define BCDPLUST SAHPI_TL_TYPE_BCDPLUS #define ASCII6T SAHPI_TL_TYPE_ASCII6 #define BINARYT SAHPI_TL_TYPE_BINARY #define failed(num) \ do { \ failcount++; \ CRIT("Failed Test %d", num); \ } while(0) int main(int argc, char **argv) { /* const char *expected_str; */ // SaErrorT expected_err, err; SaHpiTextBufferT buffer, buffer2; oh_big_textbuffer oh_buff, oh_buff2; int failcount = 0; setenv("OPENHPI_ERROR","YES",1); // Test1 - valid text string fill_text_buffer(buffer, TEXTT, "a brown fox! "); if(!oh_valid_textbuffer(&buffer)) { failed(1); } // Test2 - valid ascii6 fill_text_buffer(buffer, ASCII6T, "XYZ 0123!"); if(!oh_valid_textbuffer(&buffer)) { failed(2); } // Test3 - valid utf16 - this is Om 42, incase anyone cares fill_text_buffer(buffer, UNICODET, "à¼à¼¤à¼¢"); if(!oh_valid_textbuffer(&buffer)) { failed(3); } // Test 4 - valid BCDPLUS fill_text_buffer(buffer, BCDPLUST, "1234-98.56:11"); if(!oh_valid_textbuffer(&buffer)) { failed(4); } // Test 5 - invalid utf16 - fill_text_buffer(buffer, UNICODET, "à¼à¼¤à¼"); if(oh_valid_textbuffer(&buffer)) { failed(5); } // Test 6 - invalid BCDPLUS fill_text_buffer(buffer, BCDPLUST, "a quick brown fox"); if(oh_valid_textbuffer(&buffer)) { failed(6); } // Test7 - invalid ascii6 fill_text_buffer(buffer, ASCII6T, "abc"); if(oh_valid_textbuffer(&buffer)) { failed(7); } // Test 8 - invalid ascii6 (has a null) memset(buffer.Data, 0, sizeof(*buffer.Data)); fill_text_buffer(buffer, ASCII6T, "abc"); buffer.DataLength++; if(oh_valid_textbuffer(&buffer)) { failed(8); } // Test 9 - invalid bcdplus (has a null) memset(buffer.Data, 0, sizeof(*buffer.Data)); fill_text_buffer(buffer, BCDPLUST, "1234"); buffer.DataLength++; if(oh_valid_textbuffer(&buffer)) { failed(9); } // Test 10 - invalid type fill_text_buffer(buffer, BINARYT + 70, "1234"); if(oh_valid_textbuffer(&buffer)) { failed(10); } // Test 11 - invalid lang fill_text_buffer(buffer, TEXTT, "1234"); buffer.Language = SAHPI_LANG_ENGLISH + 250; if(oh_valid_textbuffer(&buffer)) { failed(11); } /* * TODO: add append tests for regular text buff */ memset(&buffer2, 0, sizeof(buffer2)); buffer2.DataType = SAHPI_TL_TYPE_TEXT; buffer2.Language = SAHPI_LANG_ENGLISH; oh_init_textbuffer(&buffer); if(memcmp(&buffer, &buffer2, sizeof(buffer)) != 0) { printf("Value %d\n",memcmp(&buffer, &buffer2, sizeof(buffer))); oh_print_text(&buffer2); oh_print_text(&buffer); failed(12); goto end; } /* we know init works now */ oh_append_textbuffer(&buffer, "Some Text"); if(strncmp((char *)&buffer.Data, "Some Text", buffer.DataLength) != 0) { failed(13); } if(buffer.DataLength != 9) { failed(14); } // oh_append_textbuffer(&buffer, ", Some More Text"); if(strncmp((char *)&buffer.Data, "Some Text, Some More Text", buffer.DataLength) != 0) { failed(15); } if(buffer.DataLength != 25) { failed(16); } /*********************** * * oh_big_textbuffer tests * **********************/ memset(&oh_buff2, 0, sizeof(oh_buff2)); oh_buff2.DataType = SAHPI_TL_TYPE_TEXT; oh_buff2.Language = SAHPI_LANG_ENGLISH; oh_init_bigtext(&oh_buff); if(memcmp(&oh_buff, &oh_buff2, sizeof(oh_buff)) != 0) { printf("Value %d\n",memcmp(&oh_buff, &oh_buff2, sizeof(oh_buff))); oh_print_bigtext(&oh_buff2); oh_print_bigtext(&oh_buff); failed(32); goto end; } /* we know init works now */ oh_append_bigtext(&oh_buff, "Some Text"); if(strncmp((char *)&oh_buff.Data, "Some Text", oh_buff.DataLength) != 0) { failed(33); } if(oh_buff.DataLength != 9) { failed(34); } // oh_append_bigtext(&oh_buff, ", Some More Text"); if(strncmp((char *)&oh_buff.Data, "Some Text, Some More Text", oh_buff.DataLength) != 0) { failed(35); } if(oh_buff.DataLength != 25) { failed(36); } end: if(failcount) { return -1; } return(0); } openhpi-3.6.1/utils/t/sahpi/Makefile.am0000644000175100017510000000606112575647301016733 0ustar mohanmohan# (C) Copyright IBM Corp 2004 # All rights reserved. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. MAINTAINERCLEANFILES = Makefile.in REMOTE_SOURCES = epath_utils.c \ sahpi_enum_utils.c \ sahpiatca_enum_utils.c \ sahpixtca_enum_utils.c \ sahpi_event_encode.c \ sahpi_event_utils.c \ sahpi_struct_utils.c \ sahpi_time_utils.c \ sahpi_wrappers.c \ uid_utils.c MOSTLYCLEANFILES = $(REMOTE_SOURCES) @TEST_CLEAN@ AM_CPPFLAGS = -DG_LOG_DOMAIN=\"t\" AM_CPPFLAGS += @OPENHPI_INCLUDES@ AM_CFLAGS = -std=c99 # the -std=c99 comment above is required to have unicode in the tests $(REMOTE_SOURCES): if test ! -f $@ -a ! -L $@; then \ if test -f $(top_srcdir)/utils/$@; then \ $(LN_S) $(top_srcdir)/utils/$@; \ else \ $(LN_S) $(top_builddir)/utils/$@; \ fi; \ fi # FIXME:: Remove epath_enum_utils_test and sahpi_event_encode_test files # when we can auto-generate file for SMP systems. # Create rule using SaHpi2code.pl using -tdir option TESTS = sahpi_enum_utils_test \ sahpiatca_enum_utils_test \ sahpi_event_encode_test \ sahpi_event_utils_test \ sahpi_time_utils_test \ sahpi_struct_idrinfo_test \ sahpi_struct_idrarea_test \ sahpi_struct_idrfield_test \ sahpi_struct_rptentry_test \ sahpi_struct_rdr_test \ sahpi_struct_utils_test \ sahpi_text_utils_test check_PROGRAMS = $(TESTS) sahpi_enum_utils_test_SOURCES = sahpi_enum_utils_test.c nodist_sahpi_enum_utils_test_SOURCES = $(REMOTE_SOURCES) sahpiatca_enum_utils_test_SOURCES = sahpiatca_enum_utils_test.c nodist_sahpiatca_enum_utils_test_SOURCES = $(REMOTE_SOURCES) sahpi_event_encode_test_SOURCES = sahpi_event_encode_test.c nodist_sahpi_event_encode_test_SOURCES = $(REMOTE_SOURCES) sahpi_event_utils_test_SOURCES = sahpi_event_utils_test.c nodist_sahpi_event_utils_test_SOURCES = $(REMOTE_SOURCES) sahpi_struct_utils_test_SOURCES = sahpi_struct_utils_test.c nodist_sahpi_struct_utils_test_SOURCES = $(REMOTE_SOURCES) sahpi_text_utils_test_SOURCES = sahpi_text_utils_test.c nodist_sahpi_text_utils_test_SOURCES = $(REMOTE_SOURCES) sahpi_time_utils_test_SOURCES = sahpi_time_utils_test.c nodist_sahpi_time_utils_test_SOURCES = $(REMOTE_SOURCES) sahpi_struct_idrinfo_test_SOURCES = sahpi_struct_idrinfo_test.c nodist_sahpi_struct_idrinfo_test_SOURCES = $(REMOTE_SOURCES) sahpi_struct_idrarea_test_SOURCES = sahpi_struct_idrarea_test.c nodist_sahpi_struct_idrarea_test_SOURCES = $(REMOTE_SOURCES) sahpi_struct_idrfield_test_SOURCES = sahpi_struct_idrfield_test.c nodist_sahpi_struct_idrfield_test_SOURCES = $(REMOTE_SOURCES) sahpi_struct_rptentry_test_SOURCES = sahpi_struct_rptentry_test.c nodist_sahpi_struct_rptentry_test_SOURCES = $(REMOTE_SOURCES) sahpi_struct_rdr_test_SOURCES = sahpi_struct_rdr_test.c nodist_sahpi_struct_rdr_test_SOURCES = $(REMOTE_SOURCES) openhpi-3.6.1/utils/t/sahpi/sahpi_time_utils_test.c0000644000175100017510000000664112575647301021450 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #include #include #include #include int main(int argc, char **argv) { /* const char *expected_str; */ SaErrorT expected_err, err; SaHpiTextBufferT buffer; /************************** * oh_decode_time testcases **************************/ { /* oh_decode_time: test initial time testcase */ /* FIXME:: Can't look for a specific expected string, since it depends on locale Need to set and reset locale dynamically from this testcase */ err = oh_decode_time(0, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } /* printf("Time=%s\n", buffer.Data); */ /* oh_decode_time: Null buffer testcase */ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_decode_time(0, 0); if (expected_err != err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d, Expected error=%d\n", err, expected_err); return -1; } } { SaHpiTimeT time; /* oh_gettimeofday normal time textcase */ err = oh_gettimeofday(&time); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } err = oh_decode_time(time, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } /* printf("TOD Time=%s\n", buffer.Data); */ /* oh_gettimeofday NULL time textcase */ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_gettimeofday(0); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d, Expected error=%d\n", err, expected_err); return -1; } } { SaHpiTimeT time = SAHPI_TIME_UNSPECIFIED; err = oh_decode_time(time, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strncmp((char *)buffer.Data, "SAHPI_TIME_UNSPECIFIED", (sizeof("SAHPI_TIME_UNSPECIFIED")-1)) != 0) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Not receiving expected string SAHPI_TIME_UNSPECIFIED\n"); return -1; } if (buffer.DataLength < strlen("SAHPI_TIME_UNSPECIFIED")) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" DataLength was not set to correct number"); return -1; } } { SaHpiTimeT time = SAHPI_TIME_MAX_RELATIVE - 1; err = oh_decode_time(time, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } } return(0); } openhpi-3.6.1/utils/t/sahpi/sahpi_struct_rdr_test.c0000644000175100017510000001776712575647301021500 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * pdphan */ #include #include #include #include #include int main(int argc, char **argv) { SaErrorT err; SaHpiBoolT testFail = SAHPI_FALSE; SaHpiRdrT thisRdr = { .RecordId = 88, .RdrType = SAHPI_NO_RECORD, .Entity = { .Entry[0] = { .EntityType = SAHPI_ENT_SUBBOARD_CARRIER_BLADE, .EntityLocation = 14 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 15 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 16 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 17 } }, .IsFru = SAHPI_TRUE, /* .RdrTypeUnion == init later for individual rdr type */ .IdString = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 32, /* Incorrectly set on purpose */ .Data = "This is a oh_fprint_rdr test!" } }; memset(&thisRdr.RdrTypeUnion, 0, sizeof(SaHpiRdrTypeUnionT)); FILE *fp; const char *name = "/tmp/idrareatmp"; const char *mode = "a"; fp = fopen(name, mode); if (fp == NULL) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } /* ------------------------------------------------ */ /* NULL Pointer tests */ /* ------------------------------------------------ */ err = oh_fprint_rdr(NULL , &thisRdr, 0); if (err != SA_ERR_HPI_INVALID_PARAMS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); testFail = SAHPI_TRUE; } err = oh_fprint_rdr(fp, NULL, 1); if (err != SA_ERR_HPI_INVALID_PARAMS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); testFail = SAHPI_TRUE; } err = oh_fprint_rdr(NULL , NULL, 2); if (err != SA_ERR_HPI_INVALID_PARAMS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); testFail = SAHPI_TRUE; } /* ------------------------------------------------ */ /* Normal write to file test */ /* ------------------------------------------------ */ err = oh_fprint_rdr(fp, &thisRdr, 3); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); testFail = SAHPI_TRUE; } /* ------------------------------------------------ */ /* Normal write to stdout test */ /* ------------------------------------------------ */ err = oh_print_rdr(&thisRdr, 3); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); testFail = SAHPI_TRUE; } /* ------------------------------------------------ */ /* Normal write SAHPI_CTRL_RDR stdout test */ /* ------------------------------------------------ */ thisRdr.RdrType = SAHPI_CTRL_RDR; SaHpiCtrlRecT thisctrlrec = { .Num = 102, .OutputType = SAHPI_CTRL_POWER_INTERLOCK, .Type = SAHPI_CTRL_TYPE_DIGITAL, .TypeUnion.Digital.Default = SAHPI_CTRL_STATE_ON, .DefaultMode = { .Mode= SAHPI_CTRL_MODE_AUTO, .ReadOnly = SAHPI_TRUE }, .WriteOnly = SAHPI_FALSE, .Oem = 0 }; memcpy(&thisRdr.RdrTypeUnion.CtrlRec, &thisctrlrec, sizeof(SaHpiCtrlRecT)); err = oh_print_rdr(&thisRdr, 3); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); testFail = SAHPI_TRUE; } /* ------------------------------------------------ */ /* Normal write SAHPI_SENSOR_RDR stdout test */ /* ------------------------------------------------ */ thisRdr.RdrType = SAHPI_SENSOR_RDR; SaHpiSensorRecT thissensorrec = { .Num = 1, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_MINOR, .EventCtrl = SAHPI_SEC_READ_ONLY, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_INT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_SECOND, .ModifierUse = SAHPI_SMUU_BASIC_TIMES_MODIFIER, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MIN | SAHPI_SRF_MAX | SAHPI_SRF_NOMINAL | SAHPI_SRF_NORMAL_MIN | SAHPI_SRF_NORMAL_MAX, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_INT64, .Value.SensorInt64 = 0 }, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_INT64, .Value.SensorInt64 = 100 }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_INT64, .Value.SensorInt64 = 50 }, .NormalMax = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_INT64, .Value.SensorInt64 = 75 }, .NormalMin = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_INT64, .Value.SensorInt64 = 25 } }, .AccuracyFactor = 0.05 }, .Oem = 0xFF, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MINOR | SAHPI_STM_LOW_MAJOR | SAHPI_STM_LOW_CRIT | SAHPI_STM_LOW_HYSTERESIS, .WriteThold = SAHPI_STM_UP_MINOR | SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT | SAHPI_STM_UP_HYSTERESIS, .Nonlinear = SAHPI_TRUE } }; memcpy(&thisRdr.RdrTypeUnion.SensorRec, &thissensorrec, sizeof(SaHpiSensorRecT)); err = oh_print_rdr(&thisRdr, 3); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); testFail = SAHPI_TRUE; } /* ------------------------------------------------ */ /* Normal write SAHPI_INVENTORY_RDR stdout test */ /* ------------------------------------------------ */ thisRdr.RdrType = SAHPI_INVENTORY_RDR; SaHpiInventoryRecT thisinvrec = { .IdrId = 22, .Persistent = SAHPI_FALSE, .Oem = 32 }; memcpy(&thisRdr.RdrTypeUnion.InventoryRec, &thisinvrec, sizeof(SaHpiInventoryRecT)); err = oh_print_rdr(&thisRdr, 3); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); testFail = SAHPI_TRUE; } /* ------------------------------------------------ */ /* Normal write SAHPI_WATCHDOG_RDR stdout test */ /* ------------------------------------------------ */ thisRdr.RdrType = SAHPI_WATCHDOG_RDR; SaHpiWatchdogRecT thiswdogrec = { .WatchdogNum = 42, .Oem = 52 }; memcpy(&thisRdr.RdrTypeUnion.WatchdogRec, &thiswdogrec, sizeof(SaHpiWatchdogRecT)); err = oh_print_rdr(&thisRdr, 3); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); testFail = SAHPI_TRUE; } /* ------------------------------------------------ */ /* Normal write SAHPI_ANNUNCIATOR_RDR stdout test */ /* ------------------------------------------------ */ thisRdr.RdrType = SAHPI_ANNUNCIATOR_RDR; SaHpiAnnunciatorRecT thisannrec = { .AnnunciatorNum = 62, .AnnunciatorType = SAHPI_ANNUNCIATOR_TYPE_LED, .ModeReadOnly = SAHPI_TRUE, .MaxConditions= 1, .Oem = 72 }; memcpy(&thisRdr.RdrTypeUnion.AnnunciatorRec, &thisannrec, sizeof(SaHpiAnnunciatorRecT)); err = oh_print_rdr(&thisRdr, 3); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); testFail = SAHPI_TRUE; } /* ------------------------------------------------ */ /* Write to invalid file handle test */ /* ------------------------------------------------ */ /* TBD */ fclose(fp); unlink(name); if (testFail) return(-1); else return(0); } openhpi-3.6.1/utils/t/sahpi/sahpi_event_encode_test.c0000644000175100017510000036074112575647301021734 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./SaHpi2code.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include #include int main(int argc, char **argv) { char *expected_str; SaErrorT err; SaHpiEventStateT event_state, expected_state; SaHpiEventCategoryT event_cat, expected_cat; SaHpiTextBufferT buffer; #define BAD_EVENT 0xFFFF /* SAHPI_EC_UNSPECIFIED - SAHPI_ES_UNSPECIFIED testcase */ { expected_cat = SAHPI_EC_UNSPECIFIED; expected_state = SAHPI_ES_UNSPECIFIED; expected_str = "UNSPECIFIED"; err = oh_decode_eventstate(SAHPI_ES_UNSPECIFIED, SAHPI_EC_UNSPECIFIED, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_UNSPECIFIED - Bad event testcase */ { if (oh_valid_eventstate(BAD_EVENT, SAHPI_EC_UNSPECIFIED, SAHPI_FALSE)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } /* SAHPI_EC_LIMIT - SAHPI_ES_LIMIT_NOT_EXCEEDED testcase */ { expected_cat = SAHPI_EC_LIMIT; expected_state = SAHPI_ES_LIMIT_NOT_EXCEEDED; expected_str = "LIMIT_NOT_EXCEEDED"; err = oh_decode_eventstate(SAHPI_ES_LIMIT_NOT_EXCEEDED, SAHPI_EC_LIMIT, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_LIMIT - SAHPI_ES_LIMIT_EXCEEDED testcase */ { expected_cat = SAHPI_EC_LIMIT; expected_state = SAHPI_ES_LIMIT_EXCEEDED; expected_str = "LIMIT_EXCEEDED"; err = oh_decode_eventstate(SAHPI_ES_LIMIT_EXCEEDED, SAHPI_EC_LIMIT, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_LIMIT - Bad event testcase */ { if (oh_valid_eventstate(BAD_EVENT, SAHPI_EC_LIMIT, SAHPI_FALSE)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } /* SAHPI_EC_SENSOR_SPECIFIC - SAHPI_ES_STATE_00 testcase */ { expected_cat = SAHPI_EC_SENSOR_SPECIFIC; expected_state = SAHPI_ES_STATE_00; expected_str = "STATE_00"; err = oh_decode_eventstate(SAHPI_ES_STATE_00, SAHPI_EC_SENSOR_SPECIFIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_SENSOR_SPECIFIC - SAHPI_ES_STATE_01 testcase */ { expected_cat = SAHPI_EC_SENSOR_SPECIFIC; expected_state = SAHPI_ES_STATE_01; expected_str = "STATE_01"; err = oh_decode_eventstate(SAHPI_ES_STATE_01, SAHPI_EC_SENSOR_SPECIFIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_SENSOR_SPECIFIC - SAHPI_ES_STATE_02 testcase */ { expected_cat = SAHPI_EC_SENSOR_SPECIFIC; expected_state = SAHPI_ES_STATE_02; expected_str = "STATE_02"; err = oh_decode_eventstate(SAHPI_ES_STATE_02, SAHPI_EC_SENSOR_SPECIFIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_SENSOR_SPECIFIC - SAHPI_ES_STATE_03 testcase */ { expected_cat = SAHPI_EC_SENSOR_SPECIFIC; expected_state = SAHPI_ES_STATE_03; expected_str = "STATE_03"; err = oh_decode_eventstate(SAHPI_ES_STATE_03, SAHPI_EC_SENSOR_SPECIFIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_SENSOR_SPECIFIC - SAHPI_ES_STATE_04 testcase */ { expected_cat = SAHPI_EC_SENSOR_SPECIFIC; expected_state = SAHPI_ES_STATE_04; expected_str = "STATE_04"; err = oh_decode_eventstate(SAHPI_ES_STATE_04, SAHPI_EC_SENSOR_SPECIFIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_SENSOR_SPECIFIC - SAHPI_ES_STATE_05 testcase */ { expected_cat = SAHPI_EC_SENSOR_SPECIFIC; expected_state = SAHPI_ES_STATE_05; expected_str = "STATE_05"; err = oh_decode_eventstate(SAHPI_ES_STATE_05, SAHPI_EC_SENSOR_SPECIFIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_SENSOR_SPECIFIC - SAHPI_ES_STATE_06 testcase */ { expected_cat = SAHPI_EC_SENSOR_SPECIFIC; expected_state = SAHPI_ES_STATE_06; expected_str = "STATE_06"; err = oh_decode_eventstate(SAHPI_ES_STATE_06, SAHPI_EC_SENSOR_SPECIFIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_SENSOR_SPECIFIC - SAHPI_ES_STATE_07 testcase */ { expected_cat = SAHPI_EC_SENSOR_SPECIFIC; expected_state = SAHPI_ES_STATE_07; expected_str = "STATE_07"; err = oh_decode_eventstate(SAHPI_ES_STATE_07, SAHPI_EC_SENSOR_SPECIFIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_SENSOR_SPECIFIC - SAHPI_ES_STATE_08 testcase */ { expected_cat = SAHPI_EC_SENSOR_SPECIFIC; expected_state = SAHPI_ES_STATE_08; expected_str = "STATE_08"; err = oh_decode_eventstate(SAHPI_ES_STATE_08, SAHPI_EC_SENSOR_SPECIFIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_SENSOR_SPECIFIC - SAHPI_ES_STATE_09 testcase */ { expected_cat = SAHPI_EC_SENSOR_SPECIFIC; expected_state = SAHPI_ES_STATE_09; expected_str = "STATE_09"; err = oh_decode_eventstate(SAHPI_ES_STATE_09, SAHPI_EC_SENSOR_SPECIFIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_SENSOR_SPECIFIC - SAHPI_ES_STATE_10 testcase */ { expected_cat = SAHPI_EC_SENSOR_SPECIFIC; expected_state = SAHPI_ES_STATE_10; expected_str = "STATE_10"; err = oh_decode_eventstate(SAHPI_ES_STATE_10, SAHPI_EC_SENSOR_SPECIFIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_SENSOR_SPECIFIC - SAHPI_ES_STATE_11 testcase */ { expected_cat = SAHPI_EC_SENSOR_SPECIFIC; expected_state = SAHPI_ES_STATE_11; expected_str = "STATE_11"; err = oh_decode_eventstate(SAHPI_ES_STATE_11, SAHPI_EC_SENSOR_SPECIFIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_SENSOR_SPECIFIC - SAHPI_ES_STATE_12 testcase */ { expected_cat = SAHPI_EC_SENSOR_SPECIFIC; expected_state = SAHPI_ES_STATE_12; expected_str = "STATE_12"; err = oh_decode_eventstate(SAHPI_ES_STATE_12, SAHPI_EC_SENSOR_SPECIFIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_SENSOR_SPECIFIC - SAHPI_ES_STATE_13 testcase */ { expected_cat = SAHPI_EC_SENSOR_SPECIFIC; expected_state = SAHPI_ES_STATE_13; expected_str = "STATE_13"; err = oh_decode_eventstate(SAHPI_ES_STATE_13, SAHPI_EC_SENSOR_SPECIFIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_SENSOR_SPECIFIC - SAHPI_ES_STATE_14 testcase */ { expected_cat = SAHPI_EC_SENSOR_SPECIFIC; expected_state = SAHPI_ES_STATE_14; expected_str = "STATE_14"; err = oh_decode_eventstate(SAHPI_ES_STATE_14, SAHPI_EC_SENSOR_SPECIFIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_SENSOR_SPECIFIC - Bad event testcase */ { if (oh_valid_eventstate(BAD_EVENT, SAHPI_EC_SENSOR_SPECIFIC, SAHPI_FALSE)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } /* SAHPI_EC_USAGE - SAHPI_ES_IDLE testcase */ { expected_cat = SAHPI_EC_USAGE; expected_state = SAHPI_ES_IDLE; expected_str = "IDLE"; err = oh_decode_eventstate(SAHPI_ES_IDLE, SAHPI_EC_USAGE, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_USAGE - SAHPI_ES_ACTIVE testcase */ { expected_cat = SAHPI_EC_USAGE; expected_state = SAHPI_ES_ACTIVE; expected_str = "ACTIVE"; err = oh_decode_eventstate(SAHPI_ES_ACTIVE, SAHPI_EC_USAGE, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_USAGE - SAHPI_ES_BUSY testcase */ { expected_cat = SAHPI_EC_USAGE; expected_state = SAHPI_ES_BUSY; expected_str = "BUSY"; err = oh_decode_eventstate(SAHPI_ES_BUSY, SAHPI_EC_USAGE, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_USAGE - Bad event testcase */ { if (oh_valid_eventstate(BAD_EVENT, SAHPI_EC_USAGE, SAHPI_FALSE)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } /* SAHPI_EC_PRED_FAIL - SAHPI_ES_PRED_FAILURE_DEASSERT testcase */ { expected_cat = SAHPI_EC_PRED_FAIL; expected_state = SAHPI_ES_PRED_FAILURE_DEASSERT; expected_str = "PRED_FAILURE_DEASSERT"; err = oh_decode_eventstate(SAHPI_ES_PRED_FAILURE_DEASSERT, SAHPI_EC_PRED_FAIL, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_PRED_FAIL - SAHPI_ES_PRED_FAILURE_ASSERT testcase */ { expected_cat = SAHPI_EC_PRED_FAIL; expected_state = SAHPI_ES_PRED_FAILURE_ASSERT; expected_str = "PRED_FAILURE_ASSERT"; err = oh_decode_eventstate(SAHPI_ES_PRED_FAILURE_ASSERT, SAHPI_EC_PRED_FAIL, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_PRED_FAIL - Bad event testcase */ { if (oh_valid_eventstate(BAD_EVENT, SAHPI_EC_PRED_FAIL, SAHPI_FALSE)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } /* SAHPI_EC_THRESHOLD - SAHPI_ES_LOWER_MINOR testcase */ { expected_cat = SAHPI_EC_THRESHOLD; expected_state = SAHPI_ES_LOWER_MINOR; expected_str = "LOWER_MINOR"; err = oh_decode_eventstate(SAHPI_ES_LOWER_MINOR, SAHPI_EC_THRESHOLD, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_THRESHOLD - SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR testcase */ { expected_cat = SAHPI_EC_THRESHOLD; expected_state = SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR; expected_str = "LOWER_MINOR | LOWER_MAJOR"; err = oh_decode_eventstate(SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR, SAHPI_EC_THRESHOLD, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_THRESHOLD - SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_CRIT testcase */ { expected_cat = SAHPI_EC_THRESHOLD; expected_state = SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_CRIT; expected_str = "LOWER_MINOR | LOWER_MAJOR | LOWER_CRIT"; err = oh_decode_eventstate(SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_CRIT, SAHPI_EC_THRESHOLD, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_THRESHOLD - SAHPI_ES_UPPER_MINOR testcase */ { expected_cat = SAHPI_EC_THRESHOLD; expected_state = SAHPI_ES_UPPER_MINOR; expected_str = "UPPER_MINOR"; err = oh_decode_eventstate(SAHPI_ES_UPPER_MINOR, SAHPI_EC_THRESHOLD, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_THRESHOLD - SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR testcase */ { expected_cat = SAHPI_EC_THRESHOLD; expected_state = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR; expected_str = "UPPER_MINOR | UPPER_MAJOR"; err = oh_decode_eventstate(SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR, SAHPI_EC_THRESHOLD, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_THRESHOLD - SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT testcase */ { expected_cat = SAHPI_EC_THRESHOLD; expected_state = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT; expected_str = "UPPER_MINOR | UPPER_MAJOR | UPPER_CRIT"; err = oh_decode_eventstate(SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, SAHPI_EC_THRESHOLD, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_THRESHOLD - Bad event testcase */ { if (oh_valid_eventstate(BAD_EVENT, SAHPI_EC_THRESHOLD, SAHPI_FALSE)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } /* SAHPI_EC_ENABLE - SAHPI_ES_DISABLED testcase */ { expected_cat = SAHPI_EC_ENABLE; expected_state = SAHPI_ES_DISABLED; expected_str = "DISABLED"; err = oh_decode_eventstate(SAHPI_ES_DISABLED, SAHPI_EC_ENABLE, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_ENABLE - SAHPI_ES_ENABLED testcase */ { expected_cat = SAHPI_EC_ENABLE; expected_state = SAHPI_ES_ENABLED; expected_str = "ENABLED"; err = oh_decode_eventstate(SAHPI_ES_ENABLED, SAHPI_EC_ENABLE, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_ENABLE - Bad event testcase */ { if (oh_valid_eventstate(BAD_EVENT, SAHPI_EC_ENABLE, SAHPI_FALSE)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } /* SAHPI_EC_PRESENCE - SAHPI_ES_ABSENT testcase */ { expected_cat = SAHPI_EC_PRESENCE; expected_state = SAHPI_ES_ABSENT; expected_str = "ABSENT"; err = oh_decode_eventstate(SAHPI_ES_ABSENT, SAHPI_EC_PRESENCE, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_PRESENCE - SAHPI_ES_PRESENT testcase */ { expected_cat = SAHPI_EC_PRESENCE; expected_state = SAHPI_ES_PRESENT; expected_str = "PRESENT"; err = oh_decode_eventstate(SAHPI_ES_PRESENT, SAHPI_EC_PRESENCE, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_PRESENCE - Bad event testcase */ { if (oh_valid_eventstate(BAD_EVENT, SAHPI_EC_PRESENCE, SAHPI_FALSE)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } /* SAHPI_EC_SEVERITY - SAHPI_ES_OK testcase */ { expected_cat = SAHPI_EC_SEVERITY; expected_state = SAHPI_ES_OK; expected_str = "OK"; err = oh_decode_eventstate(SAHPI_ES_OK, SAHPI_EC_SEVERITY, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_SEVERITY - SAHPI_ES_MINOR_FROM_OK testcase */ { expected_cat = SAHPI_EC_SEVERITY; expected_state = SAHPI_ES_MINOR_FROM_OK; expected_str = "MINOR_FROM_OK"; err = oh_decode_eventstate(SAHPI_ES_MINOR_FROM_OK, SAHPI_EC_SEVERITY, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_SEVERITY - SAHPI_ES_MAJOR_FROM_LESS testcase */ { expected_cat = SAHPI_EC_SEVERITY; expected_state = SAHPI_ES_MAJOR_FROM_LESS; expected_str = "MAJOR_FROM_LESS"; err = oh_decode_eventstate(SAHPI_ES_MAJOR_FROM_LESS, SAHPI_EC_SEVERITY, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_SEVERITY - SAHPI_ES_CRITICAL_FROM_LESS testcase */ { expected_cat = SAHPI_EC_SEVERITY; expected_state = SAHPI_ES_CRITICAL_FROM_LESS; expected_str = "CRITICAL_FROM_LESS"; err = oh_decode_eventstate(SAHPI_ES_CRITICAL_FROM_LESS, SAHPI_EC_SEVERITY, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_SEVERITY - SAHPI_ES_MINOR_FROM_MORE testcase */ { expected_cat = SAHPI_EC_SEVERITY; expected_state = SAHPI_ES_MINOR_FROM_MORE; expected_str = "MINOR_FROM_MORE"; err = oh_decode_eventstate(SAHPI_ES_MINOR_FROM_MORE, SAHPI_EC_SEVERITY, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_SEVERITY - SAHPI_ES_MAJOR_FROM_CRITICAL testcase */ { expected_cat = SAHPI_EC_SEVERITY; expected_state = SAHPI_ES_MAJOR_FROM_CRITICAL; expected_str = "MAJOR_FROM_CRITICAL"; err = oh_decode_eventstate(SAHPI_ES_MAJOR_FROM_CRITICAL, SAHPI_EC_SEVERITY, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_SEVERITY - SAHPI_ES_CRITICAL testcase */ { expected_cat = SAHPI_EC_SEVERITY; expected_state = SAHPI_ES_CRITICAL; expected_str = "CRITICAL"; err = oh_decode_eventstate(SAHPI_ES_CRITICAL, SAHPI_EC_SEVERITY, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_SEVERITY - SAHPI_ES_MONITOR testcase */ { expected_cat = SAHPI_EC_SEVERITY; expected_state = SAHPI_ES_MONITOR; expected_str = "MONITOR"; err = oh_decode_eventstate(SAHPI_ES_MONITOR, SAHPI_EC_SEVERITY, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_SEVERITY - SAHPI_ES_INFORMATIONAL testcase */ { expected_cat = SAHPI_EC_SEVERITY; expected_state = SAHPI_ES_INFORMATIONAL; expected_str = "INFORMATIONAL"; err = oh_decode_eventstate(SAHPI_ES_INFORMATIONAL, SAHPI_EC_SEVERITY, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_SEVERITY - Bad event testcase */ { if (oh_valid_eventstate(BAD_EVENT, SAHPI_EC_SEVERITY, SAHPI_FALSE)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } /* SAHPI_EC_PERFORMANCE - SAHPI_ES_PERFORMANCE_MET testcase */ { expected_cat = SAHPI_EC_PERFORMANCE; expected_state = SAHPI_ES_PERFORMANCE_MET; expected_str = "PERFORMANCE_MET"; err = oh_decode_eventstate(SAHPI_ES_PERFORMANCE_MET, SAHPI_EC_PERFORMANCE, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_PERFORMANCE - SAHPI_ES_PERFORMANCE_LAGS testcase */ { expected_cat = SAHPI_EC_PERFORMANCE; expected_state = SAHPI_ES_PERFORMANCE_LAGS; expected_str = "PERFORMANCE_LAGS"; err = oh_decode_eventstate(SAHPI_ES_PERFORMANCE_LAGS, SAHPI_EC_PERFORMANCE, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_PERFORMANCE - Bad event testcase */ { if (oh_valid_eventstate(BAD_EVENT, SAHPI_EC_PERFORMANCE, SAHPI_FALSE)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } /* SAHPI_EC_STATE - SAHPI_ES_STATE_DEASSERTED testcase */ { expected_cat = SAHPI_EC_STATE; expected_state = SAHPI_ES_STATE_DEASSERTED; expected_str = "STATE_DEASSERTED"; err = oh_decode_eventstate(SAHPI_ES_STATE_DEASSERTED, SAHPI_EC_STATE, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_STATE - SAHPI_ES_STATE_ASSERTED testcase */ { expected_cat = SAHPI_EC_STATE; expected_state = SAHPI_ES_STATE_ASSERTED; expected_str = "STATE_ASSERTED"; err = oh_decode_eventstate(SAHPI_ES_STATE_ASSERTED, SAHPI_EC_STATE, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_STATE - Bad event testcase */ { if (oh_valid_eventstate(BAD_EVENT, SAHPI_EC_STATE, SAHPI_FALSE)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } /* SAHPI_EC_AVAILABILITY - SAHPI_ES_RUNNING testcase */ { expected_cat = SAHPI_EC_AVAILABILITY; expected_state = SAHPI_ES_RUNNING; expected_str = "RUNNING"; err = oh_decode_eventstate(SAHPI_ES_RUNNING, SAHPI_EC_AVAILABILITY, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_AVAILABILITY - SAHPI_ES_TEST testcase */ { expected_cat = SAHPI_EC_AVAILABILITY; expected_state = SAHPI_ES_TEST; expected_str = "TEST"; err = oh_decode_eventstate(SAHPI_ES_TEST, SAHPI_EC_AVAILABILITY, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_AVAILABILITY - SAHPI_ES_POWER_OFF testcase */ { expected_cat = SAHPI_EC_AVAILABILITY; expected_state = SAHPI_ES_POWER_OFF; expected_str = "POWER_OFF"; err = oh_decode_eventstate(SAHPI_ES_POWER_OFF, SAHPI_EC_AVAILABILITY, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_AVAILABILITY - SAHPI_ES_ON_LINE testcase */ { expected_cat = SAHPI_EC_AVAILABILITY; expected_state = SAHPI_ES_ON_LINE; expected_str = "ON_LINE"; err = oh_decode_eventstate(SAHPI_ES_ON_LINE, SAHPI_EC_AVAILABILITY, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_AVAILABILITY - SAHPI_ES_OFF_LINE testcase */ { expected_cat = SAHPI_EC_AVAILABILITY; expected_state = SAHPI_ES_OFF_LINE; expected_str = "OFF_LINE"; err = oh_decode_eventstate(SAHPI_ES_OFF_LINE, SAHPI_EC_AVAILABILITY, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_AVAILABILITY - SAHPI_ES_OFF_DUTY testcase */ { expected_cat = SAHPI_EC_AVAILABILITY; expected_state = SAHPI_ES_OFF_DUTY; expected_str = "OFF_DUTY"; err = oh_decode_eventstate(SAHPI_ES_OFF_DUTY, SAHPI_EC_AVAILABILITY, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_AVAILABILITY - SAHPI_ES_DEGRADED testcase */ { expected_cat = SAHPI_EC_AVAILABILITY; expected_state = SAHPI_ES_DEGRADED; expected_str = "DEGRADED"; err = oh_decode_eventstate(SAHPI_ES_DEGRADED, SAHPI_EC_AVAILABILITY, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_AVAILABILITY - SAHPI_ES_POWER_SAVE testcase */ { expected_cat = SAHPI_EC_AVAILABILITY; expected_state = SAHPI_ES_POWER_SAVE; expected_str = "POWER_SAVE"; err = oh_decode_eventstate(SAHPI_ES_POWER_SAVE, SAHPI_EC_AVAILABILITY, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_AVAILABILITY - SAHPI_ES_INSTALL_ERROR testcase */ { expected_cat = SAHPI_EC_AVAILABILITY; expected_state = SAHPI_ES_INSTALL_ERROR; expected_str = "INSTALL_ERROR"; err = oh_decode_eventstate(SAHPI_ES_INSTALL_ERROR, SAHPI_EC_AVAILABILITY, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_AVAILABILITY - Bad event testcase */ { if (oh_valid_eventstate(BAD_EVENT, SAHPI_EC_AVAILABILITY, SAHPI_FALSE)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } /* SAHPI_EC_REDUNDANCY - SAHPI_ES_FULLY_REDUNDANT testcase */ { expected_cat = SAHPI_EC_REDUNDANCY; expected_state = SAHPI_ES_FULLY_REDUNDANT; expected_str = "FULLY_REDUNDANT"; err = oh_decode_eventstate(SAHPI_ES_FULLY_REDUNDANT, SAHPI_EC_REDUNDANCY, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_REDUNDANCY - SAHPI_ES_REDUNDANCY_LOST testcase */ { expected_cat = SAHPI_EC_REDUNDANCY; expected_state = SAHPI_ES_REDUNDANCY_LOST; expected_str = "REDUNDANCY_LOST"; err = oh_decode_eventstate(SAHPI_ES_REDUNDANCY_LOST, SAHPI_EC_REDUNDANCY, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_REDUNDANCY - SAHPI_ES_REDUNDANCY_DEGRADED testcase */ { expected_cat = SAHPI_EC_REDUNDANCY; expected_state = SAHPI_ES_REDUNDANCY_DEGRADED; expected_str = "REDUNDANCY_DEGRADED"; err = oh_decode_eventstate(SAHPI_ES_REDUNDANCY_DEGRADED, SAHPI_EC_REDUNDANCY, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_REDUNDANCY - SAHPI_ES_REDUNDANCY_LOST_SUFFICIENT_RESOURCES testcase */ { expected_cat = SAHPI_EC_REDUNDANCY; expected_state = SAHPI_ES_REDUNDANCY_LOST_SUFFICIENT_RESOURCES; expected_str = "REDUNDANCY_LOST_SUFFICIENT_RESOURCES"; err = oh_decode_eventstate(SAHPI_ES_REDUNDANCY_LOST_SUFFICIENT_RESOURCES, SAHPI_EC_REDUNDANCY, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_REDUNDANCY - SAHPI_ES_NON_REDUNDANT_SUFFICIENT_RESOURCES testcase */ { expected_cat = SAHPI_EC_REDUNDANCY; expected_state = SAHPI_ES_NON_REDUNDANT_SUFFICIENT_RESOURCES; expected_str = "NON_REDUNDANT_SUFFICIENT_RESOURCES"; err = oh_decode_eventstate(SAHPI_ES_NON_REDUNDANT_SUFFICIENT_RESOURCES, SAHPI_EC_REDUNDANCY, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_REDUNDANCY - SAHPI_ES_NON_REDUNDANT_INSUFFICIENT_RESOURCES testcase */ { expected_cat = SAHPI_EC_REDUNDANCY; expected_state = SAHPI_ES_NON_REDUNDANT_INSUFFICIENT_RESOURCES; expected_str = "NON_REDUNDANT_INSUFFICIENT_RESOURCES"; err = oh_decode_eventstate(SAHPI_ES_NON_REDUNDANT_INSUFFICIENT_RESOURCES, SAHPI_EC_REDUNDANCY, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_REDUNDANCY - SAHPI_ES_REDUNDANCY_DEGRADED_FROM_FULL testcase */ { expected_cat = SAHPI_EC_REDUNDANCY; expected_state = SAHPI_ES_REDUNDANCY_DEGRADED_FROM_FULL; expected_str = "REDUNDANCY_DEGRADED_FROM_FULL"; err = oh_decode_eventstate(SAHPI_ES_REDUNDANCY_DEGRADED_FROM_FULL, SAHPI_EC_REDUNDANCY, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_REDUNDANCY - SAHPI_ES_REDUNDANCY_DEGRADED_FROM_NON testcase */ { expected_cat = SAHPI_EC_REDUNDANCY; expected_state = SAHPI_ES_REDUNDANCY_DEGRADED_FROM_NON; expected_str = "REDUNDANCY_DEGRADED_FROM_NON"; err = oh_decode_eventstate(SAHPI_ES_REDUNDANCY_DEGRADED_FROM_NON, SAHPI_EC_REDUNDANCY, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_REDUNDANCY - Bad event testcase */ { if (oh_valid_eventstate(BAD_EVENT, SAHPI_EC_REDUNDANCY, SAHPI_FALSE)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } /* SAHPI_EC_GENERIC - SAHPI_ES_STATE_00 testcase */ { expected_cat = SAHPI_EC_GENERIC; expected_state = SAHPI_ES_STATE_00; expected_str = "STATE_00"; err = oh_decode_eventstate(SAHPI_ES_STATE_00, SAHPI_EC_GENERIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_GENERIC - SAHPI_ES_STATE_01 testcase */ { expected_cat = SAHPI_EC_GENERIC; expected_state = SAHPI_ES_STATE_01; expected_str = "STATE_01"; err = oh_decode_eventstate(SAHPI_ES_STATE_01, SAHPI_EC_GENERIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_GENERIC - SAHPI_ES_STATE_02 testcase */ { expected_cat = SAHPI_EC_GENERIC; expected_state = SAHPI_ES_STATE_02; expected_str = "STATE_02"; err = oh_decode_eventstate(SAHPI_ES_STATE_02, SAHPI_EC_GENERIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_GENERIC - SAHPI_ES_STATE_03 testcase */ { expected_cat = SAHPI_EC_GENERIC; expected_state = SAHPI_ES_STATE_03; expected_str = "STATE_03"; err = oh_decode_eventstate(SAHPI_ES_STATE_03, SAHPI_EC_GENERIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_GENERIC - SAHPI_ES_STATE_04 testcase */ { expected_cat = SAHPI_EC_GENERIC; expected_state = SAHPI_ES_STATE_04; expected_str = "STATE_04"; err = oh_decode_eventstate(SAHPI_ES_STATE_04, SAHPI_EC_GENERIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_GENERIC - SAHPI_ES_STATE_05 testcase */ { expected_cat = SAHPI_EC_GENERIC; expected_state = SAHPI_ES_STATE_05; expected_str = "STATE_05"; err = oh_decode_eventstate(SAHPI_ES_STATE_05, SAHPI_EC_GENERIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_GENERIC - SAHPI_ES_STATE_06 testcase */ { expected_cat = SAHPI_EC_GENERIC; expected_state = SAHPI_ES_STATE_06; expected_str = "STATE_06"; err = oh_decode_eventstate(SAHPI_ES_STATE_06, SAHPI_EC_GENERIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_GENERIC - SAHPI_ES_STATE_07 testcase */ { expected_cat = SAHPI_EC_GENERIC; expected_state = SAHPI_ES_STATE_07; expected_str = "STATE_07"; err = oh_decode_eventstate(SAHPI_ES_STATE_07, SAHPI_EC_GENERIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_GENERIC - SAHPI_ES_STATE_08 testcase */ { expected_cat = SAHPI_EC_GENERIC; expected_state = SAHPI_ES_STATE_08; expected_str = "STATE_08"; err = oh_decode_eventstate(SAHPI_ES_STATE_08, SAHPI_EC_GENERIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_GENERIC - SAHPI_ES_STATE_09 testcase */ { expected_cat = SAHPI_EC_GENERIC; expected_state = SAHPI_ES_STATE_09; expected_str = "STATE_09"; err = oh_decode_eventstate(SAHPI_ES_STATE_09, SAHPI_EC_GENERIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_GENERIC - SAHPI_ES_STATE_10 testcase */ { expected_cat = SAHPI_EC_GENERIC; expected_state = SAHPI_ES_STATE_10; expected_str = "STATE_10"; err = oh_decode_eventstate(SAHPI_ES_STATE_10, SAHPI_EC_GENERIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_GENERIC - SAHPI_ES_STATE_11 testcase */ { expected_cat = SAHPI_EC_GENERIC; expected_state = SAHPI_ES_STATE_11; expected_str = "STATE_11"; err = oh_decode_eventstate(SAHPI_ES_STATE_11, SAHPI_EC_GENERIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_GENERIC - SAHPI_ES_STATE_12 testcase */ { expected_cat = SAHPI_EC_GENERIC; expected_state = SAHPI_ES_STATE_12; expected_str = "STATE_12"; err = oh_decode_eventstate(SAHPI_ES_STATE_12, SAHPI_EC_GENERIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_GENERIC - SAHPI_ES_STATE_13 testcase */ { expected_cat = SAHPI_EC_GENERIC; expected_state = SAHPI_ES_STATE_13; expected_str = "STATE_13"; err = oh_decode_eventstate(SAHPI_ES_STATE_13, SAHPI_EC_GENERIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_GENERIC - SAHPI_ES_STATE_14 testcase */ { expected_cat = SAHPI_EC_GENERIC; expected_state = SAHPI_ES_STATE_14; expected_str = "STATE_14"; err = oh_decode_eventstate(SAHPI_ES_STATE_14, SAHPI_EC_GENERIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_GENERIC - Bad event testcase */ { if (oh_valid_eventstate(BAD_EVENT, SAHPI_EC_GENERIC, SAHPI_FALSE)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } return 0; } openhpi-3.6.1/utils/t/sahpi/sahpi_struct_idrfield_test.c0000644000175100017510000000625312575647301022457 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * pdphan */ #include #include #include #include #include int main(int argc, char **argv) { SaErrorT err; SaHpiIdrFieldT thisIdrField; SaHpiBoolT test1Fail = SAHPI_FALSE, test2Fail = SAHPI_FALSE, test3Fail = SAHPI_FALSE, test4Fail = SAHPI_FALSE, test5Fail = SAHPI_FALSE; FILE *fp; const char *name = "/tmp/idrfieldtmp"; const char *mode = "a"; fp = fopen(name, mode); if (fp == NULL) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } /* ------------------------------------------------ */ /* NULL Pointer tests */ /* ------------------------------------------------ */ err = oh_fprint_idrfield(NULL, &thisIdrField, 3); if (err != SA_ERR_HPI_INVALID_PARAMS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); test1Fail = SAHPI_TRUE; } err = oh_fprint_idrfield(fp, NULL, 3); if (err != SA_ERR_HPI_INVALID_PARAMS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); test2Fail = SAHPI_TRUE; } err = oh_fprint_idrfield(NULL , NULL, 3); if (err != SA_ERR_HPI_INVALID_PARAMS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); test3Fail = SAHPI_TRUE; } /* ------------------------------------------------ */ /* Normal write to file test */ /* ------------------------------------------------ */ thisIdrField.AreaId = 1; thisIdrField.FieldId = 1; thisIdrField.Type = 22; thisIdrField.ReadOnly = SAHPI_FALSE; thisIdrField.Field.DataType = SAHPI_TL_TYPE_TEXT; thisIdrField.Field.Language = SAHPI_LANG_IRISH; thisIdrField.Field.DataLength = sizeof("This is a test!"); snprintf((char *)thisIdrField.Field.Data, thisIdrField.Field.DataLength, "This is a test!"); err = oh_fprint_idrfield(fp, &thisIdrField, 3); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); test4Fail = SAHPI_TRUE; } /* ------------------------------------------------ */ /* Normal write to stdout test */ /* ------------------------------------------------ */ err = oh_print_idrfield(&thisIdrField, 3); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); test5Fail = SAHPI_TRUE; } /* ------------------------------------------------ */ /* Write to invalid file handle test */ /* ------------------------------------------------ */ /* TBD */ fclose(fp); unlink(name); if (!test1Fail && !test2Fail && !test3Fail && !test4Fail && !test5Fail) return(0); else return(-1); } openhpi-3.6.1/utils/t/sahpi/sahpi_enum_utils_test.c0000644000175100017510000244060212575647301021457 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./SaHpi2code.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include #include #define BAD_ENUM_VALUE -1 int main(int argc, char **argv) { char *expected_str; char *str; /* SaHpiLanguageT - SAHPI_LANG_UNDEF testcase */ { SaHpiLanguageT value = SAHPI_LANG_UNDEF; SaHpiLanguageT enum_type; expected_str = "UNDEF"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_UNDEF != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_AFAR testcase */ { SaHpiLanguageT value = SAHPI_LANG_AFAR; SaHpiLanguageT enum_type; expected_str = "AFAR"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_AFAR != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_ABKHAZIAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_ABKHAZIAN; SaHpiLanguageT enum_type; expected_str = "ABKHAZIAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_ABKHAZIAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_AFRIKAANS testcase */ { SaHpiLanguageT value = SAHPI_LANG_AFRIKAANS; SaHpiLanguageT enum_type; expected_str = "AFRIKAANS"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_AFRIKAANS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_AMHARIC testcase */ { SaHpiLanguageT value = SAHPI_LANG_AMHARIC; SaHpiLanguageT enum_type; expected_str = "AMHARIC"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_AMHARIC != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_ARABIC testcase */ { SaHpiLanguageT value = SAHPI_LANG_ARABIC; SaHpiLanguageT enum_type; expected_str = "ARABIC"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_ARABIC != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_ASSAMESE testcase */ { SaHpiLanguageT value = SAHPI_LANG_ASSAMESE; SaHpiLanguageT enum_type; expected_str = "ASSAMESE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_ASSAMESE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_AYMARA testcase */ { SaHpiLanguageT value = SAHPI_LANG_AYMARA; SaHpiLanguageT enum_type; expected_str = "AYMARA"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_AYMARA != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_AZERBAIJANI testcase */ { SaHpiLanguageT value = SAHPI_LANG_AZERBAIJANI; SaHpiLanguageT enum_type; expected_str = "AZERBAIJANI"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_AZERBAIJANI != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_BASHKIR testcase */ { SaHpiLanguageT value = SAHPI_LANG_BASHKIR; SaHpiLanguageT enum_type; expected_str = "BASHKIR"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_BASHKIR != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_BYELORUSSIAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_BYELORUSSIAN; SaHpiLanguageT enum_type; expected_str = "BYELORUSSIAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_BYELORUSSIAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_BULGARIAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_BULGARIAN; SaHpiLanguageT enum_type; expected_str = "BULGARIAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_BULGARIAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_BIHARI testcase */ { SaHpiLanguageT value = SAHPI_LANG_BIHARI; SaHpiLanguageT enum_type; expected_str = "BIHARI"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_BIHARI != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_BISLAMA testcase */ { SaHpiLanguageT value = SAHPI_LANG_BISLAMA; SaHpiLanguageT enum_type; expected_str = "BISLAMA"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_BISLAMA != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_BENGALI testcase */ { SaHpiLanguageT value = SAHPI_LANG_BENGALI; SaHpiLanguageT enum_type; expected_str = "BENGALI"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_BENGALI != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_TIBETAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_TIBETAN; SaHpiLanguageT enum_type; expected_str = "TIBETAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_TIBETAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_BRETON testcase */ { SaHpiLanguageT value = SAHPI_LANG_BRETON; SaHpiLanguageT enum_type; expected_str = "BRETON"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_BRETON != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_CATALAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_CATALAN; SaHpiLanguageT enum_type; expected_str = "CATALAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_CATALAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_CORSICAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_CORSICAN; SaHpiLanguageT enum_type; expected_str = "CORSICAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_CORSICAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_CZECH testcase */ { SaHpiLanguageT value = SAHPI_LANG_CZECH; SaHpiLanguageT enum_type; expected_str = "CZECH"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_CZECH != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_WELSH testcase */ { SaHpiLanguageT value = SAHPI_LANG_WELSH; SaHpiLanguageT enum_type; expected_str = "WELSH"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_WELSH != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_DANISH testcase */ { SaHpiLanguageT value = SAHPI_LANG_DANISH; SaHpiLanguageT enum_type; expected_str = "DANISH"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_DANISH != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_GERMAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_GERMAN; SaHpiLanguageT enum_type; expected_str = "GERMAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_GERMAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_BHUTANI testcase */ { SaHpiLanguageT value = SAHPI_LANG_BHUTANI; SaHpiLanguageT enum_type; expected_str = "BHUTANI"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_BHUTANI != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_GREEK testcase */ { SaHpiLanguageT value = SAHPI_LANG_GREEK; SaHpiLanguageT enum_type; expected_str = "GREEK"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_GREEK != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_ENGLISH testcase */ { SaHpiLanguageT value = SAHPI_LANG_ENGLISH; SaHpiLanguageT enum_type; expected_str = "ENGLISH"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_ENGLISH != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_ESPERANTO testcase */ { SaHpiLanguageT value = SAHPI_LANG_ESPERANTO; SaHpiLanguageT enum_type; expected_str = "ESPERANTO"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_ESPERANTO != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_SPANISH testcase */ { SaHpiLanguageT value = SAHPI_LANG_SPANISH; SaHpiLanguageT enum_type; expected_str = "SPANISH"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_SPANISH != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_ESTONIAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_ESTONIAN; SaHpiLanguageT enum_type; expected_str = "ESTONIAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_ESTONIAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_BASQUE testcase */ { SaHpiLanguageT value = SAHPI_LANG_BASQUE; SaHpiLanguageT enum_type; expected_str = "BASQUE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_BASQUE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_PERSIAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_PERSIAN; SaHpiLanguageT enum_type; expected_str = "PERSIAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_PERSIAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_FINNISH testcase */ { SaHpiLanguageT value = SAHPI_LANG_FINNISH; SaHpiLanguageT enum_type; expected_str = "FINNISH"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_FINNISH != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_FIJI testcase */ { SaHpiLanguageT value = SAHPI_LANG_FIJI; SaHpiLanguageT enum_type; expected_str = "FIJI"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_FIJI != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_FAEROESE testcase */ { SaHpiLanguageT value = SAHPI_LANG_FAEROESE; SaHpiLanguageT enum_type; expected_str = "FAEROESE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_FAEROESE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_FRENCH testcase */ { SaHpiLanguageT value = SAHPI_LANG_FRENCH; SaHpiLanguageT enum_type; expected_str = "FRENCH"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_FRENCH != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_FRISIAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_FRISIAN; SaHpiLanguageT enum_type; expected_str = "FRISIAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_FRISIAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_IRISH testcase */ { SaHpiLanguageT value = SAHPI_LANG_IRISH; SaHpiLanguageT enum_type; expected_str = "IRISH"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_IRISH != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_SCOTSGAELIC testcase */ { SaHpiLanguageT value = SAHPI_LANG_SCOTSGAELIC; SaHpiLanguageT enum_type; expected_str = "SCOTSGAELIC"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_SCOTSGAELIC != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_GALICIAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_GALICIAN; SaHpiLanguageT enum_type; expected_str = "GALICIAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_GALICIAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_GUARANI testcase */ { SaHpiLanguageT value = SAHPI_LANG_GUARANI; SaHpiLanguageT enum_type; expected_str = "GUARANI"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_GUARANI != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_GUJARATI testcase */ { SaHpiLanguageT value = SAHPI_LANG_GUJARATI; SaHpiLanguageT enum_type; expected_str = "GUJARATI"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_GUJARATI != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_HAUSA testcase */ { SaHpiLanguageT value = SAHPI_LANG_HAUSA; SaHpiLanguageT enum_type; expected_str = "HAUSA"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_HAUSA != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_HINDI testcase */ { SaHpiLanguageT value = SAHPI_LANG_HINDI; SaHpiLanguageT enum_type; expected_str = "HINDI"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_HINDI != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_CROATIAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_CROATIAN; SaHpiLanguageT enum_type; expected_str = "CROATIAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_CROATIAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_HUNGARIAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_HUNGARIAN; SaHpiLanguageT enum_type; expected_str = "HUNGARIAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_HUNGARIAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_ARMENIAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_ARMENIAN; SaHpiLanguageT enum_type; expected_str = "ARMENIAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_ARMENIAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_INTERLINGUA testcase */ { SaHpiLanguageT value = SAHPI_LANG_INTERLINGUA; SaHpiLanguageT enum_type; expected_str = "INTERLINGUA"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_INTERLINGUA != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_INTERLINGUE testcase */ { SaHpiLanguageT value = SAHPI_LANG_INTERLINGUE; SaHpiLanguageT enum_type; expected_str = "INTERLINGUE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_INTERLINGUE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_INUPIAK testcase */ { SaHpiLanguageT value = SAHPI_LANG_INUPIAK; SaHpiLanguageT enum_type; expected_str = "INUPIAK"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_INUPIAK != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_INDONESIAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_INDONESIAN; SaHpiLanguageT enum_type; expected_str = "INDONESIAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_INDONESIAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_ICELANDIC testcase */ { SaHpiLanguageT value = SAHPI_LANG_ICELANDIC; SaHpiLanguageT enum_type; expected_str = "ICELANDIC"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_ICELANDIC != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_ITALIAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_ITALIAN; SaHpiLanguageT enum_type; expected_str = "ITALIAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_ITALIAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_HEBREW testcase */ { SaHpiLanguageT value = SAHPI_LANG_HEBREW; SaHpiLanguageT enum_type; expected_str = "HEBREW"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_HEBREW != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_JAPANESE testcase */ { SaHpiLanguageT value = SAHPI_LANG_JAPANESE; SaHpiLanguageT enum_type; expected_str = "JAPANESE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_JAPANESE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_YIDDISH testcase */ { SaHpiLanguageT value = SAHPI_LANG_YIDDISH; SaHpiLanguageT enum_type; expected_str = "YIDDISH"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_YIDDISH != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_JAVANESE testcase */ { SaHpiLanguageT value = SAHPI_LANG_JAVANESE; SaHpiLanguageT enum_type; expected_str = "JAVANESE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_JAVANESE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_GEORGIAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_GEORGIAN; SaHpiLanguageT enum_type; expected_str = "GEORGIAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_GEORGIAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_KAZAKH testcase */ { SaHpiLanguageT value = SAHPI_LANG_KAZAKH; SaHpiLanguageT enum_type; expected_str = "KAZAKH"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_KAZAKH != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_GREENLANDIC testcase */ { SaHpiLanguageT value = SAHPI_LANG_GREENLANDIC; SaHpiLanguageT enum_type; expected_str = "GREENLANDIC"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_GREENLANDIC != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_CAMBODIAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_CAMBODIAN; SaHpiLanguageT enum_type; expected_str = "CAMBODIAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_CAMBODIAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_KANNADA testcase */ { SaHpiLanguageT value = SAHPI_LANG_KANNADA; SaHpiLanguageT enum_type; expected_str = "KANNADA"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_KANNADA != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_KOREAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_KOREAN; SaHpiLanguageT enum_type; expected_str = "KOREAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_KOREAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_KASHMIRI testcase */ { SaHpiLanguageT value = SAHPI_LANG_KASHMIRI; SaHpiLanguageT enum_type; expected_str = "KASHMIRI"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_KASHMIRI != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_KURDISH testcase */ { SaHpiLanguageT value = SAHPI_LANG_KURDISH; SaHpiLanguageT enum_type; expected_str = "KURDISH"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_KURDISH != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_KIRGHIZ testcase */ { SaHpiLanguageT value = SAHPI_LANG_KIRGHIZ; SaHpiLanguageT enum_type; expected_str = "KIRGHIZ"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_KIRGHIZ != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_LATIN testcase */ { SaHpiLanguageT value = SAHPI_LANG_LATIN; SaHpiLanguageT enum_type; expected_str = "LATIN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_LATIN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_LINGALA testcase */ { SaHpiLanguageT value = SAHPI_LANG_LINGALA; SaHpiLanguageT enum_type; expected_str = "LINGALA"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_LINGALA != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_LAOTHIAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_LAOTHIAN; SaHpiLanguageT enum_type; expected_str = "LAOTHIAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_LAOTHIAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_LITHUANIAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_LITHUANIAN; SaHpiLanguageT enum_type; expected_str = "LITHUANIAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_LITHUANIAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_LATVIANLETTISH testcase */ { SaHpiLanguageT value = SAHPI_LANG_LATVIANLETTISH; SaHpiLanguageT enum_type; expected_str = "LATVIANLETTISH"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_LATVIANLETTISH != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_MALAGASY testcase */ { SaHpiLanguageT value = SAHPI_LANG_MALAGASY; SaHpiLanguageT enum_type; expected_str = "MALAGASY"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_MALAGASY != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_MAORI testcase */ { SaHpiLanguageT value = SAHPI_LANG_MAORI; SaHpiLanguageT enum_type; expected_str = "MAORI"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_MAORI != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_MACEDONIAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_MACEDONIAN; SaHpiLanguageT enum_type; expected_str = "MACEDONIAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_MACEDONIAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_MALAYALAM testcase */ { SaHpiLanguageT value = SAHPI_LANG_MALAYALAM; SaHpiLanguageT enum_type; expected_str = "MALAYALAM"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_MALAYALAM != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_MONGOLIAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_MONGOLIAN; SaHpiLanguageT enum_type; expected_str = "MONGOLIAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_MONGOLIAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_MOLDAVIAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_MOLDAVIAN; SaHpiLanguageT enum_type; expected_str = "MOLDAVIAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_MOLDAVIAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_MARATHI testcase */ { SaHpiLanguageT value = SAHPI_LANG_MARATHI; SaHpiLanguageT enum_type; expected_str = "MARATHI"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_MARATHI != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_MALAY testcase */ { SaHpiLanguageT value = SAHPI_LANG_MALAY; SaHpiLanguageT enum_type; expected_str = "MALAY"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_MALAY != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_MALTESE testcase */ { SaHpiLanguageT value = SAHPI_LANG_MALTESE; SaHpiLanguageT enum_type; expected_str = "MALTESE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_MALTESE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_BURMESE testcase */ { SaHpiLanguageT value = SAHPI_LANG_BURMESE; SaHpiLanguageT enum_type; expected_str = "BURMESE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_BURMESE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_NAURU testcase */ { SaHpiLanguageT value = SAHPI_LANG_NAURU; SaHpiLanguageT enum_type; expected_str = "NAURU"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_NAURU != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_NEPALI testcase */ { SaHpiLanguageT value = SAHPI_LANG_NEPALI; SaHpiLanguageT enum_type; expected_str = "NEPALI"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_NEPALI != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_DUTCH testcase */ { SaHpiLanguageT value = SAHPI_LANG_DUTCH; SaHpiLanguageT enum_type; expected_str = "DUTCH"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_DUTCH != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_NORWEGIAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_NORWEGIAN; SaHpiLanguageT enum_type; expected_str = "NORWEGIAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_NORWEGIAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_OCCITAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_OCCITAN; SaHpiLanguageT enum_type; expected_str = "OCCITAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_OCCITAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_AFANOROMO testcase */ { SaHpiLanguageT value = SAHPI_LANG_AFANOROMO; SaHpiLanguageT enum_type; expected_str = "AFANOROMO"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_AFANOROMO != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_ORIYA testcase */ { SaHpiLanguageT value = SAHPI_LANG_ORIYA; SaHpiLanguageT enum_type; expected_str = "ORIYA"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_ORIYA != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_PUNJABI testcase */ { SaHpiLanguageT value = SAHPI_LANG_PUNJABI; SaHpiLanguageT enum_type; expected_str = "PUNJABI"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_PUNJABI != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_POLISH testcase */ { SaHpiLanguageT value = SAHPI_LANG_POLISH; SaHpiLanguageT enum_type; expected_str = "POLISH"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_POLISH != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_PASHTOPUSHTO testcase */ { SaHpiLanguageT value = SAHPI_LANG_PASHTOPUSHTO; SaHpiLanguageT enum_type; expected_str = "PASHTOPUSHTO"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_PASHTOPUSHTO != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_PORTUGUESE testcase */ { SaHpiLanguageT value = SAHPI_LANG_PORTUGUESE; SaHpiLanguageT enum_type; expected_str = "PORTUGUESE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_PORTUGUESE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_QUECHUA testcase */ { SaHpiLanguageT value = SAHPI_LANG_QUECHUA; SaHpiLanguageT enum_type; expected_str = "QUECHUA"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_QUECHUA != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_RHAETOROMANCE testcase */ { SaHpiLanguageT value = SAHPI_LANG_RHAETOROMANCE; SaHpiLanguageT enum_type; expected_str = "RHAETOROMANCE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_RHAETOROMANCE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_KIRUNDI testcase */ { SaHpiLanguageT value = SAHPI_LANG_KIRUNDI; SaHpiLanguageT enum_type; expected_str = "KIRUNDI"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_KIRUNDI != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_ROMANIAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_ROMANIAN; SaHpiLanguageT enum_type; expected_str = "ROMANIAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_ROMANIAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_RUSSIAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_RUSSIAN; SaHpiLanguageT enum_type; expected_str = "RUSSIAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_RUSSIAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_KINYARWANDA testcase */ { SaHpiLanguageT value = SAHPI_LANG_KINYARWANDA; SaHpiLanguageT enum_type; expected_str = "KINYARWANDA"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_KINYARWANDA != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_SANSKRIT testcase */ { SaHpiLanguageT value = SAHPI_LANG_SANSKRIT; SaHpiLanguageT enum_type; expected_str = "SANSKRIT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_SANSKRIT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_SINDHI testcase */ { SaHpiLanguageT value = SAHPI_LANG_SINDHI; SaHpiLanguageT enum_type; expected_str = "SINDHI"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_SINDHI != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_SANGRO testcase */ { SaHpiLanguageT value = SAHPI_LANG_SANGRO; SaHpiLanguageT enum_type; expected_str = "SANGRO"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_SANGRO != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_SERBOCROATIAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_SERBOCROATIAN; SaHpiLanguageT enum_type; expected_str = "SERBOCROATIAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_SERBOCROATIAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_SINGHALESE testcase */ { SaHpiLanguageT value = SAHPI_LANG_SINGHALESE; SaHpiLanguageT enum_type; expected_str = "SINGHALESE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_SINGHALESE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_SLOVAK testcase */ { SaHpiLanguageT value = SAHPI_LANG_SLOVAK; SaHpiLanguageT enum_type; expected_str = "SLOVAK"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_SLOVAK != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_SLOVENIAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_SLOVENIAN; SaHpiLanguageT enum_type; expected_str = "SLOVENIAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_SLOVENIAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_SAMOAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_SAMOAN; SaHpiLanguageT enum_type; expected_str = "SAMOAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_SAMOAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_SHONA testcase */ { SaHpiLanguageT value = SAHPI_LANG_SHONA; SaHpiLanguageT enum_type; expected_str = "SHONA"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_SHONA != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_SOMALI testcase */ { SaHpiLanguageT value = SAHPI_LANG_SOMALI; SaHpiLanguageT enum_type; expected_str = "SOMALI"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_SOMALI != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_ALBANIAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_ALBANIAN; SaHpiLanguageT enum_type; expected_str = "ALBANIAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_ALBANIAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_SERBIAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_SERBIAN; SaHpiLanguageT enum_type; expected_str = "SERBIAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_SERBIAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_SISWATI testcase */ { SaHpiLanguageT value = SAHPI_LANG_SISWATI; SaHpiLanguageT enum_type; expected_str = "SISWATI"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_SISWATI != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_SESOTHO testcase */ { SaHpiLanguageT value = SAHPI_LANG_SESOTHO; SaHpiLanguageT enum_type; expected_str = "SESOTHO"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_SESOTHO != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_SUDANESE testcase */ { SaHpiLanguageT value = SAHPI_LANG_SUDANESE; SaHpiLanguageT enum_type; expected_str = "SUDANESE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_SUDANESE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_SWEDISH testcase */ { SaHpiLanguageT value = SAHPI_LANG_SWEDISH; SaHpiLanguageT enum_type; expected_str = "SWEDISH"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_SWEDISH != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_SWAHILI testcase */ { SaHpiLanguageT value = SAHPI_LANG_SWAHILI; SaHpiLanguageT enum_type; expected_str = "SWAHILI"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_SWAHILI != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_TAMIL testcase */ { SaHpiLanguageT value = SAHPI_LANG_TAMIL; SaHpiLanguageT enum_type; expected_str = "TAMIL"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_TAMIL != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_TELUGU testcase */ { SaHpiLanguageT value = SAHPI_LANG_TELUGU; SaHpiLanguageT enum_type; expected_str = "TELUGU"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_TELUGU != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_TAJIK testcase */ { SaHpiLanguageT value = SAHPI_LANG_TAJIK; SaHpiLanguageT enum_type; expected_str = "TAJIK"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_TAJIK != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_THAI testcase */ { SaHpiLanguageT value = SAHPI_LANG_THAI; SaHpiLanguageT enum_type; expected_str = "THAI"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_THAI != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_TIGRINYA testcase */ { SaHpiLanguageT value = SAHPI_LANG_TIGRINYA; SaHpiLanguageT enum_type; expected_str = "TIGRINYA"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_TIGRINYA != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_TURKMEN testcase */ { SaHpiLanguageT value = SAHPI_LANG_TURKMEN; SaHpiLanguageT enum_type; expected_str = "TURKMEN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_TURKMEN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_TAGALOG testcase */ { SaHpiLanguageT value = SAHPI_LANG_TAGALOG; SaHpiLanguageT enum_type; expected_str = "TAGALOG"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_TAGALOG != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_SETSWANA testcase */ { SaHpiLanguageT value = SAHPI_LANG_SETSWANA; SaHpiLanguageT enum_type; expected_str = "SETSWANA"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_SETSWANA != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_TONGA testcase */ { SaHpiLanguageT value = SAHPI_LANG_TONGA; SaHpiLanguageT enum_type; expected_str = "TONGA"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_TONGA != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_TURKISH testcase */ { SaHpiLanguageT value = SAHPI_LANG_TURKISH; SaHpiLanguageT enum_type; expected_str = "TURKISH"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_TURKISH != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_TSONGA testcase */ { SaHpiLanguageT value = SAHPI_LANG_TSONGA; SaHpiLanguageT enum_type; expected_str = "TSONGA"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_TSONGA != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_TATAR testcase */ { SaHpiLanguageT value = SAHPI_LANG_TATAR; SaHpiLanguageT enum_type; expected_str = "TATAR"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_TATAR != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_TWI testcase */ { SaHpiLanguageT value = SAHPI_LANG_TWI; SaHpiLanguageT enum_type; expected_str = "TWI"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_TWI != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_UKRAINIAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_UKRAINIAN; SaHpiLanguageT enum_type; expected_str = "UKRAINIAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_UKRAINIAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_URDU testcase */ { SaHpiLanguageT value = SAHPI_LANG_URDU; SaHpiLanguageT enum_type; expected_str = "URDU"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_URDU != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_UZBEK testcase */ { SaHpiLanguageT value = SAHPI_LANG_UZBEK; SaHpiLanguageT enum_type; expected_str = "UZBEK"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_UZBEK != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_VIETNAMESE testcase */ { SaHpiLanguageT value = SAHPI_LANG_VIETNAMESE; SaHpiLanguageT enum_type; expected_str = "VIETNAMESE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_VIETNAMESE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_VOLAPUK testcase */ { SaHpiLanguageT value = SAHPI_LANG_VOLAPUK; SaHpiLanguageT enum_type; expected_str = "VOLAPUK"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_VOLAPUK != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_WOLOF testcase */ { SaHpiLanguageT value = SAHPI_LANG_WOLOF; SaHpiLanguageT enum_type; expected_str = "WOLOF"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_WOLOF != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_XHOSA testcase */ { SaHpiLanguageT value = SAHPI_LANG_XHOSA; SaHpiLanguageT enum_type; expected_str = "XHOSA"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_XHOSA != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_YORUBA testcase */ { SaHpiLanguageT value = SAHPI_LANG_YORUBA; SaHpiLanguageT enum_type; expected_str = "YORUBA"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_YORUBA != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_CHINESE testcase */ { SaHpiLanguageT value = SAHPI_LANG_CHINESE; SaHpiLanguageT enum_type; expected_str = "CHINESE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_CHINESE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_ZULU testcase */ { SaHpiLanguageT value = SAHPI_LANG_ZULU; SaHpiLanguageT enum_type; expected_str = "ZULU"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_ZULU != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - Default testcase */ { SaHpiLanguageT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_language(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiLanguageT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiLanguageT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_language(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiLanguageT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_language(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiTextTypeT - SAHPI_TL_TYPE_UNICODE testcase */ { SaHpiTextTypeT value = SAHPI_TL_TYPE_UNICODE; SaHpiTextTypeT enum_type; expected_str = "UNICODE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_texttype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_texttype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_TL_TYPE_UNICODE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiTextTypeT - SAHPI_TL_TYPE_BCDPLUS testcase */ { SaHpiTextTypeT value = SAHPI_TL_TYPE_BCDPLUS; SaHpiTextTypeT enum_type; expected_str = "BCDPLUS"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_texttype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_texttype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_TL_TYPE_BCDPLUS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiTextTypeT - SAHPI_TL_TYPE_ASCII6 testcase */ { SaHpiTextTypeT value = SAHPI_TL_TYPE_ASCII6; SaHpiTextTypeT enum_type; expected_str = "ASCII6"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_texttype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_texttype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_TL_TYPE_ASCII6 != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiTextTypeT - SAHPI_TL_TYPE_TEXT testcase */ { SaHpiTextTypeT value = SAHPI_TL_TYPE_TEXT; SaHpiTextTypeT enum_type; expected_str = "TEXT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_texttype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_texttype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_TL_TYPE_TEXT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiTextTypeT - SAHPI_TL_TYPE_BINARY testcase */ { SaHpiTextTypeT value = SAHPI_TL_TYPE_BINARY; SaHpiTextTypeT enum_type; expected_str = "BINARY"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_texttype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_texttype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_TL_TYPE_BINARY != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiTextTypeT - Default testcase */ { SaHpiTextTypeT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_texttype(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiTextTypeT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiTextTypeT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_texttype(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiTextTypeT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_texttype(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_UNSPECIFIED testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_UNSPECIFIED; SaHpiEntityTypeT enum_type; expected_str = "UNSPECIFIED"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_UNSPECIFIED != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_OTHER testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_OTHER; SaHpiEntityTypeT enum_type; expected_str = "OTHER"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_OTHER != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_UNKNOWN testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_UNKNOWN; SaHpiEntityTypeT enum_type; expected_str = "UNKNOWN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_UNKNOWN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_PROCESSOR testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_PROCESSOR; SaHpiEntityTypeT enum_type; expected_str = "PROCESSOR"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_PROCESSOR != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_DISK_BAY testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_DISK_BAY; SaHpiEntityTypeT enum_type; expected_str = "DISK_BAY"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_DISK_BAY != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_PERIPHERAL_BAY testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_PERIPHERAL_BAY; SaHpiEntityTypeT enum_type; expected_str = "PERIPHERAL_BAY"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_PERIPHERAL_BAY != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_SYS_MGMNT_MODULE testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_SYS_MGMNT_MODULE; SaHpiEntityTypeT enum_type; expected_str = "SYS_MGMNT_MODULE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_SYS_MGMNT_MODULE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_SYSTEM_BOARD testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_SYSTEM_BOARD; SaHpiEntityTypeT enum_type; expected_str = "SYSTEM_BOARD"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_SYSTEM_BOARD != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_MEMORY_MODULE testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_MEMORY_MODULE; SaHpiEntityTypeT enum_type; expected_str = "MEMORY_MODULE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_MEMORY_MODULE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_PROCESSOR_MODULE testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_PROCESSOR_MODULE; SaHpiEntityTypeT enum_type; expected_str = "PROCESSOR_MODULE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_PROCESSOR_MODULE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_POWER_SUPPLY testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_POWER_SUPPLY; SaHpiEntityTypeT enum_type; expected_str = "POWER_SUPPLY"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_POWER_SUPPLY != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_ADD_IN_CARD testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_ADD_IN_CARD; SaHpiEntityTypeT enum_type; expected_str = "ADD_IN_CARD"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_ADD_IN_CARD != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_FRONT_PANEL_BOARD testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_FRONT_PANEL_BOARD; SaHpiEntityTypeT enum_type; expected_str = "FRONT_PANEL_BOARD"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_FRONT_PANEL_BOARD != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_BACK_PANEL_BOARD testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_BACK_PANEL_BOARD; SaHpiEntityTypeT enum_type; expected_str = "BACK_PANEL_BOARD"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_BACK_PANEL_BOARD != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_POWER_SYSTEM_BOARD testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_POWER_SYSTEM_BOARD; SaHpiEntityTypeT enum_type; expected_str = "POWER_SYSTEM_BOARD"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_POWER_SYSTEM_BOARD != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_DRIVE_BACKPLANE testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_DRIVE_BACKPLANE; SaHpiEntityTypeT enum_type; expected_str = "DRIVE_BACKPLANE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_DRIVE_BACKPLANE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_SYS_EXPANSION_BOARD testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_SYS_EXPANSION_BOARD; SaHpiEntityTypeT enum_type; expected_str = "SYS_EXPANSION_BOARD"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_SYS_EXPANSION_BOARD != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_OTHER_SYSTEM_BOARD testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_OTHER_SYSTEM_BOARD; SaHpiEntityTypeT enum_type; expected_str = "OTHER_SYSTEM_BOARD"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_OTHER_SYSTEM_BOARD != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_PROCESSOR_BOARD testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_PROCESSOR_BOARD; SaHpiEntityTypeT enum_type; expected_str = "PROCESSOR_BOARD"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_PROCESSOR_BOARD != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_POWER_UNIT testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_POWER_UNIT; SaHpiEntityTypeT enum_type; expected_str = "POWER_UNIT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_POWER_UNIT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_POWER_MODULE testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_POWER_MODULE; SaHpiEntityTypeT enum_type; expected_str = "POWER_MODULE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_POWER_MODULE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_POWER_MGMNT testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_POWER_MGMNT; SaHpiEntityTypeT enum_type; expected_str = "POWER_MGMNT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_POWER_MGMNT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_CHASSIS_BACK_PANEL_BOARD testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_CHASSIS_BACK_PANEL_BOARD; SaHpiEntityTypeT enum_type; expected_str = "CHASSIS_BACK_PANEL_BOARD"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_CHASSIS_BACK_PANEL_BOARD != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_SYSTEM_CHASSIS testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_SYSTEM_CHASSIS; SaHpiEntityTypeT enum_type; expected_str = "SYSTEM_CHASSIS"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_SYSTEM_CHASSIS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_SUB_CHASSIS testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_SUB_CHASSIS; SaHpiEntityTypeT enum_type; expected_str = "SUB_CHASSIS"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_SUB_CHASSIS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_OTHER_CHASSIS_BOARD testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_OTHER_CHASSIS_BOARD; SaHpiEntityTypeT enum_type; expected_str = "OTHER_CHASSIS_BOARD"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_OTHER_CHASSIS_BOARD != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_DISK_DRIVE_BAY testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_DISK_DRIVE_BAY; SaHpiEntityTypeT enum_type; expected_str = "DISK_DRIVE_BAY"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_DISK_DRIVE_BAY != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_PERIPHERAL_BAY_2 testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_PERIPHERAL_BAY_2; SaHpiEntityTypeT enum_type; expected_str = "PERIPHERAL_BAY_2"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_PERIPHERAL_BAY_2 != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_DEVICE_BAY testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_DEVICE_BAY; SaHpiEntityTypeT enum_type; expected_str = "DEVICE_BAY"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_DEVICE_BAY != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_COOLING_DEVICE testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_COOLING_DEVICE; SaHpiEntityTypeT enum_type; expected_str = "COOLING_DEVICE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_COOLING_DEVICE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_COOLING_UNIT testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_COOLING_UNIT; SaHpiEntityTypeT enum_type; expected_str = "COOLING_UNIT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_COOLING_UNIT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_INTERCONNECT testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_INTERCONNECT; SaHpiEntityTypeT enum_type; expected_str = "INTERCONNECT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_INTERCONNECT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_MEMORY_DEVICE testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_MEMORY_DEVICE; SaHpiEntityTypeT enum_type; expected_str = "MEMORY_DEVICE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_MEMORY_DEVICE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_SYS_MGMNT_SOFTWARE testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_SYS_MGMNT_SOFTWARE; SaHpiEntityTypeT enum_type; expected_str = "SYS_MGMNT_SOFTWARE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_SYS_MGMNT_SOFTWARE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_BIOS testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_BIOS; SaHpiEntityTypeT enum_type; expected_str = "BIOS"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_BIOS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_OPERATING_SYSTEM testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_OPERATING_SYSTEM; SaHpiEntityTypeT enum_type; expected_str = "OPERATING_SYSTEM"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_OPERATING_SYSTEM != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_SYSTEM_BUS testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_SYSTEM_BUS; SaHpiEntityTypeT enum_type; expected_str = "SYSTEM_BUS"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_SYSTEM_BUS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_GROUP testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_GROUP; SaHpiEntityTypeT enum_type; expected_str = "GROUP"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_GROUP != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_REMOTE testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_REMOTE; SaHpiEntityTypeT enum_type; expected_str = "REMOTE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_REMOTE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_EXTERNAL_ENVIRONMENT testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_EXTERNAL_ENVIRONMENT; SaHpiEntityTypeT enum_type; expected_str = "EXTERNAL_ENVIRONMENT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_EXTERNAL_ENVIRONMENT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_BATTERY testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_BATTERY; SaHpiEntityTypeT enum_type; expected_str = "BATTERY"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_BATTERY != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_CHASSIS_SPECIFIC testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_CHASSIS_SPECIFIC; SaHpiEntityTypeT enum_type; expected_str = "CHASSIS_SPECIFIC"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_CHASSIS_SPECIFIC != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_BOARD_SET_SPECIFIC testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_BOARD_SET_SPECIFIC; SaHpiEntityTypeT enum_type; expected_str = "BOARD_SET_SPECIFIC"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_BOARD_SET_SPECIFIC != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_OEM_SYSINT_SPECIFIC testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_OEM_SYSINT_SPECIFIC; SaHpiEntityTypeT enum_type; expected_str = "OEM_SYSINT_SPECIFIC"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_OEM_SYSINT_SPECIFIC != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_ROOT testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_ROOT; SaHpiEntityTypeT enum_type; expected_str = "ROOT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_ROOT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_RACK testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_RACK; SaHpiEntityTypeT enum_type; expected_str = "RACK"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_RACK != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_SUBRACK testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_SUBRACK; SaHpiEntityTypeT enum_type; expected_str = "SUBRACK"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_SUBRACK != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_COMPACTPCI_CHASSIS testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_COMPACTPCI_CHASSIS; SaHpiEntityTypeT enum_type; expected_str = "COMPACTPCI_CHASSIS"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_COMPACTPCI_CHASSIS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_ADVANCEDTCA_CHASSIS testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_ADVANCEDTCA_CHASSIS; SaHpiEntityTypeT enum_type; expected_str = "ADVANCEDTCA_CHASSIS"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_ADVANCEDTCA_CHASSIS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_RACK_MOUNTED_SERVER testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_RACK_MOUNTED_SERVER; SaHpiEntityTypeT enum_type; expected_str = "RACK_MOUNTED_SERVER"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_RACK_MOUNTED_SERVER != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_SYSTEM_BLADE testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_SYSTEM_BLADE; SaHpiEntityTypeT enum_type; expected_str = "SYSTEM_BLADE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_SYSTEM_BLADE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_SWITCH testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_SWITCH; SaHpiEntityTypeT enum_type; expected_str = "SWITCH"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_SWITCH != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_SWITCH_BLADE testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_SWITCH_BLADE; SaHpiEntityTypeT enum_type; expected_str = "SWITCH_BLADE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_SWITCH_BLADE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_SBC_BLADE testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_SBC_BLADE; SaHpiEntityTypeT enum_type; expected_str = "SBC_BLADE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_SBC_BLADE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_IO_BLADE testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_IO_BLADE; SaHpiEntityTypeT enum_type; expected_str = "IO_BLADE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_IO_BLADE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_DISK_BLADE testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_DISK_BLADE; SaHpiEntityTypeT enum_type; expected_str = "DISK_BLADE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_DISK_BLADE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_DISK_DRIVE testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_DISK_DRIVE; SaHpiEntityTypeT enum_type; expected_str = "DISK_DRIVE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_DISK_DRIVE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_FAN testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_FAN; SaHpiEntityTypeT enum_type; expected_str = "FAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_FAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_POWER_DISTRIBUTION_UNIT testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_POWER_DISTRIBUTION_UNIT; SaHpiEntityTypeT enum_type; expected_str = "POWER_DISTRIBUTION_UNIT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_POWER_DISTRIBUTION_UNIT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_SPEC_PROC_BLADE testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_SPEC_PROC_BLADE; SaHpiEntityTypeT enum_type; expected_str = "SPEC_PROC_BLADE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_SPEC_PROC_BLADE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_IO_SUBBOARD testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_IO_SUBBOARD; SaHpiEntityTypeT enum_type; expected_str = "IO_SUBBOARD"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_IO_SUBBOARD != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_SBC_SUBBOARD testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_SBC_SUBBOARD; SaHpiEntityTypeT enum_type; expected_str = "SBC_SUBBOARD"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_SBC_SUBBOARD != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_ALARM_MANAGER testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_ALARM_MANAGER; SaHpiEntityTypeT enum_type; expected_str = "ALARM_MANAGER"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_ALARM_MANAGER != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_SHELF_MANAGER testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_SHELF_MANAGER; SaHpiEntityTypeT enum_type; expected_str = "SHELF_MANAGER"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_SHELF_MANAGER != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_DISPLAY_PANEL testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_DISPLAY_PANEL; SaHpiEntityTypeT enum_type; expected_str = "DISPLAY_PANEL"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_DISPLAY_PANEL != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_SUBBOARD_CARRIER_BLADE testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_SUBBOARD_CARRIER_BLADE; SaHpiEntityTypeT enum_type; expected_str = "SUBBOARD_CARRIER_BLADE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_SUBBOARD_CARRIER_BLADE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_PHYSICAL_SLOT testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_PHYSICAL_SLOT; SaHpiEntityTypeT enum_type; expected_str = "PHYSICAL_SLOT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_PHYSICAL_SLOT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - Default testcase */ { SaHpiEntityTypeT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_entitytype(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiEntityTypeT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiEntityTypeT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_entitytype(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiEntityTypeT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_entitytype(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiSensorTypeT - SAHPI_TEMPERATURE testcase */ { SaHpiSensorTypeT value = SAHPI_TEMPERATURE; SaHpiSensorTypeT enum_type; expected_str = "TEMPERATURE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_TEMPERATURE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_VOLTAGE testcase */ { SaHpiSensorTypeT value = SAHPI_VOLTAGE; SaHpiSensorTypeT enum_type; expected_str = "VOLTAGE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_VOLTAGE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_CURRENT testcase */ { SaHpiSensorTypeT value = SAHPI_CURRENT; SaHpiSensorTypeT enum_type; expected_str = "CURRENT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CURRENT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_FAN testcase */ { SaHpiSensorTypeT value = SAHPI_FAN; SaHpiSensorTypeT enum_type; expected_str = "FAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_FAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_PHYSICAL_SECURITY testcase */ { SaHpiSensorTypeT value = SAHPI_PHYSICAL_SECURITY; SaHpiSensorTypeT enum_type; expected_str = "PHYSICAL_SECURITY"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_PHYSICAL_SECURITY != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_PLATFORM_VIOLATION testcase */ { SaHpiSensorTypeT value = SAHPI_PLATFORM_VIOLATION; SaHpiSensorTypeT enum_type; expected_str = "PLATFORM_VIOLATION"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_PLATFORM_VIOLATION != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_PROCESSOR testcase */ { SaHpiSensorTypeT value = SAHPI_PROCESSOR; SaHpiSensorTypeT enum_type; expected_str = "PROCESSOR"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_PROCESSOR != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_POWER_SUPPLY testcase */ { SaHpiSensorTypeT value = SAHPI_POWER_SUPPLY; SaHpiSensorTypeT enum_type; expected_str = "POWER_SUPPLY"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_POWER_SUPPLY != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_POWER_UNIT testcase */ { SaHpiSensorTypeT value = SAHPI_POWER_UNIT; SaHpiSensorTypeT enum_type; expected_str = "POWER_UNIT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_POWER_UNIT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_COOLING_DEVICE testcase */ { SaHpiSensorTypeT value = SAHPI_COOLING_DEVICE; SaHpiSensorTypeT enum_type; expected_str = "COOLING_DEVICE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_COOLING_DEVICE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_OTHER_UNITS_BASED_SENSOR testcase */ { SaHpiSensorTypeT value = SAHPI_OTHER_UNITS_BASED_SENSOR; SaHpiSensorTypeT enum_type; expected_str = "OTHER_UNITS_BASED_SENSOR"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_OTHER_UNITS_BASED_SENSOR != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_MEMORY testcase */ { SaHpiSensorTypeT value = SAHPI_MEMORY; SaHpiSensorTypeT enum_type; expected_str = "MEMORY"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_MEMORY != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_DRIVE_SLOT testcase */ { SaHpiSensorTypeT value = SAHPI_DRIVE_SLOT; SaHpiSensorTypeT enum_type; expected_str = "DRIVE_SLOT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_DRIVE_SLOT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_POST_MEMORY_RESIZE testcase */ { SaHpiSensorTypeT value = SAHPI_POST_MEMORY_RESIZE; SaHpiSensorTypeT enum_type; expected_str = "POST_MEMORY_RESIZE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_POST_MEMORY_RESIZE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_SYSTEM_FW_PROGRESS testcase */ { SaHpiSensorTypeT value = SAHPI_SYSTEM_FW_PROGRESS; SaHpiSensorTypeT enum_type; expected_str = "SYSTEM_FW_PROGRESS"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SYSTEM_FW_PROGRESS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_EVENT_LOGGING_DISABLED testcase */ { SaHpiSensorTypeT value = SAHPI_EVENT_LOGGING_DISABLED; SaHpiSensorTypeT enum_type; expected_str = "EVENT_LOGGING_DISABLED"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_EVENT_LOGGING_DISABLED != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_RESERVED1 testcase */ { SaHpiSensorTypeT value = SAHPI_RESERVED1; SaHpiSensorTypeT enum_type; expected_str = "RESERVED1"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_RESERVED1 != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_SYSTEM_EVENT testcase */ { SaHpiSensorTypeT value = SAHPI_SYSTEM_EVENT; SaHpiSensorTypeT enum_type; expected_str = "SYSTEM_EVENT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SYSTEM_EVENT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_CRITICAL_INTERRUPT testcase */ { SaHpiSensorTypeT value = SAHPI_CRITICAL_INTERRUPT; SaHpiSensorTypeT enum_type; expected_str = "CRITICAL_INTERRUPT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CRITICAL_INTERRUPT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_BUTTON testcase */ { SaHpiSensorTypeT value = SAHPI_BUTTON; SaHpiSensorTypeT enum_type; expected_str = "BUTTON"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_BUTTON != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_MODULE_BOARD testcase */ { SaHpiSensorTypeT value = SAHPI_MODULE_BOARD; SaHpiSensorTypeT enum_type; expected_str = "MODULE_BOARD"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_MODULE_BOARD != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_MICROCONTROLLER_COPROCESSOR testcase */ { SaHpiSensorTypeT value = SAHPI_MICROCONTROLLER_COPROCESSOR; SaHpiSensorTypeT enum_type; expected_str = "MICROCONTROLLER_COPROCESSOR"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_MICROCONTROLLER_COPROCESSOR != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_ADDIN_CARD testcase */ { SaHpiSensorTypeT value = SAHPI_ADDIN_CARD; SaHpiSensorTypeT enum_type; expected_str = "ADDIN_CARD"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ADDIN_CARD != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_CHASSIS testcase */ { SaHpiSensorTypeT value = SAHPI_CHASSIS; SaHpiSensorTypeT enum_type; expected_str = "CHASSIS"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CHASSIS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_CHIP_SET testcase */ { SaHpiSensorTypeT value = SAHPI_CHIP_SET; SaHpiSensorTypeT enum_type; expected_str = "CHIP_SET"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CHIP_SET != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_OTHER_FRU testcase */ { SaHpiSensorTypeT value = SAHPI_OTHER_FRU; SaHpiSensorTypeT enum_type; expected_str = "OTHER_FRU"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_OTHER_FRU != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_CABLE_INTERCONNECT testcase */ { SaHpiSensorTypeT value = SAHPI_CABLE_INTERCONNECT; SaHpiSensorTypeT enum_type; expected_str = "CABLE_INTERCONNECT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CABLE_INTERCONNECT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_TERMINATOR testcase */ { SaHpiSensorTypeT value = SAHPI_TERMINATOR; SaHpiSensorTypeT enum_type; expected_str = "TERMINATOR"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_TERMINATOR != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_SYSTEM_BOOT_INITIATED testcase */ { SaHpiSensorTypeT value = SAHPI_SYSTEM_BOOT_INITIATED; SaHpiSensorTypeT enum_type; expected_str = "SYSTEM_BOOT_INITIATED"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SYSTEM_BOOT_INITIATED != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_BOOT_ERROR testcase */ { SaHpiSensorTypeT value = SAHPI_BOOT_ERROR; SaHpiSensorTypeT enum_type; expected_str = "BOOT_ERROR"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_BOOT_ERROR != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_OS_BOOT testcase */ { SaHpiSensorTypeT value = SAHPI_OS_BOOT; SaHpiSensorTypeT enum_type; expected_str = "OS_BOOT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_OS_BOOT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_OS_CRITICAL_STOP testcase */ { SaHpiSensorTypeT value = SAHPI_OS_CRITICAL_STOP; SaHpiSensorTypeT enum_type; expected_str = "OS_CRITICAL_STOP"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_OS_CRITICAL_STOP != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_SLOT_CONNECTOR testcase */ { SaHpiSensorTypeT value = SAHPI_SLOT_CONNECTOR; SaHpiSensorTypeT enum_type; expected_str = "SLOT_CONNECTOR"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SLOT_CONNECTOR != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_SYSTEM_ACPI_POWER_STATE testcase */ { SaHpiSensorTypeT value = SAHPI_SYSTEM_ACPI_POWER_STATE; SaHpiSensorTypeT enum_type; expected_str = "SYSTEM_ACPI_POWER_STATE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SYSTEM_ACPI_POWER_STATE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_RESERVED2 testcase */ { SaHpiSensorTypeT value = SAHPI_RESERVED2; SaHpiSensorTypeT enum_type; expected_str = "RESERVED2"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_RESERVED2 != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_PLATFORM_ALERT testcase */ { SaHpiSensorTypeT value = SAHPI_PLATFORM_ALERT; SaHpiSensorTypeT enum_type; expected_str = "PLATFORM_ALERT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_PLATFORM_ALERT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_ENTITY_PRESENCE testcase */ { SaHpiSensorTypeT value = SAHPI_ENTITY_PRESENCE; SaHpiSensorTypeT enum_type; expected_str = "ENTITY_PRESENCE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENTITY_PRESENCE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_MONITOR_ASIC_IC testcase */ { SaHpiSensorTypeT value = SAHPI_MONITOR_ASIC_IC; SaHpiSensorTypeT enum_type; expected_str = "MONITOR_ASIC_IC"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_MONITOR_ASIC_IC != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_LAN testcase */ { SaHpiSensorTypeT value = SAHPI_LAN; SaHpiSensorTypeT enum_type; expected_str = "LAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_MANAGEMENT_SUBSYSTEM_HEALTH testcase */ { SaHpiSensorTypeT value = SAHPI_MANAGEMENT_SUBSYSTEM_HEALTH; SaHpiSensorTypeT enum_type; expected_str = "MANAGEMENT_SUBSYSTEM_HEALTH"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_MANAGEMENT_SUBSYSTEM_HEALTH != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_BATTERY testcase */ { SaHpiSensorTypeT value = SAHPI_BATTERY; SaHpiSensorTypeT enum_type; expected_str = "BATTERY"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_BATTERY != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_OPERATIONAL testcase */ { SaHpiSensorTypeT value = SAHPI_OPERATIONAL; SaHpiSensorTypeT enum_type; expected_str = "OPERATIONAL"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_OPERATIONAL != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_OEM_SENSOR testcase */ { SaHpiSensorTypeT value = SAHPI_OEM_SENSOR; SaHpiSensorTypeT enum_type; expected_str = "OEM_SENSOR"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_OEM_SENSOR != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - Default testcase */ { SaHpiSensorTypeT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_sensortype(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiSensorTypeT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiSensorTypeT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_sensortype(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiSensorTypeT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_sensortype(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiSensorReadingTypeT - SAHPI_SENSOR_READING_TYPE_INT64 testcase */ { SaHpiSensorReadingTypeT value = SAHPI_SENSOR_READING_TYPE_INT64; SaHpiSensorReadingTypeT enum_type; expected_str = "INT64"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorreadingtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorreadingtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SENSOR_READING_TYPE_INT64 != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorReadingTypeT - SAHPI_SENSOR_READING_TYPE_UINT64 testcase */ { SaHpiSensorReadingTypeT value = SAHPI_SENSOR_READING_TYPE_UINT64; SaHpiSensorReadingTypeT enum_type; expected_str = "UINT64"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorreadingtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorreadingtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SENSOR_READING_TYPE_UINT64 != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorReadingTypeT - SAHPI_SENSOR_READING_TYPE_FLOAT64 testcase */ { SaHpiSensorReadingTypeT value = SAHPI_SENSOR_READING_TYPE_FLOAT64; SaHpiSensorReadingTypeT enum_type; expected_str = "FLOAT64"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorreadingtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorreadingtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SENSOR_READING_TYPE_FLOAT64 != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorReadingTypeT - SAHPI_SENSOR_READING_TYPE_BUFFER testcase */ { SaHpiSensorReadingTypeT value = SAHPI_SENSOR_READING_TYPE_BUFFER; SaHpiSensorReadingTypeT enum_type; expected_str = "BUFFER"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorreadingtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorreadingtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SENSOR_READING_TYPE_BUFFER != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorReadingTypeT - Default testcase */ { SaHpiSensorReadingTypeT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_sensorreadingtype(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiSensorReadingTypeT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiSensorReadingTypeT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_sensorreadingtype(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiSensorReadingTypeT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_sensorreadingtype(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiSensorEventMaskActionT - SAHPI_SENS_ADD_EVENTS_TO_MASKS testcase */ { SaHpiSensorEventMaskActionT value = SAHPI_SENS_ADD_EVENTS_TO_MASKS; SaHpiSensorEventMaskActionT enum_type; expected_str = "ADD_EVENTS_TO_MASKS"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensoreventmaskaction(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensoreventmaskaction(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SENS_ADD_EVENTS_TO_MASKS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorEventMaskActionT - SAHPI_SENS_REMOVE_EVENTS_FROM_MASKS testcase */ { SaHpiSensorEventMaskActionT value = SAHPI_SENS_REMOVE_EVENTS_FROM_MASKS; SaHpiSensorEventMaskActionT enum_type; expected_str = "REMOVE_EVENTS_FROM_MASKS"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensoreventmaskaction(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensoreventmaskaction(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SENS_REMOVE_EVENTS_FROM_MASKS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorEventMaskActionT - Default testcase */ { SaHpiSensorEventMaskActionT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_sensoreventmaskaction(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiSensorEventMaskActionT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiSensorEventMaskActionT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_sensoreventmaskaction(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiSensorEventMaskActionT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_sensoreventmaskaction(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_UNSPECIFIED testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_UNSPECIFIED; SaHpiSensorUnitsT enum_type; expected_str = "Unspecified"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_UNSPECIFIED != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_DEGREES_C testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_DEGREES_C; SaHpiSensorUnitsT enum_type; expected_str = "Degrees C"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_DEGREES_C != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_DEGREES_F testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_DEGREES_F; SaHpiSensorUnitsT enum_type; expected_str = "Degrees F"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_DEGREES_F != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_DEGREES_K testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_DEGREES_K; SaHpiSensorUnitsT enum_type; expected_str = "Degrees K"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_DEGREES_K != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_VOLTS testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_VOLTS; SaHpiSensorUnitsT enum_type; expected_str = "Volts"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_VOLTS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_AMPS testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_AMPS; SaHpiSensorUnitsT enum_type; expected_str = "Amps"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_AMPS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_WATTS testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_WATTS; SaHpiSensorUnitsT enum_type; expected_str = "Watts"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_WATTS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_JOULES testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_JOULES; SaHpiSensorUnitsT enum_type; expected_str = "Joules"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_JOULES != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_COULOMBS testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_COULOMBS; SaHpiSensorUnitsT enum_type; expected_str = "Coulombs"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_COULOMBS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_VA testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_VA; SaHpiSensorUnitsT enum_type; expected_str = "Va"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_VA != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_NITS testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_NITS; SaHpiSensorUnitsT enum_type; expected_str = "Nits"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_NITS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_LUMEN testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_LUMEN; SaHpiSensorUnitsT enum_type; expected_str = "Lumen"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_LUMEN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_LUX testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_LUX; SaHpiSensorUnitsT enum_type; expected_str = "Lux"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_LUX != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_CANDELA testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_CANDELA; SaHpiSensorUnitsT enum_type; expected_str = "Candela"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_CANDELA != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_KPA testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_KPA; SaHpiSensorUnitsT enum_type; expected_str = "Kpa"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_KPA != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_PSI testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_PSI; SaHpiSensorUnitsT enum_type; expected_str = "Psi"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_PSI != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_NEWTON testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_NEWTON; SaHpiSensorUnitsT enum_type; expected_str = "Newton"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_NEWTON != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_CFM testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_CFM; SaHpiSensorUnitsT enum_type; expected_str = "Cfm"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_CFM != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_RPM testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_RPM; SaHpiSensorUnitsT enum_type; expected_str = "Rpm"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_RPM != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_HZ testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_HZ; SaHpiSensorUnitsT enum_type; expected_str = "Hz"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_HZ != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_MICROSECOND testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_MICROSECOND; SaHpiSensorUnitsT enum_type; expected_str = "Microsecond"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_MICROSECOND != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_MILLISECOND testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_MILLISECOND; SaHpiSensorUnitsT enum_type; expected_str = "Millisecond"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_MILLISECOND != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_SECOND testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_SECOND; SaHpiSensorUnitsT enum_type; expected_str = "Second"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_SECOND != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_MINUTE testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_MINUTE; SaHpiSensorUnitsT enum_type; expected_str = "Minute"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_MINUTE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_HOUR testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_HOUR; SaHpiSensorUnitsT enum_type; expected_str = "Hour"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_HOUR != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_DAY testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_DAY; SaHpiSensorUnitsT enum_type; expected_str = "Day"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_DAY != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_WEEK testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_WEEK; SaHpiSensorUnitsT enum_type; expected_str = "Week"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_WEEK != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_MIL testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_MIL; SaHpiSensorUnitsT enum_type; expected_str = "Mil"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_MIL != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_INCHES testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_INCHES; SaHpiSensorUnitsT enum_type; expected_str = "Inches"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_INCHES != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_FEET testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_FEET; SaHpiSensorUnitsT enum_type; expected_str = "Feet"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_FEET != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_CU_IN testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_CU_IN; SaHpiSensorUnitsT enum_type; expected_str = "Cu In"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_CU_IN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_CU_FEET testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_CU_FEET; SaHpiSensorUnitsT enum_type; expected_str = "Cu Feet"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_CU_FEET != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_MM testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_MM; SaHpiSensorUnitsT enum_type; expected_str = "Mm"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_MM != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_CM testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_CM; SaHpiSensorUnitsT enum_type; expected_str = "Cm"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_CM != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_M testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_M; SaHpiSensorUnitsT enum_type; expected_str = "M"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_M != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_CU_CM testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_CU_CM; SaHpiSensorUnitsT enum_type; expected_str = "Cu Cm"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_CU_CM != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_CU_M testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_CU_M; SaHpiSensorUnitsT enum_type; expected_str = "Cu M"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_CU_M != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_LITERS testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_LITERS; SaHpiSensorUnitsT enum_type; expected_str = "Liters"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_LITERS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_FLUID_OUNCE testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_FLUID_OUNCE; SaHpiSensorUnitsT enum_type; expected_str = "Fluid Ounce"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_FLUID_OUNCE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_RADIANS testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_RADIANS; SaHpiSensorUnitsT enum_type; expected_str = "Radians"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_RADIANS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_STERADIANS testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_STERADIANS; SaHpiSensorUnitsT enum_type; expected_str = "Steradians"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_STERADIANS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_REVOLUTIONS testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_REVOLUTIONS; SaHpiSensorUnitsT enum_type; expected_str = "Revolutions"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_REVOLUTIONS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_CYCLES testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_CYCLES; SaHpiSensorUnitsT enum_type; expected_str = "Cycles"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_CYCLES != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_GRAVITIES testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_GRAVITIES; SaHpiSensorUnitsT enum_type; expected_str = "Gravities"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_GRAVITIES != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_OUNCE testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_OUNCE; SaHpiSensorUnitsT enum_type; expected_str = "Ounce"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_OUNCE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_POUND testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_POUND; SaHpiSensorUnitsT enum_type; expected_str = "Pound"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_POUND != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_FT_LB testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_FT_LB; SaHpiSensorUnitsT enum_type; expected_str = "Ft Lb"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_FT_LB != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_OZ_IN testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_OZ_IN; SaHpiSensorUnitsT enum_type; expected_str = "Oz In"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_OZ_IN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_GAUSS testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_GAUSS; SaHpiSensorUnitsT enum_type; expected_str = "Gauss"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_GAUSS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_GILBERTS testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_GILBERTS; SaHpiSensorUnitsT enum_type; expected_str = "Gilberts"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_GILBERTS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_HENRY testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_HENRY; SaHpiSensorUnitsT enum_type; expected_str = "Henry"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_HENRY != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_MILLIHENRY testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_MILLIHENRY; SaHpiSensorUnitsT enum_type; expected_str = "Millihenry"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_MILLIHENRY != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_FARAD testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_FARAD; SaHpiSensorUnitsT enum_type; expected_str = "Farad"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_FARAD != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_MICROFARAD testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_MICROFARAD; SaHpiSensorUnitsT enum_type; expected_str = "Microfarad"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_MICROFARAD != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_OHMS testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_OHMS; SaHpiSensorUnitsT enum_type; expected_str = "Ohms"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_OHMS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_SIEMENS testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_SIEMENS; SaHpiSensorUnitsT enum_type; expected_str = "Siemens"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_SIEMENS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_MOLE testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_MOLE; SaHpiSensorUnitsT enum_type; expected_str = "Mole"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_MOLE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_BECQUEREL testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_BECQUEREL; SaHpiSensorUnitsT enum_type; expected_str = "Becquerel"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_BECQUEREL != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_PPM testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_PPM; SaHpiSensorUnitsT enum_type; expected_str = "Ppm"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_PPM != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_RESERVED testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_RESERVED; SaHpiSensorUnitsT enum_type; expected_str = "Reserved"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_RESERVED != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_DECIBELS testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_DECIBELS; SaHpiSensorUnitsT enum_type; expected_str = "Decibels"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_DECIBELS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_DBA testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_DBA; SaHpiSensorUnitsT enum_type; expected_str = "Dba"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_DBA != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_DBC testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_DBC; SaHpiSensorUnitsT enum_type; expected_str = "Dbc"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_DBC != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_GRAY testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_GRAY; SaHpiSensorUnitsT enum_type; expected_str = "Gray"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_GRAY != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_SIEVERT testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_SIEVERT; SaHpiSensorUnitsT enum_type; expected_str = "Sievert"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_SIEVERT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_COLOR_TEMP_DEG_K testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_COLOR_TEMP_DEG_K; SaHpiSensorUnitsT enum_type; expected_str = "Color Temp Deg K"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_COLOR_TEMP_DEG_K != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_BIT testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_BIT; SaHpiSensorUnitsT enum_type; expected_str = "Bit"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_BIT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_KILOBIT testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_KILOBIT; SaHpiSensorUnitsT enum_type; expected_str = "Kilobit"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_KILOBIT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_MEGABIT testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_MEGABIT; SaHpiSensorUnitsT enum_type; expected_str = "Megabit"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_MEGABIT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_GIGABIT testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_GIGABIT; SaHpiSensorUnitsT enum_type; expected_str = "Gigabit"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_GIGABIT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_BYTE testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_BYTE; SaHpiSensorUnitsT enum_type; expected_str = "Byte"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_BYTE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_KILOBYTE testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_KILOBYTE; SaHpiSensorUnitsT enum_type; expected_str = "Kilobyte"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_KILOBYTE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_MEGABYTE testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_MEGABYTE; SaHpiSensorUnitsT enum_type; expected_str = "Megabyte"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_MEGABYTE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_GIGABYTE testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_GIGABYTE; SaHpiSensorUnitsT enum_type; expected_str = "Gigabyte"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_GIGABYTE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_WORD testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_WORD; SaHpiSensorUnitsT enum_type; expected_str = "Word"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_WORD != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_DWORD testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_DWORD; SaHpiSensorUnitsT enum_type; expected_str = "Dword"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_DWORD != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_QWORD testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_QWORD; SaHpiSensorUnitsT enum_type; expected_str = "Qword"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_QWORD != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_LINE testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_LINE; SaHpiSensorUnitsT enum_type; expected_str = "Line"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_LINE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_HIT testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_HIT; SaHpiSensorUnitsT enum_type; expected_str = "Hit"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_HIT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_MISS testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_MISS; SaHpiSensorUnitsT enum_type; expected_str = "Miss"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_MISS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_RETRY testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_RETRY; SaHpiSensorUnitsT enum_type; expected_str = "Retry"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_RETRY != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_RESET testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_RESET; SaHpiSensorUnitsT enum_type; expected_str = "Reset"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_RESET != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_OVERRUN testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_OVERRUN; SaHpiSensorUnitsT enum_type; expected_str = "Overrun"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_OVERRUN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_UNDERRUN testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_UNDERRUN; SaHpiSensorUnitsT enum_type; expected_str = "Underrun"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_UNDERRUN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_COLLISION testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_COLLISION; SaHpiSensorUnitsT enum_type; expected_str = "Collision"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_COLLISION != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_PACKETS testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_PACKETS; SaHpiSensorUnitsT enum_type; expected_str = "Packets"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_PACKETS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_MESSAGES testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_MESSAGES; SaHpiSensorUnitsT enum_type; expected_str = "Messages"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_MESSAGES != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_CHARACTERS testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_CHARACTERS; SaHpiSensorUnitsT enum_type; expected_str = "Characters"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_CHARACTERS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_ERRORS testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_ERRORS; SaHpiSensorUnitsT enum_type; expected_str = "Errors"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_ERRORS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_CORRECTABLE_ERRORS testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_CORRECTABLE_ERRORS; SaHpiSensorUnitsT enum_type; expected_str = "Correctable Errors"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_CORRECTABLE_ERRORS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_UNCORRECTABLE_ERRORS testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_UNCORRECTABLE_ERRORS; SaHpiSensorUnitsT enum_type; expected_str = "Uncorrectable Errors"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_UNCORRECTABLE_ERRORS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - Default testcase */ { SaHpiSensorUnitsT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_sensorunits(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiSensorUnitsT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiSensorUnitsT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_sensorunits(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiSensorUnitsT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_sensorunits(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiSensorModUnitUseT - SAHPI_SMUU_NONE testcase */ { SaHpiSensorModUnitUseT value = SAHPI_SMUU_NONE; SaHpiSensorModUnitUseT enum_type; expected_str = "NONE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensormodunituse(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensormodunituse(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SMUU_NONE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorModUnitUseT - SAHPI_SMUU_BASIC_OVER_MODIFIER testcase */ { SaHpiSensorModUnitUseT value = SAHPI_SMUU_BASIC_OVER_MODIFIER; SaHpiSensorModUnitUseT enum_type; expected_str = "BASIC_OVER_MODIFIER"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensormodunituse(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensormodunituse(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SMUU_BASIC_OVER_MODIFIER != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorModUnitUseT - SAHPI_SMUU_BASIC_TIMES_MODIFIER testcase */ { SaHpiSensorModUnitUseT value = SAHPI_SMUU_BASIC_TIMES_MODIFIER; SaHpiSensorModUnitUseT enum_type; expected_str = "BASIC_TIMES_MODIFIER"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensormodunituse(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensormodunituse(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SMUU_BASIC_TIMES_MODIFIER != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorModUnitUseT - Default testcase */ { SaHpiSensorModUnitUseT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_sensormodunituse(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiSensorModUnitUseT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiSensorModUnitUseT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_sensormodunituse(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiSensorModUnitUseT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_sensormodunituse(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiSensorEventCtrlT - SAHPI_SEC_PER_EVENT testcase */ { SaHpiSensorEventCtrlT value = SAHPI_SEC_PER_EVENT; SaHpiSensorEventCtrlT enum_type; expected_str = "PER_EVENT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensoreventctrl(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensoreventctrl(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SEC_PER_EVENT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorEventCtrlT - SAHPI_SEC_READ_ONLY_MASKS testcase */ { SaHpiSensorEventCtrlT value = SAHPI_SEC_READ_ONLY_MASKS; SaHpiSensorEventCtrlT enum_type; expected_str = "READ_ONLY_MASKS"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensoreventctrl(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensoreventctrl(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SEC_READ_ONLY_MASKS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorEventCtrlT - SAHPI_SEC_READ_ONLY testcase */ { SaHpiSensorEventCtrlT value = SAHPI_SEC_READ_ONLY; SaHpiSensorEventCtrlT enum_type; expected_str = "READ_ONLY"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensoreventctrl(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensoreventctrl(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SEC_READ_ONLY != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorEventCtrlT - Default testcase */ { SaHpiSensorEventCtrlT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_sensoreventctrl(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiSensorEventCtrlT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiSensorEventCtrlT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_sensoreventctrl(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiSensorEventCtrlT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_sensoreventctrl(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiCtrlTypeT - SAHPI_CTRL_TYPE_DIGITAL testcase */ { SaHpiCtrlTypeT value = SAHPI_CTRL_TYPE_DIGITAL; SaHpiCtrlTypeT enum_type; expected_str = "DIGITAL"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_ctrltype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_ctrltype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CTRL_TYPE_DIGITAL != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiCtrlTypeT - SAHPI_CTRL_TYPE_DISCRETE testcase */ { SaHpiCtrlTypeT value = SAHPI_CTRL_TYPE_DISCRETE; SaHpiCtrlTypeT enum_type; expected_str = "DISCRETE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_ctrltype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_ctrltype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CTRL_TYPE_DISCRETE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiCtrlTypeT - SAHPI_CTRL_TYPE_ANALOG testcase */ { SaHpiCtrlTypeT value = SAHPI_CTRL_TYPE_ANALOG; SaHpiCtrlTypeT enum_type; expected_str = "ANALOG"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_ctrltype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_ctrltype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CTRL_TYPE_ANALOG != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiCtrlTypeT - SAHPI_CTRL_TYPE_STREAM testcase */ { SaHpiCtrlTypeT value = SAHPI_CTRL_TYPE_STREAM; SaHpiCtrlTypeT enum_type; expected_str = "STREAM"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_ctrltype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_ctrltype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CTRL_TYPE_STREAM != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiCtrlTypeT - SAHPI_CTRL_TYPE_TEXT testcase */ { SaHpiCtrlTypeT value = SAHPI_CTRL_TYPE_TEXT; SaHpiCtrlTypeT enum_type; expected_str = "TEXT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_ctrltype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_ctrltype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CTRL_TYPE_TEXT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiCtrlTypeT - SAHPI_CTRL_TYPE_OEM testcase */ { SaHpiCtrlTypeT value = SAHPI_CTRL_TYPE_OEM; SaHpiCtrlTypeT enum_type; expected_str = "OEM"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_ctrltype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_ctrltype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CTRL_TYPE_OEM != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiCtrlTypeT - Default testcase */ { SaHpiCtrlTypeT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_ctrltype(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiCtrlTypeT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiCtrlTypeT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_ctrltype(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiCtrlTypeT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_ctrltype(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiCtrlStateDigitalT - SAHPI_CTRL_STATE_OFF testcase */ { SaHpiCtrlStateDigitalT value = SAHPI_CTRL_STATE_OFF; SaHpiCtrlStateDigitalT enum_type; expected_str = "OFF"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_ctrlstatedigital(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_ctrlstatedigital(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CTRL_STATE_OFF != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiCtrlStateDigitalT - SAHPI_CTRL_STATE_ON testcase */ { SaHpiCtrlStateDigitalT value = SAHPI_CTRL_STATE_ON; SaHpiCtrlStateDigitalT enum_type; expected_str = "ON"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_ctrlstatedigital(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_ctrlstatedigital(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CTRL_STATE_ON != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiCtrlStateDigitalT - SAHPI_CTRL_STATE_PULSE_OFF testcase */ { SaHpiCtrlStateDigitalT value = SAHPI_CTRL_STATE_PULSE_OFF; SaHpiCtrlStateDigitalT enum_type; expected_str = "PULSE_OFF"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_ctrlstatedigital(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_ctrlstatedigital(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CTRL_STATE_PULSE_OFF != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiCtrlStateDigitalT - SAHPI_CTRL_STATE_PULSE_ON testcase */ { SaHpiCtrlStateDigitalT value = SAHPI_CTRL_STATE_PULSE_ON; SaHpiCtrlStateDigitalT enum_type; expected_str = "PULSE_ON"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_ctrlstatedigital(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_ctrlstatedigital(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CTRL_STATE_PULSE_ON != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiCtrlStateDigitalT - Default testcase */ { SaHpiCtrlStateDigitalT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_ctrlstatedigital(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiCtrlStateDigitalT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiCtrlStateDigitalT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_ctrlstatedigital(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiCtrlStateDigitalT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_ctrlstatedigital(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiCtrlModeT - SAHPI_CTRL_MODE_AUTO testcase */ { SaHpiCtrlModeT value = SAHPI_CTRL_MODE_AUTO; SaHpiCtrlModeT enum_type; expected_str = "AUTO"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_ctrlmode(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_ctrlmode(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CTRL_MODE_AUTO != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiCtrlModeT - SAHPI_CTRL_MODE_MANUAL testcase */ { SaHpiCtrlModeT value = SAHPI_CTRL_MODE_MANUAL; SaHpiCtrlModeT enum_type; expected_str = "MANUAL"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_ctrlmode(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_ctrlmode(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CTRL_MODE_MANUAL != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiCtrlModeT - Default testcase */ { SaHpiCtrlModeT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_ctrlmode(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiCtrlModeT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiCtrlModeT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_ctrlmode(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiCtrlModeT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_ctrlmode(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiCtrlOutputTypeT - SAHPI_CTRL_GENERIC testcase */ { SaHpiCtrlOutputTypeT value = SAHPI_CTRL_GENERIC; SaHpiCtrlOutputTypeT enum_type; expected_str = "GENERIC"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_ctrloutputtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_ctrloutputtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CTRL_GENERIC != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiCtrlOutputTypeT - SAHPI_CTRL_LED testcase */ { SaHpiCtrlOutputTypeT value = SAHPI_CTRL_LED; SaHpiCtrlOutputTypeT enum_type; expected_str = "LED"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_ctrloutputtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_ctrloutputtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CTRL_LED != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiCtrlOutputTypeT - SAHPI_CTRL_FAN_SPEED testcase */ { SaHpiCtrlOutputTypeT value = SAHPI_CTRL_FAN_SPEED; SaHpiCtrlOutputTypeT enum_type; expected_str = "FAN_SPEED"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_ctrloutputtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_ctrloutputtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CTRL_FAN_SPEED != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiCtrlOutputTypeT - SAHPI_CTRL_DRY_CONTACT_CLOSURE testcase */ { SaHpiCtrlOutputTypeT value = SAHPI_CTRL_DRY_CONTACT_CLOSURE; SaHpiCtrlOutputTypeT enum_type; expected_str = "DRY_CONTACT_CLOSURE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_ctrloutputtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_ctrloutputtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CTRL_DRY_CONTACT_CLOSURE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiCtrlOutputTypeT - SAHPI_CTRL_POWER_SUPPLY_INHIBIT testcase */ { SaHpiCtrlOutputTypeT value = SAHPI_CTRL_POWER_SUPPLY_INHIBIT; SaHpiCtrlOutputTypeT enum_type; expected_str = "POWER_SUPPLY_INHIBIT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_ctrloutputtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_ctrloutputtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CTRL_POWER_SUPPLY_INHIBIT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiCtrlOutputTypeT - SAHPI_CTRL_AUDIBLE testcase */ { SaHpiCtrlOutputTypeT value = SAHPI_CTRL_AUDIBLE; SaHpiCtrlOutputTypeT enum_type; expected_str = "AUDIBLE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_ctrloutputtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_ctrloutputtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CTRL_AUDIBLE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiCtrlOutputTypeT - SAHPI_CTRL_FRONT_PANEL_LOCKOUT testcase */ { SaHpiCtrlOutputTypeT value = SAHPI_CTRL_FRONT_PANEL_LOCKOUT; SaHpiCtrlOutputTypeT enum_type; expected_str = "FRONT_PANEL_LOCKOUT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_ctrloutputtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_ctrloutputtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CTRL_FRONT_PANEL_LOCKOUT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiCtrlOutputTypeT - SAHPI_CTRL_POWER_INTERLOCK testcase */ { SaHpiCtrlOutputTypeT value = SAHPI_CTRL_POWER_INTERLOCK; SaHpiCtrlOutputTypeT enum_type; expected_str = "POWER_INTERLOCK"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_ctrloutputtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_ctrloutputtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CTRL_POWER_INTERLOCK != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiCtrlOutputTypeT - SAHPI_CTRL_POWER_STATE testcase */ { SaHpiCtrlOutputTypeT value = SAHPI_CTRL_POWER_STATE; SaHpiCtrlOutputTypeT enum_type; expected_str = "POWER_STATE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_ctrloutputtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_ctrloutputtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CTRL_POWER_STATE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiCtrlOutputTypeT - SAHPI_CTRL_LCD_DISPLAY testcase */ { SaHpiCtrlOutputTypeT value = SAHPI_CTRL_LCD_DISPLAY; SaHpiCtrlOutputTypeT enum_type; expected_str = "LCD_DISPLAY"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_ctrloutputtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_ctrloutputtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CTRL_LCD_DISPLAY != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiCtrlOutputTypeT - SAHPI_CTRL_OEM testcase */ { SaHpiCtrlOutputTypeT value = SAHPI_CTRL_OEM; SaHpiCtrlOutputTypeT enum_type; expected_str = "OEM"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_ctrloutputtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_ctrloutputtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CTRL_OEM != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiCtrlOutputTypeT - Default testcase */ { SaHpiCtrlOutputTypeT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_ctrloutputtype(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiCtrlOutputTypeT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiCtrlOutputTypeT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_ctrloutputtype(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiCtrlOutputTypeT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_ctrloutputtype(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiIdrAreaTypeT - SAHPI_IDR_AREATYPE_INTERNAL_USE testcase */ { SaHpiIdrAreaTypeT value = SAHPI_IDR_AREATYPE_INTERNAL_USE; SaHpiIdrAreaTypeT enum_type; expected_str = "INTERNAL_USE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_idrareatype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_idrareatype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_IDR_AREATYPE_INTERNAL_USE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiIdrAreaTypeT - SAHPI_IDR_AREATYPE_CHASSIS_INFO testcase */ { SaHpiIdrAreaTypeT value = SAHPI_IDR_AREATYPE_CHASSIS_INFO; SaHpiIdrAreaTypeT enum_type; expected_str = "CHASSIS_INFO"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_idrareatype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_idrareatype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_IDR_AREATYPE_CHASSIS_INFO != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiIdrAreaTypeT - SAHPI_IDR_AREATYPE_BOARD_INFO testcase */ { SaHpiIdrAreaTypeT value = SAHPI_IDR_AREATYPE_BOARD_INFO; SaHpiIdrAreaTypeT enum_type; expected_str = "BOARD_INFO"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_idrareatype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_idrareatype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_IDR_AREATYPE_BOARD_INFO != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiIdrAreaTypeT - SAHPI_IDR_AREATYPE_PRODUCT_INFO testcase */ { SaHpiIdrAreaTypeT value = SAHPI_IDR_AREATYPE_PRODUCT_INFO; SaHpiIdrAreaTypeT enum_type; expected_str = "PRODUCT_INFO"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_idrareatype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_idrareatype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_IDR_AREATYPE_PRODUCT_INFO != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiIdrAreaTypeT - SAHPI_IDR_AREATYPE_OEM testcase */ { SaHpiIdrAreaTypeT value = SAHPI_IDR_AREATYPE_OEM; SaHpiIdrAreaTypeT enum_type; expected_str = "OEM"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_idrareatype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_idrareatype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_IDR_AREATYPE_OEM != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiIdrAreaTypeT - SAHPI_IDR_AREATYPE_UNSPECIFIED testcase */ { SaHpiIdrAreaTypeT value = SAHPI_IDR_AREATYPE_UNSPECIFIED; SaHpiIdrAreaTypeT enum_type; expected_str = "UNSPECIFIED"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_idrareatype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_idrareatype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_IDR_AREATYPE_UNSPECIFIED != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiIdrAreaTypeT - Default testcase */ { SaHpiIdrAreaTypeT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_idrareatype(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiIdrAreaTypeT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiIdrAreaTypeT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_idrareatype(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiIdrAreaTypeT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_idrareatype(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiIdrFieldTypeT - SAHPI_IDR_FIELDTYPE_CHASSIS_TYPE testcase */ { SaHpiIdrFieldTypeT value = SAHPI_IDR_FIELDTYPE_CHASSIS_TYPE; SaHpiIdrFieldTypeT enum_type; expected_str = "CHASSIS_TYPE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_idrfieldtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_idrfieldtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_IDR_FIELDTYPE_CHASSIS_TYPE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiIdrFieldTypeT - SAHPI_IDR_FIELDTYPE_MFG_DATETIME testcase */ { SaHpiIdrFieldTypeT value = SAHPI_IDR_FIELDTYPE_MFG_DATETIME; SaHpiIdrFieldTypeT enum_type; expected_str = "MFG_DATETIME"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_idrfieldtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_idrfieldtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_IDR_FIELDTYPE_MFG_DATETIME != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiIdrFieldTypeT - SAHPI_IDR_FIELDTYPE_MANUFACTURER testcase */ { SaHpiIdrFieldTypeT value = SAHPI_IDR_FIELDTYPE_MANUFACTURER; SaHpiIdrFieldTypeT enum_type; expected_str = "MANUFACTURER"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_idrfieldtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_idrfieldtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_IDR_FIELDTYPE_MANUFACTURER != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiIdrFieldTypeT - SAHPI_IDR_FIELDTYPE_PRODUCT_NAME testcase */ { SaHpiIdrFieldTypeT value = SAHPI_IDR_FIELDTYPE_PRODUCT_NAME; SaHpiIdrFieldTypeT enum_type; expected_str = "PRODUCT_NAME"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_idrfieldtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_idrfieldtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_IDR_FIELDTYPE_PRODUCT_NAME != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiIdrFieldTypeT - SAHPI_IDR_FIELDTYPE_PRODUCT_VERSION testcase */ { SaHpiIdrFieldTypeT value = SAHPI_IDR_FIELDTYPE_PRODUCT_VERSION; SaHpiIdrFieldTypeT enum_type; expected_str = "PRODUCT_VERSION"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_idrfieldtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_idrfieldtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_IDR_FIELDTYPE_PRODUCT_VERSION != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiIdrFieldTypeT - SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER testcase */ { SaHpiIdrFieldTypeT value = SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER; SaHpiIdrFieldTypeT enum_type; expected_str = "SERIAL_NUMBER"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_idrfieldtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_idrfieldtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiIdrFieldTypeT - SAHPI_IDR_FIELDTYPE_PART_NUMBER testcase */ { SaHpiIdrFieldTypeT value = SAHPI_IDR_FIELDTYPE_PART_NUMBER; SaHpiIdrFieldTypeT enum_type; expected_str = "PART_NUMBER"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_idrfieldtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_idrfieldtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_IDR_FIELDTYPE_PART_NUMBER != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiIdrFieldTypeT - SAHPI_IDR_FIELDTYPE_FILE_ID testcase */ { SaHpiIdrFieldTypeT value = SAHPI_IDR_FIELDTYPE_FILE_ID; SaHpiIdrFieldTypeT enum_type; expected_str = "FILE_ID"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_idrfieldtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_idrfieldtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_IDR_FIELDTYPE_FILE_ID != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiIdrFieldTypeT - SAHPI_IDR_FIELDTYPE_ASSET_TAG testcase */ { SaHpiIdrFieldTypeT value = SAHPI_IDR_FIELDTYPE_ASSET_TAG; SaHpiIdrFieldTypeT enum_type; expected_str = "ASSET_TAG"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_idrfieldtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_idrfieldtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_IDR_FIELDTYPE_ASSET_TAG != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiIdrFieldTypeT - SAHPI_IDR_FIELDTYPE_CUSTOM testcase */ { SaHpiIdrFieldTypeT value = SAHPI_IDR_FIELDTYPE_CUSTOM; SaHpiIdrFieldTypeT enum_type; expected_str = "CUSTOM"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_idrfieldtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_idrfieldtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_IDR_FIELDTYPE_CUSTOM != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiIdrFieldTypeT - SAHPI_IDR_FIELDTYPE_UNSPECIFIED testcase */ { SaHpiIdrFieldTypeT value = SAHPI_IDR_FIELDTYPE_UNSPECIFIED; SaHpiIdrFieldTypeT enum_type; expected_str = "UNSPECIFIED"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_idrfieldtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_idrfieldtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_IDR_FIELDTYPE_UNSPECIFIED != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiIdrFieldTypeT - Default testcase */ { SaHpiIdrFieldTypeT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_idrfieldtype(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiIdrFieldTypeT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiIdrFieldTypeT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_idrfieldtype(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiIdrFieldTypeT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_idrfieldtype(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiWatchdogActionT - SAHPI_WA_NO_ACTION testcase */ { SaHpiWatchdogActionT value = SAHPI_WA_NO_ACTION; SaHpiWatchdogActionT enum_type; expected_str = "NO_ACTION"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_watchdogaction(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_watchdogaction(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_WA_NO_ACTION != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiWatchdogActionT - SAHPI_WA_RESET testcase */ { SaHpiWatchdogActionT value = SAHPI_WA_RESET; SaHpiWatchdogActionT enum_type; expected_str = "RESET"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_watchdogaction(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_watchdogaction(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_WA_RESET != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiWatchdogActionT - SAHPI_WA_POWER_DOWN testcase */ { SaHpiWatchdogActionT value = SAHPI_WA_POWER_DOWN; SaHpiWatchdogActionT enum_type; expected_str = "POWER_DOWN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_watchdogaction(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_watchdogaction(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_WA_POWER_DOWN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiWatchdogActionT - SAHPI_WA_POWER_CYCLE testcase */ { SaHpiWatchdogActionT value = SAHPI_WA_POWER_CYCLE; SaHpiWatchdogActionT enum_type; expected_str = "POWER_CYCLE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_watchdogaction(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_watchdogaction(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_WA_POWER_CYCLE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiWatchdogActionT - Default testcase */ { SaHpiWatchdogActionT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_watchdogaction(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiWatchdogActionT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiWatchdogActionT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_watchdogaction(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiWatchdogActionT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_watchdogaction(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiWatchdogActionEventT - SAHPI_WAE_NO_ACTION testcase */ { SaHpiWatchdogActionEventT value = SAHPI_WAE_NO_ACTION; SaHpiWatchdogActionEventT enum_type; expected_str = "NO_ACTION"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_watchdogactionevent(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_watchdogactionevent(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_WAE_NO_ACTION != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiWatchdogActionEventT - SAHPI_WAE_RESET testcase */ { SaHpiWatchdogActionEventT value = SAHPI_WAE_RESET; SaHpiWatchdogActionEventT enum_type; expected_str = "RESET"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_watchdogactionevent(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_watchdogactionevent(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_WAE_RESET != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiWatchdogActionEventT - SAHPI_WAE_POWER_DOWN testcase */ { SaHpiWatchdogActionEventT value = SAHPI_WAE_POWER_DOWN; SaHpiWatchdogActionEventT enum_type; expected_str = "POWER_DOWN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_watchdogactionevent(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_watchdogactionevent(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_WAE_POWER_DOWN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiWatchdogActionEventT - SAHPI_WAE_POWER_CYCLE testcase */ { SaHpiWatchdogActionEventT value = SAHPI_WAE_POWER_CYCLE; SaHpiWatchdogActionEventT enum_type; expected_str = "POWER_CYCLE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_watchdogactionevent(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_watchdogactionevent(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_WAE_POWER_CYCLE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiWatchdogActionEventT - SAHPI_WAE_TIMER_INT testcase */ { SaHpiWatchdogActionEventT value = SAHPI_WAE_TIMER_INT; SaHpiWatchdogActionEventT enum_type; expected_str = "TIMER_INT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_watchdogactionevent(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_watchdogactionevent(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_WAE_TIMER_INT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiWatchdogActionEventT - Default testcase */ { SaHpiWatchdogActionEventT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_watchdogactionevent(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiWatchdogActionEventT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiWatchdogActionEventT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_watchdogactionevent(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiWatchdogActionEventT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_watchdogactionevent(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiWatchdogPretimerInterruptT - SAHPI_WPI_NONE testcase */ { SaHpiWatchdogPretimerInterruptT value = SAHPI_WPI_NONE; SaHpiWatchdogPretimerInterruptT enum_type; expected_str = "NONE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_watchdogpretimerinterrupt(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_watchdogpretimerinterrupt(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_WPI_NONE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiWatchdogPretimerInterruptT - SAHPI_WPI_SMI testcase */ { SaHpiWatchdogPretimerInterruptT value = SAHPI_WPI_SMI; SaHpiWatchdogPretimerInterruptT enum_type; expected_str = "SMI"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_watchdogpretimerinterrupt(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_watchdogpretimerinterrupt(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_WPI_SMI != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiWatchdogPretimerInterruptT - SAHPI_WPI_NMI testcase */ { SaHpiWatchdogPretimerInterruptT value = SAHPI_WPI_NMI; SaHpiWatchdogPretimerInterruptT enum_type; expected_str = "NMI"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_watchdogpretimerinterrupt(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_watchdogpretimerinterrupt(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_WPI_NMI != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiWatchdogPretimerInterruptT - SAHPI_WPI_MESSAGE_INTERRUPT testcase */ { SaHpiWatchdogPretimerInterruptT value = SAHPI_WPI_MESSAGE_INTERRUPT; SaHpiWatchdogPretimerInterruptT enum_type; expected_str = "MESSAGE_INTERRUPT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_watchdogpretimerinterrupt(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_watchdogpretimerinterrupt(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_WPI_MESSAGE_INTERRUPT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiWatchdogPretimerInterruptT - SAHPI_WPI_OEM testcase */ { SaHpiWatchdogPretimerInterruptT value = SAHPI_WPI_OEM; SaHpiWatchdogPretimerInterruptT enum_type; expected_str = "OEM"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_watchdogpretimerinterrupt(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_watchdogpretimerinterrupt(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_WPI_OEM != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiWatchdogPretimerInterruptT - Default testcase */ { SaHpiWatchdogPretimerInterruptT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_watchdogpretimerinterrupt(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiWatchdogPretimerInterruptT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiWatchdogPretimerInterruptT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_watchdogpretimerinterrupt(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiWatchdogPretimerInterruptT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_watchdogpretimerinterrupt(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiWatchdogTimerUseT - SAHPI_WTU_NONE testcase */ { SaHpiWatchdogTimerUseT value = SAHPI_WTU_NONE; SaHpiWatchdogTimerUseT enum_type; expected_str = "NONE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_watchdogtimeruse(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_watchdogtimeruse(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_WTU_NONE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiWatchdogTimerUseT - SAHPI_WTU_BIOS_FRB2 testcase */ { SaHpiWatchdogTimerUseT value = SAHPI_WTU_BIOS_FRB2; SaHpiWatchdogTimerUseT enum_type; expected_str = "BIOS_FRB2"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_watchdogtimeruse(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_watchdogtimeruse(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_WTU_BIOS_FRB2 != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiWatchdogTimerUseT - SAHPI_WTU_BIOS_POST testcase */ { SaHpiWatchdogTimerUseT value = SAHPI_WTU_BIOS_POST; SaHpiWatchdogTimerUseT enum_type; expected_str = "BIOS_POST"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_watchdogtimeruse(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_watchdogtimeruse(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_WTU_BIOS_POST != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiWatchdogTimerUseT - SAHPI_WTU_OS_LOAD testcase */ { SaHpiWatchdogTimerUseT value = SAHPI_WTU_OS_LOAD; SaHpiWatchdogTimerUseT enum_type; expected_str = "OS_LOAD"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_watchdogtimeruse(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_watchdogtimeruse(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_WTU_OS_LOAD != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiWatchdogTimerUseT - SAHPI_WTU_SMS_OS testcase */ { SaHpiWatchdogTimerUseT value = SAHPI_WTU_SMS_OS; SaHpiWatchdogTimerUseT enum_type; expected_str = "SMS_OS"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_watchdogtimeruse(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_watchdogtimeruse(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_WTU_SMS_OS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiWatchdogTimerUseT - SAHPI_WTU_OEM testcase */ { SaHpiWatchdogTimerUseT value = SAHPI_WTU_OEM; SaHpiWatchdogTimerUseT enum_type; expected_str = "OEM"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_watchdogtimeruse(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_watchdogtimeruse(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_WTU_OEM != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiWatchdogTimerUseT - SAHPI_WTU_UNSPECIFIED testcase */ { SaHpiWatchdogTimerUseT value = SAHPI_WTU_UNSPECIFIED; SaHpiWatchdogTimerUseT enum_type; expected_str = "UNSPECIFIED"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_watchdogtimeruse(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_watchdogtimeruse(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_WTU_UNSPECIFIED != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiWatchdogTimerUseT - Default testcase */ { SaHpiWatchdogTimerUseT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_watchdogtimeruse(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiWatchdogTimerUseT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiWatchdogTimerUseT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_watchdogtimeruse(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiWatchdogTimerUseT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_watchdogtimeruse(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiHsIndicatorStateT - SAHPI_HS_INDICATOR_OFF testcase */ { SaHpiHsIndicatorStateT value = SAHPI_HS_INDICATOR_OFF; SaHpiHsIndicatorStateT enum_type; expected_str = "OFF"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_hsindicatorstate(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_hsindicatorstate(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_HS_INDICATOR_OFF != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiHsIndicatorStateT - SAHPI_HS_INDICATOR_ON testcase */ { SaHpiHsIndicatorStateT value = SAHPI_HS_INDICATOR_ON; SaHpiHsIndicatorStateT enum_type; expected_str = "ON"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_hsindicatorstate(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_hsindicatorstate(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_HS_INDICATOR_ON != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiHsIndicatorStateT - Default testcase */ { SaHpiHsIndicatorStateT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_hsindicatorstate(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiHsIndicatorStateT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiHsIndicatorStateT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_hsindicatorstate(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiHsIndicatorStateT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_hsindicatorstate(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiHsActionT - SAHPI_HS_ACTION_INSERTION testcase */ { SaHpiHsActionT value = SAHPI_HS_ACTION_INSERTION; SaHpiHsActionT enum_type; expected_str = "INSERTION"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_hsaction(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_hsaction(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_HS_ACTION_INSERTION != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiHsActionT - SAHPI_HS_ACTION_EXTRACTION testcase */ { SaHpiHsActionT value = SAHPI_HS_ACTION_EXTRACTION; SaHpiHsActionT enum_type; expected_str = "EXTRACTION"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_hsaction(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_hsaction(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_HS_ACTION_EXTRACTION != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiHsActionT - Default testcase */ { SaHpiHsActionT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_hsaction(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiHsActionT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiHsActionT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_hsaction(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiHsActionT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_hsaction(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiHsStateT - SAHPI_HS_STATE_INACTIVE testcase */ { SaHpiHsStateT value = SAHPI_HS_STATE_INACTIVE; SaHpiHsStateT enum_type; expected_str = "INACTIVE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_hsstate(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_hsstate(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_HS_STATE_INACTIVE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiHsStateT - SAHPI_HS_STATE_INSERTION_PENDING testcase */ { SaHpiHsStateT value = SAHPI_HS_STATE_INSERTION_PENDING; SaHpiHsStateT enum_type; expected_str = "INSERTION_PENDING"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_hsstate(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_hsstate(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_HS_STATE_INSERTION_PENDING != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiHsStateT - SAHPI_HS_STATE_ACTIVE testcase */ { SaHpiHsStateT value = SAHPI_HS_STATE_ACTIVE; SaHpiHsStateT enum_type; expected_str = "ACTIVE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_hsstate(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_hsstate(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_HS_STATE_ACTIVE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiHsStateT - SAHPI_HS_STATE_EXTRACTION_PENDING testcase */ { SaHpiHsStateT value = SAHPI_HS_STATE_EXTRACTION_PENDING; SaHpiHsStateT enum_type; expected_str = "EXTRACTION_PENDING"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_hsstate(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_hsstate(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_HS_STATE_EXTRACTION_PENDING != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiHsStateT - SAHPI_HS_STATE_NOT_PRESENT testcase */ { SaHpiHsStateT value = SAHPI_HS_STATE_NOT_PRESENT; SaHpiHsStateT enum_type; expected_str = "NOT_PRESENT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_hsstate(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_hsstate(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_HS_STATE_NOT_PRESENT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiHsStateT - Default testcase */ { SaHpiHsStateT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_hsstate(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiHsStateT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiHsStateT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_hsstate(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiHsStateT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_hsstate(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiSeverityT - SAHPI_CRITICAL testcase */ { SaHpiSeverityT value = SAHPI_CRITICAL; SaHpiSeverityT enum_type; expected_str = "CRITICAL"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_severity(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_severity(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CRITICAL != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSeverityT - SAHPI_MAJOR testcase */ { SaHpiSeverityT value = SAHPI_MAJOR; SaHpiSeverityT enum_type; expected_str = "MAJOR"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_severity(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_severity(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_MAJOR != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSeverityT - SAHPI_MINOR testcase */ { SaHpiSeverityT value = SAHPI_MINOR; SaHpiSeverityT enum_type; expected_str = "MINOR"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_severity(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_severity(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_MINOR != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSeverityT - SAHPI_INFORMATIONAL testcase */ { SaHpiSeverityT value = SAHPI_INFORMATIONAL; SaHpiSeverityT enum_type; expected_str = "INFORMATIONAL"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_severity(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_severity(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_INFORMATIONAL != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSeverityT - SAHPI_OK testcase */ { SaHpiSeverityT value = SAHPI_OK; SaHpiSeverityT enum_type; expected_str = "OK"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_severity(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_severity(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_OK != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSeverityT - SAHPI_DEBUG testcase */ { SaHpiSeverityT value = SAHPI_DEBUG; SaHpiSeverityT enum_type; expected_str = "DEBUG"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_severity(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_severity(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_DEBUG != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSeverityT - SAHPI_ALL_SEVERITIES testcase */ { SaHpiSeverityT value = SAHPI_ALL_SEVERITIES; SaHpiSeverityT enum_type; expected_str = "ALL_SEVERITIES"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_severity(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_severity(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ALL_SEVERITIES != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSeverityT - Default testcase */ { SaHpiSeverityT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_severity(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiSeverityT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiSeverityT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_severity(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiSeverityT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_severity(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiResourceEventTypeT - SAHPI_RESE_RESOURCE_FAILURE testcase */ { SaHpiResourceEventTypeT value = SAHPI_RESE_RESOURCE_FAILURE; SaHpiResourceEventTypeT enum_type; expected_str = "FAILURE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_resourceeventtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_resourceeventtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_RESE_RESOURCE_FAILURE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiResourceEventTypeT - SAHPI_RESE_RESOURCE_RESTORED testcase */ { SaHpiResourceEventTypeT value = SAHPI_RESE_RESOURCE_RESTORED; SaHpiResourceEventTypeT enum_type; expected_str = "RESTORED"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_resourceeventtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_resourceeventtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_RESE_RESOURCE_RESTORED != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiResourceEventTypeT - SAHPI_RESE_RESOURCE_ADDED testcase */ { SaHpiResourceEventTypeT value = SAHPI_RESE_RESOURCE_ADDED; SaHpiResourceEventTypeT enum_type; expected_str = "ADDED"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_resourceeventtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_resourceeventtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_RESE_RESOURCE_ADDED != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiResourceEventTypeT - Default testcase */ { SaHpiResourceEventTypeT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_resourceeventtype(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiResourceEventTypeT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiResourceEventTypeT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_resourceeventtype(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiResourceEventTypeT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_resourceeventtype(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiDomainEventTypeT - SAHPI_DOMAIN_REF_ADDED testcase */ { SaHpiDomainEventTypeT value = SAHPI_DOMAIN_REF_ADDED; SaHpiDomainEventTypeT enum_type; expected_str = "ADDED"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_domaineventtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_domaineventtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_DOMAIN_REF_ADDED != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiDomainEventTypeT - SAHPI_DOMAIN_REF_REMOVED testcase */ { SaHpiDomainEventTypeT value = SAHPI_DOMAIN_REF_REMOVED; SaHpiDomainEventTypeT enum_type; expected_str = "REMOVED"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_domaineventtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_domaineventtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_DOMAIN_REF_REMOVED != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiDomainEventTypeT - Default testcase */ { SaHpiDomainEventTypeT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_domaineventtype(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiDomainEventTypeT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiDomainEventTypeT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_domaineventtype(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiDomainEventTypeT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_domaineventtype(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiSwEventTypeT - SAHPI_HPIE_AUDIT testcase */ { SaHpiSwEventTypeT value = SAHPI_HPIE_AUDIT; SaHpiSwEventTypeT enum_type; expected_str = "AUDIT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sweventtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sweventtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_HPIE_AUDIT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSwEventTypeT - SAHPI_HPIE_STARTUP testcase */ { SaHpiSwEventTypeT value = SAHPI_HPIE_STARTUP; SaHpiSwEventTypeT enum_type; expected_str = "STARTUP"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sweventtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sweventtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_HPIE_STARTUP != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSwEventTypeT - SAHPI_HPIE_OTHER testcase */ { SaHpiSwEventTypeT value = SAHPI_HPIE_OTHER; SaHpiSwEventTypeT enum_type; expected_str = "OTHER"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sweventtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sweventtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_HPIE_OTHER != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSwEventTypeT - Default testcase */ { SaHpiSwEventTypeT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_sweventtype(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiSwEventTypeT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiSwEventTypeT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_sweventtype(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiSwEventTypeT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_sweventtype(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiEventTypeT - SAHPI_ET_RESOURCE testcase */ { SaHpiEventTypeT value = SAHPI_ET_RESOURCE; SaHpiEventTypeT enum_type; expected_str = "RESOURCE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_eventtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_eventtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ET_RESOURCE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEventTypeT - SAHPI_ET_DOMAIN testcase */ { SaHpiEventTypeT value = SAHPI_ET_DOMAIN; SaHpiEventTypeT enum_type; expected_str = "DOMAIN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_eventtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_eventtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ET_DOMAIN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEventTypeT - SAHPI_ET_SENSOR testcase */ { SaHpiEventTypeT value = SAHPI_ET_SENSOR; SaHpiEventTypeT enum_type; expected_str = "SENSOR"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_eventtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_eventtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ET_SENSOR != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEventTypeT - SAHPI_ET_SENSOR_ENABLE_CHANGE testcase */ { SaHpiEventTypeT value = SAHPI_ET_SENSOR_ENABLE_CHANGE; SaHpiEventTypeT enum_type; expected_str = "SENSOR_ENABLE_CHANGE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_eventtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_eventtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ET_SENSOR_ENABLE_CHANGE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEventTypeT - SAHPI_ET_HOTSWAP testcase */ { SaHpiEventTypeT value = SAHPI_ET_HOTSWAP; SaHpiEventTypeT enum_type; expected_str = "HOTSWAP"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_eventtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_eventtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ET_HOTSWAP != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEventTypeT - SAHPI_ET_WATCHDOG testcase */ { SaHpiEventTypeT value = SAHPI_ET_WATCHDOG; SaHpiEventTypeT enum_type; expected_str = "WATCHDOG"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_eventtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_eventtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ET_WATCHDOG != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEventTypeT - SAHPI_ET_HPI_SW testcase */ { SaHpiEventTypeT value = SAHPI_ET_HPI_SW; SaHpiEventTypeT enum_type; expected_str = "HPI_SW"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_eventtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_eventtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ET_HPI_SW != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEventTypeT - SAHPI_ET_OEM testcase */ { SaHpiEventTypeT value = SAHPI_ET_OEM; SaHpiEventTypeT enum_type; expected_str = "OEM"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_eventtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_eventtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ET_OEM != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEventTypeT - SAHPI_ET_USER testcase */ { SaHpiEventTypeT value = SAHPI_ET_USER; SaHpiEventTypeT enum_type; expected_str = "USER"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_eventtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_eventtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ET_USER != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEventTypeT - Default testcase */ { SaHpiEventTypeT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_eventtype(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiEventTypeT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiEventTypeT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_eventtype(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiEventTypeT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_eventtype(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiStatusCondTypeT - SAHPI_STATUS_COND_TYPE_SENSOR testcase */ { SaHpiStatusCondTypeT value = SAHPI_STATUS_COND_TYPE_SENSOR; SaHpiStatusCondTypeT enum_type; expected_str = "SENSOR"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_statuscondtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_statuscondtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_STATUS_COND_TYPE_SENSOR != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiStatusCondTypeT - SAHPI_STATUS_COND_TYPE_RESOURCE testcase */ { SaHpiStatusCondTypeT value = SAHPI_STATUS_COND_TYPE_RESOURCE; SaHpiStatusCondTypeT enum_type; expected_str = "RESOURCE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_statuscondtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_statuscondtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_STATUS_COND_TYPE_RESOURCE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiStatusCondTypeT - SAHPI_STATUS_COND_TYPE_OEM testcase */ { SaHpiStatusCondTypeT value = SAHPI_STATUS_COND_TYPE_OEM; SaHpiStatusCondTypeT enum_type; expected_str = "OEM"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_statuscondtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_statuscondtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_STATUS_COND_TYPE_OEM != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiStatusCondTypeT - SAHPI_STATUS_COND_TYPE_USER testcase */ { SaHpiStatusCondTypeT value = SAHPI_STATUS_COND_TYPE_USER; SaHpiStatusCondTypeT enum_type; expected_str = "USER"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_statuscondtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_statuscondtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_STATUS_COND_TYPE_USER != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiStatusCondTypeT - Default testcase */ { SaHpiStatusCondTypeT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_statuscondtype(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiStatusCondTypeT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiStatusCondTypeT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_statuscondtype(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiStatusCondTypeT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_statuscondtype(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiAnnunciatorModeT - SAHPI_ANNUNCIATOR_MODE_AUTO testcase */ { SaHpiAnnunciatorModeT value = SAHPI_ANNUNCIATOR_MODE_AUTO; SaHpiAnnunciatorModeT enum_type; expected_str = "AUTO"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_annunciatormode(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_annunciatormode(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ANNUNCIATOR_MODE_AUTO != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiAnnunciatorModeT - SAHPI_ANNUNCIATOR_MODE_USER testcase */ { SaHpiAnnunciatorModeT value = SAHPI_ANNUNCIATOR_MODE_USER; SaHpiAnnunciatorModeT enum_type; expected_str = "USER"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_annunciatormode(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_annunciatormode(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ANNUNCIATOR_MODE_USER != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiAnnunciatorModeT - SAHPI_ANNUNCIATOR_MODE_SHARED testcase */ { SaHpiAnnunciatorModeT value = SAHPI_ANNUNCIATOR_MODE_SHARED; SaHpiAnnunciatorModeT enum_type; expected_str = "SHARED"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_annunciatormode(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_annunciatormode(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ANNUNCIATOR_MODE_SHARED != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiAnnunciatorModeT - Default testcase */ { SaHpiAnnunciatorModeT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_annunciatormode(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiAnnunciatorModeT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiAnnunciatorModeT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_annunciatormode(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiAnnunciatorModeT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_annunciatormode(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiAnnunciatorTypeT - SAHPI_ANNUNCIATOR_TYPE_LED testcase */ { SaHpiAnnunciatorTypeT value = SAHPI_ANNUNCIATOR_TYPE_LED; SaHpiAnnunciatorTypeT enum_type; expected_str = "LED"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_annunciatortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_annunciatortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ANNUNCIATOR_TYPE_LED != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiAnnunciatorTypeT - SAHPI_ANNUNCIATOR_TYPE_DRY_CONTACT_CLOSURE testcase */ { SaHpiAnnunciatorTypeT value = SAHPI_ANNUNCIATOR_TYPE_DRY_CONTACT_CLOSURE; SaHpiAnnunciatorTypeT enum_type; expected_str = "DRY_CONTACT_CLOSURE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_annunciatortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_annunciatortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ANNUNCIATOR_TYPE_DRY_CONTACT_CLOSURE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiAnnunciatorTypeT - SAHPI_ANNUNCIATOR_TYPE_AUDIBLE testcase */ { SaHpiAnnunciatorTypeT value = SAHPI_ANNUNCIATOR_TYPE_AUDIBLE; SaHpiAnnunciatorTypeT enum_type; expected_str = "AUDIBLE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_annunciatortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_annunciatortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ANNUNCIATOR_TYPE_AUDIBLE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiAnnunciatorTypeT - SAHPI_ANNUNCIATOR_TYPE_LCD_DISPLAY testcase */ { SaHpiAnnunciatorTypeT value = SAHPI_ANNUNCIATOR_TYPE_LCD_DISPLAY; SaHpiAnnunciatorTypeT enum_type; expected_str = "LCD_DISPLAY"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_annunciatortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_annunciatortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ANNUNCIATOR_TYPE_LCD_DISPLAY != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiAnnunciatorTypeT - SAHPI_ANNUNCIATOR_TYPE_MESSAGE testcase */ { SaHpiAnnunciatorTypeT value = SAHPI_ANNUNCIATOR_TYPE_MESSAGE; SaHpiAnnunciatorTypeT enum_type; expected_str = "MESSAGE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_annunciatortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_annunciatortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ANNUNCIATOR_TYPE_MESSAGE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiAnnunciatorTypeT - SAHPI_ANNUNCIATOR_TYPE_COMPOSITE testcase */ { SaHpiAnnunciatorTypeT value = SAHPI_ANNUNCIATOR_TYPE_COMPOSITE; SaHpiAnnunciatorTypeT enum_type; expected_str = "COMPOSITE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_annunciatortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_annunciatortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ANNUNCIATOR_TYPE_COMPOSITE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiAnnunciatorTypeT - SAHPI_ANNUNCIATOR_TYPE_OEM testcase */ { SaHpiAnnunciatorTypeT value = SAHPI_ANNUNCIATOR_TYPE_OEM; SaHpiAnnunciatorTypeT enum_type; expected_str = "OEM"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_annunciatortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_annunciatortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ANNUNCIATOR_TYPE_OEM != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiAnnunciatorTypeT - Default testcase */ { SaHpiAnnunciatorTypeT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_annunciatortype(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiAnnunciatorTypeT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiAnnunciatorTypeT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_annunciatortype(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiAnnunciatorTypeT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_annunciatortype(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiRdrTypeT - SAHPI_NO_RECORD testcase */ { SaHpiRdrTypeT value = SAHPI_NO_RECORD; SaHpiRdrTypeT enum_type; expected_str = "NO_RECORD"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_rdrtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_rdrtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_NO_RECORD != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiRdrTypeT - SAHPI_CTRL_RDR testcase */ { SaHpiRdrTypeT value = SAHPI_CTRL_RDR; SaHpiRdrTypeT enum_type; expected_str = "CTRL_RDR"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_rdrtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_rdrtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CTRL_RDR != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiRdrTypeT - SAHPI_SENSOR_RDR testcase */ { SaHpiRdrTypeT value = SAHPI_SENSOR_RDR; SaHpiRdrTypeT enum_type; expected_str = "SENSOR_RDR"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_rdrtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_rdrtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SENSOR_RDR != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiRdrTypeT - SAHPI_INVENTORY_RDR testcase */ { SaHpiRdrTypeT value = SAHPI_INVENTORY_RDR; SaHpiRdrTypeT enum_type; expected_str = "INVENTORY_RDR"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_rdrtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_rdrtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_INVENTORY_RDR != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiRdrTypeT - SAHPI_WATCHDOG_RDR testcase */ { SaHpiRdrTypeT value = SAHPI_WATCHDOG_RDR; SaHpiRdrTypeT enum_type; expected_str = "WATCHDOG_RDR"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_rdrtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_rdrtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_WATCHDOG_RDR != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiRdrTypeT - SAHPI_ANNUNCIATOR_RDR testcase */ { SaHpiRdrTypeT value = SAHPI_ANNUNCIATOR_RDR; SaHpiRdrTypeT enum_type; expected_str = "ANNUNCIATOR_RDR"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_rdrtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_rdrtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ANNUNCIATOR_RDR != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiRdrTypeT - Default testcase */ { SaHpiRdrTypeT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_rdrtype(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiRdrTypeT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiRdrTypeT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_rdrtype(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiRdrTypeT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_rdrtype(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiParmActionT - SAHPI_DEFAULT_PARM testcase */ { SaHpiParmActionT value = SAHPI_DEFAULT_PARM; SaHpiParmActionT enum_type; expected_str = "DEFAULT_PARM"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_parmaction(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_parmaction(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_DEFAULT_PARM != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiParmActionT - SAHPI_SAVE_PARM testcase */ { SaHpiParmActionT value = SAHPI_SAVE_PARM; SaHpiParmActionT enum_type; expected_str = "SAVE_PARM"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_parmaction(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_parmaction(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SAVE_PARM != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiParmActionT - SAHPI_RESTORE_PARM testcase */ { SaHpiParmActionT value = SAHPI_RESTORE_PARM; SaHpiParmActionT enum_type; expected_str = "RESTORE_PARM"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_parmaction(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_parmaction(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_RESTORE_PARM != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiParmActionT - Default testcase */ { SaHpiParmActionT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_parmaction(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiParmActionT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiParmActionT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_parmaction(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiParmActionT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_parmaction(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiResetActionT - SAHPI_COLD_RESET testcase */ { SaHpiResetActionT value = SAHPI_COLD_RESET; SaHpiResetActionT enum_type; expected_str = "COLD_RESET"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_resetaction(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_resetaction(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_COLD_RESET != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiResetActionT - SAHPI_WARM_RESET testcase */ { SaHpiResetActionT value = SAHPI_WARM_RESET; SaHpiResetActionT enum_type; expected_str = "WARM_RESET"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_resetaction(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_resetaction(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_WARM_RESET != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiResetActionT - SAHPI_RESET_ASSERT testcase */ { SaHpiResetActionT value = SAHPI_RESET_ASSERT; SaHpiResetActionT enum_type; expected_str = "RESET_ASSERT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_resetaction(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_resetaction(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_RESET_ASSERT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiResetActionT - SAHPI_RESET_DEASSERT testcase */ { SaHpiResetActionT value = SAHPI_RESET_DEASSERT; SaHpiResetActionT enum_type; expected_str = "RESET_DEASSERT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_resetaction(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_resetaction(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_RESET_DEASSERT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiResetActionT - Default testcase */ { SaHpiResetActionT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_resetaction(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiResetActionT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiResetActionT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_resetaction(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiResetActionT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_resetaction(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiPowerStateT - SAHPI_POWER_OFF testcase */ { SaHpiPowerStateT value = SAHPI_POWER_OFF; SaHpiPowerStateT enum_type; expected_str = "OFF"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_powerstate(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_powerstate(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_POWER_OFF != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiPowerStateT - SAHPI_POWER_ON testcase */ { SaHpiPowerStateT value = SAHPI_POWER_ON; SaHpiPowerStateT enum_type; expected_str = "ON"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_powerstate(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_powerstate(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_POWER_ON != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiPowerStateT - SAHPI_POWER_CYCLE testcase */ { SaHpiPowerStateT value = SAHPI_POWER_CYCLE; SaHpiPowerStateT enum_type; expected_str = "CYCLE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_powerstate(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_powerstate(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_POWER_CYCLE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiPowerStateT - Default testcase */ { SaHpiPowerStateT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_powerstate(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiPowerStateT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiPowerStateT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_powerstate(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiPowerStateT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_powerstate(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiEventLogOverflowActionT - SAHPI_EL_OVERFLOW_DROP testcase */ { SaHpiEventLogOverflowActionT value = SAHPI_EL_OVERFLOW_DROP; SaHpiEventLogOverflowActionT enum_type; expected_str = "OVERFLOW_DROP"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_eventlogoverflowaction(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_eventlogoverflowaction(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_EL_OVERFLOW_DROP != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEventLogOverflowActionT - SAHPI_EL_OVERFLOW_OVERWRITE testcase */ { SaHpiEventLogOverflowActionT value = SAHPI_EL_OVERFLOW_OVERWRITE; SaHpiEventLogOverflowActionT enum_type; expected_str = "OVERFLOW_OVERWRITE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_eventlogoverflowaction(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_eventlogoverflowaction(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_EL_OVERFLOW_OVERWRITE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEventLogOverflowActionT - Default testcase */ { SaHpiEventLogOverflowActionT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_eventlogoverflowaction(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiEventLogOverflowActionT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiEventLogOverflowActionT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_eventlogoverflowaction(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiEventLogOverflowActionT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_eventlogoverflowaction(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaErrorT - SA_OK testcase */ { SaErrorT value = SA_OK; SaErrorT enum_type; expected_str = "SA_OK"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_error(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_error(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SA_OK != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaErrorT - SA_ERR_HPI_ERROR testcase */ { SaErrorT value = SA_ERR_HPI_ERROR; SaErrorT enum_type; expected_str = "ERROR"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_error(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_error(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SA_ERR_HPI_ERROR != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaErrorT - SA_ERR_HPI_UNSUPPORTED_API testcase */ { SaErrorT value = SA_ERR_HPI_UNSUPPORTED_API; SaErrorT enum_type; expected_str = "UNSUPPORTED_API"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_error(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_error(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SA_ERR_HPI_UNSUPPORTED_API != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaErrorT - SA_ERR_HPI_BUSY testcase */ { SaErrorT value = SA_ERR_HPI_BUSY; SaErrorT enum_type; expected_str = "BUSY"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_error(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_error(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SA_ERR_HPI_BUSY != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaErrorT - SA_ERR_HPI_INTERNAL_ERROR testcase */ { SaErrorT value = SA_ERR_HPI_INTERNAL_ERROR; SaErrorT enum_type; expected_str = "INTERNAL_ERROR"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_error(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_error(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SA_ERR_HPI_INTERNAL_ERROR != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaErrorT - SA_ERR_HPI_INVALID_CMD testcase */ { SaErrorT value = SA_ERR_HPI_INVALID_CMD; SaErrorT enum_type; expected_str = "INVALID_CMD"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_error(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_error(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SA_ERR_HPI_INVALID_CMD != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaErrorT - SA_ERR_HPI_TIMEOUT testcase */ { SaErrorT value = SA_ERR_HPI_TIMEOUT; SaErrorT enum_type; expected_str = "TIMEOUT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_error(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_error(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SA_ERR_HPI_TIMEOUT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaErrorT - SA_ERR_HPI_OUT_OF_SPACE testcase */ { SaErrorT value = SA_ERR_HPI_OUT_OF_SPACE; SaErrorT enum_type; expected_str = "OUT_OF_SPACE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_error(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_error(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SA_ERR_HPI_OUT_OF_SPACE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaErrorT - SA_ERR_HPI_OUT_OF_MEMORY testcase */ { SaErrorT value = SA_ERR_HPI_OUT_OF_MEMORY; SaErrorT enum_type; expected_str = "OUT_OF_MEMORY"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_error(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_error(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SA_ERR_HPI_OUT_OF_MEMORY != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaErrorT - SA_ERR_HPI_INVALID_PARAMS testcase */ { SaErrorT value = SA_ERR_HPI_INVALID_PARAMS; SaErrorT enum_type; expected_str = "INVALID_PARAMS"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_error(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_error(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SA_ERR_HPI_INVALID_PARAMS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaErrorT - SA_ERR_HPI_INVALID_DATA testcase */ { SaErrorT value = SA_ERR_HPI_INVALID_DATA; SaErrorT enum_type; expected_str = "INVALID_DATA"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_error(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_error(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SA_ERR_HPI_INVALID_DATA != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaErrorT - SA_ERR_HPI_NOT_PRESENT testcase */ { SaErrorT value = SA_ERR_HPI_NOT_PRESENT; SaErrorT enum_type; expected_str = "NOT_PRESENT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_error(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_error(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SA_ERR_HPI_NOT_PRESENT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaErrorT - SA_ERR_HPI_NO_RESPONSE testcase */ { SaErrorT value = SA_ERR_HPI_NO_RESPONSE; SaErrorT enum_type; expected_str = "NO_RESPONSE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_error(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_error(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SA_ERR_HPI_NO_RESPONSE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaErrorT - SA_ERR_HPI_DUPLICATE testcase */ { SaErrorT value = SA_ERR_HPI_DUPLICATE; SaErrorT enum_type; expected_str = "DUPLICATE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_error(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_error(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SA_ERR_HPI_DUPLICATE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaErrorT - SA_ERR_HPI_INVALID_SESSION testcase */ { SaErrorT value = SA_ERR_HPI_INVALID_SESSION; SaErrorT enum_type; expected_str = "INVALID_SESSION"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_error(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_error(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SA_ERR_HPI_INVALID_SESSION != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaErrorT - SA_ERR_HPI_INVALID_DOMAIN testcase */ { SaErrorT value = SA_ERR_HPI_INVALID_DOMAIN; SaErrorT enum_type; expected_str = "INVALID_DOMAIN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_error(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_error(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SA_ERR_HPI_INVALID_DOMAIN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaErrorT - SA_ERR_HPI_INVALID_RESOURCE testcase */ { SaErrorT value = SA_ERR_HPI_INVALID_RESOURCE; SaErrorT enum_type; expected_str = "INVALID_RESOURCE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_error(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_error(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SA_ERR_HPI_INVALID_RESOURCE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaErrorT - SA_ERR_HPI_INVALID_REQUEST testcase */ { SaErrorT value = SA_ERR_HPI_INVALID_REQUEST; SaErrorT enum_type; expected_str = "INVALID_REQUEST"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_error(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_error(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SA_ERR_HPI_INVALID_REQUEST != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaErrorT - SA_ERR_HPI_ENTITY_NOT_PRESENT testcase */ { SaErrorT value = SA_ERR_HPI_ENTITY_NOT_PRESENT; SaErrorT enum_type; expected_str = "ENTITY_NOT_PRESENT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_error(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_error(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SA_ERR_HPI_ENTITY_NOT_PRESENT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaErrorT - SA_ERR_HPI_READ_ONLY testcase */ { SaErrorT value = SA_ERR_HPI_READ_ONLY; SaErrorT enum_type; expected_str = "READ_ONLY"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_error(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_error(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SA_ERR_HPI_READ_ONLY != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaErrorT - SA_ERR_HPI_CAPABILITY testcase */ { SaErrorT value = SA_ERR_HPI_CAPABILITY; SaErrorT enum_type; expected_str = "CAPABILITY"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_error(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_error(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SA_ERR_HPI_CAPABILITY != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaErrorT - SA_ERR_HPI_UNKNOWN testcase */ { SaErrorT value = SA_ERR_HPI_UNKNOWN; SaErrorT enum_type; expected_str = "UNKNOWN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_error(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_error(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SA_ERR_HPI_UNKNOWN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaErrorT - Default testcase */ { SaErrorT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_error(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaErrorT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaErrorT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_error(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaErrorT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_error(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiEventCategoryT - SAHPI_EC_UNSPECIFIED testcase */ { SaHpiEventCategoryT value = SAHPI_EC_UNSPECIFIED; SaHpiEventCategoryT enum_type; expected_str = "UNSPECIFIED"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_eventcategory(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_eventcategory(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_EC_UNSPECIFIED != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEventCategoryT - SAHPI_EC_THRESHOLD testcase */ { SaHpiEventCategoryT value = SAHPI_EC_THRESHOLD; SaHpiEventCategoryT enum_type; expected_str = "THRESHOLD"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_eventcategory(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_eventcategory(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_EC_THRESHOLD != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEventCategoryT - SAHPI_EC_USAGE testcase */ { SaHpiEventCategoryT value = SAHPI_EC_USAGE; SaHpiEventCategoryT enum_type; expected_str = "USAGE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_eventcategory(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_eventcategory(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_EC_USAGE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEventCategoryT - SAHPI_EC_STATE testcase */ { SaHpiEventCategoryT value = SAHPI_EC_STATE; SaHpiEventCategoryT enum_type; expected_str = "STATE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_eventcategory(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_eventcategory(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_EC_STATE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEventCategoryT - SAHPI_EC_PRED_FAIL testcase */ { SaHpiEventCategoryT value = SAHPI_EC_PRED_FAIL; SaHpiEventCategoryT enum_type; expected_str = "PRED_FAIL"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_eventcategory(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_eventcategory(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_EC_PRED_FAIL != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEventCategoryT - SAHPI_EC_LIMIT testcase */ { SaHpiEventCategoryT value = SAHPI_EC_LIMIT; SaHpiEventCategoryT enum_type; expected_str = "LIMIT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_eventcategory(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_eventcategory(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_EC_LIMIT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEventCategoryT - SAHPI_EC_PERFORMANCE testcase */ { SaHpiEventCategoryT value = SAHPI_EC_PERFORMANCE; SaHpiEventCategoryT enum_type; expected_str = "PERFORMANCE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_eventcategory(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_eventcategory(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_EC_PERFORMANCE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEventCategoryT - SAHPI_EC_SEVERITY testcase */ { SaHpiEventCategoryT value = SAHPI_EC_SEVERITY; SaHpiEventCategoryT enum_type; expected_str = "SEVERITY"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_eventcategory(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_eventcategory(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_EC_SEVERITY != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEventCategoryT - SAHPI_EC_PRESENCE testcase */ { SaHpiEventCategoryT value = SAHPI_EC_PRESENCE; SaHpiEventCategoryT enum_type; expected_str = "PRESENCE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_eventcategory(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_eventcategory(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_EC_PRESENCE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEventCategoryT - SAHPI_EC_ENABLE testcase */ { SaHpiEventCategoryT value = SAHPI_EC_ENABLE; SaHpiEventCategoryT enum_type; expected_str = "ENABLE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_eventcategory(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_eventcategory(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_EC_ENABLE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEventCategoryT - SAHPI_EC_AVAILABILITY testcase */ { SaHpiEventCategoryT value = SAHPI_EC_AVAILABILITY; SaHpiEventCategoryT enum_type; expected_str = "AVAILABILITY"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_eventcategory(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_eventcategory(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_EC_AVAILABILITY != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEventCategoryT - SAHPI_EC_REDUNDANCY testcase */ { SaHpiEventCategoryT value = SAHPI_EC_REDUNDANCY; SaHpiEventCategoryT enum_type; expected_str = "REDUNDANCY"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_eventcategory(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_eventcategory(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_EC_REDUNDANCY != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEventCategoryT - SAHPI_EC_SENSOR_SPECIFIC testcase */ { SaHpiEventCategoryT value = SAHPI_EC_SENSOR_SPECIFIC; SaHpiEventCategoryT enum_type; expected_str = "SENSOR_SPECIFIC"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_eventcategory(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_eventcategory(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_EC_SENSOR_SPECIFIC != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEventCategoryT - SAHPI_EC_GENERIC testcase */ { SaHpiEventCategoryT value = SAHPI_EC_GENERIC; SaHpiEventCategoryT enum_type; expected_str = "GENERIC"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_eventcategory(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_eventcategory(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_EC_GENERIC != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEventCategoryT - Default testcase */ { SaHpiEventCategoryT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_eventcategory(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiEventCategoryT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiEventCategoryT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_eventcategory(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiEventCategoryT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_eventcategory(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } return 0; } openhpi-3.6.1/utils/t/sahpi/sahpi_struct_rptentry_test.c0000644000175100017510000001036112575647301022557 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * pdphan */ #include #include #include #include #include int main(int argc, char **argv) { SaErrorT err; SaHpiBoolT test1Fail = SAHPI_FALSE, test2Fail = SAHPI_FALSE, test3Fail = SAHPI_FALSE, test4Fail = SAHPI_FALSE, test5Fail = SAHPI_FALSE; SaHpiRptEntryT thisrptentry = { .EntryId = 82, .ResourceId = 101, .ResourceInfo = { .ResourceRev = 2, .SpecificVer = 22, .DeviceSupport = 222, .ManufacturerId = 5, .ProductId = 2222, .FirmwareMajorRev = 42, .FirmwareMinorRev = 52, .AuxFirmwareRev = 62, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_SUBBOARD_CARRIER_BLADE, .EntityLocation = 14 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 15 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 16 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 17 } }, .ResourceCapabilities = ( SAHPI_CAPABILITY_AGGREGATE_STATUS | SAHPI_CAPABILITY_CONFIGURATION | SAHPI_CAPABILITY_MANAGED_HOTSWAP | SAHPI_CAPABILITY_WATCHDOG | SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_ANNUNCIATOR | SAHPI_CAPABILITY_POWER | SAHPI_CAPABILITY_RESET), .HotSwapCapabilities = SAHPI_HS_CAPABILITY_INDICATOR_SUPPORTED, .ResourceSeverity = SAHPI_INFORMATIONAL, .ResourceFailed = SAHPI_FALSE, .ResourceTag = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 26, /* Incorrectly set on purpose */ .Data = "This is a test!" } }; FILE *fp; const char *name = "/tmp/rptentrytmp"; const char *mode = "a"; fp = fopen(name, mode); if (fp == NULL) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } /* ------------------------------------------------ */ /* NULL Pointer tests */ /* ------------------------------------------------ */ err = oh_fprint_rptentry(NULL , &thisrptentry, 0); if (err != SA_ERR_HPI_INVALID_PARAMS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); test1Fail = SAHPI_TRUE; } err = oh_fprint_rptentry(fp, NULL, 3); if (err != SA_ERR_HPI_INVALID_PARAMS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); test2Fail = SAHPI_TRUE; } err = oh_fprint_rptentry(NULL , NULL, 3); if (err != SA_ERR_HPI_INVALID_PARAMS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); test3Fail = SAHPI_TRUE; } /* ------------------------------------------------ */ /* Normal write to file test */ /* ------------------------------------------------ */ strncpy((char *)thisrptentry.ResourceInfo.Guid, "GUID-123", sizeof("GUID-123")); err = oh_fprint_rptentry(fp, &thisrptentry, 3); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); test4Fail = SAHPI_TRUE; } /* ------------------------------------------------ */ /* Normal write to stdout test */ /* ------------------------------------------------ */ err = oh_print_rptentry(&thisrptentry, 3); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); test5Fail = SAHPI_TRUE; } /* ------------------------------------------------ */ /* Write to invalid file handle test */ /* ------------------------------------------------ */ /* TBD */ fclose(fp); unlink(name); if (!test1Fail && !test2Fail && !test3Fail && !test4Fail && !test5Fail) return(0); else return(-1); } openhpi-3.6.1/utils/t/sahpi/sahpiatca_enum_utils_test.c0000644000175100017510000012111412575647301022300 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./SaHpi2code.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include #include #define BAD_ENUM_VALUE -1 int main(int argc, char **argv) { char *expected_str; char *str; /* AtcaHpiLedColorT - ATCAHPI_LED_COLOR_RESERVED testcase */ { AtcaHpiLedColorT value = ATCAHPI_LED_COLOR_RESERVED; AtcaHpiLedColorT enum_type; expected_str = "COLOR_RESERVED"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_atcahpiledcolor(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_atcahpiledcolor(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (ATCAHPI_LED_COLOR_RESERVED != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* AtcaHpiLedColorT - ATCAHPI_LED_COLOR_BLUE testcase */ { AtcaHpiLedColorT value = ATCAHPI_LED_COLOR_BLUE; AtcaHpiLedColorT enum_type; expected_str = "COLOR_BLUE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_atcahpiledcolor(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_atcahpiledcolor(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (ATCAHPI_LED_COLOR_BLUE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* AtcaHpiLedColorT - ATCAHPI_LED_COLOR_RED testcase */ { AtcaHpiLedColorT value = ATCAHPI_LED_COLOR_RED; AtcaHpiLedColorT enum_type; expected_str = "COLOR_RED"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_atcahpiledcolor(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_atcahpiledcolor(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (ATCAHPI_LED_COLOR_RED != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* AtcaHpiLedColorT - ATCAHPI_LED_COLOR_GREEN testcase */ { AtcaHpiLedColorT value = ATCAHPI_LED_COLOR_GREEN; AtcaHpiLedColorT enum_type; expected_str = "COLOR_GREEN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_atcahpiledcolor(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_atcahpiledcolor(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (ATCAHPI_LED_COLOR_GREEN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* AtcaHpiLedColorT - ATCAHPI_LED_COLOR_AMBER testcase */ { AtcaHpiLedColorT value = ATCAHPI_LED_COLOR_AMBER; AtcaHpiLedColorT enum_type; expected_str = "COLOR_AMBER"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_atcahpiledcolor(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_atcahpiledcolor(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (ATCAHPI_LED_COLOR_AMBER != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* AtcaHpiLedColorT - ATCAHPI_LED_COLOR_ORANGE testcase */ { AtcaHpiLedColorT value = ATCAHPI_LED_COLOR_ORANGE; AtcaHpiLedColorT enum_type; expected_str = "COLOR_ORANGE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_atcahpiledcolor(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_atcahpiledcolor(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (ATCAHPI_LED_COLOR_ORANGE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* AtcaHpiLedColorT - ATCAHPI_LED_COLOR_WHITE testcase */ { AtcaHpiLedColorT value = ATCAHPI_LED_COLOR_WHITE; AtcaHpiLedColorT enum_type; expected_str = "COLOR_WHITE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_atcahpiledcolor(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_atcahpiledcolor(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (ATCAHPI_LED_COLOR_WHITE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* AtcaHpiLedColorT - ATCAHPI_LED_COLOR_NO_CHANGE testcase */ { AtcaHpiLedColorT value = ATCAHPI_LED_COLOR_NO_CHANGE; AtcaHpiLedColorT enum_type; expected_str = "COLOR_NO_CHANGE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_atcahpiledcolor(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_atcahpiledcolor(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (ATCAHPI_LED_COLOR_NO_CHANGE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* AtcaHpiLedColorT - ATCAHPI_LED_COLOR_USE_DEFAULT testcase */ { AtcaHpiLedColorT value = ATCAHPI_LED_COLOR_USE_DEFAULT; AtcaHpiLedColorT enum_type; expected_str = "COLOR_USE_DEFAULT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_atcahpiledcolor(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_atcahpiledcolor(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (ATCAHPI_LED_COLOR_USE_DEFAULT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* AtcaHpiLedColorT - Default testcase */ { AtcaHpiLedColorT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_atcahpiledcolor(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* AtcaHpiLedColorT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; AtcaHpiLedColorT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_atcahpiledcolor(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* AtcaHpiLedColorT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_atcahpiledcolor(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* AtcaHpiResourceLedModeT - ATCAHPI_LED_AUTO testcase */ { AtcaHpiResourceLedModeT value = ATCAHPI_LED_AUTO; AtcaHpiResourceLedModeT enum_type; expected_str = "AUTO"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_atcahpiresourceledmode(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_atcahpiresourceledmode(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (ATCAHPI_LED_AUTO != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* AtcaHpiResourceLedModeT - ATCAHPI_LED_MANUAL testcase */ { AtcaHpiResourceLedModeT value = ATCAHPI_LED_MANUAL; AtcaHpiResourceLedModeT enum_type; expected_str = "MANUAL"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_atcahpiresourceledmode(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_atcahpiresourceledmode(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (ATCAHPI_LED_MANUAL != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* AtcaHpiResourceLedModeT - ATCAHPI_LED_LAMP_TEST testcase */ { AtcaHpiResourceLedModeT value = ATCAHPI_LED_LAMP_TEST; AtcaHpiResourceLedModeT enum_type; expected_str = "LAMP_TEST"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_atcahpiresourceledmode(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_atcahpiresourceledmode(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (ATCAHPI_LED_LAMP_TEST != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* AtcaHpiResourceLedModeT - Default testcase */ { AtcaHpiResourceLedModeT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_atcahpiresourceledmode(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* AtcaHpiResourceLedModeT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; AtcaHpiResourceLedModeT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_atcahpiresourceledmode(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* AtcaHpiResourceLedModeT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_atcahpiresourceledmode(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* AtcaHpiLedBrSupportT - ATCAHPI_LED_BR_SUPPORTED testcase */ { AtcaHpiLedBrSupportT value = ATCAHPI_LED_BR_SUPPORTED; AtcaHpiLedBrSupportT enum_type; expected_str = "BR_SUPPORTED"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_atcahpiledbrsupport(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_atcahpiledbrsupport(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (ATCAHPI_LED_BR_SUPPORTED != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* AtcaHpiLedBrSupportT - ATCAHPI_LED_BR_NOT_SUPPORTED testcase */ { AtcaHpiLedBrSupportT value = ATCAHPI_LED_BR_NOT_SUPPORTED; AtcaHpiLedBrSupportT enum_type; expected_str = "BR_NOT_SUPPORTED"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_atcahpiledbrsupport(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_atcahpiledbrsupport(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (ATCAHPI_LED_BR_NOT_SUPPORTED != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* AtcaHpiLedBrSupportT - ATCAHPI_LED_BR_UNKNOWN testcase */ { AtcaHpiLedBrSupportT value = ATCAHPI_LED_BR_UNKNOWN; AtcaHpiLedBrSupportT enum_type; expected_str = "BR_UNKNOWN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_atcahpiledbrsupport(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_atcahpiledbrsupport(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (ATCAHPI_LED_BR_UNKNOWN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* AtcaHpiLedBrSupportT - Default testcase */ { AtcaHpiLedBrSupportT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_atcahpiledbrsupport(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* AtcaHpiLedBrSupportT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; AtcaHpiLedBrSupportT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_atcahpiledbrsupport(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* AtcaHpiLedBrSupportT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_atcahpiledbrsupport(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* AtcaHpiEntityTypeT - ATCAHPI_ENT_POWER_ENTRY_MODULE_SLOT testcase */ { AtcaHpiEntityTypeT value = ATCAHPI_ENT_POWER_ENTRY_MODULE_SLOT; AtcaHpiEntityTypeT enum_type; expected_str = "POWER_ENTRY_MODULE_SLOT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_atcahpientitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_atcahpientitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (ATCAHPI_ENT_POWER_ENTRY_MODULE_SLOT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* AtcaHpiEntityTypeT - ATCAHPI_ENT_SHELF_FRU_DEVICE_SLOT testcase */ { AtcaHpiEntityTypeT value = ATCAHPI_ENT_SHELF_FRU_DEVICE_SLOT; AtcaHpiEntityTypeT enum_type; expected_str = "SHELF_FRU_DEVICE_SLOT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_atcahpientitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_atcahpientitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (ATCAHPI_ENT_SHELF_FRU_DEVICE_SLOT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* AtcaHpiEntityTypeT - ATCAHPI_ENT_SHELF_MANAGER_SLOT testcase */ { AtcaHpiEntityTypeT value = ATCAHPI_ENT_SHELF_MANAGER_SLOT; AtcaHpiEntityTypeT enum_type; expected_str = "SHELF_MANAGER_SLOT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_atcahpientitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_atcahpientitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (ATCAHPI_ENT_SHELF_MANAGER_SLOT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* AtcaHpiEntityTypeT - ATCAHPI_ENT_FAN_TRAY_SLOT testcase */ { AtcaHpiEntityTypeT value = ATCAHPI_ENT_FAN_TRAY_SLOT; AtcaHpiEntityTypeT enum_type; expected_str = "FAN_TRAY_SLOT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_atcahpientitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_atcahpientitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (ATCAHPI_ENT_FAN_TRAY_SLOT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* AtcaHpiEntityTypeT - ATCAHPI_ENT_FAN_FILTER_TRAY_SLOT testcase */ { AtcaHpiEntityTypeT value = ATCAHPI_ENT_FAN_FILTER_TRAY_SLOT; AtcaHpiEntityTypeT enum_type; expected_str = "FAN_FILTER_TRAY_SLOT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_atcahpientitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_atcahpientitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (ATCAHPI_ENT_FAN_FILTER_TRAY_SLOT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* AtcaHpiEntityTypeT - ATCAHPI_ENT_ALARM_SLOT testcase */ { AtcaHpiEntityTypeT value = ATCAHPI_ENT_ALARM_SLOT; AtcaHpiEntityTypeT enum_type; expected_str = "ALARM_SLOT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_atcahpientitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_atcahpientitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (ATCAHPI_ENT_ALARM_SLOT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* AtcaHpiEntityTypeT - ATCAHPI_ENT_AMC_SLOT testcase */ { AtcaHpiEntityTypeT value = ATCAHPI_ENT_AMC_SLOT; AtcaHpiEntityTypeT enum_type; expected_str = "AMC_SLOT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_atcahpientitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_atcahpientitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (ATCAHPI_ENT_AMC_SLOT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* AtcaHpiEntityTypeT - ATCAHPI_ENT_PMC_SLOT testcase */ { AtcaHpiEntityTypeT value = ATCAHPI_ENT_PMC_SLOT; AtcaHpiEntityTypeT enum_type; expected_str = "PMC_SLOT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_atcahpientitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_atcahpientitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (ATCAHPI_ENT_PMC_SLOT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* AtcaHpiEntityTypeT - ATCAHPI_ENT_RTM_SLOT testcase */ { AtcaHpiEntityTypeT value = ATCAHPI_ENT_RTM_SLOT; AtcaHpiEntityTypeT enum_type; expected_str = "RTM_SLOT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_atcahpientitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_atcahpientitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (ATCAHPI_ENT_RTM_SLOT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* AtcaHpiEntityTypeT - ATCAHPI_ENT_PICMG_FRONT_BLADE testcase */ { AtcaHpiEntityTypeT value = ATCAHPI_ENT_PICMG_FRONT_BLADE; AtcaHpiEntityTypeT enum_type; expected_str = "PICMG_FRONT_BLADE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_atcahpientitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_atcahpientitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (ATCAHPI_ENT_PICMG_FRONT_BLADE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* AtcaHpiEntityTypeT - ATCAHPI_ENT_SHELF_FRU_DEVICE testcase */ { AtcaHpiEntityTypeT value = ATCAHPI_ENT_SHELF_FRU_DEVICE; AtcaHpiEntityTypeT enum_type; expected_str = "SHELF_FRU_DEVICE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_atcahpientitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_atcahpientitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (ATCAHPI_ENT_SHELF_FRU_DEVICE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* AtcaHpiEntityTypeT - ATCAHPI_ENT_FILTRATION_UNIT testcase */ { AtcaHpiEntityTypeT value = ATCAHPI_ENT_FILTRATION_UNIT; AtcaHpiEntityTypeT enum_type; expected_str = "FILTRATION_UNIT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_atcahpientitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_atcahpientitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (ATCAHPI_ENT_FILTRATION_UNIT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* AtcaHpiEntityTypeT - ATCAHPI_ENT_AMC testcase */ { AtcaHpiEntityTypeT value = ATCAHPI_ENT_AMC; AtcaHpiEntityTypeT enum_type; expected_str = "AMC"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_atcahpientitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_atcahpientitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (ATCAHPI_ENT_AMC != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* AtcaHpiEntityTypeT - Default testcase */ { AtcaHpiEntityTypeT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_atcahpientitytype(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* AtcaHpiEntityTypeT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; AtcaHpiEntityTypeT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_atcahpientitytype(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* AtcaHpiEntityTypeT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_atcahpientitytype(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } return 0; } openhpi-3.6.1/utils/t/sahpi/sahpi_struct_utils_test.c0000644000175100017510000022266712575647301022046 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #include #include #include #include #include #define UNDEFINED_MANUFACTURER -1 #define BAD_TYPE -1 int main(int argc, char **argv) { const char *expected_str; const char *str; SaErrorT expected_err, err; SaHpiTextBufferT buffer, bad_buffer; /************************************ * oh_decode_manufacturerid testcases ************************************/ { /* oh_decode_manufacturerid: SAHPI_MANUFACTURER_ID_UNSPECIFIED testcase */ SaHpiManufacturerIdT mid; expected_str = "Unspecified"; mid = SAHPI_MANUFACTURER_ID_UNSPECIFIED; err = oh_decode_manufacturerid(mid, &buffer); if (strcmp(expected_str, (char *)buffer.Data) || err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s; Error=%d\n", buffer.Data, expected_str, err); return -1; } /* oh_decode_manufacturerid: IBM testcase */ expected_str = "IBM"; mid = 20944; err = oh_decode_manufacturerid(mid, &buffer); if (strcmp(expected_str, (char *)buffer.Data) || err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s; Error=%d\n", buffer.Data, expected_str, err); return -1; } /* oh_decode_manufacturerid: Undefined manufacturer testcase */ expected_str = "Unknown"; mid = UNDEFINED_MANUFACTURER; err = oh_decode_manufacturerid(mid, &buffer); if (strcmp(expected_str, (char *)buffer.Data) || err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s; Error=%d\n", buffer.Data, expected_str, err); return -1; } /* oh_decode_manufacturerid: NULL buffer testcase */ expected_err = SA_ERR_HPI_INVALID_PARAMS; mid = UNDEFINED_MANUFACTURER; err = oh_decode_manufacturerid(mid, 0); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /*********************************************************** * oh_decode_sensorreading/oh_encode_sensorreading testcases ***********************************************************/ { SaHpiSensorDataFormatT format_default, format_test; SaHpiSensorReadingT reading_default, reading_test, encode_reading; memset(&format_default, 0, sizeof(SaHpiSensorDataFormatT)); memset(&reading_default, 0, sizeof(SaHpiSensorReadingT)); reading_default.IsSupported = SAHPI_TRUE; reading_default.Type = SAHPI_SENSOR_READING_TYPE_INT64; reading_default.Value.SensorInt64 = 20; format_default.IsSupported = SAHPI_TRUE; format_default.ReadingType = SAHPI_SENSOR_READING_TYPE_INT64; format_default.BaseUnits = SAHPI_SU_VOLTS; format_default.ModifierUnits = SAHPI_SU_UNSPECIFIED; format_default.ModifierUse = SAHPI_SMUU_NONE; format_default.Percentage = SAHPI_FALSE; /* oh_decode_sensorreading: NULL buffer testcase */ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_decode_sensorreading(reading_default, format_default, 0); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* oh_decode_sensorreading: IsSupported == FALSE testcase */ expected_err = SA_ERR_HPI_INVALID_CMD; reading_test = reading_default; format_test = format_default; format_test.IsSupported = SAHPI_FALSE; err = oh_decode_sensorreading(reading_test, format_test, &buffer); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* oh_decode_sensorreading: Bad SaHpiSensorModifierUseT testcase */ expected_err = SA_ERR_HPI_INVALID_PARAMS; reading_test = reading_default; format_test = format_default; format_test.ModifierUnits = SAHPI_SU_WEEK; format_test.ModifierUse = BAD_TYPE; err = oh_decode_sensorreading(reading_test, format_test, &buffer); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* oh_decode_sensorreading: Bad SaHpiSensorReadingT testcase */ expected_err = SA_ERR_HPI_INVALID_PARAMS; reading_test = reading_default; reading_test.Type = BAD_TYPE; format_test = format_default; format_test.ReadingType = BAD_TYPE; err = oh_decode_sensorreading(reading_test, format_test, &buffer); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* oh_decode_sensorreading: Reading Types not equal testcase */ expected_err = SA_ERR_HPI_INVALID_DATA; reading_test = reading_default; format_test = format_default; format_test.ReadingType = format_default.ReadingType + 1; err = oh_decode_sensorreading(reading_test, format_test, &buffer); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* oh_decode_sensorreading: SAHPI_SENSOR_READING_TYPE_INT64 testcase */ expected_str = "20 Volts"; reading_test = reading_default; format_test = format_default; err = oh_decode_sensorreading(reading_test, format_test, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", buffer.Data, expected_str); return -1; } memset(&encode_reading, 0, sizeof(SaHpiSensorReadingT)); err = oh_encode_sensorreading(&buffer, format_test.ReadingType, &encode_reading); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (memcmp((void *)&encode_reading, (void *)&reading_test, sizeof(SaHpiSensorReadingT))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } /* oh_decode_sensorreading: SAHPI_SMUU_BASIC_OVER_MODIFIER testcase */ expected_str = "20 Volts / Week"; reading_test = reading_default; format_test = format_default; format_test.ModifierUnits = SAHPI_SU_WEEK; format_test.ModifierUse = SAHPI_SMUU_BASIC_OVER_MODIFIER; err = oh_decode_sensorreading(reading_test, format_test, &buffer); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", buffer.Data, expected_str); return -1; } err = oh_encode_sensorreading(&buffer, format_test.ReadingType, &encode_reading); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (memcmp((void *)&encode_reading, (void *)&reading_test, sizeof(SaHpiSensorReadingTypeT))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } /* oh_decode_sensorreading: SAHPI_SMUU_BASIC_TIMES_MODIFIER testcase */ expected_str = "20 Volts * Week"; reading_test = reading_default; format_test = format_default; format_test.ModifierUnits = SAHPI_SU_WEEK; format_test.ModifierUse = SAHPI_SMUU_BASIC_TIMES_MODIFIER; err = oh_decode_sensorreading(reading_test, format_test, &buffer); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", buffer.Data, expected_str); return -1; } err = oh_encode_sensorreading(&buffer, format_test.ReadingType, &encode_reading); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (memcmp((void *)&encode_reading, (void *)&reading_test, sizeof(SaHpiSensorReadingTypeT))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } /* oh_decode_sensorreading: Percentage testcase */ expected_str = "20%"; reading_test = reading_default; format_test = format_default; format_test.Percentage = SAHPI_TRUE; format_test.ModifierUnits = SAHPI_SU_WEEK; format_test.ModifierUse = SAHPI_SMUU_BASIC_TIMES_MODIFIER; err = oh_decode_sensorreading(reading_test, format_test, &buffer); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", buffer.Data, expected_str); return -1; } /* oh_decode_sensorreading: SAHPI_SENSOR_READING_TYPE_UINT64 testcase */ expected_str = "20 Volts"; reading_test = reading_default; reading_test.Type = SAHPI_SENSOR_READING_TYPE_UINT64; reading_test.Value.SensorUint64 = 20; format_test = format_default; format_test.ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64; err = oh_decode_sensorreading(reading_test, format_test, &buffer); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", buffer.Data, expected_str); return -1; } err = oh_encode_sensorreading(&buffer, format_test.ReadingType, &encode_reading); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (memcmp((void *)&encode_reading, (void *)&reading_test, sizeof(SaHpiSensorReadingTypeT))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } /* oh_decode_sensorreading: SAHPI_SENSOR_READING_TYPE_FLOAT64 testcase */ expected_str = "20.200 Volts"; reading_test = reading_default; reading_test.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; reading_test.Value.SensorFloat64 = 20.2; format_test = format_default; format_test.ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64; err = oh_decode_sensorreading(reading_test, format_test, &buffer); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", buffer.Data, expected_str); return -1; } /* oh_decode_sensorreading: SAHPI_SENSOR_READING_TYPE_BUFFER testcase */ expected_str = "22222222222222222222222222222222 Volts"; reading_test = reading_default; reading_test.Type = SAHPI_SENSOR_READING_TYPE_BUFFER; memset(reading_test.Value.SensorBuffer, 0x32, SAHPI_SENSOR_BUFFER_LENGTH); format_test = format_default; format_test.ReadingType = SAHPI_SENSOR_READING_TYPE_BUFFER; err = oh_decode_sensorreading(reading_test, format_test, &buffer); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", buffer.Data, expected_str); return -1; } err = oh_encode_sensorreading(&buffer, format_test.ReadingType, &encode_reading); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (memcmp((void *)&encode_reading, (void *)&reading_test, sizeof(SaHpiSensorReadingTypeT))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } } /*********************************** * oh_encode_sensorreading testcases ***********************************/ { const char *str; SaHpiTextBufferT buffer; SaHpiSensorReadingT reading; SaHpiInt64T expected_int64; /* SaHpiUint64T expected_uint64; */ SaHpiFloat64T expected_float64; /* oh_encode_sensorreading: Bad type testcase */ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_sensorreading(&buffer, BAD_TYPE, &reading); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* oh_encode_sensorreading: Skip characters before '=' sign testcase */ str = "+5Volt Sense 333=4"; expected_int64 = 4; oh_init_textbuffer(&buffer); oh_append_textbuffer(&buffer, str); err = oh_encode_sensorreading(&buffer, SAHPI_SENSOR_READING_TYPE_INT64, &reading); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (reading.Value.SensorInt64 != expected_int64) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received value=%lld; Expected value=%lld\n", reading.Value.SensorInt64, expected_int64); return -1; } /* oh_encode_sensorreading: Extra spaces testcase */ str = " + 20 Volts"; expected_int64 = 20; oh_init_textbuffer(&buffer); oh_append_textbuffer(&buffer, str); err = oh_encode_sensorreading(&buffer, SAHPI_SENSOR_READING_TYPE_INT64, &reading); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (reading.Value.SensorInt64 != expected_int64) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received value=%lld; Expected value=%lld\n", reading.Value.SensorInt64, expected_int64); return -1; } /* oh_encode_sensorreading: Extra non-digits/commas testcase */ str = "The, happy, %% result is ... +2,000Volts ,,... "; expected_int64 = 2000; oh_init_textbuffer(&buffer); oh_append_textbuffer(&buffer, str); err = oh_encode_sensorreading(&buffer, SAHPI_SENSOR_READING_TYPE_INT64, &reading); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (reading.Value.SensorInt64 != expected_int64) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received value=%lld; Expected value=%lld\n", reading.Value.SensorInt64, expected_int64); return -1; } /* oh_encode_sensorreading: No digits testcase */ str = "There are no numbers in this string"; oh_init_textbuffer(&buffer); oh_append_textbuffer(&buffer, str); err = oh_encode_sensorreading(&buffer, SAHPI_SENSOR_READING_TYPE_INT64, &reading); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (reading.Value.SensorInt64 != 0) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Expected Zero value; Received=%lld\n", reading.Value.SensorInt64); return -1; } /* oh_encode_sensorreading: Decimal point testcase */ str = "-2.5volts"; expected_float64 = -2.5; oh_init_textbuffer(&buffer); oh_append_textbuffer(&buffer, str); err = oh_encode_sensorreading(&buffer, SAHPI_SENSOR_READING_TYPE_FLOAT64, &reading); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (reading.Value.SensorFloat64 != expected_float64) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received value=%le; Expected value=%le\n", reading.Value.SensorFloat64, expected_float64); return -1; } /* oh_encode_sensorreading: Too many decimal points testcase */ str = "1.000.000 volts"; expected_err = SA_ERR_HPI_INVALID_DATA; oh_init_textbuffer(&buffer); oh_append_textbuffer(&buffer, str); err = oh_encode_sensorreading(&buffer, SAHPI_SENSOR_READING_TYPE_FLOAT64, &reading); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* oh_encode_sensorreading: Too many signs */ str = "+-33e02"; expected_err = SA_ERR_HPI_INVALID_DATA; oh_init_textbuffer(&buffer); oh_append_textbuffer(&buffer, str); err = oh_encode_sensorreading(&buffer, SAHPI_SENSOR_READING_TYPE_INT64, &reading); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* oh_encode_sensorreading: Percentage testcase */ str = "33% RPM"; expected_float64 = 33; oh_init_textbuffer(&buffer); oh_append_textbuffer(&buffer, str); err = oh_encode_sensorreading(&buffer, SAHPI_SENSOR_READING_TYPE_FLOAT64, &reading); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (reading.Value.SensorFloat64 != expected_float64) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received value=%le; Expected value=%le\n", reading.Value.SensorFloat64, expected_float64); return -1; } /* oh_encode_sensorreading: Too big int64 testcase */ str = "99999999999999999999999999999999"; expected_err = SA_ERR_HPI_INVALID_DATA; oh_init_textbuffer(&buffer); oh_append_textbuffer(&buffer, str); err = oh_encode_sensorreading(&buffer, SAHPI_SENSOR_READING_TYPE_INT64, &reading); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* oh_encode_sensorreading: Too big uint64 testcase */ str = "99999999999999999999999999999999"; expected_err = SA_ERR_HPI_INVALID_DATA; oh_init_textbuffer(&buffer); oh_append_textbuffer(&buffer, str); err = oh_encode_sensorreading(&buffer, SAHPI_SENSOR_READING_TYPE_UINT64, &reading); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } #if 0 /* oh_encode_sensorreading: Too big float64 testcase */ str = "99999999999999999999999999999999"; expected_err = SA_ERR_HPI_INVALID_DATA; oh_init_textbuffer(&buffer); oh_append_textbuffer(&buffer, str); err = oh_encode_sensorreading(&buffer, SAHPI_SENSOR_READING_TYPE_FLOAT64, &reading); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } #endif } /***************************** * oh_xxx_textbuffer testcases *****************************/ { char str[4] = "1234"; /* oh_init_textbuffer: NULL buffer testcase */ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_init_textbuffer(0); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* oh_append_textbuffer: NULL buffer testcase */ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_append_textbuffer(0, str); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* oh_append_textbuffer: NULL str testcase */ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_append_textbuffer(&buffer, 0); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* oh_append_textbuffer: Out of space testcase */ { char bigstr[SAHPI_MAX_TEXT_BUFFER_LENGTH +1]; expected_err = SA_ERR_HPI_OUT_OF_SPACE; memset(bigstr, 0x32, SAHPI_MAX_TEXT_BUFFER_LENGTH +1); err = oh_append_textbuffer(&buffer, bigstr); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* oh_copy_textbuffer: NULL buffer testcase */ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_copy_textbuffer(0, 0); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /******************************************** * oh_fprint_text/oh_fprint_bigtext testcases ********************************************/ { str = "OK - Printing Line 1\nOK - Printing Line 2"; oh_big_textbuffer big_buffer, big_bad_buffer; /* Don't need this if expose the oh_xxx_bigtext routines */ big_buffer.DataType = SAHPI_TL_TYPE_TEXT; big_buffer.Language = SAHPI_LANG_ENGLISH; memset(big_buffer.Data, 0x32, SAHPI_MAX_TEXT_BUFFER_LENGTH + 2); big_buffer.Data[SAHPI_MAX_TEXT_BUFFER_LENGTH + 2] = 0x00; big_buffer.Data[SAHPI_MAX_TEXT_BUFFER_LENGTH + 1] = 0x33; big_bad_buffer = big_buffer; err = oh_init_textbuffer(&buffer); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } err = oh_append_textbuffer(&buffer, str); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } /* oh_fprint_text: oh_print_text MACRO testcase */ err = oh_print_text(&buffer); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } err = oh_print_bigtext(&big_buffer); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } /* Bad data type testcase */ expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_copy_textbuffer(&bad_buffer, &buffer); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } bad_buffer.DataType = BAD_TYPE; err = oh_print_text(&bad_buffer); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } big_bad_buffer.DataType = BAD_TYPE; err = oh_print_bigtext(&big_bad_buffer); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } #if 0 /* FIXME :: ??? Is there a way to force a bad FILE ID, without blowing up??? */ /* Bad file handler testcase */ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_fprint_text(0, &buffer); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } err = oh_fprint_bigtext(0, &big_buffer); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } #endif /* Normal write to file testcase */ { FILE *fp, *big_fp; const char *name = "tmp"; const char *big_name = "tmpbig"; const char *mode = "a"; fp = fopen(name, mode); if (fp == NULL) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } err = oh_fprint_text(fp, &buffer); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } big_fp = fopen(big_name, mode); if (big_fp == NULL) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } err = oh_fprint_bigtext(big_fp, &big_buffer); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } fclose(fp); fclose(big_fp); unlink(name); unlink(big_name); } } /****************************** * oh_print_sensorrec testcases ******************************/ { SaHpiSensorRecT sensor, default_sensor; memset(&sensor, 0, sizeof(SaHpiSensorRecT)); memset(&default_sensor, 0, sizeof(SaHpiSensorRecT)); sensor.Num = 1; sensor.Type = SAHPI_VOLTAGE; sensor.Category = SAHPI_EC_THRESHOLD; sensor.Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_MINOR; sensor.EventCtrl = SAHPI_SEC_READ_ONLY; sensor.DataFormat.IsSupported = SAHPI_TRUE; sensor.DataFormat.ReadingType = SAHPI_SENSOR_READING_TYPE_INT64; sensor.DataFormat.BaseUnits = SAHPI_SU_VOLTS; sensor.DataFormat.ModifierUnits = SAHPI_SU_SECOND; sensor.DataFormat.ModifierUse = SAHPI_SMUU_BASIC_TIMES_MODIFIER; sensor.DataFormat.Percentage = SAHPI_FALSE; sensor.DataFormat.Range.Flags = SAHPI_SRF_MIN | SAHPI_SRF_MAX | SAHPI_SRF_NOMINAL | SAHPI_SRF_NORMAL_MIN | SAHPI_SRF_NORMAL_MAX; sensor.DataFormat.Range.Min.IsSupported = SAHPI_TRUE; sensor.DataFormat.Range.Min.Type = SAHPI_SENSOR_READING_TYPE_INT64; sensor.DataFormat.Range.Min.Value.SensorInt64 = 0; sensor.DataFormat.Range.Max.IsSupported = SAHPI_TRUE; sensor.DataFormat.Range.Max.Type = SAHPI_SENSOR_READING_TYPE_INT64; sensor.DataFormat.Range.Max.Value.SensorInt64 = 100; sensor.DataFormat.Range.Nominal.IsSupported = SAHPI_TRUE; sensor.DataFormat.Range.Nominal.Type = SAHPI_SENSOR_READING_TYPE_INT64; sensor.DataFormat.Range.Nominal.Value.SensorInt64 = 50; sensor.DataFormat.Range.NormalMax.IsSupported = SAHPI_TRUE; sensor.DataFormat.Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_INT64; sensor.DataFormat.Range.NormalMax.Value.SensorInt64 = 75; sensor.DataFormat.Range.NormalMin.IsSupported = SAHPI_TRUE; sensor.DataFormat.Range.NormalMin.Type = SAHPI_SENSOR_READING_TYPE_INT64; sensor.DataFormat.Range.NormalMin.Value.SensorInt64 = 25; sensor.DataFormat.AccuracyFactor = 0.05; sensor.Oem = 0xFF; sensor.ThresholdDefn.IsAccessible = SAHPI_TRUE; sensor.ThresholdDefn.ReadThold = SAHPI_STM_LOW_MINOR | SAHPI_STM_LOW_MAJOR | SAHPI_STM_LOW_CRIT | SAHPI_STM_LOW_HYSTERESIS; sensor.ThresholdDefn.WriteThold = SAHPI_STM_UP_MINOR | SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT | SAHPI_STM_UP_HYSTERESIS; sensor.ThresholdDefn.Nonlinear = SAHPI_TRUE; /* oh_print_sensorrec: Bad parameter testcase */ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_print_sensorrec(0, 0); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* oh_print_sensorrec: Default sensor testcase */ memset(&default_sensor, 0, sizeof(SaHpiSensorRecT)); err = oh_print_sensorrec(&default_sensor, 0); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } /* oh_print_sensorrec: Normal sensor testcase */ err = oh_print_sensorrec(&sensor, 0); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } } /******************************* * oh_print_textbuffer testcases *******************************/ { SaHpiTextBufferT textbuffer, default_textbuffer; textbuffer.DataType = SAHPI_TL_TYPE_TEXT; textbuffer.Language = SAHPI_LANG_ZULU; strcpy((char *)textbuffer.Data, "Test Data"); textbuffer.DataLength = strlen((char *)textbuffer.Data); /* oh_print_textbuffer: Bad parameter testcase */ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_print_textbuffer(0, 0); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* oh_print_textbuffer: Default textbuffer testcase */ printf("Default TextBuffer\n"); err = oh_print_textbuffer(&default_textbuffer, 1); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } /* oh_print_textbuffer: Normal textbuffer testcase */ printf("Normal TextBuffer\n"); err = oh_print_textbuffer(&textbuffer, 1); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } } /************************** * oh_print_event testcases **************************/ { SaHpiEventT sensor_event, default_event; memset(&sensor_event, 0, sizeof(SaHpiEventT)); memset(&default_event, 0, sizeof(SaHpiEventT)); sensor_event.Source = 1; sensor_event.EventType = SAHPI_ET_SENSOR; sensor_event.Severity = SAHPI_CRITICAL; sensor_event.EventDataUnion.SensorEvent.SensorNum = 2; sensor_event.EventDataUnion.SensorEvent.SensorType = SAHPI_VOLTAGE; sensor_event.EventDataUnion.SensorEvent.EventCategory = SAHPI_EC_THRESHOLD; sensor_event.EventDataUnion.SensorEvent.Assertion = SAHPI_TRUE; sensor_event.EventDataUnion.SensorEvent.EventState = SAHPI_ES_LOWER_MINOR; sensor_event.EventDataUnion.SensorEvent.OptionalDataPresent = sensor_event.EventDataUnion.SensorEvent.OptionalDataPresent | SAHPI_SOD_TRIGGER_READING | SAHPI_SOD_TRIGGER_THRESHOLD | SAHPI_SOD_PREVIOUS_STATE | SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_OEM | SAHPI_SOD_SENSOR_SPECIFIC; sensor_event.EventDataUnion.SensorEvent.TriggerReading.IsSupported = SAHPI_TRUE; sensor_event.EventDataUnion.SensorEvent.TriggerReading.Type = SAHPI_SENSOR_READING_TYPE_INT64; sensor_event.EventDataUnion.SensorEvent.TriggerReading.Value.SensorInt64 = 100; sensor_event.EventDataUnion.SensorEvent.TriggerThreshold.IsSupported = SAHPI_TRUE; sensor_event.EventDataUnion.SensorEvent.TriggerThreshold.Type = SAHPI_SENSOR_READING_TYPE_INT64; sensor_event.EventDataUnion.SensorEvent.TriggerThreshold.Value.SensorInt64 = 101; sensor_event.EventDataUnion.SensorEvent.PreviousState = SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR; sensor_event.EventDataUnion.SensorEvent.CurrentState = SAHPI_ES_LOWER_MINOR; sensor_event.EventDataUnion.SensorEvent.Oem = 32; sensor_event.EventDataUnion.SensorEvent.SensorSpecific = 33; /* oh_print_event: Bad parameter testcase */ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_print_event(0, NULL, 0); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* oh_print_event: Default event testcase */ printf("Default Event\n"); err = oh_print_event(&default_event, NULL, 1); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } /* oh_print_event: Normal sensor event testcase */ printf("Normal Sensor Event\n"); err = oh_print_event(&sensor_event, NULL, 1); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } /* oh_print_event: Normal sensor event - no optional sensor data testcase */ printf("Normal Sensor Event - no optional sensor data\n"); sensor_event.EventDataUnion.SensorEvent.OptionalDataPresent = 0; err = oh_print_event(&sensor_event, NULL, 1); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } /***************** * Resource events *****************/ { SaHpiEventT default_resource_event; memset(&default_resource_event, 0, sizeof(SaHpiEventT)); default_resource_event.Source = 1; default_resource_event.EventType = SAHPI_ET_RESOURCE; default_resource_event.Severity = SAHPI_CRITICAL; /* oh_print_event: Zero resource event testcase */ printf("Default Resource Event - no data\n"); err = oh_print_event(&default_resource_event, NULL, 1); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } /* oh_print_event: Normal resource event testcase */ default_resource_event.EventDataUnion.ResourceEvent.ResourceEventType = SAHPI_RESE_RESOURCE_RESTORED; printf("Normal Resource Event\n"); err = oh_print_event(&default_resource_event, NULL, 1); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } } /*************** * Domain events ***************/ { SaHpiEventT default_domain_event; memset(&default_domain_event, 0, sizeof(SaHpiEventT)); default_domain_event.Source = 1; default_domain_event.EventType = SAHPI_ET_DOMAIN; default_domain_event.Severity = SAHPI_CRITICAL; /* oh_print_event: Zero domain event testcase */ printf("Default Domain Event - no data\n"); err = oh_print_event(&default_domain_event, NULL, 1); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } /* oh_print_event: Normal domain event testcase */ default_domain_event.EventDataUnion.DomainEvent.Type = SAHPI_DOMAIN_REF_ADDED; default_domain_event.EventDataUnion.DomainEvent.DomainId = 1; printf("Normal Domain Event\n"); err = oh_print_event(&default_domain_event, NULL, 1); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } } /***************************** * Sensor Enable Change events *****************************/ { SaHpiEventT default_sensor_enable_event; memset(&default_sensor_enable_event, 0, sizeof(SaHpiEventT)); default_sensor_enable_event.Source = 1; default_sensor_enable_event.EventType = SAHPI_ET_SENSOR_ENABLE_CHANGE; default_sensor_enable_event.Severity = SAHPI_CRITICAL; /* oh_print_event: Zero sensor enable event testcase */ printf("Default Sensor Enable Event - no data\n"); err = oh_print_event(&default_sensor_enable_event, NULL, 1); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } /* oh_print_event: Normal sensor enable event testcase */ default_sensor_enable_event.EventDataUnion.SensorEnableChangeEvent.SensorNum = 1; default_sensor_enable_event.EventDataUnion.SensorEnableChangeEvent.SensorType = SAHPI_FAN; default_sensor_enable_event.EventDataUnion.SensorEnableChangeEvent.EventCategory = SAHPI_EC_THRESHOLD; default_sensor_enable_event.EventDataUnion.SensorEnableChangeEvent.SensorEnable = SAHPI_TRUE; default_sensor_enable_event.EventDataUnion.SensorEnableChangeEvent.SensorEventEnable = SAHPI_TRUE; default_sensor_enable_event.EventDataUnion.SensorEnableChangeEvent.AssertEventMask = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR; default_sensor_enable_event.EventDataUnion.SensorEnableChangeEvent.DeassertEventMask = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR; default_sensor_enable_event.EventDataUnion.SensorEnableChangeEvent.OptionalDataPresent = SAHPI_SEOD_CURRENT_STATE; default_sensor_enable_event.EventDataUnion.SensorEnableChangeEvent.CurrentState = SAHPI_ES_LOWER_MINOR; printf("Normal sensor enable Event\n"); err = oh_print_event(&default_sensor_enable_event, NULL, 1); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } } /**************** * Hotswap events ****************/ { SaHpiEventT default_hotswap_event; memset(&default_hotswap_event, 0, sizeof(SaHpiEventT)); default_hotswap_event.Source = 1; default_hotswap_event.EventType = SAHPI_ET_HOTSWAP; default_hotswap_event.Severity = SAHPI_CRITICAL; /* oh_print_event: Zero hotswap event testcase */ printf("Default Hotswap Event - no data\n"); err = oh_print_event(&default_hotswap_event, NULL, 1); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } /* oh_print_event: Normal hotswap event testcase */ default_hotswap_event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_ACTIVE; default_hotswap_event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_INSERTION_PENDING; printf("Normal Hotswap Event\n"); err = oh_print_event(&default_hotswap_event, NULL, 1); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } } /***************** * Watchdog events *****************/ { SaHpiEventT default_watchdog_event; memset(&default_watchdog_event, 0, sizeof(SaHpiEventT)); default_watchdog_event.Source = 1; default_watchdog_event.EventType = SAHPI_ET_WATCHDOG; default_watchdog_event.Severity = SAHPI_CRITICAL; /* oh_print_event: Zero watchdog event testcase */ printf("Default Watchdog Event - no data\n"); err = oh_print_event(&default_watchdog_event, NULL, 1); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } /* oh_print_event: Normal watchdog event testcase */ default_watchdog_event.EventDataUnion.WatchdogEvent.WatchdogNum = 1; default_watchdog_event.EventDataUnion.WatchdogEvent.WatchdogAction = SAHPI_WAE_POWER_DOWN; default_watchdog_event.EventDataUnion.WatchdogEvent.WatchdogPreTimerAction = SAHPI_WPI_NMI; default_watchdog_event.EventDataUnion.WatchdogEvent.WatchdogUse = SAHPI_WTU_OEM; printf("Normal Watchdog Event\n"); err = oh_print_event(&default_watchdog_event, NULL, 1); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } } /*************** * HPI SW events ***************/ { SaHpiEventT default_hpisw_event; memset(&default_hpisw_event, 0, sizeof(SaHpiEventT)); default_hpisw_event.Source = 1; default_hpisw_event.EventType = SAHPI_ET_HPI_SW; default_hpisw_event.Severity = SAHPI_CRITICAL; /* oh_print_event: Zero HPI software event testcase */ printf("Default HPI Software Event - no data\n"); err = oh_print_event(&default_hpisw_event, NULL, 1); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } /* oh_print_event: Normal HPI software event testcase */ default_hpisw_event.EventDataUnion.HpiSwEvent.MId = 1; default_hpisw_event.EventDataUnion.HpiSwEvent.Type = SAHPI_HPIE_AUDIT; default_hpisw_event.EventDataUnion.HpiSwEvent.EventData.DataType = SAHPI_TL_TYPE_TEXT; default_hpisw_event.EventDataUnion.HpiSwEvent.EventData.Language = SAHPI_LANG_URDU; default_hpisw_event.EventDataUnion.HpiSwEvent.EventData.DataLength = sizeof("HPI software event"); strncpy((char *)(default_hpisw_event.EventDataUnion.HpiSwEvent.EventData.Data), "HPI software event", strlen("HPI software event")); printf("Normal HPI Sotware Event\n"); err = oh_print_event(&default_hpisw_event, NULL, 1); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } } /**************** * HPI OEM events ****************/ { SaHpiEventT default_oem_event; memset(&default_oem_event, 0, sizeof(SaHpiEventT)); default_oem_event.Source = 1; default_oem_event.EventType = SAHPI_ET_OEM; default_oem_event.Severity = SAHPI_CRITICAL; /* oh_print_event: Zero OEM event testcase */ printf("Default OEM Event - no data\n"); err = oh_print_event(&default_oem_event, NULL, 1); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } /* oh_print_event: Normal OEM event testcase */ default_oem_event.EventDataUnion.OemEvent.MId = 1; default_oem_event.EventDataUnion.OemEvent.OemEventData.DataType = SAHPI_TL_TYPE_TEXT; default_oem_event.EventDataUnion.OemEvent.OemEventData.Language = SAHPI_LANG_URDU; default_oem_event.EventDataUnion.OemEvent.OemEventData.DataLength = sizeof("OEM Event"); strncpy((char *)(default_oem_event.EventDataUnion.OemEvent.OemEventData.Data), "OEM Event", strlen("OEM Event")); printf("Normal OEM Event\n"); err = oh_print_event(&default_oem_event, NULL, 1); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } } /***************** * HPI User events *****************/ { SaHpiEventT default_user_event; memset(&default_user_event, 0, sizeof(SaHpiEventT)); default_user_event.Source = 1; default_user_event.EventType = SAHPI_ET_USER; default_user_event.Severity = SAHPI_CRITICAL; /* oh_print_event: Zero User event testcase */ printf("Default User Event - no data\n"); err = oh_print_event(&default_user_event, NULL, 1); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } /* oh_print_event: Normal User event testcase */ default_user_event.EventDataUnion.UserEvent.UserEventData.DataType = SAHPI_TL_TYPE_TEXT; default_user_event.EventDataUnion.UserEvent.UserEventData.Language = SAHPI_LANG_URDU; default_user_event.EventDataUnion.UserEvent.UserEventData.DataLength = sizeof("User Event"); strncpy((char *)(default_user_event.EventDataUnion.UserEvent.UserEventData.Data), "User Event", strlen("User Event")); printf("Normal User Event\n"); err = oh_print_event(&default_user_event, NULL, 1); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } } } /**************************** * oh_print_ctrlrec testcases ****************************/ SaHpiCtrlRecT control; memset(&control, 0, sizeof(SaHpiCtrlRecT)); /* oh_print_ctrlrec: Default testcase */ printf("Print control - default case\n"); err = oh_print_ctrlrec(&control, 1); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } control.Num = 1; control.OutputType = SAHPI_CTRL_LED; control.DefaultMode.Mode = SAHPI_CTRL_MODE_AUTO; control.DefaultMode.ReadOnly = SAHPI_TRUE; control.WriteOnly = SAHPI_TRUE; control.Oem = 0; /* oh_print_ctrlrec: Normal digital testcase */ control.Type = SAHPI_CTRL_TYPE_DIGITAL; control.TypeUnion.Digital.Default = SAHPI_CTRL_STATE_PULSE_ON; printf("Print control - normal digital case\n"); err = oh_print_ctrlrec(&control, 1); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } /* oh_print_ctrlrec: Normal discrete testcase */ control.Type = SAHPI_CTRL_TYPE_DISCRETE; control.TypeUnion.Discrete.Default = 2; printf("Print control - normal discrete case\n"); err = oh_print_ctrlrec(&control, 1); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } /* oh_print_ctrlrec: Normal analog testcase */ control.Type = SAHPI_CTRL_TYPE_ANALOG; control.TypeUnion.Analog.Min = 1; control.TypeUnion.Analog.Max = 10; control.TypeUnion.Analog.Default = 5; printf("Print control - normal analog case\n"); err = oh_print_ctrlrec(&control, 1); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } /* oh_print_ctrlrec: Normal stream testcase */ control.Type = SAHPI_CTRL_TYPE_STREAM; control.TypeUnion.Stream.Default.Repeat = SAHPI_TRUE; control.TypeUnion.Stream.Default.StreamLength = MIN(SAHPI_CTRL_MAX_STREAM_LENGTH, strlen("Stream Data")); strncpy((char *)control.TypeUnion.Stream.Default.Stream, "Stream Data", SAHPI_CTRL_MAX_STREAM_LENGTH); printf("Print control - normal stream case\n"); err = oh_print_ctrlrec(&control, 1); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } /* oh_print_ctrlrec: Normal text testcase */ control.Type = SAHPI_CTRL_TYPE_TEXT; control.TypeUnion.Text.MaxChars = 10; control.TypeUnion.Text.MaxLines = 100; control.TypeUnion.Text.Language = SAHPI_LANG_ENGLISH; control.TypeUnion.Text.DataType = SAHPI_TL_TYPE_TEXT; control.TypeUnion.Text.Default.Line = 1; control.TypeUnion.Text.Default.Text.DataType = SAHPI_TL_TYPE_TEXT; control.TypeUnion.Text.Default.Text.Language = SAHPI_LANG_ENGLISH; control.TypeUnion.Text.Default.Text.DataLength = MIN(SAHPI_MAX_TEXT_BUFFER_LENGTH, strlen("Text Data")); strncpy((char *)(control.TypeUnion.Text.Default.Text.Data), "Text Data", SAHPI_MAX_TEXT_BUFFER_LENGTH); printf("Print control - normal text case\n"); err = oh_print_ctrlrec(&control, 1); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } /* oh_print_ctrlrec: Normal oem testcase */ control.Type = SAHPI_CTRL_TYPE_OEM; control.TypeUnion.Oem.MId = 1; strncpy((char *)control.TypeUnion.Oem.ConfigData, "Config Data", SAHPI_CTRL_OEM_CONFIG_LENGTH); control.TypeUnion.Oem.Default.MId = 1; control.TypeUnion.Oem.Default.BodyLength = MIN(SAHPI_CTRL_MAX_OEM_BODY_LENGTH, strlen("Config Default")); strncpy((char *)control.TypeUnion.Oem.Default.Body, "Config Default", SAHPI_CTRL_MAX_OEM_BODY_LENGTH); printf("Print control - normal OEM case\n"); err = oh_print_ctrlrec(&control, 1); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } /******************************* * oh_valid_textbuffer testcases *******************************/ { SaHpiTextBufferT buffer; SaHpiBoolT result, expected_result; /* oh_valid_textbuffer: NULL buffer testcase */ expected_result = SAHPI_FALSE; result = oh_valid_textbuffer(0); if (result != expected_result) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } /* oh_valid_textbuffer: Bad text type testcase */ expected_result = SAHPI_FALSE; oh_init_textbuffer(&buffer); buffer.DataType = BAD_TYPE; result = oh_valid_textbuffer(&buffer); if (result != expected_result) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } /* oh_valid_textbuffer: Bad language type testcase */ expected_result = SAHPI_FALSE; oh_init_textbuffer(&buffer); buffer.Language = BAD_TYPE; result = oh_valid_textbuffer(&buffer); if (result != expected_result) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } /* oh_valid_textbuffer: Bad Unicode length testcase */ expected_result = SAHPI_FALSE; oh_init_textbuffer(&buffer); buffer.DataType = SAHPI_TL_TYPE_UNICODE; strcpy((char *)buffer.Data, "123"); buffer.DataLength = strlen("123"); result = oh_valid_textbuffer(&buffer); if (result != expected_result) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } /* oh_valid_textbuffer: Bad Data text cases */ expected_result = SAHPI_FALSE; oh_init_textbuffer(&buffer); buffer.DataType = SAHPI_TL_TYPE_BCDPLUS; strcpy((char *)buffer.Data, "123"); buffer.Data[1] = ';'; buffer.DataLength = strlen("123"); result = oh_valid_textbuffer(&buffer); if (result != expected_result) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } buffer.DataType = SAHPI_TL_TYPE_ASCII6; buffer.Data[1] = 0xff; result = oh_valid_textbuffer(&buffer); if (result != expected_result) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } /* oh_valid_textbuffer: Good buffer testcase */ expected_result = SAHPI_TRUE; oh_init_textbuffer(&buffer); result = oh_valid_textbuffer(&buffer); if (result != expected_result) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } /******************************* * oh_valid_thresholds testcases *******************************/ { SaHpiRdrT default_rdr, test_rdr; SaHpiSensorThresholdsT default_thresholds_int64, test_thresholds_int64; SaHpiSensorThresholdsT default_thresholds_float64, test_thresholds_float64; SaHpiSensorThresholdsT default_thresholds_uint64, test_thresholds_uint64; SaHpiSensorDataFormatT default_format_int64; SaHpiSensorDataFormatT default_format_float64; SaHpiSensorDataFormatT default_format_uint64; default_rdr.RecordId = 1; default_rdr.RdrType = SAHPI_SENSOR_RDR; default_rdr.Entity.Entry[0].EntityType = SAHPI_ENT_ROOT; default_rdr.Entity.Entry[0].EntityLocation = 0; default_rdr.IsFru = SAHPI_TRUE; default_rdr.RdrTypeUnion.SensorRec.Num = 1; default_rdr.RdrTypeUnion.SensorRec.Type = SAHPI_TEMPERATURE; default_rdr.RdrTypeUnion.SensorRec.Category = SAHPI_EC_THRESHOLD; default_rdr.RdrTypeUnion.SensorRec.EnableCtrl = SAHPI_FALSE; default_rdr.RdrTypeUnion.SensorRec.EventCtrl= SAHPI_SEC_READ_ONLY; default_rdr.RdrTypeUnion.SensorRec.Events = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT; default_rdr.RdrTypeUnion.SensorRec.DataFormat.IsSupported = SAHPI_TRUE; default_rdr.RdrTypeUnion.SensorRec.DataFormat.ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64; default_rdr.RdrTypeUnion.SensorRec.DataFormat.BaseUnits = SAHPI_SU_DEGREES_C; default_rdr.RdrTypeUnion.SensorRec.DataFormat.ModifierUnits = SAHPI_SU_UNSPECIFIED; default_rdr.RdrTypeUnion.SensorRec.DataFormat.ModifierUse = SAHPI_SMUU_NONE; default_rdr.RdrTypeUnion.SensorRec.DataFormat.Percentage = SAHPI_FALSE; default_rdr.RdrTypeUnion.SensorRec.DataFormat.Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN; default_rdr.RdrTypeUnion.SensorRec.DataFormat.Range.Max.IsSupported = SAHPI_TRUE; default_rdr.RdrTypeUnion.SensorRec.DataFormat.Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; default_rdr.RdrTypeUnion.SensorRec.DataFormat.Range.Max.Value.SensorFloat64 = 125; default_rdr.RdrTypeUnion.SensorRec.DataFormat.Range.Min.IsSupported = SAHPI_TRUE; default_rdr.RdrTypeUnion.SensorRec.DataFormat.Range.Min.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; default_rdr.RdrTypeUnion.SensorRec.DataFormat.Range.Min.Value.SensorFloat64 = 0; default_rdr.RdrTypeUnion.SensorRec.ThresholdDefn.IsAccessible = SAHPI_TRUE; default_rdr.RdrTypeUnion.SensorRec.ThresholdDefn.ReadThold = 0; default_rdr.RdrTypeUnion.SensorRec.ThresholdDefn.WriteThold = SAHPI_STM_LOW_MINOR | SAHPI_STM_LOW_MAJOR | SAHPI_STM_LOW_CRIT | SAHPI_STM_UP_MINOR | SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT | SAHPI_STM_UP_HYSTERESIS | SAHPI_STM_LOW_HYSTERESIS; default_thresholds_int64.UpCritical.IsSupported = SAHPI_TRUE; default_thresholds_int64.UpCritical.Type = SAHPI_SENSOR_READING_TYPE_INT64; default_thresholds_int64.UpCritical.Value.SensorInt64 = 50; default_thresholds_int64.UpMajor.IsSupported = SAHPI_TRUE; default_thresholds_int64.UpMajor.Type = SAHPI_SENSOR_READING_TYPE_INT64; default_thresholds_int64.UpMajor.Value.SensorInt64 = 40; default_thresholds_int64.UpMinor.IsSupported = SAHPI_TRUE; default_thresholds_int64.UpMinor.Type = SAHPI_SENSOR_READING_TYPE_INT64; default_thresholds_int64.UpMinor.Value.SensorInt64 = 30; default_thresholds_int64.LowMinor.IsSupported = SAHPI_TRUE; default_thresholds_int64.LowMinor.Type = SAHPI_SENSOR_READING_TYPE_INT64; default_thresholds_int64.LowMinor.Value.SensorInt64 = 20; default_thresholds_int64.LowMajor.IsSupported = SAHPI_TRUE; default_thresholds_int64.LowMajor.Type = SAHPI_SENSOR_READING_TYPE_INT64; default_thresholds_int64.LowMajor.Value.SensorInt64 = 10; default_thresholds_int64.LowCritical.IsSupported = SAHPI_TRUE; default_thresholds_int64.LowCritical.Type = SAHPI_SENSOR_READING_TYPE_INT64; default_thresholds_int64.LowCritical.Value.SensorInt64 = 0; default_thresholds_int64.PosThdHysteresis.IsSupported = SAHPI_TRUE; default_thresholds_int64.PosThdHysteresis.Type = SAHPI_SENSOR_READING_TYPE_INT64; default_thresholds_int64.PosThdHysteresis.Value.SensorInt64 = 2; default_thresholds_int64.NegThdHysteresis.IsSupported = SAHPI_TRUE; default_thresholds_int64.NegThdHysteresis.Type = SAHPI_SENSOR_READING_TYPE_INT64; default_thresholds_int64.NegThdHysteresis.Value.SensorInt64 = 2; default_format_int64.IsSupported = SAHPI_TRUE; default_format_int64.ReadingType = SAHPI_SENSOR_READING_TYPE_INT64; default_format_int64.Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN; default_format_int64.Range.Max.Value.SensorInt64 = 60; default_format_int64.Range.Min.Value.SensorInt64 = 0; /* oh_valid_thresholds: Bad parameters testcase */ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_valid_thresholds(0, &default_rdr); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* oh_valid_thresholds: Bad RDR testcase */ test_rdr = default_rdr; test_thresholds_int64 = default_thresholds_int64; test_rdr.RdrType = SAHPI_WATCHDOG_RDR; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_valid_thresholds(&test_thresholds_int64, &test_rdr); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* oh_valid_thresholds: Bad threshold type testcase */ test_rdr = default_rdr; test_rdr.RdrTypeUnion.SensorRec.DataFormat = default_format_int64; test_thresholds_int64 = default_thresholds_int64; expected_err = SA_ERR_HPI_INVALID_DATA; test_thresholds_int64.LowCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; err = oh_valid_thresholds(&test_thresholds_int64, &test_rdr); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* oh_valid_thresholds: Bad text buffer type threshold testcase */ test_rdr = default_rdr; test_rdr.RdrTypeUnion.SensorRec.DataFormat = default_format_int64; test_thresholds_int64 = default_thresholds_int64; expected_err = SA_ERR_HPI_INVALID_DATA; test_thresholds_int64.LowCritical.Type = SAHPI_SENSOR_READING_TYPE_BUFFER; err = oh_valid_thresholds(&test_thresholds_int64, &test_rdr); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* oh_valid_thresholds: Bad threshold hysteresis testcase */ test_rdr = default_rdr; test_rdr.RdrTypeUnion.SensorRec.DataFormat = default_format_int64; test_thresholds_int64 = default_thresholds_int64; expected_err = SA_ERR_HPI_INVALID_DATA; test_thresholds_int64.PosThdHysteresis.Value.SensorInt64 = -1; test_rdr.RdrTypeUnion.SensorRec.DataFormat.Range.Flags = test_rdr.RdrTypeUnion.SensorRec.DataFormat.Range.Flags & ~SAHPI_SRF_MAX; test_rdr.RdrTypeUnion.SensorRec.DataFormat.Range.Flags = test_rdr.RdrTypeUnion.SensorRec.DataFormat.Range.Flags & ~SAHPI_SRF_MIN; err = oh_valid_thresholds(&test_thresholds_int64, &test_rdr); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* oh_valid_thresholds: Bad range threshold testcase */ test_rdr = default_rdr; test_rdr.RdrTypeUnion.SensorRec.DataFormat = default_format_int64; test_thresholds_int64 = default_thresholds_int64; expected_err = SA_ERR_HPI_INVALID_CMD; test_rdr.RdrTypeUnion.SensorRec.DataFormat.Range.Max.Value.SensorInt64 = 0; err = oh_valid_thresholds(&test_thresholds_int64, &test_rdr); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* oh_valid_ordering: Bad order threshold testcase */ test_rdr = default_rdr; test_rdr.RdrTypeUnion.SensorRec.DataFormat = default_format_int64; test_thresholds_int64 = default_thresholds_int64; expected_err = SA_ERR_HPI_INVALID_DATA; test_thresholds_int64.LowCritical.Value.SensorInt64 = 20; err = oh_valid_ordering(&test_thresholds_int64, &test_rdr); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* oh_valid_thresholds: Bad writable threshold testcase */ test_rdr = default_rdr; test_rdr.RdrTypeUnion.SensorRec.DataFormat = default_format_int64; test_thresholds_int64 = default_thresholds_int64; expected_err = SA_ERR_HPI_INVALID_CMD; test_rdr.RdrTypeUnion.SensorRec.ThresholdDefn.WriteThold = SAHPI_STM_LOW_MINOR | SAHPI_STM_LOW_MAJOR | SAHPI_STM_LOW_CRIT; err = oh_valid_thresholds(&test_thresholds_int64, &test_rdr); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* oh_valid_thresholds: Normal threshold testcase - int64 */ test_rdr = default_rdr; test_rdr.RdrTypeUnion.SensorRec.DataFormat = default_format_int64; test_thresholds_int64 = default_thresholds_int64; expected_err = SA_OK; err = oh_valid_thresholds(&test_thresholds_int64, &test_rdr); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* oh_valid_thresholds: Normal subset testcase */ test_rdr = default_rdr; test_rdr.RdrTypeUnion.SensorRec.DataFormat = default_format_int64; test_thresholds_int64 = default_thresholds_int64; expected_err = SA_OK; test_thresholds_int64.UpCritical.IsSupported = SAHPI_FALSE; test_thresholds_int64.UpCritical.Type = BAD_TYPE; /* This should be ignored */ test_thresholds_int64.LowCritical.IsSupported = SAHPI_FALSE; test_thresholds_int64.LowCritical.Type = BAD_TYPE; /* This should be ignored */ err = oh_valid_thresholds(&test_thresholds_int64, &test_rdr); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } default_thresholds_float64.UpCritical.IsSupported = SAHPI_TRUE; default_thresholds_float64.UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; default_thresholds_float64.UpCritical.Value.SensorFloat64 = 50.3; default_thresholds_float64.UpMajor.IsSupported = SAHPI_TRUE; default_thresholds_float64.UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; default_thresholds_float64.UpMajor.Value.SensorFloat64 = 40.2; default_thresholds_float64.UpMinor.IsSupported = SAHPI_TRUE; default_thresholds_float64.UpMinor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; default_thresholds_float64.UpMinor.Value.SensorFloat64 = 30.1; default_thresholds_float64.LowMinor.IsSupported = SAHPI_TRUE; default_thresholds_float64.LowMinor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; default_thresholds_float64.LowMinor.Value.SensorFloat64 = 20.3; default_thresholds_float64.LowMajor.IsSupported = SAHPI_TRUE; default_thresholds_float64.LowMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; default_thresholds_float64.LowMajor.Value.SensorFloat64 = 10.2; default_thresholds_float64.LowCritical.IsSupported = SAHPI_TRUE; default_thresholds_float64.LowCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; default_thresholds_float64.LowCritical.Value.SensorFloat64 = 0.5; default_thresholds_float64.PosThdHysteresis.IsSupported = SAHPI_TRUE; default_thresholds_float64.PosThdHysteresis.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; default_thresholds_float64.PosThdHysteresis.Value.SensorFloat64 = 2; default_thresholds_float64.NegThdHysteresis.IsSupported = SAHPI_TRUE; default_thresholds_float64.NegThdHysteresis.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; default_thresholds_float64.NegThdHysteresis.Value.SensorFloat64 = 2; default_format_float64.IsSupported = SAHPI_TRUE; default_format_float64.ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64; default_format_float64.Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN; default_format_float64.Range.Max.Value.SensorFloat64 = 60; default_format_float64.Range.Min.Value.SensorFloat64 = 0; /* oh_valid_thresholds: Normal threshold testcase - float64 */ test_rdr = default_rdr; test_rdr.RdrTypeUnion.SensorRec.DataFormat = default_format_float64; test_thresholds_float64 = default_thresholds_float64; expected_err = SA_OK; err = oh_valid_thresholds(&test_thresholds_float64, &test_rdr); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } default_thresholds_uint64.UpCritical.IsSupported = SAHPI_TRUE; default_thresholds_uint64.UpCritical.Type = SAHPI_SENSOR_READING_TYPE_UINT64; default_thresholds_uint64.UpCritical.Value.SensorUint64 = 50.3; default_thresholds_uint64.UpMajor.IsSupported = SAHPI_TRUE; default_thresholds_uint64.UpMajor.Type = SAHPI_SENSOR_READING_TYPE_UINT64; default_thresholds_uint64.UpMajor.Value.SensorUint64 = 40.2; default_thresholds_uint64.UpMinor.IsSupported = SAHPI_TRUE; default_thresholds_uint64.UpMinor.Type = SAHPI_SENSOR_READING_TYPE_UINT64; default_thresholds_uint64.UpMinor.Value.SensorUint64 = 30.1; default_thresholds_uint64.LowMinor.IsSupported = SAHPI_TRUE; default_thresholds_uint64.LowMinor.Type = SAHPI_SENSOR_READING_TYPE_UINT64; default_thresholds_uint64.LowMinor.Value.SensorUint64 = 20.3; default_thresholds_uint64.LowMajor.IsSupported = SAHPI_TRUE; default_thresholds_uint64.LowMajor.Type = SAHPI_SENSOR_READING_TYPE_UINT64; default_thresholds_uint64.LowMajor.Value.SensorUint64 = 10.2; default_thresholds_uint64.LowCritical.IsSupported = SAHPI_TRUE; default_thresholds_uint64.LowCritical.Type = SAHPI_SENSOR_READING_TYPE_UINT64; default_thresholds_uint64.LowCritical.Value.SensorUint64 = 0.5; default_thresholds_uint64.PosThdHysteresis.IsSupported = SAHPI_TRUE; default_thresholds_uint64.PosThdHysteresis.Type = SAHPI_SENSOR_READING_TYPE_UINT64; default_thresholds_uint64.PosThdHysteresis.Value.SensorUint64 = 2; default_thresholds_uint64.NegThdHysteresis.IsSupported = SAHPI_TRUE; default_thresholds_uint64.NegThdHysteresis.Type = SAHPI_SENSOR_READING_TYPE_UINT64; default_thresholds_uint64.NegThdHysteresis.Value.SensorUint64 = 2; default_format_uint64.IsSupported = SAHPI_TRUE; default_format_uint64.ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64; default_format_uint64.Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN; default_format_uint64.Range.Max.Value.SensorUint64 = 60; default_format_uint64.Range.Min.Value.SensorUint64 = 0; /* oh_valid_thresholds: Normal threshold testcase - uint64 */ test_rdr = default_rdr; test_rdr.RdrTypeUnion.SensorRec.DataFormat = default_format_uint64; test_thresholds_uint64 = default_thresholds_uint64; expected_err = SA_OK; err = oh_valid_thresholds(&test_thresholds_uint64, &test_rdr); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } } /************************************ * oh_compare_sensorreading testcases ************************************/ { SaHpiSensorReadingT reading1, reading2; int rtn, expected_rtn; reading1.IsSupported = reading2.IsSupported = SAHPI_TRUE; reading1.Type = reading2.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; /* oh_compare_sensorreading - reading1 < reading2 float64 */ reading1.Value.SensorFloat64 = 5; reading2.Value.SensorFloat64 = 10; expected_rtn = -1; rtn = oh_compare_sensorreading(reading1.Type, &reading1, &reading2); if (rtn != expected_rtn) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received return code=%d\n", rtn); return -1; } /* oh_compare_sensorreading - reading1 = reading2 float64 */ reading1.Value.SensorFloat64 = 5; reading2.Value.SensorFloat64 = 5; expected_rtn = 0; rtn = oh_compare_sensorreading(reading1.Type, &reading1, &reading2); if (rtn != expected_rtn) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received return code=%d\n", rtn); return -1; } /* oh_compare_sensorreading - reading1 = reading2 float64 */ reading1.Value.SensorFloat64 = 10; reading2.Value.SensorFloat64 = 5; expected_rtn = 1; rtn = oh_compare_sensorreading(reading1.Type, &reading1, &reading2); if (rtn != expected_rtn) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received return code=%d\n", rtn); return -1; } reading1.Type = reading2.Type = SAHPI_SENSOR_READING_TYPE_INT64; /* oh_compare_sensorreading - reading1 < reading2 int64 */ reading1.Value.SensorInt64 = 5; reading2.Value.SensorInt64 = 10; expected_rtn = -1; rtn = oh_compare_sensorreading(reading1.Type, &reading1, &reading2); if (rtn != expected_rtn) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received return code=%d\n", rtn); return -1; } /* oh_compare_sensorreading - reading1 = reading2 int64 */ reading1.Value.SensorInt64 = 5; reading2.Value.SensorInt64 = 5; expected_rtn = 0; rtn = oh_compare_sensorreading(reading1.Type, &reading1, &reading2); if (rtn != expected_rtn) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received return code=%d\n", rtn); return -1; } /* oh_compare_sensorreading - reading1 = reading2 int64 */ reading1.Value.SensorInt64 = 10; reading2.Value.SensorInt64 = 5; expected_rtn = 1; rtn = oh_compare_sensorreading(reading1.Type, &reading1, &reading2); if (rtn != expected_rtn) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received return code=%d\n", rtn); return -1; } reading1.Type = reading2.Type = SAHPI_SENSOR_READING_TYPE_UINT64; /* oh_compare_sensorreading - reading1 < reading2 uint64 */ reading1.Value.SensorUint64 = 5; reading2.Value.SensorUint64 = 10; expected_rtn = -1; rtn = oh_compare_sensorreading(reading1.Type, &reading1, &reading2); if (rtn != expected_rtn) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received return code=%d\n", rtn); return -1; } /* oh_compare_sensorreading - reading1 = reading2 uint64 */ reading1.Value.SensorUint64 = 5; reading2.Value.SensorUint64 = 5; expected_rtn = 0; rtn = oh_compare_sensorreading(reading1.Type, &reading1, &reading2); if (rtn != expected_rtn) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received return code=%d\n", rtn); return -1; } /* oh_compare_sensorreading - reading1 = reading2 uint64 */ reading1.Value.SensorUint64 = 10; reading2.Value.SensorUint64 = 5; expected_rtn = 1; rtn = oh_compare_sensorreading(reading1.Type, &reading1, &reading2); if (rtn != expected_rtn) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received return code=%d\n", rtn); return -1; } reading1.Type = reading2.Type = SAHPI_SENSOR_READING_TYPE_BUFFER; /* oh_compare_sensorreading - reading1 < reading2 uint64 */ strncpy((char *)reading1.Value.SensorBuffer, "AAA", SAHPI_SENSOR_BUFFER_LENGTH); strncpy((char *)reading2.Value.SensorBuffer, "BBB", SAHPI_SENSOR_BUFFER_LENGTH); expected_rtn = -1; rtn = oh_compare_sensorreading(reading1.Type, &reading1, &reading2); if (rtn != expected_rtn) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received return code=%d\n", rtn); return -1; } } /************************************ * oh_valid_ctrl_state_mode testcases ************************************/ { SaHpiCtrlModeT default_mode, mode; SaHpiCtrlStateT default_state, state; SaHpiCtrlRecT default_rdr, rdr; memset(&default_mode, 0, sizeof(SaHpiCtrlModeT)); memset(&default_state, 0, sizeof(SaHpiCtrlStateT)); memset(&default_rdr, 0, sizeof(SaHpiCtrlRecT)); default_mode = SAHPI_CTRL_MODE_AUTO; default_state.Type = SAHPI_CTRL_TYPE_DIGITAL; default_state.StateUnion.Digital = SAHPI_CTRL_STATE_OFF; default_rdr.Num = 1; default_rdr.OutputType = SAHPI_CTRL_LED; default_rdr.Type = SAHPI_CTRL_TYPE_DIGITAL; default_rdr.TypeUnion.Digital.Default = SAHPI_CTRL_STATE_OFF; default_rdr.DefaultMode.Mode = SAHPI_CTRL_MODE_AUTO; default_rdr.DefaultMode.ReadOnly = SAHPI_TRUE; default_rdr.WriteOnly = SAHPI_TRUE; default_rdr.Oem = 0; /* oh_valid_ctrl_state_mode: Normal testcase */ mode = default_mode; state = default_state; rdr = default_rdr; expected_err = SA_OK; err = oh_valid_ctrl_state_mode(&rdr, mode, &state); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* oh_valid_ctrl_state_mode: Bad mode testcase */ mode = BAD_TYPE; state = default_state; rdr = default_rdr; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_valid_ctrl_state_mode(&rdr, mode, &state); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* oh_valid_ctrl_state_mode: Write read-only control testcase */ mode = SAHPI_CTRL_MODE_MANUAL; state = default_state; rdr = default_rdr; expected_err = SA_ERR_HPI_READ_ONLY; err = oh_valid_ctrl_state_mode(&rdr, mode, &state); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* oh_valid_ctrl_state_mode: Bad analog testcase */ mode = SAHPI_CTRL_MODE_MANUAL; state = default_state; rdr = default_rdr; state.Type = SAHPI_CTRL_TYPE_ANALOG; state.StateUnion.Analog = 50; rdr.DefaultMode.ReadOnly = SAHPI_FALSE; rdr.Type = SAHPI_CTRL_TYPE_ANALOG; rdr.TypeUnion.Analog.Max = 49; expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_valid_ctrl_state_mode(&rdr, mode, &state); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* oh_valid_ctrl_state_mode: Bad stream testcase */ mode = SAHPI_CTRL_MODE_MANUAL; state = default_state; rdr = default_rdr; state.Type = SAHPI_CTRL_TYPE_STREAM; state.StateUnion.Stream.StreamLength = SAHPI_CTRL_MAX_STREAM_LENGTH + 1; rdr.DefaultMode.ReadOnly = SAHPI_FALSE; rdr.Type = SAHPI_CTRL_TYPE_STREAM; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_valid_ctrl_state_mode(&rdr, mode, &state); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* oh_valid_ctrl_state_mode: Bad overflow testcase */ mode = SAHPI_CTRL_MODE_MANUAL; state = default_state; rdr = default_rdr; state.Type = SAHPI_CTRL_TYPE_TEXT; state.StateUnion.Text.Line = 10; state.StateUnion.Text.Text.DataType = SAHPI_TL_TYPE_TEXT; state.StateUnion.Text.Text.Language = SAHPI_LANG_ENGLISH; state.StateUnion.Text.Text.DataLength = 11; rdr.DefaultMode.ReadOnly = SAHPI_FALSE; rdr.Type = SAHPI_CTRL_TYPE_TEXT; rdr.TypeUnion.Text.MaxChars = 10; rdr.TypeUnion.Text.MaxLines = 10; rdr.TypeUnion.Text.Language = SAHPI_LANG_ENGLISH; rdr.TypeUnion.Text.DataType = SAHPI_TL_TYPE_TEXT; expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_valid_ctrl_state_mode(&rdr, mode, &state); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* oh_valid_ctrl_state_mode: Bad overflow all lines testcase */ mode = SAHPI_CTRL_MODE_MANUAL; state = default_state; rdr = default_rdr; state.Type = SAHPI_CTRL_TYPE_TEXT; state.StateUnion.Text.Line = SAHPI_TLN_ALL_LINES; state.StateUnion.Text.Text.DataType = SAHPI_TL_TYPE_TEXT; state.StateUnion.Text.Text.Language = SAHPI_LANG_ENGLISH; state.StateUnion.Text.Text.DataLength = 101; rdr.DefaultMode.ReadOnly = SAHPI_FALSE; rdr.Type = SAHPI_CTRL_TYPE_TEXT; rdr.TypeUnion.Text.MaxChars = 10; rdr.TypeUnion.Text.MaxLines = 10; rdr.TypeUnion.Text.Language = SAHPI_LANG_ENGLISH; rdr.TypeUnion.Text.DataType = SAHPI_TL_TYPE_TEXT; expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_valid_ctrl_state_mode(&rdr, mode, &state); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } } return(0); } openhpi-3.6.1/utils/t/el/0000755000175100017510000000000012605014521014152 5ustar mohanmohanopenhpi-3.6.1/utils/t/el/el_test_036.c0000755000175100017510000000223112575647300016363 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies the failure of oh_el_map_from_file when * el == NULL * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; /* test failure of oh_el_map_from_file with el==NULL */ el = NULL; retc = oh_el_map_from_file(el, "./elTest.data"); if (retc == SA_OK) { CRIT("oh_el_map_from_file failed."); return 1; } return 0; } openhpi-3.6.1/utils/t/el/el_test_029.c0000755000175100017510000000317212575647300016372 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies failure of oh_el_get when entryid < myentry->event.EntryId * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; oh_el_entry *entry; SaHpiEventLogEntryIdT prev, next, myentry; SaErrorT retc; /* set entryid < myentry->event.EntryId */ el = oh_el_create(20); retc = oh_el_map_from_file(el, "./elTest.data"); if (retc != SA_OK) { CRIT("oh_el_map_from_file failed."); return 1; } entry = (oh_el_entry *)(g_list_first(el->list)->data); myentry = entry->event.EntryId--; retc = oh_el_get(el, myentry, &prev, &next, &entry); if (retc == SA_OK) { CRIT("oh_el_get failed."); return 1; } /* close el */ retc = oh_el_close(el); if (retc != SA_OK) { CRIT("oh_el_close on el failed."); return 1; } return 0; } openhpi-3.6.1/utils/t/el/el_test_026.c0000755000175100017510000000304112575647300016362 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies failure of oh_el_get when prev == NULL * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; oh_el_entry *entry; SaHpiEventLogEntryIdT next; SaErrorT retc; /* set prev == NULL */ el = oh_el_create(20); retc = oh_el_map_from_file(el, "./elTest.data"); if (retc != SA_OK) { CRIT("oh_el_map_from_file failed."); return 1; } entry = (oh_el_entry *)(g_list_first(el->list)->data); retc = oh_el_get(el, entry->event.EntryId, NULL, &next, &entry); if (retc == SA_OK) { CRIT("oh_el_get failed."); return 1; } /* close el */ retc = oh_el_close(el); if (retc != SA_OK) { CRIT("oh_el_close on el failed."); return 1; } return 0; } openhpi-3.6.1/utils/t/el/el_test_007.c0000755000175100017510000000425712575647300016373 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test modifies the timestamp basetime. * It then adds a new entry and examines the * timestamp to verify accuracy. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; SaHpiEventLogInfoT info; SaHpiEventT event; SaHpiTimeT timestamp = 1000000000LL; static char *data[1] = { "Test data" }; /* create a new EL of size 20*/ el = oh_el_create(20); /* add an event to el */ event.Source = 1; event.EventType = SAHPI_ET_USER; event.Timestamp = SAHPI_TIME_UNSPECIFIED; event.Severity = SAHPI_DEBUG; strcpy((char *)event.EventDataUnion.UserEvent.UserEventData.Data, data[0]); /* modifies the timestamp basetime */ retc = oh_el_timeset(el, timestamp); if (retc != SA_OK){ CRIT("timeset failed"); return 1; } retc = oh_el_append(el, &event, NULL, NULL); if (retc != SA_OK) { CRIT("oh_el_append failed."); return 1; } /* get el info */ retc = oh_el_info(el, &info); if (retc != SA_OK) { CRIT("oh_el_info failed."); return 1; } /* Verifies timestamp basetime worked */ if (info.UpdateTimestamp < timestamp){ CRIT("Timestamp basetime failed"); return 1; } /* close el without saving to file*/ retc = oh_el_close(el); if (retc != SA_OK) { CRIT("oh_el_close on el failed."); return 1; } return 0; } openhpi-3.6.1/utils/t/el/el_test_011.c0000755000175100017510000000267112575647300016364 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies failure of oh_el_append when el == NULL * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; SaHpiEventT event; static char *data[1] = { "Test data one" }; /* test oh_el_append with el==NULL*/ el = NULL; event.Source = 1; event.EventType = SAHPI_ET_USER; event.Timestamp = SAHPI_TIME_UNSPECIFIED; event.Severity = SAHPI_DEBUG; strcpy((char *) &event.EventDataUnion.UserEvent.UserEventData.Data, data[0]); retc = oh_el_append(el, &event, NULL, NULL); if (retc == SA_OK) { CRIT("oh_el_append failed."); return 1; } return 0; } openhpi-3.6.1/utils/t/el/el_test_002.c0000755000175100017510000000477112575647300016367 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test tests creates an EL and adds one event. * It then verifies there is one event and compares the * one event in the EL with the original event. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; SaHpiEventT event; oh_el_entry *entry; SaHpiEventLogEntryIdT prev, next; static char *data[1] = { "Test data one" }; /* create the EL */ el = oh_el_create(5); if(el == NULL) { CRIT("el == NULL."); return 1; } /* add a single event */ event.Source = 1; event.EventType = SAHPI_ET_USER; event.Timestamp = SAHPI_TIME_UNSPECIFIED; event.Severity = SAHPI_DEBUG; strcpy((char *) &event.EventDataUnion.UserEvent.UserEventData.Data, data[0]); retc = oh_el_append(el, &event, NULL, NULL); if (retc != SA_OK) { CRIT("oh_el_append failed."); return 1; } entry = (oh_el_entry *)(g_list_first(el->list)->data); if(g_list_length(el->list) != 1){ CRIT("g_list_length does not return the correct number of entries."); return 1; } /* fetch the event for el*/ retc = oh_el_get(el, entry->event.EntryId, &prev, &next, &entry); if (retc != SA_OK) { CRIT("oh_el_get failed."); return 1; } if (strcmp((char *)entry->event.Event.EventDataUnion.UserEvent.UserEventData.Data, data[0])) { CRIT("Data from el and what was entered into el do not match"); return 1; } /* close the EL */ retc = oh_el_close(el); if (retc != SA_OK) { CRIT("oh_el_close failed."); return 1; } return 0; } openhpi-3.6.1/utils/t/el/el_test_004.c0000755000175100017510000000466612575647300016374 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test creates an EL and adds five events. * It then verifies there are five entries in the EL and * that the events are the same as the initial events. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el, *el2; int x; SaErrorT retc; SaHpiEventT event; static char *data[5] = { "Test data one", "Test data two", "Test data three", "Test data four", "Test data five" }; /* create the EL */ el = oh_el_create(30); el2 = oh_el_create(30); /* add 5 events to el */ for(x=0;x<5;x++){ event.Source = 1; event.EventType = SAHPI_ET_USER; event.Timestamp = SAHPI_TIME_UNSPECIFIED; event.Severity = SAHPI_DEBUG; strcpy((char *) &event.EventDataUnion.UserEvent.UserEventData.Data, data[x]); retc = oh_el_append(el, &event, NULL, NULL); if (retc != SA_OK) { CRIT("oh_el_append failed."); return 1; } } /* save the EL to file */ retc = oh_el_map_to_file(el, "./elTest.data"); if (retc != SA_OK) { CRIT("oh_el_map_to_file failed."); return 1; } /* get EL from file (el2) */ retc = oh_el_map_from_file(el2, "./elTest.data"); if (retc != SA_OK) { CRIT("oh_el_map_from_file failed."); return 1; } if(g_list_length(el->list) != g_list_length(el2->list)) { CRIT("el->list != el2->list."); return 1; } /* close the el */ retc = oh_el_close(el); if (retc != SA_OK) { CRIT("oh_el_close failed."); return 1; } return 0; } openhpi-3.6.1/utils/t/el/el_test_040.c0000755000175100017510000000214112575647300016356 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies the failure of oh_el_timeset when * el == NULL * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaHpiTimeT timestamp = 0; SaErrorT retc; /* tests oh_el_timeset when el == NULL */ el = NULL; retc = oh_el_timeset(el, timestamp + 20); if (retc == SA_OK){ CRIT("oh_el_timeset failed"); return 1; } return 0; } openhpi-3.6.1/utils/t/el/el_test_006.c0000755000175100017510000001022412575647300016361 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test creates a new EL, adds 5 entries and saves the EL * to a file. It then retrieves the EL and adds 5 entries to both * the initial and retrieved ELs. It then checks the number of entries * and compares the two ELs. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el, *el2; int x; SaErrorT retc, retc1, retc2; SaHpiEventT event; static char *data[10] = { "Test data one", "Test data two", "Test data three", "Test data four", "Test data five", "Test data six", "Test data seven", "Test data eight", "Test data nine", "Test data ten" }; /* create a new EL of size 20*/ el = oh_el_create(20); el2 = oh_el_create(20); /* add 5 events to el */ for(x=0;x<5;x++){ event.Source = 1; event.EventType = SAHPI_ET_USER; event.Timestamp = SAHPI_TIME_UNSPECIFIED; event.Severity = SAHPI_DEBUG; strcpy((char *)event.EventDataUnion.UserEvent.UserEventData.Data, data[x]); retc = oh_el_append(el, &event, NULL, NULL); if (retc != SA_OK) { CRIT("oh_el_append failed."); return 1; } } /* save the EL to file */ retc1 = oh_el_map_to_file(el, "./elTest.data"); if (retc1 != SA_OK) { CRIT("oh_el_map_to_file failed."); return 1; } /* get EL from file (el2) */ retc2 = oh_el_map_from_file(el2, "./elTest.data"); if (retc2 != SA_OK) { CRIT("oh_el_map_from_file failed."); return 1; } /* add 5 more events to el */ for(x=5;x<10;x++){ event.Source = 1; event.EventType = SAHPI_ET_USER; event.Timestamp = SAHPI_TIME_UNSPECIFIED; event.Severity = SAHPI_DEBUG; strcpy((char *)event.EventDataUnion.UserEvent.UserEventData.Data, data[x]); retc = oh_el_append(el, &event, NULL, NULL); if (retc != SA_OK) { CRIT("oh_el_append failed."); return 1; } } /* add 5 more events to el2 */ for(x=5;x<10;x++){ event.Source = 1; event.EventType = SAHPI_ET_USER; event.Timestamp = SAHPI_TIME_UNSPECIFIED; event.Severity = SAHPI_DEBUG; strcpy((char *)event.EventDataUnion.UserEvent.UserEventData.Data, data[x]); retc = oh_el_append(el2, &event, NULL, NULL); if (retc != SA_OK) { CRIT("oh_el_append failed."); return 1; } } /* verify number of entries in el and el2 is 10 */ if(g_list_length(el->list) != 10) { CRIT("el->list does not have the correct number of entries"); return 1; } if(g_list_length(el2->list) != 10) { CRIT("el2->list does not have the correct number of entries"); return 1; } /* compare entry contents of el and el2 */ retc = el_compare(el,el2); if (retc != SA_OK){ CRIT("el and el2 do not have matching entries."); return 1; } /* close el */ retc1 = oh_el_close(el); if (retc1 != SA_OK) { CRIT("oh_el_close on el failed."); return 1; } /* close el2 */ retc2 = oh_el_close(el2); if (retc2 != SA_OK) { CRIT("oh_el_close on el2 failed."); return 1; } return 0; } openhpi-3.6.1/utils/t/el/el_compare.c0000755000175100017510000000313312575647300016444 0ustar mohanmohan#include #include #include #include #include #include "el_test.h" /* function to compare two event logs */ int el_compare(oh_el *el1, oh_el *el2) { oh_el_entry *entry1, *entry2; SaHpiEventLogEntryIdT prev1, prev2, next1, next2, cur1, cur2; SaErrorT retc; if (g_list_length(el1->list) != g_list_length(el2->list)) { CRIT("el1->list != el2->list."); return 1; } if ((g_list_length(el1->list) == 0) && (g_list_length(el2->list) == 0)) { return 0; } next1 = SAHPI_OLDEST_ENTRY; next2 = SAHPI_OLDEST_ENTRY; while (next1 != SAHPI_NO_MORE_ENTRIES) { cur1 = next1; cur2 = next2; /* fetch the event for el1*/ retc = oh_el_get(el1, cur1, &prev1, &next1, &entry1); if (retc != SA_OK) { CRIT("oh_el_get failed."); return 1; } /* fetch the event for el2*/ retc = oh_el_get(el2, cur2, &prev2, &next2, &entry2); if (retc != SA_OK) { CRIT("oh_el_get failed."); return 1; } if (memcmp(&entry1->event.Event, &entry2->event.Event, sizeof(SaHpiEventT))) { CRIT("Data from el1 and el2 do not match"); return 1; } /* Compare resource from el1 and el2 */ if (memcmp(&entry1->res, &entry2->res, sizeof(SaHpiRptEntryT))) { CRIT("Res from el1 and el2 do not match."); return 1; } /* Compare rdr from el1 and el2 */ if (memcmp(&entry1->rdr, &entry2->rdr, sizeof(SaHpiRdrT))) { CRIT("Rdr from el1 and el2 do not match."); return 1; } } return 0; } openhpi-3.6.1/utils/t/el/el_test_027.c0000755000175100017510000000256612575647300016376 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies failure of oh_el_get when EL is empty * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; oh_el_entry *entry; SaHpiEventLogEntryIdT prev, next; SaErrorT retc; /* create an empty EL */ el = oh_el_create (20); /* fetch the event for el*/ retc = oh_el_get(el, SAHPI_FIRST_ENTRY, &prev, &next, &entry); if (retc == SA_OK) { CRIT("oh_el_get failed."); return 1; } /* close el */ retc = oh_el_close(el); if (retc != SA_OK) { CRIT("oh_el_close on el failed."); return 1; } return 0; } openhpi-3.6.1/utils/t/el/el_test_032.c0000755000175100017510000000242312575647300016362 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test creates an EL and resets info.OverflowFlag (oh_el_overflowreset) * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; /* map el from file*/ el = oh_el_create(20); retc = oh_el_map_from_file(el, "./elTest.data"); if (retc != SA_OK) { CRIT("oh_el_map_from_file failed."); return 1; } retc = oh_el_overflowreset(el); if (retc != SA_OK) { CRIT("el info.OverflowFlagreset failed."); return 1; } return 0; } openhpi-3.6.1/utils/t/el/el_test_042.c0000755000175100017510000000245512575647300016370 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test creates an EL and verifies correctness of oh_el_timeset * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaHpiTimeT timestamp = 0; SaErrorT retc; /* tests oh_el_timeset when el != NULL */ el = oh_el_create(20); retc = oh_el_timeset(el, timestamp + 20); if (retc != SA_OK){ CRIT("oh_el_timeset failed"); return 1; } /* close el without saving to file*/ retc = oh_el_close(el); if (retc != SA_OK) { CRIT("oh_el_close on el failed."); return 1; } return 0; } openhpi-3.6.1/utils/t/el/el_test_001.c0000755000175100017510000000361312575647300016360 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include #include /** * main: EL test * * This test tests the creation of an EL. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; el = oh_el_create(5); if(el == NULL) { CRIT("el pointer == NULL."); return 1; } if(el->info.Enabled != TRUE) { CRIT("el->info.Enabled invalid."); return 1; } if(el->info.OverflowFlag != FALSE) { CRIT("el->info.OverflowFlag invalid."); return 1; } if(el->info.UpdateTimestamp != SAHPI_TIME_UNSPECIFIED) { CRIT("el->info.UpdateTimestamp invalid."); return 1; } if(el->basetime != 0) { CRIT("el->basetime invalid."); return 1; } if(el->nextid != SAHPI_OLDEST_ENTRY + 1) { CRIT("el->nextid invalid."); return 1; } if(el->info.Size != 5) { CRIT("el->info.Size invalid."); return 1; } if(el->list != NULL) { CRIT("el->list invalid."); return 1; } return 0; } openhpi-3.6.1/utils/t/el/el_test_024.c0000755000175100017510000000224012575647300016360 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies failure of oh_el_get when el == NULL * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; oh_el_entry *entry; SaHpiEventLogEntryIdT prev, next; SaErrorT retc; /* test case 1: el == NULL */ el = NULL; retc = oh_el_get(el, SAHPI_NEWEST_ENTRY, &prev, &next, &entry); if (retc == SA_OK) { CRIT("oh_el_get failed."); return 1; } return 0; } openhpi-3.6.1/utils/t/el/el_test_013.c0000755000175100017510000000344512575647300016366 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies failure of oh_el_append when entries added * over length of EL (overload). * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; int x; SaHpiEventT event; static char *data[10] = { "Test data one", "Test data two", "Test data three", "Test data four", "Test data five", "Test data six", "Test data seven", "Test data eight", "Test data nine", "Test data ten" }; el = oh_el_create(1); event.Source = 1; event.EventType = SAHPI_ET_USER; event.Timestamp = SAHPI_TIME_UNSPECIFIED; event.Severity = SAHPI_DEBUG; for(x=0;x<10;x++){ strcpy((char *) &event.EventDataUnion.UserEvent.UserEventData.Data, data[x]); retc = oh_el_append(el, &event, NULL, NULL); if (retc != SA_OK) { CRIT("oh_el_append failed."); return 1; } } /* close el */ retc = oh_el_close(el); if (retc != SA_OK) { CRIT("oh_el_close on el failed."); return 1; } return 0; } openhpi-3.6.1/utils/t/el/el_test_038.c0000755000175100017510000000252212575647300016370 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies the failure of oh_el_map_from_file when filename == NULL * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; /* test failure of oh_el_map_from_file with filename == NULL */ el = oh_el_create(20); retc = oh_el_map_from_file(el, NULL); if (retc == SA_OK) { CRIT("oh_el_map_from_file failed."); return 1; } /* close el */ retc = oh_el_close(el); if (retc != SA_OK) { CRIT("oh_el_close on el failed."); return 1; } return 0; } openhpi-3.6.1/utils/t/el/el_test_031.c0000755000175100017510000000247412575647300016367 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies the failure of oh_el_info * when info == NULL * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; /* test oh_el_info with info == NULL */ el = oh_el_create(20); retc = oh_el_info(el, NULL); if (retc == SA_OK) { CRIT("oh_el_info failed."); return 1; } /* close el without saving to file*/ retc = oh_el_close(el); if (retc != SA_OK) { CRIT("oh_el_close on el failed."); return 1; } return 0; } openhpi-3.6.1/utils/t/el/el_test_035.c0000755000175100017510000000250512575647300016366 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies the failure of oh_el_map_to_file * when filename == NULL. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; /* attempt to save an el to a filename == NULL */ el = oh_el_create(20); retc = oh_el_map_to_file(el, NULL); if (retc == SA_OK) { CRIT("oh_el_map_to_file failed."); return 1; } /* close el */ retc = oh_el_close(el); if (retc != SA_OK) { CRIT("oh_el_close on el failed."); return 1; } return 0; } openhpi-3.6.1/utils/t/el/el_test_044.c0000755000175100017510000000233612575647300016370 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies the failure of oh_el_setgentimestampflag * when el == NULL. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; SaHpiBoolT flag = 0; /* create a null EL and attempt to save it to file */ el = NULL; /* save the EL to file */ retc = oh_el_setgentimestampflag(el, flag); if (retc == SA_OK) { CRIT("oh_el_setgentimestampflag failed."); return 1; } return 0; } openhpi-3.6.1/utils/t/el/el_test_033.c0000755000175100017510000000215512575647300016365 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies failure of oh_el_info.OverflowFlagreset when * el == NULL * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; /* attempt to clear a null EL*/ el = NULL; retc = oh_el_overflowreset(el); if (retc == SA_OK) { CRIT("oh_el_overflowreset failed."); return 1; } return 0; } openhpi-3.6.1/utils/t/el/Makefile.am0000755000175100017510000001421712575647300016233 0ustar mohanmohan# (C) Copyright IBM Corp 2003, 2004 # All rights reserved. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. MAINTAINERCLEANFILES = Makefile.in REMOTE_SOURCES = announcement_utils.c \ el_utils.c \ epath_utils.c \ rpt_utils.c \ sahpi_enum_utils.c \ sahpi_event_encode.c \ sahpi_event_utils.c \ sahpi_struct_utils.c \ sahpi_time_utils.c \ sahpiatca_enum_utils.c \ sahpixtca_enum_utils.c \ sahpi_wrappers.c \ uid_utils.c MOSTLYCLEANFILES = $(shell ls *data) $(REMOTE_SOURCES) @TEST_CLEAN@ CLEANFILES = $(top_builddir)/src/t/el/elTest.data AM_CPPFLAGS = -DG_LOG_DOMAIN=\"t\" AM_CPPFLAGS += @OPENHPI_INCLUDES@ $(REMOTE_SOURCES): if test ! -f $@ -a ! -L $@; then \ $(LN_S) $(top_srcdir)/utils/$@; \ fi TESTS = el_test_001 \ el_test_002 \ el_test_003 \ el_test_004 \ el_test_005 \ el_test_006 \ el_test_007 \ el_test_008 \ el_test_009 \ el_test_010 \ el_test_011 \ el_test_012 \ el_test_013 \ el_test_014 \ el_test_015 \ el_test_016 \ el_test_017 \ el_test_018 \ el_test_019 \ el_test_020 \ el_test_021 \ el_test_022 \ el_test_023 \ el_test_024 \ el_test_025 \ el_test_026 \ el_test_027 \ el_test_028 \ el_test_029 \ el_test_030 \ el_test_031 \ el_test_032 \ el_test_033 \ el_test_034 \ el_test_035 \ el_test_036 \ el_test_037 \ el_test_038 \ el_test_039 \ el_test_040 \ el_test_041 \ el_test_042 \ el_test_043 \ el_test_044 \ el_test_045 check_PROGRAMS = $(TESTS) el_test_001_SOURCES = el_test.h el_test_001.c nodist_el_test_001_SOURCES = $(REMOTE_SOURCES) el_test_002_SOURCES = el_test.h el_test_002.c nodist_el_test_002_SOURCES = $(REMOTE_SOURCES) el_test_003_SOURCES = el_test.h el_test_003.c nodist_el_test_003_SOURCES = $(REMOTE_SOURCES) el_test_004_SOURCES = el_test.h el_test_004.c nodist_el_test_004_SOURCES = $(REMOTE_SOURCES) el_test_005_SOURCES = el_test.h el_test_005.c el_compare.c nodist_el_test_005_SOURCES = $(REMOTE_SOURCES) el_test_006_SOURCES = el_test.h el_test_006.c el_compare.c nodist_el_test_006_SOURCES = $(REMOTE_SOURCES) el_test_007_SOURCES = el_test.h el_test_007.c nodist_el_test_007_SOURCES = $(REMOTE_SOURCES) el_test_008_SOURCES = el_test.h el_test_008.c nodist_el_test_008_SOURCES = $(REMOTE_SOURCES) el_test_009_SOURCES = el_test.h el_test_009.c nodist_el_test_009_SOURCES = $(REMOTE_SOURCES) el_test_010_SOURCES = el_test.h el_test_010.c nodist_el_test_010_SOURCES = $(REMOTE_SOURCES) el_test_011_SOURCES = el_test.h el_test_011.c nodist_el_test_011_SOURCES = $(REMOTE_SOURCES) el_test_012_SOURCES = el_test.h el_test_012.c nodist_el_test_012_SOURCES = $(REMOTE_SOURCES) el_test_013_SOURCES = el_test.h el_test_013.c nodist_el_test_013_SOURCES = $(REMOTE_SOURCES) el_test_014_SOURCES = el_test.h el_test_014.c nodist_el_test_014_SOURCES = $(REMOTE_SOURCES) el_test_015_SOURCES = el_test.h el_test_015.c nodist_el_test_015_SOURCES = $(REMOTE_SOURCES) el_test_016_SOURCES = el_test.h el_test_016.c nodist_el_test_016_SOURCES = $(REMOTE_SOURCES) el_test_017_SOURCES = el_test.h el_test_017.c nodist_el_test_017_SOURCES = $(REMOTE_SOURCES) el_test_018_SOURCES = el_test.h el_test_018.c nodist_el_test_018_SOURCES = $(REMOTE_SOURCES) el_test_019_SOURCES = el_test.h el_test_019.c nodist_el_test_019_SOURCES = $(REMOTE_SOURCES) el_test_020_SOURCES = el_test.h el_test_020.c nodist_el_test_020_SOURCES = $(REMOTE_SOURCES) el_test_021_SOURCES = el_test.h el_test_021.c nodist_el_test_021_SOURCES = $(REMOTE_SOURCES) el_test_022_SOURCES = el_test.h el_test_022.c nodist_el_test_022_SOURCES = $(REMOTE_SOURCES) el_test_023_SOURCES = el_test.h el_test_023.c nodist_el_test_023_SOURCES = $(REMOTE_SOURCES) el_test_024_SOURCES = el_test.h el_test_024.c nodist_el_test_024_SOURCES = $(REMOTE_SOURCES) el_test_025_SOURCES = el_test.h el_test_025.c nodist_el_test_025_SOURCES = $(REMOTE_SOURCES) el_test_026_SOURCES = el_test.h el_test_026.c nodist_el_test_026_SOURCES = $(REMOTE_SOURCES) el_test_027_SOURCES = el_test.h el_test_027.c nodist_el_test_027_SOURCES = $(REMOTE_SOURCES) el_test_028_SOURCES = el_test.h el_test_028.c nodist_el_test_028_SOURCES = $(REMOTE_SOURCES) el_test_029_SOURCES = el_test.h el_test_029.c nodist_el_test_029_SOURCES = $(REMOTE_SOURCES) el_test_030_SOURCES = el_test.h el_test_030.c nodist_el_test_030_SOURCES = $(REMOTE_SOURCES) el_test_031_SOURCES = el_test.h el_test_031.c nodist_el_test_031_SOURCES = $(REMOTE_SOURCES) el_test_032_SOURCES = el_test.h el_test_032.c nodist_el_test_032_SOURCES = $(REMOTE_SOURCES) el_test_033_SOURCES = el_test.h el_test_033.c nodist_el_test_033_SOURCES = $(REMOTE_SOURCES) el_test_034_SOURCES = el_test.h el_test_034.c nodist_el_test_034_SOURCES = $(REMOTE_SOURCES) el_test_035_SOURCES = el_test.h el_test_035.c nodist_el_test_035_SOURCES = $(REMOTE_SOURCES) el_test_036_SOURCES = el_test.h el_test_036.c nodist_el_test_036_SOURCES = $(REMOTE_SOURCES) el_test_037_SOURCES = el_test.h el_test_037.c nodist_el_test_037_SOURCES = $(REMOTE_SOURCES) el_test_038_SOURCES = el_test.h el_test_038.c nodist_el_test_038_SOURCES = $(REMOTE_SOURCES) el_test_039_SOURCES = el_test.h el_test_039.c nodist_el_test_039_SOURCES = $(REMOTE_SOURCES) el_test_040_SOURCES = el_test.h el_test_040.c nodist_el_test_040_SOURCES = $(REMOTE_SOURCES) el_test_041_SOURCES = el_test.h el_test_041.c nodist_el_test_041_SOURCES = $(REMOTE_SOURCES) el_test_042_SOURCES = el_test.h el_test_042.c nodist_el_test_042_SOURCES = $(REMOTE_SOURCES) el_test_043_SOURCES = el_test.h el_test_043.c nodist_el_test_043_SOURCES = $(REMOTE_SOURCES) el_test_044_SOURCES = el_test.h el_test_044.c nodist_el_test_044_SOURCES = $(REMOTE_SOURCES) el_test_045_SOURCES = el_test.h el_test_045.c nodist_el_test_045_SOURCES = $(REMOTE_SOURCES) openhpi-3.6.1/utils/t/el/el_test_037.c0000755000175100017510000000262612575647300016374 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies the failure of oh_el_map_from_file el->info.Enabled == SAHPI_FALSE * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; /* test failure of oh_el_map_from_file with el->info.Enabled == SAHPI_FALSE */ el = oh_el_create(20); el->info.Enabled = SAHPI_FALSE; retc = oh_el_map_from_file(el, "./elTest.data"); if (retc == SA_OK) { CRIT("oh_el_map_from_file failed."); return 1; } /* close el */ retc = oh_el_close(el); if (retc != SA_OK) { CRIT("oh_el_close on el failed."); return 1; } return 0; } openhpi-3.6.1/utils/t/el/el_test.h0000755000175100017510000000107412575647300016004 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * David Ashley */ #include int el_compare(oh_el *el1, oh_el *el2); openhpi-3.6.1/utils/t/el/el_test_023.c0000755000175100017510000000211112575647300016354 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies failure of oh_el_clear when * el == NULL * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; /* attempt to clear a null EL*/ el = NULL; retc = oh_el_clear(el); if (retc == SA_OK) { CRIT("el clear failed."); return 1; } return 0; } openhpi-3.6.1/utils/t/el/el_test_041.c0000755000175100017510000000253112575647300016362 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies the failure of oh_el_timeset when * timestamp == SAHPI_TIME_UNSPECIFIED * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; /* tests oh_el_timeset when timestamp = SAHPI_TIME_UNSPECIFIED */ el = oh_el_create(20); retc = oh_el_timeset(el, SAHPI_TIME_UNSPECIFIED); if (retc == SA_OK){ CRIT("oh_el_timeset on el failed"); return 1; } /* close el without saving to file*/ retc = oh_el_close(el); if (retc != SA_OK) { CRIT("oh_el_close on el failed."); return 1; } return 0; } openhpi-3.6.1/utils/t/el/el_test_008.c0000755000175100017510000000415412575647300016370 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test adds 5 entries to an event log, It then clears the EL and * verifies the event log is actually clear. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; int x; SaHpiEventT event; static char *data[5] = { "Test data one", "Test data two", "Test data three", "Test data four", "Test data five" }; /* create a new EL of size 20*/ el = oh_el_create(20); /* add 5 events to el */ for(x=0; x<5; x++){ event.Source = 1; event.EventType = SAHPI_ET_USER; event.Timestamp = SAHPI_TIME_UNSPECIFIED; event.Severity = SAHPI_DEBUG; strcpy((char *) &event.EventDataUnion.UserEvent.UserEventData.Data, data[x]); retc = oh_el_append(el, &event, NULL, NULL); if (retc != SA_OK) { CRIT("oh_el_append failed."); return 1; } } /* clear the el */ retc = oh_el_clear(el); if (retc != SA_OK) { CRIT("el clear failed."); return 1; } /* verify el list nodes are cleared */ if(el->list != NULL){ CRIT("el clear failed."); return 1; } /* close el without saving to file*/ retc = oh_el_close(el); if (retc != SA_OK) { CRIT("oh_el_close on el failed."); return 1; } return 0; } openhpi-3.6.1/utils/t/el/el_test_015.c0000755000175100017510000000344012575647300016363 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies failure of oh_el_append when el->info.Size != * OH_EL_MAX_SIZE && g_list_length(el->list) == el->info.Size * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; SaHpiEventT event; static char *data[1] = { "Test data one" }; /*test oh_el_append with el->info.Size != OH_EL_MAX_SIZE && g_list_length(el->list) == el->info.Size */ el = oh_el_create(20); el->info.Size = g_list_length(el->list); event.Source = 1; event.EventType = SAHPI_ET_USER; event.Timestamp = SAHPI_TIME_UNSPECIFIED; event.Severity = SAHPI_DEBUG; strcpy((char *) &event.EventDataUnion.UserEvent.UserEventData.Data, data[0]); retc = oh_el_append(el, &event, NULL, NULL); if (retc != SA_OK) { CRIT("oh_el_append failed."); return 1; } /* close el */ retc = oh_el_close(el); if (retc != SA_OK) { CRIT("oh_el_close on el failed."); return 1; } return 0; } openhpi-3.6.1/utils/t/el/el_test_010.c0000755000175100017510000000401412575647300016354 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies oh_el_prepend by reading an * existing EL from a file, then prepending 5 events to the EL. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; int x; SaHpiEventT event; static char *data[5] = { "Test data one", "Test data two", "Test data three", "Test data four", "Test data five" }; /* test oh_el_prepend with existing EL*/ el = oh_el_create(20); /* get EL from file (el) */ retc = oh_el_map_from_file(el, "./elTest.data"); if (retc != SA_OK) { CRIT("oh_el_map_from_file failed."); return 1; } /* add 5 more events to el */ for(x=0;x<5;x++){ event.Source = 1; event.EventType = SAHPI_ET_USER; event.Timestamp = SAHPI_TIME_UNSPECIFIED; event.Severity = SAHPI_DEBUG; strcpy((char *) &event.EventDataUnion.UserEvent.UserEventData.Data, data[x]); retc = oh_el_prepend(el, &event, NULL, NULL); if (retc != SA_OK) { CRIT("oh_el_append failed."); return 1; } } /* close el */ retc = oh_el_close(el); if (retc != SA_OK) { CRIT("oh_el_close on el failed."); return 1; } return 0; } openhpi-3.6.1/utils/t/el/el_test_043.c0000755000175100017510000000252012575647300016362 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies failure of oh_el_timeset when timestamp > * SAHPI_TIME_MAX_RELATIVE * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; /* tests oh_el_timeset when timestamp > SAHPI_TIME_MAX_RELATIVE */ el = oh_el_create(20); retc = oh_el_timeset(el, SAHPI_TIME_MAX_RELATIVE + 20); if (retc != SA_OK){ CRIT("oh_el_timeset failed"); return 1; } /* close el without saving to file*/ retc = oh_el_close(el); if (retc != SA_OK) { CRIT("oh_el_close on el failed."); return 1; } return 0; } openhpi-3.6.1/utils/t/el/el_test_005.c0000755000175100017510000000545112575647300016366 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test creates a new EL, adds 10 entries and saves * the EL to a file. It then retrieves the EL and compares * entries between the initial and retrieved ELs. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el, *el2; int x; SaErrorT retc, retc1, retc2; SaHpiEventT event; static char *data[10] = { "Test data one", "Test data two", "Test data three", "Test data four", "Test data five", "Test data six", "Test data seven", "Test data eight", "Test data nine", "Test data ten" }; /* create a new EL of size 20*/ el = oh_el_create(20); el2 = oh_el_create(20); /* add 10 events to el */ for(x=0; x<10; x++){ event.Source = 1; event.EventType = SAHPI_ET_USER; event.Timestamp = SAHPI_TIME_UNSPECIFIED; event.Severity = SAHPI_DEBUG; strcpy((char *) &event.EventDataUnion.UserEvent.UserEventData.Data, data[x]); retc = oh_el_append(el, &event, NULL, NULL); if (retc != SA_OK) { CRIT("oh_el_append failed."); return 1; } } /* save the EL to file */ retc = oh_el_map_to_file(el, "./elTest.data"); if (retc != SA_OK) { CRIT("oh_el_map_to_file failed."); return 1; } /* get EL from file (el2) */ retc2 = oh_el_map_from_file(el2, "./elTest.data"); if (retc2 != SA_OK) { CRIT("oh_el_map_from_file failed."); return 1; } /* compare entry contents of el and el2 */ retc = el_compare(el,el2); if (retc != SA_OK){ CRIT("el and el2 do not have matching entries."); return 1; } /* close el */ retc1 = oh_el_close(el); if (retc1 != SA_OK) { CRIT("oh_el_close on el failed."); return 1; } /* close el2 */ retc2 = oh_el_close(el2); if (retc2 != SA_OK) { CRIT("oh_el_close on el2 failed."); return 1; } return 0; } openhpi-3.6.1/utils/t/el/el_test_009.c0000755000175100017510000000217312575647300016370 0ustar mohanmohan/* -*- linux-c -*- ** ** (C) Copyright IBM Corp. 2004 ** Copyright (c) 2004 by Intel Corp. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This ** file and program are licensed under a BSD style license. See ** the Copying file included with the OpenHPI distribution for ** full licensing terms. ** ** Authors: ** Christina Hernandez **/ #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This negative test sets el equal to null and * then verifies oh_el_close fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; /* create a null EL*/ el = NULL; /* close el without saving to file*/ retc = oh_el_close(el); if (retc == SA_OK) { CRIT("oh_el_close on el failed."); return 1; } return 0; } openhpi-3.6.1/utils/t/el/el_test_012.c0000755000175100017510000000245412575647300016364 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies failure of oh_el_append when event == NULL * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; /*test oh_el_append with event==NULL*/ el = oh_el_create(20); retc = oh_el_append(el, NULL, NULL, NULL); if (retc == SA_OK) { CRIT("oh_el_append failed."); return 1; } /* close el */ retc = oh_el_close(el); if (retc != SA_OK) { CRIT("oh_el_close on el failed."); return 1; } return 0; } openhpi-3.6.1/utils/t/el/el_test_016.c0000755000175100017510000000326412575647300016370 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies failure of oh_el_append when el-> gentimestamp == FALSE * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; SaHpiEventT event; static char *data[1] = { "Test data one" }; /*test oh_el_append with el->gentimestamp == FALSE*/ el = oh_el_create(20); event.Source = 1; event.EventType = SAHPI_ET_USER; event.Timestamp = SAHPI_TIME_UNSPECIFIED; event.Severity = SAHPI_DEBUG; el->gentimestamp = SAHPI_FALSE; strcpy((char *) &event.EventDataUnion.UserEvent.UserEventData.Data, data[0]); retc = oh_el_append(el, &event, NULL, NULL); if (retc != SA_OK) { CRIT("oh_el_append failed."); return 1; } /* close el */ retc = oh_el_close(el); if (retc != SA_OK) { CRIT("oh_el_close on el failed."); return 1; } return 0; } openhpi-3.6.1/utils/t/el/el_test_022.c0000755000175100017510000000356112575647300016365 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies failure of oh_el_prepend when res != NULL * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; int x; SaHpiEventT event; SaHpiRdrT rdr; static char *data[10] = { "Test data one", "Test data two", "Test data three", "Test data four", "Test data five", "Test data six", "Test data seven", "Test data eight", "Test data nine", "Test data ten" }; /*test oh_el_prepend with rdr != NULL */ el = oh_el_create(30); event.Source = 1; event.EventType = SAHPI_ET_USER; event.Timestamp = SAHPI_TIME_UNSPECIFIED; event.Severity = SAHPI_DEBUG; rdr.RecordId = 1; rdr.RdrType = SAHPI_INVENTORY_RDR; for(x=0;x<10;x++){ strcpy((char *) &event.EventDataUnion.UserEvent.UserEventData.Data, data[x]); retc = oh_el_prepend(el, &event, &rdr, NULL); if (retc != SA_OK) { CRIT("oh_el_prepend failed."); return 1; } } /* close el */ retc = oh_el_close(el); if (retc != SA_OK) { CRIT("oh_el_close on el failed."); return 1; } return 0; } openhpi-3.6.1/utils/t/el/el_test_030.c0000755000175100017510000000221212575647300016354 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies the failure of oh_el_info * when el == NULL * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; SaHpiEventLogInfoT info; /* test oh_el_info with el == NULL */ el = NULL; retc = oh_el_info(el, &info); if (retc == SA_OK) { CRIT("oh_el_info failed."); return 1; } return 0; } openhpi-3.6.1/utils/t/el/el_test_014.c0000755000175100017510000000341612575647300016365 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies failure of oh_el_append when el->info.Enabled == SAHPI_FALSE && * event->EventType != SAHPI_ET_USER * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; SaHpiEventT event; static char *data[10] = { "Test data one" }; /*test oh_el_append with el->info.Enabled == SAHPI_FALSE && event->EventType != SAHPI_ET_USER */ el = oh_el_create(20); el->info.Enabled = FALSE; event.Source = 1; event.EventType = SAHPI_ET_DOMAIN; event.Timestamp = SAHPI_TIME_UNSPECIFIED; event.Severity = SAHPI_DEBUG; strcpy((char *) &event.EventDataUnion.UserEvent.UserEventData.Data, data[0]); retc = oh_el_append(el, &event, NULL, NULL); if (retc == SA_OK) { CRIT("oh_el_append failed."); return 1; } /* close el */ retc = oh_el_close(el); if (retc != SA_OK) { CRIT("oh_el_close on el failed."); return 1; } return 0; } openhpi-3.6.1/utils/t/el/el_test_025.c0000755000175100017510000000245712575647300016373 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies failure of oh_el_get when entry == NULL * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaHpiBoolT flag=1; SaErrorT retc; /* tests oh_el_get for failure when entry == NULL */ el = oh_el_create(20); retc = oh_el_setgentimestampflag(el, flag); if (retc != SA_OK) { CRIT("oh_el_get failed."); return 1; } /* close el */ retc = oh_el_close(el); if (retc != SA_OK) { CRIT("oh_el_close on el failed."); return 1; } return 0; } openhpi-3.6.1/utils/t/el/el_test_017.c0000755000175100017510000000266412575647300016374 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies failure of oh_el_prepend when el == NULL * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; SaHpiEventT event; static char *data[1] = { "Test data one" }; /* test oh_el_prepend with el==NULL*/ el = NULL; event.Source = 1; event.EventType = SAHPI_ET_USER; event.Timestamp = SAHPI_TIME_UNSPECIFIED; event.Severity = SAHPI_DEBUG; strcpy((char *) &event.EventDataUnion.UserEvent.UserEventData.Data, data[0]); retc = oh_el_prepend(el, &event, NULL, NULL); if (retc == SA_OK) { CRIT("oh_el_prepend failed."); return 1; } return 0; } openhpi-3.6.1/utils/t/el/el_test_020.c0000755000175100017510000000347512575647300016367 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies failure of oh_el_prepend with log * info.OverflowFlag * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; SaHpiEventT event; static char *data[2] = { "Test data one", "Test data two" }; /*test oh_el_prepend with event log info.OverflowFlag */ el = oh_el_create(1); event.Source = 1; event.EventType = SAHPI_ET_USER; event.Timestamp = SAHPI_TIME_UNSPECIFIED; event.Severity = SAHPI_DEBUG; strcpy((char *) &event.EventDataUnion.UserEvent.UserEventData.Data, data[0]); retc = oh_el_prepend(el, &event, NULL, NULL); if (retc != SA_OK) { CRIT("oh_el_prepend failed."); return 1; } strcpy((char *) &event.EventDataUnion.UserEvent.UserEventData.Data, data[1]); retc = oh_el_prepend(el, &event, NULL, NULL); if (retc == SA_OK) { CRIT("oh_el_prepend failed."); return 1; } /* close el */ retc = oh_el_close(el); if (retc != SA_OK) { CRIT("oh_el_close on el failed."); return 1; } return 0; } openhpi-3.6.1/utils/t/el/el_test_028.c0000755000175100017510000000310212575647300016362 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies oh_el_get when entryid = SAHPI_NEWEST_ENTRY * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; oh_el_entry *entry; SaHpiEventLogEntryIdT prev, next; SaErrorT retc; /* set entryid = SAHPI_NEWEST_ENTRY */ el = oh_el_create(20); retc = oh_el_map_from_file(el, "./elTest.data"); if (retc != SA_OK) { CRIT("oh_el_map_from_file failed."); return 1; } entry = (oh_el_entry *)(g_list_first(el->list)->data); retc = oh_el_get(el, SAHPI_NEWEST_ENTRY, &prev, &next, &entry); if (retc != SA_OK) { CRIT("oh_el_get failed."); return 1; } /* close el */ retc = oh_el_close(el); if (retc != SA_OK) { CRIT("oh_el_close on el failed."); return 1; } return 0; } openhpi-3.6.1/utils/t/el/el_test_045.c0000755000175100017510000000325212575647300016367 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies failure of oh_el_prepend when el-> gentimestamp == FALSE * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; SaHpiEventT event; static char *data[1] = { "Test data one" }; /*test oh_el_prepend with el->gentimestamp == FALSE*/ el = oh_el_create(20); event.Source = 1; event.EventType = SAHPI_ET_USER; event.Timestamp = SAHPI_TIME_UNSPECIFIED; event.Severity = SAHPI_DEBUG; el->gentimestamp = SAHPI_FALSE; strcpy((char *) &event.EventDataUnion.UserEvent.UserEventData.Data, data[0]); retc = oh_el_prepend(el, &event, NULL, NULL); if (retc != SA_OK) { CRIT("oh_el_prepend failed."); return 1; } /* close el */ retc = oh_el_close(el); if (retc != SA_OK) { CRIT("oh_el_close on el failed."); return 1; } return 0; } openhpi-3.6.1/utils/t/el/el_test_018.c0000755000175100017510000000246112575647300016370 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies failure of oh_el_prepend when event == NULL * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; /*test oh_el_prepend with event==NULL*/ el = oh_el_create(20); retc = oh_el_prepend(el, NULL, NULL, NULL); if (retc == SA_OK) { CRIT("oh_el_prepend failed."); return 1; } /* close el */ retc = oh_el_close(el); if (retc != SA_OK) { CRIT("oh_el_close on el failed."); return 1; } return 0; } openhpi-3.6.1/utils/t/el/el_test_039.c0000755000175100017510000000255712575647300016401 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies the failure of oh_el_map_from_file when * filename does not exist. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; /* test failure of oh_el_map_from_file with nonexistant filename */ el = oh_el_create(20); retc = oh_el_map_from_file(el, "./notthere.data"); if (retc == SA_OK) { CRIT("oh_el_map_from_file failed."); return 1; } /* close el */ retc = oh_el_close(el); if (retc != SA_OK) { CRIT("oh_el_close on el failed."); return 1; } return 0; } openhpi-3.6.1/utils/t/el/el_test_003.c0000644000175100017510000000470312575647300016360 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test tests creates an EL and adds five events. * It then verifies there are five events in the EL and * that they are the same as the original events. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; int x; SaErrorT retc; SaHpiEventT event; SaHpiEventLogEntryIdT curr = SAHPI_FIRST_ENTRY, prev = 0, next = 0; oh_el_entry *entry; static char *data[5] = { "Test data one", "Test data two", "Test data three", "Test data four", "Test data five" }; /* create the EL */ el = oh_el_create(30); /* add 5 events to el */ for(x=0;x<5;x++){ event.Source = 1; event.EventType = SAHPI_ET_USER; event.Timestamp = SAHPI_TIME_UNSPECIFIED; event.Severity = SAHPI_DEBUG; strcpy((char *) &event.EventDataUnion.UserEvent.UserEventData.Data, data[x]); retc = oh_el_append(el, &event, NULL, NULL); if (retc != SA_OK) { CRIT("oh_el_append failed."); return 1; } } if(g_list_length(el->list) != 5){ CRIT("g_list_length does not hold the correct number of entries."); return 1; } for(x=0; curr != SAHPI_NO_MORE_ENTRIES; x++){ retc = oh_el_get(el, curr, &prev, &next, &entry); if (retc != SA_OK){ CRIT("oh_el_get failed."); return 1; } if (strcmp((char *)entry->event.Event.EventDataUnion.UserEvent.UserEventData.Data, data[x])){ CRIT("Data from el and original data do not match"); return 1; } curr = next; } /* close the el */ retc = oh_el_close(el); if (retc != SA_OK) { CRIT("oh_el_close failed."); return 1; } return 0; } openhpi-3.6.1/utils/t/el/el_test_034.c0000755000175100017510000000227312575647300016367 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies the failure of oh_el_map_to_file * when el == NULL. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; /* create a null EL and attempt to save it to file */ el = NULL; /* save the EL to file */ retc = oh_el_map_to_file(el, "./elTest.data"); if (retc == SA_OK) { CRIT("oh_el_map_to_file failed."); return 1; } return 0; } openhpi-3.6.1/utils/t/el/el_test_021.c0000755000175100017510000000366512575647300016371 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies failure of oh_el_prepend when res != NULL * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; int x; SaHpiEventT event; SaHpiRptEntryT res1; static char *data[10] = { "Test data one", "Test data two", "Test data three", "Test data four", "Test data five", "Test data six", "Test data seven", "Test data eight", "Test data nine", "Test data ten" }; /*test oh_el_prepend with res != NULL */ el = oh_el_create (30); event.Source = 1; event.EventType = SAHPI_ET_USER; event.Timestamp = SAHPI_TIME_UNSPECIFIED; event.Severity = SAHPI_DEBUG; res1.EntryId = 1; res1.ResourceId = 1; res1.ResourceSeverity = SAHPI_CRITICAL; res1.ResourceCapabilities = 1; for(x=0;x<10;x++){ strcpy((char *) &event.EventDataUnion.UserEvent.UserEventData.Data, data[x]); retc = oh_el_prepend(el, &event, NULL, &res1); if (retc != SA_OK) { CRIT("oh_el_prepend failed."); return 1; } } /* close el */ retc = oh_el_close(el); if (retc != SA_OK) { CRIT("oh_el_close on el failed."); return 1; } return 0; } openhpi-3.6.1/utils/t/el/el_test_019.c0000755000175100017510000000305112575647300016365 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies failure of oh_el_prepend when el->info.Enabled == SAHPI_FALSE * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; SaHpiEventT event; /*test oh_el_prepend with el->info.Enabled == SAHPI_FALSE*/ el = oh_el_create(20); el->info.Enabled = SAHPI_FALSE; event.Source = 1; event.EventType = SAHPI_ET_RESOURCE; event.Timestamp = SAHPI_TIME_UNSPECIFIED; event.Severity = SAHPI_DEBUG; retc = oh_el_prepend(el, &event, NULL, NULL); if (retc == SA_OK) { CRIT("oh_el_add failed."); return 1; } /* close el */ retc = oh_el_close(el); if (retc != SA_OK) { CRIT("oh_el_close on el failed."); return 1; } return 0; } openhpi-3.6.1/utils/t/uid/0000755000175100017510000000000012605014522014334 5ustar mohanmohanopenhpi-3.6.1/utils/t/uid/uid_utils_003.c0000644000175100017510000000233412575647301017102 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include /** * main: Get 10 new unique ids. Get 10 more with the same entity paths. * Passes if returned ids are equal to previous ones, * otherwise fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { SaHpiEntityPathT ep; guint id[10], rid, i; if (oh_uid_initialize()) return 1; oh_init_ep(&ep); for (i = 0; i < 10; i++) { ep.Entry[0].EntityLocation = i; id[i] = oh_uid_from_entity_path(&ep); } for (i = 0; i < 10; i++) { ep.Entry[0].EntityLocation = i; rid = oh_uid_from_entity_path(&ep); if (id[i] != rid) return 1; } return 0; } openhpi-3.6.1/utils/t/uid/uid_utils_008.c0000644000175100017510000000153512575647301017111 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include /** * main: Calls oh_uid_from_entity_path using a NULL entity path. * Passes if it returns 0, * otherwise fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { if (oh_uid_initialize()) return 1; if (oh_uid_from_entity_path(NULL)) return 1; return 0; } openhpi-3.6.1/utils/t/uid/Makefile.am0000644000175100017510000000504512575647301016411 0ustar mohanmohan# (C) Copyright IBM Corp 2003, 2004 # All rights reserved. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. MAINTAINERCLEANFILES = Makefile.in REMOTE_SOURCES = uid_utils.c \ epath_utils.c \ sahpi_enum_utils.c \ sahpiatca_enum_utils.c \ sahpixtca_enum_utils.c \ sahpi_event_encode.c \ sahpi_event_utils.c \ sahpi_struct_utils.c \ sahpi_wrappers.c \ sahpi_time_utils.c MOSTLYCLEANFILES = @TEST_CLEAN@ \ $(REMOTE_SOURCES) \ uid_map AM_CPPFLAGS = -DG_LOG_DOMAIN=\"t\" AM_CPPFLAGS += @OPENHPI_INCLUDES@ $(REMOTE_SOURCES): if test ! -f $@ -a ! -L $@; then \ $(LN_S) $(top_srcdir)/utils/$@; \ fi TESTS_ENVIRONMENT = OPENHPI_UID_MAP=$(shell pwd)/uid_map TESTS = uid_utils_000 \ uid_utils_001 \ uid_utils_002 \ uid_utils_003 \ uid_utils_004 \ uid_utils_005 \ uid_utils_006 \ uid_utils_007 \ uid_utils_008 \ uid_utils_009 \ uid_utils_010 \ uid_utils_011 \ uid_utils_012 \ uid_utils_013 check_PROGRAMS = $(TESTS) uid_utils_000_SOURCES = uid_utils_000.c nodist_uid_utils_000_SOURCES = $(REMOTE_SOURCES) uid_utils_001_SOURCES = uid_utils_001.c nodist_uid_utils_001_SOURCES = $(REMOTE_SOURCES) uid_utils_002_SOURCES = uid_utils_002.c nodist_uid_utils_002_SOURCES = $(REMOTE_SOURCES) uid_utils_003_SOURCES = uid_utils_003.c nodist_uid_utils_003_SOURCES = $(REMOTE_SOURCES) uid_utils_004_SOURCES = uid_utils_004.c nodist_uid_utils_004_SOURCES = $(REMOTE_SOURCES) uid_utils_005_SOURCES = uid_utils_005.c nodist_uid_utils_005_SOURCES = $(REMOTE_SOURCES) uid_utils_006_SOURCES = uid_utils_006.c nodist_uid_utils_006_SOURCES = $(REMOTE_SOURCES) uid_utils_007_SOURCES = uid_utils_007.c nodist_uid_utils_007_SOURCES = $(REMOTE_SOURCES) uid_utils_008_SOURCES = uid_utils_008.c nodist_uid_utils_008_SOURCES = $(REMOTE_SOURCES) uid_utils_009_SOURCES = uid_utils_009.c nodist_uid_utils_009_SOURCES = $(REMOTE_SOURCES) uid_utils_010_SOURCES = uid_utils_010.c nodist_uid_utils_010_SOURCES = $(REMOTE_SOURCES) uid_utils_011_SOURCES = uid_utils_011.c nodist_uid_utils_011_SOURCES = $(REMOTE_SOURCES) uid_utils_012_SOURCES = uid_utils_012.c nodist_uid_utils_012_SOURCES = $(REMOTE_SOURCES) uid_utils_013_SOURCES = uid_utils_013.c nodist_uid_utils_013_SOURCES = $(REMOTE_SOURCES) openhpi-3.6.1/utils/t/uid/uid_utils_013.c0000644000175100017510000000200512575647301017076 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include /** * main: Calls oh_entity_path_lookup using a NULL id and entity path. * Passes if it returns -1, * otherwise fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { SaHpiEntityPathT ep; guint id; oh_init_ep(&ep); if (oh_uid_initialize()) return 1; id = oh_uid_from_entity_path(&ep); if (!id) return 1; if (!oh_entity_path_lookup(0, NULL)) return 1; return 0; } openhpi-3.6.1/utils/t/uid/uid_utils_007.c0000644000175100017510000000242212575647301017104 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include /** * main: Get 10 new unique ids. Look up ids by ep. * Changes values after ROOT element before looking up. * Passes if lookups find correct ids, * otherwise fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { SaHpiEntityPathT ep; guint id[10], rid, i; if (oh_uid_initialize()) return 1; oh_init_ep(&ep); for (i = 0; i < 10; i++) { ep.Entry[0].EntityLocation = i; id[i] = oh_uid_from_entity_path(&ep); } for (i = 0; i < 10; i++) { ep.Entry[0].EntityLocation = i; ep.Entry[1].EntityType = 0; rid = oh_uid_lookup(&ep); if (rid != id[i]) return 1; } return 0; } openhpi-3.6.1/utils/t/uid/uid_utils_002.c0000644000175100017510000000243312575647301017101 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include /** * main: Get 10 new unique ids. Use ids to lookup original entity paths. * Passes if returned entity path is equal to original entity path, * otherwise fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { SaHpiEntityPathT ep, rep; guint id[10], i; if (oh_uid_initialize()) return 1; oh_init_ep(&ep); for (i = 0; i < 10; i++) { ep.Entry[0].EntityLocation = i; id[i] = oh_uid_from_entity_path(&ep); } for (i = 0; i < 10; i++) { ep.Entry[0].EntityLocation = i; if (oh_entity_path_lookup(id[i], &rep)) return 1; if (!oh_cmp_ep(&ep, &rep)) return 1; } return 0; } openhpi-3.6.1/utils/t/uid/uid_utils_000.c0000644000175100017510000000176712575647301017110 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include /** * main: Get a new unique id. Use id to lookup original entity path. * Passes if returned entity path is equal to original entity path, * otherwise fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { SaHpiEntityPathT ep, rep; guint id; if (oh_uid_initialize()) return 1; oh_init_ep(&ep); id = oh_uid_from_entity_path(&ep); if (oh_entity_path_lookup(id, &rep)) return 1; if (!oh_cmp_ep(&ep, &rep)) return 1; return 0; } openhpi-3.6.1/utils/t/uid/uid_utils_009.c0000644000175100017510000000172212575647301017110 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include /** * main: Calls oh_uid_remove using 0 as id. * Passes if it returns -1, * otherwise fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { SaHpiEntityPathT ep; oh_init_ep(&ep); if (oh_uid_initialize()) return 1; if (!oh_uid_from_entity_path(&ep)) return 1; if (!oh_uid_remove(0)) return 1; return 0; } openhpi-3.6.1/utils/t/uid/uid_utils_010.c0000644000175100017510000000170612575647301017102 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include /** * main: Calls oh_uid_lookup using a NULL entity path. * Passes if it returns 0, * otherwise fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { SaHpiEntityPathT ep; oh_init_ep(&ep); if (oh_uid_initialize()) return 1; if (!oh_uid_from_entity_path(&ep)) return 1; if (oh_uid_lookup(NULL)) return 1; return 0; } openhpi-3.6.1/utils/t/uid/uid_utils_011.c0000644000175100017510000000172412575647301017103 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include /** * main: Calls oh_entity_path_lookup using a 0 id. * Passes if it returns -1, * otherwise fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { SaHpiEntityPathT ep, rep; oh_init_ep(&ep); if (oh_uid_initialize()) return 1; if (!oh_uid_from_entity_path(&ep)) return 1; if (!oh_entity_path_lookup(0, &rep)) return 1; return 0; } openhpi-3.6.1/utils/t/uid/uid_utils_004.c0000644000175100017510000000246412575647301017107 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include /** * main: Get 10 new unique ids. Remove two. Look up removed ids by ep. * Passes if lookups don't find anything, * otherwise fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { SaHpiEntityPathT ep; guint id[10], i; if (oh_uid_initialize()) return 1; oh_init_ep(&ep); for (i = 0; i < 10; i++) { ep.Entry[0].EntityLocation = i; id[i] = oh_uid_from_entity_path(&ep); } if (oh_uid_remove(id[9])) return 1; if (oh_uid_remove(id[4])) return 1; ep.Entry[0].EntityLocation = 9; if (oh_uid_lookup(&ep)) return 1; ep.Entry[0].EntityLocation = 4; if (oh_uid_lookup(&ep)) return 1; return 0; } openhpi-3.6.1/utils/t/uid/uid_utils_001.c0000644000175100017510000000174512575647301017105 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include /** * main: Get a new unique id. Get another one with the same entity path. * Passes if returned id is equal to previous one, * otherwise fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { SaHpiEntityPathT ep; guint id, rid; if (oh_uid_initialize()) return 1; oh_init_ep(&ep); id = oh_uid_from_entity_path(&ep); rid = oh_uid_from_entity_path(&ep); if (id != rid) return 1; return 0; } openhpi-3.6.1/utils/t/uid/uid_utils_005.c0000644000175100017510000000240312575647301017101 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include /** * main: Get 10 new unique ids. Remove two. Look up removed ids. * Passes if lookups don't find anything, * otherwise fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { SaHpiEntityPathT ep, rep; guint id[10], i; if (oh_uid_initialize()) return 1; oh_init_ep(&ep); for (i = 0; i < 10; i++) { ep.Entry[0].EntityLocation = i; id[i] = oh_uid_from_entity_path(&ep); } if (oh_uid_remove(id[8])) return 1; if (oh_uid_remove(id[3])) return 1; if (!oh_entity_path_lookup(id[8],&rep)) return 1; if (!oh_entity_path_lookup(id[3],&rep)) return 1; return 0; } openhpi-3.6.1/utils/t/uid/uid_utils_012.c0000644000175100017510000000177712575647301017114 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include /** * main: Calls oh_entity_path_lookup using a NULL entity path. * Passes if it returns -1, * otherwise fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { SaHpiEntityPathT ep; guint id; oh_init_ep(&ep); if (oh_uid_initialize()) return 1; id = oh_uid_from_entity_path(&ep); if (!id) return 1; if (!oh_entity_path_lookup(id, NULL)) return 1; return 0; } openhpi-3.6.1/utils/t/uid/uid_utils_006.c0000644000175100017510000000225612575647301017110 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include /** * main: Get 10 new unique ids. Look up ids by ep. * Passes if lookups find correct ids, * otherwise fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { SaHpiEntityPathT ep; guint id[10], rid, i; if (oh_uid_initialize()) return 1; oh_init_ep(&ep); for (i = 0; i < 10; i++) { ep.Entry[0].EntityLocation = i; id[i] = oh_uid_from_entity_path(&ep); } for (i = 0; i < 10; i++) { ep.Entry[0].EntityLocation = i; rid = oh_uid_lookup(&ep); if (rid != id[i]) return 1; } return 0; } openhpi-3.6.1/utils/event_utils.c0000644000175100017510000000365712575647300016044 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * (C) Copyright IBM Corp. 2003-2006 * (C) Copyright Pigeon Point Systems. 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Louis Zhuang * David Judkovics * Sean Dague * Renier Morales * Racing Guo * Anton Pak */ #include #include #include void oh_event_free(struct oh_event *e, int only_rdrs) { if (e) { if (e->rdrs) { GSList *node = NULL; for (node = e->rdrs; node; node = node->next) { g_free(node->data); } g_slist_free(e->rdrs); } if (e->rdrs_to_remove) { GSList *node = NULL; for (node = e->rdrs_to_remove; node; node = node->next) { g_free(node->data); } g_slist_free(e->rdrs_to_remove); } if (!only_rdrs) g_free(e); } } struct oh_event *oh_dup_event(struct oh_event *old_event) { GSList *node = NULL; struct oh_event *e = NULL; if (!old_event) return NULL; e = g_new0(struct oh_event, 1); *e = *old_event; e->rdrs = NULL; for (node = old_event->rdrs; node; node = node->next) { e->rdrs = g_slist_append(e->rdrs, g_memdup(node->data, sizeof(SaHpiRdrT))); } e->rdrs_to_remove = NULL; for (node = old_event->rdrs_to_remove; node; node = node->next) { e->rdrs_to_remove = g_slist_append(e->rdrs_to_remove, g_memdup(node->data, sizeof(SaHpiRdrT))); } return e; } void oh_evt_queue_push(oh_evt_queue *equeue, gpointer data) { g_async_queue_push(equeue, data); } openhpi-3.6.1/utils/rpt_utils.c0000644000175100017510000010144612575647300015523 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003, 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales */ #include #include #include typedef struct { SaHpiRptEntryT rpt_entry; int owndata; void *data; /* private data for the owner of the RPTable */ SaHpiUint32T update_count; /* RDR Update counter */ GSList *rdrlist; /* Contains RDRecords for sequence lookups */ GHashTable *rdrtable; /* Contains RDRecords for fast RecordId lookups */ } RPTEntry; typedef struct { SaHpiRdrT rdr; int owndata; void *data; /* private data for the owner of the rpt entry. */ } RDRecord; static RPTEntry *get_rptentry_by_rid(RPTable *table, SaHpiResourceIdT rid) { GSList *rptnode = NULL; RPTEntry *rptentry = NULL; if (!table) { return NULL; } if (!(table->rptlist)) { /*DBG("Info: RPT is empty.");*/ return NULL; } if (rid == SAHPI_FIRST_ENTRY) { rptentry = (RPTEntry *) (table->rptlist->data); } else { rptnode = (GSList *)g_hash_table_lookup(table->rptable, &rid); rptentry = rptnode ? (RPTEntry *)rptnode->data : NULL; } return rptentry; } static GSList *get_rptnode_by_rid(RPTable *table, SaHpiResourceIdT rid) { GSList *rptnode = NULL; if (!table) { return NULL; } if (!(table->rptlist)) { /*DBG("Info: RPT is empty.");*/ return NULL; } if (rid == SAHPI_FIRST_ENTRY) { rptnode = (GSList *) (table->rptlist); } else { rptnode = (GSList *)g_hash_table_lookup(table->rptable, &rid); } return rptnode; } static RDRecord *get_rdrecord_by_id(RPTEntry *rptentry, SaHpiEntryIdT id) { GSList *rdrnode = NULL; RDRecord *rdrecord = NULL; if (!rptentry) { return NULL; } if (!rptentry->rdrlist) { /*DBG("Info: RDR repository is empty.");*/ return NULL; } if (id == SAHPI_FIRST_ENTRY) { rdrecord = (RDRecord *) (rptentry->rdrlist->data); } else { rdrnode = (GSList *)g_hash_table_lookup(rptentry->rdrtable, &id); rdrecord = rdrnode ? (RDRecord *)rdrnode->data : NULL; } return rdrecord; } static GSList *get_rdrnode_by_id(RPTEntry *rptentry, SaHpiEntryIdT id) { GSList *rdrnode = NULL; if (!rptentry) { return NULL; } if (!rptentry->rdrlist) { /*DBG("Info: RPT is empty.");*/ return NULL; } if (id == SAHPI_FIRST_ENTRY) { rdrnode = (GSList *) (rptentry->rdrlist); } else { rdrnode = (GSList *)g_hash_table_lookup(rptentry->rdrtable, &id); } return rdrnode; } static int check_instrument_id(SaHpiRptEntryT *rptentry, SaHpiRdrT *rdr) { int result = 0; static const SaHpiInstrumentIdT SENSOR_AGGREGATE_MAX = 0x0000010F; switch (rdr->RdrType) { case SAHPI_SENSOR_RDR: if (rdr->RdrTypeUnion.SensorRec.Num >= SAHPI_STANDARD_SENSOR_MIN && rdr->RdrTypeUnion.SensorRec.Num <= SAHPI_STANDARD_SENSOR_MAX) { if (rdr->RdrTypeUnion.SensorRec.Num > SENSOR_AGGREGATE_MAX) { result = -1; } else if (rptentry->ResourceCapabilities & SAHPI_CAPABILITY_AGGREGATE_STATUS) { result = 0; } else { result = -1; } } else { result = 0; } break; default: result = 0; } return result; } static void update_rptable(RPTable *table) { if (!table) { return; } oh_gettimeofday(&table->update_timestamp); table->update_count++; } /** * oh_get_rdr_uid * @type: type of rdr * @num: id number of the RDR unique withing the RDR type for that resource * * Helper function to derive the Record id of an rdr from its @type and @num * * Returns: a derived Record Id used to identify RDRs within Resources */ SaHpiEntryIdT oh_get_rdr_uid(SaHpiRdrTypeT type, SaHpiInstrumentIdT num) { SaHpiEntryIdT uid; uid = ((SaHpiEntryIdT)type) << 16; uid = uid + (SaHpiEntryIdT)num; return uid; } SaHpiInstrumentIdT oh_get_rdr_num(SaHpiEntryIdT rdrid) { return rdrid & 0x0000ffff; } /** * oh_get_instrument_id * @rdr: RDR * * Helper function to derive the Instrument Id of the rdr * * Returns: an instrument id or zero */ SaHpiInstrumentIdT oh_get_instrument_id(const SaHpiRdrT *rdr) { SaHpiInstrumentIdT num = 0; switch (rdr->RdrType) { case SAHPI_CTRL_RDR: num = rdr->RdrTypeUnion.CtrlRec.Num; break; case SAHPI_SENSOR_RDR: num = rdr->RdrTypeUnion.SensorRec.Num; break; case SAHPI_INVENTORY_RDR: num = rdr->RdrTypeUnion.InventoryRec.IdrId; break; case SAHPI_WATCHDOG_RDR: num = rdr->RdrTypeUnion.WatchdogRec.WatchdogNum; break; case SAHPI_ANNUNCIATOR_RDR: num = rdr->RdrTypeUnion.AnnunciatorRec.AnnunciatorNum; break; case SAHPI_DIMI_RDR: num = rdr->RdrTypeUnion.DimiRec.DimiNum; break; case SAHPI_FUMI_RDR: num = rdr->RdrTypeUnion.FumiRec.Num; break; default: num = 0; } return num; } /** * General RPT calls **/ /** * oh_init_rpt * @table: Pointer to RPTable structure to be initialized. * * * Returns: SA_OK on success Or minus SA_OK on error. **/ SaErrorT oh_init_rpt(RPTable *table) { if (!table) { return SA_ERR_HPI_INVALID_PARAMS; } table->update_timestamp = SAHPI_TIME_UNSPECIFIED; table->update_count = 0; table->rptlist = NULL; table->rptable = NULL; return SA_OK; } /** * oh_flush_rpt * @table: Pointer to the RPT to flush. * * Cleans RPT from all entries and RDRs and frees the memory * associated with them. * * Returns: SA_OK on success Or minus SA_OK on error. **/ SaErrorT oh_flush_rpt(RPTable *table) { SaHpiRptEntryT *tmp_entry; while ((tmp_entry = oh_get_resource_by_id(table, SAHPI_FIRST_ENTRY)) != NULL) { oh_remove_resource(table, SAHPI_FIRST_ENTRY); } return SA_OK; } /** * rpt_diff * @cur_rpt: IN. Pointer to RPTable that represents the current state of resources * and rdrs. * @new_rpt: IN. Pointer to RPTable that contains rpt entries and rdrs just recently * discovered. * @res_new: OUT. List of new or changed rpt entries * @rdr_new: OUT. List of new or changed rdrs * @res_gone: OUT. List of old and not present resources. * @rdr_gone: OUT. List of old and not present rdrs. * * Extracts from current the resources and rdrs that are not found * in new and puts them in res_gone and rdr_gone. Also, puts in res_new and rdr_new * the resources and rdrs that are not already in current Or that are not identical * to the ones in current. * * Returns: SA_ERR_HPI_INVALID_PARAMS if any argument is NULL, otherwise SA_OK. **/ SaErrorT rpt_diff(RPTable *cur_rpt, RPTable *new_rpt, GSList **res_new, GSList **rdr_new, GSList **res_gone, GSList **rdr_gone) { SaHpiRptEntryT *res = NULL; if (!cur_rpt || !new_rpt || !res_new || !rdr_new || !res_gone || !rdr_gone) return SA_ERR_HPI_INVALID_PARAMS; /* Look for absent resources and rdrs */ for (res = oh_get_resource_by_id(cur_rpt, SAHPI_FIRST_ENTRY); res != NULL; res = oh_get_resource_next(cur_rpt, res->ResourceId)) { SaHpiRptEntryT *tmp_res = oh_get_resource_by_id(new_rpt, res->ResourceId); if (tmp_res == NULL) *res_gone = g_slist_append(*res_gone, (gpointer)res); else { SaHpiRdrT *rdr = NULL; for (rdr = oh_get_rdr_by_id(cur_rpt, res->ResourceId, SAHPI_FIRST_ENTRY); rdr != NULL; rdr = oh_get_rdr_next(cur_rpt, res->ResourceId, rdr->RecordId)) { SaHpiRdrT *tmp_rdr = oh_get_rdr_by_id(new_rpt, res->ResourceId, rdr->RecordId); if (tmp_rdr == NULL) *rdr_gone = g_slist_append(*rdr_gone, (gpointer)rdr); } } } /* Look for new resources and rdrs*/ for (res = oh_get_resource_by_id(new_rpt, SAHPI_FIRST_ENTRY); res != NULL; res = oh_get_resource_next(new_rpt, res->ResourceId)) { SaHpiRptEntryT *tmp_res = oh_get_resource_by_id(cur_rpt, res->ResourceId); SaHpiRdrT *rdr = NULL; if (tmp_res == NULL || memcmp(res, tmp_res, sizeof(SaHpiRptEntryT))) { *res_new = g_slist_append(*res_new, (gpointer)res); } for (rdr = oh_get_rdr_by_id(new_rpt, res->ResourceId, SAHPI_FIRST_ENTRY); rdr != NULL; rdr = oh_get_rdr_next(new_rpt, res->ResourceId, rdr->RecordId)) { SaHpiRdrT *tmp_rdr = NULL; if (tmp_res != NULL) tmp_rdr = oh_get_rdr_by_id(cur_rpt, res->ResourceId, rdr->RecordId); if (tmp_rdr == NULL || memcmp(rdr, tmp_rdr, sizeof(SaHpiRdrT))) *rdr_new = g_slist_append(*rdr_new, (gpointer)rdr); } } return SA_OK; } /** * oh_get_rpt_info * @table: pointer to RPT * @update_count: pointer of where to place the rpt's update count * @update_timestamp: pointer of where to place the rpt's update timestamp * * Returns: SA_OK on success Or minus SA_OK on error. **/ SaErrorT oh_get_rpt_info(RPTable *table, SaHpiUint32T *update_count, SaHpiTimeT *update_timestamp) { if (!table || !update_count || !update_timestamp) { return SA_ERR_HPI_INVALID_PARAMS; } *update_count = table->update_count; *update_timestamp = table->update_timestamp; return SA_OK; } /** * Resource interface functions */ /** * oh_add_resource * @table: Pointer to the RPT to which the RPT entry will be added. * @entry: The RPT entry (resource) to be added to the RPT. * @data: Pointer to private data for storing along with the RPT entry. * @owndata: boolean flag. true (%KEEP_RPT_DATA) to tell the interface *not* * to free the data when the resource is removed. false (%FREE_RPT_DATA) to tell * the interface to free the data when the resource is removed. * * Add a RPT entry to the RPT along with some private data. * If an RPT entry with the same resource id exists int the RPT, it will be * overlayed with the new RPT entry. Also, this function will assign the * resource id as its entry id since it is expected to be unique for the table. * The update count and timestamp will not be updated if the entry being added * already existed in the table and was the same. * * Returns: SA_OK on success Or minus SA_OK on error. SA_ERR_HPI_INVALID_PARAMS will * be returned if @table is NULL, @entry is NULL, ResourceId in @entry equals * SAHPI_FIRST_ENTRY, ResourceId in @entry equals SAHPI_UNSPECIFIED_RESOURCE_ID, * or ResourceEntity in @entry has a malformed entity path (look at the * entity path utils documentation). **/ SaErrorT oh_add_resource(RPTable *table, SaHpiRptEntryT *entry, void *data, int owndata) { RPTEntry *rptentry; int update_info = 0; if (!table) { return SA_ERR_HPI_INVALID_PARAMS; } else if (!entry) { return SA_ERR_HPI_INVALID_PARAMS; } else if (entry->ResourceId == SAHPI_FIRST_ENTRY) { return SA_ERR_HPI_INVALID_PARAMS; } else if (entry->ResourceId == SAHPI_UNSPECIFIED_RESOURCE_ID) { return SA_ERR_HPI_INVALID_PARAMS; } else if (!oh_valid_ep(&(entry->ResourceEntity))) { return SA_ERR_HPI_INVALID_PARAMS; } entry->EntryId = entry->ResourceId; /* Check to see if the entry is in the RPTable already */ rptentry = get_rptentry_by_rid(table, entry->ResourceId); /* If not, create new RPTEntry */ if (!rptentry) { rptentry = g_new0(RPTEntry, 1); if (!rptentry) { return SA_ERR_HPI_OUT_OF_MEMORY; } update_info = 1; /* Have a new changed entry */ /* Put new RPTEntry in RPTable */ table->rptlist = g_slist_append(table->rptlist, (gpointer)rptentry); /* Add to rpt hash table */ if (!table->rptable) /* Create hash table if it doesn't exist */ table->rptable = g_hash_table_new(g_int_hash, g_int_equal); rptentry->rpt_entry.EntryId = entry->ResourceId; g_hash_table_insert(table->rptable, &(rptentry->rpt_entry.EntryId), g_slist_last(table->rptlist)); } /* Else, modify existing RPTEntry */ if (rptentry->data && rptentry->data != data && !rptentry->owndata) g_free(rptentry->data); rptentry->data = data; rptentry->owndata = owndata; /* Check if we really have a new/changed entry */ if (update_info || memcmp(entry, &(rptentry->rpt_entry), sizeof(SaHpiRptEntryT))) { update_info = 1; rptentry->rpt_entry = *entry; } if (update_info) update_rptable(table); return SA_OK; } /** * oh_remove_resource * @table: Pointer to the RPT from which an RPT entry will be removed. * @rid: Resource id of the RPT entry to be removed. * * Remove a resource from the RPT. If the @rid is * %SAHPI_FIRST_ENTRY, the first RPT entry in the table will be removed. * The void data will be freed if @owndata was false (%FREE_RPT_DATA) when adding * the resource, otherwise if @owndata was true (%KEEP_RPT_DATA) it will not be freed. * * Returns: SA_OK on success Or minus SA_OK on error. **/ SaErrorT oh_remove_resource(RPTable *table, SaHpiResourceIdT rid) { RPTEntry *rptentry; rptentry = get_rptentry_by_rid(table, rid); if (!rptentry) { return SA_ERR_HPI_NOT_PRESENT; } else { SaHpiRdrT *tmp_rdr; /* Remove all RDRs for the resource first */ while ((tmp_rdr = oh_get_rdr_by_id(table, rid, SAHPI_FIRST_ENTRY)) != NULL) { oh_remove_rdr(table, rid, SAHPI_FIRST_ENTRY); } /* then remove the resource itself. */ table->rptlist = g_slist_remove(table->rptlist, (gpointer)rptentry); if (!rptentry->owndata) g_free(rptentry->data); g_hash_table_remove(table->rptable, &(rptentry->rpt_entry.EntryId)); g_free((gpointer)rptentry); if (!table->rptlist) { g_hash_table_destroy(table->rptable); table->rptable = NULL; } } update_rptable(table); return SA_OK; } /** * oh_get_resource_data * @table: Pointer to the RPT for looking up the RPT entry's private data. * @rid: Resource id of the RPT entry that holds the private data. * * Get the private data for a RPT entry. If the @rid is * %SAHPI_FIRST_ENTRY, the first RPT entry's data in the table will be returned. * * Returns: A void pointer to the private data for the RPT entry requested, or NULL * if the RPT entry was not found or the table was a NULL pointer. **/ void *oh_get_resource_data(RPTable *table, SaHpiResourceIdT rid) { RPTEntry *rptentry; rptentry = get_rptentry_by_rid(table, rid); if (!rptentry) { /*DBG("Warning: RPT entry not found. Returning NULL.");*/ return NULL; } return rptentry->data; } /** * oh_get_resource_by_id * @table: Pointer to the RPT for looking up the RPT entry. * @rid: Resource id of the RPT entry to be looked up. * * Get a RPT entry from the RPT by using the resource id. * If @rid is %SAHPI_FIRST_ENTRY, the first RPT entry in the table will be returned. * * Returns: * Pointer to the RPT entry found or NULL if an RPT entry by that * id was not found or the table was a NULL pointer. **/ SaHpiRptEntryT *oh_get_resource_by_id(RPTable *table, SaHpiResourceIdT rid) { RPTEntry *rptentry; rptentry = get_rptentry_by_rid(table, rid); if (!rptentry) { /*DBG("Warning: RPT entry not found. Returning NULL.");*/ return NULL; } return &(rptentry->rpt_entry); } /** * oh_get_resource_by_ep * @table: Pointer to the RPT for looking up the RPT entry. * @ep: Entity path of the RPT entry to be looked up. * * Get a RPT entry from the RPT by using the entity path. * * Returns: * Pointer to the RPT entry found or NULL if an RPT entry by that * entity path was not found or the table was a NULL pointer. **/ SaHpiRptEntryT *oh_get_resource_by_ep(RPTable *table, SaHpiEntityPathT *ep) { RPTEntry *rptentry = NULL; GSList *node = NULL; SaHpiResourceIdT rid = 0; if (!table) { return NULL; } /* Check the uid database first */ rid = oh_uid_is_initialized() ? oh_uid_lookup(ep) : 0; if (rid > 0) { /* Found it in uid database */ return oh_get_resource_by_id(table, rid); } else { DBG("Didn't find the EP in the Uid table so " "looking manually in the RPTable"); } for (node = table->rptlist; node != NULL; node = node->next) { rptentry = (RPTEntry *) node->data; if (oh_cmp_ep(&(rptentry->rpt_entry.ResourceEntity), ep)) break; else rptentry = NULL; } if (!rptentry) { /*DBG("Warning: RPT entry not found. Returning NULL.");*/ return NULL; } return &(rptentry->rpt_entry); } /** * oh_get_resource_next * @table: Pointer to the RPT for looking up the RPT entry. * @rid_prev: Resource id of the RPT entry previous to the one being looked up. * * Get the RPT entry next to the specified RPT entry * from the RPT. If @rid_prev is %SAHPI_FIRST_ENTRY, the first RPT entry * in the table will be returned. * * Returns: * Pointer to the RPT entry found or NULL if the previous RPT entry by that * id was not found or the table was a NULL pointer. **/ SaHpiRptEntryT *oh_get_resource_next(RPTable *table, SaHpiResourceIdT rid_prev) { RPTEntry *rptentry = NULL; GSList *rptnode = NULL; if (rid_prev == SAHPI_FIRST_ENTRY) { rptentry = get_rptentry_by_rid(table, rid_prev); } else { rptnode = get_rptnode_by_rid(table, rid_prev); if (rptnode && rptnode->next) { rptentry = (RPTEntry *)rptnode->next->data; } } return rptentry ? &(rptentry->rpt_entry) : NULL; } /** * oh_get_rdr_update_count * @table: Pointer to the RPT for looking up the RPT entry. * @rid: Resource id of the RPT entry to be looked up. * @update_count: pointer of where to place the rdr update count * * Get a RDR Repository Update Counter for the resource using the resource id. * * Returns: * Returns: SA_OK on success. * Will return SA_ERR_HPI_INVALID_PARAMS if update_count is NULL. * Will return SA_ERR_HPI_NOT_PRESENT if there is no resource * with specified rid in RPT. **/ SaErrorT oh_get_rdr_update_count(RPTable *table, SaHpiResourceIdT rid, SaHpiUint32T *update_count) { RPTEntry *rptentry = get_rptentry_by_rid(table, rid); if ( !rptentry ) { return SA_ERR_HPI_NOT_PRESENT; } if ( !update_count ) { return SA_ERR_HPI_INVALID_PARAMS; } *update_count = rptentry->update_count; return SA_OK; } /** * RDR interface functions */ /** * oh_add_rdr * @table: Pointer to RPT table containig the RPT entry to which the RDR will belong. * @rid: Id of the RPT entry that will own the RDR to be added. * @rdr: RDR to be added to an RPT entry's RDR repository. * @data: Pointer to private data belonging to the RDR that is being added. * @owndata: boolean flag. true (%KEEP_RPT_DATA) to tell the interface *not* * to free the data when the rdr is removed. false (%FREE_RPT_DATA) to tell * the interface to free the data when the rdr is removed. * * Add an RDR to a RPT entry's RDR repository. * If an RDR is found with the same record id as the one being added, the RDR being * added will overlay the existing one. Also, a unique record id will be assigned * to it based on the RDR type and its type's numeric id. * All rdr interface funtions, except oh_add_rdr() will act in the context of * the first RPT entry in the table, if @rid is %SAHPI_FIRST_ENTRY. * * Returns: SA_OK on success Or minus SA_OK on error. Will return * SA_ERR_HPI_INVALID_PARAMS if instrument id is invalid. An invalid * intrument id for a sensor is in the range of 0x100-0x1FF. An aggregate type * of sensor can have its instrument id in the range of 0x100-0x10F, but * the resource must have the aggregate sensor capabilitiy bit set. **/ SaErrorT oh_add_rdr(RPTable *table, SaHpiResourceIdT rid, SaHpiRdrT *rdr, void *data, int owndata) { RPTEntry *rptentry; RDRecord *rdrecord; SaHpiInstrumentIdT instr_id; if (!rdr) { return SA_ERR_HPI_INVALID_PARAMS; } rptentry = get_rptentry_by_rid(table, rid); if (!rptentry){ return SA_ERR_HPI_NOT_PRESENT; } if (check_instrument_id(&(rptentry->rpt_entry), rdr)) { CRIT("Invalid instrument id found in RDR."); return SA_ERR_HPI_INVALID_PARAMS; } instr_id = oh_get_instrument_id(rdr); /* Form correct RecordId. */ rdr->RecordId = oh_get_rdr_uid(rdr->RdrType, instr_id); /* Check if record exists */ rdrecord = get_rdrecord_by_id(rptentry, rdr->RecordId); /* If not, create new rdr */ if (!rdrecord) { rdrecord = g_new0(RDRecord, 1); if (!rdrecord) { return SA_ERR_HPI_OUT_OF_MEMORY; } /* Put new rdrecord in rdr repository */ rptentry->rdrlist = g_slist_append(rptentry->rdrlist, (gpointer)rdrecord); /* Create rdr hash table if first rdr here */ if (!rptentry->rdrtable) rptentry->rdrtable = g_hash_table_new(g_int_hash, g_int_equal); rdrecord->rdr.RecordId = rdr->RecordId; g_hash_table_insert(rptentry->rdrtable, &(rdrecord->rdr.RecordId), g_slist_last(rptentry->rdrlist)); } /* Else, modify existing rdrecord */ if (rdrecord->data && rdrecord->data != data && !rdrecord->owndata) g_free(rdrecord->data); rdrecord->data = data; rdrecord->owndata = owndata; rdrecord->rdr = *rdr; ++rptentry->update_count; return SA_OK; } /** * oh_remove_rdr * @table: Pointer to RPT table containig the RPT entry from which the RDR will * be removed. * @rid: Id of the RPT entry from which the RDR will be removed. * @rdrid: Record id of the RDR to remove. * * * Remove an RDR from a RPT entry's RDR repository. * If @rdrid is %SAHPI_FIRST_ENTRY, the first RDR in the repository will be removed. * If @owndata was set to false (%FREE_RPT_DATA) on the rdr when it was added, * the data will be freed, otherwise if it was set to true (%KEEP_RPT_DATA), * it will not be freed. * All rdr interface funtions, except oh_add_rdr() will act in the context of * the first RPT entry in the table, if @rid is %SAHPI_FIRST_ENTRY. * * Returns: SA_OK on success Or minus SA_OK on error. **/ SaErrorT oh_remove_rdr(RPTable *table, SaHpiResourceIdT rid, SaHpiEntryIdT rdrid) { RPTEntry *rptentry; RDRecord *rdrecord; rptentry = get_rptentry_by_rid(table, rid); if (!rptentry) { return SA_ERR_HPI_NOT_PRESENT; } rdrecord = get_rdrecord_by_id(rptentry, rdrid); if (!rdrecord) { return SA_ERR_HPI_NOT_PRESENT; } else { rptentry->rdrlist = g_slist_remove(rptentry->rdrlist, (gpointer)rdrecord); if (!rdrecord->owndata) g_free(rdrecord->data); g_hash_table_remove(rptentry->rdrtable, &(rdrecord->rdr.RecordId)); g_free((gpointer)rdrecord); if (!rptentry->rdrlist) { g_hash_table_destroy(rptentry->rdrtable); rptentry->rdrtable = NULL; } ++rptentry->update_count; } return SA_OK; } /** * oh_get_rdr_data * @table: Pointer to RPT table containig the RPT entry from which the RDR's data * will be read. * @rid: Id of the RPT entry from which the RDR's data will be read. * @rdrid: Record id of the RDR to read data from. * * * Get the private data associated to an RDR. * If @rdrid is %SAHPI_FIRST_ENTRY, the first RDR's data in the repository will be returned. * All rdr interface funtions, except oh_add_rdr() will act in the context of * the first RPT entry in the table, if @rid is %SAHPI_FIRST_ENTRY. * * Returns: A void pointer to the RDR data, or NULL if no data for that RDR was found or * the table pointer is NULL. **/ void *oh_get_rdr_data(RPTable *table, SaHpiResourceIdT rid, SaHpiEntryIdT rdrid) { RPTEntry *rptentry; RDRecord *rdrecord; rptentry = get_rptentry_by_rid(table, rid); if (!rptentry) { return NULL; /* No resource found by that id */ } rdrecord = get_rdrecord_by_id(rptentry, rdrid); if (!rdrecord) { /*DBG("Warning: RDR not found. Returning NULL.");*/ return NULL; } return rdrecord->data; } /** * oh_get_rdr_by_id * @table: Pointer to RPT table containig the RPT entry tha has the RDR * being looked up. * @rid: Id of the RPT entry containing the RDR being looked up. * @rdrid: Record id of the RDR being looked up. * * Get a reference to an RDR by its record id. * If @rdrid is %SAHPI_FIRST_ENTRY, the first RDR in the repository will be returned. * All rdr interface funtions, except oh_add_rdr() will act in the context of * the first RPT entry in the table, if @rid is %SAHPI_FIRST_ENTRY. * * Returns: * Reference to the RDR looked up or NULL if no RDR was found. **/ SaHpiRdrT *oh_get_rdr_by_id(RPTable *table, SaHpiResourceIdT rid, SaHpiEntryIdT rdrid) { RPTEntry *rptentry; RDRecord *rdrecord; rptentry = get_rptentry_by_rid(table, rid); if (!rptentry) { return NULL; /* No resource found by that id */ } rdrecord = get_rdrecord_by_id(rptentry, rdrid); if (!rdrecord) { /*DBG("Warning: RDR not found. Returning NULL.");*/ return NULL; } return &(rdrecord->rdr); } /** * oh_get_rdr_by_type * @table: Pointer to RPT table containig the RPT entry tha has the RDR * being looked up. * @rid: Id of the RPT entry containing the RDR being looked up. * @type: RDR Type of the RDR being looked up. * @num: RDR id within the RDR type for the specified RPT entry. * * Get a reference to an RDR by its type and number. * All rdr interface funtions, except oh_add_rdr() will act in the context of * the first RPT entry in the table, if @rid is %SAHPI_FIRST_ENTRY. * * Returns: * Reference to the RDR looked up or NULL if no RDR was found. **/ SaHpiRdrT *oh_get_rdr_by_type(RPTable *table, SaHpiResourceIdT rid, SaHpiRdrTypeT type, SaHpiInstrumentIdT num) { RPTEntry *rptentry = NULL; RDRecord *rdrecord = NULL; SaHpiEntryIdT rdr_uid; rptentry = get_rptentry_by_rid(table, rid); if (!rptentry) { return NULL; /* No resource found by that id */ } /* Get rdr_uid from type/num combination */ rdr_uid = oh_get_rdr_uid(type, num); rdrecord = get_rdrecord_by_id(rptentry, rdr_uid); if (!rdrecord) { /*DBG("Warning: RDR not found. Returning NULL.");*/ return NULL; } return &(rdrecord->rdr); } /** * oh_get_rdr_next * @table: Pointer to the RPT containing the RPT entry to look up the RDR in. * @rid: Id of the RPT entry containing the RDR being looked up. * @rdrid_prev: Record id of the RDR previous to the one being looked up, relative * to the specified RPT entry. * * Get the RDR next to the specified RDR in the specified * RPT entry's repository. If @rdrid_prev is %SAHPI_FIRST_ENTRY, the first RDR * in the repository will be returned. * All rdr interface funtions, except oh_add_rdr() will act in the context of * the first RPT entry in the table, if @rid is %SAHPI_FIRST_ENTRY. * * Returns: * Pointer to the RDR found or NULL if the previous RDR by that * id was not found. If the @rdrid_prev was %SAHPI_FIRST_ENTRY, the first RDR in the list * will be returned. **/ SaHpiRdrT *oh_get_rdr_next(RPTable *table, SaHpiResourceIdT rid, SaHpiEntryIdT rdrid_prev) { RPTEntry *rptentry = NULL; RDRecord *rdrecord = NULL; GSList *rdrnode = NULL; rptentry = get_rptentry_by_rid(table, rid); if (!rptentry) { return NULL; /* No resource found by that id */ } if (rdrid_prev == SAHPI_FIRST_ENTRY) { rdrecord = get_rdrecord_by_id(rptentry, rdrid_prev); } else { rdrnode = get_rdrnode_by_id(rptentry, rdrid_prev); if (rdrnode && rdrnode->next) { rdrecord = (RDRecord *)rdrnode->next->data; } } return rdrecord ? &(rdrecord->rdr) : NULL; } SaHpiRdrT *oh_get_rdr_by_type_first(RPTable *table, SaHpiResourceIdT rid, SaHpiRdrTypeT type) { RPTEntry *rptentry = NULL; RDRecord *rdrecord = NULL; GSList *node = NULL; rptentry = get_rptentry_by_rid(table, rid); if (!rptentry) { return NULL; /* No resource found by that id */ } /* Get first RDR matching the type */ for (node = rptentry->rdrlist; node; node = node->next) { RDRecord *temp = (RDRecord *)node->data; if (temp->rdr.RdrType == type) { rdrecord = temp; break; } } if (!rdrecord) return NULL; return &(rdrecord->rdr); } SaHpiRdrT *oh_get_rdr_by_type_next(RPTable *table, SaHpiResourceIdT rid, SaHpiRdrTypeT type, SaHpiInstrumentIdT num) { RPTEntry *rptentry = NULL; RDRecord *rdrecord = NULL; GSList *node = NULL; rptentry = get_rptentry_by_rid(table, rid); if (!rptentry) { return NULL; /* No resource found by that id */ } /* Get rdr_uid from type/num combination */ node = get_rdrnode_by_id(rptentry, oh_get_rdr_uid(type, num)); if (!node) return NULL; for (node = node->next; node; node = node->next) { RDRecord *temp = (RDRecord *)node->data; if (temp->rdr.RdrType == type) { rdrecord = temp; break; } } if (!rdrecord) return NULL; return &(rdrecord->rdr); } openhpi-3.6.1/utils/sahpi_time_utils.h0000644000175100017510000000162612575647300017044 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #ifndef __SAHPI_TIME_UTILS_H #define __SAHPI_TIME_UTILS_H #ifndef __OH_UTILS_H #warning *** Include oh_utils.h instead of individual utility header files *** #endif #include #ifdef __cplusplus extern "C" { #endif SaErrorT oh_localtime(const SaHpiTimeT time, struct tm *tm); SaErrorT oh_decode_time(SaHpiTimeT time, SaHpiTextBufferT *buffer); SaErrorT oh_gettimeofday(SaHpiTimeT *time); #ifdef __cplusplus } #endif #endif openhpi-3.6.1/utils/openhpiutils.pc.in0000644000175100017510000000045212575647300017001 0ustar mohanmohanprefix=@prefix@ exec_prefix=@prefix@ libdir=@libdir@ includedir=@includedir@ Name: OpenHPI Utilities Description: Utilities for the Implementation of SA Forum's Hardware Platform Interface Version: @VERSION@ Requires: glib-2.0 Libs: -L${libdir} -l@HPI_UTIL_PKG@ Cflags: -I${includedir}/@HPI_PKG@ openhpi-3.6.1/utils/sahpi_event_utils.h0000644000175100017510000000224412575647300017224 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #ifndef SAHPI_EVENT_UTILS_H #define SAHPI_EVENT_UTILS_H #ifndef __OH_UTILS_H #warning *** Include oh_utils.h instead of individual utility header files *** #endif #ifdef __cplusplus extern "C" { #endif SaErrorT oh_decode_eventstate(SaHpiEventStateT event_state, SaHpiEventCategoryT event_cat, SaHpiTextBufferT *buffer); SaErrorT oh_encode_eventstate(SaHpiTextBufferT *buffer, SaHpiEventStateT *event_state, SaHpiEventCategoryT *event_cat); SaHpiBoolT oh_valid_eventstate(SaHpiEventStateT event_state, SaHpiEventCategoryT event_cat, SaHpiBoolT check_mutal_exclusion); SaErrorT oh_valid_addevent(SaHpiEventT *event); #ifdef __cplusplus } #endif #endif openhpi-3.6.1/utils/uid_utils.h0000644000175100017510000000224312575647300015477 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003, 2004 * Copyright (c) 2003 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * David Judkovics * Renier Morales */ #ifndef __UID_UTILS_H #define __UID_UTILS_H #ifndef __OH_UTILS_H #warning *** Include oh_utils.h instead of individual utility header files *** #endif #include #ifdef __cplusplus extern "C" { #endif /* Unique Resource ID utility functions */ SaErrorT oh_uid_initialize(void); SaHpiBoolT oh_uid_is_initialized(void); SaHpiUint32T oh_uid_from_entity_path(SaHpiEntityPathT *ep); SaErrorT oh_uid_remove(SaHpiUint32T uid); SaHpiUint32T oh_uid_lookup(SaHpiEntityPathT *ep); SaErrorT oh_entity_path_lookup(SaHpiUint32T id, SaHpiEntityPathT *ep); SaErrorT oh_uid_map_to_file(void); #ifdef __cplusplus } #endif #endif openhpi-3.6.1/utils/sahpixtca_enum_utils.h0000644000175100017510000000422412575647301017730 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * (C) Copyright Pigeon Point Systems. 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman * Anton Pak */ #ifndef __SAHPIXTCA_ENUM_UTILS_H #define __SAHPIXTCA_ENUM_UTILS_H #ifndef __OH_UTILS_H #warning *** Include oh_utils.h instead of individual utility header files *** #endif #ifdef __cplusplus extern "C" { #endif #define OH_MAX_XTCAHPILEDCOLOR 9 extern struct oh_xtcahpiledcolor_map { XtcaHpiLedColorT entity_type; char *str; } xtcahpiledcolor_strings[OH_MAX_XTCAHPILEDCOLOR]; char * oh_lookup_xtcahpiledcolor(XtcaHpiLedColorT value); SaErrorT oh_encode_xtcahpiledcolor(SaHpiTextBufferT *buffer, XtcaHpiLedColorT *type); #define OH_MAX_XTCAHPIRESOURCELEDMODE 3 extern struct oh_xtcahpiresourceledmode_map { XtcaHpiResourceLedModeT entity_type; char *str; } xtcahpiresourceledmode_strings[OH_MAX_XTCAHPIRESOURCELEDMODE]; char * oh_lookup_xtcahpiresourceledmode(XtcaHpiResourceLedModeT value); SaErrorT oh_encode_xtcahpiresourceledmode(SaHpiTextBufferT *buffer, XtcaHpiResourceLedModeT *type); #define OH_MAX_XTCAHPILEDBRSUPPORT 3 extern struct oh_xtcahpiledbrsupport_map { XtcaHpiLedBrSupportT entity_type; char *str; } xtcahpiledbrsupport_strings[OH_MAX_XTCAHPILEDBRSUPPORT]; char * oh_lookup_xtcahpiledbrsupport(XtcaHpiLedBrSupportT value); SaErrorT oh_encode_xtcahpiledbrsupport(SaHpiTextBufferT *buffer, XtcaHpiLedBrSupportT *type); #define OH_MAX_XTCAHPIENTITYTYPE 12 extern struct oh_xtcahpientitytype_map { SaHpiEntityTypeT entity_type; char *str; } xtcahpientitytype_strings[OH_MAX_XTCAHPIENTITYTYPE]; char * oh_lookup_xtcahpientitytype(SaHpiEntityTypeT value); SaErrorT oh_encode_xtcahpientitytype(SaHpiTextBufferT *buffer, SaHpiEntityTypeT *type); #ifdef __cplusplus } #endif #endif openhpi-3.6.1/utils/uid_utils.c0000644000175100017510000003764612575647300015511 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003, 2004, 2006 * Copyright (c) 2003 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * David Judkovics * Renier Morales */ #include #include #include #include #include #include #include #include #include #include #include #ifdef OH_DBG_MSGS #define dbg_uid_lock(format, ...) \ do { \ if (getenv("OPENHPI_DBG_UID_LOCK") && !strcmp("YES",getenv("OPENHPI_DBG_UID_LOCK"))){ \ fprintf(stderr, " UID_LOCK: %s:%d:%s: ", __FILE__, __LINE__, __func__); \ fprintf(stderr, format "\n", ## __VA_ARGS__); \ } \ } while(0) #else #define dbg_uid_lock(format, ...) #endif #define uid_lock(uidmutex) \ do { \ dbg_uid_lock("Locking UID mutex..."); \ wrap_g_static_mutex_lock(uidmutex); \ dbg_uid_lock("OK. UID mutex locked."); \ } while (0) #define uid_unlock(uidmutex) \ do { \ dbg_uid_lock("Unlocking UID mutex..."); \ wrap_g_static_mutex_unlock(uidmutex); \ dbg_uid_lock("OK. UID mutex unlocked."); \ } while (0) /* uid to entity path cross reference (xref) data structure */ typedef struct { SaHpiResourceIdT resource_id; SaHpiEntityPathT entity_path; } EP_XREF; #if GLIB_CHECK_VERSION (2, 32, 0) static GMutex oh_uid_lock; #else static GStaticMutex oh_uid_lock = G_STATIC_MUTEX_INIT; #endif static GHashTable *oh_ep_table; static GHashTable *oh_resource_id_table; static guint resource_id; static char * oh_uid_map_file = 0; static int initialized = FALSE; /* use to build memory resident map table from file */ static int uid_map_from_file(void); static int build_uid_map_data(FILE *fp); /* used by oh_uid_remove() */ static void write_ep_xref(gpointer key, gpointer value, gpointer file); /* for hash table usage */ guint oh_entity_path_hash(gconstpointer key); gboolean oh_entity_path_equal(gconstpointer a, gconstpointer b); /* * oh_entity_path_hash: used by g_hash_table_new() * in oh_uid_initialize(). See glib library for * further details. */ guint oh_entity_path_hash(gconstpointer key) { const char *p = key; guint h = *p; int i; int entity_path_len; entity_path_len = sizeof(SaHpiEntityPathT); p += 1; for( i=0; iresource_id; } /* allocate storage for EP cross reference data structure*/ ep_xref = g_new0(EP_XREF, 1); if(!ep_xref) { CRIT("malloc failed"); uid_unlock(&oh_uid_lock); return 0; } memset(ep_xref, 0, sizeof(EP_XREF)); memcpy(&ep_xref->entity_path, &entitypath, sizeof(SaHpiEntityPathT)); ep_xref->resource_id = resource_id; resource_id++; ruid = ep_xref->resource_id; value = (gpointer)ep_xref; /* entity path based key */ key = (gpointer)&ep_xref->entity_path; g_hash_table_insert(oh_ep_table, key, value); /* resource id based key */ key = (gpointer)&ep_xref->resource_id; g_hash_table_insert(oh_resource_id_table, key, value); /* save newly created ep xref (iud/resource_id) to map file */ if (oh_uid_map_file) { FILE * fp; fp = fopen(oh_uid_map_file, "r+b"); if (fp) { fseek(fp, 0, SEEK_END); if (fwrite(ep_xref, sizeof(EP_XREF), 1, fp) == 1) { fseek(fp, 0, SEEK_SET); if (fwrite(&resource_id, sizeof(resource_id), 1, fp) != 1) { CRIT("write resource_id failed"); ruid = 0; } } else { CRIT("write ep_xref failed"); ruid = 0; } fclose(fp); } } uid_unlock(&oh_uid_lock); return ruid; } /** * oh_uid_remove * @uid: value to be removed * * This functions removes the uid/entity path * pair from use and removes the use of the uid forever. * A new uid may be requested for this entity path * in the future. oh_uid_from_entity_path() writes * the entire uid/entity path pairings to file before * returning. oh_uid_remove() deletes the pairing from file. * * Returns: success 0, failure -1. **/ SaErrorT oh_uid_remove(SaHpiUint32T uid) { EP_XREF *ep_xref; gpointer key; if (!oh_uid_is_initialized()) return SA_ERR_HPI_ERROR; /* check entry exist in oh_resource_id_table */ key = (gpointer)&uid; uid_lock(&oh_uid_lock); ep_xref = (EP_XREF *)g_hash_table_lookup (oh_resource_id_table, key); if(!ep_xref) { uid_unlock(&oh_uid_lock); return SA_ERR_HPI_NOT_PRESENT; } /* check netry exist in oh_resource_id_table */ key = (gpointer)&ep_xref->entity_path; ep_xref = (EP_XREF *)g_hash_table_lookup (oh_ep_table, key); if(!ep_xref) { uid_unlock(&oh_uid_lock); return SA_ERR_HPI_NOT_PRESENT; } g_hash_table_remove(oh_resource_id_table, &ep_xref->resource_id); g_hash_table_remove(oh_ep_table, &ep_xref->entity_path); g_free(ep_xref); uid_unlock(&oh_uid_lock); return oh_uid_map_to_file(); } /** * oh_uid_lookup * @ep: pointer to entity path used to identify resourceID/uid * * Fetches resourceID/uid based on entity path in @ep. * * Returns: success returns resourceID/uid, failure is 0. **/ SaHpiUint32T oh_uid_lookup(SaHpiEntityPathT *ep) { EP_XREF *ep_xref; SaHpiEntityPathT entitypath; SaHpiResourceIdT ruid; gpointer key; if (!ep) return 0; if (!oh_uid_is_initialized()) return 0; oh_init_ep(&entitypath); oh_concat_ep(&entitypath, ep); key = &entitypath; /* check hash table for entry in oh_ep_table */ uid_lock(&oh_uid_lock); ep_xref = (EP_XREF *)g_hash_table_lookup (oh_ep_table, key); if(!ep_xref) { uid_unlock(&oh_uid_lock); return 0; } ruid = ep_xref->resource_id; uid_unlock(&oh_uid_lock); return ruid; } /** * oh_entity_path_lookup * @id: resource_id/uid identifying entity path * @ep: pointer to memory to fill in with entity path * * Fetches entity path based upon resource id, @id. * * Returns: success 0, failed -1. **/ SaErrorT oh_entity_path_lookup(SaHpiUint32T id, SaHpiEntityPathT *ep) { EP_XREF *ep_xref; gpointer key = &id; if (!id || !ep) return SA_ERR_HPI_ERROR; if (!oh_uid_is_initialized()) return SA_ERR_HPI_ERROR; /* check hash table for entry in oh_ep_table */ uid_lock(&oh_uid_lock); ep_xref = (EP_XREF *)g_hash_table_lookup (oh_resource_id_table, key); if(!ep_xref) { uid_unlock(&oh_uid_lock); return SA_ERR_HPI_NOT_PRESENT; } memcpy(ep, &ep_xref->entity_path, sizeof(SaHpiEntityPathT)); uid_unlock(&oh_uid_lock); return SA_OK; } /** * oh_uid_map_to_file: saves current uid and entity path mappings * to file, first element in file is 4 bytes for resource id, * then repeat EP_XREF structures holding uid and entity path pairings * * Return value: success 0, failed -1. **/ SaErrorT oh_uid_map_to_file(void) { FILE *fp; if (!oh_uid_map_file) { return SA_OK; } uid_lock(&oh_uid_lock); fp = fopen(oh_uid_map_file, "wb"); if(!fp) { CRIT("Configuration file '%s' could not be opened", oh_uid_map_file); uid_unlock(&oh_uid_lock); return SA_ERR_HPI_ERROR; } /* write resource id */ if (fwrite((void *)&resource_id, sizeof(resource_id), 1, fp) != 1) { CRIT("write resource_id failed"); fclose(fp); uid_unlock(&oh_uid_lock); return SA_ERR_HPI_ERROR; } /* write all EP_XREF data records */ g_hash_table_foreach(oh_resource_id_table, write_ep_xref, fp); fclose(fp); uid_unlock(&oh_uid_lock); return SA_OK; } /* * write_ep_xref: called by g_hash_table_foreach(), for each * hash table entry see glib manual for further details * * Return value: None (void). */ static void write_ep_xref(gpointer key, gpointer value, gpointer fp) { if (fwrite(value, sizeof(EP_XREF), 1, (FILE *)fp) != 1) { CRIT("write EP_XREF failed"); } } /* * uid_map_from_file: called from oh_uid_initialize() during intialization * This function, if a uid map file exists, reads the current value for * uid and intializes the memory resident uid map file from file. * * Return value: success 0, error -1. */ static gint uid_map_from_file() { FILE *fp; int rval; #ifndef _WIN32 mode_t prev_umask; #endif if (!oh_uid_map_file) { return 0; } fp = fopen(oh_uid_map_file, "rb"); if(!fp) { /* create map file with resource id initial value */ WARN("uid_map file '%s' could not be opened, initializing", oh_uid_map_file); #ifndef _WIN32 prev_umask = umask(022); #endif fp = fopen(oh_uid_map_file, "wb"); if(!fp) { CRIT("Could not initialize uid map file, %s", oh_uid_map_file ); #ifndef _WIN32 if (geteuid() != 0) INFO("Use OPENHPI_UID_MAP env var to set uid_map file path"); umask (prev_umask); #endif return -1; } #ifndef _WIN32 umask (prev_umask); #endif /* write initial uid value */ if(fwrite(&resource_id, sizeof(resource_id), 1, fp) != 1 ) { CRIT("failed to write uid, on uid map file initialization"); fclose(fp); return -1; } if(fclose(fp) != 0) { CRIT("Couldn't close file '%s'.during uid map file initialization", oh_uid_map_file); return -1; } /* return from successful initialization, from newly created uid map file */ return 0; } /* read uid/resouce_id highest count from uid map file */ if (fread(&resource_id, sizeof(resource_id), 1, fp) != 1) { CRIT("error setting uid from existing uid map file"); fclose(fp); return -1; } rval = build_uid_map_data(fp); fclose(fp); if (rval < 0) return -1; /* return from successful initialization from existing uid map file */ return 0; } /* * build_uid_map_data: used by uid_map_from_file(), recursively * reads map file and builds two hash tables and EP_XREF data * structures * * @file: key into a GHashTable * * Return value: success 0, error -1. */ static gint build_uid_map_data(FILE *fp) { EP_XREF *ep_xref; EP_XREF ep_xref1; gpointer value; gpointer key; while (fread(&ep_xref1, sizeof(EP_XREF), 1, fp) == 1) { /* copy read record from ep_xref1 to malloc'd ep_xref */ ep_xref = g_new0(EP_XREF, 1); if (!ep_xref) return -1; memcpy(ep_xref, &ep_xref1, sizeof(EP_XREF)); value = (gpointer)ep_xref; /* entity path based key */ key = (gpointer)&ep_xref->entity_path; g_hash_table_insert(oh_ep_table, key, value); /* resource id based key */ key = (gpointer)&ep_xref->resource_id; g_hash_table_insert(oh_resource_id_table, key, value); } if ((feof(fp) == 0) || (ferror(fp) != 0)) { CRIT("error building ep xref from map file"); return -1; } return 0; } openhpi-3.6.1/utils/announcement_utils.h0000644000175100017510000000416412575647300017414 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * David Ashley * Renier Morales */ #ifndef __ANNOUNCEMENT_UTILS_H #define __ANNOUNCEMENT_UTILS_H #ifndef __OH_UTILS_H #warning *** Include oh_utils.h instead of individual utility header files *** #endif #include #include #ifdef __cplusplus extern "C" { #endif #define OH_ANNOUNCEMENT_MAX_SIZE 0 /* this struct encapsulates all the data for annunciator announcements */ /* the log records themselves are stored in the el GList */ typedef struct { SaHpiEventLogEntryIdT nextId; // next generated Id i.e. number of entries GList *annentries; // list of oh_ann_entry structs } oh_announcement; /* this structure encapsulates the actual log entry and its context */ typedef struct { SaHpiAnnouncementT annentry; SaHpiAnnunciatorNumT num; // associated annunciator } oh_ann_entry; /* General EL utility calls */ oh_announcement *oh_announcement_create(void); SaErrorT oh_announcement_close(oh_announcement *ann); SaErrorT oh_announcement_append(oh_announcement *ann, SaHpiAnnouncementT *myann); SaErrorT oh_announcement_clear(oh_announcement *ann); SaErrorT oh_announcement_get(oh_announcement *ann, SaHpiEntryIdT srchid, SaHpiAnnouncementT *myann); SaErrorT oh_announcement_get_next(oh_announcement *ann, SaHpiSeverityT sev, SaHpiBoolT ack, SaHpiAnnouncementT *entry); SaErrorT oh_announcement_ack(oh_announcement *ann, SaHpiEntryIdT entry, SaHpiSeverityT sev); SaErrorT oh_announcement_del(oh_announcement *ann, SaHpiEntryIdT entry, SaHpiSeverityT sev); #ifdef __cplusplus } #endif #endif openhpi-3.6.1/utils/sahpi_gcrypt_utils.c0000644000175100017510000003411012575647300017403 0ustar mohanmohan/* * * Copyright (C) 2013, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Mohan Devarajulu */ #include #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_ENCRYPT SaErrorT oh_initialize_gcrypt(gcry_cipher_hd_t *h1, gcry_cipher_hd_t *h2, gchar *key) { static int initialized = 0; if (initialized == 1) return(0); if ((!gcry_check_version ( NULL )) || (gcry_control( GCRYCTL_DISABLE_SECMEM_WARN )) || (gcry_control( GCRYCTL_INIT_SECMEM, 16384, 0 )) || (gcry_cipher_open( h1, GCRY_CIPHER_ARCFOUR,GCRY_CIPHER_MODE_STREAM,0 )) || (gcry_cipher_open( h2, GCRY_CIPHER_ARCFOUR,GCRY_CIPHER_MODE_STREAM,0 )) || (gcry_cipher_setkey ( *h1, key, strlen(key) )) || (gcry_cipher_setkey ( *h2, key, strlen(key) ))) { CRIT("Something went wrong with gcrypt calls"); return(1); } else { initialized = 1; return(0); } } /****************************************************************************** * gchar *oh_crypt(gchar *file_path, SaHpiUint32T type) * * Function to encrypt or decrypt given file. The encrypted * or decrypted text is returned to the caller. The caller needs to free the * memory. * While encrypting the file, encrypted file is saved to the original file * location after a check and the encrypted text is sent to the caller. While * decrypting, the decrypted text is sent to the caller, but the original file * is left intact. * * file_path - File name to be encrypted or decrypted. When the file is * encrypted, the original file is overwritten, when it is decrypted it is left * as it is * type - Encrypt or Decrypt. * * Return: gchar * * Encrypted or Decrypted string * *****************************************************************************/ gchar * oh_crypt(gchar *file_path, SaHpiUint32T type) { gcry_cipher_hd_t handle1, handle2; int ret = 0, err=0, cwd_fd = 0; struct stat buf, keybuf; char * plain_text = NULL; char * ptr_substr = NULL; char * out = NULL; char * key = NULL; char * deout = NULL; long int file_size = 0, en_file_size=0; char file_path_ck[PATH_MAX]; char file_path_en[PATH_MAX]; char cwd[PATH_MAX]; FILE *fconf = NULL, *fpuuid = NULL; /* If you can not stat then you can not access the file */ if (getcwd(cwd, sizeof(cwd)) != NULL) cwd_fd = open(cwd, O_DIRECTORY, S_IWUSR); ret = faccessat(cwd_fd, file_path, R_OK, AT_EACCESS ); if (ret != 0 ) { CRIT("Can not access file %s",file_path); return(NULL); } else { ret = stat(file_path, &buf); /* Really stat call should not fail here */ if (ret != 0 ) { CRIT("Can not stat file %s",file_path); return(NULL); } } file_size = buf.st_size; if ((file_size > 1000000000) || (strlen(file_path)+10 > PATH_MAX)) { CRIT("%s path is long or too big",file_path); return(NULL); } plain_text = ( char * ) g_malloc0 ( sizeof ( char ) * ( file_size + 1) ); fconf = fopen(file_path,"r"); if (fconf == NULL) { CRIT("Unable to open %s",file_path); return(NULL); } fread(plain_text, 1, file_size, fconf); fclose(fconf); ret = faccessat(0, PUUID_PATH, R_OK, AT_EACCESS ); if ( ret != 0 ) { if (geteuid() == 0) { WARN("Could not find %s",PUUID_PATH); WARN("Using the SAHPI_DEFKEY. If the above file is created"); WARN("ever, move the file away to decrypt"); } key = ( char * ) g_malloc0 ( sizeof ( char ) * ( strlen(SAHPI_DEFKEY)+1) ); strcpy(key,SAHPI_DEFKEY); } else { ret = stat(PUUID_PATH, &keybuf); /* Really stat call should not fail here */ if (ret != 0 ) { CRIT("Can not stat file %s",PUUID_PATH); return(NULL); } fpuuid=fopen(PUUID_PATH, "r"); if (fpuuid == NULL) { if (geteuid() == 0) CRIT("Unable to open %s",PUUID_PATH); else CRIT("Unable to open %s, Use sudo", PUUID_PATH); return(NULL); } key = ( char * ) g_malloc0 ( sizeof ( char ) * ( keybuf.st_size + 1) ); ret=fread(key, 1, keybuf.st_size, fpuuid); fclose(fpuuid); } if(oh_initialize_gcrypt(&handle1, &handle2, key)) { CRIT("Could not initialize gcrypt libraries"); g_free(key); return(NULL); } if ( type == OHPI_ENCRYPT ) { ptr_substr=strstr(plain_text,"handler"); if (!ptr_substr) { CRIT("Looks like the %s does not have a handler",file_path); CRIT("It is either already encrypted or no plugins defined"); g_free(plain_text); g_free(key); return(NULL); } out = ( char * ) g_malloc0 ( sizeof ( char ) * ( file_size + 1 ) ); err = gcry_cipher_encrypt ( handle1, ( unsigned char * ) out, file_size, ( const unsigned char * ) plain_text, file_size ); if ( err ) { CRIT("Failure: %s/%s", gcry_strsource ( err ), gcry_strerror ( err ) ); g_free(plain_text); g_free(out); g_free(key); return(NULL); } strcpy(file_path_en, file_path); strcat(file_path_en,".temp_en"); if (access (file_path_en, F_OK) != -1 ) { CRIT("Trying to use %s for temporary_file",file_path_en); CRIT("That file already exists. Remove it and restart again"); g_free(plain_text); g_free(out); g_free(key); return(NULL); } fconf = fopen(file_path_en,"w"); if (fconf == NULL) { CRIT("Unable to open the file for writing"); g_free(plain_text); g_free(out); g_free(key); return(NULL); } err = fwrite(out, 1, file_size, fconf); if (err != file_size ) { CRIT("Wrote %d, but expected to write %ld",err, file_size); g_free(plain_text); g_free(out); g_free(key); return(NULL); } err = 0; fclose(fconf); ret = chmod(file_path_en, buf.st_mode); /* Setting mode to original file mode */ ret = stat(file_path_en, &buf); en_file_size = buf.st_size; if (file_size != en_file_size) { CRIT("original file size %ld, encrypted %ld", file_size, en_file_size); g_free(plain_text); g_free(out); g_free(key); return(NULL); } memset(out,0,file_size); fconf = fopen(file_path_en,"r"); fread(out,1,file_size,fconf); fclose(fconf); deout = ( char * ) g_malloc0 ( sizeof ( char ) * ( file_size + 1 ) ); err = gcry_cipher_decrypt ( handle2, ( unsigned char * ) deout, file_size, ( const unsigned char * ) out, file_size ); if (strcmp(deout, plain_text) != 0 || (err)) { CRIT("Unable to encrypt and decrypt"); if(err) CRIT("decrypt call failed"); remove(file_path_en); if (strlen(file_path)+10 < 1024) { strcpy(file_path_ck, file_path); strcat(file_path_ck,".check"); } fconf = fopen(file_path_ck,"w"); err = fwrite(deout, 1, file_size, fconf); if (err != file_size ) { CRIT("Wrote %d, but expected to write %ld",err, file_size); } CRIT("compare %s and %s. Encryption failed",file_path,file_path_ck); g_free(plain_text); g_free(out); g_free(deout); g_free(key); return(NULL); } /* At this point everything is ok. Able to encrypt and save into a file. * the same file is read and the contents decrypted. Original and decryption * match. So move the encrypted file to the original location */ g_free(plain_text); g_free(deout); err = 0; err = rename(file_path_en, file_path); if ( err != 0 ) { CRIT("%s is not moved to %s",file_path_en,file_path); g_free(out); g_free(key); return(NULL); } g_free(key); return(out); } else if(type == OHPI_DECRYPT) { ptr_substr=strstr(plain_text,"handler"); if (ptr_substr) { CRIT("Looks like the %s is a plain file",file_path); CRIT("It was not encrypted?. Please check"); g_free(plain_text); g_free(key); return(NULL); } out = ( char * ) g_malloc0 ( sizeof ( char ) * ( file_size + 1 ) ); err = gcry_cipher_decrypt ( handle2, ( unsigned char * ) out, file_size, ( const unsigned char * ) plain_text, file_size ); if ( err ) { CRIT("Failure: %s/%s", gcry_strsource ( err ), gcry_strerror ( err ) ); g_free(plain_text); g_free(out); g_free(key); return(NULL); } else { g_free(plain_text); ptr_substr = NULL; ptr_substr=strstr(out,"handler"); if ((!ptr_substr) && (geteuid() == 0)) { CRIT("Looks like the decrypted texts does not have a handler"); CRIT("Decryption might have failed."); if(!strcmp(key,SAHPI_DEFKEY)) INFO("Check if %s exists",PUUID_PATH); else { INFO("Try to decrypt it as a normal user/no sudo"); INFO("if that fails recover from backup. Sorry"); } } else if (!ptr_substr) { CRIT("Looks like the decrypted text does not have a handler"); CRIT("Decryption might have failed."); if(!strcmp(key,SAHPI_DEFKEY)) INFO("If file is bad, Recover from backup or try sudo."); else INFO("If file is bad, Recover from backup."); } g_free(key); return(out); } } else { CRIT("Unknown Type %d",type); g_free(plain_text); g_free(key); return(NULL); } g_free(key); return(NULL); } #endif openhpi-3.6.1/utils/version.rc0000644000175100017510000000162712575647300015345 0ustar mohanmohan#include LANGUAGE 0x09,0x01 // English(US) VS_VERSION_INFO VERSIONINFO FILEVERSION BINARY_VERSION PRODUCTVERSION BINARY_VERSION FILEFLAGSMASK 0 FILEFLAGS 0 FILEOS VOS_NT_WINDOWS32 FILETYPE VFT_DLL FILESUBTYPE VFT2_UNKNOWN BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904E4" // English(US), Multilingual BEGIN VALUE "Comments", "" VALUE "CompanyName", "OpenHPI Community (http://openhpi.org/)" VALUE "FileDescription", "OpenHPI Utils Library" VALUE "FileVersion", VERSION VALUE "InternalName", "libopenhpiutils" VALUE "LegalCopyright", "OpenHPI is distributed under BSD license" VALUE "OriginalFilename", "libopenhpiutils.dll" VALUE "ProductName", "OpenHPI" VALUE "ProductVersion", VERSION END END END openhpi-3.6.1/utils/sahpi_time_utils.c0000644000175100017510000001025012575647300017030 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * (C) Copyright Pigeon Point Systems. 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman * Anton Pak */ #include #include #include #include #include #include #include #include /** * oh_localtime: * @time: SaHpiTimeT time to be converted. * @tm: Location to store the converted broken-down time. * * Converts an SaHpiTimeT time value to broken-down * time representation. * * Returns: * SA_OK - normal operation. * SA_ERR_HPI_INVALID_PARAMS - @buffer is NULL. * SA_ERR_HPI_INTERNAL_ERROR - conversion failed **/ SaErrorT oh_localtime(const SaHpiTimeT time, struct tm *tm) { time_t t; struct tm *tm2; if (!tm) { return(SA_ERR_HPI_INVALID_PARAMS); } t = (time_t)(time / 1000000000); #ifndef _WIN32 tm2 = localtime_r(&t, tm); #else /* _WIN32 */ // Windows version of localtime is thread-safe tm2 = localtime(&t); if (tm2) { *tm = *tm2; } #endif /* _WIN32 */ if (!tm2) { return SA_ERR_HPI_INTERNAL_ERROR; } return(SA_OK); } /** * oh_decode_time: * @time: SaHpiTimeT time to be converted. * @buffer: Location to store the converted string. * * Converts an SaHpiTimeT time value to the preferred date/time string * representation defined for the current locale. * String is stored in an SaHpiTextBufferT data structure. * * Returns: * SA_OK - normal operation. * SA_ERR_HPI_INVALID_PARAMS - @buffer is NULL. * SA_ERR_HPI_INTERNAL_ERROR - @buffer not big enough to accomodate * date/time representation string or * conversion failed. **/ SaErrorT oh_decode_time(SaHpiTimeT time, SaHpiTextBufferT *buffer) { int count; SaErrorT err; SaHpiTextBufferT working; if (!buffer) { return(SA_ERR_HPI_INVALID_PARAMS); } err = oh_init_textbuffer(&working); if (err != SA_OK) { return(err); } if (time == SAHPI_TIME_UNSPECIFIED) { strcpy((char *)working.Data,"SAHPI_TIME_UNSPECIFIED "); count = sizeof("SAHPI_TIME_UNSPECIFIED "); } else if (time > SAHPI_TIME_MAX_RELATIVE) { /*absolute time*/ struct tm tm; err = oh_localtime(time, &tm); if (err != SA_OK) { return(err); } count = strftime((char *)working.Data, SAHPI_MAX_TEXT_BUFFER_LENGTH, "%Y-%m-%d %H:%M:%S", &tm); } else { /*relative time*/ long secs = (long)( time / 1000000000L ); long mins = ( secs / 60L ) % 60L; long hours = ( secs / 3600L ) % 24L; long days = secs / 86400L; secs = secs % 60L; count = snprintf( (char *)working.Data, SAHPI_MAX_TEXT_BUFFER_LENGTH, "RELATIVE: %ldd %02ld:%02ld:%02ld", days, hours, mins, secs ); } if (count == 0) { return(SA_ERR_HPI_INTERNAL_ERROR); } else working.DataLength = count; err = oh_copy_textbuffer(buffer, &working); if (err != SA_OK) { return(err); } return(SA_OK); } /** * oh_gettimeofday: * @time: Location to store Time of Day value * * Find the time of day and converts it into an HPI time. * * Returns: * SA_OK - normal operation. * SA_ERR_HPI_INVALID_PARAMS - @time is NULL. **/ SaErrorT oh_gettimeofday(SaHpiTimeT *time) { GTimeVal now; if (!time) { return(SA_ERR_HPI_INVALID_PARAMS); } g_get_current_time(&now); *time = (SaHpiTimeT)now.tv_sec * 1000000000 + now.tv_usec * 1000; return(SA_OK); } openhpi-3.6.1/utils/sahpi_wrappers.c0000644000175100017510000001756012575647301016531 0ustar mohanmohan/* * * Copyright (C) 2014, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Mohan Devarajulu */ #include #include #include "sahpi_wrappers.h" GThread *wrap_g_thread_create_new(const gchar *name, GThreadFunc func, gpointer data, gboolean joinable, GError **error) { GThread *thrd = NULL; #if GLIB_CHECK_VERSION (2, 32, 0) thrd = g_thread_new(name, func, data); #else thrd = g_thread_create(func, data, joinable, error); #endif return(thrd); } /** * wrap_g_mutex_new_init() * * Purpose: * Wrapper function to get a mutex structure allocated and initialized * * Detailed Description: NA * Call g_mutex_init(GMutex *) if the glib version is > 2.31.0 * OR * Call g_mutex_new() if the glib version is > 2.31.0 * * Return Values: * Gmutex pointer is returned. It could be NULL if memory is not allocated * **/ GMutex* wrap_g_mutex_new_init() { GMutex *mutx = NULL; #if GLIB_CHECK_VERSION (2, 32, 0) mutx = (GMutex*)g_malloc0(sizeof(GMutex)); if (mutx == NULL) { err("GMutex allocation failed. Continuing"); return NULL; } g_mutex_init(mutx); #else mutx = g_mutex_new(); #endif return mutx; } void wrap_g_mutex_free_clear(GMutex *mutex) { #if GLIB_CHECK_VERSION (2, 32, 0) g_mutex_clear(mutex); #else g_mutex_free(mutex); #endif } void wrap_g_mutex_lock(GMutex *mutex) { g_mutex_lock(mutex); } gboolean wrap_g_mutex_trylock(GMutex *mutex) { return(g_mutex_trylock(mutex)); } void wrap_g_mutex_unlock(GMutex *mutex) { g_mutex_unlock(mutex); } void wrap_g_thread_init(gpointer nul) { #if GLIB_CHECK_VERSION (2, 32, 0) dbg("g_thread_init not needed in glib>2.31)"); #else g_thread_init(nul); #endif } void wrap_g_static_rec_mutex_lock(void *mutex) { #if GLIB_CHECK_VERSION (2, 32, 0) g_rec_mutex_lock ((GRecMutex *)mutex); #else g_static_rec_mutex_lock((GStaticRecMutex *)mutex); #endif } gboolean wrap_g_static_rec_mutex_trylock(void *mutex) { #if GLIB_CHECK_VERSION (2, 32, 0) return(g_rec_mutex_trylock ((GRecMutex *)mutex)); #else return(g_static_rec_mutex_trylock ((GStaticRecMutex *)mutex)); #endif } void wrap_g_static_rec_mutex_unlock ( void *mutex) { #if GLIB_CHECK_VERSION (2, 32, 0) g_rec_mutex_unlock ((GRecMutex *)mutex); #else g_static_rec_mutex_unlock((GStaticRecMutex *)mutex); #endif } void wrap_g_static_private_init(void *key) { #if GLIB_CHECK_VERSION (2, 32, 0) err("Not expected to be here"); #else g_static_private_init((GStaticPrivate *)key); #endif } void wrap_g_static_private_free(void * key) { #if GLIB_CHECK_VERSION (2, 32, 0) ; #else g_static_private_free((GStaticPrivate*) key); #endif } #if GLIB_CHECK_VERSION (2, 32, 0) void wrap_g_static_private_set(void * key, gpointer value) { g_private_set((GPrivate*) key, value); } #else void wrap_g_static_private_set(void * key, gpointer value, GDestroyNotify notify) { g_static_private_set((GStaticPrivate*) key, value, notify); } #endif gpointer wrap_g_static_private_get(void *key) { #if GLIB_CHECK_VERSION (2, 32, 0) return g_private_get((GPrivate*) key); #else return g_static_private_get((GStaticPrivate *)key); #endif } void wrap_g_static_rec_mutex_init(void *mutex) { #if GLIB_CHECK_VERSION (2, 32, 0) g_rec_mutex_init((GRecMutex *)mutex); #else g_static_rec_mutex_init((GStaticRecMutex *)mutex); #endif } void wrap_g_static_rec_mutex_free_clear(void *mutex) { #if GLIB_CHECK_VERSION (2, 32, 0) g_rec_mutex_clear((GRecMutex *)mutex); #else g_static_rec_mutex_free((GStaticRecMutex *)mutex); #endif } #if GLIB_CHECK_VERSION (2, 32, 0) gpointer wrap_g_async_queue_timed_pop(GAsyncQueue *queue, guint64 end_time) { return(g_async_queue_timeout_pop(queue, end_time)); } #else gpointer wrap_g_async_queue_timed_pop(GAsyncQueue *queue, GTimeVal *end_time) { return(g_async_queue_timed_pop(queue, end_time)); } #endif #if GLIB_CHECK_VERSION (2, 32, 0) gboolean wrap_g_cond_timed_wait (GCond *cond, GMutex *mutex, gint64 abs_time) { return(g_cond_wait_until (cond, mutex, abs_time)); } #else gboolean wrap_g_cond_timed_wait (GCond *cond, GMutex *mutex, GTimeVal *abs_time) { return(g_cond_timed_wait (cond, mutex, abs_time)); } #endif GCond* wrap_g_cond_new_init() { GCond *cond; #if GLIB_CHECK_VERSION (2, 32, 0) cond = g_malloc(sizeof(GCond)); g_cond_init(cond); #else cond=g_cond_new(); #endif return cond; } void wrap_g_cond_free (GCond *cond) { #if GLIB_CHECK_VERSION (2, 32, 0) g_free(cond); cond=NULL; #else g_cond_free(cond); #endif } void wrap_g_static_mutex_init (void *mutex) { #if GLIB_CHECK_VERSION (2, 32, 0) g_mutex_init((GMutex *)mutex); #else g_static_mutex_init((GStaticMutex *)mutex); #endif } void wrap_g_static_mutex_free_clear(void *mutex) { #if GLIB_CHECK_VERSION (2, 32, 0) g_mutex_clear((GMutex*)mutex); #else g_static_mutex_free((GStaticMutex*)mutex); #endif } void wrap_g_static_mutex_unlock(void *mutex) { #if GLIB_CHECK_VERSION (2, 32, 0) g_mutex_unlock((GMutex*)mutex); #else g_static_mutex_unlock((GStaticMutex*)mutex); #endif } void wrap_g_static_mutex_lock(void *mutex) { #if GLIB_CHECK_VERSION (2, 32, 0) g_mutex_lock((GMutex*)mutex); #else g_static_mutex_lock((GStaticMutex*)mutex); #endif } void wrap_g_free(void *ptr) { if(ptr) { g_free(ptr); ptr = NULL; } } openhpi-3.6.1/utils/sahpixtca_enum_utils.c0000644000175100017510000002412412575647301017724 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * (C) Copyright Pigeon Point Systems. 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman * Anton Pak */ #include #include #include /** * oh_lookup_xtcahpiledcolor: * @value: enum value of type XtcaHpiLedColorT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid XtcaHpiLedColorT. **/ char * oh_lookup_xtcahpiledcolor(XtcaHpiLedColorT value) { switch (value) { case XTCAHPI_LED_COLOR_RESERVED: return "COLOR_RESERVED"; case XTCAHPI_LED_COLOR_BLUE: return "COLOR_BLUE"; case XTCAHPI_LED_COLOR_RED: return "COLOR_RED"; case XTCAHPI_LED_COLOR_GREEN: return "COLOR_GREEN"; case XTCAHPI_LED_COLOR_AMBER: return "COLOR_AMBER"; case XTCAHPI_LED_COLOR_ORANGE: return "COLOR_ORANGE"; case XTCAHPI_LED_COLOR_WHITE: return "COLOR_WHITE"; case XTCAHPI_LED_COLOR_NO_CHANGE: return "COLOR_NO_CHANGE"; case XTCAHPI_LED_COLOR_USE_DEFAULT: return "COLOR_USE_DEFAULT"; default: return NULL; } } struct oh_xtcahpiledcolor_map xtcahpiledcolor_strings[] = { {XTCAHPI_LED_COLOR_RESERVED, "COLOR_RESERVED"}, {XTCAHPI_LED_COLOR_BLUE, "COLOR_BLUE"}, {XTCAHPI_LED_COLOR_RED, "COLOR_RED"}, {XTCAHPI_LED_COLOR_GREEN, "COLOR_GREEN"}, {XTCAHPI_LED_COLOR_AMBER, "COLOR_AMBER"}, {XTCAHPI_LED_COLOR_ORANGE, "COLOR_ORANGE"}, {XTCAHPI_LED_COLOR_WHITE, "COLOR_WHITE"}, {XTCAHPI_LED_COLOR_NO_CHANGE, "COLOR_NO_CHANGE"}, {XTCAHPI_LED_COLOR_USE_DEFAULT, "COLOR_USE_DEFAULT"}, }; /** * oh_encode_xtcahpiledcolor: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of XtcaHpiLedColorT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_xtcahpiledcolor(), back * into an XtcaHpiLedColorT type. * * Returns: * XtcaHpiLedColorT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_xtcahpiledcolor(SaHpiTextBufferT *buffer, XtcaHpiLedColorT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, xtcahpiledcolor_strings[i].str) == 0) { found++; break; } } if (found) { *type = xtcahpiledcolor_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_xtcahpiresourceledmode: * @value: enum value of type XtcaHpiResourceLedModeT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid XtcaHpiResourceLedModeT. **/ char * oh_lookup_xtcahpiresourceledmode(XtcaHpiResourceLedModeT value) { switch (value) { case XTCAHPI_LED_AUTO: return "AUTO"; case XTCAHPI_LED_MANUAL: return "MANUAL"; case XTCAHPI_LED_LAMP_TEST: return "LAMP_TEST"; default: return NULL; } } struct oh_xtcahpiresourceledmode_map xtcahpiresourceledmode_strings[] = { {XTCAHPI_LED_AUTO, "AUTO"}, {XTCAHPI_LED_MANUAL, "MANUAL"}, {XTCAHPI_LED_LAMP_TEST, "LAMP_TEST"}, }; /** * oh_encode_xtcahpiresourceledmode: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of XtcaHpiResourceLedModeT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_xtcahpiresourceledmode(), back * into an XtcaHpiResourceLedModeT type. * * Returns: * XtcaHpiResourceLedModeT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_xtcahpiresourceledmode(SaHpiTextBufferT *buffer, XtcaHpiResourceLedModeT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, xtcahpiresourceledmode_strings[i].str) == 0) { found++; break; } } if (found) { *type = xtcahpiresourceledmode_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_xtcahpiledbrsupport: * @value: enum value of type XtcaHpiLedBrSupportT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid XtcaHpiLedBrSupportT. **/ char * oh_lookup_xtcahpiledbrsupport(XtcaHpiLedBrSupportT value) { switch (value) { case XTCAHPI_LED_BR_SUPPORTED: return "BR_SUPPORTED"; case XTCAHPI_LED_BR_NOT_SUPPORTED: return "BR_NOT_SUPPORTED"; case XTCAHPI_LED_BR_UNKNOWN: return "BR_UNKNOWN"; default: return NULL; } } struct oh_xtcahpiledbrsupport_map xtcahpiledbrsupport_strings[] = { {XTCAHPI_LED_BR_SUPPORTED, "BR_SUPPORTED"}, {XTCAHPI_LED_BR_NOT_SUPPORTED, "BR_NOT_SUPPORTED"}, {XTCAHPI_LED_BR_UNKNOWN, "BR_UNKNOWN"}, }; /** * oh_encode_xtcahpiledbrsupport: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of XtcaHpiLedBrSupportT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_xtcahpiledbrsupport(), back * into an XtcaHpiLedBrSupportT type. * * Returns: * XtcaHpiLedBrSupportT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_xtcahpiledbrsupport(SaHpiTextBufferT *buffer, XtcaHpiLedBrSupportT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, xtcahpiledbrsupport_strings[i].str) == 0) { found++; break; } } if (found) { *type = xtcahpiledbrsupport_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_xtcahpientitytype: * @value: enum value of type SaHpiEntityTypeT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiEntityTypeT. **/ char * oh_lookup_xtcahpientitytype(SaHpiEntityTypeT value) { switch (value) { case XTCAHPI_ENT_POWER_SLOT: return "POWER_SLOT"; case XTCAHPI_ENT_SHELF_FRU_DEVICE_SLOT: return "SHELF_FRU_DEVICE_SLOT"; case XTCAHPI_ENT_SHELF_MANAGER_SLOT: return "SHELF_MANAGER_SLOT"; case XTCAHPI_ENT_FAN_TRAY_SLOT: return "FAN_TRAY_SLOT"; case XTCAHPI_ENT_FAN_FILTER_TRAY_SLOT: return "FAN_FILTER_TRAY_SLOT"; case XTCAHPI_ENT_ALARM_SLOT: return "ALARM_SLOT"; case XTCAHPI_ENT_AMC_SLOT: return "AMC_SLOT"; case XTCAHPI_ENT_PMC_SLOT: return "PMC_SLOT"; case XTCAHPI_ENT_RTM_SLOT: return "RTM_SLOT"; case XTCAHPI_ENT_CARRIER_MANAGER_SLOT: return "CARRIER_MANAGER_SLOT"; case XTCAHPI_ENT_CARRIER_SLOT: return "CARRIER_SLOT"; case XTCAHPI_ENT_COM_E_SLOT: return "COM_E_SLOT"; default: return NULL; } } struct oh_xtcahpientitytype_map xtcahpientitytype_strings[] = { {XTCAHPI_ENT_POWER_SLOT, "POWER_SLOT"}, {XTCAHPI_ENT_SHELF_FRU_DEVICE_SLOT, "SHELF_FRU_DEVICE_SLOT"}, {XTCAHPI_ENT_SHELF_MANAGER_SLOT, "SHELF_MANAGER_SLOT"}, {XTCAHPI_ENT_FAN_TRAY_SLOT, "FAN_TRAY_SLOT"}, {XTCAHPI_ENT_FAN_FILTER_TRAY_SLOT, "FAN_FILTER_TRAY_SLOT"}, {XTCAHPI_ENT_ALARM_SLOT, "ALARM_SLOT"}, {XTCAHPI_ENT_AMC_SLOT, "AMC_SLOT"}, {XTCAHPI_ENT_PMC_SLOT, "PMC_SLOT"}, {XTCAHPI_ENT_RTM_SLOT, "RTM_SLOT"}, {XTCAHPI_ENT_CARRIER_MANAGER_SLOT, "CARRIER_MANAGER_SLOT"}, {XTCAHPI_ENT_CARRIER_SLOT, "CARRIER_SLOT"}, {XTCAHPI_ENT_COM_E_SLOT, "COM_E_SLOT"}, }; /** * oh_encode_xtcahpientitytype: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiEntityTypeT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_xtcahpientitytype(), back * into an SaHpiEntityTypeT type. * * Returns: * SaHpiEntityTypeT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_xtcahpientitytype(SaHpiTextBufferT *buffer, SaHpiEntityTypeT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, xtcahpientitytype_strings[i].str) == 0) { found++; break; } } if (found) { *type = xtcahpientitytype_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } openhpi-3.6.1/utils/sahpi_event_encode.h0000644000175100017510000000266612575647301017332 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./SaHpi2code.pl. * Do not change this file manually. Update script instead *******************************************************************/ #ifndef __SAHPI_EVENT_ENCODE_H #define __SAHPI_EVENT_ENCODE_H #ifndef __OH_UTILS_H #warning *** Include oh_utils.h instead of individual utility header files *** #endif #ifdef __cplusplus extern "C" { #endif #define OH_ENCODE_DELIMITER " | " #define OH_ENCODE_DELIMITER_CHAR "|" #define OH_ENCODE_DELIMITER_LENGTH 3 typedef struct { SaHpiEventCategoryT category; SaHpiEventStateT state; char *str; } oh_categorystate_map; #define OH_MAX_STATE_GLOBAL_STRINGS 1 extern oh_categorystate_map state_global_strings[OH_MAX_STATE_GLOBAL_STRINGS]; #define OH_MAX_STATE_STRINGS 77 extern oh_categorystate_map state_strings[OH_MAX_STATE_STRINGS]; #ifdef __cplusplus } #endif #endif openhpi-3.6.1/Makefile.mingw320000644000175100017510000000347712575647301015125 0ustar mohanmohaninclude Makefile.mingw32.def out := openhpi-${VERSION}-win32-${ARCH} doc := ${out} deps := ${out} libs := ${out} devel := ${out} progs := ${out} plugins := ${out} conf := ${out} openhpi_libs := utils \ transport \ marshal \ baselib \ clients \ clients/hpixml \ hpi_shell \ openhpid \ plugins/slave \ plugins/test_agent .PHONY: all clean $(openhpi_libs) all: $(openhpi_libs) $(openhpi_libs): make -f Makefile.mingw32 -C $@ clean: for d in $(openhpi_libs); \ do \ make -f Makefile.mingw32 -C $$d clean; \ done rm -rf ${out} out: all rm -rf ${out} mkdir -p ${out} mkdir -p ${doc} cp README.windows ${doc}/README.windows.txt mkdir -p ${deps} cp ${GLIB_DIR}/bin/libglib-2.0-0.dll ${deps} cp ${GLIB_DIR}/bin/libgmodule-2.0-0.dll ${deps} cp ${GLIB_DIR}/bin/libgthread-2.0-0.dll ${deps} mkdir -p ${libs} cp transport/libopenhpitransport.dll ${libs} cp marshal/libopenhpimarshal.dll ${libs} cp utils/libopenhpiutils.dll ${libs} cp baselib/libopenhpi.dll ${libs} mkdir -p ${devel} cat include/SaHpi.h | sed -e 's/ __attribute__.*/;/' -e 's/#define SAHPI_API/#define SAHPI_API __declspec(dllimport)/' > ${devel}/SaHpi.h cp include/SaHpiXtca.h ${devel} cp include/oHpi.h ${devel} cp utils/libopenhpiutils.a ${devel} cp utils/libopenhpiutils.def ${devel} cp baselib/libopenhpi.a ${devel} cp baselib/libopenhpi.def ${devel} mkdir -p ${progs} cp clients/*.exe ${progs} cp clients/hpixml/hpixml.exe ${progs} cp hpi_shell/hpi_shell.exe ${progs} cp openhpid/openhpid.exe ${progs} mkdir -p ${plugins} cp plugins/slave/libslave.dll ${plugins} cp plugins/test_agent/libtest_agent.dll ${plugins} mkdir -p ${conf} cp mingw32/openhpi.conf.example ${conf}/openhpi.conf openhpi-3.6.1/baselibs/0000755000175100017510000000000012605014525013737 5ustar mohanmohanopenhpi-3.6.1/baselibs/csharp/0000755000175100017510000000000012665676571015244 5ustar mohanmohanopenhpi-3.6.1/baselibs/csharp/example_handlers.cs0000644000175100017510000001001212575647300021064 0ustar mohanmohan/* -*- c# -*- * * Copyright (C) 2012, Pigeon Point Systems * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ using System; using System.Collections.Generic; using System.Text; using org.openhpi; class Example { public static void Main() { long rv; long sid; rv = Api.saHpiSessionOpen( HpiConst.SAHPI_UNSPECIFIED_DOMAIN_ID, out sid, null ); if ( rv != HpiConst.SA_OK ) { Console.WriteLine( "Error: saHpiSessionOpen: {0}", rv ); return; } long last_hid = HpiConst.SAHPI_LAST_ENTRY; // List all handlers ASCIIEncoding ascii = new ASCIIEncoding(); foreach ( long hid in OhpiIterators.HandlerIds( sid ) ) { last_hid = hid; Console.WriteLine( "Handler {0}", hid ); oHpiHandlerInfoT hinfo; oHpiHandlerConfigT hconf; rv = Api.oHpiHandlerInfo( sid, hid, out hinfo, out hconf ); if ( rv != HpiConst.SA_OK ) { Console.WriteLine( "Error: oHpiHandlerInfo: {0}", rv ); continue; } Console.WriteLine( " Info" ); Console.WriteLine( " id {0}", hinfo.id ); Console.WriteLine( " name {0}", ascii.GetString( hinfo.plugin_name ) ); Console.WriteLine( " entity_root {0}", HpiUtil.FromSaHpiEntityPathT( hinfo.entity_root ) ); Console.WriteLine( " load_failed {0}", hinfo.load_failed ); Console.WriteLine( " Config" ); foreach ( var kv in OhpiUtil.FromoHpiHandlerConfigT( hconf ) ) { Console.WriteLine( " {0} = {1}", kv.Key, kv.Value ); } } // Retry last handler if ( last_hid != HpiConst.SAHPI_LAST_ENTRY ) { Console.WriteLine( "Re-trying last handler: {0}", last_hid ); rv = Api.oHpiHandlerRetry( sid, last_hid ); if ( rv != HpiConst.SA_OK ) { Console.WriteLine( "Error: oHpiHandlerRetry: {0}", rv ); } } // Destroy last handler if ( last_hid != HpiConst.SAHPI_LAST_ENTRY ) { Console.WriteLine( "Destroying last handler: {0}", last_hid ); rv = Api.oHpiHandlerDestroy( sid, last_hid ); if ( rv != HpiConst.SA_OK ) { Console.WriteLine( "Error: oHpiHandlerDestroy: {0}", rv ); } } // Look for handler providing specified resource { long hid = HpiConst.SAHPI_LAST_ENTRY; long rid = 5; rv = Api.oHpiHandlerFind( sid, rid, out hid ); if ( rv != HpiConst.SA_OK ) { Console.WriteLine( "Error: oHpiHandlerFind: {0}", rv ); } if ( hid != HpiConst.SAHPI_LAST_ENTRY ) { Console.WriteLine( "Resource {0} is provided by handler {1}", rid, hid ); } } // Create new instance of test_agent plugin { Console.WriteLine( "Creating new handler" ); var d = new Dictionary { { "plugin", "libtest_agent" }, { "port" , "9999" } }; var hconf = OhpiUtil.TooHpiHandlerConfigT( d ); long hid; rv = Api.oHpiHandlerCreate( sid, hconf, out hid ); if ( rv == HpiConst.SA_OK ) { Console.WriteLine( "Created handler {0}", hid ); } else { Console.WriteLine( "Error: oHpiHandlerCreate: {0}", rv ); } } rv = Api.saHpiSessionClose( sid ); if ( rv != HpiConst.SA_OK ) { Console.WriteLine( "Error: saHpiSessionClose: {0}", rv ); return; } } }; openhpi-3.6.1/baselibs/csharp/example_iterators.cs0000644000175100017510000002317312575647300021314 0ustar mohanmohan/* -*- c# -*- * * Copyright (C) 2012, Pigeon Point Systems * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ using System; using System.Linq; using org.openhpi; class Example { public static void Main() { long rv; long did; long sid; rv = Api.oHpiDomainAdd( HpiUtil.ToSaHpiTextBufferT( "localhost" ), OhpiConst.DEFAULT_PORT, HpiUtil.MakeRootSaHpiEntityPathT(), out did ); if ( rv != HpiConst.SA_OK ) { Console.WriteLine( "Error: oHpiDomainAdd: {0}", rv ); return; } rv = Api.saHpiSessionOpen( did, out sid, null ); if ( rv != HpiConst.SA_OK ) { Console.WriteLine( "Error: saHpiSessionOpen: {0}", rv ); return; } // DRT Console.WriteLine( "" ); Console.WriteLine( "DRT:" ); foreach ( var drte in HpiIterators.Drt( sid ) ) { Console.WriteLine( " HPI Domain {0}: Is Peer {1}", drte.DomainId, drte.IsPeer ); } // DAT Console.WriteLine( "" ); Console.WriteLine( "DAT:" ); foreach( var a in HpiIterators.Dat( sid ) ) { Console.WriteLine( " Alarm {0}: {1}: {2}", a.AlarmId, HpiUtil.FromSaHpiSeverityT( a.Severity ), HpiUtil.FromSaHpiStatusCondTypeT( a.AlarmCond.Type ) ); } // DEL: Read backward Console.WriteLine( "" ); Console.WriteLine( "DEL: Newest entries first" ); foreach ( var ex in HpiIterators.EventLogEntries( sid, HpiConst.SAHPI_UNSPECIFIED_RESOURCE_ID, false ) ) { Console.WriteLine( " Entry {0}: {1}", ex.EventLogEntry.EntryId, HpiUtil.FromSaHpiEventTypeT( ex.EventLogEntry.Event.EventType ) ); } // Iterate over top-level entities Console.WriteLine( "" ); Console.WriteLine( "Top-level Entities:" ); SaHpiEntityPathT root = HpiUtil.MakeRootSaHpiEntityPathT(); foreach ( var child in HpiIterators.ChildEntities( sid, root ) ) { Console.WriteLine( " {0}", HpiUtil.FromSaHpiEntityPathT( child ) ); // Resources for the entity Console.WriteLine( " Resources:" ); foreach ( var rid in HpiIterators.EntityResourceIds( sid, child ) ) { Console.WriteLine( " Resource {0}", rid ); } // Sensors for the entity Console.WriteLine( " Sensors:" ); foreach ( var ri in HpiIterators.EntityInstrumentIds( sid, child, HpiConst.SAHPI_SENSOR_RDR ) ) { Console.WriteLine( " Resource {0} Sensor {1}", ri.ResourceId, ri.InstrumentId ); } } // RPT Console.WriteLine( "" ); Console.WriteLine( "RPT:" ); foreach ( var rpte in HpiIterators.Rpt( sid ) ) { Console.WriteLine( " Resource {0}: {1}: {2}", rpte.ResourceId, HpiUtil.FromSaHpiTextBufferT( rpte.ResourceTag ), HpiUtil.FromSaHpiEntityPathT( rpte.ResourceEntity ) ); } // RDRs Console.WriteLine( "" ); Console.WriteLine( "RDRs:" ); foreach ( var rpte in HpiIterators.Rpt( sid ) ) { Console.WriteLine( " Resource {0}:", rpte.ResourceId ); foreach ( var rdr in HpiIterators.Rdrs( sid, rpte.ResourceId ) ) { Console.WriteLine( " {0}: {1}", HpiUtil.FromSaHpiRdrTypeT( rdr.RdrType ), HpiUtil.FromSaHpiTextBufferT( rdr.IdString ) ); } } // IDR Areas (LINQ is used to select IDRs as an example) Console.WriteLine( "" ); Console.WriteLine( "IDRs:" ); var idrs = from rpte in HpiIterators.Rpt( sid ) from rdr in HpiIterators.Rdrs( sid, rpte.ResourceId ) where rdr.RdrType == HpiConst.SAHPI_INVENTORY_RDR select new { rid = rpte.ResourceId, idrid = rdr.RdrTypeUnion.InventoryRec.IdrId }; foreach ( var ri in idrs ) { Console.WriteLine( " Resource {0}: IDR {1}:", ri.rid, ri.idrid ); // IDR Areas foreach ( var ahdr in HpiIterators.IdrAreaHeaders( sid, ri.rid, ri.idrid ) ) { Console.WriteLine( " Area {0}: {1}", ahdr.AreaId, HpiUtil.FromSaHpiIdrAreaTypeT( ahdr.Type ) ); // IDR Fields foreach ( var f in HpiIterators.IdrAreaFields( sid, ri.rid, ri.idrid, ahdr.AreaId ) ) { Console.WriteLine( " Field {0}: {1}", f.FieldId, HpiUtil.FromSaHpiIdrFieldTypeT( f.Type ) ); } } } // Announcements in Annunciators (LINQ is used to select annunciators as an example) Console.WriteLine( "" ); Console.WriteLine( "Annunciators:" ); var anns = from rpte in HpiIterators.Rpt( sid ) from rdr in HpiIterators.Rdrs( sid, rpte.ResourceId ) where rdr.RdrType == HpiConst.SAHPI_ANNUNCIATOR_RDR select new { rid = rpte.ResourceId, annnum = rdr.RdrTypeUnion.AnnunciatorRec.AnnunciatorNum }; foreach ( var ri in anns ) { Console.WriteLine( " Resource {0}: Annunciator {1}:", ri.rid, ri.annnum ); // Announcements foreach ( var a in HpiIterators.Announcements( sid, ri.rid, ri.annnum ) ) { Console.WriteLine( " Announcement {0}: {1}: {2}", a.EntryId, HpiUtil.FromSaHpiSeverityT( a.Severity ), HpiUtil.FromSaHpiStatusCondTypeT( a.StatusCond.Type ) ); } } // FUMI (LINQ is used to select FUMIs with Logical Bank only as an example) Console.WriteLine( "" ); Console.WriteLine( "FUMIs:" ); var fumis = from rpte in HpiIterators.Rpt( sid ) from rdr in HpiIterators.Rdrs( sid, rpte.ResourceId ) where rdr.RdrType == HpiConst.SAHPI_FUMI_RDR where rdr.RdrTypeUnion.FumiRec.NumBanks == 0 select new { rid = rpte.ResourceId, fuminum = rdr.RdrTypeUnion.FumiRec.Num }; foreach ( var ri in fumis ) { Console.WriteLine( " Resource {0}: FUMI {1}:", ri.rid, ri.fuminum ); // Source components Console.WriteLine( " Source Components:" ); foreach ( var info in HpiIterators.FumiSourceComponents( sid, ri.rid, ri.fuminum, 0 ) ) { Console.WriteLine( " Component {0}: {1}: FW {2}.{3}.{4}", info.ComponentId, HpiUtil.FromSaHpiTextBufferT( info.MainFwInstance.Description ), info.MainFwInstance.MajorVersion, info.MainFwInstance.MinorVersion, info.MainFwInstance.AuxVersion ); } // Target components Console.WriteLine( " Target Components:" ); foreach ( var info in HpiIterators.FumiTargetComponents( sid, ri.rid, ri.fuminum, 0 ) ) { Console.WriteLine( " Component {0}: {1}: FW {2}.{3}.{4}", info.ComponentId, HpiUtil.FromSaHpiTextBufferT( info.MainFwInstance.Description ), info.MainFwInstance.MajorVersion, info.MainFwInstance.MinorVersion, info.MainFwInstance.AuxVersion ); } // Logical Target components Console.WriteLine( " Logical Target Components:" ); foreach ( var info in HpiIterators.FumiLogicalTargetComponents( sid, ri.rid, ri.fuminum ) ) { Console.WriteLine( " Component {0}:", info.ComponentId ); if ( info.PendingFwInstance.InstancePresent != HpiConst.SAHPI_FALSE ) { Console.WriteLine( " Pending FW {0}.{1}.{2}:", info.PendingFwInstance.MajorVersion, info.PendingFwInstance.MinorVersion, info.PendingFwInstance.AuxVersion ); } if ( info.RollbackFwInstance.InstancePresent != HpiConst.SAHPI_FALSE ) { Console.WriteLine( " Rollback FW {0}.{1}.{2}:", info.RollbackFwInstance.MajorVersion, info.RollbackFwInstance.MinorVersion, info.RollbackFwInstance.AuxVersion ); } } } rv = Api.saHpiSessionClose( sid ); if ( rv != HpiConst.SA_OK ) { Console.WriteLine( "Error: saHpiSessionClose: {0}", rv ); return; } } }; openhpi-3.6.1/baselibs/csharp/example_iterators.rsp0000644000175100017510000000013412575647300021503 0ustar mohanmohan/target:exe /out:example_iterators.exe /reference:openhpi_baselib.dll example_iterators.cs openhpi-3.6.1/baselibs/csharp/example.cs0000644000175100017510000000532312575647300017215 0ustar mohanmohan/* -*- c# -*- * * Copyright (C) 2012, Pigeon Point Systems * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ using System; using org.openhpi; class Example { public static void Main() { long version = Api.oHpiVersionGet(); Console.WriteLine( "OpenHPI baselib package version: 0x{0:X16}", version ); long rv; long did; long sid; rv = Api.oHpiDomainAdd( HpiUtil.ToSaHpiTextBufferT( "localhost" ), OhpiConst.DEFAULT_PORT, HpiUtil.MakeRootSaHpiEntityPathT(), out did ); if ( rv != HpiConst.SA_OK ) { Console.WriteLine( "Error: oHpiDomainAdd: {0}", rv ); return; } Console.WriteLine( "DID = {0}", did ); rv = Api.saHpiSessionOpen( did, out sid, null ); if ( rv != HpiConst.SA_OK ) { Console.WriteLine( "Error: saHpiSessionOpen: {0}", rv ); return; } Console.WriteLine( "SID = {0}", sid ); SaHpiEntityPathT my_ep; rv = Api.saHpiMyEntityPathGet( sid, out my_ep ); if ( rv == HpiConst.SA_OK ) { Console.WriteLine( "My entity: {0}", HpiUtil.FromSaHpiEntityPathT( my_ep ) ); } Console.WriteLine( "Resource List:" ); long eid = HpiConst.SAHPI_FIRST_ENTRY; long next_eid; SaHpiRptEntryT rpte; do { rv = Api.saHpiRptEntryGet( sid, eid, out next_eid, out rpte ); if ( ( eid == HpiConst.SAHPI_FIRST_ENTRY ) && ( rv == HpiConst.SA_ERR_HPI_NOT_PRESENT ) ) { break; } if ( rv != HpiConst.SA_OK ) { Console.WriteLine( "Error: saHpiRptEntryGet: {0}", rv ); return; } Console.WriteLine( " HPI Resource {0}: {1}: {2}", rpte.ResourceId, HpiUtil.FromSaHpiTextBufferT( rpte.ResourceTag ), HpiUtil.FromSaHpiEntityPathT( rpte.ResourceEntity ) ); eid = next_eid; } while ( eid != HpiConst.SAHPI_LAST_ENTRY ); rv = Api.saHpiSessionClose( sid ); if ( rv != HpiConst.SA_OK ) { Console.WriteLine( "Error: saHpiSessionClose: {0}", rv ); return; } Console.WriteLine( "End" ); } }; openhpi-3.6.1/baselibs/csharp/openhpi_baselib.rsp0000644000175100017510000000114512575647300021102 0ustar mohanmohan/target:library /out:openhpi_baselib.dll openhpi_baselib/AssemblyInfo.cs openhpi_baselib/Hpi.cs openhpi_baselib/HpiCore.cs openhpi_baselib/HpiDataTypesGen.cs openhpi_baselib/HpiDomain.cs openhpi_baselib/HpiException.cs openhpi_baselib/HpiGen.cs openhpi_baselib/HpiIterators.cs openhpi_baselib/HpiMarshalCore.cs openhpi_baselib/HpiMarshalGen.cs openhpi_baselib/HpiSession.cs openhpi_baselib/HpiTransport.cs openhpi_baselib/HpiUtil.cs openhpi_baselib/HpiUtilGen.cs openhpi_baselib/Ohpi.cs openhpi_baselib/OhpiDataTypes.cs openhpi_baselib/OhpiIterators.cs openhpi_baselib/OhpiMarshal.cs openhpi_baselib/OhpiUtil.cs openhpi-3.6.1/baselibs/csharp/README0000644000175100017510000001167012575647300016115 0ustar mohanmohan================================================================================ This is C# implementation of OpenHPI baselib. The implementation is an assembly named openhpi_baselib.dll. The implementation has been tested with Mono-2.10.8 and Visual C# 2008/2010. ================================================================================ Build and Install Instructions: With Mono: - Configure MCS and MONO(optional) paths in Makefile. - Run "make openhpi_baselib" With Visual C#: - Create assembly project - Include all .cs files from openhpi_baselib dir to the project - Set output assembly name to "openhpi_baselib" - Build the project ================================================================================ Usage Example: See example.cs as an example of using the C# OpenHPI baselib. Run "make example" to compile it. See example_iterators.cs as an example of using the C# OpenHPI iterators. See example_handlers.cs as an example of using the oHpiHandler*() API. Default domain address is "localhost" or OPENHPI_DAEMON_HOST env. var. value. Default domain address is 4743 or OPENHPI_DAEMON_PORT env. var. value. ================================================================================ Datatypes and API Representation: All SAF HPI integer data types: - SaHpiBoolT, SaHpiUint8(16,32,64)T, SaHpiInt8(16,32,64)T, enum types are mapped to C# long type. One exception: arrays of SaHpiUint8T are mapped to C# byte[] type. Every SAF HPI struct or union is mapped to C# class. The class name is the same as for the corresponding SAF HPI struct or union. The class contais only public fields with the same names as the corresponding SAF HPI struct or union fields have. SAF HPI constants are defined in the HpiConst class. OpenHPI-specific constants are defined in the OHpiConst class. SAF HPI API and OpenHPI API are defined in the Api class. API parameters are mapped as the following: - SAHPI_IN parameter is mapped to the ordinary C# function parameter. - SAHPI_INOUT parameter is mapped to ref C# function parameter. - SAHPI_OUT or SAHPI_OUTNN parameter is mapped to out C# function parameter. So there is no need for user to allocate memory for output parameters. Example: SaErrorT SAHPI_API saHpiGetIdByEntityPath ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiEntityPathT EntityPath, SAHPI_IN SaHpiRdrTypeT InstrumentType, SAHPI_INOUT SaHpiUint32T *InstanceId, SAHPI_OUT SaHpiResourceIdT *ResourceId, SAHPI_OUT SaHpiInstrumentIdT *InstrumentId, SAHPI_OUT SaHpiUint32T *RptUpdateCount ); is represented as public static long saHpiGetIdByEntityPath( long SessionId, SaHpiEntityPathT EntityPath, long InstrumentType, ref long InstanceId, out long ResourceId, out long InstrumentId, out long RptUpdateCount ) ================================================================================ Utilities: HpiUtil class provides the following utility functions: - Set of functions for checking validity of an object of a complex HPI data type X (representation of SAF HPI struct X): -- public static bool Check( X x ) --- The validation checks are: ---- x is not null ---- Any member of x that is of a complex data types is valid ---- If a member of x is a SaHpiUint8T[] array then the array length is valid. - Set of functions for checking validity of an object of a complex HPI data type X (representation of SAF HPI union X): -- public static bool Check( X x, long mod ) ---- x is not null ---- A member of x that matches modifier mod and is of a complex data types is valid ---- If a member of x that matches modifier mod is a SaHpiUint8T[] array then the array length is valid. - For string <-> integer HPI Data Type X conversion: -- public static string FromX( long x ) - (for example FromSaHpiEventCategoryT) -- public static long ToX( string s ) - (for example ToSaHpiEventCategoryT) - For string <-> complex HPI Data Type conversion: -- public static string FromSaHpiTextBufferT( SaHpiTextBufferT tb ) -- public static SaHpiTextBufferT ToSaHpiTextBufferT( string s ) -- public static string FromSaHpiEntityPathT( SaHpiEntityPathT ep ) -- public static SaHpiEntityPathT ToSaHpiEntityPathT( string s ) - For making unspecified, empty entity path and for entity path cloning: - public static SaHpiEntityPathT MakeUnspecifiedSaHpiEntityPathT() - public static SaHpiEntityPathT MakeRootSaHpiEntityPathT() - public static SaHpiEntityPathT CloneSaHpiEntityPathT( SaHpiEntityPathT ep ) ================================================================================ Current Limitations: - Only oHpiVersionGet(), oHpiDomainAdd() and oHpiHandler*() OpenHPI API are supported - openhpiclient.conf is not supported ================================================================================ TODO List: - Implemented openhpiclient.conf support - Implement the rest of OpenHPI API - Domain ID translation for SAF HPI API - Entity root translation for SAF HPI API - XTCA entity types in HpiUtils openhpi-3.6.1/baselibs/csharp/example.rsp0000644000175100017510000000011012575647300017401 0ustar mohanmohan/target:exe /out:example.exe /reference:openhpi_baselib.dll example.cs openhpi-3.6.1/baselibs/csharp/example_handlers.rsp0000644000175100017510000000013212575647300021265 0ustar mohanmohan/target:exe /out:example_handlers.exe /reference:openhpi_baselib.dll example_handlers.cs openhpi-3.6.1/baselibs/csharp/openhpi_baselib/0000755000175100017510000000000012575650556020362 5ustar mohanmohanopenhpi-3.6.1/baselibs/csharp/openhpi_baselib/Ohpi.cs0000644000175100017510000001673012575647300021610 0ustar mohanmohan/* -*- c# -*- * * Copyright (C) 2012, Pigeon Point Systems * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ using System; using System.Reflection; namespace org { namespace openhpi { /********************************************************** * OHPI API (NB: Partly implemented) *********************************************************/ // TODO Implement the rest of OHPI API public static partial class Api { public static long oHpiVersionGet() { Version v = Assembly.GetExecutingAssembly().GetName().Version; long vmajor = unchecked( (ushort)( v.Major & 0xFFFF ) ); long vminor = unchecked( (ushort)( v.Minor & 0xFFFF ) ); long vaux = unchecked( (ushort)( v.Build & 0xFFFF ) ); return ( vmajor << 48 ) | ( vminor << 32 ) | ( vaux << 16 ); } public static long oHpiDomainAdd( SaHpiTextBufferT Host, int Port, SaHpiEntityPathT EntityRoot, out long DomainId ) { DomainId = 0; string s = HpiUtil.FromSaHpiTextBufferT( Host ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_PARAMS; } HpiDomain d = HpiCore.CreateDomain( s, Port, EntityRoot ); if ( d == null ) { return HpiConst.SA_ERR_HPI_INTERNAL_ERROR; } DomainId = d.GetLocalDid(); return HpiConst.SA_OK; } public static long oHpiHandlerCreate( long SessionId, oHpiHandlerConfigT HandlerConfig, out long HandlerId ) { long rv; bool rc; HandlerId = HpiConst.SAHPI_LAST_ENTRY; rc = OhpiUtil.Check( HandlerConfig ); if ( !rc ) { return HpiConst.SA_ERR_HPI_INVALID_PARAMS; } HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshaloHpiHandlerConfigT( HandlerConfig ); rc = m.Interchange( OhpiConst.RPC_OHPI_HANDLER_CREATE ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { HandlerId = m.DemarshaloHpiHandlerIdT(); } s.PutMarshal( m ); return rv; } public static long oHpiHandlerDestroy( long SessionId, long HandlerId ) { long rv; bool rc; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshaloHpiHandlerIdT( HandlerId ); rc = m.Interchange( OhpiConst.RPC_OHPI_HANDLER_DESTROY ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); return rv; } public static long oHpiHandlerInfo( long SessionId, long HandlerId, out oHpiHandlerInfoT HandlerInfo, out oHpiHandlerConfigT HandlerConfig ) { long rv; bool rc; HandlerInfo = null; HandlerConfig = null; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshaloHpiHandlerIdT( HandlerId ); rc = m.Interchange( OhpiConst.RPC_OHPI_HANDLER_INFO ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { HandlerInfo = m.DemarshaloHpiHandlerInfoT(); HandlerConfig = m.DemarshaloHpiHandlerConfigT(); } s.PutMarshal( m ); return rv; } public static long oHpiHandlerGetNext( long SessionId, long HandlerId, out long NextHandlerId ) { long rv; bool rc; NextHandlerId = HpiConst.SAHPI_LAST_ENTRY; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshaloHpiHandlerIdT( HandlerId ); rc = m.Interchange( OhpiConst.RPC_OHPI_HANDLER_GET_NEXT ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { NextHandlerId = m.DemarshaloHpiHandlerIdT(); } s.PutMarshal( m ); return rv; } public static long oHpiHandlerFind( long SessionId, long ResourceId, out long HandlerId ) { long rv; bool rc; HandlerId = HpiConst.SAHPI_LAST_ENTRY; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); rc = m.Interchange( OhpiConst.RPC_OHPI_HANDLER_FIND ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { HandlerId = m.DemarshaloHpiHandlerIdT(); } s.PutMarshal( m ); return rv; } public static long oHpiHandlerRetry( long SessionId, long HandlerId ) { long rv; bool rc; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshaloHpiHandlerIdT( HandlerId ); rc = m.Interchange( OhpiConst.RPC_OHPI_HANDLER_RETRY ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); return rv; } }; }; // namespace openhpi }; // namespace org openhpi-3.6.1/baselibs/csharp/openhpi_baselib/AssemblyInfo.cs0000644000175100017510000000160112575647300023273 0ustar mohanmohan/* -*- c# -*- * * Copyright (C) 2012, Pigeon Point Systems * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ using System; using System.Reflection; [assembly: CLSCompliant( true )] [assembly: AssemblyCopyright( "Pigeon Point Systems" )] [assembly: AssemblyTrademark( "" )] [assembly: AssemblyTitle( "OpenHPI Base Library For .NET" )] [assembly: AssemblyDescription( "OpenHPI Base Library For .NET" )] [assembly: AssemblyProduct( "OpenHPI" )] [assembly: AssemblyVersion( "3.6.1.0" )] [assembly: AssemblyCulture( "" )] openhpi-3.6.1/baselibs/csharp/openhpi_baselib/HpiGen.cs0000644000175100017510000035007712575647300022070 0ustar mohanmohan/* -*- c# -*- * * Copyright (C) 2012, Pigeon Point Systems * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ using System; namespace org { namespace openhpi { /********************************************************** * HPI API (auto-generated) *********************************************************/ public static partial class Api { public static long saHpiVersionGet() { return HpiConst.SAHPI_INTERFACE_VERSION; } public static long saHpiDiscover( long SessionId ) { long rv; bool rc; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); rc = m.Interchange( OhpiConst.RPC_SAHPI_DISCOVER ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); return rv; } public static long saHpiDomainInfoGet( long SessionId, out SaHpiDomainInfoT DomainInfo ) { long rv; bool rc; DomainInfo = null; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); rc = m.Interchange( OhpiConst.RPC_SAHPI_DOMAIN_INFO_GET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { DomainInfo = m.DemarshalSaHpiDomainInfoT(); } s.PutMarshal( m ); return rv; } public static long saHpiDrtEntryGet( long SessionId, long EntryId, out long NextEntryId, out SaHpiDrtEntryT DrtEntry ) { long rv; bool rc; NextEntryId = 0; DrtEntry = null; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiEntryIdT( EntryId ); rc = m.Interchange( OhpiConst.RPC_SAHPI_DRT_ENTRY_GET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { NextEntryId = m.DemarshalSaHpiEntryIdT(); DrtEntry = m.DemarshalSaHpiDrtEntryT(); } s.PutMarshal( m ); return rv; } public static long saHpiDomainTagSet( long SessionId, SaHpiTextBufferT DomainTag ) { long rv; bool rc; rc = HpiUtil.Check( DomainTag ); if ( !rc ) { return HpiConst.SA_ERR_HPI_INVALID_PARAMS; } HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiTextBufferT( DomainTag ); rc = m.Interchange( OhpiConst.RPC_SAHPI_DOMAIN_TAG_SET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); return rv; } public static long saHpiRptEntryGet( long SessionId, long EntryId, out long NextEntryId, out SaHpiRptEntryT RptEntry ) { long rv; bool rc; NextEntryId = 0; RptEntry = null; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiEntryIdT( EntryId ); rc = m.Interchange( OhpiConst.RPC_SAHPI_RPT_ENTRY_GET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { NextEntryId = m.DemarshalSaHpiEntryIdT(); RptEntry = m.DemarshalSaHpiRptEntryT(); } s.PutMarshal( m ); return rv; } public static long saHpiRptEntryGetByResourceId( long SessionId, long ResourceId, out SaHpiRptEntryT RptEntry ) { long rv; bool rc; RptEntry = null; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); rc = m.Interchange( OhpiConst.RPC_SAHPI_RPT_ENTRY_GET_BY_RESOURCE_ID ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { RptEntry = m.DemarshalSaHpiRptEntryT(); } s.PutMarshal( m ); return rv; } public static long saHpiResourceSeveritySet( long SessionId, long ResourceId, long Severity ) { long rv; bool rc; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiSeverityT( Severity ); rc = m.Interchange( OhpiConst.RPC_SAHPI_RESOURCE_SEVERITY_SET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); return rv; } public static long saHpiResourceTagSet( long SessionId, long ResourceId, SaHpiTextBufferT ResourceTag ) { long rv; bool rc; rc = HpiUtil.Check( ResourceTag ); if ( !rc ) { return HpiConst.SA_ERR_HPI_INVALID_PARAMS; } HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiTextBufferT( ResourceTag ); rc = m.Interchange( OhpiConst.RPC_SAHPI_RESOURCE_TAG_SET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); return rv; } public static long saHpiGetIdByEntityPath( long SessionId, SaHpiEntityPathT EntityPath, long InstrumentType, ref long InstanceId, out long ResourceId, out long InstrumentId, out long RptUpdateCount ) { long rv; bool rc; ResourceId = 0; InstrumentId = 0; RptUpdateCount = 0; rc = HpiUtil.Check( EntityPath ); if ( !rc ) { return HpiConst.SA_ERR_HPI_INVALID_PARAMS; } HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiEntityPathT( EntityPath ); m.MarshalSaHpiRdrTypeT( InstrumentType ); m.MarshalSaHpiUint32T( InstanceId ); rc = m.Interchange( OhpiConst.RPC_SAHPI_GET_ID_BY_ENTITY_PATH ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { InstanceId = m.DemarshalSaHpiUint32T(); ResourceId = m.DemarshalSaHpiResourceIdT(); InstrumentId = m.DemarshalSaHpiInstrumentIdT(); RptUpdateCount = m.DemarshalSaHpiUint32T(); } s.PutMarshal( m ); return rv; } public static long saHpiGetChildEntityPath( long SessionId, SaHpiEntityPathT ParentEntityPath, ref long InstanceId, out SaHpiEntityPathT ChildEntityPath, out long RptUpdateCount ) { long rv; bool rc; ChildEntityPath = null; RptUpdateCount = 0; rc = HpiUtil.Check( ParentEntityPath ); if ( !rc ) { return HpiConst.SA_ERR_HPI_INVALID_PARAMS; } HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiEntityPathT( ParentEntityPath ); m.MarshalSaHpiUint32T( InstanceId ); rc = m.Interchange( OhpiConst.RPC_SAHPI_GET_CHILD_ENTITY_PATH ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { InstanceId = m.DemarshalSaHpiUint32T(); ChildEntityPath = m.DemarshalSaHpiEntityPathT(); RptUpdateCount = m.DemarshalSaHpiUint32T(); } s.PutMarshal( m ); return rv; } public static long saHpiResourceFailedRemove( long SessionId, long ResourceId ) { long rv; bool rc; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); rc = m.Interchange( OhpiConst.RPC_SAHPI_RESOURCE_FAILED_REMOVE ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); return rv; } public static long saHpiEventLogInfoGet( long SessionId, long ResourceId, out SaHpiEventLogInfoT Info ) { long rv; bool rc; Info = null; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); rc = m.Interchange( OhpiConst.RPC_SAHPI_EVENT_LOG_INFO_GET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { Info = m.DemarshalSaHpiEventLogInfoT(); } s.PutMarshal( m ); return rv; } public static long saHpiEventLogCapabilitiesGet( long SessionId, long ResourceId, out long EventLogCapabilities ) { long rv; bool rc; EventLogCapabilities = 0; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); rc = m.Interchange( OhpiConst.RPC_SAHPI_EVENT_LOG_CAPABILITIES_GET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { EventLogCapabilities = m.DemarshalSaHpiEventLogCapabilitiesT(); } s.PutMarshal( m ); return rv; } public static long saHpiEventLogEntryGet( long SessionId, long ResourceId, long EntryId, out long PrevEntryId, out long NextEntryId, out SaHpiEventLogEntryT EventLogEntry, out SaHpiRdrT Rdr, out SaHpiRptEntryT RptEntry ) { long rv; bool rc; PrevEntryId = 0; NextEntryId = 0; EventLogEntry = null; Rdr = null; RptEntry = null; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiEventLogEntryIdT( EntryId ); rc = m.Interchange( OhpiConst.RPC_SAHPI_EVENT_LOG_ENTRY_GET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { PrevEntryId = m.DemarshalSaHpiEventLogEntryIdT(); NextEntryId = m.DemarshalSaHpiEventLogEntryIdT(); EventLogEntry = m.DemarshalSaHpiEventLogEntryT(); Rdr = m.DemarshalSaHpiRdrT(); RptEntry = m.DemarshalSaHpiRptEntryT(); } s.PutMarshal( m ); return rv; } public static long saHpiEventLogEntryAdd( long SessionId, long ResourceId, SaHpiEventT EvtEntry ) { long rv; bool rc; rc = HpiUtil.Check( EvtEntry ); if ( !rc ) { return HpiConst.SA_ERR_HPI_INVALID_PARAMS; } HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiEventT( EvtEntry ); rc = m.Interchange( OhpiConst.RPC_SAHPI_EVENT_LOG_ENTRY_ADD ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); return rv; } public static long saHpiEventLogClear( long SessionId, long ResourceId ) { long rv; bool rc; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); rc = m.Interchange( OhpiConst.RPC_SAHPI_EVENT_LOG_CLEAR ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); return rv; } public static long saHpiEventLogTimeGet( long SessionId, long ResourceId, out long Time ) { long rv; bool rc; Time = 0; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); rc = m.Interchange( OhpiConst.RPC_SAHPI_EVENT_LOG_TIME_GET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { Time = m.DemarshalSaHpiTimeT(); } s.PutMarshal( m ); return rv; } public static long saHpiEventLogTimeSet( long SessionId, long ResourceId, long Time ) { long rv; bool rc; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiTimeT( Time ); rc = m.Interchange( OhpiConst.RPC_SAHPI_EVENT_LOG_TIME_SET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); return rv; } public static long saHpiEventLogStateGet( long SessionId, long ResourceId, out long EnableState ) { long rv; bool rc; EnableState = 0; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); rc = m.Interchange( OhpiConst.RPC_SAHPI_EVENT_LOG_STATE_GET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { EnableState = m.DemarshalSaHpiBoolT(); } s.PutMarshal( m ); return rv; } public static long saHpiEventLogStateSet( long SessionId, long ResourceId, long EnableState ) { long rv; bool rc; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiBoolT( EnableState ); rc = m.Interchange( OhpiConst.RPC_SAHPI_EVENT_LOG_STATE_SET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); return rv; } public static long saHpiEventLogOverflowReset( long SessionId, long ResourceId ) { long rv; bool rc; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); rc = m.Interchange( OhpiConst.RPC_SAHPI_EVENT_LOG_OVERFLOW_RESET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); return rv; } public static long saHpiSubscribe( long SessionId ) { long rv; bool rc; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); rc = m.Interchange( OhpiConst.RPC_SAHPI_SUBSCRIBE ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); return rv; } public static long saHpiUnsubscribe( long SessionId ) { long rv; bool rc; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); rc = m.Interchange( OhpiConst.RPC_SAHPI_UNSUBSCRIBE ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); return rv; } public static long saHpiEventGet( long SessionId, long Timeout, out SaHpiEventT Event, out SaHpiRdrT Rdr, out SaHpiRptEntryT RptEntry, out long EventQueueStatus ) { long rv; bool rc; Event = null; Rdr = null; RptEntry = null; EventQueueStatus = 0; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiTimeoutT( Timeout ); rc = m.Interchange( OhpiConst.RPC_SAHPI_EVENT_GET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { Event = m.DemarshalSaHpiEventT(); Rdr = m.DemarshalSaHpiRdrT(); RptEntry = m.DemarshalSaHpiRptEntryT(); EventQueueStatus = m.DemarshalSaHpiEvtQueueStatusT(); } s.PutMarshal( m ); return rv; } public static long saHpiEventAdd( long SessionId, SaHpiEventT EvtEntry ) { long rv; bool rc; rc = HpiUtil.Check( EvtEntry ); if ( !rc ) { return HpiConst.SA_ERR_HPI_INVALID_PARAMS; } HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiEventT( EvtEntry ); rc = m.Interchange( OhpiConst.RPC_SAHPI_EVENT_ADD ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); return rv; } public static long saHpiAlarmGetNext( long SessionId, long Severity, long UnacknowledgedOnly, ref SaHpiAlarmT Alarm ) { long rv; bool rc; rc = HpiUtil.Check( Alarm ); if ( !rc ) { return HpiConst.SA_ERR_HPI_INVALID_PARAMS; } HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiSeverityT( Severity ); m.MarshalSaHpiBoolT( UnacknowledgedOnly ); m.MarshalSaHpiAlarmT( Alarm ); rc = m.Interchange( OhpiConst.RPC_SAHPI_ALARM_GET_NEXT ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { Alarm = m.DemarshalSaHpiAlarmT(); } s.PutMarshal( m ); return rv; } public static long saHpiAlarmGet( long SessionId, long AlarmId, out SaHpiAlarmT Alarm ) { long rv; bool rc; Alarm = null; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiAlarmIdT( AlarmId ); rc = m.Interchange( OhpiConst.RPC_SAHPI_ALARM_GET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { Alarm = m.DemarshalSaHpiAlarmT(); } s.PutMarshal( m ); return rv; } public static long saHpiAlarmAcknowledge( long SessionId, long AlarmId, long Severity ) { long rv; bool rc; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiAlarmIdT( AlarmId ); m.MarshalSaHpiSeverityT( Severity ); rc = m.Interchange( OhpiConst.RPC_SAHPI_ALARM_ACKNOWLEDGE ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); return rv; } public static long saHpiAlarmAdd( long SessionId, ref SaHpiAlarmT Alarm ) { long rv; bool rc; rc = HpiUtil.Check( Alarm ); if ( !rc ) { return HpiConst.SA_ERR_HPI_INVALID_PARAMS; } HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiAlarmT( Alarm ); rc = m.Interchange( OhpiConst.RPC_SAHPI_ALARM_ADD ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { Alarm = m.DemarshalSaHpiAlarmT(); } s.PutMarshal( m ); return rv; } public static long saHpiAlarmDelete( long SessionId, long AlarmId, long Severity ) { long rv; bool rc; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiAlarmIdT( AlarmId ); m.MarshalSaHpiSeverityT( Severity ); rc = m.Interchange( OhpiConst.RPC_SAHPI_ALARM_DELETE ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); return rv; } public static long saHpiRdrGet( long SessionId, long ResourceId, long EntryId, out long NextEntryId, out SaHpiRdrT Rdr ) { long rv; bool rc; NextEntryId = 0; Rdr = null; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiEntryIdT( EntryId ); rc = m.Interchange( OhpiConst.RPC_SAHPI_RDR_GET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { NextEntryId = m.DemarshalSaHpiEntryIdT(); Rdr = m.DemarshalSaHpiRdrT(); } s.PutMarshal( m ); return rv; } public static long saHpiRdrGetByInstrumentId( long SessionId, long ResourceId, long RdrType, long InstrumentId, out SaHpiRdrT Rdr ) { long rv; bool rc; Rdr = null; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiRdrTypeT( RdrType ); m.MarshalSaHpiInstrumentIdT( InstrumentId ); rc = m.Interchange( OhpiConst.RPC_SAHPI_RDR_GET_BY_INSTRUMENT_ID ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { Rdr = m.DemarshalSaHpiRdrT(); } s.PutMarshal( m ); return rv; } public static long saHpiRdrUpdateCountGet( long SessionId, long ResourceId, out long UpdateCount ) { long rv; bool rc; UpdateCount = 0; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); rc = m.Interchange( OhpiConst.RPC_SAHPI_RDR_UPDATE_COUNT_GET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { UpdateCount = m.DemarshalSaHpiUint32T(); } s.PutMarshal( m ); return rv; } public static long saHpiSensorReadingGet( long SessionId, long ResourceId, long SensorNum, out SaHpiSensorReadingT Reading, out long EventState ) { long rv; bool rc; Reading = null; EventState = 0; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiSensorNumT( SensorNum ); rc = m.Interchange( OhpiConst.RPC_SAHPI_SENSOR_READING_GET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { Reading = m.DemarshalSaHpiSensorReadingT(); EventState = m.DemarshalSaHpiEventStateT(); } s.PutMarshal( m ); return rv; } public static long saHpiSensorThresholdsGet( long SessionId, long ResourceId, long SensorNum, out SaHpiSensorThresholdsT SensorThresholds ) { long rv; bool rc; SensorThresholds = null; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiSensorNumT( SensorNum ); rc = m.Interchange( OhpiConst.RPC_SAHPI_SENSOR_THRESHOLDS_GET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { SensorThresholds = m.DemarshalSaHpiSensorThresholdsT(); } s.PutMarshal( m ); return rv; } public static long saHpiSensorThresholdsSet( long SessionId, long ResourceId, long SensorNum, SaHpiSensorThresholdsT SensorThresholds ) { long rv; bool rc; rc = HpiUtil.Check( SensorThresholds ); if ( !rc ) { return HpiConst.SA_ERR_HPI_INVALID_PARAMS; } HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiSensorNumT( SensorNum ); m.MarshalSaHpiSensorThresholdsT( SensorThresholds ); rc = m.Interchange( OhpiConst.RPC_SAHPI_SENSOR_THRESHOLDS_SET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); return rv; } public static long saHpiSensorTypeGet( long SessionId, long ResourceId, long SensorNum, out long Type, out long Category ) { long rv; bool rc; Type = 0; Category = 0; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiSensorNumT( SensorNum ); rc = m.Interchange( OhpiConst.RPC_SAHPI_SENSOR_TYPE_GET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { Type = m.DemarshalSaHpiSensorTypeT(); Category = m.DemarshalSaHpiEventCategoryT(); } s.PutMarshal( m ); return rv; } public static long saHpiSensorEnableGet( long SessionId, long ResourceId, long SensorNum, out long SensorEnabled ) { long rv; bool rc; SensorEnabled = 0; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiSensorNumT( SensorNum ); rc = m.Interchange( OhpiConst.RPC_SAHPI_SENSOR_ENABLE_GET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { SensorEnabled = m.DemarshalSaHpiBoolT(); } s.PutMarshal( m ); return rv; } public static long saHpiSensorEnableSet( long SessionId, long ResourceId, long SensorNum, long SensorEnabled ) { long rv; bool rc; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiSensorNumT( SensorNum ); m.MarshalSaHpiBoolT( SensorEnabled ); rc = m.Interchange( OhpiConst.RPC_SAHPI_SENSOR_ENABLE_SET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); return rv; } public static long saHpiSensorEventEnableGet( long SessionId, long ResourceId, long SensorNum, out long SensorEventsEnabled ) { long rv; bool rc; SensorEventsEnabled = 0; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiSensorNumT( SensorNum ); rc = m.Interchange( OhpiConst.RPC_SAHPI_SENSOR_EVENT_ENABLE_GET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { SensorEventsEnabled = m.DemarshalSaHpiBoolT(); } s.PutMarshal( m ); return rv; } public static long saHpiSensorEventEnableSet( long SessionId, long ResourceId, long SensorNum, long SensorEventsEnabled ) { long rv; bool rc; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiSensorNumT( SensorNum ); m.MarshalSaHpiBoolT( SensorEventsEnabled ); rc = m.Interchange( OhpiConst.RPC_SAHPI_SENSOR_EVENT_ENABLE_SET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); return rv; } public static long saHpiSensorEventMasksGet( long SessionId, long ResourceId, long SensorNum, out long AssertEventMask, out long DeassertEventMask ) { long rv; bool rc; AssertEventMask = 0; DeassertEventMask = 0; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiSensorNumT( SensorNum ); rc = m.Interchange( OhpiConst.RPC_SAHPI_SENSOR_EVENT_MASKS_GET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { AssertEventMask = m.DemarshalSaHpiEventStateT(); DeassertEventMask = m.DemarshalSaHpiEventStateT(); } s.PutMarshal( m ); return rv; } public static long saHpiSensorEventMasksSet( long SessionId, long ResourceId, long SensorNum, long Action, long AssertEventMask, long DeassertEventMask ) { long rv; bool rc; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiSensorNumT( SensorNum ); m.MarshalSaHpiSensorEventMaskActionT( Action ); m.MarshalSaHpiEventStateT( AssertEventMask ); m.MarshalSaHpiEventStateT( DeassertEventMask ); rc = m.Interchange( OhpiConst.RPC_SAHPI_SENSOR_EVENT_MASKS_SET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); return rv; } public static long saHpiControlTypeGet( long SessionId, long ResourceId, long CtrlNum, out long Type ) { long rv; bool rc; Type = 0; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiCtrlNumT( CtrlNum ); rc = m.Interchange( OhpiConst.RPC_SAHPI_CONTROL_TYPE_GET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { Type = m.DemarshalSaHpiCtrlTypeT(); } s.PutMarshal( m ); return rv; } public static long saHpiControlGet( long SessionId, long ResourceId, long CtrlNum, out long CtrlMode, ref SaHpiCtrlStateT CtrlState ) { long rv; bool rc; CtrlMode = 0; rc = HpiUtil.Check( CtrlState ); if ( !rc ) { return HpiConst.SA_ERR_HPI_INVALID_PARAMS; } HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiCtrlNumT( CtrlNum ); m.MarshalSaHpiCtrlStateT( CtrlState ); rc = m.Interchange( OhpiConst.RPC_SAHPI_CONTROL_GET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { CtrlMode = m.DemarshalSaHpiCtrlModeT(); CtrlState = m.DemarshalSaHpiCtrlStateT(); } s.PutMarshal( m ); return rv; } public static long saHpiControlSet( long SessionId, long ResourceId, long CtrlNum, long CtrlMode, SaHpiCtrlStateT CtrlState ) { long rv; bool rc; rc = HpiUtil.Check( CtrlState ); if ( !rc ) { return HpiConst.SA_ERR_HPI_INVALID_PARAMS; } HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiCtrlNumT( CtrlNum ); m.MarshalSaHpiCtrlModeT( CtrlMode ); m.MarshalSaHpiCtrlStateT( CtrlState ); rc = m.Interchange( OhpiConst.RPC_SAHPI_CONTROL_SET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); return rv; } public static long saHpiIdrInfoGet( long SessionId, long ResourceId, long IdrId, out SaHpiIdrInfoT IdrInfo ) { long rv; bool rc; IdrInfo = null; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiIdrIdT( IdrId ); rc = m.Interchange( OhpiConst.RPC_SAHPI_IDR_INFO_GET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { IdrInfo = m.DemarshalSaHpiIdrInfoT(); } s.PutMarshal( m ); return rv; } public static long saHpiIdrAreaHeaderGet( long SessionId, long ResourceId, long IdrId, long AreaType, long AreaId, out long NextAreaId, out SaHpiIdrAreaHeaderT Header ) { long rv; bool rc; NextAreaId = 0; Header = null; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiIdrIdT( IdrId ); m.MarshalSaHpiIdrAreaTypeT( AreaType ); m.MarshalSaHpiEntryIdT( AreaId ); rc = m.Interchange( OhpiConst.RPC_SAHPI_IDR_AREA_HEADER_GET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { NextAreaId = m.DemarshalSaHpiEntryIdT(); Header = m.DemarshalSaHpiIdrAreaHeaderT(); } s.PutMarshal( m ); return rv; } public static long saHpiIdrAreaAdd( long SessionId, long ResourceId, long IdrId, long AreaType, out long AreaId ) { long rv; bool rc; AreaId = 0; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiIdrIdT( IdrId ); m.MarshalSaHpiIdrAreaTypeT( AreaType ); rc = m.Interchange( OhpiConst.RPC_SAHPI_IDR_AREA_ADD ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { AreaId = m.DemarshalSaHpiEntryIdT(); } s.PutMarshal( m ); return rv; } public static long saHpiIdrAreaAddById( long SessionId, long ResourceId, long IdrId, long AreaType, long AreaId ) { long rv; bool rc; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiIdrIdT( IdrId ); m.MarshalSaHpiIdrAreaTypeT( AreaType ); m.MarshalSaHpiEntryIdT( AreaId ); rc = m.Interchange( OhpiConst.RPC_SAHPI_IDR_AREA_ADD_BY_ID ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); return rv; } public static long saHpiIdrAreaDelete( long SessionId, long ResourceId, long IdrId, long AreaId ) { long rv; bool rc; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiIdrIdT( IdrId ); m.MarshalSaHpiEntryIdT( AreaId ); rc = m.Interchange( OhpiConst.RPC_SAHPI_IDR_AREA_DELETE ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); return rv; } public static long saHpiIdrFieldGet( long SessionId, long ResourceId, long IdrId, long AreaId, long FieldType, long FieldId, out long NextFieldId, out SaHpiIdrFieldT Field ) { long rv; bool rc; NextFieldId = 0; Field = null; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiIdrIdT( IdrId ); m.MarshalSaHpiEntryIdT( AreaId ); m.MarshalSaHpiIdrFieldTypeT( FieldType ); m.MarshalSaHpiEntryIdT( FieldId ); rc = m.Interchange( OhpiConst.RPC_SAHPI_IDR_FIELD_GET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { NextFieldId = m.DemarshalSaHpiEntryIdT(); Field = m.DemarshalSaHpiIdrFieldT(); } s.PutMarshal( m ); return rv; } public static long saHpiIdrFieldAdd( long SessionId, long ResourceId, long IdrId, ref SaHpiIdrFieldT Field ) { long rv; bool rc; rc = HpiUtil.Check( Field ); if ( !rc ) { return HpiConst.SA_ERR_HPI_INVALID_PARAMS; } HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiIdrIdT( IdrId ); m.MarshalSaHpiIdrFieldT( Field ); rc = m.Interchange( OhpiConst.RPC_SAHPI_IDR_FIELD_ADD ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { Field = m.DemarshalSaHpiIdrFieldT(); } s.PutMarshal( m ); return rv; } public static long saHpiIdrFieldAddById( long SessionId, long ResourceId, long IdrId, SaHpiIdrFieldT Field ) { long rv; bool rc; rc = HpiUtil.Check( Field ); if ( !rc ) { return HpiConst.SA_ERR_HPI_INVALID_PARAMS; } HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiIdrIdT( IdrId ); m.MarshalSaHpiIdrFieldT( Field ); rc = m.Interchange( OhpiConst.RPC_SAHPI_IDR_FIELD_ADD_BY_ID ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); return rv; } public static long saHpiIdrFieldSet( long SessionId, long ResourceId, long IdrId, SaHpiIdrFieldT Field ) { long rv; bool rc; rc = HpiUtil.Check( Field ); if ( !rc ) { return HpiConst.SA_ERR_HPI_INVALID_PARAMS; } HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiIdrIdT( IdrId ); m.MarshalSaHpiIdrFieldT( Field ); rc = m.Interchange( OhpiConst.RPC_SAHPI_IDR_FIELD_SET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); return rv; } public static long saHpiIdrFieldDelete( long SessionId, long ResourceId, long IdrId, long AreaId, long FieldId ) { long rv; bool rc; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiIdrIdT( IdrId ); m.MarshalSaHpiEntryIdT( AreaId ); m.MarshalSaHpiEntryIdT( FieldId ); rc = m.Interchange( OhpiConst.RPC_SAHPI_IDR_FIELD_DELETE ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); return rv; } public static long saHpiWatchdogTimerGet( long SessionId, long ResourceId, long WatchdogNum, out SaHpiWatchdogT Watchdog ) { long rv; bool rc; Watchdog = null; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiWatchdogNumT( WatchdogNum ); rc = m.Interchange( OhpiConst.RPC_SAHPI_WATCHDOG_TIMER_GET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { Watchdog = m.DemarshalSaHpiWatchdogT(); } s.PutMarshal( m ); return rv; } public static long saHpiWatchdogTimerSet( long SessionId, long ResourceId, long WatchdogNum, SaHpiWatchdogT Watchdog ) { long rv; bool rc; rc = HpiUtil.Check( Watchdog ); if ( !rc ) { return HpiConst.SA_ERR_HPI_INVALID_PARAMS; } HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiWatchdogNumT( WatchdogNum ); m.MarshalSaHpiWatchdogT( Watchdog ); rc = m.Interchange( OhpiConst.RPC_SAHPI_WATCHDOG_TIMER_SET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); return rv; } public static long saHpiWatchdogTimerReset( long SessionId, long ResourceId, long WatchdogNum ) { long rv; bool rc; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiWatchdogNumT( WatchdogNum ); rc = m.Interchange( OhpiConst.RPC_SAHPI_WATCHDOG_TIMER_RESET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); return rv; } public static long saHpiAnnunciatorGetNext( long SessionId, long ResourceId, long AnnunciatorNum, long Severity, long UnacknowledgedOnly, ref SaHpiAnnouncementT Announcement ) { long rv; bool rc; rc = HpiUtil.Check( Announcement ); if ( !rc ) { return HpiConst.SA_ERR_HPI_INVALID_PARAMS; } HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiAnnunciatorNumT( AnnunciatorNum ); m.MarshalSaHpiSeverityT( Severity ); m.MarshalSaHpiBoolT( UnacknowledgedOnly ); m.MarshalSaHpiAnnouncementT( Announcement ); rc = m.Interchange( OhpiConst.RPC_SAHPI_ANNUNCIATOR_GET_NEXT ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { Announcement = m.DemarshalSaHpiAnnouncementT(); } s.PutMarshal( m ); return rv; } public static long saHpiAnnunciatorGet( long SessionId, long ResourceId, long AnnunciatorNum, long EntryId, out SaHpiAnnouncementT Announcement ) { long rv; bool rc; Announcement = null; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiAnnunciatorNumT( AnnunciatorNum ); m.MarshalSaHpiEntryIdT( EntryId ); rc = m.Interchange( OhpiConst.RPC_SAHPI_ANNUNCIATOR_GET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { Announcement = m.DemarshalSaHpiAnnouncementT(); } s.PutMarshal( m ); return rv; } public static long saHpiAnnunciatorAcknowledge( long SessionId, long ResourceId, long AnnunciatorNum, long EntryId, long Severity ) { long rv; bool rc; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiAnnunciatorNumT( AnnunciatorNum ); m.MarshalSaHpiEntryIdT( EntryId ); m.MarshalSaHpiSeverityT( Severity ); rc = m.Interchange( OhpiConst.RPC_SAHPI_ANNUNCIATOR_ACKNOWLEDGE ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); return rv; } public static long saHpiAnnunciatorAdd( long SessionId, long ResourceId, long AnnunciatorNum, ref SaHpiAnnouncementT Announcement ) { long rv; bool rc; rc = HpiUtil.Check( Announcement ); if ( !rc ) { return HpiConst.SA_ERR_HPI_INVALID_PARAMS; } HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiAnnunciatorNumT( AnnunciatorNum ); m.MarshalSaHpiAnnouncementT( Announcement ); rc = m.Interchange( OhpiConst.RPC_SAHPI_ANNUNCIATOR_ADD ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { Announcement = m.DemarshalSaHpiAnnouncementT(); } s.PutMarshal( m ); return rv; } public static long saHpiAnnunciatorDelete( long SessionId, long ResourceId, long AnnunciatorNum, long EntryId, long Severity ) { long rv; bool rc; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiAnnunciatorNumT( AnnunciatorNum ); m.MarshalSaHpiEntryIdT( EntryId ); m.MarshalSaHpiSeverityT( Severity ); rc = m.Interchange( OhpiConst.RPC_SAHPI_ANNUNCIATOR_DELETE ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); return rv; } public static long saHpiAnnunciatorModeGet( long SessionId, long ResourceId, long AnnunciatorNum, out long Mode ) { long rv; bool rc; Mode = 0; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiAnnunciatorNumT( AnnunciatorNum ); rc = m.Interchange( OhpiConst.RPC_SAHPI_ANNUNCIATOR_MODE_GET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { Mode = m.DemarshalSaHpiAnnunciatorModeT(); } s.PutMarshal( m ); return rv; } public static long saHpiAnnunciatorModeSet( long SessionId, long ResourceId, long AnnunciatorNum, long Mode ) { long rv; bool rc; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiAnnunciatorNumT( AnnunciatorNum ); m.MarshalSaHpiAnnunciatorModeT( Mode ); rc = m.Interchange( OhpiConst.RPC_SAHPI_ANNUNCIATOR_MODE_SET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); return rv; } public static long saHpiDimiInfoGet( long SessionId, long ResourceId, long DimiNum, out SaHpiDimiInfoT DimiInfo ) { long rv; bool rc; DimiInfo = null; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiDimiNumT( DimiNum ); rc = m.Interchange( OhpiConst.RPC_SAHPI_DIMI_INFO_GET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { DimiInfo = m.DemarshalSaHpiDimiInfoT(); } s.PutMarshal( m ); return rv; } public static long saHpiDimiTestInfoGet( long SessionId, long ResourceId, long DimiNum, long TestNum, out SaHpiDimiTestT DimiTest ) { long rv; bool rc; DimiTest = null; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiDimiNumT( DimiNum ); m.MarshalSaHpiDimiTestNumT( TestNum ); rc = m.Interchange( OhpiConst.RPC_SAHPI_DIMI_TEST_INFO_GET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { DimiTest = m.DemarshalSaHpiDimiTestT(); } s.PutMarshal( m ); return rv; } public static long saHpiDimiTestReadinessGet( long SessionId, long ResourceId, long DimiNum, long TestNum, out long DimiReady ) { long rv; bool rc; DimiReady = 0; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiDimiNumT( DimiNum ); m.MarshalSaHpiDimiTestNumT( TestNum ); rc = m.Interchange( OhpiConst.RPC_SAHPI_DIMI_TEST_READINESS_GET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { DimiReady = m.DemarshalSaHpiDimiReadyT(); } s.PutMarshal( m ); return rv; } public static long saHpiDimiTestCancel( long SessionId, long ResourceId, long DimiNum, long TestNum ) { long rv; bool rc; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiDimiNumT( DimiNum ); m.MarshalSaHpiDimiTestNumT( TestNum ); rc = m.Interchange( OhpiConst.RPC_SAHPI_DIMI_TEST_CANCEL ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); return rv; } public static long saHpiDimiTestStatusGet( long SessionId, long ResourceId, long DimiNum, long TestNum, out long PercentCompleted, out long RunStatus ) { long rv; bool rc; PercentCompleted = 0; RunStatus = 0; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiDimiNumT( DimiNum ); m.MarshalSaHpiDimiTestNumT( TestNum ); rc = m.Interchange( OhpiConst.RPC_SAHPI_DIMI_TEST_STATUS_GET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { PercentCompleted = m.DemarshalSaHpiDimiTestPercentCompletedT(); RunStatus = m.DemarshalSaHpiDimiTestRunStatusT(); } s.PutMarshal( m ); return rv; } public static long saHpiDimiTestResultsGet( long SessionId, long ResourceId, long DimiNum, long TestNum, out SaHpiDimiTestResultsT TestResults ) { long rv; bool rc; TestResults = null; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiDimiNumT( DimiNum ); m.MarshalSaHpiDimiTestNumT( TestNum ); rc = m.Interchange( OhpiConst.RPC_SAHPI_DIMI_TEST_RESULTS_GET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { TestResults = m.DemarshalSaHpiDimiTestResultsT(); } s.PutMarshal( m ); return rv; } public static long saHpiFumiSpecInfoGet( long SessionId, long ResourceId, long FumiNum, out SaHpiFumiSpecInfoT SpecInfo ) { long rv; bool rc; SpecInfo = null; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiFumiNumT( FumiNum ); rc = m.Interchange( OhpiConst.RPC_SAHPI_FUMI_SPEC_INFO_GET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { SpecInfo = m.DemarshalSaHpiFumiSpecInfoT(); } s.PutMarshal( m ); return rv; } public static long saHpiFumiServiceImpactGet( long SessionId, long ResourceId, long FumiNum, out SaHpiFumiServiceImpactDataT ServiceImpact ) { long rv; bool rc; ServiceImpact = null; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiFumiNumT( FumiNum ); rc = m.Interchange( OhpiConst.RPC_SAHPI_FUMI_SERVICE_IMPACT_GET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { ServiceImpact = m.DemarshalSaHpiFumiServiceImpactDataT(); } s.PutMarshal( m ); return rv; } public static long saHpiFumiSourceSet( long SessionId, long ResourceId, long FumiNum, long BankNum, SaHpiTextBufferT SourceUri ) { long rv; bool rc; rc = HpiUtil.Check( SourceUri ); if ( !rc ) { return HpiConst.SA_ERR_HPI_INVALID_PARAMS; } HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiFumiNumT( FumiNum ); m.MarshalSaHpiBankNumT( BankNum ); m.MarshalSaHpiTextBufferT( SourceUri ); rc = m.Interchange( OhpiConst.RPC_SAHPI_FUMI_SOURCE_SET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); return rv; } public static long saHpiFumiSourceInfoValidateStart( long SessionId, long ResourceId, long FumiNum, long BankNum ) { long rv; bool rc; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiFumiNumT( FumiNum ); m.MarshalSaHpiBankNumT( BankNum ); rc = m.Interchange( OhpiConst.RPC_SAHPI_FUMI_SOURCE_INFO_VALIDATE_START ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); return rv; } public static long saHpiFumiSourceInfoGet( long SessionId, long ResourceId, long FumiNum, long BankNum, out SaHpiFumiSourceInfoT SourceInfo ) { long rv; bool rc; SourceInfo = null; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiFumiNumT( FumiNum ); m.MarshalSaHpiBankNumT( BankNum ); rc = m.Interchange( OhpiConst.RPC_SAHPI_FUMI_SOURCE_INFO_GET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { SourceInfo = m.DemarshalSaHpiFumiSourceInfoT(); } s.PutMarshal( m ); return rv; } public static long saHpiFumiSourceComponentInfoGet( long SessionId, long ResourceId, long FumiNum, long BankNum, long ComponentEntryId, out long NextComponentEntryId, out SaHpiFumiComponentInfoT ComponentInfo ) { long rv; bool rc; NextComponentEntryId = 0; ComponentInfo = null; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiFumiNumT( FumiNum ); m.MarshalSaHpiBankNumT( BankNum ); m.MarshalSaHpiEntryIdT( ComponentEntryId ); rc = m.Interchange( OhpiConst.RPC_SAHPI_FUMI_SOURCE_COMPONENT_INFO_GET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { NextComponentEntryId = m.DemarshalSaHpiEntryIdT(); ComponentInfo = m.DemarshalSaHpiFumiComponentInfoT(); } s.PutMarshal( m ); return rv; } public static long saHpiFumiTargetInfoGet( long SessionId, long ResourceId, long FumiNum, long BankNum, out SaHpiFumiBankInfoT BankInfo ) { long rv; bool rc; BankInfo = null; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiFumiNumT( FumiNum ); m.MarshalSaHpiBankNumT( BankNum ); rc = m.Interchange( OhpiConst.RPC_SAHPI_FUMI_TARGET_INFO_GET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { BankInfo = m.DemarshalSaHpiFumiBankInfoT(); } s.PutMarshal( m ); return rv; } public static long saHpiFumiTargetComponentInfoGet( long SessionId, long ResourceId, long FumiNum, long BankNum, long ComponentEntryId, out long NextComponentEntryId, out SaHpiFumiComponentInfoT ComponentInfo ) { long rv; bool rc; NextComponentEntryId = 0; ComponentInfo = null; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiFumiNumT( FumiNum ); m.MarshalSaHpiBankNumT( BankNum ); m.MarshalSaHpiEntryIdT( ComponentEntryId ); rc = m.Interchange( OhpiConst.RPC_SAHPI_FUMI_TARGET_COMPONENT_INFO_GET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { NextComponentEntryId = m.DemarshalSaHpiEntryIdT(); ComponentInfo = m.DemarshalSaHpiFumiComponentInfoT(); } s.PutMarshal( m ); return rv; } public static long saHpiFumiLogicalTargetInfoGet( long SessionId, long ResourceId, long FumiNum, out SaHpiFumiLogicalBankInfoT BankInfo ) { long rv; bool rc; BankInfo = null; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiFumiNumT( FumiNum ); rc = m.Interchange( OhpiConst.RPC_SAHPI_FUMI_LOGICAL_TARGET_INFO_GET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { BankInfo = m.DemarshalSaHpiFumiLogicalBankInfoT(); } s.PutMarshal( m ); return rv; } public static long saHpiFumiLogicalTargetComponentInfoGet( long SessionId, long ResourceId, long FumiNum, long ComponentEntryId, out long NextComponentEntryId, out SaHpiFumiLogicalComponentInfoT ComponentInfo ) { long rv; bool rc; NextComponentEntryId = 0; ComponentInfo = null; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiFumiNumT( FumiNum ); m.MarshalSaHpiEntryIdT( ComponentEntryId ); rc = m.Interchange( OhpiConst.RPC_SAHPI_FUMI_LOGICAL_TARGET_COMPONENT_INFO_GET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { NextComponentEntryId = m.DemarshalSaHpiEntryIdT(); ComponentInfo = m.DemarshalSaHpiFumiLogicalComponentInfoT(); } s.PutMarshal( m ); return rv; } public static long saHpiFumiBackupStart( long SessionId, long ResourceId, long FumiNum ) { long rv; bool rc; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiFumiNumT( FumiNum ); rc = m.Interchange( OhpiConst.RPC_SAHPI_FUMI_BACKUP_START ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); return rv; } public static long saHpiFumiBankBootOrderSet( long SessionId, long ResourceId, long FumiNum, long BankNum, long Position ) { long rv; bool rc; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiFumiNumT( FumiNum ); m.MarshalSaHpiBankNumT( BankNum ); m.MarshalSaHpiUint32T( Position ); rc = m.Interchange( OhpiConst.RPC_SAHPI_FUMI_BANK_BOOT_ORDER_SET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); return rv; } public static long saHpiFumiBankCopyStart( long SessionId, long ResourceId, long FumiNum, long SourceBankNum, long TargetBankNum ) { long rv; bool rc; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiFumiNumT( FumiNum ); m.MarshalSaHpiBankNumT( SourceBankNum ); m.MarshalSaHpiBankNumT( TargetBankNum ); rc = m.Interchange( OhpiConst.RPC_SAHPI_FUMI_BANK_COPY_START ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); return rv; } public static long saHpiFumiInstallStart( long SessionId, long ResourceId, long FumiNum, long BankNum ) { long rv; bool rc; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiFumiNumT( FumiNum ); m.MarshalSaHpiBankNumT( BankNum ); rc = m.Interchange( OhpiConst.RPC_SAHPI_FUMI_INSTALL_START ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); return rv; } public static long saHpiFumiUpgradeStatusGet( long SessionId, long ResourceId, long FumiNum, long BankNum, out long UpgradeStatus ) { long rv; bool rc; UpgradeStatus = 0; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiFumiNumT( FumiNum ); m.MarshalSaHpiBankNumT( BankNum ); rc = m.Interchange( OhpiConst.RPC_SAHPI_FUMI_UPGRADE_STATUS_GET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { UpgradeStatus = m.DemarshalSaHpiFumiUpgradeStatusT(); } s.PutMarshal( m ); return rv; } public static long saHpiFumiTargetVerifyStart( long SessionId, long ResourceId, long FumiNum, long BankNum ) { long rv; bool rc; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiFumiNumT( FumiNum ); m.MarshalSaHpiBankNumT( BankNum ); rc = m.Interchange( OhpiConst.RPC_SAHPI_FUMI_TARGET_VERIFY_START ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); return rv; } public static long saHpiFumiTargetVerifyMainStart( long SessionId, long ResourceId, long FumiNum ) { long rv; bool rc; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiFumiNumT( FumiNum ); rc = m.Interchange( OhpiConst.RPC_SAHPI_FUMI_TARGET_VERIFY_MAIN_START ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); return rv; } public static long saHpiFumiUpgradeCancel( long SessionId, long ResourceId, long FumiNum, long BankNum ) { long rv; bool rc; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiFumiNumT( FumiNum ); m.MarshalSaHpiBankNumT( BankNum ); rc = m.Interchange( OhpiConst.RPC_SAHPI_FUMI_UPGRADE_CANCEL ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); return rv; } public static long saHpiFumiAutoRollbackDisableGet( long SessionId, long ResourceId, long FumiNum, out long Disable ) { long rv; bool rc; Disable = 0; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiFumiNumT( FumiNum ); rc = m.Interchange( OhpiConst.RPC_SAHPI_FUMI_AUTO_ROLLBACK_DISABLE_GET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { Disable = m.DemarshalSaHpiBoolT(); } s.PutMarshal( m ); return rv; } public static long saHpiFumiAutoRollbackDisableSet( long SessionId, long ResourceId, long FumiNum, long Disable ) { long rv; bool rc; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiFumiNumT( FumiNum ); m.MarshalSaHpiBoolT( Disable ); rc = m.Interchange( OhpiConst.RPC_SAHPI_FUMI_AUTO_ROLLBACK_DISABLE_SET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); return rv; } public static long saHpiFumiRollbackStart( long SessionId, long ResourceId, long FumiNum ) { long rv; bool rc; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiFumiNumT( FumiNum ); rc = m.Interchange( OhpiConst.RPC_SAHPI_FUMI_ROLLBACK_START ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); return rv; } public static long saHpiFumiActivateStart( long SessionId, long ResourceId, long FumiNum, long Logical ) { long rv; bool rc; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiFumiNumT( FumiNum ); m.MarshalSaHpiBoolT( Logical ); rc = m.Interchange( OhpiConst.RPC_SAHPI_FUMI_ACTIVATE_START ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); return rv; } public static long saHpiFumiCleanup( long SessionId, long ResourceId, long FumiNum, long BankNum ) { long rv; bool rc; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiFumiNumT( FumiNum ); m.MarshalSaHpiBankNumT( BankNum ); rc = m.Interchange( OhpiConst.RPC_SAHPI_FUMI_CLEANUP ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); return rv; } public static long saHpiHotSwapPolicyCancel( long SessionId, long ResourceId ) { long rv; bool rc; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); rc = m.Interchange( OhpiConst.RPC_SAHPI_HOTSWAP_POLICY_CANCEL ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); return rv; } public static long saHpiResourceActiveSet( long SessionId, long ResourceId ) { long rv; bool rc; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); rc = m.Interchange( OhpiConst.RPC_SAHPI_RESOURCE_ACTIVE_SET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); return rv; } public static long saHpiResourceInactiveSet( long SessionId, long ResourceId ) { long rv; bool rc; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); rc = m.Interchange( OhpiConst.RPC_SAHPI_RESOURCE_INACTIVE_SET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); return rv; } public static long saHpiAutoInsertTimeoutGet( long SessionId, out long Timeout ) { long rv; bool rc; Timeout = 0; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); rc = m.Interchange( OhpiConst.RPC_SAHPI_AUTO_INSERT_TIMEOUT_GET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { Timeout = m.DemarshalSaHpiTimeoutT(); } s.PutMarshal( m ); return rv; } public static long saHpiAutoInsertTimeoutSet( long SessionId, long Timeout ) { long rv; bool rc; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiTimeoutT( Timeout ); rc = m.Interchange( OhpiConst.RPC_SAHPI_AUTO_INSERT_TIMEOUT_SET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); return rv; } public static long saHpiAutoExtractTimeoutGet( long SessionId, long ResourceId, out long Timeout ) { long rv; bool rc; Timeout = 0; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); rc = m.Interchange( OhpiConst.RPC_SAHPI_AUTO_EXTRACT_TIMEOUT_GET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { Timeout = m.DemarshalSaHpiTimeoutT(); } s.PutMarshal( m ); return rv; } public static long saHpiAutoExtractTimeoutSet( long SessionId, long ResourceId, long Timeout ) { long rv; bool rc; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiTimeoutT( Timeout ); rc = m.Interchange( OhpiConst.RPC_SAHPI_AUTO_EXTRACT_TIMEOUT_SET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); return rv; } public static long saHpiHotSwapStateGet( long SessionId, long ResourceId, out long State ) { long rv; bool rc; State = 0; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); rc = m.Interchange( OhpiConst.RPC_SAHPI_HOTSWAP_STATE_GET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { State = m.DemarshalSaHpiHsStateT(); } s.PutMarshal( m ); return rv; } public static long saHpiHotSwapActionRequest( long SessionId, long ResourceId, long Action ) { long rv; bool rc; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiHsActionT( Action ); rc = m.Interchange( OhpiConst.RPC_SAHPI_HOTSWAP_ACTION_REQUEST ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); return rv; } public static long saHpiHotSwapIndicatorStateGet( long SessionId, long ResourceId, out long State ) { long rv; bool rc; State = 0; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); rc = m.Interchange( OhpiConst.RPC_SAHPI_HOTSWAP_INDICATOR_STATE_GET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { State = m.DemarshalSaHpiHsIndicatorStateT(); } s.PutMarshal( m ); return rv; } public static long saHpiHotSwapIndicatorStateSet( long SessionId, long ResourceId, long State ) { long rv; bool rc; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiHsIndicatorStateT( State ); rc = m.Interchange( OhpiConst.RPC_SAHPI_HOTSWAP_INDICATOR_STATE_SET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); return rv; } public static long saHpiParmControl( long SessionId, long ResourceId, long Action ) { long rv; bool rc; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiParmActionT( Action ); rc = m.Interchange( OhpiConst.RPC_SAHPI_PARM_CONTROL ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); return rv; } public static long saHpiResourceLoadIdGet( long SessionId, long ResourceId, out SaHpiLoadIdT LoadId ) { long rv; bool rc; LoadId = null; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); rc = m.Interchange( OhpiConst.RPC_SAHPI_RESOURCE_LOADID_GET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { LoadId = m.DemarshalSaHpiLoadIdT(); } s.PutMarshal( m ); return rv; } public static long saHpiResourceLoadIdSet( long SessionId, long ResourceId, SaHpiLoadIdT LoadId ) { long rv; bool rc; rc = HpiUtil.Check( LoadId ); if ( !rc ) { return HpiConst.SA_ERR_HPI_INVALID_PARAMS; } HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiLoadIdT( LoadId ); rc = m.Interchange( OhpiConst.RPC_SAHPI_RESOURCE_LOADID_SET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); return rv; } public static long saHpiResourceResetStateGet( long SessionId, long ResourceId, out long ResetAction ) { long rv; bool rc; ResetAction = 0; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); rc = m.Interchange( OhpiConst.RPC_SAHPI_RESOURCE_RESET_STATE_GET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { ResetAction = m.DemarshalSaHpiResetActionT(); } s.PutMarshal( m ); return rv; } public static long saHpiResourceResetStateSet( long SessionId, long ResourceId, long ResetAction ) { long rv; bool rc; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiResetActionT( ResetAction ); rc = m.Interchange( OhpiConst.RPC_SAHPI_RESOURCE_RESET_STATE_SET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); return rv; } public static long saHpiResourcePowerStateGet( long SessionId, long ResourceId, out long State ) { long rv; bool rc; State = 0; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); rc = m.Interchange( OhpiConst.RPC_SAHPI_RESOURCE_POWER_STATE_GET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { State = m.DemarshalSaHpiPowerStateT(); } s.PutMarshal( m ); return rv; } public static long saHpiResourcePowerStateSet( long SessionId, long ResourceId, long State ) { long rv; bool rc; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiPowerStateT( State ); rc = m.Interchange( OhpiConst.RPC_SAHPI_RESOURCE_POWER_STATE_SET ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); return rv; } }; }; // namespace openhpi }; // namespace org openhpi-3.6.1/baselibs/csharp/openhpi_baselib/HpiMarshalGen.cs0000644000175100017510000024343312575647300023375 0ustar mohanmohan/* -*- c# -*- * * Copyright (C) 2012, Pigeon Point Systems * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ using System; namespace org { namespace openhpi { /********************************************************** * HPI Marshal (auto-generated) *********************************************************/ internal class HpiMarshalGen: HpiMarshalCore { /********************************************************** * Marshal: For HPI Simple Data Types *********************************************************/ public void MarshalSaHpiBoolT( long x ) { MarshalSaHpiUint8T( x ); } public void MarshalSaHpiManufacturerIdT( long x ) { MarshalSaHpiUint32T( x ); } public void MarshalSaHpiVersionT( long x ) { MarshalSaHpiUint32T( x ); } public void MarshalSaErrorT( long x ) { MarshalSaHpiInt32T( x ); } public void MarshalSaHpiDomainIdT( long x ) { MarshalSaHpiUint32T( x ); } public void MarshalSaHpiSessionIdT( long x ) { MarshalSaHpiUint32T( x ); } public void MarshalSaHpiResourceIdT( long x ) { MarshalSaHpiUint32T( x ); } public void MarshalSaHpiEntryIdT( long x ) { MarshalSaHpiUint32T( x ); } public void MarshalSaHpiTimeT( long x ) { MarshalSaHpiInt64T( x ); } public void MarshalSaHpiTimeoutT( long x ) { MarshalSaHpiInt64T( x ); } public void MarshalSaHpiInstrumentIdT( long x ) { MarshalSaHpiUint32T( x ); } public void MarshalSaHpiEntityLocationT( long x ) { MarshalSaHpiUint32T( x ); } public void MarshalSaHpiEventCategoryT( long x ) { MarshalSaHpiUint8T( x ); } public void MarshalSaHpiEventStateT( long x ) { MarshalSaHpiUint16T( x ); } public void MarshalSaHpiSensorNumT( long x ) { MarshalSaHpiInstrumentIdT( x ); } public void MarshalSaHpiSensorRangeFlagsT( long x ) { MarshalSaHpiUint8T( x ); } public void MarshalSaHpiSensorThdMaskT( long x ) { MarshalSaHpiUint8T( x ); } public void MarshalSaHpiCtrlNumT( long x ) { MarshalSaHpiInstrumentIdT( x ); } public void MarshalSaHpiCtrlStateDiscreteT( long x ) { MarshalSaHpiUint32T( x ); } public void MarshalSaHpiCtrlStateAnalogT( long x ) { MarshalSaHpiInt32T( x ); } public void MarshalSaHpiTxtLineNumT( long x ) { MarshalSaHpiUint8T( x ); } public void MarshalSaHpiIdrIdT( long x ) { MarshalSaHpiInstrumentIdT( x ); } public void MarshalSaHpiWatchdogNumT( long x ) { MarshalSaHpiInstrumentIdT( x ); } public void MarshalSaHpiWatchdogExpFlagsT( long x ) { MarshalSaHpiUint8T( x ); } public void MarshalSaHpiDimiNumT( long x ) { MarshalSaHpiInstrumentIdT( x ); } public void MarshalSaHpiDimiTestCapabilityT( long x ) { MarshalSaHpiUint32T( x ); } public void MarshalSaHpiDimiTestNumT( long x ) { MarshalSaHpiUint32T( x ); } public void MarshalSaHpiDimiTestPercentCompletedT( long x ) { MarshalSaHpiUint8T( x ); } public void MarshalSaHpiFumiNumT( long x ) { MarshalSaHpiInstrumentIdT( x ); } public void MarshalSaHpiBankNumT( long x ) { MarshalSaHpiUint8T( x ); } public void MarshalSaHpiFumiLogicalBankStateFlagsT( long x ) { MarshalSaHpiUint32T( x ); } public void MarshalSaHpiFumiProtocolT( long x ) { MarshalSaHpiUint32T( x ); } public void MarshalSaHpiFumiCapabilityT( long x ) { MarshalSaHpiUint32T( x ); } public void MarshalSaHpiSensorOptionalDataT( long x ) { MarshalSaHpiUint8T( x ); } public void MarshalSaHpiSensorEnableOptDataT( long x ) { MarshalSaHpiUint8T( x ); } public void MarshalSaHpiEvtQueueStatusT( long x ) { MarshalSaHpiUint32T( x ); } public void MarshalSaHpiAnnunciatorNumT( long x ) { MarshalSaHpiInstrumentIdT( x ); } public void MarshalSaHpiLoadNumberT( long x ) { MarshalSaHpiUint32T( x ); } public void MarshalSaHpiCapabilitiesT( long x ) { MarshalSaHpiUint32T( x ); } public void MarshalSaHpiHsCapabilitiesT( long x ) { MarshalSaHpiUint32T( x ); } public void MarshalSaHpiDomainCapabilitiesT( long x ) { MarshalSaHpiUint32T( x ); } public void MarshalSaHpiAlarmIdT( long x ) { MarshalSaHpiEntryIdT( x ); } public void MarshalSaHpiEventLogCapabilitiesT( long x ) { MarshalSaHpiUint32T( x ); } public void MarshalSaHpiEventLogEntryIdT( long x ) { MarshalSaHpiUint32T( x ); } public void MarshalSaHpiLanguageT( long x ) { MarshalEnum( x ); } public void MarshalSaHpiTextTypeT( long x ) { MarshalEnum( x ); } public void MarshalSaHpiEntityTypeT( long x ) { MarshalEnum( x ); } public void MarshalSaHpiSensorTypeT( long x ) { MarshalEnum( x ); } public void MarshalSaHpiSensorReadingTypeT( long x ) { MarshalEnum( x ); } public void MarshalSaHpiSensorEventMaskActionT( long x ) { MarshalEnum( x ); } public void MarshalSaHpiSensorUnitsT( long x ) { MarshalEnum( x ); } public void MarshalSaHpiSensorModUnitUseT( long x ) { MarshalEnum( x ); } public void MarshalSaHpiSensorEventCtrlT( long x ) { MarshalEnum( x ); } public void MarshalSaHpiCtrlTypeT( long x ) { MarshalEnum( x ); } public void MarshalSaHpiCtrlStateDigitalT( long x ) { MarshalEnum( x ); } public void MarshalSaHpiCtrlModeT( long x ) { MarshalEnum( x ); } public void MarshalSaHpiCtrlOutputTypeT( long x ) { MarshalEnum( x ); } public void MarshalSaHpiIdrAreaTypeT( long x ) { MarshalEnum( x ); } public void MarshalSaHpiIdrFieldTypeT( long x ) { MarshalEnum( x ); } public void MarshalSaHpiWatchdogActionT( long x ) { MarshalEnum( x ); } public void MarshalSaHpiWatchdogActionEventT( long x ) { MarshalEnum( x ); } public void MarshalSaHpiWatchdogPretimerInterruptT( long x ) { MarshalEnum( x ); } public void MarshalSaHpiWatchdogTimerUseT( long x ) { MarshalEnum( x ); } public void MarshalSaHpiDimiTestServiceImpactT( long x ) { MarshalEnum( x ); } public void MarshalSaHpiDimiTestRunStatusT( long x ) { MarshalEnum( x ); } public void MarshalSaHpiDimiTestErrCodeT( long x ) { MarshalEnum( x ); } public void MarshalSaHpiDimiTestParamTypeT( long x ) { MarshalEnum( x ); } public void MarshalSaHpiDimiReadyT( long x ) { MarshalEnum( x ); } public void MarshalSaHpiFumiSpecInfoTypeT( long x ) { MarshalEnum( x ); } public void MarshalSaHpiFumiSafDefinedSpecIdT( long x ) { MarshalEnum( x ); } public void MarshalSaHpiFumiServiceImpactT( long x ) { MarshalEnum( x ); } public void MarshalSaHpiFumiSourceStatusT( long x ) { MarshalEnum( x ); } public void MarshalSaHpiFumiBankStateT( long x ) { MarshalEnum( x ); } public void MarshalSaHpiFumiUpgradeStatusT( long x ) { MarshalEnum( x ); } public void MarshalSaHpiHsIndicatorStateT( long x ) { MarshalEnum( x ); } public void MarshalSaHpiHsActionT( long x ) { MarshalEnum( x ); } public void MarshalSaHpiHsStateT( long x ) { MarshalEnum( x ); } public void MarshalSaHpiHsCauseOfStateChangeT( long x ) { MarshalEnum( x ); } public void MarshalSaHpiSeverityT( long x ) { MarshalEnum( x ); } public void MarshalSaHpiResourceEventTypeT( long x ) { MarshalEnum( x ); } public void MarshalSaHpiDomainEventTypeT( long x ) { MarshalEnum( x ); } public void MarshalSaHpiSwEventTypeT( long x ) { MarshalEnum( x ); } public void MarshalSaHpiEventTypeT( long x ) { MarshalEnum( x ); } public void MarshalSaHpiStatusCondTypeT( long x ) { MarshalEnum( x ); } public void MarshalSaHpiAnnunciatorModeT( long x ) { MarshalEnum( x ); } public void MarshalSaHpiAnnunciatorTypeT( long x ) { MarshalEnum( x ); } public void MarshalSaHpiRdrTypeT( long x ) { MarshalEnum( x ); } public void MarshalSaHpiParmActionT( long x ) { MarshalEnum( x ); } public void MarshalSaHpiResetActionT( long x ) { MarshalEnum( x ); } public void MarshalSaHpiPowerStateT( long x ) { MarshalEnum( x ); } public void MarshalSaHpiEventLogOverflowActionT( long x ) { MarshalEnum( x ); } /********************************************************** * Marshal: For HPI Structs and Unions *********************************************************/ public void MarshalSaHpiTextBufferT( SaHpiTextBufferT x ) { MarshalSaHpiTextTypeT( x.DataType ); MarshalSaHpiLanguageT( x.Language ); MarshalSaHpiUint8T( x.DataLength ); MarshalByteArray( x.Data, HpiConst.SAHPI_MAX_TEXT_BUFFER_LENGTH ); } public void MarshalSaHpiEntityT( SaHpiEntityT x ) { MarshalSaHpiEntityTypeT( x.EntityType ); MarshalSaHpiEntityLocationT( x.EntityLocation ); } public void MarshalSaHpiEntityPathT( SaHpiEntityPathT x ) { for ( int i = 0; i < HpiConst.SAHPI_MAX_ENTITY_PATH; ++i ) { MarshalSaHpiEntityT( x.Entry[i] ); } } public void MarshalSaHpiSensorReadingUnionT( SaHpiSensorReadingUnionT x, long mod ) { if ( mod == HpiConst.SAHPI_SENSOR_READING_TYPE_INT64 ) { MarshalSaHpiInt64T( x.SensorInt64 ); } if ( mod == HpiConst.SAHPI_SENSOR_READING_TYPE_UINT64 ) { MarshalSaHpiUint64T( x.SensorUint64 ); } if ( mod == HpiConst.SAHPI_SENSOR_READING_TYPE_FLOAT64 ) { MarshalSaHpiFloat64T( x.SensorFloat64 ); } if ( mod == HpiConst.SAHPI_SENSOR_READING_TYPE_BUFFER ) { MarshalByteArray( x.SensorBuffer, HpiConst.SAHPI_SENSOR_BUFFER_LENGTH ); } } public void MarshalSaHpiSensorReadingT( SaHpiSensorReadingT x ) { MarshalSaHpiBoolT( x.IsSupported ); MarshalSaHpiSensorReadingTypeT( x.Type ); MarshalSaHpiSensorReadingUnionT( x.Value, x.Type ); } public void MarshalSaHpiSensorThresholdsT( SaHpiSensorThresholdsT x ) { MarshalSaHpiSensorReadingT( x.LowCritical ); MarshalSaHpiSensorReadingT( x.LowMajor ); MarshalSaHpiSensorReadingT( x.LowMinor ); MarshalSaHpiSensorReadingT( x.UpCritical ); MarshalSaHpiSensorReadingT( x.UpMajor ); MarshalSaHpiSensorReadingT( x.UpMinor ); MarshalSaHpiSensorReadingT( x.PosThdHysteresis ); MarshalSaHpiSensorReadingT( x.NegThdHysteresis ); } public void MarshalSaHpiSensorRangeT( SaHpiSensorRangeT x ) { MarshalSaHpiSensorRangeFlagsT( x.Flags ); MarshalSaHpiSensorReadingT( x.Max ); MarshalSaHpiSensorReadingT( x.Min ); MarshalSaHpiSensorReadingT( x.Nominal ); MarshalSaHpiSensorReadingT( x.NormalMax ); MarshalSaHpiSensorReadingT( x.NormalMin ); } public void MarshalSaHpiSensorDataFormatT( SaHpiSensorDataFormatT x ) { MarshalSaHpiBoolT( x.IsSupported ); MarshalSaHpiSensorReadingTypeT( x.ReadingType ); MarshalSaHpiSensorUnitsT( x.BaseUnits ); MarshalSaHpiSensorUnitsT( x.ModifierUnits ); MarshalSaHpiSensorModUnitUseT( x.ModifierUse ); MarshalSaHpiBoolT( x.Percentage ); MarshalSaHpiSensorRangeT( x.Range ); MarshalSaHpiFloat64T( x.AccuracyFactor ); } public void MarshalSaHpiSensorThdDefnT( SaHpiSensorThdDefnT x ) { MarshalSaHpiBoolT( x.IsAccessible ); MarshalSaHpiSensorThdMaskT( x.ReadThold ); MarshalSaHpiSensorThdMaskT( x.WriteThold ); MarshalSaHpiBoolT( x.Nonlinear ); } public void MarshalSaHpiSensorRecT( SaHpiSensorRecT x ) { MarshalSaHpiSensorNumT( x.Num ); MarshalSaHpiSensorTypeT( x.Type ); MarshalSaHpiEventCategoryT( x.Category ); MarshalSaHpiBoolT( x.EnableCtrl ); MarshalSaHpiSensorEventCtrlT( x.EventCtrl ); MarshalSaHpiEventStateT( x.Events ); MarshalSaHpiSensorDataFormatT( x.DataFormat ); MarshalSaHpiSensorThdDefnT( x.ThresholdDefn ); MarshalSaHpiUint32T( x.Oem ); } public void MarshalSaHpiCtrlStateStreamT( SaHpiCtrlStateStreamT x ) { MarshalSaHpiBoolT( x.Repeat ); MarshalSaHpiUint32T( x.StreamLength ); MarshalByteArray( x.Stream, HpiConst.SAHPI_CTRL_MAX_STREAM_LENGTH ); } public void MarshalSaHpiCtrlStateTextT( SaHpiCtrlStateTextT x ) { MarshalSaHpiTxtLineNumT( x.Line ); MarshalSaHpiTextBufferT( x.Text ); } public void MarshalSaHpiCtrlStateOemT( SaHpiCtrlStateOemT x ) { MarshalSaHpiManufacturerIdT( x.MId ); MarshalSaHpiUint8T( x.BodyLength ); MarshalByteArray( x.Body, HpiConst.SAHPI_CTRL_MAX_OEM_BODY_LENGTH ); } public void MarshalSaHpiCtrlStateUnionT( SaHpiCtrlStateUnionT x, long mod ) { if ( mod == HpiConst.SAHPI_CTRL_TYPE_DIGITAL ) { MarshalSaHpiCtrlStateDigitalT( x.Digital ); } if ( mod == HpiConst.SAHPI_CTRL_TYPE_DISCRETE ) { MarshalSaHpiCtrlStateDiscreteT( x.Discrete ); } if ( mod == HpiConst.SAHPI_CTRL_TYPE_ANALOG ) { MarshalSaHpiCtrlStateAnalogT( x.Analog ); } if ( mod == HpiConst.SAHPI_CTRL_TYPE_STREAM ) { MarshalSaHpiCtrlStateStreamT( x.Stream ); } if ( mod == HpiConst.SAHPI_CTRL_TYPE_TEXT ) { MarshalSaHpiCtrlStateTextT( x.Text ); } if ( mod == HpiConst.SAHPI_CTRL_TYPE_OEM ) { MarshalSaHpiCtrlStateOemT( x.Oem ); } } public void MarshalSaHpiCtrlStateT( SaHpiCtrlStateT x ) { MarshalSaHpiCtrlTypeT( x.Type ); MarshalSaHpiCtrlStateUnionT( x.StateUnion, x.Type ); } public void MarshalSaHpiCtrlRecDigitalT( SaHpiCtrlRecDigitalT x ) { MarshalSaHpiCtrlStateDigitalT( x.Default ); } public void MarshalSaHpiCtrlRecDiscreteT( SaHpiCtrlRecDiscreteT x ) { MarshalSaHpiCtrlStateDiscreteT( x.Default ); } public void MarshalSaHpiCtrlRecAnalogT( SaHpiCtrlRecAnalogT x ) { MarshalSaHpiCtrlStateAnalogT( x.Min ); MarshalSaHpiCtrlStateAnalogT( x.Max ); MarshalSaHpiCtrlStateAnalogT( x.Default ); } public void MarshalSaHpiCtrlRecStreamT( SaHpiCtrlRecStreamT x ) { MarshalSaHpiCtrlStateStreamT( x.Default ); } public void MarshalSaHpiCtrlRecTextT( SaHpiCtrlRecTextT x ) { MarshalSaHpiUint8T( x.MaxChars ); MarshalSaHpiUint8T( x.MaxLines ); MarshalSaHpiLanguageT( x.Language ); MarshalSaHpiTextTypeT( x.DataType ); MarshalSaHpiCtrlStateTextT( x.Default ); } public void MarshalSaHpiCtrlRecOemT( SaHpiCtrlRecOemT x ) { MarshalSaHpiManufacturerIdT( x.MId ); MarshalByteArray( x.ConfigData, HpiConst.SAHPI_CTRL_OEM_CONFIG_LENGTH ); MarshalSaHpiCtrlStateOemT( x.Default ); } public void MarshalSaHpiCtrlRecUnionT( SaHpiCtrlRecUnionT x, long mod ) { if ( mod == HpiConst.SAHPI_CTRL_TYPE_DIGITAL ) { MarshalSaHpiCtrlRecDigitalT( x.Digital ); } if ( mod == HpiConst.SAHPI_CTRL_TYPE_DISCRETE ) { MarshalSaHpiCtrlRecDiscreteT( x.Discrete ); } if ( mod == HpiConst.SAHPI_CTRL_TYPE_ANALOG ) { MarshalSaHpiCtrlRecAnalogT( x.Analog ); } if ( mod == HpiConst.SAHPI_CTRL_TYPE_STREAM ) { MarshalSaHpiCtrlRecStreamT( x.Stream ); } if ( mod == HpiConst.SAHPI_CTRL_TYPE_TEXT ) { MarshalSaHpiCtrlRecTextT( x.Text ); } if ( mod == HpiConst.SAHPI_CTRL_TYPE_OEM ) { MarshalSaHpiCtrlRecOemT( x.Oem ); } } public void MarshalSaHpiCtrlDefaultModeT( SaHpiCtrlDefaultModeT x ) { MarshalSaHpiCtrlModeT( x.Mode ); MarshalSaHpiBoolT( x.ReadOnly ); } public void MarshalSaHpiCtrlRecT( SaHpiCtrlRecT x ) { MarshalSaHpiCtrlNumT( x.Num ); MarshalSaHpiCtrlOutputTypeT( x.OutputType ); MarshalSaHpiCtrlTypeT( x.Type ); MarshalSaHpiCtrlRecUnionT( x.TypeUnion, x.Type ); MarshalSaHpiCtrlDefaultModeT( x.DefaultMode ); MarshalSaHpiBoolT( x.WriteOnly ); MarshalSaHpiUint32T( x.Oem ); } public void MarshalSaHpiIdrFieldT( SaHpiIdrFieldT x ) { MarshalSaHpiEntryIdT( x.AreaId ); MarshalSaHpiEntryIdT( x.FieldId ); MarshalSaHpiIdrFieldTypeT( x.Type ); MarshalSaHpiBoolT( x.ReadOnly ); MarshalSaHpiTextBufferT( x.Field ); } public void MarshalSaHpiIdrAreaHeaderT( SaHpiIdrAreaHeaderT x ) { MarshalSaHpiEntryIdT( x.AreaId ); MarshalSaHpiIdrAreaTypeT( x.Type ); MarshalSaHpiBoolT( x.ReadOnly ); MarshalSaHpiUint32T( x.NumFields ); } public void MarshalSaHpiIdrInfoT( SaHpiIdrInfoT x ) { MarshalSaHpiIdrIdT( x.IdrId ); MarshalSaHpiUint32T( x.UpdateCount ); MarshalSaHpiBoolT( x.ReadOnly ); MarshalSaHpiUint32T( x.NumAreas ); } public void MarshalSaHpiInventoryRecT( SaHpiInventoryRecT x ) { MarshalSaHpiIdrIdT( x.IdrId ); MarshalSaHpiBoolT( x.Persistent ); MarshalSaHpiUint32T( x.Oem ); } public void MarshalSaHpiWatchdogT( SaHpiWatchdogT x ) { MarshalSaHpiBoolT( x.Log ); MarshalSaHpiBoolT( x.Running ); MarshalSaHpiWatchdogTimerUseT( x.TimerUse ); MarshalSaHpiWatchdogActionT( x.TimerAction ); MarshalSaHpiWatchdogPretimerInterruptT( x.PretimerInterrupt ); MarshalSaHpiUint32T( x.PreTimeoutInterval ); MarshalSaHpiWatchdogExpFlagsT( x.TimerUseExpFlags ); MarshalSaHpiUint32T( x.InitialCount ); MarshalSaHpiUint32T( x.PresentCount ); } public void MarshalSaHpiWatchdogRecT( SaHpiWatchdogRecT x ) { MarshalSaHpiWatchdogNumT( x.WatchdogNum ); MarshalSaHpiUint32T( x.Oem ); } public void MarshalSaHpiDimiTestAffectedEntityT( SaHpiDimiTestAffectedEntityT x ) { MarshalSaHpiEntityPathT( x.EntityImpacted ); MarshalSaHpiDimiTestServiceImpactT( x.ServiceImpact ); } public void MarshalSaHpiDimiTestResultsT( SaHpiDimiTestResultsT x ) { MarshalSaHpiTimeT( x.ResultTimeStamp ); MarshalSaHpiTimeoutT( x.RunDuration ); MarshalSaHpiDimiTestRunStatusT( x.LastRunStatus ); MarshalSaHpiDimiTestErrCodeT( x.TestErrorCode ); MarshalSaHpiTextBufferT( x.TestResultString ); MarshalSaHpiBoolT( x.TestResultStringIsURI ); } public void MarshalSaHpiDimiTestParamValueT( SaHpiDimiTestParamValueT x, long mod ) { if ( mod == HpiConst.SAHPI_DIMITEST_PARAM_TYPE_INT32 ) { MarshalSaHpiInt32T( x.paramint ); } if ( mod == HpiConst.SAHPI_DIMITEST_PARAM_TYPE_BOOLEAN ) { MarshalSaHpiBoolT( x.parambool ); } if ( mod == HpiConst.SAHPI_DIMITEST_PARAM_TYPE_FLOAT64 ) { MarshalSaHpiFloat64T( x.paramfloat ); } if ( mod == HpiConst.SAHPI_DIMITEST_PARAM_TYPE_TEXT ) { MarshalSaHpiTextBufferT( x.paramtext ); } } public void MarshalSaHpiDimiTestParameterValueUnionT( SaHpiDimiTestParameterValueUnionT x, long mod ) { if ( mod == HpiConst.SAHPI_DIMITEST_PARAM_TYPE_INT32 ) { MarshalSaHpiInt32T( x.IntValue ); } if ( mod == HpiConst.SAHPI_DIMITEST_PARAM_TYPE_FLOAT64 ) { MarshalSaHpiFloat64T( x.FloatValue ); } if ( mod == HpiConst.SAHPI_DIMITEST_PARAM_TYPE_BOOLEAN ) { MarshalSaHpiFloat64T( x.FloatValue ); } if ( mod == HpiConst.SAHPI_DIMITEST_PARAM_TYPE_TEXT ) { MarshalSaHpiFloat64T( x.FloatValue ); } } public void MarshalSaHpiDimiTestParamsDefinitionT( SaHpiDimiTestParamsDefinitionT x ) { MarshalByteArray( x.ParamName, HpiConst.SAHPI_DIMITEST_PARAM_NAME_LEN ); MarshalSaHpiTextBufferT( x.ParamInfo ); MarshalSaHpiDimiTestParamTypeT( x.ParamType ); MarshalSaHpiDimiTestParameterValueUnionT( x.MinValue, x.ParamType ); MarshalSaHpiDimiTestParameterValueUnionT( x.MaxValue, x.ParamType ); MarshalSaHpiDimiTestParamValueT( x.DefaultParam, x.ParamType ); } public void MarshalSaHpiDimiTestT( SaHpiDimiTestT x ) { MarshalSaHpiTextBufferT( x.TestName ); MarshalSaHpiDimiTestServiceImpactT( x.ServiceImpact ); for ( int i = 0; i < HpiConst.SAHPI_DIMITEST_MAX_ENTITIESIMPACTED; ++i ) { MarshalSaHpiDimiTestAffectedEntityT( x.EntitiesImpacted[i] ); } MarshalSaHpiBoolT( x.NeedServiceOS ); MarshalSaHpiTextBufferT( x.ServiceOS ); MarshalSaHpiTimeT( x.ExpectedRunDuration ); MarshalSaHpiDimiTestCapabilityT( x.TestCapabilities ); for ( int i = 0; i < HpiConst.SAHPI_DIMITEST_MAX_PARAMETERS; ++i ) { MarshalSaHpiDimiTestParamsDefinitionT( x.TestParameters[i] ); } } public void MarshalSaHpiDimiTestVariableParamsT( SaHpiDimiTestVariableParamsT x ) { MarshalByteArray( x.ParamName, HpiConst.SAHPI_DIMITEST_PARAM_NAME_LEN ); MarshalSaHpiDimiTestParamTypeT( x.ParamType ); MarshalSaHpiDimiTestParamValueT( x.Value, x.ParamType ); } public void MarshalSaHpiDimiInfoT( SaHpiDimiInfoT x ) { MarshalSaHpiUint32T( x.NumberOfTests ); MarshalSaHpiUint32T( x.TestNumUpdateCounter ); } public void MarshalSaHpiDimiRecT( SaHpiDimiRecT x ) { MarshalSaHpiDimiNumT( x.DimiNum ); MarshalSaHpiUint32T( x.Oem ); } public void MarshalSaHpiFumiSafDefinedSpecInfoT( SaHpiFumiSafDefinedSpecInfoT x ) { MarshalSaHpiFumiSafDefinedSpecIdT( x.SpecID ); MarshalSaHpiUint32T( x.RevisionID ); } public void MarshalSaHpiFumiOemDefinedSpecInfoT( SaHpiFumiOemDefinedSpecInfoT x ) { MarshalSaHpiManufacturerIdT( x.Mid ); MarshalSaHpiUint8T( x.BodyLength ); MarshalByteArray( x.Body, HpiConst.SAHPI_FUMI_MAX_OEM_BODY_LENGTH ); } public void MarshalSaHpiFumiSpecInfoTypeUnionT( SaHpiFumiSpecInfoTypeUnionT x, long mod ) { if ( mod == HpiConst.SAHPI_FUMI_SPEC_INFO_SAF_DEFINED ) { MarshalSaHpiFumiSafDefinedSpecInfoT( x.SafDefined ); } if ( mod == HpiConst.SAHPI_FUMI_SPEC_INFO_OEM_DEFINED ) { MarshalSaHpiFumiOemDefinedSpecInfoT( x.OemDefined ); } } public void MarshalSaHpiFumiSpecInfoT( SaHpiFumiSpecInfoT x ) { MarshalSaHpiFumiSpecInfoTypeT( x.SpecInfoType ); MarshalSaHpiFumiSpecInfoTypeUnionT( x.SpecInfoTypeUnion, x.SpecInfoType ); } public void MarshalSaHpiFumiFirmwareInstanceInfoT( SaHpiFumiFirmwareInstanceInfoT x ) { MarshalSaHpiBoolT( x.InstancePresent ); MarshalSaHpiTextBufferT( x.Identifier ); MarshalSaHpiTextBufferT( x.Description ); MarshalSaHpiTextBufferT( x.DateTime ); MarshalSaHpiUint32T( x.MajorVersion ); MarshalSaHpiUint32T( x.MinorVersion ); MarshalSaHpiUint32T( x.AuxVersion ); } public void MarshalSaHpiFumiImpactedEntityT( SaHpiFumiImpactedEntityT x ) { MarshalSaHpiEntityPathT( x.ImpactedEntity ); MarshalSaHpiFumiServiceImpactT( x.ServiceImpact ); } public void MarshalSaHpiFumiServiceImpactDataT( SaHpiFumiServiceImpactDataT x ) { MarshalSaHpiUint32T( x.NumEntities ); for ( int i = 0; i < HpiConst.SAHPI_FUMI_MAX_ENTITIES_IMPACTED; ++i ) { MarshalSaHpiFumiImpactedEntityT( x.ImpactedEntities[i] ); } } public void MarshalSaHpiFumiSourceInfoT( SaHpiFumiSourceInfoT x ) { MarshalSaHpiTextBufferT( x.SourceUri ); MarshalSaHpiFumiSourceStatusT( x.SourceStatus ); MarshalSaHpiTextBufferT( x.Identifier ); MarshalSaHpiTextBufferT( x.Description ); MarshalSaHpiTextBufferT( x.DateTime ); MarshalSaHpiUint32T( x.MajorVersion ); MarshalSaHpiUint32T( x.MinorVersion ); MarshalSaHpiUint32T( x.AuxVersion ); } public void MarshalSaHpiFumiComponentInfoT( SaHpiFumiComponentInfoT x ) { MarshalSaHpiEntryIdT( x.EntryId ); MarshalSaHpiUint32T( x.ComponentId ); MarshalSaHpiFumiFirmwareInstanceInfoT( x.MainFwInstance ); MarshalSaHpiUint32T( x.ComponentFlags ); } public void MarshalSaHpiFumiBankInfoT( SaHpiFumiBankInfoT x ) { MarshalSaHpiUint8T( x.BankId ); MarshalSaHpiUint32T( x.BankSize ); MarshalSaHpiUint32T( x.Position ); MarshalSaHpiFumiBankStateT( x.BankState ); MarshalSaHpiTextBufferT( x.Identifier ); MarshalSaHpiTextBufferT( x.Description ); MarshalSaHpiTextBufferT( x.DateTime ); MarshalSaHpiUint32T( x.MajorVersion ); MarshalSaHpiUint32T( x.MinorVersion ); MarshalSaHpiUint32T( x.AuxVersion ); } public void MarshalSaHpiFumiLogicalBankInfoT( SaHpiFumiLogicalBankInfoT x ) { MarshalSaHpiUint8T( x.FirmwarePersistentLocationCount ); MarshalSaHpiFumiLogicalBankStateFlagsT( x.BankStateFlags ); MarshalSaHpiFumiFirmwareInstanceInfoT( x.PendingFwInstance ); MarshalSaHpiFumiFirmwareInstanceInfoT( x.RollbackFwInstance ); } public void MarshalSaHpiFumiLogicalComponentInfoT( SaHpiFumiLogicalComponentInfoT x ) { MarshalSaHpiEntryIdT( x.EntryId ); MarshalSaHpiUint32T( x.ComponentId ); MarshalSaHpiFumiFirmwareInstanceInfoT( x.PendingFwInstance ); MarshalSaHpiFumiFirmwareInstanceInfoT( x.RollbackFwInstance ); MarshalSaHpiUint32T( x.ComponentFlags ); } public void MarshalSaHpiFumiRecT( SaHpiFumiRecT x ) { MarshalSaHpiFumiNumT( x.Num ); MarshalSaHpiFumiProtocolT( x.AccessProt ); MarshalSaHpiFumiCapabilityT( x.Capability ); MarshalSaHpiUint8T( x.NumBanks ); MarshalSaHpiUint32T( x.Oem ); } public void MarshalSaHpiResourceEventT( SaHpiResourceEventT x ) { MarshalSaHpiResourceEventTypeT( x.ResourceEventType ); } public void MarshalSaHpiDomainEventT( SaHpiDomainEventT x ) { MarshalSaHpiDomainEventTypeT( x.Type ); MarshalSaHpiDomainIdT( x.DomainId ); } public void MarshalSaHpiSensorEventT( SaHpiSensorEventT x ) { MarshalSaHpiSensorNumT( x.SensorNum ); MarshalSaHpiSensorTypeT( x.SensorType ); MarshalSaHpiEventCategoryT( x.EventCategory ); MarshalSaHpiBoolT( x.Assertion ); MarshalSaHpiEventStateT( x.EventState ); MarshalSaHpiSensorOptionalDataT( x.OptionalDataPresent ); MarshalSaHpiSensorReadingT( x.TriggerReading ); MarshalSaHpiSensorReadingT( x.TriggerThreshold ); MarshalSaHpiEventStateT( x.PreviousState ); MarshalSaHpiEventStateT( x.CurrentState ); MarshalSaHpiUint32T( x.Oem ); MarshalSaHpiUint32T( x.SensorSpecific ); } public void MarshalSaHpiSensorEnableChangeEventT( SaHpiSensorEnableChangeEventT x ) { MarshalSaHpiSensorNumT( x.SensorNum ); MarshalSaHpiSensorTypeT( x.SensorType ); MarshalSaHpiEventCategoryT( x.EventCategory ); MarshalSaHpiBoolT( x.SensorEnable ); MarshalSaHpiBoolT( x.SensorEventEnable ); MarshalSaHpiEventStateT( x.AssertEventMask ); MarshalSaHpiEventStateT( x.DeassertEventMask ); MarshalSaHpiSensorEnableOptDataT( x.OptionalDataPresent ); MarshalSaHpiEventStateT( x.CurrentState ); MarshalSaHpiEventStateT( x.CriticalAlarms ); MarshalSaHpiEventStateT( x.MajorAlarms ); MarshalSaHpiEventStateT( x.MinorAlarms ); } public void MarshalSaHpiHotSwapEventT( SaHpiHotSwapEventT x ) { MarshalSaHpiHsStateT( x.HotSwapState ); MarshalSaHpiHsStateT( x.PreviousHotSwapState ); MarshalSaHpiHsCauseOfStateChangeT( x.CauseOfStateChange ); } public void MarshalSaHpiWatchdogEventT( SaHpiWatchdogEventT x ) { MarshalSaHpiWatchdogNumT( x.WatchdogNum ); MarshalSaHpiWatchdogActionEventT( x.WatchdogAction ); MarshalSaHpiWatchdogPretimerInterruptT( x.WatchdogPreTimerAction ); MarshalSaHpiWatchdogTimerUseT( x.WatchdogUse ); } public void MarshalSaHpiHpiSwEventT( SaHpiHpiSwEventT x ) { MarshalSaHpiManufacturerIdT( x.MId ); MarshalSaHpiSwEventTypeT( x.Type ); MarshalSaHpiTextBufferT( x.EventData ); } public void MarshalSaHpiOemEventT( SaHpiOemEventT x ) { MarshalSaHpiManufacturerIdT( x.MId ); MarshalSaHpiTextBufferT( x.OemEventData ); } public void MarshalSaHpiUserEventT( SaHpiUserEventT x ) { MarshalSaHpiTextBufferT( x.UserEventData ); } public void MarshalSaHpiDimiEventT( SaHpiDimiEventT x ) { MarshalSaHpiDimiNumT( x.DimiNum ); MarshalSaHpiDimiTestNumT( x.TestNum ); MarshalSaHpiDimiTestRunStatusT( x.DimiTestRunStatus ); MarshalSaHpiDimiTestPercentCompletedT( x.DimiTestPercentCompleted ); } public void MarshalSaHpiDimiUpdateEventT( SaHpiDimiUpdateEventT x ) { MarshalSaHpiDimiNumT( x.DimiNum ); } public void MarshalSaHpiFumiEventT( SaHpiFumiEventT x ) { MarshalSaHpiFumiNumT( x.FumiNum ); MarshalSaHpiUint8T( x.BankNum ); MarshalSaHpiFumiUpgradeStatusT( x.UpgradeStatus ); } public void MarshalSaHpiEventUnionT( SaHpiEventUnionT x, long mod ) { if ( mod == HpiConst.SAHPI_ET_RESOURCE ) { MarshalSaHpiResourceEventT( x.ResourceEvent ); } if ( mod == HpiConst.SAHPI_ET_DOMAIN ) { MarshalSaHpiDomainEventT( x.DomainEvent ); } if ( mod == HpiConst.SAHPI_ET_SENSOR ) { MarshalSaHpiSensorEventT( x.SensorEvent ); } if ( mod == HpiConst.SAHPI_ET_SENSOR_ENABLE_CHANGE ) { MarshalSaHpiSensorEnableChangeEventT( x.SensorEnableChangeEvent ); } if ( mod == HpiConst.SAHPI_ET_HOTSWAP ) { MarshalSaHpiHotSwapEventT( x.HotSwapEvent ); } if ( mod == HpiConst.SAHPI_ET_WATCHDOG ) { MarshalSaHpiWatchdogEventT( x.WatchdogEvent ); } if ( mod == HpiConst.SAHPI_ET_HPI_SW ) { MarshalSaHpiHpiSwEventT( x.HpiSwEvent ); } if ( mod == HpiConst.SAHPI_ET_OEM ) { MarshalSaHpiOemEventT( x.OemEvent ); } if ( mod == HpiConst.SAHPI_ET_USER ) { MarshalSaHpiUserEventT( x.UserEvent ); } if ( mod == HpiConst.SAHPI_ET_DIMI ) { MarshalSaHpiDimiEventT( x.DimiEvent ); } if ( mod == HpiConst.SAHPI_ET_DIMI_UPDATE ) { MarshalSaHpiDimiUpdateEventT( x.DimiUpdateEvent ); } if ( mod == HpiConst.SAHPI_ET_FUMI ) { MarshalSaHpiFumiEventT( x.FumiEvent ); } } public void MarshalSaHpiEventT( SaHpiEventT x ) { MarshalSaHpiResourceIdT( x.Source ); MarshalSaHpiEventTypeT( x.EventType ); MarshalSaHpiTimeT( x.Timestamp ); MarshalSaHpiSeverityT( x.Severity ); MarshalSaHpiEventUnionT( x.EventDataUnion, x.EventType ); } public void MarshalSaHpiNameT( SaHpiNameT x ) { MarshalSaHpiUint16T( x.Length ); MarshalByteArray( x.Value, HpiConst.SA_HPI_MAX_NAME_LENGTH ); } public void MarshalSaHpiConditionT( SaHpiConditionT x ) { MarshalSaHpiStatusCondTypeT( x.Type ); MarshalSaHpiEntityPathT( x.Entity ); MarshalSaHpiDomainIdT( x.DomainId ); MarshalSaHpiResourceIdT( x.ResourceId ); MarshalSaHpiSensorNumT( x.SensorNum ); MarshalSaHpiEventStateT( x.EventState ); MarshalSaHpiNameT( x.Name ); MarshalSaHpiManufacturerIdT( x.Mid ); MarshalSaHpiTextBufferT( x.Data ); } public void MarshalSaHpiAnnouncementT( SaHpiAnnouncementT x ) { MarshalSaHpiEntryIdT( x.EntryId ); MarshalSaHpiTimeT( x.Timestamp ); MarshalSaHpiBoolT( x.AddedByUser ); MarshalSaHpiSeverityT( x.Severity ); MarshalSaHpiBoolT( x.Acknowledged ); MarshalSaHpiConditionT( x.StatusCond ); } public void MarshalSaHpiAnnunciatorRecT( SaHpiAnnunciatorRecT x ) { MarshalSaHpiAnnunciatorNumT( x.AnnunciatorNum ); MarshalSaHpiAnnunciatorTypeT( x.AnnunciatorType ); MarshalSaHpiBoolT( x.ModeReadOnly ); MarshalSaHpiUint32T( x.MaxConditions ); MarshalSaHpiUint32T( x.Oem ); } public void MarshalSaHpiRdrTypeUnionT( SaHpiRdrTypeUnionT x, long mod ) { if ( mod == HpiConst.SAHPI_CTRL_RDR ) { MarshalSaHpiCtrlRecT( x.CtrlRec ); } if ( mod == HpiConst.SAHPI_SENSOR_RDR ) { MarshalSaHpiSensorRecT( x.SensorRec ); } if ( mod == HpiConst.SAHPI_INVENTORY_RDR ) { MarshalSaHpiInventoryRecT( x.InventoryRec ); } if ( mod == HpiConst.SAHPI_WATCHDOG_RDR ) { MarshalSaHpiWatchdogRecT( x.WatchdogRec ); } if ( mod == HpiConst.SAHPI_ANNUNCIATOR_RDR ) { MarshalSaHpiAnnunciatorRecT( x.AnnunciatorRec ); } if ( mod == HpiConst.SAHPI_DIMI_RDR ) { MarshalSaHpiDimiRecT( x.DimiRec ); } if ( mod == HpiConst.SAHPI_FUMI_RDR ) { MarshalSaHpiFumiRecT( x.FumiRec ); } } public void MarshalSaHpiRdrT( SaHpiRdrT x ) { MarshalSaHpiEntryIdT( x.RecordId ); MarshalSaHpiRdrTypeT( x.RdrType ); MarshalSaHpiEntityPathT( x.Entity ); MarshalSaHpiBoolT( x.IsFru ); MarshalSaHpiRdrTypeUnionT( x.RdrTypeUnion, x.RdrType ); MarshalSaHpiTextBufferT( x.IdString ); } public void MarshalSaHpiLoadIdT( SaHpiLoadIdT x ) { MarshalSaHpiLoadNumberT( x.LoadNumber ); MarshalSaHpiTextBufferT( x.LoadName ); } public void MarshalSaHpiResourceInfoT( SaHpiResourceInfoT x ) { MarshalSaHpiUint8T( x.ResourceRev ); MarshalSaHpiUint8T( x.SpecificVer ); MarshalSaHpiUint8T( x.DeviceSupport ); MarshalSaHpiManufacturerIdT( x.ManufacturerId ); MarshalSaHpiUint16T( x.ProductId ); MarshalSaHpiUint8T( x.FirmwareMajorRev ); MarshalSaHpiUint8T( x.FirmwareMinorRev ); MarshalSaHpiUint8T( x.AuxFirmwareRev ); MarshalByteArray( x.Guid, HpiConst.SAHPI_GUID_LENGTH ); } public void MarshalSaHpiRptEntryT( SaHpiRptEntryT x ) { MarshalSaHpiEntryIdT( x.EntryId ); MarshalSaHpiResourceIdT( x.ResourceId ); MarshalSaHpiResourceInfoT( x.ResourceInfo ); MarshalSaHpiEntityPathT( x.ResourceEntity ); MarshalSaHpiCapabilitiesT( x.ResourceCapabilities ); MarshalSaHpiHsCapabilitiesT( x.HotSwapCapabilities ); MarshalSaHpiSeverityT( x.ResourceSeverity ); MarshalSaHpiBoolT( x.ResourceFailed ); MarshalSaHpiTextBufferT( x.ResourceTag ); } public void MarshalSaHpiDomainInfoT( SaHpiDomainInfoT x ) { MarshalSaHpiDomainIdT( x.DomainId ); MarshalSaHpiDomainCapabilitiesT( x.DomainCapabilities ); MarshalSaHpiBoolT( x.IsPeer ); MarshalSaHpiTextBufferT( x.DomainTag ); MarshalSaHpiUint32T( x.DrtUpdateCount ); MarshalSaHpiTimeT( x.DrtUpdateTimestamp ); MarshalSaHpiUint32T( x.RptUpdateCount ); MarshalSaHpiTimeT( x.RptUpdateTimestamp ); MarshalSaHpiUint32T( x.DatUpdateCount ); MarshalSaHpiTimeT( x.DatUpdateTimestamp ); MarshalSaHpiUint32T( x.ActiveAlarms ); MarshalSaHpiUint32T( x.CriticalAlarms ); MarshalSaHpiUint32T( x.MajorAlarms ); MarshalSaHpiUint32T( x.MinorAlarms ); MarshalSaHpiUint32T( x.DatUserAlarmLimit ); MarshalSaHpiBoolT( x.DatOverflow ); MarshalByteArray( x.Guid, HpiConst.SAHPI_GUID_LENGTH ); } public void MarshalSaHpiDrtEntryT( SaHpiDrtEntryT x ) { MarshalSaHpiEntryIdT( x.EntryId ); MarshalSaHpiDomainIdT( x.DomainId ); MarshalSaHpiBoolT( x.IsPeer ); } public void MarshalSaHpiAlarmT( SaHpiAlarmT x ) { MarshalSaHpiAlarmIdT( x.AlarmId ); MarshalSaHpiTimeT( x.Timestamp ); MarshalSaHpiSeverityT( x.Severity ); MarshalSaHpiBoolT( x.Acknowledged ); MarshalSaHpiConditionT( x.AlarmCond ); } public void MarshalSaHpiEventLogInfoT( SaHpiEventLogInfoT x ) { MarshalSaHpiUint32T( x.Entries ); MarshalSaHpiUint32T( x.Size ); MarshalSaHpiUint32T( x.UserEventMaxSize ); MarshalSaHpiTimeT( x.UpdateTimestamp ); MarshalSaHpiTimeT( x.CurrentTime ); MarshalSaHpiBoolT( x.Enabled ); MarshalSaHpiBoolT( x.OverflowFlag ); MarshalSaHpiBoolT( x.OverflowResetable ); MarshalSaHpiEventLogOverflowActionT( x.OverflowAction ); } public void MarshalSaHpiEventLogEntryT( SaHpiEventLogEntryT x ) { MarshalSaHpiEventLogEntryIdT( x.EntryId ); MarshalSaHpiTimeT( x.Timestamp ); MarshalSaHpiEventT( x.Event ); } /********************************************************** * Demarshal: For HPI Simple Data Types *********************************************************/ public long DemarshalSaHpiBoolT() { return DemarshalSaHpiUint8T(); } public long DemarshalSaHpiManufacturerIdT() { return DemarshalSaHpiUint32T(); } public long DemarshalSaHpiVersionT() { return DemarshalSaHpiUint32T(); } public long DemarshalSaErrorT() { return DemarshalSaHpiInt32T(); } public long DemarshalSaHpiDomainIdT() { return DemarshalSaHpiUint32T(); } public long DemarshalSaHpiSessionIdT() { return DemarshalSaHpiUint32T(); } public long DemarshalSaHpiResourceIdT() { return DemarshalSaHpiUint32T(); } public long DemarshalSaHpiEntryIdT() { return DemarshalSaHpiUint32T(); } public long DemarshalSaHpiTimeT() { return DemarshalSaHpiInt64T(); } public long DemarshalSaHpiTimeoutT() { return DemarshalSaHpiInt64T(); } public long DemarshalSaHpiInstrumentIdT() { return DemarshalSaHpiUint32T(); } public long DemarshalSaHpiEntityLocationT() { return DemarshalSaHpiUint32T(); } public long DemarshalSaHpiEventCategoryT() { return DemarshalSaHpiUint8T(); } public long DemarshalSaHpiEventStateT() { return DemarshalSaHpiUint16T(); } public long DemarshalSaHpiSensorNumT() { return DemarshalSaHpiInstrumentIdT(); } public long DemarshalSaHpiSensorRangeFlagsT() { return DemarshalSaHpiUint8T(); } public long DemarshalSaHpiSensorThdMaskT() { return DemarshalSaHpiUint8T(); } public long DemarshalSaHpiCtrlNumT() { return DemarshalSaHpiInstrumentIdT(); } public long DemarshalSaHpiCtrlStateDiscreteT() { return DemarshalSaHpiUint32T(); } public long DemarshalSaHpiCtrlStateAnalogT() { return DemarshalSaHpiInt32T(); } public long DemarshalSaHpiTxtLineNumT() { return DemarshalSaHpiUint8T(); } public long DemarshalSaHpiIdrIdT() { return DemarshalSaHpiInstrumentIdT(); } public long DemarshalSaHpiWatchdogNumT() { return DemarshalSaHpiInstrumentIdT(); } public long DemarshalSaHpiWatchdogExpFlagsT() { return DemarshalSaHpiUint8T(); } public long DemarshalSaHpiDimiNumT() { return DemarshalSaHpiInstrumentIdT(); } public long DemarshalSaHpiDimiTestCapabilityT() { return DemarshalSaHpiUint32T(); } public long DemarshalSaHpiDimiTestNumT() { return DemarshalSaHpiUint32T(); } public long DemarshalSaHpiDimiTestPercentCompletedT() { return DemarshalSaHpiUint8T(); } public long DemarshalSaHpiFumiNumT() { return DemarshalSaHpiInstrumentIdT(); } public long DemarshalSaHpiBankNumT() { return DemarshalSaHpiUint8T(); } public long DemarshalSaHpiFumiLogicalBankStateFlagsT() { return DemarshalSaHpiUint32T(); } public long DemarshalSaHpiFumiProtocolT() { return DemarshalSaHpiUint32T(); } public long DemarshalSaHpiFumiCapabilityT() { return DemarshalSaHpiUint32T(); } public long DemarshalSaHpiSensorOptionalDataT() { return DemarshalSaHpiUint8T(); } public long DemarshalSaHpiSensorEnableOptDataT() { return DemarshalSaHpiUint8T(); } public long DemarshalSaHpiEvtQueueStatusT() { return DemarshalSaHpiUint32T(); } public long DemarshalSaHpiAnnunciatorNumT() { return DemarshalSaHpiInstrumentIdT(); } public long DemarshalSaHpiLoadNumberT() { return DemarshalSaHpiUint32T(); } public long DemarshalSaHpiCapabilitiesT() { return DemarshalSaHpiUint32T(); } public long DemarshalSaHpiHsCapabilitiesT() { return DemarshalSaHpiUint32T(); } public long DemarshalSaHpiDomainCapabilitiesT() { return DemarshalSaHpiUint32T(); } public long DemarshalSaHpiAlarmIdT() { return DemarshalSaHpiEntryIdT(); } public long DemarshalSaHpiEventLogCapabilitiesT() { return DemarshalSaHpiUint32T(); } public long DemarshalSaHpiEventLogEntryIdT() { return DemarshalSaHpiUint32T(); } public long DemarshalSaHpiLanguageT() { return DemarshalEnum(); } public long DemarshalSaHpiTextTypeT() { return DemarshalEnum(); } public long DemarshalSaHpiEntityTypeT() { return DemarshalEnum(); } public long DemarshalSaHpiSensorTypeT() { return DemarshalEnum(); } public long DemarshalSaHpiSensorReadingTypeT() { return DemarshalEnum(); } public long DemarshalSaHpiSensorEventMaskActionT() { return DemarshalEnum(); } public long DemarshalSaHpiSensorUnitsT() { return DemarshalEnum(); } public long DemarshalSaHpiSensorModUnitUseT() { return DemarshalEnum(); } public long DemarshalSaHpiSensorEventCtrlT() { return DemarshalEnum(); } public long DemarshalSaHpiCtrlTypeT() { return DemarshalEnum(); } public long DemarshalSaHpiCtrlStateDigitalT() { return DemarshalEnum(); } public long DemarshalSaHpiCtrlModeT() { return DemarshalEnum(); } public long DemarshalSaHpiCtrlOutputTypeT() { return DemarshalEnum(); } public long DemarshalSaHpiIdrAreaTypeT() { return DemarshalEnum(); } public long DemarshalSaHpiIdrFieldTypeT() { return DemarshalEnum(); } public long DemarshalSaHpiWatchdogActionT() { return DemarshalEnum(); } public long DemarshalSaHpiWatchdogActionEventT() { return DemarshalEnum(); } public long DemarshalSaHpiWatchdogPretimerInterruptT() { return DemarshalEnum(); } public long DemarshalSaHpiWatchdogTimerUseT() { return DemarshalEnum(); } public long DemarshalSaHpiDimiTestServiceImpactT() { return DemarshalEnum(); } public long DemarshalSaHpiDimiTestRunStatusT() { return DemarshalEnum(); } public long DemarshalSaHpiDimiTestErrCodeT() { return DemarshalEnum(); } public long DemarshalSaHpiDimiTestParamTypeT() { return DemarshalEnum(); } public long DemarshalSaHpiDimiReadyT() { return DemarshalEnum(); } public long DemarshalSaHpiFumiSpecInfoTypeT() { return DemarshalEnum(); } public long DemarshalSaHpiFumiSafDefinedSpecIdT() { return DemarshalEnum(); } public long DemarshalSaHpiFumiServiceImpactT() { return DemarshalEnum(); } public long DemarshalSaHpiFumiSourceStatusT() { return DemarshalEnum(); } public long DemarshalSaHpiFumiBankStateT() { return DemarshalEnum(); } public long DemarshalSaHpiFumiUpgradeStatusT() { return DemarshalEnum(); } public long DemarshalSaHpiHsIndicatorStateT() { return DemarshalEnum(); } public long DemarshalSaHpiHsActionT() { return DemarshalEnum(); } public long DemarshalSaHpiHsStateT() { return DemarshalEnum(); } public long DemarshalSaHpiHsCauseOfStateChangeT() { return DemarshalEnum(); } public long DemarshalSaHpiSeverityT() { return DemarshalEnum(); } public long DemarshalSaHpiResourceEventTypeT() { return DemarshalEnum(); } public long DemarshalSaHpiDomainEventTypeT() { return DemarshalEnum(); } public long DemarshalSaHpiSwEventTypeT() { return DemarshalEnum(); } public long DemarshalSaHpiEventTypeT() { return DemarshalEnum(); } public long DemarshalSaHpiStatusCondTypeT() { return DemarshalEnum(); } public long DemarshalSaHpiAnnunciatorModeT() { return DemarshalEnum(); } public long DemarshalSaHpiAnnunciatorTypeT() { return DemarshalEnum(); } public long DemarshalSaHpiRdrTypeT() { return DemarshalEnum(); } public long DemarshalSaHpiParmActionT() { return DemarshalEnum(); } public long DemarshalSaHpiResetActionT() { return DemarshalEnum(); } public long DemarshalSaHpiPowerStateT() { return DemarshalEnum(); } public long DemarshalSaHpiEventLogOverflowActionT() { return DemarshalEnum(); } /********************************************************** * Demarshal: For HPI Structs and Unions *********************************************************/ public SaHpiTextBufferT DemarshalSaHpiTextBufferT() { SaHpiTextBufferT x = new SaHpiTextBufferT(); x.DataType = DemarshalSaHpiTextTypeT(); x.Language = DemarshalSaHpiLanguageT(); x.DataLength = DemarshalSaHpiUint8T(); x.Data = DemarshalByteArray( HpiConst.SAHPI_MAX_TEXT_BUFFER_LENGTH ); return x; } public SaHpiEntityT DemarshalSaHpiEntityT() { SaHpiEntityT x = new SaHpiEntityT(); x.EntityType = DemarshalSaHpiEntityTypeT(); x.EntityLocation = DemarshalSaHpiEntityLocationT(); return x; } public SaHpiEntityPathT DemarshalSaHpiEntityPathT() { SaHpiEntityPathT x = new SaHpiEntityPathT(); x.Entry = new SaHpiEntityT[HpiConst.SAHPI_MAX_ENTITY_PATH]; for ( int i = 0; i < HpiConst.SAHPI_MAX_ENTITY_PATH; ++i ) { x.Entry[i] = DemarshalSaHpiEntityT(); } return x; } public SaHpiSensorReadingUnionT DemarshalSaHpiSensorReadingUnionT( long mod ) { SaHpiSensorReadingUnionT x = new SaHpiSensorReadingUnionT(); if ( mod == HpiConst.SAHPI_SENSOR_READING_TYPE_INT64 ) { x.SensorInt64 = DemarshalSaHpiInt64T(); } if ( mod == HpiConst.SAHPI_SENSOR_READING_TYPE_UINT64 ) { x.SensorUint64 = DemarshalSaHpiUint64T(); } if ( mod == HpiConst.SAHPI_SENSOR_READING_TYPE_FLOAT64 ) { x.SensorFloat64 = DemarshalSaHpiFloat64T(); } if ( mod == HpiConst.SAHPI_SENSOR_READING_TYPE_BUFFER ) { x.SensorBuffer = DemarshalByteArray( HpiConst.SAHPI_SENSOR_BUFFER_LENGTH ); } return x; } public SaHpiSensorReadingT DemarshalSaHpiSensorReadingT() { SaHpiSensorReadingT x = new SaHpiSensorReadingT(); x.IsSupported = DemarshalSaHpiBoolT(); x.Type = DemarshalSaHpiSensorReadingTypeT(); x.Value = DemarshalSaHpiSensorReadingUnionT( x.Type ); return x; } public SaHpiSensorThresholdsT DemarshalSaHpiSensorThresholdsT() { SaHpiSensorThresholdsT x = new SaHpiSensorThresholdsT(); x.LowCritical = DemarshalSaHpiSensorReadingT(); x.LowMajor = DemarshalSaHpiSensorReadingT(); x.LowMinor = DemarshalSaHpiSensorReadingT(); x.UpCritical = DemarshalSaHpiSensorReadingT(); x.UpMajor = DemarshalSaHpiSensorReadingT(); x.UpMinor = DemarshalSaHpiSensorReadingT(); x.PosThdHysteresis = DemarshalSaHpiSensorReadingT(); x.NegThdHysteresis = DemarshalSaHpiSensorReadingT(); return x; } public SaHpiSensorRangeT DemarshalSaHpiSensorRangeT() { SaHpiSensorRangeT x = new SaHpiSensorRangeT(); x.Flags = DemarshalSaHpiSensorRangeFlagsT(); x.Max = DemarshalSaHpiSensorReadingT(); x.Min = DemarshalSaHpiSensorReadingT(); x.Nominal = DemarshalSaHpiSensorReadingT(); x.NormalMax = DemarshalSaHpiSensorReadingT(); x.NormalMin = DemarshalSaHpiSensorReadingT(); return x; } public SaHpiSensorDataFormatT DemarshalSaHpiSensorDataFormatT() { SaHpiSensorDataFormatT x = new SaHpiSensorDataFormatT(); x.IsSupported = DemarshalSaHpiBoolT(); x.ReadingType = DemarshalSaHpiSensorReadingTypeT(); x.BaseUnits = DemarshalSaHpiSensorUnitsT(); x.ModifierUnits = DemarshalSaHpiSensorUnitsT(); x.ModifierUse = DemarshalSaHpiSensorModUnitUseT(); x.Percentage = DemarshalSaHpiBoolT(); x.Range = DemarshalSaHpiSensorRangeT(); x.AccuracyFactor = DemarshalSaHpiFloat64T(); return x; } public SaHpiSensorThdDefnT DemarshalSaHpiSensorThdDefnT() { SaHpiSensorThdDefnT x = new SaHpiSensorThdDefnT(); x.IsAccessible = DemarshalSaHpiBoolT(); x.ReadThold = DemarshalSaHpiSensorThdMaskT(); x.WriteThold = DemarshalSaHpiSensorThdMaskT(); x.Nonlinear = DemarshalSaHpiBoolT(); return x; } public SaHpiSensorRecT DemarshalSaHpiSensorRecT() { SaHpiSensorRecT x = new SaHpiSensorRecT(); x.Num = DemarshalSaHpiSensorNumT(); x.Type = DemarshalSaHpiSensorTypeT(); x.Category = DemarshalSaHpiEventCategoryT(); x.EnableCtrl = DemarshalSaHpiBoolT(); x.EventCtrl = DemarshalSaHpiSensorEventCtrlT(); x.Events = DemarshalSaHpiEventStateT(); x.DataFormat = DemarshalSaHpiSensorDataFormatT(); x.ThresholdDefn = DemarshalSaHpiSensorThdDefnT(); x.Oem = DemarshalSaHpiUint32T(); return x; } public SaHpiCtrlStateStreamT DemarshalSaHpiCtrlStateStreamT() { SaHpiCtrlStateStreamT x = new SaHpiCtrlStateStreamT(); x.Repeat = DemarshalSaHpiBoolT(); x.StreamLength = DemarshalSaHpiUint32T(); x.Stream = DemarshalByteArray( HpiConst.SAHPI_CTRL_MAX_STREAM_LENGTH ); return x; } public SaHpiCtrlStateTextT DemarshalSaHpiCtrlStateTextT() { SaHpiCtrlStateTextT x = new SaHpiCtrlStateTextT(); x.Line = DemarshalSaHpiTxtLineNumT(); x.Text = DemarshalSaHpiTextBufferT(); return x; } public SaHpiCtrlStateOemT DemarshalSaHpiCtrlStateOemT() { SaHpiCtrlStateOemT x = new SaHpiCtrlStateOemT(); x.MId = DemarshalSaHpiManufacturerIdT(); x.BodyLength = DemarshalSaHpiUint8T(); x.Body = DemarshalByteArray( HpiConst.SAHPI_CTRL_MAX_OEM_BODY_LENGTH ); return x; } public SaHpiCtrlStateUnionT DemarshalSaHpiCtrlStateUnionT( long mod ) { SaHpiCtrlStateUnionT x = new SaHpiCtrlStateUnionT(); if ( mod == HpiConst.SAHPI_CTRL_TYPE_DIGITAL ) { x.Digital = DemarshalSaHpiCtrlStateDigitalT(); } if ( mod == HpiConst.SAHPI_CTRL_TYPE_DISCRETE ) { x.Discrete = DemarshalSaHpiCtrlStateDiscreteT(); } if ( mod == HpiConst.SAHPI_CTRL_TYPE_ANALOG ) { x.Analog = DemarshalSaHpiCtrlStateAnalogT(); } if ( mod == HpiConst.SAHPI_CTRL_TYPE_STREAM ) { x.Stream = DemarshalSaHpiCtrlStateStreamT(); } if ( mod == HpiConst.SAHPI_CTRL_TYPE_TEXT ) { x.Text = DemarshalSaHpiCtrlStateTextT(); } if ( mod == HpiConst.SAHPI_CTRL_TYPE_OEM ) { x.Oem = DemarshalSaHpiCtrlStateOemT(); } return x; } public SaHpiCtrlStateT DemarshalSaHpiCtrlStateT() { SaHpiCtrlStateT x = new SaHpiCtrlStateT(); x.Type = DemarshalSaHpiCtrlTypeT(); x.StateUnion = DemarshalSaHpiCtrlStateUnionT( x.Type ); return x; } public SaHpiCtrlRecDigitalT DemarshalSaHpiCtrlRecDigitalT() { SaHpiCtrlRecDigitalT x = new SaHpiCtrlRecDigitalT(); x.Default = DemarshalSaHpiCtrlStateDigitalT(); return x; } public SaHpiCtrlRecDiscreteT DemarshalSaHpiCtrlRecDiscreteT() { SaHpiCtrlRecDiscreteT x = new SaHpiCtrlRecDiscreteT(); x.Default = DemarshalSaHpiCtrlStateDiscreteT(); return x; } public SaHpiCtrlRecAnalogT DemarshalSaHpiCtrlRecAnalogT() { SaHpiCtrlRecAnalogT x = new SaHpiCtrlRecAnalogT(); x.Min = DemarshalSaHpiCtrlStateAnalogT(); x.Max = DemarshalSaHpiCtrlStateAnalogT(); x.Default = DemarshalSaHpiCtrlStateAnalogT(); return x; } public SaHpiCtrlRecStreamT DemarshalSaHpiCtrlRecStreamT() { SaHpiCtrlRecStreamT x = new SaHpiCtrlRecStreamT(); x.Default = DemarshalSaHpiCtrlStateStreamT(); return x; } public SaHpiCtrlRecTextT DemarshalSaHpiCtrlRecTextT() { SaHpiCtrlRecTextT x = new SaHpiCtrlRecTextT(); x.MaxChars = DemarshalSaHpiUint8T(); x.MaxLines = DemarshalSaHpiUint8T(); x.Language = DemarshalSaHpiLanguageT(); x.DataType = DemarshalSaHpiTextTypeT(); x.Default = DemarshalSaHpiCtrlStateTextT(); return x; } public SaHpiCtrlRecOemT DemarshalSaHpiCtrlRecOemT() { SaHpiCtrlRecOemT x = new SaHpiCtrlRecOemT(); x.MId = DemarshalSaHpiManufacturerIdT(); x.ConfigData = DemarshalByteArray( HpiConst.SAHPI_CTRL_OEM_CONFIG_LENGTH ); x.Default = DemarshalSaHpiCtrlStateOemT(); return x; } public SaHpiCtrlRecUnionT DemarshalSaHpiCtrlRecUnionT( long mod ) { SaHpiCtrlRecUnionT x = new SaHpiCtrlRecUnionT(); if ( mod == HpiConst.SAHPI_CTRL_TYPE_DIGITAL ) { x.Digital = DemarshalSaHpiCtrlRecDigitalT(); } if ( mod == HpiConst.SAHPI_CTRL_TYPE_DISCRETE ) { x.Discrete = DemarshalSaHpiCtrlRecDiscreteT(); } if ( mod == HpiConst.SAHPI_CTRL_TYPE_ANALOG ) { x.Analog = DemarshalSaHpiCtrlRecAnalogT(); } if ( mod == HpiConst.SAHPI_CTRL_TYPE_STREAM ) { x.Stream = DemarshalSaHpiCtrlRecStreamT(); } if ( mod == HpiConst.SAHPI_CTRL_TYPE_TEXT ) { x.Text = DemarshalSaHpiCtrlRecTextT(); } if ( mod == HpiConst.SAHPI_CTRL_TYPE_OEM ) { x.Oem = DemarshalSaHpiCtrlRecOemT(); } return x; } public SaHpiCtrlDefaultModeT DemarshalSaHpiCtrlDefaultModeT() { SaHpiCtrlDefaultModeT x = new SaHpiCtrlDefaultModeT(); x.Mode = DemarshalSaHpiCtrlModeT(); x.ReadOnly = DemarshalSaHpiBoolT(); return x; } public SaHpiCtrlRecT DemarshalSaHpiCtrlRecT() { SaHpiCtrlRecT x = new SaHpiCtrlRecT(); x.Num = DemarshalSaHpiCtrlNumT(); x.OutputType = DemarshalSaHpiCtrlOutputTypeT(); x.Type = DemarshalSaHpiCtrlTypeT(); x.TypeUnion = DemarshalSaHpiCtrlRecUnionT( x.Type ); x.DefaultMode = DemarshalSaHpiCtrlDefaultModeT(); x.WriteOnly = DemarshalSaHpiBoolT(); x.Oem = DemarshalSaHpiUint32T(); return x; } public SaHpiIdrFieldT DemarshalSaHpiIdrFieldT() { SaHpiIdrFieldT x = new SaHpiIdrFieldT(); x.AreaId = DemarshalSaHpiEntryIdT(); x.FieldId = DemarshalSaHpiEntryIdT(); x.Type = DemarshalSaHpiIdrFieldTypeT(); x.ReadOnly = DemarshalSaHpiBoolT(); x.Field = DemarshalSaHpiTextBufferT(); return x; } public SaHpiIdrAreaHeaderT DemarshalSaHpiIdrAreaHeaderT() { SaHpiIdrAreaHeaderT x = new SaHpiIdrAreaHeaderT(); x.AreaId = DemarshalSaHpiEntryIdT(); x.Type = DemarshalSaHpiIdrAreaTypeT(); x.ReadOnly = DemarshalSaHpiBoolT(); x.NumFields = DemarshalSaHpiUint32T(); return x; } public SaHpiIdrInfoT DemarshalSaHpiIdrInfoT() { SaHpiIdrInfoT x = new SaHpiIdrInfoT(); x.IdrId = DemarshalSaHpiIdrIdT(); x.UpdateCount = DemarshalSaHpiUint32T(); x.ReadOnly = DemarshalSaHpiBoolT(); x.NumAreas = DemarshalSaHpiUint32T(); return x; } public SaHpiInventoryRecT DemarshalSaHpiInventoryRecT() { SaHpiInventoryRecT x = new SaHpiInventoryRecT(); x.IdrId = DemarshalSaHpiIdrIdT(); x.Persistent = DemarshalSaHpiBoolT(); x.Oem = DemarshalSaHpiUint32T(); return x; } public SaHpiWatchdogT DemarshalSaHpiWatchdogT() { SaHpiWatchdogT x = new SaHpiWatchdogT(); x.Log = DemarshalSaHpiBoolT(); x.Running = DemarshalSaHpiBoolT(); x.TimerUse = DemarshalSaHpiWatchdogTimerUseT(); x.TimerAction = DemarshalSaHpiWatchdogActionT(); x.PretimerInterrupt = DemarshalSaHpiWatchdogPretimerInterruptT(); x.PreTimeoutInterval = DemarshalSaHpiUint32T(); x.TimerUseExpFlags = DemarshalSaHpiWatchdogExpFlagsT(); x.InitialCount = DemarshalSaHpiUint32T(); x.PresentCount = DemarshalSaHpiUint32T(); return x; } public SaHpiWatchdogRecT DemarshalSaHpiWatchdogRecT() { SaHpiWatchdogRecT x = new SaHpiWatchdogRecT(); x.WatchdogNum = DemarshalSaHpiWatchdogNumT(); x.Oem = DemarshalSaHpiUint32T(); return x; } public SaHpiDimiTestAffectedEntityT DemarshalSaHpiDimiTestAffectedEntityT() { SaHpiDimiTestAffectedEntityT x = new SaHpiDimiTestAffectedEntityT(); x.EntityImpacted = DemarshalSaHpiEntityPathT(); x.ServiceImpact = DemarshalSaHpiDimiTestServiceImpactT(); return x; } public SaHpiDimiTestResultsT DemarshalSaHpiDimiTestResultsT() { SaHpiDimiTestResultsT x = new SaHpiDimiTestResultsT(); x.ResultTimeStamp = DemarshalSaHpiTimeT(); x.RunDuration = DemarshalSaHpiTimeoutT(); x.LastRunStatus = DemarshalSaHpiDimiTestRunStatusT(); x.TestErrorCode = DemarshalSaHpiDimiTestErrCodeT(); x.TestResultString = DemarshalSaHpiTextBufferT(); x.TestResultStringIsURI = DemarshalSaHpiBoolT(); return x; } public SaHpiDimiTestParamValueT DemarshalSaHpiDimiTestParamValueT( long mod ) { SaHpiDimiTestParamValueT x = new SaHpiDimiTestParamValueT(); if ( mod == HpiConst.SAHPI_DIMITEST_PARAM_TYPE_INT32 ) { x.paramint = DemarshalSaHpiInt32T(); } if ( mod == HpiConst.SAHPI_DIMITEST_PARAM_TYPE_BOOLEAN ) { x.parambool = DemarshalSaHpiBoolT(); } if ( mod == HpiConst.SAHPI_DIMITEST_PARAM_TYPE_FLOAT64 ) { x.paramfloat = DemarshalSaHpiFloat64T(); } if ( mod == HpiConst.SAHPI_DIMITEST_PARAM_TYPE_TEXT ) { x.paramtext = DemarshalSaHpiTextBufferT(); } return x; } public SaHpiDimiTestParameterValueUnionT DemarshalSaHpiDimiTestParameterValueUnionT( long mod ) { SaHpiDimiTestParameterValueUnionT x = new SaHpiDimiTestParameterValueUnionT(); if ( mod == HpiConst.SAHPI_DIMITEST_PARAM_TYPE_INT32 ) { x.IntValue = DemarshalSaHpiInt32T(); } if ( mod == HpiConst.SAHPI_DIMITEST_PARAM_TYPE_FLOAT64 ) { x.FloatValue = DemarshalSaHpiFloat64T(); } if ( mod == HpiConst.SAHPI_DIMITEST_PARAM_TYPE_BOOLEAN ) { x.FloatValue = DemarshalSaHpiFloat64T(); } if ( mod == HpiConst.SAHPI_DIMITEST_PARAM_TYPE_TEXT ) { x.FloatValue = DemarshalSaHpiFloat64T(); } return x; } public SaHpiDimiTestParamsDefinitionT DemarshalSaHpiDimiTestParamsDefinitionT() { SaHpiDimiTestParamsDefinitionT x = new SaHpiDimiTestParamsDefinitionT(); x.ParamName = DemarshalByteArray( HpiConst.SAHPI_DIMITEST_PARAM_NAME_LEN ); x.ParamInfo = DemarshalSaHpiTextBufferT(); x.ParamType = DemarshalSaHpiDimiTestParamTypeT(); x.MinValue = DemarshalSaHpiDimiTestParameterValueUnionT( x.ParamType ); x.MaxValue = DemarshalSaHpiDimiTestParameterValueUnionT( x.ParamType ); x.DefaultParam = DemarshalSaHpiDimiTestParamValueT( x.ParamType ); return x; } public SaHpiDimiTestT DemarshalSaHpiDimiTestT() { SaHpiDimiTestT x = new SaHpiDimiTestT(); x.TestName = DemarshalSaHpiTextBufferT(); x.ServiceImpact = DemarshalSaHpiDimiTestServiceImpactT(); x.EntitiesImpacted = new SaHpiDimiTestAffectedEntityT[HpiConst.SAHPI_DIMITEST_MAX_ENTITIESIMPACTED]; for ( int i = 0; i < HpiConst.SAHPI_DIMITEST_MAX_ENTITIESIMPACTED; ++i ) { x.EntitiesImpacted[i] = DemarshalSaHpiDimiTestAffectedEntityT(); } x.NeedServiceOS = DemarshalSaHpiBoolT(); x.ServiceOS = DemarshalSaHpiTextBufferT(); x.ExpectedRunDuration = DemarshalSaHpiTimeT(); x.TestCapabilities = DemarshalSaHpiDimiTestCapabilityT(); x.TestParameters = new SaHpiDimiTestParamsDefinitionT[HpiConst.SAHPI_DIMITEST_MAX_PARAMETERS]; for ( int i = 0; i < HpiConst.SAHPI_DIMITEST_MAX_PARAMETERS; ++i ) { x.TestParameters[i] = DemarshalSaHpiDimiTestParamsDefinitionT(); } return x; } public SaHpiDimiTestVariableParamsT DemarshalSaHpiDimiTestVariableParamsT() { SaHpiDimiTestVariableParamsT x = new SaHpiDimiTestVariableParamsT(); x.ParamName = DemarshalByteArray( HpiConst.SAHPI_DIMITEST_PARAM_NAME_LEN ); x.ParamType = DemarshalSaHpiDimiTestParamTypeT(); x.Value = DemarshalSaHpiDimiTestParamValueT( x.ParamType ); return x; } public SaHpiDimiInfoT DemarshalSaHpiDimiInfoT() { SaHpiDimiInfoT x = new SaHpiDimiInfoT(); x.NumberOfTests = DemarshalSaHpiUint32T(); x.TestNumUpdateCounter = DemarshalSaHpiUint32T(); return x; } public SaHpiDimiRecT DemarshalSaHpiDimiRecT() { SaHpiDimiRecT x = new SaHpiDimiRecT(); x.DimiNum = DemarshalSaHpiDimiNumT(); x.Oem = DemarshalSaHpiUint32T(); return x; } public SaHpiFumiSafDefinedSpecInfoT DemarshalSaHpiFumiSafDefinedSpecInfoT() { SaHpiFumiSafDefinedSpecInfoT x = new SaHpiFumiSafDefinedSpecInfoT(); x.SpecID = DemarshalSaHpiFumiSafDefinedSpecIdT(); x.RevisionID = DemarshalSaHpiUint32T(); return x; } public SaHpiFumiOemDefinedSpecInfoT DemarshalSaHpiFumiOemDefinedSpecInfoT() { SaHpiFumiOemDefinedSpecInfoT x = new SaHpiFumiOemDefinedSpecInfoT(); x.Mid = DemarshalSaHpiManufacturerIdT(); x.BodyLength = DemarshalSaHpiUint8T(); x.Body = DemarshalByteArray( HpiConst.SAHPI_FUMI_MAX_OEM_BODY_LENGTH ); return x; } public SaHpiFumiSpecInfoTypeUnionT DemarshalSaHpiFumiSpecInfoTypeUnionT( long mod ) { SaHpiFumiSpecInfoTypeUnionT x = new SaHpiFumiSpecInfoTypeUnionT(); if ( mod == HpiConst.SAHPI_FUMI_SPEC_INFO_SAF_DEFINED ) { x.SafDefined = DemarshalSaHpiFumiSafDefinedSpecInfoT(); } if ( mod == HpiConst.SAHPI_FUMI_SPEC_INFO_OEM_DEFINED ) { x.OemDefined = DemarshalSaHpiFumiOemDefinedSpecInfoT(); } return x; } public SaHpiFumiSpecInfoT DemarshalSaHpiFumiSpecInfoT() { SaHpiFumiSpecInfoT x = new SaHpiFumiSpecInfoT(); x.SpecInfoType = DemarshalSaHpiFumiSpecInfoTypeT(); x.SpecInfoTypeUnion = DemarshalSaHpiFumiSpecInfoTypeUnionT( x.SpecInfoType ); return x; } public SaHpiFumiFirmwareInstanceInfoT DemarshalSaHpiFumiFirmwareInstanceInfoT() { SaHpiFumiFirmwareInstanceInfoT x = new SaHpiFumiFirmwareInstanceInfoT(); x.InstancePresent = DemarshalSaHpiBoolT(); x.Identifier = DemarshalSaHpiTextBufferT(); x.Description = DemarshalSaHpiTextBufferT(); x.DateTime = DemarshalSaHpiTextBufferT(); x.MajorVersion = DemarshalSaHpiUint32T(); x.MinorVersion = DemarshalSaHpiUint32T(); x.AuxVersion = DemarshalSaHpiUint32T(); return x; } public SaHpiFumiImpactedEntityT DemarshalSaHpiFumiImpactedEntityT() { SaHpiFumiImpactedEntityT x = new SaHpiFumiImpactedEntityT(); x.ImpactedEntity = DemarshalSaHpiEntityPathT(); x.ServiceImpact = DemarshalSaHpiFumiServiceImpactT(); return x; } public SaHpiFumiServiceImpactDataT DemarshalSaHpiFumiServiceImpactDataT() { SaHpiFumiServiceImpactDataT x = new SaHpiFumiServiceImpactDataT(); x.NumEntities = DemarshalSaHpiUint32T(); x.ImpactedEntities = new SaHpiFumiImpactedEntityT[HpiConst.SAHPI_FUMI_MAX_ENTITIES_IMPACTED]; for ( int i = 0; i < HpiConst.SAHPI_FUMI_MAX_ENTITIES_IMPACTED; ++i ) { x.ImpactedEntities[i] = DemarshalSaHpiFumiImpactedEntityT(); } return x; } public SaHpiFumiSourceInfoT DemarshalSaHpiFumiSourceInfoT() { SaHpiFumiSourceInfoT x = new SaHpiFumiSourceInfoT(); x.SourceUri = DemarshalSaHpiTextBufferT(); x.SourceStatus = DemarshalSaHpiFumiSourceStatusT(); x.Identifier = DemarshalSaHpiTextBufferT(); x.Description = DemarshalSaHpiTextBufferT(); x.DateTime = DemarshalSaHpiTextBufferT(); x.MajorVersion = DemarshalSaHpiUint32T(); x.MinorVersion = DemarshalSaHpiUint32T(); x.AuxVersion = DemarshalSaHpiUint32T(); return x; } public SaHpiFumiComponentInfoT DemarshalSaHpiFumiComponentInfoT() { SaHpiFumiComponentInfoT x = new SaHpiFumiComponentInfoT(); x.EntryId = DemarshalSaHpiEntryIdT(); x.ComponentId = DemarshalSaHpiUint32T(); x.MainFwInstance = DemarshalSaHpiFumiFirmwareInstanceInfoT(); x.ComponentFlags = DemarshalSaHpiUint32T(); return x; } public SaHpiFumiBankInfoT DemarshalSaHpiFumiBankInfoT() { SaHpiFumiBankInfoT x = new SaHpiFumiBankInfoT(); x.BankId = DemarshalSaHpiUint8T(); x.BankSize = DemarshalSaHpiUint32T(); x.Position = DemarshalSaHpiUint32T(); x.BankState = DemarshalSaHpiFumiBankStateT(); x.Identifier = DemarshalSaHpiTextBufferT(); x.Description = DemarshalSaHpiTextBufferT(); x.DateTime = DemarshalSaHpiTextBufferT(); x.MajorVersion = DemarshalSaHpiUint32T(); x.MinorVersion = DemarshalSaHpiUint32T(); x.AuxVersion = DemarshalSaHpiUint32T(); return x; } public SaHpiFumiLogicalBankInfoT DemarshalSaHpiFumiLogicalBankInfoT() { SaHpiFumiLogicalBankInfoT x = new SaHpiFumiLogicalBankInfoT(); x.FirmwarePersistentLocationCount = DemarshalSaHpiUint8T(); x.BankStateFlags = DemarshalSaHpiFumiLogicalBankStateFlagsT(); x.PendingFwInstance = DemarshalSaHpiFumiFirmwareInstanceInfoT(); x.RollbackFwInstance = DemarshalSaHpiFumiFirmwareInstanceInfoT(); return x; } public SaHpiFumiLogicalComponentInfoT DemarshalSaHpiFumiLogicalComponentInfoT() { SaHpiFumiLogicalComponentInfoT x = new SaHpiFumiLogicalComponentInfoT(); x.EntryId = DemarshalSaHpiEntryIdT(); x.ComponentId = DemarshalSaHpiUint32T(); x.PendingFwInstance = DemarshalSaHpiFumiFirmwareInstanceInfoT(); x.RollbackFwInstance = DemarshalSaHpiFumiFirmwareInstanceInfoT(); x.ComponentFlags = DemarshalSaHpiUint32T(); return x; } public SaHpiFumiRecT DemarshalSaHpiFumiRecT() { SaHpiFumiRecT x = new SaHpiFumiRecT(); x.Num = DemarshalSaHpiFumiNumT(); x.AccessProt = DemarshalSaHpiFumiProtocolT(); x.Capability = DemarshalSaHpiFumiCapabilityT(); x.NumBanks = DemarshalSaHpiUint8T(); x.Oem = DemarshalSaHpiUint32T(); return x; } public SaHpiResourceEventT DemarshalSaHpiResourceEventT() { SaHpiResourceEventT x = new SaHpiResourceEventT(); x.ResourceEventType = DemarshalSaHpiResourceEventTypeT(); return x; } public SaHpiDomainEventT DemarshalSaHpiDomainEventT() { SaHpiDomainEventT x = new SaHpiDomainEventT(); x.Type = DemarshalSaHpiDomainEventTypeT(); x.DomainId = DemarshalSaHpiDomainIdT(); return x; } public SaHpiSensorEventT DemarshalSaHpiSensorEventT() { SaHpiSensorEventT x = new SaHpiSensorEventT(); x.SensorNum = DemarshalSaHpiSensorNumT(); x.SensorType = DemarshalSaHpiSensorTypeT(); x.EventCategory = DemarshalSaHpiEventCategoryT(); x.Assertion = DemarshalSaHpiBoolT(); x.EventState = DemarshalSaHpiEventStateT(); x.OptionalDataPresent = DemarshalSaHpiSensorOptionalDataT(); x.TriggerReading = DemarshalSaHpiSensorReadingT(); x.TriggerThreshold = DemarshalSaHpiSensorReadingT(); x.PreviousState = DemarshalSaHpiEventStateT(); x.CurrentState = DemarshalSaHpiEventStateT(); x.Oem = DemarshalSaHpiUint32T(); x.SensorSpecific = DemarshalSaHpiUint32T(); return x; } public SaHpiSensorEnableChangeEventT DemarshalSaHpiSensorEnableChangeEventT() { SaHpiSensorEnableChangeEventT x = new SaHpiSensorEnableChangeEventT(); x.SensorNum = DemarshalSaHpiSensorNumT(); x.SensorType = DemarshalSaHpiSensorTypeT(); x.EventCategory = DemarshalSaHpiEventCategoryT(); x.SensorEnable = DemarshalSaHpiBoolT(); x.SensorEventEnable = DemarshalSaHpiBoolT(); x.AssertEventMask = DemarshalSaHpiEventStateT(); x.DeassertEventMask = DemarshalSaHpiEventStateT(); x.OptionalDataPresent = DemarshalSaHpiSensorEnableOptDataT(); x.CurrentState = DemarshalSaHpiEventStateT(); x.CriticalAlarms = DemarshalSaHpiEventStateT(); x.MajorAlarms = DemarshalSaHpiEventStateT(); x.MinorAlarms = DemarshalSaHpiEventStateT(); return x; } public SaHpiHotSwapEventT DemarshalSaHpiHotSwapEventT() { SaHpiHotSwapEventT x = new SaHpiHotSwapEventT(); x.HotSwapState = DemarshalSaHpiHsStateT(); x.PreviousHotSwapState = DemarshalSaHpiHsStateT(); x.CauseOfStateChange = DemarshalSaHpiHsCauseOfStateChangeT(); return x; } public SaHpiWatchdogEventT DemarshalSaHpiWatchdogEventT() { SaHpiWatchdogEventT x = new SaHpiWatchdogEventT(); x.WatchdogNum = DemarshalSaHpiWatchdogNumT(); x.WatchdogAction = DemarshalSaHpiWatchdogActionEventT(); x.WatchdogPreTimerAction = DemarshalSaHpiWatchdogPretimerInterruptT(); x.WatchdogUse = DemarshalSaHpiWatchdogTimerUseT(); return x; } public SaHpiHpiSwEventT DemarshalSaHpiHpiSwEventT() { SaHpiHpiSwEventT x = new SaHpiHpiSwEventT(); x.MId = DemarshalSaHpiManufacturerIdT(); x.Type = DemarshalSaHpiSwEventTypeT(); x.EventData = DemarshalSaHpiTextBufferT(); return x; } public SaHpiOemEventT DemarshalSaHpiOemEventT() { SaHpiOemEventT x = new SaHpiOemEventT(); x.MId = DemarshalSaHpiManufacturerIdT(); x.OemEventData = DemarshalSaHpiTextBufferT(); return x; } public SaHpiUserEventT DemarshalSaHpiUserEventT() { SaHpiUserEventT x = new SaHpiUserEventT(); x.UserEventData = DemarshalSaHpiTextBufferT(); return x; } public SaHpiDimiEventT DemarshalSaHpiDimiEventT() { SaHpiDimiEventT x = new SaHpiDimiEventT(); x.DimiNum = DemarshalSaHpiDimiNumT(); x.TestNum = DemarshalSaHpiDimiTestNumT(); x.DimiTestRunStatus = DemarshalSaHpiDimiTestRunStatusT(); x.DimiTestPercentCompleted = DemarshalSaHpiDimiTestPercentCompletedT(); return x; } public SaHpiDimiUpdateEventT DemarshalSaHpiDimiUpdateEventT() { SaHpiDimiUpdateEventT x = new SaHpiDimiUpdateEventT(); x.DimiNum = DemarshalSaHpiDimiNumT(); return x; } public SaHpiFumiEventT DemarshalSaHpiFumiEventT() { SaHpiFumiEventT x = new SaHpiFumiEventT(); x.FumiNum = DemarshalSaHpiFumiNumT(); x.BankNum = DemarshalSaHpiUint8T(); x.UpgradeStatus = DemarshalSaHpiFumiUpgradeStatusT(); return x; } public SaHpiEventUnionT DemarshalSaHpiEventUnionT( long mod ) { SaHpiEventUnionT x = new SaHpiEventUnionT(); if ( mod == HpiConst.SAHPI_ET_RESOURCE ) { x.ResourceEvent = DemarshalSaHpiResourceEventT(); } if ( mod == HpiConst.SAHPI_ET_DOMAIN ) { x.DomainEvent = DemarshalSaHpiDomainEventT(); } if ( mod == HpiConst.SAHPI_ET_SENSOR ) { x.SensorEvent = DemarshalSaHpiSensorEventT(); } if ( mod == HpiConst.SAHPI_ET_SENSOR_ENABLE_CHANGE ) { x.SensorEnableChangeEvent = DemarshalSaHpiSensorEnableChangeEventT(); } if ( mod == HpiConst.SAHPI_ET_HOTSWAP ) { x.HotSwapEvent = DemarshalSaHpiHotSwapEventT(); } if ( mod == HpiConst.SAHPI_ET_WATCHDOG ) { x.WatchdogEvent = DemarshalSaHpiWatchdogEventT(); } if ( mod == HpiConst.SAHPI_ET_HPI_SW ) { x.HpiSwEvent = DemarshalSaHpiHpiSwEventT(); } if ( mod == HpiConst.SAHPI_ET_OEM ) { x.OemEvent = DemarshalSaHpiOemEventT(); } if ( mod == HpiConst.SAHPI_ET_USER ) { x.UserEvent = DemarshalSaHpiUserEventT(); } if ( mod == HpiConst.SAHPI_ET_DIMI ) { x.DimiEvent = DemarshalSaHpiDimiEventT(); } if ( mod == HpiConst.SAHPI_ET_DIMI_UPDATE ) { x.DimiUpdateEvent = DemarshalSaHpiDimiUpdateEventT(); } if ( mod == HpiConst.SAHPI_ET_FUMI ) { x.FumiEvent = DemarshalSaHpiFumiEventT(); } return x; } public SaHpiEventT DemarshalSaHpiEventT() { SaHpiEventT x = new SaHpiEventT(); x.Source = DemarshalSaHpiResourceIdT(); x.EventType = DemarshalSaHpiEventTypeT(); x.Timestamp = DemarshalSaHpiTimeT(); x.Severity = DemarshalSaHpiSeverityT(); x.EventDataUnion = DemarshalSaHpiEventUnionT( x.EventType ); return x; } public SaHpiNameT DemarshalSaHpiNameT() { SaHpiNameT x = new SaHpiNameT(); x.Length = DemarshalSaHpiUint16T(); x.Value = DemarshalByteArray( HpiConst.SA_HPI_MAX_NAME_LENGTH ); return x; } public SaHpiConditionT DemarshalSaHpiConditionT() { SaHpiConditionT x = new SaHpiConditionT(); x.Type = DemarshalSaHpiStatusCondTypeT(); x.Entity = DemarshalSaHpiEntityPathT(); x.DomainId = DemarshalSaHpiDomainIdT(); x.ResourceId = DemarshalSaHpiResourceIdT(); x.SensorNum = DemarshalSaHpiSensorNumT(); x.EventState = DemarshalSaHpiEventStateT(); x.Name = DemarshalSaHpiNameT(); x.Mid = DemarshalSaHpiManufacturerIdT(); x.Data = DemarshalSaHpiTextBufferT(); return x; } public SaHpiAnnouncementT DemarshalSaHpiAnnouncementT() { SaHpiAnnouncementT x = new SaHpiAnnouncementT(); x.EntryId = DemarshalSaHpiEntryIdT(); x.Timestamp = DemarshalSaHpiTimeT(); x.AddedByUser = DemarshalSaHpiBoolT(); x.Severity = DemarshalSaHpiSeverityT(); x.Acknowledged = DemarshalSaHpiBoolT(); x.StatusCond = DemarshalSaHpiConditionT(); return x; } public SaHpiAnnunciatorRecT DemarshalSaHpiAnnunciatorRecT() { SaHpiAnnunciatorRecT x = new SaHpiAnnunciatorRecT(); x.AnnunciatorNum = DemarshalSaHpiAnnunciatorNumT(); x.AnnunciatorType = DemarshalSaHpiAnnunciatorTypeT(); x.ModeReadOnly = DemarshalSaHpiBoolT(); x.MaxConditions = DemarshalSaHpiUint32T(); x.Oem = DemarshalSaHpiUint32T(); return x; } public SaHpiRdrTypeUnionT DemarshalSaHpiRdrTypeUnionT( long mod ) { SaHpiRdrTypeUnionT x = new SaHpiRdrTypeUnionT(); if ( mod == HpiConst.SAHPI_CTRL_RDR ) { x.CtrlRec = DemarshalSaHpiCtrlRecT(); } if ( mod == HpiConst.SAHPI_SENSOR_RDR ) { x.SensorRec = DemarshalSaHpiSensorRecT(); } if ( mod == HpiConst.SAHPI_INVENTORY_RDR ) { x.InventoryRec = DemarshalSaHpiInventoryRecT(); } if ( mod == HpiConst.SAHPI_WATCHDOG_RDR ) { x.WatchdogRec = DemarshalSaHpiWatchdogRecT(); } if ( mod == HpiConst.SAHPI_ANNUNCIATOR_RDR ) { x.AnnunciatorRec = DemarshalSaHpiAnnunciatorRecT(); } if ( mod == HpiConst.SAHPI_DIMI_RDR ) { x.DimiRec = DemarshalSaHpiDimiRecT(); } if ( mod == HpiConst.SAHPI_FUMI_RDR ) { x.FumiRec = DemarshalSaHpiFumiRecT(); } return x; } public SaHpiRdrT DemarshalSaHpiRdrT() { SaHpiRdrT x = new SaHpiRdrT(); x.RecordId = DemarshalSaHpiEntryIdT(); x.RdrType = DemarshalSaHpiRdrTypeT(); x.Entity = DemarshalSaHpiEntityPathT(); x.IsFru = DemarshalSaHpiBoolT(); x.RdrTypeUnion = DemarshalSaHpiRdrTypeUnionT( x.RdrType ); x.IdString = DemarshalSaHpiTextBufferT(); return x; } public SaHpiLoadIdT DemarshalSaHpiLoadIdT() { SaHpiLoadIdT x = new SaHpiLoadIdT(); x.LoadNumber = DemarshalSaHpiLoadNumberT(); x.LoadName = DemarshalSaHpiTextBufferT(); return x; } public SaHpiResourceInfoT DemarshalSaHpiResourceInfoT() { SaHpiResourceInfoT x = new SaHpiResourceInfoT(); x.ResourceRev = DemarshalSaHpiUint8T(); x.SpecificVer = DemarshalSaHpiUint8T(); x.DeviceSupport = DemarshalSaHpiUint8T(); x.ManufacturerId = DemarshalSaHpiManufacturerIdT(); x.ProductId = DemarshalSaHpiUint16T(); x.FirmwareMajorRev = DemarshalSaHpiUint8T(); x.FirmwareMinorRev = DemarshalSaHpiUint8T(); x.AuxFirmwareRev = DemarshalSaHpiUint8T(); x.Guid = DemarshalByteArray( HpiConst.SAHPI_GUID_LENGTH ); return x; } public SaHpiRptEntryT DemarshalSaHpiRptEntryT() { SaHpiRptEntryT x = new SaHpiRptEntryT(); x.EntryId = DemarshalSaHpiEntryIdT(); x.ResourceId = DemarshalSaHpiResourceIdT(); x.ResourceInfo = DemarshalSaHpiResourceInfoT(); x.ResourceEntity = DemarshalSaHpiEntityPathT(); x.ResourceCapabilities = DemarshalSaHpiCapabilitiesT(); x.HotSwapCapabilities = DemarshalSaHpiHsCapabilitiesT(); x.ResourceSeverity = DemarshalSaHpiSeverityT(); x.ResourceFailed = DemarshalSaHpiBoolT(); x.ResourceTag = DemarshalSaHpiTextBufferT(); return x; } public SaHpiDomainInfoT DemarshalSaHpiDomainInfoT() { SaHpiDomainInfoT x = new SaHpiDomainInfoT(); x.DomainId = DemarshalSaHpiDomainIdT(); x.DomainCapabilities = DemarshalSaHpiDomainCapabilitiesT(); x.IsPeer = DemarshalSaHpiBoolT(); x.DomainTag = DemarshalSaHpiTextBufferT(); x.DrtUpdateCount = DemarshalSaHpiUint32T(); x.DrtUpdateTimestamp = DemarshalSaHpiTimeT(); x.RptUpdateCount = DemarshalSaHpiUint32T(); x.RptUpdateTimestamp = DemarshalSaHpiTimeT(); x.DatUpdateCount = DemarshalSaHpiUint32T(); x.DatUpdateTimestamp = DemarshalSaHpiTimeT(); x.ActiveAlarms = DemarshalSaHpiUint32T(); x.CriticalAlarms = DemarshalSaHpiUint32T(); x.MajorAlarms = DemarshalSaHpiUint32T(); x.MinorAlarms = DemarshalSaHpiUint32T(); x.DatUserAlarmLimit = DemarshalSaHpiUint32T(); x.DatOverflow = DemarshalSaHpiBoolT(); x.Guid = DemarshalByteArray( HpiConst.SAHPI_GUID_LENGTH ); return x; } public SaHpiDrtEntryT DemarshalSaHpiDrtEntryT() { SaHpiDrtEntryT x = new SaHpiDrtEntryT(); x.EntryId = DemarshalSaHpiEntryIdT(); x.DomainId = DemarshalSaHpiDomainIdT(); x.IsPeer = DemarshalSaHpiBoolT(); return x; } public SaHpiAlarmT DemarshalSaHpiAlarmT() { SaHpiAlarmT x = new SaHpiAlarmT(); x.AlarmId = DemarshalSaHpiAlarmIdT(); x.Timestamp = DemarshalSaHpiTimeT(); x.Severity = DemarshalSaHpiSeverityT(); x.Acknowledged = DemarshalSaHpiBoolT(); x.AlarmCond = DemarshalSaHpiConditionT(); return x; } public SaHpiEventLogInfoT DemarshalSaHpiEventLogInfoT() { SaHpiEventLogInfoT x = new SaHpiEventLogInfoT(); x.Entries = DemarshalSaHpiUint32T(); x.Size = DemarshalSaHpiUint32T(); x.UserEventMaxSize = DemarshalSaHpiUint32T(); x.UpdateTimestamp = DemarshalSaHpiTimeT(); x.CurrentTime = DemarshalSaHpiTimeT(); x.Enabled = DemarshalSaHpiBoolT(); x.OverflowFlag = DemarshalSaHpiBoolT(); x.OverflowResetable = DemarshalSaHpiBoolT(); x.OverflowAction = DemarshalSaHpiEventLogOverflowActionT(); return x; } public SaHpiEventLogEntryT DemarshalSaHpiEventLogEntryT() { SaHpiEventLogEntryT x = new SaHpiEventLogEntryT(); x.EntryId = DemarshalSaHpiEventLogEntryIdT(); x.Timestamp = DemarshalSaHpiTimeT(); x.Event = DemarshalSaHpiEventT(); return x; } }; }; // namespace openhpi }; // namespace org openhpi-3.6.1/baselibs/csharp/openhpi_baselib/Hpi.cs0000644000175100017510000001214312575647300021423 0ustar mohanmohan/* -*- c# -*- * * Copyright (C) 2012, Pigeon Point Systems * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ using System; namespace org { namespace openhpi { /********************************************************** * HPI API * Specific functions that were hard to auto-generate. * So they were written manually. *********************************************************/ public static partial class Api { public static long saHpiSessionOpen( long DomainId, out long SessionId, Object SecurityParams ) { long rv; bool rc; SessionId = 0; if ( SecurityParams != null ) { return HpiConst.SA_ERR_HPI_INVALID_PARAMS; } HpiSession s = HpiCore.CreateSession( DomainId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_DOMAIN; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { HpiCore.RemoveSession( s ); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiDomainIdT( s.GetRemoteDid() ); rc = m.Interchange( OhpiConst.RPC_SAHPI_SESSION_OPEN ); if ( !rc ) { m.Close(); HpiCore.RemoveSession( s ); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { SessionId = m.DemarshalSaHpiSessionIdT(); s.SetRemoteSid( SessionId ); SessionId = s.GetLocalSid(); } s.PutMarshal( m ); if ( rv != HpiConst.SA_OK ) { HpiCore.RemoveSession( s ); } return rv; } public static long saHpiSessionClose( long SessionId ) { long rv; bool rc; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); rc = m.Interchange( OhpiConst.RPC_SAHPI_SESSION_CLOSE ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); if ( rv == HpiConst.SA_OK ) { HpiCore.RemoveSession( s ); } return rv; } public static long saHpiMyEntityPathGet( long SessionId, out SaHpiEntityPathT EntityPath ) { EntityPath = null; HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } EntityPath = HpiCore.GetMyEntity(); if ( EntityPath == null ) { return HpiConst.SA_ERR_HPI_UNKNOWN; } return HpiConst.SA_OK; } public static long saHpiDimiTestStart( long SessionId, long ResourceId, long DimiNum, long TestNum, long NumberOfParams, SaHpiDimiTestVariableParamsT[] ParamsList ) { long rv; bool rc; if ( NumberOfParams != 0 ) { if ( ParamsList == null ) { return HpiConst.SA_ERR_HPI_INVALID_PARAMS; } if ( NumberOfParams > ParamsList.Length ) { return HpiConst.SA_ERR_HPI_INVALID_PARAMS; } for ( int i = 0; i < NumberOfParams; ++i ) { rc = HpiUtil.Check( ParamsList[i] ); if ( !rc ) { return HpiConst.SA_ERR_HPI_INVALID_PARAMS; } } } HpiSession s = HpiCore.GetSession( SessionId ); if ( s == null ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.GetMarshal(); if ( m == null ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } m.MarshalSaHpiSessionIdT( s.GetRemoteSid() ); m.MarshalSaHpiResourceIdT( ResourceId ); m.MarshalSaHpiDimiNumT( DimiNum ); m.MarshalSaHpiDimiTestNumT( TestNum ); m.MarshalSaHpiUint8T( NumberOfParams ); for ( int i = 0; i < NumberOfParams; ++i ) { m.MarshalSaHpiDimiTestVariableParamsT( ParamsList[i] ); } rc = m.Interchange( OhpiConst.RPC_SAHPI_DIMI_TEST_START ); if ( !rc ) { m.Close(); return HpiConst.SA_ERR_HPI_NO_RESPONSE; } rv = m.DemarshalSaErrorT(); if ( rv == HpiConst.SA_OK ) { // No output arguments } s.PutMarshal( m ); return rv; } }; }; // namespace openhpi }; // namespace org openhpi-3.6.1/baselibs/csharp/openhpi_baselib/HpiIterators.cs0000644000175100017510000004516412575647300023331 0ustar mohanmohan/* -*- c# -*- * * Copyright (C) 2012, Pigeon Point Systems * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ using System; using System.Collections.Generic; namespace org { namespace openhpi { /********************************************************** * HPI Utility Functions: Iterators *********************************************************/ public static class HpiIterators { /*********************************************************** * Helper functions * TODO - move to HpiUtils? **********************************************************/ private static SaHpiConditionT NewCondition() { return new SaHpiConditionT { Type = HpiConst.SAHPI_STATUS_COND_TYPE_USER, Entity = HpiUtil.MakeUnspecifiedSaHpiEntityPathT(), DomainId = HpiConst.SAHPI_UNSPECIFIED_DOMAIN_ID, ResourceId = HpiConst.SAHPI_UNSPECIFIED_RESOURCE_ID, SensorNum = HpiConst.SAHPI_ENTRY_UNSPECIFIED, EventState = HpiConst.SAHPI_ES_UNSPECIFIED, Name = new SaHpiNameT { Length = 0, Value = new byte[HpiConst.SA_HPI_MAX_NAME_LENGTH], }, Mid = HpiConst.SAHPI_MANUFACTURER_ID_UNSPECIFIED, Data = HpiUtil.ToSaHpiTextBufferT( "" ), }; } public static SaHpiAlarmT NewAlarm( long id, long timestamp ) { return new SaHpiAlarmT { AlarmId = id, Timestamp = timestamp, Severity = HpiConst.SAHPI_ALL_SEVERITIES, Acknowledged = HpiConst.SAHPI_FALSE, AlarmCond = NewCondition(), }; } public static SaHpiAnnouncementT NewAnnouncement( long id, long timestamp ) { return new SaHpiAnnouncementT { EntryId = id, Timestamp = timestamp, AddedByUser = HpiConst.SAHPI_TRUE, Severity = HpiConst.SAHPI_ALL_SEVERITIES, Acknowledged = HpiConst.SAHPI_FALSE, StatusCond = NewCondition(), }; } /*********************************************************** * Iterate over DRT **********************************************************/ public static IEnumerable Drt( long sid ) { long eid = HpiConst.SAHPI_FIRST_ENTRY; long next_eid; SaHpiDrtEntryT drte; do { long rv = Api.saHpiDrtEntryGet( sid, eid, out next_eid, out drte ); if ( ( eid == HpiConst.SAHPI_FIRST_ENTRY ) && ( rv == HpiConst.SA_ERR_HPI_NOT_PRESENT ) ) { yield break; } if ( rv != HpiConst.SA_OK ) { yield break; } eid = next_eid; yield return drte; } while ( eid != HpiConst.SAHPI_LAST_ENTRY ); } /*********************************************************** * Iterate over DAT **********************************************************/ public static IEnumerable Dat( long sid, long severity = HpiConst.SAHPI_ALL_SEVERITIES, long unacknowledged_only = HpiConst.SAHPI_FALSE ) { long id = HpiConst.SAHPI_FIRST_ENTRY; long timestamp = 0; do { SaHpiAlarmT a = NewAlarm( id, timestamp ); long rv = Api.saHpiAlarmGetNext( sid, severity, unacknowledged_only, ref a ); if ( rv == HpiConst.SA_ERR_HPI_NOT_PRESENT ) { yield break; } if ( rv != HpiConst.SA_OK ) { yield break; } id = a.AlarmId; timestamp = a.Timestamp; yield return a; } while ( id != HpiConst.SAHPI_LAST_ENTRY ); } /*********************************************************** * Iterate over Event Log **********************************************************/ public class EventLogEntryEx { public SaHpiEventLogEntryT EventLogEntry; public SaHpiRdrT Rdr; public SaHpiRptEntryT RptEntry; }; public static IEnumerable EventLogEntries( long sid, long rid, bool readforward = true ) { long eid = readforward ? HpiConst.SAHPI_OLDEST_ENTRY : HpiConst.SAHPI_NEWEST_ENTRY; long prev_eid, next_eid; do { EventLogEntryEx ex = new EventLogEntryEx(); long rv = Api.saHpiEventLogEntryGet( sid, rid, eid, out prev_eid, out next_eid, out ex.EventLogEntry, out ex.Rdr, out ex.RptEntry ); if ( rv == HpiConst.SA_ERR_HPI_NOT_PRESENT ) { yield break; } if ( rv != HpiConst.SA_OK ) { yield break; } eid = readforward ? next_eid : prev_eid; yield return ex; } while ( eid != HpiConst.SAHPI_NO_MORE_ENTRIES ); } /*********************************************************** * Iterate over entity resource ids **********************************************************/ public static IEnumerable EntityResourceIds( long sid, SaHpiEntityPathT ep ) { long id = HpiConst.SAHPI_FIRST_ENTRY; do { long rid; long instrid; long rptcnt; long rv = Api.saHpiGetIdByEntityPath( sid, ep, HpiConst.SAHPI_NO_RECORD, ref id, out rid, out instrid, out rptcnt ); if ( ( id == HpiConst.SAHPI_FIRST_ENTRY ) && ( rv == HpiConst.SA_ERR_HPI_NOT_PRESENT ) ) { yield break; } if ( rv != HpiConst.SA_OK ) { yield break; } yield return rid; } while ( id != HpiConst.SAHPI_LAST_ENTRY ); } /*********************************************************** * Iterate over entity instrument ids **********************************************************/ public class ResourceIdInstrumentId { public long ResourceId; public long InstrumentId; }; public static IEnumerable EntityInstrumentIds( long sid, SaHpiEntityPathT ep, long rdrtype ) { long id = HpiConst.SAHPI_FIRST_ENTRY; do { ResourceIdInstrumentId ri = new ResourceIdInstrumentId(); long rptcnt; long rv = Api.saHpiGetIdByEntityPath( sid, ep, rdrtype, ref id, out ri.ResourceId, out ri.InstrumentId, out rptcnt ); if ( ( id == HpiConst.SAHPI_FIRST_ENTRY ) && ( rv == HpiConst.SA_ERR_HPI_NOT_PRESENT ) ) { yield break; } if ( rv != HpiConst.SA_OK ) { yield break; } yield return ri; } while ( id != HpiConst.SAHPI_LAST_ENTRY ); } /*********************************************************** * Iterate over child entities **********************************************************/ public static IEnumerable ChildEntities( long sid, SaHpiEntityPathT parent_ep ) { long id = HpiConst.SAHPI_FIRST_ENTRY; do { long rptcnt; SaHpiEntityPathT child_ep; long rv = Api.saHpiGetChildEntityPath( sid, parent_ep, ref id, out child_ep, out rptcnt ); if ( ( id == HpiConst.SAHPI_FIRST_ENTRY ) && ( rv == HpiConst.SA_ERR_HPI_NOT_PRESENT ) ) { yield break; } if ( rv != HpiConst.SA_OK ) { yield break; } yield return child_ep; } while ( id != HpiConst.SAHPI_LAST_ENTRY ); } /*********************************************************** * Iterate over RPT **********************************************************/ public static IEnumerable Rpt( long sid ) { long eid = HpiConst.SAHPI_FIRST_ENTRY; long next_eid; do { SaHpiRptEntryT rpte; long rv = Api.saHpiRptEntryGet( sid, eid, out next_eid, out rpte ); if ( ( eid == HpiConst.SAHPI_FIRST_ENTRY ) && ( rv == HpiConst.SA_ERR_HPI_NOT_PRESENT ) ) { yield break; } if ( rv != HpiConst.SA_OK ) { yield break; } eid = next_eid; yield return rpte; } while ( eid != HpiConst.SAHPI_LAST_ENTRY ); } /*********************************************************** * Iterate over RDRs **********************************************************/ public static IEnumerable Rdrs( long sid, long rid ) { long eid = HpiConst.SAHPI_FIRST_ENTRY; long next_eid; do { SaHpiRdrT rdr; long rv = Api.saHpiRdrGet( sid, rid, eid, out next_eid, out rdr ); if ( ( eid == HpiConst.SAHPI_FIRST_ENTRY ) && ( rv == HpiConst.SA_ERR_HPI_NOT_PRESENT ) ) { yield break; } if ( rv != HpiConst.SA_OK ) { yield break; } eid = next_eid; yield return rdr; } while ( eid != HpiConst.SAHPI_LAST_ENTRY ); } /*********************************************************** * Iterate over Idr Areas **********************************************************/ public static IEnumerable IdrAreaHeaders( long sid, long rid, long idrid, long atype = HpiConst.SAHPI_IDR_AREATYPE_UNSPECIFIED ) { long aid = HpiConst.SAHPI_FIRST_ENTRY; long next_aid; do { SaHpiIdrAreaHeaderT ahdr; long rv = Api.saHpiIdrAreaHeaderGet( sid, rid, idrid, atype, aid, out next_aid, out ahdr ); if ( ( aid == HpiConst.SAHPI_FIRST_ENTRY ) && ( rv == HpiConst.SA_ERR_HPI_NOT_PRESENT ) ) { yield break; } if ( rv != HpiConst.SA_OK ) { yield break; } aid = next_aid; yield return ahdr; } while ( aid != HpiConst.SAHPI_LAST_ENTRY ); } /*********************************************************** * Iterate over Area Fields **********************************************************/ public static IEnumerable IdrAreaFields( long sid, long rid, long idrid, long aid, long ftype = HpiConst.SAHPI_IDR_FIELDTYPE_UNSPECIFIED ) { long fid = HpiConst.SAHPI_FIRST_ENTRY; long next_fid; do { SaHpiIdrFieldT f; long rv = Api.saHpiIdrFieldGet( sid, rid, idrid, aid, ftype, fid, out next_fid, out f ); if ( ( aid == HpiConst.SAHPI_FIRST_ENTRY ) && ( rv == HpiConst.SA_ERR_HPI_NOT_PRESENT ) ) { yield break; } if ( rv != HpiConst.SA_OK ) { yield break; } fid = next_fid; yield return f; } while ( aid != HpiConst.SAHPI_LAST_ENTRY ); } /*********************************************************** * Iterate over annuncuator announcements **********************************************************/ public static IEnumerable Announcements( long sid, long rid, long annnum, long severity = HpiConst.SAHPI_ALL_SEVERITIES, long unacknowledged_only = HpiConst.SAHPI_FALSE ) { long id = HpiConst.SAHPI_FIRST_ENTRY; long timestamp = 0; do { SaHpiAnnouncementT a = NewAnnouncement( id, timestamp ); long rv = Api.saHpiAnnunciatorGetNext( sid, rid, annnum, severity, unacknowledged_only, ref a ); if ( rv == HpiConst.SA_ERR_HPI_NOT_PRESENT ) { yield break; } if ( rv != HpiConst.SA_OK ) { yield break; } id = a.EntryId; timestamp = a.Timestamp; yield return a; } while ( id != HpiConst.SAHPI_LAST_ENTRY ); } /*********************************************************** * Iterate over FUMI Source Components **********************************************************/ public static IEnumerable FumiSourceComponents( long sid, long rid, long fuminum, long banknum ) { long eid = HpiConst.SAHPI_FIRST_ENTRY; long next_eid; do { SaHpiFumiComponentInfoT info; long rv = Api.saHpiFumiSourceComponentInfoGet( sid, rid, fuminum, banknum, eid, out next_eid, out info ); if ( ( eid == HpiConst.SAHPI_FIRST_ENTRY ) && ( rv == HpiConst.SA_ERR_HPI_NOT_PRESENT ) ) { yield break; } if ( rv != HpiConst.SA_OK ) { yield break; } eid = next_eid; yield return info; } while ( eid != HpiConst.SAHPI_LAST_ENTRY ); } /*********************************************************** * Iterate over FUMI Target Components **********************************************************/ public static IEnumerable FumiTargetComponents( long sid, long rid, long fuminum, long banknum ) { long eid = HpiConst.SAHPI_FIRST_ENTRY; long next_eid; do { SaHpiFumiComponentInfoT info; long rv = Api.saHpiFumiTargetComponentInfoGet( sid, rid, fuminum, banknum, eid, out next_eid, out info ); if ( ( eid == HpiConst.SAHPI_FIRST_ENTRY ) && ( rv == HpiConst.SA_ERR_HPI_NOT_PRESENT ) ) { yield break; } if ( rv != HpiConst.SA_OK ) { yield break; } eid = next_eid; yield return info; } while ( eid != HpiConst.SAHPI_LAST_ENTRY ); } /*********************************************************** * Iterate over FUMI Logical Target Components **********************************************************/ public static IEnumerable FumiLogicalTargetComponents( long sid, long rid, long fuminum ) { long eid = HpiConst.SAHPI_FIRST_ENTRY; long next_eid; do { SaHpiFumiLogicalComponentInfoT info; long rv = Api.saHpiFumiLogicalTargetComponentInfoGet( sid, rid, fuminum, eid, out next_eid, out info ); if ( ( eid == HpiConst.SAHPI_FIRST_ENTRY ) && ( rv == HpiConst.SA_ERR_HPI_NOT_PRESENT ) ) { yield break; } if ( rv != HpiConst.SA_OK ) { yield break; } eid = next_eid; yield return info; } while ( eid != HpiConst.SAHPI_LAST_ENTRY ); } }; // class HpiIterators }; // namespace openhpi }; // namespace org openhpi-3.6.1/baselibs/csharp/openhpi_baselib/OhpiDataTypes.cs0000644000175100017510000002642012575647300023424 0ustar mohanmohan/* -*- c# -*- * * Copyright (C) 2012, Pigeon Point Systems * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ using System.Collections.Generic; namespace org { namespace openhpi { /********************************************************** * OHPI Constants *********************************************************/ public static class OhpiConst { /********************************************************** * OHPI RPC IDs *********************************************************/ public const int RPC_SAHPI_NULL = 0; public const int RPC_SAHPI_SESSION_OPEN = 1; public const int RPC_SAHPI_SESSION_CLOSE = 2; public const int RPC_SAHPI_DISCOVER = 3; public const int RPC_SAHPI_DOMAIN_INFO_GET = 4; public const int RPC_SAHPI_DRT_ENTRY_GET = 5; public const int RPC_SAHPI_DOMAIN_TAG_SET = 6; public const int RPC_SAHPI_RPT_ENTRY_GET = 7; public const int RPC_SAHPI_RPT_ENTRY_GET_BY_RESOURCE_ID = 8; public const int RPC_SAHPI_RESOURCE_SEVERITY_SET = 9; public const int RPC_SAHPI_RESOURCE_TAG_SET = 10; public const int RPC_SAHPI_RESOURCE_ID_GET = 11; public const int RPC_SAHPI_GET_ID_BY_ENTITY_PATH = 12; public const int RPC_SAHPI_GET_CHILD_ENTITY_PATH = 13; public const int RPC_SAHPI_RESOURCE_FAILED_REMOVE = 14; public const int RPC_SAHPI_EVENT_LOG_INFO_GET = 15; public const int RPC_SAHPI_EVENT_LOG_CAPABILITIES_GET = 16; public const int RPC_SAHPI_EVENT_LOG_ENTRY_GET = 17; public const int RPC_SAHPI_EVENT_LOG_ENTRY_ADD = 18; public const int RPC_SAHPI_EVENT_LOG_CLEAR = 19; public const int RPC_SAHPI_EVENT_LOG_TIME_GET = 20; public const int RPC_SAHPI_EVENT_LOG_TIME_SET = 21; public const int RPC_SAHPI_EVENT_LOG_STATE_GET = 22; public const int RPC_SAHPI_EVENT_LOG_STATE_SET = 23; public const int RPC_SAHPI_EVENT_LOG_OVERFLOW_RESET = 24; public const int RPC_SAHPI_SUBSCRIBE = 25; public const int RPC_SAHPI_UNSUBSCRIBE = 26; public const int RPC_SAHPI_EVENT_GET = 27; public const int RPC_SAHPI_EVENT_ADD = 28; public const int RPC_SAHPI_ALARM_GET_NEXT = 29; public const int RPC_SAHPI_ALARM_GET = 30; public const int RPC_SAHPI_ALARM_ACKNOWLEDGE = 31; public const int RPC_SAHPI_ALARM_ADD = 32; public const int RPC_SAHPI_ALARM_DELETE = 33; public const int RPC_SAHPI_RDR_GET = 34; public const int RPC_SAHPI_RDR_GET_BY_INSTRUMENT_ID = 35; public const int RPC_SAHPI_SENSOR_READING_GET = 36; public const int RPC_SAHPI_SENSOR_THRESHOLDS_GET = 37; public const int RPC_SAHPI_SENSOR_THRESHOLDS_SET = 38; public const int RPC_SAHPI_SENSOR_TYPE_GET = 39; public const int RPC_SAHPI_SENSOR_ENABLE_GET = 40; public const int RPC_SAHPI_SENSOR_ENABLE_SET = 41; public const int RPC_SAHPI_SENSOR_EVENT_ENABLE_GET = 42; public const int RPC_SAHPI_SENSOR_EVENT_ENABLE_SET = 43; public const int RPC_SAHPI_SENSOR_EVENT_MASKS_GET = 44; public const int RPC_SAHPI_SENSOR_EVENT_MASKS_SET = 45; public const int RPC_SAHPI_CONTROL_TYPE_GET = 46; public const int RPC_SAHPI_CONTROL_GET = 47; public const int RPC_SAHPI_CONTROL_SET = 48; public const int RPC_SAHPI_IDR_INFO_GET = 49; public const int RPC_SAHPI_IDR_AREA_HEADER_GET = 50; public const int RPC_SAHPI_IDR_AREA_ADD = 51; public const int RPC_SAHPI_IDR_AREA_ADD_BY_ID = 52; public const int RPC_SAHPI_IDR_AREA_DELETE = 53; public const int RPC_SAHPI_IDR_FIELD_GET = 54; public const int RPC_SAHPI_IDR_FIELD_ADD = 55; public const int RPC_SAHPI_IDR_FIELD_ADD_BY_ID = 56; public const int RPC_SAHPI_IDR_FIELD_SET = 57; public const int RPC_SAHPI_IDR_FIELD_DELETE = 58; public const int RPC_SAHPI_WATCHDOG_TIMER_GET = 59; public const int RPC_SAHPI_WATCHDOG_TIMER_SET = 60; public const int RPC_SAHPI_WATCHDOG_TIMER_RESET = 61; public const int RPC_SAHPI_ANNUNCIATOR_GET_NEXT = 62; public const int RPC_SAHPI_ANNUNCIATOR_GET = 63; public const int RPC_SAHPI_ANNUNCIATOR_ACKNOWLEDGE = 64; public const int RPC_SAHPI_ANNUNCIATOR_ADD = 65; public const int RPC_SAHPI_ANNUNCIATOR_DELETE = 66; public const int RPC_SAHPI_ANNUNCIATOR_MODE_GET = 67; public const int RPC_SAHPI_ANNUNCIATOR_MODE_SET = 68; public const int RPC_SAHPI_DIMI_INFO_GET = 69; public const int RPC_SAHPI_DIMI_TEST_INFO_GET = 70; public const int RPC_SAHPI_DIMI_TEST_READINESS_GET = 71; public const int RPC_SAHPI_DIMI_TEST_START = 72; public const int RPC_SAHPI_DIMI_TEST_CANCEL = 73; public const int RPC_SAHPI_DIMI_TEST_STATUS_GET = 74; public const int RPC_SAHPI_DIMI_TEST_RESULTS_GET = 75; public const int RPC_SAHPI_FUMI_SOURCE_SET = 76; public const int RPC_SAHPI_FUMI_SOURCE_INFO_VALIDATE_START = 77; public const int RPC_SAHPI_FUMI_SOURCE_INFO_GET = 78; public const int RPC_SAHPI_FUMI_TARGET_INFO_GET = 79; public const int RPC_SAHPI_FUMI_BACKUP_START = 80; public const int RPC_SAHPI_FUMI_BANK_BOOT_ORDER_SET = 81; public const int RPC_SAHPI_FUMI_BANK_COPY_START = 82; public const int RPC_SAHPI_FUMI_INSTALL_START = 83; public const int RPC_SAHPI_FUMI_UPGRADE_STATUS_GET = 84; public const int RPC_SAHPI_FUMI_TARGET_VERIFY_START = 85; public const int RPC_SAHPI_FUMI_UPGRADE_CANCEL = 86; public const int RPC_SAHPI_FUMI_ROLLBACK_START = 87; public const int RPC_SAHPI_FUMI_ACTIVATE = 88; public const int RPC_SAHPI_HOTSWAP_POLICY_CANCEL = 89; public const int RPC_SAHPI_RESOURCE_ACTIVE_SET = 90; public const int RPC_SAHPI_RESOURCE_INACTIVE_SET = 91; public const int RPC_SAHPI_AUTO_INSERT_TIMEOUT_GET = 92; public const int RPC_SAHPI_AUTO_INSERT_TIMEOUT_SET = 93; public const int RPC_SAHPI_AUTO_EXTRACT_TIMEOUT_GET = 94; public const int RPC_SAHPI_AUTO_EXTRACT_TIMEOUT_SET = 95; public const int RPC_SAHPI_HOTSWAP_STATE_GET = 96; public const int RPC_SAHPI_HOTSWAP_ACTION_REQUEST = 97; public const int RPC_SAHPI_HOTSWAP_INDICATOR_STATE_GET = 98; public const int RPC_SAHPI_HOTSWAP_INDICATOR_STATE_SET = 99; public const int RPC_SAHPI_PARM_CONTROL = 100; public const int RPC_SAHPI_RESOURCE_LOADID_GET = 101; public const int RPC_SAHPI_RESOURCE_LOADID_SET = 102; public const int RPC_SAHPI_RESOURCE_RESET_STATE_GET = 103; public const int RPC_SAHPI_RESOURCE_RESET_STATE_SET = 104; public const int RPC_SAHPI_RESOURCE_POWER_STATE_GET = 105; public const int RPC_SAHPI_RESOURCE_POWER_STATE_SET = 106; public const int RPC_OHPI_HANDLER_CREATE = 107; public const int RPC_OHPI_HANDLER_DESTROY = 108; public const int RPC_OHPI_HANDLER_INFO = 109; public const int RPC_OHPI_HANDLER_GET_NEXT = 110; public const int RPC_OHPI_HANDLER_FIND = 111; public const int RPC_OHPI_HANDLER_RETRY = 112; public const int RPC_OHPI_GLOBAL_PARAM_GET = 113; public const int RPC_OHPI_GLOBAL_PARAM_SET = 114; public const int RPC_OHPI_INJECT_EVENT = 115; public const int RPC_SAHPI_MY_ENTITY_PATH_GET = 116; public const int RPC_SAHPI_RDR_UPDATE_COUNT_GET = 117; public const int RPC_SAHPI_FUMI_SPEC_INFO_GET = 118; public const int RPC_SAHPI_FUMI_SERVICE_IMPACT_GET = 119; public const int RPC_SAHPI_FUMI_SOURCE_COMPONENT_INFO_GET = 120; public const int RPC_SAHPI_FUMI_TARGET_COMPONENT_INFO_GET = 121; public const int RPC_SAHPI_FUMI_LOGICAL_TARGET_INFO_GET = 122; public const int RPC_SAHPI_FUMI_LOGICAL_TARGET_COMPONENT_INFO_GET = 123; public const int RPC_SAHPI_FUMI_TARGET_VERIFY_MAIN_START = 124; public const int RPC_SAHPI_FUMI_AUTO_ROLLBACK_DISABLE_GET = 125; public const int RPC_SAHPI_FUMI_AUTO_ROLLBACK_DISABLE_SET = 126; public const int RPC_SAHPI_FUMI_ACTIVATE_START = 127; public const int RPC_SAHPI_FUMI_CLEANUP = 128; public const int DEFAULT_PORT = 4743; public const long DEFAULT_DOMAIN_ID = 0; public const int MAX_PLUGIN_NAME_LENGTH = 32; }; /********************************************************** * OHPI Complex Data Types *********************************************************/ /** * OHPI struct oHpiHandlerInfoT */ public class oHpiHandlerInfoT { public long id; // Array of MAX_PLUGIN_NAME_LENGTH elements public byte[] plugin_name; public SaHpiEntityPathT entity_root; public long load_failed; }; /** * OHPI struct oHpiHandlerConfigT */ public class oHpiHandlerConfigT { // List of ( name, value ) pairs // Both name and value are arrays if SAHPI_MAX_TEXT_BUFFER_LENGTH elements public List< KeyValuePair > items; }; }; // namespace openhpi }; // namespace org openhpi-3.6.1/baselibs/csharp/openhpi_baselib/OhpiMarshal.cs0000644000175100017510000000606112575647300023114 0ustar mohanmohan/* -*- c# -*- * * Copyright (C) 2012, Pigeon Point Systems * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ using System; using System.Collections.Generic; namespace org { namespace openhpi { /********************************************************** * OHPI Marshal *********************************************************/ internal class OhpiMarshal: HpiMarshalGen { /********************************************************** * Marshal: For OHPI Simple Data Types *********************************************************/ public void MarshaloHpiHandlerIdT( long x ) { MarshalSaHpiUint32T( x ); } public void MarshaloHpiGlobalParamTypeT( long x ) { MarshalEnum( x ); } /********************************************************** * Marshal: For OHPI Structs and Unions *********************************************************/ public void MarshaloHpiHandlerConfigT( oHpiHandlerConfigT x ) { MarshalSaHpiUint8T( x.items.Count ); foreach ( var kv in x.items ) { MarshalByteArray( kv.Key, HpiConst.SAHPI_MAX_TEXT_BUFFER_LENGTH ); MarshalByteArray( kv.Value, HpiConst.SAHPI_MAX_TEXT_BUFFER_LENGTH ); } } /********************************************************** * Demarshal: For OHPI Simple Data Types *********************************************************/ public long DemarshaloHpiHandlerIdT() { return DemarshalSaHpiUint32T(); } public long DemarshaloHpiGlobalParamTypeT() { return DemarshalEnum(); } /********************************************************** * Demarshal: For OHPI Structs and Unions *********************************************************/ public oHpiHandlerInfoT DemarshaloHpiHandlerInfoT() { oHpiHandlerInfoT x = new oHpiHandlerInfoT(); x.id = DemarshaloHpiHandlerIdT(); x.plugin_name = DemarshalByteArray( OhpiConst.MAX_PLUGIN_NAME_LENGTH ); x.entity_root = DemarshalSaHpiEntityPathT(); x.load_failed = DemarshalSaHpiInt32T(); return x; } public oHpiHandlerConfigT DemarshaloHpiHandlerConfigT() { oHpiHandlerConfigT x = new oHpiHandlerConfigT(); x.items = new List< KeyValuePair >(); long n = DemarshalSaHpiUint8T(); for ( int i = 0; i < n; ++i ) { byte[] name = DemarshalByteArray( HpiConst.SAHPI_MAX_TEXT_BUFFER_LENGTH ); byte[] val = DemarshalByteArray( HpiConst.SAHPI_MAX_TEXT_BUFFER_LENGTH ); x.items.Add( new KeyValuePair( name, val ) ); } return x; } }; }; // namespace openhpi }; // namespace org openhpi-3.6.1/baselibs/csharp/openhpi_baselib/OhpiIterators.cs0000644000175100017510000000304512575647300023500 0ustar mohanmohan/* -*- c# -*- * * Copyright (C) 2012, Pigeon Point Systems * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ using System; using System.Collections.Generic; namespace org { namespace openhpi { /********************************************************** * OHPI Utility Functions: Iterators *********************************************************/ public static class OhpiIterators { /********************************************************** * Iterate over Handler ids *********************************************************/ public static IEnumerable HandlerIds( long sid ) { long hid = HpiConst.SAHPI_FIRST_ENTRY; long next_hid; do { long rv = Api.oHpiHandlerGetNext( sid, hid, out next_hid ); if ( ( hid == HpiConst.SAHPI_FIRST_ENTRY ) && ( rv == HpiConst.SA_ERR_HPI_NOT_PRESENT ) ) { yield break; } if ( rv != HpiConst.SA_OK ) { yield break; } hid = next_hid; yield return hid; } while ( hid != HpiConst.SAHPI_LAST_ENTRY ); } }; // class OhpiIterators }; // namespace openhpi }; // namespace org openhpi-3.6.1/baselibs/csharp/openhpi_baselib/HpiUtilGen.cs0000644000175100017510000053546712575647300022736 0ustar mohanmohan/* -*- c# -*- * * Copyright (C) 2012, Pigeon Point Systems * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ using System; namespace org { namespace openhpi { /********************************************************** * HPI Utility Functions (auto-generated) *********************************************************/ public static partial class HpiUtil { /********************************************************** * Check Functions for HPI Complex Data Types *********************************************************/ /** * Check function for HPI struct SaHpiTextBufferT */ public static bool Check( SaHpiTextBufferT x ) { if ( x == null ) { return false; } if ( x.Data == null ) { return false; } if ( x.Data.Length != HpiConst.SAHPI_MAX_TEXT_BUFFER_LENGTH ) { return false; } return true; } /** * Check function for HPI struct SaHpiEntityT */ public static bool Check( SaHpiEntityT x ) { if ( x == null ) { return false; } return true; } /** * Check function for HPI struct SaHpiEntityPathT */ public static bool Check( SaHpiEntityPathT x ) { if ( x == null ) { return false; } if ( x.Entry == null ) { return false; } if ( x.Entry.Length != HpiConst.SAHPI_MAX_ENTITY_PATH ) { return false; } for ( int i = 0; i < HpiConst.SAHPI_MAX_ENTITY_PATH; ++i ) { if ( !Check( x.Entry[i] ) ) { return false; } } return true; } /** * Check function for HPI union SaHpiSensorReadingUnionT */ public static bool Check( SaHpiSensorReadingUnionT x, long mod ) { if ( x == null ) { return false; } if ( mod == HpiConst.SAHPI_SENSOR_READING_TYPE_BUFFER ) { if ( x.SensorBuffer == null ) { return false; } } if ( mod == HpiConst.SAHPI_SENSOR_READING_TYPE_BUFFER ) { if ( x.SensorBuffer.Length != HpiConst.SAHPI_SENSOR_BUFFER_LENGTH ) { return false; } } return true; } /** * Check function for HPI struct SaHpiSensorReadingT */ public static bool Check( SaHpiSensorReadingT x ) { if ( x == null ) { return false; } if ( !Check( x.Value, x.Type ) ) { return false; } return true; } /** * Check function for HPI struct SaHpiSensorThresholdsT */ public static bool Check( SaHpiSensorThresholdsT x ) { if ( x == null ) { return false; } if ( !Check( x.LowCritical ) ) { return false; } if ( !Check( x.LowMajor ) ) { return false; } if ( !Check( x.LowMinor ) ) { return false; } if ( !Check( x.UpCritical ) ) { return false; } if ( !Check( x.UpMajor ) ) { return false; } if ( !Check( x.UpMinor ) ) { return false; } if ( !Check( x.PosThdHysteresis ) ) { return false; } if ( !Check( x.NegThdHysteresis ) ) { return false; } return true; } /** * Check function for HPI struct SaHpiSensorRangeT */ public static bool Check( SaHpiSensorRangeT x ) { if ( x == null ) { return false; } if ( !Check( x.Max ) ) { return false; } if ( !Check( x.Min ) ) { return false; } if ( !Check( x.Nominal ) ) { return false; } if ( !Check( x.NormalMax ) ) { return false; } if ( !Check( x.NormalMin ) ) { return false; } return true; } /** * Check function for HPI struct SaHpiSensorDataFormatT */ public static bool Check( SaHpiSensorDataFormatT x ) { if ( x == null ) { return false; } if ( !Check( x.Range ) ) { return false; } return true; } /** * Check function for HPI struct SaHpiSensorThdDefnT */ public static bool Check( SaHpiSensorThdDefnT x ) { if ( x == null ) { return false; } return true; } /** * Check function for HPI struct SaHpiSensorRecT */ public static bool Check( SaHpiSensorRecT x ) { if ( x == null ) { return false; } if ( !Check( x.DataFormat ) ) { return false; } if ( !Check( x.ThresholdDefn ) ) { return false; } return true; } /** * Check function for HPI struct SaHpiCtrlStateStreamT */ public static bool Check( SaHpiCtrlStateStreamT x ) { if ( x == null ) { return false; } if ( x.Stream == null ) { return false; } if ( x.Stream.Length != HpiConst.SAHPI_CTRL_MAX_STREAM_LENGTH ) { return false; } return true; } /** * Check function for HPI struct SaHpiCtrlStateTextT */ public static bool Check( SaHpiCtrlStateTextT x ) { if ( x == null ) { return false; } if ( !Check( x.Text ) ) { return false; } return true; } /** * Check function for HPI struct SaHpiCtrlStateOemT */ public static bool Check( SaHpiCtrlStateOemT x ) { if ( x == null ) { return false; } if ( x.Body == null ) { return false; } if ( x.Body.Length != HpiConst.SAHPI_CTRL_MAX_OEM_BODY_LENGTH ) { return false; } return true; } /** * Check function for HPI union SaHpiCtrlStateUnionT */ public static bool Check( SaHpiCtrlStateUnionT x, long mod ) { if ( x == null ) { return false; } if ( mod == HpiConst.SAHPI_CTRL_TYPE_STREAM ) { if ( !Check( x.Stream ) ) { return false; } } if ( mod == HpiConst.SAHPI_CTRL_TYPE_TEXT ) { if ( !Check( x.Text ) ) { return false; } } if ( mod == HpiConst.SAHPI_CTRL_TYPE_OEM ) { if ( !Check( x.Oem ) ) { return false; } } return true; } /** * Check function for HPI struct SaHpiCtrlStateT */ public static bool Check( SaHpiCtrlStateT x ) { if ( x == null ) { return false; } if ( !Check( x.StateUnion, x.Type ) ) { return false; } return true; } /** * Check function for HPI struct SaHpiCtrlRecDigitalT */ public static bool Check( SaHpiCtrlRecDigitalT x ) { if ( x == null ) { return false; } return true; } /** * Check function for HPI struct SaHpiCtrlRecDiscreteT */ public static bool Check( SaHpiCtrlRecDiscreteT x ) { if ( x == null ) { return false; } return true; } /** * Check function for HPI struct SaHpiCtrlRecAnalogT */ public static bool Check( SaHpiCtrlRecAnalogT x ) { if ( x == null ) { return false; } return true; } /** * Check function for HPI struct SaHpiCtrlRecStreamT */ public static bool Check( SaHpiCtrlRecStreamT x ) { if ( x == null ) { return false; } if ( !Check( x.Default ) ) { return false; } return true; } /** * Check function for HPI struct SaHpiCtrlRecTextT */ public static bool Check( SaHpiCtrlRecTextT x ) { if ( x == null ) { return false; } if ( !Check( x.Default ) ) { return false; } return true; } /** * Check function for HPI struct SaHpiCtrlRecOemT */ public static bool Check( SaHpiCtrlRecOemT x ) { if ( x == null ) { return false; } if ( x.ConfigData == null ) { return false; } if ( x.ConfigData.Length != HpiConst.SAHPI_CTRL_OEM_CONFIG_LENGTH ) { return false; } if ( !Check( x.Default ) ) { return false; } return true; } /** * Check function for HPI union SaHpiCtrlRecUnionT */ public static bool Check( SaHpiCtrlRecUnionT x, long mod ) { if ( x == null ) { return false; } if ( mod == HpiConst.SAHPI_CTRL_TYPE_DIGITAL ) { if ( !Check( x.Digital ) ) { return false; } } if ( mod == HpiConst.SAHPI_CTRL_TYPE_DISCRETE ) { if ( !Check( x.Discrete ) ) { return false; } } if ( mod == HpiConst.SAHPI_CTRL_TYPE_ANALOG ) { if ( !Check( x.Analog ) ) { return false; } } if ( mod == HpiConst.SAHPI_CTRL_TYPE_STREAM ) { if ( !Check( x.Stream ) ) { return false; } } if ( mod == HpiConst.SAHPI_CTRL_TYPE_TEXT ) { if ( !Check( x.Text ) ) { return false; } } if ( mod == HpiConst.SAHPI_CTRL_TYPE_OEM ) { if ( !Check( x.Oem ) ) { return false; } } return true; } /** * Check function for HPI struct SaHpiCtrlDefaultModeT */ public static bool Check( SaHpiCtrlDefaultModeT x ) { if ( x == null ) { return false; } return true; } /** * Check function for HPI struct SaHpiCtrlRecT */ public static bool Check( SaHpiCtrlRecT x ) { if ( x == null ) { return false; } if ( !Check( x.TypeUnion, x.Type ) ) { return false; } if ( !Check( x.DefaultMode ) ) { return false; } return true; } /** * Check function for HPI struct SaHpiIdrFieldT */ public static bool Check( SaHpiIdrFieldT x ) { if ( x == null ) { return false; } if ( !Check( x.Field ) ) { return false; } return true; } /** * Check function for HPI struct SaHpiIdrAreaHeaderT */ public static bool Check( SaHpiIdrAreaHeaderT x ) { if ( x == null ) { return false; } return true; } /** * Check function for HPI struct SaHpiIdrInfoT */ public static bool Check( SaHpiIdrInfoT x ) { if ( x == null ) { return false; } return true; } /** * Check function for HPI struct SaHpiInventoryRecT */ public static bool Check( SaHpiInventoryRecT x ) { if ( x == null ) { return false; } return true; } /** * Check function for HPI struct SaHpiWatchdogT */ public static bool Check( SaHpiWatchdogT x ) { if ( x == null ) { return false; } return true; } /** * Check function for HPI struct SaHpiWatchdogRecT */ public static bool Check( SaHpiWatchdogRecT x ) { if ( x == null ) { return false; } return true; } /** * Check function for HPI struct SaHpiDimiTestAffectedEntityT */ public static bool Check( SaHpiDimiTestAffectedEntityT x ) { if ( x == null ) { return false; } if ( !Check( x.EntityImpacted ) ) { return false; } return true; } /** * Check function for HPI struct SaHpiDimiTestResultsT */ public static bool Check( SaHpiDimiTestResultsT x ) { if ( x == null ) { return false; } if ( !Check( x.TestResultString ) ) { return false; } return true; } /** * Check function for HPI union SaHpiDimiTestParamValueT */ public static bool Check( SaHpiDimiTestParamValueT x, long mod ) { if ( x == null ) { return false; } if ( mod == HpiConst.SAHPI_DIMITEST_PARAM_TYPE_TEXT ) { if ( !Check( x.paramtext ) ) { return false; } } return true; } /** * Check function for HPI union SaHpiDimiTestParameterValueUnionT */ public static bool Check( SaHpiDimiTestParameterValueUnionT x, long mod ) { if ( x == null ) { return false; } return true; } /** * Check function for HPI struct SaHpiDimiTestParamsDefinitionT */ public static bool Check( SaHpiDimiTestParamsDefinitionT x ) { if ( x == null ) { return false; } if ( x.ParamName == null ) { return false; } if ( x.ParamName.Length != HpiConst.SAHPI_DIMITEST_PARAM_NAME_LEN ) { return false; } if ( !Check( x.ParamInfo ) ) { return false; } if ( !Check( x.MinValue, x.ParamType ) ) { return false; } if ( !Check( x.MaxValue, x.ParamType ) ) { return false; } if ( !Check( x.DefaultParam, x.ParamType ) ) { return false; } return true; } /** * Check function for HPI struct SaHpiDimiTestT */ public static bool Check( SaHpiDimiTestT x ) { if ( x == null ) { return false; } if ( !Check( x.TestName ) ) { return false; } if ( x.EntitiesImpacted == null ) { return false; } if ( x.EntitiesImpacted.Length != HpiConst.SAHPI_DIMITEST_MAX_ENTITIESIMPACTED ) { return false; } for ( int i = 0; i < HpiConst.SAHPI_DIMITEST_MAX_ENTITIESIMPACTED; ++i ) { if ( !Check( x.EntitiesImpacted[i] ) ) { return false; } } if ( !Check( x.ServiceOS ) ) { return false; } if ( x.TestParameters == null ) { return false; } if ( x.TestParameters.Length != HpiConst.SAHPI_DIMITEST_MAX_PARAMETERS ) { return false; } for ( int i = 0; i < HpiConst.SAHPI_DIMITEST_MAX_PARAMETERS; ++i ) { if ( !Check( x.TestParameters[i] ) ) { return false; } } return true; } /** * Check function for HPI struct SaHpiDimiTestVariableParamsT */ public static bool Check( SaHpiDimiTestVariableParamsT x ) { if ( x == null ) { return false; } if ( x.ParamName == null ) { return false; } if ( x.ParamName.Length != HpiConst.SAHPI_DIMITEST_PARAM_NAME_LEN ) { return false; } if ( !Check( x.Value, x.ParamType ) ) { return false; } return true; } /** * Check function for HPI struct SaHpiDimiInfoT */ public static bool Check( SaHpiDimiInfoT x ) { if ( x == null ) { return false; } return true; } /** * Check function for HPI struct SaHpiDimiRecT */ public static bool Check( SaHpiDimiRecT x ) { if ( x == null ) { return false; } return true; } /** * Check function for HPI struct SaHpiFumiSafDefinedSpecInfoT */ public static bool Check( SaHpiFumiSafDefinedSpecInfoT x ) { if ( x == null ) { return false; } return true; } /** * Check function for HPI struct SaHpiFumiOemDefinedSpecInfoT */ public static bool Check( SaHpiFumiOemDefinedSpecInfoT x ) { if ( x == null ) { return false; } if ( x.Body == null ) { return false; } if ( x.Body.Length != HpiConst.SAHPI_FUMI_MAX_OEM_BODY_LENGTH ) { return false; } return true; } /** * Check function for HPI union SaHpiFumiSpecInfoTypeUnionT */ public static bool Check( SaHpiFumiSpecInfoTypeUnionT x, long mod ) { if ( x == null ) { return false; } if ( mod == HpiConst.SAHPI_FUMI_SPEC_INFO_SAF_DEFINED ) { if ( !Check( x.SafDefined ) ) { return false; } } if ( mod == HpiConst.SAHPI_FUMI_SPEC_INFO_OEM_DEFINED ) { if ( !Check( x.OemDefined ) ) { return false; } } return true; } /** * Check function for HPI struct SaHpiFumiSpecInfoT */ public static bool Check( SaHpiFumiSpecInfoT x ) { if ( x == null ) { return false; } if ( !Check( x.SpecInfoTypeUnion, x.SpecInfoType ) ) { return false; } return true; } /** * Check function for HPI struct SaHpiFumiFirmwareInstanceInfoT */ public static bool Check( SaHpiFumiFirmwareInstanceInfoT x ) { if ( x == null ) { return false; } if ( !Check( x.Identifier ) ) { return false; } if ( !Check( x.Description ) ) { return false; } if ( !Check( x.DateTime ) ) { return false; } return true; } /** * Check function for HPI struct SaHpiFumiImpactedEntityT */ public static bool Check( SaHpiFumiImpactedEntityT x ) { if ( x == null ) { return false; } if ( !Check( x.ImpactedEntity ) ) { return false; } return true; } /** * Check function for HPI struct SaHpiFumiServiceImpactDataT */ public static bool Check( SaHpiFumiServiceImpactDataT x ) { if ( x == null ) { return false; } if ( x.ImpactedEntities == null ) { return false; } if ( x.ImpactedEntities.Length != HpiConst.SAHPI_FUMI_MAX_ENTITIES_IMPACTED ) { return false; } for ( int i = 0; i < HpiConst.SAHPI_FUMI_MAX_ENTITIES_IMPACTED; ++i ) { if ( !Check( x.ImpactedEntities[i] ) ) { return false; } } return true; } /** * Check function for HPI struct SaHpiFumiSourceInfoT */ public static bool Check( SaHpiFumiSourceInfoT x ) { if ( x == null ) { return false; } if ( !Check( x.SourceUri ) ) { return false; } if ( !Check( x.Identifier ) ) { return false; } if ( !Check( x.Description ) ) { return false; } if ( !Check( x.DateTime ) ) { return false; } return true; } /** * Check function for HPI struct SaHpiFumiComponentInfoT */ public static bool Check( SaHpiFumiComponentInfoT x ) { if ( x == null ) { return false; } if ( !Check( x.MainFwInstance ) ) { return false; } return true; } /** * Check function for HPI struct SaHpiFumiBankInfoT */ public static bool Check( SaHpiFumiBankInfoT x ) { if ( x == null ) { return false; } if ( !Check( x.Identifier ) ) { return false; } if ( !Check( x.Description ) ) { return false; } if ( !Check( x.DateTime ) ) { return false; } return true; } /** * Check function for HPI struct SaHpiFumiLogicalBankInfoT */ public static bool Check( SaHpiFumiLogicalBankInfoT x ) { if ( x == null ) { return false; } if ( !Check( x.PendingFwInstance ) ) { return false; } if ( !Check( x.RollbackFwInstance ) ) { return false; } return true; } /** * Check function for HPI struct SaHpiFumiLogicalComponentInfoT */ public static bool Check( SaHpiFumiLogicalComponentInfoT x ) { if ( x == null ) { return false; } if ( !Check( x.PendingFwInstance ) ) { return false; } if ( !Check( x.RollbackFwInstance ) ) { return false; } return true; } /** * Check function for HPI struct SaHpiFumiRecT */ public static bool Check( SaHpiFumiRecT x ) { if ( x == null ) { return false; } return true; } /** * Check function for HPI struct SaHpiResourceEventT */ public static bool Check( SaHpiResourceEventT x ) { if ( x == null ) { return false; } return true; } /** * Check function for HPI struct SaHpiDomainEventT */ public static bool Check( SaHpiDomainEventT x ) { if ( x == null ) { return false; } return true; } /** * Check function for HPI struct SaHpiSensorEventT */ public static bool Check( SaHpiSensorEventT x ) { if ( x == null ) { return false; } if ( !Check( x.TriggerReading ) ) { return false; } if ( !Check( x.TriggerThreshold ) ) { return false; } return true; } /** * Check function for HPI struct SaHpiSensorEnableChangeEventT */ public static bool Check( SaHpiSensorEnableChangeEventT x ) { if ( x == null ) { return false; } return true; } /** * Check function for HPI struct SaHpiHotSwapEventT */ public static bool Check( SaHpiHotSwapEventT x ) { if ( x == null ) { return false; } return true; } /** * Check function for HPI struct SaHpiWatchdogEventT */ public static bool Check( SaHpiWatchdogEventT x ) { if ( x == null ) { return false; } return true; } /** * Check function for HPI struct SaHpiHpiSwEventT */ public static bool Check( SaHpiHpiSwEventT x ) { if ( x == null ) { return false; } if ( !Check( x.EventData ) ) { return false; } return true; } /** * Check function for HPI struct SaHpiOemEventT */ public static bool Check( SaHpiOemEventT x ) { if ( x == null ) { return false; } if ( !Check( x.OemEventData ) ) { return false; } return true; } /** * Check function for HPI struct SaHpiUserEventT */ public static bool Check( SaHpiUserEventT x ) { if ( x == null ) { return false; } if ( !Check( x.UserEventData ) ) { return false; } return true; } /** * Check function for HPI struct SaHpiDimiEventT */ public static bool Check( SaHpiDimiEventT x ) { if ( x == null ) { return false; } return true; } /** * Check function for HPI struct SaHpiDimiUpdateEventT */ public static bool Check( SaHpiDimiUpdateEventT x ) { if ( x == null ) { return false; } return true; } /** * Check function for HPI struct SaHpiFumiEventT */ public static bool Check( SaHpiFumiEventT x ) { if ( x == null ) { return false; } return true; } /** * Check function for HPI union SaHpiEventUnionT */ public static bool Check( SaHpiEventUnionT x, long mod ) { if ( x == null ) { return false; } if ( mod == HpiConst.SAHPI_ET_RESOURCE ) { if ( !Check( x.ResourceEvent ) ) { return false; } } if ( mod == HpiConst.SAHPI_ET_DOMAIN ) { if ( !Check( x.DomainEvent ) ) { return false; } } if ( mod == HpiConst.SAHPI_ET_SENSOR ) { if ( !Check( x.SensorEvent ) ) { return false; } } if ( mod == HpiConst.SAHPI_ET_SENSOR_ENABLE_CHANGE ) { if ( !Check( x.SensorEnableChangeEvent ) ) { return false; } } if ( mod == HpiConst.SAHPI_ET_HOTSWAP ) { if ( !Check( x.HotSwapEvent ) ) { return false; } } if ( mod == HpiConst.SAHPI_ET_WATCHDOG ) { if ( !Check( x.WatchdogEvent ) ) { return false; } } if ( mod == HpiConst.SAHPI_ET_HPI_SW ) { if ( !Check( x.HpiSwEvent ) ) { return false; } } if ( mod == HpiConst.SAHPI_ET_OEM ) { if ( !Check( x.OemEvent ) ) { return false; } } if ( mod == HpiConst.SAHPI_ET_USER ) { if ( !Check( x.UserEvent ) ) { return false; } } if ( mod == HpiConst.SAHPI_ET_DIMI ) { if ( !Check( x.DimiEvent ) ) { return false; } } if ( mod == HpiConst.SAHPI_ET_DIMI_UPDATE ) { if ( !Check( x.DimiUpdateEvent ) ) { return false; } } if ( mod == HpiConst.SAHPI_ET_FUMI ) { if ( !Check( x.FumiEvent ) ) { return false; } } return true; } /** * Check function for HPI struct SaHpiEventT */ public static bool Check( SaHpiEventT x ) { if ( x == null ) { return false; } if ( !Check( x.EventDataUnion, x.EventType ) ) { return false; } return true; } /** * Check function for HPI struct SaHpiNameT */ public static bool Check( SaHpiNameT x ) { if ( x == null ) { return false; } if ( x.Value == null ) { return false; } if ( x.Value.Length != HpiConst.SA_HPI_MAX_NAME_LENGTH ) { return false; } return true; } /** * Check function for HPI struct SaHpiConditionT */ public static bool Check( SaHpiConditionT x ) { if ( x == null ) { return false; } if ( !Check( x.Entity ) ) { return false; } if ( !Check( x.Name ) ) { return false; } if ( !Check( x.Data ) ) { return false; } return true; } /** * Check function for HPI struct SaHpiAnnouncementT */ public static bool Check( SaHpiAnnouncementT x ) { if ( x == null ) { return false; } if ( !Check( x.StatusCond ) ) { return false; } return true; } /** * Check function for HPI struct SaHpiAnnunciatorRecT */ public static bool Check( SaHpiAnnunciatorRecT x ) { if ( x == null ) { return false; } return true; } /** * Check function for HPI union SaHpiRdrTypeUnionT */ public static bool Check( SaHpiRdrTypeUnionT x, long mod ) { if ( x == null ) { return false; } if ( mod == HpiConst.SAHPI_CTRL_RDR ) { if ( !Check( x.CtrlRec ) ) { return false; } } if ( mod == HpiConst.SAHPI_SENSOR_RDR ) { if ( !Check( x.SensorRec ) ) { return false; } } if ( mod == HpiConst.SAHPI_INVENTORY_RDR ) { if ( !Check( x.InventoryRec ) ) { return false; } } if ( mod == HpiConst.SAHPI_WATCHDOG_RDR ) { if ( !Check( x.WatchdogRec ) ) { return false; } } if ( mod == HpiConst.SAHPI_ANNUNCIATOR_RDR ) { if ( !Check( x.AnnunciatorRec ) ) { return false; } } if ( mod == HpiConst.SAHPI_DIMI_RDR ) { if ( !Check( x.DimiRec ) ) { return false; } } if ( mod == HpiConst.SAHPI_FUMI_RDR ) { if ( !Check( x.FumiRec ) ) { return false; } } return true; } /** * Check function for HPI struct SaHpiRdrT */ public static bool Check( SaHpiRdrT x ) { if ( x == null ) { return false; } if ( !Check( x.Entity ) ) { return false; } if ( !Check( x.RdrTypeUnion, x.RdrType ) ) { return false; } if ( !Check( x.IdString ) ) { return false; } return true; } /** * Check function for HPI struct SaHpiLoadIdT */ public static bool Check( SaHpiLoadIdT x ) { if ( x == null ) { return false; } if ( !Check( x.LoadName ) ) { return false; } return true; } /** * Check function for HPI struct SaHpiResourceInfoT */ public static bool Check( SaHpiResourceInfoT x ) { if ( x == null ) { return false; } if ( x.Guid == null ) { return false; } if ( x.Guid.Length != HpiConst.SAHPI_GUID_LENGTH ) { return false; } return true; } /** * Check function for HPI struct SaHpiRptEntryT */ public static bool Check( SaHpiRptEntryT x ) { if ( x == null ) { return false; } if ( !Check( x.ResourceInfo ) ) { return false; } if ( !Check( x.ResourceEntity ) ) { return false; } if ( !Check( x.ResourceTag ) ) { return false; } return true; } /** * Check function for HPI struct SaHpiDomainInfoT */ public static bool Check( SaHpiDomainInfoT x ) { if ( x == null ) { return false; } if ( !Check( x.DomainTag ) ) { return false; } if ( x.Guid == null ) { return false; } if ( x.Guid.Length != HpiConst.SAHPI_GUID_LENGTH ) { return false; } return true; } /** * Check function for HPI struct SaHpiDrtEntryT */ public static bool Check( SaHpiDrtEntryT x ) { if ( x == null ) { return false; } return true; } /** * Check function for HPI struct SaHpiAlarmT */ public static bool Check( SaHpiAlarmT x ) { if ( x == null ) { return false; } if ( !Check( x.AlarmCond ) ) { return false; } return true; } /** * Check function for HPI struct SaHpiEventLogInfoT */ public static bool Check( SaHpiEventLogInfoT x ) { if ( x == null ) { return false; } return true; } /** * Check function for HPI struct SaHpiEventLogEntryT */ public static bool Check( SaHpiEventLogEntryT x ) { if ( x == null ) { return false; } if ( !Check( x.Event ) ) { return false; } return true; } /********************************************************** * Lookups for enums, errors, event categories... * Value -> Name (FromXXX) * Name -> Value (ToXXX) * NB: ToXXX throws FormatException if lookup fails *********************************************************/ /** * For SaHpiLanguageT */ public static string FromSaHpiLanguageT( long x ) { switch( x ) { case HpiConst.SAHPI_LANG_UNDEF: return "UNDEF"; case HpiConst.SAHPI_LANG_AFAR: return "AFAR"; case HpiConst.SAHPI_LANG_ABKHAZIAN: return "ABKHAZIAN"; case HpiConst.SAHPI_LANG_AFRIKAANS: return "AFRIKAANS"; case HpiConst.SAHPI_LANG_AMHARIC: return "AMHARIC"; case HpiConst.SAHPI_LANG_ARABIC: return "ARABIC"; case HpiConst.SAHPI_LANG_ASSAMESE: return "ASSAMESE"; case HpiConst.SAHPI_LANG_AYMARA: return "AYMARA"; case HpiConst.SAHPI_LANG_AZERBAIJANI: return "AZERBAIJANI"; case HpiConst.SAHPI_LANG_BASHKIR: return "BASHKIR"; case HpiConst.SAHPI_LANG_BYELORUSSIAN: return "BYELORUSSIAN"; case HpiConst.SAHPI_LANG_BULGARIAN: return "BULGARIAN"; case HpiConst.SAHPI_LANG_BIHARI: return "BIHARI"; case HpiConst.SAHPI_LANG_BISLAMA: return "BISLAMA"; case HpiConst.SAHPI_LANG_BENGALI: return "BENGALI"; case HpiConst.SAHPI_LANG_TIBETAN: return "TIBETAN"; case HpiConst.SAHPI_LANG_BRETON: return "BRETON"; case HpiConst.SAHPI_LANG_CATALAN: return "CATALAN"; case HpiConst.SAHPI_LANG_CORSICAN: return "CORSICAN"; case HpiConst.SAHPI_LANG_CZECH: return "CZECH"; case HpiConst.SAHPI_LANG_WELSH: return "WELSH"; case HpiConst.SAHPI_LANG_DANISH: return "DANISH"; case HpiConst.SAHPI_LANG_GERMAN: return "GERMAN"; case HpiConst.SAHPI_LANG_BHUTANI: return "BHUTANI"; case HpiConst.SAHPI_LANG_GREEK: return "GREEK"; case HpiConst.SAHPI_LANG_ENGLISH: return "ENGLISH"; case HpiConst.SAHPI_LANG_ESPERANTO: return "ESPERANTO"; case HpiConst.SAHPI_LANG_SPANISH: return "SPANISH"; case HpiConst.SAHPI_LANG_ESTONIAN: return "ESTONIAN"; case HpiConst.SAHPI_LANG_BASQUE: return "BASQUE"; case HpiConst.SAHPI_LANG_PERSIAN: return "PERSIAN"; case HpiConst.SAHPI_LANG_FINNISH: return "FINNISH"; case HpiConst.SAHPI_LANG_FIJI: return "FIJI"; case HpiConst.SAHPI_LANG_FAEROESE: return "FAEROESE"; case HpiConst.SAHPI_LANG_FRENCH: return "FRENCH"; case HpiConst.SAHPI_LANG_FRISIAN: return "FRISIAN"; case HpiConst.SAHPI_LANG_IRISH: return "IRISH"; case HpiConst.SAHPI_LANG_SCOTSGAELIC: return "SCOTSGAELIC"; case HpiConst.SAHPI_LANG_GALICIAN: return "GALICIAN"; case HpiConst.SAHPI_LANG_GUARANI: return "GUARANI"; case HpiConst.SAHPI_LANG_GUJARATI: return "GUJARATI"; case HpiConst.SAHPI_LANG_HAUSA: return "HAUSA"; case HpiConst.SAHPI_LANG_HINDI: return "HINDI"; case HpiConst.SAHPI_LANG_CROATIAN: return "CROATIAN"; case HpiConst.SAHPI_LANG_HUNGARIAN: return "HUNGARIAN"; case HpiConst.SAHPI_LANG_ARMENIAN: return "ARMENIAN"; case HpiConst.SAHPI_LANG_INTERLINGUA: return "INTERLINGUA"; case HpiConst.SAHPI_LANG_INTERLINGUE: return "INTERLINGUE"; case HpiConst.SAHPI_LANG_INUPIAK: return "INUPIAK"; case HpiConst.SAHPI_LANG_INDONESIAN: return "INDONESIAN"; case HpiConst.SAHPI_LANG_ICELANDIC: return "ICELANDIC"; case HpiConst.SAHPI_LANG_ITALIAN: return "ITALIAN"; case HpiConst.SAHPI_LANG_HEBREW: return "HEBREW"; case HpiConst.SAHPI_LANG_JAPANESE: return "JAPANESE"; case HpiConst.SAHPI_LANG_YIDDISH: return "YIDDISH"; case HpiConst.SAHPI_LANG_JAVANESE: return "JAVANESE"; case HpiConst.SAHPI_LANG_GEORGIAN: return "GEORGIAN"; case HpiConst.SAHPI_LANG_KAZAKH: return "KAZAKH"; case HpiConst.SAHPI_LANG_GREENLANDIC: return "GREENLANDIC"; case HpiConst.SAHPI_LANG_CAMBODIAN: return "CAMBODIAN"; case HpiConst.SAHPI_LANG_KANNADA: return "KANNADA"; case HpiConst.SAHPI_LANG_KOREAN: return "KOREAN"; case HpiConst.SAHPI_LANG_KASHMIRI: return "KASHMIRI"; case HpiConst.SAHPI_LANG_KURDISH: return "KURDISH"; case HpiConst.SAHPI_LANG_KIRGHIZ: return "KIRGHIZ"; case HpiConst.SAHPI_LANG_LATIN: return "LATIN"; case HpiConst.SAHPI_LANG_LINGALA: return "LINGALA"; case HpiConst.SAHPI_LANG_LAOTHIAN: return "LAOTHIAN"; case HpiConst.SAHPI_LANG_LITHUANIAN: return "LITHUANIAN"; case HpiConst.SAHPI_LANG_LATVIANLETTISH: return "LATVIANLETTISH"; case HpiConst.SAHPI_LANG_MALAGASY: return "MALAGASY"; case HpiConst.SAHPI_LANG_MAORI: return "MAORI"; case HpiConst.SAHPI_LANG_MACEDONIAN: return "MACEDONIAN"; case HpiConst.SAHPI_LANG_MALAYALAM: return "MALAYALAM"; case HpiConst.SAHPI_LANG_MONGOLIAN: return "MONGOLIAN"; case HpiConst.SAHPI_LANG_MOLDAVIAN: return "MOLDAVIAN"; case HpiConst.SAHPI_LANG_MARATHI: return "MARATHI"; case HpiConst.SAHPI_LANG_MALAY: return "MALAY"; case HpiConst.SAHPI_LANG_MALTESE: return "MALTESE"; case HpiConst.SAHPI_LANG_BURMESE: return "BURMESE"; case HpiConst.SAHPI_LANG_NAURU: return "NAURU"; case HpiConst.SAHPI_LANG_NEPALI: return "NEPALI"; case HpiConst.SAHPI_LANG_DUTCH: return "DUTCH"; case HpiConst.SAHPI_LANG_NORWEGIAN: return "NORWEGIAN"; case HpiConst.SAHPI_LANG_OCCITAN: return "OCCITAN"; case HpiConst.SAHPI_LANG_AFANOROMO: return "AFANOROMO"; case HpiConst.SAHPI_LANG_ORIYA: return "ORIYA"; case HpiConst.SAHPI_LANG_PUNJABI: return "PUNJABI"; case HpiConst.SAHPI_LANG_POLISH: return "POLISH"; case HpiConst.SAHPI_LANG_PASHTOPUSHTO: return "PASHTOPUSHTO"; case HpiConst.SAHPI_LANG_PORTUGUESE: return "PORTUGUESE"; case HpiConst.SAHPI_LANG_QUECHUA: return "QUECHUA"; case HpiConst.SAHPI_LANG_RHAETOROMANCE: return "RHAETOROMANCE"; case HpiConst.SAHPI_LANG_KIRUNDI: return "KIRUNDI"; case HpiConst.SAHPI_LANG_ROMANIAN: return "ROMANIAN"; case HpiConst.SAHPI_LANG_RUSSIAN: return "RUSSIAN"; case HpiConst.SAHPI_LANG_KINYARWANDA: return "KINYARWANDA"; case HpiConst.SAHPI_LANG_SANSKRIT: return "SANSKRIT"; case HpiConst.SAHPI_LANG_SINDHI: return "SINDHI"; case HpiConst.SAHPI_LANG_SANGRO: return "SANGRO"; case HpiConst.SAHPI_LANG_SERBOCROATIAN: return "SERBOCROATIAN"; case HpiConst.SAHPI_LANG_SINGHALESE: return "SINGHALESE"; case HpiConst.SAHPI_LANG_SLOVAK: return "SLOVAK"; case HpiConst.SAHPI_LANG_SLOVENIAN: return "SLOVENIAN"; case HpiConst.SAHPI_LANG_SAMOAN: return "SAMOAN"; case HpiConst.SAHPI_LANG_SHONA: return "SHONA"; case HpiConst.SAHPI_LANG_SOMALI: return "SOMALI"; case HpiConst.SAHPI_LANG_ALBANIAN: return "ALBANIAN"; case HpiConst.SAHPI_LANG_SERBIAN: return "SERBIAN"; case HpiConst.SAHPI_LANG_SISWATI: return "SISWATI"; case HpiConst.SAHPI_LANG_SESOTHO: return "SESOTHO"; case HpiConst.SAHPI_LANG_SUDANESE: return "SUDANESE"; case HpiConst.SAHPI_LANG_SWEDISH: return "SWEDISH"; case HpiConst.SAHPI_LANG_SWAHILI: return "SWAHILI"; case HpiConst.SAHPI_LANG_TAMIL: return "TAMIL"; case HpiConst.SAHPI_LANG_TELUGU: return "TELUGU"; case HpiConst.SAHPI_LANG_TAJIK: return "TAJIK"; case HpiConst.SAHPI_LANG_THAI: return "THAI"; case HpiConst.SAHPI_LANG_TIGRINYA: return "TIGRINYA"; case HpiConst.SAHPI_LANG_TURKMEN: return "TURKMEN"; case HpiConst.SAHPI_LANG_TAGALOG: return "TAGALOG"; case HpiConst.SAHPI_LANG_SETSWANA: return "SETSWANA"; case HpiConst.SAHPI_LANG_TONGA: return "TONGA"; case HpiConst.SAHPI_LANG_TURKISH: return "TURKISH"; case HpiConst.SAHPI_LANG_TSONGA: return "TSONGA"; case HpiConst.SAHPI_LANG_TATAR: return "TATAR"; case HpiConst.SAHPI_LANG_TWI: return "TWI"; case HpiConst.SAHPI_LANG_UKRAINIAN: return "UKRAINIAN"; case HpiConst.SAHPI_LANG_URDU: return "URDU"; case HpiConst.SAHPI_LANG_UZBEK: return "UZBEK"; case HpiConst.SAHPI_LANG_VIETNAMESE: return "VIETNAMESE"; case HpiConst.SAHPI_LANG_VOLAPUK: return "VOLAPUK"; case HpiConst.SAHPI_LANG_WOLOF: return "WOLOF"; case HpiConst.SAHPI_LANG_XHOSA: return "XHOSA"; case HpiConst.SAHPI_LANG_YORUBA: return "YORUBA"; case HpiConst.SAHPI_LANG_CHINESE: return "CHINESE"; case HpiConst.SAHPI_LANG_ZULU: return "ZULU"; default: return Convert.ToString( x ); } } public static long ToSaHpiLanguageT( string s ) { if ( s == "UNDEF" ) { return HpiConst.SAHPI_LANG_UNDEF; } if ( s == "AFAR" ) { return HpiConst.SAHPI_LANG_AFAR; } if ( s == "ABKHAZIAN" ) { return HpiConst.SAHPI_LANG_ABKHAZIAN; } if ( s == "AFRIKAANS" ) { return HpiConst.SAHPI_LANG_AFRIKAANS; } if ( s == "AMHARIC" ) { return HpiConst.SAHPI_LANG_AMHARIC; } if ( s == "ARABIC" ) { return HpiConst.SAHPI_LANG_ARABIC; } if ( s == "ASSAMESE" ) { return HpiConst.SAHPI_LANG_ASSAMESE; } if ( s == "AYMARA" ) { return HpiConst.SAHPI_LANG_AYMARA; } if ( s == "AZERBAIJANI" ) { return HpiConst.SAHPI_LANG_AZERBAIJANI; } if ( s == "BASHKIR" ) { return HpiConst.SAHPI_LANG_BASHKIR; } if ( s == "BYELORUSSIAN" ) { return HpiConst.SAHPI_LANG_BYELORUSSIAN; } if ( s == "BULGARIAN" ) { return HpiConst.SAHPI_LANG_BULGARIAN; } if ( s == "BIHARI" ) { return HpiConst.SAHPI_LANG_BIHARI; } if ( s == "BISLAMA" ) { return HpiConst.SAHPI_LANG_BISLAMA; } if ( s == "BENGALI" ) { return HpiConst.SAHPI_LANG_BENGALI; } if ( s == "TIBETAN" ) { return HpiConst.SAHPI_LANG_TIBETAN; } if ( s == "BRETON" ) { return HpiConst.SAHPI_LANG_BRETON; } if ( s == "CATALAN" ) { return HpiConst.SAHPI_LANG_CATALAN; } if ( s == "CORSICAN" ) { return HpiConst.SAHPI_LANG_CORSICAN; } if ( s == "CZECH" ) { return HpiConst.SAHPI_LANG_CZECH; } if ( s == "WELSH" ) { return HpiConst.SAHPI_LANG_WELSH; } if ( s == "DANISH" ) { return HpiConst.SAHPI_LANG_DANISH; } if ( s == "GERMAN" ) { return HpiConst.SAHPI_LANG_GERMAN; } if ( s == "BHUTANI" ) { return HpiConst.SAHPI_LANG_BHUTANI; } if ( s == "GREEK" ) { return HpiConst.SAHPI_LANG_GREEK; } if ( s == "ENGLISH" ) { return HpiConst.SAHPI_LANG_ENGLISH; } if ( s == "ESPERANTO" ) { return HpiConst.SAHPI_LANG_ESPERANTO; } if ( s == "SPANISH" ) { return HpiConst.SAHPI_LANG_SPANISH; } if ( s == "ESTONIAN" ) { return HpiConst.SAHPI_LANG_ESTONIAN; } if ( s == "BASQUE" ) { return HpiConst.SAHPI_LANG_BASQUE; } if ( s == "PERSIAN" ) { return HpiConst.SAHPI_LANG_PERSIAN; } if ( s == "FINNISH" ) { return HpiConst.SAHPI_LANG_FINNISH; } if ( s == "FIJI" ) { return HpiConst.SAHPI_LANG_FIJI; } if ( s == "FAEROESE" ) { return HpiConst.SAHPI_LANG_FAEROESE; } if ( s == "FRENCH" ) { return HpiConst.SAHPI_LANG_FRENCH; } if ( s == "FRISIAN" ) { return HpiConst.SAHPI_LANG_FRISIAN; } if ( s == "IRISH" ) { return HpiConst.SAHPI_LANG_IRISH; } if ( s == "SCOTSGAELIC" ) { return HpiConst.SAHPI_LANG_SCOTSGAELIC; } if ( s == "GALICIAN" ) { return HpiConst.SAHPI_LANG_GALICIAN; } if ( s == "GUARANI" ) { return HpiConst.SAHPI_LANG_GUARANI; } if ( s == "GUJARATI" ) { return HpiConst.SAHPI_LANG_GUJARATI; } if ( s == "HAUSA" ) { return HpiConst.SAHPI_LANG_HAUSA; } if ( s == "HINDI" ) { return HpiConst.SAHPI_LANG_HINDI; } if ( s == "CROATIAN" ) { return HpiConst.SAHPI_LANG_CROATIAN; } if ( s == "HUNGARIAN" ) { return HpiConst.SAHPI_LANG_HUNGARIAN; } if ( s == "ARMENIAN" ) { return HpiConst.SAHPI_LANG_ARMENIAN; } if ( s == "INTERLINGUA" ) { return HpiConst.SAHPI_LANG_INTERLINGUA; } if ( s == "INTERLINGUE" ) { return HpiConst.SAHPI_LANG_INTERLINGUE; } if ( s == "INUPIAK" ) { return HpiConst.SAHPI_LANG_INUPIAK; } if ( s == "INDONESIAN" ) { return HpiConst.SAHPI_LANG_INDONESIAN; } if ( s == "ICELANDIC" ) { return HpiConst.SAHPI_LANG_ICELANDIC; } if ( s == "ITALIAN" ) { return HpiConst.SAHPI_LANG_ITALIAN; } if ( s == "HEBREW" ) { return HpiConst.SAHPI_LANG_HEBREW; } if ( s == "JAPANESE" ) { return HpiConst.SAHPI_LANG_JAPANESE; } if ( s == "YIDDISH" ) { return HpiConst.SAHPI_LANG_YIDDISH; } if ( s == "JAVANESE" ) { return HpiConst.SAHPI_LANG_JAVANESE; } if ( s == "GEORGIAN" ) { return HpiConst.SAHPI_LANG_GEORGIAN; } if ( s == "KAZAKH" ) { return HpiConst.SAHPI_LANG_KAZAKH; } if ( s == "GREENLANDIC" ) { return HpiConst.SAHPI_LANG_GREENLANDIC; } if ( s == "CAMBODIAN" ) { return HpiConst.SAHPI_LANG_CAMBODIAN; } if ( s == "KANNADA" ) { return HpiConst.SAHPI_LANG_KANNADA; } if ( s == "KOREAN" ) { return HpiConst.SAHPI_LANG_KOREAN; } if ( s == "KASHMIRI" ) { return HpiConst.SAHPI_LANG_KASHMIRI; } if ( s == "KURDISH" ) { return HpiConst.SAHPI_LANG_KURDISH; } if ( s == "KIRGHIZ" ) { return HpiConst.SAHPI_LANG_KIRGHIZ; } if ( s == "LATIN" ) { return HpiConst.SAHPI_LANG_LATIN; } if ( s == "LINGALA" ) { return HpiConst.SAHPI_LANG_LINGALA; } if ( s == "LAOTHIAN" ) { return HpiConst.SAHPI_LANG_LAOTHIAN; } if ( s == "LITHUANIAN" ) { return HpiConst.SAHPI_LANG_LITHUANIAN; } if ( s == "LATVIANLETTISH" ) { return HpiConst.SAHPI_LANG_LATVIANLETTISH; } if ( s == "MALAGASY" ) { return HpiConst.SAHPI_LANG_MALAGASY; } if ( s == "MAORI" ) { return HpiConst.SAHPI_LANG_MAORI; } if ( s == "MACEDONIAN" ) { return HpiConst.SAHPI_LANG_MACEDONIAN; } if ( s == "MALAYALAM" ) { return HpiConst.SAHPI_LANG_MALAYALAM; } if ( s == "MONGOLIAN" ) { return HpiConst.SAHPI_LANG_MONGOLIAN; } if ( s == "MOLDAVIAN" ) { return HpiConst.SAHPI_LANG_MOLDAVIAN; } if ( s == "MARATHI" ) { return HpiConst.SAHPI_LANG_MARATHI; } if ( s == "MALAY" ) { return HpiConst.SAHPI_LANG_MALAY; } if ( s == "MALTESE" ) { return HpiConst.SAHPI_LANG_MALTESE; } if ( s == "BURMESE" ) { return HpiConst.SAHPI_LANG_BURMESE; } if ( s == "NAURU" ) { return HpiConst.SAHPI_LANG_NAURU; } if ( s == "NEPALI" ) { return HpiConst.SAHPI_LANG_NEPALI; } if ( s == "DUTCH" ) { return HpiConst.SAHPI_LANG_DUTCH; } if ( s == "NORWEGIAN" ) { return HpiConst.SAHPI_LANG_NORWEGIAN; } if ( s == "OCCITAN" ) { return HpiConst.SAHPI_LANG_OCCITAN; } if ( s == "AFANOROMO" ) { return HpiConst.SAHPI_LANG_AFANOROMO; } if ( s == "ORIYA" ) { return HpiConst.SAHPI_LANG_ORIYA; } if ( s == "PUNJABI" ) { return HpiConst.SAHPI_LANG_PUNJABI; } if ( s == "POLISH" ) { return HpiConst.SAHPI_LANG_POLISH; } if ( s == "PASHTOPUSHTO" ) { return HpiConst.SAHPI_LANG_PASHTOPUSHTO; } if ( s == "PORTUGUESE" ) { return HpiConst.SAHPI_LANG_PORTUGUESE; } if ( s == "QUECHUA" ) { return HpiConst.SAHPI_LANG_QUECHUA; } if ( s == "RHAETOROMANCE" ) { return HpiConst.SAHPI_LANG_RHAETOROMANCE; } if ( s == "KIRUNDI" ) { return HpiConst.SAHPI_LANG_KIRUNDI; } if ( s == "ROMANIAN" ) { return HpiConst.SAHPI_LANG_ROMANIAN; } if ( s == "RUSSIAN" ) { return HpiConst.SAHPI_LANG_RUSSIAN; } if ( s == "KINYARWANDA" ) { return HpiConst.SAHPI_LANG_KINYARWANDA; } if ( s == "SANSKRIT" ) { return HpiConst.SAHPI_LANG_SANSKRIT; } if ( s == "SINDHI" ) { return HpiConst.SAHPI_LANG_SINDHI; } if ( s == "SANGRO" ) { return HpiConst.SAHPI_LANG_SANGRO; } if ( s == "SERBOCROATIAN" ) { return HpiConst.SAHPI_LANG_SERBOCROATIAN; } if ( s == "SINGHALESE" ) { return HpiConst.SAHPI_LANG_SINGHALESE; } if ( s == "SLOVAK" ) { return HpiConst.SAHPI_LANG_SLOVAK; } if ( s == "SLOVENIAN" ) { return HpiConst.SAHPI_LANG_SLOVENIAN; } if ( s == "SAMOAN" ) { return HpiConst.SAHPI_LANG_SAMOAN; } if ( s == "SHONA" ) { return HpiConst.SAHPI_LANG_SHONA; } if ( s == "SOMALI" ) { return HpiConst.SAHPI_LANG_SOMALI; } if ( s == "ALBANIAN" ) { return HpiConst.SAHPI_LANG_ALBANIAN; } if ( s == "SERBIAN" ) { return HpiConst.SAHPI_LANG_SERBIAN; } if ( s == "SISWATI" ) { return HpiConst.SAHPI_LANG_SISWATI; } if ( s == "SESOTHO" ) { return HpiConst.SAHPI_LANG_SESOTHO; } if ( s == "SUDANESE" ) { return HpiConst.SAHPI_LANG_SUDANESE; } if ( s == "SWEDISH" ) { return HpiConst.SAHPI_LANG_SWEDISH; } if ( s == "SWAHILI" ) { return HpiConst.SAHPI_LANG_SWAHILI; } if ( s == "TAMIL" ) { return HpiConst.SAHPI_LANG_TAMIL; } if ( s == "TELUGU" ) { return HpiConst.SAHPI_LANG_TELUGU; } if ( s == "TAJIK" ) { return HpiConst.SAHPI_LANG_TAJIK; } if ( s == "THAI" ) { return HpiConst.SAHPI_LANG_THAI; } if ( s == "TIGRINYA" ) { return HpiConst.SAHPI_LANG_TIGRINYA; } if ( s == "TURKMEN" ) { return HpiConst.SAHPI_LANG_TURKMEN; } if ( s == "TAGALOG" ) { return HpiConst.SAHPI_LANG_TAGALOG; } if ( s == "SETSWANA" ) { return HpiConst.SAHPI_LANG_SETSWANA; } if ( s == "TONGA" ) { return HpiConst.SAHPI_LANG_TONGA; } if ( s == "TURKISH" ) { return HpiConst.SAHPI_LANG_TURKISH; } if ( s == "TSONGA" ) { return HpiConst.SAHPI_LANG_TSONGA; } if ( s == "TATAR" ) { return HpiConst.SAHPI_LANG_TATAR; } if ( s == "TWI" ) { return HpiConst.SAHPI_LANG_TWI; } if ( s == "UKRAINIAN" ) { return HpiConst.SAHPI_LANG_UKRAINIAN; } if ( s == "URDU" ) { return HpiConst.SAHPI_LANG_URDU; } if ( s == "UZBEK" ) { return HpiConst.SAHPI_LANG_UZBEK; } if ( s == "VIETNAMESE" ) { return HpiConst.SAHPI_LANG_VIETNAMESE; } if ( s == "VOLAPUK" ) { return HpiConst.SAHPI_LANG_VOLAPUK; } if ( s == "WOLOF" ) { return HpiConst.SAHPI_LANG_WOLOF; } if ( s == "XHOSA" ) { return HpiConst.SAHPI_LANG_XHOSA; } if ( s == "YORUBA" ) { return HpiConst.SAHPI_LANG_YORUBA; } if ( s == "CHINESE" ) { return HpiConst.SAHPI_LANG_CHINESE; } if ( s == "ZULU" ) { return HpiConst.SAHPI_LANG_ZULU; } throw new FormatException(); } /** * For SaHpiTextTypeT */ public static string FromSaHpiTextTypeT( long x ) { switch( x ) { case HpiConst.SAHPI_TL_TYPE_UNICODE: return "UNICODE"; case HpiConst.SAHPI_TL_TYPE_BCDPLUS: return "BCDPLUS"; case HpiConst.SAHPI_TL_TYPE_ASCII6: return "ASCII6"; case HpiConst.SAHPI_TL_TYPE_TEXT: return "TEXT"; case HpiConst.SAHPI_TL_TYPE_BINARY: return "BINARY"; default: return Convert.ToString( x ); } } public static long ToSaHpiTextTypeT( string s ) { if ( s == "UNICODE" ) { return HpiConst.SAHPI_TL_TYPE_UNICODE; } if ( s == "BCDPLUS" ) { return HpiConst.SAHPI_TL_TYPE_BCDPLUS; } if ( s == "ASCII6" ) { return HpiConst.SAHPI_TL_TYPE_ASCII6; } if ( s == "TEXT" ) { return HpiConst.SAHPI_TL_TYPE_TEXT; } if ( s == "BINARY" ) { return HpiConst.SAHPI_TL_TYPE_BINARY; } throw new FormatException(); } /** * For SaHpiEntityTypeT */ public static string FromSaHpiEntityTypeT( long x ) { switch( x ) { case HpiConst.SAHPI_ENT_UNSPECIFIED: return "UNSPECIFIED"; case HpiConst.SAHPI_ENT_OTHER: return "OTHER"; case HpiConst.SAHPI_ENT_UNKNOWN: return "UNKNOWN"; case HpiConst.SAHPI_ENT_PROCESSOR: return "PROCESSOR"; case HpiConst.SAHPI_ENT_DISK_BAY: return "DISK_BAY"; case HpiConst.SAHPI_ENT_PERIPHERAL_BAY: return "PERIPHERAL_BAY"; case HpiConst.SAHPI_ENT_SYS_MGMNT_MODULE: return "SYS_MGMNT_MODULE"; case HpiConst.SAHPI_ENT_SYSTEM_BOARD: return "SYSTEM_BOARD"; case HpiConst.SAHPI_ENT_MEMORY_MODULE: return "MEMORY_MODULE"; case HpiConst.SAHPI_ENT_PROCESSOR_MODULE: return "PROCESSOR_MODULE"; case HpiConst.SAHPI_ENT_POWER_SUPPLY: return "POWER_SUPPLY"; case HpiConst.SAHPI_ENT_ADD_IN_CARD: return "ADD_IN_CARD"; case HpiConst.SAHPI_ENT_FRONT_PANEL_BOARD: return "FRONT_PANEL_BOARD"; case HpiConst.SAHPI_ENT_BACK_PANEL_BOARD: return "BACK_PANEL_BOARD"; case HpiConst.SAHPI_ENT_POWER_SYSTEM_BOARD: return "POWER_SYSTEM_BOARD"; case HpiConst.SAHPI_ENT_DRIVE_BACKPLANE: return "DRIVE_BACKPLANE"; case HpiConst.SAHPI_ENT_SYS_EXPANSION_BOARD: return "SYS_EXPANSION_BOARD"; case HpiConst.SAHPI_ENT_OTHER_SYSTEM_BOARD: return "OTHER_SYSTEM_BOARD"; case HpiConst.SAHPI_ENT_PROCESSOR_BOARD: return "PROCESSOR_BOARD"; case HpiConst.SAHPI_ENT_POWER_UNIT: return "POWER_UNIT"; case HpiConst.SAHPI_ENT_POWER_MODULE: return "POWER_MODULE"; case HpiConst.SAHPI_ENT_POWER_MGMNT: return "POWER_MGMNT"; case HpiConst.SAHPI_ENT_CHASSIS_BACK_PANEL_BOARD: return "CHASSIS_BACK_PANEL_BOARD"; case HpiConst.SAHPI_ENT_SYSTEM_CHASSIS: return "SYSTEM_CHASSIS"; case HpiConst.SAHPI_ENT_SUB_CHASSIS: return "SUB_CHASSIS"; case HpiConst.SAHPI_ENT_OTHER_CHASSIS_BOARD: return "OTHER_CHASSIS_BOARD"; case HpiConst.SAHPI_ENT_DISK_DRIVE_BAY: return "DISK_DRIVE_BAY"; case HpiConst.SAHPI_ENT_PERIPHERAL_BAY_2: return "PERIPHERAL_BAY_2"; case HpiConst.SAHPI_ENT_DEVICE_BAY: return "DEVICE_BAY"; case HpiConst.SAHPI_ENT_COOLING_DEVICE: return "COOLING_DEVICE"; case HpiConst.SAHPI_ENT_COOLING_UNIT: return "COOLING_UNIT"; case HpiConst.SAHPI_ENT_INTERCONNECT: return "INTERCONNECT"; case HpiConst.SAHPI_ENT_MEMORY_DEVICE: return "MEMORY_DEVICE"; case HpiConst.SAHPI_ENT_SYS_MGMNT_SOFTWARE: return "SYS_MGMNT_SOFTWARE"; case HpiConst.SAHPI_ENT_BIOS: return "BIOS"; case HpiConst.SAHPI_ENT_OPERATING_SYSTEM: return "OPERATING_SYSTEM"; case HpiConst.SAHPI_ENT_SYSTEM_BUS: return "SYSTEM_BUS"; case HpiConst.SAHPI_ENT_GROUP: return "GROUP"; case HpiConst.SAHPI_ENT_REMOTE: return "REMOTE"; case HpiConst.SAHPI_ENT_EXTERNAL_ENVIRONMENT: return "EXTERNAL_ENVIRONMENT"; case HpiConst.SAHPI_ENT_BATTERY: return "BATTERY"; case HpiConst.SAHPI_ENT_PROCESSING_BLADE: return "PROCESSING_BLADE"; case HpiConst.SAHPI_ENT_CONNECTIVITY_SWITCH: return "CONNECTIVITY_SWITCH"; case HpiConst.SAHPI_ENT_PROCESSOR_MEMORY_MODULE: return "PROCESSOR_MEMORY_MODULE"; case HpiConst.SAHPI_ENT_IO_MODULE: return "IO_MODULE"; case HpiConst.SAHPI_ENT_PROCESSOR_IO_MODULE: return "PROCESSOR_IO_MODULE"; case HpiConst.SAHPI_ENT_MC_FIRMWARE: return "MC_FIRMWARE"; case HpiConst.SAHPI_ENT_IPMI_CHANNEL: return "IPMI_CHANNEL"; case HpiConst.SAHPI_ENT_PCI_BUS: return "PCI_BUS"; case HpiConst.SAHPI_ENT_PCI_EXPRESS_BUS: return "PCI_EXPRESS_BUS"; case HpiConst.SAHPI_ENT_SCSI_BUS: return "SCSI_BUS"; case HpiConst.SAHPI_ENT_SATA_BUS: return "SATA_BUS"; case HpiConst.SAHPI_ENT_PROC_FSB: return "PROC_FSB"; case HpiConst.SAHPI_ENT_CLOCK: return "CLOCK"; case HpiConst.SAHPI_ENT_SYSTEM_FIRMWARE: return "SYSTEM_FIRMWARE"; case HpiConst.SAHPI_ENT_CHASSIS_SPECIFIC: return "CHASSIS_SPECIFIC"; case HpiConst.SAHPI_ENT_CHASSIS_SPECIFIC01: return "CHASSIS_SPECIFIC01"; case HpiConst.SAHPI_ENT_CHASSIS_SPECIFIC02: return "CHASSIS_SPECIFIC02"; case HpiConst.SAHPI_ENT_CHASSIS_SPECIFIC03: return "CHASSIS_SPECIFIC03"; case HpiConst.SAHPI_ENT_CHASSIS_SPECIFIC04: return "CHASSIS_SPECIFIC04"; case HpiConst.SAHPI_ENT_CHASSIS_SPECIFIC05: return "CHASSIS_SPECIFIC05"; case HpiConst.SAHPI_ENT_CHASSIS_SPECIFIC06: return "CHASSIS_SPECIFIC06"; case HpiConst.SAHPI_ENT_CHASSIS_SPECIFIC07: return "CHASSIS_SPECIFIC07"; case HpiConst.SAHPI_ENT_CHASSIS_SPECIFIC08: return "CHASSIS_SPECIFIC08"; case HpiConst.SAHPI_ENT_CHASSIS_SPECIFIC09: return "CHASSIS_SPECIFIC09"; case HpiConst.SAHPI_ENT_CHASSIS_SPECIFIC10: return "CHASSIS_SPECIFIC10"; case HpiConst.SAHPI_ENT_CHASSIS_SPECIFIC11: return "CHASSIS_SPECIFIC11"; case HpiConst.SAHPI_ENT_CHASSIS_SPECIFIC12: return "CHASSIS_SPECIFIC12"; case HpiConst.SAHPI_ENT_CHASSIS_SPECIFIC13: return "CHASSIS_SPECIFIC13"; case HpiConst.SAHPI_ENT_BOARD_SET_SPECIFIC: return "BOARD_SET_SPECIFIC"; case HpiConst.SAHPI_ENT_OEM_SYSINT_SPECIFIC: return "OEM_SYSINT_SPECIFIC"; case HpiConst.SAHPI_ENT_ROOT: return "ROOT"; case HpiConst.SAHPI_ENT_RACK: return "RACK"; case HpiConst.SAHPI_ENT_SUBRACK: return "SUBRACK"; case HpiConst.SAHPI_ENT_COMPACTPCI_CHASSIS: return "COMPACTPCI_CHASSIS"; case HpiConst.SAHPI_ENT_ADVANCEDTCA_CHASSIS: return "ADVANCEDTCA_CHASSIS"; case HpiConst.SAHPI_ENT_RACK_MOUNTED_SERVER: return "RACK_MOUNTED_SERVER"; case HpiConst.SAHPI_ENT_SYSTEM_BLADE: return "SYSTEM_BLADE"; case HpiConst.SAHPI_ENT_SWITCH: return "SWITCH"; case HpiConst.SAHPI_ENT_SWITCH_BLADE: return "SWITCH_BLADE"; case HpiConst.SAHPI_ENT_SBC_BLADE: return "SBC_BLADE"; case HpiConst.SAHPI_ENT_IO_BLADE: return "IO_BLADE"; case HpiConst.SAHPI_ENT_DISK_BLADE: return "DISK_BLADE"; case HpiConst.SAHPI_ENT_DISK_DRIVE: return "DISK_DRIVE"; case HpiConst.SAHPI_ENT_FAN: return "FAN"; case HpiConst.SAHPI_ENT_POWER_DISTRIBUTION_UNIT: return "POWER_DISTRIBUTION_UNIT"; case HpiConst.SAHPI_ENT_SPEC_PROC_BLADE: return "SPEC_PROC_BLADE"; case HpiConst.SAHPI_ENT_IO_SUBBOARD: return "IO_SUBBOARD"; case HpiConst.SAHPI_ENT_SBC_SUBBOARD: return "SBC_SUBBOARD"; case HpiConst.SAHPI_ENT_ALARM_MANAGER: return "ALARM_MANAGER"; case HpiConst.SAHPI_ENT_SHELF_MANAGER: return "SHELF_MANAGER"; case HpiConst.SAHPI_ENT_DISPLAY_PANEL: return "DISPLAY_PANEL"; case HpiConst.SAHPI_ENT_SUBBOARD_CARRIER_BLADE: return "SUBBOARD_CARRIER_BLADE"; case HpiConst.SAHPI_ENT_PHYSICAL_SLOT: return "PHYSICAL_SLOT"; case HpiConst.SAHPI_ENT_PICMG_FRONT_BLADE: return "PICMG_FRONT_BLADE"; case HpiConst.SAHPI_ENT_SYSTEM_INVENTORY_DEVICE: return "SYSTEM_INVENTORY_DEVICE"; case HpiConst.SAHPI_ENT_FILTRATION_UNIT: return "FILTRATION_UNIT"; case HpiConst.SAHPI_ENT_AMC: return "AMC"; case HpiConst.SAHPI_ENT_BMC: return "BMC"; case HpiConst.SAHPI_ENT_IPMC: return "IPMC"; case HpiConst.SAHPI_ENT_MMC: return "MMC"; case HpiConst.SAHPI_ENT_SHMC: return "SHMC"; case HpiConst.SAHPI_ENT_CPLD: return "CPLD"; case HpiConst.SAHPI_ENT_EPLD: return "EPLD"; case HpiConst.SAHPI_ENT_FPGA: return "FPGA"; case HpiConst.SAHPI_ENT_DASD: return "DASD"; case HpiConst.SAHPI_ENT_NIC: return "NIC"; case HpiConst.SAHPI_ENT_DSP: return "DSP"; case HpiConst.SAHPI_ENT_UCODE: return "UCODE"; case HpiConst.SAHPI_ENT_NPU: return "NPU"; case HpiConst.SAHPI_ENT_OEM: return "OEM"; case HpiConst.SAHPI_ENT_INTERFACE: return "INTERFACE"; case HpiConst.SAHPI_ENT_MICROTCA_CHASSIS: return "MICROTCA_CHASSIS"; case HpiConst.SAHPI_ENT_CARRIER: return "CARRIER"; case HpiConst.SAHPI_ENT_CARRIER_MANAGER: return "CARRIER_MANAGER"; case HpiConst.SAHPI_ENT_CONFIG_DATA: return "CONFIG_DATA"; case HpiConst.SAHPI_ENT_INDICATOR: return "INDICATOR"; default: return Convert.ToString( x ); } } public static long ToSaHpiEntityTypeT( string s ) { if ( s == "UNSPECIFIED" ) { return HpiConst.SAHPI_ENT_UNSPECIFIED; } if ( s == "OTHER" ) { return HpiConst.SAHPI_ENT_OTHER; } if ( s == "UNKNOWN" ) { return HpiConst.SAHPI_ENT_UNKNOWN; } if ( s == "PROCESSOR" ) { return HpiConst.SAHPI_ENT_PROCESSOR; } if ( s == "DISK_BAY" ) { return HpiConst.SAHPI_ENT_DISK_BAY; } if ( s == "PERIPHERAL_BAY" ) { return HpiConst.SAHPI_ENT_PERIPHERAL_BAY; } if ( s == "SYS_MGMNT_MODULE" ) { return HpiConst.SAHPI_ENT_SYS_MGMNT_MODULE; } if ( s == "SYSTEM_BOARD" ) { return HpiConst.SAHPI_ENT_SYSTEM_BOARD; } if ( s == "MEMORY_MODULE" ) { return HpiConst.SAHPI_ENT_MEMORY_MODULE; } if ( s == "PROCESSOR_MODULE" ) { return HpiConst.SAHPI_ENT_PROCESSOR_MODULE; } if ( s == "POWER_SUPPLY" ) { return HpiConst.SAHPI_ENT_POWER_SUPPLY; } if ( s == "ADD_IN_CARD" ) { return HpiConst.SAHPI_ENT_ADD_IN_CARD; } if ( s == "FRONT_PANEL_BOARD" ) { return HpiConst.SAHPI_ENT_FRONT_PANEL_BOARD; } if ( s == "BACK_PANEL_BOARD" ) { return HpiConst.SAHPI_ENT_BACK_PANEL_BOARD; } if ( s == "POWER_SYSTEM_BOARD" ) { return HpiConst.SAHPI_ENT_POWER_SYSTEM_BOARD; } if ( s == "DRIVE_BACKPLANE" ) { return HpiConst.SAHPI_ENT_DRIVE_BACKPLANE; } if ( s == "SYS_EXPANSION_BOARD" ) { return HpiConst.SAHPI_ENT_SYS_EXPANSION_BOARD; } if ( s == "OTHER_SYSTEM_BOARD" ) { return HpiConst.SAHPI_ENT_OTHER_SYSTEM_BOARD; } if ( s == "PROCESSOR_BOARD" ) { return HpiConst.SAHPI_ENT_PROCESSOR_BOARD; } if ( s == "POWER_UNIT" ) { return HpiConst.SAHPI_ENT_POWER_UNIT; } if ( s == "POWER_MODULE" ) { return HpiConst.SAHPI_ENT_POWER_MODULE; } if ( s == "POWER_MGMNT" ) { return HpiConst.SAHPI_ENT_POWER_MGMNT; } if ( s == "CHASSIS_BACK_PANEL_BOARD" ) { return HpiConst.SAHPI_ENT_CHASSIS_BACK_PANEL_BOARD; } if ( s == "SYSTEM_CHASSIS" ) { return HpiConst.SAHPI_ENT_SYSTEM_CHASSIS; } if ( s == "SUB_CHASSIS" ) { return HpiConst.SAHPI_ENT_SUB_CHASSIS; } if ( s == "OTHER_CHASSIS_BOARD" ) { return HpiConst.SAHPI_ENT_OTHER_CHASSIS_BOARD; } if ( s == "DISK_DRIVE_BAY" ) { return HpiConst.SAHPI_ENT_DISK_DRIVE_BAY; } if ( s == "PERIPHERAL_BAY_2" ) { return HpiConst.SAHPI_ENT_PERIPHERAL_BAY_2; } if ( s == "DEVICE_BAY" ) { return HpiConst.SAHPI_ENT_DEVICE_BAY; } if ( s == "COOLING_DEVICE" ) { return HpiConst.SAHPI_ENT_COOLING_DEVICE; } if ( s == "COOLING_UNIT" ) { return HpiConst.SAHPI_ENT_COOLING_UNIT; } if ( s == "INTERCONNECT" ) { return HpiConst.SAHPI_ENT_INTERCONNECT; } if ( s == "MEMORY_DEVICE" ) { return HpiConst.SAHPI_ENT_MEMORY_DEVICE; } if ( s == "SYS_MGMNT_SOFTWARE" ) { return HpiConst.SAHPI_ENT_SYS_MGMNT_SOFTWARE; } if ( s == "BIOS" ) { return HpiConst.SAHPI_ENT_BIOS; } if ( s == "OPERATING_SYSTEM" ) { return HpiConst.SAHPI_ENT_OPERATING_SYSTEM; } if ( s == "SYSTEM_BUS" ) { return HpiConst.SAHPI_ENT_SYSTEM_BUS; } if ( s == "GROUP" ) { return HpiConst.SAHPI_ENT_GROUP; } if ( s == "REMOTE" ) { return HpiConst.SAHPI_ENT_REMOTE; } if ( s == "EXTERNAL_ENVIRONMENT" ) { return HpiConst.SAHPI_ENT_EXTERNAL_ENVIRONMENT; } if ( s == "BATTERY" ) { return HpiConst.SAHPI_ENT_BATTERY; } if ( s == "PROCESSING_BLADE" ) { return HpiConst.SAHPI_ENT_PROCESSING_BLADE; } if ( s == "CONNECTIVITY_SWITCH" ) { return HpiConst.SAHPI_ENT_CONNECTIVITY_SWITCH; } if ( s == "PROCESSOR_MEMORY_MODULE" ) { return HpiConst.SAHPI_ENT_PROCESSOR_MEMORY_MODULE; } if ( s == "IO_MODULE" ) { return HpiConst.SAHPI_ENT_IO_MODULE; } if ( s == "PROCESSOR_IO_MODULE" ) { return HpiConst.SAHPI_ENT_PROCESSOR_IO_MODULE; } if ( s == "MC_FIRMWARE" ) { return HpiConst.SAHPI_ENT_MC_FIRMWARE; } if ( s == "IPMI_CHANNEL" ) { return HpiConst.SAHPI_ENT_IPMI_CHANNEL; } if ( s == "PCI_BUS" ) { return HpiConst.SAHPI_ENT_PCI_BUS; } if ( s == "PCI_EXPRESS_BUS" ) { return HpiConst.SAHPI_ENT_PCI_EXPRESS_BUS; } if ( s == "SCSI_BUS" ) { return HpiConst.SAHPI_ENT_SCSI_BUS; } if ( s == "SATA_BUS" ) { return HpiConst.SAHPI_ENT_SATA_BUS; } if ( s == "PROC_FSB" ) { return HpiConst.SAHPI_ENT_PROC_FSB; } if ( s == "CLOCK" ) { return HpiConst.SAHPI_ENT_CLOCK; } if ( s == "SYSTEM_FIRMWARE" ) { return HpiConst.SAHPI_ENT_SYSTEM_FIRMWARE; } if ( s == "CHASSIS_SPECIFIC" ) { return HpiConst.SAHPI_ENT_CHASSIS_SPECIFIC; } if ( s == "CHASSIS_SPECIFIC01" ) { return HpiConst.SAHPI_ENT_CHASSIS_SPECIFIC01; } if ( s == "CHASSIS_SPECIFIC02" ) { return HpiConst.SAHPI_ENT_CHASSIS_SPECIFIC02; } if ( s == "CHASSIS_SPECIFIC03" ) { return HpiConst.SAHPI_ENT_CHASSIS_SPECIFIC03; } if ( s == "CHASSIS_SPECIFIC04" ) { return HpiConst.SAHPI_ENT_CHASSIS_SPECIFIC04; } if ( s == "CHASSIS_SPECIFIC05" ) { return HpiConst.SAHPI_ENT_CHASSIS_SPECIFIC05; } if ( s == "CHASSIS_SPECIFIC06" ) { return HpiConst.SAHPI_ENT_CHASSIS_SPECIFIC06; } if ( s == "CHASSIS_SPECIFIC07" ) { return HpiConst.SAHPI_ENT_CHASSIS_SPECIFIC07; } if ( s == "CHASSIS_SPECIFIC08" ) { return HpiConst.SAHPI_ENT_CHASSIS_SPECIFIC08; } if ( s == "CHASSIS_SPECIFIC09" ) { return HpiConst.SAHPI_ENT_CHASSIS_SPECIFIC09; } if ( s == "CHASSIS_SPECIFIC10" ) { return HpiConst.SAHPI_ENT_CHASSIS_SPECIFIC10; } if ( s == "CHASSIS_SPECIFIC11" ) { return HpiConst.SAHPI_ENT_CHASSIS_SPECIFIC11; } if ( s == "CHASSIS_SPECIFIC12" ) { return HpiConst.SAHPI_ENT_CHASSIS_SPECIFIC12; } if ( s == "CHASSIS_SPECIFIC13" ) { return HpiConst.SAHPI_ENT_CHASSIS_SPECIFIC13; } if ( s == "BOARD_SET_SPECIFIC" ) { return HpiConst.SAHPI_ENT_BOARD_SET_SPECIFIC; } if ( s == "OEM_SYSINT_SPECIFIC" ) { return HpiConst.SAHPI_ENT_OEM_SYSINT_SPECIFIC; } if ( s == "ROOT" ) { return HpiConst.SAHPI_ENT_ROOT; } if ( s == "RACK" ) { return HpiConst.SAHPI_ENT_RACK; } if ( s == "SUBRACK" ) { return HpiConst.SAHPI_ENT_SUBRACK; } if ( s == "COMPACTPCI_CHASSIS" ) { return HpiConst.SAHPI_ENT_COMPACTPCI_CHASSIS; } if ( s == "ADVANCEDTCA_CHASSIS" ) { return HpiConst.SAHPI_ENT_ADVANCEDTCA_CHASSIS; } if ( s == "RACK_MOUNTED_SERVER" ) { return HpiConst.SAHPI_ENT_RACK_MOUNTED_SERVER; } if ( s == "SYSTEM_BLADE" ) { return HpiConst.SAHPI_ENT_SYSTEM_BLADE; } if ( s == "SWITCH" ) { return HpiConst.SAHPI_ENT_SWITCH; } if ( s == "SWITCH_BLADE" ) { return HpiConst.SAHPI_ENT_SWITCH_BLADE; } if ( s == "SBC_BLADE" ) { return HpiConst.SAHPI_ENT_SBC_BLADE; } if ( s == "IO_BLADE" ) { return HpiConst.SAHPI_ENT_IO_BLADE; } if ( s == "DISK_BLADE" ) { return HpiConst.SAHPI_ENT_DISK_BLADE; } if ( s == "DISK_DRIVE" ) { return HpiConst.SAHPI_ENT_DISK_DRIVE; } if ( s == "FAN" ) { return HpiConst.SAHPI_ENT_FAN; } if ( s == "POWER_DISTRIBUTION_UNIT" ) { return HpiConst.SAHPI_ENT_POWER_DISTRIBUTION_UNIT; } if ( s == "SPEC_PROC_BLADE" ) { return HpiConst.SAHPI_ENT_SPEC_PROC_BLADE; } if ( s == "IO_SUBBOARD" ) { return HpiConst.SAHPI_ENT_IO_SUBBOARD; } if ( s == "SBC_SUBBOARD" ) { return HpiConst.SAHPI_ENT_SBC_SUBBOARD; } if ( s == "ALARM_MANAGER" ) { return HpiConst.SAHPI_ENT_ALARM_MANAGER; } if ( s == "SHELF_MANAGER" ) { return HpiConst.SAHPI_ENT_SHELF_MANAGER; } if ( s == "DISPLAY_PANEL" ) { return HpiConst.SAHPI_ENT_DISPLAY_PANEL; } if ( s == "SUBBOARD_CARRIER_BLADE" ) { return HpiConst.SAHPI_ENT_SUBBOARD_CARRIER_BLADE; } if ( s == "PHYSICAL_SLOT" ) { return HpiConst.SAHPI_ENT_PHYSICAL_SLOT; } if ( s == "PICMG_FRONT_BLADE" ) { return HpiConst.SAHPI_ENT_PICMG_FRONT_BLADE; } if ( s == "SYSTEM_INVENTORY_DEVICE" ) { return HpiConst.SAHPI_ENT_SYSTEM_INVENTORY_DEVICE; } if ( s == "FILTRATION_UNIT" ) { return HpiConst.SAHPI_ENT_FILTRATION_UNIT; } if ( s == "AMC" ) { return HpiConst.SAHPI_ENT_AMC; } if ( s == "BMC" ) { return HpiConst.SAHPI_ENT_BMC; } if ( s == "IPMC" ) { return HpiConst.SAHPI_ENT_IPMC; } if ( s == "MMC" ) { return HpiConst.SAHPI_ENT_MMC; } if ( s == "SHMC" ) { return HpiConst.SAHPI_ENT_SHMC; } if ( s == "CPLD" ) { return HpiConst.SAHPI_ENT_CPLD; } if ( s == "EPLD" ) { return HpiConst.SAHPI_ENT_EPLD; } if ( s == "FPGA" ) { return HpiConst.SAHPI_ENT_FPGA; } if ( s == "DASD" ) { return HpiConst.SAHPI_ENT_DASD; } if ( s == "NIC" ) { return HpiConst.SAHPI_ENT_NIC; } if ( s == "DSP" ) { return HpiConst.SAHPI_ENT_DSP; } if ( s == "UCODE" ) { return HpiConst.SAHPI_ENT_UCODE; } if ( s == "NPU" ) { return HpiConst.SAHPI_ENT_NPU; } if ( s == "OEM" ) { return HpiConst.SAHPI_ENT_OEM; } if ( s == "INTERFACE" ) { return HpiConst.SAHPI_ENT_INTERFACE; } if ( s == "MICROTCA_CHASSIS" ) { return HpiConst.SAHPI_ENT_MICROTCA_CHASSIS; } if ( s == "CARRIER" ) { return HpiConst.SAHPI_ENT_CARRIER; } if ( s == "CARRIER_MANAGER" ) { return HpiConst.SAHPI_ENT_CARRIER_MANAGER; } if ( s == "CONFIG_DATA" ) { return HpiConst.SAHPI_ENT_CONFIG_DATA; } if ( s == "INDICATOR" ) { return HpiConst.SAHPI_ENT_INDICATOR; } throw new FormatException(); } /** * For SaHpiSensorTypeT */ public static string FromSaHpiSensorTypeT( long x ) { switch( x ) { case HpiConst.SAHPI_TEMPERATURE: return "TEMPERATURE"; case HpiConst.SAHPI_VOLTAGE: return "VOLTAGE"; case HpiConst.SAHPI_CURRENT: return "CURRENT"; case HpiConst.SAHPI_FAN: return "FAN"; case HpiConst.SAHPI_PHYSICAL_SECURITY: return "PHYSICAL_SECURITY"; case HpiConst.SAHPI_PLATFORM_VIOLATION: return "PLATFORM_VIOLATION"; case HpiConst.SAHPI_PROCESSOR: return "PROCESSOR"; case HpiConst.SAHPI_POWER_SUPPLY: return "POWER_SUPPLY"; case HpiConst.SAHPI_POWER_UNIT: return "POWER_UNIT"; case HpiConst.SAHPI_COOLING_DEVICE: return "COOLING_DEVICE"; case HpiConst.SAHPI_OTHER_UNITS_BASED_SENSOR: return "OTHER_UNITS_BASED_SENSOR"; case HpiConst.SAHPI_MEMORY: return "MEMORY"; case HpiConst.SAHPI_DRIVE_SLOT: return "DRIVE_SLOT"; case HpiConst.SAHPI_POST_MEMORY_RESIZE: return "POST_MEMORY_RESIZE"; case HpiConst.SAHPI_SYSTEM_FW_PROGRESS: return "SYSTEM_FW_PROGRESS"; case HpiConst.SAHPI_EVENT_LOGGING_DISABLED: return "EVENT_LOGGING_DISABLED"; case HpiConst.SAHPI_RESERVED1: return "RESERVED1"; case HpiConst.SAHPI_SYSTEM_EVENT: return "SYSTEM_EVENT"; case HpiConst.SAHPI_CRITICAL_INTERRUPT: return "CRITICAL_INTERRUPT"; case HpiConst.SAHPI_BUTTON: return "BUTTON"; case HpiConst.SAHPI_MODULE_BOARD: return "MODULE_BOARD"; case HpiConst.SAHPI_MICROCONTROLLER_COPROCESSOR: return "MICROCONTROLLER_COPROCESSOR"; case HpiConst.SAHPI_ADDIN_CARD: return "ADDIN_CARD"; case HpiConst.SAHPI_CHASSIS: return "CHASSIS"; case HpiConst.SAHPI_CHIP_SET: return "CHIP_SET"; case HpiConst.SAHPI_OTHER_FRU: return "OTHER_FRU"; case HpiConst.SAHPI_CABLE_INTERCONNECT: return "CABLE_INTERCONNECT"; case HpiConst.SAHPI_TERMINATOR: return "TERMINATOR"; case HpiConst.SAHPI_SYSTEM_BOOT_INITIATED: return "SYSTEM_BOOT_INITIATED"; case HpiConst.SAHPI_BOOT_ERROR: return "BOOT_ERROR"; case HpiConst.SAHPI_OS_BOOT: return "OS_BOOT"; case HpiConst.SAHPI_OS_CRITICAL_STOP: return "OS_CRITICAL_STOP"; case HpiConst.SAHPI_SLOT_CONNECTOR: return "SLOT_CONNECTOR"; case HpiConst.SAHPI_SYSTEM_ACPI_POWER_STATE: return "SYSTEM_ACPI_POWER_STATE"; case HpiConst.SAHPI_RESERVED2: return "RESERVED2"; case HpiConst.SAHPI_PLATFORM_ALERT: return "PLATFORM_ALERT"; case HpiConst.SAHPI_ENTITY_PRESENCE: return "ENTITY_PRESENCE"; case HpiConst.SAHPI_MONITOR_ASIC_IC: return "MONITOR_ASIC_IC"; case HpiConst.SAHPI_LAN: return "LAN"; case HpiConst.SAHPI_MANAGEMENT_SUBSYSTEM_HEALTH: return "MANAGEMENT_SUBSYSTEM_HEALTH"; case HpiConst.SAHPI_BATTERY: return "BATTERY"; case HpiConst.SAHPI_SESSION_AUDIT: return "SESSION_AUDIT"; case HpiConst.SAHPI_VERSION_CHANGE: return "VERSION_CHANGE"; case HpiConst.SAHPI_OPERATIONAL: return "OPERATIONAL"; case HpiConst.SAHPI_OEM_SENSOR: return "OEM_SENSOR"; case HpiConst.SAHPI_COMM_CHANNEL_LINK_STATE: return "COMM_CHANNEL_LINK_STATE"; case HpiConst.SAHPI_MANAGEMENT_BUS_STATE: return "MANAGEMENT_BUS_STATE"; case HpiConst.SAHPI_COMM_CHANNEL_BUS_STATE: return "COMM_CHANNEL_BUS_STATE"; case HpiConst.SAHPI_CONFIG_DATA: return "CONFIG_DATA"; case HpiConst.SAHPI_POWER_BUDGET: return "POWER_BUDGET"; default: return Convert.ToString( x ); } } public static long ToSaHpiSensorTypeT( string s ) { if ( s == "TEMPERATURE" ) { return HpiConst.SAHPI_TEMPERATURE; } if ( s == "VOLTAGE" ) { return HpiConst.SAHPI_VOLTAGE; } if ( s == "CURRENT" ) { return HpiConst.SAHPI_CURRENT; } if ( s == "FAN" ) { return HpiConst.SAHPI_FAN; } if ( s == "PHYSICAL_SECURITY" ) { return HpiConst.SAHPI_PHYSICAL_SECURITY; } if ( s == "PLATFORM_VIOLATION" ) { return HpiConst.SAHPI_PLATFORM_VIOLATION; } if ( s == "PROCESSOR" ) { return HpiConst.SAHPI_PROCESSOR; } if ( s == "POWER_SUPPLY" ) { return HpiConst.SAHPI_POWER_SUPPLY; } if ( s == "POWER_UNIT" ) { return HpiConst.SAHPI_POWER_UNIT; } if ( s == "COOLING_DEVICE" ) { return HpiConst.SAHPI_COOLING_DEVICE; } if ( s == "OTHER_UNITS_BASED_SENSOR" ) { return HpiConst.SAHPI_OTHER_UNITS_BASED_SENSOR; } if ( s == "MEMORY" ) { return HpiConst.SAHPI_MEMORY; } if ( s == "DRIVE_SLOT" ) { return HpiConst.SAHPI_DRIVE_SLOT; } if ( s == "POST_MEMORY_RESIZE" ) { return HpiConst.SAHPI_POST_MEMORY_RESIZE; } if ( s == "SYSTEM_FW_PROGRESS" ) { return HpiConst.SAHPI_SYSTEM_FW_PROGRESS; } if ( s == "EVENT_LOGGING_DISABLED" ) { return HpiConst.SAHPI_EVENT_LOGGING_DISABLED; } if ( s == "RESERVED1" ) { return HpiConst.SAHPI_RESERVED1; } if ( s == "SYSTEM_EVENT" ) { return HpiConst.SAHPI_SYSTEM_EVENT; } if ( s == "CRITICAL_INTERRUPT" ) { return HpiConst.SAHPI_CRITICAL_INTERRUPT; } if ( s == "BUTTON" ) { return HpiConst.SAHPI_BUTTON; } if ( s == "MODULE_BOARD" ) { return HpiConst.SAHPI_MODULE_BOARD; } if ( s == "MICROCONTROLLER_COPROCESSOR" ) { return HpiConst.SAHPI_MICROCONTROLLER_COPROCESSOR; } if ( s == "ADDIN_CARD" ) { return HpiConst.SAHPI_ADDIN_CARD; } if ( s == "CHASSIS" ) { return HpiConst.SAHPI_CHASSIS; } if ( s == "CHIP_SET" ) { return HpiConst.SAHPI_CHIP_SET; } if ( s == "OTHER_FRU" ) { return HpiConst.SAHPI_OTHER_FRU; } if ( s == "CABLE_INTERCONNECT" ) { return HpiConst.SAHPI_CABLE_INTERCONNECT; } if ( s == "TERMINATOR" ) { return HpiConst.SAHPI_TERMINATOR; } if ( s == "SYSTEM_BOOT_INITIATED" ) { return HpiConst.SAHPI_SYSTEM_BOOT_INITIATED; } if ( s == "BOOT_ERROR" ) { return HpiConst.SAHPI_BOOT_ERROR; } if ( s == "OS_BOOT" ) { return HpiConst.SAHPI_OS_BOOT; } if ( s == "OS_CRITICAL_STOP" ) { return HpiConst.SAHPI_OS_CRITICAL_STOP; } if ( s == "SLOT_CONNECTOR" ) { return HpiConst.SAHPI_SLOT_CONNECTOR; } if ( s == "SYSTEM_ACPI_POWER_STATE" ) { return HpiConst.SAHPI_SYSTEM_ACPI_POWER_STATE; } if ( s == "RESERVED2" ) { return HpiConst.SAHPI_RESERVED2; } if ( s == "PLATFORM_ALERT" ) { return HpiConst.SAHPI_PLATFORM_ALERT; } if ( s == "ENTITY_PRESENCE" ) { return HpiConst.SAHPI_ENTITY_PRESENCE; } if ( s == "MONITOR_ASIC_IC" ) { return HpiConst.SAHPI_MONITOR_ASIC_IC; } if ( s == "LAN" ) { return HpiConst.SAHPI_LAN; } if ( s == "MANAGEMENT_SUBSYSTEM_HEALTH" ) { return HpiConst.SAHPI_MANAGEMENT_SUBSYSTEM_HEALTH; } if ( s == "BATTERY" ) { return HpiConst.SAHPI_BATTERY; } if ( s == "SESSION_AUDIT" ) { return HpiConst.SAHPI_SESSION_AUDIT; } if ( s == "VERSION_CHANGE" ) { return HpiConst.SAHPI_VERSION_CHANGE; } if ( s == "OPERATIONAL" ) { return HpiConst.SAHPI_OPERATIONAL; } if ( s == "OEM_SENSOR" ) { return HpiConst.SAHPI_OEM_SENSOR; } if ( s == "COMM_CHANNEL_LINK_STATE" ) { return HpiConst.SAHPI_COMM_CHANNEL_LINK_STATE; } if ( s == "MANAGEMENT_BUS_STATE" ) { return HpiConst.SAHPI_MANAGEMENT_BUS_STATE; } if ( s == "COMM_CHANNEL_BUS_STATE" ) { return HpiConst.SAHPI_COMM_CHANNEL_BUS_STATE; } if ( s == "CONFIG_DATA" ) { return HpiConst.SAHPI_CONFIG_DATA; } if ( s == "POWER_BUDGET" ) { return HpiConst.SAHPI_POWER_BUDGET; } throw new FormatException(); } /** * For SaHpiSensorReadingTypeT */ public static string FromSaHpiSensorReadingTypeT( long x ) { switch( x ) { case HpiConst.SAHPI_SENSOR_READING_TYPE_INT64: return "INT64"; case HpiConst.SAHPI_SENSOR_READING_TYPE_UINT64: return "UINT64"; case HpiConst.SAHPI_SENSOR_READING_TYPE_FLOAT64: return "FLOAT64"; case HpiConst.SAHPI_SENSOR_READING_TYPE_BUFFER: return "BUFFER"; default: return Convert.ToString( x ); } } public static long ToSaHpiSensorReadingTypeT( string s ) { if ( s == "INT64" ) { return HpiConst.SAHPI_SENSOR_READING_TYPE_INT64; } if ( s == "UINT64" ) { return HpiConst.SAHPI_SENSOR_READING_TYPE_UINT64; } if ( s == "FLOAT64" ) { return HpiConst.SAHPI_SENSOR_READING_TYPE_FLOAT64; } if ( s == "BUFFER" ) { return HpiConst.SAHPI_SENSOR_READING_TYPE_BUFFER; } throw new FormatException(); } /** * For SaHpiSensorEventMaskActionT */ public static string FromSaHpiSensorEventMaskActionT( long x ) { switch( x ) { case HpiConst.SAHPI_SENS_ADD_EVENTS_TO_MASKS: return "ADD_EVENTS_TO_MASKS"; case HpiConst.SAHPI_SENS_REMOVE_EVENTS_FROM_MASKS: return "REMOVE_EVENTS_FROM_MASKS"; default: return Convert.ToString( x ); } } public static long ToSaHpiSensorEventMaskActionT( string s ) { if ( s == "ADD_EVENTS_TO_MASKS" ) { return HpiConst.SAHPI_SENS_ADD_EVENTS_TO_MASKS; } if ( s == "REMOVE_EVENTS_FROM_MASKS" ) { return HpiConst.SAHPI_SENS_REMOVE_EVENTS_FROM_MASKS; } throw new FormatException(); } /** * For SaHpiSensorUnitsT */ public static string FromSaHpiSensorUnitsT( long x ) { switch( x ) { case HpiConst.SAHPI_SU_UNSPECIFIED: return "UNSPECIFIED"; case HpiConst.SAHPI_SU_DEGREES_C: return "DEGREES_C"; case HpiConst.SAHPI_SU_DEGREES_F: return "DEGREES_F"; case HpiConst.SAHPI_SU_DEGREES_K: return "DEGREES_K"; case HpiConst.SAHPI_SU_VOLTS: return "VOLTS"; case HpiConst.SAHPI_SU_AMPS: return "AMPS"; case HpiConst.SAHPI_SU_WATTS: return "WATTS"; case HpiConst.SAHPI_SU_JOULES: return "JOULES"; case HpiConst.SAHPI_SU_COULOMBS: return "COULOMBS"; case HpiConst.SAHPI_SU_VA: return "VA"; case HpiConst.SAHPI_SU_NITS: return "NITS"; case HpiConst.SAHPI_SU_LUMEN: return "LUMEN"; case HpiConst.SAHPI_SU_LUX: return "LUX"; case HpiConst.SAHPI_SU_CANDELA: return "CANDELA"; case HpiConst.SAHPI_SU_KPA: return "KPA"; case HpiConst.SAHPI_SU_PSI: return "PSI"; case HpiConst.SAHPI_SU_NEWTON: return "NEWTON"; case HpiConst.SAHPI_SU_CFM: return "CFM"; case HpiConst.SAHPI_SU_RPM: return "RPM"; case HpiConst.SAHPI_SU_HZ: return "HZ"; case HpiConst.SAHPI_SU_MICROSECOND: return "MICROSECOND"; case HpiConst.SAHPI_SU_MILLISECOND: return "MILLISECOND"; case HpiConst.SAHPI_SU_SECOND: return "SECOND"; case HpiConst.SAHPI_SU_MINUTE: return "MINUTE"; case HpiConst.SAHPI_SU_HOUR: return "HOUR"; case HpiConst.SAHPI_SU_DAY: return "DAY"; case HpiConst.SAHPI_SU_WEEK: return "WEEK"; case HpiConst.SAHPI_SU_MIL: return "MIL"; case HpiConst.SAHPI_SU_INCHES: return "INCHES"; case HpiConst.SAHPI_SU_FEET: return "FEET"; case HpiConst.SAHPI_SU_CU_IN: return "CU_IN"; case HpiConst.SAHPI_SU_CU_FEET: return "CU_FEET"; case HpiConst.SAHPI_SU_MM: return "MM"; case HpiConst.SAHPI_SU_CM: return "CM"; case HpiConst.SAHPI_SU_M: return "M"; case HpiConst.SAHPI_SU_CU_CM: return "CU_CM"; case HpiConst.SAHPI_SU_CU_M: return "CU_M"; case HpiConst.SAHPI_SU_LITERS: return "LITERS"; case HpiConst.SAHPI_SU_FLUID_OUNCE: return "FLUID_OUNCE"; case HpiConst.SAHPI_SU_RADIANS: return "RADIANS"; case HpiConst.SAHPI_SU_STERADIANS: return "STERADIANS"; case HpiConst.SAHPI_SU_REVOLUTIONS: return "REVOLUTIONS"; case HpiConst.SAHPI_SU_CYCLES: return "CYCLES"; case HpiConst.SAHPI_SU_GRAVITIES: return "GRAVITIES"; case HpiConst.SAHPI_SU_OUNCE: return "OUNCE"; case HpiConst.SAHPI_SU_POUND: return "POUND"; case HpiConst.SAHPI_SU_FT_LB: return "FT_LB"; case HpiConst.SAHPI_SU_OZ_IN: return "OZ_IN"; case HpiConst.SAHPI_SU_GAUSS: return "GAUSS"; case HpiConst.SAHPI_SU_GILBERTS: return "GILBERTS"; case HpiConst.SAHPI_SU_HENRY: return "HENRY"; case HpiConst.SAHPI_SU_MILLIHENRY: return "MILLIHENRY"; case HpiConst.SAHPI_SU_FARAD: return "FARAD"; case HpiConst.SAHPI_SU_MICROFARAD: return "MICROFARAD"; case HpiConst.SAHPI_SU_OHMS: return "OHMS"; case HpiConst.SAHPI_SU_SIEMENS: return "SIEMENS"; case HpiConst.SAHPI_SU_MOLE: return "MOLE"; case HpiConst.SAHPI_SU_BECQUEREL: return "BECQUEREL"; case HpiConst.SAHPI_SU_PPM: return "PPM"; case HpiConst.SAHPI_SU_RESERVED: return "RESERVED"; case HpiConst.SAHPI_SU_DECIBELS: return "DECIBELS"; case HpiConst.SAHPI_SU_DBA: return "DBA"; case HpiConst.SAHPI_SU_DBC: return "DBC"; case HpiConst.SAHPI_SU_GRAY: return "GRAY"; case HpiConst.SAHPI_SU_SIEVERT: return "SIEVERT"; case HpiConst.SAHPI_SU_COLOR_TEMP_DEG_K: return "COLOR_TEMP_DEG_K"; case HpiConst.SAHPI_SU_BIT: return "BIT"; case HpiConst.SAHPI_SU_KILOBIT: return "KILOBIT"; case HpiConst.SAHPI_SU_MEGABIT: return "MEGABIT"; case HpiConst.SAHPI_SU_GIGABIT: return "GIGABIT"; case HpiConst.SAHPI_SU_BYTE: return "BYTE"; case HpiConst.SAHPI_SU_KILOBYTE: return "KILOBYTE"; case HpiConst.SAHPI_SU_MEGABYTE: return "MEGABYTE"; case HpiConst.SAHPI_SU_GIGABYTE: return "GIGABYTE"; case HpiConst.SAHPI_SU_WORD: return "WORD"; case HpiConst.SAHPI_SU_DWORD: return "DWORD"; case HpiConst.SAHPI_SU_QWORD: return "QWORD"; case HpiConst.SAHPI_SU_LINE: return "LINE"; case HpiConst.SAHPI_SU_HIT: return "HIT"; case HpiConst.SAHPI_SU_MISS: return "MISS"; case HpiConst.SAHPI_SU_RETRY: return "RETRY"; case HpiConst.SAHPI_SU_RESET: return "RESET"; case HpiConst.SAHPI_SU_OVERRUN: return "OVERRUN"; case HpiConst.SAHPI_SU_UNDERRUN: return "UNDERRUN"; case HpiConst.SAHPI_SU_COLLISION: return "COLLISION"; case HpiConst.SAHPI_SU_PACKETS: return "PACKETS"; case HpiConst.SAHPI_SU_MESSAGES: return "MESSAGES"; case HpiConst.SAHPI_SU_CHARACTERS: return "CHARACTERS"; case HpiConst.SAHPI_SU_ERRORS: return "ERRORS"; case HpiConst.SAHPI_SU_CORRECTABLE_ERRORS: return "CORRECTABLE_ERRORS"; case HpiConst.SAHPI_SU_UNCORRECTABLE_ERRORS: return "UNCORRECTABLE_ERRORS"; default: return Convert.ToString( x ); } } public static long ToSaHpiSensorUnitsT( string s ) { if ( s == "UNSPECIFIED" ) { return HpiConst.SAHPI_SU_UNSPECIFIED; } if ( s == "DEGREES_C" ) { return HpiConst.SAHPI_SU_DEGREES_C; } if ( s == "DEGREES_F" ) { return HpiConst.SAHPI_SU_DEGREES_F; } if ( s == "DEGREES_K" ) { return HpiConst.SAHPI_SU_DEGREES_K; } if ( s == "VOLTS" ) { return HpiConst.SAHPI_SU_VOLTS; } if ( s == "AMPS" ) { return HpiConst.SAHPI_SU_AMPS; } if ( s == "WATTS" ) { return HpiConst.SAHPI_SU_WATTS; } if ( s == "JOULES" ) { return HpiConst.SAHPI_SU_JOULES; } if ( s == "COULOMBS" ) { return HpiConst.SAHPI_SU_COULOMBS; } if ( s == "VA" ) { return HpiConst.SAHPI_SU_VA; } if ( s == "NITS" ) { return HpiConst.SAHPI_SU_NITS; } if ( s == "LUMEN" ) { return HpiConst.SAHPI_SU_LUMEN; } if ( s == "LUX" ) { return HpiConst.SAHPI_SU_LUX; } if ( s == "CANDELA" ) { return HpiConst.SAHPI_SU_CANDELA; } if ( s == "KPA" ) { return HpiConst.SAHPI_SU_KPA; } if ( s == "PSI" ) { return HpiConst.SAHPI_SU_PSI; } if ( s == "NEWTON" ) { return HpiConst.SAHPI_SU_NEWTON; } if ( s == "CFM" ) { return HpiConst.SAHPI_SU_CFM; } if ( s == "RPM" ) { return HpiConst.SAHPI_SU_RPM; } if ( s == "HZ" ) { return HpiConst.SAHPI_SU_HZ; } if ( s == "MICROSECOND" ) { return HpiConst.SAHPI_SU_MICROSECOND; } if ( s == "MILLISECOND" ) { return HpiConst.SAHPI_SU_MILLISECOND; } if ( s == "SECOND" ) { return HpiConst.SAHPI_SU_SECOND; } if ( s == "MINUTE" ) { return HpiConst.SAHPI_SU_MINUTE; } if ( s == "HOUR" ) { return HpiConst.SAHPI_SU_HOUR; } if ( s == "DAY" ) { return HpiConst.SAHPI_SU_DAY; } if ( s == "WEEK" ) { return HpiConst.SAHPI_SU_WEEK; } if ( s == "MIL" ) { return HpiConst.SAHPI_SU_MIL; } if ( s == "INCHES" ) { return HpiConst.SAHPI_SU_INCHES; } if ( s == "FEET" ) { return HpiConst.SAHPI_SU_FEET; } if ( s == "CU_IN" ) { return HpiConst.SAHPI_SU_CU_IN; } if ( s == "CU_FEET" ) { return HpiConst.SAHPI_SU_CU_FEET; } if ( s == "MM" ) { return HpiConst.SAHPI_SU_MM; } if ( s == "CM" ) { return HpiConst.SAHPI_SU_CM; } if ( s == "M" ) { return HpiConst.SAHPI_SU_M; } if ( s == "CU_CM" ) { return HpiConst.SAHPI_SU_CU_CM; } if ( s == "CU_M" ) { return HpiConst.SAHPI_SU_CU_M; } if ( s == "LITERS" ) { return HpiConst.SAHPI_SU_LITERS; } if ( s == "FLUID_OUNCE" ) { return HpiConst.SAHPI_SU_FLUID_OUNCE; } if ( s == "RADIANS" ) { return HpiConst.SAHPI_SU_RADIANS; } if ( s == "STERADIANS" ) { return HpiConst.SAHPI_SU_STERADIANS; } if ( s == "REVOLUTIONS" ) { return HpiConst.SAHPI_SU_REVOLUTIONS; } if ( s == "CYCLES" ) { return HpiConst.SAHPI_SU_CYCLES; } if ( s == "GRAVITIES" ) { return HpiConst.SAHPI_SU_GRAVITIES; } if ( s == "OUNCE" ) { return HpiConst.SAHPI_SU_OUNCE; } if ( s == "POUND" ) { return HpiConst.SAHPI_SU_POUND; } if ( s == "FT_LB" ) { return HpiConst.SAHPI_SU_FT_LB; } if ( s == "OZ_IN" ) { return HpiConst.SAHPI_SU_OZ_IN; } if ( s == "GAUSS" ) { return HpiConst.SAHPI_SU_GAUSS; } if ( s == "GILBERTS" ) { return HpiConst.SAHPI_SU_GILBERTS; } if ( s == "HENRY" ) { return HpiConst.SAHPI_SU_HENRY; } if ( s == "MILLIHENRY" ) { return HpiConst.SAHPI_SU_MILLIHENRY; } if ( s == "FARAD" ) { return HpiConst.SAHPI_SU_FARAD; } if ( s == "MICROFARAD" ) { return HpiConst.SAHPI_SU_MICROFARAD; } if ( s == "OHMS" ) { return HpiConst.SAHPI_SU_OHMS; } if ( s == "SIEMENS" ) { return HpiConst.SAHPI_SU_SIEMENS; } if ( s == "MOLE" ) { return HpiConst.SAHPI_SU_MOLE; } if ( s == "BECQUEREL" ) { return HpiConst.SAHPI_SU_BECQUEREL; } if ( s == "PPM" ) { return HpiConst.SAHPI_SU_PPM; } if ( s == "RESERVED" ) { return HpiConst.SAHPI_SU_RESERVED; } if ( s == "DECIBELS" ) { return HpiConst.SAHPI_SU_DECIBELS; } if ( s == "DBA" ) { return HpiConst.SAHPI_SU_DBA; } if ( s == "DBC" ) { return HpiConst.SAHPI_SU_DBC; } if ( s == "GRAY" ) { return HpiConst.SAHPI_SU_GRAY; } if ( s == "SIEVERT" ) { return HpiConst.SAHPI_SU_SIEVERT; } if ( s == "COLOR_TEMP_DEG_K" ) { return HpiConst.SAHPI_SU_COLOR_TEMP_DEG_K; } if ( s == "BIT" ) { return HpiConst.SAHPI_SU_BIT; } if ( s == "KILOBIT" ) { return HpiConst.SAHPI_SU_KILOBIT; } if ( s == "MEGABIT" ) { return HpiConst.SAHPI_SU_MEGABIT; } if ( s == "GIGABIT" ) { return HpiConst.SAHPI_SU_GIGABIT; } if ( s == "BYTE" ) { return HpiConst.SAHPI_SU_BYTE; } if ( s == "KILOBYTE" ) { return HpiConst.SAHPI_SU_KILOBYTE; } if ( s == "MEGABYTE" ) { return HpiConst.SAHPI_SU_MEGABYTE; } if ( s == "GIGABYTE" ) { return HpiConst.SAHPI_SU_GIGABYTE; } if ( s == "WORD" ) { return HpiConst.SAHPI_SU_WORD; } if ( s == "DWORD" ) { return HpiConst.SAHPI_SU_DWORD; } if ( s == "QWORD" ) { return HpiConst.SAHPI_SU_QWORD; } if ( s == "LINE" ) { return HpiConst.SAHPI_SU_LINE; } if ( s == "HIT" ) { return HpiConst.SAHPI_SU_HIT; } if ( s == "MISS" ) { return HpiConst.SAHPI_SU_MISS; } if ( s == "RETRY" ) { return HpiConst.SAHPI_SU_RETRY; } if ( s == "RESET" ) { return HpiConst.SAHPI_SU_RESET; } if ( s == "OVERRUN" ) { return HpiConst.SAHPI_SU_OVERRUN; } if ( s == "UNDERRUN" ) { return HpiConst.SAHPI_SU_UNDERRUN; } if ( s == "COLLISION" ) { return HpiConst.SAHPI_SU_COLLISION; } if ( s == "PACKETS" ) { return HpiConst.SAHPI_SU_PACKETS; } if ( s == "MESSAGES" ) { return HpiConst.SAHPI_SU_MESSAGES; } if ( s == "CHARACTERS" ) { return HpiConst.SAHPI_SU_CHARACTERS; } if ( s == "ERRORS" ) { return HpiConst.SAHPI_SU_ERRORS; } if ( s == "CORRECTABLE_ERRORS" ) { return HpiConst.SAHPI_SU_CORRECTABLE_ERRORS; } if ( s == "UNCORRECTABLE_ERRORS" ) { return HpiConst.SAHPI_SU_UNCORRECTABLE_ERRORS; } throw new FormatException(); } /** * For SaHpiSensorModUnitUseT */ public static string FromSaHpiSensorModUnitUseT( long x ) { switch( x ) { case HpiConst.SAHPI_SMUU_NONE: return "NONE"; case HpiConst.SAHPI_SMUU_BASIC_OVER_MODIFIER: return "BASIC_OVER_MODIFIER"; case HpiConst.SAHPI_SMUU_BASIC_TIMES_MODIFIER: return "BASIC_TIMES_MODIFIER"; default: return Convert.ToString( x ); } } public static long ToSaHpiSensorModUnitUseT( string s ) { if ( s == "NONE" ) { return HpiConst.SAHPI_SMUU_NONE; } if ( s == "BASIC_OVER_MODIFIER" ) { return HpiConst.SAHPI_SMUU_BASIC_OVER_MODIFIER; } if ( s == "BASIC_TIMES_MODIFIER" ) { return HpiConst.SAHPI_SMUU_BASIC_TIMES_MODIFIER; } throw new FormatException(); } /** * For SaHpiSensorEventCtrlT */ public static string FromSaHpiSensorEventCtrlT( long x ) { switch( x ) { case HpiConst.SAHPI_SEC_PER_EVENT: return "PER_EVENT"; case HpiConst.SAHPI_SEC_READ_ONLY_MASKS: return "READ_ONLY_MASKS"; case HpiConst.SAHPI_SEC_READ_ONLY: return "READ_ONLY"; default: return Convert.ToString( x ); } } public static long ToSaHpiSensorEventCtrlT( string s ) { if ( s == "PER_EVENT" ) { return HpiConst.SAHPI_SEC_PER_EVENT; } if ( s == "READ_ONLY_MASKS" ) { return HpiConst.SAHPI_SEC_READ_ONLY_MASKS; } if ( s == "READ_ONLY" ) { return HpiConst.SAHPI_SEC_READ_ONLY; } throw new FormatException(); } /** * For SaHpiCtrlTypeT */ public static string FromSaHpiCtrlTypeT( long x ) { switch( x ) { case HpiConst.SAHPI_CTRL_TYPE_DIGITAL: return "DIGITAL"; case HpiConst.SAHPI_CTRL_TYPE_DISCRETE: return "DISCRETE"; case HpiConst.SAHPI_CTRL_TYPE_ANALOG: return "ANALOG"; case HpiConst.SAHPI_CTRL_TYPE_STREAM: return "STREAM"; case HpiConst.SAHPI_CTRL_TYPE_TEXT: return "TEXT"; case HpiConst.SAHPI_CTRL_TYPE_OEM: return "OEM"; default: return Convert.ToString( x ); } } public static long ToSaHpiCtrlTypeT( string s ) { if ( s == "DIGITAL" ) { return HpiConst.SAHPI_CTRL_TYPE_DIGITAL; } if ( s == "DISCRETE" ) { return HpiConst.SAHPI_CTRL_TYPE_DISCRETE; } if ( s == "ANALOG" ) { return HpiConst.SAHPI_CTRL_TYPE_ANALOG; } if ( s == "STREAM" ) { return HpiConst.SAHPI_CTRL_TYPE_STREAM; } if ( s == "TEXT" ) { return HpiConst.SAHPI_CTRL_TYPE_TEXT; } if ( s == "OEM" ) { return HpiConst.SAHPI_CTRL_TYPE_OEM; } throw new FormatException(); } /** * For SaHpiCtrlStateDigitalT */ public static string FromSaHpiCtrlStateDigitalT( long x ) { switch( x ) { case HpiConst.SAHPI_CTRL_STATE_OFF: return "OFF"; case HpiConst.SAHPI_CTRL_STATE_ON: return "ON"; case HpiConst.SAHPI_CTRL_STATE_PULSE_OFF: return "PULSE_OFF"; case HpiConst.SAHPI_CTRL_STATE_PULSE_ON: return "PULSE_ON"; default: return Convert.ToString( x ); } } public static long ToSaHpiCtrlStateDigitalT( string s ) { if ( s == "OFF" ) { return HpiConst.SAHPI_CTRL_STATE_OFF; } if ( s == "ON" ) { return HpiConst.SAHPI_CTRL_STATE_ON; } if ( s == "PULSE_OFF" ) { return HpiConst.SAHPI_CTRL_STATE_PULSE_OFF; } if ( s == "PULSE_ON" ) { return HpiConst.SAHPI_CTRL_STATE_PULSE_ON; } throw new FormatException(); } /** * For SaHpiCtrlModeT */ public static string FromSaHpiCtrlModeT( long x ) { switch( x ) { case HpiConst.SAHPI_CTRL_MODE_AUTO: return "AUTO"; case HpiConst.SAHPI_CTRL_MODE_MANUAL: return "MANUAL"; default: return Convert.ToString( x ); } } public static long ToSaHpiCtrlModeT( string s ) { if ( s == "AUTO" ) { return HpiConst.SAHPI_CTRL_MODE_AUTO; } if ( s == "MANUAL" ) { return HpiConst.SAHPI_CTRL_MODE_MANUAL; } throw new FormatException(); } /** * For SaHpiCtrlOutputTypeT */ public static string FromSaHpiCtrlOutputTypeT( long x ) { switch( x ) { case HpiConst.SAHPI_CTRL_GENERIC: return "GENERIC"; case HpiConst.SAHPI_CTRL_LED: return "LED"; case HpiConst.SAHPI_CTRL_FAN_SPEED: return "FAN_SPEED"; case HpiConst.SAHPI_CTRL_DRY_CONTACT_CLOSURE: return "DRY_CONTACT_CLOSURE"; case HpiConst.SAHPI_CTRL_POWER_SUPPLY_INHIBIT: return "POWER_SUPPLY_INHIBIT"; case HpiConst.SAHPI_CTRL_AUDIBLE: return "AUDIBLE"; case HpiConst.SAHPI_CTRL_FRONT_PANEL_LOCKOUT: return "FRONT_PANEL_LOCKOUT"; case HpiConst.SAHPI_CTRL_POWER_INTERLOCK: return "POWER_INTERLOCK"; case HpiConst.SAHPI_CTRL_POWER_STATE: return "POWER_STATE"; case HpiConst.SAHPI_CTRL_LCD_DISPLAY: return "LCD_DISPLAY"; case HpiConst.SAHPI_CTRL_OEM: return "OEM"; case HpiConst.SAHPI_CTRL_GENERIC_ADDRESS: return "GENERIC_ADDRESS"; case HpiConst.SAHPI_CTRL_IP_ADDRESS: return "IP_ADDRESS"; case HpiConst.SAHPI_CTRL_RESOURCE_ID: return "RESOURCE_ID"; case HpiConst.SAHPI_CTRL_POWER_BUDGET: return "POWER_BUDGET"; case HpiConst.SAHPI_CTRL_ACTIVATE: return "ACTIVATE"; case HpiConst.SAHPI_CTRL_RESET: return "RESET"; default: return Convert.ToString( x ); } } public static long ToSaHpiCtrlOutputTypeT( string s ) { if ( s == "GENERIC" ) { return HpiConst.SAHPI_CTRL_GENERIC; } if ( s == "LED" ) { return HpiConst.SAHPI_CTRL_LED; } if ( s == "FAN_SPEED" ) { return HpiConst.SAHPI_CTRL_FAN_SPEED; } if ( s == "DRY_CONTACT_CLOSURE" ) { return HpiConst.SAHPI_CTRL_DRY_CONTACT_CLOSURE; } if ( s == "POWER_SUPPLY_INHIBIT" ) { return HpiConst.SAHPI_CTRL_POWER_SUPPLY_INHIBIT; } if ( s == "AUDIBLE" ) { return HpiConst.SAHPI_CTRL_AUDIBLE; } if ( s == "FRONT_PANEL_LOCKOUT" ) { return HpiConst.SAHPI_CTRL_FRONT_PANEL_LOCKOUT; } if ( s == "POWER_INTERLOCK" ) { return HpiConst.SAHPI_CTRL_POWER_INTERLOCK; } if ( s == "POWER_STATE" ) { return HpiConst.SAHPI_CTRL_POWER_STATE; } if ( s == "LCD_DISPLAY" ) { return HpiConst.SAHPI_CTRL_LCD_DISPLAY; } if ( s == "OEM" ) { return HpiConst.SAHPI_CTRL_OEM; } if ( s == "GENERIC_ADDRESS" ) { return HpiConst.SAHPI_CTRL_GENERIC_ADDRESS; } if ( s == "IP_ADDRESS" ) { return HpiConst.SAHPI_CTRL_IP_ADDRESS; } if ( s == "RESOURCE_ID" ) { return HpiConst.SAHPI_CTRL_RESOURCE_ID; } if ( s == "POWER_BUDGET" ) { return HpiConst.SAHPI_CTRL_POWER_BUDGET; } if ( s == "ACTIVATE" ) { return HpiConst.SAHPI_CTRL_ACTIVATE; } if ( s == "RESET" ) { return HpiConst.SAHPI_CTRL_RESET; } throw new FormatException(); } /** * For SaHpiIdrAreaTypeT */ public static string FromSaHpiIdrAreaTypeT( long x ) { switch( x ) { case HpiConst.SAHPI_IDR_AREATYPE_INTERNAL_USE: return "INTERNAL_USE"; case HpiConst.SAHPI_IDR_AREATYPE_CHASSIS_INFO: return "CHASSIS_INFO"; case HpiConst.SAHPI_IDR_AREATYPE_BOARD_INFO: return "BOARD_INFO"; case HpiConst.SAHPI_IDR_AREATYPE_PRODUCT_INFO: return "PRODUCT_INFO"; case HpiConst.SAHPI_IDR_AREATYPE_OEM: return "OEM"; case HpiConst.SAHPI_IDR_AREATYPE_UNSPECIFIED: return "UNSPECIFIED"; default: return Convert.ToString( x ); } } public static long ToSaHpiIdrAreaTypeT( string s ) { if ( s == "INTERNAL_USE" ) { return HpiConst.SAHPI_IDR_AREATYPE_INTERNAL_USE; } if ( s == "CHASSIS_INFO" ) { return HpiConst.SAHPI_IDR_AREATYPE_CHASSIS_INFO; } if ( s == "BOARD_INFO" ) { return HpiConst.SAHPI_IDR_AREATYPE_BOARD_INFO; } if ( s == "PRODUCT_INFO" ) { return HpiConst.SAHPI_IDR_AREATYPE_PRODUCT_INFO; } if ( s == "OEM" ) { return HpiConst.SAHPI_IDR_AREATYPE_OEM; } if ( s == "UNSPECIFIED" ) { return HpiConst.SAHPI_IDR_AREATYPE_UNSPECIFIED; } throw new FormatException(); } /** * For SaHpiIdrFieldTypeT */ public static string FromSaHpiIdrFieldTypeT( long x ) { switch( x ) { case HpiConst.SAHPI_IDR_FIELDTYPE_CHASSIS_TYPE: return "CHASSIS_TYPE"; case HpiConst.SAHPI_IDR_FIELDTYPE_MFG_DATETIME: return "MFG_DATETIME"; case HpiConst.SAHPI_IDR_FIELDTYPE_MANUFACTURER: return "MANUFACTURER"; case HpiConst.SAHPI_IDR_FIELDTYPE_PRODUCT_NAME: return "PRODUCT_NAME"; case HpiConst.SAHPI_IDR_FIELDTYPE_PRODUCT_VERSION: return "PRODUCT_VERSION"; case HpiConst.SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER: return "SERIAL_NUMBER"; case HpiConst.SAHPI_IDR_FIELDTYPE_PART_NUMBER: return "PART_NUMBER"; case HpiConst.SAHPI_IDR_FIELDTYPE_FILE_ID: return "FILE_ID"; case HpiConst.SAHPI_IDR_FIELDTYPE_ASSET_TAG: return "ASSET_TAG"; case HpiConst.SAHPI_IDR_FIELDTYPE_CUSTOM: return "CUSTOM"; case HpiConst.SAHPI_IDR_FIELDTYPE_UNSPECIFIED: return "UNSPECIFIED"; default: return Convert.ToString( x ); } } public static long ToSaHpiIdrFieldTypeT( string s ) { if ( s == "CHASSIS_TYPE" ) { return HpiConst.SAHPI_IDR_FIELDTYPE_CHASSIS_TYPE; } if ( s == "MFG_DATETIME" ) { return HpiConst.SAHPI_IDR_FIELDTYPE_MFG_DATETIME; } if ( s == "MANUFACTURER" ) { return HpiConst.SAHPI_IDR_FIELDTYPE_MANUFACTURER; } if ( s == "PRODUCT_NAME" ) { return HpiConst.SAHPI_IDR_FIELDTYPE_PRODUCT_NAME; } if ( s == "PRODUCT_VERSION" ) { return HpiConst.SAHPI_IDR_FIELDTYPE_PRODUCT_VERSION; } if ( s == "SERIAL_NUMBER" ) { return HpiConst.SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER; } if ( s == "PART_NUMBER" ) { return HpiConst.SAHPI_IDR_FIELDTYPE_PART_NUMBER; } if ( s == "FILE_ID" ) { return HpiConst.SAHPI_IDR_FIELDTYPE_FILE_ID; } if ( s == "ASSET_TAG" ) { return HpiConst.SAHPI_IDR_FIELDTYPE_ASSET_TAG; } if ( s == "CUSTOM" ) { return HpiConst.SAHPI_IDR_FIELDTYPE_CUSTOM; } if ( s == "UNSPECIFIED" ) { return HpiConst.SAHPI_IDR_FIELDTYPE_UNSPECIFIED; } throw new FormatException(); } /** * For SaHpiWatchdogActionT */ public static string FromSaHpiWatchdogActionT( long x ) { switch( x ) { case HpiConst.SAHPI_WA_NO_ACTION: return "NO_ACTION"; case HpiConst.SAHPI_WA_RESET: return "RESET"; case HpiConst.SAHPI_WA_POWER_DOWN: return "POWER_DOWN"; case HpiConst.SAHPI_WA_POWER_CYCLE: return "POWER_CYCLE"; default: return Convert.ToString( x ); } } public static long ToSaHpiWatchdogActionT( string s ) { if ( s == "NO_ACTION" ) { return HpiConst.SAHPI_WA_NO_ACTION; } if ( s == "RESET" ) { return HpiConst.SAHPI_WA_RESET; } if ( s == "POWER_DOWN" ) { return HpiConst.SAHPI_WA_POWER_DOWN; } if ( s == "POWER_CYCLE" ) { return HpiConst.SAHPI_WA_POWER_CYCLE; } throw new FormatException(); } /** * For SaHpiWatchdogActionEventT */ public static string FromSaHpiWatchdogActionEventT( long x ) { switch( x ) { case HpiConst.SAHPI_WAE_NO_ACTION: return "NO_ACTION"; case HpiConst.SAHPI_WAE_RESET: return "RESET"; case HpiConst.SAHPI_WAE_POWER_DOWN: return "POWER_DOWN"; case HpiConst.SAHPI_WAE_POWER_CYCLE: return "POWER_CYCLE"; case HpiConst.SAHPI_WAE_TIMER_INT: return "TIMER_INT"; default: return Convert.ToString( x ); } } public static long ToSaHpiWatchdogActionEventT( string s ) { if ( s == "NO_ACTION" ) { return HpiConst.SAHPI_WAE_NO_ACTION; } if ( s == "RESET" ) { return HpiConst.SAHPI_WAE_RESET; } if ( s == "POWER_DOWN" ) { return HpiConst.SAHPI_WAE_POWER_DOWN; } if ( s == "POWER_CYCLE" ) { return HpiConst.SAHPI_WAE_POWER_CYCLE; } if ( s == "TIMER_INT" ) { return HpiConst.SAHPI_WAE_TIMER_INT; } throw new FormatException(); } /** * For SaHpiWatchdogPretimerInterruptT */ public static string FromSaHpiWatchdogPretimerInterruptT( long x ) { switch( x ) { case HpiConst.SAHPI_WPI_NONE: return "NONE"; case HpiConst.SAHPI_WPI_SMI: return "SMI"; case HpiConst.SAHPI_WPI_NMI: return "NMI"; case HpiConst.SAHPI_WPI_MESSAGE_INTERRUPT: return "MESSAGE_INTERRUPT"; case HpiConst.SAHPI_WPI_OEM: return "OEM"; default: return Convert.ToString( x ); } } public static long ToSaHpiWatchdogPretimerInterruptT( string s ) { if ( s == "NONE" ) { return HpiConst.SAHPI_WPI_NONE; } if ( s == "SMI" ) { return HpiConst.SAHPI_WPI_SMI; } if ( s == "NMI" ) { return HpiConst.SAHPI_WPI_NMI; } if ( s == "MESSAGE_INTERRUPT" ) { return HpiConst.SAHPI_WPI_MESSAGE_INTERRUPT; } if ( s == "OEM" ) { return HpiConst.SAHPI_WPI_OEM; } throw new FormatException(); } /** * For SaHpiWatchdogTimerUseT */ public static string FromSaHpiWatchdogTimerUseT( long x ) { switch( x ) { case HpiConst.SAHPI_WTU_NONE: return "NONE"; case HpiConst.SAHPI_WTU_BIOS_FRB2: return "BIOS_FRB2"; case HpiConst.SAHPI_WTU_BIOS_POST: return "BIOS_POST"; case HpiConst.SAHPI_WTU_OS_LOAD: return "OS_LOAD"; case HpiConst.SAHPI_WTU_SMS_OS: return "SMS_OS"; case HpiConst.SAHPI_WTU_OEM: return "OEM"; case HpiConst.SAHPI_WTU_UNSPECIFIED: return "UNSPECIFIED"; default: return Convert.ToString( x ); } } public static long ToSaHpiWatchdogTimerUseT( string s ) { if ( s == "NONE" ) { return HpiConst.SAHPI_WTU_NONE; } if ( s == "BIOS_FRB2" ) { return HpiConst.SAHPI_WTU_BIOS_FRB2; } if ( s == "BIOS_POST" ) { return HpiConst.SAHPI_WTU_BIOS_POST; } if ( s == "OS_LOAD" ) { return HpiConst.SAHPI_WTU_OS_LOAD; } if ( s == "SMS_OS" ) { return HpiConst.SAHPI_WTU_SMS_OS; } if ( s == "OEM" ) { return HpiConst.SAHPI_WTU_OEM; } if ( s == "UNSPECIFIED" ) { return HpiConst.SAHPI_WTU_UNSPECIFIED; } throw new FormatException(); } /** * For SaHpiDimiTestServiceImpactT */ public static string FromSaHpiDimiTestServiceImpactT( long x ) { switch( x ) { case HpiConst.SAHPI_DIMITEST_NONDEGRADING: return "NONDEGRADING"; case HpiConst.SAHPI_DIMITEST_DEGRADING: return "DEGRADING"; case HpiConst.SAHPI_DIMITEST_VENDOR_DEFINED_LEVEL: return "VENDOR_DEFINED_LEVEL"; default: return Convert.ToString( x ); } } public static long ToSaHpiDimiTestServiceImpactT( string s ) { if ( s == "NONDEGRADING" ) { return HpiConst.SAHPI_DIMITEST_NONDEGRADING; } if ( s == "DEGRADING" ) { return HpiConst.SAHPI_DIMITEST_DEGRADING; } if ( s == "VENDOR_DEFINED_LEVEL" ) { return HpiConst.SAHPI_DIMITEST_VENDOR_DEFINED_LEVEL; } throw new FormatException(); } /** * For SaHpiDimiTestRunStatusT */ public static string FromSaHpiDimiTestRunStatusT( long x ) { switch( x ) { case HpiConst.SAHPI_DIMITEST_STATUS_NOT_RUN: return "NOT_RUN"; case HpiConst.SAHPI_DIMITEST_STATUS_FINISHED_NO_ERRORS: return "FINISHED_NO_ERRORS"; case HpiConst.SAHPI_DIMITEST_STATUS_FINISHED_ERRORS: return "FINISHED_ERRORS"; case HpiConst.SAHPI_DIMITEST_STATUS_CANCELED: return "CANCELED"; case HpiConst.SAHPI_DIMITEST_STATUS_RUNNING: return "RUNNING"; default: return Convert.ToString( x ); } } public static long ToSaHpiDimiTestRunStatusT( string s ) { if ( s == "NOT_RUN" ) { return HpiConst.SAHPI_DIMITEST_STATUS_NOT_RUN; } if ( s == "FINISHED_NO_ERRORS" ) { return HpiConst.SAHPI_DIMITEST_STATUS_FINISHED_NO_ERRORS; } if ( s == "FINISHED_ERRORS" ) { return HpiConst.SAHPI_DIMITEST_STATUS_FINISHED_ERRORS; } if ( s == "CANCELED" ) { return HpiConst.SAHPI_DIMITEST_STATUS_CANCELED; } if ( s == "RUNNING" ) { return HpiConst.SAHPI_DIMITEST_STATUS_RUNNING; } throw new FormatException(); } /** * For SaHpiDimiTestErrCodeT */ public static string FromSaHpiDimiTestErrCodeT( long x ) { switch( x ) { case HpiConst.SAHPI_DIMITEST_STATUSERR_NOERR: return "NOERR"; case HpiConst.SAHPI_DIMITEST_STATUSERR_RUNERR: return "RUNERR"; case HpiConst.SAHPI_DIMITEST_STATUSERR_UNDEF: return "UNDEF"; default: return Convert.ToString( x ); } } public static long ToSaHpiDimiTestErrCodeT( string s ) { if ( s == "NOERR" ) { return HpiConst.SAHPI_DIMITEST_STATUSERR_NOERR; } if ( s == "RUNERR" ) { return HpiConst.SAHPI_DIMITEST_STATUSERR_RUNERR; } if ( s == "UNDEF" ) { return HpiConst.SAHPI_DIMITEST_STATUSERR_UNDEF; } throw new FormatException(); } /** * For SaHpiDimiTestParamTypeT */ public static string FromSaHpiDimiTestParamTypeT( long x ) { switch( x ) { case HpiConst.SAHPI_DIMITEST_PARAM_TYPE_BOOLEAN: return "BOOLEAN"; case HpiConst.SAHPI_DIMITEST_PARAM_TYPE_INT32: return "INT32"; case HpiConst.SAHPI_DIMITEST_PARAM_TYPE_FLOAT64: return "FLOAT64"; case HpiConst.SAHPI_DIMITEST_PARAM_TYPE_TEXT: return "TEXT"; default: return Convert.ToString( x ); } } public static long ToSaHpiDimiTestParamTypeT( string s ) { if ( s == "BOOLEAN" ) { return HpiConst.SAHPI_DIMITEST_PARAM_TYPE_BOOLEAN; } if ( s == "INT32" ) { return HpiConst.SAHPI_DIMITEST_PARAM_TYPE_INT32; } if ( s == "FLOAT64" ) { return HpiConst.SAHPI_DIMITEST_PARAM_TYPE_FLOAT64; } if ( s == "TEXT" ) { return HpiConst.SAHPI_DIMITEST_PARAM_TYPE_TEXT; } throw new FormatException(); } /** * For SaHpiDimiReadyT */ public static string FromSaHpiDimiReadyT( long x ) { switch( x ) { case HpiConst.SAHPI_DIMI_READY: return "READY"; case HpiConst.SAHPI_DIMI_WRONG_STATE: return "WRONG_STATE"; case HpiConst.SAHPI_DIMI_BUSY: return "BUSY"; default: return Convert.ToString( x ); } } public static long ToSaHpiDimiReadyT( string s ) { if ( s == "READY" ) { return HpiConst.SAHPI_DIMI_READY; } if ( s == "WRONG_STATE" ) { return HpiConst.SAHPI_DIMI_WRONG_STATE; } if ( s == "BUSY" ) { return HpiConst.SAHPI_DIMI_BUSY; } throw new FormatException(); } /** * For SaHpiFumiSpecInfoTypeT */ public static string FromSaHpiFumiSpecInfoTypeT( long x ) { switch( x ) { case HpiConst.SAHPI_FUMI_SPEC_INFO_NONE: return "NONE"; case HpiConst.SAHPI_FUMI_SPEC_INFO_SAF_DEFINED: return "SAF_DEFINED"; case HpiConst.SAHPI_FUMI_SPEC_INFO_OEM_DEFINED: return "OEM_DEFINED"; default: return Convert.ToString( x ); } } public static long ToSaHpiFumiSpecInfoTypeT( string s ) { if ( s == "NONE" ) { return HpiConst.SAHPI_FUMI_SPEC_INFO_NONE; } if ( s == "SAF_DEFINED" ) { return HpiConst.SAHPI_FUMI_SPEC_INFO_SAF_DEFINED; } if ( s == "OEM_DEFINED" ) { return HpiConst.SAHPI_FUMI_SPEC_INFO_OEM_DEFINED; } throw new FormatException(); } /** * For SaHpiFumiSafDefinedSpecIdT */ public static string FromSaHpiFumiSafDefinedSpecIdT( long x ) { switch( x ) { case HpiConst.SAHPI_FUMI_SPEC_HPM1: return ""; default: return Convert.ToString( x ); } } public static long ToSaHpiFumiSafDefinedSpecIdT( string s ) { if ( s == "" ) { return HpiConst.SAHPI_FUMI_SPEC_HPM1; } throw new FormatException(); } /** * For SaHpiFumiServiceImpactT */ public static string FromSaHpiFumiServiceImpactT( long x ) { switch( x ) { case HpiConst.SAHPI_FUMI_PROCESS_NONDEGRADING: return "NONDEGRADING"; case HpiConst.SAHPI_FUMI_PROCESS_DEGRADING: return "DEGRADING"; case HpiConst.SAHPI_FUMI_PROCESS_VENDOR_DEFINED_IMPACT_LEVEL: return "VENDOR_DEFINED_IMPACT_LEVEL"; default: return Convert.ToString( x ); } } public static long ToSaHpiFumiServiceImpactT( string s ) { if ( s == "NONDEGRADING" ) { return HpiConst.SAHPI_FUMI_PROCESS_NONDEGRADING; } if ( s == "DEGRADING" ) { return HpiConst.SAHPI_FUMI_PROCESS_DEGRADING; } if ( s == "VENDOR_DEFINED_IMPACT_LEVEL" ) { return HpiConst.SAHPI_FUMI_PROCESS_VENDOR_DEFINED_IMPACT_LEVEL; } throw new FormatException(); } /** * For SaHpiFumiSourceStatusT */ public static string FromSaHpiFumiSourceStatusT( long x ) { switch( x ) { case HpiConst.SAHPI_FUMI_SRC_VALID: return "VALID"; case HpiConst.SAHPI_FUMI_SRC_PROTOCOL_NOT_SUPPORTED: return "PROTOCOL_NOT_SUPPORTED"; case HpiConst.SAHPI_FUMI_SRC_UNREACHABLE: return "UNREACHABLE"; case HpiConst.SAHPI_FUMI_SRC_VALIDATION_NOT_STARTED: return "VALIDATION_NOT_STARTED"; case HpiConst.SAHPI_FUMI_SRC_VALIDATION_INITIATED: return "VALIDATION_INITIATED"; case HpiConst.SAHPI_FUMI_SRC_VALIDATION_FAIL: return "VALIDATION_FAIL"; case HpiConst.SAHPI_FUMI_SRC_TYPE_MISMATCH: return "TYPE_MISMATCH"; case HpiConst.SAHPI_FUMI_SRC_INVALID: return "INVALID"; case HpiConst.SAHPI_FUMI_SRC_VALIDITY_UNKNOWN: return "VALIDITY_UNKNOWN"; default: return Convert.ToString( x ); } } public static long ToSaHpiFumiSourceStatusT( string s ) { if ( s == "VALID" ) { return HpiConst.SAHPI_FUMI_SRC_VALID; } if ( s == "PROTOCOL_NOT_SUPPORTED" ) { return HpiConst.SAHPI_FUMI_SRC_PROTOCOL_NOT_SUPPORTED; } if ( s == "UNREACHABLE" ) { return HpiConst.SAHPI_FUMI_SRC_UNREACHABLE; } if ( s == "VALIDATION_NOT_STARTED" ) { return HpiConst.SAHPI_FUMI_SRC_VALIDATION_NOT_STARTED; } if ( s == "VALIDATION_INITIATED" ) { return HpiConst.SAHPI_FUMI_SRC_VALIDATION_INITIATED; } if ( s == "VALIDATION_FAIL" ) { return HpiConst.SAHPI_FUMI_SRC_VALIDATION_FAIL; } if ( s == "TYPE_MISMATCH" ) { return HpiConst.SAHPI_FUMI_SRC_TYPE_MISMATCH; } if ( s == "INVALID" ) { return HpiConst.SAHPI_FUMI_SRC_INVALID; } if ( s == "VALIDITY_UNKNOWN" ) { return HpiConst.SAHPI_FUMI_SRC_VALIDITY_UNKNOWN; } throw new FormatException(); } /** * For SaHpiFumiBankStateT */ public static string FromSaHpiFumiBankStateT( long x ) { switch( x ) { case HpiConst.SAHPI_FUMI_BANK_VALID: return "VALID"; case HpiConst.SAHPI_FUMI_BANK_UPGRADE_IN_PROGRESS: return "UPGRADE_IN_PROGRESS"; case HpiConst.SAHPI_FUMI_BANK_CORRUPTED: return "CORRUPTED"; case HpiConst.SAHPI_FUMI_BANK_ACTIVE: return "ACTIVE"; case HpiConst.SAHPI_FUMI_BANK_BUSY: return "BUSY"; case HpiConst.SAHPI_FUMI_BANK_UNKNOWN: return "UNKNOWN"; default: return Convert.ToString( x ); } } public static long ToSaHpiFumiBankStateT( string s ) { if ( s == "VALID" ) { return HpiConst.SAHPI_FUMI_BANK_VALID; } if ( s == "UPGRADE_IN_PROGRESS" ) { return HpiConst.SAHPI_FUMI_BANK_UPGRADE_IN_PROGRESS; } if ( s == "CORRUPTED" ) { return HpiConst.SAHPI_FUMI_BANK_CORRUPTED; } if ( s == "ACTIVE" ) { return HpiConst.SAHPI_FUMI_BANK_ACTIVE; } if ( s == "BUSY" ) { return HpiConst.SAHPI_FUMI_BANK_BUSY; } if ( s == "UNKNOWN" ) { return HpiConst.SAHPI_FUMI_BANK_UNKNOWN; } throw new FormatException(); } /** * For SaHpiFumiUpgradeStatusT */ public static string FromSaHpiFumiUpgradeStatusT( long x ) { switch( x ) { case HpiConst.SAHPI_FUMI_OPERATION_NOTSTARTED: return "OPERATION_NOTSTARTED"; case HpiConst.SAHPI_FUMI_SOURCE_VALIDATION_INITIATED: return "SOURCE_VALIDATION_INITIATED"; case HpiConst.SAHPI_FUMI_SOURCE_VALIDATION_FAILED: return "SOURCE_VALIDATION_FAILED"; case HpiConst.SAHPI_FUMI_SOURCE_VALIDATION_DONE: return "SOURCE_VALIDATION_DONE"; case HpiConst.SAHPI_FUMI_SOURCE_VALIDATION_CANCELLED: return "SOURCE_VALIDATION_CANCELLED"; case HpiConst.SAHPI_FUMI_INSTALL_INITIATED: return "INSTALL_INITIATED"; case HpiConst.SAHPI_FUMI_INSTALL_FAILED_ROLLBACK_NEEDED: return "INSTALL_FAILED_ROLLBACK_NEEDED"; case HpiConst.SAHPI_FUMI_INSTALL_FAILED_ROLLBACK_INITIATED: return "INSTALL_FAILED_ROLLBACK_INITIATED"; case HpiConst.SAHPI_FUMI_INSTALL_FAILED_ROLLBACK_NOT_POSSIBLE: return "INSTALL_FAILED_ROLLBACK_NOT_POSSIBLE"; case HpiConst.SAHPI_FUMI_INSTALL_DONE: return "INSTALL_DONE"; case HpiConst.SAHPI_FUMI_INSTALL_CANCELLED: return "INSTALL_CANCELLED"; case HpiConst.SAHPI_FUMI_ROLLBACK_INITIATED: return "ROLLBACK_INITIATED"; case HpiConst.SAHPI_FUMI_ROLLBACK_FAILED: return "ROLLBACK_FAILED"; case HpiConst.SAHPI_FUMI_ROLLBACK_DONE: return "ROLLBACK_DONE"; case HpiConst.SAHPI_FUMI_ROLLBACK_CANCELLED: return "ROLLBACK_CANCELLED"; case HpiConst.SAHPI_FUMI_BACKUP_INITIATED: return "BACKUP_INITIATED"; case HpiConst.SAHPI_FUMI_BACKUP_FAILED: return "BACKUP_FAILED"; case HpiConst.SAHPI_FUMI_BACKUP_DONE: return "BACKUP_DONE"; case HpiConst.SAHPI_FUMI_BACKUP_CANCELLED: return "BACKUP_CANCELLED"; case HpiConst.SAHPI_FUMI_BANK_COPY_INITIATED: return "BANK_COPY_INITIATED"; case HpiConst.SAHPI_FUMI_BANK_COPY_FAILED: return "BANK_COPY_FAILED"; case HpiConst.SAHPI_FUMI_BANK_COPY_DONE: return "BANK_COPY_DONE"; case HpiConst.SAHPI_FUMI_BANK_COPY_CANCELLED: return "BANK_COPY_CANCELLED"; case HpiConst.SAHPI_FUMI_TARGET_VERIFY_INITIATED: return "TARGET_VERIFY_INITIATED"; case HpiConst.SAHPI_FUMI_TARGET_VERIFY_FAILED: return "TARGET_VERIFY_FAILED"; case HpiConst.SAHPI_FUMI_TARGET_VERIFY_DONE: return "TARGET_VERIFY_DONE"; case HpiConst.SAHPI_FUMI_TARGET_VERIFY_CANCELLED: return "TARGET_VERIFY_CANCELLED"; case HpiConst.SAHPI_FUMI_ACTIVATE_INITIATED: return "ACTIVATE_INITIATED"; case HpiConst.SAHPI_FUMI_ACTIVATE_FAILED_ROLLBACK_NEEDED: return "ACTIVATE_FAILED_ROLLBACK_NEEDED"; case HpiConst.SAHPI_FUMI_ACTIVATE_FAILED_ROLLBACK_INITIATED: return "ACTIVATE_FAILED_ROLLBACK_INITIATED"; case HpiConst.SAHPI_FUMI_ACTIVATE_FAILED_ROLLBACK_NOT_POSSIBLE: return "ACTIVATE_FAILED_ROLLBACK_NOT_POSSIBLE"; case HpiConst.SAHPI_FUMI_ACTIVATE_DONE: return "ACTIVATE_DONE"; case HpiConst.SAHPI_FUMI_ACTIVATE_CANCELLED: return "ACTIVATE_CANCELLED"; default: return Convert.ToString( x ); } } public static long ToSaHpiFumiUpgradeStatusT( string s ) { if ( s == "OPERATION_NOTSTARTED" ) { return HpiConst.SAHPI_FUMI_OPERATION_NOTSTARTED; } if ( s == "SOURCE_VALIDATION_INITIATED" ) { return HpiConst.SAHPI_FUMI_SOURCE_VALIDATION_INITIATED; } if ( s == "SOURCE_VALIDATION_FAILED" ) { return HpiConst.SAHPI_FUMI_SOURCE_VALIDATION_FAILED; } if ( s == "SOURCE_VALIDATION_DONE" ) { return HpiConst.SAHPI_FUMI_SOURCE_VALIDATION_DONE; } if ( s == "SOURCE_VALIDATION_CANCELLED" ) { return HpiConst.SAHPI_FUMI_SOURCE_VALIDATION_CANCELLED; } if ( s == "INSTALL_INITIATED" ) { return HpiConst.SAHPI_FUMI_INSTALL_INITIATED; } if ( s == "INSTALL_FAILED_ROLLBACK_NEEDED" ) { return HpiConst.SAHPI_FUMI_INSTALL_FAILED_ROLLBACK_NEEDED; } if ( s == "INSTALL_FAILED_ROLLBACK_INITIATED" ) { return HpiConst.SAHPI_FUMI_INSTALL_FAILED_ROLLBACK_INITIATED; } if ( s == "INSTALL_FAILED_ROLLBACK_NOT_POSSIBLE" ) { return HpiConst.SAHPI_FUMI_INSTALL_FAILED_ROLLBACK_NOT_POSSIBLE; } if ( s == "INSTALL_DONE" ) { return HpiConst.SAHPI_FUMI_INSTALL_DONE; } if ( s == "INSTALL_CANCELLED" ) { return HpiConst.SAHPI_FUMI_INSTALL_CANCELLED; } if ( s == "ROLLBACK_INITIATED" ) { return HpiConst.SAHPI_FUMI_ROLLBACK_INITIATED; } if ( s == "ROLLBACK_FAILED" ) { return HpiConst.SAHPI_FUMI_ROLLBACK_FAILED; } if ( s == "ROLLBACK_DONE" ) { return HpiConst.SAHPI_FUMI_ROLLBACK_DONE; } if ( s == "ROLLBACK_CANCELLED" ) { return HpiConst.SAHPI_FUMI_ROLLBACK_CANCELLED; } if ( s == "BACKUP_INITIATED" ) { return HpiConst.SAHPI_FUMI_BACKUP_INITIATED; } if ( s == "BACKUP_FAILED" ) { return HpiConst.SAHPI_FUMI_BACKUP_FAILED; } if ( s == "BACKUP_DONE" ) { return HpiConst.SAHPI_FUMI_BACKUP_DONE; } if ( s == "BACKUP_CANCELLED" ) { return HpiConst.SAHPI_FUMI_BACKUP_CANCELLED; } if ( s == "BANK_COPY_INITIATED" ) { return HpiConst.SAHPI_FUMI_BANK_COPY_INITIATED; } if ( s == "BANK_COPY_FAILED" ) { return HpiConst.SAHPI_FUMI_BANK_COPY_FAILED; } if ( s == "BANK_COPY_DONE" ) { return HpiConst.SAHPI_FUMI_BANK_COPY_DONE; } if ( s == "BANK_COPY_CANCELLED" ) { return HpiConst.SAHPI_FUMI_BANK_COPY_CANCELLED; } if ( s == "TARGET_VERIFY_INITIATED" ) { return HpiConst.SAHPI_FUMI_TARGET_VERIFY_INITIATED; } if ( s == "TARGET_VERIFY_FAILED" ) { return HpiConst.SAHPI_FUMI_TARGET_VERIFY_FAILED; } if ( s == "TARGET_VERIFY_DONE" ) { return HpiConst.SAHPI_FUMI_TARGET_VERIFY_DONE; } if ( s == "TARGET_VERIFY_CANCELLED" ) { return HpiConst.SAHPI_FUMI_TARGET_VERIFY_CANCELLED; } if ( s == "ACTIVATE_INITIATED" ) { return HpiConst.SAHPI_FUMI_ACTIVATE_INITIATED; } if ( s == "ACTIVATE_FAILED_ROLLBACK_NEEDED" ) { return HpiConst.SAHPI_FUMI_ACTIVATE_FAILED_ROLLBACK_NEEDED; } if ( s == "ACTIVATE_FAILED_ROLLBACK_INITIATED" ) { return HpiConst.SAHPI_FUMI_ACTIVATE_FAILED_ROLLBACK_INITIATED; } if ( s == "ACTIVATE_FAILED_ROLLBACK_NOT_POSSIBLE" ) { return HpiConst.SAHPI_FUMI_ACTIVATE_FAILED_ROLLBACK_NOT_POSSIBLE; } if ( s == "ACTIVATE_DONE" ) { return HpiConst.SAHPI_FUMI_ACTIVATE_DONE; } if ( s == "ACTIVATE_CANCELLED" ) { return HpiConst.SAHPI_FUMI_ACTIVATE_CANCELLED; } throw new FormatException(); } /** * For SaHpiHsIndicatorStateT */ public static string FromSaHpiHsIndicatorStateT( long x ) { switch( x ) { case HpiConst.SAHPI_HS_INDICATOR_OFF: return "FF"; case HpiConst.SAHPI_HS_INDICATOR_ON: return "N"; default: return Convert.ToString( x ); } } public static long ToSaHpiHsIndicatorStateT( string s ) { if ( s == "FF" ) { return HpiConst.SAHPI_HS_INDICATOR_OFF; } if ( s == "N" ) { return HpiConst.SAHPI_HS_INDICATOR_ON; } throw new FormatException(); } /** * For SaHpiHsActionT */ public static string FromSaHpiHsActionT( long x ) { switch( x ) { case HpiConst.SAHPI_HS_ACTION_INSERTION: return "INSERTION"; case HpiConst.SAHPI_HS_ACTION_EXTRACTION: return "EXTRACTION"; default: return Convert.ToString( x ); } } public static long ToSaHpiHsActionT( string s ) { if ( s == "INSERTION" ) { return HpiConst.SAHPI_HS_ACTION_INSERTION; } if ( s == "EXTRACTION" ) { return HpiConst.SAHPI_HS_ACTION_EXTRACTION; } throw new FormatException(); } /** * For SaHpiHsStateT */ public static string FromSaHpiHsStateT( long x ) { switch( x ) { case HpiConst.SAHPI_HS_STATE_INACTIVE: return "INACTIVE"; case HpiConst.SAHPI_HS_STATE_INSERTION_PENDING: return "INSERTION_PENDING"; case HpiConst.SAHPI_HS_STATE_ACTIVE: return "ACTIVE"; case HpiConst.SAHPI_HS_STATE_EXTRACTION_PENDING: return "EXTRACTION_PENDING"; case HpiConst.SAHPI_HS_STATE_NOT_PRESENT: return "NOT_PRESENT"; default: return Convert.ToString( x ); } } public static long ToSaHpiHsStateT( string s ) { if ( s == "INACTIVE" ) { return HpiConst.SAHPI_HS_STATE_INACTIVE; } if ( s == "INSERTION_PENDING" ) { return HpiConst.SAHPI_HS_STATE_INSERTION_PENDING; } if ( s == "ACTIVE" ) { return HpiConst.SAHPI_HS_STATE_ACTIVE; } if ( s == "EXTRACTION_PENDING" ) { return HpiConst.SAHPI_HS_STATE_EXTRACTION_PENDING; } if ( s == "NOT_PRESENT" ) { return HpiConst.SAHPI_HS_STATE_NOT_PRESENT; } throw new FormatException(); } /** * For SaHpiHsCauseOfStateChangeT */ public static string FromSaHpiHsCauseOfStateChangeT( long x ) { switch( x ) { case HpiConst.SAHPI_HS_CAUSE_AUTO_POLICY: return "AUTO_POLICY"; case HpiConst.SAHPI_HS_CAUSE_EXT_SOFTWARE: return "EXT_SOFTWARE"; case HpiConst.SAHPI_HS_CAUSE_OPERATOR_INIT: return "OPERATOR_INIT"; case HpiConst.SAHPI_HS_CAUSE_USER_UPDATE: return "USER_UPDATE"; case HpiConst.SAHPI_HS_CAUSE_UNEXPECTED_DEACTIVATION: return "UNEXPECTED_DEACTIVATION"; case HpiConst.SAHPI_HS_CAUSE_SURPRISE_EXTRACTION: return "SURPRISE_EXTRACTION"; case HpiConst.SAHPI_HS_CAUSE_EXTRACTION_UPDATE: return "EXTRACTION_UPDATE"; case HpiConst.SAHPI_HS_CAUSE_HARDWARE_FAULT: return "HARDWARE_FAULT"; case HpiConst.SAHPI_HS_CAUSE_CONTAINING_FRU: return "CONTAINING_FRU"; case HpiConst.SAHPI_HS_CAUSE_UNKNOWN: return "UNKNOWN"; default: return Convert.ToString( x ); } } public static long ToSaHpiHsCauseOfStateChangeT( string s ) { if ( s == "AUTO_POLICY" ) { return HpiConst.SAHPI_HS_CAUSE_AUTO_POLICY; } if ( s == "EXT_SOFTWARE" ) { return HpiConst.SAHPI_HS_CAUSE_EXT_SOFTWARE; } if ( s == "OPERATOR_INIT" ) { return HpiConst.SAHPI_HS_CAUSE_OPERATOR_INIT; } if ( s == "USER_UPDATE" ) { return HpiConst.SAHPI_HS_CAUSE_USER_UPDATE; } if ( s == "UNEXPECTED_DEACTIVATION" ) { return HpiConst.SAHPI_HS_CAUSE_UNEXPECTED_DEACTIVATION; } if ( s == "SURPRISE_EXTRACTION" ) { return HpiConst.SAHPI_HS_CAUSE_SURPRISE_EXTRACTION; } if ( s == "EXTRACTION_UPDATE" ) { return HpiConst.SAHPI_HS_CAUSE_EXTRACTION_UPDATE; } if ( s == "HARDWARE_FAULT" ) { return HpiConst.SAHPI_HS_CAUSE_HARDWARE_FAULT; } if ( s == "CONTAINING_FRU" ) { return HpiConst.SAHPI_HS_CAUSE_CONTAINING_FRU; } if ( s == "UNKNOWN" ) { return HpiConst.SAHPI_HS_CAUSE_UNKNOWN; } throw new FormatException(); } /** * For SaHpiSeverityT */ public static string FromSaHpiSeverityT( long x ) { switch( x ) { case HpiConst.SAHPI_CRITICAL: return "CRITICAL"; case HpiConst.SAHPI_MAJOR: return "MAJOR"; case HpiConst.SAHPI_MINOR: return "MINOR"; case HpiConst.SAHPI_INFORMATIONAL: return "INFORMATIONAL"; case HpiConst.SAHPI_OK: return "OK"; case HpiConst.SAHPI_DEBUG: return "DEBUG"; case HpiConst.SAHPI_ALL_SEVERITIES: return "ALL_SEVERITIES"; default: return Convert.ToString( x ); } } public static long ToSaHpiSeverityT( string s ) { if ( s == "CRITICAL" ) { return HpiConst.SAHPI_CRITICAL; } if ( s == "MAJOR" ) { return HpiConst.SAHPI_MAJOR; } if ( s == "MINOR" ) { return HpiConst.SAHPI_MINOR; } if ( s == "INFORMATIONAL" ) { return HpiConst.SAHPI_INFORMATIONAL; } if ( s == "OK" ) { return HpiConst.SAHPI_OK; } if ( s == "DEBUG" ) { return HpiConst.SAHPI_DEBUG; } if ( s == "ALL_SEVERITIES" ) { return HpiConst.SAHPI_ALL_SEVERITIES; } throw new FormatException(); } /** * For SaHpiResourceEventTypeT */ public static string FromSaHpiResourceEventTypeT( long x ) { switch( x ) { case HpiConst.SAHPI_RESE_RESOURCE_FAILURE: return "FAILURE"; case HpiConst.SAHPI_RESE_RESOURCE_RESTORED: return "RESTORED"; case HpiConst.SAHPI_RESE_RESOURCE_ADDED: return "ADDED"; case HpiConst.SAHPI_RESE_RESOURCE_REMOVED: return "REMOVED"; case HpiConst.SAHPI_RESE_RESOURCE_INACCESSIBLE: return "INACCESSIBLE"; case HpiConst.SAHPI_RESE_RESOURCE_UPDATED: return "UPDATED"; default: return Convert.ToString( x ); } } public static long ToSaHpiResourceEventTypeT( string s ) { if ( s == "FAILURE" ) { return HpiConst.SAHPI_RESE_RESOURCE_FAILURE; } if ( s == "RESTORED" ) { return HpiConst.SAHPI_RESE_RESOURCE_RESTORED; } if ( s == "ADDED" ) { return HpiConst.SAHPI_RESE_RESOURCE_ADDED; } if ( s == "REMOVED" ) { return HpiConst.SAHPI_RESE_RESOURCE_REMOVED; } if ( s == "INACCESSIBLE" ) { return HpiConst.SAHPI_RESE_RESOURCE_INACCESSIBLE; } if ( s == "UPDATED" ) { return HpiConst.SAHPI_RESE_RESOURCE_UPDATED; } throw new FormatException(); } /** * For SaHpiDomainEventTypeT */ public static string FromSaHpiDomainEventTypeT( long x ) { switch( x ) { case HpiConst.SAHPI_DOMAIN_REF_ADDED: return "ADDED"; case HpiConst.SAHPI_DOMAIN_REF_REMOVED: return "REMOVED"; default: return Convert.ToString( x ); } } public static long ToSaHpiDomainEventTypeT( string s ) { if ( s == "ADDED" ) { return HpiConst.SAHPI_DOMAIN_REF_ADDED; } if ( s == "REMOVED" ) { return HpiConst.SAHPI_DOMAIN_REF_REMOVED; } throw new FormatException(); } /** * For SaHpiSwEventTypeT */ public static string FromSaHpiSwEventTypeT( long x ) { switch( x ) { case HpiConst.SAHPI_HPIE_AUDIT: return "AUDIT"; case HpiConst.SAHPI_HPIE_STARTUP: return "STARTUP"; case HpiConst.SAHPI_HPIE_OTHER: return "OTHER"; default: return Convert.ToString( x ); } } public static long ToSaHpiSwEventTypeT( string s ) { if ( s == "AUDIT" ) { return HpiConst.SAHPI_HPIE_AUDIT; } if ( s == "STARTUP" ) { return HpiConst.SAHPI_HPIE_STARTUP; } if ( s == "OTHER" ) { return HpiConst.SAHPI_HPIE_OTHER; } throw new FormatException(); } /** * For SaHpiEventTypeT */ public static string FromSaHpiEventTypeT( long x ) { switch( x ) { case HpiConst.SAHPI_ET_RESOURCE: return "RESOURCE"; case HpiConst.SAHPI_ET_DOMAIN: return "DOMAIN"; case HpiConst.SAHPI_ET_SENSOR: return "SENSOR"; case HpiConst.SAHPI_ET_SENSOR_ENABLE_CHANGE: return "SENSOR_ENABLE_CHANGE"; case HpiConst.SAHPI_ET_HOTSWAP: return "HOTSWAP"; case HpiConst.SAHPI_ET_WATCHDOG: return "WATCHDOG"; case HpiConst.SAHPI_ET_HPI_SW: return "HPI_SW"; case HpiConst.SAHPI_ET_OEM: return "OEM"; case HpiConst.SAHPI_ET_USER: return "USER"; case HpiConst.SAHPI_ET_DIMI: return "DIMI"; case HpiConst.SAHPI_ET_DIMI_UPDATE: return "DIMI_UPDATE"; case HpiConst.SAHPI_ET_FUMI: return "FUMI"; default: return Convert.ToString( x ); } } public static long ToSaHpiEventTypeT( string s ) { if ( s == "RESOURCE" ) { return HpiConst.SAHPI_ET_RESOURCE; } if ( s == "DOMAIN" ) { return HpiConst.SAHPI_ET_DOMAIN; } if ( s == "SENSOR" ) { return HpiConst.SAHPI_ET_SENSOR; } if ( s == "SENSOR_ENABLE_CHANGE" ) { return HpiConst.SAHPI_ET_SENSOR_ENABLE_CHANGE; } if ( s == "HOTSWAP" ) { return HpiConst.SAHPI_ET_HOTSWAP; } if ( s == "WATCHDOG" ) { return HpiConst.SAHPI_ET_WATCHDOG; } if ( s == "HPI_SW" ) { return HpiConst.SAHPI_ET_HPI_SW; } if ( s == "OEM" ) { return HpiConst.SAHPI_ET_OEM; } if ( s == "USER" ) { return HpiConst.SAHPI_ET_USER; } if ( s == "DIMI" ) { return HpiConst.SAHPI_ET_DIMI; } if ( s == "DIMI_UPDATE" ) { return HpiConst.SAHPI_ET_DIMI_UPDATE; } if ( s == "FUMI" ) { return HpiConst.SAHPI_ET_FUMI; } throw new FormatException(); } /** * For SaHpiStatusCondTypeT */ public static string FromSaHpiStatusCondTypeT( long x ) { switch( x ) { case HpiConst.SAHPI_STATUS_COND_TYPE_SENSOR: return "SENSOR"; case HpiConst.SAHPI_STATUS_COND_TYPE_RESOURCE: return "RESOURCE"; case HpiConst.SAHPI_STATUS_COND_TYPE_OEM: return "OEM"; case HpiConst.SAHPI_STATUS_COND_TYPE_USER: return "USER"; default: return Convert.ToString( x ); } } public static long ToSaHpiStatusCondTypeT( string s ) { if ( s == "SENSOR" ) { return HpiConst.SAHPI_STATUS_COND_TYPE_SENSOR; } if ( s == "RESOURCE" ) { return HpiConst.SAHPI_STATUS_COND_TYPE_RESOURCE; } if ( s == "OEM" ) { return HpiConst.SAHPI_STATUS_COND_TYPE_OEM; } if ( s == "USER" ) { return HpiConst.SAHPI_STATUS_COND_TYPE_USER; } throw new FormatException(); } /** * For SaHpiAnnunciatorModeT */ public static string FromSaHpiAnnunciatorModeT( long x ) { switch( x ) { case HpiConst.SAHPI_ANNUNCIATOR_MODE_AUTO: return "AUTO"; case HpiConst.SAHPI_ANNUNCIATOR_MODE_USER: return "USER"; case HpiConst.SAHPI_ANNUNCIATOR_MODE_SHARED: return "SHARED"; default: return Convert.ToString( x ); } } public static long ToSaHpiAnnunciatorModeT( string s ) { if ( s == "AUTO" ) { return HpiConst.SAHPI_ANNUNCIATOR_MODE_AUTO; } if ( s == "USER" ) { return HpiConst.SAHPI_ANNUNCIATOR_MODE_USER; } if ( s == "SHARED" ) { return HpiConst.SAHPI_ANNUNCIATOR_MODE_SHARED; } throw new FormatException(); } /** * For SaHpiAnnunciatorTypeT */ public static string FromSaHpiAnnunciatorTypeT( long x ) { switch( x ) { case HpiConst.SAHPI_ANNUNCIATOR_TYPE_LED: return "LED"; case HpiConst.SAHPI_ANNUNCIATOR_TYPE_DRY_CONTACT_CLOSURE: return "DRY_CONTACT_CLOSURE"; case HpiConst.SAHPI_ANNUNCIATOR_TYPE_AUDIBLE: return "AUDIBLE"; case HpiConst.SAHPI_ANNUNCIATOR_TYPE_LCD_DISPLAY: return "LCD_DISPLAY"; case HpiConst.SAHPI_ANNUNCIATOR_TYPE_MESSAGE: return "MESSAGE"; case HpiConst.SAHPI_ANNUNCIATOR_TYPE_COMPOSITE: return "COMPOSITE"; case HpiConst.SAHPI_ANNUNCIATOR_TYPE_OEM: return "OEM"; default: return Convert.ToString( x ); } } public static long ToSaHpiAnnunciatorTypeT( string s ) { if ( s == "LED" ) { return HpiConst.SAHPI_ANNUNCIATOR_TYPE_LED; } if ( s == "DRY_CONTACT_CLOSURE" ) { return HpiConst.SAHPI_ANNUNCIATOR_TYPE_DRY_CONTACT_CLOSURE; } if ( s == "AUDIBLE" ) { return HpiConst.SAHPI_ANNUNCIATOR_TYPE_AUDIBLE; } if ( s == "LCD_DISPLAY" ) { return HpiConst.SAHPI_ANNUNCIATOR_TYPE_LCD_DISPLAY; } if ( s == "MESSAGE" ) { return HpiConst.SAHPI_ANNUNCIATOR_TYPE_MESSAGE; } if ( s == "COMPOSITE" ) { return HpiConst.SAHPI_ANNUNCIATOR_TYPE_COMPOSITE; } if ( s == "OEM" ) { return HpiConst.SAHPI_ANNUNCIATOR_TYPE_OEM; } throw new FormatException(); } /** * For SaHpiRdrTypeT */ public static string FromSaHpiRdrTypeT( long x ) { switch( x ) { case HpiConst.SAHPI_NO_RECORD: return "NO_RECORD"; case HpiConst.SAHPI_CTRL_RDR: return "CTRL_RDR"; case HpiConst.SAHPI_SENSOR_RDR: return "SENSOR_RDR"; case HpiConst.SAHPI_INVENTORY_RDR: return "INVENTORY_RDR"; case HpiConst.SAHPI_WATCHDOG_RDR: return "WATCHDOG_RDR"; case HpiConst.SAHPI_ANNUNCIATOR_RDR: return "ANNUNCIATOR_RDR"; case HpiConst.SAHPI_DIMI_RDR: return "DIMI_RDR"; case HpiConst.SAHPI_FUMI_RDR: return "FUMI_RDR"; default: return Convert.ToString( x ); } } public static long ToSaHpiRdrTypeT( string s ) { if ( s == "NO_RECORD" ) { return HpiConst.SAHPI_NO_RECORD; } if ( s == "CTRL_RDR" ) { return HpiConst.SAHPI_CTRL_RDR; } if ( s == "SENSOR_RDR" ) { return HpiConst.SAHPI_SENSOR_RDR; } if ( s == "INVENTORY_RDR" ) { return HpiConst.SAHPI_INVENTORY_RDR; } if ( s == "WATCHDOG_RDR" ) { return HpiConst.SAHPI_WATCHDOG_RDR; } if ( s == "ANNUNCIATOR_RDR" ) { return HpiConst.SAHPI_ANNUNCIATOR_RDR; } if ( s == "DIMI_RDR" ) { return HpiConst.SAHPI_DIMI_RDR; } if ( s == "FUMI_RDR" ) { return HpiConst.SAHPI_FUMI_RDR; } throw new FormatException(); } /** * For SaHpiParmActionT */ public static string FromSaHpiParmActionT( long x ) { switch( x ) { case HpiConst.SAHPI_DEFAULT_PARM: return "DEFAULT_PARM"; case HpiConst.SAHPI_SAVE_PARM: return "SAVE_PARM"; case HpiConst.SAHPI_RESTORE_PARM: return "RESTORE_PARM"; default: return Convert.ToString( x ); } } public static long ToSaHpiParmActionT( string s ) { if ( s == "DEFAULT_PARM" ) { return HpiConst.SAHPI_DEFAULT_PARM; } if ( s == "SAVE_PARM" ) { return HpiConst.SAHPI_SAVE_PARM; } if ( s == "RESTORE_PARM" ) { return HpiConst.SAHPI_RESTORE_PARM; } throw new FormatException(); } /** * For SaHpiResetActionT */ public static string FromSaHpiResetActionT( long x ) { switch( x ) { case HpiConst.SAHPI_COLD_RESET: return "COLD_RESET"; case HpiConst.SAHPI_WARM_RESET: return "WARM_RESET"; case HpiConst.SAHPI_RESET_ASSERT: return "RESET_ASSERT"; case HpiConst.SAHPI_RESET_DEASSERT: return "RESET_DEASSERT"; default: return Convert.ToString( x ); } } public static long ToSaHpiResetActionT( string s ) { if ( s == "COLD_RESET" ) { return HpiConst.SAHPI_COLD_RESET; } if ( s == "WARM_RESET" ) { return HpiConst.SAHPI_WARM_RESET; } if ( s == "RESET_ASSERT" ) { return HpiConst.SAHPI_RESET_ASSERT; } if ( s == "RESET_DEASSERT" ) { return HpiConst.SAHPI_RESET_DEASSERT; } throw new FormatException(); } /** * For SaHpiPowerStateT */ public static string FromSaHpiPowerStateT( long x ) { switch( x ) { case HpiConst.SAHPI_POWER_OFF: return "OFF"; case HpiConst.SAHPI_POWER_ON: return "ON"; case HpiConst.SAHPI_POWER_CYCLE: return "CYCLE"; default: return Convert.ToString( x ); } } public static long ToSaHpiPowerStateT( string s ) { if ( s == "OFF" ) { return HpiConst.SAHPI_POWER_OFF; } if ( s == "ON" ) { return HpiConst.SAHPI_POWER_ON; } if ( s == "CYCLE" ) { return HpiConst.SAHPI_POWER_CYCLE; } throw new FormatException(); } /** * For SaHpiEventLogOverflowActionT */ public static string FromSaHpiEventLogOverflowActionT( long x ) { switch( x ) { case HpiConst.SAHPI_EL_OVERFLOW_DROP: return "DROP"; case HpiConst.SAHPI_EL_OVERFLOW_OVERWRITE: return "OVERWRITE"; default: return Convert.ToString( x ); } } public static long ToSaHpiEventLogOverflowActionT( string s ) { if ( s == "DROP" ) { return HpiConst.SAHPI_EL_OVERFLOW_DROP; } if ( s == "OVERWRITE" ) { return HpiConst.SAHPI_EL_OVERFLOW_OVERWRITE; } throw new FormatException(); } /** * For AtcaHpiLedColorT */ public static string FromAtcaHpiLedColorT( long x ) { switch( x ) { case HpiConst.ATCAHPI_LED_COLOR_RESERVED: return "RESERVED"; case HpiConst.ATCAHPI_LED_COLOR_BLUE: return "BLUE"; case HpiConst.ATCAHPI_LED_COLOR_RED: return "RED"; case HpiConst.ATCAHPI_LED_COLOR_GREEN: return "GREEN"; case HpiConst.ATCAHPI_LED_COLOR_AMBER: return "AMBER"; case HpiConst.ATCAHPI_LED_COLOR_ORANGE: return "ORANGE"; case HpiConst.ATCAHPI_LED_COLOR_WHITE: return "WHITE"; case HpiConst.ATCAHPI_LED_COLOR_NO_CHANGE: return "NO_CHANGE"; case HpiConst.ATCAHPI_LED_COLOR_USE_DEFAULT: return "USE_DEFAULT"; default: return Convert.ToString( x ); } } public static long ToAtcaHpiLedColorT( string s ) { if ( s == "RESERVED" ) { return HpiConst.ATCAHPI_LED_COLOR_RESERVED; } if ( s == "BLUE" ) { return HpiConst.ATCAHPI_LED_COLOR_BLUE; } if ( s == "RED" ) { return HpiConst.ATCAHPI_LED_COLOR_RED; } if ( s == "GREEN" ) { return HpiConst.ATCAHPI_LED_COLOR_GREEN; } if ( s == "AMBER" ) { return HpiConst.ATCAHPI_LED_COLOR_AMBER; } if ( s == "ORANGE" ) { return HpiConst.ATCAHPI_LED_COLOR_ORANGE; } if ( s == "WHITE" ) { return HpiConst.ATCAHPI_LED_COLOR_WHITE; } if ( s == "NO_CHANGE" ) { return HpiConst.ATCAHPI_LED_COLOR_NO_CHANGE; } if ( s == "USE_DEFAULT" ) { return HpiConst.ATCAHPI_LED_COLOR_USE_DEFAULT; } throw new FormatException(); } /** * For AtcaHpiResourceLedModeT */ public static string FromAtcaHpiResourceLedModeT( long x ) { switch( x ) { case HpiConst.ATCAHPI_LED_AUTO: return "AUTO"; case HpiConst.ATCAHPI_LED_MANUAL: return "MANUAL"; case HpiConst.ATCAHPI_LED_LAMP_TEST: return "LAMP_TEST"; default: return Convert.ToString( x ); } } public static long ToAtcaHpiResourceLedModeT( string s ) { if ( s == "AUTO" ) { return HpiConst.ATCAHPI_LED_AUTO; } if ( s == "MANUAL" ) { return HpiConst.ATCAHPI_LED_MANUAL; } if ( s == "LAMP_TEST" ) { return HpiConst.ATCAHPI_LED_LAMP_TEST; } throw new FormatException(); } /** * For AtcaHpiLedBrSupportT */ public static string FromAtcaHpiLedBrSupportT( long x ) { switch( x ) { case HpiConst.ATCAHPI_LED_BR_SUPPORTED: return "SUPPORTED"; case HpiConst.ATCAHPI_LED_BR_NOT_SUPPORTED: return "NOT_SUPPORTED"; case HpiConst.ATCAHPI_LED_BR_UNKNOWN: return "UNKNOWN"; default: return Convert.ToString( x ); } } public static long ToAtcaHpiLedBrSupportT( string s ) { if ( s == "SUPPORTED" ) { return HpiConst.ATCAHPI_LED_BR_SUPPORTED; } if ( s == "NOT_SUPPORTED" ) { return HpiConst.ATCAHPI_LED_BR_NOT_SUPPORTED; } if ( s == "UNKNOWN" ) { return HpiConst.ATCAHPI_LED_BR_UNKNOWN; } throw new FormatException(); } /** * For XtcaHpiLedColorT */ public static string FromXtcaHpiLedColorT( long x ) { switch( x ) { case HpiConst.XTCAHPI_LED_COLOR_RESERVED: return "RESERVED"; case HpiConst.XTCAHPI_LED_COLOR_BLUE: return "BLUE"; case HpiConst.XTCAHPI_LED_COLOR_RED: return "RED"; case HpiConst.XTCAHPI_LED_COLOR_GREEN: return "GREEN"; case HpiConst.XTCAHPI_LED_COLOR_AMBER: return "AMBER"; case HpiConst.XTCAHPI_LED_COLOR_ORANGE: return "ORANGE"; case HpiConst.XTCAHPI_LED_COLOR_WHITE: return "WHITE"; case HpiConst.XTCAHPI_LED_COLOR_NO_CHANGE: return "NO_CHANGE"; case HpiConst.XTCAHPI_LED_COLOR_USE_DEFAULT: return "USE_DEFAULT"; default: return Convert.ToString( x ); } } public static long ToXtcaHpiLedColorT( string s ) { if ( s == "RESERVED" ) { return HpiConst.XTCAHPI_LED_COLOR_RESERVED; } if ( s == "BLUE" ) { return HpiConst.XTCAHPI_LED_COLOR_BLUE; } if ( s == "RED" ) { return HpiConst.XTCAHPI_LED_COLOR_RED; } if ( s == "GREEN" ) { return HpiConst.XTCAHPI_LED_COLOR_GREEN; } if ( s == "AMBER" ) { return HpiConst.XTCAHPI_LED_COLOR_AMBER; } if ( s == "ORANGE" ) { return HpiConst.XTCAHPI_LED_COLOR_ORANGE; } if ( s == "WHITE" ) { return HpiConst.XTCAHPI_LED_COLOR_WHITE; } if ( s == "NO_CHANGE" ) { return HpiConst.XTCAHPI_LED_COLOR_NO_CHANGE; } if ( s == "USE_DEFAULT" ) { return HpiConst.XTCAHPI_LED_COLOR_USE_DEFAULT; } throw new FormatException(); } /** * For XtcaHpiResourceLedModeT */ public static string FromXtcaHpiResourceLedModeT( long x ) { switch( x ) { case HpiConst.XTCAHPI_LED_AUTO: return "AUTO"; case HpiConst.XTCAHPI_LED_MANUAL: return "MANUAL"; case HpiConst.XTCAHPI_LED_LAMP_TEST: return "LAMP_TEST"; default: return Convert.ToString( x ); } } public static long ToXtcaHpiResourceLedModeT( string s ) { if ( s == "AUTO" ) { return HpiConst.XTCAHPI_LED_AUTO; } if ( s == "MANUAL" ) { return HpiConst.XTCAHPI_LED_MANUAL; } if ( s == "LAMP_TEST" ) { return HpiConst.XTCAHPI_LED_LAMP_TEST; } throw new FormatException(); } /** * For XtcaHpiLedBrSupportT */ public static string FromXtcaHpiLedBrSupportT( long x ) { switch( x ) { case HpiConst.XTCAHPI_LED_BR_SUPPORTED: return "SUPPORTED"; case HpiConst.XTCAHPI_LED_BR_NOT_SUPPORTED: return "NOT_SUPPORTED"; case HpiConst.XTCAHPI_LED_BR_UNKNOWN: return "UNKNOWN"; default: return Convert.ToString( x ); } } public static long ToXtcaHpiLedBrSupportT( string s ) { if ( s == "SUPPORTED" ) { return HpiConst.XTCAHPI_LED_BR_SUPPORTED; } if ( s == "NOT_SUPPORTED" ) { return HpiConst.XTCAHPI_LED_BR_NOT_SUPPORTED; } if ( s == "UNKNOWN" ) { return HpiConst.XTCAHPI_LED_BR_UNKNOWN; } throw new FormatException(); } /** * For SaErrorT */ public static string FromSaErrorT( long x ) { switch( x ) { case HpiConst.SA_ERR_HPI_OK: return "OK"; case HpiConst.SA_ERR_HPI_ERROR: return "ERROR"; case HpiConst.SA_ERR_HPI_UNSUPPORTED_API: return "UNSUPPORTED_API"; case HpiConst.SA_ERR_HPI_BUSY: return "BUSY"; case HpiConst.SA_ERR_HPI_INTERNAL_ERROR: return "INTERNAL_ERROR"; case HpiConst.SA_ERR_HPI_INVALID_CMD: return "INVALID_CMD"; case HpiConst.SA_ERR_HPI_TIMEOUT: return "TIMEOUT"; case HpiConst.SA_ERR_HPI_OUT_OF_SPACE: return "OUT_OF_SPACE"; case HpiConst.SA_ERR_HPI_OUT_OF_MEMORY: return "OUT_OF_MEMORY"; case HpiConst.SA_ERR_HPI_INVALID_PARAMS: return "INVALID_PARAMS"; case HpiConst.SA_ERR_HPI_INVALID_DATA: return "INVALID_DATA"; case HpiConst.SA_ERR_HPI_NOT_PRESENT: return "NOT_PRESENT"; case HpiConst.SA_ERR_HPI_NO_RESPONSE: return "NO_RESPONSE"; case HpiConst.SA_ERR_HPI_DUPLICATE: return "DUPLICATE"; case HpiConst.SA_ERR_HPI_INVALID_SESSION: return "INVALID_SESSION"; case HpiConst.SA_ERR_HPI_INVALID_DOMAIN: return "INVALID_DOMAIN"; case HpiConst.SA_ERR_HPI_INVALID_RESOURCE: return "INVALID_RESOURCE"; case HpiConst.SA_ERR_HPI_INVALID_REQUEST: return "INVALID_REQUEST"; case HpiConst.SA_ERR_HPI_ENTITY_NOT_PRESENT: return "ENTITY_NOT_PRESENT"; case HpiConst.SA_ERR_HPI_READ_ONLY: return "READ_ONLY"; case HpiConst.SA_ERR_HPI_CAPABILITY: return "CAPABILITY"; case HpiConst.SA_ERR_HPI_UNKNOWN: return "UNKNOWN"; case HpiConst.SA_ERR_HPI_INVALID_STATE: return "INVALID_STATE"; case HpiConst.SA_ERR_HPI_UNSUPPORTED_PARAMS: return "UNSUPPORTED_PARAMS"; default: return Convert.ToString( x ); } } public static long ToSaErrorT( string s ) { if ( s == "OK" ) { return HpiConst.SA_ERR_HPI_OK; } if ( s == "ERROR" ) { return HpiConst.SA_ERR_HPI_ERROR; } if ( s == "UNSUPPORTED_API" ) { return HpiConst.SA_ERR_HPI_UNSUPPORTED_API; } if ( s == "BUSY" ) { return HpiConst.SA_ERR_HPI_BUSY; } if ( s == "INTERNAL_ERROR" ) { return HpiConst.SA_ERR_HPI_INTERNAL_ERROR; } if ( s == "INVALID_CMD" ) { return HpiConst.SA_ERR_HPI_INVALID_CMD; } if ( s == "TIMEOUT" ) { return HpiConst.SA_ERR_HPI_TIMEOUT; } if ( s == "OUT_OF_SPACE" ) { return HpiConst.SA_ERR_HPI_OUT_OF_SPACE; } if ( s == "OUT_OF_MEMORY" ) { return HpiConst.SA_ERR_HPI_OUT_OF_MEMORY; } if ( s == "INVALID_PARAMS" ) { return HpiConst.SA_ERR_HPI_INVALID_PARAMS; } if ( s == "INVALID_DATA" ) { return HpiConst.SA_ERR_HPI_INVALID_DATA; } if ( s == "NOT_PRESENT" ) { return HpiConst.SA_ERR_HPI_NOT_PRESENT; } if ( s == "NO_RESPONSE" ) { return HpiConst.SA_ERR_HPI_NO_RESPONSE; } if ( s == "DUPLICATE" ) { return HpiConst.SA_ERR_HPI_DUPLICATE; } if ( s == "INVALID_SESSION" ) { return HpiConst.SA_ERR_HPI_INVALID_SESSION; } if ( s == "INVALID_DOMAIN" ) { return HpiConst.SA_ERR_HPI_INVALID_DOMAIN; } if ( s == "INVALID_RESOURCE" ) { return HpiConst.SA_ERR_HPI_INVALID_RESOURCE; } if ( s == "INVALID_REQUEST" ) { return HpiConst.SA_ERR_HPI_INVALID_REQUEST; } if ( s == "ENTITY_NOT_PRESENT" ) { return HpiConst.SA_ERR_HPI_ENTITY_NOT_PRESENT; } if ( s == "READ_ONLY" ) { return HpiConst.SA_ERR_HPI_READ_ONLY; } if ( s == "CAPABILITY" ) { return HpiConst.SA_ERR_HPI_CAPABILITY; } if ( s == "UNKNOWN" ) { return HpiConst.SA_ERR_HPI_UNKNOWN; } if ( s == "INVALID_STATE" ) { return HpiConst.SA_ERR_HPI_INVALID_STATE; } if ( s == "UNSUPPORTED_PARAMS" ) { return HpiConst.SA_ERR_HPI_UNSUPPORTED_PARAMS; } throw new FormatException(); } /** * For SaHpiEventCategoryT */ public static string FromSaHpiEventCategoryT( long x ) { switch( x ) { case HpiConst.SAHPI_EC_UNSPECIFIED: return "UNSPECIFIED"; case HpiConst.SAHPI_EC_THRESHOLD: return "THRESHOLD"; case HpiConst.SAHPI_EC_USAGE: return "USAGE"; case HpiConst.SAHPI_EC_STATE: return "STATE"; case HpiConst.SAHPI_EC_PRED_FAIL: return "PRED_FAIL"; case HpiConst.SAHPI_EC_LIMIT: return "LIMIT"; case HpiConst.SAHPI_EC_PERFORMANCE: return "PERFORMANCE"; case HpiConst.SAHPI_EC_SEVERITY: return "SEVERITY"; case HpiConst.SAHPI_EC_PRESENCE: return "PRESENCE"; case HpiConst.SAHPI_EC_ENABLE: return "ENABLE"; case HpiConst.SAHPI_EC_AVAILABILITY: return "AVAILABILITY"; case HpiConst.SAHPI_EC_REDUNDANCY: return "REDUNDANCY"; case HpiConst.SAHPI_EC_SENSOR_SPECIFIC: return "SENSOR_SPECIFIC"; case HpiConst.SAHPI_EC_GENERIC: return "GENERIC"; default: return Convert.ToString( x ); } } public static long ToSaHpiEventCategoryT( string s ) { if ( s == "UNSPECIFIED" ) { return HpiConst.SAHPI_EC_UNSPECIFIED; } if ( s == "THRESHOLD" ) { return HpiConst.SAHPI_EC_THRESHOLD; } if ( s == "USAGE" ) { return HpiConst.SAHPI_EC_USAGE; } if ( s == "STATE" ) { return HpiConst.SAHPI_EC_STATE; } if ( s == "PRED_FAIL" ) { return HpiConst.SAHPI_EC_PRED_FAIL; } if ( s == "LIMIT" ) { return HpiConst.SAHPI_EC_LIMIT; } if ( s == "PERFORMANCE" ) { return HpiConst.SAHPI_EC_PERFORMANCE; } if ( s == "SEVERITY" ) { return HpiConst.SAHPI_EC_SEVERITY; } if ( s == "PRESENCE" ) { return HpiConst.SAHPI_EC_PRESENCE; } if ( s == "ENABLE" ) { return HpiConst.SAHPI_EC_ENABLE; } if ( s == "AVAILABILITY" ) { return HpiConst.SAHPI_EC_AVAILABILITY; } if ( s == "REDUNDANCY" ) { return HpiConst.SAHPI_EC_REDUNDANCY; } if ( s == "SENSOR_SPECIFIC" ) { return HpiConst.SAHPI_EC_SENSOR_SPECIFIC; } if ( s == "GENERIC" ) { return HpiConst.SAHPI_EC_GENERIC; } throw new FormatException(); } }; }; // namespace openhpi }; // namespace org openhpi-3.6.1/baselibs/csharp/openhpi_baselib/HpiTransport.cs0000644000175100017510000001365112575647300023345 0ustar mohanmohan/* -*- c# -*- * * Copyright (C) 2012, Pigeon Point Systems * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ using System; using System.Net; using System.Net.Sockets; namespace org { namespace openhpi { internal class HpiTransport { /********************************************************** * NB: Assumption * We assume that marshal layer puts bytes in little-endian * order for RPC request. * And remote party defines endian for RPC response. *********************************************************/ // PDU private const int MAX_SIZE = 0xFFFF; private const int HDR_SIZE = 12; private const int TYPE_OFF = 0x00; private const int FLAGS_OFF = 0x01; private const int RPC_ID_OFF = 0x04; private const int PAYLOAD_SIZE_OFF = 0x08; private const byte TYPE = 0x01; // MSG private const byte FLAGS = 0x11; // RPC version 1, little-endian private const byte ENDIAN_FLAG_MASK = 0x01; // If endian flag is set: little-endian private Socket s; private byte[] pdu; private int hpos; private int lpos; public bool Open( string host, int port ) { IPAddress[] addresses = null; s = null; try { addresses = Dns.GetHostAddresses( host ); } catch ( SocketException ) { addresses = null; } if ( addresses == null ) { return false; } foreach ( var addr in addresses ) { try { s = new Socket( addr.AddressFamily, SocketType.Stream, ProtocolType.Tcp ); s.Connect( addr, port ); } catch ( SocketException ) { s = null; } if ( s != null ) { break; } } if ( s == null ) { return false; } pdu = new byte[MAX_SIZE]; Reset(); return true; } public void Close() { if ( ( s != null ) && s.Connected ) { s.Shutdown( SocketShutdown.Both ); s.Close(); } s = null; pdu = null; } public void Reset() { SetUint8( TYPE_OFF, TYPE ); SetUint8( FLAGS_OFF, FLAGS ); SetInt32( RPC_ID_OFF, OhpiConst.RPC_SAHPI_NULL ); SetInt32( PAYLOAD_SIZE_OFF, 0 ); lpos = HDR_SIZE; hpos = HDR_SIZE; } public bool IsLittleEndian() { return ( pdu[FLAGS_OFF] & ENDIAN_FLAG_MASK ) != 0; } public void PutByte( byte x ) { pdu[hpos] = x; ++hpos; } public void PutBytes( byte[] bytes, int count ) { Array.Copy( bytes, 0, pdu, hpos, count ); hpos += count; } public byte GetByte() { if ( lpos >= hpos ) { throw new HpiException( "Not enough data for demarshal" ); } byte x = pdu[lpos]; ++lpos; return x; } public void GetBytes( int count, byte[] bytes ) { if ( ( lpos + count ) > hpos ) { throw new HpiException( "Not enough data for demarshal" ); } Array.Copy( pdu, lpos, bytes, 0, count ); lpos += count; } public bool Interchange( int rpc_id ) { SetInt32( RPC_ID_OFF, rpc_id ); SetInt32( PAYLOAD_SIZE_OFF, hpos - HDR_SIZE ); bool rc = false; try { // TODO shall we check the byte count sent? s.Send( pdu, 0, hpos, SocketFlags.None ); lpos = HDR_SIZE; hpos = 0; int need = HDR_SIZE; while ( hpos < need ) { int got = s.Receive( pdu, hpos, need - hpos, SocketFlags.None ); if ( got <= 0 ) { break; } hpos += got; if ( hpos == HDR_SIZE ) { int payload_size = GetInt32( PAYLOAD_SIZE_OFF ); need = HDR_SIZE + payload_size; if ( need > MAX_SIZE ) { throw new HpiException( "Incoming data is too large" ); } } } rc = ( hpos == need ); //DumpPdu( "INTERCHANGE2" ); } catch ( SocketException ) { //DumpPdu( "INTERCHANGE3" ); } // TODO check id, len, type return rc; } private void SetUint8( int off, byte x ) { pdu[off] = x; } private void SetInt32( int off, int x ) { // NB: Request data is always little-endian pdu[off] = (byte)( x ); pdu[off + 1] = (byte)( x >> 8 ); pdu[off + 2] = (byte)( x >> 16 ); pdu[off + 3] = (byte)( x >> 24 ); } private int GetInt32( int off ) { int b0, b1, b2, b3; if ( IsLittleEndian() ) { b0 = (int)(pdu[off]) & 0xFF; b1 = (int)(pdu[off + 1]) & 0xFF; b2 = (int)(pdu[off + 2]) & 0xFF; b3 = (int)(pdu[off + 3]) & 0xFF; } else { b3 = (int)(pdu[off]) & 0xFF; b2 = (int)(pdu[off + 1]) & 0xFF; b1 = (int)(pdu[off + 2]) & 0xFF; b0 = (int)(pdu[off + 3]) & 0xFF; } return ( b3 << 24 ) | ( b2 << 16 ) | ( b1 << 8 ) | b0; } private void DumpPdu( string name ) { Console.WriteLine( "PDU {0}", name ); Console.WriteLine( " LPOS = {0}", lpos ); Console.WriteLine( " HPOS = {0}", hpos ); for ( int i = 0; i < hpos; ++i ) { Console.WriteLine( " DATA[{0}] = {1:x}", i, pdu[i] ); } } }; }; // namespace openhpi }; // namespace org openhpi-3.6.1/baselibs/csharp/openhpi_baselib/HpiMarshalCore.cs0000644000175100017510000001414512575647300023550 0ustar mohanmohan/* -*- c# -*- * * Copyright (C) 2012, Pigeon Point Systems * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ using System; namespace org { namespace openhpi { internal class HpiMarshalCore { private HpiTransport transport; private const int BBUF_SIZE = 8; private byte[] bbuf; private bool little_endian_demarshal; public bool Open( string host, int port ) { transport = new HpiTransport(); bool rc = transport.Open( host, port ); if ( rc ) { bbuf = new byte[BBUF_SIZE]; } return rc; } public void Close() { transport.Close(); bbuf = null; } public void Reset() { transport.Reset(); } public bool Interchange( int rpc_id ) { bool rc = transport.Interchange( rpc_id ); if ( rc ) { little_endian_demarshal = transport.IsLittleEndian(); } return rc; } /********************************************************** * Marshal: For HPI Basic Data Types *********************************************************/ public void MarshalSaHpiUint8T( long x ) { transport.PutByte( unchecked( (byte)x ) ); } public void MarshalSaHpiUint16T( long x ) { unchecked { ushort xx = (ushort)( x ); bbuf[0] = (byte)( xx ); bbuf[1] = (byte)( xx >> 8 ); } transport.PutBytes( bbuf, 2 ); } public void MarshalSaHpiUint32T( long x ) { unchecked { uint xx = (uint)( x ); bbuf[0] = (byte)( xx ); bbuf[1] = (byte)( xx >> 8 ); bbuf[2] = (byte)( xx >> 16 ); bbuf[3] = (byte)( xx >> 24 ); } transport.PutBytes( bbuf, 4 ); } public void MarshalSaHpiUint64T( long x ) { unchecked { ulong xx = (ulong)( x ); bbuf[0] = (byte)( xx ); bbuf[1] = (byte)( xx >> 8 ); bbuf[2] = (byte)( xx >> 16 ); bbuf[3] = (byte)( xx >> 24 ); bbuf[4] = (byte)( xx >> 32 ); bbuf[5] = (byte)( xx >> 40 ); bbuf[6] = (byte)( xx >> 48 ); bbuf[7] = (byte)( xx >> 56 ); } transport.PutBytes( bbuf, 8 ); } public void MarshalSaHpiInt8T( long x ) { MarshalSaHpiUint8T( x ); } public void MarshalSaHpiInt16T( long x ) { MarshalSaHpiUint16T( x ); } public void MarshalSaHpiInt32T( long x ) { MarshalSaHpiUint32T( x ); } public void MarshalSaHpiInt64T( long x ) { MarshalSaHpiUint64T( x ); } public void MarshalEnum( long x ) { MarshalSaHpiInt32T( x ); } public void MarshalSaHpiFloat64T( double x ) { MarshalSaHpiInt64T( BitConverter.DoubleToInt64Bits( x ) ); } public void MarshalByteArray( byte[] x, int count ) { transport.PutBytes( x, count ); } /********************************************************** * Demarshal: For HPI Basic Data Types *********************************************************/ public long DemarshalSaHpiUint8T() { return transport.GetByte(); } public long DemarshalSaHpiUint16T() { transport.GetBytes( 2, bbuf ); uint b0, b1; if ( little_endian_demarshal ) { b0 = bbuf[0]; b1 = bbuf[1]; } else { b0 = bbuf[1]; b1 = bbuf[0]; } return (ushort)( ( b1 << 8 ) | b0 ); } public long DemarshalSaHpiUint32T() { transport.GetBytes( 4, bbuf ); uint b0, b1, b2, b3; if ( little_endian_demarshal ) { b0 = bbuf[0]; b1 = bbuf[1]; b2 = bbuf[2]; b3 = bbuf[3]; } else { b0 = bbuf[3]; b1 = bbuf[2]; b2 = bbuf[1]; b3 = bbuf[0]; } return (uint)( ( b3 << 24 ) | ( b2 << 16 ) | ( b1 << 8 ) | b0 ); } // NB: SaHpiUint64T we have no reliable demarshal // since it is represented as signed int64 public long DemarshalSaHpiUint64T() { transport.GetBytes( 8, bbuf ); long b0, b1, b2, b3, b4, b5, b6, b7; if ( little_endian_demarshal ) { b0 = bbuf[0]; b1 = bbuf[1]; b2 = bbuf[2]; b3 = bbuf[3]; b4 = bbuf[4]; b5 = bbuf[5]; b6 = bbuf[6]; b7 = bbuf[7]; } else { b0 = bbuf[7]; b1 = bbuf[6]; b2 = bbuf[5]; b3 = bbuf[4]; b4 = bbuf[3]; b5 = bbuf[2]; b6 = bbuf[1]; b7 = bbuf[0]; } return ( b7 << 56 ) | ( b6 << 48 ) | ( b5 << 40 ) | ( b4 << 32 ) | ( b3 << 24 ) | ( b2 << 16 ) | ( b1 << 8 ) | b0; } public long DemarshalSaHpiInt8T() { return unchecked( (sbyte)DemarshalSaHpiUint8T() ); } public long DemarshalSaHpiInt16T() { return unchecked( (short)DemarshalSaHpiUint16T() ); } public long DemarshalSaHpiInt32T() { return unchecked( (int)DemarshalSaHpiUint32T() ); } public long DemarshalSaHpiInt64T() { return unchecked( (long)DemarshalSaHpiUint64T() ); } public long DemarshalEnum() { return DemarshalSaHpiInt32T(); } public double DemarshalSaHpiFloat64T() { return BitConverter.Int64BitsToDouble( DemarshalSaHpiInt64T() ); } public byte[] DemarshalByteArray( int count ) { byte[] x = new byte[count]; transport.GetBytes( count, x ); return x; } }; }; // namespace openhpi }; // namespace org openhpi-3.6.1/baselibs/csharp/openhpi_baselib/HpiDataTypesGen.cs0000644000175100017510000024632412575647300023706 0ustar mohanmohan/* -*- c# -*- * * Copyright (C) 2012, Pigeon Point Systems * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ namespace org { namespace openhpi { /********************************************************** * HPI Data Types (auto-generated) *********************************************************/ /********************************************************** * HPI Constants *********************************************************/ public static class HpiConst { public const long SAHPI_TRUE = 1L; public const long SAHPI_FALSE = 0L; public const long SAHPI_MANUFACTURER_ID_UNSPECIFIED = 0L; public const long SAHPI_INTERFACE_VERSION = 131842L; public const long SA_OK = 0L; public const long SA_HPI_ERR_BASE = -1000L; public const long SA_ERR_HPI_ERROR = -1001L; public const long SA_ERR_HPI_UNSUPPORTED_API = -1002L; public const long SA_ERR_HPI_BUSY = -1003L; public const long SA_ERR_HPI_INTERNAL_ERROR = -1004L; public const long SA_ERR_HPI_INVALID_CMD = -1005L; public const long SA_ERR_HPI_TIMEOUT = -1006L; public const long SA_ERR_HPI_OUT_OF_SPACE = -1007L; public const long SA_ERR_HPI_OUT_OF_MEMORY = -1008L; public const long SA_ERR_HPI_INVALID_PARAMS = -1009L; public const long SA_ERR_HPI_INVALID_DATA = -1010L; public const long SA_ERR_HPI_NOT_PRESENT = -1011L; public const long SA_ERR_HPI_NO_RESPONSE = -1012L; public const long SA_ERR_HPI_DUPLICATE = -1013L; public const long SA_ERR_HPI_INVALID_SESSION = -1014L; public const long SA_ERR_HPI_INVALID_DOMAIN = -1015L; public const long SA_ERR_HPI_INVALID_RESOURCE = -1016L; public const long SA_ERR_HPI_INVALID_REQUEST = -1017L; public const long SA_ERR_HPI_ENTITY_NOT_PRESENT = -1018L; public const long SA_ERR_HPI_READ_ONLY = -1019L; public const long SA_ERR_HPI_CAPABILITY = -1020L; public const long SA_ERR_HPI_UNKNOWN = -1021L; public const long SA_ERR_HPI_INVALID_STATE = -1022L; public const long SA_ERR_HPI_UNSUPPORTED_PARAMS = -1023L; public const long SAHPI_UNSPECIFIED_DOMAIN_ID = 4294967295L; public const long SAHPI_UNSPECIFIED_RESOURCE_ID = 4294967295L; public const long SAHPI_FIRST_ENTRY = 0L; public const long SAHPI_LAST_ENTRY = 4294967295L; public const long SAHPI_ENTRY_UNSPECIFIED = 0L; public const long SAHPI_TIME_UNSPECIFIED = -9223372036854775808L; public const long SAHPI_TIME_MAX_RELATIVE = 864691128455135232L; public const long SAHPI_TIMEOUT_IMMEDIATE = 0L; public const long SAHPI_TIMEOUT_BLOCK = -1L; public const int SAHPI_MAX_TEXT_BUFFER_LENGTH = 255; public const long SAHPI_ENT_IPMI_GROUP = 0L; public const long SAHPI_ENT_SAFHPI_GROUP = 65536L; public const long SAHPI_ENT_ROOT_VALUE = 65535L; public const int SAHPI_MAX_ENTITY_PATH = 16; public const long SAHPI_EC_UNSPECIFIED = 0L; public const long SAHPI_EC_THRESHOLD = 1L; public const long SAHPI_EC_USAGE = 2L; public const long SAHPI_EC_STATE = 3L; public const long SAHPI_EC_PRED_FAIL = 4L; public const long SAHPI_EC_LIMIT = 5L; public const long SAHPI_EC_PERFORMANCE = 6L; public const long SAHPI_EC_SEVERITY = 7L; public const long SAHPI_EC_PRESENCE = 8L; public const long SAHPI_EC_ENABLE = 9L; public const long SAHPI_EC_AVAILABILITY = 10L; public const long SAHPI_EC_REDUNDANCY = 11L; public const long SAHPI_EC_SENSOR_SPECIFIC = 126L; public const long SAHPI_EC_GENERIC = 127L; public const long SAHPI_ES_UNSPECIFIED = 0L; public const long SAHPI_ES_LOWER_MINOR = 1L; public const long SAHPI_ES_LOWER_MAJOR = 2L; public const long SAHPI_ES_LOWER_CRIT = 4L; public const long SAHPI_ES_UPPER_MINOR = 8L; public const long SAHPI_ES_UPPER_MAJOR = 16L; public const long SAHPI_ES_UPPER_CRIT = 32L; public const long SAHPI_ES_IDLE = 1L; public const long SAHPI_ES_ACTIVE = 2L; public const long SAHPI_ES_BUSY = 4L; public const long SAHPI_ES_STATE_DEASSERTED = 1L; public const long SAHPI_ES_STATE_ASSERTED = 2L; public const long SAHPI_ES_PRED_FAILURE_DEASSERT = 1L; public const long SAHPI_ES_PRED_FAILURE_ASSERT = 2L; public const long SAHPI_ES_LIMIT_NOT_EXCEEDED = 1L; public const long SAHPI_ES_LIMIT_EXCEEDED = 2L; public const long SAHPI_ES_PERFORMANCE_MET = 1L; public const long SAHPI_ES_PERFORMANCE_LAGS = 2L; public const long SAHPI_ES_OK = 1L; public const long SAHPI_ES_MINOR_FROM_OK = 2L; public const long SAHPI_ES_MAJOR_FROM_LESS = 4L; public const long SAHPI_ES_CRITICAL_FROM_LESS = 8L; public const long SAHPI_ES_MINOR_FROM_MORE = 16L; public const long SAHPI_ES_MAJOR_FROM_CRITICAL = 32L; public const long SAHPI_ES_CRITICAL = 64L; public const long SAHPI_ES_MONITOR = 128L; public const long SAHPI_ES_INFORMATIONAL = 256L; public const long SAHPI_ES_ABSENT = 1L; public const long SAHPI_ES_PRESENT = 2L; public const long SAHPI_ES_DISABLED = 1L; public const long SAHPI_ES_ENABLED = 2L; public const long SAHPI_ES_RUNNING = 1L; public const long SAHPI_ES_TEST = 2L; public const long SAHPI_ES_POWER_OFF = 4L; public const long SAHPI_ES_ON_LINE = 8L; public const long SAHPI_ES_OFF_LINE = 16L; public const long SAHPI_ES_OFF_DUTY = 32L; public const long SAHPI_ES_DEGRADED = 64L; public const long SAHPI_ES_POWER_SAVE = 128L; public const long SAHPI_ES_INSTALL_ERROR = 256L; public const long SAHPI_ES_FULLY_REDUNDANT = 1L; public const long SAHPI_ES_REDUNDANCY_LOST = 2L; public const long SAHPI_ES_REDUNDANCY_DEGRADED = 4L; public const long SAHPI_ES_REDUNDANCY_LOST_SUFFICIENT_RESOURCES = 8L; public const long SAHPI_ES_NON_REDUNDANT_SUFFICIENT_RESOURCES = 16L; public const long SAHPI_ES_NON_REDUNDANT_INSUFFICIENT_RESOURCES = 32L; public const long SAHPI_ES_REDUNDANCY_DEGRADED_FROM_FULL = 64L; public const long SAHPI_ES_REDUNDANCY_DEGRADED_FROM_NON = 128L; public const long SAHPI_ES_STATE_00 = 1L; public const long SAHPI_ES_STATE_01 = 2L; public const long SAHPI_ES_STATE_02 = 4L; public const long SAHPI_ES_STATE_03 = 8L; public const long SAHPI_ES_STATE_04 = 16L; public const long SAHPI_ES_STATE_05 = 32L; public const long SAHPI_ES_STATE_06 = 64L; public const long SAHPI_ES_STATE_07 = 128L; public const long SAHPI_ES_STATE_08 = 256L; public const long SAHPI_ES_STATE_09 = 512L; public const long SAHPI_ES_STATE_10 = 1024L; public const long SAHPI_ES_STATE_11 = 2048L; public const long SAHPI_ES_STATE_12 = 4096L; public const long SAHPI_ES_STATE_13 = 8192L; public const long SAHPI_ES_STATE_14 = 16384L; public const long SAHPI_STANDARD_SENSOR_MIN = 256L; public const long SAHPI_STANDARD_SENSOR_MAX = 511L; public const long SAHPI_SENSOR_TYPE_SAFHPI_GROUP = 65536L; public const int SAHPI_SENSOR_BUFFER_LENGTH = 32; public const long SAHPI_ALL_EVENT_STATES = 65535L; public const long SAHPI_SRF_MIN = 16L; public const long SAHPI_SRF_MAX = 8L; public const long SAHPI_SRF_NORMAL_MIN = 4L; public const long SAHPI_SRF_NORMAL_MAX = 2L; public const long SAHPI_SRF_NOMINAL = 1L; public const long SAHPI_STM_LOW_MINOR = 1L; public const long SAHPI_STM_LOW_MAJOR = 2L; public const long SAHPI_STM_LOW_CRIT = 4L; public const long SAHPI_STM_UP_MINOR = 8L; public const long SAHPI_STM_UP_MAJOR = 16L; public const long SAHPI_STM_UP_CRIT = 32L; public const long SAHPI_STM_UP_HYSTERESIS = 64L; public const long SAHPI_STM_LOW_HYSTERESIS = 128L; public const long SAHPI_DEFAGSENS_OPER = 256L; public const long SAHPI_DEFAGSENS_PWR = 257L; public const long SAHPI_DEFAGSENS_TEMP = 258L; public const long SAHPI_DEFAGSENS_MIN = 256L; public const long SAHPI_DEFAGSENS_MAX = 271L; public const int SAHPI_CTRL_MAX_STREAM_LENGTH = 4; public const long SAHPI_TLN_ALL_LINES = 0L; public const int SAHPI_CTRL_MAX_OEM_BODY_LENGTH = 255; public const int SAHPI_CTRL_OEM_CONFIG_LENGTH = 10; public const long SAHPI_DEFAULT_INVENTORY_ID = 0L; public const long SAHPI_DEFAULT_WATCHDOG_NUM = 0L; public const long SAHPI_WATCHDOG_EXP_BIOS_FRB2 = 2L; public const long SAHPI_WATCHDOG_EXP_BIOS_POST = 4L; public const long SAHPI_WATCHDOG_EXP_OS_LOAD = 8L; public const long SAHPI_WATCHDOG_EXP_SMS_OS = 16L; public const long SAHPI_WATCHDOG_EXP_OEM = 32L; public const int SAHPI_DIMITEST_MAX_PARAMETERS = 10; public const int SAHPI_DIMITEST_PARAM_NAME_LEN = 20; public const long SAHPI_DIMITEST_CAPABILITY_NO_CAPABILITY = 0L; public const long SAHPI_DIMITEST_CAPABILITY_RESULTSOUTPUT = 1L; public const long SAHPI_DIMITEST_CAPABILITY_SERVICEMODE = 2L; public const long SAHPI_DIMITEST_CAPABILITY_LOOPCOUNT = 4L; public const long SAHPI_DIMITEST_CAPABILITY_LOOPTIME = 8L; public const long SAHPI_DIMITEST_CAPABILITY_LOGGING = 16L; public const long SAHPI_DIMITEST_CAPABILITY_TESTCANCEL = 32L; public const long SAHPI_DIMITEST_CAPAB_RES_FINALONLY = 0L; public const long SAHPI_DIMITEST_CAPAB_RES_ONDEMAND = 1L; public const long SAHPI_DIMITEST_CAPAB_RES_ASYNC = 2L; public const int SAHPI_DIMITEST_MAX_ENTITIESIMPACTED = 5; public const int SAHPI_FUMI_MAX_OEM_BODY_LENGTH = 255; public const int SAHPI_FUMI_MAX_ENTITIES_IMPACTED = 5; public const long SAHPI_FUMI_NO_MAIN_PERSISTENT_COPY = 1L; public const long SAHPI_FUMI_PROT_TFTP = 1L; public const long SAHPI_FUMI_PROT_FTP = 2L; public const long SAHPI_FUMI_PROT_HTTP = 4L; public const long SAHPI_FUMI_PROT_LDAP = 8L; public const long SAHPI_FUMI_PROT_LOCAL = 16L; public const long SAHPI_FUMI_PROT_NFS = 32L; public const long SAHPI_FUMI_PROT_DBACCESS = 64L; public const long SAHPI_FUMI_CAP_ROLLBACK = 1L; public const long SAHPI_FUMI_CAP_BANKCOPY = 2L; public const long SAHPI_FUMI_CAP_BANKREORDER = 4L; public const long SAHPI_FUMI_CAP_BACKUP = 8L; public const long SAHPI_FUMI_CAP_TARGET_VERIFY = 16L; public const long SAHPI_FUMI_CAP_TARGET_VERIFY_MAIN = 32L; public const long SAHPI_FUMI_CAP_COMPONENTS = 64L; public const long SAHPI_FUMI_CAP_AUTOROLLBACK = 128L; public const long SAHPI_FUMI_CAP_AUTOROLLBACK_CAN_BE_DISABLED = 256L; public const long SAHPI_FUMI_CAP_MAIN_NOT_PERSISTENT = 512L; public const long SAHPI_SOD_TRIGGER_READING = 1L; public const long SAHPI_SOD_TRIGGER_THRESHOLD = 2L; public const long SAHPI_SOD_OEM = 4L; public const long SAHPI_SOD_PREVIOUS_STATE = 8L; public const long SAHPI_SOD_CURRENT_STATE = 16L; public const long SAHPI_SOD_SENSOR_SPECIFIC = 32L; public const long SAHPI_SEOD_CURRENT_STATE = 16L; public const long SAHPI_SEOD_ALARM_STATES = 64L; public const long SAHPI_EVT_QUEUE_OVERFLOW = 1L; public const int SA_HPI_MAX_NAME_LENGTH = 256; public const long SAHPI_LOAD_ID_DEFAULT = 0L; public const long SAHPI_LOAD_ID_BYNAME = 4294967295L; public const int SAHPI_GUID_LENGTH = 16; public const long SAHPI_CAPABILITY_RESOURCE = 1073741824L; public const long SAHPI_CAPABILITY_FUMI = 65536L; public const long SAHPI_CAPABILITY_EVT_DEASSERTS = 32768L; public const long SAHPI_CAPABILITY_DIMI = 16384L; public const long SAHPI_CAPABILITY_AGGREGATE_STATUS = 8192L; public const long SAHPI_CAPABILITY_CONFIGURATION = 4096L; public const long SAHPI_CAPABILITY_MANAGED_HOTSWAP = 2048L; public const long SAHPI_CAPABILITY_WATCHDOG = 1024L; public const long SAHPI_CAPABILITY_CONTROL = 512L; public const long SAHPI_CAPABILITY_FRU = 256L; public const long SAHPI_CAPABILITY_LOAD_ID = 128L; public const long SAHPI_CAPABILITY_ANNUNCIATOR = 64L; public const long SAHPI_CAPABILITY_POWER = 32L; public const long SAHPI_CAPABILITY_RESET = 16L; public const long SAHPI_CAPABILITY_INVENTORY_DATA = 8L; public const long SAHPI_CAPABILITY_EVENT_LOG = 4L; public const long SAHPI_CAPABILITY_RDR = 2L; public const long SAHPI_CAPABILITY_SENSOR = 1L; public const long SAHPI_HS_CAPABILITY_AUTOEXTRACT_READ_ONLY = 2147483648L; public const long SAHPI_HS_CAPABILITY_INDICATOR_SUPPORTED = 1073741824L; public const long SAHPI_HS_CAPABILITY_AUTOINSERT_IMMEDIATE = 536870912L; public const long SAHPI_DOMAIN_CAP_AUTOINSERT_READ_ONLY = 1L; public const long SAHPI_EVTLOG_CAPABILITY_ENTRY_ADD = 1L; public const long SAHPI_EVTLOG_CAPABILITY_CLEAR = 2L; public const long SAHPI_EVTLOG_CAPABILITY_TIME_SET = 4L; public const long SAHPI_EVTLOG_CAPABILITY_STATE_SET = 8L; public const long SAHPI_EVTLOG_CAPABILITY_OVERFLOW_RESET = 16L; public const long SAHPI_OLDEST_ENTRY = 0L; public const long SAHPI_NEWEST_ENTRY = 4294967295L; public const long SAHPI_NO_MORE_ENTRIES = 4294967294L; public const long ATCAHPI_PICMG_MID = 12634L; public const long ATCAHPI_BLINK_COLOR_LED = 128L; public const long ATCAHPI_LED_WHITE = 64L; public const long ATCAHPI_LED_ORANGE = 32L; public const long ATCAHPI_LED_AMBER = 16L; public const long ATCAHPI_LED_GREEN = 8L; public const long ATCAHPI_LED_RED = 4L; public const long ATCAHPI_LED_BLUE = 2L; public const long ATCAHPI_CTRL_NUM_BLUE_LED = 0L; public const long ATCAHPI_CTRL_NUM_LED1 = 1L; public const long ATCAHPI_CTRL_NUM_LED2 = 2L; public const long ATCAHPI_CTRL_NUM_LED3 = 3L; public const long ATCAHPI_CTRL_NUM_APP_LED = 4L; public const long ATCAHPI_RESOURCE_AGGREGATE_LED = 255L; public const long ATCAHPI_ENT_POWER_ENTRY_MODULE_SLOT = 145L; public const long ATCAHPI_ENT_SHELF_FRU_DEVICE_SLOT = 146L; public const long ATCAHPI_ENT_SHELF_MANAGER_SLOT = 147L; public const long ATCAHPI_ENT_FAN_TRAY_SLOT = 148L; public const long ATCAHPI_ENT_FAN_FILTER_TRAY_SLOT = 149L; public const long ATCAHPI_ENT_ALARM_SLOT = 150L; public const long ATCAHPI_ENT_AMC_SLOT = 151L; public const long ATCAHPI_ENT_PMC_SLOT = 152L; public const long ATCAHPI_ENT_RTM_SLOT = 153L; public const long ATCAHPI_ENT_PICMG_FRONT_BLADE = 65558L; public const long ATCAHPI_ENT_SHELF_FRU_DEVICE = 65559L; public const long ATCAHPI_ENT_FILTRATION_UNIT = 65560L; public const long ATCAHPI_ENT_AMC = 65561L; public const long ATCAHPI_SENSOR_NUM_SHELF_INFO_VALID = 4096L; public const long ATCAHPI_CTRL_NUM_SHELF_ADDRESS = 4096L; public const long ATCAHPI_CTRL_NUM_SHELF_IP_ADDRESS = 4097L; public const long ATCAHPI_CTRL_NUM_SHELF_STATUS = 4098L; public const long ATCAHPI_SENSOR_NUM_PWRONSEQ_COMMIT_STATUS = 4864L; public const long ATCAHPI_CTRL_NUM_FRU_POWER_ON_SEQUENCE_COMMIT = 4864L; public const long ATCAHPI_CTRL_NUM_FRU_POWER_ON_SEQUENCE = 4865L; public const long ATCAHPI_CS_CPS_PWR_ON = 1L; public const long ATCAHPI_CS_CPS_PWR_OVERLOAD = 2L; public const long ATCAHPI_CS_CPS_INTERLOCK = 4L; public const long ATCAHPI_CS_CPS_PWR_FAULT = 8L; public const long ATCAHPI_CS_CPS__PWR_CTRL_FAULT = 16L; public const long ATCAHPI_CS_CPS_PWR_RESTORE_PWR_UP_PREV = 32L; public const long ATCAHPI_CS_CPS_PWR_RESTORE_PWR_UP = 64L; public const long ATCAHPI_CS_CPS_PWR_RESTORE_UNKNOWN = 96L; public const long ATCAHPI_CS_LPEVT_AC_FAILED = 1L; public const long ATCAHPI_CS_LPEVT_PWR_OVERLOAD = 2L; public const long ATCAHPI_CS_LPEVT_PWR_INTERLOCK = 4L; public const long ATCAHPI_CS_LPEVT_PWR_FAULT = 8L; public const long ATCAHPI_CS_LPEVT_PWRON_IPMI = 16L; public const long ATCAHPI_CS_MISC_CS_INTRUSION_ACTIVE = 1L; public const long ATCAHPI_CS_MISC_CS_FP_LOCKOUT_ACTIVE = 2L; public const long ATCAHPI_CS_MISC_CS_DRIVE_FAULT = 4L; public const long ATCAHPI_CS_MISC_CS_COOLING_FAULT = 8L; public const long ATCAHPI_CS_FP_BUTTON_PWR_OFF = 1L; public const long ATCAHPI_CS_FP_BUTTON_RESET_OFF = 2L; public const long ATCAHPI_CS_FP_BUTTON_DIAGINTR_OFF = 4L; public const long ATCAHPI_CS_FP_BUTTON_STANDBY_OFF = 8L; public const long ATCAHPI_CS_FP_BUTTON_ALLOW_PWR_OFF = 16L; public const long ATCAHPI_CS_FP_BUTTON_ALLOW_RESET_OFF = 32L; public const long ATCAHPI_CS_FP_BUTTON_ALLOW_DIAGINTR_OFF = 64L; public const long ATCAHPI_CS_FP_BUTTON_ALLOW_STANDBY_OFF = 128L; public const long ATCAHPI_SENSOR_NUM_SHMGR_REDUNDANCY = 4097L; public const long ATCAHPI_SENSOR_NUM_SHMGR_ACTIVE = 4098L; public const long ATCAHPI_SENSOR_NUM_SHMGR_STANDBY = 4099L; public const long ATCAHPI_CTRL_NUM_SHMGR_FAILOVER = 4112L; public const long ATCAHPI_CTRL_NUM_FAILED_RESOURCE_EXTRACT = 4126L; public const long ATCAHPI_SENSOR_NUM_SLOT_STATE = 4112L; public const long ATCAHPI_SENSOR_NUM_ASSIGNED_PWR = 4113L; public const long ATCAHPI_SENSOR_NUM_MAX_PWR = 4114L; public const long ATCAHPI_CTRL_NUM_FRU_ACTIVATION = 4128L; public const long ATCAHPI_SENSOR_NUM_IPMB0 = 4352L; public const long ATCAHPI_CTRL_NUM_DESIRED_PWR = 4144L; public const long ATCAHPI_CTRL_NUM_IPMB_A_STATE = 4353L; public const long ATCAHPI_CTRL_NUM_IPMB_B_STATE = 4354L; public const long ATCAHPI_CTRL_NUM_FRU_CONTROL = 4608L; public const long ATCAHPI_CTRL_NUM_FRU_IPMC_RESET = 4609L; public const long ATCAHPI_SENSOR_NUM_AMC_PWRONSEQ_COMMIT_STATUS = 5376L; public const long ATCAHPI_CTRL_NUM_AMC_POWER_ON_SEQUENCE_COMMIT = 5376L; public const long ATCAHPI_CTRL_NUM_AMC_POWER_ON_SEQUENCE = 5377L; public const long ATCAHPI_CTRL_NUM_FAN_SPEED = 5120L; public const long ATCAHPI_PICMG_CT_CHASSIS_STATUS = 16789850L; public const long ATCAHPI_PICMG_CT_ATCA_LED = 33567066L; public const long XTCAHPI_SPEC_VERSION = 4228711L; public const long XTCAHPI_PICMG_MID = 12634L; public const long XTCAHPI_ENT_POWER_SLOT = 145L; public const long XTCAHPI_ENT_SHELF_FRU_DEVICE_SLOT = 146L; public const long XTCAHPI_ENT_SHELF_MANAGER_SLOT = 147L; public const long XTCAHPI_ENT_FAN_TRAY_SLOT = 148L; public const long XTCAHPI_ENT_FAN_FILTER_TRAY_SLOT = 149L; public const long XTCAHPI_ENT_ALARM_SLOT = 150L; public const long XTCAHPI_ENT_AMC_SLOT = 151L; public const long XTCAHPI_ENT_PMC_SLOT = 152L; public const long XTCAHPI_ENT_RTM_SLOT = 153L; public const long XTCAHPI_ENT_CARRIER_MANAGER_SLOT = 154L; public const long XTCAHPI_ENT_CARRIER_SLOT = 155L; public const long XTCAHPI_ENT_COM_E_SLOT = 156L; public const long XTCAHPI_CTRL_NUM_IP_ADDRESS_0 = 4097L; public const long XTCAHPI_CTRL_NUM_IP_ADDRESS_1 = 4099L; public const long XTCAHPI_CTRL_NUM_POWER_ON_SEQUENCE = 4865L; public const long XTCAHPI_CTRL_NUM_POWER_ON_SEQUENCE_COMMIT = 4864L; public const long XTCAHPI_SENSOR_NUM_PWRONSEQ_COMMIT_STATUS = 4864L; public const long XTCAHPI_ANN_NUM_TELCO_ALARM = 4096L; public const long XTCAHPI_SENSOR_NUM_REDUNDANCY = 4097L; public const long XTCAHPI_SENSOR_NUM_ACTIVE = 4098L; public const long XTCAHPI_SENSOR_NUM_STANDBY = 4099L; public const long XTCAHPI_CTRL_NUM_FAILOVER = 4112L; public const long XTCAHPI_CTRL_NUM_ACTIVATION = 4128L; public const long XTCAHPI_CTRL_NUM_DEACTIVATION = 4129L; public const long XTCAHPI_SENSOR_NUM_FRU_INFO_VALID = 4096L; public const long XTCAHPI_SENSOR_NUM_ASSIGNED_PWR = 4113L; public const long XTCAHPI_SENSOR_NUM_SLOT_ASSIGNED_PWR = 6144L; public const long XTCAHPI_IDR_NUM_CONFIG_INFO = 1L; public const long XTCAHPI_CTRL_NUM_SHELF_ADDRESS = 4096L; public const long XTCAHPI_CTRL_NUM_SHELF_STATUS = 4098L; public const long XTCAHPI_CTRL_NUM_SHELF_MANAGER_RMCP_USERNAME = 4177L; public const long XTCAHPI_CTRL_NUM_SHELF_MANAGER_RMCP_PASSWORD = 4178L; public const long XTCAHPI_CTRL_NUM_IN_SHELF_ACTIVATION = 4192L; public const long XTCAHPI_CTRL_NUM_IN_SHELF_DEACTIVATION = 4193L; public const long XTCAHPI_CTRL_NUM_DESIRED_PWR = 4144L; public const long XTCAHPI_SENSOR_NUM_IPMB0 = 4352L; public const long XTCAHPI_CTRL_NUM_IPMB_A_STATE = 4353L; public const long XTCAHPI_CTRL_NUM_IPMB_B_STATE = 4354L; public const long XTCAHPI_CTRL_NUM_FRU_CONTROL = 4608L; public const long XTCAHPI_CTRL_NUM_FRU_IPMC_RESET = 4609L; public const long XTCAHPI_CTRL_NUM_BLUE_LED = 0L; public const long XTCAHPI_CTRL_NUM_LED1 = 1L; public const long XTCAHPI_CTRL_NUM_LED2 = 2L; public const long XTCAHPI_CTRL_NUM_LED3 = 3L; public const long XTCAHPI_CTRL_NUM_APP_LED = 4L; public const long XTCAHPI_RESOURCE_AGGREGATE_LED = 255L; public const long XTCAHPI_CTRL_NUM_AMC_POWER_ON_SEQUENCE = 5377L; public const long XTCAHPI_CTRL_NUM_AMC_POWER_ON_SEQUENCE_COMMIT = 5376L; public const long XTCAHPI_SENSOR_NUM_AMC_PWRONSEQ_COMMIT_STATUS = 5376L; public const long XTCAHPI_CTRL_NUM_FAN_SPEED = 5120L; public const long XTCAHPI_SENSOR_NUM_HPM1_IPMC_GLOBAL_CAPS = 5888L; public const long XTCAHPI_SENSOR_NUM_HPM1_IMAGE_CAPS = 5889L; public const long XTCAHPI_SENSOR_NUM_HPM1_ROLLBACK_TIMEOUT = 5890L; public const long XTCAHPI_CTRL_NUM_CRITICAL_TELCO_ALARM = 5632L; public const long XTCAHPI_CTRL_NUM_MAJOR_TELCO_ALARM = 5633L; public const long XTCAHPI_CTRL_NUM_MINOR_TELCO_ALARM = 5634L; public const long XTCAHPI_CTRL_NUM_POWER_TELCO_ALARM = 5635L; public const long XTCAHPI_CTRL_NUM_TELCO_ALARM_CUTOFF = 5636L; public const long XTCAHPI_SENSOR_NUM_TELCO_ALARM_INPUT = 5632L; public const long XTCAHPI_INDICATOR_LOC_MINOR_ALARM = 0L; public const long XTCAHPI_INDICATOR_LOC_MAJOR_ALARM = 1L; public const long XTCAHPI_INDICATOR_LOC_CRITICAL_ALARM = 2L; public const long XTCAHPI_INDICATOR_LOC_POWER_ALARM = 3L; public const long XTCAHPI_CONFIG_DATA_AREA_SPEC_VERSION = 0L; public const long XTCAHPI_CONFIG_DATA_FIELD_LABEL = 0L; public const long XTCAHPI_CS_CPS_PWR_ON = 1L; public const long XTCAHPI_CS_CPS_PWR_OVERLOAD = 2L; public const long XTCAHPI_CS_CPS_INTERLOCK = 4L; public const long XTCAHPI_CS_CPS_PWR_FAULT = 8L; public const long XTCAHPI_CS_CPS_PWR_CTRL_FAULT = 16L; public const long XTCAHPI_CS_CPS_PWR_RESTORE_PWR_UP_PREV = 32L; public const long XTCAHPI_CS_CPS_PWR_RESTORE_PWR_UP = 64L; public const long XTCAHPI_CS_CPS_PWR_RESTORE_UNKNOWN = 96L; public const long XTCAHPI_CS_LPEVT_AC_FAILED = 1L; public const long XTCAHPI_CS_LPEVT_PWR_OVERLOAD = 2L; public const long XTCAHPI_CS_LPEVT_PWR_INTERLOCK = 4L; public const long XTCAHPI_CS_LPEVT_PWR_FAULT = 8L; public const long XTCAHPI_CS_LPEVT_PWRON_IPMI = 16L; public const long XTCAHPI_CS_MISC_CS_INTRUSION_ACTIVE = 1L; public const long XTCAHPI_CS_MISC_CS_FP_LOCKOUT_ACTIVE = 2L; public const long XTCAHPI_CS_MISC_CS_DRIVE_FAULT = 4L; public const long XTCAHPI_CS_MISC_CS_COOLING_FAULT = 8L; public const long XTCAHPI_CS_FP_BUTTON_PWR_OFF = 1L; public const long XTCAHPI_CS_FP_BUTTON_RESET_OFF = 2L; public const long XTCAHPI_CS_FP_BUTTON_DIAGINTR_OFF = 4L; public const long XTCAHPI_CS_FP_BUTTON_STANDBY_OFF = 8L; public const long XTCAHPI_CS_FP_BUTTON_ALLOW_PWR_OFF = 16L; public const long XTCAHPI_CS_FP_BUTTON_ALLOW_RESET_OFF = 32L; public const long XTCAHPI_CS_FP_BUTTON_ALLOW_DIAGINTR_OFF = 64L; public const long XTCAHPI_CS_FP_BUTTON_ALLOW_STANDBY_OFF = 128L; public const long XTCAHPI_BLINK_COLOR_LED = 128L; public const long XTCAHPI_LED_WHITE = 64L; public const long XTCAHPI_LED_ORANGE = 32L; public const long XTCAHPI_LED_AMBER = 16L; public const long XTCAHPI_LED_GREEN = 8L; public const long XTCAHPI_LED_RED = 4L; public const long XTCAHPI_LED_BLUE = 2L; public const long XTCAHPI_IF_FABRIC = 1L; public const long XTCAHPI_IF_SYNC_CLOCK = 2L; public const long XTCAHPI_IF_BASE = 3L; public const long XTCAHPI_IF_UPDATE_CHANNEL = 4L; public const long XTCAHPI_IF_METALLIC_TEST = 5L; public const long XTCAHPI_IF_RINGING_GENERATOR_BUS = 6L; public const long XTCAHPI_CONFIG_DATA_LOC_DEFAULT = 0L; public const long XTCAHPI_CONFIG_DATA_LOC_SHELF_ADDRESS = 1L; public const long XTCAHPI_CONFIG_DATA_LOC_POWER_ON_SEQUENCE = 2L; public const long XTCAHPI_CONFIG_DATA_LOC_CHASSIS_STATUS = 3L; public const long XTCAHPI_CONFIG_DATA_LOC_ACTIVATION = 4L; public const long XTCAHPI_CONFIG_DATA_LOC_DEACTIVATION = 5L; public const long XTCAHPI_CONFIG_DATA_LOC_IN_SHELF_ACTIVATION = 6L; public const long XTCAHPI_CONFIG_DATA_LOC_IN_SHELF_DEACTIVATION = 7L; public const long XTCAHPI_CONFIG_DATA_LOC_USERNAME = 8L; public const long XTCAHPI_CONFIG_DATA_LOC_PASSWORD = 9L; public const long XTCAHPI_CONFIG_DATA_LOC_FUMI_GLOBAL_UPGRADE_CAP = 10L; public const long XTCAHPI_CONFIG_DATA_LOC_FUMI_UPGRADE_IMAGE_CAP = 11L; public const long XTCAHPI_CONFIG_DATA_LOC_FUMI_ROLLBACK_TIMEOUT = 12L; public const long SAHPI_LANG_UNDEF = 0L; public const long SAHPI_LANG_AFAR = 1L; public const long SAHPI_LANG_ABKHAZIAN = 2L; public const long SAHPI_LANG_AFRIKAANS = 3L; public const long SAHPI_LANG_AMHARIC = 4L; public const long SAHPI_LANG_ARABIC = 5L; public const long SAHPI_LANG_ASSAMESE = 6L; public const long SAHPI_LANG_AYMARA = 7L; public const long SAHPI_LANG_AZERBAIJANI = 8L; public const long SAHPI_LANG_BASHKIR = 9L; public const long SAHPI_LANG_BYELORUSSIAN = 10L; public const long SAHPI_LANG_BULGARIAN = 11L; public const long SAHPI_LANG_BIHARI = 12L; public const long SAHPI_LANG_BISLAMA = 13L; public const long SAHPI_LANG_BENGALI = 14L; public const long SAHPI_LANG_TIBETAN = 15L; public const long SAHPI_LANG_BRETON = 16L; public const long SAHPI_LANG_CATALAN = 17L; public const long SAHPI_LANG_CORSICAN = 18L; public const long SAHPI_LANG_CZECH = 19L; public const long SAHPI_LANG_WELSH = 20L; public const long SAHPI_LANG_DANISH = 21L; public const long SAHPI_LANG_GERMAN = 22L; public const long SAHPI_LANG_BHUTANI = 23L; public const long SAHPI_LANG_GREEK = 24L; public const long SAHPI_LANG_ENGLISH = 25L; public const long SAHPI_LANG_ESPERANTO = 26L; public const long SAHPI_LANG_SPANISH = 27L; public const long SAHPI_LANG_ESTONIAN = 28L; public const long SAHPI_LANG_BASQUE = 29L; public const long SAHPI_LANG_PERSIAN = 30L; public const long SAHPI_LANG_FINNISH = 31L; public const long SAHPI_LANG_FIJI = 32L; public const long SAHPI_LANG_FAEROESE = 33L; public const long SAHPI_LANG_FRENCH = 34L; public const long SAHPI_LANG_FRISIAN = 35L; public const long SAHPI_LANG_IRISH = 36L; public const long SAHPI_LANG_SCOTSGAELIC = 37L; public const long SAHPI_LANG_GALICIAN = 38L; public const long SAHPI_LANG_GUARANI = 39L; public const long SAHPI_LANG_GUJARATI = 40L; public const long SAHPI_LANG_HAUSA = 41L; public const long SAHPI_LANG_HINDI = 42L; public const long SAHPI_LANG_CROATIAN = 43L; public const long SAHPI_LANG_HUNGARIAN = 44L; public const long SAHPI_LANG_ARMENIAN = 45L; public const long SAHPI_LANG_INTERLINGUA = 46L; public const long SAHPI_LANG_INTERLINGUE = 47L; public const long SAHPI_LANG_INUPIAK = 48L; public const long SAHPI_LANG_INDONESIAN = 49L; public const long SAHPI_LANG_ICELANDIC = 50L; public const long SAHPI_LANG_ITALIAN = 51L; public const long SAHPI_LANG_HEBREW = 52L; public const long SAHPI_LANG_JAPANESE = 53L; public const long SAHPI_LANG_YIDDISH = 54L; public const long SAHPI_LANG_JAVANESE = 55L; public const long SAHPI_LANG_GEORGIAN = 56L; public const long SAHPI_LANG_KAZAKH = 57L; public const long SAHPI_LANG_GREENLANDIC = 58L; public const long SAHPI_LANG_CAMBODIAN = 59L; public const long SAHPI_LANG_KANNADA = 60L; public const long SAHPI_LANG_KOREAN = 61L; public const long SAHPI_LANG_KASHMIRI = 62L; public const long SAHPI_LANG_KURDISH = 63L; public const long SAHPI_LANG_KIRGHIZ = 64L; public const long SAHPI_LANG_LATIN = 65L; public const long SAHPI_LANG_LINGALA = 66L; public const long SAHPI_LANG_LAOTHIAN = 67L; public const long SAHPI_LANG_LITHUANIAN = 68L; public const long SAHPI_LANG_LATVIANLETTISH = 69L; public const long SAHPI_LANG_MALAGASY = 70L; public const long SAHPI_LANG_MAORI = 71L; public const long SAHPI_LANG_MACEDONIAN = 72L; public const long SAHPI_LANG_MALAYALAM = 73L; public const long SAHPI_LANG_MONGOLIAN = 74L; public const long SAHPI_LANG_MOLDAVIAN = 75L; public const long SAHPI_LANG_MARATHI = 76L; public const long SAHPI_LANG_MALAY = 77L; public const long SAHPI_LANG_MALTESE = 78L; public const long SAHPI_LANG_BURMESE = 79L; public const long SAHPI_LANG_NAURU = 80L; public const long SAHPI_LANG_NEPALI = 81L; public const long SAHPI_LANG_DUTCH = 82L; public const long SAHPI_LANG_NORWEGIAN = 83L; public const long SAHPI_LANG_OCCITAN = 84L; public const long SAHPI_LANG_AFANOROMO = 85L; public const long SAHPI_LANG_ORIYA = 86L; public const long SAHPI_LANG_PUNJABI = 87L; public const long SAHPI_LANG_POLISH = 88L; public const long SAHPI_LANG_PASHTOPUSHTO = 89L; public const long SAHPI_LANG_PORTUGUESE = 90L; public const long SAHPI_LANG_QUECHUA = 91L; public const long SAHPI_LANG_RHAETOROMANCE = 92L; public const long SAHPI_LANG_KIRUNDI = 93L; public const long SAHPI_LANG_ROMANIAN = 94L; public const long SAHPI_LANG_RUSSIAN = 95L; public const long SAHPI_LANG_KINYARWANDA = 96L; public const long SAHPI_LANG_SANSKRIT = 97L; public const long SAHPI_LANG_SINDHI = 98L; public const long SAHPI_LANG_SANGRO = 99L; public const long SAHPI_LANG_SERBOCROATIAN = 100L; public const long SAHPI_LANG_SINGHALESE = 101L; public const long SAHPI_LANG_SLOVAK = 102L; public const long SAHPI_LANG_SLOVENIAN = 103L; public const long SAHPI_LANG_SAMOAN = 104L; public const long SAHPI_LANG_SHONA = 105L; public const long SAHPI_LANG_SOMALI = 106L; public const long SAHPI_LANG_ALBANIAN = 107L; public const long SAHPI_LANG_SERBIAN = 108L; public const long SAHPI_LANG_SISWATI = 109L; public const long SAHPI_LANG_SESOTHO = 110L; public const long SAHPI_LANG_SUDANESE = 111L; public const long SAHPI_LANG_SWEDISH = 112L; public const long SAHPI_LANG_SWAHILI = 113L; public const long SAHPI_LANG_TAMIL = 114L; public const long SAHPI_LANG_TELUGU = 115L; public const long SAHPI_LANG_TAJIK = 116L; public const long SAHPI_LANG_THAI = 117L; public const long SAHPI_LANG_TIGRINYA = 118L; public const long SAHPI_LANG_TURKMEN = 119L; public const long SAHPI_LANG_TAGALOG = 120L; public const long SAHPI_LANG_SETSWANA = 121L; public const long SAHPI_LANG_TONGA = 122L; public const long SAHPI_LANG_TURKISH = 123L; public const long SAHPI_LANG_TSONGA = 124L; public const long SAHPI_LANG_TATAR = 125L; public const long SAHPI_LANG_TWI = 126L; public const long SAHPI_LANG_UKRAINIAN = 127L; public const long SAHPI_LANG_URDU = 128L; public const long SAHPI_LANG_UZBEK = 129L; public const long SAHPI_LANG_VIETNAMESE = 130L; public const long SAHPI_LANG_VOLAPUK = 131L; public const long SAHPI_LANG_WOLOF = 132L; public const long SAHPI_LANG_XHOSA = 133L; public const long SAHPI_LANG_YORUBA = 134L; public const long SAHPI_LANG_CHINESE = 135L; public const long SAHPI_LANG_ZULU = 136L; public const long SAHPI_LANG_MAX_VALID = 136L; public const long SAHPI_TL_TYPE_UNICODE = 0L; public const long SAHPI_TL_TYPE_BCDPLUS = 1L; public const long SAHPI_TL_TYPE_ASCII6 = 2L; public const long SAHPI_TL_TYPE_TEXT = 3L; public const long SAHPI_TL_TYPE_BINARY = 4L; public const long SAHPI_TL_TYPE_MAX_VALID = 4L; public const long SAHPI_ENT_UNSPECIFIED = 0L; public const long SAHPI_ENT_OTHER = 1L; public const long SAHPI_ENT_UNKNOWN = 2L; public const long SAHPI_ENT_PROCESSOR = 3L; public const long SAHPI_ENT_DISK_BAY = 4L; public const long SAHPI_ENT_PERIPHERAL_BAY = 5L; public const long SAHPI_ENT_SYS_MGMNT_MODULE = 6L; public const long SAHPI_ENT_SYSTEM_BOARD = 7L; public const long SAHPI_ENT_MEMORY_MODULE = 8L; public const long SAHPI_ENT_PROCESSOR_MODULE = 9L; public const long SAHPI_ENT_POWER_SUPPLY = 10L; public const long SAHPI_ENT_ADD_IN_CARD = 11L; public const long SAHPI_ENT_FRONT_PANEL_BOARD = 12L; public const long SAHPI_ENT_BACK_PANEL_BOARD = 13L; public const long SAHPI_ENT_POWER_SYSTEM_BOARD = 14L; public const long SAHPI_ENT_DRIVE_BACKPLANE = 15L; public const long SAHPI_ENT_SYS_EXPANSION_BOARD = 16L; public const long SAHPI_ENT_OTHER_SYSTEM_BOARD = 17L; public const long SAHPI_ENT_PROCESSOR_BOARD = 18L; public const long SAHPI_ENT_POWER_UNIT = 19L; public const long SAHPI_ENT_POWER_MODULE = 20L; public const long SAHPI_ENT_POWER_MGMNT = 21L; public const long SAHPI_ENT_CHASSIS_BACK_PANEL_BOARD = 22L; public const long SAHPI_ENT_SYSTEM_CHASSIS = 23L; public const long SAHPI_ENT_SUB_CHASSIS = 24L; public const long SAHPI_ENT_OTHER_CHASSIS_BOARD = 25L; public const long SAHPI_ENT_DISK_DRIVE_BAY = 26L; public const long SAHPI_ENT_PERIPHERAL_BAY_2 = 27L; public const long SAHPI_ENT_DEVICE_BAY = 28L; public const long SAHPI_ENT_COOLING_DEVICE = 29L; public const long SAHPI_ENT_COOLING_UNIT = 30L; public const long SAHPI_ENT_INTERCONNECT = 31L; public const long SAHPI_ENT_MEMORY_DEVICE = 32L; public const long SAHPI_ENT_SYS_MGMNT_SOFTWARE = 33L; public const long SAHPI_ENT_BIOS = 34L; public const long SAHPI_ENT_OPERATING_SYSTEM = 35L; public const long SAHPI_ENT_SYSTEM_BUS = 36L; public const long SAHPI_ENT_GROUP = 37L; public const long SAHPI_ENT_REMOTE = 38L; public const long SAHPI_ENT_EXTERNAL_ENVIRONMENT = 39L; public const long SAHPI_ENT_BATTERY = 40L; public const long SAHPI_ENT_PROCESSING_BLADE = 41L; public const long SAHPI_ENT_CONNECTIVITY_SWITCH = 42L; public const long SAHPI_ENT_PROCESSOR_MEMORY_MODULE = 43L; public const long SAHPI_ENT_IO_MODULE = 44L; public const long SAHPI_ENT_PROCESSOR_IO_MODULE = 45L; public const long SAHPI_ENT_MC_FIRMWARE = 46L; public const long SAHPI_ENT_IPMI_CHANNEL = 47L; public const long SAHPI_ENT_PCI_BUS = 48L; public const long SAHPI_ENT_PCI_EXPRESS_BUS = 49L; public const long SAHPI_ENT_SCSI_BUS = 50L; public const long SAHPI_ENT_SATA_BUS = 51L; public const long SAHPI_ENT_PROC_FSB = 52L; public const long SAHPI_ENT_CLOCK = 53L; public const long SAHPI_ENT_SYSTEM_FIRMWARE = 54L; public const long SAHPI_ENT_CHASSIS_SPECIFIC = 144L; public const long SAHPI_ENT_CHASSIS_SPECIFIC01 = 145L; public const long SAHPI_ENT_CHASSIS_SPECIFIC02 = 146L; public const long SAHPI_ENT_CHASSIS_SPECIFIC03 = 147L; public const long SAHPI_ENT_CHASSIS_SPECIFIC04 = 148L; public const long SAHPI_ENT_CHASSIS_SPECIFIC05 = 149L; public const long SAHPI_ENT_CHASSIS_SPECIFIC06 = 150L; public const long SAHPI_ENT_CHASSIS_SPECIFIC07 = 151L; public const long SAHPI_ENT_CHASSIS_SPECIFIC08 = 152L; public const long SAHPI_ENT_CHASSIS_SPECIFIC09 = 153L; public const long SAHPI_ENT_CHASSIS_SPECIFIC10 = 154L; public const long SAHPI_ENT_CHASSIS_SPECIFIC11 = 155L; public const long SAHPI_ENT_CHASSIS_SPECIFIC12 = 156L; public const long SAHPI_ENT_CHASSIS_SPECIFIC13 = 157L; public const long SAHPI_ENT_BOARD_SET_SPECIFIC = 176L; public const long SAHPI_ENT_OEM_SYSINT_SPECIFIC = 208L; public const long SAHPI_ENT_ROOT = 65535L; public const long SAHPI_ENT_RACK = 65536L; public const long SAHPI_ENT_SUBRACK = 65537L; public const long SAHPI_ENT_COMPACTPCI_CHASSIS = 65538L; public const long SAHPI_ENT_ADVANCEDTCA_CHASSIS = 65539L; public const long SAHPI_ENT_RACK_MOUNTED_SERVER = 65540L; public const long SAHPI_ENT_SYSTEM_BLADE = 65541L; public const long SAHPI_ENT_SWITCH = 65542L; public const long SAHPI_ENT_SWITCH_BLADE = 65543L; public const long SAHPI_ENT_SBC_BLADE = 65544L; public const long SAHPI_ENT_IO_BLADE = 65545L; public const long SAHPI_ENT_DISK_BLADE = 65546L; public const long SAHPI_ENT_DISK_DRIVE = 65547L; public const long SAHPI_ENT_FAN = 65548L; public const long SAHPI_ENT_POWER_DISTRIBUTION_UNIT = 65549L; public const long SAHPI_ENT_SPEC_PROC_BLADE = 65550L; public const long SAHPI_ENT_IO_SUBBOARD = 65551L; public const long SAHPI_ENT_SBC_SUBBOARD = 65552L; public const long SAHPI_ENT_ALARM_MANAGER = 65553L; public const long SAHPI_ENT_SHELF_MANAGER = 65554L; public const long SAHPI_ENT_DISPLAY_PANEL = 65555L; public const long SAHPI_ENT_SUBBOARD_CARRIER_BLADE = 65556L; public const long SAHPI_ENT_PHYSICAL_SLOT = 65557L; public const long SAHPI_ENT_PICMG_FRONT_BLADE = 65558L; public const long SAHPI_ENT_SYSTEM_INVENTORY_DEVICE = 65559L; public const long SAHPI_ENT_FILTRATION_UNIT = 65560L; public const long SAHPI_ENT_AMC = 65561L; public const long SAHPI_ENT_BMC = 65584L; public const long SAHPI_ENT_IPMC = 65585L; public const long SAHPI_ENT_MMC = 65586L; public const long SAHPI_ENT_SHMC = 65587L; public const long SAHPI_ENT_CPLD = 65588L; public const long SAHPI_ENT_EPLD = 65589L; public const long SAHPI_ENT_FPGA = 65590L; public const long SAHPI_ENT_DASD = 65591L; public const long SAHPI_ENT_NIC = 65592L; public const long SAHPI_ENT_DSP = 65593L; public const long SAHPI_ENT_UCODE = 65594L; public const long SAHPI_ENT_NPU = 65595L; public const long SAHPI_ENT_OEM = 65596L; public const long SAHPI_ENT_INTERFACE = 65597L; public const long SAHPI_ENT_MICROTCA_CHASSIS = 65598L; public const long SAHPI_ENT_CARRIER = 65599L; public const long SAHPI_ENT_CARRIER_MANAGER = 65600L; public const long SAHPI_ENT_CONFIG_DATA = 65601L; public const long SAHPI_ENT_INDICATOR = 65602L; public const long SAHPI_ENT_MAX_VALID = 65602L; public const long SAHPI_TEMPERATURE = 1L; public const long SAHPI_VOLTAGE = 2L; public const long SAHPI_CURRENT = 3L; public const long SAHPI_FAN = 4L; public const long SAHPI_PHYSICAL_SECURITY = 5L; public const long SAHPI_PLATFORM_VIOLATION = 6L; public const long SAHPI_PROCESSOR = 7L; public const long SAHPI_POWER_SUPPLY = 8L; public const long SAHPI_POWER_UNIT = 9L; public const long SAHPI_COOLING_DEVICE = 10L; public const long SAHPI_OTHER_UNITS_BASED_SENSOR = 11L; public const long SAHPI_MEMORY = 12L; public const long SAHPI_DRIVE_SLOT = 13L; public const long SAHPI_POST_MEMORY_RESIZE = 14L; public const long SAHPI_SYSTEM_FW_PROGRESS = 15L; public const long SAHPI_EVENT_LOGGING_DISABLED = 16L; public const long SAHPI_RESERVED1 = 17L; public const long SAHPI_SYSTEM_EVENT = 18L; public const long SAHPI_CRITICAL_INTERRUPT = 19L; public const long SAHPI_BUTTON = 20L; public const long SAHPI_MODULE_BOARD = 21L; public const long SAHPI_MICROCONTROLLER_COPROCESSOR = 22L; public const long SAHPI_ADDIN_CARD = 23L; public const long SAHPI_CHASSIS = 24L; public const long SAHPI_CHIP_SET = 25L; public const long SAHPI_OTHER_FRU = 26L; public const long SAHPI_CABLE_INTERCONNECT = 27L; public const long SAHPI_TERMINATOR = 28L; public const long SAHPI_SYSTEM_BOOT_INITIATED = 29L; public const long SAHPI_BOOT_ERROR = 30L; public const long SAHPI_OS_BOOT = 31L; public const long SAHPI_OS_CRITICAL_STOP = 32L; public const long SAHPI_SLOT_CONNECTOR = 33L; public const long SAHPI_SYSTEM_ACPI_POWER_STATE = 34L; public const long SAHPI_RESERVED2 = 35L; public const long SAHPI_PLATFORM_ALERT = 36L; public const long SAHPI_ENTITY_PRESENCE = 37L; public const long SAHPI_MONITOR_ASIC_IC = 38L; public const long SAHPI_LAN = 39L; public const long SAHPI_MANAGEMENT_SUBSYSTEM_HEALTH = 40L; public const long SAHPI_BATTERY = 41L; public const long SAHPI_SESSION_AUDIT = 42L; public const long SAHPI_VERSION_CHANGE = 43L; public const long SAHPI_OPERATIONAL = 160L; public const long SAHPI_OEM_SENSOR = 192L; public const long SAHPI_COMM_CHANNEL_LINK_STATE = 65537L; public const long SAHPI_MANAGEMENT_BUS_STATE = 65538L; public const long SAHPI_COMM_CHANNEL_BUS_STATE = 65539L; public const long SAHPI_CONFIG_DATA = 65540L; public const long SAHPI_POWER_BUDGET = 65541L; public const long SAHPI_SENSOR_TYPE_MAX_VALID = 65541L; public const long SAHPI_SENSOR_READING_TYPE_INT64 = 0L; public const long SAHPI_SENSOR_READING_TYPE_UINT64 = 1L; public const long SAHPI_SENSOR_READING_TYPE_FLOAT64 = 2L; public const long SAHPI_SENSOR_READING_TYPE_BUFFER = 3L; public const long SAHPI_SENSOR_READING_TYPE_MAX_VALID = 3L; public const long SAHPI_SENS_ADD_EVENTS_TO_MASKS = 0L; public const long SAHPI_SENS_REMOVE_EVENTS_FROM_MASKS = 1L; public const long SAHPI_SENS_EVENT_MASK_ACTION_MAX_VALID = 1L; public const long SAHPI_SU_UNSPECIFIED = 0L; public const long SAHPI_SU_DEGREES_C = 1L; public const long SAHPI_SU_DEGREES_F = 2L; public const long SAHPI_SU_DEGREES_K = 3L; public const long SAHPI_SU_VOLTS = 4L; public const long SAHPI_SU_AMPS = 5L; public const long SAHPI_SU_WATTS = 6L; public const long SAHPI_SU_JOULES = 7L; public const long SAHPI_SU_COULOMBS = 8L; public const long SAHPI_SU_VA = 9L; public const long SAHPI_SU_NITS = 10L; public const long SAHPI_SU_LUMEN = 11L; public const long SAHPI_SU_LUX = 12L; public const long SAHPI_SU_CANDELA = 13L; public const long SAHPI_SU_KPA = 14L; public const long SAHPI_SU_PSI = 15L; public const long SAHPI_SU_NEWTON = 16L; public const long SAHPI_SU_CFM = 17L; public const long SAHPI_SU_RPM = 18L; public const long SAHPI_SU_HZ = 19L; public const long SAHPI_SU_MICROSECOND = 20L; public const long SAHPI_SU_MILLISECOND = 21L; public const long SAHPI_SU_SECOND = 22L; public const long SAHPI_SU_MINUTE = 23L; public const long SAHPI_SU_HOUR = 24L; public const long SAHPI_SU_DAY = 25L; public const long SAHPI_SU_WEEK = 26L; public const long SAHPI_SU_MIL = 27L; public const long SAHPI_SU_INCHES = 28L; public const long SAHPI_SU_FEET = 29L; public const long SAHPI_SU_CU_IN = 30L; public const long SAHPI_SU_CU_FEET = 31L; public const long SAHPI_SU_MM = 32L; public const long SAHPI_SU_CM = 33L; public const long SAHPI_SU_M = 34L; public const long SAHPI_SU_CU_CM = 35L; public const long SAHPI_SU_CU_M = 36L; public const long SAHPI_SU_LITERS = 37L; public const long SAHPI_SU_FLUID_OUNCE = 38L; public const long SAHPI_SU_RADIANS = 39L; public const long SAHPI_SU_STERADIANS = 40L; public const long SAHPI_SU_REVOLUTIONS = 41L; public const long SAHPI_SU_CYCLES = 42L; public const long SAHPI_SU_GRAVITIES = 43L; public const long SAHPI_SU_OUNCE = 44L; public const long SAHPI_SU_POUND = 45L; public const long SAHPI_SU_FT_LB = 46L; public const long SAHPI_SU_OZ_IN = 47L; public const long SAHPI_SU_GAUSS = 48L; public const long SAHPI_SU_GILBERTS = 49L; public const long SAHPI_SU_HENRY = 50L; public const long SAHPI_SU_MILLIHENRY = 51L; public const long SAHPI_SU_FARAD = 52L; public const long SAHPI_SU_MICROFARAD = 53L; public const long SAHPI_SU_OHMS = 54L; public const long SAHPI_SU_SIEMENS = 55L; public const long SAHPI_SU_MOLE = 56L; public const long SAHPI_SU_BECQUEREL = 57L; public const long SAHPI_SU_PPM = 58L; public const long SAHPI_SU_RESERVED = 59L; public const long SAHPI_SU_DECIBELS = 60L; public const long SAHPI_SU_DBA = 61L; public const long SAHPI_SU_DBC = 62L; public const long SAHPI_SU_GRAY = 63L; public const long SAHPI_SU_SIEVERT = 64L; public const long SAHPI_SU_COLOR_TEMP_DEG_K = 65L; public const long SAHPI_SU_BIT = 66L; public const long SAHPI_SU_KILOBIT = 67L; public const long SAHPI_SU_MEGABIT = 68L; public const long SAHPI_SU_GIGABIT = 69L; public const long SAHPI_SU_BYTE = 70L; public const long SAHPI_SU_KILOBYTE = 71L; public const long SAHPI_SU_MEGABYTE = 72L; public const long SAHPI_SU_GIGABYTE = 73L; public const long SAHPI_SU_WORD = 74L; public const long SAHPI_SU_DWORD = 75L; public const long SAHPI_SU_QWORD = 76L; public const long SAHPI_SU_LINE = 77L; public const long SAHPI_SU_HIT = 78L; public const long SAHPI_SU_MISS = 79L; public const long SAHPI_SU_RETRY = 80L; public const long SAHPI_SU_RESET = 81L; public const long SAHPI_SU_OVERRUN = 82L; public const long SAHPI_SU_UNDERRUN = 83L; public const long SAHPI_SU_COLLISION = 84L; public const long SAHPI_SU_PACKETS = 85L; public const long SAHPI_SU_MESSAGES = 86L; public const long SAHPI_SU_CHARACTERS = 87L; public const long SAHPI_SU_ERRORS = 88L; public const long SAHPI_SU_CORRECTABLE_ERRORS = 89L; public const long SAHPI_SU_UNCORRECTABLE_ERRORS = 90L; public const long SAHPI_SU_MAX_VALID = 90L; public const long SAHPI_SMUU_NONE = 0L; public const long SAHPI_SMUU_BASIC_OVER_MODIFIER = 1L; public const long SAHPI_SMUU_BASIC_TIMES_MODIFIER = 2L; public const long SAHPI_SMUU_MAX_VALID = 2L; public const long SAHPI_SEC_PER_EVENT = 0L; public const long SAHPI_SEC_READ_ONLY_MASKS = 1L; public const long SAHPI_SEC_READ_ONLY = 2L; public const long SAHPI_SEC_MAX_VALID = 2L; public const long SAHPI_CTRL_TYPE_DIGITAL = 0L; public const long SAHPI_CTRL_TYPE_DISCRETE = 1L; public const long SAHPI_CTRL_TYPE_ANALOG = 2L; public const long SAHPI_CTRL_TYPE_STREAM = 3L; public const long SAHPI_CTRL_TYPE_TEXT = 4L; public const long SAHPI_CTRL_TYPE_OEM = 192L; public const long SAHPI_CTRL_TYPE_MAX_VALID = 192L; public const long SAHPI_CTRL_STATE_OFF = 0L; public const long SAHPI_CTRL_STATE_ON = 1L; public const long SAHPI_CTRL_STATE_PULSE_OFF = 2L; public const long SAHPI_CTRL_STATE_PULSE_ON = 3L; public const long SAHPI_CTRL_STATE_MAX_VALID = 3L; public const long SAHPI_CTRL_MODE_AUTO = 0L; public const long SAHPI_CTRL_MODE_MANUAL = 1L; public const long SAHPI_CTRL_MODE_MAX_VALID = 1L; public const long SAHPI_CTRL_GENERIC = 0L; public const long SAHPI_CTRL_LED = 1L; public const long SAHPI_CTRL_FAN_SPEED = 2L; public const long SAHPI_CTRL_DRY_CONTACT_CLOSURE = 3L; public const long SAHPI_CTRL_POWER_SUPPLY_INHIBIT = 4L; public const long SAHPI_CTRL_AUDIBLE = 5L; public const long SAHPI_CTRL_FRONT_PANEL_LOCKOUT = 6L; public const long SAHPI_CTRL_POWER_INTERLOCK = 7L; public const long SAHPI_CTRL_POWER_STATE = 8L; public const long SAHPI_CTRL_LCD_DISPLAY = 9L; public const long SAHPI_CTRL_OEM = 10L; public const long SAHPI_CTRL_GENERIC_ADDRESS = 11L; public const long SAHPI_CTRL_IP_ADDRESS = 12L; public const long SAHPI_CTRL_RESOURCE_ID = 13L; public const long SAHPI_CTRL_POWER_BUDGET = 14L; public const long SAHPI_CTRL_ACTIVATE = 15L; public const long SAHPI_CTRL_RESET = 16L; public const long SAHPI_CTRL_OUTPUT_TYPE_MAX_VALID = 16L; public const long SAHPI_IDR_AREATYPE_INTERNAL_USE = 176L; public const long SAHPI_IDR_AREATYPE_CHASSIS_INFO = 177L; public const long SAHPI_IDR_AREATYPE_BOARD_INFO = 178L; public const long SAHPI_IDR_AREATYPE_PRODUCT_INFO = 179L; public const long SAHPI_IDR_AREATYPE_OEM = 192L; public const long SAHPI_IDR_AREATYPE_UNSPECIFIED = 255L; public const long SAHPI_IDR_AREATYPE_MAX_VALID = 255L; public const long SAHPI_IDR_FIELDTYPE_CHASSIS_TYPE = 0L; public const long SAHPI_IDR_FIELDTYPE_MFG_DATETIME = 1L; public const long SAHPI_IDR_FIELDTYPE_MANUFACTURER = 2L; public const long SAHPI_IDR_FIELDTYPE_PRODUCT_NAME = 3L; public const long SAHPI_IDR_FIELDTYPE_PRODUCT_VERSION = 4L; public const long SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER = 5L; public const long SAHPI_IDR_FIELDTYPE_PART_NUMBER = 6L; public const long SAHPI_IDR_FIELDTYPE_FILE_ID = 7L; public const long SAHPI_IDR_FIELDTYPE_ASSET_TAG = 8L; public const long SAHPI_IDR_FIELDTYPE_CUSTOM = 9L; public const long SAHPI_IDR_FIELDTYPE_UNSPECIFIED = 255L; public const long SAHPI_IDR_FIELDTYPE_MAX_VALID = 255L; public const long SAHPI_WA_NO_ACTION = 0L; public const long SAHPI_WA_RESET = 1L; public const long SAHPI_WA_POWER_DOWN = 2L; public const long SAHPI_WA_POWER_CYCLE = 3L; public const long SAHPI_WA_MAX_VALID = 3L; public const long SAHPI_WAE_NO_ACTION = 0L; public const long SAHPI_WAE_RESET = 1L; public const long SAHPI_WAE_POWER_DOWN = 2L; public const long SAHPI_WAE_POWER_CYCLE = 3L; public const long SAHPI_WAE_TIMER_INT = 8L; public const long SAHPI_WAE_MAX_VALID = 8L; public const long SAHPI_WPI_NONE = 0L; public const long SAHPI_WPI_SMI = 1L; public const long SAHPI_WPI_NMI = 2L; public const long SAHPI_WPI_MESSAGE_INTERRUPT = 3L; public const long SAHPI_WPI_OEM = 15L; public const long SAHPI_WPI_MAX_VALID = 15L; public const long SAHPI_WTU_NONE = 0L; public const long SAHPI_WTU_BIOS_FRB2 = 1L; public const long SAHPI_WTU_BIOS_POST = 2L; public const long SAHPI_WTU_OS_LOAD = 3L; public const long SAHPI_WTU_SMS_OS = 4L; public const long SAHPI_WTU_OEM = 5L; public const long SAHPI_WTU_UNSPECIFIED = 15L; public const long SAHPI_WTU_MAX_VALID = 15L; public const long SAHPI_DIMITEST_NONDEGRADING = 0L; public const long SAHPI_DIMITEST_DEGRADING = 1L; public const long SAHPI_DIMITEST_VENDOR_DEFINED_LEVEL = 2L; public const long SAHPI_DIMITEST_SERVICE_IMPACT_MAX_VALID = 2L; public const long SAHPI_DIMITEST_STATUS_NOT_RUN = 0L; public const long SAHPI_DIMITEST_STATUS_FINISHED_NO_ERRORS = 1L; public const long SAHPI_DIMITEST_STATUS_FINISHED_ERRORS = 2L; public const long SAHPI_DIMITEST_STATUS_CANCELED = 3L; public const long SAHPI_DIMITEST_STATUS_RUNNING = 4L; public const long SAHPI_DIMITEST_STATUS_MAX_VALID = 4L; public const long SAHPI_DIMITEST_STATUSERR_NOERR = 0L; public const long SAHPI_DIMITEST_STATUSERR_RUNERR = 1L; public const long SAHPI_DIMITEST_STATUSERR_UNDEF = 2L; public const long SAHPI_DIMITEST_STATUSERR_MAX_VALID = 2L; public const long SAHPI_DIMITEST_PARAM_TYPE_BOOLEAN = 0L; public const long SAHPI_DIMITEST_PARAM_TYPE_INT32 = 1L; public const long SAHPI_DIMITEST_PARAM_TYPE_FLOAT64 = 2L; public const long SAHPI_DIMITEST_PARAM_TYPE_TEXT = 3L; public const long SAHPI_DIMITEST_PARAM_TYPE_MAX_VALID = 3L; public const long SAHPI_DIMI_READY = 0L; public const long SAHPI_DIMI_WRONG_STATE = 1L; public const long SAHPI_DIMI_BUSY = 2L; public const long SAHPI_DIMI_READY_MAX_VALID = 2L; public const long SAHPI_FUMI_SPEC_INFO_NONE = 0L; public const long SAHPI_FUMI_SPEC_INFO_SAF_DEFINED = 1L; public const long SAHPI_FUMI_SPEC_INFO_OEM_DEFINED = 2L; public const long SAHPI_FUMI_SPEC_INFO_MAX_VALID = 2L; public const long SAHPI_FUMI_SPEC_HPM1 = 0L; public const long SAHPI_FUMI_SPEC_MAX_VALID = 0L; public const long SAHPI_FUMI_PROCESS_NONDEGRADING = 0L; public const long SAHPI_FUMI_PROCESS_DEGRADING = 1L; public const long SAHPI_FUMI_PROCESS_VENDOR_DEFINED_IMPACT_LEVEL = 2L; public const long SAHPI_FUMI_PROCESS_IMPACT_MAX_VALID = 2L; public const long SAHPI_FUMI_SRC_VALID = 0L; public const long SAHPI_FUMI_SRC_PROTOCOL_NOT_SUPPORTED = 1L; public const long SAHPI_FUMI_SRC_UNREACHABLE = 2L; public const long SAHPI_FUMI_SRC_VALIDATION_NOT_STARTED = 3L; public const long SAHPI_FUMI_SRC_VALIDATION_INITIATED = 4L; public const long SAHPI_FUMI_SRC_VALIDATION_FAIL = 5L; public const long SAHPI_FUMI_SRC_TYPE_MISMATCH = 6L; public const long SAHPI_FUMI_SRC_INVALID = 7L; public const long SAHPI_FUMI_SRC_VALIDITY_UNKNOWN = 8L; public const long SAHPI_FUMI_SRC_STATUS_MAX_VALID = 8L; public const long SAHPI_FUMI_BANK_VALID = 0L; public const long SAHPI_FUMI_BANK_UPGRADE_IN_PROGRESS = 1L; public const long SAHPI_FUMI_BANK_CORRUPTED = 2L; public const long SAHPI_FUMI_BANK_ACTIVE = 3L; public const long SAHPI_FUMI_BANK_BUSY = 4L; public const long SAHPI_FUMI_BANK_UNKNOWN = 5L; public const long SAHPI_FUMI_BANK_STATE_MAX_VALID = 5L; public const long SAHPI_FUMI_OPERATION_NOTSTARTED = 0L; public const long SAHPI_FUMI_SOURCE_VALIDATION_INITIATED = 1L; public const long SAHPI_FUMI_SOURCE_VALIDATION_FAILED = 2L; public const long SAHPI_FUMI_SOURCE_VALIDATION_DONE = 3L; public const long SAHPI_FUMI_SOURCE_VALIDATION_CANCELLED = 4L; public const long SAHPI_FUMI_INSTALL_INITIATED = 5L; public const long SAHPI_FUMI_INSTALL_FAILED_ROLLBACK_NEEDED = 6L; public const long SAHPI_FUMI_INSTALL_FAILED_ROLLBACK_INITIATED = 7L; public const long SAHPI_FUMI_INSTALL_FAILED_ROLLBACK_NOT_POSSIBLE = 8L; public const long SAHPI_FUMI_INSTALL_DONE = 9L; public const long SAHPI_FUMI_INSTALL_CANCELLED = 10L; public const long SAHPI_FUMI_ROLLBACK_INITIATED = 11L; public const long SAHPI_FUMI_ROLLBACK_FAILED = 12L; public const long SAHPI_FUMI_ROLLBACK_DONE = 13L; public const long SAHPI_FUMI_ROLLBACK_CANCELLED = 14L; public const long SAHPI_FUMI_BACKUP_INITIATED = 15L; public const long SAHPI_FUMI_BACKUP_FAILED = 16L; public const long SAHPI_FUMI_BACKUP_DONE = 17L; public const long SAHPI_FUMI_BACKUP_CANCELLED = 18L; public const long SAHPI_FUMI_BANK_COPY_INITIATED = 19L; public const long SAHPI_FUMI_BANK_COPY_FAILED = 20L; public const long SAHPI_FUMI_BANK_COPY_DONE = 21L; public const long SAHPI_FUMI_BANK_COPY_CANCELLED = 22L; public const long SAHPI_FUMI_TARGET_VERIFY_INITIATED = 23L; public const long SAHPI_FUMI_TARGET_VERIFY_FAILED = 24L; public const long SAHPI_FUMI_TARGET_VERIFY_DONE = 25L; public const long SAHPI_FUMI_TARGET_VERIFY_CANCELLED = 26L; public const long SAHPI_FUMI_ACTIVATE_INITIATED = 27L; public const long SAHPI_FUMI_ACTIVATE_FAILED_ROLLBACK_NEEDED = 28L; public const long SAHPI_FUMI_ACTIVATE_FAILED_ROLLBACK_INITIATED = 29L; public const long SAHPI_FUMI_ACTIVATE_FAILED_ROLLBACK_NOT_POSSIBLE = 30L; public const long SAHPI_FUMI_ACTIVATE_DONE = 31L; public const long SAHPI_FUMI_ACTIVATE_CANCELLED = 32L; public const long SAHPI_FUMI_UPGRADE_STATUS_MAX_VALID = 32L; public const long SAHPI_HS_INDICATOR_OFF = 0L; public const long SAHPI_HS_INDICATOR_ON = 1L; public const long SAHPI_HS_INDICATOR_STATE_MAX_VALID = 1L; public const long SAHPI_HS_ACTION_INSERTION = 0L; public const long SAHPI_HS_ACTION_EXTRACTION = 1L; public const long SAHPI_HS_ACTION_MAX_VALID = 1L; public const long SAHPI_HS_STATE_INACTIVE = 0L; public const long SAHPI_HS_STATE_INSERTION_PENDING = 1L; public const long SAHPI_HS_STATE_ACTIVE = 2L; public const long SAHPI_HS_STATE_EXTRACTION_PENDING = 3L; public const long SAHPI_HS_STATE_NOT_PRESENT = 4L; public const long SAHPI_HS_STATE_MAX_VALID = 4L; public const long SAHPI_HS_CAUSE_AUTO_POLICY = 0L; public const long SAHPI_HS_CAUSE_EXT_SOFTWARE = 1L; public const long SAHPI_HS_CAUSE_OPERATOR_INIT = 2L; public const long SAHPI_HS_CAUSE_USER_UPDATE = 3L; public const long SAHPI_HS_CAUSE_UNEXPECTED_DEACTIVATION = 4L; public const long SAHPI_HS_CAUSE_SURPRISE_EXTRACTION = 5L; public const long SAHPI_HS_CAUSE_EXTRACTION_UPDATE = 6L; public const long SAHPI_HS_CAUSE_HARDWARE_FAULT = 7L; public const long SAHPI_HS_CAUSE_CONTAINING_FRU = 8L; public const long SAHPI_HS_CAUSE_UNKNOWN = 65535L; public const long SAHPI_HS_CAUSE_MAX_VALID = 65535L; public const long SAHPI_CRITICAL = 0L; public const long SAHPI_MAJOR = 1L; public const long SAHPI_MINOR = 2L; public const long SAHPI_INFORMATIONAL = 3L; public const long SAHPI_OK = 4L; public const long SAHPI_DEBUG = 240L; public const long SAHPI_ALL_SEVERITIES = 255L; public const long SAHPI_SEVERITY_MAX_VALID = 240L; public const long SAHPI_RESE_RESOURCE_FAILURE = 0L; public const long SAHPI_RESE_RESOURCE_RESTORED = 1L; public const long SAHPI_RESE_RESOURCE_ADDED = 2L; public const long SAHPI_RESE_RESOURCE_REMOVED = 3L; public const long SAHPI_RESE_RESOURCE_INACCESSIBLE = 4L; public const long SAHPI_RESE_RESOURCE_UPDATED = 5L; public const long SAHPI_RESE_TYPE_MAX_VALID = 5L; public const long SAHPI_DOMAIN_REF_ADDED = 0L; public const long SAHPI_DOMAIN_REF_REMOVED = 1L; public const long SAHPI_DOMAIN_EVENT_TYPE_MAX_VALID = 1L; public const long SAHPI_HPIE_AUDIT = 0L; public const long SAHPI_HPIE_STARTUP = 1L; public const long SAHPI_HPIE_OTHER = 2L; public const long SAHPI_HPIE_TYPE_MAX_VALID = 2L; public const long SAHPI_ET_RESOURCE = 0L; public const long SAHPI_ET_DOMAIN = 1L; public const long SAHPI_ET_SENSOR = 2L; public const long SAHPI_ET_SENSOR_ENABLE_CHANGE = 3L; public const long SAHPI_ET_HOTSWAP = 4L; public const long SAHPI_ET_WATCHDOG = 5L; public const long SAHPI_ET_HPI_SW = 6L; public const long SAHPI_ET_OEM = 7L; public const long SAHPI_ET_USER = 8L; public const long SAHPI_ET_DIMI = 9L; public const long SAHPI_ET_DIMI_UPDATE = 10L; public const long SAHPI_ET_FUMI = 11L; public const long SAHPI_ET_MAX_VALID = 11L; public const long SAHPI_STATUS_COND_TYPE_SENSOR = 0L; public const long SAHPI_STATUS_COND_TYPE_RESOURCE = 1L; public const long SAHPI_STATUS_COND_TYPE_OEM = 2L; public const long SAHPI_STATUS_COND_TYPE_USER = 3L; public const long SAHPI_STATUS_COND_TYPE_MAX_VALID = 3L; public const long SAHPI_ANNUNCIATOR_MODE_AUTO = 0L; public const long SAHPI_ANNUNCIATOR_MODE_USER = 1L; public const long SAHPI_ANNUNCIATOR_MODE_SHARED = 2L; public const long SAHPI_ANNUNCIATOR_MODE_MAX_VALID = 2L; public const long SAHPI_ANNUNCIATOR_TYPE_LED = 0L; public const long SAHPI_ANNUNCIATOR_TYPE_DRY_CONTACT_CLOSURE = 1L; public const long SAHPI_ANNUNCIATOR_TYPE_AUDIBLE = 2L; public const long SAHPI_ANNUNCIATOR_TYPE_LCD_DISPLAY = 3L; public const long SAHPI_ANNUNCIATOR_TYPE_MESSAGE = 4L; public const long SAHPI_ANNUNCIATOR_TYPE_COMPOSITE = 5L; public const long SAHPI_ANNUNCIATOR_TYPE_OEM = 6L; public const long SAHPI_ANNUNCIATOR_TYPE_MAX_VALID = 6L; public const long SAHPI_NO_RECORD = 0L; public const long SAHPI_CTRL_RDR = 1L; public const long SAHPI_SENSOR_RDR = 2L; public const long SAHPI_INVENTORY_RDR = 3L; public const long SAHPI_WATCHDOG_RDR = 4L; public const long SAHPI_ANNUNCIATOR_RDR = 5L; public const long SAHPI_DIMI_RDR = 6L; public const long SAHPI_FUMI_RDR = 7L; public const long SAHPI_RDR_TYPE_MAX_VALID = 7L; public const long SAHPI_DEFAULT_PARM = 0L; public const long SAHPI_SAVE_PARM = 1L; public const long SAHPI_RESTORE_PARM = 2L; public const long SAHPI_PARM_ACTION_MAX_VALID = 2L; public const long SAHPI_COLD_RESET = 0L; public const long SAHPI_WARM_RESET = 1L; public const long SAHPI_RESET_ASSERT = 2L; public const long SAHPI_RESET_DEASSERT = 3L; public const long SAHPI_RESET_MAX_VALID = 3L; public const long SAHPI_POWER_OFF = 0L; public const long SAHPI_POWER_ON = 1L; public const long SAHPI_POWER_CYCLE = 2L; public const long SAHPI_POWER_STATE_MAX_VALID = 2L; public const long SAHPI_EL_OVERFLOW_DROP = 0L; public const long SAHPI_EL_OVERFLOW_OVERWRITE = 1L; public const long SAHPI_EL_OVERFLOW_ACTION_MAX_TYPE = 1L; public const long ATCAHPI_LED_COLOR_RESERVED = 0L; public const long ATCAHPI_LED_COLOR_BLUE = 1L; public const long ATCAHPI_LED_COLOR_RED = 2L; public const long ATCAHPI_LED_COLOR_GREEN = 3L; public const long ATCAHPI_LED_COLOR_AMBER = 4L; public const long ATCAHPI_LED_COLOR_ORANGE = 5L; public const long ATCAHPI_LED_COLOR_WHITE = 6L; public const long ATCAHPI_LED_COLOR_NO_CHANGE = 14L; public const long ATCAHPI_LED_COLOR_USE_DEFAULT = 15L; public const long ATCAHPI_LED_AUTO = 0L; public const long ATCAHPI_LED_MANUAL = 1L; public const long ATCAHPI_LED_LAMP_TEST = 2L; public const long ATCAHPI_LED_BR_SUPPORTED = 0L; public const long ATCAHPI_LED_BR_NOT_SUPPORTED = 1L; public const long ATCAHPI_LED_BR_UNKNOWN = 2L; public const long XTCAHPI_LED_COLOR_RESERVED = 0L; public const long XTCAHPI_LED_COLOR_BLUE = 1L; public const long XTCAHPI_LED_COLOR_RED = 2L; public const long XTCAHPI_LED_COLOR_GREEN = 3L; public const long XTCAHPI_LED_COLOR_AMBER = 4L; public const long XTCAHPI_LED_COLOR_ORANGE = 5L; public const long XTCAHPI_LED_COLOR_WHITE = 6L; public const long XTCAHPI_LED_COLOR_NO_CHANGE = 14L; public const long XTCAHPI_LED_COLOR_USE_DEFAULT = 15L; public const long XTCAHPI_LED_AUTO = 0L; public const long XTCAHPI_LED_MANUAL = 1L; public const long XTCAHPI_LED_LAMP_TEST = 2L; public const long XTCAHPI_LED_BR_SUPPORTED = 0L; public const long XTCAHPI_LED_BR_NOT_SUPPORTED = 1L; public const long XTCAHPI_LED_BR_UNKNOWN = 2L; public const long SA_ERR_HPI_OK = 0L; }; /********************************************************** * HPI Simple Data Types Map *********************************************************/ /********************************************************** * SaHpiUint8T : long * SaHpiUint16T : long * SaHpiUint32T : long * SaHpiUint64T : long * SaHpiInt8T : long * SaHpiInt16T : long * SaHpiInt32T : long * SaHpiInt64T : long * Enum : long * SaHpiFloat64T : double * SaHpiBoolT : long * SaHpiManufacturerIdT : long * SaHpiVersionT : long * SaErrorT : long * SaHpiDomainIdT : long * SaHpiSessionIdT : long * SaHpiResourceIdT : long * SaHpiEntryIdT : long * SaHpiTimeT : long * SaHpiTimeoutT : long * SaHpiInstrumentIdT : long * SaHpiEntityLocationT : long * SaHpiEventCategoryT : long * SaHpiEventStateT : long * SaHpiSensorNumT : long * SaHpiSensorRangeFlagsT : long * SaHpiSensorThdMaskT : long * SaHpiCtrlNumT : long * SaHpiCtrlStateDiscreteT : long * SaHpiCtrlStateAnalogT : long * SaHpiTxtLineNumT : long * SaHpiIdrIdT : long * SaHpiWatchdogNumT : long * SaHpiWatchdogExpFlagsT : long * SaHpiDimiNumT : long * SaHpiDimiTestCapabilityT : long * SaHpiDimiTestNumT : long * SaHpiDimiTestPercentCompletedT : long * SaHpiFumiNumT : long * SaHpiBankNumT : long * SaHpiFumiLogicalBankStateFlagsT : long * SaHpiFumiProtocolT : long * SaHpiFumiCapabilityT : long * SaHpiSensorOptionalDataT : long * SaHpiSensorEnableOptDataT : long * SaHpiEvtQueueStatusT : long * SaHpiAnnunciatorNumT : long * SaHpiLoadNumberT : long * SaHpiCapabilitiesT : long * SaHpiHsCapabilitiesT : long * SaHpiDomainCapabilitiesT : long * SaHpiAlarmIdT : long * SaHpiEventLogCapabilitiesT : long * SaHpiEventLogEntryIdT : long * AtcaHpiColorCapabilitiesT : long * AtcaHpiEntityTypeT : long * AtcaHpiCsCurrentPwrState : long * AtcaHpiCsLastPwrEvent : long * AtcaHpiCsMiscChassisState : long * AtcaHpiCsFpButtonCap : long * XtcaHpiCsCurrentPwrState : long * XtcaHpiCsLastPwrEvent : long * XtcaHpiCsMiscChassisState : long * XtcaHpiCsFpButtonCap : long * XtcaHpiColorCapabilitiesT : long * SaHpiLanguageT : long * SaHpiTextTypeT : long * SaHpiEntityTypeT : long * SaHpiSensorTypeT : long * SaHpiSensorReadingTypeT : long * SaHpiSensorEventMaskActionT : long * SaHpiSensorUnitsT : long * SaHpiSensorModUnitUseT : long * SaHpiSensorEventCtrlT : long * SaHpiCtrlTypeT : long * SaHpiCtrlStateDigitalT : long * SaHpiCtrlModeT : long * SaHpiCtrlOutputTypeT : long * SaHpiIdrAreaTypeT : long * SaHpiIdrFieldTypeT : long * SaHpiWatchdogActionT : long * SaHpiWatchdogActionEventT : long * SaHpiWatchdogPretimerInterruptT : long * SaHpiWatchdogTimerUseT : long * SaHpiDimiTestServiceImpactT : long * SaHpiDimiTestRunStatusT : long * SaHpiDimiTestErrCodeT : long * SaHpiDimiTestParamTypeT : long * SaHpiDimiReadyT : long * SaHpiFumiSpecInfoTypeT : long * SaHpiFumiSafDefinedSpecIdT : long * SaHpiFumiServiceImpactT : long * SaHpiFumiSourceStatusT : long * SaHpiFumiBankStateT : long * SaHpiFumiUpgradeStatusT : long * SaHpiHsIndicatorStateT : long * SaHpiHsActionT : long * SaHpiHsStateT : long * SaHpiHsCauseOfStateChangeT : long * SaHpiSeverityT : long * SaHpiResourceEventTypeT : long * SaHpiDomainEventTypeT : long * SaHpiSwEventTypeT : long * SaHpiEventTypeT : long * SaHpiStatusCondTypeT : long * SaHpiAnnunciatorModeT : long * SaHpiAnnunciatorTypeT : long * SaHpiRdrTypeT : long * SaHpiParmActionT : long * SaHpiResetActionT : long * SaHpiPowerStateT : long * SaHpiEventLogOverflowActionT : long * AtcaHpiLedColorT : long * AtcaHpiResourceLedModeT : long * AtcaHpiLedBrSupportT : long * XtcaHpiLedColorT : long * XtcaHpiResourceLedModeT : long * XtcaHpiLedBrSupportT : long * SaHpiUint8T[] : byte[] *********************************************************/ /********************************************************** * HPI Complex Data Types *********************************************************/ /** * HPI struct SaHpiTextBufferT */ public class SaHpiTextBufferT { public long DataType; public long Language; public long DataLength; // Array of SAHPI_MAX_TEXT_BUFFER_LENGTH elements public byte[] Data; }; /** * HPI struct SaHpiEntityT */ public class SaHpiEntityT { public long EntityType; public long EntityLocation; }; /** * HPI struct SaHpiEntityPathT */ public class SaHpiEntityPathT { // Array of SAHPI_MAX_ENTITY_PATH elements public SaHpiEntityT[] Entry; }; /** * HPI union SaHpiSensorReadingUnionT */ public class SaHpiSensorReadingUnionT { public long SensorInt64; public long SensorUint64; public double SensorFloat64; // Array of SAHPI_SENSOR_BUFFER_LENGTH elements public byte[] SensorBuffer; }; /** * HPI struct SaHpiSensorReadingT */ public class SaHpiSensorReadingT { public long IsSupported; public long Type; public SaHpiSensorReadingUnionT Value; }; /** * HPI struct SaHpiSensorThresholdsT */ public class SaHpiSensorThresholdsT { public SaHpiSensorReadingT LowCritical; public SaHpiSensorReadingT LowMajor; public SaHpiSensorReadingT LowMinor; public SaHpiSensorReadingT UpCritical; public SaHpiSensorReadingT UpMajor; public SaHpiSensorReadingT UpMinor; public SaHpiSensorReadingT PosThdHysteresis; public SaHpiSensorReadingT NegThdHysteresis; }; /** * HPI struct SaHpiSensorRangeT */ public class SaHpiSensorRangeT { public long Flags; public SaHpiSensorReadingT Max; public SaHpiSensorReadingT Min; public SaHpiSensorReadingT Nominal; public SaHpiSensorReadingT NormalMax; public SaHpiSensorReadingT NormalMin; }; /** * HPI struct SaHpiSensorDataFormatT */ public class SaHpiSensorDataFormatT { public long IsSupported; public long ReadingType; public long BaseUnits; public long ModifierUnits; public long ModifierUse; public long Percentage; public SaHpiSensorRangeT Range; public double AccuracyFactor; }; /** * HPI struct SaHpiSensorThdDefnT */ public class SaHpiSensorThdDefnT { public long IsAccessible; public long ReadThold; public long WriteThold; public long Nonlinear; }; /** * HPI struct SaHpiSensorRecT */ public class SaHpiSensorRecT { public long Num; public long Type; public long Category; public long EnableCtrl; public long EventCtrl; public long Events; public SaHpiSensorDataFormatT DataFormat; public SaHpiSensorThdDefnT ThresholdDefn; public long Oem; }; /** * HPI struct SaHpiCtrlStateStreamT */ public class SaHpiCtrlStateStreamT { public long Repeat; public long StreamLength; // Array of SAHPI_CTRL_MAX_STREAM_LENGTH elements public byte[] Stream; }; /** * HPI struct SaHpiCtrlStateTextT */ public class SaHpiCtrlStateTextT { public long Line; public SaHpiTextBufferT Text; }; /** * HPI struct SaHpiCtrlStateOemT */ public class SaHpiCtrlStateOemT { public long MId; public long BodyLength; // Array of SAHPI_CTRL_MAX_OEM_BODY_LENGTH elements public byte[] Body; }; /** * HPI union SaHpiCtrlStateUnionT */ public class SaHpiCtrlStateUnionT { public long Digital; public long Discrete; public long Analog; public SaHpiCtrlStateStreamT Stream; public SaHpiCtrlStateTextT Text; public SaHpiCtrlStateOemT Oem; }; /** * HPI struct SaHpiCtrlStateT */ public class SaHpiCtrlStateT { public long Type; public SaHpiCtrlStateUnionT StateUnion; }; /** * HPI struct SaHpiCtrlRecDigitalT */ public class SaHpiCtrlRecDigitalT { public long Default; }; /** * HPI struct SaHpiCtrlRecDiscreteT */ public class SaHpiCtrlRecDiscreteT { public long Default; }; /** * HPI struct SaHpiCtrlRecAnalogT */ public class SaHpiCtrlRecAnalogT { public long Min; public long Max; public long Default; }; /** * HPI struct SaHpiCtrlRecStreamT */ public class SaHpiCtrlRecStreamT { public SaHpiCtrlStateStreamT Default; }; /** * HPI struct SaHpiCtrlRecTextT */ public class SaHpiCtrlRecTextT { public long MaxChars; public long MaxLines; public long Language; public long DataType; public SaHpiCtrlStateTextT Default; }; /** * HPI struct SaHpiCtrlRecOemT */ public class SaHpiCtrlRecOemT { public long MId; // Array of SAHPI_CTRL_OEM_CONFIG_LENGTH elements public byte[] ConfigData; public SaHpiCtrlStateOemT Default; }; /** * HPI union SaHpiCtrlRecUnionT */ public class SaHpiCtrlRecUnionT { public SaHpiCtrlRecDigitalT Digital; public SaHpiCtrlRecDiscreteT Discrete; public SaHpiCtrlRecAnalogT Analog; public SaHpiCtrlRecStreamT Stream; public SaHpiCtrlRecTextT Text; public SaHpiCtrlRecOemT Oem; }; /** * HPI struct SaHpiCtrlDefaultModeT */ public class SaHpiCtrlDefaultModeT { public long Mode; public long ReadOnly; }; /** * HPI struct SaHpiCtrlRecT */ public class SaHpiCtrlRecT { public long Num; public long OutputType; public long Type; public SaHpiCtrlRecUnionT TypeUnion; public SaHpiCtrlDefaultModeT DefaultMode; public long WriteOnly; public long Oem; }; /** * HPI struct SaHpiIdrFieldT */ public class SaHpiIdrFieldT { public long AreaId; public long FieldId; public long Type; public long ReadOnly; public SaHpiTextBufferT Field; }; /** * HPI struct SaHpiIdrAreaHeaderT */ public class SaHpiIdrAreaHeaderT { public long AreaId; public long Type; public long ReadOnly; public long NumFields; }; /** * HPI struct SaHpiIdrInfoT */ public class SaHpiIdrInfoT { public long IdrId; public long UpdateCount; public long ReadOnly; public long NumAreas; }; /** * HPI struct SaHpiInventoryRecT */ public class SaHpiInventoryRecT { public long IdrId; public long Persistent; public long Oem; }; /** * HPI struct SaHpiWatchdogT */ public class SaHpiWatchdogT { public long Log; public long Running; public long TimerUse; public long TimerAction; public long PretimerInterrupt; public long PreTimeoutInterval; public long TimerUseExpFlags; public long InitialCount; public long PresentCount; }; /** * HPI struct SaHpiWatchdogRecT */ public class SaHpiWatchdogRecT { public long WatchdogNum; public long Oem; }; /** * HPI struct SaHpiDimiTestAffectedEntityT */ public class SaHpiDimiTestAffectedEntityT { public SaHpiEntityPathT EntityImpacted; public long ServiceImpact; }; /** * HPI struct SaHpiDimiTestResultsT */ public class SaHpiDimiTestResultsT { public long ResultTimeStamp; public long RunDuration; public long LastRunStatus; public long TestErrorCode; public SaHpiTextBufferT TestResultString; public long TestResultStringIsURI; }; /** * HPI union SaHpiDimiTestParamValueT */ public class SaHpiDimiTestParamValueT { public long paramint; public long parambool; public double paramfloat; public SaHpiTextBufferT paramtext; }; /** * HPI union SaHpiDimiTestParameterValueUnionT */ public class SaHpiDimiTestParameterValueUnionT { public long IntValue; public double FloatValue; }; /** * HPI struct SaHpiDimiTestParamsDefinitionT */ public class SaHpiDimiTestParamsDefinitionT { // Array of SAHPI_DIMITEST_PARAM_NAME_LEN elements public byte[] ParamName; public SaHpiTextBufferT ParamInfo; public long ParamType; public SaHpiDimiTestParameterValueUnionT MinValue; public SaHpiDimiTestParameterValueUnionT MaxValue; public SaHpiDimiTestParamValueT DefaultParam; }; /** * HPI struct SaHpiDimiTestT */ public class SaHpiDimiTestT { public SaHpiTextBufferT TestName; public long ServiceImpact; // Array of SAHPI_DIMITEST_MAX_ENTITIESIMPACTED elements public SaHpiDimiTestAffectedEntityT[] EntitiesImpacted; public long NeedServiceOS; public SaHpiTextBufferT ServiceOS; public long ExpectedRunDuration; public long TestCapabilities; // Array of SAHPI_DIMITEST_MAX_PARAMETERS elements public SaHpiDimiTestParamsDefinitionT[] TestParameters; }; /** * HPI struct SaHpiDimiTestVariableParamsT */ public class SaHpiDimiTestVariableParamsT { // Array of SAHPI_DIMITEST_PARAM_NAME_LEN elements public byte[] ParamName; public long ParamType; public SaHpiDimiTestParamValueT Value; }; /** * HPI struct SaHpiDimiInfoT */ public class SaHpiDimiInfoT { public long NumberOfTests; public long TestNumUpdateCounter; }; /** * HPI struct SaHpiDimiRecT */ public class SaHpiDimiRecT { public long DimiNum; public long Oem; }; /** * HPI struct SaHpiFumiSafDefinedSpecInfoT */ public class SaHpiFumiSafDefinedSpecInfoT { public long SpecID; public long RevisionID; }; /** * HPI struct SaHpiFumiOemDefinedSpecInfoT */ public class SaHpiFumiOemDefinedSpecInfoT { public long Mid; public long BodyLength; // Array of SAHPI_FUMI_MAX_OEM_BODY_LENGTH elements public byte[] Body; }; /** * HPI union SaHpiFumiSpecInfoTypeUnionT */ public class SaHpiFumiSpecInfoTypeUnionT { public SaHpiFumiSafDefinedSpecInfoT SafDefined; public SaHpiFumiOemDefinedSpecInfoT OemDefined; }; /** * HPI struct SaHpiFumiSpecInfoT */ public class SaHpiFumiSpecInfoT { public long SpecInfoType; public SaHpiFumiSpecInfoTypeUnionT SpecInfoTypeUnion; }; /** * HPI struct SaHpiFumiFirmwareInstanceInfoT */ public class SaHpiFumiFirmwareInstanceInfoT { public long InstancePresent; public SaHpiTextBufferT Identifier; public SaHpiTextBufferT Description; public SaHpiTextBufferT DateTime; public long MajorVersion; public long MinorVersion; public long AuxVersion; }; /** * HPI struct SaHpiFumiImpactedEntityT */ public class SaHpiFumiImpactedEntityT { public SaHpiEntityPathT ImpactedEntity; public long ServiceImpact; }; /** * HPI struct SaHpiFumiServiceImpactDataT */ public class SaHpiFumiServiceImpactDataT { public long NumEntities; // Array of SAHPI_FUMI_MAX_ENTITIES_IMPACTED elements public SaHpiFumiImpactedEntityT[] ImpactedEntities; }; /** * HPI struct SaHpiFumiSourceInfoT */ public class SaHpiFumiSourceInfoT { public SaHpiTextBufferT SourceUri; public long SourceStatus; public SaHpiTextBufferT Identifier; public SaHpiTextBufferT Description; public SaHpiTextBufferT DateTime; public long MajorVersion; public long MinorVersion; public long AuxVersion; }; /** * HPI struct SaHpiFumiComponentInfoT */ public class SaHpiFumiComponentInfoT { public long EntryId; public long ComponentId; public SaHpiFumiFirmwareInstanceInfoT MainFwInstance; public long ComponentFlags; }; /** * HPI struct SaHpiFumiBankInfoT */ public class SaHpiFumiBankInfoT { public long BankId; public long BankSize; public long Position; public long BankState; public SaHpiTextBufferT Identifier; public SaHpiTextBufferT Description; public SaHpiTextBufferT DateTime; public long MajorVersion; public long MinorVersion; public long AuxVersion; }; /** * HPI struct SaHpiFumiLogicalBankInfoT */ public class SaHpiFumiLogicalBankInfoT { public long FirmwarePersistentLocationCount; public long BankStateFlags; public SaHpiFumiFirmwareInstanceInfoT PendingFwInstance; public SaHpiFumiFirmwareInstanceInfoT RollbackFwInstance; }; /** * HPI struct SaHpiFumiLogicalComponentInfoT */ public class SaHpiFumiLogicalComponentInfoT { public long EntryId; public long ComponentId; public SaHpiFumiFirmwareInstanceInfoT PendingFwInstance; public SaHpiFumiFirmwareInstanceInfoT RollbackFwInstance; public long ComponentFlags; }; /** * HPI struct SaHpiFumiRecT */ public class SaHpiFumiRecT { public long Num; public long AccessProt; public long Capability; public long NumBanks; public long Oem; }; /** * HPI struct SaHpiResourceEventT */ public class SaHpiResourceEventT { public long ResourceEventType; }; /** * HPI struct SaHpiDomainEventT */ public class SaHpiDomainEventT { public long Type; public long DomainId; }; /** * HPI struct SaHpiSensorEventT */ public class SaHpiSensorEventT { public long SensorNum; public long SensorType; public long EventCategory; public long Assertion; public long EventState; public long OptionalDataPresent; public SaHpiSensorReadingT TriggerReading; public SaHpiSensorReadingT TriggerThreshold; public long PreviousState; public long CurrentState; public long Oem; public long SensorSpecific; }; /** * HPI struct SaHpiSensorEnableChangeEventT */ public class SaHpiSensorEnableChangeEventT { public long SensorNum; public long SensorType; public long EventCategory; public long SensorEnable; public long SensorEventEnable; public long AssertEventMask; public long DeassertEventMask; public long OptionalDataPresent; public long CurrentState; public long CriticalAlarms; public long MajorAlarms; public long MinorAlarms; }; /** * HPI struct SaHpiHotSwapEventT */ public class SaHpiHotSwapEventT { public long HotSwapState; public long PreviousHotSwapState; public long CauseOfStateChange; }; /** * HPI struct SaHpiWatchdogEventT */ public class SaHpiWatchdogEventT { public long WatchdogNum; public long WatchdogAction; public long WatchdogPreTimerAction; public long WatchdogUse; }; /** * HPI struct SaHpiHpiSwEventT */ public class SaHpiHpiSwEventT { public long MId; public long Type; public SaHpiTextBufferT EventData; }; /** * HPI struct SaHpiOemEventT */ public class SaHpiOemEventT { public long MId; public SaHpiTextBufferT OemEventData; }; /** * HPI struct SaHpiUserEventT */ public class SaHpiUserEventT { public SaHpiTextBufferT UserEventData; }; /** * HPI struct SaHpiDimiEventT */ public class SaHpiDimiEventT { public long DimiNum; public long TestNum; public long DimiTestRunStatus; public long DimiTestPercentCompleted; }; /** * HPI struct SaHpiDimiUpdateEventT */ public class SaHpiDimiUpdateEventT { public long DimiNum; }; /** * HPI struct SaHpiFumiEventT */ public class SaHpiFumiEventT { public long FumiNum; public long BankNum; public long UpgradeStatus; }; /** * HPI union SaHpiEventUnionT */ public class SaHpiEventUnionT { public SaHpiResourceEventT ResourceEvent; public SaHpiDomainEventT DomainEvent; public SaHpiSensorEventT SensorEvent; public SaHpiSensorEnableChangeEventT SensorEnableChangeEvent; public SaHpiHotSwapEventT HotSwapEvent; public SaHpiWatchdogEventT WatchdogEvent; public SaHpiHpiSwEventT HpiSwEvent; public SaHpiOemEventT OemEvent; public SaHpiUserEventT UserEvent; public SaHpiDimiEventT DimiEvent; public SaHpiDimiUpdateEventT DimiUpdateEvent; public SaHpiFumiEventT FumiEvent; }; /** * HPI struct SaHpiEventT */ public class SaHpiEventT { public long Source; public long EventType; public long Timestamp; public long Severity; public SaHpiEventUnionT EventDataUnion; }; /** * HPI struct SaHpiNameT */ public class SaHpiNameT { public long Length; // Array of SA_HPI_MAX_NAME_LENGTH elements public byte[] Value; }; /** * HPI struct SaHpiConditionT */ public class SaHpiConditionT { public long Type; public SaHpiEntityPathT Entity; public long DomainId; public long ResourceId; public long SensorNum; public long EventState; public SaHpiNameT Name; public long Mid; public SaHpiTextBufferT Data; }; /** * HPI struct SaHpiAnnouncementT */ public class SaHpiAnnouncementT { public long EntryId; public long Timestamp; public long AddedByUser; public long Severity; public long Acknowledged; public SaHpiConditionT StatusCond; }; /** * HPI struct SaHpiAnnunciatorRecT */ public class SaHpiAnnunciatorRecT { public long AnnunciatorNum; public long AnnunciatorType; public long ModeReadOnly; public long MaxConditions; public long Oem; }; /** * HPI union SaHpiRdrTypeUnionT */ public class SaHpiRdrTypeUnionT { public SaHpiCtrlRecT CtrlRec; public SaHpiSensorRecT SensorRec; public SaHpiInventoryRecT InventoryRec; public SaHpiWatchdogRecT WatchdogRec; public SaHpiAnnunciatorRecT AnnunciatorRec; public SaHpiDimiRecT DimiRec; public SaHpiFumiRecT FumiRec; }; /** * HPI struct SaHpiRdrT */ public class SaHpiRdrT { public long RecordId; public long RdrType; public SaHpiEntityPathT Entity; public long IsFru; public SaHpiRdrTypeUnionT RdrTypeUnion; public SaHpiTextBufferT IdString; }; /** * HPI struct SaHpiLoadIdT */ public class SaHpiLoadIdT { public long LoadNumber; public SaHpiTextBufferT LoadName; }; /** * HPI struct SaHpiResourceInfoT */ public class SaHpiResourceInfoT { public long ResourceRev; public long SpecificVer; public long DeviceSupport; public long ManufacturerId; public long ProductId; public long FirmwareMajorRev; public long FirmwareMinorRev; public long AuxFirmwareRev; // Array of SAHPI_GUID_LENGTH elements public byte[] Guid; }; /** * HPI struct SaHpiRptEntryT */ public class SaHpiRptEntryT { public long EntryId; public long ResourceId; public SaHpiResourceInfoT ResourceInfo; public SaHpiEntityPathT ResourceEntity; public long ResourceCapabilities; public long HotSwapCapabilities; public long ResourceSeverity; public long ResourceFailed; public SaHpiTextBufferT ResourceTag; }; /** * HPI struct SaHpiDomainInfoT */ public class SaHpiDomainInfoT { public long DomainId; public long DomainCapabilities; public long IsPeer; public SaHpiTextBufferT DomainTag; public long DrtUpdateCount; public long DrtUpdateTimestamp; public long RptUpdateCount; public long RptUpdateTimestamp; public long DatUpdateCount; public long DatUpdateTimestamp; public long ActiveAlarms; public long CriticalAlarms; public long MajorAlarms; public long MinorAlarms; public long DatUserAlarmLimit; public long DatOverflow; // Array of SAHPI_GUID_LENGTH elements public byte[] Guid; }; /** * HPI struct SaHpiDrtEntryT */ public class SaHpiDrtEntryT { public long EntryId; public long DomainId; public long IsPeer; }; /** * HPI struct SaHpiAlarmT */ public class SaHpiAlarmT { public long AlarmId; public long Timestamp; public long Severity; public long Acknowledged; public SaHpiConditionT AlarmCond; }; /** * HPI struct SaHpiEventLogInfoT */ public class SaHpiEventLogInfoT { public long Entries; public long Size; public long UserEventMaxSize; public long UpdateTimestamp; public long CurrentTime; public long Enabled; public long OverflowFlag; public long OverflowResetable; public long OverflowAction; }; /** * HPI struct SaHpiEventLogEntryT */ public class SaHpiEventLogEntryT { public long EntryId; public long Timestamp; public SaHpiEventT Event; }; }; // namespace openhpi }; // namespace org openhpi-3.6.1/baselibs/csharp/openhpi_baselib/HpiUtil.cs0000644000175100017510000001413412575647300022263 0ustar mohanmohan/* -*- c# -*- * * Copyright (C) 2012, Pigeon Point Systems * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ using System; using System.Text; namespace org { namespace openhpi { /********************************************************** * HPI Utility Functions *********************************************************/ public static partial class HpiUtil { /********************************************************** * NB: ToXXX throws FormatException if lookup fails *********************************************************/ // For encoding private static ASCIIEncoding ascii = new ASCIIEncoding(); /********************************************************** * Text Buffer Helpers *********************************************************/ public static string FromSaHpiTextBufferT( SaHpiTextBufferT tb ) { // NB: Only BCD+/ASCII6/ASCII(Eng)/ are now supported. // TODO implement further bool ok = false; ok = ok || ( tb.DataType == HpiConst.SAHPI_TL_TYPE_BCDPLUS ); ok = ok || ( tb.DataType == HpiConst.SAHPI_TL_TYPE_ASCII6 ); bool eng = ( tb.Language == HpiConst.SAHPI_LANG_ENGLISH ); ok = ok || ( ( tb.DataType == HpiConst.SAHPI_TL_TYPE_TEXT ) && eng ); string s = null; if ( ok ) { char[] data = new char[tb.DataLength]; Array.Copy( tb.Data, data, tb.DataLength ); s = new string( data, 0, unchecked( (int)tb.DataLength ) ); } else { throw new FormatException(); } return s; } public static SaHpiTextBufferT ToSaHpiTextBufferT( string s ) { // NB: Only BCD+/ASCII6/ASCII(Eng)/ are now supported. // TODO implement further SaHpiTextBufferT tb = new SaHpiTextBufferT(); tb.DataType = HpiConst.SAHPI_TL_TYPE_TEXT; tb.Language = HpiConst.SAHPI_LANG_ENGLISH; tb.DataLength = 0; tb.Data = new byte[HpiConst.SAHPI_MAX_TEXT_BUFFER_LENGTH]; byte[] encoded = ascii.GetBytes( s ); tb.DataLength = Math.Min( encoded.Length, HpiConst.SAHPI_MAX_TEXT_BUFFER_LENGTH ); Array.Copy( encoded, tb.Data, tb.DataLength ); return tb; } /********************************************************** * Entity Path Helpers *********************************************************/ public static SaHpiEntityPathT MakeUnspecifiedSaHpiEntityPathT() { SaHpiEntityPathT ep = new SaHpiEntityPathT(); ep.Entry = new SaHpiEntityT[HpiConst.SAHPI_MAX_ENTITY_PATH]; for ( int i = 0; i < HpiConst.SAHPI_MAX_ENTITY_PATH; ++i ) { ep.Entry[i] = new SaHpiEntityT(); ep.Entry[i].EntityType = HpiConst.SAHPI_ENT_UNSPECIFIED; ep.Entry[i].EntityLocation = 0; } return ep; } public static SaHpiEntityPathT MakeRootSaHpiEntityPathT() { SaHpiEntityPathT ep = MakeUnspecifiedSaHpiEntityPathT(); ep.Entry[0].EntityType = HpiConst.SAHPI_ENT_ROOT; ep.Entry[0].EntityLocation = 0; return ep; } public static SaHpiEntityPathT CloneSaHpiEntityPathT( SaHpiEntityPathT ep ) { if ( ep == null ) { return null; } SaHpiEntityPathT ep2 = new SaHpiEntityPathT(); ep2.Entry = new SaHpiEntityT[HpiConst.SAHPI_MAX_ENTITY_PATH]; for ( int i = 0; i < HpiConst.SAHPI_MAX_ENTITY_PATH; ++i ) { ep2.Entry[i] = new SaHpiEntityT(); ep2.Entry[i].EntityType = ep.Entry[i].EntityType; ep2.Entry[i].EntityLocation = ep.Entry[i].EntityLocation; } return ep2; } private static int GetSaHpiEntityPathLength( SaHpiEntityPathT ep ) { int i; for ( i = 0; i < HpiConst.SAHPI_MAX_ENTITY_PATH; ++i ) { if ( ( ep.Entry[i].EntityType == HpiConst.SAHPI_ENT_ROOT ) ) { if ( ep.Entry[i].EntityLocation == 0 ) { break; } } } return i; } public static string FromSaHpiEntityPathT( SaHpiEntityPathT ep ) { StringBuilder b = new StringBuilder(); int l = GetSaHpiEntityPathLength( ep ); for ( int i = ( l - 1 ); i >= 0; --i ) { b.AppendFormat( "{{{0},{1}}}", FromSaHpiEntityTypeT( ep.Entry[i].EntityType ), ep.Entry[i].EntityLocation ); } return b.ToString(); } public static SaHpiEntityPathT ToSaHpiEntityPathT( string s ) { SaHpiEntityPathT ep = MakeRootSaHpiEntityPathT(); if ( s.Length == 0 ) { return ep; } if ( s.IndexOf( '{' ) != 0 ) { throw new FormatException(); } int i = 0; string[] parts = s.Substring( 1 ).Split( new Char[] { '{' } ); Array.Reverse( parts ); foreach ( string part in parts ) { if ( !part.EndsWith( "}" ) ) { throw new FormatException(); } string[] et_el = part.Substring( 0, part.Length - 1 ).Split( new Char[] { ',' } ); if ( et_el.Length != 2 ) { throw new FormatException(); } ep.Entry[i].EntityType = ToSaHpiEntityTypeT( et_el[0] ); try { ep.Entry[i].EntityLocation = UInt32.Parse( et_el[1] ); } catch ( Exception ) { throw new FormatException(); } ++i; if ( i == HpiConst.SAHPI_MAX_ENTITY_PATH ) { break; } } if ( i < HpiConst.SAHPI_MAX_ENTITY_PATH ) { ep.Entry[i].EntityType = HpiConst.SAHPI_ENT_ROOT; ep.Entry[i].EntityLocation = 0; } return ep; } }; }; // namespace openhpi }; // namespace org openhpi-3.6.1/baselibs/csharp/openhpi_baselib/HpiSession.cs0000644000175100017510000000470112575647300022770 0ustar mohanmohan/* -*- c# -*- * * Copyright (C) 2012, Pigeon Point Systems * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ using System; using System.Collections.Generic; using System.Threading; namespace org { namespace openhpi { internal class HpiSession { private static long cnt = 0; private long local_sid; private long remote_sid; private HpiDomain domain; private LinkedList marshals; public HpiSession( HpiDomain domain ) { // TODO investigate overflow issue this.local_sid = Interlocked.Increment( ref cnt ); this.remote_sid = 0; this.domain = new HpiDomain( domain ); this.marshals = new LinkedList(); } public void Close() { lock ( marshals ) { while( marshals.Count > 0 ) { OhpiMarshal m = marshals.First.Value; marshals.RemoveFirst(); m.Close(); } } } public long GetLocalSid() { return local_sid; } public long GetRemoteSid() { return remote_sid; } public void SetRemoteSid( long remote_sid ) { this.remote_sid = remote_sid; } public long GetRemoteDid() { return domain.GetRemoteDid(); } public OhpiMarshal GetMarshal() { OhpiMarshal m; lock ( marshals ) { if ( marshals.Count > 0 ) { m = marshals.First.Value; marshals.RemoveFirst(); } else { m = new OhpiMarshal(); bool rc = m.Open( domain.GetRemoteHost(), domain.GetRemotePort() ); if ( !rc ) { m = null; } } if ( m != null ) { m.Reset(); } } return m; } public void PutMarshal( OhpiMarshal m ) { m.Reset(); lock ( marshals ) { marshals.AddFirst( m ); } } }; }; // namespace openhpi }; // namespace org openhpi-3.6.1/baselibs/csharp/openhpi_baselib/HpiException.cs0000644000175100017510000000132612575647300023303 0ustar mohanmohan/* -*- c# -*- * * Copyright (C) 2012, Pigeon Point Systems * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ using System; namespace org { namespace openhpi { public class HpiException : Exception { public HpiException( string message ) : base( message ) { // empty } }; }; // namespace openhpi }; // namespace org openhpi-3.6.1/baselibs/csharp/openhpi_baselib/HpiDomain.cs0000644000175100017510000000367212575647300022562 0ustar mohanmohan/* -*- c# -*- * * Copyright (C) 2012, Pigeon Point Systems * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ using System; namespace org { namespace openhpi { internal class HpiDomain { private long local_did; private long remote_did; private string remote_host; private int remote_port; private SaHpiEntityPathT entity_root; public HpiDomain( long local_did, string remote_host, int remote_port, SaHpiEntityPathT entity_root ) { this.local_did = local_did; this.remote_did = HpiConst.SAHPI_UNSPECIFIED_DOMAIN_ID; this.remote_host = remote_host; this.remote_port = remote_port; this.entity_root = entity_root; } public HpiDomain( HpiDomain other ) { this.local_did = other.local_did; this.remote_did = other.remote_did; this.remote_host = other.remote_host; this.remote_port = other.remote_port; this.entity_root = other.entity_root; } public long GetLocalDid() { return local_did; } public void SetLocalDid( long local_did ) { this.local_did = local_did; } public long GetRemoteDid() { return remote_did; } public string GetRemoteHost() { return remote_host; } public int GetRemotePort() { return remote_port; } public SaHpiEntityPathT GetEntityRoot() { return entity_root; } }; }; // namespace openhpi }; // namespace org openhpi-3.6.1/baselibs/csharp/openhpi_baselib/HpiCore.cs0000644000175100017510000001265412575647300022243 0ustar mohanmohan/* -*- c# -*- * * Copyright (C) 2012, Pigeon Point Systems * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ using System; using System.Collections.Generic; namespace org { namespace openhpi { internal static class HpiCore { private static Dictionary domains; private static Dictionary sessions; private static SaHpiEntityPathT my_ep; static HpiCore() { domains = new Dictionary(); sessions = new Dictionary(); my_ep = null; CreateDefaultDomain(); } private static void CreateDefaultDomain() { if ( domains.ContainsKey( HpiConst.SAHPI_UNSPECIFIED_DOMAIN_ID ) ) { return; } string host = Environment.GetEnvironmentVariable( "OPENHPI_DAEMON_HOST" ); if ( host == null ) { host = "localhost"; } int port; string portstr = Environment.GetEnvironmentVariable( "OPENHPI_DAEMON_PORT" ); if ( portstr != null ) { try { port = Convert.ToInt32( portstr ); } catch ( FormatException ) { port = OhpiConst.DEFAULT_PORT; } } else { port = OhpiConst.DEFAULT_PORT; } HpiDomain d = new HpiDomain( HpiConst.SAHPI_UNSPECIFIED_DOMAIN_ID, host, port, HpiUtil.MakeRootSaHpiEntityPathT() ); domains[d.GetLocalDid()] = d; } public static HpiDomain CreateDomain( string host, int port, SaHpiEntityPathT entity_root ) { HpiDomain d = new HpiDomain( HpiConst.SAHPI_UNSPECIFIED_DOMAIN_ID, host, port, entity_root ); bool ok = false; lock ( domains ) { for ( long did = 0; did < long.MaxValue; ++did ) { if ( !domains.ContainsKey( did ) ) { d.SetLocalDid( did ); domains[did] = d; ok = true; break; } } } if ( !ok ) { d = null; } return d; } /********************************************************** * Creates and returns new domain with specified Domain Id * Returns null if overwrite == false and * the specified Domain Id is already in use *********************************************************/ public static HpiDomain CreateDomainById( long did, string host, int port, SaHpiEntityPathT entity_root, bool overwrite ) { HpiDomain d = null; lock ( domains ) { if ( ( !domains.ContainsKey( did ) ) || overwrite ) { d = new HpiDomain( did, host, port, entity_root ); domains[did] = d; } } return d; } public static HpiSession CreateSession( long local_did ) { bool rc; HpiDomain d = null; lock ( domains ) { rc = domains.TryGetValue( local_did, out d ); } if ( !rc ) { return null; } HpiSession s = new HpiSession( d ); lock ( sessions ) { sessions.Add( s.GetLocalSid(), s ); } return s; } public static void RemoveSession( HpiSession s ) { lock ( sessions ) { sessions.Remove( s.GetLocalSid() ); } s.Close(); } public static HpiSession GetSession( long local_sid ) { bool rc; HpiSession s = null; lock ( sessions ) { rc = sessions.TryGetValue( local_sid, out s ); } if ( !rc ) { s = null; } return s; } public static SaHpiEntityPathT GetMyEntity() { return HpiUtil.CloneSaHpiEntityPathT( my_ep ); } public static void SetMyEntity( SaHpiEntityPathT ep ) { my_ep = HpiUtil.CloneSaHpiEntityPathT( ep ); } private static void Dump() { if ( my_ep != null ) { Console.WriteLine( "My Entity: {0}", HpiUtil.FromSaHpiEntityPathT( my_ep ) ); } Console.WriteLine( "Defined Domains:" ); foreach( KeyValuePair kv in domains ) { Console.WriteLine( " id {0} => id {1}, host {2}, port {3}, root {4}", kv.Value.GetLocalDid(), kv.Value.GetRemoteDid(), kv.Value.GetRemoteHost(), kv.Value.GetRemotePort(), HpiUtil.FromSaHpiEntityPathT( kv.Value.GetEntityRoot() ) ); } } }; }; // namespace openhpi }; // namespace org openhpi-3.6.1/baselibs/csharp/openhpi_baselib/OhpiUtil.cs0000644000175100017510000000715212575647300022444 0ustar mohanmohan/* -*- c# -*- * * Copyright (C) 2012, Pigeon Point Systems * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ using System; using System.Collections.Generic; using System.Text; namespace org { namespace openhpi { /********************************************************** * OHPI Utility Functions *********************************************************/ public static partial class OhpiUtil { /********************************************************** * NB: ToXXX throws FormatException if lookup fails *********************************************************/ // For encoding private static ASCIIEncoding ascii = new ASCIIEncoding(); /********************************************************** * Check Functions for OHPI Complex Data Types *********************************************************/ /** * Check function for OHPI struct oHpiHandlerConfigT */ public static bool Check( oHpiHandlerConfigT x ) { if ( x == null ) { return false; } if ( x.items == null ) { return false; } foreach ( var kv in x.items ) { if ( kv.Key == null ) { return false; } if ( kv.Key.Length != HpiConst.SAHPI_MAX_TEXT_BUFFER_LENGTH ) { return false; } if ( kv.Value == null ) { return false; } if ( kv.Value.Length != HpiConst.SAHPI_MAX_TEXT_BUFFER_LENGTH ) { return false; } } return true; } /********************************************************** * oHpiHandlerConfigT Helpers *********************************************************/ public static Dictionary FromoHpiHandlerConfigT( oHpiHandlerConfigT config ) { var d = new Dictionary(); foreach ( var kv in config.items ) { d.Add( ascii.GetString( kv.Key ), ascii.GetString( kv.Value ) ); } return d; } public static oHpiHandlerConfigT TooHpiHandlerConfigT( Dictionary d ) { var config = new oHpiHandlerConfigT(); config.items = new List< KeyValuePair >(); if ( d.Count > 255 ) { throw new FormatException(); } foreach ( var kv in d ) { int len; byte[] encoded; if ( kv.Key == null ) { throw new FormatException(); } var name = new byte[HpiConst.SAHPI_MAX_TEXT_BUFFER_LENGTH]; encoded = ascii.GetBytes( kv.Key ); len = Math.Min( encoded.Length, HpiConst.SAHPI_MAX_TEXT_BUFFER_LENGTH ); Array.Copy( encoded, name, len ); if ( kv.Value == null ) { throw new FormatException(); } var val = new byte[HpiConst.SAHPI_MAX_TEXT_BUFFER_LENGTH]; encoded = ascii.GetBytes( kv.Value ); len = Math.Min( encoded.Length, HpiConst.SAHPI_MAX_TEXT_BUFFER_LENGTH ); Array.Copy( encoded, val, len ); config.items.Add( new KeyValuePair( name, val ) ); } return config; } }; }; // namespace openhpi }; // namespace org openhpi-3.6.1/baselibs/Makefile.am0000644000175100017510000000402712575647300016007 0ustar mohanmohan# # Copyright (c) 2012, Pigeon Point Systems # # Redistribution and use in source and binary forms, with or # without modification, are permitted provided that the following # conditions are met: # # Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the distribution. # # Neither the name of Pigeon Point Systems nor the names # of its contributors may be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, # OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # EXTRA_DIST = $(srcdir)/README \ $(srcdir)/csharp/Makefile \ $(srcdir)/csharp/README \ $(shell find $(srcdir)/csharp -name '*.cs' ) \ $(shell find $(srcdir)/csharp -name '*.rsp' ) \ $(srcdir)/java/build.xml \ $(srcdir)/java/README \ $(srcdir)/java/openhpi_baselib/manifest.txt \ $(shell find $(srcdir)/java -name '*.java' ) \ $(srcdir)/python/MANIFEST.in \ $(srcdir)/python/README \ $(shell find $(srcdir)/python -name '*.py' ) MAINTAINERCLEANFILES = Makefile.in openhpi-3.6.1/baselibs/README0000644000175100017510000000141612575647300014632 0ustar mohanmohan================================================================================ This directory contains baselib implementations for different programming languages. Current language set is: - C# - Java - Python ================================================================================ NB: Those are baselib implementations. Those are not wrappers for libopenhpi.so/libopenhpi.dll. So you don't have to install OpenHPI C libraries and Glib to get them working. ================================================================================ Datatypes and API Representation: SAF HPI is C based API so it has to be represented somehow to fit in another programming language model. The main idea is to keep as much resemblance to original SAF API as possible. openhpi-3.6.1/baselibs/python/0000755000175100017510000000000012575650556015300 5ustar mohanmohanopenhpi-3.6.1/baselibs/python/example_lsres.py0000755000175100017510000000167012575647300020515 0ustar mohanmohan # -*- python -*- # # Copyright (C) 2012, Pigeon Point Systems # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # # Author(s): # Anton Pak # from openhpi_baselib import * ( rv, sid ) = saHpiSessionOpen( SAHPI_UNSPECIFIED_DOMAIN_ID, None ) if rv != SA_OK: print "ERROR: saHpiSessionOpen: %s " % HpiUtil.fromSaErrorT( rv ) exit() for rpte in HpiIterators.Rpt( sid ): tag = HpiUtil.fromSaHpiTextBufferT( rpte.ResourceTag ) print "Resource Id: %d, Tag: %s" % ( rpte.ResourceId, tag ) rv = saHpiSessionClose( sid ) if rv != SA_OK: print "ERROR: saHpiSessionClose: %s " % HpiUtil.fromSaErrorT( rv ) openhpi-3.6.1/baselibs/python/example_handlers.py0000755000175100017510000000503312575647300021162 0ustar mohanmohan # -*- python -*- # # Copyright (C) 2012, Pigeon Point Systems # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # # Author(s): # Anton Pak # from openhpi_baselib import * ( rv, sid ) = saHpiSessionOpen( SAHPI_UNSPECIFIED_DOMAIN_ID, None ) if rv != SA_OK: print "ERROR: saHpiSessionOpen: %s " % HpiUtil.fromSaErrorT( rv ) exit() # List all handlers last_hid = SAHPI_LAST_ENTRY for hid in OhpiIterators.HandlerIds( sid ): last_hid = hid print "Handler %d" % hid ( rv, hinfo, hconf ) = oHpiHandlerInfo( sid, hid ) if rv != SA_OK: print "ERROR: oHpiHandlerInfo: %s " % HpiUtil.fromSaErrorT( rv ) continue print " Info" print " id %d" % hinfo.id print " name %s" % hinfo.plugin_name print " entity_root %s" % HpiUtil.fromSaHpiEntityPathT( hinfo.entity_root ) print " load_failed %d" % hinfo.load_failed d = OhpiUtil.fromoHpiHandlerConfigT( hconf ) print " Config" print "\n".join( [ " %s = %s" % ( name, value ) for ( name, value ) in d.iteritems() ] ) # Retry last handler if last_hid != SAHPI_LAST_ENTRY: print "Re-trying last handler: %d" % last_hid rv = oHpiHandlerRetry( sid, last_hid ) if rv != SA_OK: print "ERROR: oHpiHandlerRetry: %s " % HpiUtil.fromSaErrorT( rv ) # Destroy last handler if last_hid != SAHPI_LAST_ENTRY: print "Destroying last handler: %d" % last_hid rv = oHpiHandlerDestroy( sid, last_hid ) if rv != SA_OK: print "ERROR: oHpiHandlerDestroy: %s " % HpiUtil.fromSaErrorT( rv ) # Look for handler providing specified resource rid = 120 ( rv, hid ) = oHpiHandlerFind( sid, rid ) if rv != SA_OK: print "ERROR: oHpiHandlerFind: %s " % HpiUtil.fromSaErrorT( rv ) if hid is not None: print "Resource %d is provided by handler %d" % ( rid, hid ) # Create new instance of test_agent plugin print "Creating new handler" d = { "plugin" : "libtest_agent", "port" : "9999" } hconf = OhpiUtil.tooHpiHandlerConfigT( d ) ( rv, hid ) = oHpiHandlerCreate( sid, hconf ) if rv == SA_OK: print "Created handler %d" % hid else: print "ERROR: oHpiHandlerCreate: %s " % HpiUtil.fromSaErrorT( rv ) rv = saHpiSessionClose( sid ) if rv != SA_OK: print "ERROR: saHpiSessionClose: %s " % HpiUtil.fromSaErrorT( rv ) openhpi-3.6.1/baselibs/python/setup.py0000644000175100017510000000164112575647300017005 0ustar mohanmohan # -*- python -*- # # Copyright (C) 2012, Pigeon Point Systems # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # # Author(s): # Anton Pak # from distutils.core import setup from openhpi_baselib import OhpiVersion setup( name = "openhpi_baselib", version = ".".join( map( str, OhpiVersion.__version_info__ ) ), description = "OpenHPI Base Library For Python", author = "Anton Pak", author_email = "anton.pak@pigeonpoint.com", url = "http://openhpi.org", license = "BSD", packages = [ "openhpi_baselib" ] ) openhpi-3.6.1/baselibs/python/README0000644000175100017510000001150212575647300016150 0ustar mohanmohan================================================================================ This is Python implementation of OpenHPI baselib. The implementation has been tested with CPython 2.5/2.6/2.7 and Iron Python 2.7. ================================================================================ Build and Install Instructions: - For installation run "python setup.py install". ================================================================================ Usage Example: See example.py as an example of using the Python OpenHPI baselib. See example_lsres.py and example_ent.py as examples of using iteration utility functions. See example_handlers.py as an example of using the oHpiHandler*() API. Default domain address is "localhost" or OPENHPI_DAEMON_HOST env. var. value. Default domain address is 4743 or OPENHPI_DAEMON_PORT env. var. value. ================================================================================ Datatypes and API Representation: All SAF HPI integer data types: - SaHpiBoolT, SaHpiUint8(16,32,64)T, SaHpiInt8(16,32,64)T, enum types are mapped to Python integer type. One exception: arrays of SaHpiUint8T are mapped to Python string (zero padded to full defined capacity). Every SAF HPI struct or union is mapped to Python class. The class name is the same as for the corresponding SAF HPI struct or union. The class contais only public fields with the same names as the corresponding SAF HPI struct or union fields have. SAF HPI constants are defined in the HpiDataTypes submodule. OpenHPI-specific constants are defined in the OhpiDataTypes submodule. SAF HPI API are defined in the Hpi submodule. OpenHPI API are defined in the OHpi submodule. Every API returns result tuple. The tuple consists of: - error code - output parts of SAHPI_INOUT parameters - SAHPI_OUT and SAHPI_OUTNN parameters. The error code is the first component of the tuple. The rest parameters go in the same order they go in original SAF HPI API. API parameters are mapped as the following: - SAHPI_IN parameter is mapped to the ordinary Python function parameter. - SAHPI_INOUT parameter is splitted: -- The input part is mapped to the ordinary Python function parameter. -- The output part is returned in result tuple. - SAHPI_OUT and SAHPI_OUTNN parameters are returned in result tuple. Example: SaErrorT SAHPI_API saHpiGetIdByEntityPath ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiEntityPathT EntityPath, SAHPI_IN SaHpiRdrTypeT InstrumentType, SAHPI_INOUT SaHpiUint32T *InstanceId, SAHPI_OUT SaHpiResourceIdT *ResourceId, SAHPI_OUT SaHpiInstrumentIdT *InstrumentId, SAHPI_OUT SaHpiUint32T *RptUpdateCount ); is represented as def saHpiGetIdByEntityPath( SessionId, EntityPath, InstrumentType, InstanceId ): and the function returns ( ErrorCode, InstanceId, ResourceId, InstrumentId, RptUpdateCount ) tuple. ================================================================================ Utilities: HpiUtil class provides the following utility functions: - Set of functions for checking validity of an object of a complex HPI data type X (representation of SAF HPI struct X): -- public static bool checkX( x ) - (for example checkSaHpiTextBufferT) --- The validation checks are: ---- x is not None ---- Any member of x that is of a complex data types is valid ---- If a member of x is a SaHpiUint8T[] array then the array length is valid. - Set of functions for checking validity of an object of a complex HPI data type X (representation of SAF HPI union X): -- public static bool checkX( x, mod ) - (for example checkSaHpiSensorReadingUnionT) ---- x is not None ---- A member of x that matches modifier mod and is of a complex data types is valid ---- If a member of x that matches modifier mod is a SaHpiUint8T[] array then the array length is valid. - For string <-> integer HPI Data Type X conversion: -- def fromX( x ) - (for example FromSaHpiEventCategoryT) -- def toX( str ) - (for example ToSaHpiEventCategoryT) - For string <-> complex HPI Data Type conversion: -- def fromSaHpiTextBufferT( tb ) -- def toSaHpiTextBufferT( str ) -- def fromSaHpiEntityPathT( ep ) -- def toSaHpiEntityPathT( str ) - For making unspecified, empty entity path and for entity path cloning: - def makeUnspecifiedSaHpiEntityPathT() - def makeRootSaHpiEntityPathT() - def cloneSaHpiEntityPathT( ep ) ================================================================================ Current Limitations: - Only oHpiVersionGet(), oHpiDomainAdd() and oHpiHandler*() OpenHPI API are supported - openhpiclient.conf is not supported ================================================================================ TODO List: - Implemented openhpiclient.conf support - Implement the rest of OpenHPI API - Domain ID translation for SAF HPI API - Entity root translation for SAF HPI API - XTCA entity types in HpiUtils openhpi-3.6.1/baselibs/python/MANIFEST.in0000644000175100017510000000010012575647300017016 0ustar mohanmohaninclude README include example.py include openhpi_baselib/*.py openhpi-3.6.1/baselibs/python/example_ent.py0000755000175100017510000000332512575647300020152 0ustar mohanmohan # -*- python -*- # # Copyright (C) 2012, Pigeon Point Systems # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # # Author(s): # Anton Pak # import sys from openhpi_baselib import * if len( sys.argv ) != 2: print "Usage: %s " % sys.argv[0] exit() try: parent = HpiUtil.toSaHpiEntityPathT( sys.argv[1] ) except ValueError: print "Invalid entity path: %s" % sys.argv[1] exit() ( rv, sid ) = saHpiSessionOpen( SAHPI_UNSPECIFIED_DOMAIN_ID, None ) if rv != SA_OK: print "ERROR: saHpiSessionOpen: %s " % HpiUtil.fromSaErrorT( rv ) exit() print "Entity %s" % HpiUtil.fromSaHpiEntityPathT( parent ) for child in HpiIterators.ChildEntities( sid, parent ): print " Child Entity %s" % HpiUtil.fromSaHpiEntityPathT( child ) for rid in HpiIterators.EntityResourceIds( sid, parent ): print " Resource %d" % rid for rdrtype in [ SAHPI_CTRL_RDR, SAHPI_SENSOR_RDR, SAHPI_INVENTORY_RDR, SAHPI_WATCHDOG_RDR, SAHPI_ANNUNCIATOR_RDR, SAHPI_DIMI_RDR, SAHPI_FUMI_RDR ]: for ( rid, instrid ) in HpiIterators.EntityInstrumentIds( sid, parent, rdrtype ): print " Resource %d Instrument %d (%s)" % ( rid, instrid, HpiUtil.fromSaHpiRdrTypeT( rdrtype ) ) rv = saHpiSessionClose( sid ) if rv != SA_OK: print "ERROR: saHpiSessionClose: %s " % HpiUtil.fromSaErrorT( rv ) openhpi-3.6.1/baselibs/python/openhpi_baselib/0000755000175100017510000000000012575650556020423 5ustar mohanmohanopenhpi-3.6.1/baselibs/python/openhpi_baselib/HpiDataTypesGen.py0000644000175100017510000020131312575647300023757 0ustar mohanmohan # -*- python -*- # # Copyright (C) 2012, Pigeon Point Systems # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # # Author(s): # Anton Pak # #********************************************************** # HPI Data Types (auto-generated) #********************************************************** #********************************************************** # HPI Constants #********************************************************** SAHPI_TRUE = 1L SAHPI_FALSE = 0L SAHPI_MANUFACTURER_ID_UNSPECIFIED = 0L SAHPI_INTERFACE_VERSION = 131842L SA_OK = 0L SA_HPI_ERR_BASE = -1000L SA_ERR_HPI_ERROR = -1001L SA_ERR_HPI_UNSUPPORTED_API = -1002L SA_ERR_HPI_BUSY = -1003L SA_ERR_HPI_INTERNAL_ERROR = -1004L SA_ERR_HPI_INVALID_CMD = -1005L SA_ERR_HPI_TIMEOUT = -1006L SA_ERR_HPI_OUT_OF_SPACE = -1007L SA_ERR_HPI_OUT_OF_MEMORY = -1008L SA_ERR_HPI_INVALID_PARAMS = -1009L SA_ERR_HPI_INVALID_DATA = -1010L SA_ERR_HPI_NOT_PRESENT = -1011L SA_ERR_HPI_NO_RESPONSE = -1012L SA_ERR_HPI_DUPLICATE = -1013L SA_ERR_HPI_INVALID_SESSION = -1014L SA_ERR_HPI_INVALID_DOMAIN = -1015L SA_ERR_HPI_INVALID_RESOURCE = -1016L SA_ERR_HPI_INVALID_REQUEST = -1017L SA_ERR_HPI_ENTITY_NOT_PRESENT = -1018L SA_ERR_HPI_READ_ONLY = -1019L SA_ERR_HPI_CAPABILITY = -1020L SA_ERR_HPI_UNKNOWN = -1021L SA_ERR_HPI_INVALID_STATE = -1022L SA_ERR_HPI_UNSUPPORTED_PARAMS = -1023L SAHPI_UNSPECIFIED_DOMAIN_ID = 4294967295L SAHPI_UNSPECIFIED_RESOURCE_ID = 4294967295L SAHPI_FIRST_ENTRY = 0L SAHPI_LAST_ENTRY = 4294967295L SAHPI_ENTRY_UNSPECIFIED = 0L SAHPI_TIME_UNSPECIFIED = -9223372036854775808L SAHPI_TIME_MAX_RELATIVE = 864691128455135232L SAHPI_TIMEOUT_IMMEDIATE = 0L SAHPI_TIMEOUT_BLOCK = -1L SAHPI_MAX_TEXT_BUFFER_LENGTH = 255 SAHPI_ENT_IPMI_GROUP = 0L SAHPI_ENT_SAFHPI_GROUP = 65536L SAHPI_ENT_ROOT_VALUE = 65535L SAHPI_MAX_ENTITY_PATH = 16 SAHPI_EC_UNSPECIFIED = 0L SAHPI_EC_THRESHOLD = 1L SAHPI_EC_USAGE = 2L SAHPI_EC_STATE = 3L SAHPI_EC_PRED_FAIL = 4L SAHPI_EC_LIMIT = 5L SAHPI_EC_PERFORMANCE = 6L SAHPI_EC_SEVERITY = 7L SAHPI_EC_PRESENCE = 8L SAHPI_EC_ENABLE = 9L SAHPI_EC_AVAILABILITY = 10L SAHPI_EC_REDUNDANCY = 11L SAHPI_EC_SENSOR_SPECIFIC = 126L SAHPI_EC_GENERIC = 127L SAHPI_ES_UNSPECIFIED = 0L SAHPI_ES_LOWER_MINOR = 1L SAHPI_ES_LOWER_MAJOR = 2L SAHPI_ES_LOWER_CRIT = 4L SAHPI_ES_UPPER_MINOR = 8L SAHPI_ES_UPPER_MAJOR = 16L SAHPI_ES_UPPER_CRIT = 32L SAHPI_ES_IDLE = 1L SAHPI_ES_ACTIVE = 2L SAHPI_ES_BUSY = 4L SAHPI_ES_STATE_DEASSERTED = 1L SAHPI_ES_STATE_ASSERTED = 2L SAHPI_ES_PRED_FAILURE_DEASSERT = 1L SAHPI_ES_PRED_FAILURE_ASSERT = 2L SAHPI_ES_LIMIT_NOT_EXCEEDED = 1L SAHPI_ES_LIMIT_EXCEEDED = 2L SAHPI_ES_PERFORMANCE_MET = 1L SAHPI_ES_PERFORMANCE_LAGS = 2L SAHPI_ES_OK = 1L SAHPI_ES_MINOR_FROM_OK = 2L SAHPI_ES_MAJOR_FROM_LESS = 4L SAHPI_ES_CRITICAL_FROM_LESS = 8L SAHPI_ES_MINOR_FROM_MORE = 16L SAHPI_ES_MAJOR_FROM_CRITICAL = 32L SAHPI_ES_CRITICAL = 64L SAHPI_ES_MONITOR = 128L SAHPI_ES_INFORMATIONAL = 256L SAHPI_ES_ABSENT = 1L SAHPI_ES_PRESENT = 2L SAHPI_ES_DISABLED = 1L SAHPI_ES_ENABLED = 2L SAHPI_ES_RUNNING = 1L SAHPI_ES_TEST = 2L SAHPI_ES_POWER_OFF = 4L SAHPI_ES_ON_LINE = 8L SAHPI_ES_OFF_LINE = 16L SAHPI_ES_OFF_DUTY = 32L SAHPI_ES_DEGRADED = 64L SAHPI_ES_POWER_SAVE = 128L SAHPI_ES_INSTALL_ERROR = 256L SAHPI_ES_FULLY_REDUNDANT = 1L SAHPI_ES_REDUNDANCY_LOST = 2L SAHPI_ES_REDUNDANCY_DEGRADED = 4L SAHPI_ES_REDUNDANCY_LOST_SUFFICIENT_RESOURCES = 8L SAHPI_ES_NON_REDUNDANT_SUFFICIENT_RESOURCES = 16L SAHPI_ES_NON_REDUNDANT_INSUFFICIENT_RESOURCES = 32L SAHPI_ES_REDUNDANCY_DEGRADED_FROM_FULL = 64L SAHPI_ES_REDUNDANCY_DEGRADED_FROM_NON = 128L SAHPI_ES_STATE_00 = 1L SAHPI_ES_STATE_01 = 2L SAHPI_ES_STATE_02 = 4L SAHPI_ES_STATE_03 = 8L SAHPI_ES_STATE_04 = 16L SAHPI_ES_STATE_05 = 32L SAHPI_ES_STATE_06 = 64L SAHPI_ES_STATE_07 = 128L SAHPI_ES_STATE_08 = 256L SAHPI_ES_STATE_09 = 512L SAHPI_ES_STATE_10 = 1024L SAHPI_ES_STATE_11 = 2048L SAHPI_ES_STATE_12 = 4096L SAHPI_ES_STATE_13 = 8192L SAHPI_ES_STATE_14 = 16384L SAHPI_STANDARD_SENSOR_MIN = 256L SAHPI_STANDARD_SENSOR_MAX = 511L SAHPI_SENSOR_TYPE_SAFHPI_GROUP = 65536L SAHPI_SENSOR_BUFFER_LENGTH = 32 SAHPI_ALL_EVENT_STATES = 65535L SAHPI_SRF_MIN = 16L SAHPI_SRF_MAX = 8L SAHPI_SRF_NORMAL_MIN = 4L SAHPI_SRF_NORMAL_MAX = 2L SAHPI_SRF_NOMINAL = 1L SAHPI_STM_LOW_MINOR = 1L SAHPI_STM_LOW_MAJOR = 2L SAHPI_STM_LOW_CRIT = 4L SAHPI_STM_UP_MINOR = 8L SAHPI_STM_UP_MAJOR = 16L SAHPI_STM_UP_CRIT = 32L SAHPI_STM_UP_HYSTERESIS = 64L SAHPI_STM_LOW_HYSTERESIS = 128L SAHPI_DEFAGSENS_OPER = 256L SAHPI_DEFAGSENS_PWR = 257L SAHPI_DEFAGSENS_TEMP = 258L SAHPI_DEFAGSENS_MIN = 256L SAHPI_DEFAGSENS_MAX = 271L SAHPI_CTRL_MAX_STREAM_LENGTH = 4 SAHPI_TLN_ALL_LINES = 0L SAHPI_CTRL_MAX_OEM_BODY_LENGTH = 255 SAHPI_CTRL_OEM_CONFIG_LENGTH = 10 SAHPI_DEFAULT_INVENTORY_ID = 0L SAHPI_DEFAULT_WATCHDOG_NUM = 0L SAHPI_WATCHDOG_EXP_BIOS_FRB2 = 2L SAHPI_WATCHDOG_EXP_BIOS_POST = 4L SAHPI_WATCHDOG_EXP_OS_LOAD = 8L SAHPI_WATCHDOG_EXP_SMS_OS = 16L SAHPI_WATCHDOG_EXP_OEM = 32L SAHPI_DIMITEST_MAX_PARAMETERS = 10 SAHPI_DIMITEST_PARAM_NAME_LEN = 20 SAHPI_DIMITEST_CAPABILITY_NO_CAPABILITY = 0L SAHPI_DIMITEST_CAPABILITY_RESULTSOUTPUT = 1L SAHPI_DIMITEST_CAPABILITY_SERVICEMODE = 2L SAHPI_DIMITEST_CAPABILITY_LOOPCOUNT = 4L SAHPI_DIMITEST_CAPABILITY_LOOPTIME = 8L SAHPI_DIMITEST_CAPABILITY_LOGGING = 16L SAHPI_DIMITEST_CAPABILITY_TESTCANCEL = 32L SAHPI_DIMITEST_CAPAB_RES_FINALONLY = 0L SAHPI_DIMITEST_CAPAB_RES_ONDEMAND = 1L SAHPI_DIMITEST_CAPAB_RES_ASYNC = 2L SAHPI_DIMITEST_MAX_ENTITIESIMPACTED = 5 SAHPI_FUMI_MAX_OEM_BODY_LENGTH = 255 SAHPI_FUMI_MAX_ENTITIES_IMPACTED = 5 SAHPI_FUMI_NO_MAIN_PERSISTENT_COPY = 1L SAHPI_FUMI_PROT_TFTP = 1L SAHPI_FUMI_PROT_FTP = 2L SAHPI_FUMI_PROT_HTTP = 4L SAHPI_FUMI_PROT_LDAP = 8L SAHPI_FUMI_PROT_LOCAL = 16L SAHPI_FUMI_PROT_NFS = 32L SAHPI_FUMI_PROT_DBACCESS = 64L SAHPI_FUMI_CAP_ROLLBACK = 1L SAHPI_FUMI_CAP_BANKCOPY = 2L SAHPI_FUMI_CAP_BANKREORDER = 4L SAHPI_FUMI_CAP_BACKUP = 8L SAHPI_FUMI_CAP_TARGET_VERIFY = 16L SAHPI_FUMI_CAP_TARGET_VERIFY_MAIN = 32L SAHPI_FUMI_CAP_COMPONENTS = 64L SAHPI_FUMI_CAP_AUTOROLLBACK = 128L SAHPI_FUMI_CAP_AUTOROLLBACK_CAN_BE_DISABLED = 256L SAHPI_FUMI_CAP_MAIN_NOT_PERSISTENT = 512L SAHPI_SOD_TRIGGER_READING = 1L SAHPI_SOD_TRIGGER_THRESHOLD = 2L SAHPI_SOD_OEM = 4L SAHPI_SOD_PREVIOUS_STATE = 8L SAHPI_SOD_CURRENT_STATE = 16L SAHPI_SOD_SENSOR_SPECIFIC = 32L SAHPI_SEOD_CURRENT_STATE = 16L SAHPI_SEOD_ALARM_STATES = 64L SAHPI_EVT_QUEUE_OVERFLOW = 1L SA_HPI_MAX_NAME_LENGTH = 256 SAHPI_LOAD_ID_DEFAULT = 0L SAHPI_LOAD_ID_BYNAME = 4294967295L SAHPI_GUID_LENGTH = 16 SAHPI_CAPABILITY_RESOURCE = 1073741824L SAHPI_CAPABILITY_FUMI = 65536L SAHPI_CAPABILITY_EVT_DEASSERTS = 32768L SAHPI_CAPABILITY_DIMI = 16384L SAHPI_CAPABILITY_AGGREGATE_STATUS = 8192L SAHPI_CAPABILITY_CONFIGURATION = 4096L SAHPI_CAPABILITY_MANAGED_HOTSWAP = 2048L SAHPI_CAPABILITY_WATCHDOG = 1024L SAHPI_CAPABILITY_CONTROL = 512L SAHPI_CAPABILITY_FRU = 256L SAHPI_CAPABILITY_LOAD_ID = 128L SAHPI_CAPABILITY_ANNUNCIATOR = 64L SAHPI_CAPABILITY_POWER = 32L SAHPI_CAPABILITY_RESET = 16L SAHPI_CAPABILITY_INVENTORY_DATA = 8L SAHPI_CAPABILITY_EVENT_LOG = 4L SAHPI_CAPABILITY_RDR = 2L SAHPI_CAPABILITY_SENSOR = 1L SAHPI_HS_CAPABILITY_AUTOEXTRACT_READ_ONLY = 2147483648L SAHPI_HS_CAPABILITY_INDICATOR_SUPPORTED = 1073741824L SAHPI_HS_CAPABILITY_AUTOINSERT_IMMEDIATE = 536870912L SAHPI_DOMAIN_CAP_AUTOINSERT_READ_ONLY = 1L SAHPI_EVTLOG_CAPABILITY_ENTRY_ADD = 1L SAHPI_EVTLOG_CAPABILITY_CLEAR = 2L SAHPI_EVTLOG_CAPABILITY_TIME_SET = 4L SAHPI_EVTLOG_CAPABILITY_STATE_SET = 8L SAHPI_EVTLOG_CAPABILITY_OVERFLOW_RESET = 16L SAHPI_OLDEST_ENTRY = 0L SAHPI_NEWEST_ENTRY = 4294967295L SAHPI_NO_MORE_ENTRIES = 4294967294L ATCAHPI_PICMG_MID = 12634L ATCAHPI_BLINK_COLOR_LED = 128L ATCAHPI_LED_WHITE = 64L ATCAHPI_LED_ORANGE = 32L ATCAHPI_LED_AMBER = 16L ATCAHPI_LED_GREEN = 8L ATCAHPI_LED_RED = 4L ATCAHPI_LED_BLUE = 2L ATCAHPI_CTRL_NUM_BLUE_LED = 0L ATCAHPI_CTRL_NUM_LED1 = 1L ATCAHPI_CTRL_NUM_LED2 = 2L ATCAHPI_CTRL_NUM_LED3 = 3L ATCAHPI_CTRL_NUM_APP_LED = 4L ATCAHPI_RESOURCE_AGGREGATE_LED = 255L ATCAHPI_ENT_POWER_ENTRY_MODULE_SLOT = 145L ATCAHPI_ENT_SHELF_FRU_DEVICE_SLOT = 146L ATCAHPI_ENT_SHELF_MANAGER_SLOT = 147L ATCAHPI_ENT_FAN_TRAY_SLOT = 148L ATCAHPI_ENT_FAN_FILTER_TRAY_SLOT = 149L ATCAHPI_ENT_ALARM_SLOT = 150L ATCAHPI_ENT_AMC_SLOT = 151L ATCAHPI_ENT_PMC_SLOT = 152L ATCAHPI_ENT_RTM_SLOT = 153L ATCAHPI_ENT_PICMG_FRONT_BLADE = 65558L ATCAHPI_ENT_SHELF_FRU_DEVICE = 65559L ATCAHPI_ENT_FILTRATION_UNIT = 65560L ATCAHPI_ENT_AMC = 65561L ATCAHPI_SENSOR_NUM_SHELF_INFO_VALID = 4096L ATCAHPI_CTRL_NUM_SHELF_ADDRESS = 4096L ATCAHPI_CTRL_NUM_SHELF_IP_ADDRESS = 4097L ATCAHPI_CTRL_NUM_SHELF_STATUS = 4098L ATCAHPI_SENSOR_NUM_PWRONSEQ_COMMIT_STATUS = 4864L ATCAHPI_CTRL_NUM_FRU_POWER_ON_SEQUENCE_COMMIT = 4864L ATCAHPI_CTRL_NUM_FRU_POWER_ON_SEQUENCE = 4865L ATCAHPI_CS_CPS_PWR_ON = 1L ATCAHPI_CS_CPS_PWR_OVERLOAD = 2L ATCAHPI_CS_CPS_INTERLOCK = 4L ATCAHPI_CS_CPS_PWR_FAULT = 8L ATCAHPI_CS_CPS__PWR_CTRL_FAULT = 16L ATCAHPI_CS_CPS_PWR_RESTORE_PWR_UP_PREV = 32L ATCAHPI_CS_CPS_PWR_RESTORE_PWR_UP = 64L ATCAHPI_CS_CPS_PWR_RESTORE_UNKNOWN = 96L ATCAHPI_CS_LPEVT_AC_FAILED = 1L ATCAHPI_CS_LPEVT_PWR_OVERLOAD = 2L ATCAHPI_CS_LPEVT_PWR_INTERLOCK = 4L ATCAHPI_CS_LPEVT_PWR_FAULT = 8L ATCAHPI_CS_LPEVT_PWRON_IPMI = 16L ATCAHPI_CS_MISC_CS_INTRUSION_ACTIVE = 1L ATCAHPI_CS_MISC_CS_FP_LOCKOUT_ACTIVE = 2L ATCAHPI_CS_MISC_CS_DRIVE_FAULT = 4L ATCAHPI_CS_MISC_CS_COOLING_FAULT = 8L ATCAHPI_CS_FP_BUTTON_PWR_OFF = 1L ATCAHPI_CS_FP_BUTTON_RESET_OFF = 2L ATCAHPI_CS_FP_BUTTON_DIAGINTR_OFF = 4L ATCAHPI_CS_FP_BUTTON_STANDBY_OFF = 8L ATCAHPI_CS_FP_BUTTON_ALLOW_PWR_OFF = 16L ATCAHPI_CS_FP_BUTTON_ALLOW_RESET_OFF = 32L ATCAHPI_CS_FP_BUTTON_ALLOW_DIAGINTR_OFF = 64L ATCAHPI_CS_FP_BUTTON_ALLOW_STANDBY_OFF = 128L ATCAHPI_SENSOR_NUM_SHMGR_REDUNDANCY = 4097L ATCAHPI_SENSOR_NUM_SHMGR_ACTIVE = 4098L ATCAHPI_SENSOR_NUM_SHMGR_STANDBY = 4099L ATCAHPI_CTRL_NUM_SHMGR_FAILOVER = 4112L ATCAHPI_CTRL_NUM_FAILED_RESOURCE_EXTRACT = 4126L ATCAHPI_SENSOR_NUM_SLOT_STATE = 4112L ATCAHPI_SENSOR_NUM_ASSIGNED_PWR = 4113L ATCAHPI_SENSOR_NUM_MAX_PWR = 4114L ATCAHPI_CTRL_NUM_FRU_ACTIVATION = 4128L ATCAHPI_SENSOR_NUM_IPMB0 = 4352L ATCAHPI_CTRL_NUM_DESIRED_PWR = 4144L ATCAHPI_CTRL_NUM_IPMB_A_STATE = 4353L ATCAHPI_CTRL_NUM_IPMB_B_STATE = 4354L ATCAHPI_CTRL_NUM_FRU_CONTROL = 4608L ATCAHPI_CTRL_NUM_FRU_IPMC_RESET = 4609L ATCAHPI_SENSOR_NUM_AMC_PWRONSEQ_COMMIT_STATUS = 5376L ATCAHPI_CTRL_NUM_AMC_POWER_ON_SEQUENCE_COMMIT = 5376L ATCAHPI_CTRL_NUM_AMC_POWER_ON_SEQUENCE = 5377L ATCAHPI_CTRL_NUM_FAN_SPEED = 5120L ATCAHPI_PICMG_CT_CHASSIS_STATUS = 16789850L ATCAHPI_PICMG_CT_ATCA_LED = 33567066L XTCAHPI_SPEC_VERSION = 4228711L XTCAHPI_PICMG_MID = 12634L XTCAHPI_ENT_POWER_SLOT = 145L XTCAHPI_ENT_SHELF_FRU_DEVICE_SLOT = 146L XTCAHPI_ENT_SHELF_MANAGER_SLOT = 147L XTCAHPI_ENT_FAN_TRAY_SLOT = 148L XTCAHPI_ENT_FAN_FILTER_TRAY_SLOT = 149L XTCAHPI_ENT_ALARM_SLOT = 150L XTCAHPI_ENT_AMC_SLOT = 151L XTCAHPI_ENT_PMC_SLOT = 152L XTCAHPI_ENT_RTM_SLOT = 153L XTCAHPI_ENT_CARRIER_MANAGER_SLOT = 154L XTCAHPI_ENT_CARRIER_SLOT = 155L XTCAHPI_ENT_COM_E_SLOT = 156L XTCAHPI_CTRL_NUM_IP_ADDRESS_0 = 4097L XTCAHPI_CTRL_NUM_IP_ADDRESS_1 = 4099L XTCAHPI_CTRL_NUM_POWER_ON_SEQUENCE = 4865L XTCAHPI_CTRL_NUM_POWER_ON_SEQUENCE_COMMIT = 4864L XTCAHPI_SENSOR_NUM_PWRONSEQ_COMMIT_STATUS = 4864L XTCAHPI_ANN_NUM_TELCO_ALARM = 4096L XTCAHPI_SENSOR_NUM_REDUNDANCY = 4097L XTCAHPI_SENSOR_NUM_ACTIVE = 4098L XTCAHPI_SENSOR_NUM_STANDBY = 4099L XTCAHPI_CTRL_NUM_FAILOVER = 4112L XTCAHPI_CTRL_NUM_ACTIVATION = 4128L XTCAHPI_CTRL_NUM_DEACTIVATION = 4129L XTCAHPI_SENSOR_NUM_FRU_INFO_VALID = 4096L XTCAHPI_SENSOR_NUM_ASSIGNED_PWR = 4113L XTCAHPI_SENSOR_NUM_SLOT_ASSIGNED_PWR = 6144L XTCAHPI_IDR_NUM_CONFIG_INFO = 1L XTCAHPI_CTRL_NUM_SHELF_ADDRESS = 4096L XTCAHPI_CTRL_NUM_SHELF_STATUS = 4098L XTCAHPI_CTRL_NUM_SHELF_MANAGER_RMCP_USERNAME = 4177L XTCAHPI_CTRL_NUM_SHELF_MANAGER_RMCP_PASSWORD = 4178L XTCAHPI_CTRL_NUM_IN_SHELF_ACTIVATION = 4192L XTCAHPI_CTRL_NUM_IN_SHELF_DEACTIVATION = 4193L XTCAHPI_CTRL_NUM_DESIRED_PWR = 4144L XTCAHPI_SENSOR_NUM_IPMB0 = 4352L XTCAHPI_CTRL_NUM_IPMB_A_STATE = 4353L XTCAHPI_CTRL_NUM_IPMB_B_STATE = 4354L XTCAHPI_CTRL_NUM_FRU_CONTROL = 4608L XTCAHPI_CTRL_NUM_FRU_IPMC_RESET = 4609L XTCAHPI_CTRL_NUM_BLUE_LED = 0L XTCAHPI_CTRL_NUM_LED1 = 1L XTCAHPI_CTRL_NUM_LED2 = 2L XTCAHPI_CTRL_NUM_LED3 = 3L XTCAHPI_CTRL_NUM_APP_LED = 4L XTCAHPI_RESOURCE_AGGREGATE_LED = 255L XTCAHPI_CTRL_NUM_AMC_POWER_ON_SEQUENCE = 5377L XTCAHPI_CTRL_NUM_AMC_POWER_ON_SEQUENCE_COMMIT = 5376L XTCAHPI_SENSOR_NUM_AMC_PWRONSEQ_COMMIT_STATUS = 5376L XTCAHPI_CTRL_NUM_FAN_SPEED = 5120L XTCAHPI_SENSOR_NUM_HPM1_IPMC_GLOBAL_CAPS = 5888L XTCAHPI_SENSOR_NUM_HPM1_IMAGE_CAPS = 5889L XTCAHPI_SENSOR_NUM_HPM1_ROLLBACK_TIMEOUT = 5890L XTCAHPI_CTRL_NUM_CRITICAL_TELCO_ALARM = 5632L XTCAHPI_CTRL_NUM_MAJOR_TELCO_ALARM = 5633L XTCAHPI_CTRL_NUM_MINOR_TELCO_ALARM = 5634L XTCAHPI_CTRL_NUM_POWER_TELCO_ALARM = 5635L XTCAHPI_CTRL_NUM_TELCO_ALARM_CUTOFF = 5636L XTCAHPI_SENSOR_NUM_TELCO_ALARM_INPUT = 5632L XTCAHPI_INDICATOR_LOC_MINOR_ALARM = 0L XTCAHPI_INDICATOR_LOC_MAJOR_ALARM = 1L XTCAHPI_INDICATOR_LOC_CRITICAL_ALARM = 2L XTCAHPI_INDICATOR_LOC_POWER_ALARM = 3L XTCAHPI_CONFIG_DATA_AREA_SPEC_VERSION = 0L XTCAHPI_CONFIG_DATA_FIELD_LABEL = 0L XTCAHPI_CS_CPS_PWR_ON = 1L XTCAHPI_CS_CPS_PWR_OVERLOAD = 2L XTCAHPI_CS_CPS_INTERLOCK = 4L XTCAHPI_CS_CPS_PWR_FAULT = 8L XTCAHPI_CS_CPS_PWR_CTRL_FAULT = 16L XTCAHPI_CS_CPS_PWR_RESTORE_PWR_UP_PREV = 32L XTCAHPI_CS_CPS_PWR_RESTORE_PWR_UP = 64L XTCAHPI_CS_CPS_PWR_RESTORE_UNKNOWN = 96L XTCAHPI_CS_LPEVT_AC_FAILED = 1L XTCAHPI_CS_LPEVT_PWR_OVERLOAD = 2L XTCAHPI_CS_LPEVT_PWR_INTERLOCK = 4L XTCAHPI_CS_LPEVT_PWR_FAULT = 8L XTCAHPI_CS_LPEVT_PWRON_IPMI = 16L XTCAHPI_CS_MISC_CS_INTRUSION_ACTIVE = 1L XTCAHPI_CS_MISC_CS_FP_LOCKOUT_ACTIVE = 2L XTCAHPI_CS_MISC_CS_DRIVE_FAULT = 4L XTCAHPI_CS_MISC_CS_COOLING_FAULT = 8L XTCAHPI_CS_FP_BUTTON_PWR_OFF = 1L XTCAHPI_CS_FP_BUTTON_RESET_OFF = 2L XTCAHPI_CS_FP_BUTTON_DIAGINTR_OFF = 4L XTCAHPI_CS_FP_BUTTON_STANDBY_OFF = 8L XTCAHPI_CS_FP_BUTTON_ALLOW_PWR_OFF = 16L XTCAHPI_CS_FP_BUTTON_ALLOW_RESET_OFF = 32L XTCAHPI_CS_FP_BUTTON_ALLOW_DIAGINTR_OFF = 64L XTCAHPI_CS_FP_BUTTON_ALLOW_STANDBY_OFF = 128L XTCAHPI_BLINK_COLOR_LED = 128L XTCAHPI_LED_WHITE = 64L XTCAHPI_LED_ORANGE = 32L XTCAHPI_LED_AMBER = 16L XTCAHPI_LED_GREEN = 8L XTCAHPI_LED_RED = 4L XTCAHPI_LED_BLUE = 2L XTCAHPI_IF_FABRIC = 1L XTCAHPI_IF_SYNC_CLOCK = 2L XTCAHPI_IF_BASE = 3L XTCAHPI_IF_UPDATE_CHANNEL = 4L XTCAHPI_IF_METALLIC_TEST = 5L XTCAHPI_IF_RINGING_GENERATOR_BUS = 6L XTCAHPI_CONFIG_DATA_LOC_DEFAULT = 0L XTCAHPI_CONFIG_DATA_LOC_SHELF_ADDRESS = 1L XTCAHPI_CONFIG_DATA_LOC_POWER_ON_SEQUENCE = 2L XTCAHPI_CONFIG_DATA_LOC_CHASSIS_STATUS = 3L XTCAHPI_CONFIG_DATA_LOC_ACTIVATION = 4L XTCAHPI_CONFIG_DATA_LOC_DEACTIVATION = 5L XTCAHPI_CONFIG_DATA_LOC_IN_SHELF_ACTIVATION = 6L XTCAHPI_CONFIG_DATA_LOC_IN_SHELF_DEACTIVATION = 7L XTCAHPI_CONFIG_DATA_LOC_USERNAME = 8L XTCAHPI_CONFIG_DATA_LOC_PASSWORD = 9L XTCAHPI_CONFIG_DATA_LOC_FUMI_GLOBAL_UPGRADE_CAP = 10L XTCAHPI_CONFIG_DATA_LOC_FUMI_UPGRADE_IMAGE_CAP = 11L XTCAHPI_CONFIG_DATA_LOC_FUMI_ROLLBACK_TIMEOUT = 12L SAHPI_LANG_UNDEF = 0L SAHPI_LANG_AFAR = 1L SAHPI_LANG_ABKHAZIAN = 2L SAHPI_LANG_AFRIKAANS = 3L SAHPI_LANG_AMHARIC = 4L SAHPI_LANG_ARABIC = 5L SAHPI_LANG_ASSAMESE = 6L SAHPI_LANG_AYMARA = 7L SAHPI_LANG_AZERBAIJANI = 8L SAHPI_LANG_BASHKIR = 9L SAHPI_LANG_BYELORUSSIAN = 10L SAHPI_LANG_BULGARIAN = 11L SAHPI_LANG_BIHARI = 12L SAHPI_LANG_BISLAMA = 13L SAHPI_LANG_BENGALI = 14L SAHPI_LANG_TIBETAN = 15L SAHPI_LANG_BRETON = 16L SAHPI_LANG_CATALAN = 17L SAHPI_LANG_CORSICAN = 18L SAHPI_LANG_CZECH = 19L SAHPI_LANG_WELSH = 20L SAHPI_LANG_DANISH = 21L SAHPI_LANG_GERMAN = 22L SAHPI_LANG_BHUTANI = 23L SAHPI_LANG_GREEK = 24L SAHPI_LANG_ENGLISH = 25L SAHPI_LANG_ESPERANTO = 26L SAHPI_LANG_SPANISH = 27L SAHPI_LANG_ESTONIAN = 28L SAHPI_LANG_BASQUE = 29L SAHPI_LANG_PERSIAN = 30L SAHPI_LANG_FINNISH = 31L SAHPI_LANG_FIJI = 32L SAHPI_LANG_FAEROESE = 33L SAHPI_LANG_FRENCH = 34L SAHPI_LANG_FRISIAN = 35L SAHPI_LANG_IRISH = 36L SAHPI_LANG_SCOTSGAELIC = 37L SAHPI_LANG_GALICIAN = 38L SAHPI_LANG_GUARANI = 39L SAHPI_LANG_GUJARATI = 40L SAHPI_LANG_HAUSA = 41L SAHPI_LANG_HINDI = 42L SAHPI_LANG_CROATIAN = 43L SAHPI_LANG_HUNGARIAN = 44L SAHPI_LANG_ARMENIAN = 45L SAHPI_LANG_INTERLINGUA = 46L SAHPI_LANG_INTERLINGUE = 47L SAHPI_LANG_INUPIAK = 48L SAHPI_LANG_INDONESIAN = 49L SAHPI_LANG_ICELANDIC = 50L SAHPI_LANG_ITALIAN = 51L SAHPI_LANG_HEBREW = 52L SAHPI_LANG_JAPANESE = 53L SAHPI_LANG_YIDDISH = 54L SAHPI_LANG_JAVANESE = 55L SAHPI_LANG_GEORGIAN = 56L SAHPI_LANG_KAZAKH = 57L SAHPI_LANG_GREENLANDIC = 58L SAHPI_LANG_CAMBODIAN = 59L SAHPI_LANG_KANNADA = 60L SAHPI_LANG_KOREAN = 61L SAHPI_LANG_KASHMIRI = 62L SAHPI_LANG_KURDISH = 63L SAHPI_LANG_KIRGHIZ = 64L SAHPI_LANG_LATIN = 65L SAHPI_LANG_LINGALA = 66L SAHPI_LANG_LAOTHIAN = 67L SAHPI_LANG_LITHUANIAN = 68L SAHPI_LANG_LATVIANLETTISH = 69L SAHPI_LANG_MALAGASY = 70L SAHPI_LANG_MAORI = 71L SAHPI_LANG_MACEDONIAN = 72L SAHPI_LANG_MALAYALAM = 73L SAHPI_LANG_MONGOLIAN = 74L SAHPI_LANG_MOLDAVIAN = 75L SAHPI_LANG_MARATHI = 76L SAHPI_LANG_MALAY = 77L SAHPI_LANG_MALTESE = 78L SAHPI_LANG_BURMESE = 79L SAHPI_LANG_NAURU = 80L SAHPI_LANG_NEPALI = 81L SAHPI_LANG_DUTCH = 82L SAHPI_LANG_NORWEGIAN = 83L SAHPI_LANG_OCCITAN = 84L SAHPI_LANG_AFANOROMO = 85L SAHPI_LANG_ORIYA = 86L SAHPI_LANG_PUNJABI = 87L SAHPI_LANG_POLISH = 88L SAHPI_LANG_PASHTOPUSHTO = 89L SAHPI_LANG_PORTUGUESE = 90L SAHPI_LANG_QUECHUA = 91L SAHPI_LANG_RHAETOROMANCE = 92L SAHPI_LANG_KIRUNDI = 93L SAHPI_LANG_ROMANIAN = 94L SAHPI_LANG_RUSSIAN = 95L SAHPI_LANG_KINYARWANDA = 96L SAHPI_LANG_SANSKRIT = 97L SAHPI_LANG_SINDHI = 98L SAHPI_LANG_SANGRO = 99L SAHPI_LANG_SERBOCROATIAN = 100L SAHPI_LANG_SINGHALESE = 101L SAHPI_LANG_SLOVAK = 102L SAHPI_LANG_SLOVENIAN = 103L SAHPI_LANG_SAMOAN = 104L SAHPI_LANG_SHONA = 105L SAHPI_LANG_SOMALI = 106L SAHPI_LANG_ALBANIAN = 107L SAHPI_LANG_SERBIAN = 108L SAHPI_LANG_SISWATI = 109L SAHPI_LANG_SESOTHO = 110L SAHPI_LANG_SUDANESE = 111L SAHPI_LANG_SWEDISH = 112L SAHPI_LANG_SWAHILI = 113L SAHPI_LANG_TAMIL = 114L SAHPI_LANG_TELUGU = 115L SAHPI_LANG_TAJIK = 116L SAHPI_LANG_THAI = 117L SAHPI_LANG_TIGRINYA = 118L SAHPI_LANG_TURKMEN = 119L SAHPI_LANG_TAGALOG = 120L SAHPI_LANG_SETSWANA = 121L SAHPI_LANG_TONGA = 122L SAHPI_LANG_TURKISH = 123L SAHPI_LANG_TSONGA = 124L SAHPI_LANG_TATAR = 125L SAHPI_LANG_TWI = 126L SAHPI_LANG_UKRAINIAN = 127L SAHPI_LANG_URDU = 128L SAHPI_LANG_UZBEK = 129L SAHPI_LANG_VIETNAMESE = 130L SAHPI_LANG_VOLAPUK = 131L SAHPI_LANG_WOLOF = 132L SAHPI_LANG_XHOSA = 133L SAHPI_LANG_YORUBA = 134L SAHPI_LANG_CHINESE = 135L SAHPI_LANG_ZULU = 136L SAHPI_LANG_MAX_VALID = 136L SAHPI_TL_TYPE_UNICODE = 0L SAHPI_TL_TYPE_BCDPLUS = 1L SAHPI_TL_TYPE_ASCII6 = 2L SAHPI_TL_TYPE_TEXT = 3L SAHPI_TL_TYPE_BINARY = 4L SAHPI_TL_TYPE_MAX_VALID = 4L SAHPI_ENT_UNSPECIFIED = 0L SAHPI_ENT_OTHER = 1L SAHPI_ENT_UNKNOWN = 2L SAHPI_ENT_PROCESSOR = 3L SAHPI_ENT_DISK_BAY = 4L SAHPI_ENT_PERIPHERAL_BAY = 5L SAHPI_ENT_SYS_MGMNT_MODULE = 6L SAHPI_ENT_SYSTEM_BOARD = 7L SAHPI_ENT_MEMORY_MODULE = 8L SAHPI_ENT_PROCESSOR_MODULE = 9L SAHPI_ENT_POWER_SUPPLY = 10L SAHPI_ENT_ADD_IN_CARD = 11L SAHPI_ENT_FRONT_PANEL_BOARD = 12L SAHPI_ENT_BACK_PANEL_BOARD = 13L SAHPI_ENT_POWER_SYSTEM_BOARD = 14L SAHPI_ENT_DRIVE_BACKPLANE = 15L SAHPI_ENT_SYS_EXPANSION_BOARD = 16L SAHPI_ENT_OTHER_SYSTEM_BOARD = 17L SAHPI_ENT_PROCESSOR_BOARD = 18L SAHPI_ENT_POWER_UNIT = 19L SAHPI_ENT_POWER_MODULE = 20L SAHPI_ENT_POWER_MGMNT = 21L SAHPI_ENT_CHASSIS_BACK_PANEL_BOARD = 22L SAHPI_ENT_SYSTEM_CHASSIS = 23L SAHPI_ENT_SUB_CHASSIS = 24L SAHPI_ENT_OTHER_CHASSIS_BOARD = 25L SAHPI_ENT_DISK_DRIVE_BAY = 26L SAHPI_ENT_PERIPHERAL_BAY_2 = 27L SAHPI_ENT_DEVICE_BAY = 28L SAHPI_ENT_COOLING_DEVICE = 29L SAHPI_ENT_COOLING_UNIT = 30L SAHPI_ENT_INTERCONNECT = 31L SAHPI_ENT_MEMORY_DEVICE = 32L SAHPI_ENT_SYS_MGMNT_SOFTWARE = 33L SAHPI_ENT_BIOS = 34L SAHPI_ENT_OPERATING_SYSTEM = 35L SAHPI_ENT_SYSTEM_BUS = 36L SAHPI_ENT_GROUP = 37L SAHPI_ENT_REMOTE = 38L SAHPI_ENT_EXTERNAL_ENVIRONMENT = 39L SAHPI_ENT_BATTERY = 40L SAHPI_ENT_PROCESSING_BLADE = 41L SAHPI_ENT_CONNECTIVITY_SWITCH = 42L SAHPI_ENT_PROCESSOR_MEMORY_MODULE = 43L SAHPI_ENT_IO_MODULE = 44L SAHPI_ENT_PROCESSOR_IO_MODULE = 45L SAHPI_ENT_MC_FIRMWARE = 46L SAHPI_ENT_IPMI_CHANNEL = 47L SAHPI_ENT_PCI_BUS = 48L SAHPI_ENT_PCI_EXPRESS_BUS = 49L SAHPI_ENT_SCSI_BUS = 50L SAHPI_ENT_SATA_BUS = 51L SAHPI_ENT_PROC_FSB = 52L SAHPI_ENT_CLOCK = 53L SAHPI_ENT_SYSTEM_FIRMWARE = 54L SAHPI_ENT_CHASSIS_SPECIFIC = 144L SAHPI_ENT_CHASSIS_SPECIFIC01 = 145L SAHPI_ENT_CHASSIS_SPECIFIC02 = 146L SAHPI_ENT_CHASSIS_SPECIFIC03 = 147L SAHPI_ENT_CHASSIS_SPECIFIC04 = 148L SAHPI_ENT_CHASSIS_SPECIFIC05 = 149L SAHPI_ENT_CHASSIS_SPECIFIC06 = 150L SAHPI_ENT_CHASSIS_SPECIFIC07 = 151L SAHPI_ENT_CHASSIS_SPECIFIC08 = 152L SAHPI_ENT_CHASSIS_SPECIFIC09 = 153L SAHPI_ENT_CHASSIS_SPECIFIC10 = 154L SAHPI_ENT_CHASSIS_SPECIFIC11 = 155L SAHPI_ENT_CHASSIS_SPECIFIC12 = 156L SAHPI_ENT_CHASSIS_SPECIFIC13 = 157L SAHPI_ENT_BOARD_SET_SPECIFIC = 176L SAHPI_ENT_OEM_SYSINT_SPECIFIC = 208L SAHPI_ENT_ROOT = 65535L SAHPI_ENT_RACK = 65536L SAHPI_ENT_SUBRACK = 65537L SAHPI_ENT_COMPACTPCI_CHASSIS = 65538L SAHPI_ENT_ADVANCEDTCA_CHASSIS = 65539L SAHPI_ENT_RACK_MOUNTED_SERVER = 65540L SAHPI_ENT_SYSTEM_BLADE = 65541L SAHPI_ENT_SWITCH = 65542L SAHPI_ENT_SWITCH_BLADE = 65543L SAHPI_ENT_SBC_BLADE = 65544L SAHPI_ENT_IO_BLADE = 65545L SAHPI_ENT_DISK_BLADE = 65546L SAHPI_ENT_DISK_DRIVE = 65547L SAHPI_ENT_FAN = 65548L SAHPI_ENT_POWER_DISTRIBUTION_UNIT = 65549L SAHPI_ENT_SPEC_PROC_BLADE = 65550L SAHPI_ENT_IO_SUBBOARD = 65551L SAHPI_ENT_SBC_SUBBOARD = 65552L SAHPI_ENT_ALARM_MANAGER = 65553L SAHPI_ENT_SHELF_MANAGER = 65554L SAHPI_ENT_DISPLAY_PANEL = 65555L SAHPI_ENT_SUBBOARD_CARRIER_BLADE = 65556L SAHPI_ENT_PHYSICAL_SLOT = 65557L SAHPI_ENT_PICMG_FRONT_BLADE = 65558L SAHPI_ENT_SYSTEM_INVENTORY_DEVICE = 65559L SAHPI_ENT_FILTRATION_UNIT = 65560L SAHPI_ENT_AMC = 65561L SAHPI_ENT_BMC = 65584L SAHPI_ENT_IPMC = 65585L SAHPI_ENT_MMC = 65586L SAHPI_ENT_SHMC = 65587L SAHPI_ENT_CPLD = 65588L SAHPI_ENT_EPLD = 65589L SAHPI_ENT_FPGA = 65590L SAHPI_ENT_DASD = 65591L SAHPI_ENT_NIC = 65592L SAHPI_ENT_DSP = 65593L SAHPI_ENT_UCODE = 65594L SAHPI_ENT_NPU = 65595L SAHPI_ENT_OEM = 65596L SAHPI_ENT_INTERFACE = 65597L SAHPI_ENT_MICROTCA_CHASSIS = 65598L SAHPI_ENT_CARRIER = 65599L SAHPI_ENT_CARRIER_MANAGER = 65600L SAHPI_ENT_CONFIG_DATA = 65601L SAHPI_ENT_INDICATOR = 65602L SAHPI_ENT_MAX_VALID = 65602L SAHPI_TEMPERATURE = 1L SAHPI_VOLTAGE = 2L SAHPI_CURRENT = 3L SAHPI_FAN = 4L SAHPI_PHYSICAL_SECURITY = 5L SAHPI_PLATFORM_VIOLATION = 6L SAHPI_PROCESSOR = 7L SAHPI_POWER_SUPPLY = 8L SAHPI_POWER_UNIT = 9L SAHPI_COOLING_DEVICE = 10L SAHPI_OTHER_UNITS_BASED_SENSOR = 11L SAHPI_MEMORY = 12L SAHPI_DRIVE_SLOT = 13L SAHPI_POST_MEMORY_RESIZE = 14L SAHPI_SYSTEM_FW_PROGRESS = 15L SAHPI_EVENT_LOGGING_DISABLED = 16L SAHPI_RESERVED1 = 17L SAHPI_SYSTEM_EVENT = 18L SAHPI_CRITICAL_INTERRUPT = 19L SAHPI_BUTTON = 20L SAHPI_MODULE_BOARD = 21L SAHPI_MICROCONTROLLER_COPROCESSOR = 22L SAHPI_ADDIN_CARD = 23L SAHPI_CHASSIS = 24L SAHPI_CHIP_SET = 25L SAHPI_OTHER_FRU = 26L SAHPI_CABLE_INTERCONNECT = 27L SAHPI_TERMINATOR = 28L SAHPI_SYSTEM_BOOT_INITIATED = 29L SAHPI_BOOT_ERROR = 30L SAHPI_OS_BOOT = 31L SAHPI_OS_CRITICAL_STOP = 32L SAHPI_SLOT_CONNECTOR = 33L SAHPI_SYSTEM_ACPI_POWER_STATE = 34L SAHPI_RESERVED2 = 35L SAHPI_PLATFORM_ALERT = 36L SAHPI_ENTITY_PRESENCE = 37L SAHPI_MONITOR_ASIC_IC = 38L SAHPI_LAN = 39L SAHPI_MANAGEMENT_SUBSYSTEM_HEALTH = 40L SAHPI_BATTERY = 41L SAHPI_SESSION_AUDIT = 42L SAHPI_VERSION_CHANGE = 43L SAHPI_OPERATIONAL = 160L SAHPI_OEM_SENSOR = 192L SAHPI_COMM_CHANNEL_LINK_STATE = 65537L SAHPI_MANAGEMENT_BUS_STATE = 65538L SAHPI_COMM_CHANNEL_BUS_STATE = 65539L SAHPI_CONFIG_DATA = 65540L SAHPI_POWER_BUDGET = 65541L SAHPI_SENSOR_TYPE_MAX_VALID = 65541L SAHPI_SENSOR_READING_TYPE_INT64 = 0L SAHPI_SENSOR_READING_TYPE_UINT64 = 1L SAHPI_SENSOR_READING_TYPE_FLOAT64 = 2L SAHPI_SENSOR_READING_TYPE_BUFFER = 3L SAHPI_SENSOR_READING_TYPE_MAX_VALID = 3L SAHPI_SENS_ADD_EVENTS_TO_MASKS = 0L SAHPI_SENS_REMOVE_EVENTS_FROM_MASKS = 1L SAHPI_SENS_EVENT_MASK_ACTION_MAX_VALID = 1L SAHPI_SU_UNSPECIFIED = 0L SAHPI_SU_DEGREES_C = 1L SAHPI_SU_DEGREES_F = 2L SAHPI_SU_DEGREES_K = 3L SAHPI_SU_VOLTS = 4L SAHPI_SU_AMPS = 5L SAHPI_SU_WATTS = 6L SAHPI_SU_JOULES = 7L SAHPI_SU_COULOMBS = 8L SAHPI_SU_VA = 9L SAHPI_SU_NITS = 10L SAHPI_SU_LUMEN = 11L SAHPI_SU_LUX = 12L SAHPI_SU_CANDELA = 13L SAHPI_SU_KPA = 14L SAHPI_SU_PSI = 15L SAHPI_SU_NEWTON = 16L SAHPI_SU_CFM = 17L SAHPI_SU_RPM = 18L SAHPI_SU_HZ = 19L SAHPI_SU_MICROSECOND = 20L SAHPI_SU_MILLISECOND = 21L SAHPI_SU_SECOND = 22L SAHPI_SU_MINUTE = 23L SAHPI_SU_HOUR = 24L SAHPI_SU_DAY = 25L SAHPI_SU_WEEK = 26L SAHPI_SU_MIL = 27L SAHPI_SU_INCHES = 28L SAHPI_SU_FEET = 29L SAHPI_SU_CU_IN = 30L SAHPI_SU_CU_FEET = 31L SAHPI_SU_MM = 32L SAHPI_SU_CM = 33L SAHPI_SU_M = 34L SAHPI_SU_CU_CM = 35L SAHPI_SU_CU_M = 36L SAHPI_SU_LITERS = 37L SAHPI_SU_FLUID_OUNCE = 38L SAHPI_SU_RADIANS = 39L SAHPI_SU_STERADIANS = 40L SAHPI_SU_REVOLUTIONS = 41L SAHPI_SU_CYCLES = 42L SAHPI_SU_GRAVITIES = 43L SAHPI_SU_OUNCE = 44L SAHPI_SU_POUND = 45L SAHPI_SU_FT_LB = 46L SAHPI_SU_OZ_IN = 47L SAHPI_SU_GAUSS = 48L SAHPI_SU_GILBERTS = 49L SAHPI_SU_HENRY = 50L SAHPI_SU_MILLIHENRY = 51L SAHPI_SU_FARAD = 52L SAHPI_SU_MICROFARAD = 53L SAHPI_SU_OHMS = 54L SAHPI_SU_SIEMENS = 55L SAHPI_SU_MOLE = 56L SAHPI_SU_BECQUEREL = 57L SAHPI_SU_PPM = 58L SAHPI_SU_RESERVED = 59L SAHPI_SU_DECIBELS = 60L SAHPI_SU_DBA = 61L SAHPI_SU_DBC = 62L SAHPI_SU_GRAY = 63L SAHPI_SU_SIEVERT = 64L SAHPI_SU_COLOR_TEMP_DEG_K = 65L SAHPI_SU_BIT = 66L SAHPI_SU_KILOBIT = 67L SAHPI_SU_MEGABIT = 68L SAHPI_SU_GIGABIT = 69L SAHPI_SU_BYTE = 70L SAHPI_SU_KILOBYTE = 71L SAHPI_SU_MEGABYTE = 72L SAHPI_SU_GIGABYTE = 73L SAHPI_SU_WORD = 74L SAHPI_SU_DWORD = 75L SAHPI_SU_QWORD = 76L SAHPI_SU_LINE = 77L SAHPI_SU_HIT = 78L SAHPI_SU_MISS = 79L SAHPI_SU_RETRY = 80L SAHPI_SU_RESET = 81L SAHPI_SU_OVERRUN = 82L SAHPI_SU_UNDERRUN = 83L SAHPI_SU_COLLISION = 84L SAHPI_SU_PACKETS = 85L SAHPI_SU_MESSAGES = 86L SAHPI_SU_CHARACTERS = 87L SAHPI_SU_ERRORS = 88L SAHPI_SU_CORRECTABLE_ERRORS = 89L SAHPI_SU_UNCORRECTABLE_ERRORS = 90L SAHPI_SU_MAX_VALID = 90L SAHPI_SMUU_NONE = 0L SAHPI_SMUU_BASIC_OVER_MODIFIER = 1L SAHPI_SMUU_BASIC_TIMES_MODIFIER = 2L SAHPI_SMUU_MAX_VALID = 2L SAHPI_SEC_PER_EVENT = 0L SAHPI_SEC_READ_ONLY_MASKS = 1L SAHPI_SEC_READ_ONLY = 2L SAHPI_SEC_MAX_VALID = 2L SAHPI_CTRL_TYPE_DIGITAL = 0L SAHPI_CTRL_TYPE_DISCRETE = 1L SAHPI_CTRL_TYPE_ANALOG = 2L SAHPI_CTRL_TYPE_STREAM = 3L SAHPI_CTRL_TYPE_TEXT = 4L SAHPI_CTRL_TYPE_OEM = 192L SAHPI_CTRL_TYPE_MAX_VALID = 192L SAHPI_CTRL_STATE_OFF = 0L SAHPI_CTRL_STATE_ON = 1L SAHPI_CTRL_STATE_PULSE_OFF = 2L SAHPI_CTRL_STATE_PULSE_ON = 3L SAHPI_CTRL_STATE_MAX_VALID = 3L SAHPI_CTRL_MODE_AUTO = 0L SAHPI_CTRL_MODE_MANUAL = 1L SAHPI_CTRL_MODE_MAX_VALID = 1L SAHPI_CTRL_GENERIC = 0L SAHPI_CTRL_LED = 1L SAHPI_CTRL_FAN_SPEED = 2L SAHPI_CTRL_DRY_CONTACT_CLOSURE = 3L SAHPI_CTRL_POWER_SUPPLY_INHIBIT = 4L SAHPI_CTRL_AUDIBLE = 5L SAHPI_CTRL_FRONT_PANEL_LOCKOUT = 6L SAHPI_CTRL_POWER_INTERLOCK = 7L SAHPI_CTRL_POWER_STATE = 8L SAHPI_CTRL_LCD_DISPLAY = 9L SAHPI_CTRL_OEM = 10L SAHPI_CTRL_GENERIC_ADDRESS = 11L SAHPI_CTRL_IP_ADDRESS = 12L SAHPI_CTRL_RESOURCE_ID = 13L SAHPI_CTRL_POWER_BUDGET = 14L SAHPI_CTRL_ACTIVATE = 15L SAHPI_CTRL_RESET = 16L SAHPI_CTRL_OUTPUT_TYPE_MAX_VALID = 16L SAHPI_IDR_AREATYPE_INTERNAL_USE = 176L SAHPI_IDR_AREATYPE_CHASSIS_INFO = 177L SAHPI_IDR_AREATYPE_BOARD_INFO = 178L SAHPI_IDR_AREATYPE_PRODUCT_INFO = 179L SAHPI_IDR_AREATYPE_OEM = 192L SAHPI_IDR_AREATYPE_UNSPECIFIED = 255L SAHPI_IDR_AREATYPE_MAX_VALID = 255L SAHPI_IDR_FIELDTYPE_CHASSIS_TYPE = 0L SAHPI_IDR_FIELDTYPE_MFG_DATETIME = 1L SAHPI_IDR_FIELDTYPE_MANUFACTURER = 2L SAHPI_IDR_FIELDTYPE_PRODUCT_NAME = 3L SAHPI_IDR_FIELDTYPE_PRODUCT_VERSION = 4L SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER = 5L SAHPI_IDR_FIELDTYPE_PART_NUMBER = 6L SAHPI_IDR_FIELDTYPE_FILE_ID = 7L SAHPI_IDR_FIELDTYPE_ASSET_TAG = 8L SAHPI_IDR_FIELDTYPE_CUSTOM = 9L SAHPI_IDR_FIELDTYPE_UNSPECIFIED = 255L SAHPI_IDR_FIELDTYPE_MAX_VALID = 255L SAHPI_WA_NO_ACTION = 0L SAHPI_WA_RESET = 1L SAHPI_WA_POWER_DOWN = 2L SAHPI_WA_POWER_CYCLE = 3L SAHPI_WA_MAX_VALID = 3L SAHPI_WAE_NO_ACTION = 0L SAHPI_WAE_RESET = 1L SAHPI_WAE_POWER_DOWN = 2L SAHPI_WAE_POWER_CYCLE = 3L SAHPI_WAE_TIMER_INT = 8L SAHPI_WAE_MAX_VALID = 8L SAHPI_WPI_NONE = 0L SAHPI_WPI_SMI = 1L SAHPI_WPI_NMI = 2L SAHPI_WPI_MESSAGE_INTERRUPT = 3L SAHPI_WPI_OEM = 15L SAHPI_WPI_MAX_VALID = 15L SAHPI_WTU_NONE = 0L SAHPI_WTU_BIOS_FRB2 = 1L SAHPI_WTU_BIOS_POST = 2L SAHPI_WTU_OS_LOAD = 3L SAHPI_WTU_SMS_OS = 4L SAHPI_WTU_OEM = 5L SAHPI_WTU_UNSPECIFIED = 15L SAHPI_WTU_MAX_VALID = 15L SAHPI_DIMITEST_NONDEGRADING = 0L SAHPI_DIMITEST_DEGRADING = 1L SAHPI_DIMITEST_VENDOR_DEFINED_LEVEL = 2L SAHPI_DIMITEST_SERVICE_IMPACT_MAX_VALID = 2L SAHPI_DIMITEST_STATUS_NOT_RUN = 0L SAHPI_DIMITEST_STATUS_FINISHED_NO_ERRORS = 1L SAHPI_DIMITEST_STATUS_FINISHED_ERRORS = 2L SAHPI_DIMITEST_STATUS_CANCELED = 3L SAHPI_DIMITEST_STATUS_RUNNING = 4L SAHPI_DIMITEST_STATUS_MAX_VALID = 4L SAHPI_DIMITEST_STATUSERR_NOERR = 0L SAHPI_DIMITEST_STATUSERR_RUNERR = 1L SAHPI_DIMITEST_STATUSERR_UNDEF = 2L SAHPI_DIMITEST_STATUSERR_MAX_VALID = 2L SAHPI_DIMITEST_PARAM_TYPE_BOOLEAN = 0L SAHPI_DIMITEST_PARAM_TYPE_INT32 = 1L SAHPI_DIMITEST_PARAM_TYPE_FLOAT64 = 2L SAHPI_DIMITEST_PARAM_TYPE_TEXT = 3L SAHPI_DIMITEST_PARAM_TYPE_MAX_VALID = 3L SAHPI_DIMI_READY = 0L SAHPI_DIMI_WRONG_STATE = 1L SAHPI_DIMI_BUSY = 2L SAHPI_DIMI_READY_MAX_VALID = 2L SAHPI_FUMI_SPEC_INFO_NONE = 0L SAHPI_FUMI_SPEC_INFO_SAF_DEFINED = 1L SAHPI_FUMI_SPEC_INFO_OEM_DEFINED = 2L SAHPI_FUMI_SPEC_INFO_MAX_VALID = 2L SAHPI_FUMI_SPEC_HPM1 = 0L SAHPI_FUMI_SPEC_MAX_VALID = 0L SAHPI_FUMI_PROCESS_NONDEGRADING = 0L SAHPI_FUMI_PROCESS_DEGRADING = 1L SAHPI_FUMI_PROCESS_VENDOR_DEFINED_IMPACT_LEVEL = 2L SAHPI_FUMI_PROCESS_IMPACT_MAX_VALID = 2L SAHPI_FUMI_SRC_VALID = 0L SAHPI_FUMI_SRC_PROTOCOL_NOT_SUPPORTED = 1L SAHPI_FUMI_SRC_UNREACHABLE = 2L SAHPI_FUMI_SRC_VALIDATION_NOT_STARTED = 3L SAHPI_FUMI_SRC_VALIDATION_INITIATED = 4L SAHPI_FUMI_SRC_VALIDATION_FAIL = 5L SAHPI_FUMI_SRC_TYPE_MISMATCH = 6L SAHPI_FUMI_SRC_INVALID = 7L SAHPI_FUMI_SRC_VALIDITY_UNKNOWN = 8L SAHPI_FUMI_SRC_STATUS_MAX_VALID = 8L SAHPI_FUMI_BANK_VALID = 0L SAHPI_FUMI_BANK_UPGRADE_IN_PROGRESS = 1L SAHPI_FUMI_BANK_CORRUPTED = 2L SAHPI_FUMI_BANK_ACTIVE = 3L SAHPI_FUMI_BANK_BUSY = 4L SAHPI_FUMI_BANK_UNKNOWN = 5L SAHPI_FUMI_BANK_STATE_MAX_VALID = 5L SAHPI_FUMI_OPERATION_NOTSTARTED = 0L SAHPI_FUMI_SOURCE_VALIDATION_INITIATED = 1L SAHPI_FUMI_SOURCE_VALIDATION_FAILED = 2L SAHPI_FUMI_SOURCE_VALIDATION_DONE = 3L SAHPI_FUMI_SOURCE_VALIDATION_CANCELLED = 4L SAHPI_FUMI_INSTALL_INITIATED = 5L SAHPI_FUMI_INSTALL_FAILED_ROLLBACK_NEEDED = 6L SAHPI_FUMI_INSTALL_FAILED_ROLLBACK_INITIATED = 7L SAHPI_FUMI_INSTALL_FAILED_ROLLBACK_NOT_POSSIBLE = 8L SAHPI_FUMI_INSTALL_DONE = 9L SAHPI_FUMI_INSTALL_CANCELLED = 10L SAHPI_FUMI_ROLLBACK_INITIATED = 11L SAHPI_FUMI_ROLLBACK_FAILED = 12L SAHPI_FUMI_ROLLBACK_DONE = 13L SAHPI_FUMI_ROLLBACK_CANCELLED = 14L SAHPI_FUMI_BACKUP_INITIATED = 15L SAHPI_FUMI_BACKUP_FAILED = 16L SAHPI_FUMI_BACKUP_DONE = 17L SAHPI_FUMI_BACKUP_CANCELLED = 18L SAHPI_FUMI_BANK_COPY_INITIATED = 19L SAHPI_FUMI_BANK_COPY_FAILED = 20L SAHPI_FUMI_BANK_COPY_DONE = 21L SAHPI_FUMI_BANK_COPY_CANCELLED = 22L SAHPI_FUMI_TARGET_VERIFY_INITIATED = 23L SAHPI_FUMI_TARGET_VERIFY_FAILED = 24L SAHPI_FUMI_TARGET_VERIFY_DONE = 25L SAHPI_FUMI_TARGET_VERIFY_CANCELLED = 26L SAHPI_FUMI_ACTIVATE_INITIATED = 27L SAHPI_FUMI_ACTIVATE_FAILED_ROLLBACK_NEEDED = 28L SAHPI_FUMI_ACTIVATE_FAILED_ROLLBACK_INITIATED = 29L SAHPI_FUMI_ACTIVATE_FAILED_ROLLBACK_NOT_POSSIBLE = 30L SAHPI_FUMI_ACTIVATE_DONE = 31L SAHPI_FUMI_ACTIVATE_CANCELLED = 32L SAHPI_FUMI_UPGRADE_STATUS_MAX_VALID = 32L SAHPI_HS_INDICATOR_OFF = 0L SAHPI_HS_INDICATOR_ON = 1L SAHPI_HS_INDICATOR_STATE_MAX_VALID = 1L SAHPI_HS_ACTION_INSERTION = 0L SAHPI_HS_ACTION_EXTRACTION = 1L SAHPI_HS_ACTION_MAX_VALID = 1L SAHPI_HS_STATE_INACTIVE = 0L SAHPI_HS_STATE_INSERTION_PENDING = 1L SAHPI_HS_STATE_ACTIVE = 2L SAHPI_HS_STATE_EXTRACTION_PENDING = 3L SAHPI_HS_STATE_NOT_PRESENT = 4L SAHPI_HS_STATE_MAX_VALID = 4L SAHPI_HS_CAUSE_AUTO_POLICY = 0L SAHPI_HS_CAUSE_EXT_SOFTWARE = 1L SAHPI_HS_CAUSE_OPERATOR_INIT = 2L SAHPI_HS_CAUSE_USER_UPDATE = 3L SAHPI_HS_CAUSE_UNEXPECTED_DEACTIVATION = 4L SAHPI_HS_CAUSE_SURPRISE_EXTRACTION = 5L SAHPI_HS_CAUSE_EXTRACTION_UPDATE = 6L SAHPI_HS_CAUSE_HARDWARE_FAULT = 7L SAHPI_HS_CAUSE_CONTAINING_FRU = 8L SAHPI_HS_CAUSE_UNKNOWN = 65535L SAHPI_HS_CAUSE_MAX_VALID = 65535L SAHPI_CRITICAL = 0L SAHPI_MAJOR = 1L SAHPI_MINOR = 2L SAHPI_INFORMATIONAL = 3L SAHPI_OK = 4L SAHPI_DEBUG = 240L SAHPI_ALL_SEVERITIES = 255L SAHPI_SEVERITY_MAX_VALID = 240L SAHPI_RESE_RESOURCE_FAILURE = 0L SAHPI_RESE_RESOURCE_RESTORED = 1L SAHPI_RESE_RESOURCE_ADDED = 2L SAHPI_RESE_RESOURCE_REMOVED = 3L SAHPI_RESE_RESOURCE_INACCESSIBLE = 4L SAHPI_RESE_RESOURCE_UPDATED = 5L SAHPI_RESE_TYPE_MAX_VALID = 5L SAHPI_DOMAIN_REF_ADDED = 0L SAHPI_DOMAIN_REF_REMOVED = 1L SAHPI_DOMAIN_EVENT_TYPE_MAX_VALID = 1L SAHPI_HPIE_AUDIT = 0L SAHPI_HPIE_STARTUP = 1L SAHPI_HPIE_OTHER = 2L SAHPI_HPIE_TYPE_MAX_VALID = 2L SAHPI_ET_RESOURCE = 0L SAHPI_ET_DOMAIN = 1L SAHPI_ET_SENSOR = 2L SAHPI_ET_SENSOR_ENABLE_CHANGE = 3L SAHPI_ET_HOTSWAP = 4L SAHPI_ET_WATCHDOG = 5L SAHPI_ET_HPI_SW = 6L SAHPI_ET_OEM = 7L SAHPI_ET_USER = 8L SAHPI_ET_DIMI = 9L SAHPI_ET_DIMI_UPDATE = 10L SAHPI_ET_FUMI = 11L SAHPI_ET_MAX_VALID = 11L SAHPI_STATUS_COND_TYPE_SENSOR = 0L SAHPI_STATUS_COND_TYPE_RESOURCE = 1L SAHPI_STATUS_COND_TYPE_OEM = 2L SAHPI_STATUS_COND_TYPE_USER = 3L SAHPI_STATUS_COND_TYPE_MAX_VALID = 3L SAHPI_ANNUNCIATOR_MODE_AUTO = 0L SAHPI_ANNUNCIATOR_MODE_USER = 1L SAHPI_ANNUNCIATOR_MODE_SHARED = 2L SAHPI_ANNUNCIATOR_MODE_MAX_VALID = 2L SAHPI_ANNUNCIATOR_TYPE_LED = 0L SAHPI_ANNUNCIATOR_TYPE_DRY_CONTACT_CLOSURE = 1L SAHPI_ANNUNCIATOR_TYPE_AUDIBLE = 2L SAHPI_ANNUNCIATOR_TYPE_LCD_DISPLAY = 3L SAHPI_ANNUNCIATOR_TYPE_MESSAGE = 4L SAHPI_ANNUNCIATOR_TYPE_COMPOSITE = 5L SAHPI_ANNUNCIATOR_TYPE_OEM = 6L SAHPI_ANNUNCIATOR_TYPE_MAX_VALID = 6L SAHPI_NO_RECORD = 0L SAHPI_CTRL_RDR = 1L SAHPI_SENSOR_RDR = 2L SAHPI_INVENTORY_RDR = 3L SAHPI_WATCHDOG_RDR = 4L SAHPI_ANNUNCIATOR_RDR = 5L SAHPI_DIMI_RDR = 6L SAHPI_FUMI_RDR = 7L SAHPI_RDR_TYPE_MAX_VALID = 7L SAHPI_DEFAULT_PARM = 0L SAHPI_SAVE_PARM = 1L SAHPI_RESTORE_PARM = 2L SAHPI_PARM_ACTION_MAX_VALID = 2L SAHPI_COLD_RESET = 0L SAHPI_WARM_RESET = 1L SAHPI_RESET_ASSERT = 2L SAHPI_RESET_DEASSERT = 3L SAHPI_RESET_MAX_VALID = 3L SAHPI_POWER_OFF = 0L SAHPI_POWER_ON = 1L SAHPI_POWER_CYCLE = 2L SAHPI_POWER_STATE_MAX_VALID = 2L SAHPI_EL_OVERFLOW_DROP = 0L SAHPI_EL_OVERFLOW_OVERWRITE = 1L SAHPI_EL_OVERFLOW_ACTION_MAX_TYPE = 1L ATCAHPI_LED_COLOR_RESERVED = 0L ATCAHPI_LED_COLOR_BLUE = 1L ATCAHPI_LED_COLOR_RED = 2L ATCAHPI_LED_COLOR_GREEN = 3L ATCAHPI_LED_COLOR_AMBER = 4L ATCAHPI_LED_COLOR_ORANGE = 5L ATCAHPI_LED_COLOR_WHITE = 6L ATCAHPI_LED_COLOR_NO_CHANGE = 14L ATCAHPI_LED_COLOR_USE_DEFAULT = 15L ATCAHPI_LED_AUTO = 0L ATCAHPI_LED_MANUAL = 1L ATCAHPI_LED_LAMP_TEST = 2L ATCAHPI_LED_BR_SUPPORTED = 0L ATCAHPI_LED_BR_NOT_SUPPORTED = 1L ATCAHPI_LED_BR_UNKNOWN = 2L XTCAHPI_LED_COLOR_RESERVED = 0L XTCAHPI_LED_COLOR_BLUE = 1L XTCAHPI_LED_COLOR_RED = 2L XTCAHPI_LED_COLOR_GREEN = 3L XTCAHPI_LED_COLOR_AMBER = 4L XTCAHPI_LED_COLOR_ORANGE = 5L XTCAHPI_LED_COLOR_WHITE = 6L XTCAHPI_LED_COLOR_NO_CHANGE = 14L XTCAHPI_LED_COLOR_USE_DEFAULT = 15L XTCAHPI_LED_AUTO = 0L XTCAHPI_LED_MANUAL = 1L XTCAHPI_LED_LAMP_TEST = 2L XTCAHPI_LED_BR_SUPPORTED = 0L XTCAHPI_LED_BR_NOT_SUPPORTED = 1L XTCAHPI_LED_BR_UNKNOWN = 2L SA_ERR_HPI_OK = 0L #********************************************************** #* HPI Complex Data Types #********************************************************** #** # HPI struct SaHpiTextBufferT #** class SaHpiTextBufferT: def __init__( self ): # SaHpiTextTypeT self.DataType = None # SaHpiLanguageT self.Language = None # SaHpiUint8T self.DataLength = None # SaHpiUint8T[SAHPI_MAX_TEXT_BUFFER_LENGTH] self.Data = None #** # HPI struct SaHpiEntityT #** class SaHpiEntityT: def __init__( self ): # SaHpiEntityTypeT self.EntityType = None # SaHpiEntityLocationT self.EntityLocation = None #** # HPI struct SaHpiEntityPathT #** class SaHpiEntityPathT: def __init__( self ): # SaHpiEntityT[SAHPI_MAX_ENTITY_PATH] self.Entry = None #** # HPI union SaHpiSensorReadingUnionT #** class SaHpiSensorReadingUnionT: def __init__( self ): # SaHpiInt64T self.SensorInt64 = None # SaHpiUint64T self.SensorUint64 = None # SaHpiFloat64T self.SensorFloat64 = None # SaHpiUint8T[SAHPI_SENSOR_BUFFER_LENGTH] self.SensorBuffer = None #** # HPI struct SaHpiSensorReadingT #** class SaHpiSensorReadingT: def __init__( self ): # SaHpiBoolT self.IsSupported = None # SaHpiSensorReadingTypeT self.Type = None # HPI union SaHpiSensorReadingUnionT self.Value = None #** # HPI struct SaHpiSensorThresholdsT #** class SaHpiSensorThresholdsT: def __init__( self ): # HPI struct SaHpiSensorReadingT self.LowCritical = None # HPI struct SaHpiSensorReadingT self.LowMajor = None # HPI struct SaHpiSensorReadingT self.LowMinor = None # HPI struct SaHpiSensorReadingT self.UpCritical = None # HPI struct SaHpiSensorReadingT self.UpMajor = None # HPI struct SaHpiSensorReadingT self.UpMinor = None # HPI struct SaHpiSensorReadingT self.PosThdHysteresis = None # HPI struct SaHpiSensorReadingT self.NegThdHysteresis = None #** # HPI struct SaHpiSensorRangeT #** class SaHpiSensorRangeT: def __init__( self ): # SaHpiSensorRangeFlagsT self.Flags = None # HPI struct SaHpiSensorReadingT self.Max = None # HPI struct SaHpiSensorReadingT self.Min = None # HPI struct SaHpiSensorReadingT self.Nominal = None # HPI struct SaHpiSensorReadingT self.NormalMax = None # HPI struct SaHpiSensorReadingT self.NormalMin = None #** # HPI struct SaHpiSensorDataFormatT #** class SaHpiSensorDataFormatT: def __init__( self ): # SaHpiBoolT self.IsSupported = None # SaHpiSensorReadingTypeT self.ReadingType = None # SaHpiSensorUnitsT self.BaseUnits = None # SaHpiSensorUnitsT self.ModifierUnits = None # SaHpiSensorModUnitUseT self.ModifierUse = None # SaHpiBoolT self.Percentage = None # HPI struct SaHpiSensorRangeT self.Range = None # SaHpiFloat64T self.AccuracyFactor = None #** # HPI struct SaHpiSensorThdDefnT #** class SaHpiSensorThdDefnT: def __init__( self ): # SaHpiBoolT self.IsAccessible = None # SaHpiSensorThdMaskT self.ReadThold = None # SaHpiSensorThdMaskT self.WriteThold = None # SaHpiBoolT self.Nonlinear = None #** # HPI struct SaHpiSensorRecT #** class SaHpiSensorRecT: def __init__( self ): # SaHpiSensorNumT self.Num = None # SaHpiSensorTypeT self.Type = None # SaHpiEventCategoryT self.Category = None # SaHpiBoolT self.EnableCtrl = None # SaHpiSensorEventCtrlT self.EventCtrl = None # SaHpiEventStateT self.Events = None # HPI struct SaHpiSensorDataFormatT self.DataFormat = None # HPI struct SaHpiSensorThdDefnT self.ThresholdDefn = None # SaHpiUint32T self.Oem = None #** # HPI struct SaHpiCtrlStateStreamT #** class SaHpiCtrlStateStreamT: def __init__( self ): # SaHpiBoolT self.Repeat = None # SaHpiUint32T self.StreamLength = None # SaHpiUint8T[SAHPI_CTRL_MAX_STREAM_LENGTH] self.Stream = None #** # HPI struct SaHpiCtrlStateTextT #** class SaHpiCtrlStateTextT: def __init__( self ): # SaHpiTxtLineNumT self.Line = None # HPI struct SaHpiTextBufferT self.Text = None #** # HPI struct SaHpiCtrlStateOemT #** class SaHpiCtrlStateOemT: def __init__( self ): # SaHpiManufacturerIdT self.MId = None # SaHpiUint8T self.BodyLength = None # SaHpiUint8T[SAHPI_CTRL_MAX_OEM_BODY_LENGTH] self.Body = None #** # HPI union SaHpiCtrlStateUnionT #** class SaHpiCtrlStateUnionT: def __init__( self ): # SaHpiCtrlStateDigitalT self.Digital = None # SaHpiCtrlStateDiscreteT self.Discrete = None # SaHpiCtrlStateAnalogT self.Analog = None # HPI struct SaHpiCtrlStateStreamT self.Stream = None # HPI struct SaHpiCtrlStateTextT self.Text = None # HPI struct SaHpiCtrlStateOemT self.Oem = None #** # HPI struct SaHpiCtrlStateT #** class SaHpiCtrlStateT: def __init__( self ): # SaHpiCtrlTypeT self.Type = None # HPI union SaHpiCtrlStateUnionT self.StateUnion = None #** # HPI struct SaHpiCtrlRecDigitalT #** class SaHpiCtrlRecDigitalT: def __init__( self ): # SaHpiCtrlStateDigitalT self.Default = None #** # HPI struct SaHpiCtrlRecDiscreteT #** class SaHpiCtrlRecDiscreteT: def __init__( self ): # SaHpiCtrlStateDiscreteT self.Default = None #** # HPI struct SaHpiCtrlRecAnalogT #** class SaHpiCtrlRecAnalogT: def __init__( self ): # SaHpiCtrlStateAnalogT self.Min = None # SaHpiCtrlStateAnalogT self.Max = None # SaHpiCtrlStateAnalogT self.Default = None #** # HPI struct SaHpiCtrlRecStreamT #** class SaHpiCtrlRecStreamT: def __init__( self ): # HPI struct SaHpiCtrlStateStreamT self.Default = None #** # HPI struct SaHpiCtrlRecTextT #** class SaHpiCtrlRecTextT: def __init__( self ): # SaHpiUint8T self.MaxChars = None # SaHpiUint8T self.MaxLines = None # SaHpiLanguageT self.Language = None # SaHpiTextTypeT self.DataType = None # HPI struct SaHpiCtrlStateTextT self.Default = None #** # HPI struct SaHpiCtrlRecOemT #** class SaHpiCtrlRecOemT: def __init__( self ): # SaHpiManufacturerIdT self.MId = None # SaHpiUint8T[SAHPI_CTRL_OEM_CONFIG_LENGTH] self.ConfigData = None # HPI struct SaHpiCtrlStateOemT self.Default = None #** # HPI union SaHpiCtrlRecUnionT #** class SaHpiCtrlRecUnionT: def __init__( self ): # HPI struct SaHpiCtrlRecDigitalT self.Digital = None # HPI struct SaHpiCtrlRecDiscreteT self.Discrete = None # HPI struct SaHpiCtrlRecAnalogT self.Analog = None # HPI struct SaHpiCtrlRecStreamT self.Stream = None # HPI struct SaHpiCtrlRecTextT self.Text = None # HPI struct SaHpiCtrlRecOemT self.Oem = None #** # HPI struct SaHpiCtrlDefaultModeT #** class SaHpiCtrlDefaultModeT: def __init__( self ): # SaHpiCtrlModeT self.Mode = None # SaHpiBoolT self.ReadOnly = None #** # HPI struct SaHpiCtrlRecT #** class SaHpiCtrlRecT: def __init__( self ): # SaHpiCtrlNumT self.Num = None # SaHpiCtrlOutputTypeT self.OutputType = None # SaHpiCtrlTypeT self.Type = None # HPI union SaHpiCtrlRecUnionT self.TypeUnion = None # HPI struct SaHpiCtrlDefaultModeT self.DefaultMode = None # SaHpiBoolT self.WriteOnly = None # SaHpiUint32T self.Oem = None #** # HPI struct SaHpiIdrFieldT #** class SaHpiIdrFieldT: def __init__( self ): # SaHpiEntryIdT self.AreaId = None # SaHpiEntryIdT self.FieldId = None # SaHpiIdrFieldTypeT self.Type = None # SaHpiBoolT self.ReadOnly = None # HPI struct SaHpiTextBufferT self.Field = None #** # HPI struct SaHpiIdrAreaHeaderT #** class SaHpiIdrAreaHeaderT: def __init__( self ): # SaHpiEntryIdT self.AreaId = None # SaHpiIdrAreaTypeT self.Type = None # SaHpiBoolT self.ReadOnly = None # SaHpiUint32T self.NumFields = None #** # HPI struct SaHpiIdrInfoT #** class SaHpiIdrInfoT: def __init__( self ): # SaHpiIdrIdT self.IdrId = None # SaHpiUint32T self.UpdateCount = None # SaHpiBoolT self.ReadOnly = None # SaHpiUint32T self.NumAreas = None #** # HPI struct SaHpiInventoryRecT #** class SaHpiInventoryRecT: def __init__( self ): # SaHpiIdrIdT self.IdrId = None # SaHpiBoolT self.Persistent = None # SaHpiUint32T self.Oem = None #** # HPI struct SaHpiWatchdogT #** class SaHpiWatchdogT: def __init__( self ): # SaHpiBoolT self.Log = None # SaHpiBoolT self.Running = None # SaHpiWatchdogTimerUseT self.TimerUse = None # SaHpiWatchdogActionT self.TimerAction = None # SaHpiWatchdogPretimerInterruptT self.PretimerInterrupt = None # SaHpiUint32T self.PreTimeoutInterval = None # SaHpiWatchdogExpFlagsT self.TimerUseExpFlags = None # SaHpiUint32T self.InitialCount = None # SaHpiUint32T self.PresentCount = None #** # HPI struct SaHpiWatchdogRecT #** class SaHpiWatchdogRecT: def __init__( self ): # SaHpiWatchdogNumT self.WatchdogNum = None # SaHpiUint32T self.Oem = None #** # HPI struct SaHpiDimiTestAffectedEntityT #** class SaHpiDimiTestAffectedEntityT: def __init__( self ): # HPI struct SaHpiEntityPathT self.EntityImpacted = None # SaHpiDimiTestServiceImpactT self.ServiceImpact = None #** # HPI struct SaHpiDimiTestResultsT #** class SaHpiDimiTestResultsT: def __init__( self ): # SaHpiTimeT self.ResultTimeStamp = None # SaHpiTimeoutT self.RunDuration = None # SaHpiDimiTestRunStatusT self.LastRunStatus = None # SaHpiDimiTestErrCodeT self.TestErrorCode = None # HPI struct SaHpiTextBufferT self.TestResultString = None # SaHpiBoolT self.TestResultStringIsURI = None #** # HPI union SaHpiDimiTestParamValueT #** class SaHpiDimiTestParamValueT: def __init__( self ): # SaHpiInt32T self.paramint = None # SaHpiBoolT self.parambool = None # SaHpiFloat64T self.paramfloat = None # HPI struct SaHpiTextBufferT self.paramtext = None #** # HPI union SaHpiDimiTestParameterValueUnionT #** class SaHpiDimiTestParameterValueUnionT: def __init__( self ): # SaHpiInt32T self.IntValue = None # SaHpiFloat64T self.FloatValue = None #** # HPI struct SaHpiDimiTestParamsDefinitionT #** class SaHpiDimiTestParamsDefinitionT: def __init__( self ): # SaHpiUint8T[SAHPI_DIMITEST_PARAM_NAME_LEN] self.ParamName = None # HPI struct SaHpiTextBufferT self.ParamInfo = None # SaHpiDimiTestParamTypeT self.ParamType = None # HPI union SaHpiDimiTestParameterValueUnionT self.MinValue = None # HPI union SaHpiDimiTestParameterValueUnionT self.MaxValue = None # HPI union SaHpiDimiTestParamValueT self.DefaultParam = None #** # HPI struct SaHpiDimiTestT #** class SaHpiDimiTestT: def __init__( self ): # HPI struct SaHpiTextBufferT self.TestName = None # SaHpiDimiTestServiceImpactT self.ServiceImpact = None # SaHpiDimiTestAffectedEntityT[SAHPI_DIMITEST_MAX_ENTITIESIMPACTED] self.EntitiesImpacted = None # SaHpiBoolT self.NeedServiceOS = None # HPI struct SaHpiTextBufferT self.ServiceOS = None # SaHpiTimeT self.ExpectedRunDuration = None # SaHpiDimiTestCapabilityT self.TestCapabilities = None # SaHpiDimiTestParamsDefinitionT[SAHPI_DIMITEST_MAX_PARAMETERS] self.TestParameters = None #** # HPI struct SaHpiDimiTestVariableParamsT #** class SaHpiDimiTestVariableParamsT: def __init__( self ): # SaHpiUint8T[SAHPI_DIMITEST_PARAM_NAME_LEN] self.ParamName = None # SaHpiDimiTestParamTypeT self.ParamType = None # HPI union SaHpiDimiTestParamValueT self.Value = None #** # HPI struct SaHpiDimiInfoT #** class SaHpiDimiInfoT: def __init__( self ): # SaHpiUint32T self.NumberOfTests = None # SaHpiUint32T self.TestNumUpdateCounter = None #** # HPI struct SaHpiDimiRecT #** class SaHpiDimiRecT: def __init__( self ): # SaHpiDimiNumT self.DimiNum = None # SaHpiUint32T self.Oem = None #** # HPI struct SaHpiFumiSafDefinedSpecInfoT #** class SaHpiFumiSafDefinedSpecInfoT: def __init__( self ): # SaHpiFumiSafDefinedSpecIdT self.SpecID = None # SaHpiUint32T self.RevisionID = None #** # HPI struct SaHpiFumiOemDefinedSpecInfoT #** class SaHpiFumiOemDefinedSpecInfoT: def __init__( self ): # SaHpiManufacturerIdT self.Mid = None # SaHpiUint8T self.BodyLength = None # SaHpiUint8T[SAHPI_FUMI_MAX_OEM_BODY_LENGTH] self.Body = None #** # HPI union SaHpiFumiSpecInfoTypeUnionT #** class SaHpiFumiSpecInfoTypeUnionT: def __init__( self ): # HPI struct SaHpiFumiSafDefinedSpecInfoT self.SafDefined = None # HPI struct SaHpiFumiOemDefinedSpecInfoT self.OemDefined = None #** # HPI struct SaHpiFumiSpecInfoT #** class SaHpiFumiSpecInfoT: def __init__( self ): # SaHpiFumiSpecInfoTypeT self.SpecInfoType = None # HPI union SaHpiFumiSpecInfoTypeUnionT self.SpecInfoTypeUnion = None #** # HPI struct SaHpiFumiFirmwareInstanceInfoT #** class SaHpiFumiFirmwareInstanceInfoT: def __init__( self ): # SaHpiBoolT self.InstancePresent = None # HPI struct SaHpiTextBufferT self.Identifier = None # HPI struct SaHpiTextBufferT self.Description = None # HPI struct SaHpiTextBufferT self.DateTime = None # SaHpiUint32T self.MajorVersion = None # SaHpiUint32T self.MinorVersion = None # SaHpiUint32T self.AuxVersion = None #** # HPI struct SaHpiFumiImpactedEntityT #** class SaHpiFumiImpactedEntityT: def __init__( self ): # HPI struct SaHpiEntityPathT self.ImpactedEntity = None # SaHpiFumiServiceImpactT self.ServiceImpact = None #** # HPI struct SaHpiFumiServiceImpactDataT #** class SaHpiFumiServiceImpactDataT: def __init__( self ): # SaHpiUint32T self.NumEntities = None # SaHpiFumiImpactedEntityT[SAHPI_FUMI_MAX_ENTITIES_IMPACTED] self.ImpactedEntities = None #** # HPI struct SaHpiFumiSourceInfoT #** class SaHpiFumiSourceInfoT: def __init__( self ): # HPI struct SaHpiTextBufferT self.SourceUri = None # SaHpiFumiSourceStatusT self.SourceStatus = None # HPI struct SaHpiTextBufferT self.Identifier = None # HPI struct SaHpiTextBufferT self.Description = None # HPI struct SaHpiTextBufferT self.DateTime = None # SaHpiUint32T self.MajorVersion = None # SaHpiUint32T self.MinorVersion = None # SaHpiUint32T self.AuxVersion = None #** # HPI struct SaHpiFumiComponentInfoT #** class SaHpiFumiComponentInfoT: def __init__( self ): # SaHpiEntryIdT self.EntryId = None # SaHpiUint32T self.ComponentId = None # HPI struct SaHpiFumiFirmwareInstanceInfoT self.MainFwInstance = None # SaHpiUint32T self.ComponentFlags = None #** # HPI struct SaHpiFumiBankInfoT #** class SaHpiFumiBankInfoT: def __init__( self ): # SaHpiUint8T self.BankId = None # SaHpiUint32T self.BankSize = None # SaHpiUint32T self.Position = None # SaHpiFumiBankStateT self.BankState = None # HPI struct SaHpiTextBufferT self.Identifier = None # HPI struct SaHpiTextBufferT self.Description = None # HPI struct SaHpiTextBufferT self.DateTime = None # SaHpiUint32T self.MajorVersion = None # SaHpiUint32T self.MinorVersion = None # SaHpiUint32T self.AuxVersion = None #** # HPI struct SaHpiFumiLogicalBankInfoT #** class SaHpiFumiLogicalBankInfoT: def __init__( self ): # SaHpiUint8T self.FirmwarePersistentLocationCount = None # SaHpiFumiLogicalBankStateFlagsT self.BankStateFlags = None # HPI struct SaHpiFumiFirmwareInstanceInfoT self.PendingFwInstance = None # HPI struct SaHpiFumiFirmwareInstanceInfoT self.RollbackFwInstance = None #** # HPI struct SaHpiFumiLogicalComponentInfoT #** class SaHpiFumiLogicalComponentInfoT: def __init__( self ): # SaHpiEntryIdT self.EntryId = None # SaHpiUint32T self.ComponentId = None # HPI struct SaHpiFumiFirmwareInstanceInfoT self.PendingFwInstance = None # HPI struct SaHpiFumiFirmwareInstanceInfoT self.RollbackFwInstance = None # SaHpiUint32T self.ComponentFlags = None #** # HPI struct SaHpiFumiRecT #** class SaHpiFumiRecT: def __init__( self ): # SaHpiFumiNumT self.Num = None # SaHpiFumiProtocolT self.AccessProt = None # SaHpiFumiCapabilityT self.Capability = None # SaHpiUint8T self.NumBanks = None # SaHpiUint32T self.Oem = None #** # HPI struct SaHpiResourceEventT #** class SaHpiResourceEventT: def __init__( self ): # SaHpiResourceEventTypeT self.ResourceEventType = None #** # HPI struct SaHpiDomainEventT #** class SaHpiDomainEventT: def __init__( self ): # SaHpiDomainEventTypeT self.Type = None # SaHpiDomainIdT self.DomainId = None #** # HPI struct SaHpiSensorEventT #** class SaHpiSensorEventT: def __init__( self ): # SaHpiSensorNumT self.SensorNum = None # SaHpiSensorTypeT self.SensorType = None # SaHpiEventCategoryT self.EventCategory = None # SaHpiBoolT self.Assertion = None # SaHpiEventStateT self.EventState = None # SaHpiSensorOptionalDataT self.OptionalDataPresent = None # HPI struct SaHpiSensorReadingT self.TriggerReading = None # HPI struct SaHpiSensorReadingT self.TriggerThreshold = None # SaHpiEventStateT self.PreviousState = None # SaHpiEventStateT self.CurrentState = None # SaHpiUint32T self.Oem = None # SaHpiUint32T self.SensorSpecific = None #** # HPI struct SaHpiSensorEnableChangeEventT #** class SaHpiSensorEnableChangeEventT: def __init__( self ): # SaHpiSensorNumT self.SensorNum = None # SaHpiSensorTypeT self.SensorType = None # SaHpiEventCategoryT self.EventCategory = None # SaHpiBoolT self.SensorEnable = None # SaHpiBoolT self.SensorEventEnable = None # SaHpiEventStateT self.AssertEventMask = None # SaHpiEventStateT self.DeassertEventMask = None # SaHpiSensorEnableOptDataT self.OptionalDataPresent = None # SaHpiEventStateT self.CurrentState = None # SaHpiEventStateT self.CriticalAlarms = None # SaHpiEventStateT self.MajorAlarms = None # SaHpiEventStateT self.MinorAlarms = None #** # HPI struct SaHpiHotSwapEventT #** class SaHpiHotSwapEventT: def __init__( self ): # SaHpiHsStateT self.HotSwapState = None # SaHpiHsStateT self.PreviousHotSwapState = None # SaHpiHsCauseOfStateChangeT self.CauseOfStateChange = None #** # HPI struct SaHpiWatchdogEventT #** class SaHpiWatchdogEventT: def __init__( self ): # SaHpiWatchdogNumT self.WatchdogNum = None # SaHpiWatchdogActionEventT self.WatchdogAction = None # SaHpiWatchdogPretimerInterruptT self.WatchdogPreTimerAction = None # SaHpiWatchdogTimerUseT self.WatchdogUse = None #** # HPI struct SaHpiHpiSwEventT #** class SaHpiHpiSwEventT: def __init__( self ): # SaHpiManufacturerIdT self.MId = None # SaHpiSwEventTypeT self.Type = None # HPI struct SaHpiTextBufferT self.EventData = None #** # HPI struct SaHpiOemEventT #** class SaHpiOemEventT: def __init__( self ): # SaHpiManufacturerIdT self.MId = None # HPI struct SaHpiTextBufferT self.OemEventData = None #** # HPI struct SaHpiUserEventT #** class SaHpiUserEventT: def __init__( self ): # HPI struct SaHpiTextBufferT self.UserEventData = None #** # HPI struct SaHpiDimiEventT #** class SaHpiDimiEventT: def __init__( self ): # SaHpiDimiNumT self.DimiNum = None # SaHpiDimiTestNumT self.TestNum = None # SaHpiDimiTestRunStatusT self.DimiTestRunStatus = None # SaHpiDimiTestPercentCompletedT self.DimiTestPercentCompleted = None #** # HPI struct SaHpiDimiUpdateEventT #** class SaHpiDimiUpdateEventT: def __init__( self ): # SaHpiDimiNumT self.DimiNum = None #** # HPI struct SaHpiFumiEventT #** class SaHpiFumiEventT: def __init__( self ): # SaHpiFumiNumT self.FumiNum = None # SaHpiUint8T self.BankNum = None # SaHpiFumiUpgradeStatusT self.UpgradeStatus = None #** # HPI union SaHpiEventUnionT #** class SaHpiEventUnionT: def __init__( self ): # HPI struct SaHpiResourceEventT self.ResourceEvent = None # HPI struct SaHpiDomainEventT self.DomainEvent = None # HPI struct SaHpiSensorEventT self.SensorEvent = None # HPI struct SaHpiSensorEnableChangeEventT self.SensorEnableChangeEvent = None # HPI struct SaHpiHotSwapEventT self.HotSwapEvent = None # HPI struct SaHpiWatchdogEventT self.WatchdogEvent = None # HPI struct SaHpiHpiSwEventT self.HpiSwEvent = None # HPI struct SaHpiOemEventT self.OemEvent = None # HPI struct SaHpiUserEventT self.UserEvent = None # HPI struct SaHpiDimiEventT self.DimiEvent = None # HPI struct SaHpiDimiUpdateEventT self.DimiUpdateEvent = None # HPI struct SaHpiFumiEventT self.FumiEvent = None #** # HPI struct SaHpiEventT #** class SaHpiEventT: def __init__( self ): # SaHpiResourceIdT self.Source = None # SaHpiEventTypeT self.EventType = None # SaHpiTimeT self.Timestamp = None # SaHpiSeverityT self.Severity = None # HPI union SaHpiEventUnionT self.EventDataUnion = None #** # HPI struct SaHpiNameT #** class SaHpiNameT: def __init__( self ): # SaHpiUint16T self.Length = None # SaHpiUint8T[SA_HPI_MAX_NAME_LENGTH] self.Value = None #** # HPI struct SaHpiConditionT #** class SaHpiConditionT: def __init__( self ): # SaHpiStatusCondTypeT self.Type = None # HPI struct SaHpiEntityPathT self.Entity = None # SaHpiDomainIdT self.DomainId = None # SaHpiResourceIdT self.ResourceId = None # SaHpiSensorNumT self.SensorNum = None # SaHpiEventStateT self.EventState = None # HPI struct SaHpiNameT self.Name = None # SaHpiManufacturerIdT self.Mid = None # HPI struct SaHpiTextBufferT self.Data = None #** # HPI struct SaHpiAnnouncementT #** class SaHpiAnnouncementT: def __init__( self ): # SaHpiEntryIdT self.EntryId = None # SaHpiTimeT self.Timestamp = None # SaHpiBoolT self.AddedByUser = None # SaHpiSeverityT self.Severity = None # SaHpiBoolT self.Acknowledged = None # HPI struct SaHpiConditionT self.StatusCond = None #** # HPI struct SaHpiAnnunciatorRecT #** class SaHpiAnnunciatorRecT: def __init__( self ): # SaHpiAnnunciatorNumT self.AnnunciatorNum = None # SaHpiAnnunciatorTypeT self.AnnunciatorType = None # SaHpiBoolT self.ModeReadOnly = None # SaHpiUint32T self.MaxConditions = None # SaHpiUint32T self.Oem = None #** # HPI union SaHpiRdrTypeUnionT #** class SaHpiRdrTypeUnionT: def __init__( self ): # HPI struct SaHpiCtrlRecT self.CtrlRec = None # HPI struct SaHpiSensorRecT self.SensorRec = None # HPI struct SaHpiInventoryRecT self.InventoryRec = None # HPI struct SaHpiWatchdogRecT self.WatchdogRec = None # HPI struct SaHpiAnnunciatorRecT self.AnnunciatorRec = None # HPI struct SaHpiDimiRecT self.DimiRec = None # HPI struct SaHpiFumiRecT self.FumiRec = None #** # HPI struct SaHpiRdrT #** class SaHpiRdrT: def __init__( self ): # SaHpiEntryIdT self.RecordId = None # SaHpiRdrTypeT self.RdrType = None # HPI struct SaHpiEntityPathT self.Entity = None # SaHpiBoolT self.IsFru = None # HPI union SaHpiRdrTypeUnionT self.RdrTypeUnion = None # HPI struct SaHpiTextBufferT self.IdString = None #** # HPI struct SaHpiLoadIdT #** class SaHpiLoadIdT: def __init__( self ): # SaHpiLoadNumberT self.LoadNumber = None # HPI struct SaHpiTextBufferT self.LoadName = None #** # HPI struct SaHpiResourceInfoT #** class SaHpiResourceInfoT: def __init__( self ): # SaHpiUint8T self.ResourceRev = None # SaHpiUint8T self.SpecificVer = None # SaHpiUint8T self.DeviceSupport = None # SaHpiManufacturerIdT self.ManufacturerId = None # SaHpiUint16T self.ProductId = None # SaHpiUint8T self.FirmwareMajorRev = None # SaHpiUint8T self.FirmwareMinorRev = None # SaHpiUint8T self.AuxFirmwareRev = None # SaHpiUint8T[SAHPI_GUID_LENGTH] self.Guid = None #** # HPI struct SaHpiRptEntryT #** class SaHpiRptEntryT: def __init__( self ): # SaHpiEntryIdT self.EntryId = None # SaHpiResourceIdT self.ResourceId = None # HPI struct SaHpiResourceInfoT self.ResourceInfo = None # HPI struct SaHpiEntityPathT self.ResourceEntity = None # SaHpiCapabilitiesT self.ResourceCapabilities = None # SaHpiHsCapabilitiesT self.HotSwapCapabilities = None # SaHpiSeverityT self.ResourceSeverity = None # SaHpiBoolT self.ResourceFailed = None # HPI struct SaHpiTextBufferT self.ResourceTag = None #** # HPI struct SaHpiDomainInfoT #** class SaHpiDomainInfoT: def __init__( self ): # SaHpiDomainIdT self.DomainId = None # SaHpiDomainCapabilitiesT self.DomainCapabilities = None # SaHpiBoolT self.IsPeer = None # HPI struct SaHpiTextBufferT self.DomainTag = None # SaHpiUint32T self.DrtUpdateCount = None # SaHpiTimeT self.DrtUpdateTimestamp = None # SaHpiUint32T self.RptUpdateCount = None # SaHpiTimeT self.RptUpdateTimestamp = None # SaHpiUint32T self.DatUpdateCount = None # SaHpiTimeT self.DatUpdateTimestamp = None # SaHpiUint32T self.ActiveAlarms = None # SaHpiUint32T self.CriticalAlarms = None # SaHpiUint32T self.MajorAlarms = None # SaHpiUint32T self.MinorAlarms = None # SaHpiUint32T self.DatUserAlarmLimit = None # SaHpiBoolT self.DatOverflow = None # SaHpiUint8T[SAHPI_GUID_LENGTH] self.Guid = None #** # HPI struct SaHpiDrtEntryT #** class SaHpiDrtEntryT: def __init__( self ): # SaHpiEntryIdT self.EntryId = None # SaHpiDomainIdT self.DomainId = None # SaHpiBoolT self.IsPeer = None #** # HPI struct SaHpiAlarmT #** class SaHpiAlarmT: def __init__( self ): # SaHpiAlarmIdT self.AlarmId = None # SaHpiTimeT self.Timestamp = None # SaHpiSeverityT self.Severity = None # SaHpiBoolT self.Acknowledged = None # HPI struct SaHpiConditionT self.AlarmCond = None #** # HPI struct SaHpiEventLogInfoT #** class SaHpiEventLogInfoT: def __init__( self ): # SaHpiUint32T self.Entries = None # SaHpiUint32T self.Size = None # SaHpiUint32T self.UserEventMaxSize = None # SaHpiTimeT self.UpdateTimestamp = None # SaHpiTimeT self.CurrentTime = None # SaHpiBoolT self.Enabled = None # SaHpiBoolT self.OverflowFlag = None # SaHpiBoolT self.OverflowResetable = None # SaHpiEventLogOverflowActionT self.OverflowAction = None #** # HPI struct SaHpiEventLogEntryT #** class SaHpiEventLogEntryT: def __init__( self ): # SaHpiEventLogEntryIdT self.EntryId = None # SaHpiTimeT self.Timestamp = None # HPI struct SaHpiEventT self.Event = None openhpi-3.6.1/baselibs/python/openhpi_baselib/OhpiDataTypes.py0000644000175100017510000002051312575647300023505 0ustar mohanmohan # -*- python -*- # # Copyright (C) 2012, Pigeon Point Systems # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # # Author(s): # Anton Pak # #********************************************************** # OHPI Constants #********************************************************** #********************************************************** # OHPI RPC IDs #********************************************************** RPC_SAHPI_NULL = 0 RPC_SAHPI_SESSION_OPEN = 1 RPC_SAHPI_SESSION_CLOSE = 2 RPC_SAHPI_DISCOVER = 3 RPC_SAHPI_DOMAIN_INFO_GET = 4 RPC_SAHPI_DRT_ENTRY_GET = 5 RPC_SAHPI_DOMAIN_TAG_SET = 6 RPC_SAHPI_RPT_ENTRY_GET = 7 RPC_SAHPI_RPT_ENTRY_GET_BY_RESOURCE_ID = 8 RPC_SAHPI_RESOURCE_SEVERITY_SET = 9 RPC_SAHPI_RESOURCE_TAG_SET = 10 RPC_SAHPI_RESOURCE_ID_GET = 11 RPC_SAHPI_GET_ID_BY_ENTITY_PATH = 12 RPC_SAHPI_GET_CHILD_ENTITY_PATH = 13 RPC_SAHPI_RESOURCE_FAILED_REMOVE = 14 RPC_SAHPI_EVENT_LOG_INFO_GET = 15 RPC_SAHPI_EVENT_LOG_CAPABILITIES_GET = 16 RPC_SAHPI_EVENT_LOG_ENTRY_GET = 17 RPC_SAHPI_EVENT_LOG_ENTRY_ADD = 18 RPC_SAHPI_EVENT_LOG_CLEAR = 19 RPC_SAHPI_EVENT_LOG_TIME_GET = 20 RPC_SAHPI_EVENT_LOG_TIME_SET = 21 RPC_SAHPI_EVENT_LOG_STATE_GET = 22 RPC_SAHPI_EVENT_LOG_STATE_SET = 23 RPC_SAHPI_EVENT_LOG_OVERFLOW_RESET = 24 RPC_SAHPI_SUBSCRIBE = 25 RPC_SAHPI_UNSUBSCRIBE = 26 RPC_SAHPI_EVENT_GET = 27 RPC_SAHPI_EVENT_ADD = 28 RPC_SAHPI_ALARM_GET_NEXT = 29 RPC_SAHPI_ALARM_GET = 30 RPC_SAHPI_ALARM_ACKNOWLEDGE = 31 RPC_SAHPI_ALARM_ADD = 32 RPC_SAHPI_ALARM_DELETE = 33 RPC_SAHPI_RDR_GET = 34 RPC_SAHPI_RDR_GET_BY_INSTRUMENT_ID = 35 RPC_SAHPI_SENSOR_READING_GET = 36 RPC_SAHPI_SENSOR_THRESHOLDS_GET = 37 RPC_SAHPI_SENSOR_THRESHOLDS_SET = 38 RPC_SAHPI_SENSOR_TYPE_GET = 39 RPC_SAHPI_SENSOR_ENABLE_GET = 40 RPC_SAHPI_SENSOR_ENABLE_SET = 41 RPC_SAHPI_SENSOR_EVENT_ENABLE_GET = 42 RPC_SAHPI_SENSOR_EVENT_ENABLE_SET = 43 RPC_SAHPI_SENSOR_EVENT_MASKS_GET = 44 RPC_SAHPI_SENSOR_EVENT_MASKS_SET = 45 RPC_SAHPI_CONTROL_TYPE_GET = 46 RPC_SAHPI_CONTROL_GET = 47 RPC_SAHPI_CONTROL_SET = 48 RPC_SAHPI_IDR_INFO_GET = 49 RPC_SAHPI_IDR_AREA_HEADER_GET = 50 RPC_SAHPI_IDR_AREA_ADD = 51 RPC_SAHPI_IDR_AREA_ADD_BY_ID = 52 RPC_SAHPI_IDR_AREA_DELETE = 53 RPC_SAHPI_IDR_FIELD_GET = 54 RPC_SAHPI_IDR_FIELD_ADD = 55 RPC_SAHPI_IDR_FIELD_ADD_BY_ID = 56 RPC_SAHPI_IDR_FIELD_SET = 57 RPC_SAHPI_IDR_FIELD_DELETE = 58 RPC_SAHPI_WATCHDOG_TIMER_GET = 59 RPC_SAHPI_WATCHDOG_TIMER_SET = 60 RPC_SAHPI_WATCHDOG_TIMER_RESET = 61 RPC_SAHPI_ANNUNCIATOR_GET_NEXT = 62 RPC_SAHPI_ANNUNCIATOR_GET = 63 RPC_SAHPI_ANNUNCIATOR_ACKNOWLEDGE = 64 RPC_SAHPI_ANNUNCIATOR_ADD = 65 RPC_SAHPI_ANNUNCIATOR_DELETE = 66 RPC_SAHPI_ANNUNCIATOR_MODE_GET = 67 RPC_SAHPI_ANNUNCIATOR_MODE_SET = 68 RPC_SAHPI_DIMI_INFO_GET = 69 RPC_SAHPI_DIMI_TEST_INFO_GET = 70 RPC_SAHPI_DIMI_TEST_READINESS_GET = 71 RPC_SAHPI_DIMI_TEST_START = 72 RPC_SAHPI_DIMI_TEST_CANCEL = 73 RPC_SAHPI_DIMI_TEST_STATUS_GET = 74 RPC_SAHPI_DIMI_TEST_RESULTS_GET = 75 RPC_SAHPI_FUMI_SOURCE_SET = 76 RPC_SAHPI_FUMI_SOURCE_INFO_VALIDATE_START = 77 RPC_SAHPI_FUMI_SOURCE_INFO_GET = 78 RPC_SAHPI_FUMI_TARGET_INFO_GET = 79 RPC_SAHPI_FUMI_BACKUP_START = 80 RPC_SAHPI_FUMI_BANK_BOOT_ORDER_SET = 81 RPC_SAHPI_FUMI_BANK_COPY_START = 82 RPC_SAHPI_FUMI_INSTALL_START = 83 RPC_SAHPI_FUMI_UPGRADE_STATUS_GET = 84 RPC_SAHPI_FUMI_TARGET_VERIFY_START = 85 RPC_SAHPI_FUMI_UPGRADE_CANCEL = 86 RPC_SAHPI_FUMI_ROLLBACK_START = 87 RPC_SAHPI_FUMI_ACTIVATE = 88 RPC_SAHPI_HOTSWAP_POLICY_CANCEL = 89 RPC_SAHPI_RESOURCE_ACTIVE_SET = 90 RPC_SAHPI_RESOURCE_INACTIVE_SET = 91 RPC_SAHPI_AUTO_INSERT_TIMEOUT_GET = 92 RPC_SAHPI_AUTO_INSERT_TIMEOUT_SET = 93 RPC_SAHPI_AUTO_EXTRACT_TIMEOUT_GET = 94 RPC_SAHPI_AUTO_EXTRACT_TIMEOUT_SET = 95 RPC_SAHPI_HOTSWAP_STATE_GET = 96 RPC_SAHPI_HOTSWAP_ACTION_REQUEST = 97 RPC_SAHPI_HOTSWAP_INDICATOR_STATE_GET = 98 RPC_SAHPI_HOTSWAP_INDICATOR_STATE_SET = 99 RPC_SAHPI_PARM_CONTROL = 100 RPC_SAHPI_RESOURCE_LOADID_GET = 101 RPC_SAHPI_RESOURCE_LOADID_SET = 102 RPC_SAHPI_RESOURCE_RESET_STATE_GET = 103 RPC_SAHPI_RESOURCE_RESET_STATE_SET = 104 RPC_SAHPI_RESOURCE_POWER_STATE_GET = 105 RPC_SAHPI_RESOURCE_POWER_STATE_SET = 106 RPC_OHPI_HANDLER_CREATE = 107 RPC_OHPI_HANDLER_DESTROY = 108 RPC_OHPI_HANDLER_INFO = 109 RPC_OHPI_HANDLER_GET_NEXT = 110 RPC_OHPI_HANDLER_FIND = 111 RPC_OHPI_HANDLER_RETRY = 112 RPC_OHPI_GLOBAL_PARAM_GET = 113 RPC_OHPI_GLOBAL_PARAM_SET = 114 RPC_OHPI_INJECT_EVENT = 115 RPC_SAHPI_MY_ENTITY_PATH_GET = 116 RPC_SAHPI_RDR_UPDATE_COUNT_GET = 117 RPC_SAHPI_FUMI_SPEC_INFO_GET = 118 RPC_SAHPI_FUMI_SERVICE_IMPACT_GET = 119 RPC_SAHPI_FUMI_SOURCE_COMPONENT_INFO_GET = 120 RPC_SAHPI_FUMI_TARGET_COMPONENT_INFO_GET = 121 RPC_SAHPI_FUMI_LOGICAL_TARGET_INFO_GET = 122 RPC_SAHPI_FUMI_LOGICAL_TARGET_COMPONENT_INFO_GET = 123 RPC_SAHPI_FUMI_TARGET_VERIFY_MAIN_START = 124 RPC_SAHPI_FUMI_AUTO_ROLLBACK_DISABLE_GET = 125 RPC_SAHPI_FUMI_AUTO_ROLLBACK_DISABLE_SET = 126 RPC_SAHPI_FUMI_ACTIVATE_START = 127 RPC_SAHPI_FUMI_CLEANUP = 128 DEFAULT_PORT = 4743 DEFAULT_DOMAIN_ID = 0 MAX_PLUGIN_NAME_LENGTH = 32 #********************************************************** #* OHPI Complex Data Types #********************************************************** #** # OHPI struct oHpiHandlerInfoT #** class oHpiHandlerInfoT: def __init__( self ): # oHpiHandlerIdT self.id = None # SaHpiUint8T[MAX_PLUGIN_NAME_LENGTH] self.plugin_name = None # SaHpiEntityPathT self.entity_root = None # SaHpiInt32T self.load_failed = None #** # OHPI struct oHpiHandlerConfigT #** class oHpiHandlerConfigT: def __init__( self ): # list of ( name, value ) tuples # Both name and value are SaHpiUint8T[SAHPI_MAX_TEXT_BUFFER_LENGTH] self.items = None openhpi-3.6.1/baselibs/python/openhpi_baselib/HpiUtilGen.py0000644000175100017510000045034612575647300023012 0ustar mohanmohan # -*- python -*- # # Copyright (C) 2012, Pigeon Point Systems # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # # Author(s): # Anton Pak # from openhpi_baselib.HpiDataTypes import * #********************************************************** # HPI Utility Functions (auto-generated) #********************************************************** #********************************************************** # Check Functions for HPI Complex Data Types #********************************************************** #** # Check function for HPI struct SaHpiTextBufferT #** def checkSaHpiTextBufferT( x ): if x is None: return False if not isinstance( x, SaHpiTextBufferT ): return False if not hasattr( x, "DataType" ): return False if not hasattr( x, "Language" ): return False if not hasattr( x, "DataLength" ): return False if not hasattr( x, "Data" ): return False if not isinstance( x.Data, str ): return False if len( x.Data ) != SAHPI_MAX_TEXT_BUFFER_LENGTH: return False return True #** # Check function for HPI struct SaHpiEntityT #** def checkSaHpiEntityT( x ): if x is None: return False if not isinstance( x, SaHpiEntityT ): return False if not hasattr( x, "EntityType" ): return False if not hasattr( x, "EntityLocation" ): return False return True #** # Check function for HPI struct SaHpiEntityPathT #** def checkSaHpiEntityPathT( x ): if x is None: return False if not isinstance( x, SaHpiEntityPathT ): return False if not hasattr( x, "Entry" ): return False if not isinstance( x.Entry, list ): return False if len( x.Entry ) != SAHPI_MAX_ENTITY_PATH: return False for i in range( 0, SAHPI_MAX_ENTITY_PATH ): if not checkSaHpiEntityT( x.Entry[i] ): return False return True #** # Check function for HPI union SaHpiSensorReadingUnionT #** def checkSaHpiSensorReadingUnionT( x, mod ): if x is None: return False if not isinstance( x, SaHpiSensorReadingUnionT ): return False if mod == SAHPI_SENSOR_READING_TYPE_INT64: if not hasattr( x, "SensorInt64" ): return False if mod == SAHPI_SENSOR_READING_TYPE_UINT64: if not hasattr( x, "SensorUint64" ): return False if mod == SAHPI_SENSOR_READING_TYPE_FLOAT64: if not hasattr( x, "SensorFloat64" ): return False if mod == SAHPI_SENSOR_READING_TYPE_BUFFER: if not hasattr( x, "SensorBuffer" ): return False if mod == SAHPI_SENSOR_READING_TYPE_BUFFER: if not isinstance( x.SensorBuffer, str ): return False if mod == SAHPI_SENSOR_READING_TYPE_BUFFER: if len( x.SensorBuffer ) != SAHPI_SENSOR_BUFFER_LENGTH: return False return True #** # Check function for HPI struct SaHpiSensorReadingT #** def checkSaHpiSensorReadingT( x ): if x is None: return False if not isinstance( x, SaHpiSensorReadingT ): return False if not hasattr( x, "IsSupported" ): return False if not hasattr( x, "Type" ): return False if not hasattr( x, "Value" ): return False if not checkSaHpiSensorReadingUnionT( x.Value, x.Type ): return False return True #** # Check function for HPI struct SaHpiSensorThresholdsT #** def checkSaHpiSensorThresholdsT( x ): if x is None: return False if not isinstance( x, SaHpiSensorThresholdsT ): return False if not hasattr( x, "LowCritical" ): return False if not checkSaHpiSensorReadingT( x.LowCritical ): return False if not hasattr( x, "LowMajor" ): return False if not checkSaHpiSensorReadingT( x.LowMajor ): return False if not hasattr( x, "LowMinor" ): return False if not checkSaHpiSensorReadingT( x.LowMinor ): return False if not hasattr( x, "UpCritical" ): return False if not checkSaHpiSensorReadingT( x.UpCritical ): return False if not hasattr( x, "UpMajor" ): return False if not checkSaHpiSensorReadingT( x.UpMajor ): return False if not hasattr( x, "UpMinor" ): return False if not checkSaHpiSensorReadingT( x.UpMinor ): return False if not hasattr( x, "PosThdHysteresis" ): return False if not checkSaHpiSensorReadingT( x.PosThdHysteresis ): return False if not hasattr( x, "NegThdHysteresis" ): return False if not checkSaHpiSensorReadingT( x.NegThdHysteresis ): return False return True #** # Check function for HPI struct SaHpiSensorRangeT #** def checkSaHpiSensorRangeT( x ): if x is None: return False if not isinstance( x, SaHpiSensorRangeT ): return False if not hasattr( x, "Flags" ): return False if not hasattr( x, "Max" ): return False if not checkSaHpiSensorReadingT( x.Max ): return False if not hasattr( x, "Min" ): return False if not checkSaHpiSensorReadingT( x.Min ): return False if not hasattr( x, "Nominal" ): return False if not checkSaHpiSensorReadingT( x.Nominal ): return False if not hasattr( x, "NormalMax" ): return False if not checkSaHpiSensorReadingT( x.NormalMax ): return False if not hasattr( x, "NormalMin" ): return False if not checkSaHpiSensorReadingT( x.NormalMin ): return False return True #** # Check function for HPI struct SaHpiSensorDataFormatT #** def checkSaHpiSensorDataFormatT( x ): if x is None: return False if not isinstance( x, SaHpiSensorDataFormatT ): return False if not hasattr( x, "IsSupported" ): return False if not hasattr( x, "ReadingType" ): return False if not hasattr( x, "BaseUnits" ): return False if not hasattr( x, "ModifierUnits" ): return False if not hasattr( x, "ModifierUse" ): return False if not hasattr( x, "Percentage" ): return False if not hasattr( x, "Range" ): return False if not checkSaHpiSensorRangeT( x.Range ): return False if not hasattr( x, "AccuracyFactor" ): return False return True #** # Check function for HPI struct SaHpiSensorThdDefnT #** def checkSaHpiSensorThdDefnT( x ): if x is None: return False if not isinstance( x, SaHpiSensorThdDefnT ): return False if not hasattr( x, "IsAccessible" ): return False if not hasattr( x, "ReadThold" ): return False if not hasattr( x, "WriteThold" ): return False if not hasattr( x, "Nonlinear" ): return False return True #** # Check function for HPI struct SaHpiSensorRecT #** def checkSaHpiSensorRecT( x ): if x is None: return False if not isinstance( x, SaHpiSensorRecT ): return False if not hasattr( x, "Num" ): return False if not hasattr( x, "Type" ): return False if not hasattr( x, "Category" ): return False if not hasattr( x, "EnableCtrl" ): return False if not hasattr( x, "EventCtrl" ): return False if not hasattr( x, "Events" ): return False if not hasattr( x, "DataFormat" ): return False if not checkSaHpiSensorDataFormatT( x.DataFormat ): return False if not hasattr( x, "ThresholdDefn" ): return False if not checkSaHpiSensorThdDefnT( x.ThresholdDefn ): return False if not hasattr( x, "Oem" ): return False return True #** # Check function for HPI struct SaHpiCtrlStateStreamT #** def checkSaHpiCtrlStateStreamT( x ): if x is None: return False if not isinstance( x, SaHpiCtrlStateStreamT ): return False if not hasattr( x, "Repeat" ): return False if not hasattr( x, "StreamLength" ): return False if not hasattr( x, "Stream" ): return False if not isinstance( x.Stream, str ): return False if len( x.Stream ) != SAHPI_CTRL_MAX_STREAM_LENGTH: return False return True #** # Check function for HPI struct SaHpiCtrlStateTextT #** def checkSaHpiCtrlStateTextT( x ): if x is None: return False if not isinstance( x, SaHpiCtrlStateTextT ): return False if not hasattr( x, "Line" ): return False if not hasattr( x, "Text" ): return False if not checkSaHpiTextBufferT( x.Text ): return False return True #** # Check function for HPI struct SaHpiCtrlStateOemT #** def checkSaHpiCtrlStateOemT( x ): if x is None: return False if not isinstance( x, SaHpiCtrlStateOemT ): return False if not hasattr( x, "MId" ): return False if not hasattr( x, "BodyLength" ): return False if not hasattr( x, "Body" ): return False if not isinstance( x.Body, str ): return False if len( x.Body ) != SAHPI_CTRL_MAX_OEM_BODY_LENGTH: return False return True #** # Check function for HPI union SaHpiCtrlStateUnionT #** def checkSaHpiCtrlStateUnionT( x, mod ): if x is None: return False if not isinstance( x, SaHpiCtrlStateUnionT ): return False if mod == SAHPI_CTRL_TYPE_DIGITAL: if not hasattr( x, "Digital" ): return False if mod == SAHPI_CTRL_TYPE_DISCRETE: if not hasattr( x, "Discrete" ): return False if mod == SAHPI_CTRL_TYPE_ANALOG: if not hasattr( x, "Analog" ): return False if mod == SAHPI_CTRL_TYPE_STREAM: if not hasattr( x, "Stream" ): return False if mod == SAHPI_CTRL_TYPE_STREAM: if not checkSaHpiCtrlStateStreamT( x.Stream ): return False if mod == SAHPI_CTRL_TYPE_TEXT: if not hasattr( x, "Text" ): return False if mod == SAHPI_CTRL_TYPE_TEXT: if not checkSaHpiCtrlStateTextT( x.Text ): return False if mod == SAHPI_CTRL_TYPE_OEM: if not hasattr( x, "Oem" ): return False if mod == SAHPI_CTRL_TYPE_OEM: if not checkSaHpiCtrlStateOemT( x.Oem ): return False return True #** # Check function for HPI struct SaHpiCtrlStateT #** def checkSaHpiCtrlStateT( x ): if x is None: return False if not isinstance( x, SaHpiCtrlStateT ): return False if not hasattr( x, "Type" ): return False if not hasattr( x, "StateUnion" ): return False if not checkSaHpiCtrlStateUnionT( x.StateUnion, x.Type ): return False return True #** # Check function for HPI struct SaHpiCtrlRecDigitalT #** def checkSaHpiCtrlRecDigitalT( x ): if x is None: return False if not isinstance( x, SaHpiCtrlRecDigitalT ): return False if not hasattr( x, "Default" ): return False return True #** # Check function for HPI struct SaHpiCtrlRecDiscreteT #** def checkSaHpiCtrlRecDiscreteT( x ): if x is None: return False if not isinstance( x, SaHpiCtrlRecDiscreteT ): return False if not hasattr( x, "Default" ): return False return True #** # Check function for HPI struct SaHpiCtrlRecAnalogT #** def checkSaHpiCtrlRecAnalogT( x ): if x is None: return False if not isinstance( x, SaHpiCtrlRecAnalogT ): return False if not hasattr( x, "Min" ): return False if not hasattr( x, "Max" ): return False if not hasattr( x, "Default" ): return False return True #** # Check function for HPI struct SaHpiCtrlRecStreamT #** def checkSaHpiCtrlRecStreamT( x ): if x is None: return False if not isinstance( x, SaHpiCtrlRecStreamT ): return False if not hasattr( x, "Default" ): return False if not checkSaHpiCtrlStateStreamT( x.Default ): return False return True #** # Check function for HPI struct SaHpiCtrlRecTextT #** def checkSaHpiCtrlRecTextT( x ): if x is None: return False if not isinstance( x, SaHpiCtrlRecTextT ): return False if not hasattr( x, "MaxChars" ): return False if not hasattr( x, "MaxLines" ): return False if not hasattr( x, "Language" ): return False if not hasattr( x, "DataType" ): return False if not hasattr( x, "Default" ): return False if not checkSaHpiCtrlStateTextT( x.Default ): return False return True #** # Check function for HPI struct SaHpiCtrlRecOemT #** def checkSaHpiCtrlRecOemT( x ): if x is None: return False if not isinstance( x, SaHpiCtrlRecOemT ): return False if not hasattr( x, "MId" ): return False if not hasattr( x, "ConfigData" ): return False if not isinstance( x.ConfigData, str ): return False if len( x.ConfigData ) != SAHPI_CTRL_OEM_CONFIG_LENGTH: return False if not hasattr( x, "Default" ): return False if not checkSaHpiCtrlStateOemT( x.Default ): return False return True #** # Check function for HPI union SaHpiCtrlRecUnionT #** def checkSaHpiCtrlRecUnionT( x, mod ): if x is None: return False if not isinstance( x, SaHpiCtrlRecUnionT ): return False if mod == SAHPI_CTRL_TYPE_DIGITAL: if not hasattr( x, "Digital" ): return False if mod == SAHPI_CTRL_TYPE_DIGITAL: if not checkSaHpiCtrlRecDigitalT( x.Digital ): return False if mod == SAHPI_CTRL_TYPE_DISCRETE: if not hasattr( x, "Discrete" ): return False if mod == SAHPI_CTRL_TYPE_DISCRETE: if not checkSaHpiCtrlRecDiscreteT( x.Discrete ): return False if mod == SAHPI_CTRL_TYPE_ANALOG: if not hasattr( x, "Analog" ): return False if mod == SAHPI_CTRL_TYPE_ANALOG: if not checkSaHpiCtrlRecAnalogT( x.Analog ): return False if mod == SAHPI_CTRL_TYPE_STREAM: if not hasattr( x, "Stream" ): return False if mod == SAHPI_CTRL_TYPE_STREAM: if not checkSaHpiCtrlRecStreamT( x.Stream ): return False if mod == SAHPI_CTRL_TYPE_TEXT: if not hasattr( x, "Text" ): return False if mod == SAHPI_CTRL_TYPE_TEXT: if not checkSaHpiCtrlRecTextT( x.Text ): return False if mod == SAHPI_CTRL_TYPE_OEM: if not hasattr( x, "Oem" ): return False if mod == SAHPI_CTRL_TYPE_OEM: if not checkSaHpiCtrlRecOemT( x.Oem ): return False return True #** # Check function for HPI struct SaHpiCtrlDefaultModeT #** def checkSaHpiCtrlDefaultModeT( x ): if x is None: return False if not isinstance( x, SaHpiCtrlDefaultModeT ): return False if not hasattr( x, "Mode" ): return False if not hasattr( x, "ReadOnly" ): return False return True #** # Check function for HPI struct SaHpiCtrlRecT #** def checkSaHpiCtrlRecT( x ): if x is None: return False if not isinstance( x, SaHpiCtrlRecT ): return False if not hasattr( x, "Num" ): return False if not hasattr( x, "OutputType" ): return False if not hasattr( x, "Type" ): return False if not hasattr( x, "TypeUnion" ): return False if not checkSaHpiCtrlRecUnionT( x.TypeUnion, x.Type ): return False if not hasattr( x, "DefaultMode" ): return False if not checkSaHpiCtrlDefaultModeT( x.DefaultMode ): return False if not hasattr( x, "WriteOnly" ): return False if not hasattr( x, "Oem" ): return False return True #** # Check function for HPI struct SaHpiIdrFieldT #** def checkSaHpiIdrFieldT( x ): if x is None: return False if not isinstance( x, SaHpiIdrFieldT ): return False if not hasattr( x, "AreaId" ): return False if not hasattr( x, "FieldId" ): return False if not hasattr( x, "Type" ): return False if not hasattr( x, "ReadOnly" ): return False if not hasattr( x, "Field" ): return False if not checkSaHpiTextBufferT( x.Field ): return False return True #** # Check function for HPI struct SaHpiIdrAreaHeaderT #** def checkSaHpiIdrAreaHeaderT( x ): if x is None: return False if not isinstance( x, SaHpiIdrAreaHeaderT ): return False if not hasattr( x, "AreaId" ): return False if not hasattr( x, "Type" ): return False if not hasattr( x, "ReadOnly" ): return False if not hasattr( x, "NumFields" ): return False return True #** # Check function for HPI struct SaHpiIdrInfoT #** def checkSaHpiIdrInfoT( x ): if x is None: return False if not isinstance( x, SaHpiIdrInfoT ): return False if not hasattr( x, "IdrId" ): return False if not hasattr( x, "UpdateCount" ): return False if not hasattr( x, "ReadOnly" ): return False if not hasattr( x, "NumAreas" ): return False return True #** # Check function for HPI struct SaHpiInventoryRecT #** def checkSaHpiInventoryRecT( x ): if x is None: return False if not isinstance( x, SaHpiInventoryRecT ): return False if not hasattr( x, "IdrId" ): return False if not hasattr( x, "Persistent" ): return False if not hasattr( x, "Oem" ): return False return True #** # Check function for HPI struct SaHpiWatchdogT #** def checkSaHpiWatchdogT( x ): if x is None: return False if not isinstance( x, SaHpiWatchdogT ): return False if not hasattr( x, "Log" ): return False if not hasattr( x, "Running" ): return False if not hasattr( x, "TimerUse" ): return False if not hasattr( x, "TimerAction" ): return False if not hasattr( x, "PretimerInterrupt" ): return False if not hasattr( x, "PreTimeoutInterval" ): return False if not hasattr( x, "TimerUseExpFlags" ): return False if not hasattr( x, "InitialCount" ): return False if not hasattr( x, "PresentCount" ): return False return True #** # Check function for HPI struct SaHpiWatchdogRecT #** def checkSaHpiWatchdogRecT( x ): if x is None: return False if not isinstance( x, SaHpiWatchdogRecT ): return False if not hasattr( x, "WatchdogNum" ): return False if not hasattr( x, "Oem" ): return False return True #** # Check function for HPI struct SaHpiDimiTestAffectedEntityT #** def checkSaHpiDimiTestAffectedEntityT( x ): if x is None: return False if not isinstance( x, SaHpiDimiTestAffectedEntityT ): return False if not hasattr( x, "EntityImpacted" ): return False if not checkSaHpiEntityPathT( x.EntityImpacted ): return False if not hasattr( x, "ServiceImpact" ): return False return True #** # Check function for HPI struct SaHpiDimiTestResultsT #** def checkSaHpiDimiTestResultsT( x ): if x is None: return False if not isinstance( x, SaHpiDimiTestResultsT ): return False if not hasattr( x, "ResultTimeStamp" ): return False if not hasattr( x, "RunDuration" ): return False if not hasattr( x, "LastRunStatus" ): return False if not hasattr( x, "TestErrorCode" ): return False if not hasattr( x, "TestResultString" ): return False if not checkSaHpiTextBufferT( x.TestResultString ): return False if not hasattr( x, "TestResultStringIsURI" ): return False return True #** # Check function for HPI union SaHpiDimiTestParamValueT #** def checkSaHpiDimiTestParamValueT( x, mod ): if x is None: return False if not isinstance( x, SaHpiDimiTestParamValueT ): return False if mod == SAHPI_DIMITEST_PARAM_TYPE_INT32: if not hasattr( x, "paramint" ): return False if mod == SAHPI_DIMITEST_PARAM_TYPE_FLOAT64: if not hasattr( x, "parambool" ): return False if mod == SAHPI_DIMITEST_PARAM_TYPE_BOOLEAN: if not hasattr( x, "paramfloat" ): return False if mod == SAHPI_DIMITEST_PARAM_TYPE_TEXT: if not hasattr( x, "paramtext" ): return False if mod == SAHPI_DIMITEST_PARAM_TYPE_TEXT: if not checkSaHpiTextBufferT( x.paramtext ): return False return True #** # Check function for HPI union SaHpiDimiTestParameterValueUnionT #** def checkSaHpiDimiTestParameterValueUnionT( x, mod ): if x is None: return False if not isinstance( x, SaHpiDimiTestParameterValueUnionT ): return False if mod == SAHPI_DIMITEST_PARAM_TYPE_INT32: if not hasattr( x, "IntValue" ): return False if mod == SAHPI_DIMITEST_PARAM_TYPE_FLOAT64: if not hasattr( x, "FloatValue" ): return False if mod == SAHPI_DIMITEST_PARAM_TYPE_BOOLEAN: if not hasattr( x, "FloatValue" ): return False if mod == SAHPI_DIMITEST_PARAM_TYPE_TEXT: if not hasattr( x, "FloatValue" ): return False return True #** # Check function for HPI struct SaHpiDimiTestParamsDefinitionT #** def checkSaHpiDimiTestParamsDefinitionT( x ): if x is None: return False if not isinstance( x, SaHpiDimiTestParamsDefinitionT ): return False if not hasattr( x, "ParamName" ): return False if not isinstance( x.ParamName, str ): return False if len( x.ParamName ) != SAHPI_DIMITEST_PARAM_NAME_LEN: return False if not hasattr( x, "ParamInfo" ): return False if not checkSaHpiTextBufferT( x.ParamInfo ): return False if not hasattr( x, "ParamType" ): return False if not hasattr( x, "MinValue" ): return False if not checkSaHpiDimiTestParameterValueUnionT( x.MinValue, x.ParamType ): return False if not hasattr( x, "MaxValue" ): return False if not checkSaHpiDimiTestParameterValueUnionT( x.MaxValue, x.ParamType ): return False if not hasattr( x, "DefaultParam" ): return False if not checkSaHpiDimiTestParamValueT( x.DefaultParam, x.ParamType ): return False return True #** # Check function for HPI struct SaHpiDimiTestT #** def checkSaHpiDimiTestT( x ): if x is None: return False if not isinstance( x, SaHpiDimiTestT ): return False if not hasattr( x, "TestName" ): return False if not checkSaHpiTextBufferT( x.TestName ): return False if not hasattr( x, "ServiceImpact" ): return False if not hasattr( x, "EntitiesImpacted" ): return False if not isinstance( x.EntitiesImpacted, list ): return False if len( x.EntitiesImpacted ) != SAHPI_DIMITEST_MAX_ENTITIESIMPACTED: return False for i in range( 0, SAHPI_DIMITEST_MAX_ENTITIESIMPACTED ): if not checkSaHpiDimiTestAffectedEntityT( x.EntitiesImpacted[i] ): return False if not hasattr( x, "NeedServiceOS" ): return False if not hasattr( x, "ServiceOS" ): return False if not checkSaHpiTextBufferT( x.ServiceOS ): return False if not hasattr( x, "ExpectedRunDuration" ): return False if not hasattr( x, "TestCapabilities" ): return False if not hasattr( x, "TestParameters" ): return False if not isinstance( x.TestParameters, list ): return False if len( x.TestParameters ) != SAHPI_DIMITEST_MAX_PARAMETERS: return False for i in range( 0, SAHPI_DIMITEST_MAX_PARAMETERS ): if not checkSaHpiDimiTestParamsDefinitionT( x.TestParameters[i] ): return False return True #** # Check function for HPI struct SaHpiDimiTestVariableParamsT #** def checkSaHpiDimiTestVariableParamsT( x ): if x is None: return False if not isinstance( x, SaHpiDimiTestVariableParamsT ): return False if not hasattr( x, "ParamName" ): return False if not isinstance( x.ParamName, str ): return False if len( x.ParamName ) != SAHPI_DIMITEST_PARAM_NAME_LEN: return False if not hasattr( x, "ParamType" ): return False if not hasattr( x, "Value" ): return False if not checkSaHpiDimiTestParamValueT( x.Value, x.ParamType ): return False return True #** # Check function for HPI struct SaHpiDimiInfoT #** def checkSaHpiDimiInfoT( x ): if x is None: return False if not isinstance( x, SaHpiDimiInfoT ): return False if not hasattr( x, "NumberOfTests" ): return False if not hasattr( x, "TestNumUpdateCounter" ): return False return True #** # Check function for HPI struct SaHpiDimiRecT #** def checkSaHpiDimiRecT( x ): if x is None: return False if not isinstance( x, SaHpiDimiRecT ): return False if not hasattr( x, "DimiNum" ): return False if not hasattr( x, "Oem" ): return False return True #** # Check function for HPI struct SaHpiFumiSafDefinedSpecInfoT #** def checkSaHpiFumiSafDefinedSpecInfoT( x ): if x is None: return False if not isinstance( x, SaHpiFumiSafDefinedSpecInfoT ): return False if not hasattr( x, "SpecID" ): return False if not hasattr( x, "RevisionID" ): return False return True #** # Check function for HPI struct SaHpiFumiOemDefinedSpecInfoT #** def checkSaHpiFumiOemDefinedSpecInfoT( x ): if x is None: return False if not isinstance( x, SaHpiFumiOemDefinedSpecInfoT ): return False if not hasattr( x, "Mid" ): return False if not hasattr( x, "BodyLength" ): return False if not hasattr( x, "Body" ): return False if not isinstance( x.Body, str ): return False if len( x.Body ) != SAHPI_FUMI_MAX_OEM_BODY_LENGTH: return False return True #** # Check function for HPI union SaHpiFumiSpecInfoTypeUnionT #** def checkSaHpiFumiSpecInfoTypeUnionT( x, mod ): if x is None: return False if not isinstance( x, SaHpiFumiSpecInfoTypeUnionT ): return False if mod == SAHPI_FUMI_SPEC_INFO_NONE: if not hasattr( x, "None" ): return False if mod == SAHPI_FUMI_SPEC_INFO_SAF_DEFINED: if not hasattr( x, "SafDefined" ): return False if mod == SAHPI_FUMI_SPEC_INFO_SAF_DEFINED: if not checkSaHpiFumiSafDefinedSpecInfoT( x.SafDefined ): return False if mod == SAHPI_FUMI_SPEC_INFO_OEM_DEFINED: if not hasattr( x, "OemDefined" ): return False if mod == SAHPI_FUMI_SPEC_INFO_OEM_DEFINED: if not checkSaHpiFumiOemDefinedSpecInfoT( x.OemDefined ): return False return True #** # Check function for HPI struct SaHpiFumiSpecInfoT #** def checkSaHpiFumiSpecInfoT( x ): if x is None: return False if not isinstance( x, SaHpiFumiSpecInfoT ): return False if not hasattr( x, "SpecInfoType" ): return False if not hasattr( x, "SpecInfoTypeUnion" ): return False if not checkSaHpiFumiSpecInfoTypeUnionT( x.SpecInfoTypeUnion, x.SpecInfoType ): return False return True #** # Check function for HPI struct SaHpiFumiFirmwareInstanceInfoT #** def checkSaHpiFumiFirmwareInstanceInfoT( x ): if x is None: return False if not isinstance( x, SaHpiFumiFirmwareInstanceInfoT ): return False if not hasattr( x, "InstancePresent" ): return False if not hasattr( x, "Identifier" ): return False if not checkSaHpiTextBufferT( x.Identifier ): return False if not hasattr( x, "Description" ): return False if not checkSaHpiTextBufferT( x.Description ): return False if not hasattr( x, "DateTime" ): return False if not checkSaHpiTextBufferT( x.DateTime ): return False if not hasattr( x, "MajorVersion" ): return False if not hasattr( x, "MinorVersion" ): return False if not hasattr( x, "AuxVersion" ): return False return True #** # Check function for HPI struct SaHpiFumiImpactedEntityT #** def checkSaHpiFumiImpactedEntityT( x ): if x is None: return False if not isinstance( x, SaHpiFumiImpactedEntityT ): return False if not hasattr( x, "ImpactedEntity" ): return False if not checkSaHpiEntityPathT( x.ImpactedEntity ): return False if not hasattr( x, "ServiceImpact" ): return False return True #** # Check function for HPI struct SaHpiFumiServiceImpactDataT #** def checkSaHpiFumiServiceImpactDataT( x ): if x is None: return False if not isinstance( x, SaHpiFumiServiceImpactDataT ): return False if not hasattr( x, "NumEntities" ): return False if not hasattr( x, "ImpactedEntities" ): return False if not isinstance( x.ImpactedEntities, list ): return False if len( x.ImpactedEntities ) != SAHPI_FUMI_MAX_ENTITIES_IMPACTED: return False for i in range( 0, SAHPI_FUMI_MAX_ENTITIES_IMPACTED ): if not checkSaHpiFumiImpactedEntityT( x.ImpactedEntities[i] ): return False return True #** # Check function for HPI struct SaHpiFumiSourceInfoT #** def checkSaHpiFumiSourceInfoT( x ): if x is None: return False if not isinstance( x, SaHpiFumiSourceInfoT ): return False if not hasattr( x, "SourceUri" ): return False if not checkSaHpiTextBufferT( x.SourceUri ): return False if not hasattr( x, "SourceStatus" ): return False if not hasattr( x, "Identifier" ): return False if not checkSaHpiTextBufferT( x.Identifier ): return False if not hasattr( x, "Description" ): return False if not checkSaHpiTextBufferT( x.Description ): return False if not hasattr( x, "DateTime" ): return False if not checkSaHpiTextBufferT( x.DateTime ): return False if not hasattr( x, "MajorVersion" ): return False if not hasattr( x, "MinorVersion" ): return False if not hasattr( x, "AuxVersion" ): return False return True #** # Check function for HPI struct SaHpiFumiComponentInfoT #** def checkSaHpiFumiComponentInfoT( x ): if x is None: return False if not isinstance( x, SaHpiFumiComponentInfoT ): return False if not hasattr( x, "EntryId" ): return False if not hasattr( x, "ComponentId" ): return False if not hasattr( x, "MainFwInstance" ): return False if not checkSaHpiFumiFirmwareInstanceInfoT( x.MainFwInstance ): return False if not hasattr( x, "ComponentFlags" ): return False return True #** # Check function for HPI struct SaHpiFumiBankInfoT #** def checkSaHpiFumiBankInfoT( x ): if x is None: return False if not isinstance( x, SaHpiFumiBankInfoT ): return False if not hasattr( x, "BankId" ): return False if not hasattr( x, "BankSize" ): return False if not hasattr( x, "Position" ): return False if not hasattr( x, "BankState" ): return False if not hasattr( x, "Identifier" ): return False if not checkSaHpiTextBufferT( x.Identifier ): return False if not hasattr( x, "Description" ): return False if not checkSaHpiTextBufferT( x.Description ): return False if not hasattr( x, "DateTime" ): return False if not checkSaHpiTextBufferT( x.DateTime ): return False if not hasattr( x, "MajorVersion" ): return False if not hasattr( x, "MinorVersion" ): return False if not hasattr( x, "AuxVersion" ): return False return True #** # Check function for HPI struct SaHpiFumiLogicalBankInfoT #** def checkSaHpiFumiLogicalBankInfoT( x ): if x is None: return False if not isinstance( x, SaHpiFumiLogicalBankInfoT ): return False if not hasattr( x, "FirmwarePersistentLocationCount" ): return False if not hasattr( x, "BankStateFlags" ): return False if not hasattr( x, "PendingFwInstance" ): return False if not checkSaHpiFumiFirmwareInstanceInfoT( x.PendingFwInstance ): return False if not hasattr( x, "RollbackFwInstance" ): return False if not checkSaHpiFumiFirmwareInstanceInfoT( x.RollbackFwInstance ): return False return True #** # Check function for HPI struct SaHpiFumiLogicalComponentInfoT #** def checkSaHpiFumiLogicalComponentInfoT( x ): if x is None: return False if not isinstance( x, SaHpiFumiLogicalComponentInfoT ): return False if not hasattr( x, "EntryId" ): return False if not hasattr( x, "ComponentId" ): return False if not hasattr( x, "PendingFwInstance" ): return False if not checkSaHpiFumiFirmwareInstanceInfoT( x.PendingFwInstance ): return False if not hasattr( x, "RollbackFwInstance" ): return False if not checkSaHpiFumiFirmwareInstanceInfoT( x.RollbackFwInstance ): return False if not hasattr( x, "ComponentFlags" ): return False return True #** # Check function for HPI struct SaHpiFumiRecT #** def checkSaHpiFumiRecT( x ): if x is None: return False if not isinstance( x, SaHpiFumiRecT ): return False if not hasattr( x, "Num" ): return False if not hasattr( x, "AccessProt" ): return False if not hasattr( x, "Capability" ): return False if not hasattr( x, "NumBanks" ): return False if not hasattr( x, "Oem" ): return False return True #** # Check function for HPI struct SaHpiResourceEventT #** def checkSaHpiResourceEventT( x ): if x is None: return False if not isinstance( x, SaHpiResourceEventT ): return False if not hasattr( x, "ResourceEventType" ): return False return True #** # Check function for HPI struct SaHpiDomainEventT #** def checkSaHpiDomainEventT( x ): if x is None: return False if not isinstance( x, SaHpiDomainEventT ): return False if not hasattr( x, "Type" ): return False if not hasattr( x, "DomainId" ): return False return True #** # Check function for HPI struct SaHpiSensorEventT #** def checkSaHpiSensorEventT( x ): if x is None: return False if not isinstance( x, SaHpiSensorEventT ): return False if not hasattr( x, "SensorNum" ): return False if not hasattr( x, "SensorType" ): return False if not hasattr( x, "EventCategory" ): return False if not hasattr( x, "Assertion" ): return False if not hasattr( x, "EventState" ): return False if not hasattr( x, "OptionalDataPresent" ): return False if not hasattr( x, "TriggerReading" ): return False if not checkSaHpiSensorReadingT( x.TriggerReading ): return False if not hasattr( x, "TriggerThreshold" ): return False if not checkSaHpiSensorReadingT( x.TriggerThreshold ): return False if not hasattr( x, "PreviousState" ): return False if not hasattr( x, "CurrentState" ): return False if not hasattr( x, "Oem" ): return False if not hasattr( x, "SensorSpecific" ): return False return True #** # Check function for HPI struct SaHpiSensorEnableChangeEventT #** def checkSaHpiSensorEnableChangeEventT( x ): if x is None: return False if not isinstance( x, SaHpiSensorEnableChangeEventT ): return False if not hasattr( x, "SensorNum" ): return False if not hasattr( x, "SensorType" ): return False if not hasattr( x, "EventCategory" ): return False if not hasattr( x, "SensorEnable" ): return False if not hasattr( x, "SensorEventEnable" ): return False if not hasattr( x, "AssertEventMask" ): return False if not hasattr( x, "DeassertEventMask" ): return False if not hasattr( x, "OptionalDataPresent" ): return False if not hasattr( x, "CurrentState" ): return False if not hasattr( x, "CriticalAlarms" ): return False if not hasattr( x, "MajorAlarms" ): return False if not hasattr( x, "MinorAlarms" ): return False return True #** # Check function for HPI struct SaHpiHotSwapEventT #** def checkSaHpiHotSwapEventT( x ): if x is None: return False if not isinstance( x, SaHpiHotSwapEventT ): return False if not hasattr( x, "HotSwapState" ): return False if not hasattr( x, "PreviousHotSwapState" ): return False if not hasattr( x, "CauseOfStateChange" ): return False return True #** # Check function for HPI struct SaHpiWatchdogEventT #** def checkSaHpiWatchdogEventT( x ): if x is None: return False if not isinstance( x, SaHpiWatchdogEventT ): return False if not hasattr( x, "WatchdogNum" ): return False if not hasattr( x, "WatchdogAction" ): return False if not hasattr( x, "WatchdogPreTimerAction" ): return False if not hasattr( x, "WatchdogUse" ): return False return True #** # Check function for HPI struct SaHpiHpiSwEventT #** def checkSaHpiHpiSwEventT( x ): if x is None: return False if not isinstance( x, SaHpiHpiSwEventT ): return False if not hasattr( x, "MId" ): return False if not hasattr( x, "Type" ): return False if not hasattr( x, "EventData" ): return False if not checkSaHpiTextBufferT( x.EventData ): return False return True #** # Check function for HPI struct SaHpiOemEventT #** def checkSaHpiOemEventT( x ): if x is None: return False if not isinstance( x, SaHpiOemEventT ): return False if not hasattr( x, "MId" ): return False if not hasattr( x, "OemEventData" ): return False if not checkSaHpiTextBufferT( x.OemEventData ): return False return True #** # Check function for HPI struct SaHpiUserEventT #** def checkSaHpiUserEventT( x ): if x is None: return False if not isinstance( x, SaHpiUserEventT ): return False if not hasattr( x, "UserEventData" ): return False if not checkSaHpiTextBufferT( x.UserEventData ): return False return True #** # Check function for HPI struct SaHpiDimiEventT #** def checkSaHpiDimiEventT( x ): if x is None: return False if not isinstance( x, SaHpiDimiEventT ): return False if not hasattr( x, "DimiNum" ): return False if not hasattr( x, "TestNum" ): return False if not hasattr( x, "DimiTestRunStatus" ): return False if not hasattr( x, "DimiTestPercentCompleted" ): return False return True #** # Check function for HPI struct SaHpiDimiUpdateEventT #** def checkSaHpiDimiUpdateEventT( x ): if x is None: return False if not isinstance( x, SaHpiDimiUpdateEventT ): return False if not hasattr( x, "DimiNum" ): return False return True #** # Check function for HPI struct SaHpiFumiEventT #** def checkSaHpiFumiEventT( x ): if x is None: return False if not isinstance( x, SaHpiFumiEventT ): return False if not hasattr( x, "FumiNum" ): return False if not hasattr( x, "BankNum" ): return False if not hasattr( x, "UpgradeStatus" ): return False return True #** # Check function for HPI union SaHpiEventUnionT #** def checkSaHpiEventUnionT( x, mod ): if x is None: return False if not isinstance( x, SaHpiEventUnionT ): return False if mod == SAHPI_ET_RESOURCE: if not hasattr( x, "ResourceEvent" ): return False if mod == SAHPI_ET_RESOURCE: if not checkSaHpiResourceEventT( x.ResourceEvent ): return False if mod == SAHPI_ET_DOMAIN: if not hasattr( x, "DomainEvent" ): return False if mod == SAHPI_ET_DOMAIN: if not checkSaHpiDomainEventT( x.DomainEvent ): return False if mod == SAHPI_ET_SENSOR: if not hasattr( x, "SensorEvent" ): return False if mod == SAHPI_ET_SENSOR: if not checkSaHpiSensorEventT( x.SensorEvent ): return False if mod == SAHPI_ET_SENSOR_ENABLE_CHANGE: if not hasattr( x, "SensorEnableChangeEvent" ): return False if mod == SAHPI_ET_SENSOR_ENABLE_CHANGE: if not checkSaHpiSensorEnableChangeEventT( x.SensorEnableChangeEvent ): return False if mod == SAHPI_ET_HOTSWAP: if not hasattr( x, "HotSwapEvent" ): return False if mod == SAHPI_ET_HOTSWAP: if not checkSaHpiHotSwapEventT( x.HotSwapEvent ): return False if mod == SAHPI_ET_WATCHDOG: if not hasattr( x, "WatchdogEvent" ): return False if mod == SAHPI_ET_WATCHDOG: if not checkSaHpiWatchdogEventT( x.WatchdogEvent ): return False if mod == SAHPI_ET_HPI_SW: if not hasattr( x, "HpiSwEvent" ): return False if mod == SAHPI_ET_HPI_SW: if not checkSaHpiHpiSwEventT( x.HpiSwEvent ): return False if mod == SAHPI_ET_OEM: if not hasattr( x, "OemEvent" ): return False if mod == SAHPI_ET_OEM: if not checkSaHpiOemEventT( x.OemEvent ): return False if mod == SAHPI_ET_USER: if not hasattr( x, "UserEvent" ): return False if mod == SAHPI_ET_USER: if not checkSaHpiUserEventT( x.UserEvent ): return False if mod == SAHPI_ET_DIMI: if not hasattr( x, "DimiEvent" ): return False if mod == SAHPI_ET_DIMI: if not checkSaHpiDimiEventT( x.DimiEvent ): return False if mod == SAHPI_ET_DIMI_UPDATE: if not hasattr( x, "DimiUpdateEvent" ): return False if mod == SAHPI_ET_DIMI_UPDATE: if not checkSaHpiDimiUpdateEventT( x.DimiUpdateEvent ): return False if mod == SAHPI_ET_FUMI: if not hasattr( x, "FumiEvent" ): return False if mod == SAHPI_ET_FUMI: if not checkSaHpiFumiEventT( x.FumiEvent ): return False return True #** # Check function for HPI struct SaHpiEventT #** def checkSaHpiEventT( x ): if x is None: return False if not isinstance( x, SaHpiEventT ): return False if not hasattr( x, "Source" ): return False if not hasattr( x, "EventType" ): return False if not hasattr( x, "Timestamp" ): return False if not hasattr( x, "Severity" ): return False if not hasattr( x, "EventDataUnion" ): return False if not checkSaHpiEventUnionT( x.EventDataUnion, x.EventType ): return False return True #** # Check function for HPI struct SaHpiNameT #** def checkSaHpiNameT( x ): if x is None: return False if not isinstance( x, SaHpiNameT ): return False if not hasattr( x, "Length" ): return False if not hasattr( x, "Value" ): return False if not isinstance( x.Value, str ): return False if len( x.Value ) != SA_HPI_MAX_NAME_LENGTH: return False return True #** # Check function for HPI struct SaHpiConditionT #** def checkSaHpiConditionT( x ): if x is None: return False if not isinstance( x, SaHpiConditionT ): return False if not hasattr( x, "Type" ): return False if not hasattr( x, "Entity" ): return False if not checkSaHpiEntityPathT( x.Entity ): return False if not hasattr( x, "DomainId" ): return False if not hasattr( x, "ResourceId" ): return False if not hasattr( x, "SensorNum" ): return False if not hasattr( x, "EventState" ): return False if not hasattr( x, "Name" ): return False if not checkSaHpiNameT( x.Name ): return False if not hasattr( x, "Mid" ): return False if not hasattr( x, "Data" ): return False if not checkSaHpiTextBufferT( x.Data ): return False return True #** # Check function for HPI struct SaHpiAnnouncementT #** def checkSaHpiAnnouncementT( x ): if x is None: return False if not isinstance( x, SaHpiAnnouncementT ): return False if not hasattr( x, "EntryId" ): return False if not hasattr( x, "Timestamp" ): return False if not hasattr( x, "AddedByUser" ): return False if not hasattr( x, "Severity" ): return False if not hasattr( x, "Acknowledged" ): return False if not hasattr( x, "StatusCond" ): return False if not checkSaHpiConditionT( x.StatusCond ): return False return True #** # Check function for HPI struct SaHpiAnnunciatorRecT #** def checkSaHpiAnnunciatorRecT( x ): if x is None: return False if not isinstance( x, SaHpiAnnunciatorRecT ): return False if not hasattr( x, "AnnunciatorNum" ): return False if not hasattr( x, "AnnunciatorType" ): return False if not hasattr( x, "ModeReadOnly" ): return False if not hasattr( x, "MaxConditions" ): return False if not hasattr( x, "Oem" ): return False return True #** # Check function for HPI union SaHpiRdrTypeUnionT #** def checkSaHpiRdrTypeUnionT( x, mod ): if x is None: return False if not isinstance( x, SaHpiRdrTypeUnionT ): return False if mod == SAHPI_NO_RECORD: if not hasattr( x, "None" ): return False if mod == SAHPI_CTRL_RDR: if not hasattr( x, "CtrlRec" ): return False if mod == SAHPI_CTRL_RDR: if not checkSaHpiCtrlRecT( x.CtrlRec ): return False if mod == SAHPI_SENSOR_RDR: if not hasattr( x, "SensorRec" ): return False if mod == SAHPI_SENSOR_RDR: if not checkSaHpiSensorRecT( x.SensorRec ): return False if mod == SAHPI_INVENTORY_RDR: if not hasattr( x, "InventoryRec" ): return False if mod == SAHPI_INVENTORY_RDR: if not checkSaHpiInventoryRecT( x.InventoryRec ): return False if mod == SAHPI_WATCHDOG_RDR: if not hasattr( x, "WatchdogRec" ): return False if mod == SAHPI_WATCHDOG_RDR: if not checkSaHpiWatchdogRecT( x.WatchdogRec ): return False if mod == SAHPI_ANNUNCIATOR_RDR: if not hasattr( x, "AnnunciatorRec" ): return False if mod == SAHPI_ANNUNCIATOR_RDR: if not checkSaHpiAnnunciatorRecT( x.AnnunciatorRec ): return False if mod == SAHPI_DIMI_RDR: if not hasattr( x, "DimiRec" ): return False if mod == SAHPI_DIMI_RDR: if not checkSaHpiDimiRecT( x.DimiRec ): return False if mod == SAHPI_FUMI_RDR: if not hasattr( x, "FumiRec" ): return False if mod == SAHPI_FUMI_RDR: if not checkSaHpiFumiRecT( x.FumiRec ): return False return True #** # Check function for HPI struct SaHpiRdrT #** def checkSaHpiRdrT( x ): if x is None: return False if not isinstance( x, SaHpiRdrT ): return False if not hasattr( x, "RecordId" ): return False if not hasattr( x, "RdrType" ): return False if not hasattr( x, "Entity" ): return False if not checkSaHpiEntityPathT( x.Entity ): return False if not hasattr( x, "IsFru" ): return False if not hasattr( x, "RdrTypeUnion" ): return False if not checkSaHpiRdrTypeUnionT( x.RdrTypeUnion, x.RdrType ): return False if not hasattr( x, "IdString" ): return False if not checkSaHpiTextBufferT( x.IdString ): return False return True #** # Check function for HPI struct SaHpiLoadIdT #** def checkSaHpiLoadIdT( x ): if x is None: return False if not isinstance( x, SaHpiLoadIdT ): return False if not hasattr( x, "LoadNumber" ): return False if not hasattr( x, "LoadName" ): return False if not checkSaHpiTextBufferT( x.LoadName ): return False return True #** # Check function for HPI struct SaHpiResourceInfoT #** def checkSaHpiResourceInfoT( x ): if x is None: return False if not isinstance( x, SaHpiResourceInfoT ): return False if not hasattr( x, "ResourceRev" ): return False if not hasattr( x, "SpecificVer" ): return False if not hasattr( x, "DeviceSupport" ): return False if not hasattr( x, "ManufacturerId" ): return False if not hasattr( x, "ProductId" ): return False if not hasattr( x, "FirmwareMajorRev" ): return False if not hasattr( x, "FirmwareMinorRev" ): return False if not hasattr( x, "AuxFirmwareRev" ): return False if not hasattr( x, "Guid" ): return False if not isinstance( x.Guid, str ): return False if len( x.Guid ) != SAHPI_GUID_LENGTH: return False return True #** # Check function for HPI struct SaHpiRptEntryT #** def checkSaHpiRptEntryT( x ): if x is None: return False if not isinstance( x, SaHpiRptEntryT ): return False if not hasattr( x, "EntryId" ): return False if not hasattr( x, "ResourceId" ): return False if not hasattr( x, "ResourceInfo" ): return False if not checkSaHpiResourceInfoT( x.ResourceInfo ): return False if not hasattr( x, "ResourceEntity" ): return False if not checkSaHpiEntityPathT( x.ResourceEntity ): return False if not hasattr( x, "ResourceCapabilities" ): return False if not hasattr( x, "HotSwapCapabilities" ): return False if not hasattr( x, "ResourceSeverity" ): return False if not hasattr( x, "ResourceFailed" ): return False if not hasattr( x, "ResourceTag" ): return False if not checkSaHpiTextBufferT( x.ResourceTag ): return False return True #** # Check function for HPI struct SaHpiDomainInfoT #** def checkSaHpiDomainInfoT( x ): if x is None: return False if not isinstance( x, SaHpiDomainInfoT ): return False if not hasattr( x, "DomainId" ): return False if not hasattr( x, "DomainCapabilities" ): return False if not hasattr( x, "IsPeer" ): return False if not hasattr( x, "DomainTag" ): return False if not checkSaHpiTextBufferT( x.DomainTag ): return False if not hasattr( x, "DrtUpdateCount" ): return False if not hasattr( x, "DrtUpdateTimestamp" ): return False if not hasattr( x, "RptUpdateCount" ): return False if not hasattr( x, "RptUpdateTimestamp" ): return False if not hasattr( x, "DatUpdateCount" ): return False if not hasattr( x, "DatUpdateTimestamp" ): return False if not hasattr( x, "ActiveAlarms" ): return False if not hasattr( x, "CriticalAlarms" ): return False if not hasattr( x, "MajorAlarms" ): return False if not hasattr( x, "MinorAlarms" ): return False if not hasattr( x, "DatUserAlarmLimit" ): return False if not hasattr( x, "DatOverflow" ): return False if not hasattr( x, "Guid" ): return False if not isinstance( x.Guid, str ): return False if len( x.Guid ) != SAHPI_GUID_LENGTH: return False return True #** # Check function for HPI struct SaHpiDrtEntryT #** def checkSaHpiDrtEntryT( x ): if x is None: return False if not isinstance( x, SaHpiDrtEntryT ): return False if not hasattr( x, "EntryId" ): return False if not hasattr( x, "DomainId" ): return False if not hasattr( x, "IsPeer" ): return False return True #** # Check function for HPI struct SaHpiAlarmT #** def checkSaHpiAlarmT( x ): if x is None: return False if not isinstance( x, SaHpiAlarmT ): return False if not hasattr( x, "AlarmId" ): return False if not hasattr( x, "Timestamp" ): return False if not hasattr( x, "Severity" ): return False if not hasattr( x, "Acknowledged" ): return False if not hasattr( x, "AlarmCond" ): return False if not checkSaHpiConditionT( x.AlarmCond ): return False return True #** # Check function for HPI struct SaHpiEventLogInfoT #** def checkSaHpiEventLogInfoT( x ): if x is None: return False if not isinstance( x, SaHpiEventLogInfoT ): return False if not hasattr( x, "Entries" ): return False if not hasattr( x, "Size" ): return False if not hasattr( x, "UserEventMaxSize" ): return False if not hasattr( x, "UpdateTimestamp" ): return False if not hasattr( x, "CurrentTime" ): return False if not hasattr( x, "Enabled" ): return False if not hasattr( x, "OverflowFlag" ): return False if not hasattr( x, "OverflowResetable" ): return False if not hasattr( x, "OverflowAction" ): return False return True #** # Check function for HPI struct SaHpiEventLogEntryT #** def checkSaHpiEventLogEntryT( x ): if x is None: return False if not isinstance( x, SaHpiEventLogEntryT ): return False if not hasattr( x, "EntryId" ): return False if not hasattr( x, "Timestamp" ): return False if not hasattr( x, "Event" ): return False if not checkSaHpiEventT( x.Event ): return False return True #********************************************************** # Lookups for enums, errors, event categories... # Value -> Name (fromXXX) # Name -> Value (toXXX) # NB: toXXX raises FormatException if lookup fails #********************************************************** #** # For SaHpiLanguageT #** def fromSaHpiLanguageT( x ): if x == SAHPI_LANG_UNDEF: return "UNDEF" if x == SAHPI_LANG_AFAR: return "AFAR" if x == SAHPI_LANG_ABKHAZIAN: return "ABKHAZIAN" if x == SAHPI_LANG_AFRIKAANS: return "AFRIKAANS" if x == SAHPI_LANG_AMHARIC: return "AMHARIC" if x == SAHPI_LANG_ARABIC: return "ARABIC" if x == SAHPI_LANG_ASSAMESE: return "ASSAMESE" if x == SAHPI_LANG_AYMARA: return "AYMARA" if x == SAHPI_LANG_AZERBAIJANI: return "AZERBAIJANI" if x == SAHPI_LANG_BASHKIR: return "BASHKIR" if x == SAHPI_LANG_BYELORUSSIAN: return "BYELORUSSIAN" if x == SAHPI_LANG_BULGARIAN: return "BULGARIAN" if x == SAHPI_LANG_BIHARI: return "BIHARI" if x == SAHPI_LANG_BISLAMA: return "BISLAMA" if x == SAHPI_LANG_BENGALI: return "BENGALI" if x == SAHPI_LANG_TIBETAN: return "TIBETAN" if x == SAHPI_LANG_BRETON: return "BRETON" if x == SAHPI_LANG_CATALAN: return "CATALAN" if x == SAHPI_LANG_CORSICAN: return "CORSICAN" if x == SAHPI_LANG_CZECH: return "CZECH" if x == SAHPI_LANG_WELSH: return "WELSH" if x == SAHPI_LANG_DANISH: return "DANISH" if x == SAHPI_LANG_GERMAN: return "GERMAN" if x == SAHPI_LANG_BHUTANI: return "BHUTANI" if x == SAHPI_LANG_GREEK: return "GREEK" if x == SAHPI_LANG_ENGLISH: return "ENGLISH" if x == SAHPI_LANG_ESPERANTO: return "ESPERANTO" if x == SAHPI_LANG_SPANISH: return "SPANISH" if x == SAHPI_LANG_ESTONIAN: return "ESTONIAN" if x == SAHPI_LANG_BASQUE: return "BASQUE" if x == SAHPI_LANG_PERSIAN: return "PERSIAN" if x == SAHPI_LANG_FINNISH: return "FINNISH" if x == SAHPI_LANG_FIJI: return "FIJI" if x == SAHPI_LANG_FAEROESE: return "FAEROESE" if x == SAHPI_LANG_FRENCH: return "FRENCH" if x == SAHPI_LANG_FRISIAN: return "FRISIAN" if x == SAHPI_LANG_IRISH: return "IRISH" if x == SAHPI_LANG_SCOTSGAELIC: return "SCOTSGAELIC" if x == SAHPI_LANG_GALICIAN: return "GALICIAN" if x == SAHPI_LANG_GUARANI: return "GUARANI" if x == SAHPI_LANG_GUJARATI: return "GUJARATI" if x == SAHPI_LANG_HAUSA: return "HAUSA" if x == SAHPI_LANG_HINDI: return "HINDI" if x == SAHPI_LANG_CROATIAN: return "CROATIAN" if x == SAHPI_LANG_HUNGARIAN: return "HUNGARIAN" if x == SAHPI_LANG_ARMENIAN: return "ARMENIAN" if x == SAHPI_LANG_INTERLINGUA: return "INTERLINGUA" if x == SAHPI_LANG_INTERLINGUE: return "INTERLINGUE" if x == SAHPI_LANG_INUPIAK: return "INUPIAK" if x == SAHPI_LANG_INDONESIAN: return "INDONESIAN" if x == SAHPI_LANG_ICELANDIC: return "ICELANDIC" if x == SAHPI_LANG_ITALIAN: return "ITALIAN" if x == SAHPI_LANG_HEBREW: return "HEBREW" if x == SAHPI_LANG_JAPANESE: return "JAPANESE" if x == SAHPI_LANG_YIDDISH: return "YIDDISH" if x == SAHPI_LANG_JAVANESE: return "JAVANESE" if x == SAHPI_LANG_GEORGIAN: return "GEORGIAN" if x == SAHPI_LANG_KAZAKH: return "KAZAKH" if x == SAHPI_LANG_GREENLANDIC: return "GREENLANDIC" if x == SAHPI_LANG_CAMBODIAN: return "CAMBODIAN" if x == SAHPI_LANG_KANNADA: return "KANNADA" if x == SAHPI_LANG_KOREAN: return "KOREAN" if x == SAHPI_LANG_KASHMIRI: return "KASHMIRI" if x == SAHPI_LANG_KURDISH: return "KURDISH" if x == SAHPI_LANG_KIRGHIZ: return "KIRGHIZ" if x == SAHPI_LANG_LATIN: return "LATIN" if x == SAHPI_LANG_LINGALA: return "LINGALA" if x == SAHPI_LANG_LAOTHIAN: return "LAOTHIAN" if x == SAHPI_LANG_LITHUANIAN: return "LITHUANIAN" if x == SAHPI_LANG_LATVIANLETTISH: return "LATVIANLETTISH" if x == SAHPI_LANG_MALAGASY: return "MALAGASY" if x == SAHPI_LANG_MAORI: return "MAORI" if x == SAHPI_LANG_MACEDONIAN: return "MACEDONIAN" if x == SAHPI_LANG_MALAYALAM: return "MALAYALAM" if x == SAHPI_LANG_MONGOLIAN: return "MONGOLIAN" if x == SAHPI_LANG_MOLDAVIAN: return "MOLDAVIAN" if x == SAHPI_LANG_MARATHI: return "MARATHI" if x == SAHPI_LANG_MALAY: return "MALAY" if x == SAHPI_LANG_MALTESE: return "MALTESE" if x == SAHPI_LANG_BURMESE: return "BURMESE" if x == SAHPI_LANG_NAURU: return "NAURU" if x == SAHPI_LANG_NEPALI: return "NEPALI" if x == SAHPI_LANG_DUTCH: return "DUTCH" if x == SAHPI_LANG_NORWEGIAN: return "NORWEGIAN" if x == SAHPI_LANG_OCCITAN: return "OCCITAN" if x == SAHPI_LANG_AFANOROMO: return "AFANOROMO" if x == SAHPI_LANG_ORIYA: return "ORIYA" if x == SAHPI_LANG_PUNJABI: return "PUNJABI" if x == SAHPI_LANG_POLISH: return "POLISH" if x == SAHPI_LANG_PASHTOPUSHTO: return "PASHTOPUSHTO" if x == SAHPI_LANG_PORTUGUESE: return "PORTUGUESE" if x == SAHPI_LANG_QUECHUA: return "QUECHUA" if x == SAHPI_LANG_RHAETOROMANCE: return "RHAETOROMANCE" if x == SAHPI_LANG_KIRUNDI: return "KIRUNDI" if x == SAHPI_LANG_ROMANIAN: return "ROMANIAN" if x == SAHPI_LANG_RUSSIAN: return "RUSSIAN" if x == SAHPI_LANG_KINYARWANDA: return "KINYARWANDA" if x == SAHPI_LANG_SANSKRIT: return "SANSKRIT" if x == SAHPI_LANG_SINDHI: return "SINDHI" if x == SAHPI_LANG_SANGRO: return "SANGRO" if x == SAHPI_LANG_SERBOCROATIAN: return "SERBOCROATIAN" if x == SAHPI_LANG_SINGHALESE: return "SINGHALESE" if x == SAHPI_LANG_SLOVAK: return "SLOVAK" if x == SAHPI_LANG_SLOVENIAN: return "SLOVENIAN" if x == SAHPI_LANG_SAMOAN: return "SAMOAN" if x == SAHPI_LANG_SHONA: return "SHONA" if x == SAHPI_LANG_SOMALI: return "SOMALI" if x == SAHPI_LANG_ALBANIAN: return "ALBANIAN" if x == SAHPI_LANG_SERBIAN: return "SERBIAN" if x == SAHPI_LANG_SISWATI: return "SISWATI" if x == SAHPI_LANG_SESOTHO: return "SESOTHO" if x == SAHPI_LANG_SUDANESE: return "SUDANESE" if x == SAHPI_LANG_SWEDISH: return "SWEDISH" if x == SAHPI_LANG_SWAHILI: return "SWAHILI" if x == SAHPI_LANG_TAMIL: return "TAMIL" if x == SAHPI_LANG_TELUGU: return "TELUGU" if x == SAHPI_LANG_TAJIK: return "TAJIK" if x == SAHPI_LANG_THAI: return "THAI" if x == SAHPI_LANG_TIGRINYA: return "TIGRINYA" if x == SAHPI_LANG_TURKMEN: return "TURKMEN" if x == SAHPI_LANG_TAGALOG: return "TAGALOG" if x == SAHPI_LANG_SETSWANA: return "SETSWANA" if x == SAHPI_LANG_TONGA: return "TONGA" if x == SAHPI_LANG_TURKISH: return "TURKISH" if x == SAHPI_LANG_TSONGA: return "TSONGA" if x == SAHPI_LANG_TATAR: return "TATAR" if x == SAHPI_LANG_TWI: return "TWI" if x == SAHPI_LANG_UKRAINIAN: return "UKRAINIAN" if x == SAHPI_LANG_URDU: return "URDU" if x == SAHPI_LANG_UZBEK: return "UZBEK" if x == SAHPI_LANG_VIETNAMESE: return "VIETNAMESE" if x == SAHPI_LANG_VOLAPUK: return "VOLAPUK" if x == SAHPI_LANG_WOLOF: return "WOLOF" if x == SAHPI_LANG_XHOSA: return "XHOSA" if x == SAHPI_LANG_YORUBA: return "YORUBA" if x == SAHPI_LANG_CHINESE: return "CHINESE" if x == SAHPI_LANG_ZULU: return "ZULU" return repr( x ) def toSaHpiLanguageT( s ): if s == "UNDEF": return SAHPI_LANG_UNDEF if s == "AFAR": return SAHPI_LANG_AFAR if s == "ABKHAZIAN": return SAHPI_LANG_ABKHAZIAN if s == "AFRIKAANS": return SAHPI_LANG_AFRIKAANS if s == "AMHARIC": return SAHPI_LANG_AMHARIC if s == "ARABIC": return SAHPI_LANG_ARABIC if s == "ASSAMESE": return SAHPI_LANG_ASSAMESE if s == "AYMARA": return SAHPI_LANG_AYMARA if s == "AZERBAIJANI": return SAHPI_LANG_AZERBAIJANI if s == "BASHKIR": return SAHPI_LANG_BASHKIR if s == "BYELORUSSIAN": return SAHPI_LANG_BYELORUSSIAN if s == "BULGARIAN": return SAHPI_LANG_BULGARIAN if s == "BIHARI": return SAHPI_LANG_BIHARI if s == "BISLAMA": return SAHPI_LANG_BISLAMA if s == "BENGALI": return SAHPI_LANG_BENGALI if s == "TIBETAN": return SAHPI_LANG_TIBETAN if s == "BRETON": return SAHPI_LANG_BRETON if s == "CATALAN": return SAHPI_LANG_CATALAN if s == "CORSICAN": return SAHPI_LANG_CORSICAN if s == "CZECH": return SAHPI_LANG_CZECH if s == "WELSH": return SAHPI_LANG_WELSH if s == "DANISH": return SAHPI_LANG_DANISH if s == "GERMAN": return SAHPI_LANG_GERMAN if s == "BHUTANI": return SAHPI_LANG_BHUTANI if s == "GREEK": return SAHPI_LANG_GREEK if s == "ENGLISH": return SAHPI_LANG_ENGLISH if s == "ESPERANTO": return SAHPI_LANG_ESPERANTO if s == "SPANISH": return SAHPI_LANG_SPANISH if s == "ESTONIAN": return SAHPI_LANG_ESTONIAN if s == "BASQUE": return SAHPI_LANG_BASQUE if s == "PERSIAN": return SAHPI_LANG_PERSIAN if s == "FINNISH": return SAHPI_LANG_FINNISH if s == "FIJI": return SAHPI_LANG_FIJI if s == "FAEROESE": return SAHPI_LANG_FAEROESE if s == "FRENCH": return SAHPI_LANG_FRENCH if s == "FRISIAN": return SAHPI_LANG_FRISIAN if s == "IRISH": return SAHPI_LANG_IRISH if s == "SCOTSGAELIC": return SAHPI_LANG_SCOTSGAELIC if s == "GALICIAN": return SAHPI_LANG_GALICIAN if s == "GUARANI": return SAHPI_LANG_GUARANI if s == "GUJARATI": return SAHPI_LANG_GUJARATI if s == "HAUSA": return SAHPI_LANG_HAUSA if s == "HINDI": return SAHPI_LANG_HINDI if s == "CROATIAN": return SAHPI_LANG_CROATIAN if s == "HUNGARIAN": return SAHPI_LANG_HUNGARIAN if s == "ARMENIAN": return SAHPI_LANG_ARMENIAN if s == "INTERLINGUA": return SAHPI_LANG_INTERLINGUA if s == "INTERLINGUE": return SAHPI_LANG_INTERLINGUE if s == "INUPIAK": return SAHPI_LANG_INUPIAK if s == "INDONESIAN": return SAHPI_LANG_INDONESIAN if s == "ICELANDIC": return SAHPI_LANG_ICELANDIC if s == "ITALIAN": return SAHPI_LANG_ITALIAN if s == "HEBREW": return SAHPI_LANG_HEBREW if s == "JAPANESE": return SAHPI_LANG_JAPANESE if s == "YIDDISH": return SAHPI_LANG_YIDDISH if s == "JAVANESE": return SAHPI_LANG_JAVANESE if s == "GEORGIAN": return SAHPI_LANG_GEORGIAN if s == "KAZAKH": return SAHPI_LANG_KAZAKH if s == "GREENLANDIC": return SAHPI_LANG_GREENLANDIC if s == "CAMBODIAN": return SAHPI_LANG_CAMBODIAN if s == "KANNADA": return SAHPI_LANG_KANNADA if s == "KOREAN": return SAHPI_LANG_KOREAN if s == "KASHMIRI": return SAHPI_LANG_KASHMIRI if s == "KURDISH": return SAHPI_LANG_KURDISH if s == "KIRGHIZ": return SAHPI_LANG_KIRGHIZ if s == "LATIN": return SAHPI_LANG_LATIN if s == "LINGALA": return SAHPI_LANG_LINGALA if s == "LAOTHIAN": return SAHPI_LANG_LAOTHIAN if s == "LITHUANIAN": return SAHPI_LANG_LITHUANIAN if s == "LATVIANLETTISH": return SAHPI_LANG_LATVIANLETTISH if s == "MALAGASY": return SAHPI_LANG_MALAGASY if s == "MAORI": return SAHPI_LANG_MAORI if s == "MACEDONIAN": return SAHPI_LANG_MACEDONIAN if s == "MALAYALAM": return SAHPI_LANG_MALAYALAM if s == "MONGOLIAN": return SAHPI_LANG_MONGOLIAN if s == "MOLDAVIAN": return SAHPI_LANG_MOLDAVIAN if s == "MARATHI": return SAHPI_LANG_MARATHI if s == "MALAY": return SAHPI_LANG_MALAY if s == "MALTESE": return SAHPI_LANG_MALTESE if s == "BURMESE": return SAHPI_LANG_BURMESE if s == "NAURU": return SAHPI_LANG_NAURU if s == "NEPALI": return SAHPI_LANG_NEPALI if s == "DUTCH": return SAHPI_LANG_DUTCH if s == "NORWEGIAN": return SAHPI_LANG_NORWEGIAN if s == "OCCITAN": return SAHPI_LANG_OCCITAN if s == "AFANOROMO": return SAHPI_LANG_AFANOROMO if s == "ORIYA": return SAHPI_LANG_ORIYA if s == "PUNJABI": return SAHPI_LANG_PUNJABI if s == "POLISH": return SAHPI_LANG_POLISH if s == "PASHTOPUSHTO": return SAHPI_LANG_PASHTOPUSHTO if s == "PORTUGUESE": return SAHPI_LANG_PORTUGUESE if s == "QUECHUA": return SAHPI_LANG_QUECHUA if s == "RHAETOROMANCE": return SAHPI_LANG_RHAETOROMANCE if s == "KIRUNDI": return SAHPI_LANG_KIRUNDI if s == "ROMANIAN": return SAHPI_LANG_ROMANIAN if s == "RUSSIAN": return SAHPI_LANG_RUSSIAN if s == "KINYARWANDA": return SAHPI_LANG_KINYARWANDA if s == "SANSKRIT": return SAHPI_LANG_SANSKRIT if s == "SINDHI": return SAHPI_LANG_SINDHI if s == "SANGRO": return SAHPI_LANG_SANGRO if s == "SERBOCROATIAN": return SAHPI_LANG_SERBOCROATIAN if s == "SINGHALESE": return SAHPI_LANG_SINGHALESE if s == "SLOVAK": return SAHPI_LANG_SLOVAK if s == "SLOVENIAN": return SAHPI_LANG_SLOVENIAN if s == "SAMOAN": return SAHPI_LANG_SAMOAN if s == "SHONA": return SAHPI_LANG_SHONA if s == "SOMALI": return SAHPI_LANG_SOMALI if s == "ALBANIAN": return SAHPI_LANG_ALBANIAN if s == "SERBIAN": return SAHPI_LANG_SERBIAN if s == "SISWATI": return SAHPI_LANG_SISWATI if s == "SESOTHO": return SAHPI_LANG_SESOTHO if s == "SUDANESE": return SAHPI_LANG_SUDANESE if s == "SWEDISH": return SAHPI_LANG_SWEDISH if s == "SWAHILI": return SAHPI_LANG_SWAHILI if s == "TAMIL": return SAHPI_LANG_TAMIL if s == "TELUGU": return SAHPI_LANG_TELUGU if s == "TAJIK": return SAHPI_LANG_TAJIK if s == "THAI": return SAHPI_LANG_THAI if s == "TIGRINYA": return SAHPI_LANG_TIGRINYA if s == "TURKMEN": return SAHPI_LANG_TURKMEN if s == "TAGALOG": return SAHPI_LANG_TAGALOG if s == "SETSWANA": return SAHPI_LANG_SETSWANA if s == "TONGA": return SAHPI_LANG_TONGA if s == "TURKISH": return SAHPI_LANG_TURKISH if s == "TSONGA": return SAHPI_LANG_TSONGA if s == "TATAR": return SAHPI_LANG_TATAR if s == "TWI": return SAHPI_LANG_TWI if s == "UKRAINIAN": return SAHPI_LANG_UKRAINIAN if s == "URDU": return SAHPI_LANG_URDU if s == "UZBEK": return SAHPI_LANG_UZBEK if s == "VIETNAMESE": return SAHPI_LANG_VIETNAMESE if s == "VOLAPUK": return SAHPI_LANG_VOLAPUK if s == "WOLOF": return SAHPI_LANG_WOLOF if s == "XHOSA": return SAHPI_LANG_XHOSA if s == "YORUBA": return SAHPI_LANG_YORUBA if s == "CHINESE": return SAHPI_LANG_CHINESE if s == "ZULU": return SAHPI_LANG_ZULU raise ValueError() #** # For SaHpiTextTypeT #** def fromSaHpiTextTypeT( x ): if x == SAHPI_TL_TYPE_UNICODE: return "UNICODE" if x == SAHPI_TL_TYPE_BCDPLUS: return "BCDPLUS" if x == SAHPI_TL_TYPE_ASCII6: return "ASCII6" if x == SAHPI_TL_TYPE_TEXT: return "TEXT" if x == SAHPI_TL_TYPE_BINARY: return "BINARY" return repr( x ) def toSaHpiTextTypeT( s ): if s == "UNICODE": return SAHPI_TL_TYPE_UNICODE if s == "BCDPLUS": return SAHPI_TL_TYPE_BCDPLUS if s == "ASCII6": return SAHPI_TL_TYPE_ASCII6 if s == "TEXT": return SAHPI_TL_TYPE_TEXT if s == "BINARY": return SAHPI_TL_TYPE_BINARY raise ValueError() #** # For SaHpiEntityTypeT #** def fromSaHpiEntityTypeT( x ): if x == SAHPI_ENT_UNSPECIFIED: return "UNSPECIFIED" if x == SAHPI_ENT_OTHER: return "OTHER" if x == SAHPI_ENT_UNKNOWN: return "UNKNOWN" if x == SAHPI_ENT_PROCESSOR: return "PROCESSOR" if x == SAHPI_ENT_DISK_BAY: return "DISK_BAY" if x == SAHPI_ENT_PERIPHERAL_BAY: return "PERIPHERAL_BAY" if x == SAHPI_ENT_SYS_MGMNT_MODULE: return "SYS_MGMNT_MODULE" if x == SAHPI_ENT_SYSTEM_BOARD: return "SYSTEM_BOARD" if x == SAHPI_ENT_MEMORY_MODULE: return "MEMORY_MODULE" if x == SAHPI_ENT_PROCESSOR_MODULE: return "PROCESSOR_MODULE" if x == SAHPI_ENT_POWER_SUPPLY: return "POWER_SUPPLY" if x == SAHPI_ENT_ADD_IN_CARD: return "ADD_IN_CARD" if x == SAHPI_ENT_FRONT_PANEL_BOARD: return "FRONT_PANEL_BOARD" if x == SAHPI_ENT_BACK_PANEL_BOARD: return "BACK_PANEL_BOARD" if x == SAHPI_ENT_POWER_SYSTEM_BOARD: return "POWER_SYSTEM_BOARD" if x == SAHPI_ENT_DRIVE_BACKPLANE: return "DRIVE_BACKPLANE" if x == SAHPI_ENT_SYS_EXPANSION_BOARD: return "SYS_EXPANSION_BOARD" if x == SAHPI_ENT_OTHER_SYSTEM_BOARD: return "OTHER_SYSTEM_BOARD" if x == SAHPI_ENT_PROCESSOR_BOARD: return "PROCESSOR_BOARD" if x == SAHPI_ENT_POWER_UNIT: return "POWER_UNIT" if x == SAHPI_ENT_POWER_MODULE: return "POWER_MODULE" if x == SAHPI_ENT_POWER_MGMNT: return "POWER_MGMNT" if x == SAHPI_ENT_CHASSIS_BACK_PANEL_BOARD: return "CHASSIS_BACK_PANEL_BOARD" if x == SAHPI_ENT_SYSTEM_CHASSIS: return "SYSTEM_CHASSIS" if x == SAHPI_ENT_SUB_CHASSIS: return "SUB_CHASSIS" if x == SAHPI_ENT_OTHER_CHASSIS_BOARD: return "OTHER_CHASSIS_BOARD" if x == SAHPI_ENT_DISK_DRIVE_BAY: return "DISK_DRIVE_BAY" if x == SAHPI_ENT_PERIPHERAL_BAY_2: return "PERIPHERAL_BAY_2" if x == SAHPI_ENT_DEVICE_BAY: return "DEVICE_BAY" if x == SAHPI_ENT_COOLING_DEVICE: return "COOLING_DEVICE" if x == SAHPI_ENT_COOLING_UNIT: return "COOLING_UNIT" if x == SAHPI_ENT_INTERCONNECT: return "INTERCONNECT" if x == SAHPI_ENT_MEMORY_DEVICE: return "MEMORY_DEVICE" if x == SAHPI_ENT_SYS_MGMNT_SOFTWARE: return "SYS_MGMNT_SOFTWARE" if x == SAHPI_ENT_BIOS: return "BIOS" if x == SAHPI_ENT_OPERATING_SYSTEM: return "OPERATING_SYSTEM" if x == SAHPI_ENT_SYSTEM_BUS: return "SYSTEM_BUS" if x == SAHPI_ENT_GROUP: return "GROUP" if x == SAHPI_ENT_REMOTE: return "REMOTE" if x == SAHPI_ENT_EXTERNAL_ENVIRONMENT: return "EXTERNAL_ENVIRONMENT" if x == SAHPI_ENT_BATTERY: return "BATTERY" if x == SAHPI_ENT_PROCESSING_BLADE: return "PROCESSING_BLADE" if x == SAHPI_ENT_CONNECTIVITY_SWITCH: return "CONNECTIVITY_SWITCH" if x == SAHPI_ENT_PROCESSOR_MEMORY_MODULE: return "PROCESSOR_MEMORY_MODULE" if x == SAHPI_ENT_IO_MODULE: return "IO_MODULE" if x == SAHPI_ENT_PROCESSOR_IO_MODULE: return "PROCESSOR_IO_MODULE" if x == SAHPI_ENT_MC_FIRMWARE: return "MC_FIRMWARE" if x == SAHPI_ENT_IPMI_CHANNEL: return "IPMI_CHANNEL" if x == SAHPI_ENT_PCI_BUS: return "PCI_BUS" if x == SAHPI_ENT_PCI_EXPRESS_BUS: return "PCI_EXPRESS_BUS" if x == SAHPI_ENT_SCSI_BUS: return "SCSI_BUS" if x == SAHPI_ENT_SATA_BUS: return "SATA_BUS" if x == SAHPI_ENT_PROC_FSB: return "PROC_FSB" if x == SAHPI_ENT_CLOCK: return "CLOCK" if x == SAHPI_ENT_SYSTEM_FIRMWARE: return "SYSTEM_FIRMWARE" if x == SAHPI_ENT_CHASSIS_SPECIFIC: return "CHASSIS_SPECIFIC" if x == SAHPI_ENT_CHASSIS_SPECIFIC01: return "CHASSIS_SPECIFIC01" if x == SAHPI_ENT_CHASSIS_SPECIFIC02: return "CHASSIS_SPECIFIC02" if x == SAHPI_ENT_CHASSIS_SPECIFIC03: return "CHASSIS_SPECIFIC03" if x == SAHPI_ENT_CHASSIS_SPECIFIC04: return "CHASSIS_SPECIFIC04" if x == SAHPI_ENT_CHASSIS_SPECIFIC05: return "CHASSIS_SPECIFIC05" if x == SAHPI_ENT_CHASSIS_SPECIFIC06: return "CHASSIS_SPECIFIC06" if x == SAHPI_ENT_CHASSIS_SPECIFIC07: return "CHASSIS_SPECIFIC07" if x == SAHPI_ENT_CHASSIS_SPECIFIC08: return "CHASSIS_SPECIFIC08" if x == SAHPI_ENT_CHASSIS_SPECIFIC09: return "CHASSIS_SPECIFIC09" if x == SAHPI_ENT_CHASSIS_SPECIFIC10: return "CHASSIS_SPECIFIC10" if x == SAHPI_ENT_CHASSIS_SPECIFIC11: return "CHASSIS_SPECIFIC11" if x == SAHPI_ENT_CHASSIS_SPECIFIC12: return "CHASSIS_SPECIFIC12" if x == SAHPI_ENT_CHASSIS_SPECIFIC13: return "CHASSIS_SPECIFIC13" if x == SAHPI_ENT_BOARD_SET_SPECIFIC: return "BOARD_SET_SPECIFIC" if x == SAHPI_ENT_OEM_SYSINT_SPECIFIC: return "OEM_SYSINT_SPECIFIC" if x == SAHPI_ENT_ROOT: return "ROOT" if x == SAHPI_ENT_RACK: return "RACK" if x == SAHPI_ENT_SUBRACK: return "SUBRACK" if x == SAHPI_ENT_COMPACTPCI_CHASSIS: return "COMPACTPCI_CHASSIS" if x == SAHPI_ENT_ADVANCEDTCA_CHASSIS: return "ADVANCEDTCA_CHASSIS" if x == SAHPI_ENT_RACK_MOUNTED_SERVER: return "RACK_MOUNTED_SERVER" if x == SAHPI_ENT_SYSTEM_BLADE: return "SYSTEM_BLADE" if x == SAHPI_ENT_SWITCH: return "SWITCH" if x == SAHPI_ENT_SWITCH_BLADE: return "SWITCH_BLADE" if x == SAHPI_ENT_SBC_BLADE: return "SBC_BLADE" if x == SAHPI_ENT_IO_BLADE: return "IO_BLADE" if x == SAHPI_ENT_DISK_BLADE: return "DISK_BLADE" if x == SAHPI_ENT_DISK_DRIVE: return "DISK_DRIVE" if x == SAHPI_ENT_FAN: return "FAN" if x == SAHPI_ENT_POWER_DISTRIBUTION_UNIT: return "POWER_DISTRIBUTION_UNIT" if x == SAHPI_ENT_SPEC_PROC_BLADE: return "SPEC_PROC_BLADE" if x == SAHPI_ENT_IO_SUBBOARD: return "IO_SUBBOARD" if x == SAHPI_ENT_SBC_SUBBOARD: return "SBC_SUBBOARD" if x == SAHPI_ENT_ALARM_MANAGER: return "ALARM_MANAGER" if x == SAHPI_ENT_SHELF_MANAGER: return "SHELF_MANAGER" if x == SAHPI_ENT_DISPLAY_PANEL: return "DISPLAY_PANEL" if x == SAHPI_ENT_SUBBOARD_CARRIER_BLADE: return "SUBBOARD_CARRIER_BLADE" if x == SAHPI_ENT_PHYSICAL_SLOT: return "PHYSICAL_SLOT" if x == SAHPI_ENT_PICMG_FRONT_BLADE: return "PICMG_FRONT_BLADE" if x == SAHPI_ENT_SYSTEM_INVENTORY_DEVICE: return "SYSTEM_INVENTORY_DEVICE" if x == SAHPI_ENT_FILTRATION_UNIT: return "FILTRATION_UNIT" if x == SAHPI_ENT_AMC: return "AMC" if x == SAHPI_ENT_BMC: return "BMC" if x == SAHPI_ENT_IPMC: return "IPMC" if x == SAHPI_ENT_MMC: return "MMC" if x == SAHPI_ENT_SHMC: return "SHMC" if x == SAHPI_ENT_CPLD: return "CPLD" if x == SAHPI_ENT_EPLD: return "EPLD" if x == SAHPI_ENT_FPGA: return "FPGA" if x == SAHPI_ENT_DASD: return "DASD" if x == SAHPI_ENT_NIC: return "NIC" if x == SAHPI_ENT_DSP: return "DSP" if x == SAHPI_ENT_UCODE: return "UCODE" if x == SAHPI_ENT_NPU: return "NPU" if x == SAHPI_ENT_OEM: return "OEM" if x == SAHPI_ENT_INTERFACE: return "INTERFACE" if x == SAHPI_ENT_MICROTCA_CHASSIS: return "MICROTCA_CHASSIS" if x == SAHPI_ENT_CARRIER: return "CARRIER" if x == SAHPI_ENT_CARRIER_MANAGER: return "CARRIER_MANAGER" if x == SAHPI_ENT_CONFIG_DATA: return "CONFIG_DATA" if x == SAHPI_ENT_INDICATOR: return "INDICATOR" return repr( x ) def toSaHpiEntityTypeT( s ): if s == "UNSPECIFIED": return SAHPI_ENT_UNSPECIFIED if s == "OTHER": return SAHPI_ENT_OTHER if s == "UNKNOWN": return SAHPI_ENT_UNKNOWN if s == "PROCESSOR": return SAHPI_ENT_PROCESSOR if s == "DISK_BAY": return SAHPI_ENT_DISK_BAY if s == "PERIPHERAL_BAY": return SAHPI_ENT_PERIPHERAL_BAY if s == "SYS_MGMNT_MODULE": return SAHPI_ENT_SYS_MGMNT_MODULE if s == "SYSTEM_BOARD": return SAHPI_ENT_SYSTEM_BOARD if s == "MEMORY_MODULE": return SAHPI_ENT_MEMORY_MODULE if s == "PROCESSOR_MODULE": return SAHPI_ENT_PROCESSOR_MODULE if s == "POWER_SUPPLY": return SAHPI_ENT_POWER_SUPPLY if s == "ADD_IN_CARD": return SAHPI_ENT_ADD_IN_CARD if s == "FRONT_PANEL_BOARD": return SAHPI_ENT_FRONT_PANEL_BOARD if s == "BACK_PANEL_BOARD": return SAHPI_ENT_BACK_PANEL_BOARD if s == "POWER_SYSTEM_BOARD": return SAHPI_ENT_POWER_SYSTEM_BOARD if s == "DRIVE_BACKPLANE": return SAHPI_ENT_DRIVE_BACKPLANE if s == "SYS_EXPANSION_BOARD": return SAHPI_ENT_SYS_EXPANSION_BOARD if s == "OTHER_SYSTEM_BOARD": return SAHPI_ENT_OTHER_SYSTEM_BOARD if s == "PROCESSOR_BOARD": return SAHPI_ENT_PROCESSOR_BOARD if s == "POWER_UNIT": return SAHPI_ENT_POWER_UNIT if s == "POWER_MODULE": return SAHPI_ENT_POWER_MODULE if s == "POWER_MGMNT": return SAHPI_ENT_POWER_MGMNT if s == "CHASSIS_BACK_PANEL_BOARD": return SAHPI_ENT_CHASSIS_BACK_PANEL_BOARD if s == "SYSTEM_CHASSIS": return SAHPI_ENT_SYSTEM_CHASSIS if s == "SUB_CHASSIS": return SAHPI_ENT_SUB_CHASSIS if s == "OTHER_CHASSIS_BOARD": return SAHPI_ENT_OTHER_CHASSIS_BOARD if s == "DISK_DRIVE_BAY": return SAHPI_ENT_DISK_DRIVE_BAY if s == "PERIPHERAL_BAY_2": return SAHPI_ENT_PERIPHERAL_BAY_2 if s == "DEVICE_BAY": return SAHPI_ENT_DEVICE_BAY if s == "COOLING_DEVICE": return SAHPI_ENT_COOLING_DEVICE if s == "COOLING_UNIT": return SAHPI_ENT_COOLING_UNIT if s == "INTERCONNECT": return SAHPI_ENT_INTERCONNECT if s == "MEMORY_DEVICE": return SAHPI_ENT_MEMORY_DEVICE if s == "SYS_MGMNT_SOFTWARE": return SAHPI_ENT_SYS_MGMNT_SOFTWARE if s == "BIOS": return SAHPI_ENT_BIOS if s == "OPERATING_SYSTEM": return SAHPI_ENT_OPERATING_SYSTEM if s == "SYSTEM_BUS": return SAHPI_ENT_SYSTEM_BUS if s == "GROUP": return SAHPI_ENT_GROUP if s == "REMOTE": return SAHPI_ENT_REMOTE if s == "EXTERNAL_ENVIRONMENT": return SAHPI_ENT_EXTERNAL_ENVIRONMENT if s == "BATTERY": return SAHPI_ENT_BATTERY if s == "PROCESSING_BLADE": return SAHPI_ENT_PROCESSING_BLADE if s == "CONNECTIVITY_SWITCH": return SAHPI_ENT_CONNECTIVITY_SWITCH if s == "PROCESSOR_MEMORY_MODULE": return SAHPI_ENT_PROCESSOR_MEMORY_MODULE if s == "IO_MODULE": return SAHPI_ENT_IO_MODULE if s == "PROCESSOR_IO_MODULE": return SAHPI_ENT_PROCESSOR_IO_MODULE if s == "MC_FIRMWARE": return SAHPI_ENT_MC_FIRMWARE if s == "IPMI_CHANNEL": return SAHPI_ENT_IPMI_CHANNEL if s == "PCI_BUS": return SAHPI_ENT_PCI_BUS if s == "PCI_EXPRESS_BUS": return SAHPI_ENT_PCI_EXPRESS_BUS if s == "SCSI_BUS": return SAHPI_ENT_SCSI_BUS if s == "SATA_BUS": return SAHPI_ENT_SATA_BUS if s == "PROC_FSB": return SAHPI_ENT_PROC_FSB if s == "CLOCK": return SAHPI_ENT_CLOCK if s == "SYSTEM_FIRMWARE": return SAHPI_ENT_SYSTEM_FIRMWARE if s == "CHASSIS_SPECIFIC": return SAHPI_ENT_CHASSIS_SPECIFIC if s == "CHASSIS_SPECIFIC01": return SAHPI_ENT_CHASSIS_SPECIFIC01 if s == "CHASSIS_SPECIFIC02": return SAHPI_ENT_CHASSIS_SPECIFIC02 if s == "CHASSIS_SPECIFIC03": return SAHPI_ENT_CHASSIS_SPECIFIC03 if s == "CHASSIS_SPECIFIC04": return SAHPI_ENT_CHASSIS_SPECIFIC04 if s == "CHASSIS_SPECIFIC05": return SAHPI_ENT_CHASSIS_SPECIFIC05 if s == "CHASSIS_SPECIFIC06": return SAHPI_ENT_CHASSIS_SPECIFIC06 if s == "CHASSIS_SPECIFIC07": return SAHPI_ENT_CHASSIS_SPECIFIC07 if s == "CHASSIS_SPECIFIC08": return SAHPI_ENT_CHASSIS_SPECIFIC08 if s == "CHASSIS_SPECIFIC09": return SAHPI_ENT_CHASSIS_SPECIFIC09 if s == "CHASSIS_SPECIFIC10": return SAHPI_ENT_CHASSIS_SPECIFIC10 if s == "CHASSIS_SPECIFIC11": return SAHPI_ENT_CHASSIS_SPECIFIC11 if s == "CHASSIS_SPECIFIC12": return SAHPI_ENT_CHASSIS_SPECIFIC12 if s == "CHASSIS_SPECIFIC13": return SAHPI_ENT_CHASSIS_SPECIFIC13 if s == "BOARD_SET_SPECIFIC": return SAHPI_ENT_BOARD_SET_SPECIFIC if s == "OEM_SYSINT_SPECIFIC": return SAHPI_ENT_OEM_SYSINT_SPECIFIC if s == "ROOT": return SAHPI_ENT_ROOT if s == "RACK": return SAHPI_ENT_RACK if s == "SUBRACK": return SAHPI_ENT_SUBRACK if s == "COMPACTPCI_CHASSIS": return SAHPI_ENT_COMPACTPCI_CHASSIS if s == "ADVANCEDTCA_CHASSIS": return SAHPI_ENT_ADVANCEDTCA_CHASSIS if s == "RACK_MOUNTED_SERVER": return SAHPI_ENT_RACK_MOUNTED_SERVER if s == "SYSTEM_BLADE": return SAHPI_ENT_SYSTEM_BLADE if s == "SWITCH": return SAHPI_ENT_SWITCH if s == "SWITCH_BLADE": return SAHPI_ENT_SWITCH_BLADE if s == "SBC_BLADE": return SAHPI_ENT_SBC_BLADE if s == "IO_BLADE": return SAHPI_ENT_IO_BLADE if s == "DISK_BLADE": return SAHPI_ENT_DISK_BLADE if s == "DISK_DRIVE": return SAHPI_ENT_DISK_DRIVE if s == "FAN": return SAHPI_ENT_FAN if s == "POWER_DISTRIBUTION_UNIT": return SAHPI_ENT_POWER_DISTRIBUTION_UNIT if s == "SPEC_PROC_BLADE": return SAHPI_ENT_SPEC_PROC_BLADE if s == "IO_SUBBOARD": return SAHPI_ENT_IO_SUBBOARD if s == "SBC_SUBBOARD": return SAHPI_ENT_SBC_SUBBOARD if s == "ALARM_MANAGER": return SAHPI_ENT_ALARM_MANAGER if s == "SHELF_MANAGER": return SAHPI_ENT_SHELF_MANAGER if s == "DISPLAY_PANEL": return SAHPI_ENT_DISPLAY_PANEL if s == "SUBBOARD_CARRIER_BLADE": return SAHPI_ENT_SUBBOARD_CARRIER_BLADE if s == "PHYSICAL_SLOT": return SAHPI_ENT_PHYSICAL_SLOT if s == "PICMG_FRONT_BLADE": return SAHPI_ENT_PICMG_FRONT_BLADE if s == "SYSTEM_INVENTORY_DEVICE": return SAHPI_ENT_SYSTEM_INVENTORY_DEVICE if s == "FILTRATION_UNIT": return SAHPI_ENT_FILTRATION_UNIT if s == "AMC": return SAHPI_ENT_AMC if s == "BMC": return SAHPI_ENT_BMC if s == "IPMC": return SAHPI_ENT_IPMC if s == "MMC": return SAHPI_ENT_MMC if s == "SHMC": return SAHPI_ENT_SHMC if s == "CPLD": return SAHPI_ENT_CPLD if s == "EPLD": return SAHPI_ENT_EPLD if s == "FPGA": return SAHPI_ENT_FPGA if s == "DASD": return SAHPI_ENT_DASD if s == "NIC": return SAHPI_ENT_NIC if s == "DSP": return SAHPI_ENT_DSP if s == "UCODE": return SAHPI_ENT_UCODE if s == "NPU": return SAHPI_ENT_NPU if s == "OEM": return SAHPI_ENT_OEM if s == "INTERFACE": return SAHPI_ENT_INTERFACE if s == "MICROTCA_CHASSIS": return SAHPI_ENT_MICROTCA_CHASSIS if s == "CARRIER": return SAHPI_ENT_CARRIER if s == "CARRIER_MANAGER": return SAHPI_ENT_CARRIER_MANAGER if s == "CONFIG_DATA": return SAHPI_ENT_CONFIG_DATA if s == "INDICATOR": return SAHPI_ENT_INDICATOR raise ValueError() #** # For SaHpiSensorTypeT #** def fromSaHpiSensorTypeT( x ): if x == SAHPI_TEMPERATURE: return "TEMPERATURE" if x == SAHPI_VOLTAGE: return "VOLTAGE" if x == SAHPI_CURRENT: return "CURRENT" if x == SAHPI_FAN: return "FAN" if x == SAHPI_PHYSICAL_SECURITY: return "PHYSICAL_SECURITY" if x == SAHPI_PLATFORM_VIOLATION: return "PLATFORM_VIOLATION" if x == SAHPI_PROCESSOR: return "PROCESSOR" if x == SAHPI_POWER_SUPPLY: return "POWER_SUPPLY" if x == SAHPI_POWER_UNIT: return "POWER_UNIT" if x == SAHPI_COOLING_DEVICE: return "COOLING_DEVICE" if x == SAHPI_OTHER_UNITS_BASED_SENSOR: return "OTHER_UNITS_BASED_SENSOR" if x == SAHPI_MEMORY: return "MEMORY" if x == SAHPI_DRIVE_SLOT: return "DRIVE_SLOT" if x == SAHPI_POST_MEMORY_RESIZE: return "POST_MEMORY_RESIZE" if x == SAHPI_SYSTEM_FW_PROGRESS: return "SYSTEM_FW_PROGRESS" if x == SAHPI_EVENT_LOGGING_DISABLED: return "EVENT_LOGGING_DISABLED" if x == SAHPI_RESERVED1: return "RESERVED1" if x == SAHPI_SYSTEM_EVENT: return "SYSTEM_EVENT" if x == SAHPI_CRITICAL_INTERRUPT: return "CRITICAL_INTERRUPT" if x == SAHPI_BUTTON: return "BUTTON" if x == SAHPI_MODULE_BOARD: return "MODULE_BOARD" if x == SAHPI_MICROCONTROLLER_COPROCESSOR: return "MICROCONTROLLER_COPROCESSOR" if x == SAHPI_ADDIN_CARD: return "ADDIN_CARD" if x == SAHPI_CHASSIS: return "CHASSIS" if x == SAHPI_CHIP_SET: return "CHIP_SET" if x == SAHPI_OTHER_FRU: return "OTHER_FRU" if x == SAHPI_CABLE_INTERCONNECT: return "CABLE_INTERCONNECT" if x == SAHPI_TERMINATOR: return "TERMINATOR" if x == SAHPI_SYSTEM_BOOT_INITIATED: return "SYSTEM_BOOT_INITIATED" if x == SAHPI_BOOT_ERROR: return "BOOT_ERROR" if x == SAHPI_OS_BOOT: return "OS_BOOT" if x == SAHPI_OS_CRITICAL_STOP: return "OS_CRITICAL_STOP" if x == SAHPI_SLOT_CONNECTOR: return "SLOT_CONNECTOR" if x == SAHPI_SYSTEM_ACPI_POWER_STATE: return "SYSTEM_ACPI_POWER_STATE" if x == SAHPI_RESERVED2: return "RESERVED2" if x == SAHPI_PLATFORM_ALERT: return "PLATFORM_ALERT" if x == SAHPI_ENTITY_PRESENCE: return "ENTITY_PRESENCE" if x == SAHPI_MONITOR_ASIC_IC: return "MONITOR_ASIC_IC" if x == SAHPI_LAN: return "LAN" if x == SAHPI_MANAGEMENT_SUBSYSTEM_HEALTH: return "MANAGEMENT_SUBSYSTEM_HEALTH" if x == SAHPI_BATTERY: return "BATTERY" if x == SAHPI_SESSION_AUDIT: return "SESSION_AUDIT" if x == SAHPI_VERSION_CHANGE: return "VERSION_CHANGE" if x == SAHPI_OPERATIONAL: return "OPERATIONAL" if x == SAHPI_OEM_SENSOR: return "OEM_SENSOR" if x == SAHPI_COMM_CHANNEL_LINK_STATE: return "COMM_CHANNEL_LINK_STATE" if x == SAHPI_MANAGEMENT_BUS_STATE: return "MANAGEMENT_BUS_STATE" if x == SAHPI_COMM_CHANNEL_BUS_STATE: return "COMM_CHANNEL_BUS_STATE" if x == SAHPI_CONFIG_DATA: return "CONFIG_DATA" if x == SAHPI_POWER_BUDGET: return "POWER_BUDGET" return repr( x ) def toSaHpiSensorTypeT( s ): if s == "TEMPERATURE": return SAHPI_TEMPERATURE if s == "VOLTAGE": return SAHPI_VOLTAGE if s == "CURRENT": return SAHPI_CURRENT if s == "FAN": return SAHPI_FAN if s == "PHYSICAL_SECURITY": return SAHPI_PHYSICAL_SECURITY if s == "PLATFORM_VIOLATION": return SAHPI_PLATFORM_VIOLATION if s == "PROCESSOR": return SAHPI_PROCESSOR if s == "POWER_SUPPLY": return SAHPI_POWER_SUPPLY if s == "POWER_UNIT": return SAHPI_POWER_UNIT if s == "COOLING_DEVICE": return SAHPI_COOLING_DEVICE if s == "OTHER_UNITS_BASED_SENSOR": return SAHPI_OTHER_UNITS_BASED_SENSOR if s == "MEMORY": return SAHPI_MEMORY if s == "DRIVE_SLOT": return SAHPI_DRIVE_SLOT if s == "POST_MEMORY_RESIZE": return SAHPI_POST_MEMORY_RESIZE if s == "SYSTEM_FW_PROGRESS": return SAHPI_SYSTEM_FW_PROGRESS if s == "EVENT_LOGGING_DISABLED": return SAHPI_EVENT_LOGGING_DISABLED if s == "RESERVED1": return SAHPI_RESERVED1 if s == "SYSTEM_EVENT": return SAHPI_SYSTEM_EVENT if s == "CRITICAL_INTERRUPT": return SAHPI_CRITICAL_INTERRUPT if s == "BUTTON": return SAHPI_BUTTON if s == "MODULE_BOARD": return SAHPI_MODULE_BOARD if s == "MICROCONTROLLER_COPROCESSOR": return SAHPI_MICROCONTROLLER_COPROCESSOR if s == "ADDIN_CARD": return SAHPI_ADDIN_CARD if s == "CHASSIS": return SAHPI_CHASSIS if s == "CHIP_SET": return SAHPI_CHIP_SET if s == "OTHER_FRU": return SAHPI_OTHER_FRU if s == "CABLE_INTERCONNECT": return SAHPI_CABLE_INTERCONNECT if s == "TERMINATOR": return SAHPI_TERMINATOR if s == "SYSTEM_BOOT_INITIATED": return SAHPI_SYSTEM_BOOT_INITIATED if s == "BOOT_ERROR": return SAHPI_BOOT_ERROR if s == "OS_BOOT": return SAHPI_OS_BOOT if s == "OS_CRITICAL_STOP": return SAHPI_OS_CRITICAL_STOP if s == "SLOT_CONNECTOR": return SAHPI_SLOT_CONNECTOR if s == "SYSTEM_ACPI_POWER_STATE": return SAHPI_SYSTEM_ACPI_POWER_STATE if s == "RESERVED2": return SAHPI_RESERVED2 if s == "PLATFORM_ALERT": return SAHPI_PLATFORM_ALERT if s == "ENTITY_PRESENCE": return SAHPI_ENTITY_PRESENCE if s == "MONITOR_ASIC_IC": return SAHPI_MONITOR_ASIC_IC if s == "LAN": return SAHPI_LAN if s == "MANAGEMENT_SUBSYSTEM_HEALTH": return SAHPI_MANAGEMENT_SUBSYSTEM_HEALTH if s == "BATTERY": return SAHPI_BATTERY if s == "SESSION_AUDIT": return SAHPI_SESSION_AUDIT if s == "VERSION_CHANGE": return SAHPI_VERSION_CHANGE if s == "OPERATIONAL": return SAHPI_OPERATIONAL if s == "OEM_SENSOR": return SAHPI_OEM_SENSOR if s == "COMM_CHANNEL_LINK_STATE": return SAHPI_COMM_CHANNEL_LINK_STATE if s == "MANAGEMENT_BUS_STATE": return SAHPI_MANAGEMENT_BUS_STATE if s == "COMM_CHANNEL_BUS_STATE": return SAHPI_COMM_CHANNEL_BUS_STATE if s == "CONFIG_DATA": return SAHPI_CONFIG_DATA if s == "POWER_BUDGET": return SAHPI_POWER_BUDGET raise ValueError() #** # For SaHpiSensorReadingTypeT #** def fromSaHpiSensorReadingTypeT( x ): if x == SAHPI_SENSOR_READING_TYPE_INT64: return "INT64" if x == SAHPI_SENSOR_READING_TYPE_UINT64: return "UINT64" if x == SAHPI_SENSOR_READING_TYPE_FLOAT64: return "FLOAT64" if x == SAHPI_SENSOR_READING_TYPE_BUFFER: return "BUFFER" return repr( x ) def toSaHpiSensorReadingTypeT( s ): if s == "INT64": return SAHPI_SENSOR_READING_TYPE_INT64 if s == "UINT64": return SAHPI_SENSOR_READING_TYPE_UINT64 if s == "FLOAT64": return SAHPI_SENSOR_READING_TYPE_FLOAT64 if s == "BUFFER": return SAHPI_SENSOR_READING_TYPE_BUFFER raise ValueError() #** # For SaHpiSensorEventMaskActionT #** def fromSaHpiSensorEventMaskActionT( x ): if x == SAHPI_SENS_ADD_EVENTS_TO_MASKS: return "ADD_EVENTS_TO_MASKS" if x == SAHPI_SENS_REMOVE_EVENTS_FROM_MASKS: return "REMOVE_EVENTS_FROM_MASKS" return repr( x ) def toSaHpiSensorEventMaskActionT( s ): if s == "ADD_EVENTS_TO_MASKS": return SAHPI_SENS_ADD_EVENTS_TO_MASKS if s == "REMOVE_EVENTS_FROM_MASKS": return SAHPI_SENS_REMOVE_EVENTS_FROM_MASKS raise ValueError() #** # For SaHpiSensorUnitsT #** def fromSaHpiSensorUnitsT( x ): if x == SAHPI_SU_UNSPECIFIED: return "UNSPECIFIED" if x == SAHPI_SU_DEGREES_C: return "DEGREES_C" if x == SAHPI_SU_DEGREES_F: return "DEGREES_F" if x == SAHPI_SU_DEGREES_K: return "DEGREES_K" if x == SAHPI_SU_VOLTS: return "VOLTS" if x == SAHPI_SU_AMPS: return "AMPS" if x == SAHPI_SU_WATTS: return "WATTS" if x == SAHPI_SU_JOULES: return "JOULES" if x == SAHPI_SU_COULOMBS: return "COULOMBS" if x == SAHPI_SU_VA: return "VA" if x == SAHPI_SU_NITS: return "NITS" if x == SAHPI_SU_LUMEN: return "LUMEN" if x == SAHPI_SU_LUX: return "LUX" if x == SAHPI_SU_CANDELA: return "CANDELA" if x == SAHPI_SU_KPA: return "KPA" if x == SAHPI_SU_PSI: return "PSI" if x == SAHPI_SU_NEWTON: return "NEWTON" if x == SAHPI_SU_CFM: return "CFM" if x == SAHPI_SU_RPM: return "RPM" if x == SAHPI_SU_HZ: return "HZ" if x == SAHPI_SU_MICROSECOND: return "MICROSECOND" if x == SAHPI_SU_MILLISECOND: return "MILLISECOND" if x == SAHPI_SU_SECOND: return "SECOND" if x == SAHPI_SU_MINUTE: return "MINUTE" if x == SAHPI_SU_HOUR: return "HOUR" if x == SAHPI_SU_DAY: return "DAY" if x == SAHPI_SU_WEEK: return "WEEK" if x == SAHPI_SU_MIL: return "MIL" if x == SAHPI_SU_INCHES: return "INCHES" if x == SAHPI_SU_FEET: return "FEET" if x == SAHPI_SU_CU_IN: return "CU_IN" if x == SAHPI_SU_CU_FEET: return "CU_FEET" if x == SAHPI_SU_MM: return "MM" if x == SAHPI_SU_CM: return "CM" if x == SAHPI_SU_M: return "M" if x == SAHPI_SU_CU_CM: return "CU_CM" if x == SAHPI_SU_CU_M: return "CU_M" if x == SAHPI_SU_LITERS: return "LITERS" if x == SAHPI_SU_FLUID_OUNCE: return "FLUID_OUNCE" if x == SAHPI_SU_RADIANS: return "RADIANS" if x == SAHPI_SU_STERADIANS: return "STERADIANS" if x == SAHPI_SU_REVOLUTIONS: return "REVOLUTIONS" if x == SAHPI_SU_CYCLES: return "CYCLES" if x == SAHPI_SU_GRAVITIES: return "GRAVITIES" if x == SAHPI_SU_OUNCE: return "OUNCE" if x == SAHPI_SU_POUND: return "POUND" if x == SAHPI_SU_FT_LB: return "FT_LB" if x == SAHPI_SU_OZ_IN: return "OZ_IN" if x == SAHPI_SU_GAUSS: return "GAUSS" if x == SAHPI_SU_GILBERTS: return "GILBERTS" if x == SAHPI_SU_HENRY: return "HENRY" if x == SAHPI_SU_MILLIHENRY: return "MILLIHENRY" if x == SAHPI_SU_FARAD: return "FARAD" if x == SAHPI_SU_MICROFARAD: return "MICROFARAD" if x == SAHPI_SU_OHMS: return "OHMS" if x == SAHPI_SU_SIEMENS: return "SIEMENS" if x == SAHPI_SU_MOLE: return "MOLE" if x == SAHPI_SU_BECQUEREL: return "BECQUEREL" if x == SAHPI_SU_PPM: return "PPM" if x == SAHPI_SU_RESERVED: return "RESERVED" if x == SAHPI_SU_DECIBELS: return "DECIBELS" if x == SAHPI_SU_DBA: return "DBA" if x == SAHPI_SU_DBC: return "DBC" if x == SAHPI_SU_GRAY: return "GRAY" if x == SAHPI_SU_SIEVERT: return "SIEVERT" if x == SAHPI_SU_COLOR_TEMP_DEG_K: return "COLOR_TEMP_DEG_K" if x == SAHPI_SU_BIT: return "BIT" if x == SAHPI_SU_KILOBIT: return "KILOBIT" if x == SAHPI_SU_MEGABIT: return "MEGABIT" if x == SAHPI_SU_GIGABIT: return "GIGABIT" if x == SAHPI_SU_BYTE: return "BYTE" if x == SAHPI_SU_KILOBYTE: return "KILOBYTE" if x == SAHPI_SU_MEGABYTE: return "MEGABYTE" if x == SAHPI_SU_GIGABYTE: return "GIGABYTE" if x == SAHPI_SU_WORD: return "WORD" if x == SAHPI_SU_DWORD: return "DWORD" if x == SAHPI_SU_QWORD: return "QWORD" if x == SAHPI_SU_LINE: return "LINE" if x == SAHPI_SU_HIT: return "HIT" if x == SAHPI_SU_MISS: return "MISS" if x == SAHPI_SU_RETRY: return "RETRY" if x == SAHPI_SU_RESET: return "RESET" if x == SAHPI_SU_OVERRUN: return "OVERRUN" if x == SAHPI_SU_UNDERRUN: return "UNDERRUN" if x == SAHPI_SU_COLLISION: return "COLLISION" if x == SAHPI_SU_PACKETS: return "PACKETS" if x == SAHPI_SU_MESSAGES: return "MESSAGES" if x == SAHPI_SU_CHARACTERS: return "CHARACTERS" if x == SAHPI_SU_ERRORS: return "ERRORS" if x == SAHPI_SU_CORRECTABLE_ERRORS: return "CORRECTABLE_ERRORS" if x == SAHPI_SU_UNCORRECTABLE_ERRORS: return "UNCORRECTABLE_ERRORS" return repr( x ) def toSaHpiSensorUnitsT( s ): if s == "UNSPECIFIED": return SAHPI_SU_UNSPECIFIED if s == "DEGREES_C": return SAHPI_SU_DEGREES_C if s == "DEGREES_F": return SAHPI_SU_DEGREES_F if s == "DEGREES_K": return SAHPI_SU_DEGREES_K if s == "VOLTS": return SAHPI_SU_VOLTS if s == "AMPS": return SAHPI_SU_AMPS if s == "WATTS": return SAHPI_SU_WATTS if s == "JOULES": return SAHPI_SU_JOULES if s == "COULOMBS": return SAHPI_SU_COULOMBS if s == "VA": return SAHPI_SU_VA if s == "NITS": return SAHPI_SU_NITS if s == "LUMEN": return SAHPI_SU_LUMEN if s == "LUX": return SAHPI_SU_LUX if s == "CANDELA": return SAHPI_SU_CANDELA if s == "KPA": return SAHPI_SU_KPA if s == "PSI": return SAHPI_SU_PSI if s == "NEWTON": return SAHPI_SU_NEWTON if s == "CFM": return SAHPI_SU_CFM if s == "RPM": return SAHPI_SU_RPM if s == "HZ": return SAHPI_SU_HZ if s == "MICROSECOND": return SAHPI_SU_MICROSECOND if s == "MILLISECOND": return SAHPI_SU_MILLISECOND if s == "SECOND": return SAHPI_SU_SECOND if s == "MINUTE": return SAHPI_SU_MINUTE if s == "HOUR": return SAHPI_SU_HOUR if s == "DAY": return SAHPI_SU_DAY if s == "WEEK": return SAHPI_SU_WEEK if s == "MIL": return SAHPI_SU_MIL if s == "INCHES": return SAHPI_SU_INCHES if s == "FEET": return SAHPI_SU_FEET if s == "CU_IN": return SAHPI_SU_CU_IN if s == "CU_FEET": return SAHPI_SU_CU_FEET if s == "MM": return SAHPI_SU_MM if s == "CM": return SAHPI_SU_CM if s == "M": return SAHPI_SU_M if s == "CU_CM": return SAHPI_SU_CU_CM if s == "CU_M": return SAHPI_SU_CU_M if s == "LITERS": return SAHPI_SU_LITERS if s == "FLUID_OUNCE": return SAHPI_SU_FLUID_OUNCE if s == "RADIANS": return SAHPI_SU_RADIANS if s == "STERADIANS": return SAHPI_SU_STERADIANS if s == "REVOLUTIONS": return SAHPI_SU_REVOLUTIONS if s == "CYCLES": return SAHPI_SU_CYCLES if s == "GRAVITIES": return SAHPI_SU_GRAVITIES if s == "OUNCE": return SAHPI_SU_OUNCE if s == "POUND": return SAHPI_SU_POUND if s == "FT_LB": return SAHPI_SU_FT_LB if s == "OZ_IN": return SAHPI_SU_OZ_IN if s == "GAUSS": return SAHPI_SU_GAUSS if s == "GILBERTS": return SAHPI_SU_GILBERTS if s == "HENRY": return SAHPI_SU_HENRY if s == "MILLIHENRY": return SAHPI_SU_MILLIHENRY if s == "FARAD": return SAHPI_SU_FARAD if s == "MICROFARAD": return SAHPI_SU_MICROFARAD if s == "OHMS": return SAHPI_SU_OHMS if s == "SIEMENS": return SAHPI_SU_SIEMENS if s == "MOLE": return SAHPI_SU_MOLE if s == "BECQUEREL": return SAHPI_SU_BECQUEREL if s == "PPM": return SAHPI_SU_PPM if s == "RESERVED": return SAHPI_SU_RESERVED if s == "DECIBELS": return SAHPI_SU_DECIBELS if s == "DBA": return SAHPI_SU_DBA if s == "DBC": return SAHPI_SU_DBC if s == "GRAY": return SAHPI_SU_GRAY if s == "SIEVERT": return SAHPI_SU_SIEVERT if s == "COLOR_TEMP_DEG_K": return SAHPI_SU_COLOR_TEMP_DEG_K if s == "BIT": return SAHPI_SU_BIT if s == "KILOBIT": return SAHPI_SU_KILOBIT if s == "MEGABIT": return SAHPI_SU_MEGABIT if s == "GIGABIT": return SAHPI_SU_GIGABIT if s == "BYTE": return SAHPI_SU_BYTE if s == "KILOBYTE": return SAHPI_SU_KILOBYTE if s == "MEGABYTE": return SAHPI_SU_MEGABYTE if s == "GIGABYTE": return SAHPI_SU_GIGABYTE if s == "WORD": return SAHPI_SU_WORD if s == "DWORD": return SAHPI_SU_DWORD if s == "QWORD": return SAHPI_SU_QWORD if s == "LINE": return SAHPI_SU_LINE if s == "HIT": return SAHPI_SU_HIT if s == "MISS": return SAHPI_SU_MISS if s == "RETRY": return SAHPI_SU_RETRY if s == "RESET": return SAHPI_SU_RESET if s == "OVERRUN": return SAHPI_SU_OVERRUN if s == "UNDERRUN": return SAHPI_SU_UNDERRUN if s == "COLLISION": return SAHPI_SU_COLLISION if s == "PACKETS": return SAHPI_SU_PACKETS if s == "MESSAGES": return SAHPI_SU_MESSAGES if s == "CHARACTERS": return SAHPI_SU_CHARACTERS if s == "ERRORS": return SAHPI_SU_ERRORS if s == "CORRECTABLE_ERRORS": return SAHPI_SU_CORRECTABLE_ERRORS if s == "UNCORRECTABLE_ERRORS": return SAHPI_SU_UNCORRECTABLE_ERRORS raise ValueError() #** # For SaHpiSensorModUnitUseT #** def fromSaHpiSensorModUnitUseT( x ): if x == SAHPI_SMUU_NONE: return "NONE" if x == SAHPI_SMUU_BASIC_OVER_MODIFIER: return "BASIC_OVER_MODIFIER" if x == SAHPI_SMUU_BASIC_TIMES_MODIFIER: return "BASIC_TIMES_MODIFIER" return repr( x ) def toSaHpiSensorModUnitUseT( s ): if s == "NONE": return SAHPI_SMUU_NONE if s == "BASIC_OVER_MODIFIER": return SAHPI_SMUU_BASIC_OVER_MODIFIER if s == "BASIC_TIMES_MODIFIER": return SAHPI_SMUU_BASIC_TIMES_MODIFIER raise ValueError() #** # For SaHpiSensorEventCtrlT #** def fromSaHpiSensorEventCtrlT( x ): if x == SAHPI_SEC_PER_EVENT: return "PER_EVENT" if x == SAHPI_SEC_READ_ONLY_MASKS: return "READ_ONLY_MASKS" if x == SAHPI_SEC_READ_ONLY: return "READ_ONLY" return repr( x ) def toSaHpiSensorEventCtrlT( s ): if s == "PER_EVENT": return SAHPI_SEC_PER_EVENT if s == "READ_ONLY_MASKS": return SAHPI_SEC_READ_ONLY_MASKS if s == "READ_ONLY": return SAHPI_SEC_READ_ONLY raise ValueError() #** # For SaHpiCtrlTypeT #** def fromSaHpiCtrlTypeT( x ): if x == SAHPI_CTRL_TYPE_DIGITAL: return "DIGITAL" if x == SAHPI_CTRL_TYPE_DISCRETE: return "DISCRETE" if x == SAHPI_CTRL_TYPE_ANALOG: return "ANALOG" if x == SAHPI_CTRL_TYPE_STREAM: return "STREAM" if x == SAHPI_CTRL_TYPE_TEXT: return "TEXT" if x == SAHPI_CTRL_TYPE_OEM: return "OEM" return repr( x ) def toSaHpiCtrlTypeT( s ): if s == "DIGITAL": return SAHPI_CTRL_TYPE_DIGITAL if s == "DISCRETE": return SAHPI_CTRL_TYPE_DISCRETE if s == "ANALOG": return SAHPI_CTRL_TYPE_ANALOG if s == "STREAM": return SAHPI_CTRL_TYPE_STREAM if s == "TEXT": return SAHPI_CTRL_TYPE_TEXT if s == "OEM": return SAHPI_CTRL_TYPE_OEM raise ValueError() #** # For SaHpiCtrlStateDigitalT #** def fromSaHpiCtrlStateDigitalT( x ): if x == SAHPI_CTRL_STATE_OFF: return "OFF" if x == SAHPI_CTRL_STATE_ON: return "ON" if x == SAHPI_CTRL_STATE_PULSE_OFF: return "PULSE_OFF" if x == SAHPI_CTRL_STATE_PULSE_ON: return "PULSE_ON" return repr( x ) def toSaHpiCtrlStateDigitalT( s ): if s == "OFF": return SAHPI_CTRL_STATE_OFF if s == "ON": return SAHPI_CTRL_STATE_ON if s == "PULSE_OFF": return SAHPI_CTRL_STATE_PULSE_OFF if s == "PULSE_ON": return SAHPI_CTRL_STATE_PULSE_ON raise ValueError() #** # For SaHpiCtrlModeT #** def fromSaHpiCtrlModeT( x ): if x == SAHPI_CTRL_MODE_AUTO: return "AUTO" if x == SAHPI_CTRL_MODE_MANUAL: return "MANUAL" return repr( x ) def toSaHpiCtrlModeT( s ): if s == "AUTO": return SAHPI_CTRL_MODE_AUTO if s == "MANUAL": return SAHPI_CTRL_MODE_MANUAL raise ValueError() #** # For SaHpiCtrlOutputTypeT #** def fromSaHpiCtrlOutputTypeT( x ): if x == SAHPI_CTRL_GENERIC: return "GENERIC" if x == SAHPI_CTRL_LED: return "LED" if x == SAHPI_CTRL_FAN_SPEED: return "FAN_SPEED" if x == SAHPI_CTRL_DRY_CONTACT_CLOSURE: return "DRY_CONTACT_CLOSURE" if x == SAHPI_CTRL_POWER_SUPPLY_INHIBIT: return "POWER_SUPPLY_INHIBIT" if x == SAHPI_CTRL_AUDIBLE: return "AUDIBLE" if x == SAHPI_CTRL_FRONT_PANEL_LOCKOUT: return "FRONT_PANEL_LOCKOUT" if x == SAHPI_CTRL_POWER_INTERLOCK: return "POWER_INTERLOCK" if x == SAHPI_CTRL_POWER_STATE: return "POWER_STATE" if x == SAHPI_CTRL_LCD_DISPLAY: return "LCD_DISPLAY" if x == SAHPI_CTRL_OEM: return "OEM" if x == SAHPI_CTRL_GENERIC_ADDRESS: return "GENERIC_ADDRESS" if x == SAHPI_CTRL_IP_ADDRESS: return "IP_ADDRESS" if x == SAHPI_CTRL_RESOURCE_ID: return "RESOURCE_ID" if x == SAHPI_CTRL_POWER_BUDGET: return "POWER_BUDGET" if x == SAHPI_CTRL_ACTIVATE: return "ACTIVATE" if x == SAHPI_CTRL_RESET: return "RESET" return repr( x ) def toSaHpiCtrlOutputTypeT( s ): if s == "GENERIC": return SAHPI_CTRL_GENERIC if s == "LED": return SAHPI_CTRL_LED if s == "FAN_SPEED": return SAHPI_CTRL_FAN_SPEED if s == "DRY_CONTACT_CLOSURE": return SAHPI_CTRL_DRY_CONTACT_CLOSURE if s == "POWER_SUPPLY_INHIBIT": return SAHPI_CTRL_POWER_SUPPLY_INHIBIT if s == "AUDIBLE": return SAHPI_CTRL_AUDIBLE if s == "FRONT_PANEL_LOCKOUT": return SAHPI_CTRL_FRONT_PANEL_LOCKOUT if s == "POWER_INTERLOCK": return SAHPI_CTRL_POWER_INTERLOCK if s == "POWER_STATE": return SAHPI_CTRL_POWER_STATE if s == "LCD_DISPLAY": return SAHPI_CTRL_LCD_DISPLAY if s == "OEM": return SAHPI_CTRL_OEM if s == "GENERIC_ADDRESS": return SAHPI_CTRL_GENERIC_ADDRESS if s == "IP_ADDRESS": return SAHPI_CTRL_IP_ADDRESS if s == "RESOURCE_ID": return SAHPI_CTRL_RESOURCE_ID if s == "POWER_BUDGET": return SAHPI_CTRL_POWER_BUDGET if s == "ACTIVATE": return SAHPI_CTRL_ACTIVATE if s == "RESET": return SAHPI_CTRL_RESET raise ValueError() #** # For SaHpiIdrAreaTypeT #** def fromSaHpiIdrAreaTypeT( x ): if x == SAHPI_IDR_AREATYPE_INTERNAL_USE: return "INTERNAL_USE" if x == SAHPI_IDR_AREATYPE_CHASSIS_INFO: return "CHASSIS_INFO" if x == SAHPI_IDR_AREATYPE_BOARD_INFO: return "BOARD_INFO" if x == SAHPI_IDR_AREATYPE_PRODUCT_INFO: return "PRODUCT_INFO" if x == SAHPI_IDR_AREATYPE_OEM: return "OEM" if x == SAHPI_IDR_AREATYPE_UNSPECIFIED: return "UNSPECIFIED" return repr( x ) def toSaHpiIdrAreaTypeT( s ): if s == "INTERNAL_USE": return SAHPI_IDR_AREATYPE_INTERNAL_USE if s == "CHASSIS_INFO": return SAHPI_IDR_AREATYPE_CHASSIS_INFO if s == "BOARD_INFO": return SAHPI_IDR_AREATYPE_BOARD_INFO if s == "PRODUCT_INFO": return SAHPI_IDR_AREATYPE_PRODUCT_INFO if s == "OEM": return SAHPI_IDR_AREATYPE_OEM if s == "UNSPECIFIED": return SAHPI_IDR_AREATYPE_UNSPECIFIED raise ValueError() #** # For SaHpiIdrFieldTypeT #** def fromSaHpiIdrFieldTypeT( x ): if x == SAHPI_IDR_FIELDTYPE_CHASSIS_TYPE: return "CHASSIS_TYPE" if x == SAHPI_IDR_FIELDTYPE_MFG_DATETIME: return "MFG_DATETIME" if x == SAHPI_IDR_FIELDTYPE_MANUFACTURER: return "MANUFACTURER" if x == SAHPI_IDR_FIELDTYPE_PRODUCT_NAME: return "PRODUCT_NAME" if x == SAHPI_IDR_FIELDTYPE_PRODUCT_VERSION: return "PRODUCT_VERSION" if x == SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER: return "SERIAL_NUMBER" if x == SAHPI_IDR_FIELDTYPE_PART_NUMBER: return "PART_NUMBER" if x == SAHPI_IDR_FIELDTYPE_FILE_ID: return "FILE_ID" if x == SAHPI_IDR_FIELDTYPE_ASSET_TAG: return "ASSET_TAG" if x == SAHPI_IDR_FIELDTYPE_CUSTOM: return "CUSTOM" if x == SAHPI_IDR_FIELDTYPE_UNSPECIFIED: return "UNSPECIFIED" return repr( x ) def toSaHpiIdrFieldTypeT( s ): if s == "CHASSIS_TYPE": return SAHPI_IDR_FIELDTYPE_CHASSIS_TYPE if s == "MFG_DATETIME": return SAHPI_IDR_FIELDTYPE_MFG_DATETIME if s == "MANUFACTURER": return SAHPI_IDR_FIELDTYPE_MANUFACTURER if s == "PRODUCT_NAME": return SAHPI_IDR_FIELDTYPE_PRODUCT_NAME if s == "PRODUCT_VERSION": return SAHPI_IDR_FIELDTYPE_PRODUCT_VERSION if s == "SERIAL_NUMBER": return SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER if s == "PART_NUMBER": return SAHPI_IDR_FIELDTYPE_PART_NUMBER if s == "FILE_ID": return SAHPI_IDR_FIELDTYPE_FILE_ID if s == "ASSET_TAG": return SAHPI_IDR_FIELDTYPE_ASSET_TAG if s == "CUSTOM": return SAHPI_IDR_FIELDTYPE_CUSTOM if s == "UNSPECIFIED": return SAHPI_IDR_FIELDTYPE_UNSPECIFIED raise ValueError() #** # For SaHpiWatchdogActionT #** def fromSaHpiWatchdogActionT( x ): if x == SAHPI_WA_NO_ACTION: return "NO_ACTION" if x == SAHPI_WA_RESET: return "RESET" if x == SAHPI_WA_POWER_DOWN: return "POWER_DOWN" if x == SAHPI_WA_POWER_CYCLE: return "POWER_CYCLE" return repr( x ) def toSaHpiWatchdogActionT( s ): if s == "NO_ACTION": return SAHPI_WA_NO_ACTION if s == "RESET": return SAHPI_WA_RESET if s == "POWER_DOWN": return SAHPI_WA_POWER_DOWN if s == "POWER_CYCLE": return SAHPI_WA_POWER_CYCLE raise ValueError() #** # For SaHpiWatchdogActionEventT #** def fromSaHpiWatchdogActionEventT( x ): if x == SAHPI_WAE_NO_ACTION: return "NO_ACTION" if x == SAHPI_WAE_RESET: return "RESET" if x == SAHPI_WAE_POWER_DOWN: return "POWER_DOWN" if x == SAHPI_WAE_POWER_CYCLE: return "POWER_CYCLE" if x == SAHPI_WAE_TIMER_INT: return "TIMER_INT" return repr( x ) def toSaHpiWatchdogActionEventT( s ): if s == "NO_ACTION": return SAHPI_WAE_NO_ACTION if s == "RESET": return SAHPI_WAE_RESET if s == "POWER_DOWN": return SAHPI_WAE_POWER_DOWN if s == "POWER_CYCLE": return SAHPI_WAE_POWER_CYCLE if s == "TIMER_INT": return SAHPI_WAE_TIMER_INT raise ValueError() #** # For SaHpiWatchdogPretimerInterruptT #** def fromSaHpiWatchdogPretimerInterruptT( x ): if x == SAHPI_WPI_NONE: return "NONE" if x == SAHPI_WPI_SMI: return "SMI" if x == SAHPI_WPI_NMI: return "NMI" if x == SAHPI_WPI_MESSAGE_INTERRUPT: return "MESSAGE_INTERRUPT" if x == SAHPI_WPI_OEM: return "OEM" return repr( x ) def toSaHpiWatchdogPretimerInterruptT( s ): if s == "NONE": return SAHPI_WPI_NONE if s == "SMI": return SAHPI_WPI_SMI if s == "NMI": return SAHPI_WPI_NMI if s == "MESSAGE_INTERRUPT": return SAHPI_WPI_MESSAGE_INTERRUPT if s == "OEM": return SAHPI_WPI_OEM raise ValueError() #** # For SaHpiWatchdogTimerUseT #** def fromSaHpiWatchdogTimerUseT( x ): if x == SAHPI_WTU_NONE: return "NONE" if x == SAHPI_WTU_BIOS_FRB2: return "BIOS_FRB2" if x == SAHPI_WTU_BIOS_POST: return "BIOS_POST" if x == SAHPI_WTU_OS_LOAD: return "OS_LOAD" if x == SAHPI_WTU_SMS_OS: return "SMS_OS" if x == SAHPI_WTU_OEM: return "OEM" if x == SAHPI_WTU_UNSPECIFIED: return "UNSPECIFIED" return repr( x ) def toSaHpiWatchdogTimerUseT( s ): if s == "NONE": return SAHPI_WTU_NONE if s == "BIOS_FRB2": return SAHPI_WTU_BIOS_FRB2 if s == "BIOS_POST": return SAHPI_WTU_BIOS_POST if s == "OS_LOAD": return SAHPI_WTU_OS_LOAD if s == "SMS_OS": return SAHPI_WTU_SMS_OS if s == "OEM": return SAHPI_WTU_OEM if s == "UNSPECIFIED": return SAHPI_WTU_UNSPECIFIED raise ValueError() #** # For SaHpiDimiTestServiceImpactT #** def fromSaHpiDimiTestServiceImpactT( x ): if x == SAHPI_DIMITEST_NONDEGRADING: return "NONDEGRADING" if x == SAHPI_DIMITEST_DEGRADING: return "DEGRADING" if x == SAHPI_DIMITEST_VENDOR_DEFINED_LEVEL: return "VENDOR_DEFINED_LEVEL" return repr( x ) def toSaHpiDimiTestServiceImpactT( s ): if s == "NONDEGRADING": return SAHPI_DIMITEST_NONDEGRADING if s == "DEGRADING": return SAHPI_DIMITEST_DEGRADING if s == "VENDOR_DEFINED_LEVEL": return SAHPI_DIMITEST_VENDOR_DEFINED_LEVEL raise ValueError() #** # For SaHpiDimiTestRunStatusT #** def fromSaHpiDimiTestRunStatusT( x ): if x == SAHPI_DIMITEST_STATUS_NOT_RUN: return "NOT_RUN" if x == SAHPI_DIMITEST_STATUS_FINISHED_NO_ERRORS: return "FINISHED_NO_ERRORS" if x == SAHPI_DIMITEST_STATUS_FINISHED_ERRORS: return "FINISHED_ERRORS" if x == SAHPI_DIMITEST_STATUS_CANCELED: return "CANCELED" if x == SAHPI_DIMITEST_STATUS_RUNNING: return "RUNNING" return repr( x ) def toSaHpiDimiTestRunStatusT( s ): if s == "NOT_RUN": return SAHPI_DIMITEST_STATUS_NOT_RUN if s == "FINISHED_NO_ERRORS": return SAHPI_DIMITEST_STATUS_FINISHED_NO_ERRORS if s == "FINISHED_ERRORS": return SAHPI_DIMITEST_STATUS_FINISHED_ERRORS if s == "CANCELED": return SAHPI_DIMITEST_STATUS_CANCELED if s == "RUNNING": return SAHPI_DIMITEST_STATUS_RUNNING raise ValueError() #** # For SaHpiDimiTestErrCodeT #** def fromSaHpiDimiTestErrCodeT( x ): if x == SAHPI_DIMITEST_STATUSERR_NOERR: return "NOERR" if x == SAHPI_DIMITEST_STATUSERR_RUNERR: return "RUNERR" if x == SAHPI_DIMITEST_STATUSERR_UNDEF: return "UNDEF" return repr( x ) def toSaHpiDimiTestErrCodeT( s ): if s == "NOERR": return SAHPI_DIMITEST_STATUSERR_NOERR if s == "RUNERR": return SAHPI_DIMITEST_STATUSERR_RUNERR if s == "UNDEF": return SAHPI_DIMITEST_STATUSERR_UNDEF raise ValueError() #** # For SaHpiDimiTestParamTypeT #** def fromSaHpiDimiTestParamTypeT( x ): if x == SAHPI_DIMITEST_PARAM_TYPE_BOOLEAN: return "BOOLEAN" if x == SAHPI_DIMITEST_PARAM_TYPE_INT32: return "INT32" if x == SAHPI_DIMITEST_PARAM_TYPE_FLOAT64: return "FLOAT64" if x == SAHPI_DIMITEST_PARAM_TYPE_TEXT: return "TEXT" return repr( x ) def toSaHpiDimiTestParamTypeT( s ): if s == "BOOLEAN": return SAHPI_DIMITEST_PARAM_TYPE_BOOLEAN if s == "INT32": return SAHPI_DIMITEST_PARAM_TYPE_INT32 if s == "FLOAT64": return SAHPI_DIMITEST_PARAM_TYPE_FLOAT64 if s == "TEXT": return SAHPI_DIMITEST_PARAM_TYPE_TEXT raise ValueError() #** # For SaHpiDimiReadyT #** def fromSaHpiDimiReadyT( x ): if x == SAHPI_DIMI_READY: return "READY" if x == SAHPI_DIMI_WRONG_STATE: return "WRONG_STATE" if x == SAHPI_DIMI_BUSY: return "BUSY" return repr( x ) def toSaHpiDimiReadyT( s ): if s == "READY": return SAHPI_DIMI_READY if s == "WRONG_STATE": return SAHPI_DIMI_WRONG_STATE if s == "BUSY": return SAHPI_DIMI_BUSY raise ValueError() #** # For SaHpiFumiSpecInfoTypeT #** def fromSaHpiFumiSpecInfoTypeT( x ): if x == SAHPI_FUMI_SPEC_INFO_NONE: return "NONE" if x == SAHPI_FUMI_SPEC_INFO_SAF_DEFINED: return "SAF_DEFINED" if x == SAHPI_FUMI_SPEC_INFO_OEM_DEFINED: return "OEM_DEFINED" return repr( x ) def toSaHpiFumiSpecInfoTypeT( s ): if s == "NONE": return SAHPI_FUMI_SPEC_INFO_NONE if s == "SAF_DEFINED": return SAHPI_FUMI_SPEC_INFO_SAF_DEFINED if s == "OEM_DEFINED": return SAHPI_FUMI_SPEC_INFO_OEM_DEFINED raise ValueError() #** # For SaHpiFumiSafDefinedSpecIdT #** def fromSaHpiFumiSafDefinedSpecIdT( x ): if x == SAHPI_FUMI_SPEC_HPM1: return "" return repr( x ) def toSaHpiFumiSafDefinedSpecIdT( s ): if s == "": return SAHPI_FUMI_SPEC_HPM1 raise ValueError() #** # For SaHpiFumiServiceImpactT #** def fromSaHpiFumiServiceImpactT( x ): if x == SAHPI_FUMI_PROCESS_NONDEGRADING: return "NONDEGRADING" if x == SAHPI_FUMI_PROCESS_DEGRADING: return "DEGRADING" if x == SAHPI_FUMI_PROCESS_VENDOR_DEFINED_IMPACT_LEVEL: return "VENDOR_DEFINED_IMPACT_LEVEL" return repr( x ) def toSaHpiFumiServiceImpactT( s ): if s == "NONDEGRADING": return SAHPI_FUMI_PROCESS_NONDEGRADING if s == "DEGRADING": return SAHPI_FUMI_PROCESS_DEGRADING if s == "VENDOR_DEFINED_IMPACT_LEVEL": return SAHPI_FUMI_PROCESS_VENDOR_DEFINED_IMPACT_LEVEL raise ValueError() #** # For SaHpiFumiSourceStatusT #** def fromSaHpiFumiSourceStatusT( x ): if x == SAHPI_FUMI_SRC_VALID: return "VALID" if x == SAHPI_FUMI_SRC_PROTOCOL_NOT_SUPPORTED: return "PROTOCOL_NOT_SUPPORTED" if x == SAHPI_FUMI_SRC_UNREACHABLE: return "UNREACHABLE" if x == SAHPI_FUMI_SRC_VALIDATION_NOT_STARTED: return "VALIDATION_NOT_STARTED" if x == SAHPI_FUMI_SRC_VALIDATION_INITIATED: return "VALIDATION_INITIATED" if x == SAHPI_FUMI_SRC_VALIDATION_FAIL: return "VALIDATION_FAIL" if x == SAHPI_FUMI_SRC_TYPE_MISMATCH: return "TYPE_MISMATCH" if x == SAHPI_FUMI_SRC_INVALID: return "INVALID" if x == SAHPI_FUMI_SRC_VALIDITY_UNKNOWN: return "VALIDITY_UNKNOWN" return repr( x ) def toSaHpiFumiSourceStatusT( s ): if s == "VALID": return SAHPI_FUMI_SRC_VALID if s == "PROTOCOL_NOT_SUPPORTED": return SAHPI_FUMI_SRC_PROTOCOL_NOT_SUPPORTED if s == "UNREACHABLE": return SAHPI_FUMI_SRC_UNREACHABLE if s == "VALIDATION_NOT_STARTED": return SAHPI_FUMI_SRC_VALIDATION_NOT_STARTED if s == "VALIDATION_INITIATED": return SAHPI_FUMI_SRC_VALIDATION_INITIATED if s == "VALIDATION_FAIL": return SAHPI_FUMI_SRC_VALIDATION_FAIL if s == "TYPE_MISMATCH": return SAHPI_FUMI_SRC_TYPE_MISMATCH if s == "INVALID": return SAHPI_FUMI_SRC_INVALID if s == "VALIDITY_UNKNOWN": return SAHPI_FUMI_SRC_VALIDITY_UNKNOWN raise ValueError() #** # For SaHpiFumiBankStateT #** def fromSaHpiFumiBankStateT( x ): if x == SAHPI_FUMI_BANK_VALID: return "VALID" if x == SAHPI_FUMI_BANK_UPGRADE_IN_PROGRESS: return "UPGRADE_IN_PROGRESS" if x == SAHPI_FUMI_BANK_CORRUPTED: return "CORRUPTED" if x == SAHPI_FUMI_BANK_ACTIVE: return "ACTIVE" if x == SAHPI_FUMI_BANK_BUSY: return "BUSY" if x == SAHPI_FUMI_BANK_UNKNOWN: return "UNKNOWN" return repr( x ) def toSaHpiFumiBankStateT( s ): if s == "VALID": return SAHPI_FUMI_BANK_VALID if s == "UPGRADE_IN_PROGRESS": return SAHPI_FUMI_BANK_UPGRADE_IN_PROGRESS if s == "CORRUPTED": return SAHPI_FUMI_BANK_CORRUPTED if s == "ACTIVE": return SAHPI_FUMI_BANK_ACTIVE if s == "BUSY": return SAHPI_FUMI_BANK_BUSY if s == "UNKNOWN": return SAHPI_FUMI_BANK_UNKNOWN raise ValueError() #** # For SaHpiFumiUpgradeStatusT #** def fromSaHpiFumiUpgradeStatusT( x ): if x == SAHPI_FUMI_OPERATION_NOTSTARTED: return "OPERATION_NOTSTARTED" if x == SAHPI_FUMI_SOURCE_VALIDATION_INITIATED: return "SOURCE_VALIDATION_INITIATED" if x == SAHPI_FUMI_SOURCE_VALIDATION_FAILED: return "SOURCE_VALIDATION_FAILED" if x == SAHPI_FUMI_SOURCE_VALIDATION_DONE: return "SOURCE_VALIDATION_DONE" if x == SAHPI_FUMI_SOURCE_VALIDATION_CANCELLED: return "SOURCE_VALIDATION_CANCELLED" if x == SAHPI_FUMI_INSTALL_INITIATED: return "INSTALL_INITIATED" if x == SAHPI_FUMI_INSTALL_FAILED_ROLLBACK_NEEDED: return "INSTALL_FAILED_ROLLBACK_NEEDED" if x == SAHPI_FUMI_INSTALL_FAILED_ROLLBACK_INITIATED: return "INSTALL_FAILED_ROLLBACK_INITIATED" if x == SAHPI_FUMI_INSTALL_FAILED_ROLLBACK_NOT_POSSIBLE: return "INSTALL_FAILED_ROLLBACK_NOT_POSSIBLE" if x == SAHPI_FUMI_INSTALL_DONE: return "INSTALL_DONE" if x == SAHPI_FUMI_INSTALL_CANCELLED: return "INSTALL_CANCELLED" if x == SAHPI_FUMI_ROLLBACK_INITIATED: return "ROLLBACK_INITIATED" if x == SAHPI_FUMI_ROLLBACK_FAILED: return "ROLLBACK_FAILED" if x == SAHPI_FUMI_ROLLBACK_DONE: return "ROLLBACK_DONE" if x == SAHPI_FUMI_ROLLBACK_CANCELLED: return "ROLLBACK_CANCELLED" if x == SAHPI_FUMI_BACKUP_INITIATED: return "BACKUP_INITIATED" if x == SAHPI_FUMI_BACKUP_FAILED: return "BACKUP_FAILED" if x == SAHPI_FUMI_BACKUP_DONE: return "BACKUP_DONE" if x == SAHPI_FUMI_BACKUP_CANCELLED: return "BACKUP_CANCELLED" if x == SAHPI_FUMI_BANK_COPY_INITIATED: return "BANK_COPY_INITIATED" if x == SAHPI_FUMI_BANK_COPY_FAILED: return "BANK_COPY_FAILED" if x == SAHPI_FUMI_BANK_COPY_DONE: return "BANK_COPY_DONE" if x == SAHPI_FUMI_BANK_COPY_CANCELLED: return "BANK_COPY_CANCELLED" if x == SAHPI_FUMI_TARGET_VERIFY_INITIATED: return "TARGET_VERIFY_INITIATED" if x == SAHPI_FUMI_TARGET_VERIFY_FAILED: return "TARGET_VERIFY_FAILED" if x == SAHPI_FUMI_TARGET_VERIFY_DONE: return "TARGET_VERIFY_DONE" if x == SAHPI_FUMI_TARGET_VERIFY_CANCELLED: return "TARGET_VERIFY_CANCELLED" if x == SAHPI_FUMI_ACTIVATE_INITIATED: return "ACTIVATE_INITIATED" if x == SAHPI_FUMI_ACTIVATE_FAILED_ROLLBACK_NEEDED: return "ACTIVATE_FAILED_ROLLBACK_NEEDED" if x == SAHPI_FUMI_ACTIVATE_FAILED_ROLLBACK_INITIATED: return "ACTIVATE_FAILED_ROLLBACK_INITIATED" if x == SAHPI_FUMI_ACTIVATE_FAILED_ROLLBACK_NOT_POSSIBLE: return "ACTIVATE_FAILED_ROLLBACK_NOT_POSSIBLE" if x == SAHPI_FUMI_ACTIVATE_DONE: return "ACTIVATE_DONE" if x == SAHPI_FUMI_ACTIVATE_CANCELLED: return "ACTIVATE_CANCELLED" return repr( x ) def toSaHpiFumiUpgradeStatusT( s ): if s == "OPERATION_NOTSTARTED": return SAHPI_FUMI_OPERATION_NOTSTARTED if s == "SOURCE_VALIDATION_INITIATED": return SAHPI_FUMI_SOURCE_VALIDATION_INITIATED if s == "SOURCE_VALIDATION_FAILED": return SAHPI_FUMI_SOURCE_VALIDATION_FAILED if s == "SOURCE_VALIDATION_DONE": return SAHPI_FUMI_SOURCE_VALIDATION_DONE if s == "SOURCE_VALIDATION_CANCELLED": return SAHPI_FUMI_SOURCE_VALIDATION_CANCELLED if s == "INSTALL_INITIATED": return SAHPI_FUMI_INSTALL_INITIATED if s == "INSTALL_FAILED_ROLLBACK_NEEDED": return SAHPI_FUMI_INSTALL_FAILED_ROLLBACK_NEEDED if s == "INSTALL_FAILED_ROLLBACK_INITIATED": return SAHPI_FUMI_INSTALL_FAILED_ROLLBACK_INITIATED if s == "INSTALL_FAILED_ROLLBACK_NOT_POSSIBLE": return SAHPI_FUMI_INSTALL_FAILED_ROLLBACK_NOT_POSSIBLE if s == "INSTALL_DONE": return SAHPI_FUMI_INSTALL_DONE if s == "INSTALL_CANCELLED": return SAHPI_FUMI_INSTALL_CANCELLED if s == "ROLLBACK_INITIATED": return SAHPI_FUMI_ROLLBACK_INITIATED if s == "ROLLBACK_FAILED": return SAHPI_FUMI_ROLLBACK_FAILED if s == "ROLLBACK_DONE": return SAHPI_FUMI_ROLLBACK_DONE if s == "ROLLBACK_CANCELLED": return SAHPI_FUMI_ROLLBACK_CANCELLED if s == "BACKUP_INITIATED": return SAHPI_FUMI_BACKUP_INITIATED if s == "BACKUP_FAILED": return SAHPI_FUMI_BACKUP_FAILED if s == "BACKUP_DONE": return SAHPI_FUMI_BACKUP_DONE if s == "BACKUP_CANCELLED": return SAHPI_FUMI_BACKUP_CANCELLED if s == "BANK_COPY_INITIATED": return SAHPI_FUMI_BANK_COPY_INITIATED if s == "BANK_COPY_FAILED": return SAHPI_FUMI_BANK_COPY_FAILED if s == "BANK_COPY_DONE": return SAHPI_FUMI_BANK_COPY_DONE if s == "BANK_COPY_CANCELLED": return SAHPI_FUMI_BANK_COPY_CANCELLED if s == "TARGET_VERIFY_INITIATED": return SAHPI_FUMI_TARGET_VERIFY_INITIATED if s == "TARGET_VERIFY_FAILED": return SAHPI_FUMI_TARGET_VERIFY_FAILED if s == "TARGET_VERIFY_DONE": return SAHPI_FUMI_TARGET_VERIFY_DONE if s == "TARGET_VERIFY_CANCELLED": return SAHPI_FUMI_TARGET_VERIFY_CANCELLED if s == "ACTIVATE_INITIATED": return SAHPI_FUMI_ACTIVATE_INITIATED if s == "ACTIVATE_FAILED_ROLLBACK_NEEDED": return SAHPI_FUMI_ACTIVATE_FAILED_ROLLBACK_NEEDED if s == "ACTIVATE_FAILED_ROLLBACK_INITIATED": return SAHPI_FUMI_ACTIVATE_FAILED_ROLLBACK_INITIATED if s == "ACTIVATE_FAILED_ROLLBACK_NOT_POSSIBLE": return SAHPI_FUMI_ACTIVATE_FAILED_ROLLBACK_NOT_POSSIBLE if s == "ACTIVATE_DONE": return SAHPI_FUMI_ACTIVATE_DONE if s == "ACTIVATE_CANCELLED": return SAHPI_FUMI_ACTIVATE_CANCELLED raise ValueError() #** # For SaHpiHsIndicatorStateT #** def fromSaHpiHsIndicatorStateT( x ): if x == SAHPI_HS_INDICATOR_OFF: return "FF" if x == SAHPI_HS_INDICATOR_ON: return "N" return repr( x ) def toSaHpiHsIndicatorStateT( s ): if s == "FF": return SAHPI_HS_INDICATOR_OFF if s == "N": return SAHPI_HS_INDICATOR_ON raise ValueError() #** # For SaHpiHsActionT #** def fromSaHpiHsActionT( x ): if x == SAHPI_HS_ACTION_INSERTION: return "INSERTION" if x == SAHPI_HS_ACTION_EXTRACTION: return "EXTRACTION" return repr( x ) def toSaHpiHsActionT( s ): if s == "INSERTION": return SAHPI_HS_ACTION_INSERTION if s == "EXTRACTION": return SAHPI_HS_ACTION_EXTRACTION raise ValueError() #** # For SaHpiHsStateT #** def fromSaHpiHsStateT( x ): if x == SAHPI_HS_STATE_INACTIVE: return "INACTIVE" if x == SAHPI_HS_STATE_INSERTION_PENDING: return "INSERTION_PENDING" if x == SAHPI_HS_STATE_ACTIVE: return "ACTIVE" if x == SAHPI_HS_STATE_EXTRACTION_PENDING: return "EXTRACTION_PENDING" if x == SAHPI_HS_STATE_NOT_PRESENT: return "NOT_PRESENT" return repr( x ) def toSaHpiHsStateT( s ): if s == "INACTIVE": return SAHPI_HS_STATE_INACTIVE if s == "INSERTION_PENDING": return SAHPI_HS_STATE_INSERTION_PENDING if s == "ACTIVE": return SAHPI_HS_STATE_ACTIVE if s == "EXTRACTION_PENDING": return SAHPI_HS_STATE_EXTRACTION_PENDING if s == "NOT_PRESENT": return SAHPI_HS_STATE_NOT_PRESENT raise ValueError() #** # For SaHpiHsCauseOfStateChangeT #** def fromSaHpiHsCauseOfStateChangeT( x ): if x == SAHPI_HS_CAUSE_AUTO_POLICY: return "AUTO_POLICY" if x == SAHPI_HS_CAUSE_EXT_SOFTWARE: return "EXT_SOFTWARE" if x == SAHPI_HS_CAUSE_OPERATOR_INIT: return "OPERATOR_INIT" if x == SAHPI_HS_CAUSE_USER_UPDATE: return "USER_UPDATE" if x == SAHPI_HS_CAUSE_UNEXPECTED_DEACTIVATION: return "UNEXPECTED_DEACTIVATION" if x == SAHPI_HS_CAUSE_SURPRISE_EXTRACTION: return "SURPRISE_EXTRACTION" if x == SAHPI_HS_CAUSE_EXTRACTION_UPDATE: return "EXTRACTION_UPDATE" if x == SAHPI_HS_CAUSE_HARDWARE_FAULT: return "HARDWARE_FAULT" if x == SAHPI_HS_CAUSE_CONTAINING_FRU: return "CONTAINING_FRU" if x == SAHPI_HS_CAUSE_UNKNOWN: return "UNKNOWN" return repr( x ) def toSaHpiHsCauseOfStateChangeT( s ): if s == "AUTO_POLICY": return SAHPI_HS_CAUSE_AUTO_POLICY if s == "EXT_SOFTWARE": return SAHPI_HS_CAUSE_EXT_SOFTWARE if s == "OPERATOR_INIT": return SAHPI_HS_CAUSE_OPERATOR_INIT if s == "USER_UPDATE": return SAHPI_HS_CAUSE_USER_UPDATE if s == "UNEXPECTED_DEACTIVATION": return SAHPI_HS_CAUSE_UNEXPECTED_DEACTIVATION if s == "SURPRISE_EXTRACTION": return SAHPI_HS_CAUSE_SURPRISE_EXTRACTION if s == "EXTRACTION_UPDATE": return SAHPI_HS_CAUSE_EXTRACTION_UPDATE if s == "HARDWARE_FAULT": return SAHPI_HS_CAUSE_HARDWARE_FAULT if s == "CONTAINING_FRU": return SAHPI_HS_CAUSE_CONTAINING_FRU if s == "UNKNOWN": return SAHPI_HS_CAUSE_UNKNOWN raise ValueError() #** # For SaHpiSeverityT #** def fromSaHpiSeverityT( x ): if x == SAHPI_CRITICAL: return "CRITICAL" if x == SAHPI_MAJOR: return "MAJOR" if x == SAHPI_MINOR: return "MINOR" if x == SAHPI_INFORMATIONAL: return "INFORMATIONAL" if x == SAHPI_OK: return "OK" if x == SAHPI_DEBUG: return "DEBUG" if x == SAHPI_ALL_SEVERITIES: return "ALL_SEVERITIES" return repr( x ) def toSaHpiSeverityT( s ): if s == "CRITICAL": return SAHPI_CRITICAL if s == "MAJOR": return SAHPI_MAJOR if s == "MINOR": return SAHPI_MINOR if s == "INFORMATIONAL": return SAHPI_INFORMATIONAL if s == "OK": return SAHPI_OK if s == "DEBUG": return SAHPI_DEBUG if s == "ALL_SEVERITIES": return SAHPI_ALL_SEVERITIES raise ValueError() #** # For SaHpiResourceEventTypeT #** def fromSaHpiResourceEventTypeT( x ): if x == SAHPI_RESE_RESOURCE_FAILURE: return "FAILURE" if x == SAHPI_RESE_RESOURCE_RESTORED: return "RESTORED" if x == SAHPI_RESE_RESOURCE_ADDED: return "ADDED" if x == SAHPI_RESE_RESOURCE_REMOVED: return "REMOVED" if x == SAHPI_RESE_RESOURCE_INACCESSIBLE: return "INACCESSIBLE" if x == SAHPI_RESE_RESOURCE_UPDATED: return "UPDATED" return repr( x ) def toSaHpiResourceEventTypeT( s ): if s == "FAILURE": return SAHPI_RESE_RESOURCE_FAILURE if s == "RESTORED": return SAHPI_RESE_RESOURCE_RESTORED if s == "ADDED": return SAHPI_RESE_RESOURCE_ADDED if s == "REMOVED": return SAHPI_RESE_RESOURCE_REMOVED if s == "INACCESSIBLE": return SAHPI_RESE_RESOURCE_INACCESSIBLE if s == "UPDATED": return SAHPI_RESE_RESOURCE_UPDATED raise ValueError() #** # For SaHpiDomainEventTypeT #** def fromSaHpiDomainEventTypeT( x ): if x == SAHPI_DOMAIN_REF_ADDED: return "ADDED" if x == SAHPI_DOMAIN_REF_REMOVED: return "REMOVED" return repr( x ) def toSaHpiDomainEventTypeT( s ): if s == "ADDED": return SAHPI_DOMAIN_REF_ADDED if s == "REMOVED": return SAHPI_DOMAIN_REF_REMOVED raise ValueError() #** # For SaHpiSwEventTypeT #** def fromSaHpiSwEventTypeT( x ): if x == SAHPI_HPIE_AUDIT: return "AUDIT" if x == SAHPI_HPIE_STARTUP: return "STARTUP" if x == SAHPI_HPIE_OTHER: return "OTHER" return repr( x ) def toSaHpiSwEventTypeT( s ): if s == "AUDIT": return SAHPI_HPIE_AUDIT if s == "STARTUP": return SAHPI_HPIE_STARTUP if s == "OTHER": return SAHPI_HPIE_OTHER raise ValueError() #** # For SaHpiEventTypeT #** def fromSaHpiEventTypeT( x ): if x == SAHPI_ET_RESOURCE: return "RESOURCE" if x == SAHPI_ET_DOMAIN: return "DOMAIN" if x == SAHPI_ET_SENSOR: return "SENSOR" if x == SAHPI_ET_SENSOR_ENABLE_CHANGE: return "SENSOR_ENABLE_CHANGE" if x == SAHPI_ET_HOTSWAP: return "HOTSWAP" if x == SAHPI_ET_WATCHDOG: return "WATCHDOG" if x == SAHPI_ET_HPI_SW: return "HPI_SW" if x == SAHPI_ET_OEM: return "OEM" if x == SAHPI_ET_USER: return "USER" if x == SAHPI_ET_DIMI: return "DIMI" if x == SAHPI_ET_DIMI_UPDATE: return "DIMI_UPDATE" if x == SAHPI_ET_FUMI: return "FUMI" return repr( x ) def toSaHpiEventTypeT( s ): if s == "RESOURCE": return SAHPI_ET_RESOURCE if s == "DOMAIN": return SAHPI_ET_DOMAIN if s == "SENSOR": return SAHPI_ET_SENSOR if s == "SENSOR_ENABLE_CHANGE": return SAHPI_ET_SENSOR_ENABLE_CHANGE if s == "HOTSWAP": return SAHPI_ET_HOTSWAP if s == "WATCHDOG": return SAHPI_ET_WATCHDOG if s == "HPI_SW": return SAHPI_ET_HPI_SW if s == "OEM": return SAHPI_ET_OEM if s == "USER": return SAHPI_ET_USER if s == "DIMI": return SAHPI_ET_DIMI if s == "DIMI_UPDATE": return SAHPI_ET_DIMI_UPDATE if s == "FUMI": return SAHPI_ET_FUMI raise ValueError() #** # For SaHpiStatusCondTypeT #** def fromSaHpiStatusCondTypeT( x ): if x == SAHPI_STATUS_COND_TYPE_SENSOR: return "SENSOR" if x == SAHPI_STATUS_COND_TYPE_RESOURCE: return "RESOURCE" if x == SAHPI_STATUS_COND_TYPE_OEM: return "OEM" if x == SAHPI_STATUS_COND_TYPE_USER: return "USER" return repr( x ) def toSaHpiStatusCondTypeT( s ): if s == "SENSOR": return SAHPI_STATUS_COND_TYPE_SENSOR if s == "RESOURCE": return SAHPI_STATUS_COND_TYPE_RESOURCE if s == "OEM": return SAHPI_STATUS_COND_TYPE_OEM if s == "USER": return SAHPI_STATUS_COND_TYPE_USER raise ValueError() #** # For SaHpiAnnunciatorModeT #** def fromSaHpiAnnunciatorModeT( x ): if x == SAHPI_ANNUNCIATOR_MODE_AUTO: return "AUTO" if x == SAHPI_ANNUNCIATOR_MODE_USER: return "USER" if x == SAHPI_ANNUNCIATOR_MODE_SHARED: return "SHARED" return repr( x ) def toSaHpiAnnunciatorModeT( s ): if s == "AUTO": return SAHPI_ANNUNCIATOR_MODE_AUTO if s == "USER": return SAHPI_ANNUNCIATOR_MODE_USER if s == "SHARED": return SAHPI_ANNUNCIATOR_MODE_SHARED raise ValueError() #** # For SaHpiAnnunciatorTypeT #** def fromSaHpiAnnunciatorTypeT( x ): if x == SAHPI_ANNUNCIATOR_TYPE_LED: return "LED" if x == SAHPI_ANNUNCIATOR_TYPE_DRY_CONTACT_CLOSURE: return "DRY_CONTACT_CLOSURE" if x == SAHPI_ANNUNCIATOR_TYPE_AUDIBLE: return "AUDIBLE" if x == SAHPI_ANNUNCIATOR_TYPE_LCD_DISPLAY: return "LCD_DISPLAY" if x == SAHPI_ANNUNCIATOR_TYPE_MESSAGE: return "MESSAGE" if x == SAHPI_ANNUNCIATOR_TYPE_COMPOSITE: return "COMPOSITE" if x == SAHPI_ANNUNCIATOR_TYPE_OEM: return "OEM" return repr( x ) def toSaHpiAnnunciatorTypeT( s ): if s == "LED": return SAHPI_ANNUNCIATOR_TYPE_LED if s == "DRY_CONTACT_CLOSURE": return SAHPI_ANNUNCIATOR_TYPE_DRY_CONTACT_CLOSURE if s == "AUDIBLE": return SAHPI_ANNUNCIATOR_TYPE_AUDIBLE if s == "LCD_DISPLAY": return SAHPI_ANNUNCIATOR_TYPE_LCD_DISPLAY if s == "MESSAGE": return SAHPI_ANNUNCIATOR_TYPE_MESSAGE if s == "COMPOSITE": return SAHPI_ANNUNCIATOR_TYPE_COMPOSITE if s == "OEM": return SAHPI_ANNUNCIATOR_TYPE_OEM raise ValueError() #** # For SaHpiRdrTypeT #** def fromSaHpiRdrTypeT( x ): if x == SAHPI_NO_RECORD: return "NO_RECORD" if x == SAHPI_CTRL_RDR: return "CTRL_RDR" if x == SAHPI_SENSOR_RDR: return "SENSOR_RDR" if x == SAHPI_INVENTORY_RDR: return "INVENTORY_RDR" if x == SAHPI_WATCHDOG_RDR: return "WATCHDOG_RDR" if x == SAHPI_ANNUNCIATOR_RDR: return "ANNUNCIATOR_RDR" if x == SAHPI_DIMI_RDR: return "DIMI_RDR" if x == SAHPI_FUMI_RDR: return "FUMI_RDR" return repr( x ) def toSaHpiRdrTypeT( s ): if s == "NO_RECORD": return SAHPI_NO_RECORD if s == "CTRL_RDR": return SAHPI_CTRL_RDR if s == "SENSOR_RDR": return SAHPI_SENSOR_RDR if s == "INVENTORY_RDR": return SAHPI_INVENTORY_RDR if s == "WATCHDOG_RDR": return SAHPI_WATCHDOG_RDR if s == "ANNUNCIATOR_RDR": return SAHPI_ANNUNCIATOR_RDR if s == "DIMI_RDR": return SAHPI_DIMI_RDR if s == "FUMI_RDR": return SAHPI_FUMI_RDR raise ValueError() #** # For SaHpiParmActionT #** def fromSaHpiParmActionT( x ): if x == SAHPI_DEFAULT_PARM: return "DEFAULT_PARM" if x == SAHPI_SAVE_PARM: return "SAVE_PARM" if x == SAHPI_RESTORE_PARM: return "RESTORE_PARM" return repr( x ) def toSaHpiParmActionT( s ): if s == "DEFAULT_PARM": return SAHPI_DEFAULT_PARM if s == "SAVE_PARM": return SAHPI_SAVE_PARM if s == "RESTORE_PARM": return SAHPI_RESTORE_PARM raise ValueError() #** # For SaHpiResetActionT #** def fromSaHpiResetActionT( x ): if x == SAHPI_COLD_RESET: return "COLD_RESET" if x == SAHPI_WARM_RESET: return "WARM_RESET" if x == SAHPI_RESET_ASSERT: return "RESET_ASSERT" if x == SAHPI_RESET_DEASSERT: return "RESET_DEASSERT" return repr( x ) def toSaHpiResetActionT( s ): if s == "COLD_RESET": return SAHPI_COLD_RESET if s == "WARM_RESET": return SAHPI_WARM_RESET if s == "RESET_ASSERT": return SAHPI_RESET_ASSERT if s == "RESET_DEASSERT": return SAHPI_RESET_DEASSERT raise ValueError() #** # For SaHpiPowerStateT #** def fromSaHpiPowerStateT( x ): if x == SAHPI_POWER_OFF: return "OFF" if x == SAHPI_POWER_ON: return "ON" if x == SAHPI_POWER_CYCLE: return "CYCLE" return repr( x ) def toSaHpiPowerStateT( s ): if s == "OFF": return SAHPI_POWER_OFF if s == "ON": return SAHPI_POWER_ON if s == "CYCLE": return SAHPI_POWER_CYCLE raise ValueError() #** # For SaHpiEventLogOverflowActionT #** def fromSaHpiEventLogOverflowActionT( x ): if x == SAHPI_EL_OVERFLOW_DROP: return "DROP" if x == SAHPI_EL_OVERFLOW_OVERWRITE: return "OVERWRITE" return repr( x ) def toSaHpiEventLogOverflowActionT( s ): if s == "DROP": return SAHPI_EL_OVERFLOW_DROP if s == "OVERWRITE": return SAHPI_EL_OVERFLOW_OVERWRITE raise ValueError() #** # For AtcaHpiLedColorT #** def fromAtcaHpiLedColorT( x ): if x == ATCAHPI_LED_COLOR_RESERVED: return "RESERVED" if x == ATCAHPI_LED_COLOR_BLUE: return "BLUE" if x == ATCAHPI_LED_COLOR_RED: return "RED" if x == ATCAHPI_LED_COLOR_GREEN: return "GREEN" if x == ATCAHPI_LED_COLOR_AMBER: return "AMBER" if x == ATCAHPI_LED_COLOR_ORANGE: return "ORANGE" if x == ATCAHPI_LED_COLOR_WHITE: return "WHITE" if x == ATCAHPI_LED_COLOR_NO_CHANGE: return "NO_CHANGE" if x == ATCAHPI_LED_COLOR_USE_DEFAULT: return "USE_DEFAULT" return repr( x ) def toAtcaHpiLedColorT( s ): if s == "RESERVED": return ATCAHPI_LED_COLOR_RESERVED if s == "BLUE": return ATCAHPI_LED_COLOR_BLUE if s == "RED": return ATCAHPI_LED_COLOR_RED if s == "GREEN": return ATCAHPI_LED_COLOR_GREEN if s == "AMBER": return ATCAHPI_LED_COLOR_AMBER if s == "ORANGE": return ATCAHPI_LED_COLOR_ORANGE if s == "WHITE": return ATCAHPI_LED_COLOR_WHITE if s == "NO_CHANGE": return ATCAHPI_LED_COLOR_NO_CHANGE if s == "USE_DEFAULT": return ATCAHPI_LED_COLOR_USE_DEFAULT raise ValueError() #** # For AtcaHpiResourceLedModeT #** def fromAtcaHpiResourceLedModeT( x ): if x == ATCAHPI_LED_AUTO: return "AUTO" if x == ATCAHPI_LED_MANUAL: return "MANUAL" if x == ATCAHPI_LED_LAMP_TEST: return "LAMP_TEST" return repr( x ) def toAtcaHpiResourceLedModeT( s ): if s == "AUTO": return ATCAHPI_LED_AUTO if s == "MANUAL": return ATCAHPI_LED_MANUAL if s == "LAMP_TEST": return ATCAHPI_LED_LAMP_TEST raise ValueError() #** # For AtcaHpiLedBrSupportT #** def fromAtcaHpiLedBrSupportT( x ): if x == ATCAHPI_LED_BR_SUPPORTED: return "SUPPORTED" if x == ATCAHPI_LED_BR_NOT_SUPPORTED: return "NOT_SUPPORTED" if x == ATCAHPI_LED_BR_UNKNOWN: return "UNKNOWN" return repr( x ) def toAtcaHpiLedBrSupportT( s ): if s == "SUPPORTED": return ATCAHPI_LED_BR_SUPPORTED if s == "NOT_SUPPORTED": return ATCAHPI_LED_BR_NOT_SUPPORTED if s == "UNKNOWN": return ATCAHPI_LED_BR_UNKNOWN raise ValueError() #** # For XtcaHpiLedColorT #** def fromXtcaHpiLedColorT( x ): if x == XTCAHPI_LED_COLOR_RESERVED: return "RESERVED" if x == XTCAHPI_LED_COLOR_BLUE: return "BLUE" if x == XTCAHPI_LED_COLOR_RED: return "RED" if x == XTCAHPI_LED_COLOR_GREEN: return "GREEN" if x == XTCAHPI_LED_COLOR_AMBER: return "AMBER" if x == XTCAHPI_LED_COLOR_ORANGE: return "ORANGE" if x == XTCAHPI_LED_COLOR_WHITE: return "WHITE" if x == XTCAHPI_LED_COLOR_NO_CHANGE: return "NO_CHANGE" if x == XTCAHPI_LED_COLOR_USE_DEFAULT: return "USE_DEFAULT" return repr( x ) def toXtcaHpiLedColorT( s ): if s == "RESERVED": return XTCAHPI_LED_COLOR_RESERVED if s == "BLUE": return XTCAHPI_LED_COLOR_BLUE if s == "RED": return XTCAHPI_LED_COLOR_RED if s == "GREEN": return XTCAHPI_LED_COLOR_GREEN if s == "AMBER": return XTCAHPI_LED_COLOR_AMBER if s == "ORANGE": return XTCAHPI_LED_COLOR_ORANGE if s == "WHITE": return XTCAHPI_LED_COLOR_WHITE if s == "NO_CHANGE": return XTCAHPI_LED_COLOR_NO_CHANGE if s == "USE_DEFAULT": return XTCAHPI_LED_COLOR_USE_DEFAULT raise ValueError() #** # For XtcaHpiResourceLedModeT #** def fromXtcaHpiResourceLedModeT( x ): if x == XTCAHPI_LED_AUTO: return "AUTO" if x == XTCAHPI_LED_MANUAL: return "MANUAL" if x == XTCAHPI_LED_LAMP_TEST: return "LAMP_TEST" return repr( x ) def toXtcaHpiResourceLedModeT( s ): if s == "AUTO": return XTCAHPI_LED_AUTO if s == "MANUAL": return XTCAHPI_LED_MANUAL if s == "LAMP_TEST": return XTCAHPI_LED_LAMP_TEST raise ValueError() #** # For XtcaHpiLedBrSupportT #** def fromXtcaHpiLedBrSupportT( x ): if x == XTCAHPI_LED_BR_SUPPORTED: return "SUPPORTED" if x == XTCAHPI_LED_BR_NOT_SUPPORTED: return "NOT_SUPPORTED" if x == XTCAHPI_LED_BR_UNKNOWN: return "UNKNOWN" return repr( x ) def toXtcaHpiLedBrSupportT( s ): if s == "SUPPORTED": return XTCAHPI_LED_BR_SUPPORTED if s == "NOT_SUPPORTED": return XTCAHPI_LED_BR_NOT_SUPPORTED if s == "UNKNOWN": return XTCAHPI_LED_BR_UNKNOWN raise ValueError() #** # For SaErrorT #** def fromSaErrorT( x ): if x == SA_ERR_HPI_OK: return "OK" if x == SA_ERR_HPI_ERROR: return "ERROR" if x == SA_ERR_HPI_UNSUPPORTED_API: return "UNSUPPORTED_API" if x == SA_ERR_HPI_BUSY: return "BUSY" if x == SA_ERR_HPI_INTERNAL_ERROR: return "INTERNAL_ERROR" if x == SA_ERR_HPI_INVALID_CMD: return "INVALID_CMD" if x == SA_ERR_HPI_TIMEOUT: return "TIMEOUT" if x == SA_ERR_HPI_OUT_OF_SPACE: return "OUT_OF_SPACE" if x == SA_ERR_HPI_OUT_OF_MEMORY: return "OUT_OF_MEMORY" if x == SA_ERR_HPI_INVALID_PARAMS: return "INVALID_PARAMS" if x == SA_ERR_HPI_INVALID_DATA: return "INVALID_DATA" if x == SA_ERR_HPI_NOT_PRESENT: return "NOT_PRESENT" if x == SA_ERR_HPI_NO_RESPONSE: return "NO_RESPONSE" if x == SA_ERR_HPI_DUPLICATE: return "DUPLICATE" if x == SA_ERR_HPI_INVALID_SESSION: return "INVALID_SESSION" if x == SA_ERR_HPI_INVALID_DOMAIN: return "INVALID_DOMAIN" if x == SA_ERR_HPI_INVALID_RESOURCE: return "INVALID_RESOURCE" if x == SA_ERR_HPI_INVALID_REQUEST: return "INVALID_REQUEST" if x == SA_ERR_HPI_ENTITY_NOT_PRESENT: return "ENTITY_NOT_PRESENT" if x == SA_ERR_HPI_READ_ONLY: return "READ_ONLY" if x == SA_ERR_HPI_CAPABILITY: return "CAPABILITY" if x == SA_ERR_HPI_UNKNOWN: return "UNKNOWN" if x == SA_ERR_HPI_INVALID_STATE: return "INVALID_STATE" if x == SA_ERR_HPI_UNSUPPORTED_PARAMS: return "UNSUPPORTED_PARAMS" return repr( x ) def toSaErrorT( s ): if s == "OK": return SA_ERR_HPI_OK if s == "ERROR": return SA_ERR_HPI_ERROR if s == "UNSUPPORTED_API": return SA_ERR_HPI_UNSUPPORTED_API if s == "BUSY": return SA_ERR_HPI_BUSY if s == "INTERNAL_ERROR": return SA_ERR_HPI_INTERNAL_ERROR if s == "INVALID_CMD": return SA_ERR_HPI_INVALID_CMD if s == "TIMEOUT": return SA_ERR_HPI_TIMEOUT if s == "OUT_OF_SPACE": return SA_ERR_HPI_OUT_OF_SPACE if s == "OUT_OF_MEMORY": return SA_ERR_HPI_OUT_OF_MEMORY if s == "INVALID_PARAMS": return SA_ERR_HPI_INVALID_PARAMS if s == "INVALID_DATA": return SA_ERR_HPI_INVALID_DATA if s == "NOT_PRESENT": return SA_ERR_HPI_NOT_PRESENT if s == "NO_RESPONSE": return SA_ERR_HPI_NO_RESPONSE if s == "DUPLICATE": return SA_ERR_HPI_DUPLICATE if s == "INVALID_SESSION": return SA_ERR_HPI_INVALID_SESSION if s == "INVALID_DOMAIN": return SA_ERR_HPI_INVALID_DOMAIN if s == "INVALID_RESOURCE": return SA_ERR_HPI_INVALID_RESOURCE if s == "INVALID_REQUEST": return SA_ERR_HPI_INVALID_REQUEST if s == "ENTITY_NOT_PRESENT": return SA_ERR_HPI_ENTITY_NOT_PRESENT if s == "READ_ONLY": return SA_ERR_HPI_READ_ONLY if s == "CAPABILITY": return SA_ERR_HPI_CAPABILITY if s == "UNKNOWN": return SA_ERR_HPI_UNKNOWN if s == "INVALID_STATE": return SA_ERR_HPI_INVALID_STATE if s == "UNSUPPORTED_PARAMS": return SA_ERR_HPI_UNSUPPORTED_PARAMS raise ValueError() #** # For SaHpiEventCategoryT #** def fromSaHpiEventCategoryT( x ): if x == SAHPI_EC_UNSPECIFIED: return "UNSPECIFIED" if x == SAHPI_EC_THRESHOLD: return "THRESHOLD" if x == SAHPI_EC_USAGE: return "USAGE" if x == SAHPI_EC_STATE: return "STATE" if x == SAHPI_EC_PRED_FAIL: return "PRED_FAIL" if x == SAHPI_EC_LIMIT: return "LIMIT" if x == SAHPI_EC_PERFORMANCE: return "PERFORMANCE" if x == SAHPI_EC_SEVERITY: return "SEVERITY" if x == SAHPI_EC_PRESENCE: return "PRESENCE" if x == SAHPI_EC_ENABLE: return "ENABLE" if x == SAHPI_EC_AVAILABILITY: return "AVAILABILITY" if x == SAHPI_EC_REDUNDANCY: return "REDUNDANCY" if x == SAHPI_EC_SENSOR_SPECIFIC: return "SENSOR_SPECIFIC" if x == SAHPI_EC_GENERIC: return "GENERIC" return repr( x ) def toSaHpiEventCategoryT( s ): if s == "UNSPECIFIED": return SAHPI_EC_UNSPECIFIED if s == "THRESHOLD": return SAHPI_EC_THRESHOLD if s == "USAGE": return SAHPI_EC_USAGE if s == "STATE": return SAHPI_EC_STATE if s == "PRED_FAIL": return SAHPI_EC_PRED_FAIL if s == "LIMIT": return SAHPI_EC_LIMIT if s == "PERFORMANCE": return SAHPI_EC_PERFORMANCE if s == "SEVERITY": return SAHPI_EC_SEVERITY if s == "PRESENCE": return SAHPI_EC_PRESENCE if s == "ENABLE": return SAHPI_EC_ENABLE if s == "AVAILABILITY": return SAHPI_EC_AVAILABILITY if s == "REDUNDANCY": return SAHPI_EC_REDUNDANCY if s == "SENSOR_SPECIFIC": return SAHPI_EC_SENSOR_SPECIFIC if s == "GENERIC": return SAHPI_EC_GENERIC raise ValueError() openhpi-3.6.1/baselibs/python/openhpi_baselib/HpiCore.py0000644000175100017510000000766712575647300022337 0ustar mohanmohan # -*- python -*- # # Copyright (C) 2012, Pigeon Point Systems # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # # Author(s): # Anton Pak # import re, os, threading from openhpi_baselib.HpiDataTypes import SAHPI_UNSPECIFIED_DOMAIN_ID from openhpi_baselib.HpiDomain import HpiDomain from openhpi_baselib.HpiSession import HpiSession from openhpi_baselib import HpiUtil from openhpi_baselib.OhpiDataTypes import DEFAULT_PORT class HpiCore: domains = dict() sessions = dict() my_ep = None lock = threading.RLock() @staticmethod def createDefaultDomain(): if HpiCore.domains.has_key( SAHPI_UNSPECIFIED_DOMAIN_ID ): return host = os.environ.get( "OPENHPI_DAEMON_HOST", "localhost" ) portstr = os.environ.get( "OPENHPI_DAEMON_PORT", str( DEFAULT_PORT ) ) try: port = int( portstr ) except ValueError: port = DEFAULT_PORT root = HpiUtil.makeRootSaHpiEntityPathT() d = HpiDomain( SAHPI_UNSPECIFIED_DOMAIN_ID, host, port, root ) HpiCore.domains[d.getLocalDid()] = d @staticmethod def createDomain( host, port, entity_root ): d = HpiDomain( SAHPI_UNSPECIFIED_DOMAIN_ID, host, port, entity_root ) HpiCore.lock.acquire() did = 0 while HpiCore.domains.has_key( did ): did = did + 1 d.setLocalDid( did ) HpiCore.domains[did] = d HpiCore.lock.release() return d #********************************************************** # Creates and returns new domain with specified Domain Id # Returns None if overwrite == false and # the specified Domain Id is already in use #********************************************************** @staticmethod def createDomainById( did, host, port, entity_root, overwrite ): d = None HpiCore.lock.acquire() if ( not HpiCore.domains.has_key( did ) ) or overwrite: d = HpiDomain( did, host, port, entity_root ) HpiCore.domains[did] = d HpiCore.lock.release() return d @staticmethod def createSession( local_did ): s = None HpiCore.lock.acquire() d = HpiCore.domains.get( local_did, None ) if d is not None: s = HpiSession( d ) HpiCore.sessions[s.getLocalSid()] = s HpiCore.lock.release() return s @staticmethod def removeSession( s ): HpiCore.lock.acquire() del HpiCore.sessions[s.getLocalSid()] HpiCore.lock.release() s.close() @staticmethod def getSession( local_sid ): HpiCore.lock.acquire() s = HpiCore.sessions.get( local_sid, None ) HpiCore.lock.release() return s @staticmethod def getMyEntity(): return HpiUtil.cloneSaHpiEntityPathT( HpiCore.my_ep ) @staticmethod def setMyEntity( ep ): HpiCore.my_ep = HpiUtil.cloneSaHpiEntityPathT( ep ) @staticmethod def dump(): if HpiCore.my_ep is not None: print "My Entity: %s" % HpiUtil.fromSaHpiEntityPathT( HpiCore.my_ep ) print "Defined Domains:" for d in HpiCore.domains.itervalues(): ldid = d.getLocalDid() rdid = d.getRemoteDid() host = d.getRemoteHost() port = d.getRemotePort() root = HpiUtil.fromSaHpiEntityPathT( d.getEntityRoot() ) print " id %u => id %u, host %s, port %u, root %s" % ( ldid, rdid, host, port, root ) #********************************************************** # Initialization #********************************************************** HpiCore.createDefaultDomain() openhpi-3.6.1/baselibs/python/openhpi_baselib/HpiTransport.py0000644000175100017510000001352312575647300023427 0ustar mohanmohan # -*- python -*- # # Copyright (C) 2012, Pigeon Point Systems # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # # Author(s): # Anton Pak # import binascii, ctypes, socket, struct from openhpi_baselib.HpiDataTypes import * from openhpi_baselib.HpiException import HpiException from openhpi_baselib.OhpiDataTypes import * ###################################################################### class PduDef: MAX_SIZE = 0xFFFF HDR_SIZE = 12 TYPE_OFF = 0x00 FLAGS_OFF = 0x01 RPC_ID_OFF = 0x04 PAYLOAD_SIZE_OFF = 0x08 TYPE = 0x01 # MSG FLAGS = 0x11 # RPC version 1, little-endian ENDIAN_FLAG_MASK = 0x01 # If endian flag is set: little-endian ###################################################################### class Structs: def __init__( self, is_le ): self.u8 = struct.Struct( "=B" ) self.i8 = struct.Struct( "=b" ) if is_le: self.u16 = struct.Struct( "H" ) self.i16 = struct.Struct( ">h" ) self.u32 = struct.Struct( ">I" ) self.i32 = struct.Struct( ">i" ) self.u64 = struct.Struct( ">Q" ) self.i64 = struct.Struct( ">q" ) self.f64 = struct.Struct( ">d" ) self.hdr = struct.Struct( ">BBBBii" ) self.arrays = dict() sizes = [ SAHPI_GUID_LENGTH, SAHPI_MAX_TEXT_BUFFER_LENGTH, SAHPI_SENSOR_BUFFER_LENGTH, SAHPI_CTRL_MAX_STREAM_LENGTH, SAHPI_CTRL_MAX_OEM_BODY_LENGTH, SAHPI_CTRL_OEM_CONFIG_LENGTH, SAHPI_DIMITEST_PARAM_NAME_LEN, SAHPI_DIMITEST_PARAM_NAME_LEN, SAHPI_FUMI_MAX_OEM_BODY_LENGTH, SA_HPI_MAX_NAME_LENGTH, MAX_PLUGIN_NAME_LENGTH ] for s in sizes: self.arrays[s] = struct.Struct( "=%ss" % s ) ###################################################################### class HpiTransport: #********************************************************** # NB: Assumption # We assume that marshal layer puts bytes in little-endian # order for RPC request. # And remote party defines endian for RPC response. #********************************************************** def __init__( self ): self.sock = None self.pdu = None self.hpos = 0 self.lpos = 0 self.st_le = Structs( True ) self.st_be = Structs( False ) self.st = self.st_le def open( self, host, port ): try: infos = socket.getaddrinfo( host, port, socket.AF_UNSPEC, socket.SOCK_STREAM ) except socket.gaierror: infos = [] s = None for ( af, stype, proto, cname, sa ) in infos: try: s = socket.socket( af, stype, proto ) except socket.error: s = None continue try: s.connect( sa ) except socket.error: s.close() s = None continue break if s is not None: self.sock = s self.pdu = ctypes.create_string_buffer( PduDef.MAX_SIZE ) self.reset() return self.sock is not None def close( self ): self.sock.shutdown( socket.SHUT_RDWR ) self.sock.close() self.sock = None self.pdu = None def reset( self ): self.lpos = PduDef.HDR_SIZE self.hpos = PduDef.HDR_SIZE self.st = self.st_le def get_st( self ): return self.st def put_data( self, st, x ): st.pack_into( self.pdu, self.hpos, x ) self.hpos += st.size def get_data( self, st ): if self.lpos + st.size > self.hpos: raise HpiException( "Not enough data for demarshal" ) x = st.unpack_from( self.pdu, self.lpos ) self.lpos += st.size return x[0] def interchange( self, rpc_id ): self.st.hdr.pack_into( self.pdu, 0, PduDef.TYPE, PduDef.FLAGS, 0, 0, rpc_id, self.hpos - PduDef.HDR_SIZE ) self.sock.sendall( buffer( self.pdu, 0, self.hpos ) ) self.lpos = PduDef.HDR_SIZE self.hpos = 0 need = PduDef.HDR_SIZE while self.hpos < need: chunk = self.sock.recv( need - self.hpos ) got = len( chunk ) if got == 0: break struct.pack_into( "=%ds" % got, self.pdu, self.hpos, chunk ) self.hpos += got if self.hpos == PduDef.HDR_SIZE: flags = self.st.u8.unpack_from( self.pdu, PduDef.FLAGS_OFF )[0] if ( flags & PduDef.ENDIAN_FLAG_MASK ) == 0: self.st = self.st_be psize = self.st.i32.unpack_from( self.pdu, PduDef.PAYLOAD_SIZE_OFF )[0] need += psize if need > PduDef.MAX_SIZE: raise HpiException( "Incoming data is too large" ) return ( self.hpos == need ) def dump( self, name ): print "PDU %s" % name print " LPOS %d" % self.lpos print " HPOS %d" % self.hpos print " DATA %s" % binascii.hexlify( self.pdu[0:self.hpos] ) openhpi-3.6.1/baselibs/python/openhpi_baselib/HpiMarshalCore.py0000644000175100017510000000657312575647300023642 0ustar mohanmohan # -*- python -*- # # Copyright (C) 2012, Pigeon Point Systems # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # # Author(s): # Anton Pak # from openhpi_baselib.HpiTransport import HpiTransport class HpiMarshalCore: def __init__( self ): self.transport = None self.st = None def open( self, host, port ): self.transport = HpiTransport() rc = self.transport.open( host, port ) return rc def close( self ): self.transport.close() self.transport = None def reset( self ): self.transport.reset() self.st = self.transport.get_st() def interchange( self, rpc_id ): rc = self.transport.interchange( rpc_id ) self.st = self.transport.get_st() return rc #********************************************************** # Marshal: For HPI Basic Data Types #********************************************************** def marshalSaHpiUint8T( self, x ): self.transport.put_data( self.st.u8, x ) def marshalSaHpiUint16T( self, x ): self.transport.put_data( self.st.u16, x ) def marshalSaHpiUint32T( self, x ): self.transport.put_data( self.st.u32, x ) def marshalSaHpiUint64T( self, x ): self.transport.put_data( self.st.u64, x ) def marshalSaHpiInt8T( self, x ): self.transport.put_data( self.st.i8, x ) def marshalSaHpiInt16T( self, x ): self.transport.put_data( self.st.i16, x ) def marshalSaHpiInt32T( self, x ): self.transport.put_data( self.st.i32, x ) def marshalSaHpiInt64T( self, x ): self.transport.put_data( self.st.i64, x ) def marshalEnum( self, x ): self.marshalSaHpiInt32T( x ) def marshalSaHpiFloat64T( self, x ): self.transport.put_data( self.st.f64, x ) def marshalByteArray( self, x, count ): self.transport.put_data( self.st.arrays[count], x ) #********************************************************** # Demarshal: For HPI Basic Data Types #********************************************************** def demarshalSaHpiUint8T( self ): return self.transport.get_data( self.st.u8 ) def demarshalSaHpiUint16T( self ): return self.transport.get_data( self.st.u16 ) def demarshalSaHpiUint32T( self ): return self.transport.get_data( self.st.u32 ) def demarshalSaHpiUint64T( self ): return self.transport.get_data( self.st.u64 ) def demarshalSaHpiInt8T( self ): return self.transport.get_data( self.st.i8 ) def demarshalSaHpiInt16T( self ): return self.transport.get_data( self.st.i16 ) def demarshalSaHpiInt32T( self ): return self.transport.get_data( self.st.i32 ) def demarshalSaHpiInt64T( self ): return self.transport.get_data( self.st.i64 ) def demarshalEnum( self ): return self.demarshalSaHpiInt32T() def demarshalSaHpiFloat64T( self ): return self.transport.get_data( self.st.f64 ) def demarshalByteArray( self, count ): return self.transport.get_data( self.st.arrays[count] ) openhpi-3.6.1/baselibs/python/openhpi_baselib/HpiDataTypes.py0000644000175100017510000000102312575647300023321 0ustar mohanmohan # -*- python -*- # # Copyright (C) 2012, Pigeon Point Systems # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # # Author(s): # Anton Pak # from openhpi_baselib.HpiDataTypesGen import * # empty openhpi-3.6.1/baselibs/python/openhpi_baselib/HpiDomain.py0000644000175100017510000000266512575647300022647 0ustar mohanmohan # -*- python -*- # # Copyright (C) 2012, Pigeon Point Systems # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # # Author(s): # Anton Pak # from openhpi_baselib.HpiDataTypes import SAHPI_UNSPECIFIED_DOMAIN_ID class HpiDomain: def __init__( self, local_did, remote_host, remote_port, entity_root ): self.local_did = local_did self.remote_did = SAHPI_UNSPECIFIED_DOMAIN_ID self.remote_host = remote_host self.remote_port = remote_port self.entity_root = entity_root @staticmethod def clone( other ): d = HpiDomain( other.local_did, other.remote_host, other.remote_port, other.entity_root ) d.remote_did = other.remote_did return d def getLocalDid( self ): return self.local_did def setLocalDid( self, local_did ): self.local_did = local_did def getRemoteDid( self ): return self.remote_did def getRemoteHost( self ): return self.remote_host def getRemotePort( self ): return self.remote_port def getEntityRoot( self ): return self.entity_root openhpi-3.6.1/baselibs/python/openhpi_baselib/Hpi.py0000644000175100017510000001003712575647300021507 0ustar mohanmohan # -*- python -*- # # Copyright (C) 2012, Pigeon Point Systems # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # # Author(s): # Anton Pak # from openhpi_baselib.HpiGen import * #********************************************************** # HPI API # Specific functions that were hard to auto-generate. # So they were written manually. #********************************************************** #********************************************************** def saHpiSessionOpen( DomainId, SecurityParams ): if SecurityParams is not None: return ( SA_ERR_HPI_INVALID_PARAMS, None ) s = HpiCore.createSession( DomainId ) if s is None: return ( SA_ERR_HPI_INVALID_DOMAIN, None ) m = s.getMarshal() if m is None: HpiCore.removeSession( s ) return ( SA_ERR_HPI_NO_RESPONSE, None ) m.marshalSaHpiDomainIdT( s.getRemoteDid() ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_SESSION_OPEN ) if not rc: m.close() HpiCore.removeSession( s ) return ( SA_ERR_HPI_NO_RESPONSE, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: SessionId = m.demarshalSaHpiSessionIdT() s.setRemoteSid( SessionId ) SessionId = s.getLocalSid() s.putMarshal( m ) if rv != SA_OK: HpiCore.removeSession( s ) return ( rv, None ) return ( SA_OK, SessionId ) #********************************************************** def saHpiSessionClose( SessionId ): s = HpiCore.getSession( SessionId ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_SESSION_CLOSE ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv == SA_OK: HpiCore.removeSession( s ) if rv != SA_OK: return rv return SA_OK #********************************************************** def saHpiMyEntityPathGet( SessionId ): s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None ) my_ep = HpiCore.getMyEntity() if my_ep is None: return ( SA_ERR_HPI_UNKNOWN, None ) return ( SA_OK, my_ep ) #********************************************************** def saHpiDimiTestStart( SessionId, ResourceId, DimiNum, TestNum, NumberOfParams, ParamsList ): if NumberOfParams != 0: if ParamsList is None: return SA_ERR_HPI_INVALID_PARAMS if not isinstance( ParamsList, list ): return SA_ERR_HPI_INVALID_PARAMS if NumberOfParams > len( ParamsList ): return SA_ERR_HPI_INVALID_PARAMS for p in ParamsList: rc = HpiUtil.checkSaHpiDimiTestVariableParamsT( p ) if not rc: return SA_ERR_HPI_INVALID_PARAMS s = HpiCore.getSession( SessionId ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiDimiNumT( DimiNum ) m.marshalSaHpiDimiTestNumT( TestNum ) m.marshalSaHpiUint8T( NumberOfParams ) if ParamsList is not None: for p in ParamsList: m.marshalSaHpiDimiTestVariableParamsT( p ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_DIMI_TEST_START ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv != SA_OK: return rv return SA_OK openhpi-3.6.1/baselibs/python/openhpi_baselib/HpiIterators.py0000644000175100017510000002057312575647300023412 0ustar mohanmohan # -*- python -*- # # Copyright (C) 2012, Pigeon Point Systems # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # # Author(s): # Anton Pak # from openhpi_baselib.HpiDataTypes import * from openhpi_baselib.Hpi import * from openhpi_baselib import HpiUtil #********************************************************** # Helper functions # TODO - move to HpiUtils? #********************************************************** def new_cond(): c = SaHpiConditionT() c.Type = SAHPI_STATUS_COND_TYPE_USER c.Entity = HpiUtil.makeUnspecifiedSaHpiEntityPathT() c.DomainId = SAHPI_UNSPECIFIED_DOMAIN_ID c.ResourceId = SAHPI_UNSPECIFIED_RESOURCE_ID c.SensorNum = SAHPI_ENTRY_UNSPECIFIED c.EventState = SAHPI_ES_UNSPECIFIED c.Name = SaHpiNameT() c.Name.Length = 0 c.Name.Value = "".ljust( SA_HPI_MAX_NAME_LENGTH, chr(0) ) c.Mid = SAHPI_MANUFACTURER_ID_UNSPECIFIED c.Data = HpiUtil.toSaHpiTextBufferT( "" ) return c def new_alarm( id, timestamp ): a = SaHpiAlarmT() a.AlarmId = id a.Timestamp = timestamp a.Severity = SAHPI_ALL_SEVERITIES a.Acknowledged = SAHPI_FALSE a.AlarmCond = new_cond() return a def new_announcement( id, timestamp ): a = SaHpiAnnouncementT() a.EntryId = id a.Timestamp = timestamp a.AddedByUser = SAHPI_TRUE a.Severity = SAHPI_ALL_SEVERITIES a.Acknowledged = SAHPI_FALSE a.StatusCond = new_cond() return a #********************************************************** # HPI Utility Functions: Iterators #********************************************************** #********************************************************** # Iterate over DRT # Provides SaHpiDrtEntryT #********************************************************** def Drt( sid ): id = SAHPI_FIRST_ENTRY while id != SAHPI_LAST_ENTRY: ( rv, id, drte ) = saHpiDrtEntryGet( sid, id ) if rv != SA_OK: break yield drte #********************************************************** # Iterate over DAT # Provides SaHpiAlarmT #********************************************************** def Dat( sid, severity = SAHPI_ALL_SEVERITIES, unacknowledged_only = SAHPI_FALSE ): id = SAHPI_FIRST_ENTRY timestamp = 0L while id != SAHPI_LAST_ENTRY: a = new_alarm( id, timestamp ) ( rv, a ) = saHpiAlarmGetNext( sid, severity, unacknowledged_only, a ) if rv != SA_OK: break id = a.AlarmId timestamp = a.Timestamp yield a #********************************************************** # Iterate over Event Log # Provides ( SaHpiEventLogEntryT, SaHpiRdrT, SaHpiRptEntryT ) tuple #********************************************************** def EventLogEntries( sid, rid, readforward = True ): id = SAHPI_OLDEST_ENTRY if readforward else SAHPI_NEWEST_ENTRY while id != SAHPI_NO_MORE_ENTRIES: ( rv, previd, nextid, entry, rdr, rpte ) = saHpiEventLogEntryGet( sid, rid, id ) if rv != SA_OK: break id = nextid if readforward else previd yield ( entry, rdr, rpte ) #********************************************************** # Iterate over entity resource ids # Provides SaHpiResourceIdT #********************************************************** def EntityResourceIds( sid, ep ): id = SAHPI_FIRST_ENTRY while id != SAHPI_LAST_ENTRY: ( rv, id, rid, instrid, rptcnt ) = saHpiGetIdByEntityPath( sid, ep, SAHPI_NO_RECORD, id ) if rv != SA_OK: break yield rid #********************************************************** # Iterate over entity instrument ids # Provides ( SaHpiResourceIdT, SaHpiInstrumentIdT ) tuple #********************************************************** def EntityInstrumentIds( sid, ep, rdrtype ): id = SAHPI_FIRST_ENTRY while id != SAHPI_LAST_ENTRY: ( rv, id, rid, instrid, rptcnt ) = saHpiGetIdByEntityPath( sid, ep, rdrtype, id ) if rv != SA_OK: break yield ( rid, instrid ) #********************************************************** # Iterate over child entities # Provides SaHpiEntityPathT #********************************************************** def ChildEntities( sid, parent_ep ): id = SAHPI_FIRST_ENTRY while id != SAHPI_LAST_ENTRY: ( rv, id, child_ep, rptcnt ) = saHpiGetChildEntityPath( sid, parent_ep, id ) if rv != SA_OK: break yield child_ep #********************************************************** # Iterate over RPT # Provides SaHpiRptEntryT #********************************************************** def Rpt( sid ): id = SAHPI_FIRST_ENTRY while id != SAHPI_LAST_ENTRY: ( rv, id, rpte ) = saHpiRptEntryGet( sid, id ) if rv != SA_OK: break yield rpte #********************************************************** # Iterate over RDRs # Provides SaHpiRdrT #********************************************************** def Rdrs( sid, rid ): id = SAHPI_FIRST_ENTRY while id != SAHPI_LAST_ENTRY: ( rv, id, rdr ) = saHpiRdrGet( sid, rid, id ) if rv != SA_OK: break yield rdr #********************************************************** # Iterate over Idr Areas # Provides SaHpiIdrAreaHeaderT #********************************************************** def IdrAreaHeaders( sid, rid, iid, atype = SAHPI_IDR_AREATYPE_UNSPECIFIED ): id = SAHPI_FIRST_ENTRY while id != SAHPI_LAST_ENTRY: ( rv, id, ahdr ) = saHpiIdrAreaHeaderGet( sid, rid, iid, atype, id ) if rv != SA_OK: break yield ahdr #********************************************************** # Iterate over Idr Area Fields # Provides SaHpiIdrFieldT #********************************************************** def IdrAreaFields( sid, rid, iid, aid, ftype = SAHPI_IDR_FIELDTYPE_UNSPECIFIED ): id = SAHPI_FIRST_ENTRY while id != SAHPI_LAST_ENTRY: ( rv, id, field ) = saHpiIdrFieldGet( sid, rid, iid, aid, ftype, id ) if rv != SA_OK: break yield field #********************************************************** # Iterate over annuncuator announcements # Provides SaHpiAnnouncementT #********************************************************** def Announcements( sid, rid, annnum, severity = SAHPI_ALL_SEVERITIES, unacknowledged_only = SAHPI_FALSE ): id = SAHPI_FIRST_ENTRY timestamp = 0L while id != SAHPI_LAST_ENTRY: a = new_announcement( id, timestamp ) ( rv, a ) = saHpiAnnunciatorGetNext( sid, rid, annnum, severity, unacknowledged_only, a ) if rv != SA_OK: break id = a.EntryId timestamp = a.Timestamp yield a #********************************************************** # Iterate over FUMI Source Components # Provides SaHpiFumiComponentInfoT #********************************************************** def FumiSourceComponents( sid, rid, fuminum, banknum ): id = SAHPI_FIRST_ENTRY while id != SAHPI_LAST_ENTRY: ( rv, id, info ) = saHpiFumiSourceComponentInfoGet( sid, rid, fuminum, banknum, id ) if rv != SA_OK: break yield info #********************************************************** # Iterate over FUMI Target Components # Provides SaHpiFumiComponentInfoT #********************************************************** def FumiTargetComponents( sid, rid, fuminum, banknum ): id = SAHPI_FIRST_ENTRY while id != SAHPI_LAST_ENTRY: ( rv, id, info ) = saHpiFumiTargetComponentInfoGet( sid, rid, fuminum, banknum, id ) if rv != SA_OK: break yield info #********************************************************** # Iterate over FUMI Logical Target Components # Provides SaHpiFumiLogicalComponentInfoT #********************************************************** def FumiLogicalTargetComponents( sid, rid, fuminum ): id = SAHPI_FIRST_ENTRY while id != SAHPI_LAST_ENTRY: ( rv, id, info ) = saHpiFumiLogicalTargetComponentInfoGet( sid, rid, fuminum, id ) if rv != SA_OK: break yield info openhpi-3.6.1/baselibs/python/openhpi_baselib/__init__.py0000644000175100017510000000143612575647300022531 0ustar mohanmohan # -*- python -*- # # Copyright (C) 2012, Pigeon Point Systems # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # # Author(s): # Anton Pak # # imports from openhpi_baselib.HpiDataTypes import * from openhpi_baselib.Hpi import * from openhpi_baselib import HpiUtil from openhpi_baselib import HpiIterators from openhpi_baselib.OhpiDataTypes import * from openhpi_baselib.Ohpi import * from openhpi_baselib import OhpiUtil from openhpi_baselib import OhpiIterators openhpi-3.6.1/baselibs/python/openhpi_baselib/HpiGen.py0000644000175100017510000027046312575647300022154 0ustar mohanmohan # -*- python -*- # # Copyright (C) 2012, Pigeon Point Systems # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # # Author(s): # Anton Pak # from openhpi_baselib.HpiCore import HpiCore from openhpi_baselib.HpiDataTypes import * from openhpi_baselib import HpiUtil from openhpi_baselib import OhpiDataTypes #********************************************************** # HPI API (auto-generated) #********************************************************** #********************************************************** def saHpiVersionGet(): return SAHPI_INTERFACE_VERSION #********************************************************** def saHpiDiscover( SessionId ): s = HpiCore.getSession( SessionId ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_DISCOVER ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv != SA_OK: return rv return SA_OK #********************************************************** def saHpiDomainInfoGet( SessionId ): s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_DOMAIN_INFO_GET ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: DomainInfo = m.demarshalSaHpiDomainInfoT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None ) return ( SA_OK, DomainInfo ) #********************************************************** def saHpiDrtEntryGet( SessionId, EntryId ): s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiEntryIdT( EntryId ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_DRT_ENTRY_GET ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: NextEntryId = m.demarshalSaHpiEntryIdT() DrtEntry = m.demarshalSaHpiDrtEntryT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None, None ) return ( SA_OK, NextEntryId, DrtEntry ) #********************************************************** def saHpiDomainTagSet( SessionId, DomainTag ): rc = HpiUtil.checkSaHpiTextBufferT( DomainTag ) if not rc: return SA_ERR_HPI_INVALID_PARAMS s = HpiCore.getSession( SessionId ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiTextBufferT( DomainTag ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_DOMAIN_TAG_SET ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv != SA_OK: return rv return SA_OK #********************************************************** def saHpiRptEntryGet( SessionId, EntryId ): s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiEntryIdT( EntryId ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_RPT_ENTRY_GET ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: NextEntryId = m.demarshalSaHpiEntryIdT() RptEntry = m.demarshalSaHpiRptEntryT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None, None ) return ( SA_OK, NextEntryId, RptEntry ) #********************************************************** def saHpiRptEntryGetByResourceId( SessionId, ResourceId ): s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_RPT_ENTRY_GET_BY_RESOURCE_ID ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: RptEntry = m.demarshalSaHpiRptEntryT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None ) return ( SA_OK, RptEntry ) #********************************************************** def saHpiResourceSeveritySet( SessionId, ResourceId, Severity ): s = HpiCore.getSession( SessionId ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiSeverityT( Severity ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_RESOURCE_SEVERITY_SET ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv != SA_OK: return rv return SA_OK #********************************************************** def saHpiResourceTagSet( SessionId, ResourceId, ResourceTag ): rc = HpiUtil.checkSaHpiTextBufferT( ResourceTag ) if not rc: return SA_ERR_HPI_INVALID_PARAMS s = HpiCore.getSession( SessionId ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiTextBufferT( ResourceTag ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_RESOURCE_TAG_SET ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv != SA_OK: return rv return SA_OK #********************************************************** def saHpiGetIdByEntityPath( SessionId, EntityPath, InstrumentType, InstanceId ): rc = HpiUtil.checkSaHpiEntityPathT( EntityPath ) if not rc: return ( SA_ERR_HPI_INVALID_PARAMS, None, None, None, None ) s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None, None, None, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None, None, None, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiEntityPathT( EntityPath ) m.marshalSaHpiRdrTypeT( InstrumentType ) m.marshalSaHpiUint32T( InstanceId ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_GET_ID_BY_ENTITY_PATH ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None, None, None, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: InstanceId = m.demarshalSaHpiUint32T() ResourceId = m.demarshalSaHpiResourceIdT() InstrumentId = m.demarshalSaHpiInstrumentIdT() RptUpdateCount = m.demarshalSaHpiUint32T() s.putMarshal( m ) if rv != SA_OK: return ( rv, None, None, None, None ) return ( SA_OK, InstanceId, ResourceId, InstrumentId, RptUpdateCount ) #********************************************************** def saHpiGetChildEntityPath( SessionId, ParentEntityPath, InstanceId ): rc = HpiUtil.checkSaHpiEntityPathT( ParentEntityPath ) if not rc: return ( SA_ERR_HPI_INVALID_PARAMS, None, None, None ) s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None, None, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None, None, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiEntityPathT( ParentEntityPath ) m.marshalSaHpiUint32T( InstanceId ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_GET_CHILD_ENTITY_PATH ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None, None, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: InstanceId = m.demarshalSaHpiUint32T() ChildEntityPath = m.demarshalSaHpiEntityPathT() RptUpdateCount = m.demarshalSaHpiUint32T() s.putMarshal( m ) if rv != SA_OK: return ( rv, None, None, None ) return ( SA_OK, InstanceId, ChildEntityPath, RptUpdateCount ) #********************************************************** def saHpiResourceFailedRemove( SessionId, ResourceId ): s = HpiCore.getSession( SessionId ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_RESOURCE_FAILED_REMOVE ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv != SA_OK: return rv return SA_OK #********************************************************** def saHpiEventLogInfoGet( SessionId, ResourceId ): s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_EVENT_LOG_INFO_GET ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: Info = m.demarshalSaHpiEventLogInfoT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None ) return ( SA_OK, Info ) #********************************************************** def saHpiEventLogCapabilitiesGet( SessionId, ResourceId ): s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_EVENT_LOG_CAPABILITIES_GET ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: EventLogCapabilities = m.demarshalSaHpiEventLogCapabilitiesT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None ) return ( SA_OK, EventLogCapabilities ) #********************************************************** def saHpiEventLogEntryGet( SessionId, ResourceId, EntryId ): s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None, None, None, None, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None, None, None, None, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiEventLogEntryIdT( EntryId ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_EVENT_LOG_ENTRY_GET ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None, None, None, None, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: PrevEntryId = m.demarshalSaHpiEventLogEntryIdT() NextEntryId = m.demarshalSaHpiEventLogEntryIdT() EventLogEntry = m.demarshalSaHpiEventLogEntryT() Rdr = m.demarshalSaHpiRdrT() RptEntry = m.demarshalSaHpiRptEntryT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None, None, None, None, None ) return ( SA_OK, PrevEntryId, NextEntryId, EventLogEntry, Rdr, RptEntry ) #********************************************************** def saHpiEventLogEntryAdd( SessionId, ResourceId, EvtEntry ): rc = HpiUtil.checkSaHpiEventT( EvtEntry ) if not rc: return SA_ERR_HPI_INVALID_PARAMS s = HpiCore.getSession( SessionId ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiEventT( EvtEntry ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_EVENT_LOG_ENTRY_ADD ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv != SA_OK: return rv return SA_OK #********************************************************** def saHpiEventLogClear( SessionId, ResourceId ): s = HpiCore.getSession( SessionId ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_EVENT_LOG_CLEAR ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv != SA_OK: return rv return SA_OK #********************************************************** def saHpiEventLogTimeGet( SessionId, ResourceId ): s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_EVENT_LOG_TIME_GET ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: Time = m.demarshalSaHpiTimeT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None ) return ( SA_OK, Time ) #********************************************************** def saHpiEventLogTimeSet( SessionId, ResourceId, Time ): s = HpiCore.getSession( SessionId ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiTimeT( Time ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_EVENT_LOG_TIME_SET ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv != SA_OK: return rv return SA_OK #********************************************************** def saHpiEventLogStateGet( SessionId, ResourceId ): s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_EVENT_LOG_STATE_GET ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: EnableState = m.demarshalSaHpiBoolT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None ) return ( SA_OK, EnableState ) #********************************************************** def saHpiEventLogStateSet( SessionId, ResourceId, EnableState ): s = HpiCore.getSession( SessionId ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiBoolT( EnableState ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_EVENT_LOG_STATE_SET ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv != SA_OK: return rv return SA_OK #********************************************************** def saHpiEventLogOverflowReset( SessionId, ResourceId ): s = HpiCore.getSession( SessionId ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_EVENT_LOG_OVERFLOW_RESET ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv != SA_OK: return rv return SA_OK #********************************************************** def saHpiSubscribe( SessionId ): s = HpiCore.getSession( SessionId ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_SUBSCRIBE ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv != SA_OK: return rv return SA_OK #********************************************************** def saHpiUnsubscribe( SessionId ): s = HpiCore.getSession( SessionId ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_UNSUBSCRIBE ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv != SA_OK: return rv return SA_OK #********************************************************** def saHpiEventGet( SessionId, Timeout ): s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None, None, None, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None, None, None, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiTimeoutT( Timeout ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_EVENT_GET ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None, None, None, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: Event = m.demarshalSaHpiEventT() Rdr = m.demarshalSaHpiRdrT() RptEntry = m.demarshalSaHpiRptEntryT() EventQueueStatus = m.demarshalSaHpiEvtQueueStatusT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None, None, None, None ) return ( SA_OK, Event, Rdr, RptEntry, EventQueueStatus ) #********************************************************** def saHpiEventAdd( SessionId, EvtEntry ): rc = HpiUtil.checkSaHpiEventT( EvtEntry ) if not rc: return SA_ERR_HPI_INVALID_PARAMS s = HpiCore.getSession( SessionId ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiEventT( EvtEntry ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_EVENT_ADD ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv != SA_OK: return rv return SA_OK #********************************************************** def saHpiAlarmGetNext( SessionId, Severity, UnacknowledgedOnly, Alarm ): rc = HpiUtil.checkSaHpiAlarmT( Alarm ) if not rc: return ( SA_ERR_HPI_INVALID_PARAMS, None ) s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiSeverityT( Severity ) m.marshalSaHpiBoolT( UnacknowledgedOnly ) m.marshalSaHpiAlarmT( Alarm ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_ALARM_GET_NEXT ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: Alarm = m.demarshalSaHpiAlarmT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None ) return ( SA_OK, Alarm ) #********************************************************** def saHpiAlarmGet( SessionId, AlarmId ): s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiAlarmIdT( AlarmId ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_ALARM_GET ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: Alarm = m.demarshalSaHpiAlarmT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None ) return ( SA_OK, Alarm ) #********************************************************** def saHpiAlarmAcknowledge( SessionId, AlarmId, Severity ): s = HpiCore.getSession( SessionId ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiAlarmIdT( AlarmId ) m.marshalSaHpiSeverityT( Severity ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_ALARM_ACKNOWLEDGE ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv != SA_OK: return rv return SA_OK #********************************************************** def saHpiAlarmAdd( SessionId, Alarm ): rc = HpiUtil.checkSaHpiAlarmT( Alarm ) if not rc: return ( SA_ERR_HPI_INVALID_PARAMS, None ) s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiAlarmT( Alarm ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_ALARM_ADD ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: Alarm = m.demarshalSaHpiAlarmT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None ) return ( SA_OK, Alarm ) #********************************************************** def saHpiAlarmDelete( SessionId, AlarmId, Severity ): s = HpiCore.getSession( SessionId ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiAlarmIdT( AlarmId ) m.marshalSaHpiSeverityT( Severity ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_ALARM_DELETE ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv != SA_OK: return rv return SA_OK #********************************************************** def saHpiRdrGet( SessionId, ResourceId, EntryId ): s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiEntryIdT( EntryId ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_RDR_GET ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: NextEntryId = m.demarshalSaHpiEntryIdT() Rdr = m.demarshalSaHpiRdrT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None, None ) return ( SA_OK, NextEntryId, Rdr ) #********************************************************** def saHpiRdrGetByInstrumentId( SessionId, ResourceId, RdrType, InstrumentId ): s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiRdrTypeT( RdrType ) m.marshalSaHpiInstrumentIdT( InstrumentId ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_RDR_GET_BY_INSTRUMENT_ID ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: Rdr = m.demarshalSaHpiRdrT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None ) return ( SA_OK, Rdr ) #********************************************************** def saHpiRdrUpdateCountGet( SessionId, ResourceId ): s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_RDR_UPDATE_COUNT_GET ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: UpdateCount = m.demarshalSaHpiUint32T() s.putMarshal( m ) if rv != SA_OK: return ( rv, None ) return ( SA_OK, UpdateCount ) #********************************************************** def saHpiSensorReadingGet( SessionId, ResourceId, SensorNum ): s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiSensorNumT( SensorNum ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_SENSOR_READING_GET ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: Reading = m.demarshalSaHpiSensorReadingT() EventState = m.demarshalSaHpiEventStateT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None, None ) return ( SA_OK, Reading, EventState ) #********************************************************** def saHpiSensorThresholdsGet( SessionId, ResourceId, SensorNum ): s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiSensorNumT( SensorNum ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_SENSOR_THRESHOLDS_GET ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: SensorThresholds = m.demarshalSaHpiSensorThresholdsT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None ) return ( SA_OK, SensorThresholds ) #********************************************************** def saHpiSensorThresholdsSet( SessionId, ResourceId, SensorNum, SensorThresholds ): rc = HpiUtil.checkSaHpiSensorThresholdsT( SensorThresholds ) if not rc: return SA_ERR_HPI_INVALID_PARAMS s = HpiCore.getSession( SessionId ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiSensorNumT( SensorNum ) m.marshalSaHpiSensorThresholdsT( SensorThresholds ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_SENSOR_THRESHOLDS_SET ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv != SA_OK: return rv return SA_OK #********************************************************** def saHpiSensorTypeGet( SessionId, ResourceId, SensorNum ): s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiSensorNumT( SensorNum ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_SENSOR_TYPE_GET ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: Type = m.demarshalSaHpiSensorTypeT() Category = m.demarshalSaHpiEventCategoryT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None, None ) return ( SA_OK, Type, Category ) #********************************************************** def saHpiSensorEnableGet( SessionId, ResourceId, SensorNum ): s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiSensorNumT( SensorNum ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_SENSOR_ENABLE_GET ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: SensorEnabled = m.demarshalSaHpiBoolT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None ) return ( SA_OK, SensorEnabled ) #********************************************************** def saHpiSensorEnableSet( SessionId, ResourceId, SensorNum, SensorEnabled ): s = HpiCore.getSession( SessionId ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiSensorNumT( SensorNum ) m.marshalSaHpiBoolT( SensorEnabled ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_SENSOR_ENABLE_SET ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv != SA_OK: return rv return SA_OK #********************************************************** def saHpiSensorEventEnableGet( SessionId, ResourceId, SensorNum ): s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiSensorNumT( SensorNum ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_SENSOR_EVENT_ENABLE_GET ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: SensorEventsEnabled = m.demarshalSaHpiBoolT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None ) return ( SA_OK, SensorEventsEnabled ) #********************************************************** def saHpiSensorEventEnableSet( SessionId, ResourceId, SensorNum, SensorEventsEnabled ): s = HpiCore.getSession( SessionId ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiSensorNumT( SensorNum ) m.marshalSaHpiBoolT( SensorEventsEnabled ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_SENSOR_EVENT_ENABLE_SET ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv != SA_OK: return rv return SA_OK #********************************************************** def saHpiSensorEventMasksGet( SessionId, ResourceId, SensorNum ): s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiSensorNumT( SensorNum ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_SENSOR_EVENT_MASKS_GET ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: AssertEventMask = m.demarshalSaHpiEventStateT() DeassertEventMask = m.demarshalSaHpiEventStateT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None, None ) return ( SA_OK, AssertEventMask, DeassertEventMask ) #********************************************************** def saHpiSensorEventMasksSet( SessionId, ResourceId, SensorNum, Action, AssertEventMask, DeassertEventMask ): s = HpiCore.getSession( SessionId ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiSensorNumT( SensorNum ) m.marshalSaHpiSensorEventMaskActionT( Action ) m.marshalSaHpiEventStateT( AssertEventMask ) m.marshalSaHpiEventStateT( DeassertEventMask ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_SENSOR_EVENT_MASKS_SET ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv != SA_OK: return rv return SA_OK #********************************************************** def saHpiControlTypeGet( SessionId, ResourceId, CtrlNum ): s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiCtrlNumT( CtrlNum ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_CONTROL_TYPE_GET ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: Type = m.demarshalSaHpiCtrlTypeT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None ) return ( SA_OK, Type ) #********************************************************** def saHpiControlGet( SessionId, ResourceId, CtrlNum, CtrlState ): rc = HpiUtil.checkSaHpiCtrlStateT( CtrlState ) if not rc: return ( SA_ERR_HPI_INVALID_PARAMS, None, None ) s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiCtrlNumT( CtrlNum ) m.marshalSaHpiCtrlStateT( CtrlState ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_CONTROL_GET ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: CtrlMode = m.demarshalSaHpiCtrlModeT() CtrlState = m.demarshalSaHpiCtrlStateT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None, None ) return ( SA_OK, CtrlMode, CtrlState ) #********************************************************** def saHpiControlSet( SessionId, ResourceId, CtrlNum, CtrlMode, CtrlState ): rc = HpiUtil.checkSaHpiCtrlStateT( CtrlState ) if not rc: return SA_ERR_HPI_INVALID_PARAMS s = HpiCore.getSession( SessionId ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiCtrlNumT( CtrlNum ) m.marshalSaHpiCtrlModeT( CtrlMode ) m.marshalSaHpiCtrlStateT( CtrlState ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_CONTROL_SET ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv != SA_OK: return rv return SA_OK #********************************************************** def saHpiIdrInfoGet( SessionId, ResourceId, IdrId ): s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiIdrIdT( IdrId ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_IDR_INFO_GET ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: IdrInfo = m.demarshalSaHpiIdrInfoT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None ) return ( SA_OK, IdrInfo ) #********************************************************** def saHpiIdrAreaHeaderGet( SessionId, ResourceId, IdrId, AreaType, AreaId ): s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiIdrIdT( IdrId ) m.marshalSaHpiIdrAreaTypeT( AreaType ) m.marshalSaHpiEntryIdT( AreaId ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_IDR_AREA_HEADER_GET ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: NextAreaId = m.demarshalSaHpiEntryIdT() Header = m.demarshalSaHpiIdrAreaHeaderT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None, None ) return ( SA_OK, NextAreaId, Header ) #********************************************************** def saHpiIdrAreaAdd( SessionId, ResourceId, IdrId, AreaType ): s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiIdrIdT( IdrId ) m.marshalSaHpiIdrAreaTypeT( AreaType ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_IDR_AREA_ADD ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: AreaId = m.demarshalSaHpiEntryIdT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None ) return ( SA_OK, AreaId ) #********************************************************** def saHpiIdrAreaAddById( SessionId, ResourceId, IdrId, AreaType, AreaId ): s = HpiCore.getSession( SessionId ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiIdrIdT( IdrId ) m.marshalSaHpiIdrAreaTypeT( AreaType ) m.marshalSaHpiEntryIdT( AreaId ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_IDR_AREA_ADD_BY_ID ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv != SA_OK: return rv return SA_OK #********************************************************** def saHpiIdrAreaDelete( SessionId, ResourceId, IdrId, AreaId ): s = HpiCore.getSession( SessionId ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiIdrIdT( IdrId ) m.marshalSaHpiEntryIdT( AreaId ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_IDR_AREA_DELETE ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv != SA_OK: return rv return SA_OK #********************************************************** def saHpiIdrFieldGet( SessionId, ResourceId, IdrId, AreaId, FieldType, FieldId ): s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiIdrIdT( IdrId ) m.marshalSaHpiEntryIdT( AreaId ) m.marshalSaHpiIdrFieldTypeT( FieldType ) m.marshalSaHpiEntryIdT( FieldId ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_IDR_FIELD_GET ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: NextFieldId = m.demarshalSaHpiEntryIdT() Field = m.demarshalSaHpiIdrFieldT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None, None ) return ( SA_OK, NextFieldId, Field ) #********************************************************** def saHpiIdrFieldAdd( SessionId, ResourceId, IdrId, Field ): rc = HpiUtil.checkSaHpiIdrFieldT( Field ) if not rc: return ( SA_ERR_HPI_INVALID_PARAMS, None ) s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiIdrIdT( IdrId ) m.marshalSaHpiIdrFieldT( Field ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_IDR_FIELD_ADD ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: Field = m.demarshalSaHpiIdrFieldT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None ) return ( SA_OK, Field ) #********************************************************** def saHpiIdrFieldAddById( SessionId, ResourceId, IdrId, Field ): rc = HpiUtil.checkSaHpiIdrFieldT( Field ) if not rc: return SA_ERR_HPI_INVALID_PARAMS s = HpiCore.getSession( SessionId ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiIdrIdT( IdrId ) m.marshalSaHpiIdrFieldT( Field ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_IDR_FIELD_ADD_BY_ID ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv != SA_OK: return rv return SA_OK #********************************************************** def saHpiIdrFieldSet( SessionId, ResourceId, IdrId, Field ): rc = HpiUtil.checkSaHpiIdrFieldT( Field ) if not rc: return SA_ERR_HPI_INVALID_PARAMS s = HpiCore.getSession( SessionId ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiIdrIdT( IdrId ) m.marshalSaHpiIdrFieldT( Field ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_IDR_FIELD_SET ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv != SA_OK: return rv return SA_OK #********************************************************** def saHpiIdrFieldDelete( SessionId, ResourceId, IdrId, AreaId, FieldId ): s = HpiCore.getSession( SessionId ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiIdrIdT( IdrId ) m.marshalSaHpiEntryIdT( AreaId ) m.marshalSaHpiEntryIdT( FieldId ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_IDR_FIELD_DELETE ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv != SA_OK: return rv return SA_OK #********************************************************** def saHpiWatchdogTimerGet( SessionId, ResourceId, WatchdogNum ): s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiWatchdogNumT( WatchdogNum ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_WATCHDOG_TIMER_GET ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: Watchdog = m.demarshalSaHpiWatchdogT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None ) return ( SA_OK, Watchdog ) #********************************************************** def saHpiWatchdogTimerSet( SessionId, ResourceId, WatchdogNum, Watchdog ): rc = HpiUtil.checkSaHpiWatchdogT( Watchdog ) if not rc: return SA_ERR_HPI_INVALID_PARAMS s = HpiCore.getSession( SessionId ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiWatchdogNumT( WatchdogNum ) m.marshalSaHpiWatchdogT( Watchdog ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_WATCHDOG_TIMER_SET ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv != SA_OK: return rv return SA_OK #********************************************************** def saHpiWatchdogTimerReset( SessionId, ResourceId, WatchdogNum ): s = HpiCore.getSession( SessionId ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiWatchdogNumT( WatchdogNum ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_WATCHDOG_TIMER_RESET ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv != SA_OK: return rv return SA_OK #********************************************************** def saHpiAnnunciatorGetNext( SessionId, ResourceId, AnnunciatorNum, Severity, UnacknowledgedOnly, Announcement ): rc = HpiUtil.checkSaHpiAnnouncementT( Announcement ) if not rc: return ( SA_ERR_HPI_INVALID_PARAMS, None ) s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiAnnunciatorNumT( AnnunciatorNum ) m.marshalSaHpiSeverityT( Severity ) m.marshalSaHpiBoolT( UnacknowledgedOnly ) m.marshalSaHpiAnnouncementT( Announcement ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_ANNUNCIATOR_GET_NEXT ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: Announcement = m.demarshalSaHpiAnnouncementT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None ) return ( SA_OK, Announcement ) #********************************************************** def saHpiAnnunciatorGet( SessionId, ResourceId, AnnunciatorNum, EntryId ): s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiAnnunciatorNumT( AnnunciatorNum ) m.marshalSaHpiEntryIdT( EntryId ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_ANNUNCIATOR_GET ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: Announcement = m.demarshalSaHpiAnnouncementT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None ) return ( SA_OK, Announcement ) #********************************************************** def saHpiAnnunciatorAcknowledge( SessionId, ResourceId, AnnunciatorNum, EntryId, Severity ): s = HpiCore.getSession( SessionId ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiAnnunciatorNumT( AnnunciatorNum ) m.marshalSaHpiEntryIdT( EntryId ) m.marshalSaHpiSeverityT( Severity ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_ANNUNCIATOR_ACKNOWLEDGE ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv != SA_OK: return rv return SA_OK #********************************************************** def saHpiAnnunciatorAdd( SessionId, ResourceId, AnnunciatorNum, Announcement ): rc = HpiUtil.checkSaHpiAnnouncementT( Announcement ) if not rc: return ( SA_ERR_HPI_INVALID_PARAMS, None ) s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiAnnunciatorNumT( AnnunciatorNum ) m.marshalSaHpiAnnouncementT( Announcement ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_ANNUNCIATOR_ADD ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: Announcement = m.demarshalSaHpiAnnouncementT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None ) return ( SA_OK, Announcement ) #********************************************************** def saHpiAnnunciatorDelete( SessionId, ResourceId, AnnunciatorNum, EntryId, Severity ): s = HpiCore.getSession( SessionId ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiAnnunciatorNumT( AnnunciatorNum ) m.marshalSaHpiEntryIdT( EntryId ) m.marshalSaHpiSeverityT( Severity ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_ANNUNCIATOR_DELETE ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv != SA_OK: return rv return SA_OK #********************************************************** def saHpiAnnunciatorModeGet( SessionId, ResourceId, AnnunciatorNum ): s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiAnnunciatorNumT( AnnunciatorNum ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_ANNUNCIATOR_MODE_GET ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: Mode = m.demarshalSaHpiAnnunciatorModeT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None ) return ( SA_OK, Mode ) #********************************************************** def saHpiAnnunciatorModeSet( SessionId, ResourceId, AnnunciatorNum, Mode ): s = HpiCore.getSession( SessionId ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiAnnunciatorNumT( AnnunciatorNum ) m.marshalSaHpiAnnunciatorModeT( Mode ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_ANNUNCIATOR_MODE_SET ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv != SA_OK: return rv return SA_OK #********************************************************** def saHpiDimiInfoGet( SessionId, ResourceId, DimiNum ): s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiDimiNumT( DimiNum ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_DIMI_INFO_GET ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: DimiInfo = m.demarshalSaHpiDimiInfoT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None ) return ( SA_OK, DimiInfo ) #********************************************************** def saHpiDimiTestInfoGet( SessionId, ResourceId, DimiNum, TestNum ): s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiDimiNumT( DimiNum ) m.marshalSaHpiDimiTestNumT( TestNum ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_DIMI_TEST_INFO_GET ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: DimiTest = m.demarshalSaHpiDimiTestT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None ) return ( SA_OK, DimiTest ) #********************************************************** def saHpiDimiTestReadinessGet( SessionId, ResourceId, DimiNum, TestNum ): s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiDimiNumT( DimiNum ) m.marshalSaHpiDimiTestNumT( TestNum ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_DIMI_TEST_READINESS_GET ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: DimiReady = m.demarshalSaHpiDimiReadyT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None ) return ( SA_OK, DimiReady ) #********************************************************** def saHpiDimiTestCancel( SessionId, ResourceId, DimiNum, TestNum ): s = HpiCore.getSession( SessionId ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiDimiNumT( DimiNum ) m.marshalSaHpiDimiTestNumT( TestNum ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_DIMI_TEST_CANCEL ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv != SA_OK: return rv return SA_OK #********************************************************** def saHpiDimiTestStatusGet( SessionId, ResourceId, DimiNum, TestNum ): s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiDimiNumT( DimiNum ) m.marshalSaHpiDimiTestNumT( TestNum ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_DIMI_TEST_STATUS_GET ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: PercentCompleted = m.demarshalSaHpiDimiTestPercentCompletedT() RunStatus = m.demarshalSaHpiDimiTestRunStatusT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None, None ) return ( SA_OK, PercentCompleted, RunStatus ) #********************************************************** def saHpiDimiTestResultsGet( SessionId, ResourceId, DimiNum, TestNum ): s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiDimiNumT( DimiNum ) m.marshalSaHpiDimiTestNumT( TestNum ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_DIMI_TEST_RESULTS_GET ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: TestResults = m.demarshalSaHpiDimiTestResultsT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None ) return ( SA_OK, TestResults ) #********************************************************** def saHpiFumiSpecInfoGet( SessionId, ResourceId, FumiNum ): s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiFumiNumT( FumiNum ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_FUMI_SPEC_INFO_GET ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: SpecInfo = m.demarshalSaHpiFumiSpecInfoT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None ) return ( SA_OK, SpecInfo ) #********************************************************** def saHpiFumiServiceImpactGet( SessionId, ResourceId, FumiNum ): s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiFumiNumT( FumiNum ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_FUMI_SERVICE_IMPACT_GET ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: ServiceImpact = m.demarshalSaHpiFumiServiceImpactDataT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None ) return ( SA_OK, ServiceImpact ) #********************************************************** def saHpiFumiSourceSet( SessionId, ResourceId, FumiNum, BankNum, SourceUri ): rc = HpiUtil.checkSaHpiTextBufferT( SourceUri ) if not rc: return SA_ERR_HPI_INVALID_PARAMS s = HpiCore.getSession( SessionId ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiFumiNumT( FumiNum ) m.marshalSaHpiBankNumT( BankNum ) m.marshalSaHpiTextBufferT( SourceUri ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_FUMI_SOURCE_SET ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv != SA_OK: return rv return SA_OK #********************************************************** def saHpiFumiSourceInfoValidateStart( SessionId, ResourceId, FumiNum, BankNum ): s = HpiCore.getSession( SessionId ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiFumiNumT( FumiNum ) m.marshalSaHpiBankNumT( BankNum ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_FUMI_SOURCE_INFO_VALIDATE_START ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv != SA_OK: return rv return SA_OK #********************************************************** def saHpiFumiSourceInfoGet( SessionId, ResourceId, FumiNum, BankNum ): s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiFumiNumT( FumiNum ) m.marshalSaHpiBankNumT( BankNum ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_FUMI_SOURCE_INFO_GET ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: SourceInfo = m.demarshalSaHpiFumiSourceInfoT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None ) return ( SA_OK, SourceInfo ) #********************************************************** def saHpiFumiSourceComponentInfoGet( SessionId, ResourceId, FumiNum, BankNum, ComponentEntryId ): s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiFumiNumT( FumiNum ) m.marshalSaHpiBankNumT( BankNum ) m.marshalSaHpiEntryIdT( ComponentEntryId ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_FUMI_SOURCE_COMPONENT_INFO_GET ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: NextComponentEntryId = m.demarshalSaHpiEntryIdT() ComponentInfo = m.demarshalSaHpiFumiComponentInfoT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None, None ) return ( SA_OK, NextComponentEntryId, ComponentInfo ) #********************************************************** def saHpiFumiTargetInfoGet( SessionId, ResourceId, FumiNum, BankNum ): s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiFumiNumT( FumiNum ) m.marshalSaHpiBankNumT( BankNum ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_FUMI_TARGET_INFO_GET ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: BankInfo = m.demarshalSaHpiFumiBankInfoT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None ) return ( SA_OK, BankInfo ) #********************************************************** def saHpiFumiTargetComponentInfoGet( SessionId, ResourceId, FumiNum, BankNum, ComponentEntryId ): s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiFumiNumT( FumiNum ) m.marshalSaHpiBankNumT( BankNum ) m.marshalSaHpiEntryIdT( ComponentEntryId ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_FUMI_TARGET_COMPONENT_INFO_GET ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: NextComponentEntryId = m.demarshalSaHpiEntryIdT() ComponentInfo = m.demarshalSaHpiFumiComponentInfoT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None, None ) return ( SA_OK, NextComponentEntryId, ComponentInfo ) #********************************************************** def saHpiFumiLogicalTargetInfoGet( SessionId, ResourceId, FumiNum ): s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiFumiNumT( FumiNum ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_FUMI_LOGICAL_TARGET_INFO_GET ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: BankInfo = m.demarshalSaHpiFumiLogicalBankInfoT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None ) return ( SA_OK, BankInfo ) #********************************************************** def saHpiFumiLogicalTargetComponentInfoGet( SessionId, ResourceId, FumiNum, ComponentEntryId ): s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiFumiNumT( FumiNum ) m.marshalSaHpiEntryIdT( ComponentEntryId ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_FUMI_LOGICAL_TARGET_COMPONENT_INFO_GET ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: NextComponentEntryId = m.demarshalSaHpiEntryIdT() ComponentInfo = m.demarshalSaHpiFumiLogicalComponentInfoT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None, None ) return ( SA_OK, NextComponentEntryId, ComponentInfo ) #********************************************************** def saHpiFumiBackupStart( SessionId, ResourceId, FumiNum ): s = HpiCore.getSession( SessionId ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiFumiNumT( FumiNum ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_FUMI_BACKUP_START ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv != SA_OK: return rv return SA_OK #********************************************************** def saHpiFumiBankBootOrderSet( SessionId, ResourceId, FumiNum, BankNum, Position ): s = HpiCore.getSession( SessionId ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiFumiNumT( FumiNum ) m.marshalSaHpiBankNumT( BankNum ) m.marshalSaHpiUint32T( Position ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_FUMI_BANK_BOOT_ORDER_SET ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv != SA_OK: return rv return SA_OK #********************************************************** def saHpiFumiBankCopyStart( SessionId, ResourceId, FumiNum, SourceBankNum, TargetBankNum ): s = HpiCore.getSession( SessionId ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiFumiNumT( FumiNum ) m.marshalSaHpiBankNumT( SourceBankNum ) m.marshalSaHpiBankNumT( TargetBankNum ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_FUMI_BANK_COPY_START ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv != SA_OK: return rv return SA_OK #********************************************************** def saHpiFumiInstallStart( SessionId, ResourceId, FumiNum, BankNum ): s = HpiCore.getSession( SessionId ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiFumiNumT( FumiNum ) m.marshalSaHpiBankNumT( BankNum ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_FUMI_INSTALL_START ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv != SA_OK: return rv return SA_OK #********************************************************** def saHpiFumiUpgradeStatusGet( SessionId, ResourceId, FumiNum, BankNum ): s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiFumiNumT( FumiNum ) m.marshalSaHpiBankNumT( BankNum ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_FUMI_UPGRADE_STATUS_GET ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: UpgradeStatus = m.demarshalSaHpiFumiUpgradeStatusT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None ) return ( SA_OK, UpgradeStatus ) #********************************************************** def saHpiFumiTargetVerifyStart( SessionId, ResourceId, FumiNum, BankNum ): s = HpiCore.getSession( SessionId ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiFumiNumT( FumiNum ) m.marshalSaHpiBankNumT( BankNum ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_FUMI_TARGET_VERIFY_START ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv != SA_OK: return rv return SA_OK #********************************************************** def saHpiFumiTargetVerifyMainStart( SessionId, ResourceId, FumiNum ): s = HpiCore.getSession( SessionId ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiFumiNumT( FumiNum ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_FUMI_TARGET_VERIFY_MAIN_START ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv != SA_OK: return rv return SA_OK #********************************************************** def saHpiFumiUpgradeCancel( SessionId, ResourceId, FumiNum, BankNum ): s = HpiCore.getSession( SessionId ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiFumiNumT( FumiNum ) m.marshalSaHpiBankNumT( BankNum ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_FUMI_UPGRADE_CANCEL ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv != SA_OK: return rv return SA_OK #********************************************************** def saHpiFumiAutoRollbackDisableGet( SessionId, ResourceId, FumiNum ): s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiFumiNumT( FumiNum ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_FUMI_AUTO_ROLLBACK_DISABLE_GET ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: Disable = m.demarshalSaHpiBoolT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None ) return ( SA_OK, Disable ) #********************************************************** def saHpiFumiAutoRollbackDisableSet( SessionId, ResourceId, FumiNum, Disable ): s = HpiCore.getSession( SessionId ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiFumiNumT( FumiNum ) m.marshalSaHpiBoolT( Disable ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_FUMI_AUTO_ROLLBACK_DISABLE_SET ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv != SA_OK: return rv return SA_OK #********************************************************** def saHpiFumiRollbackStart( SessionId, ResourceId, FumiNum ): s = HpiCore.getSession( SessionId ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiFumiNumT( FumiNum ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_FUMI_ROLLBACK_START ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv != SA_OK: return rv return SA_OK #********************************************************** def saHpiFumiActivateStart( SessionId, ResourceId, FumiNum, Logical ): s = HpiCore.getSession( SessionId ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiFumiNumT( FumiNum ) m.marshalSaHpiBoolT( Logical ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_FUMI_ACTIVATE_START ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv != SA_OK: return rv return SA_OK #********************************************************** def saHpiFumiCleanup( SessionId, ResourceId, FumiNum, BankNum ): s = HpiCore.getSession( SessionId ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiFumiNumT( FumiNum ) m.marshalSaHpiBankNumT( BankNum ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_FUMI_CLEANUP ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv != SA_OK: return rv return SA_OK #********************************************************** def saHpiHotSwapPolicyCancel( SessionId, ResourceId ): s = HpiCore.getSession( SessionId ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_HOTSWAP_POLICY_CANCEL ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv != SA_OK: return rv return SA_OK #********************************************************** def saHpiResourceActiveSet( SessionId, ResourceId ): s = HpiCore.getSession( SessionId ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_RESOURCE_ACTIVE_SET ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv != SA_OK: return rv return SA_OK #********************************************************** def saHpiResourceInactiveSet( SessionId, ResourceId ): s = HpiCore.getSession( SessionId ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_RESOURCE_INACTIVE_SET ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv != SA_OK: return rv return SA_OK #********************************************************** def saHpiAutoInsertTimeoutGet( SessionId ): s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_AUTO_INSERT_TIMEOUT_GET ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: Timeout = m.demarshalSaHpiTimeoutT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None ) return ( SA_OK, Timeout ) #********************************************************** def saHpiAutoInsertTimeoutSet( SessionId, Timeout ): s = HpiCore.getSession( SessionId ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiTimeoutT( Timeout ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_AUTO_INSERT_TIMEOUT_SET ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv != SA_OK: return rv return SA_OK #********************************************************** def saHpiAutoExtractTimeoutGet( SessionId, ResourceId ): s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_AUTO_EXTRACT_TIMEOUT_GET ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: Timeout = m.demarshalSaHpiTimeoutT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None ) return ( SA_OK, Timeout ) #********************************************************** def saHpiAutoExtractTimeoutSet( SessionId, ResourceId, Timeout ): s = HpiCore.getSession( SessionId ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiTimeoutT( Timeout ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_AUTO_EXTRACT_TIMEOUT_SET ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv != SA_OK: return rv return SA_OK #********************************************************** def saHpiHotSwapStateGet( SessionId, ResourceId ): s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_HOTSWAP_STATE_GET ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: State = m.demarshalSaHpiHsStateT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None ) return ( SA_OK, State ) #********************************************************** def saHpiHotSwapActionRequest( SessionId, ResourceId, Action ): s = HpiCore.getSession( SessionId ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiHsActionT( Action ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_HOTSWAP_ACTION_REQUEST ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv != SA_OK: return rv return SA_OK #********************************************************** def saHpiHotSwapIndicatorStateGet( SessionId, ResourceId ): s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_HOTSWAP_INDICATOR_STATE_GET ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: State = m.demarshalSaHpiHsIndicatorStateT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None ) return ( SA_OK, State ) #********************************************************** def saHpiHotSwapIndicatorStateSet( SessionId, ResourceId, State ): s = HpiCore.getSession( SessionId ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiHsIndicatorStateT( State ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_HOTSWAP_INDICATOR_STATE_SET ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv != SA_OK: return rv return SA_OK #********************************************************** def saHpiParmControl( SessionId, ResourceId, Action ): s = HpiCore.getSession( SessionId ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiParmActionT( Action ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_PARM_CONTROL ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv != SA_OK: return rv return SA_OK #********************************************************** def saHpiResourceLoadIdGet( SessionId, ResourceId ): s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_RESOURCE_LOADID_GET ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: LoadId = m.demarshalSaHpiLoadIdT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None ) return ( SA_OK, LoadId ) #********************************************************** def saHpiResourceLoadIdSet( SessionId, ResourceId, LoadId ): rc = HpiUtil.checkSaHpiLoadIdT( LoadId ) if not rc: return SA_ERR_HPI_INVALID_PARAMS s = HpiCore.getSession( SessionId ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiLoadIdT( LoadId ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_RESOURCE_LOADID_SET ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv != SA_OK: return rv return SA_OK #********************************************************** def saHpiResourceResetStateGet( SessionId, ResourceId ): s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_RESOURCE_RESET_STATE_GET ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: ResetAction = m.demarshalSaHpiResetActionT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None ) return ( SA_OK, ResetAction ) #********************************************************** def saHpiResourceResetStateSet( SessionId, ResourceId, ResetAction ): s = HpiCore.getSession( SessionId ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiResetActionT( ResetAction ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_RESOURCE_RESET_STATE_SET ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv != SA_OK: return rv return SA_OK #********************************************************** def saHpiResourcePowerStateGet( SessionId, ResourceId ): s = HpiCore.getSession( SessionId ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_RESOURCE_POWER_STATE_GET ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: State = m.demarshalSaHpiPowerStateT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None ) return ( SA_OK, State ) #********************************************************** def saHpiResourcePowerStateSet( SessionId, ResourceId, State ): s = HpiCore.getSession( SessionId ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( ResourceId ) m.marshalSaHpiPowerStateT( State ) rc = m.interchange( OhpiDataTypes.RPC_SAHPI_RESOURCE_POWER_STATE_SET ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv != SA_OK: return rv return SA_OK openhpi-3.6.1/baselibs/python/openhpi_baselib/OhpiIterators.py0000644000175100017510000000177012575647300023567 0ustar mohanmohan # -*- python -*- # # Copyright (C) 2012, Pigeon Point Systems # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # # Author(s): # Anton Pak # from openhpi_baselib.Ohpi import * #********************************************************** # OHPI Utility Functions: Iterators #********************************************************** #********************************************************** # Iterate over Handler ids #********************************************************** def HandlerIds( sid ): hid = SAHPI_FIRST_ENTRY while hid != SAHPI_LAST_ENTRY: ( rv, hid ) = oHpiHandlerGetNext( sid, hid ) if rv != SA_OK: break yield hid openhpi-3.6.1/baselibs/python/openhpi_baselib/HpiException.py0000644000175100017510000000116012575647300023363 0ustar mohanmohan # -*- python -*- # # Copyright (C) 2012, Pigeon Point Systems # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # # Author(s): # Anton Pak # class HpiException( Exception ): def __init__( self, msg ): self.msg = msg def __str__( self ): return repr( self.msg ) openhpi-3.6.1/baselibs/python/openhpi_baselib/OhpiUtil.py0000644000175100017510000000550412575647300022527 0ustar mohanmohan # -*- python -*- # # Copyright (C) 2012, Pigeon Point Systems # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # # Author(s): # Anton Pak # from openhpi_baselib.HpiDataTypes import * from openhpi_baselib.OhpiDataTypes import * #********************************************************** # OHPI Utility Functions #********************************************************** #********************************************************** # NB: toXXX raises ValueError if lookup fails #********************************************************** #********************************************************** # Check Functions for OHPI Complex Data Types #********************************************************** #** # Check function for OHPI struct oHpiHandlerConfigT #** def checkoHpiHandlerConfigT( x ): if x is None: return False if not isinstance( x, oHpiHandlerConfigT ): return False if x.items is None: return False if not isinstance( x.items, list ): return False for nv in x.items: if not isinstance( nv, tuple ): return False if len( nv ) != 2: return False ( name, value ) = nv if not isinstance( name, str ): return False if len( name ) != SAHPI_MAX_TEXT_BUFFER_LENGTH: return False if not isinstance( value, str ): return False if len( value ) != SAHPI_MAX_TEXT_BUFFER_LENGTH: return False return True #********************************************************** # oHpiHandlerConfigT Helpers #********************************************************** def fromoHpiHandlerConfigT( config ): d = dict() for ( n, v ) in config.items: d[n.rstrip( chr(0) )] = v.rstrip( chr(0) ) return d def tooHpiHandlerConfigT( d ): if not isinstance( d, dict ): raise ValueError() if len( d ) > 255: raise ValueError() for ( n, v ) in d.iteritems(): if not isinstance( n, str ): raise ValueError() if len( n ) > SAHPI_MAX_TEXT_BUFFER_LENGTH: raise ValueError() if not isinstance( v, str ): raise ValueError() if len( v ) > SAHPI_MAX_TEXT_BUFFER_LENGTH: raise ValueError() config = oHpiHandlerConfigT() config.items = [] for ( n, v ) in d.iteritems(): n = n.ljust( SAHPI_MAX_TEXT_BUFFER_LENGTH, chr(0) ) v = v.ljust( SAHPI_MAX_TEXT_BUFFER_LENGTH, chr(0) ) config.items.append( ( n, v ) ) return config openhpi-3.6.1/baselibs/python/openhpi_baselib/HpiSession.py0000644000175100017510000000422712575647300023057 0ustar mohanmohan # -*- python -*- # # Copyright (C) 2012, Pigeon Point Systems # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # # Author(s): # Anton Pak # import collections, threading from openhpi_baselib.HpiDomain import HpiDomain from openhpi_baselib.OhpiMarshal import OhpiMarshal class HpiSession: next_local_sid = 1 next_local_sid_lock = threading.RLock() def __init__( self, domain ): HpiSession.next_local_sid_lock.acquire() self.local_sid = HpiSession.next_local_sid HpiSession.next_local_sid += 1 HpiSession.next_local_sid_lock.release() self.remote_sid = None self.domain = HpiDomain.clone( domain ) self.marshals = collections.deque() self.marshals_lock = threading.RLock() def close( self ): self.marshals_lock.acquire() marshals = self.marshals self.marshal = collections.deque() self.marshals_lock.release() for m in marshals: m.close() marshals.clear() def getLocalSid( self ): return self.local_sid def getRemoteSid( self ): return self.remote_sid def setRemoteSid( self, remote_sid ): self.remote_sid = remote_sid def getRemoteDid( self ): return self.domain.getRemoteDid() def getMarshal( self ): m = None self.marshals_lock.acquire() if len( self.marshals ) > 0: m = self.marshals.pop() self.marshals_lock.release() if m is None: m = OhpiMarshal() rc = m.open( self.domain.getRemoteHost(), self.domain.getRemotePort() ) if not rc: m = None if m: m.reset() return m def putMarshal( self, m ): m.reset() self.marshals_lock.acquire() self.marshals.append( m ) self.marshals_lock.release() openhpi-3.6.1/baselibs/python/openhpi_baselib/OhpiVersion.py0000644000175100017510000000077312575647300023242 0ustar mohanmohan # -*- python -*- # # Copyright (C) 2012, Pigeon Point Systems # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # # Author(s): # Anton Pak # __version_info__ = ( 3, 6, 1 ) openhpi-3.6.1/baselibs/python/openhpi_baselib/Ohpi.py0000644000175100017510000001720612575647300021673 0ustar mohanmohan # -*- python -*- # # Copyright (C) 2012, Pigeon Point Systems # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # # Author(s): # Anton Pak # from openhpi_baselib.HpiCore import HpiCore from openhpi_baselib.HpiDataTypes import * from openhpi_baselib import HpiUtil from openhpi_baselib import OhpiDataTypes from openhpi_baselib import OhpiUtil from openhpi_baselib import OhpiVersion #********************************************************** # OHPI API (NB: Partly implemented) #********************************************************** #********************************************************** def oHpiVersionGet(): ( vmaj, vmin, vaux ) = OhpiVersion.__version_info__ return ( long( vmaj ) << 48 ) | ( long( vmin ) << 32 ) | ( long( vaux ) << 16 ) #********************************************************** def oHpiHandlerCreate( sid, config ): rc = OhpiUtil.checkoHpiHandlerConfigT( config ) if not rc: return ( SA_ERR_HPI_INVALID_PARAMS, None ) s = HpiCore.getSession( sid ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshaloHpiHandlerConfigT( config ) rc = m.interchange( OhpiDataTypes.RPC_OHPI_HANDLER_CREATE ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: hid = m.demarshaloHpiHandlerIdT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None ) return ( SA_OK, hid ) #********************************************************** def oHpiHandlerDestroy( sid, hid ): s = HpiCore.getSession( sid ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshaloHpiHandlerIdT( hid ) rc = m.interchange( OhpiDataTypes.RPC_OHPI_HANDLER_DESTROY ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv != SA_OK: return rv return SA_OK #********************************************************** def oHpiHandlerInfo( sid, hid ): s = HpiCore.getSession( sid ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshaloHpiHandlerIdT( hid ) rc = m.interchange( OhpiDataTypes.RPC_OHPI_HANDLER_INFO ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: info = m.demarshaloHpiHandlerInfoT() config = m.demarshaloHpiHandlerConfigT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None, None ) return ( SA_OK, info, config ) #********************************************************** def oHpiHandlerGetNext( sid, hid ): s = HpiCore.getSession( sid ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshaloHpiHandlerIdT( hid ) rc = m.interchange( OhpiDataTypes.RPC_OHPI_HANDLER_GET_NEXT ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: next_hid = m.demarshaloHpiHandlerIdT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None ) return ( SA_OK, next_hid ) #********************************************************** def oHpiHandlerFind( sid, rid ): s = HpiCore.getSession( sid ) if s is None: return ( SA_ERR_HPI_INVALID_SESSION, None ) m = s.getMarshal() if m is None: return ( SA_ERR_HPI_NO_RESPONSE, None ) m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshalSaHpiResourceIdT( rid ) rc = m.interchange( OhpiDataTypes.RPC_OHPI_HANDLER_FIND ) if not rc: m.close() return ( SA_ERR_HPI_NO_RESPONSE, None ) rv = m.demarshalSaErrorT() if rv == SA_OK: hid = m.demarshaloHpiHandlerIdT() s.putMarshal( m ) if rv != SA_OK: return ( rv, None ) return ( SA_OK, hid ) #********************************************************** def oHpiHandlerRetry( sid, hid ): s = HpiCore.getSession( sid ) if s is None: return SA_ERR_HPI_INVALID_SESSION m = s.getMarshal() if m is None: return SA_ERR_HPI_NO_RESPONSE m.marshalSaHpiSessionIdT( s.getRemoteSid() ) m.marshaloHpiHandlerIdT( hid ) rc = m.interchange( OhpiDataTypes.RPC_OHPI_HANDLER_RETRY ) if not rc: m.close() return SA_ERR_HPI_NO_RESPONSE rv = m.demarshalSaErrorT() # No output arguments s.putMarshal( m ) if rv != SA_OK: return rv return SA_OK #********************************************************** def oHpiGlobalParamGet( sid ): return ( SA_ERR_HPI_UNSUPPORTED_API, None ) #RPC_OHPI_GLOBAL_PARAM_GET = 113 #SaErrorT SAHPI_API oHpiGlobalParamGet ( # SAHPI_IN SaHpiSessionIdT sid, # SAHPI_INOUT oHpiGlobalParamT *param ); # #********************************************************** def oHpiGlobalParamSet( sid, param ): return SA_ERR_HPI_UNSUPPORTED_API #RPC_OHPI_GLOBAL_PARAM_SET = 114 #SaErrorT SAHPI_API oHpiGlobalParamSet ( # SAHPI_IN SaHpiSessionIdT sid, # SAHPI_IN oHpiGlobalParamT *param ); # #********************************************************** def oHpiInjectEvent( sid, hid, event, rpte, rdr ): return SA_ERR_HPI_UNSUPPORTED_API #RPC_OHPI_INJECT_EVENT = 115 #SaErrorT SAHPI_API oHpiInjectEvent ( # SAHPI_IN SaHpiSessionIdT sid, # SAHPI_IN oHpiHandlerIdT id, # SAHPI_IN SaHpiEventT *event, # SAHPI_IN SaHpiRptEntryT *rpte, # SAHPI_IN SaHpiRdrT *rdr); #********************************************************** def oHpiDomainAdd( host, port, entity_root ): s = HpiUtil.fromSaHpiTextBufferT( host ) d = HpiCore.createDomain( s, port, entity_root ) if d is None: return ( SA_ERR_HPI_INTERNAL_ERROR, None ) return ( SA_OK, d.getLocalDid() ) #********************************************************** def oHpiDomainAddById( did, host, port, entity_root ): return SA_ERR_HPI_UNSUPPORTED_API #SaErrorT SAHPI_API oHpiDomainAddById ( # SAHPI_IN SaHpiDomainIdT domain_id, # SAHPI_IN const SaHpiTextBufferT *host, # SAHPI_IN SaHpiUint16T port, # SAHPI_IN const SaHpiEntityPathT *entity_root ); # #********************************************************** def oHpiDomainEntryGet( eid ): return ( SA_ERR_HPI_UNSUPPORTED_API, None, None ) #SaErrorT SAHPI_API oHpiDomainEntryGet ( # SAHPI_IN SaHpiEntryIdT EntryId, # SAHPI_OUT SaHpiEntryIdT *NextEntryId, # SAHPI_OUT oHpiDomainEntryT *DomainEntry ); # #********************************************************** def oHpiDomainEntryGetByDomainId( did ): return ( SA_ERR_HPI_UNSUPPORTED_API, None ) #SaErrorT SAHPI_API oHpiDomainEntryGetByDomainId ( # SAHPI_IN SaHpiDomainIdT DomainId, # SAHPI_OUT oHpiDomainEntryT *DomainEntry ); openhpi-3.6.1/baselibs/python/openhpi_baselib/OhpiMarshal.py0000644000175100017510000000620312575647300023176 0ustar mohanmohan # -*- python -*- # # Copyright (C) 2012, Pigeon Point Systems # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # # Author(s): # Anton Pak # from openhpi_baselib.HpiDataTypes import * from openhpi_baselib.HpiMarshalGen import HpiMarshalGen from openhpi_baselib.OhpiDataTypes import * #********************************************************** # OHPI Marshal #********************************************************** class OhpiMarshal( HpiMarshalGen ): #********************************************************** # Marshal: For OHPI Simple Data Types #********************************************************** def marshaloHpiHandlerIdT( self, x ): self.marshalSaHpiUint32T( x ) def marshaloHpiGlobalParamTypeT( self, x ): self.marshalEnum( x ) #********************************************************** # Marshal: For OHPI Structs and Unions #********************************************************** def marshaloHpiHandlerConfigT( self, x ): self.marshalSaHpiUint8T( len( x.items ) ) for ( name, value ) in x.items: self.marshalByteArray( name, SAHPI_MAX_TEXT_BUFFER_LENGTH ) self.marshalByteArray( value, SAHPI_MAX_TEXT_BUFFER_LENGTH ) def marshaloHpiGlobalParamUnionT( self, x, mod ): # TODO raise NotImplementedError() def marshaloHpiGlobalParamT( self, x ): # TODO raise NotImplementedError() #********************************************************** # Demarshal: For OHPI Simple Data Types #********************************************************** def demarshaloHpiHandlerIdT( self ): return self.demarshalSaHpiUint32T() def demarshaloHpiGlobalParamTypeT( self ): return self.demarshalEnum() #********************************************************** # Demarshal: For OHPI Structs and Unions #********************************************************** def demarshaloHpiHandlerInfoT( self ): x = oHpiHandlerInfoT() x.id = self.demarshaloHpiHandlerIdT() x.plugin_name = self.demarshalByteArray( MAX_PLUGIN_NAME_LENGTH ) x.entity_root = self.demarshalSaHpiEntityPathT() x.load_failed = self.demarshalSaHpiInt32T() return x def demarshaloHpiHandlerConfigT( self ): x = oHpiHandlerConfigT() x.items = [] n = self.demarshalSaHpiUint8T() for i in range( 0, n ): name = self.demarshalByteArray( SAHPI_MAX_TEXT_BUFFER_LENGTH ) value = self.demarshalByteArray( SAHPI_MAX_TEXT_BUFFER_LENGTH ) x.items.append( ( name, value ) ) return x def demarshaloHpiGlobalParamUnionT( self, mod ): # TODO raise NotImplementedError() def demarshaloHpiGlobalParamT( self ): # TODO raise NotImplementedError() openhpi-3.6.1/baselibs/python/openhpi_baselib/HpiUtil.py0000644000175100017510000000723112575647300022347 0ustar mohanmohan # -*- python -*- # # Copyright (C) 2012, Pigeon Point Systems # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # # Author(s): # Anton Pak # from openhpi_baselib.HpiDataTypes import * from openhpi_baselib.HpiUtilGen import * #********************************************************** # HPI Utility Functions #********************************************************** #********************************************************** # NB: toXXX raises ValueError if lookup fails #********************************************************** #********************************************************** # Text Buffer Helpers #********************************************************** def fromSaHpiTextBufferT( tb ): if tb.DataType == SAHPI_TL_TYPE_UNICODE: # TODO raise ValueError() else: return tb.Data[0:tb.DataLength] def toSaHpiTextBufferT( s ): if not isinstance( s, str ): # TODO raise ValueError() if len( s ) > SAHPI_MAX_TEXT_BUFFER_LENGTH: raise ValueError() tb = SaHpiTextBufferT() tb.DataType = SAHPI_TL_TYPE_TEXT tb.Language = SAHPI_LANG_ENGLISH tb.DataLength = len( s ) tb.Data = s.ljust( SAHPI_MAX_TEXT_BUFFER_LENGTH, chr(0) ) return tb #********************************************************** # Entity Path Helpers #********************************************************** def makeUnspecifiedSaHpiEntityPathT(): ep = SaHpiEntityPathT() ep.Entry = [] for i in range( 0, SAHPI_MAX_ENTITY_PATH ): e = SaHpiEntityT() e.EntityType = SAHPI_ENT_UNSPECIFIED e.EntityLocation = 0 ep.Entry.append( e ) return ep def makeRootSaHpiEntityPathT(): ep = makeUnspecifiedSaHpiEntityPathT() ep.Entry[0].EntityType = SAHPI_ENT_ROOT ep.Entry[0].EntityLocation = 0 return ep def cloneSaHpiEntityPathT( ep ): if ep is None: return None ep2 = makeUnspecifiedSaHpiEntityPathT() for i in range( 0, SAHPI_MAX_ENTITY_PATH ): ep2.Entry[i].EntityType = ep.Entry[i].EntityType ep2.Entry[i].EntityLocation = ep.Entry[i].EntityLocation return ep2 def getSaHpiEntityPathTLength( ep ): for i in range( 0, SAHPI_MAX_ENTITY_PATH ): if ep.Entry[i].EntityType == SAHPI_ENT_ROOT: if ep.Entry[i].EntityLocation == 0: return i return SAHPI_MAX_ENTITY_PATH def fromSaHpiEntityPathT( ep ): l = getSaHpiEntityPathTLength( ep ) x = [ ( ep.Entry[i].EntityType, ep.Entry[i].EntityLocation ) for i in range( 0, l ) ] x.reverse() return "".join( [ "{%s,%d}" % ( fromSaHpiEntityTypeT( et ), el ) for ( et, el ) in x ] ) def toSaHpiEntityPathT( s ): ep = makeRootSaHpiEntityPathT() if len( s ) == 0: return ep if s.index( "{" ) != 0: raise ValueError() parts = s.split("{")[1:] parts.reverse() i = 0 if len( parts ) > SAHPI_MAX_ENTITY_PATH: raise ValueError() for part in parts: if part[-1] != "}": raise ValueError() et_el = part[0:-1].split( "," ) if len( et_el ) != 2: raise ValueError() ep.Entry[i].EntityType = toSaHpiEntityTypeT( et_el[0] ) ep.Entry[i].EntityLocation = int( et_el[1] ) i = i + 1 if i < SAHPI_MAX_ENTITY_PATH: ep.Entry[i].EntityType = SAHPI_ENT_ROOT ep.Entry[i].EntityLocation = 0 return ep openhpi-3.6.1/baselibs/python/openhpi_baselib/HpiMarshalGen.py0000644000175100017510000022157412575647300023463 0ustar mohanmohan # -*- python -*- # # Copyright (C) 2012, Pigeon Point Systems # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # # Author(s): # Anton Pak # from openhpi_baselib.HpiDataTypes import * from openhpi_baselib.HpiMarshalCore import HpiMarshalCore #********************************************************** # HPI Marshal (auto-generated) #********************************************************** class HpiMarshalGen( HpiMarshalCore ): #********************************************************** # Marshal: For HPI Simple Data Types #********************************************************** def marshalSaHpiBoolT( self, x ): self.marshalSaHpiUint8T( x ) def marshalSaHpiManufacturerIdT( self, x ): self.marshalSaHpiUint32T( x ) def marshalSaHpiVersionT( self, x ): self.marshalSaHpiUint32T( x ) def marshalSaErrorT( self, x ): self.marshalSaHpiInt32T( x ) def marshalSaHpiDomainIdT( self, x ): self.marshalSaHpiUint32T( x ) def marshalSaHpiSessionIdT( self, x ): self.marshalSaHpiUint32T( x ) def marshalSaHpiResourceIdT( self, x ): self.marshalSaHpiUint32T( x ) def marshalSaHpiEntryIdT( self, x ): self.marshalSaHpiUint32T( x ) def marshalSaHpiTimeT( self, x ): self.marshalSaHpiInt64T( x ) def marshalSaHpiTimeoutT( self, x ): self.marshalSaHpiInt64T( x ) def marshalSaHpiInstrumentIdT( self, x ): self.marshalSaHpiUint32T( x ) def marshalSaHpiEntityLocationT( self, x ): self.marshalSaHpiUint32T( x ) def marshalSaHpiEventCategoryT( self, x ): self.marshalSaHpiUint8T( x ) def marshalSaHpiEventStateT( self, x ): self.marshalSaHpiUint16T( x ) def marshalSaHpiSensorNumT( self, x ): self.marshalSaHpiInstrumentIdT( x ) def marshalSaHpiSensorRangeFlagsT( self, x ): self.marshalSaHpiUint8T( x ) def marshalSaHpiSensorThdMaskT( self, x ): self.marshalSaHpiUint8T( x ) def marshalSaHpiCtrlNumT( self, x ): self.marshalSaHpiInstrumentIdT( x ) def marshalSaHpiCtrlStateDiscreteT( self, x ): self.marshalSaHpiUint32T( x ) def marshalSaHpiCtrlStateAnalogT( self, x ): self.marshalSaHpiInt32T( x ) def marshalSaHpiTxtLineNumT( self, x ): self.marshalSaHpiUint8T( x ) def marshalSaHpiIdrIdT( self, x ): self.marshalSaHpiInstrumentIdT( x ) def marshalSaHpiWatchdogNumT( self, x ): self.marshalSaHpiInstrumentIdT( x ) def marshalSaHpiWatchdogExpFlagsT( self, x ): self.marshalSaHpiUint8T( x ) def marshalSaHpiDimiNumT( self, x ): self.marshalSaHpiInstrumentIdT( x ) def marshalSaHpiDimiTestCapabilityT( self, x ): self.marshalSaHpiUint32T( x ) def marshalSaHpiDimiTestNumT( self, x ): self.marshalSaHpiUint32T( x ) def marshalSaHpiDimiTestPercentCompletedT( self, x ): self.marshalSaHpiUint8T( x ) def marshalSaHpiFumiNumT( self, x ): self.marshalSaHpiInstrumentIdT( x ) def marshalSaHpiBankNumT( self, x ): self.marshalSaHpiUint8T( x ) def marshalSaHpiFumiLogicalBankStateFlagsT( self, x ): self.marshalSaHpiUint32T( x ) def marshalSaHpiFumiProtocolT( self, x ): self.marshalSaHpiUint32T( x ) def marshalSaHpiFumiCapabilityT( self, x ): self.marshalSaHpiUint32T( x ) def marshalSaHpiSensorOptionalDataT( self, x ): self.marshalSaHpiUint8T( x ) def marshalSaHpiSensorEnableOptDataT( self, x ): self.marshalSaHpiUint8T( x ) def marshalSaHpiEvtQueueStatusT( self, x ): self.marshalSaHpiUint32T( x ) def marshalSaHpiAnnunciatorNumT( self, x ): self.marshalSaHpiInstrumentIdT( x ) def marshalSaHpiLoadNumberT( self, x ): self.marshalSaHpiUint32T( x ) def marshalSaHpiCapabilitiesT( self, x ): self.marshalSaHpiUint32T( x ) def marshalSaHpiHsCapabilitiesT( self, x ): self.marshalSaHpiUint32T( x ) def marshalSaHpiDomainCapabilitiesT( self, x ): self.marshalSaHpiUint32T( x ) def marshalSaHpiAlarmIdT( self, x ): self.marshalSaHpiEntryIdT( x ) def marshalSaHpiEventLogCapabilitiesT( self, x ): self.marshalSaHpiUint32T( x ) def marshalSaHpiEventLogEntryIdT( self, x ): self.marshalSaHpiUint32T( x ) def marshalSaHpiLanguageT( self, x ): self.marshalEnum( x ) def marshalSaHpiTextTypeT( self, x ): self.marshalEnum( x ) def marshalSaHpiEntityTypeT( self, x ): self.marshalEnum( x ) def marshalSaHpiSensorTypeT( self, x ): self.marshalEnum( x ) def marshalSaHpiSensorReadingTypeT( self, x ): self.marshalEnum( x ) def marshalSaHpiSensorEventMaskActionT( self, x ): self.marshalEnum( x ) def marshalSaHpiSensorUnitsT( self, x ): self.marshalEnum( x ) def marshalSaHpiSensorModUnitUseT( self, x ): self.marshalEnum( x ) def marshalSaHpiSensorEventCtrlT( self, x ): self.marshalEnum( x ) def marshalSaHpiCtrlTypeT( self, x ): self.marshalEnum( x ) def marshalSaHpiCtrlStateDigitalT( self, x ): self.marshalEnum( x ) def marshalSaHpiCtrlModeT( self, x ): self.marshalEnum( x ) def marshalSaHpiCtrlOutputTypeT( self, x ): self.marshalEnum( x ) def marshalSaHpiIdrAreaTypeT( self, x ): self.marshalEnum( x ) def marshalSaHpiIdrFieldTypeT( self, x ): self.marshalEnum( x ) def marshalSaHpiWatchdogActionT( self, x ): self.marshalEnum( x ) def marshalSaHpiWatchdogActionEventT( self, x ): self.marshalEnum( x ) def marshalSaHpiWatchdogPretimerInterruptT( self, x ): self.marshalEnum( x ) def marshalSaHpiWatchdogTimerUseT( self, x ): self.marshalEnum( x ) def marshalSaHpiDimiTestServiceImpactT( self, x ): self.marshalEnum( x ) def marshalSaHpiDimiTestRunStatusT( self, x ): self.marshalEnum( x ) def marshalSaHpiDimiTestErrCodeT( self, x ): self.marshalEnum( x ) def marshalSaHpiDimiTestParamTypeT( self, x ): self.marshalEnum( x ) def marshalSaHpiDimiReadyT( self, x ): self.marshalEnum( x ) def marshalSaHpiFumiSpecInfoTypeT( self, x ): self.marshalEnum( x ) def marshalSaHpiFumiSafDefinedSpecIdT( self, x ): self.marshalEnum( x ) def marshalSaHpiFumiServiceImpactT( self, x ): self.marshalEnum( x ) def marshalSaHpiFumiSourceStatusT( self, x ): self.marshalEnum( x ) def marshalSaHpiFumiBankStateT( self, x ): self.marshalEnum( x ) def marshalSaHpiFumiUpgradeStatusT( self, x ): self.marshalEnum( x ) def marshalSaHpiHsIndicatorStateT( self, x ): self.marshalEnum( x ) def marshalSaHpiHsActionT( self, x ): self.marshalEnum( x ) def marshalSaHpiHsStateT( self, x ): self.marshalEnum( x ) def marshalSaHpiHsCauseOfStateChangeT( self, x ): self.marshalEnum( x ) def marshalSaHpiSeverityT( self, x ): self.marshalEnum( x ) def marshalSaHpiResourceEventTypeT( self, x ): self.marshalEnum( x ) def marshalSaHpiDomainEventTypeT( self, x ): self.marshalEnum( x ) def marshalSaHpiSwEventTypeT( self, x ): self.marshalEnum( x ) def marshalSaHpiEventTypeT( self, x ): self.marshalEnum( x ) def marshalSaHpiStatusCondTypeT( self, x ): self.marshalEnum( x ) def marshalSaHpiAnnunciatorModeT( self, x ): self.marshalEnum( x ) def marshalSaHpiAnnunciatorTypeT( self, x ): self.marshalEnum( x ) def marshalSaHpiRdrTypeT( self, x ): self.marshalEnum( x ) def marshalSaHpiParmActionT( self, x ): self.marshalEnum( x ) def marshalSaHpiResetActionT( self, x ): self.marshalEnum( x ) def marshalSaHpiPowerStateT( self, x ): self.marshalEnum( x ) def marshalSaHpiEventLogOverflowActionT( self, x ): self.marshalEnum( x ) #********************************************************** # Marshal: For HPI Structs and Unions #********************************************************** def marshalSaHpiTextBufferT( self, x ): self.marshalSaHpiTextTypeT( x.DataType ) self.marshalSaHpiLanguageT( x.Language ) self.marshalSaHpiUint8T( x.DataLength ) self.marshalByteArray( x.Data, SAHPI_MAX_TEXT_BUFFER_LENGTH ) def marshalSaHpiEntityT( self, x ): self.marshalSaHpiEntityTypeT( x.EntityType ) self.marshalSaHpiEntityLocationT( x.EntityLocation ) def marshalSaHpiEntityPathT( self, x ): for i in range( 0, SAHPI_MAX_ENTITY_PATH ): self.marshalSaHpiEntityT( x.Entry[i] ) def marshalSaHpiSensorReadingUnionT( self, x, mod ): if mod == SAHPI_SENSOR_READING_TYPE_INT64: self.marshalSaHpiInt64T( x.SensorInt64 ) if mod == SAHPI_SENSOR_READING_TYPE_UINT64: self.marshalSaHpiUint64T( x.SensorUint64 ) if mod == SAHPI_SENSOR_READING_TYPE_FLOAT64: self.marshalSaHpiFloat64T( x.SensorFloat64 ) if mod == SAHPI_SENSOR_READING_TYPE_BUFFER: self.marshalByteArray( x.SensorBuffer, SAHPI_SENSOR_BUFFER_LENGTH ) def marshalSaHpiSensorReadingT( self, x ): self.marshalSaHpiBoolT( x.IsSupported ) self.marshalSaHpiSensorReadingTypeT( x.Type ) self.marshalSaHpiSensorReadingUnionT( x.Value, x.Type ) def marshalSaHpiSensorThresholdsT( self, x ): self.marshalSaHpiSensorReadingT( x.LowCritical ) self.marshalSaHpiSensorReadingT( x.LowMajor ) self.marshalSaHpiSensorReadingT( x.LowMinor ) self.marshalSaHpiSensorReadingT( x.UpCritical ) self.marshalSaHpiSensorReadingT( x.UpMajor ) self.marshalSaHpiSensorReadingT( x.UpMinor ) self.marshalSaHpiSensorReadingT( x.PosThdHysteresis ) self.marshalSaHpiSensorReadingT( x.NegThdHysteresis ) def marshalSaHpiSensorRangeT( self, x ): self.marshalSaHpiSensorRangeFlagsT( x.Flags ) self.marshalSaHpiSensorReadingT( x.Max ) self.marshalSaHpiSensorReadingT( x.Min ) self.marshalSaHpiSensorReadingT( x.Nominal ) self.marshalSaHpiSensorReadingT( x.NormalMax ) self.marshalSaHpiSensorReadingT( x.NormalMin ) def marshalSaHpiSensorDataFormatT( self, x ): self.marshalSaHpiBoolT( x.IsSupported ) self.marshalSaHpiSensorReadingTypeT( x.ReadingType ) self.marshalSaHpiSensorUnitsT( x.BaseUnits ) self.marshalSaHpiSensorUnitsT( x.ModifierUnits ) self.marshalSaHpiSensorModUnitUseT( x.ModifierUse ) self.marshalSaHpiBoolT( x.Percentage ) self.marshalSaHpiSensorRangeT( x.Range ) self.marshalSaHpiFloat64T( x.AccuracyFactor ) def marshalSaHpiSensorThdDefnT( self, x ): self.marshalSaHpiBoolT( x.IsAccessible ) self.marshalSaHpiSensorThdMaskT( x.ReadThold ) self.marshalSaHpiSensorThdMaskT( x.WriteThold ) self.marshalSaHpiBoolT( x.Nonlinear ) def marshalSaHpiSensorRecT( self, x ): self.marshalSaHpiSensorNumT( x.Num ) self.marshalSaHpiSensorTypeT( x.Type ) self.marshalSaHpiEventCategoryT( x.Category ) self.marshalSaHpiBoolT( x.EnableCtrl ) self.marshalSaHpiSensorEventCtrlT( x.EventCtrl ) self.marshalSaHpiEventStateT( x.Events ) self.marshalSaHpiSensorDataFormatT( x.DataFormat ) self.marshalSaHpiSensorThdDefnT( x.ThresholdDefn ) self.marshalSaHpiUint32T( x.Oem ) def marshalSaHpiCtrlStateStreamT( self, x ): self.marshalSaHpiBoolT( x.Repeat ) self.marshalSaHpiUint32T( x.StreamLength ) self.marshalByteArray( x.Stream, SAHPI_CTRL_MAX_STREAM_LENGTH ) def marshalSaHpiCtrlStateTextT( self, x ): self.marshalSaHpiTxtLineNumT( x.Line ) self.marshalSaHpiTextBufferT( x.Text ) def marshalSaHpiCtrlStateOemT( self, x ): self.marshalSaHpiManufacturerIdT( x.MId ) self.marshalSaHpiUint8T( x.BodyLength ) self.marshalByteArray( x.Body, SAHPI_CTRL_MAX_OEM_BODY_LENGTH ) def marshalSaHpiCtrlStateUnionT( self, x, mod ): if mod == SAHPI_CTRL_TYPE_DIGITAL: self.marshalSaHpiCtrlStateDigitalT( x.Digital ) if mod == SAHPI_CTRL_TYPE_DISCRETE: self.marshalSaHpiCtrlStateDiscreteT( x.Discrete ) if mod == SAHPI_CTRL_TYPE_ANALOG: self.marshalSaHpiCtrlStateAnalogT( x.Analog ) if mod == SAHPI_CTRL_TYPE_STREAM: self.marshalSaHpiCtrlStateStreamT( x.Stream ) if mod == SAHPI_CTRL_TYPE_TEXT: self.marshalSaHpiCtrlStateTextT( x.Text ) if mod == SAHPI_CTRL_TYPE_OEM: self.marshalSaHpiCtrlStateOemT( x.Oem ) def marshalSaHpiCtrlStateT( self, x ): self.marshalSaHpiCtrlTypeT( x.Type ) self.marshalSaHpiCtrlStateUnionT( x.StateUnion, x.Type ) def marshalSaHpiCtrlRecDigitalT( self, x ): self.marshalSaHpiCtrlStateDigitalT( x.Default ) def marshalSaHpiCtrlRecDiscreteT( self, x ): self.marshalSaHpiCtrlStateDiscreteT( x.Default ) def marshalSaHpiCtrlRecAnalogT( self, x ): self.marshalSaHpiCtrlStateAnalogT( x.Min ) self.marshalSaHpiCtrlStateAnalogT( x.Max ) self.marshalSaHpiCtrlStateAnalogT( x.Default ) def marshalSaHpiCtrlRecStreamT( self, x ): self.marshalSaHpiCtrlStateStreamT( x.Default ) def marshalSaHpiCtrlRecTextT( self, x ): self.marshalSaHpiUint8T( x.MaxChars ) self.marshalSaHpiUint8T( x.MaxLines ) self.marshalSaHpiLanguageT( x.Language ) self.marshalSaHpiTextTypeT( x.DataType ) self.marshalSaHpiCtrlStateTextT( x.Default ) def marshalSaHpiCtrlRecOemT( self, x ): self.marshalSaHpiManufacturerIdT( x.MId ) self.marshalByteArray( x.ConfigData, SAHPI_CTRL_OEM_CONFIG_LENGTH ) self.marshalSaHpiCtrlStateOemT( x.Default ) def marshalSaHpiCtrlRecUnionT( self, x, mod ): if mod == SAHPI_CTRL_TYPE_DIGITAL: self.marshalSaHpiCtrlRecDigitalT( x.Digital ) if mod == SAHPI_CTRL_TYPE_DISCRETE: self.marshalSaHpiCtrlRecDiscreteT( x.Discrete ) if mod == SAHPI_CTRL_TYPE_ANALOG: self.marshalSaHpiCtrlRecAnalogT( x.Analog ) if mod == SAHPI_CTRL_TYPE_STREAM: self.marshalSaHpiCtrlRecStreamT( x.Stream ) if mod == SAHPI_CTRL_TYPE_TEXT: self.marshalSaHpiCtrlRecTextT( x.Text ) if mod == SAHPI_CTRL_TYPE_OEM: self.marshalSaHpiCtrlRecOemT( x.Oem ) def marshalSaHpiCtrlDefaultModeT( self, x ): self.marshalSaHpiCtrlModeT( x.Mode ) self.marshalSaHpiBoolT( x.ReadOnly ) def marshalSaHpiCtrlRecT( self, x ): self.marshalSaHpiCtrlNumT( x.Num ) self.marshalSaHpiCtrlOutputTypeT( x.OutputType ) self.marshalSaHpiCtrlTypeT( x.Type ) self.marshalSaHpiCtrlRecUnionT( x.TypeUnion, x.Type ) self.marshalSaHpiCtrlDefaultModeT( x.DefaultMode ) self.marshalSaHpiBoolT( x.WriteOnly ) self.marshalSaHpiUint32T( x.Oem ) def marshalSaHpiIdrFieldT( self, x ): self.marshalSaHpiEntryIdT( x.AreaId ) self.marshalSaHpiEntryIdT( x.FieldId ) self.marshalSaHpiIdrFieldTypeT( x.Type ) self.marshalSaHpiBoolT( x.ReadOnly ) self.marshalSaHpiTextBufferT( x.Field ) def marshalSaHpiIdrAreaHeaderT( self, x ): self.marshalSaHpiEntryIdT( x.AreaId ) self.marshalSaHpiIdrAreaTypeT( x.Type ) self.marshalSaHpiBoolT( x.ReadOnly ) self.marshalSaHpiUint32T( x.NumFields ) def marshalSaHpiIdrInfoT( self, x ): self.marshalSaHpiIdrIdT( x.IdrId ) self.marshalSaHpiUint32T( x.UpdateCount ) self.marshalSaHpiBoolT( x.ReadOnly ) self.marshalSaHpiUint32T( x.NumAreas ) def marshalSaHpiInventoryRecT( self, x ): self.marshalSaHpiIdrIdT( x.IdrId ) self.marshalSaHpiBoolT( x.Persistent ) self.marshalSaHpiUint32T( x.Oem ) def marshalSaHpiWatchdogT( self, x ): self.marshalSaHpiBoolT( x.Log ) self.marshalSaHpiBoolT( x.Running ) self.marshalSaHpiWatchdogTimerUseT( x.TimerUse ) self.marshalSaHpiWatchdogActionT( x.TimerAction ) self.marshalSaHpiWatchdogPretimerInterruptT( x.PretimerInterrupt ) self.marshalSaHpiUint32T( x.PreTimeoutInterval ) self.marshalSaHpiWatchdogExpFlagsT( x.TimerUseExpFlags ) self.marshalSaHpiUint32T( x.InitialCount ) self.marshalSaHpiUint32T( x.PresentCount ) def marshalSaHpiWatchdogRecT( self, x ): self.marshalSaHpiWatchdogNumT( x.WatchdogNum ) self.marshalSaHpiUint32T( x.Oem ) def marshalSaHpiDimiTestAffectedEntityT( self, x ): self.marshalSaHpiEntityPathT( x.EntityImpacted ) self.marshalSaHpiDimiTestServiceImpactT( x.ServiceImpact ) def marshalSaHpiDimiTestResultsT( self, x ): self.marshalSaHpiTimeT( x.ResultTimeStamp ) self.marshalSaHpiTimeoutT( x.RunDuration ) self.marshalSaHpiDimiTestRunStatusT( x.LastRunStatus ) self.marshalSaHpiDimiTestErrCodeT( x.TestErrorCode ) self.marshalSaHpiTextBufferT( x.TestResultString ) self.marshalSaHpiBoolT( x.TestResultStringIsURI ) def marshalSaHpiDimiTestParamValueT( self, x, mod ): if mod == SAHPI_DIMITEST_PARAM_TYPE_INT32: self.marshalSaHpiInt32T( x.paramint ) if mod == SAHPI_DIMITEST_PARAM_TYPE_BOOLEAN: self.marshalSaHpiBoolT( x.parambool ) if mod == SAHPI_DIMITEST_PARAM_TYPE_FLOAT64: self.marshalSaHpiFloat64T( x.paramfloat ) if mod == SAHPI_DIMITEST_PARAM_TYPE_TEXT: self.marshalSaHpiTextBufferT( x.paramtext ) def marshalSaHpiDimiTestParameterValueUnionT( self, x, mod ): if mod == SAHPI_DIMITEST_PARAM_TYPE_INT32: self.marshalSaHpiInt32T( x.IntValue ) if mod == SAHPI_DIMITEST_PARAM_TYPE_FLOAT64: self.marshalSaHpiFloat64T( x.FloatValue ) if mod == SAHPI_DIMITEST_PARAM_TYPE_BOOLEAN: self.marshalSaHpiFloat64T( x.FloatValue ) if mod == SAHPI_DIMITEST_PARAM_TYPE_TEXT: self.marshalSaHpiFloat64T( x.FloatValue ) def marshalSaHpiDimiTestParamsDefinitionT( self, x ): self.marshalByteArray( x.ParamName, SAHPI_DIMITEST_PARAM_NAME_LEN ) self.marshalSaHpiTextBufferT( x.ParamInfo ) self.marshalSaHpiDimiTestParamTypeT( x.ParamType ) self.marshalSaHpiDimiTestParameterValueUnionT( x.MinValue, x.ParamType ) self.marshalSaHpiDimiTestParameterValueUnionT( x.MaxValue, x.ParamType ) self.marshalSaHpiDimiTestParamValueT( x.DefaultParam, x.ParamType ) def marshalSaHpiDimiTestT( self, x ): self.marshalSaHpiTextBufferT( x.TestName ) self.marshalSaHpiDimiTestServiceImpactT( x.ServiceImpact ) for i in range( 0, SAHPI_DIMITEST_MAX_ENTITIESIMPACTED ): self.marshalSaHpiDimiTestAffectedEntityT( x.EntitiesImpacted[i] ) self.marshalSaHpiBoolT( x.NeedServiceOS ) self.marshalSaHpiTextBufferT( x.ServiceOS ) self.marshalSaHpiTimeT( x.ExpectedRunDuration ) self.marshalSaHpiDimiTestCapabilityT( x.TestCapabilities ) for i in range( 0, SAHPI_DIMITEST_MAX_PARAMETERS ): self.marshalSaHpiDimiTestParamsDefinitionT( x.TestParameters[i] ) def marshalSaHpiDimiTestVariableParamsT( self, x ): self.marshalByteArray( x.ParamName, SAHPI_DIMITEST_PARAM_NAME_LEN ) self.marshalSaHpiDimiTestParamTypeT( x.ParamType ) self.marshalSaHpiDimiTestParamValueT( x.Value, x.ParamType ) def marshalSaHpiDimiInfoT( self, x ): self.marshalSaHpiUint32T( x.NumberOfTests ) self.marshalSaHpiUint32T( x.TestNumUpdateCounter ) def marshalSaHpiDimiRecT( self, x ): self.marshalSaHpiDimiNumT( x.DimiNum ) self.marshalSaHpiUint32T( x.Oem ) def marshalSaHpiFumiSafDefinedSpecInfoT( self, x ): self.marshalSaHpiFumiSafDefinedSpecIdT( x.SpecID ) self.marshalSaHpiUint32T( x.RevisionID ) def marshalSaHpiFumiOemDefinedSpecInfoT( self, x ): self.marshalSaHpiManufacturerIdT( x.Mid ) self.marshalSaHpiUint8T( x.BodyLength ) self.marshalByteArray( x.Body, SAHPI_FUMI_MAX_OEM_BODY_LENGTH ) def marshalSaHpiFumiSpecInfoTypeUnionT( self, x, mod ): if mod == SAHPI_FUMI_SPEC_INFO_SAF_DEFINED: self.marshalSaHpiFumiSafDefinedSpecInfoT( x.SafDefined ) if mod == SAHPI_FUMI_SPEC_INFO_OEM_DEFINED: self.marshalSaHpiFumiOemDefinedSpecInfoT( x.OemDefined ) def marshalSaHpiFumiSpecInfoT( self, x ): self.marshalSaHpiFumiSpecInfoTypeT( x.SpecInfoType ) self.marshalSaHpiFumiSpecInfoTypeUnionT( x.SpecInfoTypeUnion, x.SpecInfoType ) def marshalSaHpiFumiFirmwareInstanceInfoT( self, x ): self.marshalSaHpiBoolT( x.InstancePresent ) self.marshalSaHpiTextBufferT( x.Identifier ) self.marshalSaHpiTextBufferT( x.Description ) self.marshalSaHpiTextBufferT( x.DateTime ) self.marshalSaHpiUint32T( x.MajorVersion ) self.marshalSaHpiUint32T( x.MinorVersion ) self.marshalSaHpiUint32T( x.AuxVersion ) def marshalSaHpiFumiImpactedEntityT( self, x ): self.marshalSaHpiEntityPathT( x.ImpactedEntity ) self.marshalSaHpiFumiServiceImpactT( x.ServiceImpact ) def marshalSaHpiFumiServiceImpactDataT( self, x ): self.marshalSaHpiUint32T( x.NumEntities ) for i in range( 0, SAHPI_FUMI_MAX_ENTITIES_IMPACTED ): self.marshalSaHpiFumiImpactedEntityT( x.ImpactedEntities[i] ) def marshalSaHpiFumiSourceInfoT( self, x ): self.marshalSaHpiTextBufferT( x.SourceUri ) self.marshalSaHpiFumiSourceStatusT( x.SourceStatus ) self.marshalSaHpiTextBufferT( x.Identifier ) self.marshalSaHpiTextBufferT( x.Description ) self.marshalSaHpiTextBufferT( x.DateTime ) self.marshalSaHpiUint32T( x.MajorVersion ) self.marshalSaHpiUint32T( x.MinorVersion ) self.marshalSaHpiUint32T( x.AuxVersion ) def marshalSaHpiFumiComponentInfoT( self, x ): self.marshalSaHpiEntryIdT( x.EntryId ) self.marshalSaHpiUint32T( x.ComponentId ) self.marshalSaHpiFumiFirmwareInstanceInfoT( x.MainFwInstance ) self.marshalSaHpiUint32T( x.ComponentFlags ) def marshalSaHpiFumiBankInfoT( self, x ): self.marshalSaHpiUint8T( x.BankId ) self.marshalSaHpiUint32T( x.BankSize ) self.marshalSaHpiUint32T( x.Position ) self.marshalSaHpiFumiBankStateT( x.BankState ) self.marshalSaHpiTextBufferT( x.Identifier ) self.marshalSaHpiTextBufferT( x.Description ) self.marshalSaHpiTextBufferT( x.DateTime ) self.marshalSaHpiUint32T( x.MajorVersion ) self.marshalSaHpiUint32T( x.MinorVersion ) self.marshalSaHpiUint32T( x.AuxVersion ) def marshalSaHpiFumiLogicalBankInfoT( self, x ): self.marshalSaHpiUint8T( x.FirmwarePersistentLocationCount ) self.marshalSaHpiFumiLogicalBankStateFlagsT( x.BankStateFlags ) self.marshalSaHpiFumiFirmwareInstanceInfoT( x.PendingFwInstance ) self.marshalSaHpiFumiFirmwareInstanceInfoT( x.RollbackFwInstance ) def marshalSaHpiFumiLogicalComponentInfoT( self, x ): self.marshalSaHpiEntryIdT( x.EntryId ) self.marshalSaHpiUint32T( x.ComponentId ) self.marshalSaHpiFumiFirmwareInstanceInfoT( x.PendingFwInstance ) self.marshalSaHpiFumiFirmwareInstanceInfoT( x.RollbackFwInstance ) self.marshalSaHpiUint32T( x.ComponentFlags ) def marshalSaHpiFumiRecT( self, x ): self.marshalSaHpiFumiNumT( x.Num ) self.marshalSaHpiFumiProtocolT( x.AccessProt ) self.marshalSaHpiFumiCapabilityT( x.Capability ) self.marshalSaHpiUint8T( x.NumBanks ) self.marshalSaHpiUint32T( x.Oem ) def marshalSaHpiResourceEventT( self, x ): self.marshalSaHpiResourceEventTypeT( x.ResourceEventType ) def marshalSaHpiDomainEventT( self, x ): self.marshalSaHpiDomainEventTypeT( x.Type ) self.marshalSaHpiDomainIdT( x.DomainId ) def marshalSaHpiSensorEventT( self, x ): self.marshalSaHpiSensorNumT( x.SensorNum ) self.marshalSaHpiSensorTypeT( x.SensorType ) self.marshalSaHpiEventCategoryT( x.EventCategory ) self.marshalSaHpiBoolT( x.Assertion ) self.marshalSaHpiEventStateT( x.EventState ) self.marshalSaHpiSensorOptionalDataT( x.OptionalDataPresent ) self.marshalSaHpiSensorReadingT( x.TriggerReading ) self.marshalSaHpiSensorReadingT( x.TriggerThreshold ) self.marshalSaHpiEventStateT( x.PreviousState ) self.marshalSaHpiEventStateT( x.CurrentState ) self.marshalSaHpiUint32T( x.Oem ) self.marshalSaHpiUint32T( x.SensorSpecific ) def marshalSaHpiSensorEnableChangeEventT( self, x ): self.marshalSaHpiSensorNumT( x.SensorNum ) self.marshalSaHpiSensorTypeT( x.SensorType ) self.marshalSaHpiEventCategoryT( x.EventCategory ) self.marshalSaHpiBoolT( x.SensorEnable ) self.marshalSaHpiBoolT( x.SensorEventEnable ) self.marshalSaHpiEventStateT( x.AssertEventMask ) self.marshalSaHpiEventStateT( x.DeassertEventMask ) self.marshalSaHpiSensorEnableOptDataT( x.OptionalDataPresent ) self.marshalSaHpiEventStateT( x.CurrentState ) self.marshalSaHpiEventStateT( x.CriticalAlarms ) self.marshalSaHpiEventStateT( x.MajorAlarms ) self.marshalSaHpiEventStateT( x.MinorAlarms ) def marshalSaHpiHotSwapEventT( self, x ): self.marshalSaHpiHsStateT( x.HotSwapState ) self.marshalSaHpiHsStateT( x.PreviousHotSwapState ) self.marshalSaHpiHsCauseOfStateChangeT( x.CauseOfStateChange ) def marshalSaHpiWatchdogEventT( self, x ): self.marshalSaHpiWatchdogNumT( x.WatchdogNum ) self.marshalSaHpiWatchdogActionEventT( x.WatchdogAction ) self.marshalSaHpiWatchdogPretimerInterruptT( x.WatchdogPreTimerAction ) self.marshalSaHpiWatchdogTimerUseT( x.WatchdogUse ) def marshalSaHpiHpiSwEventT( self, x ): self.marshalSaHpiManufacturerIdT( x.MId ) self.marshalSaHpiSwEventTypeT( x.Type ) self.marshalSaHpiTextBufferT( x.EventData ) def marshalSaHpiOemEventT( self, x ): self.marshalSaHpiManufacturerIdT( x.MId ) self.marshalSaHpiTextBufferT( x.OemEventData ) def marshalSaHpiUserEventT( self, x ): self.marshalSaHpiTextBufferT( x.UserEventData ) def marshalSaHpiDimiEventT( self, x ): self.marshalSaHpiDimiNumT( x.DimiNum ) self.marshalSaHpiDimiTestNumT( x.TestNum ) self.marshalSaHpiDimiTestRunStatusT( x.DimiTestRunStatus ) self.marshalSaHpiDimiTestPercentCompletedT( x.DimiTestPercentCompleted ) def marshalSaHpiDimiUpdateEventT( self, x ): self.marshalSaHpiDimiNumT( x.DimiNum ) def marshalSaHpiFumiEventT( self, x ): self.marshalSaHpiFumiNumT( x.FumiNum ) self.marshalSaHpiUint8T( x.BankNum ) self.marshalSaHpiFumiUpgradeStatusT( x.UpgradeStatus ) def marshalSaHpiEventUnionT( self, x, mod ): if mod == SAHPI_ET_RESOURCE: self.marshalSaHpiResourceEventT( x.ResourceEvent ) if mod == SAHPI_ET_DOMAIN: self.marshalSaHpiDomainEventT( x.DomainEvent ) if mod == SAHPI_ET_SENSOR: self.marshalSaHpiSensorEventT( x.SensorEvent ) if mod == SAHPI_ET_SENSOR_ENABLE_CHANGE: self.marshalSaHpiSensorEnableChangeEventT( x.SensorEnableChangeEvent ) if mod == SAHPI_ET_HOTSWAP: self.marshalSaHpiHotSwapEventT( x.HotSwapEvent ) if mod == SAHPI_ET_WATCHDOG: self.marshalSaHpiWatchdogEventT( x.WatchdogEvent ) if mod == SAHPI_ET_HPI_SW: self.marshalSaHpiHpiSwEventT( x.HpiSwEvent ) if mod == SAHPI_ET_OEM: self.marshalSaHpiOemEventT( x.OemEvent ) if mod == SAHPI_ET_USER: self.marshalSaHpiUserEventT( x.UserEvent ) if mod == SAHPI_ET_DIMI: self.marshalSaHpiDimiEventT( x.DimiEvent ) if mod == SAHPI_ET_DIMI_UPDATE: self.marshalSaHpiDimiUpdateEventT( x.DimiUpdateEvent ) if mod == SAHPI_ET_FUMI: self.marshalSaHpiFumiEventT( x.FumiEvent ) def marshalSaHpiEventT( self, x ): self.marshalSaHpiResourceIdT( x.Source ) self.marshalSaHpiEventTypeT( x.EventType ) self.marshalSaHpiTimeT( x.Timestamp ) self.marshalSaHpiSeverityT( x.Severity ) self.marshalSaHpiEventUnionT( x.EventDataUnion, x.EventType ) def marshalSaHpiNameT( self, x ): self.marshalSaHpiUint16T( x.Length ) self.marshalByteArray( x.Value, SA_HPI_MAX_NAME_LENGTH ) def marshalSaHpiConditionT( self, x ): self.marshalSaHpiStatusCondTypeT( x.Type ) self.marshalSaHpiEntityPathT( x.Entity ) self.marshalSaHpiDomainIdT( x.DomainId ) self.marshalSaHpiResourceIdT( x.ResourceId ) self.marshalSaHpiSensorNumT( x.SensorNum ) self.marshalSaHpiEventStateT( x.EventState ) self.marshalSaHpiNameT( x.Name ) self.marshalSaHpiManufacturerIdT( x.Mid ) self.marshalSaHpiTextBufferT( x.Data ) def marshalSaHpiAnnouncementT( self, x ): self.marshalSaHpiEntryIdT( x.EntryId ) self.marshalSaHpiTimeT( x.Timestamp ) self.marshalSaHpiBoolT( x.AddedByUser ) self.marshalSaHpiSeverityT( x.Severity ) self.marshalSaHpiBoolT( x.Acknowledged ) self.marshalSaHpiConditionT( x.StatusCond ) def marshalSaHpiAnnunciatorRecT( self, x ): self.marshalSaHpiAnnunciatorNumT( x.AnnunciatorNum ) self.marshalSaHpiAnnunciatorTypeT( x.AnnunciatorType ) self.marshalSaHpiBoolT( x.ModeReadOnly ) self.marshalSaHpiUint32T( x.MaxConditions ) self.marshalSaHpiUint32T( x.Oem ) def marshalSaHpiRdrTypeUnionT( self, x, mod ): if mod == SAHPI_CTRL_RDR: self.marshalSaHpiCtrlRecT( x.CtrlRec ) if mod == SAHPI_SENSOR_RDR: self.marshalSaHpiSensorRecT( x.SensorRec ) if mod == SAHPI_INVENTORY_RDR: self.marshalSaHpiInventoryRecT( x.InventoryRec ) if mod == SAHPI_WATCHDOG_RDR: self.marshalSaHpiWatchdogRecT( x.WatchdogRec ) if mod == SAHPI_ANNUNCIATOR_RDR: self.marshalSaHpiAnnunciatorRecT( x.AnnunciatorRec ) if mod == SAHPI_DIMI_RDR: self.marshalSaHpiDimiRecT( x.DimiRec ) if mod == SAHPI_FUMI_RDR: self.marshalSaHpiFumiRecT( x.FumiRec ) def marshalSaHpiRdrT( self, x ): self.marshalSaHpiEntryIdT( x.RecordId ) self.marshalSaHpiRdrTypeT( x.RdrType ) self.marshalSaHpiEntityPathT( x.Entity ) self.marshalSaHpiBoolT( x.IsFru ) self.marshalSaHpiRdrTypeUnionT( x.RdrTypeUnion, x.RdrType ) self.marshalSaHpiTextBufferT( x.IdString ) def marshalSaHpiLoadIdT( self, x ): self.marshalSaHpiLoadNumberT( x.LoadNumber ) self.marshalSaHpiTextBufferT( x.LoadName ) def marshalSaHpiResourceInfoT( self, x ): self.marshalSaHpiUint8T( x.ResourceRev ) self.marshalSaHpiUint8T( x.SpecificVer ) self.marshalSaHpiUint8T( x.DeviceSupport ) self.marshalSaHpiManufacturerIdT( x.ManufacturerId ) self.marshalSaHpiUint16T( x.ProductId ) self.marshalSaHpiUint8T( x.FirmwareMajorRev ) self.marshalSaHpiUint8T( x.FirmwareMinorRev ) self.marshalSaHpiUint8T( x.AuxFirmwareRev ) self.marshalByteArray( x.Guid, SAHPI_GUID_LENGTH ) def marshalSaHpiRptEntryT( self, x ): self.marshalSaHpiEntryIdT( x.EntryId ) self.marshalSaHpiResourceIdT( x.ResourceId ) self.marshalSaHpiResourceInfoT( x.ResourceInfo ) self.marshalSaHpiEntityPathT( x.ResourceEntity ) self.marshalSaHpiCapabilitiesT( x.ResourceCapabilities ) self.marshalSaHpiHsCapabilitiesT( x.HotSwapCapabilities ) self.marshalSaHpiSeverityT( x.ResourceSeverity ) self.marshalSaHpiBoolT( x.ResourceFailed ) self.marshalSaHpiTextBufferT( x.ResourceTag ) def marshalSaHpiDomainInfoT( self, x ): self.marshalSaHpiDomainIdT( x.DomainId ) self.marshalSaHpiDomainCapabilitiesT( x.DomainCapabilities ) self.marshalSaHpiBoolT( x.IsPeer ) self.marshalSaHpiTextBufferT( x.DomainTag ) self.marshalSaHpiUint32T( x.DrtUpdateCount ) self.marshalSaHpiTimeT( x.DrtUpdateTimestamp ) self.marshalSaHpiUint32T( x.RptUpdateCount ) self.marshalSaHpiTimeT( x.RptUpdateTimestamp ) self.marshalSaHpiUint32T( x.DatUpdateCount ) self.marshalSaHpiTimeT( x.DatUpdateTimestamp ) self.marshalSaHpiUint32T( x.ActiveAlarms ) self.marshalSaHpiUint32T( x.CriticalAlarms ) self.marshalSaHpiUint32T( x.MajorAlarms ) self.marshalSaHpiUint32T( x.MinorAlarms ) self.marshalSaHpiUint32T( x.DatUserAlarmLimit ) self.marshalSaHpiBoolT( x.DatOverflow ) self.marshalByteArray( x.Guid, SAHPI_GUID_LENGTH ) def marshalSaHpiDrtEntryT( self, x ): self.marshalSaHpiEntryIdT( x.EntryId ) self.marshalSaHpiDomainIdT( x.DomainId ) self.marshalSaHpiBoolT( x.IsPeer ) def marshalSaHpiAlarmT( self, x ): self.marshalSaHpiAlarmIdT( x.AlarmId ) self.marshalSaHpiTimeT( x.Timestamp ) self.marshalSaHpiSeverityT( x.Severity ) self.marshalSaHpiBoolT( x.Acknowledged ) self.marshalSaHpiConditionT( x.AlarmCond ) def marshalSaHpiEventLogInfoT( self, x ): self.marshalSaHpiUint32T( x.Entries ) self.marshalSaHpiUint32T( x.Size ) self.marshalSaHpiUint32T( x.UserEventMaxSize ) self.marshalSaHpiTimeT( x.UpdateTimestamp ) self.marshalSaHpiTimeT( x.CurrentTime ) self.marshalSaHpiBoolT( x.Enabled ) self.marshalSaHpiBoolT( x.OverflowFlag ) self.marshalSaHpiBoolT( x.OverflowResetable ) self.marshalSaHpiEventLogOverflowActionT( x.OverflowAction ) def marshalSaHpiEventLogEntryT( self, x ): self.marshalSaHpiEventLogEntryIdT( x.EntryId ) self.marshalSaHpiTimeT( x.Timestamp ) self.marshalSaHpiEventT( x.Event ) #********************************************************** # Demarshal: For HPI Simple Data Types #********************************************************** def demarshalSaHpiBoolT( self ): return self.demarshalSaHpiUint8T() def demarshalSaHpiManufacturerIdT( self ): return self.demarshalSaHpiUint32T() def demarshalSaHpiVersionT( self ): return self.demarshalSaHpiUint32T() def demarshalSaErrorT( self ): return self.demarshalSaHpiInt32T() def demarshalSaHpiDomainIdT( self ): return self.demarshalSaHpiUint32T() def demarshalSaHpiSessionIdT( self ): return self.demarshalSaHpiUint32T() def demarshalSaHpiResourceIdT( self ): return self.demarshalSaHpiUint32T() def demarshalSaHpiEntryIdT( self ): return self.demarshalSaHpiUint32T() def demarshalSaHpiTimeT( self ): return self.demarshalSaHpiInt64T() def demarshalSaHpiTimeoutT( self ): return self.demarshalSaHpiInt64T() def demarshalSaHpiInstrumentIdT( self ): return self.demarshalSaHpiUint32T() def demarshalSaHpiEntityLocationT( self ): return self.demarshalSaHpiUint32T() def demarshalSaHpiEventCategoryT( self ): return self.demarshalSaHpiUint8T() def demarshalSaHpiEventStateT( self ): return self.demarshalSaHpiUint16T() def demarshalSaHpiSensorNumT( self ): return self.demarshalSaHpiInstrumentIdT() def demarshalSaHpiSensorRangeFlagsT( self ): return self.demarshalSaHpiUint8T() def demarshalSaHpiSensorThdMaskT( self ): return self.demarshalSaHpiUint8T() def demarshalSaHpiCtrlNumT( self ): return self.demarshalSaHpiInstrumentIdT() def demarshalSaHpiCtrlStateDiscreteT( self ): return self.demarshalSaHpiUint32T() def demarshalSaHpiCtrlStateAnalogT( self ): return self.demarshalSaHpiInt32T() def demarshalSaHpiTxtLineNumT( self ): return self.demarshalSaHpiUint8T() def demarshalSaHpiIdrIdT( self ): return self.demarshalSaHpiInstrumentIdT() def demarshalSaHpiWatchdogNumT( self ): return self.demarshalSaHpiInstrumentIdT() def demarshalSaHpiWatchdogExpFlagsT( self ): return self.demarshalSaHpiUint8T() def demarshalSaHpiDimiNumT( self ): return self.demarshalSaHpiInstrumentIdT() def demarshalSaHpiDimiTestCapabilityT( self ): return self.demarshalSaHpiUint32T() def demarshalSaHpiDimiTestNumT( self ): return self.demarshalSaHpiUint32T() def demarshalSaHpiDimiTestPercentCompletedT( self ): return self.demarshalSaHpiUint8T() def demarshalSaHpiFumiNumT( self ): return self.demarshalSaHpiInstrumentIdT() def demarshalSaHpiBankNumT( self ): return self.demarshalSaHpiUint8T() def demarshalSaHpiFumiLogicalBankStateFlagsT( self ): return self.demarshalSaHpiUint32T() def demarshalSaHpiFumiProtocolT( self ): return self.demarshalSaHpiUint32T() def demarshalSaHpiFumiCapabilityT( self ): return self.demarshalSaHpiUint32T() def demarshalSaHpiSensorOptionalDataT( self ): return self.demarshalSaHpiUint8T() def demarshalSaHpiSensorEnableOptDataT( self ): return self.demarshalSaHpiUint8T() def demarshalSaHpiEvtQueueStatusT( self ): return self.demarshalSaHpiUint32T() def demarshalSaHpiAnnunciatorNumT( self ): return self.demarshalSaHpiInstrumentIdT() def demarshalSaHpiLoadNumberT( self ): return self.demarshalSaHpiUint32T() def demarshalSaHpiCapabilitiesT( self ): return self.demarshalSaHpiUint32T() def demarshalSaHpiHsCapabilitiesT( self ): return self.demarshalSaHpiUint32T() def demarshalSaHpiDomainCapabilitiesT( self ): return self.demarshalSaHpiUint32T() def demarshalSaHpiAlarmIdT( self ): return self.demarshalSaHpiEntryIdT() def demarshalSaHpiEventLogCapabilitiesT( self ): return self.demarshalSaHpiUint32T() def demarshalSaHpiEventLogEntryIdT( self ): return self.demarshalSaHpiUint32T() def demarshalSaHpiLanguageT( self ): return self.demarshalEnum() def demarshalSaHpiTextTypeT( self ): return self.demarshalEnum() def demarshalSaHpiEntityTypeT( self ): return self.demarshalEnum() def demarshalSaHpiSensorTypeT( self ): return self.demarshalEnum() def demarshalSaHpiSensorReadingTypeT( self ): return self.demarshalEnum() def demarshalSaHpiSensorEventMaskActionT( self ): return self.demarshalEnum() def demarshalSaHpiSensorUnitsT( self ): return self.demarshalEnum() def demarshalSaHpiSensorModUnitUseT( self ): return self.demarshalEnum() def demarshalSaHpiSensorEventCtrlT( self ): return self.demarshalEnum() def demarshalSaHpiCtrlTypeT( self ): return self.demarshalEnum() def demarshalSaHpiCtrlStateDigitalT( self ): return self.demarshalEnum() def demarshalSaHpiCtrlModeT( self ): return self.demarshalEnum() def demarshalSaHpiCtrlOutputTypeT( self ): return self.demarshalEnum() def demarshalSaHpiIdrAreaTypeT( self ): return self.demarshalEnum() def demarshalSaHpiIdrFieldTypeT( self ): return self.demarshalEnum() def demarshalSaHpiWatchdogActionT( self ): return self.demarshalEnum() def demarshalSaHpiWatchdogActionEventT( self ): return self.demarshalEnum() def demarshalSaHpiWatchdogPretimerInterruptT( self ): return self.demarshalEnum() def demarshalSaHpiWatchdogTimerUseT( self ): return self.demarshalEnum() def demarshalSaHpiDimiTestServiceImpactT( self ): return self.demarshalEnum() def demarshalSaHpiDimiTestRunStatusT( self ): return self.demarshalEnum() def demarshalSaHpiDimiTestErrCodeT( self ): return self.demarshalEnum() def demarshalSaHpiDimiTestParamTypeT( self ): return self.demarshalEnum() def demarshalSaHpiDimiReadyT( self ): return self.demarshalEnum() def demarshalSaHpiFumiSpecInfoTypeT( self ): return self.demarshalEnum() def demarshalSaHpiFumiSafDefinedSpecIdT( self ): return self.demarshalEnum() def demarshalSaHpiFumiServiceImpactT( self ): return self.demarshalEnum() def demarshalSaHpiFumiSourceStatusT( self ): return self.demarshalEnum() def demarshalSaHpiFumiBankStateT( self ): return self.demarshalEnum() def demarshalSaHpiFumiUpgradeStatusT( self ): return self.demarshalEnum() def demarshalSaHpiHsIndicatorStateT( self ): return self.demarshalEnum() def demarshalSaHpiHsActionT( self ): return self.demarshalEnum() def demarshalSaHpiHsStateT( self ): return self.demarshalEnum() def demarshalSaHpiHsCauseOfStateChangeT( self ): return self.demarshalEnum() def demarshalSaHpiSeverityT( self ): return self.demarshalEnum() def demarshalSaHpiResourceEventTypeT( self ): return self.demarshalEnum() def demarshalSaHpiDomainEventTypeT( self ): return self.demarshalEnum() def demarshalSaHpiSwEventTypeT( self ): return self.demarshalEnum() def demarshalSaHpiEventTypeT( self ): return self.demarshalEnum() def demarshalSaHpiStatusCondTypeT( self ): return self.demarshalEnum() def demarshalSaHpiAnnunciatorModeT( self ): return self.demarshalEnum() def demarshalSaHpiAnnunciatorTypeT( self ): return self.demarshalEnum() def demarshalSaHpiRdrTypeT( self ): return self.demarshalEnum() def demarshalSaHpiParmActionT( self ): return self.demarshalEnum() def demarshalSaHpiResetActionT( self ): return self.demarshalEnum() def demarshalSaHpiPowerStateT( self ): return self.demarshalEnum() def demarshalSaHpiEventLogOverflowActionT( self ): return self.demarshalEnum() #********************************************************** # Demarshal: For HPI Structs and Unions #********************************************************** def demarshalSaHpiTextBufferT( self ): x = SaHpiTextBufferT() x.DataType = self.demarshalSaHpiTextTypeT() x.Language = self.demarshalSaHpiLanguageT() x.DataLength = self.demarshalSaHpiUint8T() x.Data = self.demarshalByteArray( SAHPI_MAX_TEXT_BUFFER_LENGTH ) return x def demarshalSaHpiEntityT( self ): x = SaHpiEntityT() x.EntityType = self.demarshalSaHpiEntityTypeT() x.EntityLocation = self.demarshalSaHpiEntityLocationT() return x def demarshalSaHpiEntityPathT( self ): x = SaHpiEntityPathT() x.Entry = [] for i in range( 0, SAHPI_MAX_ENTITY_PATH ): x.Entry.append( self.demarshalSaHpiEntityT() ) return x def demarshalSaHpiSensorReadingUnionT( self, mod ): x = SaHpiSensorReadingUnionT() if mod == SAHPI_SENSOR_READING_TYPE_INT64: x.SensorInt64 = self.demarshalSaHpiInt64T() if mod == SAHPI_SENSOR_READING_TYPE_UINT64: x.SensorUint64 = self.demarshalSaHpiUint64T() if mod == SAHPI_SENSOR_READING_TYPE_FLOAT64: x.SensorFloat64 = self.demarshalSaHpiFloat64T() if mod == SAHPI_SENSOR_READING_TYPE_BUFFER: x.SensorBuffer = self.demarshalByteArray( SAHPI_SENSOR_BUFFER_LENGTH ) return x def demarshalSaHpiSensorReadingT( self ): x = SaHpiSensorReadingT() x.IsSupported = self.demarshalSaHpiBoolT() x.Type = self.demarshalSaHpiSensorReadingTypeT() x.Value = self.demarshalSaHpiSensorReadingUnionT( x.Type ) return x def demarshalSaHpiSensorThresholdsT( self ): x = SaHpiSensorThresholdsT() x.LowCritical = self.demarshalSaHpiSensorReadingT() x.LowMajor = self.demarshalSaHpiSensorReadingT() x.LowMinor = self.demarshalSaHpiSensorReadingT() x.UpCritical = self.demarshalSaHpiSensorReadingT() x.UpMajor = self.demarshalSaHpiSensorReadingT() x.UpMinor = self.demarshalSaHpiSensorReadingT() x.PosThdHysteresis = self.demarshalSaHpiSensorReadingT() x.NegThdHysteresis = self.demarshalSaHpiSensorReadingT() return x def demarshalSaHpiSensorRangeT( self ): x = SaHpiSensorRangeT() x.Flags = self.demarshalSaHpiSensorRangeFlagsT() x.Max = self.demarshalSaHpiSensorReadingT() x.Min = self.demarshalSaHpiSensorReadingT() x.Nominal = self.demarshalSaHpiSensorReadingT() x.NormalMax = self.demarshalSaHpiSensorReadingT() x.NormalMin = self.demarshalSaHpiSensorReadingT() return x def demarshalSaHpiSensorDataFormatT( self ): x = SaHpiSensorDataFormatT() x.IsSupported = self.demarshalSaHpiBoolT() x.ReadingType = self.demarshalSaHpiSensorReadingTypeT() x.BaseUnits = self.demarshalSaHpiSensorUnitsT() x.ModifierUnits = self.demarshalSaHpiSensorUnitsT() x.ModifierUse = self.demarshalSaHpiSensorModUnitUseT() x.Percentage = self.demarshalSaHpiBoolT() x.Range = self.demarshalSaHpiSensorRangeT() x.AccuracyFactor = self.demarshalSaHpiFloat64T() return x def demarshalSaHpiSensorThdDefnT( self ): x = SaHpiSensorThdDefnT() x.IsAccessible = self.demarshalSaHpiBoolT() x.ReadThold = self.demarshalSaHpiSensorThdMaskT() x.WriteThold = self.demarshalSaHpiSensorThdMaskT() x.Nonlinear = self.demarshalSaHpiBoolT() return x def demarshalSaHpiSensorRecT( self ): x = SaHpiSensorRecT() x.Num = self.demarshalSaHpiSensorNumT() x.Type = self.demarshalSaHpiSensorTypeT() x.Category = self.demarshalSaHpiEventCategoryT() x.EnableCtrl = self.demarshalSaHpiBoolT() x.EventCtrl = self.demarshalSaHpiSensorEventCtrlT() x.Events = self.demarshalSaHpiEventStateT() x.DataFormat = self.demarshalSaHpiSensorDataFormatT() x.ThresholdDefn = self.demarshalSaHpiSensorThdDefnT() x.Oem = self.demarshalSaHpiUint32T() return x def demarshalSaHpiCtrlStateStreamT( self ): x = SaHpiCtrlStateStreamT() x.Repeat = self.demarshalSaHpiBoolT() x.StreamLength = self.demarshalSaHpiUint32T() x.Stream = self.demarshalByteArray( SAHPI_CTRL_MAX_STREAM_LENGTH ) return x def demarshalSaHpiCtrlStateTextT( self ): x = SaHpiCtrlStateTextT() x.Line = self.demarshalSaHpiTxtLineNumT() x.Text = self.demarshalSaHpiTextBufferT() return x def demarshalSaHpiCtrlStateOemT( self ): x = SaHpiCtrlStateOemT() x.MId = self.demarshalSaHpiManufacturerIdT() x.BodyLength = self.demarshalSaHpiUint8T() x.Body = self.demarshalByteArray( SAHPI_CTRL_MAX_OEM_BODY_LENGTH ) return x def demarshalSaHpiCtrlStateUnionT( self, mod ): x = SaHpiCtrlStateUnionT() if mod == SAHPI_CTRL_TYPE_DIGITAL: x.Digital = self.demarshalSaHpiCtrlStateDigitalT() if mod == SAHPI_CTRL_TYPE_DISCRETE: x.Discrete = self.demarshalSaHpiCtrlStateDiscreteT() if mod == SAHPI_CTRL_TYPE_ANALOG: x.Analog = self.demarshalSaHpiCtrlStateAnalogT() if mod == SAHPI_CTRL_TYPE_STREAM: x.Stream = self.demarshalSaHpiCtrlStateStreamT() if mod == SAHPI_CTRL_TYPE_TEXT: x.Text = self.demarshalSaHpiCtrlStateTextT() if mod == SAHPI_CTRL_TYPE_OEM: x.Oem = self.demarshalSaHpiCtrlStateOemT() return x def demarshalSaHpiCtrlStateT( self ): x = SaHpiCtrlStateT() x.Type = self.demarshalSaHpiCtrlTypeT() x.StateUnion = self.demarshalSaHpiCtrlStateUnionT( x.Type ) return x def demarshalSaHpiCtrlRecDigitalT( self ): x = SaHpiCtrlRecDigitalT() x.Default = self.demarshalSaHpiCtrlStateDigitalT() return x def demarshalSaHpiCtrlRecDiscreteT( self ): x = SaHpiCtrlRecDiscreteT() x.Default = self.demarshalSaHpiCtrlStateDiscreteT() return x def demarshalSaHpiCtrlRecAnalogT( self ): x = SaHpiCtrlRecAnalogT() x.Min = self.demarshalSaHpiCtrlStateAnalogT() x.Max = self.demarshalSaHpiCtrlStateAnalogT() x.Default = self.demarshalSaHpiCtrlStateAnalogT() return x def demarshalSaHpiCtrlRecStreamT( self ): x = SaHpiCtrlRecStreamT() x.Default = self.demarshalSaHpiCtrlStateStreamT() return x def demarshalSaHpiCtrlRecTextT( self ): x = SaHpiCtrlRecTextT() x.MaxChars = self.demarshalSaHpiUint8T() x.MaxLines = self.demarshalSaHpiUint8T() x.Language = self.demarshalSaHpiLanguageT() x.DataType = self.demarshalSaHpiTextTypeT() x.Default = self.demarshalSaHpiCtrlStateTextT() return x def demarshalSaHpiCtrlRecOemT( self ): x = SaHpiCtrlRecOemT() x.MId = self.demarshalSaHpiManufacturerIdT() x.ConfigData = self.demarshalByteArray( SAHPI_CTRL_OEM_CONFIG_LENGTH ) x.Default = self.demarshalSaHpiCtrlStateOemT() return x def demarshalSaHpiCtrlRecUnionT( self, mod ): x = SaHpiCtrlRecUnionT() if mod == SAHPI_CTRL_TYPE_DIGITAL: x.Digital = self.demarshalSaHpiCtrlRecDigitalT() if mod == SAHPI_CTRL_TYPE_DISCRETE: x.Discrete = self.demarshalSaHpiCtrlRecDiscreteT() if mod == SAHPI_CTRL_TYPE_ANALOG: x.Analog = self.demarshalSaHpiCtrlRecAnalogT() if mod == SAHPI_CTRL_TYPE_STREAM: x.Stream = self.demarshalSaHpiCtrlRecStreamT() if mod == SAHPI_CTRL_TYPE_TEXT: x.Text = self.demarshalSaHpiCtrlRecTextT() if mod == SAHPI_CTRL_TYPE_OEM: x.Oem = self.demarshalSaHpiCtrlRecOemT() return x def demarshalSaHpiCtrlDefaultModeT( self ): x = SaHpiCtrlDefaultModeT() x.Mode = self.demarshalSaHpiCtrlModeT() x.ReadOnly = self.demarshalSaHpiBoolT() return x def demarshalSaHpiCtrlRecT( self ): x = SaHpiCtrlRecT() x.Num = self.demarshalSaHpiCtrlNumT() x.OutputType = self.demarshalSaHpiCtrlOutputTypeT() x.Type = self.demarshalSaHpiCtrlTypeT() x.TypeUnion = self.demarshalSaHpiCtrlRecUnionT( x.Type ) x.DefaultMode = self.demarshalSaHpiCtrlDefaultModeT() x.WriteOnly = self.demarshalSaHpiBoolT() x.Oem = self.demarshalSaHpiUint32T() return x def demarshalSaHpiIdrFieldT( self ): x = SaHpiIdrFieldT() x.AreaId = self.demarshalSaHpiEntryIdT() x.FieldId = self.demarshalSaHpiEntryIdT() x.Type = self.demarshalSaHpiIdrFieldTypeT() x.ReadOnly = self.demarshalSaHpiBoolT() x.Field = self.demarshalSaHpiTextBufferT() return x def demarshalSaHpiIdrAreaHeaderT( self ): x = SaHpiIdrAreaHeaderT() x.AreaId = self.demarshalSaHpiEntryIdT() x.Type = self.demarshalSaHpiIdrAreaTypeT() x.ReadOnly = self.demarshalSaHpiBoolT() x.NumFields = self.demarshalSaHpiUint32T() return x def demarshalSaHpiIdrInfoT( self ): x = SaHpiIdrInfoT() x.IdrId = self.demarshalSaHpiIdrIdT() x.UpdateCount = self.demarshalSaHpiUint32T() x.ReadOnly = self.demarshalSaHpiBoolT() x.NumAreas = self.demarshalSaHpiUint32T() return x def demarshalSaHpiInventoryRecT( self ): x = SaHpiInventoryRecT() x.IdrId = self.demarshalSaHpiIdrIdT() x.Persistent = self.demarshalSaHpiBoolT() x.Oem = self.demarshalSaHpiUint32T() return x def demarshalSaHpiWatchdogT( self ): x = SaHpiWatchdogT() x.Log = self.demarshalSaHpiBoolT() x.Running = self.demarshalSaHpiBoolT() x.TimerUse = self.demarshalSaHpiWatchdogTimerUseT() x.TimerAction = self.demarshalSaHpiWatchdogActionT() x.PretimerInterrupt = self.demarshalSaHpiWatchdogPretimerInterruptT() x.PreTimeoutInterval = self.demarshalSaHpiUint32T() x.TimerUseExpFlags = self.demarshalSaHpiWatchdogExpFlagsT() x.InitialCount = self.demarshalSaHpiUint32T() x.PresentCount = self.demarshalSaHpiUint32T() return x def demarshalSaHpiWatchdogRecT( self ): x = SaHpiWatchdogRecT() x.WatchdogNum = self.demarshalSaHpiWatchdogNumT() x.Oem = self.demarshalSaHpiUint32T() return x def demarshalSaHpiDimiTestAffectedEntityT( self ): x = SaHpiDimiTestAffectedEntityT() x.EntityImpacted = self.demarshalSaHpiEntityPathT() x.ServiceImpact = self.demarshalSaHpiDimiTestServiceImpactT() return x def demarshalSaHpiDimiTestResultsT( self ): x = SaHpiDimiTestResultsT() x.ResultTimeStamp = self.demarshalSaHpiTimeT() x.RunDuration = self.demarshalSaHpiTimeoutT() x.LastRunStatus = self.demarshalSaHpiDimiTestRunStatusT() x.TestErrorCode = self.demarshalSaHpiDimiTestErrCodeT() x.TestResultString = self.demarshalSaHpiTextBufferT() x.TestResultStringIsURI = self.demarshalSaHpiBoolT() return x def demarshalSaHpiDimiTestParamValueT( self, mod ): x = SaHpiDimiTestParamValueT() if mod == SAHPI_DIMITEST_PARAM_TYPE_INT32: x.paramint = self.demarshalSaHpiInt32T() if mod == SAHPI_DIMITEST_PARAM_TYPE_BOOLEAN: x.parambool = self.demarshalSaHpiBoolT() if mod == SAHPI_DIMITEST_PARAM_TYPE_FLOAT64: x.paramfloat = self.demarshalSaHpiFloat64T() if mod == SAHPI_DIMITEST_PARAM_TYPE_TEXT: x.paramtext = self.demarshalSaHpiTextBufferT() return x def demarshalSaHpiDimiTestParameterValueUnionT( self, mod ): x = SaHpiDimiTestParameterValueUnionT() if mod == SAHPI_DIMITEST_PARAM_TYPE_INT32: x.IntValue = self.demarshalSaHpiInt32T() if mod == SAHPI_DIMITEST_PARAM_TYPE_FLOAT64: x.FloatValue = self.demarshalSaHpiFloat64T() if mod == SAHPI_DIMITEST_PARAM_TYPE_BOOLEAN: x.FloatValue = self.demarshalSaHpiFloat64T() if mod == SAHPI_DIMITEST_PARAM_TYPE_TEXT: x.FloatValue = self.demarshalSaHpiFloat64T() return x def demarshalSaHpiDimiTestParamsDefinitionT( self ): x = SaHpiDimiTestParamsDefinitionT() x.ParamName = self.demarshalByteArray( SAHPI_DIMITEST_PARAM_NAME_LEN ) x.ParamInfo = self.demarshalSaHpiTextBufferT() x.ParamType = self.demarshalSaHpiDimiTestParamTypeT() x.MinValue = self.demarshalSaHpiDimiTestParameterValueUnionT( x.ParamType ) x.MaxValue = self.demarshalSaHpiDimiTestParameterValueUnionT( x.ParamType ) x.DefaultParam = self.demarshalSaHpiDimiTestParamValueT( x.ParamType ) return x def demarshalSaHpiDimiTestT( self ): x = SaHpiDimiTestT() x.TestName = self.demarshalSaHpiTextBufferT() x.ServiceImpact = self.demarshalSaHpiDimiTestServiceImpactT() x.EntitiesImpacted = [] for i in range( 0, SAHPI_DIMITEST_MAX_ENTITIESIMPACTED ): x.EntitiesImpacted.append( self.demarshalSaHpiDimiTestAffectedEntityT() ) x.NeedServiceOS = self.demarshalSaHpiBoolT() x.ServiceOS = self.demarshalSaHpiTextBufferT() x.ExpectedRunDuration = self.demarshalSaHpiTimeT() x.TestCapabilities = self.demarshalSaHpiDimiTestCapabilityT() x.TestParameters = [] for i in range( 0, SAHPI_DIMITEST_MAX_PARAMETERS ): x.TestParameters.append( self.demarshalSaHpiDimiTestParamsDefinitionT() ) return x def demarshalSaHpiDimiTestVariableParamsT( self ): x = SaHpiDimiTestVariableParamsT() x.ParamName = self.demarshalByteArray( SAHPI_DIMITEST_PARAM_NAME_LEN ) x.ParamType = self.demarshalSaHpiDimiTestParamTypeT() x.Value = self.demarshalSaHpiDimiTestParamValueT( x.ParamType ) return x def demarshalSaHpiDimiInfoT( self ): x = SaHpiDimiInfoT() x.NumberOfTests = self.demarshalSaHpiUint32T() x.TestNumUpdateCounter = self.demarshalSaHpiUint32T() return x def demarshalSaHpiDimiRecT( self ): x = SaHpiDimiRecT() x.DimiNum = self.demarshalSaHpiDimiNumT() x.Oem = self.demarshalSaHpiUint32T() return x def demarshalSaHpiFumiSafDefinedSpecInfoT( self ): x = SaHpiFumiSafDefinedSpecInfoT() x.SpecID = self.demarshalSaHpiFumiSafDefinedSpecIdT() x.RevisionID = self.demarshalSaHpiUint32T() return x def demarshalSaHpiFumiOemDefinedSpecInfoT( self ): x = SaHpiFumiOemDefinedSpecInfoT() x.Mid = self.demarshalSaHpiManufacturerIdT() x.BodyLength = self.demarshalSaHpiUint8T() x.Body = self.demarshalByteArray( SAHPI_FUMI_MAX_OEM_BODY_LENGTH ) return x def demarshalSaHpiFumiSpecInfoTypeUnionT( self, mod ): x = SaHpiFumiSpecInfoTypeUnionT() if mod == SAHPI_FUMI_SPEC_INFO_SAF_DEFINED: x.SafDefined = self.demarshalSaHpiFumiSafDefinedSpecInfoT() if mod == SAHPI_FUMI_SPEC_INFO_OEM_DEFINED: x.OemDefined = self.demarshalSaHpiFumiOemDefinedSpecInfoT() return x def demarshalSaHpiFumiSpecInfoT( self ): x = SaHpiFumiSpecInfoT() x.SpecInfoType = self.demarshalSaHpiFumiSpecInfoTypeT() x.SpecInfoTypeUnion = self.demarshalSaHpiFumiSpecInfoTypeUnionT( x.SpecInfoType ) return x def demarshalSaHpiFumiFirmwareInstanceInfoT( self ): x = SaHpiFumiFirmwareInstanceInfoT() x.InstancePresent = self.demarshalSaHpiBoolT() x.Identifier = self.demarshalSaHpiTextBufferT() x.Description = self.demarshalSaHpiTextBufferT() x.DateTime = self.demarshalSaHpiTextBufferT() x.MajorVersion = self.demarshalSaHpiUint32T() x.MinorVersion = self.demarshalSaHpiUint32T() x.AuxVersion = self.demarshalSaHpiUint32T() return x def demarshalSaHpiFumiImpactedEntityT( self ): x = SaHpiFumiImpactedEntityT() x.ImpactedEntity = self.demarshalSaHpiEntityPathT() x.ServiceImpact = self.demarshalSaHpiFumiServiceImpactT() return x def demarshalSaHpiFumiServiceImpactDataT( self ): x = SaHpiFumiServiceImpactDataT() x.NumEntities = self.demarshalSaHpiUint32T() x.ImpactedEntities = [] for i in range( 0, SAHPI_FUMI_MAX_ENTITIES_IMPACTED ): x.ImpactedEntities.append( self.demarshalSaHpiFumiImpactedEntityT() ) return x def demarshalSaHpiFumiSourceInfoT( self ): x = SaHpiFumiSourceInfoT() x.SourceUri = self.demarshalSaHpiTextBufferT() x.SourceStatus = self.demarshalSaHpiFumiSourceStatusT() x.Identifier = self.demarshalSaHpiTextBufferT() x.Description = self.demarshalSaHpiTextBufferT() x.DateTime = self.demarshalSaHpiTextBufferT() x.MajorVersion = self.demarshalSaHpiUint32T() x.MinorVersion = self.demarshalSaHpiUint32T() x.AuxVersion = self.demarshalSaHpiUint32T() return x def demarshalSaHpiFumiComponentInfoT( self ): x = SaHpiFumiComponentInfoT() x.EntryId = self.demarshalSaHpiEntryIdT() x.ComponentId = self.demarshalSaHpiUint32T() x.MainFwInstance = self.demarshalSaHpiFumiFirmwareInstanceInfoT() x.ComponentFlags = self.demarshalSaHpiUint32T() return x def demarshalSaHpiFumiBankInfoT( self ): x = SaHpiFumiBankInfoT() x.BankId = self.demarshalSaHpiUint8T() x.BankSize = self.demarshalSaHpiUint32T() x.Position = self.demarshalSaHpiUint32T() x.BankState = self.demarshalSaHpiFumiBankStateT() x.Identifier = self.demarshalSaHpiTextBufferT() x.Description = self.demarshalSaHpiTextBufferT() x.DateTime = self.demarshalSaHpiTextBufferT() x.MajorVersion = self.demarshalSaHpiUint32T() x.MinorVersion = self.demarshalSaHpiUint32T() x.AuxVersion = self.demarshalSaHpiUint32T() return x def demarshalSaHpiFumiLogicalBankInfoT( self ): x = SaHpiFumiLogicalBankInfoT() x.FirmwarePersistentLocationCount = self.demarshalSaHpiUint8T() x.BankStateFlags = self.demarshalSaHpiFumiLogicalBankStateFlagsT() x.PendingFwInstance = self.demarshalSaHpiFumiFirmwareInstanceInfoT() x.RollbackFwInstance = self.demarshalSaHpiFumiFirmwareInstanceInfoT() return x def demarshalSaHpiFumiLogicalComponentInfoT( self ): x = SaHpiFumiLogicalComponentInfoT() x.EntryId = self.demarshalSaHpiEntryIdT() x.ComponentId = self.demarshalSaHpiUint32T() x.PendingFwInstance = self.demarshalSaHpiFumiFirmwareInstanceInfoT() x.RollbackFwInstance = self.demarshalSaHpiFumiFirmwareInstanceInfoT() x.ComponentFlags = self.demarshalSaHpiUint32T() return x def demarshalSaHpiFumiRecT( self ): x = SaHpiFumiRecT() x.Num = self.demarshalSaHpiFumiNumT() x.AccessProt = self.demarshalSaHpiFumiProtocolT() x.Capability = self.demarshalSaHpiFumiCapabilityT() x.NumBanks = self.demarshalSaHpiUint8T() x.Oem = self.demarshalSaHpiUint32T() return x def demarshalSaHpiResourceEventT( self ): x = SaHpiResourceEventT() x.ResourceEventType = self.demarshalSaHpiResourceEventTypeT() return x def demarshalSaHpiDomainEventT( self ): x = SaHpiDomainEventT() x.Type = self.demarshalSaHpiDomainEventTypeT() x.DomainId = self.demarshalSaHpiDomainIdT() return x def demarshalSaHpiSensorEventT( self ): x = SaHpiSensorEventT() x.SensorNum = self.demarshalSaHpiSensorNumT() x.SensorType = self.demarshalSaHpiSensorTypeT() x.EventCategory = self.demarshalSaHpiEventCategoryT() x.Assertion = self.demarshalSaHpiBoolT() x.EventState = self.demarshalSaHpiEventStateT() x.OptionalDataPresent = self.demarshalSaHpiSensorOptionalDataT() x.TriggerReading = self.demarshalSaHpiSensorReadingT() x.TriggerThreshold = self.demarshalSaHpiSensorReadingT() x.PreviousState = self.demarshalSaHpiEventStateT() x.CurrentState = self.demarshalSaHpiEventStateT() x.Oem = self.demarshalSaHpiUint32T() x.SensorSpecific = self.demarshalSaHpiUint32T() return x def demarshalSaHpiSensorEnableChangeEventT( self ): x = SaHpiSensorEnableChangeEventT() x.SensorNum = self.demarshalSaHpiSensorNumT() x.SensorType = self.demarshalSaHpiSensorTypeT() x.EventCategory = self.demarshalSaHpiEventCategoryT() x.SensorEnable = self.demarshalSaHpiBoolT() x.SensorEventEnable = self.demarshalSaHpiBoolT() x.AssertEventMask = self.demarshalSaHpiEventStateT() x.DeassertEventMask = self.demarshalSaHpiEventStateT() x.OptionalDataPresent = self.demarshalSaHpiSensorEnableOptDataT() x.CurrentState = self.demarshalSaHpiEventStateT() x.CriticalAlarms = self.demarshalSaHpiEventStateT() x.MajorAlarms = self.demarshalSaHpiEventStateT() x.MinorAlarms = self.demarshalSaHpiEventStateT() return x def demarshalSaHpiHotSwapEventT( self ): x = SaHpiHotSwapEventT() x.HotSwapState = self.demarshalSaHpiHsStateT() x.PreviousHotSwapState = self.demarshalSaHpiHsStateT() x.CauseOfStateChange = self.demarshalSaHpiHsCauseOfStateChangeT() return x def demarshalSaHpiWatchdogEventT( self ): x = SaHpiWatchdogEventT() x.WatchdogNum = self.demarshalSaHpiWatchdogNumT() x.WatchdogAction = self.demarshalSaHpiWatchdogActionEventT() x.WatchdogPreTimerAction = self.demarshalSaHpiWatchdogPretimerInterruptT() x.WatchdogUse = self.demarshalSaHpiWatchdogTimerUseT() return x def demarshalSaHpiHpiSwEventT( self ): x = SaHpiHpiSwEventT() x.MId = self.demarshalSaHpiManufacturerIdT() x.Type = self.demarshalSaHpiSwEventTypeT() x.EventData = self.demarshalSaHpiTextBufferT() return x def demarshalSaHpiOemEventT( self ): x = SaHpiOemEventT() x.MId = self.demarshalSaHpiManufacturerIdT() x.OemEventData = self.demarshalSaHpiTextBufferT() return x def demarshalSaHpiUserEventT( self ): x = SaHpiUserEventT() x.UserEventData = self.demarshalSaHpiTextBufferT() return x def demarshalSaHpiDimiEventT( self ): x = SaHpiDimiEventT() x.DimiNum = self.demarshalSaHpiDimiNumT() x.TestNum = self.demarshalSaHpiDimiTestNumT() x.DimiTestRunStatus = self.demarshalSaHpiDimiTestRunStatusT() x.DimiTestPercentCompleted = self.demarshalSaHpiDimiTestPercentCompletedT() return x def demarshalSaHpiDimiUpdateEventT( self ): x = SaHpiDimiUpdateEventT() x.DimiNum = self.demarshalSaHpiDimiNumT() return x def demarshalSaHpiFumiEventT( self ): x = SaHpiFumiEventT() x.FumiNum = self.demarshalSaHpiFumiNumT() x.BankNum = self.demarshalSaHpiUint8T() x.UpgradeStatus = self.demarshalSaHpiFumiUpgradeStatusT() return x def demarshalSaHpiEventUnionT( self, mod ): x = SaHpiEventUnionT() if mod == SAHPI_ET_RESOURCE: x.ResourceEvent = self.demarshalSaHpiResourceEventT() if mod == SAHPI_ET_DOMAIN: x.DomainEvent = self.demarshalSaHpiDomainEventT() if mod == SAHPI_ET_SENSOR: x.SensorEvent = self.demarshalSaHpiSensorEventT() if mod == SAHPI_ET_SENSOR_ENABLE_CHANGE: x.SensorEnableChangeEvent = self.demarshalSaHpiSensorEnableChangeEventT() if mod == SAHPI_ET_HOTSWAP: x.HotSwapEvent = self.demarshalSaHpiHotSwapEventT() if mod == SAHPI_ET_WATCHDOG: x.WatchdogEvent = self.demarshalSaHpiWatchdogEventT() if mod == SAHPI_ET_HPI_SW: x.HpiSwEvent = self.demarshalSaHpiHpiSwEventT() if mod == SAHPI_ET_OEM: x.OemEvent = self.demarshalSaHpiOemEventT() if mod == SAHPI_ET_USER: x.UserEvent = self.demarshalSaHpiUserEventT() if mod == SAHPI_ET_DIMI: x.DimiEvent = self.demarshalSaHpiDimiEventT() if mod == SAHPI_ET_DIMI_UPDATE: x.DimiUpdateEvent = self.demarshalSaHpiDimiUpdateEventT() if mod == SAHPI_ET_FUMI: x.FumiEvent = self.demarshalSaHpiFumiEventT() return x def demarshalSaHpiEventT( self ): x = SaHpiEventT() x.Source = self.demarshalSaHpiResourceIdT() x.EventType = self.demarshalSaHpiEventTypeT() x.Timestamp = self.demarshalSaHpiTimeT() x.Severity = self.demarshalSaHpiSeverityT() x.EventDataUnion = self.demarshalSaHpiEventUnionT( x.EventType ) return x def demarshalSaHpiNameT( self ): x = SaHpiNameT() x.Length = self.demarshalSaHpiUint16T() x.Value = self.demarshalByteArray( SA_HPI_MAX_NAME_LENGTH ) return x def demarshalSaHpiConditionT( self ): x = SaHpiConditionT() x.Type = self.demarshalSaHpiStatusCondTypeT() x.Entity = self.demarshalSaHpiEntityPathT() x.DomainId = self.demarshalSaHpiDomainIdT() x.ResourceId = self.demarshalSaHpiResourceIdT() x.SensorNum = self.demarshalSaHpiSensorNumT() x.EventState = self.demarshalSaHpiEventStateT() x.Name = self.demarshalSaHpiNameT() x.Mid = self.demarshalSaHpiManufacturerIdT() x.Data = self.demarshalSaHpiTextBufferT() return x def demarshalSaHpiAnnouncementT( self ): x = SaHpiAnnouncementT() x.EntryId = self.demarshalSaHpiEntryIdT() x.Timestamp = self.demarshalSaHpiTimeT() x.AddedByUser = self.demarshalSaHpiBoolT() x.Severity = self.demarshalSaHpiSeverityT() x.Acknowledged = self.demarshalSaHpiBoolT() x.StatusCond = self.demarshalSaHpiConditionT() return x def demarshalSaHpiAnnunciatorRecT( self ): x = SaHpiAnnunciatorRecT() x.AnnunciatorNum = self.demarshalSaHpiAnnunciatorNumT() x.AnnunciatorType = self.demarshalSaHpiAnnunciatorTypeT() x.ModeReadOnly = self.demarshalSaHpiBoolT() x.MaxConditions = self.demarshalSaHpiUint32T() x.Oem = self.demarshalSaHpiUint32T() return x def demarshalSaHpiRdrTypeUnionT( self, mod ): x = SaHpiRdrTypeUnionT() if mod == SAHPI_CTRL_RDR: x.CtrlRec = self.demarshalSaHpiCtrlRecT() if mod == SAHPI_SENSOR_RDR: x.SensorRec = self.demarshalSaHpiSensorRecT() if mod == SAHPI_INVENTORY_RDR: x.InventoryRec = self.demarshalSaHpiInventoryRecT() if mod == SAHPI_WATCHDOG_RDR: x.WatchdogRec = self.demarshalSaHpiWatchdogRecT() if mod == SAHPI_ANNUNCIATOR_RDR: x.AnnunciatorRec = self.demarshalSaHpiAnnunciatorRecT() if mod == SAHPI_DIMI_RDR: x.DimiRec = self.demarshalSaHpiDimiRecT() if mod == SAHPI_FUMI_RDR: x.FumiRec = self.demarshalSaHpiFumiRecT() return x def demarshalSaHpiRdrT( self ): x = SaHpiRdrT() x.RecordId = self.demarshalSaHpiEntryIdT() x.RdrType = self.demarshalSaHpiRdrTypeT() x.Entity = self.demarshalSaHpiEntityPathT() x.IsFru = self.demarshalSaHpiBoolT() x.RdrTypeUnion = self.demarshalSaHpiRdrTypeUnionT( x.RdrType ) x.IdString = self.demarshalSaHpiTextBufferT() return x def demarshalSaHpiLoadIdT( self ): x = SaHpiLoadIdT() x.LoadNumber = self.demarshalSaHpiLoadNumberT() x.LoadName = self.demarshalSaHpiTextBufferT() return x def demarshalSaHpiResourceInfoT( self ): x = SaHpiResourceInfoT() x.ResourceRev = self.demarshalSaHpiUint8T() x.SpecificVer = self.demarshalSaHpiUint8T() x.DeviceSupport = self.demarshalSaHpiUint8T() x.ManufacturerId = self.demarshalSaHpiManufacturerIdT() x.ProductId = self.demarshalSaHpiUint16T() x.FirmwareMajorRev = self.demarshalSaHpiUint8T() x.FirmwareMinorRev = self.demarshalSaHpiUint8T() x.AuxFirmwareRev = self.demarshalSaHpiUint8T() x.Guid = self.demarshalByteArray( SAHPI_GUID_LENGTH ) return x def demarshalSaHpiRptEntryT( self ): x = SaHpiRptEntryT() x.EntryId = self.demarshalSaHpiEntryIdT() x.ResourceId = self.demarshalSaHpiResourceIdT() x.ResourceInfo = self.demarshalSaHpiResourceInfoT() x.ResourceEntity = self.demarshalSaHpiEntityPathT() x.ResourceCapabilities = self.demarshalSaHpiCapabilitiesT() x.HotSwapCapabilities = self.demarshalSaHpiHsCapabilitiesT() x.ResourceSeverity = self.demarshalSaHpiSeverityT() x.ResourceFailed = self.demarshalSaHpiBoolT() x.ResourceTag = self.demarshalSaHpiTextBufferT() return x def demarshalSaHpiDomainInfoT( self ): x = SaHpiDomainInfoT() x.DomainId = self.demarshalSaHpiDomainIdT() x.DomainCapabilities = self.demarshalSaHpiDomainCapabilitiesT() x.IsPeer = self.demarshalSaHpiBoolT() x.DomainTag = self.demarshalSaHpiTextBufferT() x.DrtUpdateCount = self.demarshalSaHpiUint32T() x.DrtUpdateTimestamp = self.demarshalSaHpiTimeT() x.RptUpdateCount = self.demarshalSaHpiUint32T() x.RptUpdateTimestamp = self.demarshalSaHpiTimeT() x.DatUpdateCount = self.demarshalSaHpiUint32T() x.DatUpdateTimestamp = self.demarshalSaHpiTimeT() x.ActiveAlarms = self.demarshalSaHpiUint32T() x.CriticalAlarms = self.demarshalSaHpiUint32T() x.MajorAlarms = self.demarshalSaHpiUint32T() x.MinorAlarms = self.demarshalSaHpiUint32T() x.DatUserAlarmLimit = self.demarshalSaHpiUint32T() x.DatOverflow = self.demarshalSaHpiBoolT() x.Guid = self.demarshalByteArray( SAHPI_GUID_LENGTH ) return x def demarshalSaHpiDrtEntryT( self ): x = SaHpiDrtEntryT() x.EntryId = self.demarshalSaHpiEntryIdT() x.DomainId = self.demarshalSaHpiDomainIdT() x.IsPeer = self.demarshalSaHpiBoolT() return x def demarshalSaHpiAlarmT( self ): x = SaHpiAlarmT() x.AlarmId = self.demarshalSaHpiAlarmIdT() x.Timestamp = self.demarshalSaHpiTimeT() x.Severity = self.demarshalSaHpiSeverityT() x.Acknowledged = self.demarshalSaHpiBoolT() x.AlarmCond = self.demarshalSaHpiConditionT() return x def demarshalSaHpiEventLogInfoT( self ): x = SaHpiEventLogInfoT() x.Entries = self.demarshalSaHpiUint32T() x.Size = self.demarshalSaHpiUint32T() x.UserEventMaxSize = self.demarshalSaHpiUint32T() x.UpdateTimestamp = self.demarshalSaHpiTimeT() x.CurrentTime = self.demarshalSaHpiTimeT() x.Enabled = self.demarshalSaHpiBoolT() x.OverflowFlag = self.demarshalSaHpiBoolT() x.OverflowResetable = self.demarshalSaHpiBoolT() x.OverflowAction = self.demarshalSaHpiEventLogOverflowActionT() return x def demarshalSaHpiEventLogEntryT( self ): x = SaHpiEventLogEntryT() x.EntryId = self.demarshalSaHpiEventLogEntryIdT() x.Timestamp = self.demarshalSaHpiTimeT() x.Event = self.demarshalSaHpiEventT() return x openhpi-3.6.1/baselibs/python/example.py0000644000175100017510000000350512575647300017301 0ustar mohanmohan # -*- python -*- # # Copyright (C) 2012, Pigeon Point Systems # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # # Author(s): # Anton Pak # from openhpi_baselib import * version = oHpiVersionGet() print "OpenHPI baselib package version: %0x" % version host = HpiUtil.toSaHpiTextBufferT( "localhost" ) root = HpiUtil.makeRootSaHpiEntityPathT() ( rv, did ) = oHpiDomainAdd( host, DEFAULT_PORT, root ) if rv != SA_OK: print "ERROR: oHpiDomainAdd: %s " % HpiUtil.fromSaErrorT( rv ) exit() print "DID %u" % did ( rv, sid ) = saHpiSessionOpen( did, None ) if rv != SA_OK: print "ERROR: saHpiSessionOpen: %s " % HpiUtil.fromSaErrorT( rv ) exit() print "SID %u" % sid ( rv, my_ep ) = saHpiMyEntityPathGet( sid ) if rv == SA_OK: print "My entity: %s" % HpiUtil.fromSaHpiEntityPathT( my_ep ) print "Resource List:" eid = SAHPI_FIRST_ENTRY next_eid = SAHPI_FIRST_ENTRY while eid != SAHPI_LAST_ENTRY: ( rv, next_eid, rpte ) = saHpiRptEntryGet( sid, eid ) if ( eid == SAHPI_FIRST_ENTRY ) and ( rv == SA_ERR_HPI_NOT_PRESENT ): break if rv != SA_OK: print "ERROR: saHpiRptEntryGet: %s " % HpiUtil.fromSaErrorT( rv ) exit() tag = HpiUtil.fromSaHpiTextBufferT( rpte.ResourceTag ) ep = HpiUtil.fromSaHpiEntityPathT( rpte.ResourceEntity ) print " HPI Resource %u: %s: %s" % ( rpte.ResourceId, tag, ep ) eid = next_eid rv = saHpiSessionClose( sid ) if rv != SA_OK: print "ERROR: saHpiSessionClose: %s " % HpiUtil.fromSaErrorT( rv ) exit() print "End" openhpi-3.6.1/baselibs/java/0000755000175100017510000000000012575650556014700 5ustar mohanmohanopenhpi-3.6.1/baselibs/java/example_collections/0000755000175100017510000000000012575650556020731 5ustar mohanmohanopenhpi-3.6.1/baselibs/java/example_collections/ExampleCollections.java0000644000175100017510000002552212575647300025365 0ustar mohanmohan/* -*- java -*- * * Copyright (C) 2012, Pigeon Point Systems * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ import static org.openhpi.Hpi.*; import static org.openhpi.HpiDataTypes.*; import org.openhpi.HpiUtil; import org.openhpi.HpiCollections; public class ExampleCollections { public static void main( String[] args ) { try { long rv; saHpiSessionOpenOutputParamsT oo = new saHpiSessionOpenOutputParamsT(); rv = saHpiSessionOpen( SAHPI_UNSPECIFIED_DOMAIN_ID, null, oo ); if ( rv != SA_OK ) { System.out.printf( "Error: saHpiSessionOpen: %d\n", rv ); return; } long sid = oo.SessionId; // DRT System.out.printf( "\n" ); System.out.printf( "DRT:\n" ); for ( SaHpiDrtEntryT drte : HpiCollections.Drt( sid ) ) { System.out.printf( " HPI Domain %d: Is Peer %d\n", drte.DomainId, drte.IsPeer ); } // DAT System.out.printf( "\n" ); System.out.printf( "DAT:\n" ); for( SaHpiAlarmT a : HpiCollections.Dat( sid, SAHPI_ALL_SEVERITIES, SAHPI_FALSE ) ) { System.out.printf( " Alarm %d: %s: %s\n", a.AlarmId, HpiUtil.fromSaHpiSeverityT( a.Severity ), HpiUtil.fromSaHpiStatusCondTypeT( a.AlarmCond.Type ) ); } // DEL: Read backward System.out.printf( "\n" ); System.out.printf( "DEL: Newest entries first\n" ); for ( HpiCollections.EventLogEntryEx ex : HpiCollections.EventLogEntries( sid, SAHPI_UNSPECIFIED_RESOURCE_ID, false ) ) { System.out.printf( " Entry %d: %s\n", ex.EventLogEntry.EntryId, HpiUtil.fromSaHpiEventTypeT( ex.EventLogEntry.Event.EventType ) ); } // Iterate over top-level entities System.out.printf( "\n" ); System.out.printf( "Top-level Entities:\n" ); SaHpiEntityPathT root = HpiUtil.makeRootSaHpiEntityPathT(); for ( SaHpiEntityPathT child : HpiCollections.ChildEntities( sid, root ) ) { System.out.printf( " %s\n", HpiUtil.fromSaHpiEntityPathT( child ) ); // Resources for the entity System.out.printf( " Resources:\n" ); for ( long rid : HpiCollections.EntityResourceIds( sid, child ) ) { System.out.printf( " Resource %d\n", rid ); } // Sensors for the entity System.out.printf( " Sensors:\n" ); for ( HpiCollections.ResourceIdInstrumentId ri : HpiCollections.EntityInstrumentIds( sid, child, SAHPI_SENSOR_RDR ) ) { System.out.printf( " Resource %d Sensor %d\n", ri.ResourceId, ri.InstrumentId ); } } // RPT System.out.printf( "\n" ); System.out.printf( "RPT:\n" ); for ( SaHpiRptEntryT rpte : HpiCollections.Rpt( sid ) ) { System.out.printf( " Resource %d: %s: %s\n", rpte.ResourceId, HpiUtil.fromSaHpiTextBufferT( rpte.ResourceTag ), HpiUtil.fromSaHpiEntityPathT( rpte.ResourceEntity ) ); } // RDRs System.out.printf( "\n" ); System.out.printf( "RDRs:\n" ); for ( SaHpiRptEntryT rpte : HpiCollections.Rpt( sid ) ) { System.out.printf( " Resource %d:\n", rpte.ResourceId ); for ( SaHpiRdrT rdr : HpiCollections.Rdrs( sid, rpte.ResourceId ) ) { System.out.printf( " %s: %s\n", HpiUtil.fromSaHpiRdrTypeT( rdr.RdrType ), HpiUtil.fromSaHpiTextBufferT( rdr.IdString ) ); } } // IDR Areas System.out.printf( "\n" ); System.out.printf( "IDRs:\n" ); for ( SaHpiRptEntryT rpte : HpiCollections.Rpt( sid ) ) { for ( SaHpiRdrT rdr : HpiCollections.Rdrs( sid, rpte.ResourceId ) ) { if ( rdr.RdrType != SAHPI_INVENTORY_RDR ) { continue; } long rid = rpte.ResourceId; long idrid = rdr.RdrTypeUnion.InventoryRec.IdrId; System.out.printf( " Resource %d: IDR %d:\n", rid, idrid ); // IDR Areas for ( SaHpiIdrAreaHeaderT ahdr : HpiCollections.IdrAreaHeaders( sid, rid, idrid, SAHPI_IDR_AREATYPE_UNSPECIFIED ) ) { System.out.printf( " Area %d: %s\n", ahdr.AreaId, HpiUtil.fromSaHpiIdrAreaTypeT( ahdr.Type ) ); // IDR Fields for ( SaHpiIdrFieldT f : HpiCollections.IdrAreaFields( sid, rid, idrid, ahdr.AreaId, SAHPI_IDR_FIELDTYPE_UNSPECIFIED ) ) { System.out.printf( " Field %d: %s\n", f.FieldId, HpiUtil.fromSaHpiIdrFieldTypeT( f.Type ) ); } } } } // Announcements in Annunciators System.out.printf( "\n" ); System.out.printf( "Annunciators:\n" ); for ( SaHpiRptEntryT rpte : HpiCollections.Rpt( sid ) ) { for ( SaHpiRdrT rdr : HpiCollections.Rdrs( sid, rpte.ResourceId ) ) { if ( rdr.RdrType != SAHPI_ANNUNCIATOR_RDR ) { continue; } long rid = rpte.ResourceId; long annnum = rdr.RdrTypeUnion.AnnunciatorRec.AnnunciatorNum; System.out.printf( " Resource %d: Annunciator %d:\n", rid, annnum ); // Announcements for ( SaHpiAnnouncementT a : HpiCollections.Announcements( sid, rid, annnum, SAHPI_ALL_SEVERITIES, SAHPI_FALSE ) ) { System.out.printf( " Announcement %d: %s: %s\n", a.EntryId, HpiUtil.fromSaHpiSeverityT( a.Severity ), HpiUtil.fromSaHpiStatusCondTypeT( a.StatusCond.Type ) ); } } } // FUMI System.out.printf( "\n" ); System.out.printf( "FUMIs:\n" ); for ( SaHpiRptEntryT rpte : HpiCollections.Rpt( sid ) ) { for ( SaHpiRdrT rdr : HpiCollections.Rdrs( sid, rpte.ResourceId ) ) { if ( rdr.RdrType != SAHPI_FUMI_RDR ) { continue; } if ( rdr.RdrTypeUnion.FumiRec.NumBanks != 0 ) { continue; } long rid = rpte.ResourceId; long fuminum = rdr.RdrTypeUnion.FumiRec.Num; System.out.printf( " Resource %d: FUMI %d:\n", rid, fuminum ); // Source components System.out.printf( " Source Components:" ); for ( SaHpiFumiComponentInfoT info : HpiCollections.FumiSourceComponents( sid, rid, fuminum, 0 ) ) { System.out.printf( " Component %d: %s: FW %d.%d.%d\n", info.ComponentId, HpiUtil.fromSaHpiTextBufferT( info.MainFwInstance.Description ), info.MainFwInstance.MajorVersion, info.MainFwInstance.MinorVersion, info.MainFwInstance.AuxVersion ); } // Target components System.out.printf( " Target Components:\n" ); for ( SaHpiFumiComponentInfoT info : HpiCollections.FumiTargetComponents( sid, rid, fuminum, 0 ) ) { System.out.printf( " Component %d: %s: FW %d.%d.%d\n", info.ComponentId, HpiUtil.fromSaHpiTextBufferT( info.MainFwInstance.Description ), info.MainFwInstance.MajorVersion, info.MainFwInstance.MinorVersion, info.MainFwInstance.AuxVersion ); } // Logical Target components System.out.printf( " Logical Target Components:\n" ); for ( SaHpiFumiLogicalComponentInfoT info : HpiCollections.FumiLogicalTargetComponents( sid, rid, fuminum ) ) { System.out.printf( " Component %d:\n", info.ComponentId ); if ( info.PendingFwInstance.InstancePresent != SAHPI_FALSE ) { System.out.printf( " Pending FW %d.%d.%d:\n", info.PendingFwInstance.MajorVersion, info.PendingFwInstance.MinorVersion, info.PendingFwInstance.AuxVersion ); } if ( info.RollbackFwInstance.InstancePresent != SAHPI_FALSE ) { System.out.printf( " Rollback FW %d.%d.%d:\n", info.RollbackFwInstance.MajorVersion, info.RollbackFwInstance.MinorVersion, info.RollbackFwInstance.AuxVersion ); } } } } rv = saHpiSessionClose( sid ); if ( rv != SA_OK ) { System.out.printf( "Error: saHpiSessionClose: %d\n", rv ); return; } } catch ( Exception e ) { System.out.printf( "Got exception: %s!\n", e.getMessage() ); } finally { System.out.println( "End" ); } } }; openhpi-3.6.1/baselibs/java/example/0000755000175100017510000000000012575650556016333 5ustar mohanmohanopenhpi-3.6.1/baselibs/java/example/Example.java0000644000175100017510000000670312575647300020570 0ustar mohanmohan/* -*- java -*- * * Copyright (C) 2012, Pigeon Point Systems * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ import static org.openhpi.Hpi.*; import static org.openhpi.HpiDataTypes.*; import static org.openhpi.Ohpi.*; import static org.openhpi.OhpiDataTypes.*; import org.openhpi.HpiUtil; public class Example { public static void main( String[] args ) { try { long version = oHpiVersionGet(); System.out.printf( "OpenHPI baselib package version: 0x%x\n", version ); long rv; long did; long sid; oHpiDomainAddOutputParamsT oa = new oHpiDomainAddOutputParamsT(); rv = oHpiDomainAdd( HpiUtil.toSaHpiTextBufferT( "localhost" ), OPENHPI_DEFAULT_DAEMON_PORT, HpiUtil.makeRootSaHpiEntityPathT(), oa ); if ( rv != SA_OK ) { System.out.printf( "Error: oHpiDomainAdd: %d\n", rv ); return; } did = oa.DomainId; System.out.printf( "DID = %d\n", did ); saHpiSessionOpenOutputParamsT oo = new saHpiSessionOpenOutputParamsT(); rv = saHpiSessionOpen( did, null, oo ); if ( rv != SA_OK ) { System.out.printf( "Error: saHpiSessionOpen: %d\n", rv ); return; } sid = oo.SessionId; System.out.printf( "SID = %d\n", sid ); saHpiMyEntityPathGetOutputParamsT om = new saHpiMyEntityPathGetOutputParamsT(); rv = saHpiMyEntityPathGet( sid, om ); if ( rv == SA_OK ) { System.out.printf( "My entity: %s\n", HpiUtil.fromSaHpiEntityPathT( om.EntityPath ) ); } System.out.printf( "Resource List:\n" ); saHpiRptEntryGetOutputParamsT or = new saHpiRptEntryGetOutputParamsT(); long eid = SAHPI_FIRST_ENTRY; do { rv = saHpiRptEntryGet( sid, eid, or ); if ( ( eid == SAHPI_FIRST_ENTRY ) && ( rv == SA_ERR_HPI_NOT_PRESENT ) ) { break; } if ( rv != SA_OK ) { System.out.printf( "Error: saHpiRptEntryGet: %d\n", rv ); return; } System.out.printf( " HPI Resource %d: %s: %s\n", or.RptEntry.ResourceId, HpiUtil.fromSaHpiTextBufferT( or.RptEntry.ResourceTag ), HpiUtil.fromSaHpiEntityPathT( or.RptEntry.ResourceEntity ) ); eid = or.NextEntryId; } while ( eid != SAHPI_LAST_ENTRY ); rv = saHpiSessionClose( sid ); if ( rv != SA_OK ) { System.out.printf( "Error: saHpiSessionClose: %d\n", rv ); return; } } catch ( Exception e ) { System.out.printf( "Got exception: %s!\n", e.getMessage() ); } finally { System.out.println( "End" ); } } }; openhpi-3.6.1/baselibs/java/example_handlers/0000755000175100017510000000000012575650556020213 5ustar mohanmohanopenhpi-3.6.1/baselibs/java/example_handlers/ExampleHandlers.java0000644000175100017510000001334412575647300024130 0ustar mohanmohan/* -*- java -*- * * Copyright (C) 2012, Pigeon Point Systems * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import static org.openhpi.Hpi.*; import static org.openhpi.HpiDataTypes.*; import static org.openhpi.Ohpi.*; import static org.openhpi.OhpiDataTypes.*; import org.openhpi.HpiUtil; import org.openhpi.OhpiUtil; import org.openhpi.OhpiCollections; public class ExampleHandlers { public static void main( String[] args ) { try { long rv; saHpiSessionOpenOutputParamsT oo = new saHpiSessionOpenOutputParamsT(); rv = saHpiSessionOpen( SAHPI_UNSPECIFIED_DOMAIN_ID, null, oo ); if ( rv != SA_OK ) { System.out.printf( "Error: saHpiSessionOpen: %d\n", rv ); return; } long sid = oo.SessionId; long hid; long last_hid = SAHPI_LAST_ENTRY; // List all handlers oHpiHandlerGetNextOutputParamsT ogn = new oHpiHandlerGetNextOutputParamsT(); hid = SAHPI_FIRST_ENTRY; do { rv = oHpiHandlerGetNext( sid, hid, ogn ); if ( rv == SA_ERR_HPI_NOT_PRESENT ) { break; } if ( rv != SA_OK ) { System.out.printf( "Error: oHpiHandlerGetNext: %d\n", rv ); break; } hid = ogn.NextHandlerId; last_hid = hid; System.out.printf( "Handler %d\n", hid ); oHpiHandlerInfoOutputParamsT oi = new oHpiHandlerInfoOutputParamsT(); rv = oHpiHandlerInfo( sid, hid, oi ); if ( rv != SA_OK ) { System.out.printf( "Error: oHpiHandlerInfo: %d\n", rv ); continue; } oHpiHandlerInfoT hinfo = oi.HandlerInfo; oHpiHandlerConfigT hconf = oi.HandlerConfig; System.out.printf( " Info\n" ); System.out.printf( " id %d\n", hinfo.id ); System.out.printf( " name %s\n", new String( hinfo.plugin_name, "US-ASCII" ) ); System.out.printf( " entity_root %s\n", HpiUtil.fromSaHpiEntityPathT( hinfo.entity_root ) ); System.out.printf( " load_failed %d\n", hinfo.load_failed ); System.out.printf( " Config\n" ); Map m = OhpiUtil.fromoHpiHandlerConfigT( hconf ); for ( Entry kv : m.entrySet() ) { System.out.printf( " %s = %s\n", kv.getKey(), kv.getValue() ); } } while ( hid != SAHPI_LAST_ENTRY ); // List all handlers with OhpiCollections System.out.printf( "List all handlers with OhpiCollections:\n" ); for ( long hid2 : OhpiCollections.HandlerIds( sid ) ) { System.out.printf( " Handler %d\n", hid2 ); } // Retry last handler if ( last_hid != SAHPI_LAST_ENTRY ) { System.out.printf( "Re-trying last handler: %d\n", last_hid ); rv = oHpiHandlerRetry( sid, last_hid ); if ( rv != SA_OK ) { System.out.printf( "Error: oHpiHandlerRetry: %d\n", rv ); } } // Destroy last handler if ( last_hid != SAHPI_LAST_ENTRY ) { System.out.printf( "Destroying last handler: %d\n", last_hid ); rv = oHpiHandlerDestroy( sid, last_hid ); if ( rv != SA_OK ) { System.out.printf( "Error: oHpiHandlerDestroy: %d\n", rv ); } } // Look for handler providing specified resource { long rid = 5; oHpiHandlerFindOutputParamsT of = new oHpiHandlerFindOutputParamsT(); rv = oHpiHandlerFind( sid, rid, of ); if ( rv != SA_OK ) { System.out.printf( "Error: oHpiHandlerFind: %d\n", rv ); } hid = of.HandlerId; System.out.printf( "Resource %d is provided by handler %d\n", rid, hid ); } // Create new instance of test_agent plugin { System.out.printf( "Creating new handler\n" ); HashMap m = new HashMap(); m.put( "plugin", "libtest_agent" ); m.put( "port", "12345" ); oHpiHandlerConfigT hconf = OhpiUtil.tooHpiHandlerConfigT( m ); oHpiHandlerCreateOutputParamsT oc = new oHpiHandlerCreateOutputParamsT(); rv = oHpiHandlerCreate( sid, hconf, oc ); if ( rv == SA_OK ) { hid = oc.HandlerId; System.out.printf( "Created handler %d\n", hid ); } else { System.out.printf( "Error: oHpiHandlerCreate: %d\n", rv ); } } rv = saHpiSessionClose( sid ); if ( rv != SA_OK ) { System.out.printf( "Error: saHpiSessionClose: %d\n", rv ); return; } } catch ( Exception e ) { System.out.printf( "Got exception: %s!\n", e.getMessage() ); } finally { System.out.println( "End" ); } } }; openhpi-3.6.1/baselibs/java/README0000644000175100017510000001153212575647300015553 0ustar mohanmohan================================================================================ This is Java implementation of OpenHPI baselib. The implementation is a file named openhpi_baselib.jar. The implementation has been tested with Oracle JDK 1.6 and 1.7. ================================================================================ Build and Install Instructions: - Run "ant". ================================================================================ Usage Example: See example/ as an example of using the Java OpenHPI baselib. See example_handlers/ as an example of using the oHpiHandler*() API. See example_collections/ as an example of using the Java OpenHPI collections. Default domain address is "localhost" or OPENHPI_DAEMON_HOST env. var. value. Default domain address is 4743 or OPENHPI_DAEMON_PORT env. var. value. ================================================================================ Datatypes and API Representation: All SAF HPI integer data types: - SaHpiBoolT, SaHpiUint8(16,32,64)T, SaHpiInt8(16,32,64)T, enum types are mapped to Java long type. One exception: arrays of SaHpiUint8T are mapped to Java byte[] type. Every SAF HPI struct or union is mapped to Java class. The class name is the same as for the corresponding SAF HPI struct or union. The class contais only public fields with the same names as the corresponding SAF HPI struct or union fields have. SAF HPI constants are defined in the HpiDataTypes class. OpenHPI-specific constants are defined in the OhpiDataTypes class. SAF HPI API are defined in the Hpi class. OpenHPI API are defined in the OHpi class. API parameters are mapped as the following: - SAHPI_IN parameter is mapped to the ordinary Java function parameter. - SAHPI_INOUT, SAHPI_OUT and SAHPI_OUTNN parameters are collected to a single holder parameter. So user only has to allocate holder parameter and its SAHPI_INOUT content. Example: SaErrorT SAHPI_API saHpiGetIdByEntityPath ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiEntityPathT EntityPath, SAHPI_IN SaHpiRdrTypeT InstrumentType, SAHPI_INOUT SaHpiUint32T *InstanceId, SAHPI_OUT SaHpiResourceIdT *ResourceId, SAHPI_OUT SaHpiInstrumentIdT *InstrumentId, SAHPI_OUT SaHpiUint32T *RptUpdateCount ); is represented as public static long saHpiGetIdByEntityPath( long SessionId, SaHpiEntityPathT EntityPath, long InstrumentType, long InstanceId, saHpiGetIdByEntityPathOutputParamsT out ) throws HpiException; where saHpiGetIdByEntityPathOutputParamsT is public static class saHpiGetIdByEntityPathOutputParamsT { public long InstanceId; public long ResourceId; public long InstrumentId; public long RptUpdateCount; }; ================================================================================ Utilities: HpiUtil class provides the following utility functions: - Set of functions for checking validity of an object of a complex HPI data type X (representation of SAF HPI struct X): -- public static bool check( X x ) --- The validation checks are: ---- x is not null ---- Any member of x that is of a complex data types is valid ---- If a member of x is a SaHpiUint8T[] array then the array length is valid. - Set of functions for checking validity of an object of a complex HPI data type X (representation of SAF HPI union X): -- public static bool check( X x, long mod ) ---- x is not null ---- A member of x that matches modifier mod and is of a complex data types is valid ---- If a member of x that matches modifier mod is a SaHpiUint8T[] array then the array length is valid. - For string <-> integer HPI Data Type X conversion: -- public static string fromX( long x ) - (for example FromSaHpiEventCategoryT) -- public static long toX( string s ) - (for example ToSaHpiEventCategoryT) - For string <-> complex HPI Data Type conversion: -- public static string fromSaHpiTextBufferT( SaHpiTextBufferT tb ) -- public static SaHpiTextBufferT toSaHpiTextBufferT( string s ) -- public static string fromSaHpiEntityPathT( SaHpiEntityPathT ep ) -- public static SaHpiEntityPathT toSaHpiEntityPathT( string s ) - For making unspecified, empty entity path and for entity path cloning: - public static SaHpiEntityPathT makeUnspecifiedSaHpiEntityPathT() - public static SaHpiEntityPathT makeRootSaHpiEntityPathT() - public static SaHpiEntityPathT cloneSaHpiEntityPathT( SaHpiEntityPathT ep ) ================================================================================ Current Limitations: - Only oHpiVersionGet(), oHpiDomainAdd() and oHpiHandler*() OpenHPI API are supported - openhpiclient.conf is not supported ================================================================================ TODO List: - Implemented openhpiclient.conf support - Implement the rest of OpenHPI API - Domain ID translation for SAF HPI API - Entity root translation for SAF HPI API - XTCA entity types in HpiUtils openhpi-3.6.1/baselibs/java/build.xml0000644000175100017510000000243312575647300016514 0ustar mohanmohan openhpi-3.6.1/baselibs/java/openhpi_baselib/0000755000175100017510000000000012575650556020023 5ustar mohanmohanopenhpi-3.6.1/baselibs/java/openhpi_baselib/OhpiDataTypes.java0000644000175100017510000003354512575647300023407 0ustar mohanmohan/* -*- java -*- * * Copyright (C) 2012, Pigeon Point Systems * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ package org.openhpi; import java.util.List; import java.util.Map.Entry; import static org.openhpi.HpiDataTypes.*; public class OhpiDataTypes { // Just to ensure nobody creates it protected OhpiDataTypes() { // empty } /********************************************************** * OHPI RPC IDs *********************************************************/ public static final int RPC_SAHPI_NULL = 0; public static final int RPC_SAHPI_SESSION_OPEN = 1; public static final int RPC_SAHPI_SESSION_CLOSE = 2; public static final int RPC_SAHPI_DISCOVER = 3; public static final int RPC_SAHPI_DOMAIN_INFO_GET = 4; public static final int RPC_SAHPI_DRT_ENTRY_GET = 5; public static final int RPC_SAHPI_DOMAIN_TAG_SET = 6; public static final int RPC_SAHPI_RPT_ENTRY_GET = 7; public static final int RPC_SAHPI_RPT_ENTRY_GET_BY_RESOURCE_ID = 8; public static final int RPC_SAHPI_RESOURCE_SEVERITY_SET = 9; public static final int RPC_SAHPI_RESOURCE_TAG_SET = 10; public static final int RPC_SAHPI_RESOURCE_ID_GET = 11; public static final int RPC_SAHPI_GET_ID_BY_ENTITY_PATH = 12; public static final int RPC_SAHPI_GET_CHILD_ENTITY_PATH = 13; public static final int RPC_SAHPI_RESOURCE_FAILED_REMOVE = 14; public static final int RPC_SAHPI_EVENT_LOG_INFO_GET = 15; public static final int RPC_SAHPI_EVENT_LOG_CAPABILITIES_GET = 16; public static final int RPC_SAHPI_EVENT_LOG_ENTRY_GET = 17; public static final int RPC_SAHPI_EVENT_LOG_ENTRY_ADD = 18; public static final int RPC_SAHPI_EVENT_LOG_CLEAR = 19; public static final int RPC_SAHPI_EVENT_LOG_TIME_GET = 20; public static final int RPC_SAHPI_EVENT_LOG_TIME_SET = 21; public static final int RPC_SAHPI_EVENT_LOG_STATE_GET = 22; public static final int RPC_SAHPI_EVENT_LOG_STATE_SET = 23; public static final int RPC_SAHPI_EVENT_LOG_OVERFLOW_RESET = 24; public static final int RPC_SAHPI_SUBSCRIBE = 25; public static final int RPC_SAHPI_UNSUBSCRIBE = 26; public static final int RPC_SAHPI_EVENT_GET = 27; public static final int RPC_SAHPI_EVENT_ADD = 28; public static final int RPC_SAHPI_ALARM_GET_NEXT = 29; public static final int RPC_SAHPI_ALARM_GET = 30; public static final int RPC_SAHPI_ALARM_ACKNOWLEDGE = 31; public static final int RPC_SAHPI_ALARM_ADD = 32; public static final int RPC_SAHPI_ALARM_DELETE = 33; public static final int RPC_SAHPI_RDR_GET = 34; public static final int RPC_SAHPI_RDR_GET_BY_INSTRUMENT_ID = 35; public static final int RPC_SAHPI_SENSOR_READING_GET = 36; public static final int RPC_SAHPI_SENSOR_THRESHOLDS_GET = 37; public static final int RPC_SAHPI_SENSOR_THRESHOLDS_SET = 38; public static final int RPC_SAHPI_SENSOR_TYPE_GET = 39; public static final int RPC_SAHPI_SENSOR_ENABLE_GET = 40; public static final int RPC_SAHPI_SENSOR_ENABLE_SET = 41; public static final int RPC_SAHPI_SENSOR_EVENT_ENABLE_GET = 42; public static final int RPC_SAHPI_SENSOR_EVENT_ENABLE_SET = 43; public static final int RPC_SAHPI_SENSOR_EVENT_MASKS_GET = 44; public static final int RPC_SAHPI_SENSOR_EVENT_MASKS_SET = 45; public static final int RPC_SAHPI_CONTROL_TYPE_GET = 46; public static final int RPC_SAHPI_CONTROL_GET = 47; public static final int RPC_SAHPI_CONTROL_SET = 48; public static final int RPC_SAHPI_IDR_INFO_GET = 49; public static final int RPC_SAHPI_IDR_AREA_HEADER_GET = 50; public static final int RPC_SAHPI_IDR_AREA_ADD = 51; public static final int RPC_SAHPI_IDR_AREA_ADD_BY_ID = 52; public static final int RPC_SAHPI_IDR_AREA_DELETE = 53; public static final int RPC_SAHPI_IDR_FIELD_GET = 54; public static final int RPC_SAHPI_IDR_FIELD_ADD = 55; public static final int RPC_SAHPI_IDR_FIELD_ADD_BY_ID = 56; public static final int RPC_SAHPI_IDR_FIELD_SET = 57; public static final int RPC_SAHPI_IDR_FIELD_DELETE = 58; public static final int RPC_SAHPI_WATCHDOG_TIMER_GET = 59; public static final int RPC_SAHPI_WATCHDOG_TIMER_SET = 60; public static final int RPC_SAHPI_WATCHDOG_TIMER_RESET = 61; public static final int RPC_SAHPI_ANNUNCIATOR_GET_NEXT = 62; public static final int RPC_SAHPI_ANNUNCIATOR_GET = 63; public static final int RPC_SAHPI_ANNUNCIATOR_ACKNOWLEDGE = 64; public static final int RPC_SAHPI_ANNUNCIATOR_ADD = 65; public static final int RPC_SAHPI_ANNUNCIATOR_DELETE = 66; public static final int RPC_SAHPI_ANNUNCIATOR_MODE_GET = 67; public static final int RPC_SAHPI_ANNUNCIATOR_MODE_SET = 68; public static final int RPC_SAHPI_DIMI_INFO_GET = 69; public static final int RPC_SAHPI_DIMI_TEST_INFO_GET = 70; public static final int RPC_SAHPI_DIMI_TEST_READINESS_GET = 71; public static final int RPC_SAHPI_DIMI_TEST_START = 72; public static final int RPC_SAHPI_DIMI_TEST_CANCEL = 73; public static final int RPC_SAHPI_DIMI_TEST_STATUS_GET = 74; public static final int RPC_SAHPI_DIMI_TEST_RESULTS_GET = 75; public static final int RPC_SAHPI_FUMI_SOURCE_SET = 76; public static final int RPC_SAHPI_FUMI_SOURCE_INFO_VALIDATE_START = 77; public static final int RPC_SAHPI_FUMI_SOURCE_INFO_GET = 78; public static final int RPC_SAHPI_FUMI_TARGET_INFO_GET = 79; public static final int RPC_SAHPI_FUMI_BACKUP_START = 80; public static final int RPC_SAHPI_FUMI_BANK_BOOT_ORDER_SET = 81; public static final int RPC_SAHPI_FUMI_BANK_COPY_START = 82; public static final int RPC_SAHPI_FUMI_INSTALL_START = 83; public static final int RPC_SAHPI_FUMI_UPGRADE_STATUS_GET = 84; public static final int RPC_SAHPI_FUMI_TARGET_VERIFY_START = 85; public static final int RPC_SAHPI_FUMI_UPGRADE_CANCEL = 86; public static final int RPC_SAHPI_FUMI_ROLLBACK_START = 87; public static final int RPC_SAHPI_FUMI_ACTIVATE = 88; public static final int RPC_SAHPI_HOTSWAP_POLICY_CANCEL = 89; public static final int RPC_SAHPI_RESOURCE_ACTIVE_SET = 90; public static final int RPC_SAHPI_RESOURCE_INACTIVE_SET = 91; public static final int RPC_SAHPI_AUTO_INSERT_TIMEOUT_GET = 92; public static final int RPC_SAHPI_AUTO_INSERT_TIMEOUT_SET = 93; public static final int RPC_SAHPI_AUTO_EXTRACT_TIMEOUT_GET = 94; public static final int RPC_SAHPI_AUTO_EXTRACT_TIMEOUT_SET = 95; public static final int RPC_SAHPI_HOTSWAP_STATE_GET = 96; public static final int RPC_SAHPI_HOTSWAP_ACTION_REQUEST = 97; public static final int RPC_SAHPI_HOTSWAP_INDICATOR_STATE_GET = 98; public static final int RPC_SAHPI_HOTSWAP_INDICATOR_STATE_SET = 99; public static final int RPC_SAHPI_PARM_CONTROL = 100; public static final int RPC_SAHPI_RESOURCE_LOADID_GET = 101; public static final int RPC_SAHPI_RESOURCE_LOADID_SET = 102; public static final int RPC_SAHPI_RESOURCE_RESET_STATE_GET = 103; public static final int RPC_SAHPI_RESOURCE_RESET_STATE_SET = 104; public static final int RPC_SAHPI_RESOURCE_POWER_STATE_GET = 105; public static final int RPC_SAHPI_RESOURCE_POWER_STATE_SET = 106; public static final int RPC_OHPI_HANDLER_CREATE = 107; public static final int RPC_OHPI_HANDLER_DESTROY = 108; public static final int RPC_OHPI_HANDLER_INFO = 109; public static final int RPC_OHPI_HANDLER_GET_NEXT = 110; public static final int RPC_OHPI_HANDLER_FIND = 111; public static final int RPC_OHPI_HANDLER_RETRY = 112; public static final int RPC_OHPI_GLOBAL_PARAM_GET = 113; public static final int RPC_OHPI_GLOBAL_PARAM_SET = 114; public static final int RPC_OHPI_INJECT_EVENT = 115; public static final int RPC_SAHPI_MY_ENTITY_PATH_GET = 116; public static final int RPC_SAHPI_RDR_UPDATE_COUNT_GET = 117; public static final int RPC_SAHPI_FUMI_SPEC_INFO_GET = 118; public static final int RPC_SAHPI_FUMI_SERVICE_IMPACT_GET = 119; public static final int RPC_SAHPI_FUMI_SOURCE_COMPONENT_INFO_GET = 120; public static final int RPC_SAHPI_FUMI_TARGET_COMPONENT_INFO_GET = 121; public static final int RPC_SAHPI_FUMI_LOGICAL_TARGET_INFO_GET = 122; public static final int RPC_SAHPI_FUMI_LOGICAL_TARGET_COMPONENT_INFO_GET = 123; public static final int RPC_SAHPI_FUMI_TARGET_VERIFY_MAIN_START = 124; public static final int RPC_SAHPI_FUMI_AUTO_ROLLBACK_DISABLE_GET = 125; public static final int RPC_SAHPI_FUMI_AUTO_ROLLBACK_DISABLE_SET = 126; public static final int RPC_SAHPI_FUMI_ACTIVATE_START = 127; public static final int RPC_SAHPI_FUMI_CLEANUP = 128; /********************************************************** * OHPI Constants *********************************************************/ public static final int OPENHPI_DEFAULT_DAEMON_PORT = 4743; public static final long OPENHPI_DEFAULT_DOMAIN_ID = 0L; public static final int OPENHPI_MAX_PLUGIN_NAME_LENGTH = 32; /********************************************************** * OHPI Simple Data Types Map *********************************************************/ /********************************************************** * oHpiHandlerIdT : long *********************************************************/ /********************************************************** * OHPI Complex Data Types *********************************************************/ /** * OHPI struct oHpiHandlerInfoT */ public static class oHpiHandlerInfoT { public long id; // Byte[OPENHPI_MAX_PLUGIN_NAME_LENGTH] public byte[] plugin_name; public SaHpiEntityPathT entity_root; public long load_failed; }; /** * OHPI struct oHpiHandlerConfigT */ public static class oHpiHandlerConfigT { // List of ( name, value ) pairs // Both name and value are arrays if SAHPI_MAX_TEXT_BUFFER_LENGTH elements public List< Entry > items; }; /********************************************************** * OHPI API Returns Types (NB: Partly implemented) *********************************************************/ /** * Represents output parameters * for oHpiDomainAdd(). */ public static class oHpiDomainAddOutputParamsT { public long DomainId; }; /** * Represents output parameters * for oHpiHandlerCreate(). */ public static class oHpiHandlerCreateOutputParamsT { public long HandlerId; }; /** * Represents output parameters * for oHpiHandlerInfo(). */ public static class oHpiHandlerInfoOutputParamsT { public oHpiHandlerInfoT HandlerInfo; public oHpiHandlerConfigT HandlerConfig; }; /** * Represents output parameters * for oHpiHandlerGetNext(). */ public static class oHpiHandlerGetNextOutputParamsT { public long NextHandlerId; }; /** * Represents output parameters * for oHpiHandlerFind(). */ public static class oHpiHandlerFindOutputParamsT { public long HandlerId; }; }; openhpi-3.6.1/baselibs/java/openhpi_baselib/HpiDomain.java0000644000175100017510000000361612575647300022535 0ustar mohanmohan/* -*- java -*- * * Copyright (C) 2012, Pigeon Point Systems * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ package org.openhpi; import static org.openhpi.HpiDataTypes.SAHPI_UNSPECIFIED_DOMAIN_ID; import static org.openhpi.HpiDataTypes.SaHpiEntityPathT; class HpiDomain { private long local_did; private long remote_did; private String remote_host; private int remote_port; private SaHpiEntityPathT entity_root; HpiDomain( long local_did, String remote_host, int remote_port, SaHpiEntityPathT entity_root ) { this.local_did = local_did; this.remote_did = SAHPI_UNSPECIFIED_DOMAIN_ID; this.remote_host = remote_host; this.remote_port = remote_port; this.entity_root = entity_root; } HpiDomain( HpiDomain other ) { this.local_did = other.local_did; this.remote_did = other.remote_did; this.remote_host = other.remote_host; this.remote_port = other.remote_port; this.entity_root = other.entity_root; } long getLocalDid() { return local_did; } void setLocalDid( long local_did ) { this.local_did = local_did; } long getRemoteDid() { return remote_did; } String getRemoteHost() { return remote_host; } int getRemotePort() { return remote_port; } SaHpiEntityPathT getEntityRoot() { return entity_root; } }; openhpi-3.6.1/baselibs/java/openhpi_baselib/HpiMarshalGen.java0000644000175100017510000025252112575647300023350 0ustar mohanmohan/* -*- java -*- * * Copyright (C) 2012, Pigeon Point Systems * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ package org.openhpi; import static org.openhpi.HpiDataTypes.*; /********************************************************** * HPI Marshal (auto-generated) *********************************************************/ class HpiMarshalGen extends HpiMarshalCore { /********************************************************** * Marshal: For HPI Simple Data Types *********************************************************/ public void marshalSaHpiBoolT( long x ) { marshalSaHpiUint8T( x ); } public void marshalSaHpiManufacturerIdT( long x ) { marshalSaHpiUint32T( x ); } public void marshalSaHpiVersionT( long x ) { marshalSaHpiUint32T( x ); } public void marshalSaErrorT( long x ) { marshalSaHpiInt32T( x ); } public void marshalSaHpiDomainIdT( long x ) { marshalSaHpiUint32T( x ); } public void marshalSaHpiSessionIdT( long x ) { marshalSaHpiUint32T( x ); } public void marshalSaHpiResourceIdT( long x ) { marshalSaHpiUint32T( x ); } public void marshalSaHpiEntryIdT( long x ) { marshalSaHpiUint32T( x ); } public void marshalSaHpiTimeT( long x ) { marshalSaHpiInt64T( x ); } public void marshalSaHpiTimeoutT( long x ) { marshalSaHpiInt64T( x ); } public void marshalSaHpiInstrumentIdT( long x ) { marshalSaHpiUint32T( x ); } public void marshalSaHpiEntityLocationT( long x ) { marshalSaHpiUint32T( x ); } public void marshalSaHpiEventCategoryT( long x ) { marshalSaHpiUint8T( x ); } public void marshalSaHpiEventStateT( long x ) { marshalSaHpiUint16T( x ); } public void marshalSaHpiSensorNumT( long x ) { marshalSaHpiInstrumentIdT( x ); } public void marshalSaHpiSensorRangeFlagsT( long x ) { marshalSaHpiUint8T( x ); } public void marshalSaHpiSensorThdMaskT( long x ) { marshalSaHpiUint8T( x ); } public void marshalSaHpiCtrlNumT( long x ) { marshalSaHpiInstrumentIdT( x ); } public void marshalSaHpiCtrlStateDiscreteT( long x ) { marshalSaHpiUint32T( x ); } public void marshalSaHpiCtrlStateAnalogT( long x ) { marshalSaHpiInt32T( x ); } public void marshalSaHpiTxtLineNumT( long x ) { marshalSaHpiUint8T( x ); } public void marshalSaHpiIdrIdT( long x ) { marshalSaHpiInstrumentIdT( x ); } public void marshalSaHpiWatchdogNumT( long x ) { marshalSaHpiInstrumentIdT( x ); } public void marshalSaHpiWatchdogExpFlagsT( long x ) { marshalSaHpiUint8T( x ); } public void marshalSaHpiDimiNumT( long x ) { marshalSaHpiInstrumentIdT( x ); } public void marshalSaHpiDimiTestCapabilityT( long x ) { marshalSaHpiUint32T( x ); } public void marshalSaHpiDimiTestNumT( long x ) { marshalSaHpiUint32T( x ); } public void marshalSaHpiDimiTestPercentCompletedT( long x ) { marshalSaHpiUint8T( x ); } public void marshalSaHpiFumiNumT( long x ) { marshalSaHpiInstrumentIdT( x ); } public void marshalSaHpiBankNumT( long x ) { marshalSaHpiUint8T( x ); } public void marshalSaHpiFumiLogicalBankStateFlagsT( long x ) { marshalSaHpiUint32T( x ); } public void marshalSaHpiFumiProtocolT( long x ) { marshalSaHpiUint32T( x ); } public void marshalSaHpiFumiCapabilityT( long x ) { marshalSaHpiUint32T( x ); } public void marshalSaHpiSensorOptionalDataT( long x ) { marshalSaHpiUint8T( x ); } public void marshalSaHpiSensorEnableOptDataT( long x ) { marshalSaHpiUint8T( x ); } public void marshalSaHpiEvtQueueStatusT( long x ) { marshalSaHpiUint32T( x ); } public void marshalSaHpiAnnunciatorNumT( long x ) { marshalSaHpiInstrumentIdT( x ); } public void marshalSaHpiLoadNumberT( long x ) { marshalSaHpiUint32T( x ); } public void marshalSaHpiCapabilitiesT( long x ) { marshalSaHpiUint32T( x ); } public void marshalSaHpiHsCapabilitiesT( long x ) { marshalSaHpiUint32T( x ); } public void marshalSaHpiDomainCapabilitiesT( long x ) { marshalSaHpiUint32T( x ); } public void marshalSaHpiAlarmIdT( long x ) { marshalSaHpiEntryIdT( x ); } public void marshalSaHpiEventLogCapabilitiesT( long x ) { marshalSaHpiUint32T( x ); } public void marshalSaHpiEventLogEntryIdT( long x ) { marshalSaHpiUint32T( x ); } public void marshalSaHpiLanguageT( long x ) { marshalEnum( x ); } public void marshalSaHpiTextTypeT( long x ) { marshalEnum( x ); } public void marshalSaHpiEntityTypeT( long x ) { marshalEnum( x ); } public void marshalSaHpiSensorTypeT( long x ) { marshalEnum( x ); } public void marshalSaHpiSensorReadingTypeT( long x ) { marshalEnum( x ); } public void marshalSaHpiSensorEventMaskActionT( long x ) { marshalEnum( x ); } public void marshalSaHpiSensorUnitsT( long x ) { marshalEnum( x ); } public void marshalSaHpiSensorModUnitUseT( long x ) { marshalEnum( x ); } public void marshalSaHpiSensorEventCtrlT( long x ) { marshalEnum( x ); } public void marshalSaHpiCtrlTypeT( long x ) { marshalEnum( x ); } public void marshalSaHpiCtrlStateDigitalT( long x ) { marshalEnum( x ); } public void marshalSaHpiCtrlModeT( long x ) { marshalEnum( x ); } public void marshalSaHpiCtrlOutputTypeT( long x ) { marshalEnum( x ); } public void marshalSaHpiIdrAreaTypeT( long x ) { marshalEnum( x ); } public void marshalSaHpiIdrFieldTypeT( long x ) { marshalEnum( x ); } public void marshalSaHpiWatchdogActionT( long x ) { marshalEnum( x ); } public void marshalSaHpiWatchdogActionEventT( long x ) { marshalEnum( x ); } public void marshalSaHpiWatchdogPretimerInterruptT( long x ) { marshalEnum( x ); } public void marshalSaHpiWatchdogTimerUseT( long x ) { marshalEnum( x ); } public void marshalSaHpiDimiTestServiceImpactT( long x ) { marshalEnum( x ); } public void marshalSaHpiDimiTestRunStatusT( long x ) { marshalEnum( x ); } public void marshalSaHpiDimiTestErrCodeT( long x ) { marshalEnum( x ); } public void marshalSaHpiDimiTestParamTypeT( long x ) { marshalEnum( x ); } public void marshalSaHpiDimiReadyT( long x ) { marshalEnum( x ); } public void marshalSaHpiFumiSpecInfoTypeT( long x ) { marshalEnum( x ); } public void marshalSaHpiFumiSafDefinedSpecIdT( long x ) { marshalEnum( x ); } public void marshalSaHpiFumiServiceImpactT( long x ) { marshalEnum( x ); } public void marshalSaHpiFumiSourceStatusT( long x ) { marshalEnum( x ); } public void marshalSaHpiFumiBankStateT( long x ) { marshalEnum( x ); } public void marshalSaHpiFumiUpgradeStatusT( long x ) { marshalEnum( x ); } public void marshalSaHpiHsIndicatorStateT( long x ) { marshalEnum( x ); } public void marshalSaHpiHsActionT( long x ) { marshalEnum( x ); } public void marshalSaHpiHsStateT( long x ) { marshalEnum( x ); } public void marshalSaHpiHsCauseOfStateChangeT( long x ) { marshalEnum( x ); } public void marshalSaHpiSeverityT( long x ) { marshalEnum( x ); } public void marshalSaHpiResourceEventTypeT( long x ) { marshalEnum( x ); } public void marshalSaHpiDomainEventTypeT( long x ) { marshalEnum( x ); } public void marshalSaHpiSwEventTypeT( long x ) { marshalEnum( x ); } public void marshalSaHpiEventTypeT( long x ) { marshalEnum( x ); } public void marshalSaHpiStatusCondTypeT( long x ) { marshalEnum( x ); } public void marshalSaHpiAnnunciatorModeT( long x ) { marshalEnum( x ); } public void marshalSaHpiAnnunciatorTypeT( long x ) { marshalEnum( x ); } public void marshalSaHpiRdrTypeT( long x ) { marshalEnum( x ); } public void marshalSaHpiParmActionT( long x ) { marshalEnum( x ); } public void marshalSaHpiResetActionT( long x ) { marshalEnum( x ); } public void marshalSaHpiPowerStateT( long x ) { marshalEnum( x ); } public void marshalSaHpiEventLogOverflowActionT( long x ) { marshalEnum( x ); } /********************************************************** * Marshal: For HPI Structs and Unions *********************************************************/ public void marshalSaHpiTextBufferT( SaHpiTextBufferT x ) { marshalSaHpiTextTypeT( x.DataType ); marshalSaHpiLanguageT( x.Language ); marshalSaHpiUint8T( x.DataLength ); marshalByteArray( x.Data, SAHPI_MAX_TEXT_BUFFER_LENGTH ); } public void marshalSaHpiEntityT( SaHpiEntityT x ) { marshalSaHpiEntityTypeT( x.EntityType ); marshalSaHpiEntityLocationT( x.EntityLocation ); } public void marshalSaHpiEntityPathT( SaHpiEntityPathT x ) { for ( int i = 0; i < SAHPI_MAX_ENTITY_PATH; ++i ) { marshalSaHpiEntityT( x.Entry[i] ); } } public void marshalSaHpiSensorReadingUnionT( SaHpiSensorReadingUnionT x, long mod ) { if ( mod == SAHPI_SENSOR_READING_TYPE_INT64 ) { marshalSaHpiInt64T( x.SensorInt64 ); } if ( mod == SAHPI_SENSOR_READING_TYPE_UINT64 ) { marshalSaHpiUint64T( x.SensorUint64 ); } if ( mod == SAHPI_SENSOR_READING_TYPE_FLOAT64 ) { marshalSaHpiFloat64T( x.SensorFloat64 ); } if ( mod == SAHPI_SENSOR_READING_TYPE_BUFFER ) { marshalByteArray( x.SensorBuffer, SAHPI_SENSOR_BUFFER_LENGTH ); } } public void marshalSaHpiSensorReadingT( SaHpiSensorReadingT x ) { marshalSaHpiBoolT( x.IsSupported ); marshalSaHpiSensorReadingTypeT( x.Type ); marshalSaHpiSensorReadingUnionT( x.Value, x.Type ); } public void marshalSaHpiSensorThresholdsT( SaHpiSensorThresholdsT x ) { marshalSaHpiSensorReadingT( x.LowCritical ); marshalSaHpiSensorReadingT( x.LowMajor ); marshalSaHpiSensorReadingT( x.LowMinor ); marshalSaHpiSensorReadingT( x.UpCritical ); marshalSaHpiSensorReadingT( x.UpMajor ); marshalSaHpiSensorReadingT( x.UpMinor ); marshalSaHpiSensorReadingT( x.PosThdHysteresis ); marshalSaHpiSensorReadingT( x.NegThdHysteresis ); } public void marshalSaHpiSensorRangeT( SaHpiSensorRangeT x ) { marshalSaHpiSensorRangeFlagsT( x.Flags ); marshalSaHpiSensorReadingT( x.Max ); marshalSaHpiSensorReadingT( x.Min ); marshalSaHpiSensorReadingT( x.Nominal ); marshalSaHpiSensorReadingT( x.NormalMax ); marshalSaHpiSensorReadingT( x.NormalMin ); } public void marshalSaHpiSensorDataFormatT( SaHpiSensorDataFormatT x ) { marshalSaHpiBoolT( x.IsSupported ); marshalSaHpiSensorReadingTypeT( x.ReadingType ); marshalSaHpiSensorUnitsT( x.BaseUnits ); marshalSaHpiSensorUnitsT( x.ModifierUnits ); marshalSaHpiSensorModUnitUseT( x.ModifierUse ); marshalSaHpiBoolT( x.Percentage ); marshalSaHpiSensorRangeT( x.Range ); marshalSaHpiFloat64T( x.AccuracyFactor ); } public void marshalSaHpiSensorThdDefnT( SaHpiSensorThdDefnT x ) { marshalSaHpiBoolT( x.IsAccessible ); marshalSaHpiSensorThdMaskT( x.ReadThold ); marshalSaHpiSensorThdMaskT( x.WriteThold ); marshalSaHpiBoolT( x.Nonlinear ); } public void marshalSaHpiSensorRecT( SaHpiSensorRecT x ) { marshalSaHpiSensorNumT( x.Num ); marshalSaHpiSensorTypeT( x.Type ); marshalSaHpiEventCategoryT( x.Category ); marshalSaHpiBoolT( x.EnableCtrl ); marshalSaHpiSensorEventCtrlT( x.EventCtrl ); marshalSaHpiEventStateT( x.Events ); marshalSaHpiSensorDataFormatT( x.DataFormat ); marshalSaHpiSensorThdDefnT( x.ThresholdDefn ); marshalSaHpiUint32T( x.Oem ); } public void marshalSaHpiCtrlStateStreamT( SaHpiCtrlStateStreamT x ) { marshalSaHpiBoolT( x.Repeat ); marshalSaHpiUint32T( x.StreamLength ); marshalByteArray( x.Stream, SAHPI_CTRL_MAX_STREAM_LENGTH ); } public void marshalSaHpiCtrlStateTextT( SaHpiCtrlStateTextT x ) { marshalSaHpiTxtLineNumT( x.Line ); marshalSaHpiTextBufferT( x.Text ); } public void marshalSaHpiCtrlStateOemT( SaHpiCtrlStateOemT x ) { marshalSaHpiManufacturerIdT( x.MId ); marshalSaHpiUint8T( x.BodyLength ); marshalByteArray( x.Body, SAHPI_CTRL_MAX_OEM_BODY_LENGTH ); } public void marshalSaHpiCtrlStateUnionT( SaHpiCtrlStateUnionT x, long mod ) { if ( mod == SAHPI_CTRL_TYPE_DIGITAL ) { marshalSaHpiCtrlStateDigitalT( x.Digital ); } if ( mod == SAHPI_CTRL_TYPE_DISCRETE ) { marshalSaHpiCtrlStateDiscreteT( x.Discrete ); } if ( mod == SAHPI_CTRL_TYPE_ANALOG ) { marshalSaHpiCtrlStateAnalogT( x.Analog ); } if ( mod == SAHPI_CTRL_TYPE_STREAM ) { marshalSaHpiCtrlStateStreamT( x.Stream ); } if ( mod == SAHPI_CTRL_TYPE_TEXT ) { marshalSaHpiCtrlStateTextT( x.Text ); } if ( mod == SAHPI_CTRL_TYPE_OEM ) { marshalSaHpiCtrlStateOemT( x.Oem ); } } public void marshalSaHpiCtrlStateT( SaHpiCtrlStateT x ) { marshalSaHpiCtrlTypeT( x.Type ); marshalSaHpiCtrlStateUnionT( x.StateUnion, x.Type ); } public void marshalSaHpiCtrlRecDigitalT( SaHpiCtrlRecDigitalT x ) { marshalSaHpiCtrlStateDigitalT( x.Default ); } public void marshalSaHpiCtrlRecDiscreteT( SaHpiCtrlRecDiscreteT x ) { marshalSaHpiCtrlStateDiscreteT( x.Default ); } public void marshalSaHpiCtrlRecAnalogT( SaHpiCtrlRecAnalogT x ) { marshalSaHpiCtrlStateAnalogT( x.Min ); marshalSaHpiCtrlStateAnalogT( x.Max ); marshalSaHpiCtrlStateAnalogT( x.Default ); } public void marshalSaHpiCtrlRecStreamT( SaHpiCtrlRecStreamT x ) { marshalSaHpiCtrlStateStreamT( x.Default ); } public void marshalSaHpiCtrlRecTextT( SaHpiCtrlRecTextT x ) { marshalSaHpiUint8T( x.MaxChars ); marshalSaHpiUint8T( x.MaxLines ); marshalSaHpiLanguageT( x.Language ); marshalSaHpiTextTypeT( x.DataType ); marshalSaHpiCtrlStateTextT( x.Default ); } public void marshalSaHpiCtrlRecOemT( SaHpiCtrlRecOemT x ) { marshalSaHpiManufacturerIdT( x.MId ); marshalByteArray( x.ConfigData, SAHPI_CTRL_OEM_CONFIG_LENGTH ); marshalSaHpiCtrlStateOemT( x.Default ); } public void marshalSaHpiCtrlRecUnionT( SaHpiCtrlRecUnionT x, long mod ) { if ( mod == SAHPI_CTRL_TYPE_DIGITAL ) { marshalSaHpiCtrlRecDigitalT( x.Digital ); } if ( mod == SAHPI_CTRL_TYPE_DISCRETE ) { marshalSaHpiCtrlRecDiscreteT( x.Discrete ); } if ( mod == SAHPI_CTRL_TYPE_ANALOG ) { marshalSaHpiCtrlRecAnalogT( x.Analog ); } if ( mod == SAHPI_CTRL_TYPE_STREAM ) { marshalSaHpiCtrlRecStreamT( x.Stream ); } if ( mod == SAHPI_CTRL_TYPE_TEXT ) { marshalSaHpiCtrlRecTextT( x.Text ); } if ( mod == SAHPI_CTRL_TYPE_OEM ) { marshalSaHpiCtrlRecOemT( x.Oem ); } } public void marshalSaHpiCtrlDefaultModeT( SaHpiCtrlDefaultModeT x ) { marshalSaHpiCtrlModeT( x.Mode ); marshalSaHpiBoolT( x.ReadOnly ); } public void marshalSaHpiCtrlRecT( SaHpiCtrlRecT x ) { marshalSaHpiCtrlNumT( x.Num ); marshalSaHpiCtrlOutputTypeT( x.OutputType ); marshalSaHpiCtrlTypeT( x.Type ); marshalSaHpiCtrlRecUnionT( x.TypeUnion, x.Type ); marshalSaHpiCtrlDefaultModeT( x.DefaultMode ); marshalSaHpiBoolT( x.WriteOnly ); marshalSaHpiUint32T( x.Oem ); } public void marshalSaHpiIdrFieldT( SaHpiIdrFieldT x ) { marshalSaHpiEntryIdT( x.AreaId ); marshalSaHpiEntryIdT( x.FieldId ); marshalSaHpiIdrFieldTypeT( x.Type ); marshalSaHpiBoolT( x.ReadOnly ); marshalSaHpiTextBufferT( x.Field ); } public void marshalSaHpiIdrAreaHeaderT( SaHpiIdrAreaHeaderT x ) { marshalSaHpiEntryIdT( x.AreaId ); marshalSaHpiIdrAreaTypeT( x.Type ); marshalSaHpiBoolT( x.ReadOnly ); marshalSaHpiUint32T( x.NumFields ); } public void marshalSaHpiIdrInfoT( SaHpiIdrInfoT x ) { marshalSaHpiIdrIdT( x.IdrId ); marshalSaHpiUint32T( x.UpdateCount ); marshalSaHpiBoolT( x.ReadOnly ); marshalSaHpiUint32T( x.NumAreas ); } public void marshalSaHpiInventoryRecT( SaHpiInventoryRecT x ) { marshalSaHpiIdrIdT( x.IdrId ); marshalSaHpiBoolT( x.Persistent ); marshalSaHpiUint32T( x.Oem ); } public void marshalSaHpiWatchdogT( SaHpiWatchdogT x ) { marshalSaHpiBoolT( x.Log ); marshalSaHpiBoolT( x.Running ); marshalSaHpiWatchdogTimerUseT( x.TimerUse ); marshalSaHpiWatchdogActionT( x.TimerAction ); marshalSaHpiWatchdogPretimerInterruptT( x.PretimerInterrupt ); marshalSaHpiUint32T( x.PreTimeoutInterval ); marshalSaHpiWatchdogExpFlagsT( x.TimerUseExpFlags ); marshalSaHpiUint32T( x.InitialCount ); marshalSaHpiUint32T( x.PresentCount ); } public void marshalSaHpiWatchdogRecT( SaHpiWatchdogRecT x ) { marshalSaHpiWatchdogNumT( x.WatchdogNum ); marshalSaHpiUint32T( x.Oem ); } public void marshalSaHpiDimiTestAffectedEntityT( SaHpiDimiTestAffectedEntityT x ) { marshalSaHpiEntityPathT( x.EntityImpacted ); marshalSaHpiDimiTestServiceImpactT( x.ServiceImpact ); } public void marshalSaHpiDimiTestResultsT( SaHpiDimiTestResultsT x ) { marshalSaHpiTimeT( x.ResultTimeStamp ); marshalSaHpiTimeoutT( x.RunDuration ); marshalSaHpiDimiTestRunStatusT( x.LastRunStatus ); marshalSaHpiDimiTestErrCodeT( x.TestErrorCode ); marshalSaHpiTextBufferT( x.TestResultString ); marshalSaHpiBoolT( x.TestResultStringIsURI ); } public void marshalSaHpiDimiTestParamValueT( SaHpiDimiTestParamValueT x, long mod ) { if ( mod == SAHPI_DIMITEST_PARAM_TYPE_INT32 ) { marshalSaHpiInt32T( x.paramint ); } if ( mod == SAHPI_DIMITEST_PARAM_TYPE_BOOLEAN ) { marshalSaHpiBoolT( x.parambool ); } if ( mod == SAHPI_DIMITEST_PARAM_TYPE_FLOAT64 ) { marshalSaHpiFloat64T( x.paramfloat ); } if ( mod == SAHPI_DIMITEST_PARAM_TYPE_TEXT ) { marshalSaHpiTextBufferT( x.paramtext ); } } public void marshalSaHpiDimiTestParameterValueUnionT( SaHpiDimiTestParameterValueUnionT x, long mod ) { if ( mod == SAHPI_DIMITEST_PARAM_TYPE_INT32 ) { marshalSaHpiInt32T( x.IntValue ); } if ( mod == SAHPI_DIMITEST_PARAM_TYPE_FLOAT64 ) { marshalSaHpiFloat64T( x.FloatValue ); } if ( mod == SAHPI_DIMITEST_PARAM_TYPE_BOOLEAN ) { marshalSaHpiFloat64T( x.FloatValue ); } if ( mod == SAHPI_DIMITEST_PARAM_TYPE_TEXT ) { marshalSaHpiFloat64T( x.FloatValue ); } } public void marshalSaHpiDimiTestParamsDefinitionT( SaHpiDimiTestParamsDefinitionT x ) { marshalByteArray( x.ParamName, SAHPI_DIMITEST_PARAM_NAME_LEN ); marshalSaHpiTextBufferT( x.ParamInfo ); marshalSaHpiDimiTestParamTypeT( x.ParamType ); marshalSaHpiDimiTestParameterValueUnionT( x.MinValue, x.ParamType ); marshalSaHpiDimiTestParameterValueUnionT( x.MaxValue, x.ParamType ); marshalSaHpiDimiTestParamValueT( x.DefaultParam, x.ParamType ); } public void marshalSaHpiDimiTestT( SaHpiDimiTestT x ) { marshalSaHpiTextBufferT( x.TestName ); marshalSaHpiDimiTestServiceImpactT( x.ServiceImpact ); for ( int i = 0; i < SAHPI_DIMITEST_MAX_ENTITIESIMPACTED; ++i ) { marshalSaHpiDimiTestAffectedEntityT( x.EntitiesImpacted[i] ); } marshalSaHpiBoolT( x.NeedServiceOS ); marshalSaHpiTextBufferT( x.ServiceOS ); marshalSaHpiTimeT( x.ExpectedRunDuration ); marshalSaHpiDimiTestCapabilityT( x.TestCapabilities ); for ( int i = 0; i < SAHPI_DIMITEST_MAX_PARAMETERS; ++i ) { marshalSaHpiDimiTestParamsDefinitionT( x.TestParameters[i] ); } } public void marshalSaHpiDimiTestVariableParamsT( SaHpiDimiTestVariableParamsT x ) { marshalByteArray( x.ParamName, SAHPI_DIMITEST_PARAM_NAME_LEN ); marshalSaHpiDimiTestParamTypeT( x.ParamType ); marshalSaHpiDimiTestParamValueT( x.Value, x.ParamType ); } public void marshalSaHpiDimiInfoT( SaHpiDimiInfoT x ) { marshalSaHpiUint32T( x.NumberOfTests ); marshalSaHpiUint32T( x.TestNumUpdateCounter ); } public void marshalSaHpiDimiRecT( SaHpiDimiRecT x ) { marshalSaHpiDimiNumT( x.DimiNum ); marshalSaHpiUint32T( x.Oem ); } public void marshalSaHpiFumiSafDefinedSpecInfoT( SaHpiFumiSafDefinedSpecInfoT x ) { marshalSaHpiFumiSafDefinedSpecIdT( x.SpecID ); marshalSaHpiUint32T( x.RevisionID ); } public void marshalSaHpiFumiOemDefinedSpecInfoT( SaHpiFumiOemDefinedSpecInfoT x ) { marshalSaHpiManufacturerIdT( x.Mid ); marshalSaHpiUint8T( x.BodyLength ); marshalByteArray( x.Body, SAHPI_FUMI_MAX_OEM_BODY_LENGTH ); } public void marshalSaHpiFumiSpecInfoTypeUnionT( SaHpiFumiSpecInfoTypeUnionT x, long mod ) { if ( mod == SAHPI_FUMI_SPEC_INFO_SAF_DEFINED ) { marshalSaHpiFumiSafDefinedSpecInfoT( x.SafDefined ); } if ( mod == SAHPI_FUMI_SPEC_INFO_OEM_DEFINED ) { marshalSaHpiFumiOemDefinedSpecInfoT( x.OemDefined ); } } public void marshalSaHpiFumiSpecInfoT( SaHpiFumiSpecInfoT x ) { marshalSaHpiFumiSpecInfoTypeT( x.SpecInfoType ); marshalSaHpiFumiSpecInfoTypeUnionT( x.SpecInfoTypeUnion, x.SpecInfoType ); } public void marshalSaHpiFumiFirmwareInstanceInfoT( SaHpiFumiFirmwareInstanceInfoT x ) { marshalSaHpiBoolT( x.InstancePresent ); marshalSaHpiTextBufferT( x.Identifier ); marshalSaHpiTextBufferT( x.Description ); marshalSaHpiTextBufferT( x.DateTime ); marshalSaHpiUint32T( x.MajorVersion ); marshalSaHpiUint32T( x.MinorVersion ); marshalSaHpiUint32T( x.AuxVersion ); } public void marshalSaHpiFumiImpactedEntityT( SaHpiFumiImpactedEntityT x ) { marshalSaHpiEntityPathT( x.ImpactedEntity ); marshalSaHpiFumiServiceImpactT( x.ServiceImpact ); } public void marshalSaHpiFumiServiceImpactDataT( SaHpiFumiServiceImpactDataT x ) { marshalSaHpiUint32T( x.NumEntities ); for ( int i = 0; i < SAHPI_FUMI_MAX_ENTITIES_IMPACTED; ++i ) { marshalSaHpiFumiImpactedEntityT( x.ImpactedEntities[i] ); } } public void marshalSaHpiFumiSourceInfoT( SaHpiFumiSourceInfoT x ) { marshalSaHpiTextBufferT( x.SourceUri ); marshalSaHpiFumiSourceStatusT( x.SourceStatus ); marshalSaHpiTextBufferT( x.Identifier ); marshalSaHpiTextBufferT( x.Description ); marshalSaHpiTextBufferT( x.DateTime ); marshalSaHpiUint32T( x.MajorVersion ); marshalSaHpiUint32T( x.MinorVersion ); marshalSaHpiUint32T( x.AuxVersion ); } public void marshalSaHpiFumiComponentInfoT( SaHpiFumiComponentInfoT x ) { marshalSaHpiEntryIdT( x.EntryId ); marshalSaHpiUint32T( x.ComponentId ); marshalSaHpiFumiFirmwareInstanceInfoT( x.MainFwInstance ); marshalSaHpiUint32T( x.ComponentFlags ); } public void marshalSaHpiFumiBankInfoT( SaHpiFumiBankInfoT x ) { marshalSaHpiUint8T( x.BankId ); marshalSaHpiUint32T( x.BankSize ); marshalSaHpiUint32T( x.Position ); marshalSaHpiFumiBankStateT( x.BankState ); marshalSaHpiTextBufferT( x.Identifier ); marshalSaHpiTextBufferT( x.Description ); marshalSaHpiTextBufferT( x.DateTime ); marshalSaHpiUint32T( x.MajorVersion ); marshalSaHpiUint32T( x.MinorVersion ); marshalSaHpiUint32T( x.AuxVersion ); } public void marshalSaHpiFumiLogicalBankInfoT( SaHpiFumiLogicalBankInfoT x ) { marshalSaHpiUint8T( x.FirmwarePersistentLocationCount ); marshalSaHpiFumiLogicalBankStateFlagsT( x.BankStateFlags ); marshalSaHpiFumiFirmwareInstanceInfoT( x.PendingFwInstance ); marshalSaHpiFumiFirmwareInstanceInfoT( x.RollbackFwInstance ); } public void marshalSaHpiFumiLogicalComponentInfoT( SaHpiFumiLogicalComponentInfoT x ) { marshalSaHpiEntryIdT( x.EntryId ); marshalSaHpiUint32T( x.ComponentId ); marshalSaHpiFumiFirmwareInstanceInfoT( x.PendingFwInstance ); marshalSaHpiFumiFirmwareInstanceInfoT( x.RollbackFwInstance ); marshalSaHpiUint32T( x.ComponentFlags ); } public void marshalSaHpiFumiRecT( SaHpiFumiRecT x ) { marshalSaHpiFumiNumT( x.Num ); marshalSaHpiFumiProtocolT( x.AccessProt ); marshalSaHpiFumiCapabilityT( x.Capability ); marshalSaHpiUint8T( x.NumBanks ); marshalSaHpiUint32T( x.Oem ); } public void marshalSaHpiResourceEventT( SaHpiResourceEventT x ) { marshalSaHpiResourceEventTypeT( x.ResourceEventType ); } public void marshalSaHpiDomainEventT( SaHpiDomainEventT x ) { marshalSaHpiDomainEventTypeT( x.Type ); marshalSaHpiDomainIdT( x.DomainId ); } public void marshalSaHpiSensorEventT( SaHpiSensorEventT x ) { marshalSaHpiSensorNumT( x.SensorNum ); marshalSaHpiSensorTypeT( x.SensorType ); marshalSaHpiEventCategoryT( x.EventCategory ); marshalSaHpiBoolT( x.Assertion ); marshalSaHpiEventStateT( x.EventState ); marshalSaHpiSensorOptionalDataT( x.OptionalDataPresent ); marshalSaHpiSensorReadingT( x.TriggerReading ); marshalSaHpiSensorReadingT( x.TriggerThreshold ); marshalSaHpiEventStateT( x.PreviousState ); marshalSaHpiEventStateT( x.CurrentState ); marshalSaHpiUint32T( x.Oem ); marshalSaHpiUint32T( x.SensorSpecific ); } public void marshalSaHpiSensorEnableChangeEventT( SaHpiSensorEnableChangeEventT x ) { marshalSaHpiSensorNumT( x.SensorNum ); marshalSaHpiSensorTypeT( x.SensorType ); marshalSaHpiEventCategoryT( x.EventCategory ); marshalSaHpiBoolT( x.SensorEnable ); marshalSaHpiBoolT( x.SensorEventEnable ); marshalSaHpiEventStateT( x.AssertEventMask ); marshalSaHpiEventStateT( x.DeassertEventMask ); marshalSaHpiSensorEnableOptDataT( x.OptionalDataPresent ); marshalSaHpiEventStateT( x.CurrentState ); marshalSaHpiEventStateT( x.CriticalAlarms ); marshalSaHpiEventStateT( x.MajorAlarms ); marshalSaHpiEventStateT( x.MinorAlarms ); } public void marshalSaHpiHotSwapEventT( SaHpiHotSwapEventT x ) { marshalSaHpiHsStateT( x.HotSwapState ); marshalSaHpiHsStateT( x.PreviousHotSwapState ); marshalSaHpiHsCauseOfStateChangeT( x.CauseOfStateChange ); } public void marshalSaHpiWatchdogEventT( SaHpiWatchdogEventT x ) { marshalSaHpiWatchdogNumT( x.WatchdogNum ); marshalSaHpiWatchdogActionEventT( x.WatchdogAction ); marshalSaHpiWatchdogPretimerInterruptT( x.WatchdogPreTimerAction ); marshalSaHpiWatchdogTimerUseT( x.WatchdogUse ); } public void marshalSaHpiHpiSwEventT( SaHpiHpiSwEventT x ) { marshalSaHpiManufacturerIdT( x.MId ); marshalSaHpiSwEventTypeT( x.Type ); marshalSaHpiTextBufferT( x.EventData ); } public void marshalSaHpiOemEventT( SaHpiOemEventT x ) { marshalSaHpiManufacturerIdT( x.MId ); marshalSaHpiTextBufferT( x.OemEventData ); } public void marshalSaHpiUserEventT( SaHpiUserEventT x ) { marshalSaHpiTextBufferT( x.UserEventData ); } public void marshalSaHpiDimiEventT( SaHpiDimiEventT x ) { marshalSaHpiDimiNumT( x.DimiNum ); marshalSaHpiDimiTestNumT( x.TestNum ); marshalSaHpiDimiTestRunStatusT( x.DimiTestRunStatus ); marshalSaHpiDimiTestPercentCompletedT( x.DimiTestPercentCompleted ); } public void marshalSaHpiDimiUpdateEventT( SaHpiDimiUpdateEventT x ) { marshalSaHpiDimiNumT( x.DimiNum ); } public void marshalSaHpiFumiEventT( SaHpiFumiEventT x ) { marshalSaHpiFumiNumT( x.FumiNum ); marshalSaHpiUint8T( x.BankNum ); marshalSaHpiFumiUpgradeStatusT( x.UpgradeStatus ); } public void marshalSaHpiEventUnionT( SaHpiEventUnionT x, long mod ) { if ( mod == SAHPI_ET_RESOURCE ) { marshalSaHpiResourceEventT( x.ResourceEvent ); } if ( mod == SAHPI_ET_DOMAIN ) { marshalSaHpiDomainEventT( x.DomainEvent ); } if ( mod == SAHPI_ET_SENSOR ) { marshalSaHpiSensorEventT( x.SensorEvent ); } if ( mod == SAHPI_ET_SENSOR_ENABLE_CHANGE ) { marshalSaHpiSensorEnableChangeEventT( x.SensorEnableChangeEvent ); } if ( mod == SAHPI_ET_HOTSWAP ) { marshalSaHpiHotSwapEventT( x.HotSwapEvent ); } if ( mod == SAHPI_ET_WATCHDOG ) { marshalSaHpiWatchdogEventT( x.WatchdogEvent ); } if ( mod == SAHPI_ET_HPI_SW ) { marshalSaHpiHpiSwEventT( x.HpiSwEvent ); } if ( mod == SAHPI_ET_OEM ) { marshalSaHpiOemEventT( x.OemEvent ); } if ( mod == SAHPI_ET_USER ) { marshalSaHpiUserEventT( x.UserEvent ); } if ( mod == SAHPI_ET_DIMI ) { marshalSaHpiDimiEventT( x.DimiEvent ); } if ( mod == SAHPI_ET_DIMI_UPDATE ) { marshalSaHpiDimiUpdateEventT( x.DimiUpdateEvent ); } if ( mod == SAHPI_ET_FUMI ) { marshalSaHpiFumiEventT( x.FumiEvent ); } } public void marshalSaHpiEventT( SaHpiEventT x ) { marshalSaHpiResourceIdT( x.Source ); marshalSaHpiEventTypeT( x.EventType ); marshalSaHpiTimeT( x.Timestamp ); marshalSaHpiSeverityT( x.Severity ); marshalSaHpiEventUnionT( x.EventDataUnion, x.EventType ); } public void marshalSaHpiNameT( SaHpiNameT x ) { marshalSaHpiUint16T( x.Length ); marshalByteArray( x.Value, SA_HPI_MAX_NAME_LENGTH ); } public void marshalSaHpiConditionT( SaHpiConditionT x ) { marshalSaHpiStatusCondTypeT( x.Type ); marshalSaHpiEntityPathT( x.Entity ); marshalSaHpiDomainIdT( x.DomainId ); marshalSaHpiResourceIdT( x.ResourceId ); marshalSaHpiSensorNumT( x.SensorNum ); marshalSaHpiEventStateT( x.EventState ); marshalSaHpiNameT( x.Name ); marshalSaHpiManufacturerIdT( x.Mid ); marshalSaHpiTextBufferT( x.Data ); } public void marshalSaHpiAnnouncementT( SaHpiAnnouncementT x ) { marshalSaHpiEntryIdT( x.EntryId ); marshalSaHpiTimeT( x.Timestamp ); marshalSaHpiBoolT( x.AddedByUser ); marshalSaHpiSeverityT( x.Severity ); marshalSaHpiBoolT( x.Acknowledged ); marshalSaHpiConditionT( x.StatusCond ); } public void marshalSaHpiAnnunciatorRecT( SaHpiAnnunciatorRecT x ) { marshalSaHpiAnnunciatorNumT( x.AnnunciatorNum ); marshalSaHpiAnnunciatorTypeT( x.AnnunciatorType ); marshalSaHpiBoolT( x.ModeReadOnly ); marshalSaHpiUint32T( x.MaxConditions ); marshalSaHpiUint32T( x.Oem ); } public void marshalSaHpiRdrTypeUnionT( SaHpiRdrTypeUnionT x, long mod ) { if ( mod == SAHPI_CTRL_RDR ) { marshalSaHpiCtrlRecT( x.CtrlRec ); } if ( mod == SAHPI_SENSOR_RDR ) { marshalSaHpiSensorRecT( x.SensorRec ); } if ( mod == SAHPI_INVENTORY_RDR ) { marshalSaHpiInventoryRecT( x.InventoryRec ); } if ( mod == SAHPI_WATCHDOG_RDR ) { marshalSaHpiWatchdogRecT( x.WatchdogRec ); } if ( mod == SAHPI_ANNUNCIATOR_RDR ) { marshalSaHpiAnnunciatorRecT( x.AnnunciatorRec ); } if ( mod == SAHPI_DIMI_RDR ) { marshalSaHpiDimiRecT( x.DimiRec ); } if ( mod == SAHPI_FUMI_RDR ) { marshalSaHpiFumiRecT( x.FumiRec ); } } public void marshalSaHpiRdrT( SaHpiRdrT x ) { marshalSaHpiEntryIdT( x.RecordId ); marshalSaHpiRdrTypeT( x.RdrType ); marshalSaHpiEntityPathT( x.Entity ); marshalSaHpiBoolT( x.IsFru ); marshalSaHpiRdrTypeUnionT( x.RdrTypeUnion, x.RdrType ); marshalSaHpiTextBufferT( x.IdString ); } public void marshalSaHpiLoadIdT( SaHpiLoadIdT x ) { marshalSaHpiLoadNumberT( x.LoadNumber ); marshalSaHpiTextBufferT( x.LoadName ); } public void marshalSaHpiResourceInfoT( SaHpiResourceInfoT x ) { marshalSaHpiUint8T( x.ResourceRev ); marshalSaHpiUint8T( x.SpecificVer ); marshalSaHpiUint8T( x.DeviceSupport ); marshalSaHpiManufacturerIdT( x.ManufacturerId ); marshalSaHpiUint16T( x.ProductId ); marshalSaHpiUint8T( x.FirmwareMajorRev ); marshalSaHpiUint8T( x.FirmwareMinorRev ); marshalSaHpiUint8T( x.AuxFirmwareRev ); marshalByteArray( x.Guid, SAHPI_GUID_LENGTH ); } public void marshalSaHpiRptEntryT( SaHpiRptEntryT x ) { marshalSaHpiEntryIdT( x.EntryId ); marshalSaHpiResourceIdT( x.ResourceId ); marshalSaHpiResourceInfoT( x.ResourceInfo ); marshalSaHpiEntityPathT( x.ResourceEntity ); marshalSaHpiCapabilitiesT( x.ResourceCapabilities ); marshalSaHpiHsCapabilitiesT( x.HotSwapCapabilities ); marshalSaHpiSeverityT( x.ResourceSeverity ); marshalSaHpiBoolT( x.ResourceFailed ); marshalSaHpiTextBufferT( x.ResourceTag ); } public void marshalSaHpiDomainInfoT( SaHpiDomainInfoT x ) { marshalSaHpiDomainIdT( x.DomainId ); marshalSaHpiDomainCapabilitiesT( x.DomainCapabilities ); marshalSaHpiBoolT( x.IsPeer ); marshalSaHpiTextBufferT( x.DomainTag ); marshalSaHpiUint32T( x.DrtUpdateCount ); marshalSaHpiTimeT( x.DrtUpdateTimestamp ); marshalSaHpiUint32T( x.RptUpdateCount ); marshalSaHpiTimeT( x.RptUpdateTimestamp ); marshalSaHpiUint32T( x.DatUpdateCount ); marshalSaHpiTimeT( x.DatUpdateTimestamp ); marshalSaHpiUint32T( x.ActiveAlarms ); marshalSaHpiUint32T( x.CriticalAlarms ); marshalSaHpiUint32T( x.MajorAlarms ); marshalSaHpiUint32T( x.MinorAlarms ); marshalSaHpiUint32T( x.DatUserAlarmLimit ); marshalSaHpiBoolT( x.DatOverflow ); marshalByteArray( x.Guid, SAHPI_GUID_LENGTH ); } public void marshalSaHpiDrtEntryT( SaHpiDrtEntryT x ) { marshalSaHpiEntryIdT( x.EntryId ); marshalSaHpiDomainIdT( x.DomainId ); marshalSaHpiBoolT( x.IsPeer ); } public void marshalSaHpiAlarmT( SaHpiAlarmT x ) { marshalSaHpiAlarmIdT( x.AlarmId ); marshalSaHpiTimeT( x.Timestamp ); marshalSaHpiSeverityT( x.Severity ); marshalSaHpiBoolT( x.Acknowledged ); marshalSaHpiConditionT( x.AlarmCond ); } public void marshalSaHpiEventLogInfoT( SaHpiEventLogInfoT x ) { marshalSaHpiUint32T( x.Entries ); marshalSaHpiUint32T( x.Size ); marshalSaHpiUint32T( x.UserEventMaxSize ); marshalSaHpiTimeT( x.UpdateTimestamp ); marshalSaHpiTimeT( x.CurrentTime ); marshalSaHpiBoolT( x.Enabled ); marshalSaHpiBoolT( x.OverflowFlag ); marshalSaHpiBoolT( x.OverflowResetable ); marshalSaHpiEventLogOverflowActionT( x.OverflowAction ); } public void marshalSaHpiEventLogEntryT( SaHpiEventLogEntryT x ) { marshalSaHpiEventLogEntryIdT( x.EntryId ); marshalSaHpiTimeT( x.Timestamp ); marshalSaHpiEventT( x.Event ); } /********************************************************** * Demarshal: For HPI Simple Data Types *********************************************************/ public long demarshalSaHpiBoolT() throws HpiException { return demarshalSaHpiUint8T(); } public long demarshalSaHpiManufacturerIdT() throws HpiException { return demarshalSaHpiUint32T(); } public long demarshalSaHpiVersionT() throws HpiException { return demarshalSaHpiUint32T(); } public long demarshalSaErrorT() throws HpiException { return demarshalSaHpiInt32T(); } public long demarshalSaHpiDomainIdT() throws HpiException { return demarshalSaHpiUint32T(); } public long demarshalSaHpiSessionIdT() throws HpiException { return demarshalSaHpiUint32T(); } public long demarshalSaHpiResourceIdT() throws HpiException { return demarshalSaHpiUint32T(); } public long demarshalSaHpiEntryIdT() throws HpiException { return demarshalSaHpiUint32T(); } public long demarshalSaHpiTimeT() throws HpiException { return demarshalSaHpiInt64T(); } public long demarshalSaHpiTimeoutT() throws HpiException { return demarshalSaHpiInt64T(); } public long demarshalSaHpiInstrumentIdT() throws HpiException { return demarshalSaHpiUint32T(); } public long demarshalSaHpiEntityLocationT() throws HpiException { return demarshalSaHpiUint32T(); } public long demarshalSaHpiEventCategoryT() throws HpiException { return demarshalSaHpiUint8T(); } public long demarshalSaHpiEventStateT() throws HpiException { return demarshalSaHpiUint16T(); } public long demarshalSaHpiSensorNumT() throws HpiException { return demarshalSaHpiInstrumentIdT(); } public long demarshalSaHpiSensorRangeFlagsT() throws HpiException { return demarshalSaHpiUint8T(); } public long demarshalSaHpiSensorThdMaskT() throws HpiException { return demarshalSaHpiUint8T(); } public long demarshalSaHpiCtrlNumT() throws HpiException { return demarshalSaHpiInstrumentIdT(); } public long demarshalSaHpiCtrlStateDiscreteT() throws HpiException { return demarshalSaHpiUint32T(); } public long demarshalSaHpiCtrlStateAnalogT() throws HpiException { return demarshalSaHpiInt32T(); } public long demarshalSaHpiTxtLineNumT() throws HpiException { return demarshalSaHpiUint8T(); } public long demarshalSaHpiIdrIdT() throws HpiException { return demarshalSaHpiInstrumentIdT(); } public long demarshalSaHpiWatchdogNumT() throws HpiException { return demarshalSaHpiInstrumentIdT(); } public long demarshalSaHpiWatchdogExpFlagsT() throws HpiException { return demarshalSaHpiUint8T(); } public long demarshalSaHpiDimiNumT() throws HpiException { return demarshalSaHpiInstrumentIdT(); } public long demarshalSaHpiDimiTestCapabilityT() throws HpiException { return demarshalSaHpiUint32T(); } public long demarshalSaHpiDimiTestNumT() throws HpiException { return demarshalSaHpiUint32T(); } public long demarshalSaHpiDimiTestPercentCompletedT() throws HpiException { return demarshalSaHpiUint8T(); } public long demarshalSaHpiFumiNumT() throws HpiException { return demarshalSaHpiInstrumentIdT(); } public long demarshalSaHpiBankNumT() throws HpiException { return demarshalSaHpiUint8T(); } public long demarshalSaHpiFumiLogicalBankStateFlagsT() throws HpiException { return demarshalSaHpiUint32T(); } public long demarshalSaHpiFumiProtocolT() throws HpiException { return demarshalSaHpiUint32T(); } public long demarshalSaHpiFumiCapabilityT() throws HpiException { return demarshalSaHpiUint32T(); } public long demarshalSaHpiSensorOptionalDataT() throws HpiException { return demarshalSaHpiUint8T(); } public long demarshalSaHpiSensorEnableOptDataT() throws HpiException { return demarshalSaHpiUint8T(); } public long demarshalSaHpiEvtQueueStatusT() throws HpiException { return demarshalSaHpiUint32T(); } public long demarshalSaHpiAnnunciatorNumT() throws HpiException { return demarshalSaHpiInstrumentIdT(); } public long demarshalSaHpiLoadNumberT() throws HpiException { return demarshalSaHpiUint32T(); } public long demarshalSaHpiCapabilitiesT() throws HpiException { return demarshalSaHpiUint32T(); } public long demarshalSaHpiHsCapabilitiesT() throws HpiException { return demarshalSaHpiUint32T(); } public long demarshalSaHpiDomainCapabilitiesT() throws HpiException { return demarshalSaHpiUint32T(); } public long demarshalSaHpiAlarmIdT() throws HpiException { return demarshalSaHpiEntryIdT(); } public long demarshalSaHpiEventLogCapabilitiesT() throws HpiException { return demarshalSaHpiUint32T(); } public long demarshalSaHpiEventLogEntryIdT() throws HpiException { return demarshalSaHpiUint32T(); } public long demarshalSaHpiLanguageT() throws HpiException { return demarshalEnum(); } public long demarshalSaHpiTextTypeT() throws HpiException { return demarshalEnum(); } public long demarshalSaHpiEntityTypeT() throws HpiException { return demarshalEnum(); } public long demarshalSaHpiSensorTypeT() throws HpiException { return demarshalEnum(); } public long demarshalSaHpiSensorReadingTypeT() throws HpiException { return demarshalEnum(); } public long demarshalSaHpiSensorEventMaskActionT() throws HpiException { return demarshalEnum(); } public long demarshalSaHpiSensorUnitsT() throws HpiException { return demarshalEnum(); } public long demarshalSaHpiSensorModUnitUseT() throws HpiException { return demarshalEnum(); } public long demarshalSaHpiSensorEventCtrlT() throws HpiException { return demarshalEnum(); } public long demarshalSaHpiCtrlTypeT() throws HpiException { return demarshalEnum(); } public long demarshalSaHpiCtrlStateDigitalT() throws HpiException { return demarshalEnum(); } public long demarshalSaHpiCtrlModeT() throws HpiException { return demarshalEnum(); } public long demarshalSaHpiCtrlOutputTypeT() throws HpiException { return demarshalEnum(); } public long demarshalSaHpiIdrAreaTypeT() throws HpiException { return demarshalEnum(); } public long demarshalSaHpiIdrFieldTypeT() throws HpiException { return demarshalEnum(); } public long demarshalSaHpiWatchdogActionT() throws HpiException { return demarshalEnum(); } public long demarshalSaHpiWatchdogActionEventT() throws HpiException { return demarshalEnum(); } public long demarshalSaHpiWatchdogPretimerInterruptT() throws HpiException { return demarshalEnum(); } public long demarshalSaHpiWatchdogTimerUseT() throws HpiException { return demarshalEnum(); } public long demarshalSaHpiDimiTestServiceImpactT() throws HpiException { return demarshalEnum(); } public long demarshalSaHpiDimiTestRunStatusT() throws HpiException { return demarshalEnum(); } public long demarshalSaHpiDimiTestErrCodeT() throws HpiException { return demarshalEnum(); } public long demarshalSaHpiDimiTestParamTypeT() throws HpiException { return demarshalEnum(); } public long demarshalSaHpiDimiReadyT() throws HpiException { return demarshalEnum(); } public long demarshalSaHpiFumiSpecInfoTypeT() throws HpiException { return demarshalEnum(); } public long demarshalSaHpiFumiSafDefinedSpecIdT() throws HpiException { return demarshalEnum(); } public long demarshalSaHpiFumiServiceImpactT() throws HpiException { return demarshalEnum(); } public long demarshalSaHpiFumiSourceStatusT() throws HpiException { return demarshalEnum(); } public long demarshalSaHpiFumiBankStateT() throws HpiException { return demarshalEnum(); } public long demarshalSaHpiFumiUpgradeStatusT() throws HpiException { return demarshalEnum(); } public long demarshalSaHpiHsIndicatorStateT() throws HpiException { return demarshalEnum(); } public long demarshalSaHpiHsActionT() throws HpiException { return demarshalEnum(); } public long demarshalSaHpiHsStateT() throws HpiException { return demarshalEnum(); } public long demarshalSaHpiHsCauseOfStateChangeT() throws HpiException { return demarshalEnum(); } public long demarshalSaHpiSeverityT() throws HpiException { return demarshalEnum(); } public long demarshalSaHpiResourceEventTypeT() throws HpiException { return demarshalEnum(); } public long demarshalSaHpiDomainEventTypeT() throws HpiException { return demarshalEnum(); } public long demarshalSaHpiSwEventTypeT() throws HpiException { return demarshalEnum(); } public long demarshalSaHpiEventTypeT() throws HpiException { return demarshalEnum(); } public long demarshalSaHpiStatusCondTypeT() throws HpiException { return demarshalEnum(); } public long demarshalSaHpiAnnunciatorModeT() throws HpiException { return demarshalEnum(); } public long demarshalSaHpiAnnunciatorTypeT() throws HpiException { return demarshalEnum(); } public long demarshalSaHpiRdrTypeT() throws HpiException { return demarshalEnum(); } public long demarshalSaHpiParmActionT() throws HpiException { return demarshalEnum(); } public long demarshalSaHpiResetActionT() throws HpiException { return demarshalEnum(); } public long demarshalSaHpiPowerStateT() throws HpiException { return demarshalEnum(); } public long demarshalSaHpiEventLogOverflowActionT() throws HpiException { return demarshalEnum(); } /********************************************************** * Demarshal: For HPI Structs and Unions *********************************************************/ public SaHpiTextBufferT demarshalSaHpiTextBufferT() throws HpiException { SaHpiTextBufferT x = new SaHpiTextBufferT(); x.DataType = demarshalSaHpiTextTypeT(); x.Language = demarshalSaHpiLanguageT(); x.DataLength = demarshalSaHpiUint8T(); x.Data = demarshalByteArray( SAHPI_MAX_TEXT_BUFFER_LENGTH ); return x; } public SaHpiEntityT demarshalSaHpiEntityT() throws HpiException { SaHpiEntityT x = new SaHpiEntityT(); x.EntityType = demarshalSaHpiEntityTypeT(); x.EntityLocation = demarshalSaHpiEntityLocationT(); return x; } public SaHpiEntityPathT demarshalSaHpiEntityPathT() throws HpiException { SaHpiEntityPathT x = new SaHpiEntityPathT(); x.Entry = new SaHpiEntityT[SAHPI_MAX_ENTITY_PATH]; for ( int i = 0; i < SAHPI_MAX_ENTITY_PATH; ++i ) { x.Entry[i] = demarshalSaHpiEntityT(); } return x; } public SaHpiSensorReadingUnionT demarshalSaHpiSensorReadingUnionT( long mod ) throws HpiException { SaHpiSensorReadingUnionT x = new SaHpiSensorReadingUnionT(); if ( mod == SAHPI_SENSOR_READING_TYPE_INT64 ) { x.SensorInt64 = demarshalSaHpiInt64T(); } if ( mod == SAHPI_SENSOR_READING_TYPE_UINT64 ) { x.SensorUint64 = demarshalSaHpiUint64T(); } if ( mod == SAHPI_SENSOR_READING_TYPE_FLOAT64 ) { x.SensorFloat64 = demarshalSaHpiFloat64T(); } if ( mod == SAHPI_SENSOR_READING_TYPE_BUFFER ) { x.SensorBuffer = demarshalByteArray( SAHPI_SENSOR_BUFFER_LENGTH ); } return x; } public SaHpiSensorReadingT demarshalSaHpiSensorReadingT() throws HpiException { SaHpiSensorReadingT x = new SaHpiSensorReadingT(); x.IsSupported = demarshalSaHpiBoolT(); x.Type = demarshalSaHpiSensorReadingTypeT(); x.Value = demarshalSaHpiSensorReadingUnionT( x.Type ); return x; } public SaHpiSensorThresholdsT demarshalSaHpiSensorThresholdsT() throws HpiException { SaHpiSensorThresholdsT x = new SaHpiSensorThresholdsT(); x.LowCritical = demarshalSaHpiSensorReadingT(); x.LowMajor = demarshalSaHpiSensorReadingT(); x.LowMinor = demarshalSaHpiSensorReadingT(); x.UpCritical = demarshalSaHpiSensorReadingT(); x.UpMajor = demarshalSaHpiSensorReadingT(); x.UpMinor = demarshalSaHpiSensorReadingT(); x.PosThdHysteresis = demarshalSaHpiSensorReadingT(); x.NegThdHysteresis = demarshalSaHpiSensorReadingT(); return x; } public SaHpiSensorRangeT demarshalSaHpiSensorRangeT() throws HpiException { SaHpiSensorRangeT x = new SaHpiSensorRangeT(); x.Flags = demarshalSaHpiSensorRangeFlagsT(); x.Max = demarshalSaHpiSensorReadingT(); x.Min = demarshalSaHpiSensorReadingT(); x.Nominal = demarshalSaHpiSensorReadingT(); x.NormalMax = demarshalSaHpiSensorReadingT(); x.NormalMin = demarshalSaHpiSensorReadingT(); return x; } public SaHpiSensorDataFormatT demarshalSaHpiSensorDataFormatT() throws HpiException { SaHpiSensorDataFormatT x = new SaHpiSensorDataFormatT(); x.IsSupported = demarshalSaHpiBoolT(); x.ReadingType = demarshalSaHpiSensorReadingTypeT(); x.BaseUnits = demarshalSaHpiSensorUnitsT(); x.ModifierUnits = demarshalSaHpiSensorUnitsT(); x.ModifierUse = demarshalSaHpiSensorModUnitUseT(); x.Percentage = demarshalSaHpiBoolT(); x.Range = demarshalSaHpiSensorRangeT(); x.AccuracyFactor = demarshalSaHpiFloat64T(); return x; } public SaHpiSensorThdDefnT demarshalSaHpiSensorThdDefnT() throws HpiException { SaHpiSensorThdDefnT x = new SaHpiSensorThdDefnT(); x.IsAccessible = demarshalSaHpiBoolT(); x.ReadThold = demarshalSaHpiSensorThdMaskT(); x.WriteThold = demarshalSaHpiSensorThdMaskT(); x.Nonlinear = demarshalSaHpiBoolT(); return x; } public SaHpiSensorRecT demarshalSaHpiSensorRecT() throws HpiException { SaHpiSensorRecT x = new SaHpiSensorRecT(); x.Num = demarshalSaHpiSensorNumT(); x.Type = demarshalSaHpiSensorTypeT(); x.Category = demarshalSaHpiEventCategoryT(); x.EnableCtrl = demarshalSaHpiBoolT(); x.EventCtrl = demarshalSaHpiSensorEventCtrlT(); x.Events = demarshalSaHpiEventStateT(); x.DataFormat = demarshalSaHpiSensorDataFormatT(); x.ThresholdDefn = demarshalSaHpiSensorThdDefnT(); x.Oem = demarshalSaHpiUint32T(); return x; } public SaHpiCtrlStateStreamT demarshalSaHpiCtrlStateStreamT() throws HpiException { SaHpiCtrlStateStreamT x = new SaHpiCtrlStateStreamT(); x.Repeat = demarshalSaHpiBoolT(); x.StreamLength = demarshalSaHpiUint32T(); x.Stream = demarshalByteArray( SAHPI_CTRL_MAX_STREAM_LENGTH ); return x; } public SaHpiCtrlStateTextT demarshalSaHpiCtrlStateTextT() throws HpiException { SaHpiCtrlStateTextT x = new SaHpiCtrlStateTextT(); x.Line = demarshalSaHpiTxtLineNumT(); x.Text = demarshalSaHpiTextBufferT(); return x; } public SaHpiCtrlStateOemT demarshalSaHpiCtrlStateOemT() throws HpiException { SaHpiCtrlStateOemT x = new SaHpiCtrlStateOemT(); x.MId = demarshalSaHpiManufacturerIdT(); x.BodyLength = demarshalSaHpiUint8T(); x.Body = demarshalByteArray( SAHPI_CTRL_MAX_OEM_BODY_LENGTH ); return x; } public SaHpiCtrlStateUnionT demarshalSaHpiCtrlStateUnionT( long mod ) throws HpiException { SaHpiCtrlStateUnionT x = new SaHpiCtrlStateUnionT(); if ( mod == SAHPI_CTRL_TYPE_DIGITAL ) { x.Digital = demarshalSaHpiCtrlStateDigitalT(); } if ( mod == SAHPI_CTRL_TYPE_DISCRETE ) { x.Discrete = demarshalSaHpiCtrlStateDiscreteT(); } if ( mod == SAHPI_CTRL_TYPE_ANALOG ) { x.Analog = demarshalSaHpiCtrlStateAnalogT(); } if ( mod == SAHPI_CTRL_TYPE_STREAM ) { x.Stream = demarshalSaHpiCtrlStateStreamT(); } if ( mod == SAHPI_CTRL_TYPE_TEXT ) { x.Text = demarshalSaHpiCtrlStateTextT(); } if ( mod == SAHPI_CTRL_TYPE_OEM ) { x.Oem = demarshalSaHpiCtrlStateOemT(); } return x; } public SaHpiCtrlStateT demarshalSaHpiCtrlStateT() throws HpiException { SaHpiCtrlStateT x = new SaHpiCtrlStateT(); x.Type = demarshalSaHpiCtrlTypeT(); x.StateUnion = demarshalSaHpiCtrlStateUnionT( x.Type ); return x; } public SaHpiCtrlRecDigitalT demarshalSaHpiCtrlRecDigitalT() throws HpiException { SaHpiCtrlRecDigitalT x = new SaHpiCtrlRecDigitalT(); x.Default = demarshalSaHpiCtrlStateDigitalT(); return x; } public SaHpiCtrlRecDiscreteT demarshalSaHpiCtrlRecDiscreteT() throws HpiException { SaHpiCtrlRecDiscreteT x = new SaHpiCtrlRecDiscreteT(); x.Default = demarshalSaHpiCtrlStateDiscreteT(); return x; } public SaHpiCtrlRecAnalogT demarshalSaHpiCtrlRecAnalogT() throws HpiException { SaHpiCtrlRecAnalogT x = new SaHpiCtrlRecAnalogT(); x.Min = demarshalSaHpiCtrlStateAnalogT(); x.Max = demarshalSaHpiCtrlStateAnalogT(); x.Default = demarshalSaHpiCtrlStateAnalogT(); return x; } public SaHpiCtrlRecStreamT demarshalSaHpiCtrlRecStreamT() throws HpiException { SaHpiCtrlRecStreamT x = new SaHpiCtrlRecStreamT(); x.Default = demarshalSaHpiCtrlStateStreamT(); return x; } public SaHpiCtrlRecTextT demarshalSaHpiCtrlRecTextT() throws HpiException { SaHpiCtrlRecTextT x = new SaHpiCtrlRecTextT(); x.MaxChars = demarshalSaHpiUint8T(); x.MaxLines = demarshalSaHpiUint8T(); x.Language = demarshalSaHpiLanguageT(); x.DataType = demarshalSaHpiTextTypeT(); x.Default = demarshalSaHpiCtrlStateTextT(); return x; } public SaHpiCtrlRecOemT demarshalSaHpiCtrlRecOemT() throws HpiException { SaHpiCtrlRecOemT x = new SaHpiCtrlRecOemT(); x.MId = demarshalSaHpiManufacturerIdT(); x.ConfigData = demarshalByteArray( SAHPI_CTRL_OEM_CONFIG_LENGTH ); x.Default = demarshalSaHpiCtrlStateOemT(); return x; } public SaHpiCtrlRecUnionT demarshalSaHpiCtrlRecUnionT( long mod ) throws HpiException { SaHpiCtrlRecUnionT x = new SaHpiCtrlRecUnionT(); if ( mod == SAHPI_CTRL_TYPE_DIGITAL ) { x.Digital = demarshalSaHpiCtrlRecDigitalT(); } if ( mod == SAHPI_CTRL_TYPE_DISCRETE ) { x.Discrete = demarshalSaHpiCtrlRecDiscreteT(); } if ( mod == SAHPI_CTRL_TYPE_ANALOG ) { x.Analog = demarshalSaHpiCtrlRecAnalogT(); } if ( mod == SAHPI_CTRL_TYPE_STREAM ) { x.Stream = demarshalSaHpiCtrlRecStreamT(); } if ( mod == SAHPI_CTRL_TYPE_TEXT ) { x.Text = demarshalSaHpiCtrlRecTextT(); } if ( mod == SAHPI_CTRL_TYPE_OEM ) { x.Oem = demarshalSaHpiCtrlRecOemT(); } return x; } public SaHpiCtrlDefaultModeT demarshalSaHpiCtrlDefaultModeT() throws HpiException { SaHpiCtrlDefaultModeT x = new SaHpiCtrlDefaultModeT(); x.Mode = demarshalSaHpiCtrlModeT(); x.ReadOnly = demarshalSaHpiBoolT(); return x; } public SaHpiCtrlRecT demarshalSaHpiCtrlRecT() throws HpiException { SaHpiCtrlRecT x = new SaHpiCtrlRecT(); x.Num = demarshalSaHpiCtrlNumT(); x.OutputType = demarshalSaHpiCtrlOutputTypeT(); x.Type = demarshalSaHpiCtrlTypeT(); x.TypeUnion = demarshalSaHpiCtrlRecUnionT( x.Type ); x.DefaultMode = demarshalSaHpiCtrlDefaultModeT(); x.WriteOnly = demarshalSaHpiBoolT(); x.Oem = demarshalSaHpiUint32T(); return x; } public SaHpiIdrFieldT demarshalSaHpiIdrFieldT() throws HpiException { SaHpiIdrFieldT x = new SaHpiIdrFieldT(); x.AreaId = demarshalSaHpiEntryIdT(); x.FieldId = demarshalSaHpiEntryIdT(); x.Type = demarshalSaHpiIdrFieldTypeT(); x.ReadOnly = demarshalSaHpiBoolT(); x.Field = demarshalSaHpiTextBufferT(); return x; } public SaHpiIdrAreaHeaderT demarshalSaHpiIdrAreaHeaderT() throws HpiException { SaHpiIdrAreaHeaderT x = new SaHpiIdrAreaHeaderT(); x.AreaId = demarshalSaHpiEntryIdT(); x.Type = demarshalSaHpiIdrAreaTypeT(); x.ReadOnly = demarshalSaHpiBoolT(); x.NumFields = demarshalSaHpiUint32T(); return x; } public SaHpiIdrInfoT demarshalSaHpiIdrInfoT() throws HpiException { SaHpiIdrInfoT x = new SaHpiIdrInfoT(); x.IdrId = demarshalSaHpiIdrIdT(); x.UpdateCount = demarshalSaHpiUint32T(); x.ReadOnly = demarshalSaHpiBoolT(); x.NumAreas = demarshalSaHpiUint32T(); return x; } public SaHpiInventoryRecT demarshalSaHpiInventoryRecT() throws HpiException { SaHpiInventoryRecT x = new SaHpiInventoryRecT(); x.IdrId = demarshalSaHpiIdrIdT(); x.Persistent = demarshalSaHpiBoolT(); x.Oem = demarshalSaHpiUint32T(); return x; } public SaHpiWatchdogT demarshalSaHpiWatchdogT() throws HpiException { SaHpiWatchdogT x = new SaHpiWatchdogT(); x.Log = demarshalSaHpiBoolT(); x.Running = demarshalSaHpiBoolT(); x.TimerUse = demarshalSaHpiWatchdogTimerUseT(); x.TimerAction = demarshalSaHpiWatchdogActionT(); x.PretimerInterrupt = demarshalSaHpiWatchdogPretimerInterruptT(); x.PreTimeoutInterval = demarshalSaHpiUint32T(); x.TimerUseExpFlags = demarshalSaHpiWatchdogExpFlagsT(); x.InitialCount = demarshalSaHpiUint32T(); x.PresentCount = demarshalSaHpiUint32T(); return x; } public SaHpiWatchdogRecT demarshalSaHpiWatchdogRecT() throws HpiException { SaHpiWatchdogRecT x = new SaHpiWatchdogRecT(); x.WatchdogNum = demarshalSaHpiWatchdogNumT(); x.Oem = demarshalSaHpiUint32T(); return x; } public SaHpiDimiTestAffectedEntityT demarshalSaHpiDimiTestAffectedEntityT() throws HpiException { SaHpiDimiTestAffectedEntityT x = new SaHpiDimiTestAffectedEntityT(); x.EntityImpacted = demarshalSaHpiEntityPathT(); x.ServiceImpact = demarshalSaHpiDimiTestServiceImpactT(); return x; } public SaHpiDimiTestResultsT demarshalSaHpiDimiTestResultsT() throws HpiException { SaHpiDimiTestResultsT x = new SaHpiDimiTestResultsT(); x.ResultTimeStamp = demarshalSaHpiTimeT(); x.RunDuration = demarshalSaHpiTimeoutT(); x.LastRunStatus = demarshalSaHpiDimiTestRunStatusT(); x.TestErrorCode = demarshalSaHpiDimiTestErrCodeT(); x.TestResultString = demarshalSaHpiTextBufferT(); x.TestResultStringIsURI = demarshalSaHpiBoolT(); return x; } public SaHpiDimiTestParamValueT demarshalSaHpiDimiTestParamValueT( long mod ) throws HpiException { SaHpiDimiTestParamValueT x = new SaHpiDimiTestParamValueT(); if ( mod == SAHPI_DIMITEST_PARAM_TYPE_INT32 ) { x.paramint = demarshalSaHpiInt32T(); } if ( mod == SAHPI_DIMITEST_PARAM_TYPE_BOOLEAN ) { x.parambool = demarshalSaHpiBoolT(); } if ( mod == SAHPI_DIMITEST_PARAM_TYPE_FLOAT64 ) { x.paramfloat = demarshalSaHpiFloat64T(); } if ( mod == SAHPI_DIMITEST_PARAM_TYPE_TEXT ) { x.paramtext = demarshalSaHpiTextBufferT(); } return x; } public SaHpiDimiTestParameterValueUnionT demarshalSaHpiDimiTestParameterValueUnionT( long mod ) throws HpiException { SaHpiDimiTestParameterValueUnionT x = new SaHpiDimiTestParameterValueUnionT(); if ( mod == SAHPI_DIMITEST_PARAM_TYPE_INT32 ) { x.IntValue = demarshalSaHpiInt32T(); } if ( mod == SAHPI_DIMITEST_PARAM_TYPE_FLOAT64 ) { x.FloatValue = demarshalSaHpiFloat64T(); } if ( mod == SAHPI_DIMITEST_PARAM_TYPE_BOOLEAN ) { x.FloatValue = demarshalSaHpiFloat64T(); } if ( mod == SAHPI_DIMITEST_PARAM_TYPE_TEXT ) { x.FloatValue = demarshalSaHpiFloat64T(); } return x; } public SaHpiDimiTestParamsDefinitionT demarshalSaHpiDimiTestParamsDefinitionT() throws HpiException { SaHpiDimiTestParamsDefinitionT x = new SaHpiDimiTestParamsDefinitionT(); x.ParamName = demarshalByteArray( SAHPI_DIMITEST_PARAM_NAME_LEN ); x.ParamInfo = demarshalSaHpiTextBufferT(); x.ParamType = demarshalSaHpiDimiTestParamTypeT(); x.MinValue = demarshalSaHpiDimiTestParameterValueUnionT( x.ParamType ); x.MaxValue = demarshalSaHpiDimiTestParameterValueUnionT( x.ParamType ); x.DefaultParam = demarshalSaHpiDimiTestParamValueT( x.ParamType ); return x; } public SaHpiDimiTestT demarshalSaHpiDimiTestT() throws HpiException { SaHpiDimiTestT x = new SaHpiDimiTestT(); x.TestName = demarshalSaHpiTextBufferT(); x.ServiceImpact = demarshalSaHpiDimiTestServiceImpactT(); x.EntitiesImpacted = new SaHpiDimiTestAffectedEntityT[SAHPI_DIMITEST_MAX_ENTITIESIMPACTED]; for ( int i = 0; i < SAHPI_DIMITEST_MAX_ENTITIESIMPACTED; ++i ) { x.EntitiesImpacted[i] = demarshalSaHpiDimiTestAffectedEntityT(); } x.NeedServiceOS = demarshalSaHpiBoolT(); x.ServiceOS = demarshalSaHpiTextBufferT(); x.ExpectedRunDuration = demarshalSaHpiTimeT(); x.TestCapabilities = demarshalSaHpiDimiTestCapabilityT(); x.TestParameters = new SaHpiDimiTestParamsDefinitionT[SAHPI_DIMITEST_MAX_PARAMETERS]; for ( int i = 0; i < SAHPI_DIMITEST_MAX_PARAMETERS; ++i ) { x.TestParameters[i] = demarshalSaHpiDimiTestParamsDefinitionT(); } return x; } public SaHpiDimiTestVariableParamsT demarshalSaHpiDimiTestVariableParamsT() throws HpiException { SaHpiDimiTestVariableParamsT x = new SaHpiDimiTestVariableParamsT(); x.ParamName = demarshalByteArray( SAHPI_DIMITEST_PARAM_NAME_LEN ); x.ParamType = demarshalSaHpiDimiTestParamTypeT(); x.Value = demarshalSaHpiDimiTestParamValueT( x.ParamType ); return x; } public SaHpiDimiInfoT demarshalSaHpiDimiInfoT() throws HpiException { SaHpiDimiInfoT x = new SaHpiDimiInfoT(); x.NumberOfTests = demarshalSaHpiUint32T(); x.TestNumUpdateCounter = demarshalSaHpiUint32T(); return x; } public SaHpiDimiRecT demarshalSaHpiDimiRecT() throws HpiException { SaHpiDimiRecT x = new SaHpiDimiRecT(); x.DimiNum = demarshalSaHpiDimiNumT(); x.Oem = demarshalSaHpiUint32T(); return x; } public SaHpiFumiSafDefinedSpecInfoT demarshalSaHpiFumiSafDefinedSpecInfoT() throws HpiException { SaHpiFumiSafDefinedSpecInfoT x = new SaHpiFumiSafDefinedSpecInfoT(); x.SpecID = demarshalSaHpiFumiSafDefinedSpecIdT(); x.RevisionID = demarshalSaHpiUint32T(); return x; } public SaHpiFumiOemDefinedSpecInfoT demarshalSaHpiFumiOemDefinedSpecInfoT() throws HpiException { SaHpiFumiOemDefinedSpecInfoT x = new SaHpiFumiOemDefinedSpecInfoT(); x.Mid = demarshalSaHpiManufacturerIdT(); x.BodyLength = demarshalSaHpiUint8T(); x.Body = demarshalByteArray( SAHPI_FUMI_MAX_OEM_BODY_LENGTH ); return x; } public SaHpiFumiSpecInfoTypeUnionT demarshalSaHpiFumiSpecInfoTypeUnionT( long mod ) throws HpiException { SaHpiFumiSpecInfoTypeUnionT x = new SaHpiFumiSpecInfoTypeUnionT(); if ( mod == SAHPI_FUMI_SPEC_INFO_SAF_DEFINED ) { x.SafDefined = demarshalSaHpiFumiSafDefinedSpecInfoT(); } if ( mod == SAHPI_FUMI_SPEC_INFO_OEM_DEFINED ) { x.OemDefined = demarshalSaHpiFumiOemDefinedSpecInfoT(); } return x; } public SaHpiFumiSpecInfoT demarshalSaHpiFumiSpecInfoT() throws HpiException { SaHpiFumiSpecInfoT x = new SaHpiFumiSpecInfoT(); x.SpecInfoType = demarshalSaHpiFumiSpecInfoTypeT(); x.SpecInfoTypeUnion = demarshalSaHpiFumiSpecInfoTypeUnionT( x.SpecInfoType ); return x; } public SaHpiFumiFirmwareInstanceInfoT demarshalSaHpiFumiFirmwareInstanceInfoT() throws HpiException { SaHpiFumiFirmwareInstanceInfoT x = new SaHpiFumiFirmwareInstanceInfoT(); x.InstancePresent = demarshalSaHpiBoolT(); x.Identifier = demarshalSaHpiTextBufferT(); x.Description = demarshalSaHpiTextBufferT(); x.DateTime = demarshalSaHpiTextBufferT(); x.MajorVersion = demarshalSaHpiUint32T(); x.MinorVersion = demarshalSaHpiUint32T(); x.AuxVersion = demarshalSaHpiUint32T(); return x; } public SaHpiFumiImpactedEntityT demarshalSaHpiFumiImpactedEntityT() throws HpiException { SaHpiFumiImpactedEntityT x = new SaHpiFumiImpactedEntityT(); x.ImpactedEntity = demarshalSaHpiEntityPathT(); x.ServiceImpact = demarshalSaHpiFumiServiceImpactT(); return x; } public SaHpiFumiServiceImpactDataT demarshalSaHpiFumiServiceImpactDataT() throws HpiException { SaHpiFumiServiceImpactDataT x = new SaHpiFumiServiceImpactDataT(); x.NumEntities = demarshalSaHpiUint32T(); x.ImpactedEntities = new SaHpiFumiImpactedEntityT[SAHPI_FUMI_MAX_ENTITIES_IMPACTED]; for ( int i = 0; i < SAHPI_FUMI_MAX_ENTITIES_IMPACTED; ++i ) { x.ImpactedEntities[i] = demarshalSaHpiFumiImpactedEntityT(); } return x; } public SaHpiFumiSourceInfoT demarshalSaHpiFumiSourceInfoT() throws HpiException { SaHpiFumiSourceInfoT x = new SaHpiFumiSourceInfoT(); x.SourceUri = demarshalSaHpiTextBufferT(); x.SourceStatus = demarshalSaHpiFumiSourceStatusT(); x.Identifier = demarshalSaHpiTextBufferT(); x.Description = demarshalSaHpiTextBufferT(); x.DateTime = demarshalSaHpiTextBufferT(); x.MajorVersion = demarshalSaHpiUint32T(); x.MinorVersion = demarshalSaHpiUint32T(); x.AuxVersion = demarshalSaHpiUint32T(); return x; } public SaHpiFumiComponentInfoT demarshalSaHpiFumiComponentInfoT() throws HpiException { SaHpiFumiComponentInfoT x = new SaHpiFumiComponentInfoT(); x.EntryId = demarshalSaHpiEntryIdT(); x.ComponentId = demarshalSaHpiUint32T(); x.MainFwInstance = demarshalSaHpiFumiFirmwareInstanceInfoT(); x.ComponentFlags = demarshalSaHpiUint32T(); return x; } public SaHpiFumiBankInfoT demarshalSaHpiFumiBankInfoT() throws HpiException { SaHpiFumiBankInfoT x = new SaHpiFumiBankInfoT(); x.BankId = demarshalSaHpiUint8T(); x.BankSize = demarshalSaHpiUint32T(); x.Position = demarshalSaHpiUint32T(); x.BankState = demarshalSaHpiFumiBankStateT(); x.Identifier = demarshalSaHpiTextBufferT(); x.Description = demarshalSaHpiTextBufferT(); x.DateTime = demarshalSaHpiTextBufferT(); x.MajorVersion = demarshalSaHpiUint32T(); x.MinorVersion = demarshalSaHpiUint32T(); x.AuxVersion = demarshalSaHpiUint32T(); return x; } public SaHpiFumiLogicalBankInfoT demarshalSaHpiFumiLogicalBankInfoT() throws HpiException { SaHpiFumiLogicalBankInfoT x = new SaHpiFumiLogicalBankInfoT(); x.FirmwarePersistentLocationCount = demarshalSaHpiUint8T(); x.BankStateFlags = demarshalSaHpiFumiLogicalBankStateFlagsT(); x.PendingFwInstance = demarshalSaHpiFumiFirmwareInstanceInfoT(); x.RollbackFwInstance = demarshalSaHpiFumiFirmwareInstanceInfoT(); return x; } public SaHpiFumiLogicalComponentInfoT demarshalSaHpiFumiLogicalComponentInfoT() throws HpiException { SaHpiFumiLogicalComponentInfoT x = new SaHpiFumiLogicalComponentInfoT(); x.EntryId = demarshalSaHpiEntryIdT(); x.ComponentId = demarshalSaHpiUint32T(); x.PendingFwInstance = demarshalSaHpiFumiFirmwareInstanceInfoT(); x.RollbackFwInstance = demarshalSaHpiFumiFirmwareInstanceInfoT(); x.ComponentFlags = demarshalSaHpiUint32T(); return x; } public SaHpiFumiRecT demarshalSaHpiFumiRecT() throws HpiException { SaHpiFumiRecT x = new SaHpiFumiRecT(); x.Num = demarshalSaHpiFumiNumT(); x.AccessProt = demarshalSaHpiFumiProtocolT(); x.Capability = demarshalSaHpiFumiCapabilityT(); x.NumBanks = demarshalSaHpiUint8T(); x.Oem = demarshalSaHpiUint32T(); return x; } public SaHpiResourceEventT demarshalSaHpiResourceEventT() throws HpiException { SaHpiResourceEventT x = new SaHpiResourceEventT(); x.ResourceEventType = demarshalSaHpiResourceEventTypeT(); return x; } public SaHpiDomainEventT demarshalSaHpiDomainEventT() throws HpiException { SaHpiDomainEventT x = new SaHpiDomainEventT(); x.Type = demarshalSaHpiDomainEventTypeT(); x.DomainId = demarshalSaHpiDomainIdT(); return x; } public SaHpiSensorEventT demarshalSaHpiSensorEventT() throws HpiException { SaHpiSensorEventT x = new SaHpiSensorEventT(); x.SensorNum = demarshalSaHpiSensorNumT(); x.SensorType = demarshalSaHpiSensorTypeT(); x.EventCategory = demarshalSaHpiEventCategoryT(); x.Assertion = demarshalSaHpiBoolT(); x.EventState = demarshalSaHpiEventStateT(); x.OptionalDataPresent = demarshalSaHpiSensorOptionalDataT(); x.TriggerReading = demarshalSaHpiSensorReadingT(); x.TriggerThreshold = demarshalSaHpiSensorReadingT(); x.PreviousState = demarshalSaHpiEventStateT(); x.CurrentState = demarshalSaHpiEventStateT(); x.Oem = demarshalSaHpiUint32T(); x.SensorSpecific = demarshalSaHpiUint32T(); return x; } public SaHpiSensorEnableChangeEventT demarshalSaHpiSensorEnableChangeEventT() throws HpiException { SaHpiSensorEnableChangeEventT x = new SaHpiSensorEnableChangeEventT(); x.SensorNum = demarshalSaHpiSensorNumT(); x.SensorType = demarshalSaHpiSensorTypeT(); x.EventCategory = demarshalSaHpiEventCategoryT(); x.SensorEnable = demarshalSaHpiBoolT(); x.SensorEventEnable = demarshalSaHpiBoolT(); x.AssertEventMask = demarshalSaHpiEventStateT(); x.DeassertEventMask = demarshalSaHpiEventStateT(); x.OptionalDataPresent = demarshalSaHpiSensorEnableOptDataT(); x.CurrentState = demarshalSaHpiEventStateT(); x.CriticalAlarms = demarshalSaHpiEventStateT(); x.MajorAlarms = demarshalSaHpiEventStateT(); x.MinorAlarms = demarshalSaHpiEventStateT(); return x; } public SaHpiHotSwapEventT demarshalSaHpiHotSwapEventT() throws HpiException { SaHpiHotSwapEventT x = new SaHpiHotSwapEventT(); x.HotSwapState = demarshalSaHpiHsStateT(); x.PreviousHotSwapState = demarshalSaHpiHsStateT(); x.CauseOfStateChange = demarshalSaHpiHsCauseOfStateChangeT(); return x; } public SaHpiWatchdogEventT demarshalSaHpiWatchdogEventT() throws HpiException { SaHpiWatchdogEventT x = new SaHpiWatchdogEventT(); x.WatchdogNum = demarshalSaHpiWatchdogNumT(); x.WatchdogAction = demarshalSaHpiWatchdogActionEventT(); x.WatchdogPreTimerAction = demarshalSaHpiWatchdogPretimerInterruptT(); x.WatchdogUse = demarshalSaHpiWatchdogTimerUseT(); return x; } public SaHpiHpiSwEventT demarshalSaHpiHpiSwEventT() throws HpiException { SaHpiHpiSwEventT x = new SaHpiHpiSwEventT(); x.MId = demarshalSaHpiManufacturerIdT(); x.Type = demarshalSaHpiSwEventTypeT(); x.EventData = demarshalSaHpiTextBufferT(); return x; } public SaHpiOemEventT demarshalSaHpiOemEventT() throws HpiException { SaHpiOemEventT x = new SaHpiOemEventT(); x.MId = demarshalSaHpiManufacturerIdT(); x.OemEventData = demarshalSaHpiTextBufferT(); return x; } public SaHpiUserEventT demarshalSaHpiUserEventT() throws HpiException { SaHpiUserEventT x = new SaHpiUserEventT(); x.UserEventData = demarshalSaHpiTextBufferT(); return x; } public SaHpiDimiEventT demarshalSaHpiDimiEventT() throws HpiException { SaHpiDimiEventT x = new SaHpiDimiEventT(); x.DimiNum = demarshalSaHpiDimiNumT(); x.TestNum = demarshalSaHpiDimiTestNumT(); x.DimiTestRunStatus = demarshalSaHpiDimiTestRunStatusT(); x.DimiTestPercentCompleted = demarshalSaHpiDimiTestPercentCompletedT(); return x; } public SaHpiDimiUpdateEventT demarshalSaHpiDimiUpdateEventT() throws HpiException { SaHpiDimiUpdateEventT x = new SaHpiDimiUpdateEventT(); x.DimiNum = demarshalSaHpiDimiNumT(); return x; } public SaHpiFumiEventT demarshalSaHpiFumiEventT() throws HpiException { SaHpiFumiEventT x = new SaHpiFumiEventT(); x.FumiNum = demarshalSaHpiFumiNumT(); x.BankNum = demarshalSaHpiUint8T(); x.UpgradeStatus = demarshalSaHpiFumiUpgradeStatusT(); return x; } public SaHpiEventUnionT demarshalSaHpiEventUnionT( long mod ) throws HpiException { SaHpiEventUnionT x = new SaHpiEventUnionT(); if ( mod == SAHPI_ET_RESOURCE ) { x.ResourceEvent = demarshalSaHpiResourceEventT(); } if ( mod == SAHPI_ET_DOMAIN ) { x.DomainEvent = demarshalSaHpiDomainEventT(); } if ( mod == SAHPI_ET_SENSOR ) { x.SensorEvent = demarshalSaHpiSensorEventT(); } if ( mod == SAHPI_ET_SENSOR_ENABLE_CHANGE ) { x.SensorEnableChangeEvent = demarshalSaHpiSensorEnableChangeEventT(); } if ( mod == SAHPI_ET_HOTSWAP ) { x.HotSwapEvent = demarshalSaHpiHotSwapEventT(); } if ( mod == SAHPI_ET_WATCHDOG ) { x.WatchdogEvent = demarshalSaHpiWatchdogEventT(); } if ( mod == SAHPI_ET_HPI_SW ) { x.HpiSwEvent = demarshalSaHpiHpiSwEventT(); } if ( mod == SAHPI_ET_OEM ) { x.OemEvent = demarshalSaHpiOemEventT(); } if ( mod == SAHPI_ET_USER ) { x.UserEvent = demarshalSaHpiUserEventT(); } if ( mod == SAHPI_ET_DIMI ) { x.DimiEvent = demarshalSaHpiDimiEventT(); } if ( mod == SAHPI_ET_DIMI_UPDATE ) { x.DimiUpdateEvent = demarshalSaHpiDimiUpdateEventT(); } if ( mod == SAHPI_ET_FUMI ) { x.FumiEvent = demarshalSaHpiFumiEventT(); } return x; } public SaHpiEventT demarshalSaHpiEventT() throws HpiException { SaHpiEventT x = new SaHpiEventT(); x.Source = demarshalSaHpiResourceIdT(); x.EventType = demarshalSaHpiEventTypeT(); x.Timestamp = demarshalSaHpiTimeT(); x.Severity = demarshalSaHpiSeverityT(); x.EventDataUnion = demarshalSaHpiEventUnionT( x.EventType ); return x; } public SaHpiNameT demarshalSaHpiNameT() throws HpiException { SaHpiNameT x = new SaHpiNameT(); x.Length = demarshalSaHpiUint16T(); x.Value = demarshalByteArray( SA_HPI_MAX_NAME_LENGTH ); return x; } public SaHpiConditionT demarshalSaHpiConditionT() throws HpiException { SaHpiConditionT x = new SaHpiConditionT(); x.Type = demarshalSaHpiStatusCondTypeT(); x.Entity = demarshalSaHpiEntityPathT(); x.DomainId = demarshalSaHpiDomainIdT(); x.ResourceId = demarshalSaHpiResourceIdT(); x.SensorNum = demarshalSaHpiSensorNumT(); x.EventState = demarshalSaHpiEventStateT(); x.Name = demarshalSaHpiNameT(); x.Mid = demarshalSaHpiManufacturerIdT(); x.Data = demarshalSaHpiTextBufferT(); return x; } public SaHpiAnnouncementT demarshalSaHpiAnnouncementT() throws HpiException { SaHpiAnnouncementT x = new SaHpiAnnouncementT(); x.EntryId = demarshalSaHpiEntryIdT(); x.Timestamp = demarshalSaHpiTimeT(); x.AddedByUser = demarshalSaHpiBoolT(); x.Severity = demarshalSaHpiSeverityT(); x.Acknowledged = demarshalSaHpiBoolT(); x.StatusCond = demarshalSaHpiConditionT(); return x; } public SaHpiAnnunciatorRecT demarshalSaHpiAnnunciatorRecT() throws HpiException { SaHpiAnnunciatorRecT x = new SaHpiAnnunciatorRecT(); x.AnnunciatorNum = demarshalSaHpiAnnunciatorNumT(); x.AnnunciatorType = demarshalSaHpiAnnunciatorTypeT(); x.ModeReadOnly = demarshalSaHpiBoolT(); x.MaxConditions = demarshalSaHpiUint32T(); x.Oem = demarshalSaHpiUint32T(); return x; } public SaHpiRdrTypeUnionT demarshalSaHpiRdrTypeUnionT( long mod ) throws HpiException { SaHpiRdrTypeUnionT x = new SaHpiRdrTypeUnionT(); if ( mod == SAHPI_CTRL_RDR ) { x.CtrlRec = demarshalSaHpiCtrlRecT(); } if ( mod == SAHPI_SENSOR_RDR ) { x.SensorRec = demarshalSaHpiSensorRecT(); } if ( mod == SAHPI_INVENTORY_RDR ) { x.InventoryRec = demarshalSaHpiInventoryRecT(); } if ( mod == SAHPI_WATCHDOG_RDR ) { x.WatchdogRec = demarshalSaHpiWatchdogRecT(); } if ( mod == SAHPI_ANNUNCIATOR_RDR ) { x.AnnunciatorRec = demarshalSaHpiAnnunciatorRecT(); } if ( mod == SAHPI_DIMI_RDR ) { x.DimiRec = demarshalSaHpiDimiRecT(); } if ( mod == SAHPI_FUMI_RDR ) { x.FumiRec = demarshalSaHpiFumiRecT(); } return x; } public SaHpiRdrT demarshalSaHpiRdrT() throws HpiException { SaHpiRdrT x = new SaHpiRdrT(); x.RecordId = demarshalSaHpiEntryIdT(); x.RdrType = demarshalSaHpiRdrTypeT(); x.Entity = demarshalSaHpiEntityPathT(); x.IsFru = demarshalSaHpiBoolT(); x.RdrTypeUnion = demarshalSaHpiRdrTypeUnionT( x.RdrType ); x.IdString = demarshalSaHpiTextBufferT(); return x; } public SaHpiLoadIdT demarshalSaHpiLoadIdT() throws HpiException { SaHpiLoadIdT x = new SaHpiLoadIdT(); x.LoadNumber = demarshalSaHpiLoadNumberT(); x.LoadName = demarshalSaHpiTextBufferT(); return x; } public SaHpiResourceInfoT demarshalSaHpiResourceInfoT() throws HpiException { SaHpiResourceInfoT x = new SaHpiResourceInfoT(); x.ResourceRev = demarshalSaHpiUint8T(); x.SpecificVer = demarshalSaHpiUint8T(); x.DeviceSupport = demarshalSaHpiUint8T(); x.ManufacturerId = demarshalSaHpiManufacturerIdT(); x.ProductId = demarshalSaHpiUint16T(); x.FirmwareMajorRev = demarshalSaHpiUint8T(); x.FirmwareMinorRev = demarshalSaHpiUint8T(); x.AuxFirmwareRev = demarshalSaHpiUint8T(); x.Guid = demarshalByteArray( SAHPI_GUID_LENGTH ); return x; } public SaHpiRptEntryT demarshalSaHpiRptEntryT() throws HpiException { SaHpiRptEntryT x = new SaHpiRptEntryT(); x.EntryId = demarshalSaHpiEntryIdT(); x.ResourceId = demarshalSaHpiResourceIdT(); x.ResourceInfo = demarshalSaHpiResourceInfoT(); x.ResourceEntity = demarshalSaHpiEntityPathT(); x.ResourceCapabilities = demarshalSaHpiCapabilitiesT(); x.HotSwapCapabilities = demarshalSaHpiHsCapabilitiesT(); x.ResourceSeverity = demarshalSaHpiSeverityT(); x.ResourceFailed = demarshalSaHpiBoolT(); x.ResourceTag = demarshalSaHpiTextBufferT(); return x; } public SaHpiDomainInfoT demarshalSaHpiDomainInfoT() throws HpiException { SaHpiDomainInfoT x = new SaHpiDomainInfoT(); x.DomainId = demarshalSaHpiDomainIdT(); x.DomainCapabilities = demarshalSaHpiDomainCapabilitiesT(); x.IsPeer = demarshalSaHpiBoolT(); x.DomainTag = demarshalSaHpiTextBufferT(); x.DrtUpdateCount = demarshalSaHpiUint32T(); x.DrtUpdateTimestamp = demarshalSaHpiTimeT(); x.RptUpdateCount = demarshalSaHpiUint32T(); x.RptUpdateTimestamp = demarshalSaHpiTimeT(); x.DatUpdateCount = demarshalSaHpiUint32T(); x.DatUpdateTimestamp = demarshalSaHpiTimeT(); x.ActiveAlarms = demarshalSaHpiUint32T(); x.CriticalAlarms = demarshalSaHpiUint32T(); x.MajorAlarms = demarshalSaHpiUint32T(); x.MinorAlarms = demarshalSaHpiUint32T(); x.DatUserAlarmLimit = demarshalSaHpiUint32T(); x.DatOverflow = demarshalSaHpiBoolT(); x.Guid = demarshalByteArray( SAHPI_GUID_LENGTH ); return x; } public SaHpiDrtEntryT demarshalSaHpiDrtEntryT() throws HpiException { SaHpiDrtEntryT x = new SaHpiDrtEntryT(); x.EntryId = demarshalSaHpiEntryIdT(); x.DomainId = demarshalSaHpiDomainIdT(); x.IsPeer = demarshalSaHpiBoolT(); return x; } public SaHpiAlarmT demarshalSaHpiAlarmT() throws HpiException { SaHpiAlarmT x = new SaHpiAlarmT(); x.AlarmId = demarshalSaHpiAlarmIdT(); x.Timestamp = demarshalSaHpiTimeT(); x.Severity = demarshalSaHpiSeverityT(); x.Acknowledged = demarshalSaHpiBoolT(); x.AlarmCond = demarshalSaHpiConditionT(); return x; } public SaHpiEventLogInfoT demarshalSaHpiEventLogInfoT() throws HpiException { SaHpiEventLogInfoT x = new SaHpiEventLogInfoT(); x.Entries = demarshalSaHpiUint32T(); x.Size = demarshalSaHpiUint32T(); x.UserEventMaxSize = demarshalSaHpiUint32T(); x.UpdateTimestamp = demarshalSaHpiTimeT(); x.CurrentTime = demarshalSaHpiTimeT(); x.Enabled = demarshalSaHpiBoolT(); x.OverflowFlag = demarshalSaHpiBoolT(); x.OverflowResetable = demarshalSaHpiBoolT(); x.OverflowAction = demarshalSaHpiEventLogOverflowActionT(); return x; } public SaHpiEventLogEntryT demarshalSaHpiEventLogEntryT() throws HpiException { SaHpiEventLogEntryT x = new SaHpiEventLogEntryT(); x.EntryId = demarshalSaHpiEventLogEntryIdT(); x.Timestamp = demarshalSaHpiTimeT(); x.Event = demarshalSaHpiEventT(); return x; } }; openhpi-3.6.1/baselibs/java/openhpi_baselib/HpiTransport.java0000644000175100017510000001335512575647300023323 0ustar mohanmohan/* -*- java -*- * * Copyright (C) 2012, Pigeon Point Systems * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ package org.openhpi; import java.io.InputStream; import java.io.OutputStream; import java.io.IOException; import java.net.Socket; import static org.openhpi.OhpiDataTypes.RPC_SAHPI_NULL; class HpiTransport { /********************************************************** * NB: Assumption * We assume that marshal layer puts bytes in little-endian * order for RPC request. * And remote party defines endian for RPC response. *********************************************************/ // PDU private final int MAX_SIZE = 0xFFFF; private final int HDR_SIZE = 12; private final int TYPE_OFF = 0x00; private final int FLAGS_OFF = 0x01; private final int RPC_ID_OFF = 0x04; private final int PAYLOAD_SIZE_OFF = 0x08; private final byte TYPE = 0x01; // MSG private final byte FLAGS = 0x11; // RPC version 1, little-endian private final byte ENDIAN_FLAG_MASK = 0x01; // If endian flag is set: little-endian private Socket s; private InputStream in; private OutputStream out; private byte[] pdu; private int hpos; private int lpos; public boolean open( String host, int port ) { boolean rc; try { rc = true; s = new Socket( host, port ); in = s.getInputStream(); out = s.getOutputStream(); pdu = new byte[MAX_SIZE]; reset(); } catch ( Exception e ) { rc = false; in = null; out = null; s = null; pdu = null; } return rc; } public void close() { if ( ( s != null ) && ( s.isConnected() ) ) { try { s.close(); } catch ( IOException e ) { // Catch all IO exceptions } } in = null; out = null; s = null; pdu = null; } public void reset() { setInt8( TYPE_OFF, TYPE ); setInt8( FLAGS_OFF, FLAGS ); setInt32( RPC_ID_OFF, RPC_SAHPI_NULL ); setInt32( PAYLOAD_SIZE_OFF, 0 ); lpos = HDR_SIZE; hpos = HDR_SIZE; } public boolean isLittleEndian() { return ( pdu[FLAGS_OFF] & ENDIAN_FLAG_MASK ) != 0; } public void putByte( byte x ) { pdu[hpos] = x; ++hpos; } public void putBytes( byte[] bytes, int count ) { System.arraycopy( bytes, 0, pdu, hpos, count ); hpos += count; } public byte getByte() throws HpiException { if ( lpos >= hpos ) { throw new HpiException( "Not enough data for demarshal" ); } byte x = pdu[lpos]; ++lpos; return x; } public void getBytes( int count, byte[] bytes ) throws HpiException { if ( ( lpos + count ) > hpos ) { throw new HpiException( "Not enough data for demarshal" ); } System.arraycopy( pdu, lpos, bytes, 0, count ); lpos += count; } public boolean interchange( int rpc_id ) throws HpiException { setInt32( RPC_ID_OFF, rpc_id ); setInt32( PAYLOAD_SIZE_OFF, hpos - HDR_SIZE ); boolean rc = false; try { out.write( pdu, 0, hpos ); lpos = HDR_SIZE; hpos = 0; int need = HDR_SIZE; while ( hpos < need ) { int got = in.read( pdu, hpos, need - hpos ); if ( got == -1 ) { break; } hpos += got; if ( hpos == HDR_SIZE ) { int payload_size = getInt32( PAYLOAD_SIZE_OFF ); need = HDR_SIZE + payload_size; if ( need > MAX_SIZE ) { throw new HpiException( "Incoming data is too large" ); } } } rc = ( hpos == need ); } catch ( IOException e ) { } // TODO check id, len, type return rc; } private void setInt8( int off, byte x ) { pdu[off] = x; } private void setInt32( int off, int x ) { // NB: Request data is always little-endian pdu[off] = (byte)( x ); pdu[off + 1] = (byte)( x >>> 8 ); pdu[off + 2] = (byte)( x >>> 16 ); pdu[off + 3] = (byte)( x >>> 24 ); } private int getInt32( int off ) { int b0, b1, b2, b3; if ( isLittleEndian() ) { b0 = (int)(pdu[off]) & 0xFF; b1 = (int)(pdu[off + 1]) & 0xFF; b2 = (int)(pdu[off + 2]) & 0xFF; b3 = (int)(pdu[off + 3]) & 0xFF; } else { b3 = (int)(pdu[off]) & 0xFF; b2 = (int)(pdu[off + 1]) & 0xFF; b1 = (int)(pdu[off + 2]) & 0xFF; b0 = (int)(pdu[off + 3]) & 0xFF; } return ( b3 << 24 ) | ( b2 << 16 ) | ( b1 << 8 ) | b0; } private void dumpPdu( String name ) { System.out.printf( "PDU %s\n", name ); System.out.printf( " LPOS = %d\n", lpos ); System.out.printf( " HPOS = %d\n", hpos ); for ( int i = 0; i < hpos; ++i ) { System.out.printf( " DATA[%d] = %x\n", i, pdu[i] ); } } }; openhpi-3.6.1/baselibs/java/openhpi_baselib/OhpiUtil.java0000644000175100017510000001062112575647300022414 0ustar mohanmohan/* -*- java -*- * * Copyright (C) 2012, Pigeon Point Systems * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ package org.openhpi; import java.io.UnsupportedEncodingException; import java.lang.IllegalArgumentException; import java.lang.Math; import java.util.AbstractMap; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.LinkedList; import java.util.Map; import java.util.Map.Entry; import static org.openhpi.HpiDataTypes.*; import static org.openhpi.OhpiDataTypes.*; public class OhpiUtil { /********************************************************** * NB: ToXXX throws IllegalArgumentException if lookup fails *********************************************************/ // Just to ensure nobody creates it private OhpiUtil() { // empty } /********************************************************** * Check Functions for OHPI Complex Data Types *********************************************************/ /** * Check function for OHPI struct oHpiHandlerConfigT */ public static boolean check( oHpiHandlerConfigT x ) { if ( x == null ) { return false; } if ( x.items == null ) { return false; } for ( Entry kv : x.items ) { byte[] k = kv.getKey(); if ( k == null ) { return false; } if ( k.length != SAHPI_MAX_TEXT_BUFFER_LENGTH ) { return false; } byte[] v = kv.getValue(); if ( v == null ) { return false; } if ( v.length != SAHPI_MAX_TEXT_BUFFER_LENGTH ) { return false; } } return true; } /********************************************************** * oHpiHandlerConfigT Helpers *********************************************************/ public static Map fromoHpiHandlerConfigT( oHpiHandlerConfigT config ) { HashMap hm = new HashMap(); for ( Entry kv : config.items ) { try { hm.put( new String( kv.getKey(), "US-ASCII" ), new String( kv.getValue(), "US-ASCII" ) ); } catch ( UnsupportedEncodingException e ) { throw new IllegalArgumentException(); } } return hm; } public static oHpiHandlerConfigT tooHpiHandlerConfigT( Map hm ) { oHpiHandlerConfigT config = new oHpiHandlerConfigT(); config.items = new LinkedList< Entry >(); if ( hm.size() > 255 ) { throw new IllegalArgumentException(); } for ( Entry kv : hm.entrySet() ) { int len; byte[] encoded; String k = kv.getKey(); if ( k == null ) { throw new IllegalArgumentException(); } byte[] name = new byte[SAHPI_MAX_TEXT_BUFFER_LENGTH]; try { encoded = k.getBytes( "US-ASCII" ); } catch ( UnsupportedEncodingException e ) { throw new IllegalArgumentException(); } len = Math.min( encoded.length, SAHPI_MAX_TEXT_BUFFER_LENGTH ); System.arraycopy( encoded, 0, name, 0, len ); String v = kv.getValue(); if ( v == null ) { throw new IllegalArgumentException(); } byte[] val = new byte[SAHPI_MAX_TEXT_BUFFER_LENGTH]; try { encoded = v.getBytes( "US-ASCII" ); } catch ( UnsupportedEncodingException e ) { throw new IllegalArgumentException(); } len = Math.min( encoded.length, SAHPI_MAX_TEXT_BUFFER_LENGTH ); System.arraycopy( encoded, 0, val, 0, len ); config.items.add( new AbstractMap.SimpleEntry( name, val ) ); } return config; } }; openhpi-3.6.1/baselibs/java/openhpi_baselib/HpiMarshalCore.java0000644000175100017510000002122112575647300023516 0ustar mohanmohan/* -*- java -*- * * Copyright (C) 2012, Pigeon Point Systems * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ package org.openhpi; class HpiMarshalCore { private HpiTransport transport; private final int BBUF_SIZE = 8; private final int LBUF_SIZE = 8; private byte[] bbuf; private long[] lbuf; private boolean little_endian_demarshal; public boolean open( String host, int port ) { transport = new HpiTransport(); boolean rc = transport.open( host, port ); if ( rc ) { bbuf = new byte[BBUF_SIZE]; lbuf = new long[LBUF_SIZE]; } return rc; } public void close() { transport.close(); bbuf = null; lbuf = null; } public void reset() { transport.reset(); } public boolean interchange( int rpc_id ) throws HpiException { boolean rc = transport.interchange( rpc_id ); if ( rc ) { little_endian_demarshal = transport.isLittleEndian(); } return rc; } /********************************************************** * Marshal: For HPI Basic Data Types *********************************************************/ public void marshalSaHpiUint8T( long x ) { transport.putByte( (byte)( x ) ); } public void marshalSaHpiUint16T( long x ) { bbuf[0] = (byte)( x ); bbuf[1] = (byte)( x >>> 8 ); transport.putBytes( bbuf, 2 ); } public void marshalSaHpiUint32T( long x ) { bbuf[0] = (byte)( x ); bbuf[1] = (byte)( x >>> 8 ); bbuf[2] = (byte)( x >>> 16 ); bbuf[3] = (byte)( x >>> 24 ); transport.putBytes( bbuf, 4 ); } public void marshalSaHpiUint64T( long x ) { bbuf[0] = (byte)( x ); bbuf[1] = (byte)( x >>> 8 ); bbuf[2] = (byte)( x >>> 16 ); bbuf[3] = (byte)( x >>> 24 ); bbuf[4] = (byte)( x >>> 32 ); bbuf[5] = (byte)( x >>> 40 ); bbuf[6] = (byte)( x >>> 48 ); bbuf[7] = (byte)( x >>> 56 ); transport.putBytes( bbuf, 8 ); } public void marshalSaHpiInt8T( long x ) { transport.putByte( (byte)( x ) ); } public void marshalSaHpiInt16T( long x ) { bbuf[0] = (byte)( x ); bbuf[1] = (byte)( x >>> 8 ); transport.putBytes( bbuf, 2 ); } public void marshalSaHpiInt32T( long x ) { bbuf[0] = (byte)( x ); bbuf[1] = (byte)( x >>> 8 ); bbuf[2] = (byte)( x >>> 16 ); bbuf[3] = (byte)( x >>> 24 ); transport.putBytes( bbuf, 4 ); } public void marshalSaHpiInt64T( long x ) { bbuf[0] = (byte)( x ); bbuf[1] = (byte)( x >>> 8 ); bbuf[2] = (byte)( x >>> 16 ); bbuf[3] = (byte)( x >>> 24 ); bbuf[4] = (byte)( x >>> 32 ); bbuf[5] = (byte)( x >>> 40 ); bbuf[6] = (byte)( x >>> 48 ); bbuf[7] = (byte)( x >>> 56 ); transport.putBytes( bbuf, 8 ); } public void marshalEnum( long x ) { marshalSaHpiInt32T( x ); } public void marshalSaHpiFloat64T( double x ) { marshalSaHpiInt64T( Double.doubleToLongBits( x ) ); } public void marshalByteArray( byte[] x, int count ) { transport.putBytes( x, count ); } /********************************************************** * Demarshal: For HPI Basic Data Types *********************************************************/ public long demarshalSaHpiUint8T() throws HpiException { return transport.getByte() & 0xFFL; } public long demarshalSaHpiUint16T() throws HpiException { transport.getBytes( 2, bbuf ); if ( little_endian_demarshal ) { lbuf[0] = bbuf[0] & 0xFFL; lbuf[1] = bbuf[1] & 0xFFL; } else { lbuf[0] = bbuf[1] & 0xFFL; lbuf[1] = bbuf[0] & 0xFFL; } return ( lbuf[1] << 8 ) | lbuf[0]; } public long demarshalSaHpiUint32T() throws HpiException { transport.getBytes( 4, bbuf ); if ( little_endian_demarshal ) { lbuf[0] = bbuf[0] & 0xFFL; lbuf[1] = bbuf[1] & 0xFFL; lbuf[2] = bbuf[2] & 0xFFL; lbuf[3] = bbuf[3] & 0xFFL; } else { lbuf[0] = bbuf[3] & 0xFFL; lbuf[1] = bbuf[2] & 0xFFL; lbuf[2] = bbuf[1] & 0xFFL; lbuf[3] = bbuf[0] & 0xFFL; } return ( lbuf[3] << 24 ) | ( lbuf[2] << 16 ) | ( lbuf[1] << 8 ) | lbuf[0]; } public long demarshalSaHpiUint64T() throws HpiException { // NB: highest byte & 0xFFL for getting unsigned value // makes no sense for 64bit integer. // And Java has no 128bit integer. // So for SaHpiUint64T we have no reliable demarshal. transport.getBytes( 8, bbuf ); if ( little_endian_demarshal ) { lbuf[0] = bbuf[0] & 0xFFL; lbuf[1] = bbuf[1] & 0xFFL; lbuf[2] = bbuf[2] & 0xFFL; lbuf[3] = bbuf[3] & 0xFFL; lbuf[4] = bbuf[4] & 0xFFL; lbuf[5] = bbuf[5] & 0xFFL; lbuf[6] = bbuf[6] & 0xFFL; lbuf[7] = bbuf[7] & 0xFFL; } else { lbuf[0] = bbuf[7] & 0xFFL; lbuf[1] = bbuf[6] & 0xFFL; lbuf[2] = bbuf[5] & 0xFFL; lbuf[3] = bbuf[4] & 0xFFL; lbuf[4] = bbuf[3] & 0xFFL; lbuf[5] = bbuf[2] & 0xFFL; lbuf[6] = bbuf[1] & 0xFFL; lbuf[7] = bbuf[0] & 0xFFL; } return ( lbuf[7] << 56 ) | ( lbuf[6] << 48 ) | ( lbuf[5] << 40 ) | ( lbuf[4] << 32 ) | ( lbuf[3] << 24 ) | ( lbuf[2] << 16 ) | ( lbuf[1] << 8 ) | lbuf[0]; } public long demarshalSaHpiInt8T() throws HpiException { return transport.getByte(); } public long demarshalSaHpiInt16T() throws HpiException { transport.getBytes( 2, bbuf ); if ( little_endian_demarshal ) { lbuf[0] = bbuf[0] & 0xFFL; lbuf[1] = bbuf[1]; } else { lbuf[0] = bbuf[1] & 0xFFL; lbuf[1] = bbuf[0]; } return ( lbuf[1] << 8 ) | lbuf[0]; } public long demarshalSaHpiInt32T() throws HpiException { transport.getBytes( 4, bbuf ); if ( little_endian_demarshal ) { lbuf[0] = bbuf[0] & 0xFFL; lbuf[1] = bbuf[1] & 0xFFL; lbuf[2] = bbuf[2] & 0xFFL; lbuf[3] = bbuf[3]; } else { lbuf[0] = bbuf[3] & 0xFFL; lbuf[1] = bbuf[2] & 0xFFL; lbuf[2] = bbuf[1] & 0xFFL; lbuf[3] = bbuf[0]; } return ( lbuf[3] << 24 ) | ( lbuf[2] << 16 ) | ( lbuf[1] << 8 ) | lbuf[0]; } public long demarshalSaHpiInt64T() throws HpiException { transport.getBytes( 8, bbuf ); if ( little_endian_demarshal ) { lbuf[0] = bbuf[0] & 0xFFL; lbuf[1] = bbuf[1] & 0xFFL; lbuf[2] = bbuf[2] & 0xFFL; lbuf[3] = bbuf[3] & 0xFFL; lbuf[4] = bbuf[4] & 0xFFL; lbuf[5] = bbuf[5] & 0xFFL; lbuf[6] = bbuf[6] & 0xFFL; lbuf[7] = bbuf[7]; } else { lbuf[0] = bbuf[7] & 0xFFL; lbuf[1] = bbuf[6] & 0xFFL; lbuf[2] = bbuf[5] & 0xFFL; lbuf[3] = bbuf[4] & 0xFFL; lbuf[4] = bbuf[3] & 0xFFL; lbuf[5] = bbuf[2] & 0xFFL; lbuf[6] = bbuf[1] & 0xFFL; lbuf[7] = bbuf[0]; } return ( lbuf[7] << 56 ) | ( lbuf[6] << 48 ) | ( lbuf[5] << 40 ) | ( lbuf[4] << 32 ) | ( lbuf[3] << 24 ) | ( lbuf[2] << 16 ) | ( lbuf[1] << 8 ) | lbuf[0]; } public long demarshalEnum() throws HpiException { return demarshalSaHpiInt32T(); } public double demarshalSaHpiFloat64T() throws HpiException { return Double.longBitsToDouble( demarshalSaHpiInt64T() ); } public byte[] demarshalByteArray( int count ) throws HpiException { byte[] x = new byte[count]; transport.getBytes( count, x ); return x; } }; openhpi-3.6.1/baselibs/java/openhpi_baselib/manifest.txt0000644000175100017510000000026012575647300022361 0ustar mohanmohan Name: org.openhpi Implementation-Title: OpenHPI Base Library For Java Implementation-Vendor: openhpi.org Implementation-URL: http://openhpi.org Implementation-Version: 3.6.1 openhpi-3.6.1/baselibs/java/openhpi_baselib/HpiCore.java0000644000175100017510000001214212575647300022210 0ustar mohanmohan/* -*- java -*- * * Copyright (C) 2012, Pigeon Point Systems * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ package org.openhpi; import java.util.concurrent.ConcurrentHashMap; import java.util.Map; import static org.openhpi.HpiDataTypes.SAHPI_UNSPECIFIED_DOMAIN_ID; import static org.openhpi.HpiDataTypes.SaHpiEntityPathT; import static org.openhpi.HpiDataTypes.SaHpiTextBufferT; import static org.openhpi.OhpiDataTypes.OPENHPI_DEFAULT_DAEMON_PORT; class HpiCore { private static ConcurrentHashMap domains; private static ConcurrentHashMap sessions; private static SaHpiEntityPathT my_ep; static { domains = new ConcurrentHashMap(); sessions = new ConcurrentHashMap(); my_ep = null; createDefaultDomain(); } private static void createDefaultDomain() { if ( domains.containsKey( SAHPI_UNSPECIFIED_DOMAIN_ID ) ) { return; } String host = System.getenv( "OPENHPI_DAEMON_HOST" ); if ( host == null ) { host = "localhost"; } int port; String portstr = System.getenv( "OPENHPI_DAEMON_PORT" ); if ( portstr != null ) { try { port = Integer.parseInt( portstr ); } catch ( NumberFormatException e ) { port = OPENHPI_DEFAULT_DAEMON_PORT; } } else { port = OPENHPI_DEFAULT_DAEMON_PORT; } HpiDomain d = new HpiDomain( SAHPI_UNSPECIFIED_DOMAIN_ID, host, port, HpiUtil.makeRootSaHpiEntityPathT() ); domains.put( d.getLocalDid(), d ); } static HpiDomain createDomain( String host, int port, SaHpiEntityPathT entity_root ) { HpiDomain d = new HpiDomain( SAHPI_UNSPECIFIED_DOMAIN_ID, host, port, entity_root ); for ( long did = 0; did < Long.MAX_VALUE; ++did ) { HpiDomain d2 = domains.putIfAbsent( did, d ); if ( d2 == null ) { d.setLocalDid( did ); return d; } } return null; } /********************************************************** * Creates and returns new domain with specified Domain Id * Returns null if overwrite == false and * the specified Domain Id is already in use *********************************************************/ static HpiDomain createDomainById( long did, String host, int port, SaHpiEntityPathT entity_root, boolean overwrite ) { HpiDomain dnew = new HpiDomain( did, host, port, entity_root ); if ( overwrite ) { domains.put( did, dnew ); } else { HpiDomain dprev = domains.putIfAbsent( did, dnew ); if ( dprev != null ) { dnew = null; } } return dnew; } static HpiSession createSession( long local_did ) { HpiDomain d = domains.get( local_did ); if ( d == null ) { return null; } HpiSession s = new HpiSession( d ); sessions.put( s.getLocalSid(), s ); return s; } static void removeSession( HpiSession s ) { if ( s == null ) { return; } sessions.remove( s.getLocalSid() ); s.close(); } static HpiSession getSession( long local_sid ) { return sessions.get( local_sid ); } static SaHpiEntityPathT getMyEntity() { return HpiUtil.cloneSaHpiEntityPathT( my_ep ); } static void setMyEntity( SaHpiEntityPathT ep ) { my_ep = HpiUtil.cloneSaHpiEntityPathT( ep ); } private static void dump() { if ( my_ep != null ) { System.out.printf( "My Entity: %s\n", HpiUtil.fromSaHpiEntityPathT( my_ep ) ); } System.out.printf( "Defined Domains:\n" ); for ( Map.Entry e: domains.entrySet() ) { System.out.printf( " id %d => id %d, host %s, port %d, root %s\n", e.getValue().getLocalDid(), e.getValue().getRemoteDid(), e.getValue().getRemoteHost(), e.getValue().getRemotePort(), HpiUtil.fromSaHpiEntityPathT( e.getValue().getEntityRoot() ) ); } } }; openhpi-3.6.1/baselibs/java/openhpi_baselib/HpiUtilGen.java0000644000175100017510000053167412575647300022707 0ustar mohanmohan/* -*- java -*- * * Copyright (C) 2012, Pigeon Point Systems * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ package org.openhpi; import java.lang.IllegalArgumentException; import static org.openhpi.HpiDataTypes.*; /********************************************************** * HPI Utility Functions (auto-generated) *********************************************************/ public class HpiUtilGen { // Just to ensure nobody creates it protected HpiUtilGen() { // empty } /********************************************************** * Check Functions for HPI Complex Data Types *********************************************************/ /** * check function for struct SaHpiTextBufferT */ public static boolean check( SaHpiTextBufferT x ) { if ( x == null ) { return false; } if ( x.Data == null ) { return false; } if ( x.Data.length != SAHPI_MAX_TEXT_BUFFER_LENGTH ) { return false; } return true; } /** * check function for struct SaHpiEntityT */ public static boolean check( SaHpiEntityT x ) { if ( x == null ) { return false; } return true; } /** * check function for struct SaHpiEntityPathT */ public static boolean check( SaHpiEntityPathT x ) { if ( x == null ) { return false; } if ( x.Entry == null ) { return false; } if ( x.Entry.length != SAHPI_MAX_ENTITY_PATH ) { return false; } for ( int i = 0; i < SAHPI_MAX_ENTITY_PATH; ++i ) { if ( !check( x.Entry[i] ) ) { return false; } } return true; } /** * check function for union SaHpiSensorReadingUnionT */ public static boolean check( SaHpiSensorReadingUnionT x, long mod ) { if ( x == null ) { return false; } if ( mod == SAHPI_SENSOR_READING_TYPE_BUFFER ) { if ( x.SensorBuffer == null ) { return false; } } if ( mod == SAHPI_SENSOR_READING_TYPE_BUFFER ) { if ( x.SensorBuffer.length != SAHPI_SENSOR_BUFFER_LENGTH ) { return false; } } return true; } /** * check function for struct SaHpiSensorReadingT */ public static boolean check( SaHpiSensorReadingT x ) { if ( x == null ) { return false; } if ( !check( x.Value, x.Type ) ) { return false; } return true; } /** * check function for struct SaHpiSensorThresholdsT */ public static boolean check( SaHpiSensorThresholdsT x ) { if ( x == null ) { return false; } if ( !check( x.LowCritical ) ) { return false; } if ( !check( x.LowMajor ) ) { return false; } if ( !check( x.LowMinor ) ) { return false; } if ( !check( x.UpCritical ) ) { return false; } if ( !check( x.UpMajor ) ) { return false; } if ( !check( x.UpMinor ) ) { return false; } if ( !check( x.PosThdHysteresis ) ) { return false; } if ( !check( x.NegThdHysteresis ) ) { return false; } return true; } /** * check function for struct SaHpiSensorRangeT */ public static boolean check( SaHpiSensorRangeT x ) { if ( x == null ) { return false; } if ( !check( x.Max ) ) { return false; } if ( !check( x.Min ) ) { return false; } if ( !check( x.Nominal ) ) { return false; } if ( !check( x.NormalMax ) ) { return false; } if ( !check( x.NormalMin ) ) { return false; } return true; } /** * check function for struct SaHpiSensorDataFormatT */ public static boolean check( SaHpiSensorDataFormatT x ) { if ( x == null ) { return false; } if ( !check( x.Range ) ) { return false; } return true; } /** * check function for struct SaHpiSensorThdDefnT */ public static boolean check( SaHpiSensorThdDefnT x ) { if ( x == null ) { return false; } return true; } /** * check function for struct SaHpiSensorRecT */ public static boolean check( SaHpiSensorRecT x ) { if ( x == null ) { return false; } if ( !check( x.DataFormat ) ) { return false; } if ( !check( x.ThresholdDefn ) ) { return false; } return true; } /** * check function for struct SaHpiCtrlStateStreamT */ public static boolean check( SaHpiCtrlStateStreamT x ) { if ( x == null ) { return false; } if ( x.Stream == null ) { return false; } if ( x.Stream.length != SAHPI_CTRL_MAX_STREAM_LENGTH ) { return false; } return true; } /** * check function for struct SaHpiCtrlStateTextT */ public static boolean check( SaHpiCtrlStateTextT x ) { if ( x == null ) { return false; } if ( !check( x.Text ) ) { return false; } return true; } /** * check function for struct SaHpiCtrlStateOemT */ public static boolean check( SaHpiCtrlStateOemT x ) { if ( x == null ) { return false; } if ( x.Body == null ) { return false; } if ( x.Body.length != SAHPI_CTRL_MAX_OEM_BODY_LENGTH ) { return false; } return true; } /** * check function for union SaHpiCtrlStateUnionT */ public static boolean check( SaHpiCtrlStateUnionT x, long mod ) { if ( x == null ) { return false; } if ( mod == SAHPI_CTRL_TYPE_STREAM ) { if ( !check( x.Stream ) ) { return false; } } if ( mod == SAHPI_CTRL_TYPE_TEXT ) { if ( !check( x.Text ) ) { return false; } } if ( mod == SAHPI_CTRL_TYPE_OEM ) { if ( !check( x.Oem ) ) { return false; } } return true; } /** * check function for struct SaHpiCtrlStateT */ public static boolean check( SaHpiCtrlStateT x ) { if ( x == null ) { return false; } if ( !check( x.StateUnion, x.Type ) ) { return false; } return true; } /** * check function for struct SaHpiCtrlRecDigitalT */ public static boolean check( SaHpiCtrlRecDigitalT x ) { if ( x == null ) { return false; } return true; } /** * check function for struct SaHpiCtrlRecDiscreteT */ public static boolean check( SaHpiCtrlRecDiscreteT x ) { if ( x == null ) { return false; } return true; } /** * check function for struct SaHpiCtrlRecAnalogT */ public static boolean check( SaHpiCtrlRecAnalogT x ) { if ( x == null ) { return false; } return true; } /** * check function for struct SaHpiCtrlRecStreamT */ public static boolean check( SaHpiCtrlRecStreamT x ) { if ( x == null ) { return false; } if ( !check( x.Default ) ) { return false; } return true; } /** * check function for struct SaHpiCtrlRecTextT */ public static boolean check( SaHpiCtrlRecTextT x ) { if ( x == null ) { return false; } if ( !check( x.Default ) ) { return false; } return true; } /** * check function for struct SaHpiCtrlRecOemT */ public static boolean check( SaHpiCtrlRecOemT x ) { if ( x == null ) { return false; } if ( x.ConfigData == null ) { return false; } if ( x.ConfigData.length != SAHPI_CTRL_OEM_CONFIG_LENGTH ) { return false; } if ( !check( x.Default ) ) { return false; } return true; } /** * check function for union SaHpiCtrlRecUnionT */ public static boolean check( SaHpiCtrlRecUnionT x, long mod ) { if ( x == null ) { return false; } if ( mod == SAHPI_CTRL_TYPE_DIGITAL ) { if ( !check( x.Digital ) ) { return false; } } if ( mod == SAHPI_CTRL_TYPE_DISCRETE ) { if ( !check( x.Discrete ) ) { return false; } } if ( mod == SAHPI_CTRL_TYPE_ANALOG ) { if ( !check( x.Analog ) ) { return false; } } if ( mod == SAHPI_CTRL_TYPE_STREAM ) { if ( !check( x.Stream ) ) { return false; } } if ( mod == SAHPI_CTRL_TYPE_TEXT ) { if ( !check( x.Text ) ) { return false; } } if ( mod == SAHPI_CTRL_TYPE_OEM ) { if ( !check( x.Oem ) ) { return false; } } return true; } /** * check function for struct SaHpiCtrlDefaultModeT */ public static boolean check( SaHpiCtrlDefaultModeT x ) { if ( x == null ) { return false; } return true; } /** * check function for struct SaHpiCtrlRecT */ public static boolean check( SaHpiCtrlRecT x ) { if ( x == null ) { return false; } if ( !check( x.TypeUnion, x.Type ) ) { return false; } if ( !check( x.DefaultMode ) ) { return false; } return true; } /** * check function for struct SaHpiIdrFieldT */ public static boolean check( SaHpiIdrFieldT x ) { if ( x == null ) { return false; } if ( !check( x.Field ) ) { return false; } return true; } /** * check function for struct SaHpiIdrAreaHeaderT */ public static boolean check( SaHpiIdrAreaHeaderT x ) { if ( x == null ) { return false; } return true; } /** * check function for struct SaHpiIdrInfoT */ public static boolean check( SaHpiIdrInfoT x ) { if ( x == null ) { return false; } return true; } /** * check function for struct SaHpiInventoryRecT */ public static boolean check( SaHpiInventoryRecT x ) { if ( x == null ) { return false; } return true; } /** * check function for struct SaHpiWatchdogT */ public static boolean check( SaHpiWatchdogT x ) { if ( x == null ) { return false; } return true; } /** * check function for struct SaHpiWatchdogRecT */ public static boolean check( SaHpiWatchdogRecT x ) { if ( x == null ) { return false; } return true; } /** * check function for struct SaHpiDimiTestAffectedEntityT */ public static boolean check( SaHpiDimiTestAffectedEntityT x ) { if ( x == null ) { return false; } if ( !check( x.EntityImpacted ) ) { return false; } return true; } /** * check function for struct SaHpiDimiTestResultsT */ public static boolean check( SaHpiDimiTestResultsT x ) { if ( x == null ) { return false; } if ( !check( x.TestResultString ) ) { return false; } return true; } /** * check function for union SaHpiDimiTestParamValueT */ public static boolean check( SaHpiDimiTestParamValueT x, long mod ) { if ( x == null ) { return false; } if ( mod == SAHPI_DIMITEST_PARAM_TYPE_TEXT ) { if ( !check( x.paramtext ) ) { return false; } } return true; } /** * check function for union SaHpiDimiTestParameterValueUnionT */ public static boolean check( SaHpiDimiTestParameterValueUnionT x, long mod ) { if ( x == null ) { return false; } return true; } /** * check function for struct SaHpiDimiTestParamsDefinitionT */ public static boolean check( SaHpiDimiTestParamsDefinitionT x ) { if ( x == null ) { return false; } if ( x.ParamName == null ) { return false; } if ( x.ParamName.length != SAHPI_DIMITEST_PARAM_NAME_LEN ) { return false; } if ( !check( x.ParamInfo ) ) { return false; } if ( !check( x.MinValue, x.ParamType ) ) { return false; } if ( !check( x.MaxValue, x.ParamType ) ) { return false; } if ( !check( x.DefaultParam, x.ParamType ) ) { return false; } return true; } /** * check function for struct SaHpiDimiTestT */ public static boolean check( SaHpiDimiTestT x ) { if ( x == null ) { return false; } if ( !check( x.TestName ) ) { return false; } if ( x.EntitiesImpacted == null ) { return false; } if ( x.EntitiesImpacted.length != SAHPI_DIMITEST_MAX_ENTITIESIMPACTED ) { return false; } for ( int i = 0; i < SAHPI_DIMITEST_MAX_ENTITIESIMPACTED; ++i ) { if ( !check( x.EntitiesImpacted[i] ) ) { return false; } } if ( !check( x.ServiceOS ) ) { return false; } if ( x.TestParameters == null ) { return false; } if ( x.TestParameters.length != SAHPI_DIMITEST_MAX_PARAMETERS ) { return false; } for ( int i = 0; i < SAHPI_DIMITEST_MAX_PARAMETERS; ++i ) { if ( !check( x.TestParameters[i] ) ) { return false; } } return true; } /** * check function for struct SaHpiDimiTestVariableParamsT */ public static boolean check( SaHpiDimiTestVariableParamsT x ) { if ( x == null ) { return false; } if ( x.ParamName == null ) { return false; } if ( x.ParamName.length != SAHPI_DIMITEST_PARAM_NAME_LEN ) { return false; } if ( !check( x.Value, x.ParamType ) ) { return false; } return true; } /** * check function for struct SaHpiDimiInfoT */ public static boolean check( SaHpiDimiInfoT x ) { if ( x == null ) { return false; } return true; } /** * check function for struct SaHpiDimiRecT */ public static boolean check( SaHpiDimiRecT x ) { if ( x == null ) { return false; } return true; } /** * check function for struct SaHpiFumiSafDefinedSpecInfoT */ public static boolean check( SaHpiFumiSafDefinedSpecInfoT x ) { if ( x == null ) { return false; } return true; } /** * check function for struct SaHpiFumiOemDefinedSpecInfoT */ public static boolean check( SaHpiFumiOemDefinedSpecInfoT x ) { if ( x == null ) { return false; } if ( x.Body == null ) { return false; } if ( x.Body.length != SAHPI_FUMI_MAX_OEM_BODY_LENGTH ) { return false; } return true; } /** * check function for union SaHpiFumiSpecInfoTypeUnionT */ public static boolean check( SaHpiFumiSpecInfoTypeUnionT x, long mod ) { if ( x == null ) { return false; } if ( mod == SAHPI_FUMI_SPEC_INFO_SAF_DEFINED ) { if ( !check( x.SafDefined ) ) { return false; } } if ( mod == SAHPI_FUMI_SPEC_INFO_OEM_DEFINED ) { if ( !check( x.OemDefined ) ) { return false; } } return true; } /** * check function for struct SaHpiFumiSpecInfoT */ public static boolean check( SaHpiFumiSpecInfoT x ) { if ( x == null ) { return false; } if ( !check( x.SpecInfoTypeUnion, x.SpecInfoType ) ) { return false; } return true; } /** * check function for struct SaHpiFumiFirmwareInstanceInfoT */ public static boolean check( SaHpiFumiFirmwareInstanceInfoT x ) { if ( x == null ) { return false; } if ( !check( x.Identifier ) ) { return false; } if ( !check( x.Description ) ) { return false; } if ( !check( x.DateTime ) ) { return false; } return true; } /** * check function for struct SaHpiFumiImpactedEntityT */ public static boolean check( SaHpiFumiImpactedEntityT x ) { if ( x == null ) { return false; } if ( !check( x.ImpactedEntity ) ) { return false; } return true; } /** * check function for struct SaHpiFumiServiceImpactDataT */ public static boolean check( SaHpiFumiServiceImpactDataT x ) { if ( x == null ) { return false; } if ( x.ImpactedEntities == null ) { return false; } if ( x.ImpactedEntities.length != SAHPI_FUMI_MAX_ENTITIES_IMPACTED ) { return false; } for ( int i = 0; i < SAHPI_FUMI_MAX_ENTITIES_IMPACTED; ++i ) { if ( !check( x.ImpactedEntities[i] ) ) { return false; } } return true; } /** * check function for struct SaHpiFumiSourceInfoT */ public static boolean check( SaHpiFumiSourceInfoT x ) { if ( x == null ) { return false; } if ( !check( x.SourceUri ) ) { return false; } if ( !check( x.Identifier ) ) { return false; } if ( !check( x.Description ) ) { return false; } if ( !check( x.DateTime ) ) { return false; } return true; } /** * check function for struct SaHpiFumiComponentInfoT */ public static boolean check( SaHpiFumiComponentInfoT x ) { if ( x == null ) { return false; } if ( !check( x.MainFwInstance ) ) { return false; } return true; } /** * check function for struct SaHpiFumiBankInfoT */ public static boolean check( SaHpiFumiBankInfoT x ) { if ( x == null ) { return false; } if ( !check( x.Identifier ) ) { return false; } if ( !check( x.Description ) ) { return false; } if ( !check( x.DateTime ) ) { return false; } return true; } /** * check function for struct SaHpiFumiLogicalBankInfoT */ public static boolean check( SaHpiFumiLogicalBankInfoT x ) { if ( x == null ) { return false; } if ( !check( x.PendingFwInstance ) ) { return false; } if ( !check( x.RollbackFwInstance ) ) { return false; } return true; } /** * check function for struct SaHpiFumiLogicalComponentInfoT */ public static boolean check( SaHpiFumiLogicalComponentInfoT x ) { if ( x == null ) { return false; } if ( !check( x.PendingFwInstance ) ) { return false; } if ( !check( x.RollbackFwInstance ) ) { return false; } return true; } /** * check function for struct SaHpiFumiRecT */ public static boolean check( SaHpiFumiRecT x ) { if ( x == null ) { return false; } return true; } /** * check function for struct SaHpiResourceEventT */ public static boolean check( SaHpiResourceEventT x ) { if ( x == null ) { return false; } return true; } /** * check function for struct SaHpiDomainEventT */ public static boolean check( SaHpiDomainEventT x ) { if ( x == null ) { return false; } return true; } /** * check function for struct SaHpiSensorEventT */ public static boolean check( SaHpiSensorEventT x ) { if ( x == null ) { return false; } if ( !check( x.TriggerReading ) ) { return false; } if ( !check( x.TriggerThreshold ) ) { return false; } return true; } /** * check function for struct SaHpiSensorEnableChangeEventT */ public static boolean check( SaHpiSensorEnableChangeEventT x ) { if ( x == null ) { return false; } return true; } /** * check function for struct SaHpiHotSwapEventT */ public static boolean check( SaHpiHotSwapEventT x ) { if ( x == null ) { return false; } return true; } /** * check function for struct SaHpiWatchdogEventT */ public static boolean check( SaHpiWatchdogEventT x ) { if ( x == null ) { return false; } return true; } /** * check function for struct SaHpiHpiSwEventT */ public static boolean check( SaHpiHpiSwEventT x ) { if ( x == null ) { return false; } if ( !check( x.EventData ) ) { return false; } return true; } /** * check function for struct SaHpiOemEventT */ public static boolean check( SaHpiOemEventT x ) { if ( x == null ) { return false; } if ( !check( x.OemEventData ) ) { return false; } return true; } /** * check function for struct SaHpiUserEventT */ public static boolean check( SaHpiUserEventT x ) { if ( x == null ) { return false; } if ( !check( x.UserEventData ) ) { return false; } return true; } /** * check function for struct SaHpiDimiEventT */ public static boolean check( SaHpiDimiEventT x ) { if ( x == null ) { return false; } return true; } /** * check function for struct SaHpiDimiUpdateEventT */ public static boolean check( SaHpiDimiUpdateEventT x ) { if ( x == null ) { return false; } return true; } /** * check function for struct SaHpiFumiEventT */ public static boolean check( SaHpiFumiEventT x ) { if ( x == null ) { return false; } return true; } /** * check function for union SaHpiEventUnionT */ public static boolean check( SaHpiEventUnionT x, long mod ) { if ( x == null ) { return false; } if ( mod == SAHPI_ET_RESOURCE ) { if ( !check( x.ResourceEvent ) ) { return false; } } if ( mod == SAHPI_ET_DOMAIN ) { if ( !check( x.DomainEvent ) ) { return false; } } if ( mod == SAHPI_ET_SENSOR ) { if ( !check( x.SensorEvent ) ) { return false; } } if ( mod == SAHPI_ET_SENSOR_ENABLE_CHANGE ) { if ( !check( x.SensorEnableChangeEvent ) ) { return false; } } if ( mod == SAHPI_ET_HOTSWAP ) { if ( !check( x.HotSwapEvent ) ) { return false; } } if ( mod == SAHPI_ET_WATCHDOG ) { if ( !check( x.WatchdogEvent ) ) { return false; } } if ( mod == SAHPI_ET_HPI_SW ) { if ( !check( x.HpiSwEvent ) ) { return false; } } if ( mod == SAHPI_ET_OEM ) { if ( !check( x.OemEvent ) ) { return false; } } if ( mod == SAHPI_ET_USER ) { if ( !check( x.UserEvent ) ) { return false; } } if ( mod == SAHPI_ET_DIMI ) { if ( !check( x.DimiEvent ) ) { return false; } } if ( mod == SAHPI_ET_DIMI_UPDATE ) { if ( !check( x.DimiUpdateEvent ) ) { return false; } } if ( mod == SAHPI_ET_FUMI ) { if ( !check( x.FumiEvent ) ) { return false; } } return true; } /** * check function for struct SaHpiEventT */ public static boolean check( SaHpiEventT x ) { if ( x == null ) { return false; } if ( !check( x.EventDataUnion, x.EventType ) ) { return false; } return true; } /** * check function for struct SaHpiNameT */ public static boolean check( SaHpiNameT x ) { if ( x == null ) { return false; } if ( x.Value == null ) { return false; } if ( x.Value.length != SA_HPI_MAX_NAME_LENGTH ) { return false; } return true; } /** * check function for struct SaHpiConditionT */ public static boolean check( SaHpiConditionT x ) { if ( x == null ) { return false; } if ( !check( x.Entity ) ) { return false; } if ( !check( x.Name ) ) { return false; } if ( !check( x.Data ) ) { return false; } return true; } /** * check function for struct SaHpiAnnouncementT */ public static boolean check( SaHpiAnnouncementT x ) { if ( x == null ) { return false; } if ( !check( x.StatusCond ) ) { return false; } return true; } /** * check function for struct SaHpiAnnunciatorRecT */ public static boolean check( SaHpiAnnunciatorRecT x ) { if ( x == null ) { return false; } return true; } /** * check function for union SaHpiRdrTypeUnionT */ public static boolean check( SaHpiRdrTypeUnionT x, long mod ) { if ( x == null ) { return false; } if ( mod == SAHPI_CTRL_RDR ) { if ( !check( x.CtrlRec ) ) { return false; } } if ( mod == SAHPI_SENSOR_RDR ) { if ( !check( x.SensorRec ) ) { return false; } } if ( mod == SAHPI_INVENTORY_RDR ) { if ( !check( x.InventoryRec ) ) { return false; } } if ( mod == SAHPI_WATCHDOG_RDR ) { if ( !check( x.WatchdogRec ) ) { return false; } } if ( mod == SAHPI_ANNUNCIATOR_RDR ) { if ( !check( x.AnnunciatorRec ) ) { return false; } } if ( mod == SAHPI_DIMI_RDR ) { if ( !check( x.DimiRec ) ) { return false; } } if ( mod == SAHPI_FUMI_RDR ) { if ( !check( x.FumiRec ) ) { return false; } } return true; } /** * check function for struct SaHpiRdrT */ public static boolean check( SaHpiRdrT x ) { if ( x == null ) { return false; } if ( !check( x.Entity ) ) { return false; } if ( !check( x.RdrTypeUnion, x.RdrType ) ) { return false; } if ( !check( x.IdString ) ) { return false; } return true; } /** * check function for struct SaHpiLoadIdT */ public static boolean check( SaHpiLoadIdT x ) { if ( x == null ) { return false; } if ( !check( x.LoadName ) ) { return false; } return true; } /** * check function for struct SaHpiResourceInfoT */ public static boolean check( SaHpiResourceInfoT x ) { if ( x == null ) { return false; } if ( x.Guid == null ) { return false; } if ( x.Guid.length != SAHPI_GUID_LENGTH ) { return false; } return true; } /** * check function for struct SaHpiRptEntryT */ public static boolean check( SaHpiRptEntryT x ) { if ( x == null ) { return false; } if ( !check( x.ResourceInfo ) ) { return false; } if ( !check( x.ResourceEntity ) ) { return false; } if ( !check( x.ResourceTag ) ) { return false; } return true; } /** * check function for struct SaHpiDomainInfoT */ public static boolean check( SaHpiDomainInfoT x ) { if ( x == null ) { return false; } if ( !check( x.DomainTag ) ) { return false; } if ( x.Guid == null ) { return false; } if ( x.Guid.length != SAHPI_GUID_LENGTH ) { return false; } return true; } /** * check function for struct SaHpiDrtEntryT */ public static boolean check( SaHpiDrtEntryT x ) { if ( x == null ) { return false; } return true; } /** * check function for struct SaHpiAlarmT */ public static boolean check( SaHpiAlarmT x ) { if ( x == null ) { return false; } if ( !check( x.AlarmCond ) ) { return false; } return true; } /** * check function for struct SaHpiEventLogInfoT */ public static boolean check( SaHpiEventLogInfoT x ) { if ( x == null ) { return false; } return true; } /** * check function for struct SaHpiEventLogEntryT */ public static boolean check( SaHpiEventLogEntryT x ) { if ( x == null ) { return false; } if ( !check( x.Event ) ) { return false; } return true; } /********************************************************** * Lookups for enums, errors, event categories... * Value -> Name (FromXXX) * Name -> Value (ToXXX) * NB: ToXXX throws IllegalArgumentException if lookup fails *********************************************************/ /** * For SaHpiLanguageT */ public static String fromSaHpiLanguageT( long x ) { if ( x == SAHPI_LANG_UNDEF ) { return "UNDEF"; } if ( x == SAHPI_LANG_AFAR ) { return "AFAR"; } if ( x == SAHPI_LANG_ABKHAZIAN ) { return "ABKHAZIAN"; } if ( x == SAHPI_LANG_AFRIKAANS ) { return "AFRIKAANS"; } if ( x == SAHPI_LANG_AMHARIC ) { return "AMHARIC"; } if ( x == SAHPI_LANG_ARABIC ) { return "ARABIC"; } if ( x == SAHPI_LANG_ASSAMESE ) { return "ASSAMESE"; } if ( x == SAHPI_LANG_AYMARA ) { return "AYMARA"; } if ( x == SAHPI_LANG_AZERBAIJANI ) { return "AZERBAIJANI"; } if ( x == SAHPI_LANG_BASHKIR ) { return "BASHKIR"; } if ( x == SAHPI_LANG_BYELORUSSIAN ) { return "BYELORUSSIAN"; } if ( x == SAHPI_LANG_BULGARIAN ) { return "BULGARIAN"; } if ( x == SAHPI_LANG_BIHARI ) { return "BIHARI"; } if ( x == SAHPI_LANG_BISLAMA ) { return "BISLAMA"; } if ( x == SAHPI_LANG_BENGALI ) { return "BENGALI"; } if ( x == SAHPI_LANG_TIBETAN ) { return "TIBETAN"; } if ( x == SAHPI_LANG_BRETON ) { return "BRETON"; } if ( x == SAHPI_LANG_CATALAN ) { return "CATALAN"; } if ( x == SAHPI_LANG_CORSICAN ) { return "CORSICAN"; } if ( x == SAHPI_LANG_CZECH ) { return "CZECH"; } if ( x == SAHPI_LANG_WELSH ) { return "WELSH"; } if ( x == SAHPI_LANG_DANISH ) { return "DANISH"; } if ( x == SAHPI_LANG_GERMAN ) { return "GERMAN"; } if ( x == SAHPI_LANG_BHUTANI ) { return "BHUTANI"; } if ( x == SAHPI_LANG_GREEK ) { return "GREEK"; } if ( x == SAHPI_LANG_ENGLISH ) { return "ENGLISH"; } if ( x == SAHPI_LANG_ESPERANTO ) { return "ESPERANTO"; } if ( x == SAHPI_LANG_SPANISH ) { return "SPANISH"; } if ( x == SAHPI_LANG_ESTONIAN ) { return "ESTONIAN"; } if ( x == SAHPI_LANG_BASQUE ) { return "BASQUE"; } if ( x == SAHPI_LANG_PERSIAN ) { return "PERSIAN"; } if ( x == SAHPI_LANG_FINNISH ) { return "FINNISH"; } if ( x == SAHPI_LANG_FIJI ) { return "FIJI"; } if ( x == SAHPI_LANG_FAEROESE ) { return "FAEROESE"; } if ( x == SAHPI_LANG_FRENCH ) { return "FRENCH"; } if ( x == SAHPI_LANG_FRISIAN ) { return "FRISIAN"; } if ( x == SAHPI_LANG_IRISH ) { return "IRISH"; } if ( x == SAHPI_LANG_SCOTSGAELIC ) { return "SCOTSGAELIC"; } if ( x == SAHPI_LANG_GALICIAN ) { return "GALICIAN"; } if ( x == SAHPI_LANG_GUARANI ) { return "GUARANI"; } if ( x == SAHPI_LANG_GUJARATI ) { return "GUJARATI"; } if ( x == SAHPI_LANG_HAUSA ) { return "HAUSA"; } if ( x == SAHPI_LANG_HINDI ) { return "HINDI"; } if ( x == SAHPI_LANG_CROATIAN ) { return "CROATIAN"; } if ( x == SAHPI_LANG_HUNGARIAN ) { return "HUNGARIAN"; } if ( x == SAHPI_LANG_ARMENIAN ) { return "ARMENIAN"; } if ( x == SAHPI_LANG_INTERLINGUA ) { return "INTERLINGUA"; } if ( x == SAHPI_LANG_INTERLINGUE ) { return "INTERLINGUE"; } if ( x == SAHPI_LANG_INUPIAK ) { return "INUPIAK"; } if ( x == SAHPI_LANG_INDONESIAN ) { return "INDONESIAN"; } if ( x == SAHPI_LANG_ICELANDIC ) { return "ICELANDIC"; } if ( x == SAHPI_LANG_ITALIAN ) { return "ITALIAN"; } if ( x == SAHPI_LANG_HEBREW ) { return "HEBREW"; } if ( x == SAHPI_LANG_JAPANESE ) { return "JAPANESE"; } if ( x == SAHPI_LANG_YIDDISH ) { return "YIDDISH"; } if ( x == SAHPI_LANG_JAVANESE ) { return "JAVANESE"; } if ( x == SAHPI_LANG_GEORGIAN ) { return "GEORGIAN"; } if ( x == SAHPI_LANG_KAZAKH ) { return "KAZAKH"; } if ( x == SAHPI_LANG_GREENLANDIC ) { return "GREENLANDIC"; } if ( x == SAHPI_LANG_CAMBODIAN ) { return "CAMBODIAN"; } if ( x == SAHPI_LANG_KANNADA ) { return "KANNADA"; } if ( x == SAHPI_LANG_KOREAN ) { return "KOREAN"; } if ( x == SAHPI_LANG_KASHMIRI ) { return "KASHMIRI"; } if ( x == SAHPI_LANG_KURDISH ) { return "KURDISH"; } if ( x == SAHPI_LANG_KIRGHIZ ) { return "KIRGHIZ"; } if ( x == SAHPI_LANG_LATIN ) { return "LATIN"; } if ( x == SAHPI_LANG_LINGALA ) { return "LINGALA"; } if ( x == SAHPI_LANG_LAOTHIAN ) { return "LAOTHIAN"; } if ( x == SAHPI_LANG_LITHUANIAN ) { return "LITHUANIAN"; } if ( x == SAHPI_LANG_LATVIANLETTISH ) { return "LATVIANLETTISH"; } if ( x == SAHPI_LANG_MALAGASY ) { return "MALAGASY"; } if ( x == SAHPI_LANG_MAORI ) { return "MAORI"; } if ( x == SAHPI_LANG_MACEDONIAN ) { return "MACEDONIAN"; } if ( x == SAHPI_LANG_MALAYALAM ) { return "MALAYALAM"; } if ( x == SAHPI_LANG_MONGOLIAN ) { return "MONGOLIAN"; } if ( x == SAHPI_LANG_MOLDAVIAN ) { return "MOLDAVIAN"; } if ( x == SAHPI_LANG_MARATHI ) { return "MARATHI"; } if ( x == SAHPI_LANG_MALAY ) { return "MALAY"; } if ( x == SAHPI_LANG_MALTESE ) { return "MALTESE"; } if ( x == SAHPI_LANG_BURMESE ) { return "BURMESE"; } if ( x == SAHPI_LANG_NAURU ) { return "NAURU"; } if ( x == SAHPI_LANG_NEPALI ) { return "NEPALI"; } if ( x == SAHPI_LANG_DUTCH ) { return "DUTCH"; } if ( x == SAHPI_LANG_NORWEGIAN ) { return "NORWEGIAN"; } if ( x == SAHPI_LANG_OCCITAN ) { return "OCCITAN"; } if ( x == SAHPI_LANG_AFANOROMO ) { return "AFANOROMO"; } if ( x == SAHPI_LANG_ORIYA ) { return "ORIYA"; } if ( x == SAHPI_LANG_PUNJABI ) { return "PUNJABI"; } if ( x == SAHPI_LANG_POLISH ) { return "POLISH"; } if ( x == SAHPI_LANG_PASHTOPUSHTO ) { return "PASHTOPUSHTO"; } if ( x == SAHPI_LANG_PORTUGUESE ) { return "PORTUGUESE"; } if ( x == SAHPI_LANG_QUECHUA ) { return "QUECHUA"; } if ( x == SAHPI_LANG_RHAETOROMANCE ) { return "RHAETOROMANCE"; } if ( x == SAHPI_LANG_KIRUNDI ) { return "KIRUNDI"; } if ( x == SAHPI_LANG_ROMANIAN ) { return "ROMANIAN"; } if ( x == SAHPI_LANG_RUSSIAN ) { return "RUSSIAN"; } if ( x == SAHPI_LANG_KINYARWANDA ) { return "KINYARWANDA"; } if ( x == SAHPI_LANG_SANSKRIT ) { return "SANSKRIT"; } if ( x == SAHPI_LANG_SINDHI ) { return "SINDHI"; } if ( x == SAHPI_LANG_SANGRO ) { return "SANGRO"; } if ( x == SAHPI_LANG_SERBOCROATIAN ) { return "SERBOCROATIAN"; } if ( x == SAHPI_LANG_SINGHALESE ) { return "SINGHALESE"; } if ( x == SAHPI_LANG_SLOVAK ) { return "SLOVAK"; } if ( x == SAHPI_LANG_SLOVENIAN ) { return "SLOVENIAN"; } if ( x == SAHPI_LANG_SAMOAN ) { return "SAMOAN"; } if ( x == SAHPI_LANG_SHONA ) { return "SHONA"; } if ( x == SAHPI_LANG_SOMALI ) { return "SOMALI"; } if ( x == SAHPI_LANG_ALBANIAN ) { return "ALBANIAN"; } if ( x == SAHPI_LANG_SERBIAN ) { return "SERBIAN"; } if ( x == SAHPI_LANG_SISWATI ) { return "SISWATI"; } if ( x == SAHPI_LANG_SESOTHO ) { return "SESOTHO"; } if ( x == SAHPI_LANG_SUDANESE ) { return "SUDANESE"; } if ( x == SAHPI_LANG_SWEDISH ) { return "SWEDISH"; } if ( x == SAHPI_LANG_SWAHILI ) { return "SWAHILI"; } if ( x == SAHPI_LANG_TAMIL ) { return "TAMIL"; } if ( x == SAHPI_LANG_TELUGU ) { return "TELUGU"; } if ( x == SAHPI_LANG_TAJIK ) { return "TAJIK"; } if ( x == SAHPI_LANG_THAI ) { return "THAI"; } if ( x == SAHPI_LANG_TIGRINYA ) { return "TIGRINYA"; } if ( x == SAHPI_LANG_TURKMEN ) { return "TURKMEN"; } if ( x == SAHPI_LANG_TAGALOG ) { return "TAGALOG"; } if ( x == SAHPI_LANG_SETSWANA ) { return "SETSWANA"; } if ( x == SAHPI_LANG_TONGA ) { return "TONGA"; } if ( x == SAHPI_LANG_TURKISH ) { return "TURKISH"; } if ( x == SAHPI_LANG_TSONGA ) { return "TSONGA"; } if ( x == SAHPI_LANG_TATAR ) { return "TATAR"; } if ( x == SAHPI_LANG_TWI ) { return "TWI"; } if ( x == SAHPI_LANG_UKRAINIAN ) { return "UKRAINIAN"; } if ( x == SAHPI_LANG_URDU ) { return "URDU"; } if ( x == SAHPI_LANG_UZBEK ) { return "UZBEK"; } if ( x == SAHPI_LANG_VIETNAMESE ) { return "VIETNAMESE"; } if ( x == SAHPI_LANG_VOLAPUK ) { return "VOLAPUK"; } if ( x == SAHPI_LANG_WOLOF ) { return "WOLOF"; } if ( x == SAHPI_LANG_XHOSA ) { return "XHOSA"; } if ( x == SAHPI_LANG_YORUBA ) { return "YORUBA"; } if ( x == SAHPI_LANG_CHINESE ) { return "CHINESE"; } if ( x == SAHPI_LANG_ZULU ) { return "ZULU"; } return Long.toString( x ); } public static long toSaHpiLanguageT( String s ) throws IllegalArgumentException { if ( s.equals( "UNDEF" ) ) { return SAHPI_LANG_UNDEF; } if ( s.equals( "AFAR" ) ) { return SAHPI_LANG_AFAR; } if ( s.equals( "ABKHAZIAN" ) ) { return SAHPI_LANG_ABKHAZIAN; } if ( s.equals( "AFRIKAANS" ) ) { return SAHPI_LANG_AFRIKAANS; } if ( s.equals( "AMHARIC" ) ) { return SAHPI_LANG_AMHARIC; } if ( s.equals( "ARABIC" ) ) { return SAHPI_LANG_ARABIC; } if ( s.equals( "ASSAMESE" ) ) { return SAHPI_LANG_ASSAMESE; } if ( s.equals( "AYMARA" ) ) { return SAHPI_LANG_AYMARA; } if ( s.equals( "AZERBAIJANI" ) ) { return SAHPI_LANG_AZERBAIJANI; } if ( s.equals( "BASHKIR" ) ) { return SAHPI_LANG_BASHKIR; } if ( s.equals( "BYELORUSSIAN" ) ) { return SAHPI_LANG_BYELORUSSIAN; } if ( s.equals( "BULGARIAN" ) ) { return SAHPI_LANG_BULGARIAN; } if ( s.equals( "BIHARI" ) ) { return SAHPI_LANG_BIHARI; } if ( s.equals( "BISLAMA" ) ) { return SAHPI_LANG_BISLAMA; } if ( s.equals( "BENGALI" ) ) { return SAHPI_LANG_BENGALI; } if ( s.equals( "TIBETAN" ) ) { return SAHPI_LANG_TIBETAN; } if ( s.equals( "BRETON" ) ) { return SAHPI_LANG_BRETON; } if ( s.equals( "CATALAN" ) ) { return SAHPI_LANG_CATALAN; } if ( s.equals( "CORSICAN" ) ) { return SAHPI_LANG_CORSICAN; } if ( s.equals( "CZECH" ) ) { return SAHPI_LANG_CZECH; } if ( s.equals( "WELSH" ) ) { return SAHPI_LANG_WELSH; } if ( s.equals( "DANISH" ) ) { return SAHPI_LANG_DANISH; } if ( s.equals( "GERMAN" ) ) { return SAHPI_LANG_GERMAN; } if ( s.equals( "BHUTANI" ) ) { return SAHPI_LANG_BHUTANI; } if ( s.equals( "GREEK" ) ) { return SAHPI_LANG_GREEK; } if ( s.equals( "ENGLISH" ) ) { return SAHPI_LANG_ENGLISH; } if ( s.equals( "ESPERANTO" ) ) { return SAHPI_LANG_ESPERANTO; } if ( s.equals( "SPANISH" ) ) { return SAHPI_LANG_SPANISH; } if ( s.equals( "ESTONIAN" ) ) { return SAHPI_LANG_ESTONIAN; } if ( s.equals( "BASQUE" ) ) { return SAHPI_LANG_BASQUE; } if ( s.equals( "PERSIAN" ) ) { return SAHPI_LANG_PERSIAN; } if ( s.equals( "FINNISH" ) ) { return SAHPI_LANG_FINNISH; } if ( s.equals( "FIJI" ) ) { return SAHPI_LANG_FIJI; } if ( s.equals( "FAEROESE" ) ) { return SAHPI_LANG_FAEROESE; } if ( s.equals( "FRENCH" ) ) { return SAHPI_LANG_FRENCH; } if ( s.equals( "FRISIAN" ) ) { return SAHPI_LANG_FRISIAN; } if ( s.equals( "IRISH" ) ) { return SAHPI_LANG_IRISH; } if ( s.equals( "SCOTSGAELIC" ) ) { return SAHPI_LANG_SCOTSGAELIC; } if ( s.equals( "GALICIAN" ) ) { return SAHPI_LANG_GALICIAN; } if ( s.equals( "GUARANI" ) ) { return SAHPI_LANG_GUARANI; } if ( s.equals( "GUJARATI" ) ) { return SAHPI_LANG_GUJARATI; } if ( s.equals( "HAUSA" ) ) { return SAHPI_LANG_HAUSA; } if ( s.equals( "HINDI" ) ) { return SAHPI_LANG_HINDI; } if ( s.equals( "CROATIAN" ) ) { return SAHPI_LANG_CROATIAN; } if ( s.equals( "HUNGARIAN" ) ) { return SAHPI_LANG_HUNGARIAN; } if ( s.equals( "ARMENIAN" ) ) { return SAHPI_LANG_ARMENIAN; } if ( s.equals( "INTERLINGUA" ) ) { return SAHPI_LANG_INTERLINGUA; } if ( s.equals( "INTERLINGUE" ) ) { return SAHPI_LANG_INTERLINGUE; } if ( s.equals( "INUPIAK" ) ) { return SAHPI_LANG_INUPIAK; } if ( s.equals( "INDONESIAN" ) ) { return SAHPI_LANG_INDONESIAN; } if ( s.equals( "ICELANDIC" ) ) { return SAHPI_LANG_ICELANDIC; } if ( s.equals( "ITALIAN" ) ) { return SAHPI_LANG_ITALIAN; } if ( s.equals( "HEBREW" ) ) { return SAHPI_LANG_HEBREW; } if ( s.equals( "JAPANESE" ) ) { return SAHPI_LANG_JAPANESE; } if ( s.equals( "YIDDISH" ) ) { return SAHPI_LANG_YIDDISH; } if ( s.equals( "JAVANESE" ) ) { return SAHPI_LANG_JAVANESE; } if ( s.equals( "GEORGIAN" ) ) { return SAHPI_LANG_GEORGIAN; } if ( s.equals( "KAZAKH" ) ) { return SAHPI_LANG_KAZAKH; } if ( s.equals( "GREENLANDIC" ) ) { return SAHPI_LANG_GREENLANDIC; } if ( s.equals( "CAMBODIAN" ) ) { return SAHPI_LANG_CAMBODIAN; } if ( s.equals( "KANNADA" ) ) { return SAHPI_LANG_KANNADA; } if ( s.equals( "KOREAN" ) ) { return SAHPI_LANG_KOREAN; } if ( s.equals( "KASHMIRI" ) ) { return SAHPI_LANG_KASHMIRI; } if ( s.equals( "KURDISH" ) ) { return SAHPI_LANG_KURDISH; } if ( s.equals( "KIRGHIZ" ) ) { return SAHPI_LANG_KIRGHIZ; } if ( s.equals( "LATIN" ) ) { return SAHPI_LANG_LATIN; } if ( s.equals( "LINGALA" ) ) { return SAHPI_LANG_LINGALA; } if ( s.equals( "LAOTHIAN" ) ) { return SAHPI_LANG_LAOTHIAN; } if ( s.equals( "LITHUANIAN" ) ) { return SAHPI_LANG_LITHUANIAN; } if ( s.equals( "LATVIANLETTISH" ) ) { return SAHPI_LANG_LATVIANLETTISH; } if ( s.equals( "MALAGASY" ) ) { return SAHPI_LANG_MALAGASY; } if ( s.equals( "MAORI" ) ) { return SAHPI_LANG_MAORI; } if ( s.equals( "MACEDONIAN" ) ) { return SAHPI_LANG_MACEDONIAN; } if ( s.equals( "MALAYALAM" ) ) { return SAHPI_LANG_MALAYALAM; } if ( s.equals( "MONGOLIAN" ) ) { return SAHPI_LANG_MONGOLIAN; } if ( s.equals( "MOLDAVIAN" ) ) { return SAHPI_LANG_MOLDAVIAN; } if ( s.equals( "MARATHI" ) ) { return SAHPI_LANG_MARATHI; } if ( s.equals( "MALAY" ) ) { return SAHPI_LANG_MALAY; } if ( s.equals( "MALTESE" ) ) { return SAHPI_LANG_MALTESE; } if ( s.equals( "BURMESE" ) ) { return SAHPI_LANG_BURMESE; } if ( s.equals( "NAURU" ) ) { return SAHPI_LANG_NAURU; } if ( s.equals( "NEPALI" ) ) { return SAHPI_LANG_NEPALI; } if ( s.equals( "DUTCH" ) ) { return SAHPI_LANG_DUTCH; } if ( s.equals( "NORWEGIAN" ) ) { return SAHPI_LANG_NORWEGIAN; } if ( s.equals( "OCCITAN" ) ) { return SAHPI_LANG_OCCITAN; } if ( s.equals( "AFANOROMO" ) ) { return SAHPI_LANG_AFANOROMO; } if ( s.equals( "ORIYA" ) ) { return SAHPI_LANG_ORIYA; } if ( s.equals( "PUNJABI" ) ) { return SAHPI_LANG_PUNJABI; } if ( s.equals( "POLISH" ) ) { return SAHPI_LANG_POLISH; } if ( s.equals( "PASHTOPUSHTO" ) ) { return SAHPI_LANG_PASHTOPUSHTO; } if ( s.equals( "PORTUGUESE" ) ) { return SAHPI_LANG_PORTUGUESE; } if ( s.equals( "QUECHUA" ) ) { return SAHPI_LANG_QUECHUA; } if ( s.equals( "RHAETOROMANCE" ) ) { return SAHPI_LANG_RHAETOROMANCE; } if ( s.equals( "KIRUNDI" ) ) { return SAHPI_LANG_KIRUNDI; } if ( s.equals( "ROMANIAN" ) ) { return SAHPI_LANG_ROMANIAN; } if ( s.equals( "RUSSIAN" ) ) { return SAHPI_LANG_RUSSIAN; } if ( s.equals( "KINYARWANDA" ) ) { return SAHPI_LANG_KINYARWANDA; } if ( s.equals( "SANSKRIT" ) ) { return SAHPI_LANG_SANSKRIT; } if ( s.equals( "SINDHI" ) ) { return SAHPI_LANG_SINDHI; } if ( s.equals( "SANGRO" ) ) { return SAHPI_LANG_SANGRO; } if ( s.equals( "SERBOCROATIAN" ) ) { return SAHPI_LANG_SERBOCROATIAN; } if ( s.equals( "SINGHALESE" ) ) { return SAHPI_LANG_SINGHALESE; } if ( s.equals( "SLOVAK" ) ) { return SAHPI_LANG_SLOVAK; } if ( s.equals( "SLOVENIAN" ) ) { return SAHPI_LANG_SLOVENIAN; } if ( s.equals( "SAMOAN" ) ) { return SAHPI_LANG_SAMOAN; } if ( s.equals( "SHONA" ) ) { return SAHPI_LANG_SHONA; } if ( s.equals( "SOMALI" ) ) { return SAHPI_LANG_SOMALI; } if ( s.equals( "ALBANIAN" ) ) { return SAHPI_LANG_ALBANIAN; } if ( s.equals( "SERBIAN" ) ) { return SAHPI_LANG_SERBIAN; } if ( s.equals( "SISWATI" ) ) { return SAHPI_LANG_SISWATI; } if ( s.equals( "SESOTHO" ) ) { return SAHPI_LANG_SESOTHO; } if ( s.equals( "SUDANESE" ) ) { return SAHPI_LANG_SUDANESE; } if ( s.equals( "SWEDISH" ) ) { return SAHPI_LANG_SWEDISH; } if ( s.equals( "SWAHILI" ) ) { return SAHPI_LANG_SWAHILI; } if ( s.equals( "TAMIL" ) ) { return SAHPI_LANG_TAMIL; } if ( s.equals( "TELUGU" ) ) { return SAHPI_LANG_TELUGU; } if ( s.equals( "TAJIK" ) ) { return SAHPI_LANG_TAJIK; } if ( s.equals( "THAI" ) ) { return SAHPI_LANG_THAI; } if ( s.equals( "TIGRINYA" ) ) { return SAHPI_LANG_TIGRINYA; } if ( s.equals( "TURKMEN" ) ) { return SAHPI_LANG_TURKMEN; } if ( s.equals( "TAGALOG" ) ) { return SAHPI_LANG_TAGALOG; } if ( s.equals( "SETSWANA" ) ) { return SAHPI_LANG_SETSWANA; } if ( s.equals( "TONGA" ) ) { return SAHPI_LANG_TONGA; } if ( s.equals( "TURKISH" ) ) { return SAHPI_LANG_TURKISH; } if ( s.equals( "TSONGA" ) ) { return SAHPI_LANG_TSONGA; } if ( s.equals( "TATAR" ) ) { return SAHPI_LANG_TATAR; } if ( s.equals( "TWI" ) ) { return SAHPI_LANG_TWI; } if ( s.equals( "UKRAINIAN" ) ) { return SAHPI_LANG_UKRAINIAN; } if ( s.equals( "URDU" ) ) { return SAHPI_LANG_URDU; } if ( s.equals( "UZBEK" ) ) { return SAHPI_LANG_UZBEK; } if ( s.equals( "VIETNAMESE" ) ) { return SAHPI_LANG_VIETNAMESE; } if ( s.equals( "VOLAPUK" ) ) { return SAHPI_LANG_VOLAPUK; } if ( s.equals( "WOLOF" ) ) { return SAHPI_LANG_WOLOF; } if ( s.equals( "XHOSA" ) ) { return SAHPI_LANG_XHOSA; } if ( s.equals( "YORUBA" ) ) { return SAHPI_LANG_YORUBA; } if ( s.equals( "CHINESE" ) ) { return SAHPI_LANG_CHINESE; } if ( s.equals( "ZULU" ) ) { return SAHPI_LANG_ZULU; } throw new IllegalArgumentException(); } /** * For SaHpiTextTypeT */ public static String fromSaHpiTextTypeT( long x ) { if ( x == SAHPI_TL_TYPE_UNICODE ) { return "UNICODE"; } if ( x == SAHPI_TL_TYPE_BCDPLUS ) { return "BCDPLUS"; } if ( x == SAHPI_TL_TYPE_ASCII6 ) { return "ASCII6"; } if ( x == SAHPI_TL_TYPE_TEXT ) { return "TEXT"; } if ( x == SAHPI_TL_TYPE_BINARY ) { return "BINARY"; } return Long.toString( x ); } public static long toSaHpiTextTypeT( String s ) throws IllegalArgumentException { if ( s.equals( "UNICODE" ) ) { return SAHPI_TL_TYPE_UNICODE; } if ( s.equals( "BCDPLUS" ) ) { return SAHPI_TL_TYPE_BCDPLUS; } if ( s.equals( "ASCII6" ) ) { return SAHPI_TL_TYPE_ASCII6; } if ( s.equals( "TEXT" ) ) { return SAHPI_TL_TYPE_TEXT; } if ( s.equals( "BINARY" ) ) { return SAHPI_TL_TYPE_BINARY; } throw new IllegalArgumentException(); } /** * For SaHpiEntityTypeT */ public static String fromSaHpiEntityTypeT( long x ) { if ( x == SAHPI_ENT_UNSPECIFIED ) { return "UNSPECIFIED"; } if ( x == SAHPI_ENT_OTHER ) { return "OTHER"; } if ( x == SAHPI_ENT_UNKNOWN ) { return "UNKNOWN"; } if ( x == SAHPI_ENT_PROCESSOR ) { return "PROCESSOR"; } if ( x == SAHPI_ENT_DISK_BAY ) { return "DISK_BAY"; } if ( x == SAHPI_ENT_PERIPHERAL_BAY ) { return "PERIPHERAL_BAY"; } if ( x == SAHPI_ENT_SYS_MGMNT_MODULE ) { return "SYS_MGMNT_MODULE"; } if ( x == SAHPI_ENT_SYSTEM_BOARD ) { return "SYSTEM_BOARD"; } if ( x == SAHPI_ENT_MEMORY_MODULE ) { return "MEMORY_MODULE"; } if ( x == SAHPI_ENT_PROCESSOR_MODULE ) { return "PROCESSOR_MODULE"; } if ( x == SAHPI_ENT_POWER_SUPPLY ) { return "POWER_SUPPLY"; } if ( x == SAHPI_ENT_ADD_IN_CARD ) { return "ADD_IN_CARD"; } if ( x == SAHPI_ENT_FRONT_PANEL_BOARD ) { return "FRONT_PANEL_BOARD"; } if ( x == SAHPI_ENT_BACK_PANEL_BOARD ) { return "BACK_PANEL_BOARD"; } if ( x == SAHPI_ENT_POWER_SYSTEM_BOARD ) { return "POWER_SYSTEM_BOARD"; } if ( x == SAHPI_ENT_DRIVE_BACKPLANE ) { return "DRIVE_BACKPLANE"; } if ( x == SAHPI_ENT_SYS_EXPANSION_BOARD ) { return "SYS_EXPANSION_BOARD"; } if ( x == SAHPI_ENT_OTHER_SYSTEM_BOARD ) { return "OTHER_SYSTEM_BOARD"; } if ( x == SAHPI_ENT_PROCESSOR_BOARD ) { return "PROCESSOR_BOARD"; } if ( x == SAHPI_ENT_POWER_UNIT ) { return "POWER_UNIT"; } if ( x == SAHPI_ENT_POWER_MODULE ) { return "POWER_MODULE"; } if ( x == SAHPI_ENT_POWER_MGMNT ) { return "POWER_MGMNT"; } if ( x == SAHPI_ENT_CHASSIS_BACK_PANEL_BOARD ) { return "CHASSIS_BACK_PANEL_BOARD"; } if ( x == SAHPI_ENT_SYSTEM_CHASSIS ) { return "SYSTEM_CHASSIS"; } if ( x == SAHPI_ENT_SUB_CHASSIS ) { return "SUB_CHASSIS"; } if ( x == SAHPI_ENT_OTHER_CHASSIS_BOARD ) { return "OTHER_CHASSIS_BOARD"; } if ( x == SAHPI_ENT_DISK_DRIVE_BAY ) { return "DISK_DRIVE_BAY"; } if ( x == SAHPI_ENT_PERIPHERAL_BAY_2 ) { return "PERIPHERAL_BAY_2"; } if ( x == SAHPI_ENT_DEVICE_BAY ) { return "DEVICE_BAY"; } if ( x == SAHPI_ENT_COOLING_DEVICE ) { return "COOLING_DEVICE"; } if ( x == SAHPI_ENT_COOLING_UNIT ) { return "COOLING_UNIT"; } if ( x == SAHPI_ENT_INTERCONNECT ) { return "INTERCONNECT"; } if ( x == SAHPI_ENT_MEMORY_DEVICE ) { return "MEMORY_DEVICE"; } if ( x == SAHPI_ENT_SYS_MGMNT_SOFTWARE ) { return "SYS_MGMNT_SOFTWARE"; } if ( x == SAHPI_ENT_BIOS ) { return "BIOS"; } if ( x == SAHPI_ENT_OPERATING_SYSTEM ) { return "OPERATING_SYSTEM"; } if ( x == SAHPI_ENT_SYSTEM_BUS ) { return "SYSTEM_BUS"; } if ( x == SAHPI_ENT_GROUP ) { return "GROUP"; } if ( x == SAHPI_ENT_REMOTE ) { return "REMOTE"; } if ( x == SAHPI_ENT_EXTERNAL_ENVIRONMENT ) { return "EXTERNAL_ENVIRONMENT"; } if ( x == SAHPI_ENT_BATTERY ) { return "BATTERY"; } if ( x == SAHPI_ENT_PROCESSING_BLADE ) { return "PROCESSING_BLADE"; } if ( x == SAHPI_ENT_CONNECTIVITY_SWITCH ) { return "CONNECTIVITY_SWITCH"; } if ( x == SAHPI_ENT_PROCESSOR_MEMORY_MODULE ) { return "PROCESSOR_MEMORY_MODULE"; } if ( x == SAHPI_ENT_IO_MODULE ) { return "IO_MODULE"; } if ( x == SAHPI_ENT_PROCESSOR_IO_MODULE ) { return "PROCESSOR_IO_MODULE"; } if ( x == SAHPI_ENT_MC_FIRMWARE ) { return "MC_FIRMWARE"; } if ( x == SAHPI_ENT_IPMI_CHANNEL ) { return "IPMI_CHANNEL"; } if ( x == SAHPI_ENT_PCI_BUS ) { return "PCI_BUS"; } if ( x == SAHPI_ENT_PCI_EXPRESS_BUS ) { return "PCI_EXPRESS_BUS"; } if ( x == SAHPI_ENT_SCSI_BUS ) { return "SCSI_BUS"; } if ( x == SAHPI_ENT_SATA_BUS ) { return "SATA_BUS"; } if ( x == SAHPI_ENT_PROC_FSB ) { return "PROC_FSB"; } if ( x == SAHPI_ENT_CLOCK ) { return "CLOCK"; } if ( x == SAHPI_ENT_SYSTEM_FIRMWARE ) { return "SYSTEM_FIRMWARE"; } if ( x == SAHPI_ENT_CHASSIS_SPECIFIC ) { return "CHASSIS_SPECIFIC"; } if ( x == SAHPI_ENT_CHASSIS_SPECIFIC01 ) { return "CHASSIS_SPECIFIC01"; } if ( x == SAHPI_ENT_CHASSIS_SPECIFIC02 ) { return "CHASSIS_SPECIFIC02"; } if ( x == SAHPI_ENT_CHASSIS_SPECIFIC03 ) { return "CHASSIS_SPECIFIC03"; } if ( x == SAHPI_ENT_CHASSIS_SPECIFIC04 ) { return "CHASSIS_SPECIFIC04"; } if ( x == SAHPI_ENT_CHASSIS_SPECIFIC05 ) { return "CHASSIS_SPECIFIC05"; } if ( x == SAHPI_ENT_CHASSIS_SPECIFIC06 ) { return "CHASSIS_SPECIFIC06"; } if ( x == SAHPI_ENT_CHASSIS_SPECIFIC07 ) { return "CHASSIS_SPECIFIC07"; } if ( x == SAHPI_ENT_CHASSIS_SPECIFIC08 ) { return "CHASSIS_SPECIFIC08"; } if ( x == SAHPI_ENT_CHASSIS_SPECIFIC09 ) { return "CHASSIS_SPECIFIC09"; } if ( x == SAHPI_ENT_CHASSIS_SPECIFIC10 ) { return "CHASSIS_SPECIFIC10"; } if ( x == SAHPI_ENT_CHASSIS_SPECIFIC11 ) { return "CHASSIS_SPECIFIC11"; } if ( x == SAHPI_ENT_CHASSIS_SPECIFIC12 ) { return "CHASSIS_SPECIFIC12"; } if ( x == SAHPI_ENT_CHASSIS_SPECIFIC13 ) { return "CHASSIS_SPECIFIC13"; } if ( x == SAHPI_ENT_BOARD_SET_SPECIFIC ) { return "BOARD_SET_SPECIFIC"; } if ( x == SAHPI_ENT_OEM_SYSINT_SPECIFIC ) { return "OEM_SYSINT_SPECIFIC"; } if ( x == SAHPI_ENT_ROOT ) { return "ROOT"; } if ( x == SAHPI_ENT_RACK ) { return "RACK"; } if ( x == SAHPI_ENT_SUBRACK ) { return "SUBRACK"; } if ( x == SAHPI_ENT_COMPACTPCI_CHASSIS ) { return "COMPACTPCI_CHASSIS"; } if ( x == SAHPI_ENT_ADVANCEDTCA_CHASSIS ) { return "ADVANCEDTCA_CHASSIS"; } if ( x == SAHPI_ENT_RACK_MOUNTED_SERVER ) { return "RACK_MOUNTED_SERVER"; } if ( x == SAHPI_ENT_SYSTEM_BLADE ) { return "SYSTEM_BLADE"; } if ( x == SAHPI_ENT_SWITCH ) { return "SWITCH"; } if ( x == SAHPI_ENT_SWITCH_BLADE ) { return "SWITCH_BLADE"; } if ( x == SAHPI_ENT_SBC_BLADE ) { return "SBC_BLADE"; } if ( x == SAHPI_ENT_IO_BLADE ) { return "IO_BLADE"; } if ( x == SAHPI_ENT_DISK_BLADE ) { return "DISK_BLADE"; } if ( x == SAHPI_ENT_DISK_DRIVE ) { return "DISK_DRIVE"; } if ( x == SAHPI_ENT_FAN ) { return "FAN"; } if ( x == SAHPI_ENT_POWER_DISTRIBUTION_UNIT ) { return "POWER_DISTRIBUTION_UNIT"; } if ( x == SAHPI_ENT_SPEC_PROC_BLADE ) { return "SPEC_PROC_BLADE"; } if ( x == SAHPI_ENT_IO_SUBBOARD ) { return "IO_SUBBOARD"; } if ( x == SAHPI_ENT_SBC_SUBBOARD ) { return "SBC_SUBBOARD"; } if ( x == SAHPI_ENT_ALARM_MANAGER ) { return "ALARM_MANAGER"; } if ( x == SAHPI_ENT_SHELF_MANAGER ) { return "SHELF_MANAGER"; } if ( x == SAHPI_ENT_DISPLAY_PANEL ) { return "DISPLAY_PANEL"; } if ( x == SAHPI_ENT_SUBBOARD_CARRIER_BLADE ) { return "SUBBOARD_CARRIER_BLADE"; } if ( x == SAHPI_ENT_PHYSICAL_SLOT ) { return "PHYSICAL_SLOT"; } if ( x == SAHPI_ENT_PICMG_FRONT_BLADE ) { return "PICMG_FRONT_BLADE"; } if ( x == SAHPI_ENT_SYSTEM_INVENTORY_DEVICE ) { return "SYSTEM_INVENTORY_DEVICE"; } if ( x == SAHPI_ENT_FILTRATION_UNIT ) { return "FILTRATION_UNIT"; } if ( x == SAHPI_ENT_AMC ) { return "AMC"; } if ( x == SAHPI_ENT_BMC ) { return "BMC"; } if ( x == SAHPI_ENT_IPMC ) { return "IPMC"; } if ( x == SAHPI_ENT_MMC ) { return "MMC"; } if ( x == SAHPI_ENT_SHMC ) { return "SHMC"; } if ( x == SAHPI_ENT_CPLD ) { return "CPLD"; } if ( x == SAHPI_ENT_EPLD ) { return "EPLD"; } if ( x == SAHPI_ENT_FPGA ) { return "FPGA"; } if ( x == SAHPI_ENT_DASD ) { return "DASD"; } if ( x == SAHPI_ENT_NIC ) { return "NIC"; } if ( x == SAHPI_ENT_DSP ) { return "DSP"; } if ( x == SAHPI_ENT_UCODE ) { return "UCODE"; } if ( x == SAHPI_ENT_NPU ) { return "NPU"; } if ( x == SAHPI_ENT_OEM ) { return "OEM"; } if ( x == SAHPI_ENT_INTERFACE ) { return "INTERFACE"; } if ( x == SAHPI_ENT_MICROTCA_CHASSIS ) { return "MICROTCA_CHASSIS"; } if ( x == SAHPI_ENT_CARRIER ) { return "CARRIER"; } if ( x == SAHPI_ENT_CARRIER_MANAGER ) { return "CARRIER_MANAGER"; } if ( x == SAHPI_ENT_CONFIG_DATA ) { return "CONFIG_DATA"; } if ( x == SAHPI_ENT_INDICATOR ) { return "INDICATOR"; } return Long.toString( x ); } public static long toSaHpiEntityTypeT( String s ) throws IllegalArgumentException { if ( s.equals( "UNSPECIFIED" ) ) { return SAHPI_ENT_UNSPECIFIED; } if ( s.equals( "OTHER" ) ) { return SAHPI_ENT_OTHER; } if ( s.equals( "UNKNOWN" ) ) { return SAHPI_ENT_UNKNOWN; } if ( s.equals( "PROCESSOR" ) ) { return SAHPI_ENT_PROCESSOR; } if ( s.equals( "DISK_BAY" ) ) { return SAHPI_ENT_DISK_BAY; } if ( s.equals( "PERIPHERAL_BAY" ) ) { return SAHPI_ENT_PERIPHERAL_BAY; } if ( s.equals( "SYS_MGMNT_MODULE" ) ) { return SAHPI_ENT_SYS_MGMNT_MODULE; } if ( s.equals( "SYSTEM_BOARD" ) ) { return SAHPI_ENT_SYSTEM_BOARD; } if ( s.equals( "MEMORY_MODULE" ) ) { return SAHPI_ENT_MEMORY_MODULE; } if ( s.equals( "PROCESSOR_MODULE" ) ) { return SAHPI_ENT_PROCESSOR_MODULE; } if ( s.equals( "POWER_SUPPLY" ) ) { return SAHPI_ENT_POWER_SUPPLY; } if ( s.equals( "ADD_IN_CARD" ) ) { return SAHPI_ENT_ADD_IN_CARD; } if ( s.equals( "FRONT_PANEL_BOARD" ) ) { return SAHPI_ENT_FRONT_PANEL_BOARD; } if ( s.equals( "BACK_PANEL_BOARD" ) ) { return SAHPI_ENT_BACK_PANEL_BOARD; } if ( s.equals( "POWER_SYSTEM_BOARD" ) ) { return SAHPI_ENT_POWER_SYSTEM_BOARD; } if ( s.equals( "DRIVE_BACKPLANE" ) ) { return SAHPI_ENT_DRIVE_BACKPLANE; } if ( s.equals( "SYS_EXPANSION_BOARD" ) ) { return SAHPI_ENT_SYS_EXPANSION_BOARD; } if ( s.equals( "OTHER_SYSTEM_BOARD" ) ) { return SAHPI_ENT_OTHER_SYSTEM_BOARD; } if ( s.equals( "PROCESSOR_BOARD" ) ) { return SAHPI_ENT_PROCESSOR_BOARD; } if ( s.equals( "POWER_UNIT" ) ) { return SAHPI_ENT_POWER_UNIT; } if ( s.equals( "POWER_MODULE" ) ) { return SAHPI_ENT_POWER_MODULE; } if ( s.equals( "POWER_MGMNT" ) ) { return SAHPI_ENT_POWER_MGMNT; } if ( s.equals( "CHASSIS_BACK_PANEL_BOARD" ) ) { return SAHPI_ENT_CHASSIS_BACK_PANEL_BOARD; } if ( s.equals( "SYSTEM_CHASSIS" ) ) { return SAHPI_ENT_SYSTEM_CHASSIS; } if ( s.equals( "SUB_CHASSIS" ) ) { return SAHPI_ENT_SUB_CHASSIS; } if ( s.equals( "OTHER_CHASSIS_BOARD" ) ) { return SAHPI_ENT_OTHER_CHASSIS_BOARD; } if ( s.equals( "DISK_DRIVE_BAY" ) ) { return SAHPI_ENT_DISK_DRIVE_BAY; } if ( s.equals( "PERIPHERAL_BAY_2" ) ) { return SAHPI_ENT_PERIPHERAL_BAY_2; } if ( s.equals( "DEVICE_BAY" ) ) { return SAHPI_ENT_DEVICE_BAY; } if ( s.equals( "COOLING_DEVICE" ) ) { return SAHPI_ENT_COOLING_DEVICE; } if ( s.equals( "COOLING_UNIT" ) ) { return SAHPI_ENT_COOLING_UNIT; } if ( s.equals( "INTERCONNECT" ) ) { return SAHPI_ENT_INTERCONNECT; } if ( s.equals( "MEMORY_DEVICE" ) ) { return SAHPI_ENT_MEMORY_DEVICE; } if ( s.equals( "SYS_MGMNT_SOFTWARE" ) ) { return SAHPI_ENT_SYS_MGMNT_SOFTWARE; } if ( s.equals( "BIOS" ) ) { return SAHPI_ENT_BIOS; } if ( s.equals( "OPERATING_SYSTEM" ) ) { return SAHPI_ENT_OPERATING_SYSTEM; } if ( s.equals( "SYSTEM_BUS" ) ) { return SAHPI_ENT_SYSTEM_BUS; } if ( s.equals( "GROUP" ) ) { return SAHPI_ENT_GROUP; } if ( s.equals( "REMOTE" ) ) { return SAHPI_ENT_REMOTE; } if ( s.equals( "EXTERNAL_ENVIRONMENT" ) ) { return SAHPI_ENT_EXTERNAL_ENVIRONMENT; } if ( s.equals( "BATTERY" ) ) { return SAHPI_ENT_BATTERY; } if ( s.equals( "PROCESSING_BLADE" ) ) { return SAHPI_ENT_PROCESSING_BLADE; } if ( s.equals( "CONNECTIVITY_SWITCH" ) ) { return SAHPI_ENT_CONNECTIVITY_SWITCH; } if ( s.equals( "PROCESSOR_MEMORY_MODULE" ) ) { return SAHPI_ENT_PROCESSOR_MEMORY_MODULE; } if ( s.equals( "IO_MODULE" ) ) { return SAHPI_ENT_IO_MODULE; } if ( s.equals( "PROCESSOR_IO_MODULE" ) ) { return SAHPI_ENT_PROCESSOR_IO_MODULE; } if ( s.equals( "MC_FIRMWARE" ) ) { return SAHPI_ENT_MC_FIRMWARE; } if ( s.equals( "IPMI_CHANNEL" ) ) { return SAHPI_ENT_IPMI_CHANNEL; } if ( s.equals( "PCI_BUS" ) ) { return SAHPI_ENT_PCI_BUS; } if ( s.equals( "PCI_EXPRESS_BUS" ) ) { return SAHPI_ENT_PCI_EXPRESS_BUS; } if ( s.equals( "SCSI_BUS" ) ) { return SAHPI_ENT_SCSI_BUS; } if ( s.equals( "SATA_BUS" ) ) { return SAHPI_ENT_SATA_BUS; } if ( s.equals( "PROC_FSB" ) ) { return SAHPI_ENT_PROC_FSB; } if ( s.equals( "CLOCK" ) ) { return SAHPI_ENT_CLOCK; } if ( s.equals( "SYSTEM_FIRMWARE" ) ) { return SAHPI_ENT_SYSTEM_FIRMWARE; } if ( s.equals( "CHASSIS_SPECIFIC" ) ) { return SAHPI_ENT_CHASSIS_SPECIFIC; } if ( s.equals( "CHASSIS_SPECIFIC01" ) ) { return SAHPI_ENT_CHASSIS_SPECIFIC01; } if ( s.equals( "CHASSIS_SPECIFIC02" ) ) { return SAHPI_ENT_CHASSIS_SPECIFIC02; } if ( s.equals( "CHASSIS_SPECIFIC03" ) ) { return SAHPI_ENT_CHASSIS_SPECIFIC03; } if ( s.equals( "CHASSIS_SPECIFIC04" ) ) { return SAHPI_ENT_CHASSIS_SPECIFIC04; } if ( s.equals( "CHASSIS_SPECIFIC05" ) ) { return SAHPI_ENT_CHASSIS_SPECIFIC05; } if ( s.equals( "CHASSIS_SPECIFIC06" ) ) { return SAHPI_ENT_CHASSIS_SPECIFIC06; } if ( s.equals( "CHASSIS_SPECIFIC07" ) ) { return SAHPI_ENT_CHASSIS_SPECIFIC07; } if ( s.equals( "CHASSIS_SPECIFIC08" ) ) { return SAHPI_ENT_CHASSIS_SPECIFIC08; } if ( s.equals( "CHASSIS_SPECIFIC09" ) ) { return SAHPI_ENT_CHASSIS_SPECIFIC09; } if ( s.equals( "CHASSIS_SPECIFIC10" ) ) { return SAHPI_ENT_CHASSIS_SPECIFIC10; } if ( s.equals( "CHASSIS_SPECIFIC11" ) ) { return SAHPI_ENT_CHASSIS_SPECIFIC11; } if ( s.equals( "CHASSIS_SPECIFIC12" ) ) { return SAHPI_ENT_CHASSIS_SPECIFIC12; } if ( s.equals( "CHASSIS_SPECIFIC13" ) ) { return SAHPI_ENT_CHASSIS_SPECIFIC13; } if ( s.equals( "BOARD_SET_SPECIFIC" ) ) { return SAHPI_ENT_BOARD_SET_SPECIFIC; } if ( s.equals( "OEM_SYSINT_SPECIFIC" ) ) { return SAHPI_ENT_OEM_SYSINT_SPECIFIC; } if ( s.equals( "ROOT" ) ) { return SAHPI_ENT_ROOT; } if ( s.equals( "RACK" ) ) { return SAHPI_ENT_RACK; } if ( s.equals( "SUBRACK" ) ) { return SAHPI_ENT_SUBRACK; } if ( s.equals( "COMPACTPCI_CHASSIS" ) ) { return SAHPI_ENT_COMPACTPCI_CHASSIS; } if ( s.equals( "ADVANCEDTCA_CHASSIS" ) ) { return SAHPI_ENT_ADVANCEDTCA_CHASSIS; } if ( s.equals( "RACK_MOUNTED_SERVER" ) ) { return SAHPI_ENT_RACK_MOUNTED_SERVER; } if ( s.equals( "SYSTEM_BLADE" ) ) { return SAHPI_ENT_SYSTEM_BLADE; } if ( s.equals( "SWITCH" ) ) { return SAHPI_ENT_SWITCH; } if ( s.equals( "SWITCH_BLADE" ) ) { return SAHPI_ENT_SWITCH_BLADE; } if ( s.equals( "SBC_BLADE" ) ) { return SAHPI_ENT_SBC_BLADE; } if ( s.equals( "IO_BLADE" ) ) { return SAHPI_ENT_IO_BLADE; } if ( s.equals( "DISK_BLADE" ) ) { return SAHPI_ENT_DISK_BLADE; } if ( s.equals( "DISK_DRIVE" ) ) { return SAHPI_ENT_DISK_DRIVE; } if ( s.equals( "FAN" ) ) { return SAHPI_ENT_FAN; } if ( s.equals( "POWER_DISTRIBUTION_UNIT" ) ) { return SAHPI_ENT_POWER_DISTRIBUTION_UNIT; } if ( s.equals( "SPEC_PROC_BLADE" ) ) { return SAHPI_ENT_SPEC_PROC_BLADE; } if ( s.equals( "IO_SUBBOARD" ) ) { return SAHPI_ENT_IO_SUBBOARD; } if ( s.equals( "SBC_SUBBOARD" ) ) { return SAHPI_ENT_SBC_SUBBOARD; } if ( s.equals( "ALARM_MANAGER" ) ) { return SAHPI_ENT_ALARM_MANAGER; } if ( s.equals( "SHELF_MANAGER" ) ) { return SAHPI_ENT_SHELF_MANAGER; } if ( s.equals( "DISPLAY_PANEL" ) ) { return SAHPI_ENT_DISPLAY_PANEL; } if ( s.equals( "SUBBOARD_CARRIER_BLADE" ) ) { return SAHPI_ENT_SUBBOARD_CARRIER_BLADE; } if ( s.equals( "PHYSICAL_SLOT" ) ) { return SAHPI_ENT_PHYSICAL_SLOT; } if ( s.equals( "PICMG_FRONT_BLADE" ) ) { return SAHPI_ENT_PICMG_FRONT_BLADE; } if ( s.equals( "SYSTEM_INVENTORY_DEVICE" ) ) { return SAHPI_ENT_SYSTEM_INVENTORY_DEVICE; } if ( s.equals( "FILTRATION_UNIT" ) ) { return SAHPI_ENT_FILTRATION_UNIT; } if ( s.equals( "AMC" ) ) { return SAHPI_ENT_AMC; } if ( s.equals( "BMC" ) ) { return SAHPI_ENT_BMC; } if ( s.equals( "IPMC" ) ) { return SAHPI_ENT_IPMC; } if ( s.equals( "MMC" ) ) { return SAHPI_ENT_MMC; } if ( s.equals( "SHMC" ) ) { return SAHPI_ENT_SHMC; } if ( s.equals( "CPLD" ) ) { return SAHPI_ENT_CPLD; } if ( s.equals( "EPLD" ) ) { return SAHPI_ENT_EPLD; } if ( s.equals( "FPGA" ) ) { return SAHPI_ENT_FPGA; } if ( s.equals( "DASD" ) ) { return SAHPI_ENT_DASD; } if ( s.equals( "NIC" ) ) { return SAHPI_ENT_NIC; } if ( s.equals( "DSP" ) ) { return SAHPI_ENT_DSP; } if ( s.equals( "UCODE" ) ) { return SAHPI_ENT_UCODE; } if ( s.equals( "NPU" ) ) { return SAHPI_ENT_NPU; } if ( s.equals( "OEM" ) ) { return SAHPI_ENT_OEM; } if ( s.equals( "INTERFACE" ) ) { return SAHPI_ENT_INTERFACE; } if ( s.equals( "MICROTCA_CHASSIS" ) ) { return SAHPI_ENT_MICROTCA_CHASSIS; } if ( s.equals( "CARRIER" ) ) { return SAHPI_ENT_CARRIER; } if ( s.equals( "CARRIER_MANAGER" ) ) { return SAHPI_ENT_CARRIER_MANAGER; } if ( s.equals( "CONFIG_DATA" ) ) { return SAHPI_ENT_CONFIG_DATA; } if ( s.equals( "INDICATOR" ) ) { return SAHPI_ENT_INDICATOR; } throw new IllegalArgumentException(); } /** * For SaHpiSensorTypeT */ public static String fromSaHpiSensorTypeT( long x ) { if ( x == SAHPI_TEMPERATURE ) { return "TEMPERATURE"; } if ( x == SAHPI_VOLTAGE ) { return "VOLTAGE"; } if ( x == SAHPI_CURRENT ) { return "CURRENT"; } if ( x == SAHPI_FAN ) { return "FAN"; } if ( x == SAHPI_PHYSICAL_SECURITY ) { return "PHYSICAL_SECURITY"; } if ( x == SAHPI_PLATFORM_VIOLATION ) { return "PLATFORM_VIOLATION"; } if ( x == SAHPI_PROCESSOR ) { return "PROCESSOR"; } if ( x == SAHPI_POWER_SUPPLY ) { return "POWER_SUPPLY"; } if ( x == SAHPI_POWER_UNIT ) { return "POWER_UNIT"; } if ( x == SAHPI_COOLING_DEVICE ) { return "COOLING_DEVICE"; } if ( x == SAHPI_OTHER_UNITS_BASED_SENSOR ) { return "OTHER_UNITS_BASED_SENSOR"; } if ( x == SAHPI_MEMORY ) { return "MEMORY"; } if ( x == SAHPI_DRIVE_SLOT ) { return "DRIVE_SLOT"; } if ( x == SAHPI_POST_MEMORY_RESIZE ) { return "POST_MEMORY_RESIZE"; } if ( x == SAHPI_SYSTEM_FW_PROGRESS ) { return "SYSTEM_FW_PROGRESS"; } if ( x == SAHPI_EVENT_LOGGING_DISABLED ) { return "EVENT_LOGGING_DISABLED"; } if ( x == SAHPI_RESERVED1 ) { return "RESERVED1"; } if ( x == SAHPI_SYSTEM_EVENT ) { return "SYSTEM_EVENT"; } if ( x == SAHPI_CRITICAL_INTERRUPT ) { return "CRITICAL_INTERRUPT"; } if ( x == SAHPI_BUTTON ) { return "BUTTON"; } if ( x == SAHPI_MODULE_BOARD ) { return "MODULE_BOARD"; } if ( x == SAHPI_MICROCONTROLLER_COPROCESSOR ) { return "MICROCONTROLLER_COPROCESSOR"; } if ( x == SAHPI_ADDIN_CARD ) { return "ADDIN_CARD"; } if ( x == SAHPI_CHASSIS ) { return "CHASSIS"; } if ( x == SAHPI_CHIP_SET ) { return "CHIP_SET"; } if ( x == SAHPI_OTHER_FRU ) { return "OTHER_FRU"; } if ( x == SAHPI_CABLE_INTERCONNECT ) { return "CABLE_INTERCONNECT"; } if ( x == SAHPI_TERMINATOR ) { return "TERMINATOR"; } if ( x == SAHPI_SYSTEM_BOOT_INITIATED ) { return "SYSTEM_BOOT_INITIATED"; } if ( x == SAHPI_BOOT_ERROR ) { return "BOOT_ERROR"; } if ( x == SAHPI_OS_BOOT ) { return "OS_BOOT"; } if ( x == SAHPI_OS_CRITICAL_STOP ) { return "OS_CRITICAL_STOP"; } if ( x == SAHPI_SLOT_CONNECTOR ) { return "SLOT_CONNECTOR"; } if ( x == SAHPI_SYSTEM_ACPI_POWER_STATE ) { return "SYSTEM_ACPI_POWER_STATE"; } if ( x == SAHPI_RESERVED2 ) { return "RESERVED2"; } if ( x == SAHPI_PLATFORM_ALERT ) { return "PLATFORM_ALERT"; } if ( x == SAHPI_ENTITY_PRESENCE ) { return "ENTITY_PRESENCE"; } if ( x == SAHPI_MONITOR_ASIC_IC ) { return "MONITOR_ASIC_IC"; } if ( x == SAHPI_LAN ) { return "LAN"; } if ( x == SAHPI_MANAGEMENT_SUBSYSTEM_HEALTH ) { return "MANAGEMENT_SUBSYSTEM_HEALTH"; } if ( x == SAHPI_BATTERY ) { return "BATTERY"; } if ( x == SAHPI_SESSION_AUDIT ) { return "SESSION_AUDIT"; } if ( x == SAHPI_VERSION_CHANGE ) { return "VERSION_CHANGE"; } if ( x == SAHPI_OPERATIONAL ) { return "OPERATIONAL"; } if ( x == SAHPI_OEM_SENSOR ) { return "OEM_SENSOR"; } if ( x == SAHPI_COMM_CHANNEL_LINK_STATE ) { return "COMM_CHANNEL_LINK_STATE"; } if ( x == SAHPI_MANAGEMENT_BUS_STATE ) { return "MANAGEMENT_BUS_STATE"; } if ( x == SAHPI_COMM_CHANNEL_BUS_STATE ) { return "COMM_CHANNEL_BUS_STATE"; } if ( x == SAHPI_CONFIG_DATA ) { return "CONFIG_DATA"; } if ( x == SAHPI_POWER_BUDGET ) { return "POWER_BUDGET"; } return Long.toString( x ); } public static long toSaHpiSensorTypeT( String s ) throws IllegalArgumentException { if ( s.equals( "TEMPERATURE" ) ) { return SAHPI_TEMPERATURE; } if ( s.equals( "VOLTAGE" ) ) { return SAHPI_VOLTAGE; } if ( s.equals( "CURRENT" ) ) { return SAHPI_CURRENT; } if ( s.equals( "FAN" ) ) { return SAHPI_FAN; } if ( s.equals( "PHYSICAL_SECURITY" ) ) { return SAHPI_PHYSICAL_SECURITY; } if ( s.equals( "PLATFORM_VIOLATION" ) ) { return SAHPI_PLATFORM_VIOLATION; } if ( s.equals( "PROCESSOR" ) ) { return SAHPI_PROCESSOR; } if ( s.equals( "POWER_SUPPLY" ) ) { return SAHPI_POWER_SUPPLY; } if ( s.equals( "POWER_UNIT" ) ) { return SAHPI_POWER_UNIT; } if ( s.equals( "COOLING_DEVICE" ) ) { return SAHPI_COOLING_DEVICE; } if ( s.equals( "OTHER_UNITS_BASED_SENSOR" ) ) { return SAHPI_OTHER_UNITS_BASED_SENSOR; } if ( s.equals( "MEMORY" ) ) { return SAHPI_MEMORY; } if ( s.equals( "DRIVE_SLOT" ) ) { return SAHPI_DRIVE_SLOT; } if ( s.equals( "POST_MEMORY_RESIZE" ) ) { return SAHPI_POST_MEMORY_RESIZE; } if ( s.equals( "SYSTEM_FW_PROGRESS" ) ) { return SAHPI_SYSTEM_FW_PROGRESS; } if ( s.equals( "EVENT_LOGGING_DISABLED" ) ) { return SAHPI_EVENT_LOGGING_DISABLED; } if ( s.equals( "RESERVED1" ) ) { return SAHPI_RESERVED1; } if ( s.equals( "SYSTEM_EVENT" ) ) { return SAHPI_SYSTEM_EVENT; } if ( s.equals( "CRITICAL_INTERRUPT" ) ) { return SAHPI_CRITICAL_INTERRUPT; } if ( s.equals( "BUTTON" ) ) { return SAHPI_BUTTON; } if ( s.equals( "MODULE_BOARD" ) ) { return SAHPI_MODULE_BOARD; } if ( s.equals( "MICROCONTROLLER_COPROCESSOR" ) ) { return SAHPI_MICROCONTROLLER_COPROCESSOR; } if ( s.equals( "ADDIN_CARD" ) ) { return SAHPI_ADDIN_CARD; } if ( s.equals( "CHASSIS" ) ) { return SAHPI_CHASSIS; } if ( s.equals( "CHIP_SET" ) ) { return SAHPI_CHIP_SET; } if ( s.equals( "OTHER_FRU" ) ) { return SAHPI_OTHER_FRU; } if ( s.equals( "CABLE_INTERCONNECT" ) ) { return SAHPI_CABLE_INTERCONNECT; } if ( s.equals( "TERMINATOR" ) ) { return SAHPI_TERMINATOR; } if ( s.equals( "SYSTEM_BOOT_INITIATED" ) ) { return SAHPI_SYSTEM_BOOT_INITIATED; } if ( s.equals( "BOOT_ERROR" ) ) { return SAHPI_BOOT_ERROR; } if ( s.equals( "OS_BOOT" ) ) { return SAHPI_OS_BOOT; } if ( s.equals( "OS_CRITICAL_STOP" ) ) { return SAHPI_OS_CRITICAL_STOP; } if ( s.equals( "SLOT_CONNECTOR" ) ) { return SAHPI_SLOT_CONNECTOR; } if ( s.equals( "SYSTEM_ACPI_POWER_STATE" ) ) { return SAHPI_SYSTEM_ACPI_POWER_STATE; } if ( s.equals( "RESERVED2" ) ) { return SAHPI_RESERVED2; } if ( s.equals( "PLATFORM_ALERT" ) ) { return SAHPI_PLATFORM_ALERT; } if ( s.equals( "ENTITY_PRESENCE" ) ) { return SAHPI_ENTITY_PRESENCE; } if ( s.equals( "MONITOR_ASIC_IC" ) ) { return SAHPI_MONITOR_ASIC_IC; } if ( s.equals( "LAN" ) ) { return SAHPI_LAN; } if ( s.equals( "MANAGEMENT_SUBSYSTEM_HEALTH" ) ) { return SAHPI_MANAGEMENT_SUBSYSTEM_HEALTH; } if ( s.equals( "BATTERY" ) ) { return SAHPI_BATTERY; } if ( s.equals( "SESSION_AUDIT" ) ) { return SAHPI_SESSION_AUDIT; } if ( s.equals( "VERSION_CHANGE" ) ) { return SAHPI_VERSION_CHANGE; } if ( s.equals( "OPERATIONAL" ) ) { return SAHPI_OPERATIONAL; } if ( s.equals( "OEM_SENSOR" ) ) { return SAHPI_OEM_SENSOR; } if ( s.equals( "COMM_CHANNEL_LINK_STATE" ) ) { return SAHPI_COMM_CHANNEL_LINK_STATE; } if ( s.equals( "MANAGEMENT_BUS_STATE" ) ) { return SAHPI_MANAGEMENT_BUS_STATE; } if ( s.equals( "COMM_CHANNEL_BUS_STATE" ) ) { return SAHPI_COMM_CHANNEL_BUS_STATE; } if ( s.equals( "CONFIG_DATA" ) ) { return SAHPI_CONFIG_DATA; } if ( s.equals( "POWER_BUDGET" ) ) { return SAHPI_POWER_BUDGET; } throw new IllegalArgumentException(); } /** * For SaHpiSensorReadingTypeT */ public static String fromSaHpiSensorReadingTypeT( long x ) { if ( x == SAHPI_SENSOR_READING_TYPE_INT64 ) { return "INT64"; } if ( x == SAHPI_SENSOR_READING_TYPE_UINT64 ) { return "UINT64"; } if ( x == SAHPI_SENSOR_READING_TYPE_FLOAT64 ) { return "FLOAT64"; } if ( x == SAHPI_SENSOR_READING_TYPE_BUFFER ) { return "BUFFER"; } return Long.toString( x ); } public static long toSaHpiSensorReadingTypeT( String s ) throws IllegalArgumentException { if ( s.equals( "INT64" ) ) { return SAHPI_SENSOR_READING_TYPE_INT64; } if ( s.equals( "UINT64" ) ) { return SAHPI_SENSOR_READING_TYPE_UINT64; } if ( s.equals( "FLOAT64" ) ) { return SAHPI_SENSOR_READING_TYPE_FLOAT64; } if ( s.equals( "BUFFER" ) ) { return SAHPI_SENSOR_READING_TYPE_BUFFER; } throw new IllegalArgumentException(); } /** * For SaHpiSensorEventMaskActionT */ public static String fromSaHpiSensorEventMaskActionT( long x ) { if ( x == SAHPI_SENS_ADD_EVENTS_TO_MASKS ) { return "ADD_EVENTS_TO_MASKS"; } if ( x == SAHPI_SENS_REMOVE_EVENTS_FROM_MASKS ) { return "REMOVE_EVENTS_FROM_MASKS"; } return Long.toString( x ); } public static long toSaHpiSensorEventMaskActionT( String s ) throws IllegalArgumentException { if ( s.equals( "ADD_EVENTS_TO_MASKS" ) ) { return SAHPI_SENS_ADD_EVENTS_TO_MASKS; } if ( s.equals( "REMOVE_EVENTS_FROM_MASKS" ) ) { return SAHPI_SENS_REMOVE_EVENTS_FROM_MASKS; } throw new IllegalArgumentException(); } /** * For SaHpiSensorUnitsT */ public static String fromSaHpiSensorUnitsT( long x ) { if ( x == SAHPI_SU_UNSPECIFIED ) { return "UNSPECIFIED"; } if ( x == SAHPI_SU_DEGREES_C ) { return "DEGREES_C"; } if ( x == SAHPI_SU_DEGREES_F ) { return "DEGREES_F"; } if ( x == SAHPI_SU_DEGREES_K ) { return "DEGREES_K"; } if ( x == SAHPI_SU_VOLTS ) { return "VOLTS"; } if ( x == SAHPI_SU_AMPS ) { return "AMPS"; } if ( x == SAHPI_SU_WATTS ) { return "WATTS"; } if ( x == SAHPI_SU_JOULES ) { return "JOULES"; } if ( x == SAHPI_SU_COULOMBS ) { return "COULOMBS"; } if ( x == SAHPI_SU_VA ) { return "VA"; } if ( x == SAHPI_SU_NITS ) { return "NITS"; } if ( x == SAHPI_SU_LUMEN ) { return "LUMEN"; } if ( x == SAHPI_SU_LUX ) { return "LUX"; } if ( x == SAHPI_SU_CANDELA ) { return "CANDELA"; } if ( x == SAHPI_SU_KPA ) { return "KPA"; } if ( x == SAHPI_SU_PSI ) { return "PSI"; } if ( x == SAHPI_SU_NEWTON ) { return "NEWTON"; } if ( x == SAHPI_SU_CFM ) { return "CFM"; } if ( x == SAHPI_SU_RPM ) { return "RPM"; } if ( x == SAHPI_SU_HZ ) { return "HZ"; } if ( x == SAHPI_SU_MICROSECOND ) { return "MICROSECOND"; } if ( x == SAHPI_SU_MILLISECOND ) { return "MILLISECOND"; } if ( x == SAHPI_SU_SECOND ) { return "SECOND"; } if ( x == SAHPI_SU_MINUTE ) { return "MINUTE"; } if ( x == SAHPI_SU_HOUR ) { return "HOUR"; } if ( x == SAHPI_SU_DAY ) { return "DAY"; } if ( x == SAHPI_SU_WEEK ) { return "WEEK"; } if ( x == SAHPI_SU_MIL ) { return "MIL"; } if ( x == SAHPI_SU_INCHES ) { return "INCHES"; } if ( x == SAHPI_SU_FEET ) { return "FEET"; } if ( x == SAHPI_SU_CU_IN ) { return "CU_IN"; } if ( x == SAHPI_SU_CU_FEET ) { return "CU_FEET"; } if ( x == SAHPI_SU_MM ) { return "MM"; } if ( x == SAHPI_SU_CM ) { return "CM"; } if ( x == SAHPI_SU_M ) { return "M"; } if ( x == SAHPI_SU_CU_CM ) { return "CU_CM"; } if ( x == SAHPI_SU_CU_M ) { return "CU_M"; } if ( x == SAHPI_SU_LITERS ) { return "LITERS"; } if ( x == SAHPI_SU_FLUID_OUNCE ) { return "FLUID_OUNCE"; } if ( x == SAHPI_SU_RADIANS ) { return "RADIANS"; } if ( x == SAHPI_SU_STERADIANS ) { return "STERADIANS"; } if ( x == SAHPI_SU_REVOLUTIONS ) { return "REVOLUTIONS"; } if ( x == SAHPI_SU_CYCLES ) { return "CYCLES"; } if ( x == SAHPI_SU_GRAVITIES ) { return "GRAVITIES"; } if ( x == SAHPI_SU_OUNCE ) { return "OUNCE"; } if ( x == SAHPI_SU_POUND ) { return "POUND"; } if ( x == SAHPI_SU_FT_LB ) { return "FT_LB"; } if ( x == SAHPI_SU_OZ_IN ) { return "OZ_IN"; } if ( x == SAHPI_SU_GAUSS ) { return "GAUSS"; } if ( x == SAHPI_SU_GILBERTS ) { return "GILBERTS"; } if ( x == SAHPI_SU_HENRY ) { return "HENRY"; } if ( x == SAHPI_SU_MILLIHENRY ) { return "MILLIHENRY"; } if ( x == SAHPI_SU_FARAD ) { return "FARAD"; } if ( x == SAHPI_SU_MICROFARAD ) { return "MICROFARAD"; } if ( x == SAHPI_SU_OHMS ) { return "OHMS"; } if ( x == SAHPI_SU_SIEMENS ) { return "SIEMENS"; } if ( x == SAHPI_SU_MOLE ) { return "MOLE"; } if ( x == SAHPI_SU_BECQUEREL ) { return "BECQUEREL"; } if ( x == SAHPI_SU_PPM ) { return "PPM"; } if ( x == SAHPI_SU_RESERVED ) { return "RESERVED"; } if ( x == SAHPI_SU_DECIBELS ) { return "DECIBELS"; } if ( x == SAHPI_SU_DBA ) { return "DBA"; } if ( x == SAHPI_SU_DBC ) { return "DBC"; } if ( x == SAHPI_SU_GRAY ) { return "GRAY"; } if ( x == SAHPI_SU_SIEVERT ) { return "SIEVERT"; } if ( x == SAHPI_SU_COLOR_TEMP_DEG_K ) { return "COLOR_TEMP_DEG_K"; } if ( x == SAHPI_SU_BIT ) { return "BIT"; } if ( x == SAHPI_SU_KILOBIT ) { return "KILOBIT"; } if ( x == SAHPI_SU_MEGABIT ) { return "MEGABIT"; } if ( x == SAHPI_SU_GIGABIT ) { return "GIGABIT"; } if ( x == SAHPI_SU_BYTE ) { return "BYTE"; } if ( x == SAHPI_SU_KILOBYTE ) { return "KILOBYTE"; } if ( x == SAHPI_SU_MEGABYTE ) { return "MEGABYTE"; } if ( x == SAHPI_SU_GIGABYTE ) { return "GIGABYTE"; } if ( x == SAHPI_SU_WORD ) { return "WORD"; } if ( x == SAHPI_SU_DWORD ) { return "DWORD"; } if ( x == SAHPI_SU_QWORD ) { return "QWORD"; } if ( x == SAHPI_SU_LINE ) { return "LINE"; } if ( x == SAHPI_SU_HIT ) { return "HIT"; } if ( x == SAHPI_SU_MISS ) { return "MISS"; } if ( x == SAHPI_SU_RETRY ) { return "RETRY"; } if ( x == SAHPI_SU_RESET ) { return "RESET"; } if ( x == SAHPI_SU_OVERRUN ) { return "OVERRUN"; } if ( x == SAHPI_SU_UNDERRUN ) { return "UNDERRUN"; } if ( x == SAHPI_SU_COLLISION ) { return "COLLISION"; } if ( x == SAHPI_SU_PACKETS ) { return "PACKETS"; } if ( x == SAHPI_SU_MESSAGES ) { return "MESSAGES"; } if ( x == SAHPI_SU_CHARACTERS ) { return "CHARACTERS"; } if ( x == SAHPI_SU_ERRORS ) { return "ERRORS"; } if ( x == SAHPI_SU_CORRECTABLE_ERRORS ) { return "CORRECTABLE_ERRORS"; } if ( x == SAHPI_SU_UNCORRECTABLE_ERRORS ) { return "UNCORRECTABLE_ERRORS"; } return Long.toString( x ); } public static long toSaHpiSensorUnitsT( String s ) throws IllegalArgumentException { if ( s.equals( "UNSPECIFIED" ) ) { return SAHPI_SU_UNSPECIFIED; } if ( s.equals( "DEGREES_C" ) ) { return SAHPI_SU_DEGREES_C; } if ( s.equals( "DEGREES_F" ) ) { return SAHPI_SU_DEGREES_F; } if ( s.equals( "DEGREES_K" ) ) { return SAHPI_SU_DEGREES_K; } if ( s.equals( "VOLTS" ) ) { return SAHPI_SU_VOLTS; } if ( s.equals( "AMPS" ) ) { return SAHPI_SU_AMPS; } if ( s.equals( "WATTS" ) ) { return SAHPI_SU_WATTS; } if ( s.equals( "JOULES" ) ) { return SAHPI_SU_JOULES; } if ( s.equals( "COULOMBS" ) ) { return SAHPI_SU_COULOMBS; } if ( s.equals( "VA" ) ) { return SAHPI_SU_VA; } if ( s.equals( "NITS" ) ) { return SAHPI_SU_NITS; } if ( s.equals( "LUMEN" ) ) { return SAHPI_SU_LUMEN; } if ( s.equals( "LUX" ) ) { return SAHPI_SU_LUX; } if ( s.equals( "CANDELA" ) ) { return SAHPI_SU_CANDELA; } if ( s.equals( "KPA" ) ) { return SAHPI_SU_KPA; } if ( s.equals( "PSI" ) ) { return SAHPI_SU_PSI; } if ( s.equals( "NEWTON" ) ) { return SAHPI_SU_NEWTON; } if ( s.equals( "CFM" ) ) { return SAHPI_SU_CFM; } if ( s.equals( "RPM" ) ) { return SAHPI_SU_RPM; } if ( s.equals( "HZ" ) ) { return SAHPI_SU_HZ; } if ( s.equals( "MICROSECOND" ) ) { return SAHPI_SU_MICROSECOND; } if ( s.equals( "MILLISECOND" ) ) { return SAHPI_SU_MILLISECOND; } if ( s.equals( "SECOND" ) ) { return SAHPI_SU_SECOND; } if ( s.equals( "MINUTE" ) ) { return SAHPI_SU_MINUTE; } if ( s.equals( "HOUR" ) ) { return SAHPI_SU_HOUR; } if ( s.equals( "DAY" ) ) { return SAHPI_SU_DAY; } if ( s.equals( "WEEK" ) ) { return SAHPI_SU_WEEK; } if ( s.equals( "MIL" ) ) { return SAHPI_SU_MIL; } if ( s.equals( "INCHES" ) ) { return SAHPI_SU_INCHES; } if ( s.equals( "FEET" ) ) { return SAHPI_SU_FEET; } if ( s.equals( "CU_IN" ) ) { return SAHPI_SU_CU_IN; } if ( s.equals( "CU_FEET" ) ) { return SAHPI_SU_CU_FEET; } if ( s.equals( "MM" ) ) { return SAHPI_SU_MM; } if ( s.equals( "CM" ) ) { return SAHPI_SU_CM; } if ( s.equals( "M" ) ) { return SAHPI_SU_M; } if ( s.equals( "CU_CM" ) ) { return SAHPI_SU_CU_CM; } if ( s.equals( "CU_M" ) ) { return SAHPI_SU_CU_M; } if ( s.equals( "LITERS" ) ) { return SAHPI_SU_LITERS; } if ( s.equals( "FLUID_OUNCE" ) ) { return SAHPI_SU_FLUID_OUNCE; } if ( s.equals( "RADIANS" ) ) { return SAHPI_SU_RADIANS; } if ( s.equals( "STERADIANS" ) ) { return SAHPI_SU_STERADIANS; } if ( s.equals( "REVOLUTIONS" ) ) { return SAHPI_SU_REVOLUTIONS; } if ( s.equals( "CYCLES" ) ) { return SAHPI_SU_CYCLES; } if ( s.equals( "GRAVITIES" ) ) { return SAHPI_SU_GRAVITIES; } if ( s.equals( "OUNCE" ) ) { return SAHPI_SU_OUNCE; } if ( s.equals( "POUND" ) ) { return SAHPI_SU_POUND; } if ( s.equals( "FT_LB" ) ) { return SAHPI_SU_FT_LB; } if ( s.equals( "OZ_IN" ) ) { return SAHPI_SU_OZ_IN; } if ( s.equals( "GAUSS" ) ) { return SAHPI_SU_GAUSS; } if ( s.equals( "GILBERTS" ) ) { return SAHPI_SU_GILBERTS; } if ( s.equals( "HENRY" ) ) { return SAHPI_SU_HENRY; } if ( s.equals( "MILLIHENRY" ) ) { return SAHPI_SU_MILLIHENRY; } if ( s.equals( "FARAD" ) ) { return SAHPI_SU_FARAD; } if ( s.equals( "MICROFARAD" ) ) { return SAHPI_SU_MICROFARAD; } if ( s.equals( "OHMS" ) ) { return SAHPI_SU_OHMS; } if ( s.equals( "SIEMENS" ) ) { return SAHPI_SU_SIEMENS; } if ( s.equals( "MOLE" ) ) { return SAHPI_SU_MOLE; } if ( s.equals( "BECQUEREL" ) ) { return SAHPI_SU_BECQUEREL; } if ( s.equals( "PPM" ) ) { return SAHPI_SU_PPM; } if ( s.equals( "RESERVED" ) ) { return SAHPI_SU_RESERVED; } if ( s.equals( "DECIBELS" ) ) { return SAHPI_SU_DECIBELS; } if ( s.equals( "DBA" ) ) { return SAHPI_SU_DBA; } if ( s.equals( "DBC" ) ) { return SAHPI_SU_DBC; } if ( s.equals( "GRAY" ) ) { return SAHPI_SU_GRAY; } if ( s.equals( "SIEVERT" ) ) { return SAHPI_SU_SIEVERT; } if ( s.equals( "COLOR_TEMP_DEG_K" ) ) { return SAHPI_SU_COLOR_TEMP_DEG_K; } if ( s.equals( "BIT" ) ) { return SAHPI_SU_BIT; } if ( s.equals( "KILOBIT" ) ) { return SAHPI_SU_KILOBIT; } if ( s.equals( "MEGABIT" ) ) { return SAHPI_SU_MEGABIT; } if ( s.equals( "GIGABIT" ) ) { return SAHPI_SU_GIGABIT; } if ( s.equals( "BYTE" ) ) { return SAHPI_SU_BYTE; } if ( s.equals( "KILOBYTE" ) ) { return SAHPI_SU_KILOBYTE; } if ( s.equals( "MEGABYTE" ) ) { return SAHPI_SU_MEGABYTE; } if ( s.equals( "GIGABYTE" ) ) { return SAHPI_SU_GIGABYTE; } if ( s.equals( "WORD" ) ) { return SAHPI_SU_WORD; } if ( s.equals( "DWORD" ) ) { return SAHPI_SU_DWORD; } if ( s.equals( "QWORD" ) ) { return SAHPI_SU_QWORD; } if ( s.equals( "LINE" ) ) { return SAHPI_SU_LINE; } if ( s.equals( "HIT" ) ) { return SAHPI_SU_HIT; } if ( s.equals( "MISS" ) ) { return SAHPI_SU_MISS; } if ( s.equals( "RETRY" ) ) { return SAHPI_SU_RETRY; } if ( s.equals( "RESET" ) ) { return SAHPI_SU_RESET; } if ( s.equals( "OVERRUN" ) ) { return SAHPI_SU_OVERRUN; } if ( s.equals( "UNDERRUN" ) ) { return SAHPI_SU_UNDERRUN; } if ( s.equals( "COLLISION" ) ) { return SAHPI_SU_COLLISION; } if ( s.equals( "PACKETS" ) ) { return SAHPI_SU_PACKETS; } if ( s.equals( "MESSAGES" ) ) { return SAHPI_SU_MESSAGES; } if ( s.equals( "CHARACTERS" ) ) { return SAHPI_SU_CHARACTERS; } if ( s.equals( "ERRORS" ) ) { return SAHPI_SU_ERRORS; } if ( s.equals( "CORRECTABLE_ERRORS" ) ) { return SAHPI_SU_CORRECTABLE_ERRORS; } if ( s.equals( "UNCORRECTABLE_ERRORS" ) ) { return SAHPI_SU_UNCORRECTABLE_ERRORS; } throw new IllegalArgumentException(); } /** * For SaHpiSensorModUnitUseT */ public static String fromSaHpiSensorModUnitUseT( long x ) { if ( x == SAHPI_SMUU_NONE ) { return "NONE"; } if ( x == SAHPI_SMUU_BASIC_OVER_MODIFIER ) { return "BASIC_OVER_MODIFIER"; } if ( x == SAHPI_SMUU_BASIC_TIMES_MODIFIER ) { return "BASIC_TIMES_MODIFIER"; } return Long.toString( x ); } public static long toSaHpiSensorModUnitUseT( String s ) throws IllegalArgumentException { if ( s.equals( "NONE" ) ) { return SAHPI_SMUU_NONE; } if ( s.equals( "BASIC_OVER_MODIFIER" ) ) { return SAHPI_SMUU_BASIC_OVER_MODIFIER; } if ( s.equals( "BASIC_TIMES_MODIFIER" ) ) { return SAHPI_SMUU_BASIC_TIMES_MODIFIER; } throw new IllegalArgumentException(); } /** * For SaHpiSensorEventCtrlT */ public static String fromSaHpiSensorEventCtrlT( long x ) { if ( x == SAHPI_SEC_PER_EVENT ) { return "PER_EVENT"; } if ( x == SAHPI_SEC_READ_ONLY_MASKS ) { return "READ_ONLY_MASKS"; } if ( x == SAHPI_SEC_READ_ONLY ) { return "READ_ONLY"; } return Long.toString( x ); } public static long toSaHpiSensorEventCtrlT( String s ) throws IllegalArgumentException { if ( s.equals( "PER_EVENT" ) ) { return SAHPI_SEC_PER_EVENT; } if ( s.equals( "READ_ONLY_MASKS" ) ) { return SAHPI_SEC_READ_ONLY_MASKS; } if ( s.equals( "READ_ONLY" ) ) { return SAHPI_SEC_READ_ONLY; } throw new IllegalArgumentException(); } /** * For SaHpiCtrlTypeT */ public static String fromSaHpiCtrlTypeT( long x ) { if ( x == SAHPI_CTRL_TYPE_DIGITAL ) { return "DIGITAL"; } if ( x == SAHPI_CTRL_TYPE_DISCRETE ) { return "DISCRETE"; } if ( x == SAHPI_CTRL_TYPE_ANALOG ) { return "ANALOG"; } if ( x == SAHPI_CTRL_TYPE_STREAM ) { return "STREAM"; } if ( x == SAHPI_CTRL_TYPE_TEXT ) { return "TEXT"; } if ( x == SAHPI_CTRL_TYPE_OEM ) { return "OEM"; } return Long.toString( x ); } public static long toSaHpiCtrlTypeT( String s ) throws IllegalArgumentException { if ( s.equals( "DIGITAL" ) ) { return SAHPI_CTRL_TYPE_DIGITAL; } if ( s.equals( "DISCRETE" ) ) { return SAHPI_CTRL_TYPE_DISCRETE; } if ( s.equals( "ANALOG" ) ) { return SAHPI_CTRL_TYPE_ANALOG; } if ( s.equals( "STREAM" ) ) { return SAHPI_CTRL_TYPE_STREAM; } if ( s.equals( "TEXT" ) ) { return SAHPI_CTRL_TYPE_TEXT; } if ( s.equals( "OEM" ) ) { return SAHPI_CTRL_TYPE_OEM; } throw new IllegalArgumentException(); } /** * For SaHpiCtrlStateDigitalT */ public static String fromSaHpiCtrlStateDigitalT( long x ) { if ( x == SAHPI_CTRL_STATE_OFF ) { return "OFF"; } if ( x == SAHPI_CTRL_STATE_ON ) { return "ON"; } if ( x == SAHPI_CTRL_STATE_PULSE_OFF ) { return "PULSE_OFF"; } if ( x == SAHPI_CTRL_STATE_PULSE_ON ) { return "PULSE_ON"; } return Long.toString( x ); } public static long toSaHpiCtrlStateDigitalT( String s ) throws IllegalArgumentException { if ( s.equals( "OFF" ) ) { return SAHPI_CTRL_STATE_OFF; } if ( s.equals( "ON" ) ) { return SAHPI_CTRL_STATE_ON; } if ( s.equals( "PULSE_OFF" ) ) { return SAHPI_CTRL_STATE_PULSE_OFF; } if ( s.equals( "PULSE_ON" ) ) { return SAHPI_CTRL_STATE_PULSE_ON; } throw new IllegalArgumentException(); } /** * For SaHpiCtrlModeT */ public static String fromSaHpiCtrlModeT( long x ) { if ( x == SAHPI_CTRL_MODE_AUTO ) { return "AUTO"; } if ( x == SAHPI_CTRL_MODE_MANUAL ) { return "MANUAL"; } return Long.toString( x ); } public static long toSaHpiCtrlModeT( String s ) throws IllegalArgumentException { if ( s.equals( "AUTO" ) ) { return SAHPI_CTRL_MODE_AUTO; } if ( s.equals( "MANUAL" ) ) { return SAHPI_CTRL_MODE_MANUAL; } throw new IllegalArgumentException(); } /** * For SaHpiCtrlOutputTypeT */ public static String fromSaHpiCtrlOutputTypeT( long x ) { if ( x == SAHPI_CTRL_GENERIC ) { return "GENERIC"; } if ( x == SAHPI_CTRL_LED ) { return "LED"; } if ( x == SAHPI_CTRL_FAN_SPEED ) { return "FAN_SPEED"; } if ( x == SAHPI_CTRL_DRY_CONTACT_CLOSURE ) { return "DRY_CONTACT_CLOSURE"; } if ( x == SAHPI_CTRL_POWER_SUPPLY_INHIBIT ) { return "POWER_SUPPLY_INHIBIT"; } if ( x == SAHPI_CTRL_AUDIBLE ) { return "AUDIBLE"; } if ( x == SAHPI_CTRL_FRONT_PANEL_LOCKOUT ) { return "FRONT_PANEL_LOCKOUT"; } if ( x == SAHPI_CTRL_POWER_INTERLOCK ) { return "POWER_INTERLOCK"; } if ( x == SAHPI_CTRL_POWER_STATE ) { return "POWER_STATE"; } if ( x == SAHPI_CTRL_LCD_DISPLAY ) { return "LCD_DISPLAY"; } if ( x == SAHPI_CTRL_OEM ) { return "OEM"; } if ( x == SAHPI_CTRL_GENERIC_ADDRESS ) { return "GENERIC_ADDRESS"; } if ( x == SAHPI_CTRL_IP_ADDRESS ) { return "IP_ADDRESS"; } if ( x == SAHPI_CTRL_RESOURCE_ID ) { return "RESOURCE_ID"; } if ( x == SAHPI_CTRL_POWER_BUDGET ) { return "POWER_BUDGET"; } if ( x == SAHPI_CTRL_ACTIVATE ) { return "ACTIVATE"; } if ( x == SAHPI_CTRL_RESET ) { return "RESET"; } return Long.toString( x ); } public static long toSaHpiCtrlOutputTypeT( String s ) throws IllegalArgumentException { if ( s.equals( "GENERIC" ) ) { return SAHPI_CTRL_GENERIC; } if ( s.equals( "LED" ) ) { return SAHPI_CTRL_LED; } if ( s.equals( "FAN_SPEED" ) ) { return SAHPI_CTRL_FAN_SPEED; } if ( s.equals( "DRY_CONTACT_CLOSURE" ) ) { return SAHPI_CTRL_DRY_CONTACT_CLOSURE; } if ( s.equals( "POWER_SUPPLY_INHIBIT" ) ) { return SAHPI_CTRL_POWER_SUPPLY_INHIBIT; } if ( s.equals( "AUDIBLE" ) ) { return SAHPI_CTRL_AUDIBLE; } if ( s.equals( "FRONT_PANEL_LOCKOUT" ) ) { return SAHPI_CTRL_FRONT_PANEL_LOCKOUT; } if ( s.equals( "POWER_INTERLOCK" ) ) { return SAHPI_CTRL_POWER_INTERLOCK; } if ( s.equals( "POWER_STATE" ) ) { return SAHPI_CTRL_POWER_STATE; } if ( s.equals( "LCD_DISPLAY" ) ) { return SAHPI_CTRL_LCD_DISPLAY; } if ( s.equals( "OEM" ) ) { return SAHPI_CTRL_OEM; } if ( s.equals( "GENERIC_ADDRESS" ) ) { return SAHPI_CTRL_GENERIC_ADDRESS; } if ( s.equals( "IP_ADDRESS" ) ) { return SAHPI_CTRL_IP_ADDRESS; } if ( s.equals( "RESOURCE_ID" ) ) { return SAHPI_CTRL_RESOURCE_ID; } if ( s.equals( "POWER_BUDGET" ) ) { return SAHPI_CTRL_POWER_BUDGET; } if ( s.equals( "ACTIVATE" ) ) { return SAHPI_CTRL_ACTIVATE; } if ( s.equals( "RESET" ) ) { return SAHPI_CTRL_RESET; } throw new IllegalArgumentException(); } /** * For SaHpiIdrAreaTypeT */ public static String fromSaHpiIdrAreaTypeT( long x ) { if ( x == SAHPI_IDR_AREATYPE_INTERNAL_USE ) { return "INTERNAL_USE"; } if ( x == SAHPI_IDR_AREATYPE_CHASSIS_INFO ) { return "CHASSIS_INFO"; } if ( x == SAHPI_IDR_AREATYPE_BOARD_INFO ) { return "BOARD_INFO"; } if ( x == SAHPI_IDR_AREATYPE_PRODUCT_INFO ) { return "PRODUCT_INFO"; } if ( x == SAHPI_IDR_AREATYPE_OEM ) { return "OEM"; } if ( x == SAHPI_IDR_AREATYPE_UNSPECIFIED ) { return "UNSPECIFIED"; } return Long.toString( x ); } public static long toSaHpiIdrAreaTypeT( String s ) throws IllegalArgumentException { if ( s.equals( "INTERNAL_USE" ) ) { return SAHPI_IDR_AREATYPE_INTERNAL_USE; } if ( s.equals( "CHASSIS_INFO" ) ) { return SAHPI_IDR_AREATYPE_CHASSIS_INFO; } if ( s.equals( "BOARD_INFO" ) ) { return SAHPI_IDR_AREATYPE_BOARD_INFO; } if ( s.equals( "PRODUCT_INFO" ) ) { return SAHPI_IDR_AREATYPE_PRODUCT_INFO; } if ( s.equals( "OEM" ) ) { return SAHPI_IDR_AREATYPE_OEM; } if ( s.equals( "UNSPECIFIED" ) ) { return SAHPI_IDR_AREATYPE_UNSPECIFIED; } throw new IllegalArgumentException(); } /** * For SaHpiIdrFieldTypeT */ public static String fromSaHpiIdrFieldTypeT( long x ) { if ( x == SAHPI_IDR_FIELDTYPE_CHASSIS_TYPE ) { return "CHASSIS_TYPE"; } if ( x == SAHPI_IDR_FIELDTYPE_MFG_DATETIME ) { return "MFG_DATETIME"; } if ( x == SAHPI_IDR_FIELDTYPE_MANUFACTURER ) { return "MANUFACTURER"; } if ( x == SAHPI_IDR_FIELDTYPE_PRODUCT_NAME ) { return "PRODUCT_NAME"; } if ( x == SAHPI_IDR_FIELDTYPE_PRODUCT_VERSION ) { return "PRODUCT_VERSION"; } if ( x == SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER ) { return "SERIAL_NUMBER"; } if ( x == SAHPI_IDR_FIELDTYPE_PART_NUMBER ) { return "PART_NUMBER"; } if ( x == SAHPI_IDR_FIELDTYPE_FILE_ID ) { return "FILE_ID"; } if ( x == SAHPI_IDR_FIELDTYPE_ASSET_TAG ) { return "ASSET_TAG"; } if ( x == SAHPI_IDR_FIELDTYPE_CUSTOM ) { return "CUSTOM"; } if ( x == SAHPI_IDR_FIELDTYPE_UNSPECIFIED ) { return "UNSPECIFIED"; } return Long.toString( x ); } public static long toSaHpiIdrFieldTypeT( String s ) throws IllegalArgumentException { if ( s.equals( "CHASSIS_TYPE" ) ) { return SAHPI_IDR_FIELDTYPE_CHASSIS_TYPE; } if ( s.equals( "MFG_DATETIME" ) ) { return SAHPI_IDR_FIELDTYPE_MFG_DATETIME; } if ( s.equals( "MANUFACTURER" ) ) { return SAHPI_IDR_FIELDTYPE_MANUFACTURER; } if ( s.equals( "PRODUCT_NAME" ) ) { return SAHPI_IDR_FIELDTYPE_PRODUCT_NAME; } if ( s.equals( "PRODUCT_VERSION" ) ) { return SAHPI_IDR_FIELDTYPE_PRODUCT_VERSION; } if ( s.equals( "SERIAL_NUMBER" ) ) { return SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER; } if ( s.equals( "PART_NUMBER" ) ) { return SAHPI_IDR_FIELDTYPE_PART_NUMBER; } if ( s.equals( "FILE_ID" ) ) { return SAHPI_IDR_FIELDTYPE_FILE_ID; } if ( s.equals( "ASSET_TAG" ) ) { return SAHPI_IDR_FIELDTYPE_ASSET_TAG; } if ( s.equals( "CUSTOM" ) ) { return SAHPI_IDR_FIELDTYPE_CUSTOM; } if ( s.equals( "UNSPECIFIED" ) ) { return SAHPI_IDR_FIELDTYPE_UNSPECIFIED; } throw new IllegalArgumentException(); } /** * For SaHpiWatchdogActionT */ public static String fromSaHpiWatchdogActionT( long x ) { if ( x == SAHPI_WA_NO_ACTION ) { return "NO_ACTION"; } if ( x == SAHPI_WA_RESET ) { return "RESET"; } if ( x == SAHPI_WA_POWER_DOWN ) { return "POWER_DOWN"; } if ( x == SAHPI_WA_POWER_CYCLE ) { return "POWER_CYCLE"; } return Long.toString( x ); } public static long toSaHpiWatchdogActionT( String s ) throws IllegalArgumentException { if ( s.equals( "NO_ACTION" ) ) { return SAHPI_WA_NO_ACTION; } if ( s.equals( "RESET" ) ) { return SAHPI_WA_RESET; } if ( s.equals( "POWER_DOWN" ) ) { return SAHPI_WA_POWER_DOWN; } if ( s.equals( "POWER_CYCLE" ) ) { return SAHPI_WA_POWER_CYCLE; } throw new IllegalArgumentException(); } /** * For SaHpiWatchdogActionEventT */ public static String fromSaHpiWatchdogActionEventT( long x ) { if ( x == SAHPI_WAE_NO_ACTION ) { return "NO_ACTION"; } if ( x == SAHPI_WAE_RESET ) { return "RESET"; } if ( x == SAHPI_WAE_POWER_DOWN ) { return "POWER_DOWN"; } if ( x == SAHPI_WAE_POWER_CYCLE ) { return "POWER_CYCLE"; } if ( x == SAHPI_WAE_TIMER_INT ) { return "TIMER_INT"; } return Long.toString( x ); } public static long toSaHpiWatchdogActionEventT( String s ) throws IllegalArgumentException { if ( s.equals( "NO_ACTION" ) ) { return SAHPI_WAE_NO_ACTION; } if ( s.equals( "RESET" ) ) { return SAHPI_WAE_RESET; } if ( s.equals( "POWER_DOWN" ) ) { return SAHPI_WAE_POWER_DOWN; } if ( s.equals( "POWER_CYCLE" ) ) { return SAHPI_WAE_POWER_CYCLE; } if ( s.equals( "TIMER_INT" ) ) { return SAHPI_WAE_TIMER_INT; } throw new IllegalArgumentException(); } /** * For SaHpiWatchdogPretimerInterruptT */ public static String fromSaHpiWatchdogPretimerInterruptT( long x ) { if ( x == SAHPI_WPI_NONE ) { return "NONE"; } if ( x == SAHPI_WPI_SMI ) { return "SMI"; } if ( x == SAHPI_WPI_NMI ) { return "NMI"; } if ( x == SAHPI_WPI_MESSAGE_INTERRUPT ) { return "MESSAGE_INTERRUPT"; } if ( x == SAHPI_WPI_OEM ) { return "OEM"; } return Long.toString( x ); } public static long toSaHpiWatchdogPretimerInterruptT( String s ) throws IllegalArgumentException { if ( s.equals( "NONE" ) ) { return SAHPI_WPI_NONE; } if ( s.equals( "SMI" ) ) { return SAHPI_WPI_SMI; } if ( s.equals( "NMI" ) ) { return SAHPI_WPI_NMI; } if ( s.equals( "MESSAGE_INTERRUPT" ) ) { return SAHPI_WPI_MESSAGE_INTERRUPT; } if ( s.equals( "OEM" ) ) { return SAHPI_WPI_OEM; } throw new IllegalArgumentException(); } /** * For SaHpiWatchdogTimerUseT */ public static String fromSaHpiWatchdogTimerUseT( long x ) { if ( x == SAHPI_WTU_NONE ) { return "NONE"; } if ( x == SAHPI_WTU_BIOS_FRB2 ) { return "BIOS_FRB2"; } if ( x == SAHPI_WTU_BIOS_POST ) { return "BIOS_POST"; } if ( x == SAHPI_WTU_OS_LOAD ) { return "OS_LOAD"; } if ( x == SAHPI_WTU_SMS_OS ) { return "SMS_OS"; } if ( x == SAHPI_WTU_OEM ) { return "OEM"; } if ( x == SAHPI_WTU_UNSPECIFIED ) { return "UNSPECIFIED"; } return Long.toString( x ); } public static long toSaHpiWatchdogTimerUseT( String s ) throws IllegalArgumentException { if ( s.equals( "NONE" ) ) { return SAHPI_WTU_NONE; } if ( s.equals( "BIOS_FRB2" ) ) { return SAHPI_WTU_BIOS_FRB2; } if ( s.equals( "BIOS_POST" ) ) { return SAHPI_WTU_BIOS_POST; } if ( s.equals( "OS_LOAD" ) ) { return SAHPI_WTU_OS_LOAD; } if ( s.equals( "SMS_OS" ) ) { return SAHPI_WTU_SMS_OS; } if ( s.equals( "OEM" ) ) { return SAHPI_WTU_OEM; } if ( s.equals( "UNSPECIFIED" ) ) { return SAHPI_WTU_UNSPECIFIED; } throw new IllegalArgumentException(); } /** * For SaHpiDimiTestServiceImpactT */ public static String fromSaHpiDimiTestServiceImpactT( long x ) { if ( x == SAHPI_DIMITEST_NONDEGRADING ) { return "NONDEGRADING"; } if ( x == SAHPI_DIMITEST_DEGRADING ) { return "DEGRADING"; } if ( x == SAHPI_DIMITEST_VENDOR_DEFINED_LEVEL ) { return "VENDOR_DEFINED_LEVEL"; } return Long.toString( x ); } public static long toSaHpiDimiTestServiceImpactT( String s ) throws IllegalArgumentException { if ( s.equals( "NONDEGRADING" ) ) { return SAHPI_DIMITEST_NONDEGRADING; } if ( s.equals( "DEGRADING" ) ) { return SAHPI_DIMITEST_DEGRADING; } if ( s.equals( "VENDOR_DEFINED_LEVEL" ) ) { return SAHPI_DIMITEST_VENDOR_DEFINED_LEVEL; } throw new IllegalArgumentException(); } /** * For SaHpiDimiTestRunStatusT */ public static String fromSaHpiDimiTestRunStatusT( long x ) { if ( x == SAHPI_DIMITEST_STATUS_NOT_RUN ) { return "NOT_RUN"; } if ( x == SAHPI_DIMITEST_STATUS_FINISHED_NO_ERRORS ) { return "FINISHED_NO_ERRORS"; } if ( x == SAHPI_DIMITEST_STATUS_FINISHED_ERRORS ) { return "FINISHED_ERRORS"; } if ( x == SAHPI_DIMITEST_STATUS_CANCELED ) { return "CANCELED"; } if ( x == SAHPI_DIMITEST_STATUS_RUNNING ) { return "RUNNING"; } return Long.toString( x ); } public static long toSaHpiDimiTestRunStatusT( String s ) throws IllegalArgumentException { if ( s.equals( "NOT_RUN" ) ) { return SAHPI_DIMITEST_STATUS_NOT_RUN; } if ( s.equals( "FINISHED_NO_ERRORS" ) ) { return SAHPI_DIMITEST_STATUS_FINISHED_NO_ERRORS; } if ( s.equals( "FINISHED_ERRORS" ) ) { return SAHPI_DIMITEST_STATUS_FINISHED_ERRORS; } if ( s.equals( "CANCELED" ) ) { return SAHPI_DIMITEST_STATUS_CANCELED; } if ( s.equals( "RUNNING" ) ) { return SAHPI_DIMITEST_STATUS_RUNNING; } throw new IllegalArgumentException(); } /** * For SaHpiDimiTestErrCodeT */ public static String fromSaHpiDimiTestErrCodeT( long x ) { if ( x == SAHPI_DIMITEST_STATUSERR_NOERR ) { return "NOERR"; } if ( x == SAHPI_DIMITEST_STATUSERR_RUNERR ) { return "RUNERR"; } if ( x == SAHPI_DIMITEST_STATUSERR_UNDEF ) { return "UNDEF"; } return Long.toString( x ); } public static long toSaHpiDimiTestErrCodeT( String s ) throws IllegalArgumentException { if ( s.equals( "NOERR" ) ) { return SAHPI_DIMITEST_STATUSERR_NOERR; } if ( s.equals( "RUNERR" ) ) { return SAHPI_DIMITEST_STATUSERR_RUNERR; } if ( s.equals( "UNDEF" ) ) { return SAHPI_DIMITEST_STATUSERR_UNDEF; } throw new IllegalArgumentException(); } /** * For SaHpiDimiTestParamTypeT */ public static String fromSaHpiDimiTestParamTypeT( long x ) { if ( x == SAHPI_DIMITEST_PARAM_TYPE_BOOLEAN ) { return "BOOLEAN"; } if ( x == SAHPI_DIMITEST_PARAM_TYPE_INT32 ) { return "INT32"; } if ( x == SAHPI_DIMITEST_PARAM_TYPE_FLOAT64 ) { return "FLOAT64"; } if ( x == SAHPI_DIMITEST_PARAM_TYPE_TEXT ) { return "TEXT"; } return Long.toString( x ); } public static long toSaHpiDimiTestParamTypeT( String s ) throws IllegalArgumentException { if ( s.equals( "BOOLEAN" ) ) { return SAHPI_DIMITEST_PARAM_TYPE_BOOLEAN; } if ( s.equals( "INT32" ) ) { return SAHPI_DIMITEST_PARAM_TYPE_INT32; } if ( s.equals( "FLOAT64" ) ) { return SAHPI_DIMITEST_PARAM_TYPE_FLOAT64; } if ( s.equals( "TEXT" ) ) { return SAHPI_DIMITEST_PARAM_TYPE_TEXT; } throw new IllegalArgumentException(); } /** * For SaHpiDimiReadyT */ public static String fromSaHpiDimiReadyT( long x ) { if ( x == SAHPI_DIMI_READY ) { return "READY"; } if ( x == SAHPI_DIMI_WRONG_STATE ) { return "WRONG_STATE"; } if ( x == SAHPI_DIMI_BUSY ) { return "BUSY"; } return Long.toString( x ); } public static long toSaHpiDimiReadyT( String s ) throws IllegalArgumentException { if ( s.equals( "READY" ) ) { return SAHPI_DIMI_READY; } if ( s.equals( "WRONG_STATE" ) ) { return SAHPI_DIMI_WRONG_STATE; } if ( s.equals( "BUSY" ) ) { return SAHPI_DIMI_BUSY; } throw new IllegalArgumentException(); } /** * For SaHpiFumiSpecInfoTypeT */ public static String fromSaHpiFumiSpecInfoTypeT( long x ) { if ( x == SAHPI_FUMI_SPEC_INFO_NONE ) { return "NONE"; } if ( x == SAHPI_FUMI_SPEC_INFO_SAF_DEFINED ) { return "SAF_DEFINED"; } if ( x == SAHPI_FUMI_SPEC_INFO_OEM_DEFINED ) { return "OEM_DEFINED"; } return Long.toString( x ); } public static long toSaHpiFumiSpecInfoTypeT( String s ) throws IllegalArgumentException { if ( s.equals( "NONE" ) ) { return SAHPI_FUMI_SPEC_INFO_NONE; } if ( s.equals( "SAF_DEFINED" ) ) { return SAHPI_FUMI_SPEC_INFO_SAF_DEFINED; } if ( s.equals( "OEM_DEFINED" ) ) { return SAHPI_FUMI_SPEC_INFO_OEM_DEFINED; } throw new IllegalArgumentException(); } /** * For SaHpiFumiSafDefinedSpecIdT */ public static String fromSaHpiFumiSafDefinedSpecIdT( long x ) { if ( x == SAHPI_FUMI_SPEC_HPM1 ) { return ""; } return Long.toString( x ); } public static long toSaHpiFumiSafDefinedSpecIdT( String s ) throws IllegalArgumentException { if ( s.equals( "" ) ) { return SAHPI_FUMI_SPEC_HPM1; } throw new IllegalArgumentException(); } /** * For SaHpiFumiServiceImpactT */ public static String fromSaHpiFumiServiceImpactT( long x ) { if ( x == SAHPI_FUMI_PROCESS_NONDEGRADING ) { return "NONDEGRADING"; } if ( x == SAHPI_FUMI_PROCESS_DEGRADING ) { return "DEGRADING"; } if ( x == SAHPI_FUMI_PROCESS_VENDOR_DEFINED_IMPACT_LEVEL ) { return "VENDOR_DEFINED_IMPACT_LEVEL"; } return Long.toString( x ); } public static long toSaHpiFumiServiceImpactT( String s ) throws IllegalArgumentException { if ( s.equals( "NONDEGRADING" ) ) { return SAHPI_FUMI_PROCESS_NONDEGRADING; } if ( s.equals( "DEGRADING" ) ) { return SAHPI_FUMI_PROCESS_DEGRADING; } if ( s.equals( "VENDOR_DEFINED_IMPACT_LEVEL" ) ) { return SAHPI_FUMI_PROCESS_VENDOR_DEFINED_IMPACT_LEVEL; } throw new IllegalArgumentException(); } /** * For SaHpiFumiSourceStatusT */ public static String fromSaHpiFumiSourceStatusT( long x ) { if ( x == SAHPI_FUMI_SRC_VALID ) { return "VALID"; } if ( x == SAHPI_FUMI_SRC_PROTOCOL_NOT_SUPPORTED ) { return "PROTOCOL_NOT_SUPPORTED"; } if ( x == SAHPI_FUMI_SRC_UNREACHABLE ) { return "UNREACHABLE"; } if ( x == SAHPI_FUMI_SRC_VALIDATION_NOT_STARTED ) { return "VALIDATION_NOT_STARTED"; } if ( x == SAHPI_FUMI_SRC_VALIDATION_INITIATED ) { return "VALIDATION_INITIATED"; } if ( x == SAHPI_FUMI_SRC_VALIDATION_FAIL ) { return "VALIDATION_FAIL"; } if ( x == SAHPI_FUMI_SRC_TYPE_MISMATCH ) { return "TYPE_MISMATCH"; } if ( x == SAHPI_FUMI_SRC_INVALID ) { return "INVALID"; } if ( x == SAHPI_FUMI_SRC_VALIDITY_UNKNOWN ) { return "VALIDITY_UNKNOWN"; } return Long.toString( x ); } public static long toSaHpiFumiSourceStatusT( String s ) throws IllegalArgumentException { if ( s.equals( "VALID" ) ) { return SAHPI_FUMI_SRC_VALID; } if ( s.equals( "PROTOCOL_NOT_SUPPORTED" ) ) { return SAHPI_FUMI_SRC_PROTOCOL_NOT_SUPPORTED; } if ( s.equals( "UNREACHABLE" ) ) { return SAHPI_FUMI_SRC_UNREACHABLE; } if ( s.equals( "VALIDATION_NOT_STARTED" ) ) { return SAHPI_FUMI_SRC_VALIDATION_NOT_STARTED; } if ( s.equals( "VALIDATION_INITIATED" ) ) { return SAHPI_FUMI_SRC_VALIDATION_INITIATED; } if ( s.equals( "VALIDATION_FAIL" ) ) { return SAHPI_FUMI_SRC_VALIDATION_FAIL; } if ( s.equals( "TYPE_MISMATCH" ) ) { return SAHPI_FUMI_SRC_TYPE_MISMATCH; } if ( s.equals( "INVALID" ) ) { return SAHPI_FUMI_SRC_INVALID; } if ( s.equals( "VALIDITY_UNKNOWN" ) ) { return SAHPI_FUMI_SRC_VALIDITY_UNKNOWN; } throw new IllegalArgumentException(); } /** * For SaHpiFumiBankStateT */ public static String fromSaHpiFumiBankStateT( long x ) { if ( x == SAHPI_FUMI_BANK_VALID ) { return "VALID"; } if ( x == SAHPI_FUMI_BANK_UPGRADE_IN_PROGRESS ) { return "UPGRADE_IN_PROGRESS"; } if ( x == SAHPI_FUMI_BANK_CORRUPTED ) { return "CORRUPTED"; } if ( x == SAHPI_FUMI_BANK_ACTIVE ) { return "ACTIVE"; } if ( x == SAHPI_FUMI_BANK_BUSY ) { return "BUSY"; } if ( x == SAHPI_FUMI_BANK_UNKNOWN ) { return "UNKNOWN"; } return Long.toString( x ); } public static long toSaHpiFumiBankStateT( String s ) throws IllegalArgumentException { if ( s.equals( "VALID" ) ) { return SAHPI_FUMI_BANK_VALID; } if ( s.equals( "UPGRADE_IN_PROGRESS" ) ) { return SAHPI_FUMI_BANK_UPGRADE_IN_PROGRESS; } if ( s.equals( "CORRUPTED" ) ) { return SAHPI_FUMI_BANK_CORRUPTED; } if ( s.equals( "ACTIVE" ) ) { return SAHPI_FUMI_BANK_ACTIVE; } if ( s.equals( "BUSY" ) ) { return SAHPI_FUMI_BANK_BUSY; } if ( s.equals( "UNKNOWN" ) ) { return SAHPI_FUMI_BANK_UNKNOWN; } throw new IllegalArgumentException(); } /** * For SaHpiFumiUpgradeStatusT */ public static String fromSaHpiFumiUpgradeStatusT( long x ) { if ( x == SAHPI_FUMI_OPERATION_NOTSTARTED ) { return "OPERATION_NOTSTARTED"; } if ( x == SAHPI_FUMI_SOURCE_VALIDATION_INITIATED ) { return "SOURCE_VALIDATION_INITIATED"; } if ( x == SAHPI_FUMI_SOURCE_VALIDATION_FAILED ) { return "SOURCE_VALIDATION_FAILED"; } if ( x == SAHPI_FUMI_SOURCE_VALIDATION_DONE ) { return "SOURCE_VALIDATION_DONE"; } if ( x == SAHPI_FUMI_SOURCE_VALIDATION_CANCELLED ) { return "SOURCE_VALIDATION_CANCELLED"; } if ( x == SAHPI_FUMI_INSTALL_INITIATED ) { return "INSTALL_INITIATED"; } if ( x == SAHPI_FUMI_INSTALL_FAILED_ROLLBACK_NEEDED ) { return "INSTALL_FAILED_ROLLBACK_NEEDED"; } if ( x == SAHPI_FUMI_INSTALL_FAILED_ROLLBACK_INITIATED ) { return "INSTALL_FAILED_ROLLBACK_INITIATED"; } if ( x == SAHPI_FUMI_INSTALL_FAILED_ROLLBACK_NOT_POSSIBLE ) { return "INSTALL_FAILED_ROLLBACK_NOT_POSSIBLE"; } if ( x == SAHPI_FUMI_INSTALL_DONE ) { return "INSTALL_DONE"; } if ( x == SAHPI_FUMI_INSTALL_CANCELLED ) { return "INSTALL_CANCELLED"; } if ( x == SAHPI_FUMI_ROLLBACK_INITIATED ) { return "ROLLBACK_INITIATED"; } if ( x == SAHPI_FUMI_ROLLBACK_FAILED ) { return "ROLLBACK_FAILED"; } if ( x == SAHPI_FUMI_ROLLBACK_DONE ) { return "ROLLBACK_DONE"; } if ( x == SAHPI_FUMI_ROLLBACK_CANCELLED ) { return "ROLLBACK_CANCELLED"; } if ( x == SAHPI_FUMI_BACKUP_INITIATED ) { return "BACKUP_INITIATED"; } if ( x == SAHPI_FUMI_BACKUP_FAILED ) { return "BACKUP_FAILED"; } if ( x == SAHPI_FUMI_BACKUP_DONE ) { return "BACKUP_DONE"; } if ( x == SAHPI_FUMI_BACKUP_CANCELLED ) { return "BACKUP_CANCELLED"; } if ( x == SAHPI_FUMI_BANK_COPY_INITIATED ) { return "BANK_COPY_INITIATED"; } if ( x == SAHPI_FUMI_BANK_COPY_FAILED ) { return "BANK_COPY_FAILED"; } if ( x == SAHPI_FUMI_BANK_COPY_DONE ) { return "BANK_COPY_DONE"; } if ( x == SAHPI_FUMI_BANK_COPY_CANCELLED ) { return "BANK_COPY_CANCELLED"; } if ( x == SAHPI_FUMI_TARGET_VERIFY_INITIATED ) { return "TARGET_VERIFY_INITIATED"; } if ( x == SAHPI_FUMI_TARGET_VERIFY_FAILED ) { return "TARGET_VERIFY_FAILED"; } if ( x == SAHPI_FUMI_TARGET_VERIFY_DONE ) { return "TARGET_VERIFY_DONE"; } if ( x == SAHPI_FUMI_TARGET_VERIFY_CANCELLED ) { return "TARGET_VERIFY_CANCELLED"; } if ( x == SAHPI_FUMI_ACTIVATE_INITIATED ) { return "ACTIVATE_INITIATED"; } if ( x == SAHPI_FUMI_ACTIVATE_FAILED_ROLLBACK_NEEDED ) { return "ACTIVATE_FAILED_ROLLBACK_NEEDED"; } if ( x == SAHPI_FUMI_ACTIVATE_FAILED_ROLLBACK_INITIATED ) { return "ACTIVATE_FAILED_ROLLBACK_INITIATED"; } if ( x == SAHPI_FUMI_ACTIVATE_FAILED_ROLLBACK_NOT_POSSIBLE ) { return "ACTIVATE_FAILED_ROLLBACK_NOT_POSSIBLE"; } if ( x == SAHPI_FUMI_ACTIVATE_DONE ) { return "ACTIVATE_DONE"; } if ( x == SAHPI_FUMI_ACTIVATE_CANCELLED ) { return "ACTIVATE_CANCELLED"; } return Long.toString( x ); } public static long toSaHpiFumiUpgradeStatusT( String s ) throws IllegalArgumentException { if ( s.equals( "OPERATION_NOTSTARTED" ) ) { return SAHPI_FUMI_OPERATION_NOTSTARTED; } if ( s.equals( "SOURCE_VALIDATION_INITIATED" ) ) { return SAHPI_FUMI_SOURCE_VALIDATION_INITIATED; } if ( s.equals( "SOURCE_VALIDATION_FAILED" ) ) { return SAHPI_FUMI_SOURCE_VALIDATION_FAILED; } if ( s.equals( "SOURCE_VALIDATION_DONE" ) ) { return SAHPI_FUMI_SOURCE_VALIDATION_DONE; } if ( s.equals( "SOURCE_VALIDATION_CANCELLED" ) ) { return SAHPI_FUMI_SOURCE_VALIDATION_CANCELLED; } if ( s.equals( "INSTALL_INITIATED" ) ) { return SAHPI_FUMI_INSTALL_INITIATED; } if ( s.equals( "INSTALL_FAILED_ROLLBACK_NEEDED" ) ) { return SAHPI_FUMI_INSTALL_FAILED_ROLLBACK_NEEDED; } if ( s.equals( "INSTALL_FAILED_ROLLBACK_INITIATED" ) ) { return SAHPI_FUMI_INSTALL_FAILED_ROLLBACK_INITIATED; } if ( s.equals( "INSTALL_FAILED_ROLLBACK_NOT_POSSIBLE" ) ) { return SAHPI_FUMI_INSTALL_FAILED_ROLLBACK_NOT_POSSIBLE; } if ( s.equals( "INSTALL_DONE" ) ) { return SAHPI_FUMI_INSTALL_DONE; } if ( s.equals( "INSTALL_CANCELLED" ) ) { return SAHPI_FUMI_INSTALL_CANCELLED; } if ( s.equals( "ROLLBACK_INITIATED" ) ) { return SAHPI_FUMI_ROLLBACK_INITIATED; } if ( s.equals( "ROLLBACK_FAILED" ) ) { return SAHPI_FUMI_ROLLBACK_FAILED; } if ( s.equals( "ROLLBACK_DONE" ) ) { return SAHPI_FUMI_ROLLBACK_DONE; } if ( s.equals( "ROLLBACK_CANCELLED" ) ) { return SAHPI_FUMI_ROLLBACK_CANCELLED; } if ( s.equals( "BACKUP_INITIATED" ) ) { return SAHPI_FUMI_BACKUP_INITIATED; } if ( s.equals( "BACKUP_FAILED" ) ) { return SAHPI_FUMI_BACKUP_FAILED; } if ( s.equals( "BACKUP_DONE" ) ) { return SAHPI_FUMI_BACKUP_DONE; } if ( s.equals( "BACKUP_CANCELLED" ) ) { return SAHPI_FUMI_BACKUP_CANCELLED; } if ( s.equals( "BANK_COPY_INITIATED" ) ) { return SAHPI_FUMI_BANK_COPY_INITIATED; } if ( s.equals( "BANK_COPY_FAILED" ) ) { return SAHPI_FUMI_BANK_COPY_FAILED; } if ( s.equals( "BANK_COPY_DONE" ) ) { return SAHPI_FUMI_BANK_COPY_DONE; } if ( s.equals( "BANK_COPY_CANCELLED" ) ) { return SAHPI_FUMI_BANK_COPY_CANCELLED; } if ( s.equals( "TARGET_VERIFY_INITIATED" ) ) { return SAHPI_FUMI_TARGET_VERIFY_INITIATED; } if ( s.equals( "TARGET_VERIFY_FAILED" ) ) { return SAHPI_FUMI_TARGET_VERIFY_FAILED; } if ( s.equals( "TARGET_VERIFY_DONE" ) ) { return SAHPI_FUMI_TARGET_VERIFY_DONE; } if ( s.equals( "TARGET_VERIFY_CANCELLED" ) ) { return SAHPI_FUMI_TARGET_VERIFY_CANCELLED; } if ( s.equals( "ACTIVATE_INITIATED" ) ) { return SAHPI_FUMI_ACTIVATE_INITIATED; } if ( s.equals( "ACTIVATE_FAILED_ROLLBACK_NEEDED" ) ) { return SAHPI_FUMI_ACTIVATE_FAILED_ROLLBACK_NEEDED; } if ( s.equals( "ACTIVATE_FAILED_ROLLBACK_INITIATED" ) ) { return SAHPI_FUMI_ACTIVATE_FAILED_ROLLBACK_INITIATED; } if ( s.equals( "ACTIVATE_FAILED_ROLLBACK_NOT_POSSIBLE" ) ) { return SAHPI_FUMI_ACTIVATE_FAILED_ROLLBACK_NOT_POSSIBLE; } if ( s.equals( "ACTIVATE_DONE" ) ) { return SAHPI_FUMI_ACTIVATE_DONE; } if ( s.equals( "ACTIVATE_CANCELLED" ) ) { return SAHPI_FUMI_ACTIVATE_CANCELLED; } throw new IllegalArgumentException(); } /** * For SaHpiHsIndicatorStateT */ public static String fromSaHpiHsIndicatorStateT( long x ) { if ( x == SAHPI_HS_INDICATOR_OFF ) { return "FF"; } if ( x == SAHPI_HS_INDICATOR_ON ) { return "N"; } return Long.toString( x ); } public static long toSaHpiHsIndicatorStateT( String s ) throws IllegalArgumentException { if ( s.equals( "FF" ) ) { return SAHPI_HS_INDICATOR_OFF; } if ( s.equals( "N" ) ) { return SAHPI_HS_INDICATOR_ON; } throw new IllegalArgumentException(); } /** * For SaHpiHsActionT */ public static String fromSaHpiHsActionT( long x ) { if ( x == SAHPI_HS_ACTION_INSERTION ) { return "INSERTION"; } if ( x == SAHPI_HS_ACTION_EXTRACTION ) { return "EXTRACTION"; } return Long.toString( x ); } public static long toSaHpiHsActionT( String s ) throws IllegalArgumentException { if ( s.equals( "INSERTION" ) ) { return SAHPI_HS_ACTION_INSERTION; } if ( s.equals( "EXTRACTION" ) ) { return SAHPI_HS_ACTION_EXTRACTION; } throw new IllegalArgumentException(); } /** * For SaHpiHsStateT */ public static String fromSaHpiHsStateT( long x ) { if ( x == SAHPI_HS_STATE_INACTIVE ) { return "INACTIVE"; } if ( x == SAHPI_HS_STATE_INSERTION_PENDING ) { return "INSERTION_PENDING"; } if ( x == SAHPI_HS_STATE_ACTIVE ) { return "ACTIVE"; } if ( x == SAHPI_HS_STATE_EXTRACTION_PENDING ) { return "EXTRACTION_PENDING"; } if ( x == SAHPI_HS_STATE_NOT_PRESENT ) { return "NOT_PRESENT"; } return Long.toString( x ); } public static long toSaHpiHsStateT( String s ) throws IllegalArgumentException { if ( s.equals( "INACTIVE" ) ) { return SAHPI_HS_STATE_INACTIVE; } if ( s.equals( "INSERTION_PENDING" ) ) { return SAHPI_HS_STATE_INSERTION_PENDING; } if ( s.equals( "ACTIVE" ) ) { return SAHPI_HS_STATE_ACTIVE; } if ( s.equals( "EXTRACTION_PENDING" ) ) { return SAHPI_HS_STATE_EXTRACTION_PENDING; } if ( s.equals( "NOT_PRESENT" ) ) { return SAHPI_HS_STATE_NOT_PRESENT; } throw new IllegalArgumentException(); } /** * For SaHpiHsCauseOfStateChangeT */ public static String fromSaHpiHsCauseOfStateChangeT( long x ) { if ( x == SAHPI_HS_CAUSE_AUTO_POLICY ) { return "AUTO_POLICY"; } if ( x == SAHPI_HS_CAUSE_EXT_SOFTWARE ) { return "EXT_SOFTWARE"; } if ( x == SAHPI_HS_CAUSE_OPERATOR_INIT ) { return "OPERATOR_INIT"; } if ( x == SAHPI_HS_CAUSE_USER_UPDATE ) { return "USER_UPDATE"; } if ( x == SAHPI_HS_CAUSE_UNEXPECTED_DEACTIVATION ) { return "UNEXPECTED_DEACTIVATION"; } if ( x == SAHPI_HS_CAUSE_SURPRISE_EXTRACTION ) { return "SURPRISE_EXTRACTION"; } if ( x == SAHPI_HS_CAUSE_EXTRACTION_UPDATE ) { return "EXTRACTION_UPDATE"; } if ( x == SAHPI_HS_CAUSE_HARDWARE_FAULT ) { return "HARDWARE_FAULT"; } if ( x == SAHPI_HS_CAUSE_CONTAINING_FRU ) { return "CONTAINING_FRU"; } if ( x == SAHPI_HS_CAUSE_UNKNOWN ) { return "UNKNOWN"; } return Long.toString( x ); } public static long toSaHpiHsCauseOfStateChangeT( String s ) throws IllegalArgumentException { if ( s.equals( "AUTO_POLICY" ) ) { return SAHPI_HS_CAUSE_AUTO_POLICY; } if ( s.equals( "EXT_SOFTWARE" ) ) { return SAHPI_HS_CAUSE_EXT_SOFTWARE; } if ( s.equals( "OPERATOR_INIT" ) ) { return SAHPI_HS_CAUSE_OPERATOR_INIT; } if ( s.equals( "USER_UPDATE" ) ) { return SAHPI_HS_CAUSE_USER_UPDATE; } if ( s.equals( "UNEXPECTED_DEACTIVATION" ) ) { return SAHPI_HS_CAUSE_UNEXPECTED_DEACTIVATION; } if ( s.equals( "SURPRISE_EXTRACTION" ) ) { return SAHPI_HS_CAUSE_SURPRISE_EXTRACTION; } if ( s.equals( "EXTRACTION_UPDATE" ) ) { return SAHPI_HS_CAUSE_EXTRACTION_UPDATE; } if ( s.equals( "HARDWARE_FAULT" ) ) { return SAHPI_HS_CAUSE_HARDWARE_FAULT; } if ( s.equals( "CONTAINING_FRU" ) ) { return SAHPI_HS_CAUSE_CONTAINING_FRU; } if ( s.equals( "UNKNOWN" ) ) { return SAHPI_HS_CAUSE_UNKNOWN; } throw new IllegalArgumentException(); } /** * For SaHpiSeverityT */ public static String fromSaHpiSeverityT( long x ) { if ( x == SAHPI_CRITICAL ) { return "CRITICAL"; } if ( x == SAHPI_MAJOR ) { return "MAJOR"; } if ( x == SAHPI_MINOR ) { return "MINOR"; } if ( x == SAHPI_INFORMATIONAL ) { return "INFORMATIONAL"; } if ( x == SAHPI_OK ) { return "OK"; } if ( x == SAHPI_DEBUG ) { return "DEBUG"; } if ( x == SAHPI_ALL_SEVERITIES ) { return "ALL_SEVERITIES"; } return Long.toString( x ); } public static long toSaHpiSeverityT( String s ) throws IllegalArgumentException { if ( s.equals( "CRITICAL" ) ) { return SAHPI_CRITICAL; } if ( s.equals( "MAJOR" ) ) { return SAHPI_MAJOR; } if ( s.equals( "MINOR" ) ) { return SAHPI_MINOR; } if ( s.equals( "INFORMATIONAL" ) ) { return SAHPI_INFORMATIONAL; } if ( s.equals( "OK" ) ) { return SAHPI_OK; } if ( s.equals( "DEBUG" ) ) { return SAHPI_DEBUG; } if ( s.equals( "ALL_SEVERITIES" ) ) { return SAHPI_ALL_SEVERITIES; } throw new IllegalArgumentException(); } /** * For SaHpiResourceEventTypeT */ public static String fromSaHpiResourceEventTypeT( long x ) { if ( x == SAHPI_RESE_RESOURCE_FAILURE ) { return "FAILURE"; } if ( x == SAHPI_RESE_RESOURCE_RESTORED ) { return "RESTORED"; } if ( x == SAHPI_RESE_RESOURCE_ADDED ) { return "ADDED"; } if ( x == SAHPI_RESE_RESOURCE_REMOVED ) { return "REMOVED"; } if ( x == SAHPI_RESE_RESOURCE_INACCESSIBLE ) { return "INACCESSIBLE"; } if ( x == SAHPI_RESE_RESOURCE_UPDATED ) { return "UPDATED"; } return Long.toString( x ); } public static long toSaHpiResourceEventTypeT( String s ) throws IllegalArgumentException { if ( s.equals( "FAILURE" ) ) { return SAHPI_RESE_RESOURCE_FAILURE; } if ( s.equals( "RESTORED" ) ) { return SAHPI_RESE_RESOURCE_RESTORED; } if ( s.equals( "ADDED" ) ) { return SAHPI_RESE_RESOURCE_ADDED; } if ( s.equals( "REMOVED" ) ) { return SAHPI_RESE_RESOURCE_REMOVED; } if ( s.equals( "INACCESSIBLE" ) ) { return SAHPI_RESE_RESOURCE_INACCESSIBLE; } if ( s.equals( "UPDATED" ) ) { return SAHPI_RESE_RESOURCE_UPDATED; } throw new IllegalArgumentException(); } /** * For SaHpiDomainEventTypeT */ public static String fromSaHpiDomainEventTypeT( long x ) { if ( x == SAHPI_DOMAIN_REF_ADDED ) { return "ADDED"; } if ( x == SAHPI_DOMAIN_REF_REMOVED ) { return "REMOVED"; } return Long.toString( x ); } public static long toSaHpiDomainEventTypeT( String s ) throws IllegalArgumentException { if ( s.equals( "ADDED" ) ) { return SAHPI_DOMAIN_REF_ADDED; } if ( s.equals( "REMOVED" ) ) { return SAHPI_DOMAIN_REF_REMOVED; } throw new IllegalArgumentException(); } /** * For SaHpiSwEventTypeT */ public static String fromSaHpiSwEventTypeT( long x ) { if ( x == SAHPI_HPIE_AUDIT ) { return "AUDIT"; } if ( x == SAHPI_HPIE_STARTUP ) { return "STARTUP"; } if ( x == SAHPI_HPIE_OTHER ) { return "OTHER"; } return Long.toString( x ); } public static long toSaHpiSwEventTypeT( String s ) throws IllegalArgumentException { if ( s.equals( "AUDIT" ) ) { return SAHPI_HPIE_AUDIT; } if ( s.equals( "STARTUP" ) ) { return SAHPI_HPIE_STARTUP; } if ( s.equals( "OTHER" ) ) { return SAHPI_HPIE_OTHER; } throw new IllegalArgumentException(); } /** * For SaHpiEventTypeT */ public static String fromSaHpiEventTypeT( long x ) { if ( x == SAHPI_ET_RESOURCE ) { return "RESOURCE"; } if ( x == SAHPI_ET_DOMAIN ) { return "DOMAIN"; } if ( x == SAHPI_ET_SENSOR ) { return "SENSOR"; } if ( x == SAHPI_ET_SENSOR_ENABLE_CHANGE ) { return "SENSOR_ENABLE_CHANGE"; } if ( x == SAHPI_ET_HOTSWAP ) { return "HOTSWAP"; } if ( x == SAHPI_ET_WATCHDOG ) { return "WATCHDOG"; } if ( x == SAHPI_ET_HPI_SW ) { return "HPI_SW"; } if ( x == SAHPI_ET_OEM ) { return "OEM"; } if ( x == SAHPI_ET_USER ) { return "USER"; } if ( x == SAHPI_ET_DIMI ) { return "DIMI"; } if ( x == SAHPI_ET_DIMI_UPDATE ) { return "DIMI_UPDATE"; } if ( x == SAHPI_ET_FUMI ) { return "FUMI"; } return Long.toString( x ); } public static long toSaHpiEventTypeT( String s ) throws IllegalArgumentException { if ( s.equals( "RESOURCE" ) ) { return SAHPI_ET_RESOURCE; } if ( s.equals( "DOMAIN" ) ) { return SAHPI_ET_DOMAIN; } if ( s.equals( "SENSOR" ) ) { return SAHPI_ET_SENSOR; } if ( s.equals( "SENSOR_ENABLE_CHANGE" ) ) { return SAHPI_ET_SENSOR_ENABLE_CHANGE; } if ( s.equals( "HOTSWAP" ) ) { return SAHPI_ET_HOTSWAP; } if ( s.equals( "WATCHDOG" ) ) { return SAHPI_ET_WATCHDOG; } if ( s.equals( "HPI_SW" ) ) { return SAHPI_ET_HPI_SW; } if ( s.equals( "OEM" ) ) { return SAHPI_ET_OEM; } if ( s.equals( "USER" ) ) { return SAHPI_ET_USER; } if ( s.equals( "DIMI" ) ) { return SAHPI_ET_DIMI; } if ( s.equals( "DIMI_UPDATE" ) ) { return SAHPI_ET_DIMI_UPDATE; } if ( s.equals( "FUMI" ) ) { return SAHPI_ET_FUMI; } throw new IllegalArgumentException(); } /** * For SaHpiStatusCondTypeT */ public static String fromSaHpiStatusCondTypeT( long x ) { if ( x == SAHPI_STATUS_COND_TYPE_SENSOR ) { return "SENSOR"; } if ( x == SAHPI_STATUS_COND_TYPE_RESOURCE ) { return "RESOURCE"; } if ( x == SAHPI_STATUS_COND_TYPE_OEM ) { return "OEM"; } if ( x == SAHPI_STATUS_COND_TYPE_USER ) { return "USER"; } return Long.toString( x ); } public static long toSaHpiStatusCondTypeT( String s ) throws IllegalArgumentException { if ( s.equals( "SENSOR" ) ) { return SAHPI_STATUS_COND_TYPE_SENSOR; } if ( s.equals( "RESOURCE" ) ) { return SAHPI_STATUS_COND_TYPE_RESOURCE; } if ( s.equals( "OEM" ) ) { return SAHPI_STATUS_COND_TYPE_OEM; } if ( s.equals( "USER" ) ) { return SAHPI_STATUS_COND_TYPE_USER; } throw new IllegalArgumentException(); } /** * For SaHpiAnnunciatorModeT */ public static String fromSaHpiAnnunciatorModeT( long x ) { if ( x == SAHPI_ANNUNCIATOR_MODE_AUTO ) { return "AUTO"; } if ( x == SAHPI_ANNUNCIATOR_MODE_USER ) { return "USER"; } if ( x == SAHPI_ANNUNCIATOR_MODE_SHARED ) { return "SHARED"; } return Long.toString( x ); } public static long toSaHpiAnnunciatorModeT( String s ) throws IllegalArgumentException { if ( s.equals( "AUTO" ) ) { return SAHPI_ANNUNCIATOR_MODE_AUTO; } if ( s.equals( "USER" ) ) { return SAHPI_ANNUNCIATOR_MODE_USER; } if ( s.equals( "SHARED" ) ) { return SAHPI_ANNUNCIATOR_MODE_SHARED; } throw new IllegalArgumentException(); } /** * For SaHpiAnnunciatorTypeT */ public static String fromSaHpiAnnunciatorTypeT( long x ) { if ( x == SAHPI_ANNUNCIATOR_TYPE_LED ) { return "LED"; } if ( x == SAHPI_ANNUNCIATOR_TYPE_DRY_CONTACT_CLOSURE ) { return "DRY_CONTACT_CLOSURE"; } if ( x == SAHPI_ANNUNCIATOR_TYPE_AUDIBLE ) { return "AUDIBLE"; } if ( x == SAHPI_ANNUNCIATOR_TYPE_LCD_DISPLAY ) { return "LCD_DISPLAY"; } if ( x == SAHPI_ANNUNCIATOR_TYPE_MESSAGE ) { return "MESSAGE"; } if ( x == SAHPI_ANNUNCIATOR_TYPE_COMPOSITE ) { return "COMPOSITE"; } if ( x == SAHPI_ANNUNCIATOR_TYPE_OEM ) { return "OEM"; } return Long.toString( x ); } public static long toSaHpiAnnunciatorTypeT( String s ) throws IllegalArgumentException { if ( s.equals( "LED" ) ) { return SAHPI_ANNUNCIATOR_TYPE_LED; } if ( s.equals( "DRY_CONTACT_CLOSURE" ) ) { return SAHPI_ANNUNCIATOR_TYPE_DRY_CONTACT_CLOSURE; } if ( s.equals( "AUDIBLE" ) ) { return SAHPI_ANNUNCIATOR_TYPE_AUDIBLE; } if ( s.equals( "LCD_DISPLAY" ) ) { return SAHPI_ANNUNCIATOR_TYPE_LCD_DISPLAY; } if ( s.equals( "MESSAGE" ) ) { return SAHPI_ANNUNCIATOR_TYPE_MESSAGE; } if ( s.equals( "COMPOSITE" ) ) { return SAHPI_ANNUNCIATOR_TYPE_COMPOSITE; } if ( s.equals( "OEM" ) ) { return SAHPI_ANNUNCIATOR_TYPE_OEM; } throw new IllegalArgumentException(); } /** * For SaHpiRdrTypeT */ public static String fromSaHpiRdrTypeT( long x ) { if ( x == SAHPI_NO_RECORD ) { return "NO_RECORD"; } if ( x == SAHPI_CTRL_RDR ) { return "CTRL_RDR"; } if ( x == SAHPI_SENSOR_RDR ) { return "SENSOR_RDR"; } if ( x == SAHPI_INVENTORY_RDR ) { return "INVENTORY_RDR"; } if ( x == SAHPI_WATCHDOG_RDR ) { return "WATCHDOG_RDR"; } if ( x == SAHPI_ANNUNCIATOR_RDR ) { return "ANNUNCIATOR_RDR"; } if ( x == SAHPI_DIMI_RDR ) { return "DIMI_RDR"; } if ( x == SAHPI_FUMI_RDR ) { return "FUMI_RDR"; } return Long.toString( x ); } public static long toSaHpiRdrTypeT( String s ) throws IllegalArgumentException { if ( s.equals( "NO_RECORD" ) ) { return SAHPI_NO_RECORD; } if ( s.equals( "CTRL_RDR" ) ) { return SAHPI_CTRL_RDR; } if ( s.equals( "SENSOR_RDR" ) ) { return SAHPI_SENSOR_RDR; } if ( s.equals( "INVENTORY_RDR" ) ) { return SAHPI_INVENTORY_RDR; } if ( s.equals( "WATCHDOG_RDR" ) ) { return SAHPI_WATCHDOG_RDR; } if ( s.equals( "ANNUNCIATOR_RDR" ) ) { return SAHPI_ANNUNCIATOR_RDR; } if ( s.equals( "DIMI_RDR" ) ) { return SAHPI_DIMI_RDR; } if ( s.equals( "FUMI_RDR" ) ) { return SAHPI_FUMI_RDR; } throw new IllegalArgumentException(); } /** * For SaHpiParmActionT */ public static String fromSaHpiParmActionT( long x ) { if ( x == SAHPI_DEFAULT_PARM ) { return "DEFAULT_PARM"; } if ( x == SAHPI_SAVE_PARM ) { return "SAVE_PARM"; } if ( x == SAHPI_RESTORE_PARM ) { return "RESTORE_PARM"; } return Long.toString( x ); } public static long toSaHpiParmActionT( String s ) throws IllegalArgumentException { if ( s.equals( "DEFAULT_PARM" ) ) { return SAHPI_DEFAULT_PARM; } if ( s.equals( "SAVE_PARM" ) ) { return SAHPI_SAVE_PARM; } if ( s.equals( "RESTORE_PARM" ) ) { return SAHPI_RESTORE_PARM; } throw new IllegalArgumentException(); } /** * For SaHpiResetActionT */ public static String fromSaHpiResetActionT( long x ) { if ( x == SAHPI_COLD_RESET ) { return "COLD_RESET"; } if ( x == SAHPI_WARM_RESET ) { return "WARM_RESET"; } if ( x == SAHPI_RESET_ASSERT ) { return "RESET_ASSERT"; } if ( x == SAHPI_RESET_DEASSERT ) { return "RESET_DEASSERT"; } return Long.toString( x ); } public static long toSaHpiResetActionT( String s ) throws IllegalArgumentException { if ( s.equals( "COLD_RESET" ) ) { return SAHPI_COLD_RESET; } if ( s.equals( "WARM_RESET" ) ) { return SAHPI_WARM_RESET; } if ( s.equals( "RESET_ASSERT" ) ) { return SAHPI_RESET_ASSERT; } if ( s.equals( "RESET_DEASSERT" ) ) { return SAHPI_RESET_DEASSERT; } throw new IllegalArgumentException(); } /** * For SaHpiPowerStateT */ public static String fromSaHpiPowerStateT( long x ) { if ( x == SAHPI_POWER_OFF ) { return "OFF"; } if ( x == SAHPI_POWER_ON ) { return "ON"; } if ( x == SAHPI_POWER_CYCLE ) { return "CYCLE"; } return Long.toString( x ); } public static long toSaHpiPowerStateT( String s ) throws IllegalArgumentException { if ( s.equals( "OFF" ) ) { return SAHPI_POWER_OFF; } if ( s.equals( "ON" ) ) { return SAHPI_POWER_ON; } if ( s.equals( "CYCLE" ) ) { return SAHPI_POWER_CYCLE; } throw new IllegalArgumentException(); } /** * For SaHpiEventLogOverflowActionT */ public static String fromSaHpiEventLogOverflowActionT( long x ) { if ( x == SAHPI_EL_OVERFLOW_DROP ) { return "DROP"; } if ( x == SAHPI_EL_OVERFLOW_OVERWRITE ) { return "OVERWRITE"; } return Long.toString( x ); } public static long toSaHpiEventLogOverflowActionT( String s ) throws IllegalArgumentException { if ( s.equals( "DROP" ) ) { return SAHPI_EL_OVERFLOW_DROP; } if ( s.equals( "OVERWRITE" ) ) { return SAHPI_EL_OVERFLOW_OVERWRITE; } throw new IllegalArgumentException(); } /** * For AtcaHpiLedColorT */ public static String fromAtcaHpiLedColorT( long x ) { if ( x == ATCAHPI_LED_COLOR_RESERVED ) { return "RESERVED"; } if ( x == ATCAHPI_LED_COLOR_BLUE ) { return "BLUE"; } if ( x == ATCAHPI_LED_COLOR_RED ) { return "RED"; } if ( x == ATCAHPI_LED_COLOR_GREEN ) { return "GREEN"; } if ( x == ATCAHPI_LED_COLOR_AMBER ) { return "AMBER"; } if ( x == ATCAHPI_LED_COLOR_ORANGE ) { return "ORANGE"; } if ( x == ATCAHPI_LED_COLOR_WHITE ) { return "WHITE"; } if ( x == ATCAHPI_LED_COLOR_NO_CHANGE ) { return "NO_CHANGE"; } if ( x == ATCAHPI_LED_COLOR_USE_DEFAULT ) { return "USE_DEFAULT"; } return Long.toString( x ); } public static long toAtcaHpiLedColorT( String s ) throws IllegalArgumentException { if ( s.equals( "RESERVED" ) ) { return ATCAHPI_LED_COLOR_RESERVED; } if ( s.equals( "BLUE" ) ) { return ATCAHPI_LED_COLOR_BLUE; } if ( s.equals( "RED" ) ) { return ATCAHPI_LED_COLOR_RED; } if ( s.equals( "GREEN" ) ) { return ATCAHPI_LED_COLOR_GREEN; } if ( s.equals( "AMBER" ) ) { return ATCAHPI_LED_COLOR_AMBER; } if ( s.equals( "ORANGE" ) ) { return ATCAHPI_LED_COLOR_ORANGE; } if ( s.equals( "WHITE" ) ) { return ATCAHPI_LED_COLOR_WHITE; } if ( s.equals( "NO_CHANGE" ) ) { return ATCAHPI_LED_COLOR_NO_CHANGE; } if ( s.equals( "USE_DEFAULT" ) ) { return ATCAHPI_LED_COLOR_USE_DEFAULT; } throw new IllegalArgumentException(); } /** * For AtcaHpiResourceLedModeT */ public static String fromAtcaHpiResourceLedModeT( long x ) { if ( x == ATCAHPI_LED_AUTO ) { return "AUTO"; } if ( x == ATCAHPI_LED_MANUAL ) { return "MANUAL"; } if ( x == ATCAHPI_LED_LAMP_TEST ) { return "LAMP_TEST"; } return Long.toString( x ); } public static long toAtcaHpiResourceLedModeT( String s ) throws IllegalArgumentException { if ( s.equals( "AUTO" ) ) { return ATCAHPI_LED_AUTO; } if ( s.equals( "MANUAL" ) ) { return ATCAHPI_LED_MANUAL; } if ( s.equals( "LAMP_TEST" ) ) { return ATCAHPI_LED_LAMP_TEST; } throw new IllegalArgumentException(); } /** * For AtcaHpiLedBrSupportT */ public static String fromAtcaHpiLedBrSupportT( long x ) { if ( x == ATCAHPI_LED_BR_SUPPORTED ) { return "SUPPORTED"; } if ( x == ATCAHPI_LED_BR_NOT_SUPPORTED ) { return "NOT_SUPPORTED"; } if ( x == ATCAHPI_LED_BR_UNKNOWN ) { return "UNKNOWN"; } return Long.toString( x ); } public static long toAtcaHpiLedBrSupportT( String s ) throws IllegalArgumentException { if ( s.equals( "SUPPORTED" ) ) { return ATCAHPI_LED_BR_SUPPORTED; } if ( s.equals( "NOT_SUPPORTED" ) ) { return ATCAHPI_LED_BR_NOT_SUPPORTED; } if ( s.equals( "UNKNOWN" ) ) { return ATCAHPI_LED_BR_UNKNOWN; } throw new IllegalArgumentException(); } /** * For XtcaHpiLedColorT */ public static String fromXtcaHpiLedColorT( long x ) { if ( x == XTCAHPI_LED_COLOR_RESERVED ) { return "RESERVED"; } if ( x == XTCAHPI_LED_COLOR_BLUE ) { return "BLUE"; } if ( x == XTCAHPI_LED_COLOR_RED ) { return "RED"; } if ( x == XTCAHPI_LED_COLOR_GREEN ) { return "GREEN"; } if ( x == XTCAHPI_LED_COLOR_AMBER ) { return "AMBER"; } if ( x == XTCAHPI_LED_COLOR_ORANGE ) { return "ORANGE"; } if ( x == XTCAHPI_LED_COLOR_WHITE ) { return "WHITE"; } if ( x == XTCAHPI_LED_COLOR_NO_CHANGE ) { return "NO_CHANGE"; } if ( x == XTCAHPI_LED_COLOR_USE_DEFAULT ) { return "USE_DEFAULT"; } return Long.toString( x ); } public static long toXtcaHpiLedColorT( String s ) throws IllegalArgumentException { if ( s.equals( "RESERVED" ) ) { return XTCAHPI_LED_COLOR_RESERVED; } if ( s.equals( "BLUE" ) ) { return XTCAHPI_LED_COLOR_BLUE; } if ( s.equals( "RED" ) ) { return XTCAHPI_LED_COLOR_RED; } if ( s.equals( "GREEN" ) ) { return XTCAHPI_LED_COLOR_GREEN; } if ( s.equals( "AMBER" ) ) { return XTCAHPI_LED_COLOR_AMBER; } if ( s.equals( "ORANGE" ) ) { return XTCAHPI_LED_COLOR_ORANGE; } if ( s.equals( "WHITE" ) ) { return XTCAHPI_LED_COLOR_WHITE; } if ( s.equals( "NO_CHANGE" ) ) { return XTCAHPI_LED_COLOR_NO_CHANGE; } if ( s.equals( "USE_DEFAULT" ) ) { return XTCAHPI_LED_COLOR_USE_DEFAULT; } throw new IllegalArgumentException(); } /** * For XtcaHpiResourceLedModeT */ public static String fromXtcaHpiResourceLedModeT( long x ) { if ( x == XTCAHPI_LED_AUTO ) { return "AUTO"; } if ( x == XTCAHPI_LED_MANUAL ) { return "MANUAL"; } if ( x == XTCAHPI_LED_LAMP_TEST ) { return "LAMP_TEST"; } return Long.toString( x ); } public static long toXtcaHpiResourceLedModeT( String s ) throws IllegalArgumentException { if ( s.equals( "AUTO" ) ) { return XTCAHPI_LED_AUTO; } if ( s.equals( "MANUAL" ) ) { return XTCAHPI_LED_MANUAL; } if ( s.equals( "LAMP_TEST" ) ) { return XTCAHPI_LED_LAMP_TEST; } throw new IllegalArgumentException(); } /** * For XtcaHpiLedBrSupportT */ public static String fromXtcaHpiLedBrSupportT( long x ) { if ( x == XTCAHPI_LED_BR_SUPPORTED ) { return "SUPPORTED"; } if ( x == XTCAHPI_LED_BR_NOT_SUPPORTED ) { return "NOT_SUPPORTED"; } if ( x == XTCAHPI_LED_BR_UNKNOWN ) { return "UNKNOWN"; } return Long.toString( x ); } public static long toXtcaHpiLedBrSupportT( String s ) throws IllegalArgumentException { if ( s.equals( "SUPPORTED" ) ) { return XTCAHPI_LED_BR_SUPPORTED; } if ( s.equals( "NOT_SUPPORTED" ) ) { return XTCAHPI_LED_BR_NOT_SUPPORTED; } if ( s.equals( "UNKNOWN" ) ) { return XTCAHPI_LED_BR_UNKNOWN; } throw new IllegalArgumentException(); } /** * For SaErrorT */ public static String fromSaErrorT( long x ) { if ( x == SA_ERR_HPI_OK ) { return "OK"; } if ( x == SA_ERR_HPI_ERROR ) { return "ERROR"; } if ( x == SA_ERR_HPI_UNSUPPORTED_API ) { return "UNSUPPORTED_API"; } if ( x == SA_ERR_HPI_BUSY ) { return "BUSY"; } if ( x == SA_ERR_HPI_INTERNAL_ERROR ) { return "INTERNAL_ERROR"; } if ( x == SA_ERR_HPI_INVALID_CMD ) { return "INVALID_CMD"; } if ( x == SA_ERR_HPI_TIMEOUT ) { return "TIMEOUT"; } if ( x == SA_ERR_HPI_OUT_OF_SPACE ) { return "OUT_OF_SPACE"; } if ( x == SA_ERR_HPI_OUT_OF_MEMORY ) { return "OUT_OF_MEMORY"; } if ( x == SA_ERR_HPI_INVALID_PARAMS ) { return "INVALID_PARAMS"; } if ( x == SA_ERR_HPI_INVALID_DATA ) { return "INVALID_DATA"; } if ( x == SA_ERR_HPI_NOT_PRESENT ) { return "NOT_PRESENT"; } if ( x == SA_ERR_HPI_NO_RESPONSE ) { return "NO_RESPONSE"; } if ( x == SA_ERR_HPI_DUPLICATE ) { return "DUPLICATE"; } if ( x == SA_ERR_HPI_INVALID_SESSION ) { return "INVALID_SESSION"; } if ( x == SA_ERR_HPI_INVALID_DOMAIN ) { return "INVALID_DOMAIN"; } if ( x == SA_ERR_HPI_INVALID_RESOURCE ) { return "INVALID_RESOURCE"; } if ( x == SA_ERR_HPI_INVALID_REQUEST ) { return "INVALID_REQUEST"; } if ( x == SA_ERR_HPI_ENTITY_NOT_PRESENT ) { return "ENTITY_NOT_PRESENT"; } if ( x == SA_ERR_HPI_READ_ONLY ) { return "READ_ONLY"; } if ( x == SA_ERR_HPI_CAPABILITY ) { return "CAPABILITY"; } if ( x == SA_ERR_HPI_UNKNOWN ) { return "UNKNOWN"; } if ( x == SA_ERR_HPI_INVALID_STATE ) { return "INVALID_STATE"; } if ( x == SA_ERR_HPI_UNSUPPORTED_PARAMS ) { return "UNSUPPORTED_PARAMS"; } return Long.toString( x ); } public static long toSaErrorT( String s ) throws IllegalArgumentException { if ( s.equals( "OK" ) ) { return SA_ERR_HPI_OK; } if ( s.equals( "ERROR" ) ) { return SA_ERR_HPI_ERROR; } if ( s.equals( "UNSUPPORTED_API" ) ) { return SA_ERR_HPI_UNSUPPORTED_API; } if ( s.equals( "BUSY" ) ) { return SA_ERR_HPI_BUSY; } if ( s.equals( "INTERNAL_ERROR" ) ) { return SA_ERR_HPI_INTERNAL_ERROR; } if ( s.equals( "INVALID_CMD" ) ) { return SA_ERR_HPI_INVALID_CMD; } if ( s.equals( "TIMEOUT" ) ) { return SA_ERR_HPI_TIMEOUT; } if ( s.equals( "OUT_OF_SPACE" ) ) { return SA_ERR_HPI_OUT_OF_SPACE; } if ( s.equals( "OUT_OF_MEMORY" ) ) { return SA_ERR_HPI_OUT_OF_MEMORY; } if ( s.equals( "INVALID_PARAMS" ) ) { return SA_ERR_HPI_INVALID_PARAMS; } if ( s.equals( "INVALID_DATA" ) ) { return SA_ERR_HPI_INVALID_DATA; } if ( s.equals( "NOT_PRESENT" ) ) { return SA_ERR_HPI_NOT_PRESENT; } if ( s.equals( "NO_RESPONSE" ) ) { return SA_ERR_HPI_NO_RESPONSE; } if ( s.equals( "DUPLICATE" ) ) { return SA_ERR_HPI_DUPLICATE; } if ( s.equals( "INVALID_SESSION" ) ) { return SA_ERR_HPI_INVALID_SESSION; } if ( s.equals( "INVALID_DOMAIN" ) ) { return SA_ERR_HPI_INVALID_DOMAIN; } if ( s.equals( "INVALID_RESOURCE" ) ) { return SA_ERR_HPI_INVALID_RESOURCE; } if ( s.equals( "INVALID_REQUEST" ) ) { return SA_ERR_HPI_INVALID_REQUEST; } if ( s.equals( "ENTITY_NOT_PRESENT" ) ) { return SA_ERR_HPI_ENTITY_NOT_PRESENT; } if ( s.equals( "READ_ONLY" ) ) { return SA_ERR_HPI_READ_ONLY; } if ( s.equals( "CAPABILITY" ) ) { return SA_ERR_HPI_CAPABILITY; } if ( s.equals( "UNKNOWN" ) ) { return SA_ERR_HPI_UNKNOWN; } if ( s.equals( "INVALID_STATE" ) ) { return SA_ERR_HPI_INVALID_STATE; } if ( s.equals( "UNSUPPORTED_PARAMS" ) ) { return SA_ERR_HPI_UNSUPPORTED_PARAMS; } throw new IllegalArgumentException(); } /** * For SaHpiEventCategoryT */ public static String fromSaHpiEventCategoryT( long x ) { if ( x == SAHPI_EC_UNSPECIFIED ) { return "UNSPECIFIED"; } if ( x == SAHPI_EC_THRESHOLD ) { return "THRESHOLD"; } if ( x == SAHPI_EC_USAGE ) { return "USAGE"; } if ( x == SAHPI_EC_STATE ) { return "STATE"; } if ( x == SAHPI_EC_PRED_FAIL ) { return "PRED_FAIL"; } if ( x == SAHPI_EC_LIMIT ) { return "LIMIT"; } if ( x == SAHPI_EC_PERFORMANCE ) { return "PERFORMANCE"; } if ( x == SAHPI_EC_SEVERITY ) { return "SEVERITY"; } if ( x == SAHPI_EC_PRESENCE ) { return "PRESENCE"; } if ( x == SAHPI_EC_ENABLE ) { return "ENABLE"; } if ( x == SAHPI_EC_AVAILABILITY ) { return "AVAILABILITY"; } if ( x == SAHPI_EC_REDUNDANCY ) { return "REDUNDANCY"; } if ( x == SAHPI_EC_SENSOR_SPECIFIC ) { return "SENSOR_SPECIFIC"; } if ( x == SAHPI_EC_GENERIC ) { return "GENERIC"; } return Long.toString( x ); } public static long toSaHpiEventCategoryT( String s ) throws IllegalArgumentException { if ( s.equals( "UNSPECIFIED" ) ) { return SAHPI_EC_UNSPECIFIED; } if ( s.equals( "THRESHOLD" ) ) { return SAHPI_EC_THRESHOLD; } if ( s.equals( "USAGE" ) ) { return SAHPI_EC_USAGE; } if ( s.equals( "STATE" ) ) { return SAHPI_EC_STATE; } if ( s.equals( "PRED_FAIL" ) ) { return SAHPI_EC_PRED_FAIL; } if ( s.equals( "LIMIT" ) ) { return SAHPI_EC_LIMIT; } if ( s.equals( "PERFORMANCE" ) ) { return SAHPI_EC_PERFORMANCE; } if ( s.equals( "SEVERITY" ) ) { return SAHPI_EC_SEVERITY; } if ( s.equals( "PRESENCE" ) ) { return SAHPI_EC_PRESENCE; } if ( s.equals( "ENABLE" ) ) { return SAHPI_EC_ENABLE; } if ( s.equals( "AVAILABILITY" ) ) { return SAHPI_EC_AVAILABILITY; } if ( s.equals( "REDUNDANCY" ) ) { return SAHPI_EC_REDUNDANCY; } if ( s.equals( "SENSOR_SPECIFIC" ) ) { return SAHPI_EC_SENSOR_SPECIFIC; } if ( s.equals( "GENERIC" ) ) { return SAHPI_EC_GENERIC; } throw new IllegalArgumentException(); } }; openhpi-3.6.1/baselibs/java/openhpi_baselib/HpiException.java0000644000175100017510000000120012575647300023247 0ustar mohanmohan/* -*- java -*- * * Copyright (C) 2012, Pigeon Point Systems * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ package org.openhpi; public class HpiException extends Exception { public HpiException( String message ) { super( message ); } }; openhpi-3.6.1/baselibs/java/openhpi_baselib/Hpi.java0000644000175100017510000001235412575647300021404 0ustar mohanmohan/* -*- java -*- * * Copyright (C) 2012, Pigeon Point Systems * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ package org.openhpi; import static org.openhpi.HpiDataTypes.*; import static org.openhpi.OhpiDataTypes.*; /********************************************************** * HPI API * Specific functions that were hard to auto-generate. * So they were written manually. *********************************************************/ public class Hpi extends HpiGen { // Just to ensure nobody creates it protected Hpi() { // empty } public static long saHpiSessionOpen( long DomainId, Object SecurityParams, saHpiSessionOpenOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; if ( SecurityParams != null ) { return SA_ERR_HPI_INVALID_PARAMS; } HpiSession s = HpiCore.createSession( DomainId ); if ( s == null ) { return SA_ERR_HPI_INVALID_DOMAIN; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { HpiCore.removeSession( s ); return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiDomainIdT( s.getRemoteDid() ); rc = m.interchange( RPC_SAHPI_SESSION_OPEN ); if ( !rc ) { m.close(); HpiCore.removeSession( s ); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.SessionId = m.demarshalSaHpiSessionIdT(); s.setRemoteSid( out.SessionId ); out.SessionId = s.getLocalSid(); } s.putMarshal( m ); if ( rv != SA_OK ) { HpiCore.removeSession( s ); } return rv; } public static long saHpiSessionClose( long SessionId ) throws HpiException { long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); rc = m.interchange( RPC_SAHPI_SESSION_CLOSE ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); if ( rv == SA_OK ) { HpiCore.removeSession( s ); } return rv; } public static long saHpiMyEntityPathGet( long SessionId, saHpiMyEntityPathGetOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } out.EntityPath = HpiCore.getMyEntity(); if ( out.EntityPath == null ) { return SA_ERR_HPI_UNKNOWN; } return SA_OK; } public static long saHpiDimiTestStart( long SessionId, long ResourceId, long DimiNum, long TestNum, long NumberOfParams, SaHpiDimiTestVariableParamsT[] ParamsList ) throws HpiException { long rv; boolean rc; if ( NumberOfParams != 0 ) { if ( ParamsList == null ) { return SA_ERR_HPI_INVALID_PARAMS; } if ( NumberOfParams > ParamsList.length ) { return SA_ERR_HPI_INVALID_PARAMS; } for ( int i = 0; i < NumberOfParams; ++i ) { rc = HpiUtil.check( ParamsList[i] ); if ( !rc ) { return SA_ERR_HPI_INVALID_PARAMS; } } } HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiDimiNumT( DimiNum ); m.marshalSaHpiDimiTestNumT( TestNum ); m.marshalSaHpiUint8T( NumberOfParams ); for ( int i = 0; i < NumberOfParams; ++i ) { m.marshalSaHpiDimiTestVariableParamsT( ParamsList[i] ); } rc = m.interchange( RPC_SAHPI_DIMI_TEST_START ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); return rv; } }; openhpi-3.6.1/baselibs/java/openhpi_baselib/HpiSession.java0000644000175100017510000000424612575647300022751 0ustar mohanmohan/* -*- java -*- * * Copyright (C) 2012, Pigeon Point Systems * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ package org.openhpi; import java.util.Collection; import java.util.concurrent.atomic.AtomicLong; import java.util.LinkedList; class HpiSession { private static AtomicLong next_local_sid = new AtomicLong( 1L ); private long local_sid; private long remote_sid; private HpiDomain domain; private LinkedList marshals; public HpiSession( HpiDomain domain ) { this.local_sid = next_local_sid.getAndIncrement(); this.remote_sid = 0; this.domain = new HpiDomain( domain ); this.marshals = new LinkedList(); } public synchronized void close() { while( !marshals.isEmpty() ) { OhpiMarshal m = marshals.removeFirst(); m.close(); } } public long getLocalSid() { return local_sid; } public long getRemoteSid() { return remote_sid; } public void setRemoteSid( long remote_sid ) { this.remote_sid = remote_sid; } public long getRemoteDid() { return domain.getRemoteDid(); } public synchronized OhpiMarshal getMarshal() { OhpiMarshal m; if ( !marshals.isEmpty() ) { m = marshals.removeFirst(); } else { m = new OhpiMarshal(); boolean rc = m.open( domain.getRemoteHost(), domain.getRemotePort() ); if ( !rc ) { m = null; } } if ( m != null ) { m.reset(); } return m; } public synchronized void putMarshal( OhpiMarshal m ) { m.reset(); marshals.addFirst( m ); } }; openhpi-3.6.1/baselibs/java/openhpi_baselib/HpiDataTypesGen.java0000644000175100017510000032672312575647300023665 0ustar mohanmohan/* -*- java -*- * * Copyright (C) 2012, Pigeon Point Systems * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ package org.openhpi; /********************************************************** * HPI Data Types (auto-generated) *********************************************************/ public class HpiDataTypesGen { // Just to ensure nobody creates it protected HpiDataTypesGen() { // empty } /********************************************************** * HPI Constants *********************************************************/ public static final long SAHPI_TRUE = 1L; public static final long SAHPI_FALSE = 0L; public static final long SAHPI_MANUFACTURER_ID_UNSPECIFIED = 0L; public static final long SAHPI_INTERFACE_VERSION = 131842L; public static final long SA_OK = 0L; public static final long SA_HPI_ERR_BASE = -1000L; public static final long SA_ERR_HPI_ERROR = -1001L; public static final long SA_ERR_HPI_UNSUPPORTED_API = -1002L; public static final long SA_ERR_HPI_BUSY = -1003L; public static final long SA_ERR_HPI_INTERNAL_ERROR = -1004L; public static final long SA_ERR_HPI_INVALID_CMD = -1005L; public static final long SA_ERR_HPI_TIMEOUT = -1006L; public static final long SA_ERR_HPI_OUT_OF_SPACE = -1007L; public static final long SA_ERR_HPI_OUT_OF_MEMORY = -1008L; public static final long SA_ERR_HPI_INVALID_PARAMS = -1009L; public static final long SA_ERR_HPI_INVALID_DATA = -1010L; public static final long SA_ERR_HPI_NOT_PRESENT = -1011L; public static final long SA_ERR_HPI_NO_RESPONSE = -1012L; public static final long SA_ERR_HPI_DUPLICATE = -1013L; public static final long SA_ERR_HPI_INVALID_SESSION = -1014L; public static final long SA_ERR_HPI_INVALID_DOMAIN = -1015L; public static final long SA_ERR_HPI_INVALID_RESOURCE = -1016L; public static final long SA_ERR_HPI_INVALID_REQUEST = -1017L; public static final long SA_ERR_HPI_ENTITY_NOT_PRESENT = -1018L; public static final long SA_ERR_HPI_READ_ONLY = -1019L; public static final long SA_ERR_HPI_CAPABILITY = -1020L; public static final long SA_ERR_HPI_UNKNOWN = -1021L; public static final long SA_ERR_HPI_INVALID_STATE = -1022L; public static final long SA_ERR_HPI_UNSUPPORTED_PARAMS = -1023L; public static final long SAHPI_UNSPECIFIED_DOMAIN_ID = 4294967295L; public static final long SAHPI_UNSPECIFIED_RESOURCE_ID = 4294967295L; public static final long SAHPI_FIRST_ENTRY = 0L; public static final long SAHPI_LAST_ENTRY = 4294967295L; public static final long SAHPI_ENTRY_UNSPECIFIED = 0L; public static final long SAHPI_TIME_UNSPECIFIED = -9223372036854775808L; public static final long SAHPI_TIME_MAX_RELATIVE = 864691128455135232L; public static final long SAHPI_TIMEOUT_IMMEDIATE = 0L; public static final long SAHPI_TIMEOUT_BLOCK = -1L; public static final int SAHPI_MAX_TEXT_BUFFER_LENGTH = 255; public static final long SAHPI_ENT_IPMI_GROUP = 0L; public static final long SAHPI_ENT_SAFHPI_GROUP = 65536L; public static final long SAHPI_ENT_ROOT_VALUE = 65535L; public static final int SAHPI_MAX_ENTITY_PATH = 16; public static final long SAHPI_EC_UNSPECIFIED = 0L; public static final long SAHPI_EC_THRESHOLD = 1L; public static final long SAHPI_EC_USAGE = 2L; public static final long SAHPI_EC_STATE = 3L; public static final long SAHPI_EC_PRED_FAIL = 4L; public static final long SAHPI_EC_LIMIT = 5L; public static final long SAHPI_EC_PERFORMANCE = 6L; public static final long SAHPI_EC_SEVERITY = 7L; public static final long SAHPI_EC_PRESENCE = 8L; public static final long SAHPI_EC_ENABLE = 9L; public static final long SAHPI_EC_AVAILABILITY = 10L; public static final long SAHPI_EC_REDUNDANCY = 11L; public static final long SAHPI_EC_SENSOR_SPECIFIC = 126L; public static final long SAHPI_EC_GENERIC = 127L; public static final long SAHPI_ES_UNSPECIFIED = 0L; public static final long SAHPI_ES_LOWER_MINOR = 1L; public static final long SAHPI_ES_LOWER_MAJOR = 2L; public static final long SAHPI_ES_LOWER_CRIT = 4L; public static final long SAHPI_ES_UPPER_MINOR = 8L; public static final long SAHPI_ES_UPPER_MAJOR = 16L; public static final long SAHPI_ES_UPPER_CRIT = 32L; public static final long SAHPI_ES_IDLE = 1L; public static final long SAHPI_ES_ACTIVE = 2L; public static final long SAHPI_ES_BUSY = 4L; public static final long SAHPI_ES_STATE_DEASSERTED = 1L; public static final long SAHPI_ES_STATE_ASSERTED = 2L; public static final long SAHPI_ES_PRED_FAILURE_DEASSERT = 1L; public static final long SAHPI_ES_PRED_FAILURE_ASSERT = 2L; public static final long SAHPI_ES_LIMIT_NOT_EXCEEDED = 1L; public static final long SAHPI_ES_LIMIT_EXCEEDED = 2L; public static final long SAHPI_ES_PERFORMANCE_MET = 1L; public static final long SAHPI_ES_PERFORMANCE_LAGS = 2L; public static final long SAHPI_ES_OK = 1L; public static final long SAHPI_ES_MINOR_FROM_OK = 2L; public static final long SAHPI_ES_MAJOR_FROM_LESS = 4L; public static final long SAHPI_ES_CRITICAL_FROM_LESS = 8L; public static final long SAHPI_ES_MINOR_FROM_MORE = 16L; public static final long SAHPI_ES_MAJOR_FROM_CRITICAL = 32L; public static final long SAHPI_ES_CRITICAL = 64L; public static final long SAHPI_ES_MONITOR = 128L; public static final long SAHPI_ES_INFORMATIONAL = 256L; public static final long SAHPI_ES_ABSENT = 1L; public static final long SAHPI_ES_PRESENT = 2L; public static final long SAHPI_ES_DISABLED = 1L; public static final long SAHPI_ES_ENABLED = 2L; public static final long SAHPI_ES_RUNNING = 1L; public static final long SAHPI_ES_TEST = 2L; public static final long SAHPI_ES_POWER_OFF = 4L; public static final long SAHPI_ES_ON_LINE = 8L; public static final long SAHPI_ES_OFF_LINE = 16L; public static final long SAHPI_ES_OFF_DUTY = 32L; public static final long SAHPI_ES_DEGRADED = 64L; public static final long SAHPI_ES_POWER_SAVE = 128L; public static final long SAHPI_ES_INSTALL_ERROR = 256L; public static final long SAHPI_ES_FULLY_REDUNDANT = 1L; public static final long SAHPI_ES_REDUNDANCY_LOST = 2L; public static final long SAHPI_ES_REDUNDANCY_DEGRADED = 4L; public static final long SAHPI_ES_REDUNDANCY_LOST_SUFFICIENT_RESOURCES = 8L; public static final long SAHPI_ES_NON_REDUNDANT_SUFFICIENT_RESOURCES = 16L; public static final long SAHPI_ES_NON_REDUNDANT_INSUFFICIENT_RESOURCES = 32L; public static final long SAHPI_ES_REDUNDANCY_DEGRADED_FROM_FULL = 64L; public static final long SAHPI_ES_REDUNDANCY_DEGRADED_FROM_NON = 128L; public static final long SAHPI_ES_STATE_00 = 1L; public static final long SAHPI_ES_STATE_01 = 2L; public static final long SAHPI_ES_STATE_02 = 4L; public static final long SAHPI_ES_STATE_03 = 8L; public static final long SAHPI_ES_STATE_04 = 16L; public static final long SAHPI_ES_STATE_05 = 32L; public static final long SAHPI_ES_STATE_06 = 64L; public static final long SAHPI_ES_STATE_07 = 128L; public static final long SAHPI_ES_STATE_08 = 256L; public static final long SAHPI_ES_STATE_09 = 512L; public static final long SAHPI_ES_STATE_10 = 1024L; public static final long SAHPI_ES_STATE_11 = 2048L; public static final long SAHPI_ES_STATE_12 = 4096L; public static final long SAHPI_ES_STATE_13 = 8192L; public static final long SAHPI_ES_STATE_14 = 16384L; public static final long SAHPI_STANDARD_SENSOR_MIN = 256L; public static final long SAHPI_STANDARD_SENSOR_MAX = 511L; public static final long SAHPI_SENSOR_TYPE_SAFHPI_GROUP = 65536L; public static final int SAHPI_SENSOR_BUFFER_LENGTH = 32; public static final long SAHPI_ALL_EVENT_STATES = 65535L; public static final long SAHPI_SRF_MIN = 16L; public static final long SAHPI_SRF_MAX = 8L; public static final long SAHPI_SRF_NORMAL_MIN = 4L; public static final long SAHPI_SRF_NORMAL_MAX = 2L; public static final long SAHPI_SRF_NOMINAL = 1L; public static final long SAHPI_STM_LOW_MINOR = 1L; public static final long SAHPI_STM_LOW_MAJOR = 2L; public static final long SAHPI_STM_LOW_CRIT = 4L; public static final long SAHPI_STM_UP_MINOR = 8L; public static final long SAHPI_STM_UP_MAJOR = 16L; public static final long SAHPI_STM_UP_CRIT = 32L; public static final long SAHPI_STM_UP_HYSTERESIS = 64L; public static final long SAHPI_STM_LOW_HYSTERESIS = 128L; public static final long SAHPI_DEFAGSENS_OPER = 256L; public static final long SAHPI_DEFAGSENS_PWR = 257L; public static final long SAHPI_DEFAGSENS_TEMP = 258L; public static final long SAHPI_DEFAGSENS_MIN = 256L; public static final long SAHPI_DEFAGSENS_MAX = 271L; public static final int SAHPI_CTRL_MAX_STREAM_LENGTH = 4; public static final long SAHPI_TLN_ALL_LINES = 0L; public static final int SAHPI_CTRL_MAX_OEM_BODY_LENGTH = 255; public static final int SAHPI_CTRL_OEM_CONFIG_LENGTH = 10; public static final long SAHPI_DEFAULT_INVENTORY_ID = 0L; public static final long SAHPI_DEFAULT_WATCHDOG_NUM = 0L; public static final long SAHPI_WATCHDOG_EXP_BIOS_FRB2 = 2L; public static final long SAHPI_WATCHDOG_EXP_BIOS_POST = 4L; public static final long SAHPI_WATCHDOG_EXP_OS_LOAD = 8L; public static final long SAHPI_WATCHDOG_EXP_SMS_OS = 16L; public static final long SAHPI_WATCHDOG_EXP_OEM = 32L; public static final int SAHPI_DIMITEST_MAX_PARAMETERS = 10; public static final int SAHPI_DIMITEST_PARAM_NAME_LEN = 20; public static final long SAHPI_DIMITEST_CAPABILITY_NO_CAPABILITY = 0L; public static final long SAHPI_DIMITEST_CAPABILITY_RESULTSOUTPUT = 1L; public static final long SAHPI_DIMITEST_CAPABILITY_SERVICEMODE = 2L; public static final long SAHPI_DIMITEST_CAPABILITY_LOOPCOUNT = 4L; public static final long SAHPI_DIMITEST_CAPABILITY_LOOPTIME = 8L; public static final long SAHPI_DIMITEST_CAPABILITY_LOGGING = 16L; public static final long SAHPI_DIMITEST_CAPABILITY_TESTCANCEL = 32L; public static final long SAHPI_DIMITEST_CAPAB_RES_FINALONLY = 0L; public static final long SAHPI_DIMITEST_CAPAB_RES_ONDEMAND = 1L; public static final long SAHPI_DIMITEST_CAPAB_RES_ASYNC = 2L; public static final int SAHPI_DIMITEST_MAX_ENTITIESIMPACTED = 5; public static final int SAHPI_FUMI_MAX_OEM_BODY_LENGTH = 255; public static final int SAHPI_FUMI_MAX_ENTITIES_IMPACTED = 5; public static final long SAHPI_FUMI_NO_MAIN_PERSISTENT_COPY = 1L; public static final long SAHPI_FUMI_PROT_TFTP = 1L; public static final long SAHPI_FUMI_PROT_FTP = 2L; public static final long SAHPI_FUMI_PROT_HTTP = 4L; public static final long SAHPI_FUMI_PROT_LDAP = 8L; public static final long SAHPI_FUMI_PROT_LOCAL = 16L; public static final long SAHPI_FUMI_PROT_NFS = 32L; public static final long SAHPI_FUMI_PROT_DBACCESS = 64L; public static final long SAHPI_FUMI_CAP_ROLLBACK = 1L; public static final long SAHPI_FUMI_CAP_BANKCOPY = 2L; public static final long SAHPI_FUMI_CAP_BANKREORDER = 4L; public static final long SAHPI_FUMI_CAP_BACKUP = 8L; public static final long SAHPI_FUMI_CAP_TARGET_VERIFY = 16L; public static final long SAHPI_FUMI_CAP_TARGET_VERIFY_MAIN = 32L; public static final long SAHPI_FUMI_CAP_COMPONENTS = 64L; public static final long SAHPI_FUMI_CAP_AUTOROLLBACK = 128L; public static final long SAHPI_FUMI_CAP_AUTOROLLBACK_CAN_BE_DISABLED = 256L; public static final long SAHPI_FUMI_CAP_MAIN_NOT_PERSISTENT = 512L; public static final long SAHPI_SOD_TRIGGER_READING = 1L; public static final long SAHPI_SOD_TRIGGER_THRESHOLD = 2L; public static final long SAHPI_SOD_OEM = 4L; public static final long SAHPI_SOD_PREVIOUS_STATE = 8L; public static final long SAHPI_SOD_CURRENT_STATE = 16L; public static final long SAHPI_SOD_SENSOR_SPECIFIC = 32L; public static final long SAHPI_SEOD_CURRENT_STATE = 16L; public static final long SAHPI_SEOD_ALARM_STATES = 64L; public static final long SAHPI_EVT_QUEUE_OVERFLOW = 1L; public static final int SA_HPI_MAX_NAME_LENGTH = 256; public static final long SAHPI_LOAD_ID_DEFAULT = 0L; public static final long SAHPI_LOAD_ID_BYNAME = 4294967295L; public static final int SAHPI_GUID_LENGTH = 16; public static final long SAHPI_CAPABILITY_RESOURCE = 1073741824L; public static final long SAHPI_CAPABILITY_FUMI = 65536L; public static final long SAHPI_CAPABILITY_EVT_DEASSERTS = 32768L; public static final long SAHPI_CAPABILITY_DIMI = 16384L; public static final long SAHPI_CAPABILITY_AGGREGATE_STATUS = 8192L; public static final long SAHPI_CAPABILITY_CONFIGURATION = 4096L; public static final long SAHPI_CAPABILITY_MANAGED_HOTSWAP = 2048L; public static final long SAHPI_CAPABILITY_WATCHDOG = 1024L; public static final long SAHPI_CAPABILITY_CONTROL = 512L; public static final long SAHPI_CAPABILITY_FRU = 256L; public static final long SAHPI_CAPABILITY_LOAD_ID = 128L; public static final long SAHPI_CAPABILITY_ANNUNCIATOR = 64L; public static final long SAHPI_CAPABILITY_POWER = 32L; public static final long SAHPI_CAPABILITY_RESET = 16L; public static final long SAHPI_CAPABILITY_INVENTORY_DATA = 8L; public static final long SAHPI_CAPABILITY_EVENT_LOG = 4L; public static final long SAHPI_CAPABILITY_RDR = 2L; public static final long SAHPI_CAPABILITY_SENSOR = 1L; public static final long SAHPI_HS_CAPABILITY_AUTOEXTRACT_READ_ONLY = 2147483648L; public static final long SAHPI_HS_CAPABILITY_INDICATOR_SUPPORTED = 1073741824L; public static final long SAHPI_HS_CAPABILITY_AUTOINSERT_IMMEDIATE = 536870912L; public static final long SAHPI_DOMAIN_CAP_AUTOINSERT_READ_ONLY = 1L; public static final long SAHPI_EVTLOG_CAPABILITY_ENTRY_ADD = 1L; public static final long SAHPI_EVTLOG_CAPABILITY_CLEAR = 2L; public static final long SAHPI_EVTLOG_CAPABILITY_TIME_SET = 4L; public static final long SAHPI_EVTLOG_CAPABILITY_STATE_SET = 8L; public static final long SAHPI_EVTLOG_CAPABILITY_OVERFLOW_RESET = 16L; public static final long SAHPI_OLDEST_ENTRY = 0L; public static final long SAHPI_NEWEST_ENTRY = 4294967295L; public static final long SAHPI_NO_MORE_ENTRIES = 4294967294L; public static final long ATCAHPI_PICMG_MID = 12634L; public static final long ATCAHPI_BLINK_COLOR_LED = 128L; public static final long ATCAHPI_LED_WHITE = 64L; public static final long ATCAHPI_LED_ORANGE = 32L; public static final long ATCAHPI_LED_AMBER = 16L; public static final long ATCAHPI_LED_GREEN = 8L; public static final long ATCAHPI_LED_RED = 4L; public static final long ATCAHPI_LED_BLUE = 2L; public static final long ATCAHPI_CTRL_NUM_BLUE_LED = 0L; public static final long ATCAHPI_CTRL_NUM_LED1 = 1L; public static final long ATCAHPI_CTRL_NUM_LED2 = 2L; public static final long ATCAHPI_CTRL_NUM_LED3 = 3L; public static final long ATCAHPI_CTRL_NUM_APP_LED = 4L; public static final long ATCAHPI_RESOURCE_AGGREGATE_LED = 255L; public static final long ATCAHPI_ENT_POWER_ENTRY_MODULE_SLOT = 145L; public static final long ATCAHPI_ENT_SHELF_FRU_DEVICE_SLOT = 146L; public static final long ATCAHPI_ENT_SHELF_MANAGER_SLOT = 147L; public static final long ATCAHPI_ENT_FAN_TRAY_SLOT = 148L; public static final long ATCAHPI_ENT_FAN_FILTER_TRAY_SLOT = 149L; public static final long ATCAHPI_ENT_ALARM_SLOT = 150L; public static final long ATCAHPI_ENT_AMC_SLOT = 151L; public static final long ATCAHPI_ENT_PMC_SLOT = 152L; public static final long ATCAHPI_ENT_RTM_SLOT = 153L; public static final long ATCAHPI_ENT_PICMG_FRONT_BLADE = 65558L; public static final long ATCAHPI_ENT_SHELF_FRU_DEVICE = 65559L; public static final long ATCAHPI_ENT_FILTRATION_UNIT = 65560L; public static final long ATCAHPI_ENT_AMC = 65561L; public static final long ATCAHPI_SENSOR_NUM_SHELF_INFO_VALID = 4096L; public static final long ATCAHPI_CTRL_NUM_SHELF_ADDRESS = 4096L; public static final long ATCAHPI_CTRL_NUM_SHELF_IP_ADDRESS = 4097L; public static final long ATCAHPI_CTRL_NUM_SHELF_STATUS = 4098L; public static final long ATCAHPI_SENSOR_NUM_PWRONSEQ_COMMIT_STATUS = 4864L; public static final long ATCAHPI_CTRL_NUM_FRU_POWER_ON_SEQUENCE_COMMIT = 4864L; public static final long ATCAHPI_CTRL_NUM_FRU_POWER_ON_SEQUENCE = 4865L; public static final long ATCAHPI_CS_CPS_PWR_ON = 1L; public static final long ATCAHPI_CS_CPS_PWR_OVERLOAD = 2L; public static final long ATCAHPI_CS_CPS_INTERLOCK = 4L; public static final long ATCAHPI_CS_CPS_PWR_FAULT = 8L; public static final long ATCAHPI_CS_CPS__PWR_CTRL_FAULT = 16L; public static final long ATCAHPI_CS_CPS_PWR_RESTORE_PWR_UP_PREV = 32L; public static final long ATCAHPI_CS_CPS_PWR_RESTORE_PWR_UP = 64L; public static final long ATCAHPI_CS_CPS_PWR_RESTORE_UNKNOWN = 96L; public static final long ATCAHPI_CS_LPEVT_AC_FAILED = 1L; public static final long ATCAHPI_CS_LPEVT_PWR_OVERLOAD = 2L; public static final long ATCAHPI_CS_LPEVT_PWR_INTERLOCK = 4L; public static final long ATCAHPI_CS_LPEVT_PWR_FAULT = 8L; public static final long ATCAHPI_CS_LPEVT_PWRON_IPMI = 16L; public static final long ATCAHPI_CS_MISC_CS_INTRUSION_ACTIVE = 1L; public static final long ATCAHPI_CS_MISC_CS_FP_LOCKOUT_ACTIVE = 2L; public static final long ATCAHPI_CS_MISC_CS_DRIVE_FAULT = 4L; public static final long ATCAHPI_CS_MISC_CS_COOLING_FAULT = 8L; public static final long ATCAHPI_CS_FP_BUTTON_PWR_OFF = 1L; public static final long ATCAHPI_CS_FP_BUTTON_RESET_OFF = 2L; public static final long ATCAHPI_CS_FP_BUTTON_DIAGINTR_OFF = 4L; public static final long ATCAHPI_CS_FP_BUTTON_STANDBY_OFF = 8L; public static final long ATCAHPI_CS_FP_BUTTON_ALLOW_PWR_OFF = 16L; public static final long ATCAHPI_CS_FP_BUTTON_ALLOW_RESET_OFF = 32L; public static final long ATCAHPI_CS_FP_BUTTON_ALLOW_DIAGINTR_OFF = 64L; public static final long ATCAHPI_CS_FP_BUTTON_ALLOW_STANDBY_OFF = 128L; public static final long ATCAHPI_SENSOR_NUM_SHMGR_REDUNDANCY = 4097L; public static final long ATCAHPI_SENSOR_NUM_SHMGR_ACTIVE = 4098L; public static final long ATCAHPI_SENSOR_NUM_SHMGR_STANDBY = 4099L; public static final long ATCAHPI_CTRL_NUM_SHMGR_FAILOVER = 4112L; public static final long ATCAHPI_CTRL_NUM_FAILED_RESOURCE_EXTRACT = 4126L; public static final long ATCAHPI_SENSOR_NUM_SLOT_STATE = 4112L; public static final long ATCAHPI_SENSOR_NUM_ASSIGNED_PWR = 4113L; public static final long ATCAHPI_SENSOR_NUM_MAX_PWR = 4114L; public static final long ATCAHPI_CTRL_NUM_FRU_ACTIVATION = 4128L; public static final long ATCAHPI_SENSOR_NUM_IPMB0 = 4352L; public static final long ATCAHPI_CTRL_NUM_DESIRED_PWR = 4144L; public static final long ATCAHPI_CTRL_NUM_IPMB_A_STATE = 4353L; public static final long ATCAHPI_CTRL_NUM_IPMB_B_STATE = 4354L; public static final long ATCAHPI_CTRL_NUM_FRU_CONTROL = 4608L; public static final long ATCAHPI_CTRL_NUM_FRU_IPMC_RESET = 4609L; public static final long ATCAHPI_SENSOR_NUM_AMC_PWRONSEQ_COMMIT_STATUS = 5376L; public static final long ATCAHPI_CTRL_NUM_AMC_POWER_ON_SEQUENCE_COMMIT = 5376L; public static final long ATCAHPI_CTRL_NUM_AMC_POWER_ON_SEQUENCE = 5377L; public static final long ATCAHPI_CTRL_NUM_FAN_SPEED = 5120L; public static final long ATCAHPI_PICMG_CT_CHASSIS_STATUS = 16789850L; public static final long ATCAHPI_PICMG_CT_ATCA_LED = 33567066L; public static final long XTCAHPI_SPEC_VERSION = 4228711L; public static final long XTCAHPI_PICMG_MID = 12634L; public static final long XTCAHPI_ENT_POWER_SLOT = 145L; public static final long XTCAHPI_ENT_SHELF_FRU_DEVICE_SLOT = 146L; public static final long XTCAHPI_ENT_SHELF_MANAGER_SLOT = 147L; public static final long XTCAHPI_ENT_FAN_TRAY_SLOT = 148L; public static final long XTCAHPI_ENT_FAN_FILTER_TRAY_SLOT = 149L; public static final long XTCAHPI_ENT_ALARM_SLOT = 150L; public static final long XTCAHPI_ENT_AMC_SLOT = 151L; public static final long XTCAHPI_ENT_PMC_SLOT = 152L; public static final long XTCAHPI_ENT_RTM_SLOT = 153L; public static final long XTCAHPI_ENT_CARRIER_MANAGER_SLOT = 154L; public static final long XTCAHPI_ENT_CARRIER_SLOT = 155L; public static final long XTCAHPI_ENT_COM_E_SLOT = 156L; public static final long XTCAHPI_CTRL_NUM_IP_ADDRESS_0 = 4097L; public static final long XTCAHPI_CTRL_NUM_IP_ADDRESS_1 = 4099L; public static final long XTCAHPI_CTRL_NUM_POWER_ON_SEQUENCE = 4865L; public static final long XTCAHPI_CTRL_NUM_POWER_ON_SEQUENCE_COMMIT = 4864L; public static final long XTCAHPI_SENSOR_NUM_PWRONSEQ_COMMIT_STATUS = 4864L; public static final long XTCAHPI_ANN_NUM_TELCO_ALARM = 4096L; public static final long XTCAHPI_SENSOR_NUM_REDUNDANCY = 4097L; public static final long XTCAHPI_SENSOR_NUM_ACTIVE = 4098L; public static final long XTCAHPI_SENSOR_NUM_STANDBY = 4099L; public static final long XTCAHPI_CTRL_NUM_FAILOVER = 4112L; public static final long XTCAHPI_CTRL_NUM_ACTIVATION = 4128L; public static final long XTCAHPI_CTRL_NUM_DEACTIVATION = 4129L; public static final long XTCAHPI_SENSOR_NUM_FRU_INFO_VALID = 4096L; public static final long XTCAHPI_SENSOR_NUM_ASSIGNED_PWR = 4113L; public static final long XTCAHPI_SENSOR_NUM_SLOT_ASSIGNED_PWR = 6144L; public static final long XTCAHPI_IDR_NUM_CONFIG_INFO = 1L; public static final long XTCAHPI_CTRL_NUM_SHELF_ADDRESS = 4096L; public static final long XTCAHPI_CTRL_NUM_SHELF_STATUS = 4098L; public static final long XTCAHPI_CTRL_NUM_SHELF_MANAGER_RMCP_USERNAME = 4177L; public static final long XTCAHPI_CTRL_NUM_SHELF_MANAGER_RMCP_PASSWORD = 4178L; public static final long XTCAHPI_CTRL_NUM_IN_SHELF_ACTIVATION = 4192L; public static final long XTCAHPI_CTRL_NUM_IN_SHELF_DEACTIVATION = 4193L; public static final long XTCAHPI_CTRL_NUM_DESIRED_PWR = 4144L; public static final long XTCAHPI_SENSOR_NUM_IPMB0 = 4352L; public static final long XTCAHPI_CTRL_NUM_IPMB_A_STATE = 4353L; public static final long XTCAHPI_CTRL_NUM_IPMB_B_STATE = 4354L; public static final long XTCAHPI_CTRL_NUM_FRU_CONTROL = 4608L; public static final long XTCAHPI_CTRL_NUM_FRU_IPMC_RESET = 4609L; public static final long XTCAHPI_CTRL_NUM_BLUE_LED = 0L; public static final long XTCAHPI_CTRL_NUM_LED1 = 1L; public static final long XTCAHPI_CTRL_NUM_LED2 = 2L; public static final long XTCAHPI_CTRL_NUM_LED3 = 3L; public static final long XTCAHPI_CTRL_NUM_APP_LED = 4L; public static final long XTCAHPI_RESOURCE_AGGREGATE_LED = 255L; public static final long XTCAHPI_CTRL_NUM_AMC_POWER_ON_SEQUENCE = 5377L; public static final long XTCAHPI_CTRL_NUM_AMC_POWER_ON_SEQUENCE_COMMIT = 5376L; public static final long XTCAHPI_SENSOR_NUM_AMC_PWRONSEQ_COMMIT_STATUS = 5376L; public static final long XTCAHPI_CTRL_NUM_FAN_SPEED = 5120L; public static final long XTCAHPI_SENSOR_NUM_HPM1_IPMC_GLOBAL_CAPS = 5888L; public static final long XTCAHPI_SENSOR_NUM_HPM1_IMAGE_CAPS = 5889L; public static final long XTCAHPI_SENSOR_NUM_HPM1_ROLLBACK_TIMEOUT = 5890L; public static final long XTCAHPI_CTRL_NUM_CRITICAL_TELCO_ALARM = 5632L; public static final long XTCAHPI_CTRL_NUM_MAJOR_TELCO_ALARM = 5633L; public static final long XTCAHPI_CTRL_NUM_MINOR_TELCO_ALARM = 5634L; public static final long XTCAHPI_CTRL_NUM_POWER_TELCO_ALARM = 5635L; public static final long XTCAHPI_CTRL_NUM_TELCO_ALARM_CUTOFF = 5636L; public static final long XTCAHPI_SENSOR_NUM_TELCO_ALARM_INPUT = 5632L; public static final long XTCAHPI_INDICATOR_LOC_MINOR_ALARM = 0L; public static final long XTCAHPI_INDICATOR_LOC_MAJOR_ALARM = 1L; public static final long XTCAHPI_INDICATOR_LOC_CRITICAL_ALARM = 2L; public static final long XTCAHPI_INDICATOR_LOC_POWER_ALARM = 3L; public static final long XTCAHPI_CONFIG_DATA_AREA_SPEC_VERSION = 0L; public static final long XTCAHPI_CONFIG_DATA_FIELD_LABEL = 0L; public static final long XTCAHPI_CS_CPS_PWR_ON = 1L; public static final long XTCAHPI_CS_CPS_PWR_OVERLOAD = 2L; public static final long XTCAHPI_CS_CPS_INTERLOCK = 4L; public static final long XTCAHPI_CS_CPS_PWR_FAULT = 8L; public static final long XTCAHPI_CS_CPS_PWR_CTRL_FAULT = 16L; public static final long XTCAHPI_CS_CPS_PWR_RESTORE_PWR_UP_PREV = 32L; public static final long XTCAHPI_CS_CPS_PWR_RESTORE_PWR_UP = 64L; public static final long XTCAHPI_CS_CPS_PWR_RESTORE_UNKNOWN = 96L; public static final long XTCAHPI_CS_LPEVT_AC_FAILED = 1L; public static final long XTCAHPI_CS_LPEVT_PWR_OVERLOAD = 2L; public static final long XTCAHPI_CS_LPEVT_PWR_INTERLOCK = 4L; public static final long XTCAHPI_CS_LPEVT_PWR_FAULT = 8L; public static final long XTCAHPI_CS_LPEVT_PWRON_IPMI = 16L; public static final long XTCAHPI_CS_MISC_CS_INTRUSION_ACTIVE = 1L; public static final long XTCAHPI_CS_MISC_CS_FP_LOCKOUT_ACTIVE = 2L; public static final long XTCAHPI_CS_MISC_CS_DRIVE_FAULT = 4L; public static final long XTCAHPI_CS_MISC_CS_COOLING_FAULT = 8L; public static final long XTCAHPI_CS_FP_BUTTON_PWR_OFF = 1L; public static final long XTCAHPI_CS_FP_BUTTON_RESET_OFF = 2L; public static final long XTCAHPI_CS_FP_BUTTON_DIAGINTR_OFF = 4L; public static final long XTCAHPI_CS_FP_BUTTON_STANDBY_OFF = 8L; public static final long XTCAHPI_CS_FP_BUTTON_ALLOW_PWR_OFF = 16L; public static final long XTCAHPI_CS_FP_BUTTON_ALLOW_RESET_OFF = 32L; public static final long XTCAHPI_CS_FP_BUTTON_ALLOW_DIAGINTR_OFF = 64L; public static final long XTCAHPI_CS_FP_BUTTON_ALLOW_STANDBY_OFF = 128L; public static final long XTCAHPI_BLINK_COLOR_LED = 128L; public static final long XTCAHPI_LED_WHITE = 64L; public static final long XTCAHPI_LED_ORANGE = 32L; public static final long XTCAHPI_LED_AMBER = 16L; public static final long XTCAHPI_LED_GREEN = 8L; public static final long XTCAHPI_LED_RED = 4L; public static final long XTCAHPI_LED_BLUE = 2L; public static final long XTCAHPI_IF_FABRIC = 1L; public static final long XTCAHPI_IF_SYNC_CLOCK = 2L; public static final long XTCAHPI_IF_BASE = 3L; public static final long XTCAHPI_IF_UPDATE_CHANNEL = 4L; public static final long XTCAHPI_IF_METALLIC_TEST = 5L; public static final long XTCAHPI_IF_RINGING_GENERATOR_BUS = 6L; public static final long XTCAHPI_CONFIG_DATA_LOC_DEFAULT = 0L; public static final long XTCAHPI_CONFIG_DATA_LOC_SHELF_ADDRESS = 1L; public static final long XTCAHPI_CONFIG_DATA_LOC_POWER_ON_SEQUENCE = 2L; public static final long XTCAHPI_CONFIG_DATA_LOC_CHASSIS_STATUS = 3L; public static final long XTCAHPI_CONFIG_DATA_LOC_ACTIVATION = 4L; public static final long XTCAHPI_CONFIG_DATA_LOC_DEACTIVATION = 5L; public static final long XTCAHPI_CONFIG_DATA_LOC_IN_SHELF_ACTIVATION = 6L; public static final long XTCAHPI_CONFIG_DATA_LOC_IN_SHELF_DEACTIVATION = 7L; public static final long XTCAHPI_CONFIG_DATA_LOC_USERNAME = 8L; public static final long XTCAHPI_CONFIG_DATA_LOC_PASSWORD = 9L; public static final long XTCAHPI_CONFIG_DATA_LOC_FUMI_GLOBAL_UPGRADE_CAP = 10L; public static final long XTCAHPI_CONFIG_DATA_LOC_FUMI_UPGRADE_IMAGE_CAP = 11L; public static final long XTCAHPI_CONFIG_DATA_LOC_FUMI_ROLLBACK_TIMEOUT = 12L; public static final long SAHPI_LANG_UNDEF = 0L; public static final long SAHPI_LANG_AFAR = 1L; public static final long SAHPI_LANG_ABKHAZIAN = 2L; public static final long SAHPI_LANG_AFRIKAANS = 3L; public static final long SAHPI_LANG_AMHARIC = 4L; public static final long SAHPI_LANG_ARABIC = 5L; public static final long SAHPI_LANG_ASSAMESE = 6L; public static final long SAHPI_LANG_AYMARA = 7L; public static final long SAHPI_LANG_AZERBAIJANI = 8L; public static final long SAHPI_LANG_BASHKIR = 9L; public static final long SAHPI_LANG_BYELORUSSIAN = 10L; public static final long SAHPI_LANG_BULGARIAN = 11L; public static final long SAHPI_LANG_BIHARI = 12L; public static final long SAHPI_LANG_BISLAMA = 13L; public static final long SAHPI_LANG_BENGALI = 14L; public static final long SAHPI_LANG_TIBETAN = 15L; public static final long SAHPI_LANG_BRETON = 16L; public static final long SAHPI_LANG_CATALAN = 17L; public static final long SAHPI_LANG_CORSICAN = 18L; public static final long SAHPI_LANG_CZECH = 19L; public static final long SAHPI_LANG_WELSH = 20L; public static final long SAHPI_LANG_DANISH = 21L; public static final long SAHPI_LANG_GERMAN = 22L; public static final long SAHPI_LANG_BHUTANI = 23L; public static final long SAHPI_LANG_GREEK = 24L; public static final long SAHPI_LANG_ENGLISH = 25L; public static final long SAHPI_LANG_ESPERANTO = 26L; public static final long SAHPI_LANG_SPANISH = 27L; public static final long SAHPI_LANG_ESTONIAN = 28L; public static final long SAHPI_LANG_BASQUE = 29L; public static final long SAHPI_LANG_PERSIAN = 30L; public static final long SAHPI_LANG_FINNISH = 31L; public static final long SAHPI_LANG_FIJI = 32L; public static final long SAHPI_LANG_FAEROESE = 33L; public static final long SAHPI_LANG_FRENCH = 34L; public static final long SAHPI_LANG_FRISIAN = 35L; public static final long SAHPI_LANG_IRISH = 36L; public static final long SAHPI_LANG_SCOTSGAELIC = 37L; public static final long SAHPI_LANG_GALICIAN = 38L; public static final long SAHPI_LANG_GUARANI = 39L; public static final long SAHPI_LANG_GUJARATI = 40L; public static final long SAHPI_LANG_HAUSA = 41L; public static final long SAHPI_LANG_HINDI = 42L; public static final long SAHPI_LANG_CROATIAN = 43L; public static final long SAHPI_LANG_HUNGARIAN = 44L; public static final long SAHPI_LANG_ARMENIAN = 45L; public static final long SAHPI_LANG_INTERLINGUA = 46L; public static final long SAHPI_LANG_INTERLINGUE = 47L; public static final long SAHPI_LANG_INUPIAK = 48L; public static final long SAHPI_LANG_INDONESIAN = 49L; public static final long SAHPI_LANG_ICELANDIC = 50L; public static final long SAHPI_LANG_ITALIAN = 51L; public static final long SAHPI_LANG_HEBREW = 52L; public static final long SAHPI_LANG_JAPANESE = 53L; public static final long SAHPI_LANG_YIDDISH = 54L; public static final long SAHPI_LANG_JAVANESE = 55L; public static final long SAHPI_LANG_GEORGIAN = 56L; public static final long SAHPI_LANG_KAZAKH = 57L; public static final long SAHPI_LANG_GREENLANDIC = 58L; public static final long SAHPI_LANG_CAMBODIAN = 59L; public static final long SAHPI_LANG_KANNADA = 60L; public static final long SAHPI_LANG_KOREAN = 61L; public static final long SAHPI_LANG_KASHMIRI = 62L; public static final long SAHPI_LANG_KURDISH = 63L; public static final long SAHPI_LANG_KIRGHIZ = 64L; public static final long SAHPI_LANG_LATIN = 65L; public static final long SAHPI_LANG_LINGALA = 66L; public static final long SAHPI_LANG_LAOTHIAN = 67L; public static final long SAHPI_LANG_LITHUANIAN = 68L; public static final long SAHPI_LANG_LATVIANLETTISH = 69L; public static final long SAHPI_LANG_MALAGASY = 70L; public static final long SAHPI_LANG_MAORI = 71L; public static final long SAHPI_LANG_MACEDONIAN = 72L; public static final long SAHPI_LANG_MALAYALAM = 73L; public static final long SAHPI_LANG_MONGOLIAN = 74L; public static final long SAHPI_LANG_MOLDAVIAN = 75L; public static final long SAHPI_LANG_MARATHI = 76L; public static final long SAHPI_LANG_MALAY = 77L; public static final long SAHPI_LANG_MALTESE = 78L; public static final long SAHPI_LANG_BURMESE = 79L; public static final long SAHPI_LANG_NAURU = 80L; public static final long SAHPI_LANG_NEPALI = 81L; public static final long SAHPI_LANG_DUTCH = 82L; public static final long SAHPI_LANG_NORWEGIAN = 83L; public static final long SAHPI_LANG_OCCITAN = 84L; public static final long SAHPI_LANG_AFANOROMO = 85L; public static final long SAHPI_LANG_ORIYA = 86L; public static final long SAHPI_LANG_PUNJABI = 87L; public static final long SAHPI_LANG_POLISH = 88L; public static final long SAHPI_LANG_PASHTOPUSHTO = 89L; public static final long SAHPI_LANG_PORTUGUESE = 90L; public static final long SAHPI_LANG_QUECHUA = 91L; public static final long SAHPI_LANG_RHAETOROMANCE = 92L; public static final long SAHPI_LANG_KIRUNDI = 93L; public static final long SAHPI_LANG_ROMANIAN = 94L; public static final long SAHPI_LANG_RUSSIAN = 95L; public static final long SAHPI_LANG_KINYARWANDA = 96L; public static final long SAHPI_LANG_SANSKRIT = 97L; public static final long SAHPI_LANG_SINDHI = 98L; public static final long SAHPI_LANG_SANGRO = 99L; public static final long SAHPI_LANG_SERBOCROATIAN = 100L; public static final long SAHPI_LANG_SINGHALESE = 101L; public static final long SAHPI_LANG_SLOVAK = 102L; public static final long SAHPI_LANG_SLOVENIAN = 103L; public static final long SAHPI_LANG_SAMOAN = 104L; public static final long SAHPI_LANG_SHONA = 105L; public static final long SAHPI_LANG_SOMALI = 106L; public static final long SAHPI_LANG_ALBANIAN = 107L; public static final long SAHPI_LANG_SERBIAN = 108L; public static final long SAHPI_LANG_SISWATI = 109L; public static final long SAHPI_LANG_SESOTHO = 110L; public static final long SAHPI_LANG_SUDANESE = 111L; public static final long SAHPI_LANG_SWEDISH = 112L; public static final long SAHPI_LANG_SWAHILI = 113L; public static final long SAHPI_LANG_TAMIL = 114L; public static final long SAHPI_LANG_TELUGU = 115L; public static final long SAHPI_LANG_TAJIK = 116L; public static final long SAHPI_LANG_THAI = 117L; public static final long SAHPI_LANG_TIGRINYA = 118L; public static final long SAHPI_LANG_TURKMEN = 119L; public static final long SAHPI_LANG_TAGALOG = 120L; public static final long SAHPI_LANG_SETSWANA = 121L; public static final long SAHPI_LANG_TONGA = 122L; public static final long SAHPI_LANG_TURKISH = 123L; public static final long SAHPI_LANG_TSONGA = 124L; public static final long SAHPI_LANG_TATAR = 125L; public static final long SAHPI_LANG_TWI = 126L; public static final long SAHPI_LANG_UKRAINIAN = 127L; public static final long SAHPI_LANG_URDU = 128L; public static final long SAHPI_LANG_UZBEK = 129L; public static final long SAHPI_LANG_VIETNAMESE = 130L; public static final long SAHPI_LANG_VOLAPUK = 131L; public static final long SAHPI_LANG_WOLOF = 132L; public static final long SAHPI_LANG_XHOSA = 133L; public static final long SAHPI_LANG_YORUBA = 134L; public static final long SAHPI_LANG_CHINESE = 135L; public static final long SAHPI_LANG_ZULU = 136L; public static final long SAHPI_LANG_MAX_VALID = 136L; public static final long SAHPI_TL_TYPE_UNICODE = 0L; public static final long SAHPI_TL_TYPE_BCDPLUS = 1L; public static final long SAHPI_TL_TYPE_ASCII6 = 2L; public static final long SAHPI_TL_TYPE_TEXT = 3L; public static final long SAHPI_TL_TYPE_BINARY = 4L; public static final long SAHPI_TL_TYPE_MAX_VALID = 4L; public static final long SAHPI_ENT_UNSPECIFIED = 0L; public static final long SAHPI_ENT_OTHER = 1L; public static final long SAHPI_ENT_UNKNOWN = 2L; public static final long SAHPI_ENT_PROCESSOR = 3L; public static final long SAHPI_ENT_DISK_BAY = 4L; public static final long SAHPI_ENT_PERIPHERAL_BAY = 5L; public static final long SAHPI_ENT_SYS_MGMNT_MODULE = 6L; public static final long SAHPI_ENT_SYSTEM_BOARD = 7L; public static final long SAHPI_ENT_MEMORY_MODULE = 8L; public static final long SAHPI_ENT_PROCESSOR_MODULE = 9L; public static final long SAHPI_ENT_POWER_SUPPLY = 10L; public static final long SAHPI_ENT_ADD_IN_CARD = 11L; public static final long SAHPI_ENT_FRONT_PANEL_BOARD = 12L; public static final long SAHPI_ENT_BACK_PANEL_BOARD = 13L; public static final long SAHPI_ENT_POWER_SYSTEM_BOARD = 14L; public static final long SAHPI_ENT_DRIVE_BACKPLANE = 15L; public static final long SAHPI_ENT_SYS_EXPANSION_BOARD = 16L; public static final long SAHPI_ENT_OTHER_SYSTEM_BOARD = 17L; public static final long SAHPI_ENT_PROCESSOR_BOARD = 18L; public static final long SAHPI_ENT_POWER_UNIT = 19L; public static final long SAHPI_ENT_POWER_MODULE = 20L; public static final long SAHPI_ENT_POWER_MGMNT = 21L; public static final long SAHPI_ENT_CHASSIS_BACK_PANEL_BOARD = 22L; public static final long SAHPI_ENT_SYSTEM_CHASSIS = 23L; public static final long SAHPI_ENT_SUB_CHASSIS = 24L; public static final long SAHPI_ENT_OTHER_CHASSIS_BOARD = 25L; public static final long SAHPI_ENT_DISK_DRIVE_BAY = 26L; public static final long SAHPI_ENT_PERIPHERAL_BAY_2 = 27L; public static final long SAHPI_ENT_DEVICE_BAY = 28L; public static final long SAHPI_ENT_COOLING_DEVICE = 29L; public static final long SAHPI_ENT_COOLING_UNIT = 30L; public static final long SAHPI_ENT_INTERCONNECT = 31L; public static final long SAHPI_ENT_MEMORY_DEVICE = 32L; public static final long SAHPI_ENT_SYS_MGMNT_SOFTWARE = 33L; public static final long SAHPI_ENT_BIOS = 34L; public static final long SAHPI_ENT_OPERATING_SYSTEM = 35L; public static final long SAHPI_ENT_SYSTEM_BUS = 36L; public static final long SAHPI_ENT_GROUP = 37L; public static final long SAHPI_ENT_REMOTE = 38L; public static final long SAHPI_ENT_EXTERNAL_ENVIRONMENT = 39L; public static final long SAHPI_ENT_BATTERY = 40L; public static final long SAHPI_ENT_PROCESSING_BLADE = 41L; public static final long SAHPI_ENT_CONNECTIVITY_SWITCH = 42L; public static final long SAHPI_ENT_PROCESSOR_MEMORY_MODULE = 43L; public static final long SAHPI_ENT_IO_MODULE = 44L; public static final long SAHPI_ENT_PROCESSOR_IO_MODULE = 45L; public static final long SAHPI_ENT_MC_FIRMWARE = 46L; public static final long SAHPI_ENT_IPMI_CHANNEL = 47L; public static final long SAHPI_ENT_PCI_BUS = 48L; public static final long SAHPI_ENT_PCI_EXPRESS_BUS = 49L; public static final long SAHPI_ENT_SCSI_BUS = 50L; public static final long SAHPI_ENT_SATA_BUS = 51L; public static final long SAHPI_ENT_PROC_FSB = 52L; public static final long SAHPI_ENT_CLOCK = 53L; public static final long SAHPI_ENT_SYSTEM_FIRMWARE = 54L; public static final long SAHPI_ENT_CHASSIS_SPECIFIC = 144L; public static final long SAHPI_ENT_CHASSIS_SPECIFIC01 = 145L; public static final long SAHPI_ENT_CHASSIS_SPECIFIC02 = 146L; public static final long SAHPI_ENT_CHASSIS_SPECIFIC03 = 147L; public static final long SAHPI_ENT_CHASSIS_SPECIFIC04 = 148L; public static final long SAHPI_ENT_CHASSIS_SPECIFIC05 = 149L; public static final long SAHPI_ENT_CHASSIS_SPECIFIC06 = 150L; public static final long SAHPI_ENT_CHASSIS_SPECIFIC07 = 151L; public static final long SAHPI_ENT_CHASSIS_SPECIFIC08 = 152L; public static final long SAHPI_ENT_CHASSIS_SPECIFIC09 = 153L; public static final long SAHPI_ENT_CHASSIS_SPECIFIC10 = 154L; public static final long SAHPI_ENT_CHASSIS_SPECIFIC11 = 155L; public static final long SAHPI_ENT_CHASSIS_SPECIFIC12 = 156L; public static final long SAHPI_ENT_CHASSIS_SPECIFIC13 = 157L; public static final long SAHPI_ENT_BOARD_SET_SPECIFIC = 176L; public static final long SAHPI_ENT_OEM_SYSINT_SPECIFIC = 208L; public static final long SAHPI_ENT_ROOT = 65535L; public static final long SAHPI_ENT_RACK = 65536L; public static final long SAHPI_ENT_SUBRACK = 65537L; public static final long SAHPI_ENT_COMPACTPCI_CHASSIS = 65538L; public static final long SAHPI_ENT_ADVANCEDTCA_CHASSIS = 65539L; public static final long SAHPI_ENT_RACK_MOUNTED_SERVER = 65540L; public static final long SAHPI_ENT_SYSTEM_BLADE = 65541L; public static final long SAHPI_ENT_SWITCH = 65542L; public static final long SAHPI_ENT_SWITCH_BLADE = 65543L; public static final long SAHPI_ENT_SBC_BLADE = 65544L; public static final long SAHPI_ENT_IO_BLADE = 65545L; public static final long SAHPI_ENT_DISK_BLADE = 65546L; public static final long SAHPI_ENT_DISK_DRIVE = 65547L; public static final long SAHPI_ENT_FAN = 65548L; public static final long SAHPI_ENT_POWER_DISTRIBUTION_UNIT = 65549L; public static final long SAHPI_ENT_SPEC_PROC_BLADE = 65550L; public static final long SAHPI_ENT_IO_SUBBOARD = 65551L; public static final long SAHPI_ENT_SBC_SUBBOARD = 65552L; public static final long SAHPI_ENT_ALARM_MANAGER = 65553L; public static final long SAHPI_ENT_SHELF_MANAGER = 65554L; public static final long SAHPI_ENT_DISPLAY_PANEL = 65555L; public static final long SAHPI_ENT_SUBBOARD_CARRIER_BLADE = 65556L; public static final long SAHPI_ENT_PHYSICAL_SLOT = 65557L; public static final long SAHPI_ENT_PICMG_FRONT_BLADE = 65558L; public static final long SAHPI_ENT_SYSTEM_INVENTORY_DEVICE = 65559L; public static final long SAHPI_ENT_FILTRATION_UNIT = 65560L; public static final long SAHPI_ENT_AMC = 65561L; public static final long SAHPI_ENT_BMC = 65584L; public static final long SAHPI_ENT_IPMC = 65585L; public static final long SAHPI_ENT_MMC = 65586L; public static final long SAHPI_ENT_SHMC = 65587L; public static final long SAHPI_ENT_CPLD = 65588L; public static final long SAHPI_ENT_EPLD = 65589L; public static final long SAHPI_ENT_FPGA = 65590L; public static final long SAHPI_ENT_DASD = 65591L; public static final long SAHPI_ENT_NIC = 65592L; public static final long SAHPI_ENT_DSP = 65593L; public static final long SAHPI_ENT_UCODE = 65594L; public static final long SAHPI_ENT_NPU = 65595L; public static final long SAHPI_ENT_OEM = 65596L; public static final long SAHPI_ENT_INTERFACE = 65597L; public static final long SAHPI_ENT_MICROTCA_CHASSIS = 65598L; public static final long SAHPI_ENT_CARRIER = 65599L; public static final long SAHPI_ENT_CARRIER_MANAGER = 65600L; public static final long SAHPI_ENT_CONFIG_DATA = 65601L; public static final long SAHPI_ENT_INDICATOR = 65602L; public static final long SAHPI_ENT_MAX_VALID = 65602L; public static final long SAHPI_TEMPERATURE = 1L; public static final long SAHPI_VOLTAGE = 2L; public static final long SAHPI_CURRENT = 3L; public static final long SAHPI_FAN = 4L; public static final long SAHPI_PHYSICAL_SECURITY = 5L; public static final long SAHPI_PLATFORM_VIOLATION = 6L; public static final long SAHPI_PROCESSOR = 7L; public static final long SAHPI_POWER_SUPPLY = 8L; public static final long SAHPI_POWER_UNIT = 9L; public static final long SAHPI_COOLING_DEVICE = 10L; public static final long SAHPI_OTHER_UNITS_BASED_SENSOR = 11L; public static final long SAHPI_MEMORY = 12L; public static final long SAHPI_DRIVE_SLOT = 13L; public static final long SAHPI_POST_MEMORY_RESIZE = 14L; public static final long SAHPI_SYSTEM_FW_PROGRESS = 15L; public static final long SAHPI_EVENT_LOGGING_DISABLED = 16L; public static final long SAHPI_RESERVED1 = 17L; public static final long SAHPI_SYSTEM_EVENT = 18L; public static final long SAHPI_CRITICAL_INTERRUPT = 19L; public static final long SAHPI_BUTTON = 20L; public static final long SAHPI_MODULE_BOARD = 21L; public static final long SAHPI_MICROCONTROLLER_COPROCESSOR = 22L; public static final long SAHPI_ADDIN_CARD = 23L; public static final long SAHPI_CHASSIS = 24L; public static final long SAHPI_CHIP_SET = 25L; public static final long SAHPI_OTHER_FRU = 26L; public static final long SAHPI_CABLE_INTERCONNECT = 27L; public static final long SAHPI_TERMINATOR = 28L; public static final long SAHPI_SYSTEM_BOOT_INITIATED = 29L; public static final long SAHPI_BOOT_ERROR = 30L; public static final long SAHPI_OS_BOOT = 31L; public static final long SAHPI_OS_CRITICAL_STOP = 32L; public static final long SAHPI_SLOT_CONNECTOR = 33L; public static final long SAHPI_SYSTEM_ACPI_POWER_STATE = 34L; public static final long SAHPI_RESERVED2 = 35L; public static final long SAHPI_PLATFORM_ALERT = 36L; public static final long SAHPI_ENTITY_PRESENCE = 37L; public static final long SAHPI_MONITOR_ASIC_IC = 38L; public static final long SAHPI_LAN = 39L; public static final long SAHPI_MANAGEMENT_SUBSYSTEM_HEALTH = 40L; public static final long SAHPI_BATTERY = 41L; public static final long SAHPI_SESSION_AUDIT = 42L; public static final long SAHPI_VERSION_CHANGE = 43L; public static final long SAHPI_OPERATIONAL = 160L; public static final long SAHPI_OEM_SENSOR = 192L; public static final long SAHPI_COMM_CHANNEL_LINK_STATE = 65537L; public static final long SAHPI_MANAGEMENT_BUS_STATE = 65538L; public static final long SAHPI_COMM_CHANNEL_BUS_STATE = 65539L; public static final long SAHPI_CONFIG_DATA = 65540L; public static final long SAHPI_POWER_BUDGET = 65541L; public static final long SAHPI_SENSOR_TYPE_MAX_VALID = 65541L; public static final long SAHPI_SENSOR_READING_TYPE_INT64 = 0L; public static final long SAHPI_SENSOR_READING_TYPE_UINT64 = 1L; public static final long SAHPI_SENSOR_READING_TYPE_FLOAT64 = 2L; public static final long SAHPI_SENSOR_READING_TYPE_BUFFER = 3L; public static final long SAHPI_SENSOR_READING_TYPE_MAX_VALID = 3L; public static final long SAHPI_SENS_ADD_EVENTS_TO_MASKS = 0L; public static final long SAHPI_SENS_REMOVE_EVENTS_FROM_MASKS = 1L; public static final long SAHPI_SENS_EVENT_MASK_ACTION_MAX_VALID = 1L; public static final long SAHPI_SU_UNSPECIFIED = 0L; public static final long SAHPI_SU_DEGREES_C = 1L; public static final long SAHPI_SU_DEGREES_F = 2L; public static final long SAHPI_SU_DEGREES_K = 3L; public static final long SAHPI_SU_VOLTS = 4L; public static final long SAHPI_SU_AMPS = 5L; public static final long SAHPI_SU_WATTS = 6L; public static final long SAHPI_SU_JOULES = 7L; public static final long SAHPI_SU_COULOMBS = 8L; public static final long SAHPI_SU_VA = 9L; public static final long SAHPI_SU_NITS = 10L; public static final long SAHPI_SU_LUMEN = 11L; public static final long SAHPI_SU_LUX = 12L; public static final long SAHPI_SU_CANDELA = 13L; public static final long SAHPI_SU_KPA = 14L; public static final long SAHPI_SU_PSI = 15L; public static final long SAHPI_SU_NEWTON = 16L; public static final long SAHPI_SU_CFM = 17L; public static final long SAHPI_SU_RPM = 18L; public static final long SAHPI_SU_HZ = 19L; public static final long SAHPI_SU_MICROSECOND = 20L; public static final long SAHPI_SU_MILLISECOND = 21L; public static final long SAHPI_SU_SECOND = 22L; public static final long SAHPI_SU_MINUTE = 23L; public static final long SAHPI_SU_HOUR = 24L; public static final long SAHPI_SU_DAY = 25L; public static final long SAHPI_SU_WEEK = 26L; public static final long SAHPI_SU_MIL = 27L; public static final long SAHPI_SU_INCHES = 28L; public static final long SAHPI_SU_FEET = 29L; public static final long SAHPI_SU_CU_IN = 30L; public static final long SAHPI_SU_CU_FEET = 31L; public static final long SAHPI_SU_MM = 32L; public static final long SAHPI_SU_CM = 33L; public static final long SAHPI_SU_M = 34L; public static final long SAHPI_SU_CU_CM = 35L; public static final long SAHPI_SU_CU_M = 36L; public static final long SAHPI_SU_LITERS = 37L; public static final long SAHPI_SU_FLUID_OUNCE = 38L; public static final long SAHPI_SU_RADIANS = 39L; public static final long SAHPI_SU_STERADIANS = 40L; public static final long SAHPI_SU_REVOLUTIONS = 41L; public static final long SAHPI_SU_CYCLES = 42L; public static final long SAHPI_SU_GRAVITIES = 43L; public static final long SAHPI_SU_OUNCE = 44L; public static final long SAHPI_SU_POUND = 45L; public static final long SAHPI_SU_FT_LB = 46L; public static final long SAHPI_SU_OZ_IN = 47L; public static final long SAHPI_SU_GAUSS = 48L; public static final long SAHPI_SU_GILBERTS = 49L; public static final long SAHPI_SU_HENRY = 50L; public static final long SAHPI_SU_MILLIHENRY = 51L; public static final long SAHPI_SU_FARAD = 52L; public static final long SAHPI_SU_MICROFARAD = 53L; public static final long SAHPI_SU_OHMS = 54L; public static final long SAHPI_SU_SIEMENS = 55L; public static final long SAHPI_SU_MOLE = 56L; public static final long SAHPI_SU_BECQUEREL = 57L; public static final long SAHPI_SU_PPM = 58L; public static final long SAHPI_SU_RESERVED = 59L; public static final long SAHPI_SU_DECIBELS = 60L; public static final long SAHPI_SU_DBA = 61L; public static final long SAHPI_SU_DBC = 62L; public static final long SAHPI_SU_GRAY = 63L; public static final long SAHPI_SU_SIEVERT = 64L; public static final long SAHPI_SU_COLOR_TEMP_DEG_K = 65L; public static final long SAHPI_SU_BIT = 66L; public static final long SAHPI_SU_KILOBIT = 67L; public static final long SAHPI_SU_MEGABIT = 68L; public static final long SAHPI_SU_GIGABIT = 69L; public static final long SAHPI_SU_BYTE = 70L; public static final long SAHPI_SU_KILOBYTE = 71L; public static final long SAHPI_SU_MEGABYTE = 72L; public static final long SAHPI_SU_GIGABYTE = 73L; public static final long SAHPI_SU_WORD = 74L; public static final long SAHPI_SU_DWORD = 75L; public static final long SAHPI_SU_QWORD = 76L; public static final long SAHPI_SU_LINE = 77L; public static final long SAHPI_SU_HIT = 78L; public static final long SAHPI_SU_MISS = 79L; public static final long SAHPI_SU_RETRY = 80L; public static final long SAHPI_SU_RESET = 81L; public static final long SAHPI_SU_OVERRUN = 82L; public static final long SAHPI_SU_UNDERRUN = 83L; public static final long SAHPI_SU_COLLISION = 84L; public static final long SAHPI_SU_PACKETS = 85L; public static final long SAHPI_SU_MESSAGES = 86L; public static final long SAHPI_SU_CHARACTERS = 87L; public static final long SAHPI_SU_ERRORS = 88L; public static final long SAHPI_SU_CORRECTABLE_ERRORS = 89L; public static final long SAHPI_SU_UNCORRECTABLE_ERRORS = 90L; public static final long SAHPI_SU_MAX_VALID = 90L; public static final long SAHPI_SMUU_NONE = 0L; public static final long SAHPI_SMUU_BASIC_OVER_MODIFIER = 1L; public static final long SAHPI_SMUU_BASIC_TIMES_MODIFIER = 2L; public static final long SAHPI_SMUU_MAX_VALID = 2L; public static final long SAHPI_SEC_PER_EVENT = 0L; public static final long SAHPI_SEC_READ_ONLY_MASKS = 1L; public static final long SAHPI_SEC_READ_ONLY = 2L; public static final long SAHPI_SEC_MAX_VALID = 2L; public static final long SAHPI_CTRL_TYPE_DIGITAL = 0L; public static final long SAHPI_CTRL_TYPE_DISCRETE = 1L; public static final long SAHPI_CTRL_TYPE_ANALOG = 2L; public static final long SAHPI_CTRL_TYPE_STREAM = 3L; public static final long SAHPI_CTRL_TYPE_TEXT = 4L; public static final long SAHPI_CTRL_TYPE_OEM = 192L; public static final long SAHPI_CTRL_TYPE_MAX_VALID = 192L; public static final long SAHPI_CTRL_STATE_OFF = 0L; public static final long SAHPI_CTRL_STATE_ON = 1L; public static final long SAHPI_CTRL_STATE_PULSE_OFF = 2L; public static final long SAHPI_CTRL_STATE_PULSE_ON = 3L; public static final long SAHPI_CTRL_STATE_MAX_VALID = 3L; public static final long SAHPI_CTRL_MODE_AUTO = 0L; public static final long SAHPI_CTRL_MODE_MANUAL = 1L; public static final long SAHPI_CTRL_MODE_MAX_VALID = 1L; public static final long SAHPI_CTRL_GENERIC = 0L; public static final long SAHPI_CTRL_LED = 1L; public static final long SAHPI_CTRL_FAN_SPEED = 2L; public static final long SAHPI_CTRL_DRY_CONTACT_CLOSURE = 3L; public static final long SAHPI_CTRL_POWER_SUPPLY_INHIBIT = 4L; public static final long SAHPI_CTRL_AUDIBLE = 5L; public static final long SAHPI_CTRL_FRONT_PANEL_LOCKOUT = 6L; public static final long SAHPI_CTRL_POWER_INTERLOCK = 7L; public static final long SAHPI_CTRL_POWER_STATE = 8L; public static final long SAHPI_CTRL_LCD_DISPLAY = 9L; public static final long SAHPI_CTRL_OEM = 10L; public static final long SAHPI_CTRL_GENERIC_ADDRESS = 11L; public static final long SAHPI_CTRL_IP_ADDRESS = 12L; public static final long SAHPI_CTRL_RESOURCE_ID = 13L; public static final long SAHPI_CTRL_POWER_BUDGET = 14L; public static final long SAHPI_CTRL_ACTIVATE = 15L; public static final long SAHPI_CTRL_RESET = 16L; public static final long SAHPI_CTRL_OUTPUT_TYPE_MAX_VALID = 16L; public static final long SAHPI_IDR_AREATYPE_INTERNAL_USE = 176L; public static final long SAHPI_IDR_AREATYPE_CHASSIS_INFO = 177L; public static final long SAHPI_IDR_AREATYPE_BOARD_INFO = 178L; public static final long SAHPI_IDR_AREATYPE_PRODUCT_INFO = 179L; public static final long SAHPI_IDR_AREATYPE_OEM = 192L; public static final long SAHPI_IDR_AREATYPE_UNSPECIFIED = 255L; public static final long SAHPI_IDR_AREATYPE_MAX_VALID = 255L; public static final long SAHPI_IDR_FIELDTYPE_CHASSIS_TYPE = 0L; public static final long SAHPI_IDR_FIELDTYPE_MFG_DATETIME = 1L; public static final long SAHPI_IDR_FIELDTYPE_MANUFACTURER = 2L; public static final long SAHPI_IDR_FIELDTYPE_PRODUCT_NAME = 3L; public static final long SAHPI_IDR_FIELDTYPE_PRODUCT_VERSION = 4L; public static final long SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER = 5L; public static final long SAHPI_IDR_FIELDTYPE_PART_NUMBER = 6L; public static final long SAHPI_IDR_FIELDTYPE_FILE_ID = 7L; public static final long SAHPI_IDR_FIELDTYPE_ASSET_TAG = 8L; public static final long SAHPI_IDR_FIELDTYPE_CUSTOM = 9L; public static final long SAHPI_IDR_FIELDTYPE_UNSPECIFIED = 255L; public static final long SAHPI_IDR_FIELDTYPE_MAX_VALID = 255L; public static final long SAHPI_WA_NO_ACTION = 0L; public static final long SAHPI_WA_RESET = 1L; public static final long SAHPI_WA_POWER_DOWN = 2L; public static final long SAHPI_WA_POWER_CYCLE = 3L; public static final long SAHPI_WA_MAX_VALID = 3L; public static final long SAHPI_WAE_NO_ACTION = 0L; public static final long SAHPI_WAE_RESET = 1L; public static final long SAHPI_WAE_POWER_DOWN = 2L; public static final long SAHPI_WAE_POWER_CYCLE = 3L; public static final long SAHPI_WAE_TIMER_INT = 8L; public static final long SAHPI_WAE_MAX_VALID = 8L; public static final long SAHPI_WPI_NONE = 0L; public static final long SAHPI_WPI_SMI = 1L; public static final long SAHPI_WPI_NMI = 2L; public static final long SAHPI_WPI_MESSAGE_INTERRUPT = 3L; public static final long SAHPI_WPI_OEM = 15L; public static final long SAHPI_WPI_MAX_VALID = 15L; public static final long SAHPI_WTU_NONE = 0L; public static final long SAHPI_WTU_BIOS_FRB2 = 1L; public static final long SAHPI_WTU_BIOS_POST = 2L; public static final long SAHPI_WTU_OS_LOAD = 3L; public static final long SAHPI_WTU_SMS_OS = 4L; public static final long SAHPI_WTU_OEM = 5L; public static final long SAHPI_WTU_UNSPECIFIED = 15L; public static final long SAHPI_WTU_MAX_VALID = 15L; public static final long SAHPI_DIMITEST_NONDEGRADING = 0L; public static final long SAHPI_DIMITEST_DEGRADING = 1L; public static final long SAHPI_DIMITEST_VENDOR_DEFINED_LEVEL = 2L; public static final long SAHPI_DIMITEST_SERVICE_IMPACT_MAX_VALID = 2L; public static final long SAHPI_DIMITEST_STATUS_NOT_RUN = 0L; public static final long SAHPI_DIMITEST_STATUS_FINISHED_NO_ERRORS = 1L; public static final long SAHPI_DIMITEST_STATUS_FINISHED_ERRORS = 2L; public static final long SAHPI_DIMITEST_STATUS_CANCELED = 3L; public static final long SAHPI_DIMITEST_STATUS_RUNNING = 4L; public static final long SAHPI_DIMITEST_STATUS_MAX_VALID = 4L; public static final long SAHPI_DIMITEST_STATUSERR_NOERR = 0L; public static final long SAHPI_DIMITEST_STATUSERR_RUNERR = 1L; public static final long SAHPI_DIMITEST_STATUSERR_UNDEF = 2L; public static final long SAHPI_DIMITEST_STATUSERR_MAX_VALID = 2L; public static final long SAHPI_DIMITEST_PARAM_TYPE_BOOLEAN = 0L; public static final long SAHPI_DIMITEST_PARAM_TYPE_INT32 = 1L; public static final long SAHPI_DIMITEST_PARAM_TYPE_FLOAT64 = 2L; public static final long SAHPI_DIMITEST_PARAM_TYPE_TEXT = 3L; public static final long SAHPI_DIMITEST_PARAM_TYPE_MAX_VALID = 3L; public static final long SAHPI_DIMI_READY = 0L; public static final long SAHPI_DIMI_WRONG_STATE = 1L; public static final long SAHPI_DIMI_BUSY = 2L; public static final long SAHPI_DIMI_READY_MAX_VALID = 2L; public static final long SAHPI_FUMI_SPEC_INFO_NONE = 0L; public static final long SAHPI_FUMI_SPEC_INFO_SAF_DEFINED = 1L; public static final long SAHPI_FUMI_SPEC_INFO_OEM_DEFINED = 2L; public static final long SAHPI_FUMI_SPEC_INFO_MAX_VALID = 2L; public static final long SAHPI_FUMI_SPEC_HPM1 = 0L; public static final long SAHPI_FUMI_SPEC_MAX_VALID = 0L; public static final long SAHPI_FUMI_PROCESS_NONDEGRADING = 0L; public static final long SAHPI_FUMI_PROCESS_DEGRADING = 1L; public static final long SAHPI_FUMI_PROCESS_VENDOR_DEFINED_IMPACT_LEVEL = 2L; public static final long SAHPI_FUMI_PROCESS_IMPACT_MAX_VALID = 2L; public static final long SAHPI_FUMI_SRC_VALID = 0L; public static final long SAHPI_FUMI_SRC_PROTOCOL_NOT_SUPPORTED = 1L; public static final long SAHPI_FUMI_SRC_UNREACHABLE = 2L; public static final long SAHPI_FUMI_SRC_VALIDATION_NOT_STARTED = 3L; public static final long SAHPI_FUMI_SRC_VALIDATION_INITIATED = 4L; public static final long SAHPI_FUMI_SRC_VALIDATION_FAIL = 5L; public static final long SAHPI_FUMI_SRC_TYPE_MISMATCH = 6L; public static final long SAHPI_FUMI_SRC_INVALID = 7L; public static final long SAHPI_FUMI_SRC_VALIDITY_UNKNOWN = 8L; public static final long SAHPI_FUMI_SRC_STATUS_MAX_VALID = 8L; public static final long SAHPI_FUMI_BANK_VALID = 0L; public static final long SAHPI_FUMI_BANK_UPGRADE_IN_PROGRESS = 1L; public static final long SAHPI_FUMI_BANK_CORRUPTED = 2L; public static final long SAHPI_FUMI_BANK_ACTIVE = 3L; public static final long SAHPI_FUMI_BANK_BUSY = 4L; public static final long SAHPI_FUMI_BANK_UNKNOWN = 5L; public static final long SAHPI_FUMI_BANK_STATE_MAX_VALID = 5L; public static final long SAHPI_FUMI_OPERATION_NOTSTARTED = 0L; public static final long SAHPI_FUMI_SOURCE_VALIDATION_INITIATED = 1L; public static final long SAHPI_FUMI_SOURCE_VALIDATION_FAILED = 2L; public static final long SAHPI_FUMI_SOURCE_VALIDATION_DONE = 3L; public static final long SAHPI_FUMI_SOURCE_VALIDATION_CANCELLED = 4L; public static final long SAHPI_FUMI_INSTALL_INITIATED = 5L; public static final long SAHPI_FUMI_INSTALL_FAILED_ROLLBACK_NEEDED = 6L; public static final long SAHPI_FUMI_INSTALL_FAILED_ROLLBACK_INITIATED = 7L; public static final long SAHPI_FUMI_INSTALL_FAILED_ROLLBACK_NOT_POSSIBLE = 8L; public static final long SAHPI_FUMI_INSTALL_DONE = 9L; public static final long SAHPI_FUMI_INSTALL_CANCELLED = 10L; public static final long SAHPI_FUMI_ROLLBACK_INITIATED = 11L; public static final long SAHPI_FUMI_ROLLBACK_FAILED = 12L; public static final long SAHPI_FUMI_ROLLBACK_DONE = 13L; public static final long SAHPI_FUMI_ROLLBACK_CANCELLED = 14L; public static final long SAHPI_FUMI_BACKUP_INITIATED = 15L; public static final long SAHPI_FUMI_BACKUP_FAILED = 16L; public static final long SAHPI_FUMI_BACKUP_DONE = 17L; public static final long SAHPI_FUMI_BACKUP_CANCELLED = 18L; public static final long SAHPI_FUMI_BANK_COPY_INITIATED = 19L; public static final long SAHPI_FUMI_BANK_COPY_FAILED = 20L; public static final long SAHPI_FUMI_BANK_COPY_DONE = 21L; public static final long SAHPI_FUMI_BANK_COPY_CANCELLED = 22L; public static final long SAHPI_FUMI_TARGET_VERIFY_INITIATED = 23L; public static final long SAHPI_FUMI_TARGET_VERIFY_FAILED = 24L; public static final long SAHPI_FUMI_TARGET_VERIFY_DONE = 25L; public static final long SAHPI_FUMI_TARGET_VERIFY_CANCELLED = 26L; public static final long SAHPI_FUMI_ACTIVATE_INITIATED = 27L; public static final long SAHPI_FUMI_ACTIVATE_FAILED_ROLLBACK_NEEDED = 28L; public static final long SAHPI_FUMI_ACTIVATE_FAILED_ROLLBACK_INITIATED = 29L; public static final long SAHPI_FUMI_ACTIVATE_FAILED_ROLLBACK_NOT_POSSIBLE = 30L; public static final long SAHPI_FUMI_ACTIVATE_DONE = 31L; public static final long SAHPI_FUMI_ACTIVATE_CANCELLED = 32L; public static final long SAHPI_FUMI_UPGRADE_STATUS_MAX_VALID = 32L; public static final long SAHPI_HS_INDICATOR_OFF = 0L; public static final long SAHPI_HS_INDICATOR_ON = 1L; public static final long SAHPI_HS_INDICATOR_STATE_MAX_VALID = 1L; public static final long SAHPI_HS_ACTION_INSERTION = 0L; public static final long SAHPI_HS_ACTION_EXTRACTION = 1L; public static final long SAHPI_HS_ACTION_MAX_VALID = 1L; public static final long SAHPI_HS_STATE_INACTIVE = 0L; public static final long SAHPI_HS_STATE_INSERTION_PENDING = 1L; public static final long SAHPI_HS_STATE_ACTIVE = 2L; public static final long SAHPI_HS_STATE_EXTRACTION_PENDING = 3L; public static final long SAHPI_HS_STATE_NOT_PRESENT = 4L; public static final long SAHPI_HS_STATE_MAX_VALID = 4L; public static final long SAHPI_HS_CAUSE_AUTO_POLICY = 0L; public static final long SAHPI_HS_CAUSE_EXT_SOFTWARE = 1L; public static final long SAHPI_HS_CAUSE_OPERATOR_INIT = 2L; public static final long SAHPI_HS_CAUSE_USER_UPDATE = 3L; public static final long SAHPI_HS_CAUSE_UNEXPECTED_DEACTIVATION = 4L; public static final long SAHPI_HS_CAUSE_SURPRISE_EXTRACTION = 5L; public static final long SAHPI_HS_CAUSE_EXTRACTION_UPDATE = 6L; public static final long SAHPI_HS_CAUSE_HARDWARE_FAULT = 7L; public static final long SAHPI_HS_CAUSE_CONTAINING_FRU = 8L; public static final long SAHPI_HS_CAUSE_UNKNOWN = 65535L; public static final long SAHPI_HS_CAUSE_MAX_VALID = 65535L; public static final long SAHPI_CRITICAL = 0L; public static final long SAHPI_MAJOR = 1L; public static final long SAHPI_MINOR = 2L; public static final long SAHPI_INFORMATIONAL = 3L; public static final long SAHPI_OK = 4L; public static final long SAHPI_DEBUG = 240L; public static final long SAHPI_ALL_SEVERITIES = 255L; public static final long SAHPI_SEVERITY_MAX_VALID = 240L; public static final long SAHPI_RESE_RESOURCE_FAILURE = 0L; public static final long SAHPI_RESE_RESOURCE_RESTORED = 1L; public static final long SAHPI_RESE_RESOURCE_ADDED = 2L; public static final long SAHPI_RESE_RESOURCE_REMOVED = 3L; public static final long SAHPI_RESE_RESOURCE_INACCESSIBLE = 4L; public static final long SAHPI_RESE_RESOURCE_UPDATED = 5L; public static final long SAHPI_RESE_TYPE_MAX_VALID = 5L; public static final long SAHPI_DOMAIN_REF_ADDED = 0L; public static final long SAHPI_DOMAIN_REF_REMOVED = 1L; public static final long SAHPI_DOMAIN_EVENT_TYPE_MAX_VALID = 1L; public static final long SAHPI_HPIE_AUDIT = 0L; public static final long SAHPI_HPIE_STARTUP = 1L; public static final long SAHPI_HPIE_OTHER = 2L; public static final long SAHPI_HPIE_TYPE_MAX_VALID = 2L; public static final long SAHPI_ET_RESOURCE = 0L; public static final long SAHPI_ET_DOMAIN = 1L; public static final long SAHPI_ET_SENSOR = 2L; public static final long SAHPI_ET_SENSOR_ENABLE_CHANGE = 3L; public static final long SAHPI_ET_HOTSWAP = 4L; public static final long SAHPI_ET_WATCHDOG = 5L; public static final long SAHPI_ET_HPI_SW = 6L; public static final long SAHPI_ET_OEM = 7L; public static final long SAHPI_ET_USER = 8L; public static final long SAHPI_ET_DIMI = 9L; public static final long SAHPI_ET_DIMI_UPDATE = 10L; public static final long SAHPI_ET_FUMI = 11L; public static final long SAHPI_ET_MAX_VALID = 11L; public static final long SAHPI_STATUS_COND_TYPE_SENSOR = 0L; public static final long SAHPI_STATUS_COND_TYPE_RESOURCE = 1L; public static final long SAHPI_STATUS_COND_TYPE_OEM = 2L; public static final long SAHPI_STATUS_COND_TYPE_USER = 3L; public static final long SAHPI_STATUS_COND_TYPE_MAX_VALID = 3L; public static final long SAHPI_ANNUNCIATOR_MODE_AUTO = 0L; public static final long SAHPI_ANNUNCIATOR_MODE_USER = 1L; public static final long SAHPI_ANNUNCIATOR_MODE_SHARED = 2L; public static final long SAHPI_ANNUNCIATOR_MODE_MAX_VALID = 2L; public static final long SAHPI_ANNUNCIATOR_TYPE_LED = 0L; public static final long SAHPI_ANNUNCIATOR_TYPE_DRY_CONTACT_CLOSURE = 1L; public static final long SAHPI_ANNUNCIATOR_TYPE_AUDIBLE = 2L; public static final long SAHPI_ANNUNCIATOR_TYPE_LCD_DISPLAY = 3L; public static final long SAHPI_ANNUNCIATOR_TYPE_MESSAGE = 4L; public static final long SAHPI_ANNUNCIATOR_TYPE_COMPOSITE = 5L; public static final long SAHPI_ANNUNCIATOR_TYPE_OEM = 6L; public static final long SAHPI_ANNUNCIATOR_TYPE_MAX_VALID = 6L; public static final long SAHPI_NO_RECORD = 0L; public static final long SAHPI_CTRL_RDR = 1L; public static final long SAHPI_SENSOR_RDR = 2L; public static final long SAHPI_INVENTORY_RDR = 3L; public static final long SAHPI_WATCHDOG_RDR = 4L; public static final long SAHPI_ANNUNCIATOR_RDR = 5L; public static final long SAHPI_DIMI_RDR = 6L; public static final long SAHPI_FUMI_RDR = 7L; public static final long SAHPI_RDR_TYPE_MAX_VALID = 7L; public static final long SAHPI_DEFAULT_PARM = 0L; public static final long SAHPI_SAVE_PARM = 1L; public static final long SAHPI_RESTORE_PARM = 2L; public static final long SAHPI_PARM_ACTION_MAX_VALID = 2L; public static final long SAHPI_COLD_RESET = 0L; public static final long SAHPI_WARM_RESET = 1L; public static final long SAHPI_RESET_ASSERT = 2L; public static final long SAHPI_RESET_DEASSERT = 3L; public static final long SAHPI_RESET_MAX_VALID = 3L; public static final long SAHPI_POWER_OFF = 0L; public static final long SAHPI_POWER_ON = 1L; public static final long SAHPI_POWER_CYCLE = 2L; public static final long SAHPI_POWER_STATE_MAX_VALID = 2L; public static final long SAHPI_EL_OVERFLOW_DROP = 0L; public static final long SAHPI_EL_OVERFLOW_OVERWRITE = 1L; public static final long SAHPI_EL_OVERFLOW_ACTION_MAX_TYPE = 1L; public static final long ATCAHPI_LED_COLOR_RESERVED = 0L; public static final long ATCAHPI_LED_COLOR_BLUE = 1L; public static final long ATCAHPI_LED_COLOR_RED = 2L; public static final long ATCAHPI_LED_COLOR_GREEN = 3L; public static final long ATCAHPI_LED_COLOR_AMBER = 4L; public static final long ATCAHPI_LED_COLOR_ORANGE = 5L; public static final long ATCAHPI_LED_COLOR_WHITE = 6L; public static final long ATCAHPI_LED_COLOR_NO_CHANGE = 14L; public static final long ATCAHPI_LED_COLOR_USE_DEFAULT = 15L; public static final long ATCAHPI_LED_AUTO = 0L; public static final long ATCAHPI_LED_MANUAL = 1L; public static final long ATCAHPI_LED_LAMP_TEST = 2L; public static final long ATCAHPI_LED_BR_SUPPORTED = 0L; public static final long ATCAHPI_LED_BR_NOT_SUPPORTED = 1L; public static final long ATCAHPI_LED_BR_UNKNOWN = 2L; public static final long XTCAHPI_LED_COLOR_RESERVED = 0L; public static final long XTCAHPI_LED_COLOR_BLUE = 1L; public static final long XTCAHPI_LED_COLOR_RED = 2L; public static final long XTCAHPI_LED_COLOR_GREEN = 3L; public static final long XTCAHPI_LED_COLOR_AMBER = 4L; public static final long XTCAHPI_LED_COLOR_ORANGE = 5L; public static final long XTCAHPI_LED_COLOR_WHITE = 6L; public static final long XTCAHPI_LED_COLOR_NO_CHANGE = 14L; public static final long XTCAHPI_LED_COLOR_USE_DEFAULT = 15L; public static final long XTCAHPI_LED_AUTO = 0L; public static final long XTCAHPI_LED_MANUAL = 1L; public static final long XTCAHPI_LED_LAMP_TEST = 2L; public static final long XTCAHPI_LED_BR_SUPPORTED = 0L; public static final long XTCAHPI_LED_BR_NOT_SUPPORTED = 1L; public static final long XTCAHPI_LED_BR_UNKNOWN = 2L; public static final long SA_ERR_HPI_OK = 0L; /********************************************************** * HPI Simple Data Types Map *********************************************************/ /********************************************************** * SaHpiUint8T : long * SaHpiUint16T : long * SaHpiUint32T : long * SaHpiUint64T : long * SaHpiInt8T : long * SaHpiInt16T : long * SaHpiInt32T : long * SaHpiInt64T : long * Enum : long * SaHpiFloat64T : double * SaHpiBoolT : long * SaHpiManufacturerIdT : long * SaHpiVersionT : long * SaErrorT : long * SaHpiDomainIdT : long * SaHpiSessionIdT : long * SaHpiResourceIdT : long * SaHpiEntryIdT : long * SaHpiTimeT : long * SaHpiTimeoutT : long * SaHpiInstrumentIdT : long * SaHpiEntityLocationT : long * SaHpiEventCategoryT : long * SaHpiEventStateT : long * SaHpiSensorNumT : long * SaHpiSensorRangeFlagsT : long * SaHpiSensorThdMaskT : long * SaHpiCtrlNumT : long * SaHpiCtrlStateDiscreteT : long * SaHpiCtrlStateAnalogT : long * SaHpiTxtLineNumT : long * SaHpiIdrIdT : long * SaHpiWatchdogNumT : long * SaHpiWatchdogExpFlagsT : long * SaHpiDimiNumT : long * SaHpiDimiTestCapabilityT : long * SaHpiDimiTestNumT : long * SaHpiDimiTestPercentCompletedT : long * SaHpiFumiNumT : long * SaHpiBankNumT : long * SaHpiFumiLogicalBankStateFlagsT : long * SaHpiFumiProtocolT : long * SaHpiFumiCapabilityT : long * SaHpiSensorOptionalDataT : long * SaHpiSensorEnableOptDataT : long * SaHpiEvtQueueStatusT : long * SaHpiAnnunciatorNumT : long * SaHpiLoadNumberT : long * SaHpiCapabilitiesT : long * SaHpiHsCapabilitiesT : long * SaHpiDomainCapabilitiesT : long * SaHpiAlarmIdT : long * SaHpiEventLogCapabilitiesT : long * SaHpiEventLogEntryIdT : long * AtcaHpiColorCapabilitiesT : long * AtcaHpiEntityTypeT : long * AtcaHpiCsCurrentPwrState : long * AtcaHpiCsLastPwrEvent : long * AtcaHpiCsMiscChassisState : long * AtcaHpiCsFpButtonCap : long * XtcaHpiCsCurrentPwrState : long * XtcaHpiCsLastPwrEvent : long * XtcaHpiCsMiscChassisState : long * XtcaHpiCsFpButtonCap : long * XtcaHpiColorCapabilitiesT : long * SaHpiLanguageT : long * SaHpiTextTypeT : long * SaHpiEntityTypeT : long * SaHpiSensorTypeT : long * SaHpiSensorReadingTypeT : long * SaHpiSensorEventMaskActionT : long * SaHpiSensorUnitsT : long * SaHpiSensorModUnitUseT : long * SaHpiSensorEventCtrlT : long * SaHpiCtrlTypeT : long * SaHpiCtrlStateDigitalT : long * SaHpiCtrlModeT : long * SaHpiCtrlOutputTypeT : long * SaHpiIdrAreaTypeT : long * SaHpiIdrFieldTypeT : long * SaHpiWatchdogActionT : long * SaHpiWatchdogActionEventT : long * SaHpiWatchdogPretimerInterruptT : long * SaHpiWatchdogTimerUseT : long * SaHpiDimiTestServiceImpactT : long * SaHpiDimiTestRunStatusT : long * SaHpiDimiTestErrCodeT : long * SaHpiDimiTestParamTypeT : long * SaHpiDimiReadyT : long * SaHpiFumiSpecInfoTypeT : long * SaHpiFumiSafDefinedSpecIdT : long * SaHpiFumiServiceImpactT : long * SaHpiFumiSourceStatusT : long * SaHpiFumiBankStateT : long * SaHpiFumiUpgradeStatusT : long * SaHpiHsIndicatorStateT : long * SaHpiHsActionT : long * SaHpiHsStateT : long * SaHpiHsCauseOfStateChangeT : long * SaHpiSeverityT : long * SaHpiResourceEventTypeT : long * SaHpiDomainEventTypeT : long * SaHpiSwEventTypeT : long * SaHpiEventTypeT : long * SaHpiStatusCondTypeT : long * SaHpiAnnunciatorModeT : long * SaHpiAnnunciatorTypeT : long * SaHpiRdrTypeT : long * SaHpiParmActionT : long * SaHpiResetActionT : long * SaHpiPowerStateT : long * SaHpiEventLogOverflowActionT : long * AtcaHpiLedColorT : long * AtcaHpiResourceLedModeT : long * AtcaHpiLedBrSupportT : long * XtcaHpiLedColorT : long * XtcaHpiResourceLedModeT : long * XtcaHpiLedBrSupportT : long * SaHpiUint8T[] : byte[] *********************************************************/ /********************************************************** * HPI Complex Data Types *********************************************************/ /** * struct SaHpiTextBufferT */ public static class SaHpiTextBufferT { public long DataType; public long Language; public long DataLength; // Byte[SAHPI_MAX_TEXT_BUFFER_LENGTH] public byte[] Data; }; /** * struct SaHpiEntityT */ public static class SaHpiEntityT { public long EntityType; public long EntityLocation; }; /** * struct SaHpiEntityPathT */ public static class SaHpiEntityPathT { // SaHpiEntityT[SAHPI_MAX_ENTITY_PATH] public SaHpiEntityT[] Entry; }; /** * union SaHpiSensorReadingUnionT */ public static class SaHpiSensorReadingUnionT { public long SensorInt64; public long SensorUint64; public double SensorFloat64; // Byte[SAHPI_SENSOR_BUFFER_LENGTH] public byte[] SensorBuffer; }; /** * struct SaHpiSensorReadingT */ public static class SaHpiSensorReadingT { public long IsSupported; public long Type; public SaHpiSensorReadingUnionT Value; }; /** * struct SaHpiSensorThresholdsT */ public static class SaHpiSensorThresholdsT { public SaHpiSensorReadingT LowCritical; public SaHpiSensorReadingT LowMajor; public SaHpiSensorReadingT LowMinor; public SaHpiSensorReadingT UpCritical; public SaHpiSensorReadingT UpMajor; public SaHpiSensorReadingT UpMinor; public SaHpiSensorReadingT PosThdHysteresis; public SaHpiSensorReadingT NegThdHysteresis; }; /** * struct SaHpiSensorRangeT */ public static class SaHpiSensorRangeT { public long Flags; public SaHpiSensorReadingT Max; public SaHpiSensorReadingT Min; public SaHpiSensorReadingT Nominal; public SaHpiSensorReadingT NormalMax; public SaHpiSensorReadingT NormalMin; }; /** * struct SaHpiSensorDataFormatT */ public static class SaHpiSensorDataFormatT { public long IsSupported; public long ReadingType; public long BaseUnits; public long ModifierUnits; public long ModifierUse; public long Percentage; public SaHpiSensorRangeT Range; public double AccuracyFactor; }; /** * struct SaHpiSensorThdDefnT */ public static class SaHpiSensorThdDefnT { public long IsAccessible; public long ReadThold; public long WriteThold; public long Nonlinear; }; /** * struct SaHpiSensorRecT */ public static class SaHpiSensorRecT { public long Num; public long Type; public long Category; public long EnableCtrl; public long EventCtrl; public long Events; public SaHpiSensorDataFormatT DataFormat; public SaHpiSensorThdDefnT ThresholdDefn; public long Oem; }; /** * struct SaHpiCtrlStateStreamT */ public static class SaHpiCtrlStateStreamT { public long Repeat; public long StreamLength; // Byte[SAHPI_CTRL_MAX_STREAM_LENGTH] public byte[] Stream; }; /** * struct SaHpiCtrlStateTextT */ public static class SaHpiCtrlStateTextT { public long Line; public SaHpiTextBufferT Text; }; /** * struct SaHpiCtrlStateOemT */ public static class SaHpiCtrlStateOemT { public long MId; public long BodyLength; // Byte[SAHPI_CTRL_MAX_OEM_BODY_LENGTH] public byte[] Body; }; /** * union SaHpiCtrlStateUnionT */ public static class SaHpiCtrlStateUnionT { public long Digital; public long Discrete; public long Analog; public SaHpiCtrlStateStreamT Stream; public SaHpiCtrlStateTextT Text; public SaHpiCtrlStateOemT Oem; }; /** * struct SaHpiCtrlStateT */ public static class SaHpiCtrlStateT { public long Type; public SaHpiCtrlStateUnionT StateUnion; }; /** * struct SaHpiCtrlRecDigitalT */ public static class SaHpiCtrlRecDigitalT { public long Default; }; /** * struct SaHpiCtrlRecDiscreteT */ public static class SaHpiCtrlRecDiscreteT { public long Default; }; /** * struct SaHpiCtrlRecAnalogT */ public static class SaHpiCtrlRecAnalogT { public long Min; public long Max; public long Default; }; /** * struct SaHpiCtrlRecStreamT */ public static class SaHpiCtrlRecStreamT { public SaHpiCtrlStateStreamT Default; }; /** * struct SaHpiCtrlRecTextT */ public static class SaHpiCtrlRecTextT { public long MaxChars; public long MaxLines; public long Language; public long DataType; public SaHpiCtrlStateTextT Default; }; /** * struct SaHpiCtrlRecOemT */ public static class SaHpiCtrlRecOemT { public long MId; // Byte[SAHPI_CTRL_OEM_CONFIG_LENGTH] public byte[] ConfigData; public SaHpiCtrlStateOemT Default; }; /** * union SaHpiCtrlRecUnionT */ public static class SaHpiCtrlRecUnionT { public SaHpiCtrlRecDigitalT Digital; public SaHpiCtrlRecDiscreteT Discrete; public SaHpiCtrlRecAnalogT Analog; public SaHpiCtrlRecStreamT Stream; public SaHpiCtrlRecTextT Text; public SaHpiCtrlRecOemT Oem; }; /** * struct SaHpiCtrlDefaultModeT */ public static class SaHpiCtrlDefaultModeT { public long Mode; public long ReadOnly; }; /** * struct SaHpiCtrlRecT */ public static class SaHpiCtrlRecT { public long Num; public long OutputType; public long Type; public SaHpiCtrlRecUnionT TypeUnion; public SaHpiCtrlDefaultModeT DefaultMode; public long WriteOnly; public long Oem; }; /** * struct SaHpiIdrFieldT */ public static class SaHpiIdrFieldT { public long AreaId; public long FieldId; public long Type; public long ReadOnly; public SaHpiTextBufferT Field; }; /** * struct SaHpiIdrAreaHeaderT */ public static class SaHpiIdrAreaHeaderT { public long AreaId; public long Type; public long ReadOnly; public long NumFields; }; /** * struct SaHpiIdrInfoT */ public static class SaHpiIdrInfoT { public long IdrId; public long UpdateCount; public long ReadOnly; public long NumAreas; }; /** * struct SaHpiInventoryRecT */ public static class SaHpiInventoryRecT { public long IdrId; public long Persistent; public long Oem; }; /** * struct SaHpiWatchdogT */ public static class SaHpiWatchdogT { public long Log; public long Running; public long TimerUse; public long TimerAction; public long PretimerInterrupt; public long PreTimeoutInterval; public long TimerUseExpFlags; public long InitialCount; public long PresentCount; }; /** * struct SaHpiWatchdogRecT */ public static class SaHpiWatchdogRecT { public long WatchdogNum; public long Oem; }; /** * struct SaHpiDimiTestAffectedEntityT */ public static class SaHpiDimiTestAffectedEntityT { public SaHpiEntityPathT EntityImpacted; public long ServiceImpact; }; /** * struct SaHpiDimiTestResultsT */ public static class SaHpiDimiTestResultsT { public long ResultTimeStamp; public long RunDuration; public long LastRunStatus; public long TestErrorCode; public SaHpiTextBufferT TestResultString; public long TestResultStringIsURI; }; /** * union SaHpiDimiTestParamValueT */ public static class SaHpiDimiTestParamValueT { public long paramint; public long parambool; public double paramfloat; public SaHpiTextBufferT paramtext; }; /** * union SaHpiDimiTestParameterValueUnionT */ public static class SaHpiDimiTestParameterValueUnionT { public long IntValue; public double FloatValue; }; /** * struct SaHpiDimiTestParamsDefinitionT */ public static class SaHpiDimiTestParamsDefinitionT { // Byte[SAHPI_DIMITEST_PARAM_NAME_LEN] public byte[] ParamName; public SaHpiTextBufferT ParamInfo; public long ParamType; public SaHpiDimiTestParameterValueUnionT MinValue; public SaHpiDimiTestParameterValueUnionT MaxValue; public SaHpiDimiTestParamValueT DefaultParam; }; /** * struct SaHpiDimiTestT */ public static class SaHpiDimiTestT { public SaHpiTextBufferT TestName; public long ServiceImpact; // SaHpiDimiTestAffectedEntityT[SAHPI_DIMITEST_MAX_ENTITIESIMPACTED] public SaHpiDimiTestAffectedEntityT[] EntitiesImpacted; public long NeedServiceOS; public SaHpiTextBufferT ServiceOS; public long ExpectedRunDuration; public long TestCapabilities; // SaHpiDimiTestParamsDefinitionT[SAHPI_DIMITEST_MAX_PARAMETERS] public SaHpiDimiTestParamsDefinitionT[] TestParameters; }; /** * struct SaHpiDimiTestVariableParamsT */ public static class SaHpiDimiTestVariableParamsT { // Byte[SAHPI_DIMITEST_PARAM_NAME_LEN] public byte[] ParamName; public long ParamType; public SaHpiDimiTestParamValueT Value; }; /** * struct SaHpiDimiInfoT */ public static class SaHpiDimiInfoT { public long NumberOfTests; public long TestNumUpdateCounter; }; /** * struct SaHpiDimiRecT */ public static class SaHpiDimiRecT { public long DimiNum; public long Oem; }; /** * struct SaHpiFumiSafDefinedSpecInfoT */ public static class SaHpiFumiSafDefinedSpecInfoT { public long SpecID; public long RevisionID; }; /** * struct SaHpiFumiOemDefinedSpecInfoT */ public static class SaHpiFumiOemDefinedSpecInfoT { public long Mid; public long BodyLength; // Byte[SAHPI_FUMI_MAX_OEM_BODY_LENGTH] public byte[] Body; }; /** * union SaHpiFumiSpecInfoTypeUnionT */ public static class SaHpiFumiSpecInfoTypeUnionT { public SaHpiFumiSafDefinedSpecInfoT SafDefined; public SaHpiFumiOemDefinedSpecInfoT OemDefined; }; /** * struct SaHpiFumiSpecInfoT */ public static class SaHpiFumiSpecInfoT { public long SpecInfoType; public SaHpiFumiSpecInfoTypeUnionT SpecInfoTypeUnion; }; /** * struct SaHpiFumiFirmwareInstanceInfoT */ public static class SaHpiFumiFirmwareInstanceInfoT { public long InstancePresent; public SaHpiTextBufferT Identifier; public SaHpiTextBufferT Description; public SaHpiTextBufferT DateTime; public long MajorVersion; public long MinorVersion; public long AuxVersion; }; /** * struct SaHpiFumiImpactedEntityT */ public static class SaHpiFumiImpactedEntityT { public SaHpiEntityPathT ImpactedEntity; public long ServiceImpact; }; /** * struct SaHpiFumiServiceImpactDataT */ public static class SaHpiFumiServiceImpactDataT { public long NumEntities; // SaHpiFumiImpactedEntityT[SAHPI_FUMI_MAX_ENTITIES_IMPACTED] public SaHpiFumiImpactedEntityT[] ImpactedEntities; }; /** * struct SaHpiFumiSourceInfoT */ public static class SaHpiFumiSourceInfoT { public SaHpiTextBufferT SourceUri; public long SourceStatus; public SaHpiTextBufferT Identifier; public SaHpiTextBufferT Description; public SaHpiTextBufferT DateTime; public long MajorVersion; public long MinorVersion; public long AuxVersion; }; /** * struct SaHpiFumiComponentInfoT */ public static class SaHpiFumiComponentInfoT { public long EntryId; public long ComponentId; public SaHpiFumiFirmwareInstanceInfoT MainFwInstance; public long ComponentFlags; }; /** * struct SaHpiFumiBankInfoT */ public static class SaHpiFumiBankInfoT { public long BankId; public long BankSize; public long Position; public long BankState; public SaHpiTextBufferT Identifier; public SaHpiTextBufferT Description; public SaHpiTextBufferT DateTime; public long MajorVersion; public long MinorVersion; public long AuxVersion; }; /** * struct SaHpiFumiLogicalBankInfoT */ public static class SaHpiFumiLogicalBankInfoT { public long FirmwarePersistentLocationCount; public long BankStateFlags; public SaHpiFumiFirmwareInstanceInfoT PendingFwInstance; public SaHpiFumiFirmwareInstanceInfoT RollbackFwInstance; }; /** * struct SaHpiFumiLogicalComponentInfoT */ public static class SaHpiFumiLogicalComponentInfoT { public long EntryId; public long ComponentId; public SaHpiFumiFirmwareInstanceInfoT PendingFwInstance; public SaHpiFumiFirmwareInstanceInfoT RollbackFwInstance; public long ComponentFlags; }; /** * struct SaHpiFumiRecT */ public static class SaHpiFumiRecT { public long Num; public long AccessProt; public long Capability; public long NumBanks; public long Oem; }; /** * struct SaHpiResourceEventT */ public static class SaHpiResourceEventT { public long ResourceEventType; }; /** * struct SaHpiDomainEventT */ public static class SaHpiDomainEventT { public long Type; public long DomainId; }; /** * struct SaHpiSensorEventT */ public static class SaHpiSensorEventT { public long SensorNum; public long SensorType; public long EventCategory; public long Assertion; public long EventState; public long OptionalDataPresent; public SaHpiSensorReadingT TriggerReading; public SaHpiSensorReadingT TriggerThreshold; public long PreviousState; public long CurrentState; public long Oem; public long SensorSpecific; }; /** * struct SaHpiSensorEnableChangeEventT */ public static class SaHpiSensorEnableChangeEventT { public long SensorNum; public long SensorType; public long EventCategory; public long SensorEnable; public long SensorEventEnable; public long AssertEventMask; public long DeassertEventMask; public long OptionalDataPresent; public long CurrentState; public long CriticalAlarms; public long MajorAlarms; public long MinorAlarms; }; /** * struct SaHpiHotSwapEventT */ public static class SaHpiHotSwapEventT { public long HotSwapState; public long PreviousHotSwapState; public long CauseOfStateChange; }; /** * struct SaHpiWatchdogEventT */ public static class SaHpiWatchdogEventT { public long WatchdogNum; public long WatchdogAction; public long WatchdogPreTimerAction; public long WatchdogUse; }; /** * struct SaHpiHpiSwEventT */ public static class SaHpiHpiSwEventT { public long MId; public long Type; public SaHpiTextBufferT EventData; }; /** * struct SaHpiOemEventT */ public static class SaHpiOemEventT { public long MId; public SaHpiTextBufferT OemEventData; }; /** * struct SaHpiUserEventT */ public static class SaHpiUserEventT { public SaHpiTextBufferT UserEventData; }; /** * struct SaHpiDimiEventT */ public static class SaHpiDimiEventT { public long DimiNum; public long TestNum; public long DimiTestRunStatus; public long DimiTestPercentCompleted; }; /** * struct SaHpiDimiUpdateEventT */ public static class SaHpiDimiUpdateEventT { public long DimiNum; }; /** * struct SaHpiFumiEventT */ public static class SaHpiFumiEventT { public long FumiNum; public long BankNum; public long UpgradeStatus; }; /** * union SaHpiEventUnionT */ public static class SaHpiEventUnionT { public SaHpiResourceEventT ResourceEvent; public SaHpiDomainEventT DomainEvent; public SaHpiSensorEventT SensorEvent; public SaHpiSensorEnableChangeEventT SensorEnableChangeEvent; public SaHpiHotSwapEventT HotSwapEvent; public SaHpiWatchdogEventT WatchdogEvent; public SaHpiHpiSwEventT HpiSwEvent; public SaHpiOemEventT OemEvent; public SaHpiUserEventT UserEvent; public SaHpiDimiEventT DimiEvent; public SaHpiDimiUpdateEventT DimiUpdateEvent; public SaHpiFumiEventT FumiEvent; }; /** * struct SaHpiEventT */ public static class SaHpiEventT { public long Source; public long EventType; public long Timestamp; public long Severity; public SaHpiEventUnionT EventDataUnion; }; /** * struct SaHpiNameT */ public static class SaHpiNameT { public long Length; // Byte[SA_HPI_MAX_NAME_LENGTH] public byte[] Value; }; /** * struct SaHpiConditionT */ public static class SaHpiConditionT { public long Type; public SaHpiEntityPathT Entity; public long DomainId; public long ResourceId; public long SensorNum; public long EventState; public SaHpiNameT Name; public long Mid; public SaHpiTextBufferT Data; }; /** * struct SaHpiAnnouncementT */ public static class SaHpiAnnouncementT { public long EntryId; public long Timestamp; public long AddedByUser; public long Severity; public long Acknowledged; public SaHpiConditionT StatusCond; }; /** * struct SaHpiAnnunciatorRecT */ public static class SaHpiAnnunciatorRecT { public long AnnunciatorNum; public long AnnunciatorType; public long ModeReadOnly; public long MaxConditions; public long Oem; }; /** * union SaHpiRdrTypeUnionT */ public static class SaHpiRdrTypeUnionT { public SaHpiCtrlRecT CtrlRec; public SaHpiSensorRecT SensorRec; public SaHpiInventoryRecT InventoryRec; public SaHpiWatchdogRecT WatchdogRec; public SaHpiAnnunciatorRecT AnnunciatorRec; public SaHpiDimiRecT DimiRec; public SaHpiFumiRecT FumiRec; }; /** * struct SaHpiRdrT */ public static class SaHpiRdrT { public long RecordId; public long RdrType; public SaHpiEntityPathT Entity; public long IsFru; public SaHpiRdrTypeUnionT RdrTypeUnion; public SaHpiTextBufferT IdString; }; /** * struct SaHpiLoadIdT */ public static class SaHpiLoadIdT { public long LoadNumber; public SaHpiTextBufferT LoadName; }; /** * struct SaHpiResourceInfoT */ public static class SaHpiResourceInfoT { public long ResourceRev; public long SpecificVer; public long DeviceSupport; public long ManufacturerId; public long ProductId; public long FirmwareMajorRev; public long FirmwareMinorRev; public long AuxFirmwareRev; // Byte[SAHPI_GUID_LENGTH] public byte[] Guid; }; /** * struct SaHpiRptEntryT */ public static class SaHpiRptEntryT { public long EntryId; public long ResourceId; public SaHpiResourceInfoT ResourceInfo; public SaHpiEntityPathT ResourceEntity; public long ResourceCapabilities; public long HotSwapCapabilities; public long ResourceSeverity; public long ResourceFailed; public SaHpiTextBufferT ResourceTag; }; /** * struct SaHpiDomainInfoT */ public static class SaHpiDomainInfoT { public long DomainId; public long DomainCapabilities; public long IsPeer; public SaHpiTextBufferT DomainTag; public long DrtUpdateCount; public long DrtUpdateTimestamp; public long RptUpdateCount; public long RptUpdateTimestamp; public long DatUpdateCount; public long DatUpdateTimestamp; public long ActiveAlarms; public long CriticalAlarms; public long MajorAlarms; public long MinorAlarms; public long DatUserAlarmLimit; public long DatOverflow; // Byte[SAHPI_GUID_LENGTH] public byte[] Guid; }; /** * struct SaHpiDrtEntryT */ public static class SaHpiDrtEntryT { public long EntryId; public long DomainId; public long IsPeer; }; /** * struct SaHpiAlarmT */ public static class SaHpiAlarmT { public long AlarmId; public long Timestamp; public long Severity; public long Acknowledged; public SaHpiConditionT AlarmCond; }; /** * struct SaHpiEventLogInfoT */ public static class SaHpiEventLogInfoT { public long Entries; public long Size; public long UserEventMaxSize; public long UpdateTimestamp; public long CurrentTime; public long Enabled; public long OverflowFlag; public long OverflowResetable; public long OverflowAction; }; /** * struct SaHpiEventLogEntryT */ public static class SaHpiEventLogEntryT { public long EntryId; public long Timestamp; public SaHpiEventT Event; }; /********************************************************** * HPI API Returns Types *********************************************************/ /** * Represents output parameters * for saHpiDomainInfoGet(). */ public static class saHpiDomainInfoGetOutputParamsT { public SaHpiDomainInfoT DomainInfo; }; /** * Represents output parameters * for saHpiDrtEntryGet(). */ public static class saHpiDrtEntryGetOutputParamsT { public long NextEntryId; public SaHpiDrtEntryT DrtEntry; }; /** * Represents output parameters * for saHpiRptEntryGet(). */ public static class saHpiRptEntryGetOutputParamsT { public long NextEntryId; public SaHpiRptEntryT RptEntry; }; /** * Represents output parameters * for saHpiRptEntryGetByResourceId(). */ public static class saHpiRptEntryGetByResourceIdOutputParamsT { public SaHpiRptEntryT RptEntry; }; /** * Represents output parameters * for saHpiGetIdByEntityPath(). */ public static class saHpiGetIdByEntityPathOutputParamsT { public long InstanceId; public long ResourceId; public long InstrumentId; public long RptUpdateCount; }; /** * Represents output parameters * for saHpiGetChildEntityPath(). */ public static class saHpiGetChildEntityPathOutputParamsT { public long InstanceId; public SaHpiEntityPathT ChildEntityPath; public long RptUpdateCount; }; /** * Represents output parameters * for saHpiEventLogInfoGet(). */ public static class saHpiEventLogInfoGetOutputParamsT { public SaHpiEventLogInfoT Info; }; /** * Represents output parameters * for saHpiEventLogCapabilitiesGet(). */ public static class saHpiEventLogCapabilitiesGetOutputParamsT { public long EventLogCapabilities; }; /** * Represents output parameters * for saHpiEventLogEntryGet(). */ public static class saHpiEventLogEntryGetOutputParamsT { public long PrevEntryId; public long NextEntryId; public SaHpiEventLogEntryT EventLogEntry; public SaHpiRdrT Rdr; public SaHpiRptEntryT RptEntry; }; /** * Represents output parameters * for saHpiEventLogTimeGet(). */ public static class saHpiEventLogTimeGetOutputParamsT { public long Time; }; /** * Represents output parameters * for saHpiEventLogStateGet(). */ public static class saHpiEventLogStateGetOutputParamsT { public long EnableState; }; /** * Represents output parameters * for saHpiEventGet(). */ public static class saHpiEventGetOutputParamsT { public SaHpiEventT Event; public SaHpiRdrT Rdr; public SaHpiRptEntryT RptEntry; public long EventQueueStatus; }; /** * Represents output parameters * for saHpiAlarmGetNext(). */ public static class saHpiAlarmGetNextOutputParamsT { public SaHpiAlarmT Alarm; }; /** * Represents output parameters * for saHpiAlarmGet(). */ public static class saHpiAlarmGetOutputParamsT { public SaHpiAlarmT Alarm; }; /** * Represents output parameters * for saHpiAlarmAdd(). */ public static class saHpiAlarmAddOutputParamsT { public SaHpiAlarmT Alarm; }; /** * Represents output parameters * for saHpiRdrGet(). */ public static class saHpiRdrGetOutputParamsT { public long NextEntryId; public SaHpiRdrT Rdr; }; /** * Represents output parameters * for saHpiRdrGetByInstrumentId(). */ public static class saHpiRdrGetByInstrumentIdOutputParamsT { public SaHpiRdrT Rdr; }; /** * Represents output parameters * for saHpiRdrUpdateCountGet(). */ public static class saHpiRdrUpdateCountGetOutputParamsT { public long UpdateCount; }; /** * Represents output parameters * for saHpiSensorReadingGet(). */ public static class saHpiSensorReadingGetOutputParamsT { public SaHpiSensorReadingT Reading; public long EventState; }; /** * Represents output parameters * for saHpiSensorThresholdsGet(). */ public static class saHpiSensorThresholdsGetOutputParamsT { public SaHpiSensorThresholdsT SensorThresholds; }; /** * Represents output parameters * for saHpiSensorTypeGet(). */ public static class saHpiSensorTypeGetOutputParamsT { public long Type; public long Category; }; /** * Represents output parameters * for saHpiSensorEnableGet(). */ public static class saHpiSensorEnableGetOutputParamsT { public long SensorEnabled; }; /** * Represents output parameters * for saHpiSensorEventEnableGet(). */ public static class saHpiSensorEventEnableGetOutputParamsT { public long SensorEventsEnabled; }; /** * Represents output parameters * for saHpiSensorEventMasksGet(). */ public static class saHpiSensorEventMasksGetOutputParamsT { public long AssertEventMask; public long DeassertEventMask; }; /** * Represents output parameters * for saHpiControlTypeGet(). */ public static class saHpiControlTypeGetOutputParamsT { public long Type; }; /** * Represents output parameters * for saHpiControlGet(). */ public static class saHpiControlGetOutputParamsT { public long CtrlMode; public SaHpiCtrlStateT CtrlState; }; /** * Represents output parameters * for saHpiIdrInfoGet(). */ public static class saHpiIdrInfoGetOutputParamsT { public SaHpiIdrInfoT IdrInfo; }; /** * Represents output parameters * for saHpiIdrAreaHeaderGet(). */ public static class saHpiIdrAreaHeaderGetOutputParamsT { public long NextAreaId; public SaHpiIdrAreaHeaderT Header; }; /** * Represents output parameters * for saHpiIdrAreaAdd(). */ public static class saHpiIdrAreaAddOutputParamsT { public long AreaId; }; /** * Represents output parameters * for saHpiIdrFieldGet(). */ public static class saHpiIdrFieldGetOutputParamsT { public long NextFieldId; public SaHpiIdrFieldT Field; }; /** * Represents output parameters * for saHpiIdrFieldAdd(). */ public static class saHpiIdrFieldAddOutputParamsT { public SaHpiIdrFieldT Field; }; /** * Represents output parameters * for saHpiWatchdogTimerGet(). */ public static class saHpiWatchdogTimerGetOutputParamsT { public SaHpiWatchdogT Watchdog; }; /** * Represents output parameters * for saHpiAnnunciatorGetNext(). */ public static class saHpiAnnunciatorGetNextOutputParamsT { public SaHpiAnnouncementT Announcement; }; /** * Represents output parameters * for saHpiAnnunciatorGet(). */ public static class saHpiAnnunciatorGetOutputParamsT { public SaHpiAnnouncementT Announcement; }; /** * Represents output parameters * for saHpiAnnunciatorAdd(). */ public static class saHpiAnnunciatorAddOutputParamsT { public SaHpiAnnouncementT Announcement; }; /** * Represents output parameters * for saHpiAnnunciatorModeGet(). */ public static class saHpiAnnunciatorModeGetOutputParamsT { public long Mode; }; /** * Represents output parameters * for saHpiDimiInfoGet(). */ public static class saHpiDimiInfoGetOutputParamsT { public SaHpiDimiInfoT DimiInfo; }; /** * Represents output parameters * for saHpiDimiTestInfoGet(). */ public static class saHpiDimiTestInfoGetOutputParamsT { public SaHpiDimiTestT DimiTest; }; /** * Represents output parameters * for saHpiDimiTestReadinessGet(). */ public static class saHpiDimiTestReadinessGetOutputParamsT { public long DimiReady; }; /** * Represents output parameters * for saHpiDimiTestStatusGet(). */ public static class saHpiDimiTestStatusGetOutputParamsT { public long PercentCompleted; public long RunStatus; }; /** * Represents output parameters * for saHpiDimiTestResultsGet(). */ public static class saHpiDimiTestResultsGetOutputParamsT { public SaHpiDimiTestResultsT TestResults; }; /** * Represents output parameters * for saHpiFumiSpecInfoGet(). */ public static class saHpiFumiSpecInfoGetOutputParamsT { public SaHpiFumiSpecInfoT SpecInfo; }; /** * Represents output parameters * for saHpiFumiServiceImpactGet(). */ public static class saHpiFumiServiceImpactGetOutputParamsT { public SaHpiFumiServiceImpactDataT ServiceImpact; }; /** * Represents output parameters * for saHpiFumiSourceInfoGet(). */ public static class saHpiFumiSourceInfoGetOutputParamsT { public SaHpiFumiSourceInfoT SourceInfo; }; /** * Represents output parameters * for saHpiFumiSourceComponentInfoGet(). */ public static class saHpiFumiSourceComponentInfoGetOutputParamsT { public long NextComponentEntryId; public SaHpiFumiComponentInfoT ComponentInfo; }; /** * Represents output parameters * for saHpiFumiTargetInfoGet(). */ public static class saHpiFumiTargetInfoGetOutputParamsT { public SaHpiFumiBankInfoT BankInfo; }; /** * Represents output parameters * for saHpiFumiTargetComponentInfoGet(). */ public static class saHpiFumiTargetComponentInfoGetOutputParamsT { public long NextComponentEntryId; public SaHpiFumiComponentInfoT ComponentInfo; }; /** * Represents output parameters * for saHpiFumiLogicalTargetInfoGet(). */ public static class saHpiFumiLogicalTargetInfoGetOutputParamsT { public SaHpiFumiLogicalBankInfoT BankInfo; }; /** * Represents output parameters * for saHpiFumiLogicalTargetComponentInfoGet(). */ public static class saHpiFumiLogicalTargetComponentInfoGetOutputParamsT { public long NextComponentEntryId; public SaHpiFumiLogicalComponentInfoT ComponentInfo; }; /** * Represents output parameters * for saHpiFumiUpgradeStatusGet(). */ public static class saHpiFumiUpgradeStatusGetOutputParamsT { public long UpgradeStatus; }; /** * Represents output parameters * for saHpiFumiAutoRollbackDisableGet(). */ public static class saHpiFumiAutoRollbackDisableGetOutputParamsT { public long Disable; }; /** * Represents output parameters * for saHpiAutoInsertTimeoutGet(). */ public static class saHpiAutoInsertTimeoutGetOutputParamsT { public long Timeout; }; /** * Represents output parameters * for saHpiAutoExtractTimeoutGet(). */ public static class saHpiAutoExtractTimeoutGetOutputParamsT { public long Timeout; }; /** * Represents output parameters * for saHpiHotSwapStateGet(). */ public static class saHpiHotSwapStateGetOutputParamsT { public long State; }; /** * Represents output parameters * for saHpiHotSwapIndicatorStateGet(). */ public static class saHpiHotSwapIndicatorStateGetOutputParamsT { public long State; }; /** * Represents output parameters * for saHpiResourceLoadIdGet(). */ public static class saHpiResourceLoadIdGetOutputParamsT { public SaHpiLoadIdT LoadId; }; /** * Represents output parameters * for saHpiResourceResetStateGet(). */ public static class saHpiResourceResetStateGetOutputParamsT { public long ResetAction; }; /** * Represents output parameters * for saHpiResourcePowerStateGet(). */ public static class saHpiResourcePowerStateGetOutputParamsT { public long State; }; }; openhpi-3.6.1/baselibs/java/openhpi_baselib/HpiCollections.java0000644000175100017510000004311712575647300023604 0ustar mohanmohan/* -*- java -*- * * Copyright (C) 2012, Pigeon Point Systems * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ package org.openhpi; import java.util.Collection; import java.util.LinkedList; import static org.openhpi.HpiDataTypes.*; import static org.openhpi.Hpi.*; /********************************************************** * HPI Utility Functions: Collections *********************************************************/ public class HpiCollections { // Just to ensure nobody creates it private HpiCollections() { // empty } /*********************************************************** * Helper functions * TODO - move to HpiUtils? **********************************************************/ private static SaHpiConditionT NewCondition() { SaHpiConditionT c = new SaHpiConditionT(); c.Type = SAHPI_STATUS_COND_TYPE_USER; c.Entity = HpiUtil.makeUnspecifiedSaHpiEntityPathT(); c.DomainId = SAHPI_UNSPECIFIED_DOMAIN_ID; c.ResourceId = SAHPI_UNSPECIFIED_RESOURCE_ID; c.SensorNum = SAHPI_ENTRY_UNSPECIFIED; c.EventState = SAHPI_ES_UNSPECIFIED; c.Name = new SaHpiNameT(); c.Name.Length = 0; c.Name.Value = new byte[SA_HPI_MAX_NAME_LENGTH]; c.Mid = SAHPI_MANUFACTURER_ID_UNSPECIFIED; c.Data = HpiUtil.toSaHpiTextBufferT( "" ); return c; } public static SaHpiAlarmT NewAlarm( long id, long timestamp ) { SaHpiAlarmT a = new SaHpiAlarmT(); a.AlarmId = id; a.Timestamp = timestamp; a.Severity = SAHPI_ALL_SEVERITIES; a.Acknowledged = SAHPI_FALSE; a.AlarmCond = NewCondition(); return a; } public static SaHpiAnnouncementT NewAnnouncement( long id, long timestamp ) { SaHpiAnnouncementT a = new SaHpiAnnouncementT(); a.EntryId = id; a.Timestamp = timestamp; a.AddedByUser = SAHPI_TRUE; a.Severity = SAHPI_ALL_SEVERITIES; a.Acknowledged = SAHPI_FALSE; a.StatusCond = NewCondition(); return a; } /*********************************************************** * DRT **********************************************************/ public static Collection Drt( long sid ) throws HpiException { LinkedList all = new LinkedList(); long eid = SAHPI_FIRST_ENTRY; SaHpiDrtEntryT drte; do { saHpiDrtEntryGetOutputParamsT out = new saHpiDrtEntryGetOutputParamsT(); long rv = saHpiDrtEntryGet( sid, eid, out ); if ( ( eid == SAHPI_FIRST_ENTRY ) && ( rv == SA_ERR_HPI_NOT_PRESENT ) ) { break; } if ( rv != SA_OK ) { break; } eid = out.NextEntryId; all.add( out.DrtEntry ); } while ( eid != SAHPI_LAST_ENTRY ); return all; } /*********************************************************** * DAT **********************************************************/ public static Collection Dat( long sid, long severity, long unacknowledged_only ) throws HpiException { LinkedList all = new LinkedList(); long id = SAHPI_FIRST_ENTRY; long timestamp = 0; do { SaHpiAlarmT a = NewAlarm( id, timestamp ); saHpiAlarmGetNextOutputParamsT out = new saHpiAlarmGetNextOutputParamsT(); long rv = saHpiAlarmGetNext( sid, severity, unacknowledged_only, a, out ); if ( rv == SA_ERR_HPI_NOT_PRESENT ) { break; } if ( rv != SA_OK ) { break; } id = out.Alarm.AlarmId; timestamp = out.Alarm.Timestamp; all.add( out.Alarm ); } while ( id != SAHPI_LAST_ENTRY ); return all; } /*********************************************************** * Event Log **********************************************************/ public static class EventLogEntryEx { public SaHpiEventLogEntryT EventLogEntry; public SaHpiRdrT Rdr; public SaHpiRptEntryT RptEntry; }; public static Collection EventLogEntries( long sid, long rid, boolean readforward ) throws HpiException { LinkedList all = new LinkedList(); long eid = readforward ? SAHPI_OLDEST_ENTRY : SAHPI_NEWEST_ENTRY; do { saHpiEventLogEntryGetOutputParamsT out = new saHpiEventLogEntryGetOutputParamsT(); long rv = saHpiEventLogEntryGet( sid, rid, eid, out ); if ( rv == SA_ERR_HPI_NOT_PRESENT ) { break; } if ( rv != SA_OK ) { break; } eid = readforward ? out.NextEntryId : out.PrevEntryId; EventLogEntryEx ex = new EventLogEntryEx(); ex.EventLogEntry = out.EventLogEntry; ex.Rdr = out.Rdr; ex.RptEntry = out.RptEntry; all.add( ex ); } while ( eid != SAHPI_NO_MORE_ENTRIES ); return all; } /*********************************************************** * entity resource ids **********************************************************/ public static Collection EntityResourceIds( long sid, SaHpiEntityPathT ep ) throws HpiException { LinkedList all = new LinkedList(); long id = SAHPI_FIRST_ENTRY; do { saHpiGetIdByEntityPathOutputParamsT out = new saHpiGetIdByEntityPathOutputParamsT(); long rv = saHpiGetIdByEntityPath( sid, ep, SAHPI_NO_RECORD, id, out ); if ( ( id == SAHPI_FIRST_ENTRY ) && ( rv == SA_ERR_HPI_NOT_PRESENT ) ) { break; } if ( rv != SA_OK ) { break; } id = out.InstanceId; all.add( out.ResourceId ); } while ( id != SAHPI_LAST_ENTRY ); return all; } /*********************************************************** * entity instrument ids **********************************************************/ public static class ResourceIdInstrumentId { public long ResourceId; public long InstrumentId; }; public static Collection EntityInstrumentIds( long sid, SaHpiEntityPathT ep, long rdrtype ) throws HpiException { LinkedList all = new LinkedList(); long id = SAHPI_FIRST_ENTRY; do { saHpiGetIdByEntityPathOutputParamsT out = new saHpiGetIdByEntityPathOutputParamsT(); long rv = saHpiGetIdByEntityPath( sid, ep, rdrtype, id, out ); if ( ( id == SAHPI_FIRST_ENTRY ) && ( rv == SA_ERR_HPI_NOT_PRESENT ) ) { break; } if ( rv != SA_OK ) { break; } id = out.InstanceId; ResourceIdInstrumentId ri = new ResourceIdInstrumentId(); ri.ResourceId = out.ResourceId; ri.InstrumentId = out.InstrumentId; all.add( ri ); } while ( id != SAHPI_LAST_ENTRY ); return all; } /*********************************************************** * child entities **********************************************************/ public static Collection ChildEntities( long sid, SaHpiEntityPathT parent_ep ) throws HpiException { LinkedList all = new LinkedList(); long id = SAHPI_FIRST_ENTRY; do { saHpiGetChildEntityPathOutputParamsT out = new saHpiGetChildEntityPathOutputParamsT(); long rv = saHpiGetChildEntityPath( sid, parent_ep, id, out ); if ( ( id == SAHPI_FIRST_ENTRY ) && ( rv == SA_ERR_HPI_NOT_PRESENT ) ) { break; } if ( rv != SA_OK ) { break; } id = out.InstanceId; all.add( out.ChildEntityPath ); } while ( id != SAHPI_LAST_ENTRY ); return all; } /*********************************************************** * RPT **********************************************************/ public static Collection Rpt( long sid ) throws HpiException { LinkedList all = new LinkedList(); long eid = SAHPI_FIRST_ENTRY; do { saHpiRptEntryGetOutputParamsT out = new saHpiRptEntryGetOutputParamsT(); long rv = saHpiRptEntryGet( sid, eid, out ); if ( ( eid == SAHPI_FIRST_ENTRY ) && ( rv == SA_ERR_HPI_NOT_PRESENT ) ) { break; } if ( rv != SA_OK ) { break; } eid = out.NextEntryId; all.add( out.RptEntry ); } while ( eid != SAHPI_LAST_ENTRY ); return all; } /*********************************************************** * RDRs **********************************************************/ public static Collection Rdrs( long sid, long rid ) throws HpiException { LinkedList all = new LinkedList(); long eid = SAHPI_FIRST_ENTRY; do { saHpiRdrGetOutputParamsT out = new saHpiRdrGetOutputParamsT(); long rv = saHpiRdrGet( sid, rid, eid, out ); if ( ( eid == SAHPI_FIRST_ENTRY ) && ( rv == SA_ERR_HPI_NOT_PRESENT ) ) { break; } if ( rv != SA_OK ) { break; } eid = out.NextEntryId; all.add( out.Rdr ); } while ( eid != SAHPI_LAST_ENTRY ); return all; } /*********************************************************** * Idr Areas **********************************************************/ public static Collection IdrAreaHeaders( long sid, long rid, long idrid, long atype ) throws HpiException { LinkedList all = new LinkedList(); long aid = SAHPI_FIRST_ENTRY; do { saHpiIdrAreaHeaderGetOutputParamsT out = new saHpiIdrAreaHeaderGetOutputParamsT(); long rv = saHpiIdrAreaHeaderGet( sid, rid, idrid, atype, aid, out ); if ( ( aid == SAHPI_FIRST_ENTRY ) && ( rv == SA_ERR_HPI_NOT_PRESENT ) ) { break; } if ( rv != SA_OK ) { break; } aid = out.NextAreaId; all.add( out.Header ); } while ( aid != SAHPI_LAST_ENTRY ); return all; } /*********************************************************** * Area Fields **********************************************************/ public static Collection IdrAreaFields( long sid, long rid, long idrid, long aid, long ftype ) throws HpiException { LinkedList all = new LinkedList(); long fid = SAHPI_FIRST_ENTRY; do { saHpiIdrFieldGetOutputParamsT out = new saHpiIdrFieldGetOutputParamsT(); long rv = saHpiIdrFieldGet( sid, rid, idrid, aid, ftype, fid, out ); if ( ( aid == SAHPI_FIRST_ENTRY ) && ( rv == SA_ERR_HPI_NOT_PRESENT ) ) { break; } if ( rv != SA_OK ) { break; } fid = out.NextFieldId; all.add( out.Field ); } while ( aid != SAHPI_LAST_ENTRY ); return all; } /*********************************************************** * annuncuator announcements **********************************************************/ public static Collection Announcements( long sid, long rid, long annnum, long severity, long unacknowledged_only ) throws HpiException { LinkedList all = new LinkedList(); long id = SAHPI_FIRST_ENTRY; long timestamp = 0; do { SaHpiAnnouncementT a = NewAnnouncement( id, timestamp ); saHpiAnnunciatorGetNextOutputParamsT out = new saHpiAnnunciatorGetNextOutputParamsT(); long rv = saHpiAnnunciatorGetNext( sid, rid, annnum, severity, unacknowledged_only, a, out ); if ( rv == SA_ERR_HPI_NOT_PRESENT ) { break; } if ( rv != SA_OK ) { break; } id = out.Announcement.EntryId; timestamp = out.Announcement.Timestamp; all.add( out.Announcement ); } while ( id != SAHPI_LAST_ENTRY ); return all; } /*********************************************************** * FUMI Source Components **********************************************************/ public static Collection FumiSourceComponents( long sid, long rid, long fuminum, long banknum ) throws HpiException { LinkedList all = new LinkedList(); long eid = SAHPI_FIRST_ENTRY; do { saHpiFumiSourceComponentInfoGetOutputParamsT out = new saHpiFumiSourceComponentInfoGetOutputParamsT(); long rv = saHpiFumiSourceComponentInfoGet( sid, rid, fuminum, banknum, eid, out ); if ( ( eid == SAHPI_FIRST_ENTRY ) && ( rv == SA_ERR_HPI_NOT_PRESENT ) ) { break; } if ( rv != SA_OK ) { break; } eid = out.NextComponentEntryId; all.add( out.ComponentInfo ); } while ( eid != SAHPI_LAST_ENTRY ); return all; } /*********************************************************** * FUMI Target Components **********************************************************/ public static Collection FumiTargetComponents( long sid, long rid, long fuminum, long banknum ) throws HpiException { LinkedList all = new LinkedList(); long eid = SAHPI_FIRST_ENTRY; do { saHpiFumiTargetComponentInfoGetOutputParamsT out = new saHpiFumiTargetComponentInfoGetOutputParamsT(); long rv = saHpiFumiTargetComponentInfoGet( sid, rid, fuminum, banknum, eid, out ); if ( ( eid == SAHPI_FIRST_ENTRY ) && ( rv == SA_ERR_HPI_NOT_PRESENT ) ) { break; } if ( rv != SA_OK ) { break; } eid = out.NextComponentEntryId; all.add( out.ComponentInfo ); } while ( eid != SAHPI_LAST_ENTRY ); return all; } /*********************************************************** * FUMI Logical Target Components **********************************************************/ public static Collection FumiLogicalTargetComponents( long sid, long rid, long fuminum ) throws HpiException { LinkedList all = new LinkedList(); long eid = SAHPI_FIRST_ENTRY; do { saHpiFumiLogicalTargetComponentInfoGetOutputParamsT out = new saHpiFumiLogicalTargetComponentInfoGetOutputParamsT(); long rv = saHpiFumiLogicalTargetComponentInfoGet( sid, rid, fuminum, eid, out ); if ( ( eid == SAHPI_FIRST_ENTRY ) && ( rv == SA_ERR_HPI_NOT_PRESENT ) ) { break; } if ( rv != SA_OK ) { break; } eid = out.NextComponentEntryId; all.add( out.ComponentInfo ); } while ( eid != SAHPI_LAST_ENTRY ); return all; } }; // class HpiCollections openhpi-3.6.1/baselibs/java/openhpi_baselib/HpiDataTypes.java0000644000175100017510000000227012575647300023217 0ustar mohanmohan/* -*- java -*- * * Copyright (C) 2012, Pigeon Point Systems * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ package org.openhpi; public class HpiDataTypes extends HpiDataTypesGen { // Just to ensure nobody creates it protected HpiDataTypes() { // empty } /********************************************************** * HPI API Returns Types *********************************************************/ /** * Represents output parameters * for saHpiSessionOpen(). */ public static class saHpiSessionOpenOutputParamsT { public long SessionId; }; /** * Represents output parameters * for saHpiMyEntityPathGet(). */ public static class saHpiMyEntityPathGetOutputParamsT { public SaHpiEntityPathT EntityPath; }; }; openhpi-3.6.1/baselibs/java/openhpi_baselib/OhpiMarshal.java0000644000175100017510000000636512575647300023100 0ustar mohanmohan/* -*- java -*- * * Copyright (C) 2012, Pigeon Point Systems * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ package org.openhpi; import java.util.AbstractMap; import java.util.LinkedList; import java.util.List; import java.util.Map.Entry; import static org.openhpi.HpiDataTypes.*; import static org.openhpi.OhpiDataTypes.*; /********************************************************** * OHPI Marshal *********************************************************/ class OhpiMarshal extends HpiMarshalGen { /********************************************************** * Marshal: For OHPI Simple Data Types *********************************************************/ public void marshaloHpiHandlerIdT( long x ) { marshalSaHpiUint32T( x ); } public void marshaloHpiGlobalParamTypeT( long x ) { marshalEnum( x ); } /********************************************************** * Marshal: For OHPI Structs and Unions *********************************************************/ public void marshaloHpiHandlerConfigT( oHpiHandlerConfigT x ) { marshalSaHpiUint8T( x.items.size() ); for ( Entry kv : x.items ) { marshalByteArray( kv.getKey(), SAHPI_MAX_TEXT_BUFFER_LENGTH ); marshalByteArray( kv.getValue(), SAHPI_MAX_TEXT_BUFFER_LENGTH ); } } /********************************************************** * Demarshal: For OHPI Simple Data Types *********************************************************/ public long demarshaloHpiHandlerIdT() throws HpiException { return demarshalSaHpiUint32T(); } public long demarshaloHpiGlobalParamTypeT() throws HpiException { return demarshalEnum(); } /********************************************************** * Demarshal: For OHPI Structs and Unions *********************************************************/ public oHpiHandlerInfoT demarshaloHpiHandlerInfoT() throws HpiException { oHpiHandlerInfoT x = new oHpiHandlerInfoT(); x.id = demarshaloHpiHandlerIdT(); x.plugin_name = demarshalByteArray( OPENHPI_MAX_PLUGIN_NAME_LENGTH ); x.entity_root = demarshalSaHpiEntityPathT(); x.load_failed = demarshalSaHpiInt32T(); return x; } public oHpiHandlerConfigT demarshaloHpiHandlerConfigT() throws HpiException { oHpiHandlerConfigT x = new oHpiHandlerConfigT(); x.items = new LinkedList< Entry >(); long n = demarshalSaHpiUint8T(); for ( int i = 0; i < n; ++i ) { byte[] name = demarshalByteArray( SAHPI_MAX_TEXT_BUFFER_LENGTH ); byte[] val = demarshalByteArray( SAHPI_MAX_TEXT_BUFFER_LENGTH ); x.items.add( new AbstractMap.SimpleEntry( name, val ) ); } return x; } }; openhpi-3.6.1/baselibs/java/openhpi_baselib/HpiGen.java0000644000175100017510000035230512575647300022041 0ustar mohanmohan/* -*- java -*- * * Copyright (C) 2012, Pigeon Point Systems * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ package org.openhpi; import static org.openhpi.HpiDataTypes.*; import static org.openhpi.OhpiDataTypes.*; /********************************************************** * HPI API (auto-generated) *********************************************************/ public class HpiGen { // Just to ensure nobody creates it protected HpiGen() { // empty } /********************************************************** * HPI API *********************************************************/ public static long saHpiVersionGet() { return SAHPI_INTERFACE_VERSION; } public static long saHpiDiscover( long SessionId ) throws HpiException { long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); rc = m.interchange( RPC_SAHPI_DISCOVER ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); return rv; } public static long saHpiDomainInfoGet( long SessionId, saHpiDomainInfoGetOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); rc = m.interchange( RPC_SAHPI_DOMAIN_INFO_GET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.DomainInfo = m.demarshalSaHpiDomainInfoT(); } s.putMarshal( m ); return rv; } public static long saHpiDrtEntryGet( long SessionId, long EntryId, saHpiDrtEntryGetOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiEntryIdT( EntryId ); rc = m.interchange( RPC_SAHPI_DRT_ENTRY_GET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.NextEntryId = m.demarshalSaHpiEntryIdT(); out.DrtEntry = m.demarshalSaHpiDrtEntryT(); } s.putMarshal( m ); return rv; } public static long saHpiDomainTagSet( long SessionId, SaHpiTextBufferT DomainTag ) throws HpiException { long rv; boolean rc; rc = HpiUtil.check( DomainTag ); if ( !rc ) { return SA_ERR_HPI_INVALID_PARAMS; } HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiTextBufferT( DomainTag ); rc = m.interchange( RPC_SAHPI_DOMAIN_TAG_SET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); return rv; } public static long saHpiRptEntryGet( long SessionId, long EntryId, saHpiRptEntryGetOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiEntryIdT( EntryId ); rc = m.interchange( RPC_SAHPI_RPT_ENTRY_GET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.NextEntryId = m.demarshalSaHpiEntryIdT(); out.RptEntry = m.demarshalSaHpiRptEntryT(); } s.putMarshal( m ); return rv; } public static long saHpiRptEntryGetByResourceId( long SessionId, long ResourceId, saHpiRptEntryGetByResourceIdOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); rc = m.interchange( RPC_SAHPI_RPT_ENTRY_GET_BY_RESOURCE_ID ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.RptEntry = m.demarshalSaHpiRptEntryT(); } s.putMarshal( m ); return rv; } public static long saHpiResourceSeveritySet( long SessionId, long ResourceId, long Severity ) throws HpiException { long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiSeverityT( Severity ); rc = m.interchange( RPC_SAHPI_RESOURCE_SEVERITY_SET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); return rv; } public static long saHpiResourceTagSet( long SessionId, long ResourceId, SaHpiTextBufferT ResourceTag ) throws HpiException { long rv; boolean rc; rc = HpiUtil.check( ResourceTag ); if ( !rc ) { return SA_ERR_HPI_INVALID_PARAMS; } HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiTextBufferT( ResourceTag ); rc = m.interchange( RPC_SAHPI_RESOURCE_TAG_SET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); return rv; } public static long saHpiGetIdByEntityPath( long SessionId, SaHpiEntityPathT EntityPath, long InstrumentType, long InstanceId, saHpiGetIdByEntityPathOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; rc = HpiUtil.check( EntityPath ); if ( !rc ) { return SA_ERR_HPI_INVALID_PARAMS; } HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiEntityPathT( EntityPath ); m.marshalSaHpiRdrTypeT( InstrumentType ); m.marshalSaHpiUint32T( InstanceId ); rc = m.interchange( RPC_SAHPI_GET_ID_BY_ENTITY_PATH ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.InstanceId = m.demarshalSaHpiUint32T(); out.ResourceId = m.demarshalSaHpiResourceIdT(); out.InstrumentId = m.demarshalSaHpiInstrumentIdT(); out.RptUpdateCount = m.demarshalSaHpiUint32T(); } s.putMarshal( m ); return rv; } public static long saHpiGetChildEntityPath( long SessionId, SaHpiEntityPathT ParentEntityPath, long InstanceId, saHpiGetChildEntityPathOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; rc = HpiUtil.check( ParentEntityPath ); if ( !rc ) { return SA_ERR_HPI_INVALID_PARAMS; } HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiEntityPathT( ParentEntityPath ); m.marshalSaHpiUint32T( InstanceId ); rc = m.interchange( RPC_SAHPI_GET_CHILD_ENTITY_PATH ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.InstanceId = m.demarshalSaHpiUint32T(); out.ChildEntityPath = m.demarshalSaHpiEntityPathT(); out.RptUpdateCount = m.demarshalSaHpiUint32T(); } s.putMarshal( m ); return rv; } public static long saHpiResourceFailedRemove( long SessionId, long ResourceId ) throws HpiException { long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); rc = m.interchange( RPC_SAHPI_RESOURCE_FAILED_REMOVE ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); return rv; } public static long saHpiEventLogInfoGet( long SessionId, long ResourceId, saHpiEventLogInfoGetOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); rc = m.interchange( RPC_SAHPI_EVENT_LOG_INFO_GET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.Info = m.demarshalSaHpiEventLogInfoT(); } s.putMarshal( m ); return rv; } public static long saHpiEventLogCapabilitiesGet( long SessionId, long ResourceId, saHpiEventLogCapabilitiesGetOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); rc = m.interchange( RPC_SAHPI_EVENT_LOG_CAPABILITIES_GET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.EventLogCapabilities = m.demarshalSaHpiEventLogCapabilitiesT(); } s.putMarshal( m ); return rv; } public static long saHpiEventLogEntryGet( long SessionId, long ResourceId, long EntryId, saHpiEventLogEntryGetOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiEventLogEntryIdT( EntryId ); rc = m.interchange( RPC_SAHPI_EVENT_LOG_ENTRY_GET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.PrevEntryId = m.demarshalSaHpiEventLogEntryIdT(); out.NextEntryId = m.demarshalSaHpiEventLogEntryIdT(); out.EventLogEntry = m.demarshalSaHpiEventLogEntryT(); out.Rdr = m.demarshalSaHpiRdrT(); out.RptEntry = m.demarshalSaHpiRptEntryT(); } s.putMarshal( m ); return rv; } public static long saHpiEventLogEntryAdd( long SessionId, long ResourceId, SaHpiEventT EvtEntry ) throws HpiException { long rv; boolean rc; rc = HpiUtil.check( EvtEntry ); if ( !rc ) { return SA_ERR_HPI_INVALID_PARAMS; } HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiEventT( EvtEntry ); rc = m.interchange( RPC_SAHPI_EVENT_LOG_ENTRY_ADD ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); return rv; } public static long saHpiEventLogClear( long SessionId, long ResourceId ) throws HpiException { long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); rc = m.interchange( RPC_SAHPI_EVENT_LOG_CLEAR ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); return rv; } public static long saHpiEventLogTimeGet( long SessionId, long ResourceId, saHpiEventLogTimeGetOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); rc = m.interchange( RPC_SAHPI_EVENT_LOG_TIME_GET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.Time = m.demarshalSaHpiTimeT(); } s.putMarshal( m ); return rv; } public static long saHpiEventLogTimeSet( long SessionId, long ResourceId, long Time ) throws HpiException { long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiTimeT( Time ); rc = m.interchange( RPC_SAHPI_EVENT_LOG_TIME_SET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); return rv; } public static long saHpiEventLogStateGet( long SessionId, long ResourceId, saHpiEventLogStateGetOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); rc = m.interchange( RPC_SAHPI_EVENT_LOG_STATE_GET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.EnableState = m.demarshalSaHpiBoolT(); } s.putMarshal( m ); return rv; } public static long saHpiEventLogStateSet( long SessionId, long ResourceId, long EnableState ) throws HpiException { long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiBoolT( EnableState ); rc = m.interchange( RPC_SAHPI_EVENT_LOG_STATE_SET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); return rv; } public static long saHpiEventLogOverflowReset( long SessionId, long ResourceId ) throws HpiException { long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); rc = m.interchange( RPC_SAHPI_EVENT_LOG_OVERFLOW_RESET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); return rv; } public static long saHpiSubscribe( long SessionId ) throws HpiException { long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); rc = m.interchange( RPC_SAHPI_SUBSCRIBE ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); return rv; } public static long saHpiUnsubscribe( long SessionId ) throws HpiException { long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); rc = m.interchange( RPC_SAHPI_UNSUBSCRIBE ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); return rv; } public static long saHpiEventGet( long SessionId, long Timeout, saHpiEventGetOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiTimeoutT( Timeout ); rc = m.interchange( RPC_SAHPI_EVENT_GET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.Event = m.demarshalSaHpiEventT(); out.Rdr = m.demarshalSaHpiRdrT(); out.RptEntry = m.demarshalSaHpiRptEntryT(); out.EventQueueStatus = m.demarshalSaHpiEvtQueueStatusT(); } s.putMarshal( m ); return rv; } public static long saHpiEventAdd( long SessionId, SaHpiEventT EvtEntry ) throws HpiException { long rv; boolean rc; rc = HpiUtil.check( EvtEntry ); if ( !rc ) { return SA_ERR_HPI_INVALID_PARAMS; } HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiEventT( EvtEntry ); rc = m.interchange( RPC_SAHPI_EVENT_ADD ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); return rv; } public static long saHpiAlarmGetNext( long SessionId, long Severity, long UnacknowledgedOnly, SaHpiAlarmT Alarm, saHpiAlarmGetNextOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; rc = HpiUtil.check( Alarm ); if ( !rc ) { return SA_ERR_HPI_INVALID_PARAMS; } HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiSeverityT( Severity ); m.marshalSaHpiBoolT( UnacknowledgedOnly ); m.marshalSaHpiAlarmT( Alarm ); rc = m.interchange( RPC_SAHPI_ALARM_GET_NEXT ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.Alarm = m.demarshalSaHpiAlarmT(); } s.putMarshal( m ); return rv; } public static long saHpiAlarmGet( long SessionId, long AlarmId, saHpiAlarmGetOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiAlarmIdT( AlarmId ); rc = m.interchange( RPC_SAHPI_ALARM_GET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.Alarm = m.demarshalSaHpiAlarmT(); } s.putMarshal( m ); return rv; } public static long saHpiAlarmAcknowledge( long SessionId, long AlarmId, long Severity ) throws HpiException { long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiAlarmIdT( AlarmId ); m.marshalSaHpiSeverityT( Severity ); rc = m.interchange( RPC_SAHPI_ALARM_ACKNOWLEDGE ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); return rv; } public static long saHpiAlarmAdd( long SessionId, SaHpiAlarmT Alarm, saHpiAlarmAddOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; rc = HpiUtil.check( Alarm ); if ( !rc ) { return SA_ERR_HPI_INVALID_PARAMS; } HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiAlarmT( Alarm ); rc = m.interchange( RPC_SAHPI_ALARM_ADD ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.Alarm = m.demarshalSaHpiAlarmT(); } s.putMarshal( m ); return rv; } public static long saHpiAlarmDelete( long SessionId, long AlarmId, long Severity ) throws HpiException { long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiAlarmIdT( AlarmId ); m.marshalSaHpiSeverityT( Severity ); rc = m.interchange( RPC_SAHPI_ALARM_DELETE ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); return rv; } public static long saHpiRdrGet( long SessionId, long ResourceId, long EntryId, saHpiRdrGetOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiEntryIdT( EntryId ); rc = m.interchange( RPC_SAHPI_RDR_GET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.NextEntryId = m.demarshalSaHpiEntryIdT(); out.Rdr = m.demarshalSaHpiRdrT(); } s.putMarshal( m ); return rv; } public static long saHpiRdrGetByInstrumentId( long SessionId, long ResourceId, long RdrType, long InstrumentId, saHpiRdrGetByInstrumentIdOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiRdrTypeT( RdrType ); m.marshalSaHpiInstrumentIdT( InstrumentId ); rc = m.interchange( RPC_SAHPI_RDR_GET_BY_INSTRUMENT_ID ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.Rdr = m.demarshalSaHpiRdrT(); } s.putMarshal( m ); return rv; } public static long saHpiRdrUpdateCountGet( long SessionId, long ResourceId, saHpiRdrUpdateCountGetOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); rc = m.interchange( RPC_SAHPI_RDR_UPDATE_COUNT_GET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.UpdateCount = m.demarshalSaHpiUint32T(); } s.putMarshal( m ); return rv; } public static long saHpiSensorReadingGet( long SessionId, long ResourceId, long SensorNum, saHpiSensorReadingGetOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiSensorNumT( SensorNum ); rc = m.interchange( RPC_SAHPI_SENSOR_READING_GET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.Reading = m.demarshalSaHpiSensorReadingT(); out.EventState = m.demarshalSaHpiEventStateT(); } s.putMarshal( m ); return rv; } public static long saHpiSensorThresholdsGet( long SessionId, long ResourceId, long SensorNum, saHpiSensorThresholdsGetOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiSensorNumT( SensorNum ); rc = m.interchange( RPC_SAHPI_SENSOR_THRESHOLDS_GET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.SensorThresholds = m.demarshalSaHpiSensorThresholdsT(); } s.putMarshal( m ); return rv; } public static long saHpiSensorThresholdsSet( long SessionId, long ResourceId, long SensorNum, SaHpiSensorThresholdsT SensorThresholds ) throws HpiException { long rv; boolean rc; rc = HpiUtil.check( SensorThresholds ); if ( !rc ) { return SA_ERR_HPI_INVALID_PARAMS; } HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiSensorNumT( SensorNum ); m.marshalSaHpiSensorThresholdsT( SensorThresholds ); rc = m.interchange( RPC_SAHPI_SENSOR_THRESHOLDS_SET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); return rv; } public static long saHpiSensorTypeGet( long SessionId, long ResourceId, long SensorNum, saHpiSensorTypeGetOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiSensorNumT( SensorNum ); rc = m.interchange( RPC_SAHPI_SENSOR_TYPE_GET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.Type = m.demarshalSaHpiSensorTypeT(); out.Category = m.demarshalSaHpiEventCategoryT(); } s.putMarshal( m ); return rv; } public static long saHpiSensorEnableGet( long SessionId, long ResourceId, long SensorNum, saHpiSensorEnableGetOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiSensorNumT( SensorNum ); rc = m.interchange( RPC_SAHPI_SENSOR_ENABLE_GET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.SensorEnabled = m.demarshalSaHpiBoolT(); } s.putMarshal( m ); return rv; } public static long saHpiSensorEnableSet( long SessionId, long ResourceId, long SensorNum, long SensorEnabled ) throws HpiException { long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiSensorNumT( SensorNum ); m.marshalSaHpiBoolT( SensorEnabled ); rc = m.interchange( RPC_SAHPI_SENSOR_ENABLE_SET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); return rv; } public static long saHpiSensorEventEnableGet( long SessionId, long ResourceId, long SensorNum, saHpiSensorEventEnableGetOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiSensorNumT( SensorNum ); rc = m.interchange( RPC_SAHPI_SENSOR_EVENT_ENABLE_GET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.SensorEventsEnabled = m.demarshalSaHpiBoolT(); } s.putMarshal( m ); return rv; } public static long saHpiSensorEventEnableSet( long SessionId, long ResourceId, long SensorNum, long SensorEventsEnabled ) throws HpiException { long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiSensorNumT( SensorNum ); m.marshalSaHpiBoolT( SensorEventsEnabled ); rc = m.interchange( RPC_SAHPI_SENSOR_EVENT_ENABLE_SET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); return rv; } public static long saHpiSensorEventMasksGet( long SessionId, long ResourceId, long SensorNum, saHpiSensorEventMasksGetOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiSensorNumT( SensorNum ); rc = m.interchange( RPC_SAHPI_SENSOR_EVENT_MASKS_GET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.AssertEventMask = m.demarshalSaHpiEventStateT(); out.DeassertEventMask = m.demarshalSaHpiEventStateT(); } s.putMarshal( m ); return rv; } public static long saHpiSensorEventMasksSet( long SessionId, long ResourceId, long SensorNum, long Action, long AssertEventMask, long DeassertEventMask ) throws HpiException { long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiSensorNumT( SensorNum ); m.marshalSaHpiSensorEventMaskActionT( Action ); m.marshalSaHpiEventStateT( AssertEventMask ); m.marshalSaHpiEventStateT( DeassertEventMask ); rc = m.interchange( RPC_SAHPI_SENSOR_EVENT_MASKS_SET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); return rv; } public static long saHpiControlTypeGet( long SessionId, long ResourceId, long CtrlNum, saHpiControlTypeGetOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiCtrlNumT( CtrlNum ); rc = m.interchange( RPC_SAHPI_CONTROL_TYPE_GET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.Type = m.demarshalSaHpiCtrlTypeT(); } s.putMarshal( m ); return rv; } public static long saHpiControlGet( long SessionId, long ResourceId, long CtrlNum, SaHpiCtrlStateT CtrlState, saHpiControlGetOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; rc = HpiUtil.check( CtrlState ); if ( !rc ) { return SA_ERR_HPI_INVALID_PARAMS; } HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiCtrlNumT( CtrlNum ); m.marshalSaHpiCtrlStateT( CtrlState ); rc = m.interchange( RPC_SAHPI_CONTROL_GET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.CtrlMode = m.demarshalSaHpiCtrlModeT(); out.CtrlState = m.demarshalSaHpiCtrlStateT(); } s.putMarshal( m ); return rv; } public static long saHpiControlSet( long SessionId, long ResourceId, long CtrlNum, long CtrlMode, SaHpiCtrlStateT CtrlState ) throws HpiException { long rv; boolean rc; rc = HpiUtil.check( CtrlState ); if ( !rc ) { return SA_ERR_HPI_INVALID_PARAMS; } HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiCtrlNumT( CtrlNum ); m.marshalSaHpiCtrlModeT( CtrlMode ); m.marshalSaHpiCtrlStateT( CtrlState ); rc = m.interchange( RPC_SAHPI_CONTROL_SET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); return rv; } public static long saHpiIdrInfoGet( long SessionId, long ResourceId, long IdrId, saHpiIdrInfoGetOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiIdrIdT( IdrId ); rc = m.interchange( RPC_SAHPI_IDR_INFO_GET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.IdrInfo = m.demarshalSaHpiIdrInfoT(); } s.putMarshal( m ); return rv; } public static long saHpiIdrAreaHeaderGet( long SessionId, long ResourceId, long IdrId, long AreaType, long AreaId, saHpiIdrAreaHeaderGetOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiIdrIdT( IdrId ); m.marshalSaHpiIdrAreaTypeT( AreaType ); m.marshalSaHpiEntryIdT( AreaId ); rc = m.interchange( RPC_SAHPI_IDR_AREA_HEADER_GET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.NextAreaId = m.demarshalSaHpiEntryIdT(); out.Header = m.demarshalSaHpiIdrAreaHeaderT(); } s.putMarshal( m ); return rv; } public static long saHpiIdrAreaAdd( long SessionId, long ResourceId, long IdrId, long AreaType, saHpiIdrAreaAddOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiIdrIdT( IdrId ); m.marshalSaHpiIdrAreaTypeT( AreaType ); rc = m.interchange( RPC_SAHPI_IDR_AREA_ADD ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.AreaId = m.demarshalSaHpiEntryIdT(); } s.putMarshal( m ); return rv; } public static long saHpiIdrAreaAddById( long SessionId, long ResourceId, long IdrId, long AreaType, long AreaId ) throws HpiException { long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiIdrIdT( IdrId ); m.marshalSaHpiIdrAreaTypeT( AreaType ); m.marshalSaHpiEntryIdT( AreaId ); rc = m.interchange( RPC_SAHPI_IDR_AREA_ADD_BY_ID ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); return rv; } public static long saHpiIdrAreaDelete( long SessionId, long ResourceId, long IdrId, long AreaId ) throws HpiException { long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiIdrIdT( IdrId ); m.marshalSaHpiEntryIdT( AreaId ); rc = m.interchange( RPC_SAHPI_IDR_AREA_DELETE ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); return rv; } public static long saHpiIdrFieldGet( long SessionId, long ResourceId, long IdrId, long AreaId, long FieldType, long FieldId, saHpiIdrFieldGetOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiIdrIdT( IdrId ); m.marshalSaHpiEntryIdT( AreaId ); m.marshalSaHpiIdrFieldTypeT( FieldType ); m.marshalSaHpiEntryIdT( FieldId ); rc = m.interchange( RPC_SAHPI_IDR_FIELD_GET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.NextFieldId = m.demarshalSaHpiEntryIdT(); out.Field = m.demarshalSaHpiIdrFieldT(); } s.putMarshal( m ); return rv; } public static long saHpiIdrFieldAdd( long SessionId, long ResourceId, long IdrId, SaHpiIdrFieldT Field, saHpiIdrFieldAddOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; rc = HpiUtil.check( Field ); if ( !rc ) { return SA_ERR_HPI_INVALID_PARAMS; } HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiIdrIdT( IdrId ); m.marshalSaHpiIdrFieldT( Field ); rc = m.interchange( RPC_SAHPI_IDR_FIELD_ADD ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.Field = m.demarshalSaHpiIdrFieldT(); } s.putMarshal( m ); return rv; } public static long saHpiIdrFieldAddById( long SessionId, long ResourceId, long IdrId, SaHpiIdrFieldT Field ) throws HpiException { long rv; boolean rc; rc = HpiUtil.check( Field ); if ( !rc ) { return SA_ERR_HPI_INVALID_PARAMS; } HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiIdrIdT( IdrId ); m.marshalSaHpiIdrFieldT( Field ); rc = m.interchange( RPC_SAHPI_IDR_FIELD_ADD_BY_ID ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); return rv; } public static long saHpiIdrFieldSet( long SessionId, long ResourceId, long IdrId, SaHpiIdrFieldT Field ) throws HpiException { long rv; boolean rc; rc = HpiUtil.check( Field ); if ( !rc ) { return SA_ERR_HPI_INVALID_PARAMS; } HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiIdrIdT( IdrId ); m.marshalSaHpiIdrFieldT( Field ); rc = m.interchange( RPC_SAHPI_IDR_FIELD_SET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); return rv; } public static long saHpiIdrFieldDelete( long SessionId, long ResourceId, long IdrId, long AreaId, long FieldId ) throws HpiException { long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiIdrIdT( IdrId ); m.marshalSaHpiEntryIdT( AreaId ); m.marshalSaHpiEntryIdT( FieldId ); rc = m.interchange( RPC_SAHPI_IDR_FIELD_DELETE ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); return rv; } public static long saHpiWatchdogTimerGet( long SessionId, long ResourceId, long WatchdogNum, saHpiWatchdogTimerGetOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiWatchdogNumT( WatchdogNum ); rc = m.interchange( RPC_SAHPI_WATCHDOG_TIMER_GET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.Watchdog = m.demarshalSaHpiWatchdogT(); } s.putMarshal( m ); return rv; } public static long saHpiWatchdogTimerSet( long SessionId, long ResourceId, long WatchdogNum, SaHpiWatchdogT Watchdog ) throws HpiException { long rv; boolean rc; rc = HpiUtil.check( Watchdog ); if ( !rc ) { return SA_ERR_HPI_INVALID_PARAMS; } HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiWatchdogNumT( WatchdogNum ); m.marshalSaHpiWatchdogT( Watchdog ); rc = m.interchange( RPC_SAHPI_WATCHDOG_TIMER_SET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); return rv; } public static long saHpiWatchdogTimerReset( long SessionId, long ResourceId, long WatchdogNum ) throws HpiException { long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiWatchdogNumT( WatchdogNum ); rc = m.interchange( RPC_SAHPI_WATCHDOG_TIMER_RESET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); return rv; } public static long saHpiAnnunciatorGetNext( long SessionId, long ResourceId, long AnnunciatorNum, long Severity, long UnacknowledgedOnly, SaHpiAnnouncementT Announcement, saHpiAnnunciatorGetNextOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; rc = HpiUtil.check( Announcement ); if ( !rc ) { return SA_ERR_HPI_INVALID_PARAMS; } HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiAnnunciatorNumT( AnnunciatorNum ); m.marshalSaHpiSeverityT( Severity ); m.marshalSaHpiBoolT( UnacknowledgedOnly ); m.marshalSaHpiAnnouncementT( Announcement ); rc = m.interchange( RPC_SAHPI_ANNUNCIATOR_GET_NEXT ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.Announcement = m.demarshalSaHpiAnnouncementT(); } s.putMarshal( m ); return rv; } public static long saHpiAnnunciatorGet( long SessionId, long ResourceId, long AnnunciatorNum, long EntryId, saHpiAnnunciatorGetOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiAnnunciatorNumT( AnnunciatorNum ); m.marshalSaHpiEntryIdT( EntryId ); rc = m.interchange( RPC_SAHPI_ANNUNCIATOR_GET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.Announcement = m.demarshalSaHpiAnnouncementT(); } s.putMarshal( m ); return rv; } public static long saHpiAnnunciatorAcknowledge( long SessionId, long ResourceId, long AnnunciatorNum, long EntryId, long Severity ) throws HpiException { long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiAnnunciatorNumT( AnnunciatorNum ); m.marshalSaHpiEntryIdT( EntryId ); m.marshalSaHpiSeverityT( Severity ); rc = m.interchange( RPC_SAHPI_ANNUNCIATOR_ACKNOWLEDGE ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); return rv; } public static long saHpiAnnunciatorAdd( long SessionId, long ResourceId, long AnnunciatorNum, SaHpiAnnouncementT Announcement, saHpiAnnunciatorAddOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; rc = HpiUtil.check( Announcement ); if ( !rc ) { return SA_ERR_HPI_INVALID_PARAMS; } HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiAnnunciatorNumT( AnnunciatorNum ); m.marshalSaHpiAnnouncementT( Announcement ); rc = m.interchange( RPC_SAHPI_ANNUNCIATOR_ADD ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.Announcement = m.demarshalSaHpiAnnouncementT(); } s.putMarshal( m ); return rv; } public static long saHpiAnnunciatorDelete( long SessionId, long ResourceId, long AnnunciatorNum, long EntryId, long Severity ) throws HpiException { long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiAnnunciatorNumT( AnnunciatorNum ); m.marshalSaHpiEntryIdT( EntryId ); m.marshalSaHpiSeverityT( Severity ); rc = m.interchange( RPC_SAHPI_ANNUNCIATOR_DELETE ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); return rv; } public static long saHpiAnnunciatorModeGet( long SessionId, long ResourceId, long AnnunciatorNum, saHpiAnnunciatorModeGetOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiAnnunciatorNumT( AnnunciatorNum ); rc = m.interchange( RPC_SAHPI_ANNUNCIATOR_MODE_GET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.Mode = m.demarshalSaHpiAnnunciatorModeT(); } s.putMarshal( m ); return rv; } public static long saHpiAnnunciatorModeSet( long SessionId, long ResourceId, long AnnunciatorNum, long Mode ) throws HpiException { long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiAnnunciatorNumT( AnnunciatorNum ); m.marshalSaHpiAnnunciatorModeT( Mode ); rc = m.interchange( RPC_SAHPI_ANNUNCIATOR_MODE_SET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); return rv; } public static long saHpiDimiInfoGet( long SessionId, long ResourceId, long DimiNum, saHpiDimiInfoGetOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiDimiNumT( DimiNum ); rc = m.interchange( RPC_SAHPI_DIMI_INFO_GET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.DimiInfo = m.demarshalSaHpiDimiInfoT(); } s.putMarshal( m ); return rv; } public static long saHpiDimiTestInfoGet( long SessionId, long ResourceId, long DimiNum, long TestNum, saHpiDimiTestInfoGetOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiDimiNumT( DimiNum ); m.marshalSaHpiDimiTestNumT( TestNum ); rc = m.interchange( RPC_SAHPI_DIMI_TEST_INFO_GET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.DimiTest = m.demarshalSaHpiDimiTestT(); } s.putMarshal( m ); return rv; } public static long saHpiDimiTestReadinessGet( long SessionId, long ResourceId, long DimiNum, long TestNum, saHpiDimiTestReadinessGetOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiDimiNumT( DimiNum ); m.marshalSaHpiDimiTestNumT( TestNum ); rc = m.interchange( RPC_SAHPI_DIMI_TEST_READINESS_GET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.DimiReady = m.demarshalSaHpiDimiReadyT(); } s.putMarshal( m ); return rv; } public static long saHpiDimiTestCancel( long SessionId, long ResourceId, long DimiNum, long TestNum ) throws HpiException { long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiDimiNumT( DimiNum ); m.marshalSaHpiDimiTestNumT( TestNum ); rc = m.interchange( RPC_SAHPI_DIMI_TEST_CANCEL ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); return rv; } public static long saHpiDimiTestStatusGet( long SessionId, long ResourceId, long DimiNum, long TestNum, saHpiDimiTestStatusGetOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiDimiNumT( DimiNum ); m.marshalSaHpiDimiTestNumT( TestNum ); rc = m.interchange( RPC_SAHPI_DIMI_TEST_STATUS_GET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.PercentCompleted = m.demarshalSaHpiDimiTestPercentCompletedT(); out.RunStatus = m.demarshalSaHpiDimiTestRunStatusT(); } s.putMarshal( m ); return rv; } public static long saHpiDimiTestResultsGet( long SessionId, long ResourceId, long DimiNum, long TestNum, saHpiDimiTestResultsGetOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiDimiNumT( DimiNum ); m.marshalSaHpiDimiTestNumT( TestNum ); rc = m.interchange( RPC_SAHPI_DIMI_TEST_RESULTS_GET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.TestResults = m.demarshalSaHpiDimiTestResultsT(); } s.putMarshal( m ); return rv; } public static long saHpiFumiSpecInfoGet( long SessionId, long ResourceId, long FumiNum, saHpiFumiSpecInfoGetOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiFumiNumT( FumiNum ); rc = m.interchange( RPC_SAHPI_FUMI_SPEC_INFO_GET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.SpecInfo = m.demarshalSaHpiFumiSpecInfoT(); } s.putMarshal( m ); return rv; } public static long saHpiFumiServiceImpactGet( long SessionId, long ResourceId, long FumiNum, saHpiFumiServiceImpactGetOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiFumiNumT( FumiNum ); rc = m.interchange( RPC_SAHPI_FUMI_SERVICE_IMPACT_GET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.ServiceImpact = m.demarshalSaHpiFumiServiceImpactDataT(); } s.putMarshal( m ); return rv; } public static long saHpiFumiSourceSet( long SessionId, long ResourceId, long FumiNum, long BankNum, SaHpiTextBufferT SourceUri ) throws HpiException { long rv; boolean rc; rc = HpiUtil.check( SourceUri ); if ( !rc ) { return SA_ERR_HPI_INVALID_PARAMS; } HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiFumiNumT( FumiNum ); m.marshalSaHpiBankNumT( BankNum ); m.marshalSaHpiTextBufferT( SourceUri ); rc = m.interchange( RPC_SAHPI_FUMI_SOURCE_SET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); return rv; } public static long saHpiFumiSourceInfoValidateStart( long SessionId, long ResourceId, long FumiNum, long BankNum ) throws HpiException { long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiFumiNumT( FumiNum ); m.marshalSaHpiBankNumT( BankNum ); rc = m.interchange( RPC_SAHPI_FUMI_SOURCE_INFO_VALIDATE_START ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); return rv; } public static long saHpiFumiSourceInfoGet( long SessionId, long ResourceId, long FumiNum, long BankNum, saHpiFumiSourceInfoGetOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiFumiNumT( FumiNum ); m.marshalSaHpiBankNumT( BankNum ); rc = m.interchange( RPC_SAHPI_FUMI_SOURCE_INFO_GET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.SourceInfo = m.demarshalSaHpiFumiSourceInfoT(); } s.putMarshal( m ); return rv; } public static long saHpiFumiSourceComponentInfoGet( long SessionId, long ResourceId, long FumiNum, long BankNum, long ComponentEntryId, saHpiFumiSourceComponentInfoGetOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiFumiNumT( FumiNum ); m.marshalSaHpiBankNumT( BankNum ); m.marshalSaHpiEntryIdT( ComponentEntryId ); rc = m.interchange( RPC_SAHPI_FUMI_SOURCE_COMPONENT_INFO_GET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.NextComponentEntryId = m.demarshalSaHpiEntryIdT(); out.ComponentInfo = m.demarshalSaHpiFumiComponentInfoT(); } s.putMarshal( m ); return rv; } public static long saHpiFumiTargetInfoGet( long SessionId, long ResourceId, long FumiNum, long BankNum, saHpiFumiTargetInfoGetOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiFumiNumT( FumiNum ); m.marshalSaHpiBankNumT( BankNum ); rc = m.interchange( RPC_SAHPI_FUMI_TARGET_INFO_GET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.BankInfo = m.demarshalSaHpiFumiBankInfoT(); } s.putMarshal( m ); return rv; } public static long saHpiFumiTargetComponentInfoGet( long SessionId, long ResourceId, long FumiNum, long BankNum, long ComponentEntryId, saHpiFumiTargetComponentInfoGetOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiFumiNumT( FumiNum ); m.marshalSaHpiBankNumT( BankNum ); m.marshalSaHpiEntryIdT( ComponentEntryId ); rc = m.interchange( RPC_SAHPI_FUMI_TARGET_COMPONENT_INFO_GET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.NextComponentEntryId = m.demarshalSaHpiEntryIdT(); out.ComponentInfo = m.demarshalSaHpiFumiComponentInfoT(); } s.putMarshal( m ); return rv; } public static long saHpiFumiLogicalTargetInfoGet( long SessionId, long ResourceId, long FumiNum, saHpiFumiLogicalTargetInfoGetOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiFumiNumT( FumiNum ); rc = m.interchange( RPC_SAHPI_FUMI_LOGICAL_TARGET_INFO_GET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.BankInfo = m.demarshalSaHpiFumiLogicalBankInfoT(); } s.putMarshal( m ); return rv; } public static long saHpiFumiLogicalTargetComponentInfoGet( long SessionId, long ResourceId, long FumiNum, long ComponentEntryId, saHpiFumiLogicalTargetComponentInfoGetOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiFumiNumT( FumiNum ); m.marshalSaHpiEntryIdT( ComponentEntryId ); rc = m.interchange( RPC_SAHPI_FUMI_LOGICAL_TARGET_COMPONENT_INFO_GET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.NextComponentEntryId = m.demarshalSaHpiEntryIdT(); out.ComponentInfo = m.demarshalSaHpiFumiLogicalComponentInfoT(); } s.putMarshal( m ); return rv; } public static long saHpiFumiBackupStart( long SessionId, long ResourceId, long FumiNum ) throws HpiException { long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiFumiNumT( FumiNum ); rc = m.interchange( RPC_SAHPI_FUMI_BACKUP_START ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); return rv; } public static long saHpiFumiBankBootOrderSet( long SessionId, long ResourceId, long FumiNum, long BankNum, long Position ) throws HpiException { long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiFumiNumT( FumiNum ); m.marshalSaHpiBankNumT( BankNum ); m.marshalSaHpiUint32T( Position ); rc = m.interchange( RPC_SAHPI_FUMI_BANK_BOOT_ORDER_SET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); return rv; } public static long saHpiFumiBankCopyStart( long SessionId, long ResourceId, long FumiNum, long SourceBankNum, long TargetBankNum ) throws HpiException { long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiFumiNumT( FumiNum ); m.marshalSaHpiBankNumT( SourceBankNum ); m.marshalSaHpiBankNumT( TargetBankNum ); rc = m.interchange( RPC_SAHPI_FUMI_BANK_COPY_START ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); return rv; } public static long saHpiFumiInstallStart( long SessionId, long ResourceId, long FumiNum, long BankNum ) throws HpiException { long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiFumiNumT( FumiNum ); m.marshalSaHpiBankNumT( BankNum ); rc = m.interchange( RPC_SAHPI_FUMI_INSTALL_START ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); return rv; } public static long saHpiFumiUpgradeStatusGet( long SessionId, long ResourceId, long FumiNum, long BankNum, saHpiFumiUpgradeStatusGetOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiFumiNumT( FumiNum ); m.marshalSaHpiBankNumT( BankNum ); rc = m.interchange( RPC_SAHPI_FUMI_UPGRADE_STATUS_GET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.UpgradeStatus = m.demarshalSaHpiFumiUpgradeStatusT(); } s.putMarshal( m ); return rv; } public static long saHpiFumiTargetVerifyStart( long SessionId, long ResourceId, long FumiNum, long BankNum ) throws HpiException { long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiFumiNumT( FumiNum ); m.marshalSaHpiBankNumT( BankNum ); rc = m.interchange( RPC_SAHPI_FUMI_TARGET_VERIFY_START ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); return rv; } public static long saHpiFumiTargetVerifyMainStart( long SessionId, long ResourceId, long FumiNum ) throws HpiException { long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiFumiNumT( FumiNum ); rc = m.interchange( RPC_SAHPI_FUMI_TARGET_VERIFY_MAIN_START ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); return rv; } public static long saHpiFumiUpgradeCancel( long SessionId, long ResourceId, long FumiNum, long BankNum ) throws HpiException { long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiFumiNumT( FumiNum ); m.marshalSaHpiBankNumT( BankNum ); rc = m.interchange( RPC_SAHPI_FUMI_UPGRADE_CANCEL ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); return rv; } public static long saHpiFumiAutoRollbackDisableGet( long SessionId, long ResourceId, long FumiNum, saHpiFumiAutoRollbackDisableGetOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiFumiNumT( FumiNum ); rc = m.interchange( RPC_SAHPI_FUMI_AUTO_ROLLBACK_DISABLE_GET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.Disable = m.demarshalSaHpiBoolT(); } s.putMarshal( m ); return rv; } public static long saHpiFumiAutoRollbackDisableSet( long SessionId, long ResourceId, long FumiNum, long Disable ) throws HpiException { long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiFumiNumT( FumiNum ); m.marshalSaHpiBoolT( Disable ); rc = m.interchange( RPC_SAHPI_FUMI_AUTO_ROLLBACK_DISABLE_SET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); return rv; } public static long saHpiFumiRollbackStart( long SessionId, long ResourceId, long FumiNum ) throws HpiException { long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiFumiNumT( FumiNum ); rc = m.interchange( RPC_SAHPI_FUMI_ROLLBACK_START ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); return rv; } public static long saHpiFumiActivateStart( long SessionId, long ResourceId, long FumiNum, long Logical ) throws HpiException { long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiFumiNumT( FumiNum ); m.marshalSaHpiBoolT( Logical ); rc = m.interchange( RPC_SAHPI_FUMI_ACTIVATE_START ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); return rv; } public static long saHpiFumiCleanup( long SessionId, long ResourceId, long FumiNum, long BankNum ) throws HpiException { long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiFumiNumT( FumiNum ); m.marshalSaHpiBankNumT( BankNum ); rc = m.interchange( RPC_SAHPI_FUMI_CLEANUP ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); return rv; } public static long saHpiHotSwapPolicyCancel( long SessionId, long ResourceId ) throws HpiException { long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); rc = m.interchange( RPC_SAHPI_HOTSWAP_POLICY_CANCEL ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); return rv; } public static long saHpiResourceActiveSet( long SessionId, long ResourceId ) throws HpiException { long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); rc = m.interchange( RPC_SAHPI_RESOURCE_ACTIVE_SET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); return rv; } public static long saHpiResourceInactiveSet( long SessionId, long ResourceId ) throws HpiException { long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); rc = m.interchange( RPC_SAHPI_RESOURCE_INACTIVE_SET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); return rv; } public static long saHpiAutoInsertTimeoutGet( long SessionId, saHpiAutoInsertTimeoutGetOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); rc = m.interchange( RPC_SAHPI_AUTO_INSERT_TIMEOUT_GET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.Timeout = m.demarshalSaHpiTimeoutT(); } s.putMarshal( m ); return rv; } public static long saHpiAutoInsertTimeoutSet( long SessionId, long Timeout ) throws HpiException { long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiTimeoutT( Timeout ); rc = m.interchange( RPC_SAHPI_AUTO_INSERT_TIMEOUT_SET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); return rv; } public static long saHpiAutoExtractTimeoutGet( long SessionId, long ResourceId, saHpiAutoExtractTimeoutGetOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); rc = m.interchange( RPC_SAHPI_AUTO_EXTRACT_TIMEOUT_GET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.Timeout = m.demarshalSaHpiTimeoutT(); } s.putMarshal( m ); return rv; } public static long saHpiAutoExtractTimeoutSet( long SessionId, long ResourceId, long Timeout ) throws HpiException { long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiTimeoutT( Timeout ); rc = m.interchange( RPC_SAHPI_AUTO_EXTRACT_TIMEOUT_SET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); return rv; } public static long saHpiHotSwapStateGet( long SessionId, long ResourceId, saHpiHotSwapStateGetOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); rc = m.interchange( RPC_SAHPI_HOTSWAP_STATE_GET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.State = m.demarshalSaHpiHsStateT(); } s.putMarshal( m ); return rv; } public static long saHpiHotSwapActionRequest( long SessionId, long ResourceId, long Action ) throws HpiException { long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiHsActionT( Action ); rc = m.interchange( RPC_SAHPI_HOTSWAP_ACTION_REQUEST ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); return rv; } public static long saHpiHotSwapIndicatorStateGet( long SessionId, long ResourceId, saHpiHotSwapIndicatorStateGetOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); rc = m.interchange( RPC_SAHPI_HOTSWAP_INDICATOR_STATE_GET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.State = m.demarshalSaHpiHsIndicatorStateT(); } s.putMarshal( m ); return rv; } public static long saHpiHotSwapIndicatorStateSet( long SessionId, long ResourceId, long State ) throws HpiException { long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiHsIndicatorStateT( State ); rc = m.interchange( RPC_SAHPI_HOTSWAP_INDICATOR_STATE_SET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); return rv; } public static long saHpiParmControl( long SessionId, long ResourceId, long Action ) throws HpiException { long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiParmActionT( Action ); rc = m.interchange( RPC_SAHPI_PARM_CONTROL ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); return rv; } public static long saHpiResourceLoadIdGet( long SessionId, long ResourceId, saHpiResourceLoadIdGetOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); rc = m.interchange( RPC_SAHPI_RESOURCE_LOADID_GET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.LoadId = m.demarshalSaHpiLoadIdT(); } s.putMarshal( m ); return rv; } public static long saHpiResourceLoadIdSet( long SessionId, long ResourceId, SaHpiLoadIdT LoadId ) throws HpiException { long rv; boolean rc; rc = HpiUtil.check( LoadId ); if ( !rc ) { return SA_ERR_HPI_INVALID_PARAMS; } HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiLoadIdT( LoadId ); rc = m.interchange( RPC_SAHPI_RESOURCE_LOADID_SET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); return rv; } public static long saHpiResourceResetStateGet( long SessionId, long ResourceId, saHpiResourceResetStateGetOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); rc = m.interchange( RPC_SAHPI_RESOURCE_RESET_STATE_GET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.ResetAction = m.demarshalSaHpiResetActionT(); } s.putMarshal( m ); return rv; } public static long saHpiResourceResetStateSet( long SessionId, long ResourceId, long ResetAction ) throws HpiException { long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiResetActionT( ResetAction ); rc = m.interchange( RPC_SAHPI_RESOURCE_RESET_STATE_SET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); return rv; } public static long saHpiResourcePowerStateGet( long SessionId, long ResourceId, saHpiResourcePowerStateGetOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); rc = m.interchange( RPC_SAHPI_RESOURCE_POWER_STATE_GET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.State = m.demarshalSaHpiPowerStateT(); } s.putMarshal( m ); return rv; } public static long saHpiResourcePowerStateSet( long SessionId, long ResourceId, long State ) throws HpiException { long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); m.marshalSaHpiPowerStateT( State ); rc = m.interchange( RPC_SAHPI_RESOURCE_POWER_STATE_SET ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); return rv; } }; openhpi-3.6.1/baselibs/java/openhpi_baselib/HpiUtil.java0000644000175100017510000001433712575647300022245 0ustar mohanmohan/* -*- java -*- * * Copyright (C) 2012, Pigeon Point Systems * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ package org.openhpi; import java.io.UnsupportedEncodingException; import java.lang.IllegalArgumentException; import java.lang.Math; import java.util.Arrays; import java.util.Collections; import java.util.List; import static org.openhpi.HpiDataTypes.*; public class HpiUtil extends HpiUtilGen { /********************************************************** * NB: ToXXX throws IllegalArgumentException if lookup fails *********************************************************/ // Just to ensure nobody creates it private HpiUtil() { // empty } /********************************************************** * Text Buffer Helpers *********************************************************/ public static String fromSaHpiTextBufferT( SaHpiTextBufferT tb ) { // NB: Only BCD+/ASCII6/ASCII(Eng)/ are now supported. // TODO implement further boolean ok = false; ok = ok || ( tb.DataType == SAHPI_TL_TYPE_BCDPLUS ); ok = ok || ( tb.DataType == SAHPI_TL_TYPE_ASCII6 ); boolean eng = ( tb.Language == SAHPI_LANG_ENGLISH ); ok = ok || ( ( tb.DataType == SAHPI_TL_TYPE_TEXT ) && eng ); String s = null; if ( ok ) { try { s = new String( tb.Data, 0, (int)tb.DataLength, "US-ASCII" ); } catch ( UnsupportedEncodingException e ) { throw new IllegalArgumentException(); } } else { throw new IllegalArgumentException(); } return s; } public static SaHpiTextBufferT toSaHpiTextBufferT( String s ) { // NB: Only BCD+/ASCII6/ASCII(Eng)/ are now supported. // TODO implement further SaHpiTextBufferT tb = new SaHpiTextBufferT(); tb.DataType = SAHPI_TL_TYPE_TEXT; tb.Language = SAHPI_LANG_ENGLISH; tb.DataLength = 0; tb.Data = new byte[(int)SAHPI_MAX_TEXT_BUFFER_LENGTH]; try { byte[] bytes = s.getBytes( "US-ASCII" ); tb.DataLength = Math.min( (long)bytes.length, SAHPI_MAX_TEXT_BUFFER_LENGTH ); System.arraycopy( bytes, 0, tb.Data, 0, (int)(tb.DataLength) ); } catch ( UnsupportedEncodingException e ) { } return tb; } /********************************************************** * Entity Path Helpers *********************************************************/ public static SaHpiEntityPathT makeUnspecifiedSaHpiEntityPathT() { SaHpiEntityPathT ep = new SaHpiEntityPathT(); ep.Entry = new SaHpiEntityT[(int)SAHPI_MAX_ENTITY_PATH]; for ( int i = 0; i < SAHPI_MAX_ENTITY_PATH; ++i ) { ep.Entry[i] = new SaHpiEntityT(); ep.Entry[i].EntityType = SAHPI_ENT_UNSPECIFIED; ep.Entry[i].EntityLocation = 0; } return ep; } public static SaHpiEntityPathT makeRootSaHpiEntityPathT() { SaHpiEntityPathT ep = makeUnspecifiedSaHpiEntityPathT(); ep.Entry[0].EntityType = SAHPI_ENT_ROOT; ep.Entry[0].EntityLocation = 0; return ep; } public static SaHpiEntityPathT cloneSaHpiEntityPathT( SaHpiEntityPathT ep ) { if ( ep == null ) { return null; } SaHpiEntityPathT ep2 = new SaHpiEntityPathT(); ep2.Entry = new SaHpiEntityT[(int)SAHPI_MAX_ENTITY_PATH]; for ( int i = 0; i < SAHPI_MAX_ENTITY_PATH; ++i ) { ep2.Entry[i] = new SaHpiEntityT(); ep2.Entry[i].EntityType = ep.Entry[i].EntityType; ep2.Entry[i].EntityLocation = ep.Entry[i].EntityLocation; } return ep2; } private static int getSaHpiEntityPathLength( SaHpiEntityPathT ep ) { int i; for ( i = 0; i < SAHPI_MAX_ENTITY_PATH; ++i ) { if ( ( ep.Entry[i].EntityType == SAHPI_ENT_ROOT ) ) { if ( ep.Entry[i].EntityLocation == 0 ) { break; } } } return i; } public static String fromSaHpiEntityPathT( SaHpiEntityPathT ep ) { StringBuilder b = new StringBuilder(); int l = getSaHpiEntityPathLength( ep ); for ( int i = ( l - 1 ); i >= 0; --i ) { String s = String.format("{%s,%d}", fromSaHpiEntityTypeT( ep.Entry[i].EntityType ), ep.Entry[i].EntityLocation ); b.append( s ); } return b.toString(); } public static SaHpiEntityPathT toSaHpiEntityPathT( String s ) { SaHpiEntityPathT ep = makeRootSaHpiEntityPathT(); if ( s.length() == 0 ) { return ep; } if ( s.indexOf( '{' ) != 0 ) { throw new IllegalArgumentException(); } int i = 0; List parts = Arrays.asList( s.substring( 1 ).split( "\\{" ) ); Collections.reverse( parts ); for ( String part : parts ) { if ( !part.endsWith( "}" ) ) { throw new IllegalArgumentException(); } String[] et_el = part.substring( 0, part.length() - 1 ).split( "," ); if ( et_el.length != 2 ) { throw new IllegalArgumentException(); } ep.Entry[i].EntityType = toSaHpiEntityTypeT( et_el[0] ); try { ep.Entry[i].EntityLocation = Integer.parseInt( et_el[1] ); } catch ( NumberFormatException e ) { throw new IllegalArgumentException(); } ++i; if ( i == SAHPI_MAX_ENTITY_PATH ) { break; } } if ( i < SAHPI_MAX_ENTITY_PATH ) { ep.Entry[i].EntityType = SAHPI_ENT_ROOT; ep.Entry[i].EntityLocation = 0; } return ep; } }; openhpi-3.6.1/baselibs/java/openhpi_baselib/OhpiCollections.java0000644000175100017510000000346012575647300023760 0ustar mohanmohan/* -*- java -*- * * Copyright (C) 2012, Pigeon Point Systems * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ package org.openhpi; import java.util.Collection; import java.util.LinkedList; import static org.openhpi.HpiDataTypes.*; import static org.openhpi.OhpiDataTypes.*; import static org.openhpi.Ohpi.*; /********************************************************** * OHPI Utility Functions: Collections *********************************************************/ public class OhpiCollections { // Just to ensure nobody creates it private OhpiCollections() { // empty } /*********************************************************** * Handler Ids **********************************************************/ public static Collection HandlerIds( long sid ) throws HpiException { LinkedList all = new LinkedList(); long hid = SAHPI_FIRST_ENTRY; do { oHpiHandlerGetNextOutputParamsT out = new oHpiHandlerGetNextOutputParamsT(); long rv = oHpiHandlerGetNext( sid, hid, out ); if ( ( hid == SAHPI_FIRST_ENTRY ) && ( rv == SA_ERR_HPI_NOT_PRESENT ) ) { break; } if ( rv != SA_OK ) { break; } hid = out.NextHandlerId; all.add( hid ); } while ( hid != SAHPI_LAST_ENTRY ); return all; } }; // class HpiCollections openhpi-3.6.1/baselibs/java/openhpi_baselib/Ohpi.java0000644000175100017510000002073412575647300021564 0ustar mohanmohan/* -*- java -*- * * Copyright (C) 2012, Pigeon Point Systems * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ package org.openhpi; import java.io.InputStream; import java.io.IOException; import java.util.jar.Attributes; import java.util.jar.Manifest; import static org.openhpi.HpiDataTypes.*; import static org.openhpi.OhpiDataTypes.*; /********************************************************** * OHPI API (NB: Partly implemented) *********************************************************/ // TODO Implement the rest of OHPI API public class Ohpi { // Just to ensure nobody creates it protected Ohpi() { // empty } public static long oHpiVersionGet() { long vmajor = 0L; long vminor = 0L; long vaux = 0L; String sversion = null; try { // Trying to get version from jar manifest InputStream s = Hpi.class.getResourceAsStream( "/META-INF/MANIFEST.MF" ); if ( s != null ) { Manifest m = new Manifest( s ); Attributes a = m.getAttributes( "org.openhpi" ); if ( a != null ) { sversion = a.getValue( Attributes.Name.IMPLEMENTATION_VERSION ); } } } catch ( IOException e ) { // do nothing } if ( sversion != null ) { String[] parts = sversion.split( "\\." ); if ( parts.length >= 0 ) { vmajor = Long.parseLong( parts[0] ); } if ( parts.length >= 1 ) { vminor = Long.parseLong( parts[1] ); } if ( parts.length >= 2 ) { vaux = Long.parseLong( parts[2] ); } } return ( vmajor << 48 ) | ( vminor << 32 ) | ( vaux << 16 ); } public static long oHpiDomainAdd( SaHpiTextBufferT Host, int Port, SaHpiEntityPathT EntityRoot, oHpiDomainAddOutputParamsT out ) { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } String s = HpiUtil.fromSaHpiTextBufferT( Host ); if ( s == null ) { return SA_ERR_HPI_INVALID_PARAMS; } HpiDomain d = HpiCore.createDomain( s, Port, EntityRoot ); if ( d == null ) { return SA_ERR_HPI_INTERNAL_ERROR; } out.DomainId = d.getLocalDid(); return SA_OK; } public static long oHpiHandlerCreate( long SessionId, oHpiHandlerConfigT HandlerConfig, oHpiHandlerCreateOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; rc = OhpiUtil.check( HandlerConfig ); if ( !rc ) { return SA_ERR_HPI_INVALID_PARAMS; } HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshaloHpiHandlerConfigT( HandlerConfig ); rc = m.interchange( RPC_OHPI_HANDLER_CREATE ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.HandlerId = m.demarshaloHpiHandlerIdT(); } s.putMarshal( m ); return rv; } public static long oHpiHandlerDestroy( long SessionId, long HandlerId ) throws HpiException { long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshaloHpiHandlerIdT( HandlerId ); rc = m.interchange( RPC_OHPI_HANDLER_DESTROY ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); return rv; } public static long oHpiHandlerInfo( long SessionId, long HandlerId, oHpiHandlerInfoOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshaloHpiHandlerIdT( HandlerId ); rc = m.interchange( RPC_OHPI_HANDLER_INFO ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.HandlerInfo = m.demarshaloHpiHandlerInfoT(); out.HandlerConfig = m.demarshaloHpiHandlerConfigT(); } s.putMarshal( m ); return rv; } public static long oHpiHandlerGetNext( long SessionId, long HandlerId, oHpiHandlerGetNextOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshaloHpiHandlerIdT( HandlerId ); rc = m.interchange( RPC_OHPI_HANDLER_GET_NEXT ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.NextHandlerId = m.demarshaloHpiHandlerIdT(); } s.putMarshal( m ); return rv; } public static long oHpiHandlerFind( long SessionId, long ResourceId, oHpiHandlerFindOutputParamsT out ) throws HpiException { if ( out == null ) { return SA_ERR_HPI_INVALID_PARAMS; } long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshalSaHpiResourceIdT( ResourceId ); rc = m.interchange( RPC_OHPI_HANDLER_FIND ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { out.HandlerId = m.demarshaloHpiHandlerIdT(); } s.putMarshal( m ); return rv; } public static long oHpiHandlerRetry( long SessionId, long HandlerId ) throws HpiException { long rv; boolean rc; HpiSession s = HpiCore.getSession( SessionId ); if ( s == null ) { return SA_ERR_HPI_INVALID_SESSION; } OhpiMarshal m = s.getMarshal(); if ( m == null ) { return SA_ERR_HPI_NO_RESPONSE; } m.marshalSaHpiSessionIdT( s.getRemoteSid() ); m.marshaloHpiHandlerIdT( HandlerId ); rc = m.interchange( RPC_OHPI_HANDLER_RETRY ); if ( !rc ) { m.close(); return SA_ERR_HPI_NO_RESPONSE; } rv = m.demarshalSaErrorT(); if ( rv == SA_OK ) { // No output arguments } s.putMarshal( m ); return rv; } }; openhpi-3.6.1/test_agent.data.example0000644000175100017510000001137612575647264016627 0ustar mohanmohan # create resource with empty caps new {SYSTEM_BLADE,1} cd {SYSTEM_BLADE,1} set RptEntry.ResourceCapabilities = RESOURCE set Visible = TRUE cd / # create resource with FRU caps new {SYSTEM_BLADE,2} cd {SYSTEM_BLADE,2} set RptEntry.ResourceCapabilities = RESOURCE | FRU set Visible = TRUE cd / # create resource with HS caps new {SYSTEM_BLADE,3} cd {SYSTEM_BLADE,3} set RptEntry.ResourceCapabilities = RESOURCE | FRU | MANAGED_HOTSWAP set Visible = TRUE cd / ## create failed resource #new {SYSTEM_BLADE,4} #cd {SYSTEM_BLADE,4} #set ResourceFailed = TRUE #set Visible = TRUE #cd / # create resource with HS caps but without HS indicator new {SYSTEM_BLADE,5} cd {SYSTEM_BLADE,5} set RptEntry.ResourceCapabilities = RESOURCE | FRU | MANAGED_HOTSWAP set RptEntry.HotSwapCapabilities = 0 set Visible = TRUE cd / # create resource with HS caps and with read-only AI timeout new {SYSTEM_BLADE,6} cd {SYSTEM_BLADE,6} set RptEntry.ResourceCapabilities = RESOURCE | FRU | MANAGED_HOTSWAP set RptEntry.HotSwapCapabilities = AUTOEXTRACT_READ_ONLY set Visible = TRUE cd / # create just resource new {SYSTEM_BLADE,7} cd {SYSTEM_BLADE,7} set Visible = TRUE # create log new log # create controls new ctrl-1 cd ctrl-1 set Rdr.CtrlRec.Type = DIGITAL set Rdr.CtrlRec.Digital.Default = ON set State.Digital = ON set Visible = TRUE cd .. new ctrl-2 cd ctrl-2 set Rdr.CtrlRec.Type = DISCRETE set Visible = TRUE cd .. new ctrl-3 cd ctrl-3 set Rdr.CtrlRec.Type = ANALOG set Rdr.CtrlRec.Analog.Min = 0 set Rdr.CtrlRec.Analog.Max = 100 set Rdr.CtrlRec.Analog.Default = 50 set State.Analog = 60 set Visible = TRUE cd .. new ctrl-4 cd ctrl-4 set Rdr.CtrlRec.Type = STREAM set Rdr.CtrlRec.Stream.Default.Stream = BINARY:123456 set State.Stream.Stream = BINARY:654321 set Visible = TRUE cd .. new ctrl-5 cd ctrl-5 set Rdr.CtrlRec.Type = TEXT set Visible = TRUE cd .. new ctrl-6 cd ctrl-6 set Rdr.CtrlRec.Type = OEM set Visible = TRUE cd .. # write-only control new ctrl-7 cd ctrl-7 set Rdr.CtrlRec.WriteOnly = TRUE set Visible = TRUE cd .. # control with read-only mode new ctrl-8 cd ctrl-8 set Rdr.CtrlRec.DefaultMode.ReadOnly = TRUE set Visible = TRUE cd .. # create sensors new sen-1 cd sen-1 set Rdr.SensorRec.Category = THRESHOLD set Visible = TRUE cd .. new sen-2 cd sen-2 set Rdr.SensorRec.Category = GENERIC set Visible = TRUE cd .. # sensor without enable control new sen-3 cd sen-3 set Rdr.SensorRec.EnableCtrl = FALSE set Visible = TRUE cd .. # sensor with READ_ONLY event control new sen-4 cd sen-4 set Rdr.SensorRec.Category = GENERIC set Rdr.SensorRec.EventCtrl = READ_ONLY set Visible = TRUE cd .. # sensor with READ_ONLY_MASKS event control new sen-5 cd sen-5 set Rdr.SensorRec.Category = GENERIC set Rdr.SensorRec.EventCtrl = READ_ONLY_MASKS set Visible = TRUE cd .. # sensor with asserted state new sen-6 cd sen-6 set Rdr.SensorRec.Category = GENERIC set EventState = STATE_05 set Visible = TRUE cd .. # sensor with no readable thresholds new sen-7 cd sen-7 set Rdr.SensorRec.Category = THRESHOLD set Rdr.SensorRec.ThresholdDefn.ReadThold = 0 set Visible = TRUE cd .. # sensor with no writable thresholds new sen-8 cd sen-8 set Rdr.SensorRec.Category = THRESHOLD set Rdr.SensorRec.ThresholdDefn.WriteThold = 0 set Visible = TRUE cd .. # create RO inventory new inv-1 cd inv-1 set ReadOnly = TRUE set Visible = TRUE # RO Area new area-1 cd area-1 set ReadOnly = TRUE # RO Field new field-1 cd field-1 set ReadOnly = TRUE cd .. # RW Field new field-2 cd field-2 set ReadOnly = FALSE cd ../../ # RW Area new area-2 cd area-2 set ReadOnly = FALSE # RO Field new field-1 cd field-1 set ReadOnly = TRUE cd .. # RW Field new field-2 cd field-2 set ReadOnly = FALSE cd ../../../ # create RW inventory new inv-2 cd inv-2 set ReadOnly = FALSE set Visible = TRUE # RO Area new area-1 cd area-1 set ReadOnly = TRUE # RO Field new field-1 cd field-1 set ReadOnly = TRUE cd .. # RW Field new field-2 cd field-2 set ReadOnly = FALSE cd ../../ # RW Area new area-2 cd area-2 set ReadOnly = FALSE # RO Field new field-1 cd field-1 set ReadOnly = TRUE cd .. # RW Field new field-2 cd field-2 set ReadOnly = FALSE cd ../../../ # create watchdog new wdt-0 cd wdt-0 set Visible = TRUE cd .. # create annunciator new ann-1 cd ann-1 set Visible = TRUE cd .. # create annunciator with AUTO ReadOnly Mode new ann-2 cd ann-2 set Rdr.AnnunciatorRec.ModeReadOnly = TRUE set Mode = AUTO set Visible = TRUE cd .. # create dimi with single test new dimi-1 cd dimi-1 set Visible = TRUE new test-0 cd .. # create fumi with logical bank new fumi-1 cd fumi-1 set Visible = TRUE cd .. # create fumi with explicit banks new fumi-2 cd fumi-2 set Rdr.FumiRec.Capability = BANKCOPY | TARGET_VERIFY | COMPONENTS | BANKREORDER new bank-1 new bank-2 new bank-3 new bank-4 new bank-5 set Visible = TRUE cd .. cd / openhpi-3.6.1/hpi_shell/0000755000175100017510000000000012605014530014116 5ustar mohanmohanopenhpi-3.6.1/hpi_shell/sensor.c0000644000175100017510000004457512575647264015640 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Kouzmich < Mikhail.V.Kouzmich@intel.com > * * */ #include #include #include #include #include #include #include #include "hpi_ui.h" #include "hpi_cmd.h" typedef struct { SaHpiResourceIdT rptid; SaHpiInstrumentIdT rdrnum; SaHpiRdrT rdr_entry; } sen_block_env_t; static sen_block_env_t sen_block_env; typedef struct { SaHpiResourceIdT rptid; } hs_block_env_t; static hs_block_env_t hs_block_env; typedef enum { THRES_LI = 0, THRES_LA, THRES_LC, THRES_UI, THRES_UA, THRES_UC, THRES_PH, THRES_NH } thres_enum_t; typedef struct { char *name; char *short_name; } thres_name_def_t; static thres_name_def_t thres_names[] = { { "Lower Minor:", "li" }, { "Lower Major:", "la" }, { "Lower Critical:", "lc" }, { "Upper Minor:", "ui" }, { "Upper Major:", "ua" }, { "Upper Critical:", "uc" }, { "Positive Hysteresis:", "ph" }, { "Negative Hysteresis:", "nh" } }; static void Set_thres_value(SaHpiSensorReadingT *item, double value) { item->IsSupported = 1; switch (item->Type) { case SAHPI_SENSOR_READING_TYPE_INT64: item->Value.SensorInt64 = (SaHpiInt64T)value; break; case SAHPI_SENSOR_READING_TYPE_UINT64: item->Value.SensorUint64 = (SaHpiUint64T)value; break; case SAHPI_SENSOR_READING_TYPE_FLOAT64: item->Value.SensorFloat64 = (SaHpiFloat64T)value; break; case SAHPI_SENSOR_READING_TYPE_BUFFER: break; } } static char *get_thres_value(SaHpiSensorReadingT *item, char *buf, int len) { char *val; if (item->IsSupported != SAHPI_TRUE) return(""); switch (item->Type) { case SAHPI_SENSOR_READING_TYPE_INT64: snprintf(buf, len, "%" PRId64, (int64_t)item->Value.SensorInt64); break; case SAHPI_SENSOR_READING_TYPE_UINT64: snprintf(buf, len, "%" PRIu64, (uint64_t)item->Value.SensorUint64); break; case SAHPI_SENSOR_READING_TYPE_FLOAT64: snprintf(buf, len, "%10.3f", item->Value.SensorFloat64); break; case SAHPI_SENSOR_READING_TYPE_BUFFER: val = (char *)(item->Value.SensorBuffer); if (val != NULL) { snprintf(buf, len, "%s", val); break; } return(""); }; return(buf); } static int Get_and_set_thres_value(thres_enum_t num, SaHpiSensorReadingT *item) { char tmp[256], str[1024]; float f; int res, modify = 0; if (item->IsSupported) { snprintf(str, 1024, "%s(%s) ==> ", thres_names[num].name, get_thres_value(item, tmp, 256)); res = get_string_param(str, tmp, 256); if (res != 0) return(0); res = sscanf(tmp, "%f", &f); if (res == 1) { modify = 1; Set_thres_value(item, f); } }; return(modify); } static ret_code_t set_threshold_packet(SaHpiSensorThresholdsT *senstbuff) { term_def_t *term; int i; float f; int res; SaHpiSensorReadingT *item; for (;;) { term = get_next_term(); if (term == NULL) break; for (i = 0; i <= THRES_NH; i++) { if (strcmp(term->term, thres_names[i].short_name) == 0) break; }; switch (i) { case THRES_LI: item = &(senstbuff->LowMinor); break; case THRES_LA: item = &(senstbuff->LowMajor); break; case THRES_LC: item = &(senstbuff->LowCritical); break; case THRES_UI: item = &(senstbuff->UpMinor); break; case THRES_UA: item = &(senstbuff->UpMajor); break; case THRES_UC: item = &(senstbuff->UpCritical); break; case THRES_PH: item = &(senstbuff->PosThdHysteresis); break; case THRES_NH: item = &(senstbuff->NegThdHysteresis); break; default: return(HPI_SHELL_PARM_ERROR); }; term = get_next_term(); if (term == NULL) return(HPI_SHELL_PARM_ERROR); res = sscanf(term->term, "%f", &f); if (res != 1) return(HPI_SHELL_PARM_ERROR); Set_thres_value(item, f); }; return(HPI_SHELL_OK); } static ret_code_t set_threshold(SaHpiResourceIdT rptid, SaHpiRdrT *rdr) { SaErrorT rv; SaHpiSensorTypeT type; SaHpiEventCategoryT categ; SaHpiSensorThresholdsT senstbuff; SaHpiSensorRangeT *range; SaHpiSensorNumT num = rdr->RdrTypeUnion.SensorRec.Num; int modify = 0, i; char tmp[256]; ret_code_t ret; rv = saHpiSensorTypeGet(Domain->sessionId, rptid, num, &type, &categ); if (rv != SA_OK) { printf("ERROR: saHpiSensorTypeGet error = %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; if (categ != SAHPI_EC_THRESHOLD) return(HPI_SHELL_CMD_ERROR); rv = saHpiSensorThresholdsGet(Domain->sessionId, rptid, num, &senstbuff); if (rv != SA_OK) { printf("ERROR: saHpiSensorThresholdsGet error = %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; if (read_stdin) { printf("Range ("); range = &(rdr->RdrTypeUnion.SensorRec.DataFormat.Range); if ((range->Flags & SAHPI_SRF_MIN) == 0) printf("-"); else printf("%s", get_thres_value(&(range->Min), tmp, 256)); printf(":"); if ((range->Flags & SAHPI_SRF_MAX) == 0) printf("-)\n"); else printf("%s)\n", get_thres_value(&(range->Max), tmp, 256)); if (Get_and_set_thres_value(THRES_LI, &(senstbuff.LowMinor))) modify = 1; if (Get_and_set_thres_value(THRES_LA, &(senstbuff.LowMajor))) modify = 1; if (Get_and_set_thres_value(THRES_LC, &(senstbuff.LowCritical))) modify = 1; if (Get_and_set_thres_value(THRES_UI, &(senstbuff.UpMinor))) modify = 1; if (Get_and_set_thres_value(THRES_UA, &(senstbuff.UpMajor))) modify = 1; if (Get_and_set_thres_value(THRES_UC, &(senstbuff.UpCritical))) modify = 1; if (Get_and_set_thres_value(THRES_PH, &(senstbuff.PosThdHysteresis))) modify = 1; if (Get_and_set_thres_value(THRES_NH, &(senstbuff.NegThdHysteresis))) modify = 1; if (modify == 0) return(HPI_SHELL_OK); print_thres_value(&(senstbuff.LowCritical), thres_names[THRES_LC].name, NULL, 0, ui_print); print_thres_value(&(senstbuff.LowMajor), thres_names[THRES_LA].name, NULL, 0, ui_print); print_thres_value(&(senstbuff.LowMinor), thres_names[THRES_LI].name, NULL, 0, ui_print); print_thres_value(&(senstbuff.UpCritical), thres_names[THRES_UC].name, NULL, 0, ui_print); print_thres_value(&(senstbuff.UpMajor), thres_names[THRES_UA].name, NULL, 0, ui_print); print_thres_value(&(senstbuff.UpMinor), thres_names[THRES_UI].name, NULL, 0, ui_print); print_thres_value(&(senstbuff.PosThdHysteresis), thres_names[THRES_PH].name, NULL, 0, ui_print); print_thres_value(&(senstbuff.NegThdHysteresis), thres_names[THRES_NH].name, NULL, 0, ui_print); i = get_string_param("Set new threshold (yes|no) : ", tmp, 256); if ((i != 0) || (strncmp(tmp, "yes", 3) != 0)) { printf("No action.\n"); return(HPI_SHELL_OK); } } else { ret = set_threshold_packet(&senstbuff); if (ret != HPI_SHELL_OK) return(ret); }; rv = saHpiSensorThresholdsSet(Domain->sessionId, rptid, num, &senstbuff); if (rv != SA_OK) { printf("saHpiSensorThresholdsSet error %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); } else printf("Sensor Threshold Value Set Succeed.\n"); return(HPI_SHELL_OK); } ret_code_t sen_block_show(void) { SaErrorT res; res = show_sensor(Domain->sessionId, sen_block_env.rptid, sen_block_env.rdrnum, ui_print); if (res != SA_OK) return(HPI_SHELL_CMD_ERROR); return(HPI_SHELL_OK); } ret_code_t sen_block_setthres(void) { set_threshold(sen_block_env.rptid, &(sen_block_env.rdr_entry)); return(HPI_SHELL_OK); } static ret_code_t sen_block_set_enable(SaHpiBoolT value) { SaHpiBoolT val; SaErrorT rv; char *str; rv = saHpiSensorEnableSet(Domain->sessionId, sen_block_env.rptid, sen_block_env.rdrnum, value); if (rv != SA_OK) { printf("saHpiSensorEnableSet: error: %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; rv = saHpiSensorEnableGet(Domain->sessionId, sen_block_env.rptid, sen_block_env.rdrnum, &val); if (rv != SA_OK) { printf("saHpiSensorEnableGet: error: %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; if (val) str = "Enable"; else str = "Disable"; printf("Sensor:(%d/%d) %s\n", sen_block_env.rptid, sen_block_env.rdrnum, str); return(HPI_SHELL_OK); } ret_code_t sen_block_enable(void) { return(sen_block_set_enable(SAHPI_TRUE)); } ret_code_t sen_block_disable(void) { return(sen_block_set_enable(SAHPI_FALSE)); } static ret_code_t sen_block_set_evtenb(SaHpiBoolT value) { SaHpiBoolT val; SaErrorT rv; char *str; rv = saHpiSensorEventEnableSet(Domain->sessionId, sen_block_env.rptid, sen_block_env.rdrnum, value); if (rv != SA_OK) { printf("saHpiSensorEventEnableSet: error: %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; rv = saHpiSensorEventEnableGet(Domain->sessionId, sen_block_env.rptid, sen_block_env.rdrnum, &val); if (rv != SA_OK) { printf("saHpiSensorEventEnableGet: error: %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; if (val) str = "Enable"; else str = "Disable"; printf("Sensor:(%d/%d) event %s\n", sen_block_env.rptid, sen_block_env.rdrnum, str); return(HPI_SHELL_OK); } ret_code_t sen_block_evtenb(void) { return(sen_block_set_evtenb(SAHPI_TRUE)); } ret_code_t sen_block_evtdis(void) { return(sen_block_set_evtenb(SAHPI_FALSE)); } static ret_code_t sen_block_set_masks(SaHpiSensorEventMaskActionT act) { SaErrorT rv; char rep[10]; SaHpiEventStateT assert, deassert; int res; char buf[256]; if (act == SAHPI_SENS_ADD_EVENTS_TO_MASKS) { strcpy(rep, "add"); } else { strcpy(rep, "remove"); }; rv = saHpiSensorEventMasksGet(Domain->sessionId, sen_block_env.rptid, sen_block_env.rdrnum, &assert, &deassert); if (rv != SA_OK) { printf("saHpiSensorEventMasksGet: error: %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; get_hex_int_param("Assert mask = 0x", &res); assert = res; get_hex_int_param("Deassert mask = 0x", &res); deassert = res; if (read_stdin) { snprintf(buf, 256, "Sensor:(%d/%d) %s masks: assert = 0x%4.4x " "deassert = 0x%4.4x (yes/no)?", sen_block_env.rptid, sen_block_env.rdrnum, rep, assert, deassert); get_string_param(buf, rep, 4); if (strcmp(rep, "yes") != 0) { printf("No action.\n"); return(HPI_SHELL_OK); } }; rv = saHpiSensorEventMasksSet(Domain->sessionId, sen_block_env.rptid, sen_block_env.rdrnum, act, assert, deassert); if (rv != SA_OK) { printf("saHpiSensorEventMasksSet: error: %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; return(HPI_SHELL_OK); } ret_code_t sen_block_maskadd(void) { return(sen_block_set_masks(SAHPI_SENS_ADD_EVENTS_TO_MASKS)); } ret_code_t sen_block_maskrm(void) { return(sen_block_set_masks(SAHPI_SENS_REMOVE_EVENTS_FROM_MASKS)); } static ret_code_t sensor_command_block(SaHpiResourceIdT rptid, SaHpiInstrumentIdT rdrnum, SaHpiRdrT *rdr_entry) { char buf[256]; term_def_t *term; int res; show_sensor(Domain->sessionId, rptid, rdrnum, ui_print); for (;;) { block_type = SEN_COM; res = get_new_command("sensor block ==> "); if (res == 2) { unget_term(); return HPI_SHELL_OK; }; term = get_next_term(); if (term == NULL) continue; snprintf(buf, 256, "%s", term->term); if ((strcmp(buf, "q") == 0) || (strcmp(buf, "quit") == 0)) { break; }; }; return(HPI_SHELL_OK); } ret_code_t sen_block(void) { SaHpiRdrTypeT type; SaErrorT rv; ret_code_t ret; ret = ask_rpt(&(sen_block_env.rptid)); if (ret != HPI_SHELL_OK) return(ret); type = SAHPI_SENSOR_RDR; ret = ask_rdr(sen_block_env.rptid, type, &(sen_block_env.rdrnum)); if (ret != HPI_SHELL_OK) return(ret); rv = saHpiRdrGetByInstrumentId(Domain->sessionId, sen_block_env.rptid, type, sen_block_env.rdrnum, &(sen_block_env.rdr_entry)); if (rv != SA_OK) { printf("ERROR!!! saHpiRdrGetByInstrumentId" "(Rpt=%d RdrType=%d Rdr=%d): %s\n", sen_block_env.rptid, type, sen_block_env.rdrnum, oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; ret = sensor_command_block(sen_block_env.rptid, sen_block_env.rdrnum, &(sen_block_env.rdr_entry)); block_type = MAIN_COM; return(ret); } ret_code_t list_sensor(void) { SaErrorT rv; rv = sensor_list(Domain->sessionId, ui_print); if (rv != SA_OK) return(HPI_SHELL_CMD_ERROR); return(HPI_SHELL_OK); } ret_code_t hs_block_policy(void) { SaErrorT rv; rv = saHpiHotSwapPolicyCancel(Domain->sessionId, hs_block_env.rptid); if (rv != SA_OK) { printf("ERROR!!! saHpiHotSwapPolicyCancel: %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; return(HPI_SHELL_OK); } ret_code_t hs_block_active(void) { SaErrorT rv; rv = saHpiResourceActiveSet(Domain->sessionId, hs_block_env.rptid); if (rv != SA_OK) { printf("ERROR!!! saHpiResourceActiveSet: %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; return(HPI_SHELL_OK); } ret_code_t hs_block_inact(void) { SaErrorT rv; rv = saHpiResourceInactiveSet(Domain->sessionId, hs_block_env.rptid); if (rv != SA_OK) { printf("ERROR!!! saHpiResourceInactiveSet: %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; return(HPI_SHELL_OK); } static ret_code_t hs_block_getsettime(int get) { SaErrorT rv; int ins, res, i; char buf[256]; SaHpiTimeoutT timeout; ins = -1; res = get_string_param("Timeout type(insert|extract): ", buf, 256); if (res != 0) { printf("Invalid timeout type"); return(HPI_SHELL_PARM_ERROR); }; if (strcmp(buf, "insert") == 0) ins = 1; if (strcmp(buf, "extract") == 0) ins = 0; if (ins < 0) { printf("Invalid timeout type: %s\n", buf); return(HPI_SHELL_PARM_ERROR); }; if (get) { if (ins) { rv = saHpiAutoInsertTimeoutGet(Domain->sessionId, &timeout); if (rv != SA_OK) { printf("ERROR!!! saHpiAutoInsertTimeoutGet:" " %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; if ( timeout != SAHPI_TIMEOUT_BLOCK ) { printf("Auto-insert timeout: %" PRId64 " nsec\n", (int64_t)timeout); } else { printf("Auto-insert timeout: BLOCK\n"); } return(HPI_SHELL_OK); }; rv = saHpiAutoExtractTimeoutGet(Domain->sessionId, hs_block_env.rptid, &timeout); if (rv != SA_OK) { printf("ERROR!!! saHpiAutoExtractTimeoutGet: %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; if ( timeout != SAHPI_TIMEOUT_BLOCK ) { printf("Auto-extract timeout: %" PRId64 " nsec\n", (int64_t)timeout); } else { printf("Auto-extract timeout: BLOCK\n"); } return(HPI_SHELL_OK); }; i = get_int_param("Timeout (msec): ", &res); if (i != 1) { printf("Invalid timeout\n"); return(HPI_SHELL_PARM_ERROR); }; if ( res >= 0) { timeout = 1000000LL * res; } else { timeout = SAHPI_TIMEOUT_BLOCK; } if (ins) { rv = saHpiAutoInsertTimeoutSet(Domain->sessionId, timeout); if (rv != SA_OK) { printf("ERROR!!! saHpiAutoInsertTimeoutSet: %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; return(HPI_SHELL_OK); }; rv = saHpiAutoExtractTimeoutSet(Domain->sessionId, hs_block_env.rptid, timeout); if (rv != SA_OK) { printf("ERROR!!! saHpiAutoExtractTimeoutSet: %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; return(HPI_SHELL_OK); } ret_code_t hs_block_gtime(void) { return(hs_block_getsettime(1)); } ret_code_t hs_block_stime(void) { return(hs_block_getsettime(0)); } ret_code_t hs_block_state(void) { SaErrorT rv; SaHpiHsStateT state; char *str; rv = saHpiHotSwapStateGet(Domain->sessionId, hs_block_env.rptid, &state); if (rv != SA_OK) { printf("ERROR!!! saHpiHotSwapStateGet: %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); } else { switch (state) { case SAHPI_HS_STATE_INACTIVE: str = "Inactive"; break; case SAHPI_HS_STATE_INSERTION_PENDING: str = "Ins. Pending"; break; case SAHPI_HS_STATE_ACTIVE: str = "Active"; break; case SAHPI_HS_STATE_EXTRACTION_PENDING: str = "Ext. Pending"; break; case SAHPI_HS_STATE_NOT_PRESENT: str = "Not present"; break; default: str = "Unknown"; break; }; printf("Hot Swap State: %s\n", str); }; return(HPI_SHELL_OK); } ret_code_t hs_block_action(void) { SaErrorT rv; SaHpiHsActionT action; char buf[256]; int res; res = get_string_param("Action type(insert|extract): ", buf, 256); if (res != 0) { printf("Invalid action type"); return(HPI_SHELL_PARM_ERROR); }; if (strcmp(buf, "insert") == 0) action = SAHPI_HS_ACTION_INSERTION; else if (strcmp(buf, "extract") == 0) action = SAHPI_HS_ACTION_EXTRACTION; else { printf("Invalid action type: %s\n", buf); return(HPI_SHELL_PARM_ERROR); }; rv = saHpiHotSwapActionRequest(Domain->sessionId, hs_block_env.rptid, action); if (rv != SA_OK) { printf("ERROR!!! saHpiHotSwapActionRequest: %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; return(HPI_SHELL_OK); } ret_code_t hs_block_ind(void) { SaErrorT rv; int res; char buf[256]; SaHpiHsIndicatorStateT ind_state; char *str; res = get_string_param("Action type(get|on|off): ", buf, 256); if (res != 0) { printf("Invalid action type"); return(HPI_SHELL_PARM_ERROR); }; if (strcmp(buf, "get") == 0) { rv = saHpiHotSwapIndicatorStateGet(Domain->sessionId, hs_block_env.rptid, &ind_state); if (rv != SA_OK) { printf("ERROR!!! saHpiHotSwapIndicatorStateGet: %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; if (ind_state == SAHPI_HS_INDICATOR_OFF) str = "OFF"; else str = "ON"; printf("Hot Swap Indicator: %s\n", str); return(HPI_SHELL_OK); }; if (strcmp(buf, "on") == 0) ind_state = SAHPI_HS_INDICATOR_ON; else if (strcmp(buf, "off") == 0) ind_state = SAHPI_HS_INDICATOR_OFF; else { printf("Invalid action type: %s\n", buf); return(HPI_SHELL_PARM_ERROR); }; rv = saHpiHotSwapIndicatorStateSet(Domain->sessionId, hs_block_env.rptid, ind_state); if (rv != SA_OK) { printf("ERROR!!! saHpiHotSwapIndicatorStateSet: %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; return(HPI_SHELL_OK); } ret_code_t hs_block(void) { SaHpiResourceIdT rptid; char buf[256]; ret_code_t ret; term_def_t *term; int res; ret = ask_rpt(&rptid); if (ret != HPI_SHELL_OK) return(ret); hs_block_env.rptid = rptid; for (;;) { block_type = HS_COM; res = get_new_command("Hot swap block ==> "); if (res == 2) { unget_term(); block_type = MAIN_COM; return HPI_SHELL_OK; }; term = get_next_term(); if (term == NULL) continue; snprintf(buf, 256, "%s", term->term); if ((strcmp(buf, "q") == 0) || (strcmp(buf, "quit") == 0)) break; }; block_type = MAIN_COM; return SA_OK; } openhpi-3.6.1/hpi_shell/session.c0000644000175100017510000002134712575647264016002 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Racing Guo * Aaron Chen * Changes: * 11.30.2004 - Kouzmich: porting to HPI-B * * */ #include #include #include #include #include #include #include "hpi_cmd.h" #include static GThread *ge_thread; static GThread *prog_thread; int prt_flag = 0; int show_event_short = 0; static int in_progress = 0; static GCond *thread_wait = NULL; static GMutex *thread_mutex = NULL; static char *progress_mes; Domain_t *Domain; // curreny domain GSList *domainlist; // domain list #define PROGRESS_BUF_SIZE 80 /* Progress bar implementation */ static void* progress_bar(void *unused) { char buf[PROGRESS_BUF_SIZE], A[20]; int i = 0, t = 0, len, mes_len; memset(buf, 0, PROGRESS_BUF_SIZE); mes_len = strlen(progress_mes); while (in_progress) { snprintf(A, 10, " %d.%d s ", t / 10, t % 10); len = strlen(A); memset(buf + mes_len, '.', i); strncpy(buf, progress_mes, mes_len); if (i > 8) strncpy(buf + mes_len + (i - len) / 2, A, len); printf("%s\r", buf); fflush(stdout); #if GLIB_CHECK_VERSION (2, 32, 0) gint64 time; time = g_get_monotonic_time(); time = time + G_USEC_PER_SEC / 10; wrap_g_cond_timed_wait(thread_wait, thread_mutex, time); #else GTimeVal time; g_get_current_time(&time); g_time_val_add(&time, G_USEC_PER_SEC / 10); wrap_g_cond_timed_wait(thread_wait, thread_mutex, &time); #endif if (i < (PROGRESS_BUF_SIZE - mes_len - 1)) i++; t++; }; g_thread_exit(0); return (void *)1; } /* This function creates thread for progress bar. * mes - progress bar title. */ void do_progress(char *mes) { progress_mes = mes; in_progress = 1; prog_thread = wrap_g_thread_create_new("progress_bar",progress_bar, 0, FALSE, 0); } /* This function deletes thread for progress bar. */ void delete_progress() { char buf[PROGRESS_BUF_SIZE]; in_progress = 0; memset(buf, ' ', PROGRESS_BUF_SIZE); buf[PROGRESS_BUF_SIZE - 1] = 0; printf("%s\n", buf); } static const SaHpiEntityPathT * get_event_ep(const SaHpiEventT * event, const SaHpiRptEntryT * rptentry, const SaHpiRdrT * rdr ) { const SaHpiEntityPathT * rptentry_ep = 0; const SaHpiEntityPathT * rdr_ep = 0; if (rptentry && (rptentry->ResourceCapabilities != 0)) { rptentry_ep = &rptentry->ResourceEntity; } if (rdr && (rdr->RdrType != SAHPI_NO_RECORD)) { rdr_ep = &rdr->Entity; } switch ( event->EventType ) { case SAHPI_ET_DOMAIN: case SAHPI_ET_USER: return 0; case SAHPI_ET_RESOURCE: case SAHPI_ET_HOTSWAP: return rptentry_ep; case SAHPI_ET_HPI_SW: case SAHPI_ET_OEM: return rptentry_ep ? rptentry_ep : rdr_ep; case SAHPI_ET_SENSOR: case SAHPI_ET_SENSOR_ENABLE_CHANGE: case SAHPI_ET_WATCHDOG: case SAHPI_ET_DIMI: case SAHPI_ET_DIMI_UPDATE: case SAHPI_ET_FUMI: return rdr_ep ? rdr_ep : rptentry_ep; default: return 0; } } static void* get_event(void *unused) { SaHpiEventT event; SaErrorT rv; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; rv = saHpiSubscribe(Domain->sessionId); if (rv != SA_OK) { printf("hpi_shell>Fail to Subscribe event\n"); return (void *)0; } while(1) { for(;;) { rdr.RdrType = SAHPI_NO_RECORD; rptentry.ResourceId = 0; memset(&event, 0xF, sizeof(event)); rv = saHpiEventGet(Domain->sessionId, SAHPI_TIMEOUT_BLOCK, &event, &rdr, &rptentry, NULL); if ((rv == SA_ERR_HPI_INVALID_SESSION) && (Domain->session_opened == 0)) { break; } else if (rv != SA_OK ) { printf("saHpiEventGet failed with error <%d>\n", rv); break; } if (prt_flag == 1) { if (show_event_short) { show_short_event(&event, ui_print); } else { const SaHpiEntityPathT * ep; ep = get_event_ep( &event, &rptentry, &rdr); if ((!ep) && (event.Source != SAHPI_UNSPECIFIED_RESOURCE_ID)) { rv = saHpiRptEntryGetByResourceId(Domain->sessionId, event.Source, &rptentry); if ( rv == SA_OK ) { ep = get_event_ep(&event, &rptentry, &rdr); } } oh_print_event(&event, ep, 4); } } }/*the loop for retrieving event*/ if (rv == SA_ERR_HPI_INVALID_SESSION) { break; } g_usleep(G_USEC_PER_SEC); } return (void *)1; } void set_Subscribe(Domain_t *domain, int as) // as = 1 - Subscribe // as = 0 - UnSubscribe // if domain == NULL - for all opened domains { int i, n; gpointer ptr; Domain_t *dmn; if ((domain != (Domain_t *)NULL) && domain->session_opened) { if (as) saHpiSubscribe(domain->sessionId); else saHpiUnsubscribe(domain->sessionId); return; }; n = g_slist_length(domainlist); for (i = 0; i < n; i++) { ptr = g_slist_nth_data(domainlist, i); if (ptr == (gpointer)NULL) return; dmn = (Domain_t *)ptr; if (dmn->session_opened) { if (as) saHpiSubscribe(dmn->sessionId); else saHpiUnsubscribe(dmn->sessionId); } } } static SaErrorT get_sessionId(Domain_t *domain) { SaErrorT rv; SaHpiDomainInfoT info; if (domain->session_opened) return(SA_OK); rv = saHpiSessionOpen(domain->domainId, &(domain->sessionId), NULL); if (rv != SA_OK) { printf("saHpiSessionOpen error %s\n", oh_lookup_error(rv)); return rv; }; domain->session_opened = 1; rv = saHpiDomainInfoGet(domain->sessionId, &info); if (rv != SA_OK) { printf("ERROR!!! saHpiDomainInfoGet: %s\n", oh_lookup_error(rv)); return(rv); }; domain->domainId = info.DomainId; return(SA_OK); } static SaErrorT do_discover(Domain_t *domain) { SaErrorT rv; if (!domain->sessionId) { rv = get_sessionId(domain); if (rv != SA_OK) return(-1); }; if (domain->discovered) return(SA_OK); do_progress("Discover"); rv = saHpiDiscover(domain->sessionId); if (rv != SA_OK) { delete_progress(); printf("saHpiDiscover error %s\n", oh_lookup_error(rv)); return rv; }; delete_progress(); domain->discovered = 1; printf("Discovery done\n"); return(SA_OK); } int add_domain(Domain_t *domain) { SaErrorT rv; GSList *ptr; rv = do_discover(domain); if (rv != SA_OK) return(-1); ptr = g_slist_find(domainlist, domain); if (ptr == (GSList *)NULL) domainlist = g_slist_append(domainlist, domain); return(0); } int open_session(SaHpiDomainIdT domainId, int eflag) { Domain_t *par_domain; if (!g_thread_supported()) { wrap_g_thread_init(NULL); }; thread_wait = wrap_g_cond_new_init(); thread_mutex = wrap_g_mutex_new_init(); par_domain = (Domain_t *)malloc(sizeof(Domain_t)); memset(par_domain, 0, sizeof(Domain_t)); par_domain->domainId = domainId; if (get_sessionId(par_domain) != SA_OK) return(-1); // set current domain Domain = par_domain; if (eflag) { show_event_short = 1; prt_flag = 1; ge_thread = wrap_g_thread_create_new("get_event",get_event, 0, FALSE, 0); }; // add main domain to the domain list if (add_domain(par_domain) != SA_OK) return(-1); printf("\tEnter a command or \"help\" for list of commands\n"); if (! eflag) ge_thread = wrap_g_thread_create_new("get_event",get_event, 0, FALSE, 0); return 0; } int close_session() { SaErrorT rv; Domain->session_opened = 0; rv = saHpiSessionClose(Domain->sessionId); if (rv != SA_OK) { printf("saHpiSessionClose error %s\n", oh_lookup_error(rv)); return -1; } // Wait a bit for get_event thread completion g_usleep(G_USEC_PER_SEC / 4); return 0; } openhpi-3.6.1/hpi_shell/Makefile.am0000644000175100017510000000154012575647264016200 0ustar mohanmohan .NOTPARALLEL: MAINTAINERCLEANFILES = Makefile.in MOSTLYCLEANFILES = @TEST_CLEAN@ EXTRA_DIST = hpi_ui.h Makefile.mingw32 version.rc AM_CPPFLAGS = -DG_LOG_DOMAIN=\"hpi_shell\" AM_CPPFLAGS += -I$(top_srcdir)/include -I$(top_srcdir)/utils AM_CPPFLAGS += -I$(top_srcdir)/openhpid \ -I$(top_srcdir)/marshal \ -I$(top_srcdir)/clients \ -DCLIENT COMMONLIBS = $(top_builddir)/transport/libopenhpitransport.la \ $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/baselib/libopenhpi.la bin_PROGRAMS = hpi_shell hpi_shell_SOURCES = \ cmdparser.c \ commands.c \ ctrl_inv.c \ dimi.c \ fumi.c \ hpi_cmd.c \ hpi_cmd.h \ inputcmd.c \ sensor.c \ service.c \ session.c \ show.c \ $(top_srcdir)/clients/clients.c hpi_shell_LDADD = $(COMMONLIBS) clean-local: rm -f *~ *.o openhpi-3.6.1/hpi_shell/Makefile.mingw320000644000175100017510000000160212575647264017070 0ustar mohanmohan # $(top_srcdir)/clients/clients.c include ../Makefile.mingw32.def TARGET := hpi_shell.exe SRC := ../clients/clients.c \ cmdparser.c \ commands.c \ ctrl_inv.c \ dimi.c \ fumi.c \ hpi_cmd.c \ inputcmd.c \ sensor.c \ service.c \ session.c \ show.c \ version.rc OBJ := $(patsubst %.rc, %.o, $(patsubst %.c, %.o, $(patsubst %.cpp, %.o, ${SRC}))) DEFS := -DG_LOG_DOMAIN=\"hpi_shell\" DEFS += -DSAHPI_API="__declspec(dllimport)" INCLUDES := ${GLIB_INCLUDES} -I ../mingw32 -I ../include -I ../utils -I ../clients LIBS := ${GLIB_LIBS} ${GTHREAD_LIBS} LIBS += -L ../baselib -lopenhpi LIBS += -L ../utils -lopenhpiutils CPPFLAGS += ${DEFS} ${INCLUDES} .PHONY: all clean .SUFFIXES: .rc all : ${TARGET} ${TARGET} : ${OBJ} ${CXX} -o $@ $^ ${LIBS} .rc.o: ${RC} ${RCFLAGS} $< $@ clean: rm -f ${OBJ} ${TARGET} openhpi-3.6.1/hpi_shell/fumi.c0000644000175100017510000007474212575647264015266 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (c) 2008 Pigeon Point Systems. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak * * */ #include #include #include #include "hpi_ui.h" #include "hpi_cmd.h" typedef struct { SaHpiResourceIdT rptid; SaHpiFumiNumT fuminum; SaHpiFumiCapabilityT fumicaps; } fumi_block_env_t; static fumi_block_env_t fumi_block_env; static ret_code_t get_banknum_prompt( char * prompt, SaHpiBankNumT * banknum ) { int i, res; i = get_int_param( prompt, &res ); if ( i != 1 ) { printf( "Error!!! Invalid Bank Num\n" ); return HPI_SHELL_PARM_ERROR ; } *banknum = (SaHpiBankNumT)res; return HPI_SHELL_OK; } static ret_code_t get_banknum( SaHpiBankNumT * banknum ) { return get_banknum_prompt( "Bank Num(0 == active bank): ", banknum ); } static ret_code_t get_position( SaHpiUint32T * position ) { int i, res; i = get_int_param( "Position of the bank in boot order: ", &res ); if ( i != 1 ) { printf( "Error!!! Invalid position\n" ); return HPI_SHELL_PARM_ERROR ; } *position = (SaHpiUint32T)res; return HPI_SHELL_OK; } static ret_code_t get_uri( SaHpiTextBufferT* uri ) { int i; i = get_string_param("Source URI: ", (char*)(uri->Data), SAHPI_MAX_TEXT_BUFFER_LENGTH); if ( i != 0 ) { printf( "Error!!! Invalid string: %s\n", uri->Data ); return HPI_SHELL_PARM_ERROR ; } uri->DataType = SAHPI_TL_TYPE_TEXT; uri->Language = SAHPI_LANG_ENGLISH; uri->DataLength = strlen( (char*)(uri->Data) ); return HPI_SHELL_OK; } static void show_fw_info( const char * fwname, const char * indent, SaHpiFumiFirmwareInstanceInfoT * fwinfo ) { printf( "%s", indent ); printf( "%s Present: %s\n", fwname, ( fwinfo->InstancePresent == SAHPI_FALSE ) ? "FALSE" : "TRUE" ); if ( fwinfo->InstancePresent != SAHPI_FALSE ) { printf( "%s ", indent ); print_text_buffer_text( "Identifier: \"", &fwinfo->Identifier, "\"\n", ui_print ); printf( "%s ", indent ); print_text_buffer_text( "Description: \"", &fwinfo->Description, "\"\n", ui_print ); printf( "%s ", indent ); print_text_buffer_text( "DateTime: \"", &fwinfo->DateTime, "\"\n", ui_print ); printf( "%s ", indent ); printf( "Version: %u.%u.%u\n", fwinfo->MajorVersion, fwinfo->MinorVersion, fwinfo->AuxVersion ); } } static void show_component_info( const char * indent, SaHpiFumiComponentInfoT * cinfo ) { char fw_info_indent[256]; printf( "%s", indent ); printf( "Component %u\n", cinfo->ComponentId ); strncpy( fw_info_indent, indent, sizeof(fw_info_indent) ); strncat( fw_info_indent, " ", sizeof(fw_info_indent) ); show_fw_info( "Main Instance", fw_info_indent, &cinfo->MainFwInstance ); printf( "%s ", indent ); printf( "ComponentFlags 0x%x\n", cinfo->ComponentFlags ); } static ret_code_t show_spec_info( SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiFumiNumT fuminum ) { SaErrorT rv; SaHpiFumiSpecInfoT info; rv = saHpiFumiSpecInfoGet( sessionId, rptid, fuminum, &info ); if ( rv != SA_OK ) { printf( "ERROR!!! saHpiFumiSpecInfoGet: %s\n", oh_lookup_error( rv ) ); return HPI_SHELL_CMD_ERROR; } printf( "SpecInfo Type: %s\n", oh_lookup_fumispecinfotype( info.SpecInfoType ) ); switch ( info.SpecInfoType ) { case SAHPI_FUMI_SPEC_INFO_NONE: break; case SAHPI_FUMI_SPEC_INFO_SAF_DEFINED: printf( " Spec ID: %s\n", oh_lookup_fumisafdefinedspecid( info.SpecInfoTypeUnion.SafDefined.SpecID ) ); printf( " Revision ID: %u\n", info.SpecInfoTypeUnion.SafDefined.RevisionID ); break; case SAHPI_FUMI_SPEC_INFO_OEM_DEFINED: { unsigned int i; SaHpiTextBufferT tb_mid; rv = oh_decode_manufacturerid( info.SpecInfoTypeUnion.OemDefined.Mid, &tb_mid ); if ( rv != SA_OK ) { printf( "ERROR!!! oh_decode_manufacturerid: %s\n", oh_lookup_error( rv ) ); return HPI_SHELL_CMD_ERROR; } print_text_buffer_text( " Manufacturer ID: ", &tb_mid, "\n", ui_print ); printf( " Body:" ); for ( i = 0; i < info.SpecInfoTypeUnion.OemDefined.BodyLength; ++i ) { printf( " %02x", info.SpecInfoTypeUnion.OemDefined.Body[i] ); } printf( " (len=%u)\n", i ); } break; default: printf( "Unknown SpecInfo Type\n" ); return HPI_SHELL_CMD_ERROR; } return HPI_SHELL_OK; } static ret_code_t show_service_impact( SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiFumiNumT fuminum ) { unsigned int i; SaErrorT rv; SaHpiFumiServiceImpactDataT si; rv = saHpiFumiServiceImpactGet( sessionId, rptid, fuminum, &si ); if ( rv != SA_OK ) { printf( "ERROR!!! saHpiFumiServiceImpactGet: %s\n", oh_lookup_error( rv ) ); return HPI_SHELL_CMD_ERROR; } if ( si.NumEntities == 0 ) { printf( "No Service Impact\n" ); return HPI_SHELL_OK; } printf( "Service Impact:\n" ); for ( i = 0; i < si.NumEntities && i < SAHPI_FUMI_MAX_ENTITIES_IMPACTED; ++i ) { oh_big_textbuffer tmpbuf; oh_init_bigtext(&tmpbuf); rv = oh_decode_entitypath( &si.ImpactedEntities[i].ImpactedEntity, &tmpbuf ); if ( rv != SA_OK ) { printf( "ERROR!!! oh_decode_entitypath: %s\n", oh_lookup_error( rv ) ); return HPI_SHELL_CMD_ERROR; } printf( " " ); fwrite( tmpbuf.Data, tmpbuf.DataLength, 1, stdout ); printf( ": %s\n", oh_lookup_fumiserviceimpact( si.ImpactedEntities[i].ServiceImpact ) ); } return HPI_SHELL_OK; } static ret_code_t set_source( SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiFumiNumT fuminum, SaHpiBankNumT banknum, SaHpiTextBufferT* uri ) { SaErrorT rv; rv = saHpiFumiSourceSet( sessionId, rptid, fuminum, banknum, uri ); if ( rv != SA_OK ) { printf( "ERROR!!! saHpiFumiSourceSet: %s\n", oh_lookup_error( rv ) ); return HPI_SHELL_CMD_ERROR; } return HPI_SHELL_OK; } static ret_code_t start_source_validation( SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiFumiNumT fuminum, SaHpiBankNumT banknum ) { SaErrorT rv; rv = saHpiFumiSourceInfoValidateStart( sessionId, rptid, fuminum, banknum ); if ( rv != SA_OK ) { printf( "ERROR!!! saHpiFumiSourceInfoValidateStart: %s\n", oh_lookup_error( rv ) ); return HPI_SHELL_CMD_ERROR; } return HPI_SHELL_OK; } static ret_code_t show_source_info( SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiFumiNumT fuminum, SaHpiBankNumT banknum ) { SaErrorT rv; SaHpiFumiSourceInfoT info; rv = saHpiFumiSourceInfoGet( sessionId, rptid, fuminum, banknum, &info ); if ( rv != SA_OK ) { printf( "ERROR!!! saHpiFumiSourceInfoGet: %s\n", oh_lookup_error( rv ) ); return HPI_SHELL_CMD_ERROR; } printf( "Bank Num: %d\n", banknum ); print_text_buffer_text( " Source URI: \"", &info.SourceUri, "\"\n", ui_print ); printf( " Source status: %s\n", oh_lookup_fumisourcestatus( info.SourceStatus ) ); print_text_buffer_text( " Identifier: \"", &info.Identifier, "\"\n", ui_print ); print_text_buffer_text( " Description: \"", &info.Description, "\"\n", ui_print ); print_text_buffer_text( " DateTime: \"", &info.DateTime, "\"\n", ui_print ); printf( " Version: %u.%u.%u\n", info.MajorVersion, info.MinorVersion, info.AuxVersion ); return HPI_SHELL_OK; } static ret_code_t show_source_component_info( SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiFumiNumT fuminum, SaHpiBankNumT banknum ) { SaErrorT rv; SaHpiEntryIdT id = SAHPI_FIRST_ENTRY, next_id; SaHpiFumiComponentInfoT cinfo; while ( id != SAHPI_LAST_ENTRY ) { rv = saHpiFumiSourceComponentInfoGet( sessionId, rptid, fuminum, banknum, id, &next_id, &cinfo ); if ( rv == SA_ERR_HPI_NOT_PRESENT ) { break; } else if ( rv != SA_OK ) { printf( "ERROR!!! saHpiFumiSourceComponentInfoGet: %s\n", oh_lookup_error( rv ) ); return HPI_SHELL_CMD_ERROR; } show_component_info( " ", &cinfo ); id = next_id; } return HPI_SHELL_OK; } static ret_code_t show_bank_info( SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiFumiNumT fuminum, SaHpiBankNumT banknum ) { SaErrorT rv; SaHpiFumiBankInfoT info; rv = saHpiFumiTargetInfoGet( sessionId, rptid, fuminum, banknum, &info ); if ( rv != SA_OK ) { printf( "ERROR!!! saHpiFumiTargetInfoGet: %s\n", oh_lookup_error( rv ) ); return HPI_SHELL_CMD_ERROR; } printf( "Bank Num: %d\n", banknum ); printf( " Bank id: %u\n", (unsigned int)info.BankId ); printf( " Bank size: %u KB\n", info.BankSize ); printf( " Position: %u\n", info.Position ); printf( " Bank state: %s\n", oh_lookup_fumibankstate( info.BankState ) ); print_text_buffer_text( " Identifier: \"", &info.Identifier, "\"\n", ui_print ); print_text_buffer_text( " Description: \"", &info.Description, "\"\n", ui_print ); print_text_buffer_text( " DateTime: \"", &info.DateTime, "\"\n", ui_print ); printf( " Version: %u.%u.%u\n", info.MajorVersion, info.MinorVersion, info.AuxVersion ); return HPI_SHELL_OK; } static ret_code_t show_logical_bank_info( SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiFumiNumT fuminum ) { SaErrorT rv; SaHpiFumiLogicalBankInfoT linfo; rv = saHpiFumiLogicalTargetInfoGet( sessionId, rptid, fuminum, &linfo ); if ( rv != SA_OK ) { printf( "ERROR!!! saHpiFumiLogicalTargetInfoGet: %s\n", oh_lookup_error( rv ) ); return HPI_SHELL_CMD_ERROR; } printf( "Logical Bank Information:\n" ); printf( " Firmware Persistent Location Count: %u\n", linfo.FirmwarePersistentLocationCount ); printf( " Bank State Flags:" ); if ( linfo.BankStateFlags & SAHPI_FUMI_NO_MAIN_PERSISTENT_COPY ) { printf( "NO_MAIN_PERSISTENT_COPY" ); } printf( "\n" ); show_fw_info( "Pending Instance", " ", &linfo.PendingFwInstance ); show_fw_info( "Rollback Instance", " ", &linfo.RollbackFwInstance ); return HPI_SHELL_OK; } static ret_code_t show_bank_component_info( SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiFumiNumT fuminum, SaHpiBankNumT banknum ) { SaErrorT rv; SaHpiEntryIdT id = SAHPI_FIRST_ENTRY, next_id; SaHpiFumiComponentInfoT cinfo; while ( id != SAHPI_LAST_ENTRY ) { rv = saHpiFumiTargetComponentInfoGet( sessionId, rptid, fuminum, banknum, id, &next_id, &cinfo ); if ( rv != SA_OK ) { printf( "ERROR!!! saHpiFumiTargetComponentInfoGet: %s\n", oh_lookup_error( rv ) ); return HPI_SHELL_CMD_ERROR; } show_component_info( " ", &cinfo ); id = next_id; } return HPI_SHELL_OK; } static ret_code_t show_logical_bank_component_info( SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiFumiNumT fuminum ) { SaErrorT rv; SaHpiEntryIdT id = SAHPI_FIRST_ENTRY, next_id; SaHpiFumiLogicalComponentInfoT lcinfo; while ( id != SAHPI_LAST_ENTRY ) { rv = saHpiFumiLogicalTargetComponentInfoGet( sessionId, rptid, fuminum, id, &next_id, &lcinfo ); if ( rv != SA_OK ) { printf( "ERROR!!! saHpiFumiLogicalTargetComponentInfoGet: %s\n", oh_lookup_error( rv ) ); return HPI_SHELL_CMD_ERROR; } printf( " Component %u\n", lcinfo.ComponentId ); show_fw_info( "Pending Instance", " ", &lcinfo.PendingFwInstance ); show_fw_info( "Rollback Instance", " ", &lcinfo.RollbackFwInstance ); printf( " ComponentFlags 0x%x\n", lcinfo.ComponentFlags ); id = next_id; } return HPI_SHELL_OK; } static ret_code_t start_backup( SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiFumiNumT fuminum ) { SaErrorT rv; rv = saHpiFumiBackupStart( sessionId, rptid, fuminum ); if ( rv != SA_OK ) { printf( "ERROR!!! saHpiFumiBackupStart: %s\n", oh_lookup_error( rv ) ); return HPI_SHELL_CMD_ERROR; } return HPI_SHELL_OK; } static ret_code_t set_bank_boot_order( SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiFumiNumT fuminum, SaHpiBankNumT banknum, SaHpiUint32T position ) { SaErrorT rv; rv = saHpiFumiBankBootOrderSet( sessionId, rptid, fuminum, banknum, position ); if ( rv != SA_OK ) { printf( "ERROR!!! saHpiFumiBankBootOrderSet: %s\n", oh_lookup_error( rv ) ); return HPI_SHELL_CMD_ERROR; } return HPI_SHELL_OK; } static ret_code_t start_bank_copying( SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiFumiNumT fuminum, SaHpiBankNumT srcbanknum, SaHpiBankNumT dstbanknum ) { SaErrorT rv; rv = saHpiFumiBankCopyStart( sessionId, rptid, fuminum, srcbanknum, dstbanknum ); if ( rv != SA_OK ) { printf( "ERROR!!! saHpiFumiBankCopyStart: %s\n", oh_lookup_error( rv ) ); return HPI_SHELL_CMD_ERROR; } return HPI_SHELL_OK; } static ret_code_t start_install( SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiFumiNumT fuminum, SaHpiBankNumT banknum ) { SaErrorT rv; rv = saHpiFumiInstallStart( sessionId, rptid, fuminum, banknum ); if ( rv != SA_OK ) { printf( "ERROR!!! saHpiFumiInstallStart: %s\n", oh_lookup_error( rv ) ); return HPI_SHELL_CMD_ERROR; } return HPI_SHELL_OK; } static ret_code_t show_upgrade_status( SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiFumiNumT fuminum, SaHpiBankNumT banknum ) { SaErrorT rv; SaHpiFumiUpgradeStatusT status; rv = saHpiFumiUpgradeStatusGet( sessionId, rptid, fuminum, banknum, &status ); if ( rv != SA_OK ) { printf( "ERROR!!! saHpiFumiUpgradeStatusGet: %s\n", oh_lookup_error( rv ) ); return HPI_SHELL_CMD_ERROR; } printf( "Upgrade status on bank %d: %s\n", banknum, oh_lookup_fumiupgradestatus( status ) ); return HPI_SHELL_OK; } static ret_code_t start_target_verification( SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiFumiNumT fuminum, SaHpiBankNumT banknum ) { SaErrorT rv; rv = saHpiFumiTargetVerifyStart( sessionId, rptid, fuminum, banknum ); if ( rv != SA_OK ) { printf( "ERROR!!! saHpiFumiTargetVerifyStart: %s\n", oh_lookup_error( rv ) ); return HPI_SHELL_CMD_ERROR; } return HPI_SHELL_OK; } static ret_code_t start_main_target_verification( SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiFumiNumT fuminum ) { SaErrorT rv; rv = saHpiFumiTargetVerifyMainStart( sessionId, rptid, fuminum ); if ( rv != SA_OK ) { printf( "ERROR!!! saHpiFumiTargetVerifyMainStart: %s\n", oh_lookup_error( rv ) ); return HPI_SHELL_CMD_ERROR; } return HPI_SHELL_OK; } static ret_code_t cancel_upgrade( SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiFumiNumT fuminum, SaHpiBankNumT banknum ) { SaErrorT rv; rv = saHpiFumiUpgradeCancel( sessionId, rptid, fuminum, banknum ); if ( rv != SA_OK ) { printf( "ERROR!!! saHpiFumiUpgradeCancel: %s\n", oh_lookup_error( rv ) ); return HPI_SHELL_CMD_ERROR; } return HPI_SHELL_OK; } static ret_code_t show_autorollback_disable( SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiFumiNumT fuminum ) { SaErrorT rv; SaHpiBoolT disable; rv = saHpiFumiAutoRollbackDisableGet( sessionId, rptid, fuminum, &disable ); if ( rv != SA_OK ) { printf( "ERROR!!! saHpiFumiAutoRollbackDisableGet: %s\n", oh_lookup_error( rv ) ); return HPI_SHELL_CMD_ERROR; } printf( "Auto Rollback Disabled: %s\n", ( disable == SAHPI_FALSE ) ? "FALSE" : "TRUE" ); return HPI_SHELL_OK; } static ret_code_t set_autorollback_disable( SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiFumiNumT fuminum, SaHpiBoolT disable ) { SaErrorT rv; rv = saHpiFumiAutoRollbackDisableSet( sessionId, rptid, fuminum, disable ); if ( rv != SA_OK ) { printf( "ERROR!!! saHpiFumiAutoRollbackDisableSet: %s\n", oh_lookup_error( rv ) ); return HPI_SHELL_CMD_ERROR; } printf( "Automatic Rollback %s successfully\n", ( disable == SAHPI_FALSE ) ? "enabled" : "disabled" ); return HPI_SHELL_OK; } static ret_code_t start_rollback( SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiFumiNumT fuminum ) { SaErrorT rv; rv = saHpiFumiRollbackStart( sessionId, rptid, fuminum ); if ( rv != SA_OK ) { printf( "ERROR!!! saHpiFumiRollbackStart: %s\n", oh_lookup_error( rv ) ); return HPI_SHELL_CMD_ERROR; } return HPI_SHELL_OK; } static ret_code_t activate( SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiFumiNumT fuminum, SaHpiBoolT logical ) { SaErrorT rv; rv = saHpiFumiActivateStart( sessionId, rptid, fuminum, logical ); if ( rv != SA_OK ) { printf( "ERROR!!! saHpiFumiActivateStart: %s\n", oh_lookup_error( rv ) ); return HPI_SHELL_CMD_ERROR; } return HPI_SHELL_OK; } static ret_code_t cleanup( SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiFumiNumT fuminum, SaHpiBankNumT banknum ) { SaErrorT rv; rv = saHpiFumiCleanup( sessionId, rptid, fuminum, banknum ); if ( rv != SA_OK ) { printf( "ERROR!!! saHpiFumiCleanup: %s\n", oh_lookup_error( rv ) ); return HPI_SHELL_CMD_ERROR; } return HPI_SHELL_OK; } /************************************* * commands ************************************/ ret_code_t fumi_block( void ) { SaErrorT rv; ret_code_t ret; SaHpiResourceIdT rptid; SaHpiInstrumentIdT rdrnum; SaHpiRdrT rdr; ret = ask_rpt( &rptid ); if ( ret != HPI_SHELL_OK ) { return ret; }; ret = ask_rdr( rptid, SAHPI_FUMI_RDR, &rdrnum ); if ( ret != HPI_SHELL_OK ) { return ret; } rv = saHpiRdrGetByInstrumentId( Domain->sessionId, rptid, SAHPI_FUMI_RDR, rdrnum, &rdr ); if ( rv != SA_OK ) { printf( "ERROR!!! saHpiRdrGetByInstrumentId" "(Rpt=%d RdrType=%d Rdr=%d): %s\n", rptid, SAHPI_FUMI_RDR, rdrnum, oh_lookup_error( rv ) ); return HPI_SHELL_CMD_ERROR; }; fumi_block_env.rptid = rptid; fumi_block_env.fuminum = rdr.RdrTypeUnion.FumiRec.Num; fumi_block_env.fumicaps = rdr.RdrTypeUnion.FumiRec.Capability; block_type = FUMI_COM; for ( ;; ) { int res; term_def_t * term ; char buf[256]; res = get_new_command( "FUMI block ==> " ); if ( res == 2 ) { unget_term(); break; }; term = get_next_term(); if ( term == NULL ) continue; snprintf( buf, 256, "%s", term->term ); if ( ( strcmp( buf, "q" ) == 0) || ( strcmp( buf, "quit" ) == 0 ) ) { break; } } block_type = MAIN_COM; return HPI_SHELL_OK; } ret_code_t fumi_block_specinfo(void) { return show_spec_info( Domain->sessionId, fumi_block_env.rptid, fumi_block_env.fuminum ); } ret_code_t fumi_block_serviceimpact(void) { return show_service_impact( Domain->sessionId, fumi_block_env.rptid, fumi_block_env.fuminum ); } ret_code_t fumi_block_setsource(void) { SaHpiBankNumT banknum; SaHpiTextBufferT uri; if ( get_banknum( &banknum) != HPI_SHELL_OK ) { return HPI_SHELL_PARM_ERROR; } if ( get_uri( &uri) != HPI_SHELL_OK ) { return HPI_SHELL_PARM_ERROR; } return set_source( Domain->sessionId, fumi_block_env.rptid, fumi_block_env.fuminum, banknum, &uri ); } ret_code_t fumi_block_validatesource(void) { SaHpiBankNumT banknum; if ( get_banknum( &banknum) != HPI_SHELL_OK ) { return HPI_SHELL_PARM_ERROR; } return start_source_validation( Domain->sessionId, fumi_block_env.rptid, fumi_block_env.fuminum, banknum ); } ret_code_t fumi_block_sourceinfo(void) { ret_code_t rc; SaHpiBankNumT banknum; if ( get_banknum( &banknum) != HPI_SHELL_OK ) { return HPI_SHELL_PARM_ERROR; } rc = show_source_info( Domain->sessionId, fumi_block_env.rptid, fumi_block_env.fuminum, banknum ); if ( rc != HPI_SHELL_OK ) { return rc; } if ( fumi_block_env.fumicaps & SAHPI_FUMI_CAP_COMPONENTS ) { rc = show_source_component_info( Domain->sessionId, fumi_block_env.rptid, fumi_block_env.fuminum, banknum ); } return rc; } ret_code_t fumi_block_targetinfo(void) { ret_code_t rc; SaHpiBankNumT banknum; if ( get_banknum( &banknum) != HPI_SHELL_OK ) { return HPI_SHELL_PARM_ERROR; } rc = show_bank_info( Domain->sessionId, fumi_block_env.rptid, fumi_block_env.fuminum, banknum ); if ( rc != HPI_SHELL_OK ) { return rc; } if ( fumi_block_env.fumicaps & SAHPI_FUMI_CAP_COMPONENTS ) { rc = show_bank_component_info( Domain->sessionId, fumi_block_env.rptid, fumi_block_env.fuminum, banknum ); if ( rc != HPI_SHELL_OK ) { return rc; } } if ( banknum == 0 ) { rc = show_logical_bank_info( Domain->sessionId, fumi_block_env.rptid, fumi_block_env.fuminum ); if ( rc != HPI_SHELL_OK ) { return rc; } if ( fumi_block_env.fumicaps & SAHPI_FUMI_CAP_COMPONENTS ) { if ( banknum == 0 ) { rc = show_logical_bank_component_info( Domain->sessionId, fumi_block_env.rptid, fumi_block_env.fuminum ); } } } return rc; } ret_code_t fumi_block_backup(void) { return start_backup( Domain->sessionId, fumi_block_env.rptid, fumi_block_env.fuminum ); } ret_code_t fumi_block_setbootorder(void) { SaHpiBankNumT banknum; SaHpiUint32T position; if ( get_banknum( &banknum) != HPI_SHELL_OK ) { return HPI_SHELL_PARM_ERROR; } if ( get_position( &position) != HPI_SHELL_OK ) { return HPI_SHELL_PARM_ERROR; } return set_bank_boot_order( Domain->sessionId, fumi_block_env.rptid, fumi_block_env.fuminum, banknum, position ); } ret_code_t fumi_block_bankcopy(void) { SaHpiBankNumT srcbanknum; SaHpiBankNumT dstbanknum; if ( get_banknum_prompt( "Source Bank Num(0 == active bank): ", &srcbanknum) != HPI_SHELL_OK ) { return HPI_SHELL_PARM_ERROR; } if ( get_banknum_prompt( "Target Bank Num(0 == active bank): ", &dstbanknum) != HPI_SHELL_OK ) { return HPI_SHELL_PARM_ERROR; } return start_bank_copying( Domain->sessionId, fumi_block_env.rptid, fumi_block_env.fuminum, srcbanknum, dstbanknum ); } ret_code_t fumi_block_install(void) { SaHpiBankNumT banknum; if ( get_banknum( &banknum) != HPI_SHELL_OK ) { return HPI_SHELL_PARM_ERROR; } return start_install( Domain->sessionId, fumi_block_env.rptid, fumi_block_env.fuminum, banknum ); } ret_code_t fumi_block_status(void) { SaHpiBankNumT banknum; if ( get_banknum( &banknum) != HPI_SHELL_OK ) { return HPI_SHELL_PARM_ERROR; } return show_upgrade_status( Domain->sessionId, fumi_block_env.rptid, fumi_block_env.fuminum, banknum ); } ret_code_t fumi_block_verify(void) { SaHpiBankNumT banknum; if ( get_banknum( &banknum) != HPI_SHELL_OK ) { return HPI_SHELL_PARM_ERROR; } return start_target_verification( Domain->sessionId, fumi_block_env.rptid, fumi_block_env.fuminum, banknum ); } ret_code_t fumi_block_verifymain(void) { return start_main_target_verification( Domain->sessionId, fumi_block_env.rptid, fumi_block_env.fuminum ); } ret_code_t fumi_block_cancel(void) { SaHpiBankNumT banknum; if ( get_banknum( &banknum) != HPI_SHELL_OK ) { return HPI_SHELL_PARM_ERROR; } return cancel_upgrade( Domain->sessionId, fumi_block_env.rptid, fumi_block_env.fuminum, banknum ); } ret_code_t fumi_block_disableautorollback(void) { term_def_t * term; term = get_next_term(); if ( term == NULL ) { show_autorollback_disable( Domain->sessionId, fumi_block_env.rptid, fumi_block_env.fuminum ); return HPI_SHELL_OK; } if ( strcmp(term->term, "on" ) == 0 ) { set_autorollback_disable( Domain->sessionId, fumi_block_env.rptid, fumi_block_env.fuminum, SAHPI_TRUE ); } else if ( strcmp(term->term, "off" ) == 0 ) { set_autorollback_disable( Domain->sessionId, fumi_block_env.rptid, fumi_block_env.fuminum, SAHPI_FALSE ); } else { return HPI_SHELL_PARM_ERROR; } return HPI_SHELL_OK; } ret_code_t fumi_block_rollback(void) { return start_rollback( Domain->sessionId, fumi_block_env.rptid, fumi_block_env.fuminum ); } ret_code_t fumi_block_activate(void) { SaHpiBoolT logical; term_def_t * term; term = get_next_term(); if ( term == NULL ) { logical = SAHPI_FALSE; } else if ( strcmp(term->term, "logical" ) == 0 ) { logical = SAHPI_TRUE; } else { return HPI_SHELL_PARM_ERROR; } return activate( Domain->sessionId, fumi_block_env.rptid, fumi_block_env.fuminum, logical ); } ret_code_t fumi_block_cleanup(void) { SaHpiBankNumT banknum; if ( get_banknum( &banknum) != HPI_SHELL_OK ) { return HPI_SHELL_PARM_ERROR; } return cleanup( Domain->sessionId, fumi_block_env.rptid, fumi_block_env.fuminum, banknum ); } openhpi-3.6.1/hpi_shell/hpi_cmd.c0000644000175100017510000001175012575647264015717 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (c) 2004 by Intel Corp. * (C) Copyright Ulrich Kleber 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Racing Guo * * Changes: * 11.30.2004 - Kouzmich: porting to HPI-B * 28.10.2010 - Anton Pak: fixed -c command line argument * 28.10.2010 - Anton Pak: added -D command line argument * 10.02.2011 - Ulrich Kleber: Refactoring to use glib for option parsing and * introduce common options for all clients * */ #include #include #include #include "hpi_cmd.h" #include #define OH_SVN_REV "$Revision: 7428 $" int debug_flag = 0; static gchar *f_cmdfile = NULL; static gboolean f_events = FALSE; static oHpiCommonOptionsT copt; static GOptionEntry my_options[] = { { "cmdfile", 'f', 0, G_OPTION_ARG_FILENAME, &f_cmdfile, "Execute command file", "filename" }, { "events", 'e', 0, G_OPTION_ARG_NONE, &f_events, "Show short events, discover after subscribe", NULL }, { NULL } }; int main(int argc, char **argv) { GOptionContext *context; /* Print version strings */ oh_prog_version(argv[0]); /* Parsing options */ static char usetext[]="- Allows a user to interactively " "perform a number of HPI operations\n " OH_SVN_REV; OHC_PREPARE_REVISION(usetext); context = g_option_context_new (usetext); g_option_context_add_main_entries (context, my_options, NULL); if (!ohc_option_parse(&argc, argv, context, &copt, OHC_ALL_OPTIONS - OHC_ENTITY_PATH_OPTION // not applicable - OHC_VERBOSE_OPTION )) { // no verbose mode implemented g_option_context_free (context); exit(1); } if (copt.debug) debug_flag = 1; g_option_context_free (context); if (f_cmdfile) { open_file ( f_cmdfile ); g_free ( f_cmdfile ); } domainlist = (GSList *)NULL; if (open_session(copt.domainid, f_events) == -1) //TODO For complete implementation of -N option, need to call //TODO ohAddDomain to get the domain Id. return(1); cmd_shell(); close_session(); return 0; } ret_code_t ask_entity(SaHpiEntityPathT *ret) { term_def_t *term; int res; SaErrorT rv; char buf[256]; const char * epstr; term = get_next_term(); if (term == NULL) { SaHpiEntityPathT root; root.Entry[0].EntityType = SAHPI_ENT_ROOT; root.Entry[0].EntityLocation = 0; if (read_file) return(HPI_SHELL_PARM_ERROR); rv = show_entity_tree(Domain, &root, 0, ui_print); if (rv != SA_OK) { printf("NO entities!\n"); return(HPI_SHELL_CMD_ERROR); }; res = get_string_param("Entity Path ==> ", buf, sizeof(buf)); if (res != 0) { printf("Invalid entity path"); return(HPI_SHELL_PARM_ERROR); } epstr = buf; } else { epstr = term->term; }; rv = oh_encode_entitypath(epstr, ret); if ( rv != SA_OK ) { printf("Invalid entity path"); return(HPI_SHELL_PARM_ERROR); } return(HPI_SHELL_OK); } ret_code_t ask_rpt(SaHpiResourceIdT *ret) { term_def_t *term; int i, res; term = get_next_term(); if (term == NULL) { if (read_file) return(HPI_SHELL_PARM_ERROR); i = show_rpt_list(Domain, SHOW_ALL_RPT, 0, SHORT_LSRES, ui_print); if (i == 0) { printf("NO rpts!\n"); return(HPI_SHELL_CMD_ERROR); }; i = get_int_param("RPT ID ==> ", &res); if (i == 1) *ret = (SaHpiResourceIdT)res; else return(HPI_SHELL_PARM_ERROR); } else { *ret = (SaHpiResourceIdT)atoi(term->term); }; return(HPI_SHELL_OK); } ret_code_t ask_rdr(SaHpiResourceIdT rptid, SaHpiRdrTypeT type, SaHpiInstrumentIdT *ret) { term_def_t *term; int i, res; char buf[64]; strncpy(buf, oh_lookup_rdrtype(type), 64); buf[strlen(buf)-4] = '\0'; strncat(buf, " NUM ==> ", 64-strlen(buf)); term = get_next_term(); if (term == NULL) { if (read_file) return(HPI_SHELL_CMD_ERROR); i = show_rdr_list(Domain, rptid, type, ui_print); if (i == 0) { printf("No rdrs for rpt: %d\n", rptid); return(HPI_SHELL_CMD_ERROR); }; i = get_int_param(buf, &res); if (i != 1) return(HPI_SHELL_PARM_ERROR); *ret = (SaHpiInstrumentIdT)res; } else { *ret = (SaHpiInstrumentIdT)atoi(term->term); }; return(HPI_SHELL_OK); } ret_code_t open_file(char *path) { if (add_input_file(path) != 0) { printf("Can not run file: %s\n", path); return(HPI_SHELL_PARM_ERROR); }; read_file = 1; read_stdin = 0; return(HPI_SHELL_OK); } openhpi-3.6.1/hpi_shell/dimi.c0000644000175100017510000004627612575647264015251 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (c) 2007 Pigeon Point Systems. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak * * */ #include #include #include #include #include #include "hpi_ui.h" #include "hpi_cmd.h" typedef struct { SaHpiResourceIdT rptid; SaHpiDimiNumT diminum; } dimi_block_env_t; static dimi_block_env_t dimi_block_env; static ret_code_t get_testnum( SaHpiDimiTestNumT * testnum ) { int i, res; i = get_int_param( "Test Num: ", &res ); if ( i != 1 ) { printf( "Error!!! Invalid Test Num\n" ); return HPI_SHELL_PARM_ERROR ; } *testnum = (SaHpiDimiTestNumT)res; return HPI_SHELL_OK; } static ret_code_t show_dimi_info( SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiDimiNumT diminum ) { SaErrorT rv; SaHpiDimiInfoT info; rv = saHpiDimiInfoGet( sessionId, rptid, diminum, &info ); if ( rv != SA_OK ) { printf( "ERROR!!! saHpiDimiInfoGet: %s\n", oh_lookup_error( rv ) ); return HPI_SHELL_CMD_ERROR; } printf( "DIMI number: %d\n", (int)diminum ); printf( " Number of tests: %d\n", (int)info.NumberOfTests ); printf( " Test number update counter: %d\n", (int)info.TestNumUpdateCounter ); return HPI_SHELL_OK; } static ret_code_t show_test_info( SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiDimiNumT diminum, SaHpiDimiTestNumT testnum ) { SaErrorT rv; SaHpiDimiTestT test; oh_big_textbuffer bigtmpbuf; SaHpiTextBufferT tmpbuf; int i; rv = saHpiDimiTestInfoGet( sessionId, rptid, diminum, testnum, &test ); if ( rv != SA_OK ) { printf( "ERROR!!! saHpiDimiTestInfoGet: %s\n", oh_lookup_error( rv ) ); return HPI_SHELL_CMD_ERROR; } printf( "Test number: %d\n", (int)testnum ); print_text_buffer_text( " Name: \"", &test.TestName, NULL, ui_print ); printf( "\"\n" ); printf( " Service Impact: %s", oh_lookup_dimitestserviceimpact( test.ServiceImpact ) ); printf( "\n" ); printf( " Affected Entities:\n" ); for ( i = 0 ; i < SAHPI_DIMITEST_MAX_ENTITIESIMPACTED; ++i ) { const SaHpiDimiTestAffectedEntityT * ei = &(test.EntitiesImpacted[i]); // Trick suggested to point unset entity pathes if ( ei->EntityImpacted.Entry[0].EntityType == SAHPI_ENT_UNSPECIFIED ) { break; } oh_decode_entitypath( &(ei->EntityImpacted), &bigtmpbuf); printf( " %s: %s\n", bigtmpbuf.Data, oh_lookup_dimitestserviceimpact( ei->ServiceImpact ) ); } if ( test.NeedServiceOS == SAHPI_TRUE ) { print_text_buffer_text( " Needed Service OS: ", &test.ServiceOS, NULL, ui_print ); printf( "\n" ); } printf( " Expected Run Duration: %" PRId64 " nsec\n", (int64_t)test.ExpectedRunDuration ); oh_decode_dimitestcapabilities( test.TestCapabilities, &tmpbuf ); printf( " Test capabilities: %s\n", tmpbuf.Data ); printf( " Test parameters:\n" ); for ( i = 0; i < SAHPI_DIMITEST_MAX_PARAMETERS; ++i ) { const SaHpiDimiTestParamsDefinitionT * param = &(test.TestParameters[i]); // Trick suggested to point unused params if ( param->ParamName[0] == '\0' ) { break; } printf( " Parameter %d:\n", i ); printf( " Name: \"%s\"\n", param->ParamName ); print_text_buffer_text( " Info: ", ¶m->ParamInfo, NULL, ui_print ); printf( "\n" ); switch ( param->ParamType ) { case SAHPI_DIMITEST_PARAM_TYPE_BOOLEAN: printf( " Type: boolean\n" ); printf( " Default value: %s\n", param->DefaultParam.parambool == SAHPI_TRUE ? "true" : "false" ); break; case SAHPI_DIMITEST_PARAM_TYPE_INT32: printf( " Type: int32\n" ); printf( " Min value: %d\n", param->MinValue.IntValue ); printf( " Max value: %d\n", param->MaxValue.IntValue ); printf( " Default value: %d\n", param->DefaultParam.paramint ); break; case SAHPI_DIMITEST_PARAM_TYPE_FLOAT64: printf( " Type: float64\n" ); printf( " Min value: %f\n", param->MinValue.FloatValue ); printf( " Max value: %f\n", param->MaxValue.FloatValue ); printf( " Default value: %f\n", param->DefaultParam.paramfloat ); break; case SAHPI_DIMITEST_PARAM_TYPE_TEXT: printf( " Type: text\n" ); print_text_buffer_text( " Default value: ", ¶m->DefaultParam.paramtext, NULL, ui_print ); printf( "\n" ); break; default: printf( " Type: unknown\n" ); } } return HPI_SHELL_OK; } static ret_code_t show_test_readiness( SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiDimiNumT diminum, SaHpiDimiTestNumT testnum ) { SaErrorT rv; SaHpiDimiReadyT ready; rv = saHpiDimiTestReadinessGet( sessionId, rptid, diminum, testnum, &ready ); if ( rv != SA_OK ) { printf( "ERROR!!! saHpiDimiTestReadinessGet: %s\n", oh_lookup_error( rv ) ); return HPI_SHELL_CMD_ERROR; } switch ( ready ) { case SAHPI_DIMI_READY: printf( "DIMI is ready to run test %d\n", testnum ); break; case SAHPI_DIMI_WRONG_STATE: printf( "DIMI is in the wrong state to run test %d\n", testnum ); break; case SAHPI_DIMI_BUSY: printf( "DIMI cannot start test %d at this time.\n", testnum ); break; default: printf( "Unknown test readiness state(%d).\n", (int)ready ); } return HPI_SHELL_OK; } static ret_code_t start_test( SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiDimiNumT diminum, SaHpiDimiTestNumT testnum ) { SaErrorT rv; SaHpiDimiTestT test; unsigned int i; int cc; SaHpiDimiTestVariableParamsT params[SAHPI_DIMITEST_MAX_PARAMETERS]; SaHpiUint8T nparams; int ival; double fval; char buf[SAHPI_MAX_TEXT_BUFFER_LENGTH]; rv = saHpiDimiTestInfoGet( sessionId, rptid, diminum, testnum, &test ); if ( rv != SA_OK ) { printf( "ERROR!!! saHpiDimiTestInfoGet: %s\n", oh_lookup_error( rv ) ); return HPI_SHELL_CMD_ERROR; } nparams = 0; for ( i = 0; i < SAHPI_DIMITEST_MAX_PARAMETERS; ++i ) { const SaHpiDimiTestParamsDefinitionT * def = &(test.TestParameters[i]); SaHpiDimiTestVariableParamsT * param = ¶ms[nparams]; // Trick suggested to point unused params if ( def->ParamName[0] == '\0' ) { break; } printf( "Parameter %d:\n", i ); printf( " Name: \"%s\"\n", def->ParamName ); print_text_buffer_text( " Info: ", &def->ParamInfo, NULL, ui_print ); printf( "\n" ); memcpy( param->ParamName, def->ParamName, SAHPI_DIMITEST_PARAM_NAME_LEN ); param->ParamType = def->ParamType; switch ( def->ParamType ) { case SAHPI_DIMITEST_PARAM_TYPE_BOOLEAN: printf( " Type: boolean\n" ); printf( " Default value: %s\n", def->DefaultParam.parambool == SAHPI_TRUE ? "true" : "false" ); cc = get_string_param( "Boolean Value (true or false) ==> ", buf, sizeof(buf) ); if ( cc == 0 ) { if ( strcasecmp( buf, "true" ) == 0 ) { param->Value.parambool = SAHPI_TRUE; ++nparams; break; } else if ( strcasecmp( buf, "false" ) == 0 ) { param->Value.parambool = SAHPI_FALSE; ++nparams; break; } } printf( "Cannot get parameter value. Using default one.\n"); break; case SAHPI_DIMITEST_PARAM_TYPE_INT32: printf( " Type: int32\n" ); printf( " Min value: %d\n", def->MinValue.IntValue ); printf( " Max value: %d\n", def->MaxValue.IntValue ); printf( " Default value: %d\n", def->DefaultParam.paramint ); cc = get_int_param( "Integer Value ==> ", &ival ); if ( cc == 1 ) { param->Value.paramint = ival; ++nparams; break; } printf( "Cannot get parameter value. Using default one.\n"); break; case SAHPI_DIMITEST_PARAM_TYPE_FLOAT64: printf( " Type: float64\n" ); printf( " Min value: %f\n", def->MinValue.FloatValue ); printf( " Max value: %f\n", def->MaxValue.FloatValue ); printf( " Default value: %f\n", def->DefaultParam.paramfloat ); cc = get_string_param( "Float Value ==> ", buf, sizeof(buf) ); if ( cc == 0 ) { cc = sscanf( buf, "%lf", &fval ); if ( cc == 1 ) { param->Value.paramfloat = fval; ++nparams; break; } } printf( "Cannot get parameter value. Using default one.\n"); break; case SAHPI_DIMITEST_PARAM_TYPE_TEXT: printf( " Type: text\n" ); print_text_buffer_text( " Default value: ", &def->DefaultParam.paramtext, NULL, ui_print ); printf( "\n" ); cc = get_string_param( "Text Value ==> ", buf, sizeof(buf) ); if ( cc == 0 ) { param->Value.paramtext.DataType = SAHPI_TL_TYPE_TEXT; param->Value.paramtext.Language = SAHPI_LANG_ENGLISH; param->Value.paramtext.DataLength = strlen(buf); memcpy( ¶m->Value.paramtext.Data[0], &buf[0], SAHPI_MAX_TEXT_BUFFER_LENGTH ); ++nparams; break; } printf( "Cannot get parameter value. Using default one.\n"); break; default: printf( " Type: unknown\n" ); printf( "Cannot get parameter value. Using default one.\n"); } } rv = saHpiDimiTestStart( sessionId, rptid, diminum, testnum, nparams, nparams == 0 ? 0 : params ); if ( rv != SA_OK ) { printf( "ERROR!!! saHpiDimiTestStart: %s\n", oh_lookup_error( rv ) ); return HPI_SHELL_CMD_ERROR; } return HPI_SHELL_OK; } static ret_code_t cancel_test( SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiDimiNumT diminum, SaHpiDimiTestNumT testnum ) { SaErrorT rv; rv = saHpiDimiTestCancel( sessionId, rptid, diminum, testnum ); if ( rv != SA_OK ) { printf( "ERROR!!! saHpiDimiTestCancel: %s\n", oh_lookup_error( rv ) ); return HPI_SHELL_CMD_ERROR; } return HPI_SHELL_OK; } static ret_code_t show_test_status( SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiDimiNumT diminum, SaHpiDimiTestNumT testnum ) { SaErrorT rv; SaHpiDimiTestPercentCompletedT percent_completed; SaHpiDimiTestRunStatusT runstatus; rv = saHpiDimiTestStatusGet( sessionId, rptid, diminum, testnum, &percent_completed, &runstatus ); if ( rv != SA_OK ) { printf( "ERROR!!! saHpiDimiTestStatusGet: %s\n", oh_lookup_error( rv ) ); return HPI_SHELL_CMD_ERROR; } printf( "Test number: %d\n", (int)testnum ); printf( " Status: %s\n", oh_lookup_dimitestrunstatus( runstatus ) ); if ( percent_completed != 0xff && runstatus == SAHPI_DIMITEST_STATUS_RUNNING ) { printf( " Percent completed: %d\n", percent_completed ); } return HPI_SHELL_OK; } static ret_code_t show_test_results( SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiDimiNumT diminum, SaHpiDimiTestNumT testnum ) { SaErrorT rv; SaHpiDimiTestResultsT results; SaHpiTextBufferT tb; rv = saHpiDimiTestResultsGet( sessionId, rptid, diminum, testnum, &results ); if ( rv != SA_OK ) { printf( "ERROR!!! saHpiDimiTestResultsGet: %s\n", oh_lookup_error( rv ) ); return HPI_SHELL_CMD_ERROR; } printf( "Test number: %d\n", (int)testnum ); oh_decode_time( results.ResultTimeStamp, &tb ); print_text_buffer_text(" Result timestamp: ", &tb, "\n", ui_print); printf( " Run duration: %" PRId64 " nsec\n", (int64_t)results.RunDuration ); printf( " Last run status: %s\n", oh_lookup_dimitestrunstatus( results.LastRunStatus ) ); printf( " Test error code: " ); switch( results.TestErrorCode ) { case SAHPI_DIMITEST_STATUSERR_NOERR: printf( "no Error was generated" ); break; case SAHPI_DIMITEST_STATUSERR_RUNERR: printf( "run time error was generated" ); break; case SAHPI_DIMITEST_STATUSERR_UNDEF: printf( "undefined error" ); break; default: printf( "unknown" ); } printf( "\n" ); if ( results.TestResultStringIsURI == SAHPI_FALSE ) { print_text_buffer_text( " Test result string: ", &results.TestResultString, NULL, ui_print ); } else { print_text_buffer_text( " Test result URI: ", &results.TestResultString, NULL, ui_print ); } printf( "\n" ); return HPI_SHELL_OK; } /************************************* * commands ************************************/ ret_code_t dimi_block( void ) { SaErrorT rv; ret_code_t ret; SaHpiResourceIdT rptid; SaHpiInstrumentIdT rdrnum; SaHpiRdrT rdr; ret = ask_rpt( &rptid ); if ( ret != HPI_SHELL_OK ) { return ret; }; ret = ask_rdr( rptid, SAHPI_DIMI_RDR, &rdrnum ); if ( ret != HPI_SHELL_OK ) { return ret; } rv = saHpiRdrGetByInstrumentId( Domain->sessionId, rptid, SAHPI_DIMI_RDR, rdrnum, &rdr ); if ( rv != SA_OK ) { printf( "ERROR!!! saHpiRdrGetByInstrumentId" "(Rpt=%d RdrType=%d Rdr=%d): %s\n", rptid, SAHPI_DIMI_RDR, rdrnum, oh_lookup_error( rv ) ); return HPI_SHELL_CMD_ERROR; }; dimi_block_env.rptid = rptid; dimi_block_env.diminum = rdr.RdrTypeUnion.DimiRec.DimiNum; block_type = DIMI_COM; for ( ;; ) { int res; term_def_t * term; char buf[256]; res = get_new_command( "DIMI block ==> " ); if ( res == 2 ) { unget_term(); break; }; term = get_next_term(); if ( term == NULL ) continue; snprintf( buf, 256, "%s", term->term ); if ( ( strcmp( buf, "q" ) == 0) || ( strcmp( buf, "quit" ) == 0 ) ) { break; } } block_type = MAIN_COM; return HPI_SHELL_OK; } ret_code_t dimi_block_info( void ) { return show_dimi_info( Domain->sessionId, dimi_block_env.rptid, dimi_block_env.diminum ); } ret_code_t dimi_block_testinfo( void ) { SaHpiDimiTestNumT testnum; if ( get_testnum( &testnum) != HPI_SHELL_OK ) { return HPI_SHELL_PARM_ERROR; } return show_test_info( Domain->sessionId, dimi_block_env.rptid, dimi_block_env.diminum, testnum ); } ret_code_t dimi_block_ready( void ) { SaHpiDimiTestNumT testnum; if ( get_testnum( &testnum) != HPI_SHELL_OK ) { return HPI_SHELL_PARM_ERROR; } return show_test_readiness( Domain->sessionId, dimi_block_env.rptid, dimi_block_env.diminum, testnum ); } ret_code_t dimi_block_start( void ) { SaHpiDimiTestNumT testnum; if ( get_testnum( &testnum) != HPI_SHELL_OK ) { return HPI_SHELL_PARM_ERROR; } return start_test( Domain->sessionId, dimi_block_env.rptid, dimi_block_env.diminum, testnum ); } ret_code_t dimi_block_cancel( void ) { SaHpiDimiTestNumT testnum; if ( get_testnum( &testnum) != HPI_SHELL_OK ) { return HPI_SHELL_PARM_ERROR; } return cancel_test( Domain->sessionId, dimi_block_env.rptid, dimi_block_env.diminum, testnum ); } ret_code_t dimi_block_status( void ) { SaHpiDimiTestNumT testnum; if ( get_testnum( &testnum) != HPI_SHELL_OK ) { return HPI_SHELL_PARM_ERROR; } return show_test_status( Domain->sessionId, dimi_block_env.rptid, dimi_block_env.diminum, testnum ); } ret_code_t dimi_block_results( void ) { SaHpiDimiTestNumT testnum; if ( get_testnum( &testnum) != HPI_SHELL_OK ) { return HPI_SHELL_PARM_ERROR; } return show_test_results( Domain->sessionId, dimi_block_env.rptid, dimi_block_env.diminum, testnum ); } openhpi-3.6.1/hpi_shell/ctrl_inv.c0000644000175100017510000007031612575647264016137 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Kouzmich < Mikhail.V.Kouzmich@intel.com > * * */ #include #include #include #include #include #include "hpi_ui.h" #include "hpi_cmd.h" typedef struct { SaHpiResourceIdT rptid; SaHpiInstrumentIdT rdrnum; } inv_block_env_t; static inv_block_env_t inv_block_env; typedef struct { SaHpiResourceIdT rptid; SaHpiInstrumentIdT rdrnum; } ctrl_block_env_t; static ctrl_block_env_t ctrl_block_env; typedef struct { SaHpiResourceIdT rptid; SaHpiInstrumentIdT rdrnum; SaHpiRdrT rdr_entry; } ann_block_env_t; static ann_block_env_t ann_block_env; typedef struct { char *name; SaHpiIdrAreaTypeT val; } Area_type_t; static Area_type_t Area_types[] = { { "inter", SAHPI_IDR_AREATYPE_INTERNAL_USE }, { "chass", SAHPI_IDR_AREATYPE_CHASSIS_INFO }, { "board", SAHPI_IDR_AREATYPE_BOARD_INFO }, { "prod", SAHPI_IDR_AREATYPE_PRODUCT_INFO }, { "oem", SAHPI_IDR_AREATYPE_OEM }, { NULL, SAHPI_IDR_AREATYPE_UNSPECIFIED } }; typedef struct { char *name; SaHpiIdrFieldTypeT val; } Field_type_t; static Field_type_t Field_types[] = { { "chass", SAHPI_IDR_FIELDTYPE_CHASSIS_TYPE }, { "time", SAHPI_IDR_FIELDTYPE_MFG_DATETIME }, { "manuf", SAHPI_IDR_FIELDTYPE_MANUFACTURER }, { "prodname", SAHPI_IDR_FIELDTYPE_PRODUCT_NAME }, { "prodver", SAHPI_IDR_FIELDTYPE_PRODUCT_VERSION }, { "snum", SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER }, { "pnum", SAHPI_IDR_FIELDTYPE_PART_NUMBER }, { "file", SAHPI_IDR_FIELDTYPE_FILE_ID }, { "tag", SAHPI_IDR_FIELDTYPE_ASSET_TAG }, { "custom", SAHPI_IDR_FIELDTYPE_CUSTOM }, { NULL, SAHPI_IDR_FIELDTYPE_UNSPECIFIED } }; static ret_code_t add_inventory_area(SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiIdrIdT rdrnum) { SaHpiEntryIdT entry; SaErrorT rv; char buf[10]; int i; i = get_string_param("Area type (inter,chass,board,prod,oem): ", buf, 9); if (i != 0) return(HPI_SHELL_PARM_ERROR); for (i = 0; Area_types[i].name != (char *)NULL; i++) if (strcmp(Area_types[i].name, buf) == 0) break; if (Area_types[i].name == (char *)NULL) { printf("Error!!! Unknown Area type: %s\n", buf); return(HPI_SHELL_PARM_ERROR); }; rv = saHpiIdrAreaAdd(sessionId, rptid, rdrnum, Area_types[i].val, &entry); if (rv != SA_OK) { printf("ERROR!!! saHpiIdrAreaAdd: %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; return(HPI_SHELL_OK); } static ret_code_t add_inventory_field(SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiIdrIdT rdrnum) { SaErrorT rv; SaHpiIdrFieldT field; char buf[256]; int res, i; i = get_int_param("Area Id: ", &res); if (i != 1) { printf("Error!!! Invalid Area Id\n"); return(HPI_SHELL_PARM_ERROR); }; field.AreaId = res; i = get_string_param("Field type(chass,time,manuf,prodname,prodver," "snum,pnum,file,tag,custom): ", buf, 9); if (i != 0) { printf("Error!!! Invalid Field type: %s\n", buf); return(HPI_SHELL_PARM_ERROR); }; for (i = 0; Field_types[i].name != (char *)NULL; i++) if (strcmp(Field_types[i].name, buf) == 0) break; if (Field_types[i].name == (char *)NULL) { printf("Error!!! Unknown Field type: %s\n", buf); return(HPI_SHELL_PARM_ERROR); }; field.Type = Field_types[i].val; field.ReadOnly = SAHPI_FALSE; i = set_text_buffer(&(field.Field)); if (i != 0) { printf("Invalid text\n"); return(HPI_SHELL_PARM_ERROR); }; rv = saHpiIdrFieldAdd(sessionId, rptid, rdrnum, &field); if (rv != SA_OK) { printf("ERROR!!! saHpiIdrFieldAdd: %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; return(HPI_SHELL_OK); } static ret_code_t set_inventory_field(SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiIdrIdT rdrnum) { SaErrorT rv; SaHpiIdrFieldT field, read_field; SaHpiEntryIdT next; int res, i; memset(&field, 0, sizeof(SaHpiIdrFieldT)); i = get_int_param("Area Id: ", &res); if (i != 1) { printf("Error!!! Invalid Area Id\n"); return(HPI_SHELL_PARM_ERROR); }; field.AreaId = res; i = get_int_param("Field Id: ", &res); if (i != 1) { printf("Error!!! Invalid Field Id\n"); return(HPI_SHELL_PARM_ERROR); }; field.FieldId = res; rv = saHpiIdrFieldGet(sessionId, rptid, rdrnum, field.AreaId, SAHPI_IDR_FIELDTYPE_UNSPECIFIED, field.FieldId, &next, &read_field); if (rv != SA_OK) { printf("ERROR!!! saHpiIdrFieldGet: %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; field.Type = read_field.Type; i = set_text_buffer(&(field.Field)); if (i != 0) { printf("Invalid text\n"); return(HPI_SHELL_PARM_ERROR); }; rv = saHpiIdrFieldSet(sessionId, rptid, rdrnum, &field); if (rv != SA_OK) { printf("ERROR!!! saHpiIdrFieldSet: %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; return(HPI_SHELL_OK); } static ret_code_t del_inventory_field(SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiIdrIdT rdrnum) { SaErrorT rv; SaHpiEntryIdT areaId, fieldId; int res, i; i = get_int_param("Area Id: ", &res); if (i != 1) { printf("Error!!! Invalid Area Id\n"); return(HPI_SHELL_PARM_ERROR); }; areaId = res; i = get_int_param("Field Id: ", &res); if (i != 1) { printf("Error!!! Invalid Field Id\n"); return(HPI_SHELL_PARM_ERROR); }; fieldId = res; rv = saHpiIdrFieldDelete(sessionId, rptid, rdrnum, areaId, fieldId); if (rv != SA_OK) { printf("ERROR!!! saHpiIdrFieldDelete: %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; return(HPI_SHELL_OK); } static ret_code_t delete_inventory_area(SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiIdrIdT rdrnum) { SaErrorT rv; int res, i; i = get_int_param("Area Id: ", &res); if (i != 1) { printf("Error!!! Invalid Area Id\n"); return(HPI_SHELL_PARM_ERROR); }; rv = saHpiIdrAreaDelete(sessionId, rptid, rdrnum, res); if (rv != SA_OK) { printf("ERROR!!! saHpiIdrAreaDelete: %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; return(HPI_SHELL_OK); } static ret_code_t sa_show_inv(SaHpiResourceIdT resourceid) { SaErrorT rv = SA_OK, rva, rvf; SaHpiEntryIdT rdrentryid; SaHpiEntryIdT nextrdrentryid; SaHpiRdrT rdr; SaHpiIdrIdT idrid; SaHpiIdrInfoT idrInfo; SaHpiEntryIdT areaId; SaHpiEntryIdT nextareaId; SaHpiIdrAreaTypeT areaType; SaHpiEntryIdT fieldId; SaHpiEntryIdT nextFieldId; SaHpiIdrFieldTypeT fieldType; SaHpiIdrFieldT thisField; SaHpiIdrAreaHeaderT areaHeader; rdrentryid = SAHPI_FIRST_ENTRY; while (rdrentryid != SAHPI_LAST_ENTRY) { rv = saHpiRdrGet(Domain->sessionId, resourceid, rdrentryid, &nextrdrentryid, &rdr); if (rv != SA_OK) { printf("saHpiRdrGet error %s\n", oh_lookup_error(rv)); return HPI_SHELL_CMD_ERROR; } if (rdr.RdrType != SAHPI_INVENTORY_RDR) { rdrentryid = nextrdrentryid; continue; }; idrid = rdr.RdrTypeUnion.InventoryRec.IdrId; rv = saHpiIdrInfoGet(Domain->sessionId, resourceid, idrid, &idrInfo); if (rv != SA_OK) { printf("saHpiIdrInfoGet error %s\n", oh_lookup_error(rv)); return HPI_SHELL_CMD_ERROR; } areaType = SAHPI_IDR_AREATYPE_UNSPECIFIED; areaId = SAHPI_FIRST_ENTRY; while (areaId != SAHPI_LAST_ENTRY) { rva = saHpiIdrAreaHeaderGet(Domain->sessionId, resourceid, idrInfo.IdrId, areaType, areaId, &nextareaId, &areaHeader); if (rva != SA_OK) { printf("saHpiIdrAreaHeaderGet error %s\n", oh_lookup_error(rva)); break; } show_inv_area_header(&areaHeader, 2, ui_print); fieldType = SAHPI_IDR_FIELDTYPE_UNSPECIFIED; fieldId = SAHPI_FIRST_ENTRY; while (fieldId != SAHPI_LAST_ENTRY) { rvf = saHpiIdrFieldGet(Domain->sessionId, resourceid, idrInfo.IdrId, areaHeader.AreaId, fieldType, fieldId, &nextFieldId, &thisField); if (rvf != SA_OK) { printf("saHpiIdrFieldGet error %s\n", oh_lookup_error(rvf)); break; } show_inv_field(&thisField, 4, ui_print); fieldId = nextFieldId; } areaId = nextareaId; } rdrentryid = nextrdrentryid; } return HPI_SHELL_OK; } ret_code_t inv_block_show(void) { term_def_t *term; SaHpiEntryIdT areaid; term = get_next_term(); if (term != NULL) { areaid = strtol( term->term, NULL, 10 ); } else { areaid = SAHPI_LAST_ENTRY; } return(show_inventory(Domain->sessionId, inv_block_env.rptid, inv_block_env.rdrnum, areaid, ui_print)); } ret_code_t inv_block_addarea(void) { return(add_inventory_area(Domain->sessionId, inv_block_env.rptid, inv_block_env.rdrnum)); } ret_code_t inv_block_delarea(void) { return(delete_inventory_area(Domain->sessionId, inv_block_env.rptid, inv_block_env.rdrnum)); } ret_code_t inv_block_addfield(void) { return(add_inventory_field(Domain->sessionId, inv_block_env.rptid, inv_block_env.rdrnum)); } ret_code_t inv_block_setfield(void) { return(set_inventory_field(Domain->sessionId, inv_block_env.rptid, inv_block_env.rdrnum)); } ret_code_t inv_block_delfield(void) { return(del_inventory_field(Domain->sessionId, inv_block_env.rptid, inv_block_env.rdrnum)); } ret_code_t inv_block(void) { SaHpiRdrT rdr_entry; SaHpiResourceIdT rptid; SaHpiInstrumentIdT rdrnum; SaHpiRdrTypeT type; SaErrorT rv; char buf[256]; ret_code_t ret; term_def_t *term; int res; ret = ask_rpt(&rptid); if (ret != HPI_SHELL_OK) return(ret); type = SAHPI_INVENTORY_RDR; ret = ask_rdr(rptid, type, &rdrnum); if (ret != HPI_SHELL_OK) return(ret); inv_block_env.rptid = rptid; inv_block_env.rdrnum = rdrnum; rv = saHpiRdrGetByInstrumentId(Domain->sessionId, rptid, type, rdrnum, &rdr_entry); if (rv != SA_OK) { printf("saHpiRdrGetByInstrumentId error %s\n", oh_lookup_error(rv)); printf("ERROR!!! Can not get rdr: ResourceId=%d RdrType=%d RdrNum=%d\n", rptid, type, rdrnum); return(HPI_SHELL_CMD_ERROR); }; show_inventory(Domain->sessionId, rptid, rdrnum, SAHPI_LAST_ENTRY, ui_print); for (;;) { block_type = INV_COM; res = get_new_command("inventory block ==> "); if (res == 2) { unget_term(); return HPI_SHELL_OK; }; term = get_next_term(); if (term == NULL) continue; snprintf(buf, 256, "%s", term->term); if ((strcmp(buf, "q") == 0) || (strcmp(buf, "quit") == 0)) break; }; block_type = MAIN_COM; return HPI_SHELL_OK; } ret_code_t show_inv(void) { SaHpiResourceIdT resid = 0; int i, res; term_def_t *term; term = get_next_term(); if (term == NULL) { i = show_rpt_list(Domain, SHOW_ALL_RPT, resid, SHORT_LSRES, ui_print); if (i == 0) { printf("NO rpt!\n"); return(HPI_SHELL_OK); }; i = get_int_param("RPT ID ==> ", &res); if (i == 1) resid = (SaHpiResourceIdT)res; else return HPI_SHELL_OK; } else { resid = (SaHpiResourceIdT)atoi(term->term); }; return sa_show_inv(resid); } static ret_code_t set_control_state(SaHpiSessionIdT sessionid, SaHpiResourceIdT resourceid, SaHpiCtrlNumT num) { SaErrorT rv; SaHpiRdrT rdr; SaHpiCtrlRecT *ctrl; SaHpiCtrlTypeT type; SaHpiCtrlStateDigitalT state_val = 0; SaHpiCtrlModeT mode; SaHpiCtrlStateT state; char buf[SAHPI_MAX_TEXT_BUFFER_LENGTH]; char *str; int i, res; rv = saHpiRdrGetByInstrumentId(sessionid, resourceid, SAHPI_CTRL_RDR, num, &rdr); if (rv != SA_OK) { printf("saHpiRdrGetByInstrumentId: error: %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; memset(&state, 0, sizeof(SaHpiCtrlStateT)); i = get_string_param("Mode(auto|manual): ", buf, 7); if (i != 0) return(HPI_SHELL_CMD_ERROR); if (strcmp(buf, "auto") == 0) mode = SAHPI_CTRL_MODE_AUTO; else if (strcmp(buf, "manual") == 0) mode = SAHPI_CTRL_MODE_MANUAL; else return(HPI_SHELL_CMD_ERROR); if (mode == SAHPI_CTRL_MODE_AUTO) { rv = saHpiControlSet(sessionid, resourceid, num, mode, (SaHpiCtrlStateT *)NULL); if (rv != SA_OK) { printf("saHpiControlSet: error: %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; return(HPI_SHELL_OK); }; ctrl = &(rdr.RdrTypeUnion.CtrlRec); type = ctrl->Type; state.Type = type; switch (type) { case SAHPI_CTRL_TYPE_DIGITAL: i = get_string_param( "New state(on|off|pulseon|pulseoff): ", buf, 9); if (i != 0) return(HPI_SHELL_CMD_ERROR); if (strcmp(buf, "on") == 0) state_val = SAHPI_CTRL_STATE_ON; if (strcmp(buf, "off") == 0) state_val = SAHPI_CTRL_STATE_OFF; if (strcmp(buf, "pulseon") == 0) state_val = SAHPI_CTRL_STATE_PULSE_ON; if (strcmp(buf, "pulseoff") == 0) state_val = SAHPI_CTRL_STATE_PULSE_OFF; state.StateUnion.Digital = state_val; break; case SAHPI_CTRL_TYPE_DISCRETE: i = get_int_param("Value ==> ", &res); if (i != 1) { printf("Invalid value\n"); return HPI_SHELL_CMD_ERROR; }; state.StateUnion.Discrete = res; break; case SAHPI_CTRL_TYPE_ANALOG: i = get_int_param("Value ==> ", &res); if (i != 1) { printf("Invalid value\n"); return HPI_SHELL_CMD_ERROR; }; state.StateUnion.Analog = res; break; case SAHPI_CTRL_TYPE_STREAM: i = get_string_param("Repeat(yes|no): ", buf, 4); if (i != 0) return(HPI_SHELL_CMD_ERROR); str = buf; while (*str == ' ') str++; if (strncmp(str, "yes", 3) == 0) state.StateUnion.Stream.Repeat = 1; i = get_string_param("Stream: ", buf, 4); i = strlen(buf); if (i > 4) i = 4; state.StateUnion.Stream.StreamLength = i; strncpy((char *)(state.StateUnion.Stream.Stream), buf, i); break; case SAHPI_CTRL_TYPE_TEXT: i = get_int_param("Line #: ", &res); if (i != 1) { printf("Invalid value\n"); return HPI_SHELL_CMD_ERROR; }; state.StateUnion.Text.Line = res; printf("Text: "); i = set_text_buffer(&(state.StateUnion.Text.Text)); if (i != 0) { printf("Invalid text\n"); return(HPI_SHELL_CMD_ERROR); }; break; case SAHPI_CTRL_TYPE_OEM: i = get_int_param("Manufacturer Id: ", &res); if (i != 1) { printf("Invalid value\n"); return HPI_SHELL_CMD_ERROR; }; state.StateUnion.Oem.MId = res; memset(state.StateUnion.Oem.Body, 0, SAHPI_CTRL_MAX_OEM_BODY_LENGTH); i = get_hex_string_param("Oem body: ", (char *)(state.StateUnion.Oem.Body), SAHPI_CTRL_MAX_OEM_BODY_LENGTH); state.StateUnion.Oem.BodyLength = i; break; default: strcpy(buf, "Unknown control type\n"); return(HPI_SHELL_CMD_ERROR); }; rv = saHpiControlSet(sessionid, resourceid, num, SAHPI_CTRL_MODE_MANUAL, &state); if (rv != SA_OK) { printf("saHpiControlSet: error: %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; return(HPI_SHELL_OK); } ret_code_t ctrl_block_state(void) { show_control_state(Domain->sessionId, ctrl_block_env.rptid, ctrl_block_env.rdrnum, ui_print, get_int_param); return(HPI_SHELL_OK); } ret_code_t ctrl_block_setst(void) { return(set_control_state(Domain->sessionId, ctrl_block_env.rptid, ctrl_block_env.rdrnum)); } ret_code_t ctrl_block_show(void) { show_control(Domain->sessionId, ctrl_block_env.rptid, ctrl_block_env.rdrnum, ui_print); return(HPI_SHELL_OK); } ret_code_t ctrl_block(void) { SaHpiRdrT rdr_entry; SaHpiResourceIdT rptid; SaHpiInstrumentIdT rdrnum; SaHpiRdrTypeT type; SaErrorT rv; char buf[256]; ret_code_t ret; term_def_t *term; int res; ret = ask_rpt(&rptid); if (ret != HPI_SHELL_OK) return(ret); type = SAHPI_CTRL_RDR; ret = ask_rdr(rptid, type, &rdrnum); if (ret != HPI_SHELL_OK) return(ret); ctrl_block_env.rptid = rptid; ctrl_block_env.rdrnum = rdrnum; rv = saHpiRdrGetByInstrumentId(Domain->sessionId, rptid, type, rdrnum, &rdr_entry); if (rv != SA_OK) { printf("saHpiRdrGetByInstrumentId error %s\n", oh_lookup_error(rv)); printf("ERROR!!! Can not get rdr: ResourceId=%d RdrType=%d RdrNum=%d\n", rptid, type, rdrnum); return(HPI_SHELL_CMD_ERROR); }; show_control(Domain->sessionId, rptid, rdrnum, ui_print); for (;;) { block_type = CTRL_COM; res = get_new_command("control block ==> "); if (res == 2) { unget_term(); return HPI_SHELL_OK; }; term = get_next_term(); if (term == NULL) continue; snprintf(buf, 256, "%s", term->term); if ((strcmp(buf, "q") == 0) || (strcmp(buf, "quit") == 0)) break; }; block_type = MAIN_COM; return HPI_SHELL_OK; } int set_text_buffer(SaHpiTextBufferT *buf) { int i, j, ind; char str[SAHPI_MAX_TEXT_BUFFER_LENGTH], *str1; SaHpiTextTypeT type = SAHPI_TL_TYPE_TEXT; SaHpiLanguageT lang = SAHPI_LANG_ENGLISH; i = get_string_param("DataType(text|bcd|ascii6|bin|unicode): ", str, 10); if (i != 0) return(-1); if (strcmp(str, "text") == 0) type = SAHPI_TL_TYPE_TEXT; else if (strcmp(str, "bcd") == 0) type = SAHPI_TL_TYPE_BCDPLUS; else if (strcmp(str, "ascii6") == 0) type = SAHPI_TL_TYPE_ASCII6; else if (strcmp(str, "bin") == 0) type = SAHPI_TL_TYPE_BINARY; else if (strcmp(str, "unicode") == 0) type = SAHPI_TL_TYPE_UNICODE; /* * ask a language for unicode and text: Fix me */ i = get_string_param("Text: ", str, SAHPI_MAX_TEXT_BUFFER_LENGTH); if (i != 0) return(-1); buf->DataType = type; switch (type) { case SAHPI_TL_TYPE_UNICODE: printf("UNICODE: not implemented"); return(-1); case SAHPI_TL_TYPE_BCDPLUS: for (i = 0; i < strlen(str); i++) { switch ( str[i] ) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case ' ': case '-': case '.': case ':': case ',': case '_': break; default: printf( "BCD+: Illegal symbol \'%c\'(0x%x)\n", str[i], str[i] ); return -1; } } snprintf((char *)&(buf->Data), SAHPI_MAX_TEXT_BUFFER_LENGTH, "%s", str); buf->DataLength = strlen(str); buf->Language = lang; break; case SAHPI_TL_TYPE_ASCII6: for (i = 0; i < strlen(str); i++) { if ( ( str[i] < 0x20 ) || ( str[i] > 0x5F ) ) { printf( "ASCII6: Illegal symbol \'%c\'(0x%x)\n", str[i], str[i] ); return -1; } } snprintf((char *)&(buf->Data), SAHPI_MAX_TEXT_BUFFER_LENGTH, "%s", str); buf->DataLength = strlen(str); buf->Language = lang; break; case SAHPI_TL_TYPE_TEXT: snprintf((char *)&(buf->Data), SAHPI_MAX_TEXT_BUFFER_LENGTH, "%s", str); buf->DataLength = strlen(str); buf->Language = lang; break; case SAHPI_TL_TYPE_BINARY: str1 = (char *)&(buf->Data); ind = 0; for (i = 0; i < strlen(str); i++) { for (j = 0; j < 16; j++) if (hex_codes[j] == toupper(str[i])) break; if (j >= 16) return(-1); if (i % 2) str1[ind++] += j; else str1[ind] = j << 4; }; buf->DataLength = (i + 1)/ 2; break; }; return(0); } static void show_rdr_attrs(SaHpiRdrT *rdr_entry) { Rdr_t tmp_rdr; make_attrs_rdr(&tmp_rdr, rdr_entry); show_Rdr(&tmp_rdr, ui_print); free_attrs(&(tmp_rdr.Attrutes)); } static ret_code_t list_cond(SaHpiResourceIdT rptid, SaHpiInstrumentIdT rdrnum) { SaErrorT rv; SaHpiAnnouncementT annon; SaHpiTextBufferT buffer; annon.EntryId = SAHPI_FIRST_ENTRY; for (;;) { rv = saHpiAnnunciatorGetNext(Domain->sessionId, rptid, rdrnum, SAHPI_ALL_SEVERITIES, SAHPI_FALSE, &annon); if (rv != SA_OK) { if (rv == SA_ERR_HPI_NOT_PRESENT) break; printf("saHpiAnnunciatorGetNext error %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; oh_decode_time(annon.Timestamp, &buffer); printf(" ID: %d AddedByUser: %d Acknowledged: %d Time: %s Sever: %d\n", annon.EntryId, annon.AddedByUser, annon.Acknowledged, buffer.Data, annon.Severity); }; return HPI_SHELL_OK; } static ret_code_t set_acknowledge(SaHpiResourceIdT rptid, SaHpiInstrumentIdT rdrnum) { SaErrorT rv; char str[32]; int i, all = 0; SaHpiSeverityT sev = SAHPI_OK; SaHpiEntryIdT entryId = 0; i = get_string_param("EntryId( | all): ", str, 32); if (i != 0) return(HPI_SHELL_PARM_ERROR); if (strcmp(str, "all") == 0) all = 1; else entryId = atoi(str); if (all) { i = get_string_param("Severity(crit|maj|min|info|ok): ", str, 10); if (i != 0) return(HPI_SHELL_PARM_ERROR); if (strcmp(str, "crit") == 0) sev = SAHPI_CRITICAL; else if (strcmp(str, "maj") == 0) sev = SAHPI_MAJOR; else if (strcmp(str, "min") == 0) sev = SAHPI_MINOR; else if (strcmp(str, "info") == 0) sev = SAHPI_INFORMATIONAL; else if (strcmp(str, "ok") == 0) sev = SAHPI_OK; else { printf("Invalid severity %s\n", str); return(HPI_SHELL_PARM_ERROR); }; entryId = SAHPI_ENTRY_UNSPECIFIED; }; rv = saHpiAnnunciatorAcknowledge(Domain->sessionId, rptid, rdrnum, entryId, sev); if (rv != SA_OK) { printf("saHpiAnnunciatorAcknowledge error %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; return HPI_SHELL_OK; } static ret_code_t delete_announ(SaHpiResourceIdT rptid, SaHpiInstrumentIdT rdrnum) { SaErrorT rv; char str[32]; int i, any = 0; SaHpiSeverityT sev = SAHPI_OK; SaHpiEntryIdT entryId = 0; i = get_string_param("EntryId( | any): ", str, 32); if (i != 0) return(HPI_SHELL_PARM_ERROR); if (strcmp(str, "any") == 0) any = 1; else entryId = atoi(str); if (any) { i = get_string_param("Severity(crit|maj|min|info|ok|all): ", str, 10); if (i != 0) return(-1); if (strcmp(str, "crit") == 0) sev = SAHPI_CRITICAL; else if (strcmp(str, "maj") == 0) sev = SAHPI_MAJOR; else if (strcmp(str, "min") == 0) sev = SAHPI_MINOR; else if (strcmp(str, "info") == 0) sev = SAHPI_INFORMATIONAL; else if (strcmp(str, "ok") == 0) sev = SAHPI_OK; else if (strcmp(str, "all") == 0) sev = SAHPI_ALL_SEVERITIES; else { printf("Invalid severity %s\n", str); return(HPI_SHELL_PARM_ERROR); }; entryId = SAHPI_ENTRY_UNSPECIFIED; }; rv = saHpiAnnunciatorDelete(Domain->sessionId, rptid, rdrnum, entryId, sev); if (rv != SA_OK) { printf("saHpiAnnunciatorDelete error %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; return HPI_SHELL_OK; } static ret_code_t add_announ(SaHpiResourceIdT rptid, SaHpiInstrumentIdT rdrnum) { SaErrorT rv; char str[32]; int i; SaHpiSeverityT sev = SAHPI_OK; SaHpiAnnouncementT announ; SaHpiStatusCondTypeT type = SAHPI_STATUS_COND_TYPE_SENSOR; SaHpiDomainIdT did; SaHpiResourceIdT resId; SaHpiSensorNumT sennum = 0; memset(&announ, 0, sizeof(SaHpiAnnouncementT)); i = get_string_param("Severity(crit|maj|min|info|ok): ", str, 10); if (i != 0) return(HPI_SHELL_PARM_ERROR); if (strcmp(str, "crit") == 0) sev = SAHPI_CRITICAL; else if (strcmp(str, "maj") == 0) sev = SAHPI_MAJOR; else if (strcmp(str, "min") == 0) sev = SAHPI_MINOR; else if (strcmp(str, "info") == 0) sev = SAHPI_INFORMATIONAL; else if (strcmp(str, "ok") == 0) sev = SAHPI_OK; else { printf("Invalid severity %s\n", str); return(HPI_SHELL_PARM_ERROR); }; announ.Severity = sev; i = get_string_param("Condition Type(sensor|res|oem|user): ", str, 10); if (i != 0) return(-1); if (strcmp(str, "sensor") == 0) type = SAHPI_STATUS_COND_TYPE_SENSOR; else if (strcmp(str, "res") == 0) type = SAHPI_STATUS_COND_TYPE_RESOURCE; else if (strcmp(str, "oem") == 0) type = SAHPI_STATUS_COND_TYPE_OEM; else if (strcmp(str, "user") == 0) type = SAHPI_STATUS_COND_TYPE_USER; else { printf("Invalid Condition Type %s\n", str); return(HPI_SHELL_PARM_ERROR); }; announ.StatusCond.Type = type; // EntityPath: is needed ??? // oh_encode_entitypath(char *str, SaHpiEntityPathT *ep); convert string into ep. i = get_int_param("DomainId: ", (int *)&did); if (i != 1) did = SAHPI_UNSPECIFIED_DOMAIN_ID; announ.StatusCond.DomainId = did; i = get_int_param("ResourceId: ", (int *)&resId); if (i != 1) resId = SAHPI_UNSPECIFIED_RESOURCE_ID; announ.StatusCond.ResourceId = resId; i = get_int_param("Sensor number: ", (int *)&sennum); announ.StatusCond.SensorNum = sennum; rv = saHpiAnnunciatorAdd(Domain->sessionId, rptid, rdrnum, &announ); if (rv != SA_OK) { printf("saHpiAnnunciatorAdd error %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; return HPI_SHELL_OK; } static void show_cond(SaHpiResourceIdT rptid, SaHpiInstrumentIdT rdrnum, int num) { SaErrorT rv; SaHpiAnnouncementT announ; SaHpiTextBufferT buffer; SaHpiConditionT *cond; char *str; oh_big_textbuffer tmpbuf; rv = saHpiAnnunciatorGet(Domain->sessionId, rptid, rdrnum, num, &announ); if (rv != SA_OK) { printf("Can not find Announcement: %d\n", num); return; }; oh_decode_time(announ.Timestamp, &buffer); printf(" ID: %d AddedByUser: %d Acknowledged: %d Time: %s Sever: %d\n", announ.EntryId, announ.AddedByUser, announ.Acknowledged, buffer.Data, announ.Severity); cond = &(announ.StatusCond); switch (cond->Type) { case SAHPI_STATUS_COND_TYPE_SENSOR: str = "SENSOR"; break; case SAHPI_STATUS_COND_TYPE_RESOURCE: str = "RESOURCE"; break; case SAHPI_STATUS_COND_TYPE_OEM: str = "OEM"; break; case SAHPI_STATUS_COND_TYPE_USER: str = "USER"; break; default: str = "UNKNOWN"; break; }; printf(" Condition: Type = %s DomainId = %d ResId %d SensorNum = %d\n", str, cond->DomainId, cond->ResourceId, cond->SensorNum); oh_decode_entitypath(&(cond->Entity), &tmpbuf); printf(" EPath = %s\n", tmpbuf.Data); printf(" Mid = %d EventState = %x\n", cond->Mid, cond->EventState); printf(" Name = %s Data = %s\n", cond->Name.Value, cond->Data.Data); } ret_code_t ann_block_acknow(void) { return(set_acknowledge(ann_block_env.rptid, ann_block_env.rdrnum)); } ret_code_t ann_block_list(void) { return(list_cond(ann_block_env.rptid, ann_block_env.rdrnum)); } ret_code_t ann_block_add(void) { return(add_announ(ann_block_env.rptid, ann_block_env.rdrnum)); } ret_code_t ann_block_delete(void) { return(delete_announ(ann_block_env.rptid, ann_block_env.rdrnum)); } ret_code_t ann_block_modeget(void) { SaErrorT rv; SaHpiAnnunciatorModeT mode; char *str; rv = saHpiAnnunciatorModeGet(Domain->sessionId, ann_block_env.rptid, ann_block_env.rdrnum, &mode); if (rv != SA_OK) { printf("saHpiAnnunciatorModeGet error %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; switch (mode) { case SAHPI_ANNUNCIATOR_MODE_AUTO: str = "AUTO"; break; case SAHPI_ANNUNCIATOR_MODE_USER: str = "USER"; break; case SAHPI_ANNUNCIATOR_MODE_SHARED: str = "SHARED"; break; default: str = "Unknown"; break; }; printf("Annunciator Mode: %s\n", str); return(HPI_SHELL_OK); } ret_code_t ann_block_modeset(void) { SaErrorT rv; SaHpiAnnunciatorModeT mode; char buf[256]; int res; res = get_string_param("Mode(auto|user|shared): ", buf, 10); if (res != 0) { printf("Invalid mode: %s\n", buf); return(HPI_SHELL_PARM_ERROR); }; if (strcmp(buf, "auto") == 0) mode = SAHPI_ANNUNCIATOR_MODE_AUTO; else if (strcmp(buf, "user") == 0) mode = SAHPI_ANNUNCIATOR_MODE_USER; else if (strcmp(buf, "shared") == 0) mode = SAHPI_ANNUNCIATOR_MODE_SHARED; else { printf("Invalid mode: %s\n", buf); return(HPI_SHELL_PARM_ERROR); }; rv = saHpiAnnunciatorModeSet(Domain->sessionId, ann_block_env.rptid, ann_block_env.rdrnum, mode); if (rv != SA_OK) { printf("saHpiAnnunciatorModeSet error %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; return(HPI_SHELL_OK); } ret_code_t ann_block_show(void) { term_def_t *term; int res, val; term = get_next_term(); if (term == NULL) { show_rdr_attrs(&(ann_block_env.rdr_entry)); return(HPI_SHELL_OK); }; unget_term(); res = get_int_param(" ", &val); if (res != 1) unget_term(); else show_cond(ann_block_env.rptid, ann_block_env.rdrnum, val); return(HPI_SHELL_OK); } ret_code_t ann_block(void) { SaHpiResourceIdT rptid; SaHpiInstrumentIdT rdrnum; SaHpiRdrTypeT type; SaErrorT rv; char buf[256]; ret_code_t ret; term_def_t *term; int res; ret = ask_rpt(&rptid); if (ret != HPI_SHELL_OK) return(ret); type = SAHPI_ANNUNCIATOR_RDR; ret = ask_rdr(rptid, type, &rdrnum); if (ret != HPI_SHELL_OK) return(ret); rv = saHpiRdrGetByInstrumentId(Domain->sessionId, rptid, type, rdrnum, &(ann_block_env.rdr_entry)); if (rv != SA_OK) { printf("saHpiRdrGetByInstrumentId error %s\n", oh_lookup_error(rv)); printf("ERROR!!! Can not get rdr: ResourceId=%d RdrType=%d RdrNum=%d\n", rptid, type, rdrnum); return(HPI_SHELL_CMD_ERROR); }; ann_block_env.rptid = rptid; ann_block_env.rdrnum = rdrnum; show_rdr_attrs(&(ann_block_env.rdr_entry)); for (;;) { block_type = ANN_COM; res = get_new_command("annunciator block ==> "); if (res == 2) { unget_term(); block_type = MAIN_COM; return HPI_SHELL_OK; }; term = get_next_term(); if (term == NULL) continue; snprintf(buf, 256, "%s", term->term); if ((strcmp(buf, "q") == 0) || (strcmp(buf, "quit") == 0)) break; }; block_type = MAIN_COM; return HPI_SHELL_OK; } openhpi-3.6.1/hpi_shell/service.c0000644000175100017510000011352512575647264015757 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Kouzmich < Mikhail.V.Kouzmich@intel.com > * */ #include #include #include #include #include #include #include "hpi_ui.h" // function numbers for lookup_proc #define LANG_PROC 1 #define TAGTYPE_PROC 2 #define RDRTYPE_PROC 3 #define SENREADT_PROC 4 #define SENUNIT_PROC 5 #define SENMODU_PROC 6 #define SENTYPE_PROC 7 #define CATEGORY_PROC 8 #define CTRLTYPE_PROC 9 #define CTRLMODE_PROC 10 #define CTRLOUTPUT_PROC 11 #define CTRLDIGIT_PROC 12 #define SEVERITY_PROC 13 #define EVENTCTRL_PROC 14 // function numbers for decode_proc #define EPATH_PROC 1 #define GUID_PROC 2 #define CONFIGDATA_PROC 3 #define OEMCTRLSTATEBODY_PROC 4 // function numbers for decode1_proc #define CAPAB_PROC 1 #define HSCAPAB_PROC 2 #define THDMASK_PROC 3 #define RANGEMASK_PROC 4 #define FUMIACCESSPROT_PROC 5 #define FUMICAPAB_PROC 6 #define MANUFACTURERID_PROC 7 extern char *lookup_proc(int num, int val); extern SaErrorT decode_proc(int num, void *val, char *buf, int bufsize); extern SaErrorT decode1_proc(int num, int val, char *buf, int bufsize); extern SaErrorT thres_value(SaHpiSensorReadingT *item, char *buf, int size); #define RPT_ATTRS_NUM 9 attr_t Def_rpt[] = { { "EntryId", INT_TYPE, 0, { .d = 0} }, // 0 { "ResourceId", INT_TYPE, 0, { .d = 0} }, // 1 { "ResourceInfo", STRUCT_TYPE, 0, { .d = 0} }, // 2 { "ResourceEntity", DECODE_TYPE, EPATH_PROC, { .d = 0} }, // 3 { "Capabilities", DECODE1_TYPE, CAPAB_PROC, { .d = 0} }, // 4 { "HotSwapCapabilities",DECODE1_TYPE, HSCAPAB_PROC, { .d = 0} }, // 5 { "ResourceSeverity", LOOKUP_TYPE, SEVERITY_PROC, { .d = 0} }, // 6 { "ResourceFailed", BOOL_TYPE, 0, { .d = 0} }, // 7 { "Tag", TEXT_BUFF_TYPE, 0, { .d = 0} } // 8 }; #define RESINFO_ATTRS_NUM 9 attr_t Def_resinfo[] = { { "ResourceRev", INT_TYPE, 0, { .d = 0} }, // 0 { "SpecificVer", INT_TYPE, 0, { .d = 0} }, // 1 { "DeviceSupport", INT_TYPE, 0, { .d = 0} }, // 2 { "ManufacturerId", DECODE1_TYPE, MANUFACTURERID_PROC, { .d = 0} }, // 3 { "ProductId", INT_TYPE, 0, { .d = 0} }, // 4 { "FirmwareMajorRev", INT_TYPE, 0, { .d = 0} }, // 5 { "FirmwareMinorRev", INT_TYPE, 0, { .d = 0} }, // 6 { "AuxFirmwareRev", INT_TYPE, 0, { .d = 0} }, // 7 { "Guid", DECODE_TYPE, GUID_PROC, { .d = 0} } // 8 }; char *lookup_proc(int num, int val) { char *string = (char *)NULL; switch (num) { case LANG_PROC: string = oh_lookup_language(val); break; case TAGTYPE_PROC: string = oh_lookup_texttype(val); break; case RDRTYPE_PROC: string = oh_lookup_rdrtype(val); break; case SENREADT_PROC: string = oh_lookup_sensorreadingtype(val); break; case SENUNIT_PROC: string = oh_lookup_sensorunits(val); break; case SENMODU_PROC: string = oh_lookup_sensormodunituse(val); break; case SENTYPE_PROC: string = oh_lookup_sensortype(val); break; case CATEGORY_PROC: string = oh_lookup_eventcategory(val); break; case CTRLTYPE_PROC: string = oh_lookup_ctrltype(val); break; case CTRLMODE_PROC: string = oh_lookup_ctrlmode(val); break; case CTRLOUTPUT_PROC: string = oh_lookup_ctrloutputtype(val); break; case CTRLDIGIT_PROC: string = oh_lookup_ctrlstatedigital(val); break; case SEVERITY_PROC: string = oh_lookup_severity(val); break; case EVENTCTRL_PROC: string = oh_lookup_sensoreventctrl(val); break; }; if (string == (char *)NULL) return(""); return(string); } static void decode_configdata(const SaHpiUint8T * configdata, oh_big_textbuffer * buf) { unsigned int i; for ( i = 0; i < SAHPI_CTRL_OEM_CONFIG_LENGTH; ++i ) { oh_append_hex_bigtext(buf, configdata[i]); oh_append_char_bigtext(buf, ' '); } } static void decode_oemctrlstatebody(const SaHpiCtrlStateOemT * oem_state, oh_big_textbuffer * buf) { unsigned int i; for ( i = 0; i < oem_state->BodyLength; ++i ) { oh_append_hex_bigtext(buf, oem_state->Body[i]); oh_append_char_bigtext(buf, ' '); } } SaErrorT decode_proc(int num, void *val, char *buf, int bufsize) { oh_big_textbuffer tmpbuf; SaErrorT rv; oh_init_bigtext(&tmpbuf); memset(buf, 0, bufsize); switch (num) { case EPATH_PROC: rv = oh_decode_entitypath((SaHpiEntityPathT *)val, &tmpbuf); if (rv != SA_OK) return(-1); break; case GUID_PROC: oh_decode_guid((const SaHpiGuidT*)val, &tmpbuf); break; case CONFIGDATA_PROC: decode_configdata((const SaHpiUint8T*)val, &tmpbuf); break; case OEMCTRLSTATEBODY_PROC: decode_oemctrlstatebody((const SaHpiCtrlStateOemT*)val, &tmpbuf); break; }; strncpy(buf, (char *)(tmpbuf.Data), bufsize); return(SA_OK); } static void oh_threshold_mask(SaHpiSensorThdMaskT mask, char *buf, int bufsize) { char tmp[256]; int ind; memset(buf, 0, 256); if (mask == 0) return; strcpy(tmp, "{ "); if (mask & SAHPI_STM_LOW_MINOR) strcat(tmp, "LOW_MINOR | "); if (mask & SAHPI_STM_LOW_MAJOR) strcat(tmp, "LOW_MAJOR | "); if (mask & SAHPI_STM_LOW_CRIT) strcat(tmp, "LOW_CRIT | "); if (mask & SAHPI_STM_LOW_HYSTERESIS) strcat(tmp, "LOW_HYSTERESIS | "); if (mask & SAHPI_STM_UP_MINOR) strcat(tmp, "UP_MINOR | "); if (mask & SAHPI_STM_UP_MAJOR) strcat(tmp, "UP_MAJOR | "); if (mask & SAHPI_STM_UP_CRIT) strcat(tmp, "UP_CRIT | "); if (mask & SAHPI_STM_UP_HYSTERESIS) strcat(tmp, "UP_HYSTERESIS | "); ind = strlen(tmp); /* Remove last delimiter */ if (tmp[ind - 2] == '{') // null mask return; tmp[ind - 2] = '}'; tmp[ind - 1] = 0; strncpy(buf, tmp, bufsize); return; } static void oh_range_mask(SaHpiSensorRangeFlagsT mask, char *buf, int bufsize) { char tmp[256]; int ind; memset(buf, 0, 256); if (mask == 0) return; strcpy(tmp, "{ "); if (mask & SAHPI_SRF_MIN) strcat(tmp, "MIN | "); if (mask & SAHPI_SRF_MAX) strcat(tmp, "MAX | "); if (mask & SAHPI_SRF_NORMAL_MIN) strcat(tmp, "NORMAL MIN | "); if (mask & SAHPI_SRF_NORMAL_MAX) strcat(tmp, "NORMAL MAX | "); if (mask & SAHPI_SRF_NOMINAL) strcat(tmp, "NOMINAL | "); ind = strlen(tmp); /* Remove last delimiter */ if (tmp[ind - 2] == '{') // null mask return; tmp[ind - 2] = '}'; tmp[ind - 1] = 0; strncpy(buf, tmp, bufsize); return; } static void decode_bits(unsigned int mask, unsigned int bitmask, const char * name, unsigned int * decoded_mask, char * buf, int bufsize) { if ( mask & bitmask ) { if ( (*decoded_mask) != 0 ) { strncat( buf, "|", bufsize ); } strncat( buf, name, bufsize ); *decoded_mask |= bitmask; } } static void oh_fumi_access_prot_mask(SaHpiFumiProtocolT mask, char *buf, int bufsize) { SaHpiFumiProtocolT decoded = 0; if ( mask == 0 ) { return; } strncpy( buf, "{", bufsize ); decode_bits( mask, SAHPI_FUMI_PROT_TFTP, " TFTP ", &decoded, buf, bufsize ); decode_bits( mask, SAHPI_FUMI_PROT_FTP, " FTP ", &decoded, buf, bufsize ); decode_bits( mask, SAHPI_FUMI_PROT_HTTP, " HTTP ", &decoded, buf, bufsize ); decode_bits( mask, SAHPI_FUMI_PROT_LDAP, " LDAP ", &decoded, buf, bufsize ); decode_bits( mask, SAHPI_FUMI_PROT_LOCAL, " LOCAL ", &decoded, buf, bufsize ); decode_bits( mask, SAHPI_FUMI_PROT_NFS, " NFS ", &decoded, buf, bufsize ); decode_bits( mask, SAHPI_FUMI_PROT_DBACCESS, " DBACCESS ", &decoded, buf, bufsize ); decode_bits( mask, mask ^ decoded, " UNKNOWN ", &decoded, buf, bufsize ); strncat( buf, "}", bufsize ); } static void oh_fumi_caps_mask(SaHpiFumiCapabilityT mask, char *buf, int bufsize) { SaHpiFumiCapabilityT decoded = 0; if ( mask == 0 ) { return; } strncpy( buf, "{", bufsize ); decode_bits( mask, SAHPI_FUMI_CAP_ROLLBACK, " ROLLBACK ", &decoded, buf, bufsize ); decode_bits( mask, SAHPI_FUMI_CAP_BANKCOPY, " BANKCOPY ", &decoded, buf, bufsize ); decode_bits( mask, SAHPI_FUMI_CAP_BANKREORDER, " BANKREORDER ", &decoded, buf, bufsize ); decode_bits( mask, SAHPI_FUMI_CAP_BACKUP, " BACKUP ", &decoded, buf, bufsize ); decode_bits( mask, SAHPI_FUMI_CAP_TARGET_VERIFY, " TARGET_VERIFY ", &decoded, buf, bufsize ); decode_bits( mask, SAHPI_FUMI_CAP_TARGET_VERIFY_MAIN, " TARGET_VERIFY_MAIN ", &decoded, buf, bufsize ); decode_bits( mask, SAHPI_FUMI_CAP_COMPONENTS, " COMPONENTS ", &decoded, buf, bufsize ); decode_bits( mask, SAHPI_FUMI_CAP_AUTOROLLBACK, " AUTOROLLBACK ", &decoded, buf, bufsize ); decode_bits( mask, SAHPI_FUMI_CAP_AUTOROLLBACK_CAN_BE_DISABLED, " AUTOROLLBACK_CAN_BE_DISABLED ", &decoded, buf, bufsize ); decode_bits( mask, SAHPI_FUMI_CAP_MAIN_NOT_PERSISTENT, " MAIN_NOT_PERSISTENT ", &decoded, buf, bufsize ); decode_bits( mask, mask ^ decoded, " UNKNOWN ", &decoded, buf, bufsize ); strncat( buf, "}", bufsize ); } static void oh_manufacturer_id(SaHpiManufacturerIdT mid, char *buf, int bufsize) { if (mid != SAHPI_MANUFACTURER_ID_UNSPECIFIED) { snprintf(buf, bufsize, "%d (0x%08x)", mid, mid); } else { strcpy(buf, "Unspecified"); } } SaErrorT decode1_proc(int num, int val, char *buf, int bufsize) { SaHpiTextBufferT tbuf; SaErrorT rv; memset(buf, 0, bufsize); switch (num) { case CAPAB_PROC: rv = oh_decode_capabilities(val, &tbuf); if (rv != SA_OK) return(-1); break; case HSCAPAB_PROC: rv = oh_decode_hscapabilities(val, &tbuf); if (rv != SA_OK) return(-1); break; case THDMASK_PROC: oh_threshold_mask(val, buf, bufsize); return(SA_OK); case RANGEMASK_PROC: oh_range_mask(val, buf, bufsize); return(SA_OK); case FUMIACCESSPROT_PROC: oh_fumi_access_prot_mask(val, buf, bufsize); return(SA_OK); case FUMICAPAB_PROC: oh_fumi_caps_mask(val, buf, bufsize); return(SA_OK); case MANUFACTURERID_PROC: oh_manufacturer_id(val, buf, bufsize); return(SA_OK); }; strncpy(buf, (char *)(tbuf.Data), bufsize); return(SA_OK); } SaErrorT thres_value(SaHpiSensorReadingT *item, char *buf, int size) { char *val; int i, n; memset(buf, 0, size); if (item->IsSupported != SAHPI_TRUE) return(-1); switch (item->Type) { case SAHPI_SENSOR_READING_TYPE_INT64: snprintf(buf, size, "%" PRId64, (int64_t)item->Value.SensorInt64); break; case SAHPI_SENSOR_READING_TYPE_UINT64: snprintf(buf, size, "%" PRIu64, (uint64_t)item->Value.SensorUint64); break; case SAHPI_SENSOR_READING_TYPE_FLOAT64: snprintf(buf, size, "%10.3f", item->Value.SensorFloat64); break; case SAHPI_SENSOR_READING_TYPE_BUFFER: val = (char *)(item->Value.SensorBuffer); if (val == NULL ) { return(-1); } n = ( SAHPI_SENSOR_BUFFER_LENGTH > ( size / 2 ) ) ? ( size / 2 ) : SAHPI_SENSOR_BUFFER_LENGTH; buf[0] = '\0'; for (i = 0; i < n; ++i) { sprintf( buf + 2 * i, "%02x", val[i] ); } }; return(SA_OK); } static int find_attr(Attributes_t *attrs, char *name) { int i; for (i = 0; i < attrs->n_attrs; i++) { if (strcmp(attrs->Attrs[i].name, name) == 0) return(i); }; return(-1); } void make_attrs_rpt(Rpt_t *Rpt, SaHpiRptEntryT *rptentry) { attr_t *att, *att1; int i = 0; Attributes_t *at; SaHpiRptEntryT *obj; Rpt->Table = *rptentry; obj = &(Rpt->Table); Rpt->Attrutes.n_attrs = RPT_ATTRS_NUM; Rpt->Attrutes.Attrs = (attr_t *)malloc(sizeof(attr_t) * RPT_ATTRS_NUM); memcpy(Rpt->Attrutes.Attrs, Def_rpt, sizeof(attr_t) * RPT_ATTRS_NUM); att = Rpt->Attrutes.Attrs; att[i++].value.i = obj->EntryId; att[i++].value.i = obj->ResourceId; at = (Attributes_t *)malloc(sizeof(Attributes_t)); at->n_attrs = RESINFO_ATTRS_NUM; att1 = (attr_t *)malloc(sizeof(attr_t) * RESINFO_ATTRS_NUM); memcpy(att1, Def_resinfo, sizeof(attr_t) * RESINFO_ATTRS_NUM); at->Attrs = att1; att[i++].value.a = at; att1[0].value.i = obj->ResourceInfo.ResourceRev; att1[1].value.i = obj->ResourceInfo.SpecificVer; att1[2].value.i = obj->ResourceInfo.DeviceSupport; att1[3].value.i = obj->ResourceInfo.ManufacturerId; att1[4].value.i = obj->ResourceInfo.ProductId; att1[5].value.i = obj->ResourceInfo.FirmwareMajorRev; att1[6].value.i = obj->ResourceInfo.FirmwareMinorRev; att1[7].value.i = obj->ResourceInfo.AuxFirmwareRev; att1[8].value.a = &obj->ResourceInfo.Guid; att[i++].value.a = &(obj->ResourceEntity); att[i++].value.i = obj->ResourceCapabilities; att[i++].value.i = obj->HotSwapCapabilities; att[i++].value.i = obj->ResourceSeverity; att[i++].value.i = obj->ResourceFailed; att[i++].value.a = &(obj->ResourceTag); } #define RDR_ATTRS_COMMON_NUM 6 attr_t Def_common_rdr[] = { { "RecordId", INT_TYPE, 0, { .d = 0} }, // 0 { "RdrType", LOOKUP_TYPE, RDRTYPE_PROC, { .d = 0} }, // 1 { "EntityPath", DECODE_TYPE, EPATH_PROC, { .d = 0} }, // 2 { "IsFru", BOOL_TYPE, 0, { .d = 0} }, // 3 { "Record", STRUCT_TYPE, 0, { .d = 0} }, // 4 { "IdString", TEXT_BUFF_TYPE, 0, { .d = 0} } // 5 }; #define RDR_ATTRS_SENSOR_NUM 9 attr_t Def_sensor_rdr[] = { { "Num", INT_TYPE, 0, { .d = 0} }, // 0 { "Type", LOOKUP_TYPE, SENTYPE_PROC, { .d = 0} }, // 1 { "Category", LOOKUP_TYPE, CATEGORY_PROC, { .d = 0} }, // 2 { "EnableCtrl", BOOL_TYPE, 0, { .d = 0} }, // 3 { "EventCtrl", LOOKUP_TYPE, EVENTCTRL_PROC, { .d = 0} }, // 4 { "Events", HEX_TYPE, 0, { .d = 0} }, // 5 { "DataFormat", STRUCT_TYPE, 0, { .d = 0} }, // 6 { "ThresholdDefn", STRUCT_TYPE, 0, { .d = 0} }, // 7 { "Oem", INT_TYPE, 0, { .d = 0} } // 8 }; #define ATTRS_SENSOR_DATAFORMAT 8 attr_t DataForm_rdr[] = { { "IsSupported", BOOL_TYPE, 0, { .d = 0} }, // 0 { "ReadingType", LOOKUP_TYPE, SENREADT_PROC, { .d = 0} }, // 1 { "BaseUnits", LOOKUP_TYPE, SENUNIT_PROC, { .d = 0} }, // 2 { "ModifierUnits", LOOKUP_TYPE, SENUNIT_PROC, { .d = 0} }, // 3 { "ModifierUse", LOOKUP_TYPE, SENMODU_PROC, { .d = 0} }, // 4 { "Percentage", BOOL_TYPE, 0, { .d = 0} }, // 5 { "Range", STRUCT_TYPE, 0, { .d = 0} }, // 6 { "AccuracyFactor", FLOAT_TYPE, 0, { .d = 0} } // 7 }; #define ATTRS_SENSOR_THDDEF 4 attr_t ThresDef_rdr[] = { { "IsAccessible", BOOL_TYPE, 0, { .d = 0} }, // 0 { "ReadMask", DECODE1_TYPE, THDMASK_PROC, { .d = 0} }, // 1 { "WriteMask", DECODE1_TYPE, THDMASK_PROC, { .d = 0} }, // 2 { "Nonlinear", BOOL_TYPE, 0, { .d = 0} } // 3 }; #define ATTRS_SENSOR_RANGE 6 attr_t Range_rdr[] = { { "Flags", DECODE1_TYPE, RANGEMASK_PROC, { .d = 0} }, // 0 { "Max", READING_TYPE, 0, { .d = 0} }, // 1 { "Min", READING_TYPE, 0, { .d = 0} }, // 2 { "Nominal", READING_TYPE, 0, { .d = 0} }, // 3 { "NormalMax", READING_TYPE, 0, { .d = 0} }, // 4 { "NormalMin", READING_TYPE, 0, { .d = 0} } // 5 }; static Attributes_t *make_attrs_sensor(SaHpiSensorRecT *sensor) { attr_t *att1, *att2, *att3; Attributes_t *at, *at2, *at3; at = (Attributes_t *)malloc(sizeof(Attributes_t)); at->n_attrs = RDR_ATTRS_SENSOR_NUM; att1 = (attr_t *)malloc(sizeof(attr_t) * RDR_ATTRS_SENSOR_NUM); memcpy(att1, Def_sensor_rdr, sizeof(attr_t) * RDR_ATTRS_SENSOR_NUM); at->Attrs = att1; att1[0].value.i = sensor->Num; att1[1].value.i = sensor->Type; att1[2].value.i = sensor->Category; att1[3].value.i = sensor->EnableCtrl; att1[4].value.i = sensor->EventCtrl; att1[5].value.i = sensor->Events; at2 = (Attributes_t *)malloc(sizeof(Attributes_t)); at2->n_attrs = ATTRS_SENSOR_DATAFORMAT; att2 = (attr_t *)malloc(sizeof(attr_t) * ATTRS_SENSOR_DATAFORMAT); memcpy(att2, DataForm_rdr, sizeof(attr_t) * ATTRS_SENSOR_DATAFORMAT); at2->Attrs = att2; att2[0].value.i = sensor->DataFormat.IsSupported; att2[1].value.i = sensor->DataFormat.ReadingType; att2[2].value.i = sensor->DataFormat.BaseUnits; att2[3].value.i = sensor->DataFormat.ModifierUnits; att2[4].value.i = sensor->DataFormat.ModifierUse; att2[5].value.i = sensor->DataFormat.Percentage; at3 = (Attributes_t *)malloc(sizeof(Attributes_t)); at3->n_attrs = ATTRS_SENSOR_RANGE; att3 = (attr_t *)malloc(sizeof(attr_t) * ATTRS_SENSOR_RANGE); memcpy(att3, Range_rdr, sizeof(attr_t) * ATTRS_SENSOR_RANGE); at3->Attrs = att3; att3[0].value.i = sensor->DataFormat.Range.Flags; att3[1].value.a = &(sensor->DataFormat.Range.Max); att3[2].value.a = &(sensor->DataFormat.Range.Min); att3[3].value.a = &(sensor->DataFormat.Range.Nominal); att3[4].value.a = &(sensor->DataFormat.Range.NormalMax); att3[5].value.a = &(sensor->DataFormat.Range.NormalMin); att2[6].value.a = at3; att2[7].value.d = sensor->DataFormat.AccuracyFactor; att1[6].value.a = at2; at2 = (Attributes_t *)malloc(sizeof(Attributes_t)); at2->n_attrs = ATTRS_SENSOR_THDDEF; att2 = (attr_t *)malloc(sizeof(attr_t) * ATTRS_SENSOR_THDDEF); memcpy(att2, ThresDef_rdr, sizeof(attr_t) * ATTRS_SENSOR_THDDEF); att2[0].value.i = sensor->ThresholdDefn.IsAccessible; att2[1].value.i = sensor->ThresholdDefn.ReadThold; att2[2].value.i = sensor->ThresholdDefn.WriteThold; at2->Attrs = att2; att1[7].value.a = at2; att1[8].value.i = sensor->Oem; return(at); } #define RDR_ATTRS_CTRL_NUM 7 attr_t Def_ctrl_rdr[] = { { "Num", INT_TYPE, 0, { .d = 0} }, // 0 { "Type", LOOKUP_TYPE, CTRLTYPE_PROC, { .d = 0} }, // 1 { "OutputType", LOOKUP_TYPE, CTRLOUTPUT_PROC, { .d = 0} }, // 2 { "TypeUnion", STRUCT_TYPE, 0, { .d = 0} }, // 3 { "DefaultMode", STRUCT_TYPE, 0, { .d = 0} }, // 4 { "WriteOnly", BOOL_TYPE, 0, { .d = 0} }, // 5 { "Oem", INT_TYPE, 0, { .d = 0} } // 6 }; #define ATTRS_CTRL_MODE 2 attr_t Def_ctrl_mode[] = { { "Mode", LOOKUP_TYPE, CTRLMODE_PROC, { .d = 0} }, // 0 { "ReadOnly", BOOL_TYPE, 0, { .d = 0} } // 1 }; #define ATTRS_CTRL_DIGITAL 1 attr_t Def_ctrl_digital[] = { { "Default", LOOKUP_TYPE, CTRLDIGIT_PROC, { .d = 0} } // 0 }; #define ATTRS_CTRL_DISCRETE 1 attr_t Def_ctrl_discrete[] = { { "Default", INT_TYPE, 0, { .d = 0} } // 0 }; #define ATTRS_CTRL_ANALOG 3 attr_t Def_ctrl_analog[] = { { "Min", INT_TYPE, 0, { .d = 0} }, // 0 { "Max", INT_TYPE, 0, { .d = 0} }, // 1 { "Default", INT_TYPE, 0, { .d = 0} } // 2 }; #define ATTRS_CTRL_STREAM 3 attr_t Def_ctrl_stream[] = { { "Repeat", BOOL_TYPE, 0, { .d = 0} }, // 0 { "Length", INT_TYPE, 0, { .d = 0} }, // 1 { "Stream", STR_TYPE, 0, { .d = 0} } // 2 }; #define ATTRS_CTRL_TEXT 5 attr_t Def_ctrl_text[] = { { "MaxChars", INT_TYPE, 0, { .d = 0} }, // 0 { "MaxLines", INT_TYPE, 0, { .d = 0} }, // 1 { "Language", LOOKUP_TYPE, LANG_PROC, { .d = 0} }, // 2 { "DataType", LOOKUP_TYPE, TAGTYPE_PROC, { .d = 0} }, // 3 { "Default", STRUCT_TYPE, 0, { .d = 0} } // 4 }; #define ATTRS_CTRL_TEXT_DEFAULT 2 attr_t Def_ctrl_text_def[] = { { "Line", INT_TYPE, 0, { .d = 0} }, // 0 { "Text", TEXT_BUFF_TYPE, 0, { .d = 0} } // 4 }; #define ATTRS_CTRL_OEM 3 attr_t Def_ctrl_oem[] = { { "ManufacturerId", DECODE1_TYPE, MANUFACTURERID_PROC, { .d = 0} }, // 0 { "ConfigData", DECODE_TYPE, CONFIGDATA_PROC, { .d = 0} }, // 1 { "Default", STRUCT_TYPE, 0, { .d = 0} } // 2 }; #define ATTRS_CTRL_OEM_DEFAULT 3 attr_t Def_ctrl_oem_def[] = { { "ManufacturerId", DECODE1_TYPE, MANUFACTURERID_PROC, { .d = 0} }, // 0 { "BodyLength", INT_TYPE, 0, { .d = 0} }, // 1 { "Body", DECODE_TYPE, OEMCTRLSTATEBODY_PROC, { .d = 0} } // 2 }; static Attributes_t *make_attrs_ctrl(SaHpiCtrlRecT *ctrl) { attr_t *att1, *att2, *att3; Attributes_t *at, *at2, *at3; SaHpiCtrlRecDigitalT *digital; SaHpiCtrlRecDiscreteT *discrete; SaHpiCtrlRecAnalogT *analog; SaHpiCtrlRecStreamT *stream; SaHpiCtrlRecTextT *text; SaHpiCtrlRecOemT * oem; at = (Attributes_t *)malloc(sizeof(Attributes_t)); at->n_attrs = RDR_ATTRS_CTRL_NUM; att1 = (attr_t *)malloc(sizeof(attr_t) * RDR_ATTRS_CTRL_NUM); memcpy(att1, Def_ctrl_rdr, sizeof(attr_t) * RDR_ATTRS_CTRL_NUM); at->Attrs = att1; att1[0].value.i = ctrl->Num; att1[1].value.i = ctrl->Type; att1[2].value.i = ctrl->OutputType; switch (ctrl->Type) { case SAHPI_CTRL_TYPE_DIGITAL: digital = &(ctrl->TypeUnion.Digital); att1[3].name = "Digital"; at2 = (Attributes_t *)malloc(sizeof(Attributes_t)); at2->n_attrs = ATTRS_CTRL_DIGITAL; att2 = (attr_t *)malloc(sizeof(attr_t) * ATTRS_CTRL_DIGITAL); memcpy(att2, Def_ctrl_digital, sizeof(attr_t) * ATTRS_CTRL_DIGITAL); at2->Attrs = att2; att2[0].value.i = digital->Default; att1[3].value.a = at2; break; case SAHPI_CTRL_TYPE_DISCRETE: discrete = &(ctrl->TypeUnion.Discrete); att1[3].name = "Discrete"; at2 = (Attributes_t *)malloc(sizeof(Attributes_t)); at2->n_attrs = ATTRS_CTRL_DISCRETE; att2 = (attr_t *)malloc(sizeof(attr_t) * ATTRS_CTRL_DISCRETE); memcpy(att2, Def_ctrl_discrete, sizeof(attr_t) * ATTRS_CTRL_DISCRETE); at2->Attrs = att2; att2[0].value.i = discrete->Default; att1[3].value.a = at2; break; case SAHPI_CTRL_TYPE_ANALOG: analog = &(ctrl->TypeUnion.Analog); att1[3].name = "Analog"; at2 = (Attributes_t *)malloc(sizeof(Attributes_t)); at2->n_attrs = ATTRS_CTRL_ANALOG; att2 = (attr_t *)malloc(sizeof(attr_t) * ATTRS_CTRL_ANALOG); memcpy(att2, Def_ctrl_analog, sizeof(attr_t) * ATTRS_CTRL_ANALOG); at2->Attrs = att2; att2[0].value.i = analog->Min; att2[1].value.i = analog->Max; att2[2].value.i = analog->Default; att1[3].value.a = at2; break; case SAHPI_CTRL_TYPE_STREAM: stream = &(ctrl->TypeUnion.Stream); att1[3].name = "Stream"; at2 = (Attributes_t *)malloc(sizeof(Attributes_t)); at2->n_attrs = ATTRS_CTRL_STREAM; att2 = (attr_t *)malloc(sizeof(attr_t) * ATTRS_CTRL_STREAM); memcpy(att2, Def_ctrl_stream, sizeof(attr_t) * ATTRS_CTRL_STREAM); at2->Attrs = att2; att2[0].value.i = stream->Default.Repeat; att2[1].value.i = stream->Default.StreamLength; att2[2].value.s = (char *)(stream->Default.Stream); att1[3].value.a = at2; break; case SAHPI_CTRL_TYPE_TEXT: text = &(ctrl->TypeUnion.Text); att1[3].name = "Text"; at2 = (Attributes_t *)malloc(sizeof(Attributes_t)); at2->n_attrs = ATTRS_CTRL_TEXT; att2 = (attr_t *)malloc(sizeof(attr_t) * ATTRS_CTRL_TEXT); memcpy(att2, Def_ctrl_text, sizeof(attr_t) * ATTRS_CTRL_TEXT); at2->Attrs = att2; att2[0].value.i = text->MaxChars; att2[1].value.i = text->MaxLines; att2[2].value.i = text->Language; att2[3].value.i = text->DataType; at3 = (Attributes_t *)malloc(sizeof(Attributes_t)); at3->n_attrs = ATTRS_CTRL_TEXT_DEFAULT; att3 = (attr_t *)malloc(sizeof(attr_t) * ATTRS_CTRL_TEXT_DEFAULT); memcpy(att3, Def_ctrl_text_def, sizeof(attr_t) * ATTRS_CTRL_TEXT_DEFAULT); at3->Attrs = att3; att3[0].value.i = text->Default.Line; att3[1].value.a = &(text->Default.Text); att2[4].value.a = at3; att1[3].value.a = at2; break; case SAHPI_CTRL_TYPE_OEM: oem = &(ctrl->TypeUnion.Oem); att1[3].name = "OEM"; at2 = (Attributes_t *)malloc(sizeof(Attributes_t)); at2->n_attrs = ATTRS_CTRL_OEM; att2 = (attr_t *)malloc(sizeof(attr_t) * ATTRS_CTRL_OEM); memcpy(att2, Def_ctrl_oem, sizeof(attr_t) * ATTRS_CTRL_OEM); at2->Attrs = att2; att2[0].value.i = oem->MId; att2[1].value.a = &oem->ConfigData[0]; at3 = (Attributes_t *)malloc(sizeof(Attributes_t)); at3->n_attrs = ATTRS_CTRL_OEM_DEFAULT; att3 = (attr_t *)malloc(sizeof(attr_t) * ATTRS_CTRL_OEM_DEFAULT); memcpy(att3, Def_ctrl_oem_def, sizeof(attr_t) * ATTRS_CTRL_OEM_DEFAULT); at3->Attrs = att3; att3[0].value.i = oem->Default.MId; att3[1].value.i = oem->Default.BodyLength; att3[2].value.a = &(oem->Default); att2[2].value.a = at3; att1[3].value.a = at2; break; default: att1[3].name = "Digital"; att1[3].type = NO_TYPE; }; at2 = (Attributes_t *)malloc(sizeof(Attributes_t)); at2->n_attrs = ATTRS_CTRL_MODE; att2 = (attr_t *)malloc(sizeof(attr_t) * ATTRS_CTRL_MODE); memcpy(att2, Def_ctrl_mode, sizeof(attr_t) * ATTRS_CTRL_MODE); at2->Attrs = att2; att2[0].value.i = ctrl->DefaultMode.Mode; att2[1].value.i = ctrl->DefaultMode.ReadOnly; att1[4].value.a = at2; att1[5].value.i = ctrl->WriteOnly; att1[6].value.i = ctrl->Oem; return(at); } #define RDR_ATTRS_INV_NUM 3 attr_t Def_inv_rdr[] = { { "IdrId", INT_TYPE, 0, { .d = 0} }, // 0 { "Persistent", BOOL_TYPE, 0, { .d = 0} }, // 1 { "Oem", INT_TYPE, 0, { .d = 0} } // 2 }; static Attributes_t *make_attrs_inv(SaHpiInventoryRecT *inv) { attr_t *att1; Attributes_t *at; at = (Attributes_t *)malloc(sizeof(Attributes_t)); at->n_attrs = RDR_ATTRS_INV_NUM; att1 = (attr_t *)malloc(sizeof(attr_t) * RDR_ATTRS_INV_NUM); memcpy(att1, Def_inv_rdr, sizeof(attr_t) * RDR_ATTRS_INV_NUM); at->Attrs = att1; att1[0].value.i = inv->IdrId; att1[1].value.i = inv->Persistent; att1[2].value.i = inv->Oem; return(at); } #define RDR_ATTRS_WDOG_NUM 2 attr_t Def_wdog_rdr[] = { { "Num", INT_TYPE, 0, { .d = 0} }, // 0 { "Oem", INT_TYPE, 0, { .d = 0} } // 1 }; static Attributes_t *make_attrs_wdog(SaHpiWatchdogRecT *wdog) { attr_t *att1; Attributes_t *at; at = (Attributes_t *)malloc(sizeof(Attributes_t)); at->n_attrs = RDR_ATTRS_WDOG_NUM; att1 = (attr_t *)malloc(sizeof(attr_t) * RDR_ATTRS_WDOG_NUM); memcpy(att1, Def_wdog_rdr, sizeof(attr_t) * RDR_ATTRS_WDOG_NUM); at->Attrs = att1; att1[0].value.i = wdog->WatchdogNum; att1[1].value.i = wdog->Oem; return(at); } #define RDR_ATTRS_ANNUN_NUM 5 attr_t Def_annun_rdr[] = { { "Num", INT_TYPE, 0, { .d = 0} }, // 0 { "Type", INT_TYPE, 0, { .d = 0} }, // 1 { "ReadOnly", INT_TYPE, 0, { .d = 0} }, // 2 { "MaxConditions", INT_TYPE, 0, { .d = 0} }, // 3 { "Oem", INT_TYPE, 0, { .d = 0} } // 4 }; static Attributes_t *make_attrs_annun(SaHpiAnnunciatorRecT *annun) { attr_t *att1; Attributes_t *at; at = (Attributes_t *)malloc(sizeof(Attributes_t)); at->n_attrs = RDR_ATTRS_ANNUN_NUM; att1 = (attr_t *)malloc(sizeof(attr_t) * RDR_ATTRS_ANNUN_NUM); memcpy(att1, Def_annun_rdr, sizeof(attr_t) * RDR_ATTRS_ANNUN_NUM); at->Attrs = att1; att1[0].value.i = annun->AnnunciatorNum; att1[1].value.i = annun->AnnunciatorType; att1[2].value.i = annun->ModeReadOnly; att1[3].value.i = annun->MaxConditions; att1[4].value.i = annun->Oem; return(at); } #define RDR_ATTRS_DIMI_NUM 2 attr_t Def_dimi_rdr[] = { { "DimiNum", INT_TYPE, 0, { .d = 0} }, // 0 { "Oem", INT_TYPE, 0, { .d = 0} } // 1 }; static Attributes_t *make_attrs_dimi(SaHpiDimiRecT *dimi) { attr_t *att1; Attributes_t *at; at = (Attributes_t *)malloc(sizeof(Attributes_t)); at->n_attrs = RDR_ATTRS_DIMI_NUM; att1 = (attr_t *)malloc(sizeof(attr_t) * RDR_ATTRS_DIMI_NUM); memcpy(att1, Def_dimi_rdr, sizeof(attr_t) * RDR_ATTRS_DIMI_NUM); at->Attrs = att1; att1[0].value.i = dimi->DimiNum; att1[1].value.i = dimi->Oem; return(at); } #define RDR_ATTRS_FUMI_NUM 5 attr_t Def_fumi_rdr[] = { { "Num", INT_TYPE, 0, { .d = 0} }, // 0 { "AccessProt", DECODE1_TYPE, FUMIACCESSPROT_PROC, { .d = 0} }, // 1 { "Capability", DECODE1_TYPE, FUMICAPAB_PROC, { .d = 0} }, // 2 { "NumBanks", INT_TYPE, 0, { .d = 0} }, // 3 { "Oem", INT_TYPE, 0, { .d = 0} } // 4 }; static Attributes_t *make_attrs_fumi(SaHpiFumiRecT *fumi) { attr_t *att1; Attributes_t *at; at = (Attributes_t *)malloc(sizeof(Attributes_t)); at->n_attrs = RDR_ATTRS_FUMI_NUM; att1 = (attr_t *)malloc(sizeof(attr_t) * RDR_ATTRS_FUMI_NUM); memcpy(att1, Def_fumi_rdr, sizeof(attr_t) * RDR_ATTRS_FUMI_NUM); at->Attrs = att1; att1[0].value.i = fumi->Num; att1[1].value.i = fumi->AccessProt; att1[2].value.i = fumi->Capability; att1[3].value.i = fumi->NumBanks; att1[4].value.i = fumi->Oem; return(at); } void make_attrs_rdr(Rdr_t *Rdr, SaHpiRdrT *rdrentry) { attr_t *att; int i = 0; Attributes_t *at; SaHpiRdrT *obj; SaHpiSensorRecT *sensor; SaHpiCtrlRecT *ctrl; SaHpiInventoryRecT *inv; SaHpiWatchdogRecT *wdog; SaHpiAnnunciatorRecT *annun; SaHpiDimiRecT *dimi; SaHpiFumiRecT *fumi; Rdr->Record = *rdrentry; obj = &(Rdr->Record); Rdr->Attrutes.n_attrs = RDR_ATTRS_COMMON_NUM; Rdr->Attrutes.Attrs = (attr_t *)malloc(sizeof(attr_t) * RDR_ATTRS_COMMON_NUM); memcpy(Rdr->Attrutes.Attrs, Def_common_rdr, sizeof(attr_t) * RDR_ATTRS_COMMON_NUM); att = Rdr->Attrutes.Attrs; att[i++].value.i = obj->RecordId; att[i++].value.i = obj->RdrType; att[i++].value.a = &(obj->Entity); att[i++].value.i = obj->IsFru; switch (obj->RdrType) { case SAHPI_SENSOR_RDR: sensor = &(obj->RdrTypeUnion.SensorRec); at = make_attrs_sensor(sensor); att[i].name = "Sensor"; att[i++].value.a = at; break; case SAHPI_CTRL_RDR: ctrl = &(obj->RdrTypeUnion.CtrlRec); at = make_attrs_ctrl(ctrl); att[i].name = "Control"; att[i++].value.a = at; break; case SAHPI_INVENTORY_RDR: inv = &(obj->RdrTypeUnion.InventoryRec); at = make_attrs_inv(inv); att[i].name = "Inventory"; att[i++].value.a = at; break; case SAHPI_WATCHDOG_RDR: wdog = &(obj->RdrTypeUnion.WatchdogRec); at = make_attrs_wdog(wdog); att[i].name = "Watchdog"; att[i++].value.a = at; break; case SAHPI_ANNUNCIATOR_RDR: annun = &(obj->RdrTypeUnion.AnnunciatorRec); at = make_attrs_annun(annun); att[i].name = "Annunciator"; att[i++].value.a = at; break; case SAHPI_DIMI_RDR: dimi = &(obj->RdrTypeUnion.DimiRec); at = make_attrs_dimi(dimi); att[i].name = "DIMI"; att[i++].value.a = at; break; case SAHPI_FUMI_RDR: fumi = &(obj->RdrTypeUnion.FumiRec); at = make_attrs_fumi(fumi); att[i].name = "FUMI"; att[i++].value.a = at; break; default: break; }; att[i++].value.a = &(obj->IdString); } void free_attrs(Attributes_t *At) { int i; attr_t *attr; for (i = 0, attr = At->Attrs; i < At->n_attrs; i++, attr++) { if (attr->type == STRUCT_TYPE) { if (attr->value.a == 0) continue; free_attrs((Attributes_t *)(attr->value.a)); free(attr->value.a); } }; free(At->Attrs); } char *get_attr_name(Attributes_t *Attrs, int num) { if ((num < 0) || (num >= Attrs->n_attrs)) return((char *)NULL); return(Attrs->Attrs[num].name); } int get_attr_type(Attributes_t *Attrs, int num) { if ((num < 0) || (num >= Attrs->n_attrs)) return(-1); return(Attrs->Attrs[num].type); } SaErrorT get_value_as_string(Attributes_t *Attrs, int num, char *val, int len) { int type; SaHpiBoolT b; if ((num < 0) || (num >= Attrs->n_attrs) || (val == (char *)NULL) || (len == 0)) return SA_ERR_HPI_INVALID_PARAMS; type = Attrs->Attrs[num].type; switch (type) { case BOOL_TYPE: b = Attrs->Attrs[num].value.i; if (b) snprintf(val, len, "%s", "TRUE"); else snprintf(val, len, "%s", "FALSE"); break; case INT_TYPE: snprintf(val, len, "%d", Attrs->Attrs[num].value.i); break; case HEX_TYPE: snprintf(val, len, "0x%x", Attrs->Attrs[num].value.i); break; case FLOAT_TYPE: snprintf(val, len, "%f", Attrs->Attrs[num].value.d); break; case STR_TYPE: if (Attrs->Attrs[num].value.s != (char *)NULL) snprintf(val, len, "%s", Attrs->Attrs[num].value.s); else *val = 0; break; default: return(SA_ERR_HPI_ERROR); }; return(SA_OK); } SaErrorT get_rdr_attr_as_string(Rdr_t *rdr, char *attr_name, char *val, int len) { int i; SaErrorT ret; if ((attr_name == (char *)NULL) || (val == (char *)NULL) || (len == 0)) return(SA_ERR_HPI_INVALID_PARAMS); i = find_attr(&(rdr->Attrutes), attr_name); if (i < 0) return(SA_ERR_HPI_INVALID_PARAMS); ret = get_value_as_string(&(rdr->Attrutes), i, val, len); return(ret); } SaErrorT get_rdr_attr(Rdr_t *rdr, char *attr_name, union_type_t *val) { int i; if ((attr_name == (char *)NULL) || (val == (union_type_t *)NULL)) return(SA_ERR_HPI_INVALID_PARAMS); i = find_attr(&(rdr->Attrutes), attr_name); if (i < 0) return(SA_ERR_HPI_INVALID_PARAMS); *val = rdr->Attrutes.Attrs[i].value; return(SA_OK); } SaErrorT get_rpt_attr_as_string(Rpt_t *rpt, char *attr_name, char *val, int len) { int i; SaErrorT ret; if ((attr_name == (char *)NULL) || (val == (char *)NULL) || (len == 0)) return(SA_ERR_HPI_INVALID_PARAMS); i = find_attr(&(rpt->Attrutes), attr_name); if (i < 0) return(SA_ERR_HPI_INVALID_PARAMS); ret = get_value_as_string(&(rpt->Attrutes), i, val, len); return(ret); } SaErrorT get_rpt_attr(Rpt_t *rpt, char *attr_name, union_type_t *val) { int i; if ((attr_name == (char *)NULL) || (val == (union_type_t *)NULL)) return(SA_ERR_HPI_INVALID_PARAMS); i = find_attr(&(rpt->Attrutes), attr_name); if (i < 0) return(SA_ERR_HPI_INVALID_PARAMS); *val = rpt->Attrutes.Attrs[i].value; return(SA_OK); } SaErrorT get_value(Attributes_t *Attrs, int num, union_type_t *val) { int type; if ((num < 0) || (num >= Attrs->n_attrs) || (val == (union_type_t *)NULL)) return SA_ERR_HPI_INVALID_PARAMS; type = Attrs->Attrs[num].type; if ((type == STR_TYPE) || (type == STRUCT_TYPE) || (type == ARRAY_TYPE)) { if (Attrs->Attrs[num].value.s == (char *)NULL) return(-1); }; *val = Attrs->Attrs[num].value; return(SA_OK); } SaErrorT find_rdr_by_num(SaHpiSessionIdT sessionid, SaHpiResourceIdT resourceid, SaHpiInstrumentIdT num, SaHpiRdrTypeT type, int as, SaHpiRdrT *retrdr) //as : 0 - get rdr by num // 1 - get first rdr { SaHpiRdrT rdr; SaErrorT rv; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiInstrumentIdT rdrnum; entryid = SAHPI_FIRST_ENTRY; while (entryid !=SAHPI_LAST_ENTRY) { rv = saHpiRdrGet(sessionid, resourceid, entryid, &nextentryid, &rdr); if (rv != SA_OK) return(-1); if ((type != SAHPI_NO_RECORD) && (rdr.RdrType != type)) continue; switch (rdr.RdrType) { case SAHPI_CTRL_RDR: rdrnum = rdr.RdrTypeUnion.CtrlRec.Num; break; case SAHPI_SENSOR_RDR: rdrnum = rdr.RdrTypeUnion.SensorRec.Num; break; case SAHPI_INVENTORY_RDR: rdrnum = rdr.RdrTypeUnion.InventoryRec.IdrId; break; case SAHPI_WATCHDOG_RDR: rdrnum = rdr.RdrTypeUnion.WatchdogRec.WatchdogNum; break; case SAHPI_ANNUNCIATOR_RDR: rdrnum = rdr.RdrTypeUnion.AnnunciatorRec.AnnunciatorNum; break; case SAHPI_DIMI_RDR: rdrnum = rdr.RdrTypeUnion.DimiRec.DimiNum; break; case SAHPI_FUMI_RDR: rdrnum = rdr.RdrTypeUnion.FumiRec.Num; break; default: entryid = nextentryid; continue; }; if ((rdrnum == num) || as) { *retrdr = rdr; return(SA_OK); }; entryid = nextentryid; }; return(-1); } char *hex_codes = "0123456789ABCDEF"; Pr_ret_t print_text_buffer_type(char *mes, SaHpiTextBufferT *buf, char *meslast, hpi_ui_print_cb_t proc) { char *str = ""; if (mes != (char *)NULL) { if (proc(mes) == HPI_UI_END) return(HPI_UI_END); }; switch (buf->DataType) { case SAHPI_TL_TYPE_UNICODE: str = "UNICODE"; break; case SAHPI_TL_TYPE_BCDPLUS: str = "BCDPLUS"; break; case SAHPI_TL_TYPE_ASCII6: str = "ASCII6"; break; case SAHPI_TL_TYPE_TEXT: str = "TEXT"; break; case SAHPI_TL_TYPE_BINARY: str = "BIN"; break; }; if (proc(str) == HPI_UI_END) return(HPI_UI_END); if (meslast != (char *)NULL) { if (proc(meslast) == HPI_UI_END) return(HPI_UI_END); }; return(0); } void get_text_buffer_text(char *mes, const SaHpiTextBufferT *buf, char *meslast, char *outbuf) { int i, c, tmp_ind, len; char *tmp; *outbuf = 0; if (mes != (char *)NULL) strcpy(outbuf,mes); if ((buf->DataLength == 0) && (buf->DataType != SAHPI_TL_TYPE_BINARY)) { if (meslast != (char *)NULL) strcat(outbuf, meslast); return; }; switch (buf->DataType) { case SAHPI_TL_TYPE_UNICODE: strcat(outbuf, "UNICODE does not implement"); break; case SAHPI_TL_TYPE_BCDPLUS: case SAHPI_TL_TYPE_ASCII6: case SAHPI_TL_TYPE_TEXT: strncat(outbuf, (const char *)(buf->Data), buf->DataLength); break; case SAHPI_TL_TYPE_BINARY: len = buf->DataLength * 2 + 1; tmp = malloc(len); memset(tmp, 0, len); tmp_ind = 0; memset(tmp, 0, len); for (i = 0; i < buf->DataLength; i++) { c = (buf->Data[i] & 0xF0) >> 4; tmp[tmp_ind++] = hex_codes[c]; c = buf->Data[i] & 0x0F; tmp[tmp_ind++] = hex_codes[c]; }; strcat(outbuf, tmp); free(tmp); break; }; if (meslast != (char *)NULL) strcat(outbuf, meslast); return; } Pr_ret_t print_text_buffer_text(char *mes, const SaHpiTextBufferT *buf, char *meslast, hpi_ui_print_cb_t proc) { char outbuf[SHOW_BUF_SZ]; get_text_buffer_text(mes, buf, meslast, outbuf); return(proc(outbuf)); } Pr_ret_t print_text_buffer_lang(char *mes, SaHpiTextBufferT *buf, char *meslast, hpi_ui_print_cb_t proc) { char *str; if ((buf->DataType == SAHPI_TL_TYPE_UNICODE) || (buf->DataType == SAHPI_TL_TYPE_TEXT)) { str = oh_lookup_language(buf->Language); if (str == (char *)NULL) return(HPI_UI_OK); if (strlen(str) == 0) return(HPI_UI_OK); if (mes != (char *)NULL) { if (proc(mes) == HPI_UI_END) return(HPI_UI_END); }; if (proc(str) != 0) return(1); if (meslast != (char *)NULL) { if (proc(meslast) == HPI_UI_END) return(HPI_UI_END); } }; return(HPI_UI_OK); } Pr_ret_t print_text_buffer_length(char *mes, SaHpiTextBufferT *buf, char *meslast, hpi_ui_print_cb_t proc) { char len_buf[32]; if (mes != (char *)NULL) { if (proc(mes) == HPI_UI_END) return(HPI_UI_END); }; snprintf(len_buf, 31, "%d", buf->DataLength); if (proc(len_buf) == HPI_UI_END) return(HPI_UI_END); if (meslast != (char *)NULL) { if (proc(meslast) == HPI_UI_END) return(HPI_UI_END); }; return(HPI_UI_OK); } Pr_ret_t print_text_buffer(char *mes, SaHpiTextBufferT *buf, char *meslast, hpi_ui_print_cb_t proc) { if (mes != (char *)NULL) { if (proc(mes) == HPI_UI_END) return(HPI_UI_END); }; if ((buf->DataLength > 0) || (buf->DataType == SAHPI_TL_TYPE_BINARY)) { if (print_text_buffer_type(NULL, buf, ": ", proc) != HPI_UI_OK) return(HPI_UI_END); if (print_text_buffer_lang(NULL, buf, ": ", proc) != HPI_UI_OK) return(HPI_UI_END); if (print_text_buffer_text(NULL, buf, NULL, proc) != HPI_UI_OK) return(HPI_UI_END); if (print_text_buffer_length(" (len=", buf, ")", proc) != HPI_UI_OK) return(HPI_UI_END); } if (meslast != (char *)NULL) { if (proc(meslast) == HPI_UI_END) return(HPI_UI_END); }; return(HPI_UI_OK); } openhpi-3.6.1/hpi_shell/cmdparser.c0000644000175100017510000003623012575647264016274 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Hu Yin * Changes: * 11.30.2004 - Kouzmich: porting to HPI-B * * */ #include #include #include #include #ifdef _WIN32 #include #include #else #include #include #endif #if defined(__sun) && defined(__SVR4) #include #endif #include "hpi_cmd.h" #define MAX_IN_FILES 10 #define MAX_REDIRECTIONS 10 term_def_t *terms; int read_stdin = 1; int read_file = 0; com_enum_t block_type = MAIN_COM; FILE *input_file = (FILE *)NULL; ret_code_t shell_error = HPI_SHELL_OK; int in_files_count = 0; FILE *input_files[MAX_IN_FILES]; int out_files_count = 0; int output_files[MAX_REDIRECTIONS]; char Title[1024]; int is_more = 1; /* local variables */ static char input_buffer[READ_BUF_SIZE]; // command line buffer static char *input_buf_ptr = input_buffer; // current pointer in input_buffer static char cmd_line[LINE_BUF_SIZE]; // current command line static char new_cmd_line[LINE_BUF_SIZE]; // new command line static int max_term_count = 0; static int term_count = 0; static int current_term = 0; static int window_nrows = 24; static int window_ncols = 80; static int current_row = 0; static int set_redirection(char *name, int redir) { char *flags; FILE *out; if (out_files_count >= MAX_REDIRECTIONS) { printf("Too many redirections\n"); return(-1); }; if (redir == 1) flags = "w"; else flags = "a"; out = fopen(name, flags); if (out == (FILE *)NULL) { printf("Can not open/create file: %s\n", name); return(-1); }; #ifdef _WIN32 output_files[out_files_count] = _dup(1); #else output_files[out_files_count] = dup(STDOUT_FILENO); #endif fflush(stdout); #ifdef _WIN32 _dup2(_fileno(out), 1); #else dup2(fileno(out), STDOUT_FILENO); #endif fclose(out); out_files_count++; return(0); } static void remove_reditection(void) { if (out_files_count == 0) return; out_files_count--; fflush(stdout); #ifdef _WIN32 _dup2(output_files[out_files_count], 1); _close(output_files[out_files_count]); #else dup2(output_files[out_files_count], STDOUT_FILENO); close(output_files[out_files_count]); #endif } static int delete_input_file(void) { FILE *f; if (in_files_count < 1) return(-1); in_files_count--; f = input_files[in_files_count]; fclose(f); if (in_files_count == 0) return(-1); input_file = input_files[in_files_count - 1]; return(0); } static void new_command(void) { term_count = 0; current_row = 0; current_term = 0; *cmd_line = 0; } static void go_to_dialog(void) { if (read_stdin) return; if (delete_input_file() == 0) return; read_stdin = 1; read_file = 0; new_command(); } static void add_term(char *term, term_t type) { term_def_t *tmp_terms; if (term_count >= max_term_count) { max_term_count += 5; tmp_terms = (term_def_t *)malloc(max_term_count * sizeof(term_def_t)); memset(tmp_terms, 0, max_term_count * sizeof(term_def_t)); if (term_count > 0) { memcpy(tmp_terms, terms, term_count * sizeof(term_def_t)); free(terms); }; terms = tmp_terms; }; tmp_terms = terms + term_count; tmp_terms->term_type = type; tmp_terms->term = term; if (debug_flag) printf("add_term: term = %s type = %d\n", term, type); term_count++; } static char *find_cmd_end(char *str) { while (*str != 0) { if (*str == '\"') { str++; while ((*str != 0) && (*str != '\"')) str++; if (*str == 0) return(str); }; if (*str == ';') return(str + 1); str++; }; return(str); } static char *get_input_line(char *mes, int new_cmd) { FILE *f = stdin; char *res; int len; if (strlen(input_buf_ptr) > 0) { res = input_buf_ptr; input_buf_ptr = find_cmd_end(input_buf_ptr); return(res); }; input_buf_ptr = input_buffer; fflush(stdout); memset(input_buffer, 0, READ_BUF_SIZE); current_row = 0; if (read_stdin) { if (mes != (char *)NULL) snprintf(Title, READ_BUF_SIZE, "%s", mes); else strcpy(Title, "hpi_shell> "); printf("%s", Title); res = get_command_line(new_cmd, COMPL_CMD); if (res != (char *)NULL) { strcpy(input_buffer, res); res = input_buffer; } } else if (read_file) { f = input_file; res = fgets(input_buffer, READ_BUF_SIZE - 1, f); } else { printf("Internal error: get_input_line:\n" " No input file\n"); exit(1); }; if (res != (char *)NULL) { len = strlen(res); if ((len > 0) && (res[len - 1] == '\n')) res[len - 1] = 0; input_buf_ptr = find_cmd_end(input_buf_ptr); }; return(res); } static command_def_t *get_cmd(char *name) { const char *p; command_def_t *c, *res = (command_def_t *)NULL; int len = strlen(name); int n = 0; for (c = commands; (p = c->cmd) != NULL; c++) { if ((c->type != MAIN_COM) && (c->type != block_type) && (c->type != UNDEF_COM)) continue; if (strncmp(p, name, len) == 0) { if (n == 0) res = c; n++; }; if (strcmp(p, name) == 0) { return(c); } }; if (n == 1) return(res); return((command_def_t *)NULL); } static void add_to_cmd_line(char *str) { int len; len = strlen(cmd_line); if (len == 0) strcpy(cmd_line, str); else snprintf(cmd_line + len, LINE_BUF_SIZE - len, " %s", str); } static int check_cmd_for_redirect(void) { int i, redirect = 0; for (i = 0; i < term_count; i++) { if (terms[i].term_type == CMD_ERROR_TERM) return(HPI_SHELL_SYNTAX_ERROR); if (terms[i].term_type == CMD_REDIR_TERM) { if (redirect != 0) return(HPI_SHELL_SYNTAX_ERROR); if (strcmp(">>", terms[i].term) == 0) redirect = 2; else redirect = 1; } }; return(redirect); } ret_code_t cmd_parser(char *mes, int as, int new_cmd, int *redirect) // as = 0 - get command // as = 1 - may be exit with empty command // new_cmd = 1 - new command // new_cmd = 0 - get added items // returned redirect value (for new_cmd = 1): // 0 - no redirect output // 1 - redirect to the empty file // 2 - add output to the existent file { char *cmd, *str, *beg, *tmp; term_t type; int i; char new_line[LINE_BUF_SIZE]; *redirect = 0; for (;;) { if (new_cmd) { new_command(); type = CMD_TERM; } else type = ITEM_TERM; cmd = get_input_line(mes, new_cmd); if (cmd == (char *)NULL) { go_to_dialog(); continue; }; strcpy(new_cmd_line, cmd); str = new_cmd_line; while (isspace(*str)) str++; if (strlen(str) == 0) { if (as) return HPI_SHELL_OK; continue; }; beg = str; if (*beg == '#') continue; while (*str != 0) { if (isspace(*str)) { *str++ = 0; if (strlen(beg) > 0) { add_term(beg, type); type = ITEM_TERM; }; while (isspace(*str)) str++; add_to_cmd_line(beg); beg = str; continue; }; if (*str == '\"') { str++; while ((*str != 0) && (*str != '\"')) str ++; if (*str == 0) { add_to_cmd_line(beg); add_term(beg, type); if (read_file) add_term(";", CMD_ERROR_TERM); break; }; if (*beg == '\"') { beg++; *str = 0; add_term(beg, type); type = ITEM_TERM; add_to_cmd_line(beg); beg = str + 1; }; str++; continue; }; if (*str == '>') { *str++ = 0; if (strlen(beg) > 0) { add_to_cmd_line(beg); add_term(beg, type); }; if (*str == '>') { add_to_cmd_line(">>"); add_term(">>", CMD_REDIR_TERM); str++; } else { add_to_cmd_line(">"); add_term(">", CMD_REDIR_TERM); }; type = ITEM_TERM; beg = str; continue; }; if ((*str == '!') && read_stdin) { if (str[1] == '!') { i = 2; tmp = get_last_history(); } else { i = 1; tmp = get_def_history(str + 1, &i); }; if (tmp == (char *)NULL) { str += i; continue; }; *str = 0; str += i; snprintf(new_line, LINE_BUF_SIZE, "%s%s%s", beg, tmp, str); str = new_cmd_line + strlen(beg); strcpy(new_cmd_line, new_line); beg = new_cmd_line; continue; }; if (*str == ';') { *str++ = 0; add_to_cmd_line(beg); break; }; str++; }; if (strlen(beg) > 0) { add_to_cmd_line(beg); add_term(beg, type); }; if (read_file) add_term(";", CMD_END_TERM); if (read_stdin) set_current_history(cmd_line); if (new_cmd == 0) return(HPI_SHELL_OK); *redirect = check_cmd_for_redirect(); return(HPI_SHELL_OK); } } int run_command(void) // returned: -1 - command not found // 0 - command found and ran // 1 - no command // 2 - other block command (do not run command) // 3 - get new command { term_def_t *term; command_def_t *c; ret_code_t rv; if (debug_flag) printf("run_command:\n"); term = get_next_term(); if (term == NULL) return(1); if (term->term_type != CMD_TERM) return(1); c = get_cmd(term->term); if (c == (command_def_t *)NULL) { printf("Invalid command:\n%s\n", cmd_line); go_to_dialog(); help(0); shell_error = HPI_SHELL_CMD_ERROR; return(-1); }; if (c->fun) { if (debug_flag) printf("run_command: c->type = %d\n", c->type); term->term = c->cmd; if ((block_type != c->type) && (c->type != UNDEF_COM)) { block_type = c->type; if (debug_flag) printf("run_command: ret = 2\n"); return(2); }; rv = c->fun(); if (rv == HPI_SHELL_PARM_ERROR) { printf("Invalid parameters:\n%s\n", cmd_line); printf("%s\n", c->help); go_to_dialog(); shell_error = HPI_SHELL_PARM_ERROR; return(3); } else if (rv == HPI_SHELL_CMD_ERROR) { printf("Command failed:\n%s\n", cmd_line); go_to_dialog(); return(3); }; shell_error = rv; } else { printf("Unimplemented command:\n%s\n", cmd_line); go_to_dialog(); shell_error = HPI_SHELL_CMD_ERROR; return(3); }; return(0); } int get_new_command(char *mes) { int redir = 0, i, res; char *name; term_def_t *term; if (debug_flag) printf("get_new_command:\n"); term = get_next_term(); if ((term == NULL) || (term->term_type != CMD_TERM)) cmd_parser(mes, 0, 1, &redir); else { unget_term(); redir = check_cmd_for_redirect(); }; if (redir != 0) { for (i = 0; i < term_count; i++) { if (terms[i].term_type == CMD_REDIR_TERM) break; }; if (i >= term_count - 1) { printf("Syntax error:\n%s\n", cmd_line); go_to_dialog(); return(3); }; if (terms[i + 1].term_type != ITEM_TERM) { printf("Syntax error:\n%s\n", cmd_line); go_to_dialog(); return(3); }; name = terms[i + 1].term; res = set_redirection(name, redir); if (res != 0) { printf("Command failed:\n%s\n", cmd_line); go_to_dialog(); return(3); }; res = run_command(); remove_reditection(); return(res); }; res = run_command(); return(res); } void cmd_shell(void) { *Title = 0; init_history(); help(0); domain_proc(); for (;;) { if (debug_flag) printf("cmd_shell:\n"); shell_error = HPI_SHELL_OK; get_new_command((char *)NULL); if ((shell_error != HPI_SHELL_OK) && read_file) { go_to_dialog(); } } } int get_int_param(char *mes, int *val) { int res, redir; char *str; term_def_t *term; term = get_next_term(); if (term == NULL) { cmd_parser(mes, 1, 0, &redir); term = get_next_term(); }; if (term == NULL) { go_to_dialog(); return(HPI_SHELL_CMD_ERROR); }; str = term->term; if (isdigit(*str) || *str == '-' ) { res = sscanf(str, "%d", val); return(res); }; return(0); } int get_hex_int_param(char *mes, int *val) { char *str, buf[32]; int redir; term_def_t *term; term = get_next_term(); if (term == NULL) { cmd_parser(mes, 1, 0, &redir); term = get_next_term(); }; if (term == NULL) { go_to_dialog(); return(HPI_SHELL_CMD_ERROR); }; str = term->term; if (strncmp(str, "0x", 2) == 0) snprintf(buf, 31, "%s", str); else snprintf(buf, 31, "0x%s", str); *val = strtol(buf, (char **)NULL, 16); return(1); } int get_hex_string_param(char *mes, char *res, int max_length) { char *str, buf[32]; int redir, i, val; term_def_t *term; for (i = 0; i < max_length; i++) { term = get_next_term(); if (term == NULL) { cmd_parser(mes, 1, 0, &redir); term = get_next_term(); }; if (term == NULL) return(i); str = term->term; if (strncmp(str, "0x", 2) == 0) snprintf(buf, 31, "%s", str); else snprintf(buf, 31, "0x%s", str); val = strtol(buf, (char **)NULL, 16); res[i] = val; }; return(i); } int get_string_param(char *mes, char *val, int len) { term_def_t *term; int i; term = get_next_term(); if (term == NULL) { cmd_parser(mes, 1, 0, &i); term = get_next_term(); }; if (term == NULL) { return(HPI_SHELL_CMD_ERROR); }; memset(val, 0, len); strncpy(val, term->term, len); for (i = 0; i < len; i++) if (val[i] == '\n') val[i] = 0; return(0); } term_def_t *get_next_term(void) { term_def_t *res; for (;;) { if (current_term >= term_count){ if (debug_flag) printf("get_next_term: term = (NULL)\n"); return((term_def_t *)NULL); }; res = terms + current_term; if (read_file && (res->term_type == CMD_END_TERM)) return((term_def_t *)NULL); current_term++; if (res->term_type != EMPTY_TERM) break; }; if (debug_flag) printf("get_next_term: term = %s\n", res->term); return(res); } ret_code_t unget_term(void) { if (debug_flag) printf("unget_term:\n"); if (current_term > 0) current_term--; return (current_term); } int add_input_file(char *path) { int i; FILE *f; if (in_files_count >= MAX_IN_FILES) return(-1); i = access(path, R_OK | F_OK); if (i != 0) { printf("Can not access file: %s\n", path); return(HPI_SHELL_PARM_ERROR); }; f = fopen(path, "r"); if (f == (FILE *)NULL) { printf("Can not open file: %s\n", path); return(HPI_SHELL_PARM_ERROR); }; input_files[in_files_count] = f; in_files_count++; input_file = f; return(0); } static void get_term_size( int * rows, int * cols ) { *rows = 24; *cols = 80; #ifdef _WIN32 COORD ws = GetLargestConsoleWindowSize(GetStdHandle(STD_OUTPUT_HANDLE)); if ((ws.Y != 0) && (ws.X != 0)) { *rows = ws.Y; *cols = ws.X; } #else struct winsize ws; int cc = ioctl(termfd, TIOCGWINSZ, &ws); if ((cc == 0) && (ws.ws_row != 0) && (ws.ws_col != 0)) { *rows = ws.ws_row; *cols = ws.ws_col; } #endif } Pr_ret_t ui_print(char *Str) { int i, len, c, add_nl = 1; char *tmp, *s; char buf[LINE_BUF_SIZE]; const char green[] = "\033[0;40;32m"; // const char yellow[] = "\033[0;40;33m"; const char reset[] = "\033[0m"; get_term_size(&window_nrows, &window_ncols); strncpy(buf, Str, LINE_BUF_SIZE); s = tmp = buf; for (i = 0, len = 0; *tmp != 0; i++, tmp++) { c = *tmp; switch (c) { case '\b': continue; case '\n': *tmp = 0; printf("%s\n", s); current_row += add_nl; if ((current_row >= (window_nrows - 1)) && is_more) { printf("%s - more - %s", green, reset); i = getchar(); printf("\r \r"); current_row = 0; if (i == 'q') return(HPI_UI_END); }; s = tmp + 1; len = 0; add_nl = 1; break; case '\r': len = 0; continue; case '\t': len += 8; len = (len / 8) * 8; break; default : len++; break; }; if (len >= window_ncols) { add_nl++; len = 0; } }; if (*s != 0) printf("%s", s); return(HPI_UI_OK); } openhpi-3.6.1/hpi_shell/hpi_cmd.h0000644000175100017510000001354612575647264015731 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Changes: * 11.30.2004 - Kouzmich: porting to HPI-B * * */ #ifndef _INC_HPI_CMD_H #define _INC_HPI_CMD_H #include #include #include "hpi_ui.h" #define KUZ_DEBUG0 #define READ_BUF_SIZE 1024 #define LINE_BUF_SIZE 4096 #define COMPL_NULL 0 #define COMPL_CMD 1 typedef enum { HPI_SHELL_OK = 0, HPI_SHELL_CMD_ERROR = -1, HPI_SHELL_PARM_ERROR = -2, HPI_SHELL_SYNTAX_ERROR = -3 } ret_code_t; typedef enum { UNDEF_COM, MAIN_COM, SEN_COM, ANN_COM, CTRL_COM, INV_COM, HS_COM, DIMI_COM, FUMI_COM, } com_enum_t; typedef struct { char *cmd; ret_code_t (*fun)(void); const char *help; com_enum_t type; } command_def_t; typedef enum { CMD_TERM, ITEM_TERM, CMD_END_TERM, CMD_REDIR_TERM, CMD_ERROR_TERM, EMPTY_TERM } term_t; typedef struct { term_t term_type; char *term; } term_def_t; extern command_def_t commands[]; extern int prt_flag; extern int show_event_short; extern Domain_t *Domain; extern GSList *domainlist; extern term_def_t *terms; extern int read_stdin; extern int read_file; extern FILE *input_file; extern com_enum_t block_type; extern ret_code_t shell_error; extern int debug_flag; extern char Title[]; extern int termfd; extern int is_more; extern int add_domain(Domain_t *domain); extern int add_input_file(char *name); extern ret_code_t ann_block(void); extern ret_code_t ann_block_acknow(void); extern ret_code_t ann_block_add(void); extern ret_code_t ann_block_delete(void); extern ret_code_t ann_block_list(void); extern ret_code_t ann_block_modeget(void); extern ret_code_t ann_block_modeset(void); extern ret_code_t ann_block_show(void); extern ret_code_t ask_entity(SaHpiEntityPathT *ret); extern ret_code_t ask_rdr(SaHpiResourceIdT rptid, SaHpiRdrTypeT type, SaHpiInstrumentIdT *ret); extern ret_code_t ask_rpt(SaHpiResourceIdT *ret); extern int close_session(void); extern ret_code_t cmd_parser(char *mes, int as, int new_cmd, int *redirect); extern void cmd_shell(void); extern ret_code_t ctrl_block(void); extern ret_code_t ctrl_block_setst(void); extern ret_code_t ctrl_block_show(void); extern ret_code_t ctrl_block_state(void); extern void delete_progress(void); extern void do_progress(char *mes); extern ret_code_t domain_proc(void); extern char *get_command_line(int new_cmd, int type); extern char *get_def_history(char *text, int *count); extern int get_hex_int_param(char *mes, int *val); extern int get_hex_string_param(char *mes, char *val, int max_length); extern int get_int_param(char *mes, int *val); extern char *get_last_history(void); extern int get_new_command(char *mes); extern int get_string_param(char *mes, char *string, int len); extern term_def_t *get_next_term(void); extern void help(int as); extern ret_code_t history_cmd(void); extern ret_code_t hs_block(void); extern ret_code_t hs_block_action(void); extern ret_code_t hs_block_active(void); extern ret_code_t hs_block_gtime(void); extern ret_code_t hs_block_inact(void); extern ret_code_t hs_block_ind(void); extern ret_code_t hs_block_policy(void); extern ret_code_t hs_block_state(void); extern ret_code_t hs_block_stime(void); extern void init_history(void); extern ret_code_t inv_block(void); extern ret_code_t inv_block_show(void); extern ret_code_t inv_block_addarea(void); extern ret_code_t inv_block_addfield(void); extern ret_code_t inv_block_delarea(void); extern ret_code_t inv_block_delfield(void); extern ret_code_t inv_block_setfield(void); extern ret_code_t list_sensor(void); extern ret_code_t open_file(char *path); extern int open_session(SaHpiDomainIdT domainId, int eflag); extern void restore_term_flags(void); extern int run_command(void); extern ret_code_t sen_block(void); extern ret_code_t sen_block_disable(void); extern ret_code_t sen_block_enable(void); extern ret_code_t sen_block_evtdis(void); extern ret_code_t sen_block_evtenb(void); extern ret_code_t sen_block_maskadd(void); extern ret_code_t sen_block_maskrm(void); extern ret_code_t sen_block_setthres(void); extern ret_code_t sen_block_show(void); extern void set_current_history(char *line); extern void set_Subscribe(Domain_t *domain, int as); extern int set_text_buffer(SaHpiTextBufferT *buf); extern ret_code_t show_inv(void); extern ret_code_t dimi_block(void); extern ret_code_t dimi_block_info(void); extern ret_code_t dimi_block_testinfo(void); extern ret_code_t dimi_block_ready(void); extern ret_code_t dimi_block_start(void); extern ret_code_t dimi_block_cancel(void); extern ret_code_t dimi_block_status(void); extern ret_code_t dimi_block_results(void); extern ret_code_t fumi_block(void); extern ret_code_t fumi_block_specinfo(void); extern ret_code_t fumi_block_serviceimpact(void); extern ret_code_t fumi_block_setsource(void); extern ret_code_t fumi_block_validatesource(void); extern ret_code_t fumi_block_sourceinfo(void); extern ret_code_t fumi_block_targetinfo(void); extern ret_code_t fumi_block_backup(void); extern ret_code_t fumi_block_setbootorder(void); extern ret_code_t fumi_block_bankcopy(void); extern ret_code_t fumi_block_install(void); extern ret_code_t fumi_block_status(void); extern ret_code_t fumi_block_verify(void); extern ret_code_t fumi_block_verifymain(void); extern ret_code_t fumi_block_cancel(void); extern ret_code_t fumi_block_disableautorollback(void); extern ret_code_t fumi_block_rollback(void); extern ret_code_t fumi_block_activate(void); extern ret_code_t fumi_block_cleanup(void); extern int ui_print(char *Str); extern ret_code_t unget_term(void); #endif openhpi-3.6.1/hpi_shell/commands.c0000644000175100017510000022076412575647264016124 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Hu Yin * Racing Guo * Changes: * 11.30.2004 - Kouzmich < Mikhail.V.Kouzmich@intel.com >: * porting to HPI-B * 09.07.2005 - Renier Morales : * Changes due to move of oh_add_config_file to config.c * * */ #include #include #include #include #include #include #include #include #include "hpi_ui.h" #include "hpi_cmd.h" #define SEV_BUF_SIZE 32 typedef struct { char *name; SaHpiSeverityT val; } Sev_def_t; static Sev_def_t Sev_array[] = { {"crit", SAHPI_CRITICAL}, {"maj", SAHPI_MAJOR}, {"min", SAHPI_MINOR}, {"inf", SAHPI_INFORMATIONAL}, {"ok", SAHPI_OK}, {"debug", SAHPI_DEBUG}, {"all", SAHPI_ALL_SEVERITIES}, {NULL, 0} }; void help(int as) // as = 0 - Available commands // as = 1 - help command { command_def_t *cmd = NULL, *res = (command_def_t *)NULL; int len; term_def_t *term; if ((as == 0) || ((term = get_next_term()) == NULL)) { int width = 0; printf("Available commands are: \n\n"); for (cmd = commands; cmd->cmd != NULL; cmd++) { if ((cmd->type != MAIN_COM) && (cmd->type != block_type) && (cmd->type != UNDEF_COM)) continue; printf("%-19s", cmd->cmd); if ((++width % 4) == 0) printf("\n"); } printf("\n"); return; } for (;;) { register char *arg; int n; arg = term->term; len = strlen(arg); n = 0; for (cmd = commands; cmd->cmd != NULL; cmd++) { if ((cmd->type != MAIN_COM) && (cmd->type != block_type) && (cmd->type != UNDEF_COM)) continue; if (strncmp(cmd->cmd, arg, len) == 0) { if (n == 0) res = cmd; n++; }; if (strcmp(cmd->cmd, arg) == 0) { res = cmd; n = 1; break; } } if (n != 1) printf("Invalid help command %s\n", arg); else printf("%s\n", res->help); term = get_next_term(); if (term == NULL) break; } } static ret_code_t help_cmd(void) { help(1); return(HPI_SHELL_OK); } static ret_code_t add_config(void) { #if 0 // This code needs to call oHpi APIs instead of internal functions SaErrorT rv; term_def_t *term; struct oh_parsed_config config = {NULL, NULL, 0, 0, 0, 0}; term = get_next_term(); if (term == NULL) { printf("no config file\n"); return HPI_SHELL_CMD_ERROR; } rv = oh_load_config(term->term, &config); if (rv == SA_ERR_HPI_BUSY) { printf("Hold on. Another configuration changing is" " processing\n"); } if (rv == SA_ERR_HPI_NOT_PRESENT) { printf("Hold on. Initialization is processing\n"); } if (rv != SA_OK) return HPI_SHELL_CMD_ERROR; rv = oh_process_config(&config); oh_clean_config(&config); if (rv == SA_OK) return HPI_SHELL_OK; #endif return HPI_SHELL_CMD_ERROR; } static ret_code_t event(void) { term_def_t *term; term = get_next_term(); if (term == NULL) { printf("Event display: %s\n", prt_flag?"Enable":"Disable"); return(HPI_SHELL_OK); }; if (strcmp(term->term, "enable") == 0) { prt_flag = 1; printf("Event display enable successfully\n"); } else if (strcmp(term->term, "disable") == 0) { prt_flag = 0; printf("Event display disable successfully\n"); } else if (strcmp(term->term, "short") == 0) { show_event_short = 1; prt_flag = 1; printf("Event short display enable successfully\n"); } else if (strcmp(term->term, "full") == 0) { show_event_short = 0; prt_flag = 1; printf("Event full display enable successfully\n"); } else { return HPI_SHELL_PARM_ERROR; }; set_Subscribe((Domain_t *)NULL, prt_flag); return HPI_SHELL_OK; } #ifdef _WIN32 static int setenv(const char * var, const char * val, int dummy) { static const size_t BUFSIZE = 1024; char buf[BUFSIZE]; snprintf(buf, BUFSIZE, "%s=%s", var, val); return _putenv(buf); } #endif static ret_code_t debugset(void) { char *val; term_def_t *term; if (debug_flag) printf("debugset:\n"); term = get_next_term(); if (term == NULL) { val = getenv("OPENHPI_ERROR"); if (val == (char *)NULL) val = "NO"; printf("OPENHPI_ERROR=%s\n", val); return(HPI_SHELL_OK); }; if (strcmp(term->term, "on") == 0) val = "YES"; else if (strcmp(term->term, "off") == 0) val = "NO"; else return HPI_SHELL_PARM_ERROR; setenv("OPENHPI_ERROR", val, 1); return HPI_SHELL_OK; } static ret_code_t moreset(void) { char *val; term_def_t *term; term = get_next_term(); if (term == NULL) { if (is_more) val = "ON"; else val = "OFF"; printf("more = %s\n", val); return(HPI_SHELL_OK); }; if (strcmp(term->term, "on") == 0) is_more = 1; else if (strcmp(term->term, "off") == 0) is_more = 0; else return HPI_SHELL_PARM_ERROR; return HPI_SHELL_OK; } static ret_code_t newdomain(void) { int i; char buf[SAHPI_MAX_TEXT_BUFFER_LENGTH + 1]; char * hostbegin = NULL; char * hostend = NULL; char * portbegin = NULL; char * p; SaHpiUint16T port; SaHpiTextBufferT host; SaHpiEntityPathT entity_root; SaHpiDomainIdT did; SaErrorT rv; i = get_string_param("Host[:Port]: ", buf, SAHPI_MAX_TEXT_BUFFER_LENGTH); if (i != 0) { return HPI_SHELL_PARM_ERROR; } if (buf[0] == '[') { hostbegin = &buf[1]; hostend = strchr(hostbegin, ']'); if (hostend == NULL) { return HPI_SHELL_PARM_ERROR; } } else { hostbegin = &buf[0]; hostend = strchr(hostbegin, ':'); } if (hostend) { portbegin = strchr(hostend, ':' ); if (portbegin) { ++portbegin; } *hostend = '\0'; } host.DataType = SAHPI_TL_TYPE_TEXT; host.Language = SAHPI_LANG_ENGLISH; host.DataLength = strlen(hostbegin); memcpy(&host.Data[0], hostbegin, host.DataLength ); host.Data[host.DataLength] = '\0'; if (portbegin) { if (isdigit(*portbegin) == 0) { return HPI_SHELL_PARM_ERROR; } port = (SaHpiUint16T)atoi(portbegin); } else { port = OPENHPI_DEFAULT_DAEMON_PORT; } oh_init_ep(&entity_root); i = get_string_param("Domain Id: ", buf, SAHPI_MAX_TEXT_BUFFER_LENGTH); if (i == 0) { p = &buf[0]; if (isdigit(*p) == 0) { return HPI_SHELL_PARM_ERROR; } did = (SaHpiDomainIdT)atoi(p); rv = oHpiDomainAddById(did, &host, port, &entity_root); if (rv != SA_OK) { printf("oHpiDomainAddById error %s\n", oh_lookup_error(rv)); return HPI_SHELL_CMD_ERROR; } } else { rv = oHpiDomainAdd(&host, port, &entity_root, &did); if (rv != SA_OK) { printf("oHpiDomainAdd error %s\n", oh_lookup_error(rv)); return HPI_SHELL_CMD_ERROR; } } printf("Created new domain %u (host %s port %u)\n", did, (const char*)(&host.Data[0]), port); return HPI_SHELL_OK; } static ret_code_t power(void) { SaErrorT rv; SaHpiResourceIdT resourceid; SaHpiPowerStateT state; int do_set = 1; term_def_t *term; ret_code_t ret; ret = ask_rpt(&resourceid); if (ret != HPI_SHELL_OK) return(ret); term = get_next_term(); if (term == NULL) do_set = 0; else if (!strcmp(term->term, "on")) { state = SAHPI_POWER_ON; } else if (!strcmp(term->term, "off")) { state = SAHPI_POWER_OFF; } else if (!strcmp(term->term, "cycle")) { state = SAHPI_POWER_CYCLE; } else { return HPI_SHELL_PARM_ERROR; } if (do_set) { rv = saHpiResourcePowerStateSet(Domain->sessionId, resourceid, state); if (rv != SA_OK) { printf("saHpiResourcePowerStateSet error %s\n", oh_lookup_error(rv)); return HPI_SHELL_CMD_ERROR; }; return HPI_SHELL_OK; } rv = saHpiResourcePowerStateGet(Domain->sessionId, resourceid, &state); if (rv != SA_OK) { printf("saHpiResourcePowerStateGet error %s\n", oh_lookup_error(rv)); return HPI_SHELL_CMD_ERROR; } if (state == SAHPI_POWER_ON) { printf("Resource %d is power on now.\n",resourceid); } else if (state == SAHPI_POWER_OFF) { printf("Resource %d is power off now.\n",resourceid); } return HPI_SHELL_OK; } static ret_code_t reset(void) { SaErrorT rv; SaHpiResourceIdT resourceid; SaHpiResetActionT state; int do_set = 1; term_def_t *term; ret_code_t ret; ret = ask_rpt(&resourceid); if (ret != HPI_SHELL_OK) return(ret); term = get_next_term(); if (term == NULL) do_set = 0; else if (!strcmp(term->term, "cold")) { state = SAHPI_COLD_RESET; } else if (!strcmp(term->term, "warm")) { state = SAHPI_WARM_RESET; } else if (!strcmp(term->term, "assert")) { state = SAHPI_RESET_ASSERT; } else if (!strcmp(term->term, "deassert")) { state = SAHPI_RESET_DEASSERT; } else { return HPI_SHELL_PARM_ERROR; } if (do_set) { rv = saHpiResourceResetStateSet(Domain->sessionId, resourceid, state); if (rv != SA_OK) { printf("saHpiResourceResetStateSet error %s\n", oh_lookup_error(rv)); return HPI_SHELL_CMD_ERROR; } } rv = saHpiResourceResetStateGet(Domain->sessionId, resourceid, &state); if (rv != SA_OK) { printf("saHpiResourceResetStateGet error %s\n", oh_lookup_error(rv)); return HPI_SHELL_CMD_ERROR; } if (state == SAHPI_RESET_ASSERT) { printf("Entity's reset of %d is asserted now.\n",resourceid); } else if (state == SAHPI_RESET_DEASSERT) { printf("Entity's reset of %d is not asserted now.\n",resourceid); } else { printf("Entity's reset of %d is not setted now.\n",resourceid); } return HPI_SHELL_OK; } static ret_code_t remove_failed_resource(void) { SaErrorT rv; SaHpiResourceIdT resourceid; ret_code_t ret; ret = ask_rpt(&resourceid); if (ret != HPI_SHELL_OK) { return ret; } rv = saHpiResourceFailedRemove(Domain->sessionId, resourceid); if (rv != SA_OK) { printf("saHpiResourceFailedRemove error %s\n", oh_lookup_error(rv)); return HPI_SHELL_CMD_ERROR; } return HPI_SHELL_OK; } static ret_code_t clear_evtlog(void) { SaHpiResourceIdT resourceid; term_def_t *term; SaErrorT rv; term = get_next_term(); if (term == NULL) resourceid = SAHPI_UNSPECIFIED_RESOURCE_ID; else resourceid = (SaHpiResourceIdT)atoi(term->term); rv = saHpiEventLogClear(Domain->sessionId, resourceid); if (rv != SA_OK) { printf("EventLog clear, error = %s\n", oh_lookup_error(rv)); return HPI_SHELL_CMD_ERROR; } printf("EventLog successfully cleared\n"); return HPI_SHELL_OK; } static ret_code_t set_tag(void) { SaHpiResourceIdT resid = 0; SaHpiTextBufferT tbuf; int i; char buf[SAHPI_MAX_TEXT_BUFFER_LENGTH + 1]; SaErrorT rv; SaHpiRptEntryT rpt_entry; Rpt_t tmp_rpt; ret_code_t ret; ret = ask_rpt(&resid); if (ret != HPI_SHELL_OK) return(ret); i = get_string_param("New tag: ", buf, SAHPI_MAX_TEXT_BUFFER_LENGTH); if (i != 0) { printf("Invalid tag: %s\n", buf); return(HPI_SHELL_PARM_ERROR); }; strcpy((char *)(tbuf.Data), buf); tbuf.DataType = SAHPI_TL_TYPE_TEXT; tbuf.Language = SAHPI_LANG_ENGLISH; tbuf.DataLength = strlen(buf); rv = saHpiResourceTagSet(Domain->sessionId, resid, &tbuf); if (rv != SA_OK) { printf("saHpiResourceTagSet error = %s\n", oh_lookup_error(rv)); return HPI_SHELL_CMD_ERROR; }; rv = saHpiRptEntryGetByResourceId(Domain->sessionId, resid, &rpt_entry); make_attrs_rpt(&tmp_rpt, &rpt_entry); show_Rpt(&tmp_rpt, ui_print); free_attrs(&(tmp_rpt.Attrutes)); return (HPI_SHELL_OK); } static ret_code_t parmctrl(void) { SaHpiResourceIdT resid; int i; char buf[10]; SaErrorT rv; SaHpiParmActionT act; ret_code_t ret; ret = ask_rpt(&resid); if (ret != HPI_SHELL_OK) return(ret); i = get_string_param("Action (default,save,restore): ", buf, 9); if (i != 0) { printf("Invalid action: %s\n", buf); return(HPI_SHELL_PARM_ERROR); }; if (strcmp(buf, "default") == 0) act = SAHPI_DEFAULT_PARM; else if (strcmp(buf, "save") == 0) act = SAHPI_SAVE_PARM; else if (strcmp(buf, "restore") == 0) act = SAHPI_RESTORE_PARM; else { printf("Invalid action: %s\n", buf); return(HPI_SHELL_PARM_ERROR); }; rv = saHpiParmControl(Domain->sessionId, resid, act); if (rv != SA_OK) { printf("saHpiParmControl error = %s\n", oh_lookup_error(rv)); return HPI_SHELL_CMD_ERROR; }; return (HPI_SHELL_OK); } static ret_code_t set_sever(void) { SaHpiResourceIdT resid; SaHpiSeverityT sev = SAHPI_OK; int i; char buf[SEV_BUF_SIZE + 1]; SaErrorT rv; SaHpiRptEntryT rpt_entry; Rpt_t tmp_rpt; ret_code_t ret; ret = ask_rpt(&resid); if (ret != HPI_SHELL_OK) return(ret); i = get_string_param( "New severity (crit, maj, min, inf, ok, debug, all): ", buf, SEV_BUF_SIZE); if (i != 0) { printf("Invalid sevetity: %s\n", buf); return(HPI_SHELL_PARM_ERROR); }; for (i = 0; Sev_array[i].name != (char *)NULL; i++) if (strcmp(buf, Sev_array[i].name) == 0) { sev = Sev_array[i].val; break; }; if (Sev_array[i].name == (char *)NULL) { printf("Invalid sevetity type: %s\n", buf); return(HPI_SHELL_PARM_ERROR); }; rv = saHpiResourceSeveritySet(Domain->sessionId, resid, sev); if (rv != SA_OK) { printf("saHpiResourceSeveritySet error = %s\n", oh_lookup_error(rv)); return HPI_SHELL_CMD_ERROR; }; rv = saHpiRptEntryGetByResourceId(Domain->sessionId, resid, &rpt_entry); make_attrs_rpt(&tmp_rpt, &rpt_entry); show_Rpt(&tmp_rpt, ui_print); free_attrs(&(tmp_rpt.Attrutes)); return (HPI_SHELL_OK); } static ret_code_t discovery(void) { SaErrorT ret; do_progress("Discover"); ret = saHpiDiscover(Domain->sessionId); if (SA_OK != ret) { printf("saHpiResourcesDiscover error = %s\n", oh_lookup_error(ret)); delete_progress(); return HPI_SHELL_CMD_ERROR; }; delete_progress(); return HPI_SHELL_OK; } static ret_code_t dat_list(void) { return show_dat(Domain, ui_print); } static ret_code_t listent(void) { SaHpiEntityPathT root; root.Entry[0].EntityType = SAHPI_ENT_ROOT; root.Entry[0].EntityLocation = 0; return ( show_entity_tree(Domain, &root, 0, ui_print) == SA_OK ) ? HPI_SHELL_OK : HPI_SHELL_CMD_ERROR; } static ret_code_t listres(void) { term_def_t *term; int mask = SHORT_LSRES; term = get_next_term(); while (term != NULL) { if (strcmp(term->term, "stat") == 0) mask |= STATE_LSRES; else if (strcmp(term->term, "path") == 0) mask |= PATH_LSRES; else { printf("Invalid argument: %s\n", term->term); return(HPI_SHELL_PARM_ERROR); }; term = get_next_term(); }; show_rpt_list(Domain, SHOW_ALL_RPT, 0, mask, ui_print); return(HPI_SHELL_OK); } static ret_code_t show_evtlog(void) { SaHpiResourceIdT rptid = 0; term_def_t *term; term = get_next_term(); if (term == NULL) rptid = SAHPI_UNSPECIFIED_RESOURCE_ID; else rptid = (SaHpiResourceIdT)atoi(term->term); return show_event_log(Domain->sessionId, rptid, show_event_short, ui_print); } static ret_code_t evtlog_time(void) { SaHpiResourceIdT rptid = 0; SaErrorT rv; SaHpiTimeT logtime; SaHpiTextBufferT buffer; term_def_t *term; term = get_next_term(); if (term == NULL) rptid = SAHPI_UNSPECIFIED_RESOURCE_ID; else rptid = (SaHpiResourceIdT)atoi(term->term); rv = saHpiEventLogTimeGet(Domain->sessionId, rptid, &logtime); if (rv != SA_OK) { printf("saHpiEventLogTimeGet %s\n", oh_lookup_error(rv)); return (HPI_SHELL_CMD_ERROR); } oh_decode_time(logtime, &buffer); printf ("Current event log time: %s\n", buffer.Data); return HPI_SHELL_OK; } static ret_code_t evtlog_state(void) { SaHpiResourceIdT rptid = 0; SaErrorT rv; SaHpiBoolT state = SAHPI_TRUE; int do_set = 0; char *str; term_def_t *term; rptid = SAHPI_UNSPECIFIED_RESOURCE_ID; term = get_next_term(); if ((term != NULL) && (isdigit(term->term[0]))) rptid = (SaHpiResourceIdT)atoi(term->term); term = get_next_term(); if (term != NULL) { do_set = 1; if (strcmp(term->term, "enable") == 0) state = SAHPI_TRUE; else if (strcmp(term->term, "disable") == 0) state = SAHPI_FALSE; else return(HPI_SHELL_PARM_ERROR); }; if (do_set) { rv = saHpiEventLogStateSet(Domain->sessionId, rptid, state); if (rv != SA_OK) { printf("saHpiEventLogStateSet %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; return(HPI_SHELL_OK); }; rv = saHpiEventLogStateGet(Domain->sessionId, rptid, &state); if (rv != SA_OK) { printf("saHpiEventLogStateGet %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; if (state == SAHPI_TRUE) str = "Enable"; else str = "Disable"; printf("Event Log State: %s\n", str); return HPI_SHELL_OK; } static ret_code_t evtlog_reset(void) { SaHpiResourceIdT rptid = 0; SaErrorT rv; term_def_t *term; rptid = SAHPI_UNSPECIFIED_RESOURCE_ID; term = get_next_term(); if ((term != NULL) && (isdigit(term->term[0]))) rptid = (SaHpiResourceIdT)atoi(term->term); rv = saHpiEventLogOverflowReset(Domain->sessionId, rptid); if (rv != SA_OK) { printf("saHpiEventLogOverflowReset %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; return HPI_SHELL_OK; } static ret_code_t settime_evtlog(void) { SaHpiResourceIdT rptid = 0; SaErrorT rv; SaHpiTimeT newtime; struct tm new_tm_time; char buf[READ_BUF_SIZE]; int day_array[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; term_def_t *term; int i; rptid = SAHPI_UNSPECIFIED_RESOURCE_ID; term = get_next_term(); if ((term != NULL) && (isdigit(term->term[0]))) { if (strchr(term->term, ':') != (char *)NULL) { unget_term(); rptid = SAHPI_UNSPECIFIED_RESOURCE_ID; } else rptid = (SaHpiResourceIdT)atoi(term->term); } else rptid = SAHPI_UNSPECIFIED_RESOURCE_ID; if (rptid == SAHPI_UNSPECIFIED_RESOURCE_ID) printf("Set date and time for Domain Event Log!\n"); else printf("Set date and time for Resource %d!\n", rptid); memset(&new_tm_time, 0, sizeof(struct tm)); i = get_string_param("format: MM:DD:YYYY:hh:mm:ss ==> ", buf, READ_BUF_SIZE); if (i != 0) return(HPI_SHELL_PARM_ERROR); sscanf(buf, "%d:%d:%d:%d:%d:%d", &new_tm_time.tm_mon, &new_tm_time.tm_mday, &new_tm_time.tm_year, &new_tm_time.tm_hour, &new_tm_time.tm_min, &new_tm_time.tm_sec); if ((new_tm_time.tm_mon < 1) || (new_tm_time.tm_mon > 12)) { printf("Month out of range: (%d)\n", new_tm_time.tm_mon); return(HPI_SHELL_PARM_ERROR); }; new_tm_time.tm_mon--; if (new_tm_time.tm_year < 1900) { printf("Year out of range: (%d)\n", new_tm_time.tm_year); return(HPI_SHELL_PARM_ERROR); }; if (new_tm_time.tm_mon == 1) { /* if the given year is a leap year */ if ((((new_tm_time.tm_year % 4) == 0) && ((new_tm_time.tm_year % 100) != 0)) || ((new_tm_time.tm_year % 400) == 0)) day_array[1] = 29; }; if ((new_tm_time.tm_mday < 1) || (new_tm_time.tm_mday > day_array[new_tm_time.tm_mon])) { printf("Day out of range: (%d)\n", new_tm_time.tm_mday); return(HPI_SHELL_PARM_ERROR); }; new_tm_time.tm_year -= 1900; if ((new_tm_time.tm_hour < 0) || (new_tm_time.tm_hour > 24)) { printf("Hours out of range: (%d)\n", new_tm_time.tm_hour); return(HPI_SHELL_PARM_ERROR); }; if ((new_tm_time.tm_min < 0) || (new_tm_time.tm_min > 60)) { printf("Minutes out of range: (%d)\n", new_tm_time.tm_min); return(HPI_SHELL_PARM_ERROR); }; if ((new_tm_time.tm_sec < 0) || (new_tm_time.tm_sec > 60)) { printf("Seconds out of range: (%d)\n", new_tm_time.tm_sec); return(HPI_SHELL_PARM_ERROR); }; newtime = (SaHpiTimeT) mktime(&new_tm_time) * 1000000000; rv = saHpiEventLogTimeSet(Domain->sessionId, rptid, newtime); if (rv != SA_OK) { printf("saHpiEventLogTimeSet %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); } return (HPI_SHELL_OK); } static ret_code_t show_rpt(void) { Rpt_t tmp_rpt; SaHpiRptEntryT rpt_entry; SaErrorT rv; SaHpiResourceIdT resid; ret_code_t ret; ret = ask_rpt(&resid); if (ret != HPI_SHELL_OK) return(ret); rv = saHpiRptEntryGetByResourceId(Domain->sessionId, resid, &rpt_entry); if (rv != SA_OK) { printf("NO rpt: %d\n", resid); return(HPI_SHELL_CMD_ERROR); }; make_attrs_rpt(&tmp_rpt, &rpt_entry); show_Rpt(&tmp_rpt, ui_print); free_attrs(&(tmp_rpt.Attrutes)); return (HPI_SHELL_OK); } static ret_code_t show_rdr(void) { Rdr_t tmp_rdr; SaHpiRdrT rdr_entry; SaHpiResourceIdT rptid = 0; SaHpiInstrumentIdT rdrnum; SaHpiRdrTypeT type; SaErrorT rv; int i; char buf[10], t; term_def_t *term; ret_code_t ret; term = get_next_term(); if (term == NULL) { if (read_file) return(HPI_SHELL_CMD_ERROR); i = show_rpt_list(Domain, SHOW_ALL_RPT, rptid, SHORT_LSRES, ui_print); if (i == 0) { printf("NO rpt!\n"); return(HPI_SHELL_CMD_ERROR); }; i = get_string_param("RPT (ID | all) ==> ", buf, 9); if (i != 0) return HPI_SHELL_CMD_ERROR; if (strncmp(buf, "all", 3) == 0) { show_rpt_list(Domain, SHOW_ALL_RDR, rptid, SHORT_LSRES, ui_print); return(HPI_SHELL_OK); }; rptid = (SaHpiResourceIdT)atoi(buf); } else { if (strcmp(term->term, "all") == 0) { show_rpt_list(Domain, SHOW_ALL_RDR, rptid, SHORT_LSRES, ui_print); return(HPI_SHELL_OK); }; if (isdigit(term->term[0])) rptid = (SaHpiResourceIdT)atoi(term->term); else return HPI_SHELL_PARM_ERROR; }; term = get_next_term(); if (term == NULL) { if (read_file) return(HPI_SHELL_CMD_ERROR); i = get_string_param("RDR Type (s|a|c|w|i|d|f) ==> ", buf, 9); if ( (i != 0) || (buf[0] == '\0') || (buf[1] != 0) ) return HPI_SHELL_PARM_ERROR; } else { memset(buf, 0, 10); strncpy(buf, term->term, 3); }; t = *buf; if (t == 'c') type = SAHPI_CTRL_RDR; else if (t == 's') type = SAHPI_SENSOR_RDR; else if (t == 'i') type = SAHPI_INVENTORY_RDR; else if (t == 'w') type = SAHPI_WATCHDOG_RDR; else if (t == 'a') type = SAHPI_ANNUNCIATOR_RDR; else if (t == 'd') type = SAHPI_DIMI_RDR; else if (t == 'f') type = SAHPI_FUMI_RDR; else return HPI_SHELL_PARM_ERROR; ret = ask_rdr(rptid, type, &rdrnum); if (ret != HPI_SHELL_OK) return(ret); rv = saHpiRdrGetByInstrumentId(Domain->sessionId, rptid, type, rdrnum, &rdr_entry); if (rv != SA_OK) { printf("ERROR!!! Get rdr: ResourceId=%d RdrType=%d" "RdrNum=%d: %s\n", rptid, type, rdrnum, oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; make_attrs_rdr(&tmp_rdr, &rdr_entry); show_Rdr(&tmp_rdr, ui_print); free_attrs(&(tmp_rdr.Attrutes)); return HPI_SHELL_OK; } static ret_code_t show_rdrupdatecounter(void) { ret_code_t ret; SaHpiResourceIdT rptid; SaErrorT rv; SaHpiUint32T cnt; ret = ask_rpt(&rptid); if (ret != HPI_SHELL_OK) return(ret); rv = saHpiRdrUpdateCountGet(Domain->sessionId, rptid, &cnt); if ( rv != SA_OK ) { printf( "ERROR!!! saHpiRdrUpdateCountGet: %s\n", oh_lookup_error( rv ) ); return HPI_SHELL_CMD_ERROR; } printf( "Update counter for the resource %u data records: %u\n", rptid, cnt ); return HPI_SHELL_OK; } static ret_code_t show_ver(void) { SaHpiVersionT ver = saHpiVersionGet(); printf("\nPackage version: %s\n", VERSION); printf("HPI specification version: SAI_HPI-%c.%02d.%02d\n\n", ('A' + (ver >> 16) -1), (ver >> 8) & 0xFF, (ver) & 0xFF); return(HPI_SHELL_OK); } static ret_code_t wdt_get(void) { SaHpiResourceIdT rptid; SaHpiWatchdogNumT wdtnum; SaHpiWatchdogT watchdog; SaHpiWatchdogExpFlagsT flags; SaErrorT rv; ret_code_t ret; char *str; char tmp[256]; ret = ask_rpt(&rptid); if (ret != HPI_SHELL_OK) return(ret); ret = ask_rdr(rptid, SAHPI_WATCHDOG_RDR, &wdtnum); if (ret != HPI_SHELL_OK) return(ret); rv = saHpiWatchdogTimerGet(Domain->sessionId, rptid, wdtnum, &watchdog); if (rv != SA_OK) { printf("ERROR!!! Get Watchdog: ResourceId=%d " "WatchdogNum=%d: %s\n", rptid, wdtnum, oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; if (watchdog.Log) str = "TRUE"; else str = "FALSE"; printf(" Watchdogtimer (%d/%d): Log=%s", rptid, wdtnum, str); if (watchdog.Running) str = "Running"; else str = "Stopped"; printf(" %s\n", str); switch (watchdog.TimerUse) { case SAHPI_WTU_NONE: str = "NONE"; break; case SAHPI_WTU_BIOS_FRB2: str = "BIOS_FRB2"; break; case SAHPI_WTU_BIOS_POST: str = "BIOS_POST"; break; case SAHPI_WTU_OS_LOAD: str = "OS_LOAD"; break; case SAHPI_WTU_SMS_OS: str = "SMS_OS"; break; case SAHPI_WTU_OEM: str = "OEM"; break; case SAHPI_WTU_UNSPECIFIED: str = "UNSPEC"; break; default: str = "Unknown"; break; }; printf(" Timer Use: %s", str); switch (watchdog.TimerAction) { case SAHPI_WA_NO_ACTION: str = "NO_ACTION"; break; case SAHPI_WA_RESET: str = "RESET"; break; case SAHPI_WA_POWER_DOWN: str = "POWER_DOWN"; break; case SAHPI_WA_POWER_CYCLE: str = "POWER_CYCLE"; break; default: str = "Unknown"; break; }; printf(" Action: %s", str); switch (watchdog.PretimerInterrupt) { case SAHPI_WPI_NONE: str = "NONE"; break; case SAHPI_WPI_SMI: str = "SMI"; break; case SAHPI_WPI_NMI: str = "NMI"; break; case SAHPI_WPI_MESSAGE_INTERRUPT: str = "MESSAGE"; break; case SAHPI_WPI_OEM: str = "OEM"; break; default: str = "Unknown"; break; }; printf(" Interrupt: %s", str); printf(" TimeOut: %d\n", watchdog.PreTimeoutInterval); tmp[0] = 0; flags = watchdog.TimerUseExpFlags; if (flags & SAHPI_WATCHDOG_EXP_BIOS_FRB2) strcat(tmp, " BIOS_FRB2 |"); if (flags & SAHPI_WATCHDOG_EXP_BIOS_POST) strcat(tmp, " BIOS_POST |"); if (flags & SAHPI_WATCHDOG_EXP_OS_LOAD) strcat(tmp, " OS_LOAD |"); if (flags & SAHPI_WATCHDOG_EXP_SMS_OS) strcat(tmp, " SMS_OS |"); if (flags & SAHPI_WATCHDOG_EXP_OEM) strcat(tmp, " OEM |"); if (strlen(tmp) > 0) { tmp[strlen(tmp) - 1] = 0; printf(" Flags: {%s}\n", tmp); } else printf(" Flags: (null)\n"); printf(" InitialCount = %d PresentCount = %d\n", watchdog.InitialCount, watchdog.PresentCount); return HPI_SHELL_OK; } static ret_code_t wdt_set(void) { SaHpiResourceIdT rptid; SaHpiWatchdogNumT wdtnum; SaHpiWatchdogT watchdog; SaHpiWatchdogExpFlagsT flags; SaErrorT rv; ret_code_t ret; int i, res; char *str, *str1; char tmp[256]; ret = ask_rpt(&rptid); if (ret != HPI_SHELL_OK) return(ret); ret = ask_rdr(rptid, SAHPI_WATCHDOG_RDR, &wdtnum); if (ret != HPI_SHELL_OK) return(ret); i = get_string_param("Log(0 | 1): ", tmp, 255); if (i != 0) { printf("Invalid Log value: %s\n", tmp); return(HPI_SHELL_PARM_ERROR); }; if (tmp[0] == '1') watchdog.Log = SAHPI_TRUE; else watchdog.Log = SAHPI_FALSE; i = get_string_param("Running(0 | 1): ", tmp, 255); if (i != 0) { printf("Invalid Running value: %s\n", tmp); return(HPI_SHELL_PARM_ERROR); }; if (tmp[0] == '1') watchdog.Running = SAHPI_TRUE; else watchdog.Running = SAHPI_FALSE; i = get_string_param( "TimerUse(none|bios_frb2|bios_post|os_load|sms_os|oem): ", tmp, 255); if (i != 0) { printf("Invalid TimerUse value: %s\n", tmp); return(HPI_SHELL_PARM_ERROR); }; if (strcmp(tmp, "none") == 0) watchdog.TimerUse = SAHPI_WTU_NONE; else if (strcmp(tmp, "bios_frb2") == 0) watchdog.TimerUse = SAHPI_WTU_BIOS_FRB2; else if (strcmp(tmp, "bios_post") == 0) watchdog.TimerUse = SAHPI_WTU_BIOS_POST; else if (strcmp(tmp, "os_load") == 0) watchdog.TimerUse = SAHPI_WTU_OS_LOAD; else if (strcmp(tmp, "sms_os") == 0) watchdog.TimerUse = SAHPI_WTU_SMS_OS; else if (strcmp(tmp, "oem") == 0) watchdog.TimerUse = SAHPI_WTU_OEM; else { printf("Invalid TimerUse value: %s\n", tmp); return(HPI_SHELL_PARM_ERROR); }; i = get_string_param( "TimerAction(no|reset|pwr_down|pwr_cycle): ", tmp, 255); if (i != 0) { printf("Invalid TimerAction value: %s\n", tmp); return(HPI_SHELL_PARM_ERROR); }; if (strcmp(tmp, "no") == 0) watchdog.TimerAction = SAHPI_WA_NO_ACTION; else if (strcmp(tmp, "reset") == 0) watchdog.TimerAction = SAHPI_WA_RESET; else if (strcmp(tmp, "pwr_down") == 0) watchdog.TimerAction = SAHPI_WA_POWER_DOWN; else if (strcmp(tmp, "pwr_cycle") == 0) watchdog.TimerAction = SAHPI_WA_POWER_CYCLE; else { printf("Invalid TimerAction value: %s\n", tmp); return(HPI_SHELL_PARM_ERROR); }; i = get_string_param("PretimerInterrupt(no|smi|nmi|mess|oem): ", tmp, 255); if (i != 0) { printf("Invalid PretimerInterrupt value: %s\n", tmp); return(HPI_SHELL_PARM_ERROR); }; if (strcmp(tmp, "no") == 0) watchdog.PretimerInterrupt = SAHPI_WPI_NONE; else if (strcmp(tmp, "smi") == 0) watchdog.PretimerInterrupt = SAHPI_WPI_SMI; else if (strcmp(tmp, "nmi") == 0) watchdog.PretimerInterrupt = SAHPI_WPI_NMI; else if (strcmp(tmp, "mess") == 0) watchdog.PretimerInterrupt = SAHPI_WPI_MESSAGE_INTERRUPT; else if (strcmp(tmp, "oem") == 0) watchdog.PretimerInterrupt = SAHPI_WPI_OEM; else { printf("Invalid TimerAction value: %s\n", tmp); return(HPI_SHELL_PARM_ERROR); }; i = get_int_param("TimeOut: ", &res); if (i != 1) { printf("Invalid TimeOut value\n"); return(HPI_SHELL_PARM_ERROR); }; watchdog.PreTimeoutInterval = res; i = get_string_param("Flags(\"bios_frb2|bios_post|os_load|sms_os|oem\"): ", tmp, 255); if (i != 0) *tmp = 0; flags = 0; str = tmp; while (strlen(str) != 0) { while (isspace(*str)) str++; str1 = str; while ((*str1 != ' ') && (*str1 != 0) && (*str1 != '|')) str1++; if (*str1 != 0) *str1++ = 0; else *str1 = 0; if (strcmp(str, "bios_frb2") == 0) flags |= SAHPI_WATCHDOG_EXP_BIOS_FRB2; if (strcmp(str, "bios_post") == 0) flags |= SAHPI_WATCHDOG_EXP_BIOS_POST; if (strcmp(str, "os_load") == 0) flags |= SAHPI_WATCHDOG_EXP_OS_LOAD; if (strcmp(str, "sms_os") == 0) flags |= SAHPI_WATCHDOG_EXP_SMS_OS; if (strcmp(str, "oem") == 0) flags |= SAHPI_WATCHDOG_EXP_OEM; str = str1; }; watchdog.TimerUseExpFlags = flags; i = get_int_param("InitialCount: ", &res); if (i != 1) { printf("Invalid InitialCount value\n"); return(HPI_SHELL_PARM_ERROR); }; watchdog.InitialCount = res; rv = saHpiWatchdogTimerSet(Domain->sessionId, rptid, wdtnum, &watchdog); if (rv != SA_OK) { printf("ERROR!!! Set Watchdog: ResourceId=%d WatchdogNum=%d: %s\n", rptid, wdtnum, oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; return HPI_SHELL_OK; } static ret_code_t wdt_reset(void) { SaHpiResourceIdT rptid; SaHpiWatchdogNumT wdtnum; SaErrorT rv; ret_code_t ret; ret = ask_rpt(&rptid); if (ret != HPI_SHELL_OK) return(ret); ret = ask_rdr(rptid, SAHPI_WATCHDOG_RDR, &wdtnum); if (ret != HPI_SHELL_OK) return(ret); rv = saHpiWatchdogTimerReset(Domain->sessionId, rptid, wdtnum); if (rv != SA_OK) { printf("ERROR!!! Reset Watchdog: ResourceId=%d WatchdogNum=%d: %s\n", rptid, wdtnum, oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; return HPI_SHELL_OK; } static ret_code_t quit(void) { if (block_type != MAIN_COM) { unget_term(); return(HPI_SHELL_OK); }; printf("quit\n"); restore_term_flags(); close_session(); exit(0); } static ret_code_t reopen_session(void) { int eflag = 0, fflag = 0; term_def_t *term; SaErrorT rv; term = get_next_term(); while (term != NULL) { if (strcmp(term->term, "force") == 0) { fflag = 1; } else { printf("Invalid argument: %s\n", term->term); return(HPI_SHELL_PARM_ERROR); }; term = get_next_term(); }; do { rv = saHpiSessionClose(Domain->sessionId); g_usleep(G_USEC_PER_SEC); } while ( ( fflag == 0 ) && ( rv != SA_OK ) && ( rv != SA_ERR_HPI_NO_RESPONSE ) && ( rv != SA_ERR_HPI_INVALID_SESSION ) ); if (rv != SA_OK) { printf("saHpiSessionClose error %s\n", oh_lookup_error(rv)); } if (open_session(Domain->domainId, eflag) != 0) { printf("Can not open session\n"); return(HPI_SHELL_CMD_ERROR); } return(HPI_SHELL_OK); } static ret_code_t run(void) { term_def_t *term; char *path; term = get_next_term(); if (term == NULL) return(HPI_SHELL_PARM_ERROR); path = term->term; return(open_file(path)); } static ret_code_t exec_proc(void) { term_def_t *term; char buf[4096]; term = get_next_term(); if (term == NULL) return(HPI_SHELL_PARM_ERROR); strcpy(buf, term->term); while (term != NULL) { term = get_next_term(); if (term == NULL) break; if (term->term_type != ITEM_TERM) break; strcat(buf, " "); strcat(buf, term->term); }; if (system(buf) < 0) return(HPI_SHELL_CMD_ERROR); return(HPI_SHELL_OK); } static ret_code_t echo(void) { term_def_t *term; term = get_next_term(); if (term != NULL) printf("%s\n", term->term); return(HPI_SHELL_OK); } static ret_code_t entity_instruments(void) { term_def_t * term; SaHpiEntityPathT ep; SaHpiRdrTypeT type; ret_code_t ret; char buf[3]; char type_symbol; ret = ask_entity(&ep); if (ret != HPI_SHELL_OK) { return(ret); } term = get_next_term(); if (term == NULL) { if (read_file) return(HPI_SHELL_CMD_ERROR); ret = get_string_param("Instrument Type (s|a|c|w|i|d|f) ==> ", buf, sizeof(buf)); if ( ( ret != 0 ) || ( buf[0] == '\0' ) || ( buf[1] != 0 ) ) { return HPI_SHELL_PARM_ERROR; } type_symbol = buf[0]; } else { if ( ( term->term[0] == '\0' ) || ( term->term[1] != 0 ) ) { return HPI_SHELL_PARM_ERROR; } type_symbol = term->term[0]; }; switch ( type_symbol ) { case 'c': type = SAHPI_CTRL_RDR; break; case 's': type = SAHPI_SENSOR_RDR; break; case 'i': type = SAHPI_INVENTORY_RDR; break; case 'w': type = SAHPI_WATCHDOG_RDR; break; case 'a': type = SAHPI_ANNUNCIATOR_RDR; break; case 'd': type = SAHPI_DIMI_RDR; break; case 'f': type = SAHPI_FUMI_RDR; break; default: return HPI_SHELL_PARM_ERROR; } return ( show_entity_management(Domain, &ep, type, ui_print) == SA_OK) ? HPI_SHELL_OK : HPI_SHELL_CMD_ERROR; } static ret_code_t entity_resources(void) { SaHpiEntityPathT ep; ret_code_t ret; ret = ask_entity(&ep); if (ret != HPI_SHELL_OK) { return(ret); } return ( show_entity_management(Domain, &ep, SAHPI_NO_RECORD, ui_print) == SA_OK) ? HPI_SHELL_OK : HPI_SHELL_CMD_ERROR; } static ret_code_t domain_info(void) { SaHpiDomainInfoT info; SaHpiTextBufferT *buf; SaHpiTextBufferT tb; SaErrorT rv; rv = saHpiDomainInfoGet(Domain->sessionId, &info); if (rv != SA_OK) { printf("ERROR!!! saHpiDomainInfoGet: %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; printf("Domain: %d Capabil: 0x%x IsPeer: %d Guid: %s\n", info.DomainId, info.DomainCapabilities, info.IsPeer, info.Guid); buf = &(info.DomainTag); print_text_buffer_text(" Tag: ", buf, NULL, ui_print); printf("\n"); printf(" DRT update count: %d", info.DrtUpdateCount); oh_decode_time(info.DrtUpdateTimestamp, &tb); print_text_buffer_text(" DRT Timestamp : ", &tb, "\n", ui_print); printf(" RPT update count: %d", info.RptUpdateCount); oh_decode_time(info.RptUpdateTimestamp, &tb); print_text_buffer_text(" RPT Timestamp : ", &tb, "\n", ui_print); printf(" DAT update count: %d", info.DatUpdateCount); oh_decode_time(info.DatUpdateTimestamp, &tb); print_text_buffer_text(" DAT Timestamp : ", &tb, "\n", ui_print); printf(" ActiveAlarms: %d CriticalAlarms: %d Major: %d " "Minor: %d Limit: %d\n", info.ActiveAlarms, info.CriticalAlarms, info.MajorAlarms, info.MinorAlarms, info.DatUserAlarmLimit); printf(" DatOverflow : %d\n", info.DatOverflow); return(HPI_SHELL_OK); } ret_code_t domain_proc(void) { SaHpiDomainIdT id; int i, n; gpointer ptr; Domain_t *domain = (Domain_t *)NULL; Domain_t *new_domain; term_def_t *term; term = get_next_term(); if (term == NULL) { return(HPI_SHELL_PARM_ERROR); }; if (isdigit(term->term[0])) id = (int)atoi(term->term); else return HPI_SHELL_PARM_ERROR; n = g_slist_length(domainlist); for (i = 0; i < n; i++) { ptr = g_slist_nth_data(domainlist, i); if (ptr == (gpointer)NULL) break; domain = (Domain_t *)ptr; if (domain->domainId == id) break; }; if (i >= n) { new_domain = (Domain_t *)malloc(sizeof(Domain_t)); memset(new_domain, 0, sizeof(Domain_t)); new_domain->domainId = id; if (add_domain(new_domain) < 0) { free(new_domain); printf("Can not open domain: %d\n", id); return HPI_SHELL_PARM_ERROR; }; domain = new_domain; }; Domain = domain; set_Subscribe(Domain, prt_flag); add_domain(Domain); return(HPI_SHELL_OK); } static ret_code_t show_drt(void) { SaErrorT rv; SaHpiDomainInfoT dinfo; SaHpiEntryIdT id, nextid; rv = saHpiDomainInfoGet(Domain->sessionId, &dinfo); if (rv != SA_OK) { printf("ERROR!!! saHpiDomainInfoGet: %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); } printf("DRT for Domain %u, Session %u,", Domain->domainId, Domain->sessionId); print_text_buffer_text(" Tag: ", &(dinfo.DomainTag), NULL, ui_print); printf("\n"); id = SAHPI_FIRST_ENTRY; while (id != SAHPI_LAST_ENTRY) { SaHpiDrtEntryT drte; SaHpiSessionIdT sessionId; rv = saHpiDrtEntryGet(Domain->sessionId, id, &nextid, &drte); if (rv == SA_ERR_HPI_NOT_PRESENT) { break; } else if (rv != SA_OK) { printf("ERROR!!! saHpiDrtEntryGet: %s\n", oh_lookup_error(rv)); return HPI_SHELL_CMD_ERROR; } printf(" Domain %u", drte.DomainId); if (drte.IsPeer != SAHPI_FALSE ) { printf(", Peer"); } rv = saHpiSessionOpen(drte.DomainId, &sessionId, 0); if (rv == SA_OK) { rv = saHpiDomainInfoGet(sessionId, &dinfo); if (rv == SA_OK) { print_text_buffer_text(", Accessible, Tag: ", &(dinfo.DomainTag), NULL, ui_print); }; rv = saHpiSessionClose(sessionId); }; printf( "\n" ); id = nextid; } return HPI_SHELL_OK; } #ifdef KUZ_DEBUG static ret_code_t test_cmd(void) { char ar[256], s[10]; int c, n; while (1) { c = getchar(); memset(s, 0, 5); n = *s; snprintf(ar, 256, "input: <%c> <0x%x> <%d>\n", c, c, c); printf("%s", ar); }; return(HPI_SHELL_OK); } #endif /* command table */ const char addcfghelp[] = "addcfg: add plugins, domains, handlers from" " config file\nUsage: addcfg \n"; const char annhelp[] = "ann: annunciator command block\n" "Usage: ann \n"; const char clevtloghelp[] = "clearevtlog: clear system event logs\n" "Usage: clearevtlog []"; const char ctrlhelp[] = "ctrl: control command block\n" "Usage: ctrl []\n" " ctrlId:: \n"; const char dathelp[] = "dat: domain alarm table list\n" "Usage: dat"; const char dimiblockhelp[] = "dimi: DIMI command block\n" "Usage: dimi []\n" " DimiId:: \n"; const char debughelp[] = "debug: set or unset OPENHPI_ERROR environment\n" "Usage: debug [ on | off ]"; const char domainhelp[] = "domain: set current domain\n" "Usage: domain []"; const char domaininfohelp[] = "domaininfo: show current domain info\n" "Usage: domaininfo"; const char drthelp[] = "drt: show DRT for the current domain\n" "Usage: drt"; const char dscvhelp[] = "dscv: discovery resources\n" "Usage: dscv "; const char echohelp[] = "echo: pass string to the stdout\n" "Usage: echo "; const char entinstrhelp[] = "entinstr: list instruments for an entity\n" "Usage: entinstr [] [type]\n" " type = c - control, s - sensor, i - inventory\n" " w - watchdog, a - annunciatori, d - dimi,\n" " f - fumi"; const char entreshelp[] = "entres: list resources for an entity\n" "Usage: entres []"; const char eventhelp[] = "event: enable or disable event display on screen\n" "Usage: event [enable|disable|short|full] "; const char evtlresethelp[] = "evtlogreset: reset the OverflowFlag in the event log\n" "Usage: evtlogreset []"; const char evtlstatehelp[] = "evtlogstate: show and set the event log state\n" "Usage: evtlogstate [] [enable|disable]"; const char evtlogtimehelp[] = "evtlogtime: show the event log's clock\n" "Usage: evtlogtime []"; const char exechelp[] = "exec: execute external program\n" "Usage: exec [parameters]"; const char fumiblockhelp[] = "fumi: FUMI command block\n" "Usage: fumi []\n" " FumiId:: \n"; const char helphelp[] = "help: help information for hpi_shell commands\n" "Usage: help [optional commands]"; const char historyhelp[] = "history: show input commands history\n" "Usage: history"; const char hsblockhelp[] = "hs: hot swap command block\n" "Usage: hs \n"; const char hsindhelp[] = "hotswap_ind: show hot swap indicator state\n" "Usage: hotswap_ind "; const char hsstathelp[] = "hotswapstat: retrieve hot swap state of a resource\n" "Usage: hotswapstat "; const char invhelp[] = "inv: inventory command block\n" "Usage: inv []\n" " InvId:: \n"; const char lenthelp[] = "lenthelp: list entities visible in the system\n" "Usage: lsent"; const char lreshelp[] = "lsres: list resources\n" "Usage: lsres [stat] [path]"; const char lsorhelp[] = "lsensor: list sensors\n" "Usage: lsensor"; const char morehelp[] = "more: set or unset more enable\n" "Usage: more [ on | off ]"; const char newdomainhelp[] = "newdomain: create new domain\n" "Usage: newdomain [:] []"; const char parmctrlhelp[] = "parmctrl: save and restore parameters for a resource\n" "Usage: parmctrl \n" " action - default | save | restore"; const char powerhelp[] = "power: power the resource on, off or cycle\n" "Usage: power [on|off|cycle]"; const char quithelp[] = "quit: close session and quit console\n" "Usage: quit"; const char rdrupdatecounterhelp[] = "rdrupdatecounter: shows update counter for the" " resource data records\n" "Usage: rdrupdatecounter \n"; const char resethelp[] = "reset: perform specified reset on the entity\n" "Usage: reset [cold|warm|assert|deassert]"; const char removefailedhelp[] = "removefailed: remove RPT entry for failed resource\n" "Usage: removefailed "; const char reopenhelp[] = "reopen: reopens session\n" "Usage: reopen [force]\n" "force flag skips old session closing check"; const char runhelp[] = "run: execute command file\n" "Usage: run "; const char senhelp[] = "sen: sensor command block\n" "Usage: sen []\n" " sensorId:: \n"; const char setseverhelp[] = "setsever: set severity for a resource\n" "Usage: setsever []"; const char settaghelp[] = "settag: set tag for a particular resource\n" "Usage: settag []"; const char settmevtlhelp[] = "settimeevtlog: sets the event log's clock\n" "Usage: settimeevtlog []"; const char showevtloghelp[] = "showevtlog: show system event logs\n" "Usage: showevtlog []"; const char showinvhelp[] = "showinv: show inventory data of a resource\n" "Usage: showinv []"; const char showrdrhelp[] = "showrdr: show resource data record\n" "Usage: showrdr [ [type []]]\n" " or rdr [ [type []]]\n" " type = c - control, s - sensor, i - inventory\n" " w - watchdog, a - annunciatori, d - dimi,\n" " f - fumi"; const char showrpthelp[] = "showrpt: show resource information\n" "Usage: showrpt []\n" " or rpt []"; const char versionhelp[] = "ver: show HPI specification, package versions\n" "Usage: ver"; const char wdtgethelp[] = "wdtget: show watchdog timer\n" "Usage: wdtget "; const char wdtresethelp[] = "wdtreset: reset watchdog timer\n" "Usage: wdtreset "; const char wdtsethelp[] = "wdtset: set watchdog timer\n" "Usage: wdtset "; // sensor command block const char sen_dishelp[] = "disable: set sensor disable\n" "Usage: disable"; const char sen_enbhelp[] = "enable: set sensor enable\n" "Usage: enable"; const char sen_evtenbhelp[] = "evtenb: set sensor event enable\n" "Usage: evtenb"; const char sen_evtdishelp[] = "evtdis: set sensor event disable\n" "Usage: evtdis"; const char sen_mskaddhelp[] = "maskadd: add sensor event masks\n" "Usage: maskadd"; const char sen_mskrmhelp[] = "maskrm: remove sensor event masks\n" "Usage: maskrm"; const char sen_setthhelp[] = "setthres: set sensor thresholds\n" "Usage: setthres"; const char sen_showhelp[] = "show: show sensor state\n" "Usage: show"; // inventory command block const char inv_addahelp[] = "addarea: add inventory area\n" "Usage: addarea"; const char inv_addfhelp[] = "addfield: add inventory field\n" "Usage: addfield"; const char inv_delahelp[] = "delarea: delete inventory area\n" "Usage: delarea"; const char inv_delfhelp[] = "delfield: delete inventory field\n" "Usage: delfield"; const char inv_setfhelp[] = "setfield: set inventory field\n" "Usage: setfield"; const char inv_showhelp[] = "show: show inventory\n" "Usage: show []"; // control command block const char ctrl_setsthelp[] = "setstate: set control state\n" "Usage: setstate "; const char ctrl_showhelp[] = "show: show control\n" "Usage: show"; const char ctrl_sthelp[] = "state: show control state\n" "Usage: state"; // annunciator command block const char ann_acknowhelp[] = "acknow: set acknowledge flag\n" "Usage: acknow [] | [all ]"; const char ann_addhelp[] = "add: add Announcement\n" "Usage: add "; const char ann_delhelp[] = "delete: delete Announcement\n" "Usage: delete "; const char ann_listhelp[] = "list: show Announcement list\n" "Usage: list"; const char ann_mgethelp[] = "modeget: show annunciator mode\n" "Usage: modeget"; const char ann_msethelp[] = "modeset: set annunciator mode\n" "Usage: modeset "; const char ann_showhelp[] = "show: show annunciator or condition\n" "Usage: show [num]"; // Hot swap command block const char hs_actionhelp[] = "action: set action process\n" "Usage: action insert|extract"; const char hs_activehelp[] = "active: set active state\n" "Usage: active"; const char hs_gettohelp[] = "gettimeout: show timeout\n" "Usage: gettimeout insert|extract"; const char hs_inactivehelp[] = "inactive: set inactive state\n" "Usage: inactive"; const char hs_indhelp[] = "ind: set and show indicator state\n" "Usage: ind get|on|off"; const char hs_policyhelp[] = "policycancel: set default policy\n" "Usage: policycancel"; const char hs_settohelp[] = "settimeout: set timeout\n" "Usage: settimeout insert|extract "; const char hs_statehelp[] = "state: show hot swap state\n" "Usage: state"; // DIMI command block const char dimi_infohelp[] = "info: shows information about DIMI\n" "Usage: info"; const char dimi_testinfohelp[] = "testinfo: shows information about specified test\n" "Usage: testinfo []"; const char dimi_readyhelp[] = "ready: shows information about the DIMI readiness to run specified test\n" "Usage: ready "; const char dimi_starthelp[] = "start: starts execution of specified test\n" "Usage: start "; const char dimi_cancelhelp[] = "cancel: cancels specified test running\n" "Usage: cancel "; const char dimi_statushelp[] = "status: shows status of specified test\n" "Usage: status "; const char dimi_resultshelp[] = "results: show results from the last run of specified test\n" "Usage: results "; // FUMI command block const char fumi_specinfohelp[] = "specinfo: identifies the specification-defined framework " "underlying a FUMI implementation\n" "Usage: specinfo"; const char fumi_serviceimpacthelp[] = "serviceimpact: shows information about the potential service " "impact of an upgrade process on a FUMI\n" "Usage: serviceimpact"; const char fumi_setsourcehelp[] = "setsource : set new source information to the specified bank\n" "Usage: setsource "; const char fumi_validatesourcehelp[] = "validatesource : initiates the validation of the integrity of " "the source image associated with the designated bank\n" "Usage: validatesource "; const char fumi_sourceinfohelp[] = "sourceinfo : shows information about the source image assigned to " "designated bank\n" "Usage: sourceinfo "; const char fumi_targetinfohelp[] = "targetinfo : shows information about the specified bank\n" "Usage: targetinfo "; const char fumi_backuphelp[] = "backup : initiates a backup of currently active bank\n" "Usage: backup"; const char fumi_setbootorderhelp[] = "setbootorder : set the position of a bank in the boot order\n" "Usage: setbootorder "; const char fumi_bankcopyhelp[] = "bankcopy : initiates a copy of the contents of one bank to another bank\n" "Usage: bankcopy "; const char fumi_installhelp[] = "install : starts an installation process, loading firmware to " "a specified bank\n" "Usage: install "; const char fumi_statushelp[] = "status : shows upgrade status of the FUMI\n" "Usage: status "; const char fumi_verifyhelp[] = "verify : starts the verification process of the upgraded image\n" "Usage: verify "; const char fumi_verifymainhelp[] = "verifymain : starts the verification process of the " "main firmware instance in the logical bank\n" "Usage: verifymain"; const char fumi_cancelhelp[] = "cancel : stops upgrade asynchronous operation in progress\n" "Usage: cancel "; const char fumi_disableautorollbackhelp[] = "disableautorollback: gets/sets autorollback disable option\n" "Usage: disableautorollback [ on | off ]"; const char fumi_rollbackhelp[] = "rollback : initiates a rollback operation to " "restore the currently active bank with a backup version\n" "Usage: rollback "; const char fumi_activatehelp[] = "activate : initiates firmware activation in either " "the logical bank or the explicit banks on the FUMI\n" "Usage: activate [logical]"; const char fumi_cleanuphelp[] = "cleanup: performs cleanup after an upgrade process on the " "specified bank, returning it to a predefined state\n" "Usage: cleanup "; command_def_t commands[] = { { "addcfg", add_config, addcfghelp, MAIN_COM }, { "ann", ann_block, annhelp, MAIN_COM }, { "clearevtlog", clear_evtlog, clevtloghelp, MAIN_COM }, { "ctrl", ctrl_block, ctrlhelp, MAIN_COM }, { "dat", dat_list, dathelp, MAIN_COM }, { "debug", debugset, debughelp, UNDEF_COM }, { "dimi", dimi_block, dimiblockhelp, MAIN_COM }, { "domain", domain_proc, domainhelp, MAIN_COM }, { "domaininfo", domain_info, domaininfohelp, MAIN_COM }, { "drt", show_drt, drthelp, MAIN_COM }, { "dscv", discovery, dscvhelp, MAIN_COM }, { "echo", echo, echohelp, UNDEF_COM }, { "entinstr", entity_instruments, entinstrhelp, UNDEF_COM }, { "entres", entity_resources, entreshelp, UNDEF_COM }, { "event", event, eventhelp, UNDEF_COM }, { "evtlogtime", evtlog_time, evtlogtimehelp, MAIN_COM }, { "evtlogreset", evtlog_reset, evtlresethelp, MAIN_COM }, { "evtlogstate", evtlog_state, evtlstatehelp, MAIN_COM }, { "exec", exec_proc, exechelp, UNDEF_COM }, { "fumi", fumi_block, fumiblockhelp, MAIN_COM }, { "help", help_cmd, helphelp, UNDEF_COM }, { "history", history_cmd, historyhelp, UNDEF_COM }, { "hs", hs_block, hsblockhelp, MAIN_COM }, { "inv", inv_block, invhelp, MAIN_COM }, { "lsent", listent, lenthelp, UNDEF_COM }, { "lsres", listres, lreshelp, UNDEF_COM }, { "lsensor", list_sensor, lsorhelp, MAIN_COM }, { "more", moreset, morehelp, UNDEF_COM }, { "newdomain", newdomain, newdomainhelp, MAIN_COM }, { "parmctrl", parmctrl, parmctrlhelp, MAIN_COM }, { "power", power, powerhelp, MAIN_COM }, { "quit", quit, quithelp, UNDEF_COM }, { "rdr", show_rdr, showrdrhelp, MAIN_COM }, { "rdrupdatecounter", show_rdrupdatecounter, rdrupdatecounterhelp, MAIN_COM }, { "reopen", reopen_session, reopenhelp, UNDEF_COM }, { "removefailed", remove_failed_resource, removefailedhelp, MAIN_COM }, { "reset", reset, resethelp, MAIN_COM }, { "rpt", show_rpt, showrpthelp, MAIN_COM }, { "run", run, runhelp, MAIN_COM }, { "sen", sen_block, senhelp, MAIN_COM }, { "settag", set_tag, settaghelp, MAIN_COM }, { "setsever", set_sever, setseverhelp, MAIN_COM }, { "settimeevtlog", settime_evtlog, settmevtlhelp, MAIN_COM }, { "showevtlog", show_evtlog, showevtloghelp, MAIN_COM }, { "showinv", show_inv, showinvhelp, MAIN_COM }, { "showrdr", show_rdr, showrdrhelp, MAIN_COM }, { "showrpt", show_rpt, showrpthelp, MAIN_COM }, { "ver", show_ver, versionhelp, UNDEF_COM }, { "wdtget", wdt_get, wdtgethelp, MAIN_COM }, { "wdtreset", wdt_reset, wdtresethelp, MAIN_COM }, { "wdtset", wdt_set, wdtsethelp, MAIN_COM }, { "?", help_cmd, helphelp, UNDEF_COM }, #ifdef KUZ_DEBUG { "test", test_cmd, helphelp, UNDEF_COM }, #endif // sensor command block { "disable", sen_block_disable, sen_dishelp, SEN_COM }, { "enable", sen_block_enable, sen_enbhelp, SEN_COM }, { "evtdis", sen_block_evtdis, sen_evtdishelp, SEN_COM }, { "evtenb", sen_block_evtenb, sen_evtenbhelp, SEN_COM }, { "maskadd", sen_block_maskadd, sen_mskaddhelp, SEN_COM }, { "maskrm", sen_block_maskrm, sen_mskrmhelp, SEN_COM }, { "setthres", sen_block_setthres, sen_setthhelp, SEN_COM }, { "show", sen_block_show, sen_showhelp, SEN_COM }, // inventory command block { "addarea", inv_block_addarea, inv_addahelp, INV_COM }, { "addfield", inv_block_addfield, inv_addfhelp, INV_COM }, { "delarea", inv_block_delarea, inv_delahelp, INV_COM }, { "delfield", inv_block_delfield, inv_delfhelp, INV_COM }, { "setfield", inv_block_setfield, inv_setfhelp, INV_COM }, { "show", inv_block_show, inv_showhelp, INV_COM }, // control command block { "setstate", ctrl_block_setst, ctrl_setsthelp, CTRL_COM }, { "show", ctrl_block_show, ctrl_showhelp, CTRL_COM }, { "state", ctrl_block_state, ctrl_sthelp, CTRL_COM }, // annunciator command block { "acknow", ann_block_acknow, ann_acknowhelp, ANN_COM }, { "add", ann_block_add, ann_addhelp, ANN_COM }, { "delete", ann_block_delete, ann_delhelp, ANN_COM }, { "list", ann_block_list, ann_listhelp, ANN_COM }, { "modeget", ann_block_modeget, ann_mgethelp, ANN_COM }, { "modeset", ann_block_modeset, ann_msethelp, ANN_COM }, { "show", ann_block_show, ann_showhelp, ANN_COM }, // Hot swap command block { "action", hs_block_action,hs_actionhelp, HS_COM }, { "active", hs_block_active,hs_activehelp, HS_COM }, { "gettimeout", hs_block_gtime, hs_gettohelp, HS_COM }, { "inactive", hs_block_inact, hs_inactivehelp,HS_COM }, { "ind", hs_block_ind, hs_indhelp, HS_COM }, { "policycancel", hs_block_policy,hs_policyhelp, HS_COM }, { "settimeout", hs_block_stime, hs_settohelp, HS_COM }, { "state", hs_block_state, hs_statehelp, HS_COM }, // DIMI command block { "info", dimi_block_info, dimi_infohelp, DIMI_COM }, { "testinfo", dimi_block_testinfo, dimi_testinfohelp, DIMI_COM }, { "ready", dimi_block_ready, dimi_readyhelp, DIMI_COM }, { "start", dimi_block_start, dimi_starthelp, DIMI_COM }, { "cancel", dimi_block_cancel, dimi_cancelhelp, DIMI_COM }, { "status", dimi_block_status, dimi_statushelp, DIMI_COM }, { "results", dimi_block_results, dimi_resultshelp, DIMI_COM }, // FUMI command block { "specinfo", fumi_block_specinfo, fumi_specinfohelp, FUMI_COM }, { "serviceimpact", fumi_block_serviceimpact, fumi_serviceimpacthelp, FUMI_COM }, { "setsource", fumi_block_setsource, fumi_setsourcehelp, FUMI_COM }, { "validatesource", fumi_block_validatesource, fumi_validatesourcehelp, FUMI_COM }, { "sourceinfo", fumi_block_sourceinfo, fumi_sourceinfohelp, FUMI_COM }, { "targetinfo", fumi_block_targetinfo, fumi_targetinfohelp, FUMI_COM }, { "backup", fumi_block_backup, fumi_backuphelp, FUMI_COM }, { "setbootorder", fumi_block_setbootorder, fumi_setbootorderhelp, FUMI_COM }, { "bankcopy", fumi_block_bankcopy, fumi_bankcopyhelp, FUMI_COM }, { "install", fumi_block_install, fumi_installhelp, FUMI_COM }, { "status", fumi_block_status, fumi_statushelp, FUMI_COM }, { "verify", fumi_block_verify, fumi_verifyhelp, FUMI_COM }, { "verifymain", fumi_block_verifymain, fumi_verifymainhelp, FUMI_COM }, { "cancel", fumi_block_cancel, fumi_cancelhelp, FUMI_COM }, { "disableautorollback", fumi_block_disableautorollback, fumi_disableautorollbackhelp, FUMI_COM }, { "rollback", fumi_block_rollback, fumi_rollbackhelp, FUMI_COM }, { "activate", fumi_block_activate, fumi_activatehelp, FUMI_COM }, { "cleanup", fumi_block_cleanup, fumi_cleanuphelp, FUMI_COM }, // Terminator { NULL, NULL, NULL, MAIN_COM } }; openhpi-3.6.1/hpi_shell/version.rc0000644000175100017510000000160212575647264016156 0ustar mohanmohan#include LANGUAGE 0x09,0x01 // English(US) VS_VERSION_INFO VERSIONINFO FILEVERSION BINARY_VERSION PRODUCTVERSION BINARY_VERSION FILEFLAGSMASK 0 FILEFLAGS 0 FILEOS VOS_NT_WINDOWS32 FILETYPE VFT_APP FILESUBTYPE VFT2_UNKNOWN BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904E4" // English(US), Multilingual BEGIN VALUE "Comments", "" VALUE "CompanyName", "OpenHPI Community (http://openhpi.org/)" VALUE "FileDescription", "OpenHPI Shell" VALUE "FileVersion", VERSION VALUE "InternalName", "openhpid" VALUE "LegalCopyright", "OpenHPI is distributed under BSD license" VALUE "OriginalFilename", "hpi_shell.exe" VALUE "ProductName", "OpenHPI" VALUE "ProductVersion", VERSION END END END openhpi-3.6.1/hpi_shell/inputcmd.c0000644000175100017510000003357212575647264016145 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (c) 2005 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Kouzmich < Mikhail.V.Kouzmich@intel.com > * * */ #include #include #include #include #include #ifdef _WIN32 // TODO #else #include #include #endif #include "hpi_cmd.h" #define CTRL_A_KEY 0x01 #define CTRL_B_KEY 0x02 #define CTRL_D_KEY 0x04 #define CTRL_E_KEY 0x05 #define CTRL_F_KEY 0x06 #define CTRL_G_KEY 0x07 #define BELL_KEY 0x07 #define CTRL_H_KEY 0x08 #define TAB_KEY 0x09 #define NL_KEY 0x0A #define CTRL_K_KEY 0x0B #define CTRL_L_KEY 0x0C #define CTRL_N_KEY 0x0E #define CTRL_R_KEY 0x12 #define CTRL_S_KEY 0x13 #define CTRL1_KEY 0x1B #define CTRL2_KEY 0x5B #define BACKSP_KEY 0x7F #define INSERT_KEY 0x32 #define DELETE_KEY 0x33 #define PGUP_KEY 0x35 #define PGDOWN_KEY 0x36 #define UP_KEY 0x41 #define DOWN_KEY 0x42 #define RIGHT_KEY 0x43 #define LEFT_KEY 0x44 #define END_KEY 0x46 #define HOME_KEY 0x48 #define HISTORY_DELTA 5 typedef struct { int n_items; int comp_len; char **items; } compl_t; compl_t complition_struct; int termfd = -1; static char clear_buf[READ_BUF_SIZE]; static int no_stty = 1; #ifdef _WIN32 // TODO #else static struct termios saved_termio; #endif static int is_insert_key = 0; static char **History; static int hist_ind = 0; static int hist_size = 0; static int current_hist_ind = -1; void init_history(void) { History = (char **)malloc(sizeof(char *) * HISTORY_DELTA); hist_size = HISTORY_DELTA; memset(History, 0, sizeof(char *) * HISTORY_DELTA); current_hist_ind = -1; hist_ind = 0; complition_struct.n_items = 0; } static void get_history_new(int new_cmd) { char **tmp; if (current_hist_ind < 0) new_cmd = 1; if ((current_hist_ind >= 0) && (*(History[current_hist_ind]) == 0)) { hist_ind = current_hist_ind; return; }; if (new_cmd) current_hist_ind++; else return; if (current_hist_ind >= hist_size) { hist_size += HISTORY_DELTA; tmp = (char **)malloc(sizeof(char *) * hist_size); memset(tmp, 0, sizeof(char *) * hist_size); if (current_hist_ind > 1) { memcpy(tmp, History, sizeof(char *) * current_hist_ind); free(History); }; History = tmp; }; hist_ind = current_hist_ind; History[current_hist_ind] = (char *)malloc(1); *(History[current_hist_ind]) = 0; } static void add_to_history(char *line, int index) { if (line == (char *)NULL) return; if (strlen(line) == 0) return; if (index > current_hist_ind) return; if(strcmp(line, History[index]) == 0) return; free(History[index]); History[index] = strdup(line); } static char *get_history_next(char *str) { add_to_history(str, hist_ind); if (current_hist_ind > hist_ind) hist_ind++; else printf("%c", BELL_KEY); return(History[hist_ind]); } static char *get_history_prev(char *str) { add_to_history(str, hist_ind); hist_ind--; if (hist_ind < 0) { hist_ind = 0; printf("%c", BELL_KEY); }; return(History[hist_ind]); } static void go_to_begin(int index) { while (index-- > 0) printf("%c", '\b'); } static int print_str_by_index(char *buf, int index, int cursor_pos) // index - current cursor position // cursor_pos - new cursor position, // if cursor_pos == -1 set to the end of the buf // return value: new cursor position { int n; n = strlen(buf) - index; if (n > 0) printf("%s", buf + index); if ((cursor_pos == -1) || (cursor_pos > strlen(buf))) cursor_pos = strlen(buf); n = strlen(buf) - cursor_pos; go_to_begin(n); return(cursor_pos); } static int clear_line(int index, int length) { go_to_begin(index); memset(clear_buf, ' ', length); clear_buf[length] = 0; return(print_str_by_index(clear_buf, 0, 0)); } static int add_char(char *buf, int length, int c, int index) // return value : new corsor position { int i; if (index >= length) { buf[length++] = c; return(length); }; if ( ! is_insert_key) for (i = length; i > index; i--) buf[i] = buf[i - 1]; buf[index] = c; i = (is_insert_key) ? length - 1 : length; print_str_by_index(buf, index, index + 1); return(index + 1); } static int delete_char(char *buf, int length, int index, int as) // as = 0 - backspace key, 1 - delete key // return value : new corsor position { int n, ind; if (index < 0) return(0); if ((index == length) && as) return(length); ind = (as) ? index : index - 1; memcpy(buf + ind, buf + ind + 1, length - ind - 1); buf[length - 1] = ' '; if (as == 0) printf("%c", '\b'); n = print_str_by_index(buf, ind, ind); buf[length - 1] = 0; return(n); } static int find_cmd_by_text(char *text, int current_index, int forward) { int i, len, is_cmp = 0; len = strlen(text); if (len == 0) return(-1); for (i = current_index; (i >= 0) && (i <= current_hist_ind);) { if (strncmp(History[i], text, len) == 0) { is_cmp = 1; break; }; if (forward) i++; else i--; }; if (is_cmp) return(i); return(-1); } static int find_command(char *line, int curr_index, int forward) { int res, cmd_ind, len, ind, c, line_size; char str[READ_BUF_SIZE]; char text[READ_BUF_SIZE]; len = strlen(line) + strlen(Title); clear_line(len, len); if (forward) { if (curr_index == current_hist_ind) { printf("%c", BELL_KEY); return(curr_index); } } else { if (curr_index <= 0) { printf("%c", BELL_KEY); return(0); } }; memset(text, 0, READ_BUF_SIZE); len = 0; ind = 0; cmd_ind = curr_index; for (;;) { line_size = ind + strlen(History[cmd_ind]); if (forward) res = find_cmd_by_text(text, cmd_ind, 1); else res = find_cmd_by_text(text, cmd_ind, 0); if (res != -1) cmd_ind = res; else printf("%c", BELL_KEY); if (forward) snprintf(str, READ_BUF_SIZE, "(i-search)`%s': ", text); else snprintf(str, READ_BUF_SIZE, "(revers-i-search)`%s': ", text); clear_line(ind, line_size); ind = print_str_by_index(str, 0, -1); print_str_by_index(History[cmd_ind], 0, 0); c = getchar(); if (c == BACKSP_KEY) { len--; if (len < 0) len = 0; text[len] = 0; } else if ((c < ' ') || (c > 'z')) { ungetc(c, stdin); break; }; text[len++] = c; if (len >= READ_BUF_SIZE) break; }; res = ind + strlen(History[cmd_ind]); clear_line(ind, res); return(cmd_ind); } static void check_compl(compl_t *compl_def) { int i, j, len; char *str; if (compl_def->n_items == 0) { compl_def->comp_len = 0; return; }; if (compl_def->n_items == 1) { compl_def->comp_len = strlen(compl_def->items[0]); return; }; str = compl_def->items[0]; len = strlen(str); for (i = 1; i < compl_def->n_items; i++) { for (j = len; j > 0; j--) { if (strncmp(str, compl_def->items[i], j) == 0) break; }; if (j == 0) { compl_def->comp_len = 0; return; }; len = j; }; compl_def->comp_len = len; } static void add_to_compl(char *text, compl_t *compl_def) { char **tmp; int n; n = compl_def->n_items + 1; tmp = (char **)malloc(sizeof(char *) * n); if (compl_def->n_items > 0) { memcpy(tmp, compl_def->items, sizeof(char *) * compl_def->n_items); free(compl_def->items); }; compl_def->items = tmp; tmp[compl_def->n_items] = strdup(text); compl_def->n_items = n; } static int completion_func(int compl_type, char *text, compl_t *compl_def) { int i, len; command_def_t *cmd = NULL; if (compl_def == (compl_t *)NULL) return(0); if (compl_def->n_items > 0) { for (i = 0; i < compl_def->n_items; i++) free(compl_def->items[i]); free(compl_def->items); compl_def->n_items = 0; }; compl_def->comp_len = 0; len = strlen(text); switch (compl_type) { case COMPL_CMD: for (cmd = commands; cmd->cmd != NULL; cmd++) { if ((cmd->type != MAIN_COM) && (cmd->type != block_type) && (cmd->type != UNDEF_COM)) continue; if (strncmp(text, cmd->cmd, len) == 0) add_to_compl(cmd->cmd, compl_def); }; break; case COMPL_NULL: return(0); }; check_compl(compl_def); return(compl_def->n_items); } static int set_term_flags(void) { #ifdef _WIN32 // TODO return 0; #else int res, c; char name[1024]; struct termios termio; if (no_stty == 0) return(0); ctermid(name); termfd = open(name, O_RDWR); if (termfd < 0) { printf("Can not open terminal\n"); return(1); }; c = tcgetattr(termfd, &saved_termio); if (c != 0) { printf("Can not read terminal attrs\n"); return(1); }; termio = saved_termio; c = ICANON | ECHO | ECHOCTL; c = ~c; termio.c_lflag &= c; termio.c_cc[VMIN] = 1; termio.c_cc[VTIME] = 0; res = tcsetattr(termfd, TCSANOW, &termio); no_stty = 0; return(res); #endif } void restore_term_flags(void) { #ifdef _WIN32 // TODO #else if (no_stty) return; tcsetattr(termfd, TCSANOW, &saved_termio); no_stty = 1; #endif } char *get_command_line(int new_cmd, int comp_type) { int c, ind = 0, len = 0, res; char input_buf[READ_BUF_SIZE]; char *str; if (set_term_flags() != 0) exit(1); get_history_new(new_cmd); memset(input_buf, 0, READ_BUF_SIZE); for (;;) { c = getchar(); len = strlen(input_buf); if (len >= (READ_BUF_SIZE - 1)) c = NL_KEY; switch (c) { case CTRL_A_KEY: go_to_begin(ind); ind = print_str_by_index(input_buf, 0, 0); break; case CTRL_B_KEY: printf("%c", '\b'); ind--; if (ind < 0) { ind = 0; printf("%c", ' '); }; break; case CTRL_D_KEY: if (ind == len) break; ind = delete_char(input_buf, len, ind, 1); break; case CTRL_E_KEY: ind = print_str_by_index(input_buf, ind, len); break; case CTRL_G_KEY: case CTRL_L_KEY: printf("%c", c); break; case CTRL_F_KEY: ind = print_str_by_index(input_buf, ind, ind + 1); break; case TAB_KEY: res = completion_func(comp_type, input_buf, &complition_struct); if (res == 0) break; if (res == 1) { strcpy(input_buf, complition_struct.items[0]); strcat(input_buf, " "); ind = print_str_by_index(input_buf, ind, -1); break; }; memset(input_buf, 0, READ_BUF_SIZE); strncpy(input_buf, complition_struct.items[0], complition_struct.comp_len); ind = print_str_by_index(input_buf, ind, -1); break; case NL_KEY: printf("%c", c); if (current_hist_ind != hist_ind) add_to_history(input_buf, hist_ind); if (strlen(input_buf) == 0) return(""); add_to_history(input_buf, current_hist_ind); return(History[current_hist_ind]); case CTRL_K_KEY: clear_line(ind, len); memset(input_buf + ind, 0, len - ind); print_str_by_index(input_buf, 0, ind); break; case CTRL_N_KEY: ungetc(DOWN_KEY, stdin); ungetc(CTRL2_KEY, stdin); ungetc(CTRL1_KEY, stdin); break; case CTRL_R_KEY: case CTRL_S_KEY: res = find_command(input_buf, hist_ind, (c == CTRL_S_KEY)); if (res != hist_ind) { hist_ind = res; memset(input_buf, 0, READ_BUF_SIZE); strcpy(input_buf, History[hist_ind]); }; print_str_by_index(Title, 0, -1); ind = print_str_by_index(input_buf, 0, -1); break; case CTRL1_KEY: c = getchar(); if (c != CTRL2_KEY) break; c = getchar(); switch (c) { case INSERT_KEY: getchar(); is_insert_key = (is_insert_key) ? 0 : 1; break; case DELETE_KEY: getchar(); if (ind == len) break; ind = delete_char(input_buf, len, ind, 1); break; case LEFT_KEY: printf("%c", '\b'); ind--; if (ind < 0) { ind = 0; printf("%c", ' '); }; break; case RIGHT_KEY: ind++; if (ind > len) ind = len; else print_str_by_index(input_buf, ind - 1, ind); break; case UP_KEY: case DOWN_KEY: clear_line(ind, len); if (c == UP_KEY) str = get_history_prev(input_buf); else str = get_history_next(input_buf); memset(input_buf, 0, READ_BUF_SIZE); strcpy(input_buf, str); len = strlen(input_buf); ind = print_str_by_index(input_buf, 0, len); break; case PGUP_KEY: case PGDOWN_KEY: getchar(); add_to_history(input_buf, hist_ind); clear_line(ind, len); hist_ind = (c == PGUP_KEY) ? 0 : current_hist_ind; str = History[hist_ind]; memset(input_buf, 0, READ_BUF_SIZE); strcpy(input_buf, str); len = strlen(input_buf); ind = print_str_by_index(input_buf, 0, len); break; case HOME_KEY: go_to_begin(ind); ind = print_str_by_index(input_buf, 0, 0); break; case END_KEY: ind = print_str_by_index(input_buf, ind, len); break; }; break; case CTRL_H_KEY: case BACKSP_KEY: ind = (ind <= 0) ? 0 : delete_char(input_buf, len, ind, 0); break; default: if (ind == len) { input_buf[ind++] = c; printf("%c", c); break; }; ind = add_char(input_buf, len, c, ind); break; }; if (ind >= (READ_BUF_SIZE - 1)) { if (current_hist_ind != hist_ind) add_to_history(input_buf, hist_ind); add_to_history(input_buf, current_hist_ind); return(History[current_hist_ind]); } }; return((char *)NULL); } void set_current_history(char *line) { if (line == (char *)NULL) return; if (strlen(line) == 0) return; if (strcmp(History[current_hist_ind], line) == 0) return; free(History[current_hist_ind]); History[current_hist_ind] = strdup(line); } char *get_last_history(void) { if (current_hist_ind > 0) return(History[current_hist_ind - 1]); return((char *)NULL); } char *get_def_history(char *text, int *count) { int ind, i, res; char *tmp, c; tmp = text; i = *count; while((*tmp != ' ') && (*tmp != 0)) { tmp++; i++; }; c = *tmp; *tmp = 0; if (isdigit(*text)) { ind = atoi(text); *tmp = c; if ((ind < 0) || (ind > current_hist_ind)) return((char *)NULL); *count = i; return(History[ind]); }; res = find_cmd_by_text(text, current_hist_ind - 1, 0); *tmp = c; if (res == -1) return((char *)NULL); *count = i; return(History[res]); } ret_code_t history_cmd(void) { int i; for (i = 0; i <= current_hist_ind; i++) { printf("[ %d ] %s\n", i, History[i]); }; return(HPI_SHELL_OK); } openhpi-3.6.1/hpi_shell/show.c0000644000175100017510000015703612575647264015304 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Kouzmich < Mikhail.V.Kouzmich@intel.com > * * */ #include #include #include #include #include #include "hpi_ui.h" #define SHOW_BUF_SZ 1024 #define HPIBOOL2STR( x ) ( ( x == SAHPI_TRUE ) ? "TRUE" : "FALSE" ) extern char *lookup_proc(int num, int val); extern SaErrorT decode_proc(int num, void *val, char *buf, int bufsize); extern SaErrorT decode1_proc(int num, int val, char *buf, int bufsize); extern SaErrorT thres_value(SaHpiSensorReadingT *item, char *buf, int size); static int is_ATCA(SaHpiSessionIdT sessionid, SaHpiResourceIdT resourceid) { SaHpiRptEntryT rpt_entry; SaHpiEntityPathT *path; int i; if (saHpiRptEntryGetByResourceId(sessionid, resourceid, &rpt_entry) != SA_OK) return(0); path = &(rpt_entry.ResourceEntity); for (i = 0; i < SAHPI_MAX_ENTITY_PATH; i++) if (path->Entry[i].EntityType == SAHPI_ENT_ADVANCEDTCA_CHASSIS) return(1); return(0); } SaErrorT sensor_list(SaHpiSessionIdT sessionid, hpi_ui_print_cb_t proc) { SaErrorT rv = SA_OK; Pr_ret_t ret; SaHpiRptEntryT rptentry; SaHpiEntryIdT rptentryid; SaHpiEntryIdT nextrptentryid; /* walk the RPT list */ rptentryid = SAHPI_FIRST_ENTRY; while (rptentryid != SAHPI_LAST_ENTRY) { rv = saHpiRptEntryGet(sessionid, rptentryid, &nextrptentryid, &rptentry); if (rv != SA_OK) break; ret = show_sensor_list(sessionid, rptentry.ResourceId, proc); if (ret == HPI_UI_END) return(SA_OK); rptentryid = nextrptentryid; }; return(rv); } Pr_ret_t print_thres_value(SaHpiSensorReadingT *item, char *info, SaHpiSensorThdDefnT *def, int num, hpi_ui_print_cb_t proc) { char mes[256]; char buf[SHOW_BUF_SZ]; int i, j = 0; if (item->IsSupported != SAHPI_TRUE) { snprintf(buf, SHOW_BUF_SZ, "%s not supported.\n", info); return(proc(buf)); }; strcpy(mes, info); if (def != (SaHpiSensorThdDefnT *)NULL) { if (def->ReadThold & num) { if (def->WriteThold & num) strcat(mes, "(RW)"); else strcat(mes, "(RO)"); } else { if (def->WriteThold & num) strcat(mes, "(WO)"); else strcat(mes, "(NA)"); } }; switch (item->Type) { case SAHPI_SENSOR_READING_TYPE_INT64: snprintf(buf, SHOW_BUF_SZ, "%s %" PRId64 "\n", mes, (int64_t)item->Value.SensorInt64); break; case SAHPI_SENSOR_READING_TYPE_UINT64: snprintf(buf, SHOW_BUF_SZ, "%s %" PRIu64 "\n", mes, (uint64_t)item->Value.SensorUint64); break; case SAHPI_SENSOR_READING_TYPE_FLOAT64: snprintf(buf, SHOW_BUF_SZ, "%s %10.3f\n", mes, item->Value.SensorFloat64); break; case SAHPI_SENSOR_READING_TYPE_BUFFER: j = snprintf(buf, SHOW_BUF_SZ, "%s ", mes); for (i = 0; i < SAHPI_SENSOR_BUFFER_LENGTH; i++) { j = j + snprintf(buf + j, SHOW_BUF_SZ-j,"%02x", item->Value.SensorBuffer[i]); if (j >= SHOW_BUF_SZ) break; } if (j < SHOW_BUF_SZ) sprintf(buf + j, "\n"); break; }; return(proc(buf)); } int show_threshold(SaHpiSessionIdT sessionid, SaHpiResourceIdT resourceid, SaHpiSensorNumT sensornum, SaHpiSensorRecT *sen, hpi_ui_print_cb_t proc) { SaErrorT rv; SaHpiSensorThresholdsT senstbuff; SaHpiSensorThdDefnT *sendef; SaHpiSensorTypeT type; SaHpiEventCategoryT categ; char buf[SHOW_BUF_SZ]; Pr_ret_t res; sendef = &(sen->ThresholdDefn); rv = saHpiSensorTypeGet(sessionid, resourceid, sensornum, &type, &categ); if (rv != SA_OK) { snprintf(buf, SHOW_BUF_SZ, "ERROR: saHpiSensorTypeGet error = %s\n", oh_lookup_error(rv)); proc(buf); return -1; }; if (categ != SAHPI_EC_THRESHOLD) return(SA_OK); if (sendef->IsAccessible == SAHPI_FALSE) { proc("Thresholds are not accessible.\n"); return(SA_OK); } if (sendef->ReadThold == 0) { proc("Thresholds are not readable.\n"); return(SA_OK); } memset(&senstbuff, 0, sizeof(SaHpiSensorThresholdsT)); rv = saHpiSensorThresholdsGet(sessionid, resourceid, sensornum, &senstbuff); if (rv != SA_OK) { snprintf(buf, SHOW_BUF_SZ, "ERROR: saHpiSensorThresholdsGet error = %s\n", oh_lookup_error(rv)); proc(buf); return -1; }; res = print_thres_value(&(senstbuff.LowMinor), "Lower Minor Threshold", sendef, SAHPI_ES_LOWER_MINOR, proc); if (res == HPI_UI_END) return(HPI_UI_END); res = print_thres_value(&(senstbuff.LowMajor), "Lower Major Threshold", sendef, SAHPI_ES_LOWER_MAJOR, proc); if (res == HPI_UI_END) return(HPI_UI_END); res = print_thres_value(&(senstbuff.LowCritical), "Lower Critical Threshold", sendef, SAHPI_ES_LOWER_CRIT, proc); if (res == HPI_UI_END) return(HPI_UI_END); res = print_thres_value(&(senstbuff.UpMinor), "Upper Minor Threshold", sendef, SAHPI_ES_UPPER_MINOR, proc); if (res == HPI_UI_END) return(HPI_UI_END); res = print_thres_value(&(senstbuff.UpMajor), "Upper Major Threshold", sendef, SAHPI_ES_UPPER_MAJOR, proc); if (res == HPI_UI_END) return(HPI_UI_END); res = print_thres_value(&(senstbuff.UpCritical), "Upper Critical Threshold", sendef, SAHPI_ES_UPPER_CRIT, proc); if (res == HPI_UI_END) return(HPI_UI_END); res = print_thres_value(&(senstbuff.PosThdHysteresis), "Positive Threshold Hysteresis", NULL, 0, proc); if (res == HPI_UI_END) return(HPI_UI_END); res = print_thres_value(&(senstbuff.NegThdHysteresis), "Negative Threshold Hysteresis", NULL, 0, proc); return SA_OK; } SaErrorT show_control(SaHpiSessionIdT sessionid, SaHpiResourceIdT resourceid, SaHpiCtrlNumT num, hpi_ui_print_cb_t proc) { SaErrorT rv; SaHpiRdrT rdr; SaHpiCtrlRecT *ctrl; char *str, *str1; char buf[SHOW_BUF_SZ]; char errbuf[SHOW_BUF_SZ]; SaHpiCtrlTypeT type; SaHpiCtrlRecDigitalT *digit; SaHpiCtrlRecDiscreteT *discr; SaHpiCtrlRecAnalogT *analog; SaHpiCtrlRecStreamT *stream; SaHpiCtrlRecTextT *text; SaHpiCtrlRecOemT *oem; int i, i0; rv = saHpiRdrGetByInstrumentId(sessionid, resourceid, SAHPI_CTRL_RDR, num, &rdr); if (rv != SA_OK) { snprintf(errbuf, SHOW_BUF_SZ, "\nERROR: saHpiRdrGetByInstrumentId: error: %s\n", oh_lookup_error(rv)); proc(errbuf); return(rv); }; ctrl = &(rdr.RdrTypeUnion.CtrlRec); type = ctrl->Type; if (ctrl->WriteOnly) str = "(Write Only)"; else str = " "; snprintf(buf, SHOW_BUF_SZ, "Control(%d/%d) Type: %s %s Output: %s\n", resourceid, num, oh_lookup_ctrltype(type), str, oh_lookup_ctrloutputtype(ctrl->OutputType)); if (proc(buf) != HPI_UI_OK) return(SA_OK); if (ctrl->DefaultMode.ReadOnly) str = "(Read Only)"; else str = " "; snprintf(buf, SHOW_BUF_SZ, "Default Mode: %s %s\n", oh_lookup_ctrlmode(ctrl->DefaultMode.Mode), str); if (proc(buf) != HPI_UI_OK) return(SA_OK); if (proc("Default Data:\n") != HPI_UI_OK) return(SA_OK); switch (type) { case SAHPI_CTRL_TYPE_DIGITAL: digit = &(ctrl->TypeUnion.Digital); str = oh_lookup_ctrlstatedigital(digit->Default); if (str == (char *)NULL) { snprintf(errbuf, SHOW_BUF_SZ, "Invalid value (0x%x)", digit->Default); str = errbuf; }; snprintf(buf, SHOW_BUF_SZ, "\tDefault: %s\n", str); break; case SAHPI_CTRL_TYPE_DISCRETE: discr = &(ctrl->TypeUnion.Discrete); snprintf(buf, SHOW_BUF_SZ, "\tDefault: %d\n", discr->Default); break; case SAHPI_CTRL_TYPE_ANALOG: analog = &(ctrl->TypeUnion.Analog); snprintf(buf, SHOW_BUF_SZ, "\tDefault: %d (min = %d max = %d)\n", analog->Default, analog->Min, analog->Max); break; case SAHPI_CTRL_TYPE_STREAM: stream = &(ctrl->TypeUnion.Stream); snprintf(buf, SHOW_BUF_SZ, "\tDefault: Repeat = %d lendth = %d stream = %s\n", stream->Default.Repeat, stream->Default.StreamLength, stream->Default.Stream); break; case SAHPI_CTRL_TYPE_TEXT: text = &(ctrl->TypeUnion.Text); snprintf(buf, SHOW_BUF_SZ, "\tMaxChars = %d MaxLines = %d\n", text->MaxChars, text->MaxLines); if (proc(buf) != HPI_UI_OK) return(SA_OK); str = oh_lookup_language(text->Language); if (str == (char *)NULL) str = "UNKNOWN"; str1 = oh_lookup_texttype(text->DataType); if (str1 == (char *)NULL) str1 = "UNKNOWN"; snprintf(buf, SHOW_BUF_SZ, "\tLanguage = %s DataType = %s\n", str, str1); if (proc(buf) != HPI_UI_OK) return(SA_OK); snprintf(buf, SHOW_BUF_SZ, "\tDefault: Line # = %d", text->Default.Line); if (proc(buf) != HPI_UI_OK) return(SA_OK); print_text_buffer_text(" Text = ", &(text->Default.Text), "\n", proc); return SA_OK; case SAHPI_CTRL_TYPE_OEM: oem = &(ctrl->TypeUnion.Oem); snprintf(buf, SHOW_BUF_SZ, "\tMId = %d Config data = ", oem->MId); proc(buf); str = (char *)(oem->ConfigData); for (i = 0; i < SAHPI_CTRL_OEM_CONFIG_LENGTH; i++) sprintf(buf + i * 3, "%2.2X ", (unsigned char)(str[i])); strcat(buf, "\n\t"); if (proc(buf) != HPI_UI_OK) return(SA_OK); sprintf(buf, "Default: MId = %d Body = ", oem->MId); str = (char *)(oem->Default.Body); i0 = strlen( buf ); for (i = 0; i < oem->Default.BodyLength; i++) sprintf(buf + i0 + i * 3, "%2.2X ", (unsigned char)(str[i])); strcat(buf, "\n"); break; default: strcpy(buf, "Unknown control type\n"); }; proc(buf); return SA_OK; } SaErrorT show_control_state(SaHpiSessionIdT sessionid, SaHpiResourceIdT resourceid, SaHpiCtrlNumT num, hpi_ui_print_cb_t proc, get_int_param_t get_int_param) { SaErrorT rv; int i; int res; char *str; char buf[SHOW_BUF_SZ]; char errbuf[SHOW_BUF_SZ]; SaHpiCtrlModeT mode; SaHpiCtrlStateT state; SaHpiCtrlTypeT type; SaHpiCtrlStateDigitalT digit; SaHpiCtrlStateDiscreteT discr; SaHpiCtrlStateAnalogT analog; SaHpiCtrlStateStreamT *stream; SaHpiCtrlStateTextT *text; SaHpiCtrlStateOemT *oem; rv = saHpiControlTypeGet(sessionid, resourceid, num, &type); if (rv != SA_OK) { snprintf(errbuf, SHOW_BUF_SZ, "\nERROR: saHpiControlTypeGet: error: %s\n", oh_lookup_error(rv)); proc(errbuf); return(rv); }; state.Type = type; if (type == SAHPI_CTRL_TYPE_TEXT) { i = get_int_param("Line #(0 == all): ", &res); if (i != 1) { printf("Invalid value\n"); return SA_ERR_HPI_ERROR; }; state.StateUnion.Text.Line = res; } rv = saHpiControlGet(sessionid, resourceid, num, &mode, &state); if (rv != SA_OK) { snprintf(errbuf, SHOW_BUF_SZ, "\nERROR: saHpiControlGet: error: %s\n", oh_lookup_error(rv)); proc(errbuf); return(rv); }; type = state.Type; snprintf(buf, SHOW_BUF_SZ, "Control(%d/%d) %s State: ", resourceid, num, oh_lookup_ctrlmode(mode)); if (proc(buf) != HPI_UI_OK) return(SA_OK); switch (type) { case SAHPI_CTRL_TYPE_DIGITAL: digit = state.StateUnion.Digital; str = oh_lookup_ctrlstatedigital(digit); if (str == (char *)NULL) { snprintf(errbuf, SHOW_BUF_SZ, "Invalid value (0x%x)", digit); str = errbuf; }; snprintf(buf, SHOW_BUF_SZ, "%s\n", str); break; case SAHPI_CTRL_TYPE_DISCRETE: discr = state.StateUnion.Discrete; snprintf(buf, SHOW_BUF_SZ, "%d\n", discr); break; case SAHPI_CTRL_TYPE_ANALOG: analog = state.StateUnion.Analog; snprintf(buf, SHOW_BUF_SZ, "%d\n", analog); break; case SAHPI_CTRL_TYPE_STREAM: stream = &(state.StateUnion.Stream); snprintf(buf, SHOW_BUF_SZ, "Repeat = %d lendth = %d stream = %s\n", stream->Repeat, stream->StreamLength, stream->Stream); break; case SAHPI_CTRL_TYPE_TEXT: text = &(state.StateUnion.Text); snprintf(buf, SHOW_BUF_SZ, "Line # = %d", text->Line); if (proc(buf) != HPI_UI_OK) return(SA_OK); print_text_buffer_text(" Text = ", &(text->Text), "\n", proc); return SA_OK; case SAHPI_CTRL_TYPE_OEM: oem = &(state.StateUnion.Oem); str = (char *)(oem->Body); if (is_ATCA(sessionid, resourceid) && (oem->MId == ATCAHPI_PICMG_MID)) snprintf(buf, SHOW_BUF_SZ, "MId = %d Color = %s Body = ", oem->MId, oh_lookup_atcahpiledcolor(str[2])); else snprintf(buf, SHOW_BUF_SZ, "MId = %d Body = ", oem->MId); proc(buf); for (i = 0; i < oem->BodyLength; i++) sprintf(buf + i * 3, "%2.2X ", (unsigned char)(str[i])); strcat(buf, "\n"); break; default: strcpy(buf, "Unknown control type\n"); }; proc(buf); return SA_OK; } SaErrorT show_sensor(SaHpiSessionIdT sessionid, SaHpiResourceIdT resourceid, SaHpiSensorNumT sensornum, hpi_ui_print_cb_t proc) { SaHpiSensorReadingT reading; SaHpiEventStateT status, assert, deassert; SaHpiRdrT rdr; SaErrorT rv; SaHpiBoolT val; char buf[SHOW_BUF_SZ]; char errbuf[SHOW_BUF_SZ]; Pr_ret_t res; rv = saHpiRdrGetByInstrumentId(sessionid, resourceid, SAHPI_SENSOR_RDR, sensornum, &rdr); if (rv != SA_OK) { snprintf(errbuf, SHOW_BUF_SZ, "\nERROR: saHpiRdrGetByInstrumentId: error: %s\n", oh_lookup_error(rv)); proc(errbuf); return(rv); }; snprintf(buf, SHOW_BUF_SZ, "Sensor(%d/%d) %s", resourceid, sensornum, oh_lookup_sensortype(rdr.RdrTypeUnion.SensorRec.Type)); proc(buf); res = print_text_buffer_text(" ", &(rdr.IdString), "\n", proc); if (res != HPI_UI_OK) return(SA_OK); rv = saHpiSensorEnableGet(sessionid, resourceid, sensornum, &val); if (rv != SA_OK) { snprintf(errbuf, SHOW_BUF_SZ, "\nERROR: saHpiSensorEnableGet: error: %s\n", oh_lookup_error(rv)); if (proc(errbuf) != HPI_UI_OK) return(rv); } else { if (val) res = proc("Enable "); else res = proc("Disable "); if (res != HPI_UI_OK) return(SA_OK); }; rv = saHpiSensorEventEnableGet(sessionid, resourceid, sensornum, &val); if (rv != SA_OK) { snprintf(errbuf, SHOW_BUF_SZ, "\nERROR: saHpiSensorEventEnableGet: error: %s\n", oh_lookup_error(rv)); if (proc(errbuf) != HPI_UI_OK) return(rv); } else { if (proc(" event : ") != HPI_UI_OK) return(SA_OK); if (val) res = proc("Enable"); else res = proc("Disable"); if (res != HPI_UI_OK) return(SA_OK); }; rv = saHpiSensorEventMasksGet(sessionid, resourceid, sensornum, &assert, &deassert); if (rv != SA_OK) { snprintf(errbuf, SHOW_BUF_SZ, "\nERROR: saHpiSensorEventMasksGet: error: %s\n", oh_lookup_error(rv)); if (proc(errbuf) != HPI_UI_OK) return(rv); } else { snprintf(buf, SHOW_BUF_SZ, " supported: 0x%4.4x masks: assert = 0x%4.4x" " deassert = 0x%4.4x\n", rdr.RdrTypeUnion.SensorRec.Events, assert, deassert); if (proc(buf) != HPI_UI_OK) return(rv); }; rv = saHpiSensorReadingGet(sessionid, resourceid, sensornum, &reading, &status); if (rv != SA_OK) { snprintf(errbuf, SHOW_BUF_SZ, "\nERROR: saHpiSensorReadingGet: error: %s\n", oh_lookup_error(rv)); proc(errbuf); return(rv); }; snprintf(buf, SHOW_BUF_SZ, "\tEvent states = 0x%x\n", status); if (proc(buf) != HPI_UI_OK) return(SA_OK); if (reading.IsSupported) { res = print_thres_value(&reading, "\tReading Value =", NULL, 0, proc); if (res == HPI_UI_END) return(SA_OK); } else { if (proc("\tReading not supported\n") != HPI_UI_OK) return(SA_OK); } show_threshold(sessionid, resourceid, sensornum, &(rdr.RdrTypeUnion.SensorRec), proc); return SA_OK; } SaErrorT show_event_log(SaHpiSessionIdT sessionid, SaHpiResourceIdT resourceid, int show_short, hpi_ui_print_cb_t proc) { SaErrorT rv = SA_OK; SaHpiRptEntryT rptentry; SaHpiEventLogInfoT info; SaHpiEventLogEntryIdT entryid; SaHpiEventLogEntryIdT nextentryid; SaHpiEventLogEntryIdT preventryid; SaHpiEventLogEntryT sel; SaHpiRdrT rdr; SaHpiRptEntryT rpt; char buf[SHOW_BUF_SZ]; SaHpiTextBufferT tb; if (resourceid != SAHPI_UNSPECIFIED_RESOURCE_ID) { rv = saHpiRptEntryGetByResourceId(sessionid, resourceid, &rptentry); if (rv != SA_OK) { snprintf(buf, SHOW_BUF_SZ, "ERROR: saHpiRptEntryGetByResourceId error = %s\n", oh_lookup_error(rv)); proc(buf); return rv; }; if (!(rptentry.ResourceCapabilities & SAHPI_CAPABILITY_EVENT_LOG)) { proc("ERROR: The designated resource hasn't SEL.\n"); return SA_OK; } }; rv = saHpiEventLogInfoGet(sessionid, resourceid, &info); if (rv != SA_OK) { snprintf(buf, SHOW_BUF_SZ, "ERROR: saHpiEventLogInfoGet error = %s\n", oh_lookup_error(rv)); proc(buf); return rv; } snprintf(buf, SHOW_BUF_SZ, "EventLog: entries = %d, size = %d, enabled = %d\n", info.Entries, info.Size, info.Enabled); if (proc(buf) != HPI_UI_OK) return(SA_OK); oh_decode_time(info.UpdateTimestamp, &tb); print_text_buffer_text("UpdateTime = ", &tb, " ", proc); oh_decode_time(info.CurrentTime, &tb); print_text_buffer_text("CurrentTime = ", &tb, " ", proc); snprintf(buf, SHOW_BUF_SZ, "Overflow = %d\n", info.OverflowFlag); if (proc(buf) != HPI_UI_OK) return(SA_OK); if (info.Entries != 0){ entryid = SAHPI_OLDEST_ENTRY; while (entryid != SAHPI_NO_MORE_ENTRIES) { rv = saHpiEventLogEntryGet(sessionid, resourceid, entryid, &preventryid, &nextentryid, &sel, &rdr, &rpt); if (rv != SA_OK) { snprintf(buf, SHOW_BUF_SZ, "ERROR: saHpiEventLogEntryGet error = %s\n", oh_lookup_error(rv)); proc(buf); return -1; }; if (show_short) { if (show_short_event(&(sel.Event), proc) != HPI_UI_OK) return(SA_OK); } else { if (rpt.ResourceCapabilities != 0) { oh_print_eventlogentry(&sel, &rpt.ResourceEntity, 1); } else if (rdr.RdrType != SAHPI_NO_RECORD) { oh_print_eventlogentry(&sel, &rdr.Entity, 1); } else { oh_print_eventlogentry(&sel, NULL, 1); } } preventryid = entryid; entryid = nextentryid; } } else { proc("SEL is empty\n"); }; return SA_OK; } Pr_ret_t show_sensor_list(SaHpiSessionIdT sessionid, SaHpiResourceIdT resourceid, hpi_ui_print_cb_t proc) { SaErrorT rv = SA_OK; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiRdrT rdr; char buf[SHOW_BUF_SZ]; entryid = SAHPI_FIRST_ENTRY; while (entryid != SAHPI_LAST_ENTRY) { rv = saHpiRdrGet(sessionid, resourceid, entryid, &nextentryid, &rdr); if (rv != SA_OK) break; if (rdr.RdrType == SAHPI_SENSOR_RDR) { snprintf(buf, 256, "Resource Id: %d, Sensor Num: %d", resourceid, rdr.RdrTypeUnion.SensorRec.Num); if (proc(buf) != 0) return(HPI_UI_END); if (print_text_buffer_text(", Tag: ", &(rdr.IdString), NULL, proc) != 0) return(-1); if (proc("\n") != 0) return(HPI_UI_END); }; entryid = nextentryid; }; return(HPI_UI_OK); } int show_rdr_list(Domain_t *domain, SaHpiResourceIdT rptid, SaHpiRdrTypeT passed_type, hpi_ui_print_cb_t proc) // return: list size { SaHpiRdrT rdr; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; char buf[SHOW_BUF_SZ]; SaHpiRdrTypeT type; char ar[256]; SaHpiSensorRecT *sensor; SaErrorT ret; int res_num = 0; entryid = SAHPI_FIRST_ENTRY; while (entryid !=SAHPI_LAST_ENTRY) { memset(buf, 0, SHOW_BUF_SZ); memset(ar, 0, 256); ret = saHpiRdrGet(domain->sessionId, rptid, entryid, &nextentryid, &rdr); if (ret != SA_OK) return(res_num); type = rdr.RdrType; if ((passed_type != SAHPI_NO_RECORD) && (type != passed_type)) { entryid = nextentryid; continue; }; snprintf(buf, SHOW_BUF_SZ, "(%3.3d): %s ID=%u", oh_get_rdr_num(rdr.RecordId), oh_lookup_rdrtype(type), rdr.RecordId); switch (type) { case SAHPI_SENSOR_RDR: sensor = &(rdr.RdrTypeUnion.SensorRec); snprintf(ar, 256, ", Ctrl=%d, EvtCtrl=", sensor->EnableCtrl); switch (sensor->EventCtrl) { case SAHPI_SEC_PER_EVENT: strcat(ar, "WR"); break; case SAHPI_SEC_READ_ONLY_MASKS: strcat(ar, "RM"); break; default: strcat(ar, "RO"); break; }; break; case SAHPI_CTRL_RDR: break; case SAHPI_INVENTORY_RDR: break; case SAHPI_WATCHDOG_RDR: break; case SAHPI_ANNUNCIATOR_RDR: break; case SAHPI_DIMI_RDR: break; case SAHPI_FUMI_RDR: break; default: snprintf(ar, 256, ", Unrecognized RDR Type"); }; strcat(buf, ar); res_num++; if (proc(buf) != HPI_UI_OK) return(res_num); if (print_text_buffer_text(", Tag=", &(rdr.IdString), "\n", proc) != HPI_UI_OK) return(res_num); entryid = nextentryid; }; return(res_num); } typedef struct { int len_buf; char outbuf[SHOW_BUF_SZ]; SaHpiEntityPathT path; } rpt_outbuf_t; static int lsres_sort(void *st1, void *st2) { int i, n1, n2; rpt_outbuf_t *ar1 = (rpt_outbuf_t *)st1; rpt_outbuf_t *ar2 = (rpt_outbuf_t *)st2; for (i = 0; i < SAHPI_MAX_ENTITY_PATH; i++) if (ar1->path.Entry[i].EntityType == SAHPI_ENT_ROOT) break; n1 = i; for (i = 0; i < SAHPI_MAX_ENTITY_PATH; i++) if (ar2->path.Entry[i].EntityType == SAHPI_ENT_ROOT) break; n2 = i; while ((n1 >= 0) && (n2 >= 0)) { if (ar1->path.Entry[n1].EntityType > ar2->path.Entry[n2].EntityType) return(1); if (ar1->path.Entry[n1].EntityType < ar2->path.Entry[n2].EntityType) return(-1); if (ar1->path.Entry[n1].EntityLocation > ar2->path.Entry[n2].EntityLocation) return(1); if (ar1->path.Entry[n1].EntityLocation < ar2->path.Entry[n2].EntityLocation) return(-1); n1--; n2--; }; if (n1 >= 0) return(1); if (n2 >= 0) return(-1); return(0); } static void print_rpt_paths(rpt_outbuf_t *ar, int len, hpi_ui_print_cb_t proc) { int i, max_len = 0; char buf[SHOW_BUF_SZ]; oh_big_textbuffer tmpbuf; SaErrorT rv; for (i = 0; i < len; i++) { if (ar[i].len_buf > max_len) max_len = ar[i].len_buf; }; qsort(ar, len, sizeof(rpt_outbuf_t), (int(*)(const void *, const void *))lsres_sort); for (i = 0; i < len; i++) { if (ar[i].len_buf == 0) continue; memset(buf, ' ', SHOW_BUF_SZ); strncpy(buf, ar[i].outbuf, ar[i].len_buf); buf[max_len + 1] = 0; strcat(buf, ": "); rv = oh_decode_entitypath(&(ar[i].path), &tmpbuf); if (rv == SA_OK) { strcat(buf, (char *)(tmpbuf.Data)); }; strcat(buf, "\n"); if (proc(buf) != HPI_UI_OK) return; } } int show_rpt_list(Domain_t *domain, int as, SaHpiResourceIdT rptid, int addedfields, hpi_ui_print_cb_t proc) /* as : SHOW_ALL_RPT - show all rpt entry only * SHOW_ALL_RDR - show all rdr for all rpt * SHOW_RPT_RDR - show all rdr for rptid * addedfields : SHORT_LSRES - traditional resource list * STATE_LSRES - show resource status * PATH_LSRES - show entity path * return: list size */ { SaHpiRptEntryT rpt_entry; SaHpiEntryIdT rptentryid, nextrptentryid; int ind = 0, show_path; char buf[SHOW_BUF_SZ]; SaErrorT rv; SaHpiCapabilitiesT cap; SaHpiHsCapabilitiesT hscap; SaHpiHsStateT state; rpt_outbuf_t *rpt_out = NULL, *tmp; int res_num = 0, n_rpt = 0, max_rpt = 0; if (as != SHOW_ALL_RPT) show_path = 0; else show_path = addedfields & PATH_LSRES; rptentryid = SAHPI_FIRST_ENTRY; while (rptentryid != SAHPI_LAST_ENTRY) { rv = saHpiRptEntryGet(domain->sessionId, rptentryid, &nextrptentryid, &rpt_entry); if (rv != SA_OK) break; if ((as == SHOW_RPT_RDR) && (rpt_entry.ResourceId != rptid)) { rptentryid = nextrptentryid; continue; }; res_num++; snprintf(buf, SHOW_BUF_SZ, "(%3.3d):", rpt_entry.ResourceId); get_text_buffer_text(NULL, &(rpt_entry.ResourceTag), ":", buf + strlen(buf)); strcat(buf, "{"); cap = rpt_entry.ResourceCapabilities; if (cap & SAHPI_CAPABILITY_SENSOR) strcat(buf, "S|"); if (cap & SAHPI_CAPABILITY_RDR) strcat(buf, "RDR|"); if (cap & SAHPI_CAPABILITY_EVENT_LOG) strcat(buf, "ELOG|"); if (cap & SAHPI_CAPABILITY_INVENTORY_DATA) strcat(buf, "INV|"); if (cap & SAHPI_CAPABILITY_RESET) strcat(buf, "RST|"); if (cap & SAHPI_CAPABILITY_POWER) strcat(buf, "PWR|"); if (cap & SAHPI_CAPABILITY_ANNUNCIATOR) strcat(buf, "AN|"); if (cap & SAHPI_CAPABILITY_FRU) strcat(buf, "FRU|"); if (cap & SAHPI_CAPABILITY_CONTROL) strcat(buf, "CNT|"); if (cap & SAHPI_CAPABILITY_WATCHDOG) strcat(buf, "WDT|"); if (cap & SAHPI_CAPABILITY_MANAGED_HOTSWAP) strcat(buf, "HS|"); if (cap & SAHPI_CAPABILITY_CONFIGURATION) strcat(buf, "CF |"); if (cap & SAHPI_CAPABILITY_AGGREGATE_STATUS) strcat(buf, "AG|"); if (cap & SAHPI_CAPABILITY_EVT_DEASSERTS) strcat(buf, "DS|"); if (cap & SAHPI_CAPABILITY_RESOURCE) strcat(buf, "RES|"); if (cap & SAHPI_CAPABILITY_DIMI) strcat(buf, "DIMI|"); if (cap & SAHPI_CAPABILITY_FUMI) strcat(buf, "FUMI|"); ind = strlen(buf); if (buf[ind - 1] == '|') buf[ind - 1] = 0; strcat(buf, "}"); if (addedfields & STATE_LSRES) { rv = saHpiHotSwapStateGet(domain->sessionId, rpt_entry.ResourceId, &state); hscap = rpt_entry.HotSwapCapabilities; if ((rv == SA_OK) || (hscap != 0)) { strcat(buf, " HS={"); if (rv == SA_OK) strcat(buf, oh_lookup_hsstate(state)); if (hscap & SAHPI_HS_CAPABILITY_AUTOEXTRACT_READ_ONLY) strcat(buf, " RO|"); if (hscap & SAHPI_HS_CAPABILITY_INDICATOR_SUPPORTED) strcat(buf, " IND|"); ind = strlen(buf); if (buf[ind - 1] == '|') buf[ind - 1] = 0; strcat(buf, "}"); } }; if (show_path) { if (n_rpt >= max_rpt) { max_rpt += 10; tmp = (rpt_outbuf_t *)malloc(sizeof(rpt_outbuf_t) * max_rpt); memset(tmp, 0, sizeof(rpt_outbuf_t) * max_rpt); if (n_rpt > 0) { memcpy(tmp, rpt_out, sizeof(rpt_outbuf_t) * n_rpt); free(rpt_out); }; rpt_out = tmp; }; tmp = rpt_out + n_rpt; tmp->len_buf = strlen(buf); if (tmp->len_buf > 0) { strcpy(tmp->outbuf, buf); tmp->path = rpt_entry.ResourceEntity; n_rpt++; } } else { strcat(buf, "\n"); if (proc(buf) != HPI_UI_OK) return(res_num); if (as == SHOW_ALL_RDR) show_rdr_list(domain, rpt_entry.ResourceId, SAHPI_NO_RECORD, proc); }; rptentryid = nextrptentryid; }; if (show_path) { print_rpt_paths(rpt_out, n_rpt, proc); free(rpt_out); }; return(res_num); } static Pr_ret_t show_attrs(Attributes_t *Attrs, int delta, hpi_ui_print_cb_t proc) { int i, type, len, del; char tmp[256], *name; char buf[SHOW_BUF_SZ]; union_type_t val; SaErrorT rv; Pr_ret_t ret; memset(buf, ' ', SHOW_BUF_SZ); del = delta << 1; len = SHOW_BUF_SZ - del; for (i = 0; i < Attrs->n_attrs; i++) { name = get_attr_name(Attrs, i); if (name == (char *)NULL) break; rv = get_value(Attrs, i, &val); if (rv != SA_OK) continue; type = get_attr_type(Attrs, i); switch (type) { case NO_TYPE: continue; case STRUCT_TYPE: snprintf(buf + del, len, "%s:\n", name); if (proc(buf) != 0) return(-1); rv = get_value(Attrs, i, &val); if (rv != SA_OK) continue; ret = show_attrs((Attributes_t *)(val.a), delta + 1, proc); if (ret != HPI_UI_OK) return(HPI_UI_END); continue; case LOOKUP_TYPE: strncpy(tmp, lookup_proc(Attrs->Attrs[i].lunum, val.i), 256); break; case DECODE_TYPE: rv = decode_proc(Attrs->Attrs[i].lunum, val.a, tmp, 256); if (rv != SA_OK) continue; break; case DECODE1_TYPE: rv = decode1_proc(Attrs->Attrs[i].lunum, val.i, tmp, 256); if (rv != SA_OK) continue; break; case READING_TYPE: if (thres_value(val.a, tmp, 256) != SA_OK) continue; break; case TEXT_BUFF_TYPE: snprintf(buf + del, len, "%s: ", name); if (proc(buf) != HPI_UI_OK) return(HPI_UI_END); ret = print_text_buffer(NULL, val.a, "\n", proc); if (ret != HPI_UI_OK) return(HPI_UI_END); continue; default: rv = get_value_as_string(Attrs, i, tmp, 256); if (rv != SA_OK) continue; }; snprintf(buf + del, len, "%s: %s\n", name, tmp); if (proc(buf) != HPI_UI_OK) return(HPI_UI_END); }; return(0); } SaErrorT show_Rpt(Rpt_t *Rpt, hpi_ui_print_cb_t proc) { show_attrs(&(Rpt->Attrutes), 0, proc); return(SA_OK); } SaErrorT show_Rdr(Rdr_t *Rdr, hpi_ui_print_cb_t proc) { show_attrs(&(Rdr->Attrutes), 0, proc); return(SA_OK); } Pr_ret_t show_short_event(SaHpiEventT *event, hpi_ui_print_cb_t proc) { SaHpiTextBufferT tmbuf; SaHpiSensorEventT *sen; SaHpiDomainEventT *dom; SaErrorT rv; char buf[SHOW_BUF_SZ], buf1[32]; char *str, *str1; rv = oh_decode_time(event->Timestamp, &tmbuf); if (rv) snprintf(buf, SHOW_BUF_SZ, "%19s ", "TIME UNSPECIFIED"); else snprintf(buf, SHOW_BUF_SZ, "%19s ", tmbuf.Data); proc(buf); snprintf(buf, SHOW_BUF_SZ, "%s ", oh_lookup_eventtype(event->EventType)); proc(buf); switch (event->EventType) { case SAHPI_ET_DOMAIN: dom = &(event->EventDataUnion.DomainEvent); snprintf(buf, SHOW_BUF_SZ, " Event: %s DomainId: %d", oh_lookup_domaineventtype(dom->Type), dom->DomainId); proc(buf); break; case SAHPI_ET_SENSOR: sen = &(event->EventDataUnion.SensorEvent); if (sen->Assertion == SAHPI_TRUE) str = "ASSERTED"; else str = "DEASSERTED"; rv = oh_decode_eventstate(sen->EventState, sen->EventCategory, &tmbuf); if (rv != SA_OK) { snprintf(buf1, 32, "STATE(%4.4x)", sen->EventState); str1 = buf1; } else str1 = (char *)(tmbuf.Data); snprintf(buf, SHOW_BUF_SZ, "%s %d/%d %s %s %s:%s", oh_lookup_sensortype(sen->SensorType), event->Source, sen->SensorNum, oh_lookup_severity(event->Severity), oh_lookup_eventcategory(sen->EventCategory), str1, str); proc(buf); break; case SAHPI_ET_RESOURCE: snprintf(buf, SHOW_BUF_SZ, "%d %s %s", event->Source, oh_lookup_severity(event->Severity), oh_lookup_resourceeventtype(event->EventDataUnion. ResourceEvent.ResourceEventType)); proc(buf); break; case SAHPI_ET_HOTSWAP: snprintf(buf, SHOW_BUF_SZ, "%d %s %s -> %s", event->Source, oh_lookup_severity(event->Severity), oh_lookup_hsstate( event->EventDataUnion.HotSwapEvent. PreviousHotSwapState), oh_lookup_hsstate( event->EventDataUnion.HotSwapEvent.HotSwapState)); if (proc(buf) != HPI_UI_OK) return(HPI_UI_END); break; case SAHPI_ET_DIMI: snprintf(buf, SHOW_BUF_SZ, "RESOURCE %d DIMI %d TEST %d : %s", event->Source, event->EventDataUnion.DimiEvent.DimiNum, event->EventDataUnion.DimiEvent.TestNum, oh_lookup_dimitestrunstatus(event->EventDataUnion.DimiEvent.DimiTestRunStatus)); proc(buf); break; case SAHPI_ET_DIMI_UPDATE: snprintf(buf, SHOW_BUF_SZ, "RESOURCE %d DIMI %d", event->Source, event->EventDataUnion.DimiUpdateEvent.DimiNum); proc(buf); break; case SAHPI_ET_FUMI: snprintf(buf, SHOW_BUF_SZ, "RESOURCE %d FUMI %d BANK %d : %s", event->Source, event->EventDataUnion.FumiEvent.FumiNum, event->EventDataUnion.FumiEvent.BankNum, oh_lookup_fumiupgradestatus(event->EventDataUnion.FumiEvent.UpgradeStatus)); proc(buf); break; default: snprintf(buf, SHOW_BUF_SZ, "%d", event->Source); proc(buf); break; }; return(proc("\n")); } SaErrorT show_dat(Domain_t *domain, hpi_ui_print_cb_t proc) { SaHpiAlarmT alarm; SaErrorT rv = SA_OK; char buf[SHOW_BUF_SZ]; SaHpiTextBufferT tb; char tbuf[SHOW_BUF_SZ]; int ind; int first = 1; alarm.AlarmId = SAHPI_FIRST_ENTRY; while (rv == SA_OK) { rv = saHpiAlarmGetNext(domain->sessionId, SAHPI_ALL_SEVERITIES, FALSE, &alarm); if (rv != SA_OK) break; first = 0; snprintf(buf, SHOW_BUF_SZ, "(%d) ", alarm.AlarmId); oh_decode_time(alarm.Timestamp, &tb); get_text_buffer_text("", &tb, " ", tbuf); strcat(buf, tbuf); strcat(buf, oh_lookup_severity(alarm.Severity)); if (alarm.Acknowledged) strcat(buf, " a "); else strcat(buf, " - "); strcat(buf, oh_lookup_statuscondtype(alarm.AlarmCond.Type)); ind = strlen(buf); if (alarm.AlarmCond.Type == SAHPI_STATUS_COND_TYPE_SENSOR) { snprintf(buf + ind, SHOW_BUF_SZ - ind, " %d/%d 0x%x", alarm.AlarmCond.ResourceId, alarm.AlarmCond.SensorNum, alarm.AlarmCond.EventState); } else if (alarm.AlarmCond.Type == SAHPI_STATUS_COND_TYPE_OEM) { snprintf(buf + ind, SHOW_BUF_SZ - ind, " OEM = %d", alarm.AlarmCond.Mid); break; }; strcat(buf, "\n"); if (proc(buf) != 0) return(-1); }; if ( (rv == SA_ERR_HPI_NOT_PRESENT) && (first == 1) ) { proc("No alarms in DAT.\n"); return(SA_OK); }; return(rv); } SaErrorT show_entity_management( Domain_t *domain, const SaHpiEntityPathT * ep, SaHpiRdrTypeT type, hpi_ui_print_cb_t proc ) { SaErrorT rv; char buf[SHOW_BUF_SZ]; SaHpiUint32T i; SaHpiResourceIdT rid; SaHpiInstrumentIdT instr; SaHpiUint32T update_cnt; SaHpiBoolT first, found; oh_big_textbuffer tmpbuf; oh_init_bigtext(&tmpbuf); rv = oh_decode_entitypath( ep, &tmpbuf ); if ( rv != SA_OK ) { proc( "Invalid Entity" ); return rv; } strcpy( buf, "Management access for " ); strncat( buf, (const char *)tmpbuf.Data, tmpbuf.DataLength ); strcat( buf, ":\n" ); proc( buf ); rv = SA_OK; i = SAHPI_FIRST_ENTRY; first = SAHPI_TRUE; found = SAHPI_FALSE; while ( rv == SA_OK ) { buf[0] = '\0'; rv = saHpiGetIdByEntityPath( domain->sessionId, *ep, type, &i, &rid, &instr, &update_cnt ); if ( rv != SA_OK ) { break; } if ( type == SAHPI_NO_RECORD ) { snprintf( buf, SHOW_BUF_SZ, " Resource %u\n", rid ); } else { const char * type_str; switch ( type ) { case SAHPI_CTRL_RDR: type_str = "Control"; type = SAHPI_CTRL_RDR; break; case SAHPI_SENSOR_RDR: type_str = "Sensor"; type = SAHPI_SENSOR_RDR; break; case SAHPI_INVENTORY_RDR: type_str = "IDR"; type = SAHPI_INVENTORY_RDR; break; case SAHPI_WATCHDOG_RDR: type_str = "Watchdog"; type = SAHPI_WATCHDOG_RDR; break; case SAHPI_ANNUNCIATOR_RDR: type_str = "Annunciator"; type = SAHPI_ANNUNCIATOR_RDR; break; case SAHPI_DIMI_RDR: type_str = "DIMI"; type = SAHPI_DIMI_RDR; break; case SAHPI_FUMI_RDR: type_str = "FUMI"; type = SAHPI_FUMI_RDR; break; default: type_str = "Unknown Instrument"; } snprintf( buf, SHOW_BUF_SZ, " Resource %u, %s %u\n", rid, type_str, instr ); } proc( buf ); found = SAHPI_TRUE; first = SAHPI_FALSE; if ( i == SAHPI_LAST_ENTRY ) { break; } } if ( found == SAHPI_FALSE ) { if ( type == SAHPI_NO_RECORD ) { proc( " No resources found\n" ); } else { proc( " No instruments found\n" ); } } if ( ( rv == SA_ERR_HPI_NOT_PRESENT ) && ( first != SAHPI_FALSE ) ) { return SA_OK; } else if ( rv != SA_OK ) { snprintf( buf, SHOW_BUF_SZ, "ERROR!!! saHpiGetIdByEntityPath: %s\n", oh_lookup_error( rv ) ); proc( buf ); } return rv; } SaErrorT show_entity_tree( Domain_t *domain, const SaHpiEntityPathT * parent, unsigned int level, hpi_ui_print_cb_t proc ) { SaErrorT rv; char buf[SHOW_BUF_SZ]; oh_big_textbuffer tmpbuf; SaHpiEntityPathT child; SaHpiUint32T i, j; SaHpiBoolT first; SaHpiUint32T update_cnt; rv = SA_OK; i = SAHPI_FIRST_ENTRY; first = SAHPI_TRUE; while ( rv == SA_OK ) { buf[0] = '\0'; rv = saHpiGetChildEntityPath( domain->sessionId, *parent, &i, &child, &update_cnt ); if ( rv != SA_OK ) { break; } for ( j = 1; j <= level; ++j ) { if ( j == level ) { strcat( buf, " |-" ); } else { strcat( buf, " | " ); } } oh_init_bigtext(&tmpbuf); rv = oh_decode_entitypath( &child, &tmpbuf ); if ( rv == SA_OK ) { strncat( buf, (const char *)tmpbuf.Data, tmpbuf.DataLength ); strcat( buf, "\n" ); } else { strcat( buf, "Invalid Entity\n" ); } proc( buf ); rv = show_entity_tree( domain, &child, level + 1, proc ); first = SAHPI_FALSE; if ( i == SAHPI_LAST_ENTRY ) { break; } } if ( ( rv == SA_ERR_HPI_NOT_PRESENT ) && ( first != SAHPI_FALSE ) ) { return SA_OK; } else if ( rv != SA_OK ) { snprintf( buf, SHOW_BUF_SZ, "ERROR!!! saHpiGetChildEntityPath: %s\n", oh_lookup_error( rv ) ); proc( buf ); } return rv; } SaErrorT show_inventory(SaHpiSessionIdT sessionid, SaHpiResourceIdT resourceid, SaHpiIdrIdT IdrId, SaHpiEntryIdT areaid, hpi_ui_print_cb_t proc) { SaHpiIdrInfoT info; SaErrorT rv; SaHpiEntryIdT entryid, nextentryid; SaHpiEntryIdT fentryid, nextfentryid; SaHpiIdrAreaHeaderT hdr; SaHpiIdrFieldT field; char buf[SHOW_BUF_SZ]; char *str; int num; rv = saHpiIdrInfoGet(sessionid, resourceid, IdrId, &info); if (rv != SA_OK) { snprintf(buf, SHOW_BUF_SZ, "ERROR!!! saHpiIdrInfoGet: %s\n", oh_lookup_error(rv)); proc(buf); return(-1); }; num = info.NumAreas; snprintf(buf, SHOW_BUF_SZ, "Inventory: %d Update count: %d Read Only: %s Areas: %d\n", info.IdrId, info.UpdateCount, HPIBOOL2STR( info.ReadOnly ), num); if (proc(buf) != 0) return(SA_OK); entryid = SAHPI_FIRST_ENTRY; while ((entryid != SAHPI_LAST_ENTRY) && (num > 0)) { rv = saHpiIdrAreaHeaderGet(sessionid, resourceid, IdrId, SAHPI_IDR_AREATYPE_UNSPECIFIED, entryid, &nextentryid, &hdr); if (rv != SA_OK) { proc("ERROR!!! saHpiIdrAreaHeaderGet\n"); return(-1); }; if ( areaid != SAHPI_LAST_ENTRY && areaid != hdr.AreaId ) { entryid = nextentryid; continue; } str = oh_lookup_idrareatype(hdr.Type); if (str == NULL) str = "Unknown"; snprintf(buf, SHOW_BUF_SZ, " Area: %d Type: %s Read Only: %s Fields: %d\n", hdr.AreaId, str, HPIBOOL2STR( hdr.ReadOnly ), hdr.NumFields); if (proc(buf) != 0) return(SA_OK); fentryid = SAHPI_FIRST_ENTRY; entryid = nextentryid; while ((fentryid != SAHPI_LAST_ENTRY) && (hdr.NumFields > 0)) { rv = saHpiIdrFieldGet(sessionid, resourceid, IdrId, hdr.AreaId, SAHPI_IDR_FIELDTYPE_UNSPECIFIED, fentryid, &nextfentryid, &field); if (rv != SA_OK) { proc("ERROR!!! saHpiIdrFieldGet\n"); return(-1); }; str = oh_lookup_idrfieldtype(field.Type); if (str == NULL) str = "Unknown"; snprintf(buf, SHOW_BUF_SZ, " Field: %d Type: %s Read Only: %s (", field.FieldId, str, HPIBOOL2STR( field.ReadOnly )); if (proc(buf) != 0) return(SA_OK); if (print_text_buffer(NULL, &(field.Field), NULL, proc) != 0) return(SA_OK); if (proc(")\n") != 0) return(SA_OK); fentryid = nextfentryid; } }; return(SA_OK); } void show_inv_area_header(SaHpiIdrAreaHeaderT *Header, int del, hpi_ui_print_cb_t proc) { char buf[SHOW_BUF_SZ], *str; int len; del <<= 1; len = SHOW_BUF_SZ - del; str = buf + del; memset(buf, ' ', SHOW_BUF_SZ); snprintf(str, len, "AreaId: %d\n", Header->AreaId); if (proc(buf) != 0) return; snprintf(str, len, "AreaType: %s\n", oh_lookup_idrareatype(Header->Type)); if (proc(buf) != 0) return; snprintf(str, len, "ReadOnly: %s\n", HPIBOOL2STR( Header->ReadOnly )); if (proc(buf) != 0) return; snprintf(str, len, "NumFields: %d\n", Header->NumFields); proc(buf); } void show_inv_field(SaHpiIdrFieldT *Field, int del, hpi_ui_print_cb_t proc) { char buf[SHOW_BUF_SZ], *str; int len; del <<= 1; len = SHOW_BUF_SZ - del; str = buf + del; memset(buf, ' ', SHOW_BUF_SZ); snprintf(str, len, "Field Id: %d\n", Field->FieldId); if (proc(buf) != 0) return; snprintf(str, len, "Field Type: %s\n", oh_lookup_idrfieldtype(Field->Type)); if (proc(buf) != 0) return; snprintf(str, len, "ReadOnly: %s\n", HPIBOOL2STR( Field->ReadOnly )); if (proc(buf) != 0) return; *str = 0; proc(buf); print_text_buffer("Content: ", &(Field->Field), "\n", proc); } openhpi-3.6.1/hpi_shell/hpi_ui.h0000644000175100017510000001470212575647264015576 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Kouzmich < Mikhail.V.Kouzmich@intel.com > * */ #ifndef __HPI_UI_H #define __HPI_UI_H #include #include #define SHOW_BUF_SZ 1024 /* defines for show_rpt_list function */ #define SHOW_ALL_RPT 0 #define SHOW_ALL_RDR 1 #define SHOW_RPT_RDR 2 #define SHORT_LSRES 0x0 #define STATE_LSRES 0x1 #define PATH_LSRES 0x2 typedef unsigned char uchar; typedef union { int i; double d; char *s; void *a; } union_type_t; /* value types */ #define NO_TYPE 0 // value doesn't present #define INT_TYPE 1 // interger #define FLOAT_TYPE 2 // float #define STR_TYPE 3 // string #define STRUCT_TYPE 4 // structure #define ARRAY_TYPE 5 // array #define LOOKUP_TYPE 6 // call lookup function #define DECODE_TYPE 7 // call encode function #define DECODE1_TYPE 8 // call encode1 function #define READING_TYPE 9 // call reading print function #define BOOL_TYPE 10 // boolean #define HEX_TYPE 11 // hexadecimal #define TEXT_BUFF_TYPE 12 // TextBuffer typedef struct { char *name; // attribute name int type; // value type int lunum; // lookup proc number union_type_t value; // value } attr_t; typedef struct { int n_attrs; attr_t *Attrs; } Attributes_t; typedef struct { SaHpiRdrT Record; SaHpiEntryIdT RecordId; SaHpiRdrTypeT RdrType; Attributes_t Attrutes; } Rdr_t; typedef struct { SaHpiRptEntryT Table; SaHpiEntryIdT EntryId; SaHpiResourceIdT ResourceId; Attributes_t Attrutes; } Rpt_t; typedef struct { SaHpiSessionIdT sessionId; SaHpiDomainIdT domainId; int session_opened; int discovered; } Domain_t; /* print function * This parameter is passed to the interface show functions * It return HPI_UI_OK on successful completion, otherwise HPI_UI_END on * output ending. */ typedef enum { HPI_UI_OK = 0, HPI_UI_END = -1 } Pr_ret_t; // Print return code typedef Pr_ret_t (*hpi_ui_print_cb_t)(char *buf); typedef int (*get_int_param_t)(char *buf, int *val); extern char *hex_codes; extern SaErrorT find_rdr_by_num(SaHpiSessionIdT sessionid, SaHpiResourceIdT resourceid, SaHpiInstrumentIdT num, SaHpiRdrTypeT type, int as, SaHpiRdrT *retrdr); extern void free_attrs(Attributes_t *At); extern SaErrorT get_rpt_attr(Rpt_t *rpt, char *attr_name, union_type_t *val); // get rpt attribute value extern SaErrorT get_rpt_attr_as_string(Rpt_t *rpt, char *attr_name, char *val, int len); // get rpt attribute value as string (max length: len) extern SaErrorT get_rdr_attr(Rdr_t *rdr, char *attr_name, union_type_t *val); // get rdr attribute value extern SaErrorT get_rdr_attr_as_string(Rdr_t *rdr, char *attr_name, char *val, int len); // get rdr attribute value as string (max length: len) extern void get_text_buffer_text(char *mes, const SaHpiTextBufferT *buf, char *meslast, char *outbuf); extern SaErrorT get_value(Attributes_t *Attrs, int num, union_type_t *val); // get attribute value as string by number (max length: len) extern SaErrorT get_value_as_string(Attributes_t *Attrs, int num, char *val, int len); // get attribute value as string by number (max length: len) extern char *get_attr_name(Attributes_t *Attrs, int num); // get attribute name extern int get_attr_type(Attributes_t *Attrs, int num); // get attribute type extern void make_attrs_rdr(Rdr_t *Rdr, SaHpiRdrT *rdr_entry); extern void make_attrs_rpt(Rpt_t *Rpt, SaHpiRptEntryT *rptentry); extern Pr_ret_t print_text_buffer(char *mes, SaHpiTextBufferT *buf, char *meslast, hpi_ui_print_cb_t proc); extern Pr_ret_t print_text_buffer_lang(char *mes, SaHpiTextBufferT *buf, char *meslast, hpi_ui_print_cb_t proc); extern Pr_ret_t print_text_buffer_length(char *mes, SaHpiTextBufferT *buf, char *meslast, hpi_ui_print_cb_t proc); extern Pr_ret_t print_text_buffer_text(char *mes, const SaHpiTextBufferT *buf, char *meslast, hpi_ui_print_cb_t proc); extern Pr_ret_t print_text_buffer_type(char *mes, SaHpiTextBufferT *buf, char *meslast, hpi_ui_print_cb_t proc); extern Pr_ret_t print_thres_value(SaHpiSensorReadingT *item, char *mes, SaHpiSensorThdDefnT *def, int num, hpi_ui_print_cb_t proc); extern SaErrorT show_control(SaHpiSessionIdT sessionid, SaHpiResourceIdT resourceid, SaHpiCtrlNumT num, hpi_ui_print_cb_t proc); extern SaErrorT show_control_state(SaHpiSessionIdT sessionid, SaHpiResourceIdT resourceid, SaHpiCtrlNumT num, hpi_ui_print_cb_t proc, get_int_param_t); extern SaErrorT show_dat(Domain_t *domain, hpi_ui_print_cb_t proc); extern SaErrorT show_entity_management(Domain_t *domain, const SaHpiEntityPathT * ep, SaHpiRdrTypeT type, hpi_ui_print_cb_t proc); extern SaErrorT show_entity_tree(Domain_t *domain, const SaHpiEntityPathT * parent, unsigned int level, hpi_ui_print_cb_t proc); extern SaErrorT show_event_log(SaHpiSessionIdT sessionid, SaHpiResourceIdT resourceid, int show_short, hpi_ui_print_cb_t proc); extern void show_inv_area_header(SaHpiIdrAreaHeaderT *Header, int del, hpi_ui_print_cb_t proc); extern void show_inv_field(SaHpiIdrFieldT *Field, int del, hpi_ui_print_cb_t proc); extern SaErrorT show_inventory(SaHpiSessionIdT sessionid, SaHpiResourceIdT resourceid, SaHpiIdrIdT num, SaHpiEntryIdT areaid, hpi_ui_print_cb_t proc); extern SaErrorT show_Rdr(Rdr_t *Rdr, hpi_ui_print_cb_t proc); extern SaErrorT show_Rpt(Rpt_t *Rpt, hpi_ui_print_cb_t proc); extern int show_rdr_list(Domain_t *D, SaHpiResourceIdT resourceid, SaHpiRdrTypeT passed_type, hpi_ui_print_cb_t proc); extern int show_rpt_list(Domain_t *domain, int as, SaHpiResourceIdT rptid, int addedfields, hpi_ui_print_cb_t proc); extern Pr_ret_t show_sensor_list(SaHpiSessionIdT sessionid, SaHpiResourceIdT resourceid, hpi_ui_print_cb_t proc); extern SaErrorT show_sensor(SaHpiSessionIdT sessionid, SaHpiResourceIdT resourceid, SaHpiSensorNumT sensornum, hpi_ui_print_cb_t proc); extern Pr_ret_t show_short_event(SaHpiEventT *event, hpi_ui_print_cb_t proc); extern SaErrorT show_threshold(SaHpiSessionIdT sessionid, SaHpiResourceIdT resourceid, SaHpiSensorNumT sensornum, SaHpiSensorRecT *sen, hpi_ui_print_cb_t proc); extern SaErrorT sensor_list(SaHpiSessionIdT sessionid, hpi_ui_print_cb_t proc); #endif /* __HPI_UI_H */ openhpi-3.6.1/openhpid/0000755000175100017510000000000012605014533013760 5ustar mohanmohanopenhpi-3.6.1/openhpid/lock.c0000644000175100017510000000160212575647301015066 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * (C) Copyright IBM Corp. 2003, 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Louis Zhuang */ #include #include "lock.h" #include "sahpi_wrappers.h" #if GLIB_CHECK_VERSION (2, 32, 0) static GRecMutex oh_main_lock; #else static GStaticRecMutex oh_main_lock = G_STATIC_REC_MUTEX_INIT; #endif void data_access_lock(void) { wrap_g_static_rec_mutex_lock(&oh_main_lock); } void data_access_unlock(void) { wrap_g_static_rec_mutex_unlock(&oh_main_lock); } openhpi-3.6.1/openhpid/hotswap.h0000644000175100017510000000171112575647301015631 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (c) 2004 by Intel Corp. * (C) Copyright IBM Corp. 2005-2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Racing Guo * Renier Morales */ #ifndef __OH_HOTSWAP_H #define __OH_HOTSWAP_H #include #include #ifdef __cplusplus extern "C" { #endif SaHpiTimeoutT get_hotswap_auto_insert_timeout(struct oh_domain *d); void set_hotswap_auto_insert_timeout(struct oh_domain *d, SaHpiTimeoutT t); SaHpiBoolT oh_allowed_hotswap_transition(SaHpiHsStateT from, SaHpiHsStateT to); #ifdef __cplusplus } #endif #endif /* __OH_HOTSWAP_H */ openhpi-3.6.1/openhpid/domain.c0000644000175100017510000005165012575647301015415 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004-2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * */ #include #include #include #include #include #include #include #include "alarm.h" #include "conf.h" #include "event.h" #include "sahpi_wrappers.h" #define domains_lock() wrap_g_static_rec_mutex_lock(&oh_domains.lock) #define domains_unlock() wrap_g_static_rec_mutex_unlock(&oh_domains.lock) struct oh_domain_table oh_domains = { .table = NULL, #if !GLIB_CHECK_VERSION (2, 32, 0) .lock = G_STATIC_REC_MUTEX_INIT, #endif }; static void __inc_domain_refcount(struct oh_domain *d) { wrap_g_static_rec_mutex_lock(&d->refcount_lock); d->refcount++; wrap_g_static_rec_mutex_unlock(&d->refcount_lock); return; } static void __dec_domain_refcount(struct oh_domain *d) { wrap_g_static_rec_mutex_lock(&d->refcount_lock); d->refcount--; wrap_g_static_rec_mutex_unlock(&d->refcount_lock); return; } static void __free_drt_list(GSList *drt_list) { GSList *node = NULL; for (node = drt_list; node; node = node->next) { g_free(node->data); } g_slist_free(drt_list); return; } static void __delete_domain(struct oh_domain *d) { oh_flush_rpt(&d->rpt); oh_el_close(d->del); oh_close_alarmtable(d); __free_drt_list(d->drt.list); wrap_g_static_rec_mutex_free_clear(&d->lock); wrap_g_static_rec_mutex_free_clear(&d->refcount_lock); g_free(d); } #if 0 static void __query_domains(gpointer key, gpointer value, gpointer user_data) { oh_domain_result dr; GList *node = (GList *)value; struct oh_domain *domain = (struct oh_domain *)node->data; GArray *data = (GArray *)user_data; dr.id = domain->id; dr.entity_pattern = domain->entity_pattern; dr.tag = domain->tag; g_array_append_val(data, dr); } #endif static GList *__get_domain(SaHpiDomainIdT did) { GList *node = NULL; struct oh_domain *domain = NULL; if (did == SAHPI_UNSPECIFIED_DOMAIN_ID) { did = OH_DEFAULT_DOMAIN_ID; } domains_lock(); node = (GList *)g_hash_table_lookup(oh_domains.table, &did); if (!node) { domains_unlock(); return NULL; } domain = (struct oh_domain *)node->data; /* Punch in */ __inc_domain_refcount(domain); /* Unlock domain table */ domains_unlock(); /* Wait to get domain lock */ wrap_g_static_rec_mutex_lock(&domain->lock); return node; } static void gen_domain_event(SaHpiDomainIdT target_id, SaHpiDomainIdT subject_id, SaHpiBoolT addition) { struct oh_event *e = NULL; SaHpiDomainEventTypeT type = (addition) ? SAHPI_DOMAIN_REF_ADDED : SAHPI_DOMAIN_REF_REMOVED; e = g_new0(struct oh_event, 1); e->resource.ResourceId = SAHPI_UNSPECIFIED_RESOURCE_ID; e->event.Source = target_id; e->event.EventType = SAHPI_ET_DOMAIN; e->event.Severity = SAHPI_INFORMATIONAL; e->event.EventDataUnion.DomainEvent.Type = type; e->event.EventDataUnion.DomainEvent.DomainId = subject_id; oh_gettimeofday(&e->event.Timestamp); DBG("domain %d %s domain %d", subject_id, type == SAHPI_DOMAIN_REF_ADDED ? "added to" : "removed from", target_id); oh_evt_queue_push(oh_process_q, e); } static void update_drt(SaHpiDomainIdT target_id, SaHpiDomainIdT subject_id, SaHpiBoolT subject_is_peer, SaHpiBoolT addition) { struct oh_domain *domain = NULL; SaHpiDrtEntryT *drtentry = NULL; int found = 0; domain = oh_get_domain(target_id); if (!domain) { CRIT("Warning. Could not update DRT. Domain %u not found.", target_id); return; } if (addition) { drtentry = g_new0(SaHpiDrtEntryT, 1); drtentry->DomainId = subject_id; drtentry->EntryId = ++(domain->drt.next_id); drtentry->IsPeer = subject_is_peer; domain->drt.list = g_slist_append(domain->drt.list, drtentry); gen_domain_event(target_id, subject_id, SAHPI_TRUE); } else { GSList *node = NULL, *savenode = NULL; int child_count = 0, peer_count = 0; for (node = domain->drt.list; node || savenode; node = (node) ? node->next : savenode) { drtentry = (SaHpiDrtEntryT *)node->data; savenode = NULL; if (drtentry->IsPeer) peer_count++; else child_count++; if (drtentry->DomainId == subject_id && !found) { savenode = node->next; domain->drt.list = g_slist_delete_link(domain->drt.list, node); g_free(node->data); gen_domain_event(target_id, subject_id, SAHPI_FALSE); found = 1; node = NULL; } } } if (addition || found) { oh_gettimeofday(&domain->drt.update_timestamp); domain->drt.update_count++; } oh_release_domain(domain); } #define add_drtentry(target_id, subject_id, subject_is_peer) \ update_drt(target_id, subject_id, subject_is_peer, SAHPI_TRUE); #define del_drtentry(target_id, subject_id) \ update_drt(target_id, subject_id, SAHPI_FALSE, SAHPI_FALSE); static int connect2parent(struct oh_domain *domain, SaHpiDomainIdT parent_id) { struct oh_domain *parent = NULL; if (!domain) return -1; if (parent_id == SAHPI_UNSPECIFIED_DOMAIN_ID) return -2; parent = oh_get_domain(parent_id); if (!parent) { CRIT("Couldn't get domain %d", parent_id); return -3; } /* Add child drt to peers of parent domain */ #if 0 if (parent->state & OH_DOMAIN_PEER) { GSList *node = NULL; for (node = parent->drt.list; node; node = node->next) { SaHpiDrtEntryT *drte = (SaHpiDrtEntryT *)node->data; if (drte->IsPeer) { add_drtentry(drte->DomainId, domain->id, SAHPI_FALSE); } } } #endif oh_release_domain(parent); /* Add child drt to parent domain */ add_drtentry(parent_id, domain->id, SAHPI_FALSE); // domain->state |= OH_DOMAIN_CHILD; /* set child state */ domain->drt.parent_id = parent_id; return 0; } static int connect2peer(struct oh_domain *domain, SaHpiDomainIdT peer_id) { struct oh_domain *peer = NULL; GSList *node = NULL; if (!domain) return -1; if (peer_id == SAHPI_UNSPECIFIED_DOMAIN_ID) return -2; peer = oh_get_domain(peer_id); if (!peer) { CRIT("Couldn't get domain %d", peer_id); return -3; } /* Copy entitypath pattern. Peers contain the same resources */ // domain->entity_pattern = peer->entity_pattern; /* Copy drt list from target peer. * Also, add self drt to peers of target peer. */ for (node = peer->drt.list; node; node = node->next) { SaHpiDrtEntryT *drtentry = (SaHpiDrtEntryT *)node->data; add_drtentry(domain->id, drtentry->DomainId, drtentry->IsPeer); if (drtentry->IsPeer) { add_drtentry(drtentry->DomainId, domain->id, SAHPI_TRUE); } } oh_release_domain(peer); /* Add each others drts to domain and domain's peer */ add_drtentry(domain->id, peer_id, SAHPI_TRUE); add_drtentry(peer_id, domain->id, SAHPI_TRUE); // domain->state |= OH_DOMAIN_PEER; return 0; } #if 0 static int disconnect_parent(struct oh_domain *child) { GSList *node = NULL; struct oh_domain *parent = NULL; if (!child) return -1; // if (!(child->state & OH_DOMAIN_CHILD)) return -2; parent = oh_get_domain(child->drt.parent_id); if (!parent) return -3; /* Remove child drt from peers of the parent */ for (node = parent->drt.list; node; node = node->next) { SaHpiDrtEntryT *drte = (SaHpiDrtEntryT *)node->data; if (drte->IsPeer) { del_drtentry(drte->DomainId, child->id); } } oh_release_domain(parent); /* Finally, remove child drt from the parent */ del_drtentry(child->drt.parent_id, child->id); // child->state = child->state & 0x06; /* Unset child state */ return 0; } static int disconnect_peers(struct oh_domain *domain) { GSList *node = NULL; if (!domain) return -1; // if (!(domain->state & OH_DOMAIN_PEER)) return -2; /* Remove drt from peers */ for (node = domain->drt.list; node; node = node->next) { SaHpiDrtEntryT *drte = (SaHpiDrtEntryT *)node->data; if (drte->IsPeer) { del_drtentry(drte->DomainId, domain->id); } } // domain->state = domain->state & 0x03; /* Unset peer state */ return 0; } #endif /** * oh_create_domain * @id: Required. 0 or SAHPI_UNSPECIFIED_DOMAIN_ID means default. * @entity_pattern: Required. * @nametag: Optional. * @tier_of: Optional. SAHPI_UNSPECIFIED_DOMAIN_ID means none. * @peer_of: Optional. SAHPI_UNSPECIFIED_DOMAIN_ID means none. * @capabilities: * @ai_timeout: * * * * Returns: SA_OK if domain was created successfully. **/ SaErrorT oh_create_domain(SaHpiDomainIdT id, char *tag, SaHpiDomainIdT child_of, SaHpiDomainIdT peer_of, SaHpiDomainCapabilitiesT capabilities, SaHpiTimeoutT ai_timeout) { struct oh_domain *domain = g_new0(struct oh_domain,1); struct oh_global_param param = { .type = OPENHPI_DEL_SIZE_LIMIT }; char filepath[SAHPI_MAX_TEXT_BUFFER_LENGTH*2]; /* Fix id to int capable value */ if (id == SAHPI_UNSPECIFIED_DOMAIN_ID) id = OH_DEFAULT_DOMAIN_ID; /* Input validation */ if (peer_of == id || child_of == id || (child_of == peer_of && child_of != SAHPI_UNSPECIFIED_DOMAIN_ID)) return SA_ERR_HPI_INVALID_PARAMS; /* Check to see if domain id is already taken */ domains_lock(); if (g_hash_table_lookup(oh_domains.table, &id)) { domains_unlock(); g_free(domain); CRIT("Domain %u already exists; not creating twice.", id); return SA_ERR_HPI_INVALID_DOMAIN; } domain->id = id; /* Set domain id */ if (tag) { /* Set domain tag */ oh_init_textbuffer(&domain->tag); oh_append_textbuffer(&domain->tag, tag); } domain->capabilities = capabilities; domain->ai_timeout = ai_timeout; /* Initialize Resource Precense Table */ oh_init_rpt(&(domain->rpt)); /* Initialize domain reference table timestamp to a valid value */ domain->drt.update_timestamp = SAHPI_TIME_UNSPECIFIED; oh_get_global_param(¶m); /* Get domain event log size limit */ /* Initialize domain event log */ domain->del = oh_el_create(param.u.del_size_limit); if (!domain->del) { domains_unlock(); g_free(domain->del); g_free(domain); return SA_ERR_HPI_ERROR; } wrap_g_static_rec_mutex_init(&domain->lock); wrap_g_static_rec_mutex_init(&domain->refcount_lock); /* Get option for saving domain event log or not */ param.type = OPENHPI_DEL_SAVE; oh_get_global_param(¶m); if (param.u.del_save) { param.type = OPENHPI_VARPATH; oh_get_global_param(¶m); snprintf(filepath, SAHPI_MAX_TEXT_BUFFER_LENGTH*2, "%s/del.%u", param.u.varpath, domain->id); oh_el_map_from_file(domain->del, filepath); } param.type = OPENHPI_DAT_SAVE; oh_get_global_param(¶m); if (param.u.dat_save) { param.type = OPENHPI_VARPATH; oh_get_global_param(¶m); memset(filepath, 0, SAHPI_MAX_TEXT_BUFFER_LENGTH*2); snprintf(filepath, SAHPI_MAX_TEXT_BUFFER_LENGTH*2, "%s/dat.%u", param.u.varpath, domain->id); oh_alarms_from_file(domain, filepath); } /* Need to put new domain in table before relating to other domains. */ oh_domains.list = g_list_append(oh_domains.list, domain); g_hash_table_insert(oh_domains.table, &domain->id, g_list_last(oh_domains.list)); /* Establish child-parent relationship */ if (child_of != SAHPI_UNSPECIFIED_DOMAIN_ID && connect2parent(domain, child_of)) { CRIT("Error connecting domain %u to parent %u", domain->id, child_of); } /* Establish peer relationships */ if (peer_of != SAHPI_UNSPECIFIED_DOMAIN_ID && connect2peer(domain, peer_of)) { CRIT("Error connection domain %u to peer %u", domain->id, peer_of); } domains_unlock(); return SA_OK; } #if 0 SaErrorT oh_create_domain_from_table(GHashTable *table) { SaHpiDomainIdT *id = NULL, *child_of = NULL, *peer_of = NULL; char *entity_pattern = NULL, *tag = NULL; oh_entitypath_pattern epp; SaHpiTimeT ai_timeout = SAHPI_TIMEOUT_IMMEDIATE, *ait = NULL; unsigned int *ai_readonly = NULL; SaHpiDomainCapabilitiesT capabilities = SAHPI_DOMAIN_CAP_AUTOINSERT_READ_ONLY; if (!table) return SA_ERR_HPI_INVALID_PARAMS; id = (SaHpiDomainIdT *)g_hash_table_lookup(table, "id"); child_of = (SaHpiDomainIdT *)g_hash_table_lookup(table, "child_of"); peer_of = (SaHpiDomainIdT *)g_hash_table_lookup(table, "peer_of"); entity_pattern = (char *)g_hash_table_lookup(table, "entity_pattern"); tag = (char *)g_hash_table_lookup(table, "tag"); ait = (SaHpiTimeT *)g_hash_table_lookup(table, "ai_timeout"); ai_readonly = (unsigned int *)g_hash_table_lookup(table, "ai_readonly"); if (!id) { CRIT("Error creating a domain from configuration." " No domain id was given."); return SA_ERR_HPI_INVALID_PARAMS; } if (id == 0) { /* ID == 0 is the default domain */ /* Default domain cannot be a peer or child of anyone */ child_of = NULL; peer_of = NULL; } if (peer_of && entity_pattern) { WARN("Warning creating domain %u. Entity pattern will be" " disregarded since a peer was specified.", *id); } else if (!peer_of && oh_compile_entitypath_pattern(entity_pattern, &epp)) { CRIT("Error creating domain %u. " "Invalid entity pattern given.", *id); return SA_ERR_HPI_INVALID_PARAMS; } if (ait) ai_timeout = *ait * 1000000000; if (ai_readonly && *ai_readonly == 0) capabilities = 0; return oh_create_domain(*id, (peer_of) ? NULL : &epp, tag, (child_of) ? *child_of : SAHPI_UNSPECIFIED_DOMAIN_ID, (peer_of) ? *peer_of : SAHPI_UNSPECIFIED_DOMAIN_ID, capabilities, ai_timeout); } #endif /** * oh_destroy_domain * @did: * * * * Returns: **/ SaErrorT oh_destroy_domain(SaHpiDomainIdT did) { struct oh_domain *domain = NULL; GList *node = NULL; if (did == OH_DEFAULT_DOMAIN_ID || did == SAHPI_UNSPECIFIED_DOMAIN_ID) return SA_ERR_HPI_INVALID_PARAMS; node = __get_domain(did); if (!node) { return SA_ERR_HPI_NOT_PRESENT; } domain = (struct oh_domain *)node->data; #if 0 if (domain->state & OH_DOMAIN_CHILD) disconnect_parent(domain); if (domain->state & OH_DOMAIN_PEER) disconnect_peers(domain); #endif domains_lock(); g_hash_table_remove(oh_domains.table, &domain->id); oh_domains.list = g_list_delete_link(oh_domains.list, node); domains_unlock(); __dec_domain_refcount(domain); if (domain->refcount < 1) __delete_domain(domain); else oh_release_domain(domain); return SA_OK; } /** * oh_get_domain * @did: * * * * Returns: **/ struct oh_domain *oh_get_domain(SaHpiDomainIdT did) { GList *node = NULL; struct oh_domain *domain = NULL; node = __get_domain(did); if (!node) { return NULL; } domain = (struct oh_domain *)node->data; return domain; } /** * oh_release_domain * @domain: * * * * Returns: **/ SaErrorT oh_release_domain(struct oh_domain *domain) { if (!domain) return SA_ERR_HPI_INVALID_PARAMS; __dec_domain_refcount(domain); /* Punch out */ /* * If domain was scheduled for destruction before, and * no other threads are referring to it, then delete domain. */ if (domain->refcount < 0) __delete_domain(domain); else wrap_g_static_rec_mutex_unlock(&domain->lock); return SA_OK; } #if 0 /** * oh_query_domains * * Fetches information on all present domains * * Returns: a GArray of oh_domain_result types. **/ GArray *oh_query_domains() { GArray *domain_results = g_array_new(FALSE, TRUE, sizeof(oh_domain_result)); domains_lock(); g_hash_table_foreach(oh_domains.table, __query_domains, domain_results); domains_unlock(); return domain_results; } #endif /** * oh_drt_entry_get * @did: a domain id * @entryid: id of drt entry * @nextentryid: id next to @entryid in the drt will be put here. * @drtentry: drt entry corresponding to @entryid will be placed here. * * Fetches a drt entry from the domain identified by @did * * Returns: SA_OK on success, otherwise an error. **/ SaErrorT oh_drt_entry_get(SaHpiDomainIdT did, SaHpiEntryIdT entryid, SaHpiEntryIdT *nextentryid, SaHpiDrtEntryT *drtentry) { struct oh_domain *domain = NULL; GSList *node = NULL; if (!nextentryid || !drtentry) { CRIT("Error - Invalid parameters passed."); return SA_ERR_HPI_INVALID_PARAMS; } domain = oh_get_domain(did); if (domain == NULL) { CRIT("no domain for id %d", did); return SA_ERR_HPI_INTERNAL_ERROR; } for (node = domain->drt.list; node; node = node->next) { SaHpiDrtEntryT *curdrt = (SaHpiDrtEntryT *)node->data; if (curdrt->EntryId == entryid || entryid == SAHPI_FIRST_ENTRY) { if (node->next == NULL) { /* last entry */ *nextentryid = SAHPI_LAST_ENTRY; } else { SaHpiDrtEntryT *nextdrt = (SaHpiDrtEntryT *)node->next->data; *nextentryid = nextdrt->EntryId; } memcpy(drtentry, curdrt, sizeof(SaHpiDrtEntryT)); oh_release_domain(domain); return SA_OK; } } oh_release_domain(domain); return SA_ERR_HPI_NOT_PRESENT; } openhpi-3.6.1/openhpid/plugin.c0000644000175100017510000010752112575647301015443 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * (C) Copyright IBM Corp. 2003, 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Louis Zhuang * Sean Dague * David Judkovics * Renier Morales * Anton Pak */ #include #include #include #include #include #include #include #include #include #include #include "conf.h" #include "event.h" #include "lock.h" #include "sahpi_wrappers.h" extern volatile int signal_stop; /* * Structure containing global list of plugins (oh_plugin). */ struct oh_plugins oh_plugins = { .list = NULL, #if !GLIB_CHECK_VERSION (2, 32, 0) .lock = G_STATIC_REC_MUTEX_INIT #endif }; /* * Structure containing global table of handlers (oh_handler). */ struct oh_handlers oh_handlers = { .table = NULL, .list = NULL, #if !GLIB_CHECK_VERSION (2, 32, 0) .lock = G_STATIC_REC_MUTEX_INIT #endif }; /** * oh_close_handlers * * When a client calls exit() this function * gets called to clean up the handlers * and any handler connections to the hardware. * Until clients use dynamic oHPI interface * * Returns: void **/ void oh_close_handlers() { struct oh_handler *h = NULL; GSList *node = NULL; wrap_g_static_rec_mutex_lock(&oh_handlers.lock); if (oh_handlers.list == NULL) { wrap_g_static_rec_mutex_unlock(&oh_handlers.lock); return; } for (node = oh_handlers.list; node; node = node->next) { h = node->data; if (h && h->abi && h->abi->close) { if (h->hnd) { h->abi->close(h->hnd); } } } wrap_g_static_rec_mutex_unlock(&oh_handlers.lock); } static void __inc_plugin_refcount(struct oh_plugin *p) { wrap_g_static_rec_mutex_lock(&p->refcount_lock); p->refcount++; wrap_g_static_rec_mutex_unlock(&p->refcount_lock); } static void __dec_plugin_refcount(struct oh_plugin *p) { wrap_g_static_rec_mutex_lock(&p->refcount_lock); p->refcount--; wrap_g_static_rec_mutex_unlock(&p->refcount_lock); } static void __delete_plugin(struct oh_plugin *p) { if (!p) return; g_free(p->name); wrap_g_static_rec_mutex_free_clear(&p->lock); wrap_g_static_rec_mutex_free_clear(&p->refcount_lock); g_free(p->abi); if (p->dl_handle) { g_module_close(p->dl_handle); } g_free(p); } /** * oh_get_plugin * @plugin_name: name of plugin. string. * * Lookup and get a reference for @plugin_name. * Locks out the plugin. Need to call oh_putback_plugin * to unlock it. * * Returns: oh_plugin reference or NULL if plugin_name was not found. **/ struct oh_plugin *oh_get_plugin(char *plugin_name) { GSList *node = NULL; struct oh_plugin *plugin = NULL; if (!plugin_name) { CRIT("ERROR getting plugin. Invalid parameter."); return NULL; } wrap_g_static_rec_mutex_lock(&oh_plugins.lock); for (node = oh_plugins.list; node; node = node->next) { struct oh_plugin *p = (struct oh_plugin *)(node->data); if (strcmp(p->name, plugin_name) == 0) { __inc_plugin_refcount(p); wrap_g_static_rec_mutex_unlock(&oh_plugins.lock); wrap_g_static_rec_mutex_lock(&p->lock); plugin = p; return plugin; } } wrap_g_static_rec_mutex_unlock(&oh_plugins.lock); return plugin; } /** * oh_release_plugin * @plugin: Pointer to plugin * * Decrements refcount on plugin and unlocks it. * * Returns: void **/ void oh_release_plugin(struct oh_plugin *plugin) { if (!plugin) { CRIT("WARNING - NULL plugin parameter passed."); return; } __dec_plugin_refcount(plugin); if (plugin->refcount < 0) __delete_plugin(plugin); else wrap_g_static_rec_mutex_unlock(&plugin->lock); } /** * oh_getnext_plugin_name * @plugin_name: IN. If NULL is passed, the first plugin in the list is returned. * @next_plugin_name: OUT. Buffer to print the next plugin name to. * @size: IN. Size of the buffer at @next_plugin_name. * * Returns: 0 on Success. **/ int oh_getnext_plugin_name(char *plugin_name, char *next_plugin_name, unsigned int size) { GSList *node = NULL; if (!next_plugin_name) { CRIT("ERROR. Invalid parameter."); return -1; } memset(next_plugin_name, '\0', size); if (!plugin_name) { wrap_g_static_rec_mutex_lock(&oh_plugins.lock); if (oh_plugins.list) { struct oh_plugin *plugin = oh_plugins.list->data; strncpy(next_plugin_name, plugin->name, size); wrap_g_static_rec_mutex_unlock(&oh_plugins.lock); return 0; } else { wrap_g_static_rec_mutex_unlock(&oh_plugins.lock); DBG("No plugins have been loaded yet."); return -1; } } else { wrap_g_static_rec_mutex_lock(&oh_plugins.lock); for (node = oh_plugins.list; node; node = node->next) { struct oh_plugin *p = node->data; if (strcmp(p->name, plugin_name) == 0) { if (node->next) { p = node->next->data; strncpy(next_plugin_name, p->name, size); wrap_g_static_rec_mutex_unlock(&oh_plugins.lock); return 0; } else { break; } } } wrap_g_static_rec_mutex_unlock(&oh_plugins.lock); } return -1; } /** * oh_load_plugin * @plugin_name: name of plugin to be loaded (e.g. "libdummy"). * * Load plugin by name * * Returns: 0 on Success. **/ int oh_load_plugin(char *plugin_name) { struct oh_plugin *plugin = NULL; int err; if (!plugin_name) { CRIT("ERROR. NULL plugin name passed."); return -1; } if (g_module_supported() == FALSE) { CRIT("ERROR. GModule is not supported. Cannot load plugins."); return -1; } plugin = oh_get_plugin(plugin_name); if (plugin) { oh_release_plugin(plugin); DBG("Plugin %s already loaded. Not loading twice.", plugin_name); return 0; } plugin = g_new0(struct oh_plugin, 1); if (!plugin) { CRIT("Out of memory."); return -1; } plugin->name = g_strdup(plugin_name); plugin->handler_count = 0; plugin->refcount = 0; wrap_g_static_rec_mutex_init(&plugin->lock); wrap_g_static_rec_mutex_init(&plugin->refcount_lock); #ifdef _WIN32 plugin->dl_handle = g_module_open(plugin->name, G_MODULE_BIND_LOCAL); #else { struct oh_global_param path_param = { .type = OPENHPI_PATH }; gchar **plugin_search_dirs; size_t i; gchar *plugin_path; oh_get_global_param(&path_param); plugin_search_dirs = g_strsplit(path_param.u.path, ":", -1); for( i = 0; plugin_search_dirs[i] != 0; ++i) { plugin_path = g_module_build_path(plugin_search_dirs[i], plugin->name); plugin->dl_handle = g_module_open(plugin_path, G_MODULE_BIND_LOCAL); g_free(plugin_path); if (plugin->dl_handle) { break; } } g_strfreev(plugin_search_dirs); } #endif if (plugin->dl_handle == NULL) { CRIT("Can not open %s plugin: %s", plugin->name, g_module_error()); goto cleanup_and_quit; } err = oh_load_plugin_functions(plugin, &plugin->abi); if (err < 0 || !plugin->abi || !plugin->abi->open) { CRIT("Can not get ABI"); goto cleanup_and_quit; } wrap_g_static_rec_mutex_lock(&oh_plugins.lock); oh_plugins.list = g_slist_append(oh_plugins.list, plugin); wrap_g_static_rec_mutex_unlock(&oh_plugins.lock); return 0; cleanup_and_quit: __delete_plugin(plugin); return -1; } /** * oh_unload_plugin * @plugin_name: String. Name of plugin to unload. * * Returns: 0 on Success. **/ int oh_unload_plugin(char *plugin_name) { struct oh_plugin *plugin = NULL; if (!plugin_name) { CRIT("ERROR unloading plugin. NULL parameter passed."); return -1; } plugin = oh_get_plugin(plugin_name); if (!plugin) { CRIT("ERROR unloading plugin. Plugin not found."); return -2; } if (plugin->handler_count > 0) { oh_release_plugin(plugin); CRIT("ERROR unloading plugin. Handlers are still referencing it."); return -3; } wrap_g_static_rec_mutex_lock(&oh_plugins.lock); oh_plugins.list = g_slist_remove(oh_plugins.list, plugin); wrap_g_static_rec_mutex_unlock(&oh_plugins.lock); __dec_plugin_refcount(plugin); if (plugin->refcount < 1) __delete_plugin(plugin); else oh_release_plugin(plugin); return 0; } static void __inc_handler_refcount(struct oh_handler *h) { wrap_g_static_rec_mutex_lock(&h->refcount_lock); h->refcount++; wrap_g_static_rec_mutex_unlock(&h->refcount_lock); } static void __dec_handler_refcount(struct oh_handler *h) { wrap_g_static_rec_mutex_lock(&h->refcount_lock); h->refcount--; wrap_g_static_rec_mutex_unlock(&h->refcount_lock); } static void __delete_handler(struct oh_handler *h) { struct oh_plugin *plugin = NULL; if (!h) return; /* Subtract one from the number of handlers using this plugin */ plugin = oh_get_plugin(h->plugin_name); if (!plugin) { CRIT("BAD ERROR - Handler loaded, but plugin does not exist!"); } else { plugin->handler_count--; oh_release_plugin(plugin); } /* Free the oh_handler members first, then the handler. */ g_hash_table_destroy(h->config); wrap_g_static_rec_mutex_free_clear(&h->lock); wrap_g_static_rec_mutex_free_clear(&h->refcount_lock); g_free(h); } /** * oh_get_handler * @hid: id of handler being requested * * Returns: NULL if handler was not found. **/ struct oh_handler *oh_get_handler(unsigned int hid) { GSList *node = NULL; struct oh_handler *handler = NULL; wrap_g_static_rec_mutex_lock(&oh_handlers.lock); node = g_hash_table_lookup(oh_handlers.table, &hid); handler = node ? node->data : NULL; if (!handler) { wrap_g_static_rec_mutex_unlock(&oh_handlers.lock); CRIT("Error - Handler %d was not found", hid); return NULL; } __inc_handler_refcount(handler); wrap_g_static_rec_mutex_unlock(&oh_handlers.lock); wrap_g_static_rec_mutex_lock(&handler->lock); return handler; } /** * oh_release_handler * @handler: a handler, previously obtained (i.e. locked) with * oh_get_handler(), to be released (i.e. unlocked). * * Returns: void **/ void oh_release_handler(struct oh_handler *handler) { if (!handler) { CRIT("Warning - NULL parameter passed."); return; } __dec_handler_refcount(handler); if (handler->refcount < 0) __delete_handler(handler); else wrap_g_static_rec_mutex_unlock(&handler->lock); } /** * oh_getnext_handler_id * @hid: If 0, will return the first handler id in the list. * Otherwise, indicates handler id previous to the one being requested. * @next_hid: Place where the next handler id after @hid * will be put. * * Returns: 0 on Success. **/ int oh_getnext_handler_id(unsigned int hid, unsigned int *next_hid) { GSList *node = NULL; struct oh_handler *h = NULL; if (!next_hid) { CRIT("ERROR. Invalid parameter."); return -1; } *next_hid = 0; if (!hid) { /* Return first handler id in the list */ wrap_g_static_rec_mutex_lock(&oh_handlers.lock); if (oh_handlers.list) { h = oh_handlers.list->data; *next_hid = h->id; wrap_g_static_rec_mutex_unlock(&oh_handlers.lock); return 0; } else { wrap_g_static_rec_mutex_unlock(&oh_handlers.lock); CRIT("Warning - no handlers"); return -1; } } else { /* Return handler id coming after hid in the list */ wrap_g_static_rec_mutex_lock(&oh_handlers.lock); node = g_hash_table_lookup(oh_handlers.table, &hid); if (node && node->next && node->next->data) { h = node->next->data; *next_hid = h->id; wrap_g_static_rec_mutex_unlock(&oh_handlers.lock); return 0; } wrap_g_static_rec_mutex_unlock(&oh_handlers.lock); } return -1; } static void copy_hashed_new_config (gpointer key, gpointer value, gpointer newhash) { g_hash_table_insert ( newhash, g_strdup(key), g_strdup(value) ); } static struct oh_handler *new_handler(GHashTable *handler_config) { /* Return a new oh_handler instance */ struct oh_plugin *plugin = NULL; struct oh_handler *handler = NULL; char *plugin_name = NULL; static unsigned int handler_id = 1; GHashTable *newconfig; if (!handler_config) { CRIT("ERROR creating new handler. Invalid parameter."); return NULL; } plugin_name = (char *)g_hash_table_lookup(handler_config, "plugin"); if (!plugin_name) { CRIT("ERROR creating new handler. No plugin name received."); return NULL; } handler = g_new0(struct oh_handler, 1); plugin = oh_get_plugin(plugin_name); if(!plugin) { /* Attempt to load plugin here once */ int rc = oh_load_plugin(plugin_name); if (rc) { CRIT("Could not create handler. Plugin %s not loaded", plugin_name); goto cleanexit; } plugin = oh_get_plugin(plugin_name); if (!plugin) { CRIT("Tried but could not get a plugin to " "create this handler."); goto cleanexit; } } /* Initialize handler */ handler->abi = plugin->abi; plugin->handler_count++; /* Increment # of handlers using the plugin */ oh_release_plugin(plugin); wrap_g_static_rec_mutex_lock(&oh_handlers.lock); handler->id = handler_id++; wrap_g_static_rec_mutex_unlock(&oh_handlers.lock); handler->plugin_name = g_strdup(g_hash_table_lookup(handler_config, "plugin")); //copy config in a new hash table newconfig = g_hash_table_new_full ( g_str_hash, g_str_equal, g_free, g_free); g_hash_table_foreach(handler_config,copy_hashed_new_config,newconfig); handler->config = newconfig; handler->refcount = 0; wrap_g_static_rec_mutex_init(&handler->lock); wrap_g_static_rec_mutex_init(&handler->refcount_lock); return handler; cleanexit: g_free(handler); return NULL; } /** * oh_create_handler * @handler_config: Hash table containing the configuration for a handler * read from the configuration file. * @hid: pointer where hid of newly created handler will be stored. * * Returns: SA_OK on success. If handler failed to open, then @hid will * contain a valid handler id, but SA_ERR_HPI_INTERNAL_ERROR will be * returned. **/ SaErrorT oh_create_handler (GHashTable *handler_config, unsigned int *hid) { struct oh_handler *handler = NULL; if (!handler_config || !hid) { CRIT("ERROR creating handler. Invalid parameters."); return SA_ERR_HPI_INVALID_PARAMS; } *hid = 0; handler = new_handler(handler_config); if (!handler) return SA_ERR_HPI_ERROR; *hid = handler->id; wrap_g_static_rec_mutex_lock(&oh_handlers.lock); oh_handlers.list = g_slist_append(oh_handlers.list, handler); g_hash_table_insert(oh_handlers.table, &(handler->id), g_slist_last(oh_handlers.list)); handler->hnd = handler->abi->open(handler->config, handler->id, oh_process_q); if (!handler->hnd) { CRIT("A handler #%d on the %s plugin could not be opened.", handler->id, handler->plugin_name); wrap_g_static_rec_mutex_unlock(&oh_handlers.lock); return SA_ERR_HPI_INTERNAL_ERROR; } // TODO reimplement to get timeout value from domain // set auto-extract timeout if (handler->abi->set_autoinsert_timeout) { struct oh_global_param param; SaErrorT rv; oh_get_global_param2(OPENHPI_AUTOINSERT_TIMEOUT, ¶m); SaHpiTimeoutT ai_timeout = param.u.ai_timeout; oh_get_global_param2(OPENHPI_AUTOINSERT_TIMEOUT_READONLY, ¶m); DBG("auto-insert timeout readonly=%d, auto-insert timeout to set=%" PRId64, param.u.ai_timeout_readonly, (int64_t)ai_timeout); if (!param.u.ai_timeout_readonly && ai_timeout) { rv = handler->abi->set_autoinsert_timeout(handler->hnd, ai_timeout); if (rv != SA_OK) { CRIT("Cannot propagate auto-insert timeout to handler."); } } } wrap_g_static_rec_mutex_unlock(&oh_handlers.lock); return SA_OK; } /** * oh_destroy_handler * @hid: Id of handler to destroy * * Returns: 0 on Success. **/ int oh_destroy_handler(unsigned int hid) { struct oh_handler *handler = NULL; if (hid < 1) { CRIT("ERROR - Invalid handler 0 id passed."); return -1; } handler = oh_get_handler(hid); if (!handler) { CRIT("ERROR - Handler %d not found.", hid); return -1; } if (handler->abi && handler->abi->close) { if (handler->hnd) { handler->abi->close(handler->hnd); } } wrap_g_static_rec_mutex_lock(&oh_handlers.lock); g_hash_table_remove(oh_handlers.table, &handler->id); oh_handlers.list = g_slist_remove(oh_handlers.list, &(handler->id)); wrap_g_static_rec_mutex_unlock(&oh_handlers.lock); __dec_handler_refcount(handler); if (handler->refcount < 1) __delete_handler(handler); else oh_release_handler(handler); return 0; } /** * oh_get_handler_info * * Returns: SA_OK on success. **/ // helper function to copy hash table static void copy_hashed_config_info (gpointer key, gpointer value, gpointer newhash) { g_hash_table_insert ( newhash, g_strdup(key), g_strdup(value) ); } SaErrorT oh_get_handler_info(unsigned int hid, oHpiHandlerInfoT *info, GHashTable *conf_params) { struct oh_handler *h = NULL; GSList *node = NULL; if ((hid == 0) || (!info) || (!conf_params)) { return SA_ERR_HPI_INVALID_PARAMS; } wrap_g_static_rec_mutex_lock(&oh_handlers.lock); node = g_hash_table_lookup(oh_handlers.table, &hid); h = node ? (struct oh_handler *)(node->data) : NULL; if (!h) { wrap_g_static_rec_mutex_unlock(&oh_handlers.lock); return SA_ERR_HPI_NOT_PRESENT; } info->id = hid; strncpy((char*)info->plugin_name, (const char*)h->plugin_name, MAX_PLUGIN_NAME_LENGTH); oh_init_ep(&info->entity_root); const char * entity_root_str = (const char *)g_hash_table_lookup(h->config, "entity_root"); if ( entity_root_str ) { oh_encode_entitypath(entity_root_str, &info->entity_root); } info->load_failed = (!h->hnd) ? 1 : 0; // copy h->config to the output hash table g_hash_table_foreach(h->config,copy_hashed_config_info,conf_params); //Don't transmit passwords in case the handler has a password in its config if (g_hash_table_lookup(conf_params,"password")) g_hash_table_replace(conf_params, g_strdup("password"), g_strdup("********")); wrap_g_static_rec_mutex_unlock(&oh_handlers.lock); return SA_OK; } /** * oh_discover_resources * * Returns: SA_OK on success. **/ SaErrorT oh_discovery(void) { unsigned int hid = 0, next_hid; struct oh_handler *h = NULL; SaErrorT error = SA_ERR_HPI_ERROR; oh_getnext_handler_id(hid, &next_hid); while (next_hid) { hid = next_hid; if(signal_stop == TRUE){ error = SA_OK; break; } SaErrorT cur_error; h = oh_get_handler(hid); if (!h) { CRIT("No such handler %d", hid); break; } if (h->abi->discover_resources && h->hnd) { cur_error = h->abi->discover_resources(h->hnd); if (cur_error == SA_OK && error) { error = cur_error; } } oh_release_handler(h); oh_getnext_handler_id(hid, &next_hid); } return error; } /** * oh_load_plugin_functions * @plugin: plugin structure. * @abi: oh_abi struct * * This function will load the symbol table from the plugin name and * assign the plugin functions to the abi struct. * * Return value: 0 on success, otherwise any negative value on failure. **/ int oh_load_plugin_functions(struct oh_plugin *plugin, struct oh_abi_v2 **abi) { *abi = g_new0(struct oh_abi_v2, 1); if (!(*abi)) { CRIT("Out of Memory!"); return -1; } g_module_symbol(plugin->dl_handle, "oh_open", (gpointer*)(&(*abi)->open)); g_module_symbol(plugin->dl_handle, "oh_close", (gpointer*)(&(*abi)->close)); g_module_symbol(plugin->dl_handle, "oh_get_event", (gpointer*)(&(*abi)->get_event)); g_module_symbol(plugin->dl_handle, "oh_discover_resources", (gpointer*)(&(*abi)->discover_resources)); g_module_symbol(plugin->dl_handle, "oh_set_resource_tag", (gpointer*)(&(*abi)->set_resource_tag)); g_module_symbol(plugin->dl_handle, "oh_set_resource_severity", (gpointer*)(&(*abi)->set_resource_severity)); g_module_symbol(plugin->dl_handle, "oh_resource_failed_remove", (gpointer*)(&(*abi)->resource_failed_remove)); g_module_symbol(plugin->dl_handle, "oh_get_el_info", (gpointer*)(&(*abi)->get_el_info)); g_module_symbol(plugin->dl_handle, "oh_get_el_caps", (gpointer*)(&(*abi)->get_el_caps)); g_module_symbol(plugin->dl_handle, "oh_set_el_time", (gpointer*)(&(*abi)->set_el_time)); g_module_symbol(plugin->dl_handle, "oh_add_el_entry", (gpointer*)(&(*abi)->add_el_entry)); g_module_symbol(plugin->dl_handle, "oh_get_el_entry", (gpointer*)(&(*abi)->get_el_entry)); g_module_symbol(plugin->dl_handle, "oh_clear_el", (gpointer*)(&(*abi)->clear_el)); g_module_symbol(plugin->dl_handle, "oh_set_el_state", (gpointer*)(&(*abi)->set_el_state)); g_module_symbol(plugin->dl_handle, "oh_reset_el_overflow", (gpointer*)(&(*abi)->reset_el_overflow)); g_module_symbol(plugin->dl_handle, "oh_get_sensor_reading", (gpointer*)(&(*abi)->get_sensor_reading)); g_module_symbol(plugin->dl_handle, "oh_get_sensor_thresholds", (gpointer*)(&(*abi)->get_sensor_thresholds)); g_module_symbol(plugin->dl_handle, "oh_set_sensor_thresholds", (gpointer*)(&(*abi)->set_sensor_thresholds)); g_module_symbol(plugin->dl_handle, "oh_get_sensor_enable", (gpointer*)(&(*abi)->get_sensor_enable)); g_module_symbol(plugin->dl_handle, "oh_set_sensor_enable", (gpointer*)(&(*abi)->set_sensor_enable)); g_module_symbol(plugin->dl_handle, "oh_get_sensor_event_enables", (gpointer*)(&(*abi)->get_sensor_event_enables)); g_module_symbol(plugin->dl_handle, "oh_set_sensor_event_enables", (gpointer*)(&(*abi)->set_sensor_event_enables)); g_module_symbol(plugin->dl_handle, "oh_get_sensor_event_masks", (gpointer*)(&(*abi)->get_sensor_event_masks)); g_module_symbol(plugin->dl_handle, "oh_set_sensor_event_masks", (gpointer*)(&(*abi)->set_sensor_event_masks)); g_module_symbol(plugin->dl_handle, "oh_get_control_state", (gpointer*)(&(*abi)->get_control_state)); g_module_symbol(plugin->dl_handle, "oh_set_control_state", (gpointer*)(&(*abi)->set_control_state)); g_module_symbol(plugin->dl_handle, "oh_get_idr_info", (gpointer*)(&(*abi)->get_idr_info)); g_module_symbol(plugin->dl_handle, "oh_get_idr_area_header", (gpointer*)(&(*abi)->get_idr_area_header)); g_module_symbol(plugin->dl_handle, "oh_add_idr_area", (gpointer*)(&(*abi)->add_idr_area)); g_module_symbol(plugin->dl_handle, "oh_add_idr_area_id", (gpointer*)(&(*abi)->add_idr_area_id)); g_module_symbol(plugin->dl_handle, "oh_del_idr_area", (gpointer*)(&(*abi)->del_idr_area)); g_module_symbol(plugin->dl_handle, "oh_get_idr_field", (gpointer*)(&(*abi)->get_idr_field)); g_module_symbol(plugin->dl_handle, "oh_add_idr_field", (gpointer*)(&(*abi)->add_idr_field)); g_module_symbol(plugin->dl_handle, "oh_add_idr_field_id", (gpointer*)(&(*abi)->add_idr_field_id)); g_module_symbol(plugin->dl_handle, "oh_set_idr_field", (gpointer*)(&(*abi)->set_idr_field)); g_module_symbol(plugin->dl_handle, "oh_del_idr_field", (gpointer*)(&(*abi)->del_idr_field)); g_module_symbol(plugin->dl_handle, "oh_get_watchdog_info", (gpointer*)(&(*abi)->get_watchdog_info)); g_module_symbol(plugin->dl_handle, "oh_set_watchdog_info", (gpointer*)(&(*abi)->set_watchdog_info)); g_module_symbol(plugin->dl_handle, "oh_reset_watchdog", (gpointer*)(&(*abi)->reset_watchdog)); g_module_symbol(plugin->dl_handle, "oh_get_next_announce", (gpointer*)(&(*abi)->get_next_announce)); g_module_symbol(plugin->dl_handle, "oh_get_announce", (gpointer*)(&(*abi)->get_announce)); g_module_symbol(plugin->dl_handle, "oh_ack_announce", (gpointer*)(&(*abi)->ack_announce)); g_module_symbol(plugin->dl_handle, "oh_add_announce", (gpointer*)(&(*abi)->add_announce)); g_module_symbol(plugin->dl_handle, "oh_del_announce", (gpointer*)(&(*abi)->del_announce)); g_module_symbol(plugin->dl_handle, "oh_get_annunc_mode", (gpointer*)(&(*abi)->get_annunc_mode)); g_module_symbol(plugin->dl_handle, "oh_set_annunc_mode", (gpointer*)(&(*abi)->set_annunc_mode)); g_module_symbol(plugin->dl_handle, "oh_get_dimi_info", (gpointer*)(&(*abi)->get_dimi_info)); g_module_symbol(plugin->dl_handle, "oh_get_dimi_test", (gpointer*)(&(*abi)->get_dimi_test)); g_module_symbol(plugin->dl_handle, "oh_get_dimi_test_ready", (gpointer*)(&(*abi)->get_dimi_test_ready)); g_module_symbol(plugin->dl_handle, "oh_start_dimi_test", (gpointer*)(&(*abi)->start_dimi_test)); g_module_symbol(plugin->dl_handle, "oh_cancel_dimi_test", (gpointer*)(&(*abi)->cancel_dimi_test)); g_module_symbol(plugin->dl_handle, "oh_get_dimi_test_status", (gpointer*)(&(*abi)->get_dimi_test_status)); g_module_symbol(plugin->dl_handle, "oh_get_dimi_test_results", (gpointer*)(&(*abi)->get_dimi_test_results)); g_module_symbol(plugin->dl_handle, "oh_get_fumi_spec", (gpointer*)(&(*abi)->get_fumi_spec)); g_module_symbol(plugin->dl_handle, "oh_get_fumi_service_impact", (gpointer*)(&(*abi)->get_fumi_service_impact)); g_module_symbol(plugin->dl_handle, "oh_set_fumi_source", (gpointer*)(&(*abi)->set_fumi_source)); g_module_symbol(plugin->dl_handle, "oh_validate_fumi_source", (gpointer*)(&(*abi)->validate_fumi_source)); g_module_symbol(plugin->dl_handle, "oh_get_fumi_source", (gpointer*)(&(*abi)->get_fumi_source)); g_module_symbol(plugin->dl_handle, "oh_get_fumi_source_component", (gpointer*)(&(*abi)->get_fumi_source_component)); g_module_symbol(plugin->dl_handle, "oh_get_fumi_target", (gpointer*)(&(*abi)->get_fumi_target)); g_module_symbol(plugin->dl_handle, "oh_get_fumi_target_component", (gpointer*)(&(*abi)->get_fumi_target_component)); g_module_symbol(plugin->dl_handle, "oh_get_fumi_logical_target", (gpointer*)(&(*abi)->get_fumi_logical_target)); g_module_symbol(plugin->dl_handle, "oh_get_fumi_logical_target_component", (gpointer*)(&(*abi)->get_fumi_logical_target_component)); g_module_symbol(plugin->dl_handle, "oh_start_fumi_backup", (gpointer*)(&(*abi)->start_fumi_backup)); g_module_symbol(plugin->dl_handle, "oh_set_fumi_bank_order", (gpointer*)(&(*abi)->set_fumi_bank_order)); g_module_symbol(plugin->dl_handle, "oh_start_fumi_bank_copy", (gpointer*)(&(*abi)->start_fumi_bank_copy)); g_module_symbol(plugin->dl_handle, "oh_start_fumi_install", (gpointer*)(&(*abi)->start_fumi_install)); g_module_symbol(plugin->dl_handle, "oh_get_fumi_status", (gpointer*)(&(*abi)->get_fumi_status)); g_module_symbol(plugin->dl_handle, "oh_start_fumi_verify", (gpointer*)(&(*abi)->start_fumi_verify)); g_module_symbol(plugin->dl_handle, "oh_start_fumi_verify_main", (gpointer*)(&(*abi)->start_fumi_verify_main)); g_module_symbol(plugin->dl_handle, "oh_cancel_fumi_upgrade", (gpointer*)(&(*abi)->cancel_fumi_upgrade)); g_module_symbol(plugin->dl_handle, "oh_get_fumi_autorollback_disable", (gpointer*)(&(*abi)->get_fumi_autorollback_disable)); g_module_symbol(plugin->dl_handle, "oh_set_fumi_autorollback_disable", (gpointer*)(&(*abi)->set_fumi_autorollback_disable)); g_module_symbol(plugin->dl_handle, "oh_start_fumi_rollback", (gpointer*)(&(*abi)->start_fumi_rollback)); g_module_symbol(plugin->dl_handle, "oh_activate_fumi", (gpointer*)(&(*abi)->activate_fumi)); g_module_symbol(plugin->dl_handle, "oh_start_fumi_activate", (gpointer*)(&(*abi)->start_fumi_activate)); g_module_symbol(plugin->dl_handle, "oh_cleanup_fumi", (gpointer*)(&(*abi)->cleanup_fumi)); g_module_symbol(plugin->dl_handle, "oh_hotswap_policy_cancel", (gpointer*)(&(*abi)->hotswap_policy_cancel)); g_module_symbol(plugin->dl_handle, "oh_get_hotswap_state", (gpointer*)(&(*abi)->get_hotswap_state)); g_module_symbol(plugin->dl_handle, "oh_set_autoinsert_timeout", (gpointer*)(&(*abi)->set_autoinsert_timeout)); g_module_symbol(plugin->dl_handle, "oh_set_hotswap_state", (gpointer*)(&(*abi)->set_hotswap_state)); g_module_symbol(plugin->dl_handle, "oh_request_hotswap_action", (gpointer*)(&(*abi)->request_hotswap_action)); g_module_symbol(plugin->dl_handle, "oh_get_autoextract_timeout", (gpointer*)(&(*abi)->get_autoextract_timeout)); g_module_symbol(plugin->dl_handle, "oh_set_autoextract_timeout", (gpointer*)(&(*abi)->set_autoextract_timeout)); g_module_symbol(plugin->dl_handle, "oh_get_power_state", (gpointer*)(&(*abi)->get_power_state)); g_module_symbol(plugin->dl_handle, "oh_set_power_state", (gpointer*)(&(*abi)->set_power_state)); g_module_symbol(plugin->dl_handle, "oh_get_indicator_state", (gpointer*)(&(*abi)->get_indicator_state)); g_module_symbol(plugin->dl_handle, "oh_set_indicator_state", (gpointer*)(&(*abi)->set_indicator_state)); g_module_symbol(plugin->dl_handle, "oh_control_parm", (gpointer*)(&(*abi)->control_parm)); g_module_symbol(plugin->dl_handle, "oh_load_id_get", (gpointer*)(&(*abi)->load_id_get)); g_module_symbol(plugin->dl_handle, "oh_load_id_set", (gpointer*)(&(*abi)->load_id_set)); g_module_symbol(plugin->dl_handle, "oh_get_reset_state", (gpointer*)(&(*abi)->get_reset_state)); g_module_symbol(plugin->dl_handle, "oh_set_reset_state", (gpointer*)(&(*abi)->set_reset_state)); g_module_symbol(plugin->dl_handle, "oh_inject_event", (gpointer*)(&(*abi)->inject_event)); return 0; } openhpi-3.6.1/openhpid/server.cpp0000644000175100017510000017344512575647301016023 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004-2008 * (C) Copyright Pigeon Point Systems. 2010 * (C) Copyright Nokia Siemens Networks 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley * David Judkoivcs * Renier Morales * Anton Pak * Ulrich Kleber * */ #include #include #include #include #include #include #include #include #include #include /*--------------------------------------------------------------------*/ /* Forward Declarations */ /*--------------------------------------------------------------------*/ static void service_thread(gpointer sock_ptr, gpointer /* user_data */); static SaErrorT process_msg(cHpiMarshal * hm, int rq_byte_order, char * data, uint32_t& data_len, SaHpiSessionIdT& changed_sid); /*--------------------------------------------------------------------*/ /* Local Definitions */ /*--------------------------------------------------------------------*/ #if GLIB_CHECK_VERSION (2, 32, 0) static GRecMutex lock; #else static GStaticRecMutex lock = G_STATIC_REC_MUTEX_INIT; #endif static volatile bool stop = false; static GList * sockets = 0; /*--------------------------------------------------------------------*/ /* Socket List */ /*--------------------------------------------------------------------*/ static void add_socket_to_list( cStreamSock * sock ) { wrap_g_static_rec_mutex_lock(&lock); sockets = g_list_prepend( sockets, sock ); wrap_g_static_rec_mutex_unlock(&lock); } static void remove_socket_from_list( const cStreamSock * sock ) { wrap_g_static_rec_mutex_lock(&lock); sockets = g_list_remove( sockets, sock ); wrap_g_static_rec_mutex_unlock(&lock); } static void close_sockets_in_list( void ) { wrap_g_static_rec_mutex_lock(&lock); for ( GList * iter = sockets; iter != 0; iter = g_list_next( iter ) ) { cStreamSock * sock = reinterpret_cast(iter->data); sock->Close(); } wrap_g_static_rec_mutex_unlock(&lock); } /*--------------------------------------------------------------------*/ /* Function to dehash handler cfg for oHpiHandlerInfo */ /*--------------------------------------------------------------------*/ static void dehash_handler_cfg(gpointer key, gpointer value, gpointer data) { oHpiHandlerConfigT *hc = (oHpiHandlerConfigT *)data; strncpy((char *)hc->Params[hc->NumberOfParams].Name, (const char *)key, SAHPI_MAX_TEXT_BUFFER_LENGTH); strncpy((char *)hc->Params[hc->NumberOfParams].Value, (const char *)value, SAHPI_MAX_TEXT_BUFFER_LENGTH); ++hc->NumberOfParams; } /*--------------------------------------------------------------------*/ /* Function to log connection address */ /*--------------------------------------------------------------------*/ static void LogIp( const cStreamSock * sock ) { sockaddr_storage storage; bool rc = sock->GetPeerAddress( storage ); if ( !rc ) { WARN( "Cannot determine connection address!" ); return; } if ( storage.ss_family == AF_INET ) { const struct sockaddr_in * sa4 = reinterpret_cast(&storage); const uint8_t * ip = reinterpret_cast( &sa4->sin_addr ); INFO( "Got connection from %u.%u.%u.%u port %u", ip[0], ip[1], ip[2], ip[3], g_ntohs( sa4->sin_port ) ); } else if ( storage.ss_family == AF_INET6 ) { const struct sockaddr_in6 * sa6 = reinterpret_cast(&storage); const uint8_t * ip = reinterpret_cast( &sa6->sin6_addr ); INFO( "HPI: Got connection from" " %02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x" " port %u", ip[0], ip[1], ip[2], ip[3], ip[4], ip[5], ip[6], ip[7], ip[8], ip[9], ip[10], ip[11], ip[12], ip[13], ip[14], ip[15], g_ntohs( sa6->sin6_port ) ); } else { WARN( "Unsupported socket address family!" ); } } /*--------------------------------------------------------------------*/ /* HPI Server Interface */ /*--------------------------------------------------------------------*/ bool oh_server_run( int ipvflags, const char * bindaddr, uint16_t port, unsigned int sock_timeout, int max_threads ) { // create the server socket cServerStreamSock * ssock = new cServerStreamSock; if (!ssock->Create(ipvflags, bindaddr, port)) { CRIT("Error creating server socket. Exiting."); return false; } add_socket_to_list( ssock ); // create the thread pool GThreadPool *pool; pool = g_thread_pool_new(service_thread, 0, max_threads, FALSE, 0); cStreamSock::eWaitCc wc; // wait for a connection and then service the connection while (!stop) { if ( ( wc = ssock->Wait() ) == cStreamSock::eWaitError ) { if (stop) { break; } g_usleep( 1000000 ); // in case the problem is persistent CRIT( "Waiting on server socket failed" ); continue; } if ( wc == cStreamSock::eWaitTimeout ) { continue; } cStreamSock * sock = ssock->Accept(); if (!sock) { CRIT("Error accepting server socket."); g_usleep( 1000000 ); // in case the problem is persistent continue; } if (stop) { break; } LogIp( sock ); add_socket_to_list( sock ); DBG("### Spawning thread to handle connection. ###"); g_thread_pool_push(pool, (gpointer)sock, 0); } remove_socket_from_list( ssock ); delete ssock; DBG("Server socket closed."); g_thread_pool_free(pool, FALSE, TRUE); DBG("All connection threads are terminated."); return true; } void oh_server_request_stop(void) { stop = true; close_sockets_in_list(); } /*--------------------------------------------------------------------*/ /* Function: service_thread */ /*--------------------------------------------------------------------*/ static void service_thread(gpointer sock_ptr, gpointer /* user_data */) { cStreamSock * sock = (cStreamSock *)sock_ptr; gpointer thrdid; thrdid = g_thread_self(); // TODO several sids for one connection SaHpiSessionIdT my_sid = 0; DBG("%p Servicing connection.", thrdid); /* set the read timeout for the socket */ // TODO //sock->SetReadTimeout(sock_timeout); DBG("### service_thread, thrdid [%p] ###", (void *)thrdid); while (!stop) { bool rc; char data[dMaxPayloadLength]; uint32_t data_len; uint8_t type; uint32_t id; int rq_byte_order; rc = sock->ReadMsg(type, id, data, data_len, rq_byte_order); if (stop) { break; } if (!rc) { // The following error message need not be there as the // ReadMsg captures the error when it returns false and // one of the false return is not a real error // CRIT("%p Error or Timeout while reading socket.", thrdid); break; } else if (type != eMhMsg) { CRIT("%p Unsupported message type. Discarding.", thrdid); sock->WriteMsg(eMhError, id, 0, 0); } else { cHpiMarshal *hm = HpiMarshalFind(id); SaErrorT process_rv; SaHpiSessionIdT changed_sid = 0; if ( hm ) { process_rv = process_msg(hm, rq_byte_order, data, data_len, changed_sid); } else { process_rv = SA_ERR_HPI_UNSUPPORTED_API; } if (process_rv != SA_OK) { int cc = HpiMarshalReply0(hm, data, &process_rv); if (cc < 0) { CRIT("%p Marshal failed, cc = %d", thrdid, cc); break; } data_len = (uint32_t)cc; } rc = sock->WriteMsg(eMhMsg, id, data, data_len); if (stop) { break; } if (!rc) { CRIT("%p Socket write failed.", thrdid); break; } if ((process_rv == SA_OK) && (changed_sid != 0)) { if (id == eFsaHpiSessionOpen) { my_sid = changed_sid; } else if (id == eFsaHpiSessionClose) { my_sid = 0; break; } } } } // if necessary, clean up HPI lib data if (my_sid != 0) { saHpiSessionClose(my_sid); } remove_socket_from_list( sock ); delete sock; // cleanup thread instance data DBG("%p Connection closed.", thrdid); return; // do NOT use g_thread_exit here! // TODO why? what is wrong with g_thread_exit? (2011-06-07) } /*----------------------------------------------------------------------------*/ /* RPC Call Processing */ /*----------------------------------------------------------------------------*/ #define DEMARSHAL_RQ(rq_byte_order, hm, data, iparams) \ { \ int cc = HpiDemarshalRequest(rq_byte_order, hm, data, iparams.array); \ if (cc < 0) { \ return SA_ERR_HPI_INVALID_PARAMS; \ } \ } #define MARSHAL_RP(hm, data, data_len, oparams) \ { \ int cc = HpiMarshalReply(hm, data, oparams.const_array); \ if (cc < 0) { \ return SA_ERR_HPI_INTERNAL_ERROR; \ } \ data_len = (uint32_t)cc; \ } /*--------------------------------------------------------------------*/ /* Function: process_msg */ /*--------------------------------------------------------------------*/ static SaErrorT process_msg(cHpiMarshal * hm, int rq_byte_order, char * data, uint32_t& data_len, SaHpiSessionIdT& changed_sid) { gpointer thrdid; thrdid = g_thread_self(); DBG("%p Processing RPC request %d.", thrdid, hm->m_id); changed_sid = 0; // These vars are used in many places SaErrorT rv; SaHpiSessionIdT sid; SaHpiResourceIdT rid; SaHpiSensorNumT snum; SaHpiCtrlNumT cnum; SaHpiIdrIdT iid; SaHpiWatchdogNumT wnum; SaHpiAnnunciatorNumT anum; SaHpiDimiNumT dnum; SaHpiFumiNumT fnum; SaHpiRdrT rdr; SaHpiRptEntryT rpte; switch(hm->m_id) { case eFsaHpiSessionOpen: { SaHpiDomainIdT did; void *security = 0; RpcParams iparams(&did); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); DBG("OpenHPID calling the saHpiSessionOpen"); rv = saHpiSessionOpen(OH_DEFAULT_DOMAIN_ID, &sid, security); if (rv == SA_OK) { changed_sid = sid; } RpcParams oparams(&rv, &sid); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiSessionClose: { RpcParams iparams(&sid); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiSessionClose(sid); if (rv == SA_OK) { changed_sid = sid; } RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiDiscover: { RpcParams iparams(&sid); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiDiscover(sid); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiDomainInfoGet: { SaHpiDomainInfoT info; RpcParams iparams(&sid); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiDomainInfoGet(sid, &info); RpcParams oparams(&rv, &info); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiDrtEntryGet: { SaHpiEntryIdT eid; SaHpiEntryIdT next_eid; SaHpiDrtEntryT drte; RpcParams iparams(&sid, &eid); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiDrtEntryGet(sid, eid, &next_eid, &drte); RpcParams oparams(&rv, &next_eid, &drte); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiDomainTagSet: { SaHpiTextBufferT tag; RpcParams iparams(&sid, &tag); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiDomainTagSet(sid, &tag); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiRptEntryGet: { SaHpiEntryIdT eid; SaHpiEntryIdT next_eid; RpcParams iparams(&sid, &eid); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiRptEntryGet(sid, eid, &next_eid, &rpte); RpcParams oparams(&rv, &next_eid, &rpte); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiRptEntryGetByResourceId: { RpcParams iparams(&sid, &rid); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiRptEntryGetByResourceId(sid, rid, &rpte); RpcParams oparams(&rv, &rpte); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiResourceSeveritySet: { SaHpiSeverityT sev; RpcParams iparams(&sid, &rid, &sev); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiResourceSeveritySet(sid, rid, sev); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiResourceTagSet: { SaHpiTextBufferT tag; RpcParams iparams(&sid, &rid, &tag); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiResourceTagSet(sid, rid, &tag); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiMyEntityPathGet: { SaHpiEntityPathT ep; RpcParams iparams(&sid); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiMyEntityPathGet(sid, &ep); RpcParams oparams(&rv, &ep); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiResourceIdGet: { RpcParams iparams(&sid); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiResourceIdGet(sid, &rid); RpcParams oparams(&rv, &rid); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiGetIdByEntityPath: { SaHpiEntityPathT ep; SaHpiRdrTypeT instr_type; SaHpiUint32T instance; SaHpiInstrumentIdT instr_id; SaHpiUint32T rpt_update_cnt; RpcParams iparams(&sid, &ep, &instr_type, &instance); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiGetIdByEntityPath(sid, ep, instr_type, &instance, &rid, &instr_id, &rpt_update_cnt); RpcParams oparams(&rv, &instance, &rid, &instr_id, &rpt_update_cnt); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiGetChildEntityPath: { SaHpiEntityPathT parent_ep; SaHpiUint32T instance; SaHpiEntityPathT child_ep; SaHpiUint32T rpt_update_cnt; RpcParams iparams(&sid, &parent_ep, &instance); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiGetChildEntityPath(sid, parent_ep, &instance, &child_ep, &rpt_update_cnt); RpcParams oparams(&rv, &instance, &child_ep, &rpt_update_cnt); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiResourceFailedRemove: { RpcParams iparams(&sid, &rid); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiResourceFailedRemove(sid, rid); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiEventLogInfoGet: { SaHpiEventLogInfoT info; RpcParams iparams(&sid, &rid); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiEventLogInfoGet(sid, rid, &info); RpcParams oparams(&rv, &info); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiEventLogCapabilitiesGet: { SaHpiEventLogCapabilitiesT caps; RpcParams iparams(&sid, &rid); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiEventLogCapabilitiesGet(sid, rid, &caps); RpcParams oparams(&rv, &caps); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiEventLogEntryGet: { SaHpiEventLogEntryIdT eid; SaHpiEventLogEntryIdT prev_eid; SaHpiEventLogEntryIdT next_eid; SaHpiEventLogEntryT ele; RpcParams iparams(&sid, &rid, &eid); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiEventLogEntryGet(sid, rid, eid, &prev_eid, &next_eid, &ele, &rdr, &rpte); RpcParams oparams(&rv, &prev_eid, &next_eid, &ele, &rdr, &rpte); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiEventLogEntryAdd: { SaHpiEventT evt; RpcParams iparams(&sid, &rid, &evt); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiEventLogEntryAdd(sid, rid, &evt); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiEventLogClear: { RpcParams iparams(&sid, &rid); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiEventLogClear(sid, rid); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiEventLogTimeGet: { SaHpiTimeT time; RpcParams iparams(&sid, &rid); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiEventLogTimeGet(sid, rid, &time); RpcParams oparams(&rv, &time); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiEventLogTimeSet: { SaHpiTimeT time; RpcParams iparams(&sid, &rid, &time); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiEventLogTimeSet(sid, rid, time); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiEventLogStateGet: { SaHpiBoolT enable; RpcParams iparams(&sid, &rid); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiEventLogStateGet(sid, rid, &enable); RpcParams oparams(&rv, &enable); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiEventLogStateSet: { SaHpiBoolT enable; RpcParams iparams(&sid, &rid, &enable); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiEventLogStateSet(sid, rid, enable); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiEventLogOverflowReset: { RpcParams iparams(&sid, &rid); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiEventLogOverflowReset(sid, rid); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiSubscribe: { RpcParams iparams(&sid); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiSubscribe(sid); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiUnsubscribe: { RpcParams iparams(&sid); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiUnsubscribe(sid); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiEventGet: { SaHpiTimeoutT timeout; SaHpiEventT evt; SaHpiEvtQueueStatusT status; RpcParams iparams(&sid, &timeout); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiEventGet(sid, timeout, &evt, &rdr, &rpte, &status); RpcParams oparams(&rv, &evt, &rdr, &rpte, &status); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiEventAdd: { SaHpiEventT evt; RpcParams iparams(&sid, &evt); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiEventAdd(sid, &evt); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiAlarmGetNext: { SaHpiSeverityT sev; SaHpiBoolT unack; SaHpiAlarmT alarm; RpcParams iparams(&sid, &sev, &unack, &alarm); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiAlarmGetNext(sid, sev, unack, &alarm); RpcParams oparams(&rv, &alarm); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiAlarmGet: { SaHpiAlarmIdT aid; SaHpiAlarmT alarm; RpcParams iparams(&sid, &aid); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiAlarmGet(sid, aid, &alarm); RpcParams oparams(&rv, &alarm); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiAlarmAcknowledge: { SaHpiAlarmIdT aid; SaHpiSeverityT sev; RpcParams iparams(&sid, &aid, &sev); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiAlarmAcknowledge(sid, aid, sev); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiAlarmAdd: { SaHpiAlarmT alarm; RpcParams iparams(&sid, &alarm); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiAlarmAdd(sid, &alarm); RpcParams oparams(&rv, &alarm); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiAlarmDelete: { SaHpiAlarmIdT aid; SaHpiSeverityT sev; RpcParams iparams(&sid, &aid, &sev); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiAlarmDelete(sid, aid, sev); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiRdrGet: { SaHpiEntryIdT eid; SaHpiEntryIdT next_eid; RpcParams iparams(&sid, &rid, &eid); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiRdrGet(sid, rid, eid, &next_eid, &rdr); RpcParams oparams(&rv, &next_eid, &rdr); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiRdrGetByInstrumentId: { SaHpiRdrTypeT rdr_type; SaHpiInstrumentIdT instr_id; RpcParams iparams(&sid, &rid, &rdr_type, &instr_id); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiRdrGetByInstrumentId(sid, rid, rdr_type, instr_id, &rdr); RpcParams oparams(&rv, &rdr); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiRdrUpdateCountGet: { SaHpiUint32T rdr_update_cnt; RpcParams iparams(&sid, &rid); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiRdrUpdateCountGet(sid, rid, &rdr_update_cnt); RpcParams oparams(&rv, &rdr_update_cnt); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiSensorReadingGet: { SaHpiSensorReadingT reading; SaHpiEventStateT state; RpcParams iparams(&sid, &rid, &snum); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiSensorReadingGet(sid, rid, snum, &reading, &state); RpcParams oparams(&rv, &reading, &state); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiSensorThresholdsGet: { SaHpiSensorThresholdsT tholds; RpcParams iparams(&sid, &rid, &snum); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiSensorThresholdsGet(sid, rid, snum, &tholds); RpcParams oparams(&rv, &tholds); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiSensorThresholdsSet: { SaHpiSensorThresholdsT tholds; RpcParams iparams(&sid, &rid, &snum, &tholds); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiSensorThresholdsSet(sid, rid, snum, &tholds); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiSensorTypeGet: { SaHpiSensorTypeT type; SaHpiEventCategoryT cat; RpcParams iparams(&sid, &rid, &snum); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiSensorTypeGet(sid, rid, snum, &type, &cat); RpcParams oparams(&rv, &type, &cat); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiSensorEnableGet: { SaHpiBoolT enabled; RpcParams iparams(&sid, &rid, &snum); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiSensorEnableGet(sid, rid, snum, &enabled); RpcParams oparams(&rv, &enabled); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiSensorEnableSet: { SaHpiBoolT enabled; RpcParams iparams(&sid, &rid, &snum, &enabled); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiSensorEnableSet(sid, rid, snum, enabled); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiSensorEventEnableGet: { SaHpiBoolT enabled; RpcParams iparams(&sid, &rid, &snum); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiSensorEventEnableGet(sid, rid, snum, &enabled); RpcParams oparams(&rv, &enabled); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiSensorEventEnableSet: { SaHpiBoolT enabled; RpcParams iparams(&sid, &rid, &snum, &enabled); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiSensorEventEnableSet(sid, rid, snum, enabled); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiSensorEventMasksGet: { SaHpiEventStateT amask; SaHpiEventStateT dmask; RpcParams iparams(&sid, &rid, &snum, &amask, &dmask); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiSensorEventMasksGet(sid, rid, snum, &amask, &dmask); RpcParams oparams(&rv, &amask, &dmask); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiSensorEventMasksSet: { SaHpiSensorEventMaskActionT action; SaHpiEventStateT amask; SaHpiEventStateT dmask; RpcParams iparams(&sid, &rid, &snum, &action, &amask, &dmask); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiSensorEventMasksSet(sid, rid, snum, action, amask, dmask); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiControlTypeGet: { SaHpiCtrlTypeT type; RpcParams iparams(&sid, &rid, &cnum); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiControlTypeGet(sid, rid, cnum, &type); RpcParams oparams(&rv, &type); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiControlGet: { SaHpiCtrlModeT mode; SaHpiCtrlStateT state; RpcParams iparams(&sid, &rid, &cnum, &state); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiControlGet(sid, rid, cnum, &mode, &state); RpcParams oparams(&rv, &mode, &state); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiControlSet: { SaHpiCtrlModeT mode; SaHpiCtrlStateT state; RpcParams iparams(&sid, &rid, &cnum, &mode, &state); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiControlSet(sid, rid, cnum, mode, &state); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiIdrInfoGet: { SaHpiIdrInfoT info; RpcParams iparams(&sid, &rid, &iid); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiIdrInfoGet(sid, rid, iid, &info); RpcParams oparams(&rv, &info); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiIdrAreaHeaderGet: { SaHpiIdrAreaTypeT area; SaHpiEntryIdT aid; SaHpiEntryIdT next_aid; SaHpiIdrAreaHeaderT hdr; RpcParams iparams(&sid, &rid, &iid, &area, &aid); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiIdrAreaHeaderGet(sid, rid, iid, area, aid, &next_aid, &hdr); RpcParams oparams(&rv, &next_aid, &hdr); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiIdrAreaAdd: { SaHpiIdrAreaTypeT area; SaHpiEntryIdT aid; RpcParams iparams(&sid, &rid, &iid, &area); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiIdrAreaAdd(sid, rid, iid, area, &aid); RpcParams oparams(&rv, &aid); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiIdrAreaAddById: { SaHpiIdrAreaTypeT type; SaHpiEntryIdT aid; RpcParams iparams(&sid, &rid, &iid, &type, &aid); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiIdrAreaAddById(sid, rid, iid, type, aid); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiIdrAreaDelete: { SaHpiEntryIdT aid; RpcParams iparams(&sid, &rid, &iid, &aid); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiIdrAreaDelete(sid, rid, iid, aid); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiIdrFieldGet: { SaHpiEntryIdT aid; SaHpiIdrFieldTypeT type; SaHpiEntryIdT fid; SaHpiEntryIdT next_fid; SaHpiIdrFieldT field; RpcParams iparams(&sid, &rid, &iid, &aid, &type, &fid); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiIdrFieldGet(sid, rid, iid, aid, type, fid, &next_fid, &field); RpcParams oparams(&rv, &next_fid, &field); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiIdrFieldAdd: { SaHpiIdrFieldT field; RpcParams iparams(&sid, &rid, &iid, &field); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiIdrFieldAdd(sid, rid, iid, &field); RpcParams oparams(&rv, &field); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiIdrFieldAddById: { SaHpiIdrFieldT field; RpcParams iparams(&sid, &rid, &iid, &field); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiIdrFieldAddById(sid, rid, iid, &field); RpcParams oparams(&rv, &field); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiIdrFieldSet: { SaHpiIdrFieldT field; RpcParams iparams(&sid, &rid, &iid, &field); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiIdrFieldSet(sid, rid, iid, &field); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiIdrFieldDelete: { SaHpiEntryIdT aid; SaHpiEntryIdT fid; RpcParams iparams(&sid, &rid, &iid, &aid, &fid); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiIdrFieldDelete(sid, rid, iid, aid, fid); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiWatchdogTimerGet: { SaHpiWatchdogT wdt; RpcParams iparams(&sid, &rid, &wnum); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiWatchdogTimerGet(sid, rid, wnum, &wdt); RpcParams oparams(&rv, &wdt); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiWatchdogTimerSet: { SaHpiWatchdogT wdt; RpcParams iparams(&sid, &rid, &wnum, &wdt); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiWatchdogTimerSet(sid, rid, wnum, &wdt); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiWatchdogTimerReset: { RpcParams iparams(&sid, &rid, &wnum); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiWatchdogTimerReset(sid, rid, wnum); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiAnnunciatorGetNext: { SaHpiSeverityT sev; SaHpiBoolT unack; SaHpiAnnouncementT ann; RpcParams iparams(&sid, &rid, &anum, &sev, &unack, &ann); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiAnnunciatorGetNext(sid, rid, anum, sev, unack, &ann); RpcParams oparams(&rv, &ann); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiAnnunciatorGet: { SaHpiEntryIdT eid; SaHpiAnnouncementT ann; RpcParams iparams(&sid, &rid, &anum, &eid); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiAnnunciatorGet(sid, rid, anum, eid, &ann); RpcParams oparams(&rv, &ann); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiAnnunciatorAcknowledge: { SaHpiEntryIdT eid; SaHpiSeverityT sev; RpcParams iparams(&sid, &rid, &anum, &eid, &sev); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiAnnunciatorAcknowledge(sid, rid, anum, eid, sev); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiAnnunciatorAdd: { SaHpiAnnouncementT ann; RpcParams iparams(&sid, &rid, &anum, &ann); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiAnnunciatorAdd(sid, rid, anum, &ann); RpcParams oparams(&rv, &ann); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiAnnunciatorDelete: { SaHpiEntryIdT eid; SaHpiSeverityT sev; RpcParams iparams(&sid, &rid, &anum, &eid, &sev); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiAnnunciatorDelete(sid, rid, anum, eid, sev); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiAnnunciatorModeGet: { SaHpiAnnunciatorModeT mode; RpcParams iparams(&sid, &rid, &anum); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiAnnunciatorModeGet(sid, rid, anum, &mode); RpcParams oparams(&rv, &mode); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiAnnunciatorModeSet: { SaHpiAnnunciatorModeT mode; RpcParams iparams(&sid, &rid, &anum, &mode); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiAnnunciatorModeSet(sid, rid, anum, mode); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiDimiInfoGet: { SaHpiDimiInfoT info; RpcParams iparams(&sid, &rid, &dnum); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiDimiInfoGet(sid, rid, dnum, &info); RpcParams oparams(&rv, &info); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiDimiTestInfoGet: { SaHpiDimiTestNumT tnum; SaHpiDimiTestT test; RpcParams iparams(&sid, &rid, &dnum, &tnum); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiDimiTestInfoGet(sid, rid, dnum, tnum, &test); RpcParams oparams(&rv, &test); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiDimiTestReadinessGet: { SaHpiDimiTestNumT tnum; SaHpiDimiReadyT ready; RpcParams iparams(&sid, &rid, &dnum, &tnum); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiDimiTestReadinessGet(sid, rid, dnum, tnum, &ready); RpcParams oparams(&rv, &ready); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiDimiTestStart: { SaHpiDimiTestNumT tnum; SaHpiDimiTestVariableParamsListT pl; SaHpiUint8T& ntestparams = pl.NumberOfParams; SaHpiDimiTestVariableParamsT*& testparams = pl.ParamsList; RpcParams iparams(&sid, &rid, &dnum, &tnum, &pl); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiDimiTestStart(sid, rid, dnum, tnum, ntestparams, testparams); g_free(pl.ParamsList); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiDimiTestCancel: { SaHpiDimiTestNumT tnum; RpcParams iparams(&sid, &rid, &dnum, &tnum); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiDimiTestCancel(sid, rid, dnum, tnum); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiDimiTestStatusGet: { SaHpiDimiTestNumT tnum; SaHpiDimiTestPercentCompletedT percent; SaHpiDimiTestRunStatusT status; RpcParams iparams(&sid, &rid, &dnum, &tnum); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiDimiTestStatusGet(sid, rid, dnum, tnum, &percent, &status); RpcParams oparams(&rv, &percent, &status); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiDimiTestResultsGet: { SaHpiDimiTestNumT tnum; SaHpiDimiTestResultsT results; RpcParams iparams(&sid, &rid, &dnum, &tnum); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiDimiTestResultsGet(sid, rid, dnum, tnum, &results); RpcParams oparams(&rv, &results); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiFumiSpecInfoGet: { SaHpiFumiSpecInfoT info; RpcParams iparams(&sid, &rid, &fnum); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiFumiSpecInfoGet(sid, rid, fnum, &info); RpcParams oparams(&rv, &info); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiFumiServiceImpactGet: { SaHpiFumiServiceImpactDataT impact; RpcParams iparams(&sid, &rid, &fnum); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiFumiServiceImpactGet(sid, rid, fnum, &impact); RpcParams oparams(&rv, &impact); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiFumiSourceSet: { SaHpiBankNumT bnum; SaHpiTextBufferT uri; RpcParams iparams(&sid, &rid, &fnum, &bnum, &uri); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiFumiSourceSet(sid, rid, fnum, bnum, &uri); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiFumiSourceInfoValidateStart: { SaHpiBankNumT bnum; RpcParams iparams(&sid, &rid, &fnum, &bnum); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiFumiSourceInfoValidateStart(sid, rid, fnum, bnum); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiFumiSourceInfoGet: { SaHpiBankNumT bnum; SaHpiFumiSourceInfoT info; RpcParams iparams(&sid, &rid, &fnum, &bnum); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiFumiSourceInfoGet(sid, rid, fnum, bnum, &info); RpcParams oparams(&rv, &info); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiFumiSourceComponentInfoGet: { SaHpiBankNumT bnum; SaHpiEntryIdT eid; SaHpiEntryIdT next_eid; SaHpiFumiComponentInfoT info; RpcParams iparams(&sid, &rid, &fnum, &bnum, &eid); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiFumiSourceComponentInfoGet(sid, rid, fnum, bnum, eid, &next_eid, &info); RpcParams oparams(&rv, &next_eid, &info); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiFumiTargetInfoGet: { SaHpiBankNumT bnum; SaHpiFumiBankInfoT info; RpcParams iparams(&sid, &rid, &fnum, &bnum); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiFumiTargetInfoGet(sid, rid, fnum, bnum, &info); RpcParams oparams(&rv, &info); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiFumiTargetComponentInfoGet: { SaHpiBankNumT bnum; SaHpiEntryIdT eid; SaHpiEntryIdT next_eid; SaHpiFumiComponentInfoT info; RpcParams iparams(&sid, &rid, &fnum, &bnum, &eid); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiFumiTargetComponentInfoGet(sid, rid, fnum, bnum, eid, &next_eid, &info); RpcParams oparams(&rv, &next_eid, &info); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiFumiLogicalTargetInfoGet: { SaHpiFumiLogicalBankInfoT info; RpcParams iparams(&sid, &rid, &fnum); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiFumiLogicalTargetInfoGet(sid, rid, fnum, &info); RpcParams oparams(&rv, &info); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiFumiLogicalTargetComponentInfoGet: { SaHpiEntryIdT eid; SaHpiEntryIdT next_eid; SaHpiFumiLogicalComponentInfoT info; RpcParams iparams(&sid, &rid, &fnum, &eid); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiFumiLogicalTargetComponentInfoGet(sid, rid, fnum, eid, &next_eid, &info); RpcParams oparams(&rv, &next_eid, &info); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiFumiBackupStart: { RpcParams iparams(&sid, &rid, &fnum); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiFumiBackupStart(sid, rid, fnum); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiFumiBankBootOrderSet: { SaHpiBankNumT bnum; SaHpiUint32T pos; RpcParams iparams(&sid, &rid, &fnum, &bnum, &pos); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiFumiBankBootOrderSet(sid, rid, fnum, bnum, pos); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiFumiBankCopyStart: { SaHpiBankNumT src_bnum; SaHpiBankNumT dst_bnum; RpcParams iparams(&sid, &rid, &fnum, &src_bnum, &dst_bnum); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiFumiBankCopyStart(sid, rid, fnum, src_bnum, dst_bnum); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiFumiInstallStart: { SaHpiBankNumT bnum; RpcParams iparams(&sid, &rid, &fnum, &bnum); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiFumiInstallStart(sid, rid, fnum, bnum); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiFumiUpgradeStatusGet: { SaHpiBankNumT bnum; SaHpiFumiUpgradeStatusT status; RpcParams iparams(&sid, &rid, &fnum, &bnum); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiFumiUpgradeStatusGet(sid, rid, fnum, bnum, &status); RpcParams oparams(&rv, &status); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiFumiTargetVerifyStart: { SaHpiBankNumT bnum; RpcParams iparams(&sid, &rid, &fnum, &bnum); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiFumiTargetVerifyStart(sid, rid, fnum, bnum); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiFumiTargetVerifyMainStart: { RpcParams iparams(&sid, &rid, &fnum); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiFumiTargetVerifyMainStart(sid, rid, fnum); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiFumiUpgradeCancel: { SaHpiBankNumT bnum; RpcParams iparams(&sid, &rid, &fnum, &bnum); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiFumiUpgradeCancel(sid, rid, fnum, bnum); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiFumiAutoRollbackDisableGet: { SaHpiBoolT disable; RpcParams iparams(&sid, &rid, &fnum); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiFumiAutoRollbackDisableGet(sid, rid, fnum, &disable); RpcParams oparams(&rv, &disable); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiFumiAutoRollbackDisableSet: { SaHpiBoolT disable; RpcParams iparams(&sid, &rid, &fnum, &disable); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiFumiAutoRollbackDisableSet(sid, rid, fnum, disable); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiFumiRollbackStart: { RpcParams iparams(&sid, &rid, &fnum); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiFumiRollbackStart(sid, rid, fnum); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiFumiActivate: { RpcParams iparams(&sid, &rid, &fnum); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiFumiActivate(sid, rid, fnum); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiFumiActivateStart: { SaHpiBoolT logical; RpcParams iparams(&sid, &rid, &fnum, &logical); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiFumiActivateStart(sid, rid, fnum, logical); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiFumiCleanup: { SaHpiBankNumT bnum; RpcParams iparams(&sid, &rid, &fnum, &bnum); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiFumiCleanup(sid, rid, fnum, bnum); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiHotSwapPolicyCancel: { RpcParams iparams(&sid, &rid); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiHotSwapPolicyCancel(sid, rid); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiResourceActiveSet: { RpcParams iparams(&sid, &rid); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiResourceActiveSet(sid, rid); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiResourceInactiveSet: { RpcParams iparams(&sid, &rid); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiResourceInactiveSet(sid, rid); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiAutoInsertTimeoutGet: { SaHpiTimeoutT timeout; RpcParams iparams(&sid); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiAutoInsertTimeoutGet(sid, &timeout); RpcParams oparams(&rv, &timeout); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiAutoInsertTimeoutSet: { SaHpiTimeoutT timeout; RpcParams iparams(&sid, &timeout); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiAutoInsertTimeoutSet(sid, timeout); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiAutoExtractTimeoutGet: { SaHpiTimeoutT timeout; RpcParams iparams(&sid, &rid); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiAutoExtractTimeoutGet(sid, rid, &timeout); RpcParams oparams(&rv, &timeout); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiAutoExtractTimeoutSet: { SaHpiTimeoutT timeout; RpcParams iparams(&sid, &rid, &timeout); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiAutoExtractTimeoutSet(sid, rid, timeout); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiHotSwapStateGet: { SaHpiHsStateT state; RpcParams iparams(&sid, &rid); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiHotSwapStateGet(sid, rid, &state); RpcParams oparams(&rv, &state); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiHotSwapActionRequest: { SaHpiHsActionT action; RpcParams iparams(&sid, &rid, &action); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiHotSwapActionRequest(sid, rid, action); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiHotSwapIndicatorStateGet: { SaHpiHsIndicatorStateT state; RpcParams iparams(&sid, &rid); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiHotSwapIndicatorStateGet(sid, rid, &state); RpcParams oparams(&rv, &state); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiHotSwapIndicatorStateSet: { SaHpiHsIndicatorStateT state; RpcParams iparams(&sid, &rid, &state); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiHotSwapIndicatorStateSet(sid, rid, state); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiParmControl: { SaHpiParmActionT action; RpcParams iparams(&sid, &rid, &action); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiParmControl(sid, rid, action); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiResourceLoadIdGet: { SaHpiLoadIdT lid; RpcParams iparams(&sid, &rid); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiResourceLoadIdGet(sid, rid, &lid); RpcParams oparams(&rv, &lid); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiResourceLoadIdSet: { SaHpiLoadIdT lid; RpcParams iparams(&sid, &rid, &lid); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiResourceLoadIdSet(sid, rid, &lid); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiResourceResetStateGet: { SaHpiResetActionT action; RpcParams iparams(&sid, &rid); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiResourceResetStateGet(sid, rid, &action); RpcParams oparams(&rv, &action); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiResourceResetStateSet: { SaHpiResetActionT action; RpcParams iparams(&sid, &rid, &action); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiResourceResetStateSet(sid, rid, action); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiResourcePowerStateGet: { SaHpiPowerStateT state; RpcParams iparams(&sid, &rid); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiResourcePowerStateGet(sid, rid, &state); RpcParams oparams(&rv, &state); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFsaHpiResourcePowerStateSet: { SaHpiPowerStateT state; RpcParams iparams(&sid, &rid, &state); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = saHpiResourcePowerStateSet(sid, rid, state); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFoHpiHandlerCreate: { oHpiHandlerIdT hid; oHpiHandlerConfigT cfg; RpcParams iparams(&sid, &cfg); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); GHashTable *cfg_tbl; cfg_tbl = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); for (int n = 0; n < cfg.NumberOfParams; n++) { g_hash_table_insert(cfg_tbl, g_strdup((const gchar *)cfg.Params[n].Name), g_strdup((const gchar *)cfg.Params[n].Value)); } g_free(cfg.Params); rv = oHpiHandlerCreate(sid, cfg_tbl, &hid); g_hash_table_destroy(cfg_tbl); RpcParams oparams(&rv, &hid); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFoHpiHandlerDestroy: { oHpiHandlerIdT hid; RpcParams iparams(&sid, &hid); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = oHpiHandlerDestroy(sid, hid); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFoHpiHandlerInfo: { oHpiHandlerIdT hid; oHpiHandlerInfoT info; oHpiHandlerConfigT cfg; GHashTable *cfg_tbl; RpcParams iparams(&sid, &hid); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); cfg_tbl = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); rv = oHpiHandlerInfo(sid, hid, &info, cfg_tbl); cfg.NumberOfParams = 0; cfg.Params = g_new0(oHpiHandlerConfigParamT, g_hash_table_size(cfg_tbl)); // add each hash tbl entry to the marshable handler_cfg g_hash_table_foreach(cfg_tbl, dehash_handler_cfg, &cfg); RpcParams oparams(&rv, &info, &cfg); MARSHAL_RP(hm, data, data_len, oparams); // cleanup g_hash_table_destroy(cfg_tbl); } break; case eFoHpiHandlerGetNext: { oHpiHandlerIdT hid, next_hid; RpcParams iparams(&sid, &hid); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = oHpiHandlerGetNext(sid, hid, &next_hid); RpcParams oparams(&rv, &next_hid); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFoHpiHandlerFind: { oHpiHandlerIdT hid; RpcParams iparams(&sid, &rid); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = oHpiHandlerFind(sid, rid, &hid); RpcParams oparams(&rv, &hid); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFoHpiHandlerRetry: { oHpiHandlerIdT hid; RpcParams iparams(&sid, &hid); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = oHpiHandlerRetry(sid, hid); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFoHpiGlobalParamGet: { oHpiGlobalParamT param; RpcParams iparams(&sid, ¶m); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = oHpiGlobalParamGet(sid, ¶m); RpcParams oparams(&rv, ¶m); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFoHpiGlobalParamSet: { oHpiGlobalParamT param; RpcParams iparams(&sid, ¶m); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = oHpiGlobalParamSet(sid, ¶m); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; case eFoHpiInjectEvent: { oHpiHandlerIdT hid; SaHpiEventT evt; RpcParams iparams(&sid, &hid, &evt, &rpte, &rdr); DEMARSHAL_RQ(rq_byte_order, hm, data, iparams); rv = oHpiInjectEvent(sid, hid, &evt, &rpte, &rdr); RpcParams oparams(&rv); MARSHAL_RP(hm, data, data_len, oparams); } break; default: DBG("%p Function not found", thrdid); return SA_ERR_HPI_UNSUPPORTED_API; } DBG("%p Return code = %d", thrdid, rv); return SA_OK; } openhpi-3.6.1/openhpid/threaded.h0000644000175100017510000000136612575647301015732 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005-2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * */ #ifndef __OH_THREADED_H #define __OH_THREADED_H #ifdef __cplusplus extern "C" { #endif int oh_threaded_start(void); void oh_signal_service(void); int oh_threaded_stop(void); void oh_wake_discovery_thread(void); #ifdef __cplusplus } #endif #endif /* __OH_THREADED_H */ openhpi-3.6.1/openhpid/openhpid-win32.cpp0000644000175100017510000002515212575647301017252 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright Pigeon Point Systems. 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak * */ #include #include #include #include #include #include #include #include #include "init.h" #include "server.h" /*--------------------------------------------------------------------*/ /* Globals */ /*--------------------------------------------------------------------*/ static gchar *cfgfile = NULL; static gboolean verbose_flag = FALSE; static gchar *bindaddr = NULL; static gint port = OPENHPI_DEFAULT_DAEMON_PORT; static gchar *portstr = NULL; static gint sock_timeout = 0; // unlimited -- TODO: unlimited or 30 minutes default? was unsigned int static gint max_threads = -1; // unlimited //static gboolean runasforeground = FALSE; // TODO daemonization static bool daemonized = false; // TODO daemonization static gboolean enableIPv4 = FALSE; static gboolean enableIPv6 = FALSE; static GOptionEntry daemon_options[] = { { "cfg", 'c', 0, G_OPTION_ARG_FILENAME, &cfgfile, "Sets path/name of the configuration file.\n" " This option is required unless the environment\n" " variable OPENHPI_CONF has been set to a valid\n" " configuration file.", "conf_file" }, { "verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose_flag, "This option causes the daemon to display verbose\n" " messages. This option is optional.", NULL }, { "bind", 'b', 0, G_OPTION_ARG_STRING, &bindaddr, "Bind address for the daemon socket.\n" " Also bind address can be specified with\n" " OPENHPI_DAEMON_BIND_ADDRESS environment variable.\n" " No bind address is used by default.", "bind_address" }, { "port", 'p', 0, G_OPTION_ARG_STRING, &portstr, "Overrides the default listening port (4743) of\n" " the daemon. The option is optional.", "port" }, { "timeout", 's', 0, G_OPTION_ARG_INT, &sock_timeout, "Overrides the default socket read timeout of 30\n" " minutes. The option is optional.", "seconds" }, { "threads", 't', 0, G_OPTION_ARG_INT, &max_threads, "Sets the maximum number of connection threads.\n" " The default is umlimited. The option is optional.","threads" }, // { "nondaemon", 'n', 0, G_OPTION_ARG_NONE, &runasforeground, "Forces the code to run as a foreground process\n" // " and NOT as a daemon. The default is to run as\n" // " a daemon. The option is optional.", NULL }, { "ipv6", '6', 0, G_OPTION_ARG_NONE, &enableIPv6, "The daemon will try to bind IPv6 socket.", NULL }, { "ipv4", '4', 0, G_OPTION_ARG_NONE, &enableIPv4, "The daemon will try to bind IPv4 socket (default).\n" " IPv6 option takes precedence over IPv4 option.", NULL }, { NULL } }; /*--------------------------------------------------------------------*/ /* Function: display_help */ /*--------------------------------------------------------------------*/ void display_help(void) { printf("Usage:\n"); printf(" openhpid [OPTION...] - HPI instance to which multiple clients can connect.\n\n"); printf("A typical invocation might be\n"); printf(" openhpid.exe -c C:\\openhpi.conf\n\n"); printf("Help Options:\n"); printf(" -h, --help Show help options\n\n"); printf("Application Options:\n"); printf(" -c, --cfg=conf_file Sets path/name of the configuration file.\n"); printf(" This option is required unless the environment\n"); printf(" variable OPENHPI_CONF has been set to a valid\n"); printf(" configuration file.\n"); printf(" -v, --verbose This option causes the daemon to display verbose\n"); printf(" messages. This option is optional.\n"); printf(" -b, --bind Sets bind address for the daemon socket.\n"); printf(" Also bind address can be specified with\n"); printf(" OPENHPI_DAEMON_BIND_ADDRESS environment variable.\n"); printf(" No bind address is used by default.\n"); printf(" -p, --port=port Overrides the default listening port (4743) of\n"); printf(" the daemon. The option is optional.\n"); printf(" -s, --timeout=seconds Overrides the default socket read timeout of 30\n"); printf(" minutes. The option is optional.\n"); printf(" -t, --threads=threads Sets the maximum number of connection threads.\n"); printf(" The default is umlimited. The option is optional.\n"); // printf(" -n, --nondaemon Forces the code to run as a foreground process\n"); // printf(" and NOT as a daemon. The default is to run as\n"); // printf(" a daemon. The option is optional.\n"); printf(" -6, --ipv6 The daemon will try to bind IPv6 socket.\n"); printf(" -4, --ipv4 The daemon will try to bind IPv4 socket (default).\n"); printf(" IPv6 option takes precedence over IPv4 option.\n\n"); } /*--------------------------------------------------------------------*/ /* Function: setenv */ /*--------------------------------------------------------------------*/ static int setenv(const char * var, const char * val) { static const size_t BUFSIZE = 1024; char buf[BUFSIZE]; snprintf(buf, BUFSIZE, "%s=%s", var, val); return _putenv(buf); } /*--------------------------------------------------------------------*/ /* Logging Utility Functions */ /*--------------------------------------------------------------------*/ static const char * get_log_level_name(GLogLevelFlags log_level) { if (log_level & G_LOG_LEVEL_ERROR) { return "ERR"; } else if (log_level & G_LOG_LEVEL_CRITICAL) { return "CRIT"; } else if (log_level & G_LOG_LEVEL_WARNING) { return "WARN"; } else if (log_level & G_LOG_LEVEL_MESSAGE) { return "MSG"; } else if (log_level & G_LOG_LEVEL_INFO) { return "INFO"; } else if (log_level & G_LOG_LEVEL_DEBUG) { return "DBG"; } return "???"; } void log_handler(const gchar *log_domain, GLogLevelFlags log_level, const gchar *message, gpointer /*user_data */) { if ((!verbose_flag) && ((log_level & G_LOG_LEVEL_CRITICAL) == 0) ) { return; } if (!daemonized) { printf("%s: %s: %s\n", log_domain, get_log_level_name(log_level), message); } else { // TODO implement } } /*--------------------------------------------------------------------*/ /* Function: main */ /*--------------------------------------------------------------------*/ int main(int argc, char *argv[]) { int ipvflags; GError *error = NULL; GOptionContext *context; // TODO daemonization g_log_set_default_handler(log_handler, 0); /* get the command line options */ context = g_option_context_new ("- HPI instance to which multiple clients can connect.\n\n" "A typical invocation might be\n" " openhpid.exe -c C:\\openhpi.conf\n"); g_option_context_add_main_entries (context, daemon_options, NULL); if (!g_option_context_parse (context, &argc, &argv, &error)) { CRIT ("option parsing failed: %s",error->message); display_help(); exit(-1); } if (cfgfile) { setenv("OPENHPI_CONF", cfgfile); } else { cfgfile = getenv("OPENHPI_CONF"); } if (bindaddr) { setenv("OPENHPI_DAEMON_BIND_ADDRESS", bindaddr); } else { bindaddr = getenv("OPENHPI_DAEMON_BIND_ADDRESS"); } if (portstr) { setenv("OPENHPI_DAEMON_PORT", portstr); } else { portstr = getenv("OPENHPI_DAEMON_PORT"); } if (portstr) { port = atoi(portstr); } ipvflags = ( enableIPv6 == TRUE ) ? FlagIPv6 : FlagIPv4; // see if any invalid parameters are given if (sock_timeout<0) { CRIT("Socket timeout value must be positive. Exiting."); display_help(); } // announce ourselves INFO("Starting OpenHPI %s.", VERSION); if (cfgfile) { INFO("OPENHPI_CONF = %s.", cfgfile); } if (bindaddr) { INFO("OPENHPI_DAEMON_BIND_ADDRESS = %s.", bindaddr); } INFO("OPENHPI_DAEMON_PORT = %u.", port); INFO("Enabled IP versions:%s%s.", (ipvflags & FlagIPv4) ? " IPv4" : "", (ipvflags & FlagIPv6) ? " IPv6" : ""); INFO("Max threads: %d.", max_threads); INFO("Socket timeout(sec): %d.", sock_timeout); if (oh_init()) { // Initialize OpenHPI CRIT("There was an error initializing OpenHPI. Exiting."); return 8; } bool rc = oh_server_run(ipvflags, bindaddr, port, sock_timeout, max_threads); if (!rc) { return 9; } if (oh_finit()) { CRIT("There was an error finalizing OpenHPI. Exiting."); return 8; } return 0; } openhpi-3.6.1/openhpid/event.h0000644000175100017510000000201612575647301015264 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004-2006 * (C) Copyright Pigeon Point Systems. 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Sean Dague * Renier Morales * Anton Pak * */ #ifndef __OH_EVENT_H #define __OH_EVENT_H #include #ifdef __cplusplus extern "C" { #endif extern oh_evt_queue * oh_process_q; /* function definitions */ int oh_event_init(void); int oh_event_finit(void); void oh_post_quit_event(void); int oh_detect_quit_event(struct oh_event * e); SaErrorT oh_harvest_events(void); SaErrorT oh_process_events(void); #ifdef __cplusplus } #endif #endif /* __OH_EVENT_H */ openhpi-3.6.1/openhpid/session.c0000644000175100017510000003172112575647301015626 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * */ #include #include #include #include #include #include #include "conf.h" #include "event.h" #include "lock.h" #include struct oh_session_table oh_sessions = { .table = NULL, #if !GLIB_CHECK_VERSION (2, 32, 0) .lock = G_STATIC_REC_MUTEX_INIT #endif }; /** * oh_create_session * @did: * * * * Returns: **/ SaHpiSessionIdT oh_create_session(SaHpiDomainIdT did) { struct oh_session *session = NULL; struct oh_domain *domain = NULL; static SaHpiSessionIdT id = 1; /* Session ids will start at 1 */ if (did == SAHPI_UNSPECIFIED_DOMAIN_ID) did = OH_DEFAULT_DOMAIN_ID; session = g_new0(struct oh_session, 1); if (!session) return 0; session->did = did; session->eventq = g_async_queue_new(); session->subscribed = SAHPI_FALSE; domain = oh_get_domain(did); if (!domain) { g_async_queue_unref(session->eventq); g_free(session); return 0; } wrap_g_static_rec_mutex_lock(&oh_sessions.lock); /* Locked session table */ session->id = id++; g_hash_table_insert(oh_sessions.table, &(session->id), session); oh_sessions.list = g_slist_append(oh_sessions.list, session); wrap_g_static_rec_mutex_unlock(&oh_sessions.lock); /* Unlocked session table */ oh_release_domain(domain); return session->id; } /** * oh_get_session_domain * @sid: * * * * Returns: SAHPI_UNSPECIFIED_DOMAIN_ID if domain id was not found. **/ SaHpiDomainIdT oh_get_session_domain(SaHpiSessionIdT sid) { struct oh_session *session = NULL; SaHpiDomainIdT did; if (sid < 1) return SAHPI_UNSPECIFIED_DOMAIN_ID; wrap_g_static_rec_mutex_lock(&oh_sessions.lock); /* Locked session table */ session = g_hash_table_lookup(oh_sessions.table, &sid); if (!session) { wrap_g_static_rec_mutex_unlock(&oh_sessions.lock); return SAHPI_UNSPECIFIED_DOMAIN_ID; } did = session->did; wrap_g_static_rec_mutex_unlock(&oh_sessions.lock); /* Unlocked session table */ return did; } /** * oh_list_sessions * @did: * * * * Returns: A dynamically allocated array of session ids. * The caller needs to free this array when he is done with it. **/ GArray *oh_list_sessions(SaHpiDomainIdT did) { struct oh_domain *domain = NULL; GArray *session_ids = NULL; GSList *node = NULL; if (did == SAHPI_UNSPECIFIED_DOMAIN_ID) did = OH_DEFAULT_DOMAIN_ID; domain = oh_get_domain(did); if (!domain) return NULL; session_ids = g_array_new(FALSE, TRUE, sizeof(SaHpiSessionIdT)); wrap_g_static_rec_mutex_lock(&oh_sessions.lock); /* Locked session table */ for (node = oh_sessions.list; node; node = node->next) { struct oh_session *s = node->data; if (s->did != did) continue; g_array_append_val(session_ids, s->id); } wrap_g_static_rec_mutex_unlock(&oh_sessions.lock); /* Unlocked session table */ oh_release_domain(domain); return session_ids; } /** * oh_get_session_state * @sid: * @state: * * * * Returns: **/ SaErrorT oh_get_session_subscription(SaHpiSessionIdT sid, SaHpiBoolT * state) { struct oh_session *session = NULL; if (sid < 1) return SA_ERR_HPI_INVALID_SESSION; if (state == NULL) return SA_ERR_HPI_INVALID_PARAMS; if (oh_sessions.table == NULL) return SA_ERR_HPI_INTERNAL_ERROR; wrap_g_static_rec_mutex_lock(&oh_sessions.lock); /* Locked session table */ session = g_hash_table_lookup(oh_sessions.table, &sid); if (!session) { wrap_g_static_rec_mutex_unlock(&oh_sessions.lock); return SA_ERR_HPI_INVALID_SESSION; } *state = session->subscribed; wrap_g_static_rec_mutex_unlock(&oh_sessions.lock); /* Unlocked session table */ return SA_OK; } /** * oh_set_session_state * @sid: * @state: * * * * Returns: **/ SaErrorT oh_set_session_subscription(SaHpiSessionIdT sid, SaHpiBoolT state) { struct oh_session *session = NULL; struct oh_event e; if (sid < 1) return SA_ERR_HPI_INVALID_PARAMS; wrap_g_static_rec_mutex_lock(&oh_sessions.lock); /* Locked session table */ session = g_hash_table_lookup(oh_sessions.table, &sid); if (!session) { wrap_g_static_rec_mutex_unlock(&oh_sessions.lock); return SA_ERR_HPI_INVALID_SESSION; } session->subscribed = state; wrap_g_static_rec_mutex_unlock(&oh_sessions.lock); /* Unlocked session table */ /* Flush session's event queue */ if (state == SAHPI_FALSE) { while (oh_dequeue_session_event(sid, SAHPI_TIMEOUT_IMMEDIATE, &e, NULL) == SA_OK) { oh_event_free(&e, TRUE); } } return SA_OK; } /** * oh_queue_session_event * @sid: * @event: * * * * Returns: **/ SaErrorT oh_queue_session_event(SaHpiSessionIdT sid, struct oh_event * event) { struct oh_session *session = NULL; struct oh_event *qevent = NULL; struct oh_global_param param = {.type = OPENHPI_EVT_QUEUE_LIMIT }; SaHpiBoolT nolimit = SAHPI_FALSE; if (sid < 1 || !event) return SA_ERR_HPI_INVALID_PARAMS; qevent = oh_dup_event(event); if (!qevent) return SA_ERR_HPI_OUT_OF_MEMORY; if (oh_get_global_param(¶m)) { nolimit = SAHPI_TRUE; } wrap_g_static_rec_mutex_lock(&oh_sessions.lock); /* Locked session table */ session = g_hash_table_lookup(oh_sessions.table, &sid); if (!session) { wrap_g_static_rec_mutex_unlock(&oh_sessions.lock); oh_event_free(qevent, FALSE); return SA_ERR_HPI_INVALID_SESSION; } if (nolimit == SAHPI_FALSE) { SaHpiSessionIdT tmp_sid; tmp_sid = session->id; gint qlength = g_async_queue_length(session->eventq); if (qlength > 0 && qlength >= param.u.evt_queue_limit) { /* Don't proceed with event push if queue is overflowed */ session->eventq_status = SAHPI_EVT_QUEUE_OVERFLOW; wrap_g_static_rec_mutex_unlock(&oh_sessions.lock); oh_event_free(qevent, FALSE); CRIT("Session %d's queue is out of space; " "# of events is %d; Max is %d", tmp_sid, qlength, param.u.evt_queue_limit); return SA_ERR_HPI_OUT_OF_SPACE; } } g_async_queue_push(session->eventq, qevent); wrap_g_static_rec_mutex_unlock(&oh_sessions.lock); /* Unlocked session table */ return SA_OK; } /** * oh_dequeue_session_event * @sid: * @event: * * * * Returns: **/ SaErrorT oh_dequeue_session_event(SaHpiSessionIdT sid, SaHpiTimeoutT timeout, struct oh_event * event, SaHpiEvtQueueStatusT * eventq_status) { struct oh_session *session = NULL; struct oh_event *devent = NULL; GAsyncQueue *eventq = NULL; SaHpiBoolT subscribed; SaErrorT invalid; if (sid < 1 || (event == NULL)) return SA_ERR_HPI_INVALID_PARAMS; wrap_g_static_rec_mutex_lock(&oh_sessions.lock); /* Locked session table */ session = g_hash_table_lookup(oh_sessions.table, &sid); if (!session) { wrap_g_static_rec_mutex_unlock(&oh_sessions.lock); return SA_ERR_HPI_INVALID_SESSION; } if (eventq_status) { *eventq_status = session->eventq_status; } session->eventq_status = 0; eventq = session->eventq; g_async_queue_ref(eventq); wrap_g_static_rec_mutex_unlock(&oh_sessions.lock); if (timeout == SAHPI_TIMEOUT_IMMEDIATE) { devent = g_async_queue_try_pop(eventq); } else if (timeout == SAHPI_TIMEOUT_BLOCK) { while (devent == NULL) { #if GLIB_CHECK_VERSION (2, 32, 0) guint64 gfinaltime; gfinaltime = (guint64) 5000000L; devent = wrap_g_async_queue_timed_pop(eventq, gfinaltime); #else GTimeVal gfinaltime; g_get_current_time(&gfinaltime); g_time_val_add(&gfinaltime, 5000000L); devent = wrap_g_async_queue_timed_pop(eventq, &gfinaltime); #endif /* compliance with spec page 63 */ invalid = oh_get_session_subscription(sid, &subscribed); /* Is the session still open? or still subscribed? */ if (invalid || !subscribed) { g_async_queue_unref(eventq); oh_event_free(devent, FALSE); return invalid ? SA_ERR_HPI_INVALID_SESSION : SA_ERR_HPI_INVALID_REQUEST; } } } else { #if GLIB_CHECK_VERSION (2, 32, 0) guint64 gfinaltime; gfinaltime = (guint64) (timeout / 1000); devent = wrap_g_async_queue_timed_pop(eventq, gfinaltime); #else GTimeVal gfinaltime; g_get_current_time(&gfinaltime); g_time_val_add(&gfinaltime, (glong) (timeout / 1000)); devent = wrap_g_async_queue_timed_pop(eventq, &gfinaltime); #endif invalid = oh_get_session_subscription(sid, &subscribed); if (invalid || !subscribed) { g_async_queue_unref(eventq); oh_event_free(devent, FALSE); return invalid ? SA_ERR_HPI_INVALID_SESSION : SA_ERR_HPI_INVALID_REQUEST; } } g_async_queue_unref(eventq); if (devent) { int cc; cc = oh_detect_quit_event(devent); if (cc == 0) { // OpenHPI is about to quit oh_event_free(devent, FALSE); return SA_ERR_HPI_NO_RESPONSE; } memcpy(event, devent, sizeof(struct oh_event)); g_free(devent); return SA_OK; } else { memset(event, 0, sizeof(struct oh_event)); return SA_ERR_HPI_TIMEOUT; } } /** * oh_destroy_session * @sid: * @update_domain: * * * Returns: **/ SaErrorT oh_destroy_session(SaHpiSessionIdT sid) { struct oh_session *session = NULL; gpointer event = NULL; int i, len; if (sid < 1) return SA_ERR_HPI_INVALID_PARAMS; wrap_g_static_rec_mutex_lock(&oh_sessions.lock); /* Locked session table */ session = g_hash_table_lookup(oh_sessions.table, &sid); if (!session) { wrap_g_static_rec_mutex_unlock(&oh_sessions.lock); return SA_ERR_HPI_INVALID_SESSION; } oh_sessions.list = g_slist_remove(oh_sessions.list, session); g_hash_table_remove(oh_sessions.table, &(session->id)); wrap_g_static_rec_mutex_unlock(&oh_sessions.lock); /* Unlocked session table */ /* Finalize session */ len = g_async_queue_length(session->eventq); if (len > 0) { for (i = 0; i < len; i++) { event = g_async_queue_try_pop(session->eventq); if (event) oh_event_free(event, FALSE); event = NULL; } } g_async_queue_unref(session->eventq); g_free(session); return SA_OK; } openhpi-3.6.1/openhpid/init.c0000644000175100017510000001542012575647301015104 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004-2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Bryan Sutula * */ #include #include #ifdef _WIN32 #include #endif /* _WIN32 */ #include #include #include #include #include #ifndef _WIN32 #include #endif /* _WIN32 */ #include #include #include #include "conf.h" #include "event.h" #include "init.h" #include "lock.h" #include "threaded.h" #include "sahpi_wrappers.h" /** * oh_init * * Returns: 0 on success otherwise an error code **/ int oh_init(void) { static int initialized = 0; struct oh_global_param param; struct oh_parsed_config config = { NULL, 0, 0 }; SaErrorT rval; if (g_thread_supported() == FALSE) { wrap_g_thread_init(0); } data_access_lock(); if (initialized) { /* Don't initialize more than once */ data_access_unlock(); return 0; } /* Initialize event queue */ oh_event_init(); #ifdef HAVE_OPENSSL INFO("Initializing SSL Library."); if (oh_ssl_init()) { CRIT("SSL library intialization failed."); data_access_unlock(); return SA_ERR_HPI_OUT_OF_MEMORY; /* Most likely */ } #endif /* Set openhpi configuration file location */ oh_get_global_param2(OPENHPI_CONF, ¶m); #ifdef _WIN32 char config_file[MAX_PATH]; DWORD cc = ExpandEnvironmentStrings(param.u.conf, config_file, MAX_PATH); if ((cc != 0) && (cc < MAX_PATH)) { INFO("Loading config file %s.", config_file); rval = oh_load_config(config_file, &config); } else { CRIT("Failed to expand config file path: %s", param.u.conf); rval = SA_ERR_HPI_ERROR; } #else INFO("Loading config file %s.", param.u.conf); rval = oh_load_config(param.u.conf, &config); #endif /* _WIN32 */ /* Don't error out if there is no conf file */ if (rval < 0 && rval != -4) { CRIT("Can not load config."); data_access_unlock(); return SA_ERR_HPI_NOT_PRESENT; } /* One particular variable, OPENHPI_UNCONFIGURED, can cause us to exit * immediately, without trying to run the daemon any further. */ oh_get_global_param2(OPENHPI_UNCONFIGURED, ¶m); if (param.u.unconfigured != SAHPI_FALSE) { CRIT("OpenHPI is not configured. See config file."); data_access_unlock(); return SA_ERR_HPI_ERROR; } /* Initialize uid_utils */ INFO("Initializing UID."); rval = oh_uid_initialize(); if( (rval != SA_OK) && (rval != SA_ERR_HPI_ERROR) ) { CRIT("Unique ID intialization failed."); data_access_unlock(); return rval; } /* Initialize handler table */ oh_handlers.table = g_hash_table_new(g_int_hash, g_int_equal); /* Initialize domain table */ oh_domains.table = g_hash_table_new(g_int_hash, g_int_equal); /* Initialize session table */ oh_sessions.table = g_hash_table_new(g_int_hash, g_int_equal); /* Load plugins, create handlers and domains */ oh_process_config(&config); INFO("Creating default domain."); oh_get_global_param2(OPENHPI_AUTOINSERT_TIMEOUT, ¶m); SaHpiTimeoutT ai_timeout = param.u.ai_timeout; INFO("Auto-Insert Timeout is %" PRId64 " nsec.", (int64_t)ai_timeout); oh_get_global_param2(OPENHPI_AUTOINSERT_TIMEOUT_READONLY, ¶m); SaHpiDomainCapabilitiesT caps = 0; if ( param.u.ai_timeout_readonly != SAHPI_FALSE ) { INFO("Auto-Insert Timeout is READ-ONLY."); caps = SAHPI_DOMAIN_CAP_AUTOINSERT_READ_ONLY; } rval = oh_create_domain(OH_DEFAULT_DOMAIN_ID, "DEFAULT", SAHPI_UNSPECIFIED_DOMAIN_ID, SAHPI_UNSPECIFIED_DOMAIN_ID, caps, ai_timeout); if (rval != SA_OK) { data_access_unlock(); CRIT("Could not create first domain!"); return SA_ERR_HPI_ERROR; } /* * Wipes away configuration lists (plugin_names and handler_configs). * global_params is not touched. */ oh_clean_config(&config); /* * If any handlers were defined in the config file AND * all of them failed to load, Then return with an error. */ if (config.handlers_defined > 0 && config.handlers_loaded == 0) { WARN("Warning: Handlers were defined, but none loaded."); } else if (config.handlers_defined > 0 && config.handlers_loaded < config.handlers_defined) { WARN("*Warning*: Not all handlers defined loaded." " Check previous messages."); } /* Start discovery and event threads */ oh_threaded_start(); initialized = 1; data_access_unlock(); INFO("OpenHPI has been initialized."); /* infrastructure initialization has completed at this point */ /* Check if there are any handlers loaded */ if (config.handlers_defined == 0) { WARN("*Warning*: No handler definitions found in config file." " Check configuration file and previous messages" ); } /* * HACK: wait a second before returning * to give the threads time to populate the RPT */ g_usleep(G_USEC_PER_SEC); /* Do not use SA_OK here in case it is ever changed to something * besides zero, The runtime stuff depends on zero being returned here * in order for the shared library to be completely initialized. */ return 0; } /** * oh_finit * * Returns: always returns 0 **/ int oh_finit(void) { data_access_lock(); oh_close_handlers(); data_access_unlock(); oh_threaded_stop(); oh_destroy_domain(OH_DEFAULT_DOMAIN_ID); g_hash_table_destroy(oh_sessions.table); g_hash_table_destroy(oh_domains.table); g_hash_table_destroy(oh_handlers.table); #ifdef HAVE_OPENSSL oh_ssl_finit(); #endif oh_event_finit(); INFO("OpenHPI has been finalized."); return 0; } openhpi-3.6.1/openhpid/Makefile.am0000644000175100017510000000432412575647301016032 0ustar mohanmohan# # Copyright (c) 2004-2006 by IBM Corporation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # # Authors: # W. David Ashley # Renier Morales # .NOTPARALLEL: MAINTAINERCLEANFILES = Makefile.in *~ AM_CPPFLAGS = -DG_LOG_DOMAIN=\"openhpid\" @CRYPT_FLAG@ AM_CFLAGS = @CRYPT_FLAG@ AM_CPPFLAGS += \ @OPENHPI_INCLUDES@ -I$(top_srcdir)/transport -I$(top_srcdir)/marshal @OH_SSL_INCLUDES@ SUBDIRS = t DIST_SUBDIRS = t EXTRA_DIST = \ openhpid.sh.in \ Makefile.mingw32 \ openhpid-win32.cpp \ version.rc # daemon library noinst_LTLIBRARIES = libopenhpidaemon.la libopenhpidaemon_la_SOURCES = \ alarm.c \ alarm.h \ conf.c \ conf.h \ domain.c \ event.c \ event.h \ hotswap.c \ hotswap.h \ init.c \ init.h \ lock.c \ lock.h \ ohpi.c \ plugin.c \ safhpi.c \ session.c \ threaded.c \ threaded.h libopenhpidaemon_la_LIBADD = $(top_builddir)/utils/libopenhpiutils.la \ @GMODULE_ONLY_LIBS@ if HAVE_OPENSSL libopenhpidaemon_la_LIBADD += $(top_builddir)/$(SSLDIR)/libopenhpi_ssl.la endif libopenhpidaemon_la_LDFLAGS = @HPI_LIB_VERSION@ # daemon sbin_PROGRAMS = openhpid openhpid_SOURCES = server.cpp server.h openhpid-posix.cpp openhpid_LDADD = libopenhpidaemon.la \ $(top_builddir)/marshal/libopenhpimarshal.la \ $(top_builddir)/transport/libopenhpitransport.la openhpid_LDFLAGS = -export-dynamic # this is defined with ./configure --disable-dynamic-daemon if OPENHPID_STATIC openhpid_LDFLAGS += -static else openhpid_LDADD += -lstdc++ endif install-data-local: $(mkinstalldirs) $(DESTDIR)$(sysconfdir)/init.d $(INSTALL) -m 0755 openhpid.sh $(DESTDIR)$(sysconfdir)/init.d/openhpid uninstall-local: rm -f $(DESTDIR)$(sysconfdir)/init.d/openhpid clean-local: rm -f *~ core core.* openhpi-3.6.1/openhpid/conf.h0000644000175100017510000000463412575647301015100 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003-2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague * Renier Morales * Bryan Sutula */ #ifndef __OH_CONFIG_H #define __OH_CONFIG_H #include #include #include #ifdef __cplusplus extern "C" { #endif struct oh_parsed_config { GSList *handler_configs; guint handlers_defined; guint handlers_loaded; }; typedef enum { OPENHPI_ON_EP = 1, OPENHPI_LOG_ON_SEV, OPENHPI_EVT_QUEUE_LIMIT, OPENHPI_DEL_SIZE_LIMIT, OPENHPI_DEL_SAVE, OPENHPI_DAT_SIZE_LIMIT, OPENHPI_DAT_USER_LIMIT, OPENHPI_DAT_SAVE, OPENHPI_PATH, OPENHPI_VARPATH, OPENHPI_CONF, OPENHPI_UNCONFIGURED, OPENHPI_AUTOINSERT_TIMEOUT, OPENHPI_AUTOINSERT_TIMEOUT_READONLY } oh_global_param_type; typedef union { SaHpiEntityPathT on_ep; SaHpiSeverityT log_on_sev; SaHpiUint32T evt_queue_limit; SaHpiUint32T del_size_limit; SaHpiBoolT del_save; SaHpiUint32T dat_size_limit; SaHpiUint32T dat_user_limit; SaHpiBoolT dat_save; char path[OH_MAX_TEXT_BUFFER_LENGTH]; char varpath[OH_MAX_TEXT_BUFFER_LENGTH]; char conf[OH_MAX_TEXT_BUFFER_LENGTH]; SaHpiBoolT unconfigured; SaHpiTimeoutT ai_timeout; SaHpiBoolT ai_timeout_readonly; } oh_global_param_union; struct oh_global_param { oh_global_param_type type; oh_global_param_union u; }; /* Plugin configuration information prototypes */ int oh_load_config(char *filename, struct oh_parsed_config *config); SaErrorT oh_process_config(struct oh_parsed_config *config); void oh_clean_config(struct oh_parsed_config *config); /* For handling global parameters */ int oh_get_global_param(struct oh_global_param *param); int oh_get_global_param2(oh_global_param_type type, struct oh_global_param *param); int oh_set_global_param(const struct oh_global_param *param); #ifdef __cplusplus } #endif #endif/*__OH_CONFIG_H*/ openhpi-3.6.1/openhpid/Makefile.mingw320000644000175100017510000000164512575647301016726 0ustar mohanmohaninclude ../Makefile.mingw32.def TARGET := openhpid.exe SRC := alarm.c \ conf.c \ domain.c \ event.c \ hotswap.c \ init.c \ lock.c \ ohpi.c \ plugin.c \ safhpi.c \ session.c \ threaded.c \ server.cpp \ openhpid-win32.cpp \ version.rc OBJ := $(patsubst %.rc, %.o, $(patsubst %.c, %.o, $(patsubst %.cpp, %.o, ${SRC}))) DEFS := -DG_LOG_DOMAIN=\"openhpid\" INCLUDES := ${GLIB_INCLUDES} INCLUDES += -I ../mingw32 -I ../include -I ../utils -I ../transport -I ../marshal LIBS := ${GLIB_LIBS} ${GTHREAD_LIBS} ${GMODULE_LIBS} LIBS += -L ../utils -lopenhpiutils LIBS += -L ../transport -lopenhpitransport LIBS += -L ../marshal -lopenhpimarshal CPPFLAGS += ${DEFS} ${INCLUDES} .PHONY: all clean .SUFFIXES: .rc all : ${TARGET} ${TARGET} : ${OBJ} ${CXX} -o $@ $^ ${LIBS} .rc.o: ${RC} ${RCFLAGS} $< $@ clean: rm -f ${OBJ} ${TARGET} openhpi-3.6.1/openhpid/alarm.c0000644000175100017510000006156112575647301015244 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004-2008 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * */ #include #include #include #include #include "alarm.h" #include "conf.h" static void __update_dat(struct oh_domain *d) { if (!d) return; d->dat.update_count++; oh_gettimeofday(&d->dat.update_timestamp); } static GSList *__get_alarm_node(struct oh_domain *d, SaHpiAlarmIdT *aid, SaHpiSeverityT *severity, SaHpiStatusCondTypeT *type, SaHpiResourceIdT *rid, SaHpiManufacturerIdT *mid, SaHpiSensorNumT *num, SaHpiEventStateT *state, SaHpiBoolT unacknowledged, int get_next) { GSList *alarms = NULL; if (!d) return NULL; if (aid) { if (*aid == SAHPI_FIRST_ENTRY) get_next = 1; else if (*aid == SAHPI_LAST_ENTRY) { /* Just return the last node, if not getting next alarm. */ if (get_next) return NULL; else return g_slist_last(d->dat.list); } } for (alarms = d->dat.list; alarms; alarms = alarms->next) { SaHpiAlarmT *alarm = alarms->data; if (alarm && (aid ? (get_next ? alarm->AlarmId > *aid : alarm->AlarmId == *aid) : 1) && (severity ? (*severity != SAHPI_ALL_SEVERITIES ? alarm->Severity == *severity : 1) : 1) && (type ? alarm->AlarmCond.Type == *type : 1) && (rid ? alarm->AlarmCond.ResourceId == *rid: 1) && (mid ? alarm->AlarmCond.Mid == *mid : 1) && (num ? alarm->AlarmCond.SensorNum == *num : 1) && (state ? alarm->AlarmCond.EventState == *state : 1) && (unacknowledged ? !alarm->Acknowledged : 1)) { return alarms; } } return NULL; } static SaHpiUint32T __count_alarms(struct oh_domain *d, SaHpiStatusCondTypeT *type, SaHpiSeverityT sev) { GSList *alarms = NULL; SaHpiUint32T count = 0; if (!d) return 0; if (!type && sev == SAHPI_ALL_SEVERITIES) return g_slist_length(d->dat.list); else { for (alarms = d->dat.list; alarms; alarms = alarms->next) { SaHpiAlarmT *alarm = alarms->data; if (alarm && (type ? alarm->AlarmCond.Type == *type : 1) && (sev == SAHPI_ALL_SEVERITIES ? 1 : alarm->Severity == sev)) { count++; } } } return count; } /** * oh_add_alarm * @d: pointer to domain * @alarm: alarm to be added * @fromfile: if True will preserve alarm's id, timestamp, and * acknowledge flag. Also, it will not save immediatedly to disk, * if OPENHPI_DAT_SAVE is set. * * Return value: reference to newly added alarm or NULL if there was * an error **/ SaHpiAlarmT *oh_add_alarm(struct oh_domain *d, SaHpiAlarmT *alarm, int fromfile) { SaHpiAlarmT *a = NULL; struct oh_global_param param = { .type = OPENHPI_DAT_SIZE_LIMIT }; if (!d) { return NULL; } if (oh_get_global_param(¶m)) param.u.dat_size_limit = OH_MAX_DAT_SIZE_LIMIT; if (param.u.dat_size_limit != OH_MAX_DAT_SIZE_LIMIT && g_slist_length(d->dat.list) >= param.u.dat_size_limit) { CRIT("DAT for domain %d is overflowed", d->id); d->dat.overflow = SAHPI_TRUE; return NULL; } else if (alarm && alarm->AlarmCond.Type == SAHPI_STATUS_COND_TYPE_USER) { param.type = OPENHPI_DAT_USER_LIMIT; if (oh_get_global_param(¶m)) param.u.dat_user_limit = OH_MAX_DAT_USER_LIMIT; if (param.u.dat_user_limit != OH_MAX_DAT_USER_LIMIT && __count_alarms(d, &alarm->AlarmCond.Type, SAHPI_ALL_SEVERITIES) >= param.u.dat_user_limit) { CRIT("DAT for domain %d has reached its user alarms limit", d->id); return NULL; } } a = g_new0(SaHpiAlarmT, 1); if (alarm) { /* Copy contents of optional alarm reference */ memcpy(a, alarm, sizeof(SaHpiAlarmT)); } if (fromfile) { if (a->AlarmId > d->dat.next_id) { d->dat.next_id = a->AlarmId; } } else { a->AlarmId = ++(d->dat.next_id); oh_gettimeofday(&a->Timestamp); a->Acknowledged = SAHPI_FALSE; } a->AlarmCond.DomainId = d->id; d->dat.list = g_slist_append(d->dat.list, a); /* Set alarm id and timestamp info in alarm reference */ if (alarm) { alarm->AlarmId = a->AlarmId; alarm->Timestamp = a->Timestamp; } if (!fromfile) { __update_dat(d); param.type = OPENHPI_DAT_SAVE; oh_get_global_param(¶m); if (param.u.dat_save) { char dat_filepath[SAHPI_MAX_TEXT_BUFFER_LENGTH*2]; param.type = OPENHPI_VARPATH; oh_get_global_param(¶m); snprintf(dat_filepath, SAHPI_MAX_TEXT_BUFFER_LENGTH*2, "%s/dat.%u", param.u.varpath, d->id); oh_alarms_to_file(&d->dat, dat_filepath); } } return a; } /** * oh_get_alarm * @d: pointer to domain * @aid: Optional. alarm id for alarm to get * @severity: Optional. Severity of alarm to get * @type: Optional. Type of alarm to get * @rid: Optional. Resource Id of alarm to get * @mid: Optional. Manufacturer Id of alarm to get * @num: Optional. Sensor number of alarm to get * @state: Optional. Event State of alarm to get * @unacknowledged: If True, only gets unacknowledged. * @get_next: Instead of getting the exact @aid, get the next alarm * after that one * * Return value: pointer to SaHpiAlarmT that matched, or NULL of none found. **/ SaHpiAlarmT *oh_get_alarm(struct oh_domain *d, SaHpiAlarmIdT *aid, SaHpiSeverityT *severity, SaHpiStatusCondTypeT *type, SaHpiResourceIdT *rid, SaHpiManufacturerIdT *mid, SaHpiSensorNumT *num, SaHpiEventStateT *state, SaHpiBoolT unacknowledged, int get_next) { GSList *alarm_node = NULL; if (!d) return NULL; alarm_node = __get_alarm_node(d, aid, severity, type, rid, mid, num, state, unacknowledged, get_next); if (!alarm_node) return NULL; return alarm_node->data; } /** * oh_remove_alarm * @d: pointer to domain * @severity: Optional. Severity of alarm to remove * @type: Optional. Type of alarm to remove * @rid: Optional. Resource Id of alarm to remove * @mid: Optional. Manufacturer Id of alarm to remove * @num: Optional. Sensor Number of alarm to remove * @state: Optional. Event state of alarm to remove * @deassert_mask: Optional. Deassert Mask. Matches on a bit AND operation. * @multi: If True, does operation for all matching alarms, otherwise, * just the first matching one. * * Return value: SA_OK on success **/ SaErrorT oh_remove_alarm(struct oh_domain *d, SaHpiSeverityT *severity, SaHpiStatusCondTypeT *type, SaHpiResourceIdT *rid, SaHpiManufacturerIdT *mid, SaHpiSensorNumT *num, SaHpiEventStateT *state, SaHpiEventStateT *deassert_mask, int multi) { GSList *alarm_node = NULL; SaHpiAlarmT *alarm = NULL; SaHpiAlarmIdT aid = SAHPI_FIRST_ENTRY; /* Set to zero */ struct oh_global_param param = { .type = OPENHPI_DAT_SIZE_LIMIT }; if (!d) return SA_ERR_HPI_INVALID_PARAMS; do { alarm_node = __get_alarm_node(d, &aid, severity, type, rid, mid, num, state, 0, 1); if (alarm_node) alarm = alarm_node->data; else break; aid = alarm->AlarmId; if (deassert_mask ? *deassert_mask & alarm->AlarmCond.EventState : 1) { d->dat.list = g_slist_delete_link(d->dat.list, alarm_node); g_free(alarm); } alarm_node = NULL; alarm = NULL; } while (multi); __update_dat(d); if (!oh_get_global_param(¶m)) { /* Reset overflow flag if not overflowed */ if (param.u.dat_size_limit != OH_MAX_DAT_SIZE_LIMIT && g_slist_length(d->dat.list) < param.u.dat_size_limit) d->dat.overflow = SAHPI_FALSE; } return SA_OK; } /** * oh_close_alarmtable * @d: pointer to domain * * Frees all memory held by alarm table. * * Return value: SA_OK on success **/ SaErrorT oh_close_alarmtable(struct oh_domain *d) { SaErrorT error = SA_OK; if (!d) return SA_ERR_HPI_INVALID_PARAMS; error = oh_remove_alarm(d, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1); d->dat.next_id = 0; d->dat.update_count = 0; d->dat.update_timestamp = SAHPI_TIME_UNSPECIFIED; return error; } /** * oh_count_alarms * @d: pointer to domain * @sev: Severity of alarms to count * * Counts alarms in the domain table. You can count alarms of a specific * severity, or for all severities (SAHPI_ALL_SEVERITIES). * * Return value: Number of alarms counted. **/ SaHpiUint32T oh_count_alarms(struct oh_domain *d, SaHpiSeverityT sev) { SaHpiUint32T count = 0; count = __count_alarms(d, NULL, sev); return count; } static void oh_detect_oem_event_alarm(struct oh_domain *d, SaHpiEventT *event) { SaHpiAlarmT a; SaHpiStatusCondTypeT type = SAHPI_STATUS_COND_TYPE_OEM; if (!d || !event) return; /* Search for possible oem alarm, if severity is "non-alarming" */ if (event->Severity > SAHPI_MINOR) { oh_remove_alarm(d, NULL, &type, &event->Source, &event->EventDataUnion.OemEvent.MId, NULL, NULL, NULL, 1); return; } /* Severity is "alarming". Add/Create OEM alarm */ memset( &a, 0, sizeof( a ) ); /* Make sure alarm has valid fields */ a.Severity = event->Severity; a.AlarmCond.Type = type; oh_entity_path_lookup(event->Source, &a.AlarmCond.Entity); a.AlarmCond.ResourceId = event->Source; a.AlarmCond.Mid = event->EventDataUnion.OemEvent.MId; memcpy(&a.AlarmCond.Data, &event->EventDataUnion.OemEvent.OemEventData, sizeof(SaHpiTextBufferT)); oh_add_alarm(d, &a, 0); return; } static void oh_detect_resource_event_alarm(struct oh_domain *d, SaHpiEventT *event) { SaHpiStatusCondTypeT type = SAHPI_STATUS_COND_TYPE_RESOURCE; SaHpiAlarmT a; if (!d || !event) return; if (event->EventType != SAHPI_ET_RESOURCE) return; /* Search for possible clearance of resource alarm, if event is not a resource failure */ if (event->EventDataUnion.ResourceEvent.ResourceEventType != SAHPI_RESE_RESOURCE_FAILURE) { oh_remove_alarm(d, NULL, &type, &event->Source, NULL, NULL, NULL, NULL, 1); return; } /* Failed resource. Add/Create resource alarm if severity is "alarming" */ if (event->Severity <= SAHPI_MINOR) { memset( &a, 0, sizeof( a ) ); /* Make sure alarm has valid * fields */ a.Severity = event->Severity; a.AlarmCond.Type = type; oh_entity_path_lookup(event->Source, &a.AlarmCond.Entity); a.AlarmCond.ResourceId = event->Source; oh_add_alarm(d, &a, 0); } return; } static void oh_detect_sensor_event_alarm(struct oh_domain *d, SaHpiEventT *event) { SaHpiStatusCondTypeT type = SAHPI_STATUS_COND_TYPE_SENSOR; SaHpiAlarmT a; if (!d || !event) return; if ( ( event->EventDataUnion.SensorEvent.OptionalDataPresent & SAHPI_SOD_CURRENT_STATE ) != 0 ) { SaHpiEventStateT deasserted = ~ ( event->EventDataUnion.SensorEvent.CurrentState ); oh_remove_alarm(d, NULL, &type, &event->Source, NULL, &event->EventDataUnion.SensorEvent.SensorNum, NULL, &deasserted, 1); } if (!event->EventDataUnion.SensorEvent.Assertion) { /* Check for possible sensor alarm removals, since sensor is not asserted. */ oh_remove_alarm(d, NULL, &type, &event->Source, NULL, &event->EventDataUnion.SensorEvent.SensorNum, &event->EventDataUnion.SensorEvent.EventState, NULL, 1); } else if (event->Severity <= SAHPI_MINOR && event->EventDataUnion.SensorEvent.Assertion) { /* Add sensor alarm to dat, since event is severe enough and is asserted. */ memset( &a, 0, sizeof( a ) ); /* Make sure alarm has valid * fields */ a.Severity = event->Severity; a.AlarmCond.Type = type; oh_entity_path_lookup(event->Source, &a.AlarmCond.Entity); a.AlarmCond.ResourceId = event->Source; a.AlarmCond.SensorNum = event->EventDataUnion.SensorEvent.SensorNum; a.AlarmCond.EventState = event->EventDataUnion.SensorEvent.EventState; oh_add_alarm(d, &a, 0); } return; } static void oh_detect_sensor_enable_change_alarm(struct oh_domain *d, SaHpiEventT *event) { SaHpiStatusCondTypeT type = SAHPI_STATUS_COND_TYPE_SENSOR; if (!d || !event) return; if (!event->EventDataUnion.SensorEnableChangeEvent.SensorEnable || !event->EventDataUnion.SensorEnableChangeEvent.SensorEventEnable) { oh_remove_alarm(d, NULL, &type, &event->Source, NULL, &event->EventDataUnion.SensorEnableChangeEvent.SensorNum, NULL, NULL, 1); } } static void oh_remove_resource_alarms(struct oh_domain *d, SaHpiResourceIdT rid, int all) { SaHpiStatusCondTypeT type = SAHPI_STATUS_COND_TYPE_RESOURCE; if (!d || !rid) return; oh_remove_alarm(d, NULL, &type, &rid, NULL, NULL, NULL, NULL, 1); if (all) { type = SAHPI_STATUS_COND_TYPE_OEM; oh_remove_alarm(d, NULL, &type, &rid, NULL, NULL, NULL, NULL, 1); type = SAHPI_STATUS_COND_TYPE_SENSOR; oh_remove_alarm(d, NULL, &type, &rid, NULL, NULL, NULL, NULL, 1); } return; } static void oh_detect_hpi_alarm(struct oh_domain *d, SaHpiEventT *event) { if (!d || !event) return; switch (event->EventType) { case SAHPI_ET_OEM: oh_detect_oem_event_alarm(d, event); break; case SAHPI_ET_RESOURCE: oh_detect_resource_event_alarm(d, event); break; case SAHPI_ET_SENSOR: oh_detect_sensor_event_alarm(d, event); break; case SAHPI_ET_SENSOR_ENABLE_CHANGE: oh_detect_sensor_enable_change_alarm(d, event); break; default:; } return; } static void oh_detect_resource_alarm(struct oh_domain *d, SaHpiRptEntryT *res) { SaHpiAlarmT a; SaHpiStatusCondTypeT type = SAHPI_STATUS_COND_TYPE_RESOURCE; if (!d || !res) return; /* Check possible alarms for removal, if resource is not failed. */ if (!res->ResourceFailed || res->ResourceSeverity > SAHPI_MINOR) { oh_remove_alarm(d, NULL, &type, &res->ResourceId, NULL, NULL, NULL, NULL, 1); } else if (res->ResourceSeverity <= SAHPI_MINOR && res->ResourceFailed) { /* Otherwise, if sev is "alarming" and resource failed, create alarm. */ memset( &a, 0, sizeof( a ) ); /* Make sure alarm has valid * fields */ a.Severity = res->ResourceSeverity; a.AlarmCond.Type = SAHPI_STATUS_COND_TYPE_RESOURCE; oh_entity_path_lookup(res->ResourceId, &a.AlarmCond.Entity); a.AlarmCond.ResourceId = res->ResourceId; a.AlarmCond.Mid = res->ResourceInfo.ManufacturerId; memcpy(&a.AlarmCond.Data, &res->ResourceTag, sizeof(SaHpiTextBufferT)); oh_add_alarm(d, &a, 0); } return; } /** * oh_detect_event_alarm * @d: pointer to domain * @e: pointer to event * * Study event and determine if alarms need to be removed. * * Return value: SA_OK on success **/ SaErrorT oh_detect_event_alarm(struct oh_domain *d, struct oh_event *e) { SaHpiEventTypeT etype; if (!d || !e) return SA_ERR_HPI_INVALID_PARAMS; etype = e->event.EventType; if (etype == SAHPI_ET_RESOURCE) { if (e->resource.ResourceId) { oh_detect_resource_alarm(d, &e->resource); } else { oh_detect_resource_event_alarm(d, &e->event); } } else if (etype == SAHPI_ET_HOTSWAP) { if (e->event.EventDataUnion.HotSwapEvent.HotSwapState == SAHPI_HS_STATE_NOT_PRESENT) { SaHpiResourceIdT rid = e->resource.ResourceId; if (!rid) rid = e->event.Source; oh_remove_resource_alarms(d, rid, 1); } } else { oh_detect_hpi_alarm(d, &e->event); } return SA_OK; } /** * oh_detect_res_sev_alarm * @did: domain id * @res: resource id * @new_sev: severity being set in resource * * Detect if severity on resource change makes any alarms invalid. * If so, remove such alarms. * * Return value: SA_OK on success **/ SaErrorT oh_detect_res_sev_alarm(SaHpiDomainIdT did, SaHpiResourceIdT rid, SaHpiSeverityT new_sev) { struct oh_domain *d = NULL; SaHpiRptEntryT *res = NULL; if (!rid) return SA_ERR_HPI_INVALID_PARAMS; d = oh_get_domain(did); if (!d) return SA_ERR_HPI_INVALID_DOMAIN; res = oh_get_resource_by_id(&d->rpt, rid); if (!res) { oh_release_domain(d); return SA_ERR_HPI_INVALID_RESOURCE; } if (res->ResourceSeverity <= SAHPI_MINOR && new_sev > SAHPI_MINOR) oh_remove_resource_alarms(d, res->ResourceId, 0); oh_release_domain(d); return SA_OK; } /** * oh_detect_sensor_enable_alarm * @did: domain id * @rid: resource id * @num: sensor number * @enable: sensor enable flag * * This will detect if a sensor-enable related alarm needs to be removed, * and if so, will remove it accordingly. * * Return value: SA_OK on success **/ SaErrorT oh_detect_sensor_enable_alarm(SaHpiDomainIdT did, SaHpiResourceIdT rid, SaHpiSensorNumT num, SaHpiBoolT enable) { struct oh_domain *d = NULL; SaHpiStatusCondTypeT type = SAHPI_STATUS_COND_TYPE_SENSOR; SaErrorT error = SA_OK; if (!rid) return SA_ERR_HPI_INVALID_PARAMS; /* Only need to scan alarm table if enable is false */ if (enable) return SA_OK; d = oh_get_domain(did); if (!d) return SA_ERR_HPI_INVALID_DOMAIN; /* Enable is false, so scan alarm table and remove any matching sensor alarms */ error = oh_remove_alarm(d, NULL, &type, &rid, NULL, &num, NULL, NULL, 1); oh_release_domain(d); return error; } /** * oh_detect_sensor_mask_alarm * @did: domain id * @rid: resource id * @num: sensor number * @action: event mask action * @deassert_mask: deassert mask * * This will detect if a sensor related alarm needs to be removed, * and if so, will remove it accordingly. * * Return value: SA_OK on success **/ SaErrorT oh_detect_sensor_mask_alarm(SaHpiDomainIdT did, SaHpiResourceIdT rid, SaHpiSensorNumT num, SaHpiSensorEventMaskActionT action, SaHpiEventStateT deassert_mask) { struct oh_domain *d = NULL; SaHpiStatusCondTypeT type = SAHPI_STATUS_COND_TYPE_SENSOR; SaErrorT error = SA_OK; if (!rid) return SA_ERR_HPI_INVALID_PARAMS; if (action == SAHPI_SENS_ADD_EVENTS_TO_MASKS) return SA_OK; if (action != SAHPI_SENS_REMOVE_EVENTS_FROM_MASKS) return SA_ERR_HPI_INVALID_PARAMS; d = oh_get_domain(did); if (!d) return SA_ERR_HPI_INVALID_DOMAIN; /* Find matching sensor alarms and compare alarm's state with the deassert mask. If deassert for that state is being disabled on the sensor, then remove the alarm. */ error = oh_remove_alarm(d, NULL, &type, &rid, NULL, &num, NULL, &deassert_mask, 1); oh_release_domain(d); return error; } /** * oh_alarms_to_file * * @at: pointer to alarm table. alarms in this table will be saved to a file * @filename: file to which alarms will be saved. * * Return value: SA_OK on success. **/ SaErrorT oh_alarms_to_file(struct oh_dat *at, char *filename) { GSList *alarms = NULL; FILE * fp; if (!at || !filename) { return SA_ERR_HPI_INVALID_PARAMS; } fp = fopen(filename, "wb"); if (!fp) { CRIT("File '%s' could not be opened", filename); return SA_ERR_HPI_ERROR; } for (alarms = at->list; alarms; alarms = alarms->next) { if (fwrite(alarms->data, sizeof(SaHpiAlarmT), 1, fp) != 1) { CRIT("Couldn't write to file '%s'.", filename); fclose(fp); return SA_ERR_HPI_ERROR; } } fclose(fp); return SA_OK; } /** * oh_alarms_from_file * * @d: pointer to domain. alarm table in this domain will receive * the alarms stored in @filename. * @filename: filename where alarms will be read from * * Return value: SA_OK on success **/ SaErrorT oh_alarms_from_file(struct oh_domain *d, char *filename) { FILE *fp; SaHpiAlarmT alarm; if (!d || !filename) { return SA_ERR_HPI_ERROR; } fp = fopen(filename, "rb"); if (!fp) { CRIT("File '%s' could not be opened", filename); return SA_ERR_HPI_ERROR; } while (fread(&alarm, sizeof(SaHpiAlarmT), 1, fp) == 1) { SaHpiAlarmT *a = oh_add_alarm(d, &alarm, 1); if (!a) { fclose(fp); CRIT("Error adding alarm read from file."); return SA_ERR_HPI_ERROR; } } fclose(fp); return SA_OK; } openhpi-3.6.1/openhpid/conf.c0000644000175100017510000010207212575647301015066 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003-2006 * Copyright (c) 2003 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague * Louis Zhuang * David Judkovics * Thomas Kangieser * Renier Morales * Bryan Sutula */ #include #include #include #include #include #ifndef _WIN32 #include #include #include #include #include #endif // _WIN32 #include #include #include #include "conf.h" #include "lock.h" #include "sahpi_wrappers.h" /* * Global Parameters */ static const char *known_globals[] = { "OPENHPI_LOG_ON_SEV", "OPENHPI_EVT_QUEUE_LIMIT", "OPENHPI_DEL_SIZE_LIMIT", "OPENHPI_DEL_SAVE", "OPENHPI_DAT_SIZE_LIMIT", "OPENHPI_DAT_USER_LIMIT", "OPENHPI_DAT_SAVE", "OPENHPI_PATH", "OPENHPI_VARPATH", "OPENHPI_CONF", // The parameters below are not accessible via oHpiGlobalParamSet/oHpiGlobalParamGet "OPENHPI_UNCONFIGURED", "OPENHPI_AUTOINSERT_TIMEOUT", "OPENHPI_AUTOINSERT_TIMEOUT_READONLY", NULL }; static struct { SaHpiSeverityT log_on_sev; SaHpiUint32T evt_queue_limit; SaHpiUint32T del_size_limit; SaHpiBoolT del_save; SaHpiUint32T dat_size_limit; SaHpiUint32T dat_user_limit; SaHpiBoolT dat_save; char path[OH_PATH_PARAM_MAX_LENGTH]; char varpath[OH_PATH_PARAM_MAX_LENGTH]; char conf[OH_PATH_PARAM_MAX_LENGTH]; // The parameters below are not accessible via oHpiGlobalParamSet/oHpiGlobalParamGet SaHpiBoolT unconfigured; SaHpiTimeoutT ai_timeout; SaHpiBoolT ai_timeout_readonly; unsigned char read_env; GStaticRecMutex lock; } global_params = { /* Defaults for global params are set here */ .log_on_sev = SAHPI_MINOR, .evt_queue_limit = 10000, .del_size_limit = 10000, /* 0 is unlimited size */ .del_save = SAHPI_FALSE, .dat_size_limit = 0, /* Unlimited size */ .dat_user_limit = 0, /* Unlimited size */ .dat_save = SAHPI_FALSE, .path = OH_PLUGIN_PATH, .varpath = VARPATH, .conf = OH_DEFAULT_CONF, .unconfigured = SAHPI_FALSE, .ai_timeout = 0, .ai_timeout_readonly = SAHPI_TRUE, .read_env = 0, .lock = G_STATIC_REC_MUTEX_INIT }; /* * List of handler configs (parameter tables). This list is * populated during config file parse, and used to build the handler_table */ static GSList *handler_configs = NULL; /******************************************************************************* * In order to use the glib lexical parser we need to define token * types which we want to switch on ******************************************************************************/ enum { HPI_CONF_TOKEN_HANDLER = G_TOKEN_LAST } hpiConfType; struct tokens { gchar *name; guint token; }; static struct tokens oh_conf_tokens[] = { { .name = "handler", .token = HPI_CONF_TOKEN_HANDLER } }; /******************************************************************************* * In order to initialize the lexical scanner, you need the following config. * This config was figured out by reading the glib sources, and lots of * trial and error (documentation for this isn't very good). * * G_TOKEN_STRING will be created when anything starts with a-zA-z_/. * due to cset_identifier_first and identifier2string values below. * Therefor, if you want 0 to be scanned as a string, you need to quote * it (e.g. "0") * *******************************************************************************/ static GScannerConfig oh_scanner_config = { ( " \t\n" ) /* cset_skip_characters */, ( G_CSET_a_2_z "_/." G_CSET_A_2_Z ) /* cset_identifier_first */, ( G_CSET_a_2_z "_-0123456789/." G_CSET_A_2_Z ) /* cset_identifier_nth */, ( "#\n" ) /* cpair_comment_single */, FALSE /* case_sensitive */, TRUE /* skip_comment_multi */, TRUE /* skip_comment_single */, TRUE /* scan_comment_multi */, TRUE /* scan_identifier */, TRUE /* scan_identifier_1char */, TRUE /* scan_identifier_NULL */, TRUE /* scan_symbols */, TRUE /* scan_binary */, TRUE /* scan_octal */, TRUE /* scan_float */, TRUE /* scan_hex */, TRUE /* scan_hex_dollar */, TRUE /* scan_string_sq */, TRUE /* scan_string_dq */, TRUE /* numbers_2_int */, FALSE /* int_2_float */, TRUE /* identifier_2_string */, TRUE /* char_2_token */, TRUE /* symbol_2_token */, FALSE /* scope_0_fallback */, TRUE /* store_int64 */, }; static void process_global_param(const char *name, char *value) { wrap_g_static_rec_mutex_lock((void *)&global_params.lock); if (!strcmp("OPENHPI_LOG_ON_SEV", name)) { SaHpiTextBufferT buffer; strncpy((char *)buffer.Data, value, SAHPI_MAX_TEXT_BUFFER_LENGTH); oh_encode_severity(&buffer, &global_params.log_on_sev); } else if (!strcmp("OPENHPI_EVT_QUEUE_LIMIT", name)) { global_params.evt_queue_limit = atoi(value); } else if (!strcmp("OPENHPI_DEL_SIZE_LIMIT", name)) { global_params.del_size_limit = atoi(value); } else if (!strcmp("OPENHPI_DEL_SAVE", name)) { if (!strcmp("YES", value)) { global_params.del_save = SAHPI_TRUE; } else { global_params.del_save = SAHPI_FALSE; } } else if (!strcmp("OPENHPI_DAT_SIZE_LIMIT", name)) { global_params.dat_size_limit = atoi(value); } else if (!strcmp("OPENHPI_DAT_USER_LIMIT", name)) { global_params.dat_user_limit = atoi(value); } else if (!strcmp("OPENHPI_DAT_SAVE", name)) { if (!strcmp("YES", value)) { global_params.dat_save = SAHPI_TRUE; } else { global_params.dat_save = SAHPI_FALSE; } } else if (!strcmp("OPENHPI_PATH", name)) { memset(global_params.path, 0, OH_PATH_PARAM_MAX_LENGTH); strncpy(global_params.path, value, OH_PATH_PARAM_MAX_LENGTH-1); } else if (!strcmp("OPENHPI_VARPATH", name)) { memset(global_params.varpath, 0, OH_PATH_PARAM_MAX_LENGTH); strncpy(global_params.varpath, value, OH_PATH_PARAM_MAX_LENGTH-1); } else if (!strcmp("OPENHPI_CONF", name)) { memset(global_params.conf, 0, OH_PATH_PARAM_MAX_LENGTH); strncpy(global_params.conf, value, OH_PATH_PARAM_MAX_LENGTH-1); } else if (!strcmp("OPENHPI_UNCONFIGURED", name)) { if (!strcmp("YES", value)) { global_params.unconfigured = SAHPI_TRUE; } else { global_params.unconfigured = SAHPI_FALSE; } } else if (!strcmp("OPENHPI_AUTOINSERT_TIMEOUT", name)) { if (!strcmp(value, "BLOCK")) { global_params.ai_timeout = SAHPI_TIMEOUT_BLOCK; } else if (!strcmp(value, "IMMEDIATE")) { global_params.ai_timeout = SAHPI_TIMEOUT_IMMEDIATE; } else { global_params.ai_timeout = strtoll(value, 0, 10); if (global_params.ai_timeout < 0) { global_params.ai_timeout = SAHPI_TIMEOUT_BLOCK; } } } else if (!strcmp("OPENHPI_AUTOINSERT_TIMEOUT_READONLY", name)) { if (!strcmp("YES", value)) { global_params.ai_timeout_readonly = SAHPI_TRUE; } else { global_params.ai_timeout_readonly = SAHPI_FALSE; } } else { CRIT("Invalid global parameter %s in config file.", name); } wrap_g_static_rec_mutex_unlock(&global_params.lock); } static void read_globals_from_env(int force) { char *tmp_env_str = NULL; int i; if (!force && global_params.read_env) return; wrap_g_static_rec_mutex_lock(&global_params.lock); for (i = 0; known_globals[i]; i++) { if ((tmp_env_str = getenv(known_globals[i])) != NULL) { process_global_param(known_globals[i], tmp_env_str); tmp_env_str = NULL; } } global_params.read_env = 1; wrap_g_static_rec_mutex_unlock(&global_params.lock); } /** * process_handler_token * @oh_scanner * * handles parsing of handler tokens into a hash table. * * Return value: 0 on sucess, < 0 on fail **/ static int process_handler_token (GScanner* oh_scanner) { GHashTable *handler_stanza = NULL; char *tablekey, *tablevalue; int found_right_curly = 0; data_access_lock(); if (g_scanner_get_next_token(oh_scanner) != (int)HPI_CONF_TOKEN_HANDLER) { CRIT("Processing handler: Unexpected token."); data_access_unlock(); return -1; } /* Get the plugin type and store in Hash Table */ if (g_scanner_get_next_token(oh_scanner) != G_TOKEN_STRING) { CRIT("Processing handler: Expected string token."); data_access_unlock(); return -1; } else { handler_stanza = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); tablekey = g_strdup("plugin"); tablevalue = g_strdup(oh_scanner->value.v_string); g_hash_table_insert(handler_stanza, (gpointer) tablekey, (gpointer) tablevalue); oh_load_plugin(tablevalue); } /* Check for Left Brace token type. If we have it, then continue parsing. */ if (g_scanner_get_next_token(oh_scanner) != G_TOKEN_LEFT_CURLY) { CRIT("Processing handler: Expected left curly token."); goto free_table; } while (!found_right_curly) { /* get key token in key\value pair set (e.g. key = value) */ if (g_scanner_get_next_token(oh_scanner) != G_TOKEN_STRING) { CRIT("Processing handler: Expected string token."); goto free_table; } else { tablekey = g_strdup(oh_scanner->value.v_string); } /* Check for the equal sign next. If we have it, continue parsing */ if (g_scanner_get_next_token(oh_scanner) != G_TOKEN_EQUAL_SIGN) { CRIT("Processing handler: Expected equal sign token."); goto free_table_and_key; } /* * Now check for the value token in the key\value set. * Store the key\value value pair in the hash table and continue on. */ if (g_scanner_peek_next_token(oh_scanner) != G_TOKEN_INT && g_scanner_peek_next_token(oh_scanner) != G_TOKEN_FLOAT && g_scanner_peek_next_token(oh_scanner) != G_TOKEN_STRING) { CRIT("Processing handler: Expected string, integer, or float token."); goto free_table_and_key; } else { /* The type of token tells us how to fetch the value from oh_scanner */ gpointer value = NULL; int current_token = g_scanner_get_next_token(oh_scanner); if (current_token == G_TOKEN_INT) { // TODO seems everyone now relies that // value shall be string. // So this code may break a plug-in expectations. // Investigate gulong *value_int = g_new0(gulong, 1); *value_int = (gulong)oh_scanner->value.v_int64; value = (gpointer)value_int; } else if (current_token == G_TOKEN_FLOAT) { // TODO seems everyone now relies that // value shall be string. // So this code may break a plug-in expectations. // Investigate gdouble *value_float = g_new0(gdouble, 1); *value_float = oh_scanner->value.v_float; value = (gpointer)value_float; } else { gchar *value_string = g_strdup(oh_scanner->value.v_string); value = (gpointer)value_string; } if (value == NULL) { CRIT("Processing handler:" " Unable to allocate memory for value." " Token Type: %d.", current_token); goto free_table_and_key; } g_hash_table_insert(handler_stanza, (gpointer) tablekey, value); } if (g_scanner_peek_next_token(oh_scanner) == G_TOKEN_RIGHT_CURLY) { g_scanner_get_next_token(oh_scanner); found_right_curly = 1; } } /* end of while(!found_right_curly) */ /* Attach table describing handler stanza to the global linked list of handlers */ if (handler_stanza != NULL) { handler_configs = g_slist_append( handler_configs, (gpointer) handler_stanza); } data_access_unlock(); return 0; free_table_and_key: g_free(tablekey); free_table: /** There was an error reading a token so we need to error out, but not before cleaning up. Destroy the table. */ g_hash_table_destroy(handler_stanza); data_access_unlock(); return -1; } static int process_global_token(GScanner *scanner) { char *name = NULL, *value = NULL; int current_token; data_access_lock(); /* Get the global parameter name */ current_token = g_scanner_get_next_token(scanner); if (current_token != G_TOKEN_STRING) { CRIT("Processing global: Expected string token. Got %d.", current_token); goto quit; } name = g_strdup(scanner->value.v_string); if (!name) { CRIT("Unable to allocate for global param name."); goto quit; } current_token = g_scanner_get_next_token(scanner); if (current_token != G_TOKEN_EQUAL_SIGN) { CRIT("Did not get expected '=' token. Got %d.", current_token); goto free_and_quit; } current_token = g_scanner_get_next_token(scanner); if (current_token != G_TOKEN_STRING && current_token != G_TOKEN_INT) { CRIT("Did not get expected string value for global parameter." " Got %d.", current_token); goto free_and_quit; } if (current_token == G_TOKEN_INT) { const guint max_digits = 32; // More than enough for uint64. value = (char *)g_malloc0(max_digits); snprintf(value, max_digits, "%" PRIu64, scanner->value.v_int64); } else { value = g_strdup(scanner->value.v_string); } if (!value) { CRIT("Unable to allocate for global param value."); goto free_and_quit; } process_global_param(name, value); g_free(name); g_free(value); data_access_unlock(); return 0; free_and_quit: g_free(name); quit: data_access_unlock(); return -1; } /** * scanner_msg_handler: a reference of this function is passed into the GScanner. * Used by the GScanner object to output messages that come up during parsing. * * @scanner: Object used to parse the config file. * @message: Message string. * @is_error: Bit to say the message is an error. * * Return value: None (void). **/ static void scanner_msg_handler (GScanner *scanner, gchar *message, gboolean is_error) { g_return_if_fail (scanner != NULL); CRIT("%s:%d: %s%s.\n", scanner->input_name ? scanner->input_name : "", scanner->line, is_error ? "error: " : "", message ); } /** * oh_load_config * @filename: OpenHPI configuration filename * @config: place where the parsed configuration will be placed. * * Parses an OpenHPI configuration file and gives the results * which can be processed by the caller. * * Return value: 0 on success, otherwise a failure. **/ int oh_load_config (char *filename, struct oh_parsed_config *config) { FILE * fp = NULL; #ifndef _WIN32 struct stat fst, dst; char *dir_name = NULL; char dup_filename[PATH_MAX]; #ifdef HAVE_ENCRYPT SaHpiUint32T type = OHPI_DECRYPT; gchar *confile_txt = NULL; #endif /* HAVE_ENCRYPT */ #endif /* _WIN32 */ gchar * gcrypt_str = NULL; gboolean g_decrypt = SAHPI_FALSE; GScanner *oh_scanner; int i, done = 0; int num_tokens = sizeof(oh_conf_tokens) / sizeof(oh_conf_tokens[0]); if (!filename || !config) { CRIT("Error. Invalid parameters."); return -1; } handler_configs = NULL; oh_scanner = g_scanner_new(&oh_scanner_config); if (!oh_scanner) { CRIT("Couldn't allocate g_scanner for file parsing."); return -2; } oh_scanner->msg_handler = scanner_msg_handler; oh_scanner->input_name = filename; #ifndef _WIN32 errno=0; if (stat (filename, &fst) == -1) { if (errno != ENOENT) { CRIT("stat of %s failed.", filename); g_scanner_destroy(oh_scanner); return -3; } } if (errno != ENOENT) { if (fst.st_uid != geteuid()) { if (fst.st_uid == 0) { CRIT("%s owner is root (0)!", filename); CRIT("Run as sudo or create a config with UID=%d.", (int)geteuid()); g_scanner_destroy(oh_scanner); return -3; } else { CRIT("%s owner(%d) is insecure!", filename, fst.st_uid); CRIT("Owner UID shall be %d.", (int)geteuid()); g_scanner_destroy(oh_scanner); return -3; } } if (((fst.st_mode & (S_IRWXG | S_IRWXO)) != 0)) { CRIT("%s permissions are insecure!", filename); CRIT("Shall not contain bits for group/others."); g_scanner_destroy(oh_scanner); return -3; } if ((fst.st_mode & S_IFMT) != S_IFREG) { CRIT("%s permissions are insecure!", filename); CRIT("It needs to be a regular file"); g_scanner_destroy(oh_scanner); return -3; } /* Now check the directory permissions */ if (strlen(filename) >= PATH_MAX) { CRIT("%s is too long",filename); g_scanner_destroy(oh_scanner); return -3; } strcpy(dup_filename, filename); dir_name=dirname(dup_filename); if (stat(dir_name, &dst) == -1) { CRIT("stat of %s failed.", dir_name); g_scanner_destroy(oh_scanner); return -3; } if ((fst.st_uid != dst.st_uid)) { CRIT("%s directory is insecure", dir_name); CRIT("Owner UID shall be %d",fst.st_uid); g_scanner_destroy(oh_scanner); return -3; } if ((dst.st_mode & (S_IWOTH | S_IWGRP)) != 0 ) { CRIT("%s directory is insecure",dir_name); CRIT("Shall not be writable by group or others"); g_scanner_destroy(oh_scanner); return -3; } } #endif // _WIN32 gcrypt_str = getenv("OPENHPI_GCRYPT"); if(gcrypt_str) g_decrypt = atoi((const char *)gcrypt_str); if(g_decrypt) { #ifndef _WIN32 #ifdef HAVE_ENCRYPT confile_txt = oh_crypt(filename, type); if(!confile_txt) { CRIT("Unable to decrypt %s\n",filename); g_scanner_destroy(oh_scanner); return -3; } g_scanner_input_text(oh_scanner, confile_txt, fst.st_size); #else CRIT("gcrypt asked for but not compiled with. Internal Error"); return -4; #endif /* HAVE_ENCRYPT */ #else WARN("Encrypting %s not supported",filename); WARN("Assuming plain file"); #endif } else { fp = fopen(filename, "r"); if (!fp) { CRIT("Configuration file '%s' could not be opened.", filename); g_scanner_destroy(oh_scanner); return -4; } } #ifdef _WIN32 g_scanner_input_file(oh_scanner, _fileno(fp)); #else if(!g_decrypt) { g_scanner_input_file(oh_scanner, fileno(fp)); } #endif for (i = 0; i < num_tokens; i++) { g_scanner_scope_add_symbol( oh_scanner, 0, oh_conf_tokens[i].name, GUINT_TO_POINTER(oh_conf_tokens[i].token)); } while (!done) { int my_token; my_token = g_scanner_peek_next_token (oh_scanner); /*DBG("token: %d", my_token);*/ switch (my_token) { case G_TOKEN_EOF: done = 1; break; case HPI_CONF_TOKEN_HANDLER: process_handler_token(oh_scanner); break; case G_TOKEN_STRING: process_global_token(oh_scanner); break; default: /* need to advance it */ my_token = g_scanner_get_next_token(oh_scanner); g_scanner_unexp_token(oh_scanner, G_TOKEN_SYMBOL, NULL, "\"handle\" or \"domain\"", NULL, NULL, 1); break; } } read_globals_from_env(1); if (fp) fclose(fp); done = oh_scanner->parse_errors; g_scanner_destroy(oh_scanner); DBG("Done processing conf file. Parse errors: %d", done); config->handler_configs = handler_configs; #ifdef HAVE_ENCRYPT free(confile_txt); #endif handler_configs = NULL; return 0; } /** * oh_process_config * @config: pointer to parsed configuration for processing * * This will process a parsed configuration by loading * the specified plugins and corresponding handlers. * * Returns: SA_OK on success, otherwise the call failed. **/ SaErrorT oh_process_config(struct oh_parsed_config *config) { GSList *node = NULL; if (!config) return SA_ERR_HPI_INVALID_PARAMS; /* Initialize handlers */ for (node = config->handler_configs; node; node = node->next) { GHashTable *handler_config = (GHashTable *)node->data; unsigned int hid = 0; SaErrorT error = SA_OK; error = oh_create_handler(handler_config, &hid); if (error == SA_OK) { DBG("Loaded handler for plugin %s", (char *)g_hash_table_lookup(handler_config, "plugin")); config->handlers_loaded++; } else { CRIT("Couldn't load handler for plugin %s.", (char *)g_hash_table_lookup(handler_config, "plugin")); if (hid == 0) g_hash_table_destroy(handler_config); } config->handlers_defined++; } return SA_OK; } void oh_clean_config(struct oh_parsed_config *config) { /* Free list of handler configuration blocks */ g_slist_free(config->handler_configs); } /** * oh_get_global_param * @param * * Returns: 0 on Success. **/ int oh_get_global_param(struct oh_global_param *param) { if (!param || !(param->type)) { if (!param) { CRIT("Invalid parameters param NULL."); return -1; } if (!param->type) { CRIT("Invalid parameters param->type NULL."); return -1; } } read_globals_from_env(0); wrap_g_static_rec_mutex_lock(&global_params.lock); switch (param->type) { case OPENHPI_LOG_ON_SEV: param->u.log_on_sev = global_params.log_on_sev; break; case OPENHPI_EVT_QUEUE_LIMIT: param->u.evt_queue_limit = global_params.evt_queue_limit; break; case OPENHPI_DEL_SIZE_LIMIT: param->u.del_size_limit = global_params.del_size_limit; break; case OPENHPI_DEL_SAVE: param->u.del_save = global_params.del_save; break; case OPENHPI_DAT_SIZE_LIMIT: param->u.dat_size_limit = global_params.dat_size_limit; break; case OPENHPI_DAT_USER_LIMIT: param->u.dat_user_limit = global_params.dat_user_limit; break; case OPENHPI_DAT_SAVE: param->u.dat_save = global_params.dat_save; break; case OPENHPI_PATH: strncpy(param->u.path, global_params.path, OH_PATH_PARAM_MAX_LENGTH); break; case OPENHPI_VARPATH: strncpy(param->u.varpath, global_params.varpath, OH_PATH_PARAM_MAX_LENGTH); break; case OPENHPI_CONF: strncpy(param->u.conf, global_params.conf, OH_PATH_PARAM_MAX_LENGTH); break; case OPENHPI_UNCONFIGURED: param->u.unconfigured = global_params.unconfigured; break; case OPENHPI_AUTOINSERT_TIMEOUT: param->u.ai_timeout = global_params.ai_timeout; break; case OPENHPI_AUTOINSERT_TIMEOUT_READONLY: param->u.ai_timeout_readonly = global_params.ai_timeout_readonly; break; default: wrap_g_static_rec_mutex_unlock(&global_params.lock); CRIT("Invalid global parameter %d!", param->type); return -2; } wrap_g_static_rec_mutex_unlock(&global_params.lock); return 0; } /** * oh_get_global_param2 * @param * * Returns: 0 on Success. **/ int oh_get_global_param2(oh_global_param_type type, struct oh_global_param *param) { if (!param) { CRIT("Invalid parameters."); return -1; } param->type = type; return oh_get_global_param(param); } /** * oh_set_global_param * @param * * Returns: 0 on Success. **/ int oh_set_global_param(const struct oh_global_param *param) { if (!param || !(param->type)) { CRIT("Invalid parameters."); return -1; } read_globals_from_env(0); wrap_g_static_rec_mutex_lock(&global_params.lock); switch (param->type) { case OPENHPI_LOG_ON_SEV: global_params.log_on_sev = param->u.log_on_sev; break; case OPENHPI_EVT_QUEUE_LIMIT: global_params.evt_queue_limit = param->u.evt_queue_limit; break; case OPENHPI_DEL_SIZE_LIMIT: global_params.del_size_limit = param->u.del_size_limit; break; case OPENHPI_DEL_SAVE: global_params.del_save = param->u.del_save; break; case OPENHPI_DAT_SIZE_LIMIT: global_params.dat_size_limit = param->u.dat_size_limit; break; case OPENHPI_DAT_USER_LIMIT: global_params.dat_user_limit = param->u.dat_user_limit; break; case OPENHPI_DAT_SAVE: global_params.dat_save = param->u.dat_save; break; case OPENHPI_PATH: memset(global_params.path, 0, OH_PATH_PARAM_MAX_LENGTH); strncpy(global_params.path, param->u.path, OH_PATH_PARAM_MAX_LENGTH-1); break; case OPENHPI_VARPATH: memset(global_params.varpath, 0, OH_PATH_PARAM_MAX_LENGTH); strncpy(global_params.varpath, param->u.varpath, OH_PATH_PARAM_MAX_LENGTH-1); break; case OPENHPI_CONF: memset(global_params.conf, 0, OH_PATH_PARAM_MAX_LENGTH); strncpy(global_params.conf, param->u.conf, OH_PATH_PARAM_MAX_LENGTH-1); break; case OPENHPI_UNCONFIGURED: global_params.unconfigured = param->u.unconfigured; break; case OPENHPI_AUTOINSERT_TIMEOUT: global_params.ai_timeout = param->u.ai_timeout; break; case OPENHPI_AUTOINSERT_TIMEOUT_READONLY: global_params.ai_timeout_readonly = param->u.ai_timeout_readonly; break; default: wrap_g_static_rec_mutex_unlock(&global_params.lock); CRIT("Invalid global parameter %d!", param->type); return -2; } wrap_g_static_rec_mutex_unlock(&global_params.lock); return 0; } openhpi-3.6.1/openhpid/event.c0000644000175100017510000004406712575647301015273 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * (C) Copyright IBM Corp. 2003-2006 * (C) Copyright Pigeon Point Systems. 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Louis Zhuang * David Judkovics * Sean Dague * Renier Morales * Racing Guo * Anton Pak */ #include #include #include #include #include #include #include #include #include #include "alarm.h" #include "conf.h" #include "event.h" extern volatile int signal_stop; oh_evt_queue * oh_process_q = 0; /* * The following is required to set up the thread state for * the use of event async queues. This is true even if we aren't * using live threads. */ int oh_event_init() { DBG("Setting up event processing queue."); if (!oh_process_q) oh_process_q = g_async_queue_new(); if (oh_process_q) { DBG("Set up processing queue."); return 1; } else { CRIT("Failed to allocate processing queue."); return 0; } } int oh_event_finit(void) { if (oh_process_q) { g_async_queue_unref(oh_process_q); DBG("Processing queue is disposed."); } return 0; } static struct oh_event * make_quit_event(void) { static SaHpiUint8T signature[SAHPI_MAX_TEXT_BUFFER_LENGTH] = { 0x01, 0xE8, 0xEC, 0x84, 0xFE, 0x23, 0x41, 0x62, 0x82, 0xF8, 0xDC, 0x1A, 0x32, 0xD9, 0x24, 0x14, 0x6A, 0x5B, 0x92, 0x41, 0xE1, 0xE4, 0x49, 0x34, 0x89, 0x36, 0x5C, 0x94, 0xA9, 0x26, 0xBE, 0x70, 0x95, 0x12, 0x74, 0xA7, 0xAE, 0x99, 0x49, 0x93, 0x87, 0x57, 0xAF, 0xA5, 0x0A, 0xF6, 0x6A, 0x3C, 0xC3, 0x02, 0x83, 0x48, 0xAF, 0xCB, 0x49, 0x90, 0xA6, 0x5A, 0x1C, 0xDA, 0x6E, 0x56, 0x09, 0x32, 0x38, 0x61, 0x87, 0x52, 0x76, 0x98, 0x4A, 0x6C, 0x94, 0xEC, 0x67, 0xD2, 0xAE, 0xAB, 0x56, 0xC4, 0xA1, 0xFA, 0x65, 0x89, 0xBA, 0x2A, 0x4F, 0x6B, 0x84, 0x8F, 0xE0, 0x53, 0xF4, 0xF7, 0xD2, 0x50, 0x22, 0xFE, 0x68, 0xB6, 0x38, 0xDD, 0x4C, 0xA7, 0xB8, 0x17, 0xF8, 0xC8, 0x5C, 0xE3, 0x27, 0x26, 0x8E, 0x76, 0x0F, 0x7C, 0x45, 0x50, 0x40, 0xA8, 0x83, 0xE7, 0xCA, 0x73, 0x0C, 0x64, 0x19, 0x74, 0xFE, 0x92, 0x39, 0x2B, 0x23, 0xBD, 0x43, 0x05, 0xB1, 0xE6, 0xA8, 0x9D, 0x81, 0x01, 0x16, 0x5A, 0x05, 0x27, 0xEE, 0xBB, 0x08, 0xE1, 0x48, 0x9F, 0xBB, 0xD4, 0x90, 0xA9, 0x46, 0x85, 0xF0, 0x09, 0x68, 0x93, 0xAA, 0x6A, 0x62, 0xA4, 0x43, 0xCD, 0x8D, 0x80, 0x3B, 0x6C, 0x1A, 0xFF, 0xB3, 0xCD, 0x91, 0x09, 0x01, 0x4B, 0x9E, 0xFB, 0x43, 0x1D, 0x83, 0xB0, 0x5C, 0x39, 0x6D, 0x6E, 0xB1, 0xDA, 0xE0, 0x5D, 0x8D, 0x87, 0xF3, 0x01, 0x40, 0xC0, 0xA0, 0x83, 0xEC, 0x5B, 0x71, 0x40, 0xE9, 0x2D, 0x54, 0xC1, 0x9B, 0x23, 0x29, 0xFC, 0x4E, 0x64, 0xAA, 0x8C, 0xD3, 0x77, 0x8B, 0x19, 0xEC, 0xB8, 0xE2, 0xBE, 0xB9, 0x15, 0x28, 0x69, 0x46, 0x73, 0x90, 0xFE, 0xE9, 0x24, 0xE6, 0x74, 0xAF, 0x4A, 0x78, 0x7D, 0xC7, 0x44, 0x87, 0x51, 0x4A, 0x2C, 0x9E, 0x1B, 0xB1, 0x6C, 0x31, 0xEA, 0x40 }; struct oh_event * e = oh_new_event(); SaHpiEventT * he = &e->event; SaHpiHpiSwEventT * swe = &he->EventDataUnion.HpiSwEvent; SaHpiTextBufferT * data = &swe->EventData; SaHpiRptEntryT * rpte = &e->resource; e->hid = 0; he->Source = SAHPI_UNSPECIFIED_RESOURCE_ID; he->EventType = SAHPI_ET_HPI_SW; oh_gettimeofday(&he->Timestamp); he->Severity = SAHPI_CRITICAL; swe->MId = SAHPI_MANUFACTURER_ID_UNSPECIFIED; swe->Type = SAHPI_HPIE_OTHER; data->DataType = SAHPI_TL_TYPE_BINARY; data->Language = SAHPI_LANG_UNDEF; data->DataLength = sizeof(signature); memcpy( &data->Data[0], &signature, sizeof(signature) ); rpte->ResourceId = SAHPI_UNSPECIFIED_RESOURCE_ID; rpte->ResourceCapabilities = 0; e->rdrs = 0; e->rdrs_to_remove = 0; return e; } void oh_post_quit_event(void) { if (oh_process_q) { oh_evt_queue_push(oh_process_q, make_quit_event()); } } int oh_detect_quit_event(struct oh_event * e) { if (!e) { return ENOENT; } if (e->event.EventType != SAHPI_ET_HPI_SW) { return ENOENT; } if (e->event.EventDataUnion.HpiSwEvent.MId != 0) { return ENOENT; } struct oh_event * qe = make_quit_event(); qe->event.Timestamp = e->event.Timestamp; int cc = memcmp( e, qe, sizeof(struct oh_event) ); oh_event_free(qe, FALSE); if ( cc != 0 ) { return ENOENT; } return 0; } /* * Event processing is split up into 2 stages * 1. Harvesting of the events * 2. Processing of the events into: Domain Event Log, Alarm Table, * Session queues, Resource Precense Table. * */ static SaErrorT harvest_events_for_handler(struct oh_handler *h) { SaErrorT error = SA_OK; if (!h->hnd || !h->abi->get_event) return SA_OK; do { error = h->abi->get_event(h->hnd); if (error < 1) { DBG("Handler is out of Events"); } } while (error > 0); return SA_OK; } SaErrorT oh_harvest_events() { SaErrorT error = SA_ERR_HPI_ERROR; unsigned int hid = 0, next_hid; struct oh_handler *h = NULL; oh_getnext_handler_id(hid, &next_hid); while (next_hid) { DBG("harvesting for %d", next_hid); hid = next_hid; if(signal_stop == TRUE){ error = SA_OK; break; } h = oh_get_handler(hid); if (!h) { CRIT("No such handler %d", hid); break; } /* * Here we want to record an error unless there is * at least one harvest_events_for_handler that * finished with SA_OK. (RM 1/6/2005) */ if (harvest_events_for_handler(h) == SA_OK && error) error = SA_OK; oh_release_handler(h); oh_getnext_handler_id(hid, &next_hid); } return error; } static int oh_add_event_to_del(struct oh_domain *d, struct oh_event *e) { struct oh_global_param param = { .type = OPENHPI_LOG_ON_SEV }; char del_filepath[SAHPI_MAX_TEXT_BUFFER_LENGTH*2]; int error = 0; if (!d || !e) return -1; oh_get_global_param(¶m); /* Events get logged in DEL if they are of high enough severity */ if (e->event.EventType == SAHPI_ET_USER || e->event.Severity <= param.u.log_on_sev) { param.type = OPENHPI_DEL_SAVE; oh_get_global_param(¶m); SaHpiEventLogInfoT elinfo; SaHpiRdrT *rdr = (e->rdrs) ? (SaHpiRdrT *)e->rdrs->data : NULL; SaHpiRptEntryT *rpte = (e->resource.ResourceCapabilities) ? &e->resource : NULL; error = oh_el_info(d->del, &elinfo); if (error == SA_OK && elinfo.Enabled) { error = oh_el_append(d->del, &e->event, rdr, rpte); } if (param.u.del_save) { param.type = OPENHPI_VARPATH; oh_get_global_param(¶m); snprintf(del_filepath, SAHPI_MAX_TEXT_BUFFER_LENGTH*2, "%s/del.%u", param.u.varpath, d->id); oh_el_map_to_file(d->del, del_filepath); } } return error; } static int process_hpi_event(struct oh_domain *d, struct oh_event *e) { int i; GArray *sessions = NULL; SaHpiSessionIdT sid; SaHpiEventT *event = NULL; SaHpiRptEntryT *resource = NULL; SaHpiRdrT *rdr = NULL; if (!d || !e) return -1; event = &e->event; resource = &e->resource; rdr = (e->rdrs) ? (SaHpiRdrT *)e->rdrs->data : NULL; if (event->EventType == SAHPI_ET_USER) { resource->ResourceCapabilities = 0; if (rdr) rdr->RdrType = SAHPI_NO_RECORD; } oh_add_event_to_del(d, e); DBG("Added event to EL"); /* * Here is the SESSION MULTIPLEXING code */ sessions = oh_list_sessions(d->id); if (!sessions) { CRIT("Error: Got an empty session list on domain id %u", d->id); return -2; } DBG("Got session list for domain %u", d->id); /* Drop events if there are no sessions open to receive them. */ if (sessions->len < 1) { g_array_free(sessions, TRUE); DBG("No sessions open for event's domain %u. " "Dropping hpi_event", d->id); return 0; } /* multiplex event to the appropriate sessions */ for (i = 0; i < sessions->len; i++) { SaHpiBoolT is_subscribed = SAHPI_FALSE; #if defined(__sparc) || defined(__sparc__) sid = ((SaHpiSessionIdT *)((void *)(sessions->data)))[i]; #else sid = g_array_index(sessions, SaHpiSessionIdT, i); #endif oh_get_session_subscription(sid, &is_subscribed); if (is_subscribed) { oh_queue_session_event(sid, e); } } g_array_free(sessions, TRUE); DBG("done multiplexing event into sessions"); return 0; } static int process_resource_event(struct oh_domain *d, struct oh_event *e) { RPTable *rpt = NULL; SaHpiRptEntryT *exists = NULL; unsigned int *hidp = NULL; SaErrorT error = SA_OK; SaHpiBoolT process = TRUE; SaHpiBoolT update = FALSE; SaHpiBoolT remove = FALSE; if (!d || !e) { return -1; } rpt = &(d->rpt); exists = oh_get_resource_by_id(rpt, e->resource.ResourceId); switch ( e->event.EventDataUnion.ResourceEvent.ResourceEventType ) { case SAHPI_RESE_RESOURCE_FAILURE: case SAHPI_RESE_RESOURCE_INACCESSIBLE: if ( exists && exists->ResourceFailed ) { process = FALSE; } else { e->resource.ResourceFailed = SAHPI_TRUE; } break; case SAHPI_RESE_RESOURCE_RESTORED: if ( exists && exists->ResourceFailed ) { e->resource.ResourceFailed = SAHPI_FALSE; } else { process = FALSE; } break; case SAHPI_RESE_RESOURCE_ADDED: case SAHPI_RESE_RESOURCE_UPDATED: update = TRUE; break; case SAHPI_RESE_RESOURCE_REMOVED: remove = TRUE; process = ( exists != 0 ) ? TRUE : FALSE; break; default: // unknown resource event // do nothing CRIT("Got unknown resource event."); return -1; } if ( remove ) { if ( exists ) { oh_remove_resource(rpt, e->resource.ResourceId); } } else { hidp = g_new0(unsigned int, 1); *hidp = e->hid; error = oh_add_resource(rpt, &e->resource, hidp, FREE_RPT_DATA); if (error != SA_OK) { g_free( hidp ); CRIT("Cannot update resource."); return -1; } if ( update ) { GSList *node = NULL; for (node = e->rdrs_to_remove; node; node = node->next) { SaHpiRdrT *rdr = (SaHpiRdrT *)node->data; SaHpiInstrumentIdT instr_id = oh_get_instrument_id(rdr); SaHpiEntryIdT rdrid = oh_get_rdr_uid(rdr->RdrType, instr_id); oh_remove_rdr(rpt, e->resource.ResourceId, rdrid); } for (node = e->rdrs; node; node = node->next) { SaHpiRdrT *rdr = (SaHpiRdrT *)node->data; oh_add_rdr(rpt, e->resource.ResourceId, rdr, NULL, 0); } } } if ( process ) { process_hpi_event(d, e); } return 0; } static int process_hs_event(struct oh_domain *d, struct oh_event *e) { RPTable *rpt = NULL; SaHpiRptEntryT *exists = NULL; SaHpiHotSwapEventT * hse = NULL; unsigned int *hidp = NULL; SaErrorT error = SA_OK; if (!d || !e) { return -1; } rpt = &(d->rpt); exists = oh_get_resource_by_id(rpt, e->resource.ResourceId); hse = &e->event.EventDataUnion.HotSwapEvent; if (hse->HotSwapState == SAHPI_HS_STATE_NOT_PRESENT) { oh_remove_resource(rpt, e->resource.ResourceId); } else { hidp = g_new0(unsigned int, 1); *hidp = e->hid; error = oh_add_resource(rpt, &e->resource, hidp, FREE_RPT_DATA); if (error == SA_OK && !exists) { GSList *node = NULL; for (node = e->rdrs; node; node = node->next) { SaHpiRdrT *rdr = (SaHpiRdrT *)node->data; oh_add_rdr(rpt, e->resource.ResourceId, rdr, NULL, 0); } } } if (hse->HotSwapState != hse->PreviousHotSwapState) { process_hpi_event(d, e); } return 0; } static int process_event(SaHpiDomainIdT did, struct oh_event *e) { struct oh_domain *d = NULL; RPTable *rpt = NULL; if (!e) { CRIT("Got NULL event"); return -1; } d = oh_get_domain(did); if (!d) return -2; rpt = &(d->rpt); DBG("Processing event for domain %u", d->id); switch (e->event.EventType) { case SAHPI_ET_RESOURCE: if (!e->hid) { CRIT("Resource event with invalid handler id! Dropping."); break; } if ( e->resource.ResourceCapabilities == 0 ) { SaHpiRptEntryT * restored; restored = oh_get_resource_by_id(rpt, e->event.Source); if ( restored ) { e->resource = *restored; } } if (!(e->resource.ResourceCapabilities & SAHPI_CAPABILITY_RESOURCE)) { CRIT("Resource event with invalid capabilities. Dropping."); break; } else if ((e->resource.ResourceCapabilities & SAHPI_CAPABILITY_FRU) && (e->event.EventDataUnion.ResourceEvent.ResourceEventType == SAHPI_RESE_RESOURCE_ADDED)) { CRIT("Invalid event. Resource in resource added event " "has FRU capability. Dropping."); } else { process_resource_event(d, e); } break; case SAHPI_ET_HOTSWAP: if (!e->hid) { CRIT("Hotswap event with invalid handler id! Dropping."); break; } if ( e->resource.ResourceCapabilities == 0 ) { SaHpiRptEntryT * restored; restored = oh_get_resource_by_id(rpt, e->event.Source); if ( restored ) { e->resource = *restored; } } if (!(e->resource.ResourceCapabilities & SAHPI_CAPABILITY_RESOURCE)) { CRIT("Hotswap event with invalid capabilities. Dropping."); break; } else if (!(e->resource.ResourceCapabilities & SAHPI_CAPABILITY_FRU)) { CRIT("Invalid event. Resource in hotswap event " "has no FRU capability. Dropping."); } else { process_hs_event(d, e); } break; case SAHPI_ET_SENSOR: case SAHPI_ET_SENSOR_ENABLE_CHANGE: case SAHPI_ET_WATCHDOG: case SAHPI_ET_HPI_SW: case SAHPI_ET_OEM: case SAHPI_ET_DOMAIN: case SAHPI_ET_USER: case SAHPI_ET_DIMI: case SAHPI_ET_DIMI_UPDATE: case SAHPI_ET_FUMI: process_hpi_event(d, e); break; default: CRIT("Don't know what to do for event type %d", e->event.EventType); } oh_detect_event_alarm(d, e); oh_release_domain(d); return 0; } SaErrorT oh_process_events() { int cc; struct oh_event *e; while ((e = g_async_queue_pop(oh_process_q)) != NULL) { process_event(OH_DEFAULT_DOMAIN_ID, e); cc = oh_detect_quit_event(e); oh_event_free(e, FALSE); if (cc == 0) { break; } } return SA_OK; } openhpi-3.6.1/openhpid/init.h0000644000175100017510000000135112575647301015107 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004-2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * David M Jukdkovics * */ #ifndef __OH_INIT_H #define __OH_INIT_H #include #ifdef __cplusplus extern "C" { #endif int oh_init(void); int oh_finit(void); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* __OH_INIT_H */ openhpi-3.6.1/openhpid/t/0000755000175100017510000000000012605014532014222 5ustar mohanmohanopenhpi-3.6.1/openhpid/t/ohpi_tests.txt0000644000175100017510000000612612575647301017165 0ustar mohanmohanUnit Test plan for the OpenHPI API extensions --------------------------------------------- Notes: Tests described here are numbered so that they correspond to the program where they are implemented (e.g. ohpi_.c). **Positive Tests** (expect a good return code.) SaErrorT oHpiHandlerCreate(SaHpiSessionIdT sid, GHashTable *config, oHpiHandlerIdT *id): (007) Load 'libdummy' and 'libwatchdog', create two handlers on each. SaErrorT oHpiHandlerDestroy(SaHpiSessionIdT sid, oHpiHandlerIdT id): (008) Same as previous, but destroy handlers and unload plugin. SaErrorT oHpiHandlerInfo(SaHpiSessionIdT sid, oHpiHandlerIdT id, oHpiHandlerInfoT *info): (009) Load 'libdummy', create handler, get handler info and check for expected information. Destroy handler, unload plugin. SaErrorT oHpiHandlerGetNext(oHpiHandlerIdT id, oHpiHandlerIdT *next_id): (010) Load 'libdummy', create three handlers, iterate through them making sure they match with the expected values. Destroy handlers, unload plugin. SaErrorT oHpiGlobalParamGet(SaHpiSessionIdT sid, oHpiGlobalParam *param): (035) Set OPENHPI_CONF to valid file. Open session. Get parameter that was set through config file comparing with known value. SaErrorT oHpiGlobalParamSet(SaHpiSessionIdT sid, oHpiGlobalParam *param): (036) Set a paramter, get it, and compare values. Don't open a session. **Negative Tests** (expect a bad return code) SaErrorT oHpiHandlerCreate(SaHpiSessionIdT sid, GHashTable *config, oHpiHandlerIdT *id): (024) Pass null as arguments (for each argument). (025) Create handler for plugin that doesn't have a "plugin" key. (026) Create handler for non-existant plugin. SaErrorT oHpiHandlerDestroy(SaHpiSessionIdT sid, oHpiHandlerIdT id): (027) Pass null as argument. (028) Destroy bogus handler. (029) Destroy handler twice. SaErrorT oHpiHandlerInfo(SaHpiSessionIdT sid, oHpiHandlerIdT id, oHpiHandlerInfoT *info): (030) Pass null as argument. (031) Pass bogus handler id. SaErrorT oHpiHandlerGetNext(SaHpiSessionIdT sid, oHpiHandlerIdT id, oHpiHandlerIdT *next_id): (032) Pass null as arguments (for each argument). (033) Get next bogus handler. (034) Create three handlers, destroy one, and get next that one. SaErrorT oHpiGlobalParamGet(SaHpiSessionIdT sid, oHpiGlobalParam *param): (037) Pass null as arguments. (038) Get bogus parameter. SaErrorT oHpiGlobalParamSet(SaHpiSessionIdT sid, oHpiGlobalParam *param): (039) Pass null as arguments. openhpi-3.6.1/openhpid/t/Makefile.am0000644000175100017510000000100312575647301016264 0ustar mohanmohan# (C) Copyright IBM Corp 2003, 2004 # All rights reserved. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. MAINTAINERCLEANFILES = Makefile.in EXTRA_DIST = ohpi_tests.txt SUBDIRS = ohpi openhpi-3.6.1/openhpid/t/ohpi/0000755000175100017510000000000012605014532015161 5ustar mohanmohanopenhpi-3.6.1/openhpid/t/ohpi/ohpi_007.c0000644000175100017510000000476712575647301016704 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include /** * Load 'libsimulator' and 'libwatchdog', create two handlers on each. * Pass on success, otherwise failure. **/ #define PLUGIN_NAME_SIZE 32 int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; oHpiHandlerIdT hid0, hid1, hid2, hid3; GHashTable *h0 = g_hash_table_new(g_str_hash, g_str_equal), *h1 = g_hash_table_new(g_str_hash, g_str_equal), *h2 = g_hash_table_new(g_str_hash, g_str_equal), *h3 = g_hash_table_new(g_str_hash, g_str_equal); setenv("OPENHPI_CONF","./noconfig", 1); if (saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL)) return -1; /* Set configuration for handlers and create them. */ g_hash_table_insert(h0, "plugin", "libsimulator"); g_hash_table_insert(h0, "entity_root", "{SYSTEM_CHASSIS,1}"); g_hash_table_insert(h0, "name", "test0"); g_hash_table_insert(h0, "addr", "0"); g_hash_table_insert(h1, "plugin", "libsimulator"); g_hash_table_insert(h1, "entity_root", "{SYSTEM_CHASSIS,2}"); g_hash_table_insert(h1, "name", "test1"); g_hash_table_insert(h1, "addr", "1"); /* Set configuration for two handlers and create them. */ g_hash_table_insert(h2, "plugin", "libwatchdog"); g_hash_table_insert(h2, "entity_root", "{SYSTEM_CHASSIS,3}"); g_hash_table_insert(h2, "addr", "0"); g_hash_table_insert(h3, "plugin", "libwatchdog"); g_hash_table_insert(h3, "entity_root", "{SYSTEM_CHASSIS,4}"); g_hash_table_insert(h3, "addr", "1"); if (oHpiHandlerCreate(sid, h0,&hid0) || oHpiHandlerCreate(sid, h1,&hid1)) return -1; if (oHpiHandlerCreate(sid, h2,&hid2) || oHpiHandlerCreate(sid, h3,&hid3)) return -1; return 0; } openhpi-3.6.1/openhpid/t/ohpi/ohpi_024.c0000644000175100017510000000174512575647301016674 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include /** * Create handler, passing NULL for each argument. * Pass on error, otherwise test failed. **/ int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; setenv("OPENHPI_CONF","./noconfig", 1); if (saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL)) return -1; if (!oHpiHandlerCreate(sid, NULL, NULL)) return -1; return 0; } openhpi-3.6.1/openhpid/t/ohpi/openhpi.conf0000644000175100017510000000003612575647301017505 0ustar mohanmohanOPENHPI_LOG_ON_SEV = "MAJOR" openhpi-3.6.1/openhpid/t/ohpi/ohpi_032.c0000644000175100017510000000416212575647301016667 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include /** * Call oHpiHandlerGetNext passing NULL as arguments. * Pass on error, otherwise test failed. **/ int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; GHashTable *h0 = g_hash_table_new(g_str_hash, g_str_equal), *h1 = g_hash_table_new(g_str_hash, g_str_equal), *h2 = g_hash_table_new(g_str_hash, g_str_equal); oHpiHandlerIdT hid0 = 0, hid1 = 0, hid2 = 0; setenv("OPENHPI_CONF","./noconfig", 1); if (saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL)) return -1; /* Set configuration. */ g_hash_table_insert(h0, "plugin", "libsimulator"); g_hash_table_insert(h0, "entity_root", "{SYSTEM_CHASSIS,1}"); g_hash_table_insert(h0, "name", "test"); g_hash_table_insert(h0, "addr", "0"); g_hash_table_insert(h1, "plugin", "libwatchdog"); g_hash_table_insert(h1, "entity_root", "{SYSTEM_CHASSIS,2}"); g_hash_table_insert(h1, "addr", "0"); g_hash_table_insert(h2, "plugin", "libsimulator"); g_hash_table_insert(h2, "entity_root", "{SYSTEM_CHASSIS,3}"); g_hash_table_insert(h2, "name", "test"); g_hash_table_insert(h2, "addr", "0"); if (oHpiHandlerCreate(sid, h0, &hid0) || oHpiHandlerCreate(sid, h1, &hid1) || oHpiHandlerCreate(sid, h2, &hid2)) return -1; if (!oHpiHandlerGetNext(sid, 0, NULL)) return -1; return 0; } openhpi-3.6.1/openhpid/t/ohpi/ohpi_029.c0000644000175100017510000000303112575647301016667 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include /** * Destroy a handler twice expecting an error the second time. * Pass on error, otherwise test failed. **/ int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; GHashTable *config = g_hash_table_new(g_str_hash, g_str_equal); oHpiHandlerIdT hid = 0; setenv("OPENHPI_CONF","./noconfig", 1); if (saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL)) return -1; /* Set configuration. */ g_hash_table_insert(config, "plugin", "libsimulator"); g_hash_table_insert(config, "entity_root", "{SYSTEM_CHASSIS,1}"); g_hash_table_insert(config, "name", "test"); g_hash_table_insert(config, "addr", "0"); if (oHpiHandlerCreate(sid, config, &hid)) return -1; if (oHpiHandlerDestroy(sid, hid)) return -1; if (!oHpiHandlerDestroy(sid, hid)) return -1; return 0; } openhpi-3.6.1/openhpid/t/ohpi/ohpi_039.c0000644000175100017510000000201712575647301016673 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include /** * Pass null arguments to oHpiGlobalParamSet * Pass on error, otherwise test failed. **/ int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; /* Unset config file env variable */ setenv("OPENHPI_CONF","./noconfig", 1); if (saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL)) return -1; if (!oHpiGlobalParamSet(sid, NULL)) return -1; return 0; } openhpi-3.6.1/openhpid/t/ohpi/ohpi_027.c0000644000175100017510000000270412575647301016673 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include /** * Destroy a handler, passing NULL for arguments. * Pass on error, otherwise test failed. **/ int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; GHashTable *config = g_hash_table_new(g_str_hash, g_str_equal); oHpiHandlerIdT hid = 0; setenv("OPENHPI_CONF","./noconfig", 1); if (saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL)) return -1; /* Set configuration. */ g_hash_table_insert(config, "plugin", "libsimulator"); g_hash_table_insert(config, "entity_root", "{SYSTEM_CHASSIS,1}"); g_hash_table_insert(config, "name", "test"); g_hash_table_insert(config, "addr", "0"); if (oHpiHandlerCreate(sid, config, &hid)) return -1; if (!oHpiHandlerDestroy(sid, 0)) return -1; return 0; } openhpi-3.6.1/openhpid/t/ohpi/Makefile.am0000644000175100017510000000721112575647301017232 0ustar mohanmohan# (C) Copyright IBM Corp 2004 # All rights reserved. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. MAINTAINERCLEANFILES = Makefile.in MOSTLYCLEANFILES = @TEST_CLEAN@ uid_map EXTRA_DIST = openhpi.conf AM_CPPFLAGS = -DG_LOG_DOMAIN=\"t\" AM_CPPFLAGS += @OPENHPI_INCLUDES@ TDEPLIB = $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/utils/libopenhpiutils.la TESTS_ENVIRONMENT = OPENHPI_PATH=$(top_builddir)/plugins/simulator:$(top_builddir)/plugins/watchdog TESTS_ENVIRONMENT += OPENHPI_UID_MAP=$(top_builddir)/openhpid/t/ohpi/uid_map TESTS_ENVIRONMENT += OPENHPI_CONF=$(top_srcdir)/openhpid/t/ohpi/openhpi.conf TESTS_ENVIRONMENT += LD_LIBRARY_PATH=$(top_srcdir)/openhpid/.libs:$(top_srcdir)/ssl/.libs:$(top_srcdir)/utils/.libs TESTS = \ setup_conf \ ohpi_007 \ ohpi_008 \ ohpi_009 \ ohpi_010 \ ohpi_024 \ ohpi_025 \ ohpi_026 \ ohpi_027 \ ohpi_028 \ ohpi_029 \ ohpi_030 \ ohpi_031 \ ohpi_032 \ ohpi_033 \ ohpi_034 \ ohpi_035 \ ohpi_036 \ ohpi_037 \ ohpi_038 \ ohpi_039 \ ohpi_version \ hpiinjector check_PROGRAMS = $(TESTS) setup_conf_SOURCES = setup_conf.c ohpi_007_SOURCES = ohpi_007.c ohpi_007_LDADD = $(TDEPLIB) ohpi_007_LDFLAGS = -export-dynamic ohpi_008_SOURCES = ohpi_008.c ohpi_008_LDADD = $(TDEPLIB) ohpi_008_LDFLAGS = -export-dynamic ohpi_009_SOURCES = ohpi_009.c ohpi_009_LDADD = $(TDEPLIB) ohpi_009_LDFLAGS = -export-dynamic ohpi_010_SOURCES = ohpi_010.c ohpi_010_LDADD = $(TDEPLIB) ohpi_010_LDFLAGS = -export-dynamic ohpi_024_SOURCES = ohpi_024.c ohpi_024_LDADD = $(TDEPLIB) ohpi_024_LDFLAGS = -export-dynamic ohpi_025_SOURCES = ohpi_025.c ohpi_025_LDADD = $(TDEPLIB) ohpi_025_LDFLAGS = -export-dynamic ohpi_026_SOURCES = ohpi_026.c ohpi_026_LDADD = $(TDEPLIB) ohpi_026_LDFLAGS = -export-dynamic ohpi_027_SOURCES = ohpi_027.c ohpi_027_LDADD = $(TDEPLIB) ohpi_027_LDFLAGS = -export-dynamic ohpi_028_SOURCES = ohpi_028.c ohpi_028_LDADD = $(TDEPLIB) ohpi_028_LDFLAGS = -export-dynamic ohpi_029_SOURCES = ohpi_029.c ohpi_029_LDADD = $(TDEPLIB) ohpi_029_LDFLAGS = -export-dynamic ohpi_030_SOURCES = ohpi_030.c ohpi_030_LDADD = $(TDEPLIB) ohpi_030_LDFLAGS = -export-dynamic ohpi_031_SOURCES = ohpi_031.c ohpi_031_LDADD = $(TDEPLIB) ohpi_031_LDFLAGS = -export-dynamic ohpi_032_SOURCES = ohpi_032.c ohpi_032_LDADD = $(TDEPLIB) ohpi_032_LDFLAGS = -export-dynamic ohpi_033_SOURCES = ohpi_033.c ohpi_033_LDADD = $(TDEPLIB) ohpi_033_LDFLAGS = -export-dynamic ohpi_034_SOURCES = ohpi_034.c ohpi_034_LDADD = $(TDEPLIB) ohpi_034_LDFLAGS = -export-dynamic ohpi_035_SOURCES = ohpi_035.c ohpi_035_LDADD = $(TDEPLIB) ohpi_035_LDFLAGS = -export-dynamic ohpi_036_SOURCES = ohpi_036.c ohpi_036_LDADD = $(TDEPLIB) ohpi_036_LDFLAGS = -export-dynamic ohpi_037_SOURCES = ohpi_037.c ohpi_037_LDADD = $(TDEPLIB) ohpi_037_LDFLAGS = -export-dynamic ohpi_038_SOURCES = ohpi_038.c ohpi_038_LDADD = $(TDEPLIB) ohpi_038_LDFLAGS = -export-dynamic ohpi_039_SOURCES = ohpi_039.c ohpi_039_LDADD = $(TDEPLIB) ohpi_039_LDFLAGS = -export-dynamic ohpi_version_SOURCES = ohpi_version.c ohpi_version_LDADD = $(TDEPLIB) ohpi_version_LDFLAGS = -export-dynamic hpiinjector_SOURCES = hpiinjector.c hpiinjector_LDADD = $(TDEPLIB) hpiinjector_LDFLAGS = -export-dynamic openhpi-3.6.1/openhpid/t/ohpi/ohpi_036.c0000644000175100017510000000267112575647301016676 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include /** * Set a paramter, get it, and compare values. * Tests without opening a session to see if the global * parameter table is initialized correctly anyway. * Pass on success, otherwise a failure. **/ int main(int argc, char **argv) { /* Unset config file env variable * oHpiGlobalParamT path_param = { .Type = OHPI_PATH, .u.Path = "/mylibdir" }; This test doesn't make sense anymore setenv("OPENHPI_CONF","./noconfig", 1); if (oHpiGlobalParamSet(sid, &path_param)) return -1; memset(path_param.u.Path, 0, SAHPI_MAX_TEXT_BUFFER_LENGTH); if (oHpiGlobalParamGet(sid, &path_param)) return -1; if (strcmp("/mylibdir", path_param.u.Path)) return -1;*/ return 0; } openhpi-3.6.1/openhpid/t/ohpi/ohpi_034.c0000644000175100017510000000451612575647301016674 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include /** * Create three handlers, destroy one, and get next that one. * Pass on error, otherwise test failed. **/ int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; GHashTable *h0 = g_hash_table_new(g_str_hash, g_str_equal), *h1 = g_hash_table_new(g_str_hash, g_str_equal), *h2 = g_hash_table_new(g_str_hash, g_str_equal); oHpiHandlerIdT hid0 = 0, hid1 = 0, hid2 = 0, next_id = 0; setenv("OPENHPI_CONF","./noconfig", 1); if (saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL)) return -1; /* Set configuration. */ g_hash_table_insert(h0, "plugin", "libsimulator"); g_hash_table_insert(h0, "entity_root", "{SYSTEM_CHASSIS,1}"); g_hash_table_insert(h0, "name", "test"); g_hash_table_insert(h0, "addr", "0"); g_hash_table_insert(h1, "plugin", "libwatchdog"); g_hash_table_insert(h1, "entity_root", "{SYSTEM_CHASSIS,2}"); g_hash_table_insert(h1, "addr", "0"); g_hash_table_insert(h2, "plugin", "libsimulator"); g_hash_table_insert(h2, "entity_root", "{SYSTEM_CHASSIS,3}"); g_hash_table_insert(h2, "name", "test"); g_hash_table_insert(h2, "addr", "0"); if (oHpiHandlerCreate(sid, h0, &hid0) || oHpiHandlerCreate(sid, h1, &hid1) || oHpiHandlerCreate(sid, h2, &hid2)) return -1; if (oHpiHandlerDestroy(sid, hid1)) return -1; if (oHpiHandlerGetNext(sid, hid0, &next_id) && next_id == 3) return -1; if (!oHpiHandlerGetNext(sid, hid1, &next_id)) return -1; return 0; } openhpi-3.6.1/openhpid/t/ohpi/ohpi_037.c0000644000175100017510000000204512575647301016672 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include /** * Pass null arguments to oHpiGlobalParamGet * Pass on error, otherwise test failed. **/ int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; /* Set config file env variable */ setenv("OPENHPI_CONF","./openhpi.conf", 1); if (saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL)) return -1; if (!oHpiGlobalParamGet(sid, NULL)) return -1; return 0; } openhpi-3.6.1/openhpid/t/ohpi/ohpi_010.c0000644000175100017510000000531112575647301016660 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include /** * Load 'libsimulator', create three handlers, iterate through them * making sure they match with the expected values. * Destroy handlers, unload plugin. * Pass on success, otherwise failure. **/ int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; GHashTable *h0 = g_hash_table_new(g_str_hash, g_str_equal), *h1 = g_hash_table_new(g_str_hash, g_str_equal), *h2 = g_hash_table_new(g_str_hash, g_str_equal); oHpiHandlerIdT hid0 = 0, hid1 = 0, hid2 = 0, next_id = 0; setenv("OPENHPI_CONF","./noconfig", 1); if (saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL)) return -1; /* Set configuration. */ g_hash_table_insert(h0, "plugin", "libsimulator"); g_hash_table_insert(h0, "entity_root", "{SYSTEM_CHASSIS,1}"); g_hash_table_insert(h0, "name", "test"); g_hash_table_insert(h0, "addr", "0"); g_hash_table_insert(h1, "plugin", "libwatchdog"); g_hash_table_insert(h1, "entity_root", "{SYSTEM_CHASSIS,2}"); g_hash_table_insert(h1, "addr", "0"); g_hash_table_insert(h2, "plugin", "libsimulator"); g_hash_table_insert(h2, "entity_root", "{SYSTEM_CHASSIS,3}"); g_hash_table_insert(h2, "name", "test"); g_hash_table_insert(h2, "addr", "0"); if (oHpiHandlerCreate(sid, h0, &hid0) || oHpiHandlerCreate(sid, h1, &hid1) || oHpiHandlerCreate(sid, h2, &hid2)) return -1; if (oHpiHandlerGetNext(sid, 0, &next_id) || next_id != 1) return -1; if (oHpiHandlerGetNext(sid, 1, &next_id) || next_id != 2) return -1; if (oHpiHandlerGetNext(sid, 2, &next_id) || next_id != 3) return -1; if (!oHpiHandlerGetNext(sid, 3, &next_id)) return -1; if (oHpiHandlerDestroy(sid, hid0) || oHpiHandlerDestroy(sid, hid1) || oHpiHandlerDestroy(sid, hid2)) return -1; return 0; } openhpi-3.6.1/openhpid/t/ohpi/ohpi_038.c0000644000175100017510000000232212575647301016671 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include /** * Pass bogus argument to oHpiGlobalParamGet * Pass on error, otherwise test failed. **/ int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; oHpiGlobalParamT bogus_param = { .Type = 0 }; /* Set config file env variable */ setenv("OPENHPI_CONF","./openhpi.conf", 1); if (saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL)) return -1; if (!oHpiGlobalParamGet(sid, &bogus_param)) return -1; bogus_param.Type = 255; if (!oHpiGlobalParamGet(sid, &bogus_param)) return -1; return 0; } openhpi-3.6.1/openhpid/t/ohpi/ohpi_033.c0000644000175100017510000000421012575647301016662 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include /** * Call oHpiHandlerGetNext passing bogus handler id as argument. * Pass on error, otherwise test failed. **/ int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; GHashTable *h0 = g_hash_table_new(g_str_hash, g_str_equal), *h1 = g_hash_table_new(g_str_hash, g_str_equal), *h2 = g_hash_table_new(g_str_hash, g_str_equal); oHpiHandlerIdT hid0 = 0, hid1 = 0, hid2 = 0, next_id = 0; setenv("OPENHPI_CONF","./noconfig", 1); if (saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL)) return -1; /* Set configuration. */ g_hash_table_insert(h0, "plugin", "libsimulator"); g_hash_table_insert(h0, "entity_root", "{SYSTEM_CHASSIS,1}"); g_hash_table_insert(h0, "name", "test"); g_hash_table_insert(h0, "addr", "0"); g_hash_table_insert(h1, "plugin", "libwatchdog"); g_hash_table_insert(h1, "entity_root", "{SYSTEM_CHASSIS,2}"); g_hash_table_insert(h1, "addr", "0"); g_hash_table_insert(h2, "plugin", "libsimulator"); g_hash_table_insert(h2, "entity_root", "{SYSTEM_CHASSIS,3}"); g_hash_table_insert(h2, "name", "test"); g_hash_table_insert(h2, "addr", "0"); if (oHpiHandlerCreate(sid, h0, &hid0) || oHpiHandlerCreate(sid, h1, &hid1) || oHpiHandlerCreate(sid, h2, &hid2)) return -1; if (!oHpiHandlerGetNext(sid, 555, &next_id)) return -1; return 0; } openhpi-3.6.1/openhpid/t/ohpi/hpiinjector.c0000644000175100017510000001231512575647301017661 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * (C) Copyright IBM Corp. 2004,2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Peter D. Phan * Tariq Shureih * David Judkovics * Renier Morales * * * Changes: * 11/03/2004 kouzmich Fixed Bug #1057934 * djudkovi Copied from hpifru.c and modified for general use * 11/30/2006 renierm Suppressed unneeded output from test * */ #include #include #include #include #include #include #include #include #define TOKEN "Hello America" #define all_resources 255 /* * Globals for this driver */ char progver[] = "0.2 HPI-B"; char progname[] = "hpiinjector"; int fdebug = 0; int f_listall = 0; int f_rpt = 0; int f_sensor = 0; int f_inv = 0; int f_ctrl = 0; int f_rdr = 0; int f_wdog = 0; int f_ann = 0; int f_overview = 0; /* * Main */ int main(int argc, char **argv) { SaErrorT rv = SA_OK; SaHpiVersionT hpiVer; SaHpiSessionIdT sessionid; oHpiHandlerIdT handlerid = 1; //TODO: Use oHpiHandlerFind to find right handler SaHpiResourceIdT resourceid = all_resources; int c; while ( (c = getopt( argc, argv,"adrsoiwcn:x?")) != EOF ) { //TODO: Domains switch(c) { case 'a': f_listall = 1; break; case 'c': f_ctrl = 1; break; case 'd': f_rdr = 1; break; case 'i': f_inv = 1; break; case 'r': f_rpt = 1; break; case 's': f_sensor = 1; break; case 'w': f_wdog = 1; break; case 'o': f_overview = 1; break; case 'n': if (optarg) resourceid = atoi(optarg); else resourceid = all_resources; break; case 'x': fdebug = 1; break; default: printf("\n\tUsage: %s [-option]\n\n", progname); printf("\t (No Option) Display all rpts and rdrs\n"); printf("\t -a Display all rpts and rdrs\n"); printf("\t -c Display only controls\n"); printf("\t -d Display rdr records\n"); printf("\t -i Display only inventories\n"); printf("\t -o Display system overview: rpt & rdr headers\n"); printf("\t -r Display only rpts\n"); printf("\t -s Display only sensors\n"); printf("\t -w Display only watchdog\n"); printf("\t -n Select particular resource id to display\n"); printf("\t (Used with [-cdirs] options)\n"); printf("\t -x Display debug messages\n"); printf("\n\n\n\n"); exit(1); } } if (argc == 1) f_listall = 1; /* * House keeping: * -- get (check?) hpi implementation version * -- open hpi session */ if (fdebug) printf("saHpiVersionGet\n"); hpiVer = saHpiVersionGet(); if (fdebug) printf("saHpiSessionOpen\n"); rv = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID,&sessionid,NULL); if (rv != SA_OK) { printf("saHpiSessionOpen returns %s\n",oh_lookup_error(rv)); exit(-1); } if (fdebug) printf("saHpiSessionOpen returns with SessionId %d\n", sessionid); /* * Resource discovery */ if (fdebug) printf("saHpiDiscover\n"); rv = saHpiDiscover(sessionid); if (rv != SA_OK) { printf("saHpiDiscover returns %s\n",oh_lookup_error(rv)); exit(-1); } SaHpiEventT event; SaHpiRptEntryT rpte; // oHpiRdrArrayT rdrs; memset(&event, 0, sizeof(SaHpiEventT)); memset(&rpte, 0, sizeof(SaHpiRptEntryT)); // memset(&rdrs, 0, sizeof(oHpiRdrArrayT)); SaHpiRdrT rdr; memset(&rdr, 0, sizeof(SaHpiRdrT)); rdr.RecordId = 333; rdr.RdrType = SAHPI_WATCHDOG_RDR; int n = 0; for(n = 0; n < SAHPI_MAX_ENTITY_PATH; n++) { rdr.Entity.Entry[n].EntityLocation = 6; rdr.Entity.Entry[n].EntityType = SAHPI_ENT_ADD_IN_CARD; } rdr.IsFru = FALSE; rdr.RdrTypeUnion.WatchdogRec.Oem = 777; rdr.RdrTypeUnion.WatchdogRec.WatchdogNum = 888; rdr.IdString.DataType = SAHPI_TL_TYPE_TEXT; rdr.IdString.Language = SAHPI_LANG_ENGLISH; memcpy(rdr.IdString.Data, TOKEN, sizeof(TOKEN)); rdr.IdString.Data[254] = (unsigned char)10; rdr.IdString.DataLength = sizeof(TOKEN); // int i = 0; // for(i = 0; i < MAX_RDR_ARRAY_LENGTH; i++) { // rdrs.Entry[i] = rdr; // } event.EventType=SAHPI_ET_HOTSWAP; event.Severity=SAHPI_CRITICAL; event.Source = 666; event.Timestamp=SAHPI_TIME_UNSPECIFIED; event.EventDataUnion.HotSwapEvent.HotSwapState=SAHPI_HS_STATE_EXTRACTION_PENDING; event.EventDataUnion.HotSwapEvent.PreviousHotSwapState=SAHPI_HS_STATE_ACTIVE; rv = oHpiInjectEvent(sessionid, handlerid, &event, &rpte, &rdr); rv = saHpiSessionClose(sessionid); exit(0); } /* end hpiinjector.c */ openhpi-3.6.1/openhpid/t/ohpi/ohpi_028.c0000644000175100017510000000267312575647301016701 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include /** * Destroy a bogus non-existent handler. * Pass on error, otherwise test failed. **/ int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; GHashTable *config = g_hash_table_new(g_str_hash, g_str_equal); oHpiHandlerIdT hid = 0; setenv("OPENHPI_CONF","./noconfig", 1); if (saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL)) return -1; /* Set configuration. */ g_hash_table_insert(config, "plugin", "libsimulator"); g_hash_table_insert(config, "entity_root", "{SYSTEM_CHASSIS,1}"); g_hash_table_insert(config, "name", "test"); g_hash_table_insert(config, "addr", "0"); if (oHpiHandlerCreate(sid, config, &hid)) return -1; if (!oHpiHandlerDestroy(sid, 5)) return -1; return 0; } openhpi-3.6.1/openhpid/t/ohpi/ohpi_035.c0000644000175100017510000000241112575647301016665 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * Set OPENHPI_CONF to valid file. Open session. Get parameter * that was set through config file comparing with known value. * Pass on success, otherwise a failure. **/ int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; oHpiGlobalParamT param = { .Type = OHPI_LOG_ON_SEV }; if (saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL)) { printf("Could not open session\n"); return -1; } if (oHpiGlobalParamGet(sid, ¶m)) { printf("Could not get parameter\n"); return -1; } if (param.u.LogOnSev != SAHPI_MAJOR) return -1; return 0; } openhpi-3.6.1/openhpid/t/ohpi/ohpi_030.c0000644000175100017510000000273712575647301016673 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include /** * Call oHpiHandlerInfo using NULL as arguments. * Pass on error, otherwise test failed. **/ int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; GHashTable *config = g_hash_table_new(g_str_hash, g_str_equal); oHpiHandlerIdT hid = 0; setenv("OPENHPI_CONF","./noconfig", 1); if (saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL)) return -1; /* Set configuration. */ g_hash_table_insert(config, "plugin", "libsimulator"); g_hash_table_insert(config, "entity_root", "{SYSTEM_CHASSIS,1}"); g_hash_table_insert(config, "name", "test"); g_hash_table_insert(config, "addr", "0"); if (oHpiHandlerCreate(sid, config, &hid)) return -1; if (!oHpiHandlerInfo(sid, 0, NULL, NULL)) return -1; return 0; } openhpi-3.6.1/openhpid/t/ohpi/ohpi_009.c0000644000175100017510000000362112575647301016672 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include /** * Load 'libsimulator', create handler, get handler info and check for * expected information. Destroy handler, unload plugin. * Pass on success, otherwise failure. **/ int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; GHashTable *config = g_hash_table_new(g_str_hash, g_str_equal); oHpiHandlerIdT hid = 0; oHpiHandlerInfoT hinfo; GHashTable *configinfo = g_hash_table_new_full( g_str_hash, g_str_equal, g_free, g_free );; setenv("OPENHPI_CONF","./noconfig", 1); if (saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL)) return -1; /* Set configuration. */ g_hash_table_insert(config, "plugin", "libsimulator"); g_hash_table_insert(config, "entity_root", "{SYSTEM_CHASSIS,1}"); g_hash_table_insert(config, "name", "test"); g_hash_table_insert(config, "addr", "0"); if (oHpiHandlerCreate(sid, config, &hid)) return -1; if (oHpiHandlerInfo(sid, hid, &hinfo, configinfo)) return -1; if (strcmp("libsimulator",hinfo.plugin_name)) return -1; if (oHpiHandlerDestroy(sid, hid)) return -1; return 0; } openhpi-3.6.1/openhpid/t/ohpi/ohpi_025.c0000644000175100017510000000253012575647301016666 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include /** * Create handler for plugin, with a configuration lacking a plugin key. * Pass on error, otherwise test failed. **/ int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; GHashTable *config = g_hash_table_new(g_str_hash, g_str_equal); oHpiHandlerIdT hid = 0; setenv("OPENHPI_CONF","./noconfig", 1); if (saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL)) return -1; /* Set configuration. */ g_hash_table_insert(config, "entity_root", "{SYSTEM_CHASSIS,1}"); g_hash_table_insert(config, "name", "test"); g_hash_table_insert(config, "addr", "0"); if (!oHpiHandlerCreate(sid, config, &hid)) return -1; return 0; } openhpi-3.6.1/openhpid/t/ohpi/ohpi_031.c0000644000175100017510000000305212575647301016663 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include /** * Try to get handler info passing a bogus handler id. * Pass on success, otherwise failure. **/ int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; GHashTable *config = g_hash_table_new(g_str_hash, g_str_equal); oHpiHandlerIdT hid = 0; oHpiHandlerInfoT hinfo; GHashTable *configinfo = 0; setenv("OPENHPI_CONF","./noconfig", 1); if (saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL)) return -1; /* Set configuration. */ g_hash_table_insert(config, "plugin", "libsimulator"); g_hash_table_insert(config, "entity_root", "{SYSTEM_CHASSIS,1}"); g_hash_table_insert(config, "name", "test"); g_hash_table_insert(config, "addr", "0"); if (oHpiHandlerCreate(sid, config, &hid)) return -1; if (!oHpiHandlerInfo(sid, 555, &hinfo, configinfo)) return -1; return 0; } openhpi-3.6.1/openhpid/t/ohpi/ohpi_version.c0000644000175100017510000000226312575647301020050 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include #include /** * Load the simulator plugin. * Pass on success, otherwise a failure. **/ int main(int argc, char **argv) { SaHpiUint64T v = 0; char * buf = g_malloc(100); char * version = VERSION ".0"; setenv("OPENHPI_CONF","./noconfig", 1); v = oHpiVersionGet(); snprintf(buf,100,"%llu.%llu.%llu.%llu", (v >> 48), ((v >> 32) & 0x0000ffff), // my gcc barfed unless it did this ((v & 0x00000000ffffffff) >> 16), (v & 0x000000000000ffff)); if(strcmp(buf,version) == 0) { return 0; } return -1; } openhpi-3.6.1/openhpid/t/ohpi/setup_conf.c0000644000175100017510000000562312575647301017514 0ustar mohanmohan/* * Copyright (C) 2013, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Mohanasundaram Devarajulu (mohanasundaram.devarajulu@hp.com) * */ #include #include #include #include #include #include #include #include #include #include #include /** * openhpi.conf in this directory needs to have 600 or 400 permissions * SVN does not allow to remove read permissions, so set it up now **/ int main(int argc, char **argv) { struct stat fst; char filename[30] = "./openhpi.conf"; char modestr[] = "0600"; int mode = 0; mode = strtol(modestr, 0 ,8); if (stat (filename, &fst) == -1) { printf("stat of %s failed. Error is %s \n", filename, strerror(errno)); if (errno == ENOENT) { #ifdef OPENHPI_CONF if(stat (OPENHPI_CONF, &fst) == -1) { printf("stat of %s failed. Quitingi. \n", OPENHPI_CONF); if (errno == ENOENT) return 0; else return -1; } if (chmod(filename,mode) < 0) { printf("chmod (%s, %s) failed as %s\n", filename, modestr, strerror(errno)); return -1; } #endif return 0; } else return -1; } if (chmod(filename,mode) < 0) { printf("chmod (%s, %s) failed with %d(%s)\n", filename, modestr, errno, strerror(errno)); return -1; } return 0; } openhpi-3.6.1/openhpid/t/ohpi/ohpi_026.c0000644000175100017510000000260612575647301016673 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include /** * Create handler for non-existant plugin. * Pass on error, otherwise test failed. **/ int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; GHashTable *config = g_hash_table_new(g_str_hash, g_str_equal); oHpiHandlerIdT hid = 0; setenv("OPENHPI_CONF","./noconfig", 1); if (saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL)) return -1; /* Set configuration. */ g_hash_table_insert(config, "plugin", "libnoplugin"); g_hash_table_insert(config, "entity_root", "{SYSTEM_CHASSIS,1}"); g_hash_table_insert(config, "name", "test"); g_hash_table_insert(config, "addr", "0"); if (!oHpiHandlerCreate(sid, config, &hid)) return -1; return 0; } openhpi-3.6.1/openhpid/t/ohpi/ohpi_008.c0000644000175100017510000000533312575647301016673 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include /** * Load 'libsimulator' and 'libwatchdog', create two handlers on each. * Destroy handlers and unload plugin. * Pass on success, otherwise failure. **/ #define PLUGIN_NAME_SIZE 32 int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; oHpiHandlerIdT hid0, hid1, hid2, hid3; GHashTable *h0 = g_hash_table_new(g_str_hash, g_str_equal), *h1 = g_hash_table_new(g_str_hash, g_str_equal), *h2 = g_hash_table_new(g_str_hash, g_str_equal), *h3 = g_hash_table_new(g_str_hash, g_str_equal); setenv("OPENHPI_CONF","./noconfig", 1); if (saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL)) return -1; /* Set configuration for handlers and create them. */ g_hash_table_insert(h0, "plugin", "libsimulator"); g_hash_table_insert(h0, "entity_root", "{SYSTEM_CHASSIS,1}"); g_hash_table_insert(h0, "name", "test0"); g_hash_table_insert(h0, "addr", "0"); g_hash_table_insert(h1, "plugin", "libsimulator"); g_hash_table_insert(h1, "entity_root", "{SYSTEM_CHASSIS,2}"); g_hash_table_insert(h1, "name", "test1"); g_hash_table_insert(h1, "addr", "1"); /* Set configuration for two handlers and create them. */ g_hash_table_insert(h2, "plugin", "libwatchdog"); g_hash_table_insert(h2, "entity_root", "{SYSTEM_CHASSIS,3}"); g_hash_table_insert(h2, "addr", "0"); g_hash_table_insert(h3, "plugin", "libwatchdog"); g_hash_table_insert(h3, "entity_root", "{SYSTEM_CHASSIS,4}"); g_hash_table_insert(h3, "addr", "1"); if (oHpiHandlerCreate(sid, h0,&hid0) || oHpiHandlerCreate(sid, h1,&hid1)) return -1; if (oHpiHandlerCreate(sid, h2,&hid2) || oHpiHandlerCreate(sid, h3,&hid3)) return -1; if (oHpiHandlerDestroy(sid, hid0) || oHpiHandlerDestroy(sid, hid1)) return -1; if (oHpiHandlerDestroy(sid, hid2) || oHpiHandlerDestroy(sid, hid3)) return -1; return 0; } openhpi-3.6.1/openhpid/threaded.c0000644000175100017510000001565612575647301015734 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005-2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * */ #include #include #include "event.h" #include "threaded.h" #include "sahpi_wrappers.h" static const glong OH_DISCOVERY_THREAD_SLEEP_TIME = 180 * G_USEC_PER_SEC; static const glong OH_EVTGET_THREAD_SLEEP_TIME = 3 * G_USEC_PER_SEC; static volatile int started = FALSE; volatile int signal_stop = FALSE; int signal_service_thread = FALSE; /* Used by the plugins */ GThread *discovery_thread = 0; GMutex *discovery_lock = 0; GCond *discovery_cond = 0; GCond *evtget_cond = 0; GThread *evtget_thread = 0; GMutex *evtget_lock = 0; GThread *evtpop_thread = 0; static gpointer discovery_func(gpointer data) { DBG("Begin discovery."); g_mutex_lock(discovery_lock); while (signal_stop == FALSE) { DBG("Discovery: Iteration."); SaErrorT error = oh_discovery(); if (error != SA_OK) { DBG("Got error on threaded discovery return."); } /* Let oh_wake_discovery_thread know this thread is done */ g_cond_broadcast(discovery_cond); if(signal_stop == TRUE) break; DBG("Discovery: Going to sleep."); #if GLIB_CHECK_VERSION (2, 32, 0) gint64 time; time = g_get_monotonic_time(); time = time + OH_DISCOVERY_THREAD_SLEEP_TIME; wrap_g_cond_timed_wait(discovery_cond, discovery_lock, time); #else GTimeVal time; g_get_current_time(&time); g_time_val_add(&time, OH_DISCOVERY_THREAD_SLEEP_TIME); wrap_g_cond_timed_wait(discovery_cond, discovery_lock, &time); #endif } /* Let oh_wake_discovery_thread know this thread is done */ g_cond_broadcast(discovery_cond); g_mutex_unlock(discovery_lock); DBG("Done with discovery."); return 0; } static gpointer evtget_func(gpointer data) { /* Give the discovery time to start first -> FIXME */ g_usleep(G_USEC_PER_SEC / 2 ); DBG("Begin event harvesting."); g_mutex_lock(evtget_lock); while (signal_stop == FALSE) { DBG("Event harvesting: Iteration."); SaErrorT error = oh_harvest_events(); if (error != SA_OK) { CRIT("Error on harvest of events."); } if(signal_stop == TRUE) break; DBG("Event harvesting: Going to sleep."); #if GLIB_CHECK_VERSION (2, 32, 0) gint64 time; time = g_get_monotonic_time(); time = time + OH_EVTGET_THREAD_SLEEP_TIME; wrap_g_cond_timed_wait(evtget_cond, evtget_lock, time); #else GTimeVal time; g_get_current_time(&time); g_time_val_add(&time, OH_EVTGET_THREAD_SLEEP_TIME); wrap_g_cond_timed_wait(evtget_cond, evtget_lock, &time); #endif } g_mutex_unlock(evtget_lock); DBG("Done with event harvesting."); return 0; } static gpointer evtpop_func(gpointer data) { SaErrorT error = SA_OK; DBG("Begin event processing."); while(1) { error = oh_process_events(); if (error == SA_OK) { // OpenHPI is about to quit break; } else { CRIT("Error on processing of events."); } } DBG("Done with event processing."); return 0; } int oh_threaded_start() { if ( started != FALSE ) { return 0; } if (g_thread_supported() == FALSE) { wrap_g_thread_init(0); } signal_stop = FALSE; DBG("Starting discovery thread."); discovery_cond = wrap_g_cond_new_init(); discovery_lock = wrap_g_mutex_new_init(); discovery_thread = wrap_g_thread_create_new("DiscoveryThread", discovery_func, 0, TRUE, 0); DBG("Starting event threads."); evtget_cond = wrap_g_cond_new_init(); evtget_lock = wrap_g_mutex_new_init(); evtget_thread = wrap_g_thread_create_new("EventGet",evtget_func, 0, TRUE, 0); evtpop_thread = wrap_g_thread_create_new("EventPop",evtpop_func, 0, TRUE, 0); started = TRUE; return 0; } void oh_signal_service(void) { /* Plugin may need to wait for a long time (ex: power cycle). This variable could be used by service threads executing in the plugin code to exit. Discovery, main and other plugin specific threads need to use some other variable set by the close function */ signal_service_thread = TRUE; } int oh_threaded_stop(void) { if ( started == FALSE ) { return 0; } signal_stop = TRUE; g_thread_join(evtpop_thread); evtpop_thread = 0; g_mutex_lock(evtget_lock); g_cond_broadcast(evtget_cond); g_mutex_unlock(evtget_lock); g_thread_join(evtget_thread); wrap_g_mutex_free_clear(evtget_lock); wrap_g_cond_free(evtget_cond); evtget_cond = 0; evtget_thread = 0; evtget_lock = 0; g_mutex_lock(discovery_lock); g_cond_broadcast(discovery_cond); g_mutex_unlock(discovery_lock); g_thread_join(discovery_thread); wrap_g_mutex_free_clear(discovery_lock); wrap_g_cond_free(discovery_cond); discovery_cond = 0; discovery_thread = 0; discovery_lock = 0; started = FALSE; return 0; } /** * oh_wake_discovery_thread * The discovery thread is woken up * and we wait until it does a round throughout the * plugin instances. If the thread is already running, * we will wait for it until it completes the round. * * Returns: void **/ void oh_wake_discovery_thread() { if ( started == FALSE ) { return; } g_mutex_lock(discovery_lock); DBG("Going to wait for discovery thread to loop once."); g_cond_broadcast(discovery_cond); g_cond_wait(discovery_cond, discovery_lock); DBG("Got signal from discovery thread being done. Giving lock back."); g_mutex_unlock(discovery_lock); } openhpi-3.6.1/openhpid/safhpi.c0000644000175100017510000057171312575647301015427 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * (C) Copyright IBM Corp. 2003-2007 * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Louis Zhuang * Sean Dague * Rusty Lynch * David Judkovics * Thomas Kanngieser * Renier Morales * Racing Guo * Anton Pak * Lars Wetzel */ #include #include #include #include #include #include #include #include #include #include "alarm.h" #include "conf.h" #include "event.h" #include "hotswap.h" #include "init.h" #include "threaded.h" /********************************************************************* * * Begin SAHPI B.03.01 Functions. For full documentation please see * the specification * ********************************************************************/ SaHpiVersionT SAHPI_API saHpiVersionGet () { return SAHPI_INTERFACE_VERSION; } SaErrorT SAHPI_API saHpiSessionOpen( SAHPI_IN SaHpiDomainIdT DomainId, SAHPI_OUT SaHpiSessionIdT *SessionId, SAHPI_IN void *SecurityParams) { SaHpiSessionIdT sid; SaHpiDomainIdT did = DomainId; if (SessionId == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } /* Security Params required to be NULL by the spec at this point */ if (SecurityParams != NULL) { return SA_ERR_HPI_INVALID_PARAMS; } /* Initialize Library - This will only run once */ if (oh_init()) return SA_ERR_HPI_INTERNAL_ERROR; sid = oh_create_session(did); if(!sid) { return SA_ERR_HPI_INVALID_DOMAIN; } *SessionId = sid; return SA_OK; } SaErrorT SAHPI_API saHpiSessionClose( SAHPI_IN SaHpiSessionIdT SessionId) { OH_CHECK_INIT_STATE(SessionId); return oh_destroy_session(SessionId); } SaErrorT SAHPI_API saHpiDiscover( SAHPI_IN SaHpiSessionIdT SessionId) { OH_CHECK_INIT_STATE(SessionId); /* This will wake the discovery thread up * and wait until it does a round throughout the * plugin instances. If the thread is already running, * it will wait for it until it completes the round. */ oh_wake_discovery_thread(); return SA_OK; } /********************************************************************* * * Domain Functions * ********************************************************************/ SaErrorT SAHPI_API saHpiDomainInfoGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_OUT SaHpiDomainInfoT *DomainInfo) { SaHpiDomainIdT did; struct oh_domain *d = NULL; struct oh_global_param param = { .type = OPENHPI_DAT_USER_LIMIT }; if (!DomainInfo) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ /* General */ DomainInfo->DomainId = d->id; DomainInfo->DomainCapabilities = d->capabilities; DomainInfo->IsPeer = 0; /* DRT */ DomainInfo->DrtUpdateCount = d->drt.update_count; DomainInfo->DrtUpdateTimestamp = d->drt.update_timestamp; /* RPT */ DomainInfo->RptUpdateCount = d->rpt.update_count; DomainInfo->RptUpdateTimestamp = d->rpt.update_timestamp; /* DAT */ DomainInfo->DatUpdateCount = d->dat.update_count; DomainInfo->DatUpdateTimestamp = d->dat.update_timestamp; DomainInfo->ActiveAlarms = oh_count_alarms(d, SAHPI_ALL_SEVERITIES); DomainInfo->CriticalAlarms = oh_count_alarms(d, SAHPI_CRITICAL); DomainInfo->MajorAlarms = oh_count_alarms(d, SAHPI_MAJOR); DomainInfo->MinorAlarms = oh_count_alarms(d, SAHPI_MINOR); if (oh_get_global_param(¶m)) param.u.dat_user_limit = OH_MAX_DAT_USER_LIMIT; DomainInfo->DatUserAlarmLimit = param.u.dat_user_limit; DomainInfo->DatOverflow = d->dat.overflow; memcpy(DomainInfo->Guid, d->guid, sizeof(SaHpiGuidT)); DomainInfo->DomainTag = d->tag; oh_release_domain(d); /* Unlock domain */ return SA_OK; } SaErrorT SAHPI_API saHpiDrtEntryGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiEntryIdT EntryId, SAHPI_OUT SaHpiEntryIdT *NextEntryId, SAHPI_OUT SaHpiDrtEntryT *DrtEntry) { SaHpiDomainIdT did; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); if((DrtEntry == NULL) || (NextEntryId == NULL) || (EntryId == SAHPI_LAST_ENTRY)) { return SA_ERR_HPI_INVALID_PARAMS; } return oh_drt_entry_get(did, EntryId, NextEntryId, DrtEntry); } SaErrorT SAHPI_API saHpiDomainTagSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiTextBufferT *DomainTag) { SaHpiDomainIdT did; struct oh_domain *d = NULL; if (!DomainTag || !oh_valid_textbuffer(DomainTag)) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ d->tag = *DomainTag; oh_release_domain(d); /* Unlock domain */ return SA_OK; } /********************************************************************* * * Resource Functions * ********************************************************************/ SaErrorT SAHPI_API saHpiRptEntryGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiEntryIdT EntryId, SAHPI_OUT SaHpiEntryIdT *NextEntryId, SAHPI_OUT SaHpiRptEntryT *RptEntry) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *req_entry; SaHpiRptEntryT *next_entry; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); /* Test pointer parameters for invalid pointers */ if ((NextEntryId == NULL) || (RptEntry == NULL)) { return SA_ERR_HPI_INVALID_PARAMS; } /* I believe this is the only current reserved value here, though others may come in the future. */ if (EntryId == SAHPI_LAST_ENTRY) { return SA_ERR_HPI_INVALID_PARAMS; } OH_GET_DOMAIN(did, d); /* Lock domain */ if (EntryId == SAHPI_FIRST_ENTRY) { req_entry = oh_get_resource_next(&(d->rpt), SAHPI_FIRST_ENTRY); } else { req_entry = oh_get_resource_by_id(&(d->rpt), EntryId); } /* if the entry was NULL, clearly have an issue */ if (req_entry == NULL) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } memcpy(RptEntry, req_entry, sizeof(*RptEntry)); next_entry = oh_get_resource_next(&(d->rpt), req_entry->EntryId); if(next_entry != NULL) { *NextEntryId = next_entry->EntryId; } else { *NextEntryId = SAHPI_LAST_ENTRY; } oh_release_domain(d); /* Unlock domain */ return SA_OK; } SaErrorT SAHPI_API saHpiRptEntryGetByResourceId( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiRptEntryT *RptEntry) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *req_entry; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); /* Test pointer parameters for invalid pointers */ if (ResourceId == SAHPI_UNSPECIFIED_RESOURCE_ID || RptEntry == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } OH_GET_DOMAIN(did, d); /* Lock domain */ req_entry = oh_get_resource_by_id(&(d->rpt), ResourceId); /* * is this case really supposed to be an error? I thought * there was a valid return for "not found in domain" */ if (req_entry == NULL) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_INVALID_RESOURCE; } memcpy(RptEntry, req_entry, sizeof(*RptEntry)); oh_release_domain(d); /* Unlock domain */ return SA_OK; } SaErrorT SAHPI_API saHpiResourceSeveritySet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSeverityT Severity) { SaHpiDomainIdT did; struct oh_handler *h = NULL; struct oh_domain *d = NULL; SaErrorT error = SA_OK; SaHpiRptEntryT *rptentry; OH_CHECK_INIT_STATE(SessionId); if (ResourceId == SAHPI_UNSPECIFIED_RESOURCE_ID) { return SA_ERR_HPI_INVALID_PARAMS; } else if (!oh_lookup_severity(Severity) || Severity == SAHPI_ALL_SEVERITIES) { return SA_ERR_HPI_INVALID_PARAMS; } OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ OH_CALL_ABI(h, set_resource_severity, SA_ERR_HPI_INVALID_CMD, error, ResourceId, Severity); if (error != SA_OK) { oh_release_handler(h); return error; } oh_release_handler(h); /* Alarm Handling */ if (error == SA_OK) { oh_detect_res_sev_alarm(did, ResourceId, Severity); } /* to get rpt entry into infrastructure */ OH_GET_DOMAIN(did, d); /* Lock domain */ rptentry = oh_get_resource_by_id(&(d->rpt), ResourceId); if (!rptentry) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } rptentry->ResourceSeverity = Severity; oh_release_domain(d); /* Unlock domain */ return error; } SaErrorT SAHPI_API saHpiResourceTagSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiTextBufferT *ResourceTag) { SaErrorT rv; SaHpiDomainIdT did; struct oh_handler *h = NULL; struct oh_domain *d = NULL; SaHpiRptEntryT *rptentry; OH_CHECK_INIT_STATE(SessionId); if (ResourceTag == NULL || !oh_valid_textbuffer(ResourceTag)) return SA_ERR_HPI_INVALID_PARAMS; OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ OH_CALL_ABI(h, set_resource_tag, SA_ERR_HPI_INVALID_CMD, rv, ResourceId, ResourceTag); if (rv != SA_OK) { oh_release_handler(h); return rv; } oh_release_handler(h); OH_GET_DOMAIN(did, d); /* Lock domain */ rptentry = oh_get_resource_by_id(&(d->rpt), ResourceId); if (!rptentry) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } rptentry->ResourceTag = *ResourceTag; oh_release_domain(d); /* Unlock domain */ return SA_OK; } SaErrorT SAHPI_API saHpiMyEntityPathGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_OUT SaHpiEntityPathT *EntityPath) { // This function is now implemented on the base library level return SA_ERR_HPI_UNSUPPORTED_API; } SaErrorT SAHPI_API saHpiResourceIdGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_OUT SaHpiResourceIdT *ResourceId) { // This function is now implemented on the base library level return SA_ERR_HPI_UNSUPPORTED_API; } SaErrorT SAHPI_API saHpiGetIdByEntityPath ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiEntityPathT EntityPath, SAHPI_IN SaHpiRdrTypeT InstrumentType, SAHPI_INOUT SaHpiUint32T *InstanceId, SAHPI_OUT SaHpiResourceIdT *ResourceId, SAHPI_OUT SaHpiInstrumentIdT *InstrumentId, SAHPI_OUT SaHpiUint32T *RptUpdateCount) { struct oh_domain *d = NULL; SaHpiDomainIdT did; SaHpiRptEntryT *rptentry; SaHpiRdrT *rdr = NULL; if (InstanceId == NULL || ResourceId == NULL || *InstanceId == SAHPI_LAST_ENTRY || (InstrumentId == NULL && InstrumentType != SAHPI_NO_RECORD) || RptUpdateCount == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ rptentry = oh_get_resource_by_ep(&(d->rpt), &EntityPath); if (!rptentry) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } *ResourceId = rptentry->ResourceId; *RptUpdateCount = d->rpt.update_count; if (InstrumentType == SAHPI_NO_RECORD) { *InstanceId = SAHPI_LAST_ENTRY; oh_release_domain(d); return SA_OK; } /* Get Rdr indicated by InstanceId (Num) and Type */ if (*InstanceId == SAHPI_FIRST_ENTRY) { rdr = oh_get_rdr_by_type_first(&d->rpt, *ResourceId, InstrumentType); } else { rdr = oh_get_rdr_by_type(&d->rpt, *ResourceId, InstrumentType, oh_get_rdr_num(*InstanceId)); } if (rdr == NULL) { oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } *InstrumentId = oh_get_rdr_num(rdr->RecordId); rdr = oh_get_rdr_by_type_next(&d->rpt, *ResourceId, InstrumentType, oh_get_rdr_num(rdr->RecordId)); if (rdr == NULL) { *InstanceId = SAHPI_LAST_ENTRY; } else { *InstanceId = oh_get_rdr_uid(rdr->RdrType, oh_get_rdr_num(rdr->RecordId) ); } oh_release_domain(d); return SA_OK; } SaErrorT SAHPI_API saHpiGetChildEntityPath ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiEntityPathT ParentEntityPath, SAHPI_INOUT SaHpiUint32T *InstanceId, SAHPI_OUT SaHpiEntityPathT *ChildEntityPath, SAHPI_OUT SaHpiUint32T *RptUpdateCount) { struct oh_domain *d = NULL; SaHpiDomainIdT did; oh_entitypath_pattern epp; SaHpiRptEntryT *rpte = NULL; SaHpiBoolT found_match = SAHPI_FALSE; SaErrorT error; int i, j; if (InstanceId == NULL || *InstanceId == SAHPI_LAST_ENTRY || RptUpdateCount == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ /* Check to see the parent entity path exists */ /* There is special handling for {ROOT, 0} */ if ( (ParentEntityPath.Entry[0].EntityType != SAHPI_ENT_ROOT) || (ParentEntityPath.Entry[0].EntityLocation != 0) ) { rpte = oh_get_resource_by_ep(&d->rpt, &ParentEntityPath); if (rpte == NULL) { oh_release_domain(d); return SA_ERR_HPI_INVALID_DATA; } rpte = NULL; } /* Create an entity path pattern from the parent entity path * that looks like the following: {.,.} * This will match direct childs of ParentEntityPath. **/ memset(&epp, 0, sizeof(oh_entitypath_pattern)); epp.epattern[0].etp.is_dot = 1; epp.epattern[0].elp.is_dot = 1; for(i = 0, j = 1; i < SAHPI_MAX_ENTITY_PATH; i++) { epp.epattern[j].etp.type = ParentEntityPath.Entry[i].EntityType; epp.epattern[j].elp.location = ParentEntityPath.Entry[i].EntityLocation; j++; } /* Find a matching child */ for (rpte = oh_get_resource_by_id(&d->rpt, *InstanceId); rpte; rpte = oh_get_resource_next(&d->rpt, rpte->ResourceId)) { if (oh_match_entitypath_pattern(&epp, &rpte->ResourceEntity)) { found_match = SAHPI_TRUE; break; } if (*InstanceId != SAHPI_FIRST_ENTRY) break; } if (found_match) { /* Found matching InstanceId */ /* Now look next matching InstanceId */ SaHpiRptEntryT *nrpte = NULL; found_match = SAHPI_FALSE; for (nrpte = oh_get_resource_next(&d->rpt, rpte->ResourceId); nrpte; nrpte = oh_get_resource_next(&d->rpt, nrpte->ResourceId)) { if (oh_match_entitypath_pattern(&epp, &nrpte->ResourceEntity)) { found_match = SAHPI_TRUE; break; } } *InstanceId = SAHPI_LAST_ENTRY; if (found_match) { *InstanceId = nrpte->ResourceId; } *ChildEntityPath = rpte->ResourceEntity; *RptUpdateCount = d->rpt.update_count; error = SA_OK; } else { error = SA_ERR_HPI_NOT_PRESENT; } oh_release_domain(d); return error; } SaErrorT SAHPI_API saHpiResourceFailedRemove ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId) { SaErrorT error; struct oh_domain *d = NULL; struct oh_handler *h = NULL; unsigned int hid; SaHpiDomainIdT did; SaHpiRptEntryT *rpte = NULL; SaHpiRptEntryT saved_res; struct oh_event *e = NULL; SaHpiHsStateT hsstate; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ rpte = oh_get_resource_by_id(&d->rpt, ResourceId); if (rpte == NULL) { oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } if (!rpte->ResourceFailed) { oh_release_domain(d); return SA_ERR_HPI_INVALID_REQUEST; } if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_FRU)) { oh_release_domain(d); return SA_ERR_HPI_INVALID_CMD; } saved_res = *rpte; OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); if (h && h->abi->resource_failed_remove) { OH_CALL_ABI(h, resource_failed_remove, SA_ERR_HPI_INTERNAL_ERROR, error, ResourceId); oh_release_handler(h); return error; } hid = h->id; /* If the resource_failed_remove ABI is not defined, then remove the * resource from rptcache */ if (rpte->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP) { OH_CALL_ABI(h, get_hotswap_state, SA_ERR_HPI_INTERNAL_ERROR, error, ResourceId, &hsstate); if (error != SA_OK) { oh_release_handler(h); return error; } } else { hsstate = SAHPI_HS_STATE_ACTIVE; } oh_release_handler(h); e = g_new0(struct oh_event, 1); e->hid = hid; e->resource = saved_res; e->event.Source = ResourceId; e->event.Severity = saved_res.ResourceSeverity; oh_gettimeofday(&e->event.Timestamp); e->event.EventType = SAHPI_ET_HOTSWAP; e->event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = hsstate; e->event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_NOT_PRESENT; e->event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_USER_UPDATE; oh_evt_queue_push(oh_process_q, e); return SA_OK; } /********************************************************************* * * Event Log Functions * ********************************************************************/ SaErrorT SAHPI_API saHpiEventLogInfoGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiEventLogInfoT *Info) { SaErrorT rv; SaHpiRptEntryT *res; struct oh_handler *h = NULL; struct oh_domain *d = NULL; SaHpiDomainIdT did; /* Test pointer parameters for invalid pointers */ if (Info == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ /* test for special domain case */ if (ResourceId == SAHPI_UNSPECIFIED_RESOURCE_ID) { rv = oh_el_info(d->del, Info); oh_release_domain(d); /* Unlock domain */ return rv; } OH_RESOURCE_GET_CHECK(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_EVENT_LOG)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ OH_CALL_ABI(h, get_el_info, SA_ERR_HPI_INVALID_CMD, rv, ResourceId, Info); oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiEventLogCapabilitiesGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiEventLogCapabilitiesT *EventLogCapabilities) { SaErrorT error; SaHpiRptEntryT *rpte = NULL; struct oh_handler *h = NULL; struct oh_domain *d = NULL; SaHpiDomainIdT did; if (EventLogCapabilities == NULL) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); if (ResourceId == SAHPI_UNSPECIFIED_RESOURCE_ID) { *EventLogCapabilities = SAHPI_EVTLOG_CAPABILITY_ENTRY_ADD | SAHPI_EVTLOG_CAPABILITY_CLEAR | SAHPI_EVTLOG_CAPABILITY_TIME_SET | SAHPI_EVTLOG_CAPABILITY_STATE_SET | SAHPI_EVTLOG_CAPABILITY_OVERFLOW_RESET; return SA_OK; } OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if(!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_EVENT_LOG)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ OH_CALL_ABI(h, get_el_caps, SA_ERR_HPI_INTERNAL_ERROR, error, ResourceId, EventLogCapabilities); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiEventLogEntryGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiEventLogEntryIdT EntryId, SAHPI_OUT SaHpiEventLogEntryIdT *PrevEntryId, SAHPI_OUT SaHpiEventLogEntryIdT *NextEntryId, SAHPI_OUT SaHpiEventLogEntryT *EventLogEntry, SAHPI_INOUT SaHpiRdrT *Rdr, SAHPI_INOUT SaHpiRptEntryT *RptEntry) { SaErrorT rv; SaHpiRptEntryT *res; struct oh_handler *h; struct oh_domain *d; oh_el_entry *elentry; SaErrorT retc; SaHpiDomainIdT did; /* Test pointer parameters for invalid pointers */ if (!PrevEntryId || !EventLogEntry || !NextEntryId || EntryId == SAHPI_NO_MORE_ENTRIES) { return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ /* test for special domain case */ if (ResourceId == SAHPI_UNSPECIFIED_RESOURCE_ID) { retc = oh_el_get(d->del, EntryId, PrevEntryId, NextEntryId, &elentry); if (retc == SA_OK) { memcpy(EventLogEntry, &elentry->event, sizeof(SaHpiEventLogEntryT)); if (Rdr) memcpy(Rdr, &elentry->rdr, sizeof(SaHpiRdrT)); if (RptEntry) memcpy(RptEntry, &elentry->res, sizeof(SaHpiRptEntryT)); } oh_release_domain(d); /* Unlock domain */ return retc; } OH_RESOURCE_GET_CHECK(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_EVENT_LOG)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ OH_CALL_ABI(h, get_el_entry, SA_ERR_HPI_INVALID_CMD, rv, ResourceId, EntryId, PrevEntryId, NextEntryId, EventLogEntry, Rdr, RptEntry); oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiEventLogEntryAdd ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiEventT *EvtEntry) { SaErrorT rv; SaHpiEventLogInfoT info; SaHpiEventLogCapabilitiesT caps; SaHpiRptEntryT *res; struct oh_handler *h; struct oh_domain *d; SaHpiDomainIdT did; char del_filepath[SAHPI_MAX_TEXT_BUFFER_LENGTH*2]; OH_CHECK_INIT_STATE(SessionId); if (EvtEntry == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } else if (EvtEntry->EventType != SAHPI_ET_USER) { return SA_ERR_HPI_INVALID_PARAMS; } else if (EvtEntry->Source != SAHPI_UNSPECIFIED_RESOURCE_ID) { return SA_ERR_HPI_INVALID_PARAMS; } else if (EvtEntry->Severity == SAHPI_ALL_SEVERITIES) { return SA_ERR_HPI_INVALID_PARAMS; } else if (!oh_lookup_severity(EvtEntry->Severity)) { return SA_ERR_HPI_INVALID_PARAMS; } else if (!oh_valid_textbuffer(&EvtEntry->EventDataUnion.UserEvent.UserEventData)) { return SA_ERR_HPI_INVALID_PARAMS; } rv = saHpiEventLogInfoGet(SessionId, ResourceId, &info); if (rv != SA_OK) { return rv; } rv = saHpiEventLogCapabilitiesGet(SessionId, ResourceId, &caps); #if 0 if (rv != SA_OK) { return rv; } if ((caps & SAHPI_EVTLOG_CAPABILITY_ENTRY_ADD) == 0) { return SA_ERR_HPI_INVALID_CMD; } #endif // This is a workaround // TODO use the variant above instead // when all plug-ins will support oh_get_el_caps if ((rv == SA_OK) && ((caps & SAHPI_EVTLOG_CAPABILITY_ENTRY_ADD) == 0)) { return SA_ERR_HPI_INVALID_CMD; } if (EvtEntry->EventDataUnion.UserEvent.UserEventData.DataLength > info.UserEventMaxSize) { return SA_ERR_HPI_INVALID_DATA; } OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ /* test for special domain case */ if (ResourceId == SAHPI_UNSPECIFIED_RESOURCE_ID) { struct oh_global_param param = { .type = OPENHPI_DEL_SAVE }; oh_get_global_param(¶m); rv = oh_el_append(d->del, EvtEntry, NULL, NULL); if (param.u.del_save) { param.type = OPENHPI_VARPATH; oh_get_global_param(¶m); snprintf(del_filepath, SAHPI_MAX_TEXT_BUFFER_LENGTH*2, "%s/del.%u", param.u.varpath, did); oh_el_map_to_file(d->del, del_filepath); } oh_release_domain(d); /* Unlock domain */ return rv; } OH_RESOURCE_GET_CHECK(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_EVENT_LOG)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ OH_CALL_ABI(h, add_el_entry, SA_ERR_HPI_INVALID_CMD, rv, ResourceId, EvtEntry); oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiEventLogClear ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId) { SaErrorT rv; SaHpiEventLogCapabilitiesT caps; SaHpiRptEntryT *res; struct oh_handler *h; struct oh_domain *d; SaHpiDomainIdT did; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ /* test for special domain case */ if (ResourceId == SAHPI_UNSPECIFIED_RESOURCE_ID) { rv = oh_el_clear(d->del); oh_release_domain(d); /* Unlock domain */ return rv; } OH_RESOURCE_GET_CHECK(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_EVENT_LOG)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rv = saHpiEventLogCapabilitiesGet(SessionId, ResourceId, &caps); #if 0 if (rv != SA_OK) { oh_release_domain(d); /* Unlock domain */ return rv; } if ((caps & SAHPI_EVTLOG_CAPABILITY_CLEAR) == 0) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_INVALID_CMD; } #endif // This is a workaround // TODO use the variant above instead // when all plug-ins will support oh_get_el_caps if ((rv == SA_OK) && ((caps & SAHPI_EVTLOG_CAPABILITY_CLEAR) == 0)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_INVALID_CMD; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ OH_CALL_ABI(h, clear_el, SA_ERR_HPI_INVALID_CMD, rv, ResourceId); oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiEventLogTimeGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiTimeT *Time) { SaHpiEventLogInfoT info; SaErrorT rv; /* Test pointer parameters for invalid pointers */ if (Time == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } rv = saHpiEventLogInfoGet(SessionId, ResourceId, &info); if(rv != SA_OK) { return rv; } *Time = info.CurrentTime; return SA_OK; } SaErrorT SAHPI_API saHpiEventLogTimeSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiTimeT Time) { SaErrorT rv; SaHpiEventLogCapabilitiesT caps; SaHpiRptEntryT *res; struct oh_handler *h; struct oh_domain *d; SaHpiDomainIdT did; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ /* test for special domain case */ if (ResourceId == SAHPI_UNSPECIFIED_RESOURCE_ID) { rv = oh_el_timeset(d->del, Time); oh_release_domain(d); /* Unlock domain */ return rv; } OH_RESOURCE_GET_CHECK(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_EVENT_LOG)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rv = saHpiEventLogCapabilitiesGet(SessionId, ResourceId, &caps); #if 0 if (rv != SA_OK) { oh_release_domain(d); /* Unlock domain */ return rv; } if ((caps & SAHPI_EVTLOG_CAPABILITY_TIME_SET) == 0) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_INVALID_CMD; } #endif // This is a workaround // TODO use the variant above instead // when all plug-ins will support oh_get_el_caps if ((rv == SA_OK) && ((caps & SAHPI_EVTLOG_CAPABILITY_TIME_SET) == 0)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_INVALID_CMD; } if (Time == SAHPI_TIME_UNSPECIFIED) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_INVALID_PARAMS; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ OH_CALL_ABI(h, set_el_time, SA_ERR_HPI_INVALID_CMD, rv, ResourceId, Time); oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiEventLogStateGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiBoolT *Enable) { SaHpiEventLogInfoT info; SaErrorT rv; /* Test pointer parameters for invalid pointers */ if (Enable == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } rv = saHpiEventLogInfoGet(SessionId, ResourceId, &info); if(rv != SA_OK) { return rv; } *Enable = info.Enabled; return SA_OK; } SaErrorT SAHPI_API saHpiEventLogStateSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiBoolT Enable) { struct oh_domain *d; struct oh_handler *h; SaErrorT rv; SaHpiDomainIdT did; SaHpiRptEntryT *res; SaHpiEventLogCapabilitiesT caps; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ /* test for special domain case */ if (ResourceId == SAHPI_UNSPECIFIED_RESOURCE_ID) { oh_el_enableset(d->del, Enable); oh_release_domain(d); /* Unlock domain */ return SA_OK; } OH_RESOURCE_GET_CHECK(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_EVENT_LOG)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rv = saHpiEventLogCapabilitiesGet(SessionId, ResourceId, &caps); #if 0 if (rv != SA_OK) { oh_release_domain(d); /* Unlock domain */ return rv; } if ((caps & SAHPI_EVTLOG_CAPABILITY_STATE_SET) == 0) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_INVALID_CMD; } #endif // This is a workaround // TODO use the variant above instead // when all plug-ins will support oh_get_el_caps if ((rv == SA_OK) && ((caps & SAHPI_EVTLOG_CAPABILITY_STATE_SET) == 0)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_INVALID_CMD; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ OH_CALL_ABI(h, set_el_state, SA_ERR_HPI_INVALID_CMD, rv, ResourceId, Enable); oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiEventLogOverflowReset ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId) { struct oh_handler *h; struct oh_domain *d; SaHpiDomainIdT did; SaHpiRptEntryT *res; SaErrorT rv = SA_OK; SaHpiEventLogCapabilitiesT caps; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ /* test for special domain case */ if (ResourceId == SAHPI_UNSPECIFIED_RESOURCE_ID) { rv = oh_el_overflowreset(d->del); oh_release_domain(d); /* Unlock domain */ return rv; } OH_RESOURCE_GET_CHECK(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_EVENT_LOG)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rv = saHpiEventLogCapabilitiesGet(SessionId, ResourceId, &caps); #if 0 if (rv != SA_OK) { oh_release_domain(d); /* Unlock domain */ return rv; } if ((caps & SAHPI_EVTLOG_CAPABILITY_OVERFLOW_RESET) == 0) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_INVALID_CMD; } #endif // This is a workaround // TODO use the variant above instead // when all plug-ins will support oh_get_el_caps if ((rv == SA_OK ) && ((caps & SAHPI_EVTLOG_CAPABILITY_OVERFLOW_RESET) == 0)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_INVALID_CMD; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ OH_CALL_ABI(h, reset_el_overflow, SA_ERR_HPI_INVALID_CMD, rv, ResourceId); oh_release_handler(h); return rv; } /********************************************************************* * * Event Functions * ********************************************************************/ SaErrorT SAHPI_API saHpiSubscribe ( SAHPI_IN SaHpiSessionIdT SessionId) { SaHpiDomainIdT did; SaHpiBoolT subscribed; SaErrorT error; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); error = oh_get_session_subscription(SessionId, &subscribed); if (error != SA_OK) { return error; } if (subscribed) { return SA_ERR_HPI_DUPLICATE; } error = oh_set_session_subscription(SessionId, SAHPI_TRUE); return error; } SaErrorT SAHPI_API saHpiUnsubscribe ( SAHPI_IN SaHpiSessionIdT SessionId) { SaHpiDomainIdT did; SaHpiBoolT subscribed; SaErrorT error; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); error = oh_get_session_subscription(SessionId, &subscribed); if (error != SA_OK) { return error; } if (!subscribed) { return SA_ERR_HPI_INVALID_REQUEST; } error = oh_set_session_subscription(SessionId, SAHPI_FALSE); if (error != SA_OK) { return error; } return error; } SaErrorT SAHPI_API saHpiEventGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiTimeoutT Timeout, SAHPI_OUT SaHpiEventT *Event, SAHPI_INOUT SaHpiRdrT *Rdr, SAHPI_INOUT SaHpiRptEntryT *RptEntry, SAHPI_INOUT SaHpiEvtQueueStatusT *EventQueueStatus) { SaHpiDomainIdT did; SaHpiBoolT subscribed; struct oh_event e; SaErrorT error = SA_OK; SaHpiEvtQueueStatusT qstatus = 0; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); if (!Event) { return SA_ERR_HPI_INVALID_PARAMS; } else if ((Timeout <= 0) && (Timeout != SAHPI_TIMEOUT_BLOCK) && (Timeout != SAHPI_TIMEOUT_IMMEDIATE)) { return SA_ERR_HPI_INVALID_PARAMS; } error = oh_get_session_subscription(SessionId, &subscribed); if (error != SA_OK) return error; if (!subscribed) { return SA_ERR_HPI_INVALID_REQUEST; } /* See if there is already an event in the queue */ error = oh_dequeue_session_event(SessionId, SAHPI_TIMEOUT_IMMEDIATE, &e, &qstatus); if (error == SA_ERR_HPI_TIMEOUT) { /* If queue empty then fetch more events */ /* Sent for more events. Ready to wait on queue. */ error = oh_dequeue_session_event(SessionId, Timeout, &e, &qstatus); } if (error != SA_OK) { /* If no events after trying to fetch them, return error */ return error; } /* If there was overflow before or after getting events, return it */ if (EventQueueStatus) *EventQueueStatus = qstatus; /* Return event, resource and rdr */ *Event = e.event; if (RptEntry) *RptEntry = e.resource; if (Rdr) { if (e.rdrs) { memcpy(Rdr, e.rdrs->data, sizeof(SaHpiRdrT)); } else { Rdr->RdrType = SAHPI_NO_RECORD; } } oh_event_free(&e, TRUE); return SA_OK; } SaErrorT SAHPI_API saHpiEventAdd ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiEventT *EvtEntry) { SaHpiDomainIdT did; struct oh_event * e; SaHpiEventLogInfoT info; SaErrorT error = SA_OK; error = oh_valid_addevent(EvtEntry); if (error != SA_OK) { return error; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); error = saHpiEventLogInfoGet(SessionId, SAHPI_UNSPECIFIED_RESOURCE_ID, &info); if (error != SA_OK) { return error; } if (EvtEntry->EventDataUnion.UserEvent.UserEventData.DataLength > info.UserEventMaxSize) { return SA_ERR_HPI_INVALID_DATA; } e = oh_new_event(); e->hid = 0; /* Timestamp the incoming user event * only if it is SAHPI_TIME_UNSPECIFIED */ if (EvtEntry->Timestamp == SAHPI_TIME_UNSPECIFIED) { oh_gettimeofday(&EvtEntry->Timestamp); } /* Copy SaHpiEventT into oh_event struct */ e->event = *EvtEntry; /* indicate there is no rdr or resource */ e->rdrs = NULL; e->rdrs_to_remove = NULL; e->resource.ResourceId = did; e->resource.ResourceCapabilities = 0; /* indicate this is a user-added event */ e->resource.ResourceSeverity = SAHPI_INFORMATIONAL; oh_evt_queue_push(oh_process_q, e); return error; } /********************************************************************* * * DAT Functions * ********************************************************************/ SaErrorT SAHPI_API saHpiAlarmGetNext ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiSeverityT Severity, SAHPI_IN SaHpiBoolT UnacknowledgedOnly, SAHPI_INOUT SaHpiAlarmT *Alarm) { SaHpiDomainIdT did = 0; SaHpiAlarmT *a = NULL; struct oh_domain *d = NULL; SaErrorT error = SA_ERR_HPI_NOT_PRESENT; OH_CHECK_INIT_STATE(SessionId); if (!oh_lookup_severity(Severity) || !Alarm) { return SA_ERR_HPI_INVALID_PARAMS; } else if (Alarm->AlarmId == SAHPI_LAST_ENTRY) { return error; } OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ if (Alarm->AlarmId != SAHPI_FIRST_ENTRY) { /* Lookup timestamp for previous alarm, first*/ a = oh_get_alarm(d, &Alarm->AlarmId, &Severity, NULL, NULL, NULL, NULL, NULL, UnacknowledgedOnly, 0); if (a && a->Timestamp != Alarm->Timestamp) { error = SA_ERR_HPI_INVALID_DATA; } } a = oh_get_alarm(d, &Alarm->AlarmId, &Severity, NULL, NULL, NULL, NULL, NULL, UnacknowledgedOnly, 1); /* get next alarm */ if (a) { if (error != SA_ERR_HPI_INVALID_DATA) { error = SA_OK; } memcpy(Alarm, a, sizeof(SaHpiAlarmT)); } oh_release_domain(d); return error; } SaErrorT SAHPI_API saHpiAlarmGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiAlarmIdT AlarmId, SAHPI_OUT SaHpiAlarmT *Alarm) { SaHpiDomainIdT did = 0; struct oh_domain *d = NULL; SaHpiAlarmT *a = NULL; SaErrorT error = SA_ERR_HPI_NOT_PRESENT; OH_CHECK_INIT_STATE(SessionId); if (!Alarm || AlarmId == SAHPI_FIRST_ENTRY || AlarmId == SAHPI_LAST_ENTRY) return SA_ERR_HPI_INVALID_PARAMS; OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ a = oh_get_alarm(d, &AlarmId, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0); if (a) { memcpy(Alarm, a, sizeof(SaHpiAlarmT)); error = SA_OK; } oh_release_domain(d); return error; } SaErrorT SAHPI_API saHpiAlarmAcknowledge( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiAlarmIdT AlarmId, SAHPI_IN SaHpiSeverityT Severity) { SaHpiDomainIdT did = 0; struct oh_domain *d = NULL; SaHpiAlarmT *a = NULL; SaErrorT error = SA_ERR_HPI_NOT_PRESENT; OH_CHECK_INIT_STATE(SessionId); if (AlarmId == SAHPI_ENTRY_UNSPECIFIED && !oh_lookup_severity(Severity)) return SA_ERR_HPI_INVALID_PARAMS; OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ if (AlarmId != SAHPI_ENTRY_UNSPECIFIED) { /* Acknowledge specific alarm */ a = oh_get_alarm(d, &AlarmId, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0); if (a) { a->Acknowledged = SAHPI_TRUE; error = SA_OK; } } else { /* Acknowledge group of alarms, by severity */ SaHpiAlarmIdT aid = SAHPI_FIRST_ENTRY; a = oh_get_alarm(d, &aid, &Severity, NULL, NULL, NULL, NULL, NULL, 0, 1); while (a) { a->Acknowledged = SAHPI_TRUE; a = oh_get_alarm(d, &a->AlarmId, &Severity, NULL, NULL, NULL, NULL, NULL, 0, 1); } error = SA_OK; } oh_release_domain(d); return error; } SaErrorT SAHPI_API saHpiAlarmAdd( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_INOUT SaHpiAlarmT *Alarm) { SaHpiDomainIdT did = 0; struct oh_domain *d = NULL; SaHpiAlarmT *a = NULL; OH_CHECK_INIT_STATE(SessionId); if (!Alarm || !((Alarm->Severity == SAHPI_CRITICAL) || (Alarm->Severity == SAHPI_MAJOR) || (Alarm->Severity == SAHPI_MINOR)) || (Alarm->AlarmCond.Type != SAHPI_STATUS_COND_TYPE_USER)|| !oh_valid_textbuffer(&Alarm->AlarmCond.Data)) return SA_ERR_HPI_INVALID_PARAMS; OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ /* Add new alarm */ a = oh_add_alarm(d, Alarm, 0); oh_release_domain(d); if (a == NULL) return SA_ERR_HPI_OUT_OF_SPACE; else return SA_OK; } SaErrorT SAHPI_API saHpiAlarmDelete( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiAlarmIdT AlarmId, SAHPI_IN SaHpiSeverityT Severity) { SaHpiDomainIdT did = 0; struct oh_domain *d = NULL; SaHpiAlarmT *a = NULL; SaHpiStatusCondTypeT type = SAHPI_STATUS_COND_TYPE_USER; SaErrorT error = SA_ERR_HPI_NOT_PRESENT; OH_CHECK_INIT_STATE(SessionId); if (AlarmId == SAHPI_ENTRY_UNSPECIFIED && !oh_lookup_severity(Severity)) return SA_ERR_HPI_INVALID_PARAMS; OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ if (AlarmId != SAHPI_ENTRY_UNSPECIFIED) { /* Look for specific alarm */ a = oh_get_alarm(d, &AlarmId, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0); if (a) { if (a->AlarmCond.Type != SAHPI_STATUS_COND_TYPE_USER) { error = SA_ERR_HPI_READ_ONLY; } else { d->dat.list = g_slist_remove(d->dat.list, a); g_free(a); error = SA_OK; } } } else { /* Delete group of alarms by severity */ oh_remove_alarm(d, &Severity, &type, NULL, NULL, NULL, NULL, NULL, 1); error = SA_OK; } oh_release_domain(d); return error; } /********************************************************************* * * RDR Functions * ********************************************************************/ SaErrorT SAHPI_API saHpiRdrGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiEntryIdT EntryId, SAHPI_OUT SaHpiEntryIdT *NextEntryId, SAHPI_OUT SaHpiRdrT *Rdr) { struct oh_domain *d; SaHpiDomainIdT did; SaHpiRptEntryT *res = NULL; SaHpiRdrT *rdr_cur; SaHpiRdrT *rdr_next; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); /* Test pointer parameters for invalid pointers */ if (EntryId == SAHPI_LAST_ENTRY || !Rdr || !NextEntryId) { return SA_ERR_HPI_INVALID_PARAMS; } OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_RDR)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } if(EntryId == SAHPI_FIRST_ENTRY) { rdr_cur = oh_get_rdr_next(&(d->rpt), ResourceId, SAHPI_FIRST_ENTRY); } else { rdr_cur = oh_get_rdr_by_id(&(d->rpt), ResourceId, EntryId); } if (rdr_cur == NULL) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } memcpy(Rdr, rdr_cur, sizeof(*Rdr)); rdr_next = oh_get_rdr_next(&(d->rpt), ResourceId, rdr_cur->RecordId); if(rdr_next == NULL) { *NextEntryId = SAHPI_LAST_ENTRY; } else { *NextEntryId = rdr_next->RecordId; } oh_release_domain(d); /* Unlock domain */ return SA_OK; } SaErrorT SAHPI_API saHpiRdrGetByInstrumentId ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiRdrTypeT RdrType, SAHPI_IN SaHpiInstrumentIdT InstrumentId, SAHPI_OUT SaHpiRdrT *Rdr) { SaHpiRptEntryT *res = NULL; SaHpiRdrT *rdr_cur; SaHpiDomainIdT did; SaHpiCapabilitiesT cap; struct oh_domain *d = NULL; /* Test pointer parameters for invalid pointers */ if (!oh_lookup_rdrtype(RdrType) || RdrType == SAHPI_NO_RECORD || !Rdr) { return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET(d, ResourceId, res); cap = res->ResourceCapabilities; if(!(cap & SAHPI_CAPABILITY_RDR)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } /* ensure that the resource has something of that type */ switch(RdrType) { case SAHPI_CTRL_RDR: if(!(cap & SAHPI_CAPABILITY_CONTROL)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } break; case SAHPI_SENSOR_RDR: if(!(cap & SAHPI_CAPABILITY_SENSOR)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } break; case SAHPI_INVENTORY_RDR: if(!(cap & SAHPI_CAPABILITY_INVENTORY_DATA)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } break; case SAHPI_WATCHDOG_RDR: if(!(cap & SAHPI_CAPABILITY_WATCHDOG)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } break; case SAHPI_ANNUNCIATOR_RDR: if(!(cap & SAHPI_CAPABILITY_ANNUNCIATOR)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } break; case SAHPI_DIMI_RDR: if(!(cap & SAHPI_CAPABILITY_DIMI)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } break; case SAHPI_FUMI_RDR: if(!(cap & SAHPI_CAPABILITY_FUMI)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } break; default: oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_INVALID_PARAMS; } /* now that we have a pretty good notion that all is well, try the lookup */ rdr_cur = oh_get_rdr_by_type(&(d->rpt), ResourceId, RdrType, InstrumentId); if (rdr_cur == NULL) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } memcpy(Rdr, rdr_cur, sizeof(*Rdr)); oh_release_domain(d); /* Unlock domain */ return SA_OK; } SaErrorT SAHPI_API saHpiRdrUpdateCountGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiUint32T *UpdateCount) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *res; /* Test pointer parameters for invalid pointers */ if (UpdateCount == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_RDR)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } SaErrorT rv = oh_get_rdr_update_count(&(d->rpt), ResourceId, UpdateCount); oh_release_domain(d); /* Unlock domain */ return rv; } /********************************************************************* * * Sensor Functions * ********************************************************************/ SaErrorT SAHPI_API saHpiSensorReadingGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_INOUT SaHpiSensorReadingT *Reading, SAHPI_INOUT SaHpiEventStateT *EventState) { SaErrorT rv; struct oh_handler *h; SaHpiRptEntryT *res; SaHpiRdrT *rdr; SaHpiDomainIdT did; struct oh_domain *d = NULL; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_SENSOR_RDR, SensorNum); if (!rdr) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ OH_CALL_ABI(h, get_sensor_reading, SA_ERR_HPI_INVALID_CMD, rv, ResourceId, SensorNum, Reading, EventState); /* If the Reading->IsSupported is set to False, then Reading->Type and * Reading->Value fields are not valid. Hence, these two fields may not * be modified by the plugin. But the marshalling code expects all * the fields of return structure to have proper values. * * The below code is added to overcome the marshalling limitation. */ if (rv == SA_OK && Reading && Reading->IsSupported == SAHPI_FALSE) { Reading->Type = 0; memset(&(Reading->Value), 0, sizeof(SaHpiSensorReadingUnionT)); } oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiSensorThresholdsGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_IN SaHpiSensorThresholdsT *SensorThresholds) { SaErrorT rv; SaHpiRptEntryT *res; SaHpiRdrT *rdr_cur; SaHpiSensorThdDefnT *thd; struct oh_handler *h; SaHpiDomainIdT did; struct oh_domain *d = NULL; if (!SensorThresholds) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rdr_cur = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_SENSOR_RDR, SensorNum); if (rdr_cur == NULL) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } thd = &rdr_cur->RdrTypeUnion.SensorRec.ThresholdDefn; if (thd->IsAccessible == SAHPI_FALSE || thd->ReadThold == 0) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_INVALID_CMD; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ OH_CALL_ABI(h, get_sensor_thresholds, SA_ERR_HPI_INVALID_CMD, rv, ResourceId, SensorNum, SensorThresholds); oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiSensorThresholdsSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_IN SaHpiSensorThresholdsT *SensorThresholds) { SaErrorT rv; SaHpiRptEntryT *res; SaHpiRdrT *rdr; struct oh_handler *h; SaHpiDomainIdT did; struct oh_domain *d = NULL; if (!SensorThresholds) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_SENSOR_RDR, SensorNum); if (!rdr) { oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } rv = oh_valid_thresholds(SensorThresholds, rdr); if (rv != SA_OK) { /* Invalid sensor threshold */ oh_release_domain(d); return rv; } /* Checking the ordering*/ SaHpiSensorThresholdsT tmp; rv = saHpiSensorThresholdsGet( SessionId, ResourceId, SensorNum, &tmp ); if (rv != SA_OK) { oh_release_domain(d); return rv; } #define COPY_TH( TH, MASK ) \ { \ if ( SensorThresholds->TH.IsSupported == SAHPI_TRUE ) { \ tmp.TH = SensorThresholds->TH; \ } \ } COPY_TH( UpCritical, SAHPI_STM_UP_CRIT ); COPY_TH( UpMajor, SAHPI_STM_UP_MAJOR ); COPY_TH( UpMinor, SAHPI_STM_UP_MINOR ); COPY_TH( LowCritical, SAHPI_STM_LOW_CRIT ); COPY_TH( LowMajor, SAHPI_STM_LOW_MAJOR ); COPY_TH( LowMinor, SAHPI_STM_LOW_MINOR ); COPY_TH( PosThdHysteresis, SAHPI_STM_UP_HYSTERESIS ); COPY_TH( NegThdHysteresis, SAHPI_STM_LOW_HYSTERESIS ); #undef COPY_TH rv = oh_valid_ordering(&tmp, rdr); if (rv != SA_OK) { /* Invalid sensor threshold */ oh_release_domain(d); return rv; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ OH_CALL_ABI(h, set_sensor_thresholds, SA_ERR_HPI_INVALID_CMD, rv, ResourceId, SensorNum, SensorThresholds); oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiSensorTypeGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_OUT SaHpiSensorTypeT *Type, SAHPI_OUT SaHpiEventCategoryT *Category) { SaHpiRptEntryT *res; SaHpiRdrT *rdr; SaHpiDomainIdT did; struct oh_domain *d = NULL; if (!Type || !Category) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_SENSOR_RDR, SensorNum); if (!rdr) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } memcpy(Type, &(rdr->RdrTypeUnion.SensorRec.Type), sizeof(SaHpiSensorTypeT)); memcpy(Category, &(rdr->RdrTypeUnion.SensorRec.Category), sizeof(SaHpiEventCategoryT)); oh_release_domain(d); /* Unlock domain */ return SA_OK; } SaErrorT SAHPI_API saHpiSensorEnableGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_OUT SaHpiBoolT *SensorEnabled) { SaErrorT rv; SaHpiRptEntryT *res; SaHpiRdrT *rdr_cur; struct oh_handler *h; SaHpiDomainIdT did; struct oh_domain *d = NULL; if (!SensorEnabled) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rdr_cur = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_SENSOR_RDR, SensorNum); if (rdr_cur == NULL) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ OH_CALL_ABI(h, get_sensor_enable, SA_ERR_HPI_INVALID_CMD, rv, ResourceId, SensorNum, SensorEnabled); oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiSensorEnableSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_IN SaHpiBoolT SensorEnabled) { SaErrorT rv; SaHpiRptEntryT *res; SaHpiRdrT *rdr_cur; struct oh_handler *h; SaHpiDomainIdT did; struct oh_domain *d = NULL; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rdr_cur = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_SENSOR_RDR, SensorNum); if (rdr_cur == NULL) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } if (!rdr_cur->RdrTypeUnion.SensorRec.EnableCtrl) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_READ_ONLY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ OH_CALL_ABI(h, set_sensor_enable, SA_ERR_HPI_INVALID_CMD, rv, ResourceId, SensorNum, SensorEnabled); oh_release_handler(h); if (rv == SA_OK) { oh_detect_sensor_enable_alarm(did, ResourceId, SensorNum, SensorEnabled); } return rv; } SaErrorT SAHPI_API saHpiSensorEventEnableGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_OUT SaHpiBoolT *SensorEventsEnabled) { SaErrorT rv; SaHpiRptEntryT *res; SaHpiRdrT *rdr_cur; struct oh_handler *h; SaHpiDomainIdT did; struct oh_domain *d = NULL; if (!SensorEventsEnabled) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rdr_cur = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_SENSOR_RDR, SensorNum); if (rdr_cur == NULL) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ OH_CALL_ABI(h, get_sensor_event_enables, SA_ERR_HPI_INVALID_CMD, rv, ResourceId, SensorNum, SensorEventsEnabled); oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiSensorEventEnableSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_IN SaHpiBoolT SensorEventsEnabled) { SaErrorT rv; SaHpiRptEntryT *res; SaHpiRdrT *rdr_cur; struct oh_handler *h; SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiSensorEventCtrlT sec; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rdr_cur = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_SENSOR_RDR, SensorNum); if (rdr_cur == NULL) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } sec = rdr_cur->RdrTypeUnion.SensorRec.EventCtrl; if (sec == SAHPI_SEC_READ_ONLY) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_READ_ONLY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ OH_CALL_ABI(h, set_sensor_event_enables, SA_ERR_HPI_INVALID_CMD, rv, ResourceId, SensorNum, SensorEventsEnabled); oh_release_handler(h); if (rv == SA_OK) { oh_detect_sensor_enable_alarm(did, ResourceId, SensorNum, SensorEventsEnabled); } return rv; } SaErrorT SAHPI_API saHpiSensorEventMasksGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_INOUT SaHpiEventStateT *AssertEventMask, SAHPI_INOUT SaHpiEventStateT *DeassertEventMask) { SaErrorT rv; SaHpiRptEntryT *res; SaHpiRdrT *rdr_cur; struct oh_handler *h; SaHpiDomainIdT did; struct oh_domain *d = NULL; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rdr_cur = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_SENSOR_RDR, SensorNum); if (rdr_cur == NULL) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ OH_CALL_ABI(h, get_sensor_event_masks, SA_ERR_HPI_INVALID_CMD, rv, ResourceId, SensorNum, AssertEventMask, DeassertEventMask); oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiSensorEventMasksSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_IN SaHpiSensorEventMaskActionT Action, SAHPI_IN SaHpiEventStateT AssertEventMask, SAHPI_IN SaHpiEventStateT DeassertEventMask) { SaErrorT rv; SaHpiRptEntryT *res; SaHpiRdrT *rdr_cur; struct oh_handler *h; SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiSensorEventCtrlT sec; OH_CHECK_INIT_STATE(SessionId); if (!oh_lookup_sensoreventmaskaction(Action)) return SA_ERR_HPI_INVALID_PARAMS; OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rdr_cur = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_SENSOR_RDR, SensorNum); if (rdr_cur == NULL) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } sec = rdr_cur->RdrTypeUnion.SensorRec.EventCtrl; if ((sec == SAHPI_SEC_READ_ONLY_MASKS) || (sec == SAHPI_SEC_READ_ONLY)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_READ_ONLY; } if (Action == SAHPI_SENS_ADD_EVENTS_TO_MASKS) { if (AssertEventMask != SAHPI_ALL_EVENT_STATES && (rdr_cur->RdrTypeUnion.SensorRec.Events | AssertEventMask) != rdr_cur->RdrTypeUnion.SensorRec.Events) { oh_release_domain(d); return SA_ERR_HPI_INVALID_DATA; } if (!(res->ResourceCapabilities & SAHPI_CAPABILITY_EVT_DEASSERTS) && (DeassertEventMask != SAHPI_ALL_EVENT_STATES) && ((rdr_cur->RdrTypeUnion.SensorRec.Events | DeassertEventMask) != rdr_cur->RdrTypeUnion.SensorRec.Events)) { oh_release_domain(d); return SA_ERR_HPI_INVALID_DATA; } } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ OH_CALL_ABI(h, set_sensor_event_masks, SA_ERR_HPI_INVALID_CMD, rv, ResourceId, SensorNum, Action, AssertEventMask, DeassertEventMask); oh_release_handler(h); if (rv == SA_OK) { oh_detect_sensor_mask_alarm(did, ResourceId, SensorNum, Action, DeassertEventMask); } return rv; } /* End Sensor functions */ /********************************************************************* * * Control Functions * ********************************************************************/ SaErrorT SAHPI_API saHpiControlTypeGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiCtrlNumT CtrlNum, SAHPI_OUT SaHpiCtrlTypeT *Type) { SaHpiRptEntryT *res; SaHpiRdrT *rdr; SaHpiDomainIdT did; struct oh_domain *d = NULL; if (!Type) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_CONTROL)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_CTRL_RDR, CtrlNum); if (!rdr) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } memcpy(Type, &(rdr->RdrTypeUnion.CtrlRec.Type), sizeof(SaHpiCtrlTypeT)); oh_release_domain(d); /* Unlock domain */ return SA_OK; } SaErrorT SAHPI_API saHpiControlGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiCtrlNumT CtrlNum, SAHPI_OUT SaHpiCtrlModeT *CtrlMode, SAHPI_INOUT SaHpiCtrlStateT *CtrlState) { SaErrorT rv; SaHpiRptEntryT *res; SaHpiRdrT *rdr; struct oh_handler *h = NULL; SaHpiDomainIdT did; struct oh_domain *d = NULL; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_CONTROL)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_CTRL_RDR, CtrlNum); if (!rdr) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } if(rdr->RdrTypeUnion.CtrlRec.WriteOnly) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_INVALID_CMD; } if (CtrlMode == NULL && CtrlState == NULL) { oh_release_domain(d); return SA_OK; } else if (CtrlState && rdr->RdrTypeUnion.CtrlRec.Type == SAHPI_CTRL_TYPE_TEXT) { if (CtrlState->StateUnion.Text.Line != SAHPI_TLN_ALL_LINES && CtrlState->StateUnion.Text.Line > rdr->RdrTypeUnion.CtrlRec.TypeUnion.Text.MaxLines) { oh_release_domain(d); return SA_ERR_HPI_INVALID_DATA; } } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ OH_CALL_ABI(h, get_control_state, SA_ERR_HPI_INVALID_CMD, rv, ResourceId, CtrlNum, CtrlMode, CtrlState); oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiControlSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiCtrlNumT CtrlNum, SAHPI_IN SaHpiCtrlModeT CtrlMode, SAHPI_IN SaHpiCtrlStateT *CtrlState) { SaErrorT rv; SaHpiRptEntryT *res; SaHpiRdrT *rdr; struct oh_handler *h; SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiCtrlModeT cur_mode; SaHpiCtrlStateT cur_state; if (!oh_lookup_ctrlmode(CtrlMode) || (CtrlMode != SAHPI_CTRL_MODE_AUTO && !CtrlState)) { return SA_ERR_HPI_INVALID_PARAMS; } if (CtrlMode != SAHPI_CTRL_MODE_AUTO && ((CtrlState->Type == SAHPI_CTRL_TYPE_DIGITAL && !oh_lookup_ctrlstatedigital(CtrlState->StateUnion.Digital)) || (CtrlState->Type == SAHPI_CTRL_TYPE_STREAM && CtrlState->StateUnion.Stream.StreamLength > SAHPI_CTRL_MAX_STREAM_LENGTH) || (CtrlState->Type == SAHPI_CTRL_TYPE_TEXT && !oh_valid_textbuffer(&CtrlState->StateUnion.Text.Text)))) { return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_CONTROL)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&d->rpt, ResourceId, SAHPI_CTRL_RDR, CtrlNum); if (!rdr || rdr->RdrType != SAHPI_CTRL_RDR) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } /* Check CtrlMode and CtrlState */ rv = oh_valid_ctrl_state_mode(&rdr->RdrTypeUnion.CtrlRec, CtrlMode, CtrlState); if (rv != SA_OK) { oh_release_domain(d); return rv; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ if (!rdr->RdrTypeUnion.CtrlRec.WriteOnly && rdr->RdrTypeUnion.CtrlRec.Type == SAHPI_CTRL_TYPE_DIGITAL) { OH_CALL_ABI(h, get_control_state, SA_ERR_HPI_INVALID_CMD, rv, ResourceId, CtrlNum, &cur_mode, &cur_state); if (CtrlMode != SAHPI_CTRL_MODE_AUTO) { if (((cur_state.StateUnion.Digital == SAHPI_CTRL_STATE_PULSE_ON || cur_state.StateUnion.Digital == SAHPI_CTRL_STATE_ON) && CtrlState->StateUnion.Digital == SAHPI_CTRL_STATE_PULSE_ON) || ((cur_state.StateUnion.Digital == SAHPI_CTRL_STATE_PULSE_OFF || cur_state.StateUnion.Digital == SAHPI_CTRL_STATE_OFF) && CtrlState->StateUnion.Digital == SAHPI_CTRL_STATE_PULSE_OFF)) { oh_release_handler(h); return SA_ERR_HPI_INVALID_REQUEST; } } } OH_CALL_ABI(h, set_control_state, SA_ERR_HPI_INVALID_CMD, rv, ResourceId, CtrlNum, CtrlMode, CtrlState); oh_release_handler(h); return rv; } /********************************************************************* * * Inventory Functions * ********************************************************************/ SaErrorT SAHPI_API saHpiIdrInfoGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT IdrId, SAHPI_OUT SaHpiIdrInfoT *IdrInfo) { SaHpiRptEntryT *res; SaHpiRdrT *rdr; SaErrorT rv = SA_OK; /* Default to SA_OK */ SaHpiDomainIdT did; struct oh_domain *d = NULL; struct oh_handler *h = NULL; if (IdrInfo == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET(d, ResourceId, res); /* Interface and conformance checking */ if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_INVENTORY_RDR, IdrId); if (!rdr) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ OH_CALL_ABI(h, get_idr_info, SA_ERR_HPI_INVALID_CMD, rv, ResourceId, IdrId, IdrInfo); oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiIdrAreaHeaderGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT IdrId, SAHPI_IN SaHpiIdrAreaTypeT AreaType, SAHPI_IN SaHpiEntryIdT AreaId, SAHPI_OUT SaHpiEntryIdT *NextAreaId, SAHPI_OUT SaHpiIdrAreaHeaderT *Header) { SaHpiRptEntryT *res; SaHpiRdrT *rdr; SaErrorT rv = SA_OK; /* Default to SA_OK */ SaHpiDomainIdT did; struct oh_domain *d = NULL; struct oh_handler *h; if ( ((AreaType < SAHPI_IDR_AREATYPE_INTERNAL_USE) || ((AreaType > SAHPI_IDR_AREATYPE_PRODUCT_INFO) && (AreaType != SAHPI_IDR_AREATYPE_UNSPECIFIED) && (AreaType != SAHPI_IDR_AREATYPE_OEM)) || (AreaId == SAHPI_LAST_ENTRY)|| (NextAreaId == NULL) || (Header == NULL))) { return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); /* Interface and conformance checking */ if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_INVENTORY_RDR, IdrId); if (!rdr) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ OH_CALL_ABI(h, get_idr_area_header, SA_ERR_HPI_INVALID_CMD, rv, ResourceId, IdrId, AreaType, AreaId, NextAreaId, Header); oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiIdrAreaAdd( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT IdrId, SAHPI_IN SaHpiIdrAreaTypeT AreaType, SAHPI_OUT SaHpiEntryIdT *AreaId) { SaHpiRptEntryT *res; SaHpiRdrT *rdr; SaErrorT rv = SA_OK; /* Default to SA_OK */ SaHpiDomainIdT did; struct oh_domain *d = NULL; struct oh_handler *h; if (!oh_lookup_idrareatype(AreaType) || AreaId == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } else if (AreaType == SAHPI_IDR_AREATYPE_UNSPECIFIED) { return SA_ERR_HPI_INVALID_DATA; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); /* Interface and conformance checking */ if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_INVENTORY_RDR, IdrId); if (!rdr) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ OH_CALL_ABI(h, add_idr_area, SA_ERR_HPI_INVALID_CMD, rv, ResourceId, IdrId, AreaType, AreaId); oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiIdrAreaAddById( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT IdrId, SAHPI_IN SaHpiIdrAreaTypeT AreaType, SAHPI_IN SaHpiEntryIdT AreaId) { SaHpiRptEntryT *rpte; SaHpiRdrT *rdr; SaErrorT error = SA_OK; SaHpiDomainIdT did; struct oh_domain *d = NULL; struct oh_handler *h = NULL; SaHpiIdrInfoT info; SaHpiIdrAreaHeaderT header; SaHpiEntryIdT next; if (!oh_lookup_idrareatype(AreaType) || AreaId == SAHPI_LAST_ENTRY) { return SA_ERR_HPI_INVALID_PARAMS; } else if (AreaType == SAHPI_IDR_AREATYPE_UNSPECIFIED) { return SA_ERR_HPI_INVALID_DATA; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); /* Interface and conformance checking */ if(!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_INVENTORY_RDR, IdrId); if (!rdr) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ /* Check if IDR is read-only */ OH_CALL_ABI(h, get_idr_info, SA_ERR_HPI_INTERNAL_ERROR, error, ResourceId, IdrId, &info); if (error != SA_OK) { oh_release_handler(h); return SA_ERR_HPI_NOT_PRESENT; } else if (info.ReadOnly) { oh_release_handler(h); return SA_ERR_HPI_READ_ONLY; } /* Check if the AreaId requested already exists */ if (AreaId != SAHPI_FIRST_ENTRY) { OH_CALL_ABI(h, get_idr_area_header, SA_ERR_HPI_INTERNAL_ERROR, error, ResourceId, IdrId, AreaType, AreaId, &next, &header); if (error == SA_OK) { oh_release_handler(h); return SA_ERR_HPI_DUPLICATE; } } OH_CALL_ABI(h, add_idr_area_id, SA_ERR_HPI_INTERNAL_ERROR, error, ResourceId, IdrId, AreaType, AreaId); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiIdrAreaDelete( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT IdrId, SAHPI_IN SaHpiEntryIdT AreaId) { SaHpiRptEntryT *res; SaHpiRdrT *rdr; SaErrorT rv = SA_OK; /* Default to SA_OK */ SaHpiDomainIdT did; struct oh_domain *d = NULL; struct oh_handler *h; if (AreaId == SAHPI_LAST_ENTRY) { return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); /* Interface and conformance checking */ if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_INVENTORY_RDR, IdrId); if (!rdr) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ OH_CALL_ABI(h, del_idr_area, SA_ERR_HPI_INVALID_CMD, rv, ResourceId, IdrId, AreaId); oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiIdrFieldGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT IdrId, SAHPI_IN SaHpiEntryIdT AreaId, SAHPI_IN SaHpiIdrFieldTypeT FieldType, SAHPI_IN SaHpiEntryIdT FieldId, SAHPI_OUT SaHpiEntryIdT *NextFieldId, SAHPI_OUT SaHpiIdrFieldT *Field) { SaHpiRptEntryT *res; SaHpiRdrT *rdr; SaErrorT rv = SA_OK; /* Default to SA_OK */ SaHpiDomainIdT did; struct oh_domain *d = NULL; struct oh_handler *h; if (!Field || !oh_lookup_idrfieldtype(FieldType) || AreaId == SAHPI_LAST_ENTRY || FieldId == SAHPI_LAST_ENTRY || !NextFieldId) { return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); /* Interface and conformance checking */ if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_INVENTORY_RDR, IdrId); if (!rdr) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ OH_CALL_ABI(h, get_idr_field, SA_ERR_HPI_INVALID_CMD, rv, ResourceId, IdrId, AreaId, FieldType, FieldId, NextFieldId, Field); oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiIdrFieldAdd( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT IdrId, SAHPI_INOUT SaHpiIdrFieldT *Field) { SaHpiRptEntryT *res; SaHpiRdrT *rdr; SaErrorT rv = SA_OK; /* Default to SA_OK */ SaHpiDomainIdT did; struct oh_domain *d = NULL; struct oh_handler *h; if (!Field) { return SA_ERR_HPI_INVALID_PARAMS; } else if (!oh_lookup_idrfieldtype(Field->Type)) { return SA_ERR_HPI_INVALID_PARAMS; } else if (Field->Type == SAHPI_IDR_FIELDTYPE_UNSPECIFIED) { return SA_ERR_HPI_INVALID_PARAMS; } else if (oh_valid_textbuffer(&Field->Field) != SAHPI_TRUE) { return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); /* Interface and conformance checking */ if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_INVENTORY_RDR, IdrId); if (!rdr) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ OH_CALL_ABI(h, add_idr_field, SA_ERR_HPI_INVALID_CMD, rv, ResourceId, IdrId, Field); oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiIdrFieldAddById( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT IdrId, SAHPI_INOUT SaHpiIdrFieldT *Field) { SaHpiRptEntryT *rpte; SaHpiRdrT *rdr; SaErrorT error = SA_OK; SaHpiDomainIdT did; struct oh_domain *d = NULL; struct oh_handler *h = NULL; SaHpiEntryIdT nextid; SaHpiIdrAreaHeaderT header; SaHpiIdrFieldT field; if (!Field) { return SA_ERR_HPI_INVALID_PARAMS; } else if (!oh_lookup_idrfieldtype(Field->Type)) { return SA_ERR_HPI_INVALID_PARAMS; } else if (Field->Type == SAHPI_IDR_FIELDTYPE_UNSPECIFIED) { return SA_ERR_HPI_INVALID_PARAMS; } else if (oh_valid_textbuffer(&Field->Field) != SAHPI_TRUE) { return SA_ERR_HPI_INVALID_PARAMS; } else if (Field->AreaId == SAHPI_LAST_ENTRY || Field->FieldId == SAHPI_LAST_ENTRY) { return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); /* Interface and conformance checking */ if(!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_INVENTORY_RDR, IdrId); if (!rdr) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ /* Check if AreaId specified in Field exists */ OH_CALL_ABI(h, get_idr_area_header, SA_ERR_HPI_INTERNAL_ERROR, error, ResourceId, IdrId, SAHPI_IDR_AREATYPE_UNSPECIFIED, Field->AreaId, &nextid, &header); if (error != SA_OK) { oh_release_handler(h); return SA_ERR_HPI_NOT_PRESENT; } else if (header.ReadOnly) { oh_release_handler(h); return SA_ERR_HPI_READ_ONLY; } /* Check if FieldId requested does not already exists */ if ( Field->FieldId != SAHPI_FIRST_ENTRY ) { OH_CALL_ABI(h, get_idr_field, SA_ERR_HPI_INTERNAL_ERROR, error, ResourceId, IdrId, Field->AreaId, SAHPI_IDR_FIELDTYPE_UNSPECIFIED, Field->FieldId, &nextid, &field); if (error == SA_OK) { oh_release_handler(h); return SA_ERR_HPI_DUPLICATE; } } /* All checks done. Pass call down to plugin */ OH_CALL_ABI(h, add_idr_field_id, SA_ERR_HPI_INTERNAL_ERROR, error, ResourceId, IdrId, Field); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiIdrFieldSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT IdrId, SAHPI_IN SaHpiIdrFieldT *Field) { SaHpiRptEntryT *res; SaHpiRdrT *rdr; SaErrorT rv = SA_OK; /* Default to SA_OK */ SaHpiDomainIdT did; struct oh_domain *d = NULL; struct oh_handler *h; if (!Field) { return SA_ERR_HPI_INVALID_PARAMS; } else if (Field->Type > SAHPI_IDR_FIELDTYPE_CUSTOM) { return SA_ERR_HPI_INVALID_PARAMS; } else if (!oh_valid_textbuffer(&Field->Field)) { return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); /* Interface and conformance checking */ if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_INVENTORY_RDR, IdrId); if (!rdr) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ OH_CALL_ABI(h, set_idr_field, SA_ERR_HPI_INVALID_CMD, rv, ResourceId, IdrId, Field); oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiIdrFieldDelete( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT IdrId, SAHPI_IN SaHpiEntryIdT AreaId, SAHPI_IN SaHpiEntryIdT FieldId) { SaHpiRptEntryT *res; SaHpiRdrT *rdr; SaErrorT rv = SA_OK; /* Default to SA_OK */ SaHpiDomainIdT did; struct oh_handler *h; struct oh_domain *d = NULL; if (FieldId == SAHPI_LAST_ENTRY || AreaId == SAHPI_LAST_ENTRY) { return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); /* Interface and conformance checking */ if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_INVENTORY_RDR, IdrId); if (!rdr) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ OH_CALL_ABI(h, del_idr_field, SA_ERR_HPI_INVALID_CMD, rv, ResourceId, IdrId, AreaId, FieldId); oh_release_handler(h); return rv; } /* End of Inventory Functions */ /********************************************************************* * * Watchdog Functions * ********************************************************************/ SaErrorT SAHPI_API saHpiWatchdogTimerGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiWatchdogNumT WatchdogNum, SAHPI_OUT SaHpiWatchdogT *Watchdog) { SaErrorT rv; SaHpiRptEntryT *res; struct oh_handler *h; struct oh_domain *d = NULL; SaHpiDomainIdT did; if (!Watchdog) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_WATCHDOG)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ OH_CALL_ABI(h, get_watchdog_info, SA_ERR_HPI_INVALID_CMD, rv, ResourceId, WatchdogNum, Watchdog); oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiWatchdogTimerSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiWatchdogNumT WatchdogNum, SAHPI_IN SaHpiWatchdogT *Watchdog) { SaErrorT rv; SaHpiRptEntryT *res; struct oh_handler *h; struct oh_domain *d = NULL; SaHpiDomainIdT did; if (!Watchdog || !oh_lookup_watchdogtimeruse(Watchdog->TimerUse) || !oh_lookup_watchdogaction(Watchdog->TimerAction) || !oh_lookup_watchdogpretimerinterrupt(Watchdog->PretimerInterrupt)) { return SA_ERR_HPI_INVALID_PARAMS; } if (Watchdog->PreTimeoutInterval > Watchdog->InitialCount) { return SA_ERR_HPI_INVALID_DATA; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_WATCHDOG)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ OH_CALL_ABI(h, set_watchdog_info, SA_ERR_HPI_INVALID_CMD, rv, ResourceId, WatchdogNum, Watchdog); oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiWatchdogTimerReset ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiWatchdogNumT WatchdogNum) { SaErrorT rv; SaHpiRptEntryT *res; struct oh_handler *h; struct oh_domain *d = NULL; SaHpiDomainIdT did; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_WATCHDOG)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ OH_CALL_ABI(h, reset_watchdog, SA_ERR_HPI_INVALID_CMD, rv, ResourceId, WatchdogNum); oh_release_handler(h); return rv; } /******************************************************************************* * * Annunciator Functions * ******************************************************************************/ SaErrorT SAHPI_API saHpiAnnunciatorGetNext( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiAnnunciatorNumT AnnunciatorNum, SAHPI_IN SaHpiSeverityT Severity, SAHPI_IN SaHpiBoolT UnacknowledgedOnly, SAHPI_INOUT SaHpiAnnouncementT *Announcement) { SaErrorT rv; SaHpiRptEntryT *res; SaHpiRdrT *rdr; SaHpiDomainIdT did; struct oh_handler *h; struct oh_domain *d = NULL; if (Announcement == NULL) return SA_ERR_HPI_INVALID_PARAMS; if (!oh_lookup_severity(Severity)) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_ANNUNCIATOR)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_ANNUNCIATOR_RDR, AnnunciatorNum); if (!rdr) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, get_next_announce, SA_ERR_HPI_INVALID_CMD, rv, ResourceId, AnnunciatorNum, Severity, UnacknowledgedOnly, Announcement); oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiAnnunciatorGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiAnnunciatorNumT AnnunciatorNum, SAHPI_IN SaHpiEntryIdT EntryId, SAHPI_OUT SaHpiAnnouncementT *Announcement) { SaErrorT rv; SaHpiRptEntryT *res; SaHpiRdrT *rdr; SaHpiDomainIdT did; struct oh_handler *h; struct oh_domain *d = NULL; if (Announcement == NULL || EntryId == SAHPI_FIRST_ENTRY || EntryId == SAHPI_LAST_ENTRY) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_ANNUNCIATOR)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_ANNUNCIATOR_RDR, AnnunciatorNum); if (!rdr) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, get_announce, SA_ERR_HPI_INVALID_CMD, rv, ResourceId, AnnunciatorNum, EntryId, Announcement); oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiAnnunciatorAcknowledge( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiAnnunciatorNumT AnnunciatorNum, SAHPI_IN SaHpiEntryIdT EntryId, SAHPI_IN SaHpiSeverityT Severity) { SaErrorT rv; SaHpiRptEntryT *res; SaHpiRdrT *rdr; SaHpiDomainIdT did; struct oh_handler *h; struct oh_domain *d = NULL; if ((EntryId == SAHPI_ENTRY_UNSPECIFIED) && !oh_lookup_severity(Severity)) { return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_ANNUNCIATOR)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_ANNUNCIATOR_RDR, AnnunciatorNum); if (!rdr) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, ack_announce, SA_ERR_HPI_INVALID_CMD, rv, ResourceId, AnnunciatorNum, EntryId, Severity); oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiAnnunciatorAdd( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiAnnunciatorNumT AnnunciatorNum, SAHPI_INOUT SaHpiAnnouncementT *Announcement) { SaErrorT rv; SaHpiRptEntryT *res; SaHpiRdrT *rdr; SaHpiDomainIdT did; SaHpiAnnunciatorModeT mode; struct oh_handler *h; struct oh_domain *d = NULL; if (Announcement == NULL) return SA_ERR_HPI_INVALID_PARAMS; if (Announcement->Severity == SAHPI_ALL_SEVERITIES || !oh_lookup_severity(Announcement->Severity) || !oh_valid_textbuffer(&Announcement->StatusCond.Data) || !oh_lookup_statuscondtype(Announcement->StatusCond.Type)|| Announcement->StatusCond.Name.Length > SA_HPI_MAX_NAME_LENGTH) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_ANNUNCIATOR)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_ANNUNCIATOR_RDR, AnnunciatorNum); if (!rdr) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } rv = saHpiAnnunciatorModeGet(SessionId, ResourceId, AnnunciatorNum, &mode); if(rv != SA_OK) { oh_release_domain(d); return rv; } if(mode == SAHPI_ANNUNCIATOR_MODE_AUTO) { oh_release_domain(d); return SA_ERR_HPI_READ_ONLY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, add_announce, SA_ERR_HPI_INVALID_CMD, rv, ResourceId, AnnunciatorNum, Announcement); oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiAnnunciatorDelete( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiAnnunciatorNumT AnnunciatorNum, SAHPI_IN SaHpiEntryIdT EntryId, SAHPI_IN SaHpiSeverityT Severity) { SaErrorT rv; SaHpiRptEntryT *res; SaHpiRdrT *rdr; SaHpiDomainIdT did; SaHpiAnnunciatorModeT mode; struct oh_handler *h; struct oh_domain *d = NULL; if ((EntryId == SAHPI_ENTRY_UNSPECIFIED) && !oh_lookup_severity(Severity)) { return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_ANNUNCIATOR)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_ANNUNCIATOR_RDR, AnnunciatorNum); if (!rdr) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } rv = saHpiAnnunciatorModeGet(SessionId, ResourceId, AnnunciatorNum, &mode); if(rv != SA_OK) { oh_release_domain(d); return rv; } if(mode == SAHPI_ANNUNCIATOR_MODE_AUTO) { oh_release_domain(d); return SA_ERR_HPI_READ_ONLY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, del_announce, SA_ERR_HPI_INVALID_CMD, rv, ResourceId, AnnunciatorNum, EntryId, Severity); oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiAnnunciatorModeGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiAnnunciatorNumT AnnunciatorNum, SAHPI_OUT SaHpiAnnunciatorModeT *Mode) { SaErrorT rv; SaHpiRptEntryT *res; SaHpiRdrT *rdr; SaHpiDomainIdT did; struct oh_handler *h; struct oh_domain *d = NULL; if (Mode == NULL) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_ANNUNCIATOR)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_ANNUNCIATOR_RDR, AnnunciatorNum); if (!rdr) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, get_annunc_mode, SA_ERR_HPI_INVALID_CMD, rv, ResourceId, AnnunciatorNum, Mode); oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiAnnunciatorModeSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiAnnunciatorNumT AnnunciatorNum, SAHPI_IN SaHpiAnnunciatorModeT Mode) { SaErrorT rv; SaHpiRptEntryT *res; SaHpiRdrT *rdr; SaHpiDomainIdT did; struct oh_handler *h; struct oh_domain *d = NULL; /* if no valid mode, then this won't find a lookup */ if (!oh_lookup_annunciatormode(Mode)) { return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_ANNUNCIATOR)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_ANNUNCIATOR_RDR, AnnunciatorNum); if (!rdr) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } if (rdr->RdrTypeUnion.AnnunciatorRec.ModeReadOnly) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_READ_ONLY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, set_annunc_mode, SA_ERR_HPI_INVALID_CMD, rv, ResourceId, AnnunciatorNum, Mode); oh_release_handler(h); return rv; } /******************************************************************************* * * DIMI Functions * ******************************************************************************/ SaErrorT SAHPI_API saHpiDimiInfoGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiDimiNumT DimiNum, SAHPI_OUT SaHpiDimiInfoT *DimiInfo) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; if (DimiInfo == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if(!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_DIMI)) { oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_DIMI_RDR, DimiNum); if (!rdr) { oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, get_dimi_info, SA_ERR_HPI_INVALID_CMD, error, ResourceId, DimiNum, DimiInfo); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiDimiTestInfoGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiDimiNumT DimiNum, SAHPI_IN SaHpiDimiTestNumT TestNum, SAHPI_OUT SaHpiDimiTestT *DimiTest) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; if (!DimiTest) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if(!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_DIMI)) { oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_DIMI_RDR, DimiNum); if (!rdr) { oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, get_dimi_test, SA_ERR_HPI_INVALID_CMD, error, ResourceId, DimiNum, TestNum, DimiTest); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiDimiTestReadinessGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiDimiNumT DimiNum, SAHPI_IN SaHpiDimiTestNumT TestNum, SAHPI_OUT SaHpiDimiReadyT *DimiReady) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; if (DimiReady == NULL) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_DIMI)) { oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_DIMI_RDR, DimiNum); if (!rdr) { oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, get_dimi_test_ready, SA_ERR_HPI_INVALID_CMD, error, ResourceId, DimiNum, TestNum, DimiReady); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiDimiTestStart ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiDimiNumT DimiNum, SAHPI_IN SaHpiDimiTestNumT TestNum, SAHPI_IN SaHpiUint8T NumberOfParams, SAHPI_IN SaHpiDimiTestVariableParamsT *ParamsList) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; if (ParamsList == NULL && NumberOfParams != 0) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_DIMI)) { oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_DIMI_RDR, DimiNum); if (!rdr) { oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, start_dimi_test, SA_ERR_HPI_INVALID_CMD, error, ResourceId, DimiNum, TestNum, NumberOfParams, ParamsList); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiDimiTestCancel ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiDimiNumT DimiNum, SAHPI_IN SaHpiDimiTestNumT TestNum) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_DIMI)) { oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_DIMI_RDR, DimiNum); if (!rdr) { oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, cancel_dimi_test, SA_ERR_HPI_INVALID_CMD, error, ResourceId, DimiNum, TestNum); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiDimiTestStatusGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiDimiNumT DimiNum, SAHPI_IN SaHpiDimiTestNumT TestNum, SAHPI_OUT SaHpiDimiTestPercentCompletedT *PercentCompleted, SAHPI_OUT SaHpiDimiTestRunStatusT *RunStatus) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; if (RunStatus == NULL) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_DIMI)) { oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_DIMI_RDR, DimiNum); if (!rdr) { oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, get_dimi_test_status, SA_ERR_HPI_INVALID_CMD, error, ResourceId, DimiNum, TestNum, PercentCompleted, RunStatus); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiDimiTestResultsGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiDimiNumT DimiNum, SAHPI_IN SaHpiDimiTestNumT TestNum, SAHPI_OUT SaHpiDimiTestResultsT *TestResults) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; if (TestResults == NULL) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_DIMI)) { oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_DIMI_RDR, DimiNum); if (!rdr) { oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, get_dimi_test_results, SA_ERR_HPI_INVALID_CMD, error, ResourceId, DimiNum, TestNum, TestResults); oh_release_handler(h); return error; } /******************************************************************************* * * FUMI Functions * ******************************************************************************/ SaErrorT SAHPI_API saHpiFumiSpecInfoGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_OUT SaHpiFumiSpecInfoT *SpecInfo) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; if (SpecInfo == NULL) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_FUMI)) { oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_FUMI_RDR, FumiNum); if (!rdr) { oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, get_fumi_spec, SA_ERR_HPI_INVALID_CMD, error, ResourceId, FumiNum, SpecInfo); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiFumiServiceImpactGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_OUT SaHpiFumiServiceImpactDataT *ServiceImpact) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; if (ServiceImpact == NULL) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_FUMI)) { oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_FUMI_RDR, FumiNum); if (!rdr) { oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, get_fumi_service_impact, SA_ERR_HPI_INVALID_CMD, error, ResourceId, FumiNum, ServiceImpact); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiFumiSourceSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum, SAHPI_IN SaHpiTextBufferT *SourceUri) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; if (SourceUri == NULL || SourceUri->DataType != SAHPI_TL_TYPE_TEXT) return SA_ERR_HPI_INVALID_PARAMS; /* TODO: Add URI format validation */ OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_FUMI)) { oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_FUMI_RDR, FumiNum); if (!rdr) { oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, set_fumi_source, SA_ERR_HPI_INVALID_CMD, error, ResourceId, FumiNum, BankNum, SourceUri); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiFumiSourceInfoValidateStart ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_FUMI)) { oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_FUMI_RDR, FumiNum); if (!rdr) { oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, validate_fumi_source, SA_ERR_HPI_INVALID_CMD, error, ResourceId, FumiNum, BankNum); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiFumiSourceInfoGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum, SAHPI_OUT SaHpiFumiSourceInfoT *SourceInfo) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; if (SourceInfo == NULL) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_FUMI)) { oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_FUMI_RDR, FumiNum); if (!rdr) { oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, get_fumi_source, SA_ERR_HPI_INVALID_CMD, error, ResourceId, FumiNum, BankNum, SourceInfo); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiFumiSourceComponentInfoGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum, SAHPI_IN SaHpiEntryIdT ComponentEntryId, SAHPI_OUT SaHpiEntryIdT *NextComponentEntryId, SAHPI_OUT SaHpiFumiComponentInfoT *ComponentInfo) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; if (NextComponentEntryId == NULL || ComponentInfo == NULL) return SA_ERR_HPI_INVALID_PARAMS; if ( ComponentEntryId == SAHPI_LAST_ENTRY) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_FUMI)) { oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_FUMI_RDR, FumiNum); if (!rdr) { oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } else if (!(rdr->RdrTypeUnion.FumiRec.Capability & SAHPI_FUMI_CAP_COMPONENTS)) { oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, get_fumi_source_component, SA_ERR_HPI_INVALID_CMD, error, ResourceId, FumiNum, BankNum, ComponentEntryId, NextComponentEntryId, ComponentInfo); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiFumiTargetInfoGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum, SAHPI_OUT SaHpiFumiBankInfoT *BankInfo) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; if (BankInfo == NULL) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_FUMI)) { oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_FUMI_RDR, FumiNum); if (!rdr) { oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, get_fumi_target, SA_ERR_HPI_INVALID_CMD, error, ResourceId, FumiNum, BankNum, BankInfo); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiFumiTargetComponentInfoGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum, SAHPI_IN SaHpiEntryIdT ComponentEntryId, SAHPI_OUT SaHpiEntryIdT *NextComponentEntryId, SAHPI_OUT SaHpiFumiComponentInfoT *ComponentInfo) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; if (NextComponentEntryId == NULL || ComponentInfo == NULL) return SA_ERR_HPI_INVALID_PARAMS; if ( ComponentEntryId == SAHPI_LAST_ENTRY) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_FUMI)) { oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_FUMI_RDR, FumiNum); if (!rdr) { oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } else if (!(rdr->RdrTypeUnion.FumiRec.Capability & SAHPI_FUMI_CAP_COMPONENTS)) { oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, get_fumi_target_component, SA_ERR_HPI_INVALID_CMD, error, ResourceId, FumiNum, BankNum, ComponentEntryId, NextComponentEntryId, ComponentInfo); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiFumiLogicalTargetInfoGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_OUT SaHpiFumiLogicalBankInfoT *BankInfo) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; if (BankInfo == NULL) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_FUMI)) { oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_FUMI_RDR, FumiNum); if (!rdr) { oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, get_fumi_logical_target, SA_ERR_HPI_INVALID_CMD, error, ResourceId, FumiNum, BankInfo); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiFumiLogicalTargetComponentInfoGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiEntryIdT ComponentEntryId, SAHPI_OUT SaHpiEntryIdT *NextComponentEntryId, SAHPI_OUT SaHpiFumiLogicalComponentInfoT *ComponentInfo) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; if (NextComponentEntryId == NULL || ComponentInfo == NULL) return SA_ERR_HPI_INVALID_PARAMS; if ( ComponentEntryId == SAHPI_LAST_ENTRY) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_FUMI)) { oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_FUMI_RDR, FumiNum); if (!rdr) { oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } else if (!(rdr->RdrTypeUnion.FumiRec.Capability & SAHPI_FUMI_CAP_COMPONENTS)) { oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, get_fumi_logical_target_component, SA_ERR_HPI_INVALID_CMD, error, ResourceId, FumiNum, ComponentEntryId, NextComponentEntryId, ComponentInfo); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiFumiBackupStart( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_FUMI)) { oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_FUMI_RDR, FumiNum); if (!rdr) { oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } else if (!(rdr->RdrTypeUnion.FumiRec.Capability & SAHPI_FUMI_CAP_BACKUP)) { oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, start_fumi_backup, SA_ERR_HPI_INVALID_CMD, error, ResourceId, FumiNum); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiFumiBankBootOrderSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum, SAHPI_IN SaHpiUint32T Position) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_FUMI)) { oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_FUMI_RDR, FumiNum); if (!rdr) { oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } else if (!(rdr->RdrTypeUnion.FumiRec.Capability & SAHPI_FUMI_CAP_BANKREORDER)) { oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, set_fumi_bank_order, SA_ERR_HPI_INVALID_CMD, error, ResourceId, FumiNum, BankNum, Position); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiFumiBankCopyStart( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT SourceBankNum, SAHPI_IN SaHpiBankNumT TargetBankNum) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; if (SourceBankNum == TargetBankNum) { return SA_ERR_HPI_INVALID_REQUEST; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_FUMI)) { oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_FUMI_RDR, FumiNum); if (!rdr) { oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } else if (!(rdr->RdrTypeUnion.FumiRec.Capability & SAHPI_FUMI_CAP_BANKCOPY)) { oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, start_fumi_bank_copy, SA_ERR_HPI_INVALID_CMD, error, ResourceId, FumiNum, SourceBankNum, TargetBankNum); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiFumiInstallStart ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; SaHpiFumiSourceInfoT sourceinfo; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_FUMI)) { oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_FUMI_RDR, FumiNum); if (!rdr) { oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } error = saHpiFumiSourceInfoGet(SessionId, ResourceId, FumiNum, BankNum, &sourceinfo); if (error != SA_OK) { oh_release_domain(d); return error; } else if (sourceinfo.SourceStatus != SAHPI_FUMI_SRC_VALID && sourceinfo.SourceStatus != SAHPI_FUMI_SRC_VALIDITY_UNKNOWN) { oh_release_domain(d); return SA_ERR_HPI_INVALID_REQUEST; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, start_fumi_install, SA_ERR_HPI_INVALID_CMD, error, ResourceId, FumiNum, BankNum); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiFumiUpgradeStatusGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum, SAHPI_OUT SaHpiFumiUpgradeStatusT *UpgradeStatus) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; if (UpgradeStatus == NULL) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_FUMI)) { oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_FUMI_RDR, FumiNum); if (!rdr) { oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, get_fumi_status, SA_ERR_HPI_INVALID_CMD, error, ResourceId, FumiNum, BankNum, UpgradeStatus); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiFumiTargetVerifyStart ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; SaHpiFumiSourceInfoT sourceinfo; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_FUMI)) { oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_FUMI_RDR, FumiNum); if (!rdr) { oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } else if (!(rdr->RdrTypeUnion.FumiRec.Capability & SAHPI_FUMI_CAP_TARGET_VERIFY)) { oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } error = saHpiFumiSourceInfoGet(SessionId, ResourceId, FumiNum, BankNum, &sourceinfo); if (error != SA_OK) { oh_release_domain(d); return error; } else if (sourceinfo.SourceStatus != SAHPI_FUMI_SRC_VALID && sourceinfo.SourceStatus != SAHPI_FUMI_SRC_VALIDITY_UNKNOWN) { oh_release_domain(d); return SA_ERR_HPI_INVALID_REQUEST; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, start_fumi_verify, SA_ERR_HPI_INVALID_CMD, error, ResourceId, FumiNum, BankNum); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiFumiTargetVerifyMainStart( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; SaHpiFumiSourceInfoT sourceinfo; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_FUMI)) { oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_FUMI_RDR, FumiNum); if (!rdr) { oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } else if (!(rdr->RdrTypeUnion.FumiRec.Capability & SAHPI_FUMI_CAP_TARGET_VERIFY_MAIN)) { oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } error = saHpiFumiSourceInfoGet(SessionId, ResourceId, FumiNum, 0, &sourceinfo); if (error != SA_OK) { oh_release_domain(d); return error; } else if (sourceinfo.SourceStatus != SAHPI_FUMI_SRC_VALID && sourceinfo.SourceStatus != SAHPI_FUMI_SRC_VALIDITY_UNKNOWN) { oh_release_domain(d); return SA_ERR_HPI_INVALID_REQUEST; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, start_fumi_verify_main, SA_ERR_HPI_INVALID_CMD, error, ResourceId, FumiNum); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiFumiUpgradeCancel ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_FUMI)) { oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_FUMI_RDR, FumiNum); if (!rdr) { oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, cancel_fumi_upgrade, SA_ERR_HPI_INVALID_CMD, error, ResourceId, FumiNum, BankNum); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiFumiAutoRollbackDisableGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_OUT SaHpiBoolT *Disable) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; if (Disable == NULL) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_FUMI)) { oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_FUMI_RDR, FumiNum); if (!rdr) { oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } else if (!(rdr->RdrTypeUnion.FumiRec.Capability & SAHPI_FUMI_CAP_AUTOROLLBACK)) { oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, get_fumi_autorollback_disable, SA_ERR_HPI_INVALID_CMD, error, ResourceId, FumiNum, Disable); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiFumiAutoRollbackDisableSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBoolT Disable) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_FUMI)) { oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_FUMI_RDR, FumiNum); if (!rdr) { oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } else if (!(rdr->RdrTypeUnion.FumiRec.Capability & SAHPI_FUMI_CAP_AUTOROLLBACK)) { oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } else if (!(rdr->RdrTypeUnion.FumiRec.Capability & SAHPI_FUMI_CAP_AUTOROLLBACK_CAN_BE_DISABLED)) { oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, set_fumi_autorollback_disable, SA_ERR_HPI_INVALID_CMD, error, ResourceId, FumiNum, Disable); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiFumiRollbackStart ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_FUMI)) { oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_FUMI_RDR, FumiNum); if (!rdr) { oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } else if (!(rdr->RdrTypeUnion.FumiRec.Capability & SAHPI_FUMI_CAP_ROLLBACK)) { oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, start_fumi_rollback, SA_ERR_HPI_INVALID_CMD, error, ResourceId, FumiNum); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiFumiActivate ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_FUMI)) { oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_FUMI_RDR, FumiNum); if (!rdr) { oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, activate_fumi, SA_ERR_HPI_INVALID_CMD, error, ResourceId, FumiNum); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiFumiActivateStart( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBoolT Logical) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_FUMI)) { oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_FUMI_RDR, FumiNum); if (!rdr) { oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, start_fumi_activate, SA_ERR_HPI_INVALID_CMD, error, ResourceId, FumiNum, Logical); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiFumiCleanup( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_FUMI)) { oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_FUMI_RDR, FumiNum); if (!rdr) { oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, cleanup_fumi, SA_ERR_HPI_INVALID_CMD, error, ResourceId, FumiNum, BankNum); oh_release_handler(h); return error; } /******************************************************************************* * * Hotswap Functions * ******************************************************************************/ SaErrorT SAHPI_API saHpiHotSwapPolicyCancel ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId) { SaHpiRptEntryT *res; SaHpiDomainIdT did; SaHpiHsStateT currentstate; SaErrorT error; struct oh_handler *h; struct oh_domain *d = NULL; SaHpiTimeoutT timeout; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if (!(res->ResourceCapabilities & SAHPI_CAPABILITY_FRU)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } if (!(res->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } /* per spec, we only allow a cancel from certain states */ error = saHpiHotSwapStateGet(SessionId, ResourceId, ¤tstate); if (error != SA_OK) { oh_release_domain(d); /* Unlock domain */ return error; } if ((currentstate != SAHPI_HS_STATE_INSERTION_PENDING) && (currentstate != SAHPI_HS_STATE_EXTRACTION_PENDING)) { oh_release_domain(d); return SA_ERR_HPI_INVALID_REQUEST; } OH_HANDLER_GET(d, ResourceId, h); timeout = d->ai_timeout; oh_release_domain(d); /* Unlock domain */ OH_CALL_ABI(h, hotswap_policy_cancel, SA_OK, error, ResourceId, timeout); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiResourceActiveSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId) { SaErrorT error; SaHpiRptEntryT *res; struct oh_handler *h; SaHpiDomainIdT did; SaHpiHsStateT from; struct oh_domain *d = NULL; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if (!(res->ResourceCapabilities & SAHPI_CAPABILITY_FRU)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } if (!(res->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } error = saHpiHotSwapStateGet(SessionId, ResourceId, &from); if (error != SA_OK) { oh_release_domain(d); /* Unlock domain */ return error; } if (!oh_allowed_hotswap_transition(from, SAHPI_HS_STATE_ACTIVE)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_INVALID_REQUEST; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ OH_CALL_ABI(h, set_hotswap_state, SA_ERR_HPI_INVALID_CMD, error, ResourceId, SAHPI_HS_STATE_ACTIVE); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiResourceInactiveSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId) { SaErrorT error; SaHpiRptEntryT *res; struct oh_handler *h; SaHpiDomainIdT did; SaHpiHsStateT from; struct oh_domain *d = NULL; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if (!(res->ResourceCapabilities & SAHPI_CAPABILITY_FRU)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } if (!(res->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } error = saHpiHotSwapStateGet(SessionId, ResourceId, &from); if (error != SA_OK) { oh_release_domain(d); /* Unlock domain */ return error; } if (!oh_allowed_hotswap_transition(from, SAHPI_HS_STATE_INACTIVE)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_INVALID_REQUEST; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ OH_CALL_ABI(h, set_hotswap_state, SA_ERR_HPI_INVALID_CMD, error, ResourceId, SAHPI_HS_STATE_INACTIVE); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiAutoInsertTimeoutGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_OUT SaHpiTimeoutT *Timeout) { SaHpiDomainIdT did; struct oh_domain *domain; if (!Timeout) { return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, domain); /* Lock domain */ *Timeout = get_hotswap_auto_insert_timeout(domain); oh_release_domain(domain); /* Unlock domain */ return SA_OK; } SaErrorT SAHPI_API saHpiAutoInsertTimeoutSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiTimeoutT Timeout) { SaHpiDomainIdT did; struct oh_domain *domain = NULL; SaErrorT error = SA_OK; SaHpiRptEntryT *rpte = NULL; RPTable *rpt; GArray *hids = NULL; int i; if (Timeout != SAHPI_TIMEOUT_IMMEDIATE && Timeout != SAHPI_TIMEOUT_BLOCK && Timeout < 0) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, domain); /* Lock domain */ if (domain->capabilities & SAHPI_DOMAIN_CAP_AUTOINSERT_READ_ONLY) { oh_release_domain(domain); /* Unlock domain */ return SA_ERR_HPI_READ_ONLY; } set_hotswap_auto_insert_timeout(domain, Timeout); rpt = &domain->rpt; /* 1. Get a list of unique handler ids where the resources in this * domain came from. */ hids = g_array_new(FALSE, TRUE, sizeof(guint)); for (rpte = oh_get_resource_by_id(rpt, SAHPI_FIRST_ENTRY); rpte; rpte = oh_get_resource_next(rpt, rpte->ResourceId)) { guint *hidp = (guint *)oh_get_resource_data(rpt, rpte->ResourceId); if (hidp) { int found_hid = 0; /* Store id if we don't have it in the list already */ for (i = 0; i < hids->len; i++) { #if defined(__sparc) || defined(__sparc__) if (((guint *)((void *)(hids->data)))[i] == *hidp) { #else if (g_array_index(hids, guint, i) == *hidp) { #endif found_hid = 1; break; } } if (!found_hid) g_array_append_val(hids, *hidp); } } oh_release_domain(domain); /* Unlock domain */ if (!hids->len) CRIT("Did not find any handlers for domain resources?!"); /* 2. Use list to push down autoInsertTimeoutSet() to those handlers. */ for (i = 0; i < hids->len; i++) { #if defined(__sparc) || defined(__sparc__) guint hid = ((guint *)((void *)(hids->data)))[i]; #else guint hid = g_array_index(hids, guint, i); #endif struct oh_handler *h = oh_get_handler(hid); if (!h || !h->hnd) { CRIT("No such handler %u", hid); error = SA_ERR_HPI_INTERNAL_ERROR; break; } if (h->abi->set_autoinsert_timeout) { OH_CALL_ABI(h, set_autoinsert_timeout, SA_ERR_HPI_INTERNAL_ERROR, error, Timeout); } oh_release_handler(h); if (error != SA_OK) break; } g_array_free(hids, TRUE); return error; } SaErrorT SAHPI_API saHpiAutoExtractTimeoutGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiTimeoutT *Timeout) { SaHpiRptEntryT *res; SaHpiDomainIdT did; struct oh_domain *d = NULL; struct oh_handler *h = NULL; SaErrorT error = SA_OK; if (!Timeout) { return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if (!(res->ResourceCapabilities & SAHPI_CAPABILITY_FRU)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } if (!(res->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock Domain */ OH_CALL_ABI(h, get_autoextract_timeout, SA_ERR_HPI_INVALID_CMD, error, ResourceId, Timeout); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiAutoExtractTimeoutSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiTimeoutT Timeout) { SaHpiRptEntryT *res; SaHpiDomainIdT did; struct oh_domain *d = NULL; struct oh_handler *h = NULL; SaErrorT error = SA_OK; if (Timeout != SAHPI_TIMEOUT_IMMEDIATE && Timeout != SAHPI_TIMEOUT_BLOCK && Timeout < 0) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if (!(res->ResourceCapabilities & SAHPI_CAPABILITY_FRU)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } if (!(res->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock Domain */ OH_CALL_ABI(h, set_autoextract_timeout, SA_ERR_HPI_INVALID_CMD, error, ResourceId, Timeout); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiHotSwapStateGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiHsStateT *State) { SaErrorT rv; SaHpiRptEntryT *res; struct oh_handler *h; SaHpiDomainIdT did; struct oh_domain *d = NULL; if (!State) { return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if (!(res->ResourceCapabilities & SAHPI_CAPABILITY_FRU)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ OH_CALL_ABI(h, get_hotswap_state, SA_ERR_HPI_INVALID_CMD, rv, ResourceId, State); oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiHotSwapActionRequest ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiHsActionT Action) { SaErrorT rv; SaHpiRptEntryT *res; struct oh_handler *h; SaHpiDomainIdT did; SaHpiHsStateT currentstate; struct oh_domain *d = NULL; if (!oh_lookup_hsaction(Action)) { return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if (!(res->ResourceCapabilities & SAHPI_CAPABILITY_FRU)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } if (!(res->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rv = saHpiHotSwapStateGet(SessionId, ResourceId, ¤tstate); if(rv != SA_OK) { oh_release_domain(d); /* Unlock domain */ return rv; } /* Action already validated, let's check HS state */ if( ((Action == SAHPI_HS_ACTION_INSERTION) && (currentstate != SAHPI_HS_STATE_INACTIVE)) || ((Action == SAHPI_HS_ACTION_EXTRACTION) && (currentstate != SAHPI_HS_STATE_ACTIVE))) { oh_release_domain(d); return SA_ERR_HPI_INVALID_REQUEST; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ OH_CALL_ABI(h, request_hotswap_action, SA_ERR_HPI_INVALID_CMD, rv, ResourceId, Action); oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiHotSwapIndicatorStateGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiHsIndicatorStateT *State) { SaErrorT rv; SaHpiRptEntryT *res; struct oh_handler *h; SaHpiDomainIdT did; struct oh_domain *d = NULL; if (!State) { return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if (!(res->ResourceCapabilities & SAHPI_CAPABILITY_FRU)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } if (!(res->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } if (!(res->HotSwapCapabilities & SAHPI_HS_CAPABILITY_INDICATOR_SUPPORTED)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ OH_CALL_ABI(h, get_indicator_state, SA_ERR_HPI_INVALID_CMD, rv, ResourceId, State); oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiHotSwapIndicatorStateSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiHsIndicatorStateT State) { SaErrorT rv; SaHpiRptEntryT *res; struct oh_handler *h; SaHpiDomainIdT did; struct oh_domain *d = NULL; if (!oh_lookup_hsindicatorstate(State)) { return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if (!(res->ResourceCapabilities & SAHPI_CAPABILITY_FRU)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } if (!(res->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } if (!(res->HotSwapCapabilities & SAHPI_HS_CAPABILITY_INDICATOR_SUPPORTED)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ OH_CALL_ABI(h, set_indicator_state, SA_ERR_HPI_INVALID_CMD, rv, ResourceId, State); oh_release_handler(h); return rv; } /******************************************************************************* * * Configuration Function(s) * ******************************************************************************/ SaErrorT SAHPI_API saHpiParmControl ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiParmActionT Action) { SaErrorT rv; SaHpiRptEntryT *res; struct oh_handler *h; SaHpiDomainIdT did; struct oh_domain *d = NULL; if (!oh_lookup_parmaction(Action)) { return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if (!(res->ResourceCapabilities & SAHPI_CAPABILITY_CONFIGURATION)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ OH_CALL_ABI(h, control_parm, SA_ERR_HPI_INVALID_CMD, rv, ResourceId, Action); oh_release_handler(h); return rv; } /******************************************************************************* * * Load Management * ******************************************************************************/ SaErrorT SAHPI_API saHpiResourceLoadIdGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiLoadIdT *LoadId) { SaErrorT error; SaHpiRptEntryT *rpte; struct oh_handler *h = NULL; SaHpiDomainIdT did; struct oh_domain *d = NULL; if (LoadId == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_LOAD_ID)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ OH_CALL_ABI(h, load_id_get, SA_ERR_HPI_INTERNAL_ERROR, error, ResourceId, LoadId); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiResourceLoadIdSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiLoadIdT *LoadId) { SaErrorT error; SaHpiRptEntryT *rpte; struct oh_handler *h = NULL; SaHpiDomainIdT did; struct oh_domain *d = NULL; if (LoadId == NULL) { /* Spec doesn't say what to return in this case */ return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_LOAD_ID)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ OH_CALL_ABI(h, load_id_set, SA_ERR_HPI_INTERNAL_ERROR, error, ResourceId, LoadId); oh_release_handler(h); return error; } /******************************************************************************* * * Reset Functions * ******************************************************************************/ SaErrorT SAHPI_API saHpiResourceResetStateGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiResetActionT *ResetAction) { SaErrorT rv; SaHpiRptEntryT *res; struct oh_handler *h; SaHpiDomainIdT did; struct oh_domain *d = NULL; if (!ResetAction) { return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if (!(res->ResourceCapabilities & SAHPI_CAPABILITY_RESET)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ OH_CALL_ABI(h, get_reset_state, SA_ERR_HPI_INVALID_CMD, rv, ResourceId, ResetAction); oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiResourceResetStateSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiResetActionT ResetAction) { SaErrorT rv; SaHpiRptEntryT *res; struct oh_handler *h; SaHpiDomainIdT did; struct oh_domain *d = NULL; if (!oh_lookup_resetaction(ResetAction)) { return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if (!(res->ResourceCapabilities & SAHPI_CAPABILITY_RESET)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ OH_CALL_ABI(h, set_reset_state, SA_ERR_HPI_INVALID_CMD, rv, ResourceId, ResetAction); oh_release_handler(h); return rv; } /******************************************************************************* * * Power Functions * ******************************************************************************/ SaErrorT SAHPI_API saHpiResourcePowerStateGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiPowerStateT *State) { SaErrorT rv; SaHpiRptEntryT *res; struct oh_handler *h; SaHpiDomainIdT did; struct oh_domain *d = NULL; if (State == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if (!(res->ResourceCapabilities & SAHPI_CAPABILITY_POWER)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ OH_CALL_ABI(h, get_power_state, SA_ERR_HPI_INVALID_CMD, rv, ResourceId, State); oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiResourcePowerStateSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiPowerStateT State) { SaErrorT rv; SaHpiRptEntryT *res; struct oh_handler *h; SaHpiDomainIdT did; struct oh_domain *d = NULL; if (!oh_lookup_powerstate(State)) { return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if (!(res->ResourceCapabilities & SAHPI_CAPABILITY_POWER)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ OH_CALL_ABI(h, set_power_state, SA_ERR_HPI_INVALID_CMD, rv, ResourceId, State); oh_release_handler(h); return rv; } openhpi-3.6.1/openhpid/ohpi.c0000644000175100017510000003124612575647301015104 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copright IBM Corp 2004,2006 * (C) Copyright Pigeon Point Systems. 2010 * (C) Copyright Nokia Siemens Networks 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales * Anton Pak * Ulrich Kleber */ #include #include #include #include #include #include #include #include #include #include "conf.h" #include "event.h" #include "init.h" #include "lock.h" /** * oHpiVersionGet */ SaHpiUint64T oHpiVersionGet() { SaHpiUint64T v = 0; OHPI_VERSION_GET(v, VERSION); return v; } /* Handler operations */ /** * oHpiHandlerCreate **/ SaErrorT SAHPI_API oHpiHandlerCreate ( SAHPI_IN SaHpiSessionIdT sid, SAHPI_IN GHashTable *config, SAHPI_OUT oHpiHandlerIdT *id ) { SaErrorT error = SA_OK; SaHpiDomainIdT did; struct oh_domain *d = NULL; if (sid == 0) return SA_ERR_HPI_INVALID_SESSION; if (!config || !id) return SA_ERR_HPI_INVALID_PARAMS; if (g_hash_table_size(config)==0) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(sid); OH_GET_DID(sid, did); OH_GET_DOMAIN(did, d); /* Lock domain */ if (oh_init()) error = SA_ERR_HPI_INTERNAL_ERROR; if (error == SA_OK) error = oh_create_handler(config, id); oh_release_domain(d); /* Unlock domain */ return error; } /** * oHpiHandlerDestroy **/ SaErrorT SAHPI_API oHpiHandlerDestroy ( SAHPI_IN SaHpiSessionIdT sid, SAHPI_IN oHpiHandlerIdT id ) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaErrorT error = SA_OK; if (sid == 0) return SA_ERR_HPI_INVALID_SESSION; if (id == 0) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(sid); OH_GET_DID(sid, did); OH_GET_DOMAIN(did, d); /* Lock domain */ if (oh_init()) error = SA_ERR_HPI_INTERNAL_ERROR; if (error == SA_OK) if (oh_destroy_handler(id)) error = SA_ERR_HPI_ERROR; if (error == SA_OK) { // Remove all handler remaing resources from the Domain RPT SaHpiRptEntryT *rpte; SaHpiResourceIdT rid; GSList *events = 0; rid = SAHPI_FIRST_ENTRY; while ((rpte = oh_get_resource_next(&(d->rpt), rid)) != 0) { const void * data; data = oh_get_resource_data(&(d->rpt), rpte->ResourceId); if (data) { const unsigned int hid = *(const unsigned int*)(data); if (hid == id) { struct oh_event * e = g_new0(struct oh_event, 1); e->hid = id; e->resource = *rpte; e->rdrs = 0; e->rdrs_to_remove = 0; e->event.Source = rpte->ResourceId; e->event.EventType = SAHPI_ET_RESOURCE; oh_gettimeofday(&e->event.Timestamp); e->event.Severity = SAHPI_MAJOR; e->event.EventDataUnion.ResourceEvent.ResourceEventType = SAHPI_RESE_RESOURCE_REMOVED; events = g_slist_prepend(events, e); } } rid = rpte->ResourceId; } GSList *iter = events; while (iter) { oh_evt_queue_push(oh_process_q, iter->data); iter = g_slist_next(iter); } g_slist_free(events); } oh_release_domain(d); /* Unlock domain */ return error; } /** * oHpiHandlerInfo **/ SaErrorT SAHPI_API oHpiHandlerInfo ( SAHPI_IN SaHpiSessionIdT sid, SAHPI_IN oHpiHandlerIdT id, SAHPI_OUT oHpiHandlerInfoT *info, SAHPI_INOUT GHashTable *conf_params ) { SaErrorT error = SA_OK; SaHpiDomainIdT did; struct oh_domain *d = NULL; if (sid == 0) return SA_ERR_HPI_INVALID_SESSION; if (id == 0 || !info || !conf_params) return SA_ERR_HPI_INVALID_PARAMS; if (g_hash_table_size(conf_params)!=0) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(sid); OH_GET_DID(sid, did); OH_GET_DOMAIN(did, d); /* Lock domain */ if (oh_init()) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_INTERNAL_ERROR; } error = oh_get_handler_info(id, info, conf_params); oh_release_domain(d); /* Unlock domain */ return error; } /** * oHpiHandlerGetNext **/ SaErrorT SAHPI_API oHpiHandlerGetNext ( SAHPI_IN SaHpiSessionIdT sid, SAHPI_IN oHpiHandlerIdT id, SAHPI_OUT oHpiHandlerIdT *next_id ) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaErrorT error = SA_OK; if (sid == 0) return SA_ERR_HPI_INVALID_SESSION; if (!next_id) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(sid); OH_GET_DID(sid, did); OH_GET_DOMAIN(did, d); /* Lock domain */ if (oh_init()) error = SA_ERR_HPI_INTERNAL_ERROR; if (error == SA_OK) if (oh_getnext_handler_id(id, next_id)) error = SA_ERR_HPI_NOT_PRESENT; oh_release_domain(d); /* Unlock domain */ return error; } /** * oHpiHandlerFind **/ SaErrorT SAHPI_API oHpiHandlerFind ( SAHPI_IN SaHpiSessionIdT sid, SAHPI_IN SaHpiResourceIdT rid, SAHPI_OUT oHpiHandlerIdT *id ) { SaHpiDomainIdT did; struct oh_domain *d = NULL; unsigned int *hid = NULL; if (sid == 0) return SA_ERR_HPI_INVALID_SESSION; if (!id || !rid) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(sid); OH_GET_DID(sid, did); OH_GET_DOMAIN(did, d); /* Lock domain */ if (oh_init()) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_INTERNAL_ERROR; } hid = (unsigned int *)oh_get_resource_data(&d->rpt, rid); if (hid == NULL) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_INVALID_RESOURCE; } *id = *hid; oh_release_domain(d); /* Unlock domain */ return SA_OK; } /** * oHpiHandlerRetry **/ SaErrorT SAHPI_API oHpiHandlerRetry ( SAHPI_IN SaHpiSessionIdT sid, SAHPI_IN oHpiHandlerIdT id ) { SaHpiDomainIdT did; struct oh_domain *d = NULL; struct oh_handler *h = NULL; SaErrorT error = SA_OK; if (sid == 0) return SA_ERR_HPI_INVALID_SESSION; if (id == 0) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(sid); OH_GET_DID(sid, did); OH_GET_DOMAIN(did, d); /* Lock domain */ if (oh_init()) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_INTERNAL_ERROR; } h = oh_get_handler(id); if (!h) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } if (h->hnd != NULL) { // handler already running oh_release_handler(h); oh_release_domain(d); /* Unlock domain */ return SA_OK; } h->hnd = h->abi->open(h->config, h->id, oh_process_q); if (h->hnd == NULL) error = SA_ERR_HPI_INTERNAL_ERROR; else error = SA_OK; oh_release_handler(h); oh_release_domain(d); /* Unlock domain */ return error; } /* Global parameters */ /** * oHpiGlobalParamGet **/ SaErrorT SAHPI_API oHpiGlobalParamGet ( SAHPI_IN SaHpiSessionIdT sid, SAHPI_INOUT oHpiGlobalParamT *param ) { SaHpiDomainIdT did; struct oh_domain *d = NULL; struct oh_global_param p; if (sid == 0) return SA_ERR_HPI_INVALID_SESSION; if (!param || !param->Type) { return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(sid); OH_GET_DID(sid, did); OH_GET_DOMAIN(did, d); /* Lock domain */ if (oh_init()) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_INTERNAL_ERROR; } // TODO fix this ugly cast p.type = (oh_global_param_type)param->Type; if (oh_get_global_param(&p)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_UNKNOWN; } memcpy(¶m->u, &p.u, sizeof(oh_global_param_union)); oh_release_domain(d); /* Unlock domain */ return SA_OK; } /** * oHpiGlobalParamSet **/ SaErrorT SAHPI_API oHpiGlobalParamSet ( SAHPI_IN SaHpiSessionIdT sid, SAHPI_IN oHpiGlobalParamT *param ) { SaHpiDomainIdT did; struct oh_domain *d = NULL; struct oh_global_param p; if (sid == 0) return SA_ERR_HPI_INVALID_SESSION; if (!param || !param->Type) { return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(sid); OH_GET_DID(sid, did); OH_GET_DOMAIN(did, d); /* Lock domain */ if (oh_init()) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_INTERNAL_ERROR; } // TODO fix this ugly cast p.type = (oh_global_param_type)param->Type; memcpy(&p.u, ¶m->u, sizeof(oh_global_param_union)); if (oh_set_global_param(&p)){ oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_ERROR; } oh_release_domain(d); /* Unlock domain */ return SA_OK; } /** * oHpiInjectEvent **/ SaErrorT SAHPI_API oHpiInjectEvent ( SAHPI_IN SaHpiSessionIdT sid, SAHPI_IN oHpiHandlerIdT id, SAHPI_IN SaHpiEventT *event, SAHPI_IN SaHpiRptEntryT *rpte, SAHPI_IN SaHpiRdrT *rdr) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaErrorT (*inject_event)(void *hnd, SaHpiEventT *evt, SaHpiRptEntryT *rpte, SaHpiRdrT *rdr); /* TODO: Allow for an array/list of RDRs */ struct oh_handler *h = NULL; SaErrorT error = SA_OK; if (sid == 0){ return SA_ERR_HPI_INVALID_SESSION; } if (id == 0) { return SA_ERR_HPI_INVALID_PARAMS; } if (!event) { return SA_ERR_HPI_INVALID_PARAMS; } if (!rpte) { return SA_ERR_HPI_INVALID_PARAMS; } if (!rdr) { return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(sid); OH_GET_DID(sid, did); OH_GET_DOMAIN(did, d); /* Lock domain */ if (oh_init()) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_INTERNAL_ERROR; } h = oh_get_handler(id); inject_event = h ? h->abi->inject_event : NULL; if (!inject_event) { oh_release_handler(h); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_INVALID_CMD; } error = inject_event(h->hnd, event, rpte, rdr); oh_release_handler(h); oh_release_domain(d); /* Unlock domain */ return error; } /** * oHpiDomainAdd * Currently only available in client library, but not in daemon **/ SaErrorT SAHPI_API oHpiDomainAdd ( SAHPI_IN const SaHpiTextBufferT *host, SAHPI_IN SaHpiUint16T port, SAHPI_IN const SaHpiEntityPathT *entity_root, SAHPI_OUT SaHpiDomainIdT *domain_id ) { return SA_ERR_HPI_UNSUPPORTED_API; } /** * oHpiDomainAddById * Currently only available in client library, but not in daemon **/ SaErrorT SAHPI_API oHpiDomainAddById ( SAHPI_IN SaHpiDomainIdT domain_id, SAHPI_IN const SaHpiTextBufferT *host, SAHPI_IN SaHpiUint16T port, SAHPI_IN const SaHpiEntityPathT *entity_root ) { return SA_ERR_HPI_UNSUPPORTED_API; } /** * oHpiDomainEntryGet * Currently only available in client library, but not in daemon **/ SaErrorT SAHPI_API oHpiDomainEntryGet ( SAHPI_IN SaHpiEntryIdT EntryId, SAHPI_OUT SaHpiEntryIdT *NextEntryId, SAHPI_OUT oHpiDomainEntryT *DomainEntry ) { return SA_ERR_HPI_UNSUPPORTED_API; } openhpi-3.6.1/openhpid/hotswap.c0000644000175100017510000000546012575647301015631 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * (C) Copyright IBM Corp. 2003-2006 * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Louis Zhuang * Thomas Kanngieser * Racing Guo * David Judkovics * Renier Morales */ #include "hotswap.h" SaHpiTimeoutT get_hotswap_auto_insert_timeout(struct oh_domain *d) { return d->ai_timeout; } void set_hotswap_auto_insert_timeout(struct oh_domain *d, SaHpiTimeoutT to) { d->ai_timeout = to; } /* * this function determines whether a hotswap transition is allowed */ SaHpiBoolT oh_allowed_hotswap_transition(SaHpiHsStateT from, SaHpiHsStateT to) { switch(from) { case SAHPI_HS_STATE_INACTIVE: if((to == SAHPI_HS_STATE_INSERTION_PENDING) || (to == SAHPI_HS_STATE_NOT_PRESENT)) { return SAHPI_TRUE; } else { return SAHPI_FALSE; } break; case SAHPI_HS_STATE_INSERTION_PENDING: if((to == SAHPI_HS_STATE_INACTIVE) || (to == SAHPI_HS_STATE_NOT_PRESENT) || (to == SAHPI_HS_STATE_ACTIVE)) { return SAHPI_TRUE; } else { return SAHPI_FALSE; } break; case SAHPI_HS_STATE_ACTIVE: if((to == SAHPI_HS_STATE_EXTRACTION_PENDING) || to == SAHPI_HS_STATE_NOT_PRESENT) { return SAHPI_TRUE; } else { return SAHPI_FALSE; } break; case SAHPI_HS_STATE_EXTRACTION_PENDING: if((to == SAHPI_HS_STATE_ACTIVE) || (to == SAHPI_HS_STATE_NOT_PRESENT) || (to == SAHPI_HS_STATE_INACTIVE)) { return SAHPI_TRUE; } else { return SAHPI_FALSE; } break; case SAHPI_HS_STATE_NOT_PRESENT: if(to == SAHPI_HS_STATE_INSERTION_PENDING) { return SAHPI_TRUE; } else { return SAHPI_FALSE; } break; default: return SAHPI_FALSE; } } openhpi-3.6.1/openhpid/alarm.h0000644000175100017510000000557312575647301015252 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004-2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * */ #ifndef __OH_ALARM_H #define __OH_ALARM_H #include #include #include #ifdef __cplusplus extern "C" { #endif #define OH_MAX_DAT_SIZE_LIMIT 0 #define OH_MAX_DAT_USER_LIMIT 0 /* Alarm Handling */ SaHpiAlarmT *oh_add_alarm(struct oh_domain *d, SaHpiAlarmT *alarm, int fromfile); SaHpiAlarmT *oh_get_alarm(struct oh_domain *d, SaHpiAlarmIdT *aid, SaHpiSeverityT *severity, SaHpiStatusCondTypeT *type, SaHpiResourceIdT *rid, SaHpiManufacturerIdT *mid, SaHpiSensorNumT *num, SaHpiEventStateT *state, SaHpiBoolT unacknowledged, int get_next); SaErrorT oh_remove_alarm(struct oh_domain *d, SaHpiSeverityT *severity, SaHpiStatusCondTypeT *type, SaHpiResourceIdT *rid, SaHpiManufacturerIdT *mid, SaHpiSensorNumT *num, SaHpiEventStateT *state, SaHpiEventStateT *deassert_mask, int multi); SaErrorT oh_close_alarmtable(struct oh_domain *d); SaHpiUint32T oh_count_alarms(struct oh_domain *d, SaHpiSeverityT sev); /* Alarm Triggers */ SaErrorT oh_detect_event_alarm(struct oh_domain *d, struct oh_event *e); SaErrorT oh_detect_res_sev_alarm(SaHpiDomainIdT did, SaHpiResourceIdT rid, SaHpiSeverityT new_sev); SaErrorT oh_detect_sensor_enable_alarm(SaHpiDomainIdT did, SaHpiResourceIdT rid, SaHpiSensorNumT num, SaHpiBoolT enable); SaErrorT oh_detect_sensor_mask_alarm(SaHpiDomainIdT did, SaHpiResourceIdT rid, SaHpiSensorNumT num, SaHpiSensorEventMaskActionT action, SaHpiEventStateT deassert_mask); /* Persistency */ SaErrorT oh_alarms_to_file(struct oh_dat *at, char *filename); SaErrorT oh_alarms_from_file(struct oh_domain *d, char *filename); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* __OH_ALARM_H */ openhpi-3.6.1/openhpid/openhpid-posix.cpp0000644000175100017510000003730612575647301017456 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004-2008 * (C) Copyright Pigeon Point Systems. 2010 * (C) Copyright Nokia Siemens Networks 2010 * (C) Copyright Ulrich Kleber 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley * David Judkoivcs * Renier Morales * Anton Pak * Ulrich Kleber * */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "event.h" #include "init.h" #include "server.h" #include "threaded.h" /*--------------------------------------------------------------------*/ /* Globals */ /*--------------------------------------------------------------------*/ static gchar *cfgfile = NULL; static gboolean verbose_flag = FALSE; static gchar *bindaddr = NULL; static gint port = OPENHPI_DEFAULT_DAEMON_PORT; static gchar *portstr = NULL; static gchar *optpidfile = NULL; static gint sock_timeout = 0; // unlimited -- TODO: unlimited or 30 minutes default? was unsigned int static gint max_threads = -1; // unlimited static gboolean runasforeground = FALSE; static bool daemonized = false; static gboolean enableIPv4 = FALSE; static gboolean enableIPv6 = FALSE; #ifdef HAVE_ENCRYPT static gboolean g_decrypt = FALSE; static gchar * gcrypt_str = NULL; #endif static GOptionEntry daemon_options[] = { { "cfg", 'c', 0, G_OPTION_ARG_FILENAME, &cfgfile, "Sets path/name of the configuration file.\n" " This option is required unless the environment\n" " variable OPENHPI_CONF has been set to a valid\n" " configuration file.", "conf_file" }, { "verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose_flag, "This option causes the daemon to display verbose\n" " messages. This option is optional.", NULL }, { "bind", 'b', 0, G_OPTION_ARG_STRING, &bindaddr, "Bind address for the daemon socket.\n" " Also bind address can be specified with\n" " OPENHPI_DAEMON_BIND_ADDRESS environment variable.\n" " No bind address is used by default.", "bind_address" }, { "port", 'p', 0, G_OPTION_ARG_STRING, &portstr, "Overrides the default listening port (4743) of\n" " the daemon. The option is optional.", "port" }, { "pidfile", 'f', 0, G_OPTION_ARG_FILENAME, &optpidfile, "Overrides the default path/name for the daemon.\n" " pid file. The option is optional.", "pidfile" }, { "timeout", 's', 0, G_OPTION_ARG_INT, &sock_timeout, "Overrides the default socket read timeout of 30\n" " minutes. The option is optional.", "seconds" }, { "threads", 't', 0, G_OPTION_ARG_INT, &max_threads, "Sets the maximum number of connection threads.\n" " The default is umlimited. The option is optional.","threads" }, { "nondaemon", 'n', 0, G_OPTION_ARG_NONE, &runasforeground, "Forces the code to run as a foreground process\n" " and NOT as a daemon. The default is to run as\n" " a daemon. The option is optional.", NULL }, #ifdef HAVE_ENCRYPT { "decrypt", 'd', 0, G_OPTION_ARG_NONE, &g_decrypt, "Config file encrypted with hpicrypt. Decrypt and read", NULL }, #endif { "ipv6", '6', 0, G_OPTION_ARG_NONE, &enableIPv6, "The daemon will try to bind IPv6 socket.", NULL }, { "ipv4", '4', 0, G_OPTION_ARG_NONE, &enableIPv4, "The daemon will try to bind IPv4 socket (default).\n" " IPv6 option takes precedence over IPv4 option.", NULL }, { NULL } }; /*--------------------------------------------------------------------*/ /* Function: display_help */ /*--------------------------------------------------------------------*/ void display_help(void) { printf("Usage:\n"); printf(" openhpid [OPTION...] - HPI instance to which multiple clients can connect.\n\n"); printf("A typical invocation might be\n"); printf(" ./openhpid -c /etc/openhpi/openhpi.conf\n\n"); printf("Help Options:\n"); printf(" -h, --help Show help options\n\n"); printf("Application Options:\n"); printf(" -c, --cfg=conf_file Sets path/name of the configuration file.\n"); printf(" This option is required unless the environment\n"); printf(" variable OPENHPI_CONF has been set to a valid\n"); printf(" configuration file.\n"); printf(" -v, --verbose This option causes the daemon to display verbose\n"); printf(" messages. This option is optional.\n"); printf(" -b, --bind Sets bind address for the daemon socket.\n"); printf(" Also bind address can be specified with\n"); printf(" OPENHPI_DAEMON_BIND_ADDRESS environment variable.\n"); printf(" No bind address is used by default.\n"); printf(" -p, --port=port Overrides the default listening port (4743) of\n"); printf(" the daemon. The option is optional.\n"); printf(" -f, --pidfile=pidfile Overrides the default path/name for the daemon.\n"); printf(" pid file. The option is optional.\n"); printf(" -s, --timeout=seconds Overrides the default socket read timeout of 30\n"); printf(" minutes. The option is optional.\n"); printf(" -t, --threads=threads Sets the maximum number of connection threads.\n"); printf(" The default is umlimited. The option is optional.\n"); printf(" -n, --nondaemon Forces the code to run as a foreground process\n"); printf(" and NOT as a daemon. The default is to run as\n"); printf(" a daemon. The option is optional.\n"); #ifdef HAVE_ENCRYPT printf(" -d, --decrypt Configuration file is encrypted. Decrypt and read.\n"); #endif printf(" -6, --ipv6 The daemon will try to bind IPv6 socket.\n"); printf(" -4, --ipv4 The daemon will try to bind IPv4 socket (default).\n"); printf(" IPv6 option takes precedence over IPv4 option.\n\n"); } /*--------------------------------------------------------------------*/ /* Logging Utility Functions */ /*--------------------------------------------------------------------*/ static const char * get_log_level_name(GLogLevelFlags log_level) { if (log_level & G_LOG_LEVEL_ERROR) { return "ERR"; } else if (log_level & G_LOG_LEVEL_CRITICAL) { return "CRIT"; } else if (log_level & G_LOG_LEVEL_WARNING) { return "WARN"; } else if (log_level & G_LOG_LEVEL_MESSAGE) { return "MSG"; } else if (log_level & G_LOG_LEVEL_INFO) { return "INFO"; } else if (log_level & G_LOG_LEVEL_DEBUG) { return "DBG"; } return "???"; } static int get_syslog_level(GLogLevelFlags log_level) { if (log_level & G_LOG_LEVEL_ERROR) { return LOG_ERR; } else if (log_level & G_LOG_LEVEL_CRITICAL) { return LOG_CRIT; } else if (log_level & G_LOG_LEVEL_WARNING) { return LOG_WARNING; } else if (log_level & G_LOG_LEVEL_MESSAGE) { return LOG_NOTICE; } else if (log_level & G_LOG_LEVEL_INFO) { return LOG_INFO; } else if (log_level & G_LOG_LEVEL_DEBUG) { return LOG_DEBUG; } return LOG_INFO; } void log_handler(const gchar *log_domain, GLogLevelFlags log_level, const gchar *message, gpointer /*user_data */) { if ((!verbose_flag) && ((log_level & G_LOG_LEVEL_CRITICAL) == 0) ) { return; } if (!daemonized) { printf("%s: %s: %s\n", log_domain, get_log_level_name(log_level), message); } else { syslog(LOG_DAEMON | get_syslog_level(log_level), "%s: %s\n", log_domain, message); } } /*--------------------------------------------------------------------*/ /* PID File Unility Functions */ /*--------------------------------------------------------------------*/ bool check_pidfile(const char *pidfile) { // TODO add more checks here if (!pidfile) { return false; } int fd = open(pidfile, O_RDONLY); if (fd >= 0) { char buf[32]; memset(buf, 0, sizeof(buf)); ssize_t len = read(fd, buf, sizeof(buf) - 1); if (len < 0) { CRIT("Cannot read from PID file."); return false; } close(fd); int pid = atoi(buf); if ((pid > 0) && (pid == getpid() || (kill(pid, 0) < 0))) { unlink(pidfile); } else { CRIT("There is another active OpenHPI daemon."); return false; } } return true; } bool update_pidfile(const char *pidfile) { // TODO add more checks here if (!pidfile) { return false; } int fd = open(pidfile, O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR|S_IRGRP); if (fd < 0) { CRIT("Cannot open PID file."); return false; } char buf[32]; snprintf(buf, sizeof(buf), "%d\n", (int)getpid()); write(fd, buf, strlen(buf)); close(fd); return true; } /*--------------------------------------------------------------------*/ /* Function: daemonize */ /*--------------------------------------------------------------------*/ static bool daemonize(const char *pidfile) { if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) { return false; } pid_t pid; pid = fork(); if (pid < 0) { return false; } else if (pid > 0) { exit(0); } // Become the session leader setsid(); // Second fork to make sure we are detached // from any controlling terminal. pid = fork(); if (pid < 0) { return false; } else if (pid > 0) { exit(0); } daemonized = true; update_pidfile(pidfile); //chdir("/"); umask(0); // Reset default file permissions // Close unneeded inherited file descriptors // Keep stdout and stderr open if they already are. #ifdef NR_OPEN for (int i = 3; i < NR_OPEN; i++) { #else for (int i = 3; i < 1024; i++) { #endif close(i); } return true; } static void sig_handler( int signum ) { // Handles SIGTERM and SIGINT oh_post_quit_event(); oh_server_request_stop(); oh_signal_service(); } /*--------------------------------------------------------------------*/ /* Function: main */ /*--------------------------------------------------------------------*/ int main(int argc, char *argv[]) { int ipvflags; const char *pidfile = "/var/run/openhpid.pid"; GError *error = NULL; GOptionContext *context; g_log_set_default_handler(log_handler, 0); /* get the command line options */ context = g_option_context_new ("- HPI instance to which multiple clients can connect.\n\n" "A typical invocation might be\n" " ./openhpid -c /etc/openhpi/openhpi.conf\n"); g_option_context_add_main_entries (context, daemon_options, NULL); if (!g_option_context_parse (context, &argc, &argv, &error)) { CRIT ("option parsing failed: %s",error->message); display_help(); exit(-1); } if (cfgfile) { setenv("OPENHPI_CONF", cfgfile, 1); } else { cfgfile = getenv("OPENHPI_CONF"); } if (bindaddr) { setenv("OPENHPI_DAEMON_BIND_ADDRESS", bindaddr, 1); } else { bindaddr = getenv("OPENHPI_DAEMON_BIND_ADDRESS"); } if (portstr) { setenv("OPENHPI_DAEMON_PORT", portstr, 1); } else { portstr = getenv("OPENHPI_DAEMON_PORT"); } if (portstr) { port = atoi(portstr); } #ifdef HAVE_ENCRYPT if (g_decrypt) { setenv("OPENHPI_GCRYPT", "1", 1); } else { gcrypt_str = getenv("OPENHPI_GCRYPT"); } #endif ipvflags = ( enableIPv6 == TRUE ) ? FlagIPv6 : FlagIPv4; if (optpidfile) { pidfile = g_strdup(optpidfile); } // see if any invalid parameters are given if (sock_timeout<0) { CRIT("Socket timeout value must be positive. Exiting."); display_help(); } // see if we have a valid configuration file if ((!cfgfile) || (!g_file_test(cfgfile, G_FILE_TEST_EXISTS))) { CRIT("Cannot find configuration file %s. Exiting.",cfgfile); display_help(); exit(-1); } // see if we are already running if (!check_pidfile(pidfile)) { CRIT("PID file check failed. Exiting."); display_help(); exit(1); } if (!update_pidfile(pidfile)) { CRIT("Cannot update PID file. Exiting."); display_help(); exit(1); } if (signal(SIGTERM, sig_handler) == SIG_ERR) { CRIT("Cannot set SIGTERM handler. Exiting."); exit(1); } if (signal(SIGINT, sig_handler) == SIG_ERR) { CRIT("Cannot set SIGINT handler. Exiting."); exit(1); } if (!runasforeground) { if (!daemonize(pidfile)) { exit(8); } } // announce ourselves INFO("Starting OpenHPI %s.", VERSION); if (cfgfile) { INFO("OPENHPI_CONF = %s.", cfgfile); } if (bindaddr) { INFO("OPENHPI_DAEMON_BIND_ADDRESS = %s.", bindaddr); } INFO("OPENHPI_DAEMON_PORT = %u.", port); INFO("Enabled IP versions:%s%s.", (ipvflags & FlagIPv4) ? " IPv4" : "", (ipvflags & FlagIPv6) ? " IPv6" : ""); INFO("Max threads: %d.", max_threads); INFO("Socket timeout(sec): %d.", sock_timeout); if (oh_init()) { // Initialize OpenHPI CRIT("There was an error initializing OpenHPI. Exiting."); return 8; } bool rc = oh_server_run(ipvflags, bindaddr, port, sock_timeout, max_threads); if (!rc) { return 9; } if (oh_finit()) { CRIT("There was an error finalizing OpenHPI. Exiting."); return 8; } return 0; } openhpi-3.6.1/openhpid/server.h0000644000175100017510000000151512575647301015454 0ustar mohanmohan/* -*- c++ -*- * * (C) Copyright Pigeon Point Systems. 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak * */ #ifndef __OH_SERVER_H #define __OH_SERVER_H #include #include bool oh_server_run( int ipvflags, const char * bindaddr, uint16_t port, unsigned int sock_timeout, int max_threads ); void oh_server_request_stop( void ); #endif /* __OH_SERVER_H */ openhpi-3.6.1/openhpid/version.rc0000644000175100017510000000160212575647301016005 0ustar mohanmohan#include LANGUAGE 0x09,0x01 // English(US) VS_VERSION_INFO VERSIONINFO FILEVERSION BINARY_VERSION PRODUCTVERSION BINARY_VERSION FILEFLAGSMASK 0 FILEFLAGS 0 FILEOS VOS_NT_WINDOWS32 FILETYPE VFT_APP FILESUBTYPE VFT2_UNKNOWN BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904E4" // English(US), Multilingual BEGIN VALUE "Comments", "" VALUE "CompanyName", "OpenHPI Community (http://openhpi.org/)" VALUE "FileDescription", "OpenHPI Daemon" VALUE "FileVersion", VERSION VALUE "InternalName", "openhpid" VALUE "LegalCopyright", "OpenHPI is distributed under BSD license" VALUE "OriginalFilename", "openhpid.exe" VALUE "ProductName", "OpenHPI" VALUE "ProductVersion", VERSION END END END openhpi-3.6.1/openhpid/lock.h0000644000175100017510000000141512575647301015075 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * (C) Copyright IBM Corp. 2003, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Louis Zhuang * Renier Morales */ #ifndef __OH_LOCK_H #define __OH_LOCK_H #ifdef __cplusplus extern "C" { #endif void data_access_lock(void); void data_access_unlock(void); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* __OH_LOCK_H */ openhpi-3.6.1/openhpid/openhpid.sh.in0000644000175100017510000001051112575647301016540 0ustar mohanmohan#! /bin/sh # ### BEGIN INIT INFO # Provides: openhpid # Required-Start: $network $remote_fs $syslog # Required-Stop: $network $remote_fs $syslog # Should-Start: $named # Should-Stop: $named # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Start OpenHPI daemon at boot time # Description: Enable OpenHPI service which is provided by openhpid. ### END INIT INFO # # openhpid.sh Start/Stop the openhpi daemon. # # description: openhpid is standard UNIX program which uses the OpenHPI \ # APIs and provides a standard internet server to access those \ # APIs for client programs. # processname: openhpid # config: the standard openhpi conf file specified on the command line or the env. # pidfile: /var/run/openhpid.pid # # Author(s): # W. David Ashley # Daniel de Araujo # Source function library. PATH=/sbin:/bin:/usr/sbin:/usr/bin prog="openhpid" # If the openhpid executable is not available, we can't do any of this test -f @prefix@/sbin/openhpid || exit 0 # Determine whether the lsb package is installed # If it is, determine which lsb is installed: # redhat, suse, or standard lsb if test -f /etc/init.d/functions then lsbtype="rh" . /etc/init.d/functions elif test -f /etc/rc.status then lsbtype="suse" . /etc/rc.status elif test -f /lib/lsb/init-functions then lsbtype="lsb" . /lib/lsb/init-functions elif test -f /etc/gentoo-release then lsbtype="gentoo" . /sbin/functions.sh else lsbtype="nolsb" fi print_outcome() { case "${lsbtype}" in rh) echo [ "$?" -eq 0 ] ;; suse) rc_status -v ;; lsb) if test "$?" -eq 0 then log_success_msg "success" else log_failure_msg "failed" fi ;; gentoo) eend $? ;; nolsb) if test "$?" -eq 0 then echo " ... success" fi if test "$?" -ne 0 then echo " ... failed" fi ;; esac } start() { case "${lsbtype}" in rh) echo -n "Starting $prog: " daemon @prefix@/sbin/openhpid -c @CONFPATH@/@HPI_PKG@.conf RETVAL=$? ;; suse) echo -n "Starting $prog: " startproc @prefix@/sbin/openhpid -c @CONFPATH@/@HPI_PKG@.conf RETVAL=$? ;; lsb) echo -n "Starting $prog: " start_daemon @prefix@/sbin/openhpid -c @CONFPATH@/@HPI_PKG@.conf RETVAL=$? ;; gentoo) ebegin "Starting $prog: " start-stop-daemon --start --quiet --exec @prefix@/sbin/openhpid -- -c @CONFPATH@/@HPI_PKG@.conf RETVAL=$? ;; nolsb) echo -n "Starting $prog: " @prefix@/sbin/openhpid -c @CONFPATH@/@HPI_PKG@.conf RETVAL=$? ;; esac print_outcome } stop() { case "${lsbtype}" in rh | lsb | suse) echo -n "Stopping $prog: " killproc @prefix@/sbin/openhpid RETVAL=$? ;; gentoo) ebegin "Stopping $prog: " start-stop-daemon --stop --quiet --exec @prefix@/sbin/openhpid RETVAL=$? ;; nolsb) echo -n "Stopping $prog: " if test -f /var/run/openhpid.pid && test "`cat /var/run/openhpid.pid`" != "" then kill "`cat /var/run/openhpid.pid`" RETVAL=$? else RETVAL=0 fi ;; esac print_outcome if test "$RETVAL" -eq 0 && test -f /var/run/openhpid.pid then rm -f /var/lock/openhpid rm -f /var/run/openhpid.pid fi } dstatus() { echo "Checking for $prog daemon: " case "${lsbtype}" in rh) status @prefix@/sbin/openhpid ;; suse) checkproc @prefix@/sbin/openhpid rc_status -v ;; lsb) pid="`pidofproc @prefix@/sbin/openhpid`" if test "${pid}" != "" then log_success_msg "$prog is running" else log_success_msg "$prog is not running" fi ;; gentoo | nolsb) if test -f /var/run/openhpid.pid && test "`cat /var/run/openhpid.pid`" != "" && kill -s 0 "`cat /var/run/openhpid.pid`" then echo "$prog is running" else echo "$prog is not running" fi ;; esac } restart() { stop start } force_reload() { # We don't currently support a reload, but can do a restart stop start } # See how we were called. case "$1" in start) start ;; stop) stop ;; restart) restart ;; status) dstatus ;; force-reload) force_reload ;; *) echo "Usage: $0 {start|stop|restart|status|force-reload}" exit 1 esac openhpi-3.6.1/cpp/0000755000175100017510000000000012605014540012732 5ustar mohanmohanopenhpi-3.6.1/cpp/oSaHpiCtrlRec.cpp0000644000175100017510000001604512575647263016132 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiCtrlDefaultMode.hpp" #include "oSaHpiCtrlRecDigital.hpp" #include "oSaHpiCtrlRecDiscrete.hpp" #include "oSaHpiCtrlRecAnalog.hpp" #include "oSaHpiCtrlRecStream.hpp" #include "oSaHpiCtrlRecText.hpp" #include "oSaHpiCtrlRecOem.hpp" #include "oSaHpiCtrlRec.hpp" /** * Default constructor. */ oSaHpiCtrlRec::oSaHpiCtrlRec() { Num = 1; OutputType = SAHPI_CTRL_GENERIC; Type = SAHPI_CTRL_TYPE_DIGITAL; TypeUnion.Digital.Default = SAHPI_CTRL_STATE_OFF; DefaultMode.Mode = SAHPI_CTRL_MODE_AUTO; DefaultMode.ReadOnly = false; WriteOnly = false; Oem = 0; }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiCtrlRec::oSaHpiCtrlRec(const oSaHpiCtrlRec& cr) { memcpy(this, &cr, sizeof(SaHpiCtrlRecT)); } /** * Assign a field in the SaHpiCtrlRecT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiCtrlRec::assignField(SaHpiCtrlRecT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "Num") == 0) { ptr->Num = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "OutputType") == 0) { ptr->OutputType = oSaHpiTypesEnums::str2ctrloutputtype(value); return false; } else if (strcmp(field, "Type") == 0) { ptr->Type = oSaHpiTypesEnums::str2ctrltype(value); return false; } // Digital // Discrete // Analog // Stream // Text //Oem else if (strcmp(field, "WriteOnly") == 0) { ptr->WriteOnly = oSaHpiTypesEnums::str2torf(value); return false; } else if (strcmp(field, "Oem") == 0) { ptr->Oem = strtoul(value, NULL, 10); return false; } return true; }; /** * Print the contents of the entity. * * @param stream Target stream. * @param buffer Address of the SaHpiCtrlRecT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiCtrlRec::fprint(FILE *stream, const int indent, const SaHpiCtrlRecT *cr) { int i, err = 0; char indent_buf[indent + 1]; if (stream == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Num = %d\n", cr->Num); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "OutputType = %s\n", oSaHpiTypesEnums::ctrloutputtype2str(cr->OutputType)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Type = %s\n", oSaHpiTypesEnums::ctrltype2str(cr->Type)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } switch (cr->Type) { case SAHPI_CTRL_TYPE_DIGITAL: { err = fprintf(stream, "TypeUnion.Digital\n"); if (err < 0) { return true; } const SaHpiCtrlRecDigitalT *crd = (const SaHpiCtrlRecDigitalT *)&cr->TypeUnion.Digital; err = oSaHpiCtrlRecDigital::fprint(stream, indent + 3, crd); if (err < 0) { return true; } break; } case SAHPI_CTRL_TYPE_DISCRETE: { err = fprintf(stream, "TypeUnion.Discrete\n"); if (err < 0) { return true; } const SaHpiCtrlRecDiscreteT *crds = (const SaHpiCtrlRecDiscreteT *)&cr->TypeUnion.Discrete; err = oSaHpiCtrlRecDiscrete::fprint(stream, indent + 3, crds); if (err < 0) { return true; } break; } case SAHPI_CTRL_TYPE_ANALOG: { err = fprintf(stream, "TypeUnion.Analog\n"); if (err < 0) { return true; } const SaHpiCtrlRecAnalogT *cra = (const SaHpiCtrlRecAnalogT *)&cr->TypeUnion.Analog; err = oSaHpiCtrlRecAnalog::fprint(stream, indent + 3, cra); if (err < 0) { return true; } break; } case SAHPI_CTRL_TYPE_STREAM: { err = fprintf(stream, "TypeUnion.Stream\n"); if (err < 0) { return true; } const SaHpiCtrlRecStreamT *crs = (const SaHpiCtrlRecStreamT *)&cr->TypeUnion.Stream; err = oSaHpiCtrlRecStream::fprint(stream, indent + 3, crs); if (err < 0) { return true; } break; } case SAHPI_CTRL_TYPE_TEXT: { err = fprintf(stream, "TypeUnion.Text\n"); if (err < 0) { return true; } const SaHpiCtrlRecTextT *crt = (const SaHpiCtrlRecTextT *)&cr->TypeUnion.Text; err = oSaHpiCtrlRecText::fprint(stream, indent + 3, crt); if (err < 0) { return true; } break; } case SAHPI_CTRL_TYPE_OEM: { err = fprintf(stream, "TypeUnion.Oem\n"); if (err < 0) { return true; } const SaHpiCtrlRecOemT *cro = (const SaHpiCtrlRecOemT *)&cr->TypeUnion.Oem; err = oSaHpiCtrlRecOem::fprint(stream, indent + 3, cro); if (err < 0) { return true; } break; } default: break; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "DefaultMode\n"); if (err < 0) { return true; } const SaHpiCtrlDefaultModeT *dm = (const SaHpiCtrlDefaultModeT *)&cr->DefaultMode; err = oSaHpiCtrlDefaultMode::fprint(stream, indent + 3, dm); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "WriteOnly = %s\n", oSaHpiTypesEnums::torf2str(cr->WriteOnly)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Oem = %d\n", cr->Oem); if (err < 0) { return true; } return false; } openhpi-3.6.1/cpp/oSaHpiCondition.cpp0000644000175100017510000001376012575647263016523 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiEntityPath.hpp" #include "oSaHpiTextBuffer.hpp" #include "oSaHpiCondition.hpp" /** * Default constructor. */ oSaHpiCondition::oSaHpiCondition() { Type = SAHPI_STATUS_COND_TYPE_SENSOR; Entity.Entry[0].EntityType = SAHPI_ENT_ROOT; Entity.Entry[0].EntityLocation = 0; DomainId = SAHPI_UNSPECIFIED_DOMAIN_ID; ResourceId = 1; SensorNum = 1; EventState = SAHPI_ES_UNSPECIFIED; Name.Length = 0; Name.Value[0] = '\0'; Mid = SAHPI_MANUFACTURER_ID_UNSPECIFIED; Data.DataType = SAHPI_TL_TYPE_TEXT; Data.Language = SAHPI_LANG_ENGLISH; Data.DataLength = 0; Data.Data[0] = '\0'; }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiCondition::oSaHpiCondition(const oSaHpiCondition& buf) { memcpy(this, &buf, sizeof(SaHpiConditionT)); } /** * Assign a field in the SaHpiConditionT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiCondition::assignField(SaHpiConditionT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "Type") == 0) { ptr->Type = oSaHpiTypesEnums::str2statuscondtype(value); return false; } // Entity else if (strcmp(field, "DomainId") == 0) { if (strcmp(value, "SAHPI_UNSPECIFIED_DOMAIN_ID") == 0) { ptr->DomainId = SAHPI_UNSPECIFIED_DOMAIN_ID; } else { ptr->DomainId = strtoul(value, NULL, 10); } return false; } else if (strcmp(field, "ResourceId") == 0) { ptr->ResourceId = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "SensorNum") == 0) { ptr->SensorNum = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "EventState") == 0) { ptr->EventState = oSaHpiTypesEnums::str2eventstate(value); return false; } else if (strcmp(field, "Name") == 0) { if (strlen(value) < SA_HPI_MAX_NAME_LENGTH) { ptr->Name.Length = strlen(value); strcpy((char *)ptr->Name.Value, value); } else { ptr->Name.Length = SA_HPI_MAX_NAME_LENGTH; memcpy(ptr->Name.Value, value, SA_HPI_MAX_NAME_LENGTH); } return false; } else if (strcmp(field, "Mid") == 0) { ptr->Mid = atoi(value); return false; } // Data return true; }; /** * Print the contents of the buffer. * * @param stream Target stream. * @param buffer Address of the SaHpiConditionT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiCondition::fprint(FILE *stream, const int indent, const SaHpiConditionT *buffer) { int i, err; char indent_buf[indent + 1]; if (stream == NULL || buffer == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Type = %s\n", oSaHpiTypesEnums::statuscondtype2str(buffer->Type)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Entity\n"); const SaHpiEntityPathT *ep = (const SaHpiEntityPathT *)&buffer->Entity; err = oSaHpiEntityPath::fprint(stream, indent + 3, ep); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "ResourceId = %d\n", buffer->ResourceId); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "SensorNum = %d\n", buffer->SensorNum); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "EventState = %s\n", oSaHpiTypesEnums::eventstate2str(buffer->EventState)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Name = "); for (i = 0; i < buffer->Name.Length; i++) { err = fprintf(stream, "%c\n", buffer->Name.Value[i]); if (err < 0) { return true; } } err = fprintf(stream, "\n"); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Mid = %d\n", buffer->Mid); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Data\n"); if (err < 0) { return true; } const SaHpiTextBufferT * tb = (const SaHpiTextBufferT *)&buffer->Data; err = oSaHpiTextBuffer::fprint(stream, indent + 3, tb); if (err < 0) { return true; } return false; } openhpi-3.6.1/cpp/oSaHpiResourceInfo.cpp0000644000175100017510000001275612575647263017204 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiResourceInfo.hpp" /** * Default constructor. */ oSaHpiResourceInfo::oSaHpiResourceInfo() { int i; ResourceRev = 0; SpecificVer = 0; DeviceSupport = 0; ManufacturerId = SAHPI_MANUFACTURER_ID_UNSPECIFIED; ProductId = 0; FirmwareMajorRev = 0; FirmwareMinorRev = 0; AuxFirmwareRev = 0; for (i = 0; i < 16; i++) { Guid[i] = 0; } }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiResourceInfo::oSaHpiResourceInfo(const oSaHpiResourceInfo& buf) { memcpy(this, &buf, sizeof(SaHpiResourceInfoT)); } /** * Assign a field in the SaHpiResourceInfoT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiResourceInfo::assignField(SaHpiResourceInfoT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "ResourceRev") == 0) { ptr->ResourceRev = (SaHpiUint8T)strtoul(value, NULL, 10); return false; } else if (strcmp(field, "SpecificVer") == 0) { ptr->SpecificVer = (SaHpiUint8T)strtoul(value, NULL, 10); return false; } else if (strcmp(field, "DeviceSupport") == 0) { ptr->DeviceSupport = (SaHpiUint8T)strtoul(value, NULL, 10); return false; } else if (strcmp(field, "ManufacturerId") == 0) { ptr->ManufacturerId = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "ProductId") == 0) { ptr->ProductId = (SaHpiUint8T)strtoul(value, NULL, 10); return false; } else if (strcmp(field, "FirmwareMajorRev") == 0) { ptr->FirmwareMajorRev = (SaHpiUint8T)strtoul(value, NULL, 10); return false; } else if (strcmp(field, "FirmwareMinorRev") == 0) { ptr->FirmwareMinorRev = (SaHpiUint8T)strtoul(value, NULL, 10); return false; } else if (strcmp(field, "AuxFirmwareRev") == 0) { ptr->AuxFirmwareRev = (SaHpiUint8T)strtoul(value, NULL, 10); return false; } // Guid return true; }; /** * Print the contents of the buffer. * * @param stream Target stream. * @param buffer Address of the SaHpiResourceInfoT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiResourceInfo::fprint(FILE *stream, const int indent, const SaHpiResourceInfoT *buffer) { int i, err; char indent_buf[indent + 1]; if (stream == NULL || buffer == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "ResourceRev = %u\n", buffer->ResourceRev); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "SpecificVer = %u\n", buffer->SpecificVer); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "DeviceSupport = %u\n", buffer->DeviceSupport); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "ManufacturerId = %u\n", buffer->ManufacturerId); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "ProductId = %u\n", buffer->ProductId); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "FirmwareMajorRev = %u\n", buffer->FirmwareMajorRev); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "FirmwareMinorRev = %u\n", buffer->FirmwareMinorRev); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "AuxFirmwareRev = %u\n", buffer->AuxFirmwareRev); if (err < 0) { return true; } for (i = 0; i < 16; i++) { err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Guid[%d] = %u\n", i, buffer->Guid[i]); if (err < 0) { return true; } } return false; } openhpi-3.6.1/cpp/oSaHpiHpiSwEvent.hpp0000644000175100017510000000310112575647263016622 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiHpiSwEvent #define Included_oSaHpiHpiSwEvent #include extern "C" { #include } class oSaHpiHpiSwEvent : public SaHpiHpiSwEventT { public: // constructors oSaHpiHpiSwEvent(); // copy constructor oSaHpiHpiSwEvent(const oSaHpiHpiSwEvent& buf); // destructor ~oSaHpiHpiSwEvent() { } // other methods static bool assignField(SaHpiHpiSwEventT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiHpiSwEventT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiHpiSwEventT *buffer); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-3.6.1/cpp/oSaHpiEntityPath.hpp0000644000175100017510000000332512575647263016667 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiEntityPath #define Included_oSaHpiEntityPath #include extern "C" { #include } class oSaHpiEntityPath : public SaHpiEntityPathT { public: // constructors oSaHpiEntityPath(); // copy constructor oSaHpiEntityPath(const oSaHpiEntityPath& entpath); // destructor ~oSaHpiEntityPath() { } // other methods inline SaHpiEntityPathT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiEntityPathT *entpath); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } bool append(SaHpiEntityPathT *destpath, const SaHpiEntityPathT *appendpath); inline bool append(SaHpiEntityPathT *appendpath) { return append((SaHpiEntityPathT *)this, appendpath); } bool compare(const SaHpiEntityPathT *ep1, const SaHpiEntityPathT *ep2); inline bool compare(const SaHpiEntityPathT *ep2) { return compare((SaHpiEntityPathT *)this, ep2); } }; #endif openhpi-3.6.1/cpp/oSaHpiSensorEvent.hpp0000644000175100017510000000315312575647263017050 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiSensorEvent #define Included_oSaHpiSensorEvent #include extern "C" { #include } #include "oSaHpiSensorReading.hpp" class oSaHpiSensorEvent : public SaHpiSensorEventT { public: // constructors oSaHpiSensorEvent(); // copy constructor oSaHpiSensorEvent(const oSaHpiSensorEvent& sr); // destructor ~oSaHpiSensorEvent() { } // other methods static bool assignField(SaHpiSensorEventT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiSensorEventT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiSensorEventT *ent); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-3.6.1/cpp/oSaHpiSensorEnableChangeEvent.hpp0000644000175100017510000000331412575647263021264 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiSensorEnableChangeEvent #define Included_oSaHpiSensorEnableChangeEvent #include extern "C" { #include } class oSaHpiSensorEnableChangeEvent : public SaHpiSensorEnableChangeEventT { public: // constructors oSaHpiSensorEnableChangeEvent(); // copy constructor oSaHpiSensorEnableChangeEvent(const oSaHpiSensorEnableChangeEvent& sr); // destructor ~oSaHpiSensorEnableChangeEvent() { } // other methods static bool assignField(SaHpiSensorEnableChangeEventT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiSensorEnableChangeEventT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiSensorEnableChangeEventT *ent); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-3.6.1/cpp/oSaHpiResourceEvent.hpp0000644000175100017510000000314212575647263017364 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiResourceEvent #define Included_oSaHpiResourceEvent #include extern "C" { #include } class oSaHpiResourceEvent : public SaHpiResourceEventT { public: // constructors oSaHpiResourceEvent(); // copy constructor oSaHpiResourceEvent(const oSaHpiResourceEvent& buf); // destructor ~oSaHpiResourceEvent() { } // other methods static bool assignField(SaHpiResourceEventT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiResourceEventT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiResourceEventT *buffer); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-3.6.1/cpp/oSaHpiIdrField.hpp0000644000175100017510000000305312575647263016256 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiIdrField #define Included_oSaHpiIdrField #include extern "C" { #include } class oSaHpiIdrField : public SaHpiIdrFieldT { public: // constructors oSaHpiIdrField(); // copy constructor oSaHpiIdrField(const oSaHpiIdrField& buf); // destructor ~oSaHpiIdrField() { } // other methods static bool assignField(SaHpiIdrFieldT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiIdrFieldT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiIdrFieldT *buffer); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-3.6.1/cpp/oSaHpiSensorReading.hpp0000644000175100017510000000342412575647263017341 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiSensorReading #define Included_oSaHpiSensorReading #include extern "C" { #include } #define ISSUPPORTED_DEFAULT false #define SAHPISENSORREADINGTYPET_DEFAULT SAHPI_SENSOR_READING_TYPE_INT64 class oSaHpiSensorReading : public SaHpiSensorReadingT { public: // constructors oSaHpiSensorReading(); // copy constructor oSaHpiSensorReading(const oSaHpiSensorReading& sr); // destructor ~oSaHpiSensorReading() { } // other methods static bool assignField(SaHpiSensorReadingT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiSensorReadingT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiSensorReadingT *ent); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } void initSensorReading(SaHpiSensorReadingT *reading); }; #endif openhpi-3.6.1/cpp/oSaHpiSensorEnableChangeEvent.cpp0000644000175100017510000001377112575647263021267 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiSensorEnableChangeEvent.hpp" /** * Default constructor. */ oSaHpiSensorEnableChangeEvent::oSaHpiSensorEnableChangeEvent() { SensorNum = 1; SensorType = SAHPI_TEMPERATURE; EventCategory = SAHPI_EC_UNSPECIFIED; SensorEnable = false; SensorEventEnable = false; AssertEventMask = SAHPI_ES_UNSPECIFIED; DeassertEventMask = SAHPI_ES_UNSPECIFIED; OptionalDataPresent = (SaHpiSensorOptionalDataT)0; CurrentState = SAHPI_ES_UNSPECIFIED; }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiSensorEnableChangeEvent::oSaHpiSensorEnableChangeEvent(const oSaHpiSensorEnableChangeEvent& range) { memcpy(this, &range, sizeof(SaHpiSensorEnableChangeEventT)); } /** * Assign a field in the SaHpiSensorEnableChangeEventT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiSensorEnableChangeEvent::assignField(SaHpiSensorEnableChangeEventT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "SensorNum") == 0) { ptr->SensorNum = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "SensorType") == 0) { ptr->SensorType = oSaHpiTypesEnums::str2sensortype(value); return false; } else if (strcmp(field, "EventCategory") == 0) { ptr->EventCategory |= oSaHpiTypesEnums::str2eventcategory(value); return false; } else if (strcmp(field, "SensorEnable") == 0) { ptr->SensorEnable = oSaHpiTypesEnums::str2torf(value); return false; } else if (strcmp(field, "SensorEventEnable") == 0) { ptr->SensorEventEnable = oSaHpiTypesEnums::str2torf(value); return false; } else if (strcmp(field, "AssertEventMask") == 0) { ptr->AssertEventMask |= oSaHpiTypesEnums::str2eventstate(value); return false; } else if (strcmp(field, "DeassertEventMask") == 0) { ptr->DeassertEventMask |= oSaHpiTypesEnums::str2eventstate(value); return false; } else if (strcmp(field, "OptionalDataPresent") == 0) { ptr->OptionalDataPresent |= oSaHpiTypesEnums::str2sensoroptionaldata(value); return false; } else if (strcmp(field, "CurrentState") == 0) { ptr->CurrentState |= oSaHpiTypesEnums::str2eventstate(value); return false; } return true; }; /** * Print the contents of the entity. * * @param stream Target stream. * @param buffer Address of the SaHpiSensorEnableChangeEventT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiSensorEnableChangeEvent::fprint(FILE *stream, const int indent, const SaHpiSensorEnableChangeEventT *se) { int i, err = 0; char indent_buf[indent + 1]; if (stream == NULL || se == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "SensorNum = %u\n", se->SensorNum); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "SensorType = %s\n", oSaHpiTypesEnums::sensortype2str(se->SensorType)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "EventCategory = %X\n", se->EventCategory); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "SensorEnable = %s\n", oSaHpiTypesEnums::torf2str(se->SensorEnable)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "SensorEventEnable = %s\n", oSaHpiTypesEnums::torf2str(se->SensorEventEnable)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "AssertEventMask = %X\n", se->AssertEventMask); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "DeassertEventMask = %X\n", se->DeassertEventMask); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "OptionalDataPresent = %X\n", se->OptionalDataPresent); if (err < 0) { return true; } if (se->OptionalDataPresent && SAHPI_SOD_CURRENT_STATE) { err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "CurrentState = %X\n", se->CurrentState); if (err < 0) { return true; } } return false; } openhpi-3.6.1/cpp/oSaHpiOemEvent.cpp0000644000175100017510000000576212575647263016322 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiTextBuffer.hpp" #include "oSaHpiOemEvent.hpp" /** * Default constructor. */ oSaHpiOemEvent::oSaHpiOemEvent() { MId = SAHPI_MANUFACTURER_ID_UNSPECIFIED; OemEventData.DataType = SAHPI_TL_TYPE_TEXT; OemEventData.Language = SAHPI_LANG_ENGLISH; OemEventData.DataLength = 0; OemEventData.Data[0] = '\0'; }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiOemEvent::oSaHpiOemEvent(const oSaHpiOemEvent& buf) { memcpy(this, &buf, sizeof(SaHpiOemEventT)); } /** * Assign a field in the SaHpiOemEventT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiOemEvent::assignField(SaHpiOemEventT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "MId") == 0) { ptr->MId = strtoul(value, NULL, 10); return false; } // OemEventData return true; }; /** * Print the contents of the buffer. * * @param stream Target stream. * @param buffer Address of the SaHpiOemEventT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiOemEvent::fprint(FILE *stream, const int indent, const SaHpiOemEventT *buffer) { int i, err; char indent_buf[indent + 1]; if (stream == NULL || buffer == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "MId = %d\n", buffer->MId); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "OemEventData\n"); if (err < 0) { return true; } const SaHpiTextBufferT *tb = (const SaHpiTextBufferT *)&buffer->OemEventData; err = oSaHpiTextBuffer::fprint(stream, indent + 3, tb); if (err < 0) { return true; } return false; } openhpi-3.6.1/cpp/oSaHpiSensorThdDefn.hpp0000644000175100017510000000313612575647263017304 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiSensorThdDefn #define Included_oSaHpiSensorThdDefn #include extern "C" { #include } class oSaHpiSensorThdDefn : public SaHpiSensorThdDefnT { public: // constructors oSaHpiSensorThdDefn(); // copy constructor oSaHpiSensorThdDefn(const oSaHpiSensorThdDefn& sr); // destructor ~oSaHpiSensorThdDefn() { } // other methods static bool assignField(SaHpiSensorThdDefnT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiSensorThdDefnT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiSensorThdDefnT *ent); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-3.6.1/cpp/oSaHpiRdr.cpp0000644000175100017510000001416612575647263015325 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiCtrlRec.hpp" #include "oSaHpiSensorRec.hpp" #include "oSaHpiInventoryRec.hpp" #include "oSaHpiWatchdogRec.hpp" #include "oSaHpiAnnunciatorRec.hpp" #include "oSaHpiEntityPath.hpp" #include "oSaHpiTextBuffer.hpp" #include "oSaHpiRdr.hpp" /** * Default constructor. */ oSaHpiRdr::oSaHpiRdr() { RecordId = 1; RdrType = SAHPI_NO_RECORD; Entity.Entry[0].EntityType = SAHPI_ENT_ROOT; Entity.Entry[0].EntityLocation = 0; IsFru = false; // no need to initialize the RdrTypeUnion since there is no record IdString.DataType = SAHPI_TL_TYPE_TEXT; IdString.Language = SAHPI_LANG_ENGLISH; IdString.DataLength = 0; IdString.Data[0] = '\0'; }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiRdr::oSaHpiRdr(const oSaHpiRdr& buf) { memcpy(this, &buf, sizeof(SaHpiRdrT)); } /** * Assign a field in the SaHpiRdrT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiRdr::assignField(SaHpiRdrT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "RecordId") == 0) { ptr->RecordId = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "RdrType") == 0) { ptr->RdrType = oSaHpiTypesEnums::str2rdrtype(value); return false; } // Entity else if (strcmp(field, "IsFru") == 0) { ptr->IsFru = oSaHpiTypesEnums::str2torf(value); return false; } // RdrTypeUnion // IdString return true; }; /** * Print the contents of the buffer. * * @param stream Target stream. * @param buffer Address of the SaHpiRdrT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiRdr::fprint(FILE *stream, const int indent, const SaHpiRdrT *buffer) { int i, err; char indent_buf[indent + 1]; if (stream == NULL || buffer == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "RecordId = %d\n", buffer->RecordId); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "RdrType = %s\n", oSaHpiTypesEnums::rdrtype2str(buffer->RdrType)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Entity\n"); if (err < 0) { return true; } const SaHpiEntityPathT *ep = (const SaHpiEntityPathT *)&buffer->Entity; err = oSaHpiEntityPath::fprint(stream, indent + 3, ep); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "IsFru = %s\n", oSaHpiTypesEnums::torf2str(buffer->IsFru)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "RdrTypeUnion\n"); if (err < 0) { return true; } switch (buffer->RdrType) { case SAHPI_CTRL_RDR: { const SaHpiCtrlRecT *cr = (const SaHpiCtrlRecT *)&buffer->RdrTypeUnion.CtrlRec; err = oSaHpiCtrlRec::fprint(stream, indent + 3, cr); if (err < 0) { return true; } break; } case SAHPI_SENSOR_RDR: { const SaHpiSensorRecT *sr = (const SaHpiSensorRecT *)&buffer->RdrTypeUnion.SensorRec; err = oSaHpiSensorRec::fprint(stream, indent + 3, sr); if (err < 0) { return true; } break; } case SAHPI_INVENTORY_RDR: { const SaHpiInventoryRecT *ir = (const SaHpiInventoryRecT *)&buffer->RdrTypeUnion.InventoryRec; err = oSaHpiInventoryRec::fprint(stream, indent + 3, ir); if (err < 0) { return true; } break; } case SAHPI_WATCHDOG_RDR: { const SaHpiWatchdogRecT *wr = (const SaHpiWatchdogRecT *)&buffer->RdrTypeUnion.WatchdogRec; err = oSaHpiWatchdogRec::fprint(stream, indent + 3, wr); if (err < 0) { return true; } break; } case SAHPI_ANNUNCIATOR_RDR: { const SaHpiAnnunciatorRecT *ar = (const SaHpiAnnunciatorRecT *)&buffer->RdrTypeUnion.AnnunciatorRec; err = oSaHpiAnnunciatorRec::fprint(stream, indent + 3, ar); if (err < 0) { return true; } break; } default: err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, " No Record\n"); if (err < 0) { return true; } } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "IdString\n"); if (err < 0) { return true; } const SaHpiTextBufferT *tb = (const SaHpiTextBufferT *)&buffer->IdString; err = oSaHpiTextBuffer::fprint(stream, indent + 3, tb); if (err < 0) { return true; } return false; } openhpi-3.6.1/cpp/oSaHpiSensorDataFormat.hpp0000644000175100017510000000324012575647263020006 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiSensorDataFormat #define Included_oSaHpiSensorDataFormat #include extern "C" { #include } #include "oSaHpiSensorRange.hpp" class oSaHpiSensorDataFormat : public SaHpiSensorDataFormatT { public: // constructors oSaHpiSensorDataFormat(); // copy constructor oSaHpiSensorDataFormat(const oSaHpiSensorDataFormat& sr); // destructor ~oSaHpiSensorDataFormat() { } // other methods static bool assignField(SaHpiSensorDataFormatT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiSensorDataFormatT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiSensorDataFormatT *ent); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-3.6.1/cpp/oSaHpiCtrlStateText.hpp0000644000175100017510000000322012575647263017342 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiCtrlStateText #define Included_oSaHpiCtrlStateText #include extern "C" { #include } class oSaHpiCtrlStateText : public SaHpiCtrlStateTextT { public: // constructors oSaHpiCtrlStateText(); oSaHpiCtrlStateText(const char *str); // copy constructor oSaHpiCtrlStateText(const oSaHpiCtrlStateText& buf); // destructor ~oSaHpiCtrlStateText() { } // other methods static bool assignField(SaHpiCtrlStateTextT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiCtrlStateTextT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiCtrlStateTextT *buffer); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-3.6.1/cpp/oSaHpiDrtEntry.cpp0000644000175100017510000000615512575647263016350 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiDrtEntry.hpp" /** * Default constructor. */ oSaHpiDrtEntry::oSaHpiDrtEntry() { EntryId = 1; DomainId = 1; IsPeer = false; }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiDrtEntry::oSaHpiDrtEntry(const oSaHpiDrtEntry& buf) { memcpy(this, &buf, sizeof(SaHpiDrtEntryT)); } /** * Assign a field in the SaHpiDrtEntryT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiDrtEntry::assignField(SaHpiDrtEntryT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "EntryId") == 0) { ptr->EntryId = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "DomainId") == 0) { ptr->DomainId = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "IsPeer") == 0) { ptr->IsPeer = oSaHpiTypesEnums::str2torf(value); return false; } return true; }; /** * Print the contents of the buffer. * * @param stream Target stream. * @param buffer Address of the SaHpiDrtEntryT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiDrtEntry::fprint(FILE *stream, const int indent, const SaHpiDrtEntryT *buffer) { int i, err; char indent_buf[indent + 1]; if (stream == NULL || buffer == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "EntryId = %u\n", buffer->EntryId); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "DomainId = %u\n", buffer->DomainId); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "IsPeer = %s\n", oSaHpiTypesEnums::torf2str(buffer->IsPeer)); if (err < 0) { return true; } return false; } openhpi-3.6.1/cpp/oSaHpiAlarm.cpp0000644000175100017510000001072112575647263015623 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiCondition.hpp" #include "oSaHpiAlarm.hpp" /** * Default constructor. */ oSaHpiAlarm::oSaHpiAlarm() { AlarmId = 1; Timestamp = 0; Severity = SAHPI_OK; Acknowledged = false; AlarmCond.Type = SAHPI_STATUS_COND_TYPE_SENSOR; AlarmCond.Entity.Entry[0].EntityType = SAHPI_ENT_ROOT; AlarmCond.Entity.Entry[0].EntityLocation = 0; AlarmCond.DomainId = SAHPI_UNSPECIFIED_DOMAIN_ID; AlarmCond.ResourceId = 1; AlarmCond.SensorNum = 1; AlarmCond.EventState = SAHPI_ES_UNSPECIFIED; AlarmCond.Name.Length = 0; AlarmCond.Name.Value[0] = '\0'; AlarmCond.Mid = SAHPI_MANUFACTURER_ID_UNSPECIFIED; AlarmCond.Data.DataType = SAHPI_TL_TYPE_TEXT; AlarmCond.Data.Language = SAHPI_LANG_ENGLISH; AlarmCond.Data.DataLength = 0; AlarmCond.Data.Data[0] = '\0'; }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiAlarm::oSaHpiAlarm(const oSaHpiAlarm& buf) { memcpy(this, &buf, sizeof(SaHpiAlarmT)); } /** * Assign a field in the SaHpiAlarmT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiAlarm::assignField(SaHpiAlarmT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "AlarmId") == 0) { ptr->AlarmId = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "Timestamp") == 0) { ptr->Timestamp = strtoull(value, NULL, 10); return false; } else if (strcmp(field, "Severity") == 0) { ptr->Severity = oSaHpiTypesEnums::str2severity(value); return false; } else if (strcmp(field, "Acknowledged") == 0) { ptr->Acknowledged = oSaHpiTypesEnums::str2torf(value); return false; } // AlarmCond return true; }; /** * Print the contents of the buffer. * * @param stream Target stream. * @param buffer Address of the SaHpiAlarmT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiAlarm::fprint(FILE *stream, const int indent, const SaHpiAlarmT *buffer) { int i, err; char indent_buf[indent + 1]; if (stream == NULL || buffer == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "AlarmId = %u\n", buffer->AlarmId); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Timestamp = %lld\n", buffer->Timestamp); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Severity = %s\n", oSaHpiTypesEnums::severity2str(buffer->Severity)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Acknowledged = %s\n", oSaHpiTypesEnums::torf2str(buffer->Acknowledged)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "AlarmCond\n"); if (err < 0) { return true; } const SaHpiConditionT *c = &buffer->AlarmCond; err = oSaHpiCondition::fprint(stream, indent + 3, c); if (err < 0) { return true; } return false; } openhpi-3.6.1/cpp/oSaHpiEventLogEntry.cpp0000644000175100017510000000616312575647263017341 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiEvent.hpp" #include "oSaHpiEventLogEntry.hpp" /** * Default constructor. */ oSaHpiEventLogEntry::oSaHpiEventLogEntry() { EntryId = 1; Timestamp = 0; }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiEventLogEntry::oSaHpiEventLogEntry(const oSaHpiEventLogEntry& buf) { memcpy(this, &buf, sizeof(SaHpiEventLogEntryT)); } /** * Assign a field in the SaHpiEventLogEntryT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiEventLogEntry::assignField(SaHpiEventLogEntryT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "EntryId") == 0) { ptr->EntryId = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "Timestamp") == 0) { ptr->Timestamp = strtoull(value, NULL, 10); return false; } // Event return true; }; /** * Print the contents of the buffer. * * @param stream Target stream. * @param buffer Address of the SaHpiEventLogEntryT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiEventLogEntry::fprint(FILE *stream, const int indent, const SaHpiEventLogEntryT *buffer) { int i, err; char indent_buf[indent + 1]; if (stream == NULL || buffer == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "EntryId = %u\n", buffer->EntryId); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Timestamp = %lld\n", buffer->Timestamp); if (err < 0) { return true; } err = fprintf(stream, "Event\n"); if (err < 0) { return true; } const SaHpiEventT *e = (const SaHpiEventT *)&buffer->Event; err = oSaHpiEvent::fprint(stream, indent + 3, e); if (err < 0) { return true; } return false; } openhpi-3.6.1/cpp/oSaHpiSensorDataFormat.cpp0000644000175100017510000001353712575647263020013 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiSensorReading.hpp" #include "oSaHpiSensorRange.hpp" #include "oSaHpiSensorDataFormat.hpp" /** * Default constructor. */ oSaHpiSensorDataFormat::oSaHpiSensorDataFormat() { oSaHpiSensorReading *sr; IsSupported = 0; ReadingType = SAHPI_SENSOR_READING_TYPE_INT64; BaseUnits = SAHPI_SU_UNSPECIFIED; ModifierUnits = SAHPI_SU_UNSPECIFIED; ModifierUse = SAHPI_SMUU_NONE; Percentage = false; Range.Flags = 0; sr = (oSaHpiSensorReading *)&Range.Max; sr->initSensorReading(sr); sr = (oSaHpiSensorReading *)&Range.Min; sr->initSensorReading(sr); sr = (oSaHpiSensorReading *)&Range.Nominal; sr->initSensorReading(sr); sr = (oSaHpiSensorReading *)&Range.NormalMax; sr->initSensorReading(sr); sr = (oSaHpiSensorReading *)&Range.NormalMin; sr->initSensorReading(sr); AccuracyFactor = 0; }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiSensorDataFormat::oSaHpiSensorDataFormat(const oSaHpiSensorDataFormat& df) { memcpy(this, &df, sizeof(SaHpiSensorDataFormatT)); } /** * Assign a field in the SaHpiSensorDataFormatT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiSensorDataFormat::assignField(SaHpiSensorDataFormatT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "IsSupported") == 0) { ptr->IsSupported = oSaHpiTypesEnums::str2torf(value); return false; } else if (strcmp(field, "ReadingType") == 0) { ptr->ReadingType = oSaHpiTypesEnums::str2sensorreadingtype(value); return false; } else if (strcmp(field, "BaseUnits") == 0) { ptr->BaseUnits = oSaHpiTypesEnums::str2sensorunits(value); return false; } else if (strcmp(field, "ModifierUnits") == 0) { ptr->ModifierUnits = oSaHpiTypesEnums::str2sensorunits(value); return false; } else if (strcmp(field, "ModifierUse") == 0) { ptr->ModifierUse = oSaHpiTypesEnums::str2sensoruse(value); return false; } else if (strcmp(field, "Percentage") == 0) { ptr->Percentage = oSaHpiTypesEnums::str2torf(value); return false; } else if (strcmp(field, "AccuracyFactor") == 0) { ptr->AccuracyFactor = (SaHpiFloat64T)atof(value); return false; } return true; }; /** * Print the contents of the entity. * * @param stream Target stream. * @param buffer Address of the SaHpiSensorReadingT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiSensorDataFormat::fprint(FILE *stream, const int indent, const SaHpiSensorDataFormatT *df) { int i, err = 0; char indent_buf[indent + 1]; if (stream == NULL || df == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "IsSupported = %s\n", oSaHpiTypesEnums::torf2str(df->IsSupported)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "ReadingType = %s\n", oSaHpiTypesEnums::sensorreadingtype2str(df->ReadingType)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "BaseUnits = %s\n", oSaHpiTypesEnums::sensorunits2str(df->BaseUnits)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "ModifierUnits = %s\n", oSaHpiTypesEnums::sensorunits2str(df->ModifierUnits)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "ModifierUse = %s\n", oSaHpiTypesEnums::sensoruse2str(df->ModifierUse)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Percentage = %s\n", oSaHpiTypesEnums::torf2str(df->Percentage)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Range\n"); if (err < 0) { return true; } const SaHpiSensorRangeT *sr = (const SaHpiSensorRangeT *)&df->Range; err = oSaHpiSensorRange::fprint(stream, indent + 3, sr); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "AccuracyFactor = %f\n", df->AccuracyFactor); if (err < 0) { return true; } return false; } openhpi-3.6.1/cpp/oSaHpiIdrInfo.cpp0000644000175100017510000000670312575647263016126 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiIdrInfo.hpp" /** * Default constructor. */ oSaHpiIdrInfo::oSaHpiIdrInfo() { IdrId = 1; UpdateCount = 0; ReadOnly = false; NumAreas = 0; }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiIdrInfo::oSaHpiIdrInfo(const oSaHpiIdrInfo& buf) { memcpy(this, &buf, sizeof(SaHpiIdrInfoT)); } /** * Assign a field in the SaHpiIdrInfoT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiIdrInfo::assignField(SaHpiIdrInfoT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "IdrId") == 0) { ptr->IdrId = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "UpdateCount") == 0) { ptr->UpdateCount = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "ReadOnly") == 0) { ptr->ReadOnly = oSaHpiTypesEnums::str2torf(value); return false; } else if (strcmp(field, "NumAreas") == 0) { ptr->NumAreas = strtoul(value, NULL, 10); return false; } return true; }; /** * Print the contents of the buffer. * * @param stream Target stream. * @param buffer Address of the SaHpiIdrInfoT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiIdrInfo::fprint(FILE *stream, const int indent, const SaHpiIdrInfoT *buffer) { int i, err; char indent_buf[indent + 1]; if (stream == NULL || buffer == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "IdrId = %d\n", buffer->IdrId); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "UpdateCount = %d\n", buffer->UpdateCount); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "ReadOnly = %s\n", oSaHpiTypesEnums::torf2str(buffer->ReadOnly)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "NumAreas = %d\n", buffer->NumAreas); if (err < 0) { return true; } return false; } openhpi-3.6.1/cpp/oSaHpiCtrlDefaultMode.hpp0000644000175100017510000000332612575647263017615 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiCtrlDefaultMode #define Included_oSaHpiCtrlDefaultMode #include extern "C" { #include } class oSaHpiCtrlDefaultMode : public SaHpiCtrlDefaultModeT { public: // constructors oSaHpiCtrlDefaultMode(); oSaHpiCtrlDefaultMode(SaHpiCtrlModeT mode, SaHpiBoolT ro); // copy constructor oSaHpiCtrlDefaultMode(const oSaHpiCtrlDefaultMode& cdm); // destructor ~oSaHpiCtrlDefaultMode() { } // other methods static bool assignField(SaHpiCtrlDefaultModeT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiCtrlDefaultModeT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiCtrlDefaultModeT *ent); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-3.6.1/cpp/oSaHpiCtrlDefaultMode.cpp0000644000175100017510000000617712575647263017617 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiCtrlDefaultMode.hpp" /** * Default constructor. */ oSaHpiCtrlDefaultMode::oSaHpiCtrlDefaultMode() { Mode = SAHPI_CTRL_MODE_AUTO; ReadOnly = false; }; /** * Constructor. */ oSaHpiCtrlDefaultMode::oSaHpiCtrlDefaultMode(SaHpiCtrlModeT mode, SaHpiBoolT ro) { Mode = mode; ReadOnly = ro; }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiCtrlDefaultMode::oSaHpiCtrlDefaultMode(const oSaHpiCtrlDefaultMode& ent) { memcpy(this, &ent, sizeof(SaHpiCtrlDefaultModeT)); } /** * Assign a field in the SaHpiCtrlDefaultModeT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiCtrlDefaultMode::assignField(SaHpiCtrlDefaultModeT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "Mode") == 0) { ptr->Mode = oSaHpiTypesEnums::str2ctrlmode(value); return false; } else if (strcmp(field, "ReadOnly") == 0) { ptr->ReadOnly = oSaHpiTypesEnums::str2torf(value); return false; } return true; }; /** * Print the contents of the entity. * * @param stream Target stream. * @param buffer Address of the SaHpiCtrlDefaultModeT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiCtrlDefaultMode::fprint(FILE *stream, const int indent, const SaHpiCtrlDefaultModeT *cdm) { int i, err = 0; char indent_buf[indent + 1]; if (stream == NULL || cdm == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Mode = %s\n", oSaHpiTypesEnums::ctrlmode2str(cdm->Mode)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "ReadOnly = %s\n", oSaHpiTypesEnums::torf2str(cdm->ReadOnly)); if (err < 0) { return true; } return false; } openhpi-3.6.1/cpp/oSaHpiResourceEvent.cpp0000644000175100017510000000517612575647263017370 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiResourceEvent.hpp" /** * Default constructor. */ oSaHpiResourceEvent::oSaHpiResourceEvent() { ResourceEventType = SAHPI_RESE_RESOURCE_FAILURE; }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiResourceEvent::oSaHpiResourceEvent(const oSaHpiResourceEvent& buf) { memcpy(this, &buf, sizeof(SaHpiResourceEventT)); } /** * Assign a field in the SaHpiResourceEventT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiResourceEvent::assignField(SaHpiResourceEventT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "ResourceEventType") == 0) { ptr->ResourceEventType = oSaHpiTypesEnums::str2resourceeventtype(value); return false; } return true; }; /** * Print the contents of the buffer. * * @param stream Target stream. * @param buffer Address of the SaHpiResourceEventT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiResourceEvent::fprint(FILE *stream, const int indent, const SaHpiResourceEventT *buffer) { int i, err; char indent_buf[indent + 1]; if (stream == NULL || buffer == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "ResourceEventType = %s\n", oSaHpiTypesEnums::resourceeventtype2str(buffer->ResourceEventType)); if (err < 0) { return true; } return false; } openhpi-3.6.1/cpp/Makefile.am0000644000175100017510000001500012575647263015006 0ustar mohanmohan# -*- linux-c -*- # # (C) Copyright IBM Corp. 2005 # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # # Author(s): # W. David Ashley # SUBDIRS = t DIST_SUBDIRS = t MAINTAINERCLEANFILES = Makefile.in AM_CPPFLAGS = -DG_LOG_DOMAIN=\"cpp\" AM_CPPFLAGS += @OPENHPI_INCLUDES@ includedir=$(base_includedir)/openhpi include_HEADERS = oSaHpiAlarm.hpp \ oSaHpiAnnouncement.hpp \ oSaHpiAnnunciatorRec.hpp \ oSaHpiCondition.hpp \ oSaHpiCtrlDefaultMode.hpp \ oSaHpiCtrlRec.hpp \ oSaHpiCtrlRecAnalog.hpp \ oSaHpiCtrlRecDigital.hpp \ oSaHpiCtrlRecDiscrete.hpp \ oSaHpiCtrlRecOem.hpp \ oSaHpiCtrlRecStream.hpp \ oSaHpiCtrlRecText.hpp \ oSaHpiCtrlState.hpp \ oSaHpiCtrlStateOem.hpp \ oSaHpiCtrlStateStream.hpp \ oSaHpiCtrlStateText.hpp \ oSaHpiDomainEvent.hpp \ oSaHpiDomainInfo.hpp \ oSaHpiDrtEntry.hpp \ oSaHpiEntity.hpp \ oSaHpiEntityPath.hpp \ oSaHpiEvent.hpp \ oSaHpiEventLogEntry.hpp \ oSaHpiEventLogInfo.hpp \ oSaHpiHotSwapEvent.hpp \ oSaHpiHpiSwEvent.hpp \ oSaHpiIdrAreaHeader.hpp \ oSaHpiIdrField.hpp \ oSaHpiIdrInfo.hpp \ oSaHpiInventoryRec.hpp \ oSaHpiName.hpp \ oSaHpiOemEvent.hpp \ oSaHpiRdr.hpp \ oSaHpiResourceEvent.hpp \ oSaHpiResourceInfo.hpp \ oSaHpiRptEntry.hpp \ oSaHpiSensorDataFormat.hpp \ oSaHpiSensorEnableChangeEvent.hpp \ oSaHpiSensorEvent.hpp \ oSaHpiSensorRange.hpp \ oSaHpiSensorReading.hpp \ oSaHpiSensorRec.hpp \ oSaHpiSensorThdDefn.hpp \ oSaHpiSensorThresholds.hpp \ oSaHpiTextBuffer.hpp \ oSaHpiTypesEnums.hpp \ oSaHpiUserEvent.hpp \ oSaHpiWatchdog.hpp \ oSaHpiWatchdogEvent.hpp \ oSaHpiWatchdogRec.hpp \ oSaHpi.hpp pkglib_LTLIBRARIES = libosahpi.la libosahpi_la_LIBADD = -luuid libosahpi_la_SOURCES = oSaHpiAlarm.cpp oSaHpiAlarm.hpp \ oSaHpiAnnouncement.cpp oSaHpiAnnouncement.hpp \ oSaHpiAnnunciatorRec.cpp oSaHpiAnnunciatorRec.hpp \ oSaHpiCondition.cpp oSaHpiCondition.hpp \ oSaHpiCtrlDefaultMode.cpp oSaHpiCtrlDefaultMode.hpp \ oSaHpiCtrlRec.cpp oSaHpiCtrlRec.hpp \ oSaHpiCtrlRecAnalog.cpp oSaHpiCtrlRecAnalog.hpp \ oSaHpiCtrlRecDigital.cpp oSaHpiCtrlRecDigital.hpp \ oSaHpiCtrlRecDiscrete.cpp oSaHpiCtrlRecDiscrete.hpp \ oSaHpiCtrlRecOem.cpp oSaHpiCtrlRecOem.hpp \ oSaHpiCtrlRecStream.cpp oSaHpiCtrlRecStream.hpp \ oSaHpiCtrlRecText.cpp oSaHpiCtrlRecText.hpp \ oSaHpiCtrlState.cpp oSaHpiCtrlState.hpp \ oSaHpiCtrlStateOem.cpp oSaHpiCtrlStateOem.hpp \ oSaHpiCtrlStateStream.cpp oSaHpiCtrlStateStream.hpp \ oSaHpiCtrlStateText.cpp oSaHpiCtrlStateText.hpp \ oSaHpiDomainEvent.cpp oSaHpiDomainEvent.hpp \ oSaHpiDomainInfo.cpp oSaHpiDomainInfo.hpp \ oSaHpiDrtEntry.cpp oSaHpiDrtEntry.hpp \ oSaHpiEntity.cpp oSaHpiEntity.hpp \ oSaHpiEntityPath.cpp oSaHpiEntityPath.hpp \ oSaHpiEvent.cpp oSaHpiEvent.hpp \ oSaHpiEventLogEntry.cpp oSaHpiEventLogEntry.hpp \ oSaHpiEventLogInfo.cpp oSaHpiEventLogInfo.hpp \ oSaHpiHotSwapEvent.cpp oSaHpiHotSwapEvent.hpp \ oSaHpiHpiSwEvent.cpp oSaHpiHpiSwEvent.hpp \ oSaHpiIdrAreaHeader.cpp oSaHpiIdrAreaHeader.hpp \ oSaHpiIdrField.cpp oSaHpiIdrField.hpp \ oSaHpiIdrInfo.cpp oSaHpiIdrInfo.hpp \ oSaHpiInventoryRec.cpp oSaHpiInventoryRec.hpp \ oSaHpiName.cpp oSaHpiName.hpp \ oSaHpiOemEvent.cpp oSaHpiOemEvent.hpp \ oSaHpiRdr.cpp oSaHpiRdr.hpp \ oSaHpiResourceEvent.cpp oSaHpiResourceEvent.hpp \ oSaHpiResourceInfo.cpp oSaHpiResourceInfo.hpp \ oSaHpiRptEntry.cpp oSaHpiRptEntry.hpp \ oSaHpiSensorDataFormat.cpp oSaHpiSensorDataFormat.hpp \ oSaHpiSensorEnableChangeEvent.cpp oSaHpiSensorEnableChangeEvent.hpp \ oSaHpiSensorEvent.cpp oSaHpiSensorEvent.hpp \ oSaHpiSensorRange.cpp oSaHpiSensorRange.hpp \ oSaHpiSensorReading.cpp oSaHpiSensorReading.hpp \ oSaHpiSensorRec.cpp oSaHpiSensorRec.hpp \ oSaHpiSensorThdDefn.cpp oSaHpiSensorThdDefn.hpp \ oSaHpiSensorThresholds.cpp oSaHpiSensorThresholds.hpp \ oSaHpiTextBuffer.cpp oSaHpiTextBuffer.hpp \ oSaHpiTypesEnums.cpp oSaHpiTypesEnums.hpp \ oSaHpiUserEvent.cpp oSaHpiUserEvent.hpp \ oSaHpiWatchdog.cpp oSaHpiWatchdog.hpp \ oSaHpiWatchdogEvent.cpp oSaHpiWatchdogEvent.hpp \ oSaHpiWatchdogRec.cpp oSaHpiWatchdogRec.hpp libosahpi_la_LDFLAGS = -version-info @HPI_LIB_VERSION@ openhpi-3.6.1/cpp/oSaHpiCtrlState.hpp0000644000175100017510000000306212575647263016501 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiCtrlState #define Included_oSaHpiCtrlState #include extern "C" { #include } class oSaHpiCtrlState : public SaHpiCtrlStateT { public: // constructors oSaHpiCtrlState(); // copy constructor oSaHpiCtrlState(const oSaHpiCtrlState& sr); // destructor ~oSaHpiCtrlState() { } // other methods static bool assignField(SaHpiCtrlStateT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiCtrlStateT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiCtrlStateT *ent); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-3.6.1/cpp/oSaHpiCtrlRecStream.hpp0000644000175100017510000000242712575647263017312 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiCtrlRecStream #define Included_oSaHpiCtrlRecStream #include extern "C" { #include } class oSaHpiCtrlRecStream : public SaHpiCtrlRecStreamT { public: // constructors oSaHpiCtrlRecStream(); // copy constructor oSaHpiCtrlRecStream(const oSaHpiCtrlRecStream& crd); // destructor ~oSaHpiCtrlRecStream() { } // other methods inline SaHpiCtrlRecStreamT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiCtrlRecStreamT *ent); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-3.6.1/cpp/oSaHpiCtrlRecDigital.cpp0000644000175100017510000000532712575647263017431 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiCtrlRecDigital.hpp" /** * Default constructor. */ oSaHpiCtrlRecDigital::oSaHpiCtrlRecDigital() { Default = SAHPI_CTRL_STATE_OFF; }; /** * Constructor. */ oSaHpiCtrlRecDigital::oSaHpiCtrlRecDigital(SaHpiCtrlStateDigitalT cs) { Default = cs; }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiCtrlRecDigital::oSaHpiCtrlRecDigital(const oSaHpiCtrlRecDigital& ent) { memcpy(this, &ent, sizeof(SaHpiCtrlRecDigitalT)); } /** * Assign a field in the SaHpiCtrlRecDigitalT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiCtrlRecDigital::assignField(SaHpiCtrlRecDigitalT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "Default") == 0) { ptr->Default = oSaHpiTypesEnums::str2ctrlstatedigital(value); return false; } // StateUnion return true; }; /** * Print the contents of the entity. * * @param stream Target stream. * @param buffer Address of the SaHpiCtrlRecDigitalT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiCtrlRecDigital::fprint(FILE *stream, const int indent, const SaHpiCtrlRecDigitalT *crd) { int i, err = 0; char indent_buf[indent + 1]; if (stream == NULL || crd == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Default = %s\n", oSaHpiTypesEnums::ctrlstatedigital2str(crd->Default)); if (err < 0) { return true; } return false; } openhpi-3.6.1/cpp/oSaHpiAlarm.hpp0000644000175100017510000000301212575647263015623 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiAlarm #define Included_oSaHpiAlarm #include extern "C" { #include } class oSaHpiAlarm : public SaHpiAlarmT { public: // constructors oSaHpiAlarm(); // copy constructor oSaHpiAlarm(const oSaHpiAlarm& buf); // destructor ~oSaHpiAlarm() { } // other methods static bool assignField(SaHpiAlarmT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiAlarmT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiAlarmT *buffer); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-3.6.1/cpp/oSaHpiIdrAreaHeader.cpp0000644000175100017510000000726612575647263017221 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiIdrAreaHeader.hpp" /** * Default constructor. */ oSaHpiIdrAreaHeader::oSaHpiIdrAreaHeader() { AreaId = 1; Type = SAHPI_IDR_AREATYPE_UNSPECIFIED; ReadOnly = false; NumFields = 0; }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiIdrAreaHeader::oSaHpiIdrAreaHeader(const oSaHpiIdrAreaHeader& buf) { memcpy(this, &buf, sizeof(SaHpiIdrAreaHeaderT)); } /** * Assign a field in the SaHpiIdrAreaHeaderT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiIdrAreaHeader::assignField(SaHpiIdrAreaHeaderT *ptr, const char *field, const char *value) { // note that DataLength cannot be assigned a value using this method if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "AreaId") == 0) { ptr->AreaId = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "Type") == 0) { ptr->Type = oSaHpiTypesEnums::str2idrareatype(value); return false; } else if (strcmp(field, "ReadOnly") == 0) { ptr->ReadOnly = oSaHpiTypesEnums::str2torf(value); return false; } else if (strcmp(field, "NumFields") == 0) { ptr->NumFields = strtoul(value, NULL, 10); return false; } // Field return true; }; /** * Print the contents of the buffer. * * @param stream Target stream. * @param buffer Address of the SaHpiIdrAreaHeaderT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiIdrAreaHeader::fprint(FILE *stream, const int indent, const SaHpiIdrAreaHeaderT *buffer) { int i, err; char indent_buf[indent + 1]; if (stream == NULL || buffer == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "AreaId = %d\n", buffer->AreaId); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Type = %s\n", oSaHpiTypesEnums::idrareatype2str(buffer->Type)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "ReadOnly = %s\n", oSaHpiTypesEnums::torf2str(buffer->ReadOnly)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "NumFields = %d\n", buffer->NumFields); if (err < 0) { return true; } return false; } openhpi-3.6.1/cpp/oSaHpiAnnunciatorRec.hpp0000644000175100017510000000315512575647263017512 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiAnnunciatorRec #define Included_oSaHpiAnnunciatorRec #include extern "C" { #include } class oSaHpiAnnunciatorRec : public SaHpiAnnunciatorRecT { public: // constructors oSaHpiAnnunciatorRec(); // copy constructor oSaHpiAnnunciatorRec(const oSaHpiAnnunciatorRec& buf); // destructor ~oSaHpiAnnunciatorRec() { } // other methods static bool assignField(SaHpiAnnunciatorRecT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiAnnunciatorRecT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiAnnunciatorRecT *buffer); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-3.6.1/cpp/oSaHpiHpiSwEvent.cpp0000644000175100017510000000657012575647263016632 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiTextBuffer.hpp" #include "oSaHpiHpiSwEvent.hpp" /** * Default constructor. */ oSaHpiHpiSwEvent::oSaHpiHpiSwEvent() { MId = SAHPI_MANUFACTURER_ID_UNSPECIFIED; Type = SAHPI_HPIE_AUDIT; EventData.DataType = SAHPI_TL_TYPE_TEXT; EventData.Language = SAHPI_LANG_ENGLISH; EventData.DataLength = 0; EventData.Data[0] = '\0'; }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiHpiSwEvent::oSaHpiHpiSwEvent(const oSaHpiHpiSwEvent& buf) { memcpy(this, &buf, sizeof(SaHpiHpiSwEventT)); } /** * Assign a field in the SaHpiHpiSwEventT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiHpiSwEvent::assignField(SaHpiHpiSwEventT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "MId") == 0) { ptr->MId = atoi(value); return false; } else if (strcmp(field, "Type") == 0) { ptr->Type = oSaHpiTypesEnums::str2sweventtype(value); return false; } // EventData return true; }; /** * Print the contents of the buffer. * * @param stream Target stream. * @param buffer Address of the SaHpiHpiSwEventT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiHpiSwEvent::fprint(FILE *stream, const int indent, const SaHpiHpiSwEventT *buffer) { int i, err; char indent_buf[indent + 1]; if (stream == NULL || buffer == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "MId = %d\n", buffer->MId); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Type = %s\n", oSaHpiTypesEnums::sweventtype2str(buffer->Type)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "EventData\n"); if (err < 0) { return true; } const SaHpiTextBufferT *tb = (const SaHpiTextBufferT *)&buffer->EventData; err = oSaHpiTextBuffer::fprint(stream, indent + 3, tb); if (err < 0) { return true; } return false; } openhpi-3.6.1/cpp/oSaHpiCtrlStateOem.hpp0000644000175100017510000000327012575647263017143 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiCtrlStateOem #define Included_oSaHpiCtrlStateOem #include extern "C" { #include } class oSaHpiCtrlStateOem : public SaHpiCtrlStateOemT { public: // constructors oSaHpiCtrlStateOem(); oSaHpiCtrlStateOem(SaHpiManufacturerIdT id, const char *str); // copy constructor oSaHpiCtrlStateOem(const oSaHpiCtrlStateOem& buf); // destructor ~oSaHpiCtrlStateOem() { } // other methods static bool assignField(SaHpiCtrlStateOemT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiCtrlStateOemT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiCtrlStateOemT *buffer); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-3.6.1/cpp/oSaHpiCtrlRec.hpp0000644000175100017510000000303212575647263016127 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiCtrlRec #define Included_oSaHpiCtrlRec #include extern "C" { #include } class oSaHpiCtrlRec : public SaHpiCtrlRecT { public: // constructors oSaHpiCtrlRec(); // copy constructor oSaHpiCtrlRec(const oSaHpiCtrlRec& cr); // destructor ~oSaHpiCtrlRec() { } // other methods static bool assignField(SaHpiCtrlRecT *ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiCtrlRecT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiCtrlRecT *sr); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-3.6.1/cpp/oSaHpiEntityPath.cpp0000644000175100017510000001071612575647263016664 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiEntity.hpp" #include "oSaHpiEntityPath.hpp" /** * Default constructor. */ oSaHpiEntityPath::oSaHpiEntityPath() { int i; for (i = 0; i < SAHPI_MAX_ENTITY_PATH; i ++) { Entry[i].EntityType = SAHPI_ENT_ROOT; Entry[i].EntityLocation = 0; } }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiEntityPath::oSaHpiEntityPath(const oSaHpiEntityPath& entpath) { int i; for (i = 0; i < SAHPI_MAX_ENTITY_PATH; i ++) { Entry[i].EntityType = entpath.Entry[i].EntityType; Entry[i].EntityLocation = entpath.Entry[i].EntityLocation; } } /** * Print the contents of the entity path. * * @param stream Target stream. * @param buffer Address of the SaHpiEntityPathT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiEntityPath::fprint(FILE *stream, const int indent, const SaHpiEntityPathT *entpath) { int i, err = 0; char indent_buf[indent + 1]; const SaHpiEntityT *ent; if (stream == NULL || entpath == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; for (i = 0; i < SAHPI_MAX_ENTITY_PATH; i++) { err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Entry[%d]\n", i); if (err < 0) { return true; } ent = (const SaHpiEntityT *)&(entpath->Entry[i]); err = oSaHpiEntity::fprint(stream, indent + 3, ent); if (err < 0) { return true; } if (entpath->Entry[i].EntityType == SAHPI_ENT_ROOT) { // no need to print past the root break; } } return false; } /** * Append one entity path to another. * * @param destpath The destination entity path. * @param appendpath The entity path to be appended to the destpath. If the result * entity path is too large it will be truncated. * * @return True if there was an error, otherwise false. */ bool oSaHpiEntityPath::append(SaHpiEntityPathT *destpath, const SaHpiEntityPathT *appendpath) { int i, j; if (!destpath) { return true; } if (!appendpath) { return false; } for (i = 0; i < SAHPI_MAX_ENTITY_PATH; i++) { if (destpath->Entry[i].EntityType == SAHPI_ENT_ROOT) break; } for (j = 0; i < SAHPI_MAX_ENTITY_PATH; i++) { destpath->Entry[i].EntityLocation = appendpath->Entry[j].EntityLocation; destpath->Entry[i].EntityType = appendpath->Entry[j].EntityType; if (appendpath->Entry[j].EntityType == SAHPI_ENT_ROOT) break; j++; } return false; } /** * Compare one entity path to another. * * @param destpath The destination entity path. * @param appendpath The entity path to be appended to the destpath. If the result * entity path is too large it will be truncated. * * @return True if the two entity paths are equal, otherwise false. */ bool oSaHpiEntityPath::compare(const SaHpiEntityPathT *ep1, const SaHpiEntityPathT *ep2) { unsigned int i, j; if (!ep1 || !ep2) { return false; } for (i = 0; i < SAHPI_MAX_ENTITY_PATH; i++) { if (ep1->Entry[i].EntityType == SAHPI_ENT_ROOT) { i++; break; } } for (j = 0; j < SAHPI_MAX_ENTITY_PATH; j++) { if (ep2->Entry[j].EntityType == SAHPI_ENT_ROOT) { j++; break; } } if (i != j) return false; for (i = 0; i < j; i++) { if (ep1->Entry[i].EntityType != ep2->Entry[i].EntityType || ep1->Entry[i].EntityLocation != ep2->Entry[i].EntityLocation) { return false; } } return true; } openhpi-3.6.1/cpp/oSaHpiAnnouncement.hpp0000644000175100017510000000312712575647263017230 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiAnnouncement #define Included_oSaHpiAnnouncement #include extern "C" { #include } class oSaHpiAnnouncement : public SaHpiAnnouncementT { public: // constructors oSaHpiAnnouncement(); // copy constructor oSaHpiAnnouncement(const oSaHpiAnnouncement& buf); // destructor ~oSaHpiAnnouncement() { } // other methods static bool assignField(SaHpiAnnouncementT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiAnnouncementT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiAnnouncementT *buffer); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-3.6.1/cpp/oSaHpiCtrlRecDigital.hpp0000644000175100017510000000324412575647263017432 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiCtrlRecDigital #define Included_oSaHpiCtrlRecDigital #include extern "C" { #include } class oSaHpiCtrlRecDigital : public SaHpiCtrlRecDigitalT { public: // constructors oSaHpiCtrlRecDigital(); oSaHpiCtrlRecDigital(SaHpiCtrlStateDigitalT crd); // copy constructor oSaHpiCtrlRecDigital(const oSaHpiCtrlRecDigital& crd); // destructor ~oSaHpiCtrlRecDigital() { } // other methods static bool assignField(SaHpiCtrlRecDigitalT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiCtrlRecDigitalT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiCtrlRecDigitalT *ent); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-3.6.1/cpp/oSaHpiCtrlRecStream.cpp0000644000175100017510000000377312575647263017312 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiCtrlStateStream.hpp" #include "oSaHpiCtrlRecStream.hpp" /** * Default constructor. */ oSaHpiCtrlRecStream::oSaHpiCtrlRecStream() { Default.Repeat = false; Default.StreamLength = 0; Default.Stream[0] = '\0'; }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiCtrlRecStream::oSaHpiCtrlRecStream(const oSaHpiCtrlRecStream& ent) { memcpy(this, &ent, sizeof(SaHpiCtrlRecStreamT)); } /** * Print the contents of the entity. * * @param stream Target stream. * @param buffer Address of the SaHpiCtrlRecStreamT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiCtrlRecStream::fprint(FILE *stream, const int indent, const SaHpiCtrlRecStreamT *strm) { int i, err = 0; char indent_buf[indent + 1]; if (stream == NULL || strm == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Default\n"); if (err < 0) { return true; } const SaHpiCtrlStateStreamT *css = (const SaHpiCtrlStateStreamT *)&strm->Default; err = oSaHpiCtrlStateStream::fprint(stream, indent + 3, css); if (err < 0) { return true; } return false; } openhpi-3.6.1/cpp/oSaHpiSensorRec.hpp0000644000175100017510000000306012575647263016475 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiSensorRec #define Included_oSaHpiSensorRec #include extern "C" { #include } class oSaHpiSensorRec : public SaHpiSensorRecT { public: // constructors oSaHpiSensorRec(); // copy constructor oSaHpiSensorRec(const oSaHpiSensorRec& sr); // destructor ~oSaHpiSensorRec() { } // other methods static bool assignField(SaHpiSensorRecT *ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiSensorRecT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiSensorRecT *sr); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-3.6.1/cpp/oSaHpiCtrlStateOem.cpp0000644000175100017510000000761612575647263017146 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiCtrlStateOem.hpp" /** * Default constructor. */ oSaHpiCtrlStateOem::oSaHpiCtrlStateOem() { MId = SAHPI_MANUFACTURER_ID_UNSPECIFIED; BodyLength = 0; Body[0] = '\0'; }; /** * Constructor. * * @param type The manufacturer id. * @param str The zero-terminated character string to be assigned to the * stream. */ oSaHpiCtrlStateOem::oSaHpiCtrlStateOem(const SaHpiManufacturerIdT id, const char *str) { MId = id; if (strlen(str) < SAHPI_CTRL_MAX_OEM_BODY_LENGTH) { BodyLength = strlen(str); strcpy((char *)Body, str); } else { BodyLength = SAHPI_CTRL_MAX_OEM_BODY_LENGTH; memcpy(Body, str, SAHPI_CTRL_MAX_OEM_BODY_LENGTH); } }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiCtrlStateOem::oSaHpiCtrlStateOem(const oSaHpiCtrlStateOem& buf) { memcpy(this, &buf, sizeof(SaHpiCtrlStateOemT)); } /** * Assign a field in the SaHpiCtrlStateOemT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiCtrlStateOem::assignField(SaHpiCtrlStateOemT *ptr, const char *field, const char *value) { // note that DataLength cannot be assigned a value using this method if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "MId") == 0) { ptr->MId = atoi(value); return false; } else if (strcmp(field, "Body") == 0) { if (strlen(value) < SAHPI_CTRL_MAX_OEM_BODY_LENGTH) { ptr->BodyLength = strlen(value); strcpy((char *)ptr->Body, value); } else { ptr->BodyLength = SAHPI_CTRL_MAX_OEM_BODY_LENGTH; memcpy(ptr->Body, value, SAHPI_CTRL_MAX_OEM_BODY_LENGTH); } return false; } return true; }; /** * Print the contents of the buffer. * * @param stream Target stream. * @param buffer Address of the SaHpiCtrlStateOemT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiCtrlStateOem::fprint(FILE *stream, const int indent, const SaHpiCtrlStateOemT *buffer) { int i, err; char indent_buf[indent + 1]; if (stream == NULL || buffer == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "MId = %d\n", buffer->MId); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Body = "); for (i = 0; i < buffer->BodyLength; i++) { err = fprintf(stream, "%c\n", buffer->Body[i]); if (err < 0) { return true; } } err = fprintf(stream, "\n"); if (err < 0) { return true; } return false; } openhpi-3.6.1/cpp/oSaHpiInventoryRec.cpp0000644000175100017510000000623012575647263017216 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiInventoryRec.hpp" /** * Default constructor. */ oSaHpiInventoryRec::oSaHpiInventoryRec() { IdrId = 1; Persistent = false; Oem = 0; }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiInventoryRec::oSaHpiInventoryRec(const oSaHpiInventoryRec& buf) { memcpy(this, &buf, sizeof(SaHpiInventoryRecT)); } /** * Assign a field in the SaHpiInventoryRecT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiInventoryRec::assignField(SaHpiInventoryRecT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "IdrId") == 0) { ptr->IdrId = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "Persistent") == 0) { ptr->Persistent = oSaHpiTypesEnums::str2torf(value); return false; } else if (strcmp(field, "Oem") == 0) { ptr->Oem = strtoul(value, NULL, 10); return false; } return true; }; /** * Print the contents of the buffer. * * @param stream Target stream. * @param buffer Address of the SaHpiInventoryRecT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiInventoryRec::fprint(FILE *stream, const int indent, const SaHpiInventoryRecT *buffer) { int i, err; char indent_buf[indent + 1]; if (stream == NULL || buffer == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "IdrId = %d\n", buffer->IdrId); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Persistent = %s\n", oSaHpiTypesEnums::torf2str(buffer->Persistent)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Oem = %u\n", buffer->Oem); if (err < 0) { return true; } return false; } openhpi-3.6.1/cpp/oSaHpiCtrlRecAnalog.hpp0000644000175100017510000000340312575647263017253 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiCtrlRecAnalog #define Included_oSaHpiCtrlRecAnalog #include extern "C" { #include } class oSaHpiCtrlRecAnalog : public SaHpiCtrlRecAnalogT { public: // constructors oSaHpiCtrlRecAnalog(); oSaHpiCtrlRecAnalog(SaHpiCtrlStateAnalogT mn, SaHpiCtrlStateAnalogT mx, SaHpiCtrlStateAnalogT def); // copy constructor oSaHpiCtrlRecAnalog(const oSaHpiCtrlRecAnalog& cra); // destructor ~oSaHpiCtrlRecAnalog() { } // other methods static bool assignField(SaHpiCtrlRecAnalogT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiCtrlRecAnalogT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiCtrlRecAnalogT *ent); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-3.6.1/cpp/oSaHpiCtrlRecOem.cpp0000644000175100017510000001026112575647263016565 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiCtrlStateOem.hpp" #include "oSaHpiCtrlRecOem.hpp" /** * Default constructor. */ oSaHpiCtrlRecOem::oSaHpiCtrlRecOem() { MId = SAHPI_MANUFACTURER_ID_UNSPECIFIED; ConfigData[0] = '\0'; Default.MId = SAHPI_MANUFACTURER_ID_UNSPECIFIED; Default.BodyLength = 0; Default.Body[0] = '\0'; }; /** * Constructor. */ oSaHpiCtrlRecOem::oSaHpiCtrlRecOem(SaHpiManufacturerIdT mid, const char *config, const char *str) { MId = mid; if (strlen(config) < SAHPI_CTRL_OEM_CONFIG_LENGTH) { strcpy((char *)ConfigData, config); } else { memcpy(ConfigData, config, SAHPI_CTRL_OEM_CONFIG_LENGTH); } Default.MId = mid; if (strlen(str) < SAHPI_CTRL_MAX_OEM_BODY_LENGTH) { Default.BodyLength = strlen(str); strcpy((char *)ConfigData, str); } else { Default.BodyLength = SAHPI_CTRL_MAX_OEM_BODY_LENGTH; memcpy(ConfigData, str, SAHPI_CTRL_MAX_OEM_BODY_LENGTH); } }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiCtrlRecOem::oSaHpiCtrlRecOem(const oSaHpiCtrlRecOem& ent) { memcpy(this, &ent, sizeof(SaHpiCtrlRecOemT)); } /** * Assign a field in the SaHpiCtrlRecOemT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiCtrlRecOem::assignField(SaHpiCtrlRecOemT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "MId") == 0) { ptr->MId = (SaHpiManufacturerIdT)atoi(value); return false; } else if (strcmp(field, "ConfigData") == 0) { if (strlen(value) < SAHPI_CTRL_OEM_CONFIG_LENGTH) { strcpy((char *)ptr->ConfigData, value); } else { memcpy(ptr->ConfigData, value, SAHPI_CTRL_OEM_CONFIG_LENGTH); } return false; } // Default return true; }; /** * Print the contents of the entity. * * @param stream Target stream. * @param buffer Address of the SaHpiCtrlRecOemT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiCtrlRecOem::fprint(FILE *stream, const int indent, const SaHpiCtrlRecOemT *oem) { int i, err = 0; char indent_buf[indent + 1]; if (stream == NULL || oem == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "MId = %d\n", oem->MId); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "ConfigData = %s\n", oem->ConfigData); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Default\n"); if (err < 0) { return true; } const SaHpiCtrlStateOemT *cs = (const SaHpiCtrlStateOemT *)&oem->Default; err = oSaHpiCtrlStateOem::fprint(stream, indent + 3, cs); if (err < 0) { return true; } return false; } openhpi-3.6.1/cpp/oSaHpiIdrAreaHeader.hpp0000644000175100017510000000314212575647263017213 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiIdrAreaHeader #define Included_oSaHpiIdrAreaHeader #include extern "C" { #include } class oSaHpiIdrAreaHeader : public SaHpiIdrAreaHeaderT { public: // constructors oSaHpiIdrAreaHeader(); // copy constructor oSaHpiIdrAreaHeader(const oSaHpiIdrAreaHeader& buf); // destructor ~oSaHpiIdrAreaHeader() { } // other methods static bool assignField(SaHpiIdrAreaHeaderT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiIdrAreaHeaderT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiIdrAreaHeaderT *buffer); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-3.6.1/cpp/oSaHpiEventLogEntry.hpp0000644000175100017510000000314212575647263017340 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiEventLogEntry #define Included_oSaHpiEventLogEntry #include extern "C" { #include } class oSaHpiEventLogEntry : public SaHpiEventLogEntryT { public: // constructors oSaHpiEventLogEntry(); // copy constructor oSaHpiEventLogEntry(const oSaHpiEventLogEntry& buf); // destructor ~oSaHpiEventLogEntry() { } // other methods static bool assignField(SaHpiEventLogEntryT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiEventLogEntryT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiEventLogEntryT *buffer); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-3.6.1/cpp/oSaHpiInventoryRec.hpp0000644000175100017510000000312712575647263017225 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiInventoryRec #define Included_oSaHpiInventoryRec #include extern "C" { #include } class oSaHpiInventoryRec : public SaHpiInventoryRecT { public: // constructors oSaHpiInventoryRec(); // copy constructor oSaHpiInventoryRec(const oSaHpiInventoryRec& buf); // destructor ~oSaHpiInventoryRec() { } // other methods static bool assignField(SaHpiInventoryRecT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiInventoryRecT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiInventoryRecT *buffer); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-3.6.1/cpp/t/0000755000175100017510000000000012605014537013203 5ustar mohanmohanopenhpi-3.6.1/cpp/t/tSaHpiEvent.cpp0000644000175100017510000000211112575647263016112 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiEvent.hpp" int main(int argc, char *argv[]) { oSaHpiEvent *ptr1; // create the first event ptr1 = new oSaHpiEvent; if (ptr1 == NULL) { printf("Error: Unable to create a oSaHpiEvent.\n"); return -1; } // print the contents of the first event fprintf(stdout, "\nSaHpiEvent\n"); if (ptr1->fprint(stdout, 3)) { printf("Error: Unable to print the buffer.\n"); return -1; } fprintf(stdout, "\n"); printf("Success!\n"); return 0; } openhpi-3.6.1/cpp/t/tSaHpiRptEntry.cpp0000644000175100017510000000214012575647263016622 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiRptEntry.hpp" int main(int argc, char *argv[]) { oSaHpiRptEntry *ptr1; // create the first rpt entry ptr1 = new oSaHpiRptEntry; if (ptr1 == NULL) { printf("Error: Unable to create a oSaHpiRptEntry.\n"); return -1; } // print the contents of the first rpt entry fprintf(stdout, "\nSaHpiRptEntry\n"); if (ptr1->fprint(stdout, 3)) { printf("Error: Unable to print the buffer.\n"); return -1; } fprintf(stdout, "\n"); printf("Success!\n"); return 0; } openhpi-3.6.1/cpp/t/tSaHpiUserEvent.cpp0000644000175100017510000000214712575647263016762 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiUserEvent.hpp" int main(int argc, char *argv[]) { oSaHpiUserEvent *ptr1; // create the first user event ptr1 = new oSaHpiUserEvent; if (ptr1 == NULL) { printf("Error: Unable to create a oSaHpiUserEvent.\n"); return -1; } // print the contents of the first user event fprintf(stdout, "\nSaHpiUserEvent\n"); if (ptr1->fprint(stdout, 3)) { printf("Error: Unable to print the buffer.\n"); return -1; } fprintf(stdout, "\n"); printf("Success!\n"); return 0; } openhpi-3.6.1/cpp/t/tSaHpiCtrlRec.cpp0000644000175100017510000000213112575647263016371 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiCtrlRec.hpp" int main(int argc, char *argv[]) { oSaHpiCtrlRec *ptr1; // create the first ctrl rec ptr1 = new oSaHpiCtrlRec; if (ptr1 == NULL) { printf("Error: Unable to create a oSaHpiCtrlRec.\n"); return -1; } // print the contents of the first ctrl rec fprintf(stdout, "\nSaHpiCtrlRec\n"); if (ptr1->fprint(stdout, 3)) { printf("Error: Unable to print the buffer.\n"); return -1; } fprintf(stdout, "\n"); printf("Success!\n"); return 0; } openhpi-3.6.1/cpp/t/tSaHpiWatchdogRec.cpp0000644000175100017510000000216512575647263017234 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiWatchdogRec.hpp" int main(int argc, char *argv[]) { oSaHpiWatchdogRec *ptr1; // create the first watchdog rec ptr1 = new oSaHpiWatchdogRec; if (ptr1 == NULL) { printf("Error: Unable to create a oSaHpiWatchdogRec.\n"); return -1; } // print the contents of the first watchdog rec fprintf(stdout, "\nSaHpiWatchdogRec\n"); if (ptr1->fprint(stdout, 3)) { printf("Error: Unable to print the buffer.\n"); return -1; } fprintf(stdout, "\n"); printf("Success!\n"); return 0; } openhpi-3.6.1/cpp/t/tSaHpiSensorEvent.cpp0000644000175100017510000000216512575647263017315 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiSensorEvent.hpp" int main(int argc, char *argv[]) { oSaHpiSensorEvent *ptr1; // create the first sensor event ptr1 = new oSaHpiSensorEvent; if (ptr1 == NULL) { printf("Error: Unable to create a oSaHpiSensorEvent.\n"); return -1; } // print the contents of the first sensor event fprintf(stdout, "\nSaHpiSensorEvent\n"); if (ptr1->fprint(stdout, 3)) { printf("Error: Unable to print the buffer.\n"); return -1; } fprintf(stdout, "\n"); printf("Success!\n"); return 0; } openhpi-3.6.1/cpp/t/tSaHpiIdrInfo.cpp0000644000175100017510000000213112575647263016365 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiIdrInfo.hpp" int main(int argc, char *argv[]) { oSaHpiIdrInfo *ptr1; // create the first idr info ptr1 = new oSaHpiIdrInfo; if (ptr1 == NULL) { printf("Error: Unable to create a oSaHpiIdrInfo.\n"); return -1; } // print the contents of the first idr info fprintf(stdout, "\nSaHpiIdrInfo\n"); if (ptr1->fprint(stdout, 3)) { printf("Error: Unable to print the buffer.\n"); return -1; } fprintf(stdout, "\n"); printf("Success!\n"); return 0; } openhpi-3.6.1/cpp/t/Makefile.am0000644000175100017510000000736112575647263015264 0ustar mohanmohan# (C) Copyright IBM Corp 2005 # All rights reserved. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. MOSTLYCLEANFILES = @TEST_CLEAN@ AM_CPPFLAGS = -DG_LOG_DOMAIN=\"t\" AM_CPPFLAGS += @OPENHPI_INCLUDES@ -I$(top_builddir)/cpp MAINTAINERCLEANFILES = Makefile.in TDEPLIB = $(top_builddir)/cpp/libosahpi.la TESTS = tSaHpiTextBuffer \ tSaHpiEntityPath \ tSaHpiSensorReading \ tSaHpiSensorThresholds \ tSaHpiSensorRec \ tSaHpiCtrlRec \ tSaHpiIdrField \ tSaHpiIdrAreaHeader \ tSaHpiIdrInfo \ tSaHpiInventoryRec \ tSaHpiWatchdog \ tSaHpiWatchdogRec \ tSaHpiAnnouncement \ tSaHpiAnnunciatorRec \ tSaHpiRdr \ tSaHpiSensorEvent \ tSaHpiSensorEnableChangeEvent \ tSaHpiHotSwapEvent \ tSaHpiWatchdogEvent \ tSaHpiHpiSwEvent \ tSaHpiOemEvent \ tSaHpiUserEvent \ tSaHpiEvent \ tSaHpiResourceInfo \ tSaHpiRptEntry \ tSaHpiDomainInfo \ tSaHpiDrtEntry \ tSaHpiAlarm \ tSaHpiEventLogInfo \ tSaHpiEventLogEntry check_PROGRAMS = $(TESTS) tSaHpiTextBuffer_SOURCES = tSaHpiTextBuffer.cpp tSaHpiTextBuffer_LDADD = $(TDEPLIB) tSaHpiEntityPath_SOURCES = tSaHpiEntityPath.cpp tSaHpiEntityPath_LDADD = $(TDEPLIB) tSaHpiSensorReading_SOURCES = tSaHpiSensorReading.cpp tSaHpiSensorReading_LDADD = $(TDEPLIB) tSaHpiSensorThresholds_SOURCES = tSaHpiSensorThresholds.cpp tSaHpiSensorThresholds_LDADD = $(TDEPLIB) tSaHpiSensorRec_SOURCES = tSaHpiSensorRec.cpp tSaHpiSensorRec_LDADD = $(TDEPLIB) tSaHpiCtrlRec_SOURCES = tSaHpiCtrlRec.cpp tSaHpiCtrlRec_LDADD = $(TDEPLIB) tSaHpiIdrField_SOURCES = tSaHpiIdrField.cpp tSaHpiIdrField_LDADD = $(TDEPLIB) tSaHpiIdrAreaHeader_SOURCES = tSaHpiIdrAreaHeader.cpp tSaHpiIdrAreaHeader_LDADD = $(TDEPLIB) tSaHpiIdrInfo_SOURCES = tSaHpiIdrInfo.cpp tSaHpiIdrInfo_LDADD = $(TDEPLIB) tSaHpiInventoryRec_SOURCES = tSaHpiInventoryRec.cpp tSaHpiInventoryRec_LDADD = $(TDEPLIB) tSaHpiWatchdog_SOURCES = tSaHpiWatchdog.cpp tSaHpiWatchdog_LDADD = $(TDEPLIB) tSaHpiWatchdogRec_SOURCES = tSaHpiWatchdogRec.cpp tSaHpiWatchdogRec_LDADD = $(TDEPLIB) tSaHpiAnnouncement_SOURCES = tSaHpiAnnouncement.cpp tSaHpiAnnouncement_LDADD = $(TDEPLIB) tSaHpiAnnunciatorRec_SOURCES = tSaHpiAnnunciatorRec.cpp tSaHpiAnnunciatorRec_LDADD = $(TDEPLIB) tSaHpiRdr_SOURCES = tSaHpiRdr.cpp tSaHpiRdr_LDADD = $(TDEPLIB) tSaHpiSensorEvent_SOURCES = tSaHpiSensorEvent.cpp tSaHpiSensorEvent_LDADD = $(TDEPLIB) tSaHpiSensorEnableChangeEvent_SOURCES = tSaHpiSensorEnableChangeEvent.cpp tSaHpiSensorEnableChangeEvent_LDADD = $(TDEPLIB) tSaHpiHotSwapEvent_SOURCES = tSaHpiHotSwapEvent.cpp tSaHpiHotSwapEvent_LDADD = $(TDEPLIB) tSaHpiWatchdogEvent_SOURCES = tSaHpiWatchdogEvent.cpp tSaHpiWatchdogEvent_LDADD = $(TDEPLIB) tSaHpiHpiSwEvent_SOURCES = tSaHpiHpiSwEvent.cpp tSaHpiHpiSwEvent_LDADD = $(TDEPLIB) tSaHpiOemEvent_SOURCES = tSaHpiOemEvent.cpp tSaHpiOemEvent_LDADD = $(TDEPLIB) tSaHpiUserEvent_SOURCES = tSaHpiUserEvent.cpp tSaHpiUserEvent_LDADD = $(TDEPLIB) tSaHpiEvent_SOURCES = tSaHpiEvent.cpp tSaHpiEvent_LDADD = $(TDEPLIB) tSaHpiResourceInfo_SOURCES = tSaHpiResourceInfo.cpp tSaHpiResourceInfo_LDADD = $(TDEPLIB) tSaHpiRptEntry_SOURCES = tSaHpiRptEntry.cpp tSaHpiRptEntry_LDADD = $(TDEPLIB) tSaHpiDomainInfo_SOURCES = tSaHpiDomainInfo.cpp tSaHpiDomainInfo_LDADD = $(TDEPLIB) tSaHpiDrtEntry_SOURCES = tSaHpiDrtEntry.cpp tSaHpiDrtEntry_LDADD = $(TDEPLIB) tSaHpiAlarm_SOURCES = tSaHpiAlarm.cpp tSaHpiAlarm_LDADD = $(TDEPLIB) tSaHpiEventLogInfo_SOURCES = tSaHpiEventLogInfo.cpp tSaHpiEventLogInfo_LDADD = $(TDEPLIB) tSaHpiEventLogEntry_SOURCES = tSaHpiEventLogEntry.cpp tSaHpiEventLogEntry_LDADD = $(TDEPLIB) openhpi-3.6.1/cpp/t/tSaHpiAlarm.cpp0000644000175100017510000000211112575647263016065 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiAlarm.hpp" int main(int argc, char *argv[]) { oSaHpiAlarm *ptr1; // create the first Alarm ptr1 = new oSaHpiAlarm; if (ptr1 == NULL) { printf("Error: Unable to create a oSaHpiAlarm.\n"); return -1; } // print the contents of the first Alarm fprintf(stdout, "\nSaHpiAlarm\n"); if (ptr1->fprint(stdout, 3)) { printf("Error: Unable to print the buffer.\n"); return -1; } fprintf(stdout, "\n"); printf("Success!\n"); return 0; } openhpi-3.6.1/cpp/t/tSaHpiDomainInfo.cpp0000644000175100017510000000215612575647263017065 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiDomainInfo.hpp" int main(int argc, char *argv[]) { oSaHpiDomainInfo *ptr1; // create the first domain info ptr1 = new oSaHpiDomainInfo; if (ptr1 == NULL) { printf("Error: Unable to create a oSaHpiDomainInfo.\n"); return -1; } // print the contents of the first domain info fprintf(stdout, "\nSaHpiDomainInfo\n"); if (ptr1->fprint(stdout, 3)) { printf("Error: Unable to print the buffer.\n"); return -1; } fprintf(stdout, "\n"); printf("Success!\n"); return 0; } openhpi-3.6.1/cpp/t/tSaHpiResourceInfo.cpp0000644000175100017510000000217412575647263017445 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiResourceInfo.hpp" int main(int argc, char *argv[]) { oSaHpiResourceInfo *ptr1; // create the first resource info ptr1 = new oSaHpiResourceInfo; if (ptr1 == NULL) { printf("Error: Unable to create a oSaHpiResourceInfo.\n"); return -1; } // print the contents of the first resource info fprintf(stdout, "\nSaHpiResourceInfo\n"); if (ptr1->fprint(stdout, 3)) { printf("Error: Unable to print the buffer.\n"); return -1; } fprintf(stdout, "\n"); printf("Success!\n"); return 0; } openhpi-3.6.1/cpp/t/tSaHpiOemEvent.cpp0000644000175100017510000000214012575647263016555 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiOemEvent.hpp" int main(int argc, char *argv[]) { oSaHpiOemEvent *ptr1; // create the first oem event ptr1 = new oSaHpiOemEvent; if (ptr1 == NULL) { printf("Error: Unable to create a oSaHpiOemEvent.\n"); return -1; } // print the contents of the first oem event fprintf(stdout, "\nSaHpiOemEvent\n"); if (ptr1->fprint(stdout, 3)) { printf("Error: Unable to print the buffer.\n"); return -1; } fprintf(stdout, "\n"); printf("Success!\n"); return 0; } openhpi-3.6.1/cpp/t/tSaHpiDrtEntry.cpp0000644000175100017510000000213612575647263016613 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiDrtEntry.hpp" int main(int argc, char *argv[]) { oSaHpiDrtEntry *ptr1; // create the first DrtEntry ptr1 = new oSaHpiDrtEntry; if (ptr1 == NULL) { printf("Error: Unable to create a oSaHpiDrtEntry.\n"); return -1; } // print the contents of the first DrtEntry fprintf(stdout, "\nSaHpiDrtEntry\n"); if (ptr1->fprint(stdout, 3)) { printf("Error: Unable to print the buffer.\n"); return -1; } fprintf(stdout, "\n"); printf("Success!\n"); return 0; } openhpi-3.6.1/cpp/t/tSaHpiIdrField.cpp0000644000175100017510000000214012575647263016515 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiIdrField.hpp" int main(int argc, char *argv[]) { oSaHpiIdrField *ptr1; // create the first idr field ptr1 = new oSaHpiIdrField; if (ptr1 == NULL) { printf("Error: Unable to create a oSaHpiIdrField.\n"); return -1; } // print the contents of the first idr field fprintf(stdout, "\nSaHpiIdrField\n"); if (ptr1->fprint(stdout, 3)) { printf("Error: Unable to print the buffer.\n"); return -1; } fprintf(stdout, "\n"); printf("Success!\n"); return 0; } openhpi-3.6.1/cpp/t/tSaHpiEntityPath.cpp0000644000175100017510000000450712575647263017135 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiEntityPath.hpp" int main(int argc, char *argv[]) { oSaHpiEntityPath *ent1, *ent2; // create the first entity path ent1 = new oSaHpiEntityPath; if (ent1 == NULL) { printf("Error: Unable to create a oSaHpiEntityPath.\n"); return -1; } // set the initial entity path ent1->Entry[0].EntityType = SAHPI_ENT_SYSTEM_CHASSIS; ent1->Entry[0].EntityLocation = 1; // print the contents of the first entity path fprintf(stdout, "\nSaHpiEntityPath\n"); if (ent1->fprint(stdout, 3)) { printf("Error: Unable to print the entity path.\n"); return -1; } fprintf(stdout, "\n"); // create the second entity path ent2 = new oSaHpiEntityPath; if (ent2 == NULL) { printf("Error: Unable to create a second oSaHpiEntityPath.\n"); return -1; } // set the second initial entity path ent2->Entry[0].EntityType = SAHPI_ENT_PROCESSOR; ent2->Entry[0].EntityLocation = 1; // append the second entity pathe to the first ent1->append(ent2); // print the contents of the first appended entity path fprintf(stdout, "\nSaHpiEntityPath\n"); if (ent1->fprint(stdout, 3)) { printf("Error: Unable to print the entity path.\n"); return -1; } fprintf(stdout, "\n"); // now compare the two entity paths if (ent1->compare(ent2) == true) { printf("Error: The two entity paths should not be equal.\n"); return -1; } // copy the first to the second delete ent2; ent2 = new oSaHpiEntityPath(*ent1); // now compare the two entity paths if (ent1->compare(ent2) == false) { printf("Error: The two entity paths are not equal.\n"); return -1; } printf("Success!\n"); return 0; } openhpi-3.6.1/cpp/t/tSaHpiWatchdogEvent.cpp0000644000175100017510000000220312575647263017575 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiWatchdogEvent.hpp" int main(int argc, char *argv[]) { oSaHpiWatchdogEvent *ptr1; // create the first watchdog event ptr1 = new oSaHpiWatchdogEvent; if (ptr1 == NULL) { printf("Error: Unable to create a oSaHpiWatchdogEvent.\n"); return -1; } // print the contents of the first watchdog event fprintf(stdout, "\nSaHpiWatchdogEvent\n"); if (ptr1->fprint(stdout, 3)) { printf("Error: Unable to print the buffer.\n"); return -1; } fprintf(stdout, "\n"); printf("Success!\n"); return 0; } openhpi-3.6.1/cpp/t/tSaHpiSensorRec.cpp0000644000175100017510000000214312575647263016741 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiSensorRec.hpp" int main(int argc, char *argv[]) { oSaHpiSensorRec *sr1; // create the first sensor rec sr1 = new oSaHpiSensorRec; if (sr1 == NULL) { printf("Error: Unable to create a oSaHpiSensorRec.\n"); return -1; } // print the contents of the first sensor rec fprintf(stdout, "\nSaHpiSensorRec\n"); if (sr1->fprint(stdout, 3)) { printf("Error: Unable to print the buffer.\n"); return -1; } fprintf(stdout, "\n"); printf("Success!\n"); return 0; } openhpi-3.6.1/cpp/t/tSaHpiSensorReading.cpp0000644000175100017510000000341112575647263017600 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiSensorReading.hpp" int main(int argc, char *argv[]) { oSaHpiSensorReading *sr1, *sr2; // create the first text buffer sr1 = new oSaHpiSensorReading; if (sr1 == NULL) { printf("Error: Unable to create a oSaHpiSensorReading.\n"); return -1; } // copy the first sensor reading to the second sensor reading sr2 = new oSaHpiSensorReading(*sr1); if (sr2 == NULL) { printf("Error: Unable to copy a oSaHpiSensorReading.\n"); return -1; } // print the contents of the first sensor reading fprintf(stdout, "\nSaHpiSensorReading\n"); if (sr1->fprint(stdout, 3)) { printf("Error: Unable to print the buffer.\n"); return -1; } fprintf(stdout, "\n"); // change the second sensor reading sr2->IsSupported = true; sr2->Type = SAHPI_SENSOR_READING_TYPE_BUFFER; strcpy((char *)sr2->Value.SensorBuffer, "My string"); // print the contents of the second text buffer fprintf(stdout, "\nSaHpiSensorReading\n"); if (sr2->fprint(stdout, 3)) { printf("Error: Unable to print the new buffer.\n"); return -1; } fprintf(stdout, "\n"); printf("Success!\n"); return 0; } openhpi-3.6.1/cpp/t/tSaHpiTextBuffer.cpp0000644000175100017510000000365112575647263017121 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTextBuffer.hpp" int main(int argc, char *argv[]) { oSaHpiTextBuffer *tb1, *tb2; // create the first text buffer tb1 = new oSaHpiTextBuffer; if (tb1 == NULL) { printf("Error: Unable to create a oSaHpiTextBuffer.\n"); return -1; } // append a string to the first text buffer if (tb1->append("My string")) { printf("Error: Unable to append a string to the buffer.\n"); return -1; } // copy the first text buffer to the second text buffer tb2 = new oSaHpiTextBuffer(*tb1); if (tb2 == NULL) { printf("Error: Unable to copy a oSaHpiTextBuffer.\n"); return -1; } // append a string to the second text buffer if (tb2->append(", more string")) { printf("Error: Unable to append a string to the new buffer.\n"); return -1; } // print the contents of the first text buffer fprintf(stdout, "\nSaHpiTextBuffer\n"); if (tb1->fprint(stdout, 3)) { printf("Error: Unable to print the buffer.\n"); return -1; } fprintf(stdout, "\n"); // print the contents of the second text buffer fprintf(stdout, "\nSaHpiTextBuffer\n"); if (tb2->fprint(stdout, 3)) { printf("Error: Unable to print the new buffer.\n"); return -1; } fprintf(stdout, "\n"); printf("Success!\n"); return 0; } openhpi-3.6.1/cpp/t/tSaHpiInventoryRec.cpp0000644000175100017510000000217412575647263017471 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiInventoryRec.hpp" int main(int argc, char *argv[]) { oSaHpiInventoryRec *ptr1; // create the first inventory rec ptr1 = new oSaHpiInventoryRec; if (ptr1 == NULL) { printf("Error: Unable to create a oSaHpiInventoryRec.\n"); return -1; } // print the contents of the first inventory rec fprintf(stdout, "\nSaHpiInventoryRec\n"); if (ptr1->fprint(stdout, 3)) { printf("Error: Unable to print the buffer.\n"); return -1; } fprintf(stdout, "\n"); printf("Success!\n"); return 0; } openhpi-3.6.1/cpp/t/tSaHpiRdr.cpp0000644000175100017510000000461512575647263015573 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiRdr.hpp" int main(int argc, char *argv[]) { oSaHpiRdr *ptr1; // create the first rdr ptr1 = new oSaHpiRdr; if (ptr1 == NULL) { printf("Error: Unable to create a oSaHpiRdr.\n"); return -1; } // print the contents of the first rdr fprintf(stdout, "\nSaHpiRdr\n"); if (ptr1->fprint(stdout, 3)) { printf("Error: Unable to print the buffer.\n"); return -1; } fprintf(stdout, "\n"); // modify the rdr ptr1->RdrType = SAHPI_CTRL_RDR; ptr1->RdrTypeUnion.CtrlRec.Num = 1; ptr1->RdrTypeUnion.CtrlRec.OutputType = SAHPI_CTRL_LCD_DISPLAY; ptr1->RdrTypeUnion.CtrlRec.Type = SAHPI_CTRL_TYPE_TEXT; ptr1->RdrTypeUnion.CtrlRec.TypeUnion.Text.MaxChars = 80; ptr1->RdrTypeUnion.CtrlRec.TypeUnion.Text.MaxLines = 1; ptr1->RdrTypeUnion.CtrlRec.TypeUnion.Text.Language = SAHPI_LANG_ENGLISH; ptr1->RdrTypeUnion.CtrlRec.TypeUnion.Text.DataType = SAHPI_TL_TYPE_TEXT; ptr1->RdrTypeUnion.CtrlRec.TypeUnion.Text.Default.Line = 1; ptr1->RdrTypeUnion.CtrlRec.TypeUnion.Text.Default.Text.Language = SAHPI_LANG_ENGLISH; ptr1->RdrTypeUnion.CtrlRec.TypeUnion.Text.Default.Text.DataType = SAHPI_TL_TYPE_TEXT; strcpy((char *)ptr1->RdrTypeUnion.CtrlRec.TypeUnion.Text.Default.Text.Data, "My string"); ptr1->RdrTypeUnion.CtrlRec.TypeUnion.Text.Default.Text.DataLength = 9; ptr1->RdrTypeUnion.CtrlRec.DefaultMode.Mode = SAHPI_CTRL_MODE_AUTO; ptr1->RdrTypeUnion.CtrlRec.DefaultMode.ReadOnly = true; ptr1->RdrTypeUnion.CtrlRec.WriteOnly = false; ptr1->RdrTypeUnion.CtrlRec.Oem = 9; // print the contents of the first rdr fprintf(stdout, "\nSaHpiRdr\n"); if (ptr1->fprint(stdout, 3)) { printf("Error: Unable to print the buffer.\n"); return -1; } fprintf(stdout, "\n"); printf("Success!\n"); return 0; } openhpi-3.6.1/cpp/t/tSaHpiIdrAreaHeader.cpp0000644000175100017510000000220512575647263017455 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiIdrAreaHeader.hpp" int main(int argc, char *argv[]) { oSaHpiIdrAreaHeader *ptr1; // create the first idr area header ptr1 = new oSaHpiIdrAreaHeader; if (ptr1 == NULL) { printf("Error: Unable to create a oSaHpiIdrAreaHeader.\n"); return -1; } // print the contents of the first idr area header fprintf(stdout, "\nSaHpiIdrAreaHeader\n"); if (ptr1->fprint(stdout, 3)) { printf("Error: Unable to print the buffer.\n"); return -1; } fprintf(stdout, "\n"); printf("Success!\n"); return 0; } openhpi-3.6.1/cpp/t/tSaHpiAnnouncement.cpp0000644000175100017510000000217212575647263017472 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiAnnouncement.hpp" int main(int argc, char *argv[]) { oSaHpiAnnouncement *ptr1; // create the first announcement ptr1 = new oSaHpiAnnouncement; if (ptr1 == NULL) { printf("Error: Unable to create a oSaHpiAnnouncement.\n"); return -1; } // print the contents of the first announcement fprintf(stdout, "\nSaHpiAnnouncement\n"); if (ptr1->fprint(stdout, 3)) { printf("Error: Unable to print the buffer.\n"); return -1; } fprintf(stdout, "\n"); printf("Success!\n"); return 0; } openhpi-3.6.1/cpp/t/tSaHpiWatchdog.cpp0000644000175100017510000000213612575647263016600 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiWatchdog.hpp" int main(int argc, char *argv[]) { oSaHpiWatchdog *ptr1; // create the first watchdog ptr1 = new oSaHpiWatchdog; if (ptr1 == NULL) { printf("Error: Unable to create a oSaHpiWatchdog.\n"); return -1; } // print the contents of the first watchdog fprintf(stdout, "\nSaHpiWatchdog\n"); if (ptr1->fprint(stdout, 3)) { printf("Error: Unable to print the buffer.\n"); return -1; } fprintf(stdout, "\n"); printf("Success!\n"); return 0; } openhpi-3.6.1/cpp/t/tSaHpiEventLogInfo.cpp0000644000175100017510000000217212575647263017377 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiEventLogInfo.hpp" int main(int argc, char *argv[]) { oSaHpiEventLogInfo *ptr1; // create the first EventLogInfo ptr1 = new oSaHpiEventLogInfo; if (ptr1 == NULL) { printf("Error: Unable to create a oSaHpiEventLogInfo.\n"); return -1; } // print the contents of the first EventLogInfo fprintf(stdout, "\nSaHpiEventLogInfo\n"); if (ptr1->fprint(stdout, 3)) { printf("Error: Unable to print the buffer.\n"); return -1; } fprintf(stdout, "\n"); printf("Success!\n"); return 0; } openhpi-3.6.1/cpp/t/tSaHpiHotSwapEvent.cpp0000644000175100017510000000217612575647263017433 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiHotSwapEvent.hpp" int main(int argc, char *argv[]) { oSaHpiHotSwapEvent *ptr1; // create the first hot swap event ptr1 = new oSaHpiHotSwapEvent; if (ptr1 == NULL) { printf("Error: Unable to create a oSaHpiHotSwapEvent.\n"); return -1; } // print the contents of the first hot swap event fprintf(stdout, "\nSaHpiHotSwapEvent\n"); if (ptr1->fprint(stdout, 3)) { printf("Error: Unable to print the buffer.\n"); return -1; } fprintf(stdout, "\n"); printf("Success!\n"); return 0; } openhpi-3.6.1/cpp/t/tSaHpiAnnunciatorRec.cpp0000644000175100017510000000221212575647263017746 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiAnnunciatorRec.hpp" int main(int argc, char *argv[]) { oSaHpiAnnunciatorRec *ptr1; // create the first annunciator rec ptr1 = new oSaHpiAnnunciatorRec; if (ptr1 == NULL) { printf("Error: Unable to create a oSaHpiAnnunciatorRec.\n"); return -1; } // print the contents of the first annunciator rec fprintf(stdout, "\nSaHpiAnnunciatorRec\n"); if (ptr1->fprint(stdout, 3)) { printf("Error: Unable to print the buffer.\n"); return -1; } fprintf(stdout, "\n"); printf("Success!\n"); return 0; } openhpi-3.6.1/cpp/t/tSaHpiEventLogEntry.cpp0000644000175100017510000000220112575647263017576 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiEventLogEntry.hpp" int main(int argc, char *argv[]) { oSaHpiEventLogEntry *ptr1; // create the first EventLogEntry ptr1 = new oSaHpiEventLogEntry; if (ptr1 == NULL) { printf("Error: Unable to create a oSaHpiEventLogEntry.\n"); return -1; } // print the contents of the first EventLogEntry fprintf(stdout, "\nSaHpiEventLogEntry\n"); if (ptr1->fprint(stdout, 3)) { printf("Error: Unable to print the buffer.\n"); return -1; } fprintf(stdout, "\n"); printf("Success!\n"); return 0; } openhpi-3.6.1/cpp/t/tSaHpiSensorThresholds.cpp0000644000175100017510000000316312575647263020352 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiSensorReading.hpp" #include "oSaHpiSensorThresholds.hpp" int main(int argc, char *argv[]) { oSaHpiSensorThresholds *th; // create the sensor thresholds th = new oSaHpiSensorThresholds; if (th == NULL) { printf("Error: Unable to create a oSaHpiSensorThresholds.\n"); return -1; } // print the contents of the sensor thresholds fprintf(stdout, "\nSaHpiSensorThresholds\n"); if (th->fprint(stdout, 3)) { printf("Error: Unable to print the sensor thresholds.\n"); return -1; } fprintf(stdout, "\n"); // set the LowCritical sensor threshold th->LowCritical.IsSupported = true; th->LowCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; th->LowCritical.Value.SensorFloat64 = -21; // print the contents of the sensor thresholds fprintf(stdout, "\nSaHpiSensorThresholds\n"); if (th->fprint(stdout, 3)) { printf("Error: Unable to print the sensor thresholds.\n"); return -1; } fprintf(stdout, "\n"); printf("Success!\n"); return 0; } openhpi-3.6.1/cpp/t/tSaHpiSensorEnableChangeEvent.cpp0000644000175100017510000000231512575647263021527 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiSensorEnableChangeEvent.hpp" int main(int argc, char *argv[]) { oSaHpiSensorEnableChangeEvent *ptr1; // create the first sensor enable change event ptr1 = new oSaHpiSensorEnableChangeEvent; if (ptr1 == NULL) { printf("Error: Unable to create a oSaHpiSensorEnableChangeEvent.\n"); return -1; } // print the contents of the first sensor enable change event fprintf(stdout, "\nSaHpiSensorEnableChangeEvent\n"); if (ptr1->fprint(stdout, 3)) { printf("Error: Unable to print the buffer.\n"); return -1; } fprintf(stdout, "\n"); printf("Success!\n"); return 0; } openhpi-3.6.1/cpp/t/tSaHpiHpiSwEvent.cpp0000644000175100017510000000216012575647263017071 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiHpiSwEvent.hpp" int main(int argc, char *argv[]) { oSaHpiHpiSwEvent *ptr1; // create the first hpi sw event ptr1 = new oSaHpiHpiSwEvent; if (ptr1 == NULL) { printf("Error: Unable to create a oSaHpiHpiSwEvent.\n"); return -1; } // print the contents of the first hpi sw event fprintf(stdout, "\nSaHpiHpiSwEvent\n"); if (ptr1->fprint(stdout, 3)) { printf("Error: Unable to print the buffer.\n"); return -1; } fprintf(stdout, "\n"); printf("Success!\n"); return 0; } openhpi-3.6.1/cpp/oSaHpiEventLogInfo.hpp0000644000175100017510000000312712575647263017135 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiEventLogInfo #define Included_oSaHpiEventLogInfo #include extern "C" { #include } class oSaHpiEventLogInfo : public SaHpiEventLogInfoT { public: // constructors oSaHpiEventLogInfo(); // copy constructor oSaHpiEventLogInfo(const oSaHpiEventLogInfo& buf); // destructor ~oSaHpiEventLogInfo() { } // other methods static bool assignField(SaHpiEventLogInfoT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiEventLogInfoT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiEventLogInfoT *buffer); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-3.6.1/cpp/oSaHpiTextBuffer.hpp0000644000175100017510000000470012575647263016652 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiTextBuffer #define Included_oSaHpiTextBuffer #include extern "C" { #include } class oSaHpiTextBuffer : public SaHpiTextBufferT { public: // constructors oSaHpiTextBuffer(); oSaHpiTextBuffer(const SaHpiTextTypeT type, const SaHpiLanguageT lang); oSaHpiTextBuffer(const SaHpiTextTypeT type, const SaHpiLanguageT lang, const char *str); oSaHpiTextBuffer(const SaHpiTextTypeT type, const SaHpiLanguageT lang, const void *str, const SaHpiUint8T len); // copy constructor oSaHpiTextBuffer(const oSaHpiTextBuffer& buf); // destructor ~oSaHpiTextBuffer() { } // other methods bool append(SaHpiTextBufferT *ptr, const char *str); inline bool append(const char *str) { return append(this, str); } bool append(SaHpiTextBufferT *ptr, const void *str, const SaHpiUint8T len); inline bool append(const void *str, const SaHpiUint8T len) { return append(this, str, len); } static bool assignField(SaHpiTextBufferT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiTextBufferT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiTextBufferT *buffer); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-3.6.1/cpp/oSaHpiUserEvent.hpp0000644000175100017510000000306612575647263016520 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiUserEvent #define Included_oSaHpiUserEvent #include extern "C" { #include } class oSaHpiUserEvent : public SaHpiUserEventT { public: // constructors oSaHpiUserEvent(); // copy constructor oSaHpiUserEvent(const oSaHpiUserEvent& buf); // destructor ~oSaHpiUserEvent() { } // other methods static bool assignField(SaHpiUserEventT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiUserEventT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiUserEventT *buffer); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-3.6.1/cpp/oSaHpiCtrlState.cpp0000644000175100017510000001073412575647263016500 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiCtrlStateStream.hpp" #include "oSaHpiCtrlStateText.hpp" #include "oSaHpiCtrlStateOem.hpp" #include "oSaHpiCtrlState.hpp" /** * Default constructor. */ oSaHpiCtrlState::oSaHpiCtrlState() { Type = SAHPI_CTRL_TYPE_DIGITAL; StateUnion.Digital = SAHPI_CTRL_STATE_OFF; }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiCtrlState::oSaHpiCtrlState(const oSaHpiCtrlState& ent) { memcpy(this, &ent, sizeof(SaHpiCtrlStateT)); } /** * Assign a field in the SaHpiCtrlStateT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiCtrlState::assignField(SaHpiCtrlStateT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "Type") == 0) { ptr->Type = oSaHpiTypesEnums::str2ctrltype(value); return false; } // StateUnion return true; }; /** * Print the contents of the entity. * * @param stream Target stream. * @param buffer Address of the SaHpiCtrlStateT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiCtrlState::fprint(FILE *stream, const int indent, const SaHpiCtrlStateT *cs) { int i, err = 0; char indent_buf[indent + 1]; if (stream == NULL || cs == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Type = %s\n", oSaHpiTypesEnums::ctrltype2str(cs->Type)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } switch (cs->Type) { case SAHPI_CTRL_TYPE_DIGITAL: { err = fprintf(stream, "StateUnion.Digital = %s\n", oSaHpiTypesEnums::ctrlstatedigital2str(cs->StateUnion.Digital)); if (err < 0) { return true; } break; } case SAHPI_CTRL_TYPE_DISCRETE: { err = fprintf(stream, "StateUnion.Discrete = %u\n", cs->StateUnion.Discrete); if (err < 0) { return true; } break; } case SAHPI_CTRL_TYPE_ANALOG: { err = fprintf(stream, "StateUnion.Analog = %d\n", cs->StateUnion.Analog); if (err < 0) { return true; } break; } case SAHPI_CTRL_TYPE_STREAM: { err = fprintf(stream, "StateUnion.Stream\n"); const SaHpiCtrlStateStreamT *css = (const SaHpiCtrlStateStreamT *)&cs->StateUnion.Stream; err = oSaHpiCtrlStateStream::fprint(stream, indent + 3, css); if (err < 0) { return true; } break; } case SAHPI_CTRL_TYPE_TEXT: { err = fprintf(stream, "StateUnion.Text\n"); const SaHpiCtrlStateTextT *cst = (const SaHpiCtrlStateTextT *)&cs->StateUnion.Text; err = oSaHpiCtrlStateText::fprint(stream, indent + 3, cst); if (err < 0) { return true; } break; } case SAHPI_CTRL_TYPE_OEM: { err = fprintf(stream, "StateUnion.Oem\n"); const SaHpiCtrlStateOemT *cso = (const SaHpiCtrlStateOemT *)&cs->StateUnion.Oem; err = oSaHpiCtrlStateOem::fprint(stream, indent + 3, cso); if (err < 0) { return true; } break; } default: err = fprintf(stream, "StateUnion = Unknown\n"); if (err < 0) { return true; } break; } return false; } openhpi-3.6.1/cpp/oSaHpiResourceInfo.hpp0000644000175100017510000000312712575647263017201 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiResourceInfo #define Included_oSaHpiResourceInfo #include extern "C" { #include } class oSaHpiResourceInfo : public SaHpiResourceInfoT { public: // constructors oSaHpiResourceInfo(); // copy constructor oSaHpiResourceInfo(const oSaHpiResourceInfo& buf); // destructor ~oSaHpiResourceInfo() { } // other methods static bool assignField(SaHpiResourceInfoT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiResourceInfoT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiResourceInfoT *buffer); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-3.6.1/cpp/oSaHpiEvent.cpp0000644000175100017510000001544512575647263015660 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiResourceEvent.hpp" #include "oSaHpiDomainEvent.hpp" #include "oSaHpiSensorEvent.hpp" #include "oSaHpiSensorEnableChangeEvent.hpp" #include "oSaHpiHotSwapEvent.hpp" #include "oSaHpiWatchdogEvent.hpp" #include "oSaHpiHpiSwEvent.hpp" #include "oSaHpiOemEvent.hpp" #include "oSaHpiUserEvent.hpp" #include "oSaHpiEvent.hpp" /** * Default constructor. */ oSaHpiEvent::oSaHpiEvent() { Source = 1; EventType = SAHPI_ET_RESOURCE; Timestamp = 0; Severity = SAHPI_OK; EventDataUnion.ResourceEvent.ResourceEventType = SAHPI_RESE_RESOURCE_ADDED; }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiEvent::oSaHpiEvent(const oSaHpiEvent& buf) { memcpy(this, &buf, sizeof(SaHpiEventT)); } /** * Assign a field in the SaHpiEventT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiEvent::assignField(SaHpiEventT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "Source") == 0) { ptr->Source = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "EventType") == 0) { ptr->EventType = oSaHpiTypesEnums::str2eventtype(value); return false; } else if (strcmp(field, "Timestamp") == 0) { ptr->Timestamp = strtoull(value, NULL, 10); return false; } else if (strcmp(field, "Severity") == 0) { ptr->Severity = oSaHpiTypesEnums::str2severity(value); return false; } // Event return true; }; /** * Print the contents of the buffer. * * @param stream Target stream. * @param buffer Address of the SaHpiEventT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiEvent::fprint(FILE *stream, const int indent, const SaHpiEventT *buffer) { int i, err; char indent_buf[indent + 1]; if (stream == NULL || buffer == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Source = %u\n", buffer->Source); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "EventType = %s\n", oSaHpiTypesEnums::eventtype2str(buffer->EventType)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Timestamp = %lld\n", buffer->Timestamp); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Severity = %s\n", oSaHpiTypesEnums::severity2str(buffer->Severity)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "EventDataUnion\n"); if (err < 0) { return true; } switch (buffer->EventType) { case SAHPI_ET_RESOURCE: { const SaHpiResourceEventT *re = (const SaHpiResourceEventT *)&buffer->EventDataUnion.ResourceEvent; err = oSaHpiResourceEvent::fprint(stream, indent + 3, re); if (err < 0) { return true; } break; } case SAHPI_ET_DOMAIN: { const SaHpiDomainEventT *de = (const SaHpiDomainEventT *)&buffer->EventDataUnion.DomainEvent; err = oSaHpiDomainEvent::fprint(stream, indent + 3, de); if (err < 0) { return true; } break; } case SAHPI_ET_SENSOR: { const SaHpiSensorEventT *se = (const SaHpiSensorEventT *)&buffer->EventDataUnion.SensorEvent; err = oSaHpiSensorEvent::fprint(stream, indent + 3, se); if (err < 0) { return true; } break; } case SAHPI_ET_SENSOR_ENABLE_CHANGE: { const SaHpiSensorEnableChangeEventT *sec = (const SaHpiSensorEnableChangeEventT *)&buffer->EventDataUnion.SensorEnableChangeEvent; err = oSaHpiSensorEnableChangeEvent::fprint(stream, indent + 3, sec); if (err < 0) { return true; } break; } case SAHPI_ET_HOTSWAP: { const SaHpiHotSwapEventT *hs = (const SaHpiHotSwapEventT *)&buffer->EventDataUnion.HotSwapEvent; err = oSaHpiHotSwapEvent::fprint(stream, indent + 3, hs); if (err < 0) { return true; } break; } case SAHPI_ET_WATCHDOG: { const SaHpiWatchdogEventT *we = (const SaHpiWatchdogEventT *)&buffer->EventDataUnion.WatchdogEvent; err = oSaHpiWatchdogEvent::fprint(stream, indent + 3, we); if (err < 0) { return true; } break; } case SAHPI_ET_HPI_SW: { const SaHpiHpiSwEventT *hpise = (const SaHpiHpiSwEventT *)&buffer->EventDataUnion.HpiSwEvent; err = oSaHpiHpiSwEvent::fprint(stream, indent + 3, hpise); if (err < 0) { return true; } break; } case SAHPI_ET_OEM: { const SaHpiOemEventT *oe = (const SaHpiOemEventT *)&buffer->EventDataUnion.OemEvent; err = oSaHpiOemEvent::fprint(stream, indent + 3, oe); if (err < 0) { return true; } break; } case SAHPI_ET_USER: { const SaHpiUserEventT *ue = (const SaHpiUserEventT *)&buffer->EventDataUnion.UserEvent; err = oSaHpiUserEvent::fprint(stream, indent + 3, ue); if (err < 0) { return true; } break; } default: err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, " Unknown\n"); if (err < 0) { return true; } } return false; } openhpi-3.6.1/cpp/oSaHpiCtrlStateStream.cpp0000644000175100017510000001125012575647263017646 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiCtrlStateStream.hpp" /** * Default constructor. */ oSaHpiCtrlStateStream::oSaHpiCtrlStateStream() { Repeat = false; StreamLength = 0; Stream[0] = '\0'; }; /** * Constructor. * * @param type The repeat boolean. * @param str The zero-terminated character string to be assigned to the * stream. */ oSaHpiCtrlStateStream::oSaHpiCtrlStateStream(const SaHpiBoolT rep, const char *str) { Repeat = rep; if (strlen(str) < SAHPI_CTRL_MAX_STREAM_LENGTH) { StreamLength = strlen(str); strcpy((char *)Stream, str); } else { StreamLength = SAHPI_CTRL_MAX_STREAM_LENGTH; memcpy(Stream, str, SAHPI_CTRL_MAX_STREAM_LENGTH); } }; /** * Constructor. * * @param type The repeat boolean. * @param str The data to be assigned to the stream. * @param len The length of the data to be assigned to the stream. */ oSaHpiCtrlStateStream::oSaHpiCtrlStateStream(const SaHpiBoolT rep, const void *str, const SaHpiUint8T len) { Repeat = rep; if (len <= SAHPI_CTRL_MAX_STREAM_LENGTH) { StreamLength = len; memcpy(Stream, str, len); } else { StreamLength = SAHPI_CTRL_MAX_STREAM_LENGTH; memcpy(Stream, str, SAHPI_CTRL_MAX_STREAM_LENGTH); } }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiCtrlStateStream::oSaHpiCtrlStateStream(const oSaHpiCtrlStateStream& buf) { memcpy(this, &buf, sizeof(SaHpiCtrlStateStreamT)); } /** * Assign a field in the SaHpiCtrlStateStreamT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiCtrlStateStream::assignField(SaHpiCtrlStateStreamT *ptr, const char *field, const char *value) { // note that DataLength cannot be assigned a value using this method if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "Repeat") == 0) { ptr->Repeat = oSaHpiTypesEnums::str2torf(value); return false; } else if (strcmp(field, "Stream") == 0) { if (strlen(value) < SAHPI_CTRL_MAX_STREAM_LENGTH) { ptr->StreamLength = strlen(value); strcpy((char *)ptr->Stream, value); } else { ptr->StreamLength = SAHPI_CTRL_MAX_STREAM_LENGTH; memcpy(ptr->Stream, value, SAHPI_CTRL_MAX_STREAM_LENGTH); } return false; } return true; }; /** * Print the contents of the buffer. * * @param stream Target stream. * @param buffer Address of the SaHpiCtrlStateStreamT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiCtrlStateStream::fprint(FILE *stream, const int indent, const SaHpiCtrlStateStreamT *buffer) { unsigned int i; int err; char indent_buf[indent + 1]; if (stream == NULL || buffer == NULL) { return true; } for (i = 0; i < (unsigned int)indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Repeat = %s\n", oSaHpiTypesEnums::torf2str(buffer->Repeat)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Stream = "); for (i = 0; i < buffer->StreamLength; i++) { err = fprintf(stream, "%c\n", buffer->Stream[i]); if (err < 0) { return true; } } err = fprintf(stream, "\n"); if (err < 0) { return true; } return false; } openhpi-3.6.1/cpp/oSaHpiHotSwapEvent.hpp0000644000175100017510000000312312575647263017161 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiHotSwapEvent #define Included_oSaHpiHotSwapEvent #include extern "C" { #include } class oSaHpiHotSwapEvent : public SaHpiHotSwapEventT { public: // constructors oSaHpiHotSwapEvent(); // copy constructor oSaHpiHotSwapEvent(const oSaHpiHotSwapEvent& sr); // destructor ~oSaHpiHotSwapEvent() { } // other methods static bool assignField(SaHpiHotSwapEventT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiHotSwapEventT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiHotSwapEventT *ent); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-3.6.1/cpp/oSaHpiWatchdog.hpp0000644000175100017510000000305312575647263016334 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiWatchdog #define Included_oSaHpiWatchdog #include extern "C" { #include } class oSaHpiWatchdog : public SaHpiWatchdogT { public: // constructors oSaHpiWatchdog(); // copy constructor oSaHpiWatchdog(const oSaHpiWatchdog& buf); // destructor ~oSaHpiWatchdog() { } // other methods static bool assignField(SaHpiWatchdogT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiWatchdogT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiWatchdogT *buffer); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-3.6.1/cpp/oSaHpiCtrlRecAnalog.cpp0000644000175100017510000000652612575647263017257 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiCtrlRecAnalog.hpp" /** * Default constructor. */ oSaHpiCtrlRecAnalog::oSaHpiCtrlRecAnalog() { Min = 0; Max = 0; Default = 0; }; /** * Constructor. */ oSaHpiCtrlRecAnalog::oSaHpiCtrlRecAnalog(SaHpiCtrlStateAnalogT mn, SaHpiCtrlStateAnalogT mx, SaHpiCtrlStateAnalogT def) { Min = mn; Max = mx; Default = def; }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiCtrlRecAnalog::oSaHpiCtrlRecAnalog(const oSaHpiCtrlRecAnalog& ent) { memcpy(this, &ent, sizeof(SaHpiCtrlRecAnalogT)); } /** * Assign a field in the SaHpiCtrlRecAnalogT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiCtrlRecAnalog::assignField(SaHpiCtrlRecAnalogT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "Min") == 0) { ptr->Min = atoi(value); return false; } else if (strcmp(field, "Max") == 0) { ptr->Max = atoi(value); return false; } else if (strcmp(field, "Default") == 0) { ptr->Default = atoi(value); return false; } return true; }; /** * Print the contents of the entity. * * @param stream Target stream. * @param buffer Address of the SaHpiCtrlRecAnalogT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiCtrlRecAnalog::fprint(FILE *stream, const int indent, const SaHpiCtrlRecAnalogT *cra) { int i, err = 0; char indent_buf[indent + 1]; if (stream == NULL || cra == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Min = %d\n", cra->Min); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Max = %d\n", cra->Max); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Default = %d\n", cra->Default); if (err < 0) { return true; } return false; } openhpi-3.6.1/cpp/oSaHpiName.cpp0000644000175100017510000000670512575647263015456 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiName.hpp" /** * Default constructor. */ oSaHpiName::oSaHpiName() { Length = 0; Value[0] = '\0'; }; /** * Constructor. * * @param str The zero-terminated character string to be assigned to the * stream. */ oSaHpiName::oSaHpiName(const char *str) { if (strlen(str) < SA_HPI_MAX_NAME_LENGTH) { Length = strlen(str); strcpy((char *)Value, str); } else { Length = SA_HPI_MAX_NAME_LENGTH; memcpy(Value, str, SA_HPI_MAX_NAME_LENGTH); } }; /** * Constructor. * * @param str The data to be assigned to the stream. * @param len The length of the data to be assigned to the stream. */ oSaHpiName::oSaHpiName(const void *str, const SaHpiUint8T len) { Length = len; memcpy(Value, str, len); }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiName::oSaHpiName(const oSaHpiName& buf) { memcpy(this, &buf, sizeof(SaHpiNameT)); } /** * Assign a field in the SaHpiNameT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiName::assignField(SaHpiNameT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "Value") == 0) { if (strlen(value) < SA_HPI_MAX_NAME_LENGTH) { ptr->Length = strlen(value); strcpy((char *)ptr->Value, value); } else { ptr->Length = SA_HPI_MAX_NAME_LENGTH; memcpy(ptr->Value, value, SA_HPI_MAX_NAME_LENGTH); } return false; } return true; }; /** * Print the contents of the buffer. * * @param stream Target stream. * @param buffer Address of the SaHpiNameT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiName::fprint(FILE *stream, const int indent, const SaHpiNameT *buffer) { int i, err; char indent_buf[indent + 1]; if (stream == NULL || buffer == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Value = "); for (i = 0; i < buffer->Length; i++) { err = fprintf(stream, "%c\n", buffer->Value[i]); if (err < 0) { return true; } } err = fprintf(stream, "\n"); if (err < 0) { return true; } return false; } openhpi-3.6.1/cpp/oSaHpiEntity.hpp0000644000175100017510000000317212575647263016052 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiEntity #define Included_oSaHpiEntity #include extern "C" { #include } class oSaHpiEntity : public SaHpiEntityT { public: // constructors oSaHpiEntity(); oSaHpiEntity(const SaHpiEntityTypeT type, const SaHpiEntityLocationT loc); // copy constructor oSaHpiEntity(const oSaHpiEntity& ent); // destructor ~oSaHpiEntity() { } // other methods static bool assignField(SaHpiEntityT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiEntityT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiEntityT *ent); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-3.6.1/cpp/oSaHpiOemEvent.hpp0000644000175100017510000000305312575647263016316 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiOemEvent #define Included_oSaHpiOemEvent #include extern "C" { #include } class oSaHpiOemEvent : public SaHpiOemEventT { public: // constructors oSaHpiOemEvent(); // copy constructor oSaHpiOemEvent(const oSaHpiOemEvent& buf); // destructor ~oSaHpiOemEvent() { } // other methods static bool assignField(SaHpiOemEventT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiOemEventT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiOemEventT *buffer); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-3.6.1/cpp/oSaHpiAnnunciatorRec.cpp0000644000175100017510000001007312575647263017502 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiAnnunciatorRec.hpp" /** * Default constructor. */ oSaHpiAnnunciatorRec::oSaHpiAnnunciatorRec() { AnnunciatorNum = 1; AnnunciatorType = SAHPI_ANNUNCIATOR_TYPE_LED; ModeReadOnly = false; MaxConditions = 0; Oem = 0; }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiAnnunciatorRec::oSaHpiAnnunciatorRec(const oSaHpiAnnunciatorRec& buf) { memcpy(this, &buf, sizeof(SaHpiAnnunciatorRecT)); } /** * Assign a field in the SaHpiAnnunciatorRecT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiAnnunciatorRec::assignField(SaHpiAnnunciatorRecT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "AnnunciatorNum") == 0) { ptr->AnnunciatorNum = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "AnnunciatorType") == 0) { ptr->AnnunciatorType = oSaHpiTypesEnums::str2annunciatortype(value); return false; } else if (strcmp(field, "ModeReadOnly") == 0) { ptr->ModeReadOnly = oSaHpiTypesEnums::str2torf(value); return false; } else if (strcmp(field, "MaxConditions") == 0) { ptr->MaxConditions = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "Oem") == 0) { ptr->Oem = strtoul(value, NULL, 10); return false; } return true; }; /** * Print the contents of the buffer. * * @param stream Target stream. * @param buffer Address of the SaHpiAnnunciatorRecT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiAnnunciatorRec::fprint(FILE *stream, const int indent, const SaHpiAnnunciatorRecT *buffer) { int i, err; char indent_buf[indent + 1]; if (stream == NULL || buffer == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "AnnunciatorNum = %d\n", buffer->AnnunciatorNum); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "AnnunciatorType = %s\n", oSaHpiTypesEnums::annunciatortype2str(buffer->AnnunciatorType)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "ModeReadOnly = %s\n", oSaHpiTypesEnums::torf2str(buffer->ModeReadOnly)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "MaxConditions = %u\n", buffer->MaxConditions); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Oem = %u\n", buffer->Oem); if (err < 0) { return true; } return false; } openhpi-3.6.1/cpp/oSaHpiDrtEntry.hpp0000644000175100017510000000305312575647263016347 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiDrtEntry #define Included_oSaHpiDrtEntry #include extern "C" { #include } class oSaHpiDrtEntry : public SaHpiDrtEntryT { public: // constructors oSaHpiDrtEntry(); // copy constructor oSaHpiDrtEntry(const oSaHpiDrtEntry& buf); // destructor ~oSaHpiDrtEntry() { } // other methods static bool assignField(SaHpiDrtEntryT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiDrtEntryT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiDrtEntryT *buffer); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-3.6.1/cpp/oSaHpiRptEntry.hpp0000644000175100017510000000305312575647263016363 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiRptEntry #define Included_oSaHpiRptEntry #include extern "C" { #include } class oSaHpiRptEntry : public SaHpiRptEntryT { public: // constructors oSaHpiRptEntry(); // copy constructor oSaHpiRptEntry(const oSaHpiRptEntry& buf); // destructor ~oSaHpiRptEntry() { } // other methods static bool assignField(SaHpiRptEntryT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiRptEntryT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiRptEntryT *buffer); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-3.6.1/cpp/oSaHpiCtrlRecOem.hpp0000644000175100017510000000331012575647263016567 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiCtrlRecOem #define Included_oSaHpiCtrlRecOem #include extern "C" { #include } class oSaHpiCtrlRecOem : public SaHpiCtrlRecOemT { public: // constructors oSaHpiCtrlRecOem(); oSaHpiCtrlRecOem(SaHpiManufacturerIdT id, const char *config, const char *str); // copy constructor oSaHpiCtrlRecOem(const oSaHpiCtrlRecOem& crd); // destructor ~oSaHpiCtrlRecOem() { } // other methods static bool assignField(SaHpiCtrlRecOemT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiCtrlRecOemT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiCtrlRecOemT *ent); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-3.6.1/cpp/oSaHpiName.hpp0000644000175100017510000000316312575647263015456 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiName #define Included_oSaHpiName #include extern "C" { #include } class oSaHpiName : public SaHpiNameT { public: // constructors oSaHpiName(); oSaHpiName(const char *str); oSaHpiName(const void *str, const SaHpiUint8T len); // copy constructor oSaHpiName(const oSaHpiName& buf); // destructor ~oSaHpiName() { } // other methods static bool assignField(SaHpiNameT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiNameT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiNameT *buffer); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-3.6.1/cpp/oSaHpiCtrlStateText.cpp0000644000175100017510000000710512575647263017343 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiTextBuffer.hpp" #include "oSaHpiCtrlStateText.hpp" /** * Default constructor. */ oSaHpiCtrlStateText::oSaHpiCtrlStateText() { Line = 0; Text.DataType = SAHPI_TL_TYPE_TEXT; Text.Language = SAHPI_LANG_ENGLISH; Text.DataLength = 0; Text.Data[0] = '\0'; }; /** * Constructor. * * @param str The zero-terminated character string to be assigned to the * text filed. */ oSaHpiCtrlStateText::oSaHpiCtrlStateText(const char *str) { Line = 0; Text.DataType = SAHPI_TL_TYPE_TEXT; Text.Language = SAHPI_LANG_ENGLISH; if (strlen(str) < SAHPI_CTRL_MAX_STREAM_LENGTH) { Text.DataLength = strlen(str); strcpy((char *)Text.Data, str); } else { Text.DataLength = SAHPI_CTRL_MAX_STREAM_LENGTH; memcpy(Text.Data, str, SAHPI_CTRL_MAX_STREAM_LENGTH); } }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiCtrlStateText::oSaHpiCtrlStateText(const oSaHpiCtrlStateText& buf) { memcpy(this, &buf, sizeof(SaHpiCtrlStateTextT)); } /** * Assign a field in the SaHpiCtrlStateTextT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiCtrlStateText::assignField(SaHpiCtrlStateTextT *ptr, const char *field, const char *value) { // note that DataLength cannot be assigned a value using this method if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "Line") == 0) { ptr->Line = (SaHpiUint8T)atoi(value); return false; } // Text return true; }; /** * Print the contents of the buffer. * * @param stream Target stream. * @param buffer Address of the SaHpiCtrlStateTextT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiCtrlStateText::fprint(FILE *stream, const int indent, const SaHpiCtrlStateTextT *buffer) { int i, err; char indent_buf[indent + 1]; if (stream == NULL || buffer == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Line = %d\n", buffer->Line); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Text\n"); const SaHpiTextBufferT *tb = (const SaHpiTextBufferT *)&buffer->Text; err = oSaHpiTextBuffer::fprint(stream, indent + 3, tb); if (err < 0) { return true; } return false; } openhpi-3.6.1/cpp/oSaHpiIdrField.cpp0000644000175100017510000001006612575647263016253 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiTextBuffer.hpp" #include "oSaHpiIdrField.hpp" /** * Default constructor. */ oSaHpiIdrField::oSaHpiIdrField() { AreaId = 1; FieldId = 1; Type = SAHPI_IDR_FIELDTYPE_UNSPECIFIED; ReadOnly = false; Field.DataType = SAHPI_TL_TYPE_TEXT; Field.Language = SAHPI_LANG_ENGLISH; Field.DataLength = 0; Field.Data[0] = '\0'; }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiIdrField::oSaHpiIdrField(const oSaHpiIdrField& buf) { memcpy(this, &buf, sizeof(SaHpiIdrFieldT)); } /** * Assign a field in the SaHpiIdrFieldT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiIdrField::assignField(SaHpiIdrFieldT *ptr, const char *field, const char *value) { // note that DataLength cannot be assigned a value using this method if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "AreaId") == 0) { ptr->AreaId = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "FieldId") == 0) { ptr->FieldId = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "Type") == 0) { ptr->Type = oSaHpiTypesEnums::str2idrfieldtype(value); return false; } else if (strcmp(field, "ReadOnly") == 0) { ptr->ReadOnly = oSaHpiTypesEnums::str2torf(value); return false; } // Field return true; }; /** * Print the contents of the buffer. * * @param stream Target stream. * @param buffer Address of the SaHpiIdrFieldT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiIdrField::fprint(FILE *stream, const int indent, const SaHpiIdrFieldT *buffer) { int i, err; char indent_buf[indent + 1]; if (stream == NULL || buffer == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "AreaId = %d\n", buffer->AreaId); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "FieldId = %d\n", buffer->FieldId); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Type = %s\n", oSaHpiTypesEnums::idrfieldtype2str(buffer->Type)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "ReadOnly = %s\n", oSaHpiTypesEnums::torf2str(buffer->ReadOnly)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Field\n"); const SaHpiTextBufferT *tb = (const SaHpiTextBufferT *)&buffer->Field; err = oSaHpiTextBuffer::fprint(stream, indent + 3, tb); if (err < 0) { return true; } return false; } openhpi-3.6.1/cpp/oSaHpiIdrInfo.hpp0000644000175100017510000000304012575647263016122 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiIdrInfo #define Included_oSaHpiIdrInfo #include extern "C" { #include } class oSaHpiIdrInfo : public SaHpiIdrInfoT { public: // constructors oSaHpiIdrInfo(); // copy constructor oSaHpiIdrInfo(const oSaHpiIdrInfo& buf); // destructor ~oSaHpiIdrInfo() { } // other methods static bool assignField(SaHpiIdrInfoT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiIdrInfoT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiIdrInfoT *buffer); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-3.6.1/cpp/oSaHpiDomainEvent.cpp0000644000175100017510000000557712575647263017015 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiDomainEvent.hpp" /** * Default constructor. */ oSaHpiDomainEvent::oSaHpiDomainEvent() { Type = SAHPI_DOMAIN_REF_ADDED; DomainId = SAHPI_UNSPECIFIED_DOMAIN_ID; }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiDomainEvent::oSaHpiDomainEvent(const oSaHpiDomainEvent& buf) { memcpy(this, &buf, sizeof(SaHpiDomainEventT)); } /** * Assign a field in the SaHpiDomainEventT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiDomainEvent::assignField(SaHpiDomainEventT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "Type") == 0) { ptr->Type = oSaHpiTypesEnums::str2domaineventtype(value); return false; } if (strcmp(field, "DomainId") == 0) { ptr->DomainId = strtoul(value, NULL, 10); return false; } return true; }; /** * Print the contents of the buffer. * * @param stream Target stream. * @param buffer Address of the SaHpiDomainEventT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiDomainEvent::fprint(FILE *stream, const int indent, const SaHpiDomainEventT *buffer) { int i, err; char indent_buf[indent + 1]; if (stream == NULL || buffer == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Type = %s\n", oSaHpiTypesEnums::domaineventtype2str(buffer->Type)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "DomainId = %d\n", buffer->DomainId); if (err < 0) { return true; } return false; } openhpi-3.6.1/cpp/oSaHpiWatchdogEvent.hpp0000644000175100017510000000313612575647263017340 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiWatchdogEvent #define Included_oSaHpiWatchdogEvent #include extern "C" { #include } class oSaHpiWatchdogEvent : public SaHpiWatchdogEventT { public: // constructors oSaHpiWatchdogEvent(); // copy constructor oSaHpiWatchdogEvent(const oSaHpiWatchdogEvent& sr); // destructor ~oSaHpiWatchdogEvent() { } // other methods static bool assignField(SaHpiWatchdogEventT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiWatchdogEventT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiWatchdogEventT *ent); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-3.6.1/cpp/oSaHpiCtrlRecText.hpp0000644000175100017510000000345712575647263017007 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiCtrlRecText #define Included_oSaHpiCtrlRecText #include extern "C" { #include } class oSaHpiCtrlRecText : public SaHpiCtrlRecTextT { public: // constructors oSaHpiCtrlRecText(); oSaHpiCtrlRecText(SaHpiUint8T maxch, SaHpiUint8T maxlin, SaHpiLanguageT lang, SaHpiTextTypeT type, const char *str); // copy constructor oSaHpiCtrlRecText(const oSaHpiCtrlRecText& crd); // destructor ~oSaHpiCtrlRecText() { } // other methods static bool assignField(SaHpiCtrlRecTextT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiCtrlRecTextT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiCtrlRecTextT *ent); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-3.6.1/cpp/oSaHpiRptEntry.cpp0000644000175100017510000001415412575647263016362 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiResourceInfo.hpp" #include "oSaHpiEntityPath.hpp" #include "oSaHpiTextBuffer.hpp" #include "oSaHpiRptEntry.hpp" /** * Default constructor. */ oSaHpiRptEntry::oSaHpiRptEntry() { int i; EntryId = 1; ResourceId = 1; ResourceInfo.ResourceRev = 0; ResourceInfo.SpecificVer = 0; ResourceInfo.DeviceSupport = 0; ResourceInfo.ManufacturerId = SAHPI_MANUFACTURER_ID_UNSPECIFIED; ResourceInfo.ProductId = 0; ResourceInfo.FirmwareMajorRev = 0; ResourceInfo.FirmwareMinorRev = 0; ResourceInfo.AuxFirmwareRev = 0; for (i = 0; i < 16; i++) { ResourceInfo.Guid[i] = 0; } ResourceEntity.Entry[0].EntityType = SAHPI_ENT_ROOT; ResourceEntity.Entry[0].EntityLocation = 0; ResourceCapabilities = (SaHpiCapabilitiesT)0; HotSwapCapabilities = (SaHpiHsCapabilitiesT)0; ResourceSeverity = SAHPI_OK; ResourceFailed = false; ResourceTag.DataType = SAHPI_TL_TYPE_TEXT; ResourceTag.Language = SAHPI_LANG_ENGLISH; ResourceTag.DataLength = 0; ResourceTag.Data[0] = '\0'; }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiRptEntry::oSaHpiRptEntry(const oSaHpiRptEntry& buf) { memcpy(this, &buf, sizeof(SaHpiRptEntryT)); } /** * Assign a field in the SaHpiRptEntryT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiRptEntry::assignField(SaHpiRptEntryT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "EntryId") == 0) { ptr->EntryId = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "ResourceId") == 0) { ptr->ResourceId = strtoul(value, NULL, 10); return false; } // ResourceInfo // ResourceEntity else if (strcmp(field, "ResourceCapabilities") == 0) { ptr->ResourceCapabilities |= oSaHpiTypesEnums::str2capabilities(value); return false; } else if (strcmp(field, "HotSwapCapabilities") == 0) { ptr->HotSwapCapabilities |= oSaHpiTypesEnums::str2hscapabilities(value); return false; } else if (strcmp(field, "ResourceSeverity") == 0) { ptr->ResourceSeverity = oSaHpiTypesEnums::str2severity(value); return false; } else if (strcmp(field, "ResourceFailed") == 0) { ptr->ResourceFailed = oSaHpiTypesEnums::str2torf(value); return false; } // ResourceTag return true; }; /** * Print the contents of the buffer. * * @param stream Target stream. * @param buffer Address of the SaHpiRptEntryT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiRptEntry::fprint(FILE *stream, const int indent, const SaHpiRptEntryT *buffer) { int i, err; char indent_buf[indent + 1]; if (stream == NULL || buffer == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "EntryId = %d\n", buffer->EntryId); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "ResourceId = %d\n", buffer->ResourceId); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "ResourceInfo\n"); if (err < 0) { return true; } const SaHpiResourceInfoT *ri = (const SaHpiResourceInfoT *)&buffer->ResourceInfo; err = oSaHpiResourceInfo::fprint(stream, indent + 3, ri); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "ResourceEntity\n"); if (err < 0) { return true; } const SaHpiEntityPathT *ep = (const SaHpiEntityPathT *)&buffer->ResourceEntity; err = oSaHpiEntityPath::fprint(stream, indent + 3, ep); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "ResourceCapabilities = %X\n", buffer->ResourceCapabilities); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "HotSwapCapabilities = %X\n", buffer->HotSwapCapabilities); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "ResourceSeverity = %s\n", oSaHpiTypesEnums::severity2str(buffer->ResourceSeverity)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "ResourceTag\n"); if (err < 0) { return true; } const SaHpiTextBufferT *tb = (const SaHpiTextBufferT *)&buffer->ResourceTag; err = oSaHpiTextBuffer::fprint(stream, indent + 3, tb); if (err < 0) { return true; } return false; } openhpi-3.6.1/cpp/oSaHpiSensorThresholds.hpp0000644000175100017510000000253012575647263020104 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiSensorThresholds #define Included_oSaHpiSensorThresholds #include extern "C" { #include } #include "oSaHpiSensorReading.hpp" class oSaHpiSensorThresholds : public SaHpiSensorThresholdsT { public: // constructors oSaHpiSensorThresholds(); // copy constructor oSaHpiSensorThresholds(const oSaHpiSensorThresholds& sr); // destructor ~oSaHpiSensorThresholds() { } // other methods inline SaHpiSensorThresholdsT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiSensorThresholdsT *ent); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-3.6.1/cpp/oSaHpiHotSwapEvent.cpp0000644000175100017510000000601512575647263017157 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiHotSwapEvent.hpp" /** * Default constructor. */ oSaHpiHotSwapEvent::oSaHpiHotSwapEvent() { HotSwapState = SAHPI_HS_STATE_ACTIVE; PreviousHotSwapState = SAHPI_HS_STATE_NOT_PRESENT; }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiHotSwapEvent::oSaHpiHotSwapEvent(const oSaHpiHotSwapEvent& range) { memcpy(this, &range, sizeof(SaHpiHotSwapEventT)); } /** * Assign a field in the SaHpiHotSwapEventT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiHotSwapEvent::assignField(SaHpiHotSwapEventT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "HotSwapState") == 0) { ptr->HotSwapState = oSaHpiTypesEnums::str2hsstate(value); return false; } else if (strcmp(field, "PreviousHotSwapState") == 0) { ptr->PreviousHotSwapState = oSaHpiTypesEnums::str2hsstate(value); return false; } return true; }; /** * Print the contents of the entity. * * @param stream Target stream. * @param buffer Address of the SaHpiHotSwapEventT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiHotSwapEvent::fprint(FILE *stream, const int indent, const SaHpiHotSwapEventT *hse) { int i, err = 0; char indent_buf[indent + 1]; if (stream == NULL || hse == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "HotSwapState = %s\n", oSaHpiTypesEnums::hsstate2str(hse->HotSwapState)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "PreviousHotSwapState = %s\n", oSaHpiTypesEnums::hsstate2str(hse->PreviousHotSwapState)); if (err < 0) { return true; } return false; } openhpi-3.6.1/cpp/oSaHpiCtrlRecText.cpp0000644000175100017510000001170012575647263016770 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiTextBuffer.hpp" #include "oSaHpiCtrlStateText.hpp" #include "oSaHpiCtrlRecText.hpp" /** * Default constructor. */ oSaHpiCtrlRecText::oSaHpiCtrlRecText() { MaxChars = SAHPI_MAX_TEXT_BUFFER_LENGTH; MaxLines = 1; Language = SAHPI_LANG_ENGLISH; DataType = SAHPI_TL_TYPE_TEXT; Default.Line = 1; Default.Text.Language = SAHPI_LANG_ENGLISH; Default.Text.DataType = SAHPI_TL_TYPE_TEXT; Default.Text.DataLength = 0; Default.Text.Data[0] = '\0'; }; /** * Constructor. */ oSaHpiCtrlRecText::oSaHpiCtrlRecText(SaHpiUint8T maxch, SaHpiUint8T maxlin, SaHpiLanguageT lang, SaHpiTextTypeT type, const char *str) { MaxChars = maxch; MaxLines = maxlin; Language = lang; DataType = type; Default.Line = 1; Default.Text.Language = lang; Default.Text.DataType = type; if (strlen(str) < MaxChars) { Default.Text.DataLength = strlen(str); strcpy((char *)Default.Text.Data, str); } else { Default.Text.DataLength = MaxChars; memcpy(Default.Text.Data, str, MaxChars); } }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiCtrlRecText::oSaHpiCtrlRecText(const oSaHpiCtrlRecText& ent) { memcpy(this, &ent, sizeof(SaHpiCtrlRecTextT)); } /** * Assign a field in the SaHpiCtrlRecTextT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiCtrlRecText::assignField(SaHpiCtrlRecTextT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "MaxChars") == 0) { ptr->MaxChars = (SaHpiUint8T)atoi(value); return false; } else if (strcmp(field, "MaxLines") == 0) { ptr->MaxLines = (SaHpiUint8T)atoi(value); return false; } else if (strcmp(field, "Language") == 0) { ptr->Language = oSaHpiTypesEnums::str2language(value); return false; } else if (strcmp(field, "DataType") == 0) { ptr->DataType = oSaHpiTypesEnums::str2texttype(value); return false; } // Default return true; }; /** * Print the contents of the entity. * * @param stream Target stream. * @param buffer Address of the SaHpiCtrlRecTextT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiCtrlRecText::fprint(FILE *stream, const int indent, const SaHpiCtrlRecTextT *txt) { int i, err = 0; char indent_buf[indent + 1]; if (stream == NULL || txt == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "MaxChars = %u\n", txt->MaxChars); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "MaxLines = %u\n", txt->MaxLines); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Language = %s\n", oSaHpiTypesEnums::language2str(txt->Language)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "DataType = %s\n", oSaHpiTypesEnums::texttype2str(txt->DataType)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Default\n"); if (err < 0) { return true; } const SaHpiCtrlStateTextT *cs = (const SaHpiCtrlStateTextT *)&txt->Default; err = oSaHpiCtrlStateText::fprint(stream, indent + 3, cs); if (err < 0) { return true; } return false; } openhpi-3.6.1/cpp/oSaHpiCtrlStateStream.hpp0000644000175100017510000000356512575647263017665 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiCtrlStateStream #define Included_oSaHpiCtrlStateStream #include extern "C" { #include } class oSaHpiCtrlStateStream : public SaHpiCtrlStateStreamT { public: // constructors oSaHpiCtrlStateStream(); oSaHpiCtrlStateStream(const SaHpiBoolT rep, const char *str); oSaHpiCtrlStateStream(const SaHpiBoolT rep, const void *str, const SaHpiUint8T len); // copy constructor oSaHpiCtrlStateStream(const oSaHpiCtrlStateStream& buf); // destructor ~oSaHpiCtrlStateStream() { } // other methods static bool assignField(SaHpiCtrlStateStreamT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiCtrlStateStreamT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiCtrlStateStreamT *buffer); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-3.6.1/cpp/oSaHpiRdr.hpp0000644000175100017510000000276412575647263015333 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiRdr #define Included_oSaHpiRdr #include extern "C" { #include } class oSaHpiRdr : public SaHpiRdrT { public: // constructors oSaHpiRdr(); // copy constructor oSaHpiRdr(const oSaHpiRdr& buf); // destructor ~oSaHpiRdr() { } // other methods static bool assignField(SaHpiRdrT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiRdrT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiRdrT *buffer); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-3.6.1/cpp/oSaHpiTypesEnums.hpp0000644000175100017510000001606012575647263016712 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiTypesEnums #define Included_oSaHpiTypesEnums extern "C" { #include } class oSaHpiTypesEnums { public: // all the real methods in this class are static // so they can be used from any other class static SaHpiBoolT str2torf(const char *str); static const char * torf2str(SaHpiBoolT f); static SaHpiLanguageT str2language(const char *strtype); static const char * language2str(SaHpiLanguageT value); static SaHpiTextTypeT str2texttype(const char *type); static const char * texttype2str(SaHpiTextTypeT value); static SaHpiEntityTypeT str2entitytype(const char *strtype); static const char * entitytype2str(SaHpiEntityTypeT value); static SaHpiSensorReadingTypeT str2sensorreadingtype(const char *strtype); static const char * sensorreadingtype2str(SaHpiSensorReadingTypeT value); static SaHpiSensorUnitsT str2sensorunits(const char *strtype); static const char * sensorunits2str(SaHpiSensorUnitsT value); static SaHpiSensorModUnitUseT str2sensoruse(const char *strtype); static const char * sensoruse2str(SaHpiSensorModUnitUseT value); static SaHpiSensorThdMaskT str2sensorthdmask(const char *strtype); static const char * sensorthdmask2str(SaHpiSensorThdMaskT value); static SaHpiSensorEventCtrlT str2sensoreventctrl(const char *strtype); static const char * sensoreventctrl2str(SaHpiSensorEventCtrlT value); static SaHpiSensorTypeT str2sensortype(const char *strtype); static const char * sensortype2str(SaHpiSensorTypeT value); static SaHpiEventCategoryT str2eventcategory(const char *strtype); static const char * eventcategory2str(SaHpiEventCategoryT value); static SaHpiEventStateT str2eventstate(const char *strtype); static const char * eventstate2str(SaHpiEventStateT value); static SaHpiCtrlTypeT str2ctrltype(const char *strtype); static const char * ctrltype2str(SaHpiCtrlTypeT value); static SaHpiCtrlStateDigitalT str2ctrlstatedigital(const char *strtype); static const char * ctrlstatedigital2str(SaHpiCtrlStateDigitalT value); static SaHpiUint32T str2aggregatestatus(const char *strtype); static const char * aggregatestatus2str(SaHpiUint32T value); static SaHpiCtrlOutputTypeT str2ctrloutputtype(const char *strtype); static const char * ctrloutputtype2str(SaHpiCtrlOutputTypeT value); static SaHpiCtrlModeT str2ctrlmode(const char *strtype); static const char * ctrlmode2str(SaHpiCtrlModeT value); static SaHpiIdrAreaTypeT str2idrareatype(const char *strtype); static const char * idrareatype2str(SaHpiIdrAreaTypeT value); static SaHpiIdrFieldTypeT str2idrfieldtype(const char *strtype); static const char * idrfieldtype2str(SaHpiIdrFieldTypeT value); static SaHpiWatchdogActionT str2watchdogaction(const char *strtype); static const char * watchdogaction2str(SaHpiWatchdogActionT value); static SaHpiWatchdogActionEventT str2watchdogactionevent(const char *strtype); static const char * watchdogactionevent2str(SaHpiWatchdogActionEventT value); static SaHpiWatchdogPretimerInterruptT str2watchdogpretimerinterrupt(const char *strtype); static const char * watchdogpretimerinterrupt2str(SaHpiWatchdogPretimerInterruptT value); static SaHpiWatchdogTimerUseT str2watchdogtimeruse(const char *strtype); static const char * watchdogtimeruse2str(SaHpiWatchdogTimerUseT value); static SaHpiWatchdogExpFlagsT str2watchdogexpflags(const char *strtype); static const char * watchdogexpflags2str(SaHpiWatchdogExpFlagsT value); static SaHpiStatusCondTypeT str2statuscondtype(const char *strtype); static const char * statuscondtype2str(SaHpiStatusCondTypeT value); static SaHpiAnnunciatorModeT str2annunciatormode(const char *strtype); static const char * annunciatormode2str(SaHpiAnnunciatorModeT value); static SaHpiSeverityT str2severity(const char *strtype); static const char * severity2str(SaHpiSeverityT value); static SaHpiAnnunciatorTypeT str2annunciatortype(const char *strtype); static const char * annunciatortype2str(SaHpiAnnunciatorTypeT value); static SaHpiRdrTypeT str2rdrtype(const char *strtype); static const char * rdrtype2str(SaHpiRdrTypeT value); static SaHpiHsIndicatorStateT str2hsindicatorstate(const char *strtype); static const char * hsindicatorstate2str(SaHpiHsIndicatorStateT value); static SaHpiHsActionT str2hsaction(const char *strtype); static const char * hsaction2str(SaHpiHsActionT value); static SaHpiHsStateT str2hsstate(const char *strtype); static const char * hsstate2str(SaHpiHsStateT value); static SaHpiResourceEventTypeT str2resourceeventtype(const char *strtype); static const char * resourceeventtype2str(SaHpiResourceEventTypeT value); static SaHpiDomainEventTypeT str2domaineventtype(const char *strtype); static const char * domaineventtype2str(SaHpiDomainEventTypeT value); static SaHpiSensorOptionalDataT str2sensoroptionaldata(const char *strtype); static const char * sensoroptionaldata2str(SaHpiSensorOptionalDataT value); static SaHpiSwEventTypeT str2sweventtype(const char *strtype); static const char * sweventtype2str(SaHpiSwEventTypeT value); static SaHpiEventTypeT str2eventtype(const char *strtype); static const char * eventtype2str(SaHpiEventTypeT value); static SaHpiParmActionT str2parmaction(const char *strtype); static const char * parmaction2str(SaHpiParmActionT value); static SaHpiResetActionT str2resetaction(const char *strtype); static const char * resetaction2str(SaHpiResetActionT value); static SaHpiPowerStateT str2powerstate(const char *strtype); static const char * powerstate2str(SaHpiPowerStateT value); static SaHpiCapabilitiesT str2capabilities(const char *strtype); static const char * capabilities2str(SaHpiCapabilitiesT value); static SaHpiHsCapabilitiesT str2hscapabilities(const char *strtype); static const char * hscapabilities2str(SaHpiHsCapabilitiesT value); static SaHpiEventLogOverflowActionT str2eventlogoverflowaction(const char *strtype); static const char * eventlogoverflowaction2str(SaHpiEventLogOverflowActionT value); static SaHpiEventLogEntryIdT str2eventlogentryid(const char *strtype); static const char * eventlogentryid2str(SaHpiEventLogEntryIdT value); }; #endif openhpi-3.6.1/cpp/oSaHpiAnnouncement.cpp0000644000175100017510000001201212575647263017214 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiCondition.hpp" #include "oSaHpiAnnouncement.hpp" /** * Default constructor. */ oSaHpiAnnouncement::oSaHpiAnnouncement() { EntryId = 1; Timestamp = SAHPI_TIME_UNSPECIFIED; AddedByUser = false; Severity = SAHPI_OK; Acknowledged = false; StatusCond.Type = SAHPI_STATUS_COND_TYPE_SENSOR; StatusCond.Entity.Entry[0].EntityType = SAHPI_ENT_ROOT; StatusCond.Entity.Entry[0].EntityLocation = 0; StatusCond.DomainId = SAHPI_UNSPECIFIED_DOMAIN_ID; StatusCond.ResourceId = 1; StatusCond.SensorNum = 1; StatusCond.EventState = SAHPI_ES_UNSPECIFIED; StatusCond.Name.Length = 0; StatusCond.Name.Value[0] = '\0'; StatusCond.Mid = SAHPI_MANUFACTURER_ID_UNSPECIFIED; StatusCond.Data.DataType = SAHPI_TL_TYPE_TEXT; StatusCond.Data.Language = SAHPI_LANG_ENGLISH; StatusCond.Data.DataLength = 0; StatusCond.Data.Data[0] = '\0'; }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiAnnouncement::oSaHpiAnnouncement(const oSaHpiAnnouncement& buf) { memcpy(this, &buf, sizeof(SaHpiAnnouncementT)); } /** * Assign a field in the SaHpiAnnouncementT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiAnnouncement::assignField(SaHpiAnnouncementT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "EntryId") == 0) { ptr->EntryId = atoi(value); return false; } else if (strcmp(field, "Timestamp") == 0) { ptr->Timestamp = strtoll(value, NULL, 10); return false; } else if (strcmp(field, "AddedByUser") == 0) { ptr->AddedByUser = oSaHpiTypesEnums::str2torf(value); return false; } else if (strcmp(field, "Severity") == 0) { ptr->Severity = oSaHpiTypesEnums::str2severity(value); return false; } else if (strcmp(field, "Acknowledged") == 0) { ptr->Acknowledged = oSaHpiTypesEnums::str2torf(value); return false; } // StatusCond return true; }; /** * Print the contents of the buffer. * * @param stream Target stream. * @param buffer Address of the SaHpiAnnouncementT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiAnnouncement::fprint(FILE *stream, const int indent, const SaHpiAnnouncementT *buffer) { int i, err; char indent_buf[indent + 1]; if (stream == NULL || buffer == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "EntryId = %d\n", buffer->EntryId); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Timestamp = %lld\n", buffer->Timestamp); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "AddedByUsed = %s\n", oSaHpiTypesEnums::torf2str(buffer->AddedByUser)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Severity = %s\n", oSaHpiTypesEnums::severity2str(buffer->Severity)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Acknowledged = %s\n", oSaHpiTypesEnums::torf2str(buffer->Acknowledged)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "StatusCond\n"); if (err < 0) { return true; } const SaHpiConditionT * c = (const SaHpiConditionT *)&buffer->StatusCond; err = oSaHpiCondition::fprint(stream, indent + 3, c); if (err < 0) { return true; } return false; } openhpi-3.6.1/cpp/oSaHpiDomainInfo.cpp0000644000175100017510000002103212575647263016607 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiTextBuffer.hpp" #include "oSaHpiDomainInfo.hpp" /** * Default constructor. */ oSaHpiDomainInfo::oSaHpiDomainInfo() { int i; DomainId = 1; DomainCapabilities = (SaHpiDomainCapabilitiesT)0; IsPeer = false; DomainTag.DataType = SAHPI_TL_TYPE_TEXT; DomainTag.Language = SAHPI_LANG_ENGLISH; DomainTag.DataLength = 0; DomainTag.Data[0] = '\0'; DrtUpdateCount = 0; DrtUpdateTimestamp = 0; RptUpdateCount = 0; RptUpdateTimestamp = 0; DatUpdateCount = 0; DatUpdateTimestamp = 0; ActiveAlarms = 0; CriticalAlarms = 0; MajorAlarms = 0; MinorAlarms = 0; DatUserAlarmLimit = 0; DatOverflow = false; for (i = 0; i < 16; i++) { Guid[i] = 0; } }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiDomainInfo::oSaHpiDomainInfo(const oSaHpiDomainInfo& buf) { memcpy(this, &buf, sizeof(SaHpiDomainInfoT)); } /** * Assign a field in the SaHpiDomainInfoT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiDomainInfo::assignField(SaHpiDomainInfoT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "DomainId") == 0) { ptr->DomainId = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "DomainCapabilities") == 0) { if (strcmp(value, "SAHPI_DOMAIN_CAP_AUTOINSERT_READ_ONLY") == 0) { ptr->DomainCapabilities = SAHPI_DOMAIN_CAP_AUTOINSERT_READ_ONLY; } else { ptr->DomainCapabilities = (SaHpiDomainCapabilitiesT)0; } return false; } else if (strcmp(field, "IsPeer") == 0) { ptr->IsPeer = oSaHpiTypesEnums::str2torf(value); return false; } // DomainTag else if (strcmp(field, "DrtUpdateCount") == 0) { ptr->DrtUpdateCount = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "DrtUpdateTimestamp") == 0) { ptr->DrtUpdateTimestamp = strtoull(value, NULL, 10); return false; } else if (strcmp(field, "RptUpdateCount") == 0) { ptr->RptUpdateCount = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "RptUpdateTimestamp") == 0) { ptr->RptUpdateTimestamp = strtoull(value, NULL, 10); return false; } else if (strcmp(field, "DatUpdateCount") == 0) { ptr->DatUpdateCount = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "DatUpdateTimestamp") == 0) { ptr->DatUpdateTimestamp = strtoull(value, NULL, 10); return false; } else if (strcmp(field, "ActiveAlarms") == 0) { ptr->ActiveAlarms = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "CriticalAlarms") == 0) { ptr->CriticalAlarms = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "MajorAlarms") == 0) { ptr->MajorAlarms = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "MinorAlarms") == 0) { ptr->MinorAlarms = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "DatUserAlarmLimit") == 0) { ptr->DatUserAlarmLimit = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "DatOverflow") == 0) { ptr->DatOverflow = oSaHpiTypesEnums::str2torf(value); return false; } // Guid return true; }; /** * Print the contents of the buffer. * * @param stream Target stream. * @param buffer Address of the SaHpiDomainInfoT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiDomainInfo::fprint(FILE *stream, const int indent, const SaHpiDomainInfoT *buffer) { int i, err; char indent_buf[indent + 1]; if (stream == NULL || buffer == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "DomainId = %u\n", buffer->DomainId); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "DomainCapabilities = %X\n", buffer->DomainCapabilities); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "IsPeer = %s\n", oSaHpiTypesEnums::torf2str(buffer->IsPeer)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "DomainTag\n"); if (err < 0) { return true; } const SaHpiTextBufferT *tb = (const SaHpiTextBufferT *)&buffer->DomainTag; err = oSaHpiTextBuffer::fprint(stream, indent + 3, tb); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "DrtUpdateCount = %u\n", buffer->DrtUpdateCount); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "DrtUpdateTimestamp = %lld\n", buffer->DrtUpdateTimestamp); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "RptUpdateCount = %u\n", buffer->RptUpdateCount); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "RptUpdateTimestamp = %lld\n", buffer->RptUpdateTimestamp); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "DatUpdateCount = %u\n", buffer->DatUpdateCount); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "DatUpdateTimestamp = %lld\n", buffer->DatUpdateTimestamp); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "ActiveAlarms = %u\n", buffer->ActiveAlarms); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "CriticalAlarms = %u\n", buffer->CriticalAlarms); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "MajorAlarms = %u\n", buffer->MajorAlarms); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "MinorAlarms = %u\n", buffer->MinorAlarms); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "DatUserAlarmLimit = %u\n", buffer->DatUserAlarmLimit); if (err < 0) { return true; } for (i = 0; i < 16; i++) { err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Guid[%d] = %u\n", i, buffer->Guid[i]); if (err < 0) { return true; } } return false; } openhpi-3.6.1/cpp/oSaHpiDomainInfo.hpp0000644000175100017510000000310112575647263016611 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiDomainInfo #define Included_oSaHpiDomainInfo #include extern "C" { #include } class oSaHpiDomainInfo : public SaHpiDomainInfoT { public: // constructors oSaHpiDomainInfo(); // copy constructor oSaHpiDomainInfo(const oSaHpiDomainInfo& buf); // destructor ~oSaHpiDomainInfo() { } // other methods static bool assignField(SaHpiDomainInfoT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiDomainInfoT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiDomainInfoT *buffer); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-3.6.1/cpp/oSaHpiCondition.hpp0000644000175100017510000000306612575647263016526 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiCondition #define Included_oSaHpiCondition #include extern "C" { #include } class oSaHpiCondition : public SaHpiConditionT { public: // constructors oSaHpiCondition(); // copy constructor oSaHpiCondition(const oSaHpiCondition& buf); // destructor ~oSaHpiCondition() { } // other methods static bool assignField(SaHpiConditionT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiConditionT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiConditionT *buffer); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-3.6.1/cpp/oSaHpiWatchdogRec.hpp0000644000175100017510000000311412575647263016764 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiWatchdogRec #define Included_oSaHpiWatchdogRec #include extern "C" { #include } class oSaHpiWatchdogRec : public SaHpiWatchdogRecT { public: // constructors oSaHpiWatchdogRec(); // copy constructor oSaHpiWatchdogRec(const oSaHpiWatchdogRec& buf); // destructor ~oSaHpiWatchdogRec() { } // other methods static bool assignField(SaHpiWatchdogRecT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiWatchdogRecT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiWatchdogRecT *buffer); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-3.6.1/cpp/oSaHpiEvent.hpp0000644000175100017510000000301212575647263015650 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiEvent #define Included_oSaHpiEvent #include extern "C" { #include } class oSaHpiEvent : public SaHpiEventT { public: // constructors oSaHpiEvent(); // copy constructor oSaHpiEvent(const oSaHpiEvent& buf); // destructor ~oSaHpiEvent() { } // other methods static bool assignField(SaHpiEventT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiEventT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiEventT *buffer); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-3.6.1/cpp/oSaHpiSensorRange.hpp0000644000175100017510000000321412575647263017021 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiSensorRange #define Included_oSaHpiSensorRange #include extern "C" { #include } #include "oSaHpiSensorReading.hpp" #include "oSaHpiSensorRange.hpp" class oSaHpiSensorRange : public SaHpiSensorRangeT { public: // constructors oSaHpiSensorRange(); // copy constructor oSaHpiSensorRange(const oSaHpiSensorRange& sr); // destructor ~oSaHpiSensorRange() { } // other methods static bool assignField(SaHpiSensorRangeT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiSensorRangeT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiSensorRangeT *ent); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-3.6.1/cpp/oSaHpiCtrlRecDiscrete.hpp0000644000175100017510000000326112575647263017616 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiCtrlRecDiscrete #define Included_oSaHpiCtrlRecDiscrete #include extern "C" { #include } class oSaHpiCtrlRecDiscrete : public SaHpiCtrlRecDiscreteT { public: // constructors oSaHpiCtrlRecDiscrete(); oSaHpiCtrlRecDiscrete(SaHpiCtrlStateDiscreteT crd); // copy constructor oSaHpiCtrlRecDiscrete(const oSaHpiCtrlRecDiscrete& crd); // destructor ~oSaHpiCtrlRecDiscrete() { } // other methods static bool assignField(SaHpiCtrlRecDiscreteT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiCtrlRecDiscreteT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiCtrlRecDiscreteT *ent); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-3.6.1/cpp/oSaHpiEntity.cpp0000644000175100017510000000632712575647263016052 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiEntity.hpp" /** * Default constructor. */ oSaHpiEntity::oSaHpiEntity() { EntityType = SAHPI_ENT_ROOT; EntityLocation = 0; }; /** * Constructor. * * @param type The SaHpiEntityTypeT. * @param loc The SaHpiEntityLocationT. */ oSaHpiEntity::oSaHpiEntity(const SaHpiEntityTypeT type, const SaHpiEntityLocationT loc) { if (oSaHpiTypesEnums::entitytype2str(type)) { EntityType = type; } else { EntityType = SAHPI_ENT_ROOT; } EntityLocation = loc; }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiEntity::oSaHpiEntity(const oSaHpiEntity& ent) { EntityType = ent.EntityType; EntityLocation = ent.EntityLocation; } /** * Assign a field in the SaHpiEntityT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiEntity::assignField(SaHpiEntityT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "EntityType") == 0) { ptr->EntityType = oSaHpiTypesEnums::str2entitytype(value); return false; } else if (strcmp(field, "EntityLocation") == 0) { ptr->EntityLocation = strtoul(value, NULL, 10); return false; } return true; }; /** * Print the contents of the entity. * * @param stream Target stream. * @param buffer Address of the SaHpiEntityT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiEntity::fprint(FILE *stream, const int indent, const SaHpiEntityT *ent) { int i, err = 0; char indent_buf[indent + 1]; if (stream == NULL || ent == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "EntityType = %s\n", oSaHpiTypesEnums::entitytype2str(ent->EntityType)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "EntityLocation = %u\n", ent->EntityLocation); if (err < 0) { return true; } return false; } openhpi-3.6.1/cpp/oSaHpiDomainEvent.hpp0000644000175100017510000000311412575647263017003 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiDomainEvent #define Included_oSaHpiDomainEvent #include extern "C" { #include } class oSaHpiDomainEvent : public SaHpiDomainEventT { public: // constructors oSaHpiDomainEvent(); // copy constructor oSaHpiDomainEvent(const oSaHpiDomainEvent& buf); // destructor ~oSaHpiDomainEvent() { } // other methods static bool assignField(SaHpiDomainEventT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiDomainEventT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiDomainEventT *buffer); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-3.6.1/cpp/oSaHpiCtrlRecDiscrete.cpp0000644000175100017510000000524712575647263017617 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiCtrlRecDiscrete.hpp" /** * Default constructor. */ oSaHpiCtrlRecDiscrete::oSaHpiCtrlRecDiscrete() { Default = 0; }; /** * Constructor. */ oSaHpiCtrlRecDiscrete::oSaHpiCtrlRecDiscrete(SaHpiCtrlStateDiscreteT cs) { Default = cs; }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiCtrlRecDiscrete::oSaHpiCtrlRecDiscrete(const oSaHpiCtrlRecDiscrete& ent) { memcpy(this, &ent, sizeof(SaHpiCtrlRecDiscreteT)); } /** * Assign a field in the SaHpiCtrlRecDiscreteT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiCtrlRecDiscrete::assignField(SaHpiCtrlRecDiscreteT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "Default") == 0) { ptr->Default = (SaHpiCtrlStateDiscreteT)atoi(value); return false; } // StateUnion return true; }; /** * Print the contents of the entity. * * @param stream Target stream. * @param buffer Address of the SaHpiCtrlRecDiscreteT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiCtrlRecDiscrete::fprint(FILE *stream, const int indent, const SaHpiCtrlRecDiscreteT *crd) { int i, err = 0; char indent_buf[indent + 1]; if (stream == NULL || crd == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Default = %u\n", crd->Default); if (err < 0) { return true; } return false; } openhpi-3.6.1/cpp/oSaHpiEventLogInfo.cpp0000644000175100017510000001304112575647263017124 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiEventLogInfo.hpp" /** * Default constructor. */ oSaHpiEventLogInfo::oSaHpiEventLogInfo() { Entries = 0; Size = 0; UserEventMaxSize = 0; UpdateTimestamp = 0; CurrentTime = 0; Enabled = false; OverflowFlag = false; OverflowResetable = false; OverflowAction = SAHPI_EL_OVERFLOW_DROP; }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiEventLogInfo::oSaHpiEventLogInfo(const oSaHpiEventLogInfo& buf) { memcpy(this, &buf, sizeof(SaHpiEventLogInfoT)); } /** * Assign a field in the SaHpiEventLogInfoT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiEventLogInfo::assignField(SaHpiEventLogInfoT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "Entries") == 0) { ptr->Entries = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "Size") == 0) { ptr->Size = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "UserEventMaxSize") == 0) { ptr->UserEventMaxSize = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "UpdateTimestamp") == 0) { ptr->UpdateTimestamp = strtoull(value, NULL, 10); return false; } else if (strcmp(field, "CurrentTime") == 0) { ptr->CurrentTime = strtoull(value, NULL, 10); return false; } else if (strcmp(field, "Enabled") == 0) { ptr->Enabled = oSaHpiTypesEnums::str2torf(value); return false; } else if (strcmp(field, "OverflowFlag") == 0) { ptr->OverflowFlag = oSaHpiTypesEnums::str2torf(value); return false; } else if (strcmp(field, "OverflowResetable") == 0) { ptr->OverflowResetable = oSaHpiTypesEnums::str2torf(value); return false; } else if (strcmp(field, "OverflowAction") == 0) { ptr->OverflowAction = oSaHpiTypesEnums::str2eventlogoverflowaction(value); return false; } return true; }; /** * Print the contents of the buffer. * * @param stream Target stream. * @param buffer Address of the SaHpiEventLogInfoT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiEventLogInfo::fprint(FILE *stream, const int indent, const SaHpiEventLogInfoT *buffer) { int i, err; char indent_buf[indent + 1]; if (stream == NULL || buffer == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Entries = %u\n", buffer->Entries); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Size = %u\n", buffer->Size); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "UserEventMaxSize = %u\n", buffer->UserEventMaxSize); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "UpdateTimestamp = %lld\n", buffer->UpdateTimestamp); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "CurrentTime = %lld\n", buffer->CurrentTime); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Enabled = %s\n", oSaHpiTypesEnums::torf2str(buffer->Enabled)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "OverflowFlag = %s\n", oSaHpiTypesEnums::torf2str(buffer->OverflowFlag)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "OverflowResetable = %s\n", oSaHpiTypesEnums::torf2str(buffer->OverflowResetable)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "OverflowAction = %s\n", oSaHpiTypesEnums::eventlogoverflowaction2str(buffer->OverflowAction)); if (err < 0) { return true; } return false; } openhpi-3.6.1/cpp/oSaHpi.hpp0000644000175100017510000000427212575647263014657 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpi #define Included_oSaHpi #include extern "C" { #include } #include "oSaHpiAlarm.hpp" #include "oSaHpiAnnouncement.hpp" #include "oSaHpiAnnunciatorRec.hpp" #include "oSaHpiCondition.hpp" #include "oSaHpiCtrlDefaultMode.hpp" #include "oSaHpiCtrlRec.hpp" #include "oSaHpiCtrlRecAnalog.hpp" #include "oSaHpiCtrlRecDigital.hpp" #include "oSaHpiCtrlRecDiscrete.hpp" #include "oSaHpiCtrlRecOem.hpp" #include "oSaHpiCtrlRecStream.hpp" #include "oSaHpiCtrlRecText.hpp" #include "oSaHpiCtrlState.hpp" #include "oSaHpiCtrlStateOem.hpp" #include "oSaHpiCtrlStateStream.hpp" #include "oSaHpiCtrlStateText.hpp" #include "oSaHpiDomainEvent.hpp" #include "oSaHpiDomainInfo.hpp" #include "oSaHpiDrtEntry.hpp" #include "oSaHpiEntity.hpp" #include "oSaHpiEntityPath.hpp" #include "oSaHpiEvent.hpp" #include "oSaHpiEventLogEntry.hpp" #include "oSaHpiEventLogInfo.hpp" #include "oSaHpiHotSwapEvent.hpp" #include "oSaHpiHpiSwEvent.hpp" #include "oSaHpiIdrAreaHeader.hpp" #include "oSaHpiIdrField.hpp" #include "oSaHpiIdrInfo.hpp" #include "oSaHpiInventoryRec.hpp" #include "oSaHpiName.hpp" #include "oSaHpiOemEvent.hpp" #include "oSaHpiRdr.hpp" #include "oSaHpiResourceEvent.hpp" #include "oSaHpiResourceInfo.hpp" #include "oSaHpiRptEntry.hpp" #include "oSaHpiSensorDataFormat.hpp" #include "oSaHpiSensorEnableChangeEvent.hpp" #include "oSaHpiSensorEvent.hpp" #include "oSaHpiSensorRange.hpp" #include "oSaHpiSensorReading.hpp" #include "oSaHpiSensorRec.hpp" #include "oSaHpiSensorThdDefn.hpp" #include "oSaHpiSensorThresholds.hpp" #include "oSaHpiTextBuffer.hpp" #include "oSaHpiTypesEnums.hpp" #include "oSaHpiUserEvent.hpp" #include "oSaHpiWatchdog.hpp" #include "oSaHpiWatchdogEvent.hpp" #include "oSaHpiWatchdogRec.hpp" #endif openhpi-3.6.1/README.daemon0000644000175100017510000001260712575647264014325 0ustar mohanmohan==================================== Readme for the OpenHPI Client/Daemon ==================================== This file documents the OpenHPI daemon and client libraries for the current release. The OpenHPI daemon runs as a background process and accepts connections from remote clients to perform OpenHPI library function calls. The daemon wraps the standard OpenHPI function library with a sockets-based API that is archicture neutral for all types of clients. The OpenHPI client library provides all the connection functionality needed by the client application to connect to the OpenHPI daemon running on the local or remote server. Three ways of starting the OpenHPI daemon: ========================================= There are three methods for starting the daemon at this point; manually calling the installed init.d script, manually starting the daemon in the foreground, or automatically by installing the init script in one of the system run levels. 1. Manually Calling Init Script: ----------------------------------- You can START and STOP the daemon with the 'openhpid' init script. This script can be found in $sysconfdir/init.d/openhpid (where the default sysconfdir value expands to /usr/local/etc). You can change sysconfdir's value when you run configure using the --sysconfdir= argument. We recommend setting it to /etc. Example To Start: $sudo /usr/local/etc/init.d/openhpid start Starting openhpid: [ OK ] $ Example To Stop: $sudo /usr/local/etc/init.d/openhpid stop Stopping openhpid: [ OK ] $ 2. Installing Daemon into a Run Level: -------------------------------------------- How you get the daemon to start automatically when the system boots depends on your Linux distribution: - Fedora/Mandriva: chkconfig --add openhpid; chkconfig openhpid on - SuSE: yast - Gentoo: rc-update -a openhpid default - Debian: update-rc.d openhpid defaults Manually Starting The Daemon: --------------------------------------------- After performing 'make install' the init.d script will reside at $sysconfdir/init.d/openhpid and the executable itself at $prefix/sbin/openhpid. Usage of the openhpid executable: openhpid [options] [-c ] To start the daemon in the foreground use the '-n' option. For more info 'openhpid -h'. Example: 'openhpid -n -c /etc/openhpi/openhpi.conf' More information on daemon parameters and evironment variables is given below. The OpenHPI Daemon ================== The daemon is compiled as a standalone application and can be run as either a foreground or background application. The daemon application and client libraries will be located in the openhpid subdirectory. When you run the daemon the standard method for locating the OpenHPI configuration file is used. However, the daemon will accept a configuration file as a command line option to override the default file. An option in the configuration file determines the port number the daemon will listen on for client connections. If a configuration file is not found the the daemon will listen on port 4743 by default. Currently, if you are not running as the root user, you must override the default PID file location. Normally the PID file is created in the /var/run subdirectory. This directory is not writable by normal users and only the root user can write to this location. Thus the daemon will fail when run as a normal user if the PID file location is not overridden. To override the PID file location you can use the command line option. ./openhpid -f ./openhpid.pid The OpenHPI Client Library ========================== The easiect method to use to link to the client library is to first run the OpenHPI installation script. make install This will install the client library in the standard system locations. You can now use the following link flags to link the client library to your application. -lopenhpi When you run your application the client library uses two environment variables to locate the daemon service. OPENHPI_DAEMON_HOST - URL for the host running the daemon. This can be "localhost" if the daemon is running on the local host or an ip address. OPENHPI_DAEMON_PORT - The port number the host is listening on for clent connections. If the OPENHPI_DAEMON_HOST variable is not found the client library uses localhost as the default. If the OPENHPI_DAEMON_PORT variable is not found then the client library uses port 4743 as the default. General Information ------------------- The client and the daemon do not have to be on the same hardware architecture. The daemon could be running on a P-series processor and the client running on an x86-series processor. The client library and daemon use a marshaling technique to resolve architecture and structure padding conflicts. The user does not need to concern themselves with architectureal differences between the client and daemon. The one exception to this rule is 64-bit architectures. The client and daemon currently cannot resolve differences between 32-bit and 64-bit architectures. DO NOT MIX THESE TYPES OF ARCHITECTURES! It is important that data passed to the client library OpenHPI functions is correct. Passing incorrect data could cause the client library or the daemon to crash. The client library performs an extensive set of data validation functions for each OpenHPI function, but it is still possible for bad data to be missed by those functions. BE CAREFUL!. openhpi-3.6.1/mingw32/0000755000175100017510000000000012575650553013456 5ustar mohanmohanopenhpi-3.6.1/mingw32/openhpi.conf.example0000644000175100017510000002425412575647300017424 0ustar mohanmohan### OpenHPI configuration example file ### ####### ## OpenHPI will not be useful unless it is configured for your system. Once ## you have modified this file, remove or comment the following line to allow ## the OpenHPI daemon to run. This line causes the daemon to exit immediately. #OPENHPI_UNCONFIGURED = "YES" ####### ## FIRST section: declaration of global parameters like the following. #OPENHPI_LOG_ON_SEV = "MINOR" #OPENHPI_EVT_QUEUE_LIMIT = 10000 #OPENHPI_DEL_SIZE_LIMIT = 10000 #OPENHPI_DEL_SAVE = "NO" #OPENHPI_DAT_SIZE_LIMIT = 0 #OPENHPI_DAT_USER_LIMIT = 0 #OPENHPI_DAT_SAVE = "NO" #OPENHPI_PATH = "/usr/local/lib/openhpi:/usr/lib/openhpi" #OPENHPI_VARPATH = "/usr/local/var/lib/openhpi" #OPENHPI_AUTOINSERT_TIMEOUT = 0 #OPENHPI_AUTOINSERT_TIMEOUT_READONLY = "YES" ## The default values for each have been selected in the example above (except ## for OPENHPI_PATH and OPENHPI_CONF. See below). ## No need to specify any one of them because the defaults is used ## automatically. The library also looks for these as environment variables. ## Environment variables found that match a global parameter override the ## corresponding parameter set in this configuration file. ## ## OPENHPI_LOG_SEV sets the lowest severity level an event must meet to be ## logged in the domain event log. Possible values are (highest to lowest): ## "CRITICAL", "MAJOR", "MINOR", "INFORMATIONAL", "OK", and "DEBUG". ## OPENHPI_EVT_QUEUE_LIMIT sets the maximum number of events that are allowed ## in the session's event queue. Default is 10000 events. Setting it to 0 means ## unlimited. ## OPENHPI_DEL_SIZE_LIMIT sets the maximum size (in number of event log entries) ## for the domain event log. Default is 10000 log entries. Setting it to 0 ## means unlimited. ## OPENHPI_DEL_SAVE sets whether the domain event log is persisted to disk or ## not. The event log is written to OPENHPI_VARPATH value. ## OPENHPI_DAT_SIZE_LIMIT sets the maximum size (in number of alarm entries) for ## the alarm table. The default 0 means unlimited. ## OPENHPI_DAT_USER_LIMIT sets the maximum number of user type alarm entries ## allowed in the alarm table. The default 0 means unlimited. ## OPENHPI_DAT_SAVE sets whether the domain alarm table is persisted to disk or ## not. The alarm table is written to the directory where OPENHPI_VARPATH ## points to. ## OPENHPI_PATH is a colon (:) delimited list of directories specifying ## the location of openhpi plugin libraries. The default is defined when the ## library is configured. ## OPENHPI_VARPATH is a directory to which certain openhpi data is saved to. ## The DEL (Domain Event Log), DAT (Domain Alarm Table), and UID (Unique IDs ## used for resources) mappings are saved to this directory. The default is set ## at compile time through the ./configure options. ####### ####### ## SECOND section: handler (instance) declaration with arguments understood by the plugin. ############################################################################# ##**CAUTION** System administrators have to make sure that entity paths are ## unique in a domain. To avoid entity paths conflicting among handlers, make ## sure the "entity_root" is unique for each handler definition, unless the ## plugin documentation says otherwise. ############################################################################# ## Strings are enclosed by "", numbers are not. ## Section for the simulator plugin ## You can load multiple copies of the simulator plugin but each ## copy must have a unique name. #handler libsimulator { # entity_root = "{SYSTEM_CHASSIS,1}" # name = "simulator" #} ## Section for ipmi plugin using SMI -- local interface #handler libipmi { # entity_root = "{SYSTEM_CHASSIS,2}" # name = "smi" # addr = 0 #} ## Section for ipmi plugin based on OpenIPMI: #handler libipmi { # entity_root = "{SYSTEM_CHASSIS,3}" # name = "lan" # addr = "x.x.x.x" #ipaddress # port = "999" # auth_type = "straight" # auth_level= "user" # username = "joe" # password = "blow" #} ## Section for BladeCenter snmp_bc plugin: #handler libsnmp_bc { # entity_root = "{SYSTEM_CHASSIS,4}" # Required. BladeCenter chassis Entity Path. # host = "192.168.70.125" # Required. BladeCenter Management Module (MM) IP address. # host_alternate = "192.168.70.127" # Optional. BladeCenter Management Module 2nd IP address. # Some BladeCenter MM Firmware allows the 2 MMs, # active and standby, to have 2 different IP address. # If the targetted BladeCenter 2 MMs are configured # with 2 IPs, use this key for the 2nd IP. # version = "1" # Required. SNMP protocol version (1|3). # community = "public" # SNMP V1: Required. SNMP V1 community name. # security_name = "snmpv3_user" # SNMP V3: Required. SNMP V3 user Login ID. # context_name = "" # SNMP V3: Optional. Must match MM's "Context name" field, if defined. # security_level = "noAuthNoPriv" # SNMP V3: Required. Security level (noAuthNoPriv|authNoPriv|authPriv). # passphrase = "" # SNMP V3: Authentication password. Required if security_level # # is authNoPriv or authPriv. # auth_type = "" # SNMP V3: Authentication password encoding (MD5|SHA). Required if # # security_level is authNoPriv or authPriv. # privacy_passwd = "" # SNMP V3: Privacy password. Required if security_level is authPriv. # privacy_protocol = "" # SNMP V3: Privacy password encoding (DES). # # Required if security_level is authPriv. # # If security_level is authPriv, DES encoding is assumed since there # # currently is no other privacy password encoding choice. # count_per_getbulk = "32" # SNMP V3: Optional. SNMP_MSG_GETBULK commands can be used to increase # # performance. This variable sets the maximum OIDs allowable per # # MSG_GETBULK command. # # Positive values less than 16 default to "16", since values less than # # 16 don't necessarily increase performance. Too high of a value (> 40) # # can cause SNMP commands to BladeCenter to timeout. The default is "32". # # A value of "0" disables the use of the SNMP_MSG_GETBULK SNMP command. #} ## Section for static simulator plugin: ## If openhpi configured with ## configure --enable-simulator=static ## the dummy plugin is compiled in. ## It is possible to use simulator and libsimulator ## at the same time. #handler simulator { # entity_root = "{SYSTEMk_CHASSIS,5}" # name = "test" #} ## Section for ipmidirect plugin using SMI -- local interface #handler libipmidirect { # entity_root = "{SYSTEM_CHASSIS,6}" # name = "smi" # addr = 0 #} ## Section for ipmidirect plugin using RMCP: #handler libipmidirect { # entity_root = "{SYSTEM_CHASSIS,7}" # name = "lan" # RMCP # addr = "localhost" # Host name or IP address # port = "623" # RMCP port # auth_type = "none" # none, md2, md5 or straight # auth_level = "admin" # operator or admin # username = "arthur" # password = "pieman" # IpmiConnectionTimeout = "5000" # AtcaConnectionTimeout = "1000" # MaxOutstanding = "1" # Allow parallel processing of # # ipmi commands; change with care # logflags = "" # logging off # # logflags = "file stdout" # # infos goes to logfile and stdout # # the logfile are log00.log, log01.log ... # logfile = "log" # # if #logfile_max reached replace the oldest one # logfile_max = "10" #} ## Section for ilo2_ribcl plugin for ProLiant Rack Mount servers #handler libilo2_ribcl { # entity_root = "{RACK_MOUNTED_SERVER,8}" # ilo2_ribcl_hostname = "IP address" # iLO2 IP address # ilo2_ribcl_portstr = "443" # iLO2 RIBCL SSL server port number # ilo2_ribcl_username = "username" # iLO2 username # ilo2_ribcl_password = "password" # iLO2 password #} ## Section for oa_soap plugin for HP BladeSystem c-Class, ## using SOAP XML over https #handler liboa_soap { # entity_root = "{SYSTEM_CHASSIS,8}" # OA_User_Name = "user" # OA user name with admin privileges (required) # OA_Password = "passwd" # OA password for above user (required) # ACTIVE_OA = "hostname" # Active OA hostname or IP address (required) # STANDBY_OA = "hostname" # Standby OA hostname or IP address (optional) #} ## Section for dynamic_simulator plugin #handler libdyn_simulator { # entity_root = "{SYSTEM_CHASSIS,9}" ## Location of the simulation data file ## Normally an example file is installed in the same directory as openhpi.conf. ## Please change the following entry if you have configured another install ## directory or will use your own simulation.data. # file = "/etc/openhpi/simulation.data" # # infos goes to logfile and stdout # # the logfile are log00.log, log01.log ... ## logflags = "file stdout" ## logfile = "dynsim" # # if #logfile_max reached replace the oldest one ## logfile_max = "5" #} ## Section for slave plugin #handler libslave { # # Optional. # # Entity path that will be added to slave daemon resources' entity paths. # # Default value is empty. # entity_root = "{RACK,1}" # # Mandatory. Address of slave OpenHPI daemon. # host = "192.168.1.42" # # Optional. Port of slave OpenHPI daemon. # # Default value is 4743 # #port = "4743" #} # Section for slave plugin handler libtest_agent { # Mandatory. TCP port for console. port = "41415" } openhpi-3.6.1/mingw32/config.h0000644000175100017510000000045112575647300015070 0ustar mohanmohan#ifndef __OPENHPI_CONFIG_H #define __OPENHPI_CONFIG_H #define OH_CLIENT_DEFAULT_CONF "%APPDATA%\\openhpi\\openhpiclient.conf" #define OH_DEFAULT_CONF "%APPDATA%\\openhpi\\openhpi.conf" #define OH_DEFAULT_UID_MAP "" #define OH_PLUGIN_PATH "" #define VARPATH "" #endif /* __OPENHPI_CONFIG_H */ openhpi-3.6.1/openhpi.pc.in0000644000175100017510000000041112575647301014554 0ustar mohanmohanprefix=@prefix@ exec_prefix=@prefix@ libdir=@libdir@ includedir=@includedir@ Name: OpenHPI Description: Implementation of SA Forum's Hardware Platform Interface Version: @VERSION@ Requires: glib-2.0 Libs: -L${libdir} -l@HPI_PKG@ Cflags: -I${includedir}/@HPI_PKG@ openhpi-3.6.1/simulation.data.example0000644000175100017510000013361412575647263016655 0ustar mohanmohanCONFIGURATION { MODE=INIT VERSION=0.901000 } RPT { EntryId=1 ResourceId=1 ResourceInfo={ ResourceRev=0x00 SpecificVer=0x00 DeviceSupport=0x00 ManufacturerId=0x000051D0 ProductId=0x0000 FirmwareMajorRev=0x00 FirmwareMinorRev=0x00 AuxFirmwareRev=0x00 Guid="08150000000000000000000000000000" } ResourceEntity={ "{SYSTEM_CHASSIS,1}" } ResourceCapabilities=0x4001C67F HotSwapCapabilities=0x00000000 ResourceSeverity=0 ResourceFailed=0 ResourceTag={ DataType=3 Language=25 DataLength=9 Data="Chassis 1" } RDR { SENSOR { RecordId=131073 RdrType=2 Entity={ "{SYSTEM_CHASSIS,1}" } IsFru=0 IdString={ DataType=3 Language=25 DataLength=25 Data="Planar temperature sensor" } RDR_DETAIL { Num=1 Type=1 Category=0x01 EnableCtrl=0 EventCtrl=2 Events=0x0038 DataFormat={ IsSupported=1 ReadingType=2 BaseUnits=2 ModifierUnits=0 ModifierUse=0 Percentage=0 Range={ Flags=0x1F Max={ IsSupported=1 Type=2 value.SensorFloat64=125.000000 } Min={ IsSupported=1 Type=2 value.SensorFloat64=40.000000 } Nominal={ IsSupported=1 Type=2 value.SensorFloat64=100.000000 } NormalMax={ IsSupported=1 Type=2 value.SensorFloat64=110.000000 } NormalMin={ IsSupported=1 Type=2 value.SensorFloat64=90.000000 } } AccuracyFactor=0.000000 } ThresholdDefn={ IsAccessible=1 ReadThold=0xFF WriteThold=0xFF Nonlinear=0 } Oem=0 SENSOR_DATA { SensorEnable=1 SensorEventEnable=1 EventState=0x0008 SensorReading={ IsSupported=1 Type=2 value.SensorFloat64=35.000000 } SensorThresholds={ LowCritical={ IsSupported=1 Type=2 value.SensorFloat64=40.000000 } LowMajor={ IsSupported=1 Type=2 value.SensorFloat64=50.000000 } LowMinor={ IsSupported=1 Type=2 value.SensorFloat64=60.000000 } UpCritical={ IsSupported=1 Type=2 value.SensorFloat64=125.000000 } UpMajor={ IsSupported=1 Type=2 value.SensorFloat64=120.000000 } UpMinor={ IsSupported=1 Type=2 value.SensorFloat64=110.000000 } PosThdHysteresis={ IsSupported=1 Type=2 value.SensorFloat64=2.000000 } NegThdHysteresis={ IsSupported=1 Type=2 value.SensorFloat64=2.000000 } } AssertEventMask=0x0038 DeassertEventMask=0x0038 } } } SENSOR { RecordId=131074 RdrType=2 Entity={ "{SYSTEM_CHASSIS,1}" } IsFru=0 IdString={ DataType=3 Language=25 DataLength=34 Data="Planar CPU area temperature sensor" } RDR_DETAIL { Num=2 Type=1 Category=0x01 EnableCtrl=0 EventCtrl=2 Events=0x0038 DataFormat={ IsSupported=1 ReadingType=2 BaseUnits=2 ModifierUnits=0 ModifierUse=0 Percentage=0 Range={ Flags=0x1F Max={ IsSupported=1 Type=2 value.SensorFloat64=125.000000 } Min={ IsSupported=1 Type=2 value.SensorFloat64=40.000000 } Nominal={ IsSupported=1 Type=2 value.SensorFloat64=100.000000 } NormalMax={ IsSupported=1 Type=2 value.SensorFloat64=110.000000 } NormalMin={ IsSupported=1 Type=2 value.SensorFloat64=90.000000 } } AccuracyFactor=0.000000 } ThresholdDefn={ IsAccessible=0 } Oem=0 SENSOR_DATA { SensorEnable=1 SensorEventEnable=1 EventState=0x0008 SensorReading={ IsSupported=1 Type=2 value.SensorFloat64=35.000000 } AssertEventMask=0x0038 DeassertEventMask=0x0038 } } } CONTROL { RecordId=65537 RdrType=1 Entity={ "{SYSTEM_CHASSIS,1}" } IsFru=0 IdString={ DataType=3 Language=25 DataLength=15 Data="Digital Control" } RDR_DETAIL { Num=1 OutputType=1 Type=0 TypeUnion.Digital={ Default=1 } DefaultMode={ Mode=0 ReadOnly=1 } WriteOnly=0 Oem=0 } } CONTROL { RecordId=65538 RdrType=1 Entity={ "{SYSTEM_CHASSIS,1}" } IsFru=0 IdString={ DataType=3 Language=25 DataLength=16 Data="Discrete Control" } RDR_DETAIL { Num=2 OutputType=1 Type=1 TypeUnion.Discrete={ Default=1 } DefaultMode={ Mode=0 ReadOnly=1 } WriteOnly=0 Oem=0 } } CONTROL { RecordId=65539 RdrType=1 Entity={ "{SYSTEM_CHASSIS,1}" } IsFru=0 IdString={ DataType=3 Language=25 DataLength=14 Data="Analog Control" } RDR_DETAIL { Num=3 OutputType=5 Type=2 TypeUnion.Analog={ Min=0 Max=10 Default=0 } DefaultMode={ Mode=0 ReadOnly=1 } WriteOnly=0 Oem=0 } } CONTROL { RecordId=65540 RdrType=1 Entity={ "{SYSTEM_CHASSIS,1}" } IsFru=0 IdString={ DataType=3 Language=25 DataLength=14 Data="Stream Control" } RDR_DETAIL { Num=4 OutputType=1 Type=3 TypeUnion.Stream={ Default={ Repeat=0 StreamLength=0 Stream="" } } DefaultMode={ Mode=0 ReadOnly=1 } WriteOnly=0 Oem=0 } } CONTROL { RecordId=65541 RdrType=1 Entity={ "{SYSTEM_CHASSIS,1}" } IsFru=0 IdString={ DataType=3 Language=25 DataLength=12 Data="Text Control" } RDR_DETAIL { Num=5 OutputType=9 Type=4 TypeUnion.Text={ MaxChars=10 MaxLines=2 Language=25 DataType=3 Default={ Line=0 Text={ DataType=3 Language=25 DataLength=7 Data="Unknown" } } } DefaultMode={ Mode=0 ReadOnly=1 } WriteOnly=0 Oem=0 } } CONTROL { RecordId=65542 RdrType=1 Entity={ "{SYSTEM_CHASSIS,1}" } IsFru=0 IdString={ DataType=3 Language=25 DataLength=11 Data="Oem Control" } RDR_DETAIL { Num=6 OutputType=1 Type=192 TypeUnion.Oem={ MId=0x0000007B ConfigData="00000000000000000000" Default={ MId=0x0000007B BodyLength=2 Body="4F6B" } } DefaultMode={ Mode=0 ReadOnly=1 } WriteOnly=0 Oem=0 } } ANNUNCIATOR { RecordId=327681 RdrType=5 Entity={ "{SYSTEM_CHASSIS,1}" } IsFru=0 IdString={ DataType=3 Language=25 DataLength=13 Data="Annunciator 1" } RDR_DETAIL { AnnunciatorNum=1 AnnunciatorType=0x02 ModeReadOnly=0 MaxConditions=2 Oem=0 ANNUNCIATOR_DATA={ Mode=2 ANNOUNCEMENT={ EntryId=1 Timestamp=1272031133974843000 AddedByUser=1 Severity=1 Acknowledged=0 StatusCond={ Type=0 Entity={ "{SYSTEM_CHASSIS,1}{SYSTEM_BOARD,1}" } DomainId=1 ResourceId=1 SensorNum=1 EventState=0x0000 Name={ Length=5 Value="annou" } Data={ DataType=0 Language=0 DataLength=0 Data="" } } } ANNOUNCEMENT={ EntryId=2 Timestamp=1272031133975214000 AddedByUser=1 Severity=2 Acknowledged=0 StatusCond={ Type=0 Entity={ "{SYSTEM_CHASSIS,1}{SYSTEM_BOARD,1}" } DomainId=1 ResourceId=1 SensorNum=1 EventState=0x0000 Name={ Length=5 Value="annou" } Data={ DataType=0 Language=0 DataLength=0 Data="" } } } ANNOUNCEMENT={ EntryId=3 Timestamp=1272031133975577000 AddedByUser=1 Severity=3 Acknowledged=0 StatusCond={ Type=0 Entity={ "{SYSTEM_CHASSIS,1}{SYSTEM_BOARD,1}" } DomainId=1 ResourceId=1 SensorNum=1 EventState=0x0000 Name={ Length=5 Value="annou" } Data={ DataType=0 Language=0 DataLength=0 Data="" } } } } } } WATCHDOG { RecordId=262145 RdrType=4 Entity={ "{SYSTEM_CHASSIS,1}" } IsFru=0 IdString={ DataType=3 Language=25 DataLength=10 Data="Watchdog 1" } RDR_DETAIL { WatchdogNum=0 Oem=0 WDT_GET={ Log=1 Running=0 TimerUse=0x00 TimerAction=0x00 PretimerInterrupt=0x00 PreTimeoutInterval=0 TimerUseExpFlags=0x00 InitialCount=0 PresentCount=0 } } } INVENTORY { RecordId=196609 RdrType=3 Entity={ "{SYSTEM_CHASSIS,1}" } IsFru=0 IdString={ DataType=3 Language=25 DataLength=15 Data="Simulator Inv 1" } RDR_DETAIL { IdrId=1 Persistent=0 Oem=0 INVENTORY_DATA={ IdrId=1 UpdateCount=0 ReadOnly=1 NumAreas=1 INV_AREA={ AreaId=1 Type=177 ReadOnly=1 NumFields=1 INV_FIELD={ AreaId=1 FieldId=1 Type=2 ReadOnly=1 Field={ DataType=3 Language=25 DataLength=6 Data="IBMXXX" } } } } } } DIMI { RecordId=393217 RdrType=6 Entity={ "{SYSTEM_CHASSIS,1}" } IsFru=0 IdString={ DataType=3 Language=25 DataLength=16 Data="Dimi 1 simulator" } RDR_DETAIL { DimiNum=1 Oem=0 DIMI_DATA={ NumberOfTests=0 TestNumUpdateCounter=0 } } } FUMI { RecordId=458753 RdrType=7 Entity={ "{SYSTEM_CHASSIS,1}" } IsFru=0 IdString={ DataType=3 Language=25 DataLength=16 Data="Fumi 1 simulator" } RDR_DETAIL { Num=1 AccessProt=2 Capability=2 NumBanks=2 Oem=0 FUMI_DATA={ SpecInfoType=1 SafDefined={ SpecID=0 RevisionID=1 } NumEntities=0 FUMI_TARGET_DATA={ BankId=0 BankSize=32 Position=0 BankState=0 Identifier={ DataType=3 Language=25 DataLength=15 Data="simulation.data" } Description={ DataType=3 Language=25 DataLength=24 Data="Original simulation data" } DateTime={ DataType=3 Language=25 DataLength=0 Data="04/23/2010" } MajorVersion=0 MinorVersion=9 AuxVersion=1 } FUMI_SOURCE_DATA={ ForBank=0 SourceUri={ DataType=3 Language=25 DataLength=21 Data="file:/simulation.data" } SourceStatus=3 Identifier={ DataType=3 Language=25 DataLength=15 Data="simulation.data" } Description={ DataType=3 Language=25 DataLength=24 Data="Original simulation data" } DateTime={ DataType=3 Language=25 DataLength=0 Data="04/23/2010" } MajorVersion=0 MinorVersion=9 AuxVersion=1 } FUMI_TARGET_DATA={ BankId=1 BankSize=32 Position=2 BankState=0 Identifier={ DataType=3 Language=25 DataLength=15 Data="simulation.data" } Description={ DataType=3 Language=25 DataLength=24 Data="Original simulation data" } DateTime={ DataType=3 Language=25 DataLength=0 Data="04/23/2010" } MajorVersion=0 MinorVersion=9 AuxVersion=1 } FUMI_TARGET_DATA={ BankId=2 BankSize=32 Position=1 BankState=0 Identifier={ DataType=3 Language=25 DataLength=21 Data="simulation_bank2.data" } Description={ DataType=3 Language=25 DataLength=24 Data="Original simulation data" } DateTime={ DataType=3 Language=25 DataLength=0 Data="04/23/2010" } MajorVersion=0 MinorVersion=9 AuxVersion=1 } FUMI_LOG_TARGET_DATA={ FirmwarePersistentLocationCount=1 BankStateFlags=0x00000001 PendingFwInstance={ InstancePresent=1 Identifier={ DataType=3 Language=25 DataLength=21 Data="simulation_bank2.data" } Description={ DataType=3 Language=25 DataLength=24 Data="Original simulation data" } DateTime={ DataType=3 Language=25 DataLength=0 Data="04/23/2010" } MajorVersion=0 MinorVersion=9 AuxVersion=1 } RollbackFwInstance={ InstancePresent=0 Identifier={ DataType=0 Language=0 DataLength=0 Data="" } Description={ DataType=0 Language=0 DataLength=0 Data="" } DateTime={ DataType=0 Language=0 DataLength=0 Data="" } MajorVersion=0 MinorVersion=0 AuxVersion=0 } } } } } } } RPT { EntryId=2 ResourceId=2 ResourceInfo={ ResourceRev=0x00 SpecificVer=0x00 DeviceSupport=0x00 ManufacturerId=0x000051D0 ProductId=0x0000 FirmwareMajorRev=0x00 FirmwareMinorRev=0x00 AuxFirmwareRev=0x00 Guid="00000000000000000000000000000000" } ResourceEntity={ "{SYSTEM_CHASSIS,1}{PROCESSOR,1}" } ResourceCapabilities=0x40008003 HotSwapCapabilities=0x00000000 ResourceSeverity=1 ResourceFailed=0 ResourceTag={ DataType=3 Language=25 DataLength=5 Data="CPU 1" } RDR { SENSOR { RecordId=131073 RdrType=2 Entity={ "{SYSTEM_CHASSIS,1}{PROCESSOR,1}" } IsFru=0 IdString={ DataType=3 Language=25 DataLength=22 Data="CPU temperature sensor" } RDR_DETAIL { Num=1 Type=1 Category=0x01 EnableCtrl=0 EventCtrl=2 Events=0x0038 DataFormat={ IsSupported=1 ReadingType=2 BaseUnits=1 ModifierUnits=0 ModifierUse=0 Percentage=0 Range={ Flags=0x18 Max={ IsSupported=1 Type=2 value.SensorFloat64=125.000000 } Min={ IsSupported=1 Type=2 value.SensorFloat64=0.000000 } Nominal={ IsSupported=0 } NormalMax={ IsSupported=0 } NormalMin={ IsSupported=0 } } AccuracyFactor=0.000000 } ThresholdDefn={ IsAccessible=1 ReadThold=0x70 WriteThold=0x00 Nonlinear=0 } Oem=0 SENSOR_DATA { SensorEnable=1 SensorEventEnable=1 EventState=0x0008 SensorReading={ IsSupported=1 Type=2 value.SensorFloat64=50.000000 } SensorThresholds={ LowCritical={ IsSupported=0 } LowMajor={ IsSupported=0 } LowMinor={ IsSupported=0 } UpCritical={ IsSupported=1 Type=2 value.SensorFloat64=80.000000 } UpMajor={ IsSupported=1 Type=2 value.SensorFloat64=60.000000 } UpMinor={ IsSupported=0 } PosThdHysteresis={ IsSupported=1 Type=2 value.SensorFloat64=2.000000 } NegThdHysteresis={ IsSupported=0 } } AssertEventMask=0x0038 DeassertEventMask=0x0038 } } } } } RPT { EntryId=3 ResourceId=3 ResourceInfo={ ResourceRev=0x00 SpecificVer=0x00 DeviceSupport=0x00 ManufacturerId=0x000051D0 ProductId=0x0000 FirmwareMajorRev=0x00 FirmwareMinorRev=0x00 AuxFirmwareRev=0x00 Guid="00000000000000000000000000000000" } ResourceEntity={ "{SYSTEM_CHASSIS,1}{DISK_DRIVE,1}" } ResourceCapabilities=0x40008003 HotSwapCapabilities=0x00000000 ResourceSeverity=1 ResourceFailed=0 ResourceTag={ DataType=3 Language=25 DataLength=8 Data="DASD 1 1" } RDR { SENSOR { RecordId=131073 RdrType=2 Entity={ "{SYSTEM_CHASSIS,1}{DISK_DRIVE,1}" } IsFru=0 IdString={ DataType=3 Language=25 DataLength=23 Data="DASD temperature sensor" } RDR_DETAIL { Num=1 Type=1 Category=0x01 EnableCtrl=0 EventCtrl=2 Events=0x0038 DataFormat={ IsSupported=1 ReadingType=2 BaseUnits=1 ModifierUnits=0 ModifierUse=0 Percentage=0 Range={ Flags=0x18 Max={ IsSupported=1 Type=2 value.SensorFloat64=125.000000 } Min={ IsSupported=1 Type=2 value.SensorFloat64=0.000000 } Nominal={ IsSupported=0 } NormalMax={ IsSupported=0 } NormalMin={ IsSupported=0 } } AccuracyFactor=0.000000 } ThresholdDefn={ IsAccessible=1 ReadThold=0x70 WriteThold=0x00 Nonlinear=0 } Oem=0 SENSOR_DATA { SensorEnable=1 SensorEventEnable=1 EventState=0x0008 SensorReading={ IsSupported=1 Type=2 value.SensorFloat64=50.000000 } SensorThresholds={ LowCritical={ IsSupported=0 } LowMajor={ IsSupported=0 } LowMinor={ IsSupported=0 } UpCritical={ IsSupported=1 Type=2 value.SensorFloat64=80.000000 } UpMajor={ IsSupported=1 Type=2 value.SensorFloat64=60.000000 } UpMinor={ IsSupported=0 } PosThdHysteresis={ IsSupported=1 Type=2 value.SensorFloat64=2.000000 } NegThdHysteresis={ IsSupported=0 } } AssertEventMask=0x0038 DeassertEventMask=0x0038 } } } } } RPT { EntryId=4 ResourceId=4 ResourceInfo={ ResourceRev=0x00 SpecificVer=0x00 DeviceSupport=0x00 ManufacturerId=0x000051D0 ProductId=0x0000 FirmwareMajorRev=0x00 FirmwareMinorRev=0x00 AuxFirmwareRev=0x00 Guid="00000000000000000000000000000000" } ResourceEntity={ "{SYSTEM_CHASSIS,1}{DISK_DRIVE,2}" } ResourceCapabilities=0xC0008F7F HotSwapCapabilities=0x00000000 ResourceSeverity=1 ResourceFailed=0 ResourceTag={ DataType=3 Language=25 DataLength=11 Data="HS DASD 1 2" } RDR { SENSOR { RecordId=131073 RdrType=2 Entity={ "{SYSTEM_CHASSIS,1}{DISK_DRIVE,2}" } IsFru=0 IdString={ DataType=3 Language=25 DataLength=28 Data="HS DASD temperature sensor 1" } RDR_DETAIL { Num=1 Type=1 Category=0x01 EnableCtrl=0 EventCtrl=2 Events=0x0038 DataFormat={ IsSupported=1 ReadingType=2 BaseUnits=2 ModifierUnits=0 ModifierUse=0 Percentage=0 Range={ Flags=0x1F Max={ IsSupported=1 Type=2 value.SensorFloat64=125.000000 } Min={ IsSupported=1 Type=2 value.SensorFloat64=40.000000 } Nominal={ IsSupported=1 Type=2 value.SensorFloat64=100.000000 } NormalMax={ IsSupported=1 Type=2 value.SensorFloat64=110.000000 } NormalMin={ IsSupported=1 Type=2 value.SensorFloat64=90.000000 } } AccuracyFactor=0.000000 } ThresholdDefn={ IsAccessible=1 ReadThold=0xFF WriteThold=0xFF Nonlinear=0 } Oem=0 SENSOR_DATA { SensorEnable=1 SensorEventEnable=1 EventState=0x0008 SensorReading={ IsSupported=1 Type=2 value.SensorFloat64=35.000000 } SensorThresholds={ LowCritical={ IsSupported=1 Type=2 value.SensorFloat64=40.000000 } LowMajor={ IsSupported=1 Type=2 value.SensorFloat64=50.000000 } LowMinor={ IsSupported=1 Type=2 value.SensorFloat64=60.000000 } UpCritical={ IsSupported=1 Type=2 value.SensorFloat64=125.000000 } UpMajor={ IsSupported=1 Type=2 value.SensorFloat64=120.000000 } UpMinor={ IsSupported=1 Type=2 value.SensorFloat64=110.000000 } PosThdHysteresis={ IsSupported=1 Type=2 value.SensorFloat64=2.000000 } NegThdHysteresis={ IsSupported=1 Type=2 value.SensorFloat64=2.000000 } } AssertEventMask=0x0038 DeassertEventMask=0x0038 } } } SENSOR { RecordId=131074 RdrType=2 Entity={ "{SYSTEM_CHASSIS,1}{DISK_DRIVE,2}" } IsFru=0 IdString={ DataType=3 Language=25 DataLength=28 Data="HS DASD temperature sensor 2" } RDR_DETAIL { Num=2 Type=1 Category=0x01 EnableCtrl=0 EventCtrl=2 Events=0x0038 DataFormat={ IsSupported=1 ReadingType=2 BaseUnits=2 ModifierUnits=0 ModifierUse=0 Percentage=0 Range={ Flags=0x1F Max={ IsSupported=1 Type=2 value.SensorFloat64=125.000000 } Min={ IsSupported=1 Type=2 value.SensorFloat64=40.000000 } Nominal={ IsSupported=1 Type=2 value.SensorFloat64=100.000000 } NormalMax={ IsSupported=1 Type=2 value.SensorFloat64=110.000000 } NormalMin={ IsSupported=1 Type=2 value.SensorFloat64=90.000000 } } AccuracyFactor=0.000000 } ThresholdDefn={ IsAccessible=0 } Oem=0 SENSOR_DATA { SensorEnable=1 SensorEventEnable=1 EventState=0x0008 SensorReading={ IsSupported=1 Type=2 value.SensorFloat64=35.000000 } AssertEventMask=0x0038 DeassertEventMask=0x0038 } } } CONTROL { RecordId=65537 RdrType=1 Entity={ "{SYSTEM_CHASSIS,1}{DISK_DRIVE,2}" } IsFru=0 IdString={ DataType=3 Language=25 DataLength=15 Data="Digital Control" } RDR_DETAIL { Num=1 OutputType=1 Type=0 TypeUnion.Digital={ Default=1 } DefaultMode={ Mode=0 ReadOnly=1 } WriteOnly=0 Oem=0 } } CONTROL { RecordId=65538 RdrType=1 Entity={ "{SYSTEM_CHASSIS,1}{DISK_DRIVE,2}" } IsFru=0 IdString={ DataType=3 Language=25 DataLength=16 Data="Discrete Control" } RDR_DETAIL { Num=2 OutputType=1 Type=1 TypeUnion.Discrete={ Default=1 } DefaultMode={ Mode=0 ReadOnly=1 } WriteOnly=0 Oem=0 } } CONTROL { RecordId=65539 RdrType=1 Entity={ "{SYSTEM_CHASSIS,1}{DISK_DRIVE,2}" } IsFru=0 IdString={ DataType=3 Language=25 DataLength=14 Data="Analog Control" } RDR_DETAIL { Num=3 OutputType=5 Type=2 TypeUnion.Analog={ Min=0 Max=10 Default=0 } DefaultMode={ Mode=0 ReadOnly=1 } WriteOnly=0 Oem=0 } } CONTROL { RecordId=65540 RdrType=1 Entity={ "{SYSTEM_CHASSIS,1}{DISK_DRIVE,2}" } IsFru=0 IdString={ DataType=3 Language=25 DataLength=14 Data="Stream Control" } RDR_DETAIL { Num=4 OutputType=1 Type=3 TypeUnion.Stream={ Default={ Repeat=0 StreamLength=0 Stream="" } } DefaultMode={ Mode=0 ReadOnly=1 } WriteOnly=0 Oem=0 } } CONTROL { RecordId=65541 RdrType=1 Entity={ "{SYSTEM_CHASSIS,1}{DISK_DRIVE,2}" } IsFru=0 IdString={ DataType=3 Language=25 DataLength=12 Data="Text Control" } RDR_DETAIL { Num=5 OutputType=9 Type=4 TypeUnion.Text={ MaxChars=10 MaxLines=2 Language=25 DataType=3 Default={ Line=0 Text={ DataType=3 Language=25 DataLength=7 Data="Unknown" } } } DefaultMode={ Mode=0 ReadOnly=1 } WriteOnly=0 Oem=0 } } CONTROL { RecordId=65542 RdrType=1 Entity={ "{SYSTEM_CHASSIS,1}{DISK_DRIVE,2}" } IsFru=0 IdString={ DataType=3 Language=25 DataLength=11 Data="Oem Control" } RDR_DETAIL { Num=6 OutputType=1 Type=192 TypeUnion.Oem={ MId=0x0000007B ConfigData="00000000000000000000" Default={ MId=0x0000007B BodyLength=2 Body="4F6B" } } DefaultMode={ Mode=0 ReadOnly=1 } WriteOnly=0 Oem=0 } } ANNUNCIATOR { RecordId=327681 RdrType=5 Entity={ "{SYSTEM_CHASSIS,1}{DISK_DRIVE,2}" } IsFru=0 IdString={ DataType=3 Language=25 DataLength=13 Data="Annunciator 2" } RDR_DETAIL { AnnunciatorNum=1 AnnunciatorType=0x02 ModeReadOnly=0 MaxConditions=2 Oem=0 ANNUNCIATOR_DATA={ Mode=2 ANNOUNCEMENT={ EntryId=1 Timestamp=1272031133999943000 AddedByUser=1 Severity=1 Acknowledged=0 StatusCond={ Type=0 Entity={ "{SYSTEM_CHASSIS,1}{DISK_DRIVE,2}" } DomainId=1 ResourceId=4 SensorNum=1 EventState=0x0000 Name={ Length=5 Value="annou" } Data={ DataType=0 Language=0 DataLength=0 Data="" } } } ANNOUNCEMENT={ EntryId=2 Timestamp=1272031134000298000 AddedByUser=1 Severity=2 Acknowledged=0 StatusCond={ Type=0 Entity={ "{SYSTEM_CHASSIS,1}{DISK_DRIVE,2}" } DomainId=1 ResourceId=4 SensorNum=1 EventState=0x0000 Name={ Length=5 Value="annou" } Data={ DataType=0 Language=0 DataLength=0 Data="" } } } ANNOUNCEMENT={ EntryId=3 Timestamp=1272031134000646000 AddedByUser=1 Severity=3 Acknowledged=0 StatusCond={ Type=0 Entity={ "{SYSTEM_CHASSIS,1}{DISK_DRIVE,2}" } DomainId=1 ResourceId=4 SensorNum=1 EventState=0x0000 Name={ Length=5 Value="annou" } Data={ DataType=0 Language=0 DataLength=0 Data="" } } } } } } WATCHDOG { RecordId=262145 RdrType=4 Entity={ "{SYSTEM_CHASSIS,1}{DISK_DRIVE,2}" } IsFru=0 IdString={ DataType=3 Language=25 DataLength=10 Data="Watchdog 2" } RDR_DETAIL { WatchdogNum=0 Oem=0 WDT_GET={ Log=1 Running=0 TimerUse=0x00 TimerAction=0x00 PretimerInterrupt=0x00 PreTimeoutInterval=0 TimerUseExpFlags=0x00 InitialCount=0 PresentCount=0 } } } INVENTORY { RecordId=196609 RdrType=3 Entity={ "{SYSTEM_CHASSIS,1}{DISK_DRIVE,2}" } IsFru=0 IdString={ DataType=3 Language=25 DataLength=23 Data="Simulator HS DASD Inv 1" } RDR_DETAIL { IdrId=1 Persistent=0 Oem=0 INVENTORY_DATA={ IdrId=1 UpdateCount=0 ReadOnly=0 NumAreas=1 INV_AREA={ AreaId=1 Type=177 ReadOnly=0 NumFields=1 INV_FIELD={ AreaId=1 FieldId=1 Type=2 ReadOnly=0 Field={ DataType=3 Language=25 DataLength=6 Data="IBMXXX" } } } } } } } } RPT { EntryId=5 ResourceId=5 ResourceInfo={ ResourceRev=0x00 SpecificVer=0x00 DeviceSupport=0x00 ManufacturerId=0x000051D0 ProductId=0x0000 FirmwareMajorRev=0x00 FirmwareMinorRev=0x00 AuxFirmwareRev=0x00 Guid="00000000000000000000000000000000" } ResourceEntity={ "{SYSTEM_CHASSIS,1}{FAN,1}" } ResourceCapabilities=0x40008203 HotSwapCapabilities=0x00000000 ResourceSeverity=1 ResourceFailed=0 ResourceTag={ DataType=3 Language=25 DataLength=5 Data="Fan 1" } RDR { SENSOR { RecordId=131073 RdrType=2 Entity={ "{SYSTEM_CHASSIS,1}{FAN,1}" } IsFru=0 IdString={ DataType=3 Language=25 DataLength=41 Data="Blower fan speed - percent of maximum RPM" } RDR_DETAIL { Num=1 Type=4 Category=0x04 EnableCtrl=0 EventCtrl=2 Events=0x0003 DataFormat={ IsSupported=1 ReadingType=2 BaseUnits=18 ModifierUnits=0 ModifierUse=0 Percentage=1 Range={ Flags=0x18 Max={ IsSupported=1 Type=2 value.SensorFloat64=100.000000 } Min={ IsSupported=1 Type=2 value.SensorFloat64=0.000000 } Nominal={ IsSupported=0 } NormalMax={ IsSupported=0 } NormalMin={ IsSupported=0 } } AccuracyFactor=0.000000 } ThresholdDefn={ IsAccessible=0 } Oem=0 SENSOR_DATA { SensorEnable=1 SensorEventEnable=1 EventState=0x0001 SensorReading={ IsSupported=1 Type=2 value.SensorFloat64=60.000000 } AssertEventMask=0x0002 DeassertEventMask=0x0002 } } } CONTROL { RecordId=65537 RdrType=1 Entity={ "{SYSTEM_CHASSIS,1}{FAN,1}" } IsFru=0 IdString={ DataType=3 Language=25 DataLength=18 Data="Fan Analog Control" } RDR_DETAIL { Num=1 OutputType=2 Type=2 TypeUnion.Analog={ Min=0 Max=100 Default=80 } DefaultMode={ Mode=1 ReadOnly=0 } WriteOnly=0 Oem=0 } } } } openhpi-3.6.1/openhpi.spec.in0000644000175100017510000002744012575647264015127 0ustar mohanmohan%define _topdir @abs_top_srcdir@ %define _tmpdir /tmp %define _rpmtopdir %{_topdir}/rpm %define _builddir %{_rpmtopdir}/BUILD %define _rpmdir %{_rpmtopdir}/RPMS %define _sourcedir %{_topdir} %define _specdir %{_topdir} %define _srcrpmdir %{_rpmtopdir}/SRPMS %define _docdir %{_datadir}/doc/%{name} %if %{undefined suse_version} # For systems where libuuid is provided in e2fsprogs rpm %define uuid_provider e2fsprogs %define uuid libuuid %endif %if %{defined suse_version} # For systems where libuuid is provided in libuuid rpm %define uuid_provider libuuid %endif %define with_openssl @WITH_OPENSSL@ %define with_ipmi @WITH_IPMI@ %if "x@IPMIDIRECT@" == "xipmidirect" %define with_ipmidirect 1 %endif %define with_bladecenter @WITH_SNMP_BC@ %if "x@SIMULATOR@" == "xsimulator" %define with_simulator 1 %endif %if "x@DYNAMIC_SIMULATOR@" == "xdynamic_simulator" %define with_dynamic_simulator 1 %endif %define with_rtas @WITH_RTAS@ %define with_sysfs @WITH_SYSFS@ %if "x@WATCHDOG@" == "xwatchdog" %define with_watchdog 1 %endif %define with_ilo2_ribcl @WITH_ILO2_RIBCL@ %define with_oa_soap @WITH_OA_SOAP@ %if "x@SLAVE@" == "xslave" %define with_slave 1 %endif %if "x@TEST_AGENT@" == "xtest_agent" %define with_test_agent 1 %endif %if "x@HPICRYPT@" == "xhpicrypt" %define with_gcrypt 1 %endif Name: @HPI_PKG@ Version: @VERSION@ Release: 1 # Summary: Open implementation of the SAF Hardware Platform Interface # License: BSD Group: System/Monitoring # Vendor: OpenHPI Project Packager: renier@openhpi.org # URL: http://www.openhpi.org Source: http://prdownloads.sourceforge.net/openhpi/%{name}-%{version}.tar.gz # Buildroot: %{_rpmtopdir}/INSTALL BuildRequires: pkgconfig automake autoconf libtool gcc-c++ glib2-devel libstdc++-devel %if 0%{?with_openssl} BuildRequires: openssl-devel %endif %if 0%{?with_gcrypt} BuildRequires: libgcrypt-devel %endif #Requires: glib2 libstdc++ %if 0%{?with_openssl} Requires: openssl %endif %if 0%{?with_gcrypt} Requires: libgcrypt %endif %if %{undefined suse_version} Requires: glib2 libstdc++ %endif %if 0%{?suse_version} <= 1100 Requires: glib2 libstdc++ %define uuid libuuid %endif %if 0%{?suse_version} >= 1100 && 0%{?suse_version} <= 1140 Requires: glib2 libstdc++43 %define uuid libuuid1 %endif %if 0%{?suse_version} >= 1200 Requires: glib2 libstdc++6 %define uuid libuuid1 %endif %package devel Summary: OpenHPI and SAF header files Group: System/Monitoring Requires: openhpi = %{version} %package clients Summary: OpenHPI command-line utilities Group: System/Monitoring %if 0%{?suse_version} BuildRequires: popt-devel %endif Requires: openhpi = %{version} popt %if 0%{?with_ipmi} %package ipmi Summary: OpenHPI plugin for OpenIPMI (deprecated) Group: System/Monitoring BuildRequires: OpenIPMI-devel Requires: openhpi = %{version} OpenIPMI %endif %if 0%{?with_ipmidirect} %package ipmidirect Summary: OpenHPI plugin for IPMI-enabled systems Group: System/Monitoring Requires: openhpi = %{version} %endif %if 0%{?with_rtas} %package rtas Summary: OpenHPI plugin for IBM PPC systems Group: System/Monitoring BuildRequires: librtas-devel Requires: openhpi = %{version} librtas %endif %if 0%{?with_simulator} %package simulator Summary: OpenHPI plugin for testing the core library Group: System/Monitoring Requires: openhpi = %{version} %endif %if 0%{?with_dynamic_simulator} %package dynamic_simulator Summary: OpenHPI plugin for testing the core library Group: System/Monitoring Requires: openhpi = %{version} %endif %if 0%{?with_bladecenter} %package bladecenter Summary: OpenHPI plugin for the IBM Blade Center Group: System/Monitoring BuildRequires: net-snmp-devel %{uuid_provider}-devel Requires: openhpi = %{version} net-snmp > 5.0 %{uuid} %endif %if 0%{?with_sysfs} %package sysfs Summary: OpenHPI plugin for sysfs Group: System/Monitoring Requires: openhpi = %{version} libsysfs %endif %if 0%{?with_watchdog} %package watchdog Group: System/Monitoring Summary: OpenHPI plugin for Linux software watchdog support Requires: openhpi = %{version} %endif %if 0%{?with_ilo2_ribcl} %package ilo2_ribcl Summary: OpenHPI plugin for HP ProLiant Rack Mount Servers Group: System/Monitoring BuildRequires: libxml2-devel Requires: openhpi = %{version} libxml2 openssl %endif %if 0%{?with_oa_soap} %package oa_soap Summary: OpenHPI plugin for HP BladeSystem c-Class Group: System/Monitoring BuildRequires: libxml2-devel Requires: openhpi = %{version} libxml2 openssl %endif %if 0%{?with_slave} %package slave Summary: OpenHPI plugin for a slave OpenHPI daemon Group: System/Monitoring Requires: openhpi = %{version} %endif %if 0%{?with_test_agent} %package test_agent Summary: OpenHPI plugin for simulation with runtime configuration changes support Group: System/Monitoring Requires: openhpi = %{version} %endif %description An open implementation of the Service Availability Forum (SAF) Hardware Platform Interface (HPI). It includes support for multiple types of hardware including: IPMI, IBM Blade Center (via SNMP), Linux Watchdog devices, and Sysfs based systems. %description devel Contains header and other include files needed by developers to build application that use the OpenHPI library. %description clients These command-line applications serve as HPI utilities that you can use for looking at: sensor readings, vpd data, power machines on/off, etc. They lso serve as examples to developers of HPI API usage. %if 0%{?with_ipmi} %description ipmi This OpenHPI plugin uses OpenIPMI to connect to IPMI-enabled hardware locally or over the network. Its focus is wide, created to support any generic hardware topology that uses IPMI. This plugin is not maintained any more; it is recommended to use ipmidirect plugin instead. %endif %if 0%{?with_ipmidirect} %description ipmidirect This OpenHPI plugin connects directly to IPMI-enabled hardware locally or over the network. Its focus is to support ATCA-type chassis. %endif %if 0%{?with_rtas} %description rtas Run-Time Abstraction Services (RTAS) plug-in %endif %if 0%{?with_simulator} %description simulator OpenHPI plugin that reports fakes hardware used for testing the core library. %endif %if 0%{?with_dynamic_simulator} %description dynamic_simulator OpenHPI plugin that reports fakes hardware defined in the file simulation.data used for testing the core library. %endif %if 0%{?with_bladecenter} %description bladecenter OpenHPI plugin supporting the IBM BladeCenter. It also supports RSA-enabled IBM systems, in addition to all types of BladeCenters. This plugin uses snmp to connect to and gather information from all systems. %endif %if 0%{?with_sysfs} %description sysfs OpenHPI plugin that reads system information from sysfs. %endif %if 0%{?with_watchdog} %description watchdog OpenHPI plugin that uses the Linux software watchdog support provided by the kernel. %endif %if 0%{?with_ilo2_ribcl} %description ilo2_ribcl OpenHPI plugin supporting HP ProLiant Rack Mount Servers. This plug-in connects to iLO2 on HP ProLiant Rack Mount Server using a SSL connection and exchanges information via Remote Insight Board Command Language (RIBCL). %endif %if 0%{?with_oa_soap} %description oa_soap OpenHPI plug-in supporting HP BladeSystems c-Class. This plug-in connects to the OA of a c-Class chassis using an SSL connection and manages the system using an XML-encoded SOAP interface. %endif %if 0%{?with_slave} %description slave OpenHPI plug-in that allows to aggregate resources from different domains (slave domains) and to provide aggregated resources as part of the one domain (master domain). %endif %if 0%{?with_test_agent} %description test_agent OpenHPI plugin that reports fakes hardware and allows runtime configuration changes. %endif ################################################### %prep ################################################### %setup ################################################### %build ################################################### %configure @ac_configure_args@ --prefix=/usr --with-varpath=/var/lib/%{name} find . -type f -name "Makefile" | xargs -n1 sed -i -e 's/ -Wp,-D_FORTIFY_SOURCE=2//g;' %{__make} ################################################### %install ################################################### make DESTDIR=%{buildroot} install %{__install} -Dd -m 0755 %{buildroot}%{_sysconfdir}/%{name} %{buildroot}/var/lib/%{name} %{__install} -m 0600 %{name}.conf.example %{buildroot}%{_sysconfdir}/%{name}/%{name}.conf %post ################################################### %files ################################################### %defattr(-,root,root) %{_docdir}/README* %{_docdir}/COPYING %{_docdir}/ChangeLog %dir %{_sysconfdir}/%{name}/ %config(noreplace) %attr(0600,root,root) %{_sysconfdir}/%{name}/%{name}.conf %config(noreplace) %attr(0600,root,root) %{_sysconfdir}/%{name}/simulation.data %dir %{_libdir}/%{name} %dir /var/lib/%{name} %{_libdir}/libopenhpi*.so.* %{_mandir}/man7/%{name}.7* %{_mandir}/man8/%{name}d.8* %{_sbindir}/openhpid %{_sysconfdir}/init.d/openhpid ################################################### %files devel ################################################### %defattr(-,root,root) %{_includedir}/%{name} %{_libdir}/pkgconfig/openhpi.pc %{_libdir}/pkgconfig/openhpiutils.pc %{_libdir}/libopenhpi*.so %{_libdir}/libopenhpi*.la %{_libdir}/*.a ################################################### %files clients ################################################### %defattr(-,root,root) %{_bindir}/hpi* %{_bindir}/ohhandler %{_bindir}/ohparam %{_bindir}/ohdomainlist %{_mandir}/man1/*.1* %{_sysconfdir}/openhpi/openhpiclient.conf ################################################### %if 0%{?with_ipmi} %files ipmi ################################################### %defattr(-,root,root) %{_libdir}/%{name}/libipmi.* %endif ################################################### %if 0%{?with_ipmidirect} %files ipmidirect ################################################### %defattr(-,root,root) %{_libdir}/%{name}/libipmidirect.* %endif ################################################### %if 0%{?with_rtas} %files rtas ################################################### %defattr(-,root,root) %{_libdir}/%{name}/librtas2hpi.* %endif ################################################### %if 0%{?with_simulator} %files simulator ################################################### %defattr(-,root,root) %{_libdir}/%{name}/libsimulator.* %endif ################################################### %if 0%{?with_dynamic_simulator} %files dynamic_simulator ################################################### %defattr(-,root,root) %{_libdir}/%{name}/libdyn_simulator.* %endif ################################################### %if 0%{?with_bladecenter} %files bladecenter ################################################### %defattr(-,root,root) %{_libdir}/%{name}/libsnmp_bc.* %endif ################################################### %if 0%{?with_sysfs} %files sysfs ################################################### %defattr(-,root,root) %{_libdir}/%{name}/libsysfs2hpi.* %endif ################################################### %if 0%{?with_watchdog} %files watchdog ################################################### %defattr(-,root,root) %{_libdir}/%{name}/libwatchdog.* %endif ################################################### %if 0%{?with_ilo2_ribcl} %files ilo2_ribcl ################################################### %defattr(-,root,root) %{_libdir}/%{name}/libilo2_ribcl.* %endif ################################################### %if 0%{?with_oa_soap} %files oa_soap ################################################### %defattr(-,root,root) %{_libdir}/%{name}/liboa_soap.* %endif ################################################### %if 0%{?with_slave} %files slave ################################################### %defattr(-,root,root) %{_libdir}/%{name}/libslave.* %endif ################################################### %if 0%{?with_test_agent} %files test_agent ################################################### %defattr(-,root,root) %{_libdir}/%{name}/libtest_agent.* %endif openhpi-3.6.1/README.windows0000644000175100017510000001143212575647300014536 0ustar mohanmohan======================================================================== This package provides windows version of - Base HPI library (libopenhpi.dll) - OpenHPI utils library (libopenhpiutils.dll) - OpenHPI marshal library (libopenhpimarshal.dll) - OpenHPI transport library (libopenhpitransport.dll) - OpenHPI clients: -- hpialarms.exe -- hpidomain.exe -- hpiel.exe -- hpievents.exe -- hpifan.exe -- hpigensimdata.exe -- hpiinv.exe -- hpionIBMblade.exe -- hpipower.exe -- hpireset.exe -- hpisensor.exe -- hpisettime.exe -- hpithres.exe -- hpitop.exe -- hpitree.exe -- hpiwdt.exe -- hpixml.exe -- ohdomainlist.exe -- ohhandler.exe -- ohparam.exe - OpenHPI daemon as a console Windows application (openhpid.exe) -- Slave plug-in (libslave.dll) -- Test Agent plug-in (libtest_agent.dll) The package also provides necessary glib2 libraries: - libglib-2.0-0.dll - libgthread-2.0-0.dll - libgmodule-2.0-0.dll NB: glib2 libraries were obtained in binary form from http://www.gtk.org/download-windows.html and were included without any change. NB: glib2 is distributed under LGPL2 license. The package can include additional auxiliary libraries. ======================================================================== Dependencies: The only dependence (save for mingw compiler) is glib2. Windows version can be obtained at http://www.gtk.org/download-windows.html ======================================================================== Current windows build system supports only mingw compiler. http://www.mingw.org/ However the built libraries can be use as ordinary windows DLL in projects with any compiler. ======================================================================== Build instructions: - Get mingw (cross or native). - Get archive with glib2 for windows and unpack it somewhere. - Enter OpenHPI source tree root directory. - Modify Makefile.mingw32.def: -- ARCH in order to point architecture for produced binaries -- TOOLCHAIN_PATH in order that CC, CXX, AS and RC point to correct files. -- GLIB_DIR: in order that GLIB_INCLUDES and GLIB_LIBS point to valid directories with glib headers and libraries. - Run "make -f Makefile.mingw32". - Run "make -f Makefile.mingw32 out". - The openhpi-${VERSION}-win32-${ARCH} sub-directory will contain all produced stuff. - For gcc4-based compiler (i.e. mingw-w64.sourceforge.net ) you need to copy more libs: -- libgcc_s_*.dll -- libstdc++-*.dll - Optional step - strip produced exe and dll files. ======================================================================== Client Usage instructions: There are two ways: Way 1) prepare openhpiclient.conf and set env. var. OPENHPICLIENT_CONF to its path Way 2) set env. var. OPENHPI_DAEMON_HOST to OpenHPI daemon address. ======================================================================== Library Usage instructions: Header file SaHpi.h contains declarations on provided HPI functions. Header file oHpi.h contains declarations on provided OpenHPI extension functions. Make sure to use the oHpi.h and SaHpi.h files from openhpi-3.3.0-win32-x86 or openhpi-3.3.0-win32-amd64 directory, not the ones from trunk/include directory. The functions are in libopenhpi.dll. Define "SAHPI_API" macro as "__declspec(dllimport)". For mingw compiler it can be just linked. For MSVC: - There is def file libopenhpi.def - With lib tool you can create import library - Command example "lib /machine:i386 /def:libopenhpi.def" - Point produced import library in Project settings For application running and distribution:: - copy necessary libraries to your application dir. And see Client Usage instructions about configuring OpenHPI daemon address to connect. ======================================================================== Library Known Issues: =================================================== Seems mingw has its own copy of environment variables. So the code: _putenv("OPENHPI_DAEMON_HOST=..."); rv = saHpiSessionOpen(...) does not work in MSVC as expected. But setting any variable before running executable works! =================================================== Seems client applications do not close sockets. The sockets remain in TIME_WAIT state. It can exhaust system resources. ======================================================================== Daemon Usage instructions: Only Slave plug-in and Test agent plug-in are now ported under Windows. - prepare openhpi.conf - openhpid.exe -v -c "path to openhpi.conf" As an optional step you can do - set OPENHPI_UID_MAP="path to uid map file" before running openhpid.exe. The uid map file will be used for persistent resource id <-> entity path mapping. NB: -v is optional flag for verbose messages. ======================================================================== Troubleshouting: Mailing list: openhpi-devel@lists.sourceforge.net or IRC channel #openhpi on FreeNode. openhpi-3.6.1/ChangeLog0000644000175100017510000016701712575650125013751 0ustar mohanmohanChangelog for 3.6.1 (09/14/2015) New Features Fixed Bugs Build System 1898 Checkin 7658 - make fails in libgcrypt-devel systems Documentation 1901 Checkin 7661 - bootstrap information could be added to README HPI Clients 1899 Checkin 7659 - hpithres segfaults on EOF Changelog for 3.6.0 (08/26/2015) New Features Fixed Bugs Blade Center Plugin 1866 Checkin 7617 - Make autogenerated file output more stable Build System 1897 Checkin 7654 - openhpi not installable on SLES12 1886 Checkin 7642 - Warnings from new automake 1883 Checkin 7638 - /var/lib/openhpi world-writable imposes security risk 1873 Checkin 7628 - cscope target in Makefile gives error...Incomplete file list in cscope.files Documentation 1807 Checkin 7614 - use standard docdir HP ProLiant plugin 1892 Checkin 7650 - New compile warning in the ilo2_ribcl plugin 1890 Checkin 7644 - Add support for IML events 1889 Checkin 7644 - Power supply status differences not handled 1888 Checkin 7641 - Processor RPT is getting created even if it is not installed 1885 Checkin 7640 - RPT for FAN is getting Created even if that FAN resource is Not Installed 1884 Checkin 7645 - Wrong Resource severity set during first time discovery in ilo2_ribcl 1882 Checkin 7636 - Needs Gen9 also to decide ilo_type 1876 Checkin 7631 - ilo2_ribcl takes a long time to exit on kill 1870 Checkin 7625 - Some times saHpiResourcePowerStateSet return is not correct 1863 Checkin 7612 - Create wrap_g_free to set the freed memory to NULL in ilo2_ribcl plugin 1830 Checkin 7620 - Core dump in ilo2_ribcl plugin on kill 1683 Checkin 7622 - ilo2 ribcl plugin fails when parsing cpu information 1611 Checkin 7639 - ilo2_ribcl plug-in need to support the get_hotswap_state ABI 1517 Checkin 7644 - ilo2_ribcl plugin takes a long time, to start a client HP c-Class Plugin 1895 Checkin 7651 - StandBy OA insertion is not handled properly, and RPT is not added 1894 Checkin 7652 - debug folder make fails when configure with --enable-testcover 1880 Checkin 7632 - Incorrect Critical messages in oa_soap plugin 1879 Checkin 7635 - oa_soap_get_hotswap_state() should check SAHPI_CAPABILITY_FRU 1874 Checkin 7626 - Global variables need to be enclosure specific 1872 Checkin 7621 - Incorrect OA information structure initialization 1862 Checkin 7613 - Create wrap_g_free to set the freed memory to NULL 1861 Checkin 7616 - Openhpi reports Server in slot # is removed / added during OA switchover 1848 Checkin 7619 - when Kill is issued some times few threads are still alive indefinitly 1814 Checkin 7629 - Sometimes during kill -15 of daemon core gets generated 1571 Checkin 7634 - Customer visible messages could be better HPI Utils 1891 Checkin 7646 - make fails for distcheck target 1887 Checkin 7643 - uid_utils.c generates warnings in RHEL7 1877 Checkin 7637 - Old functions still used with GLIB>2.31 OpenHPI Daemon 1896 Checkin 7653 - Kill SIGTERM does not terminate daemon in new GLIB 1878 Checkin 7630 - CRIT OpenHPID calling the saHpiSessionOpen could be DBG mesage 1875 Checkin 7627 - User kill signal need not generate error 1871 Checkin 7623 - Discovery thread takes long time to terminate after SIGTERM 1865 Checkin 7615 - docdir is not defined in older autotools OpenHPI Daemon Client 1881 Checkin 7633 - hpisettime exits prematurely with return code 1 ssl 1869 Checkin 7618 - Destroying the locked mutex 1868 Checkin 7624 - SSL_get_error may be reporting an old error Changelog for 3.5.0 (10/09/2014) New Features HP c-Class Plugin 702 Checkin 7595 - Support for BL460c Gen9 server 653 Checkin 7591 - Supporting Array SOAP calls Fixed Bugs Blade Center Plugin 1845 Checkin 7584 - undefined behavior in snmp_bc_utils.c Build System 1860 Checkin 7603 - Make fails on cross-compiler 1857 Checkin 7604 - RPM build error with GCC 4.7.2 Documentation 1850 Checkin 7589 - man page fixes 1838 Checkin 7583 - Add ChangeLog to openhpi 1797 Checkin 7586 - Bug number mapping file HP ProLiant plugin 1854 Checkin 7594 - increased memory consumption during failures 1843 Checkin 7596 - Create an event for IML log memory error 1816 Checkin 7576 - saHpiSensorThresholdsGet returns with INTERNAL error with ilo2_ribcl plugin HP c-Class Plugin 1856 Checkin 7602 - OA status is not updated in the plugin 1855 Checkin 7601 - Blades addition/removal during switchover not reflected in RPT 1842 Checkin 7590 - Create an event for memory errors 1837 Checkin 7582 - Sometimes blade sensors do not reflect the correct state 1835 Checkin 7581 - openhpid in a loop with OA 4.21 during re-discovery 1831 Checkin 7579 - New events added in OA FW 4.20 not represented in openhpi 1827 Checkin 7578 - Resource RPT is NULL error is observed in interconnect blade removal and Re-discovery is getting failed 1826 Checkin 7577 - Need error messages for DIMM failures in /var/log message 1824 Checkin 7572 - debug folder test programs are not getting compiled in RHEL 7.0 1821 Checkin 7575 - Sometimes, oa_soap plugin tries to connect to 0.0.0.0 1820 Checkin 7569 - The trailing \n needs to be removed from CRITICAL message 1819 Checkin 7570 - Sensor CRIT information could be WARN/INFO or CRIT 1818 Checkin 7593 - gcc 4.7 compiler warning in soap plugin 1817 Checkin 7573 - Adjust the spaces in inventory fields strings for CPU and FAN HPI Clients 1802 Checkin 7574 - Firmware minor revision filed is missing from hpitree -a output HPI Utils 1833 Checkin 7580 - oh_utils.h missing one of its dependant header files OpenHPI Daemon 1834 Checkin 7588 - accept() failed in openhpi daemon OpenHPI Daemon Client 1822 Checkin 7571 - hpisettime needs to give usage message OpenHPI base library 1853 Checkin 7592 - gcc 4.7 compiler warning in infrastructure code Web Site 1847 Checkin 7587 - Release scripts directory www cleanup 1846 Checkin 7585 - Release scripts in www do not work Changelog for 3.4.0 (11/14/2013) New Features OpenHPI Daemon OLD 3562300 NEW 697 Checkin 7556 - Clear text authentication credentials is a security problem Fixed Bugs OpenHPI base library 1806 Checkin 7558 - uid_map created as world writable - a security risk Marshal Library 1805 Checkin 7552 - Fix compiler warnings in the build HP c-Class Plugin 1808 Checkin 7553 Checkin 7554 - oa_soap does not work with IPV6 addresses 1809 Checkin 7555 - Get Powercapconfig fails sometimes 1801 Checkin 7557 - Pulling network cable from Active OA creates OA link status sensor event that never clears OLD 3564813 NEW 1759 Checkin 7556 - OA_SOAP and ilo2_ribcl plugins require plain text passwords 1813 Checkin 7559 - Replace getAllEvents with getAllEventsEx call 1812 Checkin 7560 - SIGINT(15) is not processed for a long time 1815 Checkin 7563 - mutex not unlocked when there is a memory problem 1810 Checkin 7564 - RPT is missing when event arrives Changelog for 3.2.1 (07/18/2013) New Features Transport Library OLD 3590103 NEW 698 Checkin 7522 - Improve error message in case of unsupported protocol Marshal Library OLD 3519485 NEW 673 Checkin 7510 - Rework assertions in marshal code HP c-Class Plugin OLD 3613747 NEW 699 Checkin 7542 - Handler for EVENT_NETWORK_INFO_CHANGED Fixed Bugs Build System OLD 3566330 NEW 1763 Checkin 7513 - host-specific PKG_CONFIG_PATH in case of cross-compile OLD 3564447 NEW 1758 Checkin 7512 - Missed build files for hpi_shell(Windows) OLD 3562465 NEW 1755 Checkin 7509 - Not all README* files included in dist tarball NEW BUG 1804 Checkin 7547 - Fix the make distcheck failures Documentation NEW BUG 1803 Checkin 7548 - Readme.windows needs to info on header file processing OpenHPI Daemon OLD 3613546 NEW 1790 Checkin 7532 - Make oh_get_global_param() in openhpid/conf.c more robust OLD 3566478 NEW 1764 Checkin 7521 - Daemon needs to check config file security OpenHPI base library OLD 3613753 NEW 1791 Checkin 7541 - Fix another set of references before checks NEW BUG 1800 Checkin 7545 - Error in 3.2.x\baselibs\csharp\README HPI Clients OLD 3606640 NEW 1774 Checkin 7525 - Issues with initial svn snapshot builds OLD 3425850 NEW 1673 Checkin 7527 - hpipower command is misleading the user HP c-Class Plugin OLD 3613757 NEW 1794 Checkin 7538 - Fix typo in oa_soap_proc_server_status() OLD 3613756 NEW 1793 Checkin 7540 - potential double free() in oa_soap_event_thread() OLD 3613545 NEW 1789 Checkin 7531 - remove_interconnect() in oa_soap_plugins code bug OLD 3613544 NEW 1788 Checkin 7536 - build_interconnect_inv_rdr() is missing some ret value assig OLD 3613536 NEW 1787 Checkin 7535 - oa_soap_re_discover_resources() arguments checks need fixing OLD 3613534 NEW 1786 Checkin 7534 - wrong interconnectTrayPortNumber OLD 3613532 NEW 1784 Checkin 7543 - Should not free(foo)when asprintf(foo ...fails) OLD 3612225 NEW 1782 Checkin 7529 - saHpiResourceResetStateSet doesn't implement true COLD_RESET OLD 3610943 NEW 1777 Checkin 7537 - openhpi OA switchover issues OLD 3607674 NEW 1776 Checkin 7528 - Insert Procurve 6120 switch sets and doesn't clear alarms OLD 3578345 NEW 1770 Checkin 7523 - Wrong OA FW Version is displayed by openhpi clients OLD 3572505 NEW 1768 Checkin 7518 - PSU alarms lost if the active OA restarts OLD 3571330 NEW 1766 Checkin 7519 - openhpid cannot re-connect to OA after network failures OLD 3566304 NEW 1762 Checkin 7524 - EVENT_STANDBY_FLASH_BOOTED event is not processed OLD 3564814 NEW 1760 Checkin 7514 - Unknown Board casues openhpid to fail discovery OLD 3562666 NEW 1756 Checkin 7511 - segfaults when retrieving thermal info NEW BUG 1799 Checkin 7546 - oa_soap NULL dereference code paths HP Proliant plugin OLD 3613758 NEW 1795 Checkin 7539 - Fix typo in ir_xml_record_fandata() OLD 3613533 NEW 1785 Checkin 7533 - ilo2 wrong free() OLD 3603349 NEW 1773 Checkin 7530 - Thresholds for Temp sensors are not showing and state is wrong IPMI Direct plugin OLD 3580161 NEW 1772 Checkin 7520 - Several sensor bugs with Intel baseboards OLD 3562924 NEW 1757 Checkin 7517 - BIOS sensors and events are not handled Changelog for 3.2.0 (08/27/2012) New Features Build System 3533215 - Enable test_agent plug-in by default 3533216 - Enable slave plug-in by default HPI Shell 3523023 - hpi_shell for Windows None 3531917 - Assign more telling names to new IPMI-2.0 entities OpenHPI C# base library 3530528 - C#: implement oHpi Handler API 3540087 - Add SaHpiAtca.h and SaHpiXtca.h stuff to C# baselib 3530524 - C#: implement convenient HPI iterators OpenHPI Java base library 3540086 - Add SaHpiAtca.h and SaHpiXtca.h stuff to java baselib 3530525 - Java#: implement convenient HPI iterators 3530529 - Java: implement oHpi Handler API OpenHPI Python base library 3532764 - More consistent names for HpiIterators and OhpiIterators 3540085 - Add SaHpiAtca.h and SaHpiXtca.h stuff to python baselib 3530526 - Python: implement oHpi Handler API Sysfs Plugin 3534266 - Add configuration example in openhpi.conf Test Agent plugin 3530531 - FUMI support for Test Agent plugin 3530530 - DIMI support for Test Agent plugin 3530522 - Resource Event Log support for Test Agent plugin 3530146 - Watchdog support for Test Agent plugin Transport Library 3544208 - Make RPC header cross-platform Fixed Bugs Build System 3538699 - Test Agent plugin has no rpm package Documentation 3161758 - openhpi.conf.example should have all plugins HP ProLiant plugin 3554945 - Combined iLO4 problems needs to be addressed HP c-Class Plugin 3562201 - session ID could have undesirable characters 3559102 - Segfault in Power Supply Removal and Reinsertion 3559096 - Segfault in EVENT_INTERCONNECT_INFO event handler 3552248 - Add PRODUCT_NAME field to power supply 3545368 - EVENT_BLADE_MP_INFO event needs to be handled 3522592 - Segfualt After Active OA Reset with two Enclosure configured 3539516 - Core during OA firmware upgrade 3546395 - Double free when a Resource removed 3521752 - Server Blade name is shown as [Unknown] 3425872 - With Active OA cable unplugged Openhpid getting crashed 3526603 - openhpid core with SIGTERM 3520845 - Seg fault is seen after switchover after running hpib test 3509438 - Analog ctrl default is less than the min value 3522915 - Messages are seen when openhpid is run on c3000 enclosure HPI Clients 3522912 - hpixml fails if there is a resource without rdrs HPI Shell 3547194 - gcc-4.7 warnings when building hpi_shell 3536627 - hpi_shell: incorrect watchdog timer action can be specified 3531947 - hpi_shell on quit:"saHpiEventGet failed with error<-1014>" Marshal Library 3529744 - Remove unnecessary oHpi.h, oh_utils.h from marshal header None 3529766 - Fix clang compilation warnings 3530559 - oHpi.h: inaccurate data types for some structs 3534444 - oHpiHandlerGetNext(): incomplete description of return codes OpenHPI C# base library 3558493 - C#: SaHpiDimiTestParamValueT is (de)marshalled incorrectly OpenHPI Daemon 3547203 - gcc-4.7/mingw warning when building openhpid 3534897 - oHpiHandlerInfo polling causes slow initial discovery 3540184 - daemon can crash if there is a failed handler 3523021 - auto-insertion timeout limitations in openhpi.conf 3522913 - compilation warning in openhpid/plugin.c OpenHPI Java base library 3558494 - Java: SaHpiDimiTestParamValueT is (de)marshalled incorrectly OpenHPI Python base library 3558495 - Py: SaHpiDimiTestParamValueT is (de)marshalled incorrectly OpenHPI base library 3536844 - saHpiFinalize() call can produce segfault 3530655 - oHpiHandlerInfo fills handler info entity root incorectly OpenIPMI plugin 3538125 - long delay at startup in openhpi daemon Test Agent plugin 3530154 - TestAgent: hpitest Events/saHpiEventGet/RptEntryAndRdr fails 3530761 - Test Agent: second handler is not operational Transport Library 3522916 - Remove "connect failed" messages for IPv6 Changelog for 3.1.0 (05/01/2012) New Features HP c-Class Plugin 3117718 - Report cpu blade Mezznine card, and memory details 3519995 - Add support for c3000 enclosures None 3438302 - Add oHPI API descriptions in oHpi.h 3436658 - Windows: default config file location shall be in %APPDATA% OpenHPI C# base library 3497553 - Implement baselib for C# OpenHPI Daemon 3475539 - openhpid: better handling of --ipv4 --ipv6 options OpenHPI Java base library 3497552 - Implement baselib for Java OpenHPI Python base library 3505194 - Add convenient helper functions for RPT/RDRs... iteration 3497551 - Implement baselib for Python Fixed Bugs Build System 3487840 - acinclude.m4: remove gcc aux ver check 3437013 - RPM: remove tcp_wrappers dependency HP ProLiant plugin 3522116 - Compiler warning seen in 3.1 HP c-Class Plugin 3520830 - Error message is seen for one of the interconnects 3522644 - Mismatched area count while discovering in C3000 enclosure 3520000 - Update oa_soap plugin documentation 3324288 - IDR custom field types needs to be visible 3025938 - clients hang during/after a OA switchover 3285693 - Generate thermal events 3388695 - OA soap plugin exits on Switchover - C-7000 with storage 3519664 - Some of the thermal sensors are missing HPI Shell 3454319 - hpi_shell: reopen hungs in case of openhpid restart 3475530 - hpi_shell: using wrong enumeration for TimerAction field 3470221 - time2str does not handle relative timestamps correctly 3428181 - hpi_shell: entity for first event printed wrong HPI Utils 3519126 - Manufacturer ID for Cisco System Switches showing as unknown 3457592 - oh_decode_time() decodes relative times as"invalid time" 3497633 - drop executable stack flag from hpixml None 3471920 - Windows build shall include SaHpiXtca.h header OpenHPI Daemon 3414200 - saHpiMyEntityPathGet impl not flexible enough 3461148 - OpenHPI daemon crashes if receives unknown request 3434608 - Move libuuid dependency from OpenHPI core to snmpbc plugin OpenHPI base library 3431428 - Add entity_root domain parameter info in openhpiclient.conf Simulator plugin 3434607 - Remove libuuid dependency from simulator plugin Watchdog plugin 3434606 - Remove libuuid dependency from watchdog plugin Changelog for 3.0.0 (10/17/2011) New Features Documentation 3411347 - Remove outdated docs/hld subdirectory HP c-Class Plugin 3196244 - Have a field to display aggregate status of the enclosure OpenHPI Daemon 3406760 - openhpid: report client connection address in log Fixed Bugs Documentation 3411893 - Fix formatting of option descriptions in man pages Dynamic Simulator plugin 3414205 - Bad lock release in dynamic simulator HP ProLiant plugin 3423245 - Remove compiler warnings from ilo2_ribcl plugin 3416584 - ilo2_ribcl: FreeBSD compilation issue 3407032 - ilo2 plugin has problem reading temperature sensor values 3109793 - Populate temperature sensors 3394069 - duplicate definition of ILO2_RIBCL_DISCOVER_RESP_MAX HP c-Class Plugin 3356142 - Resource Tag displaying as Unknown for some of the blades 3025936 - SWITCH_BLADE generates too many events 3264695 - Report blade MAC addresses (NICs) information 2791727 - serial number goes unknown after extraction and re-insertion 2967121 - Incorrect serial number reported 3400203 - OA Redundancy is not set properly when standy OA is pulled 3403514 - Good Interconnect severity goes to CRITICAL after switchover 3374358 - OA Soap plugin need to allow access to operators too HPI Clients 3405673 - client -N "IPv6 address" doesn't work 3324287 - hpitree needs verbose output 3362952 - hpixml processes failed resources incorrectly HPI Shell 3414470 - hpi_shell: DIMI commands print trailing garbage HPI Utils 3362979 - Incorrect displaying of OEM sensor type IPMI Direct plugin 3414203 - Hang during discovery in ipmidirect plugin None 3416581 - various FreeBSD compilation issues OpenHPI base library 3327878 - saHpiDimiTestStatusGet returns wrong percentage Changelog for 2.17.0 (06/20/2011) New Features Build System 3141155 - Move to newer version of glib2 HPI Clients 3129972 - change -n and OPENHPI_DAEMON_HOST semantics 3130030 - client for providing system view in XML form 1493787 - Update clients to use long options and uniform format HPI Shell 2431334 - Proposal to change prompt in hpi_shell 3235117 - hpi_shell: running DIMI test with parameters None 3315211 - FreeBSD support 3138629 - get rid of many error/debug messages 3141721 - oHpi.h shall not depend on oh_utils.h 3031797 - Windows version of OpenHPI base library 3129960 - Refactoring: baselib, transport, daemon 3129977 - Transport: IPv6 support OpenHPI Daemon 2220356 - Supporting the graceful shutdown for openhpi daemon 3094859 - Add a possibility to listen only specified network interface 3129962 - migration from libltdl to glib 3129975 - Generic code to remove destroyed handler resources 3143658 - Remove static plug-in feature 3153081 - WIndows version of OpenHPI daemon 3160127 - Make using uid_map file optional OpenHPI base library 3098224 - Add entity_root parameter to domain configuration 1531430 - Upgrade error messaging to use glib\\\\\\\\\\\\\\\'s api 1884816 - Finish using OH_CALL_ABI macro throughout safhpi.c 3137336 - Implement saHpiInitialize and saHpiFinalize Slave plugin 3136828 - Slave: use g_new instead of g_malloc 3139353 - Slave: migration to gmodule Test Agent plugin 3307756 - New plug-in for runtime simulation Fixed Bugs Build System 2012381 - make using of -Werror configurable Dynamic Simulator plugin 3304257 - FUMI - Not supported 3304214 - Parsing of DIMI data fails 3296552 - simulation.data typo Unknwon should be Unknown 3267873 - Dynamic Simulator doesn't parse negative Sensor values 3267973 - Dynamic Simulator: Crash for invalid character in text buffe HP ProLiant plugin 3019167 - ilo2_ribcl plugin fails with iLO3 firmware ver 1.0 3183680 - gcc 4.5 warning in ilo plugin HP c-Class Plugin 3300931 - Active OA Reset Leads to Segmentation Fault in Openhpid 3276450 - hpigensimdata on oa_soap plugin creates invalid character 3117681 - Extract romVersion value from bladeStatus to populate it in 3152855 - Sensor RDRs missing for the fan resource 3167851 - Compilation warnings in OA_SOAP plug-in 3203038 - Remove the usage of the"poisoned"snprintf from OA SOAP plu HPI Clients 3304218 - hpigensimdata - wrong FUMI entries 3167843 - gcc-4.6 warnings in clients 3183692 - clients should use CRIT/DBG macros consistently 3198689 - hpiinv displays binary fields as a non-printing data 3167842 - strnlen function is not cross-platform HPI Shell 3152879 - user can mix up default ctrl mode and current control mode 3183665 - gcc 4.5 warnings in hpi_shell IPMI Direct plugin 3183666 - gcc 4.5 warning in ipmidirect Marshal Library 3141723 - oHpiGlobalParamUnionT is marshalled incorrectly None 2717565 - -Werror produces many 'unused variable' errors 3167845 - gcc-4.6 warnings in baselib, marshal, utils, transport OpenHPI Daemon 3314876 - saHpiGetIdByEntityPath returns non-existent resource ids 3308411 - saHpiIdrAreaAddById incorrectly check for duplicates 2948127 - saHpiHotSwapStateGet() should check SAHPI_CAPABILITY_FRU 2798408 - auto-insertion timeout cannot be configured 2900765 - saHpiResourceIdGet produces errors in the /var/log/messages 3141433 - Deadlock in daemon initialization code OpenHPI base library 3310802 - Race condition in session layer 3129991 - Baselib: thread issues 3159052 - Typo in openhpiclient.conf.example 3220499 - hpib-test"Control/saHpiControlGet/NullParams"failure Changelog for 2.16.0 (02/23/2011) New Features Dynamic Simulator plugin 3187136 - Add documentation to rpms OpenHPI base library 3095642 - Using base library with redundant OpenHPI daemons Fixed Bugs Documentation 3141567 - README files are outdated Changelog for 2.15.1 (12/13/2010) New Features Build System 3073298 - Configure option to specify net-snmp-config Dynamic Simulator plugin 3064210 - wtd ->wdt for dynamic_simulator plug-in HPI Clients 3032998 - New client for domain information HPI Shell 3102198 - hpi_shell: tune "domain" cmd semantics, introduce "drt" cmd 3097473 - Add -D option to hpi_shell to select startup domain id 3064208 - wtd ->wdt in hpi_shell 3074871 - support for oHpiDomainAdd and oHpiDomainAddById in hpi_shell HPI Utils 3028899 - remove libopenhpiutils dependency on libuuid Marshal Library 3118484 - Marshalling code refactoring None 3074880 - Extend oHpiHandlerInfo for handler params 3084837 - A new plug-in for working with slave OpenHPI daemon 3120814 - refine include/oh_error.h 3121221 - make code working with time routines more cross-platform OpenHPI Daemon 3052337 - Add a way to remove RDR without removing the Resource 3060625 - Allow resource/hotswap events without RPT entry attached OpenHPI Daemon Client 3085861 - Provide Clients using oHpi functions OpenHPI base library 3125482 - Additional function oHpiDomainEntryGetById 3094865 - Use TCP Keep Alive feature 3025777 - Support for domain discovery 3061872 - Baselib refactoring 3064532 - Add a way to configure domains dynamically Fixed Bugs Build System 3105150 - update LD_LIBRARY_PATH in the test-suite 2964276 - openhpi.spec is incorrect 2964278 - conditional dependency on SSL in openhpi.spec 3101569 - "make rpm" is broken now Documentation 3032617 - openhpi.conf.example uncomplete Dynamic Simulator plugin 3123650 - Dyn Sim: incorrect reading of control state 3123648 - Dyn Sim: garbage in text buffer data HP c-Class Plugin 3029670 - OA_SOAP: missed B.02 saHpiEventLogCapabilitiesGet support HPI Clients 3102111 - printf should use %d and %u consistently 2964284 - hpifan does not set fan correctly HPI Shell 3018067 - wtdget should be wdtget? 3026001 - Typo in help 3074867 - hpi_shell -c key processed in a not right way HPI Utils 3030239 - using of uint type is no good 3032021 - make usage of strftime cross-platform 3108407 - utils: malloc/free is mixed up with g_malloc/g_free 3108416 - Windows: open() does not support S_IRGRP flag 3119772 - Windows: check for _WIN32 macro instead of MINGW32 IPMI Direct plugin 3118246 - saHpiIdrFieldSet in ipmidirect always returns read only 3105154 - fix build with gcc 4.5 Marshal Library 3124648 - OpenHPI transport only reads single packages 3108399 - Marshalling of var arrays None 3028889 - some oversights in function declarations in SaHpi.h 3031568 - Fix unpunctual usage of extern "C" and inclusion guards 3031574 - sid data member is cstrmsock class is not used 3044446 - oHpiParamGet and oHpiParamSet marshalling error 3029657 - make check&make distcheck failed OpenHPI Daemon 3023354 - Some eventlog hpib tests failed 3093009 - Daemon does not deliver event of SAHPI_ET_HPI_SW type 3108401 - openhpid: malloc/free is mixed up with g_malloc/g_free 3078699 - oHpi functions don't free hash tables 3074876 - oHpiHandlerCreate crashes daemon 2936381 - use dbg instead of printf in marshal/strmsock.cpp OpenHPI base library 3125484 - oh_getnext_domainid not threadsafe 2986517 - oHPI API does drawback in multi-domain configuration 2936377 - libuuid moved from e2fsprogs 3031579 - oHpi* functions are not declared correct 3108398 - Baselib: malloc/free is mixed up with g_malloc/g_free 3118202 - Parameter Checks in oHpiXXX functions 3078684 - oHpi functions should use SAHPI_API etc. consistently 3031605 - port parameter is cstrmsock::Open shall be unsigned short OpenIPMI plugin 3032995 - disable ipmi plugin by default Simulator plugin 3042194 - When inventory RDR created first, cant dump data 3101609 - Simulator: does not remove resources on handler destroy Slave plugin 3122116 - Slave: compilation issues Changelog for 2.15.0 (06/30/2010) New Features Build System 2953031 - source tree restructuring 3005259 - Split marshal and transport code OpenHPI Clients 2933010 - SAHPI_HS_CAPABILITY_AUTOINSERT_IMMEDIATE support in hpishell 2942405 - Bring hpi_shell into accord with HPI-B.03.02 spec 2950604 - Add hex representation of Manufacturer Id in hpi_shell 3011456 - Domain Support for Clients 3015970 - hpi_shell is missing man page HP c-Class Plugin 2982733 - Add power mgmt controls to oa_soap plugin 2984110 - Add dynamic power cap control support for OA firmare 3.0 2991532 - Add oa_soap unit tests for new power management features 2999565 - Enhance oa_soap plugin documentation for pwr management New Dynamic Simulator Plugin 3014476 - Merge dynamic simulator into trunk branch OpenHPI Infrastructure 2964252 - SAIM-HPI-B.03.02-xTCA support in core 3005255 - Drop UDP transport 3004865 - make endian code simplier 3013282 - Implement saHpiRdrUpdateCounterGet() 3014655 - Disable daemon until openhpi.conf is configured Fixed Bugs OpenHPI Infrastructure 2907441 - mutex is unlocked in inproper place 2932689 - SaHpi.h - inconsistency in the FUMI Logical Bank State Flags 2932973 - sahpi_enum_utils.{c,h} do not correspond to SaHpi.h 2963277 - wrong comparison of textbuffer.data 2969326 - In function SensorThresholdsSet wrong values are checked 2973314 - saHpiGetChildEntityPath incorrectly handles root entity 2973401 - IdrFieldAddById isn't allowed for FIRST_ENTRY 2986453 - Timeout in saHpiEventGet written to error log 2986511 - oHpi API returns error 2992258 - theoretical memory overflow at writing logfiles 3007844 - Confusion with init script 3013166 - saHpiInitialize and version compatibility 3015981 - Fix misc. spelling errors in source files 3016085 - Garbage after printing ResourceTag 3016093 - Company Name Change 3017744 - Dimi and Fumi should be displayed as DIMI and FUMI 3020172 - rdr command does not show Default field for Text/OEM ctrls Build System 2936377 - libuuid moved from e2fsprogs 3009912 - remove auto-generated Makefile 3014969 - make distcheck failed on svn trunk OpenHPI Clients 2907427 - hpi_shell displays oem control rdr incompletely 2932998 - hpi_shell does not print CauseOfStateChange in HS event 2948577 - hpitree and hpitop show wrong behavior for resourceId 255 2950586 - wrong resource GUID displaying in hpi_shell 2992226 - hpitop doesn't show fumi and dimi data 3005318 - Resource Tag displaying is not ok in hpiinv and hpipower 3014386 - hpisettime input parameter check 3014897 - DIMI and FUMI options do not work hpitop HP c-Class Plugin 2979598 - DataLength of IDR Field should not include trailing blanks 3015283 - Misc. compile warnings in oa_soap plug-in New Dynamic Simulator Plugin 3015282 - Misc. compile warnings in new simulator Changelog for 2.14.1 (11/23/2009) New Features HP ProLiant plugin 2902655 - HP ProLiant Development Guide needs updates 2880239 - ilo2_ribcl: Add support for DL380 G6 Server Build System 2878436 - Allow builds on systems with 64 bit integers 2546669 - Fix a configure problem with glib on Solaris IPMI Direct plugin 2793974 - Add support to the IPMI Direct Plugin for Sun servers OpenHPI base library 2543954 - Fix a compile problem with sprintf on Solaris Fixed Bugs OpenHPI base library 2890776 - superfluous g_static_rec_mutex_unlock 2880409 - issues with saHpiGetIdByEntityPath() 2796891 - Error in SaHpi.h HP c-Class Plugin 2884312 - oa_soap: Switchover removes and re-inserts resources 2794368 - hot swap event(s) missing after extraction and re-insertion 2723870 - OA Soap - saHpiResourcePowerStateSet() sometimes leaves system off after SAHPI_POWER_CYCLE HPI Clients 2883356 - hpitop produces trailing garbage output 2800731 - hpiinv stops if saHpiIdrAreaHeaderGet errors 2795463 - hpitree produces garbage output HP ProLiant plugin 2873686 - ilo2_ribcl_getfile() doesn't close file before return SNMP Client plugin 2812037 - array index out of bounds. HPI Shell 2799537 - hpi_shell does not print '\n' when displaying error message 2798414 - hpi_shell shows "No alarms in DAT" even if there is alarms 2798412 - hpi_shell does not correctly obtains sensor thresholds 2798402 - HpiBoolT is displayed in differrent ways when show inventory 2561038 - Incorrect displaying of Text Buffers OpenHPI Daemon 2782786 - alarm is not removed from DAT OpenHPI Daemon Client 2779881 - Routine get_next_good_token() will skip the "port" token Changelog for 2.14.0 (04/16/2009) Fixed Bugs Build System 2726771 - issue with SSL build (Mandriva) 2726767 - RPM build issue: watchdog, ilo2_ribcl, simulator, ipmidirect 2726740 - Mandriva build: openhpid depends on marshal lib 2717570 - -Werror produces many 'unused variable' errors 2638458 - 2.13.3 - rpm build fails HP c-Class Plugin 2723789 - Daemon crash - oa_soap plug-in tries to free null pointer 2711991 - Critical events are marked informational HPI Clients 2737084 - useless memset with wrong buffer size 2668530 - garbage trailing characters when displaying SaHpiTextBufferT HPI Shell 2737908 - hpi_shell: cannot input rdr type in rdr/showrdr command 2726719 - Incorrect working with saHpiEventGet 2726684 - Text buffers of 1 char length are not displayed 2726678 - Incorrect displaying of sensor reading of BUFFER type 2726620 - Proposal to improve displaying of timeout value in hpi_shell 2726589 - hpi_shell -n option doesn't work 2726553 - No space between two text blocks when displaying domain info 2726546 - Typo in displaying paging state 2726539 - Cannot set TIMEOUT_BLOCK in hpi_shell OpenHPI base library 2737502 - wrong usage of memcmp in oh_compare_sensor reading 2737059 - wrong buffer size used fo memcmp in oh_compare_sensorreading 2726887 - issue with marshalling of control state(saHpiControlGet) 2726800 - incorrect validation of sensor thresholds 2726734 - incorrect macro definitions in SaHpiAtca.h OpenHPI Daemon Client 2717641 - Events added by saHpiEventLogEntryAdd gets different Language Changelog for 2.13.3 (02/24/2009) New Features HP c-Class Plugin 2540102 - Supporting the graceful shutdown for OA SOAP plugin OpenHPI Daemon 2526862 - HPI-B.03.01 support Fixed Bugs HP ProLiant plugin 2526494 - saHpiResourcePowerStateSet() fails with ilo2-ribcl Plugin HP c-Class Plugin 2567977 - Memory leak in event thread for not reachable OA 2567974 - Memory leak in sensor event generation in OA SOAP plugin 2543767 - Potential race condition during startup. 2529314 - Hotswap event severity is wrong 2527902 - SEG FAULT encountered during the blade event processing 2515275 - User's Guide needs to be updated 2496073 - saHpiResourcePowerStateSet() fails with HP c-Class Plugin HPI Shell 2530818 - incorrect severity when adding announcement to annunciator IPMI Direct plugin 2390475 - saHpiIdrAreaHeaderGet(), saHpiIdrFieldGet() dont handle type OpenHPI Daemon 1804273 - Hysteresis values are not validated correctly OpenHPI base library 2564289 - gcc 4.4 - shadowed global variable 2564015 - gcc 4.4 - warning/error in safhpi.c 2518985 - SIGSEGV in tsensorget013 Test Suites 2568358 - buffer overflows in sahpi_struct_utils_test Changelog for 2.13.2 (01/16/2009) New Features HP c-Class Plugin 2056128 - Requesting support for additional temperature sensors 2259905 - Add SOAP calls, to allow additional plug-in functionality 2420921 - Supporting hardware failure events in OA SOAP plug-in HPI Shell 2141354 - Resolve compile problem on systems without strnlen() 1878034 - hpi_shell command to obtain HPI and OpenHPI version Fixed Bugs HP c-Class Plugin 2496251 - Missing"const"declaration causes compile error 2493467 - Partial info is stored in custom fan inventory field 2493343 - Thermal sensor's setting on few resources incorrect 2447057 - Wrong hotswap events raised for IO and storage blades 2431211 - Uninitialized parameters when connecting to OA 2315536 - Enum parsing issues within SOAP support routine HPI Utils 2435736 - oh_decode functions do not set the DataLength correctly IPMI Direct plugin 2414621 - ipmidirect seg faults when a short pkt is received OpenHPI Daemon 2448141 - Incorrect alarms added to DAT OpenHPI base library 2220086 - New ABI for saHpiResourceFailedRemove() SAF HPI API Python bindings 2435118 - Some decode functions are missing from the python interface Changelog for 2.13.1 (11/19/2008) New Features Documentation 2042355 - Missing man pages for most of the client applications HP c-Class Plugin 2175525 - Add underpinnings for additional management functions Fixed Bugs Build System 2191513 - openhpid initscript is not installed HPI Shell 2182034 - Incorrect displaying of SaHpiTextBufferT in hpi_shell 2171901 - HPI session is not closed after quit OpenHPI Daemon Client 2230986 - DomainId issues with the new multi-domain implementation. OpenHPI base library 2211619 - Typo in type for session 2188639 - saHpiResourceFailedRemove() fails if only FRU cap is set 2187132 - Incorrect error returned by saHpiSensorThresholdsSet() Changelog for 2.13.0 (10/10/2008) New Features Build System 2144764 - Create new development branch openhpi-2.13.0 2022257 - Bump release version to 2.13.0 in trunk HP c-Class Plugin 2091594 - HP c-class-Enhancement to add IO and Storage blade support OpenHPI base library 1945076 - Enable redundant domains with multiple daemon connections Simulator Plugin 2037638 - Add saHpiEventLogCapabilitiesGet to simulator plugin Fixed Bugs Build System 2041977 - Add entry for pdf document in Makefile.am HP c-Class Plugin 2099686 - Support chage in the OA switchover behaviour 2027062 - OpenHpi fails on call to saHpiIdrAreaHeaderGet() OpenHPI Daemon Client 2067672 - OPENHPI_DAEMON_PORT env var OpenHPI base library 2122670 - Too many timeout error messages in syslog by hpi_shell Changelog for 2.12.0 (07/25/2008) New Features Build System 2021928 - Bump openhpi version number in configure.ac before branching 1816198 - Build the watchdog plugin only if linux/watchdog.h exists Documentation 2020974 - Add documentation for new ilo2_ribcl and oa_soap plugins HP ProLiant plugin 1955880 - Make use of common SSL code HP c-Class Plugin 1976961 - saHpiIdrFieldGet() enhancement to support product version Fixed Bugs Build System 2013946 - Build fails (make rpm) if docbook utilities not present 1963765 - fix compiler warnings for ignored return values HP c-Class Plugin 2021749 - Correct plugin return values for [In]ActiveSet, PolicyCancel OpenHPI Daemon 1823713 - Memory leak noticed in the daemon OpenHPI Daemon Client 2027371 - Use OH_DEFAULT_DOMAIN_ID as default domain id 2027043 - Allow for DomainID == 0 in internal functions. 2019614 - openhpi client library crashes on wrong session id OpenHPI base library 2016272 - Segfaulted with hpitest Control/saHpiControlSet/IgnoreState Changelog for 2.11.3 (06/25/2008) New Features Simulator plugin 1977471 - Add Dimis and Fumis to Simulator plugin Fixed Bugs IPMI Direct plugin 1930512 - Invalid handling of ATCA Led Controls in Manual Mode Changelog for 2.11.2 (05/26/2008) New Features HP c-Class Plugin 1954038 - Support OA firmware version 2.20 1954014 - Compliance to SAF HPI B.02.01 spec HPI Shell 1878030 - arg for hpi_shell to point HPI server address OpenHPI base library 1945160 - Add further support routines to SSL support library Fixed Bugs Build System 1912737 - incorrect determination of basic types sizes for cross build 1963761 - sim_dimi.h and sim_fumi.h are not distributed 1952049 - Check for MD5_Init() in libcrypto not in libssl 1949449 - update LD_LIBRARY_PATH for the built-in tests 1954205 - headers for the RTAS plugin are not distributed 1954212 - cannot configure with --enable-rtas HP c-Class Plugin 1964263 - Discovery of unstabilized OA, crashes the OA SOAP plugin 1964261 - Core dumps on stdby OA removal and insertion while discovery 1951474 - Re-Discovery hangs on inserting Standby OA 1954008 - oa_soap_get_power_state should return proper error code 1951466 - Improperly provisioned Power Supply crashes OA SOAP plugin 1951470 - Re-Discovery hangs on inserting OA which was removed earlier 1932974 - Memory allocated to IDR is not released in error scenario 1933089 - Re-discovery may show old FRU inventory details for new FRU 1933099 - ManufacturerId missing in resource RPT discovered by OA SOAP 1933112 - Multiple events for a state change during OA switchover 1933124 - Sensor event not listing correct asserted events in CRITICAL 1933109 - Push the resource discovery event after complete discovery OpenHPI Daemon 1939812 - openhpid doesnt work correctly for non-existent machine OpenHPI base library 1794430 - Avoid blank alarms from entering from persisted DAT 1944549 - Build fails with --disable-thread --disable-ipmidirect 1949719 - move HAVE_OPENSSL from CFLAGS into config.h Changelog for 2.11.1 (04/22/2008) New Features Build System 1922399 - Request addition of HP BladeSystem c-Class plugin OpenHPI Daemon 1888910 - Include LSB Init Script section in daemon start-up script OpenHPI base library 1945161 - Create separate SSL support library for future modularity 1947016 - Connect to multiple daemons from one client 1944141 - Add OpenSSL library initialization to infrastructure Fixed Bugs Blade Center Plugin 1934806 - sessionid uninitialized in snmp_bc tests Build System 1939985 - AM_CFLAGS usage cleanup 1925236 - cannot run"make check"in chrooted build environment 1856208 - The --mandir configure option is ignored 1911396 - configure wrongly thinks libxml2 is installed in system HPI Shell 1919651 - missed Description field printing for FUMI Source Info 1877422 - rdr/showrdr command issue 1877421 - incorrent prompt when entering ann,ctrl,sen,wtd block HPI Utils 1923111 - rpt_diff should return error code OpenHPI Daemon 1933558 - marshal_028 test fails with gcc 4.3 1884615 - Inconsistent use of oh_get_domain() and OH_GET_DOMAIN() 1884616 - Inconsisten use of oh_get_hanlder() and OH_GET_HANDLER() 1884619 - domain lock is held during dbg() print activity 1924661 - force-reload: not a valid identifier OpenHPI Daemon Client 1937234 - oHpiHandlerCreate should only call the daemon once OpenHPI base library 1916910 - wrong source state handling in saHpiFumiTargetVerifyStart 1925544 - SaHpiNameT uses unsigned char instead of SaHpiUint8T Test Suites 1923446 - RPT Test cases 79,80,81 using bad rdr member Changelog for 2.11.0 (03/03/2008) New Features Build System 1904823 - Add gdb specific debugging symbols to --enable-debuggable HPI Clients 1807275 - Update clients to show OpenHPI and SAF HPI version numbers HPI Shell 1878098 - show single inventory area 1878043 - hpi_shell command to reopen session 1810225 - Remove hpi_cmd bash script. hpi_shell is sufficient 1810177 - Merge hpi_ui_libi into hpi_shell for simplicity IPMI Direct plugin 1840237 - Replace sprintf() by snprintf() iLO2 RIBCL plug-in 1841151 - New iLO2 RIBCL plug-in for HP ProLiant Rack Mounts OpenHPI Daemon 1904829 - Enable gentoo output in openhpid init.d script Fixed Bugs IPMI Direct plugin 1862080 - Type qualifiers ignored on function return type 1853460 - ipmidirect parenthesis warning OpenHPI base library 1804512 - Debug output occurring during normal operation 1839926 - open calls need mode macros in glibc 2.7 1804510 - Current dbg() and trace() macros have confusing names Changelog for 2.10.2 (03/03/2008) New Features Build System 1818149 - Remove -Wcast-qual and -Wwrite-strings on Solaris IPMI Direct plugin 1893197 - Fix compile problem on Debian/SPARC (tv.usec size) 1789782 - Make plugins/ipmidirect/thread.cpp more portable 1855506 - Uninitialized variable warnings on Solaris OpenHPI Daemon 1785223 - Make the marshalling code more portable Fixed Bugs Build System 1907201 - Remove docbook and popt requires from rpm spec file 1831717 - openhpid manual is not in openhpi.spec 1904849 - Some makefile definitions are not including cpp files Documentation 1853115 - Enable/Disable docs based on docbook-utils presence HPI Clients 1843714 - hpievents and hpi_shell do not print the entity path 1840685 - hpipower discriminates on entity type HPI Shell 1878076 - Only upper case should be allowed when entering hex data 1878066 - Cannot set BLOCK timeout in hpi_shell 1878002 - typo in invetory block subcommands help 1765584 - Overflow in set AutoInsert/AutoExtract Timeout HPI Utils 1907179 - oh_uid_initialize should not fail if already called 1893972 - oh_lookup_sensortype() does not support some sensor types IPMI Direct plugin 1840241 - Bogus"0"is appended to compact sensors RDR IdString 1833028 - Hot swap sensors may trigger events on the wrong resource 1833026 - IPMC detection logic does not work on MicroTCA OpenHPI Daemon 1878114 - ai_timeout cannot be set to negative value in config 1873903 - missing CauseOfStateChange in marshaling of HotSwap Event 1826377 - Change include order to prevent compile error on Solaris OpenHPI base library 1849426 - marshalling problems with saHpiDimiTestStart 1867746 - Wrong marshalling of SaHpiFumiBankInfoT 1841864 - Improve DIMI and FUMI support 1884612 - saHpiControlSet() fails to release handler in an error leg 1877606 - saHpiControlSet(): incorrect digital Control state check 1849418 - marshalling of SaHpiDimiTestParamsDefinitionT type 1827895 - cast-align compile failures on SPARC from g_array_index() 1840681 - saHpiGetChildEntityPath: array index is above array bounds 1876339 - wrong source state handling in saHpiFumiInstallStart OpenIPMI plugin 1677380 - Port parameter value is not quoted in openhpi.conf.example Changelog for 2.10.1 (11/02/2007) Fixed Bugs Build System 1820302 - openhpi.spec.in has obsolete sysfs dependency 1824897 - gcc version check does not work with gcc 4.2 1803219 - Tarball has files that are not in tree after distclean HPI Clients 1804367 - hpiel coredumps if run without openhpid running IPMI Direct plugin 1808859 - More header files are needed in ipmi_con_smi.cpp on Solaris OpenHPI Daemon 1807689 - Misaligned reads in marshal/marshal.c:DemarshalSimpleTypes() 1809894 - A cast is needed in connection.c to compile on Solaris 1802968 - Use mkinstalldirs in openhpid/Makefile.am OpenHPI base library 1799966 - saHpiGetIdByEntityPath does not return InstrumentId OpenIPMI plugin 1799550 - Cause of State Change stored in the wrong event data byte Changelog for 2.10 (09/20/2007) New Features HPI Shell 1798472 - Modifiy the hpi_shell code for Solaris HPI Utils 1799449 - Add more manufacturer definitions from IANA numbers IPMI Direct plugin 1793588 - Make plugins/ipmidirect/ipmi_con_lan.cpp more portable 1789375 - Add basic support for MicroTCA OpenHPI Daemon 1783020 - compile problem in marshal/strmsock.cpp on Solaris OpenHPI base library 1800862 - Add saHpiFumiActivate() base implementation 1800861 - Add saHpiFumiRollback() base implementation 1800860 - Add saHpiFumiUpgradeCancel() base implementation 1800859 - Add saHpiFumiTargetVerifyStart() base implementation 1800858 - Add saHpiFumiUpgradeStatusGet() base implementation 1800850 - Add saHpiFumiInstallStart() base implementation 1800849 - Add saHpiFumiBankCopyStart() base implementation 1800848 - Add saHpiFumiBankBootOrderSet() base implementation 1800847 - Add saHpiFumiBackupStart() base implementation 1800846 - Add saHpiFumiTargetInfoGet() base implementation 1800845 - Add saHpiFumiSourceInfoGet() base implementation 1800844 - Add saHpiFumiSourceInfoValidateStart() base implementation 1800842 - Add saHpiFumiSourceSet() base implementation 1800841 - Add saHpiDimiTestResultsGet() base implementation 1800840 - Add saHpiDimiTestStatusGet() base implementation 1800839 - Add saHpiDimiTestCancel() base implementation 1800838 - Add saHpiDimiTestStart() base implementation 1800835 - Add saHpiDimiTestReadinessGet() base implementation 1782284 - Add saHpiDimiTestInfoGet() base implementation Fixed Bugs Documentation 1723186 - Problem building docs with newer docbook packages HPI Shell 1775387 - SAHPI_SENSOR_READING_TYPE_BUFFER displayed as string 1765599 - control/sensor number is not RDR NUM IPMI Direct plugin 1796990 - Communication lost (M7) state is not properly handled OpenHPI Daemon 1789834 - OpenHPI daemon seg fault when a plugin get_event is null OpenHPI base library 1794862 - Check for ResourceFailed is missing in some API calls 1791669 - FRU resources cannot be signaled as failed Sysfs plugin 1788986 - Sysfs plugin does not compile with libsysfs 2.0 Watchdog plugin 1792701 - watchdog open and close return without free Changelog for 2.9.3 (08/27/2007) New Features HPI Utils 1765556 - request to add PICMG into the list of known manufacturers OpenHPI base library 1782277 - Add saHpiDimiInfoGet() base implementation 1742902 - Return Code changes from HPI B2 - Phase 2 1782276 - Create macro for calling plugin abi Simulator Plugin 1780759 - Add fan analog control to simulator Fixed Bugs Build System 1768864 - Compile errors on cpp wrappers Documentation 1765550 - out-of-date MultipleDomains and DomainTag settings HPI Clients 1780746 - Reinstate hpifan HPI Shell 1777643 - Entity may be missed when Event Log Entry is displayed 1765547 - settag command always set empty resource tag OpenHPI Daemon 1777675 - alignment error in the MarshalSimpleTypes() function 1756621 - Bind new B2 APIs to the daemon - Phase 1 OpenHPI base library 1715462 - sensorEventMasksSet does not properly check INVALID_DATA 1699146 - Thresholds order is not always verified OpenIPMI plugin 1768890 - OEM LED color code problems 1768881 - OEM LED control length wrong Changelog for 2.9.2 (06/25/2007) New Features Blade Center Plugin 1720882 - Enable snmp_bc to use alternate host HPI Utils 1737345 - Change utils function name get_rdr_uid to have proper prefix OpenHPI base library 1714703 - Enable default domain configuration 1740725 - Add saHpiIdrAreaAddById API from HPI B.02.01 1740726 - Add saHpiIdrFieldAddById API from HPI B.02.01 1740089 - Add saHpiEventLogCapabilitiesGet() API from HPI B.02.01 1740013 - Add saHpiResourceFailedRemove API from HPI B.02.01 1737375 - Add saHpiGetChildEntityPath API from HPI B.02.01 1737353 - Add saHpiGetIdByEntityPath API from HPI B.02.01 1737351 - Add saHpiResourceLoadIdGet/Set API from HPI B.02.01 1712088 - Upgrade SaHpi.h header file to B2 level Fixed Bugs Blade Center Plugin 1719431 - Enhance snmp_bc timeout on AMM Resource discovery Changelog for 2.9.1 (05/04/2007) New Features OpenHPI Daemon 1546774 - Adapt daemon readme into manpage for openhpid Blade Center Plugin 1715383 - Add resource firmware inventory data as Product Info OpenHPI base library 1714702 - Return Code changes from HPI B2 - Phase 1 Fixed Bugs Documentation 1684816 - Add distribution text to copyright of SaHpi files OpenHPI base library 1684814 - Discovery being called on a failed plugin 1713582 - Remove alarms on sensor enable change events Blade Center Plugin 1715743 - gcc warning: mixed declarations/code in snmp_bc_inventory 1710895 - Handle zero length, and un-initialized snmp object Changelog for 2.8.1 (02/26/2007) Fixed Bugs Blade Center Plugin 1664628 - Adjust for new Daylight Saving Time (DST) 1650719 - Hotswap state for Managed Hotswap Resource 1649993 - Correct handling of SlotStateSensor for Hotswap-Removal 1649101 - Fix mem leaks in snmp_bc plugin 1648035 - Use SA_ERR_HPI_OUT_OF_MEMORY Build System 1655375 - spec file has problems on older rpm versions and 64bit archs HPI Clients 1654229 - Enhance IBMblade specific client HPI Utils 1649789 - entity path memory leak OpenHPI base library 1649796 - daemon shuts down if no plugins loaded OpenIPMI plugin 1649797 - array subscript is above array bounds Changelog for 2.8.0 (01/26/2007) New Features Build System 1583198 - Break plugins into separate rpms with right prereqs Fixed Bugs Blade Center Plugin 1593676 - Limit the range of blade center EventLog time 1628056 - Set initial state of MM Redundancy sensor properly 1631640 - Initialize variables to remove compiler warning 1642688 - Use sinfo->cur_state for SLOT_SENSOR state 1644001 - Properly initialize eventstate of SENSOR_NUM_MGMNT_STANDBY Build System 1636141 - build warning on opensuse 10.x 1636159 - Test for the existence of lsvpd for rtas plugin Documentation 1636104 - openhpid readme should be merged into README.daemon 1643672 - Documentation building error: docbook dtd problem with sgml HPI Clients 1638923 - Use oHpiHandlerFind() and oHpiHandlerInfo() utilities 1644008 - Add option to also display Sensor Event State IPMI Direct plugin 1643407 - Plugin crashes at startup with latest infra event changes 1643858 - IPMIDirect compile error: extra qualification OpenHPI Daemon Client 1643804 - Segfault when using oHpi functions and no daemon is running OpenHPI base library 1637958 - oHpiHandlerInfo() in daemon does not work correctly. 1643669 - uninitialized variable warning in event.c 1643757 - HandlerRetry and HandlerFind do not check for initialization 1645731 - saHpiEventAdd adds to DEL even though it is disabled 1645733 - Don\'t timestamp events unless they have unspecified time 1645736 - ALL_SEVERITIES should not be allowed in EventLogEntryAdd() 1645774 - Domain and User events are not being processed Sysfs plugin 1643661 - sysfs plugin possible overflow on property read openhpi-3.6.1/openhpi.conf.example0000644000175100017510000002562312575647263016147 0ustar mohanmohan### OpenHPI configuration example file ### ####### ## OpenHPI will not be useful unless it is configured for your system. Once ## you have modified this file, remove or comment the following line to allow ## the OpenHPI daemon to run. This line causes the daemon to exit immediately. OPENHPI_UNCONFIGURED = "YES" ####### ## FIRST section: declaration of global parameters like the following. #OPENHPI_LOG_ON_SEV = "MINOR" #OPENHPI_EVT_QUEUE_LIMIT = 10000 #OPENHPI_DEL_SIZE_LIMIT = 10000 #OPENHPI_DEL_SAVE = "NO" #OPENHPI_DAT_SIZE_LIMIT = 0 #OPENHPI_DAT_USER_LIMIT = 0 #OPENHPI_DAT_SAVE = "NO" #OPENHPI_PATH = "/usr/local/lib/openhpi:/usr/lib/openhpi" #OPENHPI_VARPATH = "/usr/local/var/lib/openhpi" ## Auto insertion timeout ## Use "BLOCK" or "IMMEDIATE" or positive integer value ## Negative integer value shall be quoted due to Glib scanner limitation ## For example "-1". ## All negative values will be interpreted as "BLOCK" #OPENHPI_AUTOINSERT_TIMEOUT = 0 #OPENHPI_AUTOINSERT_TIMEOUT_READONLY = "YES" ## The default values for each have been selected in the example above (except ## for OPENHPI_PATH and OPENHPI_CONF. See below). ## No need to specify any one of them because the defaults is used ## automatically. The library also looks for these as environment variables. ## Environment variables found that match a global parameter override the ## corresponding parameter set in this configuration file. ## ## OPENHPI_LOG_SEV sets the lowest severity level an event must meet to be ## logged in the domain event log. Possible values are (highest to lowest): ## "CRITICAL", "MAJOR", "MINOR", "INFORMATIONAL", "OK", and "DEBUG". ## OPENHPI_EVT_QUEUE_LIMIT sets the maximum number of events that are allowed ## in the session's event queue. Default is 10000 events. Setting it to 0 means ## unlimited. ## OPENHPI_DEL_SIZE_LIMIT sets the maximum size (in number of event log entries) ## for the domain event log. Default is 10000 log entries. Setting it to 0 ## means unlimited. ## OPENHPI_DEL_SAVE sets whether the domain event log is persisted to disk or ## not. The event log is written to OPENHPI_VARPATH value. ## OPENHPI_DAT_SIZE_LIMIT sets the maximum size (in number of alarm entries) for ## the alarm table. The default 0 means unlimited. ## OPENHPI_DAT_USER_LIMIT sets the maximum number of user type alarm entries ## allowed in the alarm table. The default 0 means unlimited. ## OPENHPI_DAT_SAVE sets whether the domain alarm table is persisted to disk or ## not. The alarm table is written to the directory where OPENHPI_VARPATH ## points to. ## OPENHPI_PATH is a colon (:) delimited list of directories specifying ## the location of openhpi plugin libraries. The default is defined when the ## library is configured. ## OPENHPI_VARPATH is a directory to which certain openhpi data is saved to. ## The DEL (Domain Event Log), DAT (Domain Alarm Table), and UID (Unique IDs ## used for resources) mappings are saved to this directory. The default is set ## at compile time through the ./configure options. ####### ####### ## SECOND section: handler (instance) declaration with arguments understood by the plugin. ############################################################################# ##**CAUTION** System administrators have to make sure that entity paths are ## unique in a domain. To avoid entity paths conflicting among handlers, make ## sure the "entity_root" is unique for each handler definition, unless the ## plugin documentation says otherwise. ############################################################################# ## Strings are enclosed by "", numbers are not. ## Section for the simulator plugin ## You can load multiple copies of the simulator plugin but each ## copy must have a unique name. handler libsimulator { entity_root = "{SYSTEM_CHASSIS,1}" name = "simulator" } ## Section for ipmi plugin using SMI -- local interface #handler libipmi { # entity_root = "{SYSTEM_CHASSIS,2}" # name = "smi" # addr = 0 #} ## Section for ipmi plugin based on OpenIPMI: #handler libipmi { # entity_root = "{SYSTEM_CHASSIS,3}" # name = "lan" # addr = "x.x.x.x" #ipaddress # port = "999" # auth_type = "straight" # auth_level= "user" # username = "joe" # password = "blow" #} ## Section for BladeCenter snmp_bc plugin: #handler libsnmp_bc { # entity_root = "{SYSTEM_CHASSIS,4}" # Required. BladeCenter chassis Entity Path. # host = "192.168.70.125" # Required. BladeCenter Management Module (MM) IP address. # host_alternate = "192.168.70.127" # Optional. BladeCenter Management Module 2nd IP address. # Some BladeCenter MM Firmware allows the 2 MMs, # active and standby, to have 2 different IP address. # If the targetted BladeCenter 2 MMs are configured # with 2 IPs, use this key for the 2nd IP. # version = "1" # Required. SNMP protocol version (1|3). # community = "public" # SNMP V1: Required. SNMP V1 community name. # security_name = "snmpv3_user" # SNMP V3: Required. SNMP V3 user Login ID. # context_name = "" # SNMP V3: Optional. Must match MM's "Context name" field, if defined. # security_level = "noAuthNoPriv" # SNMP V3: Required. Security level (noAuthNoPriv|authNoPriv|authPriv). # passphrase = "" # SNMP V3: Authentication password. Required if security_level # # is authNoPriv or authPriv. # auth_type = "" # SNMP V3: Authentication password encoding (MD5|SHA). Required if # # security_level is authNoPriv or authPriv. # privacy_passwd = "" # SNMP V3: Privacy password. Required if security_level is authPriv. # privacy_protocol = "" # SNMP V3: Privacy password encoding (DES). # # Required if security_level is authPriv. # # If security_level is authPriv, DES encoding is assumed since there # # currently is no other privacy password encoding choice. # count_per_getbulk = "32" # SNMP V3: Optional. SNMP_MSG_GETBULK commands can be used to increase # # performance. This variable sets the maximum OIDs allowable per # # MSG_GETBULK command. # # Positive values less than 16 default to "16", since values less than # # 16 don't necessarily increase performance. Too high of a value (> 40) # # can cause SNMP commands to BladeCenter to timeout. The default is "32". # # A value of "0" disables the use of the SNMP_MSG_GETBULK SNMP command. #} ## Section for static simulator plugin: ## If openhpi configured with ## configure --enable-simulator=static ## the dummy plugin is compiled in. ## It is possible to use simulator and libsimulator ## at the same time. #handler libsimulator { # entity_root = "{SYSTEM_CHASSIS,5}" # name = "test" #} ## Section for ipmidirect plugin using SMI -- local interface #handler libipmidirect { # entity_root = "{SYSTEM_CHASSIS,6}" # name = "smi" # addr = 0 #} ## Section for ipmidirect plugin using RMCP: #handler libipmidirect { # entity_root = "{SYSTEM_CHASSIS,7}" # name = "lan" # RMCP # addr = "localhost" # Host name or IP address # port = "623" # RMCP port # auth_type = "none" # none, md2, md5 or straight # auth_level = "admin" # operator or admin # username = "arthur" # password = "pieman" # IpmiConnectionTimeout = "5000" # AtcaConnectionTimeout = "1000" # MaxOutstanding = "1" # Allow parallel processing of # # ipmi commands; change with care # logflags = "" # logging off # # logflags = "file stdout" # # infos goes to logfile and stdout # # the logfile are log00.log, log01.log ... # logfile = "log" # # if #logfile_max reached replace the oldest one # logfile_max = "10" #} ## Section for ilo2_ribcl plugin for ProLiant Rack Mount servers #handler libilo2_ribcl { # entity_root = "{RACK_MOUNTED_SERVER,8}" # ilo2_ribcl_hostname = "IP address" # iLO2 IP address # ilo2_ribcl_portstr = "443" # iLO2 RIBCL SSL server port number # ilo2_ribcl_username = "username" # iLO2 username # ilo2_ribcl_password = "password" # iLO2 password #} ## Section for oa_soap plugin for HP BladeSystem c-Class, ## using SOAP XML over https #handler liboa_soap { # entity_root = "{SYSTEM_CHASSIS,8}" # OA_User_Name = "user" # OA user name with admin privileges (required) # OA_Password = "passwd" # OA password for above user (required) # ACTIVE_OA = "hostname" # Active OA hostname or IP address (required) # STANDBY_OA = "hostname" # Standby OA hostname or IP address (optional) #} ## Section for sysfs plugin #handler libsysfs2hpi { # # Mandatory. # entity_root = "{SYSTEM_CHASSIS,9}" #} ## Section for Run-Time Abstraction Services (RTAS) plugin: #handler librtas { # # Mandatory. # entity_root = "{SYSTEM_CHASSIS,50}" #} ## Section for watchdog plugin for Linux watchdog device interface: #handler libwatchdog { # # Mandatory. # entity_root = "{SYSTEM_CHASSIS,51}" # # Watchdog device path. Mandatory. # addr = "/dev/watchdog" #} ## Section for dynamic_simulator plugin #handler libdyn_simulator { # entity_root = "{SYSTEM_CHASSIS,9}" ## Location of the simulation data file ## Normally an example file is installed in the same directory as openhpi.conf. ## Please change the following entry if you have configured another install ## directory or will use your own simulation.data. # file = "/etc/openhpi/simulation.data" # # infos goes to logfile and stdout # # the logfile are log00.log, log01.log ... ## logflags = "file stdout" ## logfile = "dynsim" # # if #logfile_max reached replace the oldest one ## logfile_max = "5" #} ## Section for slave plugin #handler libslave { # # Optional. # # Entity path that will be added to slave daemon resources' entity paths. # # Default value is empty. # entity_root = "{RACK,1}" # # Mandatory. Address of slave OpenHPI daemon. # host = "192.168.1.42" # # Optional. Port of slave OpenHPI daemon. # # Default value is 4743 # #port = "4743" #} ## Section for slave plugin #handler libtest_agent { # # Mandatory. TCP port for console. # port = "41415" #} openhpi-3.6.1/configure.ac0000644000175100017510000005713612575650125014465 0ustar mohanmohandnl dnl autoconf and automake for openhpi dnl initial file by Andrea Brugger 1/03 dnl various hacks by Sean Dague 4/23/03 AC_PREREQ(2.57) AC_INIT(openhpi, 3.6.1) AC_CONFIG_SRCDIR(openhpi.spec.in) AM_INIT_AUTOMAKE([1.8]) AM_CONFIG_HEADER(config.h) AH_TOP([#ifndef __OPENHPI_CONFIG_H #define __OPENHPI_CONFIG_H]) AH_BOTTOM([#endif /* __OPENHPI_CONFIG_H */]) # # (major version) = (first number) - (third number) # (minor version) = (third number) # (patch version) = (second number) # example HPI_LIB_VERSION=13:4:11 # major version: 2 = 13 - 11 # minor version: 11 = 11 # patch version: 4 = 4 # HPI_LIB_VERSION=9:1:6 HPI_PKG=$PACKAGE_NAME HPI_UTIL_PKG=${PACKAGE_NAME}utils HPI_CLIENT_PKG=${PACKAGE_NAME}client AC_SUBST(HPI_CLIENT_PKG) AC_SUBST(HPI_UTIL_PKG) AC_SUBST(HPI_PKG) AC_SUBST(HPI_LIB_VERSION) AC_SUBST(ac_configure_args) dnl Checks for programs AC_PROG_CC AM_PROG_AS AC_LIBTOOL_DLOPEN AC_PROG_LIBTOOL AC_PROG_LN_S AC_PROG_CXX AC_PROG_CPP AC_PROG_INSTALL AC_PROG_LN_S AC_PROG_MAKE_SET enabled_non32bit="no" AC_ARG_ENABLE([non32bit-int], [ --enable-non32bit-int Allow compile on non 32bit int architectures [[default=no]]], [if test "x$enableval" = "xyes"; then enabled_non32bit="yes" fi]) dnl die on int != 32bits. This is too instrumental to our code right now. dnl AC_MSG_CHECKING(int is 4 bytes) OH_SET_SIZES if test "x$OH_SIZEOF_INT" != "x4"; then if test "x$enabled_non32bit" = "xyes"; then AC_MSG_WARN([ *** Size of int is not 4 bytes, it is $OH_SIZEOF_INT bytes on this platform. *** The --enable_non32bit_int arg has been used to force compilation regardless. *** Execution on this platform is not supported and could produce undefined *** behavior. ]) else AC_MSG_ERROR([ *** Size of int is not 4 bytes, it is $OH_SIZEOF_INT bytes on this platform. *** Execution on this platform is not supported and could produce undefined *** behavior. *** Please contact the openhpi development team to fix this ]) fi fi AM_CONDITIONAL(CROSS_COMPILATION, test x$cross_compiling = xyes) dnl Check for libraries have_uuid=no have_openipmi=no have_fam=no have_sysfs=no have_rtas_lib=no dnl Check for GLIB AC_CHECK_PROG([found_pkg_config],[pkg-config],[yes]) if test "x$found_pkg_config" != "xyes"; then OH_CHECK_FAIL(pkg-config,pkg-config) fi PKG_CFG_SETPATH # check for gcc version AC_MSG_CHECKING(gcc >= 3.2) OH_CHECK_GCC(3,2) dnl glib 2.x checks GLIB_REQUIRED_VERSION=2.12 GLIB=glib-2.0 GTHREAD=gthread-2.0 GMODULE=gmodule-2.0 if pkg-config --atleast-version $GLIB_REQUIRED_VERSION $GLIB; then : else AC_MSG_ERROR([ *** GLIB >= $GLIB_REQUIRED_VERSION is required. The latest version of *** GLIB is always available from ftp://ftp.gtk.org/.]) fi exact_version=`pkg-config --modversion $GLIB`; GLIB_CFLAGS=`pkg-config --cflags $GLIB $GTHREAD` GLIB_LIBS=`pkg-config --libs $GLIB $GTHREAD` GLIB_ONLY_CFLAGS=`pkg-config --cflags $GLIB` GLIB_ONLY_LIBS=`pkg-config --libs $GLIB` GMODULE_ONLY_CFLAGS=`pkg-config --cflags $GMODULE` GMODULE_ONLY_LIBS=`pkg-config --libs $GMODULE` # On some versions of Solaris the pkg-config file for gthread-2.0 contains a # compiler option, '-mt', that is incompatible with gcc case $host_os in solaris2.10) GLIB_CFLAGS=`echo $GLIB_CFLAGS | sed -e 's/-mt/-D_REENTRANT/g'` GLIB_LIBS=`echo $GLIB_LIBS | sed -e 's/-mt//g'` ;; esac AC_MSG_CHECKING(for GLIB - version >= $GLIB_REQUIRED_VERSION) AC_MSG_RESULT(yes (version $exact_version)) dnl if the glib is installed on a non standard place dnl like /opt/gnome/lib AC_CHECK_LIB will find the library. old_cflags=$CFLAGS old_libs=$LIBS CFLAGS="$CFLAGS $GLIB_CFLAGS" LIBS="$LIBS $GLIB_LIBS" AC_CHECK_LIB([$GLIB], [g_slist_alloc], [], [ OH_CHECK_FAIL(glib,glib-devel) ]) CFLAGS=$old_cflags LIBS=$old_libs AC_SUBST(GLIB_ONLY_CFLAGS) AC_SUBST(GLIB_ONLY_LIBS) AC_SUBST(GMODULE_ONLY_CFLAGS) AC_SUBST(GMODULE_ONLY_LIBS) AC_CHECK_LIB([sysfs], [sysfs_get_mnt_path], [have_sysfs=yes]) AC_CHECK_HEADER([sysfs/libsysfs.h], [], [have_sysfs=no]) AC_ARG_WITH(net-snmp-config, [[ --with-net-snmp-config=SCRIPT run SCRIPT as net-snmp-config]], [net_snmp_config=$withval]) OH_CHECK_NETSNMP AC_CHECK_LIB([uuid], [uuid_generate], [have_uuid=yes]) dnl gcrypt is used for encrypting the conf file AC_CHECK_LIB([gcrypt],[gcry_control],[have_gcrypt_lib=yes],[have_gcrypt_lib=no]) AC_CHECK_HEADERS([gcrypt.h],[have_gcrypt=yes],[have_gcrypt=no]) dnl ssl is used for md2/md5 authentification in ipmidirect dnl and for SSL-based communication in ilo2_ribcl and oa_soap AC_CHECK_LIB([crypto],[MD5_Init],[CRYPTO_LIB=-lcrypto],[CRYPTO_LIB=]) AC_SUBST(CRYPTO_LIB) AC_CHECK_LIB([ssl],[SSL_library_init],[SSL_LIB=-lssl],[SSL_LIB=]) AC_SUBST(SSL_LIB) AC_CHECK_HEADERS([openssl/md2.h openssl/md5.h openssl/bio.h openssl/ssl.h openssl/err.h],[have_openssl=yes],[have_openssl=no]) dnl xml is used for XML-based communication in ilo2_ribcl and oa_soap AC_CHECK_LIB([xml2],[xmlParseMemory],[XML2_LIB=-lxml2],[XML2_LIB=]) AC_CHECK_HEADERS([libxml2/libxml/xmlexports.h],[XML2_INCLUDE="-I/usr/include/libxml2"],[XML2_INCLUDE]) AC_SUBST(XML2_LIB) AC_SUBST(XML2_INCLUDE) dnl Build daemon statically or dynamically. openhpid_static="no" ENABLED_DIRS="$ENABLED_DIRS openhpid" AC_ARG_ENABLE([daemon], [ --enable-dynamic-daemon build HPI daemon and client library non-statically[[default=yes]]], [if test "x$enableval" = "xno"; then openhpid_static="yes" fi], [openhpid_static="no"]) AM_CONDITIONAL(OPENHPID_STATIC, test x$openhpid_static = xyes) AC_ARG_ENABLE([clients], [ --enable-clients build HPI client programs [[default=yes]]], [if test "x$enableval" = "xyes"; then ENABLED_DIRS="$ENABLED_DIRS clients" fi], [ENABLED_DIRS="$ENABLED_DIRS clients"]) AC_ARG_ENABLE([cpp_wrappers], [ --enable-cpp_wrappers build SaHpi C++ wrapper objects [[default=no]]], [if test "x$enableval" = "xyes"; then ENABLED_DIRS="$ENABLED_DIRS cpp" fi]) AC_SUBST(ENABLED_DIRS) dnl Old autotools do not define docdir AC_SUBST([docdir]) if test x$docdir = x; then AC_SUBST([docdir], ${datadir}/doc/${PACKAGE_NAME}) fi dnl Checks for header files. AC_HEADER_STDC AC_CHECK_HEADERS([fcntl.h stdlib.h string.h sys/time.h unistd.h stdarg.h netinet/in.h]) dnl Checks for library functions. AC_FUNC_ERROR_AT_LINE AC_FUNC_VPRINTF AC_CHECK_FUNCS([gettimeofday memset strdup]) dnl Checks for other helper programs AC_PATH_PROGS(RPM, rpmbuild) dnl plugin enablement stanzas AC_CHECK_HEADER([linux/watchdog.h], [have_linux_watchdog_h=yes], [], [#include ]) AC_ARG_ENABLE([watchdog], [ --enable-watchdog build watchdog plugin [[default=yes if linux/watchdog.h exists]]], [if test "x$enableval" = "xyes"; then if test "x$have_linux_watchdog_h" = "xyes"; then AC_SUBST(WATCHDOG,watchdog) else AC_MSG_ERROR("Can not build the watchdog plugin without linux/watchdog.h.") fi else AC_SUBST(WATCHDOG,"") fi], [if test "x$have_linux_watchdog_h" = "xyes"; then AC_SUBST(WATCHDOG,watchdog) else AC_SUBST(WATCHDOG,"") fi]) dnl dnl We really need to make ipmi enablement be contigent on OpenIPMI dnl if PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig pkg-config --atleast-version 1.4.20 OpenIPMI; then have_openipmi=yes AC_CHECK_LIB([OpenIPMI], [ipmi_smi_setup_con], [have_openipmi=yes]) OPENIPMI_CFLAGS=`PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig pkg-config --cflags OpenIPMI` AC_SUBST(OPENIPMI_CFLAGS) OPENIPMI_LIBS=`PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig pkg-config --libs OpenIPMI` AC_SUBST(OPENIPMI_LIBS) fi AC_ARG_ENABLE([ipmi], [ --enable-ipmi build openipmi plugin [[deprecated, default=no]]], [if test "x$enableval" = "xyes"; then if test "x$have_openipmi" = "xyes"; then AC_SUBST(IPMI,ipmi) AC_SUBST(WITH_IPMI,1) AC_MSG_WARN([ *** The ipmi plugin is deprecated. Please consider to replace it *** by using the ipmidirect plugin ]) else OH_CHECK_FAIL(OpenIPMI,libOpenIPMI-devel,http://openipmi.sf.net, Can not build IPMI support without OpenIPMI >= 1.4.20) fi else AC_SUBST(WITH_IPMI,0) fi], [AC_SUBST(WITH_IPMI,0)]) AC_ARG_ENABLE([sysfs], [ --enable-sysfs build sysfs plugin [[default=yes if libsysfs exists]]], [if test "x$enableval" = "xyes"; then if test "x$have_sysfs" = "xyes"; then AC_SUBST(SYSFS,sysfs) AC_SUBST(WITH_SYSFS,1) else OH_CHECK_FAIL(libsysfs,,http://linux-diag.sf.net, Can not build sysfs support without libsysfs) fi else AC_SUBST(WITH_SYSFS,0) fi], [if test "x$have_sysfs" = "xyes"; then AC_SUBST(SYSFS,sysfs) AC_SUBST(WITH_SYSFS,1) else AC_SUBST(WITH_SYSFS,0) fi ]) AC_ARG_ENABLE([snmp_bc], [ --enable-snmp_bc build IBM Blade Center plugin [[default=yes if net-snmp and libuuid are installed]]], [if test "x$enableval" = "xyes"; then if test "x$have_netsnmp" != "xyes"; then AC_SUBST(WITH_SNMP_BC,0) OH_CHECK_FAIL(net-snmp,net-snmp-devel,http://net-snmp.sourceforge.net/, Can not build IBM Blade Center support without net-snmp) elif test "x$have_uuid" != "xyes"; then AC_SUBST(WITH_SNMP_BC,0) OH_CHECK_FAIL(libuuid,libuuid-devel or e2fsprogs-devel) else SNMPDIR=snmp AC_SUBST(SNMP_BC,snmp_bc) AC_SUBST(WITH_SNMP_BC,1) fi else AC_SUBST(WITH_SNMP_BC,0) fi], [if test "x$have_netsnmp" != "xyes"; then AC_SUBST(WITH_SNMP_BC,0) AC_MSG_NOTICE(snmp_bc plugin is disabled since net-snmp was not found) elif test "x$have_uuid" != "xyes"; then AC_SUBST(WITH_SNMP_BC,0) AC_MSG_NOTICE(snmp_bc plugin is disabled since libuuid was not found) else SNMPDIR=snmp AC_SUBST(SNMP_BC,snmp_bc) AC_SUBST(WITH_SNMP_BC,1) fi] ) AC_ARG_ENABLE([ipmidirect], [ --enable-ipmidirect build direct ipmi plugin [[default=yes]]], [if test "x$enableval" = "xyes"; then AC_SUBST(IPMIDIRECT,ipmidirect) fi], [AC_SUBST(IPMIDIRECT,ipmidirect)]) dnl [AC_SUBST(IPMIDIRECT,ipmidirect)]) OH_CHECK_RTAS #Configure options for the RTAS plugin AC_ARG_ENABLE([rtas], [ --enable-rtas build rtas ppc plugin [[default=no]]], [if test "x$enableval" = "xyes"; then if test "x$have_rtas_lib" = "xyes"; then AC_SUBST(RTAS,rtas) AC_SUBST(WITH_RTAS,1) else OH_CHECK_FAIL(librtas, librtas-devel, http://librtas.ozlabs.org/, Cannot build RTAS plugin without the librtas library) fi else AC_SUBST(WITH_RTAS,0) fi], [AC_SUBST(WITH_RTAS,0)]) # configure argument for the simulator plugin AC_ARG_ENABLE([simulator], [ --enable-simulator build simulator plugin [[default=yes]]], [if test "x$enableval" = "xyes"; then AC_SUBST(SIMULATOR,simulator) fi], [AC_SUBST(SIMULATOR,simulator)]) # configure argument for the dynamic simulator plugin AC_ARG_ENABLE([dynamic_simulator], [ --enable-dynamic_simulator build dynamic simulator plugin [[default=yes]]], [if test "x$enableval" = "xyes"; then AC_SUBST(DYNAMIC_SIMULATOR,dynamic_simulator) fi], [AC_SUBST(DYNAMIC_SIMULATOR,dynamic_simulator)]) # configure argument for the ilo2_ribcl plugin AC_ARG_ENABLE([ilo2_ribcl], [ --enable-ilo2_ribcl build ilo2_ribcl plugin [[default=no]]], [if test "x$enableval" = "xyes"; then if test "x$have_openssl" = "xyes"; then if test -n "$XML2_INCLUDE"; then AC_SUBST(ILO2_RIBCL,ilo2_ribcl) AC_SUBST(WITH_ILO2_RIBCL,1) else OH_CHECK_FAIL(xml2-devel,,,Can not build ilo2_ribcl without xml2 headers) fi else OH_CHECK_FAIL(openssl-devel,,,Can not build ilo2_ribcl without openssl headers) fi else AC_SUBST(WITH_ILO2_RIBCL,0) fi], [if test "x$have_openssl" = "xyes" && test -n "$XML2_INCLUDE"; then AC_SUBST(ILO2_RIBCL,ilo2_ribcl) AC_SUBST(WITH_ILO2_RIBCL,1) else AC_SUBST(WITH_ILO2_RIBCL,0) fi ]) # configure argument for the oa_soap plugin AC_ARG_ENABLE([oa_soap], [ --enable-oa_soap build oa_soap plugin [[default=no]]], [if test "x$enableval" = "xyes"; then if test "x$have_openssl" = "xyes"; then if test -n "$XML2_INCLUDE"; then AC_SUBST(OA_SOAP,oa_soap) AC_SUBST(WITH_OA_SOAP,1) else OH_CHECK_FAIL(xml2-devel,,,Can not build oa_soap without xml2 headers) fi else OH_CHECK_FAIL(openssl-devel,,,Can not build oa_soap without openssl headers) fi else AC_SUBST(WITH_OA_SOAP,0) fi], [if test "x$have_openssl" = "xyes" && test -n "$XML2_INCLUDE"; then AC_SUBST(OA_SOAP,oa_soap) AC_SUBST(WITH_OA_SOAP,1) else AC_SUBST(WITH_OA_SOAP,0) fi ]) # configure argument for enabling file encryption AC_ARG_ENABLE([encryption], [ --enable-encryption Enable File Encryption [[default=yes if libgcrypt and gcrypt.h exist]]], [if test "x$enableval" = "xyes"; then if test "x$have_gcrypt" = "xyes"; then if test "x$have_gcrypt_lib" = "xyes"; then AC_SUBST(HPICRYPT,hpicrypt) AC_SUBST(HPICRYPT_MAN,hpicrypt.1) CRYPT_FLAG="-DHAVE_ENCRYPT" AC_SUBST(CRYPT_FLAG) GCRYPT_LIB="-lgcrypt" AC_SUBST(GCRYPT_LIB) else OH_CHECK_FAIL(libgcrypt,libgcrypt,, Can not enable encryption without gcrypt library) fi else OH_CHECK_FAIL(libgcrypt-devel,libgcrypt-devel,, Can not enable encryption without gcrypt headers) fi fi], [if test "x$have_gcrypt" = "xyes"; then if test "x$have_gcrypt_lib" = "xyes"; then AC_SUBST(HPICRYPT,hpicrypt) AC_SUBST(HPICRYPT_MAN,hpicrypt.1) CRYPT_FLAG="-DHAVE_ENCRYPT" AC_SUBST(CRYPT_FLAG) GCRYPT_LIB="-lgcrypt" AC_SUBST(GCRYPT_LIB) fi fi ]) # configure argument for the slave plugin AC_ARG_ENABLE([slave], [ --enable-slave build slave plugin [[default=yes]]], [if test "x$enableval" = "xyes"; then AC_SUBST(SLAVE,slave) fi], [AC_SUBST(SLAVE,slave)]) # configure argument for the test_agent plugin AC_ARG_ENABLE([test_agent], [ --enable-test_agent build test_agent plugin [[default=yes]]], [if test "x$enableval" = "xyes"; then AC_SUBST(TEST_AGENT,test_agent) fi], [AC_SUBST(TEST_AGENT,test_agent)]) dnl setup SNMPFLAGS AC_SUBST(SNMPFLAGS) AC_SUBST(SNMPLIBS) AC_SUBST(SNMPDIR) AC_SUBST(SSLDIR) dnl dnl This code was borrowed from linux-ha configure.in file dnl and is used for creating the proper substitutions dnl in the spec file. Without it, the spec file will dnl have ${exec_prefix}, etc. instead of the actual dnl directory. dnl dnl prefix=`eval echo "$prefix"` case $prefix in NONE) prefix=/usr/local;; esac var() { case $1 in *'${'*) res=`eval echo "$1"`;; *) res="$1";; esac case "$res" in ""|NONE) echo "$2";; *) echo "$res";; esac } exec_prefix=`var "$exec_prefix" "$prefix"` bindir=`var "$bindir" "$exec_prefix/bin"` sbindir=`var "$sbindir" "$exec_prefix/sbin"` sysconfdir=`var "$sysconfdir" "$prefix/etc"` libdir=`var "$libdir" "$exec_prefix/lib"` includedir=`var "$includedir" "$exec_prefix/include"` localstatedir=`var "$localstatedir" "/var"` base_includedir="${includedir}" AC_SUBST(base_includedir) dnl dnl defines CONFPATH, OH_DEFAULT_CONF and OH_CLIENT_DEFAULT_CONF dnl #CONFPATH=${CONFPATH:=/etc/${PACKAGE_NAME}} #AC_ARG_WITH(confpath, # [[ --with-confpath=PATH use directory PATH to store openhpi configuration file [default=/etc/openhpi]]], # [CONFPATH=$withval]) dnl substitute @CONFPATH@ in all Makefiles CONFPATH=${sysconfdir}/openhpi AC_SUBST(CONFPATH) dnl create the #define in config.h AC_DEFINE_UNQUOTED(CONFPATH, "$CONFPATH", [openhpi specific config path]) AC_DEFINE_UNQUOTED(OH_DEFAULT_CONF,"$CONFPATH/${PACKAGE_NAME}.conf", [default configfile]) AC_DEFINE_UNQUOTED(OH_CLIENT_DEFAULT_CONF,"$CONFPATH/${HPI_CLIENT_PKG}.conf", [default client configfile]) dnl defines OH_DEFAULT_UID_MAP and VARPATH dnl set VARPATH only if unset or null. VARPATH=${VARPATH:=${localstatedir}/lib/${PACKAGE_NAME}} AC_ARG_WITH(varpath, [[ --with-varpath=PATH use directory PATH to store openhpi specific data [default=$prefix/var/lib/openhpi]]], [VARPATH=$withval]) dnl substitute @VARPATH@ in all Makefiles AC_SUBST(VARPATH) dnl create the #define VARPATH and #define OH_DEFAULT_UID_MAP in config.h AC_DEFINE_UNQUOTED(VARPATH,"$VARPATH",[openhpi specific data path]) AC_DEFINE_UNQUOTED(OH_DEFAULT_UID_MAP,"$VARPATH/uid_map",[uid map]) dnl OH_PLUGIN_PATH - Directory where plugin libraries live. dnl default is "$libdir/openhpir" PLUGINPATH=${PLUGINPATH:=${libdir}/${PACKAGE_NAME}} AC_ARG_WITH(pluginpath, [[ --with-pluginpath=PATH use directory PATH to locate plugin libraries [default=LIBDIR/openhpi]]], [PLUGINPATH=$withval]) dnl create #define OH_PLUGIN_PATH in config.h AC_DEFINE_UNQUOTED(OH_PLUGIN_PATH,"$PLUGINPATH",[openhpi plugin path]) TEST_CLEAN='$(shell ls *.bb* *.da *.gcov *.gcno *.beam *.gcda *.summary)' AC_SUBST(TEST_CLEAN) AC_C_STRINGIZE dnl getting CFLAGS right takes some effort dnl we start with a good base set that has been built up CFLAGS="$CFLAGS $GLIB_CFLAGS" dnl next we have to do transformations to either turn on dnl test coverage support. AC_ARG_ENABLE([testcover], [ --enable-testcover adds test coverage and profiling support [[default=no]]], [if test "x$enableval" = "xyes"; then CFLAGS=`echo $CFLAGS | sed -e 's/-O\w\?\>[ ]*//g'` CFLAGS="$CFLAGS -ftest-coverage -fprofile-arcs" CXXFLAGS=`echo $CXXFLAGS | sed -e 's/-O\w\?\>[ ]*//g'` CXXFLAGS="$CXXFLAGS -ftest-coverage -fprofile-arcs" fi] ) dnl This makes libopenhpi debugger friendly dnl by eliminating optimizations and adding the -g flag AC_ARG_ENABLE([debuggable], [ --enable-debuggable adds -g flag and turns off optimization [[default=no]]], [if test "x$enableval" = "xyes"; then CFLAGS=`echo $CFLAGS | sed -e 's/-O\w\?\>[ ]*//g'` CFLAGS=`echo $CFLAGS | sed -e 's/^-g\w*[ ]*\| -g\w*//g'` CFLAGS="$CFLAGS -O0 -ggdb3" CXXFLAGS=`echo $CXXFLAGS | sed -e 's/-O\w\?\>[ ]*//g'` CXXFLAGS=`echo $CXXFLAGS | sed -e 's/^-g\w*[ ]*\| -g\w*//g'` CXXFLAGS="$CXXFLAGS -O0 -ggdb3" else CFLAGS=`echo $CFLAGS | sed -e 's/^-g\w*[ ]*\| -g\w*//g'` CXXFLAGS=`echo $CXXFLAGS | sed -e 's/^-g\w*[ ]*\| -g\w*//g'` fi] ) dnl This will let the user decide whether he wants dnl to use dbg/trace messages. AC_ARG_ENABLE([debug-msgs], [ --enable-debug-msgs enables dynamic debug messages [[default=yes]]], [if test "x$enableval" = "xyes"; then AC_DEFINE([OH_DBG_MSGS],[1],[Enables dynamic debug messages]) fi], [AC_DEFINE([OH_DBG_MSGS],[1],[Enables dynamic debug messages])] ) dnl Now we throw in a bunch of warnings. C and C++ need dnl different sets here CC_WARNINGS="\ -Wall \ -Wmissing-prototypes \ -Wmissing-declarations \ -Wstrict-prototypes \ -Wpointer-arith \ -Wformat=2 \ -Wformat-security \ -Wformat-nonliteral \ -Wno-format-y2k \ -Wcast-qual \ -Wcast-align \ -Wno-strict-aliasing \ -fno-strict-aliasing \ -Wno-unused-value " CXX_WARNINGS="\ -Wall \ -Wpointer-arith \ -Wformat=2 \ -Wformat-security \ -Wformat-nonliteral \ -Wcast-qual \ -Wcast-align \ -Wshadow \ -Wwrite-strings \ -Wredundant-decls \ -Wno-strict-aliasing \ -fno-strict-aliasing \ -Wno-unused-value " AC_ARG_ENABLE([werror], [ --enable-werror appends -Werror to CFLAGS and CXXFLAGS [[default=yes]]], [if test "x$enableval" = "xyes"; then CC_WARNINGS="$CC_WARNINGS -Werror" CXX_WARNINGS="$CXX_WARNINGS -Werror" fi], []) if test -n "`gcc --version | grep ' 3.2'`" ; then CC_WARNINGS=`echo $CC_WARNINGS | sed -e 's/-Wno-strict-aliasing//g'` CXX_WARNINGS=`echo $CC_WARNINGS | sed -e 's/-Wno-strict-aliasing//g'` fi case $host_os in solaris*) CC_WARNINGS=`echo $CC_WARNINGS | sed -e 's/-Wcast-qual//g'` CXX_WARNINGS=`echo $CXX_WARNINGS | sed -e 's/-Wwrite-strings//g'` ;; esac dnl remerge the warnings into the FLAGS CXXFLAGS="$CFLAGS $CXX_WARNINGS" CFLAGS="$CFLAGS $CC_WARNINGS" dnl lastly, we add things if we are thread safe and have the openssl library dnl (this could probably happen earlier in this file) CFLAGS="$CFLAGS -D_GNU_SOURCE -D_REENTRANT -fexceptions" CXXFLAGS="$CXXFLAGS -D_GNU_SOURCE -D_REENTRANT -fexceptions" if test "x$have_openssl" = "xyes"; then SSLDIR=ssl AC_DEFINE([HAVE_OPENSSL],[1],[openssl library was found]) AC_SUBST(WITH_OPENSSL, 1) else AC_SUBST(WITH_OPENSSL, 0) fi AM_CONDITIONAL(HAVE_OPENSSL, test x$have_openssl = xyes) OH_SSL_INCLUDES="-I\$(top_srcdir)/ssl" AC_SUBST(OH_SSL_INCLUDES) OPENHPI_INCLUDES="-I\$(top_srcdir)/include -I\$(top_srcdir)/utils -I\$(top_builddir)/utils -I\$(top_srcdir)/clients" dnl replace common includes here AC_SUBST(OPENHPI_INCLUDES) dnl Set up libs that will be linked to LIBS="$LIBS $SSL_LIB $GLIB_LIBS -lm -lpthread" AC_CHECK_PROG([found_pod2man], [pod2man], [yes]) AC_ARG_ENABLE([man], [ --enable-man generate man pages [[default=yes if pod2man exists]]], [if test "x$enableval" = "xyes"; then if test "x$found_pod2man" = "xyes"; then AC_SUBST(MAN,man) else OH_CHECK_FAIL(pod2man,perl,http://www.perl.org, Can not generate man pages without pod2man) fi else AC_SUBST(MAN,"") fi], [if test "x$found_pod2man" = "xyes"; then AC_SUBST(MAN,man) else AC_SUBST(MAN,"") fi]) AC_CONFIG_FILES([openhpi.spec openhpi.pc rt-env.sh Makefile utils/openhpiutils.pc utils/Makefile utils/t/Makefile utils/t/epath/Makefile utils/t/rpt/Makefile utils/t/sahpi/Makefile utils/t/el/Makefile utils/t/uid/Makefile utils/t/ann/Makefile transport/Makefile marshal/Makefile marshal/t/Makefile plugins/Makefile plugins/watchdog/Makefile plugins/ipmi/Makefile plugins/ipmi/t/Makefile plugins/snmp_bc/Makefile plugins/snmp_bc/t/Makefile plugins/sysfs/Makefile plugins/ipmidirect/Makefile plugins/ipmidirect/t/Makefile plugins/simulator/Makefile plugins/simulator/t/Makefile plugins/dynamic_simulator/Makefile plugins/rtas/Makefile plugins/ilo2_ribcl/Makefile plugins/oa_soap/Makefile plugins/slave/Makefile plugins/test_agent/Makefile scripts/Makefile scripts/test/Makefile snmp/Makefile ssl/Makefile baselib/Makefile docs/Makefile docs/man/Makefile openhpid/Makefile openhpid/openhpid.sh openhpid/t/Makefile openhpid/t/ohpi/Makefile hpi_shell/Makefile cpp/Makefile cpp/t/Makefile clients/Makefile clients/hpixml/Makefile baselibs/Makefile]) AC_OUTPUT openhpi-3.6.1/plugins/0000755000175100017510000000000012605014560013633 5ustar mohanmohanopenhpi-3.6.1/plugins/ilo2_ribcl/0000755000175100017510000000000012605014542015653 5ustar mohanmohanopenhpi-3.6.1/plugins/ilo2_ribcl/ilo2_ribcl_control.c0000644000175100017510000007213112575647266021630 0ustar mohanmohan/* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Shuah Khan * Richard White */ /*************** * This source file contains Control HPI ABI routines iLO2 RIBCL plug-in * implements. Other source files provide support functionality for * these ABIs. ***************/ #include #include #include /************************************ Forward declarations for static functions in this file ************************************/ static SaErrorT ilo2_ribcl_get_uid_status(ilo2_ribcl_handler_t *, SaHpiCtrlStateDigitalT *); static SaErrorT ilo2_ribcl_set_uid_status(ilo2_ribcl_handler_t *, SaHpiCtrlStateDigitalT ); static SaErrorT ilo2_ribcl_get_power_saver_status(ilo2_ribcl_handler_t *, SaHpiCtrlStateDiscreteT *); static SaErrorT ilo2_ribcl_set_power_saver_status(ilo2_ribcl_handler_t *, SaHpiCtrlStateDiscreteT ); static SaErrorT ilo2_ribcl_get_auto_power_status(ilo2_ribcl_handler_t *, SaHpiCtrlStateDiscreteT *); static SaErrorT ilo2_ribcl_set_auto_power_status(ilo2_ribcl_handler_t *, SaHpiCtrlStateDiscreteT); /***************************** iLO2 RIBCL plug-in Control ABI Interface functions *****************************/ /** * ilo2_ribcl_get_control_state: * @hnd: Handler data pointer. * @rid: Resource ID. * @cid: Control ID. * @mode: Location to store control's operational mode. * @state: Location to store control's state. * * Retrieves a control's operational mode and/or state. Both @mode and @state * may be NULL (e.g. check for presence). * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_CONTROL. * SA_ERR_HPI_INVALID_CMD - Control is write-only. * SA_ERR_HPI_INVALID_DATA - @state contain invalid text line number. * SA_ERR_HPI_INVALID_RESOURCE - Resource doesn't exist. * SA_ERR_HPI_NOT_PRESENT - Control doesn't exist. **/ SaErrorT ilo2_ribcl_get_control_state(void *hnd, SaHpiResourceIdT rid, SaHpiCtrlNumT cid, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state) { struct oh_handler_state *handle = NULL; ilo2_ribcl_handler_t *ilo2_ribcl_handler = NULL; SaHpiRptEntryT *rpt = NULL; SaHpiRdrT *rdr = NULL; ilo2_ribcl_cinfo_t *cinfo_ptr = NULL; SaHpiCtrlStateDiscreteT status; if (!hnd || !state) { err("ilo2_ribcl_get_control_state(): Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } handle = (struct oh_handler_state *)hnd; ilo2_ribcl_handler = (ilo2_ribcl_handler_t *)handle->data; if (!ilo2_ribcl_handler) { err("ilo2_ribcl_get_control_state(): Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } /* Check if resource exists and has control capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { err("ilo2_ribcl_get_control_state(): Invalid resource."); return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_CONTROL)) { err("ilo2_ribcl_get_control_state(): Resource doesn't have control capability."); return(SA_ERR_HPI_CAPABILITY); } /* Find control and its mapping data - see if it accessable */ rdr = oh_get_rdr_by_type(handle->rptcache, rid, SAHPI_CTRL_RDR, cid); if (rdr == NULL) { err("ilo2_ribcl_get_control_state(): Control RDR is not present."); return(SA_ERR_HPI_NOT_PRESENT); } /* Fetch RDR data to determine the control type */ cinfo_ptr = (ilo2_ribcl_cinfo_t *) oh_get_rdr_data(handle->rptcache, rid, rdr->RecordId); if(cinfo_ptr == NULL) { err("ilo2_ribcl_get_control_state(): No control data. Control=%s", rdr->IdString.Data); return(SA_ERR_HPI_INTERNAL_ERROR); } /* check if this control has WriteOnly flag set. If so return SA_ERR_HPI_INVALID_CMD. Please see the OpenHPI Spec for details */ if (rdr->RdrTypeUnion.CtrlRec.WriteOnly) { err("ilo2_ribcl_get_control_state(): WriteOnly Control=%s", rdr->IdString.Data); return(SA_ERR_HPI_INVALID_CMD); } /* if mode and state are null return SA_OK. Spec allows these out parms to be null and allows this call to return without setting mode and/or state respectively */ if(!mode && !state) { return(SA_OK); } switch(cinfo_ptr->ctl_type) { case ILO2_RIBCL_CTL_UID: { if(mode) { *mode = cinfo_ptr->cur_mode; } if(state) { SaErrorT ret = SA_OK; /* send GET_UID_STATUS to iLO to get the current status of the UID */ if((ret = ilo2_ribcl_get_uid_status( ilo2_ribcl_handler, &status)) != SA_OK) { err("ilo2_ribcl_get_control_state(): Get Uid Status failed for Control=%s", rdr->IdString.Data); return(ret); } state->Type = rdr->RdrTypeUnion.CtrlRec.Type; state->StateUnion.Digital = status; /* update private data current state */ cinfo_ptr->cur_state.Digital = status; } } break; case ILO2_RIBCL_CTL_POWER_SAVER: { if(mode) { *mode = cinfo_ptr->cur_mode; } if(state) { SaErrorT ret = SA_OK; /* send GET_HOST_POWER_SAVER_STATUS to iLO to get the current Power Regulator setting */ if((ret = ilo2_ribcl_get_power_saver_status( ilo2_ribcl_handler, &status)) != SA_OK) { err("ilo2_ribcl_get_control_state(): Get Uid Status failed for Control=%s", rdr->IdString.Data); return(ret); } state->Type = rdr->RdrTypeUnion.CtrlRec.Type; state->StateUnion.Discrete = status; /* update private data current state */ cinfo_ptr->cur_state.Discrete = status; } } break; case ILO2_RIBCL_CTL_AUTO_POWER: { if(mode) { *mode = cinfo_ptr->cur_mode; } if(state) { SaErrorT ret = SA_OK; /* send GET_SERVER_AUTO_PWR to iLO to get the current Auto Power Status */ if((ret = ilo2_ribcl_get_auto_power_status( ilo2_ribcl_handler, &status)) != SA_OK) { err("ilo2_ribcl_get_control_state(): Get Uid Status failed for Control=%s", rdr->IdString.Data); return(ret); } state->Type = rdr->RdrTypeUnion.CtrlRec.Type; state->StateUnion.Discrete = status; /* update private data current state */ cinfo_ptr->cur_state.Discrete = status; } } break; default: { err("ilo2_ribcl_get_control_state(): Invalid internal control type for Control=%s", rdr->IdString.Data); return(SA_ERR_HPI_INTERNAL_ERROR); } } return(SA_OK); } /** * ilo2_ribcl_set_control_state: * @hnd: Handler data pointer. * @rid: Resource ID. * @cid: Control ID. * @mode: Control's operational mode to set. * @state: Pointer to control's state to set. * * Sets a control's operational mode and/or state. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_CONTROL. * SA_ERR_HPI_INVALID_REQUEST - @state contains bad text control data. * SA_ERR_HPI_INVALID_RESOURCE - Resource doesn't exist. * SA_ERR_HPI_NOT_PRESENT - Control doesn't exist. * SA_ERR_HPI_READ_ONLY - Change mode of a read-only mode control. * Note this is only returned if the specified mode * is different than the control's default mode. **/ SaErrorT ilo2_ribcl_set_control_state(void *hnd, SaHpiResourceIdT rid, SaHpiCtrlNumT cid, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state) { struct oh_handler_state *handle = NULL; ilo2_ribcl_handler_t *ilo2_ribcl_handler = NULL; SaHpiRptEntryT *rpt = NULL; SaHpiRdrT *rdr = NULL; ilo2_ribcl_cinfo_t *cinfo_ptr = NULL; SaErrorT ret; if (!hnd || !state) { err("ilo2_ribcl_get_control_state(): Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } handle = (struct oh_handler_state *)hnd; ilo2_ribcl_handler = (ilo2_ribcl_handler_t *)handle->data; if (!ilo2_ribcl_handler) { err("ilo2_ribcl_get_control_state(): Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } /* Check if resource exists and has control capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { err("ilo2_ribcl_get_control_state(): Invalid resource."); return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_CONTROL)) { err("ilo2_ribcl_get_control_state(): Resource doesn't have control capability."); return(SA_ERR_HPI_CAPABILITY); } /* Find control and its mapping data - see if it accessable */ rdr = oh_get_rdr_by_type(handle->rptcache, rid, SAHPI_CTRL_RDR, cid); if (rdr == NULL) { err("ilo2_ribcl_get_control_state(): Control RDR is not present."); return(SA_ERR_HPI_NOT_PRESENT); } /* Fetch RDR data to determine the control type */ cinfo_ptr = (ilo2_ribcl_cinfo_t *) oh_get_rdr_data(handle->rptcache, rid, rdr->RecordId); if(cinfo_ptr == NULL) { err("ilo2_ribcl_get_control_state(): No control data. Control=%s", rdr->IdString.Data); return(SA_ERR_HPI_INTERNAL_ERROR); } /* validate static control state and mode data */ ret = oh_valid_ctrl_state_mode(&(rdr->RdrTypeUnion.CtrlRec), mode, state); if(ret) { return(ret); } /* send appropriate RIBCL command to iLO2 to set the new control state */ if(mode != SAHPI_CTRL_MODE_AUTO && state) { switch(cinfo_ptr->ctl_type) { case ILO2_RIBCL_CTL_UID: { /* Requested state is same as the current. return SA_OK */ if(cinfo_ptr->cur_state.Digital == state->StateUnion.Digital) { return(SA_OK); } if((ret = ilo2_ribcl_set_uid_status( ilo2_ribcl_handler, state->StateUnion.Digital)) != SA_OK) { return(ret); } /* control has been changed to the requested status value, now update the private status info. */ cinfo_ptr->cur_state.Digital = state->StateUnion.Digital; } break; case ILO2_RIBCL_CTL_POWER_SAVER: { /* Requested state is same as the current. return SA_OK */ if(cinfo_ptr->cur_state.Discrete == state->StateUnion.Discrete) { return(SA_OK); } if((ret = ilo2_ribcl_set_power_saver_status( ilo2_ribcl_handler, state->StateUnion.Discrete)) != SA_OK) { return(ret); } /* control has been changed to the requested status value, now update the private status info. */ cinfo_ptr->cur_state.Discrete = state->StateUnion.Discrete; } break; case ILO2_RIBCL_CTL_AUTO_POWER: { /* Requested state is same as the current. return SA_OK */ if(cinfo_ptr->cur_state.Discrete == state->StateUnion.Discrete) { return(SA_OK); } if((ret = ilo2_ribcl_set_auto_power_status( ilo2_ribcl_handler, state->StateUnion.Discrete)) != SA_OK) { return(ret); } /* control has been changed to the requested status value, now update the private status info. */ cinfo_ptr->cur_state.Discrete = state->StateUnion.Discrete; } break; default: { err("ilo2_ribcl_set_control_state(): Invalid internal control type for Control=%s", rdr->IdString.Data); return(SA_ERR_HPI_INTERNAL_ERROR); } } } return(SA_OK); } /** * ilo2_ribcl_get_uid_status: * @hnd: Private Handler data pointer. * @status: Location to store control's state. * * This routine send GET_UID_STATUS RIBCL command to iLO and gets back * the current UID status. This status then gets mapped to HPI status * before returning. * Return values: * SA_OK * SA_ERR_HPI_OUT_OF_MEMORY * SA_ERR_HPI_INTERNAL_ERROR **/ static SaErrorT ilo2_ribcl_get_uid_status(ilo2_ribcl_handler_t *hnd, SaHpiCtrlStateDigitalT *status) { char *uid_cmd; char *response; /* command response buffer */ char *new_response = NULL; int ret; int uid_status = -1; /* Allocate a temporary response buffer. */ response = malloc(ILO2_RIBCL_BUFFER_LEN); if( response == NULL){ err("ilo2_ribcl_get_uid_status: Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* Retrieve our customized command buffer */ uid_cmd = hnd->ribcl_xml_cmd[IR_CMD_GET_UID_STATUS]; if( uid_cmd == NULL){ err("ilo2_ribcl_get_uid_status: null customized command."); free( response); return( SA_ERR_HPI_INTERNAL_ERROR); } /* Send the command to iLO2 and get the response. */ ret = ilo2_ribcl_ssl_send_command( hnd, uid_cmd, response, ILO2_RIBCL_BUFFER_LEN); if( ret != 0){ err("ilo2_ribcl_get_uid_status: command send failed."); free( response); return( SA_ERR_HPI_INTERNAL_ERROR); } switch(hnd->ilo_type){ case ILO: case ILO2: /* Now, parse the response. */ ret = ir_xml_parse_uid_status( response, &uid_status, hnd->ilo2_hostport); break; case ILO3: case ILO4: new_response = ir_xml_decode_chunked(response); /* Now, parse the response. */ ret = ir_xml_parse_uid_status(new_response, &uid_status, hnd->ilo2_hostport); break; default: err("ilo2_ribcl_get_uid_status():" "failed to detect ilo type."); } if( ret != RIBCL_SUCCESS){ err("ilo2_ribcl_get_uid_status: response parse failed."); free( response); free( new_response); return( SA_ERR_HPI_INTERNAL_ERROR); } /* We're finished. Free up the temporary response buffer */ free( response); free( new_response); if(uid_status == ILO2_RIBCL_UID_ON) { *status = SAHPI_CTRL_STATE_ON; } else if (uid_status == ILO2_RIBCL_UID_OFF) { *status = SAHPI_CTRL_STATE_OFF; } else if (uid_status == ILO2_RIBCL_UID_FLASHING) { *status = SAHPI_CTRL_STATE_PULSE_ON; } else { return( SA_ERR_HPI_INTERNAL_ERROR); } return(SA_OK); } /** * ilo2_ribcl_set_uid_status: * @hnd: Private Handler data pointer. * @status: Location to store control's state. * * This routine send UID_CONTROL RIBCL command to iLO to change the * current UID status. This routine maps the passed in HPI status to * RIBCL status before sending the command. * Return values: * SA_OK * SA_ERR_HPI_OUT_OF_MEMORY * SA_ERR_HPI_INTERNAL_ERROR * SA_ERR_HPI_INVALID_PARAMS **/ static SaErrorT ilo2_ribcl_set_uid_status(ilo2_ribcl_handler_t *hnd, SaHpiCtrlStateDigitalT status) { char *uid_cmd; char *response; /* command response buffer */ char *new_response = NULL; int ret; if((status != SAHPI_CTRL_STATE_OFF) && (status != SAHPI_CTRL_STATE_ON)) { return(SA_ERR_HPI_INVALID_PARAMS); } /* Allocate a temporary response buffer. */ response = malloc(ILO2_RIBCL_BUFFER_LEN); if( response == NULL){ err("ilo2_ribcl_set_uid_status: Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* Retrieve our customized command buffer */ if(status == SAHPI_CTRL_STATE_OFF) { uid_cmd = hnd->ribcl_xml_cmd[IR_CMD_UID_CONTROL_OFF]; } else { uid_cmd = hnd->ribcl_xml_cmd[IR_CMD_UID_CONTROL_ON]; } if( uid_cmd == NULL){ err("ilo2_ribcl_set_uid_status: null customized command."); free( response); return( SA_ERR_HPI_INTERNAL_ERROR); } /* Send the command to iLO2 and get the response. */ ret = ilo2_ribcl_ssl_send_command( hnd, uid_cmd, response, ILO2_RIBCL_BUFFER_LEN); if( ret != 0){ err("ilo2_ribcl_set_uid_status: command send failed."); free( response); return( SA_ERR_HPI_INTERNAL_ERROR); } switch(hnd->ilo_type){ case ILO: case ILO2: /* Now, parse the response. */ ret = ir_xml_parse_status( response, hnd->ilo2_hostport); break; case ILO3: case ILO4: new_response = ir_xml_decode_chunked(response); /* Now, parse the response. */ ret = ir_xml_parse_status(new_response, hnd->ilo2_hostport); break; default: err("ilo2_ribcl_set_uid_status():" "failed to detect ilo type."); } if( ret != RIBCL_SUCCESS){ err("ilo2_ribcl_set_uid_status: response parse failed."); free( response); free( new_response); return( SA_ERR_HPI_INTERNAL_ERROR); } /* We're finished. Free up the temporary response buffer */ free( response); free( new_response); return(SA_OK); } /** * ilo2_ribcl_get_power_saver_status: * @hnd: Private Handler data pointer. * @status: Location to store control's state. * * This routine send GET_HOST_POWER_SAVER_STATUS RIBCL command to iLO * and gets back the current Power Regulator status. This status then * gets mapped to HPI status before returning. * Return values: * SA_OK * SA_ERR_HPI_OUT_OF_MEMORY * SA_ERR_HPI_INTERNAL_ERROR **/ static SaErrorT ilo2_ribcl_get_power_saver_status(ilo2_ribcl_handler_t *hnd, SaHpiCtrlStateDiscreteT *status) { char *ps_cmd; char *response; /* command response buffer */ char *new_response = NULL; int ret; int ps_status = -1; /* Allocate a temporary response buffer. */ response = malloc(ILO2_RIBCL_BUFFER_LEN); if( response == NULL){ err("ilo2_ribcl_get_power_saver_status: Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* Retrieve our customized command buffer */ ps_cmd = hnd->ribcl_xml_cmd[IR_CMD_GET_HOST_POWER_SAVER_STATUS]; if( ps_cmd == NULL){ err("ilo2_ribcl_get_power_saver_status: null customized command."); free( response); return( SA_ERR_HPI_INTERNAL_ERROR); } /* Send the command to iLO2 and get the response. */ ret = ilo2_ribcl_ssl_send_command( hnd, ps_cmd, response, ILO2_RIBCL_BUFFER_LEN); if( ret != 0){ err("ilo2_ribcl_get_power_saver_status: command send failed."); free( response); return( SA_ERR_HPI_INTERNAL_ERROR); } switch(hnd->ilo_type){ case ILO: case ILO2: /* Now, parse the response. */ ret = ir_xml_parse_power_saver_status( response, &ps_status, hnd->ilo2_hostport); break; case ILO3: case ILO4: new_response = ir_xml_decode_chunked(response); /* Now, parse the response. */ ret = ir_xml_parse_power_saver_status(new_response, &ps_status, hnd->ilo2_hostport); break; default: err("ilo2_ribcl_get_power_saver_status():" "failed to detect ilo type."); } if( ret != RIBCL_SUCCESS) { err("ilo2_ribcl_get_power_saver_status: response parse failed."); free( response); free( new_response); return( SA_ERR_HPI_INTERNAL_ERROR); } /* We're finished. Free up the temporary response buffer */ free( response); free( new_response); if (ps_status >= ILO2_RIBCL_MANUAL_OS_CONTROL_MODE && ps_status <= ILO2_RIBCL_MANUAL_HIGH_PERF_MODE) { *status = ps_status; } else { return( SA_ERR_HPI_INTERNAL_ERROR); } return(SA_OK); } /** * ilo2_ribcl_set_power_saver_status: * @hnd: Private Handler data pointer. * @status: Location to store control's state. * * This routine send SET_HOST_POWER_SAVER RIBCL command to iLO to change the * current Power Saver status. This routine maps the passed in HPI status to * RIBCL status before sending the command. * Return values: * SA_OK * SA_ERR_HPI_OUT_OF_MEMORY * SA_ERR_HPI_INTERNAL_ERROR * SA_ERR_HPI_INVALID_PARAMS **/ static SaErrorT ilo2_ribcl_set_power_saver_status(ilo2_ribcl_handler_t *hnd, SaHpiCtrlStateDiscreteT status) { char *ps_cmd; char *response; /* command response buffer */ char *new_response = NULL; int ret; if((status < ILO2_RIBCL_MANUAL_OS_CONTROL_MODE) || (status > ILO2_RIBCL_MANUAL_HIGH_PERF_MODE)) { return(SA_ERR_HPI_INVALID_PARAMS); } /* Allocate a temporary response buffer. */ response = malloc(ILO2_RIBCL_BUFFER_LEN); if( response == NULL){ err("ilo2_ribcl_set_power_saver_status: Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* Retrieve our customized command buffer */ if(status == ILO2_RIBCL_MANUAL_OS_CONTROL_MODE) { ps_cmd = hnd->ribcl_xml_cmd[IR_CMD_SET_HOST_POWER_SAVER_1]; } else if(status == ILO2_RIBCL_MANUAL_LOW_POWER_MODE) { ps_cmd = hnd->ribcl_xml_cmd[IR_CMD_SET_HOST_POWER_SAVER_2]; } else if(status == ILO2_RIBCL_AUTO_POWER_SAVE_MODE) { ps_cmd = hnd->ribcl_xml_cmd[IR_CMD_SET_HOST_POWER_SAVER_3]; } else if(status == ILO2_RIBCL_MANUAL_HIGH_PERF_MODE) { ps_cmd = hnd->ribcl_xml_cmd[IR_CMD_SET_HOST_POWER_SAVER_4]; } else { free( response); return(SA_ERR_HPI_INVALID_PARAMS); } if( ps_cmd == NULL){ err("ilo2_ribcl_set_power_saver_status: null customized command."); free( response); return( SA_ERR_HPI_INTERNAL_ERROR); } /* Send the command to iLO2 and get the response. */ ret = ilo2_ribcl_ssl_send_command( hnd, ps_cmd, response, ILO2_RIBCL_BUFFER_LEN); if( ret != 0){ err("ilo2_ribcl_set_power_saver_status: command send failed."); free( response); return( SA_ERR_HPI_INTERNAL_ERROR); } switch(hnd->ilo_type){ case ILO: case ILO2: /* Now, parse the response. */ ret = ir_xml_parse_status(response, hnd->ilo2_hostport); break; case ILO3: case ILO4: new_response = ir_xml_decode_chunked(response); /* Now, parse the response. */ ret = ir_xml_parse_status(new_response, hnd->ilo2_hostport); break; default: err("ilo2_ribcl_set_power_saver_status():" "failed to detect ilo type."); } if( ret != RIBCL_SUCCESS){ err("ilo2_ribcl_set_power_saver_status: response parse failed."); free( response); free( new_response); /* DL365 G1 doesn't support Power Saver Feature and DL385 G2 supports just the ILO2_RIBCL_MANUAL_LOW_POWER_MODE */ if(ret == RIBCL_UNSUPPORTED) { return(SA_ERR_HPI_UNSUPPORTED_API); } return( SA_ERR_HPI_INTERNAL_ERROR); } /* We're finished. Free up the temporary response buffer */ free( response); free( new_response); return(SA_OK); } /** * ilo2_ribcl_get_auto_power_status: * @hnd: Private Handler data pointer. * @status: Location to store control's state. * * This routine send GET_SERVER_AUTO_PWR RIBCL command to iLO * and gets back the current Auto Power status. This status then * gets mapped to HPI status before returning. * Return values: * SA_OK * SA_ERR_HPI_OUT_OF_MEMORY * SA_ERR_HPI_INTERNAL_ERROR **/ static SaErrorT ilo2_ribcl_get_auto_power_status(ilo2_ribcl_handler_t *hnd, SaHpiCtrlStateDiscreteT *status) { char *ps_cmd; char *response; /* command response buffer */ char *new_response = NULL; int ret; int ps_status = -1; /* Allocate a temporary response buffer. */ response = malloc(ILO2_RIBCL_BUFFER_LEN); if( response == NULL){ err("ilo2_ribcl_get_auto_power_status: Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* Retrieve our customized command buffer */ ps_cmd = hnd->ribcl_xml_cmd[IR_CMD_GET_SERVER_AUTO_PWR]; if( ps_cmd == NULL){ err("ilo2_ribcl_get_auto_power_status: null customized command."); free( response); return( SA_ERR_HPI_INTERNAL_ERROR); } /* Send the command to iLO2 and get the response. */ ret = ilo2_ribcl_ssl_send_command( hnd, ps_cmd, response, ILO2_RIBCL_BUFFER_LEN); if( ret != 0){ err("ilo2_ribcl_get_auto_power_status: command send failed."); free( response); return( SA_ERR_HPI_INTERNAL_ERROR); } switch(hnd->ilo_type){ case ILO: case ILO2: /* Now, parse the response. */ ret = ir_xml_parse_auto_power_status(response, &ps_status, hnd->ilo2_hostport); break; case ILO3: case ILO4: new_response = ir_xml_decode_chunked(response); /* Now, parse the response. */ ret = ir_xml_parse_auto_power_status(new_response, &ps_status, hnd->ilo2_hostport); break; default: err("ilo2_ribcl_get_auto_power_status():" "failed to detect ilo type."); } if( ret != RIBCL_SUCCESS) { err("ilo2_ribcl_get_auto_power_status: response parse failed."); free( response); free( new_response); return( SA_ERR_HPI_INTERNAL_ERROR); } /* We're finished. Free up the temporary response buffer */ free( response); free( new_response); if (ps_status >= ILO2_RIBCL_AUTO_POWER_ENABLED && ps_status <= ILO2_RIBCL_AUTO_POWER_DELAY_60) { *status = ps_status; } else { return( SA_ERR_HPI_INTERNAL_ERROR); } return(SA_OK); } /** * ilo2_ribcl_set_auto_power_status: * @hnd: Private Handler data pointer. * @status: Location to store control's state. * * This routine send SERVER_AUTO_PWR RIBCL command to iLO to change the * current Auto Power setting/status. This routine maps the passed in * HPI status to RIBCL status before sending the command. * Return values: * SA_OK * SA_ERR_HPI_OUT_OF_MEMORY * SA_ERR_HPI_INTERNAL_ERROR * SA_ERR_HPI_INVALID_PARAMS **/ static SaErrorT ilo2_ribcl_set_auto_power_status(ilo2_ribcl_handler_t *hnd, SaHpiCtrlStateDiscreteT status) { char *ps_cmd; char *response; /* command response buffer */ char *new_response = NULL; int ret; if(hnd->ilo_type==ILO2) { if((status != ILO2_RIBCL_AUTO_POWER_ENABLED) && (status != ILO2_RIBCL_AUTO_POWER_DISABLED) && (status != ILO2_RIBCL_AUTO_POWER_DELAY_RANDOM) && (status != ILO2_RIBCL_AUTO_POWER_DELAY_15) && (status != ILO2_RIBCL_AUTO_POWER_DELAY_30) && (status != ILO2_RIBCL_AUTO_POWER_DELAY_45) && (status != ILO2_RIBCL_AUTO_POWER_DELAY_60)) { return(SA_ERR_HPI_INVALID_PARAMS); } } if(hnd->ilo_type==ILO3){ if((status != ILO2_RIBCL_AUTO_POWER_ENABLED) && (status != ILO2_RIBCL_AUTO_POWER_OFF) && (status != ILO2_RIBCL_AUTO_POWER_DELAY_RANDOM)) { return(SA_ERR_HPI_INVALID_PARAMS); } } if(hnd->ilo_type==ILO4){ if((status != ILO2_RIBCL_AUTO_POWER_ENABLED) && (status != ILO2_RIBCL_AUTO_POWER_OFF) && (status != ILO2_RIBCL_AUTO_POWER_RESTORE) && (status != ILO2_RIBCL_AUTO_POWER_DELAY_RANDOM)) { return(SA_ERR_HPI_INVALID_PARAMS); } } /* Allocate a temporary response buffer. */ response = malloc(ILO2_RIBCL_BUFFER_LEN); if( response == NULL){ err("ilo2_ribcl_set_auto_power_status: Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* Retrieve our customized command buffer */ if(status == ILO2_RIBCL_AUTO_POWER_ENABLED) { ps_cmd = hnd->ribcl_xml_cmd[IR_CMD_SERVER_AUTO_PWR_YES]; } else if(status == ILO2_RIBCL_AUTO_POWER_DISABLED) { ps_cmd = hnd->ribcl_xml_cmd[IR_CMD_SERVER_AUTO_PWR_NO]; } else if(status == ILO2_RIBCL_AUTO_POWER_OFF) { ps_cmd = hnd->ribcl_xml_cmd[IR_CMD_SERVER_AUTO_PWR_OFF]; } else if(status == ILO2_RIBCL_AUTO_POWER_DELAY_RANDOM) { ps_cmd = hnd->ribcl_xml_cmd[IR_CMD_SERVER_AUTO_PWR_RANDOM]; } else if(status == ILO2_RIBCL_AUTO_POWER_DELAY_15) { ps_cmd = hnd->ribcl_xml_cmd[IR_CMD_SERVER_AUTO_PWR_15]; } else if(status == ILO2_RIBCL_AUTO_POWER_DELAY_30) { ps_cmd = hnd->ribcl_xml_cmd[IR_CMD_SERVER_AUTO_PWR_30]; } else if(status == ILO2_RIBCL_AUTO_POWER_DELAY_45) { ps_cmd = hnd->ribcl_xml_cmd[IR_CMD_SERVER_AUTO_PWR_45]; } else if(status == ILO2_RIBCL_AUTO_POWER_DELAY_60) { ps_cmd = hnd->ribcl_xml_cmd[IR_CMD_SERVER_AUTO_PWR_60]; } else if(status == ILO2_RIBCL_AUTO_POWER_RESTORE) { ps_cmd = hnd->ribcl_xml_cmd[IR_CMD_SERVER_AUTO_PWR_RESTORE]; } else { free( response); return(SA_ERR_HPI_INVALID_PARAMS); } if( ps_cmd == NULL){ err("ilo2_ribcl_set_auto_power_status: null customized command."); free( response); return( SA_ERR_HPI_INTERNAL_ERROR); } /* Send the command to iLO2 and get the response. */ ret = ilo2_ribcl_ssl_send_command( hnd, ps_cmd, response, ILO2_RIBCL_BUFFER_LEN); if( ret != 0){ err("ilo2_ribcl_set_auto_power_status: command send failed."); free( response); return( SA_ERR_HPI_INTERNAL_ERROR); } switch(hnd->ilo_type){ case ILO: case ILO2: /* Now, parse the response. */ ret = ir_xml_parse_status(response, hnd->ilo2_hostport); break; case ILO3: case ILO4: new_response = ir_xml_decode_chunked(response); /* Now, parse the response. */ ret = ir_xml_parse_status(new_response, hnd->ilo2_hostport); break; default: err("ilo2_ribcl_set_auto_power_status():" "failed to detect ilo type."); } if( ret != RIBCL_SUCCESS){ err("ilo2_ribcl_set_auto_power_status: response parse failed."); free( response); free( new_response); return( SA_ERR_HPI_INTERNAL_ERROR); } /* We're finished. Free up the temporary response buffer */ free( response); free( new_response); return(SA_OK); } /***************************** OpenHPI plug-in to iLO2 RIBCL plug-in ABI function mapping *****************************/ void * oh_get_control_state (void *, SaHpiResourceIdT, SaHpiCtrlNumT, SaHpiCtrlModeT *, SaHpiCtrlStateT *) __attribute__ ((weak, alias("ilo2_ribcl_get_control_state"))); void * oh_set_control_state (void *, SaHpiResourceIdT,SaHpiCtrlNumT, SaHpiCtrlModeT, SaHpiCtrlStateT *) __attribute__ ((weak, alias("ilo2_ribcl_set_control_state"))); openhpi-3.6.1/plugins/ilo2_ribcl/ilo2_ribcl_ssl.h0000644000175100017510000000424012575647266020752 0ustar mohanmohan/* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Shuah Khan * Richard White */ #ifndef _INC_ILO2_RIBCL_SSL_H_ #define _INC_ILO2_RIBCL_SSL_H_ #define ILO_RIBCL_TEST_ILO_RESPONSE_MAX 1024 #include /* * This file defines prototypes for the iLO2 RIBCL plug-in iLO2 SSL connection * management functions implemented in ilo2_ribcl_ssl.c */ extern int ilo2_ribcl_ssl_send_command(ilo2_ribcl_handler_t *, char *, char *, int); extern int ilo_ribcl_detect_ilo_type(ilo2_ribcl_handler_t *); void itoascii(char *, int); #endif /* _INC_ILO2_RIBCL_SSL_H_ */ openhpi-3.6.1/plugins/ilo2_ribcl/ilo2_ribcl.h0000644000175100017510000005142212575647266020075 0ustar mohanmohan/* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Shuah Khan * Richard White */ #ifndef _INC_ILO2_RIBCL_H_ #define _INC_ILO2_RIBCL_H_ /*************** * This header file contains all of the iLO2 RIBCL internal data structure * definitions. This file is intended to be included in all of the iLO2 RIBCL * source files. ***************/ #include #include #include #include #include #include #include #include #include #include "ilo2_ribcl_cmnds.h" #include "sahpi_wrappers.h" /* The macro ILO2_RIBCL_SIMULATE_iLO2_RESPONSE is used to conditionally * compile code which reads a simulated iLO2 response from a local * file rather than communicating with an actual iLO2. This is used for * testing when specific responses are needed, or in an environment where * an iLO2 is not available. The filename for the response for each command * is specified in the openhpi.conf configuration file. The currently supported * names are: * "discovery_responsefile" - file used by ilo2_ribcl_do_discovery(). */ /* #define ILO2_RIBCL_SIMULATE_iLO2_RESPONSE */ /* * ILO2 RIBCL User name * Maximum length - 39 * any combination of printable characters * case sensitive * must not be blank */ #define ILO2_RIBCL_USER_NAME_MAX_LEN 39 #define ILO2_RIBCL_USER_NAME_MIN_LEN 1 /* * ILO2 RIBCL password * Maximum length - 39 * any combination of printable characters * case sensitive * Minimum length - 0 * Minimum default length - 8 */ #define ILO2_RIBCL_PASSWORD_MAX_LEN 39 #define ILO2_RIBCL_PASSWORD_MIN_LEN 1 /* * ILO2 RIBCL Hostname Length defines */ #define ILO2_HOST_NAME_MAX_LEN 256 /* A valid IP addr will have a min. len of 7 4 digts + 3 decimal points */ #define ILO2_HOST_NAME_MIN_LEN 7 /* Minimum length port string */ #define ILO2_MIN_PORT_STR_LEN 1 /* * RIBCL command and response buffer length - static for now. * Change to dynamic if need be. */ #define ILO2_RIBCL_BUFFER_LEN 4096 #define ILO2_RIBCL_HTTP_LINE_MAX 2048 /* * Power and reset status definitions */ #define ILO2_RIBCL_POWER_OFF 0 #define ILO2_RIBCL_POWER_ON 1 #define ILO2_RIBCL_RESET_SUCCESS 1 #define ILO2_RIBCL_RESET_FAILED 0 /* The size used for the temporary buffer to contain the response * of the IR_CMD_GET_SERVER_DATA command. The current return size for iLO2 is * a little over 24K and a little over 45K for iLO3, so we use 64K to give * us some margin for the future. */ #define ILO2_RIBCL_DISCOVER_RESP_MAX 1024*256 /* * For a oh_set_power_state() call with a state parameter of * SAHPI_POWER_CYCLE, we must wait until the server actually powers off * before powering it back on again. * The total turnaround time for a RIBCL command is around 10 seconds, * so the total time spent waiting for the system to power off (in seconds) * will be ((ILO2_POWER_POLL_SLEEP_SECONDS + 10) * ILO2_MAX_POWER_POLLS) * The default timing below will wait a maximum of 200 seconds. */ #define ILO2_MAX_POWER_POLLS 10 #define ILO2_POWER_POLL_SLEEP_SECONDS 10 /* * get_event return value when there are events pending to be processed. * OpenHPI framework doesn't provide mnemonic for this return value. */ #define ILO2_RIBCL_EVENTS_PENDING 1 /* * Resource doesn't support managed hot swap. OpenHPI fails to define * mnemonic for this value */ #define ILO2_RIBCL_MANAGED_HOTSWAP_CAP_FALSE 0 #define NO_ILO 0 #define ILO 1 #define ILO2 2 #define ILO3 3 #define ILO4 4 #define ILO2_RIBCL_CMD_MAX_LEN 5 /****************************************************************************** * The following data structures and macros are used for our implementation * of Inventory Data Repositories. * * Currently, we only have one area in out IDRs. The plugin has been * written to easily add more areas in the future. */ #define I2R_MAX_AREA 1 #define I2R_MAX_FIELDS 4 #define I2R_MAX_FIELDCHARS 32 /* These are the index values for fields in the chassis IDR */ #define I2R_CHASSIS_IF_PRODNAME 0 #define I2R_CHASSIS_IF_SERNUM 1 #define I2R_CHASSIS_IF_MANUFACT 2 #define I2R_CHASSIS_IF_ILO2VERS 3 /* These are the index values for fields in the memory DIMM IDR */ #define I2R_MEM_IF_SIZE 0 #define I2R_MEM_IF_SPEED 1 /* These are the index values for fields in the cpu IDR */ #define I2R_CPU_IF_SPEED 0 typedef struct { SaHpiIdrFieldTypeT field_type; char field_string[I2R_MAX_FIELDCHARS]; } I2R_FieldT; typedef struct { SaHpiIdrAreaTypeT area_type; SaHpiUint32T num_fields; /* Number of used fields */ I2R_FieldT area_fields[I2R_MAX_FIELDS]; } I2R_AreaT; struct ilo2_ribcl_idr_info { SaHpiUint32T update_count; SaHpiUint32T num_areas; I2R_AreaT idr_areas[I2R_MAX_AREA]; }; /* The structure passed as a parameter to ilo2_ribcl_get_idr_allinfo() and * ilo2_ribcl_get_idr_allinfo_by_ep(), which collects all the associated * HPI data for an IDR */ struct ilo2_ribcl_idr_allinfo { SaHpiRptEntryT *rpt; SaHpiRdrT *rdr; struct ilo2_ribcl_idr_info *idrinfo; }; /****************************************************************************** * The following data structures and macros are used for our implementation * of Sensors. * * Currently, we only implement chassis sensors of event category * SAHPI_EC_SEVERITY. The plugin has been written to add more sensor * categories in the future. */ /* These are the values for our severity level sensors */ #define I2R_SEN_VAL_OK 0 #define I2R_SEN_VAL_DEGRADED 1 #define I2R_SEN_VAL_FAILED 2 #define I2R_SEN_VAL_UNINITIALIZED -1 /* The number of chassis sensors for our data structures. Note that * sensor numbers begin with 1, so this number may be one greater than * you would think. */ #define I2R_NUM_CHASSIS_SENSORS 4 /* These are the sensor numbers for the sensors on our chassis */ #define I2R_SEN_FANHEALTH 1 #define I2R_SEN_TEMPHEALTH 2 #define I2R_SEN_POWERHEALTH 3 /* These are the descriptions for the chassis sensors */ #define I2R_SEN_FANHEALTH_DESCRIPTION "System fans health indicator: Ok(0)/Degraded(1)/Failed(2)" #define I2R_SEN_TEMPHEALTH_DESCRIPTION "System temperature health indicator: Ok(0)/Failed(2)" #define I2R_SEN_POWERHEALTH_DESCRIPTION "System power supply health indicator: Ok(0)/Degraded(1)/Failed(2)" /* The three state severity model (OK, Degraded, Fail) used for iLo2 RIBCL * sensors will support these sensor event states */ #define I2R_SEVERITY_THREESTATE_EV (SAHPI_ES_OK | \ SAHPI_ES_MAJOR_FROM_LESS | \ SAHPI_ES_MAJOR_FROM_CRITICAL | \ SAHPI_ES_CRITICAL) /* The two state severity model (OK, Failed) used for iLo2 RIBCL sensors will * support these HPI sensor event states */ #define I2R_SEVERITY_TWOSTATE_EV (SAHPI_ES_OK | SAHPI_ES_CRITICAL) /* The private data for our sensor, associated with it's RDR. */ struct ilo2_ribcl_sensinfo { SaHpiSensorNumT sens_num; /* Sensor number */ SaHpiEventStateT sens_ev_state; /* Current sensor event state */ SaHpiEventStateT prev_sens_ev_state; /* Previous sensor event state */ SaHpiEventStateT event_sens_ev_state; /* ev state to send with event */ SaHpiBoolT sens_enabled; /* Sensor enable */ SaHpiBoolT sens_ev_enabled; /* Sensor event enable */ SaHpiEventStateT sens_assertmask; SaHpiEventStateT sens_deassertmask; int sens_value; SaHpiSensorThresholdsT threshold; char *status; }; /* Structure used by ilo2_ribcl_get_sensor_rdr_data() to return a pointer to * the sensor RDR and it's associated private data. */ struct ilo2_ribcl_sens_allinfo { SaHpiRptEntryT *rpt; SaHpiRdrT *rdr; struct ilo2_ribcl_sensinfo *sens_dat; struct ir_tsdata *ts_data; }; /* These are the state for software state machines that process the iLo2 * sensors. We currently only support Severity sensors, but more states * can be added later. */ typedef enum { I2R_INITIAL = 0, I2R_OK = 1, I2R_DEGRADED_FROM_OK = 2, I2R_DEGRADED_FROM_FAIL = 3, I2R_FAILED = 4, I2R_NO_EXIST = 0xFFFF } I2R_SensorStateT; /* All the types of sensor readings that we hande will be contained in this * union. */ typedef union { int intval; } I2R_ReadingUnionT; /* Structure to store a sensor's dynamic reading in our private handler */ typedef struct { SaHpiResourceIdT rid; /* So we can locate other HPI info from here */ I2R_SensorStateT state; I2R_ReadingUnionT reading; } I2R_SensorDataT; /****************************************************************************** * The following data structures are used to save the discovery data. * This data cache will be used to implement APIs that require state * information and additional information on components such as speed, * and control capabilities. The index into this field, rid, and hotswap * state of each component will be added to the RPT private data cache * via oh_add_resource() when each component is discovered. */ /* Discover states for a resource */ enum ir_discoverstate { BLANK=0, OK=1, FAILED=2, REMOVED=3}; /* Values for flags fields in DiscoveryData structures */ #define IR_DISCOVERED 0x01 #define IR_EXISTED 0x02 #define IR_FAILED 0x04 #define IR_SPEED_UPDATED 0x08 typedef struct ir_cpudata { unsigned int cpuflags; enum ir_discoverstate dstate; char *label; } ir_cpudata_t; typedef struct ir_memdata { unsigned int memflags; enum ir_discoverstate dstate; char *label; char *memsize; char *speed; } ir_memdata_t; typedef struct ir_fandata{ unsigned int fanflags; enum ir_discoverstate dstate; char *label; char *zone; char *status; int speed; char *speedunit; } ir_fandata_t; typedef struct ir_psudata{ unsigned int psuflags; enum ir_discoverstate dstate; char *label; char *status; } ir_psudata_t; typedef struct ir_vrmdata{ unsigned int vrmflags; enum ir_discoverstate dstate; char *label; char *status; } ir_vrmdata_t; typedef struct ir_tsdata{ unsigned int tsflags; char *label; char *location; char *status; char *reading; char *readingunits; SaHpiResourceIdT rid; char *cautionvalue; char *cautionunit; char *criticalvalue; char *criticalunit; } ir_tsdata_t; /* Firmware Revision Information */ typedef struct ir_fwdata{ char *version_string; SaHpiUint8T FirmwareMajorRev; SaHpiUint8T FirmwareMinorRev; } ir_fwdata_t; #define ILO2_RIBCL_DISCOVER_CPU_MAX 16 #define ILO2_RIBCL_DISCOVER_MEM_MAX 32 #define ILO2_RIBCL_DISCOVER_FAN_MAX 16 #define ILO2_RIBCL_DISCOVER_PSU_MAX 8 #define ILO2_RIBCL_DISCOVER_VRM_MAX 8 #define ILO2_RIBCL_DISCOVER_TS_MAX 120 #define ILO2_RIBCL_CHASSIS_INDEX -1; /* Index is not aplicable to chassis */ typedef struct iLO_thread_info { GThread *hthread; GCond *iLO_cond; GMutex *iLO_mutex; struct oh_handler_state *oh_handler; } iLO_info_t; typedef struct ilo2_ribcl_DiscoveryData { char *product_name; char *serial_number; char *system_cpu_speed; ir_cpudata_t cpudata[ ILO2_RIBCL_DISCOVER_CPU_MAX+1]; ir_memdata_t memdata[ ILO2_RIBCL_DISCOVER_MEM_MAX+1]; ir_fandata_t fandata[ ILO2_RIBCL_DISCOVER_FAN_MAX+1]; ir_psudata_t psudata[ ILO2_RIBCL_DISCOVER_PSU_MAX+1]; ir_vrmdata_t vrmdata[ ILO2_RIBCL_DISCOVER_VRM_MAX+1]; ir_tsdata_t tsdata[ ILO2_RIBCL_DISCOVER_TS_MAX+1]; I2R_SensorDataT chassis_sensors[I2R_NUM_CHASSIS_SENSORS]; ir_fwdata_t fwdata; } ilo2_ribcl_DiscoveryData_t; /* iLO2 RIBCL plug-in handler structure */ typedef struct ilo2_ribcl_handler { char *entity_root; int first_discovery_done; int ilo_type; char ir_hostname[ILO2_HOST_NAME_MAX_LEN]; /* Storehouse for data obtained during discovery */ ilo2_ribcl_DiscoveryData_t DiscoveryData; iLO_info_t *ilo_thread_data; SaHpiBoolT need_rediscovery; SaHpiBoolT discovery_complete; SaHpiTimeT iml_log_time; /* RIBCL data */ char *user_name; char *password; /* iLO2 hostname and port number information */ char *ilo2_hostport; #ifdef ILO2_RIBCL_SIMULATE_iLO2_RESPONSE /* Discovery response file for testing */ char *discovery_responsefile; #endif /* ILO2_RIBCL_SIMULATE_iLO2_RESPONSE */ /* SSL connection status */ SSL_CTX *ssl_ctx; /* SSL connection handler pointer */ BIO *ssl_handler; /* Commands customized with the login and password for this system */ char *ribcl_xml_cmd[ IR_NUM_COMMANDS]; char *ribcl_xml_test_hdr; char *ribcl_xml_ilo3_hdr; GSList *eventq; /* Event queue cache */ /* During discovery, soem routines need a temporary buffer for * struct ilo2_ribcl_idr_info. It's a bit too large to use as * as local variable on the stack, and allocating/deallocating * it frequently could fragment memory. So, we keep it here * in our private handler for all routines to use. */ struct ilo2_ribcl_idr_info tmp_idr; } ilo2_ribcl_handler_t; /* Define for uninitialized power_cur_state value. Power status is not queried during discovery and power_cur_state field will be initialized to reflect an uninitialized state. */ #define ILO2_RIBCL_POWER_STATUS_UNKNOWN -1 /* iLO2 RIBCL private resource data */ typedef struct ilo2_ribcl_resource_info { SaHpiResourceIdT rid; SaHpiHsStateT fru_cur_state; /* current simple hotswap state of FRU resources */ int disc_data_idx; /* resource index into the Discovery Data Cache */ SaHpiPowerStateT power_cur_state; /* current power state */ } ilo2_ribcl_resource_info_t; /* iLO2 RIBCL control type and index definitions. */ #define ILO2_RIBCL_CTL_UID 1 #define ILO2_RIBCL_CONTROL_1 1 #define ILO2_RIBCL_CTL_POWER_SAVER 2 #define ILO2_RIBCL_CONTROL_2 2 #define ILO2_RIBCL_CTL_AUTO_POWER 3 #define ILO2_RIBCL_CONTROL_3 3 /* * UID Control status definitions */ #define ILO2_RIBCL_UID_OFF 0 #define ILO2_RIBCL_UID_ON 1 #define ILO2_RIBCL_UID_FLASHING 2 #define ILO2_RIBCL_UID_SET_SUCCESS 1 #define ILO2_RIBCL_UID_SET_FAILED 0 /* Power Saver Control defines */ /* The following outlines the Power Regulator feature: The values are 1 = OS Control Mode (Disabled Mode for iLO) 2 = HP Static Low Power Mode 3 = HP Dynamic Power Savings Mode 4 = HP Static High Performance Mode Note: Value 4 is availble only for iLO 2 firmware version 1.20 and later. */ /* OS Control Mode (Disabled Mode for iLO) */ #define ILO2_RIBCL_MANUAL_OS_CONTROL_MODE 1 /* HP Static Low Power Mode */ #define ILO2_RIBCL_MANUAL_LOW_POWER_MODE 2 /* HP Dynamic Power Savings Mode. */ #define ILO2_RIBCL_AUTO_POWER_SAVE_MODE 3 /* HP Static High Performance Mode */ #define ILO2_RIBCL_MANUAL_HIGH_PERF_MODE 4 /* The following outlines the Auto Power feature: The Auto Power Control allows user to change the automatic power on and power on delay settings of the server. The values are Yes = Enable automatic power on with a minimum delay. No = Disable automatic power on. Restore = Restore Previous state. 15 = Enable automatic power on with 15 seconds delay. 30 = Enable automatic power on with 30 seconds delay. 45 = Enable automatic power on with 45 seconds delay. 60 = Enable automatic power on with 60 seconds delay. Random = Enable automatic power on with random delay up to 60 seconds. */ #define ILO2_RIBCL_AUTO_POWER_ENABLED 1 #define ILO2_RIBCL_AUTO_POWER_DISABLED 2 #define ILO2_RIBCL_AUTO_POWER_DELAY_RANDOM 3 #define ILO2_RIBCL_AUTO_POWER_RESTORE 4 #define ILO2_RIBCL_AUTO_POWER_OFF 5 #define ILO2_RIBCL_AUTO_POWER_DELAY_15 15 #define ILO2_RIBCL_AUTO_POWER_DELAY_30 30 #define ILO2_RIBCL_AUTO_POWER_DELAY_45 45 #define ILO2_RIBCL_AUTO_POWER_DELAY_60 60 /* iLO2 RIBCL plug-in intenal data structure to save plug-in private control data. This structure is used to save the current mode and current state information of a control. */ typedef struct ilo2_ribcl_cinfo { int ctl_type; /* internal control type */ SaHpiCtrlModeT cur_mode; SaHpiCtrlStateUnionT cur_state; } ilo2_ribcl_cinfo_t; /***************************** Prototypes for iLO2 RIBCL plug-in ABI functions *****************************/ /* The following fucntions are defined in ilo2_ribcl.c */ extern void *ilo2_ribcl_open(GHashTable *, unsigned int , oh_evt_queue *); extern void ilo2_ribcl_close(void *); extern SaErrorT ilo2_ribcl_get_event(void *); /* The following fucntions are defined in ilo2_ribcl_discover.c */ extern SaErrorT ilo2_ribcl_discover_resources(void *); /* The following functions are defined in ilo2_ribcl_reset.c */ extern SaErrorT ilo2_ribcl_get_reset_state(void *, SaHpiResourceIdT, SaHpiResetActionT *); extern SaErrorT ilo2_ribcl_set_reset_state(void *hnd, SaHpiResourceIdT rid, SaHpiResetActionT act); /* The following functions are defined in ilo2_ribcl_reset.c */ extern SaErrorT ilo2_ribcl_get_power_state(void *hnd, SaHpiResourceIdT rid, SaHpiPowerStateT *state); extern SaErrorT ilo2_ribcl_set_power_state(void *hnd, SaHpiResourceIdT rid, SaHpiPowerStateT state); /* The following functions are defined in ilo2_ribcl_rpt.c */ extern SaErrorT ilo2_ribcl_set_resource_severity(void *, SaHpiResourceIdT, SaHpiSeverityT); extern SaErrorT ilo2_ribcl_set_resource_tag(void *, SaHpiResourceIdT, SaHpiTextBufferT *); /* The following functions are defined in ilo2_ribcl_control.c */ extern SaErrorT ilo2_ribcl_get_control_state(void *, SaHpiResourceIdT , SaHpiCtrlNumT , SaHpiCtrlModeT *, SaHpiCtrlStateT *); extern SaErrorT ilo2_ribcl_set_control_state(void *, SaHpiResourceIdT , SaHpiCtrlNumT , SaHpiCtrlModeT , SaHpiCtrlStateT *); /* The following functions are defined in ilo2_ribcl_idr.c */ extern SaErrorT ilo2_ribcl_get_idr_info(void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrInfoT *); extern SaErrorT ilo2_ribcl_get_idr_area_header(void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrAreaTypeT, SaHpiEntryIdT, SaHpiEntryIdT *, SaHpiIdrAreaHeaderT *); extern SaErrorT ilo2_ribcl_get_idr_field(void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT, SaHpiIdrFieldTypeT, SaHpiEntryIdT, SaHpiEntryIdT *, SaHpiIdrFieldT *); extern SaErrorT ilo2_ribcl_add_idr_area( void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrAreaTypeT, SaHpiEntryIdT *); extern SaErrorT ilo2_ribcl_del_idr_area( void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT); extern SaErrorT ilo2_ribcl_add_idr_field( void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrFieldT *); extern SaErrorT ilo2_ribcl_set_idr_field( void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrFieldT *); extern SaErrorT ilo2_ribcl_del_idr_field( void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT, SaHpiEntryIdT); extern SaErrorT ilo2_ribcl_add_idr( struct oh_handler_state *, struct oh_event *, SaHpiIdrIdT, struct ilo2_ribcl_idr_info *, char *); /* The following functions are defined in ilo2_ribcl_idr.c */ extern SaErrorT ilo2_ribcl_get_sensor_reading(void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiSensorReadingT *, SaHpiEventStateT *); extern SaErrorT ilo2_ribcl_get_sensor_enable(void *hnd, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT *); extern SaErrorT ilo2_ribcl_set_sensor_enable(void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT); extern SaErrorT ilo2_ribcl_get_sensor_event_enable(void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT *); extern SaErrorT ilo2_ribcl_set_sensor_event_enable(void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT); extern SaErrorT ilo2_ribcl_get_sensor_event_masks(void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiEventStateT *, SaHpiEventStateT *); extern SaErrorT ilo2_ribcl_set_sensor_event_masks(void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiSensorEventMaskActionT, SaHpiEventStateT, SaHpiEventStateT); extern SaErrorT ilo2_ribcl_get_sensor_thresholds(void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiSensorThresholdsT *); #endif /* _INC_ILO2_RIBCL_H_ */ openhpi-3.6.1/plugins/ilo2_ribcl/ilo2_ribcl_sensor.h0000644000175100017510000000375412575647266021473 0ustar mohanmohan/* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Shuah Khan * Richard White */ #ifndef _INC_ILO2_RIBCL_SENSOR_H_ #define _INC_ILO2_RIBCL_SENSOR_H_ /* Other support functions exported by ilo2_ribcl_sensor.c */ extern void ilo2_ribcl_process_sensors( struct oh_handler_state *); extern void ilo2_ribcl_init_sensor_data( ilo2_ribcl_handler_t *); #endif /* _INC_ILO2_RIBCL_SENSOR_H_ */ openhpi-3.6.1/plugins/ilo2_ribcl/ilo2_ribcl_xml.h0000644000175100017510000000550512575647266020756 0ustar mohanmohan/* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Shuah Khan * Richard White */ #ifndef _INC_ILO2_RIBCL_XML_H_ #define _INC_ILO2_RIBCL_XML_H_ #include "ilo2_ribcl.h" #define RIBCL_SUCCESS 0 #define RIBCL_UNSUPPORTED 1 /* Unsupported RIBCL command */ extern int ir_xml_parse_status( char *, char *); extern int ir_xml_parse_emhealth( ilo2_ribcl_handler_t *, char *); extern int ir_xml_parse_hostdata( ilo2_ribcl_handler_t *, char *); extern int ir_xml_parse_host_power_status(char *, int *, char *); extern int ir_xml_parse_reset_server(char *, char *); extern int ir_xml_parse_set_host_power(char *, char *); extern int ir_xml_parse_uid_status(char *, int *, char *); extern int ir_xml_parse_power_saver_status(char *, int *, char *); extern int ir_xml_parse_auto_power_status(char *, int *, char *); extern int ir_xml_parse_discoveryinfo( ilo2_ribcl_handler_t *, char *); extern void ir_xml_free_cmdbufs( ilo2_ribcl_handler_t *); extern int ir_xml_insert_headerinfo( char *, int, char *, char *, char *); extern int ir_xml_build_cmdbufs( ilo2_ribcl_handler_t *); extern char* ir_xml_decode_chunked( char *); extern long hextodec(char *); extern int ir_xml_parse_iml( struct oh_handler_state *,char *); #endif /* _INC_ILO2_RIBCL_XML_H_ */ openhpi-3.6.1/plugins/ilo2_ribcl/OpenHPI_ProLiant_DevGuide.pdf0000644000175100017510000124355612575647266023241 0ustar mohanmohan%PDF-1.4 %âãÏÓ 53 0 obj <> stream xÚ–Mo1†ïû+|@¢|d2ÛcûŠÚ¦…ª(°VÊ­Tˆ‚8ñ÷/a»³³´Êl=;ÏÇëõåò.EŠ»{èÐõ?›¹³‘ÏçîUß­ÏÑQqý§Îø•/Žs¢ìú‡îdˆÔÌûf.žõ_F400xÛÌ‹fÂ.J¶ôË)S+'Ã\N T­£w "eú  P ÚÕlè¾ ðB\Á¸$ àSµÁ5³V$à y¥ €ƒuw:äY‘ÌJ6äNA²œ­»¤ š ,lvXó\•Ÿ„à`ÈkÅX“ÐÔ,”9YòÆl6ú\ÂñÍFª€ÙºcÅ mFT›Ç$}‚éx3E–zÚɹUŒä¿æøÕZþóòbôF3­‘¤<¢O§îV^Z׿B”LT2Ì­îl(!÷¤ù3æí8VBrY\Z¥¶0 ¯†ù¨·@PÙÆ÷|ì 5X>J%Ðâ›1À³þ1…"¡«ßêç¢úc"†ä(M¡f¤)¯”w}‰îô{·•ë¼Zé3JÐ"[ô¨BªÛìjâFerä9q6ÖéjHm3o†\ŒYÙcP:òЦÚÏ=P¼‰¥™×&ª” qœÃªÄ2…œËQ3ÏÍö÷HépW¹ÊjÍ tT”¨ñ’Ï)…R4 œ¨Tbž#›1ß»…•±ó'ô×ôÍÏ‘íR­ä¬!ŸLˆHùp÷ª²"@ìèð÷ÁØmŽ®½fd9T¿v©FIœþòõþÀMþRèŸçï»û&~ºÈ2 endstream endobj 54 0 obj 588 endobj 59 0 obj <> stream xÚ•ZËn\7 ÝÏW̲EU¢¨×¶°Ç¸qO3Fà]6(š]õ÷{4ãŒÍKŽ4E›×¹E’‡ºñëí¿+¿Þþ†Ç~þ±úy»úiã×u½ý}Ö?Â:æuavL´Þ~[ýðì½/?nÿ|ý÷æ4â}\¿…%ï8’ÞõÇCÜtu%W…þô“£#J ó«À$WŠ6ïc\ôÇnoÄÛWj74Œ·®ìjÕæ=¼Å´à’q„; ޻Ȭ»£#÷ï|ïÆáõ;W{Sûc#à”]‹ ýtô…Uàà¨Æññ'ÇIƒvÔ\Åv‚IPuU§«ˆ-1¹6v q9yLNJÁqž$1¥äšÁ](ÆAŸo£}›Aã¨Oùì)\A„³^ñUGƶrÇJ.¤:‰f­Î'mÖ½^®E× ÷Ê4x®LAØ3Zžðý×(zˆ.4¯ Åú‚é¸Ä8D²—ý!Á1šrW„ìmÐEäî ã°EÐ8£Þ P‚[ ë$¨¸'%¢hR›ä|,Uî,·ì™hÜ{céYc¯&Ov&ø”ÞeëÏÏUPÛØìÁ¡ªëþe=a>ƒmÅhrÒ20Âtî©‚ñ%3+‹¨1þìÜZÍ Ú%—qè¸sÊ7»3Þڜಖ4N%†º"£í$%fA¬ÍùÚþ—jJí%Y6…bºêé¿pê嚌Ф`Óc8¡‚72 0·*ôýш+ùò­¾è“©¨——Ö íi¹€]ªÞŒÈÕPD↢^Lxqãî¥FM¨ö8öB{¡®?-çÜ£z§X GE/~­È(jôÈŒ@ÉEÃRСƒä.×'ÁR)içìì™*pOS¶éôQÊkÈN}æÇWIõ @á•„¥£ðEjÞà<ëSéíÈk;%¨w‚\ìåäŒÒÚaF±Ü)H,ÚD©|öÐ Qc ØœÁ©«9Mâ×àðr"9wÇ…¥*ÃBËc†Å€ùÍÓ „Þ1±³ïAƸÚòþ>dD®H ´•’f.v24&gÀëÉbÌqLíÝ¢ÞýéHÄ ëƒmñ“†÷:gðóQ;%Ìá‘!D´ŠáõRð¢OEœìû £òN‚ŠyÞk)wƒ+œÇ%ŸA­Ì'º³\Ž^nMF5„ÑdSž‚°g¨–+ôÄɨ™ÅPzâd¦ç>,Ex*ñŒǨ™VH™Üï?Iƒ>Ëb|¯4(£ÕØÆ Œ;OCç=÷‹*ãD»¥¯†È¼4®ÃA®[eìñ„ê½’úãQàPJó—‰bTŸ¡àêÒ&n—ñ0àtu­ÎwÉ·ÀH'£¶öyYÌU`uQé3¤d/ƒòG³­RvÅ—±Éclæñ:¥“pÕ­_ÐV½×FmXpþ.‰@9SWIcäl]³ 9B×'p\¿hÈñÀ‡Yjä›À2šÄ3$n¿Ô[€Œ˜,8Nh"æ©6 ~ˆ¨ Ã^gL çŠÃê5ËsÐʧItúýa R4`.'32·À\#e s+Ì5²`qV¶27J1S§Bh g׋=Ú’GeÉú(r Hô9Ùt¿—È|¨¢“£GF„NÜ]ªhðib%ˆ<Ûœ“3ºpq\ˆ{èâ8týB-åÏôzhÔU9Ë¡ Ò¤öR·/.ÓbG9ê¬zÐs&j^Ë'òo+‘—yy|2.ÿ+\“ÇNîwõž5ÈÐåSÕYìÓJ5su„¿^ÑÝwé_5Ž“¬ dxöθPofØ·êÅQ!;ZvöÆýWÂtŽûPcxÒ1X»fmy „5’ŠÝ³ƒÔµýc\##bûqÊ:Æ{Cå#éj+&F/kœl¢JM³Kí„ãï¤R>q=ÊÈ[«@.Ëg Ò-ž(ÎR¨1D;ÍÔ‚ÊuâˆÒCíXû%]›l‡ffìöQ^nlL¾ÿò4ñN‚äñuBÒ®ÓO4c˜µ¥OÓ»n'zŠÞÕ@cÕ•tÝàÑaY`n·óû6¼À ?@T\¿òæ¿£å\Ò6ˆs”‡D…žíʧßò,0ËÿôŠ^GWêΧ û~Ýp¹]=¬þYuì7< rô¯Uj=1ä<~ûõ÷æ¯ôûû_W»õßX÷?'ß endstream endobj 60 0 obj 1855 endobj 63 0 obj <> stream xÚí]]o7’}ׯÐCbO°Ãâ0O £q 8’-ÉöømL°˜,°û²«úÊWbêî;³cÇq.-ë\~uó°ªXUôçÞ¥˜3¹P=ÿŸ¿žyõO×?œe:¯9ÿz–ss5.?üíá‡"?Ðý_~9û™«xó¿òñgÿþæìûçþ<ò?Ÿ…s®û<œ 6—|>óëÙ>xïŸ|÷æ?¿/ÕõÞsýS» sõÓºŒ0w1\äAjÌåcLðäxÄ›m…@® ;ù¸¤w>T™¿|å0ÓüϯLQ§¨zþC®P:Öô ڬͥ–¸4y3L¹Ôx-?ÈÇÛq¸ÑeyF þ|UWÙ¿g&9_y=‚º‹0Ëp—éŒÙù„µ}ð1Ìr–³üý—›7•\7(äƒOX¤•óÒýòÖrà¸}n´æø´%]é÷rùÛðÞFbÅÆ¿A¼=|{¬x$âœÕ¶ÓÙÌ+ó«ÙÙç¯ÙµŠ³9_ÓYÎòóÓâÀ†Dƺ<°ác"d1r•bzbÉ—óÃì }ä¨`å£ÐYÅ`¹Tƒ®¹Wœ˜ô[xAÙÕŽ ErÁQLºA\“Ï;C(Á5c‚Þ‚ ªwÍG@œÚø™•¸Ó»VœÇvç:˜å,?#¿ÂúC~-y€Ô_½K%æÃ‡Ä¿æP ×Gþ²M¨N¨R}åb¤_r¡¬Ôû#RzêÎG„fbñQbz22kq-âÌ(f®gœšÑêRš#cœïFæM.)A¶¹^÷škÄ[B±ÿñƒõ…v†ÈÚCè Û¶¾ð{‚ Ïe9ËYþ?èÖS š¾s ÿ&iÔïYHFà¥7+Ñ·°è‹_2äÆ$ì_yq$þK­ä÷Ü~«¹5§ ?jnõkÇQÉÅXOG«®F¬nÜx«#£ºë‘ ƒËÆ„ÿtüf$Ê6ç±á«Ô]#œ‘;¤âÄ›Wîø¸ç›åWG¡ÉXéÞ@›r|ls­þ¼°ùAVkÙyѹpXÐ=8`n”ÈzF¹ÐseP —šÜÉ) ¯œ^½Çã+–ËÅJ­‘óíšå,¿æã,Å–B¯YÄO Š{zÕÇY,P>Æ8ÖïÕ•ŽÀצ„Ñ€Àª(Í ~£ ¸IÄ5ºA¬Èû ëЋÇ*ä¨Ç¢ ¼‰4šLBö,áâh•…—\ m§û¹ºÔ »?ÊÊÉÉv£0?a“ÏËtïç:˜å,{ƒ¬ËµA ¤ÒÔyɱ½Â,z†§U?|“#kä{p£=Z$¤–È!Ä`䜫ø€97×:‚#r¾5@Ýj›Cª;}¯ž΂2ç–ƒÍ\ FnÝQÄ~Í2ËY~Æ…u‡ŒËŠ:˜ ^Zxeò%€_­˜m™ê)`íÏ4QúÚ”µÜZ‚.µÜJ”ôêȼÚ«'Ì­æÔh AɦbÚÜ©¨vKÐ|ig9Ëßи ëq$ÇêÏs«ë¢k›5dÌ‹St«Ì²¡À r™œï]jñ˜e-ùIÓ¸OØØH¹!ºJZˆôör¨¡òíÑ{M‰ÏÅeæòÍaŠ.2—Ã8Œã¸âauWú8Î7œº;ƒðYaÀç9WÏ,gùʼn¶¸NA´ÍÕ ò‚uß›+½zÔ‹½„ $]¥ÌWÇ ‡%¦É°‰Ñ‘<˰Øë+í¦Û‚”›.ëçAçæ²1ö5þ®ÜÅÒ±bm1Èàïî]Œ}gÄ=»^">Ã+ºÞ8Ð,gùO \XWH¸ED|§Üq›¬vBšé•o*A6»T€ÞëèXÊ @Æa[rut¼Ôö æÌ-c=õŠ)°F½%ñ.µ×A–`XÏœ!3ƒÕ]iëm0«!:÷â¢Ç©™ki–³ü\ ë,%mº ¶î ZÅ]¡fG™!š˜Ȉûó@×Ñ¥VøR¹Œ…”óbÅ5x—3¶ýòØ#y3O¬ýîkq©Åãš»]û÷pBWïÍHüU<1°YBÔôL‡¨‘ìE ô­öøÍAO`Ñ'ç{dAÍEé«ãóyq?fo‡sÇ$g³ØÈ\À³üª‰ÖÃHÔ"]¥¼ncfn•H'¹TⲬ<¹ÓÞ¸”±­»MVÃ)Ùß±XÕ» ¬ªà«2ÿ}‰pB‡˜6J»•7ž uøÆ;eÝžÀÀÛaŠØÚOëÇŽ …šËb Qß¹xÈP1ÀŸC™Zb°ErOч1ǃ™kj¢˜Ï}ÝïRÅa¿AÍQÂ>‘%¬?æ·g9ò£è4Î?Šh<øIB³üíIßx-‘óã×áÇŒa/AÆ–”IN±Ô•Xè.{¬~áSãÝ%|á%gCvíßë3·°·¶àÌâ®Ä|ip†·„]}¦íÉ$fvúV›*2!Èœ“(5@Žtêâ%¢A§KÎÌç=b+e¤j~³:Nè%ĈGžú&F*뙾ԤmLpvìølư¦(á–ö[7 Y ¬õä.‰ù.û5B¥”ÈµŽµ¯¸(%VîZªÛ¯T9$cƒ6X)™¶§2ÕĪ_²{7¬u^ç‹>ÌçʬÕfE¡&‘ÿÎäÊyñ›Ú΀ˆ…~BÛïEžlw4 SŠ,>tûzÏ™ˆß·ˆnnC£ Ή|߉¿fÞõ"õ*`²‚›Xð7ÏÈŽUªÈ@Ñ›°º 4RGÏê"U˜Œ¸½®ÖI %@—VZ8 ºÑ.,¹#hŒ¤z`·Íæ²ä÷¬;ÍÙ÷°ããZîe7›cm©>›[}ÀkMæxšÍ$&ۢ¶¾¸_ ˜ºIBÓ{kÛ;$óÀ†§¬:ËYþ£›I4ÖS"¥ÔPÃ{2l&r°[€ud~æ©RäKÑņÕ|ôÁm#D®éELº%á€VÌ6KØ!¢ §ø—ô!‰›©P] X絡¤„嘆6‚Èåº6 1U#2"ï´±_„ UÉhÕ€FJ'Zö 'ƒÚâ5ªAïF ‰u…ÐwšciÞ³þ±Ýo”ζ}04ŸÚ–¤‰0[ÉGE‰÷¦Ž“;*ñ±rÒl®VÊ\¯q§ªä%SC·WˆRµ*Kü¶ÖÃr*mNÊœåß±•àûƒ[IÛ‰dQÞü¶)©£èVûtŠã½Ýé%ÕhR”ˆë½KQ\H3€žè£loÔô#î~–ÌKÛC”xþÚt$¨[T$pF E¢ì̈(y§s‹Skè@kŠŽuM‘èÛ½;(ß³¹ªg9Ë}¶gê öú¡ûRŸŠPõ{F&–ãEQÀë•\Ï,wßêL,ÌU; ègIh’ŠØ¨@U=6—µõˆ‚Ôq;‹ž)ït<Ç%î`»ã¹-qd0l©Ü1äs3ák¬´Ó;¦ö’qÆæJšå,?537kÝ­2s®hŒ¹ÔÂtfËFÔ&$¿òµòFŸd‹·©óî(¨ ¨ 9^‚.µ43¶Òt&ãµöë—m/×]6åéO8ÏMašzÛéÜ}ò+˜±ùöÏr–ŸŸ]q~dW°v­;˜tÏŠ4æZY;Š˜ùæ½¾g±” Kíx/Ùü5®?¨ A˜Qø™„zò!—ºƒ†ÿ ×ÙE¡€ÊÚTîÛm¡åZ ‚¬1×í 䛌'ùÖt#MÆó4X_ÒìÚé]ï.÷ˆS6Wå,gù³7®§UöNaŸ½ÆdïN`ïN`oÂËkZrA}kû^IÂÖÅtštZHúê.æ&ÀõãÁ°¿ÿiÎ.Fí´b+Úö\H2€(‡ 6Þw¸–ŒSÜ##b¤a·vzwÎõ\³³ü ,ÇøÞ¯rph;‰JáKèû’E#Uv¬¼„ÍhÐ¥6÷„m*»²Hx @×:å¬xk!Z’Ð?Ÿ›74†ºÓ·,¶Ž†3;_ÖYÎòË`qÝšäYý9ù¼Îv’ä0d “Æ•0:ÇaÇ¿ (~”cg©ZxS!­@ž ¡:=DùxªÓ¶'c ˜ 2|3-^Íiø&–f"×|ïï¯Ýœíûûk5f®•YÎòr.®·55õS.>ô\©F&C£®G¬Ó½aµ'¬’£‹†¸,Þ ‘£%Çr5€žèe³šnors-!òV;*ˆ`  ··]Îpc—èâ²Öl¤é>¦‘síÌr–§ŒõCf¹gN¨}ƒbX·—¼dP ³dKˆ¼Õî^e,­P ñ0öz˜æ[ ºÖ9¯‰õr ‚œ×,(èÎpBh.äºÓ¦DËŽ @¯lÁ3áæÛ=ËY~B–Äõ¶Î’¥œÀ’ ´Á’¥œÀ’´Æ’iqÕÒpÌš!&ÌÚ* ßi®,A—š+%³·]ÁuݾîÎ` ºÖA’DEƒ”“€_R%ir„8hùškd–³üdZ¾±Þ>rí˜N"´%Ç Æþ"¾Zè1;6È×+Gõ"Æ ð'pöÓ û$!Ÿ‚ôS@Íö†UüÙ’«°á§M83YŸÎç’ÁmMÞ‹ÇŽÝgû­NÎ$™®ã“kGÐ\e³ü—–q|Âi[ø¸õ^>‚‰~aJæ›åï"÷ܤHübÍ»QícEµkŒÕ®AfT»)±QF†]2r’$®«)I²K¬þj¸NI’ ¥×Ý0£"¶Él#Íãhy¾Û³œåçãÌšOæÌ÷£Ð5ÈŠBg±VçCÂcó%`¯8rï> stream xÚíœMo7†ïú:´ù@†ß׉•D€cÙ‰œÖ·iP4ÚKÿ~gV©lÎ;« ‚Ȱ´œÇ$w¸|gvHÊ®­ >%*RŽeý÷o++~µ;_…¼.)¬?­R´¦øéÃw2}˜þáãêUqý_~]ýt½zö®=}ø°rkª{íÖÌg‚MëëO«G·ÖÚòøú÷ãÿÇh‚+ÀœÝgR¢¶0ÏùrÁ—Í}ºzc}ú3vb7Nÿèv¹ÇÎÉÛhr Ç¿½µ>Þo¢D“J| ]O¨ß9ØÝËÆ7¬Ì‚œó&:äÕtéHM+HnùrÉ—Wšioú]ñ8ù¨YÆr”£ü~ÊN:C É­ÍÛÐ)‰^nNNí¢'¡' z”Z |yÛIеD`•;¾<ë¥È„un{(˜h±º³Iõz}L&V$÷½*’‰Øfî¡jy mzé ä°¦Þ±˜lzßA‰\@( Í¥jl Íådrm8æÐZ¥‡ÂÇct)½ÝÈée‹ÍßÞvTKÆ*Té¡fB® Uy~²•q¿ËxOQNÅFö›/ž¶±§Y•›¼ì¡lbÂîß¹áí»?LÁ„¢LŒj&Yìç%¸nŸ›É¥ió{Hæ(¿½ òÅ8Eÿ8¨þ\éŠJ•hFW$!Ô®šcQäŒtµHvÄz{å²Á$¥‹¡‡ª «:;¶þºwHÙ Øõ;ú¥÷8ÅÔìôšßHg‘*’Wú[ù»xÿPœ‰¾hã3ýQŽòÿ–Lœg³’É]”Le¾ÜHÅlXÛÕñ²ëuŽÂ8×+Ű²h¨) „Úðå¼ËfbÃ6H™t­´“yP:Ö‡¿±‹Ùãm&²…2}“ÙÑÀâ@\ ÔfŠC£6¬cÆŒr”ßDq«6ߢ– á‰N–H©XT\=™jz׿5ä~)2 ÁN0¹  ÉcÝ^^\2¤¤§ûç¼'å®õ’F/Ì“3êU4ÐK:¶¦¨h´&ç¼Ðd¤x¹¡q/z=ŽÆlóàó¦pùx9Ã~´`lBsÊ4F¥—¯< cvr¨+¨+Γ¨½ß³º†&ÕÕ¡º HUWÁÌ««Uu•ÌœºFS öï©’‹&áT}Þ—ÌWBý |&9¼K¹Öç#Z·Å£#Ù÷ídº%ˆ‰©&‹5 ¥ ¸)=¿}ÜS$úëê2¿,ªëSl0Åàç8–µ²Ðð@Ž9>ÊQ~±öãü™Õ~Ÿ¥ö{Ô~©Ú/˜yí ªý’™Óþ@:…7Ñ/ºf87+˜ ,Sf¬Wx\H&E4ÉNªz.x"üNÆ»xÚ.‘ÏjØ1\ fÍöïói¯ÇžÇàa‘Á”ÞŸ) •^ ’rýÑŨ‰÷ ^OÅöæRó“_HÚÓ8ô`”£\x£ÐÄ^ÛÉÂ~¡œ>IÉý2vð ê’*u:‰ îonÉøŠàÜöfG-·økåôd6Ù"¹Õ±¹Ã:)”ç7)IzØér4¡aûã½ÝHÁlÉ#Ž ¯ Θ£åW†ÕšØÍÉgvKaµãX,ÁL %!ŸÞ²§ÒkˆÀ¼¹sØí<¹±;7J\ž¦¬±$•/‹V¬óö‘\M(çSg%ƒ¥0ߟ6§ÜmB»_ÊŒNihÔ½²0ê§³A’<;&üÏe*¥$‰'Ðóš¦ÇŠ÷p¦²¡™sZÒšê±ÍŸ{ˆ¼Šòu‹.žw*Í]õ§)ièÙEžì½By~;:uw|䲺¤Û¶'ù=*ÔÓ#ï#ïêñ§g§ñ,Q›•CGùýù£Ã ë’?âĹ‚á9L Í*’à¡"‰«‡Š$¤*’v¨(O;,%ùni ä¢8#ȧŠ7 _=/a/G#îdþÞ±£8iÞkãÑÊ[ü:…âMVlçµÃ5o|Á»Hr¼ÓŒ®ãÇžÉFyRÀ=xïé ’ÐCÅ$åFïV·_}¾e«g'š6†òûKèĹ󢇽7ϯW—«¿¦/¿úD×Ò<µW‹ÓW{Ýÿ`§/÷:p÷~Õ¡ÿýýÇÕ~ý'Õû/Q\¨% endstream endobj 112 0 obj 1966 endobj 141 0 obj <> stream xÚ­[MoÇ½ï¯ØCœÄ‰0îîêÏk@‘Œ$X&%‘”á[Û¬É%?-/¯†â.«_Oäà‘I¾íêúèzUÕ³îè )។c9þë—ƒë~u{uHñX’¿RªK ë¿ÈúCüú?¿~Æÿ­¿þòñðÝ¥;ú|üøóÁ±öÑê"1?~9üñ'çÜ+}Ü|ûñï'P΋‡ôx¯OÏ%.Uoõq¥‡çhïüâ ¯{iAuÉ>Ž…¿3HŸ—èyk@!-â+V}Ýñ ÿýòh&ÿÜL ŸðnÉQNŸ(v—ai‰0oõqm7Y– ¹=2èãÃ¥=n·ƒßèãÏúG„LèW“#0 úƒ¿uM²›+e º|6 —ãÎJµ¬áÛaÞŸ‚‡-ÑñgL<ï—&ž@ÿÑÇA†°ÔÂVùÓµk!:‘~ÅûLi)®ò¯e+cB7Àq9øá¸\…@÷ãp µ-Á³Ÿ9´Ä¥¥1Ph⑇ìêÇï 2É‘ñÎbÊ’*¯vAIJpTrfä½Å´äÆnN”¿´ †ÝËÎÆÉ ÂZ¯ywH¢’ÊÎîjZ|`Áo ¨¹¥æ2O"±edZޱŸƒ’æÖÔæá•[¤¹¸„ Èƒ|w"1£gA¡“w‹–#a|[68€eÛJbcp.U:–Àþ¼³Lqì… ËIJ„ä_b‹„ÚZx¹®BùÖ ßwAhl‹… æniÇ íÐdÇ -¬ù{zb,…£Ã² #û6‡âe-`¦N®Áq¾§ˆb. öô£%u”øÂ1ö“óÅâêâgnã´(o£§§$δ1£I.uî­ˆV¶ ŽƒµqA%3ÈÙ?œ6Ëͧ’¯ä¼#äucÉUqÛ9ú+ù¿³ø,ú:W6Áy¥äy$x.Î}$šº·m©(ÚxÛÌq)ŽÃ%íMù½Æ£,µm0{àšl>ôóÀ+žcî%nDŠž¡~gAö„Ù*BrƒûÁ»Î[v&P×y;PzÞY •e¼;H¾y­D { ‚§œŒmü©/ Â`c·c´‰2ðI׿£*˜ínâ½ 1–yÇà{ÿ8zÉ@nÅn¦–ÑÐ×,³™š6󕀯¤¹,MÓx‡1ÖA$xÇoÎü=¨s5¿ñº¿ë‹á" z8-lKXœìXç[õÚ|—:ÞëÙïÓ)\ŽûS¸óöw½†2€_cÑj˜±k†?œ2ŽU6eOp{°Ð+Š–6qÒïø\A-@Š6càM?oË!íÈ¥…ÁrV͆üö•ÔœÄ_‚Ö„¥Û‘XÈKìp;éÈ@ºM7¢4Øtas†XÙ¶)°CÀŒnu“—“:! )');jUÄŽ³Ø «åý8|¯û>!'¶75 ±¦¹·ÅWô;,s6¨å|­}g>’GfÙ¾"fͺêëLIè'ãØ•V*è[»=µ~^êÒò/N€Ó@Ô-ïh½w´hÒ²Û×^«q©ãMŽŠìˆ ¦£è‚gŠ©-)윥˜™ƒÄñš‘°h¿£xEíæe™%Jõc­¯N®9œ<µÆ-:à[®„þ¶ú8°£*4¹eï´'ô9upÚ­LÄôÚÒÍ,¥¹(L5¾Ð;½µ´K¦@ î tÁÃ*ñh} !¯©ŽÖ¹M˜t*ÆL5ì­Ô@Z™@–'Õ˜Z,†Áìá¶Ÿ¢5­|Ã`ÐwgǺïä˜ñi¡OÛ aC¡•òÜÞÁáHÕ47P@ o‘M}5,©uÂÞ#?[Îzõs{A¿$,ó#Ø‹.ô$-¿U¡£JnÕîsžÎáŠã­Þ[R]ىĀª V²Í_Ù¯÷Uäip³£Š¸úX•ŽNÖË2™^rICÐû´AÔ]÷Dš}˜Gê¯G}™K Ë F7èIgbÙjçQ ·zUR›ëQƒŠl˜¹3.+QÜ×A"ݸÅWš ƒÌµq‹¡ô(¾²c"YV¿îïqjÍc¹ý=MKlŽÄ–pêãÎõ’[8ê’H s)¹ù8¡$S‹ŸM2Ö«†H Á«â— !eÀpõ1Iù¸sá­“ &¼¦í¤“ÞàórƒîÕEfä}?O*:Ÿî@©Ÿ'%'c™¶ FkR «ð}ßFáñ•wX+_v_y‡uNçÊê¨ê¬ÍÏFE‚ª¿òJ¯¡dŒå[4-‰£òs?cÒ†i* iVïžçÂÖyBÞQ |)…õ° 0² §£²Ökc²þø6Qt”x³|›(j%ÞÌð6Q$?æ‰Y,k+é3»å•¡„çýÆr"¯Ãw‰’3šWâÿí.Q©®%•ÿÃ42ÕÉ O‡µæê<çO2t:„tÛîÖæl”Œ¹9_×ۦ­Åv·© G@Ýks¨€ ¾ë›Žë\MÙyÜÊg% ÞØå`z/ eïn:ýL¥ëý¿íÇŸÕ3ê¶ŸR›„ô©•Ò!-÷ †oB$”óåq[ŒºîÛ;‡TÙƒ6®û|Š+eÍ•…O²„Ý!iú8ÖucŠçÑ„æw„ã„D–}Ó7ú~Lº æ¯°Ë^èÍCb£<ôã×xó÷}ó×b{ƒÞ¤Ö ôÓUá ¡6.!upw=ÆA”_z9¿ÖѤ¨%­ï.}wÒfI,büVdòlK¾ïTž5‡¹Õ• £lè6HŠ_/ˆ(zír]hã…mÇó†Â!Ô1ÚøÁá{׿©êô†FN‚Î\«CGÙÖVß&D›ÒªÅE”o,;ðë":~©s·D=€®Ž¤¦~DÛ û¸ögœ‡xÔ>¨†y¾Œ"ë{¥ÓÜáw¶ñRsD'_*ÉÕ³£Ò“R,Ú†r$¼·ºƒIrÅÿ‚ˆÔw’OQþèI//‘žó©8úAèë‡âson).ÿ}Xa ‰/„ýRT᯿ùíðáp£ß­8ì@8¢hí~9€€jr"à |Z><Ùãk|†çÿþ¸±+[=y²…@xÚ̺å U•2ÐæúOÑòv1¬žÒz»¹½ü TjŸ¸áÃXX·6¤!,K™)sŒ¥_/eiÝÚVA8Êi›ÒNáræ)îÆÒºµ¿‚C‘å'Á~g*Ð/hý,ØÏá,ǺåT@|¬d·<„»ø»œ ¨ëwž&ž/2Q·„¸¾4¶-àx‘‰ºåT@}äÔmOáÁSH¯Ç"­ˆD­ß|™ˆ<d£v`)Ýš‚RÆÍ‚÷éï²Qu° »"D {önrøÏ:ünûÜ÷ËBPQ¬A'€péϺåT@YÜ,çŸ/áµ~9½€§v÷ë—›©-jCYú&µµÖúòFÜÜ:¿^iuÀ7‰ªqi¥G_öƒsÞ"wŒÈ«(qI¶ô\…äÝô÷À¾äÆw_ýp³zÂÁâîXZÐ¸~»îùnýzè#îÙ¯ ôéó¿îÿÀºÿ©nô endstream endobj 142 0 obj 2973 endobj 147 0 obj <> stream xÚ]ÛŽ]Çq}çW [°ae«ï— @ ‡—¡8àp†œR"Šb;°(G‘àKþ/µö!ÏLתÝû(>²4k÷µªºªºªÚ½ùû#wöæ;ùqK 9Ë?rIõì§?Ѻ~öèo}ñÔùtöæ?ù3Aœù³XÎjJK+ñìÍ~÷Þ9Wÿæ?O~ÉҊƼ?€Úa^ãç?_áçæáµ,¹UúäñCLKK®v«/ðsñì]\R‹:€|ZRîúl…´„Üt=€bXœºA}ñŽæÝJy ‰Çt>€rXRª;Ýå¾ÔÄKpÇ‹UdùËÎ kZ â¸ÂÏ-€îì™üïOšòiª¹³ÊRÒMÉÆöLÞ›¿ßX¿DþìH]j‹›Œ—áoñóŠ6¶¥8Oðqae bLºW_®îxå¥îhœqq‹/@ãÀK^j;-Õ(ÜË-Ý×{l³ûÅm>Aqiµh žàÜâïÂåñg„{·´Ì üõjfÇG²üj€Ç*0Î7-$Yj×4Š· ,Ïf&àB©K‰Üý á‚ìOw ³Œ ­-Õ íB—y7Þó§´êÑIsƪ´EdJ¿z7‚DÐù6§Ø(rµÖ½î¢œW®Ú{1"ó*˜¦tåøê™òŠX%fAL÷ÞÜOƒ!å\?‚ÿõÇ~øöÿ°Z"övVº‘Ž ÿfr}qµˆ7Í''A ä«ãÏããŸéÓ!xîâêø!…àº+ôÍ8¢ž3Fvpr^vîýÍjKq¥AoC¼<2ü “BhKªüáÈ=Ñ‹–ÂC8§¥ Ih úvCô™{ùõ»zYšç.î9ÿfd°°ž@þxÉYfìðHç!,­óR)V…®ñè¦ÌPj=‚…þöËÏßÿtùËÏÛ QÂ⃷UQ›DùKÉÓUáîN oøp•EÐjä³ #ÆÅTüõ‘úŒ£ñŒÆSÄç¸ÈáÉSbV-²‘‘»¢õ³*Üé´ÅUÑÖ¨ ˆ²åF ÊŠL­òÕÈ—8×»½ŽoGæ ëá@ãArç9M‘øÎñ¸Fi”D‡1–îHÞÑ oQ‚?;.ãдhG¹B_~lß Ø¾$†~³Í1r8>Dª#êQ%ÐË‘¢ aÎ5¯xÈR„êÂ#º%©½‘à‡‚ír$ä[Â*æ yu¤Ò^½¨8…çòq§ïqròݳÂMNP×w&-º?aÒÁeÙþp¤ƒ/2‹S碜^ÆÖ0ÏᘋL1£:)zQ)L /Fe׉Ä+3*»btvcom– "ß’Aô|ÝØã4/È&õÌmo°^teñyÞ[ÏX= "b:oÚÓ£Rp7j³2üœæœEl•ºÃuPdCâ–î%¾Ñ»°I³Øäýˆª‹óÜý¨qË#ç!SõêP¶4IlH1,æ-%a¢fÌövôaá<½»”…&v=ᆾ³ ¢1T›‡ƒ>Å~8ò·™E–+ƒ…œ>:HPŒ ïyFç£k¯È9ßæÇŠ<Ÿ~N½ITÞšò‘eHEïíÅäIËÔ Æ'Ôq“Nô »É{í‹E6Ú×S¤÷þpì+ø¥-P¼À2ÎaÿzˆezÂú…œ!òN:}íK¯;˜&Æ`*;ƒ T^Ñq»Å  ‘·{nغ{¹ñäåíóëË—·_^ojé¹Ác¾mÖŠR  †'Ö×õXSÀ©¯FŒÐ£þäZ› ÅÑŸk?Œj…aÖKgYK$Žöb~êyŒ˜²² Â¼ÓžéÌ¿`9Ó«4V¦«œ¨f9›‹ûÊ`縚³)„ –\£5#ã5û:&ÜѱÚk?2a’ŒÔØ…fùÖhš£Nž¡ P;OìãîêÈKñÞù:r"¦T–î>Ï÷Iì-ÇLp£ýhÞ•)Fç-BýfÄ@9)æÊ¿õz/V_Û+'u)ykÅXÜÄ„‹¾a¬¯¾|s¾a—1ù“çÖGãVDX."„©õ7¯?ƒGB`¢—kx8¢G«9À»ÎðßàÇúZ¢|5¥£ÂLÄ£Bž$Õ7¶€T [B*ÐDD*¤-#h”k²ÅÅX›í®wFwÊ]/jsÙiH¸ª^_ât‘¤•a£àºè'<ò[ó9 L·$Çë¢1¡D.Íç„«ÊÞ>D1ûpwèöy¸Rm4îd—£AY†Ž"R¶f{÷¼`È1s»éòûŸ~úðã†ô†'0ÞìAoÌ´>^Qž›½"%ä¡nnô3È<"·´q*E1|‰±N¼¹®äØŽàe˜eÉ!fèU’ Ñ«0â´õÂà¨)úf"úò$ѧ¾±EŸÙ¢OÆëÒ—yˆ/õõE®•@Ê}‹î<ôG^Bà‘?9^Ï ”«k¸þfäYYëàÛ|"!<3Ó‰„ ÝÕ¼3\‚¸Î ·MÉ!ÂéOäQ®%aÌÀœ 71*3seSw¨Âz¼NêîÓ~?ÄcÑ„ïIúî8Ô› 1—\K»?*c‡“OïÈËáFi¼[£¼K}‰)Î÷=fYû”çL³Ø,u‡‚¢ìH ugL"9W;DOqE!Ø<—±áÄ̋ž=wðY(݉nùqo¯ÊxmîÅž‹<ƒ×l"˹½'ä|ñ¾èN;$‹A,Æ4D:ÖšwšË~iÆN}­½ÍXßkíoìbÝΧ(*G,<¦gÚÕèw:[U‰¾ÓY*ìÞÞ#vGT晹ë0;ÄGM)>pM)µðèÄêpªþ¾ùïïzþáo“È$¼Šh5;|Úe!¤N k}_Ò·dÆM1‡ãTmž¾ÞŠ|«î‘ù€àj<êÍHÙº†6h¸Ò1E߀TÕmŽ x? s®cm¼hÄqNpV–ì'ÓxlÄÀʱ,ö“þFÇÀv9Có|CÎkD©rˆ/ \J¹ï JôÎÚyk_óâX6†ÏÙàŠØàÛ/¯ŸùÇ‹'ÛL ?÷ûkÌä$VÈSÌ;ýiÞiiÞiiÞiЃà¸`œžåƒÊ« #Ð2Ä×l2°Þ óÒÖY`¡yFßh>  2Ü3ɯ÷_Ó5Âñ‡p 2âèD¥IFs'D‚C¸ í£‹É ó}Ç% ÞÞ‡é#¦$oi˲Zëp­ä¸Ÿ'šÍ-'T×÷§ fðy§G0ƒÁeÊ¡%=º²Ó’(›«ªf-Å ÃWå–ÚNÇ a­„UŽü#¦W±#4j›¯lµÔyæ¸;gƒ8R¢zºIIˆù$ÜF m“<†0“%£‰&\jPŠ2är“ã²Oö„ÁTÛÒ ±£óÜäD;’6Áº3¶fŒ[êp[‡9!d#œ0ç'I[ð'Òj|8†—ˆâá°ô taûDwP¡+¸qéâmäS}páæW#ïÔÕ€Ž8ÈÕ7ïtÞ“µZC¸Üˆ,Ž‚«F3Õb°5ï•ýÆ?ÿî»?üü—¿|ûó_~ü ý—eÀ~÷çoúö»Ÿ¿ÿéýï7õ( #{šO¢AO66"ˆj´ùòxQc½ç5¨Nsˤ#üXD·ÖHÝÿü—ÿ’´X :ý s®ié#7#ÜÓªXjø¹ÎG žÛ4Ná oâ…¾ÖxVÓ ñF< aûÈ3•9oÔ¥r¯Œ8Æï Q–;ô²3D9½JãÉ>=:ÚŸ—ïr§íÍç°ä(’¦^¥‚ÀÊ$Ì íïm5ÏWbB LÆ#HN‡vZ™”e$ÞU'$ËÍmZ¿š9’˜Ï=ónÍ’“¨bÅàñ€dxCá›™ò ÎãÔü|ñÒIX' jÇÎXË-÷³XœRoêðž”9dˆ—mãÄUÑ4—˜y'¿ãO£ÙñFâ*ö¨ä“Ù ϸ×ß\ëœö˜¸aå¶=¨Ø4co„‰"ZcäTA ¥­Öõ­_ñ‰WúÐŒ *2’Ý;¦• ù•ª úVOó¥D’b ¼Þoµ×Zï[М¡( ‘u1ð¶ CÜë;ž„Šñ²3WiÂ[;s-‹KƒF—vEÔnÝi 1=쬴¥ÊÓÝG¸žwaNB° SÚY‚§}Íóî"ò€]´¹àÊÌÁÌ…§À9˜<ƒÑRÄ…qh;ƒ[SKxšµÙ\»ÿU’ágΘÆã^RZ/LéçG2~9š­i½a`Ưâ|E™=0;'j£ÜD 0Ê bjµ]½ŸÓØšá‘x*ïÆc4­¡ËSzH¨/÷ºƒ{ÓØ–Š©ø%…9í§RM5vYËêœ-IDºE‚¤×Áx®­ÛœtOŒwã™í—6Z‘¢×[ÓE|Y¼q Þê3½g冂‚3=‡mõÓÎR.Mvzmº‘;"…Od!õP¹ÓsçÙ£ß~„Ê^4Qs…‚»ý e¡´Ð 4ê-%-ƪ\ŠEf,„4×Úš…d¶¹eg¹,œŸ¯9®rz­óYßWçÞtÖÐ DI'ÐL[[}·³ãá(Üî7Úk g‰=6þºFü™4k„˜÷°ø¸C¸¡÷µ†ÁtãÊ,ÌwªºI>ÝzºpÉjt[S¸Ñ'\Æya¸³Å&;l…8¤Ö™X8zÁ—H‹6‡øø¨íRÜd5Z×§,\ÍÙ ˆÏYÊã¶µ>¯ ’s¶ 0^Kà}ºÒ¥=|Kbã©;×q¯Å3èj̸Ñ7¬µù†…[m“­2Â!ôÅ+¤¬ç&B%‡uÄ‚1ÄÑÛ‰ÂHÎωWÎìµ0Òt²b‹,ÎÄËG# …û|§+qù¾³Àø#ªƒ™ËÚ="]ãyÌîbE„}¥oøž!¢Z³Ãx–‰Ú¸±v”x»>ñŠf‹pƒ±V£pq­˜3]Pxi}Ú‘e8­JcÐ(Á …5{ðwº¶ÀêÑRÈ™²›pöÇ×ðâVƒK®ÆaV¿Q Õùü`˹lÈ ×]Ý- ¢ÿ©(ÜZly>óhÌv0Féñᣥ­ç÷w»{k†#ÉxÔߪE¥šN,…4Â,æ xEžÕÄýÞéà e×4èéF*’n#¯Ù#³K”ˆÆ½ßPúWòö¼½Uwú꬇½S!;HïåqðÜ ðQÒDÞh ¦‹öD'­öÆ„xaW³€èGæð ½£Ú–±²* E4¦nP÷8圗blç}áÖ'† #JLÿÙÆâX¨Æä¯µË•X4ˆì›ÀËrïå°’œ)”Ï1îõ*², =„ü›\ð³?ü{WZ½ƒt>šŠ7º |&úã"ƯhNÔú¨< ˆÉ¦A£¶,¬ˆ¤C º0ŠîƵäá¼Ï|HÕ WF½Ü,Gtµ;¾ÒQˆ¾£eÑQ¡ñ<.m#¡Àr®hôûxŸ ÿOØðñ žRnõz¡ Ž!Zb>¦ÖÊ´´”ª–xý"g(¤ì꜎_ÐíüÄW§•M7k¦#WŸšü~â ŸÔ5²Mß«Òm×*ñì©>aã§ÃšìÜpôøµd·{«ícÜXjÐ?ëjÙ)FFtr0@< ¤ó T±F~¦¶¾µ>‘(j€^mÔô€¦ÁýŽê…?ähÐÝiÐóóæ˜@P Lª€çZÕLØiÚ ŸµÌiõ7–>´ÕU§‘[$”P»KiÈüÐ ]}ª/­ð¯uus£%cµ­ÙŸi¬œœ.q›[$"‚ ´òúey5èŽE‘¬w=e˜‡Šäy²ãJ"r¦RѻͭòéH˜À¹oMmÃË…»r”YÐßl”ê‡Vêݵ¾2ªŠ*ë|G¢jfÌŽæ‚9@tªßÐH3SÌ?ž÷:gáXËšÙerÚvÈ7c›ÎIQ5XøŸv‡âlÛaø(„L¡^ÌÖ/á¨ÈÜ0<)âJçÍ!‘ÚàkÓ݃ؔN(žêNsõ¤Aï´7=zÞñ½!ýß&ù ÖÂéàÛ)‚•Jà­§,P­CQð+}ç‹» ºÓ:?"z4hé ¯9Ê$h¸Ò â¯5îbàÑMüµˆõŽ  oSžÞЏV¼2»¸¥tÝ ©<ÁxD!äùäׄޜì¼Ñ ½9ñZÞgMŸÛ9‘Pˆï«–i¸¸u…‰¤èˆaϧZ`µ{ Ït¯h‡åõ!•G™çÃ|xp‹”ÂÞгµì€à=4º»ÖÁZ%ù–"4YÝjz7ødÌ×cªÆ!á”Ëݦ¹+㹈.nP»Î¯ªñ`›{#ìÿíQ{üÊ( ç³_ËùÆlsç…ÆõÄt ’‡fÓ¨ÊCr•`¶ê¨5Q Þ¹Ö_µç9%à\l†âRk.“A}Ö¹WÍŽ¯µÛ¾tžç;í¶Ïa‡ÿ×T¨Ú7Į޻ÆÚ^é¸kçËü\Ê¢ÑÄ´K¢Ù ‰ú}ÊÂû!íìNj·ˆÚÇ%ð•ªôjózôg:NâÂ^‘éî<î ÇÂb+#u1þu¿èú°Ö1ÿ׉Qz ±UÝçÉ›Gÿ%m}õè`üýÑúI]s~x„»9u>ý‡¿>zýè Û=0ª7¤Ós³yÕâà%­uÒÇ= ±þ{<«;PêX÷#=ã½8Ñ8¶{>Œ<­8*I¯íþTëÒßß™&ýͼA»Üxew©:.Å ÷Õ«.?yR>½PH$S=‡q^2ž^HÐ÷ F| žVp¾Ùªûö™ ¾õ]ö‹ißÒà+ôOð+ªf!æXßÞåžíiÝßú×~ïáuú+?æÅU^·­œ¼ª•7Ð: .íêbuq±Ê~  ]¹åõA~vNó@ðÒà¦;°¯õ~!;®Fl},ºÑyþÈißá¥"Â\ëR4Þ ¤‡*ìôœê¤ºÓ*JÕb󈡧ÊÖÇÝUE‚?î¢æ=Ãi¬ÆÖ‹qc®A»únijhÆäU¿ØF¡oð©.žVZžÏ軼C¾É#0Ì·i(X8ïVÛ!¹±Kdèºxƽ¡ëæ²–.¯;2ðÖš‘=<å?h–æm!B¯eTc—Æ @@­osù±jͱïB”‡Ãj¾ÙõÅ à·£:Œè½àg7Öú|YQÕù>_V칦]kàÖ{OîðŒŽ†u»Í­è¼6é }3 úÌpÕzúfKY¨aÊÓð-e¡^T¤YèhQåiÔú­VŸôÿ¸%-ê––IÈe¬#>Š(3Îp˜iÉëc|3¾'íDtD }U<ºÂƒÄ,^ ©q>žÖ×zY³æüþ#.™âáMîÉí Þa{¸Öa#o§Lð+ûF5:Ë®áŸk“ì5ÈJc¢ y­:ºç>éëŽS  õÛ 2”ör¨°¢‘*äzõýhŒQ¯Dteï=Os£’ØZꔇyEÌC³âŠé Óõ…¢×N ÛuŒ‹U|j¾‘˜2wlT¢Ìrò…`‹‘½ƒ'ÞŒYж?¨ÇÓUÄiêDŠ6^™17Ú¨H%Û×\›/:r‡"1\̱ù–{áyE”ž\×ìšçF©µ4Ã‹Ž¹Ãst®o8ÓÖÖ’QÊà¨ëŽ—¦ Uººt¢Lª‘häot™¬\öÖbRlê¸Ø¨2µVa¢2‚ÊúÚ­ÉC—[·«u=1ô7*?JÄn ¼L‡Z@û}ïsêƒFZžo0î_«!7Þ²‚^oÁÑÈ>Ör)£Ò¼^HÑSA½3c”Tõ’ ‘þJî>V×ò¨yÊÈg#¨.‰×FÕ÷Èk|Õ ]âDmÑfJ­á¡ŽàÆPÏá¨_ßîfŒþ\_DãíÕùèÞÇ$Ìsz:’m¶DEÓÄðO|ahj8þÒÆêP),T¸êVóê[ð‡±/Ü=êg:_¹ûQóÀ#Ø‘@¯ Í#¬i¯SÒ Ÿœ ôNW¡ŽÆ^èxS™`ž™Oºxn.Î[ÝØëQ©ðæò¦5B›3—Ž_µë}NÒxÕ†Ö”¤‘hæÜMã­…O%i(7ÙÏ[D9êÐã|Û‘x±žšáþÅç¹KÈóiÍf€1}Ø'v;ûËèTwöIb>îìwZSó˜}·²ØP°w`ŒÔB½öÈMŽïË"ž:&›†nô#³%îÍéa±Ø‡Ø?õ€ô¾ÜvÚìpñúm¨Ò¨ß•[?AdÊÜÆìŒÈ×ň¸h·Ú‘_¨ðmQ¨ìBþÅSS†ñê¥xÛ$¯ QÁxQa2yb1;|ª«{ŠÑ£p/µµ ÉQ¾po |kÜy…õÞz:Ë•š²ÆýŠZ‘Ûf)r݉qLíÜè7ÔB'Œz²²/²ªÓ¾PŒ²òjÒKE¹Q;Ø…Šc…šª:/‹Ú^â¢ØÓKpÔ§¡Hd·òä.k¬O=ø²ÏxÉ/̸c}n¨–}î@sÉeJ7ȨBùŒ;ðʤûÜûµÊ¤?V·‚åÈì茺Øb»î3Çú*|ÉÓI€¸Ÿsĵx,êŒÀ1#X”D 9N™c­€Ùâ¼/1 QŽpÚך¥êw0eXkFzæ›Q)Xíç‡fá$p.Lg€'å ïô­>ðQón—–Q}5HpÃs¼VásaÃq¼F:SÓŸ§/ê-Ò\þgÄÀ“@ôz Âøê£ør¶îœ‘PiAþwÄôµùŒä3¢- mçµ:ÔN׺ÊÛßEŒ+Ükû=Ü?U±ëZ]?!½hÌ.ê™E()ÌÖ5AB*<õºuK ¼ ŸëÜ sM‘*‘VEùÕqI¤!‘iýð<…B¿Øz½OÎÖè5ú™Îß ¼_ëçRp¿¢0íçÚ wN‘+<_:§E9 °ŠÂdZC4;|ªÏˆ|Iå£3 Ê0?;Ô³®oÛ\\k¦é4ÞÒ 1…òò[ÑõX|ÉÔÎv¥"y·ø¹'5ù0ï ï[‰µ2í+ùÕ©\üα†jj4?s\r'Ì ółԩOë8úpƒ®€¦X‡ÿ3‡6¥C\'Gý¹Nr56ñ·ºtð„a±ïhaNûub=~´­U#_«4Õ…åȵÎìÁã_3j@!çì˜ÿŒÀF·V'Ž zDÉæ6ó4 Yõ¢HküiD»V«eN*ÚÎÂ+ct–î·º.:OUþ“-dÙ? 3„ år£Î1â†Bž2ÿzt6?Ýn¼7IjëBšd Ö·;·û¶Ä2$#aƒ\¢>hœ²¾êúÄ@ÚK÷ZSe¹Óû§~ÜY×?`@£ÿ˜òpµ&=¸³ä·ŠÔú료úåaü'ÿ÷ÏqþÓýôýŸÝ}vÿ{/¿ endstream endobj 148 0 obj 7923 endobj 156 0 obj <> stream xÚ­]Y]Gn~ï_!ð$3QŽj_€¼$hI-Gc©[R·äø)É$“ÀÊ dòóïnß{›KÕ¹ ·-õwÈZXE‹d¹gÿpåž}üGúñšþý—«¿ýxõâ•{æý³ÿ|åŸ9úÇ?ëíYMe+)>ûøõê/~rÎÕ_ü·Óï½ [Ï ówøqÀ¾n9iä[üxÁ!n=… øñ“ ™SÜB ,@}óY÷ä9e¿µ¤0ßqLÝzU˜_é>Ô¸9Ý…øñ?>ãÇ÷=r§¸}J$8p öÝ3¤o[ ^!¯5Í·œ“M“#SØ|é ùÀAi«Æ¬²©ÙmÉéÖ}â Ds¤0o8¦Ð€»›¯4ßZ·˜ëNjßzŒ tÇ@­oÁéQûKüˆO‘Ñå­¢U‡£O[öº3wJ˜b dÐ4ßrPÝÂllØÄÆØiXÊzXbÊ›ky½®"Ml5Vÿa>²ØÂôU’£ŸNÍGl…$J¯ŒÏº³½nµìÈ@rqK]È=¥ÚÖ¢žä†v.¯0g’ߟö±ëÓ¹V‹$¡º´V£’Á@ 6ݤçR‡{§‡÷;©ÃCÔ ƒéó؀ľ(m«MwUh_PÑ« Ím=hÐ+ìa£'sÇõtßœü|š¡]ÉÌŒ“&\kíI‚¡Pü†«X…®'çG®ba%èqöÚƒZ~±¡t·l£z´æ²þHƒÚšn‚гæ(by°n_.Ö7Iè–JY¯ïD¿ N‹ÓsÕh©œÃZð„>èU~sZt¼‰¹“ª*öºå„Iì³ï6aÞ£F›jÙÙ/R# o W¤ÝÑÙJ±=“¾)0ÿ-ù¸çȾÕÍ å:‡v½¨y¥3+©®§%GXbÍ⚥!­`m€Æ’,·œõ§¥µ}ùè6ìwâ¡&{4™ºt›|Í‘$)t…¼å :¿– @lè|ϛׄ>è“–K[«Q!ï&§¨@FŸ×}áÐP6£o ¢!¥å¡sP¡•VˆwŽ0ãD©d xà…ñÏôŸ\Hæþû_Ô_ݽ¾zùñ rD&{~öõŠ$dÃa{üñçóýaÀð?¿¿úgü¡qúøùÉÆçÐø_|3|+QûV m›þIüKî7Áá/(dý}ìu̽¦}¥¨‡ÚŸãqªoU“ã&PÝÈVR ëCç:§g¬AÚSð i;uYêdðI0uÚ> ŠÜ©CFxqQ¸mC›"m8 ¤Ý:ð³x¯y~£_'G:cx{ÔøŠ)p…i1á‹¡±AG ¾°u§)qÿJÍ4i‡Ró°?×Mjp µBn!Ííö¼)=ª´`^K[Íg=÷ÜBsæx¼=ÍäÝSíð·Ú}CëÝçbx© 4þÉë•òŽƒÚÚ„¦0·h7KšÜÄ΃l¯¾†[Ô—1Ç·¶Ï+%4{g%&2dáŸ2[Ìm­â†{D n'NQO¢ò[иzc˜äRïtÚÕýyÉí#:èf=¤?ýÄ­£DÊóÒiʶT´ÇýÚ6  DZæ2u–CnÁ† ~±È{RÍ-Ùßk‰‡?ݑɬZÇAeë‹æ­4©\Ò½>µþ´«j­ >‘øàò²nÇDâC ÓYåþ\š;¾w2Ž­8±”ds#á>hÆo9ˆlUwæìZø$ê¡{d4u8̱—¸8²ÓêèF¸ A¯z€x;l¿Úu®Oš1ßüÉÆ£)T ³ùx¸{ºÆŠ8üZÞ‚5¯QܱäèˆL–§ñ5F ÎA)–¸ãÄ%cé,ÉÑ9ªc'/ G<^.jJomô´“Ão±î,mâfë²u…–Q´û:‘>O–E0z͙òоŸtì† 3Q 8¥¢§åõùàÄ—>MuÔðÏöÈ–(uÝÞ@c•œ,îN+¸ ›ôÊZÊÄ·…õ`–k~g4Œñ¾3-ÑaóZÂú5:9q_¸Øuw'›|$;%C8Ùä#ÙÕ§²pžÆJ[I* ¤Ý±‘n4V\laÐ<Ë?¿cÞèˆ÷p)4 þcPV”'¶;ûM‚½SÚz¿ItjÏZÜßHŸ <¨;„h³Ï;›L"«…LŸ1ˆX y=9ÃÎÍ— g*t˜2Öâå-,;+0ÕDó­GþÝÙpã.üe½÷ðK:Z¯ßó–ÿ½tòYZéGîßs4ÍKn;ÇLDKÀýÙ³ÍoŸ2™ùq- ™,£ž'4ŸxH.ð ½xU OM¢UÒOdAÍð®'ÃýúòãÕ§ï¯ÜViÿpuÂííŸ}¥?åƒâño~¾úpu ŸÑ™îÀh?Lhsj ßèÿúŠþÀéŸv2 ࣅžþ÷ÇI 8?jAñ[ÅÉvÚ‚€µ`B_P#ú•ÎŒ~AþøûK¨sZ ^É–É+êG#sòdœÕ‘ÁÓ'Ždœø!t3Ž'ãx{ÚŠ>ØœݯW×ÊnÑ·3€qzkÒ—Ô@¿›ùý#À» N•ø@„…ˆŸŒÏ'›¾ Fôq4w‹9ýïmú‚èã¶Ô ooFdødÚì.Ør±Ѷ±'ÛÑãßÌ·#A|g?zÂàq˜38ƒÝ é~½!›iÍáœ8m À›` ¤$‡ˆÕ žœÁç¹XJšØšÂVqÔ™r98—W«íˆÓ$.-ޏ‰9—€syc3äÀ læÈœÁpÑlrØPiÁõÕ8œÁd"90ÈÃ1=§ÿø{NþûÅ4pŠ´E8’±¸¤3€39sf’66TêâJ~Ïc—ã‡ÕËËä.Õ)Ëà)äÀ€ÔSõ+GgðÛ N :•ûŠÁÀœnN“¸À·²Zôg€15÷OçgÏ4‘¬ˆy_ú”ù À™ïÙ&’ð×+øVköô{ÎÈ6M1¢NgšÚådk\׆Ëð+ ëÊŸ}¢qÿf®qñû„Á£œ38ƒ]»kÝ ÖPZž¨uј€7f×¼„¡X뜬NÎêíD±prØ÷ýÖà™288ƒã¦<1XÙÑ Ç%£#€3º›žž’ƒzÉ[)sú§ßsò sEPÄa ÑA§-xœœÉÂZ‘4¡¹ò'›s98—7=ÅÉ}—úŠÁpÉTHr8 ¤-ÖÕ8œÁd90¨[ÍuÅàà öФyІ…›s9ìµ±2XmhEêåjÖ¿76¸ã^öžgLêñ€6$‹<-ö—3ÀX6ç»ËcÎa’YüHÅxˆÕ™µà à-øá‘o²Õ¥ KŒèdq£3etسi+BI–e2 ÓBžÆT¾?]kV‚0±*…ÎùÆBª==Uí´ëç†Mù̯¨ÇÒF¤¬~8ý`ŽZÄÕ’m%ÑÌ{ÝÉ.§S€ÄðÈ?çÆ¬ÝAò¸•Ó, Õ­; â‘ >"0Y£î9wÅ;­G_lºõüÎÑm)jJïO,w¶f cNá´La”;…±B"­Æ4®Ž$ršÂØtU#µ%Hd0"|DS)Œ¸qÐ ;‡u‰üÖ$FÄ®6{ÐD#:º÷j™Á=…Ù²FxEáþIMÄèA&)"O‚ôJ Õm±kr¼a•N.A÷ƒ`#cÞéa™Ý‰:\H*ôŽÁ¶×Ãùˆ$J&·NˆºsN÷…g3Do2ž\;E’ú¤кª-¤ 4]#ë²"¯Q7ÓȺ¤qwÝh+ÕÃ.@FÖ%‚ÊŒ¹W±™ä«¯÷‚q›»Íó•¼DuQwᙘ»n˜3î?+­#½«é¬KdöC'%h-e½–ŠŒð#ÓH/8*[©m½¾Ss¤¯4苼:Öú–Ù¸ ]³ë¤ ]ñ§ºŽÌãšÁ3Ä\ÂÛ ¿øs©ó3$E€3»7â!‘R‚©[ž+-:ša .DPT‹îÓo‰:+—f1ôéG¼%0µJ0Z"ˆv$PÎ[¸¾¢©½€hî –'Dã/…áÿjß" â [h- l‰B„2Ñ8'EIñ÷›§‡•§9%Gƒ¨•ÔE ~”÷yäîIለˆ·×<¹t¦peŽ÷Iu¯ô MÚºù¹âÆUµžK- Šž‰  ¡l>,c;"Ö£@Úµ”é]‰œ:"´/ÁÔPIbT)¥bpUµ”jÓ ËFå‰üöjJHá6M8"HŒáåähd³1[wÊQôˆr§­…Hç9 2ü„-Ùaø=^ïô\©ìA¤÷®›ˆÊ<]ˆá÷Á§agXÀ\wÑâ´ÊtÃ&~š46$üϹ“"¯¶½°´YDUœ¦ÁR;FÚ¦Œ9–f¼ÏÎëNO2XžŒ…ÆûÓè(/ì zjû½!»·5oáœL)´Ö¸‘u\#£ª6cÀµo&%”¤Ð$yUú¥!?׆·‚v"¿^ØïcÊë½1!G-g›å+éÀ‘D"¹g¦¡>’–,í™É. §®DjÏL&rgËÎfX:¹"Ë9 dHí ²žChm½åXG†}áAà~¸‹ÖìµÉ§v¤|Ö ^þ"#æÜ\Õþ—z^a/[iÖQ'¹*Þåácp®–éÄã°j(Ë+¢˜ºݨCuQ‚Þ”Â5·H蚆ßK£WØÅãoõk=’ŸõðÚ(’¢¯zܸΥ…‹R2Šç¤€t!î^¡_u‚¨4-‘¯ w@–DòДX(šÜ-¯^r½Ðú‘D­E=ºr߯š¨«-{”{¨A¡>Ërd)J̃]„f·« }#Kœú²Šik¤t$è;}-Š,I§pO[¡Ã‹ô·O§^ïilZº_¤Û-£q#mMKÆß©Bb“Íôš1š^€ÏZdÞÙ $£B…ßÙŸ ÞrÓä†êZ7{e<È!‘×O‚í¿%úéi«“pϘQÞFÔÈš!ÉF&ÔñotÖÌŒÓY3‚”ÃJœ3x$cÙü1©Ì‚!5r1›7áHÆòÖ 9b@ß!íxÎà V©Ì‚&2²Ýês9—U*³ y(DÜã9—# jЬDñ”¤‘{¼`ð¸l6¹C© ÜÅÍÉP¿fµ‹§äÀ âfAÿð{A~•ÊÌ)"-/»ƒ9# iËNf¤Ì67¦ÜNkêÜ ó®}½J~ãL‘t…Úì Ñ;¤€Oò­89ä[%:Ü–ƒ# ~îIEA“¸ä°•Ånsü}2T¬&ωú(¾ ~ø}2 ŸãLMòø8ebUáž[,¤࢕*ÉAÇŠ9ýÃï/Z§‚Q©0+q:¬]ù½ÍDÐD‚[¯a̹“•úálÀáÇŸ-&H°úz…ëúÒp\4C’’稿«s\4G’ä-Ö¼bð0'éT‡UV€Åg—d_Ë|½Jd@¿Ô -MqÅJ&V¸ù‹½âH™ñš¥`@,wúB^O€‹ö'I òÖÂ’Á# ǃ'G pÚVƒv$ãè¡r`GÍ]ÎàÉ+€OMnà§<þš{¸PD®*Ь:<<;Ä}ežN^ƒ&>H¤Ž> ¸Q$5§9,‘·v¥9D÷E£wÒ3œpô îÏ£í:;=6+÷BΤ(¿™öІJÅBF9£^ê²G¸vM~Ý!¼ðªnÜÓëœêÎøàuAäîJÐïæÜŽ€„sIJÎä`j¤ÄÈê©IËüµLÙ ^wî^>X„Ø- šÜÄAñ58¤ôËp¸nˆ&þÇ»Í;¿UxÑš±zDö_ßœëQEýUgÌô,D/Å­¸¾;xç%cÒÞ9<Ž %R¸R^¼ò"µø£1Þ—×þiBÕ& +¡Ãs6\zr]ÛEdÛ2\a«uçQ‰d9‰Híë{‹,EZ­,†ñµ¼ÂÝÙ*R¦u”uDyT„ ${³·Àn„\KäY#Õb#دÕÍX!²:ª‹ÍVG*ðnø’¥~á1wÎÜ¡d‰ÕêÃzÐ2Þy5†‚³Cqú½.f§“5ÀÉáÅCO9ŒÿGû;á=DIb¢}zt6ú…¿1QQ“4Þ,´\ DÞÏ÷a_*^¼‘ýºåÈ:#L"¿ð 2Älh¸jˇKd¿¸7@Íó!³ÞÿÒ€Å"QºÀ -‡¼‰á9Hõ©QXjR+1l*+Ñ! -1^º'd_Ši%»0A[^m Â<¼v·ëéáƒsŸ%<ÀÉIp¾¥Ó:kE7A|!¾ÞEÌ'¼m“WðâZ\à>ËäFW»½’Z/&Ç·òêœt—ïäûŠ›¿5Ö÷òiÄ ÆðaЊÆÃ%©žuIwÃx£”Ž'x}vÙ0 Q¾¨'°õ\½U/`g=hÓìC•EÓÈ cÔRqvzñ*« .¡Ì»ÿÿù»ÿýþë‹»—sýÛ—¶ë»4Ä“ü¸ÿaÒvãÿ»„FQ¢¨Eê¯9¨nÁ¥õ¬Ž—_b\¯d ËD€Þ+¥¸ôî=€k‘ŒäÝ2õ4ÞR-Óª«âué $5<=ªåüAU%ò~gØhV‘·¹\€~ÏÆ,}’> g,eª[l;mÊ8BùBx2B3»—f,£×v,m¦m?¸2~ås€ŽJ°\ü¥!ð>Si¯ahê3•† Ð¬ÐÏ•‹'zeÜR ®¦·™ó÷Üpé«[©ž]C•] š=)K^Ÿ½CF›G AÁשּׁ|Õ!ïb±3ðzÌ_òãû;£¼_1§ÖÐdGéºÙ“×¶ãã[ÄÎ}äHri„²&UO«Ö¸DMš¥8„>Â\—s4n›¢%o±9C vGü¼!׼Ím·K u‘ë)ØJY‹òƒ<…¨G¤•q³!AüÔàÚˆQ óCƒâ´b­Ý{åàOe½ppÑûzv¡J³ß œ¼¿C!¥¾û°Ó®B§þ”wx>†Þ˜«ÞPºò¥»> ?ùÒíôÆ^Æp¯gƒ…ÈÑB­²êãù:³oBíÁ<©;Bm‡MrÆþ<¸Ô%H=eáÜ ®W<«YäóöÞ`÷#w†ñP¬.üqÐO y#SÎPT‚>صàókN7ñ®˜ãAN­&~o¸ôqÕPv¦¢•ÍW 2ò•‚çsnºhfá¢È7º†tU . ´/ «MŠÇÂR*N7ñGYEÀb<»J*épà« %£ÑÎãNë°ê‘¶Ÿ¨Vâr€°•¨@êÚqßá ep#-(<³ìlðW,ôJžÑ‘‚(AŸäû×È5§ÂH¤= Å×­CnUnk@âT(Å–e#ŸEt¢¦É·Äñ îzºà¡®Awø³LiªIƒÎŠÂò;ÃÉ©¿yµ•CÍë&Â;Ý’é2R(X464o¨hÃ$Åþgì1ÜL¢ýo(I‹;77Q»jÉÿ¶IX–5†ÜYÌßȰ¥L'X‰œXʘÊÞu×E¹d¼Q'P3³ òt%üAžxQ3P‚&A8ÖâYEsRÅÆ—QåÍlñ Y>§MØ´O‘½gyA€Pq z.3ð¬}ÇA¸ûÔ m "‘0ÓAN"¿±Ê…CQSÍorgïæM_æñ¤p/žB!{öÄeñ?Qôúœ•Åë}¼¦¾œ$<­‹žÉý#"Þj÷ÕžŽORA;½Uà2™v‚õV³a2dT€EOÕº¥¾p) ¹7áµÄ¥åšF޵ž ÏòFºøž)iÉ–¸¦|jm= #€¾®7*/Õ¬¹ý®Ö~‰ü"¯9hÐ<™¢Îâ…K .­Ü¯Î2†~uSƒ"¸Z‘ ™ûÕÓ^Q¼‚ '|6ÏܯH×è™}Ükëü ȵ'šúØqúÌ ~/m‘îý¢W"*Ê_~uFå¯f·s6õ—s‹€¦a«/ïÁ³·p~yoj…obɯª¦ùÝ;ÝPÓ(Ê+‘ŽŸ'Ó…“hwzvµ‘‰«h\¾/G Æ4J,g ¸µè(2·³r#«Ÿ¢„’‰£l9œ£è ?ËúÃÙeÉŽ–Bóy‡Ý(»aóQ§¶Ã# KYÀe8ØY.©ˆÊ^¾ïŒ|ï×Ðòæoò)4–›‹;¤H;”–×J· ~=ôKî¾ÚrJC›¤ñ`l‚àPd3ôÙ«_Áx6èé&üŸÿùù¯þéwÿû»ŸíX‘zÐ4£/òíœá ™šPpŽ Oò=à5èÞpþÁ;£yªØÐqº [™_\p² <Ýð´†MW’[bJÖgGxԉãž{ßiu«dø¶‘ÂÓ‚QaÞÙW`Ѩ²å!g¬Àj±ý%2:Œ»ü-2ú䋟ÿõþïëÏá"Œl [FÈ–QZȨ@Ú2*@¶Œ :ÎÒ!´Æfá¼ùêUAÀn_à}Ü@•dá‹’ó°×sÈy®;£ 9÷º…+A7:¤$I}KÆ$¹ˆ¸myñ¨ âVp’ÀO²ª…'˜›Éõd²Jôû‰£ o–ìôíéˆ/ó°Púaquî{µæÅ'€$t]º“7EUuë³¼ªu AN`Wd¸qPîXÑ¡u¬óéHܨp§Äa"ȉAì’?BÕrX÷ÏBGÝFU]¹(:_ä*CØÅ²=ãÁ‚¶”ãÐQlSaî'”8Kqˆ¸CÖ‹‚Ûî¾è¨o×QÌFÏ”QC/ÉgEûZÚéGZ .ÌôT”°Éq2*/3ˆO^Ú™xˆ)9ÕÐ72ãη¾p”e¢]Î0*TĶ^ë‰&/{-yÑ*ÅÃ^r%hê¡xmÏY¢9kÕ–Uy¢‡jJÁKí ª~¼Îf‘å ɺ­{ÞG••X£°lÕ>ÞŠÁ¼é¬"µè¶2{… nÄZFL]y̯å åE¤}I@T,.18æF:q›%0ïåXõ$!Y~)YékS¨)§øMn»F(/Âä=~ĤK«`d¥==¢^KTCö`¼7±žbß}ùñêvörϾÒÏJ»úÏWuóÿƒ£ÿýý#îÉ_1èñûß_=<ûw¢ûÿPñ endstream endobj 157 0 obj 8791 endobj 165 0 obj <> stream xÚ­]ér]Çqþ§@9‘ËJ¤ÃÙ—*'U¶¹€$, ´R*-´Å):¤'åò[%ï—Ëô×3çÊN\Hâ;³öô>=æÔ,ÞÅHÿ‰)äÓ81âŸ.œsš£[â黓Ì’Ýí_ßîÿêé/ Æøþä÷ü—TíâlÞµý‡·‡ÿÛ?ÜÂ7áïÍéó?óoO~ýüäÎ}jíéóߟØSß©=å¾|^lð§ÏßüâKcŒåîÓçÿ¾Õ´Dç˜ùÇ—í_ù Ó¾ØÌžþGs¾s߈.­ ‹­šûåa—ÖÕ%§ ËäãRjЋÂR-‚žò»2Ö%ä È/¿ìP©,>àÈðsþqÝÁ‹]JÎï{.…~‰=ßãOøÇÙ!Ü™´DßðLjv~I.ÌGàh½KIó¥t´Þ!bK7=¨,ÆÏ7ÎÑžÐjöd7—óî›oá“û&»¥ú ¯ã‹Ýµ}pø¡7f1.ÏGíiÙ­Ásð°Y·„êÝïõŽÛ8ïôÈ´‡ÇÆmΟ‹8…$EJ–V w᳈zpÝ?é@™ØPDÐÏq…Ö7èÙn[Ú.=º“Ù-ÅÅa#ÁÙÅ+ÝÝëAy >®œæ@«êÕÔ ­"»Ó¢_œB"×û‰´ùuß䤒À€bˆ¸H (è5â|Ïôm´~ ×ê¼¥Åy¤©G»m»êàÞ.Iam2ŸÕ'ÇRéP±`«â–\`žì8Æ£ÛvQ4‰¼;÷”;tÆ#SòAŸþÝ›_óöõçoÞ¾w_}xóÍ·o7r¬5!EM©©À(èKàB],‹u‚KiÉá#¾^üâY\ 8‚«|†ˆtà_ ©,0à—,€tà!*Ä6{6HâÇEœË3lŽÄK±¸—»©÷ Ǹ¤~݃Xøù1BcpÚĦ¬ä…Æb¹ÑÑ4¸%Š€ Õ f{Ä.¢ogÙæ`ÊÂ*ét›ƒ%&ëý±Û)‰÷e Ík ¥õ3b5Á)3êY.©Ð!̹G 2p è¼W°fì#ÞWÄz,w¾}ÿÃïßüáO^ï¸FÓµïÜÏŠ¢m ‘™ÛuΟìûù…Ή&D»—KæT%ÈØ‘ÅÐNšøÚíŽ[ÏdHGÈ ÿÿƒÂŽY~ÐÖ•´ûªvëœÈ¬ŠÒ¯3ûx­„t RãFõsäû$qùö8á‚6d¯’.#@S^Oì›EýÓze¦¢ªŸ–,/ïaNR<ÛHöJ:¦ob@8«mשw˜‡%°ìê±wwÌõøËMZcç­!÷Ì6E`£k=¾XØKØÈñ† ›¬Ð("Ÿè;O‰tû9ýºÆ¢ë|ˆ…„“Ç1öÒ‘Ú‚xØCHó„^™°‘=ð©4è2ñry%Ep±V%•+éŠ6MŠ%´ËÐá¥Ð £—d‘tR\ð»»}|ÒKæÒü³¥÷ÙjlJ™faùëñçJVDÍyÞ+ífÂsˆªM°‘Ù²ÀyÅä‰ðŽj`W,L÷\úöS-:“®ýœËt¦!2ÇÕˆ½½gˆeµÃûÒæ‹öà‹Cç Ú2ŠÇîX ÉhNҞ̜Š"(\²ë“•­<ëÍ;jƧ©@Œì0Ì€y)cÁÌdô¹Å´¾>§ý “؇}0š[a¢ªÒK_âƒÌ|'­TÒÌ´r#ÔLº€œ&¡§§b&ó32iNú#c›L' é£é.oe¹‡#}ØG¯l/g†œ%*ãÔ¤gÇV×"–¥3,¶"5-[0=!ÿãF§î1}šÈ¿˜ý#´,9¤s¼AÁJl*[m1L#ËÓÂØFé#×í”Ø’öÐÖ]ÔœØ9”õ²‡p\ºªm]ìƒ2JȽEÂæ| dõÔþ¢Îtî,ìÌ´H}Yô¬8äËì§^¬Et=-‰·Yˆb²¾ÊuÎ*<zœ“";ì1u È=ÁÔ뽘fEO&Z¡%û@c«‘]¹9©­>è…1YõÈ>od\(ç8ey!OI¥Ýû:MW§_Á’I$ÏeDàø†uëGŶÁ¹ör’x[Nöè3h¤H¤]:š“÷™Kt.½üþ^oQÒ[Àìý˜ç(¬HÀDÃý'Â&“)°]ÓƒzcšÕlf…=æ¬÷^c0“ÈŸ´Ð ßõ2l“‡!0½d®vñÚ¹FžÍ²¾ ¼/­Xo¡ÃÇR€…š$F¤z±Ç³Nβ+XÜ>Öçiq+´s)£6¼z‡-qYÇ åd±]ôô;h§Ï¶H¦¥»Œs/ìFò+'¡ò óqì½uG+l=¬DC€¥ ćÓôzÁ§"¶ÁÙÓíA½õ'š1;'+ΰeÐC Í[Împ(4M:¼†tW/P'dçw„ïö"öZúž²…!£W›½O%C³/¤ï0DX¢û=†NDVû;ïYÇ&éj¶#œÊɣ̒wV¶× ÂÈ.zL%~û¦„û9vçã”X±üļªÇô^W6ÖòlàÄ?bMó¾HS³úz:Í¢¢ ¨:ehITD­ÞÏ'SØ*ˆ*eö£%vßÚb´2€T¬Lï²¢ßUÔ#t¹ æ*BPd^ AöÁï—½J°WbØœx¦ y†O›¼UÉÆ„—˜ÓîtË"± LåLu]¹êޤVx‹›b°~±Hô};–X)Ó)°‹ {ý$¢Ÿˆ“uŽ`:]Ž€/AgÆÆnCÚVf;q.<’ âØ#[§Y =ð3t²‘¨ŠH7RqVŽû™N‡Ñ¸‡X¡Ã©<À(ƒHÚÆ†îÒøŠ—ˆs+Š$l}ì6­VâÐ7`9×29 ”¾k˜ÝB¿è°D~dP@ÇòêE$ 0E†‰j‚µèÇÎIOÚ®$jÇÀB îµ¾þioGöò—sÃaÅÐ:¤c°7Š‘øäIŸVªDVˆo$`‚èE!‰i,öÈÁõ™#؇Ԛ3Ø÷žŸü}öè„ô:K>i¸ÔŒÿw'$Ë8ŸoûoOž\ðÕ ]£Ûßã)ņû¶¨q&Ã:i|û{äg϶ëpKßîð¿¯ôîûÞÞX¶l¨áaÿ{ _h^¶FísÕNšßþþ˜Öû¶¸q–åqÖúNÓ\{6è«oš:kΑÙTvµ³}ö1v&š¦ÎR&Î&í¨åmIàZïL4M1 ¶ßPbû¢5jŸT ;£ñ=µ l_´Æí§f‹MÚßPÖ+í÷­½;as3ú†íïG¬lÛOMÖNÚߎXÙµÏ&¨Ÿµ¿dð¹l‰iïÆEûÔ#qïjó¤Ç`ÀND“ÔÉæÖܸíïÁì¢oz ‘5Ïq;Ä!Ƨ]¶Jý¸Žd³ŽûÙÐ ÁöEkÜ>'ø¤Yû[À"L¶FísÆ»SÚoŠCyc1šæÜ%C÷ºñbÉ•˜>–Ôgf0ƒI½©À°S~òÆo*1ƒ+• eìz`W³8ä< U–&ï]Õ[ïÓ~h 8»A"õœ#Ò9´5íAÕ/9àæ|Ù¯¤PIÐ'Òç®漳ǣ*Íyê )h¿7¢¦Ék‘¬÷Qx”Œ.fŸ=â±–ùì™[ô¸AR«å¤V2ùzÔÚüz¶Jt¿ÌEȺVìKT ¤’ù. teÚtŒq>¸Ì´0ÝO$Yú…LÚ%-èð§ÝŒ`ÏYÁUP·ùî{u¨Ü¤3裾¥Á»F\Pv-3°S‚Ýp!¾Æh< +ªn‚2Ú¬{÷;Ùe!5 Fõ9Á`õ»^ì3 ±›å×?~{çý_ÿðýßlÿ»ðí¯ÉuÑP­lF½Àœˆ½G¾h+©ŒñÈÓ›5O œY5‰­Ž)„#YÜ«"…+aߥžË¤ã”€$bmi·Ù%|peS;"\©¡LHÖŽˆˆy‚Îâ\F5"Í%ã\ ÷¥•;¨€+ÒÙÁ¾ š%'pLó.`}t•¶‘ݱÓ5t&¶+¢¤r››ƒR"Ÿ)Ñ…Üî.IdïµgjVF÷PV«Pˆ¦oˆ}TIåJrÑ\ÈZTÆ|,ÃSȳ÷-¥Ø. ÌGOÛo®êï°¹âÚÍ}tzž#1æ9 ð½Ë´¶€œêªBò"`CËü)ƒô>¶+ö°˜ƒ‹˜‘ìíœæ„Ãɹœƒz䉿ìÜR‚Î0ÝWÓÊ(¬³Ü`HÙ©åž,‡ÙóœérÎN5ñX¦Ë×/]Žs äÛŽ^~¾:YBÒWöŽL¥u gS5=N•õÊÙëAÅs¸šŸÉDµ€ùDfî(¼u½Hd_jÕ™ÞÑÊKg¶Bära´˜óµ“´Ì;¬C ŒÌ’Ò—ó<ä7JªB(ýLSDBÊ&í{Ñ‘D†ˆa Sd!$RSÈÌØ1¤ÊV:òÔ+\ø$aŸxÐ-ÉŽèךã\¦„“½‘¶t!>/Awg©¹¶ÛUò›ÁåbÎi25¯,©´Î%]Aæ‚2íi(¾ÍQV¶‡u.Á1]O¶Å­B"É-ž˜Æ¼¥¸ÉpS‰K»¾Ã©Ø¸€¥h/~epœ¥qOöÑ«^Ø„§%\”]HZ¿£DWΗÎ+4ÉI %*sÙ,oà…½Ë\…špsïË _$ûøéѶ;÷º\B6M–òûh¸h˜ü"Éø­á9 àÞkýIÌ ð9²843ˆOEæÚ7Šc/r03\»ÏGæo.€t2_Ê{l®È„)®(A×òRA;WÓE¬›[{ÔÛ›|YÓZíŸ*™S$Þà‹Ñ…ÄZ ¦„{`+çÓ'sF:\y¾0.ñ_»J-y^‚zîoe]Ê0¾¦ù³×‡³³%èÁß{0¹õ?å`Š/ÌŽ7=ÜÐ%.å ~( h2LHcÔèr’3IB|½ZmýŽLe.¥Rw™òe‡£ˆ½Øö´¿@ŸÁ•Ûbô‰¼nÛΙiÞõ¼àZzéÈ 'ºê[?,uä•®Á.€9SJQ'ÎNßÐsY¢8ìW*–õ¸áÒCjƒМt‘:S%·–C¼NDÏÔ{3\Ÿ;({‘r«:%¨VÆHYùŸË»­œ&>]J.AÉq/ut½#€­¥¨¬§¼‹Œj뛫WÂGUÒøvE]™Oà Ê¡½™„\´˜Ö§2ÍC•€öž¿£Î—‰#^§«A|QžÉF`ÎDj#`ú|?R)jAÌ„ÿÒtÊðFì—X`# Wدµí²Dö:»Uÿ¨€šf±¥kys¦¦•%´´†í( Е,†Ì¿” ;Óø…ÃoFZ#Cˆ d÷Ò‹k NJ,püpº6ì¡MnÃ*ƒ3x%c`&bo—`À) +)$lÄx°ó œ"îųKl÷%FÆs+iÓg‹r°2=•¶K²+ ÙÐ.ÄHеô3‹Ã¾‘ ¬µä•–ØuÉ„%@¢úŒouIçÝùÚòæ³#®É z&Ý7Ï‘ þ6]òíJļ»D'ÓÙ•% qÉE(æKù*;ŽéJ†¶S–Ä%ÉKY0,Y…(Pe±u©9ÍwÓ¥øšæ” ¹ W‹“  yooAwW YWÍ‚p¥r í\ɸ”Nw§§ãn¨±¯%Fýk(¦ë•m½SÝ|á=-WJ ecˆ‡oݨ,/©|~ísI“¤°ŸkYº’5¤ixŽ~¥:ç{Ö)#?”eÊšeÚ[Q%λ †XbQxÔ bˆ#Ñšq'÷ Ú®>Irk#%*˦d‰±Å5Õ!B&l³×hXœÎM.dP§®hh¢A}ä§êk‡«Ì7J’Âh¾è0LË.“ £T¹L‹Ò¯Rš…“5ËŠ,"©Ï÷ü‡'á¶Ì¥Äœ‰Ú%Ù”˜+Q½„‹áHÌKyÅ”y_Ö„VvÚëÇd]h^ËÌ‘6½K ±Àˆ¸‹o¥+$è…¼iʵ±$èU/“M“P„dm3‘˜6áDëà ¨Ù,+3¬dä8ÓË,â~Há €ÄeH´pÒdnjêDj2×µwi$RÈ\2¡Ë ¹kY–Ú(Ô ÕÓÏÍ,—H­ ~ln=è]¦Gde¡‡õÉüÈWJ¬öÉXV©²ô‘¬•:9…Bzo.Jx?u"t7è»Õ°+ØÎi}6œ§3%v¾õ”éö«W©¥”V˜G }#63?ôíN¨rJ•fùA’’p¢ý+#låWÞ«%žÔJ4L79>¯õ¹¼é‹×§—¹™k„Í™&)ÍdíĹÀ |÷ºæ¹ ¤–9å]I Ÿ•¥l¸LuÐç…v3´Õ?÷³'bˆþÈP’¸kñ”ßwœbØì®z%k€ò«1Ô³ËÊ[dWò}O ê«3ÓQæY‹·Û$.ËË£^•k´‡È‘!Ì/æK¤(©Í ›»+å³+¸®ƒÃÀAÇÂeБ'˜ï:3¦ˆ¤¶jò|C9-³ñAš†/ÙÍfp#× éZüg‚³’]9.û–B·âHš‹&ÄíüT8¾tçëÊ"²ïß–ù©`ñÞ˜“Ý×u?ß £ãèî©F=5§gBK—˜N¶æy@ÏJv"W¦ + Èu6y!%6çQIаC 5 ÷DÉ dó zb 7­F”[Ešnˆáö ¢Àjçøéµç+8$ŸÃœÙ NlÑ (ÊD˜$_ðÊá>“¦tM+ À> 4‰¬ÄV¶j~´£e•v¥s~,E§³¨GRX§²¢òrOæ`x#ä±êÝ—!㱵ǃZGη’Óέc\càJxÐÒH º­&à×2‰0*Ó>“ïS8e W q#‚^Ê{ZœÒ7ïŽ/j»Òçl ´”[¯‘Ä)Í,sfݲ¼µ6àÖ£s-¢%áO’™o`ãƒç86¥Í})“­-:µî%þ£iæß¦²Ý‘tç]QÉT)ÔÞ§Â Éç[ÌDÔà‘ŒšœO®]/¸Ìõ å\KË—+2O Ú“…ætÕ)úÖô8~µÍø¢³,÷Ás)_„kÏ_’¤Píµ´IÂ9àL~xH‚^ÉÊœ^a —Ò™íÊ*¶ ³Š¬ù”!P—­·¨ GÜuóL&Ï €oýñ=óéàù O.%-AûÚ4ÖN* ÃQ©º–+_$’Àq]œß©’˜KðùZ¯÷xG–L¼w餜 ›{r’yôt`LèLOtÑÞ ,ÃH˜²dWFkKRW„%§eH䵖ꥰ 9êó8¼±Rc«K'¿ÙÊN~±µˆ²±œe=´ò¹2eˆrõ¼´÷±%PP8’,{$øqùá€Óqž_M”ðgÊ3à¥e=HäµTZT`bç€Ð+™Ý¬u?Sóˆ?qá º’i3;iü„ÓqÅÎ@“ å–¹ñíU‰Ä{Ôœð¥Þ£æÛÁ÷Kù·\¤fcÒT\íûjìµ™:¾¬¸æÙÅË™à°ò¥T¯¬ÁðΜßD$4šÔAe™º²õD@í~<ÌH Þ`±cp›ô­Ç{ÍüTèi/]™Hp /à~ž›Ÿ•VW[Y:°?3]¥ƒÀ×ÐC™˜È™Ì ¹’ök‹Åù‰0çw3l]álÀ’~¦³ x1»¬S±ZÁ›ëãóz=rìÚKs)4~ãLb”¦açO¤&âÙª¯€tRz·´iÕ÷žÈŒyŽ™Ë_H^ž,`€•—ê$ÌÝBö'SØŸQëmêweb­ƒuWR&ób•ÅWü®¤Ëðm¯éÔÙ¶Ôvèo¶ã´^I‡0ÍeNc°õÌÊf‹Èö™UH‚w)´ÙAlš¬¬X°G%û¿š–‘¤nÄqC¸·O§Ï%¿sÅ5ºÀä-«ÌL\–çë‹.Ï>ó&ã¦ÃâlýŒ ¬RO–â†ËiÔ÷Lu7w÷l»[ʾ«+óhÎä|wjR)\A†ws{I¢”D)Ò`šÇS|ûœ_ó‘ ÄæøÉÃêWš ›aI&91!q¡B«så é0® ἄǧ”¿”ãRpmžH‘m• 黫ÄËmœ³`~°˜ë„M™Kë ð!EÆZÎaÊs¶Æ\Iaéâ*מ{™Ò9Ëhëºß‹ìH`oªçö†¹Ä(•ïÙ'ÍžC¼”adÇB€žÈ02?Œv™6ò\à^Ê‹±ÖÕ•aщÎ%®,U64ö åÖ"礑4Wbs\iÄ¥¤jqº¤Ò¦’ªÅÙ 'ãäã|{ hqMd ÅX¤…òjGôiN0í:­-óá\ï ,qµÃ¨ÝÍ”AÏ÷-®Ò¨’ ”åGe”®Via:wÎÓöèZõ¼ Ð+™Mf½ó ùÏÑósÉŠYs„'‡/±r8?"6Ÿ!×çqkG@©˜O:EV¯½{>l¢ñÚ‰¹’ ßÍ%«ã…~ØUÀOÜÉo õÛ+Dv)]Ê1x%z¢'BYá÷œPV£;–ì¹þNQ¨+özÀ¦¼ßtp¬,Ø´BñœîÝ<®Ó–È´·Š½Ñ+Γ2ÀÕµàÐ^‰5¿‡#çÂj瀧ļ §2B;ý[<”zu©?Têþpy±CˆtGgs)b µ”˜ká(öd¦H äœs¯Ý(WÒ8~ùLê45®Œ½ÝÞ,€¹’az¾™-A}?–•pðZXöL^öâJꬫ50¬²#«.wÇ• ö3¬rAóqÊ+U,\ ³O÷Ÿe3g<ÎAÉ6O±½‚øwôómåÄq¾O1ÝWö/°} Aý:Ð Ðf'uG~>(úµ™ûÕù)`="TlH¤¦ûöžèJKe©$[§CòÄüŒÇù‰*@ì‰só5ç4«¬ù(«€c:Êþ] eÜŒ“ÚIL%ùÀ' çùÚqÑçàEž¯åØ9+âZ‘ ÿ•Ytœ&äm׎Iþ©ë×W2÷\Ên…²ßÂàæ)¡VÅ3ñ¹Ì£óÊq…^¸*NeÕ´gIUxŸnXS+ÂD³Í7„M`y˜ê˜Í³‰ÅóTW›¥Ÿø S.¶b+ Ï ¯]IKŸ³º$H\¯v-î-AJŒ–/™†ÈIvZäã?bl>çsåw]SX™«¦1ëë«”ä:Õ.éséKÞ^YÈ—²F=çªó@ë‚Mm‹ ©d¬ÙMÈH"7WÚ-¸H7ðˆ5Nzð"¿Áåò$\y;éöeVµá@^‘$ïÈòètׯ3.òt7í /ƒ½¾–iâA!"x½›´W›°o|¢Ë[ß O·Å[®I˜"³ÍùúôôpɽµÓÄ¡†¨0¢+éÐz<ÓåYO ¸n³wºXꆊ4³úP?}ÍoQ¬ÛçY!‘ÿ‡§ºXÇíøýè­.®ûæ‚߿յý‡Ñ[]²åéc]­ožÏ·¾ý½¢¾üí¯uíûß¾¯5À èòÃçº:Ø<±5nûû£šïÛ¿×5i~ p`?ù`×Ao·¯j{ÛôÞŽx±ë ·ÛgµÆ½í}o?áÉ®ƒÞnÙ÷¶(êöðÍ®ƒn_Ùw°(fÎðÑ®Ã6ÏlM:Ø”°ÀðÕ®}Ûw¶†ìÇ,‘lnÿlפƒ-à˜%’Ííßíw°8 Cÿ„‡»º¼}ekÜåà Áð它^6m;ÙþÞ T‰ÑÓ]]Ü>²5îc€ÃÄÛ]ݾ¶5îhP"-ÃÇ»;Ø<·5é` 8F¦Éæö¯wAj5:G*§þ]û3ÓÉg½K|×ÑØ'ÄnUþdÍÞ9€l$ZJ¥Úú™ò̹/©WþŒÄ•3‚£´˜LÄé&3¥øéo ú¢‘ÌB+¶¼dÒ©$ÒË@dð¸†Ç×þdÿ†Ò@’U{cÀA+Å?k‚ƒ=…·’ø.ªD^ʲ»U]È›¯ü¸Nv½S϶jGR×›àÇÁT:RŠFÛª À`Å?3é¥ÁÎiŠKDpö>K¯åoŠN—2ðÝz¤½©a[b:¬g"ƒ7ãÀFN*NøMØû(?8ñWˆƒ¬ÏvIqJ¤y/^!]Qþ3ÇÔÖHè°üç¤0a+ý6 qó¢>GW˜ƒ  ÂãHÏà7¦%RçqŽó•eîIóÕ PÏâü- Od4'&),Ž=ZìCÈŸöNH‹ê(ýa_j4Õëýa¢T+ÑgqIijM\œ·Lñ˜x®‰Ã”ì˜ÓÙ%èLý,,Cè%ý¬u¥%®ÍãÊ éœq…)é(tØjJ:ù^`zªÅU“õ¡­Bg’ûeY¯dŽ+ß{• þå‰Ê¼¶èóT*ù‘Ú•C}-ƒ?>ÙyÇž x«œz!ÊÞlžœîâ=ŽI¹.Â$À]¨OBñÅFØR_"† Q'R&¹L±ºÐJŠ11Ϧ­O—§=.…’‘¤æ( x–”*Z2dÒ*'U©ðà\+ 3¥.xÍU§“ä‚×-r)@ƒwOB`s·ETm0jÇ£øQâ\ÔÁ¿–™´ÍË®íòäµ(|öL浸€Tð»[•JµÏ§}~«iï¡EÏ™m±>~T«_Š”@õ¥H Zy)RÂW^Š”põ¥H˜Ô.€¹–9¤>á\ndÉ#¾£Î ­á¿ÉbÀ^™/”ùUv䡬&XBYY ~…€tb ‚×S Y+0ÍA©åÛI8%‰Ôn’$RUöX…HGåý—Ppeú§,8?8á¤?‘Ù¥®"HyÊ‚YGAš[×öÃí®¥º7ßeÇ$7ùý×?|÷öõ‡Ó·o¾yóö½ûêÛo¾}{úyš9æö‹Sú¿×?üøæÇÿþêÃû÷?žþËéÏþrù«ß<þê·O®¾x~ïîWÏî]^ß»ü¬üõg²¾rÐ u¸éï«ïßüñ‡¯ß½æÆþkiÿûÙé?œþr3…(¦àù´õæüÉéç§_÷݇×?êÓöd§~ó¯rl!ÆöÇ÷~üøãZž‡Eý¹Óˇ¿þÍùé³gç§_øOZAÙ _¼¹m›8ýáOï¾yýA¢X©Ýþ‰šÝ.Éöϳ5±¡kŒ×dûÙ`E˜¸¾€ábìúŠ|ýñãŸßøŽ‡¶ýóÚÐã¡m?› íà šñ»ßýu¬ÒigZ"Ñ^mñþÖ9xÑ܃æôýÌDoO"ÉT:cÝ_ ýñû[ÜÁ?uÐí÷ߟܜþ@íþ•ü™– endstream endobj 166 0 obj 9240 endobj 172 0 obj <> stream xÚ­]ÛrÇ‘}ÇWàA–­°£Y÷‹Â/’@ &ÉEX–µ´E)jIyû_»ÿ·™5˜é©<ÙÕCSáðP38]—¬¬¼Ufµ9~ú¯#süôúøšþÿ÷£/Ÿ=xdŽ­=~ú·#{lèö¸–ãÒ”‚?~úæèwwƘ?~öô»¿[㧘2€.{PRMzÖl™²EГäòdRYiÉ»)V ›”¦’#€n;PpS5~¥»P¦€ ]ñÇ×üq‚ífCÓ@ªö :Ùp„üñ-Â+Á”åê@θÉGló¢•É”¬w|Ý!m˜¬Ç>Ï{Qº¤•9Z3;^2çÍä26tŽ3 uóÁ¯‘îÁ#'ØÝÅJ\ÑOýÁË_~xðöç—?ýøó«í¿ÓoúÛ¦ ¹c‚+“KÈ`[OÛyÁg8Ì–:&sˆfªWí›Æ°°t!¥É;\º“úÖ3ñ„·ã} ±C3W¨ž–ÉÓO˜xÙš¬¯ôc`žhÍ‹·-uœÒxÑÖ)T]GºèÒ#Žîî®CyKò¬®ôçóT‚"Ï SÞÙžfP\/aNiiSF㎋ji¶%bÃz‘¦\+€žíÖBMÇ3/ʆQ5ÄO®îÚÝ4·±eP,[gà‰,ùœw¾À(Š–Äv Ïû@»Æ$ìú N´R¹Â3ý†Éa£ÁèLWh¶˜)‡~Z¯^¿ýîÝ«¿þðú»ß¾ÿå§ïß¼Ô5™'^®ÞCWE扗]Aº=ëAdXÀtÌìLuºíAy²ˆy´ôdÄVº$1U.RßRtq:W,Sô+˜dI~¤ñòz² SFЂÑç ±Œ3¶¯Žˆ OùÃo6£süï:lãdq]}‡¡=³Ää_ï>z»ƒhbÓ<ÍMñãÕ 1©;¡¥ 1Lo¶Í­²õ{“$“Ò//L¨j¿Í€yÐY†Äœ²„l—2ž›.Ñ a/zÓ¥“EšÆ’ÝT¼¨Æ@½)d]\L+M‘šˆCÎÑ—ì±¥gÒbq+|‰¼àtžùº·Hh\È ûˆ yšÙ´Ws¡ÐJ›p(ïG“Èxpú~ í£ÎÝ‹ÿØÇBHû)32`R- ÞÎt ¿é!iRvɧ0…¦3È@dK³“l³ÿæ~6FFÚHLFþ¯le«þö ò#×k¨D– A¢¢Hì“rä×Jä˜ì„hÙ‡_È‹¨dUIÐI"µè+€æXQo{°Y[À1Lä8•pˆ&rmÀY÷i’õ|Š A Q"msY`êzœÈÑ5}(àý„Qª*ê@´„äw¨ÓŽXØû¢nÁÌ𴃫ÅÞÏQ-²TVæNÌ›·ÿöj”ä`̾×e´É˜_Ý>°ÝŒÄü´WÆvJ)ê›b6O¿QÜçØüLùà,ø"Áp»Œ%˜:ÿAkHü%åqd@‰ÂÞm~¥Ÿ]¬²½äqJ ÐcGºÆ´Ö»Ò¶¬L‚\iph½®¤¥q)/¬iïjçÉY?^hX¹ Hœ#؉Ü/G=†<ÐÅq ^Ý´IÌ Ì&\ Úy>üsyöȧ˜„&{©ÞV@&y.é™ds=ˆ¤§Ç–®åáeÉz.ÃïÙÔ•îH;ùWº#.gçŒßì\ ¥ßŽ,‘ ¾WI¬Öq}„ÞÊS¶~£uHÐÊQÇ>|ŽsüóýËwëGê.vb;õDÊÂì®vúó÷ïßÿëí»ÿ\È`(:|"µ³@ϤÃÈ) $¼Jæ#½{6“ú+Ø’’¹PY…8°Þo.le¯aê,2¸ˆ¥Çc8œ!¹Þ#S_)rÛÎC$ò´u$éÍi$CªEWIÜ®°r¤?Ò\ø ,—¨ß\²ÔŒ:Q& ÙœåîVõìFKœL–Ï=“fBe+´Çôá|Ò޵Pé¥@aÖ•8¡çƒi™ÃÍO0ÜlCK®œèkì|œj:]áy<©Õ˜ÓpÒ.:’—y“6üÒcú£s6¶Y1÷˜^)òn5nH=G4à“ž´ʼ>TkQSi_¸‘ÜŽ´%M˜™ý÷`C‘Ëè1ûÅND[^âÎ0‘6wä¹ÌGd¡-AÚnÌÍ –H<”Š@IjI²$$æTJY2L$èΤ þ¹ÜÅŬuGÜa¼_éŽ7 A‚FJvÜŸFeÔo“'cqÜâ4ж¬ÇîcÔ‘)œqðptlÄd}pË–™f±ØýmÓÛYlUD Yˆ+p2–G´8nõSâaöl…€möÒ<䙪ÎHr;WlHä-p»Á…LÒÛi®‚ n'ëÑaK×Òß) ߈CµØòäÆÝ‘WâãJoõÞ ;%€i Ù¾ÈW·;æêÓI-釴ídZÂluã]â9óZS¬íš\)É·œ6‡”ùh1B_݇„Aå½F£?f‘èM‹¦K”È]Œ›!@·ò@'+ý‰ÜE²ãNõ‰”UMô Ч2S ¹R„hªá(÷xŠœ¡”p`7 ÞL%ÅSqˆMS„Mî¬P¤÷ÛÞÌ¥<Ô±,áHsc+?’HEarô(-îc8Ýp2TùNO(6(9Ã\í#‘—úÔš×à~‘#­3c©6’e·=³š–##A×292… (“#ùÐ@‚ 7¦æ²2ðâ9€:w¡]QLJ©Qåìž H…§È^u6ëƒûžâX;Ãç)ù„QˆÈ1O”B/Ú¡Gq-`•Ük "™¬ÓL.»DEi¥Eƒ ˆ€Y¥¿É,Áâ/e˜Œ¸Nb4>`§é ñAhWÜÇðGïû>Ox¨ä© Ð¥Ô¢ÉTõéïž<šät*ã¨œÇ A×2åÎ  „G¬%säÕœç'yÁDì]0(›üdÃKÆL}\™-I §ôw^p°ã`¿"á<ågIÊzd…A;BEÜÇ0(W\•)ì“Oè *@:ƒ Π¤3¨é *@"&ñL¯w攘ª<}g¬—F˜­ˆ«;ÚÜ?úuݤeÊÇzÛ“êMÓ‚ÏŒôUý•L77^.8µg¢%kÒœ•…TØ—ÙRÕG÷1ìëC«vúöOÜ}&ù·$ (%Øh„Õ2ÊÚl.c– SÉŸÙe Ë.µbk º”Êš¯ˆ E3æM}¤D*¦i±´ri<:^ ²ø¹˜rû÷OäIaäFè1 }KVIÀæDÕ}ž¼ÁæD=£;)æ’Ï-Ï["ŸËëIÈP”˜¸$`—D Ï¿2×Ä•!ve®\ž"€À«ä½$A¶"0#i5ã*´š!‰|¤ä˜0]ËOÇÁ=ë1\]µ2M–¨6ç1Áœw“Ë8¤¥£¨P§¢pÈì?‘Q¶ ¬Ù•Î-«¼ Û|ÛƒH¸4^=Wc3_aZ}òW‘û1=×)-½èÃbžÜM7Þ¤ŸI¼!©¯dÙ§ýë›U?7ð,+öþX‹{…¯H÷a9NÚ²H”…ȱg«SéûF–‡q¹¾ÊxŽÈj$渒nI{ä¯eŒ‰s¶öñW_|÷ÕO¾øòìüìéóï]^ëysÑoN>ÔA]H`ø`4~µ±å]ï?xùòýÛ¾ûáåWßÿüý__½~õË«—ï*&ãÆ–Ý^B Ï]€Îd‰/«Ø}7oQÀÏ•8§Üâ£L¹5ʯ¥Ç<‚NeÄ‚¯Þ ™æCX™"¹\"AŠ}M6'‘©¸h¤½rÆŽoûZ©[ˆ¡–Ïh§KdSzlýBž.q8wN8䣧ô¬:‘7lèL,qå:ÌP†ÕÖŸ+Æ#©c>AHíêŽ!ñ/‘6wÚ{'óZãôY½d¢õ¶<˨ƒ·q,4ùVˆ\ÖÎî·Âd'òÂq½¯¤5Pª]éŽï q……ÏØÂ˜[yö|Ô*ARJjÒmŒìN>øReö-¬$_RÅ¥¿ŽÙM¬—É¥±ÃÄ&2+Û‘¶D*i•\Ñ™×a&‹­)Væ5e„˜ïÁBU€ndÏlI)ä)ñî 8R`'@‚žË­÷a¥;@µ®ô–ØK^™‡ Yx Œspúi4y¥±²)€‘ï†XÈ~ß„ˆ5B{ÿ»cGLØ®a¼âΙv1Šõ™l\g£îdìáàDAQDéíJÞ½"ÒÖé™[œfW•%ƒ_3¨ð5ç ¾´t¡†JÄ]õp)eV9Ï÷7ç~£ß©°?Yá>ÝJož«”¾ÂþÑϾ à•/­/©—’Zq‰ÄŒC[¹•óî?³ m]½üï—ï^ýò? a-Ç9þz;“G‚m¤‘uËQ™€-AúuU ˜·ÄßäB—è $2Yjäb8Ô;3¹€G™%Êïã¹T6Íp¡ndœË%èRɹRO‚´ _"…+¡„—øp1cÇJŒìe¾Ùe8Yïk;×N–ïtácôqKd_ñ1º-…É{¦u¼e<¼)Ü"âdÄQÊÆZrd8Cçñd8Q*2ý…¼3&¹¨s¨¸O-µ í$RÆÉÂTËÊž |A…´æá#;‰kÒL» ˆ«ªnnž‰0ß<Ã…'0D¼ŽÖ7Æ8@åÆëã¼Åé| "‹Ó9;lL›Ê ÑuÌ$lIóéýpïĖƳ²^Z+& (¢ó-'y]PD²H’¢úÑñ{¹}®Î·€z]z={˜Ì¼Ôª†Ô„Ç–náô>¥5Pj·îIÐå‚"u¼{øÕ§OξûêòìéÙW_œ/¨Q[È£Ânþbë Š­ùºÌÝ `&ñ©c`'!óæZS‰Ár™ºÉ@¥ZÆÆ–I"‘KÕ2|k‰_8ól÷¥F‡R«WJ;ªHÅ©¬›œ‰Tªe,³;NM+—R&$¯rÐHq P!–ÇåN2æ—ªœÊëùKÀÑ‹l*¾o ™æ¹L¤*ůt—ùJo»Ò]±“I8&¥Z†-¦¢pàRµŒI$¦qŒ¢Ä…skï¾s–/#Xiª] ’õ",¾›Û[¯=oWy7öF¹ägë䙸–„Œ“  Ky-If@€Êš9@’ ñTÎ*/ÉâÅð[™ä”°_QãÚA¾-åMñ¡z4œZX…<â@b“ !A}ÒQ‹{yœånp3yN¥‹–SÒÔrŒhVFÕÂb‚ß¶0dH—r»¶Z‚ž(g |_0"Q»¸¦`Ü¡ÜÁi>§ñ2qQÌÈqžãÌ&#p¿ÚäHJÐ…¬¿ËÊ|—dJlS v \ïÎWÈk q¶ŠÏújˆ\·ñþR9á[EüXäðqçR-¯íù»ªÈÖhÞû4ä"s^*, †ÁiW•®ñCp©]U bE7]ø¥^¹Ú1ûpÒA‹ ŒØ‡“l9”{—/—µEo^’ÂÜW}¤¯î“è*ÙgÄUM-#@ÿÑ;0nc'k¤|"¯èâ÷-©ãTÞ4~—ž ç5vDzö<ÈW—È+ýʱ¦6|-ô9wD‚nå[2,ýQ‚”«Fï㮝ȇ²8/!FÖ[‘@tÊÀì‰fÄZ¹ÅŒ6xHêíŠíf ŠÍFi׌Ôùƒ´ÈyLôy»g. Â9ViɱPYáàKÂù6‡‘¡>Ô3ôh%ºlÆV"÷JÐÉlëH[1æ ðSÉídˆ#è²xëø$N¹ëÀL^™J¤æ‚Œ<·âw[ªówï’uyŸð(ŸnäáÓ#~Jl/¨ysÔ*·Ž[|8~}ÄõWüýö½B»ŸàõQÍS{Aéý×þ&zs´¹.b¯YÏTˆÝlìõ³ûaÛ0tÌ=‰ÇÞ´Ü~Ã1òíäýwÚ{»~ø;¿gÛ*ôËÝÅZ©CšIÖÜ»O³þêö™³éwneó}Ÿns_[ÂÍmo)·ÿËfÄsoû˜yÕJ×ÿ>õæþ¶ä›[¿§_ÿpîm1/‹²3ÞãÁwlÇß3ù#3}ú_˜Ûgö1®ÝRùz×Êöû> ç¾¶sŸÛÞÒgÿ— %æÞf̶õ¹ýþä“3 çÖï)ÔÿÀ `×Û±mznd¿3¦a²1ßÜo<>1ª¥£˜ò‹ÝÛD†ÉÜ垆»ï w}aÛ»y+¿ØÝ^º§á®õ »þä“o”Öï÷iÿÓp×Û–†»¦w4ì:H?¹'÷¶ýVÎÉ ɬ{ûaÛ˜ü>w¶ºä2îqÊkàÙÛa2eÈ!r4Ê¡‚·Û!"…ñ¡BYó탂ë0µ„2ò1jóP)Žâ䉇ºæP‰‡[ïé€r™ûë5öÐØ÷ß{…4ÖPÒ(Øëf¦¢ÚnÍBjÅ8hϽžfú©  °Ã=mã²_>mFwíîç,϶Œ›Û¯:ßá¤÷¢öIç½ã~ª”$ÚûýÖ·}7/ü~N+ætLxòN^hÃE3åeÉ6_Ä"A˜ÒÍD®¬‘Èo{Ä ÊRÝpÒ§Ê%ªí•{x¹ÎΛ’þh/‡Æ,¬-;ë.-¼¨æT€>á/w¬ð ¶½¼-éÏýßÐjÈy稂€?P•&™¡‚/cïœG-ßÂÆ7›IxóÞmk’ÃYœá¯>ó2¥™Î–„Û*è`:kÏ è,à: ¤Ngšéü‡ ë¼·-6DB_z"rH÷”[aÕr—¿•)ÂN!k)íÔh<ÕJâ:ÆqK»¥æô¦Õ¥ ƒ—Z{n°Ô>XjÔ—Z€fº{YÙ,Â|±aI@ŸÏ¬5òr´mu'IСäUŸ[&¯„/“W"UòJÐLÞˆ¼ÍWõy|F§Yvë,)AÓL{n@3ÐL uš  ÙÝïd³=hØ\¨4ÄŽ¾±À“t0}µçôð}R§¯Fß=øÝo6 Ñš¸/Š®M-¢,áŸb÷»åþv ƒ—C{n°>XÔ—C€æåH{*VVy7¦ ¿dÏ$ §šìÂèù³òæ’:ÙŠÝ…¼K¤ë"AKf?_l¥˜~ww; ˆR@ÎiÊ€¿Tn1pÍ/ÒÆñ•Îtœøgåü¦2òYD²Pc¿i7+—¥(C˜÷Îl±ÞÍ—xK‰p %ˆ6ëžp!áøyó嶺¿€o$(¬$·Y~®…v ¨jŒúò>Ç‘VY_ñú×® “ ín*NèDn‘Ç3iç×G‘¯XuýÓE7¸½Ÿ:èöùn¢vÿñã endstream endobj 173 0 obj 7388 endobj 177 0 obj <> stream xÚ­][·‘~ׯ˜G–³Þï—À/È#ÉÖFš‘f|²»’Ø Ë΂ý÷[Õ§›Íº4»µ‚ŒÅ>«Èb±ªHV³Í•™¼‹þSÈW¿üýanŸ>(æ*V;•¯ÞAarÊþêǶ"Öw¥˜}ÃöOÌ4?X+/ÅïüMÔz7?)ª÷À[©LÆô<¶' QÁ¹ðzïæ'®ÑÁLÐÙ­]Ç£ýºP<‘H)¹@¤”\œ¬‹¤èlæZ§Ç„)¹M\[¹—ׯk•×F{•YÿäÒâÛ†Y©otz~¼æ&¹ú"ú$¸qkˆ•ôF¤g†2Œe&ÒdeOåCžÌ²Xêô˜¼p^©¬e"ÃÆ«õ½Ñnòéž,’hÜ6LîÆ°þD†_ë~£¾Jˆ<@6n ‘;Õw‘3fgf"« ³³l¶Ê`Åv¿ÛÚÏÖVì%·qX{|¡ºJd-]ú½ñh¿¯D[õž ¯·ÉëBw‘ÄV9m<Ö_WŠ­.éÈþìÝå+—ãªãy†æ˜z5wä™fC§ˆÐÖ"ò2ç­ìlOÞq;)Šmº´T–©eÒí7·/ [ ñòÆèÐæñ™×MîF—·CkÀ”³Óú•/ŏÓdù·¯­]a¡ÌËÓ¾j-UÞ)ô‰Âtjø#QCÎú¼f¹XiøÏ8'êüϺ&i Ïqé>Ïšqa_NØ=éhΘ¾Vj#Ôj'Þ©OfgBé9Ï8wFuìÒÜq‚2ü8ë…©>áA¤£>ãBZ©D«Ñ=YXÉ'm´Z¬¸XîÅY4ûÛÊ},9 .y™pYUB%[3‹¸Æ!‰y;.›B¨Dkf1É8H±aÏ©©‚J.ñêC7/¨ŽÑ¦*]|ÐÆx­B„¬#òNgs>ªm¸Xÿ7ÿÄ?9éþøæÁãkeíÕl3  ±‹û iÊ©\½y÷àÑ[cLþäÍo+óÿ|Ž^öèZÁ V~Öc¬)S4’ä[ãÁY˜“A6/âOØÆ<é[« y‚y®w÷uûóÿÜàŸ/Hmg©IÔ¾GÐãkˤoK™r Š ¬Çÿ^ãŸÛž3~òV2¸¡  r“ƒðÕÖr‡Ùà’ð¯çÃ?O—FÍ£óùŒ Ô;X“µòEŸÂÿÿ¾*fí%ãy1àiŠ0k›ұؔpîÖËö¯­«Ïšü›Ô«_\9¥ýöQÔ­úWDRÖL&gYó-E Å"Pž ÝN)z"™‚n;/É}I&©ìN$¿ƒê‰‘©i2Uàn›>Üñ‰\Kðë6å_›5àKËV%õt}ˆSªN€>Â?lzð‘ªÏ~2I¯÷;üó)A—cPü±D‚§­% d¦ 4¹,¹ÖZýö10Á‚gL²R¡ò¸-æº#¡qÐY¡©õö…ÆáûBãHUh´ íSücñOÝf©„X÷ಠä¤ÈCbÍ–xŠ“SÄJ0ì>ÌæaWCSˆqL© u.ÇóƒƒNµVo0Ô >j†Ô‡š6¹G)|°¥ÖË:Q•Y '¦–™Vo 3ÈŒ!u™1“ÙÛGܦãÆòàõmB›çK‘“ÖG9ÊÖ>”ì›e&íÏ‚¨3Ò¬~DA0±³ ™óÔä@¢8çqe$›°uîb@6ƒòq#”¶‡´±àC=Ðâ4ëÞ7…$ÛqÔ…ïÂê?5Ù¥š‰˜gÙ™“G­¢’4}KÄ$‘;¦ÏÁœ‰I ép»hæ_9ª6ã­èˆKe*¦HÒ#á)L#¦¹|%Bi ˆ$ÕŠ8ðeD¾yb¥L—(a²ÒÏÓ…‘+ó꜃¾¡Ë7Å ƒ£«¶èZðlÆÇÚO:m<µzãÉàãɺñd S¯¤d`gÌ¡Ðè´Ð´z¡1ø@h © Îyœ‘<šÇa #ÃàÃÇlßã…Ô<ñ8¼Î‡ð8œæ‘ÇáøsÇG"æ?Ë%+t¾'Ž‚Êä½$÷‡®Í[Ç©!ÔC—ÀjÙ€–Û $EPöPè1AH.1ŸQ ,r} #WÅG´æl©BüLÖ$Má·R&'Õƒíµ9à$éˆu|R åܯ¯¹«ƒ¨@ ·±—Ô ™)*Î…úÏfM­;¿3ÐikªÕXSXS†Ô­)sA¬’ê‚`%{¼Pä ³BSëí Ã÷…Æ‘ªÐ8è” ÊcuAtà‚8|䂨˜ \WHÕ1Ð)Äê|Ähº †?ç‚@2bÁ¨» †Ô]©.ˆJ0àR&IòreŽÃ,MëårÇø*ð‡>„‰Qó! ¢ùÑ|ƒè>„tÂ@¦í?m›È/‹sGWÚ¹ÕUÌarƒC«‹ÀìZÅ\ZZA( @o‹ÔC‚­¨QàþEZÁÍæ ^Ê6ø©8+·" ± —‡#_´Þ߈›ÁÝI=µÚ<šFCËàt‘ Ëðjeß$9œ­I6øÄaŒÃ-Ùlvƒgöc]q#Å|D‚Îèd·_ Mq l ‘ð±DBãüœ‚@ñ\Ö‡ôF9ñºm?Ü/çu0[(Û– –½¤ !+.'çæ°ÔèËž$_me<Ì£µÞÍeOè.‡ØôAvOû}%+/™[!ú­'ÑO´#Ûƒ¥zôäg×gÕµ"éÃL¿õ`%¸6°/cû£ï\èmµIŧÞ'ù Ð5n)-͸@ûŸíÔ5})‘–¯Ôû™âÚ¸VÀf¯ÔÛv" ïÈc»1›iköšžÒš¶=XZ2ã) KxkEÒú…GkKŠ!eì£ûÙ‘.ôLÐc˜:uIxX웸•/ÍYà°¥cÎÿî[ߨ¯ìWzk¦MWÄlž•úös×ô<¶Û•­Ñ®°Fm–vºÿ9“,ÒµHZ>Óo¬W‚kÃú26|¦ß~ÌTß l;&t2Çô ¢9ý“¥9—*=$‘lÉ­Lz±rjMi”ׯ’Ø••S¬„7‰fƧ-E8¦Ä¬¦ö$R5KØÑ­Lz³ð‘t×ä/ò;³ðYûÒȶ¾F³Oð$vßÂ7²frð·Ð;Þ†ÝÅ–72ý¿#“Oíàf\ VŒþÀ3ÛÔÌ^£@K+ù±‰ìíÅf„ZF5-®Æ‹ÍåÅD4’ý¿Wò#SÂgÕ6mVœ9Íp®Þmöü(fãr. .öÀãËPç„ÓçîðÐ9‹8ä„ëЋ҈ᔥ®åÀÉ ¿~ÊÓ 'pà“¸ç=ᔤa>á6„¯<é7¤å<6êÒ¯u™¨›Å]¬øf9Ûƒ0 ŽÅÂå2e’5wñênð*BõžøJ5Ó(fÕðˆ®'¿Îè{…"Ø:ÊõÄ–yNúUëÞg –Ä·yxMºr/v*± Ý(0Õ}8$Uçü^Ž’›¸óÞýÁ}(sÔk`dp ¡,Ý…òS’˜yèM9ˆS-Y õìÍ6T¸u•œžŽå’P øŽhEŸÏ@Ã îŠÆ.‹:¿eƒÛ‡#jͽ nW•ûuh‡ð8„åv]-SÒ¤™ ŽT¤4Ÿˆ(2ùÝèL’<ÌÉÁÔÌ(‘_Ë΂&–: š˜K DAeÊAv–îþæ‹Ÿå º3šÓ­¤ô E ¤zÀ¬‘©ù€¾r¦M! Ê“³R¿œÇ“9YÜ×eÈ{ž•†Ý7ƒvÏÏÎg{‡suñb¿~ä fT uV`Ü^~0{I“f€ñ0pŒ‰0v ËÀ»¹kðVÏͲ¤\%ó{‘džJ>Y;Y´"œ1¥É9ZwÚ† ŸÌZrbCo¼À+ɉÕe‰ÜINôÐo“dC¨"xèxrÔ0;±x½{Z¢!î&r šh(:£&ªÛ=c#—3qõb2zÐ&¢'¬  ŸèD’x¼d¨)“|<„Àû:j­‡0× ô˜‚ Ä©²ßŸñ!qº¶rˆrØÊ!Êa+‡¨‡­¤¶rÐ~ÂG$ìp8ÓÃùEXÙ‘÷ÔÃXi¥ê!ézÈ@Ç'ý⫤.­ŒÅi.»wÒz4ê×¢G ¢éƒhzÄ º1®G ôž‰+>»€8\'@®ýyLßòùý޹ YaÙËépsÃ$Gš{Nõ6hÂaÚBð߯,j„¦1pÌ8£Õ4zk\ÒÒîp;¿f›’¬IMH€_“¤O3$`Q 1ÞéÛ‹¹`È/i|næµÞ§ïh“Ð$ó+Ýv:K++EûŒÅ»èÉ)¨$¸o+)o»R*¶aû'äÛÑlZëÝü¤6ªËÖÌVÈ®ãÐ~mûåŒã²áí/¾í³.} OfKãÈ¡ÐV&=i¼ZOíµ½äö¨ñj׎ V"ŽÞ;å­#´`Ù“öÒ'ضµN±äÞ©­Ü÷iãµ6g£½´˜>€>m¼Âv­„ùÚ§åmëÖ'('Ú^òdn[{C»Çô‡¯[™ô©ñjÍi´×“اƫCX2N”ö ¦pêÇ)¦WôÉܶ¥ÅôgT[™ô©ñjÍi´×“اƫCx:N„ö©T:NÕômm¥¹M ¶ûï躲IO‡Öˆ™êÚÆVÀ4ë¯+ÅV·g̬÷x,g˜Û‘Ò…½ò °™LÞÎ_ç÷íß8’ëV>Û»ß8¬ûõ3ѵ ‹Ù»‰˜cÝÀv–{=°”ef)UKÏí]gR!^nŒm0·ho.qÜîQî’sœzHÎAû‡ä©’szH®òTÉ9R=$ç ýCrŽÜ?$wv9$ç õœƒÔCrRÉ9H=$³[ÉÇì–Cr1-µCrÚ?$çHõ\€vÉWC„Ûéþ”!bHÝ1Ð)CÄê|CÄh"†ß3D¶"ýÍQ +\J¢mBõSE_¯‰á¡öα›b‘D¿ÂÊ•pgm\Ô9³w’„ åPL˜¼ª&N' vSA|Éíœ 2¤®‚ tJY¢‚Œæ¡ 2üž Ø9dÕtÔÄ0RA†×UpZUP㬫 "¦õ•X5&`ª¸0àAz ‡«é1cÐ’#ké1t×_Ùzß_•*¦—+gCM†Ô§š^¬Î™^Œæáôbø½é%`|zíåçüµ³‘ÏŒê$rï.H³Þ´GüÚˆvä²wbž/ý8Nˆø:°&‘]Ç,sŠÇºâ1Ð)Åcu>ˆâ1š‡ŠÇð{Š'`ï­xZguÅcÈ#ÅãMÓO“Ë¡â)ÂZs¦€»r¸›!Çj†œÐ{5CNmÜqBË2]fRœ ƒ8R.tfºð:bºpšGÓ…ãw¦‹„‡AAvß”ªlÁqbWÀ+CÐåG§T€ÈÉÜËì EûÈRÁù’Øg|¯äÜÒ#u…c S Çê|…c4Žá÷NÀN)ï ªp ô §ÉOW8†â6?'yÐMf²Ñô ÆÒcìÉ@ÏéÑæ­Øvy¾<€cîøÉœÇ©¤IRŽŸÃP1H!ÑS2˜Õ”y;L½1…ÀºH±²o=•©¦±R9üšž• WôBp¹Q6éšßAÐ’iÊNO #̵Xzˆà“*±w ã^¢ì†‚ĉnÂ󂯎dzÝ2®i˜¦ì£Îý9È+BzÁ_ ´Nr¿|Ȍ澔Kl£1¾¡—€WfÓçÇ׎Y8<*°™ŽýÏÿøëOßÿã‡é/?ÿô·51…ÖÂ÷Œ²ù58¼°Å*“ñFˆ.$3¿Æ6]H~ ^jêº` ð“§¾cÌæÛV\[—ùÍÖx`¨#Ør¥/Ï)B żЗ’Ñár„ŸPÑdÇÚNÍVü–h>2{OÏ‚@3·Ú\æF$@Á8¨l5¿•'Íý¦`%:ë·ì”­ì DÀFз”ÁzÎ[±ö€]Žf Ìc`áq4€ržã½ÔÑSqýõ§_øõÿã—ŸþUŸæÖLÖKÚÂr*— v&qˆ&ep x'ô-Xïæ$YÞóh „µtËc( ¦Žƒ”`Œµ… #•`4àu’&„V=‘ŸôÄ`äžó*üì鸳 ¦5–ƒÈæDIidžØf“= Ì «Rv,t‚¡O¥ŒIaþSÍcÙÎéOŠÄžñÌÙp:¹ÝòëÀ|8èîhØÇ”p3Ã99RlÇ#MŠb²áùWÐqìßüSÛÀ b Õ4¶21—šbby¯f8Ø,e в‹ÀSHigpxz©Q$s/<‘&B†xϬWÌÒ·ü˜¿s$L÷ Ž„Ù °zÛ×é©Ï€ubPÄE½ÁµwëXÄW½=;s#†U‘©¬Fˆ¸¼bô¥)~B¯Ä½®+ó"@·ì€Ï?8æŽù»%™q€ \úޝ]gá2v3ªSÛþZßAÂcce7øI):‡*Àp{ ¼„f" ¸X~s f\~B#è¥> m®—éÏàßÒ “¢2Þ ‹ñ†œŠ“–ÁÙ³Î÷ A²~ðUŠ‘z‡wFIá±ïáž¶Õ5‚¾ 6D}Ð|Ü~ˆIW¹û˾]‚ô;@ ¿?©Èš_“™•QcŸòS°Ý(—÷}…TÄuÈ¦Ž§.ÞÚ vä IµÌ×4ÛäŸ/ˆª9Þ8/PHn)a«2a•O$Ã"µF7V#|C¯åVÕˆ.#rn<¥}¼¼­>î+(Qæí&^ÔmãYƒãaQI/cÃXÔËáz¬]%æÍѨXFo)îònÄ9ÏWËYéÐ¿å«Ç‚‰ É:VÑâ䔡g"árk%}Ã#’â;¼ÄA1K”]JÀÎtÈŽú#¡¸`võ¬ºàYŒSæ$ VÀ+†s¸G’Þçb$‚g¨ 2ê[î}Z!HaÔæZ¹çoaJ&í9qwÉ¢âpÊówÞ8è†üe4¾ÊQOÀƒ*I’íàþŒ÷uò¬'ã+²o·ü:=Eî´kb™«§ñêõŸþðï_ßdŸÿ·tõöQ¼Äè¿! ¯A)~ð"_]ÎãvÞãÃO€u``2á2®²ê‚Y@E°dP$ ¹c³?ÉF~F†7Z3Ì3žKdÒ°½ø:!¦#ŽŒ á%F97‡[X ¨ŽaÖRP[6ÌÔJa¤Á $CèyZøÙvŠiZ!eŽ‘yZ1JÒ2‚žLÒÿÈ0gºý|¨Ç*‹ -S:«3‡_¦‘Ÿ…#C^¹Ì;à #Ò³¬hò~®8h™b^+Ÿo…°7‰Áß™éÎᵪBtå1Ÿ`”1O0ÒP˜våJ ÂÁZÜKIÜñÊù»Æ­Å[®ü¸Á&{¦œg9?ädÇ+‰R]SÄ ]%ð…zkP'•²D°xó{}#ÁC\cªh[<ùùz¡Ñ ñø1öTñìİEZ“;žáŽŸôM<îG8í&æ"›±.ù’çûÊwÅ,/^Â]Ø$U]NÄ€[ùRÌ;q^;ÔÙ˪È1øej9p·üü–pCÉàKs& ^_(9j B3ÑMº¾Â‹ÆBNY<`Ä+~FQ蔢®Ïiš²$u0¸íóÙéñÖÕYû˜nêâõàB7œöYrüø¢%0ú3ÚÜÄ!ŸH™"~ÿœB~Gü%Œe‡ò+å°4ø}!+•úe›Ô_,ý0úÎ;®~Ö‹Ù– ì¾/|ýÁÌ Ý¿øCçÚ%·_ üry÷̓ÿÁùêüÅÓé€ÑÄ;éHárÝ×="еþ÷¾ºú èþ™®9 endstream endobj 178 0 obj 7331 endobj 181 0 obj <> stream xÚ­]Ûr]Çq}çWàÁЬ ³9÷Ë£d€$J %¦T,‰¶•È¢Ì8åòß»{xˆéÕ»÷¡­r™•ëÌ­{úÞ³Ýѳ¿?pGÏ~ Né¿zðų»#ïžýñ?rôÔÛQMe))=û˃߿rÎÕÏžýÏþïÞ…¥gÀ|ÅÿœM@_—– ŸO à—à€æ‘BYZ(º™@Ñ/ÞáâŸÎ º„XôFˆàpŸquÅ-9âÄ·3(.Þãaó?_NÈÚ—: Ï'P ‹óac³­->ù ôLûŒ¸°û àÒÒ•-^ÃpÁ§¥œó©~vˆVJ´)b¦ÙÓ(¹%øbŸH ?Æ”í 9.ÉÕ-PYjÉ6߆–ØúÆÂ ý±ú…×°´¸64OËjpmè…® Nûm5á.nõkCZBC’^WÅ—‘‰OpÌ” ‰§}1²[:rÉË“—¦ˆ›ãý _àät!cÝ`šH²ÆhóC¤ ©ñíNÌäÜâ ¯ÆÀüÏé'QªÜöóCÄQøcž7Ô¥¸dsd"âi¾œ@D·\6YçÑã ”Pbq)¤ÒÓó/þðäþ謩htôãï§'Ͼ?»¸~öýñçÏ>ß +u›ou!©8ýl=fÙÙÛ’säåþŸã=)Nga—¢LñÊ/åU* pAu„ÔIu/jÈ}©§>]×HÐ×úe Ä»!á2^½š¥ ÉÎT…Ü][ø*à, |^|E"ÜèLY&qóòÝÛŽvð,á9üo" ò»BT?ÙF±¨ðpßÎò¤.)ாRåE«xš³äéLd¤3}×Éù%FÈ®“'¨ïp‹ž^* WTDŠ}ÉÎë¬7‹"æý†›[1'éÒŠÎ0{P¥›×ë(-µâÞgØHã¸fÓ'‘ÌÑfÛ_³iÈL2¿WÜðí ª‹c-&@Wȇ¥t½ØK0Ô³dÆÒ®³½¡œü’k_•p„Zb mMfqIõèÝŸàzzºc·tŸÝ2íš6IȼÒÁ IfUZx É·qÓF:+˜Y¢‘KAr:*Ï®N&e$¼²áXä ÐìÅ2".\x1d») Í‹©¤ÆpašC—e­¶º÷£ê-–Fw4xÓ[”˜uoQ"ÅÆ»š!ä>‘]"A·{Éu+ÂŒ³  +$¹¨‹Y˜gvèÈW 8ÇLÒJ¾ZŽ{#QÂÌ!A³kØÝø£=YÿOrö%Ýoò1%h6 <Ùðt£%è²*}ö:Rxi~\r{ulZ’²)r"{7úéì‘öª8ßýr³%DæqMËë~q1ØìÌ>XÉÈWÂýrÃ÷6éY#$J„è - O%BŒ$´ N¬xˆD0ç‹~ç³&³m»Ö5b¬¤n”+z+mªÜ‚}}b#ƒ·ýV4brdÑå›’èL“¯ö½Lž“MÅ2©É¾1Y KìÞ8ìc8ž”ãò˜× GJ¬z R£M+þ%ÀÔi[·õR>AÙûlŸ8rßÛ†ȤŒãdÂÁê7å~¦à¡lͪ°¼*f}H‰L_‰ wÔlV·î˜"œ¥Âë,¦èá¬æÈé @ŸÌ ²þ‚þwAbÕûÈë9ŒòåݦÜþ,„:Ëd¡fEºÊ|°ù#lcdã~½HK‘– 5"-AjDZ‚Ö#Ò¹‘–H5"-Aëi‰T#Òöfï"Ò6î"Ò°0-"-AŠÝAr×¥ #ŸBèÆw{uD«%!¹„ÙÁqæˆìñ©Œ3·‚Ó­™D…\òÆêˆ =D›y9”“•=ÌÑ!r šBôùÄz£›×`^6Pºra³ƒÜ¤qbÅì ¡ÖîcÕì ¿_a>%0Mˆ€@%.M¶IðxÜÒ6qŠ ›Ó#(úe\‰K'R†9F›!Ò³y›!’O*C¬Å¥IøÅ€ðµ¸4û ¥Ùâ#1qþx.͘Z6dL¢?j;žÓ•]ŒMÖQÓd ¿0ýP LrOZùظô½_Ùai<8*-~·”°Õ˜´À­‡¤ÐŽH ðF@ZnIG Ðj8ZàÔh´Àl£ï¡Ï¿þz#}ýÍ‹µX4}ìHJŠ®4¢Ï6G¢Ù—v¤ˆNRÉ©Â1Š84`ÞY C“>ˆõV£Ð„ô}›×R »Á>ð \‹A§]þSRSwBY¨x§9;Y…ø#Âi^ÉØsÃ7=Ð^HËÙgŸ]$í7G¤B&‡³¥éÈV¸.GBļM…̱²Í›Äòq8$}udzUÏID^Cà•Uµ)>öø8^$Ç ¯‰†äÍã˜hgs$œÅ¥@Χ´Ä-Hy š'Ëœƒ šmgâÓáçÉ]Ζ?‘¦VÍÎ Ébμh\§Ù¨£B"…åß—‚‹ÿvVnu÷ «Ùð§ëà£NñéÉ8ÅÑVäAˆeÉOî|‘öïÕÞ*G&‡)£ñŠ®$ 5ÛGJR'~²¿á_J7 ¦d3+P./ ï¤%5¡_›K©A½Cäµ~w"‘.e› 9én{Vò‘dSŒÑ曣,žˆ11Ó}·ßÉB’àqùï-ªG£’)!i5ñ¼Yê µ$ Ç{ q­ ,ÇWBüd§%¨Èt‘WFé’Dب«ýõúp^hy;·ÿ尊ŠaL‡–I¼pÒc¿–Ïdì§Õ¨ÃK€Yqo|p?”è3tóA787‰ ×q×ûf9™ë0Û$ü¹ÌÕU²"`C3ˆEFÇ}€íËñšp¸)å›Ã… Ö ™Ò•Iç¡:›ù~cùdr¶¼A†àH{\ù%º¾‡OEÎ~Ýè LFx8€ŒÜùŽ—ã‹ùrÕQâhï¶ÔÅE<·yºÊ…‰@\®sTkÝ“Uº5;içÔlÆä\U‹Íˆë SÇÙfqí‰ ½fqMž« $è|V4œ‰Ã5ÍI&NN*÷ù¹ÔF¥æÂÕeOûl«ËI½ óêŠãÊ>{q…ã’ArZiQ^HøüSYZÄeO´–brÄ ÙÅ¥B¹G›E¸‘n¬-FRäóíöÑ¥XÉîD"(Q-2ÂsÇѪŒÜÒC·y“+³"/1¼žØSÏ8ÜoPO“3—|2ÞŸ—vá²Ìt|ÄTä[f²M+IVe®éÈZ¢-ÀÌå8‘Ëw%¤¨Ú¼… Èëëˆx©u܃P\¤¦=ùD•¡$mlÕ“¼/ÏõFúi.Ûgï y…ˆQ –J÷®à²”Ä]h§Œ¹]äCb`bN-'1ë 8‰TŠ|$D-ò‘ »ÈG¢õ"‰ú¸"ùkµÈÇÞÛ]‘©E>öt»"‰Q‹|Ô“T¼d²[ÂCºV“i.á6¾+Ê›8™Æ1d{œLÃÐ$—kÊúPz„Úvv£É;\4”š¹D¢YÏ~c³D³\qyP4lc‹úlfõ†¤ÒJ‚X!ïê%A´W@j%A\µ”å+. J¥ü£ð•ŽážÚ»}ÓØJ­ë'´õ\ülJ³!Tb²¯ð®]cƒˆle徉РD§g­Uqê€{œ PÁ¾Çl”ZlÖN+Ï·ŽŽ[dz:à"“i=ªÓ¼Èä&.Ñù ¾É!ìü¢¦ÌÅ ç¢&î\+úŽë©K°Y•50g]ï_ YVäZPq~§§håNzºìIS)jŠe”eI¤^Ô”IÂÀÎnœc[\€Ê0¶«x0sMgè‚”š¦ÆöäÇÕ4qÐ™Ó @¬iÊî“ÊlR9ãV½¯i’ µ¦I‚Ôš& Rkš$h½¦I"×kš$R­i’ õš&‰TkšìÍÞÕ4Ù¸«i‚…i5M¤WDte›³mòâ{²i¢>†µv®xêÊ)(¶U"^Tè¾f[Ñ-oi l+ºÁes¤€\Š›mn)¥Ú ØUMݦù¨î®ígSÍ¥rƒGŸ–XqbŶ"ʺ€ûX³­RXrAÕêžXCP©{*qd\`HÙ Gâ@sÝSeÅ¥_ص~ÜNIŽ6Cp››óÞfr÷T†X«{òœF@øZÝ)tN“˜"&qRõ6»¥DöäÆ~Éž+%<¡Ø€•<Þš7l• ûÎ8\¨P7®`vÜ¿±þcJí“}MK œL†2óÛ‡T3oe]+ ï AÏ¥AÆÒW‚fÕá9Œt)ÛÆ|îÚ,UãVéóè£Tíˆ+ÒN¾þâäøøäøû³“ÏŸ<;3ŠÓFæ´yXV§ÅFµìg«<-²ÿ¬L!­&ò ˆ€pX –\\œÃ£UʆÈ1(ç>]«2ª£ LÂWªÔø~³›;{%K$cD+B…tfm8ý<)I^ÎuKÐJ©ËFŽÙ}øåÛ¿¿ywtýÿ¿þúó?ôÚ!¾&¹V«z‹ïA™€Z±šçN㊸¹<„.;û#¤{.쉜ohäühÐJÁšO¤òz8hÏ™k&``ä%NѺ€È5‡¬q¹Q¸’Eî\’“ìóääióM?€ :t„y”üèKŽH>ÅB iIÅë[P,ÄÈš "ÿ¼ú7#)×ÑYc%F$FKŒHŒ–‘-1"1JbDBÜ>.}º7W´5’˜øcº€q†µQ³$q}¸æûéègIvðpÎLþ,ˤC+Ñ>‡àF«•Ä̦¹Ë#Hh†RƒRÞÊ!^, ×¥½RÔˆÚI_™6IôËæ‹éãK̺/‘JÚDBÔ´‰Ùi‰ÖÓ&õqiùk5mbïí.m"AjÚÄžn—6‘5m"Ajo´)þº²Åk¥ð±ÓœÈßJýæ{·iÎaæ¦ðÙ¼úÄà9&Zù=46f r¤Ú6ÖÊO?¹`óçx)­%›fÜÇ–&~¡?ÒaÐÄI¿"3o¤žL%*ŒSæêld0%lEþ-÷ôH¤¢ô¹Ò¢ày_Ìñã¦,@zLY€ô˜²]J]Û˜¼$øæ¿ÜB‚‹ŸÖ£ËÜy+®ìvÃ@pù®D®D .{?j)`c›ÁåÄý÷8—sÜ¡ƒË‘ŒŠxÆŠgPÃ(˜’È•à2W$5‡K] .ÓáU\Ä–Éïi­? ë"eü;9äÔ›-†IãÆL¿»yºë‡¾ã èæ:ëV¦Ÿ¬5 sߨ¶îû' Žô6ÐxåÍJ2ËB9º€±÷%“… Ço؃üMgÕá7Ïáå#º$ôT×G~Œ²æ•δÂ>vÐ1ìœ(Ûç8ù2Œ¾3¿?µ«˜‰èy;3k·k™ ¥zçîi‰Tªwâ.¬.ÎŒ r°ä>Ý´ªÄ¬GP%R‰ JˆA• ;‚*ÑzU¢>.‚*­FPí½ÝEP%H ÚÓí"¨£FP%H šK ž#U¸9¼iüµR‡ #=UK´Y…J‰ &Ü´–iÖY…ìF¨K‚4·Î>‰Ô<Ü4,‰|¢V;Uå€×"—.Œn5“‘7moÓ#·”¸²Î«½t}Üø“ïÀËÌÅfwþcIE?øÃÁغÍ@ì¥Öއ„@vC¹³A"g·ÈqÀºÙüÈÏ<E¾Í!]öƒ”ÕŸÌö]­-³Æ#”µÊ7i¸ýQ'ô£ÙE-$p#jptÎ%\E–eçM‘FgPZ²Â³ŸHµDa0;N° o}\0sï¢CÊ+µÄ£ÆïÄ+~amÍy+£µ­àpgPLL¦AQy Ü .qç²T£6\¼wݽ(%Žäçà²ÖÓäÃ Š ø§3ˆ À<º£B‘Å9%åX¢—uæ^Ù A‰’©$q72mžsµ ÆO¦ð+uæñXrFÐKKn-nLÜè¶§ßÁSX{¿,qíÏ¡´ò>Ù´e%ÉÞDÜÀíÒÙo—ƒÁ‘u4âæ¬?\mÚ²m>؇ÍQ‘¤ÜXhðŠ®Ù´eeÌÊÛÓvNÓÆtü—"”à‰2~·¥¦C©ÊÕ…]Ù…i-¿3òâwòÛ=!àM»’%Šü0‡ÙÍb$’úq8êâŠÍ ãah…_®÷œÇ²è0t¯ŸÔ9äP#îê‰|›±lÝú¡¸y:ïƒ Þ=G˜*¿4‚§v"œ"ˆiwü,>N¾Ûº&ó[1 ‡ŸË°37<™›åâdî%3-sRHöÕÌäu¦œ6FŠœ±²y¿ïÁªÔ½6Eè†Þæ€5[8ôA~ßHÿ›/Oè›–ŒÛþ¾Àþ¾·,†»®( R»¢$H튒 µ+J‚Ö»¢$r½+J"Õ®( ZHµ+ÊÞì]W”M€»®(X˜Öe®‰ËT¹àUÝâl{a!ð‡’Íã¡ ÚlÎÏÊû¬f´~c„ìi]õÆ…\#R{s•¶ª/&`ø½8§PëJ)Ùj# \©d³ÓxĶ>ƒ8j‰+”ÝSœ’1/Bô\µ‹§¢<ËOKgîd‘w \hÑŠÎ*V96­}¢óIä%ÎL*²‡ò^޶¨œuÊ(~»'KNáÌ 5-3®ýDýøW,Hò ùáÀÊÊ}Vº"êÈ\IøÏvE ãæ]LµÞ#•É!÷²åK٤܊\ZÍi7²¤’-W¸¿ØU[(f²Ã›ÂÄOe"»+·ë¹,sŠ:]ÿFè„ÒÚû2ØJ"­ò=Ö³¾êƒ?ÇgW3 Ås>œ> ‚gWIøØ•4²™êV´G}vï¸IøJ? NÆÀO¤*uÝH4ÜŽWªqæ+ gÜLœÄðÙjÆ_m«¦~¬ÔÝðK ›Õi|â§PLQ~Eu¤³íç: H =VJ.âHíKäõúÓÂÌš ¯u¦ŠËÄÇ:ÉÞ‘¨ùšñó+w+#f\m¨îõ;qkG fZÕgòMî=’¨§Òôî¼A‚6.Çç*@ŸB¹(Éj Òyy×p ;p1ÊCãø âD ¯4’ x"+ Ê6®£³7ÄŸ´v؆3©Ë›âD'"œ“Ý ÉRàÃÞ1èL¾,ºMßñDTÌKùâr/s±é¬ð¥°¯É‡Îº¹;†¼þ¤-çñÞÿäñë_ŽÂÑ“·?¼þÛOo9:tqôÅÛ×ï~\}ãv<–ãA’F@ I#’F UI#—©KÒ%é’FÛ+J²—¦Ué’F tI#@º¤ ]ÒЪ¤áÇ!`2e@‡Vø%M­¸ CÒðçí ‘¤ñ­¶¡àÚh9ßÚK皆Iã+ž&ˆr³Ï»·l sVŸ?ã*A l¸ מ.ûñö…=]N#ý+A‡Höãî~ÂÒæ‹Ÿßþð¿÷eÎ.Ÿ¯J›ñ` fˆMbÖCl9s®‰#%H¿ü‰æ ×ßÌHMÁ‰ëÀ‰´Ä­]‡š†ùjo¨íÊm`Còc9VmEÆ¿:QskÃË.¢z0NZîQ!^‘/T%2o$èLöÆz#A+×$襌’Õ–7¦ã¸tòÓ‘hí {ÜÈD!´Ø#'¹•5­tgòb}cH~€H¹[sS ÷ò¤÷‡`͹üW~H8|‚­ú º€¾4 ËøFü&ƒ9ûHõ)'y%ÛG žß¹|/2Õ¸19ìÅ…½òû»o¨•>e‰Ê!~iš7öÑòø~úÌ“¤æ_¨N-¢:•›ÖøDÕ¢~_É&0ó§ÖwÏÿIÌ´~R°„˜‰jÜûÁL/0òèüÈà”¤‡'ñJÊvˆÒš›¢·Ï‚ÕDõx?œÃ*Í8ñ5~—¨“. ¸™µïµø2¡Õ³6ËcÇ7[ï1Îïf]žG_²]à#Ùœ©N8œòÑV |½ò¥,ýáN Âšà ˜+ùIÚÜ"€n¥ÍÍ»=•.Lh¸CÇóãÛj$²k»”¨Ó•x$©†!7üX¾¤áüÆêømÔ‚[XS[n÷%. ¿Ñk•™9L”R©@“üPaT6s+ˉ¸PS¥’Hë•ñD¶Dþ'<Ù”ÆÇ‘‘&ej.‡(9Îíõ¶¡ä8·Çmº&ßfþÞ{µ•\¦›Åeæ©eòí8oaŠgNv·!žùÙ‰š·”¿o]J¶ßÁÙgnsðÈH±û¨€€îú<–ÂU™þ!ezªØy$äoÖ €3w«E€ŸËì?p%AOñs\Y_ì…ÒŒÃi àócwÍ©ß3 ïG‰õŠbA:.–ýð·Ùä„àSpÓ/þïõÙ¯?ÿøîü—?¾=}ó·W¿ßE_ÿõðS£÷>º½œ{?x¿šÏß½y}öæõoÞý6k"WˆË/_Ó½¼_ÓãŸÞüüã½å°9ßçYþpu:â¦VšX sVxÆ@³× Ììwrh â“·u¼»,0ÊÃü;™¨¼kÀÞ" ˆ^[juô˜Á_$ÆIÑgãzÎâ%=6­Á‘¬8l»×ÿ›yÆ™èÐpd¤¹{6ŽnãØÉ³WþÊœzôú·öpôóƒLî% …éÿqôþùwïš ïÿç·G¿Ð¸ÿt•Ž endstream endobj 182 0 obj 7195 endobj 185 0 obj <> stream xÚ­]Ûn]Ç‘}×Wèa"'˜Ìñî{÷ë MQ6I”x‘F@$Nœ/'˜`¾l~oªú‡§×ªÝû  µv_«ëÖUÕËó÷ÿ|¶<ÿGùñRþÿ˳ÿìËóå¹sÏßÿù™{¾Èîy]ž—˜w9†çïxöëO˲äß¼ÿ¯ÇÏ»%GÂ\cšÛO·úãæç¶FÈ«TvÍW] wFC€©»¹¡ ýq¦?^êËÃX¿¾N:©D_Jm›#Ð&·ky¾Ž®Ôo@w¨†]å yw˜Pïüöø¿¤]LÅ^‰—Ò/»¶¸ùy_vK°÷ûõ iç¯á§O*†]«ÜgŸÌ­¤—5…á+ûèKÙUÇTp6€jÙ¥ì!\Ò¶¡cëPœÓRçeÛ¹÷#HÖÓ ø6‚÷»lìûõÊ»¶<ȶDk“t4öœÂ.Õ¼ÑsÊ»–“}nû2ð\w9×9……]0Ù¾@U©ÇO¨g˜L”£°$îøv•]q>º(»æõÉ~ÙLؘqŒ‹tœçä£l_Þ`%QØ—ó~¾i1EéŽ0ß—>©~çÝÖ4ªÍÇ^  M‚^Y¿äìŽûéürDV¡ˆh“÷§Å§A¼‰ø aã‹| JÛ|ÓŒ²«îœ¼;ð¦áÈ킳°rp\h;}3ŠP¡P*ÞŽ²+î’î>€^Û2D¦%«Êp`NŠG×§~>J1¿KƉùàä@¶Ä3x}ø1ÂÅš¨ Ïå#:<~Wä¡ð‘¶4©7·5s!×J"¼#ðMø–ysÁί{ŽŠìcϸBÚ«n"ô½œõe—²lÈÏ¡?]½Ý.s4HVÆ™ë¡Ý}sûVJøâ_õG@¿LÑud0„xÙeé‘Wtͧ<({nsdyqéÁ:3xÕ™‘·xUK#ЋQÀ‹AxY¾!‹ øàyC7e•çy³"]„=å…‡˜ôÇÃyp{‹ÝDÞüR*‘.´ø*‚/ Úpêî­„¼ZQðT’x\,9pNÉc«Ä‹Ý¢6Ùµ:ˆ"Žb$ïËAwµ‘¿xo–(вÊÞÀ /¶p´8BV¬ùR*!Ç•¯ùF ¸Ž ’e¬§\_šü¥ë™ª˜0¢ ¾žøE@ïKI‘@d[é1GÐÇñ,bÁ1‘tÜìG#Ò(sxZL²½…~ã×#¡/btpï°Ñ¹ 9$B-Ü2ëòy6Z†±„ü”†/öŽ•ã®b¢#ÊNj ¯¦öXÉfiŒ‚¯Ì@‘” øzæ“é–DýÀoÆ](b‹ñ…  TÎcá5óVLƒÄs¥¼lv+ÜÝùÁb’uŠ,3aII¿h6ò”„²„§|Ñ8üÈè £N„³"æ5+;®É „ìÔùµáOqb•‚§$ßtqhónƒT²ìAݘŸp—¹‹krˆ«°ŒÁ ƒ§†˜Æ×zG;L½‰ŒkZLâÌNÎoä•dâÔI_mä/&Î zay mŽd$M Á̇Р§+•€ïìPý^£´ÍWÛªÞ—@ÀKSÅwÊiG [tÊãœCœ7âµÛÎ)·‡YASè.sDÙí@ë=ÙNô4ßÑj«LÕQÀ€kNª™ö–.æXd"xûc×z¯Èû6v­ªAó¥È÷jЈ1â·ÄÔRçæŒF}Õ-ÔØˆ‘µ/a>p½¶t„ù0bÄ’ŒaÚW!µ´6í+ôPeÂ<éìK;q¸à‘íÖ0i7±èS‘v<âØf©™µÇÖ|•áë4FÜ%8YõÖ †®¤·hz2Gà-ÆgV1ªóMU*FˆaŵÕ"Á†¬]ÑÈŠ /‹«‘Ñ€N¦šUc27‡X{«P)ØsÖè±°ÂsÖrSÃ,ädz±ÍbOYNgÝa6´ZvK¥.Ç8má¢P„ˆcñÔÌ-k¢›§˜¦ý9'Švpˆy=®?ÊÕ(+SÚêEB*!ÃÒ·Eö<#ä«ù(bW£ýiñåXžûéZr§[„,\ 0/¹ïº­ À·ÎE,æö@%£>ʉtm>¼´ˆfO3¾À«„¥Ñ4oÐSS1GöqÁæú]4 ÏÑJÑ€[À EeC«ÓáùÅ÷()ÄØÇ«_ý7ZæsãzA”•<Ý2„鈂d-Ì(E7«<Ä+¼€kš¡^ö¬"æCêh”}.¶Þzg&º›µ¤e ¦¥•³r–5EvzŽ‚_D­ æÂPBrá!^á­w婲dË\rëÛa†k¢F¦2]õÐôLƒ¸ –Ó”¸eÏvÍÍeèvJ6µ¢„D§àÔì ?¢Å>$+Zˆ¦ §íó8 "×SU,îõÎH^v!zDáåêq¡qB¸¤P§Å2Â#½Ë¥BÉåSœ3 ÜvþÄ3¯"I”³©¢jÿâgêjtê%`GŒÓ<˜ßRf©néˆù^O˜F Eî¡ú|šþ¡QY•†±‘ýãTWU0ÌénÛ¬šÓ±T„œ=A9Ø'o˜ÌiÝ̃9=xŽt²#,ëèÈñì~¯_Ž߮Ğç¶k‘FôâÐöÛ÷†ªB™f{5rÞ¯Þ?“Ö;Z-±ðóºÜ pùþ™×ÄaÝÇñýŠæá›cÌÒ½ÖßZyøý»g¦ï~èñCÛI“ô üAŒ¹Ç¾ˆ‡¦9îLæ$ ˆ@‡)鯵öèûÝ0"B;Lçðëñl½<ŒãÐìýH‡ße*‡^Žþ=´£‰ Ýè<ÚÒ ÚÃDÔ=ÔÊñ8þr?ªûoŽ0USÊãd¿³9ôuÍ¡í‡ñÐ úz@š>42t¦'zÙgsýð¬´n4ºeçâñ Œ¿Üó8'-â±Ê~N¿Ïé±/n[G,ŒPçÁ¡¯û9=6ý0§±³Î¥D–Ã6ÝÿÊgáè¸}?}üýðí}ÓëÇ(ó‘ìš‚_{Ú8%H%G„xhèj“pq»Ž(â{¢ìlØÛ‡5?ìÊÃÊ1[8…o(ëxNa\tx·™ sÖÓø ªSN=q½S=Óû)’Y“ö÷pºvípüîWûþ÷‘ÛÏÙÿÃù<Þ0øê»ÝVF^<ãÍ$—Žº9ì”Õh+Àç eÆq7‡=2Û}"#f®= UäÂó6¤–…tO*¢ë†øtPZFÃ5V­Þ†èÑR5¨ö‰Œ k¼F^Œ–.úÕãMÂé¤bÀâ‡Ûz“ÞÏ=^ÔI½ó±§ì¯õ>©˜®¢¶-‚ÞÚQ >‰),0„ÿvíË!è¥áºH=a€zÇàþʘ•»ßÂÜù%ÞÊMÎ ù¦iîüÍèÜi¢Õæ8ŸOXR EЗ#HýMa>à4ÎÒèk*ù¢Ž“T¸¹[¬}’–D Ñ"6¾ÐÐFKÂhËz\Ûñž!úAà„iÂLãdÏÆEÎyà+ö®-´Â‹ø~t¯hH/Í‘LzYDŽ^Ÿ–{•´ùîj‰ŠÂ-)¦Q¿ÝGxÞ¸›IÐ¥óK°ÏÞ£WBs~Ö5û KOùýŸ~üÇÏ?}ÿòÛÌYVÖÀÊCwÿBa >j’iA °!¡ùê³âÒº(bЫ5‘DJxèkfµ{uÇT9Çh°·XþQŠ€Y;ýN=!ú+»šQsæÌ­"®G0z%w¸ß÷-´NWè+Õ„lq<¤ÂPÂF;Âù50ãè«,!/3”9’[hÏ^‘¨ÑRG©Ò î0·\ fzèz¾|Ü D>sšS2ÌþøÄ½[9qI¸‚1Y>q©—øtÓ—ô6*ЩÄ˾Ã)UK4);¦XoñR€ÎVΙ¦¸,ÜæK¼ÌïR@0 Vïm×;f¦ßÓ[¦onèj%æ^úg_Z†êòž@×ÈP ÌZ õógž@¥¬CU\´¢+ª¦ c„ÿ/aܳ®ØK¥K3ò ­½éª=mVµÄl0öm”âÎZmžOëÌjŽÁÆ>jY­‰3Ÿ‘Hš.Û4j‹Uôèè6æ!¢(ðîÊ¢ŽÈ^Ä1 Bþ1ðYzÈ ©œàB/„_|aÅ¢k±¶xm^`¶ÎÍg«¬±-æù*ï à›n®± nÚ:¡QUãô%ŸÔLJÜÒ¥]¹4jLáÉ>²¤—Gi'!¡Å9³5TÜ06V¶Ð2=S#P ÖO°5˜Q“G¦6“ë ÏþT#Ðuꙫךf59­‚«. çæF &7éÍá|BIs¥ÜÜÔxÁPÒÆ¢a] –Ûa®Éß¶ð‚%Tr•?-«/hDæ“Ö@"otqJìâ2Ƭ[="­d{´g3“»Óiš¯iè1Œuc6Y¥à)ƒ­zq2Ž^h•¢-Óá嫱Öuª²…Û¼Äj™C‚ ö‚h±¶lÑ-VÌLqNjZ0ÓÔoÔ‡SVè¸ËßaÁ·Ä­-†*)­5ÞñL{Ùç¶1Sõ¥{f7cIÍÐ %Oé-öJ9~~0¢–oÜÒXûNŒ—%æîô6ÊàŠcwÂ3TEžÏ®ísúÍ\©ó£•7›1¦¨“»2Ù.”UȈ8ш(ryhœ<‚ á1 ÿâ–Æʤerxä7tW㸻w¦ Pg9"?bUy E Š ü @$)4ÖAoÆœjðw„^’l:㮈b‹ WXU>Ö<ß…à÷UJ¦óZ>¡pwk.›¨uˆ¶¦ Uã#ï,$@¤Ô_ ÚhJˆÄ˜Ľ.»j,ˆ*­]ì £Úôš_>ï³JŸÎmì€Æ,Ç­h®3e<+Ìk—eÏpYAÃT9¥Ç ®Œ"JÈ,3ÈH=QZKÜí9 ªØŠ= ¨ÜzùŠéšôÀIƒË\`nJà†ÀÅ’{UÎé^ªã¤Þð€ÏéÃÓ IF s&¤>ÃÆäD9V#r¾Lzí™ðŠC}«€º;I_Õl[—ã|ÚZ¬ÕLd,ѪNÿTæ’*9­íœlIµæ=ëÝo]Qi¬…žn@eÄ Äžé…È÷h²U€d¹ë5%òTuÜç%úô—Ì-…DîìWxÃWŒ>!~ õì_)0dæTOp#ÝÏ·^J‘kù~QŽ¡±}×(¥šcЏE)¥ÉÑÛ«¨VŽF< Ò°Mʾ" Û¤jÙ„Â;Ãnv‘]ºÍHBoõ¥7s{Þâ'-úùÚÄ¥öt=%t­k1^³Ïs!êõDäï0£&îÓ°N4rÃGûÌ“U·µ“Meç§Q# Lű}ÍsâŒzçï¹¥Ñ<ÑÔ©­Þôñ©¥nô&\§-[“«j{1híUs¹ó ªE\¾ã ¾ž>c©.è@M¬ÅE´¥gÊ#<à{$Z<AWøTh úˆ¡T­2è‚¢¤ô|èš=Q›@ Yé’¹¥ýMÂ/››ÏZ£œºq:kJ{­@c²—ê?ÆÞÏÄw…ÊLTV…}õ€ðz‡Zóº[‘S­öÊA‡wDdǵþ¢Œ¬15ñ ÚXKžçÛ|ácÏæ!ÞbÌ”–.6‰d ÛÙ¨š¦¡|³k}zKÊná–¾@–X#ïÇ—÷ü%Ì*Š–y7 7Z™Z5β:Ëé݃°W¢±ú“(>Ï'¤^gì°9¡¤U®‹9!Šs ΞД§00ì/ûÅÈiÏþUV`\zuí4Õ…·`y '„{yPr.06VÉÐÊk$Ð[,Yå ÐÊFÐ-¿ÈËg¨°KÙùÄÈ5V7N¼„ô$`Q®?¢ÖÙÎÖ<Öœ7êóä=UX Wi¾€¢•èôÝ2ú(‚èÝÀÃÆb âçÎxƒ+/ëºmŠAh0î6ç­kQŶ5ð–úkÓ÷w ƒŸw×ßóÊsrÐ$‡Ô¸¡W¶«/‡Ro[Bú.W¿M™SßåªÙ`à£RÞæüK%U0VØšQ-¶0«[߈Ýb_ze‘C8áð«®ÕÞO<üúÊ—KqN6ý•¯¼r®á¯ØkLOkÒŠ‡ß°Oú¼†q< i܇}"Û1nऌ7Hø&u®ó‹¦µŽæ×9nÑ,›kUÍzÎÆ…iÆð!Ü¢ë| Ãþ€@óÆÍµÖv×çæãa¯¼èV Æ5Ôq~]«ÅÝ5rœîýŒ ï Æ…Ûè2©ÐáÁ¿6•½Åœºa4媳*@fÊ*ÒC [ŒÖÐ( ­åëèu¨Šv€Ÿã“ Qý&ú‹Ýj€‚®Ð¥ƒ>bᔤî ¼ÎŠ1mt§Á„4ïN+¯TÏ  J4J¼A×x]VŒ ZfWlú|AaAù£q½‰·  º”a ½JëƒÞ†X`LŸ¿0)‰CË»ÊÓ˜ð^Ò+Ê™]Av]#óPoÐÜmÆê¼B¡†âN)FÍáιfû– s=ÜBM»ëŒrã<èT5v ô!Ðì7®…Ï bƒ jJêÜÛIÞuv%s:ëRz™¥ùX«7ùɨDU}­mãìj¼ƒwaÎ7cÓÚª¼~·¯_rn/Fgw èÅQ—ç+“ôñõ%Ïé!inaËóI'-ïi,ßµ) 42kUìuP5a¦™úÚóòŠÕÞÐ ¹ìCyÅZ³AV¥ö¢lp/0£mQi +Œß\ aÞbvK1†nDÑ*i'·Ñ¥ú3þ5IÁÊ-­Ç÷"cç: Žÿ…¡©Þ¥]xZ`êø‰GgŽ&+ŽŒ5ǃúSmyVmk€Ð†ç†cy‹  vÀ±vû>`eÒ›h<¾á˜_cÕrÍ!SÍB¤”¾Ç4é7ˆ]T .Ä5ÞvvZ _¬ø»£ëé(#ø S4÷{„UJ3.3s¯fý„™7%_PRb¿!,NkýÇÉâ¨Þvd9U·öæ­ˆò¨ñ·ãÉ5ï'¨ÏM®¯#.婇>2l­û¡Š 3†Ïåàt‹ÁÚ%4­Ù8ªn¨ÑðsJ;,„ùYrŠ<×+dÉÁX”£yš¯íª±WtmçÝFw¢{hÝc]àµ]5VõCôú-!€ð8Z¤­>Øî6„oµÌÞg$_M´ÑìO"_üh|ù…QàTÓ°} èÛÇ7UŒÂKØ¿9'{66¤-tEWžA@6¾W”DÐÒ–V®AÐ5Þ è…-‚2ÒV­™@gô§ãî> Q­‚ÖUßPåÑÝàur4–õ$ʯKÏñÅoÕ'ü9)_}À®=‘òᣠåÒdÜ27‚67Â-ÆMÓ x‹…çJ¥k4ÜAF毾þÜ5¹<³SD=)ñ¤ü5 )rK¡o>R˜#ÌÅA¦Xe(èM‰=®ñêM_awW—þì‚nÑ3©q+ºBmJKÿ 蜢W3ÏÎ ª½@Saуã\¹ÊU?$^ ÑÐwæÃ„îLm¦hÑÝÙš†þx›¯©æquö5[Såú3KÝFgTÒ{ÒXN^©&â òŒ. ·–F!ò?V/»8ès7Xi¦:^ ¦ÑM˼! #nbœàKʉ26S¨= bJ-úÎÆ@>…\4À3ø¯Œ64õ ¯´šAÐWx¥Õ r¹ÆÞn·FŽéËD[í…Pt‡—AE €n!qW¶'Е™Õ³ 7Ó†Öó²ñ›s Øçi䘾l PÕ§L˜Tˆ,æóž4úAðš¨^ÛpoÞ¨j¨€píZ¨¤ã;±fÒTÕèÖ ãFßc-y®ËŠ:¡Åþ¦z¢ÖRÊnÃѧEµ˼%5SÚ†¢ÑRµnX ú@UrˆÛÕ#¡’Ø÷ʼ^ÊÆäÞbá%}ú“ÖÛˆ„Zv®¦>5àˆµÌÏáÎR×vôOtgÁGŸŽ<¯t7¬¢ ð³›(ÍuÔ ø E/i¼$‚Vþ°,ý]v„Ÿ¡mÝ}z3êKz®[‹–ê3Zøá#5v(òú·kêͼrlXhbr<·OŸL'ÖÝZxuñîKU%gâ>‹U ±ÑŸDtðÍÊí¨××Þ„ä}†ñxZh0H•f-*MЬÔüg¾]©J®õiËßlI€Ÿr"áó@fã<šä°ªh€9rÿ˜7í³Ÿ¼Á«B«e•øÔWÕiÒÆùÓj¯‘«Zh߀ ; u1猪çB3¼ÅúÄbá#æ ½VZÁ i=šòP\aؘP¥uÆõ•z€Ý`Õ¥häöû{z—Ÿxžû~c^ëk]`oŒösÞÿhfJvO;›ðÍÖÙø)g>1Ï&`6Î&ŽÄû <ÁÆŒ õEgîûó]]¢WHC³›D‡Fô[ÛXÖH˜èýÒtExž%oCÏæÆ‰¯ˆÛ¶óÛk©u.½Û\Ku6úưÏBךéžXó¾Ù¢k€ŸB×ð‰I×€Ù k3d éµ£^ß1,`zs4¾´50«tízH Wéºôª?€~iF¡GžE×ûh'œ¸M×*c¼Û\Ì’{„±˜Ö£ÆŸ©ÿt]-ÕBìZI¨tÿTßÛgÿ­TÿüùYZÙ§E}êgøeéïùìqG ß÷ìöùÒîÿã>+ endstream endobj 186 0 obj 8693 endobj 190 0 obj <> stream xÚ­]}s·ÿߟâù#'½Üšï/™ÞÍØ‘d)V¬wÙq”ñ¨‰Û¸µ’žâ4Óéô[Ý}¿¸ÏrŸÝuzã±ì]ý ‚$ÈUÕYã=üニ›û?=PìÕùÓ9m‚‰]6zsñðœ;åÂæÝãrSš¾ñªSv,3}º˜3PžxðGQ1„¶÷©ƒJÑÑLxUÄ@Z2GfЦh ¥Ñ×6ž®ÛöDRó;ù½†}mJ}œ¶dä0´$Në8>@ FÃoŠµì”…Þàè¯þ?}/EïºÔ·("4úAD9NÛ9ró–4gxD^j½–ô"¾ý+Ÿ']ÖWV>³þÚ­ƒ¬ ò´¿¶’`Ï#³YeØþßæN›òøÐSæÏ•ÓînÚ¹kÐ'Ÿté;Ò¥œõú^ZcdBáVXtk ¡>Õ–Ô㛕|S;°zAÿ¶:?êP}1õóŽC¼ œñ5 £¹{ž5páÔ&ŒFÉ5éâ‹*—¡yábãEœÔOFä®Íf½?uèuõòWüñÝJ­}rùàÑÝh½¹Ä:*»5ÝÒæòîÁ'7J©øéåŸ+D+µK´‡?öñÇ ëØ%“ü€@¼’4o”¡¼m€î” øã%þ¸¨?ÎñÇ)AÚˆÒ/J}ðÇSO©ÓYVêãJý¬–&|Œ¶]Ð²É¥Ì þ¸Fø£ͤo¬ê´7 1h‹ÿ*„•s]ˆN”8# °§b»ÝÇt³ú/G1m+å°Øþ%s3êí4Aês¯ÀOáïŸÅÌD2 ú½ÓE±±Öéa­Ó5mBèrè‚mHÅø)ˆvetjP:®j6 ñ\HR+-J.j6|£dy^Mk}?:;d¨<ö•pO²—ý£Å ß,tóImÂ8`T†ß¯º/ ÍäÜù¬E™WSUlà Ðq•â3×`¼)Êz3bílÊ œUg¡W”¸k òQRX‡mãµ0æê(ágÕÆ(uè $ü©p§`SÈFˆî²ÉtÖ6Ät3øІ ;»,Ôì:ëü²P3ŽÖ-z½kù=dÀªôaŠÎ -):ǯQt^¦©è´ è¢ÞÊj®è]H˜±\ÏS”8¡ç6ʶÏè9üð=VÂÛzîd]ÛjŽñ…hýÍtx"5ή-³ß¢¦;Æ´ÁY[Éküaøpæ±ó2Ž u÷ÛºÀŸ¾ð§ðåšVl$-ª¨¶Ìæ™ì°\ge;¦ Ü9íh¯vÖKIØø.ù,Ê0=4[t!Uë0²’HÊ‚©èÝO‡!r\ äM—’àÅÎG)»”»d¤s±\¹i ™Ê"Á1,4 A€¦ìB¿f“žé×ã)Ü)Ýé ?¥ b¬¤I (ŒCa^¼â¨$¥âGQd€HP¢Ù{ `gºl»Ñg²=¢ÌàÖÔŒÆ]µ êÀ¡µdyJ«Rþ÷e[_¼1j4äš‚ÀÓ'Éçæ†¢@I^€’²z6Ï«»ÇÊ-X—‡yNŒ›§½A—¹gËLMãØ9옆ƒyI@Ð1.Ê^©ÀU5ÜõÊ Æ¼æ»Ãkðµ1Ìw‡×ÔNjù8n}C==…ÞáN ÒAÄ*é¾Àêê½Ù`0p…~…ŽèP,”Àï8Š‹`¶…ó­)˜Iºƒ\àé 9® sÐŽ)˜É`PAÂwMÁ4„¨¸²ÊúÿcÆ£|Z7ãaÈiÆÃhµµ­çdÈöpúî•$ûLÎ>q{!ÉÆP‘ã–ˆ˜=9m€èǹÔF>­?ÆåêÒƒEM¤v~L²icLyB‡ #•4Ù")5BÀÎÕ£Ìp‚ÁëÁÇŠ%¥êDw,É8ð0){Qþz9N€“ RòÔ5ãü°Qg:zè…${›‚`-)›áʺ’ýyE‡!˜ y·Pñ;•%%:IÁI¦lr!H.H&¡Ù/I Á/†c)(w1.iX¶o¨Û+:̺5œ|(ßìº+:ÌEÙu‚BÓéЫSÓîIdY1‘ýw8¨ó‡9n¾/¸ wÏÜîMA%hfSÐã"ƒ‹MAˆˆ¯"khpDf¸ ¦íÍ’žÕZõÔŒ= ƒ_W×Já¼ãò¯ÂâfOgŽnŸ<"3 R%¥€!Ç­ÏSH]ñ-ÀŒjÄey3lá%P šiâÇ\#ˆt„Cô .Ïù1%¨¾ñ]ˆc¢Çø\’X¹»8¡Ö„6Μ5ìMHfÂm|3P—ü‘/yWÞdB}»›îyƒçY #iÉ~›òâ‡Øm"Cxö.LeHÞ”oËPÌ4 g|&2¬¼ª +í*Cò¦T¹r›b¶I*:#?^r"ÃJ}y§Ü&U+” ûA†Á•U†¸äBåCÞYlËL1–äIÏD†•Wm{¥]åCÞITn#ÆV;èLùñ’Vꃄȋ8åVvb™°d˜ µåsAjËäM‘ŶÌÓ€©-×g"ÃÊ«¶½Ò®ò!oŠ$*·3PéLùñ’Vꃄȋ8åVé‘È”xø^ûü6㨯i½ÑÌÞL°Ý$ñm|žÊpä%iín½ÑÌÞGêƒ )?^ò®A}Ⱦ"/â”Û\UI2¤ÌʘÒ;È;1Èç‰Ãí.Ÿ¹·Ý9bq¿9qÍ•湑»}9÷(§U©ñçÊmÑËq[›˜s¥ÆŸ+·EûçZ8QôwBÑ9·µC¸HÖ v2ÌX;ÜI§»f`CòÚ¡A:¨5NT_kݨ4æ5Gºúµ!‘›×„2p[>ÈqlÍP+ƒœµC­ôùk†%¬–¤\ãÂåà9Ib=ëÖ_Þ±¾˜Æ¯ó­xA8± `Ï3€i”7ö‰h{Ê©ªH“pŽ,šŽDL:åT•£I8G1̇"r›rªjÑ$ü­ˆo–'q?½×Nàåw¤ô:m;í£Ñ]^“vÌx⨠¹%ÂÖ¥Q$]â¶ËN‚^Ö™òÅøÈ·uœofZçZd•+ÛÃË-ÂyŽZÉÉ Ž“{±R]»+ª’IØ\8Âô ÃAÕ-kº@fuÙãðÏðǓڒ²´^Ö<Õ_P- ¾äs:¿—1/Ë:ìî å‡tuNuYYYC¾…ë“ô;Äí*'©EŠ e»µ)ÃGMežëÑdÓÚ.1 >»ßÒ%FA>ÊÈ% ˆÖR,gãn]¢Ë%Çf¶OPÃý,3õ´ÅÄYÃ3¾—¼Tþ1Åúˆ/éÙžcŠqM’ãæ€ÜšÐè…µ¬+YPÖ8̘°Ð Ð ÓP²G|í“àçÛ!\0RÒ_Š|PBÉ¥B¤ËŽà‚´¥!2‰ž6hSJZÁÃi"äôD R8dEÖ*áçÅl Ñi^ÊÆ`:n« ]µ<ØBÏÛï'pÐ OS+~Úƒ ý’Ÿf %?Íà¿ÙO3:3~š!ý4¯!™2ÚÍ‹&c@ kãn>¡Û 0•ñAࣄV=Ç¿úëu]Sýõ‡wÍïFêñ¿ž¦”B,ìL›úÇÂÉ3”¥ÜÎ꺊î Ì+êýCg¤*²ýUÒ&9èŠoâ„æ{G‡`%»=~ö+4êý5õ÷ üäB½qRá–ê ¿TFÖ›v‡¸u¶ î`º†Ñ"ÄNYÙ·˜2ö©tó,#N7eåÛ.ÌÂ|d1Ôd %Æà¿Ù…1:3.Œ!]¯aÓ…ÍŠfpa ´èÂ~Î…Íñ¯.l]×Töá]ó!.¬E]º0^e§JJ/©{Ò½Wa ÁÚ²SÏAç<‚ÅtD¢^¢¯–(Yˆ~ÅXjÔ‰9(èÙ†¨#‰›†öQÿd;ŸòB½!Ü Æñp×d/.ëð<’_à sÙ¾:ÜdÌtæì¡Ê‚oÌmY€FWÈ12[+ú’ËÎd¿OP 48¦q©/ ôgó¢ g²Žt„Ó0êâ² òü Ì›ä ÊÍ@'D+@/øø­’1Õ‡Ž ’ÝWý,¥Ð¯ÈLå‰Ì‡Ùë)ïÎ<®à˜gM™$çòš»ƒ¬‚Ñu#mÀE-‚‘ÐÂèÊAT¸Ö–q†ƒØÔ9ÅA§<\qR :c[T{܆½ -Œ¦KFV~WŠLñ{Ù ºž£³·Rüt¥#§N¶q§óÕóUY;Y1£œ—<éÌÑèr„Môͼ¼QF5Îè§fž¢ì™Ìñ²:/hžTEËQ;NS¼ ®-‰3¡%V©®¡$c"zã&N´ÅšTÜj»Òü(`yÅÏj$p`íN¡ ­+«8Ÿ#úèÀ4œ ]‰‹Ç‡§G¯öÎ_?>ß|ùõéþë/_\]¼>z~PWx) <2™%DÏ…ÈÜ>L–%'mm*k*Él˼MT€‚BILã =ª:×\ʺδìA‘µ8âÎ=Œ>Da²Á]zΠø üŸ÷´-ÿ’Î{0±}¾-W7õB[„~GsÐK™Óë]oP É@–gÙ‹kÜ–Kê+ËJ·…Ó¥3!Žd‡fžûy!A”]Ž_ ¹S„¾QR¢yºâ«ÛZñ´T“S¿51ó´³I󉱴ËáÍÄXâçׇÄXŽk&ÆrÐBb,‡/$Ærx#öM¦ ²_‹ÂHæ‡ã&_³6ZÂÏ7ö€´äÎ^Üíh€>¥ bd‹kEÙÁ¸>ùÖz<­\óuðyLx3.¯Ù0¦¡Èô…*Kÿï*‘á¹\KE‹Ý•‘P¶4>ð7AOx/Ú’;rcïÊ‹Dh÷{Ùü Þ£U¹¶ä¿Íx²xŒn"@xtz*¿é‹Rß¾ÀÃWS¤ê#ÞÀ¥ o [e7}Qj:ð©ˆp¥1åÄŠM7®B™¾(b8UÄ@¸Ò˜rB¡áÎô˜Wîw!"™¾(íï L©ïªÂö‘màR<­"™¾(­øŒˆ4*{œ2&B8Õ„«H¦/ŠÐN#"ªžã„þ†Ÿ‰©â# yíß 7jZ}œ ­r\É"!/°õ•ÏᦚF8±b£Ð*áA$ä ­rš"ÜTÓ'¸E7jš3¸à=õoôM‘@_d ñ[G1ž‰àNµÑ•r• ySd0ð!~ân#áN„7p« ¯´«lÈ›"¾Ûñ‡›ç†t~ëßJN¦ƒøÜá õÆSsv0µR“b|&8IʵÕ7žšôH» pcï´ûü(þ¦pàVXiWne„íGŒ;1:Êçqê¥-ùà³kôfCÉ8NURìq`´0ª1o;ºòJˆ=l?sH£·±ÇÊfÁ7rƒ=B%Ì>Kþƒkòh*ï„©0N+£"1L/G2h[DˆÁmyÜñͺ‘WŒ˃• Ö WÒ®pðb,]é᥯Yá å´2‚aÕrÌ'CìuAŸF–#%‘®‹”ľ^ˆ0n]x!Ǻñˆ~VŽÆr\X1tÉ€aÌìÕ“e©Æa|3™Ê,ÌmäÊm«‡MÒ9²ø~B ç^„Õ †MÊ9²¨y>ŒÓÂiPÃ&áY¨9{ŠÊ©ªa“py1ÊÂ4Vƒ6)pD#ãÈ¥¤o‹?P³-ø¾hêD¦«µPchîÞ|ïLYº¢AË®p3_ái‹ gV†.¦ár°Ä°Í¹ì:«> ÕNê^h‰r]Æ­i‰Ñå>$^æ3¾÷šq‹6³Âkb^¥Ѫ®f=m®®{ÜdeNø ~¸†Ì0gü¦¥%h›)Éxñ4æµÌ¥$sÌî”dŽ<ú²»a1¥GiI›Œµ±‹hÑ-²Wüx¬Ér‹·}Á@ô`CPå>pÚk~…Kk-T2xó¹’rfé@®\';O)å.d)cv Ÿ-)º$–Q˜&yÒŒ_¼¸ÃK±Òc«ÜºÔ¹Šç›g .ÄSEô¢5ˆ¦ßë5ÛñÁ°‰ÐФ}~2žªå –<LlWTš†Éªçpú /˜¹€± ÐKžÐÜb|Ío‚È §\hN~¾ïmùø››7)üº‰“„h¨hñ@Q”u¢« ˜yÚhÝ!O É \¼Ä­‡Üð/Ÿ‰;ò³äù†®sNò×(Ü1¨ÎêZÌ ½_h*èMæùMû³0Nù.;OÒi ݾ @¬9ú´‚¨SIÕhÝJ ú‘$rç džó&y­%‡]ñÑ«\*[ ¼=þéõÁÛû»_oïß|¾ù}_ij":‘2w·þéž9¡éïïßü­ÍÚ »qÿÕíàg‚"üÞþÈøå°ŠÞt:å÷çËø îÆOUùqa=ž­V) èžUí’’È‹ö2ž Œ^ Y*o†0Ø Pë€.éíyÍ£j<±#@»øà—š†ÉÉ–{‘9è!¿œBeÙVÏÇa<÷ËAFøgñ39¹bˆŽø•ÙŽÓcjS¥ˆi1ä˜v$±’ yÄÜã]Ðt.Ü'ÉsÇiŒ=Ê‘Á_ñó-Æ;NCàaQ¼í¬ éáøýŽÜk¤‡g<=ÈTˆÐe¶!îo¸âÝæxÊõÆÊÙaŸÆâîÀlÏàÅ"xla¶qÆåmØ&¨•—ZHä¿L;Ô~Ô0õw²p¤øôÆ´ã|]ÎÐ+Râ4¤CQ ýÈ¿#”dìù÷Stó]ñ—R’ÝKù¨Û]!‡Å|#kÇ>ç¦ËqÚÝÝÛ8üu—Œ[aN¸ú攬ñ£¢Ï󦄫êÒ´ëÙ8Œ¤l§Z»cZ‹Ù6,X®©cçã°¡kHxsH’FrÊ×Óœ·K†÷0:€N\þÚ8ˆ·VdM5à‡¿¾}ûãßú±£âq…W©\×/,X~`Çô Íh|ø~éÍûò^pøš ¶$óXKìã¦ó7?ÿôËýwo¾Qßn.oÿôùæôþ§ã··?¾ßìƒ6mžšÍÅóÏÍÕ˳6ýì«ÍÍ'wóéæ‡ÛŸ7Ðø7?¾ÿéþï›ïnÿzû‡·ïÞ¾ÿ;9ŸÊWaô–Õ?ÎñìõW'WÏ/÷÷^_ìŸ_ïŸîþ¹ùÇùÉÉåçꟼ(x];Ôrïü‹ ;ß~¾9¸~¶9úþþèûÿT:sZø¥¨-­fs*Q^”?l >¾s{ôý7úÛÍÐúŸßþ¼Á7¬FAi[`³9xûæÝ÷}¨ã÷¿|÷~óüöîͦ!fNï¬tÌ·›‹7÷ooßmžÿr÷‡7÷@hl §à\’(ûíæ«Ûùãíwï¹/ßüúîÍû÷›ÓÛïþr{ÿ=§æì2øåç÷?Ýõo€ kèΪñ­À›Z3{áÇì¼ð[>Ìì…M—£Ak`Ô C>pQ‚Ψr£Gž‹{ Àpп¹—›ò˜½§!á!f6fV º#3^‰`b8†g$“uÚk^KÉ/³Ä`hCÆ‘áŠ_ å¼hêacÓ”Œ¼æ79y·P»døï¿æ©uiDÆC a^ê]'Áæ¸qì?~ã8-jœ¿ ‘ò[!_¢ƒÃ¶ÀE3@O9ÌJÛàñù˜fEeðô¼­“‰ÃZÖ¢‰ìk¢ªdÌÉGb/»øšß…¹ sR÷iÚ¡%~ðLË~o|\Cïù¶XÝÇ•\04îÆ/j»Ý–ľÇÜŸfèÀ?Ǭ¥ïa÷üBWØxÕ‚•ü( ?¤!ò+’­ô­Ò‹á5 ˜M1×Cåef~̾6=WqÞ¹ÊûN\^‰SGdñ)÷ÂÌc@«¬æ˜CžÉ¼àuÍã íDÅ/ m©ÜàË€r¶¦½+_¡cÀü*§±ð{'C 09qÎIl˜o+^¿ ;‰§ßã5Ýfžø,Ý|sÆ€q®Œòe=ˆaN·W9Lâð“3/ðe#XèZ´:ëßí„GæTÍxP#ÍF&übе’Õ{Fol9{‘çŒá÷¼sľsùr@«2­/qC\Á±Ow,>á—4iZ‰¶\îb²óº„ßÙNd\v¦—m æŒÓ⤲$n¨™´èÓ™Ã1s4ÉŽ×á¾W)¾‰QoS?ùš´h2–É0›µÌH !ÌW Ã]¯Û] ¾‡-ëÄÜMóJ-k‘ÃýÇÇ—‡¯_¾~üúéñãç_ì·SpÊåá‰mZ;~+#ÎL1ðHU¹ä~‡5|K¾Sº‚ŽÞ/UŒs÷\4Lj…}díw¤uDplA weu@€€É5 ½Ïäñ— ÃìSãSS³’s}^.ƒ£ÄŸî_¾ÞÿêÉþÞÞþÞë^ 6çGO¾8n÷?^¾+[ÐX3UàŸñ; Qóì’©³lظ`Ê?ÛaÑ8‘º w Á}ø Z†aÎ%‹aØ·ƒñs1rίý*{€Ó™a¶¢p!3øÍ(zy½2„øåèYAd˜ÚH¦J~,¿ì¬9îB~Ã^÷©° ¸cwÒã§(lš•±w¹ßŽ¢~¸È—•ëЀ…íÍNgþ»|—ü~FФw> stream xÚ¥]ÛŽ¹q¾×SÌ…³òÆroóÜ4´žÑJ±bI3:íZ€.Ÿá8† äÅòy°TõßM²ÝäÀ0<ØŸúÈ"«ŠÅ*²Øœ¯ÞþýÑ|õößáÏ÷ðÿß?úîí£ožÍWÆ\½ýÝ#s5ÃÿÌÕ2_%§èÝÕÛûG?ý4ÏóO¾~ûŸõßÓb˜W럘Ôý"€ðϯðÏ»mæ4%€qøóõAZ;Ÿò=ÅiqF6G@ÎN~IôF6ç­:ê[ Z¦˜ƒÑq;Y:½ó4ϲ÷+Û® 2à²Â§”R‡K˜–äOäEàvv“Ÿ¥xþyLD‘­DuÉ’Áÿ[xóÍ3Ë4Õ:7-žréæo¿ýÓ_ù׿|¹TáÊm3@m>ç„›ADKÐUœ"Í?בּSRfÜ-]±Í´9̲_3.Fj÷3%Ü L9\çέ²$ƒàæÐ .™óiãR¼Dl§#^À(¼£>Ê‚úmôÄÏó””é|QO~9—©7[l{>›e”‹†•­Î%ÀýåÓ×O¿{ñòÅÛ>_ß<½»»¹}{w°U±®¾ i£öšûÕCD†¼“È~J‚!oèì —Ë@/‹ëöRÚ ¶.M¬5O8‡¬±É˜/‹5=çsÈ$ÙEª,&M°ôË>qŸ‚Y«4öž»ÐA²˜ª0X_\ y§t³ïB˜b”Ü ^tܶ÷Nû†Î³é ¼«Ðá*ÌS£ ’ÚP¡¬t›ÍSˆë³dý›î¶ að#×âxχëÁ,ú¥ ·"ºs®xnT>çŠ÷ C6sn¤7âÜ—’8pp=ØNw`(„5àĬ±'·šg!€2ÀkU9Ãâ†t-ƒÑãÉ1Ô.ä0?½Ö·Rq‡ÊXI÷ƒÜk‡™mÀ*qäKqR¦rïõm1pJr@›o (0ž d˜m&î_~/Šn¿kïäbS M#µ@6Šc®kLM 6üeŽfÑÄÚ(›ü4;KÙÀ÷÷ç4N7ªÛo,B@Ï øƒF Â.'à±ØåÄ&A·­ìöê輓pÐA%7dX§:Ô'4À€WöøqáLJ2nÞ>é{˜)"ò{ørß,Êrõ呉v‚žÑ‚ìJZ°\¼ÿ/{å÷ýŽ×º‡p¥ÛvqK ŒN[3Í4„ö‚Ò° Œ”XµûµÀµ ã"b m,ñë(wZ¥¤´-¨#1^ñ~-I¤ñ€&<±p#+±Qš–Ô‘È)@ÐÚÊ »àªœh0g¯Ñ йwENõw#§Jg“Smw“S[°2¦*ˆ½áÒFK‰U+rª ïr¢%~e•“%m—fZb¼b•Sm|“-9Ub±7]i‰¡œÐ‹ œàw$R Èñ­A\ÈÖ&.¿[9:;K»»š‚ à ¡±kHi£RbÕªœJÃE¤Äoc`²,m7ÍTb¼b#§Òø.R€r*ÄDÕ’$F†«žOk#»œ¢_¨Ý£Àñ½FƒˆÄîÕßœ*ǵÝM mÁÊðJ¨ b±{[QÚ½Jicpmx—-Y×B«bbc÷\dÄxÅ*§Úø&ZrªÄ "6v/‰‘¡œ ȸè"€É1­I‹,ˆt>Ŷ~lr*¿[9:¢Ý¿² ÒùTÞåD(±j÷²áÂ\¥$²ùTÛÞåDˆñŠ÷Jã(…œXÊ©ÛåTš.r"ÄÐØ¬{áÈßÍxªøÍW¿c/…/eÍR¹·ÆWjݵ•àÆÀ—ÖùïB­»"p³Ñ˜¥½5þ»RëÚ1®ìÍdú"&§6湉å½ïz¯rÌ÷ Tñ~ÑØê)Llßü‹•}Ìþ #Ñ7`bmó{…gÔ÷Ü„S>湉µ½ï{·rÌ÷«SõŽÑØê)ìkßþ‹¥}4d~åˆç+ãšQ×WúG#œôÏG]8¹Îx"ÒÏuEäz5²¢J éíÑ[Yé¶õ³®V{‰ïÎ>QÐR*Š¢6œ‹PÎC6”ªŠ¨ çÄ|ìs§[ÄS-¥¢jÃèŽ/ñÜmAC©ª…ÚðáÓ"%’Ðì®2I6\ìEÏ‚›R uŸë§tÇ:NÉ[¢9 ²7ÿ¨nA}PÎ"Íj£X•¯èFÐó’œv+wÜ™rðr4o8„k%Š)7‡^K 3âä(eBÂ"énÉÍ \'y\‡Œ§`ºð\Xó~Ô³q·¤É„$@?Ñ7ðüì' êÇákÚÁwR50cÇâ.2ïCÁ¯ù?Í\ûmç)tûÍ@½~3x·ß¼?‹ä~I>‹:?/à •Ú×"‹†<¹E’´4Ï'®|ä ¹´ü2˜í€ñ”¡aÆÓhÛãú&š9¨õDÃà]Ñð>Œˆ†Õy¨hXu]4 TEó•l8çi±VŽK&)Ôa҉׹øUaÿ7š4C6ý‰ÆAirxOš¢g\sqÍ$4(hFd¢yîþ’Þ¤öö€kû¢tfU1 åÕ¨Ý&jÔn“5*U±Ï2@]ù¤ÝŠ SðŠ]£I¿xANšµKÃOüûl 8Õ­5&–‚×áâ$8c¬næNÍI™Š4«ÇÌÓ2ËiQ£éJ&ÐåÙéPð:pR ~&Òà•I9¾A}O•z ƒwÞ‡‘…Ì„àÔë·}X.ú0/ñ:Œ—xu5^â ¡Pö”¡{(Ûáú&3°ËÀA=ј‡í2ˆ>ŒˆÆüC» ¼º.s´ËpÊŠ±k¡,©¡¬ÊÅN(‹úÑhÔ‘&‡÷¤)ú0à1 šÇÈAªÇ¨ö¶ã1žYÕâÚŒYÕâÚ ZÕâÚ0ü˜ÇÈ*u=FÞ)Õcd Ýcd -”=ekq›ÆØZܦC¶:~#KkÝÒdLй\þ¢ab¿ ­Éx‘îš“ó’§ „1°”Î7üº4&‰Ÿ2~qç”–5[™Cn™K¦ø?rLv„ùbv½~ÌAï¸ÃSÔŠâ» ÃïÊšgíÀp*ž =ª@fÙ|¼ë°àc˜C_íÈÞöàâ%œ³ìmŽ9ÏÞæh5{›ƒ>ÍÎiÙÛ§fosP'{›Ã;ÙÛ>’½ÍëÈÓ1“gpÚ%#2ßóAçÿ«1.(NÐ4Ï{¶„f‘Ößkv «w%hžÛ¶ñ{þ‹–àì¨ÔjII»ô/Y´æýZ’HëèžcY‰‹¶¡WKjúïÒã5ï×’HZߎtiAj©ÄÞ´$O˜ ó-QfBÉž{²1“”¬ßjQÌ–ÒØ´ã›„OZ³afi½0“”¬}/ôZŒ/}J¤„™…^afi}g)H-µáK‡"!ß2¯Ñ]Ò,v&8³4Z‡Œ¢%È’½V‹I[j;{IËÌJogBm}g-A–Tz“q&Òƒ–™•Þ·ÚúÆ*ZZj‘YFB~KÄï6¥Æšàï-mm³&´dåýV‡b|“ÎY™Z…×.ry’•ó…Z‹¡€Òã5™•Ö‹gm½¶ãI²5­ÙȬ´^äAJVÎ{îsÖÖk;-=^³‘™gw½hAj©„o¢…HÈï2‹n[¶· Ñï·vN+%޹@sªþ&2+´dÛ…ÏJ‰c+{m½ÈŒÐã5ï•Ö Ÿ•ÇVöÚz‘¡ÇkÞ+­ïYʤ µÔv™•¦‹Ì±5äNÎq8ÛDÌû=ù›Ýþ;±¹{ÛxÐ{küw¥Öu¹¹ïи'¥uþ»Pëú3Ü–4æªÜ}b¿+µ®}ãZßL¬/bbqj£{2àåÁu³ "KJ;£a¹Œ yüÙ¸€¢¤ö`4r•ñÌHÌ%{0uI—Ÿ‡Më²ÄEÞI`"ÝÕ—Zö`Ô©–÷›ÖeIRwNüNéôp«Y0DIíÁ¨k&ì§Bö`Ô­‹ÍÈ‚(]ŸÑ=?¹á4²-&w&G·ÅäžÌÈΑܼÝ9’û #»rkt×C†Ü#roftc@†‹#A­Ü¾ jeD5÷ÉÐ{4î“AÇHh$£ÓÑÐH:Ì#n½ àFÝzé츤2øÝs—{¾#ÛÒòd`t[Zn‹ŽìÜÊÍóÑ[¹¥7²ë(÷—Gwå®×ÈÆœÜݘ“;6#›JrûptSInjŒì»È­¯Ñ}÷lMÈݡѭ ³Ž„Õre4¬–ñÖHH(ƒÿæžeÔ¶ø¯F[¥ Ò]¬“6Q@(íŒTΉ6?‰ã¿–R1)jÃ9±£˜ó³q6ÖPªÆDm8'v€p~¢ ŽZJÅŒ¨ çÄv×Ï·ÛÅqGK©µáœØžðù&±8 h)Ó¡6œÛ0=ßA;Ø-¥b4Ô†sb»‰çÛ‹b{·½õm™–Óvrb{`ç›bbï³¥T …Úð·rÄŽ]ï†4¦Ý­–'˜Éø¡ü üêûœ=¯"Ó3ð£îÙ¤ „)LK=§Ÿø~Yñ Ÿ´7‰VV¾Û·ä)Ï‚Ê?óÏØFÜ\Qzò†¿ò0»¤Ùåm“¤Ên~ÓG œ›¼Uxú >±p½®îñâ¸ÓG#ßbÁ/`|É$%?ùËN0éŸJÊ#Mz3ø-¡™b07Ì©LjÒsXæ×Ôu¿y~¨®ââ¹Ç»˜Šê`näö3ŸNÕ> ‹"C5[Ž9È’´˜šçŽ>Ì=óúlïÀIB4­"‹—zAaï2œz=aº—*Š˜`šEߊɫb¢0]LÓEwÅÄ:p’$¿šÅó*ƒ9ò`Ïׯ³Ú–zrzwÁeX[”qP ºŒéœÙ›@è†é„a:aèž@xª

j-¤`5¤Ð¸×[\¨˜Õ‚a:!C„6Y¶©~ƒéêF1=u£è®º± ø œ‚æ70Œê7h=툖sUõèÐo½® m{úþø•õf};¾,²ÊÎõzžoõÇõ"Ï 4Ù…Lt0w00iü"©_z–Ò{ÜÈV†ä| já.I€åœƒó0Ÿ8ç @A0qÀ¹á 4z\Œ±gЗÉIÌ;þĹÓLºæOœãúÆAw²¹°¾„*º¥k¥I T'‰³»¶q=â=a”¿„?Àtã; õ%¤ØÅ);Ù{‹ß¾^Î;Ž_Xüy¿×3Š(¹*ƒZ|Š=;)(Éz 6ÒJàKå9Ö¸¾TyÊ‹OÇ)Lcgd°HÍrt)Õ—ußß¿“¡)={d6ûiörhGop›0eeâÖó¼gô¡Å –Kªl=ú^yÙ4¯Ç;§ŠàBš¼2í¯•÷Jݤ̇ky¸·X ¤B¡e2ʼ}F£¶¾©oŠâãÂ{—7E_\ß~~z{óôí¯o>÷êéíõç¿~öêàYQX…Ò²fè+•×ÊëžaŠ¢Æ3ù&̵ƒ@RîÂd‹YéWšuõe kª9ïùó›sŒ'#“ïo ð Á 9¢ƒŽŒž *P O°D#à?RÅr*áƒ3p|Á^A¿gUª†Ñ×41§(‹Úü™T Ù’¥pßñ/;­ º 4b§|Äo¹ÈºÒNyÐa¤ Q;剴Ÿ‹Ÿ’O‹Ôƒ—´LÁÉ–(ñEȬ«Á6hþÁŒÜö=ÿƃœb„Õ/Œ0 ŒÂka0§ìƒýõ–ÏEùÐÌhÀ²*ïù#ò>;µÙwü‹FÉŠÆ”Çæ1ui-þ@1¨ŠQ¥V`H½„~í K+x+œçŸ„·"ûGC) bY‚íËÒËWe•¹|ìĬŸ9²å¾‘·ÄCäüåJaAEhJÀdÌK©Ó–ïL*·”êïõâ«w¿–8Ò¶‹3LÈLJ hAn¨Õ’½uI}˜„Õ¼_K,i}Ë–¢à¯Wj±7-Éow¶ð!¡¥å!, Œ‡MÉÖã­N‹q”‡å7áa¡UxXÚ.Òé¶­AgBÄ{ˆ«â½£ e2Š:°ã¿n-sÐk~â“Ôc¶É’Á(ÜIAnýüí©–àÙšåð^)Ç)HSrë ßcÏŠÄÓ“ðLg)Ažé„ÉIœ<ÊÂ|¿¤ðÿp”WKSµºžv5Uø˜§ë(¦Eoz Ë«3§ …»ïsJþnÛE·òöœ ëí±SëâaÉõFª <žñ€pNJ[Émñ˜X‘Ïí1@ñöAö¯ù¹Ùjºdø« Þûó…΃]Î,u¦‚Ð |Á),?Р®ŒKF Ô;X³³ç,cÑœëºÆS÷ÀâjÎ0§«œ1à½Ê:,õ;@ eˆ9˜žèh•Cp‘ð7G®8¸Í8ýü†‚2¸vV€ø3¹`hÓ¢wôWÊê/^ƒ?£k¶Y½8è#Ïhгd0%QvŽbÜšÚÃAt‘›óú:½æÉ q–’e‹ÞX–ƒ£kž!*ƒ{.ž\p^€ägÑ­‹rˆOø“ ÉKš4n‰ó²¤)³yç)ÙØKõ=g¯ÈˆÓ´äìo–·ÙN³ñçm¢rï(ÐúV4úç 8ÎJrÊUdÐ'Õèš_EÆA³=ôTSr5wwþíoÿãWß^°aÑ^,-ü¿®·‹ç|û/Wÿöü˜.hYº ~gÇð@õ7tÑšæœ8ðZLºˆG×ãîô³yÜó³¢Q¹.&¬ÿ vÇ¡Š@tËÐ4d ‰þÆ´MåG¾Y2EäÇ¥Y´C÷AÜ2Eɺ âãú  ÃÐÌ¿vÅ9ޱÒXÂKŽ~(¢¢è¼S#º÷¡›<¹~ßEû ¡ûAâ^ðÌI—޹å{Ò¡˜ƒ–5ƒ2DŽþ‘Ë^¡zÁ‚똨¡Y0Ÿî¾VNñÍš¾À€ÏùöpÄ7d(æ7<È_ŸÁQ¾æ |4x0³AQ0uôL&Ö^R.Ïd‹‹s°BnG1»? l›ÖE–nèÖôÞ½ƒTGX<Á…åè÷<ê^m<Åd°¡ç<Á h#0´óVS'Fù„ç0&ã9æ1_•­à |½urètÛ¤ÉG¡Ûy,¾>!¦ÈQ\qÃ"¸@3è@Ö..Çš!ãHÝú©Žî$Äó8w*—.ß'9›~k–›×-c†õèƒÁ£cÓohÜ æ–CáÛbzóëç3(J¾zûwÅñà€n[øÃŸÿøÇ?ýí²:¬uøÒàñÊŒ‚ —Ut£|]þääbÀé$=ZW” ¢X¿Wvä@ûù’C.PiK1zóè¿ÐÛºº‡¿érl‰sÐÒózXyÁ5Eº×ÿãW‚vÿk#' endstream endobj 195 0 obj 7927 endobj 198 0 obj <> stream xÚ­]ësÔH’ÿî¿B.¸eD½«äØÛncï6Ý~Àb‚ðâ|çg›!عùß/SÝR«2SR³³³1½#ñ«Gfå³*U¨âðÛ†*?ÀÏ3ø÷ÓÆÏ‡OvL¡áåÇ ](øŸ.ªTD—JíŠÃ«‡ÓùÝÍ×Ûó·&¼+Ï>m·7öù쮸¸þu~}sû½øpöåì—÷ßþwÖ•MW¿L÷ŸNf³ýé¦þ½ømºõô—÷/ö^N¶ßÏ&ÓãÉtÓáûýýÃMõ;íÇ„vJÛÓ·VÁ?ï6‹½f‹½óÛ½óÿRÍüÚ?¡ißt´u;?Û;«ß?ߜݞøLÑÊ5è¢(v.æ—ç‹O¿ÞÝß\-Þ›ÅìË|~¾Y£Tñb÷ŸØ ôQZã=üŸ.·ŸØ«é3à?Œäºü÷®1•)ØzØS¤v»S‹¶Œ&1àþL3L)àŽ2¬PÒ szÚi•Jðs>E"G8ti¶íÖë?Ïj^+£8y $Ùð¶¯ðg?CV`lõÈ ZXÁ*rl·}>Ëà`À“÷2#jøNwh#ùöÛyÆxm+´9ÎA`ÈLì™v†LŒM%#³U±•…]Ϫt‘NU •Iœí–Àý¶uÍÃÚI3C ’Õt1ÛÚ=Ø{¿·=}¿5l¾9˜¼ÿykºý~ïåÎþ¢jj x†Z—;Ýà€'­A­§s’Ñ ªX‹&iÖ€h ³ Èœ½XP ÈA¶4Ñ1Ðv.:ù ûPª(Ë¥&JDíå0ÊÉ2PNt2¥×†V :¥2cQX üﹸhqàåËàº*tÆQg`š1ŽŒ‹kcõ0ÁΆҡ~ЩҙÓvÖÐri8ÊA¡ôŸû:†ÍÁ :ÍÛrÃæ’. s¹es„iÁ Ë„ƒõÓ† ÎóäË$ˆo&€Ù[Ynj¢”[ÿ#a¥,„2 ¥ý¡•‹Tó~Â8‰–ƒç‘Ø|ãyŸ°Š.Ÿ ®°AÂÙ<8ï-é<:BÓêùÌV1 Y"$ž·!1pr :†zÌl›ãЃä›ßXy¢¯˜â ¡¼æpNwh‰©1Àt+ÌñôQŽ‚P qšŸ·3íÈ)6œn€¨yˆ>ä5Wð"ÏV¸*.7tÀ8 eobí›6Ý7@HBLÓKóüyã#kwU¿±Yß’-ºoªRÙª3ÚêMÓ;Ç£-¯ê7&ëÝ{ˆ."y¡új´Ñt͇ÇÁ‡àPt—‡ðŒf©ÃÃΛ北mº ¡ª[ñ°}ÎxØŽÕò°í»åaçÍrÊíh+LÓûªŸîx´e‡‡mï ‡²ÈÃv´Ñt½ê¤;š<¥ê ØÚfüé¾Yð¢iÓÅ(ð`+9\=wy¸«¡}Õwßî›'V£­0Mï«~ºãÑ–+®z_r()c;Z‹hº^uÒ yQÅR—!‰B#©ˆæ o–m:<Ô)ÓåÕsÆÃv,ÞwK7ÓŽÖò°í½åa6my%ôŽª"yøÁŒÎ…f3xÆN1ýgì)œ0[P —d$;þö†~Dwx-X "±‰‡H%– Ž™¯ÄlGkÞß»\u|RPN(¬© šøi/ê¨VÕ¡`è\ˆÃc¢úBˆÃ@'=G×ÖBqø+Ù>kK-,ò$«MYãĪNž(/°Ž„wº“kšZX zMÕQø˜ª£$Tù|BÝà2EÎÙ!!L\òÓs&‚/m[åËèø¤žç ˆâªÉ´ãy†ÙÏéq£Ÿ"ç QP†ùÙm$r ©ßmV‘÷ÕWGÑÉÚ5T Š ô_ê¢Îá·­ã&±‚- ¶»9(•ÉÚaysësÜÇÄgÇõÔaE 2/>€ÑÚʱ9_k <®÷²ÅìâŸóÍâ/ ¬'X0¥Éàw—ûÅÐ'dØ¿/~îwZ`¸PÁ 8-‚pZRvZ);-êqZuLK»¼åã Æ™ào”ÐF¨CRâ;Läœf R™…‘ú<[FïóLΖQóõÉ=“ƒØ^™®ŸÊ’i9›rˆ@”á3<­xwjü``C1ý EîÑŠ÷€’@@SZµ‘ÔSȈµïAñ)þ=_d/ÜSȨƒ«s~̶ƌaÈm¡& Æó>wYñz¬è-͸Såä1òÈ×'MÙ£¨˜l{ÇÔ.nx FøF3Poª-{ „>°Ø¾’‘$Ø0¥±\ŠŽh¡¹J\,„JsÏIÎ=¿‚™YNCîùñãŸÀUÎÓÄ«%©«—ò^ÓÅ('/7!—D¹'´º9 ,;¢‘ ¨Ü°¬Ûà!6îž[XzŸ8¼'<Çð% йGë›…å )7¤: /‡ÓZ$ø€–>WiT+x@àðc÷þùËÅÅõ¯r¶êè“âË+å1ÈHÚŸN°ÉÂ!úÝVdGPûüý´üpo{ïÅ‹Bo­ûåž3¾íì·“ûÓ7ï·'Ç{O'ÿÂç{N»Õ̆¿ßk¦Ù÷nÁ4]­ñŸÅï–ðÁ/øêðÜ­[nBtûHZèÃô}Bü7|ˆŠîœkE";ÛýV^3L&[!ÖBH1™_ŽX6ÅÇÊìDrõž'ÅäßÚ²âÝSáÖDG9[yÅ< ¦â4÷µbd(áÛD@`)"Ç¿M„¦õ QÓìO9iàëaå)ˆ[R ÊGÑP\Ï@»´´!Í@yàc0,v tÂÙ A½K†!v+>(ýîc¾£<®ÀüŠƒw;ãgĨÊ2dq&+.9¯©@íÈJT¸#ÎWâXÈê7E ¸p£Kˆ’F¸m ÐÐ> O±ÁG‹£æbpL7ÕÀM2Дnªy¯×tÜXóºbHá;ÉhÊäùÀ¿°ÝƒöÈš:ð Ac_å È<ݱxº¢4­¾IzÖf&'|ÌzXc=2„Ó¥0W«±<¬`Öœ§ÜÚYàie­Œ<þ£îI›Ü$?"þICJA<+‹8Ï{SÚ2 N&FðSn ²ˆ÷‡2N‹{/µyÀ²XÏA¹Mñ‹c' Ê¿ýÁçŠO‘œKã6ïi§¸MnÔkˆ1G½õ{-н‰^‹‚D¯EAý^‹"e¯ÅP=^K·ßkQø-00–÷)lR`¤ª&'_×ö 3¹Âd’Oì˜nw(°4¥B ŠkˆøhÞ›`í 6p¤`í±$ÈÙa2Œs¥UÕ°@a9òc´‚q ÆÊ+5jíñ8§Rfd0cÊ Òßcî!³U¡kÛÎÉÈüø&D/¨‚ÑÐ+üº¾cª²2è€eišaò¤ø/`öÙ>H\ì•S`ÍÀ¿ [à`r¢eð|k¸ÞD`˜Ý¶Ë×íTø·ñ¸50ƒÔaþ¡P®Þa±áAAªuvÏòÉìÒ-G'´FšãÀ¾¢¬ÒkeFu=ÌJAÈoÆåÑD[WAˆÈñ\ ÕuÜkЀ×"HÙkìµHöZ4൲ÇkQTŸ×’ÆðZÞŸkQ¤˜k óo™k ¯Ä2×¢ ƒõd¥R’¸•Ë>Yä¿É F]4¥5mžÎÍ•ñ¶þºŸ"{ì•¶»0"¶&.6SÛ×2X¸a^…0L–á÷%ƒó°x€ ÛõP¸k5Ü™‰¥C_>$Kx-H·qs²q?B &¼Î­aI¬_|UO‘;ÂÆz(£ãóèÆö¬ ©cë1F nsB²9L,n·WÊËB8Ý8°mxÀððZÁ^ôD7¯²rœ©Ü8ü$Ñ™'`õµ ”ÿŽðãÖî' o¢Ž #œÞ«ÒyÀ½§÷¶„À’ÁkišQ7æ#ïø9VŒ/½N 9å}‚c‰‘.—W½SdÏaú Ç9zФ5'hIam¦ôtÞ VûAl•ùFÉš(/áLÈ*@“ÝcVW s7Ô°„‡‚„ò80-*Øa‘5IF.»t+­@ä ojó ô†žã*a9wi¾côðhxŒQ;î-ÅÙ®-`5ø!m³“ hÒ£µ !hƒšß|§ ½¸&DîÞ!X§Ãƒô€ÎºŠƒ¤8v>Ë=º …§ï4¥U5 £Yê«Ám?«œD•Q¸ga:õÀÉe€¡®Ê\oTqm9EÇtsÞ¡×¥=ñJ·¸aˆ"û*A€é)VòÎr=‡'U2Ù'ì ÇW›ýº,CBæÚl@v¸è¾¦A&V[QP_„1¥©81yàjÞN8(´Xž‘ª¡ÅQ¾ÄG4@L!ÊK¼/ìÎ§Ò Ç‹ð"B°ˆ²DÌ„ëåâbÓop²X*,Èã ­>õ…êM°yÑrëÉ?9Äb#˜PËË9 G“ôª–Â'yY¨«?=b’MïK•‘—çUjâmf˜7/3ŒˆÏL%Ú×mVîêËø¢½¤×ÍŹÌ/ºóµ‰ã$¼fÄzLÉ ΈõÆÖwƒ š8oðZ:.,oi¼ØQ¶”…ÞéER:8Þ”7¦·Þ/w­‰ƒ˜«N?¸ûÕð²=ô^ƒ^¶GA#—íQ¸xÙI!8¿qXU†.¬ü[OÍ„ø¡äðd1:…8†‚~iû’–ÊCöʹ ø/ˆ!­€4t´Šž^ÿÔÎcq³vhkhï+Âç¡ÌårÌhú/ÍnÚt1©.¦»l{ižë‹}H»«úMÌú^ÞT’¿ó¶«E4]¯:é†4Áj8Ú¾0<[5©g"¼Y´éÐcim‡¦ö9£©‹÷½¼°%4µc54µ]·4eƒa™8´Z¦å#çwgI›[¤èsÛ¶aW¯PÂ;¼½d¼¥ƒu¹Ôξ¡¯_Äu¤¬y“‘²Ž˜qþ®#\:7ö´´-—»S³ü™‹ôòEFiu%÷ûƒrÆÔmìb ÛÇÈ&t1!É6Hו4Ôkƒ~«Œ4þÝÿñÄ(uš‡¶Q'˜ä{í7NXã“<Tl02×ÐâÉ™Š-„òþ†:¶ }­ºÃ:×PZ‘³(d~ùwKå¨õï9¯›fxûw:ÿ'^TSj1OL=µ Ùè`èÉÒ™æxhà±gØSe-½ÎÈTVÀ‘{pÕÂÝëæ?—ê1®A¤n«ùþé§ŸŠaÞ•:ì«Þ¿/žÞ\ßßÞ\/¿^múqqøýË‹ŽŸín=\ì½ÿòõ~ùöùdûñ¢(ùèúâ¾Ø;Ÿ_ß_|¼øpvqs]<¿øôù¾8}x´·}ú¨8>»ü:¿Û,äÉàÕÉ‹Éì_Ÿ>Ô§žìüxúÞ-Õàˆ¼›¼YM~öt:9œÙ?›¼œL÷ž.)8¸ù6¿-¦óO_/ÏîonÛ®ï_Üœ÷M숋¹l_Üýãr~¾ àùÍ·Ó‡þcûûõÙÕŇÙÙ¯ןîNZx· Ì9}èdú°æÃ‘gˆ¼­¯÷7KZš^¤‘dÉË¿(e{~yö}óÅÅu¹ gEÒt{v}~sU,ˆq7ÿÚÓUË' Ë÷ÄÕ¤âµx= ! Lá³ùõ¬I.“;[/OÏîçŸnn¿o³ HûÞá›%Á³ïw÷ó«âãÙõ]ñy~vyÿ¹¸¸>GÙ¼¹•2` ÛRÿ§–½'ÛóO·gçÍ‚îœ]4ô‹ím©ÌÈä[™<œ¼8˜L·¦“q"àß/óÛ³û¯·ó5iñ‹«2º´Ùƒ ÂOh¿±¶àÌt¡£¾ƒý“Éôýìèààù›qB¾Ôx÷õË—Ë¥ŸúÆÍ8^y€ŸjáwoÚô¤ó=ø:çÌ0»ôU]'ò&?wÂÂ?ÉOÇ<è<oç~Øè°Ës ?kÄîÈ:ŽÏ ˉõÖÁ# Ár|PÅöF½J€ ¸ËÃ<øŠ”Kz6p½…Œ½Þmê籇uÀ¿Ã„`hòê½]îM˜UËLîÕÆÿb*Ñ¡*be0«oËTè-pW´iÿy㤸†~ÿ? dù endstream endobj 199 0 obj 5680 endobj 203 0 obj <> stream xÚ­\ms7þî_1r)R!µÞý ðÚæ0Øì ”«(.8$w8‡\*•Ëﺿwݳ»³#µVZ&@±fÆÏ¨Õ­ÖÓÝ’fe'…kñ‡uÆw7ïödvk~´d§‚o^ã…‹×^¨Ð½ßS ¨ì†qvxb|Lj¨ñƺ‰ÕåO{?²§®û;~ܰ5R`’k#9`Õ.“K‚P/£~£‹W¨êH•ñ5=¿Æxì Ép9Öd#e­ÉºÝU?Ç—¨ÇFÊú÷ëV‡ç1ýÅñZþg9JÞš•LþôÖ­Ú‹~tAÒVÈ4«…©´¾$Yrw/é-}0»Ú²§ü:³­þ—Àhx×Må×Q X]é(ÔÐöp±j;¿dm£Õ#×…öËÆó}2ž¹è݇h‡YÆœm‡YÀ8`·y0\š Ï$w@ï¬Z!Y¬Üoåñƒ ×cª¨rG~HY¯ØlôÙT®ÎíœÔFr6†+6K7£¬In_¸1²wϬ™ë² Ý¹„õbéªç¿ÑÇ;:íý󽻇ºSª;§>#;»š+Æ ïBw~½wëRJé¿;ÿçb°saècF§ctDÛBdèã1FÉ ¬äM^J0 Nб COŽàÎ Ý<£뫲J8euh"ôÝôhhó„>.’g|ÊòžÏûgdÔÂ0…azÑ úñbèÇÝC•3@¶ Å¥Tš~öÝK„#”âBŸ¦ nÃGòb°K wJHWÖã˜>ŽV}êÇwvžQte%ô˜à‡ëåL9ÂïÖ3 Ž £À,©R!ùh_¥Žm€;8¡µ¢¹9Ì"´=8aGO»á™ÅðÑ{ȳt²8AýË¾ØØŒÐ2—•õÔ ð¤ñh…‹‘¡_f3::Ã0›ÆîBç„.YÕÑàû‡ºÓ]Þ’—ßÝ=¸zwóæíÕÛË[ ¯ßüüžþ—ߥ“z݈W-àŸÿö¯_w‹«¿|¼éžüz½ß™ÛÝùö»óÙã³ÙüÞù³ùìv÷àÍç«wo~ÇÛÇóÙâøôäqoÞáõÕõ§Níw÷®ÿñóÕ‡ÏE¹Œ\C®"ö»gÏ:U”Šî«tCª›"U/¥BY*ò‹lHõS¤šýîñÕ5þ¾(ÖY¾!6Lk«bmÚ4ÄÆ)b]],ædª!VÉ)r}U.ò¸ -¹jŠÜ°ß}üíê¦[üúéÓû²tí‘9[ÒaŠô¸‹t)´¤ëIì!÷»‡wO»ûßܼ-ÊÜÚ’=¹TK¶¢Û’=‰½´dSvÝ¢05‰Ã”nÊÆ`Ñ"25‰É”iȶKc‹ÍÔ$:S¶%;D![”¦&qšrMÙ€ybC6Lâ5å[²½År¯%{·©Ð’í–N-Ù“˜MÅ>X—¥bbÛb4˜Äh ·KÅÊT·¸ &q¨íRÇŸ-©Ór0¨HÅ’¹Å_0‰¿ Å_(W¸Á$þ‚j*f±ºp-ò‚IäÕdÌ*¬×ZÌ“˜ \]0ˆÐ¢-=‰¶ I[ҊТ-=‰¶ E[&[´¥'Ñ m-~ÿåóÕuY0Ùb.=‰¹t+3Á Y⯇þƒõ¶¼Ã?»{7Wo~Á€¹’qvóñäç7>w':ÈîÈu‹'ûÏ3©â“ûÞwË?—·:,g7-ûAëBcF+ƒ”€}çÎîù½^?>}öä|vðz1›?ŸÍo«?ÿ8›Ÿ>˜-§tQlÌ!sË¿ ùØX]'ë…ö-¬Æ|±NPÖÉhaÕ_Ò :i'lhéQ8»£NgOç/_Ìž?|0»­Ëz“õB«ac?îô½†~Ê [úÉ ‚›¤Ÿ+ë'•ˆúkèçî×õÓ˜‹KÙÐO‡ ¤Ÿ¤_ü³Ü Ê| ý⃆~ÞP-ýœ&é§ÊO;)´ýK ÂnŠR„–‚Æ §)hË ê(¬û 6=Tƒpº¥ à4•Ó eUÞ ›.ª”¦¥ 4"ª]ÃÂéÅlþzñìììäå–hÑ‹ØâmˆJH;EhyV@0Bµ|¼jW_}pzzòðÉÑ0–e±^ håZO»E[‹“®E­´-dü4±åØ„m¹h+œš&Ö”ÅB®éP´ÿn§‰-ó(#BÓ¥¤a¢K•4H)bË¥T4B®\jöám÷ñÇmB—ûR»lMß=D n¼¤]¿ñªL6œ¾g[”芀“­XG™?ƒ¸1ÄS¬± ó*Ù·$ul”Ò‹aùÖ7V# Ã`ºùŒÉ+ÞÿtåÂŒ%†wn³›nh+Ì[¹}çé6ŽŽg˜§ôñ|9°Ë=Õ~è²#Ø#Àtûy‚häѰcü<µ—ºÏ@8ï±ËAýåaz¢€R†È+ᤖ N­o =MÇ©ßq™|Ë]™Ðk9òezhA÷[„LÙ„q>p™©ß8@‡ Û¢#Èœ îð0Ú)÷ ³¬ê½Ã0\Ã@g×L:´i (Á©1h@ b–Ûæa Â0g !ƒ’õª®,…7WÔtOúQ./µ–Ú êîì‹¥€Óá<ÁæÄI10¤M@È A†òü[  ^̸“ÒÅ|äfÃÓ‰è¶EB‰‡ÿø@oí0w×”Þ7ñúœÌåwL{3ÄYîOa|–eÓi*ÍÁŠùÁ`,ÁÕÝÔH:¥` Ý™N–§Ãÿþžžš²¾?ï“7ÅÃ.-PÉÀíz‘‚ÊÍ%‘×À"똄^1+1|n¤ ¿<:™’àk%R§w%k©/LVLž¬``qãsUÜO,)G&.‹éz¤Ù–a¸wÌYx[‰oæ=[¹†ÜÝ5”¥LÓ³¦¾/¤ ‰#C¦§ã°óÚ*r)ýã¬2†^¥ãÈ5¸¸ƒDÔÀ@‹fC+‹ÉQÅeµ”áže竼S9„˜ 6ä˜4±¾§Œjc˜´ uf,eA÷’&ÇdÉ ˆèæ ‡"¼G~Θb0äUí à´æ¼H!ã+3àó4/ИkçÔß()”¬Ç©»-+Ƴ9âw‡ti˜#m {àÐë»ÂáMïú)–N‚éöšbGÓÆˆ[™¿ð˜ŒNJëá5ÇÒXØj®@!cµé#“Ê”jípj0s÷ÔÔGìÿñ¶±¢„<{D³ÙD‘]îþŒæÝ4ª#P³OR `Jî‹s8ÕëÈà|ÕŸ)9œlž8i‹“¢È`B¹Ç>I0«ã§Fòä€jó¼Óõ›4°Òc$Ų@+dPô““1åŒUç¥S‚Ç¡ã²Qèõ×Ê BÿnÒöÁ¤ ,²3ÈQ¡Jµýê…¯,™R%‹IŸß¶˜\¨‘ ï!b´ mŽËhŸ1EcÌÙòç\ûwe'YÙkKèø12סwY–¤.-82ëÞÎßÿ#¶ªu‘V9 í,Êû Vh¬1JFM—¸5’ Ì×VœÑ=°Æk õyÆ13¥e'F"Ï”% £lz¢*ÊcÉ…Õ¦¯-Ѥ"Ëü$[¡Çéä Κb"–R̤YVBÛ™Iùú¼–^ņ=] V“a†ù’Õy«6\Ûç±Ú*t>]›÷´¿ÂF®º46¡£Â~ç•y#±|ô¶Ú*~i….'Àñâ}!Ò½Ï Ó<-Î4½™Ï|Ƨ×pK‰ÆÒÖ—YÐÛ-w“ªzÓÚ†SUâ§5üÀ'öYaõ^Ôfóçò2¼èD¼ÿî?ÌËÕÈͲ)ixüÁHgcaÕ¡âS ³‹Ó'{nY¯¦å'¦×¸2`¶¹Œ])Ã<Ê SÃää%)ÑÊû”/¾jÌÓ2Ì·<¼`vhp.fÀ×£QÙº@GÛ9LV¥Ó"J49ŒW|´쑹KÀyûèMî ˜R³Ä$xç.Ó—8¾ÜµMEòb[%±*2U-hm™œì 'ƒe1K£BÜMÒ#›è…~çMS0Æ&ea{£,°Ðk|š¯kX®xdÀ´¨¤5ñÀôI£e¦>ÐÚPi·ÃtÕ–^â1ÅÞoB^º>‹y‚áÓ.í£§âÁWÝ@{̽磑†Ú¦ó%̧˜ˆUÃBQ+ŸÏóÒ™¾t£¦Ÿ!–“¼ï…Ä+P壉Wêê¿Ø„uê°¼2Ne¬4 –ÃDTÜüOùR‚·XÆB4LÐô½5fÆ c¿³\s^‹LVðÉzv”8:ò¼m–… °¼Ê!…=I:ä¬rÜSV¦a—a¶®¶R™ƒÓø¡%,È1©µ•Ñ®ÑÎ Å„]°èˆTŸaŽó³VÒæ³4v¢¨ÀºsR<#E#›…ƒO ça=â‘0S¶Õ¾÷gl¨º…™ëØš)׎Ùá Œ0´èºíûC@GŽÒjõ-2O÷þM9ºkü¤MÅ÷{6šþ—Ʋÿ¶˜%nt+®Ÿÿiï¢û€íþ¯¡ endstream endobj 204 0 obj 3894 endobj 207 0 obj <> stream xÚ}[“9rÞ;Æ;³ZêLá8ôÂÙn²{¦wš}'i* ie‡G’í ïót&êœ:…/³€¢–R×|H$yC˜^?þíÕôúñŸèŸéàlôBôéõÿþ‹øtÿþÕO¯~|7½6ñõ㿼2¯ ñÚ¼þuòîà¼ýøÛ«¾LÓ~ÿø?–ÿíÁMA`®Ö˜4|–í<7˜xHÆ Ìý“Ã!Ú(0ùŸ§5°äCL÷NfL9“òË ʦCÊE >5 çÙø># ýÇIbîL0—do/‚e&F¢^òþ¢¶Éÿ¼oàÄçdÃ|¶†ø$¡W¼•ÍÅäÂ!E9âÏ È§C𲻋"Ñ$[zh@$iÙúÁ|ÚTS ýù´9yl¦ÓOÿ1öçÓMösèÌçôú=ýï/óâ3ëÅWH4- ½wËÏR3¥Ô60¿(‚ž™:GdhåÜB *OïPØ‹•ÄýŠÂîs IÈ› åà%ð£\u~å€_Zõ;º’+"gâŠl.¶Ë†Æ:Ù\# «QÙÒS òD˜µr7•­šAw†”M1ƒî¬!ápt£këÌ!…4èØÑ¢7²Í[þçº]Ô‘ ƒ$ñËdÜB€TK:­ÛŸaImG)~÷R!Éð9èôÂZ&©qe09¤B©ó>Üähq(}¶ Bæ¢?θƒQ†ÙöFº:) kæÖÑÊž’\Ù÷-ˆ$orú2l sù`’¤þݲÌh–}ó‹f‹¢ÉbKjd¹‘,nuj²‡Iív<‰¨ÌQrÙ¬¤«1=ŽD£(jâËï… ¥å}˜d—¹Á˜@Í9]ÍJ³íiÉe+Û|¿H|#ž8]Rè˃î¼é3ÙÓ*ÓÖNÃdŸè?ßg²Ï†þã@F©+Z6¾/í¾˜C+Br-Lé`Œí/°`È1h¼`"9 ¾O{°äL§ØgU°ä®)ê_®¯@^“Onc}µŽîkòš·û4dr ;izjƒ‰<ÙÒ/-(’~´ƒî¬%Ål¨µÏ6&ö Ôú¶ÎL4}n=ŒéÀ! ‚.Z±Ý&zh=òSƒäSëDECºBþ òÉÇAK‰lí$™ ÎÙZ'G§¬Ä>|™¬i]òR¬dê9G5‚’ù‹ôËIxR0ýÙä€bb-¡ åìü=‘Gˆ¢ÖßYp…9’˜|;Ƈ·W®¿þñ퇷?]ß\?~úzùpûtÿÇËÙ«®í KíÙev‚’ËV‹—ƒñt#5ùÕ ã[ÅF~XVVN«Ø8šRÖ`Û›#3n6èju·÷‡ÒÆ$‰!\”$4S#’à”Áâöd¾K¨.OQš™ä¤º$¾arÎîÈïZÓ)&µ}­È÷šœ”Ø‰d%ȹÎ1êóqÛÎÌMóCæ¿ÇôÌÁ¸Ògz § ˆ<µ%–rpä8-#©loÍJ9¢ ‘­9ú9Úp\8¦œHrÞj:Ï|´Ô*NŸq’-AÌI. ÓÝ€¦è«fBØj‰Â¡~wäL%²ÖÔªI© y¨èÊñÝýÓükT‰Ž r ’¶ëÖç'Ïk’´Ý.®ëÏ œ¬®—S€‰¥-“¥'üù®4Z7º•¡›È{Ì÷‘G‹˜XÔ87 0ÀŸÐI)@ä†99 H²° L+keÍF§ž!HjN–JVˆT2¥¤K)ê2YC'yÑ:m…§T`nÚ‰&}ˆdÊÞɳŽü0+û m’‚ü0e^dÆË’º0’¥¿¶i sð^‚dÂ˲kg‚>Cí¨É¶)Òõ‚iÈe¿±M8“ïC_Ý4'mºÂìÈã3Ê0?µ O&Þ º£°)’kÞïŽ=£hõ9‚´Å|1 ú$Å49 R‚y桹ÍWó}]8rŠ’Â1´½Žô¿•.í¯£…f§Ð N[L“î÷ÒÕšf§ ‘­KI3ê}_óxËiÐÒ§ËS¬LÀ³¥§%l‹åÃòÏ=f>Œhbò¡(j¡¥æ4)rù¡MÓÌVOO-³ÿX-24ñK *4C©ÏSö/5ÛñÒú—E5©/†œV˜¦ÒWÏÁ“¢S¤¦õyÉT9E-=‡S1.šÀvhÑ69£mrx¢Êdk£xo‹Üu]‰?Ùek;É!2S4D"œ(öë“DVˆ£cÝ£SË1)‚£"­ÉŨs²}ȰD‹EKã›iÉñ³$±ÍpÏ øÏÛ)QÒ5ôƒÙG0¾åä7øÁdãƒ2Y­LÜe¡Ì–œxÉ æß‘oe³ï³„ÕEb@㓈R$•üÀÄámqxæ˜LÐ~Bå^‚äO›IpƒÆÒ°w™´¿ë³Î{{ÊJm ƒ'ó;ùK‡ó 1Ù¥#2 >‘,(ƒ½h³4X'…Yfãnï¬÷XÃVkMw¾<78ÁbtF<9RN´”Z14ªßRåÙšþèkl×…ó“èï S³^ ãnçÕÔAœäÎúîÚ༬‚d=-ë嬼S6õØþõÅûy“+[ ¼_W’æFÌÀ.q*¡ËÜàHaL®+]œ¦Rn.P±¹*¥C¾¡qrñ"/ÑÑ59ÉæÐÑõldŽ.ïÊî@ÕQÀÏ3 {ôt­•C¼nõ©#iÚJÀE½ãZ±æ°æÇ* ~ƒ9,Ç~€Ú}ÎÌûLy0XrbMJ¶•cÞ›%KöÜ*-}Æš —$á°Ç›ÅQ€Úz2lŽ—Z—&ËÒõGgɇ³NNå…DRxc8ÓD.J9 þ‚l‰kŠZ\:+qßµÙ:šè {|‡…&nìM‹$ÎÙN´Hâ€dg,7K¾¢WXñ„¥‡ÁH¹1²V†ë§ØŸr®"ÊN6ç”Lœ%×Ï÷ÇÉUDÎåþ”;ÖÙqä=Ù$‰oK†8s>m̤(Wb“›Š"h­·ÀÅJ9È%±X)+kîcÀIb>ÈÁ–Hk ô[ãMne_ã&÷dÍ^]ÌþÓ”m¶xÛÅÁ¼sZÏGÓ]ïØÙX/OV×{7 ‰·Uìˆal·ƒ$\ñj¢¯åXBmHê¸4jȱLž›bnÞS­äk Šªuo¥×DËÚyÛ;×%3 “ƒ9S3\¬Ûk¸Ev”-5™ÍÙ7d] Ö;˜ˆnæ/€À "ûÊ  {¬Žvœj’[ãÜ5Ë. •ÜšŸ(\óƒ!Õ3A6ׇ#d3h‰Ëã9(Púòa ‰ÑNP ^PËÜšŽ‰]vo¤ïÞ/›Sve86ŸØ<4·Þ(×Èž!ƒ{ôMÏCös©;‚žqë–U©éùŒ§t¸©.(p¼-`F*†cûºãÕ%.sÅ“dØg, +lV´c[–Ï@ȱonËšCN¡O1ïÝšúÃneMGô¦Øú¹8A­Wø|’tÇYueúÚî(·“ÑgîBÙÜ%©eÀ £m0ê¸DY©z¹ðÜ+ãø¥uI®Ž@½8)i¶¦ë3²êKK¼ÒÐçTæúÓ‰MwÊ’WX‹Lì3”=À’‚ã(„ÈÓ@p\¢ÑI8´'R¸V_EϸõÅÛ2«„ê5o/æ6ÅÆG“ÎZ™PäMÞ Z¿ú÷¿>üíÏÿñð×?ÿõŸõìa`—4ô%*LyvÕLÇoÙƒéãDvT˜~ÓQMÁ%2¡^_á’ 4«›(‚9çT¯¾><¾}¼üúö×Ï—:+(l&ƒÞþ\xì˜$@ÔÔúŠX:$ýzûøõÃýåÃå¯:]ÞúC‚6ô©©!ˆÀýÝ|G+¨;ʺ3Y}”k>‡ ›EÃÁájÓJò`‹Ÿ¤ˆ45‚λûŠCOK/»¨ð§ÝøðÅHˆtz[Yž(¢Î’ÔvGž\ØR$#i÷}@–-¹½’TYp͹®Çj¤:G ~œªRvÛ¹ÐÝøÝÒÅÓñ&Âo0‰èP{jÏϙђR-ÇjN a»œ•Žìóã2˜»VØ~F¿ÉÉ4” Ca»/’[m o ÕAÐ7Ô°°&ˆ&Ú²7r¦ÿ(ˆÑó_A6÷+V³ÙšRöF^JöyƒÕ­—fíÈ,Dó¬<Ôf_øÜŠ‘}B!š­Å‚]Aqxd¥¥Ö%pdxq¦|ʃÎX1ZÉ€ÖÌ“ãRì ,d#%*ÔæÔžI×0¹š)sˆÙ,§ðS½‹ ar[—s^É ˜Azƒ¬—A/¢K¾vöŽÖH8ذ頰îN9šçkºªßZ¬gÒÓ¦îb¬•n‚½©; 9RRÕ ìÄ‘¬X£#ïÑ(9eí= Wm’ÚãË—ÖWsuçQßc[RÆðfÑ4S[{ÆÞfÒUÄ/¹m±â,ÓÄÚ @í?¹ŒN6Ô#Ëe³Q€žÄ|6€‚M»BQ¿À|PjƸ5‰µÎIr\ž·ã$mÂÔqU™BßgÌ\LV6¦lÒú$'à‹Ê#Å$’;¾v"'.ú>u¼—VLîOŸ¯É÷'ÔòÙ …»/˜±FR­€,A[‰²ñN™…êÇü(6Âò¨÷DÊ:X½¹g…–úRç#)šúòëM…ÒRëÙdN¸øÁèHMjjüíû”Láq‰!ŸîZ >DéFK8Yœ”•w‡{TɘÉ>BJ¡Ï§Zp¨˜ê´WàƒáÓ[92¦yG¡n §ÎÍI¼Ý”D¾ˆò–VEqTÍ:úŒuê9HÐ…8X$M²Oâˆõn@=WÓòÒÄ>•Ó“ó½Nˆ„ŠªX§èÏËgÖ3º>NUäoS‹çƒVëÎi15'¶qfÜÕ¢À¬wÍ'†»á,6rEÐf±—,9ÉkNEå7JŸ«6È{<@F´–ToµBPëâóµ(®H‰ÿ¾µ¦D9É.>ߋ̀<6 ¼/ÒA_ϪÊ1ˆJ͘Jz}8Úgie¡®#R+# ­h ‘•Ívö¨5öµác9&uzZƒ‹2'e¼wŠ–Ÿê&dWS2èSq;䳞RŠn‡|ò)¤Þô$ pB¬lȧˆ=çJ¢.Ÿu7Û9ÚO®šôlÿÞ*pÇ…ßV€.p š÷LôŒ×VIÇ––”Êû­KÐì¬Ïá‡"¬ã“¨ì>n+þ`n)ðosU9è©K‰–,±"èké´áªZ²8.û>Ϲæ/r–@PÎG-YÉ_™m²¥^9Ø•…šµ’!¿`œR5i!œ-Ú|bcsî³ÁÕ¢˜þ9rB|HƒÁqˆË‹e¦•Cr}žó/H#è“(ò3iÐéé¨tw'¶x§8`%ßp* ×hškþ¿;o| ª"&`–ÍaÿZåó¿Éë çÀ(„ŠVŸê¿ç³C^÷ÃøXE‰üÓåŸnï?}½¸|¾îÞØÃ§d½)ýÔšýíM&E5õfÈ®4óÖYMB ½•IPîòò|y¬ªWy‘u©«Û‰HÖ#Úˆn8ÝX×À/„bÏ@J`C6Èó"ä Æ|ý*‚Ú #Øy÷¸;Ø8Íé¦.õœhTºS>aÉM—úljÉ©èS©ì'ÞzI]Ø•lî­d1r×[ç[çÛ–×ðo(<àý¢2IÖ+u}|ŒÆßnæ]è‡éX=¼uÿùÆ·À¬Ô=†©|“ ‚®ÅQi€¶½c­¬0µû¶¬0OÔ^ 6‡ŸÝœødµùæiIYëÓñ~éd|#9+r>*×Ï’ÎR¦ör½,™ØûÄñýÏÁz½9¥Ö‹ôÙÓøFår½KÅäþÐywºÒtéäó©?|.ƒo…@î£y…5xŠQæä ñB0}Âj!^ ý:6!õyÅ»×!Çr®_=–>x‘ó€·|ð¢fÔúb¡Ð8ý %.½—\WŒo ‘ ኅb“È»¦ IϘ%™ô\+Á»cãÝk'çYVJ×cÊ:EH†O"æ>i|¨#K%´U'XƒÕÔg›¯Û‰’¾€;á|µÏ’Pæèª7|ò• Ç»²ïÓüeŸ·ò]nºìË«äùÈ~TZ†\9ßk9X&œP7q ݼëžKÔÍ_{øÞd2õf`˜ù(¿q’{JV†´U¶}>×S°Š"ºFçbrËHÿ1°¯ ^é&;»üŽþf£X’Óæ¡EÏ^g‚—KD¿¾{{}ót¿åKñ¡QvyêÛòŠÙGGÛ|ŸÄˆ0úoï//¶*mÓ¼½¢—ÇWÖ9€rT+¤•Ϻ¹z´Ç£2I®Ý =ÇqS­zÄQ|aâlæä\ÿ ‚ÔƒDR!H=H„ íƒDˆTÎx¸T/7èSGá\!¨·eÀÇL¸°B€n1ûa;F”È:„Ñ|ðÖ³‰ƒùà÷$çã}c…Ôßâ]ÆÖÉIi%ÉN|¿µ$_V£qÝÛó.yõu¥¹¶%ŽÃ¢œ(!Mîdwòîv±3-|DnÜ}`cªç»ÆyP_&>ö—:Â…S-®é 4Ÿo¶}1áw¸´¦K?»âE™,ð²ùZ‚E5_ÚŸÏúÌ‚-; y)%íXþ¼Èw%õÀ+Ëÿ&EK¬=ÒI5»ØnyÓ/ô¥‚='¥¥¼Ë+|hצËsjQì+¼&)Zœöúöbä…’ìkóåË]ŽñÝX%˜½ÒÏ%¥œ#SÇò$îðž$oî7ö i悲TŸqÛqdéØ[6“í‹:ïJZgú‹o¾úÊêœÖÞlp||x'#ë]UVªumGÑ×)vùüAwTuG1„̲g’RPw´µ›Hö$²ðˆg,뉭<ÞUãN¼›ÀGGôŒ·hó¹ymùéÉÔxáß=àª!ÁÌèò•¥ú/x—K¶ô;Y9ÍûˆTv$Y'È´Ñðã²_H²¥º…€ ñ†?¨ ö©%Šâ\Nr:7²{¼l$¼=øáç ‚”´b˜ÓŠýqDKkfÄ2+EáHËÿäê=ƪÄݶHrH“\aà÷‘³i²\3·Ôóþ+ߨÐ]ìOd…ywøpSœdKàQð囦/n\žÄGcô l°ºzˆ¹O½çš©&øš0íjÎ×y3^ö%¬ÛÞ›¶Xà Âòóf]‘âÕ ó"rùs—Å|_fTfôb½öæb¾‡4 úåw#rìsÇÛù¯®°KF+Ð{£Íê–—ø¢p‚.f >2`.×ZxÉ®ÏâÚ¹É 8Á5*Š•l9A>"W6õÉ.‰I×gWÊ–ú4ñ¡f£˜3e«˜oYU$ñâÑð•Z¡ÏVNÈ”0Pœ1ŠíxÐ ƒÅ4ßùœdÎ=í{ˆöÇwN¶æ›»×MŠ;¢}’ ‹åÂÑ[ÌÓ€_aŠÆÙ&Å‹‹ 9:‘¸ n„IFàz]|ÎIP¦¸^‘¹EàýVvÆÖç»®ä›r˜Mçy_ˆô'<ôjbÔs·ñ ¥Éõ&?u&•ý8¾'ÊÿËÖ3ã—F­äZûh-Ù­%>£âJÒé|ÀÓ.%ûAŸ|f¼Èq¼´Væ,—¯ˆKìúq„úÛ+Nr…z¿_ô¯ÿç«ê¿å¼ú8Z9ÿbý…GBNMÿü×Wÿ"~õ[ýb× ³ýd'{õõk\õtþrlZtÍ}áï~«_ܺé@Üa³Ô|`…îë 96-:oÆÅ2·ãò|qXlõåØÔñWkŒ=¤xâêÜÎéK3¶¥¿elKë åÍ—:º¥¿3æÔú¹u,ÑÔ‹hD{ld‘ó—;Ž¿YcÌ‘±§VN7l\úZ†¿´½°hõåÈŒ¥·3Ƭ„Ó6ý7l\ú[†¿´¾°¨ùRÙ¸ôwƘ•ˆº†‚f|\÷ÑŠ §¤ZÚW_ŽTÕbl+&Ë—f|K ]Kë íÍ—:¾¥¿5ƶbÒôÇb—ï®Å¤”ÓœDàüåÄŽãoZÌ´“åï†K_Ëð—¶­¾™±ô¶ÆL­˜4ýá/Wl\Z_XÔ|©l\ú[c¦VLÔñ¹úÌáz|ü¥¥}ýe¦òô«5&69YïÜ߉®së'ÚÛ/<¾sgLmÒöGb—¬µ ¿µÓj“Õ—;Ž¿Ycb£MÎ7l\úZ†¿´½°hõåÈŒ¥·3&‚6iûÃ_®Ø¸´¾°¨ùRÙ¸ôwÆDÐ&ý…«›¿@[Í—ÚßñW-¦]Ýç/§iK¾YÝüw»ºW_Nì?þ¦Å¬W÷ùïfÚ–¾v'«{ýåÈŒ¥·5¦]ÝmøËzí—ÊÆ¥¿5¦]Ýý´Ý® ín¿Ôþ ÚîºGÑN[ÛÍã¯W›7h»W_Žì?ýfim÷ùïõ´û:±ûÜöiJÖ_ffœ{;cÐv·ýá/Ïl<·~bQû¥Fôm÷¹õs;ëþ˜nj¼c¾¸Ê¬½ãó‡3ÜëÃÛÂ%R O6,tè, /Ü98²Á¡s°4½4²î ·bß©é…3ë•yƒ¥é¥‘u_Ì:¿¸õ)$>þÖ¸îòƒG§€KÁ*GÖþlXç×.AÓð2bñÁ£C°4½°nÝþî7Ù4ó¥$Ó~¨¬óè ,M/¬[÷U– æ7Œ§ÄŸ«¨ef²ü{²ô¢=ôÍËÚ•?¶…/} ãtéÊÚ<¶†/½ ÝLôÊÚq˜[ÿϽ ½4Xemߎ­ãßKoC#Šzµ¬ÕðqáÀßçÞ†º4NY«§cãø·¶oj@X’e½~aÅcW;ó2Æ {>È/§föFë2`ÜÔJö†µ2€Ã`qÕºü²´³7Ì”‘ΞhLR°7“‘F9+ÿP|9·³7>’.úž0BR°7¾åÿW;{=`éíqܤ—¾×uNÄG:—;½avw8ÂÛ™” ¯=i9‘¥Ü›•“‰¡=é+™;Ü›¾’‰š=é$™dÛ›N’=y™ôÚ›w‘†=y™Ú›‘¡øž„ÌÖìMÈPÃþUëòK£Wö$ d̺'²–ì¬eÌŠññªuù¥Ñc{"kÜí A%{CPíØd˜¼3b!ÄŽGD”Ü×yä{œš%„8ÀŒHgïD|hû:éh½í’pçb´—!¶wšî%­7^føG9¹áÒô·(i½õ’0ã>ÊÁˉ¦¿EIë­—„©éQ²Zî4ý-JZo½$L’Ç2¥¾îﬤõÖKœê(Ë*SÜM‹’Ö[/ sª£,«Ì7ý-JZo½$L>ŽÒ‘2Üô·(i½õ’0ù8JGʤiÓ_Áõ×¶UféFy;™4]÷wVÒzëõ‹Ãõ×IuÉäbÓÃå×6õ­Ù!‘ŒãΦ×ïéyõÓc­q)ÍS8š‹8ßgÖ¯d¨7$rYÀ£¨1ãjE}Æ×˜ƒ—-ÉJ~o‹³õûäk%f³a}sùf´? ø²¿…„ ¥9¾#ÙÊæ6êc,ü´’ ïÔçùøD¶õ1\ÏÁï1 êÞ^êίêcDYi”³™ð˜Šs’ÿp¢ÂN´($yµF“QÆÛVñÜ(÷¦zÁbŸ~‚4åÐß aã¨%d~šMÔé°d»èê«y>ÄaÏ?ùȬµS=Pe‚¸¿…å@ßá)â´T+ÖüÏOÊEc4ã\ª¿±õúŠå½Çtž´ï—†âùcÀNk8´Y6ð'åÅGk̦f˜JÕßúNÓ•Ÿ’ç‹ëþf¡þøb`ÊN’p¬8‚>IxïÁ“’ãtËÙléÌ«ŸäøhL¿ù$Œ£‰’„7âåøIr¶HÅtf„ aF€ÃÓ+Ns+D†“@R(ì2R¨)´óµÐ]!â3..Ä(×KÛÕžuÁ%ÙÛ‘àh$¸ .’0\€ë‚‹«‚‹-àVõa[y›_Rù“`¿Z­$9H¨‡Ò­Ñ™ñåüzmR'‘/µ€F“ðÑ$" ƒI¸>‰H±:‰ØÒí¿éh䂪}ÔÓ>•ÚÓy8p.޳!EàåJgÅÁ—#ò}O:*hÐX4ü0‰:ò7jn‘VoÛªK+€FÒ ð‘´" i¸.­H±*­ØÒ~•£ý²£rÞS93†*‡oPª&à£ID“p}‘bu±¥=*~ÓQ9ÈUåHQ9§¸²;SW&›ö’ëÌTÐBÂù u¾VlS~êê#«ƒ1ð5`S.tŽB{jO8}FVä´¯ú9b_¥¤2ê Þœ(ZEä-(×KД7a‚¥cjd¯ŸëIQÎÄ]E7ú"âûƒ"LYl}¯Omà7KŸG|‰a‘#úUñ rC› ‘:øH! up]!Ū:–öÛí—›ðžMј±eSMÕ›ÄESí›ÄESmNbOSmS?ÔT½1,š @#Mðßí 'ÒJ÷e@NœïêéŠ"ßñlyµ«žå“Çeis&,K„–¥ ¡¿,®.KA±¶,EK;¼üͶ— ¸ y êx Ý™:­½3uZ{Û3ÕY{ê|í[{Ý1œÖ‚kO‘¡— 2Jõ©z êy ˆU½ÁÍK@ê%Lxçñ÷hÛãÆÀ~ÜëM#3 ‘>øHŸ }p]ŸÄ4EK»Í¼úËm3ðŽ™W™12óÝI\T;I\TÍæ$öTÍ6õCUÓâjâÖÆ„®j¢²÷±ÏÌ÷É9šù®(žÌ¼JóÐÌû»-KÿM»‚„Á²ô;v?Åê²ôß¾û¿é˜y¿c÷A=3ß›©eí훩eímÎToíióµsíõư¬=_¾% ÎÈØÌkŒÒÍ< u3 -3ï2ißI ‡¸îLX H7eYv±Åo}þw9ããmh‚ Ä£Ùèâ:J[·cŸ A#ã¾iŸJ0P1nÇ>• XU1î?»O¥þ²cùÝî}*•CËß›ÄEûì›ÄEûlNbOûlS?Ô>½1,Ú@#íðo±ü]rN–¿'Š‹å×hFË¿÷#jØ7wsûzÕ &©[æ‘/™NÓ ‘–ôV¶Óì$RD,€i.¦Ê¦>Ý‚YÅe~Y¥\ÄÂÛ" ÿ ¿Ùꓨ 2®Ï ¾y©#@íEÑn~bAòå¢$)ÿŸØãú"ÁÕúÝ,s}Ÿ¼”½äùîëéü3£\îê)ˆ¼Sî¦Ê“£@Šul4t-n¥ ²Ï΋:ZÇíeSõ*Z/@ððkªè#è/ õa0Ì4_æ… å, ³-MD*’\HcL©O?Þdh!H¹4Ô¤ƒ•ü¸hoñŒ‡’äX¬Utáì÷^^kê ©ðï¯ E6§¼áïr)~ÁÂKVæjë8ù:2cô>Û‹HÉÉãò@DþÚÚ3KFI6)ï¼çƒ3I–;´a|=zw°üªN’Èx×wJƒÕÀ&P¼ lø%#Ä|ÂâÍ +Rc) –°ã[]\Ú»9ïðÅkó€cÙòäõ™—mòÅ›V¡îé¦ubØ\ömû Ú›xðÊ”·wLZ¾,ÞìP7\ú­)&åînêÍ·ýм¹XúóÏ/›R-ñûõA®©;|¿>äÁlz¾×HÎß¶vq}?g(ƒIàóRÊÅsÇ|ÈÄËž:ô¾Hr›¸¡ð¥/gü¥S¬Â¾©S¦Ò·º¯ó.Iã <³5šHq˜4˜ðàí!8¯0µ”ÙK‰Y®Ë[åM[Ÿ—Dxkoi=±çˆ +¬àJ¼žÔú¤gù5Ýcý·!ÿ AŠ#ÀÏJâ?€_UÚø\^úŒÞNr’½7ìåã“JëÙ’*M>˜B¡? ¼¨³L’½¿H/…ô’uí¹òcù­ôî¼Ûúb«¤OåLòX]+/ó#I|ûáíO×7ן¾^>_þúøõæö½þD’¯ï2ÉÙ¸—8Iàí²,ZÝVO—徬ð-ÌSè3†Ÿ£OSìϘ¶>‰¡Êèq_‘ðù¬Ñ3ù[Foø •EàóE›\õO/‘Fåaèâjdt/‘&vu¤=½”kh‰Èóomr¯Cà ÌûÅdèA}²ÖÉ”K¼«—ÏÍ è¬+Îo¡Ý`|C´ X^L})¹Ïòj]eKí¸y1ètžÅK ‡ø5è ¹°õ`'‹êŒÞÏ>ò^•Ê¥L›ññ0W2an-–Ôç'Ÿ®u ÓÛg¶„Qñ†2A™xµ€âSSd{è%ñIE‘ÌïÚHg.jC4KÛ_ˆ®šj9í­ÿdªÝ?zÊŸ_ þÏŸ¯þã¿_þßþ·¿Þüû_þîËó…¢ôìÑ/db<™z:‘o¤>ç'Ö ?ÃO•m¯ç[¼U>DÙûz¶¼?ÙÍ`&ráÎåêê.nH²œ Öÿ~žÆÙ½¼¿ÿÚb}&øÒn~·wýs©]<Ÿá‰¤è‡PêËGˆ„ÜEž &€>â‚·A¶ô,ÞñF€®”Ç‚]} ;NÇW>pP GXù|g2rº“ßI)ôGä\ ¯D’‘y2.²ã'|;$p Ûm)ð+$q@SHõáAµº&º9¡‡“* c›j$”ײ;¸!Çø‰Â Aßúβ?ÀA?®Öì?Èç(’ã €ïôM"®wâ „¿A7‹ŸŸ@Ð÷J ECI’Ô^rˆ_›ä`ü ì æM¬yõ ¾…ã‰g Œ—4Â#’ö `^ði(c$á?b*˜_ÔBÐέB‘† ÛO[9ˆ’™¯ïInˆOÝÉ¢Ù-ù!ÓiÉÚú N°EÄ5ÆÀS£…w*&’TÑÓ…þ²·üà0 ?ãóŸIò¥} “¬iö]Â8ðå}OÀ´ihë¶`>bØëä”?ãV@Öæ±5ù~3üÌ›ÂKñÎùÁ€ù^y-ÔÕ«ŠØ[ò¼ËL¾þ·¢y‹BN›Ôž¦_õÂ}:+˜v‡(LQˆÂ >Ë51ζPÅR@B¢DJ€“úYŠç—É8Q;âxÆKìçRÐÉx¬©Q–Ó î|Gç»ÂïgMW”\æ}8×ï+ûúúi·¯*}À×Á»³Í÷d…<€dMú?áž@Ž©ßoW[×,o}}ÞÙ#ãÇ&Ewbï‹ï›a?õ‰ÜiˆóŽt­\EäJ¿YÔ>dêM}]MEc…^É}%Ã{Æ,º–O+óÃñü®Õ7(~ÀJѧ˜Ù¼/æM×>Ï­ú‹…¸š$_01ÆÎš¯í$: ÚWï~>:–S;]ÏxÚŒ4—Ú¯|4ÉP˜cJBôVÛüBbm· ä\jtµÙ¿rÞ‰fÁN5˜{4–¼Ë˜k´–r¼ÿ >sYÈÂCK˜v±)Ôª$€%ÌÅ"0Ú{Ù¡îÏ#£Dú#IÅ0ÿ±Å$ò†b®0Ää—I{\wäÆäœº\w–|Ì$g#Rõj¯ß㳓ì^#ûµZRÞo±ªˆ·–¢y)…ïä€óœ_à5©'eöF¼9u?ohwÞ–öB.pWZ™×ËEÄa‹ýæˆè6kEÚ0ÊÙÛHK°uq9ôiL÷‹A¿—ÔbŠýíI)å2èïà BF?.€ÕHv°Â Ç)xðñÖÞÌn–XSs[®¶ˆ¾®±/Ò¬F¾˜È=r ÌéÏSÇC1øùÿbèȾUwàiÎæM/b.&öÛáJ²$˜,’ œöÌ‹ºÙÂ9^£^ZƪhÊ\zˆ´žÔÍ7v¢¹È0WBS…„ñ:nÍÜcõ oºFÓcä%ךΨ”Ãð‚ÄóíŒE4öI<ŒëC— \Õn’h§õq½#&‚÷žÝ0Ò™ÜpÃ< ¬­E§ úʳ¶s‰ößbâ!z1ŽˆåðÎYÄ|Ƈo‹ áÏ×òîóкòlâ“ÈU7iJÝI䢛Jw¹æÆæÔDÖØEΜÄ8Ñ*µÀYì%ÌÙãûœw¯þg}_ÿFÿ¦bùRP²H¬5ÖLõnзúÔ@O¿ÿ×W/¯ÿÚýÿ’†^ endstream endobj 208 0 obj 11064 endobj 211 0 obj <> stream xÚ­]Ûóå¶m~ß¿bâÜêÊâMgÚ‡döêl³Þ‹w“t3yÈ4I;u’ö¥ÿ~#ŠøQ<ŽÇ?[:Ÿ@$@i~úñžÌO?þ‘þ¼¤ÿüä—Ÿ|ób~êÜÓzâžÎô{ºÎOs\¦%†§xòÓ/ó<ÿÓÏ>þÇñ{šÒ’æ}‹)nZÊ¢0¿i1nž§ì4èÿyÆÞ ¸wS\£†KÐ2%‚~uÐä?ßòŸWâÁT¦â‹zðs}ZÂsžâü¥F®eŠÎ+äk*~òaU g´NI³”ÿ¼ÝºÚ‚½óÓ’ô,}Wñ¯î4sßlÏd ÓW»¹¸)óûi#,‘ëä4ï/09LÑ`‘`¶_ý”Bê¯;¿®Ó|Ö­c‰´7Oëš®VÇ7/<ÈRð+;ÚÛïžÿúÕw¯ÿðìù›?|xý»çxóú_^¼=²iͳ!lüçCí‚àf,qZ‹ï hšÝ4{-(Bä Û¬z£‘žpW úG¢W"«!Í*V;!LaõÛÓûû¿ýõ/ÿ÷éû럞ò³óí1ä[Hq›gµ|Ñ£E¦@oªð€Ìú)&…~®ÄêPÊEã%ODQÄ|ø™~dÅ ï%ˆ¸»èæ¤ ¸4Ŭ›û$AeÊ)*Ô!4©!(Ì3Ý/ÒqÕ ûÜ)Ÿ­=%ÇÊ–£Êî¦pþ®.°RÆ Q×ó-0¤tg§{ðR‚H59Ýî¡!æ8¥¢Y$ˆ¸n â¶•Â>N>]Ì$k˜bM„i&5?„ Òìóêúë4Db¬ë¯›Ü”×å¢KË<¥µØkæØ®%áÕMnÎgÞhþ”BÚðDô2²¶3ØýL‚ Y6¡¿h¢OÓ4—¾|¨@*8e{I?«›µÔí‰΢—Ùa3mké­x&“eÈ1ô&§)£ÿ2»,p4«±Þ^¨¥K ]½Øã{›QNk_\K˜¡è¿­ÖÇ÷rïâyÏýÙLd.:C¡>·÷Þ¢ü<‘%Z‘lX–iæíÐǬÊmÄ‘Õꣂ– 29‘tHaä´(Ð÷”'ƒ ÍZiAã¾ÖûéÀÛ%Rü"Q¤§Xvõ^ZáqZŒFå¹a dÚjÐ' ÊSas±Ë/²)S9á»¶P\&Ù÷^Àmcîé??mƒŽu£–˜…Dý/ºÿ'ç‘@Ò›‚&û©>IÁ/ÆDm¿‘Zs! HÓ3´æœeù›*èocDý¿ÏR æiuz^iµÊ&CZíN‰­,’Q¼©>z¥tSR€ü½Ñi/æþbŠd4®¾\ +‘™ ‹©wx|f} qÏê óåÁJ5"çÖ©Ì–rFÔÌËEbäy;ð½"ª lÝ&Õ\ç€âµžû¤³ã6-ÐA-ç™v…Uö3Öé|ßop%¬F!›*tLª©ghëϳbìo¥Ï;¨Â€O{¶êΉð{2ݬÐ?‘&z"ͪgS‹¾'E½Æ¥ËQOZ,zßå¨'ouŠ]ÇÒÝ„ñ×x|ÏzÖÕé=hÙ¸:½—<ÈL¶§7Õ¡–}¸Ÿ`i°O°!°‡JpEl¿øô¼se=8¯Þh8 5C»mŒ«©Þi•IŠÐi´ÔàK™bè.G6絿&âJ\£k6ҹʫ™þN΢ö>±Á¶$§Vˆ’–]è ˜h5™ƒ^éhEÌFŒ4÷è´ŠÂa.¤~–Ò§ÃŽNOK AÒ,›Ãfú Ho˜ŽN‘<"ÁÞ¢mÀ=3¼lûÐ'ï%…‹šÙhS‚~Šdt!è½²Þ¿Fk±,]"-]¾I‰ù‚£ŠÁv¹iæÅœÅÏz7YIÜ£·‘'ç_O¶Öš4ë Œ##?]¬K¿ ÓÒ¿M¼¦ôL‚h‡×>—}t›I®ú¤.düC:µ¡çYwÅÒá"ø‡—©¬zåVÉ2í4[,3™&ÄZûnaìαó¹}`ß#Þ¼}ù‡Ï?8‚i›«!¹;8–À4°B"M~pýÉh û^>hj‘6ˆÒ—é˜h%­‹$’m˜³xAH;ëåɹv¦àâÀrŠÅÓÂsWËÉt^/$ú–7:¯íùt‹ß¬ëö)Û‡ÔMóR»QØmœWHi|¯¤ë…9ñ¢xÚºx¿Eø3Û²ç¨S`piÒÎWc@R7åiY4^£nŠšÐ‰WŸõ+z,ûPlù%úOZh7øï?«[ï_Þ¦r"Mܤí*烤·ØKž|ˆ ½Íä?(o1©!ö¢"úk´âú‰qä£Ãóª?‚Zx‘†¤»ð#\Ÿaq ôÖÖ;4ÄÒ¬û!— 8Ï,€2:\ѽ“;“$ûEÀ÷ÄÍhøÂŽÚœí^!Y’‚è­‡ÝÐ1* 1QŽN!»9°Ô3r¢"[EÎ&Š,'ïŒ~ÈÉ÷dÅä>‹6£ÈkJÏPy­ÆN\±¬˜Ø pÞyõŽÎ›nŽ}ö°ÉT¬¡Xû¬÷…Ô“W`0Hss.mºÀ¾_…‘“Læ%ꙓª:.[¨A¯ðྋKö;Ñ£\QZâÍÐoÑ<[ÖxA‰##·ƒÕmuÅJÝyÒ/1k^é”ÀºÓiÙ}§‘ŽkŸÿ¶µ`¬#ŒE{›7Ø« —@óžfÍ蠟˜Ã;‹îÁ_ɸÙt1ôW@ yË>õç}Î×@¶×ìü%²I–Kþ’M6{â¥LÓQú ÇÙO%_0ƒMïÍ`­(°©ÉÉ'3ûÌð|ç«.’jÏKêó&²j7–&¥­›Ý”ËÒ×<ìù.þªuÞדa”ö5¿’žèßáKÃ#ã}_&ÒÛ¡¬ö8lK$uG~ø½þåõ¯ß¾?1Ôé^ñˆ-c•™5N2ƒ× +½¬L·ã€tdËsœqv ù@l‹] Á骞SC’æÂs¹Å$2"uߥçÓFò¬I½4ÒBØ´ö§3„²å]"H¦ªÐù?ÇÅæÕ[#CdÙÂ;Z¬ º°~Öü{®Â!sÒ›^s¸§‡ûNI·#j—ÑqŽ·-ÆêÝ+ÌÉEÓƒÝ#L.¹¾˜F¿Þü#¨äƶÌSe›4¹›ã¥Aî.ŽÔ°^/$ˆT{Èýˆ±þò>Wå¾<ð6Gw5M¤LˬIýFîa4ãáLåÚq¥D§TÆæ+o­ÕAè/B9Ö·ùšçm¿‘§©Ý µßˆ#~›ßoðäÀ{`ÎüFË-Nƒð3¿Q^o~#€Ë‘™± %HjÜp3%‘R'Í>ÙdpJ&¾‘™±¬¾ß:íîÓºdz[»ðâäH@‚‘yÏ„b‹è=Yº3d»y§§ì:i™=O²/×M¶Ù«†­½FO¬³»þÖÒÑðÿ]bÖ¤eÐ_‡è¾¿Ѧ¿AoThÁ‘ÅYfW‰IºvÈÂ+ Rdhõ;˜8½_a¾B· §™!èÇz+/V XûÀ• z[5Ë·÷!Ïv² MѦ†‘À¢s6¶*ä‡úç=j¥%êq~Z‰ó_$íÀ•³ÑôüâM‡ÍPt›?ÒÉÄžÎÆœ]ÍÓ™™è¤’HBΜ™)G…¶K%30'~:2.H*²‚ÓtFôz®³·pKë mÝÙeÑÝС)GÆ;Ï)®´Y¦¨»)ÃÄ|¾š=oÐËÊizi–Í´í òiGq¥?%ì`MIwì­}°áC£§S Â?«’¤.ØVhß&‹AÒ¼˜oçi Ê.ØÕÇ×Òõ8õC-”ŸaJTzŽ³Û i¥É ß°TÒ<-\!iÜÎrzg 2û?­µ÷µ>‘’:-ÁéÅ`'ÿptzuö ¬Ä'öéÅ­q€áBK)0Ña®¿¸Ù¿é×õ D‹[z¯&‘Sf—+ñ䲃`ˆ§a’-œf£¥ÄÐÙ¤6³¡a>éS*Ù‹±ÎN6 È¡ ¢Ç.pìÿš/¤™Ï–!\èšÈ1×+½üEQmêsUdá¿j8ù).et]ÇÌçîu€ßì™ä²´A~'²Îæ²ôùf:èÎgºÂ>)ò¾Ë˸WñKé(Êb_PR ¿Na5“ƒa+p©@ÇVˆyU˜g‡1áÏÄÚÐÊVàünY¶‚[MÜ"CÞ~‹b n© oÖ¶H‹¶¯àé϶àDäÕà‡Ö÷œùU\Pȯ1Ù8­Âí7²†ÐkL7^t¿Þ9cÑì—>›xÏåÝz6ͳ û!Ö ;ôξeG…üÊ>\ppÑyM6׸jtyºxþñ KÀ<Í!?ýþâ•DɘýÏ'ž–`à-¾½Á©÷Ž|°ß™¼Çå_žü úa»±¶d9¢´¬AÞ(!íì7*aÕ0·ý@7ÉPC8EŽ]Éëìvøš¶¢JUµËÍlY·ÛõÎ1š£ƒÌ1qã–,Út|CpA#߸SØ/[ŽÕVvŽU²;ÇÄ îhm§"v•FÛÚJv燸ÁC¯í4ˆcµ¯mÃ-ÇjKû€+á;GÄ5q¬¶sü¾/öJÀ·kÌÑì›EÆ×’#òFbæf¡×-ߎ¶öA´w¾È;̃£µ3‹å&ÛÃ'öÔïü‘7ˆGk b‹N6Æ<ÜJ€Ò5ðGÜÙxq¦ÅÄû\îT¢¡ß޶êØ+íÊqgãDmíÀÄFVѾàam¯¿Rß9$n0kk«<ìD¢Ôu\ùØ*;vHåfÝ ß|§UxǵàamKÓ®ã6îòƒzå¡hŸüÁ ¾sHÜ`ÖÖ*"€ò“19¶]‡ì\”üw¶‘ߟ‘wZx\ Ö¶êØ+íÊqgwm­½ãW»}ÁÃÚ^~¥¾sHÜ`ÖÖ„_íæw®NêCº}(îl=¾?#1BÖkÁÃÚVåa¥]y(îl]®­µЇ¢=|²áa¥¾sHÜ`ÖÖèCÑñóZ}È×’?òób¦áa)RËÞ;ÚÚÇ~ÐÞù#ï0'ŽÖ*KA}X,«ïhoþAýÎ!yƒxx´¶ó°Ô‡l?Îìnõ!¿eDòGÞÙxáÐþã;­><®š€íÊC‡FàÑÚA3P¶‡O6Ùð0€m(o0X‡閈Їì€mõ!_Ú‡û3ÓêÃãZð0¡}xЮüIh­µ©e{ødÃÃö¡¼Á”7˜‡ìÃôAìCNFú° 5hÝAûï}X,ûðhKÓ®ã6î }xP¯<,–}x´§©ï*`­UÚ‡²1âapÒ>äkÉy‡G¾?#ï´úð¸nyx´µý ½óGÞáq­µwüj·ßòðhoþAýÎ!yƒxx´Ö üj7¿ó0Hû¯¥>”w¶´ùN«kÁÀöáA»ò0 }x´Öb¤>”íá“ ؇òó0€}xn‰}À”/0(g`Hh†(íÃ`úƒrå Ê%Ú‡!¢}L¯`PnÁ€~Á€ŽÁÀ> íÀ¾ÁÎÁ ¼ƒA¹ƒòpÓC”‹0(aPN ¼„A¹ ƒé' ÊQÐSÐUÐW”³0 ·0€»0(÷ }ä\†Áôá4”´ë¸Í; ïÊqLÏah\‡H}ç:zƒrôFðFå?ŒÊ…ÿp¿ÓêÃhú£òFå?ŒÊ…ÿp¿3»ý–‡Qù#ú#ú#úcã?Äæw‚ÿ0*ÿaTþèü‡ü‡ÑôFå?ŒÊ•ÿ0*ÿaTþÃhú£òFôFôFôFå?Œè?Œà?ŒÊ[hÝAû0‚ÿ0šþèü‡Qy ­;hFå?Œ¦ÿ0*ÿaDÿaDÿaDÿaTþÈþÃþèü‡Qù£òFðFÓ•ÿ0*ÿaTþèü‡Qù£é?ŒÊÑÑÑ•ÿ0¢ÿ0‚ÿ0*o¡}äü‡ÑôFá?”´kÍ; ïÊMÿalü‡H}çú#ú£òFô¦CÅóxncÅí[ÜWG‹oo ¯<¬×2^¬Æ;í#bÜÞ¹Å~uÌx§®Û—Qc6ީ׸q{c ƒ}xÖÍï<¬>¶[°œßáYDÿ¬;hrAà­+÷™¨×‚‡Â(i×qwÐ><¨×¹íá“?Ôï±uyƒyˆþÃtÑX'c‚éG¤~ÏL€ËѸ>„œxöN.k3ÑoŒÉ6aß^×–.ÃĬlâ¡•8^ׯ.¨Æk"…•^×Ö.C‹àjbh•^×Ö.ƒnúi¢K•^×Ö.ÃQiâ.;5¼>Z» Ô`¸ ‰HTêx][» a #½ñÕWjxí`±Ÿ;÷ÑÅÜx±+5¼°ÞÏÝÞè|mü»•^'XïçatK6žÏJ ¯3¬÷sW):ìŸàN ¯Ö.ˆèÊj¼e•:^;Xïçî5tò4~¤J ¯¬÷sǺ?K¥†× Öû¹Kï¡RÃkTîçÎ <27§òºÁu@ý~~ŒÇÃds^­ÔñõûùYÍI®RÃkÔïçG?<€4gœJ ¯Q¿ŸŠÐ4o¬ÿJ ¯Q¿ŸÐhmìâ^GÔïç†4šsÅøŸÊbÄÖÆò-U*àu–¢JËST)t×Ù}*…r,¿Oç›äÄ©ìÃѤ8š5’>¦÷FÈtÓHª•NrMÒé*#)5:™i4©F§vŒ¤ŸèÄŸÑ1’ª¡“dF“5tÊÀHZƒN(MlÐáõ‘|1š CÑ#ár¨00×aۑвêFuxn$„¨ƒ·£ADÊ ·é@çhÀM‡}FBS:(8œÒ!’‘0Ž !´+|Ä]¯%£{í6qmë Â¨cV»G\˜Úy<ê€Ón W•vŽ•m¨¢‚ërUS2Vî ’ñ¯ËT-ÆX™€ÎYI«We £Yõ:½{$]çþf ëTè‘lm'?ši¬S^G²ru>ôhV®NÉ`չã¬:•r$ÛSçÙŽf{ê´Ã‘ÌH“:š©SôF²uþæh¡Ngɏӹޣw:õk$;MçŽfV韑,$ÿ5š…¤ÓaF2vt®ÔhÆŽNÉnÑyE£Ù-:Íb$DçàŒf1èpúHÄ_çZŒFüuèy$:®óF#»:Ä8ÕñçÑž%D»tœ‘Û“U£?¨ªÑûµÈ{êÕLbUjÓF]‘Í’eUa¯Êë8›6ªbÑ, ïú•xXüØ4sX'&Ý’¡:­_®¦ªÛ–ê:7 — 5\ý¢.UK×¶Tœ&á’¡Ò©_ú¤*ÎÚ–ª,™„K†z ~ªËj[ªVI¸d¨šé—Ѩꥦ¥ÃÞ1 — µ%ýbUãÓ¶ä@Ž$’¡£_’¡*aÚ–H“¤S2Ô)ô T½HÛRy’tJ†lþ~z¿ªªh[Ê O’NÉóÞO‚WµmKäIÒ)2Ãû©â*C¿ié°LÂ%Cþt?¡Zå±·-'I§dÈ2î§«lï¶%Ü‘¾Ø àžÔIÎU9ÑmK¸/ܘîLV•9ܶ„»SÀí)âöÔIôTùµMK÷§ˆûSÄý©“©²PÛ–pЏ?EÜŸ:Iƒ*W³m ÷§ˆûSÄý©“Z§2Û–pЏ?EÜŸ: h*ï¯m ÷§ˆûSÂý©“¦¥²ã„ò”pz$™IåqKûÿ~ùq{9Q/å·ÿmfíí=Ò½Ù'&7~Ý<Ý{ƒ$Ñ;Ýâ,_LµlŸ€E¾æ ¿’½½OžÏ.w¿ãÿe¼ü^ô%&=^ *·uaòÍvq{ͽɹæ `ús‹š°ñU~QcV@ñŽ Â_þÒC‘oÿs3 XÒÝ>ºÀo 5…,Ò¶4#;yY.¿%<Í~ò¶Ü˜øK¹NÁ¿–RG’ê’½ÆW…ÓÂT )ó 5çŠ|‘=®´‡,z0¿Ã»¤Aò~%MnY/zGËzôkK èŸðÕ\~Ö”àÃiZ J(²ýßù»EÎfè6ÝðÅÇÞ˜ÉM¼Š”Æyû(AwÎñ–¾ô¹º}Õ†~i+/õ5÷gÒù²}ÛÙ\à?×]Ü>‰ —åg[1°q™Ãö†üAÿ2ÞêHŒ“‚•%_~³”ñ™ß}Q ãUŒÏô÷•ùÝj‹~æ•ú\K"ø®aΙ& NèØ+Mð+Mp[ÈÖD²5€®4ÀmM [u{·k"Ùš@¶&­‰¤4Q÷÷»&²ÚÑD£¬ÖD)ÄþX¹ú=dMdÌ¡¥ˆâ&•"â=Ü\ß'2A{ÿ”ɶVÏà[b79£Ãzk$\ÉÀ¯ä ගȖ3Ùr +9¸-g²å¬Û»]ÎdË€l9-gRrÖýý.gC;rðŽœõFPå¬×Ã]Îs.g½‰¬rf­ïã÷7“ѹ·Æ‡Í³‰ü„Âj-ŽW¶éùS9ËÓÀç§ÓZ¯tw«½¿ú´(KJšºýnùàøCh®¿OÃVÃZtäçƒ'Y dph f: !òö- S“‚¿Upu~#•b™\V@ó]·ülO³‹à„ßÁž£núk|%¶ºÙ¯P£ú¤)éwå²û‚_­‹Èwá_[¿ë#¤bê#™úA¨ú¿ßôb.ô‘9ã'«Ù9–ÖE=c|¥Û/Û·B)? HM” Ö’›¼×”¾·vêýCjƒ;5Â/vj„›;5‚ÌAæN ‹áæN s§î÷î¾S#ÈÜ©dKFZ®-b)Éèþ~— ‹¡Éø›³TÓXuq9^§­?TOjrNšïONÒ mFÿ>›ò#¶+¯$à¶DÈ–Ùò#¶+Âm‰-ÝÞí ["dK€l‰’ˆîïw‰°Ú‘€ñ½úJƒîàæ?þ¢Y¼WÄ-RiàáÛEtjKš?_¾œùœV²Œž˜’âòë"üJRÜ€_A¶¤¸¿.‚®$Å øudKŠðë"È–7à×E-)®ï×íÿ~—÷_á{ {¶‡oà™ŒßïšËÉ2øVŸ8¼$ô¹ÉßçrÆJ>sàúÍ…Ì^ÖSÓß/ü8…1ü»yÙ>)ŠÈ÷'ŸÛ\×í;æ¡—!ø[ˆ ú@5s&€?é¬tÛ¾0?-ÌñR|:£;x5Fyò ™°‰ŒuOxì*ÀDFø…šC¸©ædª9™jAjᦚC©æú½»«9™jA¦šC©æ„j®ÿûMÍ™ =WsS¿dó¡¿ãçí[ø¸µã{â’îûùŽ_6·‡¢líø¬£°~% Ë€_A¶(,~]]‰Â2à×E- Ë€_A¶(,~]Ù¢°ôýºýß<ä×Eø£¢wD—¢`Qþ ?íåŒ!Ü(Ëæ.iòKéÏ‚cïZî3Ùå0…|±Ä{Õs®w|þ²nö‹B¾¨3|Nl¡ê¿4ÕD Ú–³|¢ìúDlúDdúDdúDtîEäÿÍ'ŠTlY-ËR²Üýý.Ë€¹’ekÆÆh|Lýð9˜sÙº=äMˆz˜ï1!#,zn Aó”g¯/ Çj™bÒ¼Yð¿œþØ'¨.ë…(½´Z9°O‰V+­X’C\˜÷«=Kò£½´®«fÛM±-ø½ÂàóE÷H•¤gݶ.ü`(}µáB)²Õ†¥ ¨£6üÿG(©ØjÄR¤Ô†¿¥ æJmX3n«ÞªÚèõ°ª Ùj@µáãʼn™Õ†óºwÒÿIØ—b3Ðò?¬Ûǵûl¡½zÍzRlá› !üÊ´ŸA²Mûy „ +Ó~!È6íç@‚lÓ~ùy „ %×óu ÈdhG®g#dËuoU®{=¬rÝ›Ÿ*×VB·-×€<³‹IÖ¤ôò䈑Êm¿™"Qn}(…ð ‘D¸)’2EA¦Hºõ¡HÂM‘D)’ýÞÝEA¦H"ÈI™"‰ Éþï7‘4z.’s²@9aa«T5BKråÓ€ mkˆ|©OËzÐ7›Ò:á“åÆå5f ›•̳¼¤ú²ÔbáJõÞmäe âc î±7RÀàF ÜHƒ{¬€Á0¸‘7RÀàF ÜHƒ)`p n €Á=VÀà¬†Ž bö¿ÎôêÑ„U©¿­riJ[™ŠÁŠSi[hÔ­™ÒFÆ CÚŒHØ­ÜÌA–ÿ—ŸÊP-y=ê·2 Hà£AÁÀË´À¼‚ËÏÆR"AƒÞ뺚òìtë²`¹-<é)˜ ËbKLÐÁÛ§|Å€Óà—{¬bÂ=V1áF*&ÜHÅ„©˜pUL¸‘Š 7R1áF*&ÜHÅ„©˜p#î¢b TL¸Ç*&œU1!¥z;°UÐßâ¹Àå‹qò¹`5¥wx.ˆüŽ`ÄÕ¾‘H"ôÞ×úi®ÕóɃV®Zšk—0sÕY¸Çê,ÜH…©³p#uî±: 7RgáFê,ÜH…©³p#un¤ÎÂ]ÔY¸: ÷X…³ê,N¤ ¶tö«1îÒ‰KÒ”NgäléÄù><©–åCv‰³©KŸ@"q3zHÌóÙŒ@Ê– —ðÈÙÐ\ÂõÉ0¦ü–p}®(á‘c Má-áúPÑíÙ]tcJn¾•Ø[é‡ÞÊuä­<x+FDÇ–Ù^•Ì.²¥›»I,®@K`s.¯V1Ñ…¸Z´Mi5ëxZú¼ªžþƒa>)B/OãÞV…Ϲ(úB”»µ>wQŒ)ÊÝ¢»([õ0ç¢ hS”s'沋r·gwQŒ)Ê#µE#¥E•E…EÕYeE¶(wK„î¢Ü­º‹2®@K”s.Ê8ÅU”Œ¾½˜TÓoë™ôÙi©Òc•J*Ô)”)T)=V¤4R£4R¢4R¡4R 4RŸ4RžtQ4PœôXm’UšdK MéJËõÁW %]iŠeÄo³ 6‘{þñÉ»'ÿõ„¡?Ðß\¶w•ȯöóöþ®®¹% ûóyòùé_‰îÿ}e6º endstream endobj 212 0 obj 8818 endobj 216 0 obj <> stream xÚ­]ÝÎݸu½÷Sø"3ùéàŒø/½*<¶“â{f>'õ]&(âÍM,/XJߎֵ[ý2”—Hq‹{“Z\›gz9Ý‚O©þOʱ¼üû_^Lpéý›Ëü2¦[(éåçúß7ŸÖb®ÿó·>¸[H‹¼§e¿A\pb)·’Žâ__üÞôy»0÷ÕÆ0ßòä…%„£î‚ójÃkKpÛçza¹¹¾â”æ[í¶(´³–—rÔJí®ÍT‹å¸•w‹Õ¢´‡vÁ ›æp›7Ľ†½Ø[¬µBÕîÏ¥]p¦­âÝê¢%¸í3W|·˜(W‹µvößkÝM.š©›ýVÞ-6°‡¸°öõ~ƒ¸ðüÒî5ìÅÞb­•½·­ÚÝâÂÚÓÖNw!{µáÞb­¥½Ã­â»ED¹Z¬µ³ÿ»‡Á.š©s“Û.ì&[ˇEV›É+ë£î÷HLèÚQîív´µî¨{·œ¼²>ñÑZ b¸ÉöðÎÃ|GíwûÈ Õ€Gk"ˆA'è'ÚÖ2ØG\Ùlq¿Gb\7ô޲°ak«õ½ÕÝì#®l–h­õ˜ÃfѾ°ak¯u¿Õ¾[H\XmØZë»?•ˆXçÖèÇa-Ëà¦_‘þíêS÷ï( ¶¶¸îÖoõŠôò£öfCÑÞùY©}·¸°Ú°µÖ3?ÙØjÃTDøsõN°¸²õü~¼Ò‡À£,lØÚj}ou7ûˆ+[¿[ký•ìõö… [{­û­öÝBâÂjÃÖZCt ÑØjÃ’e<¬eˆ‡âÊöÄ÷{$FÄÃV6lm5¶º› Å•í‘[k=â¡hïìlØjß-$.¬6l­uˆ‡¢±Õ†‹\ê­e°Ï‚‹½ý‰ñpÑÖ{G[­ï ®øä•ÍKÂx¸$Œ‡‹¶ê;ÚkÝ_`Ý'/¬6\xû’0.°öóN.þÖ²´¼²Úb¿§ÇÈàQîmx´µ÷ý¨{·¼²ZâhíÀà2P¶‡w6—…Gk¦_΢}aÀKãöÝB‡Gk q,÷J`}è“\®e°OÂõá~Äôñð( &\u7û$\­õe{xggÃëCyaµa‚õáQu_‰ˆ‡¾ÈõáZû\î÷HL²°aÁõáQw³OÁõáÑZ‘ñP¶‡wv6,°>”VXU÷•Èx8ËõáZû̸>Üïé1r}x”… çãá¼ }f\­\ÊöðÎΆ3¬å…Õ†3¬ªJ`}&¹> ®å•Õû==F®roã­½ïGÝ»}ä•ÕGk¦@<”íᇠÚï’ª Ö¢@<”­6ôr}¸–Á>ׇû=ÓÇã,lèq}xÔÝìãq}x´Öcd<”íá =¬å…Õ†Ö‡GÕ}%" Qúéï!ÊõaPùÀ AYwë·zEú{ˆ¸> *+:Zkß-„Ä`ˆ°> ׇ¹Áä`ȸ> DÁ>_‘ëà2„!ãú0d\" ƒ` Ÿ¯ô •' ׇ™Â€Ta@®0td!6¿ÛèÂ@|a Â0̸> @•3 Db цaÆõa˜q}Tæ0u; HdÃŒëÀüaþ0[¨_îøÃ¨ò‡Qð‡²îÆ¡«W`€øÃ¨ò‡±ã±öãGþ0"‰?ŒÈFà#ñ‡‘øÃ(øÃýJ£ÊFâ#ñ‡‘øÃ(øÃýŠózû†ÄFä#ò‡ùÃØñ‡ØünCàcÀõa$þ0?Œ*®cÀõa$þ0‰?Œ*®#ò‡ùÈüa$þ0"?ŒÄFâcÂõaþ0ªüa$þ0‰?Œ ׇ1áú0ªüa$þ0"‘?ŒÈÆ„ëÈüaþ0‰?ŒÄFà£ÊFâ#ñ‡‘øÃHüa$þ0ªüa$þ0"‘?ŒÈFâ#ò‡øÃHüa$þ0?Œ*‰?ŒÄFâ#ñ‡‘øÃ¨ò‡‘øÃˆüaDþ0"‰?ŒÈ&à±…úéï øÃ¤ò‡Éár"¶P¿"ý=˜Tþ09ÜHNÈ&äò‡‰øÃ„üaþ0˜ˆ?Lw”ð‡Iåñ‡‰øÃDüa ¸¯œn,'•?LÄ&äò‡ ùÃp{9!˜€?LÄ&âñ‡ øÃ¤ò‡‰øÃDüa"þ0˜ˆ?L*˜ˆ?LÈ&äò‡‰øÃ„üaþ0˜ˆ?LÄ&à“Ê&âñ‡‰øÃDüa"þ0©üa"þ0!˜?LÈ&âò‡ øÃDüa"þ0˜€?L*˜ˆ?LÄ&âñ‡‰øÃ¤ò‡‰øÃ„üaBþ0!˜ˆ?LÈfà3±…Ú\fà³ÊfÁʺ›|H¹‚ëÃLüaVùÃÜñ‡Xû®>Bþ0#˜‰?ÌÈfà3ñ‡™øÃ,øÃýJ³Êfâ3ñ‡™øÃ,øÃýJ(zû†Äfä3ò‡ùÃÜñ‡Ø|ÓÅÉõa&-a&þ0˜?Ì*˜IP˜IQ˜‰?ÌÄfâ³Êf’fä3ò‡ùÃLüa&m!Š ‰?Ì,/d}! u…!ñ‡™øÃÌ"CV²ÌPטIiHRCÒ²Øùà üa&þ0˜‰?ÌÀf•?ÌÄfâ3ñ‡™øÃLüaVùÃLüaFþ0#˜‘?ÌÄfä ð‡…ô‡…øÃBüaþ°¨üa!ýa!ýa!þ°Xˆ?,*XHX?,Èä ñ‡ùÃüañ®·M+m6 ÝaqË­7Ý^–#Öð¹Öf‘VÚúMjÃVi»½oïëìµÕ»[¢V;!GØjl÷öM¸—ëÿýý/÷ÿxV¤—wÿÝå%åC}ÖÖîÈ£µ„ÑöâÚÖôUăXûP‚ïÊw(Zuã i>ôÒ{EPlÍ\¨«QóÛÉŠ÷ª°ÜZº”!£¶Ó۶ʱÜ»è¢L´S¢¶Ú°ÜZ»”®¢€²Óh¶Ú°ÜZ»u¢´°S/¶Ú°ÜZ»”;¢è®ÓõµÚ°ÜZ»¢­S¼íµaùhíR"‡B­N ÖjDzƒÁ~.C S§’jµa9Àx?—U¡¸§ÓµÚ°œ`¼Ÿ ŽPöÒ)kZmX.0ÞÏ¥8(é4'{mX>Z»© T¢Sc´Ú±<Áx?—o ˆ Ó)´Ú°ìa¼Ÿ p{½ÛÁoµa9Âx?ßòÇçno»Õ†e îç›á¸%Ûíú¶Êãûù61nVvû¡­v,c|?ß@Åm¼n§°Õ†eŒïç[‹¸ÁÕí¡s3”1¾ŸoºáÖO·»ÔjÃ2Æ÷óí(Üéö]ZmXÆø~¾QƒÛÝŽÄ^–#Æ÷ó- $Ò;®¾ÕŽeŒïçä>RÌ‹ÝjÃ2Æ÷sÚÉ׎ßmµaãû9!Œ´dÇ|¶Ú°Œñýœ*E®ãÛšÊ ãû9‰ˆTVÇ–µÚ±Œñýœ^C’§ã‘Žõ.”1¾ŸOHt K«ñ0ÞÏ)$:î¡Õ†eŒïçd~2w_å{mXÎßÏ?ã᫲û\m•cûþ}{ÿï#zÏ}á¹&,‹Ð®B°ïë_zÝ÷ãßÄ÷#6mÿ$¼Îa¦ôÚëÌ_J¯¶e²rf¥%û“òl­éŸœ„hI”äUkª$'ìY’ 9ÓšljY–ä1NÛ³¦q“%ÑŠSܬ©VœðcIJât0kZ'ÇXx8uÊšÂÉ$–dN3²¦»pÒ…%1„Sr¬©!œ `I¢àôk‹ù- œêaM9`á»EœÏiVy>‹Ä-BvN!°Ê°Y l,³TÜ*Yfá¬EÜ˲j«4•’'Ëg­2NZ,5µJYxg²,Ó*d‘šEHÇF«”Ž]ÑËý¬’)îXÄE,ë²Ê‹Xäbâ°Ê*ÅaAˆE´Âr!«l…ÅKk¬òÞ$·l䳄º•ÏÊ–Mo–X·½yóÕ²AÌ[óÖ-bÞ¨´l¦ò6¶u;•öù û¼ákÙ‚l%1lwÐÌ \Ùê°ëD‡]‡DgNÙ÷á“f,‡áÐáCÖ³pøP˹1|bõÜ>ÀÄrÆ Ÿnc=„ª°œ¥Á§˜XÏÒàC,çNð‰Ös'øË |:†õŒ>,ÀržŸ$a=Ï€ë-¹ÿ|ê‚5÷Ÿ“Ð-yò|B5Ož¶-9åœÍoÍ)çäfKþ5g¾[ó¯9Ø’«ÌYâÖ\eNšµäõrFµ5'•“#-ù›œ9kÍßäDBK®#g™Zóô8aÌ’ÓÆÙ„Öœ6N®²äqæ5ÿ‹‘,¹Rœ¥fÍ•â¤K^gtYóŠ8ÁÅ’ƒÃÙOÖüNd°äZp–‹5ׂEÿ–¼Î±æ%°@Þ¢áçì «†ŸÅä½;gXµÚ,¶èšYQnÕ5³ÀÖ¢fõµUÌbT‹^–•ÊV½, 7-ÚRVõZµ¥¤€43YÿjQf¶’˜¶;hfP®´/yBîg:!÷^íÑù°xo×FZK‘'¨ŽNTÅ3k»6ÚXÐê\ 2:>uzíš9¾éÔz—'qŽæ¤Qû–ÚûW+^ œW9>À’Î í[jëµâ¥À©Žãcét;¥¶"P+^ œ}8> ‘Πì[jkµâ¥À ã#餯¾¥‹N#ëZ:¾ÕŠ—gE¢3»ú–<ø“¬g)p¢Òøˆ%:Ùªo g¤€‡¸œ“ÑùO}K8/œ˜ÎLƒãz蔤¾%œNO§§Á¡6t–P?ãüq~Š8? Ž~¡wú–p~Š8?EœŸ¤Ð¹4}K8?EœŸ"ÎOƒcDèô±Š8?EœŸ‡mÐ'}K8?EœŸ"ÎOƒ#)è$¾%œŸ"ÎO ç§ÁÁ t^F×RÂù)áü”p~o@§Jô-áü”p~J8?  ³ú–p~J8?%œŸ©òtBAßÎO ç§„óÓ ¡œòøû–p~J8?eœŸi×”íÞ/üq~Ê8?eœŸÉɔ޷„óSÆù)ãü4Há¥Ìiñ1þ”q~ÊôÍtžèJùÅ}KôÝ„óSÆùiJY¸}K8?eœŸ ÎOƒ¤IÊUíZ*8?œŸ ÎOçi‡”ÐÙ7„ÓSÁé©àôTpzâ íë™…¬PÉg½{–#=ó¨õ§ÿYÿü»QÞú/?½øöuxéÜËŸÖg®ˆú°wUmÌ·’ç—?}~ñ›OÓ4•ßþôŸ â&_Ÿn&ЫõÏwëŸwîª[û…ào¨zSš¸ÎO“Ü­. 4\¸8UsrGòúçãúçCûó~ý󳸻¤›žî~Úž{ýóFÀ—u0óCýjýz¤ŸòÍå@Èo$h¹MJë¿«ÿ~/AËmáÖ¸ÃÛç—ò\߯¾•ÈZeä·éïo! p¦Ó̆IÜç\nÓ ùÕúçk~йT劥±[Ûñ]¸?ô´=Ïúçǵ‚o_;ðŠàÃ-¨ÃÎ…õ_ofí¡ŽúL7ü(01Ü’ò~žšé%| éǨ¼?Óæ2ßýÒ÷AÔ‰N*þcŸÑ>½|Sÿÿ/{¼XzÃÄŠ|&$«ÿ†ò ŸÅ\S^èîÎÛk÷ÔWï·8 Пc€Þ7+}¤8•\)b¦{ÞÊáïê—/é¯Ïu‰û‹®P&ŤT|}CY·Ü«ö_)n¸ÉÑMÿD®ãª-ò6§Iä7TÿÑso>ýVFö:ã$~Òíõ¾–¾.c”–!ñ¾ÝÈñÕ¥ºÐôúcûz:»uÝYæ"CÙzõ±Ö&†ÿ¨›0Ö9dZ ðo$¨:€Kú½ñ¾ÎÉ‘@Ò•æÚœ[´…¨3©.‹RæÎüY‚êb:1è½t›uê˜ÇO—êP™ƒþ¨ú€þç?qMÒKk`•𨯀XÇ·ÓMº½ðr »˜ø]nƒöÓo$´®²|&蟤'ø›+=u¡~…L\Ór1TMÛrZ‚žh^uuj™÷á}›-åJ0»:@NºÌƒÎ••ù­È…[õˆ9¹‹^ϱ.¹&Gw÷Îõãs f÷Fø…{#\uo©î Õ½táÞWÝAª{Ÿnwo©î Õ½¤º7‚Ƚ/Ïî­šôܽ>po„ªî=ìéîÞ4(5÷Fй{Óoîѽ—…íü$AužŠnF‰,õ9µw»þùâäõãA1îäeºyûŽð+'¸îäÒ@º“èÊÉ®;9€t'=]sréN Ýɤ;9€ØÉÇ€»“k&89ÀGNPÝÉG=mNŽƒRur œßø…“cŪ“kfÔ|ØãêWsáA)lžj?âEMÕeböã§oA"9ñYp$~$® éA@zÐU¸$¤‰ÑÓµ  =HHÒƒ€8HŒ÷ ¡™t$> ՃĨ§-Hà Tƒ€Aßx žŸ3Ï·ÙÅ‹ç,ᣒU+“”×ö{ ªÍE6Ë;™kÈ3¿¿?o\£djË­~<\ ªê2eNã1ã§TÎÕðœV¯ç—¦G§:  !~®G'éÑ @ztÐUt¸¤G§ÑÓµè =:HNÒ£€8:÷褙t>ŠNÕ£Ó¨§-:á T£€Ñ ßx‹N_ËÀ´Æ~ÄW½c>0°ÆeâÆ¿“!'Ü–yÑ­ü®ý×3k)#Pªƒ¹\˜sY71ùaÑ¿”êë¾…ÀóôL{e\©Ñ²FhÅw•¡£%eBýI‚r@Ž@o[@z2¯iI|µ!ü"ä!\ yRC‚Ô‡ ‹‡p5ä!H yçÛC‚Ô‡ 5ä!H y¢wxyªIÏC¿?vfd°ªv«K„K56ætñœuå ÈX?vf7~M.η\¼Þ…ïØ#v*ù‘/„_9PÉ×_4Ò@ºèÊ®;€t=]s é ÝJ¾þ¢A;Ðpw ͤø6úf‰\êä‘õ‘ô »Zô·¹7ÒÕbyûÃÕ%´+üˆÒÕÒó¢|øB×”€©,zg®–ä^Ã?Ô÷Ÿ [WÒߺغºÜßzhë áƒ5#BÕ5ã°§ûšAêšAO'œq9qêW m !ü*xÃÆ‚ôà Cº žÁ°1„ =xÃÆ‚ôà CÒ'\l ]îÎÚBøÈy‚achØÓæ<Á°1„ Íy~%‘ËmVºü¦iÝè3bMw™ÖtV/™×_K V}!1è}¯N´Nõ†R?RðÆ_µï«W4ØVÉUX‡ÜóƒÔ\•›s *Ri¥·~¢p\3J\µÂߎ?~¦‡Øh„_…ŸÉÀF#H?“FÐUø™ l4‚ôð3Øhéág2°ÑÒÃÏtÁF_îágzˆFø÷ìäuíV㟸Ӛ¤9gîÍgSï|+l -Ö8…&^5ä™àÿv:[¯Ãñzáî‚pÕ]¤º ‚TwAÐ…» \u©î2|ºÝ]¤º ‚TwAê."w¹<»‹jÒswAø¹» òÂ]>vDëC?ÇGª¿úׇ>€ô¡ }èèjè\úÒ‡þèéÚÐ>ô¤}éC@<ôÇ€ûÐ×L:ú }@^ }€ÿÀ'["?|Å—Û””wÁ ÜœnË<ß¿+u1WæñHr¥Ü¢ózmýN颲~å£Ñ@e#H÷Ñh ²tå£Ñ@e#H÷Ñh ²¤ûh4PÙÒ}4^PÙ€»F#•]Çß’ ®øèš ù…žùhôÛºZsÑT?ù ÞPÚSúþ!áWCßHhéCßHh] }o ¡¤}o ¡¤}o ¡£7Ðâ¡ï $´jÒÁÐ÷ùêCfú€¼ú€þØŠmèOel—§[ Ioåæ&î(ëêûpQo“I—uÕ¸ö„ï2ë.‡[ž Þ²ˆ¥¸Mb5¹ÿGN_šã­B¿æñ³žà!-³“Ķ{pkNvwmÝ•NëJCëÚk=éj¥…–À÷¼‘´ÐúÄÜú$i¡PÉL W-Œ½¢tµPÂ-,³þÄ’™šWeÀIß ›éá±<‡ðXžC°ä9KžC°ä9„Çò‚%Ï!Xò‚%Ï!Xò‚%Ï!XòÂUžC°ä9„Çò‚–çÚJàç“ÏÚu›ß±úYÓì‡Ç4ûÁ¢ÙÍ~°höÃcšý`Ñì‹f?X4ûÁ¢ÙÍ~°höÕf?X4ûá1Í~Ð4ûæ«Éê¿¢­ÅÂOõéÓ‘<Î]©à^=9ؼO2é·Á†)K®ß´‹Þ8œ8°~"ó€{s" ‹› %€ª5ËÙê9 ×%› tÏ1]ŸÏkšÄî[PêB«P=’ ÖÅ‘¯Ë7h¾M‘›†R¸Ù¯0ùÄ5ñ‘k^û\—vA(žYÀûfÍ—-âÕ`¯†+ñj°ˆWÃcâUõgÜJM!Žû°)½²'Ъ’+*&y²ÔèùeþÌ:ó´æËp·ß¶¾¿#N¢Ón±ðcéó)¨0ÿAoÊÈD]½)§‰ú›rq´Ÿ}SNá®õ7åFœßþ¦Ü€ó]C)„)HXÎüXÿÊ•ÕÏÂà.:™c]u(ïa«³(껿èd™ŸÝØ)œå›‘^¸.B&ÏïNU‰4ª¼EÉéSrzUÉ©*?R£î£ÊkÂauTù‘àvUþJÉYGb´Q…˜ÓQ5îä}TÑ{8UãNÞG‚`Te SË\.žs©+-åÝê£î1a«LØê-ÂVo¶z‹°Õ?&lõa«·[½EØê-ÂVo¶z‹°Õ_ [½EØê¶zMë©Ç“QZIÔ3ƨ£$ü âÌoí 3uÓÂϨîxMcª-ç8\Î#X]Î#H]Î#H]Î#è|9È/[Î{‹®Ø[tÅþJWì-ºbÿ˜®X}çºûÃw÷KŸœG¤î~úùY¸yº” ÏøNnŸœfá2ݨÏ~š”TõMÂ|ê#Ö}d,[¾û€tÐÀGù…>b‘{‹|Ø_ɇ½E>ì“«ï\÷‘±0øî#šZ]÷‘‘Ê»ùª¼->÷|w²M¶¡Àé0ˆRüEß×à ¢{˜WÈBÕüBRŸz€uóCbúîaÒ= @äz˜7ÄÞb±‡yAìýC±úÎuó“á£ÒOÖJ?>*ô³’>ê÷úÌ-ÿ‰Ò›.û°D©õ÷¯ƒ2Ìž†¾?Wß_¸ùË Ò¯6ܖ꼚ÔYu^Mbê¼Öw,«¿;/€tçÐÀyù…Îk‘·{‹¼Ý_ÉÛ½EÞî“·«ï\wÞɾà´l ÝyGYÍy1 aà¼Óè(˜Ýy‡}Øw³;¯¦Ç¿t^¸élæ^ê̽ð»É¸·4§|1´¦:sÏܰêþn6n¹ù !«îïfÆ‚T÷Gйû#òËÜßYäúÎ"×wWr}g‘ë»Çäúê;WÝ؇ÝýÝlÝr³aCA÷G¨êþã>ÜÝŸú ¹?‚6÷Ÿǯ0íÝ6ÝõéVB¾¹‰Fw\Mx®:®–ðpê¸Öwœäpw\éŽ  ãò ×’là,Éî*ÙÀY’ ÜcÉê;×7ö]¶îºlØDÐÈqóà œæ¸Ã>쎋}P@WŽ›•-Å?žíÖÔä|ñ°~ ·¼ðÞ)n‹Ÿ·³Nè‹ô8°ýIgÆ[ñ…n|ß’lOu!î1Ù¹{Lvî,²sg‘;‹ìÜ=&;wÙ¹³ÈÎEvî,²sg‘;‹ìÜ]ÉÎEvîüC[DN“YQóöã«£=°Š£ 7L˜J…­¡ÈÂb¼Eå5½Çìý8ó §lÕá¶ðÓáFÑr 3wt¸Q4W3F6£¾˜Œ{@nz`ÈM†= 7ö€¤/&ë"¿p!`ùYgùYwõ³Îò³EPß¹î_£Ÿ›hþ5üÁƒÝ¿´<ÐýkØæî_zwâ u<®¿‹â,¿NBiõT!‹Ü¢#¿’‘[Tä‰È5 ¹úÎGÒüý•ÏÀ¿¿qí|õ…¼¿oÀ¼ã•TªËH~²·ôl }åËúˉë/áÉ- s>¼>¾ý ñúë[@Ë|’¶›¦muª.—lëÏ“m?9:hÌæYÿ@àíøz™ÿý6Ëh]úÀ¿ÁU_OÙ~å……Qß³rK0`=âØÝçǽ9ëôe Œu2ÖÉÀW'+]þ?ØjËÉà–ƒÁ¯Î· þØ©àÚ{–?›åÓ­d2ú‘¤päÈó°ãó¯ j úß©iŠn¦ÇyÂÒ¸PëÛ‘ŽQ?·Ý”[vþê{+Ô…`š }ò¹–R¿®¢å(ž¡0ŠÕ ׇ¬>(¹Ðú‹~Û^…À¦~HMËøáÂTë ˆ‘.Ò-8ªçk5,ôLòû4ù›[U{sù›†½;'¾ŸOI]¿Lן|à=Ô¦:{¤‰ª•_“+¥àÉTO“¶Ÿµ ÿæfró-dz<þI¸T_â²Ð ø†Ü=Åù¾Ý&€ø ¤)U7,™aaÿÕÅ_ü÷ús«/?׿eñëÏ,.qû=×¾0m¿®øŒë. è~ÿ__<½ü¯Zïÿ‡—» endstream endobj 217 0 obj 8340 endobj 220 0 obj <> stream xÚ¥][Ï·q¾×¯Ð…Ý4ñzO]±{lËÃÇWœû^õ4~SgMðاT±>ÖV°;–GúlV[Õ“Ëg¨R…Þ¬&Y,n—€b±TÜCk1V‘ßó~ A¬·Ê[B)¶#-Åb$¶XŒUä%=„X›¦Š­âÖb¤©XŒßcåd1ÒSþûJ-u hÕ$‹­ëzI(&ËeÏ,Âkò÷—g8æ³Þ*e=­ê*]e»ðšlƒª­ÅÔV‹Lk½ª¯|}•~Û‡W$Vm ¢4]²¶½nMHßt»\ŽÜ>¬æ²Åý ÇìM׫efCÒEßN²É>¬æ²ik1;ë€\>ÙØ¤ ±ŠlCÒÖ vÖ ¹²lC2g·†F&¯¹lq?Ó`Roû!•™ I};É&û°šË¤0$ä0}ødcC’^,Ä*² I[Ah”ež's¹ ã”Õ\¶¸Ÿi1‘¹ÀZf6$]ôí$›ìÃj.K¶Š‰à¹>|²±!I/bÙ†¤Ü!W–l¸m‘ùÃ\æã”×d[”g8¦õ‡µÜÚ°ê*ß^eûðšl‰ª­ÅpÈõá“Õ†Uúm!^‘lXµ5î¹²lC˜?Ìeîýô°sªiýa-3’.)›¾[­;“t²!Ó‡O~R¤ ±ŠlCÒÖ ¸?äʲ ƒçý0•Á>¬æúòû^Ãú!•™ I};É&û°šë»I[[³nº~fCÒGŸOÒ‹…XE¶!ik릫/6<ó‡¹ ã”Õ\o|?Óbæk™Ùt‘ I6ÙÕ\¯LÚ*æÈõá“ Iz±«È6$m„8ÀreɆ{~‹¦îëöá5Ù噳3^®åÖ†UWùö*»Ø‡×dKTm³/s}ødµa•~[ˆW$Vm„Ø—¹²lÃ}cþ0—Á>;®ÜÊ3ÓúÃZf6$]ôíû†öÙqýVµµî¹>|²±á¾…XE¶!ikÜreÙ†Ž¯SrìãpRžá˜ÖÖ2³¡ÃuJ•Möq¸N©ÚZ çe®Ÿllè`Â+² ¬SªèVó‡û=É$†íÃj.[ˆyøN3Ó[ •™ I}{XÐ>¬æ²„˜‡ïlŽ™~fCÒGŸOÒ‹…XE¶!ÎÂ÷fŠ aʲ cäþ0âü™×\¶ˆÇ{ŒÜR™ÙtÑ·Gœ?óšË1âxý!Ó‡O66Œ0ƒæÙ†¤ý!S–lx,|~˜ËÜ>¼&Û¢<Ã1­?¬åÖ†UWùö*»Ø‡×dKTm-†ûC®Ÿ¬6¬Òo ñŠdê­ApÈ•eîžõÃcÐyÍe‹û™ãY?¬efCÒEßN²É>¬æ²i«ýëÃ'’ôb!V‘mHÚá¡reÙ†Þ3˜ËÜòšËÞ£½cþ°–™ I}»÷àyÍe ïÑÎ$½ÊqŠ?¬úèó=Ì yE¶!i#„È•eÞ“L²a*sÖkÀÎ43­R$/W]R6}·ZvfsüÈô3’>)½XˆUdâ,üh¦ø· ™²¼ÏO2i£?•¹}x͵Á.fÝŽf¦EÊ®ôê‹¶ûI6í÷³škŸ]̺›ãsýlÏŸôѦ?I/»þ¬"oûã,ܱ)>W_l¸ãa‰<-Ç%bîhfZ¤¨'&»<2‘g&âÐDÌÛãG¦ŸÙp—'âäNpîš)~§'îžd’ ÝŠöa5—-Ä<ÜÑÌ´J‘¼\uÑ·»íÃj.Kˆy¸csüÈô3’>ú|’^,Ä*² qîš)~ÂxÙÝ“L²aÀ}~^sÙBÌÃÍL«é«.úö€ûü¼æ²„˜‡;6ÇL?³!é£Ï°ÓÏ+² qîš)~Âýaäûع ö‰¸íÄ<ÜE¾]Ë̆÷±«l²OÄ}l'æá.â>6ׇO66Œ°Í+² qî"îcseɆþždú%‚}xM¶…ópO3Ó"%(þ°ê*ß^eûðšl /æážÍñ#ÓßÚ°ê+Ÿ_¥ßâɆgá¾™â!ûC¿yæsìÃj.[l¸O›kZXË̆¤‹¾}Ãù3¯¹,±á>m•ÞÊ‘þ°ê£Ïß`Í+² 7Ø¥­¢[!ÌúƒÏsìsàü°<Ã1­?¬efÃÃ?¬²É>Ϋ¶Ãý!ׇO66<`~È+² ˜VÑ­æ½çóÃ\ûxœ–gZ ŸÖ2³¡Çùa•Möñ8?¬Ú*fÈõá“ =ÌyE¶¡‡ùa]…ÀüÐG>?Lïˆö‰8?,Ï´>?¬efÈóÃ*›ìq~XµU ι>|²±a„ù!¯È6Œ0?¬¢«˜†…Ïs™Û‡×d[”g8¦õ‡µÜÚ°ê*ß^eûðšl‰ª­ÅpÈõá“Õ†Uúm!^‘lXµ5î¹²lÃÏö¶¶¡Òeƒ ç…a½â¸Èt¥È,·á¬ð³T²•®ïÞp6HBéñV >רë’[,A…l§ æ€$‘žmU¬Oóÿþö—û_>ÇÂwÜ}üs([p¾Æ…ÕBÖæh7·3£•bÖµü½±x&VcÐJÌg#Ö0Žª Õ*¢°Lš†¡]`ÔÄ0‘p,¯Ð‘ûAOzÓD÷4,“¶a8¥4q/$ ˸‰ß”Áp&"¤HÃrÕ6 !Á@†&V‚¤c™´ ƒ+ðˆ¿‰" iXv0åí‡àáws¾NÒ°`2Ø?Çcáæä¹HÃò†Ûhý£j<0mÎdI:–qƒ©ˆ‹G‰Íi%IÃ2n½ô7ñ­9Ç#iXÆM‰þÁ?5'\$ ˸\ï‰áÁLsöS¤ayÇ…lÿ°,šS’Že\âõQp3¿9/ iX&mÃÜænvÒI–=„·ô·Þq¸Ùc&‚rÕ6ܔƭÑf÷•¤c™´ ·kqÓ°Ù—$iX&mÃLÜNkvìH–IÛp‹7šš½,’†å°ýÍ/Ü‚ivyŠ4,WmÃm!Üœhö?H:–IÛp×íÍÎIÃòÇuý­\Ð6kf’†åú{‘K½f5IÒ°ì¡¿÷—Ÿ¸jÖYE–«¶áÂ Ö Í„„cyXîß««o ·$,omW×gù;ïü­|6woV¿²ªžŸäóaDªÆ8‹D¤êÌå‘ȼ†™Ü ‘å2›|!SfÒd‚Èl¢‚ —Ÿ é—ɳAý2´|&ü]&ÌÀË0ì™Pq¤?,.C–gªe@ûlP° M Ÿ•˳´2Œs&ÔTùΛÊÇ™°L;˜)ÃgBeðèl£ ¥› ÷“–³2ìl&4N%ÎÇÉ­™02À7H&ÙfB®d°ÛlЕ ý™ O’a³J2Lf&”GQÍ¢Èpˆ™ ,3´!CfÂd`Él€ƒÜ—c_ #î-j5ÑêC|¸UƾfFÜîÓhªëUðàîû2qN«‰Â®TÁg€Jì+KÄM1­&ZÛ¨‚Ï÷xØ{ˆûTZM´ªQŸn»°¯¿·Ž4šêzF|¸¾$BÜÍÑj¢•Œ*ø ps‚}•‚¸Á¢ÕäÀGp9g€ûì Ä=­&Z½¨‚ÏYøvZ¾¸ ¡ÕDëUð WÝN^w4šêŠE|Èè¶S¼Ef}«‰Ö*ªà3@Þ³-òÏ[M´JQŸ²ƒíta‘¥Ýj¢Ð/Uð ‡ÖNª¹Ì-©ÓJH|È4µSOEÆo«iÇùÃŽ×â%(F‚¦È‹m5ÑêG|ÈZ´ÓEöh«‰Ö=ªà3@nŸì'r,[M8—Ë9dÀÙ)q"±ÑT×:ªà3@ž˜8&òõZM´ÊQŸ²©ìô*‘ÕÖj:`éjæ3PÄ;|O{ÿ¿ùÏLªýëû'ß?Ï'OßçwNˆô²w|ÜáÁǧï?=ùÇ_–e ¿}ÿ_r¤—‹ó,ÿù!ÿyÝ¢Ót;n§@¿l1kµn‘"Y¶ƒáÕ»Šó ·mɘò3|þó1ÿyGÞæ?dO§Ùôvlâé×{ç?/ 7uœ‰u/žyÉŠ¿Oé¿æ{·ãx$.—ß‹C!,ŠIÈežöºåžÑ¿}~#JÁ¿#'YÂ_|ÆlÄ&ÿã6ù)¿ü–»õíáœ|ÍԶϹwO«EqíoéAŹæ^»éoýýó¥ÓqÓ”3Ä`x¼cK£% êðŽ4QÛv'Àä’W<¤êï8hK’¤Úo9(ñ”“’¤ÃÌ£&‡@¾3¢ô@ÔûAÊ¿ Cl™ÊÄÇQr}Q‘$úªùßSC§)bžQ§~Çû➇Ó[œpFxiûr¢xÓ) ð Ÿ‹¬ ´7—´CÚãeý ÞÕ—äßvþBN±üòyŠ…¯‘ÿü“„§I[¥Š|lì÷©G¢ïfÌýŸÖk´ ÒÌû¥ñˆ™zäÊp{ò~ç&pƒâã8$è÷²3º¼ –j¿pp$î<ö ¤üéÀ1¤^t}ïäT"9ÑÓÉ×û#ùÇdK|£&ovº(µ‹é‹_¤ñÞÚÜ“»ÝV)î—_øÜ%ÍÛÃ:ø†=‹’ ½º4a—gÖS/œ–¸! _8lé¿ÊþŽƒŽÇvå`qÐo(-¨ö(¿ÊÉ–É;«Ú›A÷²™5¿ˆ˜_Dxß/"²ï©úE³OÜ~±ß%¾A¿è”ôB¬ÙÈs…´Ü#Ï Ãs²ë¹§{.ž _é¹@Šá¹4}†ç¸î¹dx.@êž @†çÂ6Ó=—ù Åsè‹<×ø…‹ç²_¸x.@éž @ºçá¹Ý?ÊfV=`Fž à†ç¤á¹©{.«OÏÕí¿AÏuœ œƒòF“üŒ×™VÖá”M÷ƒ’\¼­“e’è†S<Ž]G 8ÝQÈp”€üJG R G©é3%ÀuG ÃQRw”2%¶™î(Ío(Ž@_ä(Ç/\¥ýÂÅQJw”Ò%€ G9èþQ6³ê(3r”7% G HÝQZ}¢8Ên—ЧxÚ¾[$«s©+8¥+Èo÷ÛãpÒ¨ú¼qßæöhî!XÝ7Bºo„ ußAý}#D~ݾJQ÷¤î!÷ìÿ~ÀŒÖâúàä ÚfÝÑäO¥‹¼Â“¬Õ{Û,kòÐá”ÍôšÔ+˜lâ…‹÷Üf‚É¥{Ïm"˜ A†÷܆Ád¢“iÞsû¢`2„Þs³BµŠ÷´Þ¼§ÕÉ{Èðž€yOÔ>ã=7%ޝå¯Üò0°Rpœ’*†ëçœH6ÛB|,É ÏøgîTR« È3™eu&—} àsŽ ˜à%¼ì™êGî’Vùƒ’ã>¤à«¯ý„#//©ñ»™MGÜÆ[ê“"{d„8žšXTB tMrú–ƒ|²²À(‰¢.Ñö"‘µõ8†|É®´ÝŸxKu Äi0SqÛÆ´ݤA §&Oâ¤Aø‹ŸÉ°§|ñïpéšúH”pÎCkx,g´ßnß2AÌ7ÊW¾Q2\õµ‡ÈNºàž&,§—–yÅAû•/Š éöœ µv“íÞ%V9– ©+ÿ3…4N·™‹9:L~7F¾a#‚,gE^ ±¼ Œ·wu.Q yŸOüãN)îƒL„ÝÝãˆù³Ç]ò÷z-Gä‘ÞÎTf æÈ¾g j‹ôg ¢û Rº&n¦©¯M'7hê¼é´ùqS ÞYÓ€qÊHüÌ;JÆàñ8$º›0˜&þ›³Ý‘SÞ”í3!È '@vÉ p9D''©äƒœ9"'€ëä œ¤“€trNN‘Àur²Þ®`TrB{õÉ #r¸NN2ÈÉj2"'Ór…œ¤“ÓøÅ 9R''M‘ӱ˽ œ©“€ r¤NN2È 9Y#»“Ö"9a÷ë“Ó°©‰œ¬¦&r4uŸœ´7î““ÕÕWk”F€…jú*¥o¹ùG‡ínˆÜÒòn¸ ˆ ƒÜÙ%7Àiäܤ’` räˆÜ®“€trNnÒÉ @:¹hDn×ÉÍz»Bn€QÉ íÕ'7@ŽÈ à:¹È 7«ÉˆÜLËrNnã+äHÜ4En©;„¹• urAn€ÔÉ @¹R#7kdrÓZÄ 7ì~}r65‘›ÕÔDnƒ¦î“›öÆ}rî.÷¢óþ¼â)yùó´[`½|ë6”|«Ò”*  ¨Ï‚ˆì± âDˆÊ‚ÒX1}D䀮² ‚TDÊ‚RYA* "hÀ‚WYÐ|»›£± °W—9`A„«,ˆ > šMVXжÜÍ‚R®)L}É/ÞîK žRœd—ý\Ò„{ÐëòÌžA’]Že¹ßGc?FÌÍ.jôÙE4«Œâ_×GðûDÏʉÐù\v²g­É™9¥y€ÚžÖ$ÎOô¬Q¶¸A³¬ù Î _±·Ý—(j N±*kè8?k WQ2ø]þœÆÑù@*Æà@Žøà:Hçéü ?¤ó€Füp?¬·+ü•?Ð^}þäˆ?®ó€ þ°šŒøÃ´\áüaõ%âlˆ>˜ŸPø@ Æ~Œ˜ÂZüÍÚçaÏ"þ˜ëYÄVÏ"þö,â«Yˆ?°g øÃÄ.Œ‹dp »\8 ¢s€T.ŒÁ€qÀu.ÎÒ¹@:Hç¸à:XoW¸0* ½ú\È\ç\`5qi¹Â2¸ÀêKÄØ}.0?¡p€ .Œý81… ´&0¸›µÏÞE\0׳ˆ ¬žE\0ìYÄV³X=+g¯h-ò þCTú(ÿDŸ”@ªûƒ´]È¿g· Þ>¸ôbô3ß ÛRGözÏ«·ñÿØMµÙ÷8ŽÏCÁi€ìrà4NˆÎiR9 0§rÄi×9 @:§Hç4éœ Ó4â4€ëœf½]á4À¨œ†öês GœpÓdpšÕdÄi¦å §Èà4«/§aCô9Íü„Âi28m0öã`ÄNÓšÀà4lÖ>§ {qÚ\Ï"N³zqÚ°g§YÍBœfõ,â4k¼§iNO½§#G•ÏRdp »\8+¢s€T®ŒÁ€qÀu®ÎÒ¹@:WHç ¸à:WXoW¸0*W ½ú\ÈW\ç \a5q…i¹Â2¸ÂêKÄØ}®0?¡p€ ®Œý81…+´&0¸›µÏÞE\1׳ˆ+¬žE\1ìYÄV³W`Ï’7¸<žvÛ#ä;¢[õVäyŘã|M]ÚTó,ëÄ) € æd—y§1@tæÊ<€1˜#æ¸Î<Ò™@:óHgéÌ ó\gëí óFe´WŸy9b€ëÌ ƒy¬&#æ1-W˜@óX}‰˜¢Ï<æ'æÁ<ƒ±#¦0Öó`³ö™gسˆyæz1Õ³ˆy†=‹˜ÇjbìY×o$òß@|Ù9™‰iÄ*®B=™Ùâ6>™APŸÙãÄ)ü€•¤ñbúü€È? \å©ü€ •¤ò‚T~@Ѐ®òƒùv7? Fãa¯.? rÀWùA}~0›¬ðƒm¹›Ôç³/~ Ñåûn~@PŸFc?FÌÍjôùA4k—Æ=«ðÃdÏ*ü`ö¬ÂãžUøÁl–¢giüÀ ùB Ù%=æ€ÆÕv"9†8ÿ„·:àåi$䮿y|ùïèM?(žóó½øÌÏèÃ.?%ß;“¿€ wbiDì›.í ý¿)bO>Èg^ÊK Žìývù¦±]ç&ˆ¤?Ü=DÁÑÇ8{‰‡ÀíÊï!'–ÍÈ·’a¼®•2_qN5Èï}&yÓ§p*‡øìsdÊ*@|®;¸ŽÎç‚Ð4ôðúMœrÓOòšË&‘¥c_ÎǾI+kw"…deÙÂ/¤öÜy©ˆ6ÍNH:¯k̦ØãºÃAWÞÅ3NÄi‚˜Ý% ÿŒ·$í‹Ôù9ø8fzÓòϲÉqÁoRJ^iñòÅ~ÏAù§ÝýÀbgêæJ¿ä;ÓÜuqÄÛû¼ €~æôì»—ŸÇÌ~$Žß©®&óÞTF/"â~fKÌ(ŽSò™¶+K ‘o”;ж䑤bî=\¸~9A ùMýbmjsŒØÕ®hLm%€ýwrJgàJWù€WUŠ÷òxU•Wâg¼¥jÓ¼49µû¾S~õ=M'b´‡Lžõ¸Eê|-§[i"¼÷ðN·*#þZò ٨ʫ3ƒçêÜ¯Ò ¼Vે‘ È w@vÉp¹Ò w@êä ƒÜ©“;€tr×têäHÜd; rÇí“; r¤NîØ¼*¹[MAä ƒÜ©“;€trö¦Bî8.trÇOPÉÝ´X!wÓb…ܤ“;€trG;¨ä Ü7y—"ur_”_ ÒÉ}Q~WG'wDªä¾Œ~¦ˆÈ}þŽÙP…ܵ®h;:Ëî=•æ@(÷TšoXî©4{n¹§RõYê=•ˆ¬÷T~ƒ¿z=Çëe9t? ¨žÿÏâXVaWq,ëOéi<ÞAâfx‰iܹ ™£¾0þ'~´A}ÆGdñ×g|Dö‘*ã#¨ÏøˆTA*ã«:UÆG¤Êøê3>"ûŒ/>¶Ëøˆì3>"UÆÍ«1¾Ù…ñÔg|DªŒ •ñǽéf|1.TÆŸ 1¾m±›ñm‹ÝŒ •ñ¤2¾°ƒÆøR?_/1wA"UÆGPŸñÙg|ÔA}ÆG¤ÂøfCÝŒ¯vÅ>ã gÙe|s Æ7ß°0¾Ùs ã«>Ke|DVÆÿŽï”?Ç_¿;ר{¼Wx=õz:Û]äÌÃõ+¥u»W¼wì§0”È|ß–Áø&nÏ¿Ì=ZÍ#Èàv@v¹p·Òàv@êÜ ƒÛ©s;€tn×têÜHÛdp; nÇís; n¤ÎíØ¼*·[MAÜ ƒÛ©s;€tnö¦Âí8.tnÇOP¹Ý´XávÓb…Û¤s;€tnG;¨Ü Û?y?"unÁí€4¸‘*·Èàv@jÜn5Táv­+܎βÏíÖ@ n·Þ¸Ýê¹ÄíšÏÒ¹•ÛáÇ×òï7î‡n¡WJ ¥ÃåtPÞK,§s”‚~’ŸÓ\`·]Ðc"ÉÍVIž˜wxÖŽ ƒÀÙ%pÀHƒÀ©8€ ¤NàÒ \Ó©8 uAà€4?¶Oà€4:cóªn58€ ¤NàÒ |Ø› ã¸Ð ?A%pÓb…ÀM‹NàÒ í 8€t_ÃäY;"uAàk˜‰;¼îâø¥§Gâj…ÄšKO%!'"Ë1°RX[ç ´xöä\ÖM Ÿ—2œ³w2œqê,`}î`ŸºÏ8>H?ãä9úÇÇègŸ¢k UÖ JÚ€ésö'OÐÏ8y€~ÆÉóó3ŽÏÏ8>=· °5`úd @•«Ï8>9vŸ›©q ¨Do¯ñ´i©›¦MKÝ,}Æñ™9`TŽFh •¡Óêbî¼€*?¦OÏì³35rLŸ›¨Pó9¾¦âü¢[*ΙK*2/££ÐhÙê_…•5'= ek¼N>­['nJÖ\˜ÊÈšQ„lšç3›Ö ¹9„/ïˆu¶9rp¿4™Êå9z´LŸËØãr€õ¹€}. Êå€és9U.ŒÊåšB•˨r9`ú\À>—ãgv¹€}. Ê娤—[ P¸0}. Êå€Q¹|Ø}n.Ç1 r9¾½Æå¦¥n.7-us9`T.ŒÊåhË£r¹;'O¨r9`ú\À>—#PãrÀô¹Ü ÛÞj›Ëµž×çrt…].GG¡q¹Õ¿ —kNú—æÞre3<\¿¡>ô™‰s¼šæ©¤o‹W¿½GÙù­d¯þ(~Ðjª~e }ækmúØýÓm¹ÎÌ›.áî^!û?¼òæÉÿ<ÉðOéo8·§¿>qçñ/,é_ÿzãš*-Ïÿõɇ§ÿäþ?_ʸž endstream endobj 221 0 obj 9612 endobj 224 0 obj <> stream xÚ\]¯Þ¸q¾÷¯8É¢iïŠ_¢ô&…íõ6Fv}Žíãl ä¢@7(r 47ýaýƒêGœgF”²ò®ÉóhF’3Ï %MÓ-ø”è?iŽùáš ëñûWey‹¿¹Ù=¼PãæµÃÍ/óÃß^ùàn!è™§Â×ô=î6…ŠiRZû¯¯þS]÷²ö,Bv Ëm^ô”:m{O“®õW}xå õ”›ÒSZndÙ‘}§M´V_•‘ ã4ÝæÎ†µ]œël({ê·k$&®˜]ʽÝÛp×Õl¸Ën6”=õ–wm=&ò-BoÃ]_³á.}³ì îÚ:DÜnh²+«6teí`R{kÌî‰ÒÎÔsŸ½]ʽ-lȺ´l·Ù¥Y:ÛPèÃ+_ éÍB¢£Úµuˆ¶ 6 eÕ†$½ß˵ ö=ëÈ·kúž¼Mg“ÒÚ†¬‹ÇβÙ>¢g7kÛ{2î ¡¯ìÖ!KoÕ†¬7†PVm˜æµƒm˜rgŸÕ†¢g½ãíš3oÓÙ¤´¶°!ëb²l¶¡èYo™µí˜¹Û‹Ð/lÈú؆,½YHtT²6F̼1š^Ù0MùrbÖöLÿÝ-f÷ÔkvÖ·bv)÷voÃ]—–ÝÆm÷ܵ5îÒ› ¥>¼òžYHv wmÂm7t·¡TVmè絃mHm°èYG¾]Ó÷¤Û’;r[ØuñØY6ÛGô¬ãfm{O“®õ ²>>KoÕ†¬M´Vßl˜’\‡Ô†Ugö€©G¬Cn ².-›oÐì;³tž ¡¯|1¤7 ‰ŽjCÖÖ!` eÕ†9ÊuHm°èYG¾]Ó÷¹¹-lȺxì,›í#zÖq³¶½'à:úðÊn²ôf!ÑQmÈÚp edÃy bÖö¾êª eO½ãvÄôëpo÷6Üu5î²› eO½å][‘ëPêÃ+wîÒ7 ɲᮭCÈu(•U¿ aR{‘ö=«-¶k$&tëpo ².;ËfûˆžÕ¬­Çìs¸ý†¬‡ÏÒ›…DGµ!këm w!A¬ÃÙ­B؆³ïæxµèYm±]Ócܦ¹IimaCÖÅcgÙlѳZ‚µí×Íá"ô ²>>KoÕ†¬ާ° é•U'üamÃ>=«-¶kzÌ$üáÞ6d]μz¨¦Ow®@飿«‡'ºŠå Añ\=hÐï+Ey}rµ ¬+›WНºì}µp¨+XWŠlº¼yµÈ¦«=W Rºxµ ¥+#WŠ7ºlvµx£«W ºÄtµÐ¡Òñ U]Œ¹R&à{(¾BôÌ‹ÙÃ^ŒŸ\hÙùVØ3lîðòpoð°ƒêšš»4— OŒ PObtšvGi .ÎÉÇçêy…^gð¦à’á4y|¼¬Nõ{MìŒMÁ%ÙëøV}÷𨠛‚K†“ÉñQ¥:!î4íY¾)¸d8¿è©sÔ^»zSpÉpÊ5>öR§½&ÎþMÁ%ÃYÐøpHÉõš8œ˜‚K†“ñŠ:¹ê4íÄ\2œ+ŒÔùN¯‰Cˆ)¸d¨¾Ëñê¤×ÄÁÃ\2Ô¨ÇEkuVÐkâ°a ®EXQå–}UA½S´G SníàxÐ.10t5„¼Øj®W™Õ=Ü+ ÿ·þüÇÅÿ~|õÝÛð@þêc½gBÐÍn¥8ßò¼<||yõO_§iÊ¿ûø_ q“§»[èuýyS~p—o‹/ þN€ÈC¤IËü:ù(p”c/¶p³ÀEŠAYd®?_êÏÿ<ÖŸOâêœn>zuõózßõç{/Õ7è›úMý =ÒOäLç ßJP¹M†öÏäèÁ)ÐTˆï(Œ°Á¼¯÷õç;‰$‘QϦßf! 0-ÓiцIzÌs¾M%*äoëÏ7ú.–þ´`iìâ)k;þÈkàß¶›žÖû©?ª€ïÞ:ØÁ“7— õ¿oW³öÊqb[xÁ‰á–ŒùyfÓKxu“^Ó_öU¹ÝÓºeÞ|„úãÀëD'˰±wšÓÃ÷ôÿ_š¿(½a"!ïœöoÈÿà>‹3-¦¹¨«;¬Ó$®¡©÷Nkœ¨Ä»ÏÐ#[é‹òSÉQX‹³ºæ\þq«œüšñzŠzsLz¼¸òd˜T€r% ³m¹×ü¯/Êo¸É©‹~¯¶Ž#[ÌkL“Èo%ˆþèõh¾þNzvŠ8IßéžÞ·ÒÁ534ïKâ‘/ÔþÕ¥BQξíïÞNk—xp^vôÿ™ §v¼§m¹ÄE!É¿8é=9ŨpA/—:š:@>jHk&y-ó½5Êz¼¯•§ñ™òª”R®Ó%RBéHF€…L:ÐùVzëÊ<´¡ÿ$\àMq“ö¿ŽB×È/Ú­zŠ%^[ùYíYYÏð÷Z{¤ÁD­ü9Å'$%Q:XÒ2žŠ@~%-z\M-ÕoÔÝÈ?K¥k“Ö)ec] ‹Eo±ÆR}– úcÐÛàgò”Îzx¯%¨ÜbÑûóÉr53aßÞ®&ÜÊ´(äOÒ{L˵¸'-n&²T¿¢Õ¼¶‘>ô˜¢¿@”4 J€´ˆR(^ál¢4G´yÒ´È÷èä¦@dó¤2'…TåÕ§êW0†’²V¾Ã“*}Ó¯÷²‡ÜöÓ}Ó L&ÿïpï—Yïóð²h™Ô+¢¡¾WX´8ÉëC ¿fm½?ãûÁõ! sÜ?*jð‰ÚØÒ8õ»a>QLÛ×W>V¬Ÿî¨éQuB‡F¯½D©_æÐjô;›µœ&-ý[,‡8×vtþ6•0^‘±¾8ïVÎ~býtI*öâølnîʺÃ}¾3…îôÏKúWùGðN\úô‡w?ýð—Ç7Oo>þåõ›?<½yühRÇš0 yKKt’0˜TT>G´Ò˜Z¹úI‘:qÃ[¬ïFEM­±ÞfMõœ­iG€|Ë~SŽƒüf0ˆQ¦N†A,9,þ~[bšõtÀ³×ù6“ ë« % Ó™$ŠG“AmêpýRŠ–vt*;å[Yƺ9«‰‘ .d5g5¶³ÙY €ì¬@ƒ¬¿2«)vV ;«ÕÈ*àÖgÄÍŠ\URD4Í`XÑRÏÆL}RFÒ㵎¡Ê•Òª,ÿ®y 4HGEjq”Êô½þŒÁOÉ©2€•°ò'$÷%ù±+¹ŸK/š(Ô—L¨ßšÂ‰ò—1hëBwYÿx¶øÖ7º%Žq–91ÎrLvŒ•cÜð[Œã4ˆqÖ:ĸá8¶7F‹qCA-Æ&Ÿcz3Æ %µg;ã†7OÉaÎ'÷å)Éa>qÀS2gó౞JÖíéku5Øß4 ~ZnôˆuŒ²hI?cAº¸EÞñR;®RNóm¹Ï8Žç¶ã9€ìx ;žhÏù+ã9H±ã9€ìx õ}ŸÀæ*tæ*­9·]åh ì*‡·Ø\%€lW  «äî*å9H=[ùD;¹Ê`,µŸññŒâó‰Er}ÇB›Ma©_ïSp•iý¤‚žñÝà¢=ûÏø!‡Ù˜ø£|ÀÑ:YÒX{s a¡Ýœ/8‚M‚ Ó Èt :v ˆüu¥˜A¦Ar '€»AЉ1çÜt Ã142¾ÅÍ Èt :v ˆäløªªr^jp"²ZÙmÌš¬û³?F.-©LsZÍåNßèóaÈWC-*žå[ôìgÂDkØfÕˆè(Ó ð7 !È; å˜<>>ã‹û†´& endstream endobj 227 0 obj 411 endobj 228 0 obj <> endobj 229 0 obj <<>> endobj 230 0 obj [/ICCBased 231 0 R ] endobj 231 0 obj <>stream hÞœ–wTTׇϽwz¡Í0Òz“.0€ô. QfÊà Mlˆ¨@DE €£¡H¬ˆb!(¨`HPb0Ѝ¨dFÖJ|yyïåå÷ǽßÚgïs÷Ù{Ÿµ.$O./– ™'àz8ÓW…Gбýx€¦0Y驾AîÁ@$/7zºÈ ü‹Þ Hü¾eèéO§ƒÿOÒ¬T¾È_ÄælN:KÄù"NʤŠí3"¦Æ$ŠF‰™/JPÄrbŽ[䥟}ÙQÌìd[ÄâœSÙÉl1÷ˆx{†#bÄGÄ\N¦ˆo‹X3I˜Ìñ[ql2‡™Š$¶ 8¬x›ˆ˜Ätñrp¤¸/8æ p²âC¹¤¤fó¹qñº.KnjmÍ {r2“8¡?“•Èä³é.)É©L^6‹gþ,qmé¢"[šZ[Zš™~Q¨ÿºø7%îí"½ øÜ3ˆÖ÷‡í¯üRê`ÌŠj³ë[Ì~:¶ wÿ›æ!$E}k¿ñÅyhây‰RmŒ333¸–‘¸ ¿ë:ü }ñ=#ñv¿—‡îʉe “tqÝX)I)B>==•ÉâÐ ÿ<Äÿ8ð¯óXȉåð9€¢yPÜõßûæƒâ›¦:±8÷Ÿýû®p‰ø‘ÎûçLg ù‹kâk Ѐ$È t!0VÀ87°ø`ֈɀ2A.Ø @Øö‚JPêA#h'@8 .€Ëà:¸ î€`Œƒç`¼óa!2Dä!UH 2€Ì d¹A>P ECqB¹Ð¨*…*¡Z¨ú:]€®BÐ=hš‚~…ÞÃL‚©°2¬ Ã Ø ö†ƒá5pœçÀùðN¸®ƒÁíðø:|ŸÃ³@ˆ QC â‚ø!H,ÂG6 …H9R‡´ ]H/r A¦‘w( Š‚¢£ Q¶(OTŠ…JCm@£*QGQí¨Ô-Ô(jõ MF+¡ Ð6h/ô*t:]€.G7 ÛЗÐwÐãè7 ††ÑÁXa<1á˜Ì:L1æ¦s3€ÃÌb±Xy¬Öë‡ebØì~ì1ì9ì vûGÄ©âÌp‡+Ç5áÎâq¸y¼^ oƒ÷óñÙø|=¾ ?ŽŸ'Htv„`Ba3¡‚ÐB¸DxHxE$Õ‰ÖÄ"—¸‰XAàPð4Ð407°7ˆÔô&Ø9¸$øAˆnˆ0¤;T242´1t.Ì5¬4ld•ñªõ«®‡+„sÃ;#°¡ ³«ÝVï]=iY9´FgMÖš«kÖ&­=%ÅŒ:Ž‹nŠþÀôcÖ1gc¼bªcfX.¬}¬çlGv{ŠcÇ)åLÄÚÅ–ÆNÆÙÅ퉛Šwˆ/Ÿæºp+¹/<jæý$.$…%µ&ã’£“Oñdx‰¼ž•”¬”TƒÔ‚Ô‘4›´½i3|o~C:”¾&½S@ýLõ u…[…£öUo3C3OfIgñ²ú²õ³wdOä¸ç|½µŽµ®;W-wsîèz§õµ  1º7jlÌß8¾ÉcÓÑ͉̈́›È3É+Í{½%lKW¾rþ¦ü±­[› $ øÃÛl·ÕlGmçnïßa¾cÿŽO…ìÂkE&EåEŠYÅ×¾2ýªâ«…±;ûK,KîÂìâíÚí°ûh©tiNéØß=íeô²Â²×{£ö^-_V^³°O¸o¤Â§¢s¿æþ]û?TÆWÞ©r®j­VªÞQ=w€}`ð ãÁ–嚢š÷‡¸‡îÖzÔ¶×iוÆÎ8ü´>´¾÷kÆ× E ðŽŒ <ÚÓhÕØØ¤ÔTÒ 7 ›§ŽE»ùë7-†-µ­´Ö¢ãà¸ðø³o£¿:á}¢û$ãdËwZßU·QÚ Û¡öìö™ŽøŽ‘ÎðÎS+NuwÙvµ}oôý‘Ój§«ÎÈž)9K8›vá\ιÙó©ç§/Ä]ëŽê~pqÕÅÛ==ý—¼/]¹ì~ùb¯Sï¹+vWN_µ¹zêãZÇuËëí}}m?XüÐÖoÙß~ÃêFçMë›]ËÎ: ^¸åzëòm¯Û×לּ302tw8rxä.ûî佤{/ïgÜŸ°é!úaá#©Gå•×ý¨÷cëˆåÈ™Q×Ѿ'AOŒ±Æžÿ”þÓ‡ñü§ä§åª“f“§§Ü§n>[ýlüyêóù邟¥®~¡ûâ»_é›Y53þ’ÿrá×âWò¯Ž¼^öº{Ööñ›ä7ós…oåß}Çx×û>ìýÄ|æ쇊z»>yz¸¼°ð›÷„óû endstream endobj 150 0 obj <> endobj 232 0 obj <> endobj 233 0 obj <> endobj 235 0 obj <> stream xÚ|¹p&³6ÛvîØ¶mÛÎkcgÃm'Û¶mÛÙpóíó?ÏyÞꭩ꙾º§ç𫻦æ7CA¢¬Æ bîh ”ttpe`adæˆ9º9[ÌÌìŒÌÌ̈bÎ@WkGqW /@ hq³°rX8y9˜y™Y,<<Ü5Ü\L,ÿæ°±ppòظ9˜9ÿUYÜÚhæêèìÅôßÕm=|þãZX;˜[üM˜»9˜4¬¿¹eÄÿõ?1K +€™ƒüzšY˜þu u/'à?1–á&æ~>NŽN ; Ÿµðï€èãbâ¸:»ý|þÿ‘ÿé!²°Ì­Í\¦@KkÄÊË8X8X˜ÿ ÿ¡ÇÜÎ.¥Pÿ[.À_±Ìì¼æ@ D&EGWk3 €ZÌÑÉËÙÚÒÊ@mFóW/nú©ÆüeùDzþcÙþ±œÿX®,7àŸÔ¼\\ö.3Gg'Gç¿Ý0gDììªÿªìPºÝÿ¢ÿ›…¤›¢‰ý?<þüÿJ0±·¶óú¦hÿ‹¾ÐÜÚÍþG­]$­=æÊÖ®ò/ÿ –q5±³6q°´˜ÿ Òp0:ÛY;•]¬ÿ5VVVöÿS·²6³uº¸þöù_! ƒùÿ¦ü·+ÿþÏýKüUÇÜÚÁ æúwLœÍÿüV6±þ÷¬0ÿŸ2ÿø,ÿÇW0qu¶öè1ÿí(ËßÄ¿Ûþ›é¿Çñ¿Fñ?§ŠŠ:zú0pþ½'v'€›™Íï7ssv:¸þ3Hïê¿} 뿞@38fe!Óøá6û®OãärñÝN\W†ØLU]™ÝQ±Ž>WÛ”P<5ãeâ· é"Ëæ:ÙNÁr ½9"ÚÍ´M­Œ£Bç1Ñ£&Å£Ë_Õjži½H Þü¦ÍõìÆ¢ ‚ ÜžL¦ÈnnP‘tZwñöö< ¬{-4œ7æ¥èG¾V_5Â%f(Y2’¶+ì3‰¤¯ˆ¤ 'ÚAËiMßæD µvª¥@!· ~?Ÿ}Ýß 3æ:Â7$cÿ¦þŽÚP@oÈFã'Åkñ“6Š…Ö'(ÏR|´Òµ•k’í¢¹¶©·â:#§ÔF­b×ÏÂé\YN.¹hÌ›s sœû0ePœ­{ÈuÁiµá¸`ñ"TðÈšïb_öªnÊÞØi=b†g,ORÑJX\‘ï¡ßôõûpµUVQûqÝIÌÁuú"»ru>Ín4˜E*nP˜póaºjÄwEñ d&˯*ó¶Ÿy ´¦GYgšoçš1Š\6u }%N @ÎfW•Khↆ¯äX,ÕïAý[z<ÒHªØÖž ¶.ác>!-dzŒT0HGé'`‹.Pˆ L{T%cÙ€i6À¦»ö2O†kêy[“v×M}Ë*Ú+ãhŠÅ"ÏCm„ëd˜kûÙÝàP ¸@{¸l‘‘’E®˜å—B/±Å𫨳2$F™m'ç9(&KXÑ7+Ûs/¦üv‰0ÄsÁã”ÕIÄ,¬)Ç}÷%‡f¤›žWY‰þ/ÒïÞó–RbeY7ÃÏèÁÍGݪš8VÜcꑸÔD+¹žÞŽ{.$9ÉîÓHó»U!šãSÕ7Ÿ+¬”œýêÓî:+JÅÂùX¢ÉSÀ'¾î/Â߱˨ß镦Ÿ/‡-¶˜_6ÐçStÎmŸ[~˜’pÔ²¶!SqzÂÛg‚¹Ÿ– lòþLrIõPÅu  SÝ=’ü>˜²Tà è¸0$Üî!²^IU)kQlX•õñrÿÅ.j¶FWJhµÈ7úâE…Òù"q„G~ê õÍ`v±PÊã‰hŠn*ÚT+”ÂØt±(Ø´üroÅÞ¸‰ÅÎ’a œ+ÉÚY •¥Þ©Õ–â"yà‘Gø½èXÑÉ#Q:q³sØ>Ë5Aªãª^™ó“Þu›d ·‚Ñ€ ›Ï÷w8BýÎKŒòUØÌC Œ½½8LˆnôßÊáõÄÓîD‰fd‚Jv­M·Ú5Ø®˜˜(…ŒóËÖA¤§žgŸwù#‹¾hÔ”’JeÀ†ÀË\˜ÂÁ°:k’˜Íä´…ËSÂÙûk~>-+-y{Æ"Î/<‘kêäÐî5 Õÿ~bÂy©Íùr»ÖÝ“UóÂÿþ,@ä‘b’ÿèyÞÌÑR—NlfuK7kÿ.3Ä&I(ƒ¾N«Ù’+ËÜ dÿ \X}Ú]y«NŽ8ÙL7ýe‹°CXàì¬'¢ïSì\‡°»7£ó¾ÝõW*—0ã¶ ¼pÜ'v™ðƒ^Jnæ¾¶w4TU¦.¶|:> lAÞ¨†TŸÄ’ƒÿWT$£N€¼×p§ÈøWd>7‹±.¬‘!æ»§ÇJ¿“ûýÞ°o35ìöBì{Q;#’"ß|°”² ¥GúP”*ÚÄe  CµÒ7[Ó?g·Ös÷L„µJ…d¼;][‹rÁ¤ÜK} Ù[Ñ7ºŽ¢žß¤ªRõtn 4¢± z¼Ð\”éGÊ£Óûì’Ø–50féŽg&2ñÒÌ2íîq¦‡ŒaŠŸ×0ðv1ßW·;ÛÅÉ.'[î‚H °ñÖ½1ª}Þð|¥K?“ AË/­Yú?“©åhPqÛækÝ͈®s7Îú<6=ºŒK”â†/}µïœÅ³D‰,©FOh Ò¶¤Ø 7}/íñëe¥øFZ=yd;·%kÅ6gß®eô¦0”ÚleëMIñâ%=b'…“ª¥ ͲYˆ(r2Õ8HΜÞÄÃíî·þÚ)1æ‰}³®Îw¹)FroéKÍø%jßR9Q¾¥ÂþÄo¼‰XïÊòDðvZ«#áìúQ¶¶¼U/REÔŸa\Ýä¾3VÚ^¸ÆSÛ³Cúü;ÿb}M}~Q»ñ!_ íe¡Õö)Y3Eü›ªdx?:ÊÃçN¤°½úaÍ—ŠMÖ ­O ‚YÉÕ#qüú’m;s–¥H×帴ú:áˆ)AÜ 7áp¯.Ït]Q¤¤óŽ ¼Ë­©üŸ !þQÄŸvÌ…œt£‡šÕ¬»É›á CÑw¿ÀZ×LÏœ‹A6ìŽHbi|n˜ADî4d$6j±&ÁèËçvMn7§»Åèm–a$Œï±?*×ã_ÞùªZ) çGLÒ$ÿ6}F£¹#œx¼Nð›ƒÕž´u¶öjûQ‚•uºÀ¢Qözë¾z9º#cï×ߤ)3²7DÇ âRù’’]Q–Î@}•]Üæ†&{þœìÍ@Xs†ë­;¬wÁ¦ÀçȘ”Õw \´»`x–Ô»³G"°ŽršúwÇ]„n4ž9¸y•Í#µoΘÇ$ÅP¿ÄИ®tE¾cw>y5f”Þ>W¾ðû à ƒ™PØû>Æéß®÷Ò(#£_¯8#{}Lù‡¹¿þ‘¼¾ŽWÅ"¿ô?¡Õw²yQõ·³gˆeë•6éìç˜" ã±9M!—°þ‘SÌ·3ê©‹"¬}±ó#Â-至­\ø_Ä€íÓ1!ºk$þàÜ:ý8¥0ëŒ Úk€Ç…{zo$d¡£´O>z*è†Fäi‚Õ]d¨î”÷N¥`Uãa%áS6¤‰Š-—‘;Û¾Ú[§„b…yÆ©¸ca‘>Y¹{½KoÕ·.÷Ù³ ÌA?ÁÆAÊj7ë©ù_Ëb)u1=·ˆ,š £j¬ëORµï$»ç0iYŒبÏÉŸ ¦iý ½b]swnXâÎ8)Ù Wós #Ó€ùú\¥\×-óaŸŽôl(ƒO`f ŠR£WÌÊ!ë°oDz|R¶²ÝPû‡»Š+·=L=OŸí&ܯ•ôwQÄ­".šÌMMÙÕc%Š •ç:þàž~Ý!ýà‚Sªè·bÙ'Vøøø¸¸ òOwm,FÄJ”ýL1ú‚ë±×þè0ÞNEBÖâ¡\— «ñ5šRP“Ðù¤™xK ø¬/(§| Šë÷ÈI²®¾¸Tnj/k ¿‹§<‹7Éãóé"¬ËMÚ綘}ñ¨xbÉC©€Œ±kìsÍV>þ\ Ó£‚Ìä÷oÚkRoM–ÇC9‘åKDÙVIûÅhÍóHãsÏKîÉîÍ(÷)E`dŽ“»‡Õ~Ú¡ÇG̱õ> >¡ úå࣓1s˜îg|®®¹šéTx¶]×ÞEY&–$ìjwm!ÂEsjÃqˆ&XïÖŒ‹4ßè$Ù{¦`´f·øpµ4éι  ÷ñz„®†ƒí~ýÆÃYÿ6}U´Ö#…x:¨0Iªmæ3íÿáä ÁæGÍå¶1íRhBù5l­õ 7h•!´›tÚMDÁ‘Q*ž%ÕD~Ò"Mì½ß?'€SöèÓ#-{÷¿¾KšÁŽwRZ”XÖµê¸n®ÈÏòÔðá ô¸œñŽƒ0ÓR6ùè¸é÷ˆ°(ŒFj@Ÿ…- ½z¶1 ‚»A½éÄcÂô’o¼Z äÛÛŸL€¡Bã†JÊÉN˜ÅUš~;P±Î¢4ìAö†_QµlÒ&™´ìÖŽßE:^)\ˆkÛyçéS]¹Øí=ì z‡3– ™TžDfM>¶í%gXMÙø@ß_^¤×±üy›ŠŒpÕŹîðTÄH’Ke Sø—\ UzBÂÔèo ¤úCàv5í ³ªÜPÖí5ÕKBuÞžôŸæÅ‚ú.8G6§ˆƒÍF»vŸmìd¼gqµ]«'ÙxÏSÖußËàZíÛáŽMŸy± ¶êZ¦ÈÎ|Ø€ƒum½A‹‡9ä~pTU†O¬]‡Þpæíü»óL…“+ùäÕ1ΩL˜ã}¨ƒžè(o˰÷èeܰë;É­JõG¨On¼"¤9Çì{ò\¯XЯ¸aåmׯ ݾ'3pLÚˆ —Ãï|·ntÉ—¹K8u®Ö/ßž¯ÌèBàF­%5GOwúkTø¿1Œ(Âû"QýX½öSíÁV’ ºŠXçY#e-TG6‡¶Å¬1P•,¸5n‡3Ë®:þQ>³“tkøiŠû?Ó!㡲€®_ùY )”_© ¡2kšªã@Ím:¼Çʇ]ú­´/…;$¯³ ¿´/Z>2sÂÖ.bT †ó‹bÍŸ%uÉ¡§<ÇÙKÆïVʵ‹oX w^l={w䵃VJwlïèu4U½µC=ý5b;òÂY«òûõ9BAßÐô„Ëwz6(K=P? … Mâ”þJï)³xS÷]³úãÖ{¬5lÆu—P†ó2š÷'9½«‚8˜³àþ`V+4|ÅTYn¥µhß>ù]²‰\ß :Ó|oA‰ý¾ªŠ-ˆD’%ûŽ\?L“-X¬Hzó²—C!}2¿îË;³fÓøôË.íG~—ŒÙ²©ªÞvÀ3er§ y&ÙlþLˆ«ÎX?àÜ=> r6F]ÅŸYð°„Þ‘¤¹4Ó^v–¹,Œæ<°™ InVV¾¬ò’¸Â´ýµƒÃµÐ?¥ïæª]}ô†Ï´øW-fŠh®ŠYN"ežJ½)´Ø/ŽWF§ ð<Ó­"¦ÓRbüØ™e—0ÒÕ÷èòrü±g¬²9Wä!ôãÜÈâ'~9£ÇKVvÝ5ÊWüʱfÎÍHmVÏÑ*³Œ¨ìµýny»Ÿ£ xžKêwR«E‰XX-vóq 9Òýc •*)×;ãOò&~³¢×Õ>Òl_ˆz#‰€ÞtÔ¯¦¨ƒ‚õßÅþàm êpÄ‚ËD~Ú ã_äº1»>\ØFˆø•®ðh Ý{lµ«'¿®û¥¿¤C„¢HÞëOÉîñ˜td <¹-~(«‰çuÏ›g (ãAË.ðȵ˜:Öçûžõü¬§è-3-EP#ë –Oýaô»¤:ÉžI¢ÕõÞ©ÔºŽéòÁã'»ðõÄ[«#;Ã"p KþS;)°Ü†2y©‹„ˆ–VØÑ-“ºíÙ-´ÛÆË¥Sî‚>lhܧ{†\*yßZd, KrSM3z:ÒC]ƒƒ¢øÅáùì@Áš¡†wß$«ÃF t꼫åuO]0‡Þé§8]¤'ãÐyMfû©ªoè1<è5žËV7)측[×3œ„ÄI©Û¾½ÚãÄŽ¬±»ðŒ9´î C”ÕðÜ¥®ûÙli¹**Ú VâÃÀG³içì{ö©!×*97|s™¶ËŸðbBxo^Þ1ÂÊ÷t4ÙÀ q<#0¹O“t7.ì`Ä«—ÂèÀZÝBX|¬£¯ºªúvW ù £M†UZ–ñBEƒ½†›%é^P », Þ8DŽ(Ÿû.Û¡˜< d7…t¤|D~õžÐ/oKã›Îiu'G:LñŽØŒëÆÀ…ø*.…õ· Ö ^Òô³ÀùEZXg*3g}&8 òóaãÊ1yhüÂj´¦E~2½ý&ÒU/k“†Ý”JÊ×"¼²AÚ@¢ÄÝ(?Jt§µ߀¥Ó¼I>—ÈyúÕ<µ"³ŒZ A@D3Y%‰¶ñqÚÓ¼°…š¦^ÅOÑÓ™Å]ÊÀ¦ÉqDa‹?hI‹î^bdžørèo¿ée“%ˆ›{2·5˜ðÂ1û>9T~:¢¸nÓb 8é /AjýÐhˆ§ÅÇIy5žpã÷'ι b¢r!p¶2'_¤!{¤õ 7–Bñ‚gž ! 0 ²yð1ùq·>ý‰Ži¥ÐkÀ9û¸'öâŒÓ“qlLe)$¼ËTz‘7”vÑÏ‘J¼nqº¯lZb¾3ItW$j”Y­¨IDïKÕ~:uD¦€uHÏž .«¾å½œè ü@ôId+w䊥€¥x8[› ÔŸ7žŒ(F]eMx¼2Æ9\¡SæÔÛL1·¦rN½VJ¬µ.tg<¦^wá_I–ÃÎZQuïØ’•^8›Å(Ï#ZÊ„FØ€F©Ÿ—ýU pZaób:© ‡(Ä|qŒˆ"Èu!j-•lñ¥–^²’õKär§“W]›á‰£Ù23¾kº¥­øð®zŸP™Û0õEßT†¸90Òž,š/³îÿn©XóPµ"Œ ðKjNXÛF¨â‰è×É;arþoÉ-¡­î”ŒP¹DÅðÚbÚ:Y¶]U”ÓÞ[œ²0WÜ&”¿éϘäÞ˜>CÊò{à–È#®Z¡e99(°raRÔcJYŒ7D'С1™ÕÄú½€ Bkr­¨`:h™Šˆv³×.€$]8nLî@Ö癯“L{éøµj[Nߺ4wFÌ‹ÙKï¤9^ëüb1 ²Ìòür¯Wì¼O¼ŸR£@ÂݾWBÒââp±Æ¬FPa7™* žm{Zx9-¥ú½Ê uºúf*8jt°ñËP¶8P:›ñ ý%ìÒ ˜}AÃtCþwê(ºáëdØúbO—Þæpé}¶¹˜ óÀ¥Èe\9_jû6Ió‹ž©‹õó«Öá„@¬ç9‚z#¦mE$Tfn3ÆîœÑ©N%¡Î©„“ !Á)ãË8UåÃ…¬Ò5z4ºU,p†KÞœwƒ.L„:¯¡„&¤XpŸÕ«Ý‚˜¡K_yÜï± H鈄ç‚p^poCw”hÜF“È-ºí1SkW~„©¤•â·+Åô ŽtßüÍ#ŒådKƒ<œ”YA©A.o Ã‡¶½‘£Wn ¹a†{1¥þ´âf, ÊX<9ÁƒBH³ ^R¸&™h[—^bÿå«e—&ó%–&™û¡¢' ß–rϲR×È'†¾q_¸¸¡Ûÿ î©põáGй’Õ ù¦ ”ÜL&¼CÆDØáÔóäëŠT 'OMN–Èòö«Ú-<è—+±˜uïµíÌQ³‚öþ´¶ °Æ¹ºÂ™„sKÀûÑçts$1µW:ÏÂÍ¢{¡ú3Lþnt2=Óþß¡^O8QY:zõ¨dg A -º¥¼€úª?Ú©ERð—ŽE yP‡Ú—© IÜo1ÊCgõgrè=#äÖ܈nv‡öTù[k×Öhp¤4;RÍ[ 8ËœëÌ€.M¥ÔgÝ·'1R˦,LÁ¯é¦¤?Ö`?b¾áHÕú„nJÿÖ’÷©&?¿øsc¦’‘Rå¡(,„£@4¶Ry ̺ÑÖmþâʰe¼œW$Ü–üåB‰ëce†-¿H›-B5˜44Ú›àM‘!c]ÀGí'T¿•“‰T‚kïVSØ@pÜï3 í#¯²ÄZ– ¡b"؆¹“›€“¼¼ÐZWXß jäÄ$o›©õµáá¦àsߢaNêáÌóÞô Õ:†|‹åíÁÚÑíÇåæd7y‡×EUèUIðª¥W¬WLÕ¹‘ÙHºËÙ³ od ¤$ú±æ¹¦Ñ¶ˆV ª)ÏÈpOìŽÝmWX v‡Uy`]”Œ¦†(XˆÕÐ×¶ÄâëÚ²¥•ZSƒêHdOÓ/Šhˆn¬¡9‰»¨˜Üä섽]võãÒM¡"HŸ¼´¯KÓŒÝMð²WÊZs_MÓ“¼5qn$ð•¾gW÷BñÊÒfý³ZXeˆÙ¾¯5¸Ôʥșa'ð4eˆºeoß‘=ë^¤“NzcåØÊ´¿æåÃíHoEµ£8ÁH+ŸÿEðȵ²ãBG_e”Bý&¦ÇËa•_öšÕI± +óý/¸ € ‚!ÊVçÕ±ž)ýOað€M×AŠc+-> `ÇcBìHòwÅ îty ›Ç  «1§›âÛ™ìÊHú/ò–¡’©éØaÁGœŒiÒÐ4æ,í6‹qî\І=ÂâbšÂœdèF …ÄKùxˆGÒ/Ͼg3SÆ3†Gòi´+Á³?:Pi©ê§ÞJ5M"»Ýâ„÷3ÿù>Ò }ϵeY¦‡<úê0br«î<ȯ*”´NèÕÑ`^=`ë±×˜ˆ³Î•›4—_´ž¾Ä{‚6™‘ Òß½þiÂlñîA&ôž·Q ELÊ xAZ†E@‚¾Íøv$ƒ¾ ¨W>‰ñëâçÁOµ8Bø#:æ2T#£Ê¦7=Y¶ã+è›ge„H«EÀØx›7ýB)M¹ þå(-ûò†(¶ãs¦g¼|T†[‹<µMìÙ \ý8¤3zª„XbQG„äe›e¿xO†ñ"˜ëŸgž¥¬ £¸üõ0ãÀgfù/ï(iå’DS°rZo" ’ûËé""]P¢åÓ#%6iS¹@iÿ'mÒ:-ë³k£WI9³D ¢cEŒdKJIí|ÅcGÕ [úwßÑ nòÅ,XÝ/ãzVáVU•]ƒX#ÑÆ}d‰íú^ëbøŽ^ރȄ×óÍJœ‘L¢$áVZ¤´þïCCTh !OÇüÞ__š†>aÅ|®ÓêùÉ·æf úBë°pï@D½çNÜâ$Ts“iaèÑ=§Ì•àBÍMÐ]î^ùfî†AæÁ ª:YhÛ§8Å-}ä½Ò¦ëJZ#áŠÀ;!hœÛoW WW<àŸoæG/ÈÚ0×0w_5Xân=1–aÚcìCñÁ¨ ÒNg®5C¬y…[ÉXæIËúÚ ö´è58`ÝÈAh7¬2°õ:m E'nj¯CS®OýŠÅ[äF $yêRàØ†À¸¡öÈ|*ú(–PjNpød“3é÷Mq‚¤ËÎÃ]w;G±YNÐôõ8¦èóèŒøÞ$˪ ÄØŒ_ã€S_:Ñ“­ö ‰awɈýSc3ÜFØCíaÔ*p줜k¥²œŒ$p1ˆ”: :^‘Î b¥Xä˜\ /S—³á#’æ¥%rÁ[½X­YÕ߯PÁI‰Véǽ~þ‰û[ÒZ¹·Ifœ%yüœ?X·±9º¾‹?¥¾|ÁÈ8Àß!³SL(V- *5R”¶MÆÖÈ HWàüF·ž/M {ʽ²Èšq½x=ûÏ¢š˜.R© ÍÊfÁ‹¥#‰oì‘{o2n7 µ낼Dƒà]žä2fqÌÎL+ñÄ• S[ÛÅ( ·‹ÕofðédÙCãJBIà¶P’Y‰©:œ´® +fñ8„)bàXÅÖ¼¡¦¬CøJ :sNJ3Ìwå&?¦bûæò¹ux¼'†y}]¶n*"Ž,×ýÍxX2q¢‹“qTÔ‹_ùŸW³Ç÷ÊÃN}¬ÜËëi6ÎgH|9«ùQ¢àPÐÅ•À}¸DÂh(è.q·Ï¤kRý”Ö6dª¢SÒ#s'— REk^îª $Éa°Òø ¹œa¦ïpÖï)2I Õ¹äB.ö+Îî¤xÓrålœ1ø-: >î“2%r%Š»%uêEnØà»X³²m“’€·gºñ8.+tðM‘àR ]Új¿ÞTŒ™¶²Ð%Ç r&ã.úd`à|„Âs´rÝÖ-Þ9yñ.®“xçäØÌ õs6R¯h=Ò7$(‰{ÒûôG§?³â䇸҇èMmÛ°q¸§ˆêdÛqD«âZ4-z.>#Œ{·õ7¹G˜Åx< ôvcMâ­L#ù Ò\»|<\q[-¹ž²Á¸ ÇD0z$©äcâHÙÔ—¥Z–töàáÊûr^Ïbñ¯î5½··[i¾ÐcÊÔ,fÙ§‹Œ E±ÊšÖa÷’üë¢ØL©PzEÇSß=? ¢ú±Óá‚RY]A݆]yá§Ø$Äè½vxpEáÁ†0\,pç’B<›M¦î—/æ1oöÉ´ß4WÜ5Q•ª÷†¿é½Gа`lð”6>‚H¯À´²Ù­Mç›ø¥ã—‡²ksÿ²nzðJ,9¯Ý@>ªÉ™°ê5~áµÝ3õûìÝ1sW¹¢{rC¸~¬E¤î`R ’$;ú‘s¾•÷¤­U/?’Ÿ[à§ Â%Óâ"³bjf”˜ÓŠø—åð­æì„®lWOæ‹-ŠÔ ¬œ‹wßê6)õ3‹˜jžç۳نх§ª­`&R°ì‰5ÑgnõÎ턺 p-ž´Ïir‹Vá ɵCQßG+bdZØR« H‘yhMÈ.dž爹äa³:[0HGN0&f“ñhI‚ë#¿+æ(ù3½u2™Ñ~ù ¤‡V)ÂCWÑ*äà°c§J$q›ÅBw Ÿ<ÿH3‚(™Ô&©ùyà•¦µU«®ð2“Ä µÖ~*jü­yˆûvoÃV#mþi]z[‘Ujv—Oñ*XY;÷±‹GnjIÔ5Å^—¸ŽDÁyÇÉElô@J nY„S %êâ2”Ñ]‚Lð2ÅEò¢ V¹Ü­¤ìNlÄYƒÞjtDÀ|rç¸íø©ãìÏ êc1¸ƒ»Ú‡ÜFÄ=bm4j–¦@E±±U€~hGä#V>)¤T§Ô}êb±7]¸}ì0ëÑF0 J—ôÃ{‘A V(p+z¸Èš¦bWµUë9Â"‚ê¬k—Àèq©7“{—éuèíQ@—Âͤ2ã'‹t°:Áˆ—z°}íÑîЩz)}:ï Ðsßõ#£Ûfû­REŠoÃàyçVê¨Äp2jcÓŒÍÖYi}!•R‘. ë;4c¹ÛIº ù¾HGÝt,e®ÿÊI¾€d¯;×ÄR€YTÜ´ LÞ+¢Î /8zÜX ’ù]p†‘Ó˜ ä[DVi.S¯Rϸ¹X»øXñgûãpF5Å®ÒÀUi>Ö©ü;<7ˆXEèOKÁÿóçÕǦb­*êÎÇ7·|QŠ ‚Æsšÿ-¦ Ñáî!áÎE;âk##/Ë&Øîû“ØI¥TªèÚúîE£w¨Ò 2•Y&$iz&ÔNêÓÍŒÏÈÝÊß NÝ\Jy%“A>~Ó495 Åó}ö†î Ä­·(-Q°5¢VC Ÿd^µ7}¥©lœ’y®cñº½}ܶ¯ôc¾|Ô»"Ìw¢Cî®R2 ܦjhÊúM.?5´|ÈååÖ@¤ÇçÎf¼ß-ÿþí—†Æ!i÷[³yê1°*­*§ù°å¡ÕA'A1´Þ!QÜAšT••€~—Ä»Á¾<©ž!„Ñivþ~áw7p£ðÀ/e¤i†¯±múÈG_Nåd–BgK³‹$˜e ,¢Òܽ gi¾KèÈê`eº€È~H´âŸsZhETwx‹dÐçñ§TÁ¶sðßÄø0šOû#›+>r\áÿPG5EoËî ‡ÌJuŒ«RÖ¨y4«îåt¶^'îÌy`J'`Ì›¡¾ã†x¯:WTH•°êèzŒ"ÇcÔ;“rš¶‚Å̉.Ã]–Ë?l4 ”}&æ MS·LÀBºÖSÎEñÉIðs?¿ÛkÖÌ›ËwNG× fá³éöIlYÓey†@à‚RjNX䑵&!«ÒÒÅ`Ál1}WáïTëÐaÖ°(rníàÔ1/tgI4c?*¿i®<é~ßB 9ÇtE9¸é w û­Ý÷ü§d.¢ÃDxg<ívÌê<|ïÛ¸‡'¶Èt32¦Ur•äèž§‚)Ø“VväC¹Ž“¨ÄE¿mزÆò}í¬+jô–‡ —E¡ˆ0Dªd3Óƒ+‡Í;¯†èÉP‹¯ˆ1x½3X‡Ò0V—“ƒ<²WÝ}ÁÁkᾈ£ "–× Ç8U¯‚?O‡t8ÿºËDå‹dæ©Í>ƒ6É¿“*%q‚á}«ï-¢/Õ= ÂÌÙq59Öì.݉dÁ$®ZıÁÀçÙÛÌ¥a*ö8†¸N‹°‘£ Ýð¼#;¾\[ŽŽ}Yоx”bá@Ä@Aª‰iÊL•S‚à>ß¶í…ÔBÅæÙ"y(`})ØS¯º¹£ÔÄVSñm«‚ÎéÊÓmp’@b|o…™d¯ǂ!wº9%䀤šºÊVöÃ{º"ú÷ö ®«à‹;?vW~}š[¬D“·K®/Vméï^øÌÄ×׈w“²X;QxìQVjÕ'q¡õkvŒiÄé>A—ѲÛK‡`µ’~t~4Ë<Š‚”°ÁMÒó¦=Ö%¬ý¯¯è HŽå”X¥Â@Ù UÒ=ÅAKÉ µ^HÔa´HÈ•“|s$#P8$£±¿Ë F²®Ä]¨Ð3“À†ˆô‚ß å&Âë/ ßµóJ­öûŸÈ7“¡Ç‹$Lú6~U`é IvÏeÅɶߠ>¢†ndÇÃu±|X™b6“éð: y‰Êä‚¡|Yvg‡ô¹Y \w§)ÃxWˆf>Úì¡#¨2÷£vETÛ;z7ˆb±˜’pÃ1ôÝ›?ê±¶ÌÌýC-ÞÊvQH«%ó!2a«Õ&´bk±W:¯ò·x£Î×7ÌxS ¸˜ùu†Ò‘œ½íÊsspõÛ¤®ó¢'tÇÕ1÷¡ž¯WX’ÒÇZ•MžjÞ‹—Ê­lôòRaåt.±¹?’Š÷8&xs¼Ãëù¾9•L‘4¢°·6šu£×ªlH€8G“æ•ñJ],CNµŽ#ƒˆ(Ù9Àjò6¶Ò¢ñ,xŒÀ(ª…k^#[…ó+Š•¯æØÛÆ…<…œž™[Í&.0¾V¶ºüzÍø±æIë¥'\*žUS—ah 9g)g³1éÌ"Ù ¿ª|ÃA§EoǪô÷Ñ¡0åãµ™³–h%2HÛmwÙCú©’±“ëP©‚¹d®_ÞED"̶/²*BÏëÑH@uâÆpâ’y{âO ¦P°_¤‹ïW´ƒZÁÃiPuõ@Iü(l!>Q¤TØ£¼`ü!‰LŸl|÷¨ÏQ¨®GÈ´íøSGM58Ÿ¯n¹»J%Øø·Hbeúƒ” M2UÞGõËQbjPÞaDM›“Ö??{.ΛOw&¯D’ÊŸ¬¶ay‹dŠ‹#;öYð#Ð>ªI¥czÃÃ`ÿ%û)™C[¶õÓ«wòõ¾™ÍXÐïÚɪ%- 9áÚ9¶…¡EšOÏïlƒša¦~ŒŒEZàAIÛc¶Òu]Ç'sK̃XãQ—ÐO˜ üC®%v}Åõ¢H?F3ëWA¹£‘;n –^ÍStbÒ”øË;l ªVÖb}ÒC×FlŽä#íü‰ ™gF ˆr…Þ "-i…T ´ee®­+ऱ‚f=7S³ŠýÏ9™qS H“ˆY 7&U":&×é÷»=‡bÝ`“iñ•À³Y@¤¦W·[D[Šôº×7þùðR_þ¡žæAÖüV}%Z1ë×\¯üÄL(˜‘`u´î禤²š„´¥”Bÿ©\ª²‰xßO:'go×brì f¡·¬å<Ñ­'*Cû-èh-døøÿ¶I)ÞÍ(©^²|º6¢V¸Nþ/ǯ ØÕÁ"Ö6^¥þÁ}>‡§‹NsÒ~‹Vø$…[ Z½½6Ô’Fµ²ri)ODxu)Ê¥¬CÌ xî< 0xé®a>¸±åš"‰-éjGve@p­ËÎú“Ý{¯ÜàM 0L|<ÎÇBrìGж˜ª}Qr7ðt6åZÁ9©ù÷Dåó%¢Ý%¥Õžbc™¶z®ò €¡€É`á˜oeݱ¾@Ä]Ô#o‚ ¿*®Ÿ›a1ZUÒÓž»•¿¨šU`ˆó-×þ©#kî{¬ˆÔëa‹/U…®(Ùí×–)jMùðÙ²l>bew²”Fú@îÈsÚeÖ¶3£rŽ@¢B—×HÏ×ÛM/ß­sSñg²æ7s~ì‚ݳç¸ÿJ‘'gØ’c\÷Ŀ姜 zƒ\k´xÔ­`ò%eb±Ø:½yóAšvW,ÌLûÁYŠ4Ë}KªÌÙÚÍ 7ðÓž §·èå¬zòm Ðyzz.OlòwÇ.‡´8ÝA]û­äÅpždOThç0ñããw€þ‚$ DËÐFzéO%8YŠÍÁ¹Çmª–hQRº×³‹Ét"ÜðqEYû ]ºÌA)øaØ}ÛÔž-8²é=ù^ÔH¯cªÍ!%ž¸Ó¹Ï…‡Ãù{!i!6|Ó„>ñO#H›{¯¼ÑçŸ~7¨Á ÆÙüµb†ÖGËü¿¬Šû|²•1#lÉú‘Š£~¬…'ÙmÉ5þf§ÂôHÄÔR'Z*øXíª¤óc986ÝÑD˜Æ~õ\N%Lv?L¦A“¥‹9ÝDÛ ÀŒéGg”´ÛS~Í€f\UñüV‚ï‡g À5Óµ“ú}…)*yë” €æ»"¼,Õëg¬}EÈ"¼â0C*É‹ÏE( æÄ}T ýFñt„e7ïrºù32lh½VÄtôÐ,ÏÀnÐôiæáî˜ûþ Q4Ÿf“ô¬AL{gÿ§˜J·“À–‹c*s”X–Ó™ò(D€•>΄Ÿ¾ÌÁ>:JŠaãÆÎÝ­êR1|؉¤9ÂÍð%‘ãg”‘MêÓ± yG–’›¶’‚¿HÛEUü;ŠÎ/¿ç¡‡ö6‘=¶)-Rª•”È-ÉÍ YH©åù)L§Íüô[ŒuïƒÑyUÍŽ*%û‹öÚ‘s/3ç´ÉvKdÊÉûÒâŽs×ɑ׆¸fˆpC&‚+à ±z™BOðÑzbÈuèR¶FÊqëd®Ÿz†à±w¶Ë›»‚Yö®²¾%e<úñ+Ùþö\P0T‰ÿºö6ô2ÜšAÏëŒùúÇúÀ»riãÄ|W¡ÉÁš×T”Èö±Z ЦMÒ_L³§@%„ìûXËý2¿þJ3_|Ö>0ë2·4*rÏ1=r3„Ì€áuä”)œcÑ I=ÍÖ¾åW¬ÁseÉ´jò¡«A>Çøˆ€1Ì@LÍïhk³ð¯»Æ_«Jåk%÷‘Ý2^Ø\(z.tÐ]aöâãç/ UüIÅꃥA5Óö:0 ±Å²“*TŒ(B–½3Šz:¸24/,$@ƒ„™•6Ÿ¬n¦EÀ ,+%†fúÙ3",zÐN­VÃÝØVxé™îkYÚn›þæ”h£¶È¼ÄñÈB?DÎÌÈL„oqÁYúIKqx:÷¶ê³)7ûÂRž*çÜ‹¾—߆±c'cù£0qö*¶VëÇýõdÕNo€¢4$¬IÓmWš®1^ã®6Qõ¤Èùù½»Rqëlbli§#Ž~)sf²a£ˆÎü³åkn3·¿µþ¾»ÌS³‘GжŠk ÅÒbJéu³O¬ÁÌ‘òË=F¨)å‘—%^ †Ø‘xµ¿‹‡i)¤·l ¡¹Š%&¼ÅánTªÝUËYC¯d|;¿ïéÆÅø€£Ìï8N%%dGôdÙíè ‰l¨¿œãç. nèxVùøPãÖÌ$AÏ®ºÓ]_ocùˆ€‘qòmÎ6Ò\ŸµËçßõИ83”Ou ör£ô øJLö±\§Pu·±eþ•ºOèÆß-·ZÀ“)U¿{‰Žv‚¶² D£!Lé³Úaç=æ»å¯÷ϸ´ø°4<.ø·ó³6å%Òi£,Ü•ñ¡[Û}”–»U» ¤|é¿åVÖÇN»:ÛK”nL3é æ…q):>Ãàa¨A XvŽm!ì2Žö€ærè*ÉÂÕÈY@í°”ü$1gÊfÂâ,"£{$¿•è¢Å" ¥Úýè;évÓÑc߸ej3d»^þêèrÃÁ)j—«ÃMò~7z «Æ®q©$Ž[Û”˜ÏþnBD PC€´R6v¯,ÍÚcP¼ekiN ¥Œ?‹K™yªâzç8%Nw–-B¸È¦5ôbø‚Þ®¨­/†Q-åŽg†WvdwÔȤú 1„;ñf:K hŸ® µü^•Åi<îe}bqÆ‹E8Ë[d7Ì,æ/Í,E2æðÿµ?×ïpŽÇÇNLsÓNN‡é15¦Mw÷é8yšMwÛ6qº»Ù™¸1Í0ÍéÉÏ÷øþöy>ï?àõ<ïT¾pZЏk½ÿÐÁ˱<®øK¬jyº¹[mQ]Ü÷ ôßðCp}ÑÎ PBÑgr¹ö=êëv5¤¶éêgü`âe[k4)€ÃÐbÏü¢RÒ<8²–ÿÀ3þâ×£°AÊâPúS9)í =‰{±±¯ÏœíÌŒ°æH"ûXß-f…nšù'o {æ×õ‘Œû43\C£SŒ¶jÝEOYȬ–Ù¬bÖ¯–ËÅN~9 <¾-—˲HÂU`º=8ÃVñ5IÐ:,Ò{M¸ìð•Ðt½DƒVìU*}__M‰+k¾jS÷¼Žè]û6Òj ó’‚ÛÓ²·g&ZôÈ–·ý´G¾”>ÕW ì¶ …ÓÑ<ƒ‡€ãùê…Ÿhï ʾ *È…pÃkmkÓ%žÂ<0ƒ×ïSÉß.-tUí±D; W;¸„#Šhþ9 ëj¥A¬ÑÓÄ3]£,û¯E•볺ˆ#ª©²¨/rÉ”-¤5ª`ÞÌÚÐð3–îÕòé}– Ÿý„ ´X⨠*c¯†WSÙ iWè²:¶ÛLçžmûê‰ìýHï”òÄ—NÏ­ L¹Üöù4Þ«[mGÄ„ã¬øÓ¡³=òÄ2oGç9ýð_yØ­vmÿ}¨çŒ/éÁŠ™›‹e ¿{Ÿe3ËÔ<)éZ;Û¾tˇ>_5ûÍÚÀ­=XY"`ÖàH™6ë|qC þ%›0i×"¼î“žƒsƒŠ©Ý«kþH—m¼óƒItËÆF«ÌpBí·0“T³Úô»WÄG Aaðyv¥½uÓ/ÃeZû‚kÉH‘nа)¦F3êÓMÛnσìþÑ6Ëcd"e¼/šh>ÈúžYŠvãƒ;Þx÷k@ÙÝŠu¢m÷Æ×ª$õ¯m‹[‚­\H ªäE§Â®³·0àp 6êñ¯Œ"-ö/Rá5ú}xKÈì!Î øT;èù>W8'œ,sáýè®s¡¾QÎyÄwžK Çl` ÿ™Èœ}ˆÒPÍÇ¡¦éÕíML“c§èŸ…«s))Ô-}³ÊÛɽ…¿ NÉóÑ¿RÂgà¶‹¢z‹Mñ:3ýbüY_{0€ÄT¥_µã/°’ª!ô®vÙ…Ž‡ŽB —Ÿ „Û6•ªqá4“e$x%æD¬…®ÙœTTî'sŠ‘ì®Y¢O`å(4Ã'Û&ÚBºfìj7O&B­)3ÙL7'¡Êô±®Ë× :¹é»o ?@²™Üº¹ h5íWmŠ`HãBQ=Íd]Ü àË¿'=†qùH™ö‚¥¼œÂý÷þÛr½f–®íŒ[wŠÑÂ>-ïúS{Ãn]ÿnÚÌHÛLÈ”ÃG“QzÜ‹öüÕ•ŒgÔGΦ\‹Kìê›LtšGØÐÇT‹5¦AÈ~ªôÎÑPH8,°ÿ2aÃŒ )iØ9œ/ªVL0ÂÏݼ3²`’žZè{ai—܄䎗~-] P\œkÏ6l«§­áiðq° +ÅŸ6RžeÕ–±ÌÕOD³ûbá„ Ÿ¼×Éú©ß#†¿ºô/2åiXGŸLâ’/ÑàI-h5móWT1»JrË&ㆲlF]{t¿òÑà.!y^!m–-v˜0뤔›^âLïT˜ñë/»ò‰F¼àø¢eƾ)†S>•rÓÉ·ó¾5èë¸,¯À$ åcÒ¥éÝ¡ŸV! ì½îÕ¤Ó•ï&’³íõ†'àÇ5Ô·VV¬lIô[þÝÓÏÍØ5xôOwÌ ¿J:#«jëÍË=íüЉ]N¤Œ§Œn#»ùÝ:³òGß`†Œ"…:…ANIЏÚ\dP &)ºeàcEm±îäDE™'uÍÜ(\KD±M‹Jv!?ß‹>ÜUJ¡&±윮/}¨2^ÏUZ¹E:YÎ ñ|°÷%k‹<ú{8Øn(s3M~›äßÃn`«š¯J¯¾&f8’ø{šèC^zêÎãXþeâŒýáõèMr£À—曣Gk«þUK ~[œ_ôL*4›gHX‚·ãÒ¨X¤­º3&Ú®=3“­ Ñ B}/bŽbòâc¡Þ‡6³½QÔ>«öëæ-_uez}jSù×\ÃÎ ó'pXªgN Œ7"`'£êŸßð–^÷g}Ý‘ Ù^.â-ð½Ì!ÈÊxWb”F¼X%[jþÄ¥(ŽPSSÒ°$"›ë9Wü#‹û6w: ñÏk¼XÅË[ϰ* ñV*Jã¡°aW"p=ý.PdæÅ­PøÔX„ñV­0YgOŒ »p×Û~·†«7®m9”X0Heݸ Q(NèãËö ¯åaÞ{/BöS¤y ŠPï)ÑÁW# _ÞzÒþäD‚øÚ±bjŸK¼qÝ ¼ûO4Ÿ…-¶dFâqKþ[™)y­ÿL4—Íä#.ÍÑ„.û}sÈj¿z¦á-ÚJáˆSÒgþ:ÌÐëžÎ±p-àÝ@8ÍaXüLGYƒ¹¶¿Õ²ðƒ޳Õ.Á¿ VkEd5²!ªŽýî­Aâ„-áŒ$1DJq†1}S|¤_©ê,M«+;Zq†…PO¶å¥G´ "PþmH°gÙ+,«ÝßM÷ "¼€ ˜ ¾ ¬­û:ÉÌÙ=²§¨‰Ž–ÖÎjõðÍŸðSÎÍúÀÇJïÀ;ƒ÷Í`ú¸« Rõ(¢€6ú"6½, £õ~Ûö¶°.bOõ·Ë5´ þà¿EµåcÙgrxYhiýE<#Ø °\­½@Aü7`¶Gu÷GÛ‰­DÅçývÒJî$âS–*œ 1Ú.Wc*j_÷7{zgÿsŽ:PÖtHˆ;¯V!£ Z^ÜÆÕ .L.³¥"wì¢VS›–ó„QÁY4N£ÑK˜)©:sd’/MÝb0²;B”¥l’}yƾҟªñ¨…‡-±^KOO{íÜ=$×e©àî=Ë9 ‰ÍŸøÃŽ ¢ëtŒ}nÇhÁ0úIƒõïL±v ¯A¨­àzñ2¯:̃\UÿWts Øàë[@tGÇS?v›Ó  ŽAE.Ù3—5W!³VŒñÝïaYÔ µú]}ŽŒõ¤B:…z“udæ9J .‘fnßÀájáºGÇÏÖv0è/(þ©ŠÓ“ŸÁÚ9mÂyßR* È ÷SöoÊNon£æ<Æ+†M¿XI‰*f£•–Z¿=k'‘¤´ùÜ9£ÆŸ”1µµUp£w^°™0t’JEkuN—Mr£Lo±çð3(/¢™UTt9_~I‰Îïêÿ(«ºlE¼ÿGŠaá¹½ñ:!á”/?„xvÖÞþâÓøýk•ZWÌMq8Lî.¼ñ£·fajIw%<"í–¿._ÝøJÆÞM†’óTõ-b±)ݹy¯bdÑp;[wöûÎÏɱ)9qäãLU½Y¬¤v¹ÿ¥ô‡”¸:¼,twµácP®&tù¬ M‡[Ù1^ذJ¡`_"6/’uÞyåÌyÒ‚Svü–=AãbQ;)Xcû½é«†ñ#{õƒ°~ò_i„ù§='5‚Â&Q¢²eKõ„i³í”šãTŽòÙ²ØéîÉýÅ8nF`Ë@Á‘hmù¦^¾$·€V7ú'æûÒÉNC½šùw²S¹g§x»–l‹¹Ö6¬â §# ®æ;Û)×¾ô×1‘öãÆRî(®—Xr.’@MOrÅYlmm¼÷Œ´Ð–aÞÿ›ôø¿<–t/V!Ž1ñq\å¿§koAWqÓÄ¿BÔ›AÒªloÅ8L©564Þ éœ<KVQZò£óâ]ú³J@‘ÅŸIOjÐÐu&û‰£‘ÉB´Eƒø'‡ëo¹Ú¤þ‹©¥cCÜ•°–Öž—Z§ÅæÝd&òiœ5£%Þ ùù‘rUW:å×}ÏŸ 6 e„Úƒ>8,¶~pöR`–.;ñ‡ön¯#ÚYzSN)®Çya,b•|µÊ˜ô䮪FÖÈ iÔT6ª9½{þtb¯_R²¬Ä¢Oæª—ì³øo´5_ NÉT]¾7ïúAê™´å’+b¥OÒCÈó®g5¹>17|Ï2-ýÜ“ M¶ Ów™½We¬ý­P¤±¬SD!qUÇŒK¿˜›Ü*IDÏ?‡vŒgn®ŒíïÓ𦈜gœƒo÷݃œñÞÉ‹5Tüå@†®¥h€Ëb\ìö>sFôÑþbÆ:©oŸÈ/\¹pj‘À$¹ÝçUÎFcHêyP{ímâÜÙ?û^ÛäÇ; öÖÎoHº“ÍŽ¬b3Øô zµÊKÒã›;b$žSØm‚»â$&«oàfEhê› â§xÿНˆzfÿöSŠs¥ÄcE]É^‹–ëÝ,Ó†±!1Ãx/žè½Œfè@v¿Ÿâtõ"4»·w•Üå¨MË nC]ra$é<«SnöVcßJÜŒ§×Ë'$ß`5Ž0&íþøð_X9ÛX@½Ü\, N€ÿ8û.¤ endstream endobj 236 0 obj 20709 endobj 237 0 obj 918 endobj 238 0 obj 19965 endobj 239 0 obj 531 endobj 234 0 obj <> stream xÚ]ÔÍŠÚ`Æñ}®âí¢0]X£ïùp@„Á2tm‡±½€˜¼±š„Þ}óä‘)t¡ù‡$úã@Îǯ‡ÅSÕÓ"~ÎÃ[ºtסL‹ý·¢Ï–û—//m3†åëЕ‡4†ºi«á~O8¦SÓf«u¨šr¼ŸÍßåùþðávÓù¥­»l» Ë·éâenáaþÇOÙòÇP¥¡iOáá×þ0®}ÿ'S;†<ÛíB•êé‡&Ë÷âœÂò©úÚ•‹éÖ~ÞúÖóùІ²«Ò¥/Ê4í)eÛ<ß…íóó.KmõßµMÎGŽuù»²í·æùt˜zÍ^£#;¢7ì ú‘ýˆ.ØúÈ>¢Kv‰®Ø:±ºf×SG" qÅ^¡é‰ðDz"> endobj 241 0 obj <> endobj 242 0 obj <> endobj 244 0 obj <> stream xÚ|¹p&³6ÛvîØ¶mÛÎkcgÃm'Û¶mÛÙpóíó?ÏyÞꭩ꙾º§ç𫻦æ7CA¢¬Æ bîh ”ttpe`adæˆ9º9[ÌÌìŒÌÌ̈bÎ@WkGqW /@ hq³°rX8y9˜y™Y,<<Ü5Ü\L,ÿæ°±ppòظ9˜9ÿUYÜÚhæêèìÅôßÕm=|þãZX;˜[üM˜»9˜4¬¿¹eÄÿõ?1K +€™ƒüzšY˜þu u/'à?1–á&æ~>NŽN ; Ÿµðï€èãbâ¸:»ý|þÿ‘ÿé!²°Ì­Í\¦@KkÄÊË8X8X˜ÿ ÿ¡ÇÜÎ.¥Pÿ[.À_±Ìì¼æ@ D&EGWk3 €ZÌÑÉËÙÚÒÊ@mFóW/nú©ÆüeùDzþcÙþ±œÿX®,7àŸÔ¼\\ö.3Gg'Gç¿Ý0gDììªÿªìPºÝÿ¢ÿ›…¤›¢‰ý?<þüÿJ0±·¶óú¦hÿ‹¾ÐÜÚÍþG­]$­=æÊÖ®ò/ÿ –q5±³6q°´˜ÿ Òp0:ÛY;•]¬ÿ5VVVöÿS·²6³uº¸þöù_! ƒùÿ¦ü·+ÿþÏýKüUÇÜÚÁ æúwLœÍÿüV6±þ÷¬0ÿŸ2ÿø,ÿÇW0qu¶öè1ÿí(ËßÄ¿Ûþ›é¿Çñ¿Fñ?§ŠŠ:zú0pþ½'v'€›™Íï7ssv:¸þ3Hïê¿} 뿞@38fe!Óøá6û®OãärñÝN\W†ØLU]™ÝQ±Ž>WÛ”P<5ãeâ· é"Ëæ:ÙNÁr ½9"ÚÍ´M­Œ£Bç1Ñ£&Å£Ë_Õjži½H Þü¦ÍõìÆ¢ ‚ ÜžL¦ÈnnP‘tZwñöö< ¬{-4œ7æ¥èG¾V_5Â%f(Y2’¶+ì3‰¤¯ˆ¤ 'ÚAËiMßæD µvª¥@!· ~?Ÿ}Ýß 3æ:Â7$cÿ¦þŽÚP@oÈFã'Åkñ“6Š…Ö'(ÏR|´Òµ•k’í¢¹¶©·â:#§ÔF­b×ÏÂé\YN.¹hÌ›s sœû0ePœ­{ÈuÁiµá¸`ñ"TðÈšïb_öªnÊÞØi=b†g,ORÑJX\‘ï¡ßôõûpµUVQûqÝIÌÁuú"»ru>Ín4˜E*nP˜póaºjÄwEñ d&˯*ó¶Ÿy ´¦GYgšoçš1Š\6u }%N @ÎfW•Khↆ¯äX,ÕïAý[z<ÒHªØÖž ¶.ác>!-dzŒT0HGé'`‹.Pˆ L{T%cÙ€i6À¦»ö2O†kêy[“v×M}Ë*Ú+ãhŠÅ"ÏCm„ëd˜kûÙÝàP ¸@{¸l‘‘’E®˜å—B/±Å𫨳2$F™m'ç9(&KXÑ7+Ûs/¦üv‰0ÄsÁã”ÕIÄ,¬)Ç}÷%‡f¤›žWY‰þ/ÒïÞó–RbeY7ÃÏèÁÍGݪš8VÜcꑸÔD+¹žÞŽ{.$9ÉîÓHó»U!šãSÕ7Ÿ+¬”œýêÓî:+JÅÂùX¢ÉSÀ'¾î/Â߱˨ß镦Ÿ/‡-¶˜_6ÐçStÎmŸ[~˜’pÔ²¶!SqzÂÛg‚¹Ÿ– lòþLrIõPÅu  SÝ=’ü>˜²Tà è¸0$Üî!²^IU)kQlX•õñrÿÅ.j¶FWJhµÈ7úâE…Òù"q„G~ê õÍ`v±PÊã‰hŠn*ÚT+”ÂØt±(Ø´üroÅÞ¸‰ÅÎ’a œ+ÉÚY •¥Þ©Õ–â"yà‘Gø½èXÑÉ#Q:q³sØ>Ë5Aªãª^™ó“Þu›d ·‚Ñ€ ›Ï÷w8BýÎKŒòUØÌC Œ½½8LˆnôßÊáõÄÓîD‰fd‚Jv­M·Ú5Ø®˜˜(…ŒóËÖA¤§žgŸwù#‹¾hÔ”’JeÀ†ÀË\˜ÂÁ°:k’˜Íä´…ËSÂÙûk~>-+-y{Æ"Î/<‘kêäÐî5 Õÿ~bÂy©Íùr»ÖÝ“UóÂÿþ,@ä‘b’ÿèyÞÌÑR—NlfuK7kÿ.3Ä&I(ƒ¾N«Ù’+ËÜ dÿ \X}Ú]y«NŽ8ÙL7ýe‹°CXàì¬'¢ïSì\‡°»7£ó¾ÝõW*—0ã¶ ¼pÜ'v™ðƒ^Jnæ¾¶w4TU¦.¶|:> lAÞ¨†TŸÄ’ƒÿWT$£N€¼×p§ÈøWd>7‹±.¬‘!æ»§ÇJ¿“ûýÞ°o35ìöBì{Q;#’"ß|°”² ¥GúP”*ÚÄe  CµÒ7[Ó?g·Ös÷L„µJ…d¼;][‹rÁ¤ÜK} Ù[Ñ7ºŽ¢žß¤ªRõtn 4¢± z¼Ð\”éGÊ£Óûì’Ø–50féŽg&2ñÒÌ2íîq¦‡ŒaŠŸ×0ðv1ßW·;ÛÅÉ.'[î‚H °ñÖ½1ª}Þð|¥K?“ AË/­Yú?“©åhPqÛækÝ͈®s7Îú<6=ºŒK”â†/}µïœÅ³D‰,©FOh Ò¶¤Ø 7}/íñëe¥øFZ=yd;·%kÅ6gß®eô¦0”ÚleëMIñâ%=b'…“ª¥ ͲYˆ(r2Õ8HΜÞÄÃíî·þÚ)1æ‰}³®Îw¹)FroéKÍø%jßR9Q¾¥ÂþÄo¼‰XïÊòDðvZ«#áìúQ¶¶¼U/REÔŸa\Ýä¾3VÚ^¸ÆSÛ³Cúü;ÿb}M}~Q»ñ!_ íe¡Õö)Y3Eü›ªdx?:ÊÃçN¤°½úaÍ—ŠMÖ ­O ‚YÉÕ#qüú’m;s–¥H×帴ú:áˆ)AÜ 7áp¯.Ït]Q¤¤óŽ ¼Ë­©üŸ !þQÄŸvÌ…œt£‡šÕ¬»É›á CÑw¿ÀZ×LÏœ‹A6ìŽHbi|n˜ADî4d$6j±&ÁèËçvMn7§»Åèm–a$Œï±?*×ã_ÞùªZ) çGLÒ$ÿ6}F£¹#œx¼Nð›ƒÕž´u¶öjûQ‚•uºÀ¢Qözë¾z9º#cï×ߤ)3²7DÇ âRù’’]Q–Î@}•]Üæ†&{þœìÍ@Xs†ë­;¬wÁ¦ÀçȘ”Õw \´»`x–Ô»³G"°ŽršúwÇ]„n4ž9¸y•Í#µoΘÇ$ÅP¿ÄИ®tE¾cw>y5f”Þ>W¾ðû à ƒ™PØû>Æéß®÷Ò(#£_¯8#{}Lù‡¹¿þ‘¼¾ŽWÅ"¿ô?¡Õw²yQõ·³gˆeë•6éìç˜" ã±9M!—°þ‘SÌ·3ê©‹"¬}±ó#Â-至­\ø_Ä€íÓ1!ºk$þàÜ:ý8¥0ëŒ Úk€Ç…{zo$d¡£´O>z*è†Fäi‚Õ]d¨î”÷N¥`Uãa%áS6¤‰Š-—‘;Û¾Ú[§„b…yÆ©¸ca‘>Y¹{½KoÕ·.÷Ù³ ÌA?ÁÆAÊj7ë©ù_Ëb)u1=·ˆ,š £j¬ëORµï$»ç0iYŒبÏÉŸ ¦iý ½b]swnXâÎ8)Ù Wós #Ó€ùú\¥\×-óaŸŽôl(ƒO`f ŠR£WÌÊ!ë°oDz|R¶²ÝPû‡»Š+·=L=OŸí&ܯ•ôwQÄ­".šÌMMÙÕc%Š •ç:þàž~Ý!ýà‚Sªè·bÙ'Vøøø¸¸ òOwm,FÄJ”ýL1ú‚ë±×þè0ÞNEBÖâ¡\— «ñ5šRP“Ðù¤™xK ø¬/(§| Šë÷ÈI²®¾¸Tnj/k ¿‹§<‹7Éãóé"¬ËMÚ綘}ñ¨xbÉC©€Œ±kìsÍV>þ\ Ó£‚Ìä÷oÚkRoM–ÇC9‘åKDÙVIûÅhÍóHãsÏKîÉîÍ(÷)E`dŽ“»‡Õ~Ú¡ÇG̱õ> >¡ úå࣓1s˜îg|®®¹šéTx¶]×ÞEY&–$ìjwm!ÂEsjÃqˆ&XïÖŒ‹4ßè$Ù{¦`´f·øpµ4éι  ÷ñz„®†ƒí~ýÆÃYÿ6}U´Ö#…x:¨0Iªmæ3íÿáä ÁæGÍå¶1íRhBù5l­õ 7h•!´›tÚMDÁ‘Q*ž%ÕD~Ò"Mì½ß?'€SöèÓ#-{÷¿¾KšÁŽwRZ”XÖµê¸n®ÈÏòÔðá ô¸œñŽƒ0ÓR6ùè¸é÷ˆ°(ŒFj@Ÿ…- ½z¶1 ‚»A½éÄcÂô’o¼Z äÛÛŸL€¡Bã†JÊÉN˜ÅUš~;P±Î¢4ìAö†_QµlÒ&™´ìÖŽßE:^)\ˆkÛyçéS]¹Øí=ì z‡3– ™TžDfM>¶í%gXMÙø@ß_^¤×±üy›ŠŒpÕŹîðTÄH’Ke Sø—\ UzBÂÔèo ¤úCàv5í ³ªÜPÖí5ÕKBuÞžôŸæÅ‚ú.8G6§ˆƒÍF»vŸmìd¼gqµ]«'ÙxÏSÖußËàZíÛáŽMŸy± ¶êZ¦ÈÎ|Ø€ƒum½A‹‡9ä~pTU†O¬]‡Þpæíü»óL…“+ùäÕ1ΩL˜ã}¨ƒžè(o˰÷èeܰë;É­JõG¨On¼"¤9Çì{ò\¯XЯ¸aåmׯ ݾ'3pLÚˆ —Ãï|·ntÉ—¹K8u®Ö/ßž¯ÌèBàF­%5GOwúkTø¿1Œ(Âû"QýX½öSíÁV’ ºŠXçY#e-TG6‡¶Å¬1P•,¸5n‡3Ë®:þQ>³“tkøiŠû?Ó!㡲€®_ùY )”_© ¡2kšªã@Ím:¼Çʇ]ú­´/…;$¯³ ¿´/Z>2sÂÖ.bT †ó‹bÍŸ%uÉ¡§<ÇÙKÆïVʵ‹oX w^l={w䵃VJwlïèu4U½µC=ý5b;òÂY«òûõ9BAßÐô„Ëwz6(K=P? … Mâ”þJï)³xS÷]³úãÖ{¬5lÆu—P†ó2š÷'9½«‚8˜³àþ`V+4|ÅTYn¥µhß>ù]²‰\ß :Ó|oA‰ý¾ªŠ-ˆD’%ûŽ\?L“-X¬Hzó²—C!}2¿îË;³fÓøôË.íG~—ŒÙ²©ªÞvÀ3er§ y&ÙlþLˆ«ÎX?àÜ=> r6F]ÅŸYð°„Þ‘¤¹4Ó^v–¹,Œæ<°™ InVV¾¬ò’¸Â´ýµƒÃµÐ?¥ïæª]}ô†Ï´øW-fŠh®ŠYN"ežJ½)´Ø/ŽWF§ ð<Ó­"¦ÓRbüØ™e—0ÒÕ÷èòrü±g¬²9Wä!ôãÜÈâ'~9£ÇKVvÝ5ÊWüʱfÎÍHmVÏÑ*³Œ¨ìµýny»Ÿ£ xžKêwR«E‰XX-vóq 9Òýc •*)×;ãOò&~³¢×Õ>Òl_ˆz#‰€ÞtÔ¯¦¨ƒ‚õßÅþàm êpÄ‚ËD~Ú ã_äº1»>\ØFˆø•®ðh Ý{lµ«'¿®û¥¿¤C„¢HÞëOÉîñ˜td <¹-~(«‰çuÏ›g (ãAË.ðȵ˜:Öçûžõü¬§è-3-EP#ë –Oýaô»¤:ÉžI¢ÕõÞ©ÔºŽéòÁã'»ðõÄ[«#;Ã"p KþS;)°Ü†2y©‹„ˆ–VØÑ-“ºíÙ-´ÛÆË¥Sî‚>lhܧ{†\*yßZd, KrSM3z:ÒC]ƒƒ¢øÅáùì@Áš¡†wß$«ÃF t꼫åuO]0‡Þé§8]¤'ãÐyMfû©ªoè1<è5žËV7)측[×3œ„ÄI©Û¾½ÚãÄŽ¬±»ðŒ9´î C”ÕðÜ¥®ûÙli¹**Ú VâÃÀG³içì{ö©!×*97|s™¶ËŸðbBxo^Þ1ÂÊ÷t4ÙÀ q<#0¹O“t7.ì`Ä«—ÂèÀZÝBX|¬£¯ºªúvW ù £M†UZ–ñBEƒ½†›%é^P », Þ8DŽ(Ÿû.Û¡˜< d7…t¤|D~õžÐ/oKã›Îiu'G:LñŽØŒëÆÀ…ø*.…õ· Ö ^Òô³ÀùEZXg*3g}&8 òóaãÊ1yhüÂj´¦E~2½ý&ÒU/k“†Ý”JÊ×"¼²AÚ@¢ÄÝ(?Jt§µ߀¥Ó¼I>—ÈyúÕ<µ"³ŒZ A@D3Y%‰¶ñqÚÓ¼°…š¦^ÅOÑÓ™Å]ÊÀ¦ÉqDa‹?hI‹î^bdžørèo¿ée“%ˆ›{2·5˜ðÂ1û>9T~:¢¸nÓb 8é /AjýÐhˆ§ÅÇIy5žpã÷'ι b¢r!p¶2'_¤!{¤õ 7–Bñ‚gž ! 0 ²yð1ùq·>ý‰Ži¥ÐkÀ9û¸'öâŒÓ“qlLe)$¼ËTz‘7”vÑÏ‘J¼nqº¯lZb¾3ItW$j”Y­¨IDïKÕ~:uD¦€uHÏž .«¾å½œè ü@ôId+w䊥€¥x8[› ÔŸ7žŒ(F]eMx¼2Æ9\¡SæÔÛL1·¦rN½VJ¬µ.tg<¦^wá_I–ÃÎZQuïØ’•^8›Å(Ï#ZÊ„FØ€F©Ÿ—ýU pZaób:© ‡(Ä|qŒˆ"Èu!j-•lñ¥–^²’õKär§“W]›á‰£Ù23¾kº¥­øð®zŸP™Û0õEßT†¸90Òž,š/³îÿn©XóPµ"Œ ðKjNXÛF¨â‰è×É;arþoÉ-¡­î”ŒP¹DÅðÚbÚ:Y¶]U”ÓÞ[œ²0WÜ&”¿éϘäÞ˜>CÊò{à–È#®Z¡e99(°raRÔcJYŒ7D'С1™ÕÄú½€ Bkr­¨`:h™Šˆv³×.€$]8nLî@Ö癯“L{éøµj[Nߺ4wFÌ‹ÙKï¤9^ëüb1 ²Ìòür¯Wì¼O¼ŸR£@ÂݾWBÒââp±Æ¬FPa7™* žm{Zx9-¥ú½Ê uºúf*8jt°ñËP¶8P:›ñ ý%ìÒ ˜}AÃtCþwê(ºáëdØúbO—Þæpé}¶¹˜ óÀ¥Èe\9_jû6Ió‹ž©‹õó«Öá„@¬ç9‚z#¦mE$Tfn3ÆîœÑ©N%¡Î©„“ !Á)ãË8UåÃ…¬Ò5z4ºU,p†KÞœwƒ.L„:¯¡„&¤XpŸÕ«Ý‚˜¡K_yÜï± H鈄ç‚p^poCw”hÜF“È-ºí1SkW~„©¤•â·+Åô ŽtßüÍ#ŒådKƒ<œ”YA©A.o Ã‡¶½‘£Wn ¹a†{1¥þ´âf, ÊX<9ÁƒBH³ ^R¸&™h[—^bÿå«e—&ó%–&™û¡¢' ß–rϲR×È'†¾q_¸¸¡Ûÿ î©põáGй’Õ ù¦ ”ÜL&¼CÆDØáÔóäëŠT 'OMN–Èòö«Ú-<è—+±˜uïµíÌQ³‚öþ´¶ °Æ¹ºÂ™„sKÀûÑçts$1µW:ÏÂÍ¢{¡ú3Lþnt2=Óþß¡^O8QY:zõ¨dg A -º¥¼€úª?Ú©ERð—ŽE yP‡Ú—© IÜo1ÊCgõgrè=#äÖ܈nv‡öTù[k×Öhp¤4;RÍ[ 8ËœëÌ€.M¥ÔgÝ·'1R˦,LÁ¯é¦¤?Ö`?b¾áHÕú„nJÿÖ’÷©&?¿øsc¦’‘Rå¡(,„£@4¶Ry ̺ÑÖmþâʰe¼œW$Ü–üåB‰ëce†-¿H›-B5˜44Ú›àM‘!c]ÀGí'T¿•“‰T‚kïVSØ@pÜï3 í#¯²ÄZ– ¡b"؆¹“›€“¼¼ÐZWXß jäÄ$o›©õµáá¦àsߢaNêáÌóÞô Õ:†|‹åíÁÚÑíÇåæd7y‡×EUèUIðª¥W¬WLÕ¹‘ÙHºËÙ³ od ¤$ú±æ¹¦Ñ¶ˆV ª)ÏÈpOìŽÝmWX v‡Uy`]”Œ¦†(XˆÕÐ×¶ÄâëÚ²¥•ZSƒêHdOÓ/Šhˆn¬¡9‰»¨˜Üä섽]võãÒM¡"HŸ¼´¯KÓŒÝMð²WÊZs_MÓ“¼5qn$ð•¾gW÷BñÊÒfý³ZXeˆÙ¾¯5¸Ôʥșa'ð4eˆºeoß‘=ë^¤“NzcåØÊ´¿æåÃíHoEµ£8ÁH+ŸÿEðȵ²ãBG_e”Bý&¦ÇËa•_öšÕI± +óý/¸ € ‚!ÊVçÕ±ž)ýOað€M×AŠc+-> `ÇcBìHòwÅ îty ›Ç  «1§›âÛ™ìÊHú/ò–¡’©éØaÁGœŒiÒÐ4æ,í6‹qî\І=ÂâbšÂœdèF …ÄKùxˆGÒ/Ͼg3SÆ3†Gòi´+Á³?:Pi©ê§ÞJ5M"»Ýâ„÷3ÿù>Ò }ϵeY¦‡<úê0br«î<ȯ*”´NèÕÑ`^=`ë±×˜ˆ³Î•›4—_´ž¾Ä{‚6™‘ Òß½þiÂlñîA&ôž·Q ELÊ xAZ†E@‚¾Íøv$ƒ¾ ¨W>‰ñëâçÁOµ8Bø#:æ2T#£Ê¦7=Y¶ã+è›ge„H«EÀØx›7ýB)M¹ þå(-ûò†(¶ãs¦g¼|T†[‹<µMìÙ \ý8¤3zª„XbQG„äe›e¿xO†ñ"˜ëŸgž¥¬ £¸üõ0ãÀgfù/ï(iå’DS°rZo" ’ûËé""]P¢åÓ#%6iS¹@iÿ'mÒ:-ë³k£WI9³D ¢cEŒdKJIí|ÅcGÕ [úwßÑ nòÅ,XÝ/ãzVáVU•]ƒX#ÑÆ}d‰íú^ëbøŽ^ރȄ×óÍJœ‘L¢$áVZ¤´þïCCTh !OÇüÞ__š†>aÅ|®ÓêùÉ·æf úBë°pï@D½çNÜâ$Ts“iaèÑ=§Ì•àBÍMÐ]î^ùfî†AæÁ ª:YhÛ§8Å-}ä½Ò¦ëJZ#áŠÀ;!hœÛoW WW<àŸoæG/ÈÚ0×0w_5Xân=1–aÚcìCñÁ¨ ÒNg®5C¬y…[ÉXæIËúÚ ö´è58`ÝÈAh7¬2°õ:m E'nj¯CS®OýŠÅ[äF $yêRàØ†À¸¡öÈ|*ú(–PjNpød“3é÷Mq‚¤ËÎÃ]w;G±YNÐôõ8¦èóèŒøÞ$˪ ÄØŒ_ã€S_:Ñ“­ö ‰awɈýSc3ÜFØCíaÔ*p줜k¥²œŒ$p1ˆ”: :^‘Î b¥Xä˜\ /S—³á#’æ¥%rÁ[½X­YÕ߯PÁI‰Véǽ~þ‰û[ÒZ¹·Ifœ%yüœ?X·±9º¾‹?¥¾|ÁÈ8Àß!³SL(V- *5R”¶MÆÖÈ HWàüF·ž/M {ʽ²Èšq½x=ûÏ¢š˜.R© ÍÊfÁ‹¥#‰oì‘{o2n7 µ낼Dƒà]žä2fqÌÎL+ñÄ• S[ÛÅ( ·‹ÕofðédÙCãJBIà¶P’Y‰©:œ´® +fñ8„)bàXÅÖ¼¡¦¬CøJ :sNJ3Ìwå&?¦bûæò¹ux¼'†y}]¶n*"Ž,×ýÍxX2q¢‹“qTÔ‹_ùŸW³Ç÷ÊÃN}¬ÜËëi6ÎgH|9«ùQ¢àPÐÅ•À}¸DÂh(è.q·Ï¤kRý”Ö6dª¢SÒ#s'— REk^îª $Éa°Òø ¹œa¦ïpÖï)2I Õ¹äB.ö+Îî¤xÓrålœ1ø-: >î“2%r%Š»%uêEnØà»X³²m“’€·gºñ8.+tðM‘àR ]Új¿ÞTŒ™¶²Ð%Ç r&ã.úd`à|„Âs´rÝÖ-Þ9yñ.®“xçäØÌ õs6R¯h=Ò7$(‰{ÒûôG§?³â䇸҇èMmÛ°q¸§ˆêdÛqD«âZ4-z.>#Œ{·õ7¹G˜Åx< ôvcMâ­L#ù Ò\»|<\q[-¹ž²Á¸ ÇD0z$©äcâHÙÔ—¥Z–töàáÊûr^Ïbñ¯î5½··[i¾ÐcÊÔ,fÙ§‹Œ E±ÊšÖa÷’üë¢ØL©PzEÇSß=? ¢ú±Óá‚RY]A݆]yá§Ø$Äè½vxpEáÁ†0\,pç’B<›M¦î—/æ1oöÉ´ß4WÜ5Q•ª÷†¿é½Gа`lð”6>‚H¯À´²Ù­Mç›ø¥ã—‡²ksÿ²nzðJ,9¯Ý@>ªÉ™°ê5~áµÝ3õûìÝ1sW¹¢{rC¸~¬E¤î`R ’$;ú‘s¾•÷¤­U/?’Ÿ[à§ Â%Óâ"³bjf”˜ÓŠø—åð­æì„®lWOæ‹-ŠÔ ¬œ‹wßê6)õ3‹˜jžç۳نх§ª­`&R°ì‰5ÑgnõÎ턺 p-ž´Ïir‹Vá ɵCQßG+bdZØR« H‘yhMÈ.dž爹äa³:[0HGN0&f“ñhI‚ë#¿+æ(ù3½u2™Ñ~ù ¤‡V)ÂCWÑ*äà°c§J$q›ÅBw Ÿ<ÿH3‚(™Ô&©ùyà•¦µU«®ð2“Ä µÖ~*jü­yˆûvoÃV#mþi]z[‘Ujv—Oñ*XY;÷±‹GnjIÔ5Å^—¸ŽDÁyÇÉElô@J nY„S %êâ2”Ñ]‚Lð2ÅEò¢ V¹Ü­¤ìNlÄYƒÞjtDÀ|rç¸íø©ãìÏ êc1¸ƒ»Ú‡ÜFÄ=bm4j–¦@E±±U€~hGä#V>)¤T§Ô}êb±7]¸}ì0ëÑF0 J—ôÃ{‘A V(p+z¸Èš¦bWµUë9Â"‚ê¬k—Àèq©7“{—éuèíQ@—Âͤ2ã'‹t°:Áˆ—z°}íÑîЩz)}:ï Ðsßõ#£Ûfû­REŠoÃàyçVê¨Äp2jcÓŒÍÖYi}!•R‘. ë;4c¹ÛIº ù¾HGÝt,e®ÿÊI¾€d¯;×ÄR€YTÜ´ LÞ+¢Î /8zÜX ’ù]p†‘Ó˜ ä[DVi.S¯Rϸ¹X»øXñgûãpF5Å®ÒÀUi>Ö©ü;<7ˆXEèOKÁÿóçÕǦb­*êÎÇ7·|QŠ ‚Æsšÿ-¦ Ñáî!áÎE;âk##/Ë&Øîû“ØI¥TªèÚúîE£w¨Ò 2•Y&$iz&ÔNêÓÍŒÏÈÝÊß NÝ\Jy%“A>~Ó495 Åó}ö†î Ä­·(-Q°5¢VC Ÿd^µ7}¥©lœ’y®cñº½}ܶ¯ôc¾|Ô»"Ìw¢Cî®R2 ܦjhÊúM.?5´|ÈååÖ@¤ÇçÎf¼ß-ÿþí—†Æ!i÷[³yê1°*­*§ù°å¡ÕA'A1´Þ!QÜAšT••€~—Ä»Á¾<©ž!„Ñivþ~áw7p£ðÀ/e¤i†¯±múÈG_Nåd–BgK³‹$˜e ,¢Òܽ gi¾KèÈê`eº€È~H´âŸsZhETwx‹dÐçñ§TÁ¶sðßÄø0šOû#›+>r\áÿPG5EoËî ‡ÌJuŒ«RÖ¨y4«îåt¶^'îÌy`J'`Ì›¡¾ã†x¯:WTH•°êèzŒ"ÇcÔ;“rš¶‚Å̉.Ã]–Ë?l4 ”}&æ MS·LÀBºÖSÎEñÉIðs?¿ÛkÖÌ›ËwNG× fá³éöIlYÓey†@à‚RjNX䑵&!«ÒÒÅ`Ál1}WáïTëÐaÖ°(rníàÔ1/tgI4c?*¿i®<é~ßB 9ÇtE9¸é w û­Ý÷ü§d.¢ÃDxg<ívÌê<|ïÛ¸‡'¶Èt32¦Ur•äèž§‚)Ø“VväC¹Ž“¨ÄE¿mزÆò}í¬+jô–‡ —E¡ˆ0Dªd3Óƒ+‡Í;¯†èÉP‹¯ˆ1x½3X‡Ò0V—“ƒ<²WÝ}ÁÁkᾈ£ "–× Ç8U¯‚?O‡t8ÿºËDå‹dæ©Í>ƒ6É¿“*%q‚á}«ï-¢/Õ= ÂÌÙq59Öì.݉dÁ$®ZıÁÀçÙÛÌ¥a*ö8†¸N‹°‘£ Ýð¼#;¾\[ŽŽ}Yоx”bá@Ä@Aª‰iÊL•S‚à>ß¶í…ÔBÅæÙ"y(`})ØS¯º¹£ÔÄVSñm«‚ÎéÊÓmp’@b|o…™d¯ǂ!wº9%䀤šºÊVöÃ{º"ú÷ö ®«à‹;?vW~}š[¬D“·K®/Vméï^øÌÄ×׈w“²X;QxìQVjÕ'q¡õkvŒiÄé>A—ѲÛK‡`µ’~t~4Ë<Š‚”°ÁMÒó¦=Ö%¬ý¯¯è HŽå”X¥Â@Ù UÒ=ÅAKÉ µ^HÔa´HÈ•“|s$#P8$£±¿Ë F²®Ä]¨Ð3“À†ˆô‚ß å&Âë/ ßµóJ­öûŸÈ7“¡Ç‹$Lú6~U`é IvÏeÅɶߠ>¢†ndÇÃu±|X™b6“éð: y‰Êä‚¡|Yvg‡ô¹Y \w§)ÃxWˆf>Úì¡#¨2÷£vETÛ;z7ˆb±˜’pÃ1ôÝ›?ê±¶ÌÌýC-ÞÊvQH«%ó!2a«Õ&´bk±W:¯ò·x£Î×7ÌxS ¸˜ùu†Ò‘œ½íÊsspõÛ¤®ó¢'tÇÕ1÷¡ž¯WX’ÒÇZ•MžjÞ‹—Ê­lôòRaåt.±¹?’Š÷8&xs¼Ãëù¾9•L‘4¢°·6šu£×ªlH€8G“æ•ñJ],CNµŽ#ƒˆ(Ù9Àjò6¶Ò¢ñ,xŒÀ(ª…k^#[…ó+Š•¯æØÛÆ…<…œž™[Í&.0¾V¶ºüzÍø±æIë¥'\*žUS—ah 9g)g³1éÌ"Ù ¿ª|ÃA§EoǪô÷Ñ¡0åãµ™³–h%2HÛmwÙCú©’±“ëP©‚¹d®_ÞED"̶/²*BÏëÑH@uâÆpâ’y{âO ¦P°_¤‹ïW´ƒZÁÃiPuõ@Iü(l!>Q¤TØ£¼`ü!‰LŸl|÷¨ÏQ¨®GÈ´íøSGM58Ÿ¯n¹»J%Øø·Hbeúƒ” M2UÞGõËQbjPÞaDM›“Ö??{.ΛOw&¯D’ÊŸ¬¶ay‹dŠ‹#;öYð#Ð>ªI¥czÃÃ`ÿ%û)™C[¶õÓ«wòõ¾™ÍXÐïÚɪ%- 9áÚ9¶…¡EšOÏïlƒša¦~ŒŒEZàAIÛc¶Òu]Ç'sK̃XãQ—ÐO˜ üC®%v}Åõ¢H?F3ëWA¹£‘;n –^ÍStbÒ”øË;l ªVÖb}ÒC×FlŽä#íü‰ ™gF ˆr…Þ "-i…T ´ee®­+ऱ‚f=7S³ŠýÏ9™qS H“ˆY 7&U":&×é÷»=‡bÝ`“iñ•À³Y@¤¦W·[D[Šôº×7þùðR_þ¡žæAÖüV}%Z1ë×\¯üÄL(˜‘`u´î禤²š„´¥”Bÿ©\ª²‰xßO:'go×brì f¡·¬å<Ñ­'*Cû-èh-døøÿ¶I)ÞÍ(©^²|º6¢V¸Nþ/ǯ ØÕÁ"Ö6^¥þÁ}>‡§‹NsÒ~‹Vø$…[ Z½½6Ô’Fµ²ri)ODxu)Ê¥¬CÌ xî< 0xé®a>¸±åš"‰-éjGve@p­ËÎú“Ý{¯ÜàM 0L|<ÎÇBrìGж˜ª}Qr7ðt6åZÁ9©ù÷Dåó%¢Ý%¥Õžbc™¶z®ò €¡€É`á˜oeݱ¾@Ä]Ô#o‚ ¿*®Ÿ›a1ZUÒÓž»•¿¨šU`ˆó-×þ©#kî{¬ˆÔëa‹/U…®(Ùí×–)jMùðÙ²l>bew²”Fú@îÈsÚeÖ¶3£rŽ@¢B—×HÏ×ÛM/ß­sSñg²æ7s~ì‚ݳç¸ÿJ‘'gØ’c\÷Ŀ姜 zƒ\k´xÔ­`ò%eb±Ø:½yóAšvW,ÌLûÁYŠ4Ë}KªÌÙÚÍ 7ðÓž §·èå¬zòm Ðyzz.OlòwÇ.‡´8ÝA]û­äÅpždOThç0ñããw€þ‚$ DËÐFzéO%8YŠÍÁ¹Çmª–hQRº×³‹Ét"ÜðqEYû ]ºÌA)øaØ}ÛÔž-8²é=ù^ÔH¯cªÍ!%ž¸Ó¹Ï…‡Ãù{!i!6|Ó„>ñO#H›{¯¼ÑçŸ~7¨Á ÆÙüµb†ÖGËü¿¬Šû|²•1#lÉú‘Š£~¬…'ÙmÉ5þf§ÂôHÄÔR'Z*øXíª¤óc986ÝÑD˜Æ~õ\N%Lv?L¦A“¥‹9ÝDÛ ÀŒéGg”´ÛS~Í€f\UñüV‚ï‡g À5Óµ“ú}…)*yë” €æ»"¼,Õëg¬}EÈ"¼â0C*É‹ÏE( æÄ}T ýFñt„e7ïrºù32lh½VÄtôÐ,ÏÀnÐôiæáî˜ûþ Q4Ÿf“ô¬AL{gÿ§˜J·“À–‹c*s”X–Ó™ò(D€•>΄Ÿ¾ÌÁ>:JŠaãÆÎÝ­êR1|؉¤9ÂÍð%‘ãg”‘MêÓ± yG–’›¶’‚¿HÛEUü;ŠÎ/¿ç¡‡ö6‘=¶)-Rª•”È-ÉÍ YH©åù)L§Íüô[ŒuïƒÑyUÍŽ*%û‹öÚ‘s/3ç´ÉvKdÊÉûÒâŽs×ɑ׆¸fˆpC&‚+à ±z™BOðÑzbÈuèR¶FÊqëd®Ÿz†à±w¶Ë›»‚Yö®²¾%e<úñ+Ùþö\P0T‰ÿºö6ô2ÜšAÏëŒùúÇúÀ»riãÄ|W¡ÉÁš×T”Èö±Z ЦMÒ_L³§@%„ìûXËý2¿þJ3_|Ö>0ë2·4*rÏ1=r3„Ì€áuä”)œcÑ I=ÍÖ¾åW¬ÁseÉ´jò¡«A>Çøˆ€1Ì@LÍïhk³ð¯»Æ_«Jåk%÷‘Ý2^Ø\(z.tÐ]aöâãç/ UüIÅꃥA5Óö:0 ±Å²“*TŒ(B–½3Šz:¸24/,$@ƒ„™•6Ÿ¬n¦EÀ ,+%†fúÙ3",zÐN­VÃÝØVxé™îkYÚn›þæ”h£¶È¼ÄñÈB?DÎÌÈL„oqÁYúIKqx:÷¶ê³)7ûÂRž*çÜ‹¾—߆±c'cù£0qö*¶VëÇýõdÕNo€¢4$¬IÓmWš®1^ã®6Qõ¤Èùù½»Rqëlbli§#Ž~)sf²a£ˆÎü³åkn3·¿µþ¾»ÌS³‘GжŠk ÅÒbJéu³O¬ÁÌ‘òË=F¨)å‘—%^ †Ø‘xµ¿‹‡i)¤·l ¡¹Š%&¼ÅánTªÝUËYC¯d|;¿ïéÆÅø€£Ìï8N%%dGôdÙíè ‰l¨¿œãç. nèxVùøPãÖÌ$AÏ®ºÓ]_ocùˆ€‘qòmÎ6Ò\ŸµËçßõИ83”Ou ör£ô øJLö±\§Pu·±eþ•ºOèÆß-·ZÀ“)U¿{‰Žv‚¶² D£!Lé³Úaç=æ»å¯÷ϸ´ø°4<.ø·ó³6å%Òi£,Ü•ñ¡[Û}”–»U» ¤|é¿åVÖÇN»:ÛK”nL3é æ…q):>Ãàa¨A XvŽm!ì2Žö€ærè*ÉÂÕÈY@í°”ü$1gÊfÂâ,"£{$¿•è¢Å" ¥Úýè;évÓÑc߸ej3d»^þêèrÃÁ)j—«ÃMò~7z «Æ®q©$Ž[Û”˜ÏþnBD PC€´R6v¯,ÍÚcP¼ekiN ¥Œ?‹K™yªâzç8%Nw–-B¸È¦5ôbø‚Þ®¨­/†Q-åŽg†WvdwÔȤú 1„;ñf:K hŸ® µü^•Åi<îe}bqÆ‹E8Ë[d7Ì,æ/Í,E2æðÿµ?×ïpŽÇÇNLsÓNN‡é15¦Mw÷é8yšMwÛ6qº»Ù™¸1Í0ÍéÉÏ÷øþöy>ï?àõ<ïT¾pZЏk½ÿÐÁ˱<®øK¬jyº¹[mQ]Ü÷ ôßðCp}ÑÎ PBÑgr¹ö=êëv5¤¶éêgü`âe[k4)€ÃÐbÏü¢RÒ<8²–ÿÀ3þâ×£°AÊâPúS9)í =‰{±±¯ÏœíÌŒ°æH"ûXß-f…nšù'o {æ×õ‘Œû43\C£SŒ¶jÝEOYȬ–Ù¬bÖ¯–ËÅN~9 <¾-—˲HÂU`º=8ÃVñ5IÐ:,Ò{M¸ìð•Ðt½DƒVìU*}__M‰+k¾jS÷¼Žè]û6Òj ó’‚ÛÓ²·g&ZôÈ–·ý´G¾”>ÕW ì¶ …ÓÑ<ƒ‡€ãùê…Ÿhï ʾ *È…pÃkmkÓ%žÂ<0ƒ×ïSÉß.-tUí±D; W;¸„#Šhþ9 ëj¥A¬ÑÓÄ3]£,û¯E•볺ˆ#ª©²¨/rÉ”-¤5ª`ÞÌÚÐð3–îÕòé}– Ÿý„ ´X⨠*c¯†WSÙ iWè²:¶ÛLçžmûê‰ìýHï”òÄ—NÏ­ L¹Üöù4Þ«[mGÄ„ã¬øÓ¡³=òÄ2oGç9ýð_yØ­vmÿ}¨çŒ/éÁŠ™›‹e ¿{Ÿe3ËÔ<)éZ;Û¾tˇ>_5ûÍÚÀ­=XY"`ÖàH™6ë|qC þ%›0i×"¼î“žƒsƒŠ©Ý«kþH—m¼óƒItËÆF«ÌpBí·0“T³Úô»WÄG Aaðyv¥½uÓ/ÃeZû‚kÉH‘nа)¦F3êÓMÛnσìþÑ6Ëcd"e¼/šh>ÈúžYŠvãƒ;Þx÷k@ÙÝŠu¢m÷Æ×ª$õ¯m‹[‚­\H ªäE§Â®³·0àp 6êñ¯Œ"-ö/Rá5ú}xKÈì!Î øT;èù>W8'œ,sáýè®s¡¾QÎyÄwžK Çl` ÿ™Èœ}ˆÒPÍÇ¡¦éÕíML“c§èŸ…«s))Ô-}³ÊÛɽ…¿ NÉóÑ¿RÂgà¶‹¢z‹Mñ:3ýbüY_{0€ÄT¥_µã/°’ª!ô®vÙ…Ž‡ŽB —Ÿ „Û6•ªqá4“e$x%æD¬…®ÙœTTî'sŠ‘ì®Y¢O`å(4Ã'Û&ÚBºfìj7O&B­)3ÙL7'¡Êô±®Ë× :¹é»o ?@²™Üº¹ h5íWmŠ`HãBQ=Íd]Ü àË¿'=†qùH™ö‚¥¼œÂý÷þÛr½f–®íŒ[wŠÑÂ>-ïúS{Ãn]ÿnÚÌHÛLÈ”ÃG“QzÜ‹öüÕ•ŒgÔGΦ\‹Kìê›LtšGØÐÇT‹5¦AÈ~ªôÎÑPH8,°ÿ2aÃŒ )iØ9œ/ªVL0ÂÏݼ3²`’žZè{ai—܄䎗~-] P\œkÏ6l«§­áiðq° +ÅŸ6RžeÕ–±ÌÕOD³ûbá„ Ÿ¼×Éú©ß#†¿ºô/2åiXGŸLâ’/ÑàI-h5móWT1»JrË&ㆲlF]{t¿òÑà.!y^!m–-v˜0뤔›^âLïT˜ñë/»ò‰F¼àø¢eƾ)†S>•rÓÉ·ó¾5èë¸,¯À$ åcÒ¥éÝ¡ŸV! ì½îÕ¤Ó•ï&’³íõ†'àÇ5Ô·VV¬lIô[þÝÓÏÍØ5xôOwÌ ¿J:#«jëÍË=íüЉ]N¤Œ§Œn#»ùÝ:³òGß`†Œ"…:…ANIЏÚ\dP &)ºeàcEm±îäDE™'uÍÜ(\KD±M‹Jv!?ß‹>ÜUJ¡&±윮/}¨2^ÏUZ¹E:YÎ ñ|°÷%k‹<ú{8Øn(s3M~›äßÃn`«š¯J¯¾&f8’ø{šèC^zêÎãXþeâŒýáõèMr£À—曣Gk«þUK ~[œ_ôL*4›gHX‚·ãÒ¨X¤­º3&Ú®=3“­ Ñ B}/bŽbòâc¡Þ‡6³½QÔ>«öëæ-_uez}jSù×\ÃÎ ó'pXªgN Œ7"`'£êŸßð–^÷g}Ý‘ Ù^.â-ð½Ì!ÈÊxWb”F¼X%[jþÄ¥(ŽPSSÒ°$"›ë9Wü#‹û6w: ñÏk¼XÅË[ϰ* ñV*Jã¡°aW"p=ý.PdæÅ­PøÔX„ñV­0YgOŒ »p×Û~·†«7®m9”X0Heݸ Q(NèãËö ¯åaÞ{/BöS¤y ŠPï)ÑÁW# _ÞzÒþäD‚øÚ±bjŸK¼qÝ ¼ûO4Ÿ…-¶dFâqKþ[™)y­ÿL4—Íä#.ÍÑ„.û}sÈj¿z¦á-ÚJáˆSÒgþ:ÌÐëžÎ±p-àÝ@8ÍaXüLGYƒ¹¶¿Õ²ðƒ޳Õ.Á¿ VkEd5²!ªŽýî­Aâ„-áŒ$1DJq†1}S|¤_©ê,M«+;Zq†…PO¶å¥G´ "PþmH°gÙ+,«ÝßM÷ "¼€ ˜ ¾ ¬­û:ÉÌÙ=²§¨‰Ž–ÖÎjõðÍŸðSÎÍúÀÇJïÀ;ƒ÷Í`ú¸« Rõ(¢€6ú"6½, £õ~Ûö¶°.bOõ·Ë5´ þà¿EµåcÙgrxYhiýE<#Ø °\­½@Aü7`¶Gu÷GÛ‰­DÅçývÒJî$âS–*œ 1Ú.Wc*j_÷7{zgÿsŽ:PÖtHˆ;¯V!£ Z^ÜÆÕ .L.³¥"wì¢VS›–ó„QÁY4N£ÑK˜)©:sd’/MÝb0²;B”¥l’}yƾҟªñ¨…‡-±^KOO{íÜ=$×e©àî=Ë9 ‰ÍŸøÃŽ ¢ëtŒ}nÇhÁ0úIƒõïL±v ¯A¨­àzñ2¯:̃\UÿWts Øàë[@tGÇS?v›Ó  ŽAE.Ù3—5W!³VŒñÝïaYÔ µú]}ŽŒõ¤B:…z“udæ9J .‘fnßÀájáºGÇÏÖv0è/(þ©ŠÓ“ŸÁÚ9mÂyßR* È ÷SöoÊNon£æ<Æ+†M¿XI‰*f£•–Z¿=k'‘¤´ùÜ9£ÆŸ”1µµUp£w^°™0t’JEkuN—Mr£Lo±çð3(/¢™UTt9_~I‰Îïêÿ(«ºlE¼ÿGŠaá¹½ñ:!á”/?„xvÖÞþâÓøýk•ZWÌMq8Lî.¼ñ£·fajIw%<"í–¿._ÝøJÆÞM†’óTõ-b±)ݹy¯bdÑp;[wöûÎÏɱ)9qäãLU½Y¬¤v¹ÿ¥ô‡”¸:¼,twµácP®&tù¬ M‡[Ù1^ذJ¡`_"6/’uÞyåÌyÒ‚Svü–=AãbQ;)Xcû½é«†ñ#{õƒ°~ò_i„ù§='5‚Â&Q¢²eKõ„i³í”šãTŽòÙ²ØéîÉýÅ8nF`Ë@Á‘hmù¦^¾$·€V7ú'æûÒÉNC½šùw²S¹g§x»–l‹¹Ö6¬â §# ®æ;Û)×¾ô×1‘öãÆRî(®—Xr.’@MOrÅYlmm¼÷Œ´Ð–aÞÿ›ôø¿<–t/V!Ž1ñq\å¿§koAWqÓÄ¿BÔ›AÒªloÅ8L©564Þ éœ<KVQZò£óâ]ú³J@‘ÅŸIOjÐÐu&û‰£‘ÉB´Eƒø'‡ëo¹Ú¤þ‹©¥cCÜ•°–Öž—Z§ÅæÝd&òiœ5£%Þ ùù‘rUW:å×}ÏŸ 6 e„Úƒ>8,¶~pöR`–.;ñ‡ön¯#ÚYzSN)®Çya,b•|µÊ˜ô䮪FÖÈ iÔT6ª9½{þtb¯_R²¬Ä¢Oæª—ì³øo´5_ NÉT]¾7ïúAê™´å’+b¥OÒCÈó®g5¹>17|Ï2-ýÜ“ M¶ Ów™½We¬ý­P¤±¬SD!qUÇŒK¿˜›Ü*IDÏ?‡vŒgn®ŒíïÓ𦈜gœƒo÷݃œñÞÉ‹5Tüå@†®¥h€Ëb\ìö>sFôÑþbÆ:©oŸÈ/\¹pj‘À$¹ÝçUÎFcHêyP{ímâÜÙ?û^ÛäÇ; öÖÎoHº“ÍŽ¬b3Øô zµÊKÒã›;b$žSØm‚»â$&«oàfEhê› â§xÿНˆzfÿöSŠs¥ÄcE]É^‹–ëÝ,Ó†±!1Ãx/žè½Œfè@v¿Ÿâtõ"4»·w•Üå¨MË nC]ra$é<«SnöVcßJÜŒ§×Ë'$ß`5Ž0&íþøð_X9ÛX@½Ü\, N€ÿ8û.¤ endstream endobj 245 0 obj 20709 endobj 246 0 obj 918 endobj 247 0 obj 19965 endobj 248 0 obj 531 endobj 243 0 obj <> stream xÚ]PAjÃ0¼ëÛC!=8’«1—PÚ†¨}€-­]A-‰µ|ðï+«"…V0š™ÝÙ}|¸Êâ¬Ý€Åé(à†‹[IaѾöžñ¶{î¬ À¯ä”Ä£±š²œŒeeÚ¨QzÕœÍr[Ϋkà·H.68¤‰OŒ¿“F2v‚Ãg+#–«÷ß8£ XÓ€Æ16ŠYÞúŸõ‹SE”þ›G¨.3(§qñ½Bê턬¢úriZýËŽaT_=ee%ÊSÒæßݵïsO¡V¢0-"ìÃÅû]¼ó»+Õfrô endstream endobj 249 0 obj 232 endobj 152 0 obj <> endobj 250 0 obj <> endobj 251 0 obj <> endobj 253 0 obj <> stream xÚíºepͲ-(ffÖ3l1ƒÅ XŒ[3“ÅÌÌÌÌÌ£% ,ffféù|÷Ü÷æÜ™óobº#²»Vfee¯\U?šŠLù+“¨©1HÒÎÖ™ ÈÌʳsq´92}±³6°²r0³²²"SQ‰9‚Œœ-ìlÅœA|M)@Ôå;€ äâãò±s€¼¼<5\œŒ¾ÿagòì¼@ 7ò¿Ò‹[8‚Lœí=Xþc +[;7[¯ÿÄÌ,lMÍþN˜ºØXÔm-\@2âÿýOì;ÈÀÁÁÊÉ9@î&æ–-¦æaúÇündkêãeog03²vùX˜þ>È^NF® €³£ ÈÇëÿêùÏ20µ0qƒ¾[Ø"ÿ“^ÆÖÌdý/ü_ýÛç rtúK€ößÄÑþÒfjgkí0™!³(Ú9[˜€´bvöŽßÍ´&t™ãáeü¬ÿXà?–ýËõåþÇòþiે“3ÈÆ ckbçhoçø·#¦Ì€¨µ5@õ_9ª '£ë_ô®/ébm­hdóOÿð øßÿ·(# kÿˆûŸ!š ÿªþÿiº…“¤…;ÈTÙÂùo7þÅîÁ2ÎFÖ&¢¶ß­AÖÿ‚ÔmMAŽÖ¶ e;'‹© ÀÄÆÆñ?|jæ&V¶ '''Û?.­éÿ,øoKþ)÷?eôOâ/K¦¶ß_ÿÊÀÈÑôÿ¸•,þ­Öÿ“ëŸ1ðÿŒŒœ-Ü:¬{ üø÷þï7=À—ûoAþ—ÿ÷Ô/_ìܽ˜xxþ~/€‹—ÀúüGù&.ŽŽ [ç´ô÷Ûþ{lfñ—(Èd‚ §HX,~®-nm Š æÂ´Ö%ó Á¬y Š0´#å|²†VÀÂÒGÍ|g»™"ÑedÁ ¹)Ö ÷jáUwÌ…ÇãM£ÞpÞM©ÜýÔ„§¥ÝL°i|#HÊÌ·y¶Ü´A9 …ÑuùiÚéÜ0 òµÍQê-›h=nx0ÎXÄ帅ým¸ƒ– f0·×o ÿÌâÈîÆ”Z§Å¨{ “¶ ŽÊ,«t^Ïô2êr1-D5j8¾<;-f£+®Ñ“­Š†gùÁR¾"tj" ¿%®ïö´:®_.L€gø#ëÖ˜Nq*?SÒ–æÀyÈ8TU‰u»lZ%C» Óš#òž`ª.Mbº`a¡kȘÕ7ø>«”à7L·ýH¾>•Xç‹ë Ï ¡R$íWʹV.øÛÄ\Üz§K9dh¬IvÓpÅ*ž]ñr¿§ÝKõÎgGÄ%˜ˆXë&ˆ»Íîù­²·0¿ ª=¦„$" J¶y nek`mï±]Ñ7T?úŸãR4dÁ½“‘’’9…2©¤c¥±7l_–\Á=¬ã(öøoõ–5föúrX#ò¤Ñ¯§Ä”Lèõ¯dÔ‹êê3ø'‹ks1àCß·û¶óÞêv,®Ö,=ôP.¸S“Ö`êC¸*’o/|;©jôò,Ì_5ÏßW#îô}8_ƒ„fšZ¹sP¼ÅÄãO•ñèÂÿ n?“`: d÷”G£hÖH/´0&Zô>N·˜ &M6 ló,…ê=^…èáwˆ@Dàÿ0‰9¶ËMîÂLÍ·u6q~ƒè^u )(É“Lá­ˆ‹ÂàP*\é‰ÄS—f*Ê·~r?ûÅ„sZÏŠvxv†úJ<›DñŸ‚u±¼1sG0ßC<Å}‡¸OÑÓAUX(sŽ!®¿Åg8T£Ò¼XÙÈŽ¿ÊÞ'ù>‹EÜ¡¡qš(Y ^Ì|×—Ûhió;=‘üõbÆ›v¾Š†uè­Ì@`Zé÷¯†BrZã“l£¬Ï5ˆj}ÔàA†;O9GW0eftn-® b„‚ûSðn’ÆH3œ³U `J aXéŠ>}‡Õ2 ÅÚ­¾Lo> gtâÎÀ6‡X‹EsLJ²36Ö€GÖWãvˆöÉ¿-ƒ8:•[ÊNvý\ô &ü– HË¿S›\ ÙÝú[ L—üŽÅ<Ã-¢gΔê·ó™ðªjbùkž°’ÚæA"Ø”öZ8u/‘çƒB••Èmì¨óI€ªþ:ÅÖ£o÷‚4öz|rø ”ÑŽQ×Á™g6ÿ\¹§Y¤ÁmhwÐ~÷׊Ìå:•Aš†®T `ð4†0 ®>Ði*E\çÎë|‰v0Cø’zÔ¢‹·¿/+9±pžïUNõÜ2Ù%Æ„#z˜Ò“Ôh³!‘ô Þ®î‘åAìGe*…²`ÊgrÆ8§ýqSQˆ²ÒÌÿBþ7Œ’Q`ˆCÜ)Î -»Gi5'O™²gºú·šªƒÜ3¬o>"1øFÈ;‹!aØ­>Æ/§FqoQlÛÏ{ ¾ãÈm«8f$9nq7O®ç3Ó¹(7¹ŒOROþ^”gëfÖû{êüc™yñ£/Ó3ø7—i]dü‹ÉIÑ·ÀÑmSO¦EÎqGD†8±ˆÄ½ƒÎ¡La!zl›Tß¾^âÀ¹¦øƒîgÅÆS¿³6oŽ<&#ÝÇYåƒÜ¼ƒ¨Ó}S½©…8rßs¤PZ¦6œðkõI—è ¨ï+Jl¿¸mÐDF³Nû“O¸[\NÎjh¬LÚüfõޏ&WˆÄÀ9–gÑ]G¯‘õâa®Õ™3qܼùUN©§ü c 5“ŸÄºqºUA‘°:î4t¢C О§›Z†Ñ`aù_çu‰Ížâ— ‚Hbéðµ{WÎS’ó$ò§©ßY^-H Ñó*nÕÛî¬[+o÷ئ¦C9b’»Æ(¦Õ!™Í)–ŠíüñB4MàSÛ9*¯58|UÍI˜«“¥¼CXV,v")GŸ’à ª¡ªt¨Ón "£í¶IŒ E•›7_v·¹*ÿdð¶5Q ç9è® y&y =gH[> §òÐ;˜«M-ßUì@o*ìã~ØeéG;q\A³'"¦zçm´ y™0Ìõü°gý“WS€ñ%Ïö^·ïÔI¦ÆËÚ ¬þE:Kÿ„Ö¢ûþe›¿Žÿ!ìÇfÁ°Îmj¨,q& rh´ÿý;ö6¡D¨›ÅÕ«õ=UYz Ò¼>x8¶H¯¸ ñµu¬ž\4xÁ»¹XùQdI&¢ž¯NÇ}*Ú7…îûÉÅs bñ ð»ì-yDâoézëwS7c‡E§EUþ³Â5rÑô~Ë[ñÁ§GmF)D2¤+Ú}0:ɨ†1érê×68Ê /З}>|*è.Ó[kxüŸ‹ãq;¼Ÿò iœ}öŠ)D˾P½GB^»öé‡Òð_Ø€‰X¨C½GßÚm·÷ ±Z±~[Ö¦Ÿ™£ bSQ ImnÀ[Æ"Ååƒ1ù…uU&‰Öeù|Oñߨ-­Ÿ ¼®õfà<ÝB¹jBñÕµ{IF!tëç¹dŽ7UÉjµ³ ~¤1Ïy@u%$àðÀþt£à¹Áß“2 \{`«T†kâ–²€µŒ;“ÄsèT_DˆÞ€1€ÕÓüó¡Žo%:ZmzxvñÝÝ ¾^»ÌYµE„2Á÷wbOOš*¸WH-¢<Ÿ X©Uôˆ¹N}]³êÑØpëÃÀ"Zçýµ9Lùw¯ô¤Chí©_ßJš´c6[s&Šˆ?XÁðl z° ü2Áóud†¼rO#Fò ÿ”¬ŠæÛzž*û[*ÖiÆ(ÛÜžÉSøÃ éù½ZØÈè–¡gö‡ö63çâ;‰žð >F¹lq:Ì‚¢¾¡O®X“©ú‰É3[±óê sJ™Ú bȉ?G¹l«Ä´xÓ¼qèå¾>ÚF2µ  Q*Ý%$Â{ ·Xéóª /¶=••a)` .9tü«ËÁc1ýy‰òG¾¼ô±$vÊÙ s¤þì±0=%Ó„3pÄ•G‘‰è¼3ÄÆÌe%ä¾úò§ØK3w ® ÕaúÛíÌååø 1Ö¹Ù>Ä›åäÅéJ&ie®Ø—^´ ÈÔ±§Ã¸öé\Öˆé l1Ìå,͵_Gèþ…î¡?|WNA¿IXP~(Z´²×ŽœLZõ"š†º™Ñpm¢íáÖŒC $0"p_ÚbÜâžÙ=öš±äà«"ô½Uq:ÔFŠ YÒÑÍØf™¯¡ÆG-};t78à8+¡oaÍ ^¸iõ¯5Y³ ,N‰1†å†|¶ißìjU¯»¼œ¡ ²âÒ/’wMOoÏ}Ä.^˜¶ÄìH,ì Û‚[(™µŒîh‚a!R‚"²k}/AXilj5Úeîbo 8y¶]¾ç:»w& E*JJ×¼|Z}Лw¶'X‹=ÕÅ*t†4_4Á(##7Â6* cµxµ™M­8¶ãÒ¡"Åàñ#WÑms¶åõ’ô¸þØEzäˈ< ·ïÞñ™ƒ4ƒ"~QEzƒ:Ò@[õ÷Ц¹¾– ØrwÝI`¯\دˆšUíÆ&Úžö®îCx~0ššÒY˜DΤò7âÑPâµ~_z²-Ò²L+0<\ ^X^#ïª"`{œDö:&DëyÏS”y!Ha!\ÒÞaô€ËBÜ´¢–Pò#œÚãÞ‹Ìù³zâ½ LFQE(ûdÉëYα¹mû©b%9“êÙk +DÞ*¡bb{8lÆ4’Õéô‚åÛ³k~QÈÃî9ÿh8Ž›´¼”C1/á“™œ-Éò7&Ñ%ëúˆóC*Ýšj[VÓƒ;5#Ú™·ŸÅ߸–B[ŠÊcÊŒ }Á€Ímæëþæ„ÌziænLZ§ïï`jcWQrè5lÁxXòPȺ.Ñ?ßcÆÿªœsißNßÑ•ÿË« ɨ$ötÜ/É]ƒïCF4xaÁ¯DôÂ1þv²z…Ø.+¢&«8x†#ñ;]݇ˆâ2MáÜÊ‹˜{Géb>WÎ,í9IhCZα‡Äxã7ëÞhÖ“ãú¥#ô}½ª<7&¦;BuÑfÃOòÓ†>$˜ð¡Ðy‹=F–}î¸t‹»Ç±•]Ë l_®›ÏŠò& *f*ýoZpXt&ï¢j¥cþB&ÔŒ~…kM‰Ÿ¡³4Âï†AgǵR’VÑÚFžÓë»ä#7—ŸŒãçò{ŒŸù‹f) [ðÙˆ°Ý‹¢;ü5$)¬9"”(å¶\z7ÀiäÆ2Aþ€™Æ+¢PÌIÁ9FœÁSÌ.‡HÉi ×òñnQ ¸s—RÆ£jVØœoÈæ-‹'¡WµÐÁ†ÒÇl›«Âúy°ÆwÀ(µñ¯0ª$S§j².hk9µ²—T›FG(²ÀàÕÈÄ›{½õ!Í¥5†ïwʽBÃ6fÀDàÆNáIv ûÖ6ÇøhwèRKoãkG55?QÁ:–ä1m4U S[g»«ød…¦¢Þt6Uµî´ÐÕÊsj¢ 2´"&íI\nÄ€¥œ`P=Fm6*£Ñ}-;$’d—–ø˜øL/CF]®Ö0„t÷¨úO„Yaìß ]Ë®Lë ’þ¯pëwèT‰* +w2$ EÃAŽ`7…†½ónbA‚ü‹®ÃÎXÅ9}Ù‡N/vÅ,N: ÐЗù„&Ï”\1œß&hk¶­*…âJØÇRÃÃSOŒÙ†Ðä†Xu‰a€8vꬡÃÞÁw/8³\Ø÷B&>ÕHÉ^F”¬9ЬCdåÔÕ©™+…{üq´ž³Ù¸™˜¹ûH/½¡jãÔgauŒÀoý å0Œ!áõg÷!3Õ0.7r")a:”»épmñnÚ¯u}¡™ÆÓ>~ë 0–Nž=rÌG ý¾ ŒPÎäÌÜ¢urKïXk¥Ùøþrl[ÕÁŠ8Š7ÓgSGŸt´x%ŒÜ”Ýg…r²oÛpá]qó†—#®¿[P,ô®¸õ ø¹%T .³¶{’½‰å ï¤ÊÇ•ÁÊrÁ§`mÎ[Y ñò*êÆ}›°Åe!×,m¸3úʱS­Óý .Þ]ÿ`ì¨Ið­ô`½Þ†•ëöàË J¯âÂxq)¢:+1oÿzÖ1/M yÝé)Ô´¬ì££¡ËwPñÉ7Õ\@"áîz/%QùgûiE>·xcmSÒeÚ›$•·>ºÀ)ž½®B}?û!nŽpe”\è}»øÙÛÙfŒfîŽ)ÚÈû}µîÈ>ý:h›B嫟‹‚§X¼ãoeÔÐ$Ê fT·‹HäÉLݺiI &Þè:5gᢳ†ßŽåEX†ªµß[´Žá—éU{}6ŽÃÊ>EéÌ–I#÷Å#•‡ é \F„fƒÜ”M©¥Z*²œ»;h³­Õüó/ª‘R$»º6Ä{ÂP1¿üø^] ‰_#]Z 2¾yú4„Àì‹da!D–‘ÄvåÅr¹ixÞ¶ŠìC††žÖñ®±¦¼“™ ×½Dp>´gåûœæ ÐIõ˜–¼wƒ‚!Åú!í¾kÅ!òBîz¼«¯1½\™šä¸¤BA¯rQH)®þ3ûþÃ3ÍSÌÝÐãE ‚eïG_Ôe<'ÕÕÏͳ²d¥¡ó‘衽ltKç®æ,§Od§!•Ž€‹&uƒŸHQýä?Éòº–ù%±Œyg?g¯«–Ëaßµe¥­vøÍ>'öÇí·1\N{hÝI!^¾îK²~çþ(W¸â³¿«² 7.\ÔsuE‚€î¼çÀÊÏpl…NB;·|U°’M³VÏø:ÐG{¡Cr2ÔÂpð»Šà—“ß…$ VÙÔ` 4guU5æÊ~“‹+õ15Më!ñ-šŒSþ¶ÞM£$„és\ ež.id®=Gb¦¼»óbuá°lÆ2~÷‚ù-s†êÎàè{u¨jtr´ûùÀ‡šX7ˆ[nÕl •Û†&õ æpbqèmuÙg0•@Z¾“†V:ϳ鹛¼¯h©qÁ*:©áˆʾO“ßëä¤JQŒíÚ'æ%Ó´¼fäC²œ¼Ñ kh¦ˆÎýœçdúN¡í¿•\ímÙø>qèÆB©‘ÌÇ©1Ô­°nœA¤4]û{Ö.m÷`¾öŽåͧ0ÜiF~=R‚üvêbï5ÌYÉRó7ΈÔ׎aᄯº˜ã"8ªÚ[2ºúðr‹.Ú€õÖw6×a1]Ì‘9ïóޱvI㙩Ðw|_3he08›vL-ñå#=Ä?¥m›‚™ 8„â›m3[§Aþ«h+À±‘º9¥š5ÇL¹ˆDÄm ùŽ”lˆ+‚Y^(ê™ù\¿Zâ:§££¾¼ºÈæ9Óß~5ú!‡ gŽB)³!¤žIh<‘œAøƒî¹‚ÇNqøü{‰2”c¢»ÿW!Ô¯£Î_ßãC_‹ø\Šç F»!§{)§Äx}™9MÖ~Dh7ÓZ9ÉGå%¢Ÿ¥¾5}âG€œ@··ÍìŒ IᲦvªÉݶ“,aƒSšUuU©?ƒßê/ƒ£VL á3Î:¡2×`Ý_ÕäjVàd®ùYm1Ž Áœ—JçÀÝ·b¹ZÔÏ@öÙ]j¡HÇw@÷FMç3e»Ø``Ÿ”‚ûÝXÎ X)ú×'á“0Q-æ­¢=kAñþI1'ûEêÁs)±ïm˜ÒÇùÑÙ¾Óêñ™ÿ;þ]?Ïå3›ýÊ'{K°þ åž™ýV§WbF&dAvY#ɶfUag@.:út:¢†ú-õ ÿ¨ã¿^I ò—Á ˆüðîUàã]?æH¸bŠ•û»âEÔ:_D'3‡Þƒ:Z‘®õ¥&7½%¦Ò¿ÐÓP¿?B¬P/yVcÖÕ_r›‘@¤Zm7®BÒ•Àým‡½Œ)ûœ±5ΈwGñdC(§Ñè©•–ƒà(¼K‡t¯ôÊÃ’?ˆ}G¬Ã<*[kÁ’¤\R|3;ø=Ðç¶æõÛä»äs$“/ÓÆœ¦~fæÀœã´YíÌçé> !—ÆïƒOƒþ§Jv±?¾U —6k®”òˆÆÒ¯­¥‚¡µ»l¯îˆêFÃã Há]93~›O½I- ·¶†3¼á?ì¤ivQó¶?V™ŽY㨪óVR!BKøÉù·!~«3®BÈ&^eÀU9¢h¥#×å2K#àl²êЦ®t6KYöˆù»,¸¼‰VEY=W$7úάÛN ×+´+9ã|&qeÍA¢â¨ú£ï»õâÁ‚#ª’Sî> µÀ¤ 5»¿4Ÿ4ÂÃÅ1\Êvü¸¥#%¥%<úé׈W¨õ*‘i‡‡PÙuðÐ(QÉ3:1ü z‹oh1fC(lËÜÿGbãÇ}6*·5:™|ƒ-±ßó7ù–—‡›,zV%™\§Ó ç"ÈòD“u– uz×yŽü‡¦`‰7´o/81%š ß ¿ZÁòÖò#>Ëð$é®g4tÄiþ{Oî)k%«‚¶¹—˜ÂU4£§ÿŸë›öWwÑA,ÄáW{VÁ9fBÿHþü™î,µûIŸúöõ‹²c‚ýë ±"L†‘¡Z¿«½Nm0ÂÁ­tɹl—òbzZP krëX¦{:–%# ±æ™‘ód†µ/°³þôÂq„´5{äˆLTA+3²hbáóøƒéh¹È µîM¨»?<åûdжcrs^BMk}œœS]Ƭ†ÅN8òùòLD~uÖ7Ø~cF[€tŠ->Üh8¬rPÄ­DÑëë0á›Gý©ìÁEؽLÚˆ¯€2Ï\×u†—ö®U+óÕi›1éÓ™›n ¦ÊÉs¹.Î…S»ýb(«è°õ¦;;ßê‘FÙ\…üB·„~K;kÍ‹Í9ƆX”©Ü ÌÁo®§ßžüé÷'r…øa‘r8¢„ÚUûd^ª†6A~?]YÕ­À!€zæVç©RAöczÞ¼ÍYeq0ð´f¼ªSÊpKJ|aŽáAV L+y¸a&[òXSKÝãþPå>l‹B­aEB0p²’~ªt m™’¸âEõÃFã“«¸ówCƆªÓlÕžá{œ™³f­ô¢CÚÉ¢n_à ±\Ñ=∅<—ÎÇnVˆhŽþ¾lBâÏU(e¨€¾L↠áb¯Ã•‘”ù9ÌÙU«©Äª«AI¤±B ’8np1•–¨™—ýz„ §oÈHI%b/|yw‹ÅuðÙÔJ*) ÜWû÷N ïk Ç"_ï æ˜‘Šá’¯xñ¼ÒÈ+vàÞš8Õn 2ÄÞ þ°rð€ð¸Õë%Î胨úB]9yd_ߘð-øáËÔÕ.ÍiK[Yý¶ÑîQB œ#ÄZæÃé5–í¹Î5R,ùtQ·ЇÜ„NZ¹g´\ž~¸¯=֥ηԹ«Wò¤}ñIF£Ÿ‡Pû¼ š ˆŸÏ2î5üÞåðUþáh-¬5h2"ƉŽ"̘~e¿™¹Î€t¬¹†Ø¨ )jÝ¡4‘Ìá |,ýæÆlzoíy¢óÏ^jéÍñÉœjâiŸœ‡~C$$xcCK$¼\c!XÝ¥ ?åÕè¦~»œñÇ_Ý{%°çˆ,¦;¤½r„Kù óm?‘Yƒ š_“ÿøÝéDêk¼’ÄúRÜ]õSEºe£hc¿Ñ÷=ñFޏµëF$»^1´;;aÒÆïaP„•ú«Îö} ‹ùãˆÁ}„hË´Ù­æÝÆ™°Rö‡›‡™­TÙlW: 1AOïH@‰+MãwQNR˜ »·€[¹ ]0e²ÙXõø(á\ÚÓRiúê%å³|¿5`GâÅË+%ªÔhvе¦9'ÌkðØæºàdÖ4â›Àý-IŠÖÕÂc'£ÈÒ%G@ìz,æu—KÎEa‰¸ ýlÌáÏ€Rï’>V‰¯E¶ 4Erʸyú¨v17Òn|2ÍU̺¼^æ%HéÖ2Qxk¸ïFe÷Ò°rkŠ 67­¤å¥ÉdI'Ñ2ùR!;mè6À•JzëUáA¡c¦¯SE§Ý(ÏQ†Æ%ÒöšÊ“?¸áF¥–2/ÛþØp™x"^a&˜&ÞéõËăœ§ åø]ãµÉñqIæ'w·¥ oÔ¯ÔïAC+<¯n¤ƒ Zu^VkõåßmA÷Žú½¸ƒÖáK¸÷xܘ]õ{¤}5’2_t5ÃuÏGDŸû¨%–„ÛC¾®«Z¯ò\w6K©á 1_ÎhƒçrQñ˜þnom{ØÝéªc«×‡ALÕ~@u»Í/n¼*Šè™¤K[ y¹í2§‹÷«%zQ4Å¥^(ÌlëDr´Û²‹ F_ïÀ»  y¶‘L@ÊÙËÖëîåõì—2P"Ž*»v)Iƒè™;êÛSI™ùº'vrSëÈŒŒh]s%à}±Ï.{ìkž&& ¸gÞFÓ€­´-5æ,¥'¡qðØ¢ëye%tPŒ´ÙË]ì­g'!¶ªðʺnÌ÷ÏxÜ¢a3iÕ™K“ÃÊ]Šýi‘*]¬ßÜëÜC„ÀÞQG/ÓV©2ŠÈŒÂ“NY `é§®Ÿþ.ÏË&(mƒ*7zPü\ ýu×Ý,Ð-È'´Æ>B”1šú¹CV1è(צ`Çž€X¼ûÞjë”%%³>54û»û˜#ù ‹óC›ùÚœ¢e‹u–™}>C§Í™Ð<œØÖ¯Ö\nº=rÌ;š÷~m÷!Hæâz°ð ~¿¿svR^îþì9¯‹èÉ—Ÿªp"ù´ È/µÿ»×­ ßÅlXŽ ›5Jý-"§n[ý’Y‡²x[.fºcrl‰#ƒœì¦¤gTܡڤGeûñnÇ^˜ïxœ55˜\¹%ôؼ\L,µèSƒ2ˆ°iŠ&Sÿç ×Z¨œ01V½Ÿ÷“/¶Á’~¤øF¦BûÎSW[|z¡@m®Ç1ì]5Ya¤ÌTÀ¦ÏÓe›,FË“»N3Ho°©ö1Šæœß4оc¥ŽW–Ýçñl„¡X¸5_쀧ݯô§¦Uqª"Ë>/=6_Ϥ{kwxc]‹ÇPÕ¾&˜Ë|±í`Ñp©F C[4{žÚθ*„žÔ‡›¨èIO-s2Õ™Æ}ÆÄÄ%ñmÿ{Ó·˜®TÇ?¥4Ä·Ìð<O–aûÑÁ6" ¥þÙ^¤¡—CJ…m´#­+Z‰ fÓɧ¼ËRù¶|µ>•#íÙ´¢MɦôÉFzß·—%¿ô\ UŠi:`òN<æGLI k%„‡S BrË««Zô cʨÌ{n16µà±ùZ£E¥c`T`fÌï&Wåš4ØûçðZõIL<-¿Í‘Bp2Ûßµ–«sÅ/±ýnû³CO´~—êDK ž¹Ÿ#QývSgånìÛíùóUÊ×Ô×*”(â»Ê7Nð=“Ümp‡Ê³ááa¯²MT8ä0ðjºûUlsíÅÄ*Ð’3fŒÏEëkc<üô¥&:ch)jCu˜/«vaàÜY¨:î Ù5kWõ¾¸|(—?O·w°On2êtÏÉ®íMRsçÌÐoü0ÛIs”qQL =nsÚœS ¯¯’Ë0$ˆYÅÏ@ég8ÑL{œ¥oÁ[Ç}†¬<•ë(Ý´q´•Ÿ}B±zŒÞ}¿ÙèˆЋEáÒFiÎÆ^`þ¼ï±_lµJƒ\`Ø7wV(r½~ ,‹Cù‰C«âŸÔDÍ¢™ïÇK ’“¬ ó³ ÃGƒ1¾gºDœpyú|rÁ v‚ÇrÆÁ {îµùÇ< $‡ŸÖ]ב9‹s£ñ9àìŽ\ºjŸ;ɹÂÕz¡`°nÕÞÉk7Wç£ñgÐí`Ë;5©:9“†O{¢ïdEN¯ŽiÐpE¶ç×åýâ »`d9Ý[óÄ”¾ÄÞ—%M ݼ+MõžÂÚÝu¡½¦W|ž·³in|0ÉSßHpm¨¦ã^cÓÄxÐÌžU¯8A³h” " ì†Âàù.¥è#·ò0¯ü”ßLoµhÐ)öñœ.ÒþÙdÏHcïJÔᥩæhîôXo¹~éÓY-- j)Ú0)×0ËÑöœ]üÃòcI–é›4žéÇŒ€<³º.œsp­ÌÕþ^A}’©!YXV Â๫%3‰Ç@®_(pÍ^ב ð‰CP_äOg¢+§~݆rì[¯>–™¬ŠWõ]²áÀ‡òQ[š†>˜hDðI!ZÀ_ãÞ[¸ñ;ñ¨ÍúQ§¶ùf¯íà-Ãþ^Î/¯l&¥ä,ìÂëX×™5ó.5pÆIƒ•ñòç¤Á” ˆÆ[#Ññ»ä>^%MÚ–lYãlVS¡E½aÙ‰Ð,aRdòjƵƒðËèÔ³Ÿ>p?—Ø>ùíT áÚþŒ³ ï ‘;ÕÙE«7­q’³äP±¨ Ç·©ÃõAˆª2c——4žm½18"‚m$Á¹šÄ…WÓ%:¢>d)ÅdWK¼d”{óÒæ«Ç#‡fœ(÷ß#øߨ`»‹|O—R¨Àºc™Œ‰à]]¤T×ú8²ïÔ/¦ÎͶ`lÏ<¾æ«”Ù.õf— •ñ¬CK׸^Œ9–´j±¼,ù æÌäGþ×ýšg²UH$R’‚Ú`A‡ÔÀP8MEÊp:‚klÔ²9Ò†~"Äl¯LG‰³¾„œm%•“”®ðXæqÒ‚ôž –ÇC€[Öžful»ÊÚ]xÏòùŽ3Ïä Ñ3$tþÜ­ò•Ké’†°‹Ù€ÜÛ/W°ÄWäk1*€†fy»‚)Ý´.÷Mk!5MA·A0ô·™%¢|µ-”Ò¿ÖgÁ°Z¼CV¥õtƒ^æå’i?}ds·À3¿°y[!I}A‰j=øUWe 7…²NŸw+Üð—éˆg6¢Üœ<ÉÒýx¨(—›òvR‚E‰ðPê/ ’˜ÃÞ”xz>tDAUùÉýïBEcìDt0[šy0×»rz4ê×S«—Íh ‹nïN%$ÜÕ¶p>­U¤ÃËZ¿hhzQÉ8ÒN…@8ƒJ+u}]^¨N•‰eco hu +‚ºUÈ‚†Ó:>u¬¿­¾ï¼Nw¢ ]]$U¯‡ttx2Ãá<KMýŠø#+¹x…¸€4ºTÂÏ;ª—¼óA3£Ù8ßK#Ûg‡‰öµökï¨*9Ž€£ˆèÜ”îc¬ çù#uÁƒG0OSAñ¼•j@Bˆï3v¬[:;9qxj¼ ™Ï>Odø ß9š*L¾‚æûƒÃ?’µRs6fþ1Ó ÎIµéáðU˜•Œ9\N<+œÇj«œ"/÷—G~&Xé.°ºÈñ5O*ï&>$¨é'{Œ–ÚiaÏãdÖÞ’ ‡áN‡’iŸ’ËôÑXL2ïÇ;'1¥º,®»ØK{Óftá¤X¦X’/©‘#(:2v{Ñ~è4†äßXµ†î»p:vµuÒÛÎÚÕhO ý¨òTAš+h ŠÌ/ c¼Ù@ºÆšzzlJ»çÝá¥*@Þ‹c7}9Ï{P¡­X¦=6§rŠ’•E½å+ÿ~¾¹¸Ÿ[:œˆQsôÎõ3 %–ýM€»ŠRýÛUìùº/|.@>`è¸0{Û# T˜9•›çi7 ¾Lüƒ«ë°ã˜ kÁ¥F·í‘«‡öÍKE¸çVY-ãbƒ:6Ö"ç5Ùc#X ‚¿Õ”'-À™wÖíe‘θá÷ãeýÆËÇéÏÍ^¼Ôm˜€¢Ô‘ ë®a³ëÌ$Þ™y` CÏ‹t·Î-~ít™Sãâ<‡ˆ4#¿zv•Lš5/ýãñ¶™ÒÃÕ²´ÙÐyÏ%ÁŸÝ¹LmT÷¾œ[z½žâ¹RÒ@ú–W…‰ûúr~X|EcWî9ë[GÊë#c·ÀöÁ–|?úª/l\ d <âþ5£í]Œ}/ÔÄ_A±z±N¶€ò~3œ5H+Îû]ÕaÉC÷Яðl"˹\§1¯T¯oå¡ó°¼~c×b;gâ_x…zCwBìènc 6 »ÖSJ[hU+áÇGnm›J\_·±Üï'û¹Q˜$F‹ÿ$o4"ŽP˜ðUì{•Ÿ¤SzöƒÜI¥„7§’ª™‡Úµn"W){é³–z /úñ¼ÊhéZpÌa‡žf*ʲÙá{ÓŠVµ¶ÞàÁn™)IjÈgɵs$~§ü/iVÕXõ€ÍÅ,ðoA“‡Š,&%ß§É{tNJNH=óÕêÌå8{ÏÒƒÖæÖS³²\Ó?íñ*J5-¬ê+aÔ¾åý*¯> AFäñíðè·SÜú­é/¤˜˜™RÌʵ†Æ»°uíÛK/PIZ€]™?ÀsãT‘¿0¸yrݵ¯È\‚VP4:kPöØïˆ2¢Ôts1£³]çÛ5w£•ÀbAkÁnµ­uþu^fzÆÀI2%ëWXO¿É‚µ……ݪø¿ů«9R^{†7vÅ@.àÐ3¿„UÊ%€íaEå\ÊnýØû]G:dÕy‡Ó'‹Že`óÛÌ^bú@»hb&[}Ë `;ZDvXlj÷c¦Sk ½R—ÑPÿ9ŽÉ’炆{û~V…ýÁ",ñÚ¾¬m‹”깦¥†Ä"»h?sÌë'Á2ùÕÉ~”âÍ– ŸZÕ³­7"&w¢ñVÝ{;lÚ‘y…×&½ªwµé:·š½ïawE faèÏuhY+ö; -ð»~¬Éº¨K³`Çñ|¥æž:èì)Ü*^ JÛ§½w/¨]H?ÑPrc†ýûÃOÑâOªŽÉbþ‹@†‰ïæK  ÔÛèB/ï¾¾#I{%Ó?î>¤Q"‚žÚî½f¸‚”ïÜRËÀJ‘²€ƒ1zZ'ã.N©´ðmѰƒ_Ê‘}îë Åê‚í`‹€Æ¯×·[6†a8‰Ã•øË‹ÒEåi´‘ Ï«RoBÛ‡.óQ8Np`½hÚéÌF!ûYû Ÿ¨¿ô˜¦Â„ÍGnßè½E´Rz¸W¼Ôzlü²Ǥêd1¬‹ª"ð”{·V¬‘ú»jñÌî]h´Ãü†êa°h K§Vö·&0.±év2q¸¹Å¤õfÍ ÂDž¤ÒåÚªž{hÞ­"¡‚i/'Ÿ3_fê/dAÕ^GZ%BúfËômÀ·{î‘¶›f´¡iÌlp¦P@¡;‹gÒ@G½Žº#×#vN8Ê/£M‹z’ÔX;Ñ/O|' tKÂÐläâÌ­çö²œ‰ˆ£!ÏÝcU¹­¬ò°S«ä‹)2r>[½× ‡+á&©‚“÷ÊJ)õÜ”^ÛóYžrƒùlJ°‡û·²«ŒcZ½)Rvä!ü«Ù’…¾P9N·â…gÄn_rÑàÆ£¨ú„>°ÙîÍÓvAÎü‚膳Šðs‡Š™ó鯉 à “8óžskz•‚““”Ê‹‡F1 <Œˆvr»aøEš"£1½‰ä2é…NyµLö=ÔÜ!úk§Sö'E¿ï$}rQõ§‡fIåïW„güÊK ã:Mµv\ u(W犕`÷>üò°¬ÍÀ0LŽd3wµ»S¦ó‡ÐÛn^qµ›²²(‰Š¸˜X¥cÒ¼™9fÇ©úæå Û-‘–¤;lI ­å¦së·²Z)žV¦•²Ÿ”tõÊA†Èøª\m«Ýa &1²»™•h™´(6.9˜ÎxSmBsg¼“øcŒ²ú)ß3:'.ÉäÃc«’×òæ-´èÈäQ3~µgp²@КFÝÄ?Ãùi7v¡`áò#¼u@‘Åš ¼¥]´~ßI…3ƒtOà|ÉȃÂbKÈâ4ÆAŠbbГO‹© ÌÖOüïÝí¹Çõa´Ñ ]_t¬Lö._fÈ—,(ÎŒ¦ùáWDSLÒT†×ésKÊæ*Ǻm_ÃIÉ„BF¨½D ÒÏW¢ÎáWk„½ØÕ¨ãÎù¤_éˆÐ=Qðéj=•wê{Zˆ›TWƒæüÂöõ=4µ³ÇˆΕRœ4kpÎ;õb±Ã5±_ë>°AÝÒ; ú!†›¼NØ,Øí€»nS§‰0"†åôÕW®(ÿ¼‚ÏÛާL¡ËƤÑÏs±wAÁêHq‘íô{­- "Û]wŽœÌŒzb¨‹Ý^µ¥»¨å„{Áì¦]LötuÙÓý¹tIkñ|°ÎSù²Š&^¡ÊB`V;DÐZYü7M¼¢0‡ÂÉfç”·ž8ó¬ÚO[ëÕD@Ú;Y kBok ônANí…lèDŽ«ELQBFд¯Ž Ý@Ÿ\&XÀoóŒÈô;Ù. o8ÈV[«,á'EqmÄnVÍôqÓÊÕä?zé(!ã“aVIi#ý²Cè\ ‘µíE‘¬,î=f6#÷¥"Oɬ¶žhæP‚Ö~_Rx†H  n,¿¸Àº •:›v28s¸ÛàK7ê­€èRØhÉIzBvá›D~p®#ž=}ÆðýT±#èÁš¿=ø±GÁôn©¯'¼­§’<ðÿAº^Ÿ=pEæ0­ä¢G˺ó±÷=´ Hˆoðu}éîêÎVÌ×°:÷ …ÿ2”1¤¹Or,;E›ÌºY+Œ³ž("cFA[k"7Nð¢—aMd;vôgGg¢ «÷¨!Ûä¾’ÅÊ’Ê^óÐæN£ž&ãM;&Wá£Â_ÒVšõÿå…ðÿ'øÿDk‘£³‘£ÂÿåG endstream endobj 254 0 obj 15468 endobj 255 0 obj 936 endobj 256 0 obj 14760 endobj 257 0 obj 531 endobj 252 0 obj <> stream xÚ]KjÃ0†÷:ÅtQH®çQÂ\B³hâô¶4vµ$dg‘Ûw$™ºææý?>œêl¯l‹Ùê™ÃG{õ³ê½q,¯Ž¯G£'ÈOÞÊ'è´Q~Î{mز¥å4{ñ—Ã\\߯ ‡£é,ò3ÇÉß`'>±üÓ+ôÚô°øªjòë«s?8 ™€³²…5¢]>š!ß«7+3Jý \n¡ˆþ2í ­ÂÑ5}czd‚óÄáP24ê_l—*ÚN~7ž‰õŽ29'ÃÄf™ ÛÄÛȘ‰_xd2ÄEâ"ð*ñ*ð:ñ:pêC&ì2O [½îWÊ«÷$@5žŽÓïº;ëBU|¿âë† endstream endobj 258 0 obj 275 endobj 153 0 obj <> endobj 259 0 obj <> endobj 260 0 obj <> endobj 262 0 obj <> stream xÚd»cf[³-\¶ízʶ.Û¶m]¶mÛ¶mÛê²Ñ…»ß}ÏùNÜóýɈ™‘9+bαȈ”é„LìLÅìí\è˜è¹¿ì],Mèäl,]MŒŒ¬ôŒŒŒðdd¿œL ],ííD ]L¹ê¦&!Ws3;€‰›™›™ÀÄÅÅù£š¬«³¡ù?>LLŒ¬6Vv66x&&€‰¥± ÀÈÔÜÒžá? %íÌìLŒÿ7quøo››©“ó?y”ÿ•› ðOf{;O€‰©<ƒœ½‹¥±)€ò—½ƒ§“¥¹… €Ò˜êŸäœ\´ÿ¡Àø¯dúW2ÿ+Yþ•ìÿJŽ%'à߲ʞÎ.¦¶ÎI;c{'{§J3¡„llJÿ‰ì P2u6urûýß,Ä\mlä mÿåñoËÿÕ²ÿŸ£¡­¥çÿãú¿]ÔMÿo²¦&–®¶ÿÛjé,féaj¢`éblpqúg(ÿÂ’.†6–ÆBvæ6¦ºÿ´÷? ª‰©“¥©‚½³å¦ cffý_6 Kck;Sggó¿&S;“ÿMúŸùüK™á/Ä¿fÑúebigPv1´31t2ùÿ€Í †–v.*žÿ¬Ïÿ„ûWgú]ÖÐÅÉÒ ÍøÏŒ™þó?¾ŒôL\¬,œ¢t,€Ñÿ@º€ÿfÿŸô’"VVF6Öÿ #,lïáMÇþO¬\v.'#‹ïÿSŒ±«““©Ë¿köO¥ÿ­›YþÓ8SSSca¡9=m„ó¢¬)½ºXÌtW„=—pðΘì'ç8Ÿ÷•òË«<;(ö䢕„K'›¤-¨¸'ÒvQ³nг#q—:„äB/î5 íæœ,ãPÞØPõÊ„»x»ˆùD†Hk¦Òè¥gsßvªzo×ÈÄj`ÅvŸtíoŠÉ çG©:ý½™8~lEú2Aí4hΰ¬æPòž ï?LXQ<˜‰ýó)u£“!p˜À½‰Í¤æèâÅ7»Æ\ª•aå<×>/²Á¥šd1«P3&„èF9asE‚—9§Tßõ›a7þþPJ¹"&²œOgè˜ uë2¾ÝLûMÅo¡ÒPQºøh»äʲFºÓ(Ðl”,â ;ÃÏ‚iÕçå2_ÔתàMP­b­U©ãàºS:ŸÓ‰þ–»¤²À—s¦eè“bĬ ¶ûó.—$F™¹ƒÊc¦î „¦ogD!k>E¾ö^µ#bicB–ÛLŠ@EÔ!ZÍèämq„y‘@vÌÉÒš4âùÝÉY·‚xòÈ.+†TI‚¥4g|·ªLÚ¶yŸ=Ä ÌWƒàh¾y™B\ï?2L±-œøô°«UJΟ 'ôªw•×}­Ô˜ˆ’ýu¬ï!g°Zò~üStz¹b-YÄøÐ²Öœ•*KÕ[ ?‚Cå-Y‰™Iœ´ï‘2¥¿¡Ç?{.³šÒf´ƒkâp ûÊQhÙº¦±¿¡Ã‡©Ñ‚<Óƒ<³=#?Œ4òì{òî%b¹Còãþ8Û¹›¢ÌzÙ~† ÈÇ~43èKüv(+¶®ªƒµu”%EpdcÄ&¯ŒÖ±ŸÆ¤H’ = 2^n#ññYM=Up~Åæ#j˜˜2tÑEf6r"ìË£®MEJ¢×¸ÒÝÿ¢£$‡Üã'³€tfm6ðâ] ¸°"fÕa—„Á–R,á~~ç£ô–˜3~ä6©-i¶„:A€ƒ:"•it?ºó¯wuÞ>HÀjõŽêØäê8:F:uéYÞP§ ÃдæìþŽ×‡Õ-ÖR_·(ÈÜÊc)'º²Þ®šVëU·“D¢u}žS/û%3GdÜ[©^ÅÅFlà300qÕè>TJô;Æ%ûÚ+I`¤"Ì:ß¾ñÛ¡I§ñ©uÈÇàáÑÀm ûѧÁŽ ¦–«Ã®t¬x…>I–Þö«IL «Æ õé+)%Ž©øÜ|ú*Y 0·¸Í*Q\F»í®æCQl =lj ¢^d­_/>XN«ØíÜõiÖGië󵥈öÇý¦ap^ýÜ›W@SeÅ÷ß#Eù3yaSƒ˜)0êuáAÛL(Xº]ì>ƒãì€Â§fŒWpZ™3Á˜}ÝrÿÐ!?õ7ª.ò%ܪöÌó¾ý’¹S•Öë½PqÖÀ€XCÃÛåÏ'T,»eøY;ÒSõÈeéURT>N£Áb{ô\/cCÎB;h¾ò‹÷ ßbDñ§žàž5~ûð<ƒ*>êµD ?ó ý 2ÝÇÒ úš‹.u3"Wöˆ€Ù"?Åï{–nõÖoÈœš:Y—×¶C.@¨¥OÓèB½9°¼,*r^ÎôOþÔš%Ô«Œ  ÈùÏU17ž-êÒ䈱|¡ãË[Há?`@}p×-©¡êâRvëùî’Çïs1JScTV’GÛ÷>/esFqoŸA7¢?ÁóÔ³$MZ3½×¢5tìzîö×kXód~pÈÝ+{á.iV·Ã+þ8BT‚l‡ `×[êÐÔø:$FÃA¥h4xcûô?î:çÙ-‘Ùzw™Ï…7ü­ÁÍ õ|Ï—¾Ô „< ÎìjÚ«âœK i…Ò¼—5ž²ø®*uAI;ï> š…g•‘ÇŸÂϸÅV=v™·D‰|̵@,o*Y".É`b©Û~Òj.IWªÔÌÝí©cö&ž$Gd ;FVÞ,ÞÒÎ>/›×b¸É ©uºz*bn x#!.âÒ¤u‘ê!GŸ‰·qÃÈÊ*ØêÈ!4,¤¡É/Žáð÷™”–&vö ¡Ô ,sŽ#eA’èd$ç<ˆ§A™+œøDñØ“.œn.PÞkȤ„iwõ~ï ƒÌž¯’ ‰t|ì—I×G±¬‹ø™Â‡ ÞžÖ†­3I°:à–Ò5£Ý+sùK¯)wµ5-‚…å2KJz}=D-Í£µ]:‰¨‡0H/T­d¿K}Ð×Z¦î6½¯¯…ñæRMj æÎö M!Ì7¶Ú1¬Ç©›MÑÌSLØZ~µçõnÞüÚ®Çhôg˜Q]d]t¸lîÙ€±C ëÁí„’€•ê«;52§v]ì&— Gó¢Fª†‚‰7X|Ù‰Ôüyòk®—.áÐh`Žéw¯¹:orFŠ¥DÓàOÙ]Ã!(:¢êC›~Ñ– 0q1€Ÿ!Ê(ƒ/·Ez¤ÄùØ€F—²îm÷ˆ²‘ˆg–‰…™B_Òù‘Ĺ£¼C”rØj={ƒ.ŽölzpEÆÆb6cäöq®ŽNʸù5**¨ì-–}¼ÿñ»E4/ÔxŽvÓš1Î¥ñ&”>ŠG4+£ôNYZ ë·E1ø)¦þµPˆ”Ñ.ò¨ j¼óÏ Rg…Ü ùÝŠÙ¢$×’ôÄ\M<%nÉ]u¾<öêoÖG£ÞA§–f•-Û%‹8Ü, ß .›G~9ɘKñ¦­÷8³ˆÀIÒ‡¢Y­›ž<™It3ET(±9"Áû[ýoãŠî‡Ç ¬v†¥½å©· p¥-„åvDø Z¥ã›F!ÒöŸ~g…föÂá… jØ!ÜxÃoBsVm:÷÷Ä.LªÌ|W NLi1/ÞðžDݱoÚ!šÂu£²ô4•½^içmù<¼¯MçgèŸ2Kl{ð û‘ÎDôcE>EVšÇ§˜/ÃÅ]…c&%ÚW»Â?TÇÈçB‰vdým†¼äfU=„«ØUÙY礵í ÀòÄV}ë)p5-ýŽdý&P"¶¿–qcoÁƒ£‡nx­Ÿ€ëŸÛZš@%©Ç&÷Ë}9Ð¥£O×ø˜Rš±?ªþ7-hÀµ¤’èÂì:éõ!`|kÖ}§ ‡Éë±}æhÙÃSQl{ÇÚ–£-¿š’²/ýM³“1ÍàX¨)¼ô}L$ðÀ±{® ôµ%Êt¹lÀ¼Y=û¤eäÅl–#(Âá÷™m·ŒZ$t¥fþÔŸ¿ë>ÚMúŒ8IÙçHàåÛê¿ÿö–ôpÚ“öVÅTÒèã|¸‚o§³PL…žv–ü«8âž$á5ÏÜ{qû¼cûÌyTOj‹Gua FÜ&Šzé z™Ù`ÐMù0øó-URUZâx*e±FkÉîl#_’®Xõ}&I¾tŸµ‘#YØ­0Ó°ØÞM)r˜ãÄ¿å›ÂíC,V;ö+pã§¼N /§Ü4~t žô ¿Ï5Æ[²Í(a1ŒÅ¼´™§žqèü]7A¡0Qïö q¼€•õ×P~?.Ú÷Ip´ÞÔß»š§UßaÒùÀ}•"ÁÇIèYxhº2Æ9çP´ø9´É¾§˜œqÍ×b¨Î¨ßny?jï³´Ìsp” í|§Œ’©£jgÁ`KÇ´¦ÊìÅöÖT™BñŸ›L,!T››m °\þºgïfx—Mž•‘ ZÈ”1×Èâ#_þ‚c½±÷{øŸ©„êé ï©¥ñú÷< Ö°ò{ïçX5ä ýÑKî°¢:»Ò; ûq¾å;t|aagAsMF“°S'£_P@‚Ä2_8èäjr“[)_ßÈ ¸.禦µ¹¾›¤Y9àär"¯ÙÀïª*aõqÉ/¤D¾‹vžyð6oï¬ÓÐÒÝž¸ÑãåG%>ïB“I•’Y³E-ÍD˜Ÿ@¹=7!9iŒŠšM.,Q¶ûÍò‰DAÓ©od¼Afó¤R8&1Е¡†zcCN¹ u¼ãŽÌ$uœýšº:.;7ydÄgúÆ]ÀI‡ŠëÞà"O7c~+m]HÔš:DQ;ܘ ƒ›` ‹@>Û¶óYÕR8ìlå¢Õpß[» 3!Ô.=ÄË…kÊðíx`ž°‚Ö~Z9š jÈd侤æÐ«ušÐäwÂ(;eVÓe¯?°¥Õ9'^®õÙ…iŽ+lA xv‡1 "™F\Ôt>™^Q?Þo`Äb#~×¼gÛ´¥{ON!çUõÒSë/áïŠnäýí;ê¾ñ£ûœ–|i`ÛY~òK @³"Þá®ÁK á$éŠäTêê> ™5Í‚ôNßá•f‰v«Ö;]rAR«ß7ò£ê7@Áèò(jÿE}òHyÒ{¡îRIôàL¸>}ïû»Š[ìi€?+ÒLq‡f&øKÕà׃sá¡ory„mý¦w¶¾¯WAifúæiJåj¬Ô<‰ˆ22Öð@C|2hÑ(êÜæ^®ëµxÀýÈE‰~ òΑ‘âzÏ1]Æ'ø ŠõëçWz7± .|äL™sÿ/D³û¹_ýn&ŸÝæï¿à²çªLá‘®K½Né·òíoðã«:÷¿A€*…6´Ù|3¼œîŸ‘=¢{Ÿ@°½ÍÜ„ä{³²ïIŒ+0|ašñ!¸gl'g p2éÕ±§@<¬#ËVcµ+aù‹dz­\oÊ~2=쑤C¿NhÎ.Eð_~N¬Ø=µûEo%P4DV”L`A¯¥ÿ ‘@D7atœ„›ZC‹¾Ã&åØY¬E`ë´ Õ]K ®ééݤšŠ7v^ÌúM1=¦FÒϘµïF< ‚`F.émÈ9Î@û¶ŽOÊ„fϵç#š¡}ÃpˆUø·<û%éåçÓvF>×E-®#»u¦ï4énTQT:ƒëÌÎÛÛü©iì-ÊšÉÿ - šIÁfNò¤!'Åqá {žßíq2½#Y\”Á5èÏRÛ™6PLJ?õyÿª%5R©®Þ –‡ÙKúô£I:/¹¶Ý·É”Zdá½–hu6üv|ŒW¤ž$g`.„!pŪTOUmU‡°ZùÌà`¿ð·c8ÎÞÄØ”Ÿ ÑöU8ù¡"“)lÌýudó*åpE(h‡²<$DU4Q•¢ܬW<î/qð rˆÙvàOF](‹'Îg_Ûë$ýy·óHÊ—O?;šUÉZoÀyA•RáVÑ1DTA –¹¸%ÈMšÒ´Â+—:¿áßnZ8©ˆ?šã:í;h ¹±$ëyåZôÓP‰ñâ=eܸuä6c²éÔ` Áü"Bq„;sV–BÕO+llõRÚ 'i“Þˆb¡¢ÛXÝ)ëj±þ`ì)ë®zUt-ŠÞ%„–?ô:%_ C«Çc…eÿ”Î8>àƒO•Zqð¼yÓ5­™(Ža¢:T ôâAD(“ˆa£5Ù0q‚µ@¾Ñ¤Ë!ê·¹î )ST‹ˆeA¬"2£Sëõz}¨‘÷XðFˆl JÙÁŽVì…nÅ9-ž@1ÆbˆòjfÉZvþJˆö°¾ l+ŸdγúÑFÅ0ïcÇ.ç«^ЯÎÄH`‰v±÷IÎf†ûKM²g^þrŒÅ0×czçOðíÏ%¬ñ5šHPLÅ^z«dÈdVÚT?$ßêÀÌÐõŒz*]~ëêx*P|gëäíÜJûpî.‹G~T‘iŸÆch œÙþ*•.¤èÎ9/Ô„;Æ×óœË×iørÓ²|$ŽØîßyY%Û•׈W‡&W´ïzCUÊfd¶ª«¹ð={BPêÉ4޽cM’°á„D«,—mi~d@wp"Dr¨f˜/U¨¡å°ÉðR¯MŽØ":ÄýçËbVtlE“Ír Þî0¾ <×¥èQh¸*@3iïzb¢ÅhÁSa[£?ÔÛ=^=þ<Ÿ]gƒ †@iå~uNWÁÜ´-v(ÇE8Šzf7^»-º’1ã"É.|­ýGP•_gËjäÉâ÷ õÞ8‰åÍ÷w¥™³6qÓUOJÆ[mªg‹ºå ø ’ĬŒ†€X¥)¯ÏßÞã y¾ÌÁ)ïz,)Ç6y«ß­êWã#/Ò"ÎwôüÃì+èèÀVÔ2s]AîŽï`)AÈ›O"[ømÅäž± 1»›”*›V³‹=dx3­eáÆv´ ¼ê*ÕP(®Ç¬®äŸ€nH \AÔhÑ7\]:!zK ) cUA ¬ kµœµ°øs}”¨ˆBP[Äᑆ½£_[âq^ŸÊCÝà_v™˜ð/^ñ­Â‡Õˆë»=ÜÇ(ÝSÇ8L{½[AóJà7ƒÒ_d­¯” Úê+TŸê‚:*ý‡üZÑ—6´¡%âÐècí¨Õ~AÓ¯›ô9Ø.ùz§×ç¯þñ__±/"aÒ—ÀvÏ5 Â…ï45‚£ß?„ÀÂUŸ]§0›È'ì²vc-ÌÓ)ó …ýœ“5çûšNŸ—X'l$ÜÕwÙKº!"ØÌðø“6BɱÆÙÇ,•slÊhÌCtªí¢Ñâ-ËÜ3KúOè¿å\@Ѷ•î5»¼æZ…%ð£žÁ ŒîU“Dèa :x]¤2äŠè|%eâ?ñP;N–I÷L×6p#y¸ |ŠöÚä£ÀltÀìåJªçSÚàù£½ô„ô`žÿÍàYá'ã¶* +™Ù½ï§¢¶ÎZZ2Q²j65[«õì~‚ݘîŒÂí¤ Ì“4²–5½]NZ»‡Áî†O çØsŸ ߬ è[t™¹Ys8 ¦Z~–öñ¾—Ä.¿DOC±¨Øv©˜çE¤Æ{×ÃBšÉt=f?öCÖ U5äB/‹Z,¨‹<,ÄÆ*Œa"t(¢ôÀ¡°ð!pÀ‹å™\•Ñ}.ÂSÄðÑ›Cîj°™½p"'ûââHðÔYa#(rnÛörk¸æÆ¯i×P>öT5p>à`¼‹ñ.딫?´`b›LTÉ=…^V! ×yD¾OüƒI~ÌÇ%-™¤²wSÓ†7ú²ñè1ËçPÆØÝy'è;Áõ[,<*aG5hŸžL‡®­ÆÏÊ&ŸÕÔŸ%n ôä€ùÖ_/Â;Å(âñÄVua\Žª•>;Ù²·à1'Á&ïÜ‹0 º;Ù‘j $ÂL ?B ¤hí‹¿6… 'èÒõåä;T'ÑÀŠû¥ Òhˆ ä—S&¸ÓQÉÂ-.7ãÑÐ2ErØåöBµ Ízš§ž²V•¬sërÌlm ?J« ”JHÞZ‘rPî–™éåVwq« %:#î«ú\âhô¢»ú'©ë¶€:¬º­˜>úR+A?VtpjñOÿXAâÝ$Øoª!–aþÇ_°>_Y¸ÓÿmúEo ö~{ÁLŒWK }8ËÈ<[FŠ÷;] íKz½£¢¥ æYt½&1$<Õ¡J5ϺIcçdQÇã°P"ÃüÆ•ÒdÚSZˆ”$Yõã£h¯¥ó†Ó?KÂ[rîtò£š5`\¤çÑN̶[ÏÀË{¹;ÛY¡gûóÂWýCƒhˆìfÖE‚lSÝàšPP™ô(¢ ÆW9J)äÈWHþ‡À6 ÓF­ö/¾—àçß|¦c^e+âp«.5áêä7néXM.!SÙ KßÚÖ=*ä>ìë+Õê¦ [‘Âç`D:ߨ´h‡?ÕßðÙMŸWÇ£uÑÕ…ë»îé_3 öF¯k†Ñsyª7ٖͤݫ‹l{‰E¤ƒW¢'ú’éílùü­WÛB tð%“@áñ¬vö–?(Øh5D.+% Aú=UUrF½×sp›jãp¾a¬mÏÕŽaÖwÂeè§9 [&Eý“òi¹Ñ^´¡¾‚ˆ”Ãçlt@årÍöÉ{Ę«´-¹ûè6TbÑG ð«{³T‰Ñ:BwC­¡J©“Ü`•Ûô]8õãy°øÚòZßùh¸ñe;Ï84Ä›¨DiÆf7Ë’5 [` ).µÚöÛÙƒj5ÇØ¡5Ëû2–Êó@oO%AR'†Ž9ø¤àÌÄ[_QÔÛ¦#Q{‰¨lWeÑL“‚À#yŠÑWÒ é–½C ,µJed‘jC¬åPòÑž‹›®÷Ù±– ¾…3J‹ÉF„µÍHTœªFÍ0wÑÁÅmwÒõÓcÌ>ÇbÅ›©?¹šª@í^ˆ{ÅŒô"Ë‹>¾X¿Ábh4ÛÂ÷=Ã¥ó÷ÞyJCçÃ{~›ñ¥ê‡é$y¨½Îo8­>«‹áÿÙ./Å0ù豃Ÿ½¸«Ò¶]Nvp ¯Œà®÷¯J@Nuâþºž$U+(§ý¼8u¬ÏF<úØô\V/„7ý[Óz~828B~.ÅÊèòUðz×8 À–ŒSu™þþX…O4…(+œZNí‚VÅŽg´¡j@B¶<‰ˆäŒ7ÒûÀª¢Ç³*äE& Š/{þ—~ÎꟚÀ[–âóÃU60 `M›äøâRÄ©Có8ÀÚQŒÜcN KëÈSÔŠ¢ý§Ñ÷ƒÁ+ï¡ý=ýæ†: „Cϳa+¿¢GÛdt`Ü뉔çïíϱFÓ\2 #xÌnoœ±•~8Ûm hñ±ÓFáÇ÷(nf9xp“ º§¦¥R>DõÃ>×&Ùt.ʰ‘Äç“Rg4ˆ=«¥‡ äµËZ2„SÂ3MŸƒ@zù×UÙ”tð[èM°™±æ:V[ ¾*Üýu”ZF‹e)§Àê‹ÅØB &O’ÒcUÊ„ |A?’6%ÃÓͤ‰ö²ZAòs*Þ MQ k½pZ”à U<´„Ø÷2çi-+ÑêékOÝÏ0UL·´ŸhïÁM¤)MLGš@ƒMt>îQNg*\ªä&9# †ЇBÃ4/>Ä;†g¼Öùjc÷=Ü9·ÕÖvC5¸ßÉóž7hY‘Þu3o°« `A5 E½èmó57¦’P¶wrþw~ËÐêE7S‹3)½Q¢oUØtŽfOû ½é•D±œùÜŽH‰)»4tdŠY²Ô4¶>²K†£øíu˜î›Ü¬Ï UN7ÑQv×ë NHg,'>'kfj?°šÈ{©q½Ž<¿ ¸’siè‘gD3Óó&à¹ahþbòÙÀZÙ{è xÓÔ£­SMhÅÓ¬BŠ[/HUúw¿RjO¯=)mEè:~8«Â…›cÆIê„øcÚ¤BZÈää¥ëV‡(õe¶Ãbì-!^ùÒ¹W¬JíÅRdmé‚Ö‡b`?ÅÒœ`ÃØ9Ä},»”ìÔëØàïÄC‚òT°³ úõ0’*,”@â>ÿÔc nb“Óh¶;‡‚¼%Ðì;âf³Ö쾦{àÜ'äÇ®Œ]hߢ|0ŽØÆ‡wÝI}ctG󭎳o %Š1~ëxؽçš2w¿±ÀÈeê Ó_=WNò¢µÔ™é+ ›Fê+WY‰”o²ÝöFû‘Vçî8!PBD:Ç<–¨æ™f–ÑjiM;uŸ7tùéyŒ‹[³É­¥$‚¿,™}t4J®ujà ö Áo-kJ ràkmKñlÇ®•3ÈNA­€=®—Üd¾i)Ò;‰®¶Ýá}ølâÃÞT[âŸH&íÈ™éþ†¥1Tµ,ÖfG?{ä pK~–B¥m[;Ÿ`û”éâQ²QlC²W=pYˆyÑ6Däè ž"w«ñ°*õ›Pˆ×Ý» x°â††´y P6‰³žjGGýpUÐ:!Ô©ÔnÒ5?®qÔ{Ë&–¬¹Çõ…6ï¯V’ U’ÿæ‹ügS½-­‰DCzfžhŸHæjÛh¦ÍÞç2ªóåK³çm÷WEIí³~`JA…›¡Sõ½Ä>5ZOþ3†G©Ø7Õ DtÍ!Gçw‘Åä~?ShnÍq&lP$Ë/4èziqÐ÷Ä¡&×k1àR¤çqߦø Š9 ê×*P ¨ó'ˆ ‰?¢ˆÜò¤Z“É„sXÎw’ØäÑÄê+uuågVûädªé_Îèe­ï¾®'OÀÒâM`›vÃ`#ðvnÜŒžÝSíPïp„ò¯+53ÀÀÀ í‚=ʸu ®ÈF˜î­Õ4ËŽ1`×)¤” t`|iÈÙé_rr9X~g‹±d=Þ°TÛ¡î Ù^‡ü9BêÖG@*%¼ëXØ9¡ž×J 1ÇrYdY|ø  ,VZ/cIU›utO¦œlkÅÁ ¼X)öîäšö3j ®:_°¤ïƒ¾)Ù@W§…4TWn-IàáT-®8XQs—àû*ôEH!Œ åÒæV¥wåîØÂ´àÒµˆ§µö¼‹÷w5Þjœk¦¤¢9‡AM<’AB3Ä *+ ÉvK®®2>`ù÷.™£p€sZÔÙ‹· ßvÏ7Rç(;‡(2!ãyåIXŸ'ܨN ¥ùrÊU šÖšÙž>¬Ù_QYï‰zç®8Þ¼n‘Ó}ÆŒy•&¥·Ä‚C:‡Y¨ <â]ºŒž·¨i £6k:ø¤§š‰Â‘ ïï†Qû‘ÚÙ%\¸öìTuÐMyU Ì3VŒŸI['߫һÑÕ›‡²oÁÂÀ òwQ¡Ä_©#, äbàý㵜c h%Ø2éõ5B æ"JÝÃþ•VPU¶ÎP%Á£cŽÿœQ3¾ÇïÕ$±4TlKªýª¸ kË `šÀÿ [èÿq®1 š PªÞSá_H^zø`¨}°‚"Ù|àÌÜ«E³u¤deEUܯŠŠM¹éPÍÆ}{™ ]š5óƒoÿí°¨Ä$-+œÆ}ò&ŸÀe÷Å{bð_ߢw~0²L¡ûˆ¡%Xú2‚ùk ­š.}W…Ç<ƺ[•ë øËq¢°õ7"0bt´‡Dø…¼ÓÃCïÆÌ šFá"šö>*ˆD§J¾À±n$#MÞzÍv¦ŽêªXUA ÏØXEj±(]8ÉPQnNÔ…ìvÔ[áÉýjHI•…©˜x©ºRX·$T–5ˆƒ’´ \òb:zB†¯¨tsJɳ³ÅŒC¥u)Ä’]ÿæç¾gâ[¨ŽóC§ £ì€Ý}>‰Q#S*º‰ßzBŽ|0wÁš5ÉšÀ/X Ö® L&3Ëñ·Çaf—˜¥‰d~DTÅ]¹M¸}°]Okǽâ«#|‹v죷wi©}zÀ”ú½U4Æ?…µ °Ü€cÇ8ÕŒž®”—Ç«ÖÙ>Ê7°>O½C#[»®Ãv<t¯,TÄß/@œ»Õ ~Ý qˆ‘ßA•“àA’7{R¤/´kÌô?È’½u÷ϟ컹 hze×^4) §þ"“æÝVU;•qIE›šíËKð›{p wh°¢$` ›ó:.£„'&Þˆ–Áßìâ¢2韌é!©ö§sǪBÏíLO²] áÁ÷ÏÀÃÆ\­]›pߋޮgU ágO·|®¸h)uyOÕ 9«>ÑhÔÍ¡aÝ\•#ÖY.þ¾vbåû­‘n%ju>x±#Í÷Q¼ã&pûØžaŸ¡æ=Q ù¹Uç2wïus‹‚4Í,Ôh€j–°7åÚfPôöÊ„°¸è§êID²þÄz‰DbÅú¡Z O×%F:¹’ñ̦÷< ߬R¶–Ký\¤óÎ*µæF),DÚÝ=¡!9¿L’ŽˆÆx+š[” ê== -¿ ö«$Í ƒûºŠyBéâ@ÑÁÒ¾ÚSu6]χ{“-9w®KÚwŽÓJK• H¶&+»Ä&híد)c,ÿÜéÞMŽå’o'tR²T}¬Õr—ôÃm‰JÀ“zïÕíÎܤ3aæ=ü«Ö2"AGϧ))b°l ×gþðó*¢î‡1]+ù¶ú•yÕ€–ÁÜv«0Î±è ­ÛMÎl&–‡a4‚*"þ.ÆÖ¡p"¼nB“ÜïÜâ}ìF‡'õL‡Mhè¿ ¨¸»äF#ëIÕ»¸|§Zø›ªŽA•¸®€qL¨®=Ÿèå³k¤ª„/Ô¶ýŒÞ‰œ@Á¢KÞ¥-Tâ 0ŠŒÐ£â¤Ù‡EKS”™t›šŸµÚåˆT²"ÞÁ´âé˜Í´Œ¹1b[ØhXû5¤L¾z¦ð&çVŒÚ¿ÝÜ¢ŠÖ›ˆ@¦j‘à©,&Ö®ŸòèÌgœHWë¸)z½XÑ‘˜è½~ –bqMî),¨Î×2Õ¨¸9Íãeîyk¢4U¯¡ƒW@ÀÔ•?±Äò‰T %{®Ï}o·w¦>NƒÇYô>ôŒ+CÜ«tÚëª_÷€‡ßª,Èv[ˆï¯l¢wœ…5çóÜÊcÎÆ±Ñæ÷òÇ›§o2`¾†kA²§Ÿ~=¬Ô  å [cv2C[&ᄨz‰ÚGÿ†‰e†.‘ð-ÀЄtAËvÃ…šMŸÎºÈ×T=µâ"q¨ú`s:Ží ²±ÔèjÖ8—Ä\~Â)ùè/‚T_QÓa¼‚tC„Éä\gýÀñÖŽåœÈ}}‡¡P€hìÁ\†ttuwXq‘ #¸]èeÚOüÁíÔ‡ëÄC§}¶u$F“/ü3´êgv³ºü Îǃ†½jsF w;ñþKδÅ=»” ãÏ”yu¦üï1p¤o¥œ£EsÌý:â€% Xù„-lP-‚`±^¨`ÛWo¶+«> $n)’°ÛÛºìX¶>ش컯'ä”’¼'ÚÒ.t`ò|`N&jè\B†9‘ Éryg{HÃã ˆÔÛÛÐÝ€H9CN»Q£Œ&|ÂPµnêÉYùÕ êÙKT¬´ÑXwº¶¼þe}Õº“6+IK‰±Z!zQxص2÷Ó™"™ö8j=äRyÁÌ^ªgC<ÅñÅB*Á:¡Ç{à"JþƒÒõÞ³x«]¯ÖÈÙù˜$ÃÕ‡ªS@h‘¤öã,ð‹~YÁÝrŸ¶ß½û°I˜N—{@‡T)w|wOrËëÕjS\ÖÈ„Øí늆¹Ê÷Ô…5 „£€¢ËÑ:÷8¦w"Ô¾Šá@…Är¸ªžmÓx·»Qy«‰Jn½fõSÒÔaÓ¥·g’Ä®Ïô”z–Á.v`|°8¢ËøÒïg2~u¼‘FÒ_±cƒ„ÑÃN£#Útó!ç{«J{ž=6!²¡Ðõ0î>Ò¥ÞlSón«Sƒ¤b¸%rÃ7+:iÔ€E˪u[è9wë9ˆ?ôV›s‹m$ÑDu fŒH ²Xt“ôû¢@ÕÖK[|Øm^i…P! ûvvØÝÐÜ&F`àKÍÓñ†[1¯ÿí@Ëñ~Z‘æ<±ïÔËDJ­¤âpj˜œe:¢Cp."M´Žžb©+ žf[¤ÁÝnÿ×Û_ß~n_}¶”—½t—WÉîÑ=ÊìŒ#‡×K‘PÅÚ•‡™3µ¥]Z< Ð í0æC¹éÕ!FîÒp3~µÑ:—™3•õœÞ[^¾Dª„5ͦ^EŽyûU ž…TT¡‡wd½}3¢ ±KÚÎî3ysug%Á,8³n²äßGêt8XÊóÇ=úÜÙÇ‹ˆŸ LÝM‡+ÃYލÙ^Ú׿÷ú›I12ˆmþ`ºO„ž¼lÑïÍj©çªH~¡L7zë"#«–À«’6µÔG¥MƒÕ~Ùf…0¾Ÿ}Tkõ`ði:î(èÝ_«èþ`Ç¡3˜X­{Ò7¢¨ „GnÓ\¥^³Í Ÿb‰ xqg·»óÁ¿ðéÑì­F‚,¡ß0 )Çû€…Û© 'l¿2±tŠf¸ò¢géa ¿|¹h9E35±Qƒ¯ÿH”ªÔ NßTÐ ¥v­(ÆËk6‹;JûZ™f¦ä¬\¼“#DÜÇ1·Ε¯$ÊåÇITBSgðw/ÃF*ÀÇ®¡;’vrµ­ê†Ö°ªŸl;ÁØÎs+(ƒÌvOÂ~S^¹¶ö‘*q0GÓ.IÆdK˶ÒLqä–´ÐÈš“´«<ýžñqœùóÓG™gbUïC·È¦CœRͽ±7ì—_Ä6Ç®rˆ=ŒŸÕ™í» £UmóD?Þ®o¡~&öêÏIŒÛ$SËÁÇÐn*®†çÜÀßb)þ­"6ðNDìƒ3/Q¯ ÝLÁ\Œ|ø7R)-§­8¬‹O›ïðdæ¯(¸ÐÝtmfŠñãÂüÇ@Õp|+*$ Š6Hc¾e­G— §ñŸï(×'ê|¨e•(D$75Ü  À$毞 ¼«B‚6—Áj"’—C·³/ÄC³‰dá`òçZùTiîÙÉFÇVT/i™'»È닟Né­D-÷´Æ¯_i…e÷AÆŠu*ʾ#‡)IõíøRc[å1t’–˜X/5Œ¤]Ý_?êÛÀxo´yÝñÖh êÇõ:nÏ•rÀé&2XºYÐVøüUca²Þ+P˜˜-¯¿÷A|¾~S`ä»ú °‡0-©˜>­˜Ëçmþ”F¾™t$åôÙ˜NM*Q:¢*<ÇçèTWò¢bòñ|-óûI‘—>Ñ'˜§7‘+m1ˆåÌ„BZÆÎ¾ÔvS{‚zk26}X_’È%+Ÿ¿ÀõFU<}Ï00櫞f¢ð¥vPÐÒ»ò(ÿæƒÔø’ l%ÿuy%,éõ.cd¦ÕnlFîf€¤Ò°W²#(œhᨾeﮀphü´‰“ŒêÇPÛiV`ËNU¶ ΘJ†H‚±M%ÔÏ"¯X‘.¯J‘QÒñþQfþ8;W|¸C0~,Çyb’ò‹VÂþù‡+‚‰—Q=‘|¯½ [dÌÚ°ñ¸ ²¶×䨶zû„jt{ÜlBŽÏž¥p÷-ìà+hê÷Z*n¿ÆW«|28< ëÞ¦øuWìÒ+øÀF#£Ž±Î ÿ¶7íIÁ'I–Œ£œÜADÙ5UÛiµ&6O­FØ*ù-B]™•ʈ]YödUv.dj½µöïôæäy¯O1„TóœãÄ•§Ïú]€³jÌœ½ô-ùÛz޾+Eâ‰q††#¤x‡g¿çÏI »Ÿñ¶Öq0L£[(%™û¦ý2‡êcj´¶øeËñꦆ¶~¨í¨]3R”;œšë¾”1 ߈³üÔÚ »›âD‚¦ Å8•UÙó¦îòò=Ž)µØ%¹iñ¬ø LÀ#ŠŠ‚ÅN]XöQ9±‹ŒU‹YHVÆô'ùƒ~èõ ìÐN°ã©á²—’ëƒ×ÓLX¤SQ· á ,lƉ2ç® #Âzò¼aÚC…^‹ØeR^{È®þ,ßþs=k®?¼Žífèµòº-3ɦG¨Wp H–•ÝÂ%Âúªåk m‡„¤Bx™ŠÔÊã^Ü"À=}UJsDù ‡¶#ÜÞßH…ÂßÌ8 ÷ZŠ*ƒ*Áï°£ã  5maº¾TZÔèú³Ôÿ§VL³ÝvñŒá"ºeJÂ`"ëb×E:¬òÓ–¨È–4+|T»zýjd6ÃdŽOtõçÍs<1 E¨=|rý,|Ýõ$šd§m³„ÎK1`, •ª–,$H×ê1oªy:µÖ'mJL)¯_øÔ×çæÉêqŒf¿’ö0“xÍ}‚ú™ÓÔ+½Îy:ºns+ïeS®e_ʰ¾ò¬ °ˆ¢ÄdŸŸ§mr©M½u{­ãB4‰œŽó“X‚n‚Éc}¬<=YŒeslNÁKnI=·¯ì‚R½½BU­P¨P L÷­ÆÄ§T˜çþd"1ü‚Iæ!½&Ü.’Ú)Áq¯ûq´ú…@â½:Iº;»ÓXŒŸoÞ AîpÓ”ä%vS™RwìÏs«Íçiˆq‹¦{”ȃ;6ô’ì>I:Ïת@ÑÊ‘˜mŒþM{]¥Z¶Çq„źYQÃã\¸©Ê›^ k26ƒ^ïu›·_×Z¨Í˜ M±°»DB”a]ÝjÛóHê°ÚœÀö5H(ºÃœ-û÷Ö±R/8—œÖÆ„%žN\T7†äIËS;.¼ú¤ÿì·sYcRÉ,ƒ]ƒ2v¦&WâlíB¿ª ÔX¨i DbùÙ'š®ê5! úû9ò ¿ýû)µõIb`ã;‰3îÃòÁbuu¾Ôñžþ¤¹y°M[ÅÕ¾ëñ ©=‡à°iîî7¢ç.,Éâà}Œyž¥¼˜ïG®ÆCfV_0/0SoêòŸ ‘k¤=‘ J–”Þo'Ê¡øa²êäßEY2¥‹¿{5™+ âøz¼œÆ@ð v»"pÿë7„EfBÉ ›á¨´×-¤—é•AX d¥Ä\ã$>~Àí°…3,Ú-@j:N`¼-FÛ U Bañ·è×XÃÛÆç°f#03œ‰aG4‚Z«¢ ‘ÝmjrW® Ö Aû1åôWåä ™£MÌï·0{‡üŸMv† 0‘¿àŸxH¾¢› Tk «1_$Ú‰æaÒk¡@÷ˆô뀹Þiórí_¯i´_¥H+ÉõgLÁ½ZÃ:ÁÅp ÚÊuæFp£{ÉÿtÔE>?©Kx¶Ÿ… f÷ït2c´ùÙä6 Ð/´Žz—–Ef@ïß{Ç žEäƒjaã­NFSzG²w\qž“òùßÜcã×e:¹0„ÁH¬ãW¹tg ˜‹T:AÜåí°Y|2lHþøS­‡KÈlÙ@­(R{ϑųo Aïùå|¼‚'¸n!î±"ðkÉ&‰™êÅ{PâüOç'ª†ž@2ïá—&@"1hVçÜ]ìdŠV†‡£ ¥ïºßC­Ýb#«•T7úÛ‹þHÎç2†°Õ °~çÕvº:+'VÏÜù#ÌNŽ1Oûˆžä‘Ôc×@g:R¸ÆÔeÏ =FŽqØz“ D‰úâœ%¿/ÓÈeñ•:$‚—‚ò:”;éÛ_Ϊ*u[òþ‘ÜF¡®ÙÃq9l‚´SÖˆôôÚ9‡æ\nKǶœØ¶mÛ6OlÛ¶mÛ¶më“»oWݯªç=»u×X“=X{ïªg±ôr,Ë¥`щKÆøv/rÌZãYF¾ó¤d(4–¼¡ÇʦX;cË?ð) ÔÍßïiHµñ…Nn6´oõ€RØ9â þ®iÎô0vS‘xà]É¡K=áì;.3ÂÞ(Š”õåíîö´QÀb WGÓÍd3ïf™Çɾbe7œ%»oóî3½~?ŒÍšr.Nmd)ˆ¹Bþ@ª,™S·§„É)"XòEÒgfÔñ"Å$ûÈD”ƒe0O÷4}㾹ѫ lGúž¶ÊI|Í óŸ,d†K™ó;S´j²ì— É#)ó%°ó ÷Ó€µSš€È¥Hœ“”•™±Ìj`Þ-ž¯½öæ’©D§Ýêóˆ6d§nÉŸ‘Ê2cÐέ/j7†M-æÄçWi©¾Æ(ºRW!:« {M?Ì¥¬rl7ðt½+ªí%ûA|;TÍ‘“ñ#Ò£º¸Ê”«¾VŒöbñŸîW«»<ßÖ Æäâ©9hN¢$Odû‡IˆaÅ“œ%ÛЇg4—×›J\>|?b7BØzY-¡-&M> EHyËOürpµãÿ¡OÌxã,ŸH ¸C»1Îk»<¯2 ÛtE"ì-· cw`½x¨jñ;&C’B äз+Üh\à±4ÊT4–O’â9hOâý}¹Ò\AV)ÊiYý*BiZB#}ÇŽ4áÒrl~¡'ìpYôÞ'2XÙ¸|cv²òëÝ >lUðqX»歀ϣڀ¼ò(Vª°o Ì´±Úy„0xØâ½·¢Å®„·ƒ¿ü dfEÉ’<÷‚ã¬Kñ„]Ò 8F¶ƒ5¹þS\¼×Þ›º)w‡o3/\{[OõÀz†îiÚÏ–Ô:°¦˜s 1¼ŠM n¶gÁeº«‡Þ  ¡2 Ðï¨ÚˆdÓ¥ö¡`…„é…úËXÚ߯HÙ”z~=üèùªžåî¼Ú!ÁýB„üK– R_ž”Í-uNŽ«K\û'Ãlî´i‹çŠ®©^ÁOñ†ŸÛ–ÅÑ’gtÙ-e#Pûƒ@t>ÏçU¼Ø2œµ ‰nMDÉÂÒå&Ê–ûá8>ßXì°+Vô '5kˆ™͆÷ gÓL­ê©£2Ù(¢«Î˜Hõõ [·_£[0øÞü[Ò"¬ 2¬I[QKá`=ëýÆýݯ±]”i h7¡¾[픚±û€~ûÈï—ׯÁ«˜dw«‰Åð”¹v‹q£ðLBc¥Ô%>g¦yIºõ :z*j‹g›° Q‡ÅGŠª}‹8²™ÎM Ômã³?w `sáM˜ ºÔòÃ.2ý®÷â<Ü·ÒDHþÆÏ3žQ&ôºP>)g°²Ÿë¶–ÆnÐr2í3á.Ú ÿü-&‘s´ÖV|g×ÔR»nˆnkÝî »~‡DK¤éØõ×ü¹Iˆ×ÃK–§xëÈ÷xN8 ÅÙîî¦,Í]]sϰhaj /—,ã|vÊ}.(¡1¥6Û]·¸ÁºO;dh*b¬ŒL§*«‹þ·,á+jµ|>k’Ω~*͈R^mFrŸŠ± ¨ zûúG;SÉçj§Pù.¥ÇÁÉÈÏ¥Eäxk3<•hŒEEpn_ÒÓ CùUÒ­dw wŽî‡†Ì¡uþo¨9ü‡™~_ÖV²P·‰ª´‰aV´Þå<ÎýY½\,1D¤òÁ¢—cT Î¬íêÜt¬«¬W›Le˜Ñ€þApÄ=êéçŽèÔ»Ì ¾ÞJDvœÄ¢£NÐM*,/¼ë›T§JlO‡¼“÷óÍzÈ ï„Põ©O %Ÿ+G#H¸×q"r`oèäú·|¹žJæGP¦T¨œ™7Ds+‚Püò£–©ƒlÉÈÜ@‹ŒS3ÃU=±±ëeéÔ¡k›B1LÅí§ðõ=ÑÏuz÷’ÐíÆÕQµKƒžU• Û«ä{?ú"¥ÎH+K¤(ð÷1Bvš¥ u8½OeT[F{6ñLÎ It°Œ¤³ÝŒÂdÀóz‰|íèàvÈé¢2 ÿ¢–,­*ï[RÐQˆ¯)p]ÊNâ…6ky»Ò6}%å©Mªöˆ0ô©¸®â2n#y'bYipIÔ3kCMo¦ÒÆðXhüäÀ KLTï_ÉÁlÎê, ìHÞÖÇ>ëÿcÀÇ “âæ*‘loËih"Û·[1R‘XŸ¨œiöyÅæ…Z|ÙëÊ.q¯QSvu[³,W—ÅZ=IøU¼|ˆ¼Î猀»7X4 §ùÐ4‘Ø3ˆE8D¦‚pÆ[0˜ÑÔØFņo1µ$/c÷¨ùoNx¸ žàÍ  T²¹Šäø øêT÷à­îOµ°n:¶¹,nSS'±|ý§Äeo/+.á½!cÉÆ]èzx„¶k©2³ÿ­¤YöÆŒz© —³ìêÒ ÝŒ0^Š¥­JvÈîî½'#ïDq¯-âÜt}–"&‘m”•j]gàËY9„¨Œ±æb÷FÀ´ÌLñáÇ»@€›¤ÒaSÈÈ9  ²é‡9BM ½«Ðpi`žßìùCýG%h€þUÙô2Ýé]gçÝ›¸ÞY_ÎB\»·Ráu¨¾ ˆ2q€‹ç©OKmjšH÷@(¡@Å46ƒÀóOš²W{²ñG²!! †uÙR$™³^_x³-ë_.ǧÄó‚Picaa¸zìäÄ· )|§¡Áª»?ò «tW­Û¬ïÕÇž?B=x*òŸï©kˆÒ¿†îû+™åÌ- ­ëe vLv{o»šSkˆÑ ŠÎ•F¥J/¯*ÿO˜ÌT¢Ñ–Ðã¢ûg†¢¡ˆ|ÝÊ{¤?$wN`ýfO{ UÆÔ§Ž¤Õ¬\Þ*$Ò ‡ž(¼Í‰´xöýÜ^ÍNûoá%¿äËä<²ÚmF â?ORZjÈ÷´mH6°v†P&° nò*2¼…²…P´Þ„Ðò »Q9h (/º¥†ÔÖÑ[ U?«¼Øu¯ŒÎBü®· ”4P~ñVLÂrñÄzmGj)ɺw}‹µ¬?UÞ‰ârd°{ˆð× ÃÚ›§*IPü‰µú.¥$sÏÐI7S£e5ÒÍdX×[ø0PâÚ/Û…g»ž¥ÚLu‡¨8ãw‰r”ñ*@ é·ÔŸq†tÌË‚¶(ˆ¹Iê̶Ђ@9¡<Ÿ 2ïûÛRÁc È‘™êTµ‘U[û!Û ÚÈמ•üÏ"H‹ðg‰_ÂÄ™ÔFøÉ‡ÑÂaF6R¬‡^Pƒº•mG‡ÇØò¹ A(óú;äÛÝGd}¿E’o/€ü&y~ëPÈsÂf”'úsK# ’"ò¸ O'¾xNbw>ƒK Œ¼lÒ’–Qç¿ë514ŸÓ¨LtEG¨e¼?É,²Í}b¡F)Àwß‚*M«¼oJ<ËElNÓêÑ/N¶€/¬³`^h EóÛâ©”Wpª¤·EùÄTÑ¢eü‚2›™dÖêyŸ4¹jñ:ÌQé[Ž€Y(‘©eÒûÛ·"ãR_]^£ æ8äX wh—ؼ¡é#šðú(ÿ$Bµ’_ïÀìüè¶‚+,'*Q¼™‰ÐJ²%Ûã»›Z÷ؘè¶ñeüJ"Īx]DxXùж ‚ÝW†™Ü첋©Ï\wùDÙN9ÇØN›@Í&C<»xyßÙäSãÏçÖ¼\Ytè½þ‰ñ4¦zó‚¸/¦ãX,X“Ëaˆö?îÒ¦‡휩ٶ$Èѹ‘Ûô&ãÖ·ŸƒŽþ=M¿µ81 ¼ë­i7£Ñ®LwÃ1B0ª¨1f™ÄQxy¨ów–B2;uƒ¿ýiÁ.ªi$qqÏ©Šºàåz[WÏCN¢ÁXlGŒÒùãáhôþïÆ<ÉÜd(‰Í×§¯šxÄ!"¥S—ÞWÄ@ÔÌ~êW%:þyš”44Üd¨$ÛRTÀ?ºs”_§cbEZMÂ+´Gé8sJÀ”J:zÓsá05•”Ó 7Æ@X ŽÎëðC ë¾~ú"·a‘ó¯ h’…N+ÿ"q–?ßÈ›ïsš‘0U‘¤ÿ× ÿR|áqL7z}ùmÐM–ñòc‚jØMÓÞÚØæRàŒ½Á{ÿÏ{ ÔG7›™¨‚+Ú‡>Ä…4Ç8$}ˆX";[rz5aƒ¤§LÅ|A¡‰7–šd\«j¹Åú+ãGvï>Uþ˜m±ˆÀ)~?­ê§²LAÎ^rÏ)‡ ¾~:>Ñ6\°Š¤úÐôÁ«däRÁßÿ—4¤Çó­'fqÈ£ÁxQ‰€øz §r¤ÚKÑÒTÍãÇR/%[åâ—z? F¦ó–N€]ü%<ÎPHan‚Mq}ƒ_—è0± ¤’´$ªý“ÀR«—VR°ÒK\÷—¤ hï mrÏQÃïtë¸ÇÂÄ̧Íup<‘Ÿ~6åºÆ[MÇ“3¿l.L¤iìÀ¥”ÅÌ*FÞ)‰¶U"¡QBOÛ£L©óA%š¤•hT? šPèêÚc€³hîn–ß{ôøËpCØÞô4›ß@oRImo*Ÿ¶Y&`½6"*¸äêëÛCÌ2zZ.ŽVSx£syè~ LÆš[„ê"ïŸNö–@Ù `?df<%¥i5{õè*÷Ù.‹°•ìSF@7ïáÄ6›E¡Åroj(“øú˜ÉÊ"Šú=çK†euËî3øx©#AwR¹Å5’³ìÇ(Ó×ã¼Æã¤6šía9èÑøõÝí‡EÇö\]ûG1‚.4:fžÞÈêÀÕ’eØëéTs–¹éÂC÷ÑSÂqµáª3Ts¤èÝZSnFĵÌ* ›Ö1_¾¤AßaQ¹OÔÓ`@S÷9qzq³Ú†weNšnMµaWŒôàƒ{‡ih‰sÕu®®pKSXs*S!øó‰56¼SPÔ"bA{!ìò÷æt Q€½Å×Ñ-ŠÆÝLiÝû5Oz6`¿+ÊwÊÇ…þȲCÚ:miÉpÁ"´Ó°e2+-:5ºøo¼nÈk`“N ;d(F¬f¸=æt‹kw_Õ¡Â`}WIÚÙnHŒõÏÉ «EU3Pví50}Qõ´íÄ¢ø0ý7ÌÞû“LM(E×ì}ÃRÍêY?ÆÆXGôš Ö®J -BN|7>¦[§¶¦æ8Øö -ša"?<Ý…$ cÊŸÇK”†ÙLì{0Ëo¼Te0<]uò°Q’aûì ˆ±‰Ÿ-÷¦ñqkÞzÔÇôa¬P?«+<ëálèy‹ë),!±¢|¡1ê¸M<ÛTz “ÊÚ%¥'[ß»ãù’ÔDæÍÁ+ HRª¢W‹¼ðŸdJåîÙÁ"I´õ"ŽÄûGaÑŠÞÁ´8‹ä"¹J+*ŽFÂrÉû‚Õ剻©Õ’Íê‚ †:1»úÆ~¤’f\ª m†»Êvø¡;Ñè|ƒhZÅš[fâ¢?N¿¶ŠA7°(+hº–ÈŸ·”o q¦Ú ù@ù ËI)è•â\ù«‹I¾3‘¿é¶‘‘¢em¼¬Î9€½žÅ;“2ìµ1‹¨ž}ß5’ºãÅŒ¥uk6|ðj¾¦†.åÝ…ÜöîŒþ¾ÑÇ5&Á)¿WÐ3Sú’ǃ«'°â[ûb¹Dz)œB=ÝîÖóÉH°2Ý å É'¡§(Ö2£„è3 ©2äJÀ8¹“I[{Âóå[´aJ«Qe¤¬;b®îh5Á°œ@ì Z`iý™ð’zû™ ËuÑ«i^{­u%F9d+¨Miïº;ESìË[íý¦g‘W|ç¶ýï h'–»_l¡ÇÅ]„wsŠ×“ÐìÃýµÈ'‚ößjVüûÐÉc~ÓáÒRý1°ï/˜º«ÚnÀãyØöV¹þAñ O’òjq-F|Úó¬©ÎÊôVrÚ£ ¢gåݵsv´z|i>°­¿­÷cصWÕ&g÷¿ÿ-jaD{Êÿüî/ {¹NvH>zç/{y4qDt–ñ½Uµ† %áÕc®æíf’¤éŠvt΃h®ç/‚†‰ ÝMSO,ñ#\#¢Ð€<¼‹Ѷþˆ~ž(CòtF÷}NW[•Ë  =‡9·,þ!¥ejXf:jsWz m‡t!flXá¿–åÅgWGqÏ\…og˜NXã»”³š³Ÿ·Z¶ÎçÛçŸÆÃÎÎß({–艪«œ‹Æ h²›=¡9–ö—m¢Èo°ÝËÎôtÅ&ÎMísLY|r^ašaÍYšbÙˆÌ2+ëþÈ>CùgúŽnl£Ò#‚6xWfÉU׿Ç•[ì¬9…¼Ç÷ Sßf‰ÊY_”À臧öŠ} ÂÎðߘs‚7€˜±Ú»›ºñw›~„–Wè¤% z —”½ùbíÑ®¢çB»ŽŒ4°S¶ðÈ~H¹åAótÅögÏylºæ»ÓÍy´ÁC@û´^РЍ ]æú3-œ†úDñÚæwM03ž$#͆ïEÊ Ê·†P"7~C7’öÌÉ7Ñ;Ä„Wðƒ@PžOyŸÜ£M!?qåK“pQË!èM©ðäq±í )és ˆ*PCšzº«ž™ºmní®<®_f5»¸œÛŠÇwD£Â,/™5´á·Õ#µóÙ…)&l•;¢J«?îOɼþ Biw)E|E§QžðÏwÚ.„Õ7nrì*3<-ãÊq_`[Í1Ê»$ñÌC<—¶)˱ØÞ}wÚ‚œbò›'R2‡SLZEz‹ùÙ–‘f‡5ùATS~€(v° ¶õh q≗|[öýØl\ÿz§"¥ïûŒrh wt=RuÜê{.0\ ‹¡(B>'!š[¸ÊDø4,GSÂ’*ã(PÓw7º`-­î!à„Œú<ÄòRP÷q­u³£¦è[ó½05)â·Õ‘YÒçwƒÜ%KoÉT^ÀhEÇœsÊZ)£¿S$'¾Df »ÿ³a{?èþ29_›¬qHq‡^Q;á´œ ɷȯ®Ók`à†V¥ QÜd²Ýw†sæL$¤îo½Z†ŠÒñŸÎfæuÀ*83ž_÷à¼x¾ê¼"w'”B®“2E°Qí#\d:i´¾vm×q\¨4Êü©” ð] ­†ý>cUÑoGuø~åC:á½ð\^äA‡kñA¬Í:7ÇܱhÇ\†ãú§‚wMtÝYÑõ¢º4&¨HrˆPýI`ž0„QÜsû¡ÿ•¨01zæØu³E˜‚žÎà:NEÄ©“=V)ʯ/xBtã-}Ç2ê0yVšÿzp¼k– ºÁ`ÜìÈë*4"[”¦PÇAî2KÃR ÏN~äÃÆò3Uã%(îT’—á`ï3êt0*NÞªOñ¿ui5‚m£´–`à^Âë Œ(B¹E% óºT·z‹×c)¯õG]pS~Dÿ!û½prsøè'ÏüÑ î9(¬×ß§ÊÆóø{¯Ê²óËþø*°¨lô÷ÀÛ?‘Ÿs"býØd#ø1þH)Á,èž²Nç‘INðßþÇy*5/_qï_/³ß¨Í$9a*£ã®ñáû ¾æÝM]rÞ/µN’ºäáûR6]%¶–~¨€³?ÈŸæ¼ asµØ¶_ôó†˜Á{6ÚØ€Í^©Rš&åK›´3ß•ŸÃ|_^ƒ½ÿ´¢ÔöH8Õ¸] Í¼©:¦º‘^rtT DM ªŠÆÒ¢<°±æ@_ÜVa㑃dÂ̱‡!rY[c,ãÉ¿)»¼ÕyÏ;ª$$~ëǤtÉ⸞áóuy7CÜ&þçRpàÔB¯‰L7¤#S+ýQŒ,<·ê)JS¿4ÿŠ ^9á@ƒ85‚ËÌ Ä_}à ~‰9nûÚ|¥_gìËQ05 ‰µT FO(?’0BÿÝPn1r9N;ÏÖ˜Lªj®¡ebñjÞ¬îÙBÆJÉËJ<ßg>ßh›5m£1J¬°Ÿaº%'A»¼¼’wkp¼FUg«½ÄºvF³<îQÚ™Xê6Êúc£ñÖ’Þö!ÁZòv=ƒÿRD4æ†t¿ýæÍãcÓçîÎ<–ò£xVNc¢¬žuê숞Õ l kà Y&(ª§àÕ8åAŽ1´ ŽmËÒ0³¾æ;UŒþ¨!ù<5RaS}¦²boçšFö2‘S†,ÕJ’&FÞ@˜Ic2'äú%'74rp?ëë3htºªeVåj ó4áéó± CjƒØp˜(R&{E…ŽjZ)¸Ö ÏñëõM”Oáõ9zÄøükNÑ+ÿ÷¶DÍ+Ð+e!Ô Ì€MyÅ«c´šûÅžPisÿõ-žv¦(+áø³,W‚-*òéi¦÷Gq¤nE£þçN»š”’ˆÁ^#!]·#9ô9Ý>Ч ‰©tÆ…ÿÉXOÿé‘úïWƒtðà,ß-$¬Y±WkÃÕ<¤»œõ Û«¨…,âÎ#àwzæÉ‰lH¥vB«õc_6[Üü¹ÅgS„}S€åÚwÚ+õo5¬Èõ¸äK'%È@≹ˆÕþ†ÒÛ€·Kܱï>éÐM»Î—û@Üá?Zì÷Û7|2¬æ/²]í9ö‘´¡4nbÞè´kÿ½Xë®×Ài—p–¢ê·{´ÿ.å{j®ù|K•„-äJö”xtú,}è«Ìt5 &goºæu~Å„h¶*=þ¦ÀJÈea{ÌxX4×HÖr2Ry`ƒé±ÑR¥s´t_ö”±´¡|1XÉ^õWßäLý,ÔYÇNAÿ=xx>ÐWzˆŒ4Xù±¡¶óe²)¿h³L°ú&õëʨ ã°à -7qcys¢úZß{ú-?7tb+®®= è³?¤ÇX•)­p„ûÞ4 }H4Öc¬,’“œzàÄ¨r©Óv–Ê’é“V“¬{Ö!LXó)ßC4ÙL þ>a[»çOLàáéR å(}IÔªJjo9c¬±ÿ×he'64¤#xóÙ„ÊHéðG Â£'bò=5q{þ^ê–Ësz&Ø·Ñ'ËÔ…#§å+ ›âÅYºÙøq'¬’Úé¬iŽñÍNãìåôýfª^nñ¢„¤Üæˆ~'©í`d!¼òÁ”äéBxê¡t¾@ú•hXÚr?1]mKášqµ‘ŽlÔ•[èàc Ø.}ÚÇb: "áRæÒ:=áSPqUO<¨•„½š DB/œ8@z#D·±$u9¯‹)*–á²[ š}jçú+—A;‚D'N>Æ5eŒgÅòÏ7:˜Ç¡~{e°`¿K÷&l5QWV°ïª2Z„ºD2*BƒT$PÑ.×§‡?eaWË=ã»Ýø+ÓW®Ç"cXìÏù1,»’}…DJ³Ãþè^ò&UýÔ=Œ¬z¬þâ` t*Õ¬ËÛÑ*¡Glã¤Cs ø Ó@!PôˆH>iÓÌ'‹ÞuXÌWYÖÉ ‡c¶·‘\¦ ­F­^Í»%i¹?ÜûšÐe÷¸KYv{ ý¨Ãë©8ÊtÞïŸùÿäÙâ`v0…>[€h,žžne«A½º^«·s§n¿µ<ü½Ë³»2ÅwTÚª`×ë÷yGÒ¨`¬PUÔòÞî•ûñ¹îk 'ž° sÒXUÇ çŸ¾²EJA§½ËÈ(ÔUÔb!I@‰3X1¤=*ð1ܲ˜ÈÛØzë=8¤¢CrL“Tûeä¬p0tš|Ø´´ã­ê£AÄW9J‰®°ý4˜S¸z"w4¼uyv»{•TØÿ€„Q7í÷É7ôoéyZ8êÏ‘h j|5–^áZ¢5¸=xZº–¨S®k¹É¯²tN±’AJ¶¸wÝÿ /@uXáØ ŠËŠ=ZEÈk ƒË/ô= }Õésrù¼'=ÞdëT™I…*—¦ý z2ÀꟚƒá gÇÙÀ§'2%©Ô5”âÒ:‹à*GˆË†¢’$8²s(SxèÀ7§<ä‰Ë;sûM÷!º¥Q…]:Þ™¥³ÕÃCÇ—åÒêJ¹ƒ˜zŸä*ãô)C=j·Y‡Ür"úçºX#ßÈ1YóÈîuŠË#¦Ðl¬ßäIN6ÚÍb†x…§ÞZwó}»*ÆÑ¾y¢ 5›Ë  ö² ­¹ˆIà°ô¤Å~7'ýSÜ4eæÒµu7ÚLÄÊ“Y–맯&J¸OXUJ2Nm ¿œ „©õà U>ˆ€ÙÛŒ&¾× @þ{ªAþSЯZ*Ná²ä_¼Íרñ6m>ãd G$ïÑÇçjÖï’ñ°9wËDÂãåÌ óíaY¬ô4ì{›ætËÝ9Þ<·À;.hzB]r4’ç°ßkì×Ò×/*L¤Ë2ÁÝ î3/uñ(Z 5û=Z"+F€¬EŒ¶k_H6V¨øµ5ÒáÂUÓ,j> 8Î;li=üÉÅZï¹ ¢Óo15Ç©´b3ݯPÄuóú’™LL1SÙF—DiÏ3ÕžÎáF‚àVþv"p¯Ae&‰ø+=Cà3Ñ\½_ßv(ÀrD_ì,J\'Sf“ÊÄNÿà“Ë;aóW0C€ú[…˜5ïÑ£VQ7ƒÅùÀmþø˜íW„9´LÖ ßýÛm¾´Ç Âm; –÷šHùu€æàŸ¸=¨!IñyŒªÿ¾o4ÇZI¦à Üny©äóÄ0êûåÑó«øsqr]-Ú“Ï[.¢HloªH>[‰´²¤J5%ËF]€¤V¥Ð3™«C~ÃCl>¥ãy']W¶>”awÎ:/ÕN7}b§›Û3á¥cCua/`™ ÚÉ,«ýU¢ýú|+> SßxïE|)Á yH2’µË€8¿dc…DP×F„\‚åýTûs{-¸*Iۉߡ]ýG© HfÒV:L+ n$'>T3¶ÐŒ¤ Ô!–›q+öǯ®-HV¿/X;f'²)²Íól(ñT$—9Oø‘-ÕaËbŸDë£[ùF=È`ÂÂ^°Þ@woQX¿'ä)HƒIú O]UIÚolÊޤK-¬TgÀðž3NžsZ°r·åõ¤BÔ!Ñ ƒ· HbÒ®Aòy?ˆo¥0±~ã_D­zx&3†®}ù ¡o}F@Z1¬`ÓÈ r³èd9h±VÒI[òÁëê´Ï‚Ý+ÃX7¶¿Ý„®D(*<бjãŽlƒ{[Ó„Hu„ñ­nÛeª‰ ‰†äVÀ¬–¶ ‚kiD5 ¬’à°Ý\6¨òÓ¼/&¿¡YtÙžà‰ƒ§Ä¤–‚ÀûñùýJŠƒj¸_=4ÔƒÇôØØ½ÈÜßåéi/î7Aùº³îGðóðé`/µ˜ RÃIJ?•Vv‰S‰`!V=’‘v=Vkdz;‹·”,åì-£ˆýS]7OKÓjuÎ$dµó³õ'Q&dƒ¨+àg£zÏ']Û¤Œü÷ߦÕcÑI惒F¨¡âQta°”ø ko“ü•[:Âdƒ®:ûáM5\ó¼µÇê__sŸúБRæ÷ðn4e]_E΄Ҵd! Í2ÉÛð–{BÀÖ¦¯¤Cc÷kOyžiï'œžuI  JD6¨è¬ÝTá4HŸîî^ߺSIçæÈEB­îüøZí“ ,ˆk1ãPñ‰‹a+{}¯1÷|艑Պjõ ßG #þЧ¢ª°«ÒVHxat#f(«Æ ƒ‹PóõúK5éÊMe9xX ï9«’ÅeíßàL-üHàí_r…™é¢…¾X0^͸Ë¿´(ÖkØrwXº=|Ö!»þƒÀ¸ð\& ÌÌKÉ9Ãå'Yźs7~× ï®Í¢¼*Hz¼jKºìÔzZ®w9“®ËšoÒ™ÓÏžd8_Šžýæ´Ñ“AÌOÚ"«ÈP– Ó/Ícwö¾ÁÁ[ðœÜ‹XyÊT߯œ¨½ò»Cî“j>ÝüKØäÜíÆ»²^¦úíÏÐR#c•Hè̘ 9úQá„ç¡U¡\ÈŒšzÄMnVX=¤Ôyjé!cß­ÔÙAØ*aNçC¨LÍ:Àz{˜í΂Ó kžFØ \0'ࣼ‘ôaÀ©Ðr§Â ™Ѱ²€·E†ñ¢‰±iµÖáðD›“qX´Lt{!z2ÏodÕ‚’ÆEI›L&² Lê'KXâÖQ lá'¢Ø ¦ÉÞ¸» x™ì"-gú'aåáÉ”i\ìå¤q+ëÒ¬08wx­ý¬O¦@xùüxnG››µ.?DaãS—ìvS"HL8^|žƒì–ÃÏ1#mKj½j¸5&¼n¿¥¨~y5ÁÔUÊ÷‰OIcÎ 1; ŽþùþC䃣`ÿ~pˆÍÓ1ÉpƒÞDýlÆõ­ñbT¡v(_ï ÒŒ‡˜KQÆ ­žI-•XÉ©è(»à⪠÷>@*άŸ¾÷·;SÃY,%1ÞÏ»¡&ñæ²B­|ýcùjë%üòôØO½@:]´­ïìôŸ÷3„èŠIWí‘ 6<ç`z[XnO~WÄÔÛ5'«íP!\"Ú”0uCcqb{«8›Ì¿½áÏÕ¬ï+‹Y+S !ʹq¼F0²~—æ'ŒÌT¹QDò¥ÈYŸùaÜßyK¢ƒØ®{>²J £¶±GbÍLi¬Sø(;Aøè@>&ðƒ-kÕ#³ða^7=HôÉb,Ê[c#)‡—v0¾`·ô¡ïàg“}Ü{ï`K1WiÄ…ºð%ºÉe#fãîq¿”D9–ˆÓMRLlPÂÿµ;ö Ðå¬[.T‡Å¡"[“‚˜ª”{1‰°}·LËSe3 ÒÏÔÃìÄ5büaá&ˆÂ ›#¼™¥ðÞœÜ}´iÁ|ëò×-” \`Š ‘OQ‡>—ïÍÁ$³AwFo_Sj•}qvauܼŒiFæðGã0°8“îô˜b¯ë¶£NH,î‰1'À0È`ŽQ=>…¹Û\íÖÌ¥Oéø m[O·âæQïÊå$ïO"6qg©GùF·Å'Àj´|·µé,YœaÜtíu¬‰rŒe¤xâ|áè|}ú. 1ˆÔ“ZyÃÄ®A¬@@PïüÓ‚ •âcn}RóJOz,o´h—¿g=ïv_x|”󨵾©q Kái7MßÀ9 ô@Þ Ç€¬èÑðy„¡-?Ã3`ï‰ó]’{ˆ‘FSc/\¸]̳âoM‚gMÒh©òë[BÐgHª$ù{5"A…1Ðx¡Rå°M÷N?ª³0^Z-ßä*}Î%ŸnAÜà“è÷*(Ô¡„‹ÙF†ié¡Í夲<œô¡P ‰ç½¯~ûݘÀ}_ØÒÜ[ÅUÃè·”UDÿZVŸÓÄàô#%‹pŸÌ_¶ Þœª]jÙU±œÄH/Æ÷çÃNýÚ9Ù`®ÂP’ËYÿE7KFu℘!§»‘žòL`@®¿Ç«M1(};agà%pR+†¼è<'ž#<+zp6—ŠN@=‚é€àå¥ÛMø¬(´Mu,ªaÄ#¶A‘˜6V|ùc.CR©^5²Ö´e¿;÷LŠrS€ªõ:ùyšï•h÷s y»wy'¼×*B:øçTiÁ3Ô`¢¸Ò±ì×–f2ÔÚ…Zm'f÷±Õ)ë|¬ „øSÓœñšGÌÄÔϺ:…IP·ì<×I]Øzµ©ªÅC´ ´ï‹`ëzRæ#åÚÃVGÇŠ–w†˜)SÒEÊÔ*Õ¼<‡á£ÓÌ5émFcj²ívÈXÿS;Ú€8 Ee÷þ?ûÄŠ,Y€s°2@¹é˜Žz“SãóßZ´iåVl5„>϶)ÿ<7Áô¿‹CMºÅãúΚk‰¢ŸYcÐDñƒâÅüÖ©,8©µÎ†rÃeîÚžµšœ˜ÝXp80 †áW&ûK¥ãº7ÍyÆ‹L€'‡ƒ Àõojr‘z@F»€¢ÌPV˦òw[éå¥3MöúÁ´Š?Ž=>¦^೫‚ÄŸÚÙ¬Þœ5ž{‹‘ÉI5½´(Sá¯óžo1?Ä ´¬Í*XqÝŒ;a9‰þùÖcÅÕ7a<@êsŸLÐz¹lâd¿‹ä mRë Ÿ5Gš5ÏQNLÙ gŽªÜt欿+>&Æ‹#`²”Yà¥!p~'S~DÀm)` 8Ûƒ²ÅW _Í”â•hý¬ãn·>РΉ“gÏm{óÏÛ|D•bAˆnµ<=a¾:èÌÀ µä•e/Bh\U¥ž–ÎTóÑÔB7$ º‰ŸeÔ a ¾1Ò_«×-Z…Å}nˆ¥É²*øàj8sé=ElCx®(š`ÝxkcN1ŒE'˜ŽÝÄ³Ó Áä¶ ²![ÖD"²ÑÔÒHÜ–gR`ò/ºØÅðFÍ&#P€IgÏz9f*8pÈLÆÅD¿I‘Y8ä÷Åø.ü€“€­´äª‘Gß"LMlê0–[ ¹ ÂbƒßZu:k´Õ Qù½F¯&ˆ¶Qéö²³J¨+D52wLå:“lÓ£Âê~=©´u¹¦”U˿ጘ—™›ëó²ÑÎÜ%~+Âa_®”Ðg«¬}­ H©š7ùªÎ<ôÙ¨3ELX–ÙWs#¦£‡ hXBÐ9? e'W¶Ó´ú™zø·>ù—qC-Ðo.Už?œa¼”䢅$¯ååKíþßâ®ízmO!îkÌZíq &­sí£¦%Š ‚ÍEè–Ê%'/¬ÕœµÎãõCà`ëJïÌ„Gj¿4h\$ÊsÛd$›‡Ên'z l+¾ñy//?²¿}+¬¯.V>ð wé¥Í«ïN4à>|Á¥£Ï>·q9Iè?9°W~û¾ß“GÂ;¢'[ŠÿÚí¦òüE½eñXeüÿÌÿü00±53rrq°3r²ù?'Jœ endstream endobj 263 0 obj 30218 endobj 264 0 obj 777 endobj 265 0 obj 29576 endobj 266 0 obj 531 endobj 261 0 obj <> stream xÚ]’Íjë0F÷~ uq¡]äÚ±#©()¥Yô‡º}Gçnd£8‹¼}õù -taëÍŒŽ˜ùsõÖ,îý°“Eõ·PïrNÑÉbóÜŽY¾Ù>lC?©ü-®‘Iu}ðñ£v²ïC¶,•ïÝtÙÍw¸$7çã$‡m膬®UþžS<«ëùÆ›,^böêúsÓ¤}sÇÿr0©"[¯•—.J./íAT~H¡?çQT9ï—tpƒ—ãØ:‰mØKVÅZÕëL‚ÿuVULÙuî_³ºDhQ¤%ñ-ù|G¾K¼ZΜ–Ä%¹k²3~5Ç;² YÀ¹K¬y¯Æ½š55jjC6`úhøhÖÔ¨iècàc*r^‘W`º¸Ö1¨cèiàiZr öd¦³³¡³³¥³…³¥³…³¥ƒ…ƒ¥ƒ…ƒ¥ƒ…ƒå»,Þe-Ù‚é4ëÒ´ õ=îcšyêæ@÷û ߃9#²æï ÓúÀ» endstream endobj 267 0 obj 383 endobj 56 0 obj <> endobj 269 0 obj <> stream xÚ]”ËjÛ@@÷úŠé¢.\K3÷Î8` Á¥4‹¶!N?@‘+¨%!Û ÿ}å9"…8hŸs‡Ü^«§f¨âÊ}ÎÍk<שޫý÷rÌÖûç/Ï}w1ë—i¨ñbÚ®o¦åŒ©â±ë³Âš¦«/ ¥ßõiyùp;_âé¹o‡l»5ë×ùáù2ÝÌCúÆOÙúçÔÄ©ëæá×þ0óá:Žâ)ö“g»ib;ÿ¡ÙåGyŠfýÔ|êÕ|ô߃·ÛM\àPM¥/Чôú”¾@ŸÒèSú}J_ Oé ô)}>¥/Ðçé ôU÷{ÿM$'+…–“âûêåd™ÖѲwî‹é¾6ß—]}¦y¦Ýš6Ý}Çu}|_¿ã0ÞßJ?ºXV endstream endobj 270 0 obj 574 endobj 268 0 obj <> /FontDescriptor 271 0 R /W [ 0[600.09765625]5[457.03125 616.211]10[289.0625 287.109 287.109]15[308.10546875 208.008 308.105 569.824 616.211 616.211 616.211 616.211 616.211 616.211 616.211 616.211 616.211 616.211 308.105]32[616.2109375]34[487.79296875]36[699.21875 567.871 716.797 678.223 534.18 478.027 819.824 713.867 238.77 313.965 610.84 375 895.996 833.984 861.816 502.93]53[541.9921875 559.082 470.215 685.059 624.023 1090.82]60[592.7734375]63[569.82421875]66[500.0]68[577.1484375 577.148 476.074 577.148 519.043 273.926 580.078 527.832 262.207 262.207 470.215 227.051 768.066 527.832 562.012 577.148 577.148 334.961 398.926 240.234 512.207 462.891 759.766 498.047 498.047 519.043 333.984 569.824 333.984]179[1000.0 457.031 457.031]183[289.0625]196[289.0625] ] /BaseFont/GFEDCB+FuturaBk >> endobj 271 0 obj <> endobj 272 0 obj <> stream xÚì½ |TÕÙ?~ž»Íšd&ËL2Ù&Ûd&{H2`’„-¬5²Ê A1Zµn¸ ŠÖ5 DÀH(E\j-K ˆH]p)*­ÖÚ¦ÖZk-’;¿ï9“ qëÛ÷ýü?ïçÿ~>Í8ß9sï¹çyÎsžõÜ;Ȉ1fg >l“/®–ûTÁÇŒQŽ]Ö¸¦‰9™ ß§á»í²eëÿÙ?û8¾/dltÃâ¦Ë–û×.Æ.zçokZ½¨I>ôìÆÆT1&-\¶rAãWK,w36¶ƒ1edÓÊ5ÍG§žÁ÷Š ùÅ‚µÍî›ZŸÀØÔ6\lɢƅϸüJƦ-ãôk§M­º=ó¥§ð};ÆK\‚¶%ÆQŒÍM–º`ycS­>ý×øþÆÌ‡¯X´zE×cþÊX#è%d-o\פäÉÃk} ýÝ+—/Ê\½Êï_Ÿ+–,o^—Ñq~ c7`>ÆeuS½y÷úÿ›^EÿK„2Žû¥+å-¸'Gg¾ÀW™™ÄlŒü~´%¶Xߪ,V·£m`.ŸUidZ#U‡¤0o×ë}¹Ìözßë}9ö${Z’=i±Âί‘cϤo5„~õùj-cœ–_“NiF1F>Æ`qšä2ª #£íõ®×»0Èù²¾¼š°×6­á—àÀ‡™Ñp¤½xä,J±ç‹÷ŒÖVÚpÝu®°ÿ¸TѲlÈãˆ;‘æúòí!¦ƒ¥²X§ã ³$&ÄÇźb¢Ž¨È»-,4Äj1›ŒM•%b J¸,8Kr™·ì|Ùëee]yyÌñ]ÌÞ)Ix§çG$'EäËü-Wê§ÐpúmìÙËÎEŸ»ûº{ô7¶¶ÞýYìŸ/ÓÿKÆ»Zï¢áwµÞ!ïÑwÒ‘+ô—ë‘ÔÇß—SÃôÝÎßÐ@b˯ѱ¦áϰ8ÉEQl5éËа$ è»Aϧ¯´á,„ÕúlFF†T 5³@}”P\”×g/ÁêÚºø'×0 Dj" jÊBÔì™vvK»4‰ÏÖà‘ì¶ðb§Æ?è«ë®ÁßuM«Vé+ËÞ’$J¥T‰½5꘧ÿYïÓãßÓÀË)ÁËxŸÍ¬È–T9Ô"+fVØ“—ý;¤ViÙ$CzQ¸Ý&¥;ÂéTëFÎC¸‘rõßôëo•£)’"èÃc£ÞÒ…£?@ûØ_žÏÊdI!Y‘‰I\ˆ‚×»ì%á%9>[˔ְµ´C:Æ´c :7/Ò#hŸþù¢îÝýŸeJ¹/‘NÑmÒrŒg? yØ…å€áSRaݦßCËèÔCèÛí? Ú'±#˜ä+Ó¬¾_tåøb|ÌG>É'ûL>³Ï²†­¡5Òó‹t#µ”dOaAQ~žƒöUäåTVäæU4äVŽÏÉ­¬äóò÷é'”ÅÚ^ð‘+æEræÕ%æÕÕ˜V!+¡‘r/)y¬T>ÊdLËDé¤,þú‹ŠU[õÕÜ1†í\V›ë?«lÖÒÁ¯“5ùìrv”);,&*5š1«Fáѽý¾/úlŸY³ {CÄÂE‹…‹fÑ çËH³¸-Ò0)YI6fY¼–4{ZD¦³R­4¬—Z”ãzs;í2´[ì\ËlRJ2W°ü¼ðKIfvËÏcò§'vïxõÕÇ·éïþý¯ú›”ñ·¿Qº¬Q&]ªß­¿¯Ÿ…Ä/¥lý.}"=KW@úÏèpÿD¹˜ÔyØŽÊÜ>«¯¸–žd¦a vðs°¡}= Ѽ¤;ÌW:ß®¿[K­êåpݹþ´òp²_¬å°³-a©ŽDæ¢,*…3 ·0+‹†)ÂsÛ>…&óA?Õ{>µ‡´Ú:;®9ƒžë;š<ŒFHÃäŒ(oT‘¡ÈTZ`«”+BËm»Ì¡nò˜Ü&·Ùmq[Ý!îД·£D+0çÛ‹¢ªåš {MDEäymÔZG»£G鉈$3‰.¢ÂOJ²fH)‚<•¨HI¦$¥þ|±dÿé•{o¿é)éQ:ÿÞÛ¤Üú‘þéiùþß,½~狛ϒò÷î;ô¿ëýúá€ýl†NŒ† 2(Ä—â±e‡ÇdǹÍÙšãNÍŒ°yìfO‰cñ!Œ(^Ëä¢}êñfÏ€8 -]}¶žO_ÿt@ C¦C&ËÃohF˜áÅkóÚ½áÞo¤7Ê›š‘æMËðx=ÞtoƨôJc•çjmMÜö¸Çâw{bܲ[q«nÍmp¹2C²B31ˆÛæ¶»ÃÝî·ËëŽsÇ»܉nwfZfzfFIh¥±Æ²^Y¯®O\›Ô’Ü’º6ã[Ñ!¦Ó%"D|gBgb§»3©3¹3¥3µ3­ÓÓ+õ¦÷fŒæê©ÀDÓó(?¯ÂΦÂ@CHý"EÕ ¤Œö³÷_ÿÜЮ=|Ã};v=œŸ{×½›¯\u§ýáðß¿ÐõÛ[›üí}ýë3G¯½£ý¾Ím[7ݼú®UKöz÷¹›8¿æv=ܬå£ea7ù¢Èd³ÍÌ”ªJˆ &…Œƒc)ë:_Ö½ãjý:Rˆð ò¶ y[™uPÞ!>K^Úà5zÍ^ËÕ„lÂx•©ƒ:i»¡Ã¸Ûd/§ ãZj‘®6¶˜ž„WÜaÜn:F=ÆSŸ¿Ô;¬†ìùr¨%¯8ÓÞo‘Üx0°bZŽà0‡å rèçV$œ‹:àÈyúËñ&y“½)Þlï0ïpﯷ˜•Q©Td9¼tÄš –® m ]ã\“Ö”v4¦'î¸û%OoF¯7ã[®þ‚‹tG µow’;ÙâNu§¹=îôRT%R‘:Æ*ª‹°º"}LƘÌ1Yc²Ç 9¼xÄHïsuH¥½2¢ÚÉɯ‹hXŸ¼1ecê5i­i"l 8¤wftfvfufwë~0ì í ý`øÁˆƒP¤£1½®£ñ‡&û¦L=˜vÐs0½ìÏÿ–rÉCÚAEA|/5ä}ÏÜpãsÏÜ´©ÓûPÓªG^½ú7ô¿¼zRÿӽ׬h9÷üó_­¿|㽴纽?»öÆ}{å†5>ºjõCô?xXÿš”_ÝúæðÜý-{>ýt_óþÃßäw ýï*„ijßúâì á¦0›)1JÎŽMµÅ$ØÂÃìŒìðÑ <Õ©ù€Z¾Þ÷ﻈàGµlXL^sö€/ uQ r'R^â,rÅ]¶‹ Ýö¤kg|/õÚ‡¿“”-¥*™á…TªG™KÂJ1Eñ»h—´]…ç0î¶t„¶;v8wÄ<×KÝj·¡×ÒvÄÞÞã8ïþŽAk˜G( i‹¼òS÷n=ùÊ}÷loÚª?z5­‹Y0ì=ýqæ7”£$>ðÖé¹Q¯ÿú-Ý8CrÙ¢)éÝ·É«ÿZÈRäöòÛžæûB¢àGy£­,\‹æ±8/ùØzr|e™>²|ŸÕâ õ9|Î&ÖDMR“Üdj27Yš¬M!M¡MaMQMŽ&g´èæ³ùìê¼oVöï­ ¾]!HïæVTæä–—Ö}%e*­r¾Øs(óY-VbF…©|Ë!Àéë]绾gi¿³ù€ÇŽ·ÒúõgŠ¿)ó:2^·ûÏÊ‹¡[nVw*ˆ7y=¾¦\$åç%Hü\Jò©p໼8wî S¸hó­±…uŵ#¢èa³nš3í–Æ½;Â=Ìá“íŽPîœyçãÌú½ôÙ]7—þ¨Â“9fbêø.Yzß×—‹žIÙ¢'®ÄÜýçSo¹“‰Ýês’IMd^SªA64U‘0;³l4ó*p`ãã|/›æ¦Qš” ·“¬¥ÓL”'åÈ9JžVd¬f•Râg~&÷¼ØÛßzôE騴XšÖßÑÿ½¦׸е!÷KCÜ02;dû´/9AεÆ;]j|T˜U“£¢T“¤p“¢H–„r$¯+à·ƒÉ`ú}!°|'sš1è¶³L0×0¯m˜=…ïØÄ{2¹û®4^en¶ïHhKˆnÊ6{ÍYv¯}XL†ËëëqW+ÝmJ›ÚÒÚÖæhsö&öº£†˜Mö€ç 4=g’=)èíÖ¿røátÜxÇ}×/ik£\ýsýÏúCT|úó–ËÛºhÿ?í?r“\uýUºacÏoÞÒŒ¯?wÝNgä;"¶ÖøÏª—C÷bØL_LLˆÃj31‡lK39ÒäSª+BBé훃a !ÿ‡Xæs{,{‘±0¼ r»ºÍðX”±H)1–Ù £Ú•]ÆÎp¾\iš’âæiRžâŒAƒ_R‹Õ˧ë¬ÕÖGÐ;4o3±†}}•þ[ýZCá7‘eÞÂâZ:Jóiï;4q–¾EÿTïÓ7Ïš(l뫦 ¬ïM¾H9-Ô¥¦a]ìXT“"…°pw¿Üó¥ìãÛ>C uHq.V4œ…®hÁ©ÒØ#É¥R‰¡šÊù^ƒâS}Zµ¡ÒXiðEa•öõ´Þ¸Kê¦C·Ñ!Jq†z8ßÍP‡óer3åJ½C~s+5Ò„}‚>S—¼ô=++”E#¿.é×ë4£¾\¬ æ%ïÁ¼,lœ/Âù¥I.s3©’A浈í|W^^_^`F¯÷ ©•¿§^áLD%ÞòžóŸË¡ýH—ò·f|\Ï~¬_ærÐ4±©>K3jiŠK2¤ÂŽÌœ  7Hn¨¯$l„ÍÌ<(BÓ&¶)MÊÔe6h!’ÆlÁ­£¾óX?îDU7àVm‚o³ òm-‘J*¥k´§4E„Ú‚”OÞ³·|EöEiÃ/ñuõ‡ÓÓ7§Ä­Û¡üi€oå8ø1³k}‘fƒ$U´Ù$1M‚`è5Ü} îGÕï,ù!ݶÎ,Ì2ÈÙ°"ã•Æ&c»ÔcT¡¤R*1N ¾ mÖ[qªÝŒ’_ê6ÛÀyR )S>)ÇßíŸÛÑ!m9Ù?[N<r.½ÖŸÉuCúXÔ:>dñ·,ñ"†³Ê%×÷_”8¦6j“Úä6E™ËDzJ÷?×AjÆs[ùø þ7´×M¬Ëç4*byªœ£2“Ñ *²DF¦™ƒw2>”IÈ4~Kå{­üª,)Ãt-‘F+£µbDD1AY§4¸”šM» »ÆÝ¦cFgË’Üj†i$ ˜b9_)TsÔ"-sMÕ¬BªQ*Õ m¢¡Ü´šÕ«1D‹iÛ&=©ìRŸÐž0ö²êUÓ„\eÉ)&Ò^Ûs®êÚ={¿’j¤ %þëg•ª¯§åmWþínÌ]ÂÜ lŽ/\%å(©šKR!`I–"VÈw }ÖL%S-ar Õ’4ï‚y};³ó™y•.õ°^…où«|¥!zMúzZ‡ÒÑ‘­úúr°1NÙ‚˜ÅýÜCµä>»œeJ ìùIßÞ'ö=ïfnJ–àLÉÁ­Lq|sÆYÊK4°ÐP˪!ó© u`¹Ågë(wòLRß­§“4›fÑ«Ža´Z¿Þõ¯úHBõ§ô:Eõ4“^Ö ⿼_Äÿ¶Äç°¦©ršÍªÉv‘ £ c‘o:˜\ˆ—XÈH±‘,rp!ÝWI­R³Qæ܆iƒBi³µÙ­C²âH%‰ïâå»ÙØÑU[{¬½Cÿ£þ÷ñ£p Sÿ÷WßõÚ»ý34ã[ü*™‚_Á@‰H%Çs;/•‘]Ú f,”G,”‡yª23µV©¶­6¬55'·¤¶+‡lG£¹ºÓ¬™ÑÃb²]Ù±¥áEiµÕ¨×ZW…´$®Ik·u¸‡ë±wE÷Ƽâz9Íqa/:¸Ç˜>¸—à4 U%p")òç~öÞO?*ØòdÓ¦G·eÜ@º¸ó–à±ÐÏø,ú¢£D­¬•Z¥V¹ÕÚÒÚÖjkµó|d—„Œ$°Adë´÷Ð…¬$àkzBâòi7‹¡|»Ø‹@ÐWÞE2õ)¼Â_;žùÅ OwHãôãúë”C¹rÏyç«/ûµü‰‡ÿKÿiÕ(bé-¾0…QŽÄ\rSÓl]"Æõå}ÈSÇÅY,MòÈYj+¤B©P.RòÔq¬œ*¤J¹“nb|;¼VY¯nc;h‡ô„¼Cy\=Æ^BŒIqçâÂb©XÉQ*¨R¾XiRÖªMj»èºGé¦nt çÅ«”o"ÕØßÒ¿þy:A§øN£–ûõJesgc·ˆÏoú¢š$+Ì%SŽ!uðY#S̘̃'´o'™²Gñ¨iXÇlS ¿q)bC‰¡ÌXjÇÆó©(¬•¨½Ç™šXk!X‡t•|Òª®ÓZ k«¯4=ÎvÒ.ù)ÛNu—Önj3ñI¾$•{”—Ô£Z¯±–¨Òh!§"­Àˆ`/S04¿éi_‰ÁZŒmÒy·¶ÓØrT>¦½dŒãPòM²±»¿YOÑ“B8Kðu¹>…@x‘Í”G„ϼÒg3¨Ì%iªA6 »1 »á>D$•y„ÃC^%C-!Ô¡-[ñr •eˆŽš„Žš˜iPGãZ ÛØÊ6ƒ²ž5i×w³Ý´CéPÁº!°5Ìã9VMyDëÐ#Ò´^3žÿeÿ(©[¾¸¿AÚÉoÈé'”vqOÙë ‘P¦ÉYôÍ›åƒw•CJäõ´“µCƒŽJÍS T¬´¯üúó•_Œ1lß¹ÑP˜?c…=-%ðûäÞ!wÉv‡ôn5ð8ؼYì¥Å±Ÿú¢C]&Ùã4ÅÛcœÞØ\«+DÜ~ŽŒiEž(5|É@^‰Ä‹GBâñx$dRZm¬¯p@ Œ>åbaó•FX}øÅ¾ÈqQ>ÇìÁÙšìMΦ覘&WSlS\¯­×‘ü­íĈ” [‰ga¾¼ø©»îüùÞ[7=·}{îÏÖ½¤ë$_³7;}òð3/>ôHÏqýÀ#s)ù·gÈ9{Úf1o¾'?W{@Ì»Óîļ]¦x¤Ry.o#«#\cbÞyyYÝysü@õ/t"žK" ÙEæêŠX–yh‘å3U†Tl/úÂ}…/ŠïHú¢}1>WeÜHEÈ¢'´ÇÖ›ù}wK<éQ¼8Ü,9°ïÎÍO=wû-{Ûu½÷Ê}¹Û·ì]ý2Éô»‡^|æáG÷´ýV¯qî#Úç7O›­|×y=ô †­ºã19âQ@{Q<“Uìãôu}Ï>θ<–gÇÆYW³ÕÖ@:Ñnl’¶ÛÛ#ÛœmÑm1Q¡£Â "GE—‡N/œ½.„ïõXøNÏÐu Ÿ|’òú±÷ÏøH?CÙ®ÿɨ’;+vŸ<µsò–¢ô”Š}ÿ,Å»“:3†umÿé/‡g² z=°¾ÕëØ<§÷¨×Ž•„F‹Õ,7ÖÛøàcßQ„$Ä-xÇV­ÕÐjl5µÚ[Ã[#Z#[£Z­N®Ý¶¥Ûöÿ®nË+æ.„µÔX,z"4Ìk`²'ÚíÓŒ¡aŒŒ,*NL¿¤Ä~áSO`AWW¨A]4pM\}Á>Ãís o4ð%n n`#ä(DPë2t‡u»ºÆz<¡u¬†jø}JC±2´&LܧŒm} ÅBOèᘮXÜH¬¹AMÙT±sÈ-ƒ(y\È#׬ß&ïg¦·.Ý’}˸wï}K÷“íèËð“%n¹ýÊæŸœ:µjc+¹þð%èçÞº=B‰Óö¡bZè‹sFjÌn"CL‰a†ÜÈ,‹1Ô¬1f³JѶóeìC~,nÛ‹M,çµ\mƒ÷ŒMuæ:Kµ.¤.´.¬ÎVg¯ ¯ Ü9vÔ9/Ü=®‹¯I¬NªK©K­K«óÔ¥×eü€{r¬â²›â›RšR›ÒšèÎQòîí –m¸nÛ¶ìVnÙ)ºíLJ¡Âyß;}úáNáëÂd7"WD¼gû,†)IÚÄ­DñPЏÅ$ôö;»daMJ“Ú¤ÁÎÅr8ùCovÍß¾=ñâ#Æ1âbùZh],h÷÷iWúBíXÛ7¨Ûúþ{äé_‘ïïS_½À@`_À›Ù%{t¹jÞà&3)².ìÑõ9¿ï6êw¶ç"J¨š6ÒÕÒjÓÖA»Ì=’ièœüÂ1½zÛ6zàˆ>…¾ÒÚ_¯£Ýúä ÞÑ(ð$³ŒR?Üï$ž2€¢"(*L (öAGmÛ†«ÄõêVØ2û•/Én1JŠ#.Yf¡jBbŒ727ÜÄâÌÌ޲³ˆž¢7Î'X&ü–ÝYâ¼Pý¦Z),epv‹»Cº\’Ç]û}™HelÐÌÆ8Äà<¡)±ÉݔԔ,ös†ÜŒç;;£{Ü9ßRè š%4ÛÐouëöYó›·Õýhõ²mÛÒn^<ÿÆxϽKn}P}óõ;êéÒè»6t#îÎ?ðÒ–{zz7ßst›þ曯ëoSêé·)ÎÞ×Ý}ßý/¿|ÿú”õæ›”¬Ÿ äÒý}ÊÜ` áºK#“ŽÊÿn6mëûFºÅ·ð-Á-óȩˊÌ5Ti95eÕƒAìßÈš]ߟ5WäßΚû'©¯dÍøKcÿDæ4¸¡˜èr˜ù†¢×ã l&";v³˜Oà~``/ñûö¿y‹é;;‰weRŠ!%µÝÖcù ðg`Ïøì$M±B̤JL1ò§RG„ó‚Èö½[ú¾æLòhE¬’µH«´µ†&Ãvöí€ôÚµ]†^©W>¦Ù3˜GNSRÕ C +“G+%êhm”Á'Ô©‚ïÏÖ³+i­´NÞ¨¬Q×kë ­†]ðB;$>Ðv~ÛÔÐ _Ó%w+GÔn-Cìk¦DðmMùþ-ÎéK~N%”$¿p.GºX¾½?GzUèU>Öá˜ç"_˜”¨äj‰LS%Y?º¸Q̬ñ™J4n‡åšBý”àM ±÷pöa¢›UZÍ®–šÕÕ†Ò.í  [=©™?Àà¿J’_-ÍïCžÖÿ¸´NäüiÁÏb½^š¯YÛïËŽMLˆ°ØŒJ¢Ái3Ê®§!ÁhKKH`a®D§Æ$W3H9ÞL¤ÖñzàiÜú:°ö}Anp ‰bÑaeƒ ü@oàIM¯åÂó™Þ¯«9Ô6L2J* ™ MÙ@Û¢¶Åˆ&îmÕ ¹³OâÑQ<ÇÅ]4ÿ؆q«VÛp¬¹´¸¶¶xÔ½¾ù—t`å˜;Ƭ¤ý¿l¾=§I¿ìÖ‡cÍ-úÂU¹Âö%E7J·‰ç32ùó~WÕÕ,"¾]°ð"Mºí¦›t£QÈuäZ)äºÍ—‘à°åDîr„%(HÇ Nc‚ÁéJ “)Ü‚<Âõ}b}SìZ” ˆµdðÇŸSC8PT2È©F™4É 2ø)ðÓÔ€8JÄ/T»¾ù É÷ù„Ê5Œßƒ¾JkÕv)G•££‡¥IéJE¡t%kb«h¼ZY­6ÚF—w+O©» /±zI9©UOh½‘5Ëé¤âM'µ“D¿Êë?S))é1ë1qóhÿÏã\HËR2µRVª”hÚ¼Á<â;n!£óê•äk¤òz̼UÛ7˜ÚaLì ô’ŒPc°ž×Pù/ ?Ñõ…‡H÷³E‡Ô³ýçÓ¥”JÂWÈg脘ןEb$§~óŽÌù®oÿ|òÛVâ³ó_6–² Á„šå^f¤é„® ûÉÖ÷ÐföhÍü׿•4 Žp“Ý! …“µõ2ZO­ÄCêU ªaÊâ•›ùt÷õŸÏ”’@ö€&žÙaÃܶ½RZõ½¾) î—f% ö­¯n›Á½—MÞ²Þý¬ß?¹A‰UgíUãöÊiƽJZÊÙ:yvø° “Ü{V”ŒZqI9ŽMm@“Ãa¯(Ξ•®õù/='7êò%󶪗œ“4|žú£Mòüsò¼­òÜsòœè±êœ­ò솭êìsò¬­rÃVyæ9yÆVyzò¦éòÔú‹Ô©º\‘"ÏÉá‘jDŠ)Ûm¹ªýœlË•ÃÎÉ¡!‘j¨.‡DÊ]6Ÿ“MºlÜ*kº¬ê²¢#ŽUås²„i6v¬JçpLfÏÒÂo§ìùDzÿWÿ²äàk2•¼&ÓVz‡¿$IŠ–*¥&é-é+ù*¥LyH­Õ´ù†KŒšq®xÝ×;ÆwL¥¦—ÍYæ­æW-6ËO,ïY>·–Zï±v…Œ ¹!4+ôÇxý1ìÇaûl¥¶{ìqx5‰×Vñê°w„g„Ø™¹6ÊuGÔË«c†c­Óè\ç|%º&º+&2æ˜Kr-tíŽ]û›¸Ô¸=q¯ÆOþ?ñº<þ•„R¼š~ðÕñŸ×^ÿW^ÈqÄŸþ%»ž}ÏŸËÓhô’‚‘î âO›ÿ‰z eaÌÆì,œE°HÅÌÉ¢Y s±X‡J5)­›%Á'¥°T–Æ<,e°L–ŲÙ06œ`^–ÃrYª©VÈŠX1ÉJX)ÅÊØhvƒ¼c,Ç.f嬥àxVŪY ›ÀjÙD6‰Õ±Él «gSÙ46Í`3Y›Åf³9l.›Çæ³±KX#»”-` Ù"¶˜]Æ–°¥ìrv[Æ–³l%ÏÙj¶†5³¶–]ÉÖ±õì*¶]Í6²kX+»–]Ç~ éÜÀnd?a7±›Ù-ìVvÛÄngw°;Ù]l3»›ma÷°{ÙVv»Ÿý”=Àd±‡Ù#ìQÖÆc³ml;ÛÁÚÙl'ÛÅv³'IfO±=¬“íe?cûØÏÙ~ö4;ÀžaϲçØóììöKö"û;ȱÃìëbݬ‡e/±^vŒg/³ìv’½ÊN±×Øëì ö&;ÍÞbo³wØ»ì7ì {½Ï>`gI!•42°àÌØ_Øgìïì ö%û+ûœýŒd"3YÈÊú)„ù)”ÂØ'd#;…SER9Èɾ¢hŠ!ÅR;Gñ”@‰ä¦$Jf¿¥J¥4òP:e°?S&eQ6 £áìCö5 /ò(Ÿ ¨Š¨˜ý‰F¢¢.e¿§QTF£é"¦Ób䣱Dì4Ž.¦rª JOUìŸTM54ji"M¢:šÌ~GS¨ž¦Ò4šN3ا4“hͦ9ì#vžæ"{œO?¢K¨‘.¥´±>ZL—Ñö1-¥ËÅ?æ°œVÐJj¢U´šÖP3µÐZº’Ö!·¼Š6ÐÕ´‘®A–y-]G?¦ëéö(ÝH?¡›èfº…n¥ÛhÝNwÐì>º‹6ÓÝìAÚB÷нˆ·÷ÑýôSz€¤‡èaz„¥6zŒ§m´vP;=A;ií¦'©ƒž¢=ÔI{ég´~Nûéi:@Ïгô=O¿ è—ô"ýŠÒ!:LG¨‹º©‡ŽÒKÔKÇè8½L'è:I¯Ò)ú5½F¯Óô&¦·èmÄüwé7t†Þ£÷é:K¿¥ßчôýž>¦?Ð'ôGúõÑŸéSú }F¥Ïéoôý¾¤ÐWôO:G_Óyê'ü0Bþ€Ì]R%T=’Q2IfÉ"Y¥)T “l’] —"¤H)JrHNd1ʤ鵵ÆÅK/[ÓÔ¸`‘©yÉÒ¢eX4ø¹ý뇙*[¦anZ Ë´Á.ÓÌNyºY¾zéŠËLÓÇ7L0o™ya$ÓÌ…K­^´fémÖe«!ßYCÈÌ×)³1GCãÀØA4Œµ`Èr,à²XÅ¢€ü \µ( ÿE|¤E2¼l€{ËeCƸŒ¯Ã’  Kz_1(ñeœÊ²•ÀÄŒËå°" Áñ¬”øÊ.V$¾2(ñÕþ«‡Yøš!¢htiìÒxËÀÈ-‰·‰·%Þ2 ¥+‡HüÊ Ä×$¾~™«¿ŠÏqi€ÄÒK"\PT£Ž]Ö´¤Q·¨¹Qß“QË-kn4T4­Yºlå e6NÈ89m ZJõJ4'4655BE—_º°QšØ"Mj‘–B—òÁ¥ÉKåú%+Õ©K/[Þ(Okl1L %O^²T¾ïÉk–ª‚꥜êe‚êBAuÑÕ«8U~²YP]Ê©^!¨. P]Ñ"­[ŠÅ$åÕ ·†ÓÓæÊÍ Û2@¶ $à¯êÊå‹.kT§çååšW¬l^´lÑR|ÏÉ/^¤6¯\±rMÈ DÅ7³ŽhZ"¾!Ñ0qyÎL?ðeúÎæ:NT4ÃŽ17^ÑÐñ Ž¿48þʡ㷠ep|+ï>8¸µzÈ—°–oR¶£ç¢oÌ5ò[=ô/]𛓓[l ¶J[y9ÁVn°•lå[ÁVa°UliäiäiäiäiäiäiäiäiäiäiäiäiiiiiiiiiiiG) ^Q¥0ÈAQ°U8ÈKîj…A…A…hø+ÊÍ/ r_¼¶(H·(8JQp”¢à(ÅAŠƒÒ(ŽWœGqPÅAÅAÅAÅAÅA#ƒ4FiŒ Ò¤12HcdÆÈ ‘A#ƒ4Fi”i”i”i”i”i”i”i” ÒÀ+Ø*¶.Œ22x,ÈKÉ /¹Aj¹9…ÁVQ°uF¿à ¢\£ gY”§T´¬^9x"7G]0Kc„E_¶ÙŒ g_T(°ÈвbiNÎØ†Š¢u°ÝÊ6Zy•ÁvZƒZa¯T®ìQ«pv;Îò÷#¨KÖ(¼œKÔŒÈÒ2qd3*–û5cà…úä!íÀ‹m•_¼X6þŒÎ°2ËgÙ-ÒyTn›åëP]1¯b†e8»I³¢Zúʰ•O›z(ðÂØñ¨Ê"Qq]©åkùl‹|§àãqT„I‘¬Eþ|¬Ae†NbŸo9üÆ•M~Vöwæ4ŠúóÅ÷·®âŸ‡ÊoìÖ·ôŸ6µçá«&úT¨ ‰háÿ‘¿ÿ£ÿ‡æ÷ÿ3i ½2Îë?͘逾E¿ÛÔrAs.ìp09ðÖ¦ œcüŸ`ô{¦Ñ1þïâŽþ¿½Âþ÷÷@h˵"¹þ?Üaì×ߨùý·öAeú\ iªì5ìZJ£\*¦*Z„Zÿné¨Ô+‘¯‘o•7ÉwÉÉ»ä½ò!ùŪD)^¥P©Sæ*?R6'ܘð7·ì6¸Mî(·ËàNv{Ü9îRw¹{›»#É‘”œäI–’µä°äðä¨dWrBrvrUò%ɋҎ}¦|-ùýBŸ®em”AEÄB½Ô{@ý-P¿Ôï7ËÛäÝòÏäà )¡ŠCÉQŠ”)Ê|宄>wK‚z„;Úçv ê%ßCÝê1Aê uòûý¿£{†ê¿îW·á„·‹±þwûß¾8ÛÿÞû/ôþàƒv|ðVðÛlÅ{ÝãÎ.ùàå÷/ý{[ß{ü½Û{ÿfÆÞk~oÕ{?zÏû^Î;±ýYýÕ€m­£Ó=´•öú˜dxGã,ì( “Ê%Di1Þ+¤¤ŸH7K·ØëO¤[¥;¤»ÙüI×Þß9î‚þqýý%4ôchñÐ߇¡‡ÛÙ‡ÐåßC»·°OÙ_ Ñ÷A¿@oþ ÝÝÍþÈþÄú ½OAçŽB[¹ÝK:[z Zxr@ ÏÁ²~-4±ö ,â ¡K(“œ°—ËasWÀÞ–ÁâÚ`s«`uÜæZ`u°9 «» v·6w5,à1ØÝ5ÜòèRš køyÙ”Ã>§\öwÊc_R>ûŠ Ù?¨€ý“ŠØ×TÌt*e~EŒÊØyÍú¡_DcH&)4–$ºˆTGtÎ@KÉH—“™.&{“,TN¡4žÂ`!TIVª U“j(ZN(’&RM"Õq›¥hšB.šJ1TO±4âh:%ÐLЧä¦Y”H ”D³)™æP Í¥Tš«›Oú¥Ó%”M Ù/h,p]FÃi1,÷ƒ»}6üÞÀÞÙ#»g|ïl?í²ö44éÞoì¹ýŒ~>°«öýF £Ót–Þ¦·vÂÞ•ìRùÆ>Û7vÆ$“d“)TÒ$u`Ë(…KQ’™Þ‘ °ÙFÊ¢Ü[IN᫺„×ê†< ÏøSöö¼Ü¼Í¼Í¼Í¼ÍÿŽ·¨ <ŒTÊmÖ¢‘§Fêw"SMÿŸ†áÈ-M¬Ø¿Xâ?,XæX Ô„l28™§ ¤ 8y® yd(²ÝH?Ïy£üïþ>þû 7Ðå?Î'àÿ˜ê?,Ùq©À2ÿÇÀYg‹k÷#ãµ"k.ÚØ@;r_+rå4`rå0á©o:ü@§ÿ0Æ¿èò·cýíÀ8:p¿À§ý£€Ïøk0n¤þ%0Ê%ÐÁ”)”]Ù&dbCÎ= Xäÿ°ØXâ?,8ÊÏG(ó_ þmL&p–à{æncóü»Á}úÛ…´íàö(0Úß ,òŸî÷O>ío>ã_Œ:Á†ŒÕ|a8ÜtøOþ³Àhÿi Ÿcæø 0R€dbPaXý™À0ýІ9F2»þ,0ŸÈö£ór:JœuˆãNÑú`Œ~諟Æé}Àxqö};ê—0ÿ@›ÿ~ Ý#0}¢À'?ëðßtú[ÑX—(¬ïãÇùŠDÛ}ÀxÈ!Š%ø_„ôíþÀÌÎÑö£ü›ÿ^^/Am?0Fôäsw`´ãÀ8Pq‚«×ÄŠÕù8NŒså¿èT]~þ;ØÑÓåŸ ä#81B0Þÿê2+®?û€X£hŒó,0Ê¿èÀ¬£?ü·¯[yçßtaŽÑ­}ˆ?§€|c0ÚI`„ŸÿœƒÑZ€Ì(£}Œ†žÄ`´ã¼2ôWcý/ã mVóY  <»°š€þ5@®Ã.ŒvÐ1]XMퟌ&¸0Ú¼Öô¯rÞ\˜i>jÏ0èg,ÆùÈe‹qî: áXpuíNb…Ìc1Îk¼n…|â «/€a-sô#üïùhqmÐþã0Ú\`4ä‡Ñ6]þ ÀX1NfJöÏ5È¥k_º°‚ °‘/P!ï‡WIe&ØZ*¨¿´¡®NeèU*Ë8VœÊòD»@`l'ö»8Ò¿X"Ú¥ËàR™œ§²rXz*«T*E{¼À*ÕðN©¬F´'@n©¬Vð0Qà$q¤NàdSÖ‹þSŘÓD{º8>S`´"ÞïyàlH#•Í…ÜRQ—óy]"(Þ"zîg÷CΩðÅÀgü•ðˆaðiÿ)`*ÆIƒ4ú€Y‡‹#9þ€¹ðWi oç4Èä!àHÿ§ÀŒŸ™p,ƒWLƒxÿbœ™¢Ý€UH‡Ç™^?†#PÿBü0è,0O`@î9=ŸŸ-ƒz ᕘ—Råm.I$y8I´ëÖ‹>ÓÎ#Ìm.1xØÉàÑÁm:¨ïò¹óO)èNÇ+Tì¥p̘-p˜Àá°Êt6B´½s¡ÒçÌÀ|q¤P`è¦CVmÀ‘âl |W:dÅq$ŸŽÙÝ,g«N„]g]ÍŸ›6ø“ p»˜ ©f@bÝÀ,y Ád€â»À‘v(~ ,8 òÉÅSÀÑ¢O9,4ëuX)ÚãV ¬X ùd€+Žõ°ñ è$ï?Mœ!FkÀŒ2 g€³±^3Ç[БrÈ23Já±N´íþ$`*"W&ær˜'°3ÍÄ,¾–çLXÇrPÏoû€µðð™XñgõXÇLXoÏÀêdbÅû€ âÈ\Ì=ÑDz {Ðoðð<ÇŽ,Pß ÌÝ,Ð=,ÆŠdAzŸK Ï,H#×í,ÈŸåë•>ÎÂ\²@åmà<Ä‹lŒhǬùNœXêÙ¸Š·«Ö‚«l\õ;ôàý‡¡?Gž© ƒp̘)0K`¶ÀaGô ÌX(Ó†Yœ–@nÃÀ?ÇQ°ßaàŸ/=Ç ¬X#px†ß oh¨Å—Þ^¦ÂÖ†CªŸƒ¶ ²Ûô9´AJ#ÐóЃÈ2kzp4aV–)X$zŽ„þŒ€T¿ŽFUî–÷ŒÀ*s¬…VÀ*ŸNX‹µæíج5¿:3º78×? x æëŸ§<ªzÁá ª^áï½àóN`–Àß Î– ,ó–Ãv¼°>r$à…¥ð#µ°S/8| 8Æ ÞÞ6@>^Èvp6⯮îòßÜï_|ZòÉ·_¹oÌ>9Gøäpȱts„þä+ËEÿw6¬W.®âíTèU.z~äZš ûå¸ ¼å¡ÿn ~)=÷‡CÎyÂÛçáªSÀbÈ3sX*pf— \¬'y“ãLØBæõp¤‘®xûχüÏÃô/€6dzùÈCú€ þ-@nûù˜ã)`:æ•Ï2fÏ|–-ÚÃzæ Ç·xÿ|q¤P`òä|ðü6p¤8[ 9äƒçÝÀ2äWùXµ Àñ«`ËùˆË¿ÖŠ>u°Ü|¬Ý*à ÁçLH8k·8’ÉÇìø˜s¡ÿÂ: X¤Î«Ÿp`ôªs<´c] ¡c‰@¸*Č·áÚBðωžÅj!xþX"Ú¥yõTž_VÂÖ Á3o×¾ Á'?Ò zÎ… ±²ŸÌ‹DN[Äë  =‹ ç}@æXNއ‡"DvÞ3O/X„ܲHTsEàªX )WyÍR®>V ¬X«)B\øpšhó˜[$2“"p¸—CNàçÅÒQ Ý90Þÿ0ü#7g=нbðÉ‘¯~18äí"øób¼bð./,F%ȱ Ѷ\mV¦ŠÁoO×Öb-Š…)ŸüìtÔÅXåÛ€ ÈÀ‹a›—g#Û,·œ«]âÈÏ‘ýÃB·Ÿ†7(†…@,'#ym´Cb#…„G‚ÃwÕÉHÐ=œ(°1ÙÇ)§ÂÆG‚Þæ™ÒHP?œƒõ*¬>Zñ*­l  «S"²å!±aA% » è…–@bó,füÚ2äÆ%̹•@J7«VƒÛ‘‹–@2Ó±¾% oÏE”,a— ~+4f޼·: ¹sK‡¥‚ÃRÁa©à°TpX*8,– K‡¥‚ÃRÈêy ç°TðV*x+¼•bíú€œ·RH·9‡¥‚ÃRH¬Ø ŽÌã\"¸â|– >KŸ£ÀÕç@;V„gë…@to89 †YŒ?üHÀba7åX‹Qà„c­Àzsá3Ë0÷VpU†¹sý³A—Ê@%ù–aî+©ˆe x0Kà0XA(òv‘¸ªÚ[~cù]9XM¨ÏV€Ã2ø+Þ®X#°Þ¬ 2áãÔû'§ŠãÓ6øë\ŸË¿îB5W™ÀB“{OCÇÊ Éo#î†A·GƒÿQ@;|Îh©GÃöŸ–#bŽõ½ÀZDäÑ Øl€FCc+s!ó‹0Ó£ÀáðÁ{|,ƒÏ,‘—ïŽðìÇ.Ú<¿*¹}9|ËÀReˆÚå˜õçÀ©gˆ> ­3zÈsËrõÊ‘kî‡Ý•cFÝÀg -¢>­­€ÅðÐóÏ<Vˆ8X‘?Î?ó8p.¤]!,½£í>ƒ˜R)ø¯„|6í°åJD¨y¢]Œ¬ œÃï@cßÖB7*QðvÀég šTŠÚ­RøíJPäíýð'• Ø‹lŒÓ/¤4^Ìw¼˜ïx‘[Váì‹@2µ*‘eU‰H]nò|µ òÜ,ÈåY…¹÷'@ªÀÛYàD“Ä‘:“N8] —O•¨ÝªD¾W%dU%dU%|T¸êÞ"úp¹UaÏŸ&T#&&à«ÕàÙ ´ÃV³4¬i5¢9ÇBåÐùj¬ûÇÀ*ўͩ¶_-jäjpËÔ œ,pŠÀzxõjðÌÛ3Ä3aMÕà™3 ^¥šÍýjÆwmªá%8'ûÁ5¸å×>#®}r®¼|žr¿]#äPƒ¹¿ œ ÔàÚ=À§¡5¸ö$› ¢í‘!O?_gb^ÀCp6¤1×v÷Ãj&íš ´«W=äµm-"×YàxÑ®X#°^Ÿ&Ú³ óZŒÉ¯åû„µ°‚gû=k1òà38>QŒ9QŒ3QŒ0ü¼ ä='ŠžEÏI‚ÿI"{Ÿ~NGÁZ'a„#ÀJp8 \ñv•Àõâxƒhφ”&‰½ÜIŸù4tuÆ?Áê„V׉¬»Nhuú¿äZ=YPŸ,¤7YXýdŒù)púOÒ›Œž'€\z“…ô& éM×NÁêÚE»ždŠX…)í3 _‹)b-¦ˆ1§ˆ1§ˆ™"Æœ"Æœ"ƬVV/ößê1æ³@n_õ²ê…eÕ Ëª–U/,«^XV½°¬zaYõ²ê…eÕ Ëª–Uú8S´΂6Öƒ«#@¾¦õ²ê…eՃÇ€OÃŽêÁáólªàpªàmªðoS…›*üÛT¡±S…µNÖ:UXëTáߦb´ÝÀ§ÅµÜN§ ï:í  }¦cüù@¤1Tx;üLGDë¦B¦Ãóð#ÅÈ”¦COx»ž:´…_5^©ý«¡Ó¡3üÈÈg:øäT& œ$ŽÔ œ,pŠÀz1ÎT1æ4Ìe:¤ÇsŸ6ˆ³³àg¦ÃÆù‘9°îéÐÃ$à~hòtaãÓ…ÏÀ¼ÞU™È«¤à¿Xâo– ,ó×Ë!ϘÑgÀJhã Ì…c½À©âø4Ñæ™Û Q)Ì€ÌO¹vÍÚ5CØæ p²ø4$?œ< îM°°™"NÍ?)@îÏg >Ô¿V /°J`Àz3QqÌÄÜ㳑çÌĬcûÅOC23AësÔ'aÈN„4€Ê^ ·‘1»PùX/pª8ÂgÔ ¬¦Aìç4`F§s°‚ Ÿö4æØ€ñß&H~¨\*îëXv?J(ž9 LÅìfa^¼ÍsªY˜ oózy–Ȭfa}yÿð ³Äìf > óâíý¢ÿÓ°Ù h†!Û™ Z°Ðz ˜€qfƒÖ ÀrÑ/° TfC÷x^=͆îqœ$ŽÔ œ"°^ôœ.Ú3ĵ  Ëé„â=š3[Hx¶ðl!á9b÷cް—9"vÏ?ïË¡ás á£À*Ñæ<Ì{s@‹Ÿ&Ž7ÀBç`ä€OÃÆç`ä^Ð3Ažs1þ%@»Àxð3WHu.fú,°X/s±¦¯+E{¼À*5yf2ó=œ,pŠÀzð3«Ï¯.ŽÌ?sÁ¿êiÌe.øù”Í'í@~gøáíxð0¹G°>9ÖïÎú3Oä0óÄ.Ü<‘'ÌØüì3ˆ¤ó1‹÷%XåùÈ9–Aow(nÁJOòø{‹¨nMíò¬o+‹ôW±ÝbÅw 9ì†-Ï– ,C6¾<ÚýiÀT°žd?Ξ–ßï‡ÄZ€ãE»J´kD{²ÿvàõâøTÿÀi° ý?>93l~x?øÜœ É쇽ðæB2ûÁó|ö48‰ÚýVv@pu@pu@pu@pu@pu@pu@pu@pu@pu@pu@pu@pu@pu@puàÿµw5!nTqü7o&EYvã‚]‹ì»Ô6´»nv·•ÅnZ6¸Ô¥Xñ …ŽÉ$¦I:a2YÝö ²'‰ÒK”¢;¹:ÐÎ-]æIþ.⓽IëƒäË"}øèÇk¼s¸Oê{üÕâºü endstream endobj 273 0 obj 20066 endobj 274 0 obj 36144 endobj 144 0 obj <> endobj 276 0 obj <> stream xÚ]“ÍŠÛ0F÷~ u10]¤þÓÏ‚aH)Í¢í0ž>€#ÉCcÅYäí«è˜)ÔÀAò½ç»\?|zi7Ïn:úMý¥¯þ2]ƒõ›ýnÎòýáëa‘¿„ɶ~ý0º°ÞGƬ¬„ì²Rú·çõåövYüù0öS¶Û‰ü5^–p©ãç,ÿœÃx¿÷mäö:ÏüÙ‹(²¦Î÷±PtùٽȟÝ÷ÉnâÕo·Ù‹*q‰ƒœ¿Ìõ¡O>ÛñiÄî[|šÌî¿sYðÚ±·ï]H×ñzQTOM" m•ä •¨®U2‘,!Ih i¨ƒ D?I¿Š~’~UÙDu y¨‚z¨N¤ 3…Y­¡z‚„™ÂLRSQS’H“HRSSSRSSS’V“VÒAÓAÒA¯È®É.É®É.É®É.ɮɮ˜¼fòŠIh&¡°ÖX+&a˜„ÂÚ`­°6X+¬ Ö kƒµÂÚ`­°6X+<Í6-Ôº9÷Õº/þǺÚkq“Óבvõ¾¥Ãè?> yšïo¥ß_™©á7 endstream endobj 277 0 obj 417 endobj 275 0 obj <> /FontDescriptor 278 0 R /W [ 0[600.09765625]11[287.109375 287.109]16[208.0078125]21[616.2109375]36[699.21875]39[678.22265625]41[478.02734375 819.824 713.867 238.77]47[375.0]49[833.984375 861.816 502.93]53[541.9921875 559.082]56[685.05859375 624.023]66[500.0]68[577.1484375 577.148 476.074 577.148 519.043 273.926 580.078 527.832 262.207]79[227.05078125 768.066 527.832 562.012 577.148]85[334.9609375 398.926 240.234 512.207 462.891 759.766]92[498.046875] ] /BaseFont/GFEDCB+FuturaBk-Italic >> endobj 278 0 obj <> endobj 279 0 obj <> stream xÚí½ |”Õµ7¼÷s›K&™™Ì5W&“drO&“dr!À¹!€5B¸(˜‚"jkÕŠ·â­ÖjD& pЪµQ ”F‹ŠÖ+¶êñJ[µKaæûï=“!\l{Þïý½ïw~Ÿ3Îö<Ï~ÖZ{íµÖ^k?PBˆ‘Hø2ÌšV?7ÿØ-"„Æã¨wykW± ~ÏÅoÃòUë– :w~‚ßK É~gYÇòÕŸÛþò !¹å8[Gg[GMÔ»wã÷!B„¦UíKZùâ+:Bò„H%í]Ýë>ø)!EÍ„D>¿¤·Ûñ@Úu™fÆõ/¯hk]úù+—Åïwÿú¹sjnÏ8ô!Л°¢íú BªÜ8Ÿ²dukǬ·<‡ßOûÉ•mkö9´’Ù%„$ÚW·^Ý!o–ú iŸ…þŽ5­«Û–GšãwäùÍŠÕÝWß?ík/!Ý>BÔ«æäyîõ=d"äÚèR¦M”°VÜL¨#Jþ%8õt÷t¶:¦^YÛí`/zÕºÝ~â þ‰šÄ@h €¶@–ùï“–É[ÑV‘XŸNº”(—Rµ-H$ï•7OäÛ'Þ<á6“Œ©IƤe9Ý%ÆþÔŸ*êÛ/;• ȲÇ_ |¡ä¹Å§'­IkÖFjLD!‘fÛ¯¼f,-5–‚o¹}ÎtUº:]“¥ÍŒÈЕÑR¡T=Q;1¢Ô¨Kפk³#ÒuÒbº˜Nß9wúnÓÜ…Í¿"fˆOæÀP‰±¸d/~@;`´[#út}‘}Q}ú>Ã6ãaíÈ)b1YLAŒ¢s´MåŠ ½Å±´Xøâ®_gô……·•O2èóFûä/_óÇûÿtÙs ¶ùß¹±ü.ZñôÂç[i²@Þ…¦ÀãªáãºÃ§”Ä(ÑeŒ%­d¼Ø¸ 4CñR¯ìUd JÎŽÂ0wáôÝ–‹%rÙAwvwEï2)ì Ó\ÞïúP¿ëƒý4#ä€8¢Ž‚v´T•æ6M¦E…BZ±5ÚbV„Œ¼×Y{ׯ² ú‚‚[1B!ßÿþ™À»å‡é§Ôtù ¶P×ïò¿ˆ1‚ð ú=)¬Æ¼O|†PI¤D o¾VÊÆóækîñr›Î /qá%"…„§ª¤bz2Æ¿9FXýÐCLg·"k•4’@îõÅ©E³dœ`¶'HÉ¢VÄ(3±D‘8Y•ý1Ââ¸óNœ~å„1jÜ›Aiªu§›ËäXx¡ ‰\D’8¦Å”kõWÛèc¶Ò°M™¨ª{h¯¶7ºÇ´ÖÚ¯î׎#Öahh’*‰N¦ÅL}®d§¢Jö’J”%Û>ÿ×þ=­ÖÓÅB×Ó?„{®»ù5û#©4õ£¡DiÕþ¯Äÿòfaõ¶kÛoyñîãT~Ü”†P8ñߪÀö5äŸI­v•âˆF­Rª@90q9† ³±f’L!CÌ“òäL%K£Q³¯ñDÌeJXxž -W€–hÇðc§˜ª¸·èV•¨ÝšzR+V)õêkÕ}BŸØ¯ô©¶©·jú4¦\’Móh®#ç)¹ªÓ¥jùŧôÐk…ur¯Ò¡l£Û„-ÊAzX8$R¢k°ZÔ •bµ4Cž®Ôª˜[õ Ýb§Ò£ ý±kÅ6ÕKäzª8(½"¿ŒÕbH•Àg‚Í5)ßœ:m~nçiñ?‰99"½ô÷+”‚¿O•6³µâ¹ÀqU≑$ÓTŸÑž¤KJb‘$Å"êE%iêû'x9a8éö5†"úùQÃì°°Xî°;cNG²›[—[çŽtG¹õnƒÛèŽv›Üf·ÅmuÛÜv·Ó\kseE8Ââ‹Åš®°’^†3hŠÖ¡Ý*ôKÊkwiˆ¦¤‘ˆ‘˜açH²!K›§MuŽEžŽÈލ}‡¡ÃØÝaê0wX:¬¶{‡³#¹l¡}ÂãZ–ânã)nŸ±/ºÏÔgî³l±n±õÙûcû'lwlqö%Pd8â¨x0úåØÑdÏùÑêìŠDΆ,QÙ¼g~ïßáõ_++EB m¡ôù)Yò¿þÿ'þ•™’L³ÿB tP”ý;ýnz M÷¥Ó&úšÿ6ÿ»i—Lˆ)Lüší¿ÕÿMŒ7á?ýoÓ.ZÛ¥Õð¥HCôÙ­I¢9Ie•mȲ¹TjQ1ŠJ¬áÍ÷ÃË{pí2¸VLRM¶”Å I¿ÛZc¹òcIì˜òs«bÖGo×@Ý "ÞLKmÌZ¹C^«êµvXé ¢Õ¢Õ“–ÇcF­Œ<”°B#Zñô+È•EÅWZšä?äÿkͪ_}ýõ—ònQ|hW}Sýáç¥æ£ïiRÔƒƒö\+–±UKÏ|vmxÌ›1f‰'oûÄ»bKÒZÕRlŒÝ¦E(k"DY”¢4 Èk^ ¼œ þëΔ2äTÅ¥qE–Š¥R)²IÚ)öÒx7f1MrÀ±1ŽXGœ#¾TŠønÝ$pÝ$„1ÝL­•¤ªx(À¾_F4/żûRÜKñºZ©^iPfhì=b§z¥3f@Ü©ìTõGî²3£‘_S kGìf¦¯(ªBnÇT–t¡Ên?s€^ó†ÿÁÂÎ_Ñ©ï"î„û·Ü4ë¦g)­xú ùL’ðî™4èn«9=>Ân[q¹_ÕÍcÝÍãÒøwUù-—²×›–6ÜÛ3ëª{ Tœ».‚.E‡ÿ½öºã6ËÏÚoßc¡âuwôß*Šq4â×=[ä«VOžÖÙ*H±‘S—×*¿}3Úe>òÇM×®l]sשk˜·©¾yëSšyðè" ûdà¸< û¶‘¿ùâ­‘ZŠ”N²D«=B«²Y#u…í•ÝÀ§Âesõ{¾æu[ 2"½®R š¨óDz¢ÍóŸù –wX•óRhïÌ`éÔCŠh‘P z%\K+‘“i‹‰—Nª$Ÿôõ ’ôÚ!õ¶ˆï†éI½Ž¬§]âÕÒzy€lG¢tˆÄBÍêeP ¡òéÓ×ø;Ÿ§fá'X™G•ü¿·Kwóü-pÐÿ øA`§Ÿ–m$Lz–Â1w n&Ȫ¤bñëib=~ÓMˆ“Ì×·ˆïI¥É¾x1:9Ö©‡©[ôY$ÚL !F!—a\”<Á×v¾Õâ -ï¢CrÈ™‘.ðN;’ÉŽGª×Xb·O”&¦ço+¹¸f\Ä5¦™ŸnºÍÝ–nëÖ¨-qÃQª¥AÕ nÐ4h"t ‘ Qµ¶†¸†ø†„†Ä† ކ¤gCrWp-;¤ùìZÞeî²tYײµ<¦#¶;©#¥#•¥¡;týÆñý©û‘ Câ4¤2 ‡¢‡LûÍ/[^¶¾l{Ù>3;”2”zI0U-ŽB,àVÇ·*lÅbxóbÌ¥-lñ ­}âMIJ¦y¯v=–j«Å»7ÜùF ¾ÖÞþ®øÂ銇_öÉsñ…ö¨­eîÝþsªñÚ;~õ ³ËxýÏ^ÅÜlÆÜ<¥<Èç&ϯD`n¢’¢E“•¥rh5*)BQÛˆQí:§4?;7·8ˆ‹²ÙÉÑäi/ž|9bR“ØÌ”h¦h¦hK‚5F­ÆåÓû >£/Úgò™}ŸÕgóÙ}1¾ØJ‡/Å—Lšº#.L˜º äµII©S2„B]A\¯3´‰h G„ f»~‡ÐÿDÊaá°NÞJÙFÆ v0b ~0agâÖÔ!2„ù9¨Þ¯ÖÐ E¥!óeÈ:dâ³4œÄæÉÁ“ ¢³*™`zƧçÌÓ`ŠôÐÚ-)1[iäÖM¾»ž:&íÅ{®½ë0&êõ?ù ýôÿ‡—-~XyðôÝs[ÞßçŽN‰¾îžg~aN5üðáÆMã¢>4üÜO T2š#%gB¤ÓlIÈrœ ZBlæA¨®¥cÉ1Ö?¾º})L²Ë˜—1ÁM¼…Æ©¤Â¨ÍÔ» …ÂD}­Š˜®Wï3®Eøß˜í]Éýñb'é•»½ñ;”qñ&¨Ç­aá8©:׎Eœç–ªÁ“±‚ðô½ ?›Wùpӫ߈r mþcã â»Ò³‡‹ˆ±Ýð`NÆ“ÉÉŸ>¯Ou§ |s›ÇÙ²U×ø8B²õYÿR)Ì Nš™•eN·¤[]6V4Hn©À赤VÒiÆ*{EÊ´T³+*3¥\š"ÕËò…åçECIYG×[Ö[×Û¶F F?·-~ u„ˆ6[†­Ã6ÃÕè°QµQ½Q³Q»1b£nc䯍ëLךƒmŒß˜°1qㄎIÝÎÁPàØ=?B^£¯J£XŠGU£êQͨv4bT795uÐ4b±ŒØÛGãFãGFG'Œ:F“F£É%,œÓ B‰éÂP"Ûü_K6ýúœX¢<ø·eçıýï ç>G°Siì4¤’7|Ùœ‰ v¢‹P“ļšãtÚÕN½Åžå" TŒÓ¥F¢œHtq2‰v±;˜5¤Ѷ°õú‡O†2;žÇ™:gd¦5#Å£›ªS\¶‰QÓ£.ž¹]0A¾-En·mKîK>@`¹; `yQÌŘ0Š?0”84aÈÁœ}LÌØL»^Z´³º3ÇxNá z£/g‚ÁFõ&•NæŒw;M:§ZrÇg™,$­aOc¥zÃ)GErˆµ€Z4KWC ëØÝÃÉp¬ä›+CáœcÜ–BFl&*±àf¤ÃáHb› ŽgªÃåHsä;‡/Éçô%OÅšçsùÒ|ù>ÏX’ÑÙÕ5¶þÅw$tð ËnĈîäµH1:\iݹùžæÉr¹qбSÓ›ÔëìMV­‡˜>u¤ ¼>J¶ÆmI?H^1Ç),MÙµ#¦?qgF¿'œ¨DŽ[ã‡B~±?iÈ9”<”òrêk(m(È3!˜&³Je-à¥Êú¯ä/}þ“_¿øê xݺí;â“ÿY.c o½G=köÃO|ü³V_>€ÚÜŒµ"†¼ëKÔ‰F‡3gé³#)%6ƒ>R' Š1J‘QyóšPõ’W~âôXõbO¡™º}ž¡ˆ “ôS ê‹7¢È"þ7¶(šûµýÑB%Ò÷š¨Z}µ±ÒÚKziØ­ë‰\Õ«ï5tw‘]ô á q—´KÞ¥ìRíRïÒ<ñ„n òIÃã.Ó.ó.Ë.ë.Û.û®˜âaÖ}FhK3¬Vq|"é.ßÚ"Is\óhBÍcT·uSéö5×m’„g&Zsì çïÎ_„|ãÞyóîúQL.÷©çr?1 ¹Ö-ê¢ÓL“Y!zM´¢6[ o¾Ìóƒ…vÞé7_qû4N“Ëœo*2KçeV® +±Žé"­Â´QÜ(m”7*g×ÁuÑë-¦mæ~ËHôˆiØ|ÐbZ¶ž¢±EÐd“0K=#7£XPÍdØòÀÖä¢Ü©Þt1RȆ/ÿ‡§+ÄÈØü 5˜‘ôÍaJ7;yâ‹¢”q+%É•œ–Â̹0ÍG*©••l³_òÉ>ŧò©}ŸvZD…®2ÒYU[™8ÉÇSEBSº/×éËê%°ãquÒ¡êPwh:´(¹ù.g·¾ÇÐcì‰îæI{·½'¦7žÝia;¡À՛ޑޑёّÕ/²J|Pׯ´í°÷Ç$®r±Á3£3°ReXRœ9É)ÉiÕÖªÄþÄþ}p®,,¼eóÊ&Ùc34ëpâáa”ï¹GÏKž^Còt8jD?j5‰5šG-‡íbϦN£)£©£®Ñ´ÑôÑŒÑÌÑ¬Ô ½íœvŠªmÌ\åSK™ÿÕLïXŸTÿX‹,O~Õ-ŽºÇîßjqß»ìk žÇVôÜ =gn&ŸíMs·ò§ “S‹Ìu¿|Ù_ ¾°qæÌ¦ÆÆ¦[®³ç…ãl'†<5>ž¥ýwâY"3•L]¦ž@©ž¥Ú(m0¦UZÇ=„a ÝX½X@s÷GÓ³!¬ÇÀî²ôiú´Û#úu[BOf·­ƒ¡ÊzÕ…ÔuA º«í¢qJ|áöp˜ í'Ü ]I2ù«Ïhwê’P°ê²R,DŸHø½7ÇÝh+P3´ß}€-ä¡[_ºs–h^˜Nå…iå¶H§],Û¼à¾@Ë뺘® ½Îþˆ-1O8Uë„ñao­ucìÆ¸`ÊÝ„­ˆ;´;b·&kÐ!Ý9KïøúKoj¸ò—{^¬î¼Õéüí_ýUtα¡oÄí"ÝvýŸÚaÛ›?£Çßò¿õåsæ,ËÛÔyòYsº5"&vã#Ã÷GÄÄÜøØa¦ç)gNHO…öm§œÝˆÊRåhÒ\ßµ;`81®äÊL¥9J–&O3I.Cù_?%¾,i†¦V[ß_—¤OÑ84žÈòÔÈà6 n½v©:Të5]IÒ¸”ÒÅSJ–χž1 Æ=‘"n¥ò€²MýDüÖT%xeî˜ù^P4^SÖŒ—Bwd.v/&†Å§à\ «i¾k/àÕ ¬HH9»pŽiÿƒ€Õ[Olµýƒ€33å×/¾0¶¶‰Üþ¯óÙ‰^‹@-9õYÚ45JT ÑDŸ­‚ݰê)*CÉÐNŠœ)yä©ò?¸-ÍÕM¢ÇÔÝI{U;Ø]Í@äˆê€F5®Ü?;n±bª>þîçISáÌqžÍí±ùâÁ-£¿ñ_.¾ðøòKµ ;5p\,…üùä[_JLB¤+–PÉNóì±VK^–‡&b3"]ÚdÂö4b2מ“›—•£¤Ú“c’c“㤱gE0$O`¬=xûB·Š'ÑIiõiâ$:QWj/Í)Ο¦¯ÌW-èlãáªð°ëCª˜Afꔆ”ºÔ†T¥N_—/¯1p6ÜLY÷™FØh¿~À2~ÀvÈ~ î@®êü["eö“ž±½~n<¡­þ fK7GWO¬lÖPZ×òã«©hy§Ã#¶ŸE/š1§]KéÜŽÕWPÑüÜ=WÞ(¦6N*™R,i49—LÈ];_c²üèË~Ð\YQU®ŠŠÌöee®›­6F_{G3·§‡àìíòAÚ|V™Ú5*’&òÚ’ßyÖ)üÌÁéòWNxÜÿêÖNq½Ù­°K½S³K»+bX‰ÐbðcÕ_(´Ûî¿ñ±ºl“›$¾ªó~èßJÈóIHèl䋱û6vÿ!í_¾ÿ뢙J–6Gç²NŒ˜¨ó©¦©§"Á©BˆŸ5U?Õ0ÕhÌKåéˆGUÆ`ŠºÊB×k×G¬‹¼ÆzM7·¹ÿ`úîêØ³Ã<¢ú¤>¹OéSõ©û4jû"¶œ·H>f=LÑíHäkp© WNü~ƒ*t¿AJjJýÝ+ý¿P”¦­MŠDç]ÞÓÓ$¾pæãOß¾÷¡ i‚ãÌg©ù–Ëšoù¹ŒÞ’&B2¹ß§—’F-ÜnøÃ sŸdâ’œr )¼’’,8„©„Hÿ{ K$…*©[zŒl£Û¥aª™F*øc•R•Ü%®—· b¿ÿ8½ýÙ ö„ÇÏ4Cƒ„Ýgf ?ÍK±†¯† ¨È3>£åѦ:XBõ8Õ±Z“Hªœ¦r¨ï§Ã rì&³vG®s<Ìj–âä»åøÝbªz·”š|ü»NÏÉž>«Ù±û²ÊŠÕÊË*plN3šìãxeEyV¸Þ¸Ô/.ÎX,/>%.ZxŸ¼_CÒ–¥òÂûÄ…×K- DÏ?%ºs6ÉîSb^n¢œwJÌMs6‰Ù§Ä¬ÌMr¾†¤LôËÜ$f^/e¤»äŒÅb†OJw‰i§|¿]©›d×)Ñ5$!A’S7‰©×K)É.9e±˜â“’]¢ó”˜dóÈI›DGÜbÙqJœpJLÄÄSbBü&9_CR¡É4…¦RM£éä4ƒfÒ,šMsÈÈßi.Í£nšO=´€Ò"ê¥Åä?i -¥eä3:‘–ÓIt2ñÓ)”P½„Ròt*F+h%­¢Õ´†üÖÒ::ÖÓt&m ³ÈïélÚHçйtm"'é|ÚLк|ŠunÒÒKéèe´•^N—Ð¥´œ Ëèrº‚|NWÒ+è•t]M×ÐvÚA¯¢´‹vÓÚK×Ò«é:ºž^C¯¥èut#½žÞ@o¤?¤?"ЛèéÍôz+ý ½n¢·Ó;èä~z½›þ”üœn¦÷Ð{é}ô~úý}þœ>DA¦Ð>ú(ÝB£[é6ÚO·c• ƒtÝIŸ OÒ]t7ý7ú}šî¡{é>ú }–þ’>GŸ§/Ð_Ñé¯é}‰¾L÷ÓWè0=@RT„ô0}•¾FÐßÐQú:}ƒþ–¥oÒ·èÛô}‡¾KGߣïÓè‡ô#ú1=N?¡¿§ ŸÒÏèçôßéô?èÒôô$ýý3ý ý’~E¿¦¥ßÐÿ¢ßÒ¿ÑSôïô4=Cý4÷§‚ ˆ‚$È‚"¨µ ´B„ "…(A/£-˜³`¬‚M° 1ÒÌyõõêe+—wu´.iÓt¯X¹†·Tmcß«ƒgº–u¯X×±¢m®£­seûÒ%mkºÛ:#–´¯^ÝÚº„ýR]Ò¾¼}MÛ•ªKV·.él_£\ryg[o[Ä´%+;—ô¬^¶ªíjiÚÒön¥bI+;]ѵªµk…ª2x•Rɪ*CWò‹¥J\Q}–‚ºzIÛÒ•«VµJÕìLÍÙ3Jm÷ÊUKÛTµ!µœ€ª6H^=}ìºz&B}P„úÖ%=ÝmêúÐ9e&ÿ­ÌägÕ3C‡U !’ œ¤¦aéå«‚C_ÁþcdæðÃsÆ 77ØeîX—yAaç…(Ïã”åy+×,×Ì£¯š>bþYJšùKW¶u¶u­ìR,ïl…~ŒcÓ¯“Z0FUkˆvkP­!ZKÆMǦ‹¥A]´õߺª-¨ÿ6F©-¤Ãå!é#–£±œÍʳT+C½¯Óø*ÆeUKp`êUczXÔàš zÖŒi¼=$E{Pãíaw†¾‚ý;ÇÈt5Þ5NÝÁ.Ýc]z‚ï Qî j¼‡k¼'¬ñž–ÖŽÓøÚ°Æ×5¾n›õA¯gc\d±2ÄbeP…K¼…nù’U+Z¥©mÝ­ru+\F®h[ÕݪªìèZ¹ª}Ô‚b%NÎ]–TÛŽæôÖŽŽV˜èêË—¶ 3z„™=BóJØâJF\˜µRl\Ñ.ÏY¹|u«8·µG5/HJœµb¥8 ŸY]+åVÎõrÆu9纔sm q]ϸ²“ÝœëJÆõJÎuUëšáꕘ ÎRì¿.ÆOá˜/vƒmOˆmX.Á?åöÕmË[åyO~‘¦uM{wÛª¶•øí.(n“»Û×´wEŽi”ÿÒråð¦.¤þC …ð††é#x>4üàyã:kSÞÔ‡Ž1Ѷž¥ß6ž~Ûý•aúíãé÷Œ§ß¦¯cÝLjëjÇýÐ÷œËÙˆžmçŒÕ|^ ÿÖe+Wæ»ÝùÅáVI¸U:Öò¸Ã­üpËn„[…áVQ¸å ·Â<»ñÙ)=I&I¢:ØJ»P/ì*¤'岓tI¬Œ› ¨Q‹l&uð*e³R€ºäaåÁà[|aì­<(˜Ñ»GÈ¿ ª“[…Ó¨Ûîoµù%²SU'å›*¥oUP'=@úä—‚oò€’€šÌŒzk­ø ø¤x*®µäŠ1îâ稷ˆ9x1º({Ù/ /ÿ+±©yÝùâGwÔ³ï—*~\åß|æ˜æ¸z1ªP…÷U¦K)¥Kÿ‡¼þ—ý4¾ÿi›Û•zñ™c„höÁ~‚ýZqþ΃eiÈ®âñ‹]üQèaö·XP?ÿÏÞù ÿç÷>èæ¶÷!ÄþoÜû ä·çì|vÞþ‡$]‡>×ã­àû:|ßA¦©4ŸÓÚ†:ÿ§ÂAaDø@¼Nü‰¸I¼K|Tw‹/‰¿‘t’EÊ“Š¤i‘ôéîÄ›¿rˆ•Cã°8b‰§Ãåp;ÊŽÇ;“¬IÎ$—Sp*N½3ÚiqÆ:YÎçeζÔÖþ.ܦ¸¤¦S/-¥õt$8 Þ?‚wˆw‹‰ƒâ¿‰/KTŠ’¬’[òJ³¥K¥»”ø%ûÓÀä°;â.AéE$0B‚˜°K¹4üžÞƒ™94ÞÅ~>IøÄræ½3¿ ž=³Ÿ=g{üñÇÛ>~'üë¦ïÃçê§_ññk]ñѺïûpˇ·òÑ-„|ØýáUþàüÝ¿û“áò¯ÏÆor5½‘ÞCï£{àmD0„>v|œÜ?B¶P!´à{>k„ ?n~òß ?î~J¾ã%\ü\p<öÈìùW°ØÏaÕwÀž»ÜJþÛþ Ö¾™œ$‚…ß{ß;ú#fküùOrÖülð ¬—ùÕ]ð¬Wá[‡`•£!«<Oû-·Ì]ð¸/à!oqû\A3¨ þs|ðJøß*x`|ð*x!óÁx!|–À ×ï^ x~Ȭöz9ïøŠæ‘¯©›|IóÉ_©‡|C È·´ˆü-$£^òwZLü´ŒèDJh99M'‘3°3J§P‘ú¨D/¡Le:•*°=]IÕô ª¥Ó¨†¼M#h¢ÕTUTG+©ÖR#­£&Xk4NÍtµÐ™ÔJ˜S;McéCiKãé<šHçÓÚDt@›im¡Nº&ÓE4….†^J]ô4^F³èRò<͆7æÒå4‡.ƒ'òãàÓ†öÐí¢±=´=ô©qûh{aI÷ž³÷öoôéÐîÚ ô}AOÑãô]úNhGì=Á(˜èçì·³C&hƒ Q‚"È¡½.µ-X-ý ‚ï¶ÒLº„E/ÁÆc×+<Š #^¾ŒHù3òïäψzßGŸï£Ï÷Ñçûèó'ú„*¬D3ÂaÜZ…ý%²þ×sujHqà)`ià `ÇòÀƒÀZä¦ä™ÀùÈI5È- ÀdÀd˜QȃÍ– [­ì/w†±Wñ/)€¥ÜÃqo`"ð™@èšýß-µ@+>h¡ Ê®²ñ™@oà÷ÀâÀA`ià%`ljF¡<ðCà$Èo€f2€ ¸Ü 1vY„ô&ô7‚ã@+è‰=0ôF{3{ÍÀgËPAË£Ž@$4AÂ=@kàÐ8´ŽÙMãÀxhÕÍÄ öÐ2€zÿ c4£ÿY )0ýÁ@?+´-ü¬•·q´û÷cüÇ€±ãüÇñþÀ~öGþ­¨lô;†À@cà& },“µnÚvÌ‹3ÂúÄòãlF,ö)`ô`!‰¡}c`ЄÑYAíI %p7ÿŸv³J vhµ=ÀÞ“Ý j¯ãÁÅ©Žò«2:6Ð9´nZÁõX€ý’1¼gl`Q°B0!ð5*6®µCž§€&Ì‘tžZ+€VŒÚÎåanÞÇ*¼À“ÀXŒÑj;ñ°‡ÈóÍc ¨Möÿc0j1 Ö´bD1 ög vj¯²š1PŒ ¼Œ‡¶c1›Ï 9³¹h t™ Ç‚Ú @+hÆb6ý@{àR` ,ý¿o±*4Ðd²Åb¤¨Jõ°Ï8ÐùÈt:­Ðp¤úh<Œ$q\çq s”U´ÐO £» XÁÏÖpœ¿Nç¶š9ïOÒ!í}Àh5frôp,äèE4HÇ÷€%Ðv:8ž–qœý¤ƒãÀI¼O<4óu XÅÛÕk8Öq¬‡~Ò!ÃFøx:l’õŸËÏ6qjÍQ:¬ñ` æ+zfx+zbå‡2x„ÌÀˆ’ÙZÇÛÆ@0+WÆòÐÃÑ‹‘f`_Ë!s¼Œa¸g@¶§€õˆð˜ñg˜Ç xk7av20ã'€ÍüÈ"Œ=q‚dÂö`ßá9 [;2Áýq |3Á÷U`1f$ÚûX }fB{ ™mgBoì,›¯LÈð9pÆ’ .ïc½Èýã@#FÍöèt@/¸gá*Ö®áX©²pÕïуõÏF†,SɆ0Lç˜Á1“cÇl޹ó8p,âÈxecÇ€¥Ð[6äg8þ› ùÙñ Þ³šc Ç:Ž s6²{¢¡Tsx”ÈlG)ðµhõKðÖ@WzËEŸ#@´”‹žû.¬,¹˜ÓÛ€Ù°„\Ì,;RÈÑË{–À~r¡Õ¯“°Žæb–O+[r1Ë ëaÕ¹˜åcÀÙṘkÖn‚Ær1׌~3l&¶×\˜ ¼ ã̓œÇ€lU̓„OÙªšÇã}优ÉÑÃÑ ]åA{K,æçA‡—Ë8–¦+à;yðF¹ȃ§°#õðÓú¿4`¾òqk§À®òÑóS ³Ò|ø/ÃÈæAÿA qɃž»9г‡G{®zX }z0ö€e'bthà`=$ñ€&ÃùðÆõ5p!´áT¬}+Ž@ÿÇzÿ×@2½ä!'€‰Í@æûãÀ4Œ«€¤sÌ„œ$‹·³9æqt#Ç.€Þàe€)âèEž\™ß–ð³eÐCd–#¿*À¬]¬æX_.Àºü{`=ïÓÏ-ÀÜ]lâr·† 0wO[ ™ŒŽÑ\û/äÞQHš¡uVýDõ°«"ŒñЈy)‚Mº UFt˜k‹ ?;âå=‹¡Õ"Èü9°”·Ë8²ê©2VÁ׊ 3k×Ã¿Š ';ÒÌ{.‚Š0³[€Ï@ç^žÓzY4¢§z~ è½ä 02x±²³ž~¼£¹¥—Ws^H5,……x!CV³x!ÕŸUk86Âk¼X~œËÛlÍõòÌÄ w“bX v^ -W!?r~ÖÛ+†œ ÙìCBÖö"žãƒO)ba1*A†åXm‹!ÕÝÀ*øT1¤bíéüÚzÌE1!Å“‡š¢³|°x1|ór` ²ÍbHˤàGžFö[ Ý Ü‹hP ݇µ\IJXm4Bc%\Ã%ð=`-tR¾gpl€G” »c8›ãøx $am–)•€ûÀ…˜¯Rèê  ïRðÊ0;¥<[.å+åT ¾W]ðÐRhŒ¡‡c!Çb®-Gn\J|Ð[)´t3°†c-¤-å¹h)4³8ó[ °ö"¬’¥ä2Ôo¥ÐFðiä½¥°13ôÎ$,ã–q ˸„e\Â2.a—°ŒKXÆ%,ã–q Ë «ç€LÂ2.[—­ŒËV†¹;d²•A{¬Í$,ã–AcÍüÈ"Nç2.“³ŒËYÆåœ©¾1#,[/º`{!É(0£˜yØ‘BŽÅÜo*0! ÃzŽ!f–cì/uªcgög€-•ƒK0ã-ÇØÛ)X/ÊÁñf`&ÇlxA98²¶—_U ë-‡¼qì~¼¦Ü[€•°ñеk8Öq¬G4+‡NÆÀ,à~|.Çæ@#Ùs9VÀo€¨æÊ¡ÄAXòp/l¬–ü.Ö]=l{äŸ4"æLâ+õ$øþsÀ ¬˜“À}7°+ò$pì6C“`±UÀEÐùdŒô 0`2¢ÇŸåˆ™|åe»#,û1ò6˯*xn_Ør°Œc9Ví ŒúKàŽM¼O3¨U`DïYnYÁW½ äZG€{àwÑ0ðXK%¯O+Áë`1â@%ìüK [+ù:X Ê.€<• ù*p´]É=½Ôž>ƒ5¥ŠË_ýláËUX¡>zx»YA$GÜž ¬‡mT¡aíŽó86a5©âµ[ÛUàÈÚ{OªÀqÙãU͵TÍÇ[ÍÇ[ÍsËœ}h@¦Vó¬¾R×@†›,_­>7Ë82}Ö`ì'€Óa 5í8pÇ™üHÇYgsœÇ‘駆×n5<߫ẪẪá1ªRoå}˜Þj0ŠgÏÀj±&Nêa«µY 4"~Ö’TÌi-Vs†E+`óµ˜÷Ï5¼=–SË}¿–×ȵ–ià8‹ãlŽˆêµ™µ›8…ùð¦ZÈÌè,@T©%-à_KØ®M-¢“d䯅´ìÚgøµoCÏu|¯ƒœG€,n×q=ÔaìïAu¸öIà^ØF®%Óùj;gÈÓ!Ï7Àù×tÈpØmLǵÃÀ=ðšéܺ¦sëªÇUÏYm[•ë8°š·k8ÖqläÇçòöè¼4ÙµlŸ°^ð,pVÏzPÞ|Çgpš38œÂ ÈóõœÁ{Îà=grùgòì}&ä9œo ûUp&¤bíŽuùñfÞn–fò½Ü™ Ïhî…­Îý#¤[uϺ¸U7 ÿQ ³êYœû,®½YÜëgæIàôŸÅµ7 =™öfqíÍâڛͯÙÍy»‘d6Ÿ…Ù ög ›‹Ù|.fsš³9ÍÙ|Ffsš³9ÍÙœf#÷²F¾ÿ֚ϙ5rÏjäžÕÈ=«‘{V#÷¬FîYܳ¹g5rÏjäžÕÈ=«‘{V#,ê à|Þnæ¸ÖØ©öÙœ6rÏjäžÕ î…5BÂçÈ.á.Ûßæðø6‡Ç·9Übçpoýu÷Ö9<¾ÍµAà^~-óÓ¹<ºÎÊö5P‡>ó@ÿR Ú˜.¬yæaE¦À~æ!ò°#ÅÈ”æÁNX»‘¬…]UÍÔðþµ°Šy°vd:ô3r2.38ÎäG8Îâ8›c#§3‡Óœ‹±ÌƒöØqæãóàã1Àf~vâÌ<ø8;²Þ=v˜ÜKžÇ}|÷ñ&Œë#^•i¬Jj‚ü¥`Çò@=°úlˆþ ¬‚56a, 9ÎáÇçò6ËÜšx¥Ð2ëjâÖÕÄ}³ ’lî…æ› ɳ^›Ïשù'Èâù|Ïçƒû×À*ŽÕk8Öqlä8Ç|Œ=Ø‚FÜÃ)ì…fæƒ×—¨OôÈN›¹4ƒËn ó‘f>ºfpùØÈq?ÂFÔ̽¦™ïç4cDÇ€ 1ƒÍ Ï¨íÅ›Aÿ-H æ€Ëåü¾Žh °ç‡ á°™cÀŒnÆÅÚ,§Z€±°6«—ðÌjæ—õoBLXÀG·€Çðkïáý÷ÂwZÀÑÔ#Ûi/xx&‚N x½¬àíjŽ5àÒÛc}XõÔÛc8“ià8›c#ï9·›øµÍàËøDá³–ÓÂ5ÜÂ5ÜÂ5¼ï~,äþ²¯Ý !ÏGÀ XøBhø °†·™ ùžÆBðbÇçòãÍðÐ… üp/||!(€Ÿú\ú— Ï"®ÕEé³Àb~¼2,œVñv5ÇŽuYf²ã}8‹ãlŽgfŸ];i‚<‹ »j/Ʋòœ$‹!I?ÝÁY yX;2,Fî±X _ Ž WsûYÌs˜Å|n1σ&;û VÒK1Š€¥˜åK‘3,‡5ÞŠ9ž d+ï­¼2ºÞ´Èò½A>˃|ìƒðß&`Çrdà{ gÐH¦’€Åˆ{pö°1|´Ô¬æíÞ®ãíYÛ³96òãswçÂkö@?ìxòdøbïHø$°ÚØaA{ í¥d/$‰:²KµKµKµKµKµKµKµKµKµKµKµKµKµKµKµKµKµKµKµKµKµKµKµìÃ=yt@£ß|G†ùÞò0rø`1*‹aè6XƱ<`ÎaЯ¶ º¡ü ÈN¢BN#ñ·6çˆýøÅž“°SWøy‰™¡'ujð+ØfÏãεEDïÅ¡¶j×…Ú2±“;Bm…èI¨­bÙ¨­&ò·PÛ@44&Ô6…:Cíhb éìéLIƒ_Ñ’P›’húf¨-ý,ÔÉTúe¨-‡PjËÄ-Ì µ’(ü(ÔV‘[„-¡¶šøÄÌPÛ@¢Å+Bm#щ׆ÚÑÄ!Þ’¾$Ã1­½c]çÊå+ºù¥¥¥9·»È1uewWwg[ëê¼êÖU­­ËÛ»m]+—¯qTw¶÷tä:.YµÊÁ¯êrt¶uµuö¶-Í÷oöµ®Z¹dìg{û•Žà‘lGu[ûê¶îΕKžüüpÿÐéÕË–w,éîÎé-Ì-tÌiëp¸Çì7õÊœséŽ]æXÙåhutw¶.m[ÝÚy¥£}Ù?—ÿŸuøŽ¡Œ±$éd ÉÀ¬OãÏ ®ƒ®äO§vãX>¢ {ç°M¼‹pl*ÎwóçT;Ii%lçµß«ðéÀg9èt¡_ÎvqZkð«½ÛIzäâ×%è½ ßgyuñ_ìŠ6|÷—¢g¦GZ9ç+‘ us^+!õùgÛñ¾­ñ}²9ï6œY ìæ—°¿E‹±å_„þ¹W¯æOêv Õwä*d;ðè5Ô:ð]­8BÚñžCQËù‡òžÏÍdz`g»y/ö¬ðj|wò¾íæ‡þÿßRøïÍÊù£$ÒŒã_| ¨Ëð1?Fa1罤“ìß7ü_{ɰ0Ô^Íþ­„У¤O¹“<+ï#}ô‹à±`h ¶•dPù”<')ÁßRé“Ö‘›9kÈIÉO¾øg|%‚ü…}?LnÆg³8Jnâí4r“Ož”¶’:©”< İ¿÷ûä%•<ÀŽKùuS¸žž$ˆùˆ³'ÈCR ÷Ç3Ö)&óidß¿¾}ÿúþõýëû×ÿO^ÂZâzz* µ\-½Fˆßü® ?–©E!BAÒˆbvÍ"Žº±««/©¿„ýs*³ßLT/2.#䑎aEý‚ý³”ìß/ù endstream endobj 280 0 obj 17150 endobj 281 0 obj 32012 endobj 151 0 obj <> endobj 283 0 obj <> stream xÚ]”ÁŠÛ0E÷þ u10]¤v¤'iÁ0¤”fÑv˜L?À‘匡±ã,ò÷µuÂjHà Y:÷Âóç—Ãê¹îqe¾ê5^úëâj÷£²|·ÿºïÚIå/cqRMÛÕã}:ÆSÛek­ê6LwJÿá|ùp»Lñ¼ïš>ÛnUþ:/^¦ñ¦ÓŸ³ü×XDZíNêñ÷î0óá: â9v“*²²Tulæƒf—ŸÕ9ªü¹þÞ‡Õ¼õßÂÛmˆJ'^ãú:^†*ıêN1ÛóSªí·ù)³ØÕÿ­[ÏkÇ&¼Wã²}½l/ ]—‰ÖP„L"S@­! iÈAò@O…6ƒ*ÈCGè Ъ¡*‘ÆL0Ó˜ f3ÁLc&˜iÌ3™`¦1Ì4f‚™ÆL0Ó˜ fsY‰ŽP…D†v…v í íÎÕ%j Y2X22X22X2¬-Ök‹µÐ‹£áLǙ™Ž3…3g ½8znpÜ Üàî7Ћ£¡G/B/Ž^„^½XzqôbéÅÑ‹¥G/–^<½X2x2X2x2X2x2X2x2X2x2X2x2X2x2X2øMŸûœ,ƒ´ŒùÇp†ë8Îs›¾i2—™l»øñ¹úay+ýþM ’ endstream endobj 284 0 obj 486 endobj 282 0 obj <> /FontDescriptor 285 0 R /W [ 0[600.09765625]16[330.078125 289.063]19[578.125 578.125 578.125 578.125 578.125 578.125 578.125 578.125 578.125 578.125 289.063]35[975.09765625 675.781 553.223 601.074 645.996 487.793 462.891 738.77 673.828 253.906]46[620.1171875 401.855 835.938 758.789 782.227 527.832]53[558.10546875 525.879 451.172]57[639.16015625 977.051]68[564.94140625 564.941 420.898 564.941 500.977 303.223 562.012 540.039 252.93]78[525.87890625 238.77 801.758 540.039 547.852 564.941]85[367.1875 410.156 273.926 535.156 487.793 783.203 548.828 520.02] ] /BaseFont/GFEDCB+FuturaHv >> endobj 285 0 obj <> endobj 286 0 obj <> stream xÚì½ |TÕÕ7¼÷9gÎÜ3÷™Ìä6¹grar¿‘’„@;”á¢\B5bkÕ­¶ÖZkmä á±ˆÖ¶•ÂÅÔŠ¢µñRjå¡ÖZ‹pæýï=“!^Ú¾Ï÷=ß÷þ¾ßçç?{Îì³ÖÚk¯µöZû"¡„ ‘ðaž1¹qvÅeY„ÐXœ-^ÞÒÑF\D‹ï³ñݼ|U÷²ï 7–ãûRü½¬mùêsÂ_Rr3~ÿN[{kÛŸŽïþŒR úœ]µvIËŸÚuž2¼¥Ò¶µg¦ÿú!R1þbIW§wù–®6B¦¾ëZÑÚ²ô\üÊû iÜÈø7ΞUw×Çæáû~B„„è`ök™þüž²duKÛŒ·¼€ïŸ¢{ç¦Öö5/Ǿñ! ^'Äýéê–mÒ ±€Öß»¦eu«~•öA|ÿò¬Y±ºsãû™ê²q1!šUM³üùL|ôG„Üvý(e†/Ì_ÅåQªŸR»¾s}{‹·®Ëz‘ð« °hjn®@¡¯"ј ÑÈ2åAi™jÚjâ ¤z"×SÊ*HÄøÔùuþÔù\›%Ñ’šhI\&‘ËbÌå÷•ÕQŸ~Ü.û ËxÚ#Ü(Ü 7‘•̧óKséÔýúÙS÷f_;u¿yöµóE¤à!\#á”ZJJPn¼ò²à§=T‡é!=Á3ô4-"zâ;¨"Bô>9ÌèÙfƒŠS1àQIµËÉIiE…ÅùNzziÝ”ÖÖ)SZïž²dimÝÒ¥läñÏH ±¶ózÀ"¦9´i&‡#>šˆY´Fó¡‚ÍùOΛ/äìÙB²”¤ÉÔûõi6ŸKª÷ê…EteÙºßȆdcààãŠæEãIh¯Ë¥*©H“«É×NŽª17ا:û£ö˜wÚw:£ü¢_ò«ü²_í×øµ~“ßì·ø­~›ßîwTŠ•ÚrcYT±¹ØRhïjj¤Mƒ®Ñ8Ñ2ÑÖèêR÷Ó>UŸº_ßgî³÷;ÓêÃêãúÌEd-’“‡ÝZoM5“ä$b1“‚|"ÎønGûÖ{ÖuÞKÓ•—/}¦¼F³.]¦9¢æ#š¥¼òñ_”ßÐqSPjè3t-½‰>£4buù°¥,ø/Ÿ‡ª2Äl©DÈk$U–X)Œ«D)¤*#›-™ëFÆÒÍÁ[ÄMÒ (.òQK¢-QLWÞPÞÜL_V TfsEIü så¢5àpê5n½)Þé&NÁ¡WQ¢¬zjMÙ©ÃkY“åüåÃçY;7 «¡ÕB­(6P’C?û«æ¨Ñ¯÷Êi­T©¯£ˆæ ÅöG®£Ä™ël"…&±IjR5ÉMê&s“¥ÉÚdk²79š\=´[èÑöèzô=†cOT—Å˴Ϭœ1‚¿qFÁC!F7o¦„6áÍ&m—s/Ý%ôâx\? 0 ÓAáPä8,õÇ Cæa›g=mºÅNM—½ËÑéÜEÃE;ÅǤêÚ݆¶íöŽÎÁ1‹‡¥!ù¨á¨q8ê°å%ûIÇQg2óQ:¦%'ÉŽÄB‡ÓaDu¢”w9Š*˦-]0©ò‡O>ü0øí—¶Ðÿ^¾ïÉYó[n»ñJÞ>z¿rFùà‰Ð¼À‡Ê0/´1šfv[ÝžX¯Î-‹o¼ÏfvZÒ’±$ÎI-ÉFSd_xŠ˜69Üß7]8u¡ìsÂÈÉÇ'ɇ#CQ?ŠOjŽð¤NOÕUhë´MÚ2@„q@Ph´¡cnÀ0`[zt©z¼fBT•µÊVe/Š®!µ4@§KõêM£¶Q7ÉXU½N¸Eu‹¦ÓÚ·WµO³Óº3nÐzØ‘#'Û“ÉÑin¯»R.T—FåšrÍpk®-מëÈÎwçzrcrc§“©4 ¤€ªV®UWkšÉÚIº€~šqjTSTÀ0,kÀ°Ot¢'¹ž@L ¶.®)®.¾)¾tÐ6¡Sj3´Û¢:Ýmñ°ñ¸ñCމL÷f’˜”–^O¯šmº s!2Û%’_VÎnxẪu·_óÐÞþ»¦Ü5±öá“+gò'œ¡:ªàõniÕÅÆ¬Ÿ~{ËŽ¼¼,1V¹¨\Ök•?p{­Ã\5c®ô$Ž b¢E‡SôİõÛ錉wX£1¡™º¬ñæP¬)cVk>̧ÇÊ'&ÞK¼Ô+¤©½:¯Þkð½Q™ö¤ho¬7ΘêŒ,Ÿ›®x>]ñ8ÂÓÕåðGó%½ÁÑ;dv :»F<Ã1Æt{–ÃëÊŒ®ÔÛ‹õQµæZûdG£sª«Ë¾Á±Ã±3zgܰñˆcØyÂu$š»}( s¯Oµ³Åº¨ÐZB)ךXÒ³leÏíËZo£ÉÊgÏ*§oì¡ t¦²Aëw¼OMôÌwÝÞ¶fë=«ßPÞ )¿ßL£ÓãW~&ë”OX¬®…3ɤ= Ý*'©@$µùÔ©Ãe£K·3þ[Žn‚P)ÊiB)¦‚ô¹<ŠPsE¨q„[+öS!GÊQ5i´Qh7Ò›…âºSÐchZŒó/5_yHyR(º²Z²«ž¿T%),Çù:²8œ‹ùik )'Qô8Lžt­'Æ‘Ÿ›˜"çÍ´Ò"DËB|J.<k¾ðÚ¾ŽŒ&jXD0¹ÁlÙ§ÎŽóÅûã3½~ï¸Är¤U´J¨«¤*U™\%W©«4UÚ*]•¾Ê^å¨rVEW¹«…’Z¬.žï±¥‘{ëevöÔÐkCCùù¡\ÿç¼>"±xœâIKôfz³¼ÙɹiiUÞÉ?M12d¿œ¡ö«34~M†Ö¯ÍÐùu(Î2Ì~s†Åoɰú­6¿-Ãî·g8üŽ §ß™áò»2¢ýÑnHŒ?Öç÷'ø½þÄŒ$RF²?9#ÅŸ’‘êOÍHó§e¤ûÓ32üY~_Uf ò+W„j®öja#:á‹Ê²døü¾´’ÌÒi‡u‡ õšggÆÞqýþþüí»Ëö”ïž°3°kRrjTŽ/»8µ¤J5Ak@ñgŸŸ8ÞWœ]žSPZXU6©pr£ªQnT7ê§Yk=µ1Sã§&MK­Î­­ÜÓíï.Û.íŒÚgÙc°öÛv€ÍžÄ¾¤©OdôûveîÌêËÞ;n·Gþž‚¾Òþ²Ý•»&ôWílŸ´cò ˰uÄ:ìNœÄÌ|˜y ¯ ÓÒ™§q;wºJ Ä(ʶâL¢—Õ—‰ù)%.YJ}ñ©ÏÐ\×ùØ´k®ùa´hP^VÖn¦%÷·üduœÑ•ZôäwEÑöãç”ÇPøÝ©4ÐoÓæGiñ]3Vö<«Ì¸ò™PEÓÕô-Q3sîŸöΟýý•Q>T¾9oú¬;ÿB«'M¼áʳ‡º(ß¹„vžr¯rRÙ¶ôúowtÒ_ÑÛènÁ­´ó\7x‘UÏuudSÀIµ*Ñ:‘íjÕ²J(ÑŠ½ùða–Ðù+.Ÿ:Ï"Íôq$•&‹Ù’ÝrR‰¥¤\d‹ÈM ‘z±AU#ï%Û…=Ò.ÍmŸn˜ Kžq$“ú4•´TS¬ÝMúQçõ‹ýêݳ%=¥‰"à†_·(û[¯\X¦ì t™Ð(Üeí•t®²¢òšÍˆ•,?Õ ñ’ç‰ñ¢'Êàq9U‡,F› YŠ'ZC$kŒQ’œ‰ˆšù‡ÙiaÙ(FsAáEVàÖJm™®JWn©²”yª<1¥±U±Ó´uº&]½§ÉÓÓ[×mÙC÷¨¶iv³üÛø„iÀ´Ãü¸¥Ï¶Ç3àÙÓûxÂ@°mÈ>äŒ9ë«ô”'LÒN÷ÔÆb×Û7¹û„=ê}¦–]ö'ÜÛÐ}W\_Â}Ä}Äã->¡¢Fm`Ùaå¿7¼Ú·tOŸ~Ë-µë¶˜Í]7Óåuåmå:™Z©xÇú{†é–­Vf¬Î_7CytÑ•cï|(k†^¾u›ÓørhÏ€íïô!†¹Éë·Ûè4˜µÄ)š½Z§Wthã=6É@d"T~d—'ƒÊ"uèè†ÎhÝâáîîÁv÷My¦JW©§õRµ~²±.úa£´QÓ¡ÃâÕiÚdért¹6Gï {é^y@Þ§îÓ쌦‡õƒ¦!×Éè‘hoI2ä“|Ã4FDÓhh4ÖF7ºÛ¥Í-¦k§}}ôvÒËxåhˆ$ÃtØ1슅s¦ÂÃçtY˜§¾ÕS\"õMø¨EÙ¡¬¡?¥szžÑôÜâ×”à‡/m>4cö¸)ô)ÚNÓs‹•'k§*úÓåÏ3ç²ý?ØØ…°µPéD9Unƒ,š ‘´’`´òú o° e,nÕ ¦&Ó4ó&ºIs³…Ùù±_e¨jõ †:óÍB‡ºM·QßmÞ%ì÷ªvÉ»ÕQÜ>÷lgŠÏ=|z¦¡á­Ðr¥QÙ¨ …ôúŒ(ý…ê/¨ö/Ê÷”U²Fé`ó ·ð %`Õ¸eÉ-8un¢UIjÙ?›Øüóù!)OÏe FqËåK¢¬äÐWØ/*)Wz¸Ýܺ@WK²&âÖÈnɉå]PQÇ­%Ÿç Ж"­,E2ÉŠ»«Ô7(ã•W„•ñtPøÎ•õ!ú£6©:›Œ¥®€×h&6Ytb`“nwLÈ,ã F·ä!6IŽ %=á’ó!?¶†ªÊq^„#¯à½†T»×éu¡pq{=Þo¬ÑK…T}Z´7rJûå¥ë˦ÇM;Çè†e¡0E…õšÇãd·ô˜ªÏÐkØiÜaÚæ6F3ò~Üe/¥U´L_f¨t5Ò±^5 IqCT7½Eh—Ö«Öiº,]Ö{·kSô6øAŸªO·Íˆ…Ï1àˆÒ ŽD šYSÂ¥cؤ%—š™´6ihVu\éV†”ç•ëè6Zõ­ºö\ÅÁžÏ{ñ®'ýÊ…çEIù‰2ååÛÑþö,¾Nùàý÷•î¹…·én3þ€Epkt²SBȈZT/Oñé­¸\Áç—ïDh´Ò¢±æ#} ¼rå<Û;ìxó)¾r¯ÐŠ;k€‡HÌ'V¶ÿ}žÙ!·Aú»u.ʶŽÜ°êÔ‚¨Q9E¢´²€ÒLÏŠ×üоjÅù|–-ËÃluŽ&…YÊÎRÝDRKÔÓ5uÚÝ&Ú%lPwëv‘ÝXòv`©Ù¥=LŽÒ!aP}Ró‚.!‹&©SqY=©S7hj´ê.Ýã¤îú4{uÇÉŽéXy࣡#¯U¹•ï_¹ÌÇKèuWÞÓ/¿Ož»2ŒŽCLæûÂÅsD"¢«Ìäg?Ÿ{aN%p3´}ÕpH½bò•ù4‡n–5Ÿ œ®™¹t ä³€[§D½Æ)‹Ä ×i5X¬Eê‰Ú6¡Å:¬¤…I$Mð‰™R¦*QÎQg`ÉÎÔ#ÆÒB±P*P•ÈÅê\M‘6WW¢g¡{ŠP£ž¢õ¤‘L!Sôá¢t\àÅrQ(SèruuÂ4U­v²®Vo»ZF„6ú|$F£[YS…]?Ù-ì’v«úÕ;5Ûu½ºýT¡I˜&ÖJÓUur“\§nROååc7ÙD×Ë]êMš ú.C¿°[êSõk¶i÷êû ƒú¾[+Òd*&ÚQF˽Êé{•#û•#÷*§_¥ë¨@]t¡´ú³ï³·¬¹<_ܱ­‡xk ˜Õ·,5‰,ˆ’nŒ©ŸÏgsù8ê˜ ûèa—ܯ!Çé çyù¸zD=¢ÑZ2¿P.©»….u¿Ð¯>N ÃjýUc¨RÞ¸’§¼AÓ…š.Y?ÃròÙÇ(eFï¹Èîp XD¯Cë Ýs‘ ²ôÅ{.Wá¯Ú¬ÿåÍÂ&i½¦]·ÎØmí±õ¸úiŸÐ'î’WõÉ;Õ½ê]H]vêúõ»¢v™wÙ]¡Ò?Rø›ªÌU–Ð[•cí{¤Mª¹[Ý£éÑnÒwGõ˜6šo±ô0ÒöÇv²‹ö‚A/¶ò^õ^M¯ö1Lì}¯¡×¸-ª×´Ó¼Û²Ó¶ÓÞëØáÜåêuˆ#ÒˆjD)oÄ4b±ŒXGl#öGí—oÍ$F²å³ÿ8rôÿ8zä´T™ªü ÇT,Ø“q<%JoÓXå½·ßVÞ£±o+»”Bz‚.ÀqB)dúeñMæë·Üp¨<ÑcvFÉ¢…/àFI0ÙCS?º„‡²ù>š§.×ëºéf]·­Ÿ P „ `šÔkøV¬n@?`}Â6BF舖nDÏå-S—éØPeèÔo¶îöª‘°ØôcS½T;Iä;²^I¹ycAÁ–Z¢üF¹’…Ð2ŸZh’”·¦C©¸iãëJðÊnYó72:¦[ø˜ä¡€[åÐ#ïu´:+ò†eÕK‚ÖèäÁ2<°PÈÄØ*ç'iSuEr¹¶\W¡o/sT9&iYªÒ©íÖñÝfu¿æ1íN[¿Ã‘¥õ¡Ž U’>{Ž#_.ÕWéËì7k»ÍÛ„^U¯Ü§îÕôk1í¶}ömŽ£ö»gì i" ‘¥±ÂÅÛ类þÖ7éÊ•0Ê^ª¢¦ß“ªÖ´*×·^Ξ¿R%k~ÿÛ'_7qŸMž/Á?Ò¨>æŽs¦˜=jY'ƹ=HmԢß®¶™S¼·Q’‰WpÛÒùgho¤Ì¹›r8œË²wnÀžiII|ªLS¦9Ó’””–¢s#,ûV:ްo};Ãä7e&e%g¦˜ó<…1¹1ë…n©]½Þ¼Áµ>i}J[ÊvÕò6D·æ~Ëãž})}©Ç„aiÈrÔ1w,~$>1Ô–’šV¦ªP[*Ü¡:£0ešzº™Üå¸ÕÓ²[Þ‰¤¶ßý¸§?±?iwjÖ*yØ2h=j?={2!yôvȘíäôðÆ”3”  :u9]ñT¼¤\þ¤ÿRés -ºþ†oô|ªÞºó¥šŸÇÝ^;ãº73œ‡¶Ñ=¸°yí«3ZçÏiظ°õ7÷o]zlüôY•›»†›N±9°c-»ö¦&µ“DܲKÒ?*J3Û{â^“?BÙ“†kiXƒÚ â'é*¯JŠd†âÊ”W”?ˆ’ò™Úú$”×£>¾/»%¥‰“ò2é¦z´ Eˆ†û$³íÙt)[•%ûår2N@PƒŠå:Ò@' µb4Uî"›Äni£ª!«q·*.‘dIRÄ)AÞP(櫪I† ªn²óE•Á·iµTåStÊÏmFf5ÿøAüió¨¼ê7ùšüã€[¯E­Lœåk²:¼&ËÆH}>Ÿ¯É«’I2Í2U~UŽœ¦ÎÔdÁ)Óõ™†rRNÇ …R±ªër™¶ÜP±L¦ŠõR£jº·-t’'RqÁÛÂänãäž¶:….7ýÂ%M,bÛ6B¿Ûë*JIÏu×Ýróõ×ßJ”³Ùw/Q”‘ëïM¤ ôâ†íÛ6n|l›²¥£~*ÍþðCš3­¶ƒéeß§˜ëee Æå­6­èñh=Xų=™6^N«L¸bòóCiï˜Ò:7›©/5D‡oó±Űï|³b`oì`Œ9):?z_T/ƺ=f8Jý…êT»Àbƒy»-b+ÙØXh2€r–&ðáÐO7<ö؆۷oüPùíôÚùáËgë¦*¯B_˜_8Nq“ׯî x´NаLþì lLtW«¢r£sÝ7ÓBÐnºÅµ—žŽHG5ƒºA½9Ý€úÍè5‘«©I‘¡8œ–;ÆÜkˆçpáµ—Æ„ˆ¯,Å¿tgb_¢¥ŠŒ½e•o©°VEŒðÚ)Ö€ué–{xöŠN¿ÙÐnYgí´õD³Ôí 8Z¯y¯u·½ßÕçé‹e©ý1á˜8"—FÔ‡ ‡Œ‡¢™žG9ÈrØZⳄíQ_e€ ;«\¡»c=ªN¹G¿Îp‹µ'a·~¯¥ßº×Öïìwõ»Q) K/šGâ#›ÆjR D¾h—¸ÆÜNÚVO›¶Æ*¤â•éŽMÓ'¯ŽùcÅ;?~[ù+õŒœ¦faÆ’öΖù©)¦ÅªÇwlè¡é¿C •ßòÉ £\-@ñ³@L”ÞaÒÈV^"‰N9KŸ*D•ƒ¢žg÷I úá 4Ypf™an #S·OÛ§ë·K½¨³v ‹ïåY|/²øP´í…™õ:L¡ÉñUð<éwG6UÌáIüª*Åð8¡m¤ÍÕOú\S Ë€“‹ ,ünŒËrMK°úiåžž£ÇG›bœ’§Eá²" çiÎɲ|Y–f-RþÄýñÊéðÚ”A>D–h°zâ´ié¢'Yë‰sz¬¦èäÌ8Gz–ÏF­inîš^_Ø5CÅÕ{ìÁ(þ˜ÂBÚWúæ—À±¦ ‰©y¶¼T©P˜f™f­N•Æø¢û"ëöÅê½Qýæm¶~×¾øíIÇ¢†ÍÇíÇ\ÃñƒI†®Ôϯt;Œ}–ÞØÞ¸Þøí ½Þ퉽I½É½)ƒÆãǽØ,'F©¤ÿ|eûs|¨\¢)í×®]øÕ¾Ý¨\ºp¸¿xâº;Ÿ»ØQ¶*~„¸g#‹N£Y#؈*Ñœ©ÏÖ². ¢ —R<˹|~Ôº²Ó¬Å–6ǘYTXÝÌ–ë€- ¹JT±¥Of7hQóÚÙ™etMs:Ä”wkgÝÈÖ2ßOnê}X˜Ñ¾ü‘»¯\Æv¦¾ñÐ ìà:8ÃÔ "1‘Ü€^m²ˆÄž˜4óCþª›WòªM‰¾l˜ÖY³hièI»±·¿¯¼Cã]-55-ì-^ ?µZ¸Ï±}áèBG–l|Ÿ*K•Þ¨"_ܨ:Ïò½ ߢ*ÖhÈT:MS£í ]B§ú(ϰúˆÎœIý4UãÕ#«×ÜL˜#//jŒŸß~’r”^å¦ :ÎUv ö+çå‡?ûýµ21$½²‰$ñ ÍÄì· ^Õ:U¯JìEÝ.„tHï`¤pAèZY_J"Ç)½Fˆ3ÖžD¢T‰ îL{–UKbuL7fÛa!¶d>ã—ùÃk¡ §Ëü9(̽…Ú\èmp69Åä˜oaL}p"~ÕƆ¶Š Ä$ x’RlJæ.‡Œ9rkz§¼;îy×pôQÏј±'ã4é)Þ”’”Ü”¦”'b]'<#øáXì±8ß/ºjQWMËÁMË20Y£¼WR;íZå]ŽPHÖÖe­wÄgïYòðw„·,üÑÖ+—G?Å ëëçÎmZôìñQ¿€Îl¤'àÒĨ;FÖ?u ® Ü@c¦Ú•fõÙŠ, Æ&ãº1>Ò/_õ‘cêçMÃæ£–”îL9U•m+4ôÊCªÆ!¾íü‚ÅðEÏq|¥çüø§£žƒAÔ7Ž#‘ü¾2|ý¯‹èqð 63š?6ô¥gm>êCÙâSûÌÙ–k¶Íg×F¶ÿUôÿÞ6éqÍ^]¿±?ªÏ¼Ë²ÇÖgßé6‹2±;žw¾è²Œy¤TÓ¤­b7R®¦{{È^Ú+n—¶«vÊ;ÔÛ%÷éöêûŒ{±Ví3ïµõ:ö:û\îÏï6 F±GEFÌ/YF¬/ÙFÀlÄqÒ9â,ù'Ïñ‡bî\²üöo,»©‡&)§Ï¾£œ¢™ï¥>úéÆÞŸl¾åÑGzÞSŽÓÂ÷ÏQ¿r’ëqÙ•óÒâp´"k5i]Žp9€bÀåÈŠƒA|¡ 0Ÿ[*Æ—êÿI9°å€)UbA-J‚QD À*Nºm1+®ßBã¿XtmcåÀŽ ¼¸Ò- ¼Û´„qXÈì@41t’ZC%/5eê²àþz5!Z+r–1óÅ3ò$™×ä5{-SŒêþd†Äž7š¨ç‹áe>b§¢Tã÷tµ3é2¶ÜêÈåt”ñÇ)â…Wî\¥ í«Ç!ÏŒ‚\©ä•@ŠÕiJMµ±6â´™D’ä0e¦i‰Û`‹…‚SÜÄjH‹ìy¶ö„yè¥Ñ'/˜Æ >#M"9Ö[¦WúʧÒ¸§áÛñÌ|R ­´UÆN"MÒdí4ë4Û´ÄMqýš}–½°écä8¶ %K9™ê¨ŽŸœ0ÙÛm¹ÙÚK¶kú,û¬Ûl{cúãŽÐ¡¨£¶ÛK)/¥²Öö¹ â±:l?ÇÁ×§ôA÷ÊŠš¹7ܳñ姯°ð[¾†Üñ“fßðï¼ö«Îgs©œZ”ŸéŸ”ZôÝ ÷î_¶Í—èO-ªMÌê½ñ=M5¡ý!OUm˜‘&jtr–@´”¨Ô¢!üP+[,+0»¹Oiø.E8 Òs|ñŒ~ã9¤:$èGŒòÕ´Ž=kšwrvÝ:špÏh W£ü"4Ÿ7`>ß/ÀÎî ØMZ™¨ (8Íê,«‰­1²5xò? ídæbûi¯´K5fCéê€M¿‡ö«Âÿ/V.¢Çè¢ñ¸°OÚ§ï7ŽK/Ž5ëlÑ~áqU¯qOÔc¶AzL5¤;®?f4ðM6¦m7M´„ž:Feôþëúøeš0cvÓ,O_üìƒw¨ d]9¸¬eY‹ÐÞ ?Æxdä&•H²Â{Wj¶yuê°åêîUµ¤‰é’—?·SFŠÅ"©DUOjÅ ¤‹n6Š¥]¤îv‹»¤=ò09*HÇäØU‘ªCÕO_T©Fw¨b¨ø±r¿ò®r­|þxá²U¼p¥GØ2º?%O‡LòiÀÞŸÊúüþ”‘mPŠ7ºCU›J¼$KHS%ߣÊÑúµÉº,C Ý:¨DV¡©ÐViIèŠCNW§k½Ú½WŸj(ÒèsõÆÑûCìÖ¯ŒìQøùñR±J,Ó”éê…:±Iœ¬è7Ò.U—f½~H>¬Ò›½QERžv¼®žÔõb­Ü¨­5t‘ ÐP—´YµQÞ¨Þ¨Ù¤íÔmÐ÷뎑£ô¨0=’†ä!õQÍqÃHTbèiK}HOøOž®üXyoϨëaZypÛs©Lh¾Òµu [Ù›ÛgðSö8t§§é—^£$­œ%ÞÒÉH/eÉ`>|*ü8SÞ®;¯O¸ú/X24>­OŸOt8)¤#ë$ª1Zù’+­GK„m‰~Ù©?N^P‘Õƒº#zC’˜„Y(!eB©¦êi­X£nÐn'fÖòãêM¿ö¡'  VÒž”NªFTÇåù„zD}‚ݥОÐèNêGôáÇûyIgàÓc`…ÉÝIöýªòcš~ý2ŒŠö˜jP£ßƒìqÖßX÷hûõ'¤AÈxRʵô|“1†%ª«•½ñªÒKïVî§-C¿ ‹•{h‰2,ÈôO쎘Íb@ÖLt¬&ß Xd >ãÒ¨e•HU‘4ìiÜð£äÌm®'æH>9SíW—’Z$KÅr©¦µ0©V5U½IÕOvÂmöIýª~¹_ÍL!†ÙrMåõxZ,äËu„m÷ÖJëäíd7ÝÁR Ùr(_ò]9©¼ðŠò :áåñÂ?!G|õÊFá.r0t§•d{Íû…Ôú¥û×Ì÷]˜“ý…¯^³Ú»ŸÌØoìö> Θ/ŨìWÅîS5û¥Ôä³ÿìdz9ÙSgÌ÷îŸZS¦Z³¸çfÍG“}Ãiœ¯©Î!Ï·‚õŠX7Å®ªSÄ)v±Vkqò¤[T“qÒ-âÄÀVÕDEœxH T-P¶ŠÛ¤ª iªªbU@š&V*bÅ/Äñ¿Ë/‰¥%ÙªRE,É‹±¨pŠªèbá1OsÑÿ qÜ-bŽ"f_³.‰™¾­ªL|’|‹T¾­¢ï6)#=M•±HÌHéibÚD15e«*õ’˜zHJI^¤JÙ*¦ÜÆn]¨’‰É))MLtOT%n½øðnð‘°UŒÛªŠ¿$Æ’âb©â¶Šq·I±1iªØEbl@ŠI=èçÙ*º'ŠÑ®­ªÀ²èK¢k«è¼$:ìUŽK¢}¢hSD«"ZÑl²«ÌŠh²‹FCŸÊ¨ˆ†>Q‹¨SD­&[¥ÉÕ7‰²"ªQšUÒƒ¢H&ªÄK¢€¡Y¤ø —pN$ÏÐ¥wÜC³þÙ‹dý?ðŠ ý»Ä¤s4.,fÚ(D —Å[¥ÙÒU…\*VKWM»æ%í2ÑÍÕݮۯoÓoÓ?£Æk¨3üјk|;ªÇ!Óí¦gMÏš­æo~ù°˜-VõÛLÛoíß²¿æ0àhvltZ®h×Í8ŽFß½ßí¾ÁC¾>¾>þÏDå"9I¾â%Ä`ùÐK$Q!gUötŒ•YZ132s+±¡fp'q¡w‰AuGâIÕDDŸd’‚Š,¤“ â#™$‹d“2ŽøI.É#(•H!)"Ť„”’2RNÆ“ RI&*$É$2™T“RK¦:RX6•4’id:i"3È5d&™Ef“9d.™G擤™\K’Eä:r=YLZÈ d YJZQ³.'+ÈJr#¹‰¬"«É²–´‘u¤tN²rÙHºÉ&²™ÜLn!·’rÙBn'ß ß$wo‘;É]änòmò²•ÜCî%ß%÷‘ûÉ÷È÷ÉääAòCòùy˜ü˜šI³h6Í!ï‘Ïè8ö¹4æÓZH‹h1-!ÒRZFËÉéxZA+é¢Ð*Jh€N¤”ü™N¢“i5­¡µt ­#ÿ õ´N¥tN›è ò.½†Î¤³èl:‡Î%è<:Ÿ. ÍôZò>¹L"m¾Ž^OÓz]B—ÒVrž.£Ëé rŽ®¤7Ò›è*ºš®¡ki]GÛií¤ëiÝ@7Ònº‰n¦7Ó[è­´‡ÞF·ÐÛé7è7ÉOéô[ôNz½›~›~‡n¥÷Ð{éwÉé}ô~ú=òcú}úý}þ>DD¦?¦ÐŸÐGéOi/}Œn£Û麓öÑ]t7í§{è^º>NŸ t?ýú$ý=@Ÿ¢éÓôúsú,ýý%ý}Žþš¢ÏÓè‹ô0¤Cô=J‡é1zœž 'éKt„þ†¾LK_¡§è«ô5zš¾Nß ¿£oÒßÓ?зèú6=Kß¡ïÒ÷èûôôýý€þ™~HÏÓÿ¤è_èGô¯ôcú7ú ý;½Hÿ‹~JÿA/ÑÏèez…*4÷G +ˆ‚$¨YP A+è½`ŒB”`Ì‚E° 6Á.8§àB~á–¦ÏilÔ,[¹¼£­eI«¶sÅÊ5¼¥ný\ú¥cYçŠî¶­k m­í+×.]Òº¦³µ]¿díêÕ--KØ7õĵË×®i½I=quË’öµkä‰7´·vµê'/YÙ¾dýêe«Z7J“—®í”«—´°Ÿ«;Vµt¬Pׄ®’køYuMøâ~±Tƒ ôS®RÐLYÒºtåªU-ÒöKÝÕ_äúΕ«–¶ªëÃê9u}ˆ¼fêèuL„Æ-KÖw¶jÿÉÓùwy:ÿU3=|ZÝ&ÙÄIj›–Þ°*Ôqfø#Ôæ(™Yü´~Öáf‡ºÌí2'$ìœ0å9œ²jNûÊ5˵sFé«ç„„×Ï»JI;oéÊÖöÖŽ•ò‚åí-Ðï‚1lšùuR3ƨn Ón )¢%LkɘéXÂt±4¤‹Öþ[ÃWµ†ôßÊ(µ†u¸<,½~ùËÙ<¬¸zB½2Üû¦Q¯b\V…¸„¦Y5ª‡5! ® ©gͨÆ×†¥XÒøÚˆÆÛáþí£d:BÎP—ÎÑ.ëC_¦¼>¤ñõ\ãë#_ÖÒ†1ßÑxwHãÝcØl i|ãÊ‹•a+C*\R\˜«š¸ªmE‹4©µ³E5¥.£ªn]ÕÙ¢®iëX¹jí©?ˆ5øqö ´¤úµhNmikk‰®¾ai‹0m½0}½0%lq%#.ÌX)Î\±V5kåòÕ-âì–õê9!RâŒ+ÅÉxÏèX©já\o`\—s®K9×Ö0×MŒ+û±“s]ɸÞĹ® q]³^ظ“ÁYŠíà×ÁøÉóÄN°]fÛ–KðÆWÕÚÕ­Ë[TsòóóŠ´-kÖv¶®j]‰ï¹%­ªÎµkÖvG5Ê¿é¸rxÓVÿ¢BxCËôú=<üЗ9c:ëšSÞ4…Ï2ѵ\¥ß:–~ë(ý•úkÇÒ_?–þÚ}ë>JÜP?æ‹iýç9[гõscµ¡Gˆ˲•+órsóJ"­ÒH«l´•ŸiåEZù‘VA¤UiEZÅ‘V„G~„G~„GA„GA„GA„GA„GA„GA„GA„GA„GA„GA„Ga„Ga„Ga„Ga„Ga„Ga„Ga„Ga„Ga„Ga„GQ„JQ䊢•¢ˆÅ‘VѨ,yW¹ExEx]å’¯8¯ ("}qäÚâßâ•â•â•’ˆ%m”Dè•DÆQÑFI„GI„GI„GI„GI„Gi„Gi„Gi„Gi„Gi„Gi„Gi„Gi„Gi„Gi„GY„GY„GY„GY„GY„GY„GY„GÙ(‘Va¤u•Jiä\D–²QYò"Üòr‹"­âHë*ˆ|‘D;2GW%ˆŒ²8Ò//Wµ¤³¢3/_ŠDF…8_\ıXªYß¾V½~ÍÊÜ܉¹¹y2ÍAÖ]"=AVH#ÓžSÆg‘P$=¡ª#H‡ÄʸDYƒìÌG¢ÈšÐºÀGÞ—T/ŒøöêŒs¨‡²LÜÏ®W=ü_ý­]ÊýWNk«4 ñUæýÃÕæRJéÒû²ÿÛNÃR‹Ý¾Ôn·ð¾NËRçW÷ÃËngÝ8âõ¯Ø~žïÿ† _–—oÜÒÿñ— „·ø€!)†b#°“ÍbwZj·ÛíÿN`ÃhÓþ¿«õÿ¶6¾šjH´/ü@¹]i^9Mˆöaå~å{Úª«–su·‚ˆ¡·¼4ük,¾±‹ÿHdÊeð¢&þÿönù?ƒ~ÿßígžÿÁý B~û¹=?~aOC’nEŸÛp°?vv+>ï%ÒTšGKhmEíþ=áˆ0,üA¼Uü¶¸U¼O|Lì÷‹Ï‹/IÉ!ù¥"©IZ(]/ÝGüß¼¢WíÕz^7Þ›äMóæz˽ÕÞíÞ}‰ÎĤĴ$!IN2%Y“Iž¤ø¤¬¤º¤ÅI­©Ç>’>‚AnS\ÒK3h1-£t$‚¯C‚oB‚{ÅûÅíâñ?Ä$*EIN)W*–®‘®“î‹ÿfüÇ^K`ó²?¦ãå”}…HàŽH°”K@ƒÁà»ôG˜™£c}!ˆ@¬˜ñNÄÛCÈ•7¯üøJè×+»ð>pµ÷Ûo¿½óí×#ßîxûA¼7¾=éìê·Oœ¹ñL÷[¾µí­ïræ.BÞê|kÝ[׿å+÷w1ÿ§ê×c¼p#½>@¤àmD0‡ßÑx'qÿ ÙBµÐŒÏex¯¾)|K¸KøvØ¿%|[¸Wøù'/áÖÐûKç=°GfÏ¿‚ÅžƒUß {þ ìry¶ýGXû÷±FýþCØû‹°£ÿÄlí!&’ó°æÇaƒG`½Ì¯îƒg‡o…UŽ„­ò<í·Ü2àqÀC^åö¹‚ú¨ þs#|ð&øß*x`/|p¼ùàzx!»] /Ü?Ü ¼ñüYízïøõ“Oh.ù˜æ‘¿Ó|r‘Oiù/ZHþA‹Ég´„(´œéx¬¸ä2­$W`g”VQ‘¨D'RN *: ëÿ ª¦+©†ÞHut2ՒרžVÓ(:…šàFZK ´†ši=µÐjƒµZéTdÓ¨ƒN§NÚÄ|˜FÓk¨‡Î¢n:“ÆÐÙ4–Ρñt£s©—.  È6i3M¢×"YHSè"xàu4^œd1Í¢KÉ/h6¼q]Ž·‡ö¹]/A+˜IˆdAÞ¿ÒVdF:ú;A ßm¡™t ‹^‚“Ç®Ã<Š "^¾€Hù#ò'ò¢Þ×Ñçëèóuôù:úüŸ‰>¡§âˆûB¥k`Ü:X»šØ•³ÈdS¿jINð]`Ið8°,ø2°<ø&°"جä}ê‘¿j‘sæç!oÕ"ÏŒ6ödª=¸ è@&¬GœŒF®«'žàGü¹Uû "¼gÇ2ŽåÈõ Ã®jFά‡üÕȬMÈn àºhréIÀx\g"¶àÇ@»ò Ð…Ã.û±Á ÀÁ³À§‚ç€Oÿ*ö è>tñÑx‚ߦv>y·™cÔfhà—À2ŽåÁ“ÀñÁA`Eð`eðàµÁç€ ƒŸ…|¶ài “ÇBœAöÜa4$´ðñZ@ù#àààSÓ©úP/€«÷lí 2Ûpí'@Op0òÛ0ê` $µ a º!IÐînP{hWNÁÎàŒ¬Å :ì¼'¸9Ý ó00U ³‰™M+Ð\´%  }<):‚Á»®`0Ô< ¼ýÛGÐG…¼ «ö`·À{ ¨c8…P:11¸öé*†ÏjSè<–ë'’\´€K,W,·ÉXPxè„Nà½Áï£1ƒ± ³ èÁÅB†“ÀXȃj\â`­Õ@6ãq˜I3Ðz7ýŸÅÈ`ÅJÚáxG ÷àøk§c É ó9r,†G¤À7ï–‚c <ôa`9$Io®Ná}êa?)¤–B¦qœÉÏÏæ8ŸãX] i渣KAœ\ŒO!wó>ý°ùøìÀ§‚Ÿ†¥BWŸ-°™T’ §"ÆYÙ„==žŽ©ÜßS!í+À2ÐI…œ§°¥TÝRQó«B†4DÐñ@t”Æbб”c¨¥¡¿8\ÒPó3lâ¸V—©žZaÒ!ÕsüO èðÎU§Cžw%˜÷tÈÃ~-‡äéˆlÏ+0®thé"Å´ È4A“ y˜20/Ÿó9r,ÆŒg€ò`¿¶æs,†œ>ÐÿX ?ò‘:hÞ‡ù}Ø[õArÖžÃÛsùUóxÿùµ¼ÎCªLŒ+h÷Lp<LáXŒyÏ—'L?™\?™ÿ»ÀJDƒL>k™|Ö21 ¬ÝÄñŽs8·Î31Ò€ 9ÍEÐax}Ìw{ÌÀjôÉÖf}²af`(gcb€ü ÓP6hD³ø™lxJ6æô®: dþžÏ=%ÚxXÎ{ŽçW±H’Oj0ãùÈÙUSy{:Ç&Ž38^ÃqÇ9çqœÏ¯ºæó±`¾NMÁfÓˆŸPÆÃ– çÀ4ØvI‡æ HïŸÉÏdñv6oûy;þ^€™}XÀÏq,æ}J8ÇR~¦Q¢ãêV`¾ 0×§p¬ãXû/ÀŒ3šMˆ˜÷ïçB3˜ñãÀkaÛ…ð‘dà|è³íæ“ _„±|LÁ¯EÅy`&Ç|ŽlÕ+‚TïKÁ«:–ók+0 Eê°c/‚T€üÚ™üÌ|~-ÓdfùYàSœ×Ó°öbH’d‘¨˜[K1ôù*0 ý‹!É»À|Ž…™–Šy$)†<Ë0Æb-‹¹–Šyì-†…¿\¯)Á žš°†–ðP^߯a­/Á<¦ÀCKÀ÷I`&ÇlÌQ ¸³v1쳇ï2Øy ¢à –¯C}ÀZŽuˆÕ%d*çØ™K0/¬=“sŸ|8«d 4Ó \À%i渞^‚(Áøö;€?ãxó[ßdÔž†$¥Ë+@–Ù”b,/Sà¥<(å«)Ï@JyRÊW½RXÂiHÏ"aÏ|PÇ ÷+ƒNžZƒ•A'#Àxh¦ 4²ˆT0ÌçXȱ¾_ Ä W=<¬CFTË6Â÷Ë0vv~ôSÆG]†‘¾\ ©Ê0Òµ@6Ò2Ø£ö4b{9ä¼4ÀBÊ!ç@3¤*‡œëX,†VË!ç»Àp,ç™[9äd˜Ï±¶Z9í@&a9$<¬Ãœ–cŽ>6r M¼=sW9 œ‹U Ò>\ )‡´û‘å–CZ†Oa5/‡´.dOfðÏk–ñð¦–OÁöÆC†Ùð…ñ<ž‡öVC?ã!Éq`#ìy<¸ÿ¸¬ch 63 ƒUTðܺ†U`ÔS · paý39fc,àÂÚÅÐvÆn²•«Wk ó ÄÖ®ãx›ÉP=°_gò3³‚ÝÀÙ¼=ŸãNy1çÒdw‡~†Ú­öù*ð)x}ìó,VGø¢Æ…½Uò ´R–ò3Õ°ŠJ+*yU Žïçó_›1;•ÐãdÆø10‡c¼o·ˆj^ UóJºš9,ÁLU#ôË¡ájDƒuÀ:Þ8Vƒ2C–ûU#/bWà˜ÕUs««å÷ø` h> d1¶Λ92{¨Á¨ÏŸ‚l5õ9ä.&Œ´–{e-FífÀBj±’$Kàeµj p*ïÓ޵X›X»‰ãŽsŸk±±«æs: !C-¤E”´UȘ¦ð±Oácœ Ï›9²¼®}ÎðõÕ´À#êx¥P‡UÚ dN¤Ú,ÃjR½= ¬.c÷÷À±4fŽ×"2Ôñ±×óÕ¤žWõàrh†<õàòK`\êyfRY¾¬‡fêyDªç©3~8ÒÕ“i=iæ¸_»˜÷9ÀâÆ[ |í^4€Ëy ËøøxžÓÀóÞ>ö\ë>š ¸Ö³k§rÊ56ã: \ˆq5ò]‚Fn'ÜN1^†‹Ð§Ô À§@§Ôtd?3Ÿ™ÆÏLýwfä“Ó¹ýL‡7[ÕÐØt¬ §p¬Ã\L‡ß±öLÄé°üàŒe:ô`†5°ùmâÒ6ñ ¶ ²]6s\ˆ™ÁG4ƒ÷™ÁG4}Λ9²qÍ€„:ä:¬ç5 ë²þ×`ÞwÙU×ð«®áW]ïšÉ-g&ßm˜‰þ¯™/Ìä9ÀLXËýÀrDË™°–õv&b&ûu¼x&¨1¼Qq&h@†™ð” ȺLðúY <,ÏÎâö6‹{Ù,îe³¸½Íâö6‡¯¨p°²ÏákÖèù ¶ Ÿ=ÌákÁDŒƒ@V§ÏæÏk Ûèÿ p ?S‡™›r`‡s°°>œæ4ŽÓù™&Ž38^Ãq&ìdb#kÏæ=çðö<øìÌ#k/€ŸÍÁ<2¼þ;VÍ~=σi>ö\ž}Í…´Û€e¨æB«»Á¥ÀZŒz.¯‹ç‚ù™†çBKoBÃsa¥g€Oa6ç±=T  ¿Îã^?1%Èž˜Ç3ºyœò÷ÇÓ dYÙP¸Èr¿˜µ3@6G 0;¬ÍÖèð4i{ôÀÎÌãtæóž ¡ç„eÉ À¥ ø4«s8—fÎ¥™si†6 @Æ«™ój†U0d›¹Nš¹=4s{hæöÐÌí¡™ÛC3·„fÈîšÃÛLžfHrØŒØØÌåiæò4syš¹<×B’€,J\ yNY|¸–LJkyd¸ÜÏAÿZpaçgsœÏ]¾4£ÐÒBÚ… yÐ =/Í;l_h!÷‚… ÿ°£[./§ð3u ¿Gæ…Ð3;ÓÈÏ4ñž38^Ãq&¿joÏá8^°Gï…\£ 1ÒàSïBŒÔGñ¶R²Ü~ú™¬š^Ä5¿2œ΄--â#º’Ÿæ`v®ƒüoËÀñ:øÅ9`ü÷bG¸›¯kws_¸›GŒ»á¯Ùºü ï³‡ï® ×Fn¹tÖ˃ßV {9 ×YÞ{=·–F±Ýäç «mÀ)ëà• ¥'3àq †3ù¯³x{6ÿuoÏ…åàõ×¾ït€gààÏb\ í Æl‚$Oñ]ôƒhß´gSP„ä«áY!ÏCÀ)ë`Ï!Ïnà äŠ!Ùü×Y¼=›ÿ:‡·ç"ß>yž²5ý _ÓBž'€ 1¿ù}„ƒä ¤z’ä-A;ðiDÔAä3qÀTjƒ|í@v¼tú¼Èr†AxÊàH;ú½‚³°™Ýõb°nªáÿPÐ&B†p¾±û Ñ4-r?tzè>G-¾…Ú®˜n‹ˆ¥×…Ûút‡Û*Mn·e¢!‡ÛjÄ®mᶆxÉ™p›ÝO †Û¢¦špÛJ´ÔÄž¾’ØŸæx„F‡Û”Xép[ Qt(ÜI1=nKÄ*èÂmÉbÃm™˜…Æp[M6 Ãm ¯…Ûfbá¶…D‰á¶ç‹3–ø¼“×¶u·¯\¾¢Ó›WVV–“Ÿ›[ä´²³£³½µeµJ˪–¶–åk;¼Õ­+—¯ñNi_»¾mœwâªU^~U‡·½µ£µ½«ué¸Èÿ3tfëòõ«ZÚG¿·¶tug{§´®]ÝÚÙ¾r‰7?//Òuõ²åmK:;sº Çzgµ¶y r½¡8Ô¡®ëêÿ‡te‡·ÅÛÙÞ²´uuKûMÞµËþ½”ÿ®Ã?¸ öD/™ÌŸ!ë&íd%º¬çò`qìÈAž‹£ç&á÷NþœY;i%-d5¢È|®Â» ïå Ó~ÕøµƒÓZƒoSÐ{-Yãðm"z¯ÂçU^ü»¢Ÿ]À¥èYËïe¯Ç™ü^‡ó3ñËrœaÜÚ¿ô;“§ cÈæ[Áq5°“óY‚sùQÞWP]ÍŸ¨kCŸN98SÈö1ñë,\߆ÏŒÞÖBñç(°ë¿LÑ ŽlLì{'?ÏžÛ[Í¥¾ çÖ‚ãÿ„.ÿïRøïj¸ !ã$û@ÿ×_Â2^˜Azxøé%>¼ßÄ»*ü–ñž„wÞµásu£ý¿øRŸ$UªÁ‹Òj²Y!>UY&ž#›ÅäÕø¾”l4ìÿ3^q¾„l–÷³lÅç$ð.c3¿mÀõE$]|„=ÈŒP¼¨~™ý}”ÿ’î ©x/¯ãŸ©’@ÜÂjâ–zОI– 2ûûsèWD–ÑÈ2ùF²Œ—n]Çuò®¯#qB±Kuäñ\ð¢\q- ~*ùHùúõõëë×ׯ¯__¿þòš7ÑûP hTS¤„(ù¡OáFrRX¦½Z ÿõa`ñ6Œ^=ebãDÔIÞÏ„ÿ56‘"Œ³8b˜4æß¿ì½ß)¤ÀÀ;?€ endstream endobj 287 0 obj 18837 endobj 288 0 obj 33068 endobj 159 0 obj <> endobj 289 0 obj <> endobj 290 0 obj <> endobj 292 0 obj <> stream xÚízy8”mø6)J„Šˆ2*e 3ÃX³‹ÈNviŒ1†1Ã,–,Ed²S‘";YR’d‹È–%Y²TRɾ|Ïx{_ÏôûŽïŸï¿ïø8Ž9Üçu?×}^ËsÞ÷=AC1U‚=Z“€'‹ÁÄ¡òoW{…#¨,«  :$c x $-Ñ$b!zH". Ãå¡’òR²˜œœ 0ÑLBBb€9’PY8")G…a0ˆE†Ø£1X<«um¼#ƒþƒ;PÜþµy ‰$`ˆÐŸµ…!ÀÊ<Îâ€vd•Ð'±(4DHàæMÄbœÈ!”0°¸,â,õSfûSŽú)Ýþ”lÇ„D"£]Im<Š@t#@Ä!ª8dÛ X‡„&zàßKjRp8}¤+°è?iùv¤+çýšaŽþ‡©ÚKqýÛŠ%ib½Ð†X2Ê âˆÄ‘ÐÿàÚd$‹RÅcphôèÞMÄañhC K­D ýÛfê„E¹àÑ$ñ wø›2PmÂ*½žRã€Åc p„4I$"½Y¡0B@|`,àß ‚öHJˆã dàˆ…ìq$Y©”„C$HnH :ü" ‘À!]w )ˆ¥–‰ÛA <ÅÕžZ| ~–¦> ‡'cÁÓe nh" €w0YˆÒÕê÷?TàDA9‘;S¥ ÀãH"C;‚PØôŸ¶ú¢B ˆX’‹+’ì´c‚sÃQH;ŠàêŠÜA€°\±xðémæXÂE) IyB¹Š&v ~'¯@]%Èž;v@ìDDƒf¬ â°uÒ¾lIX¯1À•„ö@ïdAÍ>M.U<LD–2Žzˆšp´+–•ã¨ù0F»S@5•c¨*ƒÞ!- v§ IÛþ¸f<†H—_ ¯ŠssÚI¾4@_ M{u'ìÎ ¯ÆgäÏ»‘°`ê2uCÐS2s-$¸Ê2óó /2km¢– Ûº‘nn I]]¤«½ëQv†_}Ð k$š"+K%»ÃUàjêÎ,ÀÕØi§sd®&X (Y€¬)rgY€é¥¿r"+Míà©€de¨lÐ#€®ˆ @×´3–¨Z©Édí‰H” šLó^ÊÁ·³GD:³Óyr’ÿͦ}_夶ß07@ô°( ¹ÓMrªô"IBÑx‚!"ÉHzçuö $M?ÉñØÓ"B:ƒªÄ4 ƒRûü¯ìÁ @Dn4Á`hz Â@ÓxØc 4ˆô¶H»Ðt °ÆÑ¶ wÝ©0 ؆õÒ„¿: £’q†Iþijp&‚š Cüé&#Á‹œ)g&Ket(8˜Ül^ Npª„“Àœª¤`Žð?}ƒ¦é1 nêñgmwÁàÛ­løàÉTy;O 6ŒªoÞPT£îd4“üGiÕFU9G`}éƒQU‹wÄâ±do prĈXðL ­(Å„9uÀ"]  íFU<'4’Š*xÀ6îâHÕ<à<@ð´'€6@Uø¶aÚ\Rõo; Ôð¯|R…pw x‚èSÕÐoi0ªR7\ÚF•EEUÿl&啪®ë†e*”nDp,¤æ›f>|ûT@=~8`Aj#'C4(ªv:`=°àÜQõ8-ýMCz{ÿÃz¢ƒG§SuÇ àâõ÷@˜h 4(xªªn§8P‘Aò£Êë¶Á è‹«4 V`ÂÇt"šL!‚ÒNÕZ€‘¨ÈT¡Õ:Ñ… :MÀ¨*kü?Q VO4PX2 ÚíaTEa‰(ú枪´ÿØhNS0ªÞ¢]ÝÈÞ$pŠ©¢‹ÅuJNónÀ©ê œ,i ?efS¨ Gpª{  ùÿ›ävÍH{ZXjÇÝ_ÄŽ³¿,ÔBaƒÏ*pªNS{âàÔ3ìöyÚîd`{¢™HUl"pa"m'‚ˆu™¨åý÷rô·º•ÎЮH¢Ëß6Éíà((ð:Rÿí Ö@¦9 麎#`¨3È@¸Ì8ø\§*üœ@Áÿö³ƒ=ŽFlàp莅FoàpØŽ$9p8|§U8\rÇD#‡&‘&²øüǾcÎß2XÏW¾!ˆ¿(,nC‡;”x,Hç\ŠW9¡|ÚU,_úSª}-ÅpÐD¾“0SíòäK1Á‹q1Xâä–dj$nìZ­¥ƒN•D7_€{«|{ùÜ‹Ý*ƒk¶ ý]ú¥o`9r1P«¯R•©Y/Oð'бÄŶٳ Sm„Ó=ÚŸ¥«íÕ–gú:edù暘œèMüÓ–(—èÈòŽ$Ë„”¬|!nøŠFEÔfìÔ¡-GëÆÌ¾ {û(±]É@\êZIŸÊ÷$=6löÄ^XîÝ?ÛßÁjP–1³Ww~•ÍíCWápI6;7¡O„5iK¸hzÂS“OöÑyy‘'[ß]—óöëzŒí„Æž}ΨÜný½‘ц+I¢9¾h‰ƒ… ¥óÀcXtv95ì/„·ZXíCÝÔó„­ ç`Ž3sŒÇ•’ŒÌ¡Ý+b"²y’¦£ xFà †‚‘§3ŠŒƒ¶Ä¼ŒŸßÊ=V)øuÙ/©ž'ü¥Häšϸg£‡Èë—WÛ„T„“§&›´ëÍžÞ :5Ç.gÛî®Ú?4S=ËZVH ••ŠÒe‹ÓTXoÿÌg£¹’"÷ó‹b€Ì„¯éïpFá´.ú ž°ä9!«¿vséA•sq3ãüJõºâJ˜‡!õ]k‚üo`,ˆ+ž£†Æç÷䌚֛ ÓûYýâ~Fë>·UpÂ帲¢¼Â±¾îG¯I˜­fŠÓ§ìû1Dé%ŸAä­Ìy}“#«b·l³nõGy6)«§]uzš“´?ƒ=êAÄ»5û  ·‚?Lz“£UþhÍ8BȱÜr–9s‹îŒ;ñÃBcž©Õ„àã|òî ½á0þµýçj_OV!µoö à/6º[²|„ÏÖ7ÃØ)¼6Î »¬Ÿ>Ñ¡›Q­ö¾”ÍöÔc²}«@†9Éï]KÓ+›žö#òì$#t؆u«•áæ§6ÕlsÎîüÞwKî}IKVkû¼Ý/-Xý€ð=8m9|}sPåVÇxFã‘b7ô€B³‰~÷¬Ä«Ë¬ƒjÄÊ…—i¼Ki»Ž× ®? 7mXšyô ÖßWôIL;æõ„å§Î«ÒaýAMáF~6¾*Çäâ/ï JÂ×x"çêü¼ï©á6?Õ¤šÊMjª—έ2爗JNdäÙu˜a¦Ò0lAÊŠ$⿵…Í×Ðü®ŽÖŠ:ý²cŸAp¢p[ï‚ä‚èå²yt®kK‚°¿ŠkÒ"«TÌN¼î+WÅ®9nø7a„3W³ùÅïçteμ¾'Â,¾.” ÛÇpë{Ö…Çr½ôŒE›„_O¤Eî¡Ûëò¯ÞãM­¶‘†¿—½—׊hГ?ðuïTÉ-ñò×á¥Ø¯Vaƒ*˜Ð§Ÿ½rÑŒÙbö.HcE–§ÂÉßÕªSÑœ¤"”mÍ_TÓí{ÝÚÏpßíº§ÓºOdW”^7-EŸ"ó`œ•^«sÝ£×´a8[½¸(ñaÑ!Ýj²÷ËíÉ ²ÌÅÐÓÙjq…Çhv»¾W¥=Þ·KPOŒ§cÖïœ2±´3\cá)o¡»cqlÔó¨¸ÀnhTbíùãxÔʜ֪y©U Í€È|c,3­tÿCí|׿íi:xú÷¦‚RzvÓñ“&ñž¦ûV-D KPf †J9¹qk'~Äu™'ÉsWýQmÑçmÔŒ´{QúÄuw!a1ø}¨_úWüñ—ëÌoi…fƒ¿ƒNç&êVéæ×@=íWÖ&ìsO<…»–|x !?2¶Ôx=(å(2ÇpÓùÃ%îhTŠ˜Š»g~ï.ŸàŠüò=Š=™ú|¯½³å-+à$øMÖü¡áçÂ3÷Õ¼Eá,™œ=}|YÉ…-Y÷= j$–™æëììZ µC®¥¾ØÇpª£$íìš^{ð€!NZÚÿ{ìM~bô°Ë‹ö!Åç rÌ›¹¾eìý¾]ïŽq.9ÙÀ}0øà¬dJZFä] òé=o‚nê*¿µýD‚lÕLë¸Ã+,­^[2àOZáS|ãF1ʵ'L¡cŽßåüu0z5òÐ9ñI+;®y‡•»ºUŸ}Ä {qHTÑVQ¨ýƉ£š¿¸NËwRä[ W$à>^¯íºs 5YGT}õs˜Ö…U½!yÎÁ•Ö¯©§æÃ¥§ŸØ¶|(©¾ºNìÃ,ôHÖ4`OïàTÒ5*ñ]Æ ü>Ûë|Îß¼ã뉊þiQ¼ühIº™Ó¬ú^-lÆïGÞùïK¬C Ž×[ÚØ7 ñz%±îËÀŽó=<™ª‘æ´rí½©ÉrÓyÊ€B–˜ßôÔ®sëØ‡è·ôÅBEŒñi8øBJ3#zØÑYG>ÔÙ)v‚J¯Ë ³x=;º‰›ìõÕ×1 ×+’ב=ÌØªT%åhæ~÷~é·†2C‡ïU]æ ¨jg\M¯¹±1Ó£"ñÁMÆÜ¢æïRÚß”¿ôé¢—Šº¢:WÆq|=ÚDMv¶ôÊ„ÜÀs ¡€U#™××Èjßz•ìòeÃð·vomÍN÷M†û"9{æx‹òºpg¸Ó›OIúZÝ-ôj9¡žÃªóôaÒ‚yífT-GðM«´óF½»j‹Œ-³k6, %3Ä÷?çbä ‡5ºqC8 e×.ì>¹ûGP®dð@ôdìƒ0n-FN‰gNÌSmšo¹’##F-=oöû7dWù›:ø$†öÖé_‰y^jv¨qè‘EMeÁ/éQå#3 ä+Z'#ÚÈø[>Gó|ú¥~ u¿˜Hdéë:qí²ŒÂê7ýÆX.¦Ï„õeÏ ¤[—?` %Ý­cö°ë…FdL³¿¨¶‘”œñ±õod´Òhݬfb†OÄi¦·¼cô³nkÚ(V Yq ‹Í[|ñì¸çqÎ5†ªeÌu^¯ošøËm—Çl³Jrï/D“!Ï¡à]3…cWì2¯3ÃgÕ½._’ýÕ4¶@ʱâsâ¢ò;9ôžŸgwÙMjä³Õ|F¸0×íkQ.ýÀÒtReþ´æ¬.Æ,²¥üùI¸cQÔ {I†•×sÞ\´ºì-S÷¹x[z$Ž»x6ÿ“!%ú¶Ònsø%wÿ2o |‹5ÎjôIbh½¦w¸Ë~hT'¦Y_Ú*¨c³ûxËó(aRÁgv¶¾]_cͦ17”£ªÏ­/Ó~ß ô~L'eÌ+ãÎÝ@WG|Ñ¡ƒÙ¿ó[/uUEd}~õôòÞS8“K—Äm’쪊_û,!}ã„Õ_x cX ?&ÞS°þYç9ÑþÒ/vÿ†X”eÚ)AIî±÷—@å-•M ÿw' tgÊdoÔ8âoÍ7IcçÊj=HY3^ÝÂîÞ¼ÒÍwÐóeÙ§>yø)q¦Ë®\éQÀWÅR÷Ö/òòb{3òpÏ£Çp¹æÃ=æ­ù£C‰·OnÍ2&ë­~†<-œº8ç¶ruÖ~ü]àëçˆ2?ã>öÇãü ÉÒDÅÔöó1’¯ö¾.x­Ú*(x÷WHq¤„©G¿ªUšLþLn5 ¢ûˆŸVÕé ?Íë{œ7®»+¼\0Mæj’R\6ºÍ)56#~ŠijßÇûÖ“Ýž»“Ê‘ˆ)T ÃüðÝ­d×›‘ýaÀ\a¤”»÷xë©È&Š4ñîšÈìÕÝ!>Ò‘ä¶ ‰2elsè''ØÜ]I&ÇjÊ2u½²úMí`r«ó¦9QMÏõ0cwËs§Gó>k¶-IþváÍq»=ûìôT<²ü«,×ÊÄñ‡xM¯î”pjŽ|Z´Æ¯°·MÍnà‹£ÓoÖœw\»Êôª·ì©Œ¸™¢pLÑÌàöׂŦZ±D¿¹Ëz¼u:GXïZcTÚu$Ít9*¼3ýN^dT‚”æîß(¨Xé{±@—î7roυ華vO4 ^÷©|ee©!*aÓ¸§kio†gì#bÊJ®¢õ.FÄ¢WòÊ¯^Íä£dh³¬Ò¯HħW.»F¶¸gÄùíŸö¼Ì™4'S¦Ú©ó6pÙ[þfÊ›®€5™YoØ¿wQrاñù¦¬è½¨Œb¡¨3'(Å‘l®oÃzë£:M5x|OÚâ ¶:ß‘n¹ßa~êrS*d&S#,éwQð¼¤ÂÕ·#çÄé}’5ö\…š³a·é£»b­Y*!(ÁN(?ŒQ®5ÇÆFd=&òH¹,s¸qpû¼ñIP·¡ùVg³}gnÈñ¬^Ô<¢miƒHͺ¯¶Å £Áûü3—E®âö¾éŽ˜C/ƒI¶:ZàÌi§yãôö#â)âù·»‹TÅÕ´#gc/2îÿ™µLª<æÖÃ2×ççµ¾á„Ñ®á åãÃê¿ùVÃCý×’ˆ|„–Ûúµ,VfûšN'Û‡|žÌ»¡ÚÑ—ˆ%ÜûÞ—k$¥øàøÒȇ£19Ò__ÊÄž ³8Ìœ„ÎŽÊÊ0eß,Ú3—Ÿ|íi†“Üs£sΊªÅ—>K³I_é.s\H½/’ú^»@ò|øF¬dÁb‡g¤‹nA?ÍïÎÓ”SBéßÔ9…éTnÍbaá/l3€¿ØwPšTåx]îñp1z`ëŒ=JAt̼¡òݶ Cí\Ÿ…Ý`)«f%WCÿ-)õD¼ƒ·Îmæ³zŸ^ŸÝUXѯ„Šk‰m:Mr0‰rŠöQ£GiØ.çÇVmbe¿×Æ ì—P£¾N¹û•÷²¼ROo†œk°ã«/±‰à\ʾ7›ózæ…às’IÍöò±îqr\Æ»Ýgº‰¼ bÐâalfÿâþ|\Ö„åC_õÚ̲`™L¦v¹é­¶+q7”¤ésŽè¡Õ"ØêÏ”%0¥·©~aºQälùÓo.÷äìAnº‹BE7ŸÝ{Wp‚Þa÷LÈËqL&ÅÀçܽ7q¤i߬«]9å÷Bg·,Ï×—ýêñ§×ÏÄWÝTΔ 'u,GXŒn*Ç߬@ðX«ˆcÌÖfò¦­Ù†ÛejÔ¦’¨™vÙÛ¾£…Yˆ>§½I£ z¸{õ7ë¬úzѽ¶°7ö±-ñrFÝ…Zy‡«BÚ„[û<> >d\x:γXõ&•¤w¦úÛ›æOñ9C}$ *n°÷d?w4"Ê>Jø(êïÿýù€­µžš¶d”­¾÷zÞò+ã\Q°÷AfÝÖ/ ›•®3»­76›ØTVù[8­§îò|?§¥‘š)¿MsoKd¹ë¬LÝA-§ôVFbA«Sú‡´)¾¤F=.Å6y±ùRí}„ÓþF¡_Ür¹úbÎ~Ñ5áÁ'mL /è¯âÊ€äFÕàf½gOÞyZîtÓv &’.?0b3<+éYuî’àÆÒëëqÙ«üz#ì[s#Šæ¶UM¨ÝX¥ù”«ô}¸ˆüf)ÄVÏ€˜¶WŸüå9W>å⿞ú9óŒ÷Zå¿£GÊB™z$DÓx;¼ÅfF[&³lyBp!ZUoFfÃtZ½»WÌf3•÷†«t|ó¼0ô]ïRÍ£Ò?6e#ä¹K"q “2­» D®Gi*̾Žï9%z Ûïj÷=»o‹]z3‚tI‚w—¯{yœöÁ«Ïs`ïÆæ=y'ÂÙGÄ’·Kr)’M§½&¦ÑJ,Þ…/[SB\×™ße¸úñY÷AÄÙžÛõ–»•t ûÍI>[nöã9tL¥•W+öŠÔ±U¨Þ]=ür³,2_?,¶DPj·li”¹Þ”éVyű´KM u‡Ž·2˜a1’TþAÀÔò{S˜(|hukzrÃéîiUÎ3:Bi)™Éø)Íùø€´¶f¥ÏQ§4Ò›&¬ dr­niÒ^÷2¤ø©w¸éÀÖRÑ«ŸéÞâçí®+[$‡ÝÑb04 {¤pûZ\¹0J þƒ+;ýÓ™+ŒŸ “we½-¸F|›žØ^8@tÜs&G,d˜ƒÏÙ24eùÁb6/Óq©4d…ñíBƒVJð þÛ˜– §‡Óþ.ð»g6—6Ó~~®@~Ž#s][» /±QìómŒåºÀn‹XéC¥×‹MfD©qŒªøÍX>p1»íþ Í\¾ÏPw ïEp:¹6ñÛÊoG¦>®GÓå‡n8l Íé'XV~ç29fªbRÖw½°Ñ–'/ÖŠÜ”f2ÎIåù`[Â^ÒÍóÔ7Ûé݈Ú¹˜ã«Ž+Âg| 78m)ºø‡ÆË‰âÚ=ÉwÅl ï>g%ê×kid0¹ÒúbͳöFíådùîT³„lý=A““³WÖU¸·ÜzŸN ºD¡ÜAB ÍÇæ‹½x†d|cú‘Óø÷çG7.™q„Z^]÷ùÞá¼öl÷õXŠÐ1¯•6ùSBPÎ!EùÔ6µêúaì\Ù…lšÍI”¯…ZowU°ˆ¬Ã„ÎÚB×&¡¸µé÷Îý¦sÒ.ßxq²ëà›¤*ƒcæmí¹q?Û§¸žÜœû_IwÜQtïÚáW׳»;guLHuêRÜõ’ñ‚Iô϶î<ùšÛ&X¨Tl®‹ˆé‘8Ï|ýV@F½ÿÄ“Œ2¥´*¿Ì÷¥›–ŸýR®“gÄËϦ…e%UÏ:ª´õWÙØ–[lŽÏô7~>+#Zñql™©dÀɶ2² yýë>­Ã§Æ$§7¾(~{Œ˜³*6èH”°bäè!y«–ïþM°ÚW/è»ÌÏÿp⥥ƒÁ¨Åü·ãvóÊBÇU4ˆä‰%yv:’OHR‰Ù؈^ÔÑñ¼½ŸÂd"–+žñå…¨îFÌV}¦Øž‰ýÐ~Þ^éÉ+?×çá˜Y>íBB|BÚR½>yiŸ [ü¨y_,+òäNŠÇ»÷ï¹_À1š¥(UñíøÅ‹…âg¬,éGÕ:ÎMœX Ã*³Â¥^Ì‹ÆV9Í}»+›ÝÅzõǬãËcÕ¬j?I(å·]—Îó IG÷²´R 1ãMfC§ž¼lIß•«Öv²´Ú®mïçfOÿ£ªÓ®lL ¼21_Nè(B7jGo2qŽKÅ;óE?Piǰct :XKîíÚObzvæ6¾¥ÕV:¸Iw@û ÛCK‰®ŒWO]¸Ë¸)¡ƒç².'DHýØLÏÌ)šZL ?[çA > stream xÚ]PÁNÄ ½óãÁd=TX¼6M65{P7‹~@ ÓJbLé¡/E²&†äñÞ›y3÷wUŒ°zzpÅů¤±j_ûÀxÛ=wÎFàòZa„Ñ:CENÖ±£cu,(¿z.fµ-çΞÕ5ðk"—HòÄÆßÉ Y7Áá³U «5„oœÑE¬iÀà˜¥,oýŒÀOæÅë*Iÿˆ- ÈŒ¿´7¸„^#õnBV Ñ@}>7 ùÇÇ0ꯞŠR )³¶üî®}Ÿ[ ½¥€yéanÞî|Ø]¹~f‘rô endstream endobj 297 0 obj 232 endobj 66 0 obj <> endobj 67 0 obj <> endobj 68 0 obj <> endobj 69 0 obj <> endobj 70 0 obj <> endobj 71 0 obj <> endobj 72 0 obj <> endobj 73 0 obj <> endobj 74 0 obj <> endobj 75 0 obj <> endobj 76 0 obj <> endobj 77 0 obj <> endobj 78 0 obj <> endobj 79 0 obj <> endobj 80 0 obj <> endobj 81 0 obj <> endobj 82 0 obj <> endobj 83 0 obj <> endobj 84 0 obj <> endobj 85 0 obj <> endobj 86 0 obj <> endobj 87 0 obj <> endobj 88 0 obj <> endobj 89 0 obj <> endobj 90 0 obj <> endobj 91 0 obj <> endobj 92 0 obj <> endobj 93 0 obj <> endobj 94 0 obj <> endobj 95 0 obj <> endobj 96 0 obj <> endobj 97 0 obj <> endobj 98 0 obj <> endobj 99 0 obj <> endobj 100 0 obj <> endobj 101 0 obj <> endobj 102 0 obj <> endobj 103 0 obj <> endobj 104 0 obj <> endobj 105 0 obj <> endobj 106 0 obj <> endobj 107 0 obj <> endobj 108 0 obj <> endobj 109 0 obj <> endobj 114 0 obj <> endobj 115 0 obj <> endobj 116 0 obj <> endobj 117 0 obj <> endobj 118 0 obj <> endobj 119 0 obj <> endobj 120 0 obj <> endobj 121 0 obj <> endobj 122 0 obj <> endobj 123 0 obj <> endobj 124 0 obj <> endobj 125 0 obj <> endobj 126 0 obj <> endobj 127 0 obj <> endobj 128 0 obj <> endobj 129 0 obj <> endobj 130 0 obj <> endobj 131 0 obj <> endobj 132 0 obj <> endobj 133 0 obj <> endobj 134 0 obj <> endobj 135 0 obj <> endobj 136 0 obj <> endobj 137 0 obj <> endobj 138 0 obj <> endobj 139 0 obj <> endobj 145 0 obj <> >> endobj 154 0 obj <> >> endobj 160 0 obj <> >> endobj 161 0 obj <> >> endobj 162 0 obj <> >> endobj 163 0 obj <> >> endobj 169 0 obj <> >> endobj 170 0 obj <> >> endobj 175 0 obj <> endobj 188 0 obj <> endobj 201 0 obj <> endobj 214 0 obj <> endobj 1 0 obj <> ] >> /Names 298 0 R /ViewerPreferences <> /PageMode /UseOutlines /Outlines 5 0 R /OpenAction [52 0 R /XYZ 0 792 0] /Metadata 3 0 R >> endobj 2 0 obj <> endobj 300 0 obj <> endobj 301 0 obj <> endobj 302 0 obj <> endobj 52 0 obj <> endobj 55 0 obj <> /XObject <> >> endobj 303 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 304 0 obj 40 endobj 58 0 obj <> endobj 61 0 obj <> >> endobj 305 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 306 0 obj 40 endobj 62 0 obj <> endobj 65 0 obj <> >> endobj 307 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 308 0 obj 40 endobj 110 0 obj <> endobj 113 0 obj <> >> endobj 309 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 310 0 obj 40 endobj 140 0 obj <> endobj 143 0 obj <> >> endobj 311 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 312 0 obj 40 endobj 146 0 obj <> endobj 149 0 obj <> >> endobj 313 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 314 0 obj 40 endobj 155 0 obj <> endobj 158 0 obj <> >> endobj 315 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 316 0 obj 40 endobj 164 0 obj <> endobj 167 0 obj <> >> endobj 317 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 318 0 obj 40 endobj 171 0 obj <> endobj 174 0 obj <> >> endobj 319 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 320 0 obj 40 endobj 176 0 obj <> endobj 179 0 obj <> >> endobj 321 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 322 0 obj 40 endobj 180 0 obj <> endobj 183 0 obj <> >> endobj 323 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 324 0 obj 40 endobj 184 0 obj <> endobj 187 0 obj <> >> endobj 325 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 326 0 obj 40 endobj 189 0 obj <> endobj 192 0 obj <> >> endobj 327 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 328 0 obj 40 endobj 193 0 obj <> endobj 196 0 obj <> >> endobj 329 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 330 0 obj 40 endobj 197 0 obj <> endobj 200 0 obj <> >> endobj 331 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 332 0 obj 40 endobj 202 0 obj <> endobj 205 0 obj <> >> endobj 333 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 334 0 obj 40 endobj 206 0 obj <> endobj 209 0 obj <> >> endobj 335 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 336 0 obj 40 endobj 210 0 obj <> endobj 213 0 obj <> >> endobj 337 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 338 0 obj 40 endobj 215 0 obj <> endobj 218 0 obj <> >> endobj 339 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 340 0 obj 40 endobj 219 0 obj <> endobj 222 0 obj <> >> endobj 341 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 342 0 obj 40 endobj 223 0 obj <> endobj 226 0 obj <> >> endobj 343 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 344 0 obj 40 endobj 3 0 obj <> stream application/pdf OpenHPI for HP ProLiant Rack Mount Server Hewlett-Packard Company XEP 4.18 build 20100322 Unknown 2012-08-07T11:05:26Z 2012-08-07T11:05:26Z endstream endobj 5 0 obj <> endobj 31 0 obj <> endobj 32 0 obj <> endobj 36 0 obj <> endobj 34 0 obj <> endobj 35 0 obj <> endobj 33 0 obj <> endobj 44 0 obj <> endobj 43 0 obj <> endobj 42 0 obj <> endobj 41 0 obj <> endobj 39 0 obj <> endobj 40 0 obj <> endobj 37 0 obj <> endobj 38 0 obj <> endobj 23 0 obj <> endobj 30 0 obj <> endobj 29 0 obj <> endobj 28 0 obj <> endobj 27 0 obj <> endobj 26 0 obj <> endobj 25 0 obj <> endobj 24 0 obj <> endobj 20 0 obj <> endobj 22 0 obj <> endobj 21 0 obj <> endobj 51 0 obj <> endobj 50 0 obj <> endobj 17 0 obj <> endobj 19 0 obj <> endobj 18 0 obj <> endobj 47 0 obj <> endobj 48 0 obj <> endobj 49 0 obj <> endobj 13 0 obj <> endobj 16 0 obj <> endobj 15 0 obj <> endobj 14 0 obj <> endobj 45 0 obj <> endobj 46 0 obj <> endobj 8 0 obj <> endobj 12 0 obj <> endobj 11 0 obj <> endobj 10 0 obj <> endobj 9 0 obj <> endobj 7 0 obj <> endobj 6 0 obj <> endobj 298 0 obj <> endobj 299 0 obj <> endobj 404 0 obj <> endobj 405 0 obj <> endobj 406 0 obj <> endobj 407 0 obj <> endobj 363 0 obj <> endobj 374 0 obj <> endobj 387 0 obj <> endobj 354 0 obj <> endobj 397 0 obj <> endobj 392 0 obj <> endobj 400 0 obj <> endobj 386 0 obj <> endobj 383 0 obj <> endobj 362 0 obj <> endobj 353 0 obj <> endobj 350 0 obj <> endobj 396 0 obj <> endobj 394 0 obj <> endobj 402 0 obj <> endobj 378 0 obj <> endobj 364 0 obj <> endobj 371 0 obj <> endobj 348 0 obj <> endobj 367 0 obj <> endobj 399 0 obj <> endobj 370 0 obj <> endobj 357 0 obj <> endobj 345 0 obj <> endobj 380 0 obj <> endobj 351 0 obj <> endobj 346 0 obj <> endobj 393 0 obj <> endobj 375 0 obj <> endobj 360 0 obj <> endobj 379 0 obj <> endobj 388 0 obj <> endobj 361 0 obj <> endobj 398 0 obj <> endobj 358 0 obj <> endobj 359 0 obj <> endobj 368 0 obj <> endobj 347 0 obj <> endobj 403 0 obj <> endobj 381 0 obj <> endobj 382 0 obj <> endobj 376 0 obj <> endobj 390 0 obj <> endobj 366 0 obj <> endobj 372 0 obj <> endobj 352 0 obj <> endobj 389 0 obj <> endobj 391 0 obj <> endobj 377 0 obj <> endobj 373 0 obj <> endobj 349 0 obj <> endobj 401 0 obj <> endobj 369 0 obj <> endobj 356 0 obj <> endobj 365 0 obj <> endobj 384 0 obj <> endobj 395 0 obj <> endobj 385 0 obj <> endobj 355 0 obj <> endobj xref 0 408 0000000000 65535 f 0000316314 00000 n 0000316554 00000 n 0000326932 00000 n 0000139878 00000 n 0000327949 00000 n 0000333110 00000 n 0000333015 00000 n 0000332484 00000 n 0000332927 00000 n 0000332823 00000 n 0000332715 00000 n 0000332615 00000 n 0000331837 00000 n 0000332163 00000 n 0000332057 00000 n 0000331967 00000 n 0000331150 00000 n 0000331387 00000 n 0000331292 00000 n 0000330505 00000 n 0000330810 00000 n 0000330662 00000 n 0000329600 00000 n 0000330384 00000 n 0000330273 00000 n 0000330167 00000 n 0000330064 00000 n 0000329955 00000 n 0000329838 00000 n 0000329751 00000 n 0000328005 00000 n 0000328149 00000 n 0000328601 00000 n 0000328373 00000 n 0000328514 00000 n 0000328284 00000 n 0000329371 00000 n 0000329510 00000 n 0000329148 00000 n 0000329284 00000 n 0000329043 00000 n 0000328933 00000 n 0000328808 00000 n 0000328691 00000 n 0000332254 00000 n 0000332398 00000 n 0000331486 00000 n 0000331645 00000 n 0000331738 00000 n 0000331037 00000 n 0000330922 00000 n 0000316994 00000 n 0000000015 00000 n 0000000678 00000 n 0000317195 00000 n 0000236632 00000 n 0000140117 00000 n 0000317430 00000 n 0000000698 00000 n 0000002628 00000 n 0000317631 00000 n 0000317833 00000 n 0000002649 00000 n 0000008208 00000 n 0000318362 00000 n 0000308314 00000 n 0000308403 00000 n 0000308491 00000 n 0000308579 00000 n 0000308667 00000 n 0000308757 00000 n 0000308847 00000 n 0000308936 00000 n 0000309025 00000 n 0000309115 00000 n 0000309204 00000 n 0000309293 00000 n 0000309382 00000 n 0000309471 00000 n 0000309561 00000 n 0000309651 00000 n 0000309741 00000 n 0000309831 00000 n 0000309921 00000 n 0000310010 00000 n 0000310099 00000 n 0000310188 00000 n 0000310278 00000 n 0000310367 00000 n 0000310456 00000 n 0000310546 00000 n 0000310637 00000 n 0000310727 00000 n 0000310818 00000 n 0000310908 00000 n 0000310998 00000 n 0000311089 00000 n 0000311179 00000 n 0000311270 00000 n 0000311360 00000 n 0000311452 00000 n 0000311544 00000 n 0000311636 00000 n 0000311729 00000 n 0000311821 00000 n 0000311913 00000 n 0000312004 00000 n 0000312096 00000 n 0000312187 00000 n 0000318564 00000 n 0000008229 00000 n 0000010272 00000 n 0000318986 00000 n 0000312279 00000 n 0000312369 00000 n 0000312461 00000 n 0000312551 00000 n 0000312644 00000 n 0000312734 00000 n 0000312827 00000 n 0000312929 00000 n 0000313033 00000 n 0000313123 00000 n 0000313215 00000 n 0000313316 00000 n 0000313419 00000 n 0000313510 00000 n 0000313603 00000 n 0000313694 00000 n 0000313788 00000 n 0000313879 00000 n 0000313972 00000 n 0000314063 00000 n 0000314157 00000 n 0000314254 00000 n 0000314353 00000 n 0000314444 00000 n 0000314537 00000 n 0000314638 00000 n 0000319189 00000 n 0000010294 00000 n 0000013344 00000 n 0000319411 00000 n 0000258812 00000 n 0000314742 00000 n 0000319626 00000 n 0000013366 00000 n 0000021366 00000 n 0000319848 00000 n 0000143645 00000 n 0000277634 00000 n 0000188158 00000 n 0000204828 00000 n 0000314874 00000 n 0000320099 00000 n 0000021388 00000 n 0000030256 00000 n 0000320345 00000 n 0000298293 00000 n 0000315004 00000 n 0000315131 00000 n 0000315275 00000 n 0000315428 00000 n 0000320596 00000 n 0000030278 00000 n 0000039595 00000 n 0000320826 00000 n 0000166453 00000 n 0000315601 00000 n 0000315741 00000 n 0000321101 00000 n 0000039617 00000 n 0000047082 00000 n 0000321323 00000 n 0000315881 00000 n 0000321562 00000 n 0000047104 00000 n 0000054512 00000 n 0000321766 00000 n 0000322005 00000 n 0000054534 00000 n 0000061806 00000 n 0000322209 00000 n 0000322460 00000 n 0000061828 00000 n 0000070598 00000 n 0000322682 00000 n 0000315987 00000 n 0000322933 00000 n 0000070620 00000 n 0000078324 00000 n 0000323137 00000 n 0000323400 00000 n 0000078346 00000 n 0000086350 00000 n 0000323604 00000 n 0000323843 00000 n 0000086372 00000 n 0000092129 00000 n 0000324065 00000 n 0000316098 00000 n 0000324304 00000 n 0000092151 00000 n 0000096122 00000 n 0000324508 00000 n 0000324747 00000 n 0000096144 00000 n 0000107285 00000 n 0000324951 00000 n 0000325178 00000 n 0000107308 00000 n 0000116203 00000 n 0000325400 00000 n 0000316204 00000 n 0000325627 00000 n 0000116225 00000 n 0000124642 00000 n 0000325831 00000 n 0000326058 00000 n 0000124664 00000 n 0000134353 00000 n 0000326262 00000 n 0000326489 00000 n 0000134375 00000 n 0000139856 00000 n 0000326693 00000 n 0000140781 00000 n 0000140802 00000 n 0000140887 00000 n 0000140909 00000 n 0000140948 00000 n 0000144166 00000 n 0000144654 00000 n 0000165794 00000 n 0000144869 00000 n 0000165706 00000 n 0000165729 00000 n 0000165750 00000 n 0000165773 00000 n 0000166432 00000 n 0000166626 00000 n 0000166688 00000 n 0000187828 00000 n 0000166903 00000 n 0000187740 00000 n 0000187763 00000 n 0000187784 00000 n 0000187807 00000 n 0000188137 00000 n 0000188444 00000 n 0000188545 00000 n 0000204455 00000 n 0000188771 00000 n 0000204367 00000 n 0000204390 00000 n 0000204411 00000 n 0000204434 00000 n 0000204807 00000 n 0000205257 00000 n 0000205492 00000 n 0000236151 00000 n 0000205717 00000 n 0000236063 00000 n 0000236086 00000 n 0000236107 00000 n 0000236130 00000 n 0000236611 00000 n 0000237444 00000 n 0000236772 00000 n 0000237423 00000 n 0000238357 00000 n 0000238606 00000 n 0000258766 00000 n 0000258789 00000 n 0000259475 00000 n 0000258960 00000 n 0000259454 00000 n 0000260086 00000 n 0000260344 00000 n 0000277588 00000 n 0000277611 00000 n 0000278359 00000 n 0000277775 00000 n 0000278338 00000 n 0000279065 00000 n 0000279316 00000 n 0000298247 00000 n 0000298270 00000 n 0000298465 00000 n 0000298527 00000 n 0000307984 00000 n 0000298746 00000 n 0000307897 00000 n 0000307919 00000 n 0000307941 00000 n 0000307963 00000 n 0000308293 00000 n 0000333220 00000 n 0000333257 00000 n 0000316629 00000 n 0000316773 00000 n 0000316920 00000 n 0000317293 00000 n 0000317410 00000 n 0000317696 00000 n 0000317813 00000 n 0000318427 00000 n 0000318544 00000 n 0000319052 00000 n 0000319169 00000 n 0000319489 00000 n 0000319606 00000 n 0000319962 00000 n 0000320079 00000 n 0000320459 00000 n 0000320576 00000 n 0000320964 00000 n 0000321081 00000 n 0000321425 00000 n 0000321542 00000 n 0000321868 00000 n 0000321985 00000 n 0000322323 00000 n 0000322440 00000 n 0000322796 00000 n 0000322913 00000 n 0000323263 00000 n 0000323380 00000 n 0000323706 00000 n 0000323823 00000 n 0000324167 00000 n 0000324284 00000 n 0000324610 00000 n 0000324727 00000 n 0000325041 00000 n 0000325158 00000 n 0000325490 00000 n 0000325607 00000 n 0000325921 00000 n 0000326038 00000 n 0000326352 00000 n 0000326469 00000 n 0000326795 00000 n 0000326912 00000 n 0000335816 00000 n 0000335970 00000 n 0000336530 00000 n 0000335562 00000 n 0000337192 00000 n 0000335204 00000 n 0000335918 00000 n 0000336936 00000 n 0000335152 00000 n 0000334796 00000 n 0000337600 00000 n 0000337348 00000 n 0000335766 00000 n 0000336378 00000 n 0000336428 00000 n 0000336124 00000 n 0000336278 00000 n 0000335100 00000 n 0000334643 00000 n 0000335460 00000 n 0000337398 00000 n 0000336834 00000 n 0000335614 00000 n 0000336480 00000 n 0000337296 00000 n 0000335716 00000 n 0000335512 00000 n 0000336884 00000 n 0000337142 00000 n 0000334695 00000 n 0000336072 00000 n 0000336734 00000 n 0000337092 00000 n 0000335408 00000 n 0000336176 00000 n 0000335868 00000 n 0000336634 00000 n 0000336684 00000 n 0000335048 00000 n 0000337448 00000 n 0000337550 00000 n 0000334996 00000 n 0000334746 00000 n 0000336226 00000 n 0000336988 00000 n 0000336784 00000 n 0000337040 00000 n 0000334896 00000 n 0000336020 00000 n 0000335306 00000 n 0000337500 00000 n 0000335256 00000 n 0000334846 00000 n 0000336328 00000 n 0000335666 00000 n 0000334946 00000 n 0000337244 00000 n 0000335358 00000 n 0000336582 00000 n 0000333320 00000 n 0000333688 00000 n 0000334023 00000 n 0000334355 00000 n trailer <] >> startxref 337651 %%EOF openhpi-3.6.1/plugins/ilo2_ribcl/ilo2_ribcl.c0000644000175100017510000003506412575647266020074 0ustar mohanmohan/* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Shuah Khan * Richard White */ /*************** * This source file contains open, close, get_event, and discover_resources * HPI ABI routines iLO2 RIBCL plug-in implements. Other source files will * provide support functionality for these ABIs. ***************/ #include #include #include #include #include #include static SaHpiEntityPathT g_epbase; /* root entity path (from config) */ SaHpiBoolT close_handler = SAHPI_FALSE; /***************************** iLO2 RIBCL plug-in ABI Interface functions *****************************/ /** * ilo2_ribcl_open: open (initiate) instance of the iLO2 RIBCL plug-in * @handler_config: Pointer to openhpi config file. * * This function opens an instance of the iLO2 RIBCL plugin. * Detailed description: * - Reads iLO2 IP address and hostname from the configfile hash * - Reads iLO2 user name and password from the configfile hash. * - Intializes plugin internal data structures. Allocates memory * for RIBCL send/receive buffers. * - Initilaizes iLO2 RIBCL SSL module to communicate with iLO2. * - Error handling: Frees allocated memory (if any) before returning. * * Return values: * Plugin handle - normal operation. * NULL - on error. **/ void *ilo2_ribcl_open(GHashTable *handler_config, unsigned int hid, oh_evt_queue *eventq) { struct oh_handler_state *oh_handler = NULL; ilo2_ribcl_handler_t *ilo2_ribcl_handler = NULL; char *ilo2_hostname = NULL; char *ilo2_port_str = NULL; char *ilo2_user_name = NULL; char *ilo2_password = NULL; char *entity_root = NULL; int host_len = 0; int port_len = 0; int temp_len = 0; #ifdef ILO2_RIBCL_SIMULATE_iLO2_RESPONSE char *d_responsefile; size_t fnamesize; #endif /* #ifdef ILO2_RIBCL_SIMULATE_iLO2_RESPONSE */ /* check input parameters */ if (!handler_config) { err("ilo2_ribcl Open:No config file provided."); return(NULL); } else if (!hid) { err("ilo2 ribcl Open:Bad handler id passed."); return NULL; } else if (!eventq) { err("ilo2 ribcl Open:No event queue was passed."); return NULL; } /* set up entity root in g_epbase */ entity_root = (char *)g_hash_table_lookup(handler_config, "entity_root"); if(!entity_root) { err("ilo2 ribcl Open:entity root is not present"); return(NULL); } oh_encode_entitypath(entity_root, &g_epbase); /* read hostname, port string user_name, and password from the config file */ ilo2_hostname = (char *)g_hash_table_lookup(handler_config, "ilo2_ribcl_hostname"); if(!ilo2_hostname) { err("ilo2 ribcl Open:ilo2_ribcl_hostname is not specified in the config file"); return(NULL); } host_len = strlen(ilo2_hostname); if((host_len < ILO2_HOST_NAME_MIN_LEN) || (host_len > ILO2_HOST_NAME_MAX_LEN)) { err("ilo2 ribcl Open: Invalid iLO2 IP address"); return(NULL); } ilo2_port_str = (char *)g_hash_table_lookup(handler_config, "ilo2_ribcl_portstr"); if(!ilo2_port_str) { err("ilo2 ribcl Open:ilo2_ribcl_port_str is not specified in the config file"); return(NULL); } else if((port_len = strlen(ilo2_port_str)) < ILO2_MIN_PORT_STR_LEN) { err("ilo2 ribcl Open:Invalid iLO2 port"); return(NULL); } ilo2_user_name = (char *)g_hash_table_lookup(handler_config, "ilo2_ribcl_username"); if(!ilo2_user_name) { err("ilo2 ribcl Open:ilo2_ribcl_username is not specified in the config file"); return(NULL); } temp_len = strlen(ilo2_user_name); if(temp_len > ILO2_RIBCL_USER_NAME_MAX_LEN) { err("ilo2 ribcl Open:Invalid ilo2_ribcl_username - too long"); return(NULL); } else if(temp_len < ILO2_RIBCL_USER_NAME_MIN_LEN) { err("ilo2 ribcl Open:Invalid ilo2_ribcl_username - too short"); return(NULL); } ilo2_password = (char *)g_hash_table_lookup(handler_config, "ilo2_ribcl_password"); if(!ilo2_password) { err("ilo2 ribcl Open:ilo2_ribcl_password is not specified in the config file"); return(NULL); } temp_len = strlen(ilo2_password); if(temp_len > ILO2_RIBCL_PASSWORD_MAX_LEN) { err("ilo2 ribcl Open:Invalid ilo2_ribcl_password - too long"); return(NULL); } else if(temp_len < ILO2_RIBCL_PASSWORD_MIN_LEN) { err("ilo2 ribcl Open:Invalid ilo2_ribcl_password - too short"); return(NULL); } /* allocate main handler and initialize it */ oh_handler = malloc(sizeof(*oh_handler)); if(!oh_handler) { err("ilo2 ribcl Open:unable to allocate main handler"); return(NULL); } memset(oh_handler, '\0', sizeof(*oh_handler)); /* assign config to handler_config and initialize rptcache */ oh_handler->config = handler_config; oh_handler->rptcache = (RPTable *)g_malloc0(sizeof(RPTable)); if(!oh_handler->rptcache) { err("ilo2 ribcl Open:unable to allocate RPT cache"); free(oh_handler); return(NULL); } oh_handler->hid = hid; oh_handler->eventq = eventq; /* allocate memory for ilo2 ribcl private handler */ ilo2_ribcl_handler = malloc(sizeof(*ilo2_ribcl_handler)); if(!ilo2_ribcl_handler) { err("ilo2 ribcl Open:unable to allocate main handler"); free(oh_handler->rptcache); free(oh_handler); return(NULL); } memset(ilo2_ribcl_handler, '\0', sizeof(*ilo2_ribcl_handler)); ilo2_ribcl_handler->ilo_thread_data = g_malloc0(sizeof(iLO_info_t)); ilo2_ribcl_handler->ilo_thread_data->iLO_cond = wrap_g_cond_new_init(); ilo2_ribcl_handler->ilo_thread_data->iLO_mutex = wrap_g_mutex_new_init(); ilo2_ribcl_handler->ilo_thread_data->oh_handler = oh_handler; ilo2_ribcl_handler->need_rediscovery = FALSE; ilo2_ribcl_handler->discovery_complete = FALSE; oh_handler->data = ilo2_ribcl_handler; /* Save configuration in the handler */ ilo2_ribcl_handler->entity_root = entity_root; /* build complete hostname with port string appended */ /* add one extra byte to account for : in the middle of hostname:port string example: 10.100.1.1:443 */ ilo2_ribcl_handler->ilo2_hostport = g_malloc0(host_len+port_len+2); if(ilo2_ribcl_handler->ilo2_hostport == NULL) { err("ilo2 ribcl Open:unable to allocate memory"); free(ilo2_ribcl_handler); free(oh_handler->rptcache); free(oh_handler); return(NULL); } snprintf(ilo2_ribcl_handler->ilo2_hostport, (host_len+port_len+2), "%s:%s", ilo2_hostname, ilo2_port_str); ilo2_ribcl_handler->user_name = ilo2_user_name; ilo2_ribcl_handler->password = ilo2_password; /*initialize the ilo_type to NO_ILO*/ ilo2_ribcl_handler->ilo_type = NO_ILO; ilo2_ribcl_handler->iml_log_time = 0; /*hostname is needed for the HTTP 1.1 header *that will be sent to iLO3 prior to RIBCL command *submission. The max length of the hostname is *limited by ILO2_HOST_NAME_MAX_LEN, the gethostname always have a '\0' *at the end of the name, if hostname exceeds the ILO2_HOST_NAME_MAX_LEN,, *the string is truncated. In that case truncate last charactor with '\0'; *Achieved by the following statement of the gethostname. */ gethostname(ilo2_ribcl_handler->ir_hostname, ILO2_HOST_NAME_MAX_LEN); if (strlen(ilo2_ribcl_handler->ir_hostname) >= ILO2_HOST_NAME_MAX_LEN) ilo2_ribcl_handler->ir_hostname[ILO2_HOST_NAME_MAX_LEN-1] = '\0'; /*Initialize the test and the iLO3 header pointer to NULL*/ ilo2_ribcl_handler->ribcl_xml_test_hdr = NULL; ilo2_ribcl_handler->ribcl_xml_ilo3_hdr = NULL; /* Build the customized RIBCL command strings containing the * login and password for this ilo2 host */ if (ir_xml_build_cmdbufs( ilo2_ribcl_handler) != RIBCL_SUCCESS){ err("ilo2_ribcl_open(): ir_xml_build_cmdbufs" "failed to build buffers."); free(ilo2_ribcl_handler->ilo2_hostport); free(ilo2_ribcl_handler); free(oh_handler->rptcache); free(oh_handler); return(NULL); } #ifdef ILO2_RIBCL_SIMULATE_iLO2_RESPONSE /* Check if a iLO2 response file should be used for discovery testing. * We will use the contents of this file as the command response, * rather than communucating with an actual iLO2. */ d_responsefile = (char *)g_hash_table_lookup(handler_config, "discovery_responsefile"); if( d_responsefile){ fnamesize = strlen( d_responsefile) + 1; ilo2_ribcl_handler->discovery_responsefile = malloc( fnamesize); if( ilo2_ribcl_handler->discovery_responsefile == NULL){ err("ilo2_ribcl_open(): allocation for discovery_responsefile failed."); } else { strncpy( ilo2_ribcl_handler->discovery_responsefile, d_responsefile, fnamesize); } } #endif /* ILO2_RIBCL_SIMULATE_iLO2_RESPONSE */ /* initialize SSL */ ilo2_ribcl_handler->ssl_ctx = oh_ssl_ctx_init(); if(ilo2_ribcl_handler->ssl_ctx == NULL) { err("ilo2_ribcl_open(): failed to initialize ssl connection to %s", ilo2_ribcl_handler->ilo2_hostport); free(ilo2_ribcl_handler->ilo2_hostport); free(ilo2_ribcl_handler); free(oh_handler->rptcache); free(oh_handler); return(NULL); } /* Initialize sensor data */ ilo2_ribcl_init_sensor_data( ilo2_ribcl_handler); close_handler = SAHPI_FALSE; return((void *)oh_handler); } /** * ilo2_ribcl_close: * @oh_handler: Handler data pointer. * * This function closes the instance of the iLO2 RIBCL plugin specified * by the oh_handler input parameter. * Detailed description: * - Free allocated memory * - Assumption: RIBCL connection is closed after each transaction. * If this assumption is incorrect, close open SSL connections to * iLO2. * Return values: * Void **/ void ilo2_ribcl_close(void *handler) { struct oh_handler_state *oh_handler = (struct oh_handler_state *) handler; ilo2_ribcl_handler_t *ilo2_ribcl_handler; if(oh_handler == NULL) { return; } close_handler = SAHPI_TRUE; dbg("ilo2 ribcl close_handler is set"); /* Sleep so that discovery thread get this variable */ sleep(1); ilo2_ribcl_handler = (ilo2_ribcl_handler_t *) oh_handler->data; if(ilo2_ribcl_handler == NULL) { free(oh_handler); return; } g_mutex_lock(ilo2_ribcl_handler->ilo_thread_data->iLO_mutex); g_cond_broadcast(ilo2_ribcl_handler->ilo_thread_data->iLO_cond); g_mutex_unlock(ilo2_ribcl_handler->ilo_thread_data->iLO_mutex); if (ilo2_ribcl_handler->ilo_thread_data->hthread) g_thread_join(ilo2_ribcl_handler->ilo_thread_data->hthread); wrap_g_cond_free(ilo2_ribcl_handler->ilo_thread_data->iLO_cond); wrap_g_mutex_free_clear(ilo2_ribcl_handler->ilo_thread_data->iLO_mutex); g_free(ilo2_ribcl_handler->ilo_thread_data); /* Free SSL infrastructure */ oh_ssl_ctx_free(ilo2_ribcl_handler->ssl_ctx); /* Free the RIBCL command strings in the ilo2_ribcl_handler */ ir_xml_free_cmdbufs( ilo2_ribcl_handler); /* Free any allocated discovery data in the ilo2_ribcl_handler */ ilo2_ribcl_free_discoverydata( ilo2_ribcl_handler); #ifdef ILO2_RIBCL_SIMULATE_iLO2_RESPONSE /* If we specified a response file for discovery testing, * free the space we used for its namestring. */ if( ilo2_ribcl_handler->discovery_responsefile){ free( ilo2_ribcl_handler->discovery_responsefile); } #endif /* ILO2_RIBCL_SIMULATE_iLO2_RESPONSE */ oh_flush_rpt(oh_handler->rptcache); free(ilo2_ribcl_handler->ilo2_hostport); free(ilo2_ribcl_handler); free(oh_handler->rptcache); free(oh_handler); return; } /** * ilo2_ribcl_get_event: * @hnd: Handler data pointer. * @event: Infra-structure event pointer. * * Passes plugin events up to the infra-structure for processing. * * Return values: * 1 - events to be processed. * SA_OK - No events to be processed. * SA_ERR_HPI_INVALID_PARAMS - @event is NULL. **/ SaErrorT ilo2_ribcl_get_event(void *handler) { struct oh_handler_state *oh_handler = (struct oh_handler_state *) handler; ilo2_ribcl_handler_t *ilo2_ribcl_handler; if( close_handler == SAHPI_TRUE ) { INFO("ilo2_ribcl_handler is closed. Thread %p returning.", g_thread_self()); return(SA_OK); } if (!handler) { err("ilo2 ribcl get event: Invalid parameter"); return(SA_ERR_HPI_INVALID_PARAMS); } ilo2_ribcl_handler = (ilo2_ribcl_handler_t *) oh_handler->data; if(! ilo2_ribcl_handler) { err("ilo2 ribcl get event: Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } if (g_slist_length(ilo2_ribcl_handler->eventq) > 0) { struct oh_event *e = ilo2_ribcl_handler->eventq->data; e->hid = oh_handler->hid; oh_evt_queue_push(oh_handler->eventq, e); ilo2_ribcl_handler->eventq = g_slist_remove_link(ilo2_ribcl_handler->eventq, ilo2_ribcl_handler->eventq); return(ILO2_RIBCL_EVENTS_PENDING); } /* No events for infrastructure to process */ return(SA_OK); } /***************************** OpenHPI plug-in to iLO2 RIBCL plug-in ABI function mapping *****************************/ void * oh_open (GHashTable *, unsigned int, oh_evt_queue *) __attribute__ ((weak, alias("ilo2_ribcl_open"))); void * oh_close (void *) __attribute__ ((weak, alias("ilo2_ribcl_close"))); void * oh_get_event (void *) __attribute__ ((weak, alias("ilo2_ribcl_get_event"))); openhpi-3.6.1/plugins/ilo2_ribcl/Makefile.am0000644000175100017510000000503512575647266017737 0ustar mohanmohan# # Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP # All rights reserved. # # Redistribution and use in source and binary forms, with or # without modification, are permitted provided that the following # conditions are met: # # Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the distribution. # # Neither the name of the Hewlett-Packard Corporation, nor the names # of its contributors may be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, # OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # Author(s) # Shuah Khan # Richard White # MAINTAINERCLEANFILES = Makefile.in AM_CPPFLAGS = -DG_LOG_DOMAIN=\"ilo2_ribcl\" AM_CPPFLAGS += @OPENHPI_INCLUDES@ @XML2_INCLUDE@ @OH_SSL_INCLUDES@ pkglib_LTLIBRARIES = libilo2_ribcl.la EXTRA_DIST = \ OpenHPI_ProLiant_DevGuide.pdf libilo2_ribcl_la_SOURCES = \ ilo2_ribcl.c \ ilo2_ribcl.h \ ilo2_ribcl_discover.c \ ilo2_ribcl_discover.h \ ilo2_ribcl_idr.c \ ilo2_ribcl_idr.h \ ilo2_ribcl_reset.c \ ilo2_ribcl_power.c \ ilo2_ribcl_control.c \ ilo2_ribcl_rpt.c \ ilo2_ribcl_sensor.c \ ilo2_ribcl_sensor.h \ ilo2_ribcl_ssl.c \ ilo2_ribcl_ssl.h \ ilo2_ribcl_xml.c \ ilo2_ribcl_xml.h \ ilo2_ribcl_cmnds.h \ ilo2_ribcl_hotswap.c \ ilo2_ribcl_hotswap.h libilo2_ribcl_la_LIBADD = @SSL_LIB@ @XML2_LIB@ $(top_builddir)/utils/libopenhpiutils.la libilo2_ribcl_la_LDFLAGS = -module -version-info @HPI_LIB_VERSION@ openhpi-3.6.1/plugins/ilo2_ribcl/ilo2_ribcl_reset.c0000644000175100017510000002017512575647266021273 0ustar mohanmohan/* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Shuah Khan * Richard White */ /*************** * This source file contains Reset HPI ABI routines iLO2 RIBCL plug-in * implements. Other source files provide support functionality for * these ABIs. ***************/ #include #include #include /***************************** iLO2 RIBCL plug-in Reset ABI Interface functions *****************************/ /** * ilo2_ribcl_get_reset_state: * @hnd: Handler data pointer. * @rid: Resource ID. * @act: Location to store resource's reset action state. * * Retrieves a resource's reset action state. If the resource has * SAHPI_CAPABILITY_RESET, then returns SAHPI_RESET_DEASSERT as * ProLiant Rack Mount Server doesn't support hold in reset. * ProLiant Rack Mount Server doesn't support pulsed reset. Devices * that supprt pulsed reset can be held in reset for a specified * perid of time using SAHPI_RESET_ASSERT followed by a * SAHPI_RESET_DEASSERT. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_RESET. * SA_ERR_HPI_INVALID_RESOURCE - Resource doesn't exist. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT ilo2_ribcl_get_reset_state(void *hnd, SaHpiResourceIdT rid, SaHpiResetActionT *act) { struct oh_handler_state *handle; ilo2_ribcl_handler_t *ilo2_ribcl_handler = NULL; SaHpiRptEntryT *rpt; if (!hnd || !act) { err("ilo2_ribcl_get_reset_state(): Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } handle = (struct oh_handler_state *)hnd; ilo2_ribcl_handler = (ilo2_ribcl_handler_t *)handle->data; if (!ilo2_ribcl_handler) { err("ilo2_ribcl_get_reset_state(): Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } /* Check if resource exists and has reset capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_RESET)) { return(SA_ERR_HPI_CAPABILITY); } /* ProLiant Rack Mount Server doesn't support holding in reset Return SAHPI_RESET_DEASSERT */ *act = SAHPI_RESET_DEASSERT; return(SA_OK); } /** * ilo2_ribcl_set_reset_state: * @hnd: Handler data pointer. * @rid: Resource ID. * @act: Reset action state to set. * * Sets a resource's reset action state. * Retrieves a resource's reset action state. If the resource has * SAHPI_CAPABILITY_RESET then sends RESET_SERVER RIBCL command to iLO2 * to do a warm reset the system and a COLD_BOOT_SERVER commad to do a * cold reset. Please note that this command doesn't bring the system and * (OS running on it down gracefully. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_RESET. * SA_ERR_HPI_INVALID_CMD - Resource doesn't support SAHPI_RESET_ASSERT. * SA_ERR_HPI_INVALID_CMD - Resource doesn't support SAHPI_RESET_DEASSERT. * SA_ERR_HPI_INVALID_RESOURCE - Resource doesn't exist. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL; @act invalid. **/ SaErrorT ilo2_ribcl_set_reset_state(void *hnd, SaHpiResourceIdT rid, SaHpiResetActionT act) { struct oh_handler_state *handle; ilo2_ribcl_handler_t *ilo2_ribcl_handler = NULL; SaHpiRptEntryT *rpt; char *srs_cmd; char *response; /* command response buffer */ char *new_response = NULL; int ret; if (!hnd || NULL == oh_lookup_resetaction(act)){ err("ilo2_ribcl_set_reset_state(): Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } /* ProLiant Rack Mount Server doesn't support pulsed reset. Devices that supprt pulsed reset can be held in reset for a specified perid of time using SAHPI_RESET_ASSERT followed by a SAHPI_RESET_DEASSERT. Both cold and warm reset actions initiare an ungraceful shutdown and will bring the server down even without notifying the OS. */ if (act == SAHPI_RESET_ASSERT || act == SAHPI_RESET_DEASSERT) { return(SA_ERR_HPI_INVALID_CMD); } if (act != SAHPI_COLD_RESET && act != SAHPI_WARM_RESET) { return(SA_ERR_HPI_INVALID_CMD); } handle = (struct oh_handler_state *)hnd; ilo2_ribcl_handler = (ilo2_ribcl_handler_t *)handle->data; if (!ilo2_ribcl_handler) { err("ilo2_ribcl_set_reset_state(): Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } /* Check if resource exists and has reset capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_RESET)) { return(SA_ERR_HPI_CAPABILITY); } /* Allocate a temporary response buffer. */ response = malloc(ILO2_RIBCL_BUFFER_LEN); if( response == NULL){ err("ilo2_ribcl_set_reset_state: failed to allocate resp buffer."); return( SA_ERR_HPI_OUT_OF_MEMORY); } /* Retrieve our customized command buffer */ if(act == SAHPI_COLD_RESET) { srs_cmd = ilo2_ribcl_handler->ribcl_xml_cmd[ IR_CMD_COLD_BOOT_SERVER]; } else { srs_cmd = ilo2_ribcl_handler->ribcl_xml_cmd [IR_CMD_RESET_SERVER]; } if( srs_cmd == NULL){ err("ilo2_ribcl_set_reset_state: null customized command."); free( response); return( SA_ERR_HPI_INTERNAL_ERROR); } /* Send the command to iLO2 and get the response. */ ret = ilo2_ribcl_ssl_send_command( ilo2_ribcl_handler, srs_cmd, response, ILO2_RIBCL_BUFFER_LEN); if( ret != 0){ err("ilo2_ribcl_set_reset_state: command send failed."); free( response); return( SA_ERR_HPI_INTERNAL_ERROR); } switch(ilo2_ribcl_handler->ilo_type){ case ILO: case ILO2: /* Now parse the response.*/ ret = ir_xml_parse_reset_server(response, ilo2_ribcl_handler->ilo2_hostport); break; case ILO3: case ILO4: new_response = ir_xml_decode_chunked(response); ret = ir_xml_parse_reset_server(new_response, ilo2_ribcl_handler->ilo2_hostport); break; default: err("ilo2_ribcl_do_discovery():" "failed to detect ilo type."); } free( response); free( new_response); if(ret == -1) { err("ilo2_ribcl_set_reset_state: iLO2 returned error."); return( SA_ERR_HPI_INTERNAL_ERROR); } return(SA_OK); } /***************************** OpenHPI plug-in to iLO2 RIBCL plug-in ABI function mapping *****************************/ void * oh_get_reset_state (void *, SaHpiResourceIdT, SaHpiResetActionT *) __attribute__ ((weak, alias("ilo2_ribcl_get_reset_state"))); void * oh_set_reset_state (void *, SaHpiResourceIdT, SaHpiResetActionT) __attribute__ ((weak, alias("ilo2_ribcl_set_reset_state"))); openhpi-3.6.1/plugins/ilo2_ribcl/ilo2_ribcl_cmnds.h0000644000175100017510000002541612575647266021265 0ustar mohanmohan/* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Shuah Khan * Richard White */ #ifndef _INC_ILO2_RIBCL_CMNDS_H_ #define _INC_ILO2_RIBCL_CMNDS_H_ /*************** * This header file contains all of the iLO2 RIBLC command denfinitions. ***************/ /* * XML header definition. iLO2 requires that this header be sent at the * start of every RIBCL transation. The XML header ensures the connection * is an XML connection, not an HTTP connection. */ #define ILO2_RIBCL_XML_HDR "\r\n" #define ILO3_RIBCL_XML_HDR "POST /ribcl HTTP/1.1\r\nHOST: %s\r\n\ TE: chunked\r\nConnection: Close\r\nContent-length: %s\r\n\r\n" #define ILO_RIBCL_XML_TEST_HDR ILO3_RIBCL_XML_HDR #define ILO_RIBCL_TEST_ILO "\r\n" #define ILO_RIBCL_TEST_RESPONSE "HTTP/1.1 200 OK\r\n" /* Here are all the RIBCL xml templates for the commands. For each command, * we have a format specification string that allows us to insert the * login and password strings for individual systems. Also, each command * has an assocoated macro value that gives its unique index for use in * command arrays. When you add a template, make sure to increment * IR_NUM_COMMANDS and add code to ir_xml_build_cmdbufs() in file * ilo2_ribcl_xml.c. */ #define IR_NUM_COMMANDS 25 /* * GET_SERVER_DATA command. * This is a combination of the RIBCL GET_HOST_DATA, GET_EMBEDDED_HEALTH, * and GET_FW_VERSION commands. * These three commands are sent in one single transation to get * complete server information including fans, temp sensors, cpus, dimms, * power supplies, VRMs, and I/O slots. The following define combines and * embedds the GET_HOST_DATA, GET_EMBEDDED_HEALTH and GET_FW_VERSION commands * within a single LOGIN block. */ #define IR_CMD_GET_SERVER_DATA 0 #define ILO2_RIBCL_GET_SERVER_DATA " \r\n" /* * GET_HOST_POWER_STATUS command */ #define IR_CMD_GET_HOST_POWER_STATUS 1 #define ILO2_RIBCL_GET_HOST_POWER_STATUS " \r\n" /* * SET_HOST_POWER commands */ #define IR_CMD_SET_HOST_POWER_ON 2 #define ILO2_RIBCL_SET_HOST_POWER_ON " \r\n" #define IR_CMD_SET_HOST_POWER_OFF 3 #define ILO2_RIBCL_SET_HOST_POWER_OFF " \r\n" /* * RESET_SERVER command */ #define IR_CMD_RESET_SERVER 4 #define ILO2_RIBCL_RESET_SERVER " \r\n" /* * COLD_BOOT_SERVER command */ #define IR_CMD_COLD_BOOT_SERVER 5 #define ILO2_RIBCL_COLD_BOOT_SERVER " \r\n" /* * GET_UID_STATUS command */ #define IR_CMD_GET_UID_STATUS 6 #define ILO2_RIBCL_GET_UID_STATUS " \r\n" /* * UID_CONTROL commands */ #define IR_CMD_UID_CONTROL_OFF 7 #define ILO2_RIBCL_UID_CONTROL_OFF " \r\n" #define IR_CMD_UID_CONTROL_ON 8 #define ILO2_RIBCL_UID_CONTROL_ON " \r\n" /* * GET_HOST_POWER_SAVER_STATUS command */ #define IR_CMD_GET_HOST_POWER_SAVER_STATUS 9 #define ILO2_RIBCL_GET_HOST_POWER_SAVER_STATUS " \r\n" /* * SET_HOST_POWER_SAVER commands */ #define IR_CMD_SET_HOST_POWER_SAVER_1 10 #define ILO2_RIBCL_SET_HOST_POWER_SAVER_1 " \r\n" #define IR_CMD_SET_HOST_POWER_SAVER_2 11 #define ILO2_RIBCL_SET_HOST_POWER_SAVER_2 " \r\n" #define IR_CMD_SET_HOST_POWER_SAVER_3 12 #define ILO2_RIBCL_SET_HOST_POWER_SAVER_3 " \r\n" #define IR_CMD_SET_HOST_POWER_SAVER_4 13 #define ILO2_RIBCL_SET_HOST_POWER_SAVER_4 " \r\n" #define IR_CMD_GET_SERVER_AUTO_PWR 14 #define ILO2_RIBCL_GET_SERVER_AUTO_PWR " \r\n" /* Enable automatic power on with a minimum delay. */ #define IR_CMD_SERVER_AUTO_PWR_YES 15 #define ILO2_RIBCL_SERVER_AUTO_PWR_YES " \r\n" /* Disable automatic power on. */ #define IR_CMD_SERVER_AUTO_PWR_NO 16 #define ILO2_RIBCL_SERVER_AUTO_PWR_NO " \r\n" /* Enable automatic power on with 15 seconds delay. */ #define IR_CMD_SERVER_AUTO_PWR_15 17 #define ILO2_RIBCL_SERVER_AUTO_PWR_15 " \r\n" /* Enable automatic power on with 30 seconds delay. */ #define IR_CMD_SERVER_AUTO_PWR_30 18 #define ILO2_RIBCL_SERVER_AUTO_PWR_30 " \r\n" /* Enable automatic power on with 45 seconds delay. */ #define IR_CMD_SERVER_AUTO_PWR_45 19 #define ILO2_RIBCL_SERVER_AUTO_PWR_45 " \r\n" /* Enable automatic power on with 60 seconds delay. */ #define IR_CMD_SERVER_AUTO_PWR_60 20 #define ILO2_RIBCL_SERVER_AUTO_PWR_60 " \r\n" /* Enable automatic power on with random delay up to 60 seconds. */ #define IR_CMD_SERVER_AUTO_PWR_RANDOM 21 #define ILO2_RIBCL_SERVER_AUTO_PWR_RANDOM " \r\n" /* Enable automatic power on with restore. */ #define IR_CMD_SERVER_AUTO_PWR_RESTORE 22 #define ILO2_RIBCL_SERVER_AUTO_PWR_RESTORE " \r\n" /* Always Remain Off automatic power on. */ #define IR_CMD_SERVER_AUTO_PWR_OFF 23 #define ILO2_RIBCL_SERVER_AUTO_PWR_OFF " \r\n" /* GET_EVENT_LOG command for IML. */ #define IR_CMD_GET_EVENT_LOG 24 #define ILO2_RIBCL_GET_EVENT_LOG " \r\n" #endif /*_INC_ILO2_RIBCL_CMNDS_H_*/ openhpi-3.6.1/plugins/ilo2_ribcl/ilo2_ribcl_idr.h0000644000175100017510000000550212575647266020731 0ustar mohanmohan/* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Shuah Khan * Richard White */ #ifndef _INC_ILO2_RIBCL_IDR_H_ #define _INC_ILO2_RIBCL_IDR_H_ /* These are the functions exported by ilo2_ribcl_idr.c for other modules * to use. */ extern SaErrorT ilo2_ribcl_add_idr( struct oh_handler_state *, struct oh_event *, SaHpiIdrIdT, struct ilo2_ribcl_idr_info *, char *); extern void ilo2_ribcl_discover_chassis_idr( struct oh_handler_state *, struct oh_event *, char *); extern void ilo2_ribcl_update_fru_idr( struct oh_handler_state *, SaHpiEntityPathT *, struct ilo2_ribcl_idr_info *); extern void ilo2_ribcl_update_chassis_idr( struct oh_handler_state *, SaHpiEntityPathT *); extern void ilo2_ribcl_build_chassis_idr( ilo2_ribcl_handler_t *, struct ilo2_ribcl_idr_info *); extern void ilo2_ribcl_build_cpu_idr( ilo2_ribcl_handler_t *ir_handler, struct ilo2_ribcl_idr_info *); extern void ilo2_ribcl_build_memory_idr( ir_memdata_t *, struct ilo2_ribcl_idr_info *); #endif /* _INC_ILO2_RIBCL_IDR_H_ */ openhpi-3.6.1/plugins/ilo2_ribcl/ilo2_ribcl_xml.c0000644000175100017510000031461212575647266020753 0ustar mohanmohan/* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Shuah Khan * Richard White */ /***************************** * This file implements the iLO2 RIBCL plug-in XML functionality and provides * functions to parse XML responses from RIBCL. Uses libxml2 * *****************************/ #include #include #include #include #include #include #include #include #include #include #include /* forward declarations */ static xmlNodePtr ir_xml_find_node( xmlNodePtr, char *); static int ir_xml_checkresults_doc( xmlDocPtr, char *); static int ir_xml_scan_response( xmlNodePtr, char *); static char *ir_xml_convert_buffer( char*, int *); static xmlDocPtr ir_xml_doparse( char *); static int ir_xml_scan_fans( ilo2_ribcl_handler_t *, xmlNodePtr); static int ir_xml_record_fandata( ilo2_ribcl_handler_t *, char *, char *, char *, char *, char *); static int ir_xml_scan_temperature( ilo2_ribcl_handler_t *, xmlNodePtr); static int ir_xml_record_temperaturedata( ilo2_ribcl_handler_t *, char *, char *,char *, char *, char *, char *, char *, char *, char *, int); static void ir_xml_scan_firmware_revision(ilo2_ribcl_handler_t *, xmlNodePtr); static int ir_xml_scan_vrm( ilo2_ribcl_handler_t *, xmlNodePtr); static int ir_xml_record_vrmdata( ilo2_ribcl_handler_t *, char *, char *); static int ir_xml_scan_power( ilo2_ribcl_handler_t *, xmlNodePtr); static int ir_xml_record_psdata( ilo2_ribcl_handler_t *, char *, char *); static int ir_xml_scan_health_at_a_glance( ilo2_ribcl_handler_t *, xmlNodePtr); static int ir_xml_stat_to_reading( char *); static int ir_xml_scan_smbios_1( ilo2_ribcl_handler_t *, xmlNodePtr); static int ir_xml_scan_smbios_4( ilo2_ribcl_handler_t *, xmlNodePtr); static int ir_xml_scan_smbios_17( ilo2_ribcl_handler_t *, xmlNodePtr, int *); static int ir_xml_record_memdata( ilo2_ribcl_handler_t *, int *, char *, char *, char *); static xmlChar *ir_xml_smb_get_value( char *, xmlNodePtr); static int ir_xml_insert_logininfo( char *, int, char *, char *, char *); static int ir_xml_extract_index( char *, char *, int); static int ir_xml_replacestr( char **, char *); static int ir_xml_iml_write( struct oh_handler_state*,xmlNodePtr); static SaErrorT ilo2_ribcl_iml_event( xmlNodePtr n,char *host, struct oh_handler_state*, SaHpiEntityPathT *, char *severity, SaHpiTimeT sec); /* Error return values for ir_xml_extract_index */ #define IR_NO_PREFIX -1 #define IR_NO_INDEX -2 /* array containing all the RIBCL xml command templates */ char *ir_xml_cmd_templates[] = { [IR_CMD_GET_SERVER_DATA] ILO2_RIBCL_GET_SERVER_DATA, [IR_CMD_GET_HOST_POWER_STATUS] ILO2_RIBCL_GET_HOST_POWER_STATUS, [IR_CMD_SET_HOST_POWER_ON] ILO2_RIBCL_SET_HOST_POWER_ON, [IR_CMD_SET_HOST_POWER_OFF] ILO2_RIBCL_SET_HOST_POWER_OFF, [IR_CMD_RESET_SERVER] ILO2_RIBCL_RESET_SERVER, [IR_CMD_COLD_BOOT_SERVER] ILO2_RIBCL_COLD_BOOT_SERVER, [IR_CMD_GET_UID_STATUS] ILO2_RIBCL_GET_UID_STATUS, [IR_CMD_UID_CONTROL_OFF] ILO2_RIBCL_UID_CONTROL_OFF, [IR_CMD_UID_CONTROL_ON] ILO2_RIBCL_UID_CONTROL_ON, [IR_CMD_GET_HOST_POWER_SAVER_STATUS] ILO2_RIBCL_GET_HOST_POWER_SAVER_STATUS, [IR_CMD_SET_HOST_POWER_SAVER_1] ILO2_RIBCL_SET_HOST_POWER_SAVER_1, [IR_CMD_SET_HOST_POWER_SAVER_2] ILO2_RIBCL_SET_HOST_POWER_SAVER_2, [IR_CMD_SET_HOST_POWER_SAVER_3] ILO2_RIBCL_SET_HOST_POWER_SAVER_3, [IR_CMD_SET_HOST_POWER_SAVER_4] ILO2_RIBCL_SET_HOST_POWER_SAVER_4, [IR_CMD_GET_SERVER_AUTO_PWR] ILO2_RIBCL_GET_SERVER_AUTO_PWR, [IR_CMD_SERVER_AUTO_PWR_YES] ILO2_RIBCL_SERVER_AUTO_PWR_YES, [IR_CMD_SERVER_AUTO_PWR_NO] ILO2_RIBCL_SERVER_AUTO_PWR_NO, [IR_CMD_SERVER_AUTO_PWR_15] ILO2_RIBCL_SERVER_AUTO_PWR_15, [IR_CMD_SERVER_AUTO_PWR_30] ILO2_RIBCL_SERVER_AUTO_PWR_30, [IR_CMD_SERVER_AUTO_PWR_45] ILO2_RIBCL_SERVER_AUTO_PWR_45, [IR_CMD_SERVER_AUTO_PWR_60] ILO2_RIBCL_SERVER_AUTO_PWR_60, [IR_CMD_SERVER_AUTO_PWR_RANDOM] ILO2_RIBCL_SERVER_AUTO_PWR_RANDOM, [IR_CMD_SERVER_AUTO_PWR_RESTORE] ILO2_RIBCL_SERVER_AUTO_PWR_RESTORE, [IR_CMD_SERVER_AUTO_PWR_OFF] ILO2_RIBCL_SERVER_AUTO_PWR_OFF, [IR_CMD_GET_EVENT_LOG] ILO2_RIBCL_GET_EVENT_LOG }; /** * ir_xml_parse_status * @ribcl_outbuf: Ptr to a buffer containing the raw output from any RIBCL cmd. * @ilostr: String to identify a particular iLO2 in error messages. * * Parses the output of any RIBCL command and examines the STATUS attributes * of all RIBCL sections. This is the routine to call if the RIBCL command * you're using returns no other data that you want to collect and you are * only interested in the command's status. * * Return value: RIBCL_SUCCESS if all STATUS attributes in the document * have a value of zero, otherwise the first non zero value * encountered or -1 if the document has no STATUS attributes. **/ int ir_xml_parse_status( char *ribcl_outbuf, char *ilostr) { xmlDocPtr doc; int status; doc = ir_xml_doparse( ribcl_outbuf); if( doc == NULL){ return( -1); } status = ir_xml_checkresults_doc( doc, ilostr); if( status != RIBCL_SUCCESS){ err("ir_xml_parse_status(): Unsuccessful RIBCL status."); } xmlFreeDoc( doc); return( status); } /* end ir_xml_parse_status() */ /** * ir_xml_parse_emhealth * @ir_handler: Ptr to this instance's custom handler. * @ribcl_outbuf: Ptr to the raw RIBCL output from the GET_EMBEDDED_HEALTH cmd * * Parses the output of the RIBCL GET_EMBEDDED_HEALTH command, and enters * data about the discovered resources into the DiscoveryData structure * within our private handler. The following resources are detected: * Fans * Temperature Sensors * Voltage Regulator Modules * Power Supplies. * * Return value: RIBCL_SUCCESS on success, -1 if error. **/ int ir_xml_parse_emhealth( ilo2_ribcl_handler_t *ir_handler, char *ribcl_outbuf) { xmlDocPtr doc; xmlNodePtr eh_data_node; /* Convert the RIBCL command output into a single XML document, * and the use the libxml2 parser to create an XML doc tree. */ doc = ir_xml_doparse( ribcl_outbuf); if( doc == NULL){ return( -1); } /* Check all RESULTS sections in the output for a status value * of zero, which indicates success. */ if( ir_xml_checkresults_doc( doc, ir_handler->ilo2_hostport) != RIBCL_SUCCESS){ err("ir_xml_parse_emhealth(): Unsuccessful RIBCL status."); xmlFreeDoc( doc); return( -1); } /* Locate the GET_EMBEDDED_HEALTH_DATA subtree. It will contain * the useful results of the command. */ eh_data_node = ir_xml_find_node( xmlDocGetRootElement(doc), "GET_EMBEDDED_HEALTH_DATA"); if( eh_data_node == NULL){ err("ir_xml_parse_emhealth(): GET_EMBEDDED_HEALTH_DATA element not found."); xmlFreeDoc( doc); return( -1); } /* Extract data for fans */ if( ir_xml_scan_fans( ir_handler, eh_data_node) != RIBCL_SUCCESS){ xmlFreeDoc( doc); return( -1); } /* extract data for voltage reg modules */ if( ir_xml_scan_vrm( ir_handler, eh_data_node) != RIBCL_SUCCESS){ xmlFreeDoc( doc); return( -1); } /* extract data for power supplies */ if( ir_xml_scan_power( ir_handler, eh_data_node) != RIBCL_SUCCESS){ xmlFreeDoc( doc); return( -1); } /* Extract data for temp sensors */ if( ir_xml_scan_temperature( ir_handler, eh_data_node) != RIBCL_SUCCESS){ xmlFreeDoc( doc); return( -1); } xmlFreeDoc( doc); return( RIBCL_SUCCESS); } /* end ir_xml_parse_emhealth() */ /** * ir_xml_parse_discoveryinfo * @ir_handler: Ptr to this instance's custom handler. * @ribcl_outbuf: Ptr to a buffer containing raw RIBCL output from the cmds * * Parses the combined output of the RIBCL GET_EMBEDDED_HEALTH * and GET_HOST_DATA commands. When you have a single buffer containing output * from both commands, this routine is more efficient than calling * ir_xml_parse_emhealth() and ir_xml_parse_hostdata() separately. Here, the * xml parser is only invoked once. * * Data about the discovered resources are entered into the DiscoveryData * structure within our private handler. The following resources are detected: * Product name and serial number * Memory Modules * CPUs * Fans * Temperature Sensors * Voltage Regulator Modules * Power Supplies. * * Return value: RIBCL_SUCCESS on success, -1 if error. **/ int ir_xml_parse_discoveryinfo( ilo2_ribcl_handler_t *ir_handler, char *ribcl_outbuf) { xmlDocPtr doc; xmlNodePtr h_node; xmlChar *typ; int mem_slotindex; int ret; /* Convert the RIBCL command output into a single XML document, * and the use the libxml2 parser to create an XML doc tree. */ doc = ir_xml_doparse( ribcl_outbuf); if( doc == NULL){ return( -1); } /* Check all RESULTS sections in the output for a status value * of zero, which indicates success. */ if( ir_xml_checkresults_doc( doc, ir_handler->ilo2_hostport) != RIBCL_SUCCESS){ err("ir_xml_parse_discoveryinfo(): Unsuccessful RIBCL status."); xmlFreeDoc( doc); return( -1); } /* First, we parse the output from the GET_HOST_DATA * RIBCL command */ h_node = ir_xml_find_node( xmlDocGetRootElement(doc), "GET_HOST_DATA"); if( h_node == NULL){ err("ir_xml_parse_discoveryinfo(): GET_HOST_DATA element not found."); xmlFreeDoc( doc); return( -1); } /* Since we can have multiple processors and memory modules, * each within their own SMBIOS_RECORD, we must iterate over * all of them, rather that calling ir_xml_find_node() */ h_node = h_node->xmlChildrenNode; mem_slotindex = 1; while( h_node != NULL){ if(!xmlStrcmp( h_node->name, (const xmlChar *)"SMBIOS_RECORD")){ ret = RIBCL_SUCCESS; typ = xmlGetProp( h_node, (const xmlChar *)"TYPE"); if( !xmlStrcmp( typ, (const xmlChar *)"1")){ /* Scan type 1 node for product name */ ret = ir_xml_scan_smbios_1( ir_handler, h_node); } else if( !xmlStrcmp( typ, (const xmlChar *)"4")){ /* Scan type 4 node for processor info */ ret = ir_xml_scan_smbios_4( ir_handler, h_node); } else if( !xmlStrcmp( typ, (const xmlChar *)"17")){ /* Scan type 17 node for memory */ ret = ir_xml_scan_smbios_17( ir_handler, h_node, &mem_slotindex); } if( ret != RIBCL_SUCCESS){ xmlFreeDoc( doc); return( -1); } } /* end if name == "SMBIOS_RECORD" */ h_node = h_node->next; } /* end while h_node != NULL */ /* Now we parse the output from the GET_EMBEDDED_HEALTH_DATA * RIBCL command */ h_node = ir_xml_find_node( xmlDocGetRootElement(doc), "GET_EMBEDDED_HEALTH_DATA"); if( h_node == NULL){ err("ir_xml_parse_discoveryinfo(): GET_EMBEDDED_HEALTH_DATA element not found."); xmlFreeDoc( doc); return( -1); } /* Extract data for fans */ if( ir_xml_scan_fans( ir_handler, h_node) != RIBCL_SUCCESS){ xmlFreeDoc( doc); return( -1); } /* Extract data for voltage reg modules */ if( ir_xml_scan_vrm( ir_handler, h_node) != RIBCL_SUCCESS){ xmlFreeDoc( doc); return( -1); } /* Extract data for power supplies */ if( ir_xml_scan_power( ir_handler, h_node) != RIBCL_SUCCESS){ xmlFreeDoc( doc); return( -1); } /* Extract data for health_at_a_glance sensors */ if( ir_xml_scan_health_at_a_glance( ir_handler, h_node) != RIBCL_SUCCESS){ xmlFreeDoc( doc); return( -1); } /* Extract data for temp sensors */ if( ir_xml_scan_temperature( ir_handler, h_node) != RIBCL_SUCCESS){ xmlFreeDoc( doc); return( -1); } /* Extract firmware revision information */ /* Now we parse the output from the GET_FW_VERSION RIBCL command */ h_node = ir_xml_find_node( xmlDocGetRootElement(doc), "GET_FW_VERSION"); if( h_node == NULL){ err("ir_xml_parse_discoveryinfo(): GET_FW_VERSION element not found."); xmlFreeDoc( doc); return( -1); } ir_xml_scan_firmware_revision( ir_handler, h_node); xmlFreeDoc( doc); return( RIBCL_SUCCESS); } /* end ir_xml_parse_discoveryinfo() */ /** * ir_xml_parse_hostdata * @ir_handler: Ptr to this instance's custom handler. * @ribcl_outbuf: Ptr to the raw RIBCL output from the GET_EMBEDDED_HEALTH cmd * * Parses the output of the RIBCL GET_EMBEDDED_HEALTH command, and enters * data about the discovered resources into the DiscoveryData structure * within our private handler. The following resources are detected: * Product name and serial number * Memory Modules * CPUs * * Return value: RIBCL_SUCCESS on success, -1 if error. **/ int ir_xml_parse_hostdata( ilo2_ribcl_handler_t *ir_handler, char *ribcl_outbuf) { xmlDocPtr doc; xmlNodePtr hd_node; xmlChar *typ; int mem_slotindex; int ret; /* Convert the RIBCL command output into a single XML document, * and the use the libxml2 parser to create an XML doc tree. */ doc = ir_xml_doparse( ribcl_outbuf); if( doc == NULL){ return( -1); } /* Check all RESULTS sections in the output for a status value * of zero, which indicates success. */ if( ir_xml_checkresults_doc( doc, ir_handler->ilo2_hostport) != RIBCL_SUCCESS){ err("ir_xml_parse_hostdata(): Unsuccessful RIBCL status."); xmlFreeDoc( doc); return( -1); } /* Locate the GET_HOST_DATA subtree. It will contain * the useful results of the command. */ hd_node = ir_xml_find_node( xmlDocGetRootElement(doc), "GET_HOST_DATA"); if( hd_node == NULL){ err("ir_xml_parse_hostdata(): GET_HOST_DATA element not found."); xmlFreeDoc( doc); return( -1); } /* Since we can have multiple processors and memory modules, * each within their own SMBIOS_RECORD, we must iterate over * all of them, rather that calling ir_xml_find_node() */ hd_node = hd_node->xmlChildrenNode; mem_slotindex = 1; while( hd_node != NULL){ if(!xmlStrcmp( hd_node->name, (const xmlChar *)"SMBIOS_RECORD")){ ret = RIBCL_SUCCESS; typ = xmlGetProp( hd_node, (const xmlChar *)"TYPE"); if( !xmlStrcmp( typ, (const xmlChar *)"1")){ /* Scan type 1 node for product name */ ret = ir_xml_scan_smbios_1( ir_handler, hd_node); } else if( !xmlStrcmp( typ, (const xmlChar *)"4")){ /* Scan type 4 node for processor info */ ret = ir_xml_scan_smbios_4( ir_handler, hd_node); } else if( !xmlStrcmp( typ, (const xmlChar *)"17")){ /* Scan type 17 node for memory */ ret = ir_xml_scan_smbios_17( ir_handler, hd_node, &mem_slotindex); } if( ret != RIBCL_SUCCESS){ xmlFreeDoc( doc); return( -1); } } /* end if name == "SMBIOS_RECORD" */ hd_node = hd_node->next; } /* end while hd_node != NULL */ xmlFreeDoc( doc); return( RIBCL_SUCCESS); } /* end ir_xml_parse_hostdata() */ /** * ir_xml_parse_host_power_status * @ribcl_outbuf: Ptr to the raw RIBCL output from the GET_HOST_POWER_STATUS * cmd * @power_status: pointer to int to return the parsed power status. * @ilostr: String to identify a particular iLO2 in error messages. * * Parses the output of the RIBCL GET_HOST_POWER_STATUS command, and returns * current power status of the server. * * Return value: RIBCL_SUCCESS on success, -1 if error. **/ int ir_xml_parse_host_power_status(char *ribcl_outbuf, int *power_status, char *ilostr) { xmlDocPtr doc; xmlNodePtr data_node; xmlChar *status = NULL; /* Convert the RIBCL command output into a single XML document, * and the use the libxml2 parser to create an XML doc tree. */ doc = ir_xml_doparse( ribcl_outbuf); if( doc == NULL){ err("ir_xml_parse_host_power_status(): Null doc returned."); return( -1); } /* Check all RESULTS sections in the output for a status value * of zero, which indicates success. */ if( ir_xml_checkresults_doc( doc, ilostr) != RIBCL_SUCCESS){ err("ir_xml_parse_host_power_status(): Unsuccessful RIBCL status."); xmlFreeDoc( doc); return( -1); } /* Locate the GET_HOST_POWER_STATUS subtree. It will contain * the useful results of the command. */ data_node = ir_xml_find_node( xmlDocGetRootElement(doc), "GET_HOST_POWER"); if( data_node == NULL){ err("ir_xml_parse_host_power_status(): GET_HOST_POWER element not found."); xmlFreeDoc( doc); return( -1); } status = xmlGetProp( data_node, (const xmlChar *)"HOST_POWER"); if(status == NULL) { err("ir_xml_parse_host_power_status(): HOST_POWER not found."); xmlFreeDoc( doc); return(-1); } if(xmlStrcmp(status, (const xmlChar *)"ON") == 0) { *power_status = ILO2_RIBCL_POWER_ON; } else if(xmlStrcmp(status, (const xmlChar *)"OFF") == 0) { *power_status = ILO2_RIBCL_POWER_OFF; } else { xmlFree( status); xmlFreeDoc( doc); err("ir_xml_parse_host_power_status(): Unknown power status."); return(-1); } xmlFree( status); xmlFreeDoc( doc); return( RIBCL_SUCCESS); } /* end ir_xml_parse_host_power_status() */ /** * ir_xml_parse_uid_status * @ribcl_outbuf: Ptr to the raw RIBCL output from the GET_UID_STATUS cmd * @uid_status: pointer to int to return the parsed uid status. * @ilostr: String to identify a particular iLO2 in error messages. * * Parses the output of the RIBCL GET_UID_STATUS command, and returns * current UID status. * * Return value: RIBCL_SUCCESS on success, -1 if error. **/ int ir_xml_parse_uid_status(char *ribcl_outbuf, int *uid_status, char *ilostr) { xmlDocPtr doc; xmlNodePtr data_node; xmlChar *status = NULL; /* Convert the RIBCL command output into a single XML document, * and the use the libxml2 parser to create an XML doc tree. */ doc = ir_xml_doparse( ribcl_outbuf); if( doc == NULL){ err("ir_xml_parse_uid_status(): Null doc returned."); return( -1); } /* Check all RESULTS sections in the output for a status value * of zero, which indicates success. */ if( ir_xml_checkresults_doc( doc, ilostr) != RIBCL_SUCCESS){ err("ir_xml_parse_uid_status(): Unsuccessful RIBCL status."); xmlFreeDoc( doc); return( -1); } /* Locate the GET_UID_STATUS subtree. It will contain * the useful results of the command. */ data_node = ir_xml_find_node( xmlDocGetRootElement(doc), "GET_UID_STATUS"); if( data_node == NULL){ err("ir_xml_parse_uid_status(): GET_UID_STATUS element not found."); xmlFreeDoc( doc); return( -1); } status = xmlGetProp( data_node, (const xmlChar *)"UID"); if(status == NULL) { err("ir_xml_parse_uid_status(): UID not found."); xmlFreeDoc( doc); return(-1); } if(xmlStrcmp(status, (const xmlChar *)"ON") == 0) { *uid_status = ILO2_RIBCL_UID_ON; } else if(xmlStrcmp(status, (const xmlChar *)"OFF") == 0) { *uid_status = ILO2_RIBCL_UID_OFF; } else if(xmlStrcmp(status, (const xmlChar *)"FLASHING") == 0) { *uid_status = ILO2_RIBCL_UID_FLASHING; } else { xmlFree( status); xmlFreeDoc( doc); err("ir_xml_parse_uid_status(): Unknown UID status : %s", (char *)status); return(-1); } xmlFree( status); xmlFreeDoc( doc); return( RIBCL_SUCCESS); } /* end ir_xml_parse_uid_status() */ /** * ir_xml_parse_power_saver_status * @ribcl_outbuf: Ptr to the raw RIBCL output from the * GET_HOST_POWER_SAVER_STATUS cmd * @ps_status: pointer to int to return the parsed power saver status. * @ilostr: String to identify a particular iLO2 in error messages. * * Parses the output of the RIBCL GET_HOST_POWER_SAVER_STATUS command, * and returns current power saver status of the server. * * Return value: RIBCL_SUCCESS on success, -1 if error. **/ int ir_xml_parse_power_saver_status(char *ribcl_outbuf, int *ps_status, char *ilostr) { xmlDocPtr doc; xmlNodePtr data_node; xmlChar *status = NULL; /* Convert the RIBCL command output into a single XML document, * and the use the libxml2 parser to create an XML doc tree. */ doc = ir_xml_doparse( ribcl_outbuf); if( doc == NULL){ err("ir_xml_parse_power_saver_status(): Null doc returned."); return( -1); } /* Check all RESULTS sections in the output for a status value * of zero, which indicates success. */ if( ir_xml_checkresults_doc( doc, ilostr) != RIBCL_SUCCESS){ err("ir_xml_parse_power_saver_status(): Unsuccessful RIBCL status."); xmlFreeDoc( doc); return( -1); } /* Locate the GET_HOST_POWER_SAVER subtree. It will contain * the useful results of the command. */ data_node = ir_xml_find_node( xmlDocGetRootElement(doc), "GET_HOST_POWER_SAVER"); if( data_node == NULL){ err("ir_xml_parse_power_saver_status(): GET_HOST_POWER_SAVER element not found."); xmlFreeDoc( doc); return( -1); } status = xmlGetProp( data_node, (const xmlChar *)"HOST_POWER_SAVER"); if(status == NULL) { err("ir_xml_parse_power_saver_status(): HOST_POWER_SAVER not found."); xmlFreeDoc( doc); return(-1); } if(xmlStrcmp(status, (const xmlChar *)"MIN") == 0) { *ps_status = ILO2_RIBCL_MANUAL_LOW_POWER_MODE; } else if(xmlStrcmp(status, (const xmlChar *)"OFF") == 0) { *ps_status = ILO2_RIBCL_MANUAL_OS_CONTROL_MODE; } else if(xmlStrcmp(status, (const xmlChar *)"AUTO") == 0) { *ps_status = ILO2_RIBCL_AUTO_POWER_SAVE_MODE; } else if(xmlStrcmp(status, (const xmlChar *)"MAX") == 0) { *ps_status = ILO2_RIBCL_MANUAL_HIGH_PERF_MODE; } else { xmlFree( status); xmlFreeDoc( doc); err("ir_xml_parse_power_saver_status(): Unknown Power Saver status."); return(-1); } xmlFree( status); xmlFreeDoc( doc); return( RIBCL_SUCCESS); } /* end ir_xml_parse_power_saver_status() */ /** * ir_xml_parse_auto_power_status * @ribcl_outbuf: Ptr to the raw RIBCL output from the * GET_SERVER_AUTO_PWR cmd * @ps_status: pointer to int to return the parsed power saver status. * @ilostr: String to identify a particular iLO2 in error messages. * * Parses the output of the RIBCL GET_SERVER_AUTO_PWR command, and returns * current Auto Power status of the server. * * Return value: RIBCL_SUCCESS on success, -1 if error. **/ int ir_xml_parse_auto_power_status(char *ribcl_outbuf, int *ps_status, char *ilostr) { xmlDocPtr doc; xmlNodePtr data_node; xmlChar *status = NULL; /* Convert the RIBCL command output into a single XML document, * and the use the libxml2 parser to create an XML doc tree. */ doc = ir_xml_doparse( ribcl_outbuf); if( doc == NULL){ err("ir_xml_parse_auto_power_status(): Null doc returned."); return( -1); } /* Check all RESULTS sections in the output for a status value * of zero, which indicates success. */ if( ir_xml_checkresults_doc( doc, ilostr) != RIBCL_SUCCESS){ err("ir_xml_parse_auto_power_status(): Unsuccessful RIBCL status."); xmlFreeDoc( doc); return( -1); } /* Locate the GET_SERVER_AUTO_PWR subtree. It will contain * the useful results of the command. */ data_node = ir_xml_find_node( xmlDocGetRootElement(doc), "SERVER_AUTO_PWR"); if( data_node == NULL){ err("ir_xml_parse_auto_power_status(): SERVER_AUTO_PWR element not found."); xmlFreeDoc( doc); return( -1); } status = xmlGetProp( data_node, (const xmlChar *)"VALUE"); if(status == NULL) { err("ir_xml_parse_auto_power_status(): VALUE not found."); xmlFreeDoc( doc); return(-1); } if(xmlStrcmp(status, (const xmlChar *)"No") == 0) { *ps_status = ILO2_RIBCL_AUTO_POWER_DISABLED; } else if(xmlStrcmp(status, (const xmlChar *)"OFF") == 0) { *ps_status = ILO2_RIBCL_AUTO_POWER_OFF; } else if(xmlStrcmp(status, (const xmlChar *)"Yes") == 0) { *ps_status = ILO2_RIBCL_AUTO_POWER_ENABLED; } else if(xmlStrcmp(status, (const xmlChar *)"ON") == 0) { *ps_status = ILO2_RIBCL_AUTO_POWER_ENABLED; } else if(xmlStrcmp(status, (const xmlChar *)"15") == 0) { *ps_status = ILO2_RIBCL_AUTO_POWER_DELAY_15; } else if(xmlStrcmp(status, (const xmlChar *)"30") == 0) { *ps_status = ILO2_RIBCL_AUTO_POWER_DELAY_30; } else if(xmlStrcmp(status, (const xmlChar *)"45") == 0) { *ps_status = ILO2_RIBCL_AUTO_POWER_DELAY_45; } else if(xmlStrcmp(status, (const xmlChar *)"60") == 0) { *ps_status = ILO2_RIBCL_AUTO_POWER_DELAY_60; } else if(xmlStrcmp(status, (const xmlChar *)"RANDOM") == 0) { *ps_status = ILO2_RIBCL_AUTO_POWER_DELAY_RANDOM; } else if(xmlStrcmp(status, (const xmlChar *)"RESTORE") == 0) { *ps_status = ILO2_RIBCL_AUTO_POWER_RESTORE; } else { xmlFree( status); xmlFreeDoc( doc); err("ir_xml_parse_auto_power_status(): Unknown Power Saver status."); return(-1); } xmlFree( status); xmlFreeDoc( doc); return( RIBCL_SUCCESS); } /** * ir_xml_parse_reset_server * @ribcl_outbuf: Ptr to the raw RIBCL output from the RESET_SERVER or * COLD_BOOT_SERVER command. It just looks for error conditions and nothing * specific about either command output. * cmd * @ilostr: String to identify a particular iLO2 in error messages. * * Parses the output of the RIBCL RESET_SERVER or COLD_BOOT_SERVER command. * * Return value: RIBCL_SUCCESS on success, -1 if error. **/ int ir_xml_parse_reset_server(char *ribcl_outbuf, char *ilostr) { xmlDocPtr doc; /* Convert the RIBCL command output into a single XML document, * and the use the libxml2 parser to create an XML doc tree. */ doc = ir_xml_doparse( ribcl_outbuf); if( doc == NULL){ return( -1); } /* Check all RESULTS sections in the output for a status value * of zero, which indicates success. */ if( ir_xml_checkresults_doc( doc, ilostr) != RIBCL_SUCCESS){ err("ir_xml_parse_reset_server(): Unsuccessful RIBCL status."); xmlFreeDoc( doc); return( -1); } xmlFreeDoc( doc); return( RIBCL_SUCCESS); } /* end ir_xml_parse_reset_server() */ /** * ir_xml_parse_set_host_power * @ribcl_outbuf: Ptr to the raw RIBCL output from the SET_HOST_POWER * cmd * @ilostr: String to identify a particular iLO2 in error messages. * * Parses the output of the RIBCL SET_HOST_POWER command. * * Return value: RIBCL_SUCCESS on success, -1 if error. **/ int ir_xml_parse_set_host_power(char *ribcl_outbuf, char *ilostr) { xmlDocPtr doc; /* Convert the RIBCL command output into a single XML document, * and the use the libxml2 parser to create an XML doc tree. */ doc = ir_xml_doparse( ribcl_outbuf); if( doc == NULL){ return( -1); } /* Check all RESULTS sections in the output for a status value * of zero, which indicates success. */ if( ir_xml_checkresults_doc( doc, ilostr) != RIBCL_SUCCESS){ err("ir_xml_parse_set_host_power(): Unsuccessful RIBCL status."); xmlFreeDoc( doc); return( -1); } xmlFreeDoc( doc); return( RIBCL_SUCCESS); } /* end ir_xml_parse_set_host_power() */ /** * ir_xml_build_cmdbufs * @handler: ptr to the ilo2_ribcl plugin handler. * * This routine is designed to be called at ilo2_ribcl plugin open time. * Iterate through the global RIBCL command template array * ir_xml_cmd_templates[]. For each command template string in that array, * allocate a buffer and fill it with a customized XML command string for * that host, containing the user_name and password that have been previously * read from the config file and saved in our private handler. * * Note that the command templates in ir_xml_cmd_templates[] have been * created as *printf format strings with "%s" where the login and password * should be substituted to assign the LOGIN and PASSWORD attributes. * * These customized xml command strings are then stored in the ribcl_xml_cmd[] * array in the handler for this plugin instance. * * Note: you must free these allocated buffers at close time with a call to * ir_xml_free_cmdbufs(). * * Return value: RIBCL_SUCCESS if success, -1 if failure. **/ int ir_xml_build_cmdbufs( ilo2_ribcl_handler_t *handler) { int i; int cmdsize; int logpasslen; char *login; char *password; for( i =0; i < IR_NUM_COMMANDS; i++){ handler->ribcl_xml_cmd[i] = NULL; } login = handler->user_name; password = handler->password; logpasslen = strlen( login) + strlen( password); for( i =0; i < IR_NUM_COMMANDS; i++){ cmdsize = strlen( ir_xml_cmd_templates[i]) - 3 + logpasslen; handler->ribcl_xml_cmd[i] = malloc( cmdsize); if( handler->ribcl_xml_cmd[i] == NULL){ err("ir_xml_build_cmdbufs(): malloc of command buffer %d failed.", i); while( --i >=0){ free( handler->ribcl_xml_cmd[i]); } return( -1); } /* Note, since the OpenHPI makefiles set the GCC options * -Werror and -Wformat-nonliteral, we can't use anything * except a string literal as the third "format" parameter * to snprintf() without generating errors at compile time. * So, we must use our own stripped down version of snprintf() * instead. */ ir_xml_insert_logininfo( handler->ribcl_xml_cmd[i], cmdsize, ir_xml_cmd_templates[i], login, password); } return( RIBCL_SUCCESS); } /* end ir_xml_build_cmdbufs() */ /** * ir_xml_insert_logininfo * @dest - ptr to destination buffer for the customized RIBCL command string. * @dsize - size of the dest buffer, including the terminating null. * @format - A *printf format string containing at least two %s substitutions. * @login - the login string for this host. * @passwd - the password string for this host. * * This is a stripped down version of the standard snprintf() routine. * It is designed to insert the login and password strings into a RIBCL * command template given by the 'format' parameter. The resulting customized * command string is written to the null terminated buffer 'dest'. * * Return value: The number of characters written to the dest buffer, not * including the terminating null (just like snprintf()) if * success, -1 if failure. **/ static int ir_xml_insert_logininfo( char *dest, int dsize, char *format, char *login, char *passwd) { enum istates { COPY, INSERT_LOGIN, INSERT_PASSWD, COPY_POST }; int dcount = 0; enum istates state; char ch; int login_entered = 0; state = COPY; while( dcount < dsize){ switch( state){ case COPY: if( (*format == '%') && ( (*(format +1)) == 's')){ format += 2; if( login_entered){ state = INSERT_PASSWD; } else { state = INSERT_LOGIN; } } else { /* Copy from format to dest */ ch = *dest++ = *format++; if( ch == '\0'){ /* We're done */ return( dcount); } dcount++; } break; case INSERT_LOGIN: login_entered = 1; if( *login != '\0'){ *dest++ = *login++; dcount++; } else { state = COPY; } break; case INSERT_PASSWD: if( *passwd != '\0'){ *dest++ = *passwd++; dcount++; } else { state = COPY_POST; } break; case COPY_POST: /* Copy from format to dest */ ch = *dest++ = *format++; if( ch == '\0'){ /* We're done */ return( dcount); } dcount++; break; default: err("ir_xml_insert_logininfo(): Illegal state."); return ( -1); break; } /* end switch state */ } /* end while dcount < dsize */ /* If we make it here, then we've run out of destination buffer space, * so force a null termination to the destination buffer and return the * number of non-null chars. */ *(dest -1) = '\0'; return( dcount - 1); } /* end ir_xml_insert_logininfo() */ /** * ir_xml_insert_headerinfo * @dest - ptr to destination buffer for the customized HTTP header. * @dsize - size of the dest buffer, including the terminating null. * @format - A *printf format string containing at least two %s substitutions. * @h_name - the hostname string * @c_length - Content length in decimal characters. * * This is a stripped down version of the standard snprintf() routine. * It is designed to insert the hostname and content-length * strings into a HTTP header template given by the *'format' parameter. * The resulting customized header string is written to the null * terminated buffer 'dest'. * * Return value: The number of characters written to the dest buffer, not * including the terminating null (just like snprintf()) if * success, -1 if failure. **/ int ir_xml_insert_headerinfo( char *dest, int dsize, char *format, char *h_name, char *c_length) { enum istates { COPY, INSERT_H_NAME, INSERT_C_LENGTH, COPY_POST }; int dcount = 0; enum istates state; char ch; int header_entered = 0; if( dest == NULL || h_name == NULL || c_length == NULL) return -1; state = COPY; while( dcount < dsize) { switch( state){ case COPY: if( (*format == '%') && ( (*(format +1)) == 's')){ format += 2; if( header_entered){ state = INSERT_C_LENGTH; } else { state = INSERT_H_NAME; } } else { /* Copy from format to dest */ ch = *dest++ = *format++; if( ch == '\0'){ /* We're done */ return( dcount); } dcount++; } break; case INSERT_H_NAME: header_entered = 1; if( *h_name != '\0'){ *dest++ = *h_name++; dcount++; } else { state = COPY; } break; case INSERT_C_LENGTH: if( *c_length != '\0'){ *dest++ = *c_length++; dcount++; } else { state = COPY_POST; } break; case COPY_POST: /* Copy from format to dest */ ch = *dest++ = *format++; if( ch == '\0'){ /* We're done */ return( dcount); } dcount++; break; default: err("ir_xml_insert_logininfo(): Illegal state."); return ( -1); break; } /* end switch state */ } /* end while dcount < dsize */ /* If we make it here, then we've run out of destination buffer space, * so force a null termination to the destination buffer and return the * number of non-null chars. */ *(dest -1) = '\0'; return( dcount - 1); } /* end ir_xml_insert_headerinfo() */ /** * ir_xml_free_cmdbufs * @handler: ptr to the ilo2_ribcl plugin private handler. * * This routine is desigend to be called at ilo2_ribcl plugin close time. * Iterate through the ribcl_xml_cmd[] array in the ilo2_ribcl plugin * handler passed as a parameter, and free all of the customized RIBCL * command strings. * * Return value: None. **/ void ir_xml_free_cmdbufs( ilo2_ribcl_handler_t *handler) { int i; for( i =0; i < IR_NUM_COMMANDS; i++){ if( handler->ribcl_xml_cmd[i] != NULL){ free( handler->ribcl_xml_cmd[i]); handler->ribcl_xml_cmd[i] = NULL; } } return; } /** * ir_xml_find_node * @s_node: Starting XML tree node for the search. * @s_name: Name of the node to search for. * * Search the XML doc subtree pointed to by s_node, searching for a node * with the name s_name. * * Return value: Ptr to a XML doc tree node on success, NULL on failure. **/ static xmlNodePtr ir_xml_find_node( xmlNodePtr s_node, char *s_name) { xmlNodePtr c_node; while( s_node != NULL){ if((!xmlStrcmp( s_node->name, (const xmlChar *)s_name))){ return( s_node); } else { c_node = ir_xml_find_node( s_node->xmlChildrenNode, s_name); if( c_node != NULL){ return( c_node); } } s_node = s_node->next; } return( NULL); } /* End ir_xml_find_node( ) */ /** * ir_xml_scan_fans * @ir_handler: Ptr to this instance's custom handler. * @eh_data_node: Points to GET_EMBEDDED_HEALTH subtree in the output xml * * Examines all the FAN subtrees of the FANS tree, and extracts the fan label, * zone, status, speed, and speed units for all fans in the system. * * The fan XML section should look something like: * * * * * * * * * * * * * * * * Return value: RIBCL_SUCCESS if success, -1 if failure. **/ static int ir_xml_scan_fans( ilo2_ribcl_handler_t *ir_handler, xmlNodePtr eh_data_node) { xmlNodePtr fan_node; xmlNodePtr n; xmlChar *lbl = NULL; xmlChar *zone = NULL; xmlChar *stat = NULL; xmlChar *speed = NULL; xmlChar *unit = NULL; int ret; fan_node = ir_xml_find_node( eh_data_node, "FANS"); fan_node = fan_node->xmlChildrenNode; while( fan_node != NULL){ if((!xmlStrcmp( fan_node->name, (const xmlChar *)"FAN"))){ n = ir_xml_find_node(fan_node, "LABEL"); if( n != NULL){ lbl = xmlGetProp( n, (const xmlChar *)"VALUE"); } n = ir_xml_find_node(fan_node, "ZONE"); if( n != NULL){ zone = xmlGetProp( n, (const xmlChar *)"VALUE"); } n = ir_xml_find_node(fan_node, "STATUS"); if( n != NULL){ stat = xmlGetProp( n, (const xmlChar *)"VALUE"); } n = ir_xml_find_node(fan_node, "SPEED"); if( n != NULL){ speed = xmlGetProp( n, (const xmlChar *)"VALUE"); unit = xmlGetProp( n, (const xmlChar *)"UNIT"); } ret = ir_xml_record_fandata( ir_handler, (char *)lbl, (char *)zone, (char *)stat, (char *)speed, (char *)unit); if( lbl){ xmlFree( lbl); } if( zone){ xmlFree( zone); } if( stat){ xmlFree( stat); } if( speed){ xmlFree( speed); } if( unit){ xmlFree( unit); } if( ret != RIBCL_SUCCESS){ return( -1); } } /* end if name == "FAN" */ fan_node = fan_node->next; } /* end while fan_node != NULL */ return( RIBCL_SUCCESS); } /* end ir_xml_scan_fans() */ /** * ir_xml_record_fandata * @ir_handler: ptr to the ilo2_ribcl plugin private handler. * @fanlabel: string label for the fan from iLO2. * @fanzone: string location zone for the fan from iLO2. * @fanstat: string status for the fan from iLO2. * @fanspeed: string speed for the fan from iLO2. * @speedunits: string units for the fan speed. * * This routine records the data for a fan reported by iLO2 into the * DiscoveryData structure within the plugin's private handler. * * Detailed description: * * - Extract an index for this fan from the fan label provided by iLO2. * - Use this index to access the DiscoveryData.fandata[] array. * - Set the IR_DISCOVERED bit in fanflags. * - if the fan speed differs from our previous reading, set the * IR_SPEED_UPDATED flag in fanflags. * - Store updated values for the speed, label, zone, status, and * speedunit for this fan. * * Return value: RIBCL_SUCCESS if success, -1 if failure. **/ static int ir_xml_record_fandata( ilo2_ribcl_handler_t *ir_handler, char *fanlabel, char *fanzone, char *fanstat, char *fanspeed, char *speedunits) { int fanindex = 0; int speedval; struct ir_fandata *fandat; /* Find the index of this fan. The parameter 'fanlabel' should be of the * form 'Fan N', where N ranges from 1 to ILO2_RIBCL_DISCOVER_FAN_MAX. */ fanindex = ir_xml_extract_index("Fan", (char *)fanlabel, 1); if( fanindex == IR_NO_PREFIX){ /* We didn't parse the fanlabel string prefix correctly */ err("ir_xml_record_fandata: incorrect fan label string: %s", fanlabel); return( -1); } if( fanindex == IR_NO_INDEX){ /* We didn't parse the fanlabel string index correctly */ err("ir_xml_record_fandata: could not extract index from fan label string: %s", fanlabel); return( -1); } /* The index of this fan should be between 1 and * ILO2_RIBCL_DISCOVER_FAN_MAX. */ if( (fanindex < 1) || (fanindex > ILO2_RIBCL_DISCOVER_FAN_MAX) ){ err("ir_xml_record_fandata: Fan index out of range: %d.", fanindex); return( -1); } /* Now, if this information is different than what's already in * DiscoveryData, update DiscoveryData with the latest info */ fandat = &(ir_handler->DiscoveryData.fandata[fanindex]); if(strcmp(fanstat, "Not Installed") && strcmp(fanstat, "Unknown")){ fandat->fanflags |= IR_DISCOVERED; } speedval = atoi(fanspeed); if( fandat->speed != speedval){ fandat->fanflags |= IR_SPEED_UPDATED; fandat->speed = speedval; } if( ir_xml_replacestr( &(fandat->label), fanlabel) != RIBCL_SUCCESS){ return( -1); } if( ir_xml_replacestr( &(fandat->zone), fanzone) != RIBCL_SUCCESS){ return( -1); } if( ir_xml_replacestr( &(fandat->status), fanstat) != RIBCL_SUCCESS){ return( -1); } if( ir_xml_replacestr( &(fandat->speedunit), speedunits) != RIBCL_SUCCESS){ return( -1); } return( RIBCL_SUCCESS); } /* end ir_xml_record_fandata() */ /** * ir_xml_scan_temperature * @ir_handler: Ptr to this instance's custom handler. * @eh_data_node: Points to GET_EMBEDDED_HEALTH subtree in the output xml * * Examines all the TEMP subtrees of the TEMPERATURE tree, and extracts the * label, location, status, current reading, and temperature units for all * temperature sensors in the system. * * The temperature XML section should look something like: * * * * * * * * * * * * * * * * Return value: RIBCL_SUCCESS if success, -1 if failure. **/ static int ir_xml_scan_temperature( ilo2_ribcl_handler_t *ir_handler, xmlNodePtr eh_data_node) { xmlNodePtr t_node; xmlNodePtr n; xmlChar *lbl = NULL; xmlChar *loc = NULL; xmlChar *stat = NULL; xmlChar *cur_reading = NULL; xmlChar *unit = NULL; xmlChar *caution_reading = NULL; xmlChar *critical_reading = NULL; xmlChar *cautionunit = NULL; xmlChar *criticalunit = NULL; int ret = 0; int temp_index; t_node = ir_xml_find_node( eh_data_node, "TEMPERATURE"); t_node = t_node->xmlChildrenNode; temp_index = 0; while( t_node != NULL){ if((!xmlStrcmp( t_node->name, (const xmlChar *)"TEMP"))){ n = ir_xml_find_node( t_node, "LABEL"); if( n != NULL){ lbl = xmlGetProp( n, (const xmlChar *)"VALUE"); } n = ir_xml_find_node( t_node, "LOCATION"); if( n != NULL){ loc = xmlGetProp( n, (const xmlChar *)"VALUE"); } n = ir_xml_find_node( t_node, "STATUS"); if( n != NULL){ stat = xmlGetProp( n, (const xmlChar *)"VALUE"); } n = ir_xml_find_node( t_node, "CURRENTREADING"); if( n != NULL){ cur_reading = xmlGetProp( n, (const xmlChar *)"VALUE"); unit = xmlGetProp( n, (const xmlChar *)"UNIT"); } n = ir_xml_find_node( t_node, "CAUTION"); if( n != NULL){ caution_reading = xmlGetProp( n, (const xmlChar *)"VALUE"); cautionunit = xmlGetProp( n, (const xmlChar *)"UNIT"); } n = ir_xml_find_node( t_node, "CRITICAL"); if( n != NULL){ critical_reading = xmlGetProp( n, (const xmlChar *)"VALUE"); criticalunit = xmlGetProp( n, (const xmlChar *)"UNIT"); } temp_index++; /* Call to process temperature data */ if(temp_index != 0) ret = ir_xml_record_temperaturedata( ir_handler, ( char *)lbl,( char *)loc, ( char *)stat, ( char *)cur_reading,( char *)unit, ( char *)caution_reading,( char *)cautionunit, ( char *)critical_reading,(char *)criticalunit, temp_index); if( lbl){ xmlFree( lbl); } if( loc){ xmlFree( loc); } if( stat){ xmlFree( stat); } if( cur_reading){ xmlFree( cur_reading); } if( unit){ xmlFree( unit); } if( caution_reading){ xmlFree( caution_reading); } if( cautionunit){ xmlFree( cautionunit); } if( critical_reading){ xmlFree( critical_reading); } if( criticalunit){ xmlFree( criticalunit); } if( ret != RIBCL_SUCCESS){ return( -1); } } /* end if name == "TEMP" */ t_node = t_node->next; } /* end while t_node != NULL */ return( RIBCL_SUCCESS); } /* end ir_xml_scan_temperature() */ /** * ir_xml_record_temperaturedata * @ir_handler: ptr to the ilo2_ribcl plugin private handler. * @temperaturelabel: string label for the temperature sensor from iLO2. * @temperaturelocation:string location for the temperature sensor from iLO2. * @temperaturestat: string status for the temperature sensor from iLO2. * @temperaturereading: string reading for the temperature sensor from iLO2. * @temperatureunits: string units for the temperature. * @temperaturecautionvalue: string reading for the temperature caution * value from iLO2. * @temperaturecautionunit: string units for the temperature caution value. * @temperaturecriticalvalue: string reading for the temperature critical * value from iLO2. * @temperaturecriticalunit: string units for the temperature critical value. * * This routine records the data for a temperature sensor reported by iLO2 * into the DiscoveryData structure within the plugin's private handler. * * Detailed description: * * - Extract an index for this temperature sensor from the temperature * sensor label provided by iLO2. * - Use this index to access the DiscoveryData.tsdata[] array. * - Set the IR_DISCOVERED bit in tsflags. * - Store updated values for the temperature sensor reading, label, * location, status, and temperatureunit for this temperature sensor. * * Return value: RIBCL_SUCCESS if success, -1 if failure. **/ static int ir_xml_record_temperaturedata( ilo2_ribcl_handler_t *ir_handler, char *temperaturelabel, char *temperaturelocation, char *temperaturestat,char *temperaturereading, char *temperatureunits, char *temperaturecautionvalue, char *temperaturecautionunit, char *temperaturecriticalvalue, char *temperaturecriticalunit, int temperatureindex) { ir_tsdata_t *tsdat = NULL; if ( ir_handler == NULL) { err("ir_xml_record_temperaturedata: ir_handler value is NULL"); return( -1); } /* Find the index of this temperature sensor. The parameter * 'temperaturelabel' should be of the form 'Temp N', * where N ranges from 1 to ILO2_RIBCL_DISCOVER_TS_MAX. */ if( (temperatureindex < 1) || (temperatureindex > ILO2_RIBCL_DISCOVER_TS_MAX) ){ err("ir_xml_record_temperaturedata: temperatureindex out of " "range: %d.", temperatureindex); return( -1); } /* Now, if this information is different than what's already in * DiscoveryData, update DiscoveryData with the latest info */ tsdat = &(ir_handler->DiscoveryData.tsdata[3 + temperatureindex]); tsdat->tsflags |= IR_DISCOVERED; if( ir_xml_replacestr( &(tsdat->label), temperaturelabel) != RIBCL_SUCCESS){ err("ir_xml_record_temperaturedata: could not update " "temperature label: %s", temperaturelabel); return( -1); } if( ir_xml_replacestr( &(tsdat->location), temperaturelocation) != RIBCL_SUCCESS){ err("ir_xml_record_temperaturedata: could not update " "temperature location: %s", temperaturelocation); return( -1); } if( ir_xml_replacestr( &(tsdat->status), temperaturestat) != RIBCL_SUCCESS){ err("ir_xml_record_temperaturedata: could not update " "temperature status: %s", temperaturestat); return( -1); } if( ir_xml_replacestr( &(tsdat->reading), temperaturereading) != RIBCL_SUCCESS){ err("ir_xml_record_temperaturedata: could not update " "temperature reading: %s", temperaturereading); return( -1); } if( ir_xml_replacestr( &(tsdat->readingunits), temperatureunits) != RIBCL_SUCCESS){ err("ir_xml_record_temperaturedata: could not update " "temperature units: %s", temperatureunits); return( -1); } if( ir_xml_replacestr( &(tsdat->cautionvalue), temperaturecautionvalue) != RIBCL_SUCCESS){ err("ir_xml_record_temperaturedata: could not update " "temperature caution reading: %s", temperaturecautionvalue); return( -1); } if( ir_xml_replacestr( &(tsdat->cautionunit), temperaturecautionunit) != RIBCL_SUCCESS){ err("ir_xml_record_temperaturedata: could not update " "temperature caution units: %s", temperaturecautionunit); return( -1); } if( ir_xml_replacestr( &(tsdat->criticalvalue), temperaturecriticalvalue)!= RIBCL_SUCCESS){ err("ir_xml_record_temperaturedata: could not update " "temperature critical reading: %s", temperaturecriticalvalue); return( -1); } if( ir_xml_replacestr( &(tsdat->criticalunit), temperaturecriticalunit) != RIBCL_SUCCESS){ err("ir_xml_record_temperaturedata: could not update " "temperature critical units: %s", temperaturecriticalunit); return( -1); } return( RIBCL_SUCCESS); } /* end ir_xml_record_temparaturedata()*/ /** * ir_xml_firmaware_revision * @ir_handler: Ptr to this instance's custom handler. * @eh_data_node: Points to GET_FW_VERSION subtree in the output xml * This routine parses the firmware information and saves major and minor * revision numbers in the handler DiscoverData structure. * The response for GET_FW_VERSION RIBCL command should look something like: * * * Return value: None **/ static void ir_xml_scan_firmware_revision( ilo2_ribcl_handler_t *ir_handler, xmlNodePtr eh_data_node) { xmlChar *fw_ver = NULL; char *result = NULL; SaHpiUint8T FirmwareMajorRev = 0; SaHpiUint8T FirmwareMinorRev = 0; fw_ver = xmlGetProp(eh_data_node, (const xmlChar *)"FIRMWARE_VERSION"); if(fw_ver == NULL) { err("ir_xml_scan_firmware_revision(): FIRMWARE_VERSION not found."); return; } /* Save a copy of the raw version string */ ir_xml_replacestr( &(ir_handler->DiscoveryData.fwdata.version_string), (char *)fw_ver); /* extract manjor and minor revision numbers and save them in the handler discovery data structure */ FirmwareMajorRev = atoi((char *) fw_ver); result = strchr((char *)fw_ver, '.'); if(result != NULL) { FirmwareMinorRev = atoi(++result); } if(ir_handler->DiscoveryData.fwdata.FirmwareMajorRev != FirmwareMajorRev) { ir_handler->DiscoveryData.fwdata.FirmwareMajorRev = FirmwareMajorRev; } if(ir_handler->DiscoveryData.fwdata.FirmwareMinorRev != FirmwareMinorRev) { ir_handler->DiscoveryData.fwdata.FirmwareMinorRev = FirmwareMinorRev; } return; } /** * ir_xml_scan_vrm * @eh_data_node: Points to GET_EMBEDDED_HEALTH subtree in the output xml * @ir_handler: Ptr to this instance's custom handler. * * Examines all the MODULE subtrees of the VRM tree, and extracts the * label and status, for all voltage regulator modules in the system. * * The VRM XML section should look something like: * * * * * * * * Return value: RIBCL_SUCCESS if success, -1 if failure. **/ static int ir_xml_scan_vrm( ilo2_ribcl_handler_t *ir_handler, xmlNodePtr eh_data_node) { xmlNodePtr v_node; xmlNodePtr n; int ret; xmlChar *lbl = NULL; xmlChar *stat = NULL; v_node = ir_xml_find_node( eh_data_node, "VRM"); v_node = v_node->xmlChildrenNode; while( v_node != NULL){ if((!xmlStrcmp( v_node->name, (const xmlChar *)"MODULE"))){ ret = RIBCL_SUCCESS; n = ir_xml_find_node( v_node, "LABEL"); if( n != NULL){ lbl = xmlGetProp( n, (const xmlChar *)"VALUE"); } n = ir_xml_find_node( v_node, "STATUS"); if( n != NULL){ stat = xmlGetProp( n, (const xmlChar *)"VALUE"); } if( xmlStrcmp(stat, (xmlChar *)"Not Installed") != 0 ){ ret = ir_xml_record_vrmdata( ir_handler, (char *)lbl, (char *)stat); } if( lbl){ xmlFree( lbl); } if( stat){ xmlFree( stat); } if( ret != RIBCL_SUCCESS){ return( -1); } } /* end if name == "MODULE" */ v_node = v_node->next; } /* end while v_node != NULL */ return( RIBCL_SUCCESS); } /* end ir_xml_scan_vrm() */ /** * ir_xml_record_vrmdata * @ir_handler: ptr to the ilo2_ribcl plugin private handler. * @label: string VRM label from iLO2. * @psstat: string VRM status from iLO2. * * This routine records the data for a voltage regulator module reported by * iLO2 into the DiscoveryData structure within the plugin's private handler. * * Detailed description: * * - Extract an index for this VRM from the VRM label provided by iLO2. * - Use this index to access the DiscoveryData.vrmdata[] array. * - Set the IR_DISCOVERED bit in vrmflags. * - Store updated values for the label and status for this VRM. * * Return value: RIBCL_SUCCESS if success, -1 if failure. **/ static int ir_xml_record_vrmdata( ilo2_ribcl_handler_t *ir_handler, char *vrmlabel, char *vrmstat) { int vrmindex = 0; int ret; ir_vrmdata_t *vrmdat; /* The format of the VRM label is 'VRM n' where n is an integer * value beginning with 1. We use this value as an index for * the VRM. */ ret = sscanf( (char *)vrmlabel, "VRM %d", &vrmindex); if( ret != 1){ /* Some times the format of the VRM label is 'VRM (CPUn)' * where is n is an integer value begining with 1. */ ret = sscanf( (char *)vrmlabel, "VRM (CPU%d)", &vrmindex); if( ret != 1){ /* We didn't parse the VRM label correctly */ err("ir_xml_record_vrmdata: incorrect VRM label " "string: %s", vrmlabel); return( -1); } } /* The index for this VRM should be between 1 and * ILO2_RIBCL_DISCOVER_VRM_MAX. */ if( (vrmindex < 1) || (vrmindex > ILO2_RIBCL_DISCOVER_PSU_MAX) ){ err("ir_xml_record_vrmdata: VRM index out of range: %d", vrmindex); return( -1); } /* Now, if this information is different than what's already in DiscoveryData, update DiscoveryData with the latest info */ vrmdat = &(ir_handler->DiscoveryData.vrmdata[vrmindex]); vrmdat->vrmflags |= IR_DISCOVERED; if( ir_xml_replacestr( &(vrmdat->label), vrmlabel) != RIBCL_SUCCESS){ return( -1); } if( ir_xml_replacestr( &(vrmdat->status), vrmstat) != RIBCL_SUCCESS){ return( -1); } return( RIBCL_SUCCESS); } /* end ir_xml_record_vrmdata() */ /** * ir_xml_scan_power * @ir_handler: Ptr to this instance's custom handler. * @eh_data_node: Points to GET_EMBEDDED_HEALTH subtree in the output xml * * Examines all the SUPPLY subtrees of the POWER_SUPPLIES tree, and extracts * the label and status, for all power supplies in the system. * * The XML data for POWER_SUPPLIES should look something like: * * * * * * * * Return value: RIBCL_SUCCESS if success, -1 if failure. **/ static int ir_xml_scan_power( ilo2_ribcl_handler_t *ir_handler, xmlNodePtr eh_data_node) { xmlNodePtr p_node; xmlNodePtr n; int ret; xmlChar *lbl = NULL; xmlChar *stat = NULL; xmlChar *present = NULL; p_node = ir_xml_find_node( eh_data_node, "POWER_SUPPLIES"); p_node = p_node->xmlChildrenNode; while( p_node != NULL){ if((!xmlStrcmp( p_node->name, (const xmlChar *)"SUPPLY"))){ ret = RIBCL_SUCCESS; n = ir_xml_find_node( p_node, "LABEL"); if( n != NULL){ lbl = xmlGetProp( n, (const xmlChar *)"VALUE"); } n = ir_xml_find_node( p_node, "STATUS"); if( n != NULL){ stat = xmlGetProp( n, (const xmlChar *)"VALUE"); } n = ir_xml_find_node( p_node, "PRESENT"); if( n != NULL){ present = xmlGetProp( n, (const xmlChar *) "VALUE"); } /* XXX REVISIT - confirm that "Not Installed" is the * correct string when the power supply is removed. */ /*The iLO3 output for the power supply has *a "Power Supplies" label that we don't care *about, the same is filtered-out here */ if( xmlStrcmp( lbl, (xmlChar *)"Power Supplies") != 0) if((xmlStrcmp(stat, (xmlChar *)"Not Installed") != 0) || ((xmlStrcmp( stat, (xmlChar *)"Unknown") != 0) && ((present != NULL) && (xmlStrcmp( present, (xmlChar *)"No"))))) { ret = ir_xml_record_psdata( ir_handler, (char *)lbl, (char *)stat); } if( lbl){ xmlFree( lbl); lbl = NULL;; } if( stat){ xmlFree( stat); stat = NULL; } if( present ){ xmlFree( present); present = NULL; } if( ret != RIBCL_SUCCESS){ return( -1); } } /* end if name == "SUPPLY" */ p_node = p_node->next; } /* end while p_node != NULL */ return( RIBCL_SUCCESS); } /* end ir_xml_scan_power() */ /** * ir_xml_record_psdata * @ir_handler: ptr to the ilo2_ribcl plugin private handler. * @label: string power supply label from iLO2. * @psstat: string power supply status from iLO2. * * This routine records the data for a power supply reported by * iLO2 into the DiscoveryData structure within the plugin's private handler. * * Detailed description: * * - Extract an index for this power supply from the power supply label * provided by iLO2. * - Use this index to access the DiscoveryData.psudata[] array. * - Set the IR_DISCOVERED bit in psuflags. * - Store updated values for the label,and status for this power supply. * * Return value: RIBCL_SUCCESS if success, -1 if failure. **/ static int ir_xml_record_psdata( ilo2_ribcl_handler_t *ir_handler, char *pslabel, char *psstat) { int psindex = 0; int ret; ir_psudata_t *psudat; /* The format of a the power supply label is 'Power Supply n' where * n is an integer value beginning with 1. We use this value as * an index for the power supply. */ ret = sscanf( (char *)pslabel, "Power Supply %d", &psindex); if( ret != 1){ /* We didn't parse the power supply label correctly */ err("ir_xml_record_psdata: incorrect PSU label string: %s", pslabel); return( -1); } /* The index for this power supply should be between 1 and * ILO2_RIBCL_DISCOVER_PSU_MAX. */ if( (psindex < 1) || (psindex > ILO2_RIBCL_DISCOVER_PSU_MAX) ){ err("ir_xml_record_psdata: PSU index out of range: %d.", psindex); return( -1); } /* Now, if this information is different than what's already in * DiscoveryData, update DiscoveryData with the latest info */ psudat = &(ir_handler->DiscoveryData.psudata[psindex]); if(strcmp(psstat, "Not Installed") && strcmp(psstat, "Unknown")){ psudat->psuflags |= IR_DISCOVERED; } if( ir_xml_replacestr( &(psudat->label), pslabel) != RIBCL_SUCCESS){ return( -1); } if( ir_xml_replacestr( &(psudat->status), psstat) != RIBCL_SUCCESS){ return( -1); } return( RIBCL_SUCCESS); } /* end ir_xml_record_psdata() */ /** * ir_xml_scan_health_at_a_glance * @ir_handler: Ptr to this instance's custom handler. * @eh_data_node: Points to GET_EMBEDDED_HEALTH subtree in the output xml * * Examines the HEALTH_AT_A_GLANCE subtree within GET_EMBEDDED_HEALTH, * and extracts the status for fans, temperature, and power supply. * The status string values are then parsed into numeric values and * stored in the chassis_sensors[] element within the DiscoveryData element * located within the plugin's private handler. * * The XML data for HEALTH_AT_A_GLANCE should look something like: * * * * * * * * * * Return value: RIBCL_SUCCESS if success, -1 if failure. **/ static int ir_xml_scan_health_at_a_glance( ilo2_ribcl_handler_t *ir_handler, xmlNodePtr eh_data_node) { xmlNodePtr p_node; int sens_reading; xmlChar *ts; xmlChar *fstat = NULL; xmlChar *pstat = NULL; xmlChar *tstat = NULL; ilo2_ribcl_DiscoveryData_t *ddata; I2R_SensorDataT *sens_dat; p_node = ir_xml_find_node( eh_data_node, "HEALTH_AT_A_GLANCE"); if( p_node == NULL){ return( RIBCL_SUCCESS); /* Not supported */ } /* Note, we assume the properties that we are looking for can occur * in any order, and inbetween properties that we are not looking for. * So, we use the temporary pointer 'ts' to capture them. */ p_node = p_node->xmlChildrenNode; while( p_node != NULL){ if((!xmlStrcmp( p_node->name, (const xmlChar *)"FANS"))){ ts = xmlGetProp( p_node, (const xmlChar *)"STATUS"); if( ts != NULL){ fstat = ts; } } if((!xmlStrcmp( p_node->name, (const xmlChar *)"TEMPERATURE"))){ ts = xmlGetProp( p_node, (const xmlChar *)"STATUS"); if( ts != NULL){ tstat = ts; } } if((!xmlStrcmp( p_node->name, (const xmlChar *)"POWER_SUPPLIES"))){ ts = xmlGetProp( p_node, (const xmlChar *)"STATUS"); if( ts != NULL){ pstat = ts; } } p_node = p_node->next; } ddata = &(ir_handler->DiscoveryData); if( fstat){ sens_dat = &(ddata->chassis_sensors[I2R_SEN_FANHEALTH]); sens_reading = ir_xml_stat_to_reading( (char *)fstat); if( sens_reading == -1){ err("ir_xml_scan_health_at_a_glance: Unrecognized status value \"%s\" for fan health.", fstat); } else { sens_dat->reading.intval = sens_reading; } xmlFree( fstat); } if( tstat){ sens_dat = &(ddata->chassis_sensors[I2R_SEN_TEMPHEALTH]); sens_reading = ir_xml_stat_to_reading( (char *)tstat); if( (sens_reading == -1) || (sens_reading == I2R_SEN_VAL_DEGRADED) ){ err("ir_xml_scan_health_at_a_glance: Unrecognized status value \"%s\" for temperature health.", tstat); } else { sens_dat->reading.intval = sens_reading; } xmlFree( tstat); } if( pstat){ sens_dat = &(ddata->chassis_sensors[I2R_SEN_POWERHEALTH]); sens_reading = ir_xml_stat_to_reading( (char *)pstat); if( sens_reading == -1){ err("ir_xml_scan_health_at_a_glance: Unrecognized status value \"%s\" for power supply health.", pstat); } else { sens_dat->reading.intval = sens_reading; } xmlFree( pstat); } return( RIBCL_SUCCESS); } /* end ir_xml_scan_health_at_a_glance() */ /** * ir_xml_stat_to_reading * @statstr: Ptr to a status string * * Performs a case insentive comparison of the input status string * with known possible values, and returns a numeric representation. * The value -1 is returned if there is no match for the string. * * Return values: * I2R_SEN_VAL_OK - status string was "Ok" * I2R_SEN_VAL_DEGRADED - status string was "Degraded" * I2R_SEN_VAL_FAILED - status string was "Failed" * -1 - The string was not recognized. **/ static int ir_xml_stat_to_reading( char *statstr) { if( !strcasecmp( statstr, "Ok")){ return( I2R_SEN_VAL_OK); } else if( !strcasecmp( statstr, "Degraded")){ return( I2R_SEN_VAL_DEGRADED); } else if( !strcasecmp( statstr, "Failed")){ return( I2R_SEN_VAL_FAILED); } else { return( -1); } } /* end ir_xml_stat_to_reading() */ /** * ir_xml_scan_smbios_1 * @ir_handler: ptr to the ilo2_ribcl plugin private handler. * @b_node: porinter to an SMBIOS_RECORD node of type 1. * * This routine will parse a SMBIOS_RECORD type 1 node, which should contain * the system product name and serial number. If these values differ from the * product_name and serial_number recorded in the DiscoveryData structure * within the plugin's private handler, then update the DiscoveryData values. * * A type 1 SMBIOS_RECORD should look something like: * * * * * * * * Return value: RIBCL_SUCCESS if success, -1 if failure. **/ static int ir_xml_scan_smbios_1( ilo2_ribcl_handler_t *ir_handler, xmlNodePtr b_node) { xmlChar *prod = NULL; xmlChar *sernum = NULL; int ret; /* We need to search this node's children for FIELD nodes * containing name and value pairs for the system product name and * the serial number. */ b_node = b_node->xmlChildrenNode; prod = ir_xml_smb_get_value( "Product Name", b_node); sernum = ir_xml_smb_get_value( "Serial Number", b_node); /* If it's different than information already in the DiscoveryData of * our handler, then replace it. */ ret = ir_xml_replacestr( &(ir_handler->DiscoveryData.product_name), (char *)prod); if( ret == RIBCL_SUCCESS){ ret = ir_xml_replacestr( &(ir_handler->DiscoveryData.serial_number), (char *)sernum); } if( prod){ xmlFree( prod); } if( sernum){ xmlFree( sernum); } return( ret); } /* end ir_xml_scan_smbios_1() */ /** * ir_xml_scan_smbios_4 * @ir_handler: Ptr to this instance's custom handler. * @b_node: porinter to an SMBIOS_RECORD node of type 4. * * This routine will parse a SMBIOS_RECORD type 4 node, which should contain * CPU information. We currently extract only the label information. * * A type 4 SMBIOS_RECORD for processor 1 should look something like: * * * * * * * * * A type 4 SMBIOS_RECORD for subsequent processors should look something like: * * * * * * Detailed description: * * - Extract an index for this CPU from the CPU label provided by iLO2. * - Use this index to access the DiscoveryData.cpudata[] array. * - Set the IR_DISCOVERED bit in cpuflags. * - Store updated values for the label for this CPU. * * Return value: RIBCL_SUCCESS if success, -1 if failure. **/ static int ir_xml_scan_smbios_4( ilo2_ribcl_handler_t *ir_handler, xmlNodePtr b_node) { xmlChar *cpu = NULL; char *cpu_speed = NULL; int ret; int procnum = 0; /* We need to search this node's children for FIELD nodes * containing name and value pairs for the CPUs */ b_node = b_node->xmlChildrenNode; cpu = ir_xml_smb_get_value( "Label", b_node); /* Can also get the speed, execution technology, and memory * technology for the CPU. However, this data is only provided * for processor 1. */ cpu_speed = (char *) ir_xml_smb_get_value( "Speed", b_node); /* Find the index of this processor. The label returned in string * 'cpu' above should be of the form 'Proc N'. */ ret = sscanf( (char *)cpu, "Proc %d", &procnum); if( ret != 1){ /* We didn't parse the cpu string correctly */ err("ir_xml_scan_smbios_4: incorrect CPU string: %s", cpu); return( -1); } /* The index of this processor should be between 1 and * ILO2_RIBCL_DISCOVER_CPU_MAX. */ if( (procnum < 1) || (procnum > ILO2_RIBCL_DISCOVER_CPU_MAX) ){ err("ir_xml_scan_smbios_4: Proc index out of range: %d.", procnum); return( -1); } /* When the processor is not there, speed is shown as "0 MHz" */ if(cpu_speed != NULL ){ if(strcmp(cpu_speed, "0 MHz")){ ir_handler->DiscoveryData.cpudata[procnum].cpuflags |= IR_DISCOVERED; } } else { dbg("CPU %d not getting added as speed is 0",procnum); } /* Now, if this information is different than what's already in * DiscoveryData, update DiscoveryData with the latest info */ ret = ir_xml_replacestr( &(ir_handler->DiscoveryData.cpudata[ procnum].label), (char *)cpu); /* Since we only have cpu speed reported for processor one, we make * the assumption that all processors are of the same rated speed. * Probably a safe assumption, since we are talking about Symetric * Multi-Processing here after all. */ if( (ret == RIBCL_SUCCESS) && ( cpu_speed != NULL)){ ret = ir_xml_replacestr( &(ir_handler->DiscoveryData.system_cpu_speed), (char *)cpu_speed); } if( cpu){ xmlFree(cpu); } if( cpu_speed){ xmlFree(cpu_speed); } return( ret); } /* end ir_xml_scan_smbios_4() */ /** * ir_xml_scan_smbios_17 * @ir_handler: Ptr to this instance's custom handler. * @b_node: porinter to an SMBIOS_RECORD node of type 17. * @mem_slotindex: pointer to an integer value for the current slot index. * * This routine will parse a SMBIOS_RECORD type 17 node, which should contain * memory DIMM information. We currently extract the label, size and speed. * Then, a call is made to ir_xml_record_memdata() to enter this data into * the DiscoveryData structure within the plugin's private handler. * * A type 17 SMBIOS_RECORD should look something like: * * * * * * * * Return value: RIBCL_SUCCESS if success, -1 if failure. **/ static int ir_xml_scan_smbios_17( ilo2_ribcl_handler_t *ir_handler, xmlNodePtr b_node, int *mem_slotindex) { xmlChar *mem_label = NULL; xmlChar *mem_size = NULL; xmlChar *mem_speed = NULL; int ret = RIBCL_SUCCESS; b_node = b_node->xmlChildrenNode; mem_label = ir_xml_smb_get_value( "Label", b_node); mem_size = ir_xml_smb_get_value( "Size", b_node); mem_speed = ir_xml_smb_get_value( "Speed", b_node); if( xmlStrcmp( mem_size, (xmlChar *)"not installed") != 0 ){ /* Record data for a populated DIMM slot */ ret = ir_xml_record_memdata( ir_handler, mem_slotindex, (char *)mem_label, (char *)mem_size, (char *) mem_speed); } /* Increment the slot index for both populated and unpopulated slots */ (*mem_slotindex)++; if( mem_label){ xmlFree( mem_label); } if( mem_size){ xmlFree( mem_size); } if( mem_speed){ xmlFree( mem_speed); } return( ret); } /* end ir_xml_scan_smbios_17() */ /** * ir_xml_record_memdata * @ir_handler: ptr to the ilo2_ribcl plugin private handler. * @memcount: ptr to an int that contains a mem slot count. * @memlabel: string memory DIMM label from iLO2. * @memsize: string memory DIMM size from iLO2. * @memspeed: string memory DIMM speed from iLO2. * * This routine records the data for a memory DIMM reported by * iLO2 into the DiscoveryData structure within the plugin's private handler. * * Detailed description: * * - Extract an index for this DIMM from the DIMM label provided by iLO2. * - Use this index to access the DiscoveryData.memdata[] array. * - Set the IR_DISCOVERED bit in memflags. * - Store updated values for the label, size, and speed for this DIMM. * * Return value: RIBCL_SUCCESS if success, -1 if failure. **/ static int ir_xml_record_memdata( ilo2_ribcl_handler_t *ir_handler, int *memcount, char *memlabel, char *memsize, char *memspeed) { int dimmindex = 0; int procindex = 0; int ret; ir_memdata_t *dimmdat; /* The format of a the memory label is 'DIMM nX' where n is an * integer and X is a capital letter. The integer value is * unique and begins at one, so we use this value as an index * for the DIMM. */ ret = sscanf( (char *)memlabel, "DIMM %d", &dimmindex); if( ret != 1){ /* Try for an alternate format. We will also accept a label * of the format 'PROC k DIMM nX' where k and n are integers * and X is a capital letter. Since n may not be unique across * all DIMMS, we will use the memcount parameter as the index * for the DIMM. */ ret = sscanf( (char*)memlabel, "PROC %d DIMM %d", &procindex, &dimmindex); /* In this case, we use the memory slot count passed to us via * parameter memcount as the memory index. */ dimmindex = *memcount; if( ret != 2){ /* We didn't parse the DIMM label correctly */ err("ir_xml_record_memdata: incorrect DIMM label string: %s", memlabel); return( -1); } } /* The index for this DIMM should be between 1 and * ILO2_RIBCL_DISCOVER_MEM_MAX. */ if( (dimmindex < 1) || (dimmindex > ILO2_RIBCL_DISCOVER_MEM_MAX) ){ err("ir_xml_record_memdata: DIMM index out of range: %d.", dimmindex); return( -1); } /* Now, if this information is different than what's already in * DiscoveryData, update DiscoveryData with the latest info */ dimmdat = &(ir_handler->DiscoveryData.memdata[dimmindex]); dimmdat->memflags |= IR_DISCOVERED; if( ir_xml_replacestr( &(dimmdat->label), memlabel) != RIBCL_SUCCESS){ return( -1); } if( ir_xml_replacestr( &(dimmdat->memsize), memsize) != RIBCL_SUCCESS){ return( -1); } if( ir_xml_replacestr( &(dimmdat->speed), memspeed) != RIBCL_SUCCESS){ return( -1); } return( RIBCL_SUCCESS); } /* end ir_xml_record_memdata() */ /** * ir_xml_smb_get_value * @name - name property string to match * @fld_node - doc subtree node containing one or more FIELD nodes * * This routine will scan all node siblings starting with fld_node, * Looking for FIELD nodes. If we find an atrirbute NAME on the FIELD * node with a value that matches the 'name' parameter, we return the * string value of the VALUE attribute for that node. Since this paragraph * doesn't make much sense, here's an example: * * * * * * * * * * * Using the above XML with a name parameter of "Curly" would return the * string "Stooge 3". * * Return value: * String value of the VALUE attribute if the NAME attrubute is matched, * NULL if no matches found. **/ static xmlChar *ir_xml_smb_get_value( char *name, xmlNodePtr fld_node) { xmlChar *smbnam = NULL; while( fld_node != NULL){ if((!xmlStrcmp( fld_node->name, (const xmlChar *)"FIELD"))){ smbnam = xmlGetProp( fld_node, (const xmlChar *)"NAME"); if( smbnam){ if(!xmlStrcmp( smbnam, (xmlChar *)name)){ xmlFree( smbnam); return( xmlGetProp( fld_node, (const xmlChar *)"VALUE")); } xmlFree( smbnam); } /* end if smbnam */ } /* end if name == "FIELD" */ fld_node = fld_node->next; } /* end while fld_node != NULL */ return( NULL); } /* end ir_xml_smb_get_value() */ /** * ir_xml_checkresults_doc * @doc: Ptr to XML tree results obtained from a RIBCL command output. * @ilostr: String to identify a particular iLO2 in error messages. * * Scans the XML tree for all occurences of a RIBCL node, and for each, * examines the STATUS attribute of the RESULTS. * * Return value: RIBCL_SUCCESS if all STATUS attributes in the document * have a value of zero, otherwise the first non zero value * encountered or -1 if the document has no STATUS attributes. **/ int ir_xml_checkresults_doc( xmlDocPtr doc, char *ilostr){ xmlNodePtr cur_node; int ribcl_status; int successful; cur_node = xmlDocGetRootElement(doc); if( cur_node == NULL){ err("ir_xml_checkresults_doc(): XML document has no root."); return( -1); } successful = 0; /* Get the list of childern nodes from the root */ cur_node = cur_node->xmlChildrenNode; while( cur_node != NULL){ if((!xmlStrcmp( cur_node->name, (const xmlChar *)"RIBCL"))){ ribcl_status = ir_xml_scan_response( cur_node, ilostr); if( ribcl_status != RIBCL_SUCCESS){ return( ribcl_status); } else { successful = 1; } } cur_node = cur_node->next; } if( successful){ return( RIBCL_SUCCESS); } else { return( -1); } } /* end ir_xml_checkresults_doc() */ /** * ir_xml_scan_response * @RIBCLnode * ilostring * * Examines the RIBCL node for a RESPONSE section, and then returns the value * of the STATUS propery. * * If the STATUS property in the RESPONSE section is not equal to the value * zero (RIBCL_SUCCESS), then log any text in the MESSAGE property as an * error message. The string passed in parameter 'ilostring' will be * incorporated into the error message so each iLO2's messages can be * identified if multiple instances are in use. * * Return value: Integer value of the STATUS property on success, -1 on failure. **/ static int ir_xml_scan_response( xmlNodePtr RIBCLnode, char *ilostring) { xmlNodePtr resp_node; xmlChar *statprop; xmlChar *errmes; int ret_stat = RIBCL_SUCCESS; /* Parameter RIBCLnode should point to a RIBCL node in the RIBCL xml * output document. */ resp_node = RIBCLnode->xmlChildrenNode; while( resp_node != NULL){ if((!xmlStrcmp( resp_node->name, (const xmlChar *)"RESPONSE"))){ statprop = xmlGetProp( resp_node, (const xmlChar *)"STATUS"); if( statprop != NULL){ ret_stat = (int)( strtol( (char *)statprop, NULL, 0)); xmlFree( statprop); } /* Log the error message from iLO2 */ if( ret_stat != RIBCL_SUCCESS){ errmes = xmlGetProp( resp_node, (const xmlChar *)"MESSAGE"); if( errmes){ /* this condition indicates the requested setting is not supported on the platform. For example SET_HOST_POWER_SAVER HOST_POWER_SAVER="4" is not a supported value on a DL385 G2. Return RIBCL_UNSUPPORTED to the calling routine. */ if(xmlStrcmp(errmes, (const xmlChar *)"The value specified is invalid.") == 0) { ret_stat = RIBCL_UNSUPPORTED; } err("Error from iLO2 at %s : %s.", ilostring, (char *)errmes); xmlFree( errmes); } } return( ret_stat); } resp_node = resp_node->next; } return( -1); } /* end ir_xml_scan_response() */ /** * ir_xml_convert_buffer * @oldbuffer: Ptr to memory buffer containing the raw RIBCL output. * @ret_size: Ptr to an integer used to return the size of the new buffer. * * Converts a buffer containing the raw output from a RIBCL command * that may contain multiple XML documents into a new buffer containing * that output massaged into a single XML document. This is done by adding * an outer enclosing tag called RIBCL_RESPONSE_OUTPUT. * * The libxml2 parser also doesn't like multiple occurences of the XML * header , so we filter those out as we encounter * them during the buffer copy. * * The DL380 G6 also has a section that causes errors with the * libxml2 parser. Since we don't use this information, we filter this out * during the buffer copy as well. * * Return value: Ptr to the new buffer on success, or NULL if failure. **/ static char *ir_xml_convert_buffer( char* oldbuffer, int *ret_size) { int newsize; static char declmatch[] = ""; static char drives_end[] =""; static char prefix[] = ""; static char suffix[] = ""; int prefix_len = (int)strlen( prefix); int suffix_len = (int)strlen( suffix); int matchlen = (int)strlen( declmatch); int drives_startlen = (int)(strlen(drives_start)); int drives_endlen = (int)(strlen(drives_end)); char *newbuffer; char *retbuffer; *ret_size = 0; /* Allocate a buffer large enough to hold the original buffer * contents, along with our added enclosing tag */ newsize = (int)strlen( oldbuffer) + prefix_len + suffix_len + 1; if( (newbuffer = malloc( newsize)) == NULL){ return( NULL); } retbuffer = newbuffer; /* Add the prefix to the new buffer */ strcpy( newbuffer, prefix); newbuffer += prefix_len; while( *oldbuffer != '\0'){ if( *oldbuffer == '<'){ /* Filter out embedded XML headers */ if( strncmp( oldbuffer, declmatch, matchlen) == 0){ while( *oldbuffer != '>'){ /* Unclosed XML decl - Error */ if( *oldbuffer == '\0'){ free( newbuffer); return( NULL); } oldbuffer++; } oldbuffer++; /* Skip trailing '>' */ continue; } /* Filter out ... section */ else if( strncmp( oldbuffer, drives_start, drives_startlen) == 0){ while( strncmp( oldbuffer, drives_end, drives_endlen)){ /* Unclosed XML decl - Error */ if( *oldbuffer == '\0'){ free( newbuffer); return( NULL); } oldbuffer++; } oldbuffer += drives_endlen; continue; } } /* end if *oldbuffer == '<' */ *newbuffer++ = *oldbuffer++; } /* Add the suffix to the new buffer */ strcpy( newbuffer, suffix); newbuffer += suffix_len; *newbuffer = '\0'; *ret_size = (int)strlen( retbuffer); #ifdef IR_XML_DEBUG printf("Size of converted buffer is %d\n", *ret_size); #endif /* IR_XML_DEBUG */ return( retbuffer); } /* end ir_xml_convert_buffer() */ /** * ir_xml_doparse * @raw_ribcl_outbuf : ptr to a buffer containing RIBCL command output * * Fix up the raw RIBCL output and then use the libxml2 parser to * translate it into a xmlDoc tree. * * Return value: pointer to an XML doc tree on success, NULL on failure. **/ static xmlDocPtr ir_xml_doparse( char *raw_ribcl_outbuf) { xmlDocPtr doc; char *ribcl_xml_buf; int xml_buf_size; ribcl_xml_buf = ir_xml_convert_buffer( raw_ribcl_outbuf, &xml_buf_size); if( ribcl_xml_buf == NULL){ err("ir_xml_doparse(): Error converting XML output buffer."); return( NULL); } doc = xmlParseMemory( ribcl_xml_buf, xml_buf_size); if( doc == NULL){ err("ir_xml_doparse(): XML parsing failed."); } free( ribcl_xml_buf); return( doc); } /* end ir_xml_doparse() */ /** * ir_xml_extract_index * @prefix: String prefix for match * @sourcestr: Source string containing resource label * @inexact: Flag to specify inexact matching between prefix and index. * * This routine is used to parse an index number from a resource label * given by iLO2 in a RIBCL command response. The label consists of an * alpha prefix string followed by one or more numeric characters. An example * of a label would be "Fan 4". The index value of a label must be greater * than zero. * * Parameter 'prefix' gives a string prefix which must match the beginning * of the label passed with parameter 'sourcestr'. If sourcestr does not * begin with prefix, IR_NO_PREFIX is returned. * * If parameter 'inexact' is non-zero, there can be an arbitrary sequence * fo non-numeric characters between the prefix and the numeric value. As * an example, if prefix is "Fan", the lable string "Fan Unit 4" would result * in a return value of 4 from this function when inexact is non-zero, and * a return of IR_NO_INDEX when inexact is zero. * * Return value: * The resource index extracted from the label if success. * IR_NO_PREFIX if the prefix does not match the beginning of sourcestr. * IR_NO_INDEX if there was a problem extracting a numeric index. **/ static int ir_xml_extract_index( char *prefix, char *sourcestr, int inexact) { size_t p_len; int retval; /* First, check that the prefix matches the beginning of the * source string */ p_len = strlen( prefix); if( strncmp( prefix, sourcestr, p_len) ){ /* prefix didn't match */ return( IR_NO_PREFIX); } sourcestr = &sourcestr[p_len]; /* skip past the prefix */ /* If the inexact parameter is non zero, allow any number of * non-numeric characters between the prefix and the digits * of the index */ if( inexact){ while( *sourcestr != '\0'){ if( isdigit( *sourcestr)){ break; } sourcestr++; } } /* If we are at the end of the string now, return an error */ if( *sourcestr == '\0'){ return( IR_NO_INDEX); } /* Try to extract the index. We use strtol() here because it checks * for errors, while atoi() does not. */ errno = 0; retval = (int)strtol( sourcestr, (char **)NULL, 10); if( errno){ return( IR_NO_INDEX); } /* If strtol() couldn't find a number to convert, it returns zero. * Fortunately for us, zero is an illegal index value, so we can * detect it and return an error */ if( retval == 0){ retval = IR_NO_INDEX; } return( retval); } /*end ir_xml_extract_index() */ /** * ir_xml_replacestr * @ostring: pointer to the char pointer of oldstring. * @nstring: pointer to the new string. * * This routine will update the oldstring with the new string if they * differ, using this algorithm: * * If the new string is null{ * Don't modify the old string * } Else { * If the old string in non-null and the new string is different than * the old string { * Replace the old string with the new string * } * } * * Return value: * RIBCL_SUCCESS if success * -1 if failure **/ static int ir_xml_replacestr( char **ostring, char *nstring) { size_t len; /* If the new string is NULL, return success, leaving the * old string unchanged. */ if( nstring == NULL){ return( RIBCL_SUCCESS); } /* If the old string is non null, and the new string is * different than the old string, free the old string * and replace it with the new string. */ if( (*ostring != NULL) && (strcmp( *ostring, nstring)) ){ free( *ostring); *ostring = NULL; } if( *ostring == NULL){ len = strlen( nstring); *ostring = malloc( len+1); if( *ostring == NULL){ return( -1); } strncpy( *ostring, nstring, len+1); } return( RIBCL_SUCCESS); } /* end ir_xml_replacestr() */ /** * ir_xml_decode_chunked * @d_response: Pointer to the raw output from RIBCL command. * * Converts a buffer containing the raw output from a RIBCL command * that contains HTTP header and response in 'chunked' transfer encoding * into plain text that can be fed into the parser. * Return value: Ptr to the new buffer on success, or NULL if failure. **/ char* ir_xml_decode_chunked(char *d_response) { int hide = 1; int issizeofchunk = 1; char temp_line[ILO2_RIBCL_HTTP_LINE_MAX]; int chunksize = 0; int line_length; int i; int j; char *new_buffer = NULL; new_buffer = malloc(ILO2_RIBCL_DISCOVER_RESP_MAX); if( new_buffer == NULL){ err("ir_xml_decode_chunked():" "failed to allocate resp buffer."); return NULL; } memset( new_buffer, '\0', ILO2_RIBCL_DISCOVER_RESP_MAX); j = 0; i = 0; while(1){ i=0; memset( temp_line,'\0', ILO2_RIBCL_HTTP_LINE_MAX); while(( temp_line[i++] = *d_response++)!='\n'); line_length = strlen( temp_line); if( line_length == 0){ break; } if( hide){ if( line_length <= 2){ hide=0; } } else { if( issizeofchunk){ chunksize = hextodec(temp_line); issizeofchunk = 0; continue; } if( chunksize == 0){ break; } if( chunksize == line_length){ issizeofchunk = 1; hide = 1; } else { if( chunksize > line_length){ chunksize -= line_length; } else { issizeofchunk = 1; for( i = 0; i < chunksize ; i++, j++) new_buffer[j] = temp_line[i]; continue; } } i = 0; for(i = 0; i < line_length; i++, j++){ new_buffer[j] = temp_line[i]; } } } new_buffer[++j] = '\0'; return new_buffer; } /* end ir_xml_decode_chunked() */ /** * ir_xml_parse_iml * @oh_handler: Ptr to this instance's custom handler. * @ribcl_outbuf: Ptr to the raw RIBCL output from the GET_EVENT_LOG cmd * * Parses the output of the RIBCL GET_EVENT_LOG command. * Gets the pointer of the node "EVENT_LOG" in response data. * * Return value: RIBCL_SUCCESS on success, -1 if error. **/ int ir_xml_parse_iml( struct oh_handler_state *oh_handler, char *ribcl_outbuf) { xmlDocPtr doc = NULL; xmlNodePtr iml_data_node = NULL; ilo2_ribcl_handler_t *ir_handler = NULL; ir_handler = (ilo2_ribcl_handler_t *) oh_handler->data; /* Convert the RIBCL command output into a single XML document, * and the use the libxml2 parser to create an XML doc tree. */ doc = ir_xml_doparse( ribcl_outbuf); if( doc == NULL){ err("ir_xml_parse_iml(): Null doc returned."); return( -1); } /* Check all RESULTS sections in the output for a status value * of zero, which indicates success. */ if( ir_xml_checkresults_doc( doc, ir_handler->ilo2_hostport) != RIBCL_SUCCESS){ err("ir_xml_parse_iml(): Unsuccessful RIBCL status."); xmlFreeDoc( doc); return( -1); } /* Locate the EVENT_LOG subtree. It will contain * the useful results of the command. */ iml_data_node = ir_xml_find_node( xmlDocGetRootElement(doc), "EVENT_LOG"); if( iml_data_node == NULL){ err("ir_xml_parse_iml(): EVENT_LOG element not found."); xmlFreeDoc( doc); return( -1); } if( ir_xml_iml_write( oh_handler, iml_data_node) != RIBCL_SUCCESS){ xmlFreeDoc( doc); return( -1); } xmlFreeDoc( doc); return( RIBCL_SUCCESS); } /** * ir_xml_iml_write * @oh_handler: Ptr to this instance's custom handler * @iml_data_node: Points to EVENT_LOG subtree in the output xml * * Examines all the EVENT sub tree and writes the severity,class, * last_update,initial_update,count,description of the event in * the IML.Any new entry related to DIMM error is added to the list. * Return value: * RIBCL_SUCCESS if success, * SA_ERR_HPI_INTERNAL_ERROR if no entity root * -1 if error. **/ static int ir_xml_iml_write( struct oh_handler_state *oh_handler, xmlNodePtr iml_data_node) { xmlNodePtr evt_node = NULL, tmp=NULL; xmlNodePtr n = NULL; xmlChar *severity = NULL, *class=NULL; xmlChar *last_update = NULL; SaErrorT ret = SA_OK; SaHpiEntityPathT ep_root; ilo2_ribcl_handler_t *ir_handler = NULL; struct tm time = {0,0,0,0,0,0,0,0,-1}; SaHpiTimeT seconds = 0; SaHpiTimeT tmp_time; SaHpiTimeT local_time = 0; ir_handler = (ilo2_ribcl_handler_t *) oh_handler->data; memset( &ep_root, 0, sizeof(SaHpiEntityPathT)); ret = oh_encode_entitypath(ir_handler->entity_root, &ep_root); if( ret != SA_OK){ err("ir_xml_iml_write(): Cannot convert entity path %s.", \ ir_handler->entity_root); return(SA_ERR_HPI_INTERNAL_ERROR); } evt_node = ir_xml_find_node( iml_data_node, "EVENT"); if( evt_node == NULL) return ( -1); if ( !ir_handler->iml_log_time){ tmp= evt_node; while (tmp){ if((!xmlStrcmp( tmp->name, (const xmlChar *)"EVENT"))){ n = ir_xml_find_node(tmp, "EVENT"); if( n != NULL){ last_update = xmlGetProp(n, (const xmlChar *)"LAST_UPDATE"); time = (struct tm){0,0,0,0,0,0,0,0,-1}; strptime((const char*) last_update,"%m/%d/%Y %H:%M", &time); tmp_time = mktime( &time) * 1000000000LL; if (tmp_time > ir_handler->iml_log_time) ir_handler->iml_log_time = tmp_time; } } tmp=tmp->next; } /* If no events are present, set iml_log_time to process first event */ if (!ir_handler->iml_log_time) ir_handler->iml_log_time = 1; dbg("iml_log_time is %lli",(long long int)ir_handler->iml_log_time); } local_time = ir_handler->iml_log_time; while( evt_node != NULL){ if((!xmlStrcmp( evt_node->name, (const xmlChar *)"EVENT"))){ n = ir_xml_find_node(evt_node, "EVENT"); if( n != NULL){ severity = xmlGetProp( n, (const xmlChar *)"SEVERITY"); class = xmlGetProp( n, (const xmlChar *)"CLASS"); last_update = xmlGetProp( n, (const xmlChar *)"LAST_UPDATE"); time = (struct tm){0,0,0,0,0,0,0,0,-1}; strptime((const char*) last_update,"%m/%d/%Y %H:%M", &time); seconds = mktime( &time) * 1000000000LL; if( seconds > ir_handler->iml_log_time) { if (seconds > local_time) local_time = seconds; if ( !xmlStrcmp( class, (const xmlChar *)"Power") || !xmlStrcmp( class, (const xmlChar *)"Environment")) { ir_handler->need_rediscovery = TRUE; } if(!xmlStrcmp( severity, (const xmlChar *)"Caution")|| !xmlStrcmp( severity,(const xmlChar *)"Critical")){ ir_handler->need_rediscovery = TRUE; ret = ilo2_ribcl_iml_event(n,ir_handler->ilo2_hostport, oh_handler, &ep_root, (char *)severity, seconds); if( ret != SA_OK){ err("ilo2_ribcl_iml_event():failed"); if(local_time > ir_handler->iml_log_time) ir_handler->iml_log_time = local_time; return ( -1); } } } /* In a while loop, free and set the pointer to NULL */ if( severity){ xmlFree(severity); severity = NULL; } if( class){ xmlFree(class); class = NULL; } if( last_update){ xmlFree(last_update); last_update = NULL; } } } evt_node = evt_node->next; }/* end while evt_node != NULL */ if(local_time > ir_handler->iml_log_time) ir_handler->iml_log_time = local_time; return( RIBCL_SUCCESS); } /** end of ir_xml_iml_write()**/ /** *ilo2_ribcl_iml_event *n - pointer to IML xml data oA *host - Pointer to host IP *@oh_handler: Handler data pointer. *@resource_ep: pointer to the entity path for this resource. * *Detailed description: * - Look up the existing rpt entry from the resource_ep entity * path parameter. * - Call oh_evt_queue_push() to push IML error details to event queue. * *Return values: * SA_OK if success * SA_ERR_HPI_OUT_OF_MEMORY if allocation fails. * SA_ERR_HPI_NOT_PRESENT if the rpt entry for resource_ep is not found. **/ static SaErrorT ilo2_ribcl_iml_event(xmlNodePtr n, char *host, struct oh_handler_state *oh_handler, SaHpiEntityPathT *resource_ep, char *severity, SaHpiTimeT sec) { struct oh_event *ev = NULL; SaHpiRptEntryT *rpt = NULL; SaHpiSensorReadingT current_reading = {0}; xmlChar *class = NULL; xmlChar *last_update = NULL; xmlChar *initial_update = NULL; xmlChar *count = NULL; xmlChar *description = NULL; SaHpiSensorTypeT type; char log_desc[SAHPI_SENSOR_BUFFER_LENGTH] = {0}; rpt = oh_get_resource_by_ep( oh_handler->rptcache, resource_ep); if( rpt == NULL){ /* This should never happen */ err("ilo2_ribcl_iml_event(): Null rpt entry for failed resource"); return( SA_ERR_HPI_NOT_PRESENT); } ev = oh_new_event(); if( ev == NULL){ err("ilo2_ribcl_iml_event(): event allocation failed."); return( SA_ERR_HPI_OUT_OF_MEMORY); } class = xmlGetProp( n, (const xmlChar *)"CLASS"); last_update = xmlGetProp( n, (const xmlChar *)"LAST_UPDATE"); initial_update = xmlGetProp( n, (const xmlChar *)"INITIAL_UPDATE"); count = xmlGetProp( n, (const xmlChar *)"COUNT"); description = xmlGetProp( n, (const xmlChar *)"DESCRIPTION"); if( !xmlStrcmp( class, (const xmlChar *)"Main Memory") || !xmlStrcmp(class, (const xmlChar *)"Cache Memory") || !xmlStrcmp( class, (const xmlChar *)"Non-Volatile Memory")){ type = SAHPI_MEMORY; }else if(!xmlStrcmp(class, (const xmlChar *)"Environment") || !xmlStrcmp(class, (const xmlChar *)"POST Message")){ type = SAHPI_SYSTEM_EVENT; }else if( !xmlStrcmp( class, (const xmlChar *)"Power")){ type = SAHPI_POWER_SUPPLY; } else if(!xmlStrcmp(class, (const xmlChar *)"OS")){ type= SAHPI_OS_CRITICAL_STOP; }else if(!xmlStrcmp(class, (const xmlChar *)"Maintenance")){ type = SAHPI_MANAGEMENT_SUBSYSTEM_HEALTH; }else if(!xmlStrcmp(class, (const xmlChar *)"Drive Array") || !xmlStrcmp(class, (const xmlChar *)"Expansion Slot")){ type = SAHPI_DRIVE_SLOT; }else if(!xmlStrcmp(class, (const xmlChar *)"System Error")){ type = SAHPI_PLATFORM_VIOLATION; }else if(!xmlStrcmp(class, (const xmlChar *)"PCI Bus")){ type = SAHPI_COMM_CHANNEL_BUS_STATE; }else if(!xmlStrcmp(class, (const xmlChar *)"Host Bus")){ type = SAHPI_MANAGEMENT_BUS_STATE; }else if(!xmlStrcmp(class, (const xmlChar *)"Network")){ type = SAHPI_LAN; }else if(!xmlStrcmp(class, (const xmlChar *)"Power Cap")){ type = SAHPI_POWER_BUDGET; }else if(!xmlStrcmp(class, (const xmlChar *)"ASR")){ type = SAHPI_OS_BOOT; }else if(!xmlStrcmp(class, (const xmlChar *)"UPS")){ type = SAHPI_BATTERY; }else { err("Unknown IML event"); type = SAHPI_OTHER_UNITS_BASED_SENSOR; } err("%s error in %s", class,host); err("Severity:%s,Class:%s", severity, class); err("LastUpdte: %s,IntialUpdte: %s,Count:%s", last_update, initial_update, count); err("Description:\"%s\"", description); if(description) dbg("description = %s", description); else dbg("description is NULL"); strncpy(log_desc,(const char *)description, SAHPI_SENSOR_BUFFER_LENGTH-1); ev->resource = *rpt; ev->hid = oh_handler->hid; ev->event.Source = ev->resource.ResourceId; ev->event.EventType = SAHPI_ET_SENSOR; if( strcmp( severity,"Critical") == 0) ev->event.Severity = SAHPI_CRITICAL; else if( strcmp( severity,"Caution") == 0) ev->event.Severity = SAHPI_MAJOR; if( sec < 0) ev->event.Timestamp = SAHPI_TIME_UNSPECIFIED; else ev->event.Timestamp = sec; ev->event.EventDataUnion.SensorEvent.OptionalDataPresent = SAHPI_SOD_TRIGGER_READING; ev->event.EventDataUnion.SensorEvent.SensorType = type; current_reading.IsSupported = SAHPI_TRUE; current_reading.Type = SAHPI_SENSOR_READING_TYPE_BUFFER; strncpy((char *) current_reading.Value.SensorBuffer, log_desc, SAHPI_SENSOR_BUFFER_LENGTH); ev->event.EventDataUnion.SensorEvent.TriggerReading = current_reading; oh_evt_queue_push(oh_handler->eventq, ev); if( class){ xmlFree( class); } if( last_update){ xmlFree( last_update); } if( initial_update){ xmlFree( initial_update); } if( count){ xmlFree( count); } if( description){ xmlFree( description); } return( SA_OK); } /* end ilo2_ribcl_iml_event() */ /** * hextodec * @hex: string containing hex values. * * convert the hex ascii charecters to integer value * * Return value: a long containing the Decimal value **/ long hextodec(char hex[]) { return( strtol(hex, NULL, 16)); }/* end hextodec() */ #ifdef ILO2_RIBCL_DEBUG_SENSORS static char *ilo2_ribcl_sval2string[] = { "I2R_SEN_VAL_OK", "I2R_SEN_VAL_DEGRADED", "I2R_SEN_VAL_FAILED" }; static char *ilo2_ribcl_sstate2string[] = { "I2R_INITIAL", "I2R_OK", "I2R_DEGRADED_FROM_OK", "I2R_DEGRADED_FROM_FAIL", "I2R_FAILED" }; static char *ilo2_ribcl_snum2string[] = { "INVALID NUMBER", "I2R_SEN_FANHEALTH", "I2R_SEN_TEMPHEALTH", "I2R_SEN_POWERHEALTH" }; void dump_chassis_sensors( ilo2_ribcl_handler_t *ir_handler) { int iter; int val; ilo2_ribcl_DiscoveryData_t *ddata; char *s1; char *s2; char *s3; ddata = &(ir_handler->DiscoveryData); for( iter = 1; iter < I2R_NUM_CHASSIS_SENSORS; iter++){ s1 = ilo2_ribcl_snum2string[ iter]; val = ddata->chassis_sensors[ iter].state; if( val == 0xFFFF){ s2 = "I2R_NO_EXIST"; } else { s2 = ilo2_ribcl_sstate2string[ val]; } val = ddata->chassis_sensors[ iter].reading.intval; if( val == -1){ s3 = "I2R_SEN_VAL_UNINITIALIZED"; } else { s3 = ilo2_ribcl_sval2string[val]; } err("Sensor %s state %s value %s.", s1, s2, s3); } } /* end dump_chassis_sensors() */ #endif /* ILO2_RIBCL_DEBUG_SENSORS */ openhpi-3.6.1/plugins/ilo2_ribcl/ilo2_ribcl_discover.c0000644000175100017510000026214612575647266021775 0ustar mohanmohan/* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Shuah Khan * Richard White */ #include #include #include #include #include #include #ifdef ILO2_RIBCL_SIMULATE_iLO2_RESPONSE #include /* For test routine ilo2_ribcl_getfile() */ #include /* For test routine ilo2_ribcl_getfile() */ #endif /* ILO2_RIBCL_SIMULATE_iLO2_RESPONSE */ #include "sahpi_wrappers.h" /* Foreward decls: */ static SaErrorT ilo2_ribcl_do_discovery( ilo2_ribcl_handler_t *ir_handler); static SaErrorT ilo2_ribcl_discover_chassis( struct oh_handler_state *, SaHpiEntityPathT *); static SaErrorT ilo2_ribcl_discover_cpu( struct oh_handler_state *, SaHpiEntityPathT *); static SaErrorT ilo2_ribcl_discover_memory( struct oh_handler_state *, SaHpiEntityPathT *); static SaErrorT ilo2_ribcl_discover_powersupplies( struct oh_handler_state *, SaHpiEntityPathT *); static SaErrorT ilo2_ribcl_discover_vrm( struct oh_handler_state *, SaHpiEntityPathT *); static SaErrorT ilo2_ribcl_discover_fans( struct oh_handler_state *, SaHpiEntityPathT *); static SaErrorT ilo2_ribcl_discovered_fru( struct oh_handler_state *, SaHpiEntityPathT *, enum ir_discoverstate *, int, char *, struct ilo2_ribcl_idr_info *); static void ilo2_ribcl_discover_temp_sensors( struct oh_handler_state *, struct oh_event *); static SaErrorT ilo2_ribcl_resource_set_failstatus( struct oh_handler_state *, SaHpiEntityPathT *, SaHpiBoolT); static SaErrorT ilo2_ribcl_undiscovered_fru( struct oh_handler_state *, SaHpiEntityPathT *, enum ir_discoverstate *, int, char *); static void ilo2_ribcl_clear_discoveryflags( ilo2_ribcl_handler_t *); static SaErrorT ilo2_ribcl_controls(struct oh_handler_state *, int, struct oh_event *, char *); static SaErrorT ilo2_ribcl_add_severity_sensor( struct oh_handler_state *, struct oh_event *, int, SaHpiSensorTypeT, SaHpiEventStateT, struct ilo2_ribcl_sensinfo *, char *); static SaErrorT ilo2_ribcl_add_threshold_sensor( struct oh_handler_state *, struct oh_event *, int, SaHpiSensorTypeT, SaHpiEventStateT, struct ilo2_ribcl_sensinfo *, char *); static void ilo2_ribcl_discover_chassis_sensors( struct oh_handler_state *, struct oh_event *); void ilo2_ribcl_add_resource_capability( struct oh_handler_state *, struct oh_event *, SaHpiCapabilitiesT); static SaErrorT ilo2_ribcl_get_iml( struct oh_handler_state *); static SaErrorT ilo2_ribcl_discovery(void *); gpointer ilo_thread_func( gpointer); #ifdef ILO2_RIBCL_SIMULATE_iLO2_RESPONSE static int ilo2_ribcl_getfile( char *, char *, int); #endif /* ILO2_RIBCL_SIMULATE_iLO2_RESPONSE */ extern SaHpiBoolT close_handler; /** * ilo2_ribcl_discovery() * @handler Handler data pointer. * * This function is called by ilo2_ribcl_discover_resources and it is * used for initail discovery and re-discovery, if required * * Return Values * SA_OK - On Success * SA_ERR_HPI_INTERNAL_ERROR if no entity_root * return values of other functions, if they fail * **/ static SaErrorT ilo2_ribcl_discovery(void *handler) { struct oh_handler_state *oh_handler = (struct oh_handler_state *) handler; ilo2_ribcl_handler_t *ilo2_ribcl_handler = (ilo2_ribcl_handler_t *) oh_handler->data; SaErrorT ret; SaHpiEntityPathT ep_root; dbg("Begin discovery/re-discovery"); ret = oh_encode_entitypath(ilo2_ribcl_handler->entity_root, &ep_root); if( ret != SA_OK){ err("ilo2_ribcl_discover_resources(): Cannot convert entity path."); return(SA_ERR_HPI_INTERNAL_ERROR); } ilo2_ribcl_clear_discoveryflags( ilo2_ribcl_handler); /* Send the RIBCL commands to iLO2 for discovery. The results * will have been written to DiscoveryData in the private handler * when ilo2_ribcl_do_discovery() returns. */ ret = ilo2_ribcl_do_discovery( ilo2_ribcl_handler); if( ret != SA_OK){ err("ilo2_ribcl_discover_resources(): discovery failed."); return( ret); } /* Now, we examine DiscoveryData and create resource events. Creating events is done in other functions called from this routine */ /* set first_discovery_done. */ if( !ilo2_ribcl_handler->first_discovery_done){ /* We only need to create a resource for the chassis once */ ret = ilo2_ribcl_discover_chassis( oh_handler, &ep_root); if( ret != SA_OK){ err("ilo2_ribcl_discover_resources(): chassis discovery failed."); return( ret); } ilo2_ribcl_handler->first_discovery_done = 1; } else { /* Even though the chassis itself is not an FRU, its * firmware can be updated, which can change its inventory * data. So, check for inventory updates. */ ilo2_ribcl_update_chassis_idr( oh_handler, &ep_root); } ret = ilo2_ribcl_discover_cpu( oh_handler, &ep_root); if( ret != SA_OK){ err("ilo2_ribcl_discover_resources(): cpu discovery failed."); return( ret); } ret = ilo2_ribcl_discover_memory( oh_handler, &ep_root); if( ret != SA_OK){ err("ilo2_ribcl_discover_resources(): memory discovery failed."); return( ret); } ret = ilo2_ribcl_discover_powersupplies( oh_handler, &ep_root); if( ret != SA_OK){ err("ilo2_ribcl_discover_resources(): power supply discovery failed."); return( ret); } ret = ilo2_ribcl_discover_vrm( oh_handler, &ep_root); if( ret != SA_OK){ err("ilo2_ribcl_discover_resources(): VRM discovery failed."); return( ret); } ret = ilo2_ribcl_discover_fans( oh_handler, &ep_root); if( ret != SA_OK){ err("ilo2_ribcl_discover_resources(): fan discovery failed."); return( ret); } dbg("End discovery/re-discovery"); return (ret); } /** * ilo_thread_func() * @ilo_info: With mutex, cond and handler * Thread responsible for re-discover, if required * Process sensors regularly * In a continuous loop till close_handler is set * Mutex and condition timer are used to exit immediately on signal * **/ gpointer ilo_thread_func( gpointer ilo_info) { SaErrorT ret; iLO_info_t *pilo_info = (iLO_info_t*)ilo_info; struct oh_handler_state *oh_handler = pilo_info->oh_handler; ilo2_ribcl_handler_t *ilo2_ribcl_handler = oh_handler->data; dbg("iLO thread started: process sensor, iml log"); wrap_g_mutex_lock(pilo_info->iLO_mutex); while (close_handler == SAHPI_FALSE) { ilo2_ribcl_process_sensors( oh_handler); ret = ilo2_ribcl_get_iml(oh_handler); if( ret != SA_OK){ err("ilo2_ribcl_get_iml():failed, check network"); err("May have to restart daemon if it continuous"); // TODO : on error ? } /* A sort of re-discovery */ if (ilo2_ribcl_handler->need_rediscovery == SAHPI_TRUE) { dbg("Do a discovery due to a PS/FAN event"); ilo2_ribcl_discovery(oh_handler); ilo2_ribcl_handler->need_rediscovery = SAHPI_FALSE; } #if GLIB_CHECK_VERSION (2, 32, 0) gint64 time; time = g_get_monotonic_time(); time = time + (180 * G_USEC_PER_SEC); wrap_g_cond_timed_wait( pilo_info->iLO_cond, pilo_info->iLO_mutex, time); #else GTimeVal time; g_get_current_time(&time); g_time_val_add(&time, (180 * G_USEC_PER_SEC)); wrap_g_cond_timed_wait( pilo_info->iLO_cond, pilo_info->iLO_mutex, &time); #endif } wrap_g_mutex_unlock(pilo_info->iLO_mutex); dbg("iLO thread exited: process sensor, iml log"); return (gpointer *) SA_OK; } /** * ilo2_ribcl_discover_resources: Discovers resources for this instance * of the iLO2 RIBCL plug-in * @handler: Handler data pointer. * * This function discovers resources for this instance of the iLO2 * RIBCL plugin. * Detailed description: * * - Reset the discovery flags for each resource in DiscoveryData * via a call to ilo2_ribcl_clear_discoveryflags(). This allows us * to detect removed resources. * - Call ilo2_ribcl_do_discovery(), which will open an SSL connection * to iLO2 using the hostname and port saved in the ilo2_ribcl_handler * send the ILO2_RIBCL_GET_SERVER_DATA xml commands, and parse the * results into information stored in the DiscoveryData structure * within our private handler. * - Finally, call a series of discovery routines that examine * DiscoveryData and generate rpt entries and events for * resources that have been added, removed, or failed. * * Return values: * Builds/updates internal RPT cache - normal operation. * Returns SA_OK for success * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory * SA_ERR_HPI_INTERNAL_ERROR - SSL and XML errors * SA_ERR_HPI_INVALID_PARAMS - if plungin handler or private handler is null * **/ SaErrorT ilo2_ribcl_discover_resources(void *handler) { struct oh_handler_state *oh_handler = (struct oh_handler_state *) handler; ilo2_ribcl_handler_t *ilo2_ribcl_handler; SaErrorT ret; if( close_handler == SAHPI_TRUE ) { INFO("ilo2_ribcl_handler is closed. Thread %p returning", g_thread_self()); return(SA_OK); } if (!handler) { err("ilo2_ribcl_discover_resources(): NULL handler parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } ilo2_ribcl_handler = (ilo2_ribcl_handler_t *) oh_handler->data; if(! ilo2_ribcl_handler) { err("ilo2_ribcl_discover_resources(): NULL private handler"); return(SA_ERR_HPI_INVALID_PARAMS); } if( ilo2_ribcl_handler->entity_root == NULL){ err("ilo2_ribcl_discover_resources(): entity_root is NULL."); return(SA_ERR_HPI_INTERNAL_ERROR); } /* If our plugin becomes multhithreaded, lock here? */ if (ilo2_ribcl_handler->discovery_complete == SAHPI_TRUE) return SA_OK; ret = ilo2_ribcl_discovery(oh_handler); if ( ret != SA_OK){ err("ilo2_ribcl_discovery():failed"); return (ret); } ilo2_ribcl_handler->discovery_complete = SAHPI_TRUE; if (ilo2_ribcl_handler->ilo_thread_data->hthread == NULL) { ilo2_ribcl_handler->ilo_thread_data->hthread = wrap_g_thread_create_new( "ilo_sensor_thread", ilo_thread_func, ilo2_ribcl_handler->ilo_thread_data, TRUE, 0); if (ilo2_ribcl_handler->ilo_thread_data->hthread == NULL) { err("wrap_g_thread_create_new failed"); return SA_ERR_HPI_INTERNAL_ERROR; } } dbg("ilo_sensor_thread: Thread created successfully"); return(SA_OK); } /** * ilo2_ribcl_do_discovery * @ir_handler: The private handler for this plugin instance. * * This routine sends the ILO2_RIBCL_GET_SERVER_DATA xml commands * to an iLO2 via a SSL connection, receive the resulting output * from iLO2, parses that output, and adds information about discovered * resources into the private handler's DiscoveryData structure. * * Detailed description: * * - Allocate a temporary buffer to receive the response from iLO2. * - Retrieve the xml code for the ILO2_RIBCL_GET_SERVER_DATA commands * that have already been customized with the login and password of * the target iLO2. * - Call ilo2_ribcl_ssl_send_command() to make a SSL connection with * the iLO2 addressed in the configuration file, send the xml commands, * and retrieve the response in our temporary buffer. * - Call ir_xml_parse_discoveryinfo() to parse the iLO2 response and * enter data about the resources into the DiscoveryData structure * located in out private handler. * - Free the temporary response buffer. * * Return values: * SA_OK for success. * SA_ERR_HPI_OUT_OF_MEMORY if allocation fails * SA_ERR_HPI_INTERNAL_ERROR if our customized command is null or * if response parsing fails. * **/ static SaErrorT ilo2_ribcl_do_discovery( ilo2_ribcl_handler_t *ir_handler) { char *discover_cmd; char *d_response; /* command response buffer */ int ret; char *new_buffer=NULL; /* Allocate a temporary response buffer. Since the discover * command should be infrequently run, we dynamically allocate * instead of keeping a buffer around all the time. */ d_response = malloc(ILO2_RIBCL_DISCOVER_RESP_MAX); if( d_response == NULL){ err("ilo2_ribcl_do_discovery(): failed to allocate resp buffer."); return( SA_ERR_HPI_OUT_OF_MEMORY); } /* Retrieve our customized command buffer */ discover_cmd = ir_handler->ribcl_xml_cmd[IR_CMD_GET_SERVER_DATA]; if( discover_cmd == NULL){ err("ilo2_ribcl_do_discovery(): null customized command."); free( d_response); return( SA_ERR_HPI_INTERNAL_ERROR); } #ifdef ILO2_RIBCL_SIMULATE_iLO2_RESPONSE if( ir_handler->discovery_responsefile){ /* If we have specified a discovery_responsefile in our * config file, read the iLO2 response from this file * rather that communicating with an actual iLO2. This is * used for automated testing of this plugin. */ err("ilo2_ribcl_do_discovery(): Using contents of %s instead of iLO2 communication.", ir_handler->discovery_responsefile); ret = ilo2_ribcl_getfile( ir_handler->discovery_responsefile, d_response, ILO2_RIBCL_DISCOVER_RESP_MAX); } else { if(ir_handler->ilo_type == NO_ILO){ ret = ilo_ribcl_detect_ilo_type(ir_handler); if( ret <0){ err("ilo2_ribcl_do_discovery():" "could not detect iLO type."); free( d_response); return( SA_ERR_HPI_INTERNAL_ERROR); } /* *We found the ilo_type in ret *assign it to the handler here */ ir_handler->ilo_type = ret; } /* Send the command to iLO2 and get the response. */ ret = ilo2_ribcl_ssl_send_command( ir_handler, discover_cmd, d_response, ILO2_RIBCL_DISCOVER_RESP_MAX); if(ir_handler->ilo_type == ILO3) { if(strstr(d_response,"Gen8") || strstr(d_response,"Gen9")) { dbg("Found iLO4 MP"); ir_handler->ilo_type = ILO4; } else dbg("Found iLO3 MP"); } } #else /* ILO2_RIBCL_SIMULATE_iLO2_RESPONSE not defined. This the the normal use, non-testing case. */ if(ir_handler->ilo_type == NO_ILO){ ret = ilo_ribcl_detect_ilo_type(ir_handler); if( ret <0){ err("ilo2_ribcl_do_discovery():" "could not detect iLO type."); free( d_response); return( SA_ERR_HPI_INTERNAL_ERROR); } /* *We found the ilo_type in ret *assign it to the handler here */ ir_handler->ilo_type = ret; } /* Send the command to iLO2 and get the response. */ ret = ilo2_ribcl_ssl_send_command( ir_handler, discover_cmd, d_response, ILO2_RIBCL_DISCOVER_RESP_MAX); if(ir_handler->ilo_type == ILO3) { if(strstr(d_response,"Gen8") || strstr(d_response,"Gen9")) { dbg("Found iLO4 MP"); ir_handler->ilo_type = ILO4; }else dbg("Found iLO3 MP"); } #endif /* ILO2_RIBCL_SIMULATE_iLO2_RESPONSE */ if( ret != 0){ err("ilo2_ribcl_do_discovery(): command send failed."); free( d_response); return( SA_ERR_HPI_INTERNAL_ERROR); } /* Now, parse the response. The information we extract will be * written into the DiscoveryData element in our private handler */ /* *switch based on ilo * */ switch(ir_handler->ilo_type){ case ILO: case ILO2: ret = ir_xml_parse_discoveryinfo( ir_handler, d_response); break; case ILO3: case ILO4: new_buffer = ir_xml_decode_chunked(d_response); ret = ir_xml_parse_discoveryinfo( ir_handler, new_buffer); break; default: err("ilo2_ribcl_do_discovery():" "failed to detect ilo type %d.", ir_handler->ilo_type); } if( ret != RIBCL_SUCCESS){ err("ilo2_ribcl_do_discovery(): response parse failed."); free( d_response); free( new_buffer); return( SA_ERR_HPI_INTERNAL_ERROR); } /* We're finished. Free up the temporary response buffer */ free( d_response); /* * new_buffer will be NULL for ILO2 * it is absolutely fine to free NULL */ free( new_buffer); return( SA_OK); } /* end ilo2_ribcl_do_discovery() */ /** * ilo2_ribcl_clear_discoveryflags * @ir_handler: Pointer to the plugin private handler. * * This routine clears the IR_DISCOVERED bit in the flags element * for all discoverable resources that can be removed. * * Return values: None **/ void ilo2_ribcl_clear_discoveryflags( ilo2_ribcl_handler_t *ir_handler){ ilo2_ribcl_DiscoveryData_t *ddata; int idex; ddata = & (ir_handler->DiscoveryData); /* Clear the CPU flags */ for( idex = 1; idex <= ILO2_RIBCL_DISCOVER_CPU_MAX; idex++){ ddata->cpudata[idex].cpuflags &= ~IR_DISCOVERED; } /* Clear the memory flags */ for( idex = 1; idex <= ILO2_RIBCL_DISCOVER_MEM_MAX; idex++){ ddata->memdata[idex].memflags &= ~IR_DISCOVERED; } /* Clear the fan flags */ for( idex = 1; idex <= ILO2_RIBCL_DISCOVER_FAN_MAX; idex++){ ddata->fandata[idex].fanflags &= ~IR_DISCOVERED; } /* Clear the power supply flags */ for( idex = 1; idex <= ILO2_RIBCL_DISCOVER_PSU_MAX; idex++){ ddata->psudata[idex].psuflags &= ~IR_DISCOVERED; } /* Clear the VRM flags */ for( idex = 1; idex <= ILO2_RIBCL_DISCOVER_PSU_MAX; idex++){ ddata->vrmdata[idex].vrmflags &= ~IR_DISCOVERED; } /* Clear the Temperature Sensor flags */ for( idex = 4; idex <= ILO2_RIBCL_DISCOVER_TS_MAX; idex++){ ddata->tsdata[idex].tsflags &= ~IR_DISCOVERED; } } /* end ilo2_ribcl_clear_discoveryflags() */ /** * ilo2_ribcl_discover_chassis * @oh_handler: Handler data pointer. * * This function creates the rpt entry for our root resource, which * is the rack-mount server itself. After adding the resource to the handler's * rpt cache, we send a SAHPI_RESE_RESOURCE_ADDED event. * * Detailed description: * * - First, we build a resource tag from the product name, the * serial number, and the EntityLocation. * - Then we allocate a new event, with the resource entry specifying * ResourceCapabilities of SAHPI_CAPABILITY_RESOURCE and * SAHPI_CAPABILITY_RESET, no HotSwapCapabilities and a * ResourceSeverity of SAHPI_CRITICAL. * - Call oh_add_resource() to add the resource to the handler's rpt * cache. * - Call oh_evt_queue_push() to send a SAHPI_RESE_RESOURCE_ADDED * resource event. * * Return values: * SA_OK if success * SA_ERR_HPI_OUT_OF_MEMORY if allocation fails * **/ static SaErrorT ilo2_ribcl_discover_chassis( struct oh_handler_state *oh_handler, SaHpiEntityPathT *ep_root) { struct oh_event *ev = NULL; ilo2_ribcl_handler_t *ir_handler = NULL; ilo2_ribcl_resource_info_t *res_info = NULL; char *tmptag = NULL,*autopower= NULL; size_t tagsize; SaErrorT ret; ir_handler = (ilo2_ribcl_handler_t *) oh_handler->data; if( (ir_handler->DiscoveryData.product_name) && (ir_handler->DiscoveryData.serial_number) ){ /* We build the tag from the product name, serial number, and * EntityLocation. Add 6 additional bytes for " SN: " notation */ tagsize = strlen( ir_handler->DiscoveryData.product_name) + strlen( ir_handler->DiscoveryData.serial_number) + OH_MAX_LOCATION_DIGITS + 8; tmptag = malloc( tagsize); if( tmptag == NULL){ err("ilo2_ribcl_discover_chassis(): tag message allocation failed."); return( SA_ERR_HPI_OUT_OF_MEMORY); } snprintf( tmptag, tagsize, "%s SN:%s (%2d)", ir_handler->DiscoveryData.product_name, ir_handler->DiscoveryData.serial_number, ep_root->Entry[0].EntityLocation); } else { /* If we didn't get a product name and a serial number, * use the default of "HP Rackmount Server". */ tagsize = OH_MAX_LOCATION_DIGITS + 19 + 3; /* String plus " ()" */ tmptag = malloc( tagsize); if( tmptag == NULL){ err("ilo2_ribcl_discover_chassis(): tag message allocation failed."); return( SA_ERR_HPI_OUT_OF_MEMORY); } snprintf( tmptag, tagsize, "%s (%2d)", "HP Rackmount Server", ep_root->Entry[0].EntityLocation); } /* Create a resource event for the box itself */ ev = oh_new_event(); if( ev == NULL){ err("ilo2_ribcl_discover_chassis(): event allocation failed."); free( tmptag); return( SA_ERR_HPI_OUT_OF_MEMORY); } /* Fill in the resource part of the event */ /* Plugin doesn't set EntryID */ ev->resource.ResourceEntity = *ep_root; ev->resource.ResourceId = oh_uid_from_entity_path(&(ev->resource.ResourceEntity)); ev->resource.ResourceInfo.ManufacturerId = HP_MANUFACTURING_ID; ev->resource.ResourceInfo.FirmwareMajorRev = ir_handler->DiscoveryData.fwdata.FirmwareMajorRev; ev->resource.ResourceInfo.FirmwareMinorRev = ir_handler->DiscoveryData.fwdata.FirmwareMinorRev; ev->resource.ResourceCapabilities = (SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_RESET | SAHPI_CAPABILITY_POWER | SAHPI_CAPABILITY_RDR); ev->resource.HotSwapCapabilities = ILO2_RIBCL_MANAGED_HOTSWAP_CAP_FALSE; ev->resource.ResourceSeverity = SAHPI_OK; ev->resource.ResourceFailed = SAHPI_FALSE; oh_init_textbuffer(&(ev->resource.ResourceTag)); oh_append_textbuffer( &(ev->resource.ResourceTag), tmptag); /* Allocate and populate iLO2 RIBCL private data area to be added to the resource rpt cache */ res_info = (ilo2_ribcl_resource_info_t *) g_malloc0(sizeof(ilo2_ribcl_resource_info_t)); if(res_info == NULL) { err("ilo2_ribcl_discover_chassis(): out of memory"); oh_event_free( ev, 0); free( tmptag); return( SA_ERR_HPI_OUT_OF_MEMORY); } res_info->rid = ev->resource.ResourceId; /* Safe to mark it active. This state is not applicable to non-FRU resources and will not be used as SAHPI_CAPABILITY_FRU is not set for this resource. */ res_info->fru_cur_state = SAHPI_HS_STATE_ACTIVE; res_info->disc_data_idx = ILO2_RIBCL_CHASSIS_INDEX; res_info->power_cur_state = ILO2_RIBCL_POWER_STATUS_UNKNOWN; /* Add the resource to this instance's rpt cache */ ret = oh_add_resource( oh_handler->rptcache, &(ev->resource), res_info, 0); if( ret != SA_OK){ err("ilo2_ribcl_discover_chassis(): cannot add resource to rptcache."); oh_event_free( ev, 0); free( tmptag); return( ret); } /* * Add control RDRs. ProLiant Rack Mounts have allow Unit ID (UID) * Light on the server to be turned off or on. There are power * saver, and Server Auto Power controls avalable as well. Add one * RDR each for UID, Power Saver conrol, and Auto Power Control. */ if(ilo2_ribcl_controls(oh_handler, ILO2_RIBCL_CTL_UID, ev, "Unit Identification Light (UID) Values: On(1)/Off(0)") == SA_OK) { /* UID control RDR has beeen added successfully. Set RDR and CONTROL capability flags. Please note that failing to add control rdr is not treated as a critical error that requires to fail plug-in initilization */ ilo2_ribcl_add_resource_capability( oh_handler, ev, (SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_CONTROL)); } else { err("iLO2 RIBCL: Failed to setup UID Control RDR. Plug-in will run without this control feature"); } if(ilo2_ribcl_controls(oh_handler, ILO2_RIBCL_CTL_POWER_SAVER, ev, "Power Regulator Control Power Modes: Disabled(1)/Low(2)/DynamicSavings(3)/High(4)") == SA_OK) { /* Power Saver control RDR has beeen added successfully. Set RDR and CONTROL capability flags. Please note that failing to add control rdr is not treated as a critical error that requires to fail plug-in initilization */ ilo2_ribcl_add_resource_capability( oh_handler, ev, (SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_CONTROL)); } else { err("iLO2 RIBCL: Failed to setup Power Saver Control RDR. Plug-in will run without this control feature"); } switch(ir_handler->ilo_type){ case ILO: case ILO2: autopower = "Auto Power On Control Delay: Min.(1)" "/Disabled(2)/Random (3)" "/15 sec (15)/30 sec (30)" "/45 sec(45)/60 sec(60)"; break; case ILO3: autopower = "Auto Power On Control Delay: " "Min.(1)/Random (3)/Always Off (5)"; break; case ILO4: autopower = "Auto Power On Control Delay: " "Min.(1)/Random (3)" "/Restore (4)/Always Off (5)"; break; default: err("ilo2_ribcl_discover_chassis():" "failed to detect ilo type."); free( tmptag); return SA_OK; } if(ilo2_ribcl_controls(oh_handler, ILO2_RIBCL_CTL_AUTO_POWER, ev, autopower) == SA_OK) { /* Auto Power control RDR has beeen added successfully. Set RDR and CONTROL capability flags. Please note that failing to add control rdr is not treated as a critical error that requires to fail plug-in initilization */ ilo2_ribcl_add_resource_capability( oh_handler, ev, (SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_CONTROL)); } else { err("iLO2 RIBCL: Failed to setup Auto Power Control RDR. Plug-in will run without this control feature"); } /* Add sensor RDRs. We use three general system health sensors. */ ilo2_ribcl_discover_chassis_sensors( oh_handler, ev); /* Add Temperature Sensor RDR */ ilo2_ribcl_discover_temp_sensors( oh_handler, ev); /* Add an inventory RDR */ ilo2_ribcl_discover_chassis_idr( oh_handler, ev, tmptag); free( tmptag); /* Now, fill out the rest of the event structure and push it * onto the event queue. */ ev->hid = oh_handler->hid; ev->event.EventType = SAHPI_ET_RESOURCE; ev->event.Severity = ev->resource.ResourceSeverity; ev->event.Source = ev->resource.ResourceId; if ( oh_gettimeofday(&(ev->event.Timestamp)) != SA_OK){ ev->event.Timestamp = SAHPI_TIME_UNSPECIFIED; } ev->event.EventDataUnion.ResourceEvent.ResourceEventType = SAHPI_RESE_RESOURCE_ADDED; oh_evt_queue_push(oh_handler->eventq, ev); return( SA_OK); } /* end ilo2_ribcl_discover_chassis() */ /** * ilo2_ribcl_discover_cpu * @oh_handler: Handler data pointer. * @ep_root: pointer to the root path for this instance. * * This function creates the rpt entry for our CPU resources. After adding * the CPU resource to the handler's rpt cache, we send a * SAHPI_RESE_RESOURCE_ADDED event. * * Detailed description: * * For all CPUs found in DiscoveryData * - Use the CPU label from iLO2 as the resource tag. * - Build an EntityPath for this resource with an EntityType of * SAHPI_ENT_PROCESSOR and an EntityLocation set to the index * of this processor given by iLO2 in its label. * - If the IR_DISCOVERED flag is set for this dimm, call * ilo2_ribcl_discovered_fru(), otherwise call * ilo2_ribcl_undiscovered_fru(). * End for all CPUs * * Return values: * SA_OK if success * SA_ERR_HPI_OUT_OF_MEMORY if allocation fails **/ static SaErrorT ilo2_ribcl_discover_cpu( struct oh_handler_state *oh_handler, SaHpiEntityPathT *ep_root) { ilo2_ribcl_handler_t *ir_handler; ir_cpudata_t *cpudata; SaHpiEntityPathT cpu_ep; int idex; SaErrorT ret; ir_handler = (ilo2_ribcl_handler_t *) oh_handler->data; for( idex = 1; idex <= ILO2_RIBCL_DISCOVER_CPU_MAX; idex++){ cpudata = &(ir_handler->DiscoveryData.cpudata[idex]); if( cpudata->label == NULL){ continue; } /* * Build the entity path for this CPU. Please note that * cpu_ep.Entry[1].EntityLocation = 0 is necessary to * indicate path termination to oh_ConCat_Ep and other * OpenHPI utilities */ cpu_ep.Entry[0].EntityType = SAHPI_ENT_PROCESSOR; cpu_ep.Entry[0].EntityLocation = idex; cpu_ep.Entry[1].EntityType = SAHPI_ENT_ROOT; cpu_ep.Entry[1].EntityLocation = 0; oh_concat_ep(&cpu_ep, ep_root); if( cpudata->cpuflags & IR_DISCOVERED ){ /* Build the cpu IDR from DiscoveryData. * Use the temporary ilo2_ribcl_idr_info structure in * our private handler to collect the IDR information. * We use this buffer in the handler because it's too * large to put on the stack as a local valiable, and * we don't want to be allocating/deallocating it * frequently. */ ilo2_ribcl_build_cpu_idr( ir_handler, &(ir_handler->tmp_idr)); ret = ilo2_ribcl_discovered_fru( oh_handler, &cpu_ep, &(cpudata->dstate), 0, cpudata->label, &(ir_handler->tmp_idr)); /* Update the IDR data if it has changed */ ilo2_ribcl_update_fru_idr( oh_handler, &cpu_ep, &(ir_handler->tmp_idr)); } else { /* We didn't find it on the last iLO2 poll */ ret = ilo2_ribcl_undiscovered_fru( oh_handler, &cpu_ep, &(cpudata->dstate), 0, cpudata->label); } /* If there's an error, abort the rest of the recovery */ if( ret != SA_OK){ return( ret); } } /* end for idex */ return( SA_OK); } /* end ilo2_ribcl_discover_cpu() */ /** * ilo2_ribcl_discover_memory * @oh_handler: Handler data pointer. * @ep_root: pointer to the root path for this instance. * * This function handles the insertion and deletion of memory DIMM resources * detected during discovery. * * Detailed description: * * For all Memory DIMMS found in DiscoveryData * - Use the DIMM label from iLO2 as the resource tag. * - Build an EntityPath for this resource with an EntityType of * SAHPI_ENT_MEMORY_DEVICE and an EntityLocation set to the index * of this DIMM given by iLO2 in its label. * - If the IR_DISCOVERED flag is set for this dimm, call * ilo2_ribcl_discovered_fru(), otherwise call * ilo2_ribcl_undiscovered_fru(). * End for all DIMMS * * Return values: * SA_OK if success * SA_ERR_HPI_OUT_OF_MEMORY if allocation fails **/ static SaErrorT ilo2_ribcl_discover_memory( struct oh_handler_state *oh_handler, SaHpiEntityPathT *ep_root) { ilo2_ribcl_handler_t *ir_handler; ir_memdata_t *memdata; SaHpiEntityPathT mem_ep; int idex; SaErrorT ret; ir_handler = (ilo2_ribcl_handler_t *) oh_handler->data; for( idex = 1; idex <= ILO2_RIBCL_DISCOVER_MEM_MAX; idex++){ memdata = &(ir_handler->DiscoveryData.memdata[idex]); if( memdata->label == NULL){ /* If we have ever obtained data on this resource, * the memory label will be non-NULL. */ continue; } /* Build the entity path for this memory DIMM */ mem_ep.Entry[0].EntityType = SAHPI_ENT_MEMORY_DEVICE; mem_ep.Entry[0].EntityLocation = idex; mem_ep.Entry[1].EntityType = SAHPI_ENT_ROOT; mem_ep.Entry[1].EntityLocation = 0; oh_concat_ep(&mem_ep, ep_root); /* iLO2 response for Memory components doesn't contain RIBCL status. */ if( memdata->memflags & IR_DISCOVERED ){ /* Build the memory IDR from DiscoveryData. * Use the temporary ilo2_ribcl_idr_info structure in * our private handler to collect the IDR information. * We use this buffer in the handler because it's too * large to put on the stack as a local valiable, and * we don't want to be allocating/deallocating it * frequently. */ ilo2_ribcl_build_memory_idr( memdata, &(ir_handler->tmp_idr)); ret = ilo2_ribcl_discovered_fru( oh_handler, &mem_ep, &(memdata->dstate), 0, memdata->label, &(ir_handler->tmp_idr)); /* Update the IDR data if it has changed */ ilo2_ribcl_update_fru_idr( oh_handler, &mem_ep, &(ir_handler->tmp_idr)); } else { /* We didn't find it on the last iLO2 poll */ ret = ilo2_ribcl_undiscovered_fru( oh_handler, &mem_ep, &(memdata->dstate), 0, memdata->label); } /* If there's an error, abort the rest of the recovery */ if( ret != SA_OK){ return( ret); } } /* end for idex */ return( SA_OK); } /* end ilo2_ribcl_discover_memory() */ /** * ilo2_ribcl_discover_fans * @oh_handler: Handler data pointer. * @ep_root: pointer to the root path for this instance. * * This function handles the insertion and deletion of fan resources * detected during discovery. * * Detailed description: * * For all fans found in DiscoveryData * - Use the fan label and fan zone from iLO2 as the resource tag. * - Build an EntityPath for this resource with an EntityType of * SAHPI_ENT_COOLING_DEVICE and an EntityLocation set to the * index of this fan given by iLO2 in its label. * - If the IR_DISCOVERED flag is set for this fan, call * ilo2_ribcl_discovered_fru(), otherwise call * ilo2_ribcl_undiscovered_fru(). * End for all fans * * Return values: * SA_OK if success * SA_ERR_HPI_OUT_OF_MEMORY if allocation fails **/ static SaErrorT ilo2_ribcl_discover_fans( struct oh_handler_state *oh_handler, SaHpiEntityPathT *ep_root) { ilo2_ribcl_handler_t *ir_handler; char *fanstatus; ir_fandata_t *fandata; char *fantag; size_t tagsize; SaHpiEntityPathT fan_ep; int idex; int failed; SaErrorT ret; ir_handler = (ilo2_ribcl_handler_t *) oh_handler->data; for( idex = 1; idex <= ILO2_RIBCL_DISCOVER_FAN_MAX; idex++){ fandata = &(ir_handler->DiscoveryData.fandata[idex]); if( fandata->label == NULL){ /* If we have ever obtained data on this resource, * the fan label will be non-NULL. */ continue; } /* Build the entity path for this fan */ fan_ep.Entry[0].EntityType = SAHPI_ENT_COOLING_DEVICE; fan_ep.Entry[0].EntityLocation = idex; fan_ep.Entry[1].EntityType = SAHPI_ENT_ROOT; fan_ep.Entry[1].EntityLocation = 0; oh_concat_ep(&fan_ep, ep_root); /* Check if the discovery reported a failed fan */ failed = SAHPI_FALSE; fanstatus = fandata->status; if( (fanstatus != NULL) && !strcmp( fanstatus, "Failed")){ failed = SAHPI_TRUE; } /** If the FAN is not installed then FAN Status comes as * "Not installed" or "Unknown", so do not discover this * resource and skip to next FAN resource. * * * **/ if(!strcmp(fanstatus, "Not Installed")|| !strcmp(fanstatus, "Unknown")){ fandata->fanflags = ~IR_DISCOVERED; } /* include the fan location in the text tag */ tagsize = strlen( fandata->label) + strlen( fandata->zone) + 11; fantag = malloc( tagsize); if( fantag == NULL){ err("ilo2_ribcl_discover_fans(): malloc of %zd failed", tagsize); return( SA_ERR_HPI_OUT_OF_MEMORY); } snprintf( fantag, tagsize, "%s Location %s", fandata->label, fandata->zone); if( fandata->fanflags & IR_DISCOVERED ){ ret = ilo2_ribcl_discovered_fru( oh_handler, &fan_ep, &(fandata->dstate), failed, fantag, NULL); } else { /* We didn't find it on the last iLO2 poll */ ret = ilo2_ribcl_undiscovered_fru( oh_handler, &fan_ep, &(fandata->dstate), failed, fantag); } free( fantag); /* If there's an error, abort the rest of the recovery */ if( ret != SA_OK){ return( ret); } } /* end for idex */ return( SA_OK); } /* end ilo2_ribcl_discover_fans() */ /** * ilo2_ribcl_discover_powersupplies * @oh_handler: Handler data pointer. * @ep_root: pointer to the root path for this instance. * * This function handles the insertion and deletion of power supply resources * detected during discovery. * * Detailed description: * * For all power supplies found in DiscoveryData * - Use the power supply label from iLO2 as the resource tag. * - Build an EntityPath for this resource with an EntityType of * SAHPI_ENT_POWER_SUPPLY and an EntityLocation set to the * index of this power supply given by iLO2 in its label. * - If the IR_DISCOVERED flag is set for this power supply, call * ilo2_ribcl_discovered_fru(), otherwise call * ilo2_ribcl_undiscovered_fru(). * End for all power supplies * * Return values: * SA_OK if success * SA_ERR_HPI_OUT_OF_MEMORY if allocation fails **/ static SaErrorT ilo2_ribcl_discover_powersupplies( struct oh_handler_state *oh_handler, SaHpiEntityPathT *ep_root) { ilo2_ribcl_handler_t *ir_handler; char *psustatus; ir_psudata_t *psudata; SaHpiEntityPathT psu_ep; int idex; int failed; SaErrorT ret; ir_handler = (ilo2_ribcl_handler_t *) oh_handler->data; for( idex = 1; idex <= ILO2_RIBCL_DISCOVER_PSU_MAX; idex++){ psudata = &(ir_handler->DiscoveryData.psudata[idex]); if( psudata->label == NULL){ /* If we have ever obtained data on this resource, * the power supply label will be non-NULL. */ continue; } /* Build the entity path for this psu */ psu_ep.Entry[0].EntityType = SAHPI_ENT_POWER_SUPPLY; psu_ep.Entry[0].EntityLocation = idex; psu_ep.Entry[1].EntityType = SAHPI_ENT_ROOT; psu_ep.Entry[1].EntityLocation = 0; oh_concat_ep(&psu_ep, ep_root); /* Check if the discovery reported a failed power supply */ failed = SAHPI_FALSE; psustatus = psudata->status; if(psustatus != NULL) { if(strstr( psustatus, "Fail") || strstr( psustatus, "Lost")) { failed = SAHPI_TRUE; } } if(!strcmp(psustatus, "Not Installed") || !strcmp(psustatus, "Unknown")){ psudata->psuflags = ~IR_DISCOVERED; } if( psudata->psuflags & IR_DISCOVERED ){ ret = ilo2_ribcl_discovered_fru( oh_handler, &psu_ep, &(psudata->dstate), failed, psudata->label, NULL); } else { /* We didn't find it on the last iLO2 poll */ ret = ilo2_ribcl_undiscovered_fru( oh_handler, &psu_ep, &(psudata->dstate), failed, psudata->label); } /* If there's an error, abort the rest of the recovery */ if( ret != SA_OK){ return( ret); } } /* end for idex */ return( SA_OK); } /* end ilo2_ribcl_discover_powersupplies() */ /** * ilo2_ribcl_discover_vrm * @oh_handler: Handler data pointer. * @ep_root: pointer to the root path for this instance. * * This function handles the insertion and deletion of voltage regulator module * resources detected during discovery. * * Detailed description: * * For all VRMs found in DiscoveryData * - Use the VRM label from iLO2 as the resource tag. * - Build an EntityPath for this resource with an EntityType of * SAHPI_ENT_POWER_MODULE and an EntityLocation set to the * index of this VRM given by iLO2 in its label. * - If the IR_DISCOVERED flag is set for this VRM, call * ilo2_ribcl_discovered_fru(), otherwise call * ilo2_ribcl_undiscovered_fru(). * End for all VRMs * * Return values: * SA_OK if success * SA_ERR_HPI_OUT_OF_MEMORY if allocation fails **/ static SaErrorT ilo2_ribcl_discover_vrm( struct oh_handler_state *oh_handler, SaHpiEntityPathT *ep_root) { ilo2_ribcl_handler_t *ir_handler; char *vrmstatus; ir_vrmdata_t *vrmdata; SaHpiEntityPathT vrm_ep; int idex; int failed; SaErrorT ret; ir_handler = (ilo2_ribcl_handler_t *) oh_handler->data; for( idex = 1; idex <= ILO2_RIBCL_DISCOVER_VRM_MAX; idex++){ vrmdata = &(ir_handler->DiscoveryData.vrmdata[idex]); if( vrmdata->label == NULL){ /* If we have ever obtained data on this resource, * the power supply label will be non-NULL. */ continue; } /* Build the entity path for this vrm */ vrm_ep.Entry[0].EntityType = SAHPI_ENT_POWER_MODULE; vrm_ep.Entry[0].EntityLocation = idex; vrm_ep.Entry[1].EntityType = SAHPI_ENT_ROOT; vrm_ep.Entry[1].EntityLocation = 0; oh_concat_ep(&vrm_ep, ep_root); /* Check if the discovery reported a failed vrm */ failed = SAHPI_FALSE; vrmstatus = vrmdata->status; if( (vrmstatus != NULL) && !strcmp( vrmstatus, "Failed")){ failed = SAHPI_TRUE; } if( vrmdata->vrmflags & IR_DISCOVERED ){ ret = ilo2_ribcl_discovered_fru( oh_handler, &vrm_ep, &(vrmdata->dstate), failed, vrmdata->label, NULL); } else { /* We didn't find it on the last iLO2 poll */ ret = ilo2_ribcl_undiscovered_fru( oh_handler, &vrm_ep, &(vrmdata->dstate), failed, vrmdata->label); } /* If there's an error, abort the rest of the recovery */ if( ret != SA_OK){ return( ret); } } /* end for idex */ return( SA_OK); } /* end ilo2_ribcl_discover_vrm()*/ /** * ilo2_ribcl_discovered_fru * @oh_handler: Handler data pointer. * @resource_ep: pointer to the entity path for this resource. * @d_state: The current discovery state of the resource. * @isfailed: Indicates if the resource is currently detected as failed. * @tag: Characer string used for resource tag if rpt entry is created. * @idr_info: Pointer to IDR information if this resource should have an IDR, * Null otherwise. * * This function is called for removable resources whose presence have * been detected during a discovery operation. The action taken depends * upon the current resource state passed as parameter d_state, and whether * the resource is currently detected to be in a failed condition. The value of * d_state can be modified by this routine. * * Detailed description: * * These are the actions taken for each value of d_state: * * BLANK: This is the initial state for a resource. In this state, a resource * has never been detected before. * - Allocate a new resource event. * - Set ResourceCapabilities to SAHPI_CAPABILITY_RESOURCE, * HotSwapCapabilities to 0, ResourceSeverity to SAHPI_CRITICAL, * and use the tag parameter for the ResourceTag. * - Add the resource to the handler's rpt cache with a call to * oh_add_resource(). * - If this resource has an Inventory Data Repository, the idr_info * parameter will be non-null. In this case, call ilo2_ribcl_add_idr() * to add the IDR to this resource. * - Call oh_evt_queue_push() to send a SAHPI_RESE_RESOURCE_ADDED * resource event. * - Set d_state to OK * - Fall through to the OK state. * * OK: This is the state for a resource that has been previously discovered * and had not been detected as failing during the previous discovery. * In this state, we check for failure. * If the isfailed parameter is non-zero * - Look up the existing rpt entry from the resource_ep * entity path parameter. * - Set ResourceFailed to SAHPI_TRUE in that rpt entry. * - Call oh_evt_queue_push() to send a SAHPI_RESE_RESOURCE_FAILURE * resource event. * - Set d_state to FAILED. * End isfailed parameter is non-zero * * FAILED: This is the state for a resource that has been previously discovered * and has been detected as failing during the previous discovery. * In this state, we check if the resource is no longer failing. * If the isfailed parameter is zero * - Look up the existing rpt entry from the resource_ep * entity path parameter. * - Set ResourceFailed to SAHPI_FALSE in that rpt entry. * - Call oh_evt_queue_push() to send a * SAHPI_RESE_RESOURCE_RESTORED resource event. * - Set d_state to OK. * End isfailed parameter is non-zero * * REMOVED: This is the state for a resource that has been previously * discovered and has been detected as missing during the previous * discovery operation. We now need to re-add this device. * * Return values: * SA_OK if success * SA_ERR_HPI_OUT_OF_MEMORY if allocation fails * SA_ERR_HPI_NOT_PRESENT if a rpt entry for a resource isn't found. * SA_ERR_HPI_INTERNAL_ERROR id d_state is unknown. **/ static SaErrorT ilo2_ribcl_discovered_fru( struct oh_handler_state *oh_handler, SaHpiEntityPathT *resource_ep, enum ir_discoverstate *d_state, int isfailed, char *tag, struct ilo2_ribcl_idr_info *idr_info ) { struct oh_event *ev; SaHpiRptEntryT *rpt; SaErrorT ret; SaHpiBoolT resource_wasfailed; ilo2_ribcl_resource_info_t *res_info = NULL; ilo2_ribcl_handler_t *ilo2_ribcl_handler = (ilo2_ribcl_handler_t *) oh_handler->data; switch( *d_state){ case BLANK: /* Do our initial rpt creation and addition */ /* Create a resource event */ ev = oh_new_event(); if( ev == NULL){ err("ilo2_ribcl_discovered_fru(): event allocation failed."); return( SA_ERR_HPI_OUT_OF_MEMORY); } /* Fill in the resource part of the event */ ev->resource.ResourceEntity = *resource_ep; /* Plugin doesn't set EntryID */ ev->resource.ResourceId = oh_uid_from_entity_path( &(ev->resource.ResourceEntity)); ev->resource.ResourceInfo.ManufacturerId = HP_MANUFACTURING_ID; ev->resource.ResourceCapabilities = (SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_FRU); ev->resource.HotSwapCapabilities = 0; if(ilo2_ribcl_handler->discovery_complete == SAHPI_FALSE){ ev->resource.ResourceSeverity = SAHPI_OK; }else { ev->resource.ResourceSeverity = SAHPI_CRITICAL; } ev->resource.ResourceFailed = isfailed; oh_init_textbuffer(&(ev->resource.ResourceTag)); oh_append_textbuffer( &(ev->resource.ResourceTag), tag); /* Allocate and populate iLO2 RIBCL private data area to be added to the resource rpt cache */ res_info = (ilo2_ribcl_resource_info_t *) g_malloc0(sizeof(ilo2_ribcl_resource_info_t)); if(res_info == NULL) { err("ilo2_ribcl_discovered_fru(): out of memory"); oh_event_free( ev, 0); return( SA_ERR_HPI_OUT_OF_MEMORY); } res_info->rid = ev->resource.ResourceId; res_info->fru_cur_state = SAHPI_HS_STATE_ACTIVE; res_info->disc_data_idx = resource_ep->Entry[0].EntityLocation; /* Add the resource to this instance's rpt cache */ ret = oh_add_resource( oh_handler->rptcache, &(ev->resource), res_info, 0); if( ret != SA_OK){ err("ilo2_ribcl_discovered_fru(): cannot add resource to rptcache."); oh_event_free( ev, 0); return( ret); } /* If this this resource has an associated Inventory Data * Repository, the IDR data will be passed in via the * idr_info parameter. */ if( idr_info != NULL){ ret = ilo2_ribcl_add_idr( oh_handler, ev, SAHPI_DEFAULT_INVENTORY_ID, idr_info, tag); if( ret != SA_OK){ err("ilo2_ribcl_discovered_fru: could not add IDR to resource id %d.", ev->resource.ResourceId); } } /* Now, fill out the rest of the event structure and push it * onto the event queue. */ ev->hid = oh_handler->hid; ev->event.EventType = SAHPI_ET_HOTSWAP; ev->event.Severity = ev->resource.ResourceSeverity; ev->event.Source = ev->resource.ResourceId; if ( oh_gettimeofday(&(ev->event.Timestamp)) != SA_OK){ ev->event.Timestamp = SAHPI_TIME_UNSPECIFIED; } ev->event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_ACTIVE; ev->event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_NOT_PRESENT; ev->event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_UNKNOWN; oh_evt_queue_push(oh_handler->eventq, ev); *d_state = OK; /* Fall through to OK state */ case OK: /* Check to see if we have failed. If so, update the rpt * entry for this resource, and send a * SAHPI_RESE_RESOURCE_FAILURE event. */ if( isfailed){ ret = ilo2_ribcl_resource_set_failstatus( oh_handler, resource_ep, SAHPI_TRUE); /* If we were out of memory, stay in state OK * and try again next time. */ if( ret != SA_ERR_HPI_OUT_OF_MEMORY){ *d_state = FAILED; } if( ret != SA_OK){ return( ret); } } break; case FAILED: /* Check to see if we are no longer failed. If so, * update the rpt entry for this resource, and send a * SAHPI_RESE_RESOURCE_RESTORED event */ if( !isfailed){ ret = ilo2_ribcl_resource_set_failstatus( oh_handler, resource_ep, SAHPI_FALSE); /* If we were out of memory, stay in state FAILED * and try again next time. */ if( ret != SA_ERR_HPI_OUT_OF_MEMORY){ *d_state = OK; } if( ret != SA_OK){ return( ret); } } break; case REMOVED: /* We have been rediscovered after being removed */ /* - get our rpt entry from our entity path with a call to * oh_get_resource_by_ep(). * - send a hotswap event putting us into SAHPI_HS_STATE_ACTIVE * - check for failure. If previously failed, and not failed * now, send a SAHPI_RESE_RESOURCE_RESTORED resource event. * if failed now, send a SAHPI_RESE_RESOURCE_FAILURE resource * event. * - set d_state based on failure status */ rpt = oh_get_resource_by_ep( oh_handler->rptcache, resource_ep); if( rpt == NULL){ /* This should never happen */ err("ilo2_ribcl_discovered_fru(): Null rpt entry for removed resource"); *d_state = OK; return( SA_ERR_HPI_NOT_PRESENT); } res_info = (ilo2_ribcl_resource_info_t *)oh_get_resource_data( oh_handler->rptcache, rpt->ResourceId); if (!res_info) { /* This should never happen */ err("ilo2_ribcl_discovered_fru(): No resource information for a removed resource."); return( SA_ERR_HPI_NOT_PRESENT); } resource_wasfailed = rpt->ResourceFailed; ev = oh_new_event(); if( ev == NULL){ err("ilo2_ribcl_discovered_fru(): event allocation failed."); return( SA_ERR_HPI_OUT_OF_MEMORY); } /* Copy the rpt information from our handler's rptcache */ ev->resource = *rpt; /* If this this resource has an associated Inventory Data * Repository, the IDR data will be passed in via the * idr_info parameter. When we sent the * SAHPI_HS_STATE_NOT_PRESENT event previously for this * resource, the daemon removed the rpt entry and all of * its rdrs from the domain table. So, we need to add the * rdrs back via this event's rdrs list. */ if( idr_info != NULL){ ret = ilo2_ribcl_add_idr( oh_handler, ev, SAHPI_DEFAULT_INVENTORY_ID, idr_info, tag); if( ret != SA_OK){ err("ilo2_ribcl_discovered_fru: could not add IDR to resource id %d.", ev->resource.ResourceId); } } ev->hid = oh_handler->hid; ev->event.EventType = SAHPI_ET_HOTSWAP; ev->event.Severity = ev->resource.ResourceSeverity; ev->event.Source = ev->resource.ResourceId; if ( oh_gettimeofday(&(ev->event.Timestamp)) != SA_OK){ ev->event.Timestamp = SAHPI_TIME_UNSPECIFIED; } ev->event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_ACTIVE; ev->event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_NOT_PRESENT; ev->event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_UNKNOWN; /* update resource private data with the new state */ res_info->fru_cur_state = ev->event.EventDataUnion.HotSwapEvent.HotSwapState; oh_evt_queue_push(oh_handler->eventq, ev); ret = SA_OK; *d_state = OK; /* Now handle the resource failure condition. */ if( isfailed){ ret = ilo2_ribcl_resource_set_failstatus( oh_handler, resource_ep, SAHPI_TRUE); /* If we were out of memory, stay in state OK * and try again next time. */ if( ret != SA_ERR_HPI_OUT_OF_MEMORY){ *d_state = FAILED; } if( ret != SA_OK){ return( ret); } } else { /* If the resource was failed before removal, * and now is no longer failed, send a * SAHPI_RESE_RESOURCE_RESTORED resource event */ if( resource_wasfailed){ ret = ilo2_ribcl_resource_set_failstatus( oh_handler, resource_ep, SAHPI_FALSE); /* If we were out of memory, stay in state * FAILED and try again next time. */ if( ret != SA_ERR_HPI_OUT_OF_MEMORY){ *d_state = FAILED; } if( ret != SA_OK){ return( ret); } } } break; default: err("ilo2_ribcl_discovered_fru(): invalid d_state"); return( SA_ERR_HPI_INTERNAL_ERROR); break; } /* end switch d_state */ return( SA_OK); } /* end ilo2_ribcl_discovered_fru() */ /** * ilo2_ribcl_discover_temp_sensors: * @oh_handler: Handler data pointer. * @event: Pointer to event structure for chassis resource event. * * This routine will create RDRs for the all temperature sensors that * have been detected during a discovery operation. * These sensors correspond to the system's temperature's sensors. * Return values: * None **/ static void ilo2_ribcl_discover_temp_sensors( struct oh_handler_state *oh_handler, struct oh_event *event) { SaErrorT ret = SA_OK; ilo2_ribcl_handler_t *ir_handler = NULL; struct ilo2_ribcl_sensinfo si_initial; ir_tsdata_t *tsdata = NULL; int idex, cur_reading = I2R_SEN_VAL_UNINITIALIZED; char *label = NULL, *location = NULL, *description = NULL; ir_handler = ( ilo2_ribcl_handler_t *) oh_handler->data; memset( &si_initial, 0, sizeof( struct ilo2_ribcl_sensinfo)); /* Look for the all temperature isensors from the RIBCL */ for( idex = 4; idex <= ILO2_RIBCL_DISCOVER_TS_MAX; idex++){ tsdata = &(ir_handler->DiscoveryData.tsdata[idex]); if(tsdata->tsflags != IR_DISCOVERED){ break; } cur_reading = atoi( tsdata->reading ); if ( cur_reading != I2R_SEN_VAL_UNINITIALIZED){ si_initial.sens_num = idex; si_initial.sens_ev_state = SAHPI_ES_UNSPECIFIED; si_initial.sens_enabled = SAHPI_TRUE; si_initial.sens_ev_enabled = SAHPI_FALSE; si_initial.sens_assertmask = SAHPI_ES_UNSPECIFIED; si_initial.sens_deassertmask = SAHPI_ES_UNSPECIFIED; si_initial.sens_value = I2R_SEN_VAL_UNINITIALIZED; si_initial.status = tsdata->status; si_initial.threshold.LowCritical.IsSupported = SAHPI_FALSE; si_initial.threshold.LowMajor.IsSupported = SAHPI_FALSE; si_initial.threshold.LowMinor.IsSupported = SAHPI_FALSE; si_initial.threshold.UpCritical.IsSupported = SAHPI_TRUE; si_initial.threshold.UpCritical.Type = SAHPI_SENSOR_READING_TYPE_INT64; si_initial.threshold.UpCritical.Value.SensorInt64 = atoi(tsdata->criticalvalue); si_initial.threshold.UpMajor.IsSupported = SAHPI_TRUE; si_initial.threshold.UpMajor.Type = SAHPI_SENSOR_READING_TYPE_INT64; si_initial.threshold.UpMajor.Value.SensorInt64 = atoi(tsdata->cautionvalue); si_initial.threshold.UpMinor.IsSupported = SAHPI_FALSE; si_initial.threshold.PosThdHysteresis.IsSupported = SAHPI_FALSE; si_initial.threshold.NegThdHysteresis.IsSupported = SAHPI_FALSE; /* Update the sensor info with current reading, this * reading will be utilized sensor event assetion post * discovery. */ if ((cur_reading >= si_initial.threshold.UpMajor.Value.SensorInt64) && (cur_reading < si_initial.threshold.UpCritical. Value.SensorInt64)) { si_initial.sens_ev_state = SAHPI_ES_UPPER_MAJOR; } else if (cur_reading > si_initial.threshold.UpCritical.Value. SensorInt64) { si_initial.sens_ev_state = SAHPI_ES_UPPER_CRIT; } label = tsdata->label; location = tsdata->location; description = (char*)malloc(snprintf(NULL, 0, "%s %s", label, location) + 3); if ( description != NULL) { strcpy(description, label); strcat(description, ": "); strcat(description, location); ret = ilo2_ribcl_add_threshold_sensor( oh_handler, event,idex,SAHPI_TEMPERATURE, SAHPI_ES_UNSPECIFIED, &si_initial, description); if ( ret == SA_OK){ tsdata->rid = event->resource.ResourceId; ilo2_ribcl_add_resource_capability( oh_handler, event, (SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_SENSOR)); } else { err("ilo2_ribcl_discover_temp_sensors: " "Failed to set up temp sensor."); } free(description); } else { err("ilo2_ribcl_discover_temp_sensors: " "Memory Allocation failed."); } } } /* end for idex */ }/* end ilo2_ribcl_discover_temperator_sensors() */ /** * ilo2_ribcl_resource_set_failstatus * @oh_handler: Handler data pointer. * @resource_ep: pointer to the entity path for this resource. * @resource_failed: SAHPI_TRUE if resource has failed, SAHPI_FALSE otherwise. * * Detailed description: * - Look up the existing rpt entry from the resource_ep entity * path parameter. * - Set ResourceFailed to the value of parameter resource_failed * in that rpt entry. * - Call oh_evt_queue_push() to send a SAHPI_RESE_RESOURCE_FAILURE * resource event if the resource has failed, or a * SAHPI_RESE_RESOURCE_RESTORED resource event if the device is no * longer failed. * * Return values: * SA_OK if success * SA_ERR_HPI_OUT_OF_MEMORY if allocation fails. * SA_ERR_HPI_NOT_PRESENT if the rpt entry for resource_ep is not found. **/ static SaErrorT ilo2_ribcl_resource_set_failstatus( struct oh_handler_state *oh_handler, SaHpiEntityPathT *resource_ep, SaHpiBoolT resource_failed ) { struct oh_event *ev; SaHpiRptEntryT *rpt; rpt = oh_get_resource_by_ep( oh_handler->rptcache, resource_ep); if( rpt == NULL){ /* This should never happen */ err("ilo2_ribcl_resource_set_failstatus(): Null rpt entry for failed resource"); return( SA_ERR_HPI_NOT_PRESENT); } /* Generate a RESOURCE_FAILURE event */ ev = oh_new_event(); if( ev == NULL){ err("ilo2_ribcl_resource_set_failstatus(): event allocation failed."); return( SA_ERR_HPI_OUT_OF_MEMORY); } ev->resource = *rpt; ev->hid = oh_handler->hid; ev->event.EventType = SAHPI_ET_RESOURCE; ev->event.Severity = SAHPI_CRITICAL; ev->event.Source = ev->resource.ResourceId; if ( oh_gettimeofday(&(ev->event.Timestamp)) != SA_OK){ ev->event.Timestamp = SAHPI_TIME_UNSPECIFIED; } if(( resource_failed == SAHPI_FALSE) && (rpt->ResourceFailed == SAHPI_TRUE)) { ev->event.EventDataUnion.ResourceEvent.ResourceEventType = SAHPI_RESE_RESOURCE_RESTORED; } else if((resource_failed == SAHPI_TRUE) && (rpt->ResourceFailed != SAHPI_TRUE)) { ev->event.EventDataUnion.ResourceEvent.ResourceEventType = SAHPI_RESE_RESOURCE_FAILURE; } else { /* Return as the state has not changed */ oh_event_free(ev, 0); return( SA_OK); } rpt->ResourceFailed = resource_failed; oh_evt_queue_push(oh_handler->eventq, ev); return( SA_OK); } /* end ilo2_ribcl_resource_fail() */ /** * ilo2_ribcl_undiscovered_fru * @oh_handler: Handler data pointer. * @resource_ep: pointer to the entity path for this resource. * @d_state: The current discovery state of the resource. * @isfailed: Indicates if the resource is currently detected as failed. * @tag: Characer string used for resource tag if rpt entry is created. * * This function is called for removable resources whose presence have * not been detected during a discovery operation. The action taken depends * upon the current resource state passed as parameter d_state, and whether * the resource is currently detected to be in a failed condition. The value of * d_state can be modified by this routine. * * Detailed description: * * These are the actions taken for each value of d_state: * * BLANK: This is the initial state for a resource. In this state, a resource * has never been detected before. For this state, we do nothing. * OK: This is the state for a resource that has been previously discovered * and had not been detected as failing during the previous discovery. * Since this resource is now missing, we should indicate it has been * removed. * * FAILED: This is the state for a resource that has been previously discovered * and has been detected as failing during the previous discovery. * Since this resource is now missing, we should indicate it has been * removed. * * REMOVED: This is the state for a resource that has been previously * discovered and has been detected as missing during the previous * discovery operation. Since it's still missing now, we do nothing. * * Return values: * SA_OK if success * SA_ERR_HPI_INTERNAL_ERROR id d_state is unknown. **/ static SaErrorT ilo2_ribcl_undiscovered_fru( struct oh_handler_state *oh_handler, SaHpiEntityPathT *resource_ep, enum ir_discoverstate *d_state, int isfailed, char *tag ) { struct oh_event *ev; SaHpiRptEntryT *rpt; ilo2_ribcl_resource_info_t *res_info = NULL; switch( *d_state){ case BLANK: case REMOVED: /* nothing to do for these two states */ return( SA_OK); break; case OK: case FAILED: /* remove this resource */ /* Use the resource_ep to locate the rpt entry. Then * send a hotswap event putting this resource into a * SAHPI_HS_STATE_NOT_PRESENT state */ rpt = oh_get_resource_by_ep( oh_handler->rptcache, resource_ep); if( rpt == NULL){ /* This should never happen */ err("ilo2_ribcl_undiscovered_fru(): Null rpt entry for removed resource"); *d_state = OK; return( SA_ERR_HPI_NOT_PRESENT); } ev = oh_new_event(); if( ev == NULL){ err("ilo2_ribcl_undiscovered_fru(): event allocation failed."); return( SA_ERR_HPI_OUT_OF_MEMORY); } ev->resource = *rpt; ev->hid = oh_handler->hid; ev->event.EventType = SAHPI_ET_HOTSWAP; ev->event.Severity = ev->resource.ResourceSeverity; ev->event.Source = ev->resource.ResourceId; if ( oh_gettimeofday(&(ev->event.Timestamp)) != SA_OK){ ev->event.Timestamp = SAHPI_TIME_UNSPECIFIED; } ev->event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_NOT_PRESENT; ev->event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_ACTIVE; ev->event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_UNKNOWN; res_info = (ilo2_ribcl_resource_info_t *)oh_get_resource_data( oh_handler->rptcache, rpt->ResourceId); if (!res_info) { /* This should never happen */ err("ilo2_ribcl_discovered_fru(): No resource information for a removed resource."); return( SA_ERR_HPI_NOT_PRESENT); } res_info->fru_cur_state = ev->event.EventDataUnion.HotSwapEvent.HotSwapState; oh_evt_queue_push(oh_handler->eventq, ev); *d_state = REMOVED; break; default: err("ilo2_ribcl_undiscovered_fru(): invalid d_state"); return( SA_ERR_HPI_INTERNAL_ERROR); break; } /* end switch d_state */ return( SA_OK); } /* end ilo2_ribcl_undiscovered_fru() */ /** * ilo2_ribcl_free_discoverydata * @ir_handler: The private handler for this plugin instance. * * This function, intended to be called at plugin close time, will free any * dynamically allocated data in the handler DiscoveryData structure. * * Return values: None. **/ void ilo2_ribcl_free_discoverydata( ilo2_ribcl_handler_t *ir_handle) { int idex; ilo2_ribcl_DiscoveryData_t *ddata; ddata = &(ir_handle->DiscoveryData); if( ddata->product_name != NULL){ free( ddata->product_name); } if( ddata->serial_number != NULL){ free( ddata->serial_number); } if( ddata->fwdata.version_string != NULL){ free( ddata->fwdata.version_string); } if( ddata->system_cpu_speed != NULL){ free( ddata->system_cpu_speed); } /* Free the CPU data */ for( idex = 1; idex <= ILO2_RIBCL_DISCOVER_CPU_MAX; idex++){ if( ddata->cpudata[idex].label){ free( ddata->cpudata[idex].label); } } /* Free the memory data */ for( idex = 1; idex <= ILO2_RIBCL_DISCOVER_MEM_MAX; idex++){ if( ddata->memdata[idex].label){ free( ddata->memdata[idex].label); } if( ddata->memdata[idex].memsize){ free( ddata->memdata[idex].memsize); } if( ddata->memdata[idex].speed){ free( ddata->memdata[idex].speed); } } /* Free the fan data */ for( idex = 1; idex <= ILO2_RIBCL_DISCOVER_FAN_MAX; idex++){ if( ddata->fandata[idex].label){ free( ddata->fandata[idex].label); } if( ddata->fandata[idex].zone){ free( ddata->fandata[idex].zone); } if( ddata->fandata[idex].status){ free( ddata->fandata[idex].status); } if( ddata->fandata[idex].speedunit){ free( ddata->fandata[idex].speedunit); } } /* Free the power supply data */ for( idex = 1; idex <= ILO2_RIBCL_DISCOVER_PSU_MAX; idex++){ if( ddata->psudata[idex].label){ free( ddata->psudata[idex].label); } if( ddata->psudata[idex].status){ free( ddata->psudata[idex].status); } } /* Free the VRM data */ for( idex = 1; idex <= ILO2_RIBCL_DISCOVER_PSU_MAX; idex++){ if( ddata->vrmdata[idex].label){ free( ddata->vrmdata[idex].label); } if( ddata->vrmdata[idex].status){ free( ddata->vrmdata[idex].status); } } /* Free the temp sensor data */ for( idex = 4; idex <= ILO2_RIBCL_DISCOVER_TS_MAX; idex++){ if( ddata->tsdata[idex].label){ free( ddata->tsdata[idex].label); } if( ddata->tsdata[idex].location){ free( ddata->tsdata[idex].location); } if( ddata->tsdata[idex].status){ free( ddata->tsdata[idex].status); } if( ddata->tsdata[idex].reading){ free( ddata->tsdata[idex].reading); } if( ddata->tsdata[idex].readingunits){ free( ddata->tsdata[idex].readingunits); } if( ddata->tsdata[idex].cautionvalue){ free( ddata->tsdata[idex].cautionvalue); } if( ddata->tsdata[idex].cautionunit){ free( ddata->tsdata[idex].cautionunit); } if( ddata->tsdata[idex].criticalvalue){ free( ddata->tsdata[idex].criticalvalue); } if( ddata->tsdata[idex].criticalunit){ free( ddata->tsdata[idex].criticalunit); } } } /** * ilo2_ribcl_controls * @oh_handler: Handler data pointer. * @ctl_type: iLO2 RIBCL control type. * @event: Pointer to event structure. * @desc * * This function is called from chassis discovery routine to add control * RDR for a given control. This routine validates control type. * * Return values: * SA_OK if success * SA_ERR_HPI_INVALID_PARAMS * SA_ERR_HPI_INTERNAL_ERROR * SA_ERR_HPI_OUT_OF_MEMORY **/ static SaErrorT ilo2_ribcl_controls(struct oh_handler_state *oh_handler, int ctl_type, struct oh_event *event, char *desc) { SaErrorT err; SaHpiRdrT *rdrptr; ilo2_ribcl_cinfo_t cinfo, *cinfo_ptr = NULL; if(oh_handler == NULL) { err("ilo2_ribcl_controls(): Null handler"); return(SA_ERR_HPI_INVALID_PARAMS); } if(event == NULL) { err("ilo2_ribcl_controls(): Null event"); return(SA_ERR_HPI_INVALID_PARAMS); } if(desc == NULL) { err("ilo2_ribcl_controls(): Null Control Description String"); return(SA_ERR_HPI_INVALID_PARAMS); } if((ctl_type != ILO2_RIBCL_CTL_UID) && (ctl_type != ILO2_RIBCL_CTL_POWER_SAVER) && (ctl_type != ILO2_RIBCL_CTL_AUTO_POWER)) { err("ilo2_ribcl_controls(): Invalid iLO2 RIBCL control type"); return(SA_ERR_HPI_INTERNAL_ERROR); } rdrptr = (SaHpiRdrT *)g_malloc0(sizeof(SaHpiRdrT)); if (rdrptr == NULL) { err("ilo2_ribcl_controls(): Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } rdrptr->RdrType = SAHPI_CTRL_RDR; rdrptr->Entity = event->resource.ResourceEntity; switch(ctl_type) { case ILO2_RIBCL_CTL_UID: { rdrptr->RdrTypeUnion.CtrlRec.Num = ILO2_RIBCL_CONTROL_1; rdrptr->RdrTypeUnion.CtrlRec.OutputType = SAHPI_CTRL_LED; rdrptr->RdrTypeUnion.CtrlRec.Type = SAHPI_CTRL_TYPE_DIGITAL; rdrptr->RdrTypeUnion.CtrlRec.TypeUnion.Digital.Default = SAHPI_CTRL_STATE_OFF; rdrptr->RdrTypeUnion.CtrlRec.DefaultMode.Mode = SAHPI_CTRL_MODE_MANUAL; rdrptr->RdrTypeUnion.CtrlRec.DefaultMode.ReadOnly = SAHPI_FALSE; rdrptr->RdrTypeUnion.CtrlRec.WriteOnly = SAHPI_FALSE; rdrptr->RdrTypeUnion.CtrlRec.Oem = 0; cinfo.ctl_type = ctl_type; cinfo.cur_mode = rdrptr->RdrTypeUnion.CtrlRec.DefaultMode.Mode; cinfo.cur_state.Digital = rdrptr->RdrTypeUnion.CtrlRec.TypeUnion.Digital.Default; } break; case ILO2_RIBCL_CTL_POWER_SAVER: { /* The following outlines the Power Regulator feature: The values are 1 = OS Control Mode (Disabled Mode for iLO) 2 = HP Static Low Power Mode 3 = HP Dynamic Power Savings Mode 4 = HP Static High Performance Mode Note: Value 4 is availble only for iLO 2 firmware version 1.20 and later. */ rdrptr->RdrTypeUnion.CtrlRec.Num = ILO2_RIBCL_CONTROL_2; rdrptr->RdrTypeUnion.CtrlRec.OutputType = SAHPI_CTRL_GENERIC; rdrptr->RdrTypeUnion.CtrlRec.Type = SAHPI_CTRL_TYPE_DISCRETE; rdrptr->RdrTypeUnion.CtrlRec.TypeUnion.Discrete.Default = ILO2_RIBCL_MANUAL_OS_CONTROL_MODE; rdrptr->RdrTypeUnion.CtrlRec.DefaultMode.Mode = SAHPI_CTRL_MODE_MANUAL; rdrptr->RdrTypeUnion.CtrlRec.DefaultMode.ReadOnly = SAHPI_FALSE; rdrptr->RdrTypeUnion.CtrlRec.WriteOnly = SAHPI_FALSE; rdrptr->RdrTypeUnion.CtrlRec.Oem = 0; cinfo.ctl_type = ctl_type; cinfo.cur_mode = rdrptr->RdrTypeUnion.CtrlRec.DefaultMode.Mode; cinfo.cur_state.Discrete = rdrptr->RdrTypeUnion.CtrlRec.TypeUnion.Discrete.Default; } break; case ILO2_RIBCL_CTL_AUTO_POWER: { /* The following outlines the Auto Power feature: The Auto Power Control allows user to change the automatic power on and power on delay settings of the server. The values are Yes = Enable automatic power on with a minimum delay. No = Disable automatic power on. 15 = Enable automatic power on with 15 seconds delay. 30 = Enable automatic power on with 30 seconds delay. 45 = Enable automatic power on with 45 seconds delay. 60 = Enable automatic power on with 60 seconds delay. Random = Enable automatic power on with random delay up to 60 seconds. */ rdrptr->RdrTypeUnion.CtrlRec.Num = ILO2_RIBCL_CONTROL_3; rdrptr->RdrTypeUnion.CtrlRec.OutputType = SAHPI_CTRL_GENERIC; rdrptr->RdrTypeUnion.CtrlRec.Type = SAHPI_CTRL_TYPE_DISCRETE; rdrptr->RdrTypeUnion.CtrlRec.TypeUnion.Discrete.Default = ILO2_RIBCL_AUTO_POWER_DISABLED; rdrptr->RdrTypeUnion.CtrlRec.DefaultMode.Mode = SAHPI_CTRL_MODE_MANUAL; rdrptr->RdrTypeUnion.CtrlRec.DefaultMode.ReadOnly = SAHPI_FALSE; rdrptr->RdrTypeUnion.CtrlRec.WriteOnly = SAHPI_FALSE; rdrptr->RdrTypeUnion.CtrlRec.Oem = 0; cinfo.ctl_type = ctl_type; cinfo.cur_mode = rdrptr->RdrTypeUnion.CtrlRec.DefaultMode.Mode; cinfo.cur_state.Discrete = rdrptr->RdrTypeUnion.CtrlRec.TypeUnion.Discrete.Default; } break; default: { err("ilo2_ribcl_controls(): Invalid iLO2 RIBCL control type"); wrap_g_free(rdrptr); return(SA_ERR_HPI_INTERNAL_ERROR); } } oh_init_textbuffer(&(rdrptr->IdString)); oh_append_textbuffer(&(rdrptr->IdString), desc); /* Allocate memory to save internal control type in private RDR area This saved value will be used by the control API to determine the the type of the control and send appropriate command down to RIBCL */ cinfo_ptr = g_memdup(&cinfo, sizeof(cinfo)); if(cinfo_ptr == NULL) { err("ilo2_ribcl_controls(): Out of memory."); wrap_g_free(rdrptr); return(SA_ERR_HPI_OUT_OF_MEMORY); } err = oh_add_rdr(oh_handler->rptcache, event->resource.ResourceId, rdrptr, cinfo_ptr, 0); if (err) { err("Could not add RDR. Error=%s.", oh_lookup_error(err)); wrap_g_free(rdrptr); wrap_g_free(cinfo_ptr); return(SA_ERR_HPI_INTERNAL_ERROR); } else { event->rdrs = g_slist_append(event->rdrs, rdrptr); } return(SA_OK); } /** * ilo2_ribcl_add_severity_sensor: * @oh_handler: Handler data pointer. * @event: Pointer to event structure for sensor parent resource event. * @sens_num: Sensor number for new sensor. * @sens_type: HPI type of new sensor. * @supported_states: Mask of all the EV states this sensor can support. * @sens_info: Private sensor info associated with RDR. * @description: Character string description of this sensor. * * This routine creates a new sensor of category SAHPI_EC_SEVERITY, using * the data given by the parameters. The new sensor RDR is added to * the parent resource given in the oh_event structure paramenter. * * The following fields in the SensorRec of the RDR will be set to fixed * values: * EnableCtrl = SAHPI_TRUE; * EventCtrl = SAHPI_SEC_PER_EVENT; * DataFormat.IsSupported = SAHPI_TRUE * DataFormat.ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64 * DataFormat.BaseUnits = SAHPI_SU_UNSPECIFIED * DataFormat.ModifierUse = SAHPI_SMUU_NONE * DataFormat.Percentage = SAHPI_FALSE * ThresholdDefn.IsAccessible = SAHPI_FALSE * * Return values: * SA_ERR_HPI_OUT_OF_MEMORY - memory allocation failed. * SA_ERR_HPI_INTERNAL_ERROR - could not add sensor RDR **/ static SaErrorT ilo2_ribcl_add_severity_sensor( struct oh_handler_state *oh_handler, struct oh_event *event, int sens_num, SaHpiSensorTypeT sens_type, SaHpiEventStateT supported_states, struct ilo2_ribcl_sensinfo *sens_info, char *description) { SaErrorT ret = SA_OK; SaHpiRdrT *rdr; SaHpiSensorRecT *sensor_rec; struct ilo2_ribcl_sensinfo *si; rdr = (SaHpiRdrT *)g_malloc0(sizeof(SaHpiRdrT)); if( rdr == NULL){ err("ilo2_ribcl_add_severity_sensor: Memory allocation failed."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* Fill in generic RDR stuff */ rdr->RdrType = SAHPI_SENSOR_RDR; rdr->Entity = event->resource.ResourceEntity; rdr->IsFru = SAHPI_FALSE; /* Fill in sensor specific info */ sensor_rec = &(rdr->RdrTypeUnion.SensorRec); sensor_rec->Num = sens_num; sensor_rec->Type = sens_type; sensor_rec->Category = SAHPI_EC_SEVERITY; sensor_rec->EnableCtrl = SAHPI_TRUE; sensor_rec->EventCtrl = SAHPI_SEC_PER_EVENT; sensor_rec->Events = supported_states; sensor_rec->DataFormat.IsSupported = SAHPI_TRUE; sensor_rec->DataFormat.ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_rec->DataFormat.BaseUnits = SAHPI_SU_UNSPECIFIED; sensor_rec->DataFormat.ModifierUse = SAHPI_SMUU_NONE; sensor_rec->DataFormat.Percentage = SAHPI_FALSE; /* Range and AccuracyFactor have been cleared by g_malloc0() */ sensor_rec->ThresholdDefn.IsAccessible = SAHPI_FALSE; oh_init_textbuffer(&(rdr->IdString)); oh_append_textbuffer(&(rdr->IdString), description); /* Copy the private sensor data initial values into a new allocation * to be associated with this RDR. */ si = g_memdup(sens_info, sizeof(struct ilo2_ribcl_sensinfo)); if( si == NULL){ wrap_g_free( rdr); err("ilo2_ribcl_add_severity_sensor: Memory allocation failed."); return(SA_ERR_HPI_OUT_OF_MEMORY); } ret = oh_add_rdr(oh_handler->rptcache, event->resource.ResourceId, rdr, si, 0); if( ret != SA_OK){ err("ilo2_ribcl_add_severity_sensor: could not add RDR. Error = %s.", oh_lookup_error(ret)); wrap_g_free( si); wrap_g_free( rdr); return( SA_ERR_HPI_INTERNAL_ERROR); } else { event->rdrs = g_slist_append(event->rdrs, rdr); } return( SA_OK); } /* end ilo2_ribcl_add_severity_sensor() */ /** * ilo2_ribcl_add_threshold_sensor: * @oh_handler: Handler data pointer. * @event: Pointer to event structure for sensor parent resource event. * @sens_num: Sensor number for new sensor. * @sens_type: HPI type of new sensor. * @supported_states: Mask of all the EV states this sensor can support. * @sens_info: Private sensor info associated with RDR. * @description: Character string description of temperature sensor. * * This routine creates a new sensor of category SAHPI_EC_THRESHOLD, using * the data given by the parameters. The new sensor RDR is added to * the parent resource given in the oh_event structure paramenter. * * The following fields in the SensorRec of the RDR will be set to fixed * values: * EnableCtrl = SAHPI_TRUE * EventCtrl = SAHPI_SEC_READ_ONLY * DataFormat.IsSupported = SAHPI_TRUE * DataFormat.ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64 * DataFormat.BaseUnits = SAHPI_SU_DEGREES_C * DataFormat.ModifierUse = SAHPI_SMUU_NONE * DataFormat.Percentage = SAHPI_FALSE * ThresholdDefn.IsAccessible = SAHPI_FALSE * * Return values: * SA_ERR_HPI_OUT_OF_MEMORY - memory allocation failed. * SA_ERR_HPI_INTERNAL_ERROR - could not add sensor RDR **/ static SaErrorT ilo2_ribcl_add_threshold_sensor( struct oh_handler_state *oh_handler, struct oh_event *event, int sens_num, SaHpiSensorTypeT sens_type, SaHpiEventStateT supported_states, struct ilo2_ribcl_sensinfo *sens_info, char *description) { SaErrorT ret = SA_OK; SaHpiRdrT *rdr; SaHpiSensorRecT *sensor_rec; struct ilo2_ribcl_sensinfo *si; rdr = (SaHpiRdrT *)g_malloc0(sizeof(SaHpiRdrT)); if( rdr == NULL){ err("ilo2_ribcl_add_threshold_sensor: " "Memory allocation failed."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* Fill in generic RDR stuff */ rdr->RdrType = SAHPI_SENSOR_RDR; rdr->Entity = event->resource.ResourceEntity; rdr->IsFru = SAHPI_FALSE; /* Fill in sensor specific info */ sensor_rec = &(rdr->RdrTypeUnion.SensorRec); sensor_rec->Num = sens_num; sensor_rec->Type = sens_type; sensor_rec->Category = SAHPI_EC_THRESHOLD; sensor_rec->EnableCtrl = SAHPI_TRUE; sensor_rec->EventCtrl = SAHPI_SEC_READ_ONLY; sensor_rec->Events = SAHPI_ES_UNSPECIFIED; sensor_rec->DataFormat.IsSupported = SAHPI_TRUE; sensor_rec->DataFormat.ReadingType = SAHPI_SENSOR_READING_TYPE_INT64; sensor_rec->DataFormat.BaseUnits = SAHPI_SU_DEGREES_C; sensor_rec->DataFormat.ModifierUse = SAHPI_SMUU_NONE; sensor_rec->DataFormat.Percentage = SAHPI_FALSE; /* Range and AccuracyFactor have been cleared by g_malloc0() */ sensor_rec->DataFormat.ModifierUnits = SAHPI_SU_UNSPECIFIED; sensor_rec->DataFormat.Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX; sensor_rec->DataFormat.Range.Max.IsSupported = SAHPI_TRUE; sensor_rec->DataFormat.Range.Max.Type = SAHPI_SENSOR_READING_TYPE_INT64; sensor_rec->DataFormat.Range.Max.Value.SensorInt64 = sens_info->threshold.UpCritical.Value.SensorInt64; sensor_rec->DataFormat.Range.NormalMax.IsSupported = SAHPI_TRUE; sensor_rec->DataFormat.Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_INT64; sensor_rec->DataFormat.Range.NormalMax.Value.SensorInt64 = sens_info->threshold.UpMajor.Value.SensorInt64; sensor_rec->DataFormat.AccuracyFactor = 0; sensor_rec->ThresholdDefn.IsAccessible = SAHPI_TRUE; sensor_rec->ThresholdDefn.ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR; sensor_rec->ThresholdDefn.WriteThold = 0x0; oh_init_textbuffer(&(rdr->IdString)); oh_append_textbuffer(&(rdr->IdString), description); /* Copy the private sensor data initial values into a new allocation * to be associated with this RDR. */ si = g_memdup(sens_info, sizeof(struct ilo2_ribcl_sensinfo)); if( si == NULL){ wrap_g_free( rdr); err("ilo2_ribcl_add_threshold_sensor: Memory allocation " "failed."); return(SA_ERR_HPI_OUT_OF_MEMORY); } ret = oh_add_rdr(oh_handler->rptcache, event->resource.ResourceId, rdr, si, 0); if( ret != SA_OK){ err("ilo2_ribcl_add_threshold_sensor: could not add RDR. " "Error = %s.", oh_lookup_error(ret)); wrap_g_free( si); wrap_g_free( rdr); return( SA_ERR_HPI_INTERNAL_ERROR); } else { event->rdrs = g_slist_append(event->rdrs, rdr); } return( SA_OK); } /* end ilo2_ribcl_add_threshold_sensor() */ /** * ilo2_ribcl_discover_chassis_sensors: * @oh_handler: Handler data pointer. * @event: Pointer to event structure for chassis resource event. * * This routine will create RDRs on the chassis rpt entry for the following * three sensors, if they have been detected during a discovery operation. * These sensors correspond to the system's general health, and are created * from information given in the HEALTH_AT_AT_GLANCE stanza returned by the * GET_EMBEDDED_HEALTH RIBCL command. * * Sensor 1: System Fan Health * This sensor is of type SAHPI_FAN. * This sensor is of class SAHPI_EC_SEVERITY, and supports the severity * states SAHPI_ES_OK, SAHPI_ES_MAJOR_FROM_LESS, * SAHPI_ES_MAJOR_FROM_CRITICAL, and SAHPI_ES_CRITICAL. * Its reading values (int64) are: * I2R_SEN_VAL_OK (0) - RIBCL reports "Ok" * I2R_SEN_VAL_DEGRADED (1) - RIBCL reports "Degraded" * I2R_SEN_VAL_FAILED (2) - RIBCL reports "Failed" * * Sensor 2: System Temperature Health. * This sensor is of type SAHPI_TEMPERATURE. * This sensor is of class SAHPI_EC_SEVERITY, and supports the severity * states SAHPI_ES_OK, and SAHPI_ES_CRITICAL. * Its reading values (int64) are: * I2R_SEN_VAL_OK (0) - RIBCL reports "Ok" * I2R_SEN_VAL_FAILED (2) - RIBCL reports "Failed" * * Sensor 3: System Power Supply Health * This sensor is of type SAHPI_POWER_SUPPLY. * This sensor is of class SAHPI_EC_SEVERITY, and supports the severity * states SAHPI_ES_OK, SAHPI_ES_MAJOR_FROM_LESS, * SAHPI_ES_MAJOR_FROM_CRITICAL, and SAHPI_ES_CRITICAL. * Its reading values (int64) are: * I2R_SEN_VAL_OK (0) - RIBCL reports "Ok" * I2R_SEN_VAL_DEGRADED (1) - RIBCL reports "Degraded" * I2R_SEN_VAL_FAILED (2) - RIBCL reports "Failed" * * Return values: * None **/ static void ilo2_ribcl_discover_chassis_sensors( struct oh_handler_state *oh_handler, struct oh_event *event) { SaErrorT ret = SA_OK; ilo2_ribcl_handler_t *ir_handler = NULL; struct ilo2_ribcl_sensinfo si_initial; I2R_SensorDataT *sensordat; ir_handler = (ilo2_ribcl_handler_t *) oh_handler->data; /* Look for the system fan health intication from the RIBCL * HEALTH_AT_A_GLANCE stanza from GET_EMBEDDED_HEALTH */ sensordat = &(ir_handler->DiscoveryData.chassis_sensors[I2R_SEN_FANHEALTH]); if( sensordat->reading.intval != I2R_SEN_VAL_UNINITIALIZED){ si_initial.sens_num = I2R_SEN_FANHEALTH; si_initial.sens_ev_state = SAHPI_ES_OK; si_initial.sens_enabled = SAHPI_TRUE; si_initial.sens_ev_enabled = SAHPI_TRUE; si_initial.sens_assertmask = I2R_SEVERITY_THREESTATE_EV; si_initial.sens_deassertmask = I2R_SEVERITY_THREESTATE_EV; si_initial.sens_value = I2R_SEN_VAL_UNINITIALIZED; ret = ilo2_ribcl_add_severity_sensor( oh_handler, event, I2R_SEN_FANHEALTH, SAHPI_FAN, I2R_SEVERITY_THREESTATE_EV, &si_initial, I2R_SEN_FANHEALTH_DESCRIPTION); if( ret == SA_OK){ sensordat->state = I2R_INITIAL; sensordat->rid = event->resource.ResourceId; ilo2_ribcl_add_resource_capability( oh_handler, event, (SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_SENSOR)); } else { err("ilo2_ribcl_discover_chassis_sensors: Failed to set up fan health sensor."); } } /* Look for the system temperature health intication from the RIBCL * HEALTH_AT_A_GLANCE stanza from GET_EMBEDDED_HEALTH */ sensordat = &(ir_handler->DiscoveryData.chassis_sensors[I2R_SEN_TEMPHEALTH]); if( sensordat->reading.intval != I2R_SEN_VAL_UNINITIALIZED){ si_initial.sens_num = I2R_SEN_TEMPHEALTH; si_initial.sens_ev_state = SAHPI_ES_OK; si_initial.sens_enabled = SAHPI_TRUE; si_initial.sens_ev_enabled = SAHPI_TRUE; si_initial.sens_assertmask = I2R_SEVERITY_TWOSTATE_EV; si_initial.sens_deassertmask = I2R_SEVERITY_TWOSTATE_EV; si_initial.sens_value = I2R_SEN_VAL_UNINITIALIZED; ret = ilo2_ribcl_add_severity_sensor( oh_handler, event, I2R_SEN_TEMPHEALTH, SAHPI_TEMPERATURE, I2R_SEVERITY_TWOSTATE_EV, &si_initial, I2R_SEN_TEMPHEALTH_DESCRIPTION); if( ret == SA_OK){ sensordat->state = I2R_INITIAL; sensordat->rid = event->resource.ResourceId; ilo2_ribcl_add_resource_capability( oh_handler, event, (SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_SENSOR)); } else { err("ilo2_ribcl_discover_chassis_sensors: Failed to set up temperature health sensor."); } } /* Look for the system power supply health intication from the RIBCL * HEALTH_AT_A_GLANCE stanza from GET_EMBEDDED_HEALTH */ sensordat = &(ir_handler->DiscoveryData.chassis_sensors[I2R_SEN_POWERHEALTH]); if( sensordat->reading.intval != I2R_SEN_VAL_UNINITIALIZED){ si_initial.sens_num = I2R_SEN_POWERHEALTH; si_initial.sens_ev_state = SAHPI_ES_OK; si_initial.sens_enabled = SAHPI_TRUE; si_initial.sens_ev_enabled = SAHPI_TRUE; si_initial.sens_assertmask = I2R_SEVERITY_THREESTATE_EV; si_initial.sens_deassertmask = I2R_SEVERITY_THREESTATE_EV; si_initial.sens_value = I2R_SEN_VAL_UNINITIALIZED; ret = ilo2_ribcl_add_severity_sensor( oh_handler, event, I2R_SEN_POWERHEALTH, SAHPI_POWER_SUPPLY, I2R_SEVERITY_THREESTATE_EV, &si_initial, I2R_SEN_POWERHEALTH_DESCRIPTION); if( ret == SA_OK){ sensordat->state = I2R_INITIAL; sensordat->rid = event->resource.ResourceId; ilo2_ribcl_add_resource_capability( oh_handler, event, (SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_SENSOR)); } else { err("ilo2_ribcl_discover_chassis_sensors: Failed to set up power supply health sensor."); } } } /* end ilo2_ribcl_discover_chassis_sensors() */ /** * ilo2_ribcl_add_resource_capability: * @oh_handler: Handler data pointer. * @event: Pointer to event structure for the resource event. * @capability: Capabilitiy (or capabilities) to add to this resource. * * Add the new resource capability (or capabilities) given in the 'capability' * parameter to the resource in the event structure, which is presumably a * resource event. Also, look up the rpt entry already in our handler's * rptcache, and if it exists, add the resource capability there also. * * Return values: * None **/ void ilo2_ribcl_add_resource_capability( struct oh_handler_state *oh_handler, struct oh_event *event, SaHpiCapabilitiesT capability) { SaHpiRptEntryT *rpt; /* Set the capabilities of the resource in this event structure */ event->resource.ResourceCapabilities |= capability; /* Now, just in case we've already performed a oh_add_resource() * call to place this resource into our handler's rptcache, look * it up using the entity path, and add the capability there, too. */ rpt = oh_get_resource_by_ep( oh_handler->rptcache, &(event->resource.ResourceEntity)); if( rpt != NULL){ rpt->ResourceCapabilities |= capability; } } /* end ilo2_ribcl_add_resource_capability() */ /** * ilo2_ribcl_get_iml * @oh_handler: The private handler for this plugin instance. * * This routine sends the ILO2_RIBCL_GET_EVENT_LOG xml commands * to an iLO2 via a SSL connection, receive the resulting output * from iLO2, parses that output, and writes the IML into log file. * * * Return values: * SA_OK for success. * SA_ERR_HPI_OUT_OF_MEMORY if allocation fails * SA_ERR_HPI_INTERNAL_ERROR if our customized command is null or * if response parsing fails. * **/ static SaErrorT ilo2_ribcl_get_iml( struct oh_handler_state *oh_handler) { ilo2_ribcl_handler_t *ir_handler = NULL; char *discover_cmd = NULL; char *d_response = NULL; /* command response buffer */ int ret = 0; char *new_buffer = NULL; ir_handler = (ilo2_ribcl_handler_t *) oh_handler->data; /* Allocate a temporary response buffer. Since the discover * command should be infrequently run, we dynamically allocate * instead of keeping a buffer around all the time. */ d_response = malloc(ILO2_RIBCL_DISCOVER_RESP_MAX); if( d_response == NULL){ err("ilo2_ribcl_get_iml(): failed to allocate resp buffer."); return( SA_ERR_HPI_OUT_OF_MEMORY); } /* Retrieve our customized command buffer */ discover_cmd = ir_handler->ribcl_xml_cmd[IR_CMD_GET_EVENT_LOG]; if( discover_cmd == NULL){ err("ilo2_ribcl_get_iml(): null customized command."); free( d_response); return( SA_ERR_HPI_INTERNAL_ERROR); } /* Send the command to iLO2 and get the response. */ ret = ilo2_ribcl_ssl_send_command( ir_handler, discover_cmd, d_response, ILO2_RIBCL_DISCOVER_RESP_MAX); if( ret !=0 ){ err("ilo2_ribcl_get_iml(): command send failed."); free( d_response); return( SA_ERR_HPI_INTERNAL_ERROR); } /* Now, parse the response. The information related to DIMM error will * be extracted.*/ /*switch based on ilo*/ switch(ir_handler->ilo_type){ case ILO: case ILO2: ret = ir_xml_parse_iml( oh_handler, d_response); break; case ILO3: case ILO4: new_buffer = ir_xml_decode_chunked(d_response); ret = ir_xml_parse_iml( oh_handler, new_buffer); break; default: err("ilo2_ribcl_get_iml():" "failed to detect ilo type."); } if( ret != RIBCL_SUCCESS){ err("ilo2_ribcl_get_iml(): response parse failed in \ ir_xml_parse_iml()."); free( d_response); free( new_buffer); return( SA_ERR_HPI_INTERNAL_ERROR); } /* We're finished. Free up the temporary response buffer */ free( d_response); /* * new_buffer will be NULL for ILO2 * it is absolutely fine to free NULL */ free( new_buffer); return( SA_OK); } #ifdef ILO2_RIBCL_SIMULATE_iLO2_RESPONSE /** * ilo2_ribcl_getfile * @fname: The file name. * @buffer: Ptr for the destination buffer. * @bufsize: Size of the destination buffer. * * This function, intended for testing, will read the contents of file * 'fname' into the buffer pointed to by 'buffer'. * * Return values: 0 if Success, 1 otherwise. **/ static int ilo2_ribcl_getfile( char *fname, char *buffer, int bufsize) { int fd; struct stat stbuf; int i; int rcount; if( (fd = open( fname, O_RDONLY)) == -1){ err("ilo2_ribcl_getfile(): Open failed for file %s", fname); return( 1); } if( fstat( fd, &stbuf) != 0){ err("ilo2_ribcl_getfile: Stat failed for file %s", fname); close(fd); return( 1); } if( (stbuf.st_size + 1) > bufsize){ err("ilo2_ribcl_getfile(): File exceeds buffer by %ld bytes.", (stbuf.st_size + 1) - bufsize); close(fd); return( 1); } i = 0; while( (rcount = read( fd, &buffer[i], 1)) != 0){ if( rcount == -1){ err("ilo2_ribcl_getfile(): Read error at byte %d", i); close(fd); return( 1); } i++; /* If someone is writing to the file after we did the above * fstat, we could overflow the buffer. */ if( i >= (bufsize -1)){ break; } } buffer[i] = 0; /* Null terminate */ close(fd); return( 0); /* Success */ } /* end ilo2_ribcl_getfile() */ #endif /* ILO2_RIBCL_SIMULATE_iLO2_RESPONSE */ /***************************** OpenHPI plug-in to iLO2 RIBCL plug-in ABI function mapping *****************************/ void * oh_discover_resources (void *) __attribute__ ((weak, alias("ilo2_ribcl_discover_resources"))); openhpi-3.6.1/plugins/ilo2_ribcl/ilo2_ribcl_rpt.c0000644000175100017510000001664112575647266020761 0ustar mohanmohan/* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Shuah Khan * Richard White */ /*************** * This source file contains Resource Presence Table (RPT) HPI ABI routines * iLO2 RIBCL plug-in implements. Other source files provide support * functionality for these ABIs. ***************/ #include #include #include /***************************** iLO2 RIBCL plug-in Resource Presence Table (RPT) ABI Interface functions. *****************************/ /** * ilo2_ribcl_set_resource_severity: * @hnd: Handler data pointer. * @rid: Resource ID. * @tag: Resource's severity. * * Sets severity of events when resource unexpectedly becomes unavailable. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - @sev is invalid. * SA_ERR_HPI_OUT_OF_MEMORY - No memory to allocate event. **/ SaErrorT ilo2_ribcl_set_resource_severity(void *hnd, SaHpiResourceIdT rid, SaHpiSeverityT sev) { SaHpiRptEntryT *rpt; struct oh_handler_state *handle; ilo2_ribcl_handler_t *ilo2_ribcl_handler = NULL; ilo2_ribcl_resource_info_t *res_info = NULL; struct oh_event *e; if (oh_lookup_severity(sev) == NULL) { err("ilo2_ribcl_set_resource_severity(): Invalid parameter"); return(SA_ERR_HPI_INVALID_PARAMS); } handle = (struct oh_handler_state *)hnd; ilo2_ribcl_handler = (ilo2_ribcl_handler_t *)handle->data; if (!ilo2_ribcl_handler) { err("ilo2_ribcl_set_resource_severity(): Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { err("ilo2_ribcl_set_resource_severity(): No RID."); return(SA_ERR_HPI_INVALID_RESOURCE); } rpt->ResourceSeverity = sev; res_info = (ilo2_ribcl_resource_info_t *)oh_get_resource_data( handle->rptcache, rpt->ResourceId); if (!res_info) { err("ilo2_ribcl_set_resource_severity(): no resource info."); return(SA_ERR_HPI_INVALID_RESOURCE); } /* Add changed resource to event queue */ e = oh_new_event(); if (e == NULL) { err("ilo2_ribcl_set_resource_severity(): Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } e->resource = *rpt; /* Construct .event of struct oh_event */ e->event.Severity = e->resource.ResourceSeverity; e->event.Source = e->resource.ResourceId; if (oh_gettimeofday(&e->event.Timestamp) != SA_OK) { e->event.Timestamp = SAHPI_TIME_UNSPECIFIED; } if (e->resource.ResourceCapabilities & SAHPI_CAPABILITY_FRU) { e->event.EventType = SAHPI_ET_HOTSWAP; e->event.EventDataUnion.HotSwapEvent.HotSwapState = res_info->fru_cur_state; } else { e->event.EventType = SAHPI_ET_RESOURCE; e->event.EventDataUnion.ResourceEvent.ResourceEventType = SAHPI_RESE_RESOURCE_ADDED; } /* Prime event to evenq */ e->hid = handle->hid; oh_evt_queue_push(handle->eventq, e); return(SA_OK); } /** * ilo2_ribcl_set_resource_tag: * @hnd: Handler data pointer. * @rid: Resource ID. * @tag: Pointer to SaHpiTextBufferT. * * Sets resource's tag. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - @tag is NULL or invalid. * SA_ERR_HPI_OUT_OF_MEMORY - No memory to allocate event. **/ SaErrorT ilo2_ribcl_set_resource_tag(void *hnd, SaHpiResourceIdT rid, SaHpiTextBufferT *tag) { SaErrorT err; SaHpiRptEntryT *rpt; struct oh_event *e; ilo2_ribcl_handler_t *ilo2_ribcl_handler = NULL; ilo2_ribcl_resource_info_t *res_info = NULL; struct oh_handler_state *handle; if (!oh_valid_textbuffer(tag) || !hnd) { err("ilo2_ribcl_set_resource_tag((): Invalid parameter"); return(SA_ERR_HPI_INVALID_PARAMS); } handle = (struct oh_handler_state *)hnd; ilo2_ribcl_handler = (ilo2_ribcl_handler_t *)handle->data; if (!ilo2_ribcl_handler) { err("ilo2_ribcl_set_resource_tag(): Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { err("ilo2_ribcl_set_resource_tag(): No RID."); return(SA_ERR_HPI_INVALID_RESOURCE); } err = oh_copy_textbuffer(&(rpt->ResourceTag), tag); if (err) { err("ilo2_ribcl_set_resource_tag(): Cannot copy textbuffer"); return(err); } res_info = (ilo2_ribcl_resource_info_t *)oh_get_resource_data( handle->rptcache, rpt->ResourceId); if (!res_info) { err("ilo2_ribcl_set_resource_severity(): no resource info."); return(SA_ERR_HPI_INVALID_RESOURCE); } /* Add changed resource to event queue */ e = oh_new_event(); if (e == NULL) { err("ilo2_ribcl_set_resource_tag(): Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } e->resource = *rpt; /* Construct .event of struct oh_event */ e->event.Severity = e->resource.ResourceSeverity; e->event.Source = e->resource.ResourceId; if (oh_gettimeofday(&e->event.Timestamp) != SA_OK) { e->event.Timestamp = SAHPI_TIME_UNSPECIFIED; } if (e->resource.ResourceCapabilities & SAHPI_CAPABILITY_FRU) { e->event.EventType = SAHPI_ET_HOTSWAP; e->event.EventDataUnion.HotSwapEvent.HotSwapState = res_info->fru_cur_state; } else { e->event.EventType = SAHPI_ET_RESOURCE; e->event.EventDataUnion.ResourceEvent.ResourceEventType = SAHPI_RESE_RESOURCE_ADDED; } /* Prime event to evenq */ e->hid = handle->hid; oh_evt_queue_push(handle->eventq, e); return(SA_OK); } /***************************** OpenHPI plug-in to iLO2 RIBCL plug-in ABI function mapping *****************************/ void *oh_set_resource_tag (void *, SaHpiResourceIdT, SaHpiTextBufferT *) __attribute__ ((weak, alias("ilo2_ribcl_set_resource_tag"))); void *oh_set_resource_severity (void *, SaHpiResourceIdT, SaHpiSeverityT) __attribute__ ((weak, alias("ilo2_ribcl_set_resource_severity"))); openhpi-3.6.1/plugins/ilo2_ribcl/ilo2_ribcl_ssl.c0000644000175100017510000002053512575647266020752 0ustar mohanmohan/* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Shuah Khan * Richard White */ /***************************** * This file implements the iLO2 RIBCL plug-in iLO2 SSL connection * management functionality that is not part of the infrastructure. * It supports the following function: * * ilo2_ribcl_ssl_send_command - Send a command, reading the response *****************************/ /* TODO: Evaluate whether a shorter timeout value should be used. This * affects calls to oh_ssl_connect(), oh_ssl_read(), and oh_ssl_write(). */ /* Header files */ #include #include #include #include /** * ilo2_ribcl_ssl_send_command * @ir_handler: Ptr to this instance's private handler. * @cmnd_buf: Ptr to buffer containing the RIBCL command(s) to send. * @resp_buf: Ptr to buffer into which the response will be written. * @resp_buf_size: Size (in bytes) of the response buffer. * * This routine will send the contents of the RIBCL command buffer cmnd_buf * to the iLO2 addressed by the plugin private handler ir_handler. The response * from iLO2 will be stored in the null terminated character buffer pointed * to by resp_buf. * * Return values: * 0 success. * -1 failure. **/ int ilo2_ribcl_ssl_send_command( ilo2_ribcl_handler_t *ir_handler, char *cmnd_buf, char *resp_buf, int resp_size) { void *ssl_handler = NULL; int in_index; int ret; int ilo_header_len; char *hostname = NULL; char cmnd_bufsize[ILO2_RIBCL_CMD_MAX_LEN]; /* Zero out the response buffer */ memset( resp_buf, 0, resp_size); ssl_handler = oh_ssl_connect( ir_handler->ilo2_hostport, ir_handler->ssl_ctx, 0); if( ssl_handler == NULL){ err("ilo2_ribcl_ssl_send_command(): " "oh_ssl_connect returned NULL."); return( -1); } /* Send the XML header. iLO2 requires the header to be sent ahead separately from the buffer containing the command. */ /* * the following is added to send different header info * for iLO2 and iLO3. based on the ilo_type, header is * choosen, if the ilo_type is 0(zero ). then a test header * is sent to identify if that is ilo2 or ilo3. */ memset(cmnd_bufsize, '\0', ILO2_RIBCL_CMD_MAX_LEN); switch(ir_handler->ilo_type) { case ILO: case ILO2: ret = oh_ssl_write(ssl_handler, ILO2_RIBCL_XML_HDR, sizeof(ILO2_RIBCL_XML_HDR), 0); break; case ILO3: case ILO4: hostname = ir_handler->ir_hostname; itoascii(cmnd_bufsize, strlen(cmnd_buf)); ilo_header_len = strlen( ILO3_RIBCL_XML_HDR)\ + strlen(hostname)\ + strlen(cmnd_bufsize); ir_handler->ribcl_xml_ilo3_hdr = malloc( ilo_header_len); if( ir_handler->ribcl_xml_ilo3_hdr == NULL){ err("ilo2_ribcl_ssl_send_command():" "unable to allocate memory"); return -1; } memset( ir_handler->ribcl_xml_ilo3_hdr, '\0', ilo_header_len); ir_xml_insert_headerinfo(ir_handler->ribcl_xml_ilo3_hdr, ilo_header_len, ILO3_RIBCL_XML_HDR, ir_handler->ir_hostname, cmnd_bufsize); ret = oh_ssl_write(ssl_handler, ir_handler->ribcl_xml_ilo3_hdr, strlen(ir_handler->ribcl_xml_ilo3_hdr), 0); /* * Free up the allocated memory */ free( ir_handler->ribcl_xml_ilo3_hdr); break; case NO_ILO: hostname = ir_handler->ir_hostname; itoascii(cmnd_bufsize, strlen(ILO_RIBCL_TEST_ILO)-1); ilo_header_len = strlen( ILO_RIBCL_XML_TEST_HDR)\ + strlen(hostname)\ + strlen(cmnd_bufsize); ir_handler->ribcl_xml_test_hdr = malloc( ilo_header_len); if( ir_handler->ribcl_xml_test_hdr == NULL){ err("ilo2_ribcl_ssl_send_command():" "unable to allocate memory"); return -1; } memset( ir_handler->ribcl_xml_test_hdr, '\0', ilo_header_len); ir_xml_insert_headerinfo(ir_handler->ribcl_xml_test_hdr, ilo_header_len, ILO_RIBCL_XML_TEST_HDR, ir_handler->ir_hostname, cmnd_bufsize); ret = oh_ssl_write(ssl_handler, ir_handler->ribcl_xml_test_hdr, strlen(ir_handler->ribcl_xml_test_hdr), 0); /* * Free up the allocated memory */ free( ir_handler->ribcl_xml_test_hdr); break; default: err("ilo2_ribcl_ssl_send_command(): " "could not find iLO type."); ret = -1; } if( ret < 0){ err("ilo2_ribcl_ssl_send_command(): " "write of xml header to socket failed."); oh_ssl_disconnect(ssl_handler, OH_SSL_BI); return( -1); } /* Send the command buffer. */ if( ir_handler->ilo_type != NO_ILO) ret = oh_ssl_write(ssl_handler, cmnd_buf, strlen(cmnd_buf), 0); else ret = oh_ssl_write(ssl_handler, ILO_RIBCL_TEST_ILO, strlen(ILO_RIBCL_TEST_ILO), 0); if( ret < 0){ err("ilo2_ribcl_ssl_send_command(): " "write of xml command to socket failed."); oh_ssl_disconnect(ssl_handler, OH_SSL_BI); return( -1); } ret = 0; in_index = 0; while( 1){ ret = oh_ssl_read( ssl_handler, &(resp_buf[in_index]), (resp_size - in_index), 0); if( ret <= 0){ break; } in_index = in_index + ret; } resp_buf[in_index] = '\0'; /* cleanup */ oh_ssl_disconnect(ssl_handler, OH_SSL_BI); return( 0); } /* end ilo2_ribcl_ssl_send_command */ /** * ilo_ribcl_detect_ilo_type * @ir_handler: Pointer to the ilo handler. * * Detects if the current ilo is ilo2/ilo3 * * Return value: returns either ILO2 or ILO3 * **/ int ilo_ribcl_detect_ilo_type(ilo2_ribcl_handler_t *ir_handler) { char *detect_cmd = NULL; char *d_response = NULL; char firstline[ILO2_RIBCL_HTTP_LINE_MAX]; int index; int ret; d_response = malloc(ILO_RIBCL_TEST_ILO_RESPONSE_MAX); if(!d_response){ err("ilo_ribcl_detect_ilo_type():" "unable to allocate memory"); return( -1); } detect_cmd = ir_handler->ribcl_xml_test_hdr; ret = ilo2_ribcl_ssl_send_command( ir_handler, detect_cmd, d_response, ILO_RIBCL_TEST_ILO_RESPONSE_MAX); if( ret < 0){ err("ilo2_ribcl_ssl_send_command(): " "write of xml header to socket failed."); free( d_response); return( -1); } index = 0; while(d_response[index]!='\n'){ firstline[index]=d_response[index]; index++; } firstline[index++] = '\n'; firstline[index] = '\0'; /* *We can now free up the d_response *pointer */ free( d_response); if(strcmp(ILO_RIBCL_TEST_RESPONSE, firstline)==0){ dbg("Found iLO3/iLO4 MP"); return ILO3; } else { dbg("Found iLO2 MP"); return ILO2; } } /* end ilo_ribcl_detect_ilo_type() */ /** * itoascii * @cmnd_size: Pointer to the converted string. * @decimal: integer value. * * Converts a integer value to ascii string. * * Return value: none. * **/ void itoascii(char cmnd_size[], int decimal) { int i; int j; int temp; i = 0; do{ cmnd_size[i++] = decimal % 10 + '0'; }while((decimal /= 10) > 0); for(i = 0, j = strlen(cmnd_size)-1; i < j; i++, j--){ temp = cmnd_size[i]; cmnd_size[i] = cmnd_size[j]; cmnd_size[j] = temp; } } /* end itoascii() */ openhpi-3.6.1/plugins/ilo2_ribcl/ilo2_ribcl_sensor.c0000644000175100017510000013077612575647266021473 0ustar mohanmohan/* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Shuah Khan * Richard White */ /*************** * This source file contains Sensor HPI ABI routines iLO2 RIBCL plug-in * implements. Other source files provide support functionality for * these ABIs. ***************/ #include #include /************************************ Forward declarations for static functions in this file ************************************/ static SaErrorT ilo2_ribcl_get_sensor_allinfo( struct oh_handler_state *, SaHpiResourceIdT , SaHpiSensorNumT , struct ilo2_ribcl_sens_allinfo *); static SaErrorT ilo2_ribcl_sensor_send_event( struct oh_handler_state *, struct ilo2_ribcl_sens_allinfo *, SaHpiEventTypeT, SaHpiSeverityT, SaHpiBoolT); static void ilo2_ribcl_process_severitysensor( struct oh_handler_state *, struct ilo2_ribcl_sens_allinfo *, I2R_SensorDataT *); static void ilo2_ribcl_process_temperaturesensor( struct oh_handler_state *, struct ilo2_ribcl_sens_allinfo *, ir_tsdata_t *); /** * ilo2_ribcl_get_sensor_reading: * @hdn: Pointer to the handler for this instance. * @rid: Resource ID for resource containing this sensor. * @s_num: Number of this sensor in the resource. * @s_reading: Pointer used to return sensor reading. * @s_state: Pointer used to return sensor state. * * Description: * Implements the plugin specific part of the saHpiSensorReadingGet() API. * * We make a call to ilo2_ribcl_get_sensor_allinfo() to obtain the sensor RDR, * the rpt entry for the resource containing the sensor, and the struct * ilo2_ribcl_sensinfo that contains all our sensor data. * * Since the sensors that we support all return a 64bit integer reading, * this routine assumes a 64bit integer value. If we support additional * sensor types in the future, this routine may need to change. * * Since the communication latency with iLo2 is so large (or the order of 10 * seconds), we don't read the actual sensor values from iLo2 in * this routine. Instead, we peridically poll for the sensor values and store * them in the struct ilo2_ribcl_sensinfo structures that are associated with * the sensor RDRs (done in ilo2_ribcl_process_sensors()). This routine returns * those cached sensor values. Currently, the sensor values are read during a * discovery operation - either via a client's call to saHpiDiscover() or via * the daemon's periodic discovery done in oh_discovery_thread_loop(). * * Return values: * SA_OK - Normal, successful return. * SA_ERR_HPI_CAPABILITY - Resource does not support sensors. * SA_ERR_HPI_INVALID_REQUEST - Sensor is curerntly disabled. * SA_ERR_HPI_NOT_PRESENT - The requested sensor is not present. * SA_ERR_HPI_INVALID_RESOURCE - The resource does not exist. * SA_ERR_HPI_INTERNAL_ERROR - There is no private data for this sensor. **/ SaErrorT ilo2_ribcl_get_sensor_reading(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT s_num, SaHpiSensorReadingT *s_reading, SaHpiEventStateT *s_state) { SaErrorT ret; struct oh_handler_state *oh_handler; struct ilo2_ribcl_sens_allinfo sens_allinfo; struct ilo2_ribcl_sensinfo *sensinfo; if( !hnd){ err(" ilo2_ribcl_get_sensor_reading: invalid handle."); return( SA_ERR_HPI_INVALID_PARAMS); } oh_handler = (struct oh_handler_state *)hnd; /* Look up our sensor RDR, and it's associated data */ ret = ilo2_ribcl_get_sensor_allinfo( oh_handler, rid, s_num, &sens_allinfo); if( ret != SA_OK){ return( ret); } /* If this sensor is currently disabled, return an error */ sensinfo = sens_allinfo.sens_dat; if( !sensinfo->sens_enabled){ return( SA_ERR_HPI_INVALID_REQUEST); } if( s_reading != NULL){ s_reading->IsSupported = SAHPI_TRUE; s_reading->Type = sens_allinfo.rdr->RdrTypeUnion.SensorRec.DataFormat.ReadingType; s_reading->Value.SensorInt64 = sensinfo->sens_value; } if( s_state != NULL){ *s_state = sensinfo->sens_ev_state; } return( SA_OK); } /* end ilo2_ribcl_get_sensor_reading() */ /** * ilo2_ribcl_get_sensor_enable: * @hdn: Pointer to the handler for this instance. * @rid: Resource ID for resource containing this sensor. * @s_num: Number of this sensor in the resource. * @s_enable: pointer to return sensor enable status. * * Description: * Implements the plugin specific part of the saHpiSensorEnableGet() API. * * We make a call to ilo2_ribcl_get_sensor_allinfo() to obtain the sensor RDR, * the rpt entry for the resource containing the sensor, and the struct * ilo2_ribcl_sensinfo that contains all our sensor data. * * Return values: * SA_OK - Normal, successful return. * SA_ERR_HPI_CAPABILITY - Resource does not support sensors. * SA_ERR_HPI_INVALID_PARAMS - s_enable pointer or handler is NULL. * SA_ERR_HPI_NOT_PRESENT - The requested sensor is not present. * SA_ERR_HPI_INVALID_RESOURCE - The resource does not exist. * SA_ERR_HPI_INTERNAL_ERROR - There is no private data for this sensor. **/ SaErrorT ilo2_ribcl_get_sensor_enable(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT s_num, SaHpiBoolT *s_enable) { SaErrorT ret; struct oh_handler_state *oh_handler; struct ilo2_ribcl_sens_allinfo sens_allinfo; if( !hnd){ err(" ilo2_ribcl_get_sensor_enable: invalid handle."); return( SA_ERR_HPI_INVALID_PARAMS); } if( !s_enable){ err(" ilo2_ribcl_get_sensor_enable: invalid enable pointer."); return( SA_ERR_HPI_INVALID_PARAMS); } oh_handler = (struct oh_handler_state *)hnd; /* Look up our sensor RDR, and it's associated data */ ret = ilo2_ribcl_get_sensor_allinfo( oh_handler, rid, s_num, &sens_allinfo); if( ret != SA_OK){ return( ret); } /* Now that we have our sensor data handy, return the enable value */ *s_enable = sens_allinfo.sens_dat->sens_enabled; return( SA_OK); } /* end ilo2_ribcl_get_sensor_enable() */ /** * ilo2_ribcl_set_sensor_enable: * @hdn: Pointer to the handler for this instance. * @rid: Resource ID for resource containing this sensor. * @s_num: Number of this sensor in the resource. * @s_enable: The new sensor enable status. * * Description: * Implements the plugin specific part of the saHpiSensorEnableSet() API. * * We make a call to ilo2_ribcl_get_sensor_allinfo() to obtain the sensor RDR, * the rpt entry for the resource containing the sensor, and the struct * ilo2_ribcl_sensinfo that contains all our sensor data. * * If the new sensor enable suppiled by the user differs from the existing * value in our sensor data structure, we call ilo2_ribcl_sensor_send_event() * to send a sensor enable change event. * * Return values: * SA_OK - Normal, successful return. * SA_ERR_HPI_CAPABILITY - Resource does not support sensors. * SA_ERR_HPI_NOT_PRESENT - The requested sensor is not present. * SA_ERR_HPI_INVALID_RESOURCE - The resource does not exist. * SA_ERR_HPI_READ_ONLY - The sensor does not support changing enable status. * SA_ERR_HPI_INTERNAL_ERROR - There is no private data for this sensor. **/ SaErrorT ilo2_ribcl_set_sensor_enable(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT s_num, SaHpiBoolT s_enable) { SaErrorT ret = SA_OK; struct oh_handler_state *oh_handler; struct ilo2_ribcl_sens_allinfo sens_allinfo; if( !hnd){ err(" ilo2_ribcl_set_sensor_enable: invalid handle."); return( SA_ERR_HPI_INVALID_PARAMS); } oh_handler = (struct oh_handler_state *)hnd; /* Look up our sensor RDR, and it's associated data */ ret = ilo2_ribcl_get_sensor_allinfo( oh_handler, rid, s_num, &sens_allinfo); if( ret != SA_OK){ return( ret); } /* Check that this sensor supports changing the enable status. */ if( sens_allinfo.rdr->RdrTypeUnion.SensorRec.EnableCtrl != SAHPI_TRUE){ return( SA_ERR_HPI_READ_ONLY); } /* We want to send an enable change event only if the enable * value has actually been changed. */ if( s_enable != sens_allinfo.sens_dat->sens_enabled){ sens_allinfo.sens_dat->sens_enabled = s_enable; ret = ilo2_ribcl_sensor_send_event( oh_handler, &sens_allinfo, SAHPI_ET_SENSOR_ENABLE_CHANGE, SAHPI_INFORMATIONAL, SAHPI_TRUE); } return( ret); } /* end ilo2_ribcl_set_sensor_enable() */ /** * ilo2_ribcl_get_sensor_event_enable: * @hdn: Pointer to the handler for this instance. * @rid: Resource ID for resource containing this sensor. * @s_num: Number of this sensor in the resource. * @e_enables: Pointer to return the sensor event enables. * * Description: * Implements the plugin specific part of the saHpiSensorEventEnableGet() API. * * We make a call to ilo2_ribcl_get_sensor_allinfo() to obtain the sensor RDR, * the rpt entry for the resource containing the sensor, and the struct * ilo2_ribcl_sensinfo that contains all our sensor data. * * Return values: * SA_OK - Normal, successful return. * SA_ERR_HPI_CAPABILITY - Resource does not support sensors. * SA_ER_HPI_INVALID_PARAMS - e_enables parameter is NULL. * SA_ERR_HPI_NOT_PRESENT - The requested sensor is not present. * SA_ERR_HPI_INVALID_RESOURCE - The resource does not exist. * SA_ERR_HPI_INTERNAL_ERROR - There is no private data for this sensor. **/ SaErrorT ilo2_ribcl_get_sensor_event_enable(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT s_num, SaHpiBoolT *e_enable) { SaErrorT ret; struct oh_handler_state *oh_handler; struct ilo2_ribcl_sens_allinfo sens_allinfo; if( !hnd){ err(" ilo2_ribcl_get_sensor_event_enable: invalid handle."); return( SA_ERR_HPI_INVALID_PARAMS); } if( !e_enable){ err(" ilo2_ribcl_get_sensor_event_enable: invalid enable pointer."); return( SA_ERR_HPI_INVALID_PARAMS); } oh_handler = (struct oh_handler_state *)hnd; /* Look up our sensor RDR, and it's associated data */ ret = ilo2_ribcl_get_sensor_allinfo( oh_handler, rid, s_num, &sens_allinfo); if( ret != SA_OK){ return( ret); } /* Now that we have our sensor data handy, return the event enable * status value */ *e_enable = sens_allinfo.sens_dat->sens_ev_enabled; return( SA_OK); } /* end ilo2_ribcl_get_sensor_event_enable() */ /** * ilo2_ribcl_set_sensor_event_enable: * @hdn: Pointer to the handler for this instance. * @rid: Resource ID for resource containing this sensor. * @s_num: Number of this sensor in the resource. * @e_enables: The new sensor event enables. * * Description: * Implements the plugin specific part of the saHpiSensorEventEnableSet() API. * * We make a call to ilo2_ribcl_get_sensor_allinfo() to obtain the sensor RDR, * the rpt entry for the resource containing the sensor, and the struct * ilo2_ribcl_sensinfo that contains all our sensor data. * * If the new event enable suppiled by the user differs from the existing * value in our sensor data structure, we call ilo2_ribcl_sensor_send_event() * to send a sensor enable change event. * * Return values: * SA_OK - Normal, successful return. * SA_ERR_HPI_CAPABILITY - Resource does not support sensors. * SA_ERR_HPI_NOT_PRESENT - The requested sensor is not present. * SA_ERR_HPI_INVALID_RESOURCE - The resource does not exist. * SA_ERR_HPI_READ_ONLY - The sensor does not support changing enable status. * SA_ERR_HPI_INTERNAL_ERROR - There is no private data for this sensor. * SA_ERR_HPI_OUT_OF_MEMORY - Allocation failed. **/ SaErrorT ilo2_ribcl_set_sensor_event_enable(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT s_num, SaHpiBoolT e_enable) { SaErrorT ret = SA_OK; struct oh_handler_state *oh_handler; struct ilo2_ribcl_sens_allinfo sens_allinfo; if( !hnd){ err(" ilo2_ribcl_set_sensor_event_enable: invalid handle."); return( SA_ERR_HPI_INVALID_PARAMS); } oh_handler = (struct oh_handler_state *)hnd; /* Look up our sensor RDR, and it's associated data */ ret = ilo2_ribcl_get_sensor_allinfo( oh_handler, rid, s_num, &sens_allinfo); if( ret != SA_OK){ return( ret); } /* Check that this sensor supports changing the enable status. */ if( sens_allinfo.rdr->RdrTypeUnion.SensorRec.EnableCtrl == SAHPI_SEC_READ_ONLY){ return( SA_ERR_HPI_READ_ONLY); } /* We want to send an enable change event only if the enable * value has actually been changed. */ if( e_enable != sens_allinfo.sens_dat->sens_ev_enabled){ sens_allinfo.sens_dat->sens_ev_enabled = e_enable; ret = ilo2_ribcl_sensor_send_event( oh_handler, &sens_allinfo, SAHPI_ET_SENSOR_ENABLE_CHANGE, SAHPI_INFORMATIONAL, SAHPI_TRUE); } return( ret); } /* end ilo2_ribcl_set_sensor_event_enable() */ /** * ilo2_ribcl_get_sensor_event_masks: * @hdn: Pointer to the handler for this instance. * @rid: Resource ID for resource containing this sensor. * @s_num: Number of this sensor in the resource. * @s_assertmask: Pointer to return the sensor event assert mask. * @s_deassertmask: Pointer to return the sensor event deassert mask. * * Description: * Implements the plugin specific part of the saHpiSensorEventMasksGet() API. * * We make a call to ilo2_ribcl_get_sensor_allinfo() to obtain the sensor RDR, * the rpt entry for the resource containing the sensor, and the struct * ilo2_ribcl_sensinfo that contains all our sensor data. * * Return values: * SA_OK - Normal, successful return. * SA_ERR_HPI_CAPABILITY - Resource does not support sensors. * SA_ERR_HPI_NOT_PRESENT - The requested sensor is not present. * SA_ERR_HPI_INVALID_RESOURCE - The resource does not exist. * SA_ERR_HPI_INTERNAL_ERROR - There is no private data for this sensor. **/ SaErrorT ilo2_ribcl_get_sensor_event_masks(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT s_num, SaHpiEventStateT *s_assertmask, SaHpiEventStateT *s_deassertmask) { SaErrorT ret; struct oh_handler_state *oh_handler; struct ilo2_ribcl_sens_allinfo sens_allinfo; if( !hnd){ err(" ilo2_ribcl_get_sensor_event_masks: invalid handle."); return( SA_ERR_HPI_INVALID_PARAMS); } oh_handler = (struct oh_handler_state *)hnd; /* Look up our sensor RDR, and it's associated data */ ret = ilo2_ribcl_get_sensor_allinfo( oh_handler, rid, s_num, &sens_allinfo); if( ret != SA_OK){ return( ret); } if( s_assertmask != NULL){ *s_assertmask = sens_allinfo.sens_dat->sens_assertmask; } if( s_deassertmask != NULL){ *s_deassertmask = sens_allinfo.sens_dat->sens_deassertmask; } return( SA_OK); } /* end ilo2_ribcl_get_sensor_event_masks() */ /** * ilo2_ribcl_set_sensor_event_masks: * @hdn: Pointer to the handler for this instance. * @rid: Resource ID for resource containing this sensor. * @s_num: Number of this sensor in the resource. * @act: Specified the masking action to perform * @s_assertmask: Pointer to return the sensor event assert mask. * @s_deassertmask: Pointer to return the sensor event deassert mask. * * Description: * Implements the plugin specific part of the saHpiSensorEventMasksSet() API. * * We make a call to ilo2_ribcl_get_sensor_allinfo() to obtain the sensor RDR, * the rpt entry for the resource containing the sensor, and the struct * ilo2_ribcl_sensinfo that contains all our sensor data. * * If the application of the new event mask(s) suppiled by the user results * in a change to the mask(s) in our sensor data structure, we call * ilo2_ribcl_sensor_send_event() to send a sensor enable change event. * * Even though none of our sensors currently set SAHPI_CAPABILITY_EVT_DEASSERTS, * this routine will set the deassert mask equal to the assert mask if * SAHPI_CAPABILITY_EVT_DEASSERTS is ever set. * * Return values: * SA_OK - Normal, successful return. * SA_ERR_HPI_CAPABILITY - Resource does not support sensors. * SA_ERR_HPI_NOT_PRESENT - The requested sensor is not present. * SA_ERR_HPI_INVALID_RESOURCE - The resource does not exist. * SA_ERR_HPI_INVALID_PARAMS- The act parameter is out of range. * SA_ERR_HPI_INVALID_DATA - * SA_ERR_HPI_READ_ONLY - The sensor does not support updating the masks. * SA_ERR_HPI_INTERNAL_ERROR - There is no private data for this sensor. **/ SaErrorT ilo2_ribcl_set_sensor_event_masks(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT s_num, SaHpiSensorEventMaskActionT act, SaHpiEventStateT s_assertmask, SaHpiEventStateT s_deassertmask) { SaErrorT ret = SA_OK; struct oh_handler_state *oh_handler; struct ilo2_ribcl_sens_allinfo sens_allinfo; SaHpiSensorEventCtrlT event_ctl; struct ilo2_ribcl_sensinfo *sensinfo; SaHpiEventStateT supported_events; SaHpiEventStateT new_assertmask; SaHpiEventStateT new_deassertmask; if( !hnd){ err(" ilo2_ribcl_set_sensor_event_masks: invalid handle."); return( SA_ERR_HPI_INVALID_PARAMS); } oh_handler = (struct oh_handler_state *)hnd; /* Look up our sensor RDR, and it's associated data */ ret = ilo2_ribcl_get_sensor_allinfo( oh_handler, rid, s_num, &sens_allinfo); if( ret != SA_OK){ return( ret); } sensinfo = sens_allinfo.sens_dat; supported_events = sens_allinfo.rdr->RdrTypeUnion.SensorRec.Events; /* Check if the event masks can be written */ event_ctl = sens_allinfo.rdr->RdrTypeUnion.SensorRec.EventCtrl; if( (event_ctl == SAHPI_SEC_READ_ONLY_MASKS) || (event_ctl == SAHPI_SEC_READ_ONLY) ){ return( SA_ERR_HPI_READ_ONLY); } /* If SAHPI_CAPABILITY_EVT_DEASSERTS has been set in the RPT entry, * then the de-assertion mask must track the assertion mask. The * SAHPI spec does not specify an error if the user provides masks * that don't match. */ if( sens_allinfo.rpt->ResourceCapabilities & SAHPI_CAPABILITY_EVT_DEASSERTS){ s_deassertmask = s_assertmask; } /* If either of the masks is SAHPI_ALL_EVENT_STATES, then set that * mask to all the event states that this sensor supports */ supported_events = sens_allinfo.rdr->RdrTypeUnion.SensorRec.Events; if( s_assertmask == SAHPI_ALL_EVENT_STATES){ s_assertmask = supported_events; } if( s_deassertmask == SAHPI_ALL_EVENT_STATES){ s_deassertmask = supported_events; } /* Check that the masks passed as parameters don't enclude event * states that this sensor does not support */ if( act == SAHPI_SENS_ADD_EVENTS_TO_MASKS){ if( (s_assertmask | supported_events) != supported_events){ return( SA_ERR_HPI_INVALID_DATA); } if( (s_deassertmask | supported_events) != supported_events){ return( SA_ERR_HPI_INVALID_DATA); } } if( act == SAHPI_SENS_ADD_EVENTS_TO_MASKS){ new_assertmask = sensinfo->sens_assertmask | s_assertmask; new_deassertmask = sensinfo->sens_deassertmask | s_deassertmask; } else if( act == SAHPI_SENS_REMOVE_EVENTS_FROM_MASKS){ new_assertmask = sensinfo->sens_assertmask & ~s_assertmask; new_deassertmask = sensinfo->sens_deassertmask & ~s_deassertmask; } else { return( SA_ERR_HPI_INVALID_PARAMS); } /* We only want to send an event if either of the masks will actually * change after all of this. */ if( (sensinfo->sens_assertmask == new_assertmask) && (sensinfo->sens_deassertmask == new_deassertmask) ){ return( SA_OK); } sensinfo->sens_assertmask = new_assertmask; sensinfo->sens_deassertmask = new_deassertmask; ret = ilo2_ribcl_sensor_send_event( oh_handler, &sens_allinfo, SAHPI_ET_SENSOR_ENABLE_CHANGE, SAHPI_INFORMATIONAL, SAHPI_TRUE); return( ret); } /* end ilo2_ribcl_set_sensor_event_masks() */ /** * ilo2_ribcl_get_sensor_thresholds: * @hnd: Handler data pointer * @rid: Resource ID * @s_num: Sensor rdr number * @threshold: Location to store sensor's threshold values * * Purpose: * Retrieves sensor's threshold values, if defined * * Detailed Description: * - Fetches sensor info structure from the private data area of * sensor rdr of specified rdr number * - Threshold details are returned if the event category of the sensor * is set to threshold type * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INVALID_REQUEST - Sensor is currently disabled. * SA_ERR_HPI_INVALID_CMD - Sensor not of threshold type, or is not enabled * for reading **/ SaErrorT ilo2_ribcl_get_sensor_thresholds(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT s_num, SaHpiSensorThresholdsT *threshold) { SaErrorT ret; struct oh_handler_state *oh_handler = NULL; struct ilo2_ribcl_sens_allinfo sens_allinfo; struct ilo2_ribcl_sensinfo *sensinfo = NULL; if (hnd == NULL || threshold == NULL) { err("ilo2_ribcl_get_sensor_thresholds: Invalid parameters"); return( SA_ERR_HPI_INVALID_PARAMS); } oh_handler = (struct oh_handler_state *)hnd; /* Look up our sensor RDR, and it's associated data */ ret = ilo2_ribcl_get_sensor_allinfo( oh_handler, rid, s_num, &sens_allinfo); if( ret != SA_OK){ return( ret); } sensinfo = sens_allinfo.sens_dat; /* if the sensor is disable; just return. */ if( !sensinfo->sens_enabled){ return( SA_ERR_HPI_INVALID_REQUEST); } if ( sens_allinfo.rdr->RdrTypeUnion.SensorRec.Category != SAHPI_EC_THRESHOLD || sens_allinfo.rdr-> RdrTypeUnion.SensorRec.ThresholdDefn.IsAccessible == SAHPI_FALSE || sens_allinfo.rdr-> RdrTypeUnion.SensorRec.ThresholdDefn.ReadThold == 0) { err("Invalid command"); return SA_ERR_HPI_INVALID_CMD; } /* setting the return value with the threshold value from the * sensor info structutre */ *threshold = sensinfo->threshold; return( SA_OK); } /** * ilo2_ribcl_get_sensor_allinfo: * @oh_handler: Pointer to the handler for this instance. * @rid: Resource ID for resource containing this sensor. * @s_num: Number of this sensor in the resource. * @sens_allinfo: Pointer to structure used to return rdr and data pointers. * * This is a support routine used within our plugin. It returns a pointer to * the sensor RDR, a pointer to the rpt entry for the resource containing the * sensor, and a pointer to the struct ilo2_ribcl_sensinfo that is associated * with the sensor RDR. These pointers are returned via the sens_allinfo * parameter, which should point to a struct ilo2_ribcl_sens_allinfo that has * been allocated by our caller. * * First, we get the rpt entry with a call to oh_get_resource_by_id(). Then * we get the sensor RDR with a call to oh_get_rdr_by_type(). Finally, we get * the associated sensor data with a call to oh_get_rdr_data(). * * Return values: * SA_OK - Normal, successful return. * SA_ERR_HPI_INVALID_RESOURCE - The resource does not exist. * SA_ERR_HPI_CAPABILITY - Resource does not support sensors. * SA_ERR_HPI_NOT_PRESENT - The requested sensor is not present. * SA_ERR_HPI_INTERNAL_ERROR - There is no private data for this sensor. **/ SaErrorT ilo2_ribcl_get_sensor_allinfo( struct oh_handler_state *oh_handler, SaHpiResourceIdT rid, SaHpiSensorNumT s_num, struct ilo2_ribcl_sens_allinfo *sens_allinfo) { sens_allinfo->rpt = NULL; sens_allinfo->rdr = NULL; sens_allinfo->sens_dat = NULL; sens_allinfo->ts_data = NULL; /* Check if the resource exists, and that it has sensor capability */ sens_allinfo->rpt = oh_get_resource_by_id(oh_handler->rptcache, rid); if( !sens_allinfo->rpt){ err("ilo2_ribcl_get_sensor_allinfo: no rpt entry for resource id %d.", rid); return( SA_ERR_HPI_INVALID_RESOURCE); } if( !(sens_allinfo->rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)){ err("ilo2_ribcl_get_sensor_allinfo: no sensor capability for resource id %d.", rid); return( SA_ERR_HPI_CAPABILITY); } /* look up the RDR for this sensor */ sens_allinfo->rdr = oh_get_rdr_by_type(oh_handler->rptcache, rid, SAHPI_SENSOR_RDR, s_num); if( sens_allinfo->rdr == NULL){ err("ilo2_ribcl_get_sensor_allinfo: no sensor RDR for resource id %d, sennsor %d.", rid, s_num); return( SA_ERR_HPI_NOT_PRESENT); } /* Finally, get the assoicated private data for this sensor */ sens_allinfo->sens_dat = (struct ilo2_ribcl_sensinfo *)oh_get_rdr_data( oh_handler->rptcache, rid, sens_allinfo->rdr->RecordId); if( sens_allinfo->sens_dat == NULL){ err("ilo2_ribcl_get_sensor_allinfo: no private sensor data for resource id %d, sensor %d, label: %s.", rid, s_num, sens_allinfo->rdr->IdString.Data); return( SA_ERR_HPI_INTERNAL_ERROR); } /* Finally, get the associated private data for temperature sensor */ sens_allinfo->ts_data = (struct ir_tsdata *)oh_get_rdr_data( oh_handler->rptcache, rid, sens_allinfo->rdr->RecordId); if( sens_allinfo->ts_data == NULL){ err("ilo2_ribcl_get_sensor_allinfo: no private temp data for " "resource id %d, sensor %d, label: %s.",rid, s_num, sens_allinfo->rdr->IdString.Data); return( SA_ERR_HPI_INTERNAL_ERROR); } return( SA_OK); } /* end ilo2_ribcl_get_sensor_allinfo( ) */ /** * ilo2_ribcl_sensor_send_event: * @oh_handler: Pointer to the handler for this instance. * @sens_allinfo: Pointer to structure used to return rdr and data pointers. * @event_type: Type of sensor event. * @event_severity: Severity of event. * @is_assertion: True if this is an assertion event, false if not. * * This routine is used by our plugin to send both sensor change and sensor * enable change events. * * Sensor change events: * The single sensor event to be asserted or de-asserted is given by * the event_sens_ev_state element of struct ilo2_ribcl_sensinfo that * has been provided by the sens_allinfo parameter. * * The optional data SAHPI_SOD_CURRENT_STATE and SAHPI_SOD_PREVIOUS_STATE * are provided in our sensor events. * * Sensor enable change events: * The optional data SAHPI_SEOD_CURRENT_STATE is provided in our sensor * enable change events. * * Return values: * SA_OK - Normal, successful return. * SA_ERR_HPI_OUT_OF_MEMORY - Allocation failed. * SA_ERR_HPI_INTERNAL_ERROR - The event type was not SAHPI_ET_SENSOR or * SAHPI_ET_SENSOR_ENABLE_CHANGE. **/ static SaErrorT ilo2_ribcl_sensor_send_event( struct oh_handler_state *oh_handler, struct ilo2_ribcl_sens_allinfo *sens_allinfo, SaHpiEventTypeT event_type, SaHpiSeverityT sens_severity, SaHpiBoolT is_assertion) { struct oh_event *ev; SaHpiRdrT *rdr; struct ilo2_ribcl_sensinfo *sensinfo; SaHpiSensorEnableChangeEventT *sen_evch; SaHpiSensorEventT *sen_ev; if( (event_type != SAHPI_ET_SENSOR) && ( event_type != SAHPI_ET_SENSOR_ENABLE_CHANGE) ){ err("ilo2_ribcl_sensor_send_event: invalid event type."); return( SA_ERR_HPI_INTERNAL_ERROR); } rdr = sens_allinfo->rdr; sensinfo = sens_allinfo->sens_dat; ev = oh_new_event(); if( ev == NULL){ err("ilo2_ribcl_undiscovered_fru(): event allocation failed."); return( SA_ERR_HPI_OUT_OF_MEMORY); } ev->resource = *(sens_allinfo->rpt); ev->hid = oh_handler->hid; ev->event.EventType = event_type; ev->event.Severity = sens_severity; ev->event.Source = ev->resource.ResourceId; if ( oh_gettimeofday(&(ev->event.Timestamp)) != SA_OK){ ev->event.Timestamp = SAHPI_TIME_UNSPECIFIED; } ev->rdrs = g_slist_append(ev->rdrs, g_memdup(sens_allinfo->rdr, sizeof(SaHpiRdrT))); /* Now, fill out the sensor specific part */ if( event_type == SAHPI_ET_SENSOR_ENABLE_CHANGE){ sen_evch = &(ev->event.EventDataUnion.SensorEnableChangeEvent); sen_evch->SensorNum = sensinfo->sens_num; sen_evch->SensorType = rdr->RdrTypeUnion.SensorRec.Type; sen_evch->EventCategory = rdr->RdrTypeUnion.SensorRec.Category; sen_evch->SensorEnable = sensinfo->sens_enabled; sen_evch->SensorEventEnable = sensinfo->sens_ev_enabled; sen_evch->AssertEventMask = sensinfo->sens_assertmask; sen_evch->DeassertEventMask = sensinfo->sens_deassertmask; /* Optional data follows */ sen_evch->OptionalDataPresent |= SAHPI_SEOD_CURRENT_STATE; sen_evch->CurrentState = sensinfo->sens_ev_state; } else { /* Otherwise, it's a regular sensor event */ sen_ev = &(ev->event.EventDataUnion.SensorEvent); sen_ev->SensorNum = sensinfo->sens_num; sen_ev->SensorType = rdr->RdrTypeUnion.SensorRec.Type; sen_ev->EventCategory = rdr->RdrTypeUnion.SensorRec.Category; sen_ev->Assertion = is_assertion; sen_ev->EventState = sensinfo->event_sens_ev_state; /* Optional data follows */ sen_ev->OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE; sen_ev->PreviousState = sensinfo->prev_sens_ev_state; sen_ev->CurrentState = sensinfo->sens_ev_state; } oh_evt_queue_push( oh_handler->eventq, ev); return( SA_OK); } /* end ilo2_ribcl_sensor_send_event() */ /** * ilo2_ribcl_process_sensors: * @oh_handler: Pointer to the handler for this instance. * * This routine is called to examine the values of the sensors retrieved * and stored in the handler's DiscoveryData during the last discovery * operation, update the sensor values in the sensor data structures * associated with the sensor RDRs, and send the appropriate events if * the sensor values have changed. * * Since the communication latency with iLo2 is so large (or the order of 10 * seconds), we don't read the actual sensor values from iLo2 in * ilo2_ribcl_get_sensor_reading(). Instead, we peridically poll for the * sensor values and store them in the struct ilo2_ribcl_sensinfo structures * that are associated with the sensor RDRs. * * Currently, the sensor values are read during a discovery operation - either * via a client's call to saHpiDiscover() or via the daemon's periodic * discovery done in oh_discovery_thread_loop(). This routine is then called * at the end of ilo2_ribcl_do_discovery(). * * Chassis sensors: * For all chassis sensor readings stored in the handler's DiscoveryData, * get the sensor's associated HPI structures, and call * ilo2_ribcl_process_severitysensor(). * * Return values: * None **/ void ilo2_ribcl_process_sensors( struct oh_handler_state *oh_handler) { SaErrorT ret; SaHpiSensorNumT sens_num, temp_sensnum; ilo2_ribcl_handler_t *ir_handler = NULL; I2R_SensorDataT *ir_sens_dat; struct ilo2_ribcl_sens_allinfo sens_allinfo; ir_tsdata_t *tsdata = NULL; ir_handler = (ilo2_ribcl_handler_t *) oh_handler->data; /* Handle the chassis sensors */ for( sens_num = 1; sens_num < I2R_NUM_CHASSIS_SENSORS; sens_num++){ ir_sens_dat = &(ir_handler->DiscoveryData.chassis_sensors[sens_num]); /* If this sensor was not found during discovery, skip it */ if( ir_sens_dat->state == I2R_NO_EXIST){ continue; } /* Get the rpt of the sensor resource, the RDR of the sensor, * and the sensor data associated with the RDR. */ ret = ilo2_ribcl_get_sensor_allinfo( oh_handler, ir_sens_dat->rid, sens_num, &sens_allinfo); if( ret != SA_OK){ err("ilo2_ribcl_process_sensors: could not locate HPI data for chassis sensor number %d.", sens_num); continue; } /* All of our chassis sensors are the severity type */ ilo2_ribcl_process_severitysensor( oh_handler, &sens_allinfo, ir_sens_dat); } /* Handle the temperature sensors */ for( temp_sensnum = 4; temp_sensnum < ILO2_RIBCL_DISCOVER_TS_MAX + 1; temp_sensnum++){ tsdata = &(ir_handler->DiscoveryData.tsdata[temp_sensnum]); /* If temperature sensor was not found during discovery, * skip it */ if( tsdata->tsflags != IR_DISCOVERED){ continue; } /* Get the rpt of the sensor resource, the RDR of the sensor, * and the sensor data associated with the RDR. */ ret = ilo2_ribcl_get_sensor_allinfo( oh_handler, tsdata->rid, temp_sensnum, &sens_allinfo); if( ret != SA_OK){ err("ilo2_ribcl_process_sensors: could not locate HPI " "data for temp sensor number %d.", temp_sensnum); continue; } ilo2_ribcl_process_temperaturesensor( oh_handler, &sens_allinfo, tsdata); } /* Processing of any future sensors will be inserted here */ } /* end ilo2_ribcl_process_sensors() */ /* This array maps the event states of ilo2_ribcl sensor severity states to * HPI event severity. */ static SaHpiSeverityT ir_state2crit[] = { /* I2R_INITIAL */ SAHPI_OK, /* I2R_OK */ SAHPI_OK, /* I2R_DEGRADED_FROM_OK */ SAHPI_MAJOR, /* I2R_DEGRADED_FROM_FAIL */ SAHPI_MAJOR, /* I2R_FAILED */ SAHPI_CRITICAL }; /* This array maps the event states of ilo2_ribcl sensor severity states to * the corresponding HPI sensor SAHPI_EC_SEVERITY event state value. */ static SaHpiEventStateT ir_state2ev_state[] = { /* I2R_INITIAL */ SAHPI_ES_OK, /* I2R_OK */ SAHPI_ES_OK, /* I2R_DEGRADED_FROM_OK */ SAHPI_ES_MAJOR_FROM_LESS, /* I2R_DEGRADED_FROM_FAIL */ SAHPI_ES_MAJOR_FROM_CRITICAL, /* I2R_FAILED */ SAHPI_ES_CRITICAL }; /** * ilo2_ribcl_process_severity_sensor: * @oh_handler: Pointer to the handler for this instance. * @sens_allinfo: Pointer to structure giving all HPI info for this sensor. * @ir_sens_dat: Pointer to iLo2 RIBCL data for this sensor. * * This routine is given the sensor data obtained from iLo2 via parameter * ir_sens_dat and converts that data into an HPI sensor value, an HPI * event state, and a HPI event severity. It also sends the appropriate sensor * de-assertion and assertion events, if required. The new sensor value is * then cached in the sensor data associated with the sensor RDR. * * The sensor viewed from iLo2 can be in one of the following states (given * in ir_sens_dat->state): * * I2R_NO_EXIST - The sensor has never been detected during discovery. * I2R_INITIAL - The sensor has never been processed. * I2R_OK - iLo2 reports the sensor status as "Ok". * I2R_DEGRADED_FROM_OK - iLo2 previously reported the sensor as "Ok", * but now reports the sensor as "Degraded". * I2R_DEGRADED_FROM_FAIL - iLo2 previously reported the sensor as * "Failed", but now reports the sensor as "Degraded". * I2R_FAILED - iLo2 reports the sensor as "Failed". This does not mean * the sensor itself has failed. It means a failure staus * of the health the sensor was monitoring. * * The iLo2 sensor state is mapped into the following HPI defined * SAHPI_EC_SEVERITY event states: * * SAHPI_ES_OK * SAHPI_ES_MAJOR_FROM_LESS * SAHPI_ES_MAJOR_FROM_CRITICAL * SAHPI_ES_CRITICAL * * A high level description of the algorithm used is: * * if( sensor is disabled){ * return; * } * if( sensor reading has not changed){ * return; * } * * Update the stored sensor value with the current sensor reading. * * Determine the new ribcl sensor state based on the new sensor reading * and the and the current iLo2 RIBCL sensor state. * * Determine the new HPI severity sensor SAHPI_EC_SEVERITY event state * from the iLo2 RIBCL sensor state. * * if( ( enables ok) && ( previously not in the initial state) ){ * Send de-assert event for the previous state. * } * * if( enables ok){ * Send assert event for the new state. * } * * Return values: * None **/ static void ilo2_ribcl_process_severitysensor( struct oh_handler_state *oh_handler, struct ilo2_ribcl_sens_allinfo *sens_allinfo, I2R_SensorDataT *ir_sens_dat) { struct ilo2_ribcl_sensinfo *sensinfo; I2R_SensorStateT old_ribcl_state; sensinfo = sens_allinfo->sens_dat; /* If the sensor is not enabled, we should not do anything */ if( sensinfo->sens_enabled != SAHPI_TRUE){ return; } /* If the sensor reading has not changed since we last examined it, * we have nothing further to do. However if we are just starting * up, we may want to send an event for our current value. */ if( (ir_sens_dat->reading.intval == sensinfo->sens_value) && (ir_sens_dat->state != I2R_INITIAL)){ return ; } old_ribcl_state = ir_sens_dat->state; /* Update our stored HPI sensor value with the current iLo2 RIBCL * sensor reading. */ sensinfo->sens_value = ir_sens_dat->reading.intval; /* Now, we determine the new iLo2 RIBCL sensor state based upon the * new sensor reading and the current iLo2 RIBCL sensor state. */ switch( ir_sens_dat->reading.intval){ case I2R_SEN_VAL_OK: ir_sens_dat->state = I2R_OK; break; case I2R_SEN_VAL_DEGRADED: if( ir_sens_dat->state == I2R_FAILED){ ir_sens_dat->state = I2R_DEGRADED_FROM_FAIL; } else { ir_sens_dat->state = I2R_DEGRADED_FROM_OK; } break; case I2R_SEN_VAL_FAILED: ir_sens_dat->state = I2R_FAILED; break; default: /* This should not be possible */ err("ilo2_ribcl_process_severitysensor: invalid value %d for sensor number %d.", ir_sens_dat->reading.intval, sensinfo->sens_num); break; } /* end switch(ir_sens_dat->reading.intval) */ /* Determine the new HPI sensor severity SAHPI_EC_SEVERITY event * state from our new iLo2 RIBCL sensor state. */ sensinfo->prev_sens_ev_state = sensinfo->sens_ev_state; sensinfo->sens_ev_state = ir_state2ev_state[ir_sens_dat->state]; /* Since the value has changed, we might have to send an event to * deassert the previous event state. If our previous ribcl state was * I2R_INITIAL, then there was no previous event state. Below, * sensinfo->event_sens_ev_state is the single state we will use * for the event. */ sensinfo->event_sens_ev_state = sensinfo->prev_sens_ev_state; if( (old_ribcl_state != I2R_INITIAL) && (sensinfo->sens_ev_enabled) && ( sensinfo->event_sens_ev_state & sensinfo->sens_deassertmask)){ ilo2_ribcl_sensor_send_event( oh_handler, sens_allinfo, SAHPI_ET_SENSOR, ir_state2crit[old_ribcl_state], SAHPI_FALSE); } /* Finally, we may have to send an event to assert the new event * state. */ if( (sensinfo->sens_ev_enabled) && ( sensinfo->sens_ev_state & sensinfo->sens_assertmask) ){ sensinfo->event_sens_ev_state = sensinfo->sens_ev_state; ilo2_ribcl_sensor_send_event( oh_handler, sens_allinfo, SAHPI_ET_SENSOR, ir_state2crit[ir_sens_dat->state], SAHPI_TRUE); } } /* end ilo2_ribcl_process_severitysensor() */ /** * ilo2_ribcl_process_temperaturesensor: * @oh_handler: Pointer to the handler for this instance. * @sens_allinfo: Pointer to structure giving all HPI info for this sensor. * @ir_tsdata: Pointer to iLo2 RIBCL data for temperature sensor. * * This routine is given the sensor data obtained from iLo2 via parameter * ir_tsdata and converts that data into an HPI sensor value. * * * A high level description of the algorithm used is: * * if( (sensor is disabled) || (sensor reading has not changed){ * return; * } * * Update the stored sensor value with the current sensor reading. * * Return values: * None **/ static void ilo2_ribcl_process_temperaturesensor( struct oh_handler_state *oh_handler, struct ilo2_ribcl_sens_allinfo *sens_allinfo, ir_tsdata_t *ir_tsdata) { struct ilo2_ribcl_sensinfo *sensinfo; sensinfo = (struct ilo2_ribcl_sensinfo *)sens_allinfo->ts_data; /* Either the sensor is disable or the sensor reading has not * changed; just return. */ if( (sensinfo->sens_enabled != SAHPI_TRUE) || (atoi(ir_tsdata->reading) == sensinfo->sens_value)){ return; } /* Update our stored HPI sensor value with the current iLo2 RIBCL * sensor reading, caution and critical value.*/ sensinfo->sens_value = atoi(ir_tsdata->reading); sensinfo->threshold.UpMajor.Value.SensorInt64 = atoi(ir_tsdata->cautionvalue); sensinfo->threshold.UpCritical.Value.SensorInt64 = atoi(ir_tsdata->criticalvalue); } /* end ilo2_ribcl_process_temperaturesensor () */ /** * ilo2_ribcl_init_sensor_data: * @ir_handler: Pointer to the private handler for this instance. * * Designed to be called at handler instance open time, this routine * initializes the sensor data structures in the instance's DiscoveryData. * * Chassis sensors: * For all sensors in the chassis_sensors[] array within this handler's * DiscoveryData structure, set the state field to I2R_NO_EXIST, and the * reading.intval element to I2R_SEN_VAL_UNINITIALIZED. * * Return values: * None **/ void ilo2_ribcl_init_sensor_data( ilo2_ribcl_handler_t *ir_handler) { int iter; for( iter = 0; iter < I2R_NUM_CHASSIS_SENSORS; iter++){ ir_handler->DiscoveryData.chassis_sensors[iter].state = I2R_NO_EXIST; ir_handler->DiscoveryData.chassis_sensors[iter].reading.intval = I2R_SEN_VAL_UNINITIALIZED; } } /* end ilo2_ribcl_init_sensor_data() */ /***************************** OpenHPI plug-in to iLO2 RIBCL plug-in ABI function mapping *****************************/ void * oh_get_sensor_reading (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiSensorReadingT *, SaHpiEventStateT *) __attribute__ ((weak, alias("ilo2_ribcl_get_sensor_reading"))); void * oh_get_sensor_enable (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT *) __attribute__ ((weak, alias("ilo2_ribcl_get_sensor_enable"))); void * oh_set_sensor_enable (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT ) __attribute__ ((weak, alias("ilo2_ribcl_set_sensor_enable"))); void * oh_get_sensor_event_enables (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT *) __attribute__ ((weak, alias("ilo2_ribcl_get_sensor_event_enable"))); void * oh_set_sensor_event_enables (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT ) __attribute__ ((weak, alias("ilo2_ribcl_set_sensor_event_enable"))); void * oh_get_sensor_event_masks (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiEventStateT *, SaHpiEventStateT *) __attribute__ ((weak, alias("ilo2_ribcl_get_sensor_event_masks"))); void * oh_set_sensor_event_masks (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiSensorEventMaskActionT, SaHpiEventStateT , SaHpiEventStateT ) __attribute__ ((weak, alias("ilo2_ribcl_set_sensor_event_masks"))); void * oh_get_sensor_thresholds (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiSensorThresholdsT *) __attribute__ ((weak, alias("ilo2_ribcl_get_sensor_thresholds"))); openhpi-3.6.1/plugins/ilo2_ribcl/ilo2_ribcl_power.c0000644000175100017510000003427612575647266021314 0ustar mohanmohan/* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Shuah Khan * Richard White */ /*************** * This source file contains Power HPI ABI routines iLO2 RIBCL plug-in * implements. Other source files provide support functionality for * these ABIs. ***************/ #include #include #include extern int signal_service_thread; /***************************n iLO2 RIBCL plug-in Power ABI Interface functions *****************************/ /** * ilo2_ribcl_get_power_state: * @hnd: Handler data pointer. * @rid: Resource ID. * @act: Location to store resource's power state. * * Retrieves a resource's power state. If the resource has * SAHPI_CAPABILITY_POWER, then finds the current power state from * iLO2 by sending a GET_HOST_POWER_STATUS RIBCL command to it. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_POWER. * SA_ERR_HPI_INVALID_RESOURCE - Resource doesn't exist. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT ilo2_ribcl_get_power_state(void *hnd, SaHpiResourceIdT rid, SaHpiPowerStateT *state) { struct oh_handler_state *handle; ilo2_ribcl_handler_t *ilo2_ribcl_handler = NULL; SaHpiRptEntryT *rpt; char *grs_cmd; char *response; /* command response buffer */ char *new_response = NULL; int ret; int power_status = -1; ilo2_ribcl_resource_info_t *res_info = NULL; if (!hnd || !state) { err("ilo2_ribcl_get_power_state(): Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } handle = (struct oh_handler_state *)hnd; ilo2_ribcl_handler = (ilo2_ribcl_handler_t *)handle->data; if (!ilo2_ribcl_handler) { err("ilo2_ribcl_get_power_state(): Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } /* Check if resource exists and has power capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_POWER)) { return(SA_ERR_HPI_CAPABILITY); } res_info = (ilo2_ribcl_resource_info_t *)oh_get_resource_data( handle->rptcache, rpt->ResourceId); if (!res_info) { err("ilo2_ribcl_get_power_state(): no resource info."); return(SA_ERR_HPI_INVALID_RESOURCE); } /* Allocate a temporary response buffer. */ response = malloc(ILO2_RIBCL_BUFFER_LEN); if( response == NULL){ err("ilo2_ribcl_get_power_state: failed to allocate resp buffer."); return( SA_ERR_HPI_OUT_OF_MEMORY); } /* Retrieve our customized command buffer */ grs_cmd = ilo2_ribcl_handler->ribcl_xml_cmd[IR_CMD_GET_HOST_POWER_STATUS]; if( grs_cmd == NULL){ err("ilo2_ribcl_get_power_state: null customized command."); free( response); return( SA_ERR_HPI_INTERNAL_ERROR); } /* Send the command to iLO2 and get the response. */ ret = ilo2_ribcl_ssl_send_command( ilo2_ribcl_handler, grs_cmd, response, ILO2_RIBCL_BUFFER_LEN); if( ret != 0){ err("ilo2_ribcl_get_power_state: command send failed."); free( response); return( SA_ERR_HPI_INTERNAL_ERROR); } switch(ilo2_ribcl_handler->ilo_type){ case ILO: case ILO2: /* Now, parse the response.*/ ret = ir_xml_parse_host_power_status(response, &power_status, ilo2_ribcl_handler->ilo2_hostport); break; case ILO3: case ILO4: new_response = ir_xml_decode_chunked(response); /* Now, parse the response.*/ ret = ir_xml_parse_host_power_status(new_response, &power_status, ilo2_ribcl_handler->ilo2_hostport); free( new_response); break; default: err("ilo2_ribcl_do_discovery():" "failed to detect ilo type."); } if( ret != RIBCL_SUCCESS){ err("ilo2_ribcl_get_power_state: response parse failed."); free( response); return( SA_ERR_HPI_INTERNAL_ERROR); } /* We're finished. Free up the temporary response buffer */ free( response); if(power_status == ILO2_RIBCL_POWER_ON) { *state = SAHPI_POWER_ON; res_info->power_cur_state = *state; } else if (power_status == ILO2_RIBCL_POWER_OFF) { *state = SAHPI_POWER_OFF; res_info->power_cur_state = *state; } else { return( SA_ERR_HPI_INTERNAL_ERROR); } return(SA_OK); } /** * ilo2_ribcl_set_power_state: * @hnd: Handler data pointer. * @rid: Resource ID. * @state: Resources's power state to set. * * Sets a resource's power state. * Retrieves a resource's power state. If the resource has * SAHPI_CAPABILITY_POWER, sends SET_HOST_POWER command to turn power on * or off based on the requtested power state. * If state == SAHPI_POWER_OFF, sends SET_HOST_POWER_OFF command to * turn power off. * If state == SAHPI_POWER_ON sends SET_HOST_POWER_ON command. * If state == SAHPI_POWER_CYCLE sends SET_HOST_POWER_OFF followed * by SET_HOST_POWER_ON command. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_POWER. * SA_ERR_HPI_INVALID_CMD - Resource doesn't support SAHPI_RESET_ASSERT. * SA_ERR_HPI_INVALID_RESOURCE - Resource doesn't exist. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL; @state invalid. **/ SaErrorT ilo2_ribcl_set_power_state(void *hnd, SaHpiResourceIdT rid, SaHpiPowerStateT state) { struct oh_handler_state *handle; ilo2_ribcl_handler_t *ilo2_ribcl_handler = NULL; SaHpiRptEntryT *rpt; char *sps_cmd; char *response; /* command response buffer */ char *new_response = NULL; int ret; ilo2_ribcl_resource_info_t *res_info = NULL; SaHpiPowerStateT temp_state; int polls = 0; if (!hnd || NULL == oh_lookup_powerstate(state)){ err("ilo2_ribcl_set_power_state(): Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } handle = (struct oh_handler_state *)hnd; ilo2_ribcl_handler = (ilo2_ribcl_handler_t *)handle->data; if (!ilo2_ribcl_handler) { err("ilo2_ribcl_set_power_state(): Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } /* Check if resource exists and has power capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_POWER)) { return(SA_ERR_HPI_CAPABILITY); } res_info = (ilo2_ribcl_resource_info_t *)oh_get_resource_data( handle->rptcache, rpt->ResourceId); if (!res_info) { err("ilo2_ribcl_get_power_state(): no resource info."); return(SA_ERR_HPI_INVALID_RESOURCE); } /* Note that we don't check our cached power state, since the resource * power state could have been changed via a local power button. */ /* Allocate a temporary response buffer. */ response = malloc(ILO2_RIBCL_BUFFER_LEN); if( response == NULL){ err("ilo2_ribcl_set_power_state: failed to allocate resp buffer."); return( SA_ERR_HPI_OUT_OF_MEMORY); } /* Retrieve our customized command buffer */ if(state == SAHPI_POWER_OFF) { sps_cmd = ilo2_ribcl_handler->ribcl_xml_cmd[IR_CMD_SET_HOST_POWER_OFF]; } else if(state == SAHPI_POWER_ON) { sps_cmd = ilo2_ribcl_handler->ribcl_xml_cmd[IR_CMD_SET_HOST_POWER_ON]; } else if(state == SAHPI_POWER_CYCLE) { /* first send power off command */ sps_cmd = ilo2_ribcl_handler->ribcl_xml_cmd[IR_CMD_SET_HOST_POWER_OFF]; } else { /* we should never get here as oh_lookup_powerstate() should have returned a null string back. */ err("ilo2_ribcl_set_power_state(): Invalid parameter."); free( response); return(SA_ERR_HPI_INVALID_PARAMS); } if( sps_cmd == NULL){ err("ilo2_ribcl_set_power_state: null customized command."); free( response); return( SA_ERR_HPI_INTERNAL_ERROR); } /* Send the command to iLO2 and get the response. */ ret = ilo2_ribcl_ssl_send_command( ilo2_ribcl_handler, sps_cmd, response, ILO2_RIBCL_BUFFER_LEN); if( ret != 0){ err("ilo2_ribcl_set_power_state: command send failed."); free( response); return( SA_ERR_HPI_INTERNAL_ERROR); } switch(ilo2_ribcl_handler->ilo_type){ case ILO: case ILO2: /* Now, parse the response. */ ret = ir_xml_parse_set_host_power(response, ilo2_ribcl_handler->ilo2_hostport); break; case ILO3: case ILO4: new_response = ir_xml_decode_chunked(response); /* Now, parse the response. */ ret = ir_xml_parse_set_host_power(new_response, ilo2_ribcl_handler->ilo2_hostport); free( new_response); break; default: err("ilo2_ribcl_do_discovery():" "failed to detect ilo type."); } if(ret == -1) { err("ilo2_ribcl_set_power_state: iLO2 returned error."); free( response); return( SA_ERR_HPI_INTERNAL_ERROR); } /* If the requested state is SAHPI_POWER_CYCLE, turn the power on */ if(state == SAHPI_POWER_CYCLE) { /* First, wait for the power to go off. An orderly shutdown * is being performed, so we might have to wait for * an OS running on that resource to fully shut down. * Unfortunately, the iLo2 will not queue the power commands. * If we send a "power on" command before the system actually * powers off, the "power on" command will be dropped, as the * iLo2 will detect that the system is already (still) on. */ temp_state = SAHPI_POWER_ON; for( polls=0; polls < ILO2_MAX_POWER_POLLS; polls++){ if( signal_service_thread == TRUE ) { dbg("ilo2_ribcl_handler is closed"); free( response); return(SA_OK); } ilo2_ribcl_get_power_state(hnd, rid, &temp_state); if(temp_state == SAHPI_POWER_OFF){ break; } /* iLo2 commands take around 10 seconds round trip, * so sleep for a while before retrying. */ sleep( ILO2_POWER_POLL_SLEEP_SECONDS); } /* end for polls */ if( polls == ILO2_MAX_POWER_POLLS){ err(" %s Failed to get to the power off state even " "after %d seconds", ilo2_ribcl_handler->ir_hostname, ILO2_MAX_POWER_POLLS*ILO2_POWER_POLL_SLEEP_SECONDS); free( response); return( SA_ERR_HPI_INVALID_STATE); } /* Power is off now. update res_info power status */ res_info->power_cur_state = SAHPI_POWER_OFF; /* Now, try sending the power on command */ sps_cmd = ilo2_ribcl_handler->ribcl_xml_cmd[IR_CMD_SET_HOST_POWER_ON]; if( sps_cmd == NULL){ err("ilo2_ribcl_set_power_state: null customized command."); free( response); return( SA_ERR_HPI_INTERNAL_ERROR); } /* Send the command to iLO2 and get the response. */ ret = ilo2_ribcl_ssl_send_command( ilo2_ribcl_handler, sps_cmd, response, ILO2_RIBCL_BUFFER_LEN); if( ret != 0){ err("ilo2_ribcl_set_power_state: command send failed."); free( response); return( SA_ERR_HPI_INTERNAL_ERROR); } switch(ilo2_ribcl_handler->ilo_type){ case ILO: case ILO2: /* Now, parse the response. */ ret = ir_xml_parse_set_host_power(response, ilo2_ribcl_handler->ilo2_hostport); break; case ILO3: case ILO4: new_response = ir_xml_decode_chunked(response); /* Now, parse the response. */ ret = ir_xml_parse_set_host_power(new_response, ilo2_ribcl_handler->ilo2_hostport); free( new_response); break; default: err("ilo2_ribcl_do_discovery():" "failed to detect ilo type."); } free( response); if(ret == -1) { err("ilo2_ribcl_set_power_state: iLO2 returned error."); return( SA_ERR_HPI_INTERNAL_ERROR); } /* Power is on, update res_info power status */ res_info->power_cur_state = SAHPI_POWER_ON; } else { /* Save current value in res_info */ for( polls=0; polls < ILO2_MAX_POWER_POLLS; polls++) { if( signal_service_thread == TRUE ) { dbg("ilo2_ribcl_handler is closed"); free( response); return(SA_OK); } ilo2_ribcl_get_power_state(hnd, rid, &temp_state); if(temp_state == state) { res_info->power_cur_state = state; return(SA_OK); } sleep( ILO2_POWER_POLL_SLEEP_SECONDS); } if( polls == ILO2_MAX_POWER_POLLS){ err(" %s Failed to get to the requested %s state even " "after %d seconds", ilo2_ribcl_handler->ir_hostname, state?"Power ON":"Power OFF", ILO2_MAX_POWER_POLLS*ILO2_POWER_POLL_SLEEP_SECONDS); free( response); return( SA_ERR_HPI_INVALID_STATE); } } return(SA_OK); } /***************************** OpenHPI plug-in to iLO2 RIBCL plug-in ABI function mapping *****************************/ void * oh_get_power_state (void *, SaHpiResourceIdT, SaHpiResetActionT *) __attribute__ ((weak, alias("ilo2_ribcl_get_power_state"))); void * oh_set_power_state (void *, SaHpiResourceIdT, SaHpiResetActionT) __attribute__ ((weak, alias("ilo2_ribcl_set_power_state"))); openhpi-3.6.1/plugins/ilo2_ribcl/ilo2_ribcl_discover.h0000644000175100017510000000447512575647266022001 0ustar mohanmohan/* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Shuah Khan * Richard White */ #ifndef _INC_ILO2_RIBCL_DISCOVER_H_ #define _INC_ILO2_RIBCL_DISCOVER_H_ extern void ilo2_ribcl_free_discoverydata( ilo2_ribcl_handler_t *); /* This define is the IANA-assigned private enterprise number for Hewlett-Packard. A complete list of IANA numbers can be found at http://www.iana.org/assignments/enterprise-numbers */ #define HP_MANUFACTURING_ID 11 /* Prototypes for functions within ilo2_ribcl_discovery.c that can be * called from within other modules */ extern void ilo2_ribcl_add_resource_capability( struct oh_handler_state *, struct oh_event *, SaHpiCapabilitiesT); #endif /* _INC_ILO2_RIBCL_DISCOVER_H_ */ openhpi-3.6.1/plugins/ilo2_ribcl/ilo2_ribcl_hotswap.h0000644000175100017510000000717612575647266021651 0ustar mohanmohan/* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Praveen Kumar praveen.kumar15@hp.com * Mohan Devarajulu mohan@fc.hp.com * */ #ifndef _INC_ILO2_RIBCL_HOTSWAP_H_ #define _INC_ILO2_RIBCL_HOTSWAP_H_ #include struct ilo2_ribcl_hotswap_state { SaHpiHsStateT currentHsState; }; SaErrorT ilo2_ribcl_get_hotswap_state(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiHsStateT *state); SaErrorT ilo2_ribcl_set_hotswap_state(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiHsStateT state); SaErrorT ilo2_ribcl_get_indicator_state(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiHsIndicatorStateT *state); SaErrorT ilo2_ribcl_set_indicator_state(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiHsIndicatorStateT state); SaErrorT ilo2_ribcl_request_hotswap_action(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiHsActionT action); SaErrorT ilo2_ribcl_hotswap_policy_cancel(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiTimeoutT timeout); SaErrorT ilo2_ribcl_get_autoinsert_timeout(void *oh_handler, SaHpiTimeoutT *timeout); SaErrorT ilo2_ribcl_set_autoinsert_timeout(void *oh_handler, SaHpiTimeoutT timeout); SaErrorT ilo2_ribcl_get_autoextract_timeout(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiTimeoutT *timeout); SaErrorT ilo2_ribcl_set_autoextract_timeout(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiTimeoutT timeout); #endif openhpi-3.6.1/plugins/ilo2_ribcl/ilo2_ribcl_hotswap.c0000644000175100017510000003601012575647266021631 0ustar mohanmohan/* * Copyright (C) 2007-2015, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Praveen Kumar praveen.kumar15@hp.com * Mohan Devarajulu mohan@fc.hp.com * * This file handles all the hotswap related event handling * * ilo2_ribcl_get_hotswap_state() - gets the hotswap state of the * resource * * ilo2_ribcl_set_hotswap_state() - sets the hotswap state of the * resource * * ilo2_ribcl_get_indicator_state() - gets the hotswap LED indicator * state of the resource * * ilo2_ribcl_set_indicator_state() - sets the hotswap LED indicator * state of the resource * * ilo2_ribcl_request_hotswap_action() - requests the hotswap action * * ilo2_ribcl_hotswap_policy_cancel() - requests hotswap policy cancel * * ilo2_ribcl_get_autoinsert_timeout() - gets the auto insert event * Timeout period * * ilo2_ribcl_set_autoinsert_timeout() - sets the auto insert event * Timeout period * * ilo2_ribcl_get_autoextract_timeout() - gets the auto extract event * Timeout period * * ilo2_ribcl_set_autoextract_timeout() - sets the auto extract event * Timeout period **/ #include "ilo2_ribcl_hotswap.h" /** * ilo2_ribcl_get_hotswap_state * @oh_handler: Pointer to openhpi handler structure * @resource_id: Resource id * @state: Hotswap state * * Purpose: * Gets the hotswap state of the resource * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INVALID_RESOURCE - on invalid resource id * SA_ERR_HPI_CAPABILITY - on not having hotswap capability * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT ilo2_ribcl_get_hotswap_state(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiHsStateT *state) { struct ilo2_ribcl_hotswap_state *hotswap_state = NULL; struct oh_handler_state *handler = NULL; SaHpiRptEntryT *rpt = NULL; if (oh_handler == NULL || state == NULL) { err("Invalid parameters"); return(SA_ERR_HPI_INVALID_PARAMS); } handler = (struct oh_handler_state *) oh_handler; rpt = oh_get_resource_by_id(handler->rptcache, resource_id); if (rpt == NULL) { err("failed to get rpt entry"); return SA_ERR_HPI_INVALID_RESOURCE; } if (! (rpt->ResourceCapabilities & SAHPI_CAPABILITY_FRU)) { err("Resource does not have FRU capability"); return SA_ERR_HPI_CAPABILITY; } /* For FAN, PS etc give the state based on ResouceFailed The standards changed to include all FRUs */ if (! (rpt->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP)) { if(!(rpt->ResourceFailed)) { *state = SAHPI_HS_STATE_ACTIVE; } else { *state = SAHPI_HS_STATE_INACTIVE; } } else { /* Get the hotswap structure of MANAGED_HOTSWAP */ hotswap_state = (struct ilo2_ribcl_hotswap_state *) oh_get_resource_data(handler->rptcache, resource_id); if (hotswap_state == NULL) { err("Unable to get the resource private data"); return SA_ERR_HPI_INVALID_RESOURCE; } *state = hotswap_state->currentHsState; } if ( *state == SAHPI_HS_STATE_NOT_PRESENT) { /* We can never have any resouce information in RPT with * NOT_PRESENT hotswap state Ideally, this code should never gets executed */ return SA_ERR_HPI_INVALID_RESOURCE; } return SA_OK; } /** * ilo2_ribcl_set_hotswap_state * @oh_handler: Pointer to openhpi handler structure * @resource_id: Resource id * @state: Hotswap state * * Purpose: * Sets the hotswap state of the resource * * Detailed Description: * Currently, the OA plug-in does not stay in the InsertionPending or * ExtractionPending states. Because of this, the ActiveSet() and * InactiveSet() will always be an invalid request, as per the HPI * specification. * * As it turns out, the current infrastructure code does not even call * this plug-in routine. However, if it's ever called, we need to be * returning the correct values. * * Return value: * SA_ERR_HPI_INVALID_REQUEST - We're not in one of the pending states **/ SaErrorT ilo2_ribcl_set_hotswap_state(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiHsStateT state) { return SA_ERR_HPI_INVALID_REQUEST; } /** * ilo2_ribcl_get_indicator_state * @oh_handler: Pointer to openhpi handler structure * @resource_id: Resource id * @state: Hotswap state * * Purpose: * Gets the hotswap LED indicator state of the resource * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INVALID_RESOURCE - on invalid resource id * SA_ERR_HPI_CAPABILITY - on not having hotswap capability * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT ilo2_ribcl_get_indicator_state(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiHsIndicatorStateT *state) { err("ilo2_ribcl_get_indicator_state not supported"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * ilo2_ribcl_set_indicator_state * @oh_handler: Pointer to openhpi handler structure * @resource_id: Resource id * @state: Hotswap state * * Purpose: * Sets the hotswap LED indicator state of the resource * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INVALID_RESOURCE - on invalid resource id * SA_ERR_HPI_CAPABILITY - on not having hotswap capability * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT ilo2_ribcl_set_indicator_state(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiHsIndicatorStateT state) { err("ilo2_ribcl_set_indicator_state not supported"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * ilo2_ribcl_request_hotswap_action * @oh_handler: Pointer to openhpi handler structure * @resource_id: Resource id * @action: Hotswap action * * Purpose: * Requests the hotswap action * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INVALID_RESOURCE - on invalid resource id * SA_ERR_HPI_CAPABILITY - on not having hotswap capability * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT ilo2_ribcl_request_hotswap_action(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiHsActionT action) { return SA_ERR_HPI_INVALID_REQUEST; } /** * ilo2_ribcl_hotswap_policy_cancel * @oh_handler: Pointer to openhpi handler structure * @resource_id: Resource id * @tm: Timeout value * * Purpose: * Requests hotswap policy cancel * * Detailed Description: * Currently, the OA plug-in does not stay in the InsertionPending or * ExtractionPending states. Because of this, the policy_cancel request * will always be an invalid request, as per the HPI specification. * * As it turns out, the current infrastructure code does not even call * this plug-in routine. However, if it's ever called, we need to be * returning the correct values. * * Return value: * SA_ERR_HPI_INVALID_REQUEST - We're not in one of the pending states **/ SaErrorT ilo2_ribcl_hotswap_policy_cancel(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiTimeoutT timeout) { return SA_ERR_HPI_INVALID_REQUEST; } /** * ilo2_ribcl_get_autoinsert_timeout: * @oh_handler: Handler data pointer. * @timeout: Timeout to set. * * Purpose: * Get hotswap autoinsert timeout. * * Detailed Description: NA * * Return values: * SA_OK - on success * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT ilo2_ribcl_get_autoinsert_timeout(void *oh_handler, SaHpiTimeoutT *timeout) { dbg("ilo2_ribcl_get_autoinsert_timeout is not supported"); dbg("Default auto insert timeout is IMMEDIATE and read only"); *timeout=SAHPI_TIMEOUT_IMMEDIATE; return SA_OK; } /** * ilo2_ribcl_set_autoinsert_timeout: * @oh_handler: Handler data pointer. * @timeout: Timeout to set. * * Purpose: * Set hotswap autoinsert timeout. * * Detailed Description: NA * * Return values: * SA_OK - on success * SA_ERR_HPI_READ_ONLY - auto-insert timeout is fixed * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT ilo2_ribcl_set_autoinsert_timeout(void *oh_handler, SaHpiTimeoutT timeout) { err("ilo2_ribcl_set_autoinsert_timeout setting timeout not supported"); err("Default auto insert timeout is IMMEDIATE and read only"); return SA_ERR_HPI_READ_ONLY; } /** * ilo2_ribcl_get_autoextract_timeout: * @oh_handler: Handler data pointer. * @resource_id: Resource ID. * @timeout: Timeout value. * * Purpose: * Get a resource's hotswap autoextract timeout. * * Detailed Description: NA * * Return values: * SA_OK - Normal case. * SAHPI_TIMEOUT_IMMEDIATE - autonomous handling is immediate * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT ilo2_ribcl_get_autoextract_timeout(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiTimeoutT *timeout) { dbg("ilo2_ribcl_get_autoextract_timeout is not supported"); dbg("Default auto extract timeout is IMMEDIATE and read only"); *timeout=SAHPI_TIMEOUT_IMMEDIATE; return SA_OK; } /** * ilo2_ribcl_set_autoextract_timeout: * @oh_handler: Handler data pointer. * @resource_id: Resource ID. * @timeout: Timeout to set. * * Purpose: * Set a resource hotswap autoextract timeout. * * Detailed Description: NA * * Return values: * SA_OK - on success * SA_ERR_HPI_READ_ONLY - auto-insert timeout is fixed * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT ilo2_ribcl_set_autoextract_timeout(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiTimeoutT timeout) { err("ilo2_ribcl_set_autoextract_timeout is not supported"); err("Default auto extract timeout is IMMEDIATE and read only"); return SA_ERR_HPI_READ_ONLY; } void * oh_get_hotswap_state (void *, SaHpiResourceIdT, SaHpiHsStateT *) __attribute__ ((weak, alias("ilo2_ribcl_get_hotswap_state"))); void * oh_set_hotswap_state (void *, SaHpiResourceIdT, SaHpiHsStateT) __attribute__ ((weak, alias("ilo2_ribcl_set_hotswap_state"))); void * oh_request_hotswap_action (void *, SaHpiResourceIdT, SaHpiHsActionT) __attribute__ ((weak, alias("ilo2_ribcl_request_hotswap_action"))); void * oh_hotswap_policy_cancel (void *, SaHpiResourceIdT, SaHpiTimeoutT) __attribute__ ((weak, alias("ilo2_ribcl_hotswap_policy_cancel"))); void * oh_get_indicator_state (void *, SaHpiResourceIdT, SaHpiHsIndicatorStateT *) __attribute__ ((weak, alias("ilo2_ribcl_get_indicator_state"))); void * oh_set_indicator_state (void *, SaHpiResourceIdT, SaHpiHsIndicatorStateT) __attribute__ ((weak, alias("ilo2_ribcl_set_indicator_state"))); void * oh_get_autoinsert_timeout (void *, SaHpiResourceIdT, SaHpiTimeoutT) __attribute__ ((weak, alias("ilo2_ribcl_get_autoinsert_timeout"))); void * oh_set_autoinsert_timeout (void *, SaHpiTimeoutT) __attribute__ ((weak, alias("ilo2_ribcl_set_autoinsert_timeout"))); void * oh_get_autoextract_timeout (void *, SaHpiResourceIdT, SaHpiTimeoutT *) __attribute__ ((weak, alias("ilo2_ribcl_get_autoextract_timeout"))); void * oh_set_autoextract_timeout (void *, SaHpiResourceIdT, SaHpiTimeoutT) __attribute__ ((weak, alias("ilo2_ribcl_set_autoextract_timeout"))); openhpi-3.6.1/plugins/ilo2_ribcl/ilo2_ribcl_idr.c0000644000175100017510000010544612575647266020734 0ustar mohanmohan/* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Shuah Khan * Richard White */ /*************** * This source file contains IDR HPI ABI routines iLO2 RIBCL plug-in * implements. Other source files provide support functionality for * these ABIs. ***************/ #include #include #include #include "sahpi_wrappers.h" /************************************ Forward declarations for static functions in this file ************************************/ static SaErrorT ilo2_ribcl_get_idr_allinfo_by_ep( struct oh_handler_state *, SaHpiEntityPathT *, SaHpiIdrIdT , struct ilo2_ribcl_idr_allinfo *); static SaErrorT ilo2_ribcl_get_idr_allinfo( struct oh_handler_state *, SaHpiResourceIdT, SaHpiIdrIdT, struct ilo2_ribcl_idr_allinfo *); static void ilo2_ribcl_field_catstring( I2R_FieldT *field, char *str); static int ilo2_ribcl_update_idr( struct ilo2_ribcl_idr_info *, struct ilo2_ribcl_idr_info *); /** * ilo2_ribcl_get_idr_info: * @hnd: Pointer to the handler for this instance. * @rid: Resource ID for resource containing this IDR. * @IdrId: IDR id number. * @IdrInfo: Pointer used to return IDR information. * * Description: * Implements the plugin specific part of the saHpiIdrInfoGet() API. * * We make a call to ilo2_ribcl_get_idr_allinfo() to obtain the inventory RDR, * the rpt entry for the resource containing the IDR, and the struct * ilo2_ribcl_idr_info that contains all our IDR data. * * All IDRs, Areas, and Fields are read-only in this plugin. * * Return values: * SA_OK - Normal, successful return. * SA_ERR_HPI_CAPABILITY - Resource does not support IDRs. * SA_ERR_HPI_INVALID_PARAMS - IdrInfo pointer or handler is NULL. * SA_ERR_HPI_NOT_PRESENT - The requested IDR is not present. * SA_ERR_HPI_INVALID_RESOURCE - The resource does not exist. * **/ SaErrorT ilo2_ribcl_get_idr_info(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT IdrId, SaHpiIdrInfoT *IdrInfo) { SaErrorT ret; struct oh_handler_state *oh_handler; struct ilo2_ribcl_idr_allinfo idr_allinfo; if( !hnd){ err(" ilo2_ribcl_get_idr_info: invalid handle."); return( SA_ERR_HPI_INVALID_PARAMS); } if( !IdrInfo){ err(" ilo2_ribcl_get_idr_info: invalid IDR info pointer."); return( SA_ERR_HPI_INVALID_PARAMS); } oh_handler = (struct oh_handler_state *)hnd; /* Look up our IDR RDR, and get the IDR information */ ret = ilo2_ribcl_get_idr_allinfo( oh_handler, rid, IdrId, &idr_allinfo); if( ret != SA_OK){ return( ret); } IdrInfo->IdrId = IdrId; IdrInfo->ReadOnly = SAHPI_TRUE; IdrInfo->NumAreas = idr_allinfo.idrinfo->num_areas; IdrInfo->UpdateCount = idr_allinfo.idrinfo->update_count; return( SA_OK); } /* end ilo2_ribcl_get_idr_info() */ /** * lo2_ribcl_get_idr_area_header: * @hnd: Pointer to the handler for this instance. * @rid: Resource ID for resource containing this IDR. * @IdrId: IDR id number. * @AreaType: Type of area to search for. * @AreaId: Id of area to search for. * @NextAreaId: Pointer to return Id of next area (if it exists) * @Header: Pointer to return area header data. * * Description: * Implements the plugin specific part of the saHpiIdrAreaHeaderGet() API. * * We make a call to ilo2_ribcl_get_idr_allinfo() to obtain the inventory RDR, * the rpt entry for the resource containing the IDR, and the struct * ilo2_ribcl_idr_info that contains all our IDR data. * * All IDRs, Areas, and Fields are read-only in this plugin. * * Currently, we only have one Area in all of our IDRs, but this code should * handle multiple Areas if we ever implement them. * * Return values: * SA_OK - Normal, successful return. * SA_ERR_HPI_CAPABILITY - Resource does not support IDRs. * SA_ERR_HPI_INVALID_PARAMS - Handler parameter is NULL. * - AreaId is an invalid reserved value. * - NextAreaId or Header parameters are NULL. * SA_ERR_HPI_NOT_PRESENT - The requested IDR is not present. * - AreaType is SAHPI_IDR_AREATYPE_UNSPECIFIED and * the area specified by AreaId does not exist. * - AreaType and AreaId are both set, but a matching * area cannot be found. * SA_ERR_HPI_INVALID_RESOURCE - The resource does not exist. **/ SaErrorT ilo2_ribcl_get_idr_area_header(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT IdrId, SaHpiIdrAreaTypeT AreaType, SaHpiEntryIdT AreaId, SaHpiEntryIdT *NextAreaId, SaHpiIdrAreaHeaderT *Header) { SaErrorT ret; int adx; struct oh_handler_state *oh_handler; struct ilo2_ribcl_idr_allinfo idr_allinfo; struct ilo2_ribcl_idr_info *idrinfo; I2R_AreaT *ir_area; SaHpiBoolT area_found = SAHPI_FALSE; /* Note: AreaType, AreaId, NextAreaId, and Header are checked * for spec compliance in our caller (saHpiIdrAreaHeaderGet) */ if( !hnd || !NextAreaId || !Header){ err(" ilo2_ribcl_get_idr_area_header: invalid pointer."); return( SA_ERR_HPI_INVALID_PARAMS); } oh_handler = (struct oh_handler_state *)hnd; /* Look up our IDR RDR, and get the IDR information */ ret = ilo2_ribcl_get_idr_allinfo( oh_handler, rid, IdrId, &idr_allinfo); if( ret != SA_OK){ return( ret); } /* Note that HPI AreaId values begin with one, but our data structures * begin at zero, so we need to translate the AreaId parameter. */ if( AreaId == SAHPI_FIRST_ENTRY){ AreaId = 0; } else { AreaId--; } idrinfo = idr_allinfo.idrinfo; ret = SA_ERR_HPI_NOT_PRESENT; for( adx = 0; adx < idrinfo->num_areas; adx++){ ir_area = &(idrinfo->idr_areas[adx]); if( (AreaType == ir_area->area_type) || (AreaType == SAHPI_IDR_AREATYPE_UNSPECIFIED) ){ if( AreaId == adx){ /* we have a match */ Header->AreaId = adx+1; Header->Type = ir_area->area_type; Header->ReadOnly = SAHPI_TRUE; Header->NumFields = ir_area->num_fields; area_found = SAHPI_TRUE; ret = SA_OK; *NextAreaId = SAHPI_LAST_ENTRY; } else { if( area_found){ /* Now, we have found the next match */ if( adx < idrinfo->num_areas){ *NextAreaId = adx+1; break; } } } } } /* end for adx */ return( ret); } /* end ilo2_ribcl_get_idr_area_header() */ /** * ilo2_ribcl_get_idr_field: * @hnd: Pointer to the handler for this instance. * @rid: Resource ID for resource containing this IDR. * @IdrId: IDR id number. * @AreaId: Id of area to search for. * @FieldType: Type of field to search for. * @FieldId: Id of field to search for. * @NextFieldId: Pointer to return Id of next area (if it exists) * @Field: Pointer to return field data. * * Description: * Implements the plugin specific part of the saHpiIdrFieldGet() API. * * We make a call to ilo2_ribcl_get_idr_allinfo() to obtain the inventory RDR, * the rpt entry for the resource containing the IDR, and the struct * ilo2_ribcl_idr_info that contains all our IDR data. * * All IDRs, Areas, and Fields are read-only in this plugin. * * Return values: * SA_OK - Normal, successful return. * SA_ERR_HPI_CAPABILITY - Resource does not support IDRs. * SA_ERR_HPI_INVALID_PARAMS - Handler parameter is NULL. * - AreaId or FieldId is an invalid reserved value. * - NextField or Field parameters are NULL. * SA_ERR_HPI_NOT_PRESENT - The requested IDR is not present. * - Area identified by AreaId is not present. * - FieldType is SAHPI_IDR_FIELDTYPE_UNSPECIFIED and * the field specified by FieldId does not exist. * - FieldType and FieldId are both set, but a matching * field can not be found. * SA_ERR_HPI_INVALID_RESOURCE - The resource does not exist. * **/ SaErrorT ilo2_ribcl_get_idr_field(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT IdrId, SaHpiEntryIdT AreaId, SaHpiIdrFieldTypeT FieldType, SaHpiEntryIdT FieldId, SaHpiEntryIdT *NextFieldId, SaHpiIdrFieldT *Field) { SaErrorT ret; int fdx; SaHpiEntryIdT match_id; struct oh_handler_state *oh_handler; struct ilo2_ribcl_idr_allinfo idr_allinfo; struct ilo2_ribcl_idr_info *idrinfo; I2R_AreaT *ir_area; I2R_FieldT *ir_field; SaHpiBoolT field_found = SAHPI_FALSE; /* Note: FieldType, AreaId, FieldId, NextFieldId, and Field are checked * for spec compliance in our caller (saHpiIdrFieldGet) */ if( !hnd || !NextFieldId || !Field){ err(" ilo2_ribcl_get_idr_field: invalid pointer parameter."); return( SA_ERR_HPI_INVALID_PARAMS); } oh_handler = (struct oh_handler_state *)hnd; /* Look up our IDR RDR, and get the IDR information */ ret = ilo2_ribcl_get_idr_allinfo( oh_handler, rid, IdrId, &idr_allinfo); if( ret != SA_OK){ return( ret); } /* Note that HPI AreaId and FieldId values begin with one, * but our data structures begin at zero, so we need to translate the * AreaId and FieldId parameters. */ if( AreaId == SAHPI_FIRST_ENTRY){ AreaId = 0; } else { AreaId--; } if( FieldId == SAHPI_FIRST_ENTRY){ match_id = 0; } else { match_id = FieldId -1; } idrinfo = idr_allinfo.idrinfo; ret = SA_ERR_HPI_NOT_PRESENT; /* Find the correct area */ if( AreaId >= idrinfo->num_areas){ /* AreaId is too large */ return( SA_ERR_HPI_NOT_PRESENT); } ir_area = &(idrinfo->idr_areas[AreaId]); /* Now, search for the matching field */ for( fdx = 0; fdx < ir_area->num_fields; fdx++){ ir_field = &(ir_area->area_fields[fdx]); if( (FieldType == ir_field->field_type) || (FieldType == SAHPI_IDR_FIELDTYPE_UNSPECIFIED) ){ if( field_found){ /* Now, we have found the next match */ if( fdx < ir_area->num_fields){ *NextFieldId = fdx+1; break; } } else if( (match_id == fdx) || (FieldId == SAHPI_FIRST_ENTRY)){ /* we have found the matching entry */ Field->AreaId = AreaId+1; Field->FieldId = fdx+1; Field->Type = ir_field->field_type; Field->ReadOnly = SAHPI_TRUE; oh_init_textbuffer(&(Field->Field)); oh_append_textbuffer(&(Field->Field), ir_field->field_string); field_found = SAHPI_TRUE; ret = SA_OK; *NextFieldId = SAHPI_LAST_ENTRY; } } /* end if FieldType matched */ } /* end for fdx */ return( ret); } /* end ilo2_ribcl_get_idr_field() */ /** * ilo2_ribcl_add_idr_area: * @hnd: Pointer to handler's data * @ResourceId: Resource identifier for this operation * @IdrId: Identifier for the Inventory Data Repository * @AreaType: Type of Inventory Data Area * @AreaId: Pointer to store the identifier of the newly allocated * Inventory Area * * This function is not suported/implemented for the ilo2_ribcl plugin. * All IDRs, Areas, and Fields are read-only in this plugin. * * Return value: * SA_ERR_HPI_READ_ONLY - Normal - ilo2_ribcl only supports "read only" IDRs. **/ SaErrorT ilo2_ribcl_add_idr_area( void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, SaHpiIdrAreaTypeT AreaType, SaHpiEntryIdT *AreaId) { return SA_ERR_HPI_READ_ONLY; } /** * ilo2_ribcl_del_idr_area: * @hnd: Pointer to handler's data * @ResourceId: Resource identifier for this operation * @IdrId: Identifier for the Inventory Data Repository * @AreaId: Identifier of Area entry to delete from the IDR * * This function is not suported/implemented for the ilo2_ribcl plugin. * All IDRs, Areas, and Fields are read-only in this plugin. * * Return value: * SA_ERR_HPI_READ_ONLY - Normal - ilo2_ribcl only supports "read only" IDRs. **/ SaErrorT ilo2_ribcl_del_idr_area( void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, SaHpiEntryIdT AreaId) { return SA_ERR_HPI_READ_ONLY; } /** * ilo2_ribcl_add_idr_field: * @hnd: Pointer to handler's data * @ResourceId: Resource identifier for this operation * @IdrId: Identifier for the Inventory Data Repository * @Field: Pointer to Inventory Data Field which contains field * information to be added. * * This function is not suported/implemented for the ilo2_ribcl plugin. * All IDRs, Areas, and Fields are read-only in this plugin. * * Return value: * SA_ERR_HPI_READ_ONLY - Normal - ilo2_ribcl only supports "read only" IDRs. **/ SaErrorT ilo2_ribcl_add_idr_field( void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, SaHpiIdrFieldT *Field) { return SA_ERR_HPI_READ_ONLY; } /** * ilo2_ribcl_set_idr_field: * @hnd: Pointer to handler's data * @ResourceId: Resource identifier for this operation * @IdrId: Identifier for the Inventory Data Repository * @Field: Pointer to Inventory Data Field which contains field * information to be updated. * * This function is not suported/implemented for the ilo2_ribcl plugin. * All IDRs, Areas, and Fields are read-only in this plugin. * * Return value: * SA_ERR_HPI_READ_ONLY - Normal - ilo2_ribcl only supports "read only" IDRs. **/ SaErrorT ilo2_ribcl_set_idr_field( void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, SaHpiIdrFieldT *Field) { return SA_ERR_HPI_READ_ONLY; } /** * ilo2_ribcl_del_idr_field: * @hnd: Pointer to handler's data * @ResourceId: Resource identifier for this operation * @IdrId: Identifier for the Inventory Data Repository * @AreaId: Identifier of Inventory Area whose field is to bo deleted * @FieldId: Identifier of field to be deleted * * This function is not suported/implemented for the ilo2_ribcl plugin. * All IDRs, Areas, and Fields are read-only in this plugin. * * Return value: * SA_ERR_HPI_READ_ONLY - Normal - ilo2_ribcl only supports "read only" IDRs. **/ SaErrorT ilo2_ribcl_del_idr_field( void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, SaHpiEntryIdT AreaId, SaHpiEntryIdT FieldId) { return SA_ERR_HPI_READ_ONLY; } /** * ilo2_ribcl_add_idr: * @oh_handler: Pointer to the handler for this instance. * @event: Pointer to event structure for this resource's add event. * @idrid: Index of this IDR. * @new_idr: Pointer to structure containing all initial IDR data. * @description: String describing the resource containing this IDR. * * This routine will create a new inventory RDR, associated with the IDR * contents passed via parameter new_idr. The information is copied from * new_idr, so the caller is free to free or change the information later. * * The new inventory RDR will be added to the resource contained within the * 'event' parameter. The following inventory RDR elements will be at these * fixed values: * IsFru = SAHPI_FALSE * InventoryRec.Persistent = SAHPI_FALSE * * The IdString for the new IDR will be constructed by appending the string * " Inventory" to the string passed in parameter 'description'. * * Return values: * SA_OK - Normal, successful return. * SA_ERR_HPI_OUT_OF_MEMORY - Memory allocation failed. * SA_ERR_HPI_INTERNAL_ERROR - could not add inventory RDR **/ SaErrorT ilo2_ribcl_add_idr( struct oh_handler_state *oh_handler, struct oh_event *event, SaHpiIdrIdT idrid, struct ilo2_ribcl_idr_info *new_idr, char *description) { SaErrorT ret = SA_OK; SaHpiRdrT *rdr; struct ilo2_ribcl_idr_info *idr; rdr = (SaHpiRdrT *)g_malloc0(sizeof(SaHpiRdrT)); if( rdr == NULL){ err("ilo2_ribcl_add_idr: Memory allocation failed."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* fill in generic RDR stuff */ rdr->RdrType = SAHPI_INVENTORY_RDR; rdr->Entity = event->resource.ResourceEntity; rdr->IsFru = SAHPI_FALSE; oh_init_textbuffer(&(rdr->IdString)); oh_append_textbuffer(&(rdr->IdString), description); oh_append_textbuffer(&(rdr->IdString), " Inventory"); /* Fill in the IDR sepcific stuff */ rdr->RdrTypeUnion.InventoryRec.IdrId = idrid; rdr->RdrTypeUnion.InventoryRec.Persistent = SAHPI_FALSE; /* Copy the IDR information into a new allocation to be associated * with this RDR */ idr = g_memdup(new_idr, sizeof(struct ilo2_ribcl_idr_info)); if( idr == NULL){ wrap_g_free( rdr); err("ilo2_ribcl_add_idr: Memory allocation failed."); return(SA_ERR_HPI_OUT_OF_MEMORY); } ret = oh_add_rdr(oh_handler->rptcache, event->resource.ResourceId, rdr, idr, 0); if( ret != SA_OK){ err("ilo2_ribcl_add_idr: could not add RDR. Error = %s.", oh_lookup_error(ret)); wrap_g_free( idr); wrap_g_free( rdr); return( SA_ERR_HPI_INTERNAL_ERROR); } else { event->rdrs = g_slist_append(event->rdrs, rdr); } ilo2_ribcl_add_resource_capability( oh_handler, event, (SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_INVENTORY_DATA)); return( SA_OK); } /* end ilo2_ribcl_add_idr() */ /** * ilo2_ribcl_discover_chassis_idr: * @oh_handler: Pointer to the handler for this instance. * @chassis_ep: Entity path for the chassis. * * This routine builds the IDR for the system chassis, and adds an inventory * RDR to the chassis resource associated with that IDR. * * Return values: * None **/ void ilo2_ribcl_discover_chassis_idr( struct oh_handler_state *oh_handler, struct oh_event *event, char *description) { ilo2_ribcl_handler_t *ir_handler = NULL; ir_handler = (ilo2_ribcl_handler_t *) oh_handler->data; /* Use the temporary ilo2_ribcl_idr_info structure in our * private handler to collect the IDR information. We use * this buffer in the handler because it's too large to put * on the stack as a local valiable, and we don't want to be * allocating/deallocating it frequently. */ ilo2_ribcl_build_chassis_idr( ir_handler, &(ir_handler->tmp_idr)); if( ilo2_ribcl_add_idr( oh_handler, event, SAHPI_DEFAULT_INVENTORY_ID, &(ir_handler->tmp_idr), description) != SA_OK){ err("ilo2_ribcl_discover_chassis_idr: could not add IDR for chassis."); return; } ilo2_ribcl_add_resource_capability( oh_handler, event, (SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_INVENTORY_DATA)); } /* end ilo2_ribcl_discover_chassis_idr() */ /** * ilo2_ribcl_update_chassis_idr: * @oh_handler: Pointer to the handler for this instance. * @chassis_ep: Entity path for the chassis. * * This routine updates the information in the system chassis IDR with * any differing information obtained during a discovery operation. * * We make a call to ilo2_ribcl_get_idr_allinfo_by_ep() to obtain the * inventory RDR, the rpt entry for the resource containing the IDR, and * the struct ilo2_ribcl_idr_info that contains all our IDR data. * * Return values: * None **/ void ilo2_ribcl_update_chassis_idr( struct oh_handler_state *oh_handler, SaHpiEntityPathT *ep_root) { struct ilo2_ribcl_idr_allinfo idr_allinfo; ilo2_ribcl_handler_t *ir_handler; ir_handler = (ilo2_ribcl_handler_t *)oh_handler->data; /* Look up our chassis IDR. */ if( ilo2_ribcl_get_idr_allinfo_by_ep( oh_handler, ep_root, SAHPI_DEFAULT_INVENTORY_ID, &idr_allinfo) != SA_OK){ err("ilo2_ribcl_update_chassis_idr: unable to locate chassis IDR."); return; } ilo2_ribcl_build_chassis_idr( ir_handler, &(ir_handler->tmp_idr)); ilo2_ribcl_update_idr( &(ir_handler->tmp_idr), idr_allinfo.idrinfo); } /* ilo2_ribcl_update_chassis_idr() */ /** * ilo2_ribcl_update_fru_idr: * @oh_handler: Pointer to the handler for this instance. * @fru_ep: Entity path for the fru resource. * @idr_info: (Potentially) updated information for the resource IDR. * * This routine updates the information in an IDR of a FRU with any differing * information obtained during a discovery operation. * * We make a call to ilo2_ribcl_get_idr_allinfo_by_ep() to obtain the * inventory RDR, the rpt entry for the resource containing the IDR, and * the struct ilo2_ribcl_idr_info that contains all our IDR data. * * Return values: * None **/ void ilo2_ribcl_update_fru_idr( struct oh_handler_state *oh_handler, SaHpiEntityPathT *fru_ep, struct ilo2_ribcl_idr_info * idr_info) { struct ilo2_ribcl_idr_allinfo idr_allinfo; /* First, find the IDR for this resource, using the entity path */ if( ilo2_ribcl_get_idr_allinfo_by_ep( oh_handler, fru_ep, SAHPI_DEFAULT_INVENTORY_ID, &idr_allinfo) != SA_OK){ err("ilo2_ribcl_update_fru_idr: unable to locate IDR for FRU."); return; } ilo2_ribcl_update_idr( idr_info, idr_allinfo.idrinfo); } /* end ilo2_ribcl_update_fru_idr() */ /** * ilo2_ribcl_get_idr_allinfo_by_ep: * @oh_handler: Pointer to the handler for this instance. * @ep: Entity path for resource containing this IDR. * @irid: Index of this IDR. * @idr_allinfo: Pointer to structure used to return other pointers. * * This is a support routine used within our plugin. It returns a pointer to * the inventory RDR, a pointer to the rpt entry for the resource containing * the IDR, and a pointer to the struct ilo2_ribcl_idr_info that is associated * with the inventory RDR. These pointers are returned via the idr_allinfo * parameter, which should point to a struct ilo2_ribcl_idr_allinfo that has * been allocated by our caller. * * Return values: * SA_OK - Normal, successful return. * SA_ERR_HPI_INVALID_RESOURCE - Could not locate rpt entry. * SA_ERR_HPI_CAPABILITY - Resource does not have inventory capability. * SA_ERR_HPI_INTERNAL_ERROR - No IDR data exists in the RDR. * SA_ERR_HPI_NOT_PRESENT - The requested IDR can not be found. * **/ static SaErrorT ilo2_ribcl_get_idr_allinfo_by_ep( struct oh_handler_state *oh_handler, SaHpiEntityPathT *ep, SaHpiIdrIdT irid, struct ilo2_ribcl_idr_allinfo *idr_allinfo) { SaHpiResourceIdT rid; idr_allinfo->rpt = NULL; idr_allinfo->rdr = NULL; idr_allinfo->idrinfo = NULL; /* Check that the resource exists, and that it has IDR capability */ idr_allinfo->rpt = oh_get_resource_by_ep(oh_handler->rptcache, ep); if( !idr_allinfo->rpt){ err("ilo2_ribcl_get_idr_allinfo_by_ep: no rpt entry."); return( SA_ERR_HPI_INVALID_RESOURCE); } rid = idr_allinfo->rpt->ResourceId; if( !(idr_allinfo->rpt->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)){ err("ilo2_ribcl_get_idr_allinfo_by_ep: no inventory capability for resource id %d.", rid); return( SA_ERR_HPI_CAPABILITY); } /* Get the RDR for the inventory */ idr_allinfo->rdr = oh_get_rdr_by_type(oh_handler->rptcache, rid, SAHPI_INVENTORY_RDR, irid); if( idr_allinfo->rdr == NULL){ err("ilo2_ribcl_get_idr_allinfo_by_ep: no inventory RDR for resource id %d, IDR %d.", rid, irid); return( SA_ERR_HPI_NOT_PRESENT); } /* Finally, get the assoicated data for this IDR */ idr_allinfo->idrinfo = (struct ilo2_ribcl_idr_info *)oh_get_rdr_data( oh_handler->rptcache, rid, idr_allinfo->rdr->RecordId); if( idr_allinfo->idrinfo == NULL){ err("ilo2_ribcl_get_idr_allinfo_by_ep: no inventory data found for resource id %d, IDR %d, label %s.", rid, irid, idr_allinfo->rdr->IdString.Data); return( SA_ERR_HPI_INTERNAL_ERROR); } return( SA_OK); } /* end ilo2_ribcl_get_idr_allinfo_by_ep() */ /** * ilo2_ribcl_get_idr_allinfo: * @oh_handler: Pointer to the handler for this instance. * @rid: Resource ID for resource containing this IDR. * @irid: Index of this IDR. * @idr_allinfo: Pointer to structure used to return other pointers. * * This is a support routine used within our plugin. It returns a pointer to * the inventory RDR, a pointer to the rpt entry for the resource containing * the IDR, and a pointer to the struct ilo2_ribcl_idr_info that is associated * with the inventory RDR. These pointers are returned via the idr_allinfo * parameter, which should point to a struct ilo2_ribcl_idr_allinfo that has * been allocated by our caller. * * This routine is similar to ilo2_ribcl_get_idr_allinfo_by_ep(), however here * we search by resource ID rather than by entity path. * * Return values: * SA_OK - Normal, successful return. * SA_ERR_HPI_INVALID_RESOURCE - Could not locate rpt entry. * SA_ERR_HPI_CAPABILITY - Resource does not have inventory capability. * SA_ERR_HPI_INTERNAL_ERROR - No IDR data exists in the RDR. * SA_ERR_HPI_NOT_PRESENT - The requested IDR can not be found. **/ static SaErrorT ilo2_ribcl_get_idr_allinfo( struct oh_handler_state *oh_handler, SaHpiResourceIdT rid, SaHpiIdrIdT irid, struct ilo2_ribcl_idr_allinfo *idr_allinfo) { idr_allinfo->rpt = NULL; idr_allinfo->rdr = NULL; idr_allinfo->idrinfo = NULL; /* Check that the resource exists, and that it has IDR capability */ idr_allinfo->rpt = oh_get_resource_by_id(oh_handler->rptcache, rid); if( !idr_allinfo->rpt){ err("ilo2_ribcl_get_idr_allinfo: no rpt entry for resource id %d.", rid); return( SA_ERR_HPI_INVALID_RESOURCE); } if( !(idr_allinfo->rpt->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)){ err("ilo2_ribcl_get_idr_allinfo: no inventory capability for resource id %d.", rid); return( SA_ERR_HPI_CAPABILITY); } /* Get the RDR for the inventory */ idr_allinfo->rdr = oh_get_rdr_by_type(oh_handler->rptcache, rid, SAHPI_INVENTORY_RDR, irid); if( idr_allinfo->rdr == NULL){ err("ilo2_ribcl_get_idr_allinfo: no inventory RDR for resource id %d, IDR %d.", rid, irid); return( SA_ERR_HPI_NOT_PRESENT); } /* Finally, get the assoicated data for this IDR */ idr_allinfo->idrinfo = (struct ilo2_ribcl_idr_info *)oh_get_rdr_data( oh_handler->rptcache, rid, idr_allinfo->rdr->RecordId); if( idr_allinfo->idrinfo == NULL){ err("ilo2_ribcl_get_idr_allinfo: no inventory data found for resource id %d, IDR %d, label %s.", rid, irid, idr_allinfo->rdr->IdString.Data); return( SA_ERR_HPI_INTERNAL_ERROR); } return( SA_OK); } /* end ilo2_ribcl_get_idr_allinfo() */ /** * ilo2_ribcl_field_catstring: * @field: Pointer to I2R_FieldT whoose string should be modified. * @str: String to concat to the field string. * * Concats the string str onto the end of the fieldstring of the field * specified by the "field" parameter. If str is null, the string * "Unknown" will be added instead. The total length of the field string * will be limited to I2R_MAX_FIELDCHARS characters. * * Return values: * None **/ static void ilo2_ribcl_field_catstring( I2R_FieldT *field, char *str) { char *tmpstr; int exist_len; exist_len = strlen( field->field_string) +1; /* account for the null */ if( str){ tmpstr = str; } else { tmpstr = "Unknown"; } strncat( field->field_string, tmpstr, (I2R_MAX_FIELDCHARS - exist_len)); } /** * ilo2_ribcl_build_chassis_idr: * @ir_handler: Pointer to plugin private handler. * @idr_info: Pointer to structure that receives the IDR data/ * * This routine reads information obtained during the prevoius discovery * operation, and fills in the IDR for a the system chassis. The idr_info * parameter must point to a struct ilo2_ribcl_idr_info that has been * allocated by our caller. * * The system chassis IDR has one Area of type SAHPI_IDR_AREATYPE_CHASSIS_INFO, * containing the following four fields: * Field 1: SAHPI_IDR_FIELDTYPE_PRODUCT_NAME "" * Field 2: SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER "" * Field 3: SAHPI_IDR_FIELDTYPE_MANUFACTURER "Hewlett Packard" * Field 4: SAHPI_IDR_FIELDTYPE_CUSTOM "iLO_Firmware: " * * Return values: * None **/ void ilo2_ribcl_build_chassis_idr( ilo2_ribcl_handler_t *ir_handler, struct ilo2_ribcl_idr_info *idr_info) { I2R_FieldT *field; ilo2_ribcl_DiscoveryData_t *ddata; memset( idr_info, 0, sizeof( struct ilo2_ribcl_idr_info)); ddata = &(ir_handler->DiscoveryData); idr_info->num_areas = 1; idr_info->idr_areas[0].area_type = SAHPI_IDR_AREATYPE_CHASSIS_INFO; idr_info->idr_areas[0].num_fields = 4; field = &(idr_info->idr_areas[0].area_fields[I2R_CHASSIS_IF_PRODNAME]); field->field_type = SAHPI_IDR_FIELDTYPE_PRODUCT_NAME; ilo2_ribcl_field_catstring( field, ddata->product_name); field = &(idr_info->idr_areas[0].area_fields[I2R_CHASSIS_IF_SERNUM]); field->field_type = SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER; ilo2_ribcl_field_catstring( field, ddata->serial_number); field = &(idr_info->idr_areas[0].area_fields[I2R_CHASSIS_IF_MANUFACT]); field->field_type = SAHPI_IDR_FIELDTYPE_MANUFACTURER; ilo2_ribcl_field_catstring( field, "Hewlett Packard"); field = &(idr_info->idr_areas[0].area_fields[I2R_CHASSIS_IF_ILO2VERS]); field->field_type = SAHPI_IDR_FIELDTYPE_CUSTOM; ilo2_ribcl_field_catstring( field, "iLO_Firmware: "); ilo2_ribcl_field_catstring( field, ddata->fwdata.version_string); } /* end ilo2_ribcl_build_chassis_idr() */ /** * ilo2_ribcl_build_cpu_idr: * @ir_handler: Pointer to plugin private handler. * @idr_info: Pointer to structure that receives the IDR data/ * * This routine reads information obtained during the prevoius discovery * operation, and fills in the IDR for a system processor. The idr_info * parameter must point to a struct ilo2_ribcl_idr_info that has been * allocated by our caller. * * The cpu IDR has one Area of type SAHPI_IDR_AREATYPE_BOARD_INFO, * containing the following field: * Field 1: SAHPI_IDR_FIELDTYPE_CUSTOM "Speed: " * * Return values: * None **/ void ilo2_ribcl_build_cpu_idr(ilo2_ribcl_handler_t *ir_handler, struct ilo2_ribcl_idr_info *idr_info) { I2R_FieldT *field; memset( idr_info, 0, sizeof( struct ilo2_ribcl_idr_info)); idr_info->num_areas = 1; idr_info->idr_areas[0].area_type = SAHPI_IDR_AREATYPE_BOARD_INFO; idr_info->idr_areas[0].num_fields = 1; field = &(idr_info->idr_areas[0].area_fields[I2R_CPU_IF_SPEED]); field->field_type = SAHPI_IDR_FIELDTYPE_CUSTOM; ilo2_ribcl_field_catstring( field, "Speed: "); ilo2_ribcl_field_catstring( field, ir_handler->DiscoveryData.system_cpu_speed); } /* end ilo2_ribcl_build_cpu_idr() */ /** * ilo2_ribcl_build_memory_idr: * @mem_data: Pointer to ir_memdata_t info in DiscoveryData * @idr_info: Pointer to structure that receives the IDR data/ * * This routine reads information obtained during the prevoius discovery * operation, and fills in the IDR for a memory DIMM. The idr_info * parameter must point to a struct ilo2_ribcl_idr_info that has been * allocated by our caller. * * The memory IDR has one Area of type SAHPI_IDR_AREATYPE_BOARD_INFO, * containing the following two fields: * Field 1: SAHPI_IDR_FIELDTYPE_CUSTOM "Size: " * Field 2: SAHPI_IDR_FIELDTYPE_CUSTOM "Speed: " * * Return values: * None **/ void ilo2_ribcl_build_memory_idr( ir_memdata_t *mem_data, struct ilo2_ribcl_idr_info *idr_info) { I2R_FieldT *field; memset( idr_info, 0, sizeof( struct ilo2_ribcl_idr_info)); idr_info->num_areas = 1; idr_info->idr_areas[0].area_type = SAHPI_IDR_AREATYPE_BOARD_INFO; idr_info->idr_areas[0].num_fields = 2; field = &(idr_info->idr_areas[0].area_fields[I2R_MEM_IF_SIZE]); field->field_type = SAHPI_IDR_FIELDTYPE_CUSTOM; ilo2_ribcl_field_catstring( field, "Size: "); ilo2_ribcl_field_catstring( field, mem_data->memsize); field = &(idr_info->idr_areas[0].area_fields[I2R_MEM_IF_SPEED]); field->field_type = SAHPI_IDR_FIELDTYPE_CUSTOM; ilo2_ribcl_field_catstring( field, "Speed: "); ilo2_ribcl_field_catstring( field, mem_data->speed); } /* end ilo2_ribcl_build_memory_idr() */ /** * ilo2_ribcl_update_idr: * @new_info: Ptr to structure containing (potentially) new IDR information * @exist_info: Ptr to IDR info stored in a resource's RDR. * * This routine is given pointers to a new IDR and an existing IDR. It will * update the information in the existing IDR with any differing information * in the new IDR. If any of the information is actually updated, the update * count in the existing IDR wil be incremented. * * Currently, we only have one Area in all of our IDRs, but this code should * handle multiple Areas if we ever implement them. * * Return values: * Number of updates made to the existing IDR. * **/ static int ilo2_ribcl_update_idr( struct ilo2_ribcl_idr_info *new_info, struct ilo2_ribcl_idr_info *exist_info) { I2R_AreaT *n_area; I2R_AreaT *e_area; I2R_FieldT *n_field; I2R_FieldT *e_field; int adx; int fdx; int updates = 0; for( adx = 0; adx < new_info->num_areas; adx++){ n_area = &(new_info->idr_areas[adx]); e_area = &(exist_info->idr_areas[adx]); for( fdx = 0; fdx < n_area->num_fields; fdx++){ n_field = &(n_area->area_fields[fdx]); e_field = &(e_area->area_fields[fdx]); if( strcmp( n_field->field_string, e_field->field_string)){ strcpy( e_field->field_string, n_field->field_string); updates++; exist_info->update_count++; } } } return( updates); } /* end ilo2_ribcl_update_idr() */ /***************************** OpenHPI plug-in to iLO2 RIBCL plug-in ABI function mapping *****************************/ void * oh_get_idr_info (void *hnd, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrInfoT *) __attribute__ ((weak, alias("ilo2_ribcl_get_idr_info"))); void * oh_get_idr_area_header (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrAreaTypeT, SaHpiEntryIdT, SaHpiEntryIdT *, SaHpiIdrAreaHeaderT *) __attribute__ ((weak, alias("ilo2_ribcl_get_idr_area_header"))); void * oh_get_idr_field (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT, SaHpiIdrFieldTypeT, SaHpiEntryIdT, SaHpiEntryIdT *, SaHpiIdrFieldT *) __attribute__ ((weak, alias("ilo2_ribcl_get_idr_field"))); /* The following are just stubbs, since our IDRs are read only */ void * oh_add_idr_area (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrAreaTypeT, SaHpiEntryIdT) __attribute__ ((weak, alias("ilo2_ribcl_add_idr_area"))); void * oh_del_idr_area (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT) __attribute__ ((weak, alias("ilo2_ribcl_del_idr_area"))); void * oh_add_idr_field (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrFieldT) __attribute__ ((weak, alias("ilo2_ribcl_add_idr_field"))); void * oh_set_idr_field (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrFieldT) __attribute__ ((weak, alias("ilo2_ribcl_set_idr_field"))); void * oh_del_idr_field (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT, SaHpiEntryIdT) __attribute__ ((weak, alias("ilo2_ribcl_del_idr_field"))); openhpi-3.6.1/plugins/snmp_bc/0000755000175100017510000000000012605014547015261 5ustar mohanmohanopenhpi-3.6.1/plugins/snmp_bc/snmp_bc_xml2event.c0000644000175100017510000002621612575647274021100 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman * W. David Ashley */ #include #include #include GHashTable *errlog2event_hash = NULL; ohpi_bc_lock snmp_bc_plock = { .lock = G_STATIC_REC_MUTEX_INIT, .count = 0 }; unsigned int errlog2event_hash_use_count = 0; static void free_hash_data(gpointer key, gpointer value, gpointer user_data); static void event_start_element(GMarkupParseContext *context, const gchar *element_name, const gchar **attribute_names, const gchar **attribute_values, gpointer user_data, GError **error); /********************************************************************** * errlog2event_hash_init: * @custom_handle: Plugin's data pointer. * * Initializes the Error Log to event translation hash table. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_OUT_OF_MEMORY - No memory to allocate hash table structures. * SA_ERR_HPI_INVALID_PARAMS - @custom_handle NULL **********************************************************************/ SaErrorT errlog2event_hash_init(struct snmp_bc_hnd *custom_handle) { GMarkupParser parser; GMarkupParseContext *pcontext; gboolean rc; GError *err; struct errlog2event_hash_info user_data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } err = NULL; snmp_bc_lock(snmp_bc_plock); /* Initialize hash table */ errlog2event_hash = g_hash_table_new(g_str_hash, g_str_equal); if (errlog2event_hash == NULL) { err("No memory."); snmp_bc_unlock(snmp_bc_plock); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* Initialize user data used in parsing XML events */ user_data.hashtable = errlog2event_hash; /* Initialize XML parser */ memset(&parser, 0, sizeof(parser)); parser.start_element = event_start_element; pcontext = g_markup_parse_context_new(&parser, 0, &user_data, NULL); if (pcontext == NULL) { err("No memory."); snmp_bc_unlock(snmp_bc_plock); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* Parse XML events */ rc = g_markup_parse_context_parse(pcontext, (const gchar *)eventxml, (gssize)strlen(eventxml), &err); if (rc == FALSE || err != NULL) { if (err != NULL) { err("Parse error=%s.", err->message); g_error_free(err); } else { err("Unknown XML parse error."); } g_markup_parse_context_free(pcontext); snmp_bc_unlock(snmp_bc_plock); return(SA_ERR_HPI_INTERNAL_ERROR); } g_markup_parse_context_end_parse(pcontext, &err); g_markup_parse_context_free(pcontext); /* Make sure there are elements in the hash table */ if (g_hash_table_size(errlog2event_hash) == 0) { err("Hash table is empty."); snmp_bc_unlock(snmp_bc_plock); return(SA_ERR_HPI_INTERNAL_ERROR); } snmp_bc_unlock(snmp_bc_plock); return(SA_OK); } /********************************************************************** * errlog2event_hash_free: * * Frees Error Log to event translation hash table. * * Returns: * SA_OK - Normal operation. **********************************************************************/ SaErrorT errlog2event_hash_free() { snmp_bc_lock(snmp_bc_plock); g_hash_table_foreach(errlog2event_hash, free_hash_data, NULL); g_hash_table_destroy(errlog2event_hash); snmp_bc_unlock(snmp_bc_plock); return(SA_OK); } static void free_hash_data(gpointer key, gpointer value, gpointer user_data) { ErrLog2EventInfoT *xmlinfo; g_free(key); xmlinfo = (ErrLog2EventInfoT *)value; g_free(xmlinfo->event); g_free(value); } /* Note: Error messages are passed back to the caller via the GError * mechanism. There is no need for err calls in this function. */ static void event_start_element(GMarkupParseContext *context, const gchar *element_name, const gchar **attribute_names, const gchar **attribute_values, gpointer user_data, GError **error) { int i = 0; gchar *key = NULL; gint line, pos; ErrLog2EventInfoT *xmlinfo, working; struct errlog2event_hash_info *hash_info; memset(&working, 0, sizeof(ErrLog2EventInfoT)); hash_info = (struct errlog2event_hash_info *)user_data; /* Ignore all XML elements except the event tag */ if (g_ascii_strncasecmp(element_name, "event", sizeof("event")) != 0) { /* This is normal - not an error condition! */ return; } /* Fetch XML element attributes and values. Build event info */ while (attribute_names[i] != NULL) { if (g_ascii_strncasecmp(attribute_names[i], "name", sizeof("name")) == 0) { /* Don't use this attribute so ignore it */ } else if (g_ascii_strncasecmp(attribute_names[i], "msg", sizeof("msg")) == 0) { key = g_strdup(attribute_values[i]); if (key == NULL) { g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_PARSE, "No memory for hash key=%s", attribute_values[i]); return; } } else if (g_ascii_strncasecmp(attribute_names[i], "hex", sizeof("hex")) == 0) { working.event = g_strdup(attribute_values[i]); if (working.event == NULL) { g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_PARSE, "No memory for hash value=%s", attribute_values[i]); return; } } else if (g_ascii_strncasecmp(attribute_names[i], "severity", sizeof("severity")) == 0) { if (g_ascii_strncasecmp(attribute_values[i], "SAHPI_CRITICAL", sizeof("SAHPI_CRITICAL")) == 0) { working.event_sev = SAHPI_CRITICAL; } else if (g_ascii_strncasecmp(attribute_values[i], "SAHPI_MAJOR", sizeof("SAHPI_MAJOR")) == 0) { working.event_sev = SAHPI_MAJOR; } else if (g_ascii_strncasecmp(attribute_values[i], "SAHPI_MINOR", sizeof("SAHPI_MINOR")) == 0) { working.event_sev = SAHPI_MINOR; } else if (g_ascii_strncasecmp(attribute_values[i], "SAHPI_INFORMATIONAL", sizeof("SAHPI_INFORMATIONAL")) == 0) { working.event_sev = SAHPI_INFORMATIONAL; } else { g_markup_parse_context_get_position(context, &line, &pos); g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, "Bad severity=%s for XML event element line %d", attribute_values[i], line); return; } } else if (g_ascii_strncasecmp(attribute_names[i], "override", sizeof("override")) == 0) { working.event_ovr |= NO_OVR; if (strstr(attribute_values[i], "OVR_SEV") != NULL) { working.event_ovr |= OVR_SEV; } if (strstr(attribute_values[i], "OVR_RID") != NULL) { working.event_ovr |= OVR_RID; } if (strstr(attribute_values[i], "OVR_EXP") != NULL) { working.event_ovr |= OVR_EXP; } if (strstr(attribute_values[i], "OVR_VMM") != NULL) { working.event_ovr |= OVR_VMM; } if (strstr(attribute_values[i], "OVR_MM1") != NULL) { working.event_ovr |= OVR_MM1; } if (strstr(attribute_values[i], "OVR_MM2") != NULL) { working.event_ovr |= OVR_MM2; } if (strstr(attribute_values[i], "OVR_MM_STBY") != NULL) { working.event_ovr |= OVR_MM_STBY; } if (strstr(attribute_values[i], "OVR_MM_PRIME") != NULL) { working.event_ovr |= OVR_MM_PRIME; } /* Ignore any other values */ } else if (g_ascii_strncasecmp(attribute_names[i], "dup", sizeof("dup")) == 0) { working.event_dup = (short)atoi(attribute_values[i]); } else { g_markup_parse_context_get_position(context, &line, &pos); g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE, "Bad name for XML event element line %d", line); return; } i++; } /* Check for valid key */ if (key == NULL) { g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, "No key set from XML event element"); return; } /* Malloc memory for hash value and set values */ xmlinfo = g_malloc0(sizeof(ErrLog2EventInfoT)); if (!xmlinfo) { g_set_error(error, G_MARKUP_ERROR,G_MARKUP_ERROR_PARSE, "No memory for hash value"); return; } *xmlinfo = working; /* Insert event into hash table */ g_hash_table_insert(hash_info->hashtable, key, xmlinfo); dbg("Inserted event=%s into hash table. Sev=%s, OVR=%lld, Dup=%d", xmlinfo->event, oh_lookup_severity(xmlinfo->event_sev), xmlinfo->event_ovr, xmlinfo->event_dup); return; } openhpi-3.6.1/plugins/snmp_bc/snmp_bc_session.h0000644000175100017510000000204512575647274020636 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003, 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Steve Sherman */ #ifndef __SNMP_BC_SESSION_H #define __SNMP_BC_SESSION_H /** * This handle is unique per instance of this plugin. SNMP session data is * stored in the handle along with config file data. **/ void *snmp_bc_open(GHashTable *handler_config, unsigned int hid, oh_evt_queue *eventq); void snmp_bc_close(void *hnd); SaErrorT snmp_bc_manage_snmp_open(struct snmp_bc_hnd *custom_handle, SaHpiBoolT recovery_requested); SaErrorT snmp_bc_recover_snmp_session(struct snmp_bc_hnd *custom_handle); #endif openhpi-3.6.1/plugins/snmp_bc/snmp_bc_sensor.h0000644000175100017510000000666512575647274020500 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #ifndef __SNMP_BC_SENSOR_H #define __SNMP_BC_SENSOR_H SaErrorT snmp_bc_get_sensor_reading(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiSensorReadingT *reading, SaHpiEventStateT *state); SaErrorT snmp_bc_get_sensor_thresholds(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiSensorThresholdsT *thres); SaErrorT snmp_bc_set_sensor_thresholds(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, const SaHpiSensorThresholdsT *thres); SaErrorT snmp_bc_get_sensor_enable(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiBoolT *enable); SaErrorT snmp_bc_set_sensor_enable(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, const SaHpiBoolT enable); SaErrorT snmp_bc_get_sensor_event_enable(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiBoolT *enable); SaErrorT snmp_bc_set_sensor_event_enable(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, const SaHpiBoolT enable); SaErrorT snmp_bc_get_sensor_event_masks(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiEventStateT *AssertEventMask, SaHpiEventStateT *DeassertEventMask); SaErrorT snmp_bc_set_sensor_event_masks(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiSensorEventMaskActionT act, const SaHpiEventStateT AssertEventMask, const SaHpiEventStateT DeassertEventMask); SaErrorT snmp_bc_get_sensor_eventstate(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiSensorReadingT *reading, SaHpiEventStateT *state); SaErrorT snmp_bc_get_sensor_oid_reading(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, const char *raw_oid, SaHpiSensorReadingT *reading); SaErrorT snmp_bc_set_threshold_reading(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, const char *raw_oid, const SaHpiSensorReadingT *reading); SaErrorT snmp_bc_get_logical_sensors(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiSensorReadingT *reading); SaErrorT snmp_bc_set_slot_state_sensor(void *hnd, struct oh_event *e, SaHpiEntityPathT *slot_ep); SaErrorT snmp_bc_reset_slot_state_sensor(void *hnd, SaHpiEntityPathT *slot_ep); SaErrorT snmp_bc_set_resource_slot_state_sensor(void *hnd, struct oh_event *e, guint resourcewidth); SaErrorT snmp_bc_reset_resource_slot_state_sensor(void *hnd, SaHpiRptEntryT *res); SaErrorT snmp_bc_get_slot_state_sensor(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiSensorReadingT *reading); SaErrorT snmp_bc_get_slot_power_sensor(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiSensorReadingT *reading); #endif openhpi-3.6.1/plugins/snmp_bc/snmp_bc_reset.h0000644000175100017510000000134112575647274020273 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #ifndef __SNMP_BC_RESET_H #define __SNMP_BC_RESET_H SaErrorT snmp_bc_get_reset_state(void *hnd, SaHpiResourceIdT rid, SaHpiResetActionT *act); SaErrorT snmp_bc_set_reset_state(void *hnd, SaHpiResourceIdT rid, SaHpiResetActionT act); #endif openhpi-3.6.1/plugins/snmp_bc/snmp_bc_time.c0000644000175100017510000002760212575647274020112 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Sean Dague */ #include /* * Enums and Constants */ /* * Table of days in each month. */ const unsigned short days_in_month[12] = /* Table of days in each month. */ { 31, /* January */ 28, /* February */ 31, /* March */ 30, /* April */ 31, /* May */ 30, /* June */ 31, /* July */ 31, /* August */ 30, /* September */ 31, /* October */ 30, /* November */ 31 /* December */ }; /* * Daylight saving time standards table * * This structure contains the definition of how daylight saving * time is observed for the supported timezones. * * If you add or remove any entries from this table you must also * change SNMP_BC_DST_STANDARDS (contains the indices for this table). */ static const DST_ENTRY DST_TABLE[] = { /* * SNMP_BC_DST_USA: * Alaskan, Pacific, Mountain, Central, Eastern, * Atlantic, Newfoundland */ { 2, 0, SECOND_WEEK, SUNDAY, MARCH, 2, 0, FIRST_WEEK, SUNDAY, NOVEMBER }, /* * SNMP_BC_DST_ESA: * E. South America */ { 2, 0, THIRD_WEEK, SUNDAY, OCTOBER, 2, 0, SECOND_WEEK, SUNDAY, FEBRUARY }, /* * SNMP_BC_DST_MID: * Mid-Atlantic */ { 2, 0, LAST_WEEK, SUNDAY, MARCH, 2, 0, LAST_WEEK, SUNDAY, SEPTEMBER }, /* * SNMP_BC_DST_EEC: * Azores, GMT, Romance, Central European, GTB, * W. Europe, Arab, Russian, Ekateinburg, Yakutsk */ { 2, 0, LAST_WEEK, SUNDAY, MARCH, 3, 0, LAST_WEEK, SUNDAY, OCTOBER }, /* * SNMP_BC_DST_EEU: * E. Europe */ { 0, 0, LAST_WEEK, SUNDAY, MARCH, 1, 0, LAST_WEEK, SUNDAY, SEPTEMBER }, /* * SNMP_BC_DST_EGT: * Egypt */ { 2, 0, FIRST_WEEK, FRIDAY, MAY, 2, 0, LAST_WEEK, WEDNESDAY, SEPTEMBER }, /* * SNMP_BC_DST_FLE: * FLE */ { 3, 0, LAST_WEEK, SUNDAY, MARCH, 4, 0, LAST_WEEK, SUNDAY, OCTOBER }, /* * SNMP_BC_DST_IRN: * Iran */ { 2, 0, FIRST_WEEK, SUNDAY, MARCH, 2, 0, LAST_WEEK, TUESDAY, SEPTEMBER }, /* * SNMP_BC_DST_AUS: * Cen. Australia, AUS Eastern */ { 2, 0, LAST_WEEK, SUNDAY, OCTOBER, 2, 0, LAST_WEEK, SUNDAY, MARCH }, /* * SNMP_BC_DST_TAS: * Tasmania */ { 2, 0, FIRST_WEEK, SUNDAY, OCTOBER, 2, 0, LAST_WEEK, SUNDAY, MARCH }, /* * SNMP_BC_DST_NWZ: * New Zealand */ { 2, 0, LAST_WEEK, SUNDAY, MARCH, 3, 0, LAST_WEEK, SUNDAY, OCTOBER } }; /* * Determines if the given year is a leap year */ gboolean is_leap_year(guchar year) { /* * Leap years occur in years exactly divisible by 4, * except that years ending in 00 are leap years ONLY if * they are divisible by 400 */ if ((((year % 4) == 0) && ((year % 100) != 0)) || ((year % 400) == 0)) return(TRUE); else return(FALSE); } // End is_leap_year /* * Calculates day of month given month/year and weekday/week * * Note: This routine does not do any error checking on the inputs. * weekday assumed to be in SNMP_BC_DST_WEEKDAY * week assumed to be in SNMP_BC_DST_WEEK * month assumed to be in SNMP_BC_DST_MONTH * year assumed to be 0-99 */ guchar get_day_of_month(guchar weekday, guchar week, guchar month, guchar year) { guchar month_adj; guchar index; guchar day; /* * Calculate month adjustment */ month_adj = 0; for (index = 0; (index < (month - 1)); index++) month_adj += 35 - days_in_month[index]; if ((month > 2) && (is_leap_year(year) == TRUE)) month_adj--; // Allow for this year's leap day /* * Calculate day */ day = (weekday+14); /* Initialize (+14 to avoid going neg below) */ /* * Century adjustment. 90-99 is 1990-1999. * 00-89 is 2000-2089. Each century moves * day calculation 1 place. */ if (year >= 2) day--; day += month_adj; /* Month adjustment */ day -= (year%7); /* Year adjustment (every year moves day 1 place) */ day -= (((year+3)/4) % 7); /* Add effects of leap year */ day %= 7; /* Convert to weekday (0-6) */ day += ((week-1) * 7); /* Add in whole weeks */ day++; /* Adjust weekday (1-7) */ /* * May go past end if using LAST_WEEK, adjust if needed */ if (day > days_in_month[month-1]) day -= 7; return(day); } // End get_day_of_month gboolean is_dst_in_effect(struct tm *time, gchar **zone_token) { guchar year; guchar start_hour, end_hour; guchar start_day, end_day; guchar start_week, end_week; guchar start_wkday, end_wkday; guchar start_month, end_month; gboolean rc; guchar zone_index; rc = FALSE; year = time->tm_year; if (zone_token[2] == NULL) { zone_index = 1; } else { zone_index = atoi(zone_token[2]); } if (zone_index != 0) zone_index--; start_hour = DST_TABLE[zone_index].start_hour; start_day = DST_TABLE[zone_index].start_day; start_week = DST_TABLE[zone_index].start_week; start_wkday = DST_TABLE[zone_index].start_weekday; start_month = DST_TABLE[zone_index].start_month; end_hour = DST_TABLE[zone_index].end_hour; end_day = DST_TABLE[zone_index].end_day; end_week = DST_TABLE[zone_index].end_week; end_wkday = DST_TABLE[zone_index].end_weekday; end_month = DST_TABLE[zone_index].end_month; /* * If start_day not provided, use information from start_week and * start_weekday to calculate start_day */ if (start_day == 0) start_day = get_day_of_month(start_wkday, start_week, start_month, year); /* * If end_day not provided, use information from end_week and * end_weekday to calculate end_day */ if (end_day == 0) end_day = get_day_of_month(end_wkday, end_week, end_month, year); // It is daylight saving time if: // the month consists entirely of daylight saving days // it is the starting month but after the begin date // it is the begin date but past the starting hour // it is the ending month but before the end date // it is the end date but before the ending hour if (((end_month > start_month) && // Northern hemisphere check (time->tm_mon > start_month) && (time->tm_mon < end_month)) || ((start_month > end_month) && // Southern hemisphere check ((time->tm_mon > start_month) || (time->tm_mon < end_month))) || ((time->tm_mon == start_month) && ((time->tm_mday > start_day) || ((time->tm_mday == start_day) && (time->tm_hour >= start_hour)))) || ((time->tm_mon == end_month) && ((time->tm_mday < end_day) || ((time->tm_mday == end_day) && (time->tm_hour < (end_hour-1)))))) { rc = TRUE; } return(rc); } SaErrorT snmp_bc_set_dst(struct oh_handler_state *handle, struct tm *time) { gchar **zone_token; struct snmp_bc_hnd *custom_handle = handle->data; zone_token = g_strsplit(custom_handle->handler_timezone, ",", 3); if (zone_token[1] == NULL) { /* Daylight Saving Time info is not provided */ time->tm_isdst = -1; } else { if (g_ascii_strncasecmp(zone_token[1], "yes", sizeof("yes")) == 0) { /* Does the timestamp of this particular log */ /* fall within the observes DST period for this timezone? */ if (is_dst_in_effect(time, zone_token) == TRUE) time->tm_isdst = 1; else time->tm_isdst = 0; } else { /* Daylight Saving Time info is not observed */ /* Assuming "Not Observed" == "Not In DST" */ time->tm_isdst = 0; } } g_strfreev(zone_token); return(SA_OK); } /** * snmp_bc_get_sp_time: * @handle: Pointer to handler's state. * @time: Pointer to tm struct to store data. * * Returns SaHpiEventLogInfoT information about Event Log. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_INVALID_PARAMS - Any pointer parameter is NULL. * SA_ERR_HPI_INTERNAL_ERROR - If cannot parse date and time returned from bc **/ SaErrorT snmp_bc_get_sp_time(struct oh_handler_state *handle, struct tm *time) { struct snmp_value get_value; struct tm tmptime; SaErrorT rv = SA_OK; struct snmp_bc_hnd *custom_handle; if (!handle || !time) return(SA_ERR_HPI_INVALID_PARAMS); rv = SA_OK; custom_handle = (struct snmp_bc_hnd *)handle->data; if (custom_handle->platform == SNMP_BC_PLATFORM_RSA) { rv = snmp_bc_snmp_get(custom_handle, SNMP_BC_DATETIME_OID_RSA, &get_value, SAHPI_TRUE); } else { rv = snmp_bc_snmp_get(custom_handle, SNMP_BC_DATETIME_OID, &get_value, SAHPI_TRUE); } if ( (rv == SA_OK) && (get_value.type == ASN_OCTET_STR) ) { if(sscanf(get_value.string,"%2d/%2d/%4d,%2d:%2d:%2d", &tmptime.tm_mon, &tmptime.tm_mday, &tmptime.tm_year, &tmptime.tm_hour, &tmptime.tm_min, &tmptime.tm_sec)) { snmp_bc_set_dst(handle, &tmptime); tmptime.tm_mon--; tmptime.tm_year -= 1900; } else { err("Couldn't parse Date/Time from Blade Center SP"); return(SA_ERR_HPI_INTERNAL_ERROR); } } else { err("Couldn't fetch Blade Center SP Date/Time Entry"); if (rv == SA_OK) rv = SA_ERR_HPI_INTERNAL_ERROR; return(rv); } *time = tmptime; return(SA_OK); } /** * snmp_bc_set_sp_time: * @ss: Pointer to session info. * @time: Pointer to tm struct to store data. * * * * Return values: * SA_OK - normal case. * SA_ERR_HPI_INVALID_PARAMS - Any pointer parameter is NULL. * SA_ERR_HPI_INTERNAL_ERROR - If cannot parse date and time returned from bc * Returncode from snmp_set() **/ SaErrorT snmp_bc_set_sp_time(struct snmp_bc_hnd *custom_handle, struct tm *time) { struct snmp_value set_value; SaErrorT returncode; if (!custom_handle || !time) return(SA_ERR_HPI_INVALID_PARAMS); returncode = SA_OK; set_value.type = ASN_OCTET_STR; strftime(set_value.string, sizeof(set_value.string), "%m/%d/%Y,%H:%M:%S", time); set_value.str_len = 19; if (custom_handle->platform == SNMP_BC_PLATFORM_RSA) { returncode = snmp_bc_snmp_set(custom_handle, SNMP_BC_DATETIME_OID_RSA, set_value); } else { returncode = snmp_bc_snmp_set(custom_handle, SNMP_BC_DATETIME_OID, set_value); } if (returncode != SA_OK) err("snmp_set is NOT successful\n"); return returncode; } openhpi-3.6.1/plugins/snmp_bc/bc2hpi.pdf0000644000175100017510000261312612575647274017155 0ustar mohanmohan%PDF-1.4 %äüöß 2 0 obj <> stream xœíWÉjA½ÏWÔÙvWï & YVÈQAˆã„ %Ø—ü~ªz™¥5£ø‹Ã Toª^U¿Þj$üîžAÂ;)*zúÈÏ—¯ðù~¦—ü{ùÖm༣×ÇG¸Ý#¨Ç'¸“øŽ?:¥…'Wzw'UBP W‘@Ñ1‰ƒÍˆ¡".3+¡—}|ö‘ÂT$d%ârT̈M‰£lý8¶µj?xÝË|H¸—C]¹/c´¡Ï‹²ã ‚Z]Œ³žÇîÐL‰uT’ô:OŠ"c<)z_b \xü `ͲfY³¬YÖ,k–E _k£@×®`ä¤ëí„ö~¸–u¹4éÒ_.(”¨>]ük…›6Ѷå¸î¯ÞÕ6R=ÍU½K£Ö¨´BU`ß&Ñ¥Ô™4‘;‰™4¥õ˜‹”i®°VŽÒ«˜¡ÒÅ*P2ß\ª‘tÜÜàÏz Jr[ƒMCʨ²)¿²ì,´ðåÜÝ~<Øý‚Ìvµ¹UÆ[¸B dšªF0ÚŠX¹ìÀåx4ÆYêËupÐ(Òzħ\š3¢3Ž™)‚j3ÙÈ|îµµÉÀE0™âæÐ‚æ6F,UšÉ|&Cà ŠW‘¡² œ»$O6N ZƒŽ dÑZ+;N8Nð½{ºéòÄ~úÐÌqˆ‰Ÿõhæ8wÂ}lÚmUxÝÐh ôÒ#7¡¼|ï[ ”µºHYŽŒ´ðtLƒV& §]+Y'(–I,£“XS+{NX®K§-Ëk”ÛÚõçQ=)úMmQ;%ÒwQ mQJÞ9É¢¥—-Þ¼ly5ý_½F §îš®´Ê)Œö[x¥¬þMÈÚÀ›AV£ùL²êÈŸ²Ù¢%›-oy‰:7þW<ÆÑ×%ÕAòœÎˆÿx©ÒkgT>À“9¤| endstream endobj 3 0 obj 686 endobj 7 0 obj <> stream ÿØÿàJFIFÿÛC     ÿÛC   ÿÀÒ‰"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ìÿaÏŬxB¼D ÿ¾–¾LÖq\|ÞmÖöùþîúçþ7þѺ÷¿x·C±Ò¼;~š4»"y´x·²lFùëµÿ‚qj²ëß ¬š]>æÃìZežž³\}ˤYn?{û?>Ïø|©ûf?Ù¿h/‰ çɾêWx¡Fù>T‰eßÿzU>#š§4¤uÞ ý»|Câm9nçðç…­·où?²’µ_öÒÕ_þ`ÿé+_2üðkÚhŸÚ2ê¶—6^C'Ù."Ùÿ-‹øŸçÛRÞ'…tÛ8¥ÔìÙ%Ÿ{Å*NɧûŸÃ²´öqûDûßÌ}%ÿ ¥©§üËÞ û†'ÿMÿ†ÜÔ?èZð_þ ÿ‹¯?±î|ª}‡ÁÖ7×—o/Ì–í²$_øþ†ûj•×…n|%~‹yã .k¸¥MÚ~;Þïoîï‰|¯ü~¢Q‰\’þcí¤ý¶îSïxkÁoÿpïþΟÿ ÂÛÿáº×ÿg_H³Ý;Moâh®%¡.ñ2ÿ³ó.ÚlßÚ¾¿Ší Ók¯Í½?ïŠ9–_Ì~§íÃÏ—Âù¿ƒì-ÿÅП¶ß÷|á/üoþ.¾Løuãm1-n"Õô¦»¼gh¯·±üßv½CJ°4»½N +êvV±ZùO_aò—›q/ý5ßå'ü®4ãÊO½üDZ¿íñ?äBð·ûÿe—ÿ‹«¶ÂÞ^Å_¼73ÊÛvCk.÷ÿÇëæOøÛA°½Ð¥ÑtÈ“[°dynõ_³§î¶þö-Ÿ2ýÿür¼«ÄúvŸ®Ý'öC]ßê³Ë½¥´‰¢·ÿqWÿfùܨå*1—ó¦°ü{Õ]w7Áø<¯ö"ÿìé÷?5 ‘~ +«Ó-ÿú ׿…Ÿ€ç·Óe¾Ôþ hÚTÑ)uÓQ–âîVþæÈ•ÑY¿Új«“sªH’YøæÜ»iläñMû?7Èû?Ùj9KåÌ}íyû]YØ_¼_ 4+o*]¾+éÿÓßöÌÒ¿å—Ãíæ-ß,ßéIÿ³×ç\–úŸ‡õx¥–æo:)|ÕóY™þúûÕ÷OìƒûH|.]OźŸÅ¯AqâMz_Üjöjö»$_*+_¹÷þOïÕÆ1ûDJþc¨ÛEßóü;Ð?ßóçÿâéÿðÙ:ï›áÞ…ÿ—_ü];\ñLJõm5üacà8Ek¥6—ö/±ÅöOõR¯Û]ÿçªË³þøzóßÚâ»φ>Ð|áÉƶ±Z˩뛒Ö$uM²ù»Ö«½0÷¿˜ôý²t7ù'z&ÿúþºÿâêÄ?¶6‡ÿB–‰þƧuÿÅ×Á¾ ×&¿&›«]ÜÞù¿½[ÿG‹ý„Ýó;ß+þõgØMâo2çÅš~›³þY_N®íÿTzŽH‡¿üÇè/ü67‡¶mÿ„OÿÁÅ×ÿN‡öºð¾Çeð.žŸìm]WÃÚ>¹¨éK«éþ4ðë½Ô²ÿÄ„ÞEõ¿Ï·k$ª‰ÿ|µs×:–µá_ÛÁ®7œ‘2<¶ûV/5¹¿e>H—ûÏæ?E“öºð¾ÔÿŠÜMjëåÿÇꦵûgøGG³–æïŠ%ÜÏý»pµò¼Þ0ø}¬hÑ6‹áÍBÛSv_žïQß|ÿ>ôÙóÀ)~2x&mSÀøŽ,4íþÛ}³+3Üm•þtù¾þÄù¿ßªöq'š_Ì}Õðgㆾ1ø¯OÑ`ðcX}±e;ûjáömMû*O|ðŽ-~€¾ šöÛíM –µ:=¯Ê­µ÷½^û MxŸ´†­¥–'·Ûò'ß_õ»ÿ½÷7Àëç¯x×\Ö¼oÿ¹oî'¹¼·û]Ä»¿ujŽ©üä_øG)Q•C?ü ñ;C‹UÓü?…¼¬Ëÿ4NŸ?ûI^€ú¯€&‰÷Oáýî»öÂM÷ÿ勞‡þx††> ²Ò—ÀÖ5[ûEóß@÷NÊÛÛ~Íéò§É]·ûdÙønÕ/†Ÿ mŸgß—EÞŸðß¹š¢Q/ÚJÕ¶wÿï,ææ-Â]ÿñï7Šbw_ûå*½Íÿ™­]šçDØ÷ÄQñªøVÛöóñfß"×á—Ãy¾o¿ÿÚñu4_¶Žu[f·ƒÀ?–õ¥Ü`‹Ãða¢Ûþ÷ÞÝþÕDb_µ—õÿ}˜þ*ø4‘~ñ´ÿ÷?´âý·¬Ù¼sðYÿqmÿ–¿?þK×ן´ÿt*)ü%à7Í]ë øn-ÿøõtý¢¤ño‡.ô]Bèž2–ë}Ž¡6‡oýŸuüûºìýÔ¿Ü—vßá}¿~¶÷CÚTþcê‹ÏüO•ôYæÿn/±¿þÛÕ+Ÿ‰þo]»ÿì¶ÿ´«æÏë:Ši—7>þÕÛóĦ+T‰þ}é/Éò·É\>±ñ UK‹E¶—HDòçytȾGþ=›jý‘Ò§ógÂmðâ–UÐnv?ÞÿCÓ¿øŠ£sãÙãø´AßþÀúkÿì•ñljþ"êö¾| ¥Û:E½n.,âOµsbÿ»^y©|Kñ.¶ÊÒ¥§Ëÿ>öhŸúcËý¥æ?@ŸÅ_³›ïYt´Ý÷ÿⰦͭþÍ“}íOü&mkà+ýKÄúU¿•=›¤¬ÛÖ_)¾eÛÿÙ­f'еé“jοû=¡íkÿ1ú ïû2Ìû¿²™?ßðÌü]Dö³Ë·ì{7ü#+ÿÇkãOéš¯Ž¬¦¶Ò5f%€ùŸÙwo·Ï‹øÞþ'_îýí¹ûÕoû^H>]MžïÈûG•æ£ü›7}ú¿gÎG´«´}‹máïÙªòtŠ+hžWû©ÿËüßù¢¹ðìÑö‰b—ìвîVÿŠz_—þù–¾/Iµ©®’/íx¾Ï·{K3|‹òo¬ýGÅ:曟ÃKíŠó*£·û‰ýÚdÚ¿ólÂû2»ÇÍþ.“ÿjÑÿìÆûãûfšŸ/ß}÷ÿŽ×ßð°¼CöT~tftû´ù¾'jvÌ‹÷÷.æÞ¿u¨å/ÚW>Ýÿ…Wû0L›QÓSý¿°êIÿµj»üý™fûš¾ŸþÎøµ/þ.¾/‡âv¯6Åòþµ»mâ}rdÜÐ@‘'ÎÒ»|”r‘í*ŸX\üý_ýWŠ4Ø_øãþ¢‡àÀÇx ñ~½>÷úUêlÿÇ+å_øÎûM K9üébóZT]ÞRÑð¿^›J}WWÔ'ÞíÝ™öÿlÿQìãþ³W—˜ûÅ¿±·€<= Ë|Ëö—o)bH§¼‰ßÍtTÚΛ}zü9`ÿÑcøKÿ÷m}ñ¾h®~£,»â–}9Õ÷ýïÞŲ¾¸£–‘­6®Ï‹?`øVÙïáÓ+7ÏáØ¿ô¶ê¾(ý°Ö?¶üZ½²êZ}œ[ºKoEo‘6=kïGá#â<*çn‰.Ý^&þÌ»ßß»øâ¬K—žÚñ.beÙ÷àx~M©üè~`ÞEcþvŸ:ý£L–Vù"þúoþíPñ_…¼?áû×¶Ò5;½cL·fÛqw[»nþ Ÿ7ñû+Yz~ñ_J‡áXÿf]ÿjµ¬©-Ú4[%_ÞìO¹»äy]¾ý|þ—7Ú–©-ÊÏ\7ͽþæßî»¶½7Að’Üé?ÙžzÃvñ*EhëûÙw}ÍŸ÷ÝyUå³ÙAqͽ¥kvÿwøèF'M¥YØëS¿ö2Kö-­öÈ¡VóQ¿ç¯ýrªÖÞÑR]—Úœ‰/ðÛéÖ¿høïÛZ? |1}­ÞÛéZd²Ù½êÊ÷W6Ͷ¿uÓþ²½jÚæ ùº†lâ¶ŠÝ^)o¶ï•Ÿg÷è ºǀ4¯ÿgÞYÛMâYe•å›PÓ¿ÕK¿äò¥ßó/ûé\£s…ëÁ¯DÏ¢;|Öéó?Íÿ>ÿíã•ì¾ °‹Æ²ÐçÓR{x÷OÎé½ßäïWüHðd¾Ÿì1Nךd°=î“qþÇÞtÿ¾j¥)r¯¨Ï£ëh¿Ñæ¶þãAþ~õv¶Û%­ë^\ÿ¢\iÒʯϵü­ÉÿÄÖV¹àx4ë[(íµ?¶Z½­½ÔWrÀñl–TÿH‹c|ß#|Ÿí}êÒšÁŸÃHÛYû3ïºÿÓ*ÒŒcÍï GÔß°LÏsûMè›cò]e–-éüMýžŒïÿ»×Îÿ®,®üZ“é¶ ¦Y>«â¢¶y|ß›ä_½þó×п°7üœÞ‰±›þ>¥Oü¦Å_:x«cêÖûU¿ä1â?ûív5cö½âÌÿøÛUÒ¶Ems;ê³Ú£ý¡{¬L•ƒ¢Y.¦ŠºŒ"Û\’¶Épû~Ø›Q—þ·øÿŠ›ãû9SÆöjû,â‹z7ÞOž³¯5(Eÿnˆ”súÝþ«á[¤ótȯü9zÛâÓ®×í7IÿL>ë·«-sìÚjÿlh2Lš{Ëäm–u–âŶÿªf_øÇþ*ô¯øn_‡kqöi'¼ð}Ô©öæîû;7Ü•ûßÝÿ¾kжøw>‰¥Kq¥æŸ|ÒÚÞ[£>ø‘vùRº2·¹vïû@/Áˆ:u“ߨø‰ÚGŠÍþÍ7•æ´¯÷‘ýÆÿz©|yñµ§ˆu=RóEf±HÉ”Ÿ+|Ÿ+ÿû_Þ®oº&ýKû>&Y®âŸÊß÷Ý“b&ÿáþ:é­t]+¾%¾»ñEž¥s¨-…ż}¼Q=»;DÑo–]ûÕw2|Ê»ª9ƒûÆ»?÷ë6_Ùu¨,ÞãSÓíÙR)ö²ïžÞ/á_âtO»µÙ~O¹OAðö•s¤%毩²#|Ëoi/•å㺲´Ë—Öâ¾Ó'žÚöÖtû,¶íûÝë÷6Ÿã¯P¶ð6™¥"_xŽí-B»cî¢Oûæ¶Œ¹dD2×ôV›[—ìwv’Å<» ŠÞé~_—îÓ#´Ôm&Q®iWw^g”×›n"?ì·ñÀ¾õvÍáMSñ‡Ù$³û5¼ëò¥¼»Y_jlÚßð&®Š6 já_·e+'öuŲm•‚_ö¾ŸíîJˆò–yÍå¶«à;«-OL¹–¸Þúv²‹±ßl¿~/î¶ôÿykÕþøËÃ~2¸—WÖaÓl5X¢Î¢“DžT÷ Û÷.åu_5wîù>_š¼§ÅZýæ«öë—oõÿhòÕN«·åÿ}~_øT>Óžþå§³_9š ­ |òüßú_ø“â-:Çâ4ϧZÙÝXÅ$RÉnŸ-¼Ë±w'É·åûßv¨ëšM´³Gªh¦ööÒwVU—ï@ÍóyRÿ»ýÿã©|EਬtÉõ¹.V9EÒÅ>Ÿp¾TÑ+«ìÿ{扷ÿwäþýfø2çUMj±8ÞGåKnëòKÿì}ÿövÔ>«¢Oagoûõ{ÙYž_³·È•[FðÍþµ6¦Ðê¶–?fƒÍÙ{>ϵ>ïõKü.ßïWgyàÍ+M‹þ&òÏ{/ΰÂÛ+Ó|ãÜGËYÝÅ.ȥݾ/÷®<¼Ãû&~á­BX§–æÓû+È—È–â_–&o½³gÿRé³5ž£ö;ФM÷øº;ýº÷‡5[9îg³ÕtM’®pÛÒâßþZìÿi>GÿiÜ®Yñ#x«KÓ®¦Ûý§¤Û®Ÿ-§Ï< ÿìßí'ú­ÿÝT¢B: ÍzûUMAe‚?6X·µÃ®Íª¿À‰÷V¹ËË;d°ÑZÖûí/pÈóÂñ2}¾“ý¯ïVïˆng›ûCÍ–GÛQ.ößòõÎíŽ8­Ò)|ìÜÄÛÿºÞSUÊ1‰?f¾3h–~$ø#o¦_+}’{]-%ò¥Øûu÷¾Î¯‘>$É"ÓÛþt¿ý¥_]×*ظ|'Çß±ìýœþmûḛÿ&®+óÃöχí'â Y>G×õDÿý Þ¿D?bvþÏ? >où–mô¢â¿<ÿkûiŸö¿¿‡Íg¶½Ôïå1?ÜWò¼§oûå¶­üs/´xÞËi¼´S¥Å½®ýèß$¿'ñ¥s‰­xªÉÛG¶†þîÎÚ[¹íÂ|Ì‘2ïÛþê¾æ®Þ¶¹²ûÌÛ#Úìƒìÿ"|±?ßþö÷Jóèa•-Þ"žÛåIUö·Þþ:Ò§ºU3Ó>xVç^¿Ö-—S—D»M1]R•åþGÿgýŠÝÔ­¬ôyí­kw7]Òâux—oð?ÉW~ø[?]xÏUÖ•<@žmÔ“].ùbþ?7ø¾vßZºô>ñŸ†¯µ{k¯³]¤å·Ý±Ý—ûéÿ³× eò•*dõ1™f#NZßòóá9Û[köªÞjÛ­¯Ú%ýïî·ÿq>J¯ñ_ÀËá_iú­æ§=̬»ÓÏßµš/öÿ¹òWªøbÂÙü%áû9o­žÝ"YVÑt¿íÿ5x‡Ç_Aã[øtÝ*ñ&Óí¾Y%…[cKþÏ÷¿Þ_–ºå(ž\S<ÏMÔ¥¶ÒîÚyÚi]¢H¦Ú¿#oùÿÞùR½noÅmå¶‘²J»'òw¢mdù>}ÿ{þ^k¡ø2M{ZÓü8º…¦›/Ùî/e»½Ü‘4«²DŸímM«þÓW_¦ßêvßn4ű¶ÿOµO6WµG¸þöļµÈà[L›[²Òìô½÷:€»¸Yî¾G_“gþÏÿ}W·ü)øk‰|qqccv\iÚd ¹vK:ü¯*}ßâ¯<´o_øRóÂ?i†õ,íu ~×ó$Z¤Oóìÿ¾е|ñZÿ„ÓPñg‰u÷s³î–á~{¦þ8¶*wøþê|•·Ã.SNhòü>÷õýn}1âˆ^³ø}¨*Ûk6ß•=º¤ËoòÊ¿Çòÿÿýº‡^6ð-ŸÂý\×"»¼½M9úE‰76÷Þÿ7ü¸I­¼9ãm#P¾‚æÛ|ö¬ò¤¿?ͳïìûÛ¿Ûª^ðö‘ÿ§‡úxæH­Rá!Ú‰¹¿ÚþöÏûæŽsŒø­àïøFü?¢xƒRžTŠëíÖ›·¾×·vMÿ?˳䯰×îfÒµ†¾¹{›™`‰-ŸËOÝKæ¦ýßð õë_|[mã§Km?UŠæ }ëxŠ¿ñïóî¶ÿâÙ÷~íyÿ‚ük­ß¾Ÿ©ê6Ú}•Ư}q§À· Iò,Q3¦æù÷·Ïò®öþ ‚ÏZ°ñä ¯hgá;H|‹;tkˆg¸ó[äùÝßÍùwÿ±^A~—ºŽœ¿e[#u-ÍÔ»öDÉä/ÝGù~Vù%oŸøk¿ÐµÿáY]Ác¤G5”±Jë«Mgþ—±~çï‡ï§ý÷^Qá¿>Á|ˆ§žÍïbd‚ãîüß:ÿß/ó¥/1ë¿ü7>½wqå_Ka-½´I?Ùsot}»‡îßuéW)¥\ü;¸•¯¼Amw¥Ê±}’V‰íåmޝþÒ¯ÉüÃ^ðsÄíàmgÏÔ'ŠÏOÜèÏ3?ýñÿŽã•ô³è:WŠ­e¹¶hŸí°>íûöKò}ÿ•þõÁ5ï{§’i^!¹š$h//tؾgÙi/”‰óÕè÷š'†|/¨jsÇyo¶W[I¾ýºìßü/þåv~𖔞Ó/µ;˜žÑUauÙ¿ç¿ýï÷¼Ëã/‰äñçœÚ4ðÜÛÚ§•-º?Ïoï¿ýß›ÿ¢\¤Dã?á$¹Ô¬®ç¹‚ÑöD›Q<߼Οí×¥h—Mà7ƒÈžçVm2TTMû-âòŸ~ߟÿCÿn¼ÃOðôóiŒÍ £-Åô«KöTû©æíù•~mÛ«²°š°i²Bï¦où?Ú‰ÿöZÚŒy¤9K”úCþ õ§í1¦/ßuÔn—ÿ$"¯üIûßX¢¯üƼP¿øå{çüîþI¿k±-é±j·[v|ÿ;Zºýÿûe_:x‚êòOËu+o²µñF·o'ßÝ*ný’±ûe±má?øI­}+]Öå‚Î+Ûû¸o¢·t‹î>ȼ§ûü{ÿޱ4H|+7Œ­4Í?Â÷vrÝ$Oâ(®‘·:lÞñ[ÿã•…ãoêZ?Š!ž Õ ú*ÄêëüîÝ\äÏw¦êúf§l¿¹Ø²ÚìM»Õ~ú¼Ÿ5\¥ÉîŒú£Ç—:R]Yiø^õî µýëÿl|þÚ'ÙþZå4MWC¹Ô®?³ü4¯p°®šýŸäÙ÷?Õ}íõèzT2øŸÁ¿ð—ÛD©on­ÿy©*ý×ÞŸÄ¿ßÿì+„›ÃÖ<»‚Î+K n¢ØÐ¦ç‰øöW5›vêá£êÒË>™cËüèþs}ϹRÍ Î½ã)bÔ$W–ÿý ]þDÜßqÿu±ð‹RƒDñ±¦_\¶•qäJ‘y˳÷ñË'þîõÞŸï"T ¥©^j·—ò´öqù²¿Íó}Ú®óOg+´ ¾víí±þãסx†ÎúÿKE¶Š;›x™¥WÛ±þo¿óÿÀ>çðüÿß®7JðÝæ«=Ã&ØU÷²¿ðÑ(‹˜ÅÕõ[éµ½7P–ÎHexšÝŸþ~î|ßú bEáOHFiínaŠò-±<±2oþ/“ûÕ»â}Uf½Š+=ßÙöHö±?÷¾ûÕøª{Ë[Ei[äù"ù¨¤és ¼ó®Èb]ûݾyÜ®^Ù6-¿ñ»NŸú×WymšêʾrEk•ç 4[Ÿî×5xEŠÞä7Éç¯þ€õ´©Ë—˜Î'íÇÄ/ù$~ïùóÓ¿ö•}k_?4ω³ž•â#ÏûÅ­œJ—lux¥HŸz¾_jÖª ògìXŸñ ~÷üŠö_úQq_œ¶%þ‡cûMøÚûÄ ©Í.ª·ötVJžV￲_âûõúMû#ÙÆŸ³§Â¹cÔ'†é-hÿÅðû@ø©ÿ³ÓÓâîƒònøs¡?ýµ¸ÿâëìÔý›?d”ÿ™ÚÓÿõbÙ§öIvOø¬ì¿ðG/÷ƒÚÓÃâôøÁáíŸ7Ã}ÿí¼ÿü]ð·|5·oü+M%?ܼ¸ÿâëîý¿dÈÙU¼Y¤ÿàö¦‡öxý’fGò¼U£>ïú/ËÿÔòÄ9Ÿüü>ÿ…¯á}û¿áZi?wfϵ\SSâ§…Ñ·/Ã5>Wÿ—ëŠý ðïìðÆ–ÚzÓê–NÛ~Ñe©´±nþíPÖÿ`ÿÙãÃ×ÿcÕu©t«½»ü›kÊ}Ÿð*®RíÿOÿákøknßøWv;?¹ý£=W›â§‡7§•ðËK›þ»jsÿñö~±û-~Ê<©þ:ß+n}–š×Úåûÿ"ïªZoìáû"j»üˆÑ¦ßùøÖ¼¯ý £”¸¸ÿÏÃãY¾%øiÛwü+ -?î-qÿÄS“⎂Ÿ*ü;±Ø¿u?¶.?øŠû?cÏÙ6J¾?×z»øŠÝÑ¿ïªö'ý›®[÷^=gßýÍvßÿˆ£”/ùùý}çÃÿð²ü4ëµ¾Úàâ_þ"øX^Û±>Z'ûš´¿üE}ÖŸ°Àk”ýÇŒo_ýÍN'ÿÙ)ïÿèø0ÿ,^*Öð:/þ"ŽR¹#ÿ?ƒÓâ/…áYV‡pB’®É|jTóWûû¯™iŸðžxAÛæøsÝÙ±5ÙSäÿ¿U÷‡ü;£àÚ3ÿÅY¬§û÷‘ñ^oø'¿Áˆb¸‹þÍB5vo{Ë]éþçÉòýÿür®1þñ59}Ú‡Í_°®¥¥Mû_iQhpGai~Ï{>˜›ßì »¢'šßëwù®ßì׆ø3ÆÚ†¾"kÃYÕWB›Kñ£{mpð=ÇšÒþáÓåGÚÈ›Ù_ûÛ+ô«á§ì©ð‹àÿ‹ì¼Ká¯Åg¬YE³Í–úÕüß“n÷Ýü[k—ñ'ì)û?kúÜZÍ·-ôMIX<òÚj–î—ß3;¤»×æo›ä«”c/w˜æNYsé¾*ðMå¼M/€§¼Ùò}¡õg‹ÍÿmʧÍâ"ªÿ¾¾tVÞ¾Vµ÷?ï¤Jû¯þà´ÞR¯ÅI~DÙ¿ûFÏçÿ~™ÿ÷ø:íÿ%JçgûÖUŸÞ7öœßj'Ä–|9mkö?øC¼D–J»Ýw}¿®ÿï«:¾R9¿½Äø‰5/Ã,ÒÅá$¬ûÙÿ´`ùª½äžÔ>Ùá­vm¿uå¼öWÜðíÏÿÅ›—ÿÀ:wü;gÁ?ôU®_ÿhåþðsz?‰ðÔÇÀ÷+Ë ø‰ÒÚ/*ûTå'÷çù~óSôÝKÃZ"íÓì|Sg6õHo Mÿ}×ÜðíÏÅ)ßþkÿÅÕy¿àšÞõ_§O÷âÿöz9¼öôây¯<94¯/Ù|Iö†WF•çƒø¿àuRÎ é·öú…·ˆ­¯mÿÕJ’Á½?¿üuöïü;OEuù~)7þÛÿñt×ÿ‚eX¿ú¯‰ÿù#ÿG(ÛÑ>›Dð…Ë~öÛ[Ûÿnÿü]>ÎÃÖím³ÅØ¿,ÿ¡=}·ÿÍTO—â\þþœŸüv«¿ü6ùeñ6Ûÿßý¶£”9éäò>$Ô´j·ïys¨÷ ÿ-¶ÄŸû=.·c¦ëÚµÖ¥}.«yyóÜÜ?•º_÷¾zûQÿà™ZŸðüH´ÿÁcÿñÚ‰ÿà™Z÷ü³ø‰¦ÿÀôÆÿâèå‘|Ÿôò?ùYíÓbò­µ=]"û÷ÿgªóiVÏk, }¨yR¶ùSj"7þ?_iÿôô03}¢ãÍÿ¦Jßuk¨»ø]àt²•[⦥pëþ©Î›ÿ!}ÚøƒAø…ñ.Û^²—PÕdþ‹ä—OÓxoR¸Óõ_[]ÙÊÖ÷V7zÄI,R«üèé¿r¶êµooñ£âdº®¿¦Ç{¾“mæê7ze×›caÄÍæÜmwÛòÄß3ÿwýš~ñ¥¤~ŒÁ>õè!ý“tûbæ;=)5‹ô¹»¸¼û.Ö[±.ÿö›åûÕ䟶÷‹¼Añç–v³^xCUÔ`ŠÑ-â¸I•—ý5·?ðüË7Ýùk×?f/ Ú|#ýŽï4oé âh¬µfGƒI±þ×Ie–dx§Dÿ–ª­*7ü¼ÃöŠÑüA£þÒŸ­ž÷JþT­òy[ÿÝÙóýäþýy¾±ðľ½Ô4­Â~ ¿Ò´ZëL»KíŸoóÝ7üŸÄÉóýͬ»ß öÏÂZýͬRÛx«[HeT•v,Iò7ü¸)¼|—^Cx£Çé|öMû¨¶|»þ÷~O¹÷š½#Fý•ôû/AžûP×í®íìg‚x~Ó÷~ÔŸ½MÊŸy7¿Ì¿~¼’çáG‹ô¯6ÚÏÂ~${}._ì(/•<øúB§ð·Üùþçû%hE¼ð¯ˆ]._x‰ö|íûÔÿâ+Ï,üH¾$ºÒ­¿á!ñl2ßï‹ý.¶DÿÀÿ}§ûµéz—컢ºj ÿ ³¾}%t¦tS~×ÞÿŽýÊò‹oø—[¼´Šç@ñ£*éWR}©]lÒ-Ÿé7ð7Ï»ø_oË÷èS¥×¾fé7º…ö§¨\ÅkË*%»»íþçÉ\f‰áÅZµ¾™my|—¿h_7Lƒgñü›×ýÇÿf½cXýœXµñ,úF¯¯êZ„¾Eúiö÷;tIµþ¶¹Ýàoõ¿ÛÁ¨xsÅ •ä¿ÚÜ<ë*Zºïý×û¯±?ÚùÓïl®¨áªU4bDªF⯃–>Òïuyõ]I"ù~Kh¾oŸjlù*ÂVzÅ寙§ëWÓMÙwÝé‘|êÛïÿ±½+Ð|sð Qð“-ô~"Ôµ Eµx´Ç•·Ê’üŽŸíÀ+ÀµËÿ[Û_/‰´«Kx>Ûö»¶ÿ[梣»ÿy7¿Üþãü•Í(J_ÂdøŸÁÿØ+¦6«ªÜÍʶ±$:tRùKó¿ü~ýRÑ<+ˆb¸kC‘;ÄÞn˜©¿çÙ½?Ùù¶üaðŠûÀz&ym}â/Kf²Ù5¤M½öK¿cìùþ㼿îÓ|)ð×Zñ×lµ-O_ÑÊÓþÑsò½ë¶ÿÞîÿcäþÿßM›i”ÁÕ|=‰ªZXÞ^,/u¿k¦ò.ßïüÿîSôO ÂI¥Å}§ßDñ?ÉåM§2:ÿãõ£ã/†Ú‡†µm:kýsWþÔ‚-6YâO4YËÍ“üÛ¿ñïî?ÏLð×ýWÆ^Ô}gVðü²Î°­´ÑyNÖwO7+|ßíµ@rûÇ=ªÙÙè7Wv×Ú„ -½¯Ú·ÿg;£/÷>Wûß#ÕÛ? ]l·¾³Ô-¾eIbtµ•6·ý÷÷“ÿd¨¼[á-_GñF¡mη~÷¿ñ2[´ƒÍò¶£ï‹ý×ÿ€ýôûÕ¹ xW×t'T:þ£§*ß5ÿö|ÐyOço”Éÿ~?5Ëc޼š+9u?>ú/´ZÊ‘JŸe•üÖoî|ÿ?ßJ×›Áú‡ü²¼¶to¸è²ìtþÿ߬=OBÔ‹/ú+¯ßùö÷êÇŒüâ[ÞÜêz…ΞMCì“Zº?•ýÍŒŸwÿù*冫~qòLÒ›âGµ[˸—^‚gŠ%•¼˜•6£À+ RñWŠ¡–%¹×'O´6ÅÙ;ýÿøV†!¾¹×6Yê£ù_mùìÝ7[¶ÏÝŸ½Uuí+YðÅ–›>§ª}²(X™ü­Û™¾ãÀký’ì:¯‹/âXOý–¢Ñ­µKè5+KmJÙ'Š&·vH?zÛöJ•Ÿ¬C©YêiÍôï-¢·ŒÊ¿"·ñßUkÙø·â ÖñOmãmgÊ—îºj×¥ãÏùO¾8Ö_ì«æË³X¸M»¿Û¬û;mOUÓR[ËdD•|Ÿ¿±~úT>MòjW±\ÏmÿKq+¼OòEü òÿã” –'G¦üBø›¢y±Eâ­K÷©ÿ/‹Ü|¿ð$z_ø]?|§Eÿv·öv•UaþØ—äÜÿÁImm-µÕ»^Eö˜¼†Ý›³÷¬Ÿ'û[SûŸÞ®?â[·ü#HÌßvéh/–ë5Íü÷Ÿ³·†µ_´Üÿh\höÜyí½¥Mûÿ½¾¾Õ¯‡ôßù4ß6Ýÿñ"ÒÿôjWÜ£ð¡SøO¼5ýšß²§Â;oOmgà™¼7aý±}s©Ë§}•×{Yl–/™¼ÙþF]¿v¼oâF£â-Söùø#uã =3ÄòÜé}cc?Ú-à5öí—øÿuµ··^ùðæk«oÙ³àÞ§gm©k aá»Vºðö“gÔº¢Ëº$ýÔ¿.Ûwýîï½^ ñ+AÔ|?û{üÒµ_ËâÍVÖçNûV¹:¢=ãý¡ÛæEùbì_—û•Ñ_ø¯üFhýðˆ5=kMÔóÇñV£¦ê²é÷w²kXm¥EMÖ²Ä×W,³£Ü¥Õ¾tùWoɯ‰¿ ¼UñKöƒø¼|1¥ÿiý‡ÅŸûø¢Û¾êãgú×_î½}½ûüyÒ>!| ¶»ðg€D:Ÿ‰îô´ÓtÛ/±ÅhX%Ô’¤fy¬²\¼«åŽ7ÈÜËË/Á´ß„5ÿê߬|=¡êzÝüÄ–ºmœ·${õuݵîüÉÿ}W…„Ö;çðû¿iöìô_+ùšF´*ÊTañGw¿ŸRKˆúÄÛ#ðÃÃÑKªøž}:ËK·²‚H¢Ïb×RÜKûü†V]ì­Q;}¢_Þ·úC_ø¯Ç/kßõ› +Ä6?`¿hšãÊóR_•÷•ÛûµÄÃ?|Pÿ¢mâïü]ñî?4ëM#Åž±ñͳYµ·ƒô¸¬m¼AâXÅ:ÙZ«¤éïÕ?ãëýWü·Ù»åókïxnj9o¿äÅZ/ùÜð1_NþÓŸáø‡ðÛÁ6|U2›I o¨hÿÚ:Õç*Ä¿éâKËh#ù¥k¯‘•¥‹íVYbò¢¶ù«ÇßÙ—ž.Ön<=g5®ƒ5ä¯ao)&X-÷·”ó7!vÿtûƹ淛*±í÷kïqù¤å‹Œ¾­/Ý~¿öïärÆïÄlŒW´ør>çÄTZ¬¾N•-ÌIy/šÑl‹Îû–)Y~_ãH¥ÿu¾íqÞÁ‘øUÎ?·‡åîóþÑþ©~Ëö]Ÿºÿ_¿Ïóÿå–ß+ç®ïã'ÆÏøSá—ƒ¼ ¤ë³XxgVðüÒßY[Å<¬úâ>eÛæme‰”6Ö\çïµyaVU£AÊ»þ…áίâÎá­.-5ô?°Ãx÷:ŠÜÃesæªD·N¶ïµn.•~MÉ»ÏmÊ‹òíÙuu jv_ ÿ³u‹ßxKG»ÖlX,|C¡Kªþãíýeq¾ûwù¾þß÷ëÏd¯‹^+øñgÃz/‡õOìý/Äšæ™gªÛýš)~ÑÚ6mÜèÌ¿,²“oÞ>Õ±ñ;P¿Ómül|kÿ aÇyŸÿ]Kþ}ão»þß÷«óC°ú Ç?´6™ñ§ÃÚŸƒtmOÀ§Ø~Õ`“hÓ¦­kö8¼ÙZ+¨´ÛXÞ X ûŠ¿gµŠ?½¹ÛÐa¿ù7¯ÚŸøÿâ–_ý%ԫㄚ¾¥ãÈ¢¾ø†|YÒµÇBâù·öEçï/û?Þù«ïŸÙËÀº7€¿gOÚ1´éÞ+ûRîq§®M«ýQí½þVþ—ÊŸåo6¾]Ì ¯ØÊDÓÿfŸ‡¦k$ñ•ޝxú-®§¨ËeosDŸhvÛþ·e®÷Úÿܯ;ÿ‚üHÄ?<â†þ'†ãS½±‰´«Ý2]îê¯tŽéòÿ¶êßï׸~ÎV­©þÌþÒ<4Ú½„·^S¯‰4ËX.M–+XžT7øeØÐÀö׊~×’Ç®ücø?«Çáiü!¾=9bÒu T†[_ôÛÑlO•wmÝZËÞ‘‘å~Öÿh* ˆï¼^·*ì‰.çØöïýÿ‘+[ñoÇ}6ý4é~,ÁavÊò­¼×Ió"ý÷ÿU÷k诉ñ·àýB/Oiaâ Èö·kòlßóÿüÛ>O¹_?üWÑ5ÏxÂãOñ«¡^jº•‚ˤÿĹÞµ]ÿhGÚŸ{ýnϽÿ£”R;?k~:Ö4½æ_x“R‹ÊGº¸±Ö-|©[gß‹ýåùÿ¿^âOüV†ÿ]Óï>$Aýžñ4«i¨êÉoqo?Èîñ"7ýñ÷·×Qð÷Ã~:ñ'‚âÕ|!©èÖz,ºŠ}• ŽÖ«¹%O™æÝ·ûÛ¿ƒeqŸí§Ð|[­ØøžûFÔµˆ¥ûmוbÛKþOúk÷~ÿý÷G³»Ês·? >&ÜÅëâg‰×å›ûZêTdÿÇêŒ>ñþ-Ä ã­eX§Iuž&o¸Ÿ5{Ÿƒ<1ñXð÷…ï´ÍGB‡B–y_Êò>v³ÿ–_Á»ïoÿkýºò-aÿ±õ-BÛÄ7š4ÚÆ›uÿ׊Íÿ×·ú§‹oËü6Í­þýDbd؇Aøá ~ëÄvNû¿ûUlxXñé–K¬ø’ÏQÔ>ÑöYn!Ö¢‹ÍŸÜÙö•«°Ò¼1ñZm7Jkí ìòé·÷éö†ÿwÿwfÏýž¼R{>ÕÒ/´é2ßA+YK¾ÖTÛ¨ï}ßwîÅòÿß[þJ¾Q|'ªøoxV]B_YÚxµ%fû/›}ö_³ÅþÞÛšºkoŠš~¥¼Qx3I¹ûlN‘}ŸÅ?ëWøö~ê³üIàÿŠk¬,·Ú&ÆÓ¢òàWÿHÿ—ÿð ÿì׊h÷6ÓjúRè2é³\O*Å£ïÑ÷.Ï5síûû6#ü¿sç¯N†"¼c˘ԧÔþ*xóân·o¢ÿÂ+“àm3FÓ¾ÄÉ-ÿÛ|Ø—æGw–/—eyý¯‰>:\Iå[x×@¹“ÈûFØV&o+ûÿ*WWã­+ÆöÞ×äÔ§Ñÿ°’uwýÆÿô=¿½Tù¾öïþ¸Ï\µç- ÐÚÑïgg–'š'Oô/Ÿïî½÷÷ýÖ_Ÿfï’¸«JUåÍT¸Æ4½Ø–õ/üv°îoåEо5\«´:‡‡¦ØÍºÇÊëü?ïUïYëúU†?ŠRÂ4ò(vÆÜ_6ýŸq›jìþæïø AàÄÖ®lµØ¼/‹ÝÁÉ|ÕØŸlÞÿíÿ¿ýåoö(å'ñ?ÆØeоðç›.ï*±om¿ÝZbxŸã]ÌjI<7y üé*¬Nþí?ÆpêöÞ ·]N-=5 ˆ"‹LM¬›ÛäûFæßò¹þçÏV¼%ý¹yáY›ÂöÖd—‘$Nëü?ò×äÞŸììŽôr7‹~1"ºËÿê:¯šÉ¶-èŸßÿv‡ñWÆ$Uo³hN­óïÚ¿?þ?Qxµå¶ñ±«¤7®ÛÞÝÿ ÕßþßÌß÷Ïñýêè4OøHît½ [=>ÙôÉemß6ÿÜñ§ñÅÛýÊ9C˜åfñ·Å¬Ïg b&D•>Vo¸ó×±|øß¯xcÁ¾(Ðüc¢êIq¬´I÷…§ŠÝàUÿmŸïn¯ ¹¹dûGöœßhŠw—SH¾âËÿ,¶ñ7û•ÛLþ,Kx¶èöÿæùݾõ×ð|ÛÿÜÿ{ð×N´¨OÚDʤcV<²;«Ï‹º-Êî~%\ù¬ÈŸñ=‰ßøëÌÏå@Šÿ7Ýoõ¯÷ÿÞù?Ø®ÜN6­xòÊ(Æ9ßÞx‡ì¶ŸÙêJ˾T—ÊùçùÑÕÿÜ®^æçÇ_zYnÑÿÛ+ªÒ¦ß«Û¶ŸlÓ;.Ë=÷í~}ï³ýýÿ%ßö„Ð'öž™¶Ÿöí’ºo}/Üÿ{ÿA¯'”ì8Ä¿ñÆ÷_ôçþ?õ«VáÖ<_ ÂK<ÌŸÜu‰÷×G¥\Þ}¶ïʳ•å—çºØÿu6'•ÿ²³óÖ}ÍÍ÷Ú4Éu;%¼‡•Sî¥|Õ¡ÌE¦ø“Ä3$¾mµšsÊwÿÐ^¬x“U³ŠÞX,ã¿wWóÓ쮞Wþ?óT¶s]C¦Ý­¶Ÿ,Ï»ìâ¸ßó§ûßþø¨¯íõ+ø—Èä,V©æüïæ§Ïÿ|ì”{DñœOapš†•¨%ÆßÝ%¤ ³ÿzäu„Ö<[°O§®•oy«q3=wzlNöQ4±[Z<­K2»ùQ/û þ¿²±ümóøWUþâ¢ètOÕ 6~Ê^ ù[gö.šŸù+íºøsÃÛŸöCð.ï›@ÓôjWÜt£ð¡CcãÿÙûƒĿ> yÛhYø^tˋ؞[xÑ’ëîº6ï)öÀ«äŸÛÃÐ|ý¢þ·ÃíË X-Õ¶÷•"ùüØ·»of_7Íûõö·ìa`Öß³ïÃ]U¥ó’_ XZ¥»¯È›ZVwÿïOû⻈üñ/WmW_ÐRïRdTûGœêû¯){IršS§NU?y.XŸéÿðPÿÚ:úÞ&ÀÖ×Né»)þ˶¹oü_Õî,µ©¼E¥xƒAÖµj]^xtË_5šYet}Û>Wi[î ~‰h_³¿‚|-sΗg©XÏÝk}VuÿÙéÿðÏÞ }Uõ¶Ôžõ¾ô¯©Êïÿ¡×™Z…Jôùeÿ¥À>›ŠÀà*Ê¥KáûQÿ‚|ÿ Õn[þ=¼Zî³|6.Ÿû=yŽí›â/ þÒð…õÞ‹™]5 »;׸Wm¿}b•7nÙÿŽ×Ô?µWÂýá÷ííô7í(<)u©-¦§|ßgkˆ®>GvwùWïWÌZVªÏ©\O‘¥ßêwVv §Ê›4ËTo•ü«ÿ;}ÇÙþÛýý•ž ‹ÃÔöô'Ë/뵎œFk—â)ûBR¯/á©Ëêß ­í¬­[HødÚÕij²ÏÛû"/à}ÍqónþíROÞ#ÔŸýàÝÊnû»'¿ô+ŠêáÔ¢þËÔ,m ‚k/?QŠó[¾ƒÊ¾·uMéö[}ÿ½Ù¿ÿÙ©®¼_i.™e3ØÁa£Ú.uŤ 6§z²üŽ’ÁæîTß¿þøO¿¾½Øæ9×ÛÄËñÿ3Åÿ„¯ù÷/ü ‘cû|QÖ†û/„·ìžîßü‘]˜ýž¾;Ùi–w¿ ã¾·°F·Œ^ø_KÔ¦‰7¼»Y]ÛïÊí³ýª‰þ ê6z´W‹mcm{»Q·³Ñ´û†—Ov‹æGº¸Y~WþŸÿ§ÙüL¿¶Ôî¥Km7PÔ.%Ó®'¶½¸h´ËX§D]°Oæí•·À¾gûû+Jøœ^"1öòæÿ™ÁþÍÏîDÒÒ¾øãIñmª¯Â«o}–_´G¯ßh]ª@éó#þëMvVÞŸ.ÊÂÖ´ [Ãþ·I<%e®ÿe«ÚÚÛÝiöw÷~Ðíµ}5Ûné]¶»ÿK£üHm*×ÊŠ kû+_·Ë>¡­ÚÿÄÁ¥ƒc~êÕ¥ýêÿ{ý÷û›+ ñeÞŸ‚´-gPƒû6âëXµX¡ÒtÍÒÜZÏü÷¯û¯Þ£ìO»òy¼¸Ÿ³ÊtÂXµàKü5Ó|MªCÁ‹á©ÒŒ°Kϧhºu½ÂÅ*ø™àíág‰5]/Ç:WöKÝ=â£Ù¯Ùî"‘%®Æÿ_ýåû••â oUðö¹ k^Òtß&u*èžFý3÷Nìq;¿ÊÛÿ!E³fúvŸâíüC¨Eo§h—7W–q]&¡Ecd“Äïþ„ûÿzß¿Þù>Fß]0Œ¾ÑÃ>^opûö=ð­çįًÃ^»µÑ.¼/ô¶úƨ4©*KQ4^W”ÿ#%Òüÿð:à?n¯ê¾Õü%¨x²-'Rñ^—§Zê¿dÒZTŠòée–-‘|þjÅûÔgÿr¾rÐ|g(ð•Ýœ°[i‰au{.£v¿eÕ¼Ø%ùÒ+7s+ìÙ¿ñ¿Î›6V…÷‹åÔïôvÕm­¿u©ÚÚÙÍeŸwz’Äþž»ÿq¿gÌýù~O—uT¹¤fhh?·µå´¯.µà/°Z$_ºti_{ldþ:£ÿ ÿsuö `¿x•’)wJþÇÙòÖSøþî[æÓü:÷²éŸjmåmå¸ò·ý«ÍûÛ7ÿÀþ]ÿÃ[¾¼üM­ØÁm§Ì’ÞK³j6hŸeÛnò§Ø>ßÿû?º‹äýíO,ÃÝ; ö´–óA²¼=á½)v+i×ßÅöUÞÿëv[íÿoä®OWý¸í-üM{e7ƒ¼?~æ6·MfÈÏt’Äé»b«ÄŒÉ¿ø~JŸÆ·+©| ÑüG™5´W°K-ö£c¢ì»ŠãíH‘D±DûvùO¿ïÿmsZμÓx‡IkI³ºµ¼º·¶²Ó-ѭ·¯ÛÛî7|»¾_—çû›jå…7í™ãÛ™Sì6Ë /È©o û›êý§ZâȶµŠñ´Í 욥ûÅç\@¾TMötgK'ßûÕGtÛÿ}|ûê¿ÆçÃÏâ‹?E¦ø~Â×íëv–¾n¡oq½ÊOï+ïEßü;þÿÉ^¦SO–1üÎZ”#9ssñ/ã­›øKÃé¢è·?uXšâ-Eíô–Ób–&ù‘þã¯Éò&ÊòË?:¾šÑ5·Àû›g·‹ìðôoûê*¯ÆÍVÚYgƒàÞ¥mq*¬M,RìvUû‰þª²¡Õb¶mcJ‚ k——QÔ¢ŸP¾îÏl[Ñ,¢ßûÝŸ?ÜþçðoÝT®¼Og/‡ì‘â‚ÏL·‹N¸]NÒ/7Sºó]ÑÒâ-û•>ÿýðŸ}qòÈØÚÔ¾4êÄI÷Áý^ñ–UI[z#ÿߪŠÏãeöš× mð‹W¶{†ógò~O5¿¾ÿº§C¬¶¥âIdÒ´ˆoZ-J(4›²é’ùOòK,ªÿ+±þÂ}ÝõØx>ÎÇÄšÚXϦX½»ù©²ÒÍ^TÿEyÿÑþÞüßøí p·ÿ®oç·žóá&¯s, ¾›çx¿ÜýÕ2Ããdú=¯‘cð§[³·ûþTK±7ß‹¢ðî+•¶o섳yeךûkη ¾/+û»øQÿØ«Wí´úµ‡Ÿ§éð—Ïkg ¿Ì—¿ºF‹í_óËþý÷þå²÷¿⻸{›¿…:´÷~[ÛùÒª»ìo¾¿r„øåö;t¶µøs®Û[ªìXSî'þ9Y±k±G+Ý /K›R–Æ ÛO™öYD/”ïûö³ñìS>ÙkömBÎ ™|ûô¹¾–$K»V‰7þê/â_÷>íð{¡©|QÓõ)n%¹ø]«<·[wò¾vÛ÷?‚½ƒàGÆ ÞjZÅŸ‰t)¼>í§yZcë/uŸü"§ð×ÿlYßŧ¶Ó[?*î(¼Ùn¼Ôÿ—„ûËÿ³l­¿³E7د%³ÓÒ[‹WßoÏcnËq±÷ËüL‰ÿ WN´¨TC‘ŒãËÌzlÞ-ðÔ1nÿ„«ÀÑ‘Ûìþ gùÿÿÕWšü\ø³:Ïa›{câÄ)ÓLÑÞÁ ÿ®»¢]Õ>±`©aéúTS;ÝKó"þö(¶;ý¡ýŸð:à¯5‹tÑRYUa³ŠÚ+‡Ô63Ü34¬›e‹ï*ÿµü[?Û¯S˜Ë^Soe.nb•þ½}áˆ!¾ƒAÓQàÝ_d¼YeOøü¹ýKã§k-µÎ™ÛË÷’Xÿˆ®¶çQUÔ¢•ôË[uäPX£þêëÊ]ɺ_á÷ÿöz‚Úò'Õ|ƒiis<íf’Ú2mû*ÊŸ3Äßò×ÿf¯Ÿå;ýÓŽ¶ø©-ÓκfŸm+*#?•/ÝZ}ÿÅ5W·þг´™"mÿ#J›ñÊèþÍô?– g`–VÔü¯ô…e¸Û·Êÿwø¿Û«SMc=ý¬³é¶)ºåíâ…?Õ^~ërnùdÏÿ³ÑÊᛣüBÒ>Õ*ØÙÈîíæÊï*ìwÿ=XÖü[¦Ååj6mò3À¯çÄÜzf›µÎ Ë=„Ò˶žñ*yJÍ÷¢ãÝ÷àuôÇìÁû%øWö—ÇÛWÚ†›o ßZÚÚÃb¨›Õ¢wù÷¹AÎúŒÎ¶Õ|KöYm[Só™âŠÝfû»º¬_:lù*¾ýVÚâ+˜®VAe¸¸ûZYÁ½üß¾û¯÷?ïŠø'Ãן5[ô±¶ñ¡5ÛíómÕÝÑwìw}¿7ÉüUÔ|BÒ¾)|4µIgÕîntûÈ%O;ì²üŸ}6;ïÿ[ýߟø(ýçò‡¸}°ú–ª–émçÁm§²Á¾$±·O7Êù‘ßäÿ¾«ææ•Öó˹´inmæ±·x‘¥ûûgÿ³¾¾?ø]ñƒÅš—‡ì¬bñžlPlo´i\>ÿ÷Ù÷7ü·¦ø÷â[x¯ö³ê6r½¿Í±Þ „Uo“ïÔsWûT¿òbù©ý™mkš®«~òÜÏ-ãî·yRâÕeó^/¹¿r|ßÁÿ|%2ÏM¼¼"h x¢YR(f³‰Ò/5÷|Ÿ'ýñýÚùWGý¥ ¿Ô’)t? BŸóÙ4ËÿþM«$øýáËo*(­´)®7~þÓ5K}¿ð5½ùª}®'þ}äȾJóðúµ4Û”¿þÐh—ûMeŠU»û,[þTÛ±>O»÷ÿﺯs£ßmuÛþ¶ måxmbG•%}ï¿äûÛ¿ô7¯—|Sâý\Òt-g^š? x~+•óåðÚ_ÛÝϺ)|¨¾k§]ŒÈµê÷ÿ°‹ïÝjújyIòE¯ÜJ›ÿßd®º|Ó½R%ËödztÖs½Ã¬¶Ð}ŸÏ[²=Œ_gÞ©·~ÍŸå¨{kĵŠU*Íí`wµ‹|I¿Éò|¿Áó×—ÿù|u²)[â·³w̉­}Ïö>åa|Fý‡#:Nl×·ÂËTÝ*Ä¿j²ífTþâ«#”÷Ôñ‡Š,÷ùZ„ˆuöÖ‰ ‹cKåy_?Éýßýª}³U¹µ{iZ$ŠXÞTû ½U÷üÿ'ÍÿÄׇü7ý›<=ñËGÖ?á_x÷Ä­¾äZÏ®]êw¾mÄ©»ä‰·ýÅûß/û•ªŸðN/Þ?î¾"k)÷ßcêÏÿÄP§¯My}¿kEÄ“Ëp–ïcÄiSkü›?ÎúÊxo<ˆ·m¹x"‚(®%³‰åO)÷¦Ï“åÿÙ«Ï¿áܾ/û,¿5Ù®?ØÖ>ÿþ9^ZŸ |5àŸÿÂâ?x¿Rø{ykkc¤¥ä©nþ~Í’ý¡]>_÷ïMß'ñPÒ^v¡ ×Úbò7·Ÿ½ÒÎ-òù¿{ìÿ¾*“ßß:¼^U·ÙÿÑ÷[ý†OÜ}Ï“gÍÿØWž_ÿÁ=ZÓø—ÈH×P‘ ó⸖ßʋʕ•6ü˲¾ñ¿ì‘ÿ wL°ñ7޾!ø¢ËÂ’ÏSÝÛj?hò·>ÔfEÚû¿»÷k?ÁŸt¯–ë^ ñG‹m¼?òÚÅqq¬yOtÊû]öJïµ~zvaÊ{lßiÿH_*ô«YmeÿC‰UgÜûþO™¾ÿýöõ4:•Í«ÙýOû'Ûëìói–þR¶Í¿sÊÛþ×ü¼’ÿöñ\m_x¥62n·þÖMñ'ÉÿÅÓöñÛ6øÛÄßßg}b'ù>z^øœ——ØZZ¬P?ÙíbµŠo°Û»¢«ïMŸ'û”ɵ[—ןUò,RíÚW—e¾öóSgßÙþÂl¯œ&ð‡õ/ËðïCñO‹æñí¯žº‹ê:ƒ$V¯Ìï½Ö_áÛ±НÍû x¾7ù~ êJ‰÷Ý5mÿî|”í©4¶q\*ÙÚyW y_a‹cùò?Üù›ûßÞÙUÝîa·Ûú4±}£mżDëæýý›Såÿb¼Wþ/ÅòÿÂÃÕŸoÞÙxÿwþù®CÆ^ƒàÞöÏx¯_ÔRêA˜³¾%¶|Ò«íÛü?v‰ô¿öÅöëFUýÕ­ÔWK±DÈílþç÷>ýfMs.û„k;M—KnÈ–vèÿ3îw“æoþ.¼^Ãöiñ>½§C©Áã nÎ+ÅKˆ-ÞûçTdÜŸïüŒ•]?eßíyãÝIÊW_&ñÝŽP=¡õYþË4Ùúk£Þ=Ò£éÖ¾R|›vlò¶íûíÿ¬û›ùf‹OV±²ßg¼K+ØÀÎÞSïûû>]ÿÇ^Tÿ³ˆt§ûLþ3Öï, óeºŠí¶%ùëÒü)áÿˆ7/á/xÊ[;/).¥-òïmì»zÿÂ@èšóCâ9uuÒ´ýì·'ØàØþo÷ÿuólþý’›‰ç³Šãþ%ú_šòÛºÿIJ×by_ìù_ÇüuáZ—Âÿ²ìÛã™vïò·ÄkÿË_áù?ïªÏ’æ(¼ø…娛ç‹c|¿'ñÑÍ0>Їâ/ˆt­]>ÆuÓ~ÛkqkuqoH÷JþkïÚ••⯴øûV]+OùçiZ$±·Þߺò¶oò¾ïÜmŸwux®¿á¯ xbÛOÓ5Ïø¾ËÄw‹Á ¢-Çš’ý×]׿{ø*¦¥à ÚãʋǞ6}Ÿý/üwý#棘W‡Uû½Ú˧éïæÅJŸc·Ø»_výžWÌÏüoüU^ç^Ÿì[VÎÑ.÷\Kö¿±Áòîùby_.ÄûŸÝþ •ä_ðŠøks«xÿƉòý÷³·Ùÿ¥U­¥xWÂ_Ù—×—ž8ñlÖ6±y³Ü5ªÿ£¦ÿ)7¢Ü~£˜£Ñ&ñ ý¢Ý’ÎÚDhXR }òùIürù_uÿ‰?ï½õCþùâ– i¢H<¨"H­ÓÊù÷ïtÙó7ðz¼‰4­ÿMKëOøµâvt‰ÞÆ-ŒË³ü¼QäéVÖ»Çþ4…øÅvéGûsÊzªkÒ»Ë.ßø˜;7úG•Ï)“g”‰³åþ?¹ýúú·þ ¾ìïños3ÿÄÇN}ïÿ^ò×ç}†Žšª¯ŒüAsdÊÞj}Ñ¿ƒoúGÍ_`|ý­>~ÌF¡¡Ùè¾+¹ÔõR[û½Zx<Ùe‹z}ÅûŠŸ?ÉAчMUfûõò ?ðT†—+¿þíu?ï×ÿV?áç ?‹C×òÿVd}'ñ?â×[þ˜ìé_B×çä?¶„þ-x^÷OÐôR½eµ[‹‡‹dO½>þ×Ý_ x©f°øOÌ)¾O„¾‹û¿toý*¯ ý“ô;Ÿ ÍÁö•H¬å_;æØíçÙ^õ¥hí©x/Â:b˱î¾è6êïü;®‘özgï_ð¤,%³þÞÓõï5¢ÓÙìå„°DŠèÿíW¯*Rœe8ÿ4Œy£ z?ƒ4]¿6•hïþÜI¾»/|=Ðîg·Ý¤Y>éQ6< ýúʰ…/6-É·ÿ®ã®Éí_šT½þÝy†Ç宩âËö³ñ®y}q§Á¯Ï™fó¿ÙíeyÛs¢}߸¬µîž ý¨~.øoÁ>ŸnôÝ2’ÖÆŠ/’$O‘~æï»^7àoÏãÿøÂÚ+fšÞ×ÅÖ÷Û>üV­qt’¿þ^«y£èzÜIœ– o¨¯w>ÿ™¸›>÷ܪ§Oš!ÍÈdø[ãG|9ã»-sÃíöMa –$»ŠÞÑKóËò?Ëó}úî>'~Ð>8ñÏ‚?kßðéJßm]>[X“lèýßøÉ_:Ãöë›Ô–x¥xUvo‡vú©ssrš& ±NÓ:ÀÏ*;ªù?‚«Ý"Qç÷¢WÕSþ¯k·:/›mk-ä²ÚÃoòm‰Ÿz'üî×wagá{Gm3OÕ­¼[ñy·n¿è‰ÿ=_üÿ±þÝZøiá»? ¢išä°iW~jý©ÞU}ïþÿýñ^Áã=+Á—ž²Ò4†ŸUñ¢Ñ[Ú¦.÷•ÚTO+gñýö•ÓNŸ/¼sJ§Ù=“ö†Ð>x“á·qák{oøJNϵÏó}¢wØ¿$»¾ûn}û¿Ø¯‹¾%ÜèÚlVövpy:­®ÿ6á>ü«*Eå#¹²ZôTÖüCðÆòöÆóEhbÒ?ä"‰åK-ªoÛûÔ_¹÷ëÉþ"ØK­ø£X×–ÙŸM¸ò-ฉ?uæìÞéÿ|íoøEHû¡JR+ü+Ð|9s¬ÜÂYªêZU¦Õx&±ƒÍÜÛþ}ÿ#ÿ}Ýû'ü)ø1âƒwI¯k"m{QûRºÝ¿ÙÞó]"•Sø¥Ø‰÷«àO·Û%½¼Aìßµå–Tv¯eøiðÇž$ðuÇŒ4¯^ßøm·@·ó¢ùí÷Êó_|¿sýªˆûÑå6æ<ëâüÿ`½ð匫§ØkðyýÿŸø?Ùûõû ¢|`ð¾·âCLYZÓeû?Û®6%»7•>Çþ%ýïßûµù5yaþ•süIîÅ:uªý®'‰í{ó¼©ò}Æþ–¾è³¹ŠþÊâ_6çÅWÚvlf‰¢·³ò’-›åÙµš-ï+§ÌÌîŸsø.QæËÝ>ðÿÅÏ Üê7v«säÛÁs-¿Û®>Kv•v7Èÿu•÷®ß÷¼_ö™øµþ üPÐô«K—GÑu+(®6¶Ë©bOýýÿ'÷¶VÙùÚ‹ØÄÓërÁâ+wþθ_*ÇMùÓçò¶·”½ÿs§Üþ öÑX-ÜöÚæÍN×ω®×e–ÔExþEfO‘[çÝóÿß8ÊœCœðÿø&ÏŒâÐ~øŽ{›k»ËÝGÄ–VðCoÎÎÖÿ}ßøU6¿Îõö†¥ñƒEK=2X{ýJþtµ]:Óç¸Ú'oÞíû«ò?߯‰ÿcÍv {àe¼šôú=¼º­½¼ZflÒÜOå&×O‘¿zË¿äMûQÿÞ¯b¿™a°DŸí~Ó?¶ãIW}CTݽÿ†-Ëæ¿ï¿åEü|¼ß|ǵøÏã–‹£èÚdZ|M­Þßì‰tëOµÅº'—÷©ü;+à_êRkßðPëÓÛJ\K ÜnùþO›gÍþí} œI¤Mª¿Øö—šœ©èÊòê–é]ŸîŹZW_7äÝòÅ^Syâ«›Ú[áæ‘ý¹man±y¿kuß-¬=Æÿ“ûÒïÜ¿ÝßüU¼¡]ø?ã÷‡<[{crÒøoÊâŠ]oÊ·Šë÷®¿&çþ?)þGÚûvV‚hxÚ}M™[ÃÉk?”¯¯l·ûB4®‰ånöäûÕà^-ÐtÏê?èmwãû·Ö.·;·Ùíì¾úoOô›z§Ù×fåÜóÿŒM*}oR‰¥ŠÅ±:K4Êñy ó«¤_ºû¯±"]›¾dŸïï¿fG7¼]ý±¾7éÿ?gA¡é÷Öiky`û/¢Ùöô­¨ñ'÷~ÿÉ÷¿¿Oý>!i¿ þZA.Ÿwuw{âMF/ôx•Þ(•‘žWw}ª¿:½\ÿĽVÛ¾ñ†«§ëßÛvéuö‹Ç–×ìöòþõâ‹äEùþâ}ïø÷½[¿ï×Uø#à-;Pñ}¥ÅƦÏk£CoŸ÷[âŠWØû~ÿö_âŽSCè?|oÑ|7ý·ÌÔ®5eIíìbŠ_±ù_Ç+ÿÇtù¹ÿˆ_õy$)µ¯†´ùà—¨úî<-òK-ûïÜŸh•bùwüï/üçþÿ?¥X[C¦Ÿ}f¾¸ŠòYlü'é]—ÊGDwò¾_—{ÊÿÞx·½_)Ÿ1ç^IßöÍø©¤ r‘kÜKöx¾Ñå/Ùâoáþ/½ÿ|Wºé_¬ntKV]Öqo•´ë¿k}¨ï³Ê_¼ßsäOºÕã_|Hú?í ã¹ñtžG±>Ñ k³}‰6E*u6|ß'ðhYÌÓXZjq,óDö®ëâi•ÒX¶£¾÷Fù¶ÿËWþ µ¾é|Ç©é_ôÍKÂw×,ÖÛ-n¥û߸ùbÞé±~ó±_7þØÞ!ƒÆžð¥ÜP47o=ç›iòy±mMŸ:¯ñ|¯]Öy²Ùj ­ ¿ØÝ'ñNß5ÕW{ü鳿Ù÷Ûî¯ÜZòÿ޾m‡ü#MÃöÕÞš…ò²}«k˱ÝfÖOâÿ}){Æ•ñ/LÑ%ðç‡'ó!¸þǰÿHx-Õ~Î÷Ûý”«|NÒ&ñƒé_/ú„¸–í×e¼¿&ÿ‘Ûï7ñwçzáüq­7Šu=$ñ?ü'ËáëU{FµkyeU‰ÿÑ÷2}ÿ—þù_ãþ>jkŸ´ÛÝÁå.ªÿÙ‰·CuÙ-¿Ï¿ûŸÆÿ½ÿwÿ|¤s—­øÛL¹OiJ»â‹N–â[ç•<©w[§É³üÍó#ü•óìí¬/‡¼ã{›•‘í"»°–xa|Ì›f_“þ껿ۯOñn¥ý¥¥ÞÏçµýÄZfùtèWÊûoGûêŸÁòK³þy?Ü®7á°ÉðŸÅv×Z½µ…•Ó|© [ßvôûß#ü¯¿jìþ-Ÿ~‘|ÆÖ·ã;[Ï[ß+I2/•p»>ÿïƒbýÖß¿~ÿöé¶É›göíkPdû,ð#ØéÉö‰Y÷lDO—îïùÝþ]ŸÅ\åÿú–ðNËgi-¬³D¨òߣy_ê¾O—z¢"ÿä‘)ûììíuX¥fÒ­%µ‹ÊH•eÝòEóìÙüÁ÷¶üÿ'÷BNoã…ÿÛþ3x"xî<ݰØ*ËþÏÚc³òì­íWÅV×:ö¡l¬Éwo,¯t›~â³¢ìO÷>OûûÍCþN”»lf—o›þ–ûíÝ?¿ýÖ]¿søk ñ²ê^#½¼³[Çe‰'M±D–û‘<§—û¿Ç¿Ëþª ©üÞn«zÑ,Ãk+ÛÊïò|ßçïÖž»4v¿ ¼ebº‚ßÊŠÉ:¤I³ýl[ø—å—ç_î'÷öÖ}ä6ןmºfŠóS–x·_:ŤKü{ûÿ?ßþ:£ñúS£ø€[ÏÕ¬³¢HÈŠ»výÄoüy¿ßß@zMå¶›ð»ÃSÝH¢'–ñ~Eþ-É÷ªž«3$±.åÞòùJû~MÿïÿÀë¨-þZXß.Ÿg/¯¤JþküþR;ÿŸ—ûõB[O²´º‘XÐÎ’®œ›|Ýß2üÿÝþ-ßŶ¤ff›£´7öŸi¼ŽÍÞ³Åü½ÿÙ~oã­EKß‹šúÎAo¨êWÒâX²·-Ä¿÷ÒoW_ø Ui¢Ób·[eŽi´Ùà±»U÷7ÿµýÿ÷½WჯzáaÔ›AÐü©ù sö_…¾¸XQ~yvÝ#lJw€üs}ãËt¼{±ÚOZ»;¶ÉRYâÿwOö+Ýö¼´¥ïHæ”yåÌuv{vùK¹6ÿÿŠ®£Ã{m®­åO™ô:ç!‡÷»«¦ðôÑ&©hËóþõ>çð|õã‡çOÂ[ÆÓn?h;åf¸²ßu:ÿËUº¸Ù]_~kÞ±¶›Z±Y¢]15Éõ3Q—÷Q;ìßå*nÝþÏû~¸/ \Ïiíä@ÓDþjNèû|¨¾Ûq½ëëߊ~{•ð-Ì© 1E៳Å}µ7ØD·½eF_›f÷eþèµ1ææ}ÃnúÕÏžŠÍ/¶b‚W–ö ~H"ùö³·É±þîÇ®kÆÚ=ÌÞ ¸ÕbV¶²m2+Õ¸óÞãíŸjÿU~é>mûÿñúû Rø¢Í¥øƒÅMyÚ-¯öGö›ª½¼M¿|®ñlù¶*E÷>Uþ •æ¿¿gmÁþñ׎Fñ Z¶“-»jzs"[ï_+z,_ód[6ü«óÿri <ãÅœ³Ì¬7wìð®Í»~]ÿ/ݪžñ·†“AÒ ±Ò'Ñ<[­¼K®;l…%]ÿh}êÿ.ýè»ö|µ/ÆËiïüsvÍg>ÄûÈûgýóY_ üÞ9ñ«äZ¤1XiÒê ý“f—±Ñ¿ßÿÇ+²29£ëÚoTøMñàî‹?…´tÑu}:5¯~ʉs;²ªý•ßþ^7·ÌÍó/É_4øÎ;áõí⯓qýºÑ7•ònO²ÅòWо'ý—t7K}"ÇW»ÒžÖx"–ííQ%ºŠT—zEÿ=eÞ‰ò·^/¥[Að«U‚U»x“SOÞíùå—ìñ.Ïö[ûÉQñG”%ñsHóφ/àŸ´jðAvñ£¥«ØïùS{ý£î:Ýÿj¿AÿeŸøSº—ÁËÍZÕÍýޤûm-.e—÷n)"þìªîßínjüø¹ðMÍÍÔ¿c¶¹ÿG‹Í•/àþây¿Ø¯·g_ØÎ/ëðÙø³íú†­AoÝè²¢+~éþç›÷zŸ=_/º\dr¿þÞxKðúÄ ©kwþ:Ów=ôèéu»~Ä—äþ?)7ÿ¿_AÍá»?A‹öåÖ%ºÖ¾ÐÞ‹e½¼®¿>÷uþÙó§þ9ýï&ý´|Oªêóü7ð¿Š-­.µ‰|S¤j“éšNõý×›p»?ûßùwÿ{œ0Þ^i)´Ï¦èë®Åå[éìϪÎí÷öíûªíòüŸ6Íÿ?÷T¥)1‰a<7¤ºf‘;}¦íßør|¤ý×Ì›åÝó}Ävß¿ÉYšòO¡\iš|Q^JÓÞ$þ›jEÉ+£¼­¿ïýöûÿ3­vZ¶‡ºm”:‰¼°ÐbÖwÛGdÒ¶«;¶ï¿µw®öÿlÿÇsïìn¦ð½Å­ö×:žùlôûyŸûUÓÊš_¹÷Ûæûëòì¬}ã^Sæ¿ØgD±Ñ>ig«Úhš{ëRËý­Å-óËötß³ûªŒïñ|¯^ÏáÏ Zi†×SšOì[]Zòwÿ„„¿Ÿqpÿwb«7¿ì×Á?t gßíEŽ jC\y¿¶/gÍ’¤±|¿Åü ½ä_Óæ¯¥ü3¤<”wÏu®Å©N²^_Èé¥[ýõu‹åþù>OãjÒDœ^á»]+S—AþÑžöá¼H’ý¡åàÚŒïµSûµóýχ™ÿk†÷“ékërÁ,±K}*ì–/ô­÷›?å“"lÿ€|ë_MiºuΉ¨[ÏáW’óSþѺŠëPךTÒl“çßö“øÕ|ŸÆß=|×⯠ùßµŸÂÝ^? ê×öŸÙÍnÑC>ϵOþÈÑ|éû¨¶í»þëTDZÕ~Áâ­GOû ÿðÞÚ¬·³ÛÃ*[ÛÚºÿqÕÓr¦ýêŸÞßÿ«©|=¶ñT¶Mc}.½ö{YogKv[T²—ý„Þ›¶ yßþÒë_\ÿÂ>ºçŸ¦Û£\Ec£xm¥{æ‰Qö%ê|ªŸë[gûÿÚÌ×MÝí¯†“^»ŸGD‚â;OðÛ<·ýϵ–ž-KD–+yu¹oœí*$¿?ûþ_ø]ø£Åaû>ø^{•ÒtKv‚W‹b,·û¿ç®ß™V_ûév}ú?høH~"ü Ô4­CL´¶ÔÎ {}&WtµO´~éî¾Oàþ?¼¿:T¿³”7– üm¤xzDŠòÎTÔu=fwòžßfù^ßï³oû±'Ëüsø‘&ÝŸƒ"ðƉ-µäí`÷QK{ÚŒ¿h¸Ô¥—æûûþ_7bnO—o”•¦ø?þû è¾Ó%…ÅůڬßQo´]Þ¼¿}÷ÿË]›ßû»þÑønò{Ët—Ló5»Kˆ®-õm{Qù"ò·í²¦Ï™~甉ü(ÿ?÷ùM+XÔí´ˆ–Å¢ñU¦¥k*_xží¼¤H—bº[£ÅýýžWðíþ?’ðBkÍ7öñ¬ºeΟ¦§•*5ƶªþj5¯Üþ5óeûßþú®öOÕeûr´é-»*y³O±?zÿ½Ùü¬ÎÿÇ÷¶ìþ áþX3þÒž;oì…ñ Æïõ× å'ÍoóÊŸq¾áù>í{•fÚmÒEx×z÷Ší`*ÆÝ™´•_)ÕÝåþòlD]ÿÜ“ïÖ£1ßÀv0ë«é3çé×QD³_?•æîù¿Õ}ÖùþGþò¢W€þѯg©\h’ÛEwsp÷›íÛÍùÝQÓoü ýÄù+ÞïæÕõ_E}}s&±âØ¢—þ%îM1>O)Íÿ¾þM¨í^ûFý¦ÿTðúê+ªêÝE-å¦ôû;³º¿•»ø_äMÿôÊ€=/U°‹^M2 B{)¯^ÆÞ×ÎÐÖ+ÝlØÿ?ð²±ómßò-Emà cK´Ò¢¼Ÿþ[‹étßÝ6ÄX—{ïóØtÙþëÓ¯<ûmÉ¥³“Ãz#YÅ羘Î÷:£üè›?ý­Ûÿ‹øêê^$ÕÓ‰¤yóé^EûBßE½î<ý›~tÙ¹~þÏŸæÜÿsîVB÷Œé¶ÚW‚ßL¹¼îÕnž_³ítWWÙ½ßýÿݺéÿá~i¿iøo¬\Ëm¦ÙÚ}«dúÆ×–TWFtDûß'Þ_÷?ï¾×[¼Õí¾$W’ÛXi–3Å.æón‘7£¦Ïºéû¯÷ë‡ø3i¿ ®ç³Ñnîu·?•q+?Ù7/Έ¿nϾÿ"ü¨ÿø\†l?‚l渖ù®gÓtyb[vy¥ßó¯•þ©7ÿúÕÿ}þvþ:úVƒ&•qª­ÌúV•*ýŸý/÷®›|¤ÞŸ?ðoÚ¿ìÊßz¢ÿ„ÃSMQ/ ¹[›¸­RátË´ù,¥WFûû?ƒ{¿û²§ÈŸÃŸaâ}Uõénâ’+÷H"u²Ô?uö6mŸÇ³æÙ÷[ï}ôùDÚ\ÿ4«X´km<¤Oìû‰|¦Ü©·b¶ïºŸu+¹ñ‡—R¸»Š)[ûVéWu½‹KûÔýÔ¿½ùÿ%ù?Š*äʼøå¡Iy>«©+اɥ«}¡?uòÅÿûþånø·ÅW6rêv6~F•û„•n6£ý«vϹò|¿ßOúeæÔ3Äþi­^ÎÇS‘îÛçXm×u¼_&é_åù~}‰/ÉýϹ\çÅÛe¶ðÕëK*ÃvþTOih¯ålWwÙýßãIàu¡âOêé×zUŸÙ4t‹gúåGó÷|ïóÿ½÷?é–úËø™{;xSR±x"Ó~Îbw†FW–]Ï/Ï»ûÛ·ÿÀ(_MÑ×þ«F¹Ò£Ò­å<ßÞÿÇÆä•7¦ß»¿îS.|=³í·-¨\¥•Ä¿,ÒÿÇÅÂüÿsþºÿèHÿß§ÜßÛhž Òn`¶Ô.e{8·>§ü$»önûËò~ëý¤zÌO\ÛO{<ÿf¿•®™ûøb }ÍŸð:`W³ðÛÛY:ß^l²–ñn"–X¿Ò>Oÿoû¿#×ѲóÃk7‚õ N9eÔ¼-âM.víi^-In7ÿÀü×ÿ¿U󽆷¨$W„ëirÿÚ>Rß&݈ûÑþDÿ¾?à5ØiÞ9¸øuáÏ„^ ‚Ýu ‹Tñ*}žÝ¶$»¥uÿ¾>}ßð ô²ÙF•IU—õª9ñ”£Ëýl΢òOx)WîdËÿ¥·UÍ\óýßá­„ÔšÿAÑ-¶ìM.×ìJéÿ-SÍ–]ÿùÿïŠÏ¼‡ÉßXãêÆµyJ&´½È>¦ÿаÿ׿ô¡+÷«ø5ð•6|Z´þÜEÿ¥ _¼¹¯4kâ‘ù»q7“០3\ý™"øW þûïù_éhÛëŒø —ÉâÝÞ|÷úd¾Ó‘n6º$²ù²üûø~jêýòįýÍ’ìáâ¯:ñç5Í{Âþ8¶û5Λ{‹öŽ™J–ö ò}¡÷ýÖò’_àÛ÷ÿ߯£ßÄžÑÃý§µmåðÌ(öÛ%Ù³d¿ÞÚèŸ#ü¿'ΕÂüo¹ð›ü:ñZøjÑõ_ì™R}ãfø"ÙòÊíóü‰ón_ŸþY|ß5GÀŒÙÙÛ|]]wÅZ|Kå-ô¶ö¶/¤¥ÅÇÙâHšYeýê}Ï7o÷š½CDø8Öwºe¶‚°jºÝÒÊ—Pè:JlU‹ç•åyn?uü&ýß?É^eû7ë~O„‰æ²\/Ù"ß½¼¨¿Ø•6n—ø~çüÚ>xóÃÞ°¸Ðu]sÄžðäÅÕÄÏÇ–y]_ìé.ÍÍ›½ßÝÞŸ?Ï[{@å5uï†:Ÿ‰õKuðâézõÂÄžoØtén.-^$E{‡µ"Å÷Ój}êð$›O›â§ð›í–ŸmM~êYuYmâŠ(,’_´|»Ûs¼Rü•ôB|iÓ<1‡×ÄôТº{+[2*îëÍÿT—Oå|¿ß½÷Ó~Úù_U¼–oÚ¾%—E]6î cM³Û¶ùmÕ¢DÙ+ÿ{vÉeÿÑÍï)î¿ üc­èÚÞ¯}¨A¥\i,É;êrßÅ,R;˾ÞWÝ÷6>ôzô„_SÅ_ |Aâ_øâKÅ·•Ù¦Õ¯¯l–ßÊO6]é¾WoÝ6õÙ^oªéºeÿˆü?­\­ÏŽm]¸IuÍ2’+_6é)eÚ鹑ßsü«òü¯òWQñƒöcø}ð÷Mð£éú’>·¥ê±Z闶ж¶2ÝJ’Ëþ‘_*£ºE»ýŸÃQ’˜rÀó/‰l~+hŸ uË=J l—Æik}b÷M}f±2K/î§ÞßòÝÍ_WüZñˆþü×_ïW§x_Á¾Ѽ |#¤é6Ú¦‹gzšl±j±´ºU¤ »<¤÷™åþööùÚ¦ðž™áÍêßð‹]Úé:uÌšmΦðãOµò¢ùmÕw§ú¥Ø¿{ûÿ5_ºQóGüºhµïƒVí{§j&ÕbÖ$Š-=ÂEonªŸ+nu]ÿ*nþ/™k®ðoÅø«ãçˆ|#â iÞ³¼‰ô-Æò/´E,¨ìŸj‹Ê»|×5~YQ6nÞ•Gö+×£ñWÃm:­ÍÍ”Zœ¶ë¤èë²áYUÞWGû²²y¿Ãòï¯WÑüàÅ’ø³OÒ ÓuKUd–çAó[U¿‰·²¬­ý×ò¼ÖÙü)ZÿˆˆžA¨ü}ñ'†~,ø£Ãß|5¥k^³Öí4¯ éš=ÌS\-ÍÓ²Ûý©7ü‘{ÍUùömß\W/í¡ý«~i²ø]{$Ò®¾Ól‘~êß*Ån›¢û®­ó¾ÿïüë_G_øÁQøªmv÷Ö:^µª_5½ÄZ-ý¥¨„w–5•ÿ‰÷Eæü¿6ÔûÕäß|IsgûEü;ÑWÅ:L.úUã¬S*½Ä_ëÑíÛçÜÒË»åoáþãÖ~ïÙ ¿hOŠþ(øtºF•ðËDÓt¯ﵸ¾»×햷.ÆIZTVgxY>ú®Ïøþ/ø‡Ç_ <àëÒtWÕõ±]¿‰/Ò&¼‰¾wieO™Ù?ßÛ³åþï¢\èþñ§ö‡«èÞ$¸,²¿‹¢–X“våY`‹ûŽÊÑ+ýß•ÿàXÞ$ð߆¼yáï éš¿‡—ÅZ?›uþã(®<Ýÿò䊟.ÿºŽŸ.Ôÿ¾tgŒü`ñ&ŠÿîÏž©ûâøNWá7‰üOâßê ã? Z:xsQ–ËG›I¾FÓô¸"dO6ã÷»u½QþÞ¿ÉòÖO†¹\ï…¼?¦èM–Ÿ¦Ú/„Þêæ{ÆÐtO6á>Õ²$óoetvù>ä¿ÁºT¬¤3Å>½œß´?Œ¥¼k½cìòÚ¿Ùí÷¤Nëoó£ü¿Àß$_6ïî;Ö¦ñÞûâ=ß„¬|3¦Øè^¿¹žÖ_ Ý4V÷må}Ä‹øçýÔ®Šéóoo›îRx %¹ý¡> iöÚœPÞÜKa®Ÿiþ¶Vò¶&ÏâÝoüí}úõ?‰ѵZÜÞh6Zl¾±Kšã{ë>Å•>Ew_=?Ö³üß}>O¿WËîó '#âjvzöŸ¢ÙÛiµû|WžI×íÌðJñKN»ÍH¾ëýæÿÇëÇh8´­{ÂVËmƒik}öIm4Í5®Ù_äý×ÞÙòlÿk}{—‰ü7m¯i¨jDºjEg¾×S»YeÖÑÞT}í¿c&ýÿ?ñlM•äÿ´=³iZ÷%û¾·]N/"ûYÞ÷VW}÷ +ýè·ï}ÿ߬¹K$×¼Y§i·úf‰¢C=‡‰"Ðî/à¾Ô?ãÞ_)åu‰™ß÷_u¼ßïÿSÞ[i:eÌVÖÖÞ+½Ñn¯`Õžx¾Ã.ßàwß·î>æþÏ]‡ˆì}/O±»ïÿá"K‹]=/·­¥úE¹U×ûûÑ›ý•MŸÁ\ýΛmm ÿbíŠg– m×F•eû 'úÝ‘'ü%þ÷Ü_ãJR$Í×kÿEuw¢ÛA®\iN²jfáÖ}ªŽÈ¿7ÝØû—ï'›üUÃü3×´ýànµs}y{4Kçùö‹ü{«ÊˆÜÜÎû×ÜwûŸÅêúlIàÛ‹,õ žÞÅ¢û ù¯ij‹ûß‘Ûø¾O?ûÛ~Zá¾êigð y.üCi›מ|Iél72|Ï·wúýÛî·Íòoþ'­Ü6‘¥ßÉr±Þøv :ÖU¸‰‘¥e—ÊdIUûß/÷vª|Ïüzv/uªëW+6Šuí-ôë?²}ü«‡ùbmÓüßDZ·ïÿcæj»t‘¶q«˜Kí*$—Y‡vË­ÞR»·ËòïÿUýåÚÿ"ÿ m4}¶þ&kk¸bº³‚%¸ÑÖ_7QÝå>Ï•?¾dþêÄÿv oF¹M7ã•<¾'þÍò¬ZTÔR=Îß&ôO÷ŸþúÝV¼O7ö¯‰u†³¹ùìþÏÕ”Ûö[îEGt7çÚÿ*ýßõ¿Å[>ŽúÏ㤠Þ‘¥]ÿaÎÍ5÷Ïo/îNöO¹÷þúÿ½÷Z±|Hñ\ë:õ³5µËù¯-¤*©5®Ý›7üŸ6ÄwVÿiÓäJ 1u{Ë¿ì]bÖÞÙnç–xb¸FWÚ»Õ¶7÷Sþ=ÿÏËÄèb›IÔ.m ¹°´h¢u‹PoÞËóºoOö~MŸð ¹âmB]F=TM¿Q6ñ[Û´_Çj¬Ÿu—ÿÿiÞŠ–ÛôMFèËu¨¤«½ôé·æù¾çý2þâùÑèï‹5ËH< ¦Áý¹%úKA|ªÈ‘}÷tÚ»>ã6íßïnß\õÍÌú>£eÛG±'H¢ÞÏåDË¿ø?é—Íÿ}ýÊï¾"}¹ìtÈÞûI¿º– ³KcävòŸÊOãùÓø¾oûæ¸MWìÐÝ\@Ñ5„Oxk ÆÇÜÿ>ÏŸûß?Ïÿ©D¯˨è—mŒöwªªEp¬ÿg·‹çÙþ†¿î×Câ©>Íð³ák2ìò—Ä‘?ƒý"±­­¢‡D{o.îMbÝ"Ó¶þçæO¸ïÿ=~ÿü +SÆûáQ|2Ú¬©åx‹b·ýw®š©þý¹¾(ÿ]ߨmHw3þýþwÿ~«Ü§ð§ÏþÅ;G;H†u_žVwÿÇè¹ÿTíò×e…ȰüU´eÿžQéBWï~ü.ùþ-Ynù÷ÅÜÿ¯¤¯Þ hÇ©ùŸ®îO軿è“hŸú5+‚ý‰5'¿ø^‹»‘¬[?»µ½7QÓeÖ<¢ÁÝÿð§ô™~ö_{ÿè5ãÿ°’5·‚5ØoÈÖÿm÷'þ‡^oŠ_öñ¾Ñõ,0²|˹ÿ¿]‡“eý§÷ZU¬{=»ÓûõÒøzû}¦æÿ–«ÿ¡×¡ù55³¿Œ¾%ª¦ô‹_gdÝÿMoWÿCzýø©©ZXx_ÀÿÚ°Eâ1¼#-­Óۮ˸žWÚžV×O¿÷?ÎÚøWK¼µOüX³’×í:Õ׈q/•½Ö%¸ºóv?ðÿË/÷«í«=ľ*ðÏÃK¯7ö¬^H´›ë{¨’WŸz|æýÆÝ÷>ଢköJ¯ð*çRð†¡ªø{S¹}aô”þÑ‹Èd¸TTýëù[Ók:ÿsæù?ï¿ñ·€'³²ñÖ¥s¦jÿ±~ÅöéZt¸¿UH÷>ÕóYÍMŠÈ±}öùëéïëž0øsk©išÿ„§±¹Ô¯t¿ „vŽUÙû¦Tß÷Ýö}çÛ^qãoÚKÕ|C-§‰`W¸Ñ¢‹R¾×¾Ã½/,ÚX¼Û}Œ›_zlÛ÷÷7›ÿ?º 2J†Í ‡ö¯yVêæÎÞ]FÊU»¾]÷K*}÷Oúxßÿókêßøz'ø¡.§m¡ê—šUþ±qk¦]èŸ=Å›­¾Ë7î+o؉þÂïÿx‰5]ó⇃åÒ/ Ô¼FšûK«_$N>ï+c§ý2ÿ[öîü”J_S=öóÁ+¥ë·Ú¾™wÿ ºÅãÙÅ ß2ZjÞWßIbþëÄžGÏò®úò_†ú'‰|[¢iV7–:Ï„µ[_7R—Ã:dm–¥eþ«}Ô¬ÿºYw½¯üîWÑÿ ´ ëX¿ç«²íGþvûՋ㟠ßj?´gÃ+ûM@7³hº§Ùe»ŸkÜÄé+K+&ϼŸºÛþÿðQ¤|G×¼;ûHxæÖËÆ0øòê?Áo‚Ë*EáëYßÊ–ënݬ±oÚÛøþjÜñ/ßí=ðÊïþû©­›O¾yäk´Ù,¿7•:üß/•óÿßåùZ¤³'ã_Áxÿh{mOѼk¨ÍeåO:i+RÀnÿG–ãÍþ·äþën÷5~2|*ÿ†‰ð×€¼=§xßSm_AÔeÔï.4VX¢‚(×o”ÿí¯Ê«ÿ¯=ý¬¾"x“Áái~Ò´éìÞ=N%–+£/›æÙ:Åó|›Wû«ó&êßý­µ=Cà þܯņé&­ö;O³g†k}Ÿu¼­ÿsï?ðüÔ£}‘¿,àñ7Àý[MÔ5 +[Š+iWQŠ&û=¦Ú¿{»yøÿ½¿æ_»]—ìí¢éiðSÚWŠçѼ=§ë²û6ÙWÊ¿Egoß«lÝ+ÿÿãíU~9Xj^<ø©iߨq&¡•pšu£ªdùW RÏóí“çÿýÊã®´­CÀß³ÃïxsÁ+wqk¢Ù[Ï¥Íuþ‘}Ó"\Kn¿7Ìÿ'÷v¯÷*áýÐ3~ø_…¶·³ã[Û=Ä·©*k›Z[¤ošÞÝwËæìwoâýÒ|µÂü1ðÆ¡ð¿Aò/¼Y{aeâ ›­JíeW»¿YQ+/õ¿.õMïü[‘>JÞýšnu_‰z§ˆ­§ñ?‡|[q¦ß^E>³¶U{[Yv£¦äûϳäò¾]–ïó×?ð÷R×4Oj²xËLñÔ¶·7Ðˬ5«¯•$Lö±o‹~ù¿…ÓäÛüÕ„¥ö€æ~¤ö~"Î[Xié.,¿2ý¯nÄxž/áÝüO¿þû®³â­"óâ^‡ã Ä×õ®»U_–[X¤¸ŸçGh¶þõ÷.çeÛò/ÎßÃY ü*º¯ÅÿWxr[”µ³Òî>ݨN©-¯›ÎÿÞo´è?}?†¹;?x§Tñ÷†bñÚ·õmfIíLJ嶕¡[fÉ~öØ··î¾}Ë·wËóV¾÷/ÂOÚ= žÓ/}cöwÓ×Sºðö‰£Þj:¥¬Z½ÜM+Å÷W¸‹ø¢þÙ»clfÛònì&IáOiSÿn[^'‘½ná‹ý.WdÚò¿ÏòïÿQóüßÅ\ïýâÓöK´Õ­üòÌ׺œ‘_Es‡Õå“d[WîýŸæ—æûþS*eÎûÇíÚ’\Ü¥‚ê:,ò—Š)l•"ò›tI½~M»à{öÖ‡ƒþÇgã'¹¹Õo¼7o,Q_j6ëÅþë{Û§ûÿê¿Ùß÷«ëYÕ~Å©F–Ísqa§@Éá÷ywÚÿª½÷Y—æ—åù¿{]Â_>Ûâ•£Eâ;mà‚Ââ(uâÐåW‹{üÿë|¤Þ¿ö×ýŠt ¯…Ÿ^ý£ml´¯iºÄ¿Ø·_è:ÌŠ¦ØŸs§Êÿwøô5ûÕÉx‡K–[S»Š;HRx­^+Ûžá¾O‘.‘ŸåÞˆÒ¿û[>w¯Dø£Ûëß´¦×…õ:h7Íýe/ÙßtHèŸ>ôùgûßìµp^-K›j¶ÖÐIm5×ÙbmBo’Þër$¿ºù>]ò¢ßÃóÕÊ RñTÍ5ߟ|°¥ÇÙü‹>/ž%mòï•>O™ÿÖÿÀÿï‹ßRð~?ö»jÓE§[Ûì…6Å`ûå²ÀWd»¿½+¯û¹:Ýõ†¤É,z<×^EÂË4»’uW}û—øYÛ÷¿îìþõvÿ´ÈœøKÂÑKwa4?ðŒÚ½´:wÎö±-ÅÇî§Ûÿ-w;ÊÍý×OøDøãáBÂ×ñO èUÅÆ“¥Þ­¼7?ºeØû%M»?zÿ6õÛÿ}ýêóË‹E™–MÑÍi¡¤.ËŒ­±×ýÿŸþøû•ë¿´g†àÑ4ï AuOÄŸKÝcw;K,û¢}÷[þ}ªûcü›>âýÚñÛËû™5]FêÙµ$¼¼K‰Ý6ì]Û·§ÜùÙñÊ* ÕðŠŸklÍq-Ö±k*iw ²[ø¶JîÛÿ…‘67üíÿ…Eð¿ko_+Ä;ÿ×Å]ðî§x>xÃv¥¥ÜÄúî,»ÛmÅÃ/Úßý”o½þËÕoÉ'øeÿ\üEÿ¥µáTÿꄾ(ÿ‹üÎÛÃiÿ®™÷w´[ßý­Ôû˜w¾ú–°ÐtËfûñZÄŸøåEss³}r–[øPŸñwì•~wh¢ÿÒ„¯ÝÚüøPûþ/ÙmoŸÊ‹ÿJ¿x)#§ç–“óèzÿÕ°ÿÙëÃ?a[¸ï¼#â§{³Jnl-|­ßóÊÉQ?ø¯ø{–ˆëý¡3}ÏøSVû=y—ìÙÏøÂUòæó[K•ž‘?{§Û¾Êôk_öñ¾Ñô5ƒýÏ»¿nÍ•Ôxm.­þš­r–&Æoãþýuzü~Û²2¦ÆMµÅö ÉɦžÏÇž=¾YÚÚÕÕºìoùkö‡ùëï_Ù†ñ¬/4}2æïRºM6ùmÒöáüÔÚ¯òy_;7Ýù¾ï÷ëàÛÏ ê÷ŒUGoõNÛÑ_rÿÀ«ã/ØX¿‡µ»9neÑ%‹Ãw©’‹¾ÞÂUtÿU»gË>Ä}›¿zÿí×Ô¶¯Š4ü ÑuÛ%[*éÞâÕï—ÊBÊé±Ý^'ù‹î×Ìþ'…o< {§ÅsÙåÐ%û-¢D»Ñ·ÛìÙû¤ýÒo}ÿwï§û ‘÷ˆ¥ü3¿gçÿ‹‘wû«ëËymn“ì–÷6Äÿ½ûé÷6n¯ÑOÅ©ÜüµkÉ-áýü Ó­³o¶üŸ{ø~_›ï|¿Ý¯€>h-áï‰Åy©ÿe?Øî]7o¾Ÿscü¨É½÷ü»+í¯ Üê3xîå¬dK‹[åK=NúW•/´lØë¿wÏþ«øWýêÚ1å¦sKÞ‘ä¾?ñ¶½sã}2ÇPÖ´k?éúé¾I¢Þ—±ª}ñoE‰“z:»¿ñ½|ÙñÂtøñqþ™êo«ZîM?ýU«E±|¨Ÿø¼¦O+þÙ·_lO¤j_ç½²Ò<1m¤ÝEâ&ŸQÖNŽÒ¤¾UÃJÒŽ6·Ê»7úø÷â.‰yÅ«ÝUtÈ´H¬å‚X¬Q÷¥’lùWþöÔù¿ÚßQ/{—”)ÿxû·áEäx/SŠÇWÔ&Ùs*i:òʒڮϼŽÛßÍþîÆÝó·ÎµàVÖƒø—Âö0ië©xsKÕ¥•nÿî•™ÝÓæùÚ®‚¶ñ·ÁÚgü%º=²5Ô_a¸–/´CýÈ™wîmûU·ÿ±þÝ(rÝÈøÏKð-„º5±Ð<%£¤­{Þ£Ü]JîË›æü«+üïümÿÔŸôï §‡ü5tíÁ¾žü5¢\Çòê7NÿºÝ»î»7Îßy¿ñúÎø±ðÃ%Óç×’X´ÿ7íhÖg–+Iç]ß½·Úÿò×~ÝŸwb/É÷+_âŸÂï üuðO†4]WIû"i·Mg{¯3D—.­·b:>í²ÿè+÷i{¼Â3>.]i¾ýªŸ-„M/›˳|»›dH»·nùj÷ÄOI௲Iëési*^j~#dŠ-T´¿r-϶%}í±¿ƒäù*¦—©iþ:ýŸü £j^*¸¼¾¸ðä3ØÝø^×t°*3¼êŒë¶/•[ý󺵇/+ˆÏ&𖃢Ùê’Ï èº_‰5;´^êßÙ1[ÛÛé³ìÿHû¯óJ›ÓÊß¹¾yk?ÂZV•yĺVŸ¦øžîÕn¥¾–Ò+x­4»Ýy¾RoÚÒ§È‘ÝõÒü5ø_àÿ„:ž¤š,·Û÷’Ûè<¿cºe]¾oðí·gÙ·î·›\‡ƒ>h? l"±±¶“R·¿–óR];IžvŠÖVò“͸mŸv/õ[åÜÿÇ\’ˆ‹¿4K?üZý %Óψ|Nëm¥Åk,NÑE»gÏæýÅÚ›?u¿øäâ«_|ko­|@´±ñÖ§`þ(³‰ô»×kùïµ<Ø¢¸Ø›¿>M¿½wù¾Jé¿d¯isOñîçÄÄÑ]m°[¨-WçEo±"Ü¿6äÿU^ão†:dßtËÉìäÿ@º–]&ß^Ýq¬l÷$I¶]¬±}ôwÜß:%vMrÓ$g­ ³ñZGˆ[O‡]–Õ­ìü!¦5»ï‰SçÙ.ÄþЉò®ä½\?í¢^?ćúv¦°C³Ä–Vëcá†ßötß÷"x‘îlÛü[·×£xÁ,í¼Q«c§ÅáëL¸µŸO»o7XX—{l·uàmÿí|ÿ~°|q5…—Åß„rÜYÍàÝ;þk;fçÏ–%O—ÍûÏüi÷Û®Zkš¤bQÖ|Ô/< sªèoÆ‘á]fîêãn¥:Ï,~RlûEÒ:îH¶·Þ¼Ïµ÷üÕãþnžþ·¿[›$Ñolî6øtN²¬_|^Vݨ¯³øW{ýǯuý­ô Å>5Ô–«©_K?Ú¬u©¾tIwEò+ªº:¼MüKü?Ýûëà7^ðý¿‚l´Ko³Mź¬Ûÿ²n¢ÿ[²Uß»ryR˽?¿·÷*´y\@»©i»þZ_iVz|:}ÄL‹«#E¾ëj"'ɳå]¿wþš¿Üª>}#ÁŸ±‡®'ÄëªÇªÞ\¥î×k–á6¬Jÿ'ð&ý‹óm}Û«¡±Ø|4x-´5K‹%DmZÿÑ"_³îò‘7¾ïùøßü,ûwÕ/ x’O~Â:f…Ä …š-BöÞ_iö©ö»Ti_Ê—æùÝÑ~á•¶íÙOËÍï ñKÏÄ–o¨O-´ñ&•ÒÛþé/`]ñ2<»SwÞß»øvy[îW[ð^Î_|^ð½¶Ÿm¤êWHÖeÓõæUHäÙöÔþ5ØŽíþÓŲ¹W°¶Iïg¹ûNùt˜¢—YÒYÒîwù%ØÏ·s¾õÿv/¿óÖÇ€a¶‡Æº|·Þ“ÄwYù¶ÐÎñK«|ˆèýÖ—ï7ÝÛå|õÌ/têþC¤x{ö·¹ƒÄ,ÕtK_[¾­áíîß"mùv£ü»>÷ûI÷«ÇüU«Ûj^ ñU–ŸsöølÖ$ߨ@‘DêÏýíÿÞØ©½þë½wŸߺϱÿà+üšñ—ݤWºÝ¦ø¢–¿uöyUåß[~þÄÙûß7÷*¯ÆIV]-ì'W—Nµy帕¿zÌÒÿ¤D¿q"o–-«üQµYGÜø€ôßÚkÅ<òøa,üe®xGÒìå}fÕÒâÎ_+ç‰7lùWï#ì_¾û]«Éµ‹È¬î¥Šå`wŸQØÉ§Äމ·fÿŸý›Sý÷¯@øÙâKÄ)᫟øJ¬u(­ml5m2ÛbmŠ'ù>]ëû¦ûÏ¿øþzó[Ë ßTýÒ¶šé|»í>iQѼߩ÷YþïÏEIs êü*Þg¯4Z‘y»_Òÿâm*K`íö’/âòŸçFÿeSå«¶‹¬xsà…â$ÐÝ^ëNŸÀÊ׫¾¸ý6+M+ÂW¶fÆîÒ÷ûb‚X§³§ÈþlMýíß"ïÿb» ì¿Ó~¬N»×XÕ­åO›÷Rýª&Ùÿ|Êÿ«§/ÝÔÿêƒíGüG_r›þfÿ¾?¹X—0ìWÝ[×î¿Ãÿ¬y‘v>êå(—àçü–m?soýÕ¿þ”%~ðWàÿÂ]©ñ†Ëj²~âßÿJ¿x)˜õ?9ôMI-´¿ÄêÛî¾ØD¿ì|’·þÉ^ÿñ…¡ð—Œâ•[þ?-_çþÝW¸:Amáÿ…SîT¸Ÿá­ª|í÷¶¤¿%yWì[âYø÷SÓ,²¬®¯­^+MÛü­¶ÿs}vTŸïåñê8S{í]¯þýt ²=¾æ_õ«óÿÀë¶|K·þùtjê4GÙqïïl_ø `h~lø{â¢ø3Ä¿à_6ª‹â+û‰î7ýÔi]"Oö~ï×Ö¼7s¢Zø~ÛPÓ$šáàFÿ–ò¿÷Õ>óïÚßû5|ñðNÚÖÿÅ¿´Ý´è·)ý‰¬Ë³nÿ»t쎟í%}{ðZ2çVÓÖu¾û?›jëöIÒ%uµOýzu«’§Ù;°ß Šß.`ƒöKð—Ú½ä6ë,¶sê7po•sþé‘öýý›w3 xÿö­Î•᛿ÛYÿmÚE ^\KwæÿÈF-ñ|è›ÿtÒª?ð|¾Wý÷ô_íC5÷…fÍ òybÑå°º—z\E¿rîÿU±73ÿèUòÿ‰/-¯< â‹™b–åï|1ª<÷Ö-û©ãÕ÷ۧϵ_÷[åÛ±éUþ71tÿ‡#àÿŠ¿ábø¾÷ÇV6Ú6‰¦/Ú´ÿ:ú6UvûDû~O–_5"úäõõu扦hŸ |Õþп»Õ. –{¹wÚOþ•å?ÞO)7ÿ½»ûµó'ìý¦Êž´ž o6@›n7lEót[T—zlù¼ß‘Sý­ÿð?ª/5]#[øU{gcâ ],åµûv™i}¡%[­É,_Ä¿ßÿ⫲qŸ>xÀ×Öß<[}gûë(¼io-öyxðÿe¢ì_ô]²ímþnÿ¶íDJó_øæÏûSUðvŸá=^mböùm`¾Ôeò¾ÔòÄì.ïºÒù¾k#ü˾½—ãG€ô‹›» 2óY×üU®éݽ֫µŸØ<‰ed—|©ó4±?î¶o_ùe÷ëÍìæ‚çÆZ­çÛ¤Ö"o[¼ºƒÅ³í[´Û6X“ø7üþVÏúe²ª_dˆŸQ|)Ò®/<3wªê[}®{«ôþÖÐd}’·•þ©¢ù¾TÙþ÷ÈŸ2ׂüEÑ'Ò¾$išÔ^3¶³»]ZÝàÓ´é|«}zV·‰Ý7ý×h–Õ·îUTÝòï¯|øBúF¦ê¶ÖútÞÖÚ÷Q]…Õ­'M¿wäÚ¿ÝÝò|­^7ㇾð€tÏ_Eÿ½„«u+¿‘+ÜYÏoûÔ‹ø¼ý޶ñ<_òÕRœ@¿à­+Uðß‹>iZÂÚ\ëVúÆ×±†éî4û/5®?zÎþl¯ÿÙöáþ?©¿i¿ ü!×55Ôu+KË ø°4h‘þÏ.ñ·ï®ÖSü[¿½÷káÏ Ø)Ò¿g-=­$Õ-ßV‚âßDy×íwJÒÊî÷íEÝ·ÊTûŸqëôÄÿü/à?\êÞ1ÔŸ‡c¾Ùö$Þš_‘%y¾jÞô"ÆbÿÂÀÕ[྿|ÚÛqqÒÚ¯Ú ‰‘?{pònMÌÏü5ê~ Ô'ºðΚ#õ+¡þúáv£üŸvÊçî¾(øFÿÁzF·6¡ ΫÏnštvéóOæÿªÿ¾«wR»–[X¡[%¼ŠY%‰4µÂ;ü¯÷ŸmD½à<_à5ÃZ|9†úææÎÆÒ]nñ×R°ù®<ÖvßÍŸÞù‹åJæþøšæ~5³ÿ„—Y{u¼Ý|—¨¨²ìMïoò;|îéµø7ìþ µû8k©u¥¸4øEYõø™ÞÞ,ñ4[?‹ý´ß³çÛ÷ÿн Fñž‰wâ øt;ØÛ]·Ôž-CTÔ·y Q>}‹¿øw¢À«¦R÷€ùÃEñljâý§üu¡øGP×M¥–±k-Ô:œ-¤VsÜ"Þ½«lÜÒÿsðù»+Ю ¹½ý¡<sŸ¢ÜK¦­¬WLé5Å®ÿô‰]6}íè›k ðÇÆïêß|Cà¿jN|u§]¼º¶§ylò@«ó®ä]ÿ2«²EþÎúñß=ÕÏǯ‡òËáyõ]>WÕ%–ãí‘#ÝOûÝ—Ÿôï±Ñ>›ø)ÿˆƒoâÒxÆå^óJk½{DѾËå}…m^âÊážT»H’—j'ÙÕ~ónßþÝfþØþ%Ðì>ü?¿:׊¯µ”×ŪÉáØÓz¤¿~-Ž»~êm_âݺ»ÏŠ_¼-ð§@ðþ«ñ]a¦ù¬–Ú~Ž’ªE++mIY>fÚŸ3}ߟþY_¾0xGáFà­OâV®×·WÚéÖZ Kû†þ•ÓïyHû¿‡ïÿDyŠ9‰uð£ì>%¹KËÛ‹Ë}EîÊ´³²[Ÿèï³ïù[vµ¿{Ö.Ÿkãù¿gßÂ¥iv-þÅÓ–Í-FÉ›÷¿jݳoî·»íßZ_´ö©â/xJÒ$Ô­5]cû:U³±±‹Ê‹Ku•Íwo¼Ñ|ŸÝÝ¿äJÀø ªê¾ø7áÝCÃö2xz[] +¹_sK.¤í±S쨯÷®fïvìùÒâIÈþË*ÑüCŠ4¨Þ%æ­}‡ÄZ°Ñâ¹¼·ûF­IpòÅåyVïþÎÖ—ñoDþý{GÃïøw✺ü^×¢šîÅ¥µÕn5iåD¿—ï´KýÏ7ÊwÞ¿/î¶×)àÿé^9ð·yðúñ®tÿ´µ®£ý¦Ò»Î˱ßc·ðËþµÿ‡äO’±‘EÙ3]»±ñ'ÆËm>ûM°µ»Óô¹¾Ã¨.ég‹gÈëü *#îo‘þw®êˆ¿<}á­?â-®¯sªßË:O}n»ííl÷£[ù»¢ùš'O7wËòýÕ—ö{šwñ§Å†³Ò­µˆž×KíæÙq·Ü¸Dûß½ûî›×þ÷k¶ø‹ñH°ñƉáýW\“ÆÚ•åÃZhúõ¼lñm_•þMïµ|ÖÙ·çm©ü´¹y}ãÈ»ñ#ºu·Ä‹FÐôÍfÎËûÍ—^Õ·'Ø¥wŠ_²ìýë|èïþËîÙ²¼³â¥Êé_|y¥Os`ñxŠÍ×VÖYþu[‡òžTù>çÎÏþúW¤x·Ä–Ú'Žt­+í7>'Ö<†»‹Ä6ð?Ùíbmêžnçû®ûÓþ÷ëȾ-_´Þ*ðo‘<~!¾¼Ö¬Ýžá6Z\/ÚÊþ÷ßÙµ¿ÙOø cö¤z×í;¢|PÕ¼_âO¥Å¶¥ðò+[«{ëoÇ´Ý]lmžSª¾Ù_÷M÷þ_Ÿïÿ”^¼º÷Â4Ô%Ñum£Ü%æ™ ùWu,»Óc¤_+:$¯³ÿþÿ©üDøƒyá›=jÖiGЦû}Ö§ Ø»lŠ(ŸsÊŸ?ÍóýÄÚ¿öËø<æßÅZUÿÃñßK6…ý•tÒØº?ÚöïtÞ¿?ÝÞÉÿ³¿ç«—/Ù"!sgfŸ m`Ô¦ytä—û2o‘-~ã§ð|Íæï•ßû¿ÁUþ§Œõ¿ÙOÒ<9k¢]]EªêO§\CíBÞ_ùk½~••ÙWgñ4_z¢¿ñ ê¾ÓÖ[ÉOþÌYmtä_ô¸·:*;üÿÆÏå×-ÿ?÷¹O…Ú®§á¿«éš zÇŸyåjÖ÷^SÝ'›ó£ýÍ­Çd}ÿòÉ>çñ`YÉ^Yêˆu‹khž-û: ·yIöyn™íÒTTX·ÔOï+ìE©t{hÅ÷m_Ÿæ_áÛýÚÅ×aÔ~ݨŨÁomgäÚ¥¤12}¯Ëò¾ô¿ðgööÓ<1¥Û'ưþÓXH´öW·Y6›wù~xþvØß"ÿ÷kKÄW—w:Ž¥}ªZ_Yéö@–×ÑNß¿óWø?»æ·ï_g÷Ú  OEkmßÚõ&x|ø›ìú|[vüòűŸø›ÊE}ÿóÕßû•_ãªxq,äžåæ‹Ê³ÊËû§ØûÓþ¹&ôÙþÓËV¼CxÖvZ„·Ó¶•§ý©<)ßæGdwEû¿?ïÊVwÆ ‡Ôt±s=âM4QAoQnÿG_þÏÿþÿñ3ÔŒë>(ÿlìÓî^ÇF°uK¼xY>Î˱¼¯½ón}ŽÍþÎÊä¯`XÚÚ{I¼›G¹_µ»§ïU6þé[ý§_™ÿàÑø§í¶ÚM¥Ž›á÷°†þX-çÓÒçäUmÿuþîÇÙÿ¾jÅ[©c‘­4‡“ìSOå\Ü\;*ºmVO½ü2ýÿîü´HEîÆÇIµ½Šîh­þØÈÆVûߺo¼ŸÃ*ýÿ“wÍPxÅ7Úfµà(ÄÂ};MÔg¿ŠÝ×î;Ü*Ëó}ÿ™b‹þùÿz¬Øê6Ú¾ˆ–¶7‘}Š[õyÒùÛ{þëç›ûŸ{þYÞ¹ÒïÁ¶3ù–n—7ŸlÕ>÷ú+2mù?‡fÙïïû4{Íâ*4«ó|¿v³&FûßÁQ?Œ4‰“wö…§ÍýÉj”Þ$Ò6ÈBÛþþÐׄWøÉd¿ôÂßÿJ¿vëð“àÌÑ_üW²¹¶eš%‚Þ&tmèö„ù+÷n›9×Å#à[Ù‡Äþ|×´mnÃGþÍð……¿úF÷wo™ÿ~ïÝ®ZÏþ …⯠xyí¼3ã¦ÑïZT—b_J–ûÿ¾X·WÖ¿²æïøfÏ…¿ö-Ùèªõ?š¶Ä_â*1>Ó?àž,ŠÕóâ^»s6Í®ñj{wû?º­?ø`"íÿ…‘âmŸöÿíUöƒ¥9>çÞ®bÏ.c‹„¿ ü{«ÚŸ?X—ÃwñOªKx»š&‰ÙþT‰?Q·Vû¸'ÔôÙ¡<÷ =¬¯qåy^S}÷_î}åOöÞ¾®øÇ&σ~?feMºÿÏÿnï_,ü=Õb‡[ÑâŸP¶MBÞ{)[bÿ£ÙĶñ°ŸsÿAzÎ_Nü4¾#Ñÿo}¨ü"µƒMBÓ\\lVŽM³ï<¿ëbÛ³fï½_x‡RoøWÞ%Š}V}6î×B½‰´ïõ©nëok¿~é_æ‹þL?ûlÿg~ݰ´ÓDð^Ü"_3°±—Ê,ßßWÞ¿*}毵é™>kc¹´ò¿±o"ŠÆû绵]–î‘\;oÜÉó³?ûq±XËâ |ÞÎFÁi¬ÿá·YàÔ.]¢·²Z2ì}º-¯ñïûÑ}äþó=}72xáçð¼šÛëÓ­Õ‹èv;ÞÎ&5åw—øSzoÿ¾kæ/ƒ:«i¾´‹þô«wŠÕÚx™åfþÈ·d¸ÿê¾û³²½—Å¿5YµOj¾%ŠÛÃV—­K¤Ao-ÓùºÌKò|þRn‹cÿßU´¥ÉÊsçÇ xÇ[ý ’ÓYÔ?±î5NÎ÷NÔtøåÔ­b·Ýö{¯6´K·kÿ~Wûßz¸Øf¹¹ñ~½º{k›¸¼yk¹-×}½»®•/ÈŸìÛìÿ}ž¾ªý¡þÿmøßGñz½³ÙE-•Æ£o¦ZýªáV$D‰ÿº«ºVùÿºõò~ˆ’ÙøP‚+h´ßø­ì<­>Þ_õ ý•+E¿û'›þãÑËíÚ<+­ø‡Á:߇-´ ëz¬^!Õ¯â5›¤D³FtI]w;·ðoÞŸßuMŸÇçŸ|-â;‰¾´»ðúZ6—löM¨³·Ú,¢EIUÿÖþ÷fçºW}ß?ÉüÑøcâuž•ñsÀRÏçøÏìúµå¬ÖŸ#Ùù®›üÔTO™÷Êû«Û?h‡ÐxÇãì~(,°?†tw¸yo¾[v_î.äŸæÝ»åùhçrŸ-߽φ4ßÙþ[ïíHa}vÏÍ»H%‹VÔ[|»åDßæª¢Ëò5Å}Éâ_ Gñ7á5Α$újYjš‚«jsXÅ{,¯¿þx7ÊϿ䯎þ=ø·H¼ñÂÏi7/¥K­ZÅÿ >¢ÛÞ-ÞjÄ‘#'Ý‹{ÊÿöËïÿ¹|ZÕõ}3ösÕuÂ׺ö¿g¨D±Ocu-ºüŽŸê™]ä_î}í­þÕwSø}â%ñÓ¤|(ÓtŸ®•~cU—RG’ðÙ§˜ÓĪ‘}žÞ±/î“j k}“RÑ4[¦Ôõ ëÍ5o¥û2ZE³PÛå2m‰Wæù›{~¼Äþ:ø™á_Ù¦÷Äö~»¿ñMÍÍ«ù tÞm„OE, .ýìÑ|é½>oŸûûëcàýï‹­´­[Äž,Ö$Ðtë–·u½•YßC•mv\Z«K½eE“÷÷ïÞõ¯ ÌÏÙÒçÃN^ÓÂúÆ£âk}å-¾º™µ–]Ÿ:#}ßÝlùöÍÕß|9ðž‰âkùáòoÙµ?³Ç¤Çf±ZÚ¤Iòn¸ÿ–»ûßì|Ÿ"W~ÇÚ«ê¶Ó@\j‘&¡¼š!E[†]Ÿ#ÄÉüìûCïþçü¶þMã+ö‰ñŸ‡/<­¿†¢¼þÜšŒ²ÿkJ»å–ÿ)wüÎî›Õ|ÿ}ê~!â€þñ‡Î¸±A5íÖ¿k{}e ¬V¶òËfï*¥ÅÒ¦ébþò¾ÿŸex·Äë?Jøûðý®u}£ý=%†ÆVû<[wìtOºÑ">É_îýýõ4w>?ñÇßè¶z¥áûC­ZÏk"]Oq§Ün–×Êóv@²ªÊò´[vìùÛçùù?ŠúÄV~é ¯EgòÝ¢\mýӳ˲'þ-·oÎû¾_öiȓڼOá/|EþÀ¾ñV–~j¥½­ß‘ì·²½»Ënèë­v½·øþýt¾>Ðôÿø[Ã6µ †ˆÖ²¶¥¦2YÛßË-Â;²nŠT}¿Äϳæÿj¼—ö‰ÑüEiáÏ øÏGѤñ ¥Õ­½ºO-“µêËp·ªÉ*²,¨è›>îÅûŸsfïÅû+ÂÿîtÏ]Þ]Åy+jz·ß–YQÕ??q/ο?ʨ‰ò}Ê¿x®S˜ý¡4¯øA¾¯‘fºU½®˜×QE¤Ýy·×RµÆä–áönþ6ywîO+†øA7‡õÿÙîçCÕì¯5t,ù7³ý–îÚX¶ì–ÂWùÿ÷K÷v£lù+£øÌ÷ß¾ý»Wóo±µëk7ÏóßÅ-ï›[å_5QøÕ'Ü®wöyð&½ñGà\ºG…uÄ›XŽÆÂX54Ýö;Èx¼ÔDûŒÈŸºÿk{îÝJœ¥ÌDMøw¥økÁ·ZûizN—â{ë—–æÆîÚ Vf•׿‰"ûÌžWÊíómß\U‡„´Ï ê:ŸöWØuX¯.§– I­mô×·yv;ìDùY¿tŽ’ü­µöïùëWö^Ò¼Q¯éÞ0ƒZðí…¾ª´V6¬K¾-߯»¥û©÷USåýïÊ•ç¿SÅøÄ ¯xbm6ÊÏZ•%ÓÒæYn-÷lÙ*ÊÌß*|é·îíþ™H³‰ø2ö6¼{=Ìsß˶V¡n¿èé/ñ¦Ïâ‚_àùv'ðWg£øJÇÂW·³éZzéZeƱ-ůØQ¥±ŠYeFwGdýÒùIå,O^cðÅÚçã?‹m¥¼ûÜ·VÿgFÙiý×·•ÿ¼Ÿu7¿÷þýwž øQã¿‚<'¥;Xxª GQººÔ.ïgDÙûÑâÚû|§Dݳæÿ€Òæ‘'Yãûý_Æ~-²×/§‚ÂÞ(¥·þÉÐàÿA¿ÜîïæîMÊÎÛþGþ?û漟ãÄÖwú·‡^¼mWS–òÎ[FMù²Ü~÷ÍvDûéò¯ñnOîüÕè$Ñ5 7âÖŸrñhVê·_êYeß¿òÊÝÕö¬IÏ÷¾}û_æ¯øîëe¬ø)e·M"Ý5UÿFÓe¸‹l¿½Ù³wügñÿµXŠG¢x‚×O¸Ô#û…ºæuº-¯ÍË{¦$Kqµ>eÚȨÍòüÛ›gúßâÃ&MGÃv!cHÒÒÚñWÄ ¯ö«h™þx]YvË÷62ýçû¿ÞYø}{ªévÞ9´Ö>Ýך\SD`º•¼ÖDºMû¾dûÛ×gÉüv±%Òµm_ÀÚN«tl¥.yjúbÎe<Ϲծ>¹µ]¿º²ÿi ‰³©<¶ßef¾ŠÎ$ƒ÷ºŽÏÞÝ&Ï)þú|¿'ú:'÷·¶Êò/ éºV±ð·S±M+W›Ík§_ßíK¥Y~]Ÿk'Êíò.í÷ÿ‡Ñu)•ü%²Ám º#¤³y¨Öÿ,Iû¨“ÝDÙþÏšÿ~¼çá~œÄÙö¯ŸåùÙ÷íù¶}ï’ uæ[o‹+Ì·óÄ©-Ý4öØö¿q|©_äVDû¯¿ä§\é¶i©x®Wi,ÒuŠYe¾Øöò·ð$I³ûûé’=Asy|]‹Í¾{%ÓÑ"t]Í*2.Ô—ý·_½÷>oî֭ͽ͆¥¯™o濎X"šÚ;è쪋º&ò›ÍóÎÔ¬"K;Û–Š-5Þâí·ù²«ÊÛÿÙùÛþùDÿnª|ZY%Ð$ÚÒÝ X¶#+¼»wìÿ¶»]ÛýÊÖñ¶¡a§n±Òç¾½}C|ZįRÅóÄÉoÛµ~h¾OáGÿ€b|Sò¤Ð¯;v‘–x®à:º>ÇUþómo“øv}Ú€â 5{=5¢¶Õ&u¹‰¾Ï,ÿéßsæþ/îmÿqþíFÚt·zÅÌÐ4’Yê,ëóm‰Ý¶+2/ñ³þÊ}껨ÛÿhøzËS¶Öu)â‚ò&–kx¾v_»ûßîìgDO“æß÷…Ò®u$Ôf‚KÝ>Âûì÷V–’íÙ¹Wïüßut_ÝÿgûÀPÙÉs§¥­¬v—oý§æÆùUò¾_ýï3mþ•ú5ðwþ ÷ð—âÂ?x†ù|B÷–—ë¥ÜˆžT²¦év£Eò®ýοì×ç&.n`Ò?´¡i®§¼–Þ(¢•Ûø>Dvß÷_5~ÊþÏ|mðáü?tKˈ´+X¥yn ‰ÑÖ$MŽŸì}Ïø"Gaÿèø7¥ZùK§Üܦæ}÷m¯ÿ¢«JÛöø?f®¿ðŽ[?ývµ‰ÿöJögø£àÏúôOü‹ÿ‹ªïñ/ÁŸô6hßø¿ü]_(sHòÍ+ö<øsá+ygÑm¥ÒžÝZëýQ7ºüß?É_eb¾zÔ¾+ø3û'Pkoi7’µ¬©Q]+»»&ÄM‹_Bæ¢[”ÌÍG⿌| ð×àŒ^×ç±Óçð5ƒOnû¦v—ÊóÞMÿøíy÷ÃÏŽÿ´wÇO ›ÿø’Ú-©y<·N¿{jofVù*׌.Yþü‰vÿÉ>Òßÿ* X°¿†WÅ_uí?ífK_é:¦å‹ÎÝöimî¶lÿkÈÛÿþ*ÎU\±5ù¾ÉëbiS£¡?æææ=Âãö½³ßø²Úóý·º‰?ô­í_ÚïgËâ]=6ÓÒ|ÿøåz×Ãÿ†ÝøoÂIoym~¾ºŸP[»è™.'ÝÔ^kl—æ¹o´3K+nIYåmˆÌ›;JåÃãðø™JjsJ6üu_yãÓ”jSj~ôeðŸ'|6ý Òþ%Ó4ø¬íá"Óž-:¯.Õ‰>{þÿÝ}ÿìÀ¾tý’&_øT¿´ZË»göÂlFùÛýoÜÿj½¯Ã³ÆZJÅcs <ý­ÙÝî·"oþUÞ¿wçûÉ]rø¢wáwý»îþÅðšûmÝ„±Þ6Õ±m†þVV‹åoâùëã£\ü2ÔÖX"ÕSû&W‚ùÛ÷·[¢µØ’¿šû¼×ß¿þ½ÿàOö_íËmöÏ„ºm³^ÛÚ#ÞÉý¹£UÚw¬»7üÿÝù~ö+⟼V õ6®awÓ®¢–îß䴸ݪº[üŸò×j"¹/ÝþeñOør/|KïøEb–ÚóF°ýÔéÛ<ÔfÑmö"#?Ý•þGÿe+è/‹7>Ö,<uø_JMý%dvGv–}þoúÖM²ºÿ}|ëðfÚY¼?dxz-Vã챤JͱU´+5?»ûߺ¿íV—ïìü[ ÜE}¤Oã8¢Õ™6iŒÉ³l»6#ìù·¦Äù?¸õrÂsû@øŸ^KÏêþ³4Ë‹­;÷7löéçØŽžk¦ævß¿ýÏã¯)ÐR+oëU´öOã[9Wí;âT—J¸Ùæÿµq¿æß÷|ׯkñ'Áo'Ãá3ÑW[½µºþÐЭ>Ô©*¬RÄȉ»î³ÿ¹÷~Zð}ÖóĺíÔWÓêHÞ2µ•µ…ô­ÚEÇ›*'Éò¿Ï徕1ŒcîzÅŸŠ¼9 ø×ÃW>(¾¥áýCÄÙ:„§‡í¶=•¾í¾Rÿ¿óù¬ÿý…|e⤳Öüð—LÓ{Í)uÔ¸±Ðn×cË›q½î“øöyHü(ÿð¸fÓãñoÃ+ ÜëúÅ…¾©}‘¥hÒýŸQUÿž­;7˹¿àV»éü$}£?Ŵ燴‚·aѵ/ê0Meyÿ“Aû­.YÑZ(¥UO•Ñ]]¿ß_ökÃßí>$hÖòéWÛm~îÒÞÓVñ&±|‚ïIów˨ù:Ûµä¿sç_Ÿoýôõй—7)á߲߸Gµ ¦¼ÿ‰U½ÌRÏ«ZKºö×r#Ëoÿ¶ÿ"ìûˆŸð*ô~Ѻ¥ñÄ?¬´«ÿYX^E{'Šm V»ÕWM‘DÿÄÏæ¦ß¿¹öyoì+¦Ïá½/SÔÎ=íõ¥ÿ„‡w›oR¦íïñ6Çù7ÿ}ÿÛ¯oðϬ_Å7>,ƒÄZ¥£ÿll–÷PL³Û÷ÖËþY2ïØÿM_ïVEœü_´.‹sñ;Åž“M¾ðNáÛ´žëÅûbŠ]RY_o”’²ýù^X¶ÿ°òדxÚw¹øóà¨Wìw:¸º‰t˹^ê)YþÑþÏï[o•ýÕÿz½ãÄÿ´k¿Ë«Ü뚇ööšÜ^M¬^=ÆŸg,R¬±^ÛÙoýÓ$ª±+ü«û×ûõó‹t¥¿ý¤|9rºDšÅ¢_4Sù-²YëÝ?é—Α>ÿãù?½L‰Çñ—âÀ‰,/¯ôKÿø _4W:2ÅÅb³ù¨n›>Oónmÿíoè¼Câ×Ñ4=S[SÇ:…×Û"OµÁ[Û¦öóR×äûÛt¿y·#üÿß‹Ç:xñ•Õ–›â .l5Y`±þƹûÝ‚Á,²Ån÷oïö&æÚûw3ýÏîËâ« ŸxKLѧñUõÍÄ ;ÙÅ£_=”Ú\«÷þ}éæìM›b¼ÌûSû•ýÒÏ,øë¥kò¥Ö›XFYlµ=Nâ]–‘~õÒáoÝû¾T_3mh¥¬_‚׋¢|ÓõíVæ (–+[NÒx¢óoY"û1EñwÚ–«sáù<-¨oýž ¹Ub•–$E}ñ*|ßòÉ?Ù}•è^ð俵o®•â]gÃrê7V±Aý£sý©§Îò¯ïQ¥Ýµ‡åþصÆÿÂgðãJÖ´»{P¼½¸Ö’ÞÖûQŸíöòÄÈtŸmÝòodO‘‰>ãQ"øòßü]Ö ±X኱íÓ/›÷²À©üoÿ=Q~ÿÉ÷ž½vçãFŸ­üAðΕðóHÕüOàKýE¾Ò×lÿèsü¿+nMËò·Ë¿ø_ä¯ýœ¬þÓñ³Pò´ÙŠ[§ÔåÖg}–³¬¯¨›“syNŸÜ’¾|øäñYëÞeŠ})ín¢Š]FûsºJ²¿ÈˆßÃßÿ×¾êº'ü$ž/ðæµsss­ëÿjK[w¼D¸b7î/ûo±ßgü¾}øÌës«øJæÙ¥¼¸ûT¯®Ù>ÎÏæ¾Äù‹ä}ÿìì¬$3º×|aÿÿö-œWÍâ››«¨ô«F—v£nÚ«òmV—kÀWåÝUSÅ¿cðæžßÙ—°ø–ëEºº‹Ã{™~ÐÛßð}íÿ½Ù÷¾M»)ž$Ҵš,ÚU–›pÚUÖûtž$»h7Êò¼O÷—æÿПñÔWš=²xfÊÎåc³±þʺ–+D–$¸‚&ŸÊ—ï*îTÿgÊOž¢Wñ$ÓÜøVâ]VÎ_í+­vhɽ"VØ·vÝ»“cÜy«€øQy,|E»Z°·µµŠy[íÕíw6ÍÌʯþ·î{÷¿&ïàím‹»þûûë÷j”Ú¤u½¬ÚÍï'o"+%Ù/ʈ›>çü¾ïÍüoZ–+sàÝ> ¸,4Û¿¶Aäouxž_¹üOòü›Ûîry£Ùé´ò]2xzïíËö³2\ ü›üߗô‹o}ôzEíòÿfÄÓËû«O6W؈ñ2íM¿.Åÿ¾ê¯…tKûŸx7LŠäÙÁ¯^JèöóÄžo•¹ÿÜò™öÔ’iØòØÚßDÖÈ×Wì…¼Ô•6mýÓïþÿÇž¶>®ÏüÜ­½|ÿý*¸¢¿1´~ †ÃSx7/еÔßýûǨžmrÍuâÍu¿ééëwÉkh‘gÜŸ-e\¿þ9D¡É/xǘëþx«UÛè÷:Œ÷èÂÍqóº~õgûµû™šüø Œÿ¾öÏÜEóÿÛÂWï-K1ê~JêPÅ©xSàeœìɾѢ—Ê—cìmI?økñvÞ´Ñ›Ãñë¾ÓÞÏ[¿¼µÑ5_±5âYÙyñ|È›WvßâGûõ¹3ÿÅ3ð+þÄ=ÿNIYÿãûRè¶FâÞÙ§Ó|OaÚ®¢·‹Ï—Mò‘ZWeEÞÌ‹óµ|Ô[þÓ«/ï~‡èõä¿°éG—ìËÿK<{À_µŽ‰â?Ùiþ$ñÄ_ 貆7Çü&rÞyQÙt¶[Ÿsí_øS³øµñþÖ[›oøšæÞ(¾Ñ,ÐêÓº$[Ñ7¿Ï÷wº/ü +Ï|û.k!ñ]•‡‰µÿxSD—Ìóõƒ¯i·‚ßj3/îRësnm«ÿ¯Eð—Ãßé^»¶Ò¼®Þiš¾¯Ú?²g}öþlWèê›å’|ÿÝzú’ٴؗà·öÚGˆ-µ Ë›k¹u©w}ž]›`Ù·zµûÙR¾¶¼Óõ_ ø Ä«þ—WÒ_ÏÕ¯™^Òáâ•%}ϹVßï'÷™þùî÷óéºö«å3Çäéÿ½}—¦ÙÛxÿà‚´ûÉnu/ô;‹VÑ¥–X­`¸‰ÑÒ_+åÙ¿|»?¿ÿMãËËÌG4Zýª¿kŸ x¶Ë^ðƒ¢ÇâMcA‰µ'»Ô#‹ìÚÝ]Èû¾]‹.ÿûãexãõ¿Õ5 jþn›ek¤ù·:M½ª%½”²¤^j[Ë¿ky_&Ï“þZËó·ñE©i¶Ðëvð[i 6”š‡›á‰›íÉûßÝK¿fæŠ&ûé¿î¢}ßáõŒvxoöañ/„,t=-<9’A©Ã}ö‹½¾j|’¦Ï—î=D£ö‚5eðÄóO‡·žO§‡­¢Õ5[O²¾¡¼[nÛ{ˆ¥Þÿ'ü{ÅO}íûë¾ñ'ïëÞ}WWž =Âþ"K©tŸ Ï›,RÜm؈»›çFÞï»ï×Ïÿ³f½³Å³A=õõŸÚ7n¸Ó•ÞUò­åtû»þTwÜÿõýÚûKá£øÂZî««éM¥i÷ŸmŸYIQÞÕVWù/î¿È‰¿ûï³uóoÆ_ŽºŸ„üMáMWÄK¥YKyk°éŒ÷_ÚQy[^+Û6|›vìÝóoûÕä>*™|ã}oÅŸˆ´®ìõg½ºÓ4õÿBdŠÝ-ÿuóýè¾+þ¹Wqâ}Ú¯Ãoµîÿ…zú6­²+‹è?ãê(.¾ü¿Å·c¿÷~úÏ_;üWÖ.l>/ëRØÁ`‹,QE§BÛÒ×÷I²ßýäûþÖú´Ó m¼O¢j*±Ô,´×Ñ59n¿°|Cæý¹¢ýÓ¿ÙzËò¯þ?Þ¯ÜOâ«ñ/^ÔïÚÛGºŠê/í›æt–×÷^oš›¶nd_Þ«ìûß/ûÝ—Á\ÓAü'2êWoy ¬Wv$RïGdOâ—ø¿zŸ#ÿ/ªÙéþ6²ËfÚ÷ü"Zû¢êÞoϧ'Úe»£lm¶ûÑŸäÿT‰óÕËÝ ó‰&¡à‡ß ´‰õÆÖ>ËâImÚú'inõFYeG•{í‰þ_›þZ¿Üþ/©~ Úx‹^ýœõKÏ¡¦§¨êñYÜjj²Ë~ϵ%+cü¯ò¬[·WË^?Õtûo x WÓ5ïôGñÛ¯ˆ^-³Í¸H¢Š-Ÿv-îïýïÝWÓz®¡âï|ñ‹¼+áû={Åv…¾ÛÛ¹Ù-íÛÊ‹ýßs§ÉüßÃ½Ûøÿ‹ja"î£á_‹³n§¥hz®“£xÂÿQµIo.Õ?Ò'ò¢Šá"‹Êm±K÷U67ñ|ª®»0¼1à½{Àžñ}Ƶ%ì)wv‘_Em"o½ºŠÁVãìP"$°Dû>ÿð|¨•±ÿ £ÅV¿óÿ•uŸxÿWý |W}%ö›áùuûÓNE²û,±J¯þ•;Eóĉ½YÍݽ>Eþñ&«³öŽðoÛ5]KìP^~õ,Qßû;ÊÝl_âh—vÿ÷ÿ‹ø}CÄüCiñ^Óô‹ÊoÞ³»Jòìݵ>úÿ¾4Zø³QøQà;/ êz.ƒ6Ÿ­´×>ž÷ý•w6ùvÄÿ7ñ¿ûëûßïóѬµNËs¬j÷žTW–w— ¹eyWæfV‹fåÛð7ðEñ[_ñ¿€üá_Áš>=ö©©ý’KZ÷ìéuùWçýꫳ²?ÞþOÝwO„'ö°¹ðÛOìÍOì~lOqkoouö‹¹[íËR¾ÏùwÞîß{ýj|íü]ìÍá]?Çÿ³µ×†bÕå¶–Y⸿Ñõû=½äQ}žTŠ)]æ•âûŸÝ]¿%pÿ¼g>OÁ§ì´·¼óZîû÷W‰ãùHÎÿ½–[ywýß•ä_àÛø9ã”ðßì—o>¡x¾'ðÕ­ôV·Ze½›½öŒò¼H—êèÍó¢"ÿÀþõeˆ£¸ø¥xÏÁö´?êúÚ/õ=ðh7sEÔM¾WOõ_+?ɳÿC® žñŸ…t½KEñ]ݵޱeâoì_²ÚKlu}žR&ä›ûß3|ÿ?Ë{Àž/ñ>±¤øÂóÆZ]”öÚ6¹üK,®|û¿+ÍÛæÄÛ÷n‰Ýw½÷>Zä|7ñ/Äzdž×Cñ´ÅI-ÒØé’ù³yQlWÿHó~_šTMŸy¾“䣛˜“—ýš^-cö‚Ô'Ô%Ôµ‰^xŸûOFÞæìÝæì_›ÈÝóýϸ¿r½_Wø)â |Gð¾±mã//ÃQø’Yoµ=)å½ûw›²W•÷~÷ÍÛ½î²W’þÍšÇü#ß´·ys­7†î-ÿF‹íûÕ?ã×gÝò·ìOŸøwüõÕè5‰_¼¨[3Àú~¹¨N·Ë¬4QK-ÆäßulùÕ¿Øþ?÷(æåˆ¢uþ'Ñõ ω>¹&½¨^iOöÍ©o±EtÛݼÛâÝûÔ_ö<¯‘ëÁ~9y÷‘x?íŒ×’Åu¿öf݈‹½þwÝüRÿ·ýÏ÷+Ñm¼msmâÝ*(5 / ZZ¶£oýoOw«Ëº;ÅýÕ}‰³ý­õåÿ¦ƒûÁQAVz|WŽŸd´ÿ[q/šþmÆý‰»û‹÷~ãÖž³­|&Ðï¼?eâÍ9¤Ñ5ˆ4{«KfÔ^VÔàm­²ábo•àÚÒªºn}û6WšF«7ì·j“\êPh÷¶M¬÷•“s|ˆûÛfæýïÍ»æ¥Õt­y5Ÿê÷/s5”K^m¼OöK Ucÿ"|Ÿ'üõª·ú“iZ5ì÷–Þu¼e—Øôý±<¨Íå2y¿&ÝßÇýÝ®Ÿ'ܧjºÅçö§ˆ,g¹´‡LµûÅ®ƒhËöxblySø•ÿtû”qº“½ÏÆ=×1Ë©Oo†ßþ]]6'”¿ìÅ·gËýÚé|A¥ 3SñÔ“i±Ý´MtÒy³OòÊÿwgîþuóݸ?Ú¬ bæ4øêíyæèé¶-Öúz§ú/È›boáù>ëîþ-ÕÕ_øŽñWŒÆúöæÉn–ÖóX{X¢yb—Íß·{|ûÛgßÿ–Hõ7Å:F¥ÿõ¬]îŸodo¿´¿âY›} MºWyvE¹]7nûß'Ê»¾åqŸïîÏ…®,ßm¤WÊ‘Dßññ/É»kÿfÿ½ýæ®×R×o´ý.Ò{í´[vÔî¬'ÖQ¢K»Õwmé*où¾e}»Ñ~Zá~$]­×ƒ.…½´>Rjj¯}*¤Ý3#ºïÿkûÿöÊœ†kI¤-LJü;*hÌÏm©D+‰uöþïÝmû7wdU=…»[{Üêk¨ËjÉ}oòš%o‘vmùÙ_ýÝûŠ£“S± øoOˆê7Ó\êj¯i4λ6lùþö÷o—ûÛQÿ†®[j[ï.ìm¬àÕnïe–Yÿµ–'{yWfýò}÷÷¶¥šÒâÕÑ/›½ÿ‡äÿ¾«ï»Ÿ‡SÜü+ø[áír(4Ø"Ó®­å»²E¸»[Ý5Ã:·ßÞ©±Ú‹þùÚ>í2 ×´¨¼Cu¥Ká[Ë»m3V±³Š-[Íß©¤«,In’§›óoMŠÛÓø?‹Íí¿´‡¬ü7ûRý˜ì/,ö‰ÑÙÝYŸþZÿªEòWÎÿ´ß'ã…Ŧ™¥_y/=«Ábíþ›,L‰³wý5—ïÿÀëéÏŠ^Ó¼àï ÜÚGyñ,.ìüõ–å x™RT]»™‘þDÛÿL¿†¼ÇƺƫüQðVŸ¢N÷Zí¾«qq}¨][l{ø¥ò™%þèÛ%ò¿»¹*9y‚'¼x='Ö"ðR´ÿfŠ-Z_*ïÃ=Ä[mÓbJêîʱ7ÈÏü_'οÇÃèŸnðóéšf Ú{ë!¼½»m;FÿUtí¿ä¸v¼þSÅ*|ÛV½ Ã+áZK©Ë€î%×eH¥±Û,WޱEåDû“ýŸø¿uòy<ÚÃMíÆŸ¬e¬b¸ñEýÅæ™xŸ>¢·RËË4HËæ®ÔDþ÷ñQ 8mVÎ/øVŸ í§³ŠÏP°×^)Q%ÿA°ýíÃ$_}÷K+'ÍþÌI_céZO†¾$|=¸ðޱ¦5ý¼÷Övóé7½¾™e¶(¼¤–U_žX·ooöY>Uþ’>*h:V›àßè:S^ÜÚZø’[‹[UÓ͕͋Þâ]É÷ŸýR#ÿÏ)kë_é¶zÞ‡¢hqjåÕ¢ºþÏÔ%x’}¨¾Wß÷¥DØéþ_jr÷BGUàÏø[Â>¹ðbÙé¾0Ó-õ8´Ùíµm¦YÀ±D±$²¼_½e_™¾ó|é÷ƒ#Äú?…ÓÞ#±ðÖ‡m©[Ý}—í¦ËKX ‹ý$—ïKå.Íß>ïŸø?ƒvêÂÓY´Ò´Ä´Ý©¿‰v˜’´Z|®¿óÖ]ßvU‹ý¶oý•ñ…ͲxUoìûÝVáµ;ÄŸF±ÿ¥ß÷Óïü¯±þ÷û•·1'€þË ¤x)u¶d}+v›»S´d—PIgH¥–ÞÝ67ÎìÛWû»?àkïv¼'mâ«¿Kcƒ©ßë oy}¯.§©+<_ºH¶:®÷DTDOà¹ü7þÆ_ Ë{ý§cwö‹ymoWS´Üñ@Œ‰*>Åÿ–©½6}ï¾ÿð?¨<7¢Em-–µx®š}þ»qqö¿™ï¢ÚŸ'ÉæüªžWð|ß½þ/ãˆÈSXðÇì=òÛk}£ÉûRÊÊíjê›W~Ï+ÌŸºŸûÚÿðÛx“TÒtû>Í-”WÛê?%¥»üÿ"|ÿ6Ï5Ûýï›ýÆê¾±Õt¿ÛX³[J¶wSý¹‘?‰ü¯Ÿï&÷uï;ÿÀ/ÚyOÇ_ì¯érù\éñ]l¼Ô]ü«{tgÛ-Â>ÄÞ²¾õM›•v?ü ßì÷ªÏmû2iòÏc¦ÿ¯ß§§íû\^/žá6>剶}ÿïîù+7ã߆4ë¿ÚiúEßÚ5e}É6Ô·‚vßï|©¿åÿißýº‡ö~³³³ø¥_OáÉm¥eòµ ÛÒý¶|‰·Ê¿üïTs¸°ð†¼kâ½WÖqiº}Ö§jÿÛ:w›²ÉÕ?Õ2nûïóüÿÇÿ|q©á=á÷†uX‹¥êVé¥K+Åâ™vyQ*ÇÃnùZTûûý¿š½+D{mbÏGÓ4õ¶Öíímnµynõ6ŠÖÞÖuDGx¶"y¿*$ªü %[;k9¯ôÏÁlºUݺ߼·Úœ[ÑQSvËtßó2;»'ÞùŸø+Á>.Ã}m¥øJúñe†Þòùž×Q¸ßö½‹+¦Ï™ßr§ÏóüÛ·ÿ±¶¾ƒ†ÎÏ^ºÑÿ²®d¿þÆÓ.®¢¸Ö^+{{YY{Ä›>mŸëø¿»^ñöæÂdðlú{^Må4H/¯Wb&ÙeÙo|¿"oÝ»þšÿÀ©Hg¶üW׿á!mJ¹Õíµ/ïR(›IŠ'ûEÖë„ù"•~ë3}ïö7|éü}çì,ô}SÒ¥¶ó4{²Øè;ÓgÈÉæË³øþyÿ¿ü+‹ýšæð7ˆÁ¤ÞÛ+&ýì‚ú%iQu»ûÛöÀ›ï}äÎ@_ÓaDµûuË}²Ñ嵕t”óRûQYvoØûþ]þVƽ¶/¿ýüËÆÛI×ux§ŠÂî÷ìQZé–‘?ÚÙd¨îûþëìß³~ï‘>zë¡Ñ,Óí?a‚åî<¨¥Ùò]º+Ĉ‘|Ÿ.ý‰üþJLJA±†ëU¼‚Ô’þX¼÷™ÒßnϹò|ªïÿŽÅü4€òèæ–Ï㥷›wpB?Ú^'rû¶²´«÷·?ßÿŠöOØMâˆ7-m©Ç¢[ÝZÝEs¬ß$¿Ù÷Kþ‘­oµ~ãÿǪlþó6êò8w?ÇÈš(ìÜÊ7»êͶ+­ßz_øÞ_—û•êÞ'³[ÏùVÖˆö·I¸e{Hš'—dI÷×jouþ-Ìôâ=ÿ†4ýz /ì¥ðÛÝ+$ú¶¬²ÜZj÷]íþO•_fÔÙòíO¿^GñIe¸ÐɳZý©Ý.æÜˆÌÎÿê—î&íŸuç•z¾¥¦Áu§­Ë5ä¶ï]2ú]öµ%M‰ÿ §ûHõæßá·³ðò[çIVçvÏùbŸÞuÿøÜz$TNÏΖóà²4RϬ"^@ÿn·‰’[ Ì‹ó¯ñïoÝ'ûŽÛ*ÝæƒÒê±Kü&h×+qs¯[ý¢Þ[yY>5ï}Ý«ÿ Sô´kŸè¿iþÏH]üß¶éŸ}š$‹çuÿc~Ï÷þoîg¦‰mmk§ÄÊÐÛ¤_gŠãIÿZŸsýnß¼ß>ÍÿÞþ:_d“¿Ò—ìöPióÿi;y²¯Ù"tÜŸ&ÿ7çþ?¹ÿ­ß‹V¿À/W.›íî-u˜–_ï²êRïÿÐÒ¢}6 +H‰ZÙ^Þ(¾Ïæé?òÕ6ûÿwû÷«Wã6äý•gÏàuÿ„ÿKR´¥ðËü?ª*[Gü_£4ì÷}Ù¾Dó_î¿Uïà ÷hÐfß¡Å.ï½½ÿñú†ýþ_•k(’o|Ûÿ -÷}Ï"oûû_¼µø)ðYÕþ#\nûžD¿ïë×ï]CܘŸ‘W¶±„®V/ô™|fŽßÞTÔ“gþ†ÕàþÔ>Ýà«gÝ÷ |o¿ÿl{þ©_=|Ö¥Òô;R-ßhÒlu»Ø6\Ëo½àÒ¼ÔMÑ:¾ÝÊ›¶2î¯? þñ‰ÿùQ˜ÿ¸a?Ã/ý)Ÿ=xÀšßÄïYøoÃvRÖï7ýžÓÍH·ìF‘¾geQò«kè_ kÖºoÂ]OÃÚ–¡©\êW°Z,I-¢J»7˽¥ù]ÓzoH·|‰ûÝ*4þý¹5ñ]ñ–›wÿÖÞ`ëz¿ÛGÈÛ<¯7QÙ÷önÝü;«Oº÷‰u/^ë–6žþÄÒ-b´]èkË:ïŠ-‰ºßt¬Ÿh‰ÿ‡zo}î›ûž<žç|:_Ž6îùu¨¿ô;ªýC¶û46 ï-¬ÛDÿ­ºœß>÷Ùotþê|ÿzü¹›Ê{ù¬ÈŸÚË÷?¿¾ãgüu~¢Û_Åö?†V¶7—:•ݼ÷V«.¦®–—’¯”‰÷~ûüßì»Õÿ˰‰Úê7.«.«³Kxš”P§‹aÿvùþMñoûßòÕ¾ómÛ÷kæ?Ú*k—ðGˆ/.g¶ûlòÝKuw¹.6¼¿½‹ø·&ÿ“þº§ÞÙ_N\ØIi©]¬êé®Ïx޶‰¼è—[›øßgÊ®ß/ð®Ô¯’ÿh}bÎÂx^+;'»µYî¼ØgtŠ/žTóbù6ùQ3¿ûß'ÜùëÍ”eíc/²mÍSÃ?g‹h/4²é÷:«¥ô®°Û²"Ç”¯+¾ïâEùâÿj¾ƒñ 0j¾Ò´­Næ;Ÿ·êÒÛÙé>¶ÿH÷Ëóïþ/™_“û›_øëÅÿgˆtËmõ—UÕ-¬¥ÔeH­íâ6áâÓå}ÿ/ÜòŸ÷¿î쯢<y>ƒ\ø‡JþÄÒ¬®®¥ŠúÑR[µýëüîü;6ïþù?‚½(œÇ?ñƒÇúE‚ÿfxªò-cOÕ´› ]:ãÃÌö²ØO³wýõ³îoûÿ>Ϲ_3ëóÞ~Ôë,·1ßÞµÕºJöë²$•bÚéßá‹gËþå{ïíü#w^Õìu­/ÂR´º]½ä¶0;£¬IþªTŠ$ÚÑovùþöÿ¿òW‡ÜéKsûO[ÙÏåiº„Öûlmþt°Š+W}ŽÿÅåmMßÞùèŒ}î`‰ôï‚~ͦÝ\\ÙÛcý—QºûT:ô^nè%Š/’ÕÕþóìßýß‘÷ÿuü¿Á>$žÃ—ºÐk~Õ//%¼»¸ò¼Ø® }Èöé½÷lùÙvÏ‘¸ÑKoLÓ-VïÇ:U¿ˆ¥–]'QóQí_ÊGy_r}ïü¯úëòo®*;‰Ó^ð犠ðü—ÚöíîÛëK§_ì»9n%ù%FMÍålfo¹÷]މ{ÑÏõ_í¿~ÜÚ_ÜÁi/ˆvŘ/nŸs¬²ÿ­–(6lþ9^¾¾³Ö>ÙðÓOUñS%¼ºÕ»²B»ï¯Q¥EýÖØ—Íû‹ò}çþàù¿ãÇŒ4«?†ž×<5y±iet–­¬¾Ý÷WKö­ˆ‰³þYy»Ûýô¯½ôß…(g*¬Ö-uý¡kçDép¯³z'›¿î£¦äÿ€Àö§ðóæúõÍçö¦•|·>ðý¿‰-ü‹xYŸP¿Ý±¥DÛ˽Ñ?‹r?Üþ _k?ðêzf¡s?†ôx/§µ±´´Ý-ôîÉ»çùo›½ö|ë÷~ÏŸo°X| Óìm÷ö” vÛÞØ‹oß»j|ì©ýïøqŸ~Eà?|Eñ™,÷7¶ºv£­@÷#ýžãìÿ"où÷,[>Z¾h’|Ÿûø†{û„¹Õõ«»=OíP$Op¿è‘[Ĉˆïòmùbÿ»ÿŽ}¦ë6*½¼±¾þÕ½MkdW{[ìöªÉßO+oÈŽò¶Ï›l©÷?ƒÇÿaëöø–¾%žÚ&¶·Ò×C–+yW͉b– w¢ýå)?Ým•õˆ~éZõ‚YÆ¿cÔ弊öy¢_’7£Å¿nרŸ÷é?Û¬Àñ¤ñ&¡¥koªéòµåëkùºƒ´¿gµÝ³äù¢ùÚ-îÿ]Sû?üBÔ¾ÓûBx_ÏÔu›ËTŸQKt{9Õ?ÕEýæ‹s|û?þF}õöÖ½ð+J ÙiñyöÉâÝ4ȾoÛgþåÄ[öíwtÿ¿I_(|oi~~Õ ül’ÛCæèÓùÞnÇù®.ãwýuß÷¿Ù bׯâ}/ÃðEâ6™"ûB.™¿Úäwûê›·&Ï7þŸð[|#øGã?Û\ê­ÚjzvëA¼©¼´*º|¿{~í›ßïl®Cög¸¼Ö¾ èðK;M­æ£k¼«ç"#²}Ågù6|­YÐÜøžçJ¼ÖÏmα{t–­oo½ôÿ"TùÑ%ÙòïDÿwä+°ñ&¿gâ‹k–gÔµ7µ6·ö|Vû7¾ÇdÿTÿ#ÿwj?Ïóשkß tÍIôý>Î)lì¾ÕöÝGO…Q]¿sço™eùfÏùêÿ'ÉTµ¿„ZV¥¬øj ž*Âù®%Òm"Ø’îÙóýýÑ}Í¿%jAóÿìÙaý·ñ§ÄRËáÛßïÓ'¸W†w·}ì‰þ”û~o+ûÉýÏàjô c^•ôÁ¨j¶×(³ìX´Åù"þ³»ù¿2ï}ŸÅò½p_ [ÛÆS¤°ÛÅ©kö{yöm‹Ê؉¿ø~ZúbÃÁše†i§¶•l‘[Áöx¦Hív:ýõO½³øés{¥ž9©jº¿‹WÂ’½ÏöÅÝ×Ùm-?Õ[Å¿Éqóýߑվ÷^Eñâþû[Ѽ}¨ß6«¨4#E ¢[§›/uß÷÷lÝüî×ÔZ?ÃAð¤ºc@¯nö³ÚË/•óþ÷ä}ò¯ûúxíyáx¼!ð£ÀÖ°*§•<ñ+ªìivÅ÷Ýÿ‰ª$(Äõ/CsḞì¥øuo/†âìÄ—íéóït}ÿwûŸÃ·Ý®+GÖÚkv+«¶•iqbþn™ó½Åë}£ç‹›òlo“÷wüõéÒ’ÿI²¾ŠÚ;™gÑl-g{åYå’lÙ»î·Îô'´ÏøHî58¬`ón¬â²ÞñoM‹ÿ<¾O—û›ÒÏ/ñ›¨h:_Š4 ^Y|=åi£`©ä·Î›Rá÷|Û¾]Ê”zµÏö{ê6W:äúmž‰?‹-þyl Ùo¿dK/̱#¦Ï“c=ÃüïüYþ!ÐoN´ñ,Uχü÷µoZJˆ÷:|ï›òìù>ê²ï©¼g§.µg¶ò6n‹t¶‰·ÊuûŽÿÄß7Îß&ßë'Ä:ij\}³È¶°»yRáRÆ$Š(š-ê›îýÝÿ'ûoýúÔŽc…µ³moöŒ‰c±o•ŸÊvû?Ÿ³ø¢ùþEM¿/Ì¿r½²s/Œ,ÓCû\V¶7ŽÚ¡;#éh‰+ý¡åvMÍ|Ûnév}êðïO=Çí%á«™mà…îîlçkx“ʈ#?ÝÿweoÿÂg>±£n¹nmî§gk»ˆ¿Ò7üîÿïowFùþjÎ?gkªè6ÚÞ‰w¥xCZŸÅ®ºdWWš{Àö÷z#¬©æ¤[¥ýë&÷_ûjí³û¾)ñ:í¤ðŒV­©¼ëã¿ØBªþ®ßì}Õû¿{îÖÝž¥ö :(–Òvº[Ÿék>çGâÿö+ÇWÍuà!ØàKx%FŠáVfþþß½ü÷Ý"?ë=„º'‡ü)s.‘má‰edÛ¨Ã/›otëå2#¦ÿø|›·ºT:•厛ãµö«†÷ØŸÃó|ÔF^èËé~uÝ=Δ÷]4¿>ï?ïªÚßÀ³ø¾mÿðÃãbÆ-~Ïë·gÍâ?“þâ ^s£ëÛ_¢ùPM¶)b_:}»·ýÏý ½ãüšÇìõÿsþœ®ŸÃ/ðþ¨©mñ~Œw†÷Â+§ÿ×*mä˳mK`žN‡§Åòü°"7ýñUïïî®h’töÍñ.á[þyAÿ£^¿z+ðSà>çø}·ïùVÿú×ï]7¹ â‘ùXËðCà0¯ü"'þUR¼á>>£1ÐcYR{ý;T²‰Å´·ÍŸEDO–$yvî•wmF¯uVX>ü ‘~}žÝÿ•Šð_éwš~'ÓïgûMÌZ?ˆ7L»r¶‡òã»+‚‡ûæ$úœ|£,ü2üÙgÀ_°Þ ¾+²>2Ô®ÿáùÅçö‰«ý´ü³ÊótíŸfíßú¶ü7áÿøO³hšn¹e¢hº¥œO.™/‰¬­÷A*Dèï·•ž/+ý­¿/ÜzùcÀ~;Öþø¦ÏÄž¿n·g¿ì÷~RK³z4mòº²Ÿ•˜s_E|:ðʼn>x›YÔí¯¿µtÛX%Š(¥û=¼[’]ï+´N»‘‘6ÄïKóª;¶Å®³çŒÿ†öÖ×–ò®vYÏ,HÿÃ*Ë.Ïø}›ñjæ}oáG‚´ø¼Kö•ÅÍå¼K§ª'ìö茿sûþS¾µñÃ{d¼·øÊ²«?•òìFØÿ,²µ}‘ñ-zä¼gð»Äpé>;ŸÍÑ5¸¬4´O}öèžáÒ-Ÿ}÷þ÷ûìSþ&ø=¼ ¢ø‹Ä·×Éý¡{mý•ÿ 4ÎÉ/š¨ûÛ_)™7ïÛü[™?ï:ñŽ©ÂëW‘C«B—z[µ¿›ìº¦íŸº6mýê*/÷•’_•j)Ô§Wá s¥á‹˜´Ox­m¯´ßi¯Ïûí±K÷´÷Ø‘'÷]þÿý2¯Eø>ö:•Ç•m¦Oa-Ö£uæêzš½Å½Çü|'Üÿw÷_&ß¿ó½q^†åïî«oJšÙüM§ßn¹Ô¼ßÊË}pŸ½½VÒŸçÿußî¥_)'®é·’Þx£Oó'Ÿ[´]~âU»ðô[.Óʉ7¼»_ýT_>ïáo“}-×¼96¥¬xr{›-KP•¥ºÐ¦±žX¢X¢—þ=î~_=]’ÿ³óÕOh-suâ½_ûF}îßXDYtùÐoâdDx®7§î7íݾ¼ÖSèqø~Ú»ðM­Ö£uçè7^kK¨£í‰÷3'ñ®ø>o÷¿¿QF§º\½ÂˆpÜê_<4ºÝ¥’J—‹\Ù4_g³M— ‘E±ö³»}ÿöR/ï¥}‹¢ÁEçÖüMqáËoEæØ]]X-Ä·ÿ#}—ÊW}¾WñïJøë⎛öŸ„Óâ±»°{[õ°¾ý"¤©æÊÍ÷™ö$I¿ømßgñÖ€Îø»â9w,;5mfUù¿é­½tÆVøŒeðŸ¢iûaê·6þRøOOÿÀÇÿ¾?ÕW/ñ§öÔ­ÿ†Ï×®b—þ)}-âUùQï%ÙþÇɲ¾gøÓãÏøO?h…þ3¾´‚ÛZ¸ŸHx-"—î’êëþƒê‹MÕUín?ÚW¯?ñmœ·?>ê¬ñ¼PE§[ìÛóü×WüCUË–FR—Ä{®ÿ×ß¹+|¿*ÿ±L‡GþØø)ã=>&Ø÷·–#íÞ‰ºâ%Þõäº>Ø®¼¿äýÆ©óÿÛYk|eÇá>§OÚÓ_¶óY¼=¥¼R«î‡íRýÿïýÏö+Cõwˆîug–-KGmÒ¯<¯å:§û•óUåüH›WïÿjøVÿeý»nþÿÐ+§Ý9¹¤>Þøoö‰ø‡â¥†Ú]J MR÷ÉdÿGÜÈ¿.Ïîüõè ûOøÎk;}«¥üë½wÚÊû7ÛZñIþ_üFfv™ŸFÔ~gÿr*±msØíþmïå/þ\Ñ:e#×á¤Ë|í¿æoš«ÿÃKxáÿå¾›óÓŽÿýž¼÷ÅÇâ‹ÿàýÕŸÉÿnVõ“ö”yR¦2 õañ_ÅZ–—n×7ÖžUüW >ê[¿ÕmZÿñ}žãøh‘q:›Ÿ‰ÚõýÇŸ+Z܃gÈ¿Á÷þíoxo^Ô5ë;ë››˜·ÛüêžB}ÿøû•æ3\«§Ë]Ÿ‚fÿ‰F¬ßì¯þÏD~ ‘ô×7ÿ<%ä­s3½—Ί©üuÏCãBk5‰¢´ØÛ_ýWÿgZvÛ¦øÃàÿ—øí‹oñ×fÿèq»PiöNÃÃÚõö·œ²Ç "¿Î‹þÇûõ‹–äxcUŒÎŸgŠX¾EM»¾j£àÇòuÄÿuÿô ‹fi´MWþºÅHÏí Ôõô?ÑÀ%þÊŠ_™7nf–Z£a­Þ}µ"ܨ’þé¶/ðS¼Dê‹¡|ÛÿâOþ†õ•g7úl_ïVe­æ•ö=Q"‚å¾vÙ¿j×G¯C>·ðÇá†Òÿ£Ëy¨¢üŸq庉]ÿñÄ®R›~·nÿ–¯]+¦ÿ |_úˆÝéjWu/†§øTGòâlùUv'ð¢V%ãýýÛ«zÿl?7þÍ\ýüÛþíršÀ×Tñæ Û[ýU¿þ‡-~ö×à—À§oøO5=¿mºãï_½´žæ+â‘øë`›ÿgß‚I÷÷xY¿ôõ^Eái>'ñ¶©ª¤Šºeúß[ÜZîób‹EÙuò¤±|Ω.ÏÞ¯ßJöZ¦«ð?à—š¬ÿeð¦¥*¢;®æ‹P¸dû¿{æÙ^ ðûÁš–âx\YÏs¬Åcâ #in¾l¯?öT©±U>ón¬ý—%z“þcÑ©‰Z©/1Õ|ø‡ðWNø¯¡ÜøjÞÏÁšÚ ÌÞ¿§\Eemþ.ÿ5ÛYuù—r/Ë÷™kM›Âi»¥ð¿‰/%µ%¼¸´Ö¢H“çDß³ìOµwº}÷þ4]õæ>ý”~'øëÅvz'ü"¿‡Öè?üLõí6êÖʨÍûÙ|¦Û»nÅã–e¯Qøe¯økÂÞñN‰®YÜÞ]ÞÙÅż_ÅRìÜë*í_7ìòìýê¿•÷7ìec3á¿›öÏWñÁu»clØ»åÞ麾ʶ²»ÿ„OÀ¯c§ÿc»ë—Im¬\?›+JËjûömݵ>VUþò |“lÕ¾ [,«º]YÛnïîË/Ï·ûµö±ñSOÑþé2ørÎï^ñn«]]K§\E,±34Vì‘"|û¿ç¯û»þ÷ÏD£Ó”dOÙ=/Äþðö½. ¾:³‚óD•åFÖn.¢‰%ó^U‰î-÷îÝæþ÷çÜßsçZù¯Ç ¤Ó,|g­Ù麵¿†¿°ÛÈ6Š·e«&ß¹/÷•UvýÍÍZIâ¯hÿßÅ_cÑ/øY4M>/Éycä¯ss©Ïk-Ū?˾'Gù~Dÿ¾«ˆÓïgñ·Œlµïi_ð•[éדºêÚŒnöp2+3·›ò¶ÿþö•о¶Òhˆ¢çÅCÃm§É§Ù"ËxÏ¢­ª[ª®×tF¸ù÷}ýÿ2²'û4F!ñŸþÒßu¯‚ÞÓúãþ+ü1¶‡á§Š5[ÉZÍ4Ýòö M2v–ââ_³¼Iö‰]åùþâ"×\¹LcŸ³ëZ…÷Ë™5 ‰'»Ký9²üʉktˆ¿÷ÆÊö-D¾Ô§Š+;;™¾Tù!‰Ÿø‚ßðüc‹Xþ×­­íSHŠ+F_5%h­î"}ÿ:6Ý›¾å{Ý·Á9tHXöÎÊ%‹ç±¼]ŒŒŸÁæ¢7þ…\ô½ßˆº‘+øoöxדÃWö½=—„´H•ݦեýëÿ°–ëó3WÎþ6K»?ˆ“tŸeÛdÒÄ‹ònûmÆÏ›þú¯±|=ðõ^ÖíntÏí+ØzÿÂC©µ×•óýô·ƒb·ý÷_2üq{}ãïÃÿÇ,÷?l¹Ó¯çºiWn÷½¸gX¶ýض˵SøvUT”B1A·ökÆ»¹tgF†]Gʉ™_î?”ŽÌ¯ò}ʸ.nb§Æÿ ø{á÷€üg¢ø'Äóø±ìà°yõ x6"_ýª/’/ökæ 5[˜¼&ò0ƒSgÿ¿¯_]~Ð:zø+á}íôV¶––º\ð,Z^’Ÿe·FûT[ÞWgv›Êù]þdþçÏ^)ð£Âºg¼ ¡yóº^¤÷‹k/•½_ãù÷/ݹýúŠœ²—ºoöNMÓnoö*«;·Ü¯Uð÷†<5¥x^îçPÕg›ÅòiÚe¤_º_ùê÷þçÝÙüTýKáúk?ïÙÓvÅ7b?÷>ôHß?û•Ûx?áì^Ñæ(­,Uÿ´Íö«ˆ•¿Öº»lX™þGEo¿WrróŸ<êêËñ#â*6ï“E¾OÞ§ÍòÅÿÀ~íR³…fÙ_Áüÿð ê|%s§ÿÂþñZêÚt«{ûylRëçx•vy¿Þÿj½‰> ÛxŸK·×"X­¢—gšïDêÍ¿f÷O—çÙýÊÆ15‘ãš 6pËj$K÷¶Tã‰|o,HɺĮŽÿÄ¿gþöKƒöÖrÅ<¿d¼F_—~ûüsäÿÇë‚ý­´K=7Á¾–’{Û‹—Š[¹¶ïh¢‹äO“åUMïò"/ñÕÊ^é1¼yWŽaßâ‹ßïùV_÷ÏØ­ê¥…ŸÏó2¥} øOø…ui¥E¦*]ý†ÏýL^jOpÖñ*>ϼ­÷>ã¯Ü¬øRz|7HÌÐ&ß¡ýÿ÷ölÙ¿ïÀê#ùŒ&™s£iê»íâ•ÙÓî#®ÿ¿ýß¿ÿׄxywxPo+~ÝVß÷¿ÝÿG¸¯­í¼cgá}V/*'·Xám-þK5StR²}æÿ»WÎ -¶x7Z[•—{ß[íMì¿zÞãçÿ¾Z¦A‘†ï|sm ž¡/Úe—by)÷Ù>»Võ‡«ake}äK äRËc3§Éx±Kµö>ÿ›gû”hðÏᇖ{Ÿ±Ëå|·Åûß™?¿¿åªå”> øÌŸXZi¿¼;mj]öGkæ£íÞ²ÿü•ÂéVÛâ‰?‚º]>ÑŸâæ†ÌHžâ-®Ÿ!_þÊ´,<7>½a{yg÷)akæÝy+½íâ]‹æ¿÷Ws¢ÔrÊr/á1|<ñYëɺUO•¿ô Õñ•½ˆð-õæù`½–ö8’&O’UÆæeoö~Oûî©iºjÙê1N±E3ÄÊê— ½þüUçÔüGmö‰åûeÆí©±v|¿ÝÛ÷ïŠí>(Þé¢6Ï—û*Wÿ¾ë>Ïj\BÌß&ä®ÛZ¶–þ ÛGæLòéV¨±›{ÿÿ½óÖ7ˆ|%sáz÷EÕlg°Ô,ç{{«y—cÅ*ýô¨äŸÆÐ:í*3[Ö]u™lí)eû\1y¨üþ»U4Ý{íëðËOye•ã²¢/ÜYn¾þÿøþ9YWúö§ªÚÅg,±}bÛÅĉÿZ©¢L©uá}Ëûß!%_ï}µÛÿŠ«æržÑ~ûâù¾G¬+ÇùmlMr¿ÃòVMæ×ÿm)tŸþ+­OýÛ_ýž¿|ëð?àWüŽZÛqmÿô¯ß ™Ov~.xõWøð6çOFxŸLÕ4ù~o½»R—ÿeÞßð óσ>'ðM‚ø—ZøÏ¡ë:õÆ©|²Úß[ù¿fù]ÙeO¿¾*û³þ Çà¿øŸöSðeæ±¢Øê³@Ú¼Owý‰öÙ]þõ}Iÿ £Àïnñ7„4o)×cBöi±¿àµNnbÌ$ñ·ìÊÿó!x‹þþÜòUð›þÌ_ô"ø‹þú¸ÿäªý=O„¾ÿ¡'DÿÀ§ÿ¨ð*Ì™¢à Ö"æ‘øÁ©øsEðφ>%xþ “Eâ]NãOÒ´ÆÞ—u¼·lWOÿýÖÚúrÍ4©¢Ó5[kDÔÒÖ$ûr.ÇÙ³øßø¿ßÿb½{öðøo¡ëo‚¼!¢éš†íõyî¯n®--U¾Ê‘2&õÿnZù>o†>:ûSËÄhì"a·Ó·¢ÿ¹¹êã"ÏmÑ4­?[g¹–úÒÂõ¥Øßß—äDóÚù>OøRø„ú/‚|ªø‚éluI`ž{x•UçþÿñüìèŸü]xÌß¼msóÂÍ•>]Ÿò Oþ.ªê_³÷Š5¸>Çyñ>wŠ_½ÿïàÿ¾éÒüÕtÙø×PŠÆ/±^øš{Û[µWx¢•gû?srW¹èöiöûI~Ò°ù[“íóùI±ÿô:ùÞÃà&¹á94ÍÇ_Ø–ˆÌïö¿»gßÝ+ÿsuX…7nÿ…·©|ÿÆöiÿÅÖœÀ}eý‰¢½“Á¹lé*¢lýÖÿîìMßìWÇ÷þ*Ðÿá¤môûk•›UƒÆW÷³Ý£o‰í³âŠ/ŸýôzÐO…:ß¹¾-êIþߨ×ÿ‹¬ÝöT¹ÒµK½U¼lך›Àñ}®ãNó^%ÿc÷¿/û5ŸºÒm†Ÿ¥iØØÛ[[[³Ǽ6ɳnÍ»?Ýùk²°³Ò.mSv¹ôU‰’o¹å}Ï+cÎéýÚùžÏá/Š’/Ý|RÔ‘?ìÿB|%ñF×oøZšÊ#ýíšt_7þ?OÝ$¡ûphö_ðŽøWEð·“,ÿÚotËm±]ÕmßsìÿaSÿe¯OøñFòÛûau=çMÓì-ìÞí|¤º‰¼Öybâ_ãßþÝpZoÁmWJñF™¯7ÄMRòîÂT–(®,bò¥Ûüüÿ2üïò·\§ˆdí+]»ó[Åv{YþK+¢ùwîþùªéËÙKš"”c(òÈúMõ(.^)þÙäÛÅ/î·Î¨ì›Óäÿj¹ÿŒ×ÿfø;ã6¹•S~u¹÷|ûšÝþOûî¾uØ·AEù¼g¬¾Õþ8–¥›ö*ð¾Ï›ÅšËÿ{÷I²‰Tçç¼â_‚úÞ˜Ú.¡6§yk¤êCiïH§²•÷üßÜwÚÕöÅÿ¢¼Ñ¢Ò¼ûk Ø›ÊT{­îß?Ï÷Ÿæþ4ùöÿ|û âÝ OÓujš¤6±}ž+«‹h>Љò|žnÝÿÁ\dß±‡…R_›ÄzÛ¿ÜùÚ/þ"®IF<¡(ó˘úŠÏXÐí¥{kk›DH•âwûgβËük/Èÿ?ûuògÇ‹yµ¯ÚÂ^%Ó¼»ý'Ã殮óÂežë©YwmûËû§mÕy?c?ÊÚÖ¶û¿ƒt_sþø®Ã³Æ‹àË]BÏLñ¶–Wÿºº·ymöKò:|û¢þã¿ý÷Q)sÊv¾'Oáï êð”A›-Ô¯Ùõ;¥ÜlOàWù~o㮊i=Ä¿Úúz^ÞïH.&¾M‘n¹÷þ_÷Þ¼VoÙ À÷’ùóßk>l¬ÎÏçĈÌßì,_-þÆÞGù¯5dÿaî—ÿUûIrò˜û8óGí;ªØøÃá„ú6}m5î­qoog§ÛκV¸‹dOóü¿ßÝþÅxŸÂ)ï¼9¦xRÒ}5ÊZÜÜÿhù—+ [üÌÉ¿s¸Ë^™¦þË^ Ðuµ >ó[¶Ô-eób¸ŠñQâoûõLÖÿfÿkÓ¤úœº½ä¨»Þù>çü*Žo{˜¾_tí|Uñ#OñW‰’ææûH°¸X"{¨ao²¼ª©òoùÝ~ï•ÿ|SSÅZW•·ûsKyUšX.uÙ.Í‘:oû»þ÷]ëÏ?á•>§ü²Ô¶×ÿÿaOOÙoáäßóÔ×äÿ檕iU—4‰8Ò,O$¶t‡â7‹uéZ4ÒuH¯ÒÎîîéQ'vGTù¿‡{#üõïßþ#|ºeËÿÛãýÊšu%KÞ‰R§|GUñÁ>oüŽ:[þé7lþg¯6øýã ?â>‘ Zè—0x’âÎæ_=ì¾H‘/)7¿Ê«ó5nÃ<|>DÝý•>Ïúü–®Ø|ðvýŽÆîÚ)[s$Z£·÷êy‹9/†ÿ´ÿøËû^-{OÓ|­: t—|¾zžôþ¸éòWg¯|kðŽ©q-ä¾*´šâVi_Ï»çÿgýçª7?ü÷_ò/3Ý·ÞO>ã{?ý÷MO‚~ ùÚFè¿ÇæÊûñúÖ5%ËÊG³70çø¯á[ý7P³³× ¿»–Öá"´´ŠWy_Ê}Ÿ"¥|ý¥ßgxNÿK¸kM.îò{;…KÙ6Æx'–[†Û¹>ïÝo½Zø§©ø jÞÃ\·Ó­õÈšÞúFWKˆ>Ý6äû¿;W®Mð÷A…íâ Z'Ú¶ùð­Vû› ›áÖ†÷²ÛEá«$¸‰ZV‹ÈMè‹÷Ýê#*”¥Í”c(òÈðûmwK…âßw }ŸæWOŸýß½÷«?Äw–z½²Ae:¼²Ê™oà_ö«Ü¿á Ñ^Íî—AÓ~ÉyM7‘Åz{øKJ°K)WJÓSí_½µ*/Ÿüÿ·D¹‹÷O‡ÆÍ§\xrúÇPŽÚûI‚*á7}¡%‹ÿˆþ›Ä¿&ñn¯w¬kšÃêú­ÔIæÝÝüò¶ß—æù>öůf›ÂV/«Ë§ÿei¿Ú ½Ù6Û§Ýûÿ?Ýj¯§½­ÅÌV:o•nÈ’ü±#§üïQí*ròý’=ÞncÁæÖì^/õžwÊß%}ƒðïþ ¯ã¯øgþ'Ò¼oáÔ·½±I xn^_)%ù7ªíÜ›Ù_oûuæŸÙZzEo>ÛGIþê'”ûàÃüuúÿ號ö}½‰¶ùPx›QH“oÜ_ÝTr„¤|úŸðL¯ˆ‰ï|q£oþ-žoÿBÁ1ümÿ-|u¥ÿÀ<ßþ"¿Hž¢«å#˜üô¹ýŽu€ž»×/µ«a]’½¾ï5·#ìþº•úÇ_&~Ô¯³àÞ§ÿ]âÿÙëë:%T‡‰ÿà™Öíaû$ø^9bhfûUëüÿÝûC×Õuówìš`Ñ|  FÚ”zvž‹~’ÛKòDª²£y¬ÿu»ÿ¯ý£lωþ×¼9m¢éø%5iå·û>·W®È²íK¥eÿ–Oÿ²TF¯Ö9güÇEhû*’÷²Q¾¿;áý§>9?üÏ^û–_ÿ‹«ðÒ¿6ÿÈûá}ÿÅÿËÿñuÑ쿽ù˜ó§ûp¾Ïü/eþµŸâÙüõò¼ß¼8ò¼ñ[ks[ÿÇ×ζ{>Ë÷6}£íVíÿ6ÍÿÁÿ­OŠ;øŸñûC¿ñ«£øÂ5'†-?O±]5WÏDß¿{üêû6m¯8‡DÕí¥•á ‰ô¦Š+uÒeÖìñmwmè›þó¾Ïûâ§àÚ¿ÅM!ÓÊû¯ ©þ…+¿‘4ÿ;;ź]Ӯϓäù·'ûtôøÓ ù¿im]{/øúû$+köï³·î‘>Ë¿wúߟÝÛ\d:oˆaµ•eð¬wŽÒË-­ÄÚÒ;Ùy¿/îŸøv|›ÜJš+Ä¿e²X¼+iö»³îÔZO´\,_òÊ_“æWÙóÿzm·Å­#Ê{?ì­Rkßø÷Iaºµ–%•v<¯pëþ¡]~_ŸæMÿ?Ü©Sã~Šö sƒ©|Ÿé -Æ£k‹Å/ÉIu³kJó·ügÜ®Kì#Kß>hÐÄñOÕ¢k å]y»7¼©³ï|ÿ^­ÛXx©.¥ÿŠC@¹´ib•ln5=ñDÑ&ÔØ›>_ão÷žŸýºK7Æm"mÿâžÕ¡OžÞ_µÞA²¼5ĶñlÝ>ôû¿øý[³øÓ¡Íª]µç†µŸ²2ï‚ÆÞò+A|ôýÒKn±~ëcïùÿÜ®ôÍ¥ýŽ_hŽéÛÅ|ú·ú\[ÝÝ%ò·nùÿñÄ«³Yøãíyÿ¯†í®v¸óa¿Øïò:§Éå|Ê›Ój°ŸÜ£Ÿû zn·ñ#Á–v¶²èvÚ†·§ÜlK­fkÈ"·°hý#~Ýÿ+£ü¯\®±ñšÖKh<<ÖÒÅ?ÙÛV¾Õ~Ïitóüñ=»}ŸsyKü>oŸîì¬I¡ñ•iü!>G·ÿP‘j2¢*ÿôò¶¶úÏÔ¯üg£Áw©Ïá_ ¼6©-ÃCöÆoûã÷_y>Oîïù*ù¢Qÿ ¾ÃûNÝÿá Ô!²ò¾Ñýw¨íÔ.<•öĶÿvWþ'û»_åjm·ÅÔ{ÍBÏþ9î_wØ–}OÍ–ÂYWÍK‹¯Ým‹ÊO—j3nùþíSøWàß|QøZž,Ò´ Y½ýäVº>¬ê+o{©4HŸ%»²lÛû©]‘þþÉw}êå¾/ê7? O€ô¨/üâÛ/#Ek¬xrñîʲ¢J’˳s6ï—åþûýÝôÀê¿á|Cÿûêð‰Ã2nK¯í4Õ[û1[Êû?›ö}ÌÎÿ7È¿yÑÚ§\ü`ÙŸfÞûÚ?о×q}.ýE¿Öý¢Õ-ÍòüŸ>ß¾Ÿ=[¼øoãßíH¯ï·–ûG“÷~x¼¯àß÷?½óUK?†>=¶º»–(<òÞű’fÑ{¿Éò|­û×ùÿÜþå.ar›#ã~•%«Ëÿ úõ¼AæÅ¨Eá8µ?`oÝ~ö]›WçýïüîÔ¾*ñÏü#ßÚ1xkθ[5óîîï%Š-9(§óeù>f}û6'ð§ü¹ïøV>3‡K»Ó§ÿ„Cʸ–YZ_*ãÍß+»ýýŸu7¾Ôû«Z7>ñÅËY7üQ·—Q%½®û[§ØŸ"ÿÀ¾DEùèæˆÌ«ŸŽRC¢ÛÝ7…´Ûkw¸[í;‹Ë×·ŸÏù~ÏJžoî¶îÞËólzeÿÆ;¸ol “Á––r¬Måió^N×w«gÿ-w¯Ë›÷ÝÙòo­|ã8uÇÕüÿ¥ëÅö}Ÿa¸tÛòË/ï|‰Tl>x¿M³»³¶ŸÂŸd¿g–t}:â]ß"/Èÿ¿ºO’Ž`mñƒS›Y»Uð®—ypŸº–Å/®ì_jMûå¸oÝ7•ü>öÿž³Óã•òxqç‹HÑ.mÙ~Õý¦íy*Ñ>ĉ-ÙüÙ|Ýÿ;§÷ÓgÜ«S|(ñdÚ&™¤6«á¿²Xlòì7lOÜw—~æo’¯MðÓÇ:;¯/ˆü6š„P=ºÜ&“*l‰¾úlß·mÀf_üSÔ.~Å¥I£iviæ½”R§Ú¥¸¿óU%y|¥—÷>êy¿.×ùþd®×Á?tÿk:´°ñÅäù7ÒÜið[·î¶;ÿ{ø¾þêãÓá§Œl.µ9í¼U¢Cqª|÷›4wt¾tÿž»gûTýáïŒü7e§ÙØø¿M°²°n-aM”ÊûþMÒÿ¿ü˜Oñ/\Ò­nÕtýíî’âÒ[눮"òÞï‰<ÝÓ·û›U•?àTÆø©âÒâ¶:f“ )Ñu?Ù[αò­"óâón<©wî“ø>O—ýº¯ÿ ßS°ÐnôÉ|f°èóîyíÿ³"ò›wßÿ–»i·>ÕoÚÊÙ¼q<ßÙ¬’ÀŸc‰ÞÝÕ>Gûû¾ïýõG1D0üEñ|: Á’Ku‡ï´$ût­¿Ê·Ùk¿o”é÷·ýíîßÁV?á6ñÊ%›iú}Ο`·VIo ŠïX•7¼·Wv&I¹÷wºU+Ïêvz—ö…ç§¶½–/³ý¡íbGtß÷7ïùª+?Ïskz¶>8¹š)go´¥¼Vû_ãÞŸÞ«æ$î¯>"ëמMr ?ÃvÞ&ƒQµí;‹7H§Yâ•<¯âTH¿ƒoßÝ\Gü%^1¶µ½¶´‹ä¸ŠWg—G·û\°DÿèïJŸ/ÍürýïºôÇÐn|<ÖVËã«ë7EÙkú:|‹ýÄÙU!ð”ºÇ•ªÁã=Ró÷Oå_Eöwûß#üû(æBoxÎýOž%KK{Ï)í-ôË_5wEºëíìò‘~tùæ]鲪¿Œ·{=ޝ¨=½Ô»ÛdKqp°4[®gÊ®Û>}ÿÜÙ\·†¯âŠÚÛÄwÓ<ò¼PEöÏ¿/ñü›?Ü«³xzÏG‚k™u]RÚ(¢ýëý¹ÓbÀhæ$¼š¯ŒfgOíYî("yb†XŸ÷»þG–]ŸÁlùøøé“k~!DÔ.WPƒìWjFI¢‹ìñEü lݹæþ»¹«ê7Ñ[ZjW—2Ëžª·/½¢þõøsN{íB{´·Ý·þ?%ûÍY”nÜ]kÃN·ÓgÔQn`•n ÁöÖuGß±þ꫾ßq6Ñs¬k—7ö—;¬¾Ñeg±m"‚Ý"޾Ǹù?{ÿ| W5a£h:Ååíµ¤÷3KlȲ'Ÿ/ËÿÔZÞ‡áý"{(nDéqs'•yò¾æÿ¾è¢°ÕeÕuë¶ž[g´·¾•ÝþƱ[£ìû‘"üßÇÿŽ%}gû~Õß þ|"Ô<=ãG£ëÛ÷—_g{Y_÷M³cü©þÅ|O¢èz»§}®Ú&šßs.÷–Tù—þN¼Ö4}yl|¶Kˆ ûD¨ŠÏò¿N?Þ#”ýP³ý¼>ê¬ÿcñÚ]UݶXÏ÷¦þÞ5»ÿ±Øø¢ææãû‰¦\'þ„•ù AoÏ©ªó­]ðÃù>-ÓâUTGYwÿß·4H”ycÌ~žþÕÚò§Â ¸>ÇsûÙSsºìEýÓµ}—_~ÖŸòIn÷}͉÷ÿëÕëí:Ê{#j_ ðW‡®-¢ø#¦\µ´áÛYn® CáÕÖŸªÜëo>¡u.°òê¿Ú?ÙÚ‹Jq§¥Ç÷bþþøpá?Ý©cÞ$_³¿ßÍóÕï´·û)\¾›4©Ýÿn´‘ÙöD¬»Ú½ ÎcY/Êß:S¾ÒþWÍT¡°¼tÚÑßu+ÙΟÂÕ­€¶›_îýÇÿj¥I•?‰·ÕW°¹HŸtL‰ýý´É¡Ÿçh “~ÊË”f¬7,é»vÇݲˆnUÙYSýÏᬤ{Ÿ) d¡ædtÝ+'ü¿iùÒUÛ½ž—?:|Ͳ°’eH¶îØïüu,7?½OÞ®ÿö(oí,ÿwçEû©Xþ6›„µ½Í÷¬åûŸîUˆ]bÿÀö%cøÎå¿áÖþeßö9~ÿñü”럱µ†»ÿ ™áí ¿ÓuÝgXßáïÚhñ_®Œ¬/Ú%ó_j¯ü|E¿ï~ö¼ãöÔÒbñÿо^hž ¾ðU†“§ßÝϦj:biòìŠêß|¾R|«¿~úè¿cKkøc½JÓÅ¿ÙðÙõõoÿiÏqç&–ÑDñ}ŸÈù¼ß5¢ÿ¾«oþ Wã–ð—Äo…°iÓù:f³ ^éÿ"oßKo±>oø mSâ3å øŸã_øWÞÕü@º\Ú£Yýû+_õ­½öWÎÿ¾0xƒ[ñM–¡§Ùx«Ãöº=ŒWiñA±ïžéSbÿ¾žo÷îÿ };xí ÓíÜŸ3ýÊó‰Ïà[ŸøV_êfÕQ']>'•¶6ï¿¿oÿcY{Ƈà/‰Þ!ð‚u >]Äž8¸Òî¢Oí9¾ýÒOü ÷þçûÏ÷ÿ†¹ˆ~-ÖüIã}bkX¼Oáéþ)åÓa•Qv>í÷ÿî¦ÅÝþúüë^ãð‚ûÂoàˆ“ÁW2Þhž|»%v}í/ñïÞŸîW)ñûáu·.—ÅMÿ÷ÑeÝþ·åµØßsoñ}í´{Àfx+âOŠ´ xwHoë¼+¨ÿdjË>öžßþ~¿ÏËò}úòý{Qñ‹üG«¶§ˆ4Öß˺²ûr§öLPlÛ&Öÿž¿sæÙü~¾–ð&¥¡Üø/G“ÃûŸBkoôfù“åÿÿ·¾¼ÓÇž(øO¥xƒÆQkÐÊú¬Ijú¬Iüÿ:mÙþ×Ì´ƒÞ.èÿüu‹áÆ‹áåÜÖóéÒË.ûÏ6]Ñ'î·¾Ï›ÍØŸ÷Ýx˜}KV¹’h_UŠê{Ïí{ÈäÖ•<›ýï²Ãaÿcæþÿýó_\é·_éz{XíK‚)mQ>M±2|ŸøæÊðûÿˆŸ ìï5ŸG–k‹]u-åt³žñ·üÿî|òÿ㕨¯ãÿ‰Im¨mðó×JK¥t¼ù~ÔΈñÀ7»ìûß%x—†ìo´Û½æÓÏÕï4›„¸ÑRãZGŠòò]Ÿh‰¶ýåFù>M›ÿàuõÕÿ›¶_7çÛ»Íùw׃ø[â7€nï|1k¤xríæò{[^Ù¿q*ìÞíóÿ¶Ÿîÿ³YûÀYø‡âO\h^*´ºðÕ·öCJÊøug®Yë×ze¶–š½Õ›¾¬žl­å*§ú:'þ9¿ïW«üGñ&•¢ø6êöúŵ‹%dF²‰Qž_ž²¼%ãm3[ñ.±gm¡Ï¦ËåA,·sD±$ÿ">ÏøyßÄX¼Y¨Øh âëM'ÉXšX6JßñÿóùIòÿÝ›¿‡ï|ÔïéÞ&Ó´ÏÂ1.–®Ëºé_çÔ‹fÿáûßìW¤xãÆV~ƒGœémâ&žñ|ˆ E+þšÿÀ¿Uüâû=v-i“NOÛÛ]²¿šÊž÷çÿwýº²O/ñÆ—®ÜøŠÝµ¦Ò´þʱi“yr²/Éþ”í·þ·}nøKDñ,^Hü+}¥Ûh¿l_±ù°2mƒ{ù®Û·³n®Åž>³Ðµý:Þ 15§’)ekÕ•_ìÉ·ø¿Þ«¾ñµÿ…mo5 ðÜ»ü¯ìÉeTò¿¹þîÿ÷* <‹ÄZ]Ô¾+Ö¿µžÊk†:úá wݦnM«þ÷Üÿâë°Ò´dxìÚ½—Ù¤‹ìÛ6A·ývTþ-ø—.›ªk6Ú,Z•½¯ü|$©²[ÿñïþ×ûŸ{ýŠÞ¶ñ¶Ÿae=ÝÍ¥íÒÇ¢N¯²]›ž/÷’€Ø"M¶¿òÊ×}E¯xWU†ÊÒG¾›Zò§–V´x•üÝßwï|¿/þÏVt/ÝÍ«¬¤¶V𤠛dÜÿlÿž_çä¦x“â réж…<7…Ä­i(ù[oߤñ…ák•{·k»¸î'·i[jýªvßûßööTz‡ƒ®å¹· yq{7Ù–5vÚ¾S/Þ•?Új“HñÊ<÷‹¨\[}•{höû·´K÷ٿ¬xæ)¯4ø´ûÈ>Ëå}¢ååVù ÿf€ _O}£m{›-%‘Z‹ï¢¯Þÿ¾«3RÑîmµMI‘¯nm7}©÷7ß_ù÷ßüUnÃÆÑYé/>¯<kFýïÙ×~Åo¹TµÞ^_êd¼‚{_ôtG‹çyê@é|%äxy<ÛëÕn%±ž/*ù·¥¼²ìÙ*´›>_÷éÞ¼‚i+|’ù¨»ûÉT¼1öÏïŠÆ ïî ³–êéÑv|‘ló_æþž³/õYt}sDž »ÒñQ·ÿµ÷ÿñÚ¯°c(û§êŸí†û> Þ·ñíÿÛW¯¸+áÛ?oü)CûžSé+×ÝRøbmKá?8¾?Ú~ hñ,SÿiÝkÚé—ö©{.›xÒÅåjgo•–/ïÿúðÿÚçM¹ñV±à_øFkq_ßÛßjÚÅœZlZ¾£¢½êªþëý#vôweݳøŸe}%û>x{Kñ?Âã¤_‹™4»ÿ·Ûßy_ÇgºßÍù÷+#}Ϲ^kû@§ào¶µc¢}Š+«;ÿgK+ïÒ>ÕÇ7æóv}êâѶ/øò>l‡ö{øß üºö–Ÿ÷µÿãµô¯ì÷àÿø'á¥Ý޽¯hÖ~(m[í }pÖ÷[­v.ôù]öÿy¯‹tج4›‰ôÍ-WP‹ýU¢*&úÇ{mCû[J‹þè¾Éuû«“e»ÿsîWÑáñt°òæ?ü›þÉR’©T}[xú½úùSø³Dx¿¸ñ@ÿúW‘xÿÀÚž½â;½Ñ6¥dê‘,Úvµgeßö"ù+Ëá›UM'[¹ÿ„V$–Ö]–vû×}×ϳÜÿËZYê ©hð/‡ {{¨·ßÜnM–¯ýϹóãµµlÂŽ"<²þMÿ˜á%Gtnø3à#fÝÝ߈ŸÊTßüh¶ÿÜ®Sâuž¯4Z, —6<òý¦kÝ—oÈŸ2·ñW*šŒÑ¿á#ñ7ûé_üji†ÿŸù7ü”¹O?ø¦x¿à·‹m4x²MV[«e½û_‡¯Úâ$Vw]Ÿ2'Íû§ùܬû?ÇâϦ•iãÝ~ÎÒí’$—V±i~òüîé¿Ë¿û¨Õõ½¶½£n–Ío.¢µß²o“íªü¶ü%¯AâߣjVŸmqt¯åŒ?:/þÍ\u=ù{¿ ¡ìŸ²<7ÿf=EôÅÓ|}uxð>‡ccsö7Ö~E‹b}©SçýÔ¿.Ïùe_<þß±Iþlñ-ïŒ.-t›«Ø¯µA.ž ´,·Åº/•¶#ºí¯£?g½ÇÅ_³÷…ôÍ*+øL¬.n?±õk½1oâÑ®¢º¸ùßû­±ßoûõó¿íÙgá×±hšð®™e§Ü}ºÝ,ÉåŸí¶¯,±'Ýmÿïÿ³Q!r›ÿ4½[]ðö©§è·ö£:í†ý×r@ÛÓÿdù+çߊñ.›âí ÒûÅ—zÞµ}c:ežŒ’­Œñ"}¢]ßíl¹ó|ÿìÖµ‡íWgâ{Èm¬lu û·Oõ6ö»÷ÿÀ7ÑûQb<¾mÜ/÷&TGÿÐé O†ÿ¼Kãß_^èÞ1½ðVŸsx©c§ 7Èò–/õ¯µ?¿»ø?‰uaüBð¿‰tOk¨kzöøŸT]B)%ò¬}–ïöþEdûŸwäù«µ°ý¤%Öô8µ¨,âû;·•þ—«ZÅ/ßÙþ©¥Ý·ç¬{ÿÚÅ´­_û=´ø>ѹ~xu>ÏÿUöÐQ©à…æµá½ R—ÆÚî… j?Ú¿ÙRÚ¬M¿ðZìßÿØíþ óío¾#ð®·¬@±x£Äé£Oö©ožÍ6j‹>Í‘åOÿ‹øþE®šoÛ MIówoæþåâËÿ Töµv‹x¨‰s¥Û/ý#¸Ð繃R»·‹|öúËö…öÒX¾U¯`¶ðÝ…¯ïü/ª_Ëÿ=®î¶|¿ðÛ^µ ¶¥XóFG-Jüžéò¯Œ¾é³iýõöµy{s$W‘Z}´.ö‰>X¿àß®Wà õ½cÄ6ÿði:…Ä¿ÛW×Ú_r}Íå[¢ÿwîµÿ|W´þÓž&ÿ…cà ëÚfŠÚn¡¨ßKou¤ÜÞ}¡â‹çØÿ/Ýû›¿àuóSþÓ>%tE]¹÷Z¸±XyajrÈÚOkc¾ñ'Á«m DŠó@‚ÿWÕìõÔ`·žïbK,»?ô •Ÿàσ’&³,åŒé¥iÐ:Y˧½çžtýïü>›åÿ×ÿ´oЦ_—Eû¿ÜŠZ‰ÿhÌÿò _ûðÕÇâ‚6¶–Ú,^ÓþÑ,q>—;꬛`—{Ë/ûß;ÿñxkàå¥Ý¶ª¾#ÓVÝ/ìÛ‚õ™þÆ­ò³µ÷kÍ_ã—Ž?‡Jdÿ·V¦¿ÆoÌŸñã?÷>KW§îè>*øMÚúÚéMªi70*ê qxû¶ÀŸºEÿ¾­xcá.Ÿs ¤þ(Óí®u[«Å½-%mŠË¿bãÿ2·^S7ÅÌÿñí/þÕøY~=Û·È•>oùáKÜÐSä¯ûw,ÿû-|ÿºv‘¥xnÛJºÔ¥fI­åýÔÕ®\7ð)óbåûù~Ãß‘÷.½þ'ÿ­½ö]ø±àÈ5´2ê·óÅþ‡p›'H¼¿-|ÿào¼Uaä猦´F—kùë²Ußò~õ¢ÚÛ6¿Ü®£þ×Çïú ø¿ÿ"ÿãUϧñöræÿ·Og'Ä,o¬º‘Œ¿–Qrü‘îw?~%ßÙ½öŸ}snÿz¬mÝÿ®SRý–¾"Mq}i¥j–Ñ[À‘y6-kkæ£?϶%Oš¼ßþ×Çïú ø¿ÿ"ÿãTÂÔøùÿA?àrñªã¡…§J\ÑŒ¿ÚÅæONT刽þ?ò7|+ûx¾o¤±xWÅö¤ÿº»Ôu8’/ãùßä—ýöëÐîd/‰®›`¹žþ}b-ëÿ’õãŸðµ><îÿ‡Œ¿ð9?øÕ^Ö>-|k¿¸F³oØD‘Dö¶ýÌ©ó¿ú¯ãûõëûowá—õó>_ê”y¿üÿ‘èS~Ç?Ý÷[x–뮢Ïÿ Ä•~ÄŸ.YÖçÅö[?éÓ£ÿ觯/ÿ…‘ñÑÿæ!ãOü§ÿGü,_ŽóýãŸüöÛû’ü?Ì¿ªPÿ ˜ÿà/üE›ö øê÷ñ5¯í¡´ÿ–©4ìîßù ºoøa/‰o§^¯ü%[ïe]Lú´»"ù>û¢ÅóWŠÂñßç¹ñÓÿÜuÿøŠ|Þ6øÁ2n_øOömþKÿÄT{i$¿ó/êXoú þÿÈì&ÿ‚}|{…ö·Œt½I?¿öùbýZºoü‹â|×ñJÞ1ƒJD‰¥K¦y|Ýï¿fßáÛ^Tþ-ø²ïóEñ!ÿî;?ÿ¬Ö>8LûšçÆŸøyÿÅÖÑ«)}™~æcS Bòÿ›þÝä~•þÊÿõÙÛÀz—‡gž-cí—Ïz×i/Ͻ“çÝò|ß=`þÔÿ²åçí%«h÷3Ëmgoafö­ IJ·Ÿ¹Õþ}ŸÃ¹¿;^çã;ýæñ“ÿÛõÿÿ¬ËÏüFó^)ïµØeO‘“ûZó~ÿöÿ{U)©|J_×̈ѡÿ?òV}yÿÁñg…oÓPðý÷†î_s§’‹qo-º2Ï_7æþícÃÿÍø‰©OºòYüÿën>ÑpûÏûuáVÚ÷ïkêz¢|¿~]ZëÿŽÓóÅ÷?Z•ÿî-?ÿ¬ý¯÷/ó6Ž ÿ?ÿòSêkø%¬ëý«Å^ó¶üþV€»?à«üO‡ýŠ´oøWÈ_cñSýëÆ÷õþ.­j¶~#Ö剖ÆÒÛd ËK©ö>Ôûïûß¼ÿÇG´ËùÕ°œßÇÿÉO®?áÚÞDO7ÅúüJþ ×àèU_Z&ÏîN‹_'„¼C7üÃà›þÛËÿÅÔ3x3^ݵ|=ßî3ÿñuÝÿ/ämõl¿þËÿ>Ë›öøv›_Û'÷¿âg÷¿ñú¡©~¿ þѺçâµµ·û­?ÿ$%|ˆž׿èPÿàMÿÇj–·ðÇÅ•¼¿eðœv×CEòD¯¿wýuwÛÿÛUN·<¹eü˜Æ½ $)sR¯)Kü'Øöß°¯Â¿³ÄÑ|bd´Üȯo¨üŽÿ{fÿ´U+ŸØçàUœþEßÇY~Ñ»îlA½?à õàÿ±ìÞGÇ/…ú¯…¨Ÿí5û,Údëû¯‘÷¤±'Ëæÿ´ë¿äÛ\/Æ?†÷×ÿ´'Ä‹í#T‹MÔ.¼Myk§iðÀûçÿHÚï¿îÄ©½?нXÕöQ´e._ñ?/<½ãëÿ~̳w‡–á®~0jù»vùºµ¿Ëþål–ý—!ùeø‰hÿ÷‹ÿˆ¯ˆ¦ý—~##»7Š´Ôÿ~Wÿâ*øfß'üÎZ*ÛþƸêÉÎ_ý·üÑ¥O ËûÎcî{Ÿ†?²_î¼ßiÿ"ìù5ÿÇö¥Eÿì‰ üÞ1´ûˆ¿ÿ_¿ì÷ãôûþ:ÒSþßÿˆ­=ö~ñÌMöï‰ðX\'÷e‰ÿÜ5[þûE¬íßü›þÑìòïï~Ù©á_ÙÍÛˆ`¹î%ÕÃÿè)L{oØúùŒ[?ýµºÿâ+ä‹OZÞ›:Kkñµm¦Oºñ.×ÿÒŠÌÕ?g;FX¤Ô>,E5¯•¿ ÿÇh‰œ£‚û1—à}ˆ÷ÿ±í·ü¼ÄÿðÆ¥‡Å¿²%œ¨ð.÷_¹²Æö¾)Ù³AO½ñR?ûçÿ³¨ŸöuðâÍV_ûçÿ³«å#ý“þ}Ëÿÿ€}»ÿ ÿìó¬ZD÷?õÇGºz‹þ¿ì¡m÷|5w7ûšÅ|>ÿ<*ó|VÿÈÿÅÓÁ[>ù~'µê'ü»¦û}ÿð=’íÿ¾ŽPÿdÿŸrÿÀ¿às?ÆÿÙrýׂu'þïüH%ªðþÐ?³f›ª&§cà nAbò–îÓEx¥ÛýÍûëâË?…? >·xÛT‡û¿dÔ<ßûëuºSßá¯Â$fÝã¯ßø¿øŠ=ù›Gê?óê_øüî/økƒ~VØ<⹑Wþ|ø©k6çö´ø6ÿóMüI7ûöiÿÇkâ—ø{ð‰>÷ŽæÄþý|G{ª|û"Ⱦ¾Hn7$W ªÏ÷¿ÙÝò×#¤øí|â}ÿ«²öK…ší‰_rÀ~Z댹#ïDòq>ί½J<§ê/í½gsgðoUŽåtù¶}£lÑ@Èñm‰ÿÛ¯ÐZüüý¶ïþÙð2âñ‘Qî¬å¸ÙþÓZïÿÙëô”Œað£â/ØçþEËFÿ¦·éÿ¤õò?üÓ^ºðÇí#oªÙÿÇÜVºvÝÿq¾I~GOâ_ökëßÙ->Í¡ÛÅò¿ïoþçý»×ÇßðT{æøÛw+.ç‹KÓ6ÿ³û×Jã¡/ÜR4ÅGšÛ|uø— ­ìO¥§öl¶ñ,)ì6_)6|Ÿv±Óö¢ø—çÜ'úËyZ&*-Ÿ/ßþ ÍÐfóŸÄk sp÷Ÿ3¾×EH¥ù>Oï|õç—:¯Ù“P¼–/¿?•±äÜÎíÿ²W«S—ìœñæ=nÏö“ø›s.ÖŸO¶M¬ê÷Dˆÿøåu¶þ0Md—M>‰lŒ¿òñ#ÿèãÿ usGMN_ô{©e¸Ùü"þûëÿ@®÷^{ŸÜ\4JÏiÿ)î:ÿ~±(ÛÐ~0|Vñ “ÜÛj"~õ“d±'ðÿÀ+3Æß¾+x›PŸM7î¤V¨ßøþÊ¥à4Õï<ö8%o²[Î÷'ËòÊß}Ówû•¡ãŸ³x«á|Q_A³Uóü¯¾ëïÛòUÿ„\Çuû_üHK8¦ŠâÓÉgû¿e‹z·û_%jèÿ´ÏÄVÁ/U±…Èö±ñåúmüWž}`WûËwÿ_¿òº•ØxbmkÃz\V:C,6𔽷–—ÍIßOý±I}£ZŸÝ5Sö¢ø›sòý²ÉvÆ!oþ9V4¯Ú7ân±¨¥‹jv6n˽f–ÙÿÚ•ÁkZkx[IžyàgŠ+ϳ·ïWÍo¾ßwþ]¯Â‡¶›ÄÚ¡yg•:Ëp°Ë/ßò¾TßÿÞÿð Ö2‘—1ÞÍã?‹0ùMuâ]"Ûð<_qÿÛù*–•ñ â~·nŠ´´wgÚžW÷_o÷+ÕtßZ¯Œ4´ñº…•š_þöÎ?çŠ/àù?…ž¹/‚µï‰ÞIlï-,ôÿ>]¿hºØñ>ÿÑ*¹ƒ˜óÏü]ø£ðõQîµÈ.wýß&“o÷÷m¬[ÿß4KˆbþÓTºþ5…“äܛӿÿm^½ â¾›öLðÖ§µ·ˆ-õo즗wß}ïýó¿cÀ+ç]çÔ—SŠvùà³kŸûñl¬ù¤Yë¶þ,ÞYý¥¼Qwm.Ý쉻åþ*æ¬ÿiÿŠW›÷x–æ¢Vy_sü«ýúÚðÞƒ¯Ùø{L³³þ×þÌÖbK*Ò&ò¥ùÿï–oöîWžøŸÃðEªÅ.Øb‹S}=·ýôÛ½¶ã‰G0ǃþ<|Kñ†¯öøJ5 gãMòÿ¸›+Ò?´¾)[*,¿®~Ñ·ýMºÊÿúÞ¯<øý•áíSí7lÿjµkˆ<æÿogþÈÿ÷ÝzÝž·¡ÛxyçþÓ¶þÛ¿Y^óΗä‰7¿•À6nÿjª<Äsg†ÕûÜ|ˆÍümü[~Jå¼1a¥C¥ºêºõ¶*nu·—›»û)òÓ|âiz²Asvžm­ä©ºóí‰ûß'÷+›H¶{÷óežwoo)›g”µÕXx2[.âyo4´ß?˳Q‰ö¢¦ÏŸç«~!ÑÖf¸¹–ëO{²£ª%åºE÷Ñ?¿XˆãüáYüUâv`m’¿ú¨Y¶"ÿsüÿr½µ>iSE¬-¶‹§ÜÝÚª<îòýÛåMˆ¿úWà9®´y^ú%´w–wI~Ï}ÿÉ÷_ýúÝÿ„ªóM¿x¾ÃöŸ7ç•ÒZÒ<¤JG9£è:,> ÔóLŽòÞ/“b+ì‹çûõWÆÞ‹A_"ÆÚ7²Õ?{íÞÿ/ðoûßÅ]ø‘´­^öûL±WûGðmwûõ…â\Þ_è_l³Ùn·ßjØêßwzoDOûê—ºYÆÙÙÚ_i!]¢]êÿìÿþËWôKkk%'h£Móýž+t]ò»ª&ÿ’¶oÍÏ¿ø*%Ë„"s6¶¿Ø’ê7rÄ¢x÷E2îÚÍü_ðÝ]ýïµ^ÜEtdX˜íM›~÷ûÍü?÷Ýgx…"¹–á ¶dvŸæy›{ýÏã­?[jw–gØÁ5º*?ÎßÅóüõÄ–Ñ&—iPiðÅq:§•¾]ŸßÿgîìÕWA†Õô¿*ûOì·lûFß«)!Õ]ßw‘òýï¿Wv_^X"Á<Ù'ÜO)êýÁš~ñÿˆ>ê7zŸ%³£¿•]¯È»¾ã|¿íW i5Ͷº·—é‹ÿ5Ò;ûÛ~÷þ?I~÷C[Ô[•{ˆ"Hšh¾çðãÕùn"‰eŸÍx™R'áÚŸû-sÇF•IT§zG¡[ˆ¯F8zµ9£†&ÇŠ®[û.ßw—û©|ÕØ¿}™ßþýnÿyÞ«ü:ð‡ü,¿‰þÐ%¼kí)âµûB.ÿ+t»wmÿT¾-yÿá´iü·w•vºE³øþåu³J+þÐÿ™WgüLíô©+¢R”/á‰úwû[Ø-·ÃË+õÑ[ï·ùÿ-µ÷^káÏÛþDؿ뼩ÿŽWÜUÜÞ>"ý‘Sf—n¿ÁçÞÿèõò¯ü ¾7YÒ¦–k_nVûÈ¥ƒð"ýßö·×GàÔÖUð¿Š4Ÿ³Ä¾oö'‰%HŸþÙnù[þõ™¡wGÓlïôd¼¼V{ÛæoøÈ´ÿ[h:&›¡Xùwpë±n½Õî¼ÔŠ%}ÿ" lùÞ®}OüÿC©ø~£ýãÀµ‰§ÕbñW•.ô‹Q[¯&oÞîùÞ-ïýæùÓçÿmëCD³Zè—×ÒËö6éâ—ìë±íâ—çß÷~mûëŸÑïÃÞ!u¼ƒ|M¾ÞòÝÿ~ã¥zDЯ„¢Ñ ¹‚ û}e¶Z¼¿râù]åþîÏî}íÉDBGÒºWĽzçÁZ>Ÿ¯JñZÁ¶Ç•±¢ÿgäûÕ‰ðã6¹ð®×L¼¶H>Åkxßñ,´‚$–ãûèŸ%|ïá»ø¬5ˆèP|1øcÿ ·Ã}?P‹ÄvšjZéÉQ"´¾mÒÿ­{Ÿå_àDMµó~±yý¤|F¶Ò¬ÒÁyö…GŸl^V÷‰þoî£:W¿| ð§yðÞÑ~ÆÛõv—È‹rotd}›Óþõòü?lø{âk‹këfw·il¯­&þ$û®Ÿçý†¢@nø'X±K{-WQ³[ËKY^ßQ†eû©/Ï¿ðÞŸ÷Å{Wön•ýþ‡£Ûí*á ]ÿÄדÃá…ø{=½Ì ·ï©DéSEòA}ø®þ{ÿ±ü?z¶aÑÛA¸¸—Cñ¥á„XYa†'¸‰7#ìOï÷*â[à—–mtQEy*K/É*¦Å]ÿ}ݾêןøóÄ–:•îí)VïLÐ`d[¸¢ÿËÉ~_—þÿøåWšÿLšÕ ÕüK«^"O¿þë¶E¿b|ï+>ߟï[¶¼•î4ìé`Ò­-eþеšßäM.U¿pÿÄ¿"}ÿø"O9Ò¦ûƒ{}ýÿ*Ö/öŸ~çÿÇÿ¯KÓfµO†š³nK¸´ï5×äù‘ö|ÿwsÿr¸­rÊçZñjiÐC˜¢¼‘SÏwmïq±~UVÿÇWmzˆ|-Ÿ„µYv¬×kcK6ퟺ‰Ñ¥ÿÐ7Ó‰Gmû.ßÚ‹Á ÿSm¯ÉÿnÖ_í‹ÿ ¨#+¤kZ¥»:µ©=zwì™ðºîÓö†ðªÚ®“å\jºúÅöõóV/³ÜAå2ÿÏ}ß7•ýÚòÿÚgÍOܰ+=Žþ³qÏŸ÷«¨>ÏüeZ/»""q:Þ¼ßð˜yºœRÜý¡mí_º&ý•ÊèúÆ¥a¯^éúœþOÌÖë³äKyU÷Äÿ÷ÚãõÞøóÂW:$ïâ)¥›Êù.¡ÿ¦_ß®~³šÝ'¹_øœ$KöX®äò¿åOïlûŸð ôTø½Ð‰èº'Œ×Už&߇ˆíWÊ–Þïäßþå6ÂÚ+;û¹uYWMÛ,²³¼è‰÷"þ=ÿúêáõ·Ò?²ôöÔç‰îå•‘¦¾iwª*nùö£µcý³C¶ÒôùÛJmJ/µ]$IqtþVåH·»ü›™_þD¹‚&‡Œ5¸µä{—û ÕþÕ}}å2%Ãÿ'û?Ýÿ¾«ŒK›—¿»¹¼‰¡•?Ò¥Oîq?ô õ9¿·¾'xrëS[,4ý!¢Š+»H¾Ë¤Úü›<§þó:|ßÅ+2W ­Ã§ÜÛùºBËý™ïnž_õ²Ëÿ=_ýŸîTH³CÁèÖqZ4¶ßiò¥ûG’ÿ:;ìÛYþ!íj ´vÖØ¥HWäß÷ÿô=•Þüð{x’òö}KÏDž$•a‰¶:.ôùþãÿ·Éü_%a|Eð­Ï†üsvº,RßÛÝy[­ßï¾è‘·ÿãõ¡Ìsþ†óJWû/înTx“ûÒ¯ðßÖ»ˆ|U¤x’_6{È4}Z/õö÷m±þ\|Ú¬ ep°O×jÞT³#{øýŸý ýÚÂÔ®m“Wò ŠI´õUÚšŒ÷>ºÿû=Q'u¦ø«ÃÚ î«}sþ“¬é'Îìûÿƒø¹XZÜ:­ÌQxS¶k>/+I±¾±Ï_÷~ÿÏüMV<yc¨Ým“ìÚ ¼­?ÜùÓzºlùïU [;{­gP×ÊtŠYþMÒüÉûϱÛä­[ÏYÙø¿SÒ§Ô×Mð­”òÝ |Ï´Kïû‘ÏY_å_ü{øiú?‹|émþÌ­ý™`òýŽÅåÞöèϽÿàOüoW„ŒûÿhïÄìÒÙÞº¶ëybù‹moP¹ð寙¡ÅÚâÿZò²£ÊÛþä_Þ®_UÔ¯<ÝÖÖlŽÛÞ_7ý!%vþ4ÜŸ/ÉZºn¤öI,±6Ëy~TÚ‰ßþ7þ*É×l-´xtý+M¹]^öV }woó£Ïü0Eýí¿Þþ&­=;Dò5/"VWû/î§ØÛ÷Küiÿû¿ð ³çEâÝOJÓþÍwu/Ú7ÂÌ©kýÿ+ýÿïÿßwÃÞŠo*>8nݶE ͱ6}ýôÏÙ¶›áï¬ñ/š×—^lOÇ_)Ñ6?÷¾ãÿßu·û4óö‡øi·øµ;Wÿɤ¬O"äiö¿jŽo*VÛñÄÍ÷ÿô Ýý˜÷?í'ð×þÂ6¿?ý½%]IDŽ_tý;ý°¿á‹þ¾¥ür¾ÞÍ|Iû^¦ÿ moùëuÿ¢«íªã©ñ1þO‰ÿeOø÷Mÿóù{ÿ¤ñWÏÿðP½JçJý£¼)=ž¡ý›w®›uÛ¶GÚßq¬ü4øky?Œµ‹»¥xeKÇk—çFû¨Û¿ØW®öÿá_Ý<³êºƒË÷>îW¡ÍÄåæ>oÔ¦Ö¼1~özåšÜÛËóµßú¯÷âuû¿ð étGðÖ¶“Ùêú–ª¬¿½±Õ­VâÝÿܸ‹æÿ¾Ò½Vo€šeä¿¿žægþüÐoÿÙ)©û7é_>ÕÿíÏÿ°¨æŒC˜ðù ³ñ Þ§ˆgÒ®.¾v·±Š_5Wýÿ’«é^måÓÛhqGaò¶ëë¹SÍÛþÇ÷àš¾Ž¼ýœ­µ+6ågš]ª›þÃýßø1?eÛmÈÑZÜïþø—=Gµ/š'›øKáëxæóOÓ™šþâ×ç–úoôÝq÷}åÿmþí}kðº¯<¨D¿b°¸Óbólí%¼D–ý_)Ò$Ùó/É»þø¯'ÙïZ¼Ô¢¾VÔ>×n»"™,eGDþçËþýhYüñT2Å<Ú›âVòŸì2üˆß~¶JhŽcø©ðZY´›XØÚ^:£Ý[½Òl–u)7ÿµ»ø?оyOj÷­xËsö©Ó¬u5Þ’¿ûiü,ŸßM¬µõmÿìýãnÂÒÆú ^þÒÕ‘à†k;‘6ýÿr¢ñ'ìµâ_k—Ö¹¡êš–¡pÞl²½Œé½ÿà5—4~Ì‹æ>mÑæð-åÂ5̺òZE¥üsÄßút~*Ô¼9meo§©êmµºóVÆÆÕÿÕ'Þ•ßoücÀ«î~žMßÏø;¥½Ç»¦—ÄW‰.ïïìþÖ‡ö?ðæ¥¿í? 4I¥_ùmq­^ïür«˜gæä:’ëÑK¦éòÛx{Jٲߴ·w ýÇ—ø¿ÜM«ýú÷/ÙÃöy^9м'w$v6V¶ï{æên‰w-ª¶Ý‘D¿3E¿ýïãþ ôŸ~ÃwŸð”^ÿex[;-ߺ‹OŠêê%ÿuÙþjéfý™¾"i¾*²Ö ƒ[¿Ö4è"·³×!±–+ˆSb"3|˳{ÑGí ˜ëlì,þÀúU¶½¤Xj <±hö3}ûÿâ—g÷v*oØõó¿ÆYßøgJø‘¥K¤Yêr³Y-½Ã2~÷{¢:nùY“gÊÿîW­¿ì»ñþñ/'Ò<@÷hÎépö«½¾þÇþ¨ÿ±çŒïÙ"ŸÃZÜÈ¿u&Š-‰þç÷iÊTØø^cSðf³wçŸ ²Ëþ™c|¿ëßFþ/öéo5x“Pyõ +PI[åW±¾ßþçúÔjûªoØÃų\y³ø_W¹ùí4ññu*~Æ~(ÿ¡NûþyìõŸ´cãy¯ü9 Þê±_xWRÖ5×m‹5Æ¢ÖöQ|‰³÷QE¹¾Oöê…žÿ*YÞùzfž’«-¥³Åïïomÿ÷Ûîjû}?c„äúí¨ÅÿÅÓáýµäo›Âv)þþ£ÿWÌ3ç}Dð÷†ô»{›=jÆmUWÊû;¬®›?7²Àê߯?E¢xìËci©¢ì–úÅ‘6«;¦Çþó}ÍÕôz~Ç:¿•¹t='ÍþçÛ ÿâë#â_ìUâ¯x]4­!t‹7óVVwÔâ‹c/ð}ú|Ñ3Œ'ý”l5ý¤þËýŸsöFñËö“fÕK¤ùÿïêWûH=ô?<[}ý˜ßb²¾ÖbY¾IÛíËþõ~ˆ| ø ü7ð¿„§Ö–ñ†—x÷óÝÚ_ÁövÿÚe؉òy+Çþ.þÊ>(ø…©x£ìwž†ßT¼º¸Š[Mw¢Jïü?¸õ\Æžñâþø]âørËU³¹ÓïâÕíÄú¼RÄ¿Ü5þïÉ\¿Ä/ØÃÆoþÐÒ­´¸e¸—k$ºý®Ævþãù¿z¾¸øoû-[xWºf•­i^Õn, Hšá5§‹vßøuwÿ³—…fû?‘¡évÛ%W—þ'LþjÿsýUDŠ??îd/Œ÷0[îÐôg‰WoïµkÿÙêëþÊÿ¬ôm*Ö èÏq÷ .ûË'EÝåltÝ.ßàzûÏþïÂsDŸñMhHÿÄñkOÿ²PŸ³—‚^$ݤihû¾w†úáÿö•@Ÿ÷?³¯ÅiŸÊÔô6Ô¢ƒýB>¿eåEþä^nÕ_÷6ÔÏû?|A¶²²¹þÅ‚òù7yM¥å¬Inürüÿ½oö>eþûµ}úÿ³_åû ÿë¼ïÿ´ª£þÌ ûÛWýÍ·üj¯˜Ÿ|ø’ÏÁ>4ðÃݲøOθŸN–×ö²þé™?Öü²ýäûÉü5çþ$øuâôÕåž]Ío+ª+½äNíò÷«ô9ÿeß üŒ“ìÞ¿Ág;ÿí*?á•<+³æ¹Ÿþ§KWÍ~^x“àψá¼Û§èw3Mµ]‘6¦ßü~¹Çð—Š´ͼ±¾°tÚÛ<Ô¯Õ¹¿eO ù»¿´'DUû‰£¿þ‡¾©\þÊþß»û_RDÿcG‹ÿfzį|üÏד\ÕZÒxš_7æÜ‰*#¢où7ÿãõgg­i²îþÊýëËo5Ò¿Qá˜ü È_Yÿ€i–©ÿ³Ô©û6x3äÿ‰ŸˆŸýË[4ÿÙèç¾~yl6›¢ZYø{N¹þØ¿Úúî·¨|÷®äÿG·_º°|Ÿï7ñ>Ï–¢{{ìZ¶”¿d½ºŠâ_ô?Ÿ÷[öË÷ßîWè—ü(ýZçÄÏ·ý«T©¿áK|>Eù¿á$÷ï-ÓÿdªöŒÏ’gæ}·„µäiUôY&Gÿ¦N›ܨføcâ›ÖÚUÌ)ýÏ*¿NáøKà 9~[;·÷õÿãUü(ðÎßðks¿¬:í*Ëœ¸Â©ùað‹ÅöÓ¤«¦I³þŸû=iMð‹ÅW7WÅc$¬î¾k+:×éü+?üÊwÏÿ]uùøŠ?á]x ŸñD¯÷?}®ÜñŸ9|•Ψ~øÇz3}›z}Ýì¿'ü®Ãð»Å[ÿ{=¦ÍÛÿzWèÞ ðŸÝð.šÿ÷¸z«ý›àxæBÑ?àw’¿þÏOÚÄeTüéñÏÂ+ë;7¾‹Ï¿¸ÛûÔ‡ø[ýökØÿcÏ Eyã‡÷×–Ëö¸%1òôãéU.î¦>Y¤_£E¤JûF ëâoøþ¹ÿ¿­þ5 ëÚŸÏÿ¿½ÿ=Ûüh¢µ,‚Tù¿âewÿÛüh}Tÿ •ßýÿoñ¢Š¨•öH¤×õ=©ÿ¿¹ÿ=ÛüiÓkz”Ÿé÷_{þ{7øÑEkK ª^lÿ¹ÿïãIsu?Ú¿×I÷¿¼h¢˜å±bÉŒ‘|Ä·Ëߚз‚)"}Ñ£|ÝÔ(¨k-*É’ÙÀ~±/øVÄ:»þAö¿÷åŠ*¥ð‡Ú.ÛhfßùZü°_ð¦>¦}ž/ø–Úß…ÿ (¬‹.I éŸgOø—Z}Ïùà¿áL“BÓ~ÌŸñ.´ÿ¿ þQU‘Sú]Ÿuþ‰ýú_ðªÓZAóþæ?½ýÁEœ„gOkâ5½ì¢›aþ¢Š)H¨–··Ëóδ²~NMT·îÛåùßnõBây6ÿ¬oûèÑE_Ù6‰O{oûÇó¬«Ço2_˜ÿz(¬‹‘Ìê·Sy¶Ÿ¾“î·ñt—s¬QbiÑÍQˆ¸œ^­ªÞ«¾/'I[ük™»Ö/þoôëŸûüßãE¤jd>·¨ÿÏý×ýþoñ©?µï¼¥ÿM¸ûßóÕ¿¹õ¢Šä‘q(Üê·¿'úeÇýýoñ¥þÓ¼ò—ý.ûøÆŠ+)&¡u7•þºOûè×;s<›ÿÖ7ýôh¢²4ËÆ8^OúÚÏši<×ùÛó¢ŠÎEÞÛ¾ñû¾´Ç'ÔÑE`1&ûÿð*Þð÷ÞJ(®z¥DÚÔ¿Õ=~QEtåÿO—äqcvÿÙ endstream endobj 6 0 obj <> stream ÿØÿàJFIFÿÛC     ÿÛC   ÿÀ"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ýP¢Š(¢Š(¢Š(¢Š(¢Šfÿ›m>Š)›èôQEQ¿æ¢€ (¢€ )2Ç÷š˜÷#mi”À¨j*/¶Aÿ=Sþú¨_U¶FÛæ­[¢¨¾±&íÛÿܪ¯âHî¬ÿ 9Š+&/,ŸòɩϬº}ØWþú ŽcRŠÁ›Ä7(¿º¶WÿS_Z¾x“jà ·÷èc ù©›?Þ¬TÕnQvÊÑ»ÿ°µ ×—?óÕ¿àAÌt?Þ£gûuË¿Ÿÿ?2Õy¬%›ï\Ïÿ}PÇa³ýºnø¿ç¯þ?\¼6Í íÜÏL{e¼µ!Ìuy}éÕ?àTÏí‹?7ËûL[ÿÞ®_ìk îU¡áÞûš¨Žc«û|óÕiÆæé"×%öfß¶ }5]¾}ÔÇœ¿ÞZ7§÷–¸¿%¼­ªÛ*8lå…÷òÿßU!Ìw[×ûËL®á¹wýÔí³ýº›÷ŸóÖ_ûê¨9ŽÖŠâ·ÎŸry?ïº>ÓxŸ7Ÿ'ýõEƒ˜íiŸûÕÆý¾ûþzµ95+Í»¼Öÿr‹1ØmjÍ\}·ˆu ¯º%O›øêSâäþÿêè®eÙüõZ9K%ÙEEöÈ?çªÐ“+ÿдS|åþòÒ$Ëýå `QFê\ÔsH9ÀOø*üŸOÄÏû†é²ÒŠOø*7üŸ_ÄÏû†é®Òа?(ßE–!Ô?ð)êõ‡Š¼K ùPx‡WÿodíG³köeµ‹]ßk„/®êƒþM3þ"ÿ¾«ñÖÛÇž/³Üx‡Yÿ¿®õ«ÆŸX'Ëâ ïøµÌ=¤OÖ©¼ac }Ù_ýŨ¥ñ…š õùu£üxø4-̯óÿÿ[¶µwm¾YnbwO‘·«ñt{0ö‘?GSÇ.ó²ý‹÷?Âû©ïãoúvÿÇ«óÞÛöÆñ·Üh,_ýýõ±mûlxªÙ6Ë¡é·?ð'£=¤O¼?á0þì QMâ{çWò¢%þõñ=·íÏ®'úß ØÿÀ%­ oÛªñÿÖøNøÿý…¡í"}†šÞªö»geGÿ¦+Eµåòof¼gÿaëäÄý¹"õ¾•?ÜŸÿ°­;oÛ{Jÿ–¾¾OûkG({CêT¿ÿå«P÷2ïù§jù²ÛKÓ­Ðï¡ÿV…Ÿíá ›æ‚ú÷öTrËí´>ƒŸþ[ï¦<*í¹—~ÚñÛ?Ú‹Á7?zñ“þºìJضý¡<7üÅâO÷Ù(cÒ//â³Df‰Ÿw÷¬$ÛÓw•³þ\`…ÿ‡þR¦×û»kŸøyÕÕ®e}µ7Åi«µb’o›ûÔ{94NïgûJ•^gÍe‰ßýºá.~=éVkû­)Ÿýö¬¤ý¢•þeÐㆯÙÈ=¬M†æ –ùYªÛÃýÕjðýKöŠÔÒXUlâ…ûZVßµ=KK¸ž%Øñ}¨öAí`zòYÊßòÉ¿ïš!°i¾Vƒgûõà?ð²5«Ÿ5§¾dM¿ÀÕ]<ðö•þþæåÓï%yì:õä1mhoøqÿØöûÙüõO=·­mJ¬Ïj³ø‘¤\¾è —ýÇ–´ÿá?‰×jéñ¿ûõàéö›?ùn»ÿÝ«Ûw)ÿ/’ü¿Ü«öQk#Ø5‰ÖÚt¾DCµ»^‰àÝBmSÃ67W_<²Ç¹«æ;i“R}Ó³?ûõôÿ†vÅáí5þx%qׄcðxyJª÷Áïø* ãöèø™ÿpÏý6ZQIÿCÿ“éø™ÿpÏý6ZQ\gQû÷EZòäYÀó³ªEîwoîÐäÇí›þ6x·þ¿åÿÐë̶+¿Ë÷ë¥øãý+Çÿ|Wy§´¯i-ô®¯·ï¢½qWšÜ½–)á‰×åwZì3ŽF‚mO½Z^×›ÃÚ§Û fÙ·ÊÙþõs°ëÖΛâÜéBx†ÎgÚ¬ÈÿîUÆ™™Úèþ*ŸMm)"fßg,¯ó¯÷ª“ëlþЂV]·òý¢_Ýs‰ªØ¦ÿßüÿÅ÷ªÒkÓlýüI·ûô{1û§C ë:T¯•s-·ˆ6ªißóËýº®“j-ºú }¿~ݾýg¤Ö{7y±>úµû¯“Êò‘?ߣÙÄÏÝ,À¿à"od]´lWù•–„ù%O÷¨å4Jðè_Å-äW6ÖÞS2,/ÿ»ÿ­t­qà‰¼ý?d¿uö²V<Þ!¹Ðe–Åt;»ôvwY­öÿüŸÿ "x^Ýo4]Ißþ™EòãôrˆèÓDÖž/ù‡¿Í÷Ñ™?öJ´šV®ˆŸè–ÿmßÿˆ®i>4øy.¶ÜÁ©BÿíÁòVí‡Å¯ Ü¢m¾–÷àj9GÌ[þÍÕÓïX«ÿ¹-=,57ßÿÉßø>úUˆ|m¢Ü¦èµÿÇ«°ð7<'¦Ëo=ö«p—K.÷ŸïEýÍ”Gßc‡û5ô*.ŸvˆŸîñtä¹–W–{9ÿ~ñÿÄøÛC–xV S»q¹Q?ñÊá,Ñ]~iàßìoÞ¥D¢mÌyâx†Å÷¾zÛ*·a¯XÞ~ê Ûæþú½z+Û~ër²¿ü +X‡÷ .ÕGÝ÷£”9Œ˜~O•¥Ùÿ­ i§HŸmÌ¿ð kŸÔ­¬înŸíÛ^(¬n¥‰6ýéV/“ÿ®^ÎóÃW6ñ5Íäö×~dò6RcÕ’óP…ÿãòçg÷üÚ»m¯küË«ßßÚà¼<šÚ­ç[Éo-ѾkwžTÝ]V± Z®£qs¥@¶ÿìÿjwÙZr‡1ÕÛxóĶßó»Oûk¾¶ìþ'x³oË«·ü}y'Ø5­è±\¯ýýßGØüT÷}›SŽÚ/âO)_}cËï1îß¼_mÿ/ÑMþþê»Ç_où¥‰ÿïºò/ %ä1\/‰u«¿7þY}žÎ'ÿÙêî›âM*Âþíµ5¾¿ÓöþáÒ$Gÿüõr£ÊDZÃûBx>ýµ£ÿßuvÚCWû²éVΟì5y=œÑ^YÛÜĬ‘\*J›þþÊlȰ¦æ¨å4=–ÚN_ùk¤ßÖ‚~Òlýî‡"¶’×›ø3á£xÛK½¾‹W´°Š×nä•~æêìæý›hom'•%ŠX¶¿ü‰F&<ÇÚi¦´É¹®U¿¹Uîa¶‡åkæÿ€-c¢O6i?›û×7ßÈ·1mdýï÷êÕ(‘íM'¿ÓÓåógøʉïô¤ºIeóþXI£¶ç¢kÙó.ú¿fG´6¯m°iñÕ)­•þ]«²±ïí–+äJ¿g=¤ ÏŠú‚#ùVÊŸð*uŸÄ]FþÂᙕWåÙ\ƒÂ»éЧ“÷~J9bÓ4ÓÅZ…ãþövGÛüu™sâ{èt9b–ååj³îS÷Oò­Yæ3Os{ûÙåÙ]ƒø†ÅìÚ%“{¯ñ×.ólùj›çÝG)Å‹9¥°‚â U]åþ4¬ìÖ‡fæÿ€VŸËO}¯V=Í´¿ò×îU±ªjܺÖ{í  ÿfåó[ï¯Ý«pí…÷/üµªŽûhI¨åê:§Ìµ47;ÿ†²a›cUèfTz9@Õ†mˆ•±m6õ®}&ùëBÚçÉþ*¾`4³î_}hË-ÛwÖ=ã˱Ûnôþ9€‰ÝvVdÓ*U{›ÆF¬÷¼ÞÕdsF‰s¾x¿Þ¯¯´ùéÿõÁ?ôø»A¹ß{oÿ]V¾Óпä§ÿ×ÿÐkÏÄ¿xïÂ|'à—üþO§â_ÓKÿÓ]¥ÁPÿäú>%ý4¿ý5ÚQ\'yûû_9þÝ%Õü9ðUÿ±ï¤°–úém%–ÚþS#+æOÛûþHÝ—ý…"ÿÐ}“ó6ÃAƒÂ»ïôuÓgþÏ^(þ*ƒU½¸‹P¹Ô&·oõ¤¬ûkècM[ýö&_ù`û߯•ì/Îéî|ÞÁ-{£îž]Y…‡†×Äšö~‹¨^Û]íßþÛÿC¬ù´x{Ä×,º’¥ì,¬û·¦Ö®—Gñ=Ž«­éíö†X"wÓøëWÎñ5Ä¿ë·íï%_)—º^†ÃÆ{‘¿´íûëÿØVÇ“ãkkÛ{iìì¦{…w‰þ_šg­ÙÛ<+xÍå7ÈßìµR4>4·ûK´ÑYy©# @s7Š-¢ýî‘ms·û’Ôךö¯¦ÚÚK?†¿ãé¶E²â­(|[g7ÙÕ—cʯYú¯‹n_\Ó4¦ŸýÂéßþúG¨,ŠˆW–Ð~ÿÃS§ûi-2çã„_éš}õ·ûÖíÁyåyR¯ïþH‘×øë âŒà¶ÐWËmm5ÅÔ±Köç‹çM¯÷?ñÊŠÛã5²2·ÙµD]¿'ËZßôÇùZ[Ø_þš­iYë3XE;4{íÕ¾ZÏñæ±ga¤%´övÎ÷R®Ý‹þÝXú œ¾D·’y¿ßò·¥[¶ø»áëÅܺš¿Í³g‘Rÿ Íoi<úE¦Ï)]¾ZÊñ?…|#a¡ê²Ï¥5¶È7ÀðÿH¿ð±|8î‘5õ·Î»þ{Zг×<+~è«ý›rû]÷ù[køoð÷ÃZ÷‚4ûëÍ#ý-·#~õ«BoƒžšTX –Á¿Ö£?ËKආ<»~ÍbèÿÜm• ž ÐoÑ%þÏ?ç•ÕxÏÃO…ŽtVvÕnÐï%ûÿ-oÃ=ì—t^(»¶ÛþÿÿWñ—Ôá¾íû¨¯aÿ®:‹ÿñu¡¥x3þíSí1K©MðÃ-ÓºèuàúÇÃè?í<&¾8Ÿ÷öhY¡•þO¿]/ü*/Ø&Ûoˆ—.‰÷žVj‰D£Õ|C êÅ­ºØê²è÷qoÛ40oߺ¹Ù¼%ãß5ÿâ½Wþ÷¦%p:õ‡Åoiq\Ëâ…¿·–x¢‹ûïó×@šWÇ[?5–X/-ÛýRy©½*9@ìôoˆ:%í½ÊøI¼x›z¤¶(Ÿû%hx’ÏÅž'Õî5 í´$–_žÞV‹ýóyÕÿ>2xV×ÏÕtæ·‰~gM¯Rø{öñÆ·§}²ÇÁßl´Ý²_™iÙãøªÛb®•i2mÿ–:œ©ÿ²V†‰¥x–ÃQóntï-<­j?Å\}Ïí'«ØKæß|>—b.ʱmû`h eq-Ï„çIb•Wb}ú\£æ=i wýÿƒ5´úw¾Oþ.©Ms¤[+íÐüL’¢ýÇŸzoÿ¿µÆYþÙž výÿ‡5(k«ðßí?à/ßýší ivïýòÿý÷Q(Ê#æ=7JE¶Òôý˱ÖGOîmJ|Óo•kÊSö¥øas½›Z¾¶Þß7›^¶ø÷ðÞý“Èñ‹&ÿàx³6>øo¬xjÃÚ®™®Aròß´O¾Ý>îׯ]›ã…ßR·º‰.üë8bG‹äujøêÛ⧃¦Ù·ŒàMÿß‚º ?éZ—ËЬ¦þëýÊ =·âïŒ4ÿE¢^iŒÐº+¤¶ÿÝþå|…ñSz|F–%ùßl_ú{´Êû<‹È®_øž¯ø‹­Û[|U»Šóø?ô ÒŸÄD¾ŸQ¿á<Õ~OºÏ^ײWò¾óþö$ÿÇÒ¾qð¯Æh><Õg¼Ôå†Ý.™%Ùÿã¯`ð÷ÆŸxŸTÓí´]qnnçº]°ù ŸÇDŒ~É÷FŽ›4»MßóÁ~OøŸ6Únšíýo¹·þé(wùëcÒ"¾ÊŠñ?†ˆf¡ß{UeLû7Ö%ûïG­[ôýëÖæíï@³:$´Çu¦Lÿ=Tó¨÷ðUÍ»‡¹ª÷/û§ ƒãýmB›ªÝÊlªHÿ%JO{•ÙU7Õy¦ Í7ÍT|íôÙ¦ªèÿ%\@&}íLß²àªO6ʰ-C7ÍVç÷µŽ—-¾¦I¾zëlþuFþ è,ô¦ûCÅ,°Bñ/ͽ«³ÔµWÔmìô­ûb_¿*yª¿'÷ë¾Õ_J¶µx"U³¸‹äŸgϽënSVgÓ4¤O¶_Dûÿ‚g©¯ô}2¼Ùg¹¹ÿ¦(¿ý:Âm*ÏMIeÕ`O´*|Ž¿v²µŠ>Ò¬¼©u]ò£ìÙNô)Êx“Mûí–±¼­òÅ7ß®}ìö|¿Ç^—áíKOñ樟ið¼÷öñZ¼««Jû6À+’šMê»¶;oMÿÝ­¹ŽiD¯áëfû}§ýuJûSCù4K/úà•ò†áWÕ,¿ëª×ØjlÓm×þ™-pb~#¿ ðŸÿðT?ù>‰M/ÿMv”TßðSÿù>o‰÷ ÿÓe¥ÆwŸ¾ÃïWÌßðP/ù#šý…bÿо™z¾eý¿¹øE§¯ýDâÿд?;õäßáýOoüû=|« -äïÜ7ï×ÕºöÄðæ°Í÷ÍÞ¾Jù¦—ll»ßç¯b”½ÓÇ©otõß ü=þÁ׬µ¶Ayop¯'ûuKÅZ%µ‡Ä›Õ³_&Ý$òSîodùë'ºÄý”«;=ÜLûßuu~0MÿuUþ~ïö(”‹Œy"gêP­µÒ3.Ï›gÉ÷Þ³l4HWKå’-‰äºüÿ2~µõ$i¯QWsýÿ¹òSô¨[}Âþ÷æh·|ߺû•"Öì¾]Ûö¾ïûïøê§ö ¿j·¾k˜>Fû¿}lxždH¥VÝò+ÿÀ>tÿ¾©–¿gui×ï}É¢ÿÙè­¯iP[$Mümóÿã•ÃëÞ¼Ö4Ûyí™fx›ïîÙ·mz/‹ÕZ3Eû­¿6ÿ¸õÏÂð%º/‘»,»_vÇEØÿ"Pzhí Vé·ýl í½¾O¿Y^$K›•´oÞoƒçÞ÷?{]Eâ DÛbDò¢þ-û>îT:RÄÒáWäu±—äOŸøèg¹¾û•öÉ>É,I+'ñýúÁñmýÍ΃¶wi¢‰>WO÷öüõÜ%„³i¶û Wt‰]¾mŸÇX¶n¾|KrÑlyv3Ü&ýÿ½û›?özÌðMΡmá«yí¯'ù¢tò>àÿj´/<[}…î-.emŒ¿,Ïó»ÿ¿[¾LikqµU"YåÚ‘}Åùë—ò[|«»ø_ïÿìôoá_ˆu  ‰m®ÑÒéž[ùøù»9¾+ÞYµßÛ­¼ç•¿tÿÀ‰³øë?GÓm¬ç–-¢Mÿ>ôùÿƒûÿÃ\ÿ‰-¶\\?Êéónwùîbh>'ºÿ…“o¨,L÷{]×ÍÿsøëØïþ.Ä—öó¶Ÿ"iñnKÉ·}ÖÙü \<>¶³×4Ëå¶•%–VFÞß#¦Ä£^³ò|Ö—võÿ–»~x¿ÜOã |Tñ„ZÆ©£ÅÏmi«q<»ö¾ÿŸÿ@¯h‡ãf‡a£ZOr·hwû?Ùÿýÿ÷kÁ/üý±[ó gŠXR}’»ÿ}ÿd¨öqi#é9¾"éWþ½Õt«Ÿ·Å¦ÊÑNŽ¿}×ï¥yìÙâ}+^øãinlmÞñ‘àK´GÙó¿È•æ‰y-´Z›ÚÏDë*yÐïŠ-ßí§÷ª†>¹ÓuWûCO’iuqùvlûÿ½OïTû8‡1ölÞ Ðf¸um#O™Ñw¶û8·×Î>3Ô¼­ü_𕟅í’Þ ZßQ·ò‘ßzW?âÝsDK}N-zûíwM©»;ù¨Ûÿuå qW/rþ?ÒVX§Ó^y~æíîÛŸø”b_7)öÝÏìýðîæ_ÞøOKÙ÷ö$I^CûB|"øeð÷Âi]¬5 ÿãÍ-"ÿZÿÜzÇÔ¼mâ« gLŠMrt´°m–±'ð~éþK‡ÿö«Í_¶oµÙö¥Ø·¿ø©ÚßÇ_龊(58!¸K­í¯\}Çýïú¯+ef”N¯àƒµŸør d¹K ï)^i]öýúæ¾+ü:¾ñoõ¶³¾[;‹†Š%wþ’«øc⤠—Å~%ÔìÚgÕ5h­|˜›î»oùëºÖßÎñ¼¬¿'ïâÿÐ+x›{³7xHÔ%¶šöÿQ‹l¶ÿÜß__yË6õo¿¶¼ Æo~Ø? <ßõ[—äÿ¾êâsT§È~’Ã6ÄÛ»îü”;ÖzMçJì¿ÆÕa7ÿ{eY‰a&«£;nò›û•ŸöËo¶Kb·QhyÖ/î·Z¨“¤Vë³»¬I»æù7T‡)^kò™Y>}îÕŸ7†'¹‰%ßÏáwjݼ°¹¹²F¹o“výŽõVke¹ºó~TØ¿.Êãïü=²X¬üøžîQ+™¿¶–Ú_*½:e¶¸I[ç—kí—oεEô­ÄžÔµ->všâ×øÝvRæå^sË^fO½Pùß=X¹ÚîíY®û%­¹H,^?ÏY“>Ê–i™ÿŠ©;ÔýíUæ›cÔ¯T¦ïPH?ÏP»í¨žmŸv¢y™è •æßY÷3lZ±Un>ý3Îd©aùö5TGß÷«BÏnÄ­OCÿ„a¯þ}»H¹þÇÖé"kïö~zóÉ´M—²Áy­3ýžWF—s|ï]Þ•3^|4ñ…²³¢Ëo*§÷+Ξe›åU®n_xÛ›Ý-`ø^Ú)gžêîòâY~mŸþÝoxcJÑRáÕ´¼·þš°m¾ö틾ºmfùoûÕrºDeïõ¦ÍÓ½´,)o£¯ÈŸÃ÷+ÁïîvJêßÁ^çàýâßoÿU™lÿ€%|å¯_캸ÿ®¿-cB%Ô‘ÕxJå_[ÓÿëºÿèuöUŸüyÃþê×üßâ½w}ëÈ¿ô:û®Ù*ÿv£ña>ð'þ ‡ÿ'Óñ3þáŸúl´¢¤ÿ‚ŸÿÉó|Kÿ¸gþ›-(®3¼ýö+æ/ÛýÿâÓé©ýíEô¯§GJùsþ ÿñk´û¯þƒWˆ$~}ø†åSÚ®åûÖ®Ÿv¼3ÁúÞ™©_Ù[_h¶Ïå}ïÝ'Ì•ì~9Öí¼=á{¹î—ä•<¥ÿz¾wðÝÌ¿ðË/ñÿ zQºyR—¾{EçÃM?UÒ"ñeµ†Ÿo|–²¤MóüÛÛîwä®_^×´ýW⮪ö;žÊTW‰ßøÑR»_í[gøUöZ ÿÛQ>÷ÿ[þª_¹þÍxjj»ü[vÐ7ð¾ßöþzŠ~ùµMŽêýâûSù¿:nm©»eWÒ¯ K¤±òÛÍ•¢u}ß'ʟܬ¯¶/›¹›gÌû¿ÚªO©[mÙ*+¸ŸîUœÇk⢙>÷ϵö³ó¥w1mò¾Ó,.íýÝèÕËßê[â›÷¿Âÿð/ž¢¼¿‰JeÝæ¤¯¹êË=+ų*E•µb_Ÿgþ‡\ì×+ Z+KnŠ_’Uûß#ýÇþuþ±öŸ•¾ÝoGþçÉ\¿‰õ/'F´ù¼›¿òPasµímö²ïò"ùÑ~¾”Ýüífíb]éöWùýú̳¼ûJÚ+y“?‘¯ý÷Y÷šÃYµÃE,‰+®Åtù?å­AG jIäØ"´JŸ,_}¿Û¬$FK¯•Y%Þ›¦ûïþ·ûŸÝ©u-WýÕ·l—lI½þŸ}bjZ”¶ z±JÐÝÄžlIß_ÞÿÓ°wÿC¸‹ïËæºW53ù3ݬ»“j¿É÷ü¯“øÿ½Vôy¯ü4í>ç»ÜÏ+Õɾk¶~x•Ýv}Åù?‚¨“»Ñî~Ùç4¬Ë·ætMŸÁ\¿ˆãõÙ¿å—š3ÿÉýÏ⫾ ñRë^«w<»¢ó¶ÿ±üuK^š/¶?”ÌŽÊÌ¿ó×îû5t¯fÖg›göoßÊÿëüÔoÝ%Rñ&ß·¤ ÉZ-ë²]òÿ¾•KM׬fñ¦”±@—ó»ùзÉþ©?ñê—^Ý5üVÑ:»ºï[tþ/öÑÿ†€,xJeš-A fEò%Fx¾x¾çû_Å]_‰ÓɳÓ×Ê‘þïÉ»çÿ~¸x†ÏMK¥žùwϱE2/É¿gÜÙýêì¼NŒööQ, s.Ø“vÏ“ç ËdGºf¶šÑÕw§î·ÿßz½ÙíºÄDOæÝJþSË÷¾çÏ¿økÏ|æ†Ãí>|å"ݼ_#ÿ±³ÿg¯@G‹n±òÚlþÓ•þy?ÜÿǪ@âfÔ¿â]©ÜËsìimþÝ4Q¿ƒÊþ/÷ëׯ!o·éHÐluÒ`vGü}+Æu‹–¶‹P®¤ßæ¼_h¸‹{¢sgþÏ^ÇylÖ×Z?Ë.Úu¾Ýí½ïýÏö¨ÏkÝX²Ësm*KoóÃóÜÉ/û5Òé¿&eÌ›ï-]bO?î=TJ4<[ä=ïË*¦ÉwËò|‰ò?úßïVÃ{ {Åigy?Ûì§X¼«ybÿGOÝ?ú¯òµÒø’i_{nT{]ÿ;¯Éoò÷«?á-Œ4¦k–ýú«ïuýÔ¿èïþ©?‡ÿ¬d8È~ƒl°éÀ¾TÑE+ùVòE°ÿÅ\¦½Ïh7Ù“Í•âþÓ¸]èÿ½ûŸgÿÙë³Ó|§ÑÍhß÷¬þLßê“ýÏö«†×®U4®Z³Jíµu »åŸî<_û=G)q,ø¶Î_ø@b_•<ßDžOýý¯pÔ‘SÇ.Ë÷x¿ôS×xª‡À::ü¨íâo™îËZöÿŸÇ— ÿOIÿ =3?´z+º¤®Õàž0F¹ý±¾/ðnOýž½ÍÓ÷»kÃõè^çöÙøo÷vÿèULÒGèo²yU~â5mèè×—Q@¿òÕ¶W>ÿ%ÕÂÿÓV®ƒÂ³lÖì¿Þ­¥ðœÐø‰u/økÁþ(‹Wm?ÎÖå‹ìë2}ý•b*]yPX·ü ªß‰õ/'^•š™íÿÕo®Jÿ[ŸÍyV-YÇà:eËjmoS¿¼û qÂûwï¹¶ª¤:¬ÞjùŠ›>êW97‰õ4ÞÑ\´?ÁòVzkw*y³Îÿßù©Äææ; h“Í©Y^^^3Êòü±ÊíüG§ÛYxKRH-£·F‰™Ö%®ÀësªXíVþ/¾õè~.ÿ‘GPÿ® \ÒøÎÊ óâlù~ZǛ䖶5/¿X—/óר8äW™ê'zdÏQo¨„ϲ³æz±3Õ ‰D®ïQ;Ô¯U]è2%Iª¥ÌÔ<ß%gÜÍDJŒK 2£V…„Êê»ä¬/9êÂ^lTX¾ú/Ü­Mð7›s§xÖÙ~åÕŒRÅ¿ý—JáÓçŸ÷PHÿ/ðDõìvzoˆu†škhm£h2ºü××üò§÷䪞9øÓ©ø'Ñ}…´KB-±OöEÞÿïüÉXó)Ëè>×µ„Ýg¥Néÿ|W¡è? |@—ÿi¶‚Ù?Û–¼_Gøßñ#âˆâÓ4­e“{oò¢T‹åÿ€×¥øÃâDZ ÿg·Ú´{ö‹Ç¸Ûÿ}UóJcå‰Õh/â? ÞxÃU×,í,íï( ýþ÷uTÙü5ó¾«r³\|«÷¾zê/>0Fž}ÏH†|Öóu7ÿZÛž¼þæçý½û?¿÷Þ¢äŽÃáÓùÞ-жÿä_ú~€lùv×çïÂ_ßxëÃëÿOJÿøý~‚×6'â:pŸ øÿ?ÿ“æø—ÿpÏý6ZQIÿCÿ“éø™ÿpÏý6ZQ\gyûñ_+ÁB¿ä–èê¿{ûMôú¦¾Aÿ‚•ëÑx{ൕ㜲ߪ§ûÛ®÷ˆ—Â~Vüoñ'ö–¯ocþÿ÷ëi´Éµ}´X<•û }«gñËüuÏê»a•%¼fšîVwù꿃÷ÿmíÚÈŸì5{Ï–•(ûǬx·ÄöÚoÂËÝ?í-öÙu.>Éä+º¢£¯úßøy&Žñ;¼±K¾áþò=^ñÎ¥ý¥zñ|¿g·mŸð*ç4×—íîË÷‚¢…0”¹Îá/ó/%×çjåí®ZæòãPfù"o‘+cÄ3o²·¶_’_ùjõÊ&Ô—åjÛ”ææ=hb¹µî"ïùÿ߬{ho5‹û»›f]7šßî}ʱªÞKm¤ÛùM¾â]È©ýÔ®]&¼Ò·í•’+…ØÛ?k§˜ô¸n~ÙùMçmùÙë’ñUûMx–p&È—çoïÖÕµÌVz7Û72m_à¯?¼¼–k§¹Vÿ[ýöùêãp=JÝ5•º+üïÖf·~»Ò]û[æß÷?¿F‰r°èÞjÉûÕ‹ï×>šÄ©ª%Ìëç#3îÞ¿'Ü¢$žm~×1ZJ¯û¯#gÏ÷þÿþƒY¾!Õb¶µò•¾wûÛgñÑáë—š$•[dL¯ÿ¡×/âKÿ;Rÿ[½ÿ‹¢2çÜx?UgÐ^–dIÙö=X¼³+϶4‰¾Oþ"¹ÿ ÜÅ7Él¿ºþæÚŸÆz®ËÍ¿òɾwó—çû•›>Ö"K}Wnäß¿çþçÉZÝÏ“z‹ºT߯³øßäûûÿ‡ýÊä|1y2Å·˜ïqöãßþÅtÞ$¿û4·÷·"º7î·lþ?öª æ2mµ%ˆ6“À¿sägO÷+°Ô¦WºH<ÕÙ*ïÙú¦ÿ}ÿ½^[£í{ÔÔÚ_%ÖuO&ô$¹Šm/ÏiYw÷WÊÿ§÷ªùB'5â™ÖÊçvù ŸýnÝŽéýÊõ½nñ¯"²ù•Ñ•ço‘?Üÿj¼?X¼–ÿVx,_í·zù­ó×qm­µý…¾Ù-ŸæDùÓ÷þMŸÃþýD‚$ºÆ«,: ÄðO>ù`T[‰Wçþ?¾•·àµç‚Ý|õýÕÖÆw‹zÀÓûßí×ã=n]5(¥‘<Ø6lݽÿàoýÚ»ðÓR[k9m·]ý¿~÷û?»@n¥yö9n%óïaù_ý»›ÿe­?ø®óRñ§cyr×/•Üh—ÉþÍsZ­ÿØínÚyå³—Ê)-åwÿÇþ÷ü¹ÿ‡¾!dñì¾nÇh‘>Oâÿ~ˆÇÝÓoæ—ûR%hzýŸä†_ÞÅ÷þûÿÕ{?Ëm¬øsLÝþ‰:Å,¾S~éŸýŠÏ¿¼DƒLeXݢݾVH¢ûÿêŸø«Ïÿ¶îoõÍ1¥–'H'ؾJìDO÷(ˆJ\§Ð¾'¿o´K¹›e«·ï¿çßýÄÿ–«\¾ã6ð6©i«®Ÿç>èw·ü~n·þYVýâͪi’ùW;%fþ/ÞýÏùw¯<×¼©®/bÚ©/žŽ¿½ßpÿ#ÿÇÇ÷[ýÊÇ›šEÇÝ=cGÔ¢¿ð†Ÿxª°¥ÃoÙ2ï‰ÜOïW­ÜýŽÉï>ÒÐùûQfŠ-÷ßî?û?ð:Öø]s¿À¶K+Cû×HŸnýéóüŸ7ݪè‹s©\EÚÝö¦ë{’ùý¹‰ØßZ1¥¬|þð×ͽ?á&o“þþׯ^?üW÷{¿†óÿdzò}JÿüóoI|S.ßü‹^»rŸñq%ÿ¯¯ý‘ëRùNîÙ×wÝþòŸë/ü4ïÃÍ1­â ûtWkÛÿ.þS®Êö=›vßᯜµ‰™ÿn/÷U_îÿ°õtÊ—Â~ŠÍú|­»Ìõ§£¿“ªY7ý7Oý³üïÞÊßǺ­[?ïíû³Åÿ¡ÕËá9!ñ8Oø©/?àÉ\ÂÎÏ]ï‹,ó^–H•Ÿr'ÜZÄ>Ô.gÛ¤û?Û¨Œ¹bmR<ç5³U/³?÷+ÑáÕfOõqBÿíµ3þ›k7FÔ5[dî#|õq‘,ŠŸ m›û^ßû‰^›âyþæíå5roöœ©i¥j/z߯‘öÇšÄZWïÕ¤mì›eZæåæ‘ÙòDð=U×sÖ%Ë­>òóÎwù·ÖdÏó×aÁ)ÏUÑé“?ÏMÿr‚â:ëµgÍWŸuQzEwªSLÕvmµJm´£¾ê¤õvå6}Ú¥5•ßïÔ[éÎô×­¹€wÛÙÊÜÛ?Þªïr¨®ßߦºS±ß~üŸÀÖð›Oyc ¤¶jêÿÇ÷+Ã|IâGÖ5ÍCP—vû‰Ýê¼Úö¦úBX¶¡vöI÷mÞwò¿ïŠÉw󿆮$T&K–ù*T¹ùÒ«¤?/Ý¡þJ³cÒþ Íç|FðâÿÓÒWèm~süvÿ…«áÅþ>¿F+ƒñ–á?ÿà¨ò}??îÿ¦ËJ)ŸðT?ù>Ÿ‰Ÿ÷ ÿÓe¥ÆwŸ¿uù÷ÿfÖ¥ðƒª‘]ÞK4¨ßÅ·gÿ_ •òüOÀz‰|á­ORµi®ì5H?‡ÿ³WÈ—À~Qø3à âñö§jΖ¶noMŸ5sÿ ¬Öñ¿{÷ÑZ¾“Ö4Ø“ÃÚšÅP§ÿ$K_:|4†_²Ü,~ÐìÉç?ðýÊõy¿vy¦f¥gý«­ÛéK¤¿òÕ?Û¦éZ ?ŽeÒ¢‰w¢ü¨•ô>Ñt߇öZªÛ+ꯨÅo=÷”þoÜãûµåö ý•ñ»UeUýÔ/ËQJFÞÌå€Ñõ&¹]?Ïݾ-îÛ¼×ÿ®Oü5Çß—>#¸h"ßçË|íûæ_»óÿµWl5±ØDÒÊУ«|›~õgé[o.­ÿåÚÝï»lwÿÖ<†ÜDZë~_†þ#ÿ„z)nnmâ‰%YŸø÷&úçÏx“oŸ½Ö'kvÙ³ý¿´ÿ±¾¦¼šçý}ÍåÍã²ìón%Üÿ÷ÝQ°†[È¢¢’å6ÄñCæùQ'É÷Ò_ãÿsu2κåüà-­¿w‰'ùþæÿõµê·¿â#ª¯Ïö§ÿÐ+̶K7…þ«|îÚýÓ³ÿýmz”;ác;ÓÓPmÒ-¿|Ÿ2ÿ |åªÃÿçàÏ™~H—ÿEWÒÐ˽ÛýšùÊæ›öëð¿Í½Õ~çý»½gLº¿ úç~õÿÞ­íÛí,RÅ ¿Âó}Ä®F¶;üßÅVÒóøZ¶8"zÝž«smkºëP²šãû赃ã?êÙùºV¯óÿ"%q_Û ‘}í”ÈuXݼßà¬yŸhh>·âýå‹PŸí Û>à­ètØ<-¢Y_jûo56]ß½ù·U èú…ý›ODöþoÍóVůùÚ•½ŒL¯¬_;§÷ª¹CûÁ©|T¼³ÚÎ +6Ûò¼Q|õÁxŸÆÚ¯ŠP»i‘ƒî%cÞ\ï—vêÏšf§Êc*² ÿ;ü¿÷Åÿ%WI©ï6ú³Œ†gÞÔÔMCÓ7üôXt¬û®Õ¡¿zÕ+®Ô“s6ǪNû­Þ|ïTf ".¯Yó}ʼõ]è,Ïw¦;ÿ³RÌ•½3fõÝQ=Kç|•Vg  ÷/²-µ]&dûÛh¼zÌy›ûÕq1¨n¥Ê¼U]þ}õ› Ë}Ú»m&÷«$ô_€ÿòUü5ÿ_[?ñÊý¯ÎÙù7ü]ðçý}?þ€õú1\Ÿˆõ0Ÿ øÿCÿ“éø™ÿpÏý6ZQLÿ‚¡ÿÉôüLÿ¸gþ›-(®3°ýú=+æ/ÛãþIv•ÿa4ÿо=+æ_ÛãþIFšßõOýªâ)|'ÀºªoÐõÿ¦ _6|%O9^/ïO/ûŸÁ_Jê_&‡¨×¯œ¾y^j|ì‘yòüÿÜû•ß„òå¹ô^¤žOÁ»Ev¹ØÚÒ?ÏòÅ÷%þ:ð{ûf‡ã^·é~kTŸþ^Û©:Þ|*ÓâU•Ý5…ÝûÝèß$¿r*ñ+Ç—þvºÓ«#¬ ‹½¿ƒä¨ tÔøMÝUz|­ò×? 3ø£Ló|׋Èû›¾Oàû•»ª»=ÆÝ˳uaX|þ4ÓÕ¾çÙ~ú7ÏüÁ]'1ÒëÐìµÿ}_ÿC®væÛ‰tvFsoýÓoÿ¾ë¥ñ#¶ÇU_¸¯·þû¬Çùõ} sO³t»Qâý×ý÷W 5µ[³][Ê«³ÿþ?ï×#âMÛô¥eŸb^/ú–ÿn»_ýø·}ÿ—ï·É÷ëŠñSï—GmÑÇâ}Æt¿üŒ@Û׬7ßý±Õ¦¸m©½Ûøë2ñæT‰Wféâþ/újŸÁ]ˆ_b#/É÷>ÿûõÍ?ÈÿÿÏO÷þýX.·¥4ÉRË/Ù"þ ¿{çÿÐkŒñ=šÙøKPX–8Q·üˆß"üÿßþ*ôëô_°n_3ýŸš¼ëÆÛ_Âw«òïÚß$¿$_ð €5ü0“Ùø â³òÒYâ‹÷ο>Ï‘ë?û 6õÚ$“÷±Jó|ïò÷«£ðÂ7ü z|¿ºÿ_ã_ö+?R}úº»/Éüê¿å—÷(ŸáŠÛF‹P–)fŠÞwo»³þûªSh-©^Ú^^+YÊòÛÿÀëwà´?ñE}é_÷òýö«wŸwvÙQþWØŸ?ñÿ Ð% é°\øßÄ2Çò,[|¦ß]/Äë.V]?Ch¦—ìq|‘7É÷Þ²¼ Íã}aŸÊwÛü{űÿîWEªÛE y°,HïåoùvDß?÷þõE5ƒCuàõÚ¿ëö6Æù7o¯PÔ´m7ÃÏ;6Ég¾Dùÿ»²¸ýyüïø_r·Ït¿:*#ýÿîìõé¾-Ò–h´õò>E_c·Éÿÿj¯˜{ ±5»Ëè#Iv§‘ö„û‰ó×¥ü7ðJë~ûs+l°Ó>Ôï¶±üaÿ"õì±nùà‹sËßûÿÁü5Úø&óP³øin¶w1B÷ökk>ÿõO'ÜOö¨”½Ñ;­é±\øƒL±vÿGYQ+cÁ>þØÕ5;k;— yöx¾Ÿeu¿ÙVÖrù°Eûß“÷ÓE¾ãûiýÚÀÔ–ÏTÖï"^[]OÍò¥—ï°üUrùNs^Ð[D½Ô ‰[{Ëö}‰ýŬûoiéâ2ÅUånšþ®×UÓnu+ùeÔÿ×\O¾$´þßÍþí[Ñí¾ÙñBVÛåflÙ ýߟûÿÅG0r•ÓËù3OåZ}ÇÿTûþ÷ûÔhúRÞx7B‰ Wò­bûŸÁû¯üz±ììÕííÙâŠmíúæÿDoÝ?ú¤þ¬€ïm¶¥‡Âø7oí«Çmÿøþýz5‚Å|ÿõù/þÏ^slëæü'Ý»çÔo¼ï¿ü~½'Muÿ„é7ÏÕÅŸlûZù¶ÛþOÿBoúuoý'zú)æ_áûí_:èÿ¾ý¿tOö-[ÿIÞ³‰¤¾îuÿ\ô÷ž¢OŸæ§ìßZd3MTžfGÜ­V&O‘Ú³Ý*€Õ¶ñ å»Åäðîþm‰\íýÏÚevûïünõißäªSPñÕIªÛ¿ÏU€*»üôÍôù‘j~úfúlϲZ¯¾€.£ü•ˮߚ¡ÜÕϽ~j%+ÇØÿ-gÍ÷êíÎʨûh6‘]Þ«Í6Êšj£3ÐAÓUwzê/9(ÞuUšoÞÐóT?ź¶•ËüõIêÕÎÝõ]ҀܭH~ýgC±*ò:Ñ =cöuMÿü8¿ôÕßÿzý ¯ÏÙ›lßü8ßź_ýëô"¼ÜOÄz~ð#þ ÿ'Ïñ/þáŸúl´¢¡ÿ‚¢ÉôüKúiúk´¢¹Žƒ÷ñºWÌ¿·Ä-7Â=?jÿÌE?ô¯¦›¥|#ÿVñ޵áŸø. 2ëìÖ÷Z“yÿ/ÞÚ\>1Ká>YÔŸþ$:‡Ëÿ,ï×Íß öÍk2³2'Ÿ.çþ?àû•è> ø—}â};ÄÚ¬ð'•gûàß\Á˜Vòé,Y–o5þv¯JPåºyÞéíig=·€bž]C}»_$QC þö)YøëÅôÛ9ì>)kpOx×÷WÏ3µu·?bO éþwʺŠ\3¢ìFÛ¿øÿàuÄ_Ï¿âΫ"î}ÿ"cN3ˆJGe©;=Âmþöÿür°¬æÿŠÊÉ™¢Øð>ÝŸë¿øš/5/°j2Û_n°u—bïþ*ϳ¼øItõÛ÷"o“mnfw^!¹ýÖïî+nÿ¾ë5æTÔt-ÞúÙ~ä¿'ýñUõV)¬¥mÛçûÿïÖ}ÍüVÚÞòÇÌÿ>ïŸþøª÷‡î—‰7ýª/»¿oûÿÇýÊâ¼`ŸòdEÿ^Ÿ}_ûÿß®—U¿[Y)ãóR$ùýjüõâ©¥û™¶vÙö¤vG_“vÿ¿RO­»$3ýý©÷?ß®vgd–'“îyéü?'úßïÖÆ«y½"ûÛ>DÞŸïÿa^LÎé»vĺO¿÷?ÖÕÞê[“KM»w§ÝMÿí×ãó¼5«nÝö„_›Í_ý“øk¸ÖîUì“jÆÿ7ü¸üþÖl»öþ÷gÎÿð:ìü%·þÞŸ¹[zA¿~ßö+ýÙÿ´%ù_b¿Éüê¿ÿ‚¶<1r©à%ÜÈŸeþ÷û‰~éåjk¹‘_ïÿªÿUÿ-½QÊ·Á˜Uü%òÿòíwožrí5«³*ïÜ¿$RþéþûëuEðMöx#ï.ÿ=öÿÓ._÷_òÃï.çû‘}ÿî~€á¿ùõ½²Îè±[îó Xž¶õ½»R%fÞíß5s÷ÿ¹ýêÄÐwÂy­«}¥m¿ü}²Öî¶ÿ½ù’]Ñ|ó|ÿ&ÿ¹³ÿg 7ÖÒ/øJ¼%¹eÙ竳Ü|’§ïôõ>Ä´‹ÊßÍ_¾ß'üýªò]{kø¯Á‘JÛÓÏOÝ\­Eó¿üK^Áã=¿èÿ4IšŸ&Ú9@á×¹OÝ/Ü_6ïøþÿðíªÿR/°x¥XÑßQû³ãü-VÞÙRêßÍŠæÛýžÑ¿{ü;¿ñ-Tø!òi¾(ù Ø×͹Ñ~Gÿâh(Õñ"3Þ\4^fÏ“þ=þGþ?øø«¶Tñ¿†–(¥D]'{"/î¾ú}ÇþíÆ×¼–YYŸÊÛòDÛ<¯úëÿ=Wþú§è?òP|?å,èŸØÿöîÿ?ü²ÿfóŸÄ·‰4Û†fT}¯ÿ ºÝ~tÿ[ýêñŸŠó*x*_5§ßæ§ü||ŸøþÍ{7Ä„•û‰å®x·¤_:ñW|`ÜžÔÍmÏZzÖƒaÿG†™V?ÝY®íÿ"Eû¯àþõqN’Ã䪭§›æÅµæÞéqû§ÿ–_òÉ¿à ^‹áíÉà+|ÿè±mI‡÷_Á\%·ú7ˆÞuò!w–$k‡ùå¸ýÓü›?å—þ;A'AˆtÔ¿øi·Ñ'Ø/§{­íóÁ¹ï׬i[fñ„SÅóÛ´òºÌŸqëä¤ðܾ$ñGŒôûh¿ÕAö¨‘%ùíÝ]?þ_P|v¹øm£ÞK¹îÚïJFÑ=VÙÕî¼ ¿¾ý¿ô÷O¸–rÿé;׸i»·î¯ðÆ«þÜ:=œP*K¬¯+ÿÛ'¨¦T¾íX~å?îSÓgÞ¨¦zØá!™þW¬÷J±3Õ'z‰êŒ¿qêÜÏT®_ä  ù“çªîõ,ÏTè"@õ]ÝiÎõWÏ@sϽªô÷¨ž€ˆíô٦ޔʯ3ìZ +ܽWžŸ3ï¦PY^jÏš´.»V|ÔRj¥2|õvjªô íÛU÷5=Þ«»ÖÀErUÝê[™¿ÚªNõ@JŸ;UÿÃT¡ž­§úÚ™쿲×Ïñ»Ã«ÿ]ôS×èm~w~ʯ¿ã–þô¿ú)ëôF¼ÜOÄz~ð þ ‰ÿ'Óñ/é¥ÿé®ÒŠ?ਟò}?þš_þší(®c ýý¯¿à§>Äÿ¬¥X÷ÞÙê), ÿzû¾lý¼¿äYµ©Åÿ =\~2*ü'â-ý̻ݬÿÐþVIißoþÇâh¥ó[îíg®¯âïƒÛÃzãË^M¥Ò»¯ûÕÊxJ—è«µëØææ‰ãûÑ÷Eñ·ØõUûé+:Ö|:¼÷:ÌW—s²\3+´ÕÝ|Eð”¿ð‹Ùxø_³Êéýïò•çZl-yyµ—zµ\jFQ÷B¤e­ø…s-þ©ws,¾s¼¾j»ÿu«+Mñ$©¬éó³|‰òV¯ˆakÍ+ï+}Ü åNŸìqöϾx—wÝù÷Ò2=ÅW‹5ýßÝtIÝÚþ Õ…­¬×d°4O/ño_kC^¶ÿE‹P_’+¯’wþë/Ü®?÷^|J«±÷|Ôó›ã È’[KË8¾Íwöv•>û>úçïüI΃iûÙ<Ô•TþóoßZÚ}³Á¾~Ý÷­ólÿžUçþwÍòÿÝJ˜õ]Wn›Ÿ}Ë\Åukö)ÿ÷ÖT×ñ=„S´¿zTw}ßíÿr¢›eχ4˦o‘WìïþÇÏ\MÍË[K,[ÙÖŸ({Sׯï5?²ÚOºÛû>_ÞïÝóýúÄñ%úÍáýoìÍ÷—fÈ[çÿÑmr·> ÓÚIÕ3ÛËþÏñWs©K­ÞŸ'ú©_šŸoûõ¥ûSÔ<7y<Þ ‰b¶i’ÞyÙM›*¯<énæwò÷§Ï·äþçñVo€üI-†ƒ©ÙÛO¾+«_)·ÿÏ\ÓëØš½ÂÊÒ¢K$Snÿb ¾cÐ>ëqXx#kìÛöÕ‹køµ(¼ÿ=fGeÚó/Ï÷ÿ¹\ÏÁÍn+ ËH®`[›DŸæ…ÿu:—ömú^6ØQ%ù¾_¸»êâG7Ú:? jKÿ –»+yh›bÿ–¾jßÃ[—-y«?”Òì_)Ûbï¿üì×hšÜIâA–8áŠëgúŸîWañ.m?Ãõľ¹Ÿìïå|îßäÿÐj æ9ÍI"}GÁ,Ê¿ñù÷çDýï÷ÿöJö\®Ë}­ÿ-Ž/’¼2óU‰î¼ÌË•/›,0üñ­þö«ÐüO6¡s£E­EyÙóÊû;·Ï÷(c?Ä—;ü3zÍ_=œH©æìÛ÷ÿø«­ð¬Û<£Å¶´EOûŸ¾‹³øÿÙ¯/ñ&±ÿ‡.ÕV'رD±?ü²ožºÝ6þúé“Ä­4QEK-»}ßöèå"2ç-½ä°ÅdËûwx¾O?bÜ}ÿ?û•gà³ïÒ<[óoÿL‘"ØŸð?î×<óE5½¥·î¿u=¿înÛdHÿ?ú¯öªß½VXlâ׈üZ›ƒµ,î…ñ>ÿÍæ·÷›ûŸî|µê*ñ þ£h°^O3Ä®Œšs¤'Οr¼Ÿâsªx+SÚ»<ÝG~È_~ÿŸïËýÖ ~ðõÊÃà¿ÄÞoš¶k·zïþà¯<Ò¿äk½vòáÜÑntùî÷OòJŸÃ]E†«äø_D‹÷¾jZ®çþ÷ÉüÝ®kMšÛûfïæo5¼¯žýïú§ÿ‡ûµ pöÞ*ÿ„c^ñ®§­·ŸØ¢H›z|ÏÿØWÔïÖo…¶v\AmJò{?èzÅ×ÂËôøž-I®%¼H~DŸjW­h)‡ˆmìl×É´‰åH¡þâo ¸Èô‹á¯ðgï¿o¨¿ëÅÿôU{­…Îùb_ö«Â¾º¿íñ»û–rÿèªÎ&²øOºþâmªó=ZM®¯T¦uß[%Ižª»Ô·;‚ª;ÐïÕ+ʰïUnfß@óUG«=T ‰ z©üubmÛê¿ñÐHǦÑ3Ô;è:#wª·2oJ•Þ«»Ð)¨zþzcÍ@ wÛT¦z–i¾Z¥ç/ñ5E3ÕIž¥›oðÕ+—]•| DïTf¹ßòÔÎÿ%T}µ`DïLy–™3Ö{Íó±Tœ.¯òÕ;gËYöΩ÷jê"Í÷ª@öÙ&3㾊ßÝŠVÿÇ¿DëóßöE‡þ/v˜Ûå„¿ú~„W™[â= ?øÿDÿ“éø—ôÒÿô×iE/üþO¯âgýÃ?ô×iEsïàûÕóoíáÿ$ŽËþÂqè_IWÍÿ·oü’[û Åÿ =‘ù¿ãÿ Eâß Ê³¶ÉmSz½|åàk}Eâo’á7|•õn¶ŠþÕ~mä>ß÷ëÂ|¢}ƒTóþü· æ¶úô¹½ÃÎå÷ÏSÕm›þž•lÒËþ‘©¢KÁò}Éå¯Ý¯š¡Ñå°ñ]ÝŒ»·ÄϷ寬/í¾Óð«BŠ%•û[ï»o‰~I‚¼2óDoøX7pN­æÚ¼©½ÿŽ¢„‹­¾`·—íä¥×ÈßìyÓé©m¯Kg·î7ËþÕzÛØy/·øüÝû?à©h‘^kÚdñDÈÌ»%ùk§˜æåö(®l.-®~{yô-õÁ&”ÖÚËÁ/üõÙ¾½VÿMû5¯Ýþÿýõ¾²µ-µô˘›÷³Êþj:}Ê9ƒ”-¾D{f‰f·•v7Í^s¬iM¥k3Aålò§ù]ÿ¹^Á5‚Ãuå3|îßÝÿn¹è-så\¯Ï+˱¿ÛùöQ̤Z>›ö.âÙ¿Õ]DûSû¯ýúáïìçÓn¾ÌÊÎèÛöרXYË •ºígò—åÿ~¹Ïèò=ý¾ »ŸÍdFÙüÃW){Ãr½…ÅšE¿í‘lmÿsûõÃëvÒé··O»Í‰¼¦Oï×¥YÙµ´ ¹Z‹¿ÎvÿÙ+ñþްìÕ`•“å_=øˆ‡)cÀЬ)hÒ«lù÷&ßö+Ä–k£Þ=´²ùßgmëþÝv~‡‡™™ÞVwùïüŸøíEñGþÒµ}MeóžÝ¶6ÅÙD~0‘Ëø'sÜ<ÿ2Kæ¦ÔÝ[<}—ªÅû«„Wß»z-Wðš·1Jû~t—åG®‹Ä:?ö–‚ð,^sÁ›ö„ûŸîTCâ2û'™h¯³R·XÙ“ý¿½^‡âÉïô»KË”ßö¨6yÈ»>u®ÃpÿÄÒ%ÜÉóv½6ÛGŠçÃWp3Hóyâ™þæú%ñ€ò]5Ûìò»*:Ëò¢Ï^žú”·ž•YW|R¬¯þíy—ØÙ/Z]’«ldÛüu곞(¢dÒõ’)^fûëóü‰@Gâ8K›ùìî.à_*h®¾vß]·‚u‰õ/ëgŸ²(¼©v°»ÿøºóÿXO¢j“[K»Þ‹÷kwáìÍ »‚Ý7û[¿‚®_Sø‹>-ŸÃÚ¶ï!nb•–]’ÿì•Ð|ñ éºô­¹fIçÞ©7ßù«„ñ=´ún¤ð^+'•þ«zÿ ?À×-öÇW÷¨ÛÕ?½U(—Ìuz­ÿ“þµš)ƒïïÿb´´¯Asãx®m¼‡O³$M+ü›¿ß¬/ˆP¬7¯ÿ,Ré¾Ð¿ì7÷+’Òž+m]&dGûÈë÷ë(Ä9zñU‚ÃâÛ¶ŠÏì<î¾Koûɽö5rÿlÙü%kEÿSï_³ÿìÿíVÝþ¶ßÙz~¡, 6Åû<ïýïîWKá$ƒ}ÅÌ·1"Aø×~Úˆ–U°óÓAÓ×÷©æÀ¨¨ÿì§ñÓ´×kŸ²[yò¼Q4[­á‹äµýÓÿüµ«s;MåO+/Ï¿÷»¾Gÿâj•„/ºÓÍó]"eu‰>D·ýÓüñ?üµ©µð«¬Þ(ø?üû º}ÿð ï´ù?àsÿèuÃx Ù<_ð«tžvû;§_—gðWq ¿üTÑ7ý|ètzš*Ko³ûÕà¿ 6¿íÚì­½ÚÖ]ßì~éëÝlc¿_?üÝÿ ר?ßEµ—ÿ@¬â\¼·ü¿-R™u]…-Ñj/%ž_»]'žéT¦ù+Jå65fÝv¨>æož¨ÌõfãïÕgMÔVgÿj¡©ž†‚$E2UG«ÏU‚J“=WßþÅM3­Wšm”Êçz¨óP÷;ê“Í@s¿ÏL¹Uü÷?/Þ¤\d6i·Ö{ÿ½Nšoš©}§gñU–=æÛü5Fççþ*&¼ª³\Õ€;Õwzfú‰Þ¨f“uU’¥™÷ÅUÓç  Ç{VÜ)±«&Ù6|Õ­ Îø¶ÐDxý?}ñ†É¶ÿË _ÿ¯Ð ø#ö;…ánÁþÅ“×Þ•äWøNÀ~ÿÁQ¿äúþ&Ü3ÿMv”QÿFÿ“ëø™ÿpÏý5ÚQXïÙé_9~ÝòH¬ÿì#þ‚õôié_8þÝÜÍðŠÕ­à’`šŠ4»î.Çùªã¸¥ðŸë?òÔ¿ëƒW‹è?ël—wüºýÿûâ½—R›f‡¨nÚˆö¯óÿz¼K·–ב[Å»ü¨ÿ®èüŸÌ{æ•|4ðýʵ§Ú?µ¾úKûßãþ õ庯ÉãÍu•[þ>¾âzÆ«4ðƒÃ‘4ÿ½mM·CåltûÿÇ^9©:ÿÂk¬*²º4ÿ6Çù+*&µ¤]}ßÚé/šÈí.õ}¿{ä¹Yö>¥/î¼çf‹vÏãù?ެyÊú“îÜ›åÿo䨴w_¶¼¾jïù>M¿wäÿÇ«¤æ.ꨩ+·”ÛöËó§ßûõ0¬ÒÙy²¶È÷Q:ü‰þãÿ?[Eò¾òïùþOø2ÁåvMßsríto‘ÿÜþíiø’RãÊÛò|±þã|õÌëvlÔ¢YQ_åGwFÙ¿÷µÔx6jé»ä‰âMÏþÞÿîW;yåMyi¹`ÝüR¾ýéûÚ±©[/É·îmÙ÷«2óMkÿ´/‘¿kDþnïŸï§ðVÞ°‘}öeÞß#oþ4¦i®¯op«òlÙò}ý©½(¹Ób°ógû,[ñÖ&½aÚ ÜVôuÞ±#}Ï’ºÛý¿`Ý»çùÓgûšðÅö Œ±M³w”‰ò"üŸÁ@ôM+ì~Š&]åodãù?û´ÍVÍnn6Üùû§O9þO+äþ4®ÿänÞRü‘}ýßsä¬+”ÿ–¾S$­»ø·¾Ïö(—ÃÝìÞ¾YYv5Òìwþ*¾¶÷—rï}¨Ó¦ÿ¹²»XAm¥ê$L‘4©ü?%sðü÷I+­ùžo¿·{ýÿöhÏm´x¿á>‰–%û?Èêû«²°yáóg_7ÍÚŸ;¯Ï/Îÿ&ʱ èñ[]$íVß°îß¹7ýÊ{Ù¯•pÒÅ/›µÊvùöoþ?öhËzô‡Ó~ÀÈ»U7ª'ýuÿa?»Y‰¢Oªéºz*«ÚYÏÜû‘n—ø»Ÿ£[Oæ£|ò쉟oÞOöèÊ~"é¿oÑ´û›ei¥‰WzrŸðÞÙí­ÒX¥hw2;&ÝûÚº VÛe¯Ù•UÒ]‰±?å—ßÿ¾«CÃ~—JðæžÛ|——ÊûŸÇ÷þF _ÇþŠmOžÚ)ÒâÞ-òÛÍóºn®ÀÖqjI{¶›l_q>þêôÝWä°Óí¢¶¹t•bF·Ýþ«wñïþ%®ᧇ¼˜¼F¾S>Æx¶?Ü—þü5¤>å/xÃDmbÂávùÒÅ÷^ßø?߯1ÐtØÑw7š½bÿÙëÚ>ÓäÞ<«/ä4¨ÎŸ"[¯ÉòKýêåtßÅySyRſųø—}fD¢u¶ß`H¯.Z)÷\:þë~ÿ¸õ«ð—Mðóø¾+ùO¡~÷ÍI§ò‘¾GÙóÿ¿²‹ø~Ç/ÌÛ"Eô¹—|_}>M•ÂüKÜþ½¬îav—fÏï|ÿ}?Ù¨‰´OEÒ¬>Íeiå[/Ùö~ë{ýÄÿnª[[2j‘7”Û—l²·È¿ºø÷þÿþ=[zm²Ùø?BùV¶¨þo÷~OîcÛ$O­Ë<ñK±ÛzÜ;|—ºžÝ?†™gàÄoøK~ÎÊÛ¾Çu»þø®×Aø¨ÿÞóÿô:áü%7üU¿ ¢]ÞRi×óÿ¸•Úøm?â OûxÿÐè5;¿;d©^iðJkoÚ·ÅwÓÁäù¶>lÿÝÞ‹^Œî»âÝýêáþÃy7íã «Ï5"ŠÏʳޟ'•½7ÿãûéSøÉ‘ö3yÊíE2TŠ¢{›÷WIÈT¼uókæo¿RÞ\þ÷åjϹ¹ZÄ¢¼Óoj®ïMšçûµEî[Þ«å$°õžïVÞo’©Mò-YçlZ£ssò½6i›ûÕFi¨šoš©M52iª/¾¯TS\¾ê©5Ëm©Ž¢™6Pw›û¿~«¼Ìô?É÷h’¤‚¼ÎÈ•™rõ­6÷¬Ë˜wÐ2”ÏòUwz±2Uy¶ÿv¨Ew›eWšj°ðµWš¹ú|¢æ‘MGjwØÙþêµhi¾Ôõ'H¬ìg¹—ûž¢2‰~ñ^ÙÚµ­“çOö«ºð¯ìßñÄ2§‘á˸Q×ïݯ”Ÿøõ}àOØrQ½ÏˆuǶ—ïµ¥².õÿÖ2«jT*œÿìs¦ìø–“üßñæõ÷ô5Àxà·‡>Içé±H÷[v}¢fËW^l¥Î{$OÀŸø*üŸOÄÏû†é²ÒŠoüþO§âgýÃ?ôÙiEAgï¸éYž"Ð,üS£^é—±oµº‰¢”V˜éKDBGãgÆm)¼ ¬ø·E³ŸÎ´²ž[X·ÿukæÿØ_?šÖÊß½fùüªú»ã•´Z—ÄOˆKÚ_ûFtTݳ毟<s«øcD–ÛUÑgÿ_¹^Ýw½wÆ^ï)Á(ûÇGý·â;ŸYhsÎÉ¥E;Ü@žWÏ¿çþ:ò› ™_ƺ„ìÍç3¾çÿj½NoéO­ÏÚáOî<›?ñÊóÿ¾ŸmâÝn{ï3û>UýÄοíÕÆ<†2—4[i®f¿–_±ìwmŸºùÝ×eRÑõ‹äñ PJÑù^WÜáÛ^aâ ÚÏP´óSîïjâ­´M>ÿÆïÛ#¼I`w–¥û­òQs‡Ú,jº’ÞDêÒï‰~_¼Ûê¶·ö¤Qy<¿<³}ÏŸû›+ÐÃÖ(ñ7ͽU“ep÷ž Ôïÿ߬yµ‹e´YïÌ‹oåo¿ü]Þg•í;âùŸþšï®Äú<ö(Ò ~쪊û‹ýú:]Vå¾÷Îß{åþöéº",6·­¿uv*'Üûÿß©fð–«û«™bÙ+ϱ¡Ýþ©¿\׉,ï4¯¤ ÍólûŸq¨­¿ø”Ĭß}¾oöÛªˆër²´¬¾WÜYv#þëûŸÃTµ$–çîÙ¶Í»oàwÿcýªÄÔµOAµ¸ò7[[¾ÍׯÏ÷>’€=Ò$Ñ-t{öìÿ€lþ çw‘½Sø<”mï³ûèÿÁVÓ[WÑ-"óÿzÊ®©å}ÿ“ï¥cÞkC¥ÝÉ¿iþ?&%ù%ÿÿ PG¼znŽí kŸå?ñíù>çñ×5g2‰÷·¿•ûŸ¾ê¾kÿ÷iÞ ñ'ödž~ÙÉó6ÍŽßsÿŠ¬Û —ì[·y(’Äê‰ó§úß¿¿ÿd©,ÒÐRÝ*ùwå{¹÷Þ¢Ô’/*-ª¯³Ê܉/ú¯ŸûÿÄ´húÜ”±$„wnß½• ò¶üÿÆ•üÑ|‹±ù),OþÂüÿ}?½þåZðÏáëØ™•ϵ۱w£~÷ø+{Äé³ìûUïlÿÙëŸð”Êú6°ÑJ¯¾[WWO“Ïýï÷?†µ|fÿ-–Ø™Ý%GÞþ«ý¿öª€ÂÙö›ý q2E,‘þO#ïÿªþõt¯üJtö‰Y÷mÝþÇûÿì×/m6ËË'ß³töû^eÿ[÷ÿÕWW4Ìú6ŽŒªþV×ûÛ>ÏþßûTËëpïµðü^TO RÛüžÈŸõÉÿ‹ýÊê<7¦ÛX[øŽÚvÜŽ¿#¿ýÚäuo)çÓ%X#tf·uwo’WùÿÕµ]öˆû?¶'YYßÍ—Íw_»þýd¾cŸ¼†ÚòãÍ–çÎH¼ÝÓ<[>Ë÷?ƒþZÖ‡†ôH¯öjHkÐýšòYóìoä<_kò¼×ûéòy_û=pž<°–óÁÁ›¿Í•Ú+†ÿ¦¿÷kÐüg2ù÷3[J‘®…wË÷Óø?»\ÕæÔðÍÄ[U7,¯ä¿ÎûÔù÷ÿì”v)öohRù¬›-UW_ž/“øø«°H!Õõ6f]÷ü®í¿í#üèŸòÊ»-Vmž²Ü¬ŽÑ~éÿ¿Ü®*Í?Óî×l æ¶ÿ‘·¼ÿ#ÿ­ÿžMYó{Ãå; 'üV¿ ÿì/þ€•èÿ廳/þ‡\'†6Í㯆Œ¿ô —vÏàù»½+äÕ"oöeÿÐêänuÍç]DýêÇøâõïŽ~(³U"Òà{x¶/ûhûÿñú»líæÅòüûª—ìߦÛi¿|kymx×2Ü+y©ÿ<›äù*)|F¨Ósüß߬Ëù¾g­ÿUµ+2ý>g®ÈœÆ<ÓoŸmU¼uD©o>O™k*æfþ*=‘Åy¦ùª»¥9þý=çª$eU¼›bV†ÊÏ¿OîÐc¾ê¥7ÏZ&ʢ麀*ü©Pï«o WòRƒ^R-ŸíÐðï©|•þõ6T’f:.ú®ÿ~µf°ÞµUíªùy€Ï™6"®ú¥sÍ•Ô[xzóUo*ÎÆæñÿ¹nŒõÚøoölñ¶¼Û¿±g³OïÜ|Ÿúc)ÆöR‘âó[6ÿþÆ«ÿf³§î•¦î"WÚ^ý‰¬[dšö³;ŸùãnŠ•ëýž|à’’ØéžuÂÿË[†ÝXýb'M,7óŸŸ¿xŸgög‡¯®wÓÙÿ}×°x'ö*ñ/‰66¸ßØ12ïþûÿ¹_wÃm²ypF°öŸ³Ÿ½ó×4±5¸áéŸ:xoöð>Ž«öéïu)‹smZö ü:ðÿƒmÒ +M†Ù6í麺O›oËO¬9¤oË›>J6Sè©,fÏžŸEøÿCÿ“éø™ÿpÏý6ZQGüþO§âgýÃ?ôÙiE~üS?½O¦<*ôù%ñi%Oо5vVOø›\mù~ÿÏ\gü|Å÷vm¯ÕO‹ÿt?‹Þ]*éßMÛsö¯´Z"ïg¯Ÿõoø'šìo°x½×?óñk»ÿA­£(˜Ê'Å×6Ë4©,¬¯òüߺ¬ÍcÁ-sj’Þi[ì›î»®Íõôï‰?aÿˆ6×Lx5$Ýò¿ÈŸû=iÍðÇâ'‡­tø.ü&«Ql–Ý%ÞŸøåEJ’û'^ BPæ¨|_sà<éäil›ýKoª¯ð¯Hó|Ø®nìÿé²Wֺݚºî×þêVÑ'ÞòlçOŸýúòO[A³q.Ÿ¦K¦éïþªÝâtÙÿ}×Le_tó#KSË_áìºkĿij¿ývг.|+âmZ-NÏU[›Ô]Š÷+Ðßo÷–oö)žJ¿ÊÑ·WÌ)=ΫãÝ5<ùô[i­åÿž?~±õ¿ø«UKMÚ*¤V·KqåmùþZõÒ­·ïÜÉVûË+#ÿmÄržuÿ .óý}æ‡$;›c|Õ­ø“JÖüG¦_Ké/ž¯/÷"UM•ì³M;éßcóàtvÞÛâ¬KŸAyÅ=œ#ÿrˆÈ9Jóký¯•¡i2¯Ïϳç®?âv•m¡ýº+ëHeƒÊû’ïÞûënçáG†®b—ÌÑdóvìW†WM•Iþ xyÓÊoíbM»e_0r‰àý=ü3 «4ßh‰®7|û¿Ø¬Ÿø>ÚâêÇÌGH¾h‘~G©¬þÿ¥LÚŠ'°Ú»|_ÃU5_ x²òÂâÇþ8îb¸]òª>Ú±|(ð3k~²ûL²¥£üñ'Ütez»sðÞúÛM–Yvý¡v¼èŸsj¾íéUü7ÿ ÿ„´»}ÇJƒR··ßå;Ê¿=Z¹ñç‹]C ’§É±7:P àk=BóWÔà¶¶ó¥‰6"üñ¶õÙßøK\†òU—mËÚüòݤ_&ßï§ûUŸàÿOáíS[Õu=gÛömKuo‘»x~-xrçcO,önÿÁå5òžª¥Í‡‹ôÈYÝUÜŽ»7¦ýÿ=w¾!¼’þöÓývDË*Ü;èÞ¬ßêZ.·ñkGu¾ß§Ë/ïfu؉^ÕsmáËø­â¶žÒh¬åI`Ù:ü”Ožµ-b}ÊYìÛý!'‰þŸÍûÿ÷Íw¯©+é ²´I+ùN»ÿ…¿¿÷ª¿ÆŸ éðø~ïS±ƒeíÃ<·_½ùýÊï|ð¯L›Â–©ù¯,±+Áóoû;ÿ}h.1ç<£R¿‹bܵͲDíÊïÿ/ »ÿï–®·Áž*ƒU·Õo­§•>iS~ßž/÷Óø«cÇ? ìü=áǹ‚Y~×µR_—Ú?¹\WÀßj$ÒÝb­¢wm×{~x›û”–ÍÔ×ÈžÙÕ®6£üï/Üù⮯ÂWžv½nÐ\ÁæªÊŒé÷ÿƒï§÷ªü+{ì~ ‚(šžYu÷Þãý´þíq¿ ÷XxßP•e‘ßÈÙç¿÷*"9Dï|fûå—jÊî«÷-ÿ֧Οøíf&äðä±Dz;Jû-þx›÷¿÷ªohú½æ—ýŸs¤\ÜÝ«y­§Ú|’¯Ï÷÷ÿv¸OßÏm¥Ú5œžJ$²îû?ÜÝæÕò„O[Ö.Y<8‘.íÒÄ¿"|ï?ûŸÝ®RÂeIîÕ¥¶O7ï$?î?ü|u¿ïšØÖü×Ðâ¶û4“}ª%u·FÙöö÷ÿ b}§Î––U›Ê]Œˆ»ßj}ˇþ*Ç—Þ(î<ÿ#ÏÃÏ•vcËó§û‰]î•ÿ!(Ý—ÿC®ÁŽÓxëáâÅÿ@Y~çû‰]®©Eý¥ûÙcMˆè»ÛgñÕüf§VäÜDÕû0%Ïü-¯¬°4?h—͉öýôù*ïÚVmŸ:ÿßÚÕý“¯çñWÄoOuµÃý-‹ü%D~# žñôµ†õª:®›÷ë«Ke…>ZÌÔŽ»9ŽcÍõ$Ù½khw×K¬C¾YZ±<Ÿž®<Ó$Ïû7ÍVá¶ù*Ç“óÕˆQvÑÊeÌ;±æû•Ð^#VÊ/÷ª3æOž«ºU鼤]Þjÿ¾ëPÛYÞjW Ÿc=ã·üûÄïT_¾gºUwE¯Mð÷ÀOx†UitìÛïÜ7Ïÿ|W¬h?±îšˆ²êúåÍãÿrݹå^0:#NS>Z¶¶ó›jÿã•Ôi¿ QÕÿàŸ>ŸþAþ Õm›Ö]’ÿìµÊê_ðNû¸w¶ã5î¥ÅŸÿg_lÓ>fo™VŽbyO€µ/Ø'ǶèÿeÕt»¿í:n® Ä?²ïÄO<ªÚ—îŸóã¹÷ÿã•úu³æÝüT÷MëDf§äeçïèíÿ jöhŸÇ-³ÖkÃ=·Ë›x‹ü ¿}pZÇÁiJë/†®æDÿŸH™êùƒ”ð›ÿ†úTɶ}'ÝýÉÚ¹ûσžòŸÍÒ5»kÛÖkIþOý½®çÃzÕƒí¼Ðõ(ë´ LMÐÿ­VÿÑÌcžÿôû_!µëèbùÑb¾]õÖø{Ášæ›VzgŽ­!·Š/Ý$Ñ-z:»}åÿ¾iÉmmxïæÛA6ß“çZ9‚Qä<ÿRÓ~"^Aÿ!=ýQv/ËX¾¹ñí ôûï Iªþ÷ÍWÓ¾G¯ROXîÚ¶q"±òUY¼1Ïå\ÞÃþä´sNRóã•Λuåj>Öô{½¿ì»ëÏþxÃÚ?õ[Ëë;6ÝâD‹íï×¹ÿfß|ÿñ:žmßóñóÕ‡³ÔæOß®Ÿ~ŸÜš ¸ÈÚQ(Ø|Wð¾¥qû­VÑåÛóooŸg÷+Éhÿ LšzØÏ¥,L–ÿ?Þù÷×­j^Ó/ô¿³\øCDšá[{\C÷ßÿ®*o…Þ¹gI|=}mµ·ïO¹WÌcÊzm·„´]KÂÙ «5¥ê£ÊðËó¿ñÀk?^ø{áçµ²¹h%…4è6#|’ü›ÍþõpV 49®"ÿЇYÒ‘wºïþ‹Rø]ªêºkÛYøþçc¯ü¶_þαæÚøÃÓ[øk^f‘.,ôçŠ(¿ÙdJó{ÿmµêÏ;B‘3º:¿^ËàËoì¯ i–3ËçKkf±<ßßÚ•åï7îµVV_ºÿú\@ÅÑ<â‰-œûíÿÞ¯¡c Wð÷ĽwÏ•R+­;Íh]~ûïOž¼ëÀ³M‰¿m{GÀÙñBîVfù´Ïýž®?2>¥Ùû¯›ï×9¬#|ÿ-tß~$¬L°Å¶¬ç<ÿUO¾©Y/Å®™ô­C[•ÖÏO¹›ý´Šº}#à6½ªD’]]C¦Äß÷Ý\ªÆ{ “<«z¥7íÿ½ò _:_áDùëèönÑm'ê×:“«}ÇûµézG„ôŠÇO‚Ûoñ$uŒ±&ÐÂËí&蟼Uâ©Ñ`Ó$¶‰ÿå­Úº%vúì§wzé.¯®G ÏH¿öjúFŠæ•yHéžK þ̾ ÑäK‰mçÔ®î½Ä¿üMzf›¡iÚ<) ¤P¢öU­´`V<ÌèåŒFìù·S袠aEPEPEPEPEPEPEPEPà?üþO§âgýÃ?ôÙiEðT?ù>Ÿ‰Ÿ÷ ÿÓe¥ûñEPEPEPEPEPEPEPEPEPEPEPw†'oš%÷Ö³¯ü+¢ê!þÕ¦ZM»ûñ-lÑ@}®| ðN´Ÿ½Ðl¡ÿ®0ª×žk_±‚µi|Ø.u þí¼«¶¾„Í£˜9O–o?a»ßö?Oïùëÿýž°µØ£^¶OôÚ\ÿ×X¶×ØtUóËá­cöQñÆŽ›Ñl¯?ëÝž¸}Ká_‹ô­þo†µ-‘|Œéì¯ÑÚ?Þ£˜9OË÷°¼¶m³ØÝÛ:Ïh¶S?à_?÷+ôöK+i—kCÿ¼µyà ßîûN‡c6î»àZ9ƒ”üÛtI—o;«ýwíò—ýúýÖÿgÿëcþ@ñYŸï[Æ©\V«ûxVý_ÈÔ5+7ÿaÖ¯œ9O!Ýó¢¢üªõÀø«Á–Ú?ƒeÔ핞[ûWyw¯ÜùÒ¾Û¼ý‹bDÿCñD°¿÷Þ×þÏV4دGDÚ~¹â-CU·‘v"'î–>wUÆ©Ìø+á»Êöÿ7ÝX«ßgçÄŸ.,lÖ8n?³7ùßìyµîCö ðŠ2éš¾¡mþþ×®çàÏìïkð‡[½Ô ÔÍû\Eå ðìeZ%T#LßÓ~ÊŠŸlÔäþk§Ó|¥éÁvÛ¬®ŸÇ*Öý4‹öq!HV–%TOö¦¢Š‚Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Àø*üŸOÄÏû†é²ÒŠ?à¨ò}??îÿ¦ËJ(êoø~WýQOüºÿûŠø~WýQOüºÿûŠŠ(ÿ‡åÕÿ˯ÿ¸¨ÿ‡åÕÿ˯ÿ¸¨¢€ø~WýQOüºÿûŠø~WýQOüºÿûŠŠ(ÿ‡åÕÿ˯ÿ¸¨ÿ‡åÕÿ˯ÿ¸¨¢€ø~WýQOüºÿûŠø~WýQOüºÿûŠŠ(ÿ‡åÕÿ˯ÿ¸¨ÿ‡åÕÿ˯ÿ¸¨¢€ø~WýQOüºÿûŠø~WýQOüºÿûŠŠ(ÿ‡åÕÿ˯ÿ¸¨ÿ‡åÕÿ˯ÿ¸¨¢€ø~WýQOüºÿûŠø~WýQOüºÿûŠŠ(ÿ‡åÕÿ˯ÿ¸¨ÿ‡åÕÿ˯ÿ¸¨¢€ø~WýQOüºÿûŠø~WýQOüºÿûŠŠ(ÿ‡åÕÿ˯ÿ¸¨ÿ‡åÕÿ˯ÿ¸¨¢€ø~WýQOüºÿûŠø~WýQOüºÿûŠŠ(ÿ‡åÕÿ˯ÿ¸©áùgþˆ§þ]ýÅEÃòÏýOüºÿûŠ“þ•ÿTSÿ.¿þ⢊?áù_õE?òëÿî*?áù_õE?òëÿî*( þ•ÿTSÿ.¿þâ£þ•ÿTSÿ.¿þ⢊gü?+þ¨§þ]ýÅGü?+þ¨§þ]ýÅEÿø~WýQOüºÿûŠ™ÿÈù¿äŠå×ÿÜTQ@ü?+þ¨§þ]ýÅOÿ‡åÕÿ˯ÿ¸¨¢€ø~WýQOüºÿûŠø~WýQOüºÿûŠŠ(ÿ‡åÕÿ˯ÿ¸¨ÿ‡åÕÿ˯ÿ¸¨¢€ø~WýQOüºÿûŠø~WýQOüºÿûŠŠ(ÿ‡åÕÿ˯ÿ¸¨ÿ‡åÕÿ˯ÿ¸¨¢€ø~WýQOüºÿûŠø~WýQOüºÿûŠŠ(ÿ‡åÕÿ˯ÿ¸¨ÿ‡åÕÿ˯ÿ¸¨¢€ø~WýQOüºÿûŠø~WýQOüºÿûŠŠ(ÿ‡åÕÿ˯ÿ¸¨ÿ‡åÕÿ˯ÿ¸¨¢€ø~WýQOüºÿûŠø~WýQOüºÿûŠŠ(ÿ‡åÕÿ˯ÿ¸¨ÿ‡åÕÿ˯ÿ¸¨¢€ø~WýQOüºÿûŠø~WýQOüºÿûŠŠ(ÿ‡åÕÿ˯ÿ¸¨ÿ‡åÕÿ˯ÿ¸¨¢€ø~WýQOüºÿûŠø~WýQOüºÿûŠŠ(àoÚ‹ãˆý¢¾:x“âÑ_ÃßÛKhßÙ«{öŸ'ʵ†õžZnÏ•»î½øÑEÿÙ endstream endobj 5 0 obj <> stream ÿØÿàJFIFÿÛC     ÿÛC   ÿÀåF"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ýS¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢›$‰ m$Œfc€êI®wTø‰áÝ 7ªBìvØ™Ÿl®@?R(¤¢¼ÚóãM›©þα’q·‡™ÂßAœŽÅ`^|S×nœ¥†Ì°Ä>ÿ6hÏh¢¾jñ³ø³N’ÇRÔ5 ||ÐßÍ‹‚Ë$n¬½pFG‚Er#ávŸøÿñ'þŸÿ$V‘öm{í¯•ÿTC”º#ì:+ãõøc¤cCÄ£þæOÿ’*Å·€,¬œµ¾±â¸ŒÅš¢œzqsWj?ÌþåÿÉ š]¿ø×WÉÿðˆ¯ý ~1÷8jßü“Kÿ‚Ÿù˜üeÿ…†­ÿÉ4Zó?¹òAÍ.ßüêú+åàåÏüŒ~2ÿÂÃUÿäšpðrÐÅã#ÿsŽ­ÿÉ4Zó?¹òAÍ.ßüêÊ+åeðtô0xÀý|c«òUHž„u×<\ß_ëü•E¨ÿ3û—ÿ$ÒíøÿÀ>¥¢¾_O [º¯ŠÛëã-gÿ“*tðÝû×Þ)oû5±ÿ·”ùhÿ3û—ÿ$ÒíøÿÀ>™¢¾m]LzûõÁÿ·•*èZ7wñYúxç[ûwG-ærÿ䃚]—ßÿú6Šùá4-ýãâóôñæµÿÉU:h>ÇÎ|gøxóYÿäª9hÿ3û—ÿ$Òì¾ÿøÐW‚/‡ü$~óøÜ}5_¯Œõ¿þK©WÀžùxÄ}|i®òU´™ýËÿ’iv_üØh¯#_‡žnž"ñoããmlíÕG{ðÃÂS@§Mñ¿Œt[èåŽho¡ñ~¡rѲ:¾ WRÍ ŠÛv²É)V#èå¢ôæwü¼»/¿þìW–¤¿ß§Ä?á)uÿËJ•cøÝ> xÿÜ«sÿËJ=”çâÿÉ¿È9Ÿòþ_æzmæ¢Óâctñï‚Ó—?ü´©™ñEºxçÁGéá+¯þZQì¡ÿ?þMþCæÊÿó=ŠóÁãè?¹Õ¼ Èl×5ßøE.GÊ`ñºéûœ}õŠITG>ÓÁh^ES¸†RuÀ RàÑÏMüPû¿;‡¼¶fÖ•ñþúÞÚúÖþßQ²ž5–#E*0ʲ²õA´ábê_óÂ×?î7ÿ^Q{ð£Ãw“ÞC§Ë£ÝÜÈÒÝO¡^O¦Ivä’Zv¶xÌÇ%ˆ/¸ÍŒn9‡þ…ÿ?Þ'ÿ³Uÿäš9hÿ3û—ùšÓÿ€zïü,]G?ê-‡ü¿øªwü,=GþxZŸø ñUä?ð¨ô,Ç÷Š?ð¬Õù&ð‹BÿŸÿÿáYªÿòM´™ýËÿ’iÿ_ðÇ´AñAØ£ÉÝ’R£ò ÿ:“þ1Ïüƒ¿ò?ÿc^+ÿ ‹BÿŸïáYªÿòM(øC¡ùñ?þš¯ÿ$ÑËGùŸÜ¿ù ç©Ûúûjÿ…‰ÿPÿüÿØÖ„Þ:Óáp¾\ï•VÊ#>÷Qœpk ý?ÅøVj¿ü“@øC¡ÏÿŠ?ð¬Õù&—-ærÿäŠæŸe÷ÿÀ=Óþí?þx]ß+ÿÅRÿÂ}§ÿÏ Ÿûåøªð±ð‡BÏüø£ÿ ÝWÿ’iG þ¼Qÿ…n«ÿÉ4¹hÿ3û—ÿ$>iö_üÜÿá=Óÿç…×ýò¿üUmÚêV×Ö¦æÞO:!œ•RO±ŒçÛó—ü* þüQÿ…n«ÿÉ5a~i‘Á䦱âå„‚<±ã [n^>ÕG-ærÿä‡Í>Ëïÿ€}msÜ 4D˜ÜeIR¹¸5-|åÃ-6Þ1Z׋âEè‰ãXø ª“þÅ—ý|cÿ…ž¯ÿÉTrÑþg÷/þHwŸoÇþô$W0Îò$r¤ê0%O¡ôèjZùÅ~ik;LºÇ‹„Ì0ÒêÁˆô'íYì?*”|8±?óñþz¿ÿ%QËGùŸÜ¿ù!sO²ûÿàDÑ_;ÿ·±ÿ ïŒ¿ð²Õÿù*ÿ ÞÃþƒ¾1?÷9êÿü•G-ærÿ䃚]¿øÐÔWÏ?ð­ì?è9ãü,õþJ§ø}>&øJÈé¶>?±Öôè¶-´Þ+ÐÚòþ4XÑ6<ð\Û‰yVmî…És¹›­”¤´½Sý/ú<–ëúü è¯ÿ„‹â·ý ¾ÿÂZïÿ–U¥ÅïèˆcÖ|úñdW~¾€™vðd– ·ƒÈßV4–ã8gùU{+ü2OçoÎÃç‘ë´WœÁûAx+®ë)àÛ•;¯öhiúĆYqÎÀÍnò ܇qWBÒÃDü)ÿ¢›àïüÚñÊW­üîiç¡QU´íFÓXÓíoì.¡½±º‰g·º¶IѰ ®Œ2H ‚8 ÕšçÛFhQEQEQEQEQEQEQEV~­¯éÚ .¡{ ª(Ü|Æç u4hí§‰t‹}JÅÌ–³î(Ǿ©ýA§n¢¹¡ERQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEaj:ðþ–›®5{AÎݱH$lÿº¹?¥nÑ^q©üpÑí·­•­Íó†Àf$aê ÉüÅsZ—ÆíZëÌ[+K{8ÚÍ™]é@ÙUou;=1U¯.à´ ¦y3댚ùãPñÞ¿«gí­ÆÒ» DÞR‘èBà½ë±c’rORM¹ï—ÿ¼9d™K©.Û8Ùogë–Àýk›Ô>7ŒH¶:_9ù$¸—ߺéþÕyGãPÏĘL‘Žû“qþbjvÚŸÅ?ß™7‘Y+Œm‚Çà¶H>ù®fmSVÔBÿijs_•'F$ úN:U´@c˜ïÜâ¹^žœäT–ö±Û&ÈÁ ybMô¨eû@eò„XÏ;ÉÎ=ª`)i DÝ»ïŠxù¤Å.pipçì})›°{wÞ¦±J?Î)£?JpÈÎi€¹æ”h✽NSG4½½¨àþ´ ÓE8v©g­=OãM¥ŒS$péÖšfx¥\CÁ¸§g­D)øÉ u¥úÓ@Å(ÓáÓNŠAùP)p§Í%(Îj€QŠ\Žô”´îÔQüéqL—”´¸¥›Úœ84 Q×€Ò‚E8t¥i™4àHúP"Aô¥éÞ˜¿Jvy±[ùßÞÃÙDZÉÿ±Óûë~1ÿÂÏXÿäªÃ-;þƒ~1÷9ëü•]Y8ÆM(`{‚=©ýb·ó¿½‡$;™øe§qÿ¿ÿág«ÿòU6o†Úl1³ãFÇ𧌵‚ÇðûUv¯­¾±[ùßÞÃ’Ž6ßáΛp›†¯ãhùé'Œu…?úUS±Óè7ã/ü,õþJ®šygD>L"VôgÚ?:}˜º¸@^wÃåGãÅX­üïïaÉÇ*>éÝõ¯§ŒõþJªðü3Ž[‚¿Ú~-ÙØ¯õ‚ß—Úk_Ä>ð÷…·-î “\/ü°€äþ5çzïÆ=_]WƒGƒû:Ôñæãæ"«Û×ë7÷²yaÑ&¹á? xf&©â¯ÛÑêìçðûUy§ˆ¼Ecu/Ùü?{ã>¸óåñ–°}«LèÆúàÜßÍ%ÔÇ’]‰ÍhÁvɶ4`)ªõºMýì\°ìs²ü>·Õ—TÕüEvïó/ˆõçÜ™Í{—€,<ð¯ÂZ摪xšÖù¨Á¦Ö®bÀÀÍäüsôÍö©e¥¢½íÜŠÙÃO* ?™®WUø½á3r‹ã{"¶Ò–‘—üC)|ÚÎemÎÅØõf94 öÏåUbn{F©ñþ ]4Ý%ߦÉnä õÊ.}ÿй]Sã/‰uˆ§†Á í+müòÛˆ?LWNJvhêÞ£¬•û}ýÍàRv‰¦g ž¸àtžtÛg“Ìhƒ?L’iÃŒR‚¸ïŽ”¨¡('ÿ×Q®AëOžhâœÐiÃÖÍ‚µÚíâeB8š¡ŸiàMGUÓˆ/oDÖÐ]¬-mmz‚GqšúQÿ’ñàlõÿ„W\ÿÒ­"¾BÐïîeñÙ¼×û9œc‚~•õþª6ü{ð@ôð¶¹ÿ¥ZEiOãùKòcNñù¯Í‹EWÒQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQESe•!ä‘Ö8Ðgc€ u$×/ª|RðžŒÁnuÛLã?¹c6>»ÅuTW‘_þÒÞUÛ§[Ü_ÏŸºÎ‘©ÎrOé\ƧûAë·‹*ØÙÙØ«}×!¥uõ$ÿ|Ó°BUMCW±ÒQ^úöÞÉ[;ZâUŒuÆM|·ªüIñ6³Ÿ´ëW!Jì)y*G¡ €z÷®u˜ÈÙv,O$±É4…séOãO…4ä%/ÞõÁÇ—k 1úäáZäõoÚ*%óLÑÝúl–òP¿\¢çßø¿Â¼KŠCëùÓÏAÕ~7ø£RȆâ = í+kçß/¸ƒôÅr:—ˆµMkoÔ®ï' 4Ìʹë€NfÇ4àhv©€¥ 'ÝU^ü P:4€wJQ'8ƒò§b˜^}éãœTtþqLšpÇÒ˜¢ŸÈâ “ž§½H à• Hƒ·cL †=©û±Q.Aöôáó… ¹(8¥ žôÀ:SÀïHƒÅ(=3úS”f’ŒãÞØsQŠpȤ€RãÀi€gÖ€h¤…Öb”PƒŽÔàxüi´îôçÚ‘IœRŽ´Àv1ùRö¤ñ¥£4à)›±Öœ=Zp8&œ'úÓ0O4¸'·JAaÿZ_¥ ¿8×ÇKMÏ@‡Š\Šo¥úS¸Ü(jhÖ”†š~:Zª©qç92 ‹bˆþl÷ÉÝÓ®0*ÆNh@piÙéN®ÁãH SìûSïLÍ.x¢àÇf”SG´ QAçŠN”@ÅÅ-%/zZ:t¤£'8¤";‘pcýÁ_ÖPHü…U]Œß‘ÁãÈg@Óu^ÉéÖ¨És¨¬ØK(,ýç¹!¿ ‡ùÓ@ËÑB°¢¢‚Œ ’Iœw ÄÐÛ›‹‡KKqÉšvÚ W—øÛöšøà@Pêqj÷Ÿu!·>afô¹'ñ¡EËb[KsÕ ‚k‚|´,V<ø×ãøe:汜ýÛX_s“øWÎþ'øýñ+âl¿fÑl‡…ôwÈÜßõT?åôŸ‚–M~5fæ}^øÍ-ãnÉúVª o©››é¡Üø»ö¹ñ_‰$“Nð'‡¾Ë û‘µqë\^Ÿà­ÆvÐ]øË[¼Ôf,ìö†R!VÞz¤ckЭtËk8ÔG®ÑÇJ±íZ+ÚËC7g¹GFÐ,tHV+;xá@8¸©XZЬ´çò·™çí#s~•@I®ëíµTiV­ÜüÒŸè)hƒs{Q×,´µÿHCˆ9côšº®­­¶Vßb·?òÚqóì¿ãVô¯ YiÍæ²™çêe”îcøÖê(Q€1ô  kÛÇ(žíÚöãþzJs è+¡Š$‰pŠ{STñOW‡»‘b¾‹»#§qNÀ{5óN©ñÿÅ7à cg§ž`ƒ{©rÃò¹ [Æzö»¼_ê÷—(í¸ÆÒ‘}aG^‹ çÕÚ¿‹´]xÔ5[KG@ G$£?ìõ=}+Ô¾=øRÂ@°Ëu¨ddµ´Ûç+_3Ž§Æ”éŠvÏgÔÿhû¹04íqœµÔ¦Lþ ·™®GVøÅâÍ_x:™³‰›pŽÍ{}ƒ}ì~5Ä _¥Ëš†§y«Ld½»žòSÕî%g'ñ$ÕC°ÁPG½Z\Þ†ˆ"Äh gb¤cŠ@2)@ ûÒûÒ~´¸æ€´½ºÒÍ.)\ȧ LP>´ ]¹ïJ½íïGAÒ€(€RÿZzŽ)àÓñO=M0¸êpôÍ äRŠ¡\p©ç§ZŒ{ÓÐóךH&œ£'¯áMSíORqÛš@8r)Ê@¦ƒþ41àZP{ÓA§ R Ï4¹8¦´ðyîhÀûS»õ¦cîô 3Nšh¥ê\ÒQš@<éKÔ{ÓCcµ.sš:S¦÷£<ô¢âÏZx=ª>niàŒ{Ðãñ§+`sLþTå sLc÷ZplµsÒ— ëJÄØ~{ã­(&£Ö‘óƒ†"nLJpã5Z<ªà–$œî$äsÓüú •[·Zb^”àF1LÎ{Ð1Ò¬IœR†ö5ɧʨ7$ ׌}iAïL æ€$Í8:Ó(Ï>敆?=)E4dûÐ ùÓàûRŽ´Ày¥ Í!Í8g½F½(jbisùÓ '½âÜ~qŠ\Ó3NÒ˜‡ÏJvi™È¥ÈÅ1ŽïN~E(4/ZF2zq¥p$Cÿë§øÔ=úÓÃïLð´mæ‘wrh HäÐçŸjvG­0ž)AÏojaýýh¤\vü¨ÛëüèÀãµ8v¦ƒÒœÐ"œŠb¶3K¼g4ñúÑ׿4™ ŒÐ68rI£wlR‡:Q¸Ç¥8Œ¶Oµ(löÅH /jf@>”¹÷¤1ÔSwâ™-Ê@¡›'Ð(,Oà9¥`&í¼g­fÙëV×òùq ÷`d¶–5#Ù™@?kÚ[O~vÛÄÒã©}OACÐh‡4äV‘Â"³¹èª2MSñ7‰ü/à->[ßk–Ö±Ä xÒ@1ìXñùWÎþ1ý¸.5c.ð³Ãrj8ÊN@b€{—nZ­BO]‘ii¹ôÝí¼=«\ê×é°¨ÜDŒ7‘ôíø×…øëöÉðw…îäÒü)o/‰õ±ò„±_8ƒîßukçÛï x×â¥Ó\øïÄ—W»n:eŒ†+aìOV®ßÞÒ|1j¶ö6pÛF:¤?SÔþ5j1[jfäß‘Îx§Äþ4É"뺗ü#ºDŸòádÛæ`{;ô…hø'á&‹áƒCl¯rÜ´òüò±÷cÓð®Õc\*…€Ku¬&IdXYŽ«³{‘{G pðŠ©Ç5!ubp;œ×'qãaqr-´›9u HÏŸ°¯üõü)ÃÚŽ´wêׇÊÿŸ[‘?çñ£AuYÃrm-MFóòàQõn‚«G¦ë> 9¾¸û¿üð¶8${·_ʶôý&ÓMŒ%¼)Ž+B.xņˆ£¥ørÇIP!…Cwn¤þ5¨€SAù©à÷¢Ö ÉÏÖ…>ôÀiCsLDêMIž*ÓÒ´›HɤRdÀŽ3ÍS½aäÉCVÆj† @·—èiƒØÆøTžw4Õäî¾ÿCõÖ·ÿ'à¿ûõßý+Ò+äσ çüCÑ€çv¡þ†+ë=oþNÁö+ë¿úW¤S§ñü¥ù2×Áó_¡èTQEr!EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEejÞ+Ñt"ãQÕ¬¬™â“ÎªØÆxRrk‹Õh?iÁ|›»MŽr¶–íòþ/´~Dô I¢¼Uý¨gt+¦h)ç‰/',1þêÿ¡W«|wñŽ«æ(Ô’Æ'?rÎR£®°üéØW>²®gUø—ámj×lñIæ°ú„Éò&©â K\u}CR»¿p6ƒq3>§&©)§ì>˜ÕhßZ VÊÚ÷Q‘N„b8ßž¹c?à5Çê´~µtÒ.¥ÙÙFà ӳLêq×£ôüëÆÑ°@ôëV׿§d+V¯ñOÅú°U›^¸‰Tœ ¼RƒÏZfGãJiˆx>ÿ<1ÍDi˜Ñ&ìPàçÌ瞟…;üóHcëš_ÇŠh¥ê}¨û½©w´ÌÒQp$b”Ö˜;ö¥Èõ¦ÃÆ—5iݾ”íÇÿ¯K¸Ó§u¢à.ê]Æ’€)€ðøáNúñQ÷§hû(n˜Í3$ PǯJ1÷¥,qÍG»ÚÔ ”7¨¥Wã­D °úPÁˆöÍ8ÜT!½©UÎy¦+ç¥.â}ê0Û‡^})sךvìqŸÖ•Oµ0`Rçµ$ @~)€‘K§<æ’ç§ãK¿Š‡¯øS‡C@\74 â¡À?ýzrµ¹)>‚ÙíM@dp¨ ¹èª2OáVîlSLƒÏÕ.¢Ó¢ë¶B ‡è´¯ÐeS SÏr 6y¢30[[~óNÛWÿ¯^/ñö»ð7û‡Óô•ms\è¶öËö‰‹º8_ÄŠñ/üLø³ñŠá¼ûÁà­þê¡óo’~Y|­|Z~d9.‡Óß>;|>øOhdÖ5X®îñ”ƒwß?ì ùš¾qñ÷íEñ;â‹?XIáMŸøÿºQÈ¿ì§P?_¥døcàæ¡Ü›é"}GSc—Ô53LÇ×-Ò»»{mŽU2OsT´øQ›¼·<ÇMø6ÚåÌZ‡‹µ;ß_C_Ê|”?ìÇÒ½Oðý¦†(”F EPª£Ø ШjZõ–”™¸UD±ú «ub½´4TÀà«^êVºlF[™’Øâ°ZÕµŸ–ÆÔYBå½ÀËì¿ãRÙøJ0¸½‘ï®:ï˜çAÐQ~ÀC7Н5"bÑì™Ôñö›€U¸OéIgá oJK¬ÞI¨K×aùcÙGÓ¨P=)ÊÀsN×ÜÂ[ZEf‹h¨£ ¬Q³d޹4ðIV þ4gНœV'5÷ð¿€üE¬Fq-ŽŸ=ÄgÑ• _×éCc×Öœ p_u˯|*ðÝýüÒ\ÝÏj Í)Ë9 A$þ݃ùP7Øx§t÷¦ƒ@<Ò ‰ÃWãoÉ¥ßYˆÛ d ÀµØƒÇô¯ŸµMVëVñf¥ ìH‚ñ‚ŽÁsÇéEì?#è{y|ËtqÝAªš© i&jvŽÙÓ-‰äùcùT:Ãi'®([„¶"ø þ$h|ËòŸÈ澬Öÿäà|ÿbÆ»ÿ¥zE|³ûy03û›¸[ûìS怽ãíëOèÓ·Öô{Ê@Xõ{rwc²$ÎsÎ…iZÈ—, V屜C4rïò±¯€§ðŒ`Îð–¦FpvIJ"jŒš½fG›áR ÷:sÿE¢ðî/xýþÌÔîué¢ÙÈýE$RÅþ² ¢Ç÷áaý+óŸû_RÓÙR½CøÔË+ cñ¯m¿j_ õ-:àcþ[h¶mŸÊ kBÚÇÆíÚxzëÚ^Ìÿß¹‹yÿ_p^ç×Ë3‚¤šx˜õÁ¯•íÿkíeó|'áɽYò#úNGéZ–µô€ÿ¦x2ЃÓìz´ñãþûW¥`>•S¼ÜŽ+çø¿kí¤Þ Ô÷0ë‘·þ…mýkFÛö³ðœ€yÚ'ˆmýJMk0žÌÑÊÿ«îJPàבAûQü?—ψíÇv“JÀÿ¾njõ¿í#ðî~ºÍüÒãF”è ÔYŽç¨oôaé\ ¿Ç?‡w‡2ÓáÿfâÎö6ùÖ´`ø­à‰ÿÔxÓÃÎOcvñüˆ‹K•ö †Gnhü+ xvãW‰¼;/ûší ý €ÕûmVÖô³]ÙÝc¯ÙoíæÇýó!¥fEíÜÒçÖ›µÜÀ˜ì®¥_Xâ.?1šÞâ!™-n£íÛºÿ1JÀ<`Ó°=?:¬'8Œ·‘üêT¼¶'æ6ÿ C$Û@R)Ë,N>Yþ4å ç}h1×sýjR¹¨ÆÑÈ ðM(¤Ô¸Èô÷ DA°pA¥ ‘Ner yàäÐu ;  ŠCœ@:SÇáŠA 8êzÓFsíO©åÁ=i ¿SN­!¼QÇcL 2WŒâœ%_LS8ÔR«#ASí@‡Rzþå`z‰D~¦¤ ˜àÒù(8@£=h `àÒû½éwg8¨ÆiÙ8àf€ /N˜ü)ƒœñN{Rùçš]ØÐ3øÒ<ûP¹Í&x梚×íƾd‘“~øŽÿ²{öÇãS‘’HrsÐ}(n£uO¨ ÐäqýiAô¤¥ ZOj_Æ 8Ó ¥Ÿð¤!ààÓ‡'úTyÁ¥þE0$Î)A¨÷S”æ€J úÓA✿^(sŠUoZ1űÅÐx>” óƒMœR¥!4gu¤ã½àiÀãéQƒÅ/˜üóJ?JŒšU'¥±(lŽôíß…E‚;Ò†¦=I7 PÞæ˜=Mh@}è.ì `IFO­7w­;<ýi p4à{T`Òƒï@çÐPL-@n:йâŒÔyϵ.áøQp$Îi¢ íJ˜éJ 0P I‘F@¦dv¥æ˜gýz3Í7 ñŠsŠ1#­9[·_¥34ddu  9 Ç4ÌŠ]ÙlÐ"@qÞ€ÜÓ3‘ÚÀž”À“©ëNbYA‘€Ý×Ü{Õ«=îí<Í‚;Í1ظþ¿…sÞ/ø—à†öou«ê\²L’âÈürhW—Â7hî[Óü9ut¦ Fþçknh±ŒBvdÇ>õk_Ö|=à«)®üA¬A D»ž(œ|¿Vè+æ¯þ×¾"ñÚËaðûEylÇËöû€m¬×܆Ãç²ü5ÕˆöO~Úút6ŸðÿG¸Ö'ÁKDÂÿÀ¥n•äšä~?ø± Ãx«[m2Îi#NÒ\ä&ð[|§’pÀãší4oØèvikkm ´ 0"…¨ü«N4 ÑéV®´Z½^ºœ·…¾èÞ€&™§Ãf?ŠE]Ò7Õ&ºx­Ò?º ï´æ`€’p:Ö=çŠ-ãÃh}8ãd<õn‚‹$3kpçµeê^%²Ó[c9š~ÐÂ77ä:~5ö-[Y?éwc€ÿË ~§êÝ*ÑÓ´+=1vé<–ÆI>æªý‰2Úmk]È\i–Ç¿Þä*æ›á{;óLóžZYNæ?‰­€¸RôïNÝÁ NÀô L''éIœýiˆ²Ã9ª5´»óz@Fi’!??½L½ª´‡ß­$ÕîJñç€O¾kÖåN=+_Mð'ö/„ZòeÄ×,Óœö¥Key™hò¬¡CÙETÖÛý ó×zÙúJÍÖ‰û ™ôª±¡û5åþ&hüËWÿо Öÿäà|ÿbÆ»ÿ¥zE|Çû/Ædø“¥d•¤'þýµ}9­ÿÉÀø/þÅ}wÿJôŠ)|)~LÛì/Uù£Ð¨¢Šå7 (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€?7~:Û·ü-á¶Õ¥ÛëÐÀuüë…¶ÈæDVèú ïÿhüŸŒ^1ù‰Æ¦X®;ã=ókX³"²íns¸uôíþ942·Æ&O ]‚Û‘|·ÎÜt•ç]ýÈ Ì„¶=èkÌ[Y|››7;FÄeXA#Њç¿iŸ…v_t6éµm?@Ôlf1Ãy©¹XdúÄÅA9Ü7/¾µç¾ð†±ð2ÃÃú5ޝkˆ|c­%´º¼̶¶µ‹(Þ obäò2*´jÖ!¶™îþ?ñÞ‘ðÏÃ/®k ¶ó(ã·¥’F<*ƒÐ1<ö¬ßüQÐ>'éwº×mdÏ Ôa$V#*p È88>ƪþÕµx/O‡Dž[ÝGO”Ío ξv@Yœ`N:0ï^ð×Þ#ø¡jÚùZ½üðé:V•<ÊÑÝJí¹ö1ùT.:ç“E•­Ô{ŸMÞjÚ&“y«ê7‹e¦Ú§™=ÄÙÂ^:õ>•WÁž<мv'“Úݮ¨ÖÛLéthÁÎ zzVWí/ð»Ä¿Ái-m%YõPb¹žÒÊ2«+'/ ä’ÝI_R˜ï_2þÏ–úßÃok^)Õ­otKÓdûdWP4Fè¹8WpbÃ9íŠ/]Áɦ}¢o. o™¶ƒœî!@õ'8¨-5‹=~~Åc«ÀvŠ ãœ¨Î9ž3^ß´?|âÏè:}Ήâ7Ó$–ÌM:¸¸ A–4ÚÇ¿S^)û2jú†›ñkKm1ÄV¿ÛU-B“#1í€úUÈ­¨sö>àŸDÒ®ÈûN“§NÌOúË8ÛóÊÕ)¾øfïÌ3øCJ1ã%þ¨oá¸í'öŽð¯ŒÛQÓ¼5=Äþ%6—XÚÝ@cŽyR6`¹œqëÒ¾Gøeñ ÄšGÄ]þÞêúúõï•Ŧr. µã+œs“ô©ök¨9Ûcí¹~ø ”xfÑJ­å´‰»þùn1UeøàI3³I¹·so}0?N[³oñ ÂWž%m x‡N—ZóÍ·ötrfbý6x/Ÿs_#OûHøÖkº Ôîm­-.<ÈôiòQ`¦&R?º>äšj rHúZ€> àÆúÔYÇ }œßHj”ÿ³¾‚Oî5Íf:—1IÏû‚½&×W¶ÕlìïVH­Eå¼wA<¡fT‘CØNztí_4øëö¡Ô¼=ñCQÑ4ù µðýƒ}•å{!<­*õl3·w J-éÄ|É+ôÿ³µ¨fTñ]àr:=Œl?0ªMû<_+#Å–Òí5ƒ ÿß.kÕ¼/­CãoiÚÎEÍê €Àí#žx ŽkË>8~ÐvõûMÓGZ½kq=ОvŒBþí~^ä|ݱÅ$›vj×3¤øâ›l^ ѦÈܳ Çäj”¿¼[a.4[ž«xéÿ¡'êß|MįÙø‹O€Û‹€Döì 4R)äg©0{ƒQüLø‡¡üÒ4ëÝj»™µ L6ö¶!L§,ØnÃåüñM^öÿ!ikžPÿ |u4ë9×>V£?÷Ö*¼¿|w «·‡.]Xða¸…Áüž½¯á÷Žl~$h²êšU½ä)†í¯£òåVÀ#åÉÈ#§=_ñ«cámã\Ö.£±Òí±çHQŽ2@ÉäŽ-v›Ÿ;IàÿÇ)I<#«³gn×ÌçÓå&©M¡kv±»\øoSG$˦Mý¾“øñÃ_-ï_Ú¤Z§Ø•Zæ1£ 'ƒ†‚xãÓÞ»¸¼XÕã¸eF;Õ¼Ì*(÷à ’ßúüD’{5ÿÙXù‘µ«>x2ä+JÇÇwVy!¹³î<­AãÇäâ¾µÐ|ugâ’=Ä֜腤ŠÖùfm£œ+ž¸©§›ÍÄ3ÁÁbI"Wu#•éUÏ%¸$š,>6ø¾Ï×ÇzâÐ&³1ðÞkV/ßcOëwÄ“‰Gþ< {…߆tû‘+Oá­éCccX@/“5Mþø2õA—Áº'˜XåÍ>¿w})sËúÿ†Tym¿í!ñ Øý·ÃÖçI´—õ1Uø¿j?FA–Màz>‘ èk²¸øEà6dfð•¢È-ÅÄ\ÿ²Aèj¼< r«þ¨[18Û¥:öäY¿È§Íåù Æ]·íkâX@2èÞ˜ûÃuþƒ8­[ÚçPR<ÿ iž¿g¾¹òÜÏUßözð}æZÏD„½O^ÍÇëYW?³ŽŒë‹_ë0•$·¼¡~¸AK›Ëò …¿íwqsá9@õ‡Yÿâ­Ïó­ÿkm±»ÃÚ¼\t[ëyš%y£þÍPˆüÈüq ¯™¦#~<:ÕY?g UHx¯N•Ü<í>DÎ}ÖCO™u_˜YžÍgûUxJr<ûmrØw"ÖÞ_å:Õø¿iÿÈÁ~Ñ«F3Ö]+üvV¯ŸöwñD@mÖœ‡öˆð<ËŸíÅ„c9šÂìè1µ[ƒã¿î¨ñNšÿž‹qþ‡¯“eø+ñ J qÚ Z݇á’3T¥øcãÛ@wøKRb" ”ÿã²R¼Gf}§mñ[Â7C1x§Ao÷µ8c?øû-jÛøÇEºÃ¬éSƒÞNÙÿ”•ðtÞñ»0“Áþ"á¶éìàz”š¥ua©Ú®otZÝOñO¤Îþ€h¼{þ"³?C`Õ­®›l3$Çþ˜º¾ï’jò‡q¶¹×È|*üÓmBÊ™‘a#¯›héÍiÑxšÎ7ÄZÄßîÜÏóI ³?JM–,¿ï)ΛöȆtüXWç…Œï`eû'‹.¡=¶­"ŸÒJèm¾"x¤(ø×\ûŠÌÿÍÍB>ñY‘º:¡ oNkâ>*øÒ6ø»SöóŠKÿ¡!­¾5xæÜqâ=øÿžš}«~¾Vh² O´A'µ(,„Œšøößö‚ñÄ'çÔ¬'Ç÷ìUôZ»oûIxÑ3óéç {yW”ÔYwõºÌÃ"ÌSÍ|ŸíEâÔ>›£Íù–­(?jÍb0<ïYÌ:Ÿ*õ—ùÄh·˜µ>¢CR‰:WÍ–ÿµ»†o…f¹Šþ6þhµ§ím¤m~ªÇëå¬2íQK”w>‚¯qŠvå"¼"ÚßÂŒûeÓõ˜G÷ÚÈ0ÿÇ]«R×ö¦ðÇß¼»¶>’Ø\壕Šèö0:óI“ÜטÛþÒå Ÿ[EŸùì’Çÿ¡ ­‹_Þ¼ Eâ%½ôKüØRä—aݸlSƒ+—·ø—áK£ˆ|A¥È}þþOZÖšöŸ}ƒkr·÷„ïþY©å}‡tioÇÒ—w®*´ 견L?¥!½·P}X VarÈaK‘UVêŸã^ãŸÚÁßɆæ9ï†J‰1$­þìcŸÓñ¯œõ-sâOÄöy5@x^ÎCþ¢Å·Ü°÷sÂþ¡áO†º/…åk‹kO2õÎd½ºo6w>¥ôªå©Mí¡WÄ?>.üXR4ø ðæžã‹» K‘ؤ|öõ¬ཛྷױêž$¼ºñ>®aq¨ÈYÿ³Ýó¯LŽŒüª*NjÛoFBV+Aa ²„DUU   8çåQ]ÞÃg’i%Øâ²Nµs|ÅtëRTÿËÄàªþ©ý)l3jIc·Œ´ŽRÇ/‰>ÐÆ=:ݮߧ™Ò1ø÷ü)©áÿ´¸“Pîß9 Ü"ýµâ!PBØ ~‚1‹uª6íJè²Ï¾T^çñ­{M>ÞÊ Ä±¨ì¢§'ãJE4„ ŸJ çŠ3ŸÂ““ÇJ bçj&x£ÓúS¼vÅ'8úÐ:zMþTÄØðçÏJU|8犯ssœM3¬q Ë;O‰·ª·f¹“cqquâ½] …b…A « Ü1Ó¯9ôô­½©$¨’)<Ò¼ ÆUn.ÛTÍ€2}Nö¹ÏÜKÝ«FÅN$L{•%Oýô¢“Ø¥k¤XÑ'Ù­ß[JrW?Ÿø×BœW'¡+ u¤oãëÅu ~jQw@ôv% 3RzÔ+Â¥$qýj„<t§/5éRFrh*…O¡¯Mñî«xRÒ+»$Hª3ÏNkÌSI}5ÌqDìLqôÉéSdVêÄv÷P]ÄÏo4s fŒ´lV*Ë‘Ü0 ŽÄÚ³5æÛ§ÊÙ5¬çd2HxŽ5ÞíÙG©ö¬ývÞc¦Ê‰l—Ïlïé•U@Rw“œpàõ§§@hØý˜¯Ä/ăÿ!µ}ð»N´‹â7Æ+ôµ…/§ñ¬Ý,`K$i£é̈ÍÔª™$ vÇS_!ü3ñ­×µHõ Eœ |ë“øÕõßÁû¦½ñ'ņZo[HG¡:&–j¡u úíÈÕ4ì¼ÿFz]Q\g@QEQEQEQEQEQEQEQEQEQEQEQEQEùáûP„°øåâð‹±|ûg9'ø­!$ÄŸjòHgˆ(æ—,;ÿ<~5ë_µpCñëÅ¡²-H'‘ÿþ5ãmp6ª&A€ý°=AïALè4Ó\µÖa¾Fž¢êˆÙ$VÏ"î ƒŽøæº+Ⱦa&]ë‘þγ|9k½NKèÚ¬{¯ú ǧn•zÖUk8þl±@vñœc‚{ÖòIROÔÊ?_ÚãÇ–>8¸¾]FEÐÒôŸìYc_- WÿR8Ê£Ö§Š¿f?^ø»TŸÂ6Ð^xc[+=œ·q¤ÐC6Ù’6!ò™ ñÎ8£ÔŸC„øÉcâMG㟈!ºiÖd»imM«adƒ hIê¾^Ò¸¯Fø¡áOëú¦‘ªxßÅsø7ÆWÚU´Ú¥®œnË·kFÇe Y}jωþ4[é6_ X轤ørôøïõ{5Ìí…fÞyp8€¬Ïˆþ¹ñÄÉ|džÕ¼_à¯Û­ÛO§Æï-‹0 èAÃÄê@`Ž;Ó{j·b¯Æ_ˆ¿Ã¯ˆ:áùçµð¾‰§Z2•Ò BMæw Fï1‹èGµoøãÁúwÇO øcÇk®i~Ô¤ˆØÏˆnY?´$e“±Pvq$Õj^ øygá?x«B_ivLæò[‡³–Ò di"„…9$)ƒ÷IÀ¬‹º­ÝçÃÏXéQÝx´ñem£H -›ÆJÏnìKüÁÃõ9µ¥ØŸÆ_uÏ€ºw…|;¢ë[¶¦§¨ê¶ ³[É>È‸ ¢"uÆrk©ø½à_|mÐ4}gJ+sâÍ ×Ë :F·6’|èÁ˜…Þ¬¾Ûƒ{W¨hžÐþiv;¾¾½Ò©4Þ¸ÒMѵtRû·q°1ÁC)Åf|V× ?ü ¾¼¿»ðŠ_Éo{uw„ºYÑG—„!b¼óF½CÐõ=WâFµðÁY¸Ó§‰µË„³‹I¿˜MU¥›än'wqÉã5•ñGĺ¿Ç/êÞ„ñFˆÑjé¥éèÛo­ùVP™'zÞpjÖ£á}ÇŸ u(5Ímt­Ú;[ûMbHüȬ¥Ú±ƒï‘~òzŒ×-àøQðÛÅž-𯋣ñ†¹¨O—&·bé°¶Y‰ I åUCtÀ£È;?g/ÄuŸx×ÄZn££hZN˜ñÜ[Ý@Ð5ô’!…7ŽNì6@8Å{ßï¾-ü5ÖtD} YÖt‰ÛM»[´¹K†‹™íŽå1  ŒWŠ|,ñλñ™u¿‡¾+Õîõ{mZÅæ°º¼¿Ø. D“=BžU³ë]ŸÂÿ‡:‡ÁYñ^µ¤êÖz<¨E©ý§30U@*»›–LÁÇEÈü);/ˆ¶ÇÞ5ñf•ñ Ma®¯!ñ$:‰’H÷°?hr…}3òã+ô&÷âÏl5X4­gÄÖ7‰$,út¥‹@î ùlÁvän¯nÕóçí)੾*É©KðïE¸µ]PHž!ÚEñPÿñðßÂÏÆîkʾ/xÄ:GĽv+¨¯5csv×jQÂηqÊwFá”cÀqÞ›þð-6=#ã¯ÇÏè_5ë;B÷KÓô¹þǘÎDnˆ2Ž o½Ÿq_U|2ñÜ7øqá¯]½¦q¨Ç™-®®V/1•Š4ˆ‚ÊH'#Ö¾jøðöÞûIÓ~ hZ÷ˆ<_¤éÐk:ž‡p!ÁÕC2‚ªXã°¯?ý§d’_h7¶’B|-q£Z¶€Öü"[*…)ŒðáÁÝïCÕj ÙÝùûOþÑúÿÂÿé¾ðĶÑÜ‹Eº½¹žÙeY7çb¦î1€I#¹ö¯@ý›> Ý|^øy.¥j«­ZÎö·¶G(?2º¯L‡œ¾õó½¾áß|ð,ßu›Í Wóî-tKË+_µ\ÞÚnYû¢BÁ[üiŸu›ü1ð–•àÝNìhÝ\›­NkI^î3·ìï;£Ø¿ÂO''Ö–út »Üú+ã·Ä˜~ xFÃRû^ë:ÈŠÎÎbÈ­Œ,G @ëÕ…[ø7ñN÷â—Öz¾™i¢êvñ¬±%•ßž“'ñÉ ©Ç\õÏ­|ïáXaý >j6æ·›©h¥ÄZÆ©+y6ÌØR®Ç²¯aÑ’º½[]Õ>|¼×íõ3^×BC¦YêZ4­*B%ye  !‘’yäÓQV°]½O¤üM­ØøoÚž·¨\ÖÈêî£;A_â#$qÛ•çÚ/Š5ŸŠ~ÁÞ)×[XOY²X^2 Ñ^"ùÈß((+µ³Ó9®áÇìïâχþ4²ñWŒm‘áÿçU¹º·¼ŽV'æH×c70=4¬–ƒ»zŸqÂîÒ5ØBc¯¦zðO§ÿ®¼ªãö‰ð 2o?ˆd[Ôºo$–íän˜ œgõ¯-øoûbê^2ñ\ºoˆml¬¬ï‹DgI6ÏCœo‚8ä¯Jñ¨þëþñíþ›¨øcXñGta±¸¶†AkxÅð²< p„rH#¾håQÜ9ï±ú<“¤‘(r[8%x?O¥`xŸâ>—àÛ›kM[ÄÖUìЉ‹‘2gÇqœõô5â>+ý±ô߇^%Ÿ #µ¸Ô¡¼$™P 6)S•2{W€þÕw¨üR—Ä-wöÝ]´†ÿI¹ öb€úœ2A¿Z9lîÛCôIuË·Óí®!¿0Ίc–'.Œ„dlüÙ^µ[QºcKsoi,[‚ù—¡¿%¿.µóWŸŽoÁo~³ñ³_Iu~f¹Ó­ìâW–;=ÿ»gÉïÛßí\·íqñE~$xÁZ¯†¤šOO4âfu1ÉêàyR®N0œ¯=Í.E¿AóYV¿‡ô-@?†ô;„eÜe“N·aÛýŒv÷5ŸyðçÀ·Š†Oè9˜î,¿ üëæOØûâ\¾Ð|`¾!ºø>É"™¯®Ë2ÛO#m I`3€?ƒÞ½SâoÇ="oƒž"×<«¦¯©[yP\=°!ì–S·Î*@ €ö$RäWÑh5=¶„y@>³ˆã9ŠY£Ïýòâ ›à&F+¥ßZ¹ÛS¸ø‘_/~Í¿MLŸý µI7ìÿ¥­iâ_F‡d6òŒ~(+Žýžþ'xŸã‹5Ë«ÍB4hœý—MŽÞ1´»–Û¸€1ß9Í}º<ò[+ˆ ˆs·hÈÿë~”š¶ƒM3ÇŸà"€d·ñ¥ðEêfÓ ÆA/ÀÍWi6Þ1´œtýö–ʯ+/×ò®kã7íE/ßÉáýLÓõSkûeÅÁq‰Xgbí# ÇQÞ½;á/Ží¾*ø"ÛÄ6°ù7, W6ˆKeC‚¹ôÆõŽVµÕìp÷_üKm!ëºÂæÔ“bت¿ð­|^¨ÞSè7xunfŒãÔn‹ë´ø«ñ/IøIáh5N'¿šæ&ÚÎ $sÕ›$p1Xÿ>1hߤ,-®4ÝBÔ)x.$VbÆàGUÏŽ§Þ›N×ÿ º½Žr_xÎÚt{)0»³­ÜÀ”sP øÉI ái¤9#÷¶Ògƒx&½Žâ(b¶–YgKh S,³HÜ*ެ}03\ƒ¾8xÆÚÔ:>™¨Îu ˜ˆÖâŒJG$éÈÏé+½†í{´šGŠã“ÂzØ~Kuã®j•ÁÕS&çÚì[¿¥ÌÜþ×½Jv+i/øqXã ø»ã5C³ÅºÁ_ö®ÌŸújü?|onF|Cs&9ýý­¼ƒõŠ´¥øcá;µF_ iÑ¡ãÌK,õR9íéY·_ <"¼‰ yaGü°¾ã¯Óühæb±r?ÚÇ0oí¸;dÓ`ÿQZ¶¿´ÇŒ¡å®4©Ç£ZÈ¿ú ¢¹7ø[áw Á5{L‘¥1 è>fjŽïá.Š ó!Ö5å ÷ »W‘J9¿­Ç CûSø³w6z<ƒÐ…'ó”Ö·í[¯DGŸ£ÚJ?é•ë!ÿÇ£jò7øKi¾&ÕcÎB«Ç ‡?Š ¬ß ¯%0ø®R¤óæéñ>¤0¢è,Ïz·ý¬îGúßHqýÍF6þp­iEûYÛ¾w‡ï”w(ð¾?ñõÍ|Üÿ õ¸W1øŽÆR8ýæžêzûIL>ñ\%‚_èÓ؉ÿZzWõ5¿í[¡¸ÌÚV©ý»FßÊcZÿµ„åâQ{oÿ]l¤ÿÙCWÈãÃ>/4yømxÏ=¾hê?ì"m ýè5(Î~€KݧÙÖÿ´‚gB[UX[²Ëmr¤ÿäV…¿Ç¿N3ý¿b¿ïÊcÇýö«_ˆüUáü3}Ïʸ…úz â›ý¥âˆøkYSᷠǯ sE¡ý0Õ{Ûü^ð…ÐD?G¾ÝmœãÝ€§-Ü Àž#ìWçîŸñZþ -·ŠuAÀêòŸý©Z¶ÿ|JSÅ:Ãcû׆_ѳG" Ÿy)¡èsO_Ãñ—ÅÇÄ7Dvóm`“?œu£ÇDã:Ô ;ÓáÿÙTRå]ÇÐûK-žsB±­|ƒoûCø²'Á¼ÓåèG™m"çÛå”V”?´·Š#4z[c¸7 ŸüˆqK“Ì5>­ÞÜôcí_0Û~Óúêñ.›g'?ÁxËÿ¡FÕ§íMx¤oÐ÷ö/ÿ8E.O0×±ôfXœS‡OzùúÚ¢?ùm¡Þ)éò´/ÿ³-^ƒö¦Ò]?{¦ê· µFþSÿJ=›ÏvV uüéÊÄg¾}kÄí¿iÿË2؉8Ì–Œ1ÿ|–­8?hÿ JëÏ/Ùà¸ûHÑÈÂç­‰N(û W™ÛþÐ> —ƒ«Û©3²ÿèH+FßãOƒî[ ®XçÓíÿWrK°\ïƒ3Œ~4ÝÁrP|MðÔäˆõkF=öÜÄßÉÍ_‡Æš4äywñ¾zmË,Òä—`º7óŲƿbN<ü}Q‡ó Ö¬ ÇÚàï8ΕŸ`ÐÑãÔ~tõÖ¨.©g'Ý»„óÚUÿš;ˆäÎ×V#Ѥ2ש¥ó¨ƒü'ò¤ßƒ÷H?JKŸÂŒŸÂ  œü  ääçòÍW:‘ûSÛýšMêÉ )Ï¡=x3áÄ$$±Iwü-9Üäÿ²ƒŸÒ¼KÄñ¼)à{wšþþ;·Œe²á"_©¯ñ?íU¨x¦GÓ¼§K{O:òm—ܹëø~uçvŸ "Ô/ûÄw×>"¾‘ö–Ä þìcŠí¬ôøm!Hâb‰8XãPª>€U¤–ȇ&Î.ÿºÿ® ž)×g’Õ†N™§¹ŽìÍÕ«£Ðü-¦x~Ü[éöPÙÅЈ“ýOSøÖÐ=©¤á©½w«§ÝÀ¥#Š¥y¬[Ù¿–\É1écs~]¿¦ßÚz À"ÂûêCý;zóU¶±ÿ]*¡ì£–?AT þ¡©dZÀ-c?òÖq–üüjÍž‡mfÛöù’ž²9ËÄÖŠ Es&ÓÃð¤¢k—k¹ÿ礼þCµj*ÈÀÏ^”ìzPr(¤ÛÐëIƒžhÏ&ñŽiƒxô£v;õ¦“NÇ?¥2oq8£ð )¤ñLC±ŠCCRžh—âM.}oJkhÚY&–5(ƒ'ÆzöIì=«N"¦r) hqA#¿*ÏÕíDÓäkfU{Œ$ù|c+Ž£ïýêºÇ<âºø&çÅš“ÉDÁh¦Y_ÝQø–ý )ìTnÙÍA§›KÈœ¯$WÛCÚ·|g§3P†0rIúb¹ðÙ>”©«D$õ'9éšynzf¢CŠ\÷"´$•‰ÛÓûb sP¶v“Ž•%«äŸ\f—A“H}éÑž9æ£~¾Ôøþï=i)ø‚ËûFÂ8Y%’24±Á AÉ]Ä;v5‡©hvºv•p©±‘Œ»œ·cÏ¥u¬~\b¹ß¾4ɇå4=ŽfÅNè”÷`}»û3é°i¿³÷ÃãšÏ{¢ÛjW2Ï3Í$×7(..%grX—–YóÕ¸ÀÀ¯‚5›«ØtXŸp¶—·6Ö‘\<~`„Ë:üEµÓ< n÷š^ßßk? µ;ïkíe-‡‡­%º‰tÛÕ¸3LFÄS³¹lœö¯xñ‘âdý›®"Эo¬RM3̱²»¹óæŠ,new˜÷c$þuòÇìãus/Ä;k(Q'Ò¯í®-õhälGö=™‘›ÓnõI'Ô—¢Gkðûã=ÏÄbëÂZÕŽ‘¤·ˆí¥Ó`Õ4Ë5·š)ä» ê‘ïX? >xçÿ´‹ÍSI¾ðí–—t/.uycÄ0Å]ˆn‡p\ õÍt¿ |'ðÿKñ<ú§„¼MuâoéÖ—7šfybbW™#bŒ?1^ cž+‚øiñgÅ ãý.;»íG_µÔî~É}¤Í3È—QÌvºl'¯ÌHô"Ÿà'¶ºžàoŒÔ¾*Ûͬü?{yw"Yëñ\¹ki¤Ü±ÌÑŸ—ï0'3^;…üW£|NƒFŽ ˆüQ¨±FûH&àIÃçП›>†½{Ã?³>kñBqã SÓlï]ŸM†söæD$ùA1Ëàpk þÖ¾3‹Æ²^Ëvƒö¿ŸH’!-÷`ÆÀ…ïœæMù7ˆÓྡñžáu4×èÔÇÛžÄÆtÙf <ÂùÄEòN;f¼Ó↫®éÿ:øsÃ~=‹SÒ4MfþÜÙêë7_e²Âv-ÄDŒ6å7¸¨¼[ã~Î~ðÿ‚t[Ëo¶Ëjz×’'†i%l*G¼a•UÜ\×5ûB]E©MàícHQƒ'Ò#‡Gˆ }›Ë8š'ÿ¦ù'¾A®ãijx3Åß¼}ã«íGKÔ L–WmºË4¨pn±î=I¤?# ^ÒüAûJø+K×ô›}â}FÓµ+m±$·ÏȤ…ª°°ô«š,w¿³ïÃ[•ñF‡gªjž#¿-¼9¬*Ën‘Â2ÓÈá²à. cüI—Oð×ÃOYøJòîO ß]\O{¨®bž[µ!vH ü¥Pd.qƒšêôiž5øm¼EâxtÉô»¸. Ôõò}œÎ™1ÝÀ!†qŠvîÉ~ 'ü,‚³ØxcM´Ónô[Ô¿¼ÐôbYn"a³rÇ’Ù¹ÇLr´É|3¢ø÷WñfsƒWJû%õ•ÄmÞLî¾LqîÆNáÒ»Ÿ꺟„’ëš_‰ ñ>·s™ˆ´è0,¡Ì+¼Û˜ >‡½r~ñŸˆh_ð‰uYµKù­Ž££^\à {˜y*ìÂ:–ž‡Šõ5<¨øCWðGâøe¡êš7ŠŸHÄ‹¨Ý “% `n*ÅAÈç á?f3{qñNÊÖÖîôËËyíõhe8‡ìF3æ³úm#Ü ôO‡¿ µß€ÚF«ãOÁQiqµÍ±²¾Že»—ËŠ#°œ(g,ÙÆxSáçÇ[¿‰…ï‚õ«Dÿ„’ÖM:_I±[Y¢ÇîÃ2õFo”z=¹Ðü+ðÏÃë;Óqá=vûÄ·VwÝéšV«`#G¼Ž'hÄrçž$`îÂæ¼OÁÿ<]¥øòËV}BÿQ¹7ÁçÓ¦™Ìw› L㜑Œq]?߃m|y C¨iZŸ‡tý*óí2ê²ÀR dC½ä~S§¹ÛxOâ¯Ã½{ã 7¶ßíìg}I¥‹][‡fV,qpÐä'S¸Ž”ÓþPÞ3üMû0è—_o4ëx{N±šýAÑ®.H¾·W`L µ˜dÏ¥AâÚGÆ:OÅBÔgÐü7§] >ÛJ’5*‘B6 Á9m¹<÷¯"ñ÷‡üC |LÕôýCÏŸ_MEñ:ƒºyKå}ÙR>µíß“áU϶xÒmr-½²ê׌Z5ÀD™ûÄ~T–ÝÔ™cÆ?¼eâ/Gãÿ‡±,–¾ o.-d»Ž7Yˆ"d(äoŒ²’8#³âOˆ|7Ö4/.‹áùþÃbúŽ®/­>ѼÒ/$VÁÏËÇ2xâ¼ö“½Ô¡ø¥qš`Ò`µ4u¶r#ûÀb+ƒßœ÷ÍwóiZ/Œ<ðûÅþ/ñZø'ÅQÛ´0\Ïln´­á`±JÊ+ÆWŸ¼)Úàc|VÓõOŽÚ† ñ«i–þ Ò|©jö÷6ºæœ[}¼Ò£Èo”HŒc>”õ西|ð-‡Å)l|yc®ZÛ_²Å¤›i#–Y,°,›¶–ù@Èë\Ü~!x—ÅúÆ£§x‹P°Ôà»kˆt4ˆ$n` ÐïÏzóíÂ>1_iZ-¥•ížµ h9ƒŒÉ¸ösŸA^߯kÿ 5OŒ÷RÉ£kjÑ_ .u[ ÅŠÎY6R‡$) “ƒÏ>´/îƒó1>"~ÏŠüLºÿ†%Ò´û zµ%Òµ+ô·¸µy”3¦Æä®âH>†µ1xµ‰Î’P`xN­ŸììÛúפx¿Ã¾ñw‡ü¨xë^»ðÏŒ.t”W[K´›¨ˆ†YFAW)¨¢ß1;•~)øw\ý¡tâ†4‹»û©"m/SÓm¾so,8+"/@ެ8­DºÓþü&±Óu¿ ý³WñâM7‡|FÛá„D  MÅÆs…®kã–¥?€ôx{º…ÂxelöNÕÌ-¨NîD²0S• ¨ON+CÃ!øçðj8õÝ~ÛJÔ¼;åÛkÚÔå´Rä›w~X@eõ§`f¯ôÛ|¼·ð÷†ìü>4½Iu+› š[mJP‚t',Z6©èâ¸ÿÙÆÒ]TñVµ®Ã,´ÑçƒWŠxÈBA¶(Tã/ÈôÚMuk£û;ü(Õ5M/ÄvzÖ­¬_¥…¥ö1žÖÅw»G? t«?u_¸ðV¹}}©¾¯o$ún¥s±^¡Õ>PVÎq‘C_p¯Ü»ðžoÏkâ¾Øj:OŒ_I¸ŽÕ5;ß´*¶Þˆ‚¨l‘Î+Áþkºí§ÄŸ^h¥×c½Š;xO%ض6±ƒg¶s^³ð¯à—‹~x±|aâ‹vÑ<=¢ÛI}s<QHgÚ¿,+µ,Ä}*×…¿i5ÿ„ÛNUðׇôÛ+×hޱi§¬WvbL§˜²IRÀ’y<ÒZü!êw tßxgã6´Þñ^ ³½Ó‹½)4¿:Ö5,K*Í‘òƒc¥xGÆÏ‰-Ô>-ø‚K›ûý[[“6\º,1§ã+†Ï}Õì_³—¨|)ø¡¯h> Òo M)ŽßS’Iퟔ‡ A 9éÏ5•ñ×â/ÃCñ/U³Õ¼ÿ -ݦËyµK{÷™•@1áN/ÝÉëjwÐomL¿ü4‹â®•áoÝx“EðŽµ¬iëöÛmbS¼• ƒ€êœ÷æ£ñß‹uÙçÃðw„5V·žê#ªê:Õž ^É!Údƒ”PõéÒ¹ÚêK¯iÚÒ¼rxwTÓ!“Gh—lqÀ/–N ° zêtËO Éð;£âdºµ»]Ü6.”Ü‹s€Ûƒ˜÷ƒÂ…¦«qyò¼AûNøâÊIVïÆ»Ì3Îëw6²ä'C©LŒ‘‘OðW„õßÙ§I×Ö.L~›Oûl÷Ó’ÃOš6\Ã'Ô@ê=ÝØy·…?h-oãU®±à dYisk–rCc{d†,ÜŒ2£ä‘µöãÔúמü1øCã)x¶ßÅzjkÅþ»£\Ü {½.i ¤±Hv²ªö?7¡§èžß?í©¡Zøºk?øFÞ]!o<•ÔägÉßû ôÆO^ëçߌú&©/Æ nNê’öãíQ_JÛ {wãp{(B¦1]®§û$kÏã9ôûOH]%¯ hÏx>Ñ%»ÅŒ– Û¾hø·ö‹Ô<9ã ¼9¡›ko iAtë¶Z,²„ó¶N2¹ b’×mÞšžŸÅÏ |ð_„4_]jzŽ«ýš=µ¸°“û£"–ùHÀ$œœW˜~Ôþ:oøÁzž‹$¯á+¸¥d•ÆÖûR±޹8*¸ÀúÕŒÿ|Gñ/T±ñ¯‡ô»½f-NÑ>Ý ±óM¥Ä`+ÏÜnO½[Òå·ø-ðËKÑ|Y£Újº®½¨ÖÑõ•>V €‚FP <’>”´OMÆÛkSköEñÌžðÿ‹åÖî’ßÂö+âîé‰Ü1Ûå¯Só/'ƒÖ½/Ç?´kŸ†$Ö|ªA¬jv1*”·RÕ]¶ùÌ àÈÏn•âþ4Ö4ψ ¯¬üg›‹|—·úM„%é\mó•I,v‘ü«˜ýŸ4ùì"èQ]ê7úÝÕÂÚÉa<­(pçh`§º’ð5ö²ê:mήúzjvp¹‰âYоGlnÜO¶+æï„ÚåÔF­á êËÄ-opºÛïÄËo1F º/¼ ÏÊÜŽ{WÎ0Üê–ž'Iâ󆽨eÀýïÚ7ôúî↯ñ}bñÇí7âØ¼]¨E£O Ž›o3A ´¶¨Ä;ImÃ9$~õ€¼AgñÀzN¿,†â-ò F%$WOq¹N=»×‚|FøkàMÆ:Þ¯â[½]òa¸Ömí,ÖkkiÝWwÏ‘‚Xž;`×ûBøRм_aáí&[+ÃÚ=„1iIm3*Ë(o7 ÅŽr} _F$Ú=ûãwÅ6øh4m.ÂÒÒûYÔ›ÎÙu»dpƒÇœ°#ð5¡ð§âþ9±¿µ¿²²¶Õ-ˆ.×~ÝŒ88p9çB=kÁôëã/Âm+RÕµ«}UÐ/ÞÆ×ZÕ¤`—p‘¿Ë/É,¬xú×E®ÞÞ|øw«ÙßAuâ ná,Åõ‹4°Ú‡o™”a‰ãœ``Ð’jû¹ïþ!ž×BÒ¯u;鼋+8ysÆßíqŠó_|r°ñuý…­Æ‡>“ ÃíŠþâåg$\uä×%¤xšûâ&/„u­J]Bß[·6ñÝ o.åG˜ò #%9ê0zä<3ðÆM­ix¢ôÿ içÝ_[ÝÆçËOŸ µ‰ÜqÇÏjVKq)6ô>¦ºÓ[Ìr~rqÎ1ë×üó^}â¿‹¾øyâÒ5‹ù–ò0E‚FA‘ÐãÛ½y=ï탮Gâ;—¶ÓtûÎarÆÞi‹pþ ybZå¾,|<Öu¯O­ip^ꚸSP·ÔÖ•%ÚÅò¼ŒÚ‹%¹\Ï¡õ]¦¥¹¥ZêmȺ³¹O:ÔòÈzïíÚ©kZöûû¸ìtø˜+ÝL~@IÇJñ‹ŸZþÏžð燂]kwÓ+^MјÛ!và•û§žN}+—ø»ã–ø­ð¾ËYÒãk(4ëæ‹SÓËî*X*C€2½GN9£—¯@sì} ¡xËOñ‘«[jInÃÌX[%7w ~=kQîæ—…’GÉÚcžyç5ò‡ìÍ4úwˆµíeç[}NÓžKù$û­Ÿõh=\Hö ^ÉáÏŽ¾ñœÒéz0ºMyíå{%½‹bI*©!w<œtÅ·ÕújzišÞRÑù–ï)å£Y#Žã9éÚ ¼³³•ÄSéöSîûÍ$(ÿ™#Ú¾ŸVÔ—\’ùæ™5ApdfÉÞ% ŸÏ=«ìññOCðØ´·ñ>¥‘­½´RÏg&ìÄÌ ¶x#׎1øRqO`RînIàÝ錡é²î8­øâª7ß J¥dðýªz8JüˆüëÃi‰z«ëÚMŽ“w=žš-æ+›i }¨¿ñ cÒ~Îõ {ÃÚ½®µw,°é²£ÿhÝ?ÊL-PA#ØûSåBLô+Ÿ†¾EWw–§§“u2që÷©"øo¢°ÂI©@Ù¨LŽÝÏZoŽÔ—§Š&){›?– W kñ€SÄVަÈUîâ†@Ãäy€ê{ ý)…Ê0|BðáP]²œó1B?/ñ/ ½~Ùà´ïüs^r|; Üüòèšqm»F,ÑG¦?Zoü!ÜÛ4‹pÉϲJ.ûŠéô=CþŸÄ8ñÚñŸüMz/‚ôO‹þ&²mU¼L|=áØ—tºÆ¯² uÈ,î; ùOU’O†RYx¯Ã¡­5 6u–4™žx&ù°UâWŽ•æÿi¿ˆ?µ9_ÅüóÙ#òí¢Px à)Ù¿´Kš]¡¼Iûhx³Ã^3Ö†‚EëÅ i üi¥1‘^]Çh!2ºÇçJ 'ï9°=𬠛¨ÍaëÚ¶¹¥],nÑXv'+÷²s“ÐmÏ|ñ[ƒ˜Í2CÇJöÙÿ]ŠÎ×]±vUv)2‚9a‚§ŸoOzñòxÒÚê·šßÚ¬¹r 2nÆài5q§c§ø©Ç⹄d‰q{“\è<ÕDyf昃<§szjµ³°U!+’ ƒÀ«Û´¤:Õë¥‹Ï™Ö qÖIáëô"ëö¶aãÓ2#k‰GÌêôΦ÷Ø«w':,VV¾eì†Ãå‰Féèµnñ¸BI‰ÆTž¸«vJu=B%ŸRy’Aºúe2¿Ú rkIF‘ukh¬%ˆ³F²Ž7c¿>´Ì׎*D< †Bx54|h`‡±â¹Ÿ1þË›Ý<×HÇŠæübátçà:HR8k´ó£Ð`_šiµ}<$c–}·Q;`wÂ+±ô O@kõ ¿1|>‚‰þ…¾höM*¡ä+‰m”0Þ î¹ë‡aÜ×éÕUm)Áz¿Æß¡­-\˜QEÈtQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@yí-ñz/*ðö½©µžmjpke¤M6én¹Ã‚T¨ë_Hürñõ‡| wuyek«½Û‹HôëÄÝäòCêϯJùî?ZüTøgâÃÞ°ðƱo$:¡Ó´„mº”1’® ’ë¸0‚«íä)YÈö¯ˆß.-þ ]ê:³i¯jB iu5›0;ü¢gV^„£-Ö¼sá§Ž5ïŒöZß|MªÜj)}kçé÷SÆÒê,º;ü6zšÊø- ºø›Pñ ¬Öþ·Òd‡T´¹…Ýï EdŸwÌl[žÕ<}àÏAðïGÕ4oI¥’WP»[`êfXH«íû€iî´Ø…®çÒR|Q¼ð¯ÀÃwâíçÔ´»gûÌw #.<$Œ±L’¯œ<ñ~_ˆ÷·žÕôíF“Ä“éðjš]šÛL“°ÊaÕX€§ë\Gìñu<¾<(¢ãF¾²žßW‰Û÷bÌ¡Þíé´… ú]ÿÃ_ø JÖïuø–ëÅ:þeuu¦è÷¶@yV3µƒdî* wÀ£N‚»µŽcáoÂOx_â.“«i—ÞµÒçûmΧ<%cŽ(Á/†èr×uu^ ø§àWâTÚø"ßÃ:Ž¡q j&{Ùµx.ŸUSp 6IKàÆ[9>æ°-¿j¿Œ…ÍÛÀú Ý|úsÀ¿%¹llÀ…=}j¯ˆ?f?7ŠäƒGÓÞ÷Dº¸ m¨ù¨ÂäÒÙR ó‘Ú‡æ5äcø§XñHøÃ¯Ëyqsiâ(ïdù-ŽBm9P£ mÚí^ñÀ>×¼^Ú¦£ãokúµŒ7:–%“J©$‘ƒ#‡RîûØ#‚iš—Å ãâÖøgFÖ Ñ•-¢Õo#cyt`7nÎÝ$gµqß<3¬ÅñZÕà³Ô5+[ˆÝÚßClÒ†IW„%FCòþÍV¶WbÓ[Ä?‰$ð7ĶðÆ{¢hZ,ZYج¬±ÜF) Û÷¸Åmx‹Â:¯Žõ|HÒ.4}?T¾ƒf£c©^-¢ÜÏòÙã Õ]Bç¦ -ÒøqµoøkÄÚ=æ©ã=3Iˆ\ê–7ÿfû(tŽA´ïdR£=yÅ`|}ÕgÑ>#h:ÑŠ;ôµ] Ȉ¨*àúȲO®A¡7¢wÅ>4Õ>ézôxln®ÌSÔMä uË9ʤ[¸ÚªÜ:‘U¾ øsļ%áßé:=ÅÆ±aišž›gÄ@ hæ…:`Ľױð߈>x2ˆzµî‹~s“ucn'šk À"à»iÎy5Kâ½ÀðOÃïXx;Qº“Ã7¾}ãjèÍ ·wA¶²È å6.R}Å ܽ§øS_ ¾ÅãÅ«êö¤&·ðî¬5·Ž%ØglÁ˜¶NhüLÒÿá(ø!¦Ëá}2 6ßN¼ûf¡£iò´û’E ’òYŽÒ0AèV7…t³ñ“á%Ä:ö±o¤Ýx{QU²×õi Òe%íݹc‚¡‡\gÞ·µ‹›¿€ß «¡kpjZþ³p¶?Û:syÐCcyÚYF‰cøO4Wáî·æü4×åñ´R?ø­±°IÝIvÓ#'–?…Æ‚{gµUÓ§ðWü*ïˆ|/ƒW¶×~ÉÛ“W•Q§ïý÷Wþ»¾*Ö—â KöˆðF­àýRòâ_[¢jºl—¥d(0Ê\»Y°[¡Ç5[Àž×¾ kÇ)Òm¬“K±h,¡Žd•/§—÷akS'=i;_]Ál’9ï€7-¨øŠÓD“mï‡õ-.òr&|$6ã-æ±<RªËõÒü5ð'€´ÜëÞñ{xËXÒlno¬4ilM¼’LˆJ¾IÃmûØH«>øŠ>#èú‡… øZÿÄú}Žþh-™î#`ˇº¾ükø#ðïÄÚ'ÄÍ"óQÒõo 2V¼¹¿»¶híá†0L‹.+‘œç¥'ýá¯#+áßÇ/[xßKmKTÔ|A¦]܈/4™¥i#¹ŽS±Ð!ï†8ô8¯Vð‡ìä<9ñ òÞßÄ¥¤=ϔ֢ìý¾Þ ùÚc ûFÜf³<ñá>£ñ6ÖkIáýVk©ާ-ÛKn“¾ááFâ;f¼çÂvºž—ñUÓõh;|&ÔôKm×FñŸ4zµ¾™¤Z#ÔW$SP Š#“éMøOáÛ߇^Õ¼Uâ{Ý*ÎÊÒâ ËØü±x²/–¶ûdîcœŽ´;_]Ál‘Æüñîµã˜<%ww}®øwÄVoe{ks)#1–2Œœ.ìŽÂºo†?4íÆqkrx»AñmŽ×Ϧé33]NbRU|¶¸ÆjßüKá}qµ]Â~¶ð_Œ5a¦ÞÁz÷*䌘b|·uVÁôåáÖâv‘ŒM¾¸·1¬I*( ¾g¢„ œúSzî4:ö²ñÅ¿ŠíïµQï4F¹ßq¦2.Ï!ÍœdaOÖ¶µû0xÊjQøjÚÚÿÃú›«ZßÉwÉC èÄ8 6â´­4ïšÅè¾Ï}¬Å;êÙ[iãû:I<Îìeb-޽«Çþ"x‹Ä‰ñ+^¼Õng²×a¿‘¥ò¤ Dêß.Üv {bo®ƒÒÚž±ñã<ñ,^²Ð4?iÞ¶‹M7zÝži¤@ï<…Ýj¯ñ+Ãú¶·ãÇ–š%æ³áýbÎ)$‚8qbê¡&U*‘•‚ ]ñçÃïx£_ÒüE«x»Lðw‰5K {ëýPœ™~g,¤m €H<òjçÄêÞø—£xSMÕît}ÆÂ6Ym¦òÓQg]þa`yRN=±M+’üɼsâ_ øSÁŸã/·‰&¼šKë--Ic¬|ðÕï„´ÿìo Ú^Ⱥ†˜e2¼w.3Ò99p@e é]Ä?^|mðþ•â ›(5½>VÒîæÔn„1ÝÇ€ñ¸vàºî Æ–çQÕÿgφúe‚=ñ'ˆn‚ï,—V‘[Fq’~ë\}/̯Èâþ Áf|ãÈüRd6ð4ÏQy¼y&xó6îÏ·Zêü#á­áøuªêÚŽ±-«G%­³>Ée‡oÞm¤è9­Ïiº·Å¯‡º†ƒ .·§Ê5+Hl Xð²D(¸°r§ð®áÃß|2ÖµOø¯L½Ð´}'O˜ÉÚšùä_--ÆAÈbÃ>„sõ­]>'iZLk6©eª–Óï,$‘š9mäRNÑógýšô/ |ð¶©ã>Ñ%þÙ;ncäl'`·ÆbÙþÎÜ~9¥mue=è^,ø¡{ðq´Ÿ‡Þ[ È4kAöéõE¸ó®_ç“fáò¨-Æ;V´kãß„<9âÝ M–ÿU°FÒõM*Â?–¿2KvVÅY×¼9áßøSÀúÏ ñ^¥çéÚü gÄq„x®1¹*9#ÐÖ?…¿g/Â]§¦¯§É¤é\ .uQ*Ž4;‹.9;p8êFiJWw`—c‹½×õÅšÝÝãËŠ>Ôé! ù‰6ÿ›ùjöŠÞð^©â‘{â?/ƒüOwiú–˜¶Fxã£Îå#žJöªº—í'¤·Žæ½ÿ„B¿²KÏ1/ç·ð¨ly›ñËw…r_|©ÿÂμ»”^jZ.©*ßÁ«GºIo Ü9åǰ¦üÅèuµ­%£M67CéÖîû£…È?1ÇcÓšæ~0_Øj_|?† 6ŠI¢{I|°]îË›ø‰ Ñ«Vè½¾“wû9ü>¾Öíu+;ÿëWÂÖûN: hWÇ$csÄvKÂ?5ßú·¼K~næÔíÙôÛ•@ž]Ì8 ´r¬>•³àýA“áw‰-u›É#ð¦!–KÕ!.³òTpnr9ãª~Ó¼#áO xÇ\ð­{âÛiû^Ûù2YÂìIó–«Aé¹GÀÐͼÚl„Œ.öÿV£‘¿Ÿ–äúOÅ/x—Mñ–µpßë}õÇÛb½‚‘.UÆä%€Á 61Ú½ ÅÞ🇼áŸèø«ÄVzh’i!º0=š9Þnæ!p9èEs>øùâû?jhz¥Î…¥ØÍöK{PkÈ :œsZþ,øe­ü\MÇžµG“R´V¿·žu‡mÄgc÷cr¶ÞÔu×QôÐÉøÉo«ü6ðUï†í̓á3Aö<堻ݖóOñ1î=Þøs4Zÿ¯ËâÉfÂi)$äfE¹6y9êØëìGcOÔµ«ÙãÁvÚ2AkuâMj鯯-®Ô\Akû¥Ž ܧ¿µ–£«|løCt¶Údv:–™v/!³Ó 1Cx˜ÚûS.8<J6^BÜÓð¼žð·üKuà}BûV× ÓÌG¨À#–'é´rB±ú­x·Ã/ë:O´9ìZãQšK¤„ÙX‹•íhÏÔ1ç·Zôß…¾Ö<7®Eâ}zÒ÷BÒt{In/ Ä œ2ì€À¸‘ø “á·ÅÍã‹ôÿYxkU¸w‚ÏV éo#©T%í$ ær)ßùX/2¾±û>ønãÇ׺u¯t›HÙQ¦¶Zæ5-ÌjAÁ`2áY_þ.ë¾ñ½Ö¡Ý]èZ.‘¶Â n0ãêÇ®~•Ã3jñ· à”øŸÎkE\æGb‡¹ÎûÕëŸ-<³aŽ'Õ[ÅÑiÖɨK£íò¼Ðƒ!ÃwÁÅ%§Â=Ö¥øQøã¢èÞ.ÒšÔe evo¦¬Þ_ cÁ<àûƒéO´·¼ýž| +\Ii'‰µû¤@ð[Åœœ•›-œP+#ã&°ºtž ƒLá·ÓM()ܲ÷Ëç‚ẃܚ“Â17ĆúúøªüiÚ]•ìSZëÞL¬0ñ*ñ¸· tÈ¢ÝCs¢‡Çücðö³àëf6úŒÐ}® ã…-£¹’.|³v#=I®'á¯ÂCã2ïUÓ5éÚ|¢òëQ¸ˆÆ"Hþr›ÞºCÑþø/Å^'ðu5‚;Hf‚#±Y åI<ã7`ï\wÃoŠšòxÃN²Õ¯ïõÝ"ùþÅsa4†]é/ÊJƒüC9JZz ü-ïÞxÕµ‰ü§Í÷ššf2Ÿ>ií¸pF+Ͼ4é:•—Ä}^kɤ¿K¹>Õoz•šBÓŒ{Wqÿ ݬ&¿>™o¬hòé_jÚ%ûjùÑÇ»êñ’Øíôõ¤ñ§Ç}WÃ^)ŸCðÓ;ÃúfÛ(`’ ïû°³g©8çÖŸ¦„ëÔž 3F¶ðƒtÙßj:´ÂK›+m=ÂOklø($' À-ƒÓ"©|F»ÒíþÚYø1d‹@]NA©,Îv˜°ÈÀFn>µgÇÚˆ~%ǦøÇÃ)w¨Ü]Ú›J;få022~ë8ÅAáû6ø3ðßS¾ñŸ«kw+o‡zŒG –E瓸ì=ééóºœ×À˜&Ôuý[M”ÐntÙŽ¦Îp‘ƪJ¾¼}Mv¿ ¼/àË/Ãu¥x–_ÜÚ¤“[irÚù^t¡ PXœ8Ç5WIñ”^;ð׉<7£èvÔn¬ÅÄ_Ù«·í¢>Z6÷#'zá¾x{[¿ñÆ— œ3ÙÈ%=ÄѰ"òÎÀö?\â•­¸:WµM[W¹¿—P¼‹SkÃ+'˜DqŽr¸ÏNœc¨®ÇÅ n5}[Oñ ®³¦xv÷W²Žæ{-FcoeÉqÁàðy¨ï¼OðÛþ‹Û£ ^Ë"ޒבܕŠR–1ƒ¾£¿ã\Ç9/åø‘©I"K¸’ÑãŒÀGÉ·¶1Ç•NýIZŒõëïƒ^Ѽ9¡jê7;õíZÜenY¸ŽTÿ]géÖ±ñ¯ÃZ¦};]ë`_ÙI€‚@VFÇø'Ö­iÚFª|Ðfñž¡>“]ÌšTÖñ‰&x8ÎT»»v>”ûèt¿|$Õn<6«ý£x–÷º›ÇåI @¨2=ÇzmäWq¿>_øGWø²Òm6ÃHF»B²§ïFTd1=zNüÓôïÚkXMVueeý™ç Ûc"E=sžHµÏüñ6£{ã;=ãÎÔôýI^Ò{Y²ùENæäàm9ö­­'à.wâx­O‹´«›%Ÿ÷¶°³¾ç¦ìqœã¯4m¶¡êrß|®Ûxªþk{+Ý^ÒêO´C}*ʯó@ëÏJôÍ/ÇÒ|ðv…¢ßÀúޝ:=Ä–æ@¿dFlªg‘éêO¥rž øÍª[x“SûÝÞ•em/‘k¦Û‰'Ê7dg j¬uO _ý“O›P€ýž[XDEå^B6 º…ìz†~!i¾(T–Ö ¨ãg*²J +à½? ùwÇz•ï‹uY5-Éz³²ºdü˜8{b½çány§Ùi÷Öé³FJHf…‘B¯WÎ1Œ{ÿ:«%ÿ‡|yã-a"𥖡oo&Ïí ©XI&8ÁÇÓ¼ÐÞ¶5|ãh´Ïx}üArúUp¥Xµâeúõ¦ ôï Ýå‚KŸº1^ƒ§9œ‚ˆqêO§·s^má§*Þ­z” €rtÝœŒÓ×s¥ŽeÙû’ÇåÛò¯cŒW¯£Ø0f ó×[n²¡Rø#¸ý9®[ÄR#øÒÁvå1†,1ÎúÍìh·GÝŸ mÒÛÀš2¨ÿ–9ÏÔ’Zë3ÀþµÍü;x'Gcýk¢šÎ*È%¸îÔÒißÃLŸ|Z·>..$À' Ï¿oÆ£šBf$ r@ŸJrÈ_ç-´·QŸOoðªäîܸPÝr8ÿzS$òoÚ'ÅMgáû=~Þtÿ981€}‹è&½“Á7B_ i Ð}ŠKäýÁÀÅyn»ð&ëân«}¯·‰mlekU´’ÚFdXÎÞãžOã^µáÍ)ô}&ÆÕ¤Vx Žeä«·#Øâœšµ‘)>kœ·Æé>+ø©Á­êivñí5 Wp¶‘O ‚r R'w°¯ ðO€¤ð_‡¼A®xYÆþ#‘#Óí_F¶“̱Y /)F²BàÓ&½wöŽðþ§âφ·–ºI’[‹ic¹’Ò,×*¹@’2ÊÒÿÁ-ô=gGý næ¹·»Ó-Ž•snâbmd–G‰ü´Œ¾>|‚AíN6k}E=Ö‡‘hw¾4ñáÖ¾üA¹¿ {hg±›UR†Îæ?š6b@·*sëëQü;øa­ü“Tñ®¶l¦²Ò,ÞXO¾K´NÇb#l$…ËdçWêoÆÏY|EÒ®ü9¨«.§ªøwJ³º³Ô®£{ôA¬E̳säÇ\ñ\­Ïì]ðÃá¿'ÕtV“L—J†ÚçÃV2™|ã%ç”Ó8•K2*€Äc©ÈÀ­d•Åh·có{Áîþ$ÿjv:6ˆÚõ¤–Pjze’[H“7(®Ê2ÈÄm úÖÂoƒÞ(ðÇ‹í5jÇUðÄzDÂõµ mÊÛùQäÉóžT|×è_‰ÿb¿Yëþ.ñ;¡â×5+2Î5‰l Ž9¼¿)aÀ;°X‚¼)ÛÅv^<ø-¦üQÓõŸ‡ÚV‹má´ÝetÛ}L‰ÜZíQ'Úrq'œ¬YsŒ1F±ÖÖCäM´ÝÏÍüIð©ñ ‡ƒbðÆ«}$ÑYk+xï¼Ò+vˆü£,ÑÓKK_´Éuf®fT$ w9äPoˆ×þ;xoÃ4ðæ‘6£wmntOGÓ¢%lÞ"Y4í«ô«‡W²øSðªÓLñ·†—^—WÔêÓÃú‹4 e i°Ìqó+;g¸ñST¹ð†ü ¢øG[¸‹Ã÷1Kwý·líÛ.¼Â¿iùv£i'榶ðÖ¡ñ—á“/‰5[}ÄÔ>DZ®JR;¨eRþK> ,¤<5-¿È:”ð*€3ÔV+&©û5|8kÍ'R´¼×¼C}䮩`Â{h­á\”ŒbÙÁ*-;ÄZÿí/àW÷….¼Y¤Êšžžñ*À—ŸÝËã n1ÇÖŽƒê™rùü3kðwų|9mFK¸ÒÞ=EõVAuo`Îr`)}»\Jåg¹ç×õÍwÃ:›IqáSJ›ûJI¥m–kÜ—= ¶>½+·ð®‰¬üð®±âéfðÛ>-*eŒÁ$¼ûs½@œšË𗎬~(è^+ðŽ•á#Âî©`^Ò]&=Ÿmx˜HmÛ##p Œ´zl ýMx_¾Ó5{@ñe·uÚ\j6Ù42G3(Q+nc¹W–Àã5Æ|0øåâSÆV:?‰umCÄžÖØ^iÒ¹“zL6nAŽKdcÒ—özð÷ˆ<=ñ*ûÝ:ïGÒ­-¦ŸQŸP·x£[uS½NáÉ?tù®¯á‰¾_|A„øS÷Ú‰f[…Ò®¯îüëD¸daÈNT’xôÍ ÿ(m¹Ÿ¢~ÉÚ¥¯ŽbKÝkI›Ãö—{æ’Îù^èÂŒN]w¸ÇcZ:'íQ¨jŸüëë-4hBð›e’Í<èÐ.eûÙÇ|äé^eðâßSÿ„ÌÛÛ´ñÝŽ '¶2œæWÄ9íž_Zôí{Àÿ'ø­yÏ‹/,nfÔ6ÜéqÚj%gãY{)$ŒöÉ£mµ×Èä~#~ÎÞ2oê2è:&¡¯è—ó›«=Exxäù†óž݃ôÍtÿ>#xOšŅõßéÞ:¿Ð¬!Óîõ{©ž9^d2\eT£5ÂüUø›ã /Šè•ö†öWFÞ{†H Ž>#AÁ@9ïšì¼uð‘~!ßé^-·×tO ßëöß]i:¼æ <ò6´ˆ0~W+»×š-óÚØ§ñ‚êæoˆZ'Œ-¢“PðÖ¯¦Eö&ËhŠ› €QC[Ç„aø[á(~)Ûj’ê3µÍÆ—–ËÍ­›7Ȳî©9 T¾)xà]æào j/cm¥ØÅ%ÕÁ\^O'ï ƒ#”ç¢ñ/ƒ5ÿÚ3Ã'tx’ÿÄQÓµ‹W™ ñüÉ4{È^Cr«íïO¦¢ëæf|fŸO¶øUà¤ðH¸‹À¦k†‘çâàßnäNG¶coµ'ÂÛKü ñ™ã-JMÃzmü7ë!™­n_!âDÎX2€Hc­uZžªg†š~‘¬hV¶¿­Ü©ô}Uð[ÇÊ€J–$ðAàVˆu©~7|š?è–úEÿ‡µus è±b+˜e|õŒ –VõàûQù}ÍI-~|"×u?øŽO^ÜMo§MªCÀÚ|LÁØÌNçÀÆ:Pü3ÔÐÓÈ£÷jÊ*›ˆ$ûVÃßÚO\ñŠ%µñSZI£ÞÄð\Kif‘O r|¥–E¸ÝŸ|WðþæŠþ‡Lµ‰íÞ¶Ô¢â)- 7žÎ{ ¹?P+Ð~øOáE¿Ä›6ÐüI¨kWèò›=öÐE Τ^o9âÄ:v9˜~|HмNt;}Í¥›Ók2ÛG,=Øó‹HppkoâÇ Ÿ]+øHñ<3$Ûw;–îçÊ ¦CŽ*q‘^`Ÿü[§xÚ]rMRõ5½3Ëhò·–X?1Î1ü8ÅzÄÙÿOÖümwy§ø«ÃþƒGxú£+GqbePÌ›@#±Ç4Ÿž£ë¡Î|W´¼_‹7šµÈ¦‘âŠúËT¸·2*[º‚ p¥1°ŒñŠîüIeáì¿ø{Æz}þ±âí­åÒææÞÕ›tB]Û²€zï\ßÄß~$øoâ©|á ë@Ð#]:;y#V32òÓ0aÕ‰ÈöÅhê^ ñ?ÆY¡s#©H†ìWimçŸàí_Â~ Ñ&¶°Å¹¸Ô`ÌžbýõVíŸÖª|ÔçñÆ]zëÄ—ǪyÎE›HÁ#`Ä`.„ZøÕðWGÕ¼wu¨ÛxÓAðýåük<ö«ºðdVPFÁÇ9¨Òû\¾‡ñŽÏPñfµ£øËJµºÔ4-WOb[xZAfÑÚ>]§‘ž¹­Û Ÿx?ྉgñI¸Öþö[½;L†SŬu¤-@bÊ*o¼w¬|¿Ñ¼ámFm2ËM±Wžî%íóH7´™ årN¦jž×ÿhéZõ©K¯éR¶Ÿz÷ˆRæ#—8]Ã@ÇZ}5ßB·ï4­Cà¡ µ›OÑíµ|ë6—2ù·Ù“#¿tàéXÿ³äj?ð–ÙjÄ/ƒdÒžMZ\ñ ÷NG™»8öÍuðÚßþÎÞÖ5}RÖÝüE¯Ï­–Ÿ#¥ÍºC Ò8RU‰'éõª:OŽnþ3øCÄÞK 7EÖ¥‰/톗n æKÂáz±#éMùl%æXøs¡xB¾ÕµŸë7Þ'ñŸ¦Ïqc§ßÚˆ0ÛpÎ?¾Ê¤œzó/‡ß'|:oˆV2Zx" ú[’¶º³Ý<‘Á#d$8‘ô'ŠKû£õ+ø“övÒæñõ凌ô]>ÞK݃M¹˜­Õº³ÝãHÎ>”ÿ|mñ'‡—§ÌׂòÝ£ûHuÚ°Ã ¸õôºÝp\üøe}{¥ëï®êÚ¥ÚYZßvÛÀÝ»•f=ý…Tð_‹“âbj^ Ô¼I«ë©«Û2[%ý²ÿ¢ÌƒzËæû ¯9)¾ã6~k¹¿·“Ãþÿ„WU¿†hl®íæŠYF*N<{f¾t6:¼*±Ç3x/<µy—íøÇ¾îs_Aü6øeâo]Ásâ+Í4xoOG¹™­'ŠâGXÁ`Š>ðÉ{ ¡¥~Ð> Ô5íb<4t±tOÙnvGz°îìÇœã¡æ‹v}Ç|NÒ>ÝxÂáÔ|)5­/O]´ –².Û„HPg œdç ö§§@ÛsEÐm¾%üÒçñ&±‚úN öv½èßçÆFæˆò aˆÁÏ¿â­a¾|3ºÔ´~oQÔ$LKý- [X@ƒqNÖb'9öEwkçé³G‹{Åól}£0ü¶× ðûàωìü[a}®i÷z“`ßm¸¿µcù¶©üÄŒ~gµ7¦âZž|²jsjÓÞ e]f;“#ÿÏC(lþ{«Ù>%ø/š§Š#¼ñ‰×Âþ º¶†[ûµó‘&(76A>£ÛÞ›¦üeÒ/üa.¤žÒcºóñ!Äáw}þ wæ¼ûâׇu=?Çz”“‰ï¢¼awÚÆÌ²Æãràãg…'ýᣭø±®]xsþÿ xzêâÏD²ÓÖ{{˜%)ö×~ZbGrsÇlâ¡ðµÿÅÿ‡º†£z©y¢Ý$¶º¦¡&# ÃÄîÝVðð÷…¾xGMñÕæ£©{¨`³—É–ÎÝÈ(¬Ýò9ÁéœU/ÞXIð’Ê?ÛKgáøµŒS>ùüÖÆÒàŒÛO[ySK¾ ÿ…M£êÞ-ÔçÓõ‹«8|6;9I~S#ñÆ:îOjÎðGÆŸë~ ‹LÖ.ßPÒnÕ ºTˆ+"2íÝ•§kàLR^kšÅ•ÀQ O¦ÊÚ“É÷c@>GínÀSé]Ãm Àún½o.â½rý—ÚeŰ„O2!1å¿‹ ‚h^BµŽaþøºË\»°µÓdº³YÊAzJ2nÀfç zäv5¹ã¯‰:w‚õ+o YhÚg‰ Ò-ãµ’÷T‹Ìw}à¤ô\ö¯3¼ñÆ¿>µsª¾¥uéœÌéæ°U`zmÎ01ŒW¤xÛájx¶ïO××WÓ$9ƒxIm¦€ìÚ¹¡ñDøw⛆Õõ‹ý7[(Ÿm[(ÁæíŠœÖ±>2jŸeÕ´M#Mc‡l¬PiÍ|²©ûÎHêIëîO­gk¾¾±ñ®¢oíµ Ý9ØÜÅw æ_œŽé]ÿŒ¯|;àíÃú¿ G®_à \R‚Éä&AÏÔg®i«=bKÚÌõߨŸMðÄ/‡$Ñ|qc¢kmo¨Âtøµ¨µ˜3+nXžÔätßÒ½ZøyðC¾?ðñ‚? è×Ñ^{ ¾µ~-š7È.mñ “·÷ƒqzäyìí¬Yk¾,ð,þ°‹FѬ5i ý›Ëv6Êc%žÛ3`ú¯|vGãµÒ^þÕWÒÏx—zwöb ÉZêæáL^IÈ:¬½p0ÃŽÙr§«Üèæ²Lú¶/ÿ ~Ým:ÚÏóFñü@°h$¦Ä ‘é“^8có࿉Ú4zf¦Ñø#[¼[b†ÿOº½I˜3lCÂ6/Šg§¦~»ðwƒ~)ü ð^…¯k]èÖöv“[ãÅútnŒ©„š5eêFÂxèrFkçßÛÛÅW^ðWƒüclÿ٥î¡,zk¾!E[‹BXŸ˜îŒàj9uêm%jí¡Ò|pýu/xUÖü0¾&šãI€Ü›{ÿ ÆÖò¢œ±kˆîd …ÉÎÜqÚ¼;á‡Â‹ŸÚÀÓk:‹ø~_ܬbDÒ.®í'/ÎßôxÜ©g‘_fx/Ã6ú§ÂO‡Ðj~kæÖ4¸­EÄžy Îг MÊ—$)9#$ â¹?ƒß Wàׂ£ðíݲÙê:…ååÛÉ}e¯ió”BBdÛeYvÙÆW4¾`tâå}þ_¡ò¯ŽlSàþ»¤Cueâ/KÄ¢Æ «v€ãzÜC#‘÷sÓµužÓ"{ä’çp…`‡¯¥pÞ2ñ†©¯þÑZ—‡µ}RïÄ:E­ÄɧÛÜÞÜ^Cfvݸ@¿/%€=3Ò½IO%–(J»PNp§œsß§aÇZ§ª9ôLÄøúÑ/ƒäÍƸÆ×üõ¯.ø]ðãGÖüâ~ëÏûvš‹ä…a°î$Àƒúb»ïò7ü"–2fh׸ ôíXÿ‰_ƒ¥I0Jç…j4O|kðχ´k‘}ŒÏs=Äg÷{€(?Åߥ}6 ‰¸»m«ç [ÁÞ Ð¿iùn¾ø~òÇÂÐn <Àì‹jpÛŽGï° z>¥âƹ˜Å§¡šSÁs÷GÓÖ¢ú²ùZŠ:mkÅ né ?y«’ºÕoõÂëbgþZ¼­XøUµ)í¥¹–Yå1–œÉÑ_{ z êŸì¶PSÌ”Œ$1Œ»~¾-‡eÏøÁ¡+ÀÅÚ¡‘®­Ã ÁOɸœö$’=ˆ®ËÂÑìñƒ—§üK5üïSü+?öÔîuoÛÜ^É,·snÊû˜T(Ï|à+OÂùÿ„«Âc¨E÷þ—-KZ¢ ïÌίÆ/e½Ò>lj»½ò2+¨ðƒïðý®y b¼ËÄzsßüA¸t+B3ï†"½CÂÑ4ˆÐŒ'ŠÐ„îPß1¯7ø­)½¸ÒôÀ™Íô®{GÆÀ)þñ‘áê0W â½ ç9í^eñ ùÞ0ÓDgy‡MºóBóåïšßfïMÞ\˜Ï]ކ·¡¤ïÙ?ËOÄŠŸ ŽÃàêîø—á!ÿQ+sÿŠý¯ÏÏ‚œüRð˜<ÿ§Åüëô¸§¹ÕO`¢Š+3P¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯Ÿ¿n%ÏÀ¹[8Ù©Ú6q‘÷ˆçó¯ kÃlû7ºø«Hª ÛÝÚJäœ`yè¹üØSC[Ÿž þPËœ}:R[ÉÂOÌÇ¥ÄUØŒ•<€\úÒ³° ¬û½ŸJd–¼ë¦¦¹ÝþŸ1#`€zúVâ[˜£%C>yàž+ÂQíW*6 ½sžãäLýúõ¿-ãÁnJýåÙ§zCZ#Ï>=ø·QðOÃ=GPÓCxdйŒsk¸\÷ö±5óç߈>%ø®u?kºååì×¶Æm2òy K˜²êI„a¹OÔúÕt©~$x1$—KµºÓu›@Ïk%èWòÛœ0Ú0zt<+žðìáiðÿQ¸¾Ñt ¥º¸‹Èv“QŠp©œ¹aŒ3ô«æqV3”yšhðï ø3ÅŸ .µø®áZ=*Ѥ·ŽÚ÷Î7¶0Øè ¶N}lxö¶ñÏŽ5«½*ûÄ¢jú•œ–v:僼J~dFpßqŠ…#ß5ôWˆ|wªh—š~¡áíBâÊæ†THÄ™SÇð“ÏÀW‰øöc±ðŠáÕšMoQx„0ÞémG#ò3œqÀæš«.¬NèsÞñçÇ ï4/kž$Ò¼{<šŽ½ý¢î`¸ óÊYÎw6€p~n3šô þ âoˆ¶…áÙ®n´–´¹ ¤j p®åU…»N ƒ"ƒ†$ ô5ÖjšU•ö›sg¨ÄÍeqÅ4sDê 0 õ®+æ¿þË·šoŠí./5›ÝÚàLVÝŸÎuS•mœZj«ê-|'Y7í…ñƾ6¹ðüæÆÎûT¹´±žÆ×MŽÑí®|åe S¿qfî¾ÀWѾý¾tx|yý˜»¿]OP’K·„Ço7ÚØyÑ Ã"oUeaó$W:-¾Ø™™·äb@݆À=GÚ¾V¶øã? ü@u±ÓÚïGŽój-*l1náÜnÈÀëÇóªU/¸š’Øõ¯ˆ·—‹¯|I6•{¡Úh÷:oˆ.¯î’áâW¶ÆÜîl¿ ääïôÅ}#¢~ÛPxsÄ^ ±×uË=?ìš<ÖºÎqs"Ë,÷xÜavRʧqÎ3ë^;ªx'ÃÚž«ý^êa’Qw5¸ó2¸Ús׌ g5ò'ÆOëÚ_Äl\Aw©}¦àÜEy,ÂTs•ä :Û*šÝŽ\ÏS[ÄßïNñ߆Æ×­âëO¼½Kiäe%dFäb»2kÓ.~èž2Ñô[ÏÛÝÉâX´ø-®î,®| åxÃe€ÂçƒÅxOío¨éÿÄ1ˆ4Ä´‰4¨Ð‘Zªí 3ÜÀûÑÏÌõ!«+ØéüYñçà–¢x×NÒµ©tëA6¡&«h·H.%>aX·}ÕÇZ£ñ'DÖþ5i>ñ¿†ô»D›OìíGMÓ¡.,&‡ûˆ£å•ù®·Gø.ÿ<á}g[Ô.4ÍbÞÓì¢xá}ªÙXù,ù*A#<ñŠæ>2Ýjÿí¼3áß]éú}µ³Ý¶¡næ&½¸v"F85]Nê±Ó4ûÿ¶VöT–ÐÆU—bpõÅ7¾»‚Ñ+l\øiñŸÄž5ñ^ñv±w®h:ú6›,saš&a$Rr­ƒôÍ^ð—ìÉâÆ7úå͈ðö1»¹¼±½I$1Ä à ùƒ6Ð:q“W>ê?Ä7-àm/V°ñØnF–5{…–;aÚ‡Ævç5åŸ õíkJø…£.9nu‰¯V&‚By¹°èÃÜnÍîÐôý/ö®žçÇ‘^ê:Ž4¹n°×qÙ¨½†&$oõÞÎO½s7ß³ç‰äñž«`moÞÖIYôýlZ¼–×›ruåA–è^9|_ >_|Mh-<`Ò•ÔI} ÚŸ&›8+ž2GJóï|jñ¥¯u;Á©Þé¢Öÿ‰g˜DQ*6Ezc}c½ø“ñáý—‹Ž™®ø@x¶ÿM† ;½q.Ú'žXÑUòဠ|W ûA}±>%¶°Ò‹.þ/4›…\Gö]£ËEì6`©¢»ü›ÆZø×´MOGÑ Ö!Žý´ÍNëÈš $PXÁÈÉÈ繩> |eÖ¾êvžðɶ^ƒkœ¦þÑf3ÎFéç–8ŒQè ]ZËÂ~$ð—€mþ"I©Ûx²['ka£¢o…ɈO¼`rFb|d¾³ð¦à7Ay¥ðPK4W6òì–êà¹qó—J>!øÄ? Ñ|yá6mR[ëAk©YZ ­Ä?! ¤‘†Í]¾Ô­¾|2ðþ⯠Zx‹WÔneÔßGÕ>îÜc•vÚIúûQæ·Kt%‡Á6Þ8øD±xÄÖúm–•¨†ÑÆ©Mk'ÀO…¯†uØ5S_¿[C®éŠBZÃßå‚y íÿ ûU?ˆÚ’üIøEáí_ÃZ2éZN‹}-½÷‡ìP²DÒÉ8#’\ö§|3¹µ·øuãkßÚÎÞ ™ím`ÓáýÜÒ^+e<‚~éD''ßš?0ü…ðgŠüEñóÞ ð>¿©I©j@Õt«ë¢†X~ôr>8FV<ž‡Öø+ÁšÇÁï]øÃÅ0¿ö}šÊÖé'[‰[䌄ü¿7 ã¥s±^øE~øí¾Úê6š—nº Õ¦Y.>ÿçòJòîÛ»¾)ß4¿í…¸±kˆfðLš¼LÄâ²OûhÊÖžºÜ4Ðo€>9ÉãmVëš֙¢è±ø‚Ú]=um*ÉmçŠg\G¹‡T,\O…~øêÛÇúM”ºEö‹$WK!Õ$…–R6ËL¯ŒÈçž+»øiðûÁZ'ˆŸ_Ðü\¾2Ô´›[‹ë #ì O{·ZdÒŽxÜíd}˜à}*mòßêþ^üJ:­ÇÃøä„j™:êÝ828p|æ‹îïmÇ5æ_ÿµ|3ño[—Yc¨\IvÒ4¤·pIÊö(F+Òn?f‹Øüa¨h–Ú¾‹&…{u²8¤¿Xï-T·ÊLD}õS÷sÍ3ÅŸ´†¥¡x“SÒtˆ­ÛÃÚ^Û;ÛUwo(ÞìÃ#;IÀõKËA=µ.|P±øv×ú0ñÖ¡­Aâ¿ìØÌš\I ØîÄá†|ЛAÇ¥r¿õ·ÒuOYh¼^²Òâ—E’'8™IÌ’7û{ÁÈ=+cÅž×¼a☼s xvïÅñ5²ÜOmÎð¹ùd‹“Uí#Ò¶|K>•ðûIð×€æðÄ>2ÕK¨}“W”G&œ²á„ Ë›Œ‘ŸÖ…¾›ƒì̳a§ü^øG¥ê>%Öì¼/q¥ß½…ޝy2Ý#.÷‰‚œü­Ènœš›]Ôçø5ð‡NO ë¶úæ¯|ðÉâ- °X’,7”¬y IÉÏaÅe|n‚÷Äþð¶­a¥M£éº{Kcu ª1ûÃÂAÆJȽúj¿Âø4ý+á?‰dñÍ½ÛøRîòÝ,lí~K™ow<,x^×Eõ×p¶…ïkºïÇ_ðV½©M©jBí=+Q¼lùÅ÷’Gí+“œïZÞøa©ü{ïø–;6·Ñ­Þ[uÓï’>á†ÈÐì<['Ÿ4±1Ì_dÆ]ØŸºÈv°>¼w£}ÉEÿüz»ñO‰ÿ±uë=J‡YŠM<êºm‚[Ü@Ò)T;Ôgnâþµ¥üñ”^$M+ûP²¾–á-?´Ýż!_™¼Ìc‡>•Óü?ø}à;?Ǫé2‹ÅךT2ßZèÆÉ {©cRÈ7‚ã¾+‰Óþ<øÛDñM–«>³{yjÓ‰åÓžV0L…¾h¶zc€;qF¾ƒ~g¯øwÅ~ñ¯ÅëõÓ|õå¬ß½ñÚä†[‚Ÿ)vT;rدý¢l5KŠºäú«™Rð‹‹Y¶á avq´PkÖü+ðÏQøwñ>âûDÔ4–Ño˜H¶WË Ü ø`Êçg8¬Œ´gˆ4_êzF…öHôÝ5¾Ìc¼´Y¼ÉWï?ÍÓ“Ž; Jý {jSÕl¼*ß¼ Äy5H¼D¶lÛLÁ•,Ëf!0lô;ŒÖÆ+Û=?áß‚ì¼#-Éð{™æ7³Iy»çíÀÜöúUßxg^øÊº/|7¦Ïª5å¢ÛjV–Ü›[ˆþVáaÈ8«-sÁ_†Zg‰ômkVÖ/óûRå,âA°3Ê»OÔ½7·)øÂ?xÅz/ˆµ¦xM¸‚îÛZ¸ùÅà ÀêÁ”d¨=½êö‰£è¿ ¼âŸxoÄx·ZXVÆÞâÎÓÒS‡•ƒÉ:~5[Å:¬_>_ÚøcGƒDþÄÔîÿH°ù„ñ:…Y†~fÚpæ°~XKcsâmKW…áð½¾—"j‘Ì…VpØÆ3›w#Ó©ï®à¶Ð±ð§â†½â?Aáj7ºî‰®«i³[LÆVC ÂȃûÊpjþ‰û.k£Åöðß_i“hO¾ææÎõd›ÉBXâ1ón!zcƒZŸ î¼ «}7‚ôÍRßů§\e®­p²F$ÙÈ\¿Œã9ïõ¯ðV¯¬iž7Ò¯4±$úÊß!Ž#’e¶ 0ïœ~´4þÖ€šèz®µûWø€x²{›-5ôhîw[Á=š´Â Ü|ýC:ÖoÄ/†ºæµã;½AÓµ{@×cðÞAJ@•rQ±“•|;¾ø‰øÝ4ye»Ýq¥­¡u˜‚Ѭ¹Æ2q“Ó>ÕÎü^ø‰âm⣤鷷ް҈±´°¶™‘c‰ p:’9Ͻ=Dìô:/x‡HøYá xKÄÞ³ñv¯on×SÇ{!S`%mË •ç uÍPø…¯§‰| àßxwNŠÃ@Òîd¶ŸD·ŬùÜ÷`ÊxcÞ­kžºø×á¿øµ/´íWš³½þÔ›È[ƈíY£89Èàý*mGXÔfÏØizMͼž&Ög{»»ø€š |ˆˆHÁêy÷>Õ+úcõ4|+>›qàoj'Y¦ðƒÅsG–KÀÆ"'øÀÏÓ5›áIükáŸÜü9‹U&]8š«+DGç[> ø{©ü[Òôi÷–Z>£¨Zùw±ßÜý˜Ï$gg›0`9éÚ¯|OÕ~ÛxÖk_ØêZ¦·oPj†—:¤SJC„uõ=sô®#ãíÜ×^(Ò¼’±øtéÐb?"Ûíéþð9¯¦¤®ç{w«êŸ|7áÿ ÚߤÞ&ÖnÕî äÏpçjEnõ#©'Ú—Å:†©ñ·ÃºÎ„¦i5í ÖöÖ‚1qv:•‚F3ëY:_‡tÍgàÞ’|a«6…kc|bÒõŒË+î¥@½J)Æ9àçÒ¬ë·:g€~jš‡ƒµ{róV¼ŽÖÿY*R[tr§<©c“œòqéH£Sáæƒªø2üEâ]2ãEµÑ­Ú{µZBs)V8ä »9#=;Ö'ÃÏŒ¾¸ñ¬ð‡èþ»¼-mµf˜{fpT6Ç$€O½dü)ñ¥âoÞøCY¾¹ñ«ÛIls;J°8]âu-Óiž+KÁŸ³œ1ëö÷Ú¯Š4MGH±f¸¹µÓîK‰V1»`M½Èœð3CûÁs¨hwF·£j¾¼ÔuÃzÑ ¨n ¹l) “ÎsÞ½câ5×€¬¼Ii§ø²ËSÕ&×$øðÂÇPÐtÈtäÐ/ÿÓ4+Ìx~Re@9èAüM.‚6­ôíáç€üG®x_Z“Ä:ªB–¢áíŒ g¶ðIÉ< Šã>ø›]ŸÅÚmµÎ¬um>ùŭΙqxY§I>R·VÍu¿XÇý¯¯j‹%¦„‘ê0ÍqqòÂîH϶=ꆚÿ€ĤøkA¾Ó(Òã°;6 œ],{ºÈ ¸³Ö¨øïãˆ4ÿÝéÞ»:v‘§?Ù`¶h”çgÊ]³Ô“šóÝïW_œÍæk¥ÏÎúÏ47#×;«Ô¾%ø[Á7~*’]wÄ“hZì°Æ÷Ð[[ùñ ŠÇ#¿¨ö£m€Èño…5ÏŒ:~“âÍÊ]Böx>Í©B¬ªVhÎ7($pA;Ö•±¸ø9áÛÍ~Â)õ­]ã‚-èÇÿY"‚A'<~µñgW¸Ñ®|= x~y­4{8䱚 ›çæ‘Õ‰Î} «Ú>›7Å?j–:òZ>‡w´Õo˜ùcÌ xNþëÆzÞá¯jjör_êöׯ¡†Ô’ÕYFIÉϨ÷®ËÇž øWñ'â.‡ªÝkš~»¨j×+c%·Œ¥w–ÜDåC´öàĹUùòÝ—ä|]á]5ü}ðûP¶Ô/……¶•t¯o«^ÈŒàî‹Ôä`ûf¶´)¾hº¿ˆåÕà×î-¡ÚÇjå–&”ÈàóÐà}I©Iln§k]¢^=øc üWðf™á-OS¿“EÓ FÎ+Oh÷”¥PÑÆØãטüfðç…>#Þx7á!Ô§KÑuâ×GÒî.„(ŽÛ›i~w$QØg9<Ÿ”¼â=NâÎÚ]Bþkñ/ßV~OUâ£ðׂµŸ øƒR¶Š&Ÿç–·œJל`‚ÙãúRq‰~Óº>»ýªÛþÃ__®‡$1èšµŒIq¨øZm;ÎŽ<ü¯†êrƒÈÏJF%E09Þ‡Ö‘‰Ç“Þš‡Žhdû¼b‘FzR‘Ö„éT€k}êdŽ¢±ÆòB繜SÛ“Åb]YÏ?Š­&ûDooonH·Øåј°g  ‘H'$…À 5ñ‘@ëJ 'ÿ­IŸÊ˜ƒ<{ÒÇõ¥#ñ¤üMõäSJ8úS''Ò“ùÓ›94Þ”Ñ,Pyç¥V»Òb×®4­>bDW¥œgiÇuÏéšž¬i ?‰|6§§ö½©üŸ?Ò”¾TwGŒèž“\±MKÍ ßÞ]±ŒtUg'ê\þUÞhÞ´ÑíüÙvƪ2YŽ+7ÀÜ/ð÷ÃÖ––0Í}r3Émb]Éýã÷Æ8²}k¥·ÑžwYõ >Ñ û±Ž>ƒ¿ÔÖqZji'®„—ZÞ¡¯ÅionLv¶±yO*€U7«“ëMƒG‚ÉÀ2Lß~Y9f­@€.1aQÜàF~•¥»™¾§ŠþÑ ?á²½ì#Ÿ÷Åox_ŸøD£D½8ÿ¸Ò¹ÿÚ%±á}=G{èqÿ}Šè<*?â®ð ÏMóÿNOþ2ø‘tög«i{ë­CU’#³ýZ¶88ëάé‘ùvÄv.kÔWÈ´ømjFш˜Œ{³Ÿ|“úWšZ.ÛdÈç­4O[!Òp+Ì®ÂO¬x±å;umÕÏUŒZ[¸@{(i$lt˱êMzt™Û^Co}ýµe­k1A<6¦¢·mp›hV"êŒLWp©5ÓM~îo¥’üWù2&õHô¯k¿â¿…‡¥âŸË5÷õ| ðnø³áúùÏþ:kïšàžç]?„(¢ŠƒP¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯ý®ašÙëÅk\È>Èþ\(]¶­Ü%Ž<Oá^Á^WûMx¿WðOÂOPÐï_NÔh-–îV’!$ª¬Spe݃€H8Îzâ­ÏÍ+­KFãŠKèm% ~îY¶}ÁÇ4ø^ÞE"Ø.GcƒýkSÅ^—â=Ù»ñ|Q}z˷ι’Þg°ËE=†+…ºý—ôiv˜¼o­@§’&Ó ›žäWùÖ‹—©ç_á\ÜkP“¸¥îFx1GÆ>µ§w§Ìd‹pÀf 8ëÉýk–Ѽÿ ´KÏ'Å3ê°î7 ðü³JF'÷S£Ž­XWþ#YAð»]¾´Ý¾;›{g×±Û‡Çã&•µ½Ãeª*x+]¹‡Ãz4H^=¶¨£€@Èþ•ØEâÛèj\H2~n+Λâððõ½½¾¥ðŸ[Ó­`V7µ—åêx%sŽsIíày›z«§ö`mØ~?xWJ”Z×ô9œdž‡«§Ä-N8” ‰ íóu«ßõXz\8 ñ¸ó^SoñÏá|ò`ß]Ù?j[üOøo|B§‰Už7üÒŽTöBN]ÏTµsnP]I–ﺛyªÉ¯ZX\ÊÂGS$gx䌩ä×kâ?Þañ=›qÇï¶·‡[²²Ôb·rñ/Ÿ,LŒFŒàzŽ*m2Í¥ÿ„Œ).bÖ°ãu¼¯%‹7#xJJ Àæî3ð𦉓¥ØÃma%bJÙ$ä’[’O¹¬oˆß¬~#x}4F+˜áŽa43Ú4m$L8äŽAÁ¶lÜÆ£hÙ ÑìÒv`ü,øQ¤ü3²½‚ÔÞÝÉvêÒ]]njF02OÔÕω~µñÿ„o´K‡xĸ’ “ b —î¶2:ƒÏBkD+ö'ó­+/9,®Ð–à ã<}áIÂÚÜ¥.–<‹áÁþê£PÕ5+ Bê(Ú;VY `ÞÙë^™ã]?xSVЮod1^Û˜ƒù¥¶0ä7¸Üüé–óZø‹ZÓ[+-Î8%D—<õÇåWT¸•\JÑÈ£§™ 7ó(9kpæQÒÇÌ¿ ?g/iŸt{ÝZÞ; 9ÖæK¨.Ñ‹l9U]§#qg3_KËá 2;©¯“G±´¿?üL­­£YÑœX6ÍÎsTdÕY†Vàw N}ñ@ñ Û/ÊŒ¯÷·¸?£U{&ÈSŠÙ\|,ñ~•ãÓ“M¿7IyåE¨¤å9Ýľf1Žœ×Ô·ÿ<'â-cû[VҾݪ3£Mr’º Ý@Ë:Ç8çÖ·¶²±G.«ÝD¬ACWôï­¥ÌhÌæÙ˜ÚWp ‘C„ØÔâ|iñúÇR°ø±®.²êd’A%¼€mV·#÷e=€ãê {œ?íþ+øgÃω/®ô¯ÿfÅïiIçªÿªic ³h8>ž•ëšü–ÚLZZÜÇyyöf–ê—b”‘òg©AéÖµ’â i ûvƒº_䯒RÛŠzŸ%~Ð3êÿµøWIžïKÑ4ëk9`˜Æn]Éóeb§–ÝÆ;qZz'€uO¿t›‹›¡i­h³Édº¥ò´‹yÃb¹$¡ldúšú Æð÷`¶·ÖtÝ;VKmÆ#,®­nÒ=‡Ç7‡ô{ i¶šna•…¶BC À#’IåˆÉ$õ4í+ZÄÞ7½Ïñ3ë³Gí-´›ðþ#×/çÕíã>TPÄ£d)½G'yc‘ިǬø£ö‚ð6¥áýmšãÄú\‰©éR2–â3òKc žCkèˆ^Ó>!è?Ùµ×Ù<Ñq¶“!’'üÀ’@È8#Ö_ÆšWÃ+{ÈtÃ+ݲ™./PQ £äœzý){ÉZÀ¹o£¿ïíæÔ|Sµgiú ¡ˆÇ3ræ'¦r0q“Jëª*Öµ™ã|3âKOˆš!kíìý®{»›w Š?šBI·#ó]„|eð’÷â„Ö>¹Òu&½cg}5Ù{O<“åÈÑò‚ÄcŠúùmu6ëO½¹7—Q4"K‚Q†zù§@øã-;Z]<=¼<÷yšñ|‰&çï(a¼1P0àš9“ø†âã±åzäš¾“ñR}G{xšö/·—7ø#×'úŠö?‰^øªxÁ®ÑçNw‹â?»˜Iêv‘ß5×èŸ/~ Á¨xÂöþÏ^m&ÖI¬íl¡u>yùVY7BdœzéCµìÁ]«£„øQ¡ë’x·DÓì,ßBÔí®ÖY領dhàCºBì@c<ôï]U—‹þÝüM¶oì ûlê%¡¸{€ÖBC'Ë#Fy[€x¬¯ühñ.§¬ZZø›ÄªèwÅ­o4ù”— +”!z‚ÙöÅRÔfÏâl¡·‹û7í&©,ñà@‰ gp!{c­9YnJòá—Oøå¬cûgíRi:ÜpAôÆ1]wÆß |>Ô|Wֻ⋠kב½Ä6Ö_hÇ!ñʱ\d{Þ¥üX|EŸKÓô-ûI´e†;ÍFÅe»t È~l’¿…pþøŠˆ:ޱmc¨k:–.㸂”Gž2T €=1S¥îËZìZøÅ®Þx*çÃ^ðÝäö^´Ó’k;»IŠý¸ÉËÌÄw'·j±¦øzçãGÃK­WT¶Òõ-õ¬âÖ5y ÇuþQ|ΤŽyàÕíVÿþøsàÍÇš¾#ÕÄRÝ¥²ÎÖòéÐHÙHË’xÎLÖ'ÅRËZøiá;Ÿ [6Ÿáyæ†]9œ»ÁvNs#dî,§†4Õín„õ7§³ºøà›íwOÔ­/|K­] +{í2O6 8o›ÞÇùVo…¼{¯|lÓõkúº»¼ƒí:mÛn"ùö¹U†z÷æ©|"¶´¾ø}ã(#Ô®t½"-Sn•Ù5kÆ1¶ø£h¾ ³Ó¬µû¨¯/†³Ü,/.F¼`cÔpz÷¬O__|\ø¡ëZö{y-o4}*#²s¹&CG®ÁnÆ–­i¢ü;øO®ÞxS¹Õä¾»‡OÔµ'ŒÁ-¤xÜ©³9ˆëÓò®sà߈µOë·^Õnnõ]Z´–i ý™•K¤ÀŸ»´“ô®À7Zžáj~>µžãA’Þ;5°ºù&¾˜¸!Cuù@<ö$zS¼)â/ êþñm§€´ ü=â‰tÆÚn.Lí4æTˆ’pÛy=3øQé°ýGøà……Ž­m{«xŸG×4í3}ëÙé“—ša.a*3íU´ŸÚWÄ ¨I¨êád·'f‘ JGŸâ8 qÁÏZâ¾ø«X>+ðÚYÛ\}¦$&(4Ã#y•úãnIçWqàïƒ÷%¼ImH«Ø¬Û6_˜ÖLd!—¥x‚}*ÍäÔ'Ôáæs»Ê‡='WñÄzæ«ñ+YŠñît¹a˜ÛÇmm!E·8@ c9÷®¿ÅžƒÇÚf¯]ë6>Õ/-ü©?´ÉOµùVqŒõž)hµÜZ½ 5 Š<5®hÖÞÛLy4û­O‹)m!;–EEwÇõ« ´ô🀼Y©xºÒfÐ'Ž;?ì×î}Á—a<‚£<Ž›ªMY¼øàHðÝú¶­«Ju ½bÓçŽ@¹DŽ2x }3Ͻ]Iuï^Õ4=Rswâ-;ËÔ-gÔñµâsÀ¸&„7Ø·ámcÂ÷Þñ-Ÿ4;Äòéry_k¸óÙâV#Ô6ÑžùÅx·ÃyõX> hRhiæêßkA vn~`ßìíÎ}³^©ào‡:¿Ã«³âÿÀúmž“¢$ÈZâb»R?•¶OåÞ¢ð_Ǹ/dÚ÷þ]xöú¼U{eþ˜|û­wD·Ì‹.8RxÎ3ÓŠå>3xÇ^õ+q=Æ‘ ƒ-­µ­¬ÍG ( ·¦1Ísš¯€d„¡Û"Å{òiÞ´Òõ…Éñ,¯aáÄÔb6÷0 i’àœDPF7z-ר¯÷¼5ã­sãN‘«ø;^¾{»¹áûN1BMÌU±”ŒÕ|ñâ{-OÄ–o¤hšs Û›´íO˜*íbrÄcØfµ­-ü;àïø§RðEý汫ù o<×py2Ú[³rʽóŽHéŠà>x·Xµñ®—kæÝêvײ‹I¬Va*Iò°Á=@$çÚ›ó®ÇrŸc“ÄÚ³xOD{&»Ü.E°ûHMùß»æÇ9®â…5kOê7F;­NÒöOµÛêÂΓFÿ09Æ=«³¶ødÞ$“M_hßa7žYµYOÚBnåTc±ÇZoˆ>/kvž)Ô-tM¼= é[m¡°©v6ާ“õëJ×ÙX¶ãµ+Âð–—ã 2ãXÔÄr\Ç Sd³‰Û(„ƒŸÀúŸJÏñÞ«c«ü'Óäðµ£iÚ ½ó­ý¬Ž^Q3r#g{~?‹¼ªü^ÓôŸhVŸi¹ºŒÛ_Â]SÆp]wF3ŠŸG¶Ô>øFWÔ,à›]×.V(´ËÀ4…?‰×¡$ž=8£ÉÌÃø§F}}/ ¯‡žÅÆ¢Ìpª ­þð8ÇÔ×CàÁVšÌ7Z.¯y­jvjóÙØÝÀ#W•TIÇ8ê)WÅÃÇÚˆü-aac¤ê&¸û61Þ4ë×ÛÛ5Å|5ð^¿yã9£µºÓ’ÚUž{©")äF§,Üã·-Ã}ŒKkrj—‹êwQÞ<Æg_5€Ýœà®qŽØ¯JñǸ¼EªÙêßÛ:_‡.õKX®î4ýFBŒ£qã8®:Ó.žôíi´Ï ü+¹>¾›PƒP½Xïõ Ë™\¤xÀëÈêI£¦›ëqß¾ê>ÕÛÄž'¶û›£ÆnÐ U¼éq„Lxç'=xê=ããC¯Û=Ö…¦Ahe*×E¶hѲ ëƒÉïÍsÿõkíSÅK Ü4÷úv­Û\ÀîX*à·™Éãn:ÖÞ‡ðJÂã]·Y|Q¥ßY¤ß=¬ Lòÿ,Àõ8ÁüizÔÅ×|/®è~"ÔíåôÌdŽò+wu”7 ‚RJí|_q¡øCHðþ…â]#û{U‚ÜÍ&ÙŒfÕ\îTÊžzãžà×#â>#ÿ„ŠîM.þ]6Æ71ÁhƒåD^ÁïÅiøÁš·ÄxôÏè¶±Ì×ðm»„ʱ•• Va¸€sŒñU}5&݆xÃY´Õ>éMáÛCc¡Y^°¼²,YÖSÊ»žù矧¥]øq»Ô/œ¼rh­a*ê;þ錗èÁ°GÐÒÛ[ËðgÀî/à‚ës‚,f"Hà…2ð 9'Û#šm—Œ'ø…¡ë^Km.úXöÑéñ¬kpS–GsòçúЯòÜÙøk®øGJ¾‚ËMÔîïîT¹¶·¼ˆ.ù%~lc¯8ïŠò[Ä®­â›Ë˩淹2³¼i#(…ô ³àkZ׋´Û%µ¼Ó˜Ìîe”BªrÏÈÇtîq]‰¼aà6ñUä—–ô ʽÚ\3`à’ €zsëB}Šf¨Ó?´áñ]Ƨg£_ÝZ…¸¶½}¿hQ¸Ç#pò;Š·ñCÆ’øOÃzmž“q²âø´ÒßZ¸hÛoQ»ãúšóßwW7Þ+[Ù™³®`Ytý€ž€ÀǧҴü3casð¡›Äw/o§ïø—´ ºeÀýá\ñ´ž??JW³ÓpÝ_>"êz牲u›¹õž&òC“PIüÍ{¤{(ÊûÛ>¿×ž¸¯'ø3¦xbÊ]NãCÔ&¿½uXÝ®ÐFðÆy!@ê 'ýœw¯ZÓg 0˜'q ƒ“ÅD¯ÔÒ'ñÊvo gæ¸VrÝrI=?!_+HrÄ×Ô¿®”x-#Vå§MÃp<€zãüñ_-õcéUЇñ11ƒŠ–ÊÀ޵‚ƧŒ õЙµ§øŸQÓÊùR/|È t–?µ{^±Z>}c#ùâ‘}FjuLr*®esГâÅéáôëVÀÎC8þµ¥áÍyüIâ]2ñáKvóQ6£ÎsÏÖ¼¼Ë÷lb½À›]{M‹G*ä^õøY­6î®~x=vx[Jqlœþ³ŒžkÂ9ÿ„cJÜ0MºùV»{VKcI=E<ãÎýiÄæšH¦H§§Z¶•qéL`qŠb1|-­&¶o.#‰#A+((rd£~O«tŒñY>ðô^ÓE¼rÅ4™e0ÆUP“ÂsÔ…“êÆµ›å'Ö’¸h RFàŠN£¥0©@ÈâóÞu÷¦„œó@‘Ö6Œ1± W<:3HH$ÐW׊bëI’@⤖ÎJ |dab,sÒ—šR´ÑÍ0[‘ŠwéM'…Î=sH@ÙÜsMAëÎEc½Q#sSé#wŠ<4=u[æj<ú ›Glx¯ÃXàÿiFGà¥ìÂ?9?…Ñ"xDØ»sn 8êwë× þuË|3Èð‡ýìÐ×R:zӎȧ¸ïJ¯wÄmÏj±žj¥ëb>ƨODxíÿñ"ÒSÖþýWKá\ŸxXg?ñ!º?ùR–¹Ú.`ºn‚;½êÈ×eàøËx¿ÂòÇöëøÿhÌ‘œµ’.—ÂÏo}râ]4Ýߺ ŸÃÒ«/à7½N§5B'¼³Jþx@sÿ Ë>ŸõÉ+Ôæûµåš?? ¼!œÿÈ2ÓÿD­oàËÕ~LÎ_þ»©û4D²üfððuWP'l0Ï" ?¯º«ãÙKÁúž«ñ&r(ÕtÍ&73ÌíÍ$nˆª;žIôzä€~Ï®îvSVˆQEEPEPEPEPEPEPEPEPEPEPEPEP^?û[.ÿÙûÄãý»#ϵ콂¼ö°Èø⢸Ȥdãþ^¡¦†·??ãž3¸ÊÞÉŒTë:°`êw©ÎC'¶xªRn‰“c°áˆ<Ý,Ui/š=ªÑ²ä÷<ÿ/ò*‘B=v奟PÙ(äÑ®W#9àŒŸíw®GÔ è:w8e¶ˆöô®*õØjœ€7é—j2OË÷1È>ÿ¥p'íCáû{kH.–â'‚4FÚ¨I ×pôªårØždµg¿Gª^ÆùK‡ ÁáØ?:¶ÚýíÀýó´èxÄä±ýz׋ÁûOø>vÞâ= ä´yÏÓÖŒ´'ƒ®6íÔ¶ó»îùRörì?iç£Ko¥_·z—r$Íaçß,™ª:Çï<5h/3(n4øW!†GÜÅ`Y|dð}ØRºÕ—<ñ2£~¸®>%xwUhöê¶%–5÷s¨ÎÑ€zòk' '¶†ªqåzêsw?¾Ý/ï|§®Fso$ðàÿÀdúV-ÿìÛð¢ï>V‹}a¸à5®¥:cØn,?z9Ö4«”ÛÔRduY7üª¥Åý˜au‡ úr*¬×B.žçž§ì³ðû`6z¿‹4ùF‹WÇäb þËö°ÌßÙÿ¼Ud¼­Scë‡Zõ[+ÛEÎéãS»C ®{i[½»[n Ï>¢ªòîþñZ="?³‹ MúoƶQƒþ¦qžÜ¬Büø¿b –_´´Çü¼ZL…½Žν¡ùhÇ'Aÿê­zÝ|Èã,måܬy÷<Î3Œâ³u’MîkJQ”×CçŸø@þ:XÊÍ׃õ7Æ0n ,xÿi¤oÇ«X™åð>ƒ|u¾±8öZ÷¥p¤–eãüâ¥¾ØØÈA„|ß©­y¥ßðFVKcçøµ¯‹Úónø?ª+ÎâIdÒå‡8 (H' }…:çãŒô•Xøcâë@¼3Idî3ø­{òÏ$ °rÀCt¤›Y¾€+Arñ‘Éd'ðô£ÿ_ðâQO_ëò>q“ö Ñ-€[ýXÓ˜u:p®>Ûö—øuzßé‹<‰í™OéÅ{Ûø—Y„¹ûTì§¥ÉB=1ÓóÏÒ«_¦ë;k›Ý3IºŽç!|ë8% ŒpwEÇP8ãœuâ‡VÚ>¥*.Wå[Emñ·á¶ @MRÊ5=˺ÿ3[PüLðMÍ„ööš¶ŸæH¸×cŽAà§­uW~ð]ôOö¯øná‰É¤ÂŒ§þýzÖSüøU|éöŸ†úGîû:\&}yŽ@¾øëÅS÷_ü9-ýÁ9«I´ËÍ^{•Õ-|‰l¢…9U˜:Ë#FqŒ?¯ZÖMÁûJSÑŒmý3RÞþÍŸµ™áð¥Í“c$éºÂÿ}3Ã9öª°þË_ vbÞ÷Æz{ò5päÀL\þ54•­ù Âïq²ø2Rê«©Ù8~Fwòü ›ÀW’ŒEydíÙ|à¤ÿßX«‡öRðªÍ—ÄoéÎOÜšH¤ úϵNß²Ýí³°Ó~3ëªG/t¸Ü¯þEâ«Ú®©‘ì¯×úûŽb_걺âåoö'BF¦Cá ^MFÙtû¤UÊ!`9õé[òþÏ?‡wØþ*éW 7MCEuÝÓœ©lþÁð‡ãÞ#ðV¢;(“ïÌxÉúÓö«ú¿ù س?DzE.‹ú ¤~¼˜§ü+]3P.@9È>•Ò·‚¾6X”’_x[Vá×ÉÕÐãøÁ÷ê)nÛâÞžÌ× åº\uÓõh&ǸÃTÂj=G:nZœ«Z_@Ãx$úš‚Y/bfÇ+וÑÉâ¿AníðÅ*‹÷ž;/8ÅAüë*_Š66„‹ÿxžÇŒæ]Q׿¯´Šêcìeت5èã séÚ›ý­z±°rÁ»sRŒ~WÅä÷v/ýÙì¥\еÅ/†÷MˆüCd„ã岓ùŠ|ר^É£OL¹7½yº˜&?7”ŒVf—âéí|=£&ü*X[¨SÈÿTµ´Þ2ð}í‹ÛØkÚxFOÚ“«3Ér*3FФÒ4Ë_íh$¸¶µ†xeŽD‘–0¤¯ÌÜÔ­ÝÑrWŠH͸ñ¬ì>x¢‘züÑ)þ•Eõû7`òÙÄ€÷UÆ*êÁö“ñÌgÃ×ÜTn>µÓKˆ·c€ æ*ù¢gË$b§Œ-"RÝT›]†?Z¹§øžÉŸs ÔÎ'nŸEuðšèHvÍîÃv*¬Ÿ õHÂãŒç#ŸÖuô¾¶=Ú÷E¹ÒÌ–³\ Փ呯Ügžç>‡5ZÌÛkz¶±gvÿe‚Í-Œ{àYC™MÅãø§zÁÐü=¥²£O&›3].·¯} “KŽ ~üåX¸Ç˜ÙJ\äZ5­´qÅ©Zcû‘‹m€wÆqYφ ×ìnlïņ£c8 %´¡‚8=ÁôJá%žøÁ¥ÁéÁ¤}KQU,G¹æµ8ØÉÕšgUំºoƒ~×ý‡£Øi_jÇœÖó¶X@ù»döÅi]hs^[ËG,R#G$BxØ2AÏq\ ÚÆ¡>m£©ÍU> ºV#qÀôÍÎ;‚«-„ðÇìÕ¡ø_ÄÖz½¥¦«w%«ùÃ,‘ÈŠøùOÊ;O=}+ÑãÓ ’\³@ˆØrçfÒN9÷ÏW¥ø¾à:¨,1ÏqŠÓñÍûÜxKQw;wùN[Ôù©XÊ)ÂwèyµÏÁuÓ¾"_øƒH×­4˜®%2>ŸqnÄ!'ç‚8ÎN1ÆkÙ,Ú%V ‘ 2à÷ëõ5Ëͬ]]ê“ÅÑdaœûñZ?o’8ñ(ßøÅ_³O©›©n‡”üzø#}ãÏÚë>–Ö[£“uÄâ=ûOÈÀ·àí#ØWCð[áe×€<#q¨Ï©_N'¸€•šÕ~T‚¬q’O¸ô®½ÎrCÛÆÙÿ` —u¼D.:aÏô§ì›ÒáíUîÑÂ|xø}¨x£À+m£ÛfâÎà\ÇcgAq‘µ†Õȯ7øð¿Ä:g‹nïum6óKÓá´’íî¢)ö¿0mòö‘ÈêO¦­}Œ&`ÎÒ7­l]%¤VÉåù¦g#!ÜàÔºrŠ)TŒ™ÀÛü/Ò4+=JçÃE¾‹¬Ég,6—€±1³)nbO¾•ò†ìux¼c§Ågðk1ß*)U;ÖPø9úsŸÆ¾åŸÅñêZ…ÔŸe‚ÞÞÕíÌ`e·™Cçw_¸1Ó½eM¬érc¼ˆË‚75ºïüÁÍJŒí ÛŠzœæ™ðãOÒ¼qâ½SÕ´MeæwûF8‡¸b˜å7sÉêk矎:Ö´¿u'’[íBCk•QQ°Œ㟮kê»kÛd8Këw’YYH¬¯hñ%ןªézn«r‰å¬ò³+„ÎpÇÕrÍ Ê/fy5¯Ã+¯þðεyvºF±oY½ÌÑï°£b99ÝÉ9Î*¯Ž`¼ýŸ¼¦hZÓ¦§«Ü=Õî·à0L… O®s^ùawca 0E 0A„Žu €gxïÃ'Ä}ßLÔ£¸–Þ9„¨öòƲFÜ”äñƒÏþ6’wh»ÆÖLðíë]øÛàMcBÕõ(uM^ÑÒÿM¸y”H¤|ƒ AcÐÒxá–©ð‹P»ñ¯‰BÁo£Û´–ðZήÓÎãbƒ´ýÁ»Ÿ^{7‚>é?ã¼L·¸F¸ÚÓIvù”÷@ÀÆÞsõæ¶µ»}'_ðì¶W&°¿€«9Sµ2ž˜ä}…&îÁ+-ÏŸüñæçUñZ~¡¤étÁ­ŸQÓ¬Ö+‹pë´8@HÍp­ðsÄÃÄSiÒé—ŒR).R3åËó`8~{îí^§áŸÙÿIðö»cwâõ[{I¼ß²ù;Œ9PrOÁ>¸÷¯l°¸óAÅÄa ß´È:çÒ†ü‡gÕŸ?|EñÏ‚4ÏKc©xgþ›Ë(c´ŸUoNè¸nŒóÞ¹Ž—ªø‡KÔâ`tÛŽ˜|ƪˆÅOQô®ÏÆ_µãâíJûBûi—®gXæ™w+–]§¶rAô5ë¾ ð¤:…ì4© ¶·÷¥â ¬íó1U àgÀQuÐJ-½O ðÆŸ¥Ü|·o\\YiƒSc£Íh\tÄ»Tç)¸~u©¯]éÞøM­?„5½Q¯/c·Õof\ðÄA(¸Œž2;Ÿjé?h‡š¶»g¢ê:E´×ÂË0>l™ ‡2¢û‚=ªŸÁ¯ÜIc­M¬è²ÙXÝÆ¶­kp_mÇ9l©ç_SM5o14ïcœøq«ŸêöÞ+-æ¨ÚÉÔ>pt‰626@Â?…3ÁŸtüIku?‹4ízÖЛ†Ó,C5ÅÁ@X&Èã¶kÖ5Ÿ‡–š?ƒµØüa—©ÝÙ´ £;3 å'àôîE|Çà%½>+ц“çG­-ÚIQ±p~bÝðsíšwRÕŠÍ%ÇÇŸÝx’{›=RXíäœÈ–®~éÈéÍt~/øE¯ø§]>#ðÅ ¸Ó5˜R÷Êk¤ŽDweÑœ}+½¿øáWÄ3_o¼‹íù²Û«ªÄAl°eAüz׊übÕµ‰¾!j6÷RI§‹@°[C²ª@îöã¶ ¸5mÎÏÄ^&?|?£øBM?YÔ€kíDßÄ'Ž)$†#©Ï­fx§[¼ø½ðî :Á-¯4K¦ûF•¦B&ŽO»*Æ£¨ ƒõ­‹‡7Ÿü áýVâñ4í^Ù$´ûMÄeÅä(pŽps‘ÊçÚ ñ6ŸyðÁ1Yé·[µ½bãtÚ­²‰÷bBÜŽ¹?SEï ìÌ¿„¶ZŸ‡›ZÖ|AÍ®ƒabé<1”7&O”D¯_´¾ø³Áw>!ht ¾ƒ¯Om´:v‡o{"_Y3—‘&8(îÄœ‚¡m¨¬ih¶øY¡k~+‹U²ñ¡ BÚÑôòY-šN žøà~5OáÿÅëzšéÚ¾¡>£¥^k$,€±/ÆåÀÎFsY_mMÅþº.JÂ9ýžçRg?(òÏíg8öÍu¿¬ü§kiq jºŽ©«ÁÒYÙÞB ›9“×ýj=ùœúüñlz´¶YÇ%ŸŸåÇtÓ¦nÀf\ç§$c5©ã/‹Qø[S‹@Ót½;W²ÒaKO´j0 ^F@rsÆGJä4Ïê+ö o¤‡RIÌïæäüÝp9ãÅuþ9øg‰µX5ƒ­išî¥kÕÆŸ&ÖYrHÇLõ¡éæÉø˜oþ"iZŠl –âÝâ6“Xڦ岑:…U*Ò§ðšøGÀ~!Õô†_𦯡]izòøSÃÒhzÜÖKq1”È.#Éàã==yG‡î¯d×´èôäΡç¢À«÷¼Ì÷þ¿zW¼¨xR›Äž&ì­4xhc«yòUWå'd“ëÀïLÐ>:3ëöæûFÒ­ ’O-®íí•f…[Àþ<þ4ý¾åè_eñ^¡öÍ^úÎô8ûJÚDø¶œg®kâΫ=§ˆì´Ëö:=•ª-ŠÂä+ÆFwdc?ZÀñGƒ5í/Äwñ+ëÝÓ[ˆàg9 IÍw¾$½Ð<)¥è‰ôƒ¯jöÖÙ™Òc9ògŽ}(Mt i©›á}"oˆ¿îaÕ/áÓ×J¼_³j·ÇŒ8%£'«c¦áZºFkðßDÕ¼N5;MwPŽol,Nä€ÉÁwÏCŽ:w5‘ãm^Îÿáî…>…d-¼9ks"ÜØ;–+19Îrr\úT_ ¨j–òÛÛÙøml¤:‹BB©^{±=3žôôêô,x[âv±cujúæ±&¡oxDFɱØÿ)bqÁàj޵ðÅPëQXiþušÎcŠI'E Æà[#þ•Ðø@ð*¶¹Òµ›Ý[Q¶GžÒÎî<ʤ¯8êÈ¢¼×PñF·¨ë×wrÞ]Çu,¥Ü$Œ60=0lRzî MHñŒ#ðe凅t»;-J *Ýažæþ!.rì¹è '¥dxÛTŸâ7…ôíKN¶(t÷k[:Î,$@œ£"€ëZ¾)ð ø¥´ýb]ZÇÃ÷ú•šK=® å †\g†8ê*ž¹{7Â? Øé:5Ú¾¥¨ww©A÷_PˆHû qï“OÐ^¢| ðÖ©‰nµ)cžÊÒÚ# ¤±”3;ýÔÁ±¸Ÿaë_DÙ,+;Åò[å‘nœœylà‘íÍt²$° ª$m SNió@ ‹yVÞN†àËŠƒ[\óøBÒôñwidÐÊ0•ÈÎîàšÏð`Ûâ Fw“øà×eã¤+áÉ>l–•:gŸ˜u®GÁj?á"´ãænà&“z ?ú5áoù´ÃŸùvAŸÃ©Œ ÌðÁχtÖÆ3qÓV¡¤q:R”cŸZUrhŒFzc±Q»¯júu…âÝB}?L_³ùË$¬Ã}ºå”*3“Ðü¿&ÿtž”ÛC·—ï磇ýR¯ ÅKŽ£ÀM ¬ä(±=hiúL×Ìâ4§Ììß(QêIà©«-}§é‹uKûï°>Hüð_ñÀö4‚Á‡˜ÙµÅÌéeoÿ=¥éø¬}†}ñYˆ–Cä;Kð»®ÒÃÔŒœ~tšÎ»xíÏm>³4LŒ,â奇ȠNÀS­lÒçÏûi-ãwØÍÁ ã>ãü(O[Î×!ÇZAŽ3N0È4Òj²Eo|AcÓ­#|ÓA$úÓÿ”žsMãëô¥#9¤^ÞÔÒ»ŽE&:~4åèi@ô ©:On§"šTgÐUDN}êM,gÅžºŠŸÉšÃšv”Û|[á¿kÆ?”OS'£/yïÃSx{Œ±FxúWN­ƒŽõËü8<ááœÿ ÅÈÿtWDd%¶¨$ú ¥°7©?˜¯4ûyY6ßh\ò§¡§Á¦1_:å„QŽNjkùàÒô¥½½¼]HvØ—…çºoî[Ä9v?•Q7ocÉhO ^ü@Ô¼3¤økJOí$¹2 Ë* Á.äžç“]ÕΟ Áã;%ðõ¬‹e§iÐéÒß´…’öç-$ïè3m㌃Y~"ñWØloíM£iv¾_šÚ,rfòßL9Psþ¥}yÅni×ýlg±Ç¹£DEÚ«·+…€;VnÉ›EZ6FòàµN¼TJ>j™zSdœ¿ÄMzMD…-oÒÂúöê D¸ò<ö·Y'Ž&˜G‘¿h Á`â³5ëk NÓì&¸ŽÆÌÇ•©Œìò‚”ÜÌÇp`¡9çž9µñ+OŽm6Îá‚–›%~` ôÁôö¨¼`ʲÀõ8­ßðW«ü‘âûª¿dM>+‡·÷J–{òé…ÿÐ{xÏì »~Ëï'þ‹Ž½š¼÷¹Ü¶ (¢ÂŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ¼‡öµC'ìñã3•ŠãÚâ#ý+׫ȿimGOÕþx«C†öÝõ»c p‡Î:œ1ÛÓ¾)­·?9šY"#I¸`Žr7sÀ§dÀ n<Ëœ\ãJÞÿ„FCp–óÍ rg*ªê€þ.Fq]m§Á‰`„M©\Xéq ÌâF#·â®÷1m&y}¹‰5ûMÊZ#û¼¥é“ÏN:W…x§öRðÍÁ¹›ÃÞ,Õ/¯åvhôùtꤓ€eIz{í¯±uKŸx&Ýåî5©ó´• _rG~5Ðxz9õí2 Ý#J†ÓKœf;ˆ<»xd^ÄJçæÿ€ƒUio±›¨ž‡Âš_ìW­užíšÆY¯…GÐdŸÌ×âO‡–^Ô¦°vŽíÓ£[­}wûQÚxÇöv)¢ÚÙjÒ_o Ÿ(òU@Á- MÜžÜqÞ¾iµÒ]¬líô¬yÒ/Ù3Âe“ìɶÖBGúÇrà3Si?ð”ÞÈÂ}Jr§îÀÎBþ#_]øwöPØñÏul–qŒ;V•Fàÿ*î­þxcA²Ä¯}®>?Ô[Ä ƒ=€Î¯J®i=‰ä¶çÆÖð|CÓð¥l|‹pfoÈZ0øãÇ›//®Ù€à](S¡+ëk ¹!º–ÃFðô….#´·3\ùc‚îHÂŽG=9¯ øëዲַ—Ê<öBHáä#?ìü¢®ò[‚×cË“ã÷Œô÷ÂÝÛÊ£¯ì~#£gûRø¶(úvŸ(õ"E?úq×z|¡¸¶9|Õ@X‹©Ä7ጞLQîãéIÈ=å¥ÏSOÚÿRÀ›IxÿŸ{“ȃZ¶ß¶… `.4{˜øä¬ŠÙ?Š×œ]h_t .ãÔ/õE%̶:®ž°ZÈ™ŽãÌÏ^5ÇøÃÆ¾Ôa¶·²ðý…Œ.Æ}<Ì çûÏæHüÿº{S»ìUÚê}!í‹á˱\ÆÇ†ßŸäkR?Ú‡Ã70¡YeXXíPѧ×úW˾ øYã‰Öw—žÒlþËk ‰äº»†_®Õón#Œã¥^Õÿg‹óº›¯ êZŒmE·™.ETcÀTÞ=QiÍêª-þ=øZæ<åõ9ÿ¾zŠÚÿ…Ýá½NÒ _¶ÙE z²¶Ó#cn[‘ƒ€;`ãšøoRø%ñDžïÁ~"µUÆæm>`â¹Û+Ä:c=¦§jGüõŠDþb†©I¢ÕJ°M.§è}—Ä/HÊÐjvÀÖ#÷BóÇåÛ¶ì¿ç6ÛL[¸d'î—sÆ=Ðx†kó&×âω,@_¿ÊxäŒ}0kN×ã¿‹¢#ý:Vç©•ùýhpqûGØý&·û5°ÎÏQófLñýÜÓñ#ÔkrÂûN“G¸ŽYB^3/ÙbmÄ*23Î8Ï·Jü×´ý¤µ·mûZøjæhËÊêŠ „$c§qýi{9ÚDú_íoò´lÀ€FzïZz=Χ(¶‚þHNÜ‚™ÉÇ`9'Ú¾x³ý©¼-x µÙÉ<îŒ~|1®—Hý¥|/ ŠþÔ¶Ò6Ï2çñSÏz‰S©otºs§Ì¹ö=bûT¼•^9äÞ‰òþý }k”Õô"è“yá­Pfï>{÷Œþ<æ± ø×á«§,5;VcÎæ”O±||GðüåDz²œãT|ë“ýZ9TJú3ïáÃJç<=#uýÄFøJãÿÕTn~ü$º$¿`´ïæé÷×HŸái'ë·±ô&»;oéWB8pÇ? <ý9ÉéÈ?J¶o-^BDì s’X}pOLãÖŽ[t ùžasû4ü*’RЯ‰tÐßtÚk.Gþ<­Ï×ùfû2xj6+¦üBñ®ž}¡&vÏÈ=ûרG5´€®!dVsóÔŸåDpCç/ï®p6¾xïŒõïJíwûØ+6yrþΚŒAañ§Z]Ãþ^ôÈäçП0Quð;â*8ŠÃâÞ“t«ŒCIx½ÿ‡u{_ˆ–Öòú&³Pb€6ò¨cŽ dãëÓŠË¡™¾Q“ó§½L*JJûU§rqNçOðÃâì$,~*ðN°qŒ”¸?‰Ž«'ƒþ4Y»:è^ÔA‡–ßVò˜œ¼SôÉéšöô´ª„†?qyÏኰó0H÷åŒm^¹íþZÑ7ý[üŒl{?‹VÇ÷ÿ á½ œýV¶”7Ðoæ©Ë©øµ$Ù{ð‹Å Çþ}àÿ|f¾ƒk¦Õ˜¾Ñ÷Ž QÛÿ×ïN[¼òÄ`‘»m>y ’,ù¢ëÆÖö\j>ñV”;´ÚT¤{㊢¿<­ÚßZ>:OdëƒøŠúÎÂKŸ³ÜHo%¡]áS?1$®O¥2_^’<Ë©dQÔ;äúƒIUoNÕ¬ßSæ7âÃpMVظä,»“ñ«šÇŠ<+âM&òÆÏÄv} .Öi×jêÜŒçøq^÷5ž—~În´=*ä†?4ú|ùå aêžð^®®<áÉ8ûÃM…1ù(ëšnWÝ_q )lq)7„¯Ií¯íËÊåÏ—"7Sž™¤¼Ñ´éAÙv­‘Böú֤߾Ý3xLRO “Bß’8ª×?³§ÃYXô}FÀ‘ÂÙê· @ú3µZ©äO²]ÌXü($‘ZTî鸚lš ŠI•çå=:ÔoÙ»Âp‚mµÏÚ·U1jÊÀßQ«7À ®¢ÇâwŠ,ÀÉ qSr:s•Í5Vß×ü]‘°¹ðACïŠt–×­*3í*‡#㊚O‚>*¶ˆŠÞfÒ/´eþjäúU ¯†?4÷ kão ê[Ž’ÖhN=ð§jn­ÕRQw<ëâ|W­â‹Å´Gf6VÛöòócŠàE®¨Ž ‰2ÛW¼§Ãÿ‹fguÓü%ª`gKã#’\SU®|/ñN ÿÒ~Z^7÷¬õ8lµ ¢µ˜:m»£ÅþÕ¨B„&zàƒÍgϨêJÇæ‘}°kÚ§‹ÆÌZ÷àî¼ì¼mÌ¿øé¬Ëíz Wáωôóœ’Ú\¸ò5¢«ÔÉÒ–ö<„kš‚/.çñ56Ÿâ›Ñ(̬= w÷>1ð/úV`ýÍÍœŠôЍu_†×+˜õkx%Î~t*?ÆŸ5Éöm§„5KKÃï4Ì^VRÿMµËi>/žÓ@Òàó_lv‘¤ôtzŒ|%’[[ë¶8£Ìª9úÖ¿ƒ´{‹+HÓ^²™à‰!g†uˆdz”ìÛf’މ!Æ&B„…¨­_¹CÏQåð¤‡áõ›®èïV@ŸÄެëW$ð!RJ\(\uÇ_ך»¦cË"&ñM¼¤–²¶ÉãˆÀþU%·‰aÎÔ…b8fÖ¡“ÁwÉ´Ä ɦ/†. `]W±ÉÁ§ {Ç_¢Ëmª0ûO™´r³0ª~*ÔHD”09¼†Ì7a@§>ø=}jχtÑÛ$‘ÄGbàVÄèeþÃ}¹,/mÊûŸ5Ec$´7ƒvw6WV¶hð·e9Èb©™mDædkS/_0@¡ýþ`A¯>’=H“…aìEf¹Ô e\VÜ0ö’îzå½ú ½’?.¸¬?x+Dñmê^êº=­ýÐQ¤!ÊŽÙ® µMAÌHî*³xŽúÙ‚—aþÖi8C¡J¤úž·¦Ú-ŒQ[Cj°[À‚(¢‰”*(èÍSñσm|m 7SµœB\J%…“z0èAçßµyþŸâË÷“!¦kµÑõ‹»Í±»3ÔzŠÍÁt4UÑœÿ„~x{á•ÌòÅy3ÝÞ/–²]ã!ªí¸ÉöÙÿkè³[K·pIªUãf0<ƒë\Å{Ù-[@hÔ‚&™zàrƒü+‘]‘°ÌT‘ëDi©+„ª8»"±ýžmΩ½÷MX%Iu,E<µ^Iäsž˜÷¯kðçŠ/ou‹Xd¹‘áv;ÕŽìñïVøŸVŒýÜg¶8úƒ^П.ãP Q¾:nSþ5ßÄ_·07U•ÎßßDãñ«–Kby¢÷0¼-ðØøûáÖ‡ý¹$Ö²Û™>Ç,@y†ÜŸ”6Aã9#Û_â†ßáoÃãa¥4ò-ýÐ[»é0$ Êœt~yõ®ÂŠ(@YmÚ ’` tããícÇš?ˆôùlµ-2Iìådx óœö9Ϧ)rËq·Xñÿ…7zψ¤ÐîZ]BÃR·’ã‘Ëyj°dñ·­u:'ìï5¦¯kq©ê×z\R $‚$o2U„éŽqƒÏ­tþÔ|!ák‰¦Òô™,¤˜lydm½p2Ç8Q€IïÐε°šfHÑGn%°ïZ)kk¤å¯Hš~ÖоH?í¸ÈEÉ÷ψ%ž²­¥»ŽV#ó8ÿiºŸ§OjÍf$üèdúŽ¥>¡j–(í¡œBláùDe‘X®sÎÒ2rN:Övr:U—°ÒbŠK¸"u{†T¹v—1º >^ÔÇnlœóš­´ïàB¸;t,A=Ŭ‹5´òÛ\FwG4QÐú«A«~’1vöaYwFX>^#êsŸÎ³e½ŽʧszÕR/k ¬xcÄ{e‚Äê2XHrTKHÀc¾$çÜâ”Ý¢]5y#NX¼‡xÏN*ô­ Uq>½T[€=ûÕÇTCÜŒõäs@È£¿­/?ãTH‡9©U—¡ëHN~”˜æŠÑädÓJuÆ9┑Îx¥VüEIÓK óO/ji ­1 '4Û#øs´Kÿ¢ZžÀUÏiÉ}â«îWìÖ×—*ÎæXNã“S/…Ž+Þ9_†ßxûWj}‚›þ+¼Ó´¿ô‘oc_^`’¢Žå@©®Þ6Ñ<%ð¯Â3k¯]éñ­Ž‘¦Ççêì£aƒî®àFæÀàõK]6Ê=‘'² ê}IÉ=Í{ÃÙëRñG•w¬«éÚqÁÉ$íßJ‰M#HŽŠ?¾i7ûq¸º’k±4RÉò–¡a»Ö»‰^°ðF©£è¶rZÛvîXòÄýX±¯OºÖ<7ð‹K:t}¬.1c÷ô¯Öõ›kSj7Mºi죰‹¿<‚RZF%E^sÞ¤^”Õ랤Ԋ3ÍhÉ9ˆ¼è£þ¢Úgþ—AY>4oô¨ûBµþ"Œè¿öÓ?ôº ÇñŸü~Aþõt?àÇÕþQ3ÝúŸ_þÊC [þ¿¤ÿÐ#¯e¯ý•×oÂÅ>·’üu+Ø+Ï{Ë`¢Š) (¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¬MOÆš&'—u©B²TÇde#¨!A#ñ®3Tøßkôí:K‡*pfp¤7o•w:w®P^_[iñ n®"¶Œ»æpƒ>™5áúÏÄÏÝ,žlñép>?‰aÇN‡—ýk„Ô|Ug$¯%Ö¥-줒æ”gÝÛ$ÓW{"\¢·g¿jß´ 6,Ç3ݾ.Àl—Ç_lת|l¿½4Ë!‘þ°0ƒž¡›jN†¼†ÙÌdm>×ír(éoO'ýöÜ GŸ]ÕY˜Çﮥó$Çû«…‰ªä}Y›«ü¨êuÏk×™öýYU™”ƒŒ´aå\U߈4ÂÁ$Ý}rX*Ç;´§>ѧ$Ú~¨#Ôuµ‘ÔÅ!3þê`ãÆ¼7ã§íOsð/ÄÖz‡|cr¯j·RËt]v†$(QŽwn犵-nr$ý¦üâŠz}¶ƒiª[èºK[Izl¯l¢WžhvÆÃ÷ˆ6¿Ì Úp WË:‰þ$ØhhÞº‹TuC,]ì–KdèÛ<÷Ž>حߊŸ¶µñJãC’÷CgKy˜E ÄFÞb;Bª•;A“œþ|‡>2Iá{Ùî,´¤c$&2nàœƒž1éŠÖü¯FfìÒ„> _†ñF¡{ó¶6K.ð>€ƒ ¯±>ø[Å_ü1kk‹à[@!ŠÚòa°uTab^N'õ¯ŽuŸŽZö¶H}N{HØc˵_(cÓ#ŸÖ¹Tñ 2»‹é¢cÕƒ°&µ¥8E·Qs|ô&I¿…Øýñ6¥ òÿ·4O k- ù®n-Üûå$šç‡ü0í§¡xRÞf&o,´ïo]§qÈíè~•ñ¶Ÿñ«ÅÖšt:]·uèì‘<˜ìâÔfX¶“7cöÇZôoþ×~<ðn„ú5´jê1C¨ÞÙ .“ ü¤ƒžYI¬§Ë)^)/ëæiÏd•î}-¢|?ñhio´ÏÍâÍKcý£îtÝOZÓè÷ÓGò»CåXbBX‚ ¯''Žy¡·²ÐIi}ÏAø«û%ØþÏpiúìsÏsu«´yÑþÓ-¼½v3;–áºpk“â~¯ ¤v«s©ùp¡n¬mîW#ŽŒ‡A_Lø“Ä·Ÿ¼ w¦‹/jy,G¶Jí$œË~¹x+Â^-tÆÔfN†éüˆ‰ïò!goÅ…(¹EYkëÿÒMuÐñÝ|UâÙ[ÀúF¸Ò ­Íæ‹ ¦³!\ýqY¾)ø1©ØøŒØêxgIÔ#!&Ò´‹±4ñdn£RÌ8#“€r1_HÜx®{|$ (‘?Ôi±-º`ú‘—?RÕ‡u1I°<¼– –n1’zŸNhäo_ÈŽtÓ¾GKHÝ:™5"Sÿ¹ü…d|`ðfá†:íÄ:6”ufBÞ[Y,F5ÊŒ.I9=KuçµzåΨ$fgc¹GNßy?Çëõ?ulL±ŽO#9=èTã}EíËC‡ý”fŒü=¾gRïý§0ÎåÈ^í^Ñ…šw !˜þó8Ûí‘×'Ú¼+öR¸ò>ê³V$†þiÜáRXç‚:ñÇ~kÙtišÌ i…¾£±mös J“ÈÎ9ÉÆ:çùÕ+ô.CfÖö{IcØòD8ù„Œƒ$uè8µ¢5ígÈ?ñ1»)ŒíyÜ‚=qŸÏŽÞÕŽŠY¼¨ðà*±RFAç9ô³oŒN¼–TË c?1$mà ¾¥©n~Úd{¸lîÝN3sc™>‡ržOÒ¾Uý±4M6ÔørúËK´Ó¦•fŽG±³ŽÙe‚2b2yÆpy¯§ÞY6–duT‡B>ÝÏN:×ζKµÆ…áéw_µ\Ià±’ê?jBmÛS‰ý•þx_â±®ŸiójpZC‘w/ Ìrį'Àükè Ù[áEÌn[JÖì˜df mp^Äx®}Zñÿز]š¿Š•™@6ðc=IÞØÁíÞ¾¥·|’ 1ÆT¨ÚƒýìäŽ3Ð`çŠ9Swee©ä7ß±ŸÃ÷`mõïÙ©ò–ÓŽzÄ #ò¬‹ß؃AeÿBñæ ’“ÂÞh‹´r“ŸÏ÷¯~¶»Y& $h2r¹ÉP1ÎsÈïÔóS—ÌAd$&AV`ƒÊŽ@Ï\úéZÛ§cæŸØcQv?Ùþ9Ñç\ni²ºˆãŸî£úW ñ7öYñWÃ? OâõYÒíÙVwÓ®\ÉæÚ ŽDFÆH3_k¤Ëæ•lü²ä.ãÏq€Üöõµç¿´3JßS³ý¡ügl]J^; _©­kOÚ‹ÅÖÌ7Ëæãx†éõ¾†›ö\øQ$Œ$Ò5Ë3ަ°oG…¸ïÖ²o?cŸ‡÷`ý›Uñ=ƒÿ-üßM©ÿÖïKõ_ùsÊ´ÿÚûÄv®áW pv&GäoY~ÚŠgíJsüJ¬èõ»wûøaÔ›OjP’x::8üÒoéXrþijÊÙø÷J }Ñsar›¿ï•z|ëª,—SrËöÖ¶lºt‰žl®3úÝÓÿl¯ž&YÑO8.¤gñ^kä߉ž¿øcâ»­þ{{¹` ËshÌb•Xd2ÃO„Þ&ø½©ÝØønÒ‰m"N÷7QÛÆŠ[hù¤` ' œJmÆÛ¹¶¹öU·íoቆÓtÊíÎæD8Ïr7ŸjÓ³ý¥<30_/Qœ«EÇá‚yü+å{ŸÙ#⥆âž’ð.A6Wvóôë÷\Ö=÷ì÷ñ6Á\xÄq¯÷†™+Ì-Méõ+÷‡Ü:Ç¿¼F5Õ­JI‚Àï^+ýkFŠ~]Jȱû¤\(?ˆlb¿9o¼âMÙn´mVÉ“ï m%L}r8ª?kÔlúÜ]Aï3-¦ö<ú£ôâÏÆºeÛîKÔ›'#£6~›³úUÄ×àšE!˜©ç*œ˯ùƒŠ5x¸RŸ›óV¡ø‰¯ÙŸÝêRd{ð§ÉyÙúk6£k°äc^3ùçH.í†Yâo_›¿éùg5ùÁiñ»Æ6§÷Z¤€˜fÈÖí§íã[pj2H=F?Ìš\‰õ=·Gèt7$‘~órdo$‚Ï?^½ëGÄ×öWwáàhåF~à!AÉèXÜgaÀÍ~z[~ÔÞ,‡‰6IÎs…ÏþƒZöߵƼ¼Ëgg¯È¿ýjÍÐNJWØÚ8‡8[F}¾»Jù…BîêORi†¦l}öä` L×Ƕ_¶-ÄADºv1ü@¾O¯ñÖÍ¿í‘jíûÛIc†ÚÄ~ þu~Í™{D}M%¿Ì6ÆTÐ÷ü:{Ò¾ñµ–I7{šù×Oý¯´ æA4-žðöQï[v?µo†næì®F~dSß?Þ{9 MÚnnp·2±Ûݳ߯?…_Ñ—T¾óþË}&ôPÛFNî¿äöÈõ¯‡öðÍâ…Ѐ}A 'ŠÙÓ~=hq™ßP·Œ¸Á-’zvÊ}G5œáS–ÑÑ›R%4ê+ÄîßÄú´Èè×2<`t‘÷ } fÜ^GrŠ×zv™pXœ}¢Æ&Sê~e#Ú¹ˆ¾%hWCå½¶äóN gñÅZ_éS’Våž YU½øÃSå}Qô-OáÿÝ0ó¼ Ëòà±Ó ç×€™¬Ë…¹oôèdc‘¹ˆÿã¬8ÅkÅ®Ûcäq¸,œñíÉ«X¶Ÿ01ó `þT­ns• äÂ$-†KZßÝ#(ǧ™éTeýžü²)¼EcœcìúËñì+f»˜õ;F^'‰‰ç€üjC{ ®|©ãÛœ9ç)«‹N§ËðGù¾Åã?ØÅ’¿¼¸Š\qÓ”_þ¾¥nYüIÔÐã .tØdøqùýkÝ-u«+!i⤠Œ `y¸xà°9üs\¼›aåp>žÕ•:’“wV±ÓVŒ)¨¸É;þ•Kð¿ÆP6-üw¥Þ®:]iL€ÿß,j»|=ø‘÷N£ákå\;Ïï®R½Q“!T–Î[qàž˜ý).d˺GoåŸ\Ö·g5#—Áÿ-[iðç‡ïT¾ªˆÓxST§Ñ|u leøq-Æ YßC/凯i\sûÅÛ»æ p?Æ«Í&ÔeWÆìÿŸJ®f‰qG†ê3jöj>Ýð×ÄV™òÎɤç*Nk ïÄÞŠP·úµb£©¹°‘ÿÇkèV¼¾Šé 7fHLð™ç¾1éWuýK[ÐgZkÀá†c…Ãcœ÷=*—ZÒQoVi;”\ÒÑo±ó2x¿À¾`oíµ$ô’SúŠÜÒ¼ká(›|Zí£c8F;Oó¯`›Å³£ ãµ¹@¹\g¿U9ïY7 ¢]Ç×…´;pY¿³a$þ;x­9Ù³Hò¯G£xÜéëµd‹lÎägr€1ùVBü2IA6ú…´£ŒùÏå^¡uá?ßÌ|ïhîùäÇ‹ôF_óéYן þË 0ð£X’xû-üÈGÓæ4Ôì'O›SÌo~_yláãaìⱦø_¬Ær–ò9Èæ½e¾x%W0?ˆ¬þ˜êlAÿ¾¦Ÿ†Ú$%b´ñ?Š­ØŒ”ûBIN©OÚ_Ó#Ù#Ç®| ¬[®ï³KÈþ骫á}^Û:žÙ¯pÿ…s:0H¼y«DqÂÜÚE!zò´©àoD6Áã«i9!|ý7Uzj`éW4K›M^ÒyŽÒŒz7= Iñ&ŸZÓ6i¼ÄŸøv'Áþ4€+G®ørsŽ Ñ·ÐáOZ¡uῼ¨Òé¢Ë¬·{HÏP7(ÇÿZ§›[•ËecÌ$´™AÊÆ©I ƒ'?Jõ4Ÿ!ÿHðTrœý–þ"áš«u§_…?iø}¬BHËü‰­9Ñ—³g™ùns‘ÍG±ùâ»ë´±·cö¯ ø†Ëh佃þ¼Vd÷ÞÆ×–þÐ÷ûE«.?J~Ñ Ù³,ê98ö­ŸHçÄZj³yëÍ_|+>1â XÎ~ìˆAþu±£Øèv·Ö÷Pë¶ùN``7{ šMܸÆÏQÿ k[JÝ– o3:uAÀ¯7½ùN+Öõ¸¡Öoìç·¼µ™bŽXÊ™€,[nÿ¾Ms—¾ ¸ºRðy.9Û:’? Ô­7\Ç›5ËFs’÷¥„‹÷fqþë]5çÃÍe‰1Ù´ƒ¦PƒübÏàrÜ’4ˆ$•Œœô«RDòØ…|I{o€—·+Ž˜•¸ýjä:Õ£;†­t¼¤ÿ:ƺе;pº}Ô_ïBÃúU mç‡!ãt?í)Ìï-~%k‰{~íÝ$sÚ²™´V…Þ ÉæIŽÏ õüÿ¥]Kí|î?‡¿LÒèL‚A°œäÊ çpY2wpù?–?ÏJ‚ÉÈBYƒ+ ‚y=þ¾õæ?Àÿ„fטOŒçý–íøW¢ù¬Ð2’QŒ‘Þ¾õ柙WAµ¾ôÄàtû­N;“=Ÿ@8cí[þ P÷ÿJÀè­ô®‹ÁCý7=öªFH÷-•¶^˜éÍo’eŒ²•F`21ŽsÀÊ¹Ý ˆ„rHÆvŽõ¸³`¡UÉ·ó¨{›ÿB&†˜%Ẋ ÔŒ×àä?ðÛ`‘Þ?Ü5ÕüCv,‚ó©ù{ç|m%ߊ,¡Š6–W,ªˆ2X• )IÙ\qÖgèi6™àˆ— úâ§æ™gÁe N0QŸÊŸšD½ÀÓ 8çš{)‡§^´nF×ÉÚ¯?øMy®jº§«hºgöÞ¡w®Í/ØŠ—n¬~Qî>Ø®³Å:ýŸ…]ÅìÓ'Ìsµ‚0¯Jº]û°±¤ ¤D4JÄ#z¯cùb”¨ ŸÖšfDMÌÀÉ'µQ›PiâamòI•Çõö÷µ™m¦jZÍÒÌQ¯¯:C ò¿…0:p0=j[®ÌŸŠž,Ôt_›­)äÓe{ÈíÄüy¥HÜJõ ž9>õè?/./|yò¼¢/À1è>É+ìÆ¸ÚziFiöÂÆîMB7¸¶"~PéÿmÃð®ûàÜ[|!xßßñ‚ûæÁõ¨›÷Qµ%ïKúìtz¶¡sé¼Õ&Å]ÕùÔ®øÿ–‡š¤Çå­£²2{ŒãÔ™ì)ÛAÓH«'a^ÔÍÎŽüu¦ 4€sJO=iÔiô£Ò†ëF0)ˆiª£Æ_ðø›BÖLæ8d”I8.¥ Æ­“ŒW+ãÛSršbòÄ»…Df?/w¡ì ÷ÐÊÕ|A£Å­_]ø?B] îËnºy ×(ŒÅŒq1âòÌvGŽIɦxGÁ·Œu³éV­räâK‡ÿUÔ÷>½Ságìã¨ø™¢¹Öbkr-‡ßqþÑíô¯¡§ŸÂÿ´¤¶†¼ô_’Ö,gþŽŸÎ°ærv·*޳8ÿ‡´_‡ö£TÖg½-q7ðû(íNñ—ÅÜ«ÙhcÊ„|¦nçé\W‹þ!ê~1º&i<«a÷!C…¹Ü`V‘‚Ž»²œü‘-ÅÄ—s4²»Hìyf4ø×b e8Qжƒ€É©@â£Z”t¨ ·ÄAÿ oû iŸú]bøÈâþv­¿ˆÜx~ØöþÖÓ?ôº ÂñƒÿÄ  þ•ÐÿƒWùDÍü_wê}—û.®ß…p{ÝIü–½r¼£öd]¿ lýçÿ*õzà{áER¢Š(¢Š(¢Š(¢Š(¢ŠòŸŠŸµ/Âô/ŒüWªM¸[qiqpDd £`¹ ðH=úSI½€ñ¿Û#ö©ø›û7ëQº>­ Þ[¤ÖºÔ7yeN&IB:Œ‚PŒÃ¼ãgö=ý·´¯Ú`M¡jZzè^5´®e¶…‹ZÝD¥AxI;†PäÈ,3ý¹ÿiχ<5á-3Á~?·›}äñê-›Kw‹Ì €•'¯ýŽ>,xcáïÆÏêz¦¥½¾‰{oyvøfRÊ q£“¹@é‘“Þ›R¶Â“WM3õöŠù‡Ä_·_‡¡ ¾ÐîµO”âk©Ò Û…ÞHéé^Eâ¯Û[Ç÷ ‹Y¬t;dS”·´+sÕšMÇ?LjOMÊJçßtW姈?mêzŒ­y©¾°$É60´ñBÇ›d2 ÝÇ^~•Ó|'ý©u]7ÄMywáGG·•‹„Õnf‰@çþ=摲I¹ü©iÜGÜþÓ_£¹¹ÓfƒÅVèv%½Ž—%µÊ¶å§™#(…KW7û@üzñ×Âï G®]xêám’這‹HYà&@8Êà∾V“HÎQçZ2·ÅýWÆz:Ø èÚ±©Ý³†æöDKuãi$€ÒsÀÇNõ忾=ÛøŸN¼×õ¸4èÑ’àXiZLRBéèDÃ÷ƒ¨ù¸=ëÚÿd¯Úvµ¤êZ÷ˆí-ã½¹”½¹Š>P^ äãÈéé^«ñgW¸ø·¢Ú§‡ufÐu+Y7Cyl­pYHå ª•<½Áå9ôvû…ÁžQáÏx§IÐV-SAKùù|Ž-¶!Œ~¬éÚí—‰¯Š^hºÄw|w+v§×î)ÇãŠèt =CÁp³ø«Ç‘ݱÎê(a ôDÉúš±{ã½:â6[;MKYLg͘}–Üý rKšRZFÅZžßJ°°#å¡}¡Õ[þùòWíÙƒ®é^šÛX‚[ènž"©*€•ËTdüÀpIü+;ö­ñ‰®µôˆ|[ymc¨D°ÇáË9¿ÑOâÞãvOÆkã‹ýJK/"ò_š)–ÝÞB[ÊÉœääyÅ¥gÌÊ•T£Ê‘é^ øk k>ñ&½5Æ¥q.‰%±1XCç™RRë¬Ë÷J‚[wŽîÖÞRÏleC„H8ÉëÍv6 ¯¼OcÎ¥™W0ŲX‘†7¬ÁŠ®FX «‘’+žÓ´sâ]rÇN´UY¯nc†/0홀>žµõÖ“û3øÇÂ>²ºŠÿÂ^ û,’y^lWXüÜ bRvŒ6:õ;JäÒ””~"# I´µ>>½²ºø{âˆ<øšÛS²•&Ím„a•‡P{0<ƒÁæ¹»xõ u»›HÚ{÷i‹ ŠZG rX÷àOã^óñ×àω|>ãX×ìLA 0C¶ Q¤q¢ÌÜ O¼rs’y¯ÓÝ“Åw;N[œ`ãøZi«Ä‰AÅÙ‰y,:}ýÄV¢;„ŽFE–EÆðÆxª“^Ï:áå+ŽËÅSiO™œgÚžÌ\ã÷¡®ÆGÜ?ðN=6 ½;Ç7R¦dI,ãq11#ùW«x»ÁšN«ûSü;ûUœol-u;É¡(6ÎÑGMÿÞœ’]ÙÛIâ(m ™|e&Ÿr4»¹&_( ¿¼@„q!ŒIµ³×€3Š“áÝÓê¾ñNâÙ¯G…Öç’î@dšÎå[˜•º³n`W# Ú¤ÙZÇYñoâ×ÅŸÚ_h×Vöû5 4”¼ªY?u ÚÉèÔü$øÉoð÷᎞|iuzïsq2éáTË+À6ä¶z(}ÀyÏLW›Í©Ûü;ð ÚŸÃínþçíwéo¨j­µž´p• ØV;Žìó·â–æÂóã/ƒ´ío\ñŽ™­ÙÜÉb/u©Ú5¿‹h@?2A8çpî Õ‡~¦ïƯŽ~%µñeœ¾Õî´Í [(®,Úù.U³¹ØáR;5?íã›?ø#Â;Ù × +uwdF$„:.2;÷€ô5•â/Gð›OÐü%k¦h>,ŠÒÌ]My©Ù%Ò4“ä[»tŒ r:œ×+ñ׬[7Ÿ kÛn­egPñPL,™Ü6@8Ú@4nô/ØóRHÔüYs+€b±I ;ª3ÛAÏá]ŸÃÏÚ£þßÙèzž“•¥ã´V—1Jåƒó°z–éׂzWÎ? ìuGÆZ'ö=ä1³JP˜£RÀ!詌äž1^£¡Z|:›Åz”¾MboÁäºuž "{•U°b È]Ì€ç)z§ÔÞ3ñ}¿<3¨kš©aie)@ $bÀ*óëžýëáÆ¿ü]Q]*Þ}:òÉUä·» åNFñŽÝ§ã_$ü3Öo|dÚï‡uýZå´ >Iî®n\È,^29‚“Ô6†"¶t–µøGá]gÄž ñ\zþ«,¶ö&öÖÞH „nYÉd~¥Êd Zz[AÝî}uãøsáþ™÷‰¯RÞ“Ê„¬~s;cõà ç§Jä¾-xKñwÀ_êš%í¾£§O+pŒÙ%eŒwàî„gŸ¡¯žâ¼ñOí+á'ƒPÔmN±¡]‡Š÷Q¸K;ib™pbg8A(hÁÁ##°ªþ#»Ö¾ü;“À÷Émq}â×·a%Å …ŒFë•,J%Il‚íœßìúÅ~2øl3¸ŽîÛ׊û²MkK±¹6'T¶Šþb¬–2Ü¢HÄŽ ÙÉÏúñ_þñUÇüSaâ+kdºšÂO1b—; ©ý w¾=ðŒ|}â–ño‡ô-OXÒ51Ý¥õ•³Ë° -ÝW Q8éžô•º‰n}¾ø ¤¹‚áÛ(ŸÆsÆAõ8ëõéV¼ª%hIS]¤ pÇN3œöé^ oûMéVž*µðÍämq¨Äée.·ƒìïs€¬øžg~ +Ã>xÓÆoÆ‹8î.îžðßÈ·ö·30Œ&X͸P³Û’Ü|ݸ·¼Û¼¦S(;K!\œIÇ~ücðRRQCˆ<—Œv^xê¥xÞµûDøwSð—ˆ[Á÷’^ëöv2ÜCnö¾[VÜdí`‹–àÆztóïÙÛö„ñ·âë3Åz’êyµ’çí÷JªmvK3Œ‡==qŽ´Y¯P¹à^%QîÀà&¢@ç=%=ëôX—žÝ)p¿ ôîFxÀÏ\qœãùÏâ™â›Ç7³Bñ´-~ίÊí2’>˜¯¬¾1þÐgásè¶še•ž±w{Úgw˜ü®Š/rAè{~­¨¯mm ±¾SË-ÁÞ£Ðsߌõ¦Å BÅ« aÑHŽ‹~N?:å~øý>$x>×ıI“"{x¾ì2†Ã¡=ÇCÛŒgÛŽñÏí%ះ~0}RÓo5 -¶›‰mÙ6DO;v·RçùRå×BïdzëJ<Ш6²rwΣuêFqÛéOóÀ) É…*‘³ó»ŸNzúÖ~w£cÄNóÛJHU2«±”p:'>ÝkŒ ›Åmá¨õw[[£lH”[ûÁ#ôê)¥Ø²>ný®ÂŸŠb³¸’ÎËõèk§ý‰]XñVçÚÂyÆpíü³œûW7û]sñÙ±ŒÙEÉbsËsÏO¥o~ÅA¤×¼OæÚ ªcs ì8äzŽù¥»%ŸX‰Ê´ŒQ>lps„§'÷ÎI>ÕdÞa‚DŽXÈ£޾™íŒžku›9$û%¦§ üÑó ¶¸LÆ3Ï ÇrïéÒ§r±Ë'` RsÈ÷ïM®Q§s OkDVNü2 ŠáÂþÐûçÚ¢º×®ïÓÌš‚g.#ç# óÿ>Õ—,2,BI#dd:®ìõ#ϯSïP-Ä’G$‘Ï,IFÄÙêÜŽzÒjàˆ«>oÙ‹át®ìuëÛ€mõT~{ü­ 8÷¯Iùž Iiw°Âcë€F?§j UNbØÎlôn7?ÐT¨¤6ôפ®Ò}ŠÊOé^òyNäFMäìVSÓ“ÁíéÔÓ&lá3ó…9—'§ ƒÆëE» }ÑóƒþÆ×ÈËmã­ ÞâÎæ?ä^GñWáf§ð§S·³¿»²Ôâ3$W6.Ì„‚eR±÷;ËòªÌêêùýáÀQ“Мuç§á_8~Ø…´IC¶U$®z{.*•Éiá_ ë:ñ ¦‰¡XK©ê·lDVÐŒ–À,ÄöI'€&»«Ù›âuƒ ø'T¹ÈÎëHÖqÿŽKû3+¿Å»­åŸ²] Ù#(‚8çd~5ö3{áPë&:'ÊqèKëíÚ“¾èv¹ðæ§ð›ÆºP?lð–·m€I/§Ê0>»kmUÓÿ×Yß[ãç‰ÓùŠý†þú Wò.¦µ…Ç(’“æc·œ{ð*ÒxU;ɾ¼rà|¯3:äÁ$óÐ úSÕuþ¾ñr£ó¥u+ÛVÀ»ž":‚äb¬'‰µdÆÍJÅó_ 77³]F¿jŽÎõKàµí”R¿lðÊJ÷Æ:t¬{D»F3øsÃ׆B?Öi&3Û!ã®E>i*GÄp|Añ §ÜÔäð­ oŒ¾)µ+åêOÁȈçð5³ûCxoNðçŽY4»(´ëi¢Gû5º•p 8éœf½GàßÁïx“áΕwªèWz†«uË5Òê/9*…¨UêrO4ܤJHó/þ1P?Ó™Êú»çZp~Ó'·b²,Rö9U9ÿÇkØ_örøksoæCmâ øÁMV'ã¿ ONk*ûöSðSK OøƒOa‰-½¼Á²zd´¯\t£™öüƒ—­Îßö§ÕTæM>OR þX­[Ú­÷+I¦lõÎ3ÿÿõ«BãöEÐäG6~?“ à €ÆH9+!Æ=½ëóöEÔ#æÓÆz•$`º‹ðÿVÃõç¶iówA«êoÛþÕö.G™i2óDŸÌƒÇµj[~Ôz+®Ò÷zÊzõþ^Gâ¯Ù³ÅÑîõD½Ñõk[HŒÒ‹ ³æ„ËynªÄ Ž•åº^—}â ZÏKÓ­e¼Ô/&[{{hWsË#*êIÅ+­ì;;Øû×ö”Ð&UÚ,1€ªÈ¸óÑ«F×㶇+‚5ßqäºvôà×Îw_²ïÄ»wxZk¶ƒö;ˆgÁžÍdÞüø¦ôŸk±vÏØ$aù€i^qÞHúæ/ŒºìÎn -ŒËÓo?\¼ø¥¦jþP–îÆâ[Í\–c’Hãüñ_ Ýx_^Òóö+S´Û×̶‘1ùj©ö»ûSÌ÷1qœ30©µ7©Ju"œWSïHõý.å°’«``lu?Ÿ'ò¥7–ò°d݆¡<þ¯„#ñ§)¨Kÿ}æ­Ãã}z܆]FQŽù«Q‰Ìû‘çµ$Ÿ=Gr¤`ñíïI$V®ùˆÍŸ”nÉÇ­|SůÛ·QvÁÏ$õüëNÛãŠWÜïûÌir®ås;l}xñ[JÎVEpNrØÏ€«¾žÛHÕ¬ga "»†@Ø©Ç=«ä˜¾?ø@ó#‰Àã ÿ ½iûE_Àêï§ÂÌ=øRé©+2¡QŦºck³ZË¢éñCq Ü ’UT«GŸàÆÑÇrÙ9?`}m$&rØ/*=‡ç_6GûI’Û›MòÏûÀüxÖ¬?´žœÑ¢KkpP Ï·³§GÙG•3jøŸo.v¬{ÙqJМýãžÿÊ¡`WÊž{Ž{õëé^/oûBè’.Ò÷1ÉÇÿ*ý·Çœ¿7*Ÿ¯ñV¼ŒçæGªòÛr9`§§ÿ<Ó¾×0PË#ät*x9¯:âþ‘9!u(Ènì3Çn‰[ð—6?ˆ’3ôâŽV5$z.‘-Ö¡©ÛYÖµI*Èr@Ïr'òæ­êiwkcà½[±,†&GˆŸ,Ž{õê9ü³Ö¼ê×â×)q Ű’6 ˜”g ðy­;¿ˆo«Ù‹i&‡ÊÈbc#{°\ÄuÀâ°”js§¡×Nt9)¯{¡¥s5¼± šÒÊä5ºÉÈõȬkŸøzõüëÿ hÓ1ù|¿²*Œçý‘ךbêðK€° ãëŠrê0ͰgvÓ‡+øÖ¶ò9nP›À¹÷xVÆ<‘$‘œþ 1TçøWà‰FcÓ¯mAç6÷òãõcZæþVÚéœôêú´£;zªägߟ­=„a7ÂßÂ1k©ø†ÍÉê·Û€ü Ÿnõ\ü7Š?gñ–³#n&Ž92=z èä+¸ÜªÅpOsži-¯„QË$Øwë¹I¸è~†›m+ I6“1Á:ë*_ÈêFT\Y.qÿzoü"þ0û." ¥¶³HŠçô=1ùP?C“‡ãç‡çÁ-,d°Ýòv®Kâ/4ïYB-nbJcÂ@ükÑ/,ô×VûN“¦Iƒœµ¬džþ€þ5Â|FÑôH4v{MÒÊažÊÇ×=zU+ö!í¹ä )€†:ŽÕ¯áíF]:o1l®.¿–„ÿ*ÉäŒv­ÿ ê7V· Cq$-¸Qˆ¡vúwň,bÜi—Qz’„qZÐ|iÐÜ·œÎÙYK«}q1}ªGG ¹bqÔ“žp? ³ku"‰ ÉŠ@Ç >~™÷§b®bø“âF•â x#†õAU¸ýkÚdMG»ø Öµsqep‘9²¶k]ÆFÚy‚Á€sâÏn|ŸY’ Amyimokz³anmàDuùOP9Åzì¤ZŒ–²»4öy™™ÎI8îk–Q4§ñXûŒžsÒšißΚGù¥4(?xezœ{ÓÛ·5—â}E4 j÷ÒRÚÒIH$áx Œ¿jo„ÿ&V±ãR ;=^6»Ó4U˜ˆâ‡?( 2 `Œ“Í{çìÇn,~ hŠ.à³xè£úU¿ŒÞÆvöú6·w+^Øéö–fi‹4°n‹Ï•–Ä4áI8Œ9Êø/C—Àž´ðÆšfŽ <¦ù˜´€úg·ó÷¤åÍb¹TSHíu]VÖÁŠÎÆY‡Hr>¹á}ª…µµÏŠ4ýRYf޳,.–HH;Ê™9`9å»b“MðÞYZQ–êMt†ÞÇN³Y^Ã~é®Ì§çˆÂ%1߆ÎxÆ1Îi;½‰µ¹‰¥øu ä®I­%··•mU ×'ƒ_À?Ú?ÃôëC½Õø+66Ý7g÷Î>¿Â>œûÕ‹ 8lÙV$ 3øš«X“É¿hØ– H‰F^À€uãx¯Xø?_3ËøÂOüwNã^QûIåìtqžº¸ÿÈ‚½[àÌáü‘`‡ÿ„ºéºpq§'JÊ¡½Ýÿ]ÍSJóþº¤ãW5Oøÿºÿ®†ª1[Gdd÷œRô£ž½1TH‡ž("–‚G­1 #O§½<€B¤àS4gŠB3N"†PXù±^‘ðrÃB¸Õ..uƒIj›àyFqŸ¼íÛ¥yÓ U‹iÚ0áIPF)4š³Ü^‡´xÓãdv‘½‡†ÐB€l7Dsÿ«Ç//'Ô.{‰ZY’ÌsPªädsÍ;ª[Y ÍŽˆ`ûTÙãÒ¢y9ÐXÑÚ¬§AP Æjpp• D€=*Uè) ` ‘¨’øšÁ|9o¸íSªé¹#¯üA\߉$^ZÊöõèk£ø¨ðÕ³cq®šqÿo°×=âHñ}lºðcêÿ(™?îýO¹?g[tƒàþ‚ȸiD®ç=Ošã?é5石øÇÂ×9ôsס×ÜôŠ(¤EPEPEPEP_œ¿ðS߇Þðž¿¡xêçJmGQñ k „i]T<1¨Á—å#Â\×èÕ~ÿÁ_d„ü;ø{˜>Ù&­;E?3(„aì &~¢.®i Úò‘ù¹¤ø/WñÃ\j:.‹9Ò­§X.<—ó<–a‘œãŽ=Oš‡Ä~¼[}ZY´¹eS$Q]Û´nɹ—vÓÈ•‡á_Eü:ý“¾*Gà½SÃZÃËëÍ[ºµ¾’æížÑ“ÊW Sœþó?2‘ŽÝÎøùû8øÛ]¶Òõ-6ÒÆæÓÃ:8Óî’Æíä0G‘ƒ"©b# ¶~V8VªpzÜäörkmOž´­2 BöHbÖâµÚ¹³R}È®‘4ÿiqÓ¼U#GŽ|›×_еyD¶ÏóÛ’³`à‘^Ùð´øPøoLŽý4%’9n~غ¤Ï4’Ÿøöe–1à2“ÙŽ *F½LW¡‡|Sã-?U¶úõä!ó,›D…Àçj’-ÐÀ'šÕ“ö’º:4¬ë ¶¼“2=”–/åB€ðÆS''Ûonµç?­c·ñM̺Òš8x¶›;ÉC8ˆ¿%¾fÜó·F[(Ï–Þî1y©H®N$ÌjpO^ôœQ¥Üvg_¬üCñV®Jßk2C0ÛQÇÝúÖÚáeC(’g ¹''ñ¬ë¹ów'rßuöúT?i;ºå{ ~†.Mê} û%x›PÒ>9øEôË‘bò^­·ÉÞ$€«+Áàþx¯Ð_Œßaøµà»'ÄWwwvÌé>DÅYYFÞÃò¯ÌŸÙjõ‡Çÿg%¶`êØ¯Ö=h¥O–ꦢڄdÓ>ýœ|ã][Áž*ŸCÕî¼!£izœúrëÝ´sÉ Ú¯"ƒ½F+‚G=E} ©x§TÔìì-¯5«ûãmk »É-¾ÒÈL®Sæ,ä<õjÏýmUg½} k%צH¹ª²Kæ· ¹ãý‘õ¨‚Ý›IÛBTºŠÉL–öQA1?ëÂîû—9?Žj ï..d¥o›žO§z¥}+yHÉÁïšÎšr±?ïIqÏ¡µHɶϛ¿j6•ü[¡\œÓ ’9ú×Ë:ü,ž1yù¤dýÍ}gûE[GGŠïÜ[ɸ`×ÌÚüßj¶º„r¼,®=Åïa½‡ÅpÁœqÀQVäÔçžÜE<óIœª3– øV|D¤óŠxeÝšÙ™3JÑF³C+E"²²:G"»[okZc‰-5BÑÉݺ ©'×ןß1™N»‡_­t3ÈO–yÔ\¥ÜÜñ¿ÄŸxêµÖüCy©GD§Ú_wL ïø× f¾_‹J‚ y$ÿ«·sZ‰\\‡Úab›ñöÏ ªPÈÆ>Ðí”àñ³­;»}̰@8ÆFx§îeë÷{b˜N±žOZàŒñíëPž–%Ÿ¢?ðN}Ïð›ÄÛGMk¯ý°Ž½SÅ·fý <W$¾“¬Fì|¸OþË^Qÿß“ÂÿÇŒíÖ‘œu½oŰ,ŸüÇ‚šnªsõŠ!Kr¢rZð0j3¸Éo1³ÜŽzÕ)š@Ã+Áç5?ˆ_v³:©ÜCüØç&³æ™Ë·€q“éV&DApNA'ŽO¥A$…ãÚx?NinWd€‚3{Uy®ÆÀ¥K1CNÂ*Ü:¡w#¡¥y¿Ærgðf¤è@ùN<× ^PüüdÐWñbê&ð6ª¸ÃlÀ,yÎ{SòÄ´†óXÖ–éçñ.—o<únœcÂ9Qþ´>yd˜&9Ç^ÕsÁþ"Õ¾+éº÷‡¼A¬³Ûµ¸Ô#Ôï¤"+Ic`7ÊTUƒÆ Î1Ò³þÙˆµ‹ÏK5·• $³>7+qq€v¸å2~cž™­ÅW?ôsÃiÚ^«]·Vòi¶Éj—F#¸Ã.0¸ ’ ÀsRl‰-àÿ…3àûÛû[ÍÅ3j×Kf<µv ˆ7’èê?xIw0H¨uM;VøÏá*÷CÓ­cºÒ¦–ÖëI³ÛB¡ðé,jÄO ÏÖ/C›ág…5„ñΈ×6zŒð­®Žó…È›‰˜I»T‘Áçw¥gxªH|Eà&_éWvzEµÜÂïO‰žâXg` »8e(03ÓiŠ4¼U&‹àíÃ^ñ~‹>·­ÙZ³Ëå]›w³Ü²[äçÛ$\÷Æî¯|Ký« Jþ¼·€é“*À#"ÏM邤uÈ'½nê¶Þ½ð†¤ñµþ£§k¢Õâ·’Ê+½²¹›€Ä˜ sX5+»MR/[\0ð奼/§Á»¢’2€‰½Ý²Ù>¹¨+Àºö¡ ø›J:SI<÷ ¶HH[¤fÄØê+Ò¼?àxoǺæâhõ»½\Þ[iÐ8™ž%fU®61§çÿ-è:çÄ9c_ é:c_K-¥¿ˆ6ûd/"´i3ÅKeb<’0iꀭá/…ÏðëZ¸ñ6§­èºž‘£C4Í™~“MrÛ ¤Où•° ‘€2)úw‰tïŠÞñ‡|?àÝ+ž%ž¹ŒhÅñ©$M¹íö»‡8Ú@;qƒÅex#ᧉüâ¶ÔZÈpç4xŸáî­ñb]7ÅÖ7>­lsk}»¬©ò1‰\Ñ Œp2GjèÖå¿|rñW•3[hZ+Gim¦É°–P2ÄrLƒœƒü\TÒþÏšü&cR¶×4è4´ ò¨(Ô ‹ýi_$ጀqÆyç¥E®|Gðç„<[e¥^x?Kñèimg.¯vdѹ°¦G@fßø'Çãëv°]\Ks© û}t@E»FÌJÄp)Á¡ù‡¡É|Sø—wñCÄo©Ü[Ç(òàTÎD@ ç©ÁäÖçÀ߉‹ð×Ä7ÖÒÁZëQ%œ×2nr²@$gÛ5ÎüN¿ðÖ¡â»É¼1gqghÒ¹“Í”:HûÎ^1€USœzšµðžßÃ÷^5±_æýìfÖÜmòg—?*LÇ•BvŒŠ]Ftüã |RÓõôëí,Y^4·z½Í¼‹h±.L®eÆÖR»±ƒÎF+Øî¿im;ÆZGˆôÏ XÝØkM§ÎÖM3gÍÚ>lü[71ÎÚñï |Oñ†»ãïì-fóPÔ´Ûë©mo´&œˆ‘²¸U<&Á’¶Ú¿áox{Áº¥ç‰t¿Xx¢çE‚k«}Þ £¹iåÙ]¥vã†ÉÇLfšûÁ’~Οµ»_^hê·W^ŠÆIõ¹™¤[xÓ\dõ,Bßv+Ù¾"~ÐZRü5ÔõjnÕ`x"–QnU­‰VVÈáA^>ažk´/‰ÏÅ;}OÂZ«ÙGý£lÏmwmg&ŒùŠ%tPZ2_˜àdÕsÂÞ¸øQ¥k¾'ñZizŽš-~Å—k©Euü®ã '’Ä¢¥²JœƒM?˜ŽÿàGÇmgÅ‘xŽÓÅWpΖv_jMBd…¶lv\u,={t¯š!ãĶĺxxý+Õ5=WKø•àSOðG„#ðÞ¡ouåö—§Ë%ɾ‡C&ì°± 'ïgµxò/“+,‘†FÜr ]ÃÐûCãÇX~Ýi¶XE©ê7jÓÊØÜ/#wÌÇ?€÷®·á·­|}á[mjÈ=¸%²|Æ'VÃ# ð:c§o–´½@¿øk ÏãíRûGÿJž-*{8ÅÃ[ð\ Õ¯-¼5-¡¼ƒQ‰¼§Ô%g"G‘A;YJ…ÙÛ]|€ú'Çßü-ðãÄi¼w×XÉö4V)< ’9ëüë®ÒuX5Í:BÒfûÌbx<¥Á*FTúôàŽƒ“šù+Ä>‡â‡‡üE­x“Nðî·fá5c&ë¡K€Q[he9ôÈëW¼Oñ_øW©ÙxWÃòĺfobKˆ›¢Fó&O;w¦;sJȤÙôGˆ>%øGAÖ%ÑoõȬµ1°$2*›¹`1Î{×þÖù{?IÆOœ2§ƒÊôÿ=«ñ'ÁïüHÖωtHašÃZT¼_µÞÇr‘#*§8#¨Åc|aø„þ"šÓ@\Ûèƒì©|äù—  +»r§Ôô&÷û6cþÞœ-î##ýY¯±nœ> TÛÔdn'oÆ{óééðÏÂß[ü:ñ­ž¹qk%äÇ$o Nˆu*pMnü`×õÍKâ=Ö¥·"ÞàE&šÖÅÂr£Ê üˆõÍM–ì«ö>ËO%É2°2œ'Žz²ýz c¼˜P¤¦Å.Œпþc=«Îàø×¡x~îÃCñáµÖÔEöØ`„˜¡™RþIÏf¼?Åüs¥|DÔ¢÷VéoxÑ ,a£6…Æ>eôëšv¶äÜú¶VÜìS$ •Ÿyއdõþ´Æ¹û<Êë˹Sk‘N8ÿ¯Çƒiãm u(ôã©Û¦¢1¾ÇÌ]Ø åã<7ã>™¯ µý§µ—ñjÁsolt»)ä˜14q–Ær9ÈëúQgb®›)~Õ2É/ŒìžBÅÍš}îܵ{Àû”? ¼9¡ +Æ0¾c¹½sëí^9ûOɾ-±òÙ_m¢«c¨mÍGo¥zg‚¼eiðëöÐ5«¸å|†DG˜æW ‘ÆxïŠ{2z¢òpaß3œ@ƒœþœö?ÃÅ"NÓ‘‘©pAê@Î9'Üç§Ašà¾|ZÓ¾(jqEúeíº+dpÞjgøHÁÎqšè|Wâ½3ÁöëÌgn$H|¨c1~ãèzsÀ¢Ýô[›†_2eI„’HX;(ËâÀÀŸÀñžµ‘>Ì‹&øÜ1óDD†9'#‚9ÏAüëŸðßÄ ÇšlòèÓ5ÀùsCp»J¿+Äñ×Ôpx«ÚÝ퟇,ãUž(çÝþíX‘Ðq– >§Öž¢¹ŒÝ×Âú»•—Ê6s¤`Œ• ‡’1Ç'©üë䯅Jßð¶ü2ö8Ô#!ùàúñÏõ.µªYkÞÖdÓfƒP´û¸šÞ@W"2H ÜcðòÇíñWÀŸ”ê‚@Ï/D|Ò>ÖVŠˆä)Œí^1é“Ô“ž=úU›k˸Õe‚g³?uäFëŸöGOAU÷"³á™¶¸Ç¦9<}=b‰•ÙDûC€pÀàu#‘Òž¥hhÛkú”[Q/¯P"˜ÂÇpÞ§ß¹$ãÞ’ç]Ô.!“Ι.À)wÊ¿ðqódw›ÀÜŠ$÷UºäØþu†><âYÀÐòÇ“ÏÐp;ô4·1g±Ón¦&ãGЯr6ùrhðgݸŒg¾2sÏJð_ÚSº=†›¦ê~‘a¤\<Œ’¦Ÿ”ŽÈàpF2¯tœˆ!Þ¬Š™yÁÏvü1Óú×’þÓ’]xCMf#ËûAب0£äíÛ½+$'{#ðÃ:g‹¾!iznµö–Òœ¼— há%eT-µX‚H88ÏC_@Íû?øìŠßX²e@NÍE$‰û¸1ä`ùWˆ|e´òP8ògOLùm_SÌ©öR…•¶«©?*€:Œwÿâ’W<ÎëömðsdëV*T²™`†PÃ8ã•÷ü»VDÿ³.šØþ,™Ç¿ý'MÀ^ ížÃ‘ëí^ʼnPÏeî²8$)À'® è?$iY-u= í”â÷Ëãþ¢½õ˜:”ù¹»#Œ~çœòI÷b‘gÜÃÌEQÈv䣀M¾Þ‹yŽÇÉþ6øm®ü?òµà€$Ĉ嶸IБÔnRqø×-km>£uµ¬\ÜÊÁ#†$,ÎÇ rM}ûBÛ$>²Ô‘/ÜÉ%NÞO_zòß7Vt{›)^ ¸DÒE,mµ‘„MÈ=»ÿˆëCB[œýß‚uÝ(Ÿ¶hš»Aómd\pzZ ð\@pË,G=ÁZû& ^þÖ2Âæé@‹nÅÎÑ×$vïÓÖžºî£qn³·‘z7 =xÜA®h³]AÙŸ%åÊ%Ô‹ƒÿ= XMkQîÞMÿ}f¾±qo)ˆÜØéòí\O§DÄòIÎSžxÏ^1T§ðþƒt®.<-£\¹d[P1ÉdÞž¢G̱x·Z·#eô£õ¡ÄŸÀ>[ö#©Ïÿ®½Þãáç„å+#ø^ÈEŒºÁ<ѰbxŸÀÒ¸/Š_ô#A7ºEœö¤€{†•s·##Ž}é݉£‹âþ¿ oi–G=Xõ«|nÖPÐÆû{àé\_†´„ñ‰4Ý2KkÝÊBó•Ýå)lÇ| œW¬]|ðá25‡ˆµ?(gË{«Ô°Î`%àŸN{R»eÙ$d¯ÆÛ¢Å¦³W'¸ÀÇÓ«Ð|t ¸’Õù98ÿõÔSü _.6‹ÄÖ¹u,{IN„õªíð UxÄ–ºÞq1Eß$±d÷£üißÈŸ#fÖZ)ŠXÊžzœŠ»mñ‹Iò”ot>¬.ÕÇIðÅq t].`AÂÇ©C“€°õþ~†³fø?âøICšlÏ #”qÁV9çŒ _!Ýž§ÅMáNoŠ}ÜŸAÖ¹¯„÷‰¨øßÆwC-¶ÅÁS×3)¯:Õ¼¯hP™µúÎÿ-&€…üúWi𺟈:(FO3(ü(v{zÜöfa Û¸–ù‚Žä{ëY—s)šdÚŽ211ç¿Ò¬ßÉäFäŒpK(\}Hü+›Ôïò…pİÆÀ<~§ƒùÐÛ©›ˆÚ/1QÍ·nÝÞœõé\.7éæ YÓiü¾•»zâ{V”¡ [!~×Þ¹_’lù€€ã x<Õlfö<ÝÕ?áZþ»m£¹Î+%9ÿ ×ðÐÍÎ:8àdþ#=*ÏX!\ uãóÏ¿5£91§1¡ãàšËÓD…J… “‚:䎃õ­?+–1¶Õºð>¤ûf¨e-v]Öö©ÀË(¨ ש~È`ÍñesÚÎ_é^G«áD •b_9†ÓÅzïìn¥¾+9ÆBÙËŸüv°«ð›QÒGÜ úu Œ \`}hj Æñ“XÞ-‡í>¼€‚Âs $á§­lqÖªjɾÌ(ïqkÓþ¾b¤öeGâE/Ù_ÏñWÆ—šuÕ/ ×$k{-¥¼çD„*`rrW¥^ºÓã¸Õïå†"¨ó»…nª¹Ï?JM{Q“Oø§ãq¶gó5‰¥…­ÎÖ;J“‘Ž}úS%†}G?keH³Ÿ³GÂgý¯ï~<{TÅž–o|»[‡wº_§÷éõ§ÚéãÏ3ÎíspG2IÏàaì*Ôq,*€ éOEùóVI€oãŠlx –u*ب*ýi“ÔñïÚ<â=ö¥¿þ†+Õ¾ Œø?OnÍâÝ@ÂÂ1^QûEòøm:nÕ­‡þ>+Ö> .ïérsƒâSOô8«›Ñëýv75 BïŸùjÕL¯NàU»öÍíÑõ•¿U# ÿZÙldÈñœúÓHíOãjÉ@Ûý)S½(ÛœâXAA{Ó¶`gµ c1ó~µ£pö6Ïfi X–,݆'œp*ÑIqšBXÊ1VàŽA÷¦(é²É5”M·ÍeùŠ .rz{UÕâD±áQ²¯E• JÕNÞ)Ê™§F8ð)ŽÝÂ5ÚjLqB/&ž}èÕS÷~´È×½L£‘I°%UÈÀïOˆ‚XÓ­>ܪ8fÆ'5—¦ß‹­nú1£ ¨*Æ/ʼn×ÁW7¢¹O¸µÔ&Ž"¡ŒP\Å4¸Ü@$$lqžqŠæ¼Ewåõ¬Öò¤ðL‚H¥ƒ+© ¤pAƒ^¥r21^ cge£ø£Ä:E†È-¬µñY£ä[¤–ðÈB®~D24¤Øé]Q´è¸õŽ¿'eþF2Òi÷?E>.ß„^?u'þzô á> |'ðïýpoýÕÝמÎð¢Š)QEQEQEQEñü·Æú§„ü1à›kMBþËO½¹¼k•ÓîšÝäxâO',¤bqßJüñׯ|DºÒй¢Ç…t¹í¥`Âi&O,s´¯Ë¸Ã 28ÁåÍpÏãkl“äÀïúæ+—ÊGW@’ƒâ%·& |ŸÃvIY!99jÙbü…™ÆwO$vªÑ¼â¥Ôý®aŒaÈÁúÔ1å˜Ï­%g¹›Üõ?ÙŽ@?h‡`aA×-FHëóŠýkÕ¶>|Ž6 üŒý›ÜEñãáì„áW^³çþÚ¨é_®Ú°ÎŸ8Ïð7'éQÔHñ?€Rþø¹ºñ†¶¿ù[#ó¬'›k1 …$QŠ×øD|z9Üž3Öß«B­a1sò‘“‘·wó¢=Me°“̹ ’TçÖmÀ£¼’C*{µ`ã9ÀÏB* w,E°Lð*¶$ñŠp}§L¾óC7îóƒô¯‘Yd¶Ô&v•ŽßNk쿉0,–Wä.£b?Jù\³0ÞûªA¦´+Æ@UïRÝ’GN*žâò©ÖQü@ã=h$IÕM»õúVÙg–Þ''pdðXV,„<7(É-Æ+nY4ûiwdHõ¢à¼ÌMra–B]U”  ߟåÅVÓœŸÚÆèÿ»Š¹®*„Ú쥛…×üæªÄ·ˆ,YÈ@°)r[ uæ†4Uu!˜gÓFw¹õ§Ìù”°ÎæÔTc;†ôëÖ³»HúÿÞgÿ…ãR?ä)$õÿR+Û|Ii#ügð܇,SLÔzz„W‡Á6>ñº†ÆÍJݹÿ®-þô&±Šº+Ž6é·ß1Î9ò©Žže¯mnì 1Æ¥Q– »=G×JÞÖ4àšÕÞkobO¨Íb×ôÚø[ÃïáÿIi¹V;™.Ì!Á–8Ãd£mçƒÈR+áõ½Å׎cnkSSyTù܆óc»œwÎ1[BxkE²×õ_êZ¥Þ³ihíßÀ˜",åB¬w0Sõ摢أá+qá ~ýºÃE@Öò¬¸[­ÇýZ¾2 nÝÛwÅ\Õõõð/ƒìO5ËÕ°»½Ýj%~ÍteU]‘:©8\F<úS<;ªÝ|Oðε¦x“^ò¢±ò¯-u}EšD·mÛ3·$‡ Ðr¹«+|ßüi—:_‰N±v|Ë“mö‹HÖ%»Û*ÞÙðçƒõ{ý¾,__èÐKwkblÞÞTe8»q °ÜuÆqŒÔZG§Ÿi2j—±éÐ,?hºqr\L±F„ž2ÌBîxê^ ñn‘à{½/ÃZ·…t¿ÜhÖ±Û\^Þ<‚MÄù…cda•MÛW9Üò‹ )u ޼÷w“‘0@…ÝØö 9'ØW­ëíàË ]LñÍŽ¯?‰-´ø£¹¸Ó.ßÈ%"™6Þè„ASÛµ au(øƒÀ^0Õ¼z¾"Ñl5+í>úé/4ým`c ¡*ÊYÇ °ž6×E¦êßoþ%ù¶zv¡ˆä½v¶º{˜ÿ³$»9ÚÞNÍê¦LóñßÒ¸ïø£ÄšĶ]>ñâ)4'O¶²b-æ‡ ä…NŒ¬¸#œœ÷®žO‡¾ 9—IKq‡ôÛ‘hº\‘'’˜B˜Ü”gp9æ«mV‚ÝÄ DÐèšî‘ã“ý©aqoesTßBë·ÚD™$`“ü8êÅqOÔ~†ï‡¼O¤ø¿Oñ‹áÏiþñþŸ"ÛMe4Ò…F<ÍvŲ́pWãë+áׇît[Ïâ»Ý?Ã_Ùþ]ÔW0´2M)``ïëÙìÏZ×ð£x7I³ÖõÜk7~*¶Ó¦{huH£UŠ<,‘2³„,p@ã=Meø^Ô~!éÞ"Ð|G­\\i?`kž½‘¥[ c`Qúä$¡®zq@ƒíZ&—ðïZºð\ÚŠß5Ä1ê^ClrWa@>Bø }BúךC+™ÄÆL8;ƒ“Î{õM.Þ…^ÕµÝ]°ñ&¡tcÓĶp»Cf–c*Ê€m .A{×–#5ÍÙ“ËVlï*Ê{šÝž¥}myñkÀÚVµ­kvÖz®Ÿq&œ/5YŠ­ìX¡H—BH'¦ô«牥øO¡h^µ·Òuï6Ô'žúÕnà&Vá!.>è 2F2MQÕôí_âÿ†ô‹¿èj?³L–·:V—H¢bw‰UÚžIȫڜz/‚<)áíÇZ%Ö¯«Æ&š;[kϳIa°*Ž@9$‚ÛHã=iuó†øÃž!øÀ4Ÿè¶kŽîÑ`žÎŽ$µ–#°¤JÅ~B (ã8©|O¬xSÂSéZˆü4|Kªév)Õâ^¼%\’Þ^á¶gÒ±>+\Í©ŸÞè‘M†Nœ«c‰· ‘*HWø÷ä’z‚ kx‹Kð¾¢ÚÞ4ÕoôOI§Cö”±´Y•”d#Ë’ ¹M¹Æ}zÓÐÌø°5í_Ç««YA3ØÝÅo.•-ŒL"Xv(A©>àš«ñ”èÏâ7’5¦—Ã>¤òm'‘5£ÈŠìm¥˜ãœã­Øæ4-[W·¶Õ5A¤Y? xЙDðƒ^½ã^&øqâ—м3?ön‹¦E [2,‹pª ù¤~ø9Èõ¯#ð÷‡o<]«Ûévg[©TìûLé p2rì@Ÿ5é^1ñ¾áÍrÃEºðÝŽ½.‡ 6SêM'#G÷‚@Ú:ŠØýgá Þ0ñbßYë:^›i«²^}Jô%͸‘C0(A-‚NÑÔñÅ3Wø±§é8*žÓ¯,ôé’Ù/®­‡ÛJÅ„ó wü¹èj‡>x«Äþ3¼Õô­2÷T°¿•.-u;{vò\@X .ÜãÛmmkš§€Äº½•õö¦“EÕõµÊ-œ³( ÌSi%wH<óOÐ[îc7ÂÞøèKkevðËx“¦°ãªä:ÈÍÛä×Gˆ>ÉñÊB˜êbù’XÝ‘fÓç +ÃÏË¿œ zô®*ûZñ]¯ÅiáI¦—YžÒ9Å+nàÎ ‘À×HþðeÏÄÉm ñ /[þ%MÚòO’’ƒŒã$¸Å/@õ<ÃÄjvºåüZ²ÌšŠÎâq0 ï w}ó]—Ã{7ñ.‘â]7R»’ [[%Ä÷ŒK¥”¡ÀÕ{’IGQšæ±mâ=.æÖóZs®™t¦9UYd˜ƒÈ䨸>•ç>ñ xgÅúf¶Ñ<Éer³˜•°Ì`{èb¼—Åži4ëx“áv‡©À~K¹|àœü ¡ädàîö®gÅPøCC¼Ó4ÿZj–· „îãIºXöœd#n À'®G⬷Ån˜éÆ›OŠ&!jPy{Np8'ÔWî;t4>©?¬0FD7 23œDÇ{gþ1h¾ Ö›F¾ŠæY„éPåäê; œzŠùoOÕ.ô[¨¯,.¤´»%&…¶²þ5êž øpÞ/¿²Õ¯Á¤¢ÁæÝBîr_=@$œcµfx«Áš×Žu¨5Ý.ÚK¸uˆ£¸Y‘]\Œ2ᘹҨϣíî^òxÈHp LÙ.?Ãײðìvé«6› Cqrd+¾A÷•GL™ëï\OÄ{mSÄž'›V·‚ïQ°»T’Öx g *£¯#Ô;-XÕÞˆõ/ ÿ¯8e¸Ã}‡‘ÏNç^]ðQö|FÓŽð™I—$ãƒqšßø—â׋ÂÚg…µfÖ¬‘í€á$Û‚‡<î÷Ï¥r_ µÛ øÒÎÿQ*Ñc•M¥¶–”BE'ºésê7fŽÝ°5PÌ# ßÏ\ñÓÐsÞ¢ˆ¼ÈªÿèÛÔ!Îx àŒüëÃþ)üKÖ,|\ÖúMì¶¶ñ¡€ðÞheÝæÎr>ƒèþñ„¾Òo5*Êîòô™B™í¥aN:ú´[[ újt¢O%7³™$—©R9àd~TŒ cI +“ÀrI õã¿ÿZ¥†ém‘ä–æs½~yB».3§ãƨ€Æ# Ÿ$¢ ¼€03é‚8óÒ£ŸaŠWHò“Íè=}Æ}:Sf’(•<¦$£z2*¿™ÎNßäUQRƒ9ÈR[ôÀ÷ÏÓÕŒMnH“~¢ThÚÙã¸Üq’9®àKµ:,,ãO|ʹüº×eâ9Óû3Pƒ$2ÄåC À g޹§kŠød]OĬ„¶±$ñ8sRÁjÙêš”ìUœ³G¸µTnϾkŸšÚAv“>ЖÝNpNyB}ë^ô¼‘ã22º®‡-Ï=ûšÊ¾·Ü¶Ü¤Y@_‘Ç$ýúLÓÐOC*dÞÅP™R¡B€ß_nÜ×7ãg/¥Gón'=±ØþuÓN²Ü!c‡Ïƒ÷nOjæüo .˜Œ1¾[1ÇÊ5¡æ£>[çÚ¶<0¬×'zjÈÆ#~=+cÃ$­ÁÁÁêVàz5œ€ÀëÕÔn#n=_Š5xFYOgŒŸZÍÓÝ dì$ƒÁ~¼V”nÑmÜÎ à»··¥2ŒÝpôPWÌsÓî×°~Æ‹ÿBb8Å”ŸÍkÈ5ŒâÐ’Y·¾Kuû§ó¯gýŒ—?ïxÇúÿèKXUøMi|_yöÁäzSy§®6úÓHéèjˆÖ«Ýò¶Ã±½³ÿ·¨ªÁàtæˆK{¦«`ƒ¨Ùqëþ• Kب"DoøŠL ͩܒí£U#ÆqVµ›ÄÙõÔ®¿ôsÕcÈÖĈ:f•~Qš?‡Ò Šb#¸5|Ê*V ±2‚ GŒ~Ñ2âÿà {êÖçÿ¯^ø"ÉàMiûþ%ÕßÂÚýkÃ?hë¾"ð¬çPŠ@=Í{gÀ†øGÃÖájú¼î¸Æ3·ÿ+‹DmAïýv:+Ïøý¹Ï¼oçUÈÅYº¹œÿÓFþuVñÙ‘míA\ Sÿ ‘T"A³á¿ÄP:ê\S ¡þµÈÜÛ²»¨ƒó sþ£»6‘žCÉÆß˜~Gš†hÿÑ_†Çaò¬Hû½p8ïÍU»û­!8íÇLÕ´B<ÛÆ1Kycr¤»“žOkå?A…õ± æ,°c_]xº0ö÷E1Ê‘¸|{ñìÿmZD+.@úQu¸=ŒëkXf×­ô†¶2]L7¢£c#qÉ8Æ)‚;)Õ–Ò;¦ ”uhI$ñŠ4”–o››‰|Û”´Ý tv ÂûñZZv¡ý¸×\•ŒßDàNˆ7+ýå'F@Øš4…y|5Þ—su ìkoÏ6P¥¼½Ç N3€Njݵ¥ºèðCmv—2BpÆ0vªãï1=9«^†ëÂvZ¦£oÙËoö9m]ÕÒãyû‡¦FsÛŠ—J·±ñvºvŸöY ž9®,¡g”ËnRr~VÁ#Ðçµ™«h“ËH²A#'ð#n8=øíYwzUÍõÔB?žáí¼¸àPY¦l‘…¿5ê>$ŸN‹Â-i¬G:éi2Ëi%–x¥Ù¶@ ä#nAîq^5·];áÞ…¨øvi$Ó^yažíÀ¬àgcã ÚF;})m¨í}Žnko²[Ù[³ù³Gn‚LºÜ’¿‡ó¨GP+[]Ó”šXiI汎ivò“ž;ãe8äPä‘ ûûþ ¯ ÿ„7Çkœ·Ú¨òŸü+é-IHø‡§IÙl.¿ô(«æOø&Ä›ü5ãÈóÒòÌçþÙË_Q_'—ã8¤â=:rI÷’!R¶*žw­Ê¥pêÊrØùG$çÖ¹kÉHvÚ»NyÇzÞÕ${vÁ0»Èƒ5ÏÞycxn0:wjÒÂlΞr²œ $ã¯ãTæ•emû@Á<àÓ§!ˆ#9Îr;b VD`Ç8' ª$eÈ$d þ÷zàþ-Þù Õ² Œ ã«·»,ë•F~ökϾ*ÿ¤øOTgÚb RNi ù/áþ±uiã8tx^[½;Y™­otø›b>TŸL¨%íŠè4ßYü9þÕñ&™â7Äòi–íåÁ§îÝ9Øe#FNFpMs¾ ×.t_I¦EI³#Z»ÇkˆËEhØ ÊFþ@ûíjø_Â:ŸÃ}GSÕõ³M¦YÚÍÄΓ-Öï‘bu!XI8é×4VÃì5­Sã&©h™e©A²ú)­áŠÊB¬“…6CãêK[Sð³Á“Ûx³H¶×#Ô®ÒKM5®÷B»º‰mÐæ ªäoܹÏ'œsšóoxfïÆºÍ¶•i5µ£³ón&X°2ÚXòÜð£“^»kñcÂ÷>û ð¾›m'Ú ¤>-a'ÛÕ‚˜Äî»¶3äñž}y¥è&‹ð¾óá¾½q®Ýk:EþŸ£$³2é÷é4³ ˆÞ!ó(mÀ6F ÕM+_·ø…¦kÚá½7úÅÕ¸šÝ4„pov8f€îcŒ©$c*3SøKá_‹üâãªø‹D¼Ó´(á¯o¯-Ø[ÜÁ±·¨n„¸ òjͳ¹ðÖ¡¦k àí+RÓ5Å´yº¼‡€ȱ€†ÛêN@=(^@ÃAðô¾ ðö³ÿ ¶‹¨C£^˜’+Qû‰d[!ãbáwpF‰.ôÖð»x=5 M3íÄjPÝÈ$œM³÷E2»ÀàƒëKðö8|QáïØx“SšÃÃðn¢êfk[ûP*–ÜPGö­ a£øgàá/„5ѬZk3Éms¬CnÐ>mб$d9'±£N€y¬ïlÍ:\5¼ñüÑÈŒUÃz‚:zõm{ÃOŠ­4 _Äž*µðι`<3Z¼æp¤¤s¾Ï¸Î¡r'»×—é×:eüz«¤w6¬%U€aÓå<¡¯ZÕ~ë¿­ôïio¦ÛO}hê×Q¿ŠÕžXþFxQÈÌm€@G¥ê3]øÇâ/xˆxrÍ‘ü?¢¼vÑY\BŽ^5,Œ‚à’?Ä1Qÿ™½·ñŒZ¾­c’³ ðEüoŠ/õ›L9ßæ1Œz•>¿ñ Cð§ˆít[ß ézûèë ¤ÚÅâH·lÑãsä ÀðäVtß|skñk¶–7—0‹å½]HÛÉÜ$f*íê:CóBþñ#Gñoˆ5 >×ÂzFƒ¨ë =½¦³h]fIdfðÌSp¬@nàŠÈð„µ¿j—º‰´Ký7ßaš-D]Û´itŒ¸#‚ìÛJ‘œcwjÔÐ.¼ }ã¿øGìu+]u¼öÓd¹¹F¶iðÅ0¡7)'îŒðHÍs_õSÄž£¢jÚ•Ãè÷V“}¼]LJÛ„„¸9ëªàONôv ßSŽÔå²}NwÒãžÚÍœ˜c¸<ˆ¹àdß½XÖ¡ð—ô§ðV¥} µÍÛ¶¡~ø†ä\*±¶ÓÂX®<÷çú¥½®ªOŸz5+h؈nL^Yvb„œ}2kÓcÔÇÂÛK¦I¦k÷zåÙ’[©-…ż Ý‘p$Ëœû  õ°ø™ám[ñˆítN'–À_j!ݯ£R]Š‚IRÌ»`j·âj_ -ô i+¦jVZ “u{b—1]¼Ä³IðHNÃÃ&Ÿo#Gj¡@’3†V9ëÖ·¤5idk¨çe1³¨à(ì1ŒU¯xÇWðW‰-æÑ¦™ÍÑK{›8y0Ì-Ž ô¥ÔzØô›] á´¿'þǾ½ºÖbº•í4¹àC¦ÜΠ•U•`…ÇÊ¥y®wÁß|Sâÿ¯‡5WPÔôO̵º±–Ré ráI˜ñ¸ÛkV?ƒÚ_'-âM/ìÚ}Ë\¾™Ã@*fO((\`á½y¦i¿¥ñæµ>•{¤ésjé%¤ZŽ§Ç Ìlÿs.«–à7r:š¥÷ 0Ñ<§ü;¸½ñ.ŸâÍ'ųi–’K®˜“WlF «"(*@Èã Ò|aª|]±Õ¼5=¶›e}-·ÚmdÓ,a³I"¤Å¥s‚Ü4ßü<×~ëW:߉¬MŽ‹em(ºhä[ÀË´@6±ÎòÃ'°õË-oÃÚç…µý?Â~—@מÔHíöÉ.MÌÀËn9CŒ1;¶öÅ-ŒÑ|3©|2Ð5½SÄÚjM¦Þ*X¦—$Áã¼¶ðKFÙPsAÉã½y“ØšŒ²\Üjöñ”IY>QGåvƒ“‘“ŸJ‹WÒõO‹Ú>™â .lmu÷i÷{:Û¤å0Êéž3†Áû¹=iˆˆüuªü7]'Hðv¯sg¤-˜/¡ ûHNùsß+·'Å&½à©üzºgˆŽ¯¤i7º¥¢¼¶º•É…×)æ'ÊFÖÛž£“Å?X×-¾iš7†µé>&º·‰®§’ûsªNDq:‘ò€3pIª^2ðŽ·ã™¬üA éºž“ui¢ZÄÒ FAµ¡8èÄPöÔv5¼Qñ x[ƒÃ±húf­6²\êv‹4ò: ±Wa Ÿ” \—Ä­ö=Yõò³K¤ënm.§ ³«Û[¾T0À•ÔxžûÁ¶7V›â]6ÿR×-,àƒP¿³ºØ€ÿVP˜ª¤ägoã\oÄio¤ñE×Úµ¾Ú˜ÿÕ˜ ƒÞßtŽ;PöÔKts°ZÍ}.“V>!° I´òžRÉŽU÷wcˆ#­y^—­_xsP‡PÒïe±½ˆ“ÀÛY3Ôgé^£â‡úw‹u[MRûÅšg†õ=ZÞ+»‹ E%Þ$p`UH¾ði%1³#Çþ6ñ‰ñétûù¬"µxÒÂÞÎF˜VÑüJÃ\Öιð÷ÃZŸŒ¤ûgˆí´;»™b’çCòYš7|‰%ÎÐrO^™¨¼AñsTð_‰Nagiý›£²ZG£eÓ•‹ÛؤòFªzçÁÿëôÚŽž‚âÂõ–ñ.e¹A4qɆˡmÙ\úsŽ*¯ÜKȳqñ·]Ò¼[5™C‹ É·m1ãÄ@ì*PØïLÿ…1¨ÃâÆuÔ¬ãÓbº34¢é>×@ïÉ‹ïÇoZ–_ˆž‡ÇÍ?†mn„(?µËÈ&%0<Ò¹ H#8Çj“¾-Óþ ­É¶»Ÿo.š™…ü‡çq“yÛ´ç¯J˜z¾;ñ=·Šuû«Ëm>$y]ƒF0ò‚ÄîV9ë]‡¯àÕ>ë:&¥-·ˆG-ÕÄ,ï.¡l®K RHR¤©ÂŽ@ö¬ˆ  \íNöó<Ül/¸ò€àûÖ熯ìü?à[UÑg¼“Å%—d ¶Vìß3ÆÀäî!“ŒdŽsK¨tà½0ØøoÄ_ð“Å}cáÇ«/–Rg¹”1ÜvO@ÜVåö…¢|<Õ¦ð4š‘’[˜cÔâpJØŸ9>  ­¡ëš×Å-UÒ|A¬M=¥„qÝÁ©_Èω iÇ!\`£5bÒÑ~øj÷W²Ô´ÏÞßJ–‘½°3Û[¨ùÏšŽ bÈŸ^òûÃÔ©á˜äñï‚õxuíWìvz}Ä2Ûj÷¥¤X¤|«E˼àr6е3Åð¿Áms j–úÝÖ©wäKªÛÆÂ(£r!ÚàÍ’Ä‘Ót5(Õ5>¸Ó­íl­õ*hçKk"³†â7ʱp6®ðBàžHãµV‡Jo†¾Ôm¼U¥Åy&£qƒMiÁÛåîÝ/™§œ`žôuµÅÎ¥ñGÁm+ýš+ÝRÎĬ̓ c…Þ ¤jàôÝ2ëUÔ!ÓíbónîEe‚åA’@‰®ã_½·ñ¡ÒÆ—gixÍ{§C#Í!v_’RÄ–e‘þÏã^|¹ç·ö ×5,hõ_êZoƒ4-Ãî…·«ØÀï3ÉpËöO4î!CƒÉÎyW¶ƒ‚O|æ¯jzW‡î|7áÛêwÚf³%¡U[Kq3´±JŒ¼ø%Ô<;¤ju‡ˆô»kU°¶†Éí®üvõ|œ .î¼V/Äû›Ûï5ä?%…Ì1I`-w,i"xÆ1Œö­ÿxgGÕï¬/|Câ¼9«ÝÙC%Í©µirøÆæ ü¥€ûÔ>-øƒ­x+_þÈÐ.$Ó4Ý>(á‚>J $$ŽCgpúÕ>ä¡|I¢xnâòÍüK®]išãÙÄ׉oj%O0Ž2sÃ}þ•B|ä¯Ìã¨*Äg’ÍÒ¹}/Gº×o£²³D’áÁÚ¯" 8êÄ é>#ÙÏ}¬6»¼ÚN ‰5¼½V0W˜‰õRǵr!B%w|t@Iý*]Š[­â{ÃÞ½³Ñnô_Ïej‘\Ü]HèVNK"<¨Îî1ëX_âÔ¼[®&µgk5æyFÝ-!fKeÆÑ`ÛŒV—Œl<>ÿÙ_ÛºÕ®¼,b[‘io½Ùn9ÞÀì>µCÇ>#Ô|;­[Xè÷·]½´MeäÊFô+‘'I$Õ2úËAH¢ŽÍfŠ;ý:ö>Õ…y¸'÷€EÎÌ籨’ÔÕlywŽü=c£<3Y¡kiãóce$‡py>õå¾5->›Lì̃û‡CÈÿ=«Þ>&YÃ¥Xèzu¾&¶†! 1€HÎzþ•áÞ._ô(FÕ\;Œdðy5Q3’¹är¦ÅqèEjøq$iI¿Ýªú”JBŒ— WG5Ì”–vÀyÌ/rOaFÌͺuÍÜŠvç§RMtún‰¬j¤y6BfhùñŠë¿f/i~7ñÍ•–¨7Ù¤2\É<˰|±ç°$äû_wZivz}¢ÛZÙÛÛ[ ÂÅJª¦¬[ÚGJPŠWW>‡àŸãŒ-¼Yâ[øwÁZI1Üjó¯7ƒ“ 0e“¢ð¹Š×®ü8ñ—޼Lº†‰¢Éáÿ Yiéa¤[Ì¡d»]ÃÌ»qݜƋžs°òqšó}á´šëxƒâ©Œ5ëC‹}&=§HÓQƸI ÿqˆÿ-:×AðŸÆWþ!ø™}Èy¼½6Ýå¸cÕÉ;T€ì8 Ê«V×õùú4UŸ*þ¿¯»Ôô Že”ç¬üê…K'2?¦æþf£#ŠÑld3n:Ò`}iç¥ 1OpÆ”/µ =é˜ ŽMsÏjv9¥ ùPx¤=}ê`„Ó]qïô W" óÔÑ/"š5,+óÓeÕ"ŠP˜§Í@†ãéBàÓ±Šr®M0y©PsÅ"/OZ•‘H³£xm5]XÞÊ>Kh.{±?ášÊ°· ªj8‚]†¨të;¡ýõ㓤ÀËnò8ùårç4t½ã›ø–¸ðõ¯_ù éú_o\§ˆÀ>$÷þ•×üNñNÚžŸñ7Òÿô¾Þ¹ æñ:ž½˜®‡üú¿Ê$ËÏëÌýðÛàOM6ÛÿE-oVF<ááÿPëýµ¹\s (¢Q@Q@Q@Q@|×ÿð¾£âÏÙCÅ–ºe¤—·0Ëkrcˆe‚$èY±èIôžÕô¥r§[_…^3™Ø"G¢Þ»1èÎi=‹ƒ´‘üëêþÖlddŸN¸‡]Èy¬Ylnbùd‚T=·)¯^ñmíå¯ÄO ÙÏu£l IîmüòÈß3îÜG!ŠŒ~"©_i+=åú[ê¦úÒ4É . &X)à ã®ÒzéW¶§┹Qå,Ò «Î:‘KåQ\ `íÎO¥zŸ‚ÚÓÄ×Óéש7ÚIö+†Pc[€»£ê¬FÜñÙíUŸJº‚Úx5=&ÞÈ,‰•hÁi$9P ‚p9'¯jwfv]7[¦}Ê¡pÁ#Òµ.åsu¥È¸vŽÕv‚?»ž·Þ/Û;½3Sº6þ[ÙvŽ]œoUî# r3œ`eOmk¥èqÞ\iÖÒ[µ·Ø–kÅáÞáım<¸®p¥ ”‘Œ· ©Ú%ó­+ÊGã#¦•Ûƒð«y_cm =ˆf0ù‡/Î9o|ÛµD‹¹IÛîh1:¿„³_‰þ˜íÄzÅ›’zß§Zý–ÔË:ôûÊüdøu)¶ñ߆¥~ïTµ`牒¿hoFažw0Í-˜ºžOð«÷>øŠ9þ»¶éëmf¥qWˆeÜêKŒŽþõß|9O'Á_vãþFK†>àÚZW,bYK…Ç¡4£»7žÈϘFq¸tô9ǵS¿$À]xlp=jíÚàã9=fÝ+2œä®2ã´ì=º×É:}¯ö÷Äm©óç\àP ÏÕ¢¹OiÎVŠk4IÚcåàî&º='È×5 ˜ìàK[»Èå6§yØd 0~îî@ì ÕÉk×× ñNItÿ’ìÄ‹Žå û+ªÐ¬`k»²ï{ˆc–K[b¼;('hló€|TXƒ|2 0jð_[ʺkÚ•¹IF[ Ž[~]ë[ÃVÖ¶º%åæ•q4²­Ä)s$‹²Hbl€FBûTžÛ‡­eh:ŒúÔwºuíÌ“ÚÝÀIšRXBëó$™ô`û[¾² éêÏ ÚÜÏŸ"Ûþò2²á†1òðëŠב¯â+{?xZûO¼¾‹LžÛËš×Qº,Ѹ~$ˆÉçj¸ GzâõK»ÿ†¿ím-&·Ô­u{Ÿ´I8O6Ü<\(Rˆgõ÷«Zµ×Žü9¨XY¢.¡§]ùÂÀE¹ŒåOü HzéQ<Ïà†ƒGñ.šo#¾½–Ö2¶Æ„ Ú[#@<ñè({Ø»Üæõ:{+m2æáÑå¾µ%U²S,F¡ã8¬¡“À­MYîîá±¾¸R°ÜÀ<…+€‘© õÖ³€Á$`J»™3îßø&¿øÝþ“bGýñ5}_z k³1ùGöt£ya¯“àšÍÿŸˆ+ƒÄöÿß3×Ö÷«æk$ut€ëæÃFÉä×±âúè%UÎí\íÚ8™¹ã®s[—ñ4WW8fbpOëX3“±™”‘מõ`gÜFpI g…gLIúŒv­î¬ñƒÎxt|° lzŠ¢H.f6JýsÞ¸Š7¼5ªE´•ò¾ö}H®Þé÷Ì tÿóÏŠr§ü"×è3–N½ÏJÆ|³àR×Bñ\â{XÅÕÛ<6šŒ„æÒB «¨èy#žÝªß¼1­xgÄ7wþ™wi¢-¬ë©=Äl©,EH!XŒ,Wiõæ³üÚ|^2s|²Kt$o°p°‰ðvù™íœcç­OàÍ[Z×¼Ew¢ê×W3ÙÜC4wÑÜHJÛ¨å¤Á?Œ]k®÷K$ú³ýÁ¸8f„L€_»ßõ;Íx?P×Ç’iú¸šæ9šxu;[Æo,G†9ÏM½Aõag øf=KUðî»>¯¨ZÛæžÓìÏ $+HvÝŒþ¹íZZÅ/ø¯ÅE×îî®t½Aä´žÑP4+>Nà¡çð5‡áGø}5î¾ú¾‘¬ÃenêÖö3yÞa|&ÉQ”|¿7=Gª_x¬C¦kzÏÅ=TÒµ}S|–¢;È/o$Ûd6²6:ÜÜU…ü.ðUÌWQé~ Y¸+e…ͬ[# È:m”oã#ƒQØê2üLÐuIÐl4Ý\yw1Ã¥@"ûb©!‘†qŒg–š+ü?ðž©gãmñ"¼ž7²Ó™¼‰|ÕVÌÁ¹Â€Àü^ØÍ'¾¥l´<ÿM•!¾Žâ[D¼†=´¹Ù"ŽªØ àôà×{ã]+YñóéÖ‡¤O6ÖqÚÛÚØ#:Ù4|<#©å‡qaðCÆúWŒàÖMÜ:,Wkÿ„†@<±wyÉ •ìGSŠ~‡âßøšå<7áwÒµÙÄé§ÞÍ|ÒÃæ•;O–ßtžÄ ¬[}[Æü\f¹iç¾›Po: ™¾Ë*1!²ÊcØ*Ûд_i¾'{ÏjÚ–µ­Z´ÒÙé:zG ’¨b›dÁO çš¡Éx J ~ê ^¸´™mfS7Q¶"9nˆ6Ü{âµ´H¼=¡hÚÞ³áMOQ¼×l­ÃF·–ë[ÆÍµåBî Ø`j¿…|qâjáíkU¼¿Òo£”Ê’9e·`¥„Ø'¤ ŸN*÷„4_‡gQñ<ú¾™¯ ;GHlläÉ'È<àȸŒgž¹àQø‰â-{⾪h¾!ÖÞ{[HÖúKQrÑÙ¸`§srv°l9¼âX~Éxð£Ç>Ö(NQ»d{w¯S·×¥ø»áíG@Òü?¥hÚâ2]Ãj°-úƒµÑýÔ0#85år[½…Ô°ÜFVHØ£ Â3Ó­îz„ðÚü,ðe†»¤éþ$Ô5+–¼ŽÚ[ƒ$Ñ( •hÛ–cמ0*Ÿ‰t»ßˆÚ&‡}ám Í•²Im6‘¦ÆÒ‹ICnÝ݈pÀî<ðkCEÑ4#áÜ ñ=Jξs¦[ÚÆíA@]ˆqþ¬œuêzVwŽu8´? xkþ9îm|?"ÌÂíœ$òÜîÉvã ¸˜¡Xz–µ8´-Ã:›ã{-NMj_ÊKR)-­Ù·"JNæê@ãõ¬ß‰:ÍÞ•y£.‹sq§ø|iѶš`œ‚Pœ¹ËïÝš¹y¤ØxÃÃZ¯âO V–'‚9g¶iä(ØIc®yÎZñ7u?†‰aá Ý¡Ó-í–fºxC Ö“çó0s…ä€(ó ñ7†t nãK¾×|Gÿö¿{e ·ÖfeB0°a´²…cœòk˜ø­ÞÿjI òt½)¼‹kU ª€ß‘Ô°ÁÝÞºý{áVµñ:koè¯jbÕ-Òi¡¿ºH$I±µÂ†À)‘‘ŽÝ«—ø«ÙBÖÞΓÙ¶«´¬÷%T[Ø㎔S›ðî¹'…õ{}E,¬µEaö}Bšc•™iªA.±c6¡§`ù–ðMå;qÁ Ûšëþ)]j—~,[Û%œio i†Ð1Dƒh؃n`QK úš¾ ×¼%§ø† gCmfòÊ8mï58î ’ ŽÑò°ï׉âý;Äq|BšæÙ.ng–é$²º¶¼§S†‹i`£°k¥ñ&á Ï ñN±w¤k’¬P·²·Y`7‚ùʓ߃‚Mdø—â_‰ü9âû»+;Ë­;O²ŸÉ‡KŠC冨÷.9êsTÑ75u=ÀSxõã¼Ô®âÔé ö°Â¦É§$nA&wÝÁ8=Mb\|Jñoü'W sus$¯xÐK¤îýÛ)m¦ §€1Àü jê ,îü^ü$}ŒS ßN–V7£åpinp9ô¨¦øÈóx®C>‘`,LþQ—ìŠ.ã@6dIÛÀïÖ¼…¿™Çøãö^×n-¬u¯ ÞØŽ2KB7#aˆäq]7ƒ­âðg…5/K-Ž¡qs²´±Ž]ævùžâ21«€A-žÕÉø¿Âz„õy­µ‹I†óW<73èq]oÃýi¾×µ¿Asmák‹1F©Ô%Ý”X˜ð •$·8éÞ–Ì®…«=nóâ·‡/ô ;G²°Õb)y:M²[­â§ÊÂ@0 À©÷>´ÝÃ’ü7Ñ5kè’ý†í£‚à´R\¸92+)ùB7ÉlzÔ ¨h àhø>ÇP°¿P¾7—Bi ǘöªàÆî½ª§ƒ"$ð¶¹½zöÚ»E"êN¦g‚rp#våÎW#¦iú‹bÖ³¨éºÇ¯‡„t©4[x¯Kû3;Ï+©\FáÏ%ÈÇbÞõ[ÃVwÞÔ[Ä×7ZZ^Æ,ncŒÉ7Ÿ·÷ªªp íÛ»‘‚EiA¨Zü;ðmæ¡áVmGP»ºŽÞ}U`ò ¤`nXÂî',À’ßì€;Ô)©k?¼=4®£Ô4¹­ï/¤ÄÑ¿ÊѳtÈ#púŸZWÔç³ð¯£ êÝ¥õÛG}¨<^L©µ~HväáH,Ú?JátÝJëJÔ"¿³™ ¼·q$S.2¬:]ýÅŒ¿ ¼)òÝÇiVÙmh‚ŽŠ8Çj—[Ô|7¦G¤i¾$Ò®uNÎÍ"¸žÒèÀÑõ"3ÁÜT2}+/â&¥s¥ßé+¥ÝÍk¡ý…M0ÊW1Ÿ¼N?‹plûÖLj<9¤ëɤêZïˆaðæ±{e“Á5³M¿ !*FÒÊàþtwÐÅøŸ}s7ˆ ¹²iaÒÖìÓà«Pñü@‚½;â-­¤‰g}{xÃÄ÷D×¶‰ØÜn-Ÿ¿ÂäcÖµ¼Wñ Yðf¡m è·ÓIÓ­âŽ$dV[‘þsqÎâÄÛ5ã½"K¶ƒÄjñÇ©\5³¸£wa:ìÈÈ>â˜#ŸÐô¸µ­N )õm.'ý*ï>Zqžp ç¥z'‹~"_x;RÃú2Ûÿgé±Gû›uÜ0Œ™<€KcµyÞ‰ j>(ÔcÓ´›oïÖF]‚‚XãØO°®ÿÅš‡‡´[û='\Ñ›[Ôl-£·ºº†é¡mÀ}ÎhÀÉô©Cd~'ð>·ã«è¼C¦Åðj¤þT÷iÆßu—0%r2ÈÁ¥ñˆtêhú†‡iâk:Ù-%½¹‘Ão_áR¤eW Îx¬?‰Ýßø•¯aYM–ÞÅ B ÆF:c}EmëÚg…î.,_Äz¦¡§k²ZF׫gn²¦üp[$Åqžµ]ì-Ò3> iš¾½®ÿk[ZÝê67Ç-¬¶öìʈF|£ AcÚ¶ô¾/´C£hwœ¦-iì×tcæ-?»2gî¶ÞÝÆ+CÄÞ*ºðe妠\¬m-ЉÂö–`Éß‚}ø¬¿ØÝköV¾$eXÅÌj&I$Ã3‚T²©ä‚A>”ÍiÖ°ÞÞÛÁqv–0HÛ^æE,±R$}+¶ñgˆ&ðŸØô-u{xRCp#âéÝAi=Aìpö6ä6–±™®%m±  n>œñ]ö¼Ú7…—£ëoöÝý­¸7%.L~K7Ì" ½vç“ë*QOtPÔ4]Oljaª@°$²ÇåH.&H”;w)r׌³ªKgà; 7I»°³Öµ¦âè\$Q9„{c$N+;Ç—'Y“M¼Óí| Û¶µ€ÁI „ú眞¹Í\½Ó4Øü?¡ÂEuqk|ð³F-¢ „·îüÀ}²G|ëO¯˜—AÊ"ÂÙƒ`É;·Éëš|öš?‚t¨ê¬dŽÃ©õ­ƒ²*6´Xíbmžßy³þphêRÔõï xv}Å:N™ ¢Ùïäû1£,Qv36Fzü¸í^Ÿ?Àk‹Kvòµû)‡s"•#CÅrßbß¼'ݵ®¥Ýœ’qm)Ïùþ•럣±ƒö†ð΋ Qý’m*gž%û’JÆB¬}HØ9¬›|ÌÙ-/cÃ|cá;ï ÜÃoss´ŠY$;^mãxž• &'§?tŽÝ¿úõôǸ#·Ö4݇¤,é›Ö¾}ø:ÿc P8“$òHùOsÛ5q1—‘æÓÜ(¹Ž0®¤ŸÆ®]ÚKvÒùH\ƒ»šÀ™÷!=y×ÒŸ±‚4O‰ž1ŸOÕ.aK¨£-´ÎÌÊgïc¸÷éCzhL3±SöTñµ¯‡>#i“^J"ˆ†^ 9Æ P9b§¨ä®ìp+ôM"[ˆ–kI¡Ô,ߘî¬äC õV_äpGp |7ûYþ̺_ÃmsûgÁœwVr×Ib&‚Níªûg"²þüZ} î4ÖîD|€Ï“ø°äþt­}Gä}÷ùmÛ©6öiö‰› Uuúœ©®/áÔ›´+Ä +.©0p£6Èò1]•ñ‹ÂïÂýBÒhÞOq ò„© S“‚äçÖ¹¿ÞÛ]®¾-¯m¯YuëÂÒ[J®¬ \0Áè{VRO–íŤìŽÀ/ËœSOµ8ýÚ àæ¬Îãâ¬h‹Ÿøw+»µ—_úøŽ ~jÖ€¤øŸÃÜà^ÈgþÞÿJRÑdŒç8žë¿úLÿú9ê'”±Ú£qô©-즽¸¸TRíÞŸ½jÕ²²Tº[;QÔ[¤Q.ì{œt¡lC(Ã¥…λqcžM-þ¥–‘&¡=Äz.‡!õ …$È@åbAÌì½;•×-⯉ún¨É¤hömãÿŸ– +O̶p6yÞÈs)^áHAÝúŠãÏ€çÕµ…ñÄýQ|câ%`Р“þ%zrç"7Ù&ü²Œr_‘ZYGëü¿­•ÕÞß×ßùy„ž5ñ?Å[+ˆ<æøÀR3AyâÝAwßêCø£A眤d(Ïï$5kBÑt¿é2é>²k yÀK»ù˜=õÿßJù}#L ÀàžkOXÕ¤»as:¬q Ž5ÀT ‘ *ŽTcÚºü$×¾"ɈåÒt‡é.1<ëþÈþïúŠÎS¶ÿ×õÜÑE½õýv#ð¿†c×t»ÊéPx›¥–2GV#§ÿZ½Ã?­þxnïÄ2HYïæw…\a–ÂûЕ]ß{7„>øwánˆ¥–œòXûŸâ?¥yÏÅO‰ð–±Y¡[D?{<±õ¬”õ{ä©®Xîy¨$¨=}hd#&žÀàsÖ‘þàýk Ä‡ Ž âŒÒcŸzc¸ÜcåZP¿­=WŽ”Âãöž‹¸Ó¶àäR¨Àõ¤!Ž;sHGT»H?Jo–1L€Å\‡No±=é'jðVe zÕÛ^ðò˜›1 R õ¦NÅ®¢Ç‡EaÐŒÔxãòªú4žv› õãwm±Δà S‚çµ=W9ÔsÅL«ùR"Ô¨™ hB™#ƒÚ¦¨P«ÍJÎ3âµÿ°¾—ÿ¥öõÇë¼ø zˆ®Çâ‡>´ÇOí}/ÿNõÇë#>)?縭åüêÿ(˜ÿËÏëÌý ðbíð~„=, ù kf²|$»|+£ÚÊÿŽ Ö®¹îQE (¢€ (¢€ (¢€ (¢€ òÚêöm;ögø<ƽz¼{ö¿–¿f_ˆ¢á¶Ç&•$ ÿ¶ä"Å™E'±tþ5ê~!x‡RÓü)ñ@¼¾¶Ù^D#¹e_¹RéþÐ>•*øoVðв² Æv–-Ièg‰ND ô*Ë‚Aõ Õ/‹gÅJ»eºtVðHÇ8@vÝô/ÏÒŸ¤]\é>+U»¶OÓCudÿ2È7$dzœ{`×IÃ=^¤¾¶³ÕäÔàÒ­ ¦£%¤¯gI•,æDôb¡‚\ «à[ÅeÕ-n‰m:â×29šV ‰Ÿâ Ô;Õ«*ÒÓP¼›KÔ ð³†[ˆ#1”„ãÐ9¦—ÛkmÓ¯eP×Q‚àáBN„:n?Ýl9é»=©ìGc®Ûtš\·0I$a$XÞT[ÆŒ× Ì¡r Æïq\õõœ~1ðt¶wr¢j0ÛǨ[ÝNáUØ’²!$÷þéënóÅi éW•VŠX¾Çñ¾§š=:USîûbÿÙé±nÒ<·JÖÇÄöw¬¾pi˜¿Þ ~oç^…¢§öv«–Ò°çGBD›S,8õÀçñ¯:Ñ.­ôÿé²ÝdÛ‰@rJ‚q;‘^™n—:>£kµÕ¥³±œÑºŒåb¬;{â¦=Fõeå<[s¨i¯­åüöi bQó„nÀ6 çÔŠÔð×Ú<1§^E©ÙI{-žÚ`P»—R˜=а ‘Ó‹¡Ãcz5!¦C,‡Ù¤’Ò)p8å•8Îí›±œô­/O Æ™yÖÙmš55†ãŠêÉ"ó×#n;†"“^E'w«+kÐÛÏà­j])ášÚüI^Mòyg!YHåÝ×ê*=3TÓ5¿ƒ—ZwŠ&’Ð[j >—¨*o—$bX¹ä©#Я¹«WÒÜøS@×5½ ù渖õm®æ‰ }˜X+OR¤ÓŠÏYeø§ðÖñ/]"Ö´›°ð]JÂ8æŽAó#™ ?ªÅ-ÎoYÔ›RƒOÚ£ìVðy­À,-ïÏ5’ #Þ¶µÛËuÓ´}:ÝWnŸŠIP ³I¼åxtÁ¬Vl‘Æ=(·s7Øû§þ ¨ÿ迆ŽÀç׋ŠúßV½ŠÇTi&}‹%£Ä„ÿxÉÇ䦾@ÿ‚k>é<~€‹duë8¯­¼PJjy<AúVr—,[ER\ÓQ<ßYM·ssótǽs—KµÁn޽kj—žs² çàóŒVuÒ’ŠXfµ‹º¸¤¬Ú0ç“nUs‚ˆô¬»æVÛ€=Íh_(Y’Þ£úŠÉžEC‚Ä·§h‚¨)—ÊçŒñßÒ¼ëâ€I<)©ìNüwýkÐæ*¨J°^>éô¯=ø¨Û|-ªbØBqøŠ]G¡ò…4»MgÅÛ/o3Â[kGCþ”àçË Ÿ—8zô­â»ã­NãÃúœÛìõD’ GV¶l§#¢‚G¦k ÃÚ$¾!ñ9hm"²”\ÈÅöÊê$ þ&ã õ®‡Iñ¥‹õ«ëôm;C»Ôaš]BÒ-’ |¡û|Ý ÷¤j¶"Ó¼+qðÞËQÖµ #Z´k³‹K;Ÿ´G;9À‚ c<÷]ZOˆþ¼±ðþƒm§_[M̶hl\¦6çæ=TœãÞ¢ð׆5?&«wâ-2âÓEkF†â)ß´–#b!õÏ!‡LSo.4» j/áÛ2³Dשs7*Å‚«(nãÈÇ¥ h2Üv~ð¤ZoŽt½@Loš[;(ŸÈ¸v#À¬Bà`ò3XÞ7–‘Žg‹Ã’[–·I,_wï¤ †Ç8éŒUí*ÖÃ^ðŠÉâNçK[k–ŽÆímüù%ÈËÆT²ü €sž2jjrx@²ðþ‘z÷ZÊ}©î l[©7`¹8ÚF1O ÿ†üK}àýB-OM¹0]¡ÚBÿ¼§ØŽ+Ñ®¾&¥âØïíµí6Ò ¹RôéÒ\°¿€0cWæ`Ižy¿‡u%Ð5ulmuâlk¥Ü­ïQØú×yuðËÅzÇ‹#ñ“ks6™ur—–ú± ‘ˆ}ÍÎFÜàñÚ§ uv-XüN³ñŠn-›Ãú^—.¡æÚŪÁnÔNàª37©$n8Ï&©øoáþ¹àMFïQñN“%®†–’‹¡#K¥ mJ±ä’¤ØÍ^±×<ªxÖa¦èÓZëSM(³Ôï6ípAæ"0¹csšæ| üºõõž²— ¦Ëm2ê_iÜHKŒÿ°R=M>º†×±ªº–‰¨x[]ÁšMö“¨ãk˜gºûKÉn-å §nzäsT|>!Ô|ªÛøžâîÛN·¹ì®„~l©pTîUˆùYqžxàûUý>MÁún¯¬ø3ZÔ5 JR?:æÕmeµG|4‹µÛ=ÏϽE«ª|VðåúëúØZ[¤Ö×ú‹Œ*Ñ3I'L`ÎÄF÷‰ —f·‘‚É?—¿bž­·©ãœW¤ë~:Õ~Á¥h¾Ô ifÑn~Øb\_3’L»NváÛž1Ï5æ–Ñ»\‹u1ï‘„aäl*’q’{zô½S^¶øu¦é>Ô4-Å70Dn$šøcŒHÛ‚BèÃ)Ær &¤}Gkÿõ/ˆZ¯ˆ,ï4ËOíˆ#¸’Þúõ –9ÚÄ#uRT•Ç®*Õ÷Ľ&ÇÇ) LJôûñi ]#O‚ï´9–A(E†ÞƒNñ†’5KËÛ·¸¶ÓZà¯Ùc+J²FÄeŽ8ç¥eøÖ)üI£x~ïÃzmÔZ0ÉY[îí¦ ™7°É;²'·Ò—Aõ4¶Ñü;®è6þ!Ô´ÛAó¼ì­ f/å+#a‚‚N}¸¬è:þ¡âTÕt»+ËÛ+¤Šk ›H£T*6&@•Æö­JÛÂòhºñlúµž¿öLHlcFÌ;”d Îý¿¦*·ük­øcÄÉi¤_M¦é0C°‚ÚcåÉÀQÏ©aœû’)±-ÌïŠ-£·ˆ¦k‘5<ÿÄÀ)SlgÚ7˜€»vAÏ=*‡´½[×à·×µ l b‚0‘1`<¶bFÀGñsJ¹ñ@²Òµ?´Û^Â&¼yôÀ̳vUb¬O–8ÇNõCÁž“ƺÜV+{i§… Åî$ØÌ»€"1ƒ½ùÈ^ø¥×a­·:Ø>)xžµœ¦g´–èÙ6ùV"vyJ;`tüêÖ“ðÆ/ ø¢MDxƒL¿²ÒK£Ã}©Äy*›Hž œ Ô°|Y°6òΦÃmöƒnº£[§F§äê_½Tð¯Ã/xcÇ6ºæŸ=…ÃOqªM{sä³pC€F]ÔïÜD:%ñ¥íΉ¤iWš¥»ÛÁucl°H[•€É ŒÜ‘šO ø'[ð0Õ5_i7:Øä·™eÆÛ¢ÿ*ƤÎâGL{ÕXð­ÅÝøðƃ{câ&µ˜YË=ç62J&ÐU¶îÛÉÅaü:Yõ+bÃTšTÑ^ÂV½yŽZ0RE üa±€1œ‘š;\:2äWZ=ÿ„µÕð®w§_¢G%ÒÍ8•žØ7Ͱõb¤ã¨úWŸ¦LÄÈH=ËuÍzvŸàV×¼®Ük:¤he³û<–1»`ÈæÉ'jç¶O­y¤³Ë¨ÝI5ĆIdbîìyby$ÒsÑ-läñ×û{ïkqiÆÂõ­lµ íÒÑ3EÇ$) Î*kŸß|)Ð4»= îÞú;ò÷RêW›Ø;B*¸ÀÛŽxÎM2xu¯Œ^°kHaûv+[=¼[-áhÙAWáwü¤^µbëÈøiá ?Eñ>‹o®^]Î÷Ée4ä-šp¹ rÍ·‘’Çza±µáýgâæ¦xŽÔÛ‹£´¹†y£µˆ2þу^ŽÏk}ƒh‘!Ü|¥˜:Ÿ˜/Ob3O}t)üCÒõjš~¯¤Ø]ßiÙÂ,VÎql mòNÜáƒë‚zÔ_§Ó%¼¶¤ßð•$1&©$e~ÌÒÀ /PãqÎ Í3Æž*Õ|=ªÙ[èÚ…Ö›£ÅiÓÄ3¯Þ}ImÙ÷ÍEñ'M³3ÙêÂä[êz…¼Wš[)ߌ¹/»¦óŽ£4»‚ès:¶Ÿ}«[C¬jéºsdIusF1ÆrçŸzõüS×¼ «Cáï]gè–Ð,ªŽ.FÐÞin~ösí^]¢h³ø—VµÓ­åµ·–bUd»”EÀ'æcÒ½Ç*Ò¼1©Ùxytmtkxíe¼¾ d’@2ûHÆ'HºçÃFñ¦¼š®³¦éŸÚ¢;—³ÕnJ\DÎn Ã9#œ‘K©üT·ÐBz ‡‚zq[¾§àhüa kº}Þ¡ —·vó¬vÒH ,€ËsÈ$f«ÐFf«ðÇÅ—~-}KO·žöÖk¡=¾®¸ ´Ê䑌Œv®Ž_øüBÞt‰gÖàÛ©›€,^ã yM›¹ãJáüK©xŠÃâ4ìUÔØ6ñÂXÆëŸÝì •Æ=t3øGÁ·Þ8‘»$N÷;Ž—±*ïÁò’\ŒÄŒ•àqÍêyï‰cÔb×oÓSó>Ú'4¿BÛŽHö®»á­«øšÇÄ-ýà·Ð#´S^M–[V]W#’Nܹ®wÆ~*Õ†Ô:fðÃúž¿á[ø›Q>]¨º´·xÅŠ±Éf žX¨ÿRµ×uÿŒº§§jWè×Z—w ÌøŠ¥¶2ÈÃŽà‚} Wðö‰sðëHÕu}vÎÞúÊt[8ôó0’—'wÎQ²‘Ïz–ï]ƒÆþÔôÿ øn×ÃóÆñ\\Øi¦YZõAØ1½™¾RÙÚ8ç¦hA¸Èti¾øböëVNÕÿµ †Æ9Öâ“æHTà0ΜÎj¼×3|Aða°ÐtH­.lnüù´í66fdCÉb³Lðæ”º?„5Áâ»[ËM2i¢Ž ® êI-qÐ.A$ U™µk À7³ø-¯aÞ¤w÷÷R(º‰pLh¥ÂœžäQÐ:ù”í´/øEürž.°¾µIîXØ:4 Áå‡  ñÎ=k‹ÓE—öŒ"øÜ ?xó¾<ÝöçŒýk³²‘¼uáK‰¼E­Y,f×Q¼ )”%¡ã“Œ) ÝÖ¸Í6Íou-^î8æq\ÏŸ. OÞlp=… [ï|Qu¢[øzÏ×—vK!%œ‹6Ç™Éýã¾Üe÷pxâ¦Ö¼?oâË VÖõ»_êwvcy¾ÛíJ¤ªMòôÜ1ÔsŒÖ§ˆé?‡4Ë];Z-jn®/îíüè¦21 ø .3×ñ¬Ïxo\ø«%ˆ´‹q{çÛ$S[ #‹È‘>Rˆ¬W+ÀÆ3éC¾Ä’x§ÆW¿®-|7 Mšm¬Èf¹…%NÀ1œ)$à ‹ÄÞ Ö> ›OéæSP·¤Šîæ8]ekFäÊðGÓ¼G{£xFÛMðþ½¢Ã¯ê¶Vá..̈mÉ;„(U€;AÆyïŠÉø”·Úέi¨XÚ¿ö4¶‘µŠY#4pEŒy|gƒži½µäjx›ÄZ?†®,4+íËÄ“évËm5äîêÌÙÜT#*2@ö®oâ µÝÞ­ý°!•ô»ÔW´Ÿf# ¸à Œ{W[â-'Â×é2ø³R¼Ò5é,bó×O„J¤ …if#ç·Jç¾(êw)¯eÄc£ÚÁÙY‰7'’PBX“êM.…#ŠYZ7dqÎä8#ñ¯NñW†t[‹>ã_ñ Ñõ›«H亅- ø;FŽá†#Zà4=z÷Ô:ŽŸ*Åu°Ve 0F úƒ^…â‡zïŽnWÄÖž[&£ O"^Üä†Úªädz]÷3ü[âÝcÂ:ÒiU̶:uŒH¶ÉÆ%B \îÎjOx.o\[ëV÷º~.£ sIe¨\ùR ù™Aä=G9æ¦ñ>¿¥xOW‡F—H±ñ1Ó`ŽÚ[ËÀK;– Aû œ ö³üw k¾.×.5ë->÷UÓ¯&Š{kvdˆ/…ÚAéÇOÌ”»!ñ¥¯…õ }M×bÓ Ksu©Û‰F$‚y 3ÀéŠÌñ_…5Ïêë«éö7:¦¥O ƹ*ÆÌvÚF¶+WÅÑxwN¼µ²ñ<²ø†Þá½–ÂUDFQ¬9`JÁø‹«_ÙøÂHÚ} Š6²ŠÝÊÆ #äÛŽ¼RèpN'µ&TtGUã¯ê_‰Z *êm7N·Š5´X¨h¶‚ú“ÔÓõï'ˆ$³Õ®5K=.þþšk{¢ÊK縆ŸZ¿âïÚøcT‹D³ÒtÝR 65ç¿·óZW’ ržÒ³%¹ð“鶺’ÖÂq$w‘¯v[–•ºõ9g€¢ç@½ñõ¥ž³.£imy2²Jú”Æ11CêH9ÏO¨5&µyaàûK- ÷KµÖ¯`‰šæYd$Dîs²6SÑF9ç''¥føÀÜø‰4Ûûw}?ìâ(­mÑ™mœøÎI9=sžôßbWs_SÖâð6‘¦è‰ie¬Ìª×7y–%‘ÿ†,ÿr1’Iôª~"MCÆÚ™©XÚ!¶ i%•¤-¹_˜mQÑH9úæ¬_iºfá}/=äwÒFòÁ _6v? 7¯,zÕ?ë c¤èÖÚ·Ú2£¿ëÛ4{( \f¨ÈˆŽ{ ×ðf.£âÍÊO0[ê×R ¶8äVsøk,€GµhhððÖ¥ ÄˆÑ‚HÞˆÄ)8Ç8ÍWV*-'sÄž3Ðü >¡â]Y4}0Ü\E6àI{~ë+nÇ‘ÀîìBŽçÝr$æMCU@z(ùZa‘Ôì„´G=o‰|!à4ñÕωìm¯üA©HY¡[—Ͱ±,æFò-Èç.Ìß9* «ëz¼·O-ö¥tÒHßzi›$úð©K—oëü¿?@Óúþµü½Jz-†‘à½.}/ÂÚwöU¤Ã7Nþmíï¼óà?Ø]¨?»Þ µ[½_Q]7F²}ORn‘F>T÷sØ ê<ð¿^ø“4F$—LÑä'ý ¯ïç®Åì=ÉÜt¯¨ü ð»Ãÿ tU&(mÔœgs;z»Xûp£Ó½bå}|½dy—¿٩b–WÄ’¦£z0Ã+ûˆ}‘ˆÿ´xÿz½s]ñ¦àk‚Ól—X ä’=}•r^:ø»æ£ÙéŸ* ©aÞ¼žîæké̳»;ŸST¡gyæÞ‘Ѿ+ñ¦¡âIÙ§™„yá3Ås 1lš–\y™ôý)þ5¡ Xn29¦ãò©x¤ÛøPl ´›985&Ú]¾ÔÀŒ.G©§"Ÿ­8­8.Ñ@ ‘ëNŠx\v§(-´…jm¼ô¤Ù@Ú¥ÜznŸuy)"+x^g#²ª–? ®CJ¾šãÂÖÈ[æäfÃS]'´Ùõo k–6Ä,÷V3Á0Í(?­gèzÂøz9n2Í!ÜIï€0iI솺G†W:,õçùÖ _j©áø¼½"ë“úšÐÇFµ8-<-8/µ ^*eJj©úTª)€¡iåxãš@Ô¨ Œži08¯Š(Ãvœqý±¥éÂÞ¸½Xâ³èHþuÜüSðݯý†4®¿ö·®*üñqÈãpøõtKøõ’#þ^}ß©úáÅÛáí,zZÄ?ñÁZ5[L¶k-6ÒÝÈ/I+Ó ÅY®±…Q@‚Š( Š( Š( Š( ¾fý½u–ÿ…eáï G++ø‡]·†X×£Áe|ú€ËôÍ|+ÿñq´ñ>“kÂ.ƒáOXßÜI0òb?ƒEÇÖ‚ã½ÏÉ_ÂyñJöç!QÕ$dÖ“åðÀ®ïE×ã‡ÅP¶±­aç›kªÄq«l1Þ£$Ü^>†gÔ­Ïæ ™æ½…õ{mkÅQ]ÞÛÇ ’Ì‚[…m±³€©æ2ýṈêrqÍt®§ž·DÃ:‡…µ¶>lRÃ`ï*ÞÃ"º3c‚3Î Káeª›ûkk?"ùà2ArÂEL;Ä ôf@Ø÷ÀïTü-{s£xÆ?µ[¥ÌË4–÷¶²}ÉQ²²¡ö žG±cKÒìྺ›BÔ./ ¬M<[áòäE—àœì\±ÇeÍ!uº5f¿°hõØÜ[¦½gâ7Qºwƒz-½ÄÎXÅ A"1=Õˆe=q¸ÕÇøV[ÿ‡º6»ªôW‹mƒ a•\çÛŒp 6¾ñ®…a¦»øÇ[¼¸óoon]UHÉ( eÉõɵˀ?ZÖU»ñ‡Û^šÝm,Òaopácà<œ}y¬ÿ(‚NI¡o©›¹sI¥í©`v‰QˆüGJý¶a¸1$çžÕø…fÀMXèköêÚmöp?]ñ«qîGRzœŸ†â+£xÁGFÔ 9íþ¯,ÔStŒ8$ûשèso´ñœþîïvL§å^Oç»NÛ—žœjksyl3p‰;qƒŒÖF³ºeùwÊä7SŽ•§v”©ÏB:Ö~¦É¾«¹ûµfW±òíA;@–váó¹Ù˜@úàtW6_Þ\hI§^é—ª÷ZE¶YeÆEÉ$ínì Z öwñTšÍ¼Ë Ü2QÄÙÊ4{‡ÞŽ ªº†œ– /uÍ7Ù¡¾Hu9dqöˆËåœÂ‘Ü{Š×.7Z~±kg¦hº%‚+.¥Oöäl†ŽRçä ô žõŒãŽ1ïÞµo´ÁaáOÝM#=õòI3†ÇÜÝ…>¤žzÖP<÷¤ôÓ¡“>Ýÿ‚jnü~:Ÿ"ÌñþôÕõ¿‹Hºyižkäø&Ì¥5_Ä&ÖÌãpòsú××>2R—vp[ÍÎ3Ö³©ð?Cjĩ㳇k›— 9'=ù5^yÊÆP±'óéL»¹1ÉvŸ2¨‘8ÏsYó]ø96šÖ &kÞ~¤w¬Î£Œú†ëX—¹ÀÜÝ ^”»Fìç$·¥eÝ¿ äóÖµ1êf]±\Ÿ¦zWñ6á“ÂÚˆ“9'ŸÊ»é€’7ÜyÆô5ço_ª®vDOZ”õ+cåÿé:޽â«uÒáužÚág–è}ØS#.Þ€W]c­xNûÄןØEŦ·1œYO,û yXLeIíÎk‰Òî/`ñ=«i $š‡ÚW¨Ê6H[Ø÷ÏßXx[Á¶ž&¹ŸFÕfÔukO>X´vŒ¼ÔV ,½ÈN(êj•ÑËx,ÜÞK«iúì—Qèíhív÷!‰·e £¨oâ Àg8­ {‹/膫á VçQºy"‚KÉ-ü™-#<ò¹#æ`sÛÞ£Ð|]«üBkÝ\Ôæž ¨’âcòÛH§pw=vpAúÓ´«AðßHÔõCu¦k­q²Í-£{s“»t”Œpzä>(îþ+øjK½SXµ³Ô´ÉÄKy¨ÊÉÄrv’|Ê@#NOJËñÿÂ)áËOË–¡<¥îMò¯˜3<—=ŽÎH©¥^–=G➆±hš%¥¬ÚkïžËMaYCð$ÇpÆ1ïÀ¨5¸bð´}zÅä×Qækt2{É_¼†!ON óGæ- ¾o~“ës_iÃ"H¡“Ëlž„n¸ï]f¼Þ!µøˆ.4常F¸ì HþDœy@›vàõ®GC·Óï5¢Õ¯'±ÓØ‘$Öñ‰N8ùI¯å]þ±ñ;Å>ñcèúuýžjñC—™†x8wŽr:æ¥hƒ©~- Á1xÖYôÝNâçVŠy&H{QöV˜ÁMÇ* #œb²ü3ãßøöþ_ëš­åæ™} ÈRY¥£mÜ%Ç`¥FG¥\ÿ…cieâ™/à×ôö··¹7'LI_í¨ßåmÛ‚ÃÈ5“ñøÏR»Ñÿ±ô½2]Z)-á½²´XæYæMÌH$`Ÿ|ÓÛÈ7£èð­-õ~=_GñÇÙ– &i£&Bï‘Ð ¼t9ÉÅW—Ÿ4;û; ?MÓ/ìÝoÖÆ8í!¹î“Ž:ð{dg½;@ð†¥ðõ/õé,š4¶Íٙ׌HÚ‘Ž0FsÔ`U[Ë­?^ðÍü^Ñ%ÒæŽhÞêÙ'’æi¢9©9;U±=rh[Sˆµäºë Ëq#yiu,xù¯F¸@Ð4=#LñΙªÜêðFû"±¸[y-a/•I#dçqŒf¼ÚFgr޾kÑ—¢ø“ÃzïŠ5ù4-KÊxc“ì†àÜ@¬|·|0 䕜€=)n‡Ô¥ñ UÔ4ßÙK¤Ï=¦’-`m/ìîÁ|¬ 8/»;½ó]«à¯ jÞ.ˆjñÓµ‹§€ÝèñÚ—V‚ïE—p X“ÔpN=꿉~!kŸîít ÷ËÑ-­bxL‘«-Úºï2s÷²}ÇJ[ï…w¾'ñ­¶¡ago©4WfÞêñRê/0 !å\c¯^BüÅñkÄŠFÔ%”hÏrÖÙÊŸ5º±1á;†\ç¯8÷¥Ñþ^ü<ÖλsªiW¶zbË+%•ÚË#àñõPÙÏ(ø™¥_xÁ¢“úe©’á MhD~ר•ˆ!Xç“‘T<;ð÷Å^ñêºÞ‹um£Ã½¯nîPˆ'„ƒ¸nÏÌp=sK¨tÐá5}F=_Q’âßO·ÓR\£Ú‚#SìJí7&·ðêKi·×–·1>©o<Ït6•Y€€ ¨ÍqºäúdÚ¤Òh¶÷v$þê+™¼Ù{¶*ì¬uxü%àYµ j‰ª\MZ¥Ó–Ü<£7ñ~„6\Ò,ôÉ< xêmJÆïÙtö¶Œ5ØGš6¿ü³ÎÓ\ã½3Äþ"“ÁZ.‰ƒ5Këmu’_·nò¥ž}ØuQ´mô"ŸMñCÁ1\kº¼vºeÙ†WPcåÎ’ Æ"@ÎT€sއš}î¹?Â}KÓtó¦ëf÷̽’îkqqlÙùÆc+ŽN3š?«‹ÈQðõ·Ž´í'[Ö|Ki¡j÷vådþÒŽFûPBU%Æ@Ç#’*}câEï€õ M ÆÒÂòÇI†8D—öi3ÍülêÌ U;¾\tªºÏ…u¯Š6Úˆ4˜-™ßÈ–ÐÏ ÆH+v©8Î*m[]ð÷†æ±ÑõßÁâ=FÂá¹Ô ̱°#Ÿ,m`( dç8⟘#›øƒá›­7Qþ×gó´ýTýªÚG•ZR!ר#v2@Î+/ÃZ­âm^ÞßCµžkضÈ O•†¼'²ƒ‚Oj·ãè/¥ñ ÕôêòZÝ7™mpˆž2P½¸R;VV•y¦ê¶sirÈ·Ë"ù~Y ³da}Á¡I ØÈ¨´Ÿ§ŒâÔ´m/@Ó4-RòÑ’ 4Èü¶¸ÚC›$˜)Æ;FÞCüI4Ï KðÇMÔõëËÍ'[…âQ[YÏöˆfiH˜` /CÔ×›\Ê/¯$•aŽì[ʈa'8°ö®ÿÃþÔ|m¬ËâýòÇHšÓÊkk”0É;–<¢GQ‚sÛñ®å¡k©  ’82v+¶XÀŸëRQÞkÒ¯ˆ¼¥ÿÂ3§=¥•¥Ë­í…»<ÒyÌ£l¤òH §N*Äznš~éMã‹ËêUÓ…´j×>QûûÕ¹ØtëM¼×Á~ ²“ÁÚÐŽöèý¶ùE:ʨ1p¼’z²lî>+x_OÔõÍv×J½´¸{%Ô56aÒ´¹I œcšd”üUâ)ü%¥h6žÔ®­ôW…¦KÔýÔ—2–;üÀ:àcÓýC@µñ¶“¤ëº§ˆì´]Vê&Iÿ´VV7;X…˜lSŒŽ¸©µeþéš^‹dtíxÈ­}-ÕŸžÝËœñ÷~^N5[ZðÖ³ñ.ßN×t‹8dY!û4–qKK ÇÁ¬Ãå9Ïô-x‡ÇW~¸´ðö• å„:þÑ&ûC‘¼ºîKcµsž=Òî¯.Ä›„–Zª¬êZEÞŽWæR¹ÎÆ+wZÔô?E¤hþ Ñ¿©iöÂ;‰Vé£òòwACó÷®wâwkfù#q¥ÜÆdè¤F°•ùP™\F{.ýžs«ÜÅgck5åËçl0¡w|rp5é^$_Ú_iö¾)MNã[‚Ò¯eÓäU@U@ÚÙ– €Hô¯2‚úm:hî-nÚá9ÄÛJŸc^›â/éž"»ÓµCÄ^Õu+X§¸³ž6c¼¿~]ÃÖ–å3ÇÞ!Õ4ÿN¶w2YÛÄ#0ÚJv6ƒ\uàÿ:ÛÖüáËÏÅý«âDѯ®Lr^éëndòÝ€.ªà€ '§lÓ|UñPðˆ?±t»x"Ó4–é Ì+!—o;Ë‘»9ãÚªk_ uk/¨iÏlÖ—á.“íI¨$à£ÜgòÞ¤­jõÝ+ÄÓ[A¾×N·˜Bºq2Ƹ]¹ë’Z|ßo[Ä›àÕ,b°3ù»äºUº‰3¸æ/½¼z óS^|CÑ,¼_MáÍ>öKI#µGßç3&›·vÒAåNqXמ ñ[øÝå·´¼½¹kŸ´&£.bu'p”¶8\rsÚ›óÝ~;ñD>)×n.á°‚ÕK°ó#]¯7?~LucëZº£߃µ]'IÓ…®´Ð©žæ'w’öùdÛ’Œ¯ qÍdxæ]]våôu•‘Œ»ˆ1—Ï%08_c[þº°Ð|©jú5ÅÍlj È–5E²F“Hˆ$¶@PInOZàöà% ÐüFÞ#ŠêÓÃâWÜ…e7¿wåx|Ùã§Ö®Ç>— x3V¿ðeÆ£5ç›w·W(©-¬ü»vög·¨¼?®jÿ4[EÖõw–a[¸//¥>]´Šã©ç† x9«šf–Ÿ ¼7ªkFûMÖîîLvElZxæÜÞr²…9 À9ïI!™º —?|?ªA®k&ì9àÔow:#1ÃFHç‘ȸ«Bøkቯ4ûû-zãPaiážÞQ¸#''§ðŒw§&£«üWðõÞ™a§ÙA}k:\›M:í’å[åÉ Ü¤ÀûS4ýþ ßi3IìÑ4¹Ëi6çt‚E$¯P8ëïLE;™o~#øaä···ŠûJ—2ÛÛF!I"pNþÃp*G©¸»->ãP¼ŠÊÚžîwÅ}æbxÞ»o_Xj¾ ÂÚtú]„7 ßÙ´æyYÈù$-Œ•à€;së\r´'ÌѸåYN>¹íI”®z‰mô_ø@ÑÙ#µ.µáÿÁ§x….ì­nµG›õÀ€»+mÞ™à©ëè9¤ñ6½iàùl¼“ÆsiÚÒjzm…æ¥m·÷÷>YgiqׂlqŒô¬¿kBÚ; ÇǦ"Âod÷ÎÀẄù¸8/Š<1­ø¶ö-gLÓ®u;ÈQãû,%¼ŸáòÊŽ˜ ût¤ø‡-œ+ca{ KâK;h໺ŠOÝ’ ü„weÃҎ຾ƒ¨Yizœ7:†™¯h¡ƒÙÍ#¢ÉǪF:ðk­ø§&£¯ëðjVñO>™5¬_bò";"Œ.<¾:9•rZ ¾—uªÁ³y=–œsæOm‘׎0§Þ»ˆ>8Õt¯¥Ž‘s&—¥YÛÅœPâÚ È}Kg$ýjz÷YÃËbö1’+;Çž#Ôt¿y|²ézt ±Š';|œeg®G$úÖŽ¹àåñMƪÿiiú5Þ£I=®¡++Á̃ƒò¶ÔúTÿŒ?áÔbÒml,ï`Ó¢H·öë#¹$óÐsǵYÛ¨í–:ÅÔ7÷ZÍ®uo³XÞ£»ù„|Íò”<Õ­{â߃¯`Ðô»{g²ÓâH³{”ÈØÎឃž1YÞ0ðî±ã-uµ½>µHuE[€Ì˽Y‡*Ù#¡ŸLSõíSA²¼²±ÕôÉ5k»#·¸¸‚çËÞW9æ8Ï\´†µ²3¼u¦Ý_ÝŸ#Éqg©›Í™Ç˜‡ÌÎzƒƒÓÍXiwšÍÒÚXYÏ{rÀ‘™€äàšÜñìWG\óß g4I%£Ä?wä‘òØcG®kŸ¶¿ŸN™n-g{iÔq,lU‡ãIîTv=CÆV>Ò.-,üD÷·ZâZD.$°eUN>ërÀ`gڹωÕÀñ*½©þÎÓ¾ÏØ"·“°0F2}O®k[Æž[ûë+ëýVËIÔïmb–{[‚s’ ÈÎ  VÕÇ=¦\ÚZ_E-í—ÛíW>e¹‘£Þ1Ù”ä×ð®«â>£w¯jV7P+¶˜-"K8¡ Ëo¨WÕq~µÊé–ö·wÐÅ}xlmX×#&Î8;AçÞ»ÿx×QðmížáËÉl¬!µdÈ¡MÎá“!ë×üi-†÷F~¡¦é"ÃHÿ„ŽîîÏP6Ãp´‰d}™ù7äŽv‘ýj?ø†M=7OÐ'š×JŠñL§kÜ÷ñܑӶ1Rj½ñâÙêâîÎÚîæ,Lº…ÚÃæ:œ\ö>ô¾ ½¶ð„Z~†mm5iícÝq4ÃÍŒ»Åc=”tÈëÉïOÌŸ"¥æ•'‰´« Ræò+;¹Äò^9hÚxaÁ÷éW/õ$ðŸ§iöŸdÕe–1wpóÄ%‰]ÇÝ@ðg¹ÍRñ,z‡‹m´íNÒͤ·ò~Ì-­cÊÁåàm £Ž2jìš~›£xkIÄÑÏ%Ì…ä†ÚÕÂMG¦òs€zŽôºlR×®îüc¦Ú_ÅnжˆmžÞÙG0*:`ƒ“ß&¶¾4t´™mø'Ç™ùÿõûÖе+S§i°h©-¦Œ•Y$Üí7ñ—8ŸAÆ1[¿ ®c‡LÕÖEÞh3Î00ù?­>¢èvÚŽ—q¬Z[ÃjØt!‚9?7xïž}+=ü;«E¥\éæ( M"ÈNÿ›+Ó»Õíjí¬­­ç·ibpå1í8 qÈü=ª‡ÛõPÆ5Ô#kÅàÛ»’àŸáÜTÇÓ4ÑsÁúmÆ…ê\F#yYJü\Æø–é+÷1¼à©äq÷qZþÖn5‹k£rI18ÀeäqÎqïX_¤FÒÐ(á]‚žØ<ãõ¥Ôoc̈ýÑ>a[~Hw\Ö±HýÑíóV¿‡ˆó0I#®=iõ!fãÉáw0þ?nÕu7ˆädÛ¹ð2q{㊣h¹ä”XJÐ9;$Œç úPhQ¼Ø×vÞXÀ ÃÔçŠú'ö2ñTkÙÿŸhú¾kç™Ð,öÁ_q;Ë~:WÑ¿±¢øHõâzˆbøóVv4§»ùŸ\céŠ àtÅ< uíC Œô晑çOXMÚEÆ89NàB¯ùU›ÝxÙ_I´¹kY&(Í$i¹ö– =O¯õ¡»WÑr­-Þ šv›k&£¨Èp°D2WÝa^ÓðÃöo{ÙâÕ|HËy:òˆFmáöUþ3ïÓÜô¯PðÂMáΖ¥áHxÌŒçsÈ}]¿‹éÓëÖªø×âôv‘½ž–îWÌ•’N^†­ÆŸ›:]W\Ñ~زE±îq·¨,p8çÐzx¯‹|}âk–Ù!°õ FçT™¥¹‘œŸSU6ç âµIGc'y=DAƒ’ÞÍ/SÇ${Pqõ {ÒÇ­<&OJxŽ˜ˆä{S„~Õ>ÌñŒÞœÆ‹•b©ŒúRmÀ÷«…3Ò˜#é@X¯·õ^)û9§*~4`J]?L¥8F9 d^h1àc8LÒ•¦+¢²7Ó%ºýé–2p2xçó®¯â>—e¥Y­½Ž>ÍkÛÆÃø‚¨¿“ø×:€Æèイjω5¬Ëml¼®C9ö¦·½¬ˆl-ü›#þê ±·š”(ã§’h,Œ'=)ÁiáiÁr}¨ªµ"§4äZ-!\jA½¾ƒ4–R £$v85CQÖÎf¶Î$ò¼ÃôÎ*/ ]ý² £œ'ô¤ZÔÁøÃ+Úxîý`’æ=:æÓRš8Ї0ÛÜÅ<¥w 23ŒW“Ã⨮m¥K‹y¼·ŽX˜2:’`GsšöK <–íÁ¯Ÿþ¯™¦xHÿ0ëýµÓ{Ðôšÿø™%ûÕý[Ÿ§ÔQEpaEPEPEPEPEP_–ßðQM'Œ¾+db–vF‰';D¥.J@ræ¿RkñŸöñÕÞmCâ+3äßøåà<íµ“òÅT~$VÑlønK‡µ¸Šh Yc2‘×=«Ù%³µñµ ³u·–ùÕÚÁc#Ë•”D8³Ø0«Æ¥›ìòE(ö8m§¡Åz´vws°ÐLË,M¸n@Ø8=ò§#ð²Üó¬_ÐüQ+ë‹®ì¦i-gM¿½…\Î]Éœê(𵆣áVkå’/ôÚF–7VWO»‚=6 žÄƒR?‰-5ϵíÕ¼ sq3o¾Ëòž®:àœÜÖ…¥»ÑüI$w1,~lÉʺË(>ÄÏÐŽÔìætQhxŽé–H-5†3@X¬ï·w’'¢°¥@ï\_®n4;_[êðËsiä]Ç,g9Ü 0##ñõ®•¦½³‹^rÉ-âÛE1 0 0­œòÁIlCX~ Öÿá'ÓõÝ_ÜÅqoæA{1æÒd?+gû§$ïžÔZÛ{ÚåEÕþßáË}3N’GѬdgA*bMí÷‰ÇAïYíòü¼ëRÞî=ÁãCÈ»oµ}¢[Ø”?)2~¿¥eHìì¶n3A ¡Ð1C¹F;’köÓH3C°wZÄÜñÕ~&!Ìyþ ò¯ÚÏ Hdð¶Šs÷¬-Î{óÔõ#©‹  ò¼d3µÍÒ Ýð`á^WrÇí‡)ûÇ©¯RÒbؾ.$ÍÄ}ý25åƒ~ýÐÁÏÌE jÍߊ×lÀ§péòç°u0ÆO•LŒHùqZí#0FÑÜzVtãË.2Ae (ëô­Q‰ðïí'sçxæàç­`xžBŸôxÇ}C'ž¸‹ùóWÿh –—ÆÚ*ZC&0Íbxžãí&#‘‹¢ûOýs“Ü®§žêêÞ$áÚ@ê6Ó,÷1\Ï6èÞR`wtÞGCÏ&¼Á’ãÍG·ÿvÁÌŠËϽlfÕZŒKoÌ ¾Â¡7’cÐýI¨Qž[Í+Å MH±ù‰v.H°Dœ÷R çéZ¶pÚÿdj³ø~[¦šÚ#,\ãx@~v ¸ÉUç àÚ²´-^éüUŸ}÷}Æû{¸›pÛ¸$t©þU?…í®<-¯©AªÛêm§¡tK|ïù~e#Ï?SMìRO¡§ý¢Þ(Oh:½Ó ¢K›KÙ‰qk2ãnO]Œ cYz|wŸü¬jš}Ä:¬Wó-Œï —·UÁ`9;Iáö­SÇ–^%ðÂG–¨m£¾²’X–á£ëãæ pOu½cènø{áÛëö2}‡SD¶û ŸõŒàêAà¯?QëRïó.ÉÚÆŵÍׇ´ýbçh{é%Â' G csÚ¨a‡cùÕ뛹õ-Æé#{}1ZH-mØ’±€r@cׯ5G8Æ5V¾¦GÙðN Hñ?޽alÜûJßã_`ø¹‹ÜX ÿËC_ÿÁ9%?ð—xÙ8Ó­Ï¿úã_cx·}‘ÆO™Ò²ŸÁ&]â/SÅu@>ÑpÍ+1ÇAɬ—‘¢n>ðéÏjÕ¿„Çu¸äïløÉ¬k·UBQO¾*éì*nýHÌÆÖÉš£9$ôÛÎ*a*®IÃnÆ8íUnr —ÜUFWh­Ž{7ˆùaÀ~<×|F>O‡uÏ"XJô{‹wy اœH㿽y×Ęvx~ûy!„Dä{ž”–ãhùOK×.ü=âî¬&c4“{të*>SõþuØiÃ>8’þfÚTÓ$’ìZ[ÊMßÈ¥¼½ {lõ®KIÖáñj&nPHÒUÁOV_FuZÃkIñjj­,GK†ct÷¢t."åŽøó¸¹"•®h¶+i~-›ÇÚÚ:éÚ~Ÿ{¨[±‚kî¤>ÇaÔ0}j @ºðV•«\øŸJit™–8~ÇççMœ¦ã'4šn¯¢jrjÖúŠúv­s ‚ÎQ;I¸g%žŒTôª>°xlõ[Ç}g£•œ¼e]% òÁ?x~4–åjK©j÷ÞÛá=>óMnÞ@³´Ò“‘·Î~i·égwàk+jkˆu˜žH¬þ]Í<@©ýé<€§pSV.µ _ è2Ýø;Q¿hn.W7w¬SDÊ¡ÚHÁäç¾*®¨'ñw…£Öõ=@&¡nín­tX›Õëò1•Îp*¼„sš5‡öÍìV&öÛNŠVÁ¸º$D¾›ˆþ•é÷ßlü'«Á¡iZ…¦˜b¶:å¹{Ò\ž=WŽyv•§Ýkw)¦Ø[¬÷3¶K*’G8Ëwº¦µá½'^±³Öty5Kûá†ïPK†MΠgäÆ^¾* êO?Âïi¾1¼ &ÒÖïíKª‰£,"Îíî›·)ÛØŠm—ˆ<5«ë±è Ò5©ã˜YÞ}©ÝÊ“Â1–Æ:gŸ>—â»_ˆ"ìAwqæ^[±›iccw}Ý¥<Öµ‚,u‹‹¯]ê—½¢Í,—I…¤PH1¸äíêã­5®Âk¹à}*äKªÛx‰.ì49,ØÞIqhÃc.õÎ hÍ&“àý÷Wð&·©ÝÌZ.®î`³Y†,@]¬r¨†:c›£x£\ñû\èÚ¾³=Õœ°4žuä¬ÉjWæôÏ÷©ì ô»ýNÏPÓõÓpÔ¬q™!\ß¼GPÝ⟚†·šCuöƒ YTùÏ÷‡#ñÍz|žÖþ1èö![» {åV´¹}Rõ-–à¡È’=؆ÃÜ{ט@Í5Ø“ËF ÛÌd|§ã•Ýkún©ñJÒ5-HßimZI§ØGˆíd'hÎpÁÍOAõ4õÏYxôÿÞx{Kñº}ª,—7ÈK+¶\ˆØ”¸ìjˆ<â­{_]{J°»½°¼1ÜÛj'ÉÜGÝÙÐö«ÚÝ,ô7ÆUõö»md‘Ëqesä´+’Qw°R9ü+Åš¶µcâåk)§[eò†ž!'Êx°<°C‘€}óOmĵØé†¥à{¯~îÆìëfàl¾{•[&¹þù‹fB—ä|Üzq\·…õSPñ¡°Õe–XønX•E ùŒGm¼œûWG/…<ÿ Vù5¹RÿϾˆ,ò‚O¼bYƒúñ÷h°ø½âê/áÍfçþ$š„·Ž%SjJ…HN2;ŒÓ×Ð;×,ì4ÍZH´­Eµ[DÆË™!òKs”Ët9yÆxÎ+·ðõÐðƒ/5ø.,µ[íUãµÅ<Øí€Ë°™cqÀÀé\>³£ÉáýJK9æ·¹’#ö²‰#?FÚø6ÖÛÃ~Õ5¯Y-î‹|"ŠßMY@7Rn'p å6(nzóÓ¤m–&:§Åï ¤Zu•¥µî™s¹ì­U-á•d_¾ ¸Æ3“štÆÏÀ^Óôohk«ß=Ä·1YµÁŒÚFp¿~3’X‚qœ OIkâO¡ðn‘q§Ø[_¾±GiçÜÈHXrW‚1Ž*´vZtÞÓ‡Œ%½ÓåŽyOx" ;Äq¸8oà œRiØ Þ6Šó^²Ñ/t+‘ %¯•ooj¯!µeoÞ,…GÞ,s“ÔV޵eá[‹M(ø¦ïV²ñ,–‰ö“k2¾Y7;¶mÎ1ÀSÄ^(»ðe®‰ká]JîËJ{µGp²yåfùÙ€èAc¶*{ïŸGg¯ê#Ó´½KQ|°j Áå í Ã`uÅ? NÇ=ñS¿mz]6i,¬•#´¶W-ôleöeÁÏ|Õ/ ø·PðF­¡§JB»%LgÌL‚Pýp+[â¾^â-U,´¥[t’X×ÏvUÃ1|gi9ÀÎÅdøGZ´ðÖ·m{¥Ûê–ý wœ@?xcŒñê)uØîÇÁëÛŸµÝ¾«§ÛØùëw¶[å‘!ýæß/ï8ç½:Ç↗¬x²@¾Ó4»‹¹$†baq8*®Üà“œ3Íe·€<['WT²³½š¼[˜u¥…¼ŒÙ蟦+^ÒëÀ³xÂWÓlï×[ûC›F’e6o>IVÛ· nÆzⅫЙ™à¯ø“Ã>$:ޝ¥ÝéúLÏöë™âa°”*è¡-œ®{TºMÿ…ÖÛV›Â6:•–¿ ”Û®–e)ÿ- x@CíÉäô²|­ë:Ç‹³u™îmn¼Ø¯à¸”Ž2˜ä›zçÔV¶‡¤hžúöâñ£§Û»Ãl-Z#8_5²H`»NýF(ZìÌÆðMÛx’ WOÖõ ÿ±~ÏçËvÇÌ6²)ýÛ€O$’FÜŒ×%t±ÚÞJ¶³}¦%bR›K/c·œdvɯCÓ¼]â‹×¾Õ5, ][Ë!X£Yù‡¦ÈÉèq^{yfú]üÖò˜¥xY‘š' „ƒŒ†G¡ïCèÖºøUá(Ì'K×®5‰„¥ž!sm"}ÐÞ|ç|²À”°À H<Òx‡ÅW¾¶Òtÿ êº_Ù¼á{ÚoÎÄvÇolSýSJðüÖzKx¯P¿ÒµÙ-ȶ¶ë(1ÿË6“$Å1ïÒ±> ë Gû"Õä‡BµDû¹?+&Þ$Ç÷›$Ÿ©­[¯ã{KÉ«éš]íô_¼¶¿•ã2:»× Ü63ÎMcøãP[¶ðò[ÂÃM‰b{£ó¤~Iùºíù°Li°] X¸ðî¥o¨[,OJ¥ÄK,g#2žã]ç‰|®xâ{oiðÀöú¼rùRÝ":¾0ʨNvåN01ÍpZ5ÍžŸ©[\j:ö•'}¯šÑùƒûÃ‘Ž¿…tþ=ƒRÔ5{}JÊÞéôÉí¢k·¶Ç1Щ~µ=5+®‡C®ø³Ã𝛩øjßÄWvÅms¨ÜÍ"ÈÒ ÀVÐgÓšç¼_¢ëú—‹§¿µ·º½[¦K‹k›XXÇå¶<¾@ÂãŽÕ½â› Ýëv­âKûË jH!7ëa¼&CÔ’y F2Edø£Æþ!ð÷Šn,ìï'±µ·dŽÞÎ'>[D y|#\Óüjj–žoµV¾]EdD¹®†ÒI€¹Û¤õÁîkóÆ~%‡ÆsBgŸíjò?³‘òŒ3´F¦À¹{ðÏMÔ|N¾ µÓÔ±É.—*¹ºŒ>Ôq´·-€H¨¥øÃ{gâ&T²´Ke0¡–Ò7¹ÉŸ0®K€:úúSWô'ñ9oè6Zµ4Vwñ]¡b|”Îè~ãäzŠÙð”Ká]ïŽ÷™¶‡O $ù˜àùèG À=r+ž¾ðÖ©$wƒ"BdŽBÀ´ˆO€r Ž+kÂ;ØišŽ¯¬Z\ÅáË‹cq·ío¸XÛ¦A“Ûº¡~ßÄ?Ð5]"ÓKÓôëåU»TÓ-µ*° ´™Èúb¤Ð<5uà­Y¸ñ~•q‘p±Æš|Œc{™wVB:`dnÿj¡[ÝO kgÂzuå•â¤mv×W"WùÁòð£v3Ôôª~ ˆkþ×mõ{×·Ñí„r¥Ü™så°¯ñewer8§Ô:2Þ¡ªé“ø*ù|%§\éJ.#:ŠKsçJɃ°«`€äêFj Ci­øGRÄ—óYéV÷Qµ½â'*ÌAª¤Œ‚¸'‘ÐV„2Úü=ðÕÆ«á}eõKéî#·}B;cØÆ å,G_öj(/5ÏŒ:]ÔZ†£ߨ:H—7²ùq˜ÛåÚÌxu7Q¹²ðO†øWXšüê4w:‡“䃥/‰u ?Àú~‘áíOG¶×õK}×tíˆ7â8™OA“Y¾8¶»ñ=®‰¨èºmÈÑ~Êc†ÖÖ7•lÙ[„Œ÷ äòsZZ•·‡±<>¾2¹ÔaÖЯüKÕKˆw(K¼¶?J:‹µÌŸi·Þ(»Óõ]+O¸¹Òg´E·‚Ö6”ZìhŽÜã¬jÇÃÑZéÞ'ƒRþ׆ÕRf±‘Pªd”NXLñ׈®4 CO¶ðíÕÆ¡%ª5“Å!u<³±[vsèiu/ Ûø’=7QÔµ»}S¼·2j !óyÂÈ ƒÃ. 0íØ«ãÿ^YkVé§Lúv’¶±}‚;ySц<òÄ‚N{ÕiöòÁeªKtj—VñÉq`PîÝŒoÏAǽkkž4ºð]安¥Çm5¦œŠ[»d“Îcóà“ÀôÅdøãM½ÔäOŸžÏTmÌãr9ÎåÇ\1Š`]GÒ&×µ¬ šÚÞG¬—Rˆãåzî|Kâ«/ ê0éD°ÕÆŸBó_ǽ݀Éñ…É8ö¯>´°¹Ôç[{;Y®ç ‘]Î:àkÑüTžŠòÆI&°–±­ÜÖ;UTã…`s–Ÿj”SÜËñƪø§XmoO³¸Ô¬/¢Žhä†#ÈÁ¦#Ž*çˆ&ðÖw§ÙëÖWZŽ¥mow“ÚOåe‡T<\ûUˆšõý‡‰K–²°‚þÁöwÚ­Vã©þ¢®øƒÃvZÆ¡iw©ëèZ•ݼrÝ[]FÌw‘÷¾^›†ïUbokuK¶ñ™H³²’ÚÊ+f"5ƒ _\rr9­xkG’îÙµ½Y´-jX"{»e¶ó@b,~aµˆ ‘ëPk>:Õ|'©.•¥Î"³°AAãxê[žÇ­.¹àGÅ—öÚµ‹ÂÃUE˜¥íÒFêíÃ}â>\ô'µºž:Öe[çÑíLèÖaRÞ9Êßrr=kÃúä¾Õa¿†ÞÚêHÁ+¸„‘œúƒÆ}ûV×nímgHÅuq`‚ÝõÒÏÕyãð¬M]. EX¶¸º±ÚÁ£¶—Ë|ö9Áàzw¤÷v:ßø_]ñ†¶úÍ…•Æ£ú$Á—£‚œžÄŸÄwÚ‘wc¥ëzsëWº|KÍÌ7&<ã?»OÌzõ8ëŠËø‘ªjx™Ø]4V‚46fÞBÉÀÛŽ}¾¼V—Š4 :öâÂëVÕbѵK«XžxV1wt,H<0HúÑÔ]Ì_\]\jÉw¼zt°!µ0‚GŒ=Á~©âm2Á¦ÓψnçÓµ†µŒÜ¤1=>RãŒ>ݹ½i|MâÝCÂÚªiZ<íie`ˆí÷˜Ü’sš‹ZðÕß‹&´Ö!»¶YµD³-õÐÄœ‚rÝAÆGÖ¨N…ø–ÿCÔa´Ò®.,lmâAm†™>ðbG短Eâ‹í; tÎÜ]Â{y˜ïwÜG˜œr§ëZ>$Ö,<6ðhKei®-”)—7Hsæ}æžPIÔVWZï[»‡YòËYÝD¦3a"Ûò˜À cPüĺZf•q¬ßEgj#3É‚YV58ûÌ@;×iâíCLÐVÃC{(µy¬ak™\ü®ß3"ü ’;ç¨ë\#Hv¢³7\ Éý+¾×tm´Á®ê6š£ÛFòý–!&ôÜ>m¸ïR¶-ù™>/†ãY’ÆúÎÚI4ù-ÔEY`ÛÁCŽ˜«š®§iÚ^™oâw¨-Ë·òê2é ý «˜®9Ï¥;Ø¥âXÙ¦—“$–ú\pƒ†rN\±e²yüIw`5ÏiW·—Y^“$biÛþ>#mn;çpÉëƒVuma<#ee£Z‹]LF¦If–èÌÇ$&á÷z~^õ©¦ê¾7µ°Ô,-ä•hÚÝ@lÇÝP‡æ ȃQ¼“Ã:LZU³Å:\§4ÀW-ÇÊ{` VçÂÐí¦ë;1óaÉî8ÓŸåXºÍÐt=7V†A©Ò¤u­•ºõÏ\vÍt_ÀN¶üs4+´÷áýéuÔéàääœÁã8¯Qð_„.¼u©Á¤ÙX\ÂÓ&ÎÑ´r“’k¯Õ¿g¿B˜Ž2uÎvÇqŒñþÒŠ‡Q'fh ìxGƒ®~Úº¬àónL'ÉÆcüGsý›o$+7È„ÿJôoøVëÂW“YËh-®bº¾}ËÁ¯6ø‚Té‘€»$0ÏÞÇ~½yª‹¾¤KEcÎúüÕµáÍÆ^Ï`kÀò}NêÙð÷Ë&@æ…¹š;í9v•,7:‘€Åhýõ2‡«±É'éYºyC×vHÇ?Öµ|Ù;íˆ ×hØúSF¦tª£Q€+gä~ÜŽ•ôÇìfuß·ûÕ«æ¹ðú¬<œ…qü«éØÕâ{¯óü1ìÕ…]¾ãJ{¿CëdÒ2óR…:£29ÅmxG\“úÌW‘6×PF}eÈ .ô ‡gâ߈Wþ#“o˜cˆ ax®@Ü““êhPp3×ÚŸŽ:c4 !˜Ïò (Á© â- #¨þTá[ëRñOúQqØËü)Ûy©Š]™< ab=¥JRµ(J]¼ô JHƒSì8¦íäŠb#ŠxŒc§50Ú—Ë"€#1N ŽÕ.ÊpŒ‘L6RmÍOåàRùtLš’ÚÜ,¬ýÿ•<'54K€)€¡sJª*EN:ưzP" ‡=¸§„ §€)ÁsÍ4˜T@•óÏÁyÖåô6SÞšÐi—p³+§„ˆÝNÒGUÈçAï[Å~âOÍ~L_òú?×côòŠ­§%ÜZ}ª_Ï ÍòÄ¢âkhL1I&æD,圥˜ÆãÖ¬× ÔQEQEQEQEQEøkûgkCV´ß-÷‹µëæÇ̱¨?¡¯Üªüý¤¯þ×§øh)ž]Fv=²÷'ÿ‰ªÅ¨KH?ë¹óüŒŠñù¹dâ½IKi÷q½¬ È­ÖòÆ1• #éÐûƒ^Wp€®v‚Àè;׬[C>Œ°Æ¥”Û*m¹R †V÷ sïZÇs€Ô}?L×|XؼWså¬vžsrQ_= àc8ªÞ×ÚMsÈÖƒ½…Æûk˜G¶T•ôd8 wÛƒÖª\èK«ï±e{Y¥F|ÑæDæ Œç‚HÏ|UÛMvÏÅ>&&â;[¯$xÆ¡‚¿¼l…•Æq÷°IÔÕ­Þ†µïÚt‹[Qy­nc[x˜Éo rJdgoP#¯@MsÞû'­5ý+xôÍbâßγû2€.eFɈÿ¼ Æ:zè4Û–Ñ|C%å‹AÓÒ` ©Q•‘ ôÆyúåü1ca}6²ÞiÛT[f’®H Ëm8äÏáAHn‹¥E¡ø&æÚú ×n.Õ– PîŽ È²qÖ±Ÿ–pw=k[Ã6³Þø+V×o¯™îEÒZÄ$ù¤cŒžs¬vù¸$ŠD2`wDÄp6œœõ5ûAàI„ÞðÌœ|úM›õõ+ñp ¨A^pkögá£yŸ <"ßÞÑlNOý{¥-™ôµÙŠÈ8o´FzÿÓ&¯Ôã}3+G|dö(ˆ ñ3c,n#ÿ¶O^?ª:Ü\È@òO-õ¢;³¡Û•Û`-Æ{¥eÝ|Žån¯ñ­i }‡éœVT–À‚d@ã=G¦jÌ™ðÅ×añ:bFGœNIöë\¯Œ§èvùå¼óó׊ì>3DÄk™~èóO^Ã¥qþ(ˆ<ÀJ9=;Ú˜^“Q@åÙŽµzm–«oªh¶º,6ÅR¦Ï*Yƒ²c¹É`9ί"µÕFŽg%C,MÀéžæ½U¬ä’}å&†\`Œ€§Â–âêji>2Ò¦Ô’Úê+ˆõYæòZèí0ì—s5ýÖ••µ¤­ãÄ3Ò³¹*yäaÂe^õŸs§k~1ßäÅõÜ®#ºfÄ&fáXŽÀ¹Ï§=*? 3éú…ݶ­nñÍm¨A ù‚Cœ)äÄ L¥êSg¾Ó|Io¡Û½¦³ö$™‹Ê]¤€]SÜ  5[À:½½Ç€¼Q¤ø˜Iý‘?–ÐÝ•ß-­ÊŸ•“'œŒ« ò¨¯.™k£A¬ëþ¿ŸP¿±±Œ…h|§‚&!|Ò»Ðñš¥á]_þ7ƒ•§©I‡‡´ý/.V´–Wšæc•Û€N9yéÖz˜ŸaÁ9ˆÿ„çÆ(N3¥Dqë‰Çø×Ù~0,ùkÐWÅßðNr[â7‹º*œúøükíO¡Úmà™‡AQ-`Ë¥¥Húž/©GþŸsºB‘†$á«ô´JÛ~QžIëŽõ¯¯;®§2¯?½‘™»îÜx¬-NB“n@÷ª§¤W¡uoÍ/S>Y3*©1êO¥DοpÎF;úÓ™Ñ$P;yã5YÙdÜÉ»w''Œÿž+S¹Ç’2wçn{ן|H…®|9}#áYb*WÐ×upU¡\}ñœñÉÄxò0|?¨.à”MOQúŸ#i×VG‰–ëS±ÖK"‚ PäãdŒt<Ú°ÑüI§üA[‡ŽYVKò]ÊöYanK36>µ… zkxŸÃÎ, €1‹ŸâÏðú÷­´ñWˆd°žy^9n|‰,LFÑž0=¶œƒLµ±>ž|1§_j¾šýõ{X¤’Ò+½¡YÈÀ=ª§‡õ‹ïØjZV¹¬JÖ‘@.#¼ºbélêxÏ|6HÀ«VÒ|7©ÞjV:å¶³&˜²L–1ÆÁò8ç† žqוˆuˆÖ÷Ú<Ég Ü‘yÐKo [©(rVB00Aêz(ü dÊbømáù.ôÍKOñºŒ‚t„É *£v$xçƒíÇzÌÕEÿŽ´ªÇ®œÍöñl†1»æ ‹Ç'¸°«VšOü :Mܺõ¦©áD‚ÍnD‘³’û£nc óTµ¹ˆ´(&д™,¬mÚòÚØ¼‹’1$¸ã,x£ u9[h䜘 †Yîü‹%¿95èš½¯…ïõ¢ßx÷Ä–^8ŸN{©ÚÑn…¹Ò㔈ž/ºª=ŠA«¶ Ñü/âõ+_Øê¯¦´“Ǧ@’yĨ$+;àý*+zo‰_L’ÆÜé¶®¶{d¶CrŠ &á&7nã={Ót߇:Ï…•©Ьõ?HhCH²ÂÑËæû³q×9öÆhÛqœˆhå»ÊÆVÛ¼°Ü…ÏLý+²ñmæýA—éug¡/îVFi"¸ óùŒ eˆÚAÀãé\nä[’!‘ÄDà96Úïµ/]øGÒí¼%«\®›x$ïÂyOpû°Q—'@ïïIRÅîáíkKѯ|O®Üèúäö£xŽ×íjDo!,6±QԚÇÅ?x/T•}qo¡Y,qÇ`IÙ:ò¾­œƒïPjžºø‡—®¶¥¦é××å‡PœÂehÎß18# øsRêž<ƒÂZ•®Žú—©.8íÞúòØ=Áeä•sÈ?/áOÍ}»øSq'ˆšìk:jÂò ¶¶Y½E'y_/¿'«gã+ {^šÒ NÓe½/ñ&ÙcfÈRÄúœdûÓõ†¾-“ÄgZ¶Óîî4éf[¨õdLƱ¶{ÐpsŽ•r=_Á·^!oìM&îÃ])‚êkÀö²K´ãlÊäç62E-:Ï9Õ´Kÿßµž©k-Ê`¼R 6 þ#šë¼gmuá¿ vIìü?¶'ŠeR\\nÂù`ð~]Ùö®.îK‰nœ]´†`Ä?šNàsÎs]·„7ø¿CÔô ýDZév1­Õ½íÁýÕ£îÆë‡Éäf’.K©Ûø;Á-uàíJåÍÕè†öýE4AW);+eŽ{ãƶ“â7…lµ cZƒO½³¸{T»Ô7m¹B ƒÊœŽêóÚÅð·Â77Vwúo‰$Õ.RÜKf[dXÆó•p0üñUnìõo‹~´ŸK°·K2f‚{K]BC€Ë"‚@ÜpAçž*­m·wCïüI/Ã=#JѬSLÖ’XÍä·76«qo<*oŽzsT5¿ 럦»¦Ù ‹{˜– ËyNŸ)DV#åÏ# Õ»±aà]LÑüWáõÕµ2Î 7M·F Ýç;IêG5“ãHo59tûÝ"Òèhmj¢Î8È-À$4lGñÏ^¹“Øk Ÿõ {+n&Ö,íã†÷Ró ó]T ˜éòð7O­cøI´DÖ툡º›N$-¤s‘ËW®@çÜV·m,`6RM$‹â )„ƒis¿Ü=k#Ã]–¿«Ag©ê‹¦[0ÂÌñ—ä|œtϯAÞŽ ¶:ýcǾ.‹Ç³ZµíËCöÅDÒã˜ý™ãà"ª—iLsøÕäðO…-¼Rf±ñÜÜ[NÓ ­ˆbÉ–$¡°Ý1œ «©|RÖtŸÉcä$:}¤ÂÐY< dTL&c;°:ûÕˆ¾êzO‰þØ5;±´¸óÞAx¿jï99ÝŽ>´÷ßRvò+é5ßê£j—¬µ0ÖÙŽ $ˆœí!€ÎÆG¦jo xçÀwsëÚÕÕ…ÆŸgo'™Ÿ}Í>åÛå°S #9§éÞ=ÒüC«Íg§x[KÒ5+¤š+MJÕ\J]ÁÆà[n[¦qÆx¬ x7[ÐõIîuý*ÿLÑ–ÞA}%Ü ¼e~ê–'üéz£²4Ä:oŒ´CKðÿ…,¼=¬7Ÿìö–F¾E`Z0ŽñŒà×›´-m;G ºoj2éZe¥â-û'˜þc)ßSË.“ŽŸ\Õµeøoá­=<«IuíÄq¬G—æ2`‚’p^zæ©ØGªüLðSÁqv‚}á3Ýɲ7G]¾YcüCh#Ú¬ÏÃOGe}ia®M©Ü™Ö ±5¼Hƒnå#øÉ=ºbŽ· CO½ø™¡Xk7WÖöÚŒ.ö“K7–—ÊÉÇQ’ð¥Õ5˜¼¥é:¶:wˆ#7R½Ü~lkæìŒörF95»a¨üAÐt›íJÌ¡íeÓìSåÁݸ/\0=j[ø´}BÑ,|_¦ß]j‰2ÇoqäÉolª6AÉêyfޤô*x—DÖ~ M»¤hï.Ÿ,KÛY¨ÙlÊ0cUÏOJ­ã–°µ·Ó¬®#7ý½¬iuvŽB©â2½ÙA·µ3ÅúÔÐ5tyç³ÑVÔ aŒ_Ÿyã.éKãkkK›-7TžçÊ×.íÑîm»¨óY³Ã6Gã@×C›Ò"±ŸP·MRækK$I4ùŽƒar3Î;×uãêžÖ-týþ}?Hµ´„ZˆÛt+Ÿ0ú’IÍpzm‘Õo`µ70Z$ n X×ê@'ô¯Mñ-< l|8š®­…¬bKN äÈÃqòÏ÷>aÒ’î7fìR×<œ`ýÛKÔÄ$ÏœŽèÓ m¹Äx’-B=jóûD8º2±vlínz¯¨úVǃØjÖš¶™{rSI[o9¦o˜[º‘µ”g©ÉïšÏñˆ/õíj鯃Bc‘‘-À·ã`±ŠÜð­Æ¥âÝëÂêìûM·”Ie9"FWòßwñ¥Ô:t¸l|¡jZÖ‰­G¬ê;RÛ÷vìŸeG<³nÏ'qKc­kô{íæhå¶/!¶Ä„–CÓ¸Á5%Ÿ‚õ†ºv§©x’Ò%Šh,LÉ"Ü30?0RJ€#8<ÕíX7ð¼–~ÐbÓç‚äIq§é‘»µÂ°Â¿$±ÁÚ8Ï­Wðæ”,|;ªÃyg¢´‘ˆÐ&ÉšpzÆv\äãR^j:~ƒá9¦ðÅò¬× —·W[Vhø%mèyî :ÆØèÇ@ðÒx³N¾µ¶šPÖº˜&ó6üλ—î}ÐxçW§¥¤—ð¥ä³Cb\ ¤…H¹PN öÍu6OøvñõP[›)TÃtYÁÜbÀäôzf¹[ 6½½ŠÐM g çLØ3ÜžÃÞ“éa®§sâ¯^x^ÓFÓü7¨Ü[h¿fó¡ƹbÇ{8çæcªÖ» Ÿiº6½u¨Úi:Õ¹ŽeÔÆ'1ü«"`t#kzäô­#ÃâÏNÖåŽ#s<×1‰¢Ý!ÎØÏ¦çÖ©ø—EÕþ C¦k:>%Õ«Aä¶t$Ž;ŠomD‹:ߊ%ø|öZ­µ†¨¶pe®/-–dÉóŒ6@^p>•GÄÖ|w£ªÚÛbCopahU‰+w1Y>¿ïì§³i£›dû„•UŒ ãø·œ÷¥ÐCgÄšƒö#\Ò¿·u++tŠ{»k·aëåŒ6ÜíÏ·ñîmC^ûR'—§KfÍ"Ï—;p¨=Æ?JÜÕô} P¶Óîõýj}#\¸¶Fš´©ì¬çpÁ*÷¬kv³E E+®“`аFNUò3æ~;‰¦Ð.‡3e¨Üé ugs%­Ê‰bb¬¹ëÍzˆü!m­Og¨^k¶ZF¥{m“YÜ«o.F7äp2<ú× ¡ë2øQŠú;{k¦Ueò®áYc`FTñô=º×Yâ k~,ÔbÖtÛo­õ’UD+˜Î0SŽÕ=÷.ëþ;¼ðf©¦[Ú›]6$ƒ7vë1•‡%²ÀðI8ÇÕOøGYñ®¨5½>/µ¦£º"YÑ2x*K‘žzcÖ§ñ.£ X]XÙkVë:…­´q\]C9$s´€yÀ8çž+ÇbõµÕ¸·IVÂhÑì~ÎjÄGÊ£Áâ©ù‰t±±âgEÑu m/PÒ-õù¬!Ky®ÙÞ6f•ùXdH÷Þ±¼qk©jáÔ#†{‹K˜Ò[Y-âm‹*ŒÆ1íZÞ"ÑtAwn5ëë­/[{xÍÔ0B²"É·«rñ‘ÛšƒÅ~6ÔôMzk-yô}.×j[ZÇ.W`+щÎIõ'¦öébŸŽl­,å‚;¹$ HQo"LÃã¹þ÷@}Á¬M·Õµ·»Ô¡Ò¢e'í3£2: /<ÖÇŒ4¶Á¬›ˆ–MB5žKW™‘ˆù‰t$dwæ±4}ûÄWËe§Ûý¦ä£8r®Tu<*^åGmÎçÄÞ>¿ðÞ°º^— ¼661¬Q¤Ð«ùœgy>ùÈô¨üEà­OÅúœ:Îo© \îgHŒ‡###ƒïNñ&µáí:ö:÷GµÅ¤I×ÂfGb @8Î9«'âß]x„\Ä$šÆh‘ìš%DX@ÇB:b›}É],hx“TÓ4 FßI¼ÓíüA. ÛItî˹†r©Qœ ú Èñu…ö¥}¡mg,š}ÌAí¾Ï2¢ôÙÀà‚1ZšÅ†‹%ÅŸü$—–¨¶Qt¶Ð‡&NÛ³Œ6:ÕOx’óKÖßI–M6Æ‘mÒ&#rm|÷'©>¤Ð4ö,ëÖšM¿öu·ˆî-^(U.~ÈåB¶GßàŸ_¥fxÖø& –Ö öÚBÆ¿dˆ¾íÑÿxNs“Íhjþ:Üvš›ßÚi×—p,²ZÞ3FÌÝx<0ÃvÕßA¥ù: Ÿ—woe©»tù¤sË2’2’p=1LK¡Îiz½î… öŸu-äY1Ï meÈÁÁú+­×<5qâiíõ5¸´³žæ%2Å{?–KŒ˞ǯµr:mäV‘Í5¤WÑ®wA6v¿×ÚñD:‡ˆuC} ¼×PÉ”ñ3,J6p8ÇJ•¶¥=ô5µý^ÏÃ"ÏD:}ްÖ1í’âáKbK§?wž1ÛSÄ6Ú—Œe¶Ôlle¸¶x¶ˆ-aù-È8(ª½NÕ-ôËd±·×…äz„6â9E±PËÉ+» ä€qŠ«âZK9¬áÓKM0DØ+`¸îÄ÷9ûæ¨IíbÖ¡m¦é:U–¹kpuXã9H_ËhAl€ù;{ûUojm®˜ºsÉo¤ˆ³ßóÏÎŒe³ÏãS>³a§__ê–ú\÷“›•fóTùrFyíÛÞ¥¿×_¶ºf˜ðÜ C$·Bffê@aÀè~(ô*ÞÛCÂÖ7÷×"̺Ddùšæ1ПLŒŸJê>íV´I„ÑÄý×Ïó®k^ûo‰ô»Moj0U0IaD{1ȇ#[ÿ 'Vß>.‡ü­ÅKÜgײ—©ñ&âêéSH¬@ùãý{Ljü9iiãûËø§Fc¥Eja7 M#nÛ× gÚ¾/ðWŒ5^‹ÍþKÉb0Ë**Ñî©r2 ý@æ»H?h¿Gt÷3Ûé7s´b&¸x%e¤«täœ{Ö.ÝÍùì¬GûAÅ.dÈal„àwíüëç_ˆ N™ý»¹é×ê¾<ñ­çu‡Ô§Ž y‚"ì·$¯u=ÏÖ¼£â f¡ÞHöã¬U•Œdî?#÷ð?é[›‚FOŽÙòG»V߆ˆ ÷4ÈG Ú?î”0%õÕËU&1þÏ䎿—½gÙ:”V*‚dÃÒµ<Å„– ¹áîÿ…—(ÿ‰¥¸$±ù¯"¾›ýP k_<à¿“WÌèukqÕü·Î:G5õìj™ÔüB}â£VvF´÷~‡Õ gµ.Ïzr¦;h¹•ˆ¶ûS•y§‘“OTçŸÒ˜ N9âžT x ]§é@ÈödÒª:T»:ÓÂ{~4ˆ‚û~t¡sÚ¥Ùê)Á=)ŒŒ%*¥L”%"ÙÅN*m¦—g `Cåç>ôyâ§ÛMØXœ `0/8§„ö©¶c€9õ §­d{x¥ÙÆj]¸íAN ."-¼gõ ®>µ0JF^(¸ªŒÔÑ­5$Ô±ýütÍ<Ô¡=¿:~Úp\t©Ê]£ƒNϧ4õ 3NÛíJ:šr½MII×vpXÙj7G™.9=° b£ð½¹¶Ñ¢ÈÁr_ó5cU´7Ðw`“VâˆC h8 1M½,(«6ÊÚŠƒ é^ áö§µa3Cª<Ñ“°¢ÉX¥0ùM¹ç#ïr:W¼ê>}1^/á FÔ?h¿ Û¡¥IÐÓ&{NµÕAé(÷Oð×óDKã‹ó?G(¢Šá:BŠ( Š( Š( Š( Š( OâŸÄíàç5?x’y Ò4õS'’›ävfª‹Ý‹0©À×à?ÆLê:w†¨³Ù™õ¯Øßø(żý‘üa(Æ-e²œŒõj‰xÿ¾ëñ_ÇÓ´Ú^†½Dpºþ³Íi \ή^¡ÁÊ.Ÿ"&ÂÍ"ŒíëþÓïu=É¥…o–KPÙ"B܃Îã?ʼïÃm‹©Ðu1Ùõ¯EðGŒåÒ´ÛÇ–ê‘4„Ç•b›‚¿\ƒ´àýi³9Iµ7PÐïÙt×Î.–â+œm܇kDW>€€GbíK'‡"‹ÇCPŽÊKIuo3ȱ[~Ñ–ÆÕÜ~SÛ#—ƥ׆58cXÅÔÊKÏ „²ÆÅÉFLuWcç¾óWüMâ=WÇWÚE§Û^îÃH€ÛØE<Åç¶¶e„{®Ð Ž •V*ú»~Ôb»ñ Yêlói÷V&;ˆœd©c´°™IÈ÷\V.‡ ÜøOS¾Ötûøu§DÒ!³$’2X09æµlo—ZñÇtÉlÚ«»ß¢ñ³ä>Ù ·~¦±¼­à/^]Ȇ+8måŽä¿1O.ÖOpÀÐôª¶åm"K¿i:¦¢ÐCmodT„lL±àÜóTŒœõ•{O½‚÷MÔ-t8n­´µe¸¹ŠC¿sB’@àØªíaŒ|¿­"Ô”7'#ߥ~Æü(?ÂÆt;íÝ+ñÁ>fÇ$¿b~ J³üð+¯ è6'Óþ]Ò“ZmXCƾ{ #lÁýÛ×\BâæFÈl’:`u¯mÓ¹‡Ä*s‚ÑŒƒÌr…x­Ðc}($€ Q“ïBÜÙü(«qP ç¸Ç&³¯¬¤¸R£9Îãè jy9+–äv#9÷©ÌGlŠÃ„’5W3>øõnƒÅwÀc!ñÇJá.ìd¸ðÜ1*Á•¹ãŒ~˜¯Dø÷ Ãâ½Hƒ¸œzqR|F±†/Cn±ªÛ4`(£k[AŸÐšì¥KÚBþbnÆ¿ÃOØ£^ñ§†à×µÍ@øwKºA%´MùæSѶœaOlšâ¼eáIþxšûG{„¹º² 7›w)ãéÔWèÆ+o_ë¾ E•-tk+¢u%VÚ º¡ÛÁ$ð;ã¦+âÚv´ø­©Ì¸(·c”þízׯˆÂR§‡sŠÕÔê9JÌó‹M.ÇQñÒþöIE² ·÷|´lóÏOʯhzÜþ$’k-ZâW¶¿…íä~KÅ‘ò‘ßå qè eÇ£íñ›9‚[ LñãÍ~öë¸tü+_AÕ£ñ«r‚84ëB)bKÄ@wiaÐdã$2M|ëGRº)Ãcwá9µ }¤†âÞÓN  bÃgÌðZÏðÔöÞ=ð¿ˆ4½3OƒIÕcŒ]¬Vƒ tˆôäõÇ ¸­µç†5©fÕ,¥þÆ;Újvó«( ®Àq÷ÁSγ´=?OºðljïünæÖ$šâ+¶ ´ÿ‚u’ßøí]/ˆ®Qnî†Ï˜çwÝ\ÕëÈI;yÈj©ü(ª¿½Læq+uˆä“œuª2FîvwcƒëVŸÊòÃc¡ª¬¬BrØéÀ5³2*Ì쑜 éŸÒ¸ß¿™áûà ’b9 ð8í]eÜ¥W…ŽkŠñåÊþ41_½Óµ%¸6|•¾±â/±ßêNµv•а'°ã¡>½«¦¸ø‘«GâVÒe‰WMŽaf-Œ*ÒÆŸpm|gv9Írë¥Ï¯k­§C5¼ )É’áÂ=ÏAÞºi¼i§ZxmßI´‘­Ým†¨èEÀe|Â8ƒëA¢Ø]'Àw¾ Õ›Z¸»²¸Ó¬ ’H¶÷K$®¸ +GÔg89ªúv¥kâÛKKÑ4 }'Wž䥉wk ¬ G‚NŽ˜ÆqŠv‰àOh~"[ýJÆX4°dk‹ù0ËÓ¿žû‡O­%•燗Nդ𵦡i¬%»ûTâ_Üäo1áA\ñž”’ì7ÝiºžÓ5+_iz•‹Þ(] 3ù¹#1ïÆ2 ÁôªzåõžŸ Bžšö=6âvûHºeó €aUŠ€1‚qøÓü?0ñF•k¯jr[ØÛmš;ÙÌÑ?Mй LŽ™§Ý^èS[h×ñêVÚ›”–óÉÚ ª€Si'æ<çéL}N_M¼“LºKØŒfx2$¨Xû©à­vZŸƒµOO·e%³}¾5wŠ{”‰ãqòªÄ^21ëŠãt©£´½ŽêâÒ+èa`ïm;2¤£û¤‚±®«Å­â)íu­Nº¹Ò¥‚?$Û¡uµ#å1:m ò{j:©¥qâËÄimw¡ÁwqléêÎïæo\)¨;[wV³ð—‰´oCq¨YÜ¥¬³±—P–û4Ñï`øÁIÇáWï—ÁâHWQ’ýµehDòÂTÚË(;”Þ¤Zʲñ>¼þ:k Éff¹k{=¤Â9 è^A튯Rl^´o ZÍ{sáCªbÞ¾hÙ8êc* î85á½^óÆvÚŽ›®jÓI§,h½ºf”Z:U€ÏñrsZšg‡4o êWz®™â5ÉôÕ–XìVŽL¨ 19ÃÎN:ãÒ«ZxŸWøš·z5ìö°Ï$^l3,)BÙ6õäô4mä ê-nÞ8¤Že UeåaëÖ»«­A>èZ~šmô¿½Ó5ëµÄ_h·@~P#Èü¿1Jáçµ}:þ[yBI$lPˆÜ2œd0ê=ë¶šÚÓÁÞ³Ó&Ðuéth®® Ò-¤[ì”så<`8îXsŸzzü3:?ˆ>ÜÚæŸö{iMÃÚÇ97‘…ù¶”Û‚ÝŽ õö§ø‹ð8]{ćŠu9/µÅÔ§æv@?•Öøi®ücá{ï ZA]Û*ÞA,H±™Â™%~3÷ò¥c½r¾$×WÄz´—‹cm`$?ê­c§ÜÆOsÞºOÈ—žÕô­ÆH|A±$âvw»€1,ª½ˆÊœ/P¥/R¶5tí"O‡¾¿>,ÒÅÝ®¡Qû@›B+ŽFÞµ%ö±ƒ¼-o7ƒu;ÁourÂîý”E:º’& Á$zóFë@ë¨ -o hÿð–Ïaz¯*[½º• Î~un€6ìw¦x«Å·^›N°ð®©ui¡¥ªÉo*-® }÷pÞÎA¨¸·oˆ:ŸªkÕ¾›¨Bïjnõíö´ûÀüªNW$ßJ~¥âi|eg ÚA§j¨‘ý¢K›«D$/Ïî˯ øzÓþ®/#Æ:\s[Ykow wz„+4Ö Ÿ5[_ÓiÆqïY>ðåß‹µ(ôë'¶†b¬Á®&X†\ è:žÕ¯ãM>ûVø Â«§ß…Û‡Pc`6• œíN1Ú¹í3M¾Õï ¶Ó-g¹¼ÎåX³dÏãžÔŸ˜ÖÇ¡ÝøóB¶ñz,Þ³¸ŽÚT„ê²n$¦Í ¤Œgv¬ëoø§OñÂ^=ÎÑuæ6¥$,`hÉÉrØÁR¹­öð\ž1Ûª ù5"%̶Í´’pbA‚–ëƒÏ=+xÃÄKã™íåžgyîÌ3iáÏ–êNݸôÇÆQz“wà´ñÌž³Ôƺ¦f±ûTè`ó0ØØ¡Aû¹'ñ®sÁÚö¥â-Z]#R¾ž}:ò9ëÎmÂL€…Hʶ4ÿhZ&½-õ—‰!Ô¦ÓÝç‹LŽY™“$ ßt€G8ê&™ñYøy&…övŒm 3Cl‘Éã+—%9ÿctí+NðDúæ¯ÛøŽêÞÛb¤ï€¹Û½Ãp÷§5ç÷wsj·ÒÜM´Í+rªdòN»ý/ÁßšçY×ᲺӒÝãû5½ô3‹‡n0‰Q߫ϯ&ŽêíÚ uµ‰Ø•€öóïI©ÛCߎü›¢i¨—ZtâK‹5æåXmã»0G¿m4X¼-à²xÆÆú?2û̲²CåMɉ 8Sòýp*Œú­¯ÃðÞVr}¥?µ™åË– „*@BwqÏ=j]1"ñ_‚Cx‡Tk¬ï Yê2©™ŸråâÛHÈSœñ@t+ø¶þÚÛÚ#xtÜZèÅ¥æ?ï…Æy0À<`o¥NÚ~›âh·ž"ÖŸI½)$I)·3´Ð©ù áœôb÷]›áÎ…§[xrú;¸¯î&Ô>Ó4Ï%ðö|–ŽëˆØÜ~ï ¿9ê1œ˾ðW‰Äßk‚Öæd{‘4ZžÆ1$0· TüÁy^5ñþ³4–öpÛD„¢º.$—Äç»WAá U$𦷤i:jZø‚K\µìo#Ksl¼`g vú+Ç2é2ë—Ù‘¸e‘„òïÌr¾îYjûV·…nm4o êš®›q<ž#Š ¯¢„·‰›HÛ9cŒƒº¡„lÙua¯%Ô: „K)ÏÉåîÝ×ð­u£èÔï|#w¨Kræ8n&¼UI-ã' ®Þ¹`n;õ‡5Oâ ž§¤êú¤’ZÅÚ–òíÉKfS€Xú6qŠ»c¥ÅðßJ½Ö¢ÕtÍzyBÚà ¸ib°Å¤WPLsI ™Ú=Å÷Ä *öÓWÕYb³+4Z…ë3G 'Œœ’EhZ}›ážƒu{ku§x‚ööD†7[x‚üÇrº€[؃LþÖÕ>)h÷zuŽ›go ©pÐiÖÑÛ%œ®X( ‘­Wµðô¾ Ðo_Åzl¢ ÆAm`Òlwe92‚ ÀŒ÷ü)€šÆ»ñ/E …­ÆžÛž×N·ŽÚŒõ…F|ŽOR+ˆ´³šòå-a…æ¹”„Ž$fcÐë]&§5•χ hVÓÚB“µÆî]¹!ÝéÔc·ã\ºJbbáŠ8ä0ê 'æ5äz}Þ™ hЭ¼³Ò´YŒ6V°Ç*Q\NÌ7<IééQkº¥ãˆ¬uø’ê-’Å,ëWO”í GÊ{b­kÚž™áC§èº†g¯ÝÙ[ªÜ\K#XgËVR2«œßS­á]cÇÒ§ˆa’×}ò†’;›o <Чã»ÛK!g¡Çn“Ýið$3ßJ¸”¸Édì‚p*Û_ë·j6Vwé¯,g€•ˆ‚Ÿ.pAϹâŸã8l’ËMû[LÝÍÁÌqÇË‘^‰âŸˆþ ¿ƒEÑl¬í㦅dó˜®ï0g¦sÆ([ îS×¹¬WžÒ9.!y€±1 Œ1Î{Ô"ñž±áMQ4Í*y4û8’8c$\æ]Ý})úÿƒõÍo¯ÚI.£ÈñÝ\,nЀªñž=E7ÄzÞ—¢][éRéVúܶ0¬2^\˜@Áè3Æi’¯‚¯‚³¼_a}«êk¨[E=õ•Ì*ð¼Q1¸ÿWÇ÷qŠÑÖ­´;[› _=Úê1Ã]Í`U¶L¼À`zŠ;‡bé狯›\·³ºÔm.bY±E•Œ˜¥HÐU_Çiicegy­ÃI¥…@>êÇÞ‚}¨ñ¦»$ZØN–KM2ÔYD²,xàç¹õ>¹¤ñf’놡y"Zß^[¤²Z‘óc+ûn8÷ ;\ÅÑ¢ÓfÔ#]Z{‹k|¶±‡u8ãÏZé¼gâÝ+\ºdòYØA -±ˆæGŽã©=O½rÚN•&³}œRÁ ’gkÜÈ#OÅJí”»jM§ÒŒ`u ,E·µ1Æ*l`“šM¹ v¦"$_–šDa1;PœëS¸ 9À¾•_U¿Ah¨¤r +ؤ‹ØïA'ø?{mê Ó™;ùR¸ìB8'š˜ uý(UùE=F;qJã°¥ÛJ8 °Î9®1ŒÓñŠG©Ÿªôv㱯#øq–ý¦ü‘ÿ=¿ô}zþ¦¿è²wâ¼—áŠîý¦¼"Ù¸ÿÑöuÕCwé/ý%™Kâ^«ó?B¨¢Šã:Š( Š( Š( Š( Š( #ý¬¾ë??g¯øOÃÐÇq¬êÃöheF®ÑÜE)]ÍÀÈBxÍ~xþÂM>8&e¥…×9ÚÊØaùƒ_ÑÍ<_,Ojqù¡Ô¯½±+u«§w+!TÖŸ£üÿáŒ_ü*ñŸˆü3«ø§@ðÍö»¤iîmîf±O3É}»¾e60AÎ1SéAqáý5íöÃp`U¹·•ðÆE%w.{Ž;kѾþÉž7×tko6­/„4éG›gpÛÅÄÞŽˆ!Ú$gµqž'ð…炵ëÝ`×FÕPý¢$;YHëí×<× ðµ¡k%îœñ—º·&½ñ)·Ôí­¯¬íïÆ›åÀÏ4yªcäÝÁ*:{p1U.4ËýÅísfï&ÛŸ´ZßD…UÁ;‘‡aÔ;E:ýôëûÛczÓAv"Ž+‡Œ­Ã0ë»núôÆšûBñDÖ÷*­fÃ[9ÌNœ=Õ”Ž}¹­Ô«÷4Jéþ"ñ:6c%ž¡|’­AörÌÙTN2ª[OP3\ßývæO§kVïau¶÷–²õ@TüÃЩÁLVøÓU§{¦¡dññÖÿŽK^+~@¼“k. 1žkÛtÓº]yNI+ àvÄ™¯ Ô`W¾b¼aˆ{ŸZæÏáCàQ+‚G rÖ¦”‰É`R8©öÑ€ÁÁ+Ï œqõ§^Dî@vqƒßÖ‚Oƒ?hXHñuø#Ãñ£â›lñu«ú~’ÿù)«ß´-³Ý1P3À U¾,CŸiYÎdÑ4‡ÆéÒý+ÖÃ?ÜËÕ~fø¾GÝÿ7Öí¸•d…ö猋…Ç®ðçí±Eñvþæd"¥¾ä‚@A_qøÕiìB)v6ñ¶ ¸Œ“ø ×Á¿õkâ–±5µÑ{H+i `‚ê0Ø?§á^ö5ÿ²?—ærPVŸÈáfÒ5 ?Å)%³¼Ëö6ÞùAëÁ³Ûƒ‚=EixvßNÔõ[¥ÓQÓP•e6°ÈG’eÁ*«Æy<(÷§u¦x/îû19ÓŒ wqùÖ安ig­\Üi7¢â;c%ÄVˆe‚g¡#È=ºWÇHô—‘‰¥^Os—¨—šÂ÷Iµ90¸$‰=ˆ }y†4©¼¡kÞ!Ñ5(µimâXíPíŠ7ùIÜíô9÷®†ÃÄòxÚUÒ5‰b…õ­>R—éGIÁ%K°(J€sÐkžðŽ«ðÕ5ÍSR·VÓØÚÏk¼<¸Ónõmj[ Wº¼c½v˜ÉÇó®Íï|$ÈÓ€Üqךâu¢Ñê³DßkÈ1´]¹ç§5ÓI¤øzãÅm¨jÛê3žêÐA˜¼Ò#p9=xêh½ÍÆv—&µ/Œ^ÏRóÙg•Òî)‹Ês¸ú`GáVôû}'Ã&ïVðö±q©_ÙÄÌ‘Ël"1v™2çöõ«<×õŸË£jM%äÍm.Ÿ¸åFßM¿Ò Ñ|><ww¬½ý†« ”N6²–21ù@t |œóOñÛ‘Ùj:·ÄÛK6òéâ'†êvƃ8`íØðOqQ^ißð隌­ÕãþéRO:(—o.¬§ï䊑u{é׺f›¥Yi׬FƒM„D.ÑO*á {Ux4ÄðÖy‰tËŒ¼ ZB$òÝ$Úrùç+ÈÈïKp98[µìr^Å4ÖHÀ̸G)Ü+@>ø?JèüM«^ézwöUÔÖšaµG²0É´•Ï;±Õ·dæm9®%™­íÙ€yUwm^çúWxß5Ek¥hWÿfˆC—–Âëvrüô${b’Ø}Iõ h:¶³ú‡ˆSLÕ.DR\é’[ Œà²+`g¯ `šEø•«_xéWQìÓeœÚý™ S4J~Qµñ»#ëPk“Ä:Õ­µ=>Ú+Ý“µ¥ÍÇ—sà20ù±Î0Nx©Ǻi׌C°Fó I«2µ#}Ð䃂~£ò¦Lð÷‚õ­ÝÞéÓéÖEË‹kØä•ÆÓ…hÜèxâ ‡Z´ñe…xn×GÕdˆ²6žÒ3\¨`L{Yˆ6ã8ïQhž×ô%Ʊ¦ÝZi ·Úù/Ÿ›¡Ü:sS<¾ŽÒþoūũ$$‘*1@ª@ç“Ò…`láž²»x®£’)#b¯ 2°ìG­vV–ÚmÇ…­SÅSÞØ8Ý2Ìe’ëæQ‘¡=»mÚhë¨-´2è X_i¾"mFà7ÚR#-²_»²@>˜õ:T6ÚŽ£ñ;FºÒ¡‚ÎÚöÙ–éVÚ$¶Žq¤9}iWGÿ…áÉãñ6Ÿ ù»¸_³iâáYFÕù¦ßuýiù‹ÈK½/Uø©¥Yßé¶¶âæÕ䂿Ö6ŠÚI ­b«““•”]Ýi¾Ó4ýĺÕµpùQrbkt-›£?7sÜzUo1ñ‡´Ù<5¥Ok¦Û¼‹=•±yÚ)ˆ»7,C„ôé@·Ñn4M/þ«‹û;äC&Î%g†ùLŠÃ$Œœr1B—ãC-åÌ–°KŒðªÚ(Üc‰@å2{ƒŸzİÔn4«˜n,.$·»SÃFp~žùô­Ïj“ÛGk£ÚÜ9Ñâ…‰AÞG®IúVw‡¼AuáMB-BÈÂÓ…d)4aÔ©ê#Œúõžã[ï‚tMCÄ(.uØ4»™ÙãL’2]]€,ŠãåÉ$àc4‘üQÕ¾ö/ I`òý”¶êg3´|n >¾Õ÷ÃmO\Õ¿´l§·—e.BËr‹qp,Ä©$ qW£ñLJ_ÄäÁÀ¸Ù®eq*·ÝÊÓƒÏJ~‚!°øgªxc_SžòÎM6ÎVšImîãyŒkœ†‹;aÁÈîi4ïiZÓÝXi²ÐõYátµ½¶’RîØû„3•‡p5 øsÄš?‹¢žæÊæ(Dî·7SÂßgxùØÁR3õÈ­-<'k¨]Ýxuõ)u›t–K;{͆"@<© ’@ÉúR^@üÌÏ è–—5ëkÚ~¡a¢=«}¨ÜDño^6ì,0[v1\à·[É>ÂÒ›}ÇË3c~ÞÙÇ®£Ãúö§âö¸ÒuMR{‹ ay “ÈYmÙFD˜úðG|×1{n–ÒE ÄwˆŒBÏ!\v`#ñ£ ú³·Ó¯‡¼Ú–{õî£2Á<Â.-B®ï,«g$“×¾*i­ñ_ñÍ$Öñ^i“y[¦e·…ãeÈž7óQh°/<'>£«YYêñjæ5¶°’Q$L,]ö« àZf©,ž7ðÌKáýìiksþ“¦X+È `6ÉÉ$ô#¨{…‹áÖ…k§ë:e¦¹ws+\¬J^P|¹FCÉ$sƒÚªx’ÒëÆš^“{¡ir(‘ “N±‰ä[ICgÜÀ‚ ç­Kg¤øRÖÓÆVú…¼©tÆÒÚ5ò®cŒŸ!Ç [1Öªx§RM'HÑLJ§¸µÑ¥Ydi1+Ê æc c·J:_2{Ë]ÃHÓmüS º²FB­«ªºõÏXèWvzUÖg®É¦Ãwu¸¹Ç;Tƒ÷Fx¬ßø{[ñ¿6§agw©[Ý– ¨b,0 ½=±Võ¤ðâOi¹öáª%º-ËÙ°ŒÎG#Ò³|Uâ OOñ ŽÖéí­¢T±Û±´_À@ïš+Èèµ üþ)„êð^5Ú–é­]DJ6†$N9Á…sšÇŠ5¤ñ„ì';í8KHÛ÷l3ò¨^›HÆõ­KÂÚV§®+ÜëéW%^{%˜Äìå œdœý3N›â†§¦ë+ Géö®"Xd…LŠ‹ÇÞ뻨§øþf4{-Xž+K´›-–„)<”ÎyÇ5¯á;uðö‘wây'´¼"·ŽÄ1gVc·2¦1·Ç'5‰â¯Ýèwì×%. •pÏ‚sóŽªyèk_ÁºkØZjΧm2x}íZ8ÀºbpO¨ œöÅ.£é¹OÖgñÞ‹ªh¶zeŽ¤Ê·(4øV´ª™pGãLÐô Ÿiº­ÏŠ4ˈ´«ˆÖ%³g×g*Tç£<û⛫¢ÅáÍXxfÆòÇQh‚Î×W"VhIù¼¼(Çlõ¬ÿ ±×4ÍVÏU½’=*(Ä¿hr\à ?.ÐzçœAG¨ÍÍ[M¹ð…ô>Ó'ÓH•ðIpf–D9 ƒòƒÛÞ¨xf+}gB¿‹]¾–ÓM‚Dh®‚y®’ž €HÈ+ÔgÒ¯ÛËkà]&}WÚԚûÈ›¨á0›QÔq“É `ûQ¥­|TÒ¦´¾¼Y.lY$ŠâæAAXULç'ÒŸ†_Íeá VðÖ§.¢—“ùrßÉn t 2#Ù¹±œç9çð®.Öê[k¥ºB¾llw(# úw®ÚM'þæ‰xºœZ~­q~Â8a†án UåË!ûÙ#Jâ-¦†;¸å–ÜM °f€±—<ŒŽFi1®§«xWø•§éšåšDÓ:Y gXUYqi èE;^};ÁúN¢kZZjúŒ1´ÎLå|•sŠW‚8¬ßÎÚµ†y£ÚKk¢¬TVÑ³Ê Þ d’I9ÉëWu+m*ó@ÑÅ—v:°’6‚?1Þß!”7 ÓÚ›üD¿7Æ¢}aôëý6Òo쇶U‚(˜[•á£$g{žµnþÃBi‹âKFÓTû0ó¾Ë¹?&àǨ\S¼Kâ{ï ¶›aáëé¬ô¤¶Y`–#ƒp[ïHÞsÛµ.§á™ö1ÓÒ›ãjöZóÚÙNö6p"Go xÛåò°ã¿\Ñ®xZMræÓQVv3ßB’Ëos.ÆW<Ç¡À?>¬K¡SÅž$¾³ÕE½Œ­§ØÃ%¼P¶ÇŽÜžæ¯k>Mbk;ùõ;-"æöÙ&{[²à©ÛÃpÞÀ {Š^ñЯ`Ó"³¶¼‹OaÝyrÇ©ëÚ¢ñ>‹­ø»TmbÚÎãPŽú5œLícüJ—KÖ¼B|7,zMœ0ÜÛ[F ½Ü!‹“‚HÏAYÞ'µºÔÞ=mcsiv¡²FmШÏaÚ´õá£i[Øj°K¨ê0D‰qqm1P§ºz6:gÛŠÇñl²µÜ Éaä«Z¢1*#<ãëž´?1¯#ÖÂãQ”Ako-Ô¥Kyp¡v rNϽ/Å?†t«‹$w°D7ÜMap͆f‡ OAéÖ«jz>±ã¥¶Õí k—™ H›‘u8!A c‘ÀéKª®›¡ÚXéúÅœ—Ú„1üæ)¶A$ì$}ìU?êRÜæµ˜{m$Eþ;„pÀžíCäIâøFôû]P‰&Ôã #ì”7Ù·`„È8'ׯ'ڤЖ3àMU³'š/£GÜÇ–Ý}øãñ¬ËØVm*Ú{¹ÌWepˆW&DÏžÝêî‚Gü" çwÚPð8ÆÓÔÿJ:‰ìÌ­±rœþuí:TÚ»M‘€­±cc†v8zõã~|ès‚s^óá¶ht«áä<ˆ¤ÈY#Îì®1žÝsÇlÒnÈ¥»<ßÄ?òÑNzÝ Ïâ*ˆÿê#%òÌÌpp3ÿ먵JÉt¸Q¸síùt­,áL`ùœà`€9ïý)´ÎuÅÇ$ÂsŸ¨¯­ÿcˆJ¾¾qÖXÿô¯“tк¤’I·"¾¹ýŽSþCGÖTøé®z iõ>›1óÒœ©¥JšvÜž•V3#ãü*e “NhäÓˆÀÇAF€CÆ•<žµ'—‘OTÛÎ:Ђ§¦3òóƒš~ÓqÅ?n=ÿ¥!Š¡G4…I©väóÒ,‘@¬4&§=©Á­* 1@$4(ÝN(1Ï4õÒô€„ƒôúФ#&”.)ˆa=©qOíHpOJ.@Ïõ¦‘ŽÇéRž”«ïEĈ‚ëÖ¶¥„EÇcIJ´KÖ\†ò˜ {ŒZâÄŸÚe³n%Ú5V'××]ã†xô)Jß0Ý»û½Íy¶‰lÃG¶r0 ȪìJz³Ú4ì› rz˜Ôþ•>:ÔviåÙÀ¾‘¨ý*lRh4.E*ŒŠUà(§Åà3@Æž´0¥Ç"ŸJfêƒýo\W“ü,þÒþ'û·?ú>ν_VÿI¿Ý5åŸ ”7í)á3ÿLîÿôutÐÝúKÿIf2ø—Ëó?@袊ã:Š( Š( Š( Š( Š( ¿ 5m Ï[ý ­´kÈ·Ø^xÍ­']ܹý¥5MãMËA´1Ú›—W÷0["‚ÊqÜä€1׿¯ˆ¾?†·ø•q"JñJÖ‘7ÊÄde‡ã_wü`žxüc”ˆÚº…õiJ°÷b¾ý¤ â:ÊU[e¢|¤uùÚ¾«`¥¯cȦï5èyö¯aìÖ×6òÇo5ÌQ›ˆd$b_ºÎ§qØ“R[ÉñŽîr,ÜBÌãœOéžØ¨õÝyÚßR³ŽK›K»tbdÛÈ>VŒÐddá¾µµi¡?ˆ®íÄM[,pÝ\« ®È W©!p žµñ×Ks½&Þ…X.4?iòÚ´’ F•­ïT`6 d“=B}9KF'“Ôé€äGÒ¿%bûÀ¶Iíï_¬Ÿ²k™¿gŸK^;byGô©{ÏQÓH[Ýhwòa'·ïxÞ«•s#<1ùSÖ½‡N_øœêˆsóÛDztÃ7ø×‘êà4² –Þù¤ž¦½a•”§@¨ÍL³#BÀɵ±üUBgŒ•‚3.N9?øU ë•Å”Žý¾•D.|wÒÚ÷Ä—n~nk®ø‘ð_]ñ÷‡¾êÞÑÍÿüI­à¼ž'{ Ž=*·Å;]@Ü`e’xë^{yâwº;˦ëZ†œåVÞéРèa+Æ4f®™œâÝš>½ý£|Wÿ ÷áöµâ‘QàÓM¥°n žGP˜ú`·ü¿7´˜¥»…ÝÙSí,Ì„ç'¿½?Æÿ¼kãHàÓµß^ë6˾;kÉ<ÄÝÐ~ ]m2HÙ„Jò}¥QŠä~é‡~ãZã1jºŒ!²&œ9jÃY{?Ákyl$··¸::˜(;H G=3[Z†×ÃÚ•ÅÜwrÈör<ÐÌŠ1å©Èv9뎠ZÈ“W²¸ÖíÖæÍ%š&H^éKb¿.YsÉ=ñ^…¤^Áo§G ,FöÙØKr% üÇч?C^D®uÁ&õg#ž­«6cm™¬ßØNl32nå¼¥ü¥ˆÀ#ŒšáþOs¡\k¶zýµÈÑ¥´x¯`¸Oð•ÝÝXø{×_u¦F·ñ]Ù»Ë}me<Ú}¬€)!yá³ÉQÓ¿ÏxÅxêëVÑüWu5åµÍ£ì½‘‰kI(ä÷\àèOz÷ÔÄkØÏ‡›¥±ŸH·¹óZi#Û+ÈWûzVbÛŠÜóWAðtº EzòÞ%ÕÅݳîŒa,|ÈÉ't¬%lœþ”ù^ Û> ÿ‚}¹ã}×<ã>ÿgk²½¬wkl¢êr‹¸œõÍgèžÔü#©\Þë6ªš\¼w ’£­Â‘€©=O­j/м;wâ‡4hàÔ ›"ÕÖGɘ ¡Ú=Ûp[Û=ëÃÚF±c¬\Á¬Ú]C§4R-ë\£*lîT‘ŒçÅ?Qô$7ºf¡£êÂÚTú]âB¿hîLÏ4{¾cyùrj¡§Â—º×öõÅå¼6î>ÊÛ7?˜AÊáˆùxô«ñ¶¢Yj‡…/5«¨¢Uy/!XÞÝIÁu*N{ àc5^ûÏéRÇ«j«Ù2ËÖbœŒò98ãëŠ÷9{HÞ{…¶Ic„JÁ ’œ Éêǰ÷®³QÕa𽽎“6c«ÉeäžuÞã#oîâ¹;XåžqkbY¦"5^ä“€v2B³±Ó¼S¥Ý^ê+¶× Žc×·)-†÷#Õ<)âj)¬év3ÞZÜ*KñD<µ°~P¤~U«=ÿ„gñ:¡°¹²È«öµœ}–YÇŒ{xú¼Ö‰æÔ¹úzÌ–-fËÈÎÏ/*ç¦s}ë{þ _kÌ&Ö¥¶ÕÌÁ›NËä™q’‹&î2ÜtïFîÁÓSG»Õn|Lú~£-ÀŠw’+Èå'j©Îöü:çØUý*×OðÓ^êÚµ&¡g xÔCå2 €_©ÈÓáøƒ®ø“ZþÌÔÒåšÔÂßzrm§úÓôÿ ?n'Ö%Ôt½bÚÞ'F‚ÎV“ÌÝòí‘YFžiþ qÜM«_´³H Ó9gvã$žI®®{]GÇÚ$ZÃÍa!‚H#Ùl\tŽ?r××CUÔ¥–+X¬ÄÎXAl1g²ŽÂº=Ad×|9n4-:X ¶˜‹»;bò·˜@ħ©ÁÁÇŠ]ú«w7Zo…ô=7KñˆšÅò«º´¼OjŒÜ(dl7¯9›âØu+©¬¯ôè.Fð ´6ªì±ꄎŒsŸ­[v•ƒ¥¯‹%Ôl.ÿx 6Ñ—ÉÏÕñÆs­÷Œµ/ ÜXÙøwS¹°ÒRÝ^ܤ›Lá³¹Ü2Nr;t ]KZ†‰ák½JÝ5}RöÃY™PÝÁ º¼aå\÷댚’óâ׉›Y—G–êXô4Úf.6¬YÛ´cõúÔ:§‚müCsk¨wO°¹Ô#ŽYtû’ë23q…+Éè3Þ™?ÐøŒA6™f–ñÈ-ÍÁ€}¡@7ï#;»ÓÛ`èrÞ#Ñ#Ð5&·Šö B!ÊË <î¶@Ãý½ë£ðMƒé¶wÞ#ÔàWÐ –é"æå‰FTÊ3ƒ’µs~$ðÝÿ†µ&‚þ=¬ùxäÜJ¹8n ëŒóÍkx:,Ú„·M€ö®·2Èà » ãxlKf ©¯l{ø^éu­PEýŸ4~F£xÅ‚†Ž9#€GSBSUO èV-á‹Û¸ì®evšîBV‘p:9µnËñI²ÕµbÓJºË[}£Rvïià®3ÈÎ Æ:SÓT“á–… 鳨jÓj»Éuå‰àؼ ë€ÝÏ•¯e«üLÓìõK;h‰·ÖpùpEgvè×* 0?u{Š=~àó(ø¾ùtk+o  ºŠÚ5i.ü°ZI c”r7çß½aè7öÚEüWwºl:¥¶ZÞrÁN‹å äuÖ¶üP-ô­OÒ¯¬„šÜ0‚×"B (I+á¸îkDi¿ˆëiþÏ9mHn ñëK¨ÖÇQ­x_Äš¯‰_RÓì¯oà•Òx5`sC‚¤°P¹öµ,~—Ålµª‹÷Y ”³zôÜ·lþ=«+Zñ÷ˆ´_½½•ä¶¶ˆcX,!ܼ8^„ίÏà]üH_þ(c›ÏóG0¿žÞ1«”žÝ©þ"¾†V‹âwTñ€Óo'¸ºŽîᢹÓÌ¥S!¸è02síZ:g„´Ÿ_I«Ûø–ËW“O0Ó­£O2Jí wçš,~*jzž°ÚtðÛÇcvín¢;Tóá •_² çžôßü:Õ|5®Ç©êm•gº[‰á»Š]Ñàåv†''¡qžhßÌ~„6>2Ô¼uÆ…<61Ks´3[ÛG ïQ¸+:¨%H\`œµÄÝØÍ¥_Ior‹æÄÅYQà û0$î wɯx{Yµ½µðφ›DÖe„ˆäûKËæ/ñ"‚p =;`Wž„”˜·†tø¬|%©Kâ[{¸´Yä‰í’1åË$¿ßŒ°äm''sI©êVz?…O Ky³Üâòâvep>E%@ÂõÇ©§øVÝüiáGOÕ5³±ÓJKo¨]±)lOËåãÐŽÃ¥^–eø]¡4}FÏZ¹¿œ+_Bžd¨3°þ.yÈíÅ ¸"·oøVÞû^Õ…ƒ[NÖöú…Ú™<õ ˜§œûâ¬ßk²|5Ól,´+ë]InC\K|mÃÅ)8U\qŒ`Ó.ãÕþ*h]Çöeº±™¢–2c¶…ƒ Á—8¸9¨çÞÑmtÍwK·Õ®Ÿ+n‡‡¹$ŒõÇãL^Cu-Sø®³f¶âVS ðÉ4vëæ©äÆ‘ÀéÍføšK}/L³Ñî-#ŸT¶OÞÞÉLœùc0¿•IâXæ×-´Û½ÊeÓÚÛÛ¸?0cÉç äúÓ|Kem¦>£$é¯=ºæ1‚¢0H_3¸lÇçHsO[Cy¿3‹"Ø”ÛãÌÇû9ã5ÔøÏ\¹Ó/ì¡Òn¦´ÒÕ –É0Y;–ì[9Írúuª_Þ[ÛÏw”2>Óq0%#÷ s¥w"ñLþ šËEÒÄ[Z@¤Ï4EÏÌ]wv犅2ׇ,u™¬îoõË}òî’X®bfùºòôÜ9æ©øÒûÃ:©Ó¬Ö/²Ù"Û,JåÀ{'8Ï^)ú§‚µŸM±bÌ—ñ Oq,¡PŒŒŽ1Rjú¾…¡jÖöWúD^ ’Î4ŽâêI2ìÊáXd/Až½é“¹£àW\¿“R°0Ëks‰×íqÇ*‚9F`Üg{sOèë .´+{é‘Ô6¡+¸bãqU`èEfxŽ×X¸ñ_[Ãq*Êé%µÄ1±€1ÇVý—†/5Æ—wi¨ÈàÊ‘*v”ã#=”¶y¨ôšœ¿ˆío­õk†¾ŽPò9q#ƒ‰ò'¨Æ+SÁÐRMBÆæWRÛ4³¹n!#\{äôïYÞ#Õïµ=Je»‘”æ5ˆœˆÀàíÅoø_RÔ¹¨ßS´ñ>‰¨YèZ$z=àU–Xmey>ÒŠp@ IÈÎp=èä–š3øÂöëVŽÇTŽä$QZÅ8š;²åOãƒÉ¨¯5!ã í4= 6æ9U¦²ÓQÛíäÁ$’Ïéo§i:¼~#¶»³ÒTì’#­0?/—¸uý±Nš÷LÑ|5ssáyï|Ù]b¼šëh’%ê¡vò“ÞŸ _¹ ¦‡&‰ Þ/‰ì¯l­ÝÔÚÃ"f2`å€a÷zgŽk”·Hê5šWŽØ¸H‹– žHϵt¶rÜø¿Fº:¦¥³ìL­ÝÓ–7XýOLJæííZ{¤·I"V‘‚o‘°ƒ'©=‡½&5ÔîÆ xÝ߃Œ×¥ÞǦ^Ås-œñ®sop2Æ9®«ÅžÕüI|𽆛uw§Ü¯‚"ë>:`ÈŠžš”÷б®x– Ío£6ËW|i \^G¼±¤ô^xOÄz±âÍTjZmÖ¥kw4fËlã8ôÁw^_[½•¾¸·²jÑ[¢ÜËfÊ}Ör@ÀÈô¬¯kvz´qZÝ=¾Ÿ(-<—*†,pqëëTö55©¼=kqik®Ú\ÜjVÖëÔ¶r… ñë’8“ãrêoÉ,5­˜U‰ mE‹(ã¥hk³Ôîín5V þæ(Ú{i!fÚH9Áã#ÝkÅ÷~¾þÊÓJ‹,$~|jÌÿíÏ\çÛ4 jPñuŒ!­®å”[êÀ’Oi·£×=²0qïXú6‘&¹¨GiŽ»¸$=Ì›éœu­oé·wnºë|Ö×àJ¥ÜoŽA^¸È<ô¬KFu†ÖÞK‰q¸$HYˆõÀ©{•ŽãÄ~)¶Ñ5UÓ“e©G§ ·ón”³1H'·¥Pñ~‘©xƒV••¬×¶7q£ÂaBÂ0Gú³Á5wÄQør-RÖRKÉ/"‰î[bfG óŽ3Y~,Öï,µ£ ¥Ä–v‘"‹Xâr—”ûýjŸ™+È¿®a[\Z[ëIus¨Ãis5œ€@èsÔÁ>Õ“âíNâXyÒËËSj±1 #ÇËŠÔÕ|9o©Ïmy{ªÚè×WP¤’Áp¬Ç8Æî:gƒzMcÅW^¾L±XÞÚÉqµÔA™†3»ž€ç4mä  Ýo@·¸’Î}KQJÔ® GšÞX‹c#†àñ•ÁÁõªÞ+ÖdµH´[E0éÖÑ Ç>kc&LûäŸlÒëºF©â›³¬Á¸[Ü9Ý"† Ü`‘ÆA¨¼Qöm>;]6T[«ûXBKr¯À=vŒp@Î3íGqv1tLé7©r-m¯6‚<›¨ÃÆÞº?hšÇˆµa¨ÛÙ\ßGz‹$~\YëÆÐ¡W?£6šš„gUŽæ["uµp¯žÄý+[ÆZÕßöëçx-ÑZˆÜ€"åÅOBÞúºßö”l¬5{i¯õ{uK‰m¦Ùµ¿»ï·¦}fx×U-©[µŽl´Áý’8ä8 _\õ«ÚÆ…k©½…Ýþ§‘yw¼±Ì…†znã¦F=éÚçŠ.|1q‘¥J¦ÊѬ’¤͟›y=IÏ_J¦J©h–wvz|ú¶©ý—¨Ën¥£’û†~VnFÒW£×uƒá±—£Îe°HÃùòƞ͂[8è2hÔôMSƱlá§Aæ$“¢0pv¡ˆÈÏ¥-ì¶~ŠÛMÕ4èµK¨ïÌÌdó´2œ}iy‚(jð]kº¹D êcaœr§úûzTº+ÿÅ'¨ ´«g'?s¦*/ÜB++«hLZhˆ$Q ;a#ªdçŸs×5>ÿ"^¢qÿ/`dÿ¹O¨žÆ†×7 é½kè? :G§jÅ|ͧ’1Ç©ü‡Ö¾~ðÖLËþø¯d°Óï/Á6ðÚÛFÑÎpO€5-hŠ[³ˆñRlÔ´UEÕüyï’ IúuëRø¯rëÚ"È 2ݨaŒr3øÒ|Eeh£üyüi­‰zÝ.8äÖ߇B™î{Ö#ÿªSîkk@ûã9£¨¢wšx,  îÎyëùV¢¡d¸Ç9öÍdÚ3m\žø޵­åí8 ôÿõÒZš‘é ¸p0D<úGJúïö5εëç¨ÿÇ |‘¤ÆS]pÃÞ¾õõïìb™]_ž~Óÿ´ëž¦–6§×Ðú…cè*M¸µJtð”Ìírüâž#Áýª‘{ê»FAŠ\ q)sÇJF‚cŠ1ëJ4»zP4¸Æ) \c­n iÀsJÃ4Š2õøó—ýÓ^]ð…w~Ò>çþY^Ê{*õ=h¡Kë´×›|¦ý¤|*K‘k~Ø< lÉ?5ÕCwé/ý%™Kâ_/ÌûÖŠ(®3 (¢Š(¢Š(¢Š(¢Š(¢Š+ðÿâ]¤Úwí)ªŒ«[xÖD`¼…aÈÈúWî~SþÓ?Dý¨’ãK¹º¾k«´?–ÝÉi9@ÁlñÁükÑÁ&ç§MLk[Ù´zÿÆ|¯u3ŽDv­ø ¿úõð¿í$?I¹‚ÔG ’ f8?˜¯ÑOøVãÆ£Ó­‘³} qyroÜÍø(fü+ó¯ö™³Ðbý¤>"ÛxYV "ßU{XÕ¥.„ U}¬I'÷ñÉà×ÐãqQ§‡²Hó(Ònõ;k«M-…ݸ·‘’ÙàI u'æêñ 5èzV¸ßc’òÚÕI»Ù%Ìh…V)Ê…gÈÚØŽ0Y»b¸+é¦Ó$ŽÆH’DTYÇš¹ _º“ÛŒdwÒ»Ïêº~™§Ý.é%´½u>LáŒa^B¼àŠùi½6¹Ý %®…¤³ó´;-Fót—+q,2Æ@ ˆ‡nÌã;€©ãŠò›ê¾ñôÚeÛí'3Á©Bq•^wzŽ:æ½"i'¹Ó¡»º¼ð\Ý´ordu ¬øïÓÎÒkˬî5¯ üI„JwÝCtw£e¢uÏ' ‘úKÔ©j­bÙ×íüQªjèškéï8’{¹!Éór3…PFqïXEüÌõ,G8®ŠMCOѵtè¬Ï©£Å%¾Â´g’»œä}saH t&ªìÆDÑeqÆ3ÐWêÏì{7™û5ø#Õ`¸_~.¦¯ÊtÎõçñ_ª±£îýšüò©t?òjj–õ%žÃ§ÈsS9à %`Iÿoÿ¯^7©’.î9bç ç­{™Çˆ¯óŽl?ö¢×‰k—~N«(”ï$íîp)-Íoî”/€bg°k6IžGlc 0AïïVg›Î]ÉäänëôªRÆé–ÜTã?™«±ŸxãF—QC`¢¹&¼ƒâ^—ö]*EfëÖ¾Ô [JKl0 vÏ5óÿÅeݦ\® Ú¤å€Éæ…¸÷>Yº‘-µ•ybD” Ew·Ö“ZNóeŒ7 BT”‚¹õŸÄW v#M] îcˆ>K(Î? ô ›Ë»{§öÂÐÇ,.§‰ÎIQŒSdôÔšù´ýW_‚idk+×1ùâ5[H¿Ù'Ÿzîô;khôئº…¦š9.¢v9ûÅdÛŽúóÓ¢‹Ý^)­æLÎŽÖ®Çz±ëŒO={×¢ÚBšµ´w×rm’ŽbC¢W'Õ”üñŠÊLÞîr:Ž”Ö×ÖzŒwɨC£Eq2´„²Ü¸þ‚FEsþÕtÿˆM­èSÚÚhZ휆ÒêÕ %_™c“Ð7Lö$v®‡I´Õ<)­h—1¥§¹’e °cáõ®gÂ#C×'×#ðŬºv²öÒ=ºÝ͹H3*pp3ì*¿!lﱉoa†<u§ß[yZÝÕÒJ‡1ÀþgŠ˜f`xÅjhöâOjw÷×%óÝÅ 1Èùl`–b8¬ ~nE4ô3húWöcÿ î?‹J¼Ï?ì­~øÄgHn‰~z~ÁÒlý ´åÝ´¶Ÿx¼Ž¿»Ïô¯Ð¿¶4yp ËøsRúŠ?de<«‡ÛÙÝéÇÇz}†«¬ZiÚ‹)‚GÔ‡Ú¶·óÏ9ô©A³¬øËZðÐÑôËémô¸âM+e'R3¸Žù«w?ÖÿÄ]A©YÁÃ%ÃÙ4¬·1n ÎqƒéQê>- <!°°Ôà´MulŽìOÌv9 Ï5§à½jóÄ?ÚÖ1´–sH·1]ï\Ƨ ÈÎFß§j§æ%¡nÓÇpëóÚ>•§X½Ë´)©Glæ6 ¨f`2yëÇ­fi¾Ö|)}-ε§Kk¦ˆgiGÉ2÷AÎF?:Ó‡WðÅ׈›ìZlÖú«HÂ+ápL-.ÏåöÉ÷ã5á†ÔàÕç¶Õ#º3Ã"^-°P˜å†{ƒŒP>‡9©Kk5ü§A-­«ÝÃ,›ÙG¡l ×Quª¯‡|?ks᛫»h¥›mÕ˰YVP£ ‘Ñy$W1¨¥­¾¡(Ó§–âØ7v¹²×km©ÉðûÃpÝéWpêRjs2g‡1¡EɈ«-×ÛŠHlC`<}¤Yêz߈ Òõg€]jßíj9åädŒÔ×~0›ÀQÚhövš~¥n–Áž[Ûd™f,I,…‡ ×ÛÝ+Qø¥¦Újvbθ7AqlòÇmlä4aˆƒÈ§w¦xsOÓtmwG]ZúÚ"]üæ¡VmÁ)Ã}éˆ5ë^.Ô·¤À“Z^*ι¸^€®ÂÁ¾SÓ§J³qâ u`¸Ñ’MB9UXYäÃÊ7´e¶‘»Øt¬[j×zäWút7sXÌ‘µœ¶ñ>Å\ &GR1øVÍöá[ÿ"ϨÜÁ«Ë"yö¢%û)”9ž¼qš]tšœ6µ ôZŒãPYVs#2†9ä®z¥nø>Yu‰n´¸q¤Í I#9ùmŠóæãê}k#Äš¶£ªjRǨHåí¢H\äB? ô·àëËNÞëÂðˆöÞÄæ)QB²Èl;ã;>\œ´_Q³NÓN³ð&©júf±iâ •RÝ 0H·žYÑÇ#ŒÔß¶ê_t;¨-mïl¥IÊD‘ÛC2°+É(aŒõæ—GðÕ߀mõO[‚ÖêÅ¡û8´Žá&K–cÀ%à g<JŠkˆŠË’Oò­=žã¡µƒÀº vþ%ÒãÕ ÕÇ œ¨Œ(Á}ñ·ñgëT¼HZÒôû¯éòÛi¤Sck¾V·“<ïnIÈ ‚jÞ›¦ÚÁá}¾2…ª]f"L\ç?>ïN½ê¶¯­Ÿ éV×–úlò<†î@Y$ qï@ʾ ³µ‹@ÓdÔ¤¹Ä ýÓ/ÊaÏÉægØéíXzE”¥ô6·Z‚i¶îNn%FeSŽ8óÓ5»âdñm¯__Ç¢È"hfÝæ]8/nsŒãŒÖ&‰¢ÝxŽö-:Ì@&}Ì¿h•b^NYˆ=ù¤Á^«ãÛÍW°@l,B@±Í »2¨ûÛ9=Aµcþ†±y¯}¾ÚæÙ,ÚQqö™.ÐM6Ldï${ÔKâ½EÕ µÔ|=m­Íf‘Ã%ôòÈ®Y@°.8®*…ï‡üK'‹¾Ý ­ÔÉ-ÊÉúBßge$;ñ´ ¤d=EèlÛxË÷¾%qmáÛkKÉdd¶ÕÒn…‘“vÌ“íÆkÃ:6±§x©F§iwog—[縉Äm?'ƒžØö­ËKOâ7×ÕVwh` ´’Q’ d ØÆO5‹¡x»\×ußì»ûÛ›»KÆxgµ’BV0s“ŽÛzþýtAúl¢êZ ÕýÆ¥mËn—*©´ó2‘Ô…çó®>k¹µ+³=ÌÍ4’Ï,‡$ú’kºÓ¼3gá &Öí¼Ac®5”nÂÚÑd“òeÃ.6üÜàšâµ-BMoR’æH¡ŠY[%-ã¦}”pÒ§ÈØi7Z¼'>&ÓsÀUR•ÚVFã$g ±Ï5•Ÿü ~¹þßÓ¢ÔúáVdÌe|ÒnC@aßëYöR kÁ÷n¦˜µ8ím÷É%ÜcÀdò  *ƤÇiá{øüWåŠÝGötí¹àïÚ®8]¸Ïúƒ_˜x“ÂVRxLk++[‡[› mò•‘€"BI$‚áŠm½––<)`|U-í´¢YÍmÄYù·†wvqRêúµ¿†ü)mÿ•åÚYÏvÍ=ä»Rq QµoA‚O½5-$ñög{¬kPé÷VóT½ÔKž>¸ü§<â€$×üU7„ôý&×ÂWwVZK«N/ -Ì›°wã é´zÖ_‰mŽ·¥Zx‚êò8ïîWÛËŸ2b§jñŒ¯ZÐÔµcà+ m×ìÊ9k‡º–ßÍ…óÇî÷€qÇ'³¼Qiw¯éÖ~ †ÒÅ¢4Q¢RA ½H=rëÍ»œîas¬^[XZƯq<›#V`›˜ú’@z.±w xZÓJÒ͇Âääó3ÎqÇÒ‘E/C©êšœ7Öv÷éÒÀŸd6±1XÓ òô ƒüëC^Ó<=£kww–Ú±Š/¶%”hcWÇ#žý3Ä~,Ôü3¨ÚÙè·óXéöð#[4'h˜“!É$®øQu›ûkÏí6{øcžK{ÉY]‡'€x{µŸêÚ.½-µÌ––¶¬+xÛä(>é÷ÈïZz‡Ãcu©ùÍ©ÙiÆp· c<¤\"·$ç®öÍ6ÿǧÃÚªØÁ¦X]ZØí„=íªM+m¶æžãÓŠ¥¯xG^Ôõù5!šò+§[ˆ¯:NNF:~¯Ü‘—âíy5}EÒtŠÞ)yaeeé—#©â´|=~³è7ÚMŒPjï 0¼BÞmÄyÉ‹ÇN˜œw¬ÿÜiÓj’ 8 L§lÒ†ÊÊýÈ_áç5¯á»-'GÔoôóq'‰b·lËŠ2FdŒõ,\ô採ЋÂúö0êRk–wvz1·>o›DÎÙù<½Ã«iu£hú¥uá‹›é/J¬s5⪼1ÉB½yÆOÒ¡Ò¼EªøÞÖïIÖuYî,Ö/:;‹’]m™HçèsÏáVml-|e{ªZêÖ:ôì¢~ÊŽcŒ±É.®£ÓÏzîC¢]ßxïGÔmumJF¶´Ëý䥒ؖÆrÏК˜ZÅðïNšþÏUÓõéî™aF¶Gx¢ÁÝó‰OaÏJ#Öu?ˆúMÞ— ¥¬7‘2Ü*ÚA 0-‚Œ äŒ>ÜQ¢xxxGN¿¹ñnŸ7öt»R+”+ÜHr¤€zmõÀ«u©ßüAÑÚ­-!¸°!ÌV‘$ *7Ž0 Üó\|6òÍ0‚8šY¤!5$ž€õ×k:†•w HžÓî´ø¼ànã–S,Œ?€ätQÓÈG+DÞ`r’/*ÀóŸ\Ò~c^G}}k¦iÑlüQïöЉ(¡`’[Â[…p}òp@ëYþ/ÕÚÆ )tIg²Ñ<’Öì$!™óóï#`kQôñ—†ô[UÖmt«ÆÝn'¾b~Òªx'¸Ç­3Sñ5Ç€-4ý'Gx."òÌò]Éu¸,z®sòñþ4z Éê:4Zþ›£jz殚EíÔCÜFd3Ƨ !ÁÈãß­M¬x¶ëÀMm£è1KeJís$ Âé‰Ý¿ œ ô[\ÑõoCe®[¬OçEå¼léWC‚2¼ö¦êWVµ³Òum.^öÞ/žC+$1ÜJœg­1ù Õü=¨øÖh5‹â"î0^)§HÈpûw0H$}j‡‰gµ³¶µÒÞÙ&¿µŒ$·¹Ï]¾„ ã4x­g¿º·º±ŠS§< `X0…@ÁCèAãš_YÛÅie%ä².³%º4‘.6òcÔ6ãó¥Ü:+˜šP°7ðÿj…±95®<ÁèFx®¯Ç>!¿Óõ¨!Ó®æ³ÒÒÝ>ıH@1O«g¯½rºU‚ê—ÐÚÉy оGŸrO–Ÿ\yúWkâOKá‹Ë}ÆÚÒ{{• ][‰<ÆêXnìIâ… =ìE©øfÓ[–ÆöûZ´Ñoo-ÖI¡ºF?7Mß/®¦ë~-»ðž¡“§¤ „b ó²y§©lžÇ}Äq°r9; ®Aç¥G¨êÚNžöözž’ºµÝ´K ³´Î„ü#iǽPñÅÕö±ö¨ÒÊH‘­„¶$xáF=:cÚ®êÖšUíÔëòÙj2ĆámáWPqŒžG8ñÎhˆÌñ”ÓÞë vÈVÒdV·1ƒåˆñ¯Ӧ+Òþ}:tžÖw·™zH‡{VÏŠuK:éˆå4ûU @‚1Œîúœæ³´}Yô[ø®ÒÞÞååÜÄ$CÏ¡ïïIîRØìöO#9ª¾$Ð5_jí¨[[Mt—¡eSÆA=°z ƒj—S»Ð­/-muk ¯îmáX®f·¸1îaÛßýêE®xsTñ> º–Ÿk%̨%E,N9^Hàc­M­Üèú]Ô™Ö.­cH床vLà}ÁƒÐtϵfxÊús­o…Þ;-‰öA!Dxù@ÇzÕÔô]*æ[y5Qô}FHc3D–Þhé÷›ælcåGV.×2¼gu=ήn¢O"ÊDW¶[|„Hû(ç·Nyâ¥ñ6Ÿoµœ×s´ZÄ«Ol8à“ÙˆÚqïSjÞ"Ô¼3v4Ý>f¶¶·@å¼gqúƒúÕOÙÜ_¬:ÓH_'˜É#åÃtÑn²ÇV;êråtÿ_½ŽÏOµ’îåԲňN+ª×æÐtýR =BÖmJ[h–)¦·›ËË£Œç3ß—Þå-WCÔüQ}õ”]­Ú+¨,SЯ'Ö¥Ô¦Òô‘ic©XJîÞ=’ÉÅ0»‘×? Ïñ}ü²j¾dLa²(¦Õc$(ô«÷úE„ñZ˪j_Ùú„°+°ù¡½ r0qŠl]Š>*¹’æêÞkdh¬ +öu8Eé‚}F*ôšv™uc§K¬êRXÝ4'ýL"V+Ÿ°ÈíïNÕ¼E{á{ˆtý"âK{XcR²`flòþ$ŸlÓ/t[ÿɧ£Ü¯ïòuˆ C1Æ æ€ìEâ Oì–úN™;1cd*ÜrY†O~Ù㣦|¨Éÿazs÷3Ö™®Ç‰e,pÝÝ I:0a'8Vx{Òi ÿðç?iÿØ£¨žÌ«ápLëþø¯£ü8¾n“l®|À%PQNã÷_ áÏ×5ó—…T´êüôìVZ•Å" y Ñ?*ÜÏàH©’¼Qqvlå<+Ïã "ÑûC•È;NáÞ©üBFU—iô©¼_3Üx‹I°d–ð? ’8ªþ>pð¡ O'åëŽE ö8¦ÿV¿S[:ààžÕŠßêãúšÙÐ>ÿ'ÓNúÄ M½GAô­DØ"ã~8ÈãŸjÍÓ8œô<žkZ#HB²n-Ç>™¤hE¢D_”ŸÜúcô¯°ÿcñ¬x?é'Ÿûg_ x}kòäñädéšûö/¸Õ: Üž?๪tõ:)ìÏ©Ui긧*þ4õ^9ŒÞœ~cŒP äó@Ðm¥#ž”ð3ô¥ÿn”ð3í@ QNÛøRŽ(è´`úSˆ%¨"˜ {R2î§šNô&áïQØÙ¤F 9É#½YÛíJ£Š¥ QÔÐ £¡¥ Œãë@ Œšpc½.8P=…žÔ`3Þ—a=8¥Ûê) ÊÖ¸±˜çøMp?mÍÇí'áu ?U|” ½¡ÆÓ¯n½«Ð5À„ÿîšâ¾&ßÚKÂßö ÕÏþ=k]47~’ÿÒY”¾%òüÏ·h¢Šä:BŠ( Š( Š( Š( Š( ¹½À?ˆîÍÜܽ Á'÷1]%qœ ïa4¥£8hþhQßÞ^ošâæÒK2â`†5uÚÌ…@*ûIçŒ×ã_íMðNÇàwÆ¿øWH½»Õ,m¤GY.ðÓíš$™K÷ˆÞP·r àgû‡ªEw6™w„Ém|ðºÁ4‰½c©ÚÅ{€pqÞ¿?j‡þ0øñO[‹Æ:”:¾µ%ÑkÛûg%ešDYQð@Ú¬ŒvŒ aÚ©Ô•I§7v'©4–‡’ß\ÄÖ––·±® Cå¸r8˰ûg'ž™>µÞøVÒÇìWPÌbÙ2¤ÖÌ@ÀSâEpqÜ}+‰¾6ú¦c%ÄËm{n¶Ìý¢=Ù\œõ\‘ŸB=+³ð·‡}>ê‹«Û4B ã ¯ñ'¸$ãðõ§-µ0†’ÐÁÖmšâëM‘eÛÇríGf ¿Äá»`±ÉÚøöò/[ZjмúlS›wµa‰#Œ¤ìEvž,†c-„6 '²ŽðÜÖQ\Ñ0êpáñþÉ^õÉÛø—CÖ\òc1ínû»cµ`3OjL‰_©dmþø$+õö$“Íý›¼5Éùf¼_ü˜ñ¯Ë4íêJýAý…¤-û8èÃ?vúñGýþ'úÒjÆGºØ6ÏÜÀ6-××ÌJð¯9m^pàH Ïÿ®½Âá&#œ=›®Go x§ˆ—ÊÔ.þ`­“ÀÈ9ÏZæ¿dË‘UÔlBN£Š¨ñ3§ ,sÛêÀªW`cüF¡¸*GŸéÀdîcê³²XË‚6°ÎáÐ׆|T ÚmÖFr˜Èïô¯iÖÛý€ 9Tuâ¼Gâ"°³Ÿ%™‚:BåBßÍÕÄLêª[’íÇ^õèW‘ó Cˆ"G@˹@nÊOn+Ö`{LŠÏ#¹MwrÍk ·¶d|Û@£!þ`¤ô?ŽO¶i=X“쎋q&¨—vBIí.vJ² f2@Ü„F LW¡Z‹‹èõHg‘™×~VFè_ã$dóê{לkqÜiÚÔRÄäC*G5¬‘‚ŒôPAÜWu§´·º’ Yî#·w ÙùAb>rg»gð¹ÅfÍ!»º9½6òúÊÿF¶¿gy/.íµ;WÀÝlú3´×= x{NÒu-_Sð¾¦úÔÖ6ï40˜ü¹#©#'8öô®„k;ië©,’ BòæÂåþö!´þò知s¾ ðÞ©à~ó]I¢š : $ͬ‚Q"ôÃØç}qCZ•äcÚ ßxwV×uOôYb‚6DÛ–bIPldþ†8n?:Ý·¸›Äš6©wibºf›fÑ´Û±ò‹³ dòÜœ{V*ðyíëO}“Gп°»mý¢4n ›+Ð}ÿrÇúW诋þÈ—€Aäõæ¿9?aç ûEø|Fû{ÅÏý»¹þ•ú3â ‰qžœ:4°£ñCâÔÏpJç2±Ü:ôÍMµT‡Ï#µmx–ìC¨\DªrŸ~ÕÏÍ'ÈQŽ=_òjhüÞ·ñ$fܶ<0=Çò¬«™ƒ–Ú1ÀQÒµ¥ÆÜ2sŽ3X×Qœœ/#±­ŒQ™})Xõãžr¾ ˜ {¨ÀÈhÎqÓ8®¦ìyjK¨9"¹ñTz½­¼ÒXÜÌ·0êL@‡$öÀãf+Ï Þx†ì[ ˆu†y ¼³M›w—WžG8£Ðff‰áSÃÏvþ#Ó/l´imØNfB¾g÷vÁ`pi>cáûë¿ ½âÊ¥íîß dñ·eK`§áù¯5K‹Í?Tžu²hÝ®\þàŽwà㜎êüFßÁ6òêžÖF§+m‡Îò<£y;”³g8ÆzP¼†÷ÔãíäÙqçÈÊYNðgqàŠí®ƒ¯x<ÚZCw4wü$i µ¨lyEvóŽ3¿Ç8¥Ô{"×…´;­>TxŠÊöËC6ٛΣrÙ<½Ã³VZïMÐ|/}{àûGÏ/w·7;VHc=ÚÊ[ŸZ¥á}VóÅ‘jN«¨Hö nd73ÂÕ”‚¯ôÏVµ¥¤?tkí_KÕm5ù¦)l²EòàÉÝ—Vêxã¨üi©FÄ7|1$ºæ¬-&²¸ o©^nu0æ#N{f¤“X‡:M½žŸ=ž±ö·i¤à@@ÀÂ94÷¸Ôþ+é>DBÎÞúÎ`þJ”¶…ÕÆ7s… ïPË> Ñ"Ó¼A§ÃªNó´©iç±.0X:79ö4üáWÅ©uâû~`íÏ^0OZçí/æÓ]g¶íîådŒà¯ãHkcе ? iÚA¯Ë}°aˆ]=™O#ÌÀáRG6+/Tñ†¿§x²k5¹™"Že‰4ôùMÀUÐŒ~uwRð¦âB ËÍr×G¿½Š9f°™±b0J°ànÇCëV/~(ßizáÓ­¼šm¤«IíÕ§U\ ‡ûÀñš­zeêøK‹Åeá×-¥Heiÿ³p¹Êü zÛ ô¨t߈×~!Õ_Nº·³·Žü¼ u¢-ÄLà |À7Ó#<óQ/ífËÄ‚õ&lâ¸óÅé7ª»%3»8튳¦x‡ÃšŽ¼é§hcOÕeóÚøNÅ<Âa8žý³H~¥ 3ÀÚß„/ßQÕìþͧCù²oIe+ƒýì¥r:Œö—WÎöV¦ÊÜŸ–åöûn<šé<+i«YkŨÛÝÃa,-à¹G åc’3ÆsŒW7©Ge ü‹§M,Ö»¿w$êãßf—BšÔëô}FÛÃþ ¿½Ðf¸]h˜¢½šL)·BO1c¤ày©´››Ÿˆ^¾‹^Õšì$Ymõ;Â]U›ƒÇ'#‘ŠO ¼~ðÅçˆ-îm5;Û¥Ke·òÌ‹jKdù¡†ÒNÑŽ¢¥ÚÅOcomkýŒ«qäÛF–ñ̇ ç Ü¯ZdùŽ–oøVÞAeqc­¶©>æœFe· ƒ6°nIéžj «Gâ~‘e>—gÜX–‚k8JAÏÌrBóÐÔÖúrxÃSAâ­,^µìêÖúy›6ŽdܧŒä gµSñ©«øWM—ö2ÚiPË"Ïi4²G)9Þç©cÛt ëų𮋧é~$ÓþõIŸc[#Àe89 œtæ³¼kv5ôÉ´è^ -U!…K0„‚w+RÜäõÍhÃ¥iw>Óeñ=ÅÞ™s—[I"{ËF7ƒÐ»Þ«xÊïûÖÏGÒ.ÞMHo0p.œŸ™˜zƒÛµ¶§%kw-„Ñ\[Jð]Dû’D8*{}k¾¿ðœž0±ÓõÛÝfÃK¼¼€nKùÊü¡×ã8ç=ë„°»:}ÔK34RNѱٔðGµvþ"ðö»ãø4ísNÓžæÚ[q †ª°2¥T>^˜Å.š•×AÚ÷ˆÿá º·Ñ ±±ÔRÎŽIï-ÒS#7ÌJ4º¾ìwO:Ø£û C»o– >£¦üÉ^FŽ£á‹=Mmõ}2mNòÒ)®à¹1£H•Ç wõ¬]n}Z?’ÎfóT[ˆ òØl ØŒ[z¶ \j9Ö5‰´ÝVUFžÚÞÔJ‚Bà[rí'ñÁª—Ÿ5Xh,ç’ÚÖÕ„In?º¼~dw§°#7ÆÚfŸ¦ëGgtf—vg‹oËñ¸+Îyâ®øU"Ѭ®<@×V÷3CD– Ÿ0ùC8Æ6þ'=Ågx«B“L½išXÙ.ȱ‡Ì‘çœ8ìy­ h·6–sk÷ÖŒºŠH ‡gnžXç9Ï~Ôº‡AÖZÍÏŠí/4´µµ·º’?1ڌɷ’¬GcVôŸ ÞøBËP½ñ‰M6XDbÕ¥éNO'pNr)-õ]ãEÔ ðþ.Ÿª´YyeºiKD̨CÓÔœV_†mšú×T‡R–X4Ôˆ<“:–1¾~] ÷<ñí@ý ÔtÛ¿ _EáÝ2}>ë*×a§išH³ÆÞàyúÕOD—Ú«±<¶ö*Qâ™”³,ÙÆös‘ZB=3ºEÞ«á½Væþè2BÓI ÂÖÊÜäÄ’HëÛÖ«Áªj¿m.-5@<öáfŽêîB¨pUŽ\ñL^h¬^ i2]èš„—2Í'“%ÀO-¢\d2zóÍsv×R[Ü­Êmó#a"îPA ädwúW[ý˜ÞÓn¤¾©»+pÇ š0Û‰õç§Ö¹^?´¬øƒhƒ•Ï#=ªXÑÛëvz·ÄMMÕíàF’-öÒÛDz†Eàsž@ô¦^Ocá­LÓ5½-u;À­.Çs[ÆÇ…O9Áëš§âv}OLҦѬæ‡ITeEºC ¹ùƒIìrjÔºv›q hÒø’öæÂé•Ö&‚!,?)pHïœsÒ˜‘SÆRO©Ç¦]Ø@ñéfÙo ˆ· pÈÇ×=Ï\Õ‹›-ãNÒdñ õÕ¥ûÀ6‘¬‡Ê„.>l{Ñâ zçÃPiv:%ÔØ 1'\9bw1üGNÔ·Ú%ß–ËU–þÖÚîæ=’}¾o/Ì+Æàpx4ľ ñ}׆šÃOðô²YiÂ9Š÷YäÈý p+Är_Á´ò¢½Úî’÷…‡€î+CUÕ¡ðìÚ3ÙYêÍl§|ó©a–9ÂîÕZÝ_-¾¯ ý›»·Óô›“oim22Œ‰IßÏÖ™­ø^÷^šÛT†HTßB³4w3„`ǃ׷Æ©’ºëž%¾Ðoÿ³ô¹žÖÂÝTD‡xÆCŸ\æ¤Õ|%â!Õ ò [øÄ».æÅ¿ˆŒõÿ“R×,´ ‹]:mÏW{$T–KÀNöêT#åôç¥QñxÔµýN=A#–êÚh”ÁäFJĽ6:`ö¡½5äCâ›»H :t1$æÖ%îÝq#0§?¥eéiñ_FÚœOi‚`“cg±Î hø† h’ÜNd¯”¾x\l¶}ñŠÍÒlmµ Ô†êý4øŠ“çÈ…€# Àçš—¸ÖÆ·/ïˆ$c!†=ªmÄlBùxùqøU½WB°š{g¿Ô†™}&?i ŸúƒjÇÿ´®¿Ä#ýcþÍrÿ´g…‰ÿ &®ò%tQÝúKòd½þïÌûBŠ(®C (¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠŠêI"¶™á‹Ï™P²E¸.ö…Ééž™¯Ä¯Ú—Æ>3Öþ/ëwÞ0Ògðþ¯u+‡Ó®˜bLq“üXF\…q޵ûu_‹¶Æ}3â÷Æjšu©:L’¤ ÁYìñˆÄ pW9n=¥\>!JÜŽç‚ßYM©[Û]Ûaš50MàÁʲƒØäƒŽâ»o ZßÜè“bé-ŸOU€ÈIVUmÒ'8Ú9<ôÝ\&¡nð[ÙÞ@ù‚O2&UÎbqŒîÿyHÁö5Öè:ôºá`¢ŽØ-ÓJ¿$Š7ùnܘ)aîô­v9¡ñux൱ÓαÊ×Âåe„n2Âê»JöpTú}kšñ=ž‡¯øØOæÊòyÔÏh,bS×f:yÇl×Y~ÒÁb›ÚïíÉ ÷YU•±ž‡9àvÇjã¼Uà…—Ä‰s¦ÝFm®%ly3$LOΤ{6p{ŒSC¶1ë^!ñÌú¯3ÛEf²É%¼£"%EêqÜ æÝpäŽW¸®~DÚÎÓŠ«Û©”—aŒO<ƒ_§?°\žgìíb¿ÜÔïÛæSýkó ¼{w¯Òïø'ü»¿gÝ çf³v3Ÿöb?Ö¡êÈ>ƒ‡Å0äpm%Áÿ!¯ñiòµ‹È3ÉÉí^Ü€¯Š-1ÔÛÊ8ÿ€×‰ø® Þ"»\Œ‰ gó4Öæ«á1¢›p9P$=ÉéU®˜¯ ‘žqV|¢$PG ó“P]($ü»IëTA«aà\1cÈç¹ï^/ñisœà)ãÛíº hì÷ðTç“Ö¼Kâ.^Þð*dì9`O¥43å?ß?—û¾R:ŠïgKy ²Ý8Çl±´¨›¼ÅÎA<Ž„°ÏøW®Í%¶¨dˆ‘*¶U½ w²X«ÛÚ\«§Ûd€Gq±PqÈeÏÈ#Ú“ÜDz†«s§Þ‹8Í´!þë‚ÝøÿJëòê6ßeO Å›œI`K/—܆b7s¸ÛB;[´·¸´ŠäÛRîluÀ>œ×e”Vº¥´Ûü½ÒÅx±Y\îR\gi€6ý*$kÚ(Zø’ÇÄWw7qÃks{=¬WÁH1ÌPbVã,HÉÆ{ó\ÛoxÇW3jRGh°ÍêÜ¡O8ÉàƒžúŠëÖ-3WÔmͼ>\²ê›xY€…®Êtd)=q“\7€|O}qã ´Ý{;Ӯ°ÝÛÈÜļå—Ѓü¨ê/R´š‹éš†ŸáÕ™t¯5n®™™!@8( §šÂàóèk~µðÖ‘­éVE¨›©žî#ÊáH=sÁö¬ÐÝx[$¬Cwg¼þÄ®öŽðÀ=â»´•úEâž4yòAà~5ù©û³Ú/Â=†ë…?ø -~•xœÄžàc·?I+â‘Eh”x€qõz[éÚëjëV³Gk!¹k(Ù¾Òù¶tÁ==üÆRµñ–»ñ Gѵ+æš9cc¿Ý€ŽrqÑxÁ¨SD—Àö×W—ßaÕ"p°¬¿“ÏÏÓ"¥³ñ[xž[Ë4ûM:òòЬáTgﱈì@Æj #@ŸÂöº„ž#Ó¤Mh×ýŸcNû†ÝŒ¹Áó@3“Eû]ËmB’ŰïŠêõ½`i6™'†æº±Òäi7;Kûß4äÛã¥rd,×. WH‹|«Ôõ®êÇÅ×_ 4ÈSÃ×PÞ-ñw’îhC#´!'w©Eu6‹§x£M°ÔµOE£ê³E‡K˜YÄê§ û”ðHõÔ×ÿ¯¼-|4{x­¦Óm"ÿI¶IÔw ‘ž£GÃ7Ÿ’×[µºÓí§š-³Á{t–ÃÌRA1†À ú }÷ŠômÛiZ†¬u{»8ã†MNGL¬=6°1zU Ô«7€µeÖÿµb•~ÀnÿiiÓÎDÎì´{·gÔáâ V½’ßMÐ`ÓõGÞ°jÍ'Îüà”,W'Ø´Ùü/â·ñ*jööóZKr¦-H@ÿge$c/ `à‚jYmü"š”ÙuXC²CpTÛ<ƒ9ÙÀ<ƒž”—?3†¹µ¸²º0ßC5¼È~x§R®;ò5Ôhéo®èk²ØØZÌÚí“Ìdb0cÛ‘‘Œ¼W-=äÚ•Ç›q1•ÉæF5ÚhÖ÷ÿ4Ïìc{ϧ”û$÷’˜ár6ƒQBÚÔž°„x{Q_j‘ï„[Cc›I8õæ•ü;©|E†ßT†æÆÊ´R¥ÝÂ[†e=SvÎzU‹˜Ã+?°jvzf¼÷Ry¢2Þ|  c*ÃóÛSPÐuZÛßø{Cž{(‘’KM6u¶`yàdà‚9£¦¢[—.uýà m¤êž´×®í Mu4®3ÉÚ…{æ²µ}]ºÕ_TÓìo®l «Áw b €@,ÑŽ„U»Øt(a´‡Ä§PMYmÕì›WËœ )$ã0j–­â}_H× WRÛÛ¨D‚\„’< `wÍŠ~.]oÓLÿh%¾Ô²`Ä?òÏ uëžj߃¢·³2ëMt³^Ø«IS¹°¼>}==ª—Šô›M2ø›{¥‘¤%¤µ*CÛ·÷Iïõ­iò-à×®&…,4ü™cÞ<Çœ.Î¥NpOJ:‡M©¥x“Vø‡ö‡pöé<ð™b™#X†S@û¤qÏJ}—‡fø{¦jzì6z…µÒ$1ÙÁt“G+nÏÌPåp±æ™gâ ?Øj:n‹ ZhºœðhX´ê¤3GËpHºÕ/èÓiv¯ü$¶w¶zG–¡£‘ Rw|»7£žÞÔzКþí|Y¡˜<3¢IÃϧؙ&wȲä³Ç# ¨íôÛ[M ñtZ…‹Ç9ÁSdê1ó®Ëœ”ëë½7HðÔ×>{ÄV™Rîâé—ÍA” “Þ¢³„øçJKkZ[¶—ÉKë°Ò .‡ð«—֚߃¯¢ð¾•&œér’]ÚÄï,’&0¤NÐ{U?ÙÅ6•¬¶¶f¶ðóD¬d wy»¾CF ëíZlÓ¼%á‹ÍKÂ7×sÜIpÏupŠ’[§$b{ÒR¾‹aksàûŸøJ¥º²µŠéE¤Á O¸ƒ½B·ðô'56­¬§ƒ<5§¯„¯î µÔÒ4ú‹#Œ…{`S¡žÿâ†äm_RŽ ‹ ”Xõ ç+ÈÄg¦20;Ô³Î>h1[ìßK}9›s'ŸjFÝÊ2yçŠjáäÊwV7ô;-VûR‚Òþ'{wšùʤàrÀ<ŒàñT|Gp<9£Zø}ã·¾˜/œ×EwlÜrMýß_Z·ªØê_4›+Ý'O]¶Å šÂÐŽ&êG®j®¿káÍ?OÖm¥:ÔjÆ=¯´ÛÆ[„qß¡úPŽZÁ­¡º‚[ÈæÐH<Ø£}ŒëÜì}ë©ñ­ä× ¤Ë¥-žˆ-BÚG1òð~ucýìõ5ÊØCo5Ô u3[Û4d™yEîBñŸ¦k»×ü[}౦éÞ¿uÒÖØIÎÀ>Ӹ嘎yÈÆ3Å.…15]H¿·Ò®g¬>ŸA%ÍÚ!n¤zž2HuÏ\kº¬wð]ÚÛ-ú%ÃÃ{>ÙbÜ2räzw©o|k§išÒZˤÙêIfÉÔ&ˆئìžÀŽRñ?†uÿkRêöVW:µÊ¤ñ\ÁeE=#îàÔÚÃxnMacÔ–áï±Ï5»| äcש sÅZmå®­<÷ íÙbœ–U<‚~µ{Á‘ë»›[“ ÒžÙþÐÍÊÆ!‡lç¥PñEåäÚÅÄLWÊm«?"¯l{c¶<'ªÞê¶3ø]î\é³ÄòF™ùa—Þ}Ž0iuBÝ•® ØÞjº.§>§xD–ÜEä†8ß÷Žî?*ŽÓÄ:ÇÄ k­/S¿{–H|è'¸s¶2§£Cš›IðÔþ ŽïY¾šÆòÞ8Lk ¼âe•› AõïQC«Åâ3Q²Ó´‹]+P1 خߴ(?2ãבŒSBa£7ô»ýJüÙj"lZÅm¢hßIqŽœ }MEöçñ†‹qa¤höö7q”‘ítôb×KÓ8$’À‘ÀõéPèz=Æ‘e¨¶¿euk¤ÈªŽ®†7wòò:üêinô;@»ºðËßGrVâK—_24'›@ã=Mƒ)ØésiZUòëÖwV¶nÊ9#1ÊdÓpôà×;À×J­#ÇlXp2ÁsÉÇsŽÕÒi÷³x§H¾‹U¿m–åeŠîoŸc ûäW7 ±–é Y#Ø wl ÉÆIì=é0]NûYñDþ Ñô{? _OŒ¨óð¡á÷A;qÀÛ“Pju×´‹fâúÞÖùC[ÈoËí<2œuçš±©_[ø @Óôk;NÖîžæY%ýìK¸àØ{¢¨ø’Öÿƺn—¨iZ{=œ1v³´+làä€csO –äšÅô~°ÓôK>ÏUž43Êó~ñAs#oLc¥W×´mKÆmg¨hÚd÷vmE¶µˆ·ÙÊðÈíV.­ô­+DÓl¼OmzÚš+[y<1ˆàƒÏSŽÕOÆZ¤–GLM*I,ô³)µÙ'-ýâÇ›9Í^Dº¤ze•¦iâ¯T† öw Ñ.rªÙ$Egø×Ró¯-a´ÌZ["ÚD#f9Ï©ÎI>¦´.´+MkNÓﯵ8ô}Bh@1Ü¡a>€ºÅTñeçöJÇ¡Z•’ÎF2ºŒÊÄd°=†Iâ#ŸÓõ)ô‹¸ní$òîc$«c8®ËXðn­â™"Ö#kxþÙÊcº¸X˜œs·wPzצÝAey÷6qßÂ¤î·•Š«ñÜ‚ t~3‡QÖîíµ kIäÓä·O A ˆœ0hé©]KºÎ£cák‹m*ïIµÖ§³€G4·;²ó…Á ñY^+µ¾Õï¢Ô-íæ¸²š$hZ‰T6qœA­MjÏHŠ+¼A-ݾ° O9­v¶øw‚>ö=ꟊuëÍ'S‚×Nºx, ÔÆÜ:u }ýhd®ƒõ M­c×e¼Žü@¢±m8=È<ã­gkšÕåÜvÖ³Ikghù “ß5§¨øhk’A¨\êVzMÅÜK+ÁvXHꃀx<úÕ GX]ál!† ¸m€O2x/ƒœò8ÔÁx‹N [ßK*GssÊöÍë‘×ñ8÷¬½7K¹ÖnãµµŒK3B– ÇÔ+GÄQÝêw'Wui º¼ÓŽ9ü+1!tòÃo‚™ÍKÜ¥±×x‡SÒ­îá´ŸO7sÛF±Ip&!‰¸àâ²üLn®õO>ÝfkFE6æ0HXñÀÈî+w_дD¾_í]VkMJHÕ¦H`Þ¡ˆçvHÁª~ ñ5ö…¬5ž•q%•¼kK#ÌLu>¹¦HkÖgÚm?´o$¶¿h#7+ {€nù÷ÅWÕ|Q¨iZ„Pé—rÙ[Û*ˆ M´ÇsÖ¤Õ|1uªMo|’ÛÂפÆ+‰v²’:óØðeî­k¢]ÇftëmKì¨#gº\înøç¥=w–‰6¼ÐjIso—h㸛 »¡?CÖ©ë³Gd‘i¾\sIn»^r>bzàAš~»§ÞêwI{\Û\ hÌQ«Ûh¦EMâË+}8ÚÚÝo:Ìp(¹ÚFÕn¡O«€O¨4»…¶1ô›«+KÔ’úÈ_Ûí!¡22dö9R­ã;»éõƸiË‘ h‰ ³N•‘¥ÛZ]^ÅåÓZ@~ô¢=ûOÓ"º-{Å·ÖZ¡·²o³ÚÛQí¨î}I¤¶)î-\É šÎ£sc$(Ò!YFìu9aŽ1Qjþ%¾ÐÓ'’ÎÚÝbØq¼CýOZ.ü1{¯Î—°Ëm\Ƴyw3ˆÈ'Ó=¸ýiú®¥a¢Ïo§½¶®mQUæH,G%FvöúÕ^dèG©h—ž!òõ14+-ÄbGŽâm®ä’ \õÎ3Vµ Í7ÃC¦M§ÚëWq¡ÎÎJ¡' !þµ›â [Íjí/m,å–ÒT$¶‰™b6qœc¥YÔí´èí4øµIn#ÔRIå¨8ùC{еÊ^!¼“Y’;È­¼«1DŠýÜ q´zU0ŸøDo9ãíwìzÕ]jeµ[Z3-‰Œ2ù鞤ûæ®é€Âwòœ›¢7öẉìCáøø_÷Çó¯S^ƒ#3¸×–xCþ>zoêÅÌONÆŽˆkvs^&9ñ†3çõª~9¼QòjÞ¾ÛüM¡‡ŸÐwª¾:FDL@úÐfqì—µ¹  Ö# Ç~µ» )ãÜö¡·°•€P½HžœV‹ec˜dò¿eZ©`!@ëõ«ñ;,, žHÇQïRkbÿ…v¹sŽ‚ÓêkìïØ´ľüãþ^$éþè¯|£ûføàä©äûšû7ö-BtëãÛÏ—ù 空:)ìý¨Ôu4í¿þª]¼ S±Í#2=™#4ìt©øÁ Œ‘íLcqøRíàR‘€)G=h„P9¥ãÓŠ1@ ¯¥.)ÁqÖ—µ0Å(SÍ.3õ¥Ç>”n?*B)ÀqAéšb#=å¤QÇ4ð(¸â—Å)RàÀ c@ síNëJW°â€Í" ‘Jx âÚsF9éJ„Šp9þt 1ÇZ6ät§¸)¬v7¨ ÁÚÀ@qJ¼ŠËëŠb\qÓÜÓ±ƒ@è?¥)8 LL`ú})Øã¯çHì|´â>4éŽ?†¹¯ ŸÚ+Ã$öÐuoýe]/‰¸Ófçµf~Ïp©øû¥³*’¾ÕYIÁûVœ2?Gã]w~’ü™/ü¿3ëš(¢¹€¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯ÇÏø(>³á-{öÕ›Ãïo#"B.®¬°Q®‚.qûcºg©5û_Ÿ·¯Á¿ü4øÁ%„V=1g´Šù¬Œ®bŽG.%ˆÉ£';Uö |>Y½’ïJ´²x’Þíd>r$e >›r?ÚÕø{_XôyÆFû˜|©Â ,`’x «œŽÅ} sj ¦ØgÜE Ä3Hn9m„ »Áê Î8ü{Waàéím´›™SÉ»ƒb/x…жôo÷·£\Ú¶–Ç$¥¦†¹f¬î²\…º[c““ü167qõ5Ãø«LÔôÏGq³¼’$±I8Qžô#>â½U¾[íœKqf!ò£’vDPÌ7l$vm¼pz®Äzþ­á¯¼N„G£ˆœYTáƒg¾àsøÐ½G3^ë_Ó_Ç7š•†ûm~áZ0Æ>Î’2íúò2F:\¬‘4r2°!ÁõÜ=¾›áˆð”éOvì<ëm,9Ç+©:+gõ®*iIÜîĶ}sÍQ› žq_¤ÿðOwÝðçžšåÏþ‹†¿7¶ýá‘×9+ôkþ àá¾êj ùuéøíƒ T¾æ}O¤â{~S Àÿß5ãþ3/ˆoäeÉõ&½‡"?éÇŽÙqÿ|òþ#¼%íÇæ¥%¹¯Ù9`ù'ãÞ¡š@ÀoVÚ¾¼Õ’ž^< dþU^òÚUNâyPFJ²LM]MÂ9B0yé‚+Ƽ}}‚ìdƒ¸çó¯c¿P-Ü>HÀ Ð z׎ü@p,¦(,§øÓ@|—âäêlûDН¯Ð×d¶s5â«”šØ!€så¼:àƒ×Ú¸ÿ˜ÓTmèÍ|¶$w®¼É3Yé÷{ÏØ§·afùƒ)ð#iqZãï6iuŸjŠ%G–6ê¹%C rFzúcÒ»-6{k+„³0£]±2ù…Î,Œ=A®ïJäu;[=F;ä™,¯’¡L¬Nò:1; ìôm&òP’¡äÙ³FmfŒ8¨ Øs‘ØŠÎ[jkNíès2èpÜÞ¤6“k ×QD¥‹‡’¾¤c×¥døKÇÃÆÞ-“Lñ vö–ú‚ÉÛ­àË á”e€ã=ú×Q®x~kg±M*ë1Zê?mKÁ"î…Ý–Èq÷HÆ28®gÃ:¾ƒãÝ[ÙiÐèúµè™`¾27”òqò“…Ü}8£pz=ìaØè£ÁZ6¿k¨ mJì¤6,‹å¬Ÿ;Ëœ zæ¹íØ8ÍoxsHþÌмUq¬–MB=–¶ðLåYäó0ìûÛqÛ¥a)œŒŠ­3g´~Ç’y´WƒrJ†že<úÁ ¯Ó/4{ž2vpé_˜¿²kù_´7XÛŠàóÖ'Ö¿O¼Dßñ'¹É¡8Å+Ü•¹â.•Þúl/®xÿdw®bñÃB‘Ûñ®»Å'ý"}«—%xSÛo_Ò¹k½Ó G_þ¹¬èüé¯üFcÎFsŒŽ½«.t Næž+^åLg8ã5—pr¯zö~u¹ÎŒ‹–É;Çô®Víf ñ´ŒwÅt7;²G$w5Îê¿-”¼œ€ÃÀ#Ð3äÏö]pϹâ‘Y™3ʶx5£w£Ûø®ËLÔµ=fßIÔ.!ÚæéK} )ÂÈ1Ó#ŽzÕOJ-¼@'W4RRË»r8«ú—‡µˆV–:Õ»Û$í†xg™bÐõŒ0Aè;ƒI£H’j6—ÃZ´ZWØ­®,ì|¸ÃÜBRr¿Qž£šDð±§xŽ=L¼O`&ûA»3!o,üIJgwCŒb¨x‡GÒ5[ ý RêÉ#Š[÷fWܱÁßÒ©Üi!´ñ_Û©-¥¸Þ.v°†HÏ^zci eëmsB¾žé|9£6—¬¥XfóÄ Œ˜…lg kC·žHïí5绳ÓDbIdo1” n§“ÅjYÁáËKû› këJÚ7’' ³ @Ð{U-'X¾ñÒ]iÚ¾¦í Äf[¹~e€©êØþ¼h–g÷N¶’³&J¬„`²ý;q]D­ƒô¨-n`±ÖÚy ëÏ™ cål ŸZæeO°ÞH‘Iû Q(+Qšì¢³·ð¦„–^.ÒæœÉ)–ÚÕ%òåˆ}ÀýÓ‘Ç ñI ‘êÖ[+y|é<›× ¼¶2Î8=G=iî#ŒÕµ‹Ÿjîëa™ð¤¢žÕÑD—&ðüºN›e ^Zl¬Hù†#åµno_|<µ¶¶ð¶§7Ø® J×Û6}§œW$ `|¹4ú\:Ù•äÐtÍjÆÚûZñѵ9¡R"’ÔËæŽØ†r1ØÔ·¿o¼70Ñm&ÒmB¦ÙáWwàeƒvç¶)ÒxJÿâ$pëQêm¬óE‰"Ô.„ÝIfF0zöª·úþ¤ÜÛé÷š=½üÖŠ‘I{&D™}ˆô‰âãJ¹É‘],x”4€~qÕO=úÕïX^M«E~-û& Åy1Sä„*IVn€‘œjÏñ6¨Úß½ÍäryW,d†á‡É*ú©ï€@«>–KzÛOYí.”Çq6¡s{`sŸj]GÐéì$ð͵¶¡yá#©&·«² ÇR:3&;€>¦²<9ysã =FÃVÔ[ìqÂ'×,\[0aÏ©ÎHÅ\Ðôë ^Þjú^±¯qao#ÇDc`O˸äò<Òéúö«ñÞóF¹–çhüø¥±!(rC‘Øúúдã š‡Zd÷Ú6¥m®KtË `>\Xùв7R*‚uÖ>*[‰`ŠÜ]Ú±E¤°# ¨ Ü–ßC‡ú]ÝÆ¹mi¨ÃtËk(’9—%z`UFüë¾H´-?ìQGr^âÎÐ;¹;~WÎI#¨ö§aúêvká­4íRÍ&Ô$,ñ3?g\ŽT©ÁίzÁÒEÛa}M'}<6%ÌM¿ì’ð5¹%½ºø^3­}¢+ÔiÌ/G÷†vç=0y¬-2ÚëØ­ç¼[ W`áÔ²Æ=Hš@Ž—Å%ÔtmZ´Ë¹,tå‚3iR|¯úœä|Ö­ç‚4cRŽ{ÛiW·*’Í§Í Va’Ž2{ŽMZ¸ø—¨|>0hz]µÅŒÆYïm–V˜‘¸²“ÑNxªz¿ÃWĺ”ú¾™5£Y]m¸_´ÞÅèþ­˜1ǰ=)ù1.àß/aÖÇìö˧ù¢µª4èËän ô5NÓáþµ¦jé¨Ìž^ ÆG¼2¡;A9%wnŽØïZSx·Ã'[Ëá¸%»YBkå\7²ÚyäV5ž‘âDñLrÏixEÅÃ#Ï4N!•s‡ù±‚1C}Ãеk¬èí%¾“¡gk Œ¶÷j‘•›ø 1ŠâfI¢›mÊ˃ï, †æ»È4ÿ XÞOq¤^^êöÑ»Çiq¬eÀê®0NÓÈçk‰¾Ôîµ›¿´^\5ÄÍŒÉ!Éöæ“Øhë<$÷/Ò¯ü?y~`Ó­aûM¼óŸÝÚÝ¢¶OãZ¶¶‘ü3ðýþ¡îŸâ oZ;eX•¤·Eq.¬[ŽføvêïÅž¼ðÅœ0Gu~l jr²RGã?{‚Oj¹§ønhú«x»M°]ãŠÉf]ÓJ!•”¸óÖ =ΡñCÃo§ÚÛÞXN$’ÎÂ$‚9•†à`n~4G§C௠¥§‹ôÙ.|û“-¶ž³l’!· å”ðGñUoï­n<"ø^ÒâÆ1r¦ö3)’c‘òŽvŸÎŸ£YYëð“ßͦÃÖÛ[¯,É1Èù×i#+øõ£¨Êþ'Ôb“HÓ[Ã6÷V@g-•žE›ŒïaíÓÚ¡Ô­íµ/ Yßj×ok«d·7›¤ 1¼ämÇ8<æ¯ßkïà H¼)©Í%½Ë4ͨÄm)l* Æ=3T|@·¾3Ò`ñ Äñ … ᵦ*~òÿ{Ÿ¥1­¥³_\Ãj²Ç› @Ò¶ÔR{±ì+¿Öµ»OØéÚº]†¹5¼fI¦¹S"ncœF»Šóûki¯¥ŠÖÞ4òÈ4A–v<w·ÖÚ‹£èö^(³½—U|vÒˆ¤†=ß*>AçÓŽ*PÙˆü9­xÚâËTÑt»›ë)­ÔG œE¾ÎWådÀéÈâ¬jçóÚ[ø– FçUKHÒâ[–0¯èÁ•³Æ+'ƺÜö—ZxÓ&–ÏFËöG mïž™mÙϽ^ÕnœT‹¥Eâ éÚ†¯¬E§\‡x"¸¹üøÁÏ8çƒÆjÍö½/ý;NÓ´É-õ”5Ó\Ëøä,qòÐ Qkj"´Ú-·ˆô=/RÕ5hô«éCG¾áKý¡á_ïÏz~³â7ðuµ†¥ù76É–I§ˆ:ÎìrYAè=)Ú¦‰«|H‡OÕtûty)`2$(®§’›Š®z müÚw†´ý;K×t´Õï`FffO$1á7# Øúâ€*ëºV¥ãAi¬[´âÛ$O"Ç岸]ÄdU½½–Ÿg¦ÝCçjvñíiëÈLt8ÏZwŠšâôÙ\éðÊš[B>Ω",}å$wÖ™¯[E&›a=ó¼:«D7GŒ‡PN»ƒŒQÜ;ºdv2^Bº„³ÁfIó%·@î8ãðy®¯Åž*Ô´«ÛK]2òkM:tÞ[½1Çýk”Óì¥{¨¸†ÛÌb— V4÷'Úë~)Ãmk£¦™a¨ÇiF’ê áØòJ“Ú’Ðl‹VðËø‘luYuK «ØUž Ç*Io3I®x•<5äèvÖv—ðY VšîÌìy8$p¹éQø—AÕüc{mªéöSj]»Ë#å(tÁcY}Æ=:Ï\µ¹ºÔà· q-´»6žHSê@=i‡b§Š÷|‡i‡c/Äz½Õ–¢°Ú»ÙÙ¤jm£GàÆz÷úÓ5Û,×óL‘\ϳÛ7ßéÃ}ÇçZÚψWó"Î(oí-ÑQ¤»„“¿Î5“âu¹Õ.—WËMÒ†óð¶0Tý1CèPÑ4+¯_¥™‹Ïe.<éV5Àëó1º}CÄF“©¥´ú¶¯öeX¤’v`\Ï*Gq°[Í<ˆG$’u5%¾¼Wg®éú j NòæÚý£SqöxÃ.ì{ô>µ(os'Å1^꺫ÞÅo$¶³¨xM´M±Pô^:c¦=ªÖ£c¤£ÀºÅÍÕ¾¢`_4@€…lq»Ž¸Æ5ï_èú©¶Ó'šÂÎ q¿TÇžùÿf¡áùµ§†ù.-­ä¹]¢¸”©Üx$pxïT.Á¯ëWz.¢–úUĶvI ù;$²œ’8$õ>ô·:Þ †Öý®í­g¸O™.œ©b27Ž.¯«[ø~æßMK+]IlÐ#ÉsðíÎHÏðäð>•SZÓµ/4z¥œ—6¯!m¢%`Çp:t¡ù‚ò]–="Ò !+¦‰7=Áå°ØSŒ€:~í7wü!wxû¿i?žÁPjöÿd³µ·¿š”I˜ÁE쯞â¥Óøð}Ð ÜN?Ùº‡Až?¿¯Oçi }+Í<£ÍÎy+ÒJälûÑÑ nÎk^ ø“DÁ9ój«ãpDI–ÜOøÕTŸøJ4L­æ1È>ÕWÇ œcëIl)lrþ®/Æ·48ëXnr‘} nè²ç$qÀ¦LNÆÍYUO1Íh,f\e†áÎü‘Tí”* ¼sÇÒ®„_%ælm'¹¤jjø0ÄÛP!·~å?™¯³¿b±*ôùí7ô¯<†Õõ,‘ ëÛ'½}Ÿû/üJoý5˜þ¢¹ªnŽˆlý¨@àRãæÇëJ£Š\Pgq6ÒcÒŸŒw¥Ûš@3Rãð¥ÆiÄcé€Ý§8­ ìgÚŸ·Öª÷¥Ú1O”¯ ã6ÐPóOdžô”ÄFGôm8õžÕô¯M«ž(ãM—>•_àü—} 㯅õ_ý*Ó+¢ŽïÒ_úKÿ/Ìú¾Š(®C (¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ñóöèø+«|5ø±}5ψ®¼Rú¢&«æ\§úAŽG’<8>[F ýƒ¯ÇÏÛÎËâ>›ñ–þóÆ‹o]0–ÁôéwB–™hâ#ø&<܂ڨîµ+ìHù…þÎö)éx™eg†T\q†=Ëø]—ƒt›H¬®d•ZT’ÔIlUˆóHfðUÄ|µžõËK Z¾– ’¬öÓ³JNÙcaÊg {ö®“Á3ê6×rO±bˆN>]ܹ+òÓîœã¯µ“Ðâ‡Ä¬fëö¯©èh ò®ñÍ<2HHY@+¹Hà†P¹äa”à\·‹|f±kÑÚ^éÐMö&Uó¤Œ g%Tã;FxÍzU“ØèR_ØÞÑdHÌD§Ü*J”öÈ!ÿhúWžøþûÃz®½n“­Ä7¨6•ØÑçz…ÀϵwèTמ¢ÜøRßMøŸm¨ÝÜ5æ‚ê·vTí*Ë™x®vêtžêiUvrÀŠ é[7:³?Å{? ÝܲÛ<ÈQ#“÷F»ƒŒðFÞk#Q[uÔn¸>@•‚sÉâ©XÎI‘íÈ`xÇLz×è‡ü¤±øAâ=\b?x¿Â¿<6ásžž§­~„Á8äßð»ÅÿsYRGÖÿ –fϨÜâ3¶|ßýÕå_Ò8µû¢0s';»s^°ø#ÒsÈß Çý³jòŸˆó®Ü¯ î!JŽ§Ò…¹ªØåREêsƒTgr ²~ö)êX9Š9&ã’{Õfê*M»`@ 0’kÇ~ Û2XÜÌä.ƒžýkÙµ(ȳ“.“œ×ˆ|M¾ÉvR6çœS@|™â|TÆÏ¶=ø-Œàg­wê}šÂ4 ÖŸeýÜ¡~GÚ@ÀÓ©úןøt𛡠1le¾µÞ[]¤:u†›å«"CçyÁi _è(ê!×ÚTºˆµºµÚÆXÂÉ È‘Á#*ð‘Äô]ÞêêÁ¤Ên³2(A‚gŒàdg•罜Ó[»e’[gˆا÷N¤†Cïѳïí^‡£ÝÞÉhóÈÛ#[§À*X. ×vݹëœg­g-añ:Ã_èÒiðÙ¨—P‡TY2íž23»?Ü*Esz^ƒáKâÇö³ÉzWƒL‘@A&ø†ry®‡W×.4X¢—l“Mª–·…‰Ê0?(úŒû×5mà+mǨéšÌv–²½ÌVð;}©ä…e#ïbzQµŠnûÚSê-·ñ î³9)¥Á„FO¹#8G§=Ma¢–Æ@­ÛmVëdzk— k„6Ð½Üæ#°ÊK oþñÏo­`†ÛœqÆ)ßæc+\õÙqÊ~Ð= ÔÐzåXWêˆÈ:=×oô¯ËÙ‰Â|ðwþÕ‹¯ã_¨þ"´›Ÿà4–§x°vÇv‚žzJå.†N1ÉàJëÇ¥M«é:—-4ýGEÓíb„Äö–ƒ‹g È9 äo­Ãx–D æF%b@8ÈÏ<ý*¶·s;YéÒhKw”¨Û2ÌѾï˜9ONi4\nhê§Cûe¬òÜ]aŽ;‰`qå‚pÇ'ÉBã\Õ­|YöV‘Ú(mÌmà`ÛNjî«£éZ¯Ø§Ôu'Ó5™áÍ·h·+ö [?)# þ3Ôlõ¦0Ýe‚ÝauËè>½érÆŸ éš­.£k¬Å~Ö;å[%Œ‰rÀ9È`;ý*;OÞxñnôÉÅ­µÜ°–†XbXƒ9Øç SêiÖ^ ¹ðæ´º„·¶sÙZ––_.]Òü¬„u=^µ j¶~%K»]#DƒIÔ¥‹¥¡bg畞N´ äÞ&Ó¯^)‘ZHØ©PÙ\qÔ{ŠëtÛ++Ï Åÿ EÅÞ›w -&Šò¾TnR¬GÊ0;÷®RKy4íBK{ø&ŠXœ¤°8Û"°à©¡Ïc]m¢KñFGÕµ˜ì¥±—ÊŽúü»$Š@Ägh'#œt©Có,Ëã-Gáí­•¿…5Kˆ,n#gk6ý “‚s€G§½%Ï‚çñœvÚÂêºu•ÅÜ!žÖþfŽFaÁ)òAã"¥›Ä'áæ›c¦E™¯¤›îï-–â“åï^:sPj¾×|säëš6žnìÞ8ìì …$8À¦û2Qr_éú>®º}Χ^ý›e³ês ʕÀ.ÔvÏaTSÁ^&Ó¼Nš„¶3ý§2BUÌ2DrwÓsÁ«—Ú„â½K][J¸ºÖF²êPÝ•ÌAÝ`1ÏLÖWÛõû¹Iñ-ÁG·`ÞKÆN¶í4ýF¶0|E.“.¦çE‚{k3Ñ'Hs܃Áì1ǽtzuå¿…¼0Ú¾…wpu‚c†îIP!µ-ž#ä–æÀ5Îø†ÇOÓµI#Ó/>Ûc‡)·iÏ+×;õÐè³èrkÑÜÚêwWA"­˜’I"eeÚNG=sHlµgoñSNVÔµkkKËI¶-ö§#$R«¸Xó uÇCK.¢Ÿ, Óf´Ò|G$’<Åçíê:~ì°qÉÀ4Ö‡Pø›¡”ÓlìíîìçÝ%•°Kxå 0…Ü1ƒÏ9¡¬l<¤[éÞ0Ò'º¼;ÅkÇ“-ºqœ°È9#ÏZa±£á}oÇÿa¿ðþ=å«Eå KÝä8Îå ;wíV/…­š+OÚ_Ë®,*“\YÝ“ ¥Np:àŒÖ_‰n§H¬$Ñê BL"2ÌQ³ó cvqWõFÖ•楬+Xº†6šÙ­÷£`6àÃi`9ãŠÚç5â{›ÇÕ® œ•HÛ ?*®>\{c©à\YÞ7v²Õ‘:Æ¿8, †S×#5_ÆZååÕßö\¥…–žLVп%ŽsþÖ«>Ö-ôÝAm%·¶ó¯?wû.é-‚ ¯ $Œþ·aÓS_FðMÏ„ngÖo®ìç±³ŽMÑ[N$yxÚ—žsQÙêÐx¯LÔ´ÝB¶ÒuI¢ ¶Ì±7§,€Áö¨ü1á-kÃÚ³ÝjöYé^T«w,êvK ä’1V,®´´ÍVo Úß[ëÛç7“e#y 9Å Èo}Jú&‡&§j1xÂÊþÏI ÆÀÇ+Kž{ÇÏ£Õµ ?EÐÚo Éu¬ó¯Ÿ=ËŠ$Ò`uúž¯¦hme¥ßi0k7p¬rÜ3•`rNÕ#¨ëÞ¡ñâ OY“VÓ¬/nì$*ö×vð1‰S¨$ wÏ¥^¿‡Ã–v–6¾)‹PMn8${' Qrv‰)ËÇn•Ÿâ/jºˆZÞÂî[K8Õ¼¹ $Xxî½7æ$lÜØø'þ—j ª‰T¼qùcyxÊôÜœäæ²!ñ׈/|@tû›Û™­¥œÂöaÚœluü+JãÀZMö¦eÿ„†ÚÎîWY[Its*“‚T?ÝÏ'®1Hß®nïŸMšÊÁ,žS̶q‹ˆòpI·vsך{y ñ)ØxRßBÕûû^Òö-ÓmØù§ùHÇçŠåµmUµÝA®ZÞ v| –ñˆÓÀÀíÉïֺˇzï†õ8õ+è"]6&{”¸ŠU+‚J¬NHìGæ¹-^âÆêø¾ŸfÖVíŒB\¾¨'žzâ¥ìWS¦Ðï¡ÿ„cS³Òl¶ºþþå$fkˆ·å‚.p¤ tŠ<7ÿ=UµñÅÌdb9æE/,Rç(n¹Èö§xj[=Ú–§¥Ï<ž Š-’FÈ[¡~dCÕ¸>”í&ÿPøƒ¦ê6•è&—1ß\p‘ãGcŸBx W,ý¾ÛÁ:÷¾Ô®.¥¹™ašõâЀ Žqžy¦‡Ô~)èÍ6¡¨Â—öû]ô…DaÂçæôéRAd~èw7sI§ëO"ÂÆ|ë|/ÌK>œS.ÅßÄm(t-";y,æ->b +nIÛЊæ=¥´ø{¡ÛÙßÙØx†æêV›Êrd†$VÇR}=+3ı\x§I´ÕtÍâ—@{“k^-¼ðGØôM"He±·ˆH'–Âä±Ý»žÜô_Xðž£ã)­õ›G€-ôJì——+ ˆÊñÅúÅ—‡ì4ý'SÑíµ‹»h‰yff0ÄŠTòj‰ì5M~æJÂÊ{=á_'ì‘°ÆÃ´pAãò§ÐJæ…ÿˆô}.ê +ý jkX’.§wWÈÿtŒã¶sXÚí®¯>¸níá¹™$`ÖÓAm+ü8#ŠÖ×­tO´[¦·%ÔÏ“¹û6Ò±ü\}ìc'>µˆ˜nAÜw«—Ú¤ŽÛI›O°ÖeI’K„''8C»î:ÖoŠV}U ÕmíÊéϪ,c䀎 {sš~C0í,nu+˜m-`k‹‰[lqF2Î}®×[mN·Ó¬µ›[«JuY¤·“Ë1Ÿî¹"¸T¸x ȎѺœ‰à¡®×RÐl58ôëÍKYL¼¹ZQ$fMÞÁÈëR†Ê^/Ö.lï­E„òZi‚Ý>È#b §õ9ëZ:†ƒ§k/ey«kèw·Ë$©$ .ãÐ)$sÍ&«ã ï][éº<‹­¬*Y"V2ç’üç‚j [Ú—‹æ·Õ­Uo" Ë4«Ö7ÅQ=™.±âËï ]G¥éŒÚÚ%@Ó s&FsÏ@sÚ©jÔwZ\òÙØÁVNYOr{Ÿþ½X¿ÐWUŽÖö[ûk «ˆÕšÞã “ý쎀õÅ;P×?áiAÚBƒ{ÜÄ9ëÆzM/0ZèPÕ¢kÝ>×QšP·r'ÎÕÀ8 >¢¬Ø!_\1îº`za·â)¾#†ëZ‚=r8÷ÚÊ¡d UºmÀÀŽ0*}<Çÿ Ç'Íûcœc`ïO¨žÅo6.S¾\W¦?̯1ð‰ÅÂÿ¾+Óà{R{·g3¬Œx›G*só±ÀúUI½“Њ½~_hjNçÏ·Ê}k3ÆgçP cþ4"^Ìæ$ábúè|>›±Î1ÍsÒ}ØÏµt~Æ5ŸNmkEY,"csi1ó­#Ý$QÔ• ƒìÀú×GàdÔÞØZÆ»&¶Û}kÊüá=:ûYI-5mš¸ópìF?×AâßÝ¡¸*Š`‘TG^xÊŸø þ•Èü@ð…Ô÷¶š–Ÿ›•ẕ̌©ÉµpPût ú7±¤£mYs’z5M[U»ñ§†#·Tehì•§OÞ•ÏMÝBÖn±j,u[«Eí¼­Aààâ¶¼CâÛyðÎ=}k‰ø}ð0|m±Õ¯%×I‚ …´XƒÍ26ÝÌ~ðÀ_ε¥ T—,Q.J*íŸøYõ7ã%Ýï]Η,0hÖNëˆâ-æÚêHùǸéǨ¯¡~*ÿÁ;uýI¾Ö´Ïéú«B¬éfÖòC,„ÛW¨Î¯¥|צm ¬LÆ[¨‘·Hv†êߌùÖ“¡:~ô–€¤žÆž¥,öqؘ’ÚH‹Æêq½ƒaÁ÷µ¼g{¨m£‡Q[5™æ±bÀ´‡å.§Áù¬ µ9ì-ãµB r¨˜‡PÊrHùsÓ¦+RãDžöæ×T³ÿHµ¹ˆ3ÆoÇÊÊG\qz`×<‘kW Ë¯-½ÄÓ^Ûüš~£gŒy¨»HÝîÃgµdéž ñ‚¾#Å©Äî¶°Ü´ñêªT¤©÷·u=GP}륺ÕôRçþ&P(0ÞÛ[]]+’Êj»¯NÁ#¯S“\n¯ø_âד}Úš+²³ÚI–‚XûB¥zê1Y²ôõ5›bã\ƒÃ–XÃr¯szwoIX0 1ò(9?ˆ®o+’H-îk¦šçNÐï¹aÈÈâšÙ\‡cÒÿfù |Ãþ'6Àý ×ꦶ¥ô‹‚ü³"¿(ÿg©<ŸÞaÔkvŸú0Wêî´AÒ®3ÿ<Ï…BÔ•¹âþ,Rnö¨ áî<äb¸»ÂË;Û@ìsø×câÉ W‘¥¿pžÃ¿5ÆÎŠù$f玔QøšÿÄftï¼pIíÀïT¤TÎIažÀµvfaòç+íßÖ¨Mžý$v­Y‰Ÿxû˜ƒÆz‚+PeÁlds[·®Hlöô®Sµ2IÀ;àt¡Ï“þ$BOˆ¤A»a™¹qÞ«^ëw>±ÓâÑ/fŽÊui~ѦVÎ#Û*çÄ´xüE*+a1‡lКëx ÆÞÖÑ,5qºfšæÜMÀØpxæ—[¢ã°š‡†ŸÅØê§R´´º¼ˆy–÷NÊ䃷rðFÇ-ÿŒmáÕ#Ó›K²‘-™ Ò@¾xeãvìdóëPë>Ô¼T,õ}2$– ­Ô˜–EŒÀËÃ*© ÏfúÿË­[Û^éÒI©DR9ï’b"y9dïÏž¥\‡MðWˆ4}rFþÊTÓ Î&½õR. a‘ê;Tiq 4óxrÒîßPŽ*—2 ÜüÌœd;T6¯¯/RêX癣š97yL‡® ãr>•~ßOÐt4»Õ4^çQ¾´‰˜[Ín#ò²@ÜqÞOaëÞ’ìpÞa¹¸ónec¸üÎy&»h­¯¾$èPÁg¬7šs„xÁŽÚ)#+…rN˃Üç5Ç]ÞO¬j\ÝÍæO3n’fþ#Üšéeñ‡c·ÐtùVH&êÖÍ^GíÂË“ŽGlÒCêi;Øø/M¶ÒüO¢C¬ÜwŽ%¹*`CýÙ#lžz‘YÞ$MGPk;½Öôi l¾HµGq>ò±ÁîjÌVZlZ”~.þѵdt·û8eŒîW3œt¨µo_øKì¶¾Ô®m4©`߈û~Ñ’wo‚sÁ)ú¿}¢ø^þþ#«j—š~±:#Oo ñÈ#=ý3NOŠ~"þ×þŸ¾»þÄó~ÊÚošØHó·ß½^·ñ4±êrxNÓ/o%“N¼órÄrT„+ƒŽ2EI7Ä•ME4™t½=l`›ËŸb‰oýÒæm»Ï® Å=ž‚Ñùœo‰4øFõG´–×ê9Ymœ°Ç£d 0ï]ƒfÚ‡q¬ëVPÞi7è« ™—‰Ü7Sµ·&ܸ<úW7¯hÞ¿òoãÚî<ÄpÁ„ŠO O_CÍt>‚&Ó5S­ÇqmáÙc÷"üæ@ØS a‚~ö}ªz•¹=ü靸mÇ…t‰¬bK ×VvìóI’¿+’Åx?JM?OÒîô Qâû«ý-¢–Híd†$̼\”ù©o5 ?Ãkß__5ÂÇsuuµ&‹*£oO­,ÒüJÓ-ï5­~ 6îÞV„_ê†FK…88ʆ9:¯_¸_Ò,tß G¬èšÑÕïm``±ˆ|³c‚än;†)ºW5Ÿj'HÕn¥’Êð<yƒ ãÃÒ#Âóx2[½^êîÆòÖÚS¬Â_4·Ê†8óOñ A®êß-/tëÛ¨þÕ‹ˆç“÷hppUÏNsÁ>”Ø4æð&tu›[]N;Éa´oŠä—ܧ¨Qm|<_¦ßiÚ.‹o§j.ªæ+0GÚO+ÉëÈâ£Òtuдëø|[ay€tòáË—ÍÏT$Ó9ë@ ÕCø—Ë>‡¦}’ÎÒVk«+bÏå’2$9ÉÛŒòzf¹+{–³Ì‘»Å:RD8+ïšêu«›M;ÃÈÞ’æ=>âà¬í;7p*¶ããŽkÒu9ô{Èïí¦òo-Ø<$¨o›èxüèØÞèZ~¿m§ßêúäZ¥qn›¢–ظ˜ !!† ê*Ö£ñ/RðËèz|VͦZ¢BêÝ%v ²³ ®sÔUmGÂÚ—Äk­ÛÜYC%Ô I åÒÀw®T” ÁSŽ*Ωâ}D»·Ó5Ùë“ÙÂI3:ÊÛX·¶sïš~‚D_ õ½OTþÒ³x$´™–äJ÷q‰‘NLeƒdg ªí¯Šü/7‰%ðôÞ¼¾\Z¡šL,œ!vÓ펆±u­IJx–MJÖÒöâ™d‚ö(\ÂTà¯ÌÐ0y­¦Ó¼.¾û.uÖãx¶Û´–Lçh8 xêyô¡o újsÚ5†·Š/ín¼¹ÅȸW²s¼äŒc"±5Ë}2ÛQtÒ.g¹µÛ%Ê|ãžÏOjé´ïkÚÖº4Ûû»‹›;© ¼–LdžÈàvÛšæµíhZ›[%í½ø^D¶ìJý@äwíIÒxRÒ?è÷¾%{›kÙ&€X ÌêÌvæQŒmüNsVmµkhwúM…¥ú¸Xl¢X…Ê©ÃéÈÎEVð^“%…ž¡­êÑ0Ðe·’Áé-/<yÉ«QÞéw^ÕÇ…l'ÓïF×),ÆY Üùg¨äŒŠ;Kðü¾ðþ¢|[§Hš}Ĉ°Ù +È9.¤g½WÕ5(|+æxR« Ö/7ÈÏ.@ù #øzþ5†cWеK\\Úé±4oã!wŠRqµCuÈíVÞþßÀz#ÝøcR–õ®çò¤¼xÂl 2®N'špõ*YCmâ,Þ ÔÞÂ[yŒV÷o˜ed©ß5¹z|-¢Ã¤i—k{exi.ü¬ `N1´w«RCñ/EK©.`Q³œÄíq Š9U†F?Ú9úŠVEð†ãÑõkmFòwy•·‡[u8FI#ùÐ#µ-æŠy!Žá#1‚Oºàuu¾&´½ñež•¤i²}a0‹;HÙ…»©ù‡rAÏó\ºÂeG¸W6âEó<³†ÛÜ{⺯ë¥ÚiI \\Yèû fyŒû¾mä7JKbº“ê6M¦oâf¼‡TH0ÂÓãLåÃÈõª~ ñî}k•u%¥„p¡µÚxu<î>§9Í]ºÐ­¼G§iš–¥«Ã£ßO ö¤fóÀ8Wã¦EK¬xª_<6œ"¼³·‰O›uo5%†zNW˜¼†ÝxBßÄr[ßË­ÙiwW±,­kt¶â:ü ã8õ[TñZè÷é`š}­Í½¢¤E®¡#HcÓÚ“Yð¶­â«”Õì¢0]Ʋ Ò¢²…pHî8ÅO¨êš7QZêÚc_^Ĉ“ÞE+&XrÁÇô¤?SÅ:Eݽٿ‘Yí.Ï™ Ä‚H êUŸYÜ=ûÍ$.’`‘nee>QLr3Ó9#޵OÅizº¼í8(àÄØ; `mÇn˜«~½¹¾”èm<ͦܣ™! òFØÏ˜LŒiu…½>=ÂËÝêêâþÞéÂÚ2aޤf—GÖµ,ÚF¥«\\Z¬-*Iu34pÇ'®n*{? [ø]î5Q«Ùj«kÄ6»·<|àŒmõëQÅâKŸZO¤¥••­Ü¨Z9,í’7˜ƒ’ŒT}³Ò©] G®åˆ4;ÚÝjÚºnºY<˜¢³.é’FLÑxãõ¨&ñ×,/lítë++¶Sku¤"ÇäÓtÏ ßøao'ñ=¶—$%Y県`HÈÎsïK}¨ho¥^Ká>ëM¸P<á=מŠê‡hÛŽýzŠHe7I}ÚóûvÎh¬‰_ôrÞ[»‚>éíÇã½`îpÒÜ·Õ‚çõ VÖŒÇ]±½ƒR¼xí`Û ¹œÄÙÆ1žr;{V(·ÿI1$ÊT¢CÀÆzý(©Ü_ø™ü¢éñxZöàYÌòHײ¢¬ŽAÆÆQ1éQ^ÙÞ|DÓíuK«ë{{øË[Ê÷²Y±ÈeàóÎ „Ðø'A³Óž-f[‡{†‚ñÐl$}ÅRÔl/<]¦X\i:{³9㨤t}:ê+MnÒâòúÄS½½ÀL0<Œ€AãŒó@½JÚŽ‡ªø²õ/4û)¯Vå*D£+Ž ãê*Åòi:LvÖzí¥ÍÖ£[$0M嘎~éà䎕ŸâbhõÍ«µ‰~Ínp#Ç÷5=Þ•¨–w7ºŒZ}ÔÑ Ë*»œ8éÇ=èÜ}_ÅWq½Ì d†ÛN1)·Œ1?.9Éîs֬؂þ˜ŽqpÄÿß"£×®×JA¤YÈ'µHÀiŠÿ­$ä°Ï ÍMjsà"à\ÉÇühê.…_®nÓýñÅzq&NGæ^SöÈÿßé2&3Ó¥d5k³žÔ\i*_ÿA5•ã |ÉG9äZÐÔÓÌñF˜ª1Ãð~†¨x½0ÈIÉl§Zög;!â Ooë]€~N;W?*àCë·úÖþ„¸ ˜Üí­%eLvãà»%Ê•eo»YP¾"äØúýjçA8n†¥‚Â˨$®Äú÷¯¶b•Ûá»®:É7ÓïŠø§áê¼ÕwuPƒŽëíÏØµqá‹‚?¿7þ†+š¦èÚ?CéuZv=©Bç­)ŒF‘J@ë@^”¿J`&r}¨À&—ëK€ ~cåÆ)@çÚõÇj`˜§£0 RqÎ:Ó±Ÿoz1Å1 ÆýTSñŠL i  Ó±ÇZ;P1F)øiJLsÏ„çáÓ¥!δõ¥àvâŒ`0sK’84g “Ú˜… ÇJR;*U=ñøÒúPOAÖŒIƒž´üg4À3ùÓ¶#1<MqPê’y:}ÄJÆOJÎj-TݼLx/Î+¬ˆb!JòÏj‚òò$åGàkÕ€ÂãÚ›V)»¤s¾.ÿ{qRü\|sÑN?æZÕÿô«K¨ïÍOÑEÊnQEQEQEQEQEQEùÿ;Ò<%eñI[K bâÄÜj‘ Ìd&9%UÁf#z’Ü•uë_§5ù}ÿ1ø/áïø×LñN—},:§‰ ÷Vwï_:3 –$¢Èð>èdãQ·2ºß+³è|?$³iVþlLK/”]W(1ór:žÃØÓî-†±¥ÛOj¤\Û»¤Öê@‘"¨ þ†°Y\Ãsš †@"fçzœ‡R;ŽF}ÈïUo#ÿ‰M½Í¸?gIŒsóó#‘”'Ø€À{Šè<ÿ"Ρsoƒimª@ÓˆUš#›^$c÷O± >§½sž?–•w¦\Ç$‘Ø\Û,–¬¬~`7ûA}+cRTÔ4;fšU·™7Åæ°Ïš™ÚÇj©âßêZ8±²DW¶0G)óS)/QÛ…Æ}hè4Ëz½î’u¯ë²´z¼¼ö¸†ù[ŽÄŸ¡¬jâKÍfîâã‰f•¤lz“šÑÖ|-o©øƒH×­dgÒg†;«Å‘†èJŸzçuØÕO]Áâ Ûˆ#òá’V(›vì^ø£ä y”kÛsÏ5÷übRÚÆq‹«Õ&ÿ ø8¿)9=kîŸø&œ¤iÿp<ÛkRÌϯõ¶Ùs¦°8ÅÜG'ýá^oñ>cý½qÓŽ7a^‹âú{ž»‡#þ+Í~-£§ŠîØ`\Ó[š­ŽB6ù²®08äõú œ²²üÄdô}Ú­d»Tžœ}M[òðAþ"qTÉ8Œ:Ëé~»1±c;[§SŠñX|R«û4ê:l˜Õ®5ÆžVM²4ion½5Þ~Ò¸²ÐþÊIDqé_6E¹ü3§HŠK‘ù2×n³ å4µ±”áÏd}ÙðgSžãövø{-ÄóK*‚Ò;¹fc¾\äŸlÀWÉÿ´Ã+xÂß^ÒXGi­‰&k2ÁDNB³ö9²kê/‚òn~Çý4×I«Ã¿jòÏÁ¬Ã÷{$ õQ⾚´#<,¹ºjqÓmNݞ丷Kx"¸„NÃs¨ U£¶G®3ñ«:­Ä…ÄjÂÆâki¸2ŸöƒŸÀ÷¨'–Ö]>Ù.¬ñ—K>d$0=ι«7•î‘}gk›D’Ä3•”7Vôê#Ú¾>G ijºv—«\Ïí¬,¿ý‡Fþu—] º•âÑàø}âFÒù.á’ÖÁÕ•Ùc$î½Wå8úæ¹Fu, äÚº[O ¿ƒµÏ¾¾<Ó S[ÚLKywSm*GPƒzt®f& ·®?*ž–D»÷ÀrÆ¿üNí;ñþµkõw[b4Ë“þÁ¯ÉŸ‚²ù?¼ý1­Yœú~ùkõ›\?è@Œ|ŒVÄ-ÏñéušÑ“vÓáGA‚ƹÒHsŒÇ#Œjî¼rªÓZeŠ'8ñšâæ Á%{c½gGá:ëüqBå•Õ°Ç=–ï_þΚÖmÚSmâÙ~Ñ? bØÉ5RÇÁÚ¯ƒoÚûTŠ!§,n')2H%BÚ@$©ÐÒÜÛ¬©+1ꛇ—û?Sø§¦[Ü,ÖV×–lÑ?Ú%[h¤æÆîݺR\ê6 ´²Ò5Ï_¹‰YÜË#b Ìp¨èÃ#¾sŠ~ad.£à oŲ®»¦%¼–w’¨{¨£x¸è˜1Ž °uß >°mn´UŸTWÿk‹‡ÒŽ74yÚFF:{Ö^½£øƒ\½ƒVÒtëéôÃbÖ[8]ã…@á Q€AÏZÑ—OðÅljSí“Üë4ˆf·@¦Ù¦À%wc ëB×`{jq:͵ý½ëF9¢•ذ2©'æ\õ_qÅt^ωì/ô{»Óm¥Ûij­Üùd³`ÝH›'X> ÖoõRf¿‘Œ‘»(Ïs÷G Ñh7W~)Ñn¼3±¯—šÞLkndvôù² ï@2úªü5Ñ¥¼Òõ;=yï%ùðÄZ 2C+¼sÜT7ÚŸÅ-&;›+{8®l]’kXLvѰ è¿(Ï sÞ§°Ó[áöƒw&¿akªÛ]ÏÃbfߌ¹%‹¡ÈÀ8àƒU53Åz¼žÑå¶µ†w7!åhØ•³ËÇô£ "v“Gð¦™e¦ø«Cm^õC°HnÌ/n¤ð»”ÝýG¥fxªKÙ.ìî´˜îbÒlüÌ#^áˆþ sœÖ’i1д×ñÎ¥¦^üñÂ-¡)Œ<Ä|ÔÎi/¼s¬x{[ ê76:a·WGFÛöµl埈ÇnhAêfxæÒÄ47mq"k“ª½í—–q±QÈlõ=HÀǽVðf†úÖ©­{¼vL'eg"GU9"1ŽOkÆú:Mkíp¬š†Ù›ObÞ|9Pw1´žœ“êSðv‘«jú½´úr,]%–àcl »ï7µpé¡Òéž:ƒ_Õd²M"ÃNšôI öð„™Yó·sÎsɪ~ð–­áBæã]Ó¦µÑÄ.·~aÂ̸áAÉè{V¦›¨xFç\tÑ4»¨u²Òýšæ[ŒÀòa±„ížÞ•ÏøF[íCWŸMÔÞá¬."]ù¤þé@ÎðpE£l¹ý££®•©Íák+ËÁù«<þc,Yù™ôÍSðù_é„Ö¥%½¶É#¼uó<·'q‘œzÐÓ¡Ó¼#m¬h:ÉÖ.á‹ËU6Æ/(9»Çp¡u½[â­­Å•ýÜ_n€$±\Kˆãaœmvüx&€ó*ÜÊ<£±ÑõÔRýÚ6»Xö¦Ð¸)´“‚rk–ÓnRÖñ.f¶†î(˜3[LNÉF~éÇ8>ÕÙ\i­à h5h,5g½!Žq4HBó e?{æéùŠã4ÕµkÔ{Èå{%`fX[³<í'½ ;h:·ŒZÏUÐt››­5íÕRÞÂqhÀcÀÉê2>µsTƒÂÑÍi‰P[ñ­Ä–2 @ØÀO8ÆH"²üU¯\é'KE»žËHû(kRµ›$î/ŒeÃdÒÔ¼1§xŽkKíKÄú©{rMiq 6æÆ7‚ÃÞ®#?Yñž¹¤x¢KH.å†Ú)8ìbݼx@ò1ùÖ‰ø{§ÿo´‘xŽÍ$ó͉ö…ÇͰ`·ãN»ø¡¨xwQ:L0[I¦Z2ŲâÙ\.2CH=ø¤ üE.¸5Ks°û@Ÿí¿i|iÛŒ{·dÓýA}Ķß§ñ¬4û‹ >Ú+’öñÞCcÝF[!XÈq9#<× ­h7þÔ^ÏP€Ãp¸;wÜ äÖ½×ÄÞ¾ÖV %ލdAª›—dy;Y£-´OŽ+Íï’î¦[åš9³–¹¤üÁy7€â7Òêv÷ÌÐè’Z»\ÈÀín ²öÝ»+^ÐiÒu-cÂúΣ{${çˆFÖÊÇ–ÀëÐsYÞÔnõëkÏ ÉpÃKš&Œ9ÂÛÈ£vÿ¡ÆÖ´ôÍ|?ÓõbMBÃX¡û:ÛÚ9’9 ž’Qŵީ¨|JÒ/týBñ>Óm¶x.§;Ps‚ŒG®r)ÑÚ‡ZÏö„V:É¿•Q-Ãù°ay,N>÷4[]MãíûLÑô›k-D:ÎÖ¶(¨.Pp}9Ž)º^†4+ø|a§]%±™›¼¹wã–SéŒSBØ®ÕWÅÐÝj–ú]ö‘k*èí"‚ÑY„ Î­Ž‡$rzÔ×öZ=ÅžšÞ#»»°Õ¸!@Ä®~Bàò(@º¾,:„º”w–±L–Ä­jm‘‚*zqÀ äV–©¥è7w¶íªê3iÚ”°Æn!†É¿Îx'Œþ5¹â½G×ñXiWOk§ÛÄ¢‘HÎãëš~¡áñ¦§£ck%äk3ZÝHR@Ç®8#dtëOñàex»Y»¸½:{–K;LG ~ ~•{šä²XËáõŠÝ~ÔåÝ, ç«‘žf7m;GÀÍVñ~¸·Oœ-âo±(‹íEšBsu#ŽéÍXðõ•­¥ÄPÙ0×Þ ½ÛK”*WîlèÃ{â—PèK£xGSðõÄ÷šÍ£Ù驉K2‘0#„Éàûb¤]KAžÂëþÝ&ëOÕV]æº2†OâØ1ÅfxMn/5ìïLßa’7BFÅ;†{çZÓ±³Ñ´{­WIÕ¥Õ/`ŠC%·”a€$$9ÉëÆ8÷¡y ™ž2j©e}s$v"2YçÊ`~SƒøñZö°i~Ò®5mY“TÔÁ°y"Ø1ûÇæ;‰Ç¶1QYøŸXñեƋ{uæ’<.çhV'qô5-¯†æð$77Ú³X_ZÍ-íî’tœî6Ó;Œâžú†ÅuÖµOˆV2é÷w›«`%…ÛlhFï˜;}[9>õÈýžT˜Å·2gnsÓŠêÞþÛÄ=í¾¤G§^$xm·9–>árIàž‚¹Ï°pÊã#‚ &5äw ¦ZxsÃÖ¶ž*±¼K–¤ŠÙXG,iГžÄöªÞ&ÕRÓHÒŽƒæÙi>¿ï ¹ù·‘Žz~û=./xVÎïUÔÓOòçx¡¹™w™¸ÆFp{Õ‹½fOiV6š<ñÝ ËO%ãG””ôƒÐŠw'ȉ´È|M é×ú¾¨ºeßÍs\&ñq<<Œ÷©nüI7€ììôÍ*Ho#u3Éu, ¬»E?(Åšv«ñ&ÎËR‚Hæ måŠYV\t+¸ŽGË©4ÿ i¶:~³§EªÝ©iv,¥|…oàÊžzzÐ?"[IÔ|wÅœI!u),;Ö0Ž;AÀÁÏATõÔƒKÒ­4ËÛ_3T‰NéCó'!88\P–&' ú÷ühÖmm¥Ðl.u eƒWhʈñ‘"ò³wƒ§‘ƒ§Åg%Ü {,°Z"YbPΣë]gмOy¥Ëcg¥Ü¼:tVÈ"u÷Ürçß5ÉXXFî ež( ­·Ì¶Æ¾äààW]ªëvþzYÓ¬uCmK:V'Ÿ”‘œP¶k•¯<;sâD²Ô|û{Y®a’êO/q—¯­O¨kVþúLº}¦¬mâIJ\ nIΑÀ¨–±Xêwöì0ª=ÂLɵ»Ž8Î9ÏJÏñV¡,÷ím›}<Ä ¼P± «éõôߘ.–%ñ¬Z]­¦s¶ãP†!½ãn!$çË=Ž:Síp<Á[#ΓÁjž£l’éÖ÷w˜ož?õ%?Öp{qW­ÆßW>|‡óÐRê"¿„ 1‘Þ@+ÒˆÊðç^gá6Û:žŸ5z* Ç×­dRݘ‹mñ^–qü/Çàk7Æ-¹£ÉÉãúÖ•òâÍ4GþUãANF;~´¥±ÎÈÕ»ýkEÎÅÁÅaL8‡Ý3úÖæŒ>QÏoZ6&'Wjà ôÍXŒì%Hž„㪶€í§µZåsƒÁëRluÿ Àiõf F1Ÿc_oþÅè…¥ã’f?ùWÄ_ Ô™µ~9C_q~Æ)ÊÝrfùW=MѼ~è}  (? 3Ò”t$ž=¨0CF2)Ý(#8¥Á"€®½( ƒNúS éëFÐ=éA£Þ€ž)0yüiy R‘šhÇ¥Á÷ (^œÒûÓhã§z\R½(:qÒ—šyqH}h€`Ó±ÏqF3KÐPc­! dóJzb€·ž´`Rõ÷£„{S‰ãJ£=©ˆTëÖœ&…_œ?áHcÁ¥ÆiázÑŒæ˜ ÇŸâ71hWì"À­,g5å°ºµ’¤ž¨ó hæ×U³„yo¯S^¤Zæ´.DÖfšAƒh5ÔàúSoQ¥¡JþÎ;«iÔõ/ÃXÂ|zÐ&ØÇ†u0:ŸµiYþb¼ËRø½7Š.ï4χ¶)âK˜Þ+oí¶ž5Ò šN~yCï”F„Hë¹ÁUÈfãèo…ŸÀúö£â=sY>"ñ%Æø-î [‹[K;WK`ðEj÷"–’ÕdgfcŽ€ êTý…åWGg§]Wn›ß_”¹ôõýXõ(¢¸N€¢Š(¢Š(¢Š(¢Š(¢Š(¨®.¡´@óÍ(NHÁA>œÔµó÷íñ[þ'ƒa×?³ST6΋öy%òÃù­·®1³Ðõ®Œ=ˆª©®¦u'É+þ޲"²°eaÀä_–ÿðRÿ…Þ+Ó|kâcÄkZF¦³ÿfYº˜MŒg„ºÇrØlŒã>ߦü[ÿ„óá‡â»+ÒS¸ÚaY·¼Af10<ÝòGíïñÆ?|Yá»bÔÚx{O¶X­î rË4ßòÒF?ÂíÆG¢­z3˪S´‹ºêsSÅFw‹GÎVm>›}mta%$†æ0 †@};†‚>‡µD×3hVqKg;ºfF•8S´°^sÏ¥0D×ös[!Û:H³FÒ6ã†BOG¸©üæÑôé-om’â+§ fÈ ƒï‚nÇ_â®6ˆCo,[Ä: SYì7qƒ ð¼7 îG@~¤=¬ßx‡MM?LÒõ=0O%¼fÖÚðƒŒŒ÷‚Øíš±¬Ä« [ÜÚ–ä¼lªIh¥È<ŸB½û&¢ñ]®«hº,—÷Ïc¨-°E—ËÏš¾Ïð’@>ŸJž…lôe_øjwñW‡Þ •—EÔb†H%„.$à:°ìÊAÎ~´ïý”xŠ÷ìLdµó’Àq»ñ¦ø‡PÖ|?.“¢iîcÓ®£A à7Ÿ»‘ééøRø»LMÄW–QÊ“#¼@…,ÝŒóŒÔõª3±‚xÅ}ËÿÖeÇÄùÉ[×™ÿƾRvŒ®;×ÛŸðMiq©xö.™¶³~ž(þ´KRöGŠÎË[wì·1ü|W ñ‚2kÄ¿kX’+"1h‘¥E|õZ`þ8®ÿàÖ±á¯þËv>—Ä6–žTÖ—Q½Â$±9›8, qϽyí7âý V»ðׇô[ȵìàñ¼°–40ª¥†Al.kë*JØY_kKŸMîÏÔ!†òÂÖBëÜEâváeL‚¿B lûb‡Ô$³km5ãŠàD *dÇ?!<ô¬ýNÞkÛXZÕ †ÑKàc¸aõè~”·:ý¥·ö]ôI~ˆ$‰ðQ Ç~§•ñíØîÓss_Ð5&†öóN2ÜÅ{5µÅ¼ñÿË"ÜýÒ‡ŽzŽES‘ü3®|A„0’ fIÀ–RàZI7÷±Œ®[¯QœÔz¥åöˆ×ÓDÞ\ÂKilÂr3žž¹è}éuo躎¢ŸO¿[y.&YŸH+‰"r(­œ0'8èk&ﶦ VuâÛø’âhN“mrÏàG˜>UE¶qÈíÍs1Œ@Æ»í;Æþ#ñmï‰|;:Ái§É O}çB<â¶à”Ì„¸9À®"I9 ñéKçq;t:Ï…y|%(þ^Ðóÿ]’¿\u…ó,îGm­ƒ_‘_ Ô§Ž|97SSµ?ùkõçU;­®0F¦·!nx·Ž¬¶ Ü©‹>ÕÈJ¦r̪6— ÇNµØøðŽÀu%qøWÑ–r>é:΋÷>ó«¤þH¥q³òw™ŸsòQw¥Ò´n&ýçû8=y¬«€[$gç¥ns£6éò¤d!Œõ®~ù™Q¶‘žzô¿z(÷¬KËS–ÆH4 hùSâãøHeg]ÀKÐw¬û->Ï^ðüö¦úSG;CmpÑŒ‰Ô©\ŽïšØøÐ#ÿ„ŠRxA(û¿NÕ“µÇÄ .)nõ(,å²s Ü_±T•H.@<ŒÝ({•}OÄ×¾†ÓIÒg‚æÈÂe3Ét¹.NXg8½©5/ê>'¼X²žÕRõRa ×*“FO\!äŽ1N½Õí|¦iúMæ•a¯L±´­-À,¨Ž&¸ëPkž×u½@kºM…ÍÖ˜ËÁs e )ÇLIù–¼øJôY|IådCêÈQ5RÌ¥hg\㯵`éšN³k©H5Kk»{;„qs$ñ²£§RA#œŠÝ™|(Þ$ «vu…”ù×ì’MŒ‘Œd|ÞõÏ[ëú¶±ªKa¨ÜÏ4S—ŽX]Ž#õ vÆ)ˆÈÕÆŸ¤ÿÙ2ÜÉd1±®€ôç8ã®k¨Óðg‡e¾¸[-a52ˆ–r~ò5ÆI2 pãÒ¹MBÚ6ý£¶»KèЗ¥CÀOJétkhômæçÄ6Os¦]”’P+äüêÃîðjFõ,ÝÚ^ü@Ñ­¿áÑö Y_ínž„ª$œò2=©÷Vº>‘¤iö~+´¿þÕŒ6Ñm G†,ð®œç•OZÔmÛC·“Ã6÷Zu‡žßh¦2J$Ç˹€\ggû?N×´-:÷ÄÃé7ûZäh æâ5<3üÀŒdŒóœSòø£RÐõ hô«¹l4¿³ÆÖ©•I[I9Íh\ø7JÔµxg:õµåÎÉ_K‘ÎW ªÀmÉ9#&£½ñΫàvƒGÒ®"—O‚%mÓB²,û†íãp8qSjõU]kOšÚ;kÖŽác–åVâ-Ø'“¸€slSßAÇŒ•{D{[ ê-§C<~!H³$†LƒnL` ‚^M.£íb¦‹£_Çã+KûM(ÉG¯•peäf=ÀŒc©ÁS5mbÛÃÚ ¼Þº¾·²–äù×7 ¢pà ¨Û@êA¨<ÎþÐÚ »bÖó[I4vÉÔ0dÜBóž@=©ÚÞ—áK;Fñ„5FÚ"L‰tј˜á†;þTÁž1Ñï.™¼DªK¼*brë¹I_¹·9ÂàŒã›á¹¯ÓX°:lR„ª¤.J°'7·^µ{ÆÐÝK~.ãŠC¤IbÖTVò‚mÈLôÜ9ÈëU¼)â{Ïêpµ™‘£–;‹d<\&~ç§½.¡­Ž¶Ë@ðͯŠfm?R’òêÝÞHl+:ä…WÏ8#Ž9ÅSÑÕ£eðæÛHñ¼ ±l¦išÆ'µ¨\¶Ò6àž0pjž—ãñEýÆ•§é·—‘ɵݴ!$Üz+×wLûÓØ_ˆÛ IàHïµk«Í;T¶XŒE¬¾jÊ[Œ8 ajîô{½?EÑmôýEvHÖ– sv€öÞçéú„µO=íLj´Ùm4‰-YfŽB?|ÝA?6zÔ5Þ•ÿÖ§qá[K«+”.„óù’¤Yå€8Π}u+[hí¡h–Þ*²¼µf͵±TÂR§æ‡Ýû¤úâ¹]> {«è¡žå­-À’}›¼µÏ-·#8ôÍu:A'ðåôZíô–ÑYʯo(2fàÇŒ‚Awâ¹k+9.ïRÎbF™ÄbIjdž¤žƒÞ—`;ÝCÆwŸ-4ý#AšíÜN÷3À®· äÊvŽØúÓ5oêž;uÝ>K1ä 3ÃuvÈ÷Jª±€#ÖuûÿßBwžaòƒ'%è¿AÓÚAà+k?¼ðë²Gm1Ÿìˆì.UWæÛÓà`ó\—‰[åøu¥3ø{VMSí²€×« UGÜÚIÁÉ=ê® —¾?ÐÓR ]Y3¥Â3,HÃ(èXôÀ©ÒËþî™$zŵ޲.¥VŠÌKæÂ@±eïÎ0 Uñ Ïü$º¬ú–,m-ÚCscf®âë¼’IÚFy'Š6ßaõ9ÑÛ1$eݘ( 2Äç€w¯a¤Ãá}?ɨYÞ¡•aXyËxtÎqÞ¸8¥ks½K$¨Á•Áû¤µÞ6‰/4]/TÔõ›m:ïç·7ƒ6.NTð#$d>$׿ðÄ]¯‡o'¶ÒÞ69Õ€yØ“¸·¸éŠ’ÿËã +=fm^ÏL½¹‡oz\ŠœoRz“TÖÇ€l,´Khl5O%Ìðù±I¸ñåî ÅT×ôOÆÆ×WÒl^êÖXBbÚ¢2…Èã=1Tû y «x¡<<¶ú0Ó¬õí"Ty.¢\õ8b2=ªž·á}c]»]RÆÊkË;ˆÖH^<|Š6ã9Åh_ÍáÝ6+ _X]_jq[*Nö·3' ܰ¬_]ߨj±yd†×ÊCk䱨StàŸZ]5òËbÓ*fÕUT\έò;¾¾õgÁÖÖ0Ãq¨‹™$Õícy °d8ïïÏoîãñ¨|_§ÚÇ*Ý} G:«Íe³ý[äîÏsÛêOéÍ ƒ]šh¥bð‰1+azmþï<Ÿ­DÞ…­3Æ:Ç‹ 躅ü“[Ý#'‘ã ý8Á§éޛ‹6­{uash‘2m®!n²õÜúTšŠ-uµ¹Óìô=?K¿¸„¤6¨C³cîžqÈöëTü?á½OIžîm[N¹³Ò|†K—š"ªÀŒ€¬F gcÞŸ¨w,G­ÁâK+Ë=+B´Òu‹ X†Ìê+‚O?LUOèóØ ßíû Ûm ¦ÙZHÚ6 nëVÅχ­,/.¼6š”zŠE†’£mRy)µAãÜš£¡Þ_xº­:úýšÕSÎ3±)nAûÇAéëÅ^žMJÒ¯¯¼+.¢n„rIzÉæCî6ÔŽOÒ¸áw#Oç;æ\îÞÜäõ®á4ËZÜêvz͇ˆÕaU¶…ÌK““æ,Š2x#“Íqq=ËJÑ ÉÜQxZOAïæv’Øjß´‹[Åx~×o#C!•Öß<‚3€ozlÉoàí ;\²‹S¸yZd€IÄ Ó†SÔÔ:ÌâØ6‡§Img¬’ØÚï‘–LgrAúS£±³ÿ„ZÏþF¹²‘fqlñ¦f)Ü2·ðç¥D¶ò*ø†GÕ4½>}"ÒHtäܦÞfòdÎNHÉ9ÍHÖV:žúõÕÅç̱:&öhûnž¹§jz±ð®Ÿa‡®æ[Y÷J×M…i_8ÁJuÖ™sãM.×U¸¾·¶º¡oµ9Q6Þ…p<ãð¦cuMvãÂÐXYèw’-‘C2Ü9‰ä‘Û â¡×,åñ¾÷Q‹–\ÐÌØynAß®OJžçQOX[iw–Z¼ƒt­ç(’4ÝÙáÖ¨xŒK¬[Zjí±l1B¸Kv~9¤õ±¹Ôf†ÖÚ¸žVÛQ®çsèzìu]ÂÓMƒ^Kè-¸¶ì£ƒdEqqÎð’7hÝ["E8"»}CÃöÚΟ¥ßê:Ìeìöà~ù y pàñŸZHlÏñn±q§Ïa3Zi‚ÝM¯”Ø ½É÷Îsõ«š®·gc¨^êÑiw·壸ŒŸ3ëÆxüêMSÄRøE-t› ÔÆÍqa!cœ€z ­«hº‡‹¾«cœ“F¢*˜Ùx GýEèIªxŽO ¼e‚Åq¼c÷—1.O$ŒöäÕM_E¾ñ$¶úŒ qÌc(0<·äŽ3V54Í*+^Åïo`n§A^u$më…>½G>Õ—¥[é÷±¦¡s%¥©VÝ4Qï öã#Š×ÖílæÓ-.®&{}YãáÛ•sóØãVF—¤K¬]ÇmÐDì¬Á®$§²{šÖÛˆ¼W©hú¹¶°™­m UX‡rã†8ãš]W—ZôÐj0Ío^ij4WSl`ǯ^ÝÿŸÄ晥ߥŒšL—Ù£<³gvqÎ¥gx¦ÃQÕõ%¿·‚{ËkˆÕáx"$(Ç ÐŒt¡ù‰.ÅÝsV°Ñn"Òä±¶ÕÍœk]J¸f#“ƒ×™¬ßÚ_êWÉyoo4ÖÓÆm*‹»ÇLsZ:¤ û"kOw§öuóšØ©»n<ôýjŸˆ5ûÍ7Q[}>W²²Ž5GeJuž´0D·öúC A«Ëso¨yJ&òãýàAçâ+¹-æŽÊu²Š0"øÔóŸsÍ_Ô4C®½¥ðº¶´–ê ÒGq!7MÃŽ‡­A¯ß¥”é(©8·@­;¨ÝžNöÐŒ½#[¹ÑoâÔ )C½ ÏŽÕ·¬øWSÕï^öÚ/´¥Á7È¡Á=°HüëD¼ÓìQ°:…®Ò "VŒç<6TçJ¿ã «Ö×%›{ˆ˜+ÂbÜ.8éÓð¥ÓQõн©ÞhúmäVš…Õ&9¦YZ2ÄG·ëŠÌñMÝÌš’ÌŒÑÚÔÛùd…XñÀ±}¡iq6¯«6•|ð£MvþpÝþÐÁõªú—Нü;z¶:dÍoklÆûøä1þuD®„—zN™|–ó꺣i—ÒÂ…¢Ko0Ó-ó qƒÞ¢ÖµÉt “MÓ¤ÝeáXÇïAçqã=qš5/j$º·¾·Xɼ_lÓ*OïÆ{ÕNãMðëÛé·ÖPks[ YfW#9(¬§‘Ôg¸é@Ñ™®Z\jVÐë_.hÁtc‚¬ê2*xþ(…$`ùÒŸ~Õ_Äò<òZÜEM=ágTÎÔ çÔµŒ| ñ·Î“’~”º‡B¯…ë¤êõé§ÉÓS^}àˆ„÷á<Ñ}’0È•êØíšõ=Eà¸+umc&™o"&Ûi\»‚$’O''ñ㊺C]N6ÿXsŸÝIôéXÞ*l·ü ¿ãZºƒâ›/úæãô¬ŸÞžà~†„KØÅqÄ_îÿZßѸUϵ`1û¿Öºî bDé­À Üt5ofÜgÿœUKS„zw« ä&àÜõ5&ÇmðµIÇ®P~•÷ìf›|çæoý_|*15‚zîN¿Jû›ö7P¾ aÿ]ômsTÝÇgè}£=iØ‚—ëAˆÓ׊v9éŸJB~aÍ('v1ë@X=éqÍãŠz hÆsé@\}iGzh‡ÞJy w㔀u¸§Rv öéùÐE8w¤=H¦!§úRš\QÓÚ€.)1“ŒSýižhŒb¡‘öÊ«Œç­N++S¸¸Kû£‰ &ùæþ5!IèFsô\¤®Í§ÓŠQÒ‚~`)Øãè'ÐJxt¤SÓ¦€?*U¤m¯xOPøÙâX®ž'´ðÕ“n‚9_új㻞ðüMt¹ÃxÓÖ]ú/Oóûº2cSYmÛüÿÈÐø ðÖçÄX_MjÚ‡tÈ£µ±²gfBŠG’rÍ´ ±9÷韩j–£Úè:|VVq Œ`äúŸz»\-¹;³¥+h‚Š(¤0¢Š(¢Š(¢Š(¢Š(¢Š(¯Îïø*Ä‹Û?i^1¨Ò.t…ÔåxÔy¯0šUwˆ ’qÉÏZý¯Ìø*Œ[~.øb@9“Ã¥?øªèÃÎP¨¥¨¤“‹¹©ð>s7ìÁàµ#nËÙÿ&Éþµå?´”"_…·¡ÂÊÂe+æsÿ-ȧéÿÛoì·àÆé›ùGãö¢+Ë¿iR_á-öÕl™†C´ûú?Á—Ïò>u|KÔùV 9.ôÛ¤µRÓÀRG…-$`àíïÁ ‘éŸJžÒâÙô;‹]Otp‰ÖKyÐeÒLTÔ0<`{UHZk]>âê7a4E8;Z%'¿< öÍX†5×´»ˆfb¾·‘e‚y˜„e9Œ}Olw¯†v=4ÆÜ_I¡iQ=„Î<àíöŒcq|˜öÆ©ø¯Ãâ}GÔí¦ˆjB —;í :«®}‰zŒ÷©î#få]ÅÖö3,e²£.AùÅexÏC¼½ðéÑÉ%ŽÆàˆ`|ç'C>Äv¬ËÖã5_.‹k¤ésÚ-õݤ`Å;±S 7÷OQéOñ›6™¬MotYnxy– Ã8'¹æ¦ÕµM:]3ï¯oMRΰB™iT “èJÄ—·Z޵uy|C\];²¦Ðr3ÀíFþ‚{Pªõ>µöwüj@¾*ñ¼{¿ænqޏ˜ÿë_£ãÁôÏ­}ÿݘøÆ<›HDZѼDšmÞ«o>«¤»[I{b¶÷aƒƒÎ Æáj–·}©]é6_ér¤Qn‚v,ˆ‹”sŒ-öÉ¥k7Ô¬,çŠtÞ–Xf.H<2Ç#jnÏ@M¦&©¯\èiO,IobЕI—>`o˜°ôµQ×<t<_¥¦]$Úuĉr’—Έ0 Uר#‘ÓV޳wkl“Å}j·?Ù¾JÈäÄ3·Ü/lúÖ¯¤ëúOí¯­¼éi£žÖê4>K¡Á\œ1ê*›—º4®|D›:ñ?ü‘›.ÝÝ=ª”±ì »=Hãõ­×,ÙyãŸëUf̪ П¯½tœ¦5Ì{ø (ý+*ꀃœÎtSD¯ŽzwëY÷¶êbqÉÏ¥-Š>@øáOIómMã$ŽœW;›}ã­4Ëh¼Ë <V$pFC券Æ3]Gí‹_›iÊ’¸öâ²üAá;Éü7¥`XÏ,N·öjò9}£ç dúý3Cz² ŸBŒÇKðþ™§Øx—Lžöú0åR)ü¶·Œ·#ƒ““Qx›TÕ ÕmfÒÞâ-5a‹ìkï/o÷Olç9®ƒÃ¾‹Å^ŠMnK»;ËpñBñ…ÞTŠüðr;Í×ÓX$°ÖÖöMŒ~lQÏ >÷>”ýONÔ¾#i–WºV-CÃ=•¶ÈÒ3w*’>ð=,Ó4ýSX×môJXŠn¾Woµ*Ÿ–L®qéÈí@~8Ôç·»H·•—H†ͼJÙInD˜õ99ªÞñ@𾢓˜ ¸I0’aWh†GÍ íaê9«¾0ÕM·‹Ãq,RÚZ¢;F ÈØ'r¿P¿1ÀéYþ¼ÒôíR 5[?µÂÌ!_%²>rÞÐÑwpٟßé¾"ShŠØÅ?œú‘t+åõ,ËÜŽ0GzŸMÖ|7wt4]?Zd—ì·Ü›¢ŸºÄg¬ûX|Imãe‘ổnnŒnÌ®-挞F~é]¼ûVžŸ¤x[OÕ®/4MNïPÔ¬„³Ee,²ƒ®ͧ8 NýL/µÍõÕ톬÷ ¥Énír÷¿s•qžá±ÇzÖ²þÌðf“©kÕdÕnÀKq$¶â#nä±\œôÀ5âísǯ>ƒªjrÞAs yRNÙ2üÀç²ñ‚=ê}7ÃãÀwÚ­ýƬÂÑVÒÖ:)Y›'Œâÿkêÿ4Ùíµ Ø¾ßhë2Ý]H"ü¥]½GQ\L6sÉwöHbó®$>Z¢rX“Œ 즾oè·6:&‰m§Þ$‰4–Zr.q»“ÔÒ¸¤ßm)Àe•zc‚§Ö–½Fw—öúF¥iZ‹ì¯ÿµ`Fm$Xå‚-ß*Hž¸ª—ŠüO¨hš…¤Z=ôÖP¶ŒÚd :Õ½Nr½Y}'Oñ¥_ëúØÑo^6‰d{s7žŠp®ÀG¦yÎ*}[Æš$·Ñtia“O†2{u\ù¼Á¸žVÚ¢D¿ð~“­jv÷Úý¾{x±Ë>,L\3c 0ã'°=*ÝÏÅ«Í#[}>; ?ìËi¼•7q½Ôj>]ÂR¥ÁïÖ³µê¾*¾Öžax5[…I®R9P‘ÈÚÄΫ³x¯Ã1ëñèhÞÜDñÇ&¬³º1u(VÁÇ=è°Sá·ˆ´ï.¢«þƒÞöš„yyÉb¹ÝÓŒb¹oßiWú›¾“bl`É÷¥üÓóó÷sè8­”²×­ééUü¦¦œ“ø–{˜%†É$ÍßHJí—pî保iþ$oZ_èöšNŸ¥j7~êK„f}¼˜Û·#8¦!4½!üc¨jWÍcªA4kn¶ÐÊ&ŠbN~~8Æ*).ÿá3ðåÕ®‹£A§Ý[ȳMib„™ÐñŸ^j~‡á{¿ ÙjÏâ‹ í4™! `c‡–Mß/–z0y¦My¦[xkP¸ð¤w–ÒŒ]™CM}Š•åÏ’Q,4dÑ|=<>-µ¼¶´3«[ƃ˸ ˜®à~R1ž* nâÛIðäxjK¤Ón¦ežyØy»ÀÀðÆ2GÔšDð˜xjåuDY­œèaÔ®rànÈhÈžÇÚ¥¾tð/‡¼6ößXR•·]ˆ‰‹j®Ý¡[£|Çž´ÿ«‡“8ˆgh$Y¸2#‡ ã sÈî+ºÖ¬uˆú.Ÿ«YÚ#´M$[[ªE¶s½a@9é\,Nžg™" # 8Ü3ÈÏjëüK#êš“6ƒg5¾”<Àm-ËÈÐËŸ›q䜌M.š®…›Ó¦xwIÓ4ßé’jÑ}‘Îbx#-Â= ük?ÅÓ\Ó%Ò’{} Û³K|¼üÁˆþ,ñÍ^ŸMÓ®ü=£Ëâ;ë6÷k¤LùŽñò—ƒÇ8£WñUÿƒRÇMÐo^™fQÅÁnKã·Ò Ô4½'Q|ÚÖ§.‘¨Ën¾r­¿™¸ºÌ20HÆi—þ2Õ|z4í&sogj 0L1ÞàäÔšŸ†nüi%¦¯å¤ÞÄ ±ÞÏåàà‘r3øÓµOiÚÐéwZ5–¶ö‘,2]\†Þ\)p3Æi‹â½2Y$þÙŸg¾"EˆÉ™S#'+׆§ðN{u©C{öv]20éqpTˆ¶í%‘›¦HíPxÎÆäê|Kapªöóª›ùWЃÅ'ƒî%—X‚Ãç{;„džØR¥N[ðþ”º¡¹§Kሖî]-Cû^8Â/$VNŸ1Pã8ɬŸ êW¾ š}2îîi¬%‰ŒŒí¹`Ç!ý°p=óWtÃF¹¸Ô­uxu±å[xÔ«žÜƒÔ óSXxÇTñ„Rèsýš3q Hd‚‰²¿0Ve#ƒÖ…÷ûÆØéV^ŠïV´Ömu©!bGn»K`npÃíJßE´–;ËfO5®L|K¸õLòÌÙ_I§ÜÁqÓ,/½VD ¿ˆ<¥v:Þ«xÑ,µ‹x£c¹¡l7¾…ýZm?C²Ó´ÍbÄjW–ñ|ì’1r2žqëY¾({‰¤µ¸Óâ–-0Â<í±ŽàŸP}jÝÕ†Ÿy¦éÓkwÒØ_´{~H÷–@~VaAů‰/|-öm?F»–$Œ:È8ó·s¸ŠbBjvwea>«¨=–¥,#xX÷‚3…-ÓœSu/^x] Óô«–ŽÖ8ò$ÇúìóºŸqá»ßÇkªÁ=²Ip»dK©ÄXpq‘žÇ­6ÿQµðü6š]æmªÏn¤I$§;I9Ú¤v¥æ3?^·›VŠ\õÑ5dlÂ@î c[Y\ßKðI<¯±Ä¥˜þšÚñLr]ËoymgI ˜‚)ÛèPú`Ö5­õΟ4sÛLöó&vȇ})=Ưcµ×íü=Ü1ëÞhˆLö¤`7£8⳺‡KŠÖÞö(Ö=÷Q‡,G9Ž=*¼É]ˆuxÛßµõµÍÌJÒArJœôÜ0­&©®®ƒ%¾˜¶v·éf ÜǸ±êpHÎ=©šï‡õON5k+W¼µž0ãa\§b»sž=…?U}"Ùm-õ8'šþ8Uf–0AÏB;œqH}ŠÚÖ‘¨kó&¡gm%Õ´Ñ‚¢0—Ø®>´šùµ‚ÆÖÖò"uh£ ò£`(çåaÜôçÚ¢ñüÖwp¥¤¯ob"ßËs‚¾§ÔÓu«auok{+¬2 Äz¹ÅøŒPMÏN¼¿HµçÓíÊŸß$^oÍ‘ŒŒ¼çŠè|CãGKÖd¶°sgmnUR. àpß\×9¢èW:õüV–Ï ÊÀ°3Ê#P3êx®›Y×t½?T[Y´˜5O³Ï)`Ì@Çb8ô-êÈußø‚öË7€‹Ôyw¬M#<î cÐѨêz^‘qocy¦E«Éjˆ’JîT±W*Gÿ*£â˜oï5?µÇÒÛÌŠÐI ¡àqÐûVŽ¥¦èí4#\¼¹°Ôü…ó’ÃàqƒÓ4z©™âuº»½K˜V³x”ÀbV*«ŒöÆ1øUÍFÃNšÚÊMVî[MIá]â8À[ÐãºÇ‰¯ôB;m.âK;ktQÆûèlþ4ëßÝx¢4Õã»·Y'Œ<‘ÝO±Ùóƒ·=sÖ˜®UñÑÓÒ.ÒRÚrFXô—<îüóR©xÕK&ëÚ›â‡I´‡FxἸ·\5Ð9(Ç’¨{¯ó©aÇü €ùONüfŽ¢ÒÄ^ Ù˜öd\­Â¶qò´x!—ëœø× 3–F¯ZŸöDðf›ãïŒz‰¬@×tòHÓ"9F!!‘†r9þ촷 ᱠţÝ^Ϩ“»Åzêæ2…ÚÁFGÍßÒºVs¥íÈ9’v>m¹\øªÌÉúý+?Å‹µÔqœŽŸCZW)»ÅöƒÒ9AÿSöÿYÇý¶5ÏStl¶~‡Ð}…)䑚ùi0IëHÈ3‚(Áϵ`Šqõ¦ ?­¥Æ{Ñï@:ñF) Zw ’=)qø 0sKÚ€F8£ð¥šdŒ'§R’=)GÖˆ(ÀÆH¥Ï4b€óFG–ô☃§j­<“‹— •\õh“õ¬ýu®Kœ[J±3a[pÎõ$eG¹8 krïzp4Õ]§Í?®(ìRM$.K•aƒŒÔwT1JŠÒëí4W/4К¡r@Í1 `S‡N¼T`óRPN yo‰®þ(YèŠúŠh>Ú:¬ˆ|‹I5`–Î'~A•~@L;‰?-v;ñ•§ü9wª\Åqp±lD·³„Í4Ò;„Ž8Ðr]Ý•@é– s^OðÏÃ:Ç‹4Ë_Â÷—WúŒ‹âKùæ=Ýó" "V_‘a`@ ¶5Æ@Éë¥û¨J¯]—¯Wò_si×3Pù¾™¥ß|jñZn𮾵“y‘²ÓÌþÀì?©¾ªð¿†­<'£Ã§Y®#NYºnl œvè*€¼ià]->ÙT¿WUÆN:aÛ>§ÖºJá:R°QE (¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+óoþ «fG¼ qÀi71dŽ»eSÿ³Wé%~yÁYáŽ9~ÜÄ®ºœlÙ<öRþ Õ<45k [‰e‚â-ÔHÅ™*A'ó®Wâgí1?Æ+«mÓKMOæ~ö_1À;UŽ·N¤WØÓÆQ…ytØð9ûK´qÖš£YEqsòd4n7+îþn?J|Q¶½£]µ”j³ZʲËm ó$d¹Gû'CžÔø­–úg­h䌫ǭ“ÓàóøVn ¥øcQ»ÑKy°L‘Ï/ñħ8lzÆ}Ç­|£w=jC,/áDzÔÖe‰&imÞ>3·0G*~\P+Åž£ éZCé×%„±²­À#.Tࡱžžõ«£Kм jæ÷:¼ÅÌ÷jÎߺÈp±¶Ú"«ëzüžð查ÜÚ[ßG:y…d£+cïuéS¶Å$ºìK}£é¾5Òô-ZYâÓ.Ò&[ï=°³ì?!Ov)ÙïU¼aª¾·â îÞn$ #9ÙPgèAâO ŸøsAÖ4Ç2¤®ÖÒØÆ2mŠ€KñØäòGðŸJ·ãôù5ƒ™‡³·Š8RNxUFæçÔçŠVB{aH •ýkëïø&üÅ>&x©¶ˆ =ø¸‹ükä3€GµõÇü˜•øµâÐ óø\CC û«ÆÃ:ÀÆ8ô¬2º-\ÐŽ‡ÔWEã(ÉÐnQŽÕÌ|fƒÌ‡Mî<„8=3Incðžj®Èˆ»º­E;¸VÃ*©\ýj@ÌmÔ#¹ëI•’)Ýñ#­Y;Ÿ?þÓŽ²øJ5'”|qÒ¾jÒŽtÅ"6§¾ ý£,×…¤s•óŒq_+xešñ}}¯fyëH`a"½F}«¨ðEâêÝ=ÎMÔ3¬ÑKŽ #k)Ç·O¥s(7¸'¹®“ÀsG-¤‘r’Á8—hé*AüG¡^àìtÆðÃj#eWI¤2y2 ®WŒýyüªÕÞ™5åµ–¡kËh¨c–8“>CƒÈ s‚9úŽÕX¼M,Ñ>÷ÆÀíuã“ô<~U5Ñ’Ñ4÷…ž;9Tì“v78?8oq‘Ç¡ªõ%ÀÒµ >d¾ómåD.匂w·—¸ppH=1\Æ­â}kÃ~:ŽÉص¤ÆÃvèž>0GÔäz×Oâ 6jÂè¤ÑZÍ{ p ¬B¸Ç0Àç¸>µ‡ªøÝ´¿Á¦ÝXC=¥ƒ¤I¢p†ëJ{š½+‹-;Á¾,Õu]*Hî äRÃka¸ùÖ¾b|Ì{¹ zñ\+µÚÂ5ƒ¼s}¬j¶£¥´r=¤Ç‘,΄ #9ã'>â¸Çbæö["þ‚q®iÄ‘ÅÌGÓøÅ~Èj'ýr8?~5im³P¶~»eFÇüWì…ënµ•ÏB¦„BÜòI²ÊÁ°bËœõäW@býpO žEvž8„>™§¡YØ‚:à à̲|àd/æ± ´~¬ìÄ;Iz!]º¹ö#Þ©J3&Ó•3ÍÓ'$œæ¡,›ˆ$êMt‚y`ŽrÃ8 p*Ä@ÆB’7uã UÝ劲Œ¨ääàU;»€±ŒzÐ4|ƒûID#ñ Àw k¢ð¤¥t8¡*ÞBGâ°¿i'ZÏRÃ:½¾‰¦ÛËuS}ž3±ä¹qF츻ntRI–wl;ž»Ï_z öpß;,¶¶×8ýìJçð$*·²;•7Yr@ê?±‚DYÎâü;Þ ÕãËÂ`¯rBôô¬àï H_[é ürLâv*Äç?»<Îx®Šv ~ñ]£†ÁäúS"E#çùàriØ«žñ?Ÿ€>AÀ®“MðÄÞ,ø}akjðÛܨ܆B±$„ŽüzžXñ\ßÄÕ âî«Ñ¾)> °$ŒÀþñ š(xáì¶1^Ùø’ ëG‘Y-~ѹw€Fðñ7{ÜÖoÄß Þi±Ø[héI½ü‹C$¬’e˜òÄc&½6ݶẀyµiÆ][tr²?ª +ØvG•hß ñž…c{¬Ý]éú‚ÅåïŠ%“ÌPp…ÃAÇsXÚߎõ¿êçC±™âÓ,Â"Ú?̲[ñ¯k‘ –%òy'’j­Îa|ÝiöwLqóÏnŽã0Än¢â²>ñ§…çÑn~ÜÌmzLÑ®òdPÜáÆ8ëŽý*σì.mâŸ\¼€a$2A9$bn0#9ÎH9ÇÖ|i‹Ë´²ÓV¾éVúÏîìïS̵šgVïtê·1Xæ!½Ó&ðî®þ±ºÓ¯ÀŒM“™¡ÝÉB#œf¡Ñ-×_ðÝÒxŠþ{+[„0Þ:y®®Àî@¤‚GC׊ôÿ |;Óü«CN¿½ž}¡b’á7‹œä'žœñÒ¤ø™áKïˆ6¶Ê5 ÞBùÞHÅJž»Ž úS¸[©çGÄSü6ÑíÃZŠÞ ÙIoL?#ãËØÙéß4Ûý Uø¡mg­@ö‰8ŒÃq ó¥¸,§¬jp0A•Ûø#áòhdöšÜ:®é¼Õ‰Ç ü¸ÊäMs?|«_jV£BÒfŸN޲ÚÂaÏ< žsJëä{œßŒ¤¶Òím4ií}VÖ$Y/ƒÊ9"?B#šÈðÕ¦—u©[®±4°[;€­1Èá³Ð{×_â_à›M[PóãÖcau$(3·z‘ØÀë\¯‚¼(Þ3ÕÚÇí‰f3)y› òŒt'=O´ïp±¾þ>×íüVú|³L,þÑä6–­„ØNР}¯é³Ð5¶ÔF¿gvš{<Íen[íP~R1ƒï‚i³üM– 4ûDÓb›ÈV{T7Qòîó1¸·ëI¥ü4×ü=¯Áª]ùqiqÈò=ð™tc;· mÃpì@ëU~ä¯"-?Æ?ð—}¯K‹JÓô»Ë«gŽÞæÊ¹6Æ#®@#=sLÑ<¨xRFÙIe£Ëj ‘3)i‰#`B¤áüªÖ“«ørúK´ðî.™®ýšQo,— "JØç OÊØÎ1Y>ŽïQMNËZk´ÒM¿›<³†ÝnAùwwÏïKÔ]]é1ønúo Eyk6ôK¯´HE‹œm t'­r6—“Z]¥ÊÊÉqúÃk¼†M3Á:5î­á}R}Jñš8>Ñ,"&µÉݹ9ɸXoY¯þÕ2Ç#ó|¯ÎpG¡ ÂÿJÔ~#ZÙk wkë+A7Ûn"FS÷ÔžsϽOªjúw…ÃFÔôK=~æÒ²Í;°)¸–ØŒ¤d ðj¦·§j:²°Ô4m1žÚ4hŸO±Œ²Ú¸98_Vï¢Ð-tý&èk¤;Yº«$y;ÃóGæwŠôcUÖ[TÓ¬¯.4é9-g¶…™"L|ªX 1Ž}+^ëMð…ψ£MRîöIÚ3q ¦Ý¥ n\õPOSïYÞ+ñn¥¡ëÉ—y%¦šÆmbþI"À ŸRyÏãZw_ôÝ_ZY¦ñ–—stRi4¹Õüå-‚UX¹äã$SßÌ6ò(7Ä=}ðgõ®²OˆÙ×¾É.—d-%.d¶Ss>PÛñ’GZãüCáíC@¿hïãd.K$„ƒæ.OÍÁïïCdløIºûdšÅÌ%tH£‘.æ l‘vóÔäVæ€ú^§'†l¯,õ¤·8ûTþgî²7˜øá±úV/‚>Ñu­=›†þθ‰Òé‹Þ[Ó €ksH°Ñ<9öÝ_DÖ$Ö/¬í™’ -¼­„ü¥úÀBòex^i¼Ai©Øjײ®œ° šæb_ìîÊ@'œäŒV¯Ù¼ ¥ÝjÚ±³q#%¸”@P@Í–RO'S¬üO¬|J²¾Ñïî·>Pž Ê„¡å\ŽÇ4¶ž‡Ú~£w­Çe©ÛN«v\‰c™÷g%—¦>üз:¿Å=K`":œÂVÆØc•–=7 u5Z]4ø+A–Ó^²Šö[™wAj&DBàÈ;Ž3Ûš}ö£‰<7s‡t…ÒÙ'Gº±´g‘¤\aXd’Fzz§cg øjuñ»µŠ)¿Ñ0˜—yS¹pÃî}ÒiärѬrK— °îˆäªçŸÇÜjÞ$ é:]·…¯îbÓä/7ÛXå•ó‚¬ cŠá’5–mŠáT°]ÍÀ=Oµw·:Œ^Ñ,lëÎírd•<Ø1œar=¹8¤†ÆO¤\üDÓlõ{½VÖÊûæßQ ¸ÚFHžyúQªë6þ µ±Ñ%Ól5Ç‚2ï5ÚoP\çŸîúSuÍ/Tø‰Ž£¢iM%ºFa{4-œBŽ8 ƒIxšF‘¦é–~'±½ŸQŠ6ÊÛN"xŸ•[ äJ­ÅЭâ TñSÛêºUŒ×v2@»c·LýœŽ `{ƒWõáØå´‹ÄK|ú²Ú¢\=“ª…nÛ²HÏJÇñFµ>›ubº]ÄÖšZÀ­k²B2R}[9Íiê~´× ¦£¨kvº5ýä*ò[ÜFÌYºnã¦p:úÒòÆŒïg]]ìÑöÙDˆ-ãCòö¬>¹©ü#­Î ÐÃi~J±TÑÊ7\zŠo‹uV…×EGØì€EgA½Ž:îëŽx'ƒµh‹Ù‹([R¸V·ÌX´M´á@Î9õ#4u›tßxzýµç€iöªÆI!$ §åÀ9çéÅ>ß^Ò5n Ñ´ôU eŽhæwó9PˆŒò+7Ã:F§²îÒâ 9þÒ÷²¡‹qÉ>Þõ¥§Aá˺¾Ðï5 ÝNÖ’8n¡DU=Ôƒ“€}(^C~e éW³É¡ði‰nMËÜ«/–3ò•ÈûÙè>µ¥·‡t=:ûRðþ§}©ê —6Ë’§‚ü1Ýù U Ä:ŸŠŒÚ>¡¨M<1±W‘²#p2ûzýjþ›á§ðd7ZÌú†›©E&5‚Ê7yl 8ÀÂóFþbîQÓõGÆ–—:UåÈvÙçC4§j«)ä1ô þ•ÌÍg-ä–äÇ#«ÝnFí{×Y¸¾%Òï¬4íÏJ¾dÂ2 ʃÊrOLä­qï¶s´3DÑÊ„«FÃO¡˜×‘Ú:ÛÃ~û‰ì®EÄ—>e½²8Y#ylú¥®ßŇì_Có­´ó+ K?ïD½ƒÛ*Æ™am®xJ u½DéñAvb‚èÇæ;)²ã# wã5fûSOèÖ±è7‹|·r´¯zÑaN6í$àŠ¯1z• °ƒÄ^µ¹Ö51§Ï ­3.ñ2c8ëžz’ûVXXZi7QÞ¤Ù¸k¦‹)!é€zt§M§ê_´›[È<•¹¶v‚XÝÖÛ<†\àgIr¶þÑm4ínÂ=Få¥iÖ7ˆW¦)ç8¤7ºn¥ãÛK]FÒ4{º) Þ‘(aÎåÜ@ç=*¶«Z‘©Ú‰õ Fó9¶]Ùƒƒž}¹â¤ñ3>¥§i—E«C¦Ê¶Öû™¢˜7Rzõ¤Ô-íî|1§ËªHöº’+¤?.ZXÁùwç¦9ç¯J§‘ÎØEi5ä {,–ö­&%š$ÞȾ¡r2}²+°ÖüQwátÓm4+¹"´X7¥ÎÐ|ž¤s‚1Ó5ÇéöQ¼·µYâ·3I°I;í=Øó]~³©ZøjÃOÑî4ëMRx|’; “Ñc Іõ+ßé¾3ŠÓU70Gu2”•n¦ØYÆážÇ4š…í¯†­ìôË» mVx´/;2s…aÚ«ëöWzì67ºuœ²X˜v¬6ñ–8e8÷ïVn­´¨´Ý>=xÝE¨,doÁ3ò‡@ :jSñ•Þ´ö—–’Ig,XŠXˈá—8Á©çƒK¶ ¯=Ü¢<j}¹ãxnøúT~!Õ¥Ò§´‹Iš[]d§žüŠà{gìoç|Ò˜r"¶»“ò·Zö¿Û•Äž2ð=¾ð Xܹ$tÌŠ?¥|çû"|PÒ~üK‹ZÕ­®îãxd´D´Ù‘æ)RÇqŽ8ÈÏ<ŠõŸÚOÇúÆø~÷ërÖ–zs@ÿlˆD|Ó)m£æ ñŽsŠõéN+ %}LÝD|é+ñu©ï丕gxÀ20qœóZmOYêbý+3Æ2¡÷þ†¼~¦­h`<¼zWI£vý sŸÜÇ÷k¥ÑTQIŠ'Kls´‘ƒßÞ­äÀþõV%<ûñV•¸#‘ÜTšß‚^ \ãŸ1G§ð×Ý_²cÁØþøÿÈÍ_ ü' [êã'ýjÿè5÷ìˆü ’ tgÿÑ\óݯ…úõF8¥p>´F"`äS½(ÅçÞ€ \c4ƒ­)ýiˆ1Í擹ô¥è(œçÚœ)¸ç'ò¥Šw¾”bÖŽÇÖ¨@))sŠBx¤0Áâ”ò)3KLCS$œŽ;Sc$PŒ d‘‡ÆáœóRT7LDXûns€?xí¸^ÂO:Òç%sÍYúÐ3œñ%ᶸ±@Ää·¸Á§x~s5צkñþ¨Ö×ë,~^ÂzÙÏò§àiÄÎÞ‚›CŽÌì€Ýõ¥ïíF9÷§Øv ‘T Žæo)0 ³žŽô“\‹uòÇ ¯2ø³ñ7þ .âÚÅn.ug²}Š#4°ùŒ8ãAÖi•Tv, ÇZqNmF;±è•ÞÇâëüaø«sá[IÚhW £±‘Œ—×{#™LŒÂF]BÆ3—RÌN³¾ü7´øwáøíÒÖñÔyŽ£•ÝÏóÇë\gì¹ðdü-øi¢kY´>%šÕ%¾ËçIò óe²rÆF|O\ öšÖ¼Ó—$~è¿Ïç¿á²C¦¬®÷×àQEs…Q@Q@Q@Q@Q@Q@Q@~_ÁQþ&6½ñkþ K4Š?Ù=Ѻc–•îBè¬Kø“_¨5ùÿ&ˆÚ²ð~m&ПûàéWÇÑŸ_ŸÞ¶:dñøÖ敦ÄÞ!Ób†!ûøÚ yrx÷Æx¬ CwÚecæ=>µÓfÎ/´[’Æ#¤( ’x­[Làiž´ïg£Ë¥iåyqºùN>è ã¨#*G£õ»¯xïÁz͆˜ºN…‡"¸‹R»ŠS:ßLÈ^$e`B&õ ‚?‹?Ã^uk ß anL{­Û ªÒ+vÃr2{ãµW¶M‹S[ËA¼ê©5º»ß9R¤t ó‘ïëN˨&÷C'DÔ4FV…šÖ4quåÔ¸`GÑõª7WzT> Ó¬µè.C«»Aå²!<19+Âñê*ûÆ–ú ×VÒ/—33|èJ“#øNŸ\U;Ý2ËÄ^ ³–òù-u8™¼»‰)'1“ØŒ¹ÍO«3|RºŽ h’éWš=â2Å,/ƒ$€üÊØèyéïZž/ÓáÑõ(lÒc=Ì6Ñ,ïÁiPX:œf©jšÅÿ€ôM.ÆÞ8®#•q4щ#,N—ž2:f¬x‹G“HžÎ9%ÄÖÑÏ".~RË»>ÄR^ ö2‰ßœqŸ¥}cÿê•Sã³p_B˜(Ï\O¯“„{O ãó5õ7üÝöüq¸ h· ßqéHÍÝŸøÀì+œ’~^+7ãM¹ŸOÑ'áIÓíŽqÈ>BsZÞ.M àvÇ­Tøß範ü6ó6ÅþË·Uò—=?Ú-ÖŽ¨Þ Õ­â[ »mQº„™ ¹´€[y@“¬§rFÏ>àŠÈ×4½ZñžonZÃY•!ûL  Å#àÙþp2=sQ¹l²t›Š„zýém>Í$fȆuØZ!xùÁ\½kŽ|%OÊNFk³Q­kÞ?ŸÃÚ£½–Ÿfdš[fˆâ·{ü¹#žüWüÉòŽ3Æ})ú1Hµb¼Œ‘Ñýkö6æ_2Çp8 =sÔWãu¹ØÊÝ9Í~ÃÃ0}Õ—€ÖÈÛE4µ3êyïŒrÚ]ŽYý³À¯=’@"ÎpÝ8 ôoþÆ´-÷ƒ°±^}w „ ·và ¬hìýNÌFëѳü»HÏÌpµD¥IÈãƒíV¦]£i9öªS¡8<óÅtŒd³aJœíê@5ŸrŠ[#[—9ÏUþ•R소¯U'8¡-þÒ˜}P0 `óõ¯*Õ‰:֌ǃö{^Oá^­ûG©‚‚I".•äú³¢0ÿŸk|þtšH¨›¿neŽ[7ŽF¾aû²G§¥sv¾&Õ­e_/Q¹EÜ )9­ïˆ?d=²Ý ã uúƒCms»Õ|s­išíôÞ rmT‘`cÞµü=ñT½¼Š „ ²„ªm?^ q^"çÄšýtÿ£áP©lOgήú‘Ô_Šðù>!Qƒœfº¯ø³Lðß„ô¸µ Z7™]ˆË n#ŸJæþ.€‘Ê?ñúÏflÏuþßÓ!´—q[£ð¦c´5kÁ¬éó…ò5 gn>T•Oõ¯ñ¹ ¡Ù¿:ÿè5Á?パқI ìú¹O˜ [ýÚ‘@Îz°â¾nÖïîíµ¹Dw3Cû¸Î#ᕽà¿êòkvI©\É È‘ä$øÓqH\ìÝøÜ€YYà–<š»ðLቲ &å‡è(øñǦY`cæõÍr¾ñœþ ð\SCmÑžúDe” F*w-è{r.àAù}Úœ€èkˆÿ…˜-4(5+‹UÕIHŸ‘ŸLÔ0ükФP$‚îެ›±ù9C#½xÈ9©<½Ç$dzŠæÿácø}Yßy%Ð:¬¨FTô5©§øŸJÔ0–ú•¼¬ÜÔ¹_`æ[\ç>+Ƿ—9ë¸dWœüb¾.|~ÌÿÌW¦|XbÞ¸ |»‡5æ?üV zÛÉý)ƒÔöI¼#áûÛ¶M£A&¥æ …èg¸c]ÛãºÖ“Ú%Å»Ç!Y×kFÂ;Ôˆ™a—×¾~•2‡G 9nô$T–púÂ]+ÃúÊjV÷S\˜·2A4K¶6=aƒÇn+ ñŽ‹?‹t;5®d èrHÌBr ÿgØVþÒPn€:õÇN*cqÜã4ó/ü*¸ðµýãjw:~§g4!<¸7IüÙùÕÕO†;וêpµ¶Á»\„Ù)nƒÒ¾ {rÈq…<×̺–WƧ#¼\þð¦¶ÓüIÒî|(Ö0i"âÏGPÛ%%¼ÃËoaŒœc©§ü;?t‹WPÔ›H¿hd½©˜\HY ü¸ìs^³mu=›9†Y Wá•ì}i¬š]¹-×46 .‡Šëž3¾ðV¢š„PÉe`¨„]@$2°ä¸Ü3“J]Cáž»â;öÖôóZ]¹GšåhÁýÆ!ŽßP;W¬ßx[GÕ® ×ú=üì»|ÙÕ‹ìU‡JºyK±8@ÛÛ ¢÷Ð9z£Çÿá&ð«øœ$Ú kÑ8OíA;íy:oh󷯵p:Ò_Å©Ü @J·cnóÁ9äŒöúWµÝüÑo57¿óï#‘æó^Ü1sŽÄ~µÉümɼ±ÜI*›FNp2xÔïqZÇ9à­Næòôè Ò5†¢&z£ûãéŽ}«WH𔾞mjæÿOÔ--amÐØÜyŒå†ÐޏàsÍj|.Ò“Rðv®°ÇZƒ»EáŒy©”êî*ƒ>xƒL×#mOKžÏM¸…Òi'OÝÌ„}ÐzÈ#Ó­îM·± —ˆ#ñ>—©éz^‹e£ê2ÄEŠnNY>¸éŠ‹FðÝÞƒ§êðøªÊóMÓ !h¦ŒÇ)“wÊc :ã<×a¯ø2Ç£¨xrÞåo [çóJ.~vC´qõ®GÁÑj>=²¿Òo.ä–ÙUeK™[ÙäޤOÔ\m¸Ô´ÝÃ×wž’î3$É÷eLÐ.2!@Á=ñUa7^:ðܓ꺊BÚ|¸Žöè’²÷|u9^knûA›á&—uwÜzÕÓ¬Â#Uë–VïY—wúŸÄÍ„0@/l¥ó%‚ÝR‘ûøàd`ýi§÷áRg1!™‚à§l®˜I(lóšH¦Wñ5ù]'I}Og£•r$%Ö\üÁÈêz~rçF°×4­.û^Ö‹$%’!™Tá]†AJ/üAsà+ ß»Zܯ„aLÇ8ÛŽqŒ3O¼Ð5O‰VÖzº\ZÅtÑ´S-íÀ„HÊz¦x9ÏOcUäJ©x¶óÁdÒt‡†[X ÞfšO¿$°ÝÐsÅC«øOVñŒk6,ñ]Ä„Ç$Š… ˆÈÈâ¬ê:–›á+{ +TÑ­õÛÈ-ñ#ÎÄy[ŽB¡gµCÅV¶³so¦Z]Ϧ=ºsg2Ä£‚§oB '¶£W{ü[5µºÁ¦½ºË©ZƱÏzîfîã¦G>Ôx5tèæó¤¶¯é-b|§Âž½÷g§n*YÙÃä=Ôξ hc7P¢/vrzîéŸÆ«ø7J‚Y¿´¤¾D{#æ‹!Ÿ:P9N1€zÑÔ] :е~øh÷—×V›£’s¶<ƒóÛn?*µ¤øb?O.®Ú­–¥ ”læGbìHÚËÏ4i2—]¼m:KK+g¼W†›{eIQ˜| °äƒÐýi¾ðV¯¢jÞj–Ok¦Ãý¢F*RE#A’N?*wï¨[{hGgâ'ñ]iöÚm……õÄMåËgäÇ%=@?•/‡ š_èv3hö „2º=¢³ùRsÆNîimíl$ðí¢øšK»)G­y”§£wvjM_T_ i#Ã7·Ieq#Èׄ‘œqµ±Ó…Ó®ü}¤[^]jö÷pÊÖÆâþ]‰0êpyÁ BêÚܾÓôØ<=y,v’ŸíŠ6¼¯œ}㊧ªÅqâÝ&ßXšâ4ºŒ4Syïƒ6C'©çŸ¥h]ÜAàm"×NžÖËZ¸•Úvóy òùÇZÌךãÄš}®¡cg²Êd–ÞÝ0–ìO  Š@»¯¼çmí'¼–;h"i¥‘ö¤h¹fo@;×mªÙi:n£[x/“QŽ­¾H“?(pïµpÉ4–ì²FÍ£dH§í.4¼E¦i:…ö­o§]Ï–ïw“æ€pŽz*ßB·Š5§ÓO‹Eš[=(þ†|Ÿ˜±îsÖ¤»ÐLjì´íF÷S·Ó.猫 ¼þô)áÆ=EYÔõÙ<¶‘aö{åDóežx„‰#1ÎS=Š«ªèú¯RÏU°¶k¯5 <1•Q/\Gغ–°|(,´Èb·¿éæ."¬[Ÿ—#¥G­hº—‹šÓQÓ­^î)â#ÊŒå2ðÊ}*[³¦èú}Ž¿c-åüHÜE.à “¤ƒÉòª^-¿h‡ØàÒ¼m¶1ïî £^BëËok¦XÙê;jÐÄTºœl\üªÞ¤+K²µ¼»Ž+»Ña7 p8u­bÕ/ô«Bòám¯ž-¾[.LÊç±Åciz=Ƴw¥®Ç™Ã²H¨8÷b& Wˆ¼Y{£^Ŧڤ"ÚÑ/mügw=UÖ<9â)aÕ,áó#º‰\ÆÒ*”=#Ž*ö¿ªiMí½æ™«=¬+Óy¥~aØy¥eø¯í—×ñ]ZC)°x”Ûýj/÷xèA¡ù‰yµ[Ý3NŽÒÃQ°þÑ»·…RI’B…yÎÞ8Î3YÞ)y徂{th¬ä‰ZÙaÈU_Aô5§ªézd¦Éµ‹ù,u7„yÉB@} ä`ã¨u^xvî M.f‚ÖÁ‰ø>fyÝøûS¸ëÍ7M»[)5‹é4Ëׄy!ó sÃ0ÈÁÅQñäšZ¦•nÄY¤jÀ°ÿ[žwþµ¡©xvëÄíi©[É Fî-ηSà ìqÅT×§‡N´¶Òç….®­âÚg-ÊdçÔPN“ª¦™v³=½òí)å\&å#‘ïèkgÅún£©kú8e»·¡–$$(Ç ÇLV>Žt϶Gý¦³ý”‚ ·`vx<ƒÅkø§]ÔìõÙ+‡µŽ5_%bl)Lp}ét] wé ,ð®¶oÿ’¢f³+·v;‚ãU¼Sâ»=e¢Ó¤k ÕE¼Q7^>Sïõ«×¾Mrâ;Éõk-*ææ4‘íï7¸ŽHÀ?—½E©x•t ˜4øì-o£²A븃–=úö§°¬½Fê}rK[ã}ia5Ü+#Ezå>n™ÁëO¼×“’Ŧ-•ž¬°E±Þö"¶N~]Ãù‡Ä&­â‹ÅÔ¬læÔ-®YE¼yòÉþ £§ ð?]³²ÓÍ–º'MNDrùÜœð®p8 k¡OÅrÜkRǪÇúÆ¡V5!í³ SÆ[Àñú“÷ÕAâ[£o%½­«•Ó¼Ðàýðz“ïšÜÐt„Ö¼+m ’ù d“.«¸õ㌊]D–†„²u(þýzihÈ-ÇR+…Ô¼2þ‰o­oÕÙ[„ØAúœñí]^ƒ¨É©h¶÷‘溒ØH¤R3&Bþ0³¯‘!𬯠®€Žr8ôëZÒ10²ÇìòVGŒ ó†Flþ4É{3rcúWM¡©!@Çã\ÒŒ˜þ•Ó胅…Κ<{U£d$±u«Á²;UйCÁÇ~zÒ5;…m¦¿¯¦×‚`UZkrã½Äë÷6ÚŒ¤ ””‘Çp}*Ö…«ê7¾1ƒRk–’â2dg˜îP1È öǦx–?+[½B1¶g?Z­á«¦´ñ-±ùñ>RX‡ñ!"·zXó¥»=$+­´â8Ç%Ö5b~QËc=ÂçJ—Mû=ýí½ÖVŒIÈò$mcêÊ‘ïíK½¼Os +[¦ðBá‚ð7aœœUˆs®YÞÛXîÛlÑ6B¬¬§”o¨'Ô ¦.Ã,¥ŸÃ–RÉm:Ê.I‰˜)1²¨ÝµêO¡ô¬ßxnëÅž²Ô­1y¯¾Æ,(t$þñ±RëÈÅkÚ[gé·PêP“o+äù‹®He#ÐÈìHïX>$†ê?YÞé|Zz\²LA;Õ¹Ù’?‡†Ç¸4[«-_oÀ†MJ×Jðž“§øŽÞk¿%Þk[tm­O9ç¡Àâ­jòÍyöMBá¦wº…dVŸ®ÑÀúŒµûˆ¼ b5«…°½†àˆï¥´‘wSÜóV|Cª¾¯%œû;u·Ž2JìA´{žN=éY‰»+9È nŸá_MÁ?ÜJ¹Ç™¤Ý‚>þUó.pzø×Ñß°T¡?h}=@Æý:õxÿ®yþ”™“?EüTö-ÆyãšÎøÈ_þ‘r?³í{dÜGZ¾&ôk€ÆÞ”ß‹P¥Ï€ü%wÂ6™3íÀfT GNHÆ?*]Q¼âÏ…@Œ’ ÷¦Æ@.ÙÎãó«$dî :äàšªÖA‚vœâ¬OCñ˜¿ÑîW òÉ#¯õ¯‡µ a‹VÓ­§’á-®á-2ƒ¶têGBy÷«~BDš®£{¤ØêÏ2G œïž$̘cÌVWˆ|»«Øê–7Ð[½òÇ,ÖS9Y¢sÛF9¨úûVö©¬ -6úÞKd»[ XîvÍ*KÈ HÎ1ÏÖ¹¯øWVÔ5ÛMoKInì¯)¡¸Aþ àf6ôÚLTz—èjjúõÇŒü\ºv 'B¶ïxøIÝ#R0Dz€;ö¸™#2Ž@8Ϩ®óYñ­ï‹Yt˜f_OÚ\\Áƒ„©W!zî#©ö'½p’Fc•“¡•=n&$m€qºM~¿hÎeðž•!9/c ã§úµ¯È$O­~¼øeƒø'Bd9ΙnGýùZ}LÎ;Å‹æh–¹%ÛhÎ3òŸð®QVHÊôã®;×¥ø7èVàs‡cÇo×›ÝCæç*6®0{Vzú˜ãèŒÍÁ€ôã4ÉSh ¶r1Çz¼Öá›QÉ=>ŸJ§u#¿<îŠé8Ú3§ùábw+qY3¾âÀóÈqZÒFääç€P¸·XѤá³Ð´™Hù›ö!¯b úŽNkǵ–+.ˆqœÚBsÿ5ìß´Da®¢?ôÈó^/®“C8ãì1þŒÔ‡oÇŽ v­þÓÒ¸ÉXJé¼qqæ5²À¶+•4KsX­.oëÒ†ñù ²à"§Òu5±¹ŠB3´ƒƒXN÷4ó;c$÷«‘Iq*¢ ÌN§}H”NâEçö…Å…Ö0%‡püë'UñMè‡Vn~Œ*÷me´´Ò"˜m‘-ö°÷ÍSÕX·…4í›ý i>¥tGKâì7‡,ÏûIÿ ×qÀ=²+¶ñLÀxrÓ¾vè5ÄLûþ˜¢AMÿŸøÈ}`„óþà­ÿÈÃd騬våeÕ™Ç ÃçýÁFŸ©¾Ÿqð‘æ#óÍZÜÍ£Õ¾•ÝÜ6s’#Oý ¸9øÇ\–¦Æ²3=‘õ²Š¯øGÄ?õÕPÖÓëÂ/ëW¼&Á5Ë"N•yüj–ä3Ùþ08 uþðÉü+Å~ÜÉi¬ÞO š+ ‰‡f kÙ¾,þcp§úW‰øU¼Îl.F?à¡t6—S·ð_ÄgQŠèÜÎ’´@m>X½ª8¾:jp’³iÖ²ö,¬Ê~½ëžøtIŽüuÈ_äk—ºâF㣫ègmOb´øÛšiº¸ÒÙWÍŠ@OLç‘ZV4K†@ñÝ[䌆MÃ>¼ñˆ>b;^¯þƒM´ÿ\ŸQMkÐMµ³>¢O2òÓ|jÅwxàJù›Y]ž5p{]¯O÷…};¢¿üH­ÀòÀüv¾dñÉãg=ÅÒŸüxVhÙŸF $uÏÍž;â@H# ŽMxEÅÌ©ñFýD® ÜÉò†8éQø‹ÅºÎ—¬Ü¥®§q@ùJ¾Tf¤Ï|\Ç€ÊØ= «sŽkÂt‰Þ"1ß3Þ‰Œ0Q$`ó*ýŸÆ}`mó­mfþR¿Ö—/™\ýÑí‘ 8ËqØý+Æ>9¦Ëë!ÇÝíõ5êžÔ&ñ‹ áTƒÌÿ–`œ òÿy¶C‚Bò:I¾¤ÿ ð®AÿÇEzPù£çŒúô¯.ø?¨Ûišü×SGfè(y[j–+Ó'½zmž¡e:#Åq ˆˆ0`~œÑfÅtYÂÈ3ò`çÜýh’Ø.æÙdä˜Ð þ#“øÓÄ@ò8^ËÔš—rª7ƒŒCþZVi™WšM–µla¿·[«bAh¤ÎŒàä~A<7¦hZuèÓ,RÅ%RÏ»¸È¬Iü3] .8ägr‘Èü?‡VÂi7!~mÈݱBÜoM—¤$k^âáô!^Ëñ Áw¾=º´¸‚ñìjRF¾™¶•ÆGÍ‚sÀ+Æn5‚é¸ÿЫèøI/Ø)žÔû’ºß„|ƒ¥ ?Zµ³Õ¥YZO.AçB™ãäMvK˜µàØÝ‚0\ü¢@êr@íÅr¾4ÖµkiºUÄÚm•¼*! ßëv>¤šöÉÔ¡—Æ{qQÉ,k[i‰À&â—O™N)ê-áÞ.ðì×Z|>$.±-â£ÉlàïV#’8Æ>µCÁZ%ýõòjqG>Á÷\Ü3¨¸$‚3“‘ÇNõé¡X|7µÔÜ\Ò°~[¥Ö«E*†F•T‚;éG˜¼ŒÍQðýÞ¬ãLÒå²ÕvHmf’à¼m&>^Äö¬¿ \j7ÚÛY\´ò[\G ºI˜áS/Ï¡ÅwÚwÂ'LÕaÔc¾ºœDæEµ’U°Þ’Ðfºïý·ÄzÆ›-ìÆ9#ØŠÒŒz¥;Ø9O'Òt½A7Z¶¬ZæÎémäÙIãqää ô¤±ñ–±ã›k½útv¸ˆ¼2,j‡zó‡`2TŒŽzVŸ„¾jz>³ æ ößeUed‚á]Ÿ ¥qœzšè¼Oá«8Å®Kw#Mæ2y(oˑ֪jP_xóK°—IÓ‡îá’ÂÍHÛïQî*Ì:m·…48­|]§Ï6û–hlc—Ë–1Œ3nÀ'ÕWÄ:ŒV~°yözSÊæBÒfQ'÷]‡^:R¾cÛN²Ò|?imâx®b¹YȆ,Ñ'pÙíœñT1Èô«ÙÁâmÎëYÔ¿³¦ŽFŠ+©PÈ'¯<ƒÇ<Ñ­ÝGáMÛJ°’+ø®•¦–ñ£ÊÈ Æº8ôíÔNÊùì.¡¹‰Q¥‰÷ªÈ¡ÔŸpx5×jº.¯ã›{ JÊÜNÍ—$(V5Œ¯÷A `ŽÂ¹I¡Šâ).!óíÕÁxƒmÞ;ŒŽ•Ðøšæk;J“NŠX4¯(¬qÆI(àüÁ¯½.š”÷ÐкþËÐt½:ÃÄz|·ú„jÇd3ùf'*¤Ž§ük3Å—;Fžúp{}$ÛuW$©Ï͸úçÖ®?TÑôÉõÍAôÛ­8‹ÌicåfÇ<Õ[Ä“ø>-?CŸu¡‹ÍûK >~ãÉǧ*‰ò+ËXÓtÛ½cW]&êHʆ–#'š€ü®pEI©xŠoÁe¦io¬bVžHà Kägµ%xí-5Ks›*•g•bPêq•Ï9ÍòéúŸa§j¶?ÚW‘¡-‰vù@œ…u¤F~»oyâ+XµµÃ!M’©`6°8;Gpzñ\òÅ+Y›œÉ?¥ox¦Ap,§±‰¢ÒÌ?ºrDg?0cëŸZDZԮ´»…¸´™àr‹×¨¤ÊW±×júN-͙յ tûÉ!OöGLðp}i‹±ŒüAt5”k9ÂÄB‚Ò8\…cåÇ­O{¡C®Çc{u©[iW—†‘.÷~ðô0 äsO¿ñTž¸MÓÒ «{dd»¶Y<Ã× 08Šr së\ÈçËõÛ].ˆ QNÄÄêí”`sßµ^hèTö9ª–*=È8«Û” À|‡ <óRju¿ †luCÛíÿA÷×옻~ÅîÏÿ£^¾ øh»¬5?{ý”Wß?²Šmøin:rÝë£×4÷GDWºÏmSÒœzcµ6—¥Iˆ7QEsšJ\bŽ¿Z=©€wÓ÷‰§i öí@>ÿ @¥ý*…Ç=)G#Òwô Š:´rKn‚)¼†+ûÀ<§ãҬƅSÏÖ•Àn£§5´ââ2yáŠF1Š-­Ê¾–,G4c=i§­2EšZn9Å;©ö ?­.:Òu<Žô¤óŠQPAÀfla¤»ç=úp*~4Ž84^HeÚÀyÅX@#ˆg€åF8¬ÍkZ³ÒtÙï¯eòìíþö:¹ìª;’xù¼Uâ+oé¦öìBv[Û!ùî$ì 3Ú—á7ÃkÿkÄ:êù—rãbcå‰D_@+?á÷‚õ‰~"MX„Åü¶–Vý=Éîkê-G‡H´H£@¸â‘¢GžxÇLŸTø‘à‰`‡@hnüE „´·RXOeöXÕÃ-V{˜ç$XÛª•œT¯$ýžluh·¿uæ„k^:ŠÓPŠÒÖy¥‡NÓVlíÈpYD’Ê쨥¸—Œ5ëuÓ_Üj’û:|úÿ•ú¤ˆ†«›¸QEÊjQEQEQEQEQEQEQEQEó·íó gömÖn?âYyiyƒÔ9c8ü%ÏÐú&¼Ûö‘ðññOÀië‚Í¥M:ƒÝ¢hš ÄçÃ⸶ñn§ KÇšÇðäñ[xŠÝe äËò;'ÞPx${޵Öüb±6þ,yùf…ztÇô®SÂñÂ|GiαHeº„ð ö®‹Üâš³g§é×fÒapy…H(ÊFÒ§Ù³Œ{Óã‰nlua“p±‰ K–Ý ¸NùŸ 4iÒù7F)"†x\q°‚òꨤ†amu}aq$ïj‚Wk ,sëŒÎ¯búé‘¥þ™qÌ)Æ3å¿ ®;‚3ŸÀö¬íKÄþð½¢é³¬ÐÉ,ˆÓÌxÎâ„§'<ÖþšÏâ[K¨YÕo¡ÄÑ;¶Ôqʺ±õÁÈ>£ë&ïR‡Ã^K_OKµy›l¾÷9ÞøeºçH´ÁõÁ+ò3Gr9¯Ö¿†“¾xEº†ÑlóÏOÜ%=Ä-ÌÍ]?âSœá¤Æ@ÎÖ®úÉ É$žN+ÑuN4´ÈÆ%þ‡¥p7Ÿ¼–DëÜf°£×ÔíÄ}ŸDe´`¶~ñ`vªsDÇy ü3ZmÚzòz)þuð‹œA]78Ò0gAœXcè+"÷rE#ØWIw”G¡éXZ’¨F$ƒ×$š/~ÐdµÔG)Fãñ¯××nŸ ¾1›/äí^ßûAaä¶9‚1íšãü?à­;Å~Óì³Z‘o²Ȇó‡o¾œnCÆqÈÆFzõ*êyž­~×ó ãʨ+®ñ?Âïø^¼šÌÞé[°º†f·>™`2‡ý—ûW%ÔdQS{›¥eaÛ²ÄúÕ»)Ú‘Ôàƒš¥Š¿§é×wáÚÚ•c]îÀp£×?ˆ¡2e±Ò|B—í6úTÝÞ.k#Rçš)ô’à~«ZÞ7…áÐü>$!¤òâ|šÌÔ#'Á:<–êu?’‘Mè.Äþ'ºß¥éñÎÅ$~Ìb­]ݵÒÄø/åUhnìqÑj<–gùŽN;Õí6Åïîâ…\)v “Ú³òKg<Õ›iZ9‘а9Kp–ÇsâOKáßIm4É3 ûÁP?¥sjÙð1†¢?ô]v~3™îü$½º<äòNÞµÅDßñEJ½Æ¢­ûfj‰é¡µsp±ø'–UQõÍqNû±šÜÔ/wxvÂÜğΰheGSJþõf{BÄvÉü3MŠè‚ ’¾àÕÁëš»¦¤2]Ä'?º,öïBz“$’;M3[ºÕ|'¬ZÜLòÇjñ†9ÆN+À#:äËýë+Çýs5ÚjZ5ާêi`ËžÍ\îlƒ†ÿë×àŸØÚÎ?òSní0µ“FŸÃ½{î«ýk—¾Àš^z9þu»à‘lnݺRZæ¯&2\J{'õ¥}×f³cÃrÿ×âtÿtÑj@•IàTRïnžÖüó(“ôÅÜ’:Pš¢Ùõ?†5‹Ký ‚xå+ ªÙ â¾sñP+ãYëáô!Ká½vãMÔ`hghAp§iìM/Œ†ßOŒN§ %°âÛÑš—k³â­à'þ^[§ûµ•ãuÛ“êùVÆ¢ä|Sºü¢å±ÿ|V?ŒÈþܸï•_åL’ŽŽÙ·ÕG¥«søŠ†.1ÏaOÑÈú¯ýz·þ„*8˜¿JHúGá²úç^wñü–¿µ$qŽ mü1ñþo§[is¹†eà3}Ó“ëXdYn­H ޤÓLµ$ÒG jÇþõâÿö”gþY­Y2>ÀAÁùyïVM©Ï€oí¨Eÿ Ø›áì<ô#ÿB¦‰g)«{juwq#îJítW0×4ýJhâÔî®›p{×'1*Çkc[_ø\tèŸú¡6&•ZøiâMGÄ3L—ó öŽÀã]æ«`«§ÎYË€v¯.ø<¸¸Éì1^³«ÚUÏýs5-ê\~å+µÆ²Ã¯ïÇóîÒøËJ³Ö[K–v[Ș#FÑ»±ž½ëµj@?ç¸þbº]Y™þ%Ü’rMÇ<ÿ°)ƒ=†?hûŒ/©À’¯ðJÁpU”Öô¼1Kè&8¤™'ò¯Ÿ¼X?âu7àqTmÐ:õÁ ©NGÔÓÐWgÓBúÂY ýâ€ú⤄GÎIÚÍÇ>ýëço^\%ô O(RÀ¸ô¯ 4ëThc6ä•b;T»!ŹÆ ž8謸®sàÙÿAÔ‡ù¨ñÚé¾/ƉárÉ/œžµÁø_O xsU¿x Ê‹˜£òÃmê4÷°ö=Š4ê>î={S0CàüØôé\¤¬—GŠþ[)£ŽSŒ+"ˆ>*hã|³!8áŠ,Ù€Œ2ð½5£ÆwpGJÁ‹Çz,­µo”6~ëbµ-uk{Ѻ ˆØŒçŠhjIìY—|±mgfQÈ ÇÞ¾~ñÊìñâú1­}Òb3ƒ•=‡Jù÷Ç£$¼'‚I8üM ê{5Γa®éöÖÚ•¿ÚmÂ#ìÞQ²þ!È©´ÝNТh4»ciní½–I ’qŒî<‘N²_ô[s‘“p;ü¢¯fÈ÷vç“íCÜ:ï‹|mâÔ…èZM %g Œr1‘ާ𗆢ð}‡‘ Ë<Îååœ!Mý€ÚIÆ3[‘Èw…l `/$¨Jq•Îp?<¨ø¢kI4åš*м‹€yg5‚^ÃÁÓA¬À¯ww‰D€ù ã€Êp}{ŽkÒ]Jg“×5â¨@ðõËq÷01E…ÐðM#OMOY´³wh£šatPÅA=@ÈÉ®ãÅ:­÷Ãÿ±i:%ÔðÛ"3§Œ#ÎIä0€?Zã¼9ÿ#>Ÿÿ_+üëÛ®,,u }cú!;áwÏ\r(ZlîyËøSø‘kkªC$+w††´Ê"F+Ñ”ž9ÏéKwueàËK-3SÓ-uË•FwY˜í„1èŒôëîkÓ£µ‚ÛÛÄ–vÈ0°ÄDè:Ö/ˆ|§øšd’êi­¥ˆ­·NG=éß« icϽMY¸²ÓJÒÛÄS]Y_yeU PÌÑ `G^•éº>›g™uŠ0~r»ZBz³c¹ÿ å|kà¿j1ÞZÜAìÛ ¹r àñ‚¢ác‘ñ> ÚM½¦™¦Hë¦4"@ä ÜnêÇñÏi×ÂÂå&{x®Õr 3Œ©Íz=÷…—Ið‡Ù¯D7w¶_¼'¢7\Wàý.ÓXñ·¢Slá‹\#p¤Œ•õ4|I£êšÝÌZ…µ¤÷v²B…<˜Ëˆ†1´àqSßE£Ç”zù¼]A! !µÚ Ð6AÉ“Æúþ¬Åkm4¶VD©n¨øÊŽä÷9«§Á—>0·¶ÔÚæ+æ„y«p­ó°à0Ú29æ_C;Ä~ ¼Òï- Òîd²°HTÛùmË×>椼ðóø-u/­¬g¸ˆ3¥ÛÞÃÃðzÕO_ÿ„>Hôˆ--oÖ‚È×ÜOÌvî úUM{GÔ|NðjZ}¤·v’Â>HWw’W†\}i°CõMVßÃÑÚéco©4üò\ŒŒžp¾ÕCÄqMªù:´X4@~XH௷5§¨Ç¥X[X[kö÷ê í¤Úʿ­î?¥PñeôIkkhZ 4@¦Vûàõ'ÔÒ`s±Ë-»«£´d†Sƒ]†±áÝ>ëRVºÕâÒï&Dy!–"à1<Ž•ÍhúåÞ…|—Vn#œ¹e =°k Ö<©ë¦öÊ>+…2*²“یѥîI­xªçA¿M6ÎM­š¬H·ß÷¹õªúæ©ø‚ïûRÒÙî`ºfÀ ÏUÁ>µoU¾Ñlgµ´Õ,$ÔníâH渊]„:{ã¥fø¾úäê¢há³h”ÛI  oÌK} ú¤š.žÖVº­¤××[ªM,l õǾ…Rñ~³#_Û›,ØéË }–8\€Ïsëš½¡é÷âÖãSÕWI¿ši#’ã8ûÇ#¹ÿÐÞ¾ øKûÍ3S8 ý§ÿe÷Ï쾸øcgî?ð7®Yð³Ø©#Þ—5&!GéíFH4€tô ¢ŠÍ0BzOZü¨'#®hÆiE!=¨Ï4À\ÑÚ‘¹ü:»ðv©âÝoY¾Ó5ox’þ+»»í7K6*#ŠÖx¡ÚÓLåTDî2ä™ðNzé%I{iü—wµýÜÚ·s9>gȾgSáߨxOÃúf‡¥Aö]/LµŠÊÒ ìþ\1 D]ÌK*’I8äÖW#m»³m´AER¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¨/l¡Ô¬®-.cÛÏE,g£+ øƒSÑ@Ïí?á ø™ìî#h§°ºžÂe#4nG?•y…¬Ö÷Å16€½».O©â¾÷ÿ‚œ|1o|H×ï!‡l’ŬÂAÎKe%éþڹǸ¯€ô[W½×¬ãFòÈmÙFx÷âµZ¤Ì1 Þºêz”GÏýÑ,Èc#œ¡?à{{U­5§Ð–kËÆ"0º‚&Þ6”>Çš[w]^ñrÉÍÊ0K…]¿9ilzœ}óI£«[=Ü…´‘Û< —0È¥Yb?Ú =ëSÜ–ÔÃ}¦Þµ”fhмÐÅ–/O—¿‚GøVb&—uà·Õ¦’ßLÉ> Û<;‚3ŸÀÖ•«A¦Ú\ÝéóLì¤`B§ø®N}ê•ÆšÞ3ðQ’æî$¿†æC“ªÀmNSœƒìhhktdÝÉwáZÜh· =´òŸ6ùWå Ùpz;ÕRÎX4í!îÝZòæØ\HTs†'n}ñPZjø#Âe{j w>ï²ÈÄÅ…îHëRß[NÚv—¨Ï/£/{ò c¸GáK Ÿ¡·iþ5îß±L?hÿNíJÖÚZðìóŽ žµí±Û”ý¢üxóæRG¼Ô³3ô÷Ä e\ çä=½ªO:·À ?v žã‚[‰¤˜õü=*=qs¦Ož…?*’Y>Ûû>¬l ý—Qš%.ïÈÎ ùª_ÄŽškÝgÏó@#~Cc°=ê¥ØX†G=ºV¥Á D@ëÛ…W¸¶Ê.öÚ×ð­.c±Ï\°yÃŽs\§ˆbóc™%Áãœ×kPiѤj™q" z•ç½iêZ}Æ¥a-ݬo,RØ›co äE ‘[§£síTµˆô™N›o¬G;j‘AoqnÃnÞÁÆ9 µ/} z/ÔK½ m>"Z꺼’M ·"á€Si*ƒ9ùkŒ¸“͸‘ö…ÞŶÓ'µwzžsñÏGÔ®E–’Z9—÷ Eö}»ƒx$¯ëÅp÷Lu1€v*]¹à~UH™ˆ(RqÏ8¯Õÿ„-çü"ðkŒÈÐgé é_“уBçÚ¿V>Ê'ø!à–ÿ¨E¸'è˜þ”­fGR]HfÄ.å¨9ëÜ× ¨ÇåM/ϹÁÏk¼Ô×eа8̧'Û5ç÷ÎÒK ínƒ¹µÍGyzž†!éA‘FÍSçUî+m?wÓÖ¯@«`2’øëŽŸZ«(ÁF#;{u®“ˆ¥qn«ãp<€k‘Ö`?1'øŠíne;zaOsÖ¹Mj7™\rxàwªÐ•>>Ÿø˜F,: וÜx§SÐt]tûÉ-”Ã#2®$9ê {'Æýyn£%B’ e›Œzñ¯x{RÑ´ÝOM¸°")B´ª6É—ÏÊGŠGÌö¿jw6ð[^ØÞ\i÷²Â¥å¶r›²9¿Jv§em¬9“PÑtMJ^óI`‘¹ú” I¯Gý•—ÀzÏ‚µáâýbÖÂçP´þ˵Žur`h&pÛH ¸.9þØ× slÖsOlòÇ<‘;GæÄw$˜8ܧºœd{Útœ`¦ú— ©6–ç4þÒâux|=¥ÀêÛƒóÏ9+èÂx4qÛÿÏ(h¯/ʘî;Š…N[ ×9©åßíãµ]2—lh¤Zß tK}sÂ>Uݲ^Û‰¥WŽÒCmå³ dG±¬ïŒ­–ÓdzW.ogµðE‡“,âö\˜Ø¯UÇÒR_‘Õë?ï.¤’_ \ Y“§ÎË â{'ÀIݬÒ%k IÝ‘Âàcð¬/M›PðV£äFÒÉäo±FN66xúsøW¤üV²·²ð ŠÚ%™ v®{á5ýž›¦j7·Ke\FRbÄm}¤æEVä4‘æ­)hÕ Ê¯J޽ÓSðO…¼d†ëÍTÀÔ´ØÄ–Ò7ý4‹#onW§÷Mr÷ß¼BK¤\é~ ·u¬¯£IÖ) ¿èj]Öå«=3©b8nµØ¿ÁoE÷ü#«ªÿy­˜/ýõÓõ©"øE®Aµµ´Óœ$ë$ƒþ„þ¤R½öØÔ†úCF¼Hæ¼:r† :Àb¹_‡Ã>(·\d¥ÿ¶m]}‡¢Ñ´­ìÞl¶Íĸž0®Ø>Üzœ ä~|Þ.±\ 6õ>ãi«{¢²eèZÚ^sËF ~µ”çs±õ5¥¬h·¾¹H®âhÖdDýVT<†R8#ùŽÕ˜zšWèRZÜ8ǽM(a‘œv¨=N "š=Sþ̹ð¦›uikS •]€Ùf¹ï‚¾7¸#÷ÊyúÔPkP®…ˆW3 Ã“Ø Ö¦øòøÊ~‰MSZEë©kW“Ëø™zùé9?øà®{Ä­yªÏ)îqùV¯‰.Ä^8¾œð<ÌòØÎ\¹’foSCØkp†á¡Y@é"l?LÒFÌSŠ`aƒÅ:7Á⤶(-op —ÉÿžN?:ßñEÓ^x?E•سeÔ–9<1£ ë­qà}Jͯ’Ó܃Y:Ñ'Àú?=$”}>sZ+ÛS.¨¥dOü šŸ ¾„‘ÿ5®\¾œcÿ¾«"ÀçÀº¯‹ÈM¼»øF­ … äzóIÌ9ŽXÖ¦¯(mbá·nLø¬‚sO’WžBìrçý*nS‰Ûx3ÆÃw$´bD~§=+جüYg¯é3}žEÞc9Ry󯕤^jŽËkòƒ'žÕ³áig±ñ%¤¤Ê—5zKs=c¶Æ§Æ¹/´ãù×I«œ|L¸ëÿù?pW7«q®OÇü¶þµÑk$Âȸ9ÿ–Àóþà©)þ†gŠùÕf>ªXs¤ê£Ú<{|Õ?Š' ªËƒ@RÒE]3Q˜GšŸP[>Aý£oþð¯ ôw;ãh+æËKónêèpËÈ5é^ø¡å†ýFE΋]hL_+Ôè>1óá‘Ç95äúcÅ ¬)}®žùæ½3âf©§áA,¬Š?ºs^g¦sàmdàä]ÛóžÜÒ-»ê]™3àKcèÇÆ¹ñ>Ð¥'þ…^ê‘âN9lã ¯ ðèÅZh<µ¦ïªî,üc©Ïâ»ë&•ZÚ7—b˜À )àfšD·cÐV-É'=*HìÌÙgÏVnõæ ñgP·•’KH&ã •5~/‹Ñº†ŸM 1ÁØàÿ:vóüBž3ÇH9㡪0 ©CÔ~µ‡áÏÚøšGŠ%Ysµðç] ‰ym­¸žM ÌOÇÿüýÉå_ñÿ ]¶q÷_ÿA5ê¾2IAºb§rqŠòŸäxª×èÿú ¥Ø/«=v%ŠFKx&=?}¿qóŽiâ5ÌFÐTp=‡ ¦B£9¹©Ä` î#xçð  }[Â:^·8šöŒè0 /°ã=ëJÞÕ,¢†—d1 HÔò¾§½M2ƒ€NNOZtÉóm8ܽv÷¢Ã8ßü?> Ô>ÛävlT+ù¨Ìö ð-¾»|nEËÚÈTˆÃ>§‘G˜w‹¦ßwnm×ËÓÚ0¬|(ÇÖºÿ(oÙdã;ù#ý£Lñ™‰áf²·wh}æ.s’Hϯj›ÁXO Øç¡‘Ž>ñ¢Â]ŠþiÄþ¬qÿjäžçBø_ÈõÅàsÖƒÅfƒHÈCëFy¤&€¹ãµ8`ÑÖÆhï’iŠà)OùÍiÐíAÒƒN<Š@)[§©¤h< b?3FGJ)ÀÁ :€¥'ŒÐ>ï4¼m Ò`ŒúÓÎ@éH£<÷¦!'^íåX$h`[‡â68ã¹Ï°Éü*Éæ«Ý•!cs¿GzOa­Èšf(‘GÌ„sì=Mp7?hø—¬ÿaiLÇE‰ñwt¿òòÀýиæjLjµKŸjmámÙ²vjWÑöõ‰ó?…{ïÂφ–¾Ò¡U‰T…ˆÕø{àK_ é‘F‘*•\t­OøâÃáÇ„oüA©Cyumkå¢ZiÖÍqss4’,PÃkË<’:"ŽXd’: ñÑ⟎ž*ðèРûGÂ멵 Íw0ɱwiÙîŽûHc(Éîä{ûVÞ‰ºI½‡S²‘læ‹Ëž 2¬I#nÓÙƒíX×Ò½„nîô .>ÍÞ&yß a×Ó€3FãH¥¤Ü[GàY,|@²­·ÚƒÛÀóC¼{ŸÒ­j—ªZióƒ!³H¾Ïj²¨#Rp8àõëQiqÇãOÌ·³Çm©YÌ+ÉÎÔ‘OÞBzg¡YÖn[-.Þ%ˆZÙÛ›xÞܲijgÔ“@–Úa1œc·^Õì_²C4_´WIã7Å3ž¹ŠA^Bí½ñɯWý–åþÐ~nwjF¹>á‡õ¤ö¹ÒÇên³ói³ gä?N•ŽÛ¾ë Ã"=^^>¨õ©µUÿ‰|ÙêPÿ*ƒàY>øÍêYSÝs±ãþú?g/‰ÒٞѴ—0ùzúær‹ÝäûsSMˆä\üÅNsœ{ÕvrÀ³ŽO9©žÆãä²}ÖŒãüGf¦6`»· àv®Îæ6 H]Àž1Ö¹¼:~qu<‹¤lw1Æß­2O”~"¯Ú~"[¤!!™Î%‡SÚ¸Ζ¶:±¶œO#^2…ÁsÎ{¯?­m|IÔ@°›Pw/¨_0GТŸ¸¹ö_˜ûšå~N"ÓoÃÄ2+³ăò„#Г’}…p;),Mý¤–ñ2Gqo ‘ˆD‘O 黡÷¨‘!´Ó£·¿„˾S*F­µ“¹Å3Ķ÷z~t,Ï*üåTì§Žü? ðdO¬x^õ4–Úê)›É”®N1†RðžÔTÝ1Ùîh^4}’x£Ò^ÑãR§•”:– ½ŒìjkÝ2Æù­æ–î;K¹‘|Ø¥_¾GÁ à÷§ý·PЮ Ó­·›k‹v”ÈGÉ#ç=N}j-sÃ7Z¬‰{WóÑ|Øš@')ÚU8ŽœÒЫ²r[Ý[Äv^T!•-ÊΘo,|Ù-×ozà.‘îu‰·Ä²0Sê3Åz¿‰#Kø´¡ ²\ø€cOó` ²".Ð2ÝrÊ;áyí^Uyjlo.-Ën0ÈÑ’:dSL™!¨IaŒqÍ~¦~Ï3y¿üÙçû.5ü‰Ò¿,Ó àƒÍ~¢~Ìî%ýž|sœX²þR¸§ÔÍnnj)»Kbç±óÄÏfêSpêr0qŸJíµ%ÿ‰T¼ËÁÎûµÈÇæÉ!f\‚˜®Z_½Núß } Û­Ì Ž òsUç¸Ú´­×4ë©Ò5’IæXbQ’Y°GROa^UâïŽf“tÖžƒûwR'b˃äíÝÏÓÜ×W©Ê“nÈô[»ˆíÓ͸•!ŠÃæcì:šñŸˆ4=F²±˜]Þ®U»d?í0È_ ÉúVW‰¾8‰í¼Cá[@’(†tÒî§²2(êæcÛ Àö®O|"ÔÝ ø—Er>õž¥êœÿuãRïªWk¥ÿ¯‘|·ª¥Ï:ø­ã Ï= Y®eHضÖjóœ`ûÖoØ®|m¤Úƒ{k Ü,Þds¹=Ò½E¾ |=»cý›ñYÒ˜ò«©i;”}Z9ò¦Åû?ܬôŸˆÞÕÀ?êuhý|è€ÿÇ©óù?ëï³}ûíùØ«á­;û+Lµƒz¬‘ ËnøæµòI%‰qÜ“YÚ‡ìùñQY›KÒ4JómÐõ&Ïà’gô®sSð'Å !}GÁúý¬`}öµ®>¸!ø­µëm,iS܉usù«,‹$ÎÕ •Ú¤s æ¶äƒ¦åÍïv!J\Ö¶‡ Ú-¬‡‚ø=¤MÆ#»ÊŸ¾I«&\€@ÁïÞš¥‹c<y®{³cÆJƒÃÈ .#þ†¼?áãù^3Ó®ñëòšöÏÆáÔ6õòÉÉë^à_ùôÀ{ÈGþ:iö%õ={OñO‡üXH†8ï 9s¦ÞÄBðy1¿T>àŠÎÕ~ xsPbÖ­ç‡'lbÛS€ÜAŸiSæþßZá>H`ñ’±èQ“Ò¾ž×ü«x_ÃÖï¡Ç]ŽFƒ¹B¼ª¸ÿi~uõúU(¹j–ÂNÚ\ùö€ZÒ±6úχ®£êu/#ý×E?¥:wp¡}KÄz5š¯! y.]¹çT/æÂ½q¬-›¡ëŒS•k‚!8È$f£Bõþ¿áÏ0?4ûsoš³ßÜ 7Iw9ظôUß9&¹?‰ ³ÆSç©+šúF‹ ê1^ñG ã;Œtùi’jøßÀ··zŒú…„mq™ Q™ȸ`;ƒÏN˜¯ ]7.õÌV½Æ¹wÛš×ñ»›OÝ8$FÃèc¶×î0u)<˦læ«î;H;â–W.äÓsÆ)7vZVV&´·72¢±Ç5µ«xjçDHÞIQÕúmÍ`Ç!Fjéoïä¼ÐìD„»!#$óM"% û ^O jªÇ*¬ŸÈÕm)ÀðN¶¿Än-Ïêj],çÃÏ_½÷ÕUÓIÿ„SXã6qÀäÕ1-‹×Kƒm"'æg'‰®]ß/šÑ¾“þ%V ž±Çü ²ÇZ–TWRþ¡r¯¨Ü8à3dcéZ:Нt+%¬Ì‹œ”ÏÊßQXrEužð•¶»§\Î÷†¢Î@9ëBot'z‡†¾(Øê‘¬WDZÜ0Çå'ë^KñcĘϔÀÛÌB·CÖµ[{¢©G[¢yº3Ét,ØÓíIœ¼+KñΧìÓÿ:çôB‰ìIéö´Ïýô+¡°ù|wªs‘ºoçB9KÐêPGñnÙ£#¦ãO¿?éRÿ¼i ÿC€cv©ê5²;Ï„c:µÉíåç^¼˜Ç¥x×ÂÛØlõi„Ò¤aãÀÞq“šödWQ´‚=»ÓÌOœxvp:Ÿzñ¿x¢ÜžË'_÷M{/ް|?0ë^1à¥ÄП,Ÿú§Ø;šú‰õ6¶ÔïF…Bø894È>'ëÜ8‚`?¼˜?¥gè ºÓXÿ®cùšÁ~äd .Ò%%s¾‹â­ÀÀšÂ6Ü2v1×a¡xuë12Ûùy8Án•â²õ]¾ZõO‡é·FŒú±¥v4ެ³ÖÉ=Esþ3›B¸b ®k¦A”VŽFÍ`;ИKcÏ>Þ$p:›wÇé^¢°º My7X®§|ËEŒØü©Ú^­}‡îåŽòe‘%Py$ tæšv=bRNp1Ïjh;Xg#ž•ä°xï[· Ï0ÓD´aø•©ÄàI ªEwÇ¥ ö¦òŽwVn“¨M¨ÚG9UR뤜 ½›…´JG³RгÆØoNp;}ECàqŸ ØžIÀãï_L[AZ6N8Éž“g†¬ò2l_˜Ó'©Ð"ðT޾´ÉrZ­«Zi¬©q)Œ°ì ÇÖ™µ§\*˜ï£ºp cº¸é@@pk†ñ™ÿIŒž¼õúWw„‘wG*H£º×ã2~Ø™÷þ”lD¶2dœ¨=k®ÑW÷`湆$·Ê+¯Ò>àëHQ7â Ž„f§<)=}êyzв¹\ÐzÐjÏOø9Ψú›–ëþ诽f°ËðÇLÿ®KÇâÕðwÁ„χõ ÜtÜŸ÷E}Ùû2\ÛÜ|1´ò.’àÄ|™#PCDÀžG|äÁÉ=Î…ð¿‘ëãŠCH8Qß4Œ€ Ó‡š Í(÷Æ(8 @A4`öäú ÍÑïc½7MÉq|$ÑýÖŸPrÒ˜XÓ¸¤ö¥? æ Ž/S±Å1¸¦ i[µ ê8¥lãÀ8Ïìw<Ôc&^eaÒLÙƒKM¨Íy¨2|ÐÀ‹$mŽRè‘‚[+¥:R«.X/ë»ì‡)(«³?Çþ ñ/Äß_ü9ðeÅ燬,|µñGŒcC–k$k"ÙXk¹#tf”e`GVæFP=Kþ°ðŸ‡ôÍJƒìº^™k•¤Ùü¸c@ˆ»˜–8U$’qÉ®{ágïøVþ¸¶¹Ö/THÑy ±ì«ZÕ#¥: ü_Wþ]—É„_Å-ØQEÊhQEQEQEQEQEQEQEQEQEQEQEbxâÂ-WÁ^ ²<Èntûˆd_UhØùüמy¾)h‚+u»kØv•~±ª–%”öàWô$i4mŠeaAê¯ççÆA¦ø÷E‰¤íã’&#iÞF:ƒÐÖ‘ | >Áu¤ê1©a"#·Y>»›Ðíê|Ôvvöå.ßLÒá wŠ#–Ûß;sVtû‰­õD‚åYRFŠ{sʸÎúxúÔvÖ±h÷3ÜZÜ5ä6‘¼ˆH— >¸Oµhrúh³kZÝYÜI˜Ú?6+‡9ò]yVú„z­ ôþ ðµëÅ%½ð¸ºd_,oŒä Á¿0z»ójÖ÷‘¨E¼ Q£@¾iS’§ê3øâ¨øz!¤è:Õ¶¯a"Ãu8ýÓ¬ýÛîÎÆ‚WFgoøL¼#;Ø[¬Vs %³€|²Æà=ªÖ£¶›£it04sÁkÆuÁ31åyì,úD–~–}ÉF`',Ø•A(ã·½:æÂ;/è¡î¾Ñwp’O),`Ý€¿^ çÚ…k•©”îÉúרþÍDGñ÷À€?¶mÿVÅy–Ò ÀÉõÍzGìë 㯀ðF·h1îd†fö?Võ!ÿù}”ã&§ð.É~xâ ˸j ÅsÈÞל}AüªD¡ÍŸî‘ŸÂ«ü8>gƒ~#D~îëGÇÖû-g=âoGfxµàÛpÊ«ž{õ¨&Œ>l0è=jÔùŽéÉ.pE&[kàâµ3±—4LЕÈÉns^7ûFêiž û:Þ_Ü-°*1Áå‡ä {Œç‚O$f¾uý¤/ZãžÓî·W’å”uQüÍR%£åŠ7Moâ#c!,mÑw÷ùØ,øT? ’m¨Îùø·Ê¡;ÿ{vúV_ŽoßZñ6¯¨;îiîdn½³Àü±ùWGðóF]CA¸¶[dÊ@uÿ–oœ«ß·¥'¸n΂æîIí%/rÊ‘Iq ÑÎã¹ϸõ­[ÅݪL“umÝ3L¬3ŒÿxâkOL…ÒÃM³{X ¶¦ÞiQk¢Ï¸³är:qŠ«¯øràØÁ&—™ä;µ²‘÷Æz‘ŒcÐÔ=Í]µ=üqÕÜi)U3€Ìsï—(Ã×o?ANx|bÏRxä—KhÕ£òаoÊÈØèsÎO]Õ‘á÷×4˜ÛQY­n"f:®ª…##8­+O xš[Ëø´{9®tý:Ñ.fd#.A‘½· ö-¤4¤ú•ÊxŽ/‡÷:–‘ö>p•Z{TyžDÀ%‚GÈJõë_3êVòÚ^ͼL®Cç®kÞ.üg¨x{B³¿‚Cqol<Ñcq+ìB[,ªEbKu“ë^q,·×Í)Þò¹b}ÉÍTn*›lEù—Ó5úkû*Ì_özð˜Á;a™)ä¯ÌõC ]Üg×Ò¿Jÿd›ˆæýž¼1µÃl(þÍö‰õú˜[S°Õä‰t›™e• &.òJÁU@Û’Ià­|åãoÚcÂÄÖzf¡kâ AI¸˜y(ÞïÑ¿à9®ãö‹ñ%Þ“ðûWÓn-#5+¥µT¹@ÂxYIrã«×Ö¾3ºð_‡. Ø?Å4XúlaŠÆ”y\Ÿsº£RQ]Ž“Äÿ5_ÊÏ}¨ ÎVÚÛeÅÒխ®fó¼„pdû3ì¯p­Ø‘XÏðÃÃŽ1 ½õœŸÞ¶¾?ÉÁþuXü80û'‰µ[i¡I@ü™•m+IYõ"PjK¡ÑøƒQ¾·w{“¶gÜ2H†?ÌÕd9þ.=+ ü!âkq›XÝáVòFO§;Hýi‹aã[p1a¦ßŸK{Ä "”cEEl‡R¤êÍÎKVt‹nÿIåôÉã¥së%ÓÞÔ“¾aŒÊ?5ª‰vVìîÞîɇQ<%qùÕ|È¿‘ÜÂ<¬ÉCþÉÅoøÅ^!°»‚ 3]¾Ó™ß c½xPÜÀ^qiñ E¹ÆÛä\ÿ{ŠÛÓÇ©_|YñÆ“y>ŸªêÃSh[cŨÃÚÿmäsY—^9ÓuœgÀ¾Ôr:®˜-Øû“Zäõ_6½¨Í} Œ<˜ùc$Ž©$ð:““UÄëô¬£â¹Ò¹¼å6¨Éòôס·}§ü-Õ”‹Ÿ†æÉˆåô^X°Ý8ªið»á5̱Íg}ã Êm߸»UaÏ1“ÍRóÏJPÁ€ç§j®Tº~f|Òïø'ù¢æ¿ð?JñdË=ŸÆä™°6kvøú”óV!ý—ütŒ‰âß ë@Œm­Gþì›Mh/ñïOŽ3,ŠŠ ;ªsÚWÚ×ÈRvq_èÌ+¿‚Ÿt%-ÿ¾¥}Œù–H.WXÉ®WRÕ¼uáé5]þÕ‡_>ÕÓùŠö}f×Tð>¨¶Éqâ$‘Œ.Ñí$d¯làñŸjÒÓþ3xÛMEâmEÐ lžc*ãÜ6A¥ Žkš2MzÁ.¥JnƒMyÿÀ>f×¼sy­Ø5¥Ìm'æ%j—†u/´Z^D·6·I Åpçqë_WÍñzÿRÕôO ëK›íº4›êʪ߭f\ß|<ÖAþÓø_£«7Y4Ë«‹fÏÓ{/éWÍ>ËúùòC£rÿ3É4‰¬¼5nñǶ…šVI•³ŸNMiZx§O‘É ®âóáçÁ}p~óLñ^‡/f¶¾†íèPãñ¬«ŸÙÏáÍé'Iø—¨XÑ5]”øR?ò¢ýâÿåÒÊkîkôkªZÝF»g½· ´&DÉ 8Îx¬i¿eCqþÄøáMMºªIzö® QGëTäý›>0Y#5†ššÔC‚úUü7CòG4^n¾Cå›ÚÏѢ犮c}ñC†ÝëÆþYØ\ëoöÙ&ŽEPmþÏ(Ëç©Ï±]w‰< ñ/Ãñ<ׄõË4#æ2ÙH£]¸®&›EÔ ¸Ki­§…Ã*¢š”Ò¹2…D½è³WHÓYswç)ÔäÍ}oâ?zÿ¼ÿö²štÖ`ÄÑb°hÖX>`xÀ _`øá5çŒþx‡Å¶žcIfscøùXÎgü—îúE|£ã}.3«Û›[hŒ¨®cˆªqƒéÐ×¾xÇ^(ðF‘m§é~"Ô¬mmÆ(nXF¼äáTd’zw5½'MK÷‹C9)ÛÝ*¬™ AŒ¹àŠS³gÜU"…!(ƒÐŠk0$ιúèmÐC.ævŽO­yŸÆ³ºÂÏ'æÜx¯IVPäcšóoƒ}…– ;XŠbg'àÏá­Z½·Ti–HT F ÿ:ô/x®çÅ·J©¦ÜÄþSy$´r‚?‰Onد%ÒŒgÂúÊd/ T'–äæ½3öoðõÏ‹üQmá»#þ•¨]( ìP¹g>Ê ŸÂª)ÊÉÚM¶oßøCÃú©-¨øjÝÜ’Ís¥LÖ’1>ª2ŸøådÍðÃÁ;ò¶^%ŒÊ›ØXcëöz÷_Ž¿ ÇÃ/ýšÕ$ü"âÁåÉ#h ,d÷!¾o£Šóò¤úÓ©MÓ—,–¥BwW‰ÉZø7Âv?ñááK›ù?箯zÒÇ÷c_Ï5jãH¸Ô/í®îü«h,Ól6¶ñªG‚N@ œœu®„8QÔ)ëj¥ÛF8'¯"£`ßsç¶írðކBkÓ<]àCâM·VìÝ‚9ŽÉW`O÷H óß>Õæ^!?ñ;»ã¼‰q;&~ԟζa’æÆ7MJÓ¼9ö|!ƒØÉËŸÅ ³½Ã3¼„bxïÅsÿ ¬¾ß­Ôr|£²Q•l18>Ç¥Q8&/ hOÝÎ*ïçN“˹‚Hv‘JÔŠÝëcÃ7i¨î (ÀäñÒ²0Ojr†ÝœžM ÛPjúgb]½køõ k$.@úQ‚u¯ìû{û:â×Oš_)'™6oîv†Ály{Ó¾!ýºÁs·ËP¹8ÅUî›%+4‹>'m¾$ÓXœÿ¢[œŸ÷k™¿m÷R7©Ít^9ã¾Ò§ÃØAƒîsÏŸZèZÜhžÍbkˆÄÇ–¾•^Ö¤»‡Šô]2 Y´æfI;‹dUO1¬ “ƒm/òªßyºU¬&L”-òúUÿãûaýí¥ÿÐkEº±‹»Z™šSmñ™óôß¼÷ÓÆºÄ¸Î֛ƹë5ûoúú_ý V¶´þWеœðwÈ0zõ‘R0.eó'v铚i—0¢ÿt“Ms–=)1À¨4H|r²A"»|B½ÒÅ)ûDøò>†²¼"ÚY¿)¨ tqµw¨”|gÒ,|?â]>ÃN¶6ë¤XÜyK’­$¶é$’ ú“ϸ¤ñ³bsÏü³?ʵÿhÈZ/èñ±ðö˜  8ÿuÅe6ÔÒ.6ä—ªýH<9fš~© – Gk6îHÍ`øÏ?lAׯô®M`ºî :~âý¹Ïô¸ÿé[3±“ÞýÑ]ŽŽ?t£ÐW! ùã?ìŠì4¶ Oë@âmÇ×äSÛ<Ó5 â¥a†8è)z¯Âÿ¾ Aÿ—–ÿÐE}eûÜLº€1òd·žV_V[¦U?€-ù×É¿N<'ëö—ÿÐE}]û4ÅëÅ„ßLý±ÿ¹g£:cÖý¦ÔæŒñH:tÅçµ#!O$RûR´´(7/ 9³<=¦C¥Y4Vöëi rRl„™ïÎOãZx?Z¯$ñ¥Ô0yˆ%`Ì"'æ*0 `YAúŠ-vh³Þ—ŠNô¸æ˜€óM=G4ãÒtÍóCt£§ãJÔЄ_Êž>þÔÕâžhsŒÓCgÿ¯KO¡ÏJk2ƬÌp=M1 ,¢%,ÇW%âß'‡í£aÚu+Ÿ–ÎÏ?y¿¼ÞŠ;šµâÛè:s_]åm–ÖË÷ç~Ê?©íRü%øi}âmY¼E®2òlmR>X—²(ì"Ò5¾ ü(ž[†Öµ‚×:Ëy’Ë ê} ¯¢--RÒ®'Å>5‹Àwú‡t½ó^ñ&¶'û •²ì‚4…TÉqs9aHU˜reP‘Èß-Qºø)iãií.þ$ÝÃã¹­%3ÛirÙ‹}ÚBt³,þcn·2NU·ü ÅkhÓVR¨ìžÝ[ô^½Úò½ƒ›¤Q㌠¯xÇNøðÿSÓ5_ÝK1Ö/mu y‡¬à’4¹•ãùÏÚs*Çl…|ÂYÆÈÙ[ºð'Ãß |1ðü:…tK= Kȳˆ'˜Á<ÉïI!TP]ÉfÀÉ5±§iÖš>Ÿkaak •¬K½­´b8¡@UDQ€ªÀ¬ÓDâ¡e×Í÷§o›޼ÒÜ(¢Šç,(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š­©êVÚ>u{2ÛYÚÄóÏ3œ,q¨,Ì}€×óýãë Ïøzö NÜ2ÉC¼®\€ Á8Í~žÿÁK¾:Ÿü4·ð1MOÄñ»^¼o†‚Á>ö}òû…qÞ¿|/r—¾<±žkUº‚)ƒ‹v}‚@:}3Œþ5¬U£vgR\ªÇ«ÙݤòG-Äl±xߌd©Ñ€ªÑÙK¢\:HåŽÁ®# ¤‰ÈéÛpì}jÔP¥Ë-úJ2ìIl¬GØwÁ¥gÚŬ5å•Ûi2O¢Äo©;° ¬rœçŒƒCUs+]w-G¦¬Z}áÓãu™cä–,Dc— ß;r~€Ö/„Z=N×U†öbw $Ë–ž?C’÷ö®“ÈŸM¶0ÌÒG©Žb¸p 3`öÈäU[tÔõ)/c»R.aIË´LIîpx÷Åk´^QiÖfY¡Wµ˜˜[Êù£8änϯP¥dø’É>Éi©6ß;¼K³ °`{cv@úèü?k>«,úl¶^b]Ÿ,[º•,ÃÃ#£Ö±©·ø×àFî5Ë"OOùlµÃdÿ:í> Iä|Xð\Œq·Z²?ù)½ŒZº?[µÍ¬ÃØôæ™ð… ºĘþR~Åk&Ö]À~æQÇ¿ËÁìj}E@Š`:`ŠgÁTfoˆYVÒí0? °•eSx›QÙž#uó]ŽNyQQˆ¼ÇVa€kvîÙãÀ‘ƒ×ƒT6îFI³[¶Th7uÈþuá>^xŸÅMö˜àÊòÛ#ø³kêßü/Ö¼fÈ֖ͱ8{™>XÀú÷ê85î¾øá¯ Í ÝÕºëŒ_r{¤¯ÝNG§\ò21Y¹ö4Œ^ìü½øOÿ÷ñ¿4kéïtH¢‚á%wº¼mª PB@,ìHÇÊÉ‘^;áï §…m¾Åæ¥ÖÒYfOºàô#ðÅ~õWàö“|Ÿj¹´žd‰C±ˆÈÁTrr2}j#w«7´mbê ÎOt:' c5,z|òЧž§ø¡`ÿʃ°dI§®å"®öC•q‘Ñi×*.­Ì"ËPŽ Œþ?J@äs“ôíR('§Oj ±Îøâ ž»P a8ÇÔW‹¸mÛA&½ËÆ&ÞëHžÁ%¯ž2VÃyx{ñ6]ò t`“ÀFOÌäsT»3 ½ Æ]Ì2q´c9¯¦>~ÕÚÃ_ƒv>±-¨x¤ËrÐÛVÞ&v% ß×hüÅ|³á]uBX¥K–-¯wá²}@«º„4ˆo<øu‘{%³ ¤qáˆ\œg<‘ФŒ¹OMð?Åèüa¦ëv>¹žûÄÆàϧß:‘IUÃFƒíš‚ßÀ¾ ´¿Iã…¢‚)‡úVñ‚3÷±œÑhÇSKÉèzÇÁÁÿ ËÄ/.§%¦­§I·Fàûjí¯ÓO·Öÿ³l/WRØ‹V…·¼Ê9ã¶=ªzìhŸvq²|-ÐK“gw­éàž<«´”(ÿ ?­Dßµ uÃÆ3†þíí—Ëù«·ò­Tñ]üBÒ<,·±é¦ùÄfêxË";d >ÄŒ~5Öjú%ö©Oc©ybò‡x³µýÆhr³²`’zØóÃá[8Ú¦‹© îîðÿ}ªÔeüoiþ·Ã_kQüvW 'èšëo5¸´ýBÊÍ"k›ËéDP[Åî݀ϩÀ­¶˜HÑÜZOgsÃÁr›Hö4îÅdöGKã{ëÿê¶#zKgÇ犒Ûâf3oé*•Åz2ß5Šñí£ü€sQÉ$:²ncm¨£u3ÃØÿ¾¥ Û©ÌŸÚê¾[IªGrQj^\£ æ¬&¡«”uaìÙ©o< _±ó|?§;±Éxb17þ8T~•œÿ |7ÀKmBÅFµÔÁÕ©.U²rníšIt‡½ ëG7^Ö4y ùŽ“­åÑe¿S\Ú\©'š‘eSŽk>Xöý?#Nyÿ3~ºþeùþü Õ7/ø«BnÂ÷M†å¶cÇ•sû-éw⿇çd&¥ Í›cº2¿­vv ¤?¯ü‘ª,¥ƒ» øÊUÏ9“ Çö®\7šÎœ”œ’º·õÖçEjNœa)8Ë™_m½mc)ÿdω¨Íýu¢kázfkVîÍô]áå\Ÿˆÿg¯Šš¼Ú¯€µµƒ:ÙÉ"ÿßKkЄ˜ÁÏÒµôÏkz´ÝfþÁ±ÁµºxÈÿ¾H­¯/æûÕÿÈä´ñû¿;žA¡kšÎ‹¶ZÙ¸Ó„æ5»¶`\áçÓ×âܰ {ïM¼þ׿¯ÇùKLj®5(Ç“©ÇÚ¨•Z©^üA´ÖÉþÛðG„µU ‚N’–ÌsßtiÞ^Oïÿ‚.XtºûŸù;mñ{N“h’&޵-~%hÓ“ûó¼+·¹Òþë ‹Ï‡ÙíÞMUš?©Û&ñTï~|Õ£Ýi¨x»Ãò“÷eK{ÄŽc4swñAËÚz¢f-¿Šô›‘y{ ⸋Z…½ænʲ>쀧5è~ÌÔrÚ'ÅküòÖtùí˜}J_Ö³nd¶N‘­økÄ 9×W‰X÷dÚߥÑì×È\’è×ßþgœx6ayá‹ë²K™b•ò•·œ|¹âµ¾èwZ}ýÕÌñOk„Võ' AEFÍ ’m· áž¯½'𠾏Q»ž¡Ž;S|Ïóé\æÇ3ñ¿â”»8ÇJóO ßOcáŸIm+Ã.Øq$g|Õé?¿…®¸ô5æz Ì<+­"ÛM ¹Ø‘É2§,áŠgiðÇUŸ^³½‹R™ï H»S–\ƒÐõ®êy­PÇûá$ Ìk4y÷VÄWœü k9¼Uk¦j«¦Ø^\F./%l1¼ÜzWÕ_´‡…n.twÂZžwk$)§ÜÚZL¬ñ˜ÓÊW¯(61ÇU\òk¢e8:ŒÝHÆJ=Ïm2Ôòøg׌O-%€B~»6Š·þ¥`4Ë D Ñì4ØR@}D› ƒïº¤.sǵ4¾¿±®ëc™™s¤>§tgÔï&Ô'ëæLÄäû“ɯ#ø–øŠP8qŠöò[¸5â?äfsœ µš=ßG·×ü?kÊ™c{hAˆ™YW ëï†#ñ®'UøY¨¬’¶˜é“ˆ™‚L> àôü«7Å׳A.–ÑÊñ‘c©¯aÐíRÓm\Æe”@®dÁ,Ü’H팒hÑ’®x6©¢j$æ-BÆæÆAü70²1ÍP ¤ýåüÅ}9Æ¡aKmFxƒ”fÊ}»Ó†·¬Á1–+›xåòÕ-cWû‚çõ¥bùÐ< â“ý•¢ÞÞÆÍ4p‘½!¯âk¥Ò|!wánæ¹m¥š8Iµ˜J™dɇ8Îy5ꚦ£­x„(Ôõ»ËÀ íY¦g ì7±®ôØ,¬ndQ™ d#$ñëM+-z!dH×m¿ëå?ô1Z~5†KOêe•€’fecѬÛ>Ù®O5$3Ÿ ‘ô¡yŽKM ¥Hvð+gØ6š¨#þXƒÿVðN}ksÃ'÷ Çü°úRÜÍì/‚ò.uLuû£ùUgdÑ%Œty?€«¾ $Oª׌½¾•²bÀ®yߟÐP¶ܪOåJÌY³M§nÃdT“DòÄCËÜ•Òi>7»°P’5@zþt‘ë±^xuíZ!‘ƒ×p®qˆÉ=ªÖ†.Ògªx–Ã×HŠÊñ(,½kx%Kø^ǰÚÙÇo˜×¢¿üJõ`s‰Ì×¾| Ò–oÚOÆi/îÂ{O 1H‚2«1À 1=±·9Æhnà¼Ï$ñÞR`¿ÄPà›ãµiâ ~ÃVÓnâÆãK³·$7+,¤R+/Uù—Œõê8­¯øQµvõty>×§A3ÅÓ2£Ê€­·#¨ôõ©þkþ)øA«ê7VþÑ5ÈnáMiâ-4_[­Ê ­ÛpçúÔIku¹p¶ª[?ëÈÏÑ®a¼Öu·‘'‹Ê‹'#;yÎøÛþ?cõ9¯@Õ¼W?¼Uªk-á©*Eö~…ŽÔ:‚ ª’H-ÔöÏa\rocÏ¡çòªWkR$’ØÊ„ñõû£¥v:N6/Oǽqð/ïbíòŠìt€<±Š®ÆÔkžØ©È#9ëQÄ ‘R°ä{b‘g«ü$¼%|}nœ²+ë/ØêÝÿ±|ͧÊû©=·ɸúàWÌ4{wIþʹκ½¾0Äž¬Øð¯Ð¯x MøuáËm'NO–4Y»ÈýY½bÇõÉ7­Ž•¢»:P(à BvãÖ—­# éJ9 Š8â ÅS{8$Ôãº6Ên≡Kœò±³düJ¡éü"®fŽh½€\ãŠ\óMÎiséL t4Ssך3NÏÆi‹šx¦ ^M8œS3Í8=©€n 'É5‡¯k–š]„×ײùVPòqË;vUÉ«¦¥ ´·¬0©yecÀQ^k¨êpjzv§ã‡±ðŽ…ÜÃl̪Îãï¦YT‘’Ê£“N1s’ŒwcÛVu¿¼¨|GñkúÄ&8G–‡•‚>Ãê{šô xãÄ_L´øu¤]èž”¼ñ¶µb`ó`hãþͶ—I#†'š?!|¦;gÈSK@ø%â_ˆñi-ñ*-3H𭬉x¾ÒÝ®–æP‘4cQº;VuŽQ)ò#ŒDXFYå Šúº_%Ò—à¿Íþ½¼ü—âÿËóô9ï xAðGÚßH°ò¯/6}³Q¹šK«ÛÍ™òüû™Y¥›`b«½Ûjü«€®†Š+–R”ÝäîÍRIYQR0¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÃñÖ¸þðGˆu˜ÈiÚuÅÚ’23LãùPŸ¿·×Äã?ø§_Þ%Š÷SmN*IÒÐì¹èÎïø¯Žtâ½ñ„r™"‰eI#²ozõÚÁÔcðµ‘$ýšÁ¦qݤ’Vf'ßkÍü§Ë6¿F¿0<=9®•Žz­JVGª¯™w"ÚÆT3fxW‘¼˜ƒü;ˆÉ'S¬® Öl¢†æ4ŒH¯ ’F„M–à‚sÎÓÐ;ç5©¦¡ðíÍüV1ù–·‘‹(ù¡‘€Ý¸ô àŽØ§aÇq+È6Aw*°Y±€¼Gr}^aìE¡%µ°ŠêP«å;dåÜ6mÇ=ûUë¨L‰mÙåX]â,[lCïmÎOì s6RKw9Òî­%„•¥=®¡¦À^dº‘!Õ0WqÆHÏSÀüih+Hô/‡ú¹âOh–¾³MWZ¼f–ÁÇ–ûwnÜÙ\+ä’:gµsô¿é~1¸±ñh…uK]­ ¶UTÄŠHÚH#?»]Ç‚µ|Öm¼I˜Ú&¯4E¼€>6P²€§ø±Œ7b=ëÎ>'øÖçÆzŒr]CqØ%¦’âo5äÏÝçÐæiAëtô4µ•šÔàäñšé~Ëö_ˆ™Á+©jüuâd¬n}Åox.3ÿ v†§)þo‚;~õjÞªÇ?söùAó‡ðå†)ŸÃI®øºÂ6 %ÖncŒ’$º^¹ãïÓñåÚ˜%ÓWq-Ú¹O׺‡ÅKk±nö‘ìžÕ›÷ðg8é¿iÇøÖU:Q½™™£x Xñž³$VŒc²IÜsÕn‡ßÐöïü Ñ´Iµ0ºµßRޏ…Omþ,òx ýÚô›{x­bX ‰!‰z$jG~‚¤¤äÙ¢ŠZŒŠ$‚$Ž4Xã@QFÐØS袤°¯Àßè:—†¡5­ü’2ÝPwdÔsG õ[èaxƒCÕ Ön%Kk«„y·Åt‘1VÉÊœJêžëÃöZòÉ}5Ä:³*‰ÚƒàgËS{x€’K¨÷a;Tõš©âíkKNÔô$ºU{p¶ÿaVÝnG™^Ÿ×55þ™£êöÚmαªÍ¤êû°‰¨û¬Ã ƒŠ‡Ä>)Ô<-ž£]¼0$"S:Œ Ëܵ1µ}#L¸ñEÝÕ–¬ŒþT°¨i¶È.py hx£â&§£¢_iO­ÂÒ^êõ‹¼66?|ãÞ¹ýWJÔþ!XZk‘}¢ñTÁuð¿2Ÿ¼¹<ç5bÚkohVvÚö›£tó4Ég1ÿR½:ƒßÒ•Á£CS’ïâD©ªXÅ›¨X\aUeòâ†RŒÝ8â»ÿˆu+ù´Ëí{Lµ´Ô’¬ž`u\o—9Æy$ ã5å7Õ¢Ôt=>ïKµNÓZV2ZÜG/ÎIíÓš4k[}{ÃÓ&§¨,­§Só&H,>dÛž}h²ù…ßFu_üKiâ]<ÉákÙï-,§Y%ó­ü¹0~éd¸¯&½#UøàÝoÃvµ§[C¥_EnŸÚÖð@ÑÆ²ã¡ÉÉ{ñ뿱|:ÓåÔ<7©I¨Mtâ»hÂyX €O5Zß[Õ¾$h·–3Ÿ?Q·ež…ó”pTûŒäR²oQ¦ÖÌôÿˆº½Ï†¼,/-£îbŽX^9Qö£ôc´§Øà‚yÔiÞ††úŒluYï­5ò§·ºUÝo:ñ"†pB x~‘áKÁ¢öïÄQmÒžÔ«[4¡üâÄaF5-¦±§I£j‘ø~ »+Ñneò&¹2(LüÅ÷€¡«­{=Qêzާm¤Y\ÝÈëå@›É¬ø~cZ𥟉¿³âm亭Ä3«ìppUתœúûz׎øwÇzLj-4ï ^˜î´H£x‘DJ4 ’Åñ“ƒÏ&»/x¯SðG…5mÏ[ÓµW7’ÀˆMÀu\” ý&½ÐRW÷ŽÕ’£iê ¬ë]kNy„vó”“q@S*7 õÆèŸôÍCB6:µäzÌ÷c¼ŠUñÄÜ(òöçpäîÝøWCð_ÆÒü?ÑüOá?é7º†Ÿ¨0’ÆXíÄ‹Æv–ÜHÚ¬ Ž…E 8¡ÆI¿#¡–Y壒g™0>I˜¸ú6Eg^xgGÔûV‹¦]×ý þi´Òh"ÓuÈõpº¥•›i¬Ë»›Ë{‚s‘ÇÍŒs’:Œf¨ü›EñÄ@ñŒ²éòMɧ]Çw䤤Ÿ”†NF{zM5«’{2 þx^w/ý’ödôûì±ôµS? ìU‰³Öõ» ~è-Ê?0¤×Yqyge%¬·‘ˆBXëž^k€ñ—Å ëŸ`³†)Ò <ß3<“ÏéT®&×Räž ×mN-ËÞ‹°\¶8©5?Z)7^¿*½^Û/þ;šªß--[mí­íƒ×ìŸÎ½#¸óo5´ˆpÑËÔûƒ‚*Ó^ÜFŒZîELcç”à~ÒRkãýï]üY=˜àּݴÃ1\Äàú85¯w£išš>¦^ç«IiOâÖ±®¾xfìähÉj}lç–/ý˜ÒüƒæZ[åaÔ¡§ ¥5‘7Âí.6ÏRÖl¢\,À~Aýj/ø@µˆ3öOôKëüзò£FŸ…µ¨ô­nÖæIš(U±)P²w\zôüj•þ¢u Ë‹™Q¥rå#Urs€W(úŒìñ±ômMOM—úáÂÔR\ø¦ÌqáK¹TËK'YÔý6“QÉnn¦ÞÖ~ÏÙt½Î§ÏÎÌÔ‹9#¯á\<ž9‚Ë?n±Ô4ãÐý¢Õ”~¢­ZøûG¹#f¡>ŒqZ$ú¶–ç{aâGK”Igsk"Ÿ•ᙯâ tö¼qi”|E{wÿ–WŽ.òpEy…¾¹ipK˜Ÿ?ÝqWEâ°È ƒÞ›¾Ä®[èz ߆£]_¾ÖCu7Z[Y¬ÚUüöäû€ÅÇJä„àä×UâoZk^Ѭ¢³Y.ÒxbƒÎNrW<€{žkš§»(¨Â÷ßÈ¡7*4´]Ì˯…ŸõaˆŠ¼?)¤†õüBǹý›¼!x¤èÿbûE«é“AÆ=âæ†`Iæ7Áæµå]??ó9®úÙü—èd_~Ê>&ºùt¯øg\@pZ´q1ÿ€Ë´Õ{_€ÿ<*’‰|#©ê¢å>Ä|ø¾¹Œž>†·Ìøèsè Y³Õîì›Ìµ»šÙÇ!¢‘þ†šO£þ¿}Ö¾ºÿðO0Õõ蕾ðõÞ˜ËVxdúª–ÿo­p%¶Q_@Úü\ñ…œB!â+ù¢>]ÄÆd>Û_"¬ÁãëývGŽûÃZˆ[næ["åWœîU¾§4sIn×åþcPŒ’wò×ü‡âÜRcÍ·Ûô=kJ‰šdì7#¢žÃרOÿ ïXÏöŸÃM:=dÒïg¶oÈ–¥dÜü/øAª¶/èDõhç†íGÑX!ýió?åû™<«¤¾õþW<ëž-±Õtíí˼À\W7àiešÒûMYâŠud )À$œ0'èz÷ì÷á À:7Ä&€“Äz®™$GíqY’~Ëšë¹—Iñ7†õb§šŠÀçð—m>eÙ‹‘÷OçoÎÇ?á/Ýè·7R\ˆÙ›7‰÷ w®µn. È'©ª·~*èQ7Ùü=幄¶Ÿé\z†F"¸}Nh34zŽ•}fêpV{w\ÄRæ…þ!òÍ/„ô¨oÑÁÖ¦Yz|בÅã˸r$¹ZÓ·ø’p¢‘îHÅ_/fgÍmÑéÞn{vï^)ñ."Þ(p.  ×gÄx'P x?ì°5Ãø¶åõ}M¯ "ŽŠN-\wŒ4û•6-qhÐ,véo»z°f^§ ×Ô_²¼áËkûÿÍ"\ËØ­ãkW–/%—î+Ÿ¼>\c¡>µóëÛ§Œ´‹_+R‚'29Ϙ:œŽ‚»]É4ë xD&4v “[SŸ²š®C:彎«Ä:f•â-BÏJ»–‹ÄY](e/ Lä¹AÚr:­eº;þíÙÆOlBÅzgžç¥g7ÌÛµb¬†9ÚsÓ5C\b4»Œñ„8…^ s‘œúÕmMDÚ}ŸùæÃô©‡Ú±:Ý»ùøOýVÞ·téñá·°ÿL\à㸬›+g›ÄÅ ÿhã89ëøV—ˆ£ Ôíu=Bkï4¹R>`y÷ ÿw¡ôb¼¿ûtRPâbÇýhdœ~µÑø5¿â™Óóž†àF´ìcb¿ˆõ«› ñ ˆ×nâȦx›T×~ê±éšÍœvú ‰&–äûŠà4d2’TƒíÒ¨xÒ@“’yýÙþUÒ~Ô1y_.Y%3Eqc§L¤ö&Ö @öÈÏãY¹5$‹QN.]nE£ø‚ãUV×Mm$KÅ#2{ýk•ñ¯ü~CÏcý+ª·ñN¶½"øè®WÆË‹è¾‡úV†} Èd?ÝÙi ”öö®:Ùq,yþè5ÙiêÇ⇰D܃îæ¬''·aÚ«@Ä(ó«*xaïÉ&‡×?°FŽ—úÍåã®FŸ²®îÎûc£5}¸NÓï_!ÿÁ>`ÿ‰'‹%#.$‰ö%ÉÿÐE}vp£žO­r=Í¥ÐF$ÆsN<Ò?pã‰Býhã4i3@ ž‚ƒÅ­!¦„(<Ó†*0rÔìòE4¸¨óÁ§ô¤ÿ`"õëOÍF>Ô@€ÅQ¿ºÜ’uHÑKI#©'ÒytA1G’ç®+ƒ»’ëâ^­ý¤–$NåÂËËŽ¨÷üè).¦&»â‹Og6§w%Ÿ…c¼ŠÖÙR %›Rº‘¶Æ±Ã³ÈÄýÔU'¶0=“à× Çâ_è>&Ñ•õ{=GDÒ5]bx0Cmg$M-”&au¯²EÜ7xŸ´=3Ç¿N·£ÝÛßø?ÀðýŽÂêÆåd·½Õî! <ªÑLUÖ iR!¾?½u>R¾™®é7†\±ÒmkåÖËð¿Ý¡ {M^ߘQEÀnQEQEQEQEQEQEQEQEQEQEQEQEQEQEÏ|CðÜÞ1ð‰´ iRÞãUÓ.¬c–LíF–&@ÇàÍt4P5¡ùð‹þ ·âsãFñGJ„x&ÂܼРøÙ¯\å9e\ļ “\OíOûCû _øD|>à0{¤ÍĨpr‘õä‚ØÖ¿B¾ ~Í>øb«áí&7ÔŠâMZíD—-Æ 9<.:óœT9ßHRKâdÉðÎiwkyvö2\FB‹; œ†Á$sÆ1È žEuøy¢ø!Y´øîÞ1——^WQÎ3ÑFy!@óŠé¨¨zêÇʬ‚Š( aEP^ûp.ÿÙ_ÇÃþ ?•ÌF½Î¼SöÑÍý—~!¸°VãÚT?ÒšÜkVÆ9Þǰ4ÓµÏ {ÒJÄHFG^Õ쌃]çw¸L‚9ÕÀÇðÔ‘C5¬‰'12ÀôÇz•òOp@ªšŒnÓî-·óP®åìH =Óô Þÿí:}ü׳[«H¶²Æbb:â¢Ñ¼o{t-/îd’Òà˜™{ nLÔg…5]/Y·šh¼1>æ¸uïÜV†“©èW:¶-´ÓozYŒ34„¡|eIõ¦¼Œß˜íÁÚ¶…¨»¿–¶§ƒp’«aAÎH#L±×t[ÝtmÓ"·¤>]ғݘ¯NMdxsQ½ƒÄ'xiäf)$,x$œEmCà1µr Ö¡}²–6{ÎÐsŒÐµØ;ô9Û ¯lüE’\^¬ßwŸÞ6ìøó]$žÑnuó:²¤æšÉ£ïœ•VÍCgñéuP“$bÈÉ´‚ƒz.qœúŠ¥qàvÛV2Ci4°³⌦ á‰íFAyŸâF©oª²3‘c›~ÌÃî¨8#ëUµ?kêÜY[=Ť²oŽpêH È$g#­[ËÏ ]ë¦;›)~Õæ€÷qJB;ç’W¦3\ö·­ê–>&¹s4ϼFŒvàtô#?0^GC«ê¾“Sû=ö˜n®"Ú“_Ç!RìÏø¾öòÛÅS–”Ç´©ƒËl/)Ø­ýOÀðjš‰ºƒU³±šà,¦Æã!a–ŒŽ¹àѪxîMôiZ[ÜØÙ…ˆ‹¨ƒ1 `œš?üDÕü1i«Ëo}>­—©\Â’Ikqù›{ ñŸ¥?Vñ}ÿ„®bÑìJ KdUo57 Œ–ÁíÏâ½RÔ56Õ­-®o´û”YD±F]ccaÇLZšªè o¦Áâ1xºšÛ¨ym«ü!'£ÐZér‡‰4]GÄWvú¾›k5ì3Ä»Ò!“ ãÓÒ¬]ˤiúF™gâ)îîÕK(†C!?uª§‹µiô›Ë m:Y!Ó£¶F·hØ4¬}NjÅÆ7Ž4Ý?Tv¶—ÅLý­Ê vžº<]v¶vZ8ÒYáÒ^&xŽã»~pÁ¨â¬Á£xfÚ{Ëøl®-¥h#º¹'lë×nzäõjóSÿ„I´Ò§´³Õ.eÍÄ«p¢HÌn¢¨ø™åñ>¦Þé¶~U¼%á–ÊÒ2DRuÝ€:G¨í¯™ ×Sü8Ñ­aŽ[kÛ«ÙK™ToˆF¼pO~jÏŒà—ÅZz®”©s=«‰&·³ CxêF*Ž™k§OàÔ^k‹[U¸Ù¢_Þ†ÇÏ€{TÞ!·_xz?ìIîís2ò@Ed'zÐ%r‡mÃIÕOˆ­n!Òäd_$©ŽV”t)‘éÞ¥–ãJÓ¼-¨Üøe®„­"Gp× ûÈç¦Lãšm”·ß4›­:[6öÑ–âÞyßj~R¬ÝãV4­ëáí…ýþ±´ñJ‚­VU–9É?ÅŒð1ÐÑÔ:Þ»ºñ\WÚ%õÓÉÑy±Ï3!tä1ö=+SJðŒ¾’mrîúÎòÞÚ&òÅ”Å÷¹à+4ÄÕ,õïjÐhúE¶“©ybF[ROŸ?:€Ox¬o‡Ñ½Ö­ug*·ö|¶Î/sÀHÀÈo¨8Å»‡¦ÇK¥øêçÅ–Sé"ÒÓO• d¶–Ýá±÷zgž•Ëx:ÏS‡Å6 [ÉV"C2_/à“Û®ƒDÒt].K«ý+X}^KXZu³0l}À}î¼ãØU Çú–¥} †£vóÙÞñÊàLŠ?½üÍíÃÁê>Uœ—sê))x’V7#$(ã§§5Ïiþ>Ö«$²ÜÊËæî{F?)\ò˜¢ÇῈ4ýfÝ͹ŠÚ9CÔu*ªwŽC[øƒÂº‡‰ ¾²_´d^¤‡k6xf\ã¡y]—?ïõ »™-/láƒw™Í6ÙvžpWÔg§|Rkž4Ñ­5?±ÜèvÚ¸¶ ÞHH•Ê€ ÈëŒW¯_êVž(¼y¦t¾IÉ;òsÆ=F1]nµàË[PYßY¶Ò¯®[)ÐüŽ@ÏÌsÛ½5®…}^á—Ç+u;ï²VKi:/”Gðé[~+Ò4MJòÒ{ÝU´Û¹avÃæoQБ‘ŠÉÖ«â ¨5­2ÚâîâŸ,baÃ/°ïUæÅfôGJ„zMOW»ñî³gâ ZK§^i—A£´î0•!Ы±°V\SiZ&‘¤Câ[)¯®w;Ç m¯dôÇk~"øAuâ+=cFÕÔFÉ5Ú£BA!eÛÉÈRAçJ_üEð­åÖ³o¬ëènàYyvfxîíÌç,Ûe]Xè[Z[Ý6¢bfÿ–FSŒ} ª7úu¦ Aº°±¼ã¬ö‘9?ŽÜþµÎü6ñîàï‹·/⸬ï¼3ªÀPÉwn&H×£uÈ8Á8ìk¸Š{={ÅÿÙ^ˆßË|$žÊÚÙNL@dí –·üõ8»¯øvîL6…o uÿD’XOèØý*&ø_£ÖûZÓ08Ùt³ ýAýk7⧉5_ ø‚ÛK‰eÓîŸ8È¿0 ࡦ;×UáJ[ë$ûK‡ŸhÍVÛ ÷vfü>Õ-Iû‹]‡d¾±þªÇùR`xÆÑö¤ú&¨:·&ÿÈGë]‰üKká=,ÝN»‰`¨ƒ‚ÇÚ›áoÅâ‹y»ÛÆ’yd¹Ï8Ïõ§w¸´ÚÇ6çÅ–ÌVo ÝNñÙJ“Ãi5Fo¥–Eþ›¨éäp~ÑlÊâEzP·6Žr}>µ$ŒÞBËÕÏÙå#o`’éØÒæ»goãÝ耷è§ý¾+^ß\³¹Åu™ôa]Mí•® ]ØY][‹H¤8ú•Íc^|=ðÝÞàÚ œŽÑ¥…ÓÒÂÞcVà‘í]ƒ•Ç7à 6m/u8ùåv²þŒ£ùÕy¼ ªÚ“ö/ÊòÞÙgõV?ʳœ#R.Ù›Q«R…ER›Õõ軽¸¸ åù²4›}2sÖ /Ö¹·Ò¼ajáR}Q_Q1„ÿãà Cyâ›Cûÿ Ï:ã%ì¤Y‡þ:M\RŠIÊRœœžìèËg8¦´„m'$ãŽzW(þ=‚ÔâûO¿° óçÛ²ùбoã­äá/£ön*­}‰½·:«]ZêÒMÐÜM / ÆåHü«¤°ø¥â»Ù¿}$}sÊeLºÙÁC«XÜÅsýsWVue·Ú‡}…î³Ð®¼W«ÝÚ4úÇ…ômVÕHÒÞh±r¤õP@$sX¯€5uo·ü9ÓãcœÉ¦^MlÃè 8ý*ý§Ä v1M+Áo$1²¾CîYÏeÿv¹ 95ÉKžN^Ò v=B¥ÁШÝÖ©ôe›¿†ß µ%Sx£Cs÷‚K Ú¦B¡?ìÿá;£'â0‡wDÕtÉb÷Ô{ÅK»>ŸzBüzWG*[~æpݽí÷"Œ³¾¿e)}+[ð·ˆC6.¡mÿ|ÌÕmOáÅ‹(sÿt³Â8é¶ë"= DƒZåŽ1ÛÒ¬Ûj·–O¾ © n¢©ý =VÏòÿ€M£Ö?ŸüË.ï%;`Iä°s•5ro‹«Y#[dfe8Ù(#ùעπµ\ý·áýœÿ—}5¹Ïü¸ýe\|9øa©7Éÿ ˆÇ?uá»Uüö|Ϭ#>UÒ_ü žë6—¨Åy 1°—xÇךì5*/ÜGs§@2Dàä/Ívð'÷¨³~ C v-JÂhOÓ+¼Qoð;Åzs¤jžÖŸª”¼€¸ú,¸4]vaÊû§óO+°öô«þ`-s\æ½ðçâ…¢¯|/q4xæk;}Éÿ}GÅq÷Þ Ñ¤1ÝÙ_ٸꮌ?B)©G¸ùgü§¨–*{¯~i<Â3é^_Žî£8yœúi•hÃãé274õÊfª×Ù‘ÍmÑØëª$Ònº`ÆF+Çü'ÿð‘BÐ"Èðî“k62=ÿî/<_%ý‹Å²32 H®'L“û \·–ä:&ìH@ÇÊzÒjÀ¤ì'Ùî4y^XöL$Þœç>Ÿ}¯àoˆ nþ¿‚5'Ô,¯.áónoËx[Ω*•$áP8詯““HŠûT·»:¬(„rGaÖ»=¼·â@qÜè£YГi_Ô™GZåõÝ·çp;zRÐñëK‘ƒü鯔Èäzç5sgæÉ5‘â‰1¢]1çj÷­äüë+Ę“Gºø—µLóÿ0YõLŽ~Å&§J<0‹Z硌÷úT^‚y_P0Ëy>YW$gqíǵ%´¶Üq²"¤/ó¥ØosÙ.t9—IµÔç³o±ÝHðÃpË€îK(> 2þu›ÝËAs5¹Çü³Š÷wâw€ýÆ1ÅLÒ·ZHÐûŸþ ì?â“ñiõº‡‘ÿm+ë3ï_(ÿÁ>üQž*<ô¨:}$¯«øÅr=Ù«è'ò§t÷ö¦çš\Ô‹aGOzCF{Q‘š`.i çŠCIŒf˜„ï§ŠAÔ÷¥É â˜O^Ôî½i¤à`!8U[«ß) ƒógëÛÁoûg€=+†ñ>»u-âhZ9߬Üs4ÉȵCßýò:zuô iu®jw~'ÔO†tVo1›÷‘Ÿõcþy)þñî{t®Ú/…¶²øÀž¹Òlo¼?¨%Öµ­C}ÊÜ[ÙPØwfêæÒC–PVVÞ®TɦxNóწ£ðý…–£ãbåtý"ßS‘ã·’å‘äw™Ô²8bžf”S½Ôaøqð«Høhº¼ö“ÞjÚÞ³tnõMsUt’öõÆDaÙUcNÈãETE(%‰ê¥jKÚ·®¶õïåmÓî­ÞÓ/yòýÿäuZvi£éö¶°ÙXÚİ[ÚÛF#ŠÔTE  *ÍW&ú³`¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¬ë­áoëšÒÂn[N±žðB “!Ž6} NqŠØ¢£òƒà/À_|uø‹¥Z_Û^èÞÓe7:¾£4bMÌ£WèÒ7ŒíÉ$q_£šçìõð×ÄXûo‚tbqŒÛÚ¬ómz·øŠæ³¼t>~×a„ÚÔ…âÒ¯t¢{Y^¾?ò&úàuÏø&ï„î¦fÒ|Sªiщu w~#fkëú(°ý¤ºŸŸž,ÿ‚gx‚òÊê×Iñžœë(Ú²ÜÃ$zü»ðk蟀±ÿƒþ h¶soˆ|IcÍÔ®“r«wòçhç©Éã\Ý $y_„EÜqí]X˜F^Xí§ägå³Âr[ê~‘&æs¹d,y$õ®vÏÀ^Eè¹[ø§´÷ºÆðœzÆ+°Ñg}E–æ5†mÛLq€W®}j¯ƒMÅŽ—-µõ»Æé#(vS†÷ϧ½sÚy¼9xРù;Žv©¬Êu4»ËHŠimØâŒq ó)ÿѹÒluíJ»Õ5!¤ê3´±ïF§åcÈ ûѪk·~‚ÏLÒ®w+ÇçKpRmÇ··Øm4ÝWÂÚsëw²Ø4nék2&òñûƒÛ9§Þj²xI±‹B½iåÚw¾v—Ç}°;Um^ÚÿÇZ}®£i\\C˜. ˆõ ¾zT¶‰k xr;_éòÜ,— ñZo1É-‘ÐJþaÓÈ–vÔ¾%hɘéVì,ÓÅ~šÞòílÖÙÖXone<=ði‚ò"Ôµ ¿^Ðéè“¡½ˆÈ]Šã À“÷sT¼×4ý_O¾œÇ§yK1¹o˜@àðGמ+VÒÓþÆ•w©Cyk©ÜÝ‚ƒ/ޤ°#¯±¦ÝxïB¿°KH!Ô”¬ê¶q7 :©r{ÒM'Jµðe¥ö»e«C«M~\gR Lǘ”ý?Å÷Þ1¶¸ÑïfA%ì +G;XŽ â³<¦]iwz™ÕmeµÓE« ´ S÷@Ï|Õí'ûÚ BóÃÆöMFÚÝž8/;GFuÀ P¼­uàý]е¨_R±¸Óí Gye0ž^F{æ§Ð$ð´ÚÔo¥Ù\Á©€ïl³Í˜ðqÇcéX¾ñ%þ£ª¦•yqq{e~­nñ3nÆG >kGJøu}¥jð^Ï}g%£ùÏ%´û¤Ú¼ýÜdg4tîúþñݾ·“5ÌÓ¼Å^&Cäà©Sõ®ˆü3 ¬Ê¶zͶi>{rÇÏ3¸Æ Þ™aãí?Qño6‰ao#ÊDWѦ%Bs†'¿Zåf‹TÓ5¹"d—í¿hùdÚ~vÏù¡¿æaèŽÁþ!¬Ú¬°‹m9¬ "}²È@ãpl+œñv©6³yt–÷7¶— æÇr‘3+)är8Î+¡Õ¼?á[ývA>±5†¡#©–ˆ4;Î2u9õ¬ÍsÇZÖ‰®Oic<–6ö¤B–üchõúÿZoÏ@[÷4ï´÷ìpëR^¦¶¶Éç=ÇzU_ë—^Õm¬ld’­T@á±¼°ÿX}óQk^Õÿ¼A/Ÿ»ý+°½ð.ªê—>·›u6$EA1¹ œúÓì¾$E¨j‰4h.mÒQåʶÊò¢ç†-Ôâ¼]¥_Ûë÷o:K8y<Èî +ƒIí¨Ek¡Óêž>¾ðñÒtÁ´³A[ˆÃù„u'5§a¬ø¯R²Ö´˜¦–;ˆ”7•À׆Löö©µ+@»–Ðkw×Z¸µCpmÕY3ޤâÆ3T¼S­Ýøb{M;G¸{[`WŠXÿå¸nKŸ^iê3Jê;km"Ú‹©îõºÆøš5àÄöÈþTž6¿“JðæŸ—-ÊÚLä¼Ò·ï…$c޵^}+QñΕ¦jÖáf¿ƒ0Î$&ð9 ã=Emëú¬>Ðà‡XÓ"¸šVm$`Ãøò>´ N»ׇ¾×ãûLº¹/5©[˜.níCЫ7`Ev:£{ðçÁZ¤kkqló$ÑÉ ›˜È8UàýÞ{×)ªjöº¯‚îäѬ—LòçCy 1bËŽzfŸàÔm_J¼°»ù4ljšIXªaŒ6}±G¨zzw¯¼W¦ßXyIku,E,g«ž‹Ï¯5Ðx?ã³74ÿ^é¦ê;i6[\°!ãPrý9çÒ¹/Ã~³—VƒS]NâûBÄ"*Í´ü¬9è æ²tOˆº…íôpê#[NLlê€2g€AöÈ¢Éî­N±ñÞ‘utlcºÿJV(AúÒðóÇžÕÄv%–m7RŽléónmŠ Tß8<ç9ö¯%ƒÁ!Óoe a4ƒ~Ô˜tÆx|úw­}cRð¢ëEm<—h'º…†Ç`'iÏæ)µ%aÞQw=bÆñ.¡Y<ÅpßuÇô§hRøÖßÃ6óÅ åÄOæÎNÕ2ŽçœW†xÃZ»·ñ)U–Kkh#Ql°¹ S)â´áÓõXéZݽü:~¦Šai.$1ù»Nñ‘øT¸«i¸)=ÏbÔl§Òu ‹¤ <-µ€<qTç’+xÌ’•€§Ôž¯;Õ|[ªxCM€_\E©j—$¹rÅÕPp=ë?Pñ†¡âÍ\[ƒmy§Ü$Ïœ®~Vø"’V•ú±9¼² ¿i¶n¾T»—÷MgÏik©'ú^ev鵤múíÍR›ã§ã˜¡—Z³Š±ˆ´·a6îzŸJ¤¾9Ónô룧±šî(šU€‚€=èI½Ç̓гsà]®_CŠ'ïÙË$D b?J¨ß 4´æÓRÖ,`“¬ËŸøεü'ãÿ ꡊëͲñL ï™f;‰g@éÅk[²23ƒI&†Úg"þÖ­Ák?¤ª:%õ™þ*MDÚ'ŒíŽ4Izæ+Ÿ,ŸÁÂÒjßí´½fK%¶{„ŒíyÀ縻?P‹RµIá'Ë•r çÒ­ß¹7]ĵ߉¬Á7^¾e^²[beü×5_þ«q‹è/4÷¥Ì ¿ÌW££G Ä0’|ù_Ë–vë€z³qq=¼†’EqÆÉ2qøW´º<âÛÆZ=ßú½Bÿ´qZQßÛÍÌwÉÇð°5½w¡éz†Ö“§]vÝ%¢?¬«Ÿ†þœø“5³gïÙ]IHý(¸|É´ÛöÓï-î£'|R+§ÁÎ3WüI¯·ˆn`Õ•ã‹Ëmí»?;0çÐð®i¾X&M®·¬Øcî‚é2þ»MBÞ×-ú/Šíä_îßZ:ÍwVnrSkTl«T7M=©¸þ4c'Ðb±ÛHñ¥ ÊÁ¤êkŒÿ£Þ*±GÚJ…õ?XÂ%¼ðž¥]|Èb2/æ3èkM uìoîàv÷£8äv®[þ›¹[‹7=§ˆ¯ó«¶¾.Ò®ˆòï¡$öfÅRW}ΖÏU½Óäßmu4AÊœþÑi¾7ñÔr­¾¥}K½Òc碎™!²=+‰†þ €1ÌŽ÷XÙеã£Érræ)àh]c}§žÿQÚ³¨æ¢ùufÔ#JU¨ìº´ljþ'¸7¿áî`äºÒÒüÓi¬KËoji‹¯ÃlÝ|Í6úX¿FÜ*ÏŠõ»}jþ)-„‰kB(£” È2O''qÉ'>ý« ˜ŒäÔS÷¢œãf]uTq¥6ãÐ.~|:Ô\´>!ÑP®‘]¯æ £/Á]5Îí3Ç–‹Âê6ÓBsé~µ|9â—vsÜÕªK¡Ï~úü¿È¡oð£ÆºndÒnô ]€á ¹¶‘È>͆‹­ø+âi/ü)x«že·¶m§èS"º}ƒvp28«VÚåÝkwqnqÝJËü=z?ëð*{¯ëñ<¨ëšžžÛ. ½µ#³çÿf<^9˜`5ÓÛX³úŠö«/x¢ê2RêãQ…HW­ÈðÞ^•FûU´ºg‹Uð®‡u08böfë^i)ÝÚèn£Íf—õèyŒ>5iïÛIÿ)üé×úô×öRC fqŒ¬€Ò»[À·ã÷Þ¸±cÕôýE€üÕ¿gMðÃÀ×lßgÖu­-ÈV{XçP~ªÀþ•\Ϫ#—ûß™æzÑèÚœ±Ý³B’ÆP¹u»ßÒ4›UÔ~×ý§Ë#“ëÖ¶î~(E};ÆZmÉéå] mØßk·õ§Û|<ñ¾š¾ni¥j[†<Ëg·™Èô뺋«Xi;ô/Û²…pÀZ|½pµÉkZ'Œ4·s©xfò؃ó2Û:ùqXÇÄSÚL—–ÍèOøŠIÇk‡¾µq=ÔúS‘Nq\4^/lcígé,_àjõ·‹œ$¶“Ø9SúÕ[°¹»£gÅüè7úRø8gÃ:xÿ¦dÿãÆ±u}rmGO–Ý-ò\cr¸aúV÷„âht+(Ûï"ƒÛ“IŽ-6I{£ÙßîûM¿œÄ`Äcòâ³_Á[–"ªGFð}ºbº&]ÄŸÔÓB•õ¤Y™¡øn 9Œ Ìò•ÁÂÓ©5ÉøÏ‹èþ‡ù× ƒ‚zr+ÏülÔ"㦂$S´ÿ[µÙ餘—·jãm%Óbÿ*ìôÂ<±Ö›Ø#±©QëSˆÉçÈy…Y‰wžx¤Y÷'üé·x/ÅÏÚâÿÚ•õojùGþ ö¿ñFx¥‡OµÂ8ÿ¶µõpéÅrËsin£9R~8©$\úý(À÷Í =)zs@19ÑšSêi0)’*ƒŠR}hõ¤$cÚˆ[&«ÝÝ-´LÌFqÀõ§ÜL°¦æéé\—мHº²JéöFv)gf?Œú·¢ŠŠ>(ñΖégg‹jðæºù+ÓÌooAÜþ5éÿ~.‘½½kÉ™,²rÌÇ’I¬ƒ 'žåõ­`ý£P¹o2I~€v Üüañ-¾øOV_ö(O'¹Æk+Ø}t2ávÑä¸k{’ašMâ&O¹žÃš.ìyMôú•‡Š$rÎoVã#ùŽxü tº—„tkÍl¯öºZÜÉ 2Y2p êªÙë×µzk[©@®ªáykÈ5ßkqë3É ­ÅÄM6äºQrr =±ý)zŠÝQfûâ&¥¦êÏoÆòþÌ럕xü¹à_P¿šþÂÒKË+“ç$ªÀœœñŸJïgøw¥ê….o#v½*¦I"…vd•÷¯9ñN³©éþ(¹Y-š\q± }Þ=1N÷Ü-mMbÿÃ]Åi«XË{yi×pÊPäxÎ+ŕŗˆŽÆÅ°Eû:©!LXàŒV¶±àÏíÉ£Ô!¿³²¸»e{;–*áˆäŽ1ƒKªx°xrh´hlm¯¡³bv»ˆ31ÆN è9⟡:u«xrßÄkk¨É¨[é7w1)k{røãvG¨Çj]GÅ^ û>b°ÌƦFž0âF<ägµgxÃO½ÕïbÕ--渱¹‰Y Q–à`¡Àã´om4q¤ékâ9®àÔV¶‘~]àŽN(ëævWØ£âKÿ­ž¯ci5Ì2Ä#x BÞK¯p;ÕcÊÓmt6ErÓ|æ¶ÉѳïÚ¢ñ6©?‡Æk¤ÜI ‘æÅ:‰<“ïíRO¤ÞxëK²Ôc’¾‹0Lg“ËÑõæ€+øŽñt+LG’Xì%ß ”¶$y3‚äTØKã})$¸Š »9<¡5ËmYóŒúŠš]¾ Ò!²Ô­-õ+›‰ Æ Hxã^€‚=}j·ˆçMSÖWm²ÚÚE+$Ö‚DrC{‚(üoæhCøu£2Ü%µü÷ÒÝ·ïaØ£¯¹æâ •ñ7…·i_g0NâÒÚ?¼À`¥SÐí-5/ O³pö–\)‚t]ήGÌ £¥h]ßÂ'á‘s£jR_ù³Vè CœcÔúÑèW„í¢m+YM]e·ÒBÌ²ç‚ Ž¸«‘.‘áýÿQðíåÅíÙ <ñ…{u$äŒuíÍ:+íGâ.‘q§É)¸Ô!+q bxcÓ¿¨ô÷Áßں噆ÏÉ0µ´„0¸$ð ƒúÑÕ[]  kz »Ðµ ©.x‹Á$‡ý[¯#'ÓÖ§ð÷„õ/^É©êi VvÈÎòG2È%ã8=|Ól5=*ãHÕÎ…`Úv§äd†Éº<üÁ2x VWn[PÔ›Ofg¶º…â¸RÙP˜ûþÄSõ'm­Äz^«yqŸ¢Zé:´±:ÛM 8,GLg5Ëx^îîßĶqÄ…æ2yrBOÞSÃü3]&‘àûíµHõ«mU,AœAnHHé‘éš4¯‰𦢖·ÂÉhüä‰CÆ[ Zú ÛÔX<¡K¯b×\IDr—6F#¸àçb¶yô¨Åma5R^@l¼Í¦Ù“î&yÒ²­|#¯Xëpes¤à-ÓFÛ?{wLq[×àû¿2²]ÅrÓ€Ò#!ß<ñŽ4'ü£Þ3µ/ë?ÚÒ\ÚØM{e4žd3®!ŽAnr1žséZþ"Ôü0·ÂÓXÓæ¼Ô!"žþÚb™`1Ó¡ÇÒ¹gÅůˆ.¤ûL¶Ï¤y*Çb€xôÅnë_îµ»¡¨YOgoöÄI¥ÌÞ\ˆÌ2xÇLÿ:Bü ïê—V~#!$1Ú¤(- Bñò‘Zsøkþ;LÔæÔm´ÝBHv:]d§Á8¥Ö†­øwÁú‚®§Õµ9-ÖÆÞ&mÖó¬‚GÇ Î9ô¨âÔôÍGú¹Ð4¡¥ji@‘ŸÌ‹?6Ü“|V7ÃùÚ÷U{Ý5•Ô.— O ˜ÎïlSz½IZ+#©Ðuý?W”ý—E°Ó59ãxá¹·Lmr:Óšáü9%Ý—‰­‚+ á8Vlòüë¬Ðëž!Óu)¡ŠÆêty±ÚDÅ'†ÝŒ{ÖÖº|+q­Èº™¼[áµg¹µp#fÀÏ?‰£ü ÓûE=kL±—Q´½E›åб©zн¬M£èúv™aâ 9¯¯ã‡qò˜Íº·!8<â²µ£{á«ÏÙiú¼S[[ÝÏ—2]Éåy…N©Ç9Ê—â‡ÅW±Ecáñ¦+[茤Æ7|Þf~`ǹ®‹Xðõ·‰¼9kæ^ÅbÖî \NIPåN=x¬ù¯tÍ?F¹¶´Ônåo:U“D€ð6þ]E7âSÝx~ÂkKt·µÏol˜PÍѱúSé¨-ôŸÃ]&ëPK¨5;‹¦Xah¾x€êI÷ö«Ä^5ðæ¥§$0[ÞyBXþËO8¨qÖ±Ôz†¯c6/ˆ:Õ¶¦÷Oy.<íÒ[“ò‘žW¥jë_ 5K«ùî´õŠK[ƒæÇHŠœ2œ3WÓÄ>½×ÿ{¢Æã"èJB»g†eÎ1šä¼I¨j0x–ýî%’+””‘±ˆ=±Š˜Õ—Âu—ˆôÏ K™>›±5¤ —œ6îê=‡øV?îùÒ®­Wf™%¸ñ¨áûËõÍkjþO›mR]FÓJ¼»d’Öä•,ØÆà{gÞ—PÖ›ÀPXè–‚ äXüÛ‰n#ÞŒÍÏËžÔÊúf—e­xF#ªÝý† yöAtÜ–|ËL÷«3Già MCG¿÷’Vå@+‘õªž*–ëÆ…å¤!´ ö¶‘áPžCàv5…tØàðþ®uÄ’ (º*¨âC.z§áG_0[ypêw¾/Ñîôée]ÊžlNª˜Ã’§ëY¾ð¶·§êö——v’Y[À Í,«…ÙÎAõÏLV”hú>ª_x~K›‹ÈãTo´p`RpXÿZÈðÿ‰ï5;¸´»Ë©®,ï”ÀèÍ’¬z7áM’mhcÃw±½µ”é6òщÙ²qÆ2>™¬ïjwW'¹ûl²G?˜wFXŒzb¥Ò>kV7%û8´Y7<É:’Š;ã9϶*Yüi¢]®&ÐíçQ6Óv Ú8<Òô]Åñ'¼Ö'¹±º¶ŒÍ‰<™dÚá\JŸQñ•Ç€¢µÒmü»ÉâM×>q¸ó…ö®WÅ“]EâÙå¸bù!Ñ”ðb?w…o^h¶:Å–™uªêK§O$EA#&T ÇÓŠ-Ø=K·¾=ÕfŸAñN˜íöR2¼H7ä÷õr9®È|W»ñrÍ«kVñÙÇl6™GúÖôu?ã\¥©‡Zeµ®t.ì™ÞïnU‡@2ëPÔ|oá£EmBÙÄâ dÛæFxÎÑÜ,º‡¡ÝëÞ8·o^ÝéÒyÓD¸ lϰ­«/ˆ>Õ¼7`¶¦kmuR4•drÂVÀ zñ““^Qá}'PÒnn§Õ£’ÛL[g¬ë&xÚ?Ïj—íᖿi´¨nÿ´¡…Þ.X2¨8ÎiY1ûÈõèŽAvüª_B¾8ME¬®­ÙM䘥‡ã$Ž:vü+ç­;Åšì—fîix&rCsÈÇé],Þ Õ­õYçÒ.¥"E_8$‹‘œ>™¡¤ö“Nç¬:ÒFÊ©Á^àúSýTÈÉ;œ$h>f8Ïë^s¨|B—Âs%‚ªê2ÀƒÎ–V ³õ8¨¯þ ê–z¦‰â2O,*M>âÉ{;ÇüuS?"‡?añ©lOÝY¢Y—óOé]E¯Ž‹g¸óºh˜ÿß*¡/ý'oú;jLzy[”qèÀÿ:.÷:ïø€i0ÝÛÊ÷ ÁŒ“᫆Ü=ðüiž,Ö!Öµ™.­ËìdIeÛ’¨2p8é“\oü!×0¾'¹bê×xꬕ5´_[±ßiZ‚û»DOýô£ùÖ>ÊÓÚu:ž&«£ì÷M–sŽô¸°Lž(¶ù¥ðäӨ佛¬£ÿ& —Æ‚Åö_é·Ö,§M \~b¶Ó¹Ë¯c¤Ø;õô¦_LZÅ·ñ¾‘u‚.• ìÀŠÑV³ººº‰þŽ)ÙŠèÖ²×5-4/Ù/îmðr<¹™@kKþÝjê2óÈ·Ñ ý®Ý&PGñ)õ®}]\0}ë{Þ#‡F¶¼¶»…îì® nÖÊÛCpÜŸ #ñ¬ê9F7Š»ìtP…9ÔQœ¹WrŒÏ¤ßcíþÒ.9,‘4 ï†ô¬Û x*ì–}P°o[KÐÀqÙ]­nx³V·Ö¼Cw{ha˜«êƒ´Àã¨5‘Æy<ÑÍÚ°ª¥ Ž1—2]{ýç)â_èn•u{§jWâX—r[ÜÛ¨Ýí¹[úVƒÉmÄ’[÷|“õ5/ŠÐÞÿ×3QøO+áëhÿ©«1ÜÚh÷}) '`Rî$ ž)»±@Ãn9=+ƒñ¼gíp¶;]ël×?â}(Þé2N-„dz`PL–‡)h34C?À¼×[¦¶3\­œM$ñ¨ùùW øOÃï¬Üy&Q  ¾Üž{b‰l$‚BŠI«ÏŒqùWÑ>ý‡üEã}-MuË]2Ö_õ_m÷8õIâ§Õÿ`ŸˆZhݧÞèZÀþìwOäDõ¬}¬v:}œ¿¦zßüñqðÿÄ’~ú1úI_Tf¼?öPøK¯| ð.¡eâ(¡‚þêèJ!‚e”*ÝYxçu{h;‡§ ¬[»¸å£°âh'w¦œ®zížh!4Ö4™ŽÙëšÇ©8<æŒþtÕ$Œg¤,V˜/M–U71À½5Ü($îkWÖ-ím&¿½Á§ÛŒ“ž\ç…¤ñǽ†ëþ!¶Ñô×Ôïrñb··O¿4”ŸåV>|7¾ñV°Þ"×WuÔßr<|±'d_aúšËøyà­CâWˆS\Õa1Z¡Å¥¦>X“ÿŠ=Í}®x›Ã<9k{®^ y®a±·H¡’y®n%m±Ã 1«I,Œs…E'Ž0 ¹µ«¶^‹VOâoøsá>m{®Þ‹iîa±·Há’y®n%m±Ã 1«I,Œz*)8㑃ð'áå߃¼1>³â+xG¼M/ö¯ˆ®S,Âw%’Ô1’OÝ[##Ur¡c,Þs[áÏuýoWµñ×ĈlÛÅqùÇGÑ­Ö9 ðռʊðG0PÓNëy³ŒîX‚¡o3Ôë¦rT éAݽßM:/.ýµ¶MÄW3ækÐ(¢Šä5 (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ Íñ޾ Ðoô×ÆË¨Z& ÷X‚­ê§¡Á5¥E|ãØI¹¼v´Ðn¬÷ ¯Ø&wQϦX¥xçŠbô•˜Û_ßBÈH1϶íÚ¿V*½öŸm©Û5½Ü q uGíŒCÏQBÓbœœ·?¾$xïÀú…½¥ËùŽw•m»r;W,ªv‚qÅ}§ûm|ÔO‰b¸ÓmüÁhÒ#!ÂV †útÏzù÷æš?}§Ü*÷!7Ìf´S]X6ÕÒ1CžÈ<}{dÔ3/–yÜ„vaŠ’ÔdnÝžßZ½ KQ¯Î»¶Ÿj{Æpi#ÃíÆ O¥J!Ü=ï@_Q¾Zˆ×'¨Ï´ß%vƒŸ›²ûSÊã=ª6%ûCÖ€ëЊ§y£Øj,MÝ•¼î@ÃI$zsÖ­!ù‰Ç^´â:rO;Ñ 'ãÍ"úßÄ—2É Ó[¶%T;UqÀÈàb´õ=/G¾6O«ßOeª5ºùžRз¾1Sø¯Çú¦—â9íby-íâÂùC?OÖ³µoj>$ž-kM·7ÜÆ£Þ#žGª½Y—]íwÄz‡†ïíôÝ.åí- …2$Ï;Ö¤Õü7¨øÑ-5{4ŽI¥dèò„ù׌®zæ§¹¼Òtë{-7YÓ’þñaÃLÒ˜Úœ…çšÌñ}Ùµ»Ó¬ž^™ä³„~ßÅ’;柩>hОêÇÂú]Ž™«éê—KºC­þ 1áTƒY^0eÓ´™¬Á¥”eX—?»“<‚}}ëZïE·ñ6›¦Ý\êQX]`Ä*–ó”t b¹is,³lÌnÑa”l4ë}{Âöͪ^<Ã+%½Ë.ÿ1%Hô¬\ÞÉàÜi—ks5ã³›´_¨à(½'‰m¯|U¦ÙÝY@]íËG4ëÀÏ!‚ŠK+Kk/¼A ë —¸€|’)ÆóÐQ×Ì:y žãPø… Dóµ+)Ahb ‡ÞǨÅO¦Y DÔGˆ,ä³Qjß#»ŽwÛ½G¬½¾‡á”} ÌÍq‰å‘¿x¤”;TZZ\xËCº²¹œ -Ùf‚êá¾UÏIô4m¸½ .n4ë ßÍáèf·fd[¯6MΨz`úf«x]ßÄ–—Ú]ÌçÈx¼Á4¬JÀëѾ‡¥_²°›ÀºuÕõçÙ¯<ÅEN$ŽLœß—Juqâ R‚ÇNƒO½*²0´\yè#¢˜z“èþ ûf·%í®£´Ebû#– íÀÜ1À§i^/›Å?mÓ^ÖÎÊöêXn ˆFÌÄ\b²< B椒=:Kv¡Á\'cÏ|ô­MËBÒïSÒ/çÔn­`wŽÞx‚•=7{àJKÈl¥à»{û=rÞ­>X•Cn’x™6&ìœr=«CGÓ¼)&´’é×oy4ÚΖî2@^•Ÿ¢xÏRÕ.ƨÝË=¥Ø0`žP·Æ›§xY°Õ­ç‘VÐK½®’E!UyÎ3žžÔiê5~…m?Çz¼:ºÉqs,°I.&¶'‚ Á«Ú‡ÂÝSûEþÊÐ=£I•o8yˆ¤÷^¹~ËÄž½×â_ìHàœÏ”¾Y–'‚Ëœuö®JïPÔì|E;¼Ž/ãŸ%A<¶xüŸ›òG[}ã=Fh.4;Kô›ÙóIÁõâ¹ïËu‰®e•÷,›d†AÐÆFW»­x/OÔui$Å®u9YÁÔüŒÃ$©4š§o4K×Ò¬’!ah>Tñî-·©9ª³ô üɵKÕãÓï5mYt}Rkd2DñïWþë1`‘O½ñ=Çîìt}:iRÒ(„Œñc3³ó¸—âmR×/F³§ÙÜ^Ø]Ư˜¸ˆã1ƒZ £YézM¿ˆá¹’ù"% ³íx£' 7­.ºnÛ]ƒÄš6©ã´Ô´è$½ž`žð ‘È` î8ïQÛÛ[x[ÆÛÄ–N'¹/ ƒ1ŽH°0[ ‚3Qx§Tlzé±ò‚Þ•†ø§H¿Ò¯n|¨¢ :â'Yg‚Ñ0&N™Ç±¤2ÙÝëM}i©ÔÅ´bÀ³qóä j]'ÅÏâk{Ý1 ´±½¼–‹h–2Ì9Øp:Çð\båµ®Á‹N{b.ÉÛºÃý¬Ö®¥h:TwÚ¶—¨ËªÝYÂÒGm,A3ÆóÏ8Ï¥ Ý×C Â>©mâ{2-ä¶xß÷¦â2 GüYÏlWA¦é »×“ì—wr²–[9‚ùR0ä(lgªñö«¨ßG¦jWÒÍayû–аÀaŽx&£³øo¯Yk1n¶)o ‹Õ`QT¼pr8ìih=zµ»]jKµJª%ËÛò€+Š¿¬ü=Ô®oÚóOnl®™Pʪêd‚¤ç5rã]ðµïˆ¤iô·24ãý-e!\ç«.qŠç|S}¨Ûx–üÍ3Gp²|¦6 wØÅW¨—’:MwÄZ>™5¾›{£Á¬Ii Å%ÄŒUÁî ‚8•ã‹Á=ör€&•%º›T^ê¿PkKXðŠxíoÛQ³Òï®íÒIm.²¤¶0X8ÏíKijøÚÛC³Ž …‚=ó™ã²3rpjæGc§ÛøÃv­ÿö\ðÌñÛÜ:oóS¨Èè{Ö¿‰|Csá Ê;;”¸¸œ’.Q>@£·=ëY{¿ØéZ¥«È‘ Ö¶±’!`s p®‹XT¾‹ûe'‚-à*Æ»e :àÒÌ?#]_Qø‰áû«fýî¥k"̱Ä6ùËÐñÜŠµá=:ãF‹QŸZ³’ µ)0™J‰3ÑG½Aq> xZêëÃ’Í3\L°Ï< ˆuñ=êMêóÆZ]î•qtóˆIçc¯LûQêN ­ÛI‡HŸQðýÂ\ y'›xR8'ëÍq>ñ%üz½°i¦ºŽWòå·f-¼7cñ®ÃúN¥á­8ÿi,YZþùæŠPÇ‚(Ç®1ôª¾ñf{ªD±èVš}ä…„ˆOÈädtç>”Õúk©J„·FöU¶ÔlÞßÎ#jÌ<ÈÓ=×ÔLÔú§Ä;85V·þƳ¿µ·+–dÌ´c9êzt®cLº¼Óõ›——ÌûrLA8<ÉŸñ®£^ðn{«Ìç\‡N¾˜«ËhéŽ@݆×ÚŸ.‰­J¾¶zï–yµÙ.~i­.cY`p¿(Ltü9­³¦é×¾Ñ%ñ ãé÷Aa*›ËÅŸ”°Ï.©ã;ß êãEÓ˜[ÙÚ(ƒlŠöÇÞ>ÕCÅZ~£ã²Öl­¤º/•q)‘ ‰ÁÀKî?"æ·~Þ Ñ,“C½iEó´Ï~£ñÀ\vÀªñßê¼?qg$sªÙºÍ8óðG¦EKe¦“á8añ=¬Ï Ü·¶BRTå½³éMÔ/tý;Â7xmfHç¹ s$§÷‘ eW#±õ£Wè-žÚ–|9¤ßøz »ÍnÖKk )"Èï÷q´Tš5îq,çGÒžËWîÖâI © tïU|9||[ay£ÜÌòy±V‘²"uä7Ò—Dð=æ«qll¬ÌÏm0rH/® §ø‹ð9ÿ ê’A¨C/Ú&7>nÓ¬™8 ó[·ß –}Ft¶Õì‘ZL‹Vcæ ôÆ0}¹«Ú/‹´ýFõ$“H³¶•Ü칉pÈÇ¡=«„ÔÍݦ¯43» ´œÃ«6x#ëÅ5¾‡YªxÕô«ó¦ÚXÛÝÚ٪ŋ˜ƒ±ÛÁäÖwŽc»Öï-uX"y­naB)+^N:sZÚ¾‡¦_j‘Íw« 3Sš$i¢ò÷.â9ç#‰|S{áK»]3L™’!RÒ0Î'ÔŸ˜'g¡“g`þ…MNÉàßÈIx‹ô=ñéRßxþÞ-FKuÒlîíTˆÄ³&e!xÎî´kè;üÉõo Câ²¼ŸQ·Ó®gL‘\#ÜtÈÅ6ÿPo‡ö¶š]ƒEs<¤Í,ò.ô|ð0jÀñÈ–çZjZ[KˆÖH8 ŽŸ­[]:ÖÿÂúkkwO§ì‘–Ö@›™ã÷™£®›‡O"Æ¿}uâ¿«E‹‹Ys,ñ킊£á*êÆâõõ 0Û0¹ó2ÝǾzUÝFxü%áô›I¾ûl—’mk° lÇðÚªiþ"ÔiïnbùU¹àž½kfÿ…¦Ei,pÞ^]¿œé0¨֪ϫÿoøbôYÙÅa%¼‚Y¡€ad_\{Rµõez3½»ñ%¥¦=ÜS,Â4ÜUy­ ÄþÔ|-¬Ío®yAž ×÷m'p08ö9¯&𰺽ԑÀÈ~Ð`Ç<Õ½3Ãz%Ýêªj«;#û3G†|s€sý(²{ ™õ=BÜùÊå Ž¢³ïüQc¦Ü˜&VieŒc Ó5Åè>'»¿Ö¦O=¡‹qÛà(ª§Š4mIu‰îlâšd”%í½±NËv“ØôÛK¨/ãYc`Pò8æ¯Es>©u/•ýÃ!+ùW›h> “Ãzd'P ,ó9)0Q}Nj}kÇóG[>0DW &YAœ€}AÆ?:,>knvךm†ª7\ÙX܃Èó-“?˜Ö%çt [?Ù(¼pmn$ŒþY#ô¥âÌ>*{[¡Aet_"æÐcŒs¸w°šŒ†A"HÀv=*lW29ŸøWV%É´Õ5K×–P=¿†£“ÁÚí¢“gâ®Gð¥Ì,‡“Öº_ø—B×"¸ûfµ™p&dD’2T¨èI÷9«\¤È|·(?yH!½Á§ªâÎ4ÙxÆÑOú-•øÆq:gò$‚Oë7Þ½‰GWHË/çŒWræ?2Jy—¶ØÑFY›Ó¸§Ë ¶’)-³ž”¡úŠ.Ðì·<ÏWñ­–¡¤Ý[4H…Ud^õ?†|W§Úé6–ÓÊb’5Úw)ÇSÞ½_ß©l”wYãY?ô kïÚEÁýö•jØã1©ˆŸÅH£QX† rÂçýUÜNÞdH²QÔçÒ±nü¢Lr–×6§?òÎpÃÿÖªŸ‡«ÿ£kZ¶xÄqªŸéEÃS¨s“ÅWº¿‚ßD½ŽvŒÄåµsø{ÄúteíµK{¸Æ~Q.ò`?bÝ›ÝB4}NAÇ+ ð>¦‹ ·aÐë$alÕ¦¸ ÀP;æ½Cáž´±Á³í$J ˜î漺Há¶& ¹Žà?JÐðδÚ|ï2w oUf$ù]ÑûcàmFÓSð†“q`Êö¦Ýì<+p6+ó7àÇí-â_ض—a~>ÊàmY@,Ž„‘ÇLAÓé¢þÓ#‰.N x¢Õ/q=¥Ã:‚®}±\§;nö>½êyéJ0 y_Á–?N­f4{ÍZÒV6¼±»!‚‡ÎÒöä1‘Ö½Hž2;Öm4ìË]ÇnëM'ž(#ÓÁ=éñÒ“vx€áy¦näö¤ õ¦ÌsÓ®h ¬›«Ï´HaFUæ’CÐ/sU¸ÐÍCQY#žW™`°¶]òÌÇb°<)áûÏ‹Zý½Ä¼ £¢Û‘ÿôч©íéŸRj­•œÿµ¨tí=? ZI÷¿çéÁûÇÕ}=*úƒÃÓ<áÙnï&·°²´…§žæáÖ8¡Ws;±ÀUI8SµôEž ñ'‡¾x(jÚ·šWÌK[; (¼ë»û§â+kx‡2Jç…QîI Š^øs®xº‰:µò¼VÖ¢/A7Kwmá¨^5G ª*É<¬ –|gD¬Q7Ià;­G㟴¯ˆsZM¥øDŠqák{“4W¬Ó(µI"ܪ‘y&XàI»,òHvnA^×]“W³Äþ//îÿŸ^šk|×ï3Û§ùÿ—ÞQEqQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@¯>hž9†¡nä`Lzq‘Ð׎µãºçìo¡ÞÖÓÂY³»ÍŒ¦=1Œæ¾Œ¢€>4ñì)îD[\‚3•aíób¼Óİ5ÒHèšC3ðFX~kÅ~‹Q@“ºÇìa}fXÀ—{+?Zãu?ÙÄšxo)ä#ÑãÍ~É:,¨Èêa•†A†³.¼+£^ÄÑÍ¥Ú2·R!U?˜æØ¬~+j?¼U`y¶Yã€Wúço<®Ù±ó´¹°;¦¿kuƒþÔcÚÚbÂs’ñ±Éöç"¹]_öe𦢔¯ çvôWÏÓÅ>fGã=ŕůÛOÿn2*»H§##u~µk±Žxßè³ÀÊG&T(sô¯:ñì.du†ÖÚävpÊÿ¾°j¹ÅÊ~`jþÒ5é¼ûÛfyöíó#£cðâ´m,¢²·H"@±F¡U}¯·uïØ:ò$’H´«„U—HÝ@¼Wšë_±þ­f[É7 ÇùŠ9¬Ïü_ðåüE¨‹Û[˜-¤*ÒUl1TÛðç†ãÑtˆ-%H®Y2_Ì@êIë€Ã¥{~«û8øŸNÝååÿ߈ÿJåµ…^'±cºÄH÷ õWLž[jxWÄ S´Õ¬ï´¨î ƘQiÌ-ž (àÕÃx»GŽM}®<õ‘¼©8IBôÃ=GLW©\x{X±$˧\)õUÏò¬ùU¢'ÍŽHÏý4R ;Ü\½lyŠÌþ‚ÂÖÍækfs#Ê_kHGð’:qéP=­ÏÄm76ÑyWvo€g“åen~ö;b½*÷N±Õ¢òo!†æ0r« Ψ#¥;NÒlôˆ;HÞ"ÛŠ)'ŸÄšw{Ë­ÑçŒ$ð^ˆë«ÚÛÜÉq D¶fFÀXãëUµùíõ ÉýVÞ\ª÷0[äîSÀ8<ã5ßø«Ãþ*Ó– e02¶ä•WyCÜc#ƒT¼%à˜ü-<¯ö³vò¡öÀëŒdóNýÅËÛc‡ðÚZjš&¡ܾEˆPÒÉ·&'µj-&ÛÁÚe毧޾£&ÁLðùf-ßÄFNk²ñöƒ>¹ K  -r]Qp ˜þä|á­`jWºµ½Ä-ŽH®AóЧZ/Ü\­h¶!Óõ½GÆVZuÝǘÓÄD-Œuä)ö8ª¾ð棡j_iÔ¬ZÎÖv–gÁ ¸åx89®·Sð…·…t{ûÍ)EÒÂ@J_¹^88®;Âúóê’G£ÜÆÓÅt¦mÅ›‘÷¹ô¦KVп£]øzêø¾•¦Ëi©ˆÜÀ^RÑ—ÇÐ×?áNçûj!%˳<ž[Àùa <0ú×I¦x÷×Kwus–PfVhKoyÆí'ÅÖ¥Îé­,­nÙb™!ĈO Kw<Ó^@ôܤß!˜ò5‹I-Ĺh"dPzc'ñ©ãñåÍþ®"L†òÖ©0†•8È=s\õ…õž¼‘Í ëv³á$ØpÍŸ_C]Að·‡õ-jgPº‚äK™¢Ž0bÜy*‚3Iyog¡Ëx—Ãú¥¾µs#[ÝOɾ;…‰Š°<ŽqÁ½­Xè3ÜD5{»‹}TAí€)¸×#­Cwãmb=~æ yšÖ¤(¶§îícâ¤Õ<)¬\ê’jºM°ž ¤ìfBÃpåpÝh²ê;·¢)x£_¿Ñµ(ì´û‰,í-âE‡ËnHÈo|Õ»ŸßøâÞÇW´òDï•:Ï(s/—<ÕGSÓ,E¶›ªiQj×õäV(b'ªTŽ•—ã‘æ–Ñ!þÊ0³Â®WÞ\Žsš=E§MÍ{íJ i¶šn«§[jw.Í3[Îw, ñÁÎ:Ö_‹oã¾Ð4ùôÛhìtä‘„–ÐçÈyç9È«Òi0x³D²žòñtybf†)ns'šqž<Ô³ê³|>Óma´¹‚k‹¦,×pǘÌcŽëÖŸõqÿV2ü=ko®xvî-JèÙXE2¼W{wìð@Žõf;[oéw:¦—©.§4¬-ã#Ø"Ï'#'“Š“X¹¼ñΆ¢ ‹ÛYwI¤;<Å#ïlÆ*Ÿ†´ÏìëQµ»YíôæEY!• nÏŸ—n{ûÒëæ o"ůŠ5?é·š=åÃKtÈ$¶+Æò½PýEÑ5-S3êšt¶vðÄÍ,³.ÐS+ž‡5'ÙôÍH¿Ô4Eº7^X_ô–V1©<²+3ÃÕæ¯u&‘yq5ŵìmîØØÈoÃuÔ[ìtZøbiEÞ‘e-¾ªŠí3N]K`à€G_NkŽÒ-Òl怵Ýä'î³½O|ž2+&Ú+3A±´×m¥¸w•¥·¤ƒÁÉ÷#¥Mã{É,4[°óᴑϘdr\0 úQÐ:ùhzTžÒu;~Ì›Yö–Rñç6sž; °nôÖðö¯.ƒdÚ}á‰Lˆd.LYù¶šÌðñŸÅú6¡¥ÝÜüÐí¸‚æá‰XÛ¡öfµôíoÚ\ê—··°¤^T+o&õ‘‰ÆÐ}EÄðEí¾¡¤­“‘pdO&X‹d…/Ë~ŸÂ¡Ó>[Áx³®·g{mnÞl‘Â[ÌÂóŒcÛ®kOGÔW_ÓnšÚÎËOÔn-˜,ÐFäãÖ¸ éZø‚ÀÁ­Ïœ$R3ógÛ§¢Üzô:{?Š-q©“wmkö1&QÚdEÏPÞµÍx—@Ô ÖoÉšæ&“ÌK€¿+«r=+¥›Âþ¾×Þ(u†Þã›fåÎîQHíÚ³õ?ˆzÅ®µr–²µµ´Ryki·åxÆ? «]yµ›] Ab5Û››}_ì¨%6êG¦ì÷ª~.Ön4Ó¬´©žÚÉ Y#š6æbz±÷¦k¾Ô¼E|5]6ÚK«[ÈÖbAÉFî¤uíVnŽ™¢èúf¯Y½õÜjϵ$(Ð)<.E/Azì2K Gâ‹ksfÔ-$0Èò8Ut# äñ‘SiÚkøHÔ®5»U]†+l¬˜9,qÛÒ©ø²ê|?¥®Š¯m¤36Ar\KÜ1ïG†m%ñ~ƒ¨i÷w"/²²O åË|‘’pTŸCFwؽ³a©ø{YMLM2üDÕX±’0~m¾˜«Á7³Ë®Z[G\[ÜFñOð˜È9?‡\Öæ— '`¸×%»·½hPÅ[¾õfn>n:{TšWŒN½,Ö&ÎÎÎöîHní¢ÛûCO_Bn½JÚ_,ž÷l:í½Ý¼o½­£ÊÊÀuP9ç·Z®ß®ãÔ\ùÉeæäDñÁAõõ¬MÔíõ«V··xî’pñŒyÏ·Zê/ô _k²§ö¬Ö×K‡‡`òËÈSØzIö)ïï:ö‰¨>µq{k×¶Ó:•I0àgÔVìE¶—¥[øÜ&¢‘aZ؂Ȅä9 UoÆZ¶—­ÏŒòXCl|¨á^€•6¯áûÿ}XÓmÚcq'pÊ:ðqž ûPøŸQCÑ´Ë}YO›tßiïœÞ˜ô©/|g£Idóy×våe‚IƒÁRÝ)[O èÚë–&êIe.–»Š˜€ãv}I¨µëðÇ Û=´+p¿kŠG.ßìäúO§¿1ú7‡ï<$n5P"ÛE(d%cÆ8íOÑ›³Þ«ëzÄž³Ó¬tYÙ e7 tœyå¿Â¨_˜ºEŒ6Þ½:äSAa,ª"‹e.:•þTø"Òô}#RÔ46¹–åc~Ô 4*O,¼ Ñr÷ßt5X™®uYTÎ ¿¨¤ÐôMOßk»Öb’ …‘á—þZ–à)ipW±—áÞK~–7W3\ÙÜæŽìnÈ©ÛáÆ³ç‹p‘yN'µ}HÎzV¶‡y¡]NçLÒþÅ©$La/!u'ol÷®BÇZ»³¿IÄ’™ÖMÅwŸ˜ç¦?J=X_²:WÅZ*êMoq£Å©,[ck¢Å]öŒv¬o\Éq«Á(`,Þ6»x1Óó­m[áóÞêSKe{išC‹Iä+"ddŽ˜êjMWÄ1x] ÑÒÚÞùm£ )¹p,y8ô[ä=­Ô©§iiâ ÛBñ,>Ï;%½Ôã!×#׃Vá·OèÓÞÇw õÄî"†H~dAÔçßü+;Å7‡YÒtëÛ8–;Xɉí¡_–'ëÓЊ_ Cæ‹©A|L:`´ÃªÉž6\Qù‰Ý¯#WOñψ ½Ó¥’n.£"9Qv³·¡®CNÑ5A«[G¬ÐÜÖt*““ØW_¤ÙiÚ ­ö¡c¨¶ ðBY h€*¼k+Mñþ¤·° «—žÍÈITŽ€ðphkä Mµ4îWÑëÓJonmîD˜‘£QåäõÅcø¿_¿¶×%†å·Š o¼1×Þ«j> Ö »ºŽî ßòÌ‹A<þ5·¬É¡Ø‹;Z)oo RIà}»O¡õÅì4­¹I´«ïè–·ð2î6heÜÁCÈ#¹®‹DÐçðû½ö¢ñ}–Õ )÷on€Ré>(²¸½‰¤Ómaw;VtA”'¡ªD»u+ßx*+­Fq¡k fÜ ‘ˆd'’8ªø¦ M›§ª”¶]ŽÒd–n¤×;xÒÙê÷QÞ1óć-ëô®›Wðýž¢,¦¾¾]>òHWr²nÜ;ÈÁÅO /=ˆ/üA¨jö¶:½¤’E=»2H°”oï s‚+SÃþ-ÖoÞiõKÆŸOµC‡”啎8—©]é–¶º\ÁæŸ3Ivû`{ñªñëWÞ,Ò®¬åpר–0ƒÇqŠ«ôan¨í#ñ¦Ÿ}mpÖ²y·Æ\DAYÚOÅ="-) Ô4™d» GÚ£œƒ¸ž:~ÅøH¾MfòžØDwHÒ©/p~½+^(¼3=â«}¦&yqÀÆÇ=ò8J•¯A½¬ïl¯òÖ9WîÈ¡ƒr859ˆê@¨ÀUP àÅ9~ïµ2…Ÿlvòâ*qÎkÍu‰Úvg¦zEÁÎ ×—kÿi²ûä("E«7ú1ýÙn}{†f™þ!øLêeÇ‘ª$fHÑÆý?>™¯±PnN@<ó^Ûðóã.¿à]"Ýb¼ÓÜ~ïÍÊͲ8íÏB±¤Õú•eª¹çú:¯‡5étÝfc£j6Òä[€|²G£ þµôßÂÏYMJÖ~ß»™[?‘¯ž5˜[Ä7ï{|«,²å¤¿s[ ð¯‡ÛZ³}fF²Ó÷ƒ+¢ÇaÀÈϨÉÇJMµëcôàÜ6ÃâÍÝÔZ›¯(q€\‹²w’:ôÆkÞTmü}kÇ?go†öžÓï5ûmr=~-NÞ+{Y"Õ-¡Œ±h—v7œòkØ dõ®OS¥ôC³þE4’i@Ï~)®ÙçéHB†ùp BÏ’;c½0ÊIÀý*¥õé–‡™;íL¤7I!¶ƒæ•ò ì8õ®"X®|q¬6¤;=’¶ÛÛÄÿ–„qå©ôõ?…Y×5­VüøgCbo&âúò?ùd§Š½ü¿—»|4ø}¥|<ðÜ—×ÒÛØYÚBÓÜ]\¸Ž8cUÜîìØ  I< 5K]†t ~ÚøWL…%Rª: ä~ ¦µñ¿Äú·Ã« y´ŸéÒ¥·Š5i”n¾lXÝ >Ù¢ºIcYmç•%‘£+´•$ÕmcÇz¿Ç«ËÏ |4Ô³¼'otlõψuí¼ØO&ZÛMòäv3ºÎªguU‡k•Þáqêž ðàkøt„¼ÿOºûmÔÚ†£q}<ÓyQŹ¥¸‘Üâ8£P7`Ýõ_~_EÛÍö}—Íô2½Ñmù Q\áEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPPÜÚA{Žâç@s¶T 3ëƒSQ@þðþ¤Á®4›f8ÇÈ»丮oSøá NFf±xU¿‚6˜&½ŠðWöIðåüo²eW à0 úçŠà5ÿØ~Úâ2Ð}šbN6!ÁúüÀ úÚŠüýñ/ìp¸+¦ 7gR‰ã·8ükËüCû_iòº Y­Ý‡æR;ô¯Õ*)ÜÆý[öX×´ýÞQqê¹þ•Çê|O§?ú¿0ï)¿kîü;¥ßyž~k+IÌЮ㞧8Î}럿øIá]B&GÒ’6?òѲ?2GéMI¡YŠžñ‰>fœÍô9þu—&›yiÄÖsGÇ9BqùWì¶±û2xORÊW„󸺫çéŒb¸mkö/Ò/do³Ím°ôi©ü€?Ο;*?%ätÆÖ=z‡¬ë}L·»ûe­•¼`‚Р^°â¿MµßØBK–‘`¶†Q’ î2Eywˆÿa{Ø"y²åH׫ùE@üqOšâå>)’4–&R¡ úµÂGð®Î×RŽáoex@þCF9ïÀôü+ìmoö?Ôí7£1ýÒ­q:§ìãâ-?"?4ýøóO™ ”òc½¡xŒŽ#¡ÞxM®ouxvÑÂP uq9n6äW´û:æÊõ´}*=?QxÅ*»0#º€OáýF_ ´i­•"–"DÈX„eû­‚kVËÃ7> †[Û«È.­mÔº,!ƒíGŸSMXZîs>Ôî_P·µRgŽF1É nOÞ­Ë?XŨU´¼·ÜY­ü²$ 8SžOÍ^Òüao®[y3Íi¡2Ñ–Ûc£€Ï_Zæ4(õ; N+g´™f€Žñ°Ï<ã¥ubÿ ·mñ2íq“ˆš YTÇ®k ^ðåêëw3½µåÕœ¯æ%Ì“¸7#œc½ux7GÖ¯.níN¦«åeh!ßo¿©]Øà~=ë(xÂþvò/>[UFØ)À 8Æ>”njYÕí|==Å´³Þ.¡º¬’ÛÏN7Èâ³üGªÏ¥^ÙXÙLöÖÀ¦V#Ì«ÜԚׄõ Züêšu¸¹‚ä  ª¬¸ÃOJ½,ºe…µŽ—©ØÅwu{Îö Å“…t¶».t{¯XY^Ã,Fö0ÈÒÉ´H½A÷­{Vú¼Z•„³JF-݃¡ø‰Ïx²E´M'ìiäé‡!18“<‚{šÜÖ´{=wÃöÆ[謼¦&—3Õh0õ ZßVð•ãiVé­Ê÷pÇÎô=>™íQx0M/ìn¦Ÿ-±3H~ìd}Öúæ®Cj>é³ê0]Aq;b’ Z5îrzDñ5׌4Ëý=’(¯Z1$ma ÁNJœu ¡¢éºf…iueª UmãóBr¤ŽÀOJ££üLÔ¯o£¶Ô.ZNLLá@hóÀ ûfªx+OÔ4íT´öò[BÈDÆt*ÅœúŠÐÒ,¼%>¢`×Ms2GÆ ÈÀdF;ô¦Ÿ`k¹ÏËàzÞüªYLq.#¸Ûò·<0>ë¢Öåð¤Ú䩨}¤Ý©5ÄyeÀœZç­üy«Úêfv»—g™™-Ë|¤g•Åijõ»Ë›«ŽKIH’5yT8 Î “ž3KOQëèWñ~³{g₞ÒÞTal˜àûæ¯]øvïÆö:~« CÃ!†c;„ó žsÖ¦Õ5­+I’ÛM½ÓW¸³ˆG%Îò¬?ÙcY~6ºó®t×¶]š[Û³D€üŸÞQOÔžºnjÀV—ööúÝܦf¶—j8Ó5»ªE­ø>I4ËH´ôŠ`n­¡ÉÜ1Ã}3M²Òcñ… þмKµ£·»œ½HÉO^ X'ÃÍ"kËK¸µ «ÇG,ctj£“ש¤3#ÀÖÏ<š…­ÊÓ&¶c<Ñ1÷X{æµôMHÒ¤:­¾ªš»YFÓ-²FUƒÃuçؼMuãmPÓ"Šûgöýä8¬Ïèú•¯ˆ ’Ki-a‰XÜЪˆñóŸZ4CÕÝ¢þñ/Ršö8¯æYlæmò ÈÚ²uk°_J±ØÜOšV;•BUùàƒ]&§x:çWCi-Ó]«—ŠÚ|äaÈÇN:W?ÿ Þ«oªMr÷“F|ÒZØ—åqOuï´~î¦î¹/†£Ô„œWßÇ G=͹ÊÁïY>5Ô§Ó/í-¬%x4øíÔÛ4m€Ê{ñÞ­ëÔõ{ç¿ÒáY-nÕfTyU]K ‘´qS_jw†-ôí/S°MbæÚ2]™ÊùEŽv©çŠ=êS‡Lºñ߇ín Ñ­õ¬¦ÜËrûUÆGÍê*Ü[|?Ónf¿Xîžô¬)lÌ6’N ÍQñµê]i:Dšz m%· žR\ò îqÞ¥Ð,¿·ü;}ey/ÙmíÙ%†êl‘ž£ñ¿0ôØ¿6§¯¡j0éÖ0i׆=ä[Œyª zq\—‚¥œøŽÒ;pe’ <Èù³ôØÛé°øGM¹ÕVöÛS0 Ž·›Œ¶j¦‘ã{­fìé÷io]ÆÑÇwa\1}úSk^À—p±ð^‡6¬«m¯Ç1œÚ„ÑýÐ{úUK߉ºÅ¶§2ÛºÇjµm™caYèzĬ ¬±\‰‚£²7×>žõ×k:w…/5»qy=½Û8´k˜Kw#¡­%·º7§ÄexF¾Õuík+k‹Û ØÖBÈ…¶r§èEYÚv™áË E;HÒ;Ã'l‘¡õöö¨|]âGE×~Åa3ØÛY¢Ç BxeÇ ïš’ûM¾ñæŸa©ZÆg½@mîA`»ˆ9 2} \¹±Ó<-xu¦[k‰ÈšY÷Š@àb©ørúóĶ÷š-Ôï:Ë™ ÈÙòÝ9úV…¶ÿ^uý·l'N¡,\õÇñCþ¿Úº}燵3¡Ø}‚í#S0,Yš<òTѨh7DðV¡¢ÞÁ}{,1YÛŸ6I!•\ñØ ÷¥µñ¦s«ÆÒèvГ'Ër£æž‡Bk Á×·ë–ðaæ·¹Ì2Ü‚„rqíÖµãøn³ÞíTµ–ÿ2«þð.zc¹íGMüÝŒ i§ÄfíËL²$gæˆöÆ+£Õ4;}r×O¾ÔutËù­Æä”æМt8¨¯¼p`¼tŠÆÞæÎòÂL›Œäý+;ÆÑO}©Ei­.¡Y" pƒºþ‡æ%¾†Íí÷ü+ý6ÒÊÂT¸šã3Ét«•~À ö¨nu+ÏønT}ºÙ„Þ\)*t<â›e§ØMàû?í»‰-#ó˜ÛKå¶÷=³VþÓkáO K6x÷¦æpr)„c¦;5ù®æ_„,/ãÕÚIãx-c‰É¸B£aÇ=MhhvžmR³Kt×—Š ±±Û¨¥ÒµëÏEq¤]ÝI:]!HØXr3õÅcYø'^]FÛ}”ÖÁ\7Ú|ªëŸÂ-vÐkø¯U7·“ýªH¤WÏ•žLUÝWúåÌzžŸlfŽî%™£f«Î#г}á{­fdšÎrí&t|+™ÅdxÆþî-vHüƆ8•V6cŒPüÁ%Ð×–[_ h¶¶z¥‚_\HæVµ‘¸ˆtê>•ZÿP¶¸ð¬­¤[8„ÃíQn$ôàçÒ‘4›Ÿh–·^lqÝÂLK‡Ú%QÓ×µOghþÒîîoVî.HŠ8CŒ¨ç'Ö@é©CÂ%îïd³É–Þâ&¡<(ÇÞü*î•à¥7ÈdÔí§³BYÖ6;Èà }†»¯c¨Eicoc¨I;à@ Ôq\þ‹y*ßÚˆnƒáS×ÚQkÑ·>žKéLv–ÒÚ«ü«"Øùª>)yäÕþ݇¸·¸Œ:0…‡èjýï†tɵ|a-ei>xZ=Á~‡4ýKÄóhºƒXXŸ&ÞÝBmew¹§¨iêEmkmwሟV™­¡iËZ”\¾;ñèNiTXø{Fº»Ò®^òYHˆÌWiˆzcõÍWÕæºñNm}n,бŠXbí=˜¥/†mJZjRêk$:—±ÕÔ«3çŒg¸æ.=mäVÒqšs½ž3‚zR(ý@ý™gÀ¿ ƒìíÓýó^ž0kÊÿf FÞóே`†@ÒÚDb™;£¼~jÃõ¯S gÒ¸™¼ž¢’ À5ÜôýirA'=jµåضŒ±å»Zb!½¼i…ù¥qò äõÝbãO¹]3Lý÷ˆ/W G"Õ¿§øu—ÄZÛhkÞ·vHµ¶?òÏý¶ôÿ­ôô‚ŸšÔSRÍÍýÁó%šN¬ÔälüøG‡lRyÓ}Ãüï#òÌO$“ëT5=RçöšþÌÑ´=k…†[mGPÖ¼E¢´!¸±»‚ÞÒfŽC«æ«Í$  …ÝœÔÚ¿Ž¯>7êSx/ánµöo Áµ ý‡ ˜³­¼å³Â61õÜy¯‰`ëÄrL32<´Ìf¿B( ÊMö,¼³ylž'RAP }+„Õ¿e­nÃw–³¨?ÌWìµe]øSF½‰£›K´en¤Dª1ȧvâ~¡ð?Äzq?»-ïGå\íï€uÛ3‡±$»O_οlµ/ƒžÔ£ÚÚZÂsñ±ÏӜҹ cö]ð¦¤ù‹t G!ãsõ§ÌÅd~4\iöÜIc2ã¦?ʨËüÉ4XS÷’TàýA¯ÖÍoö(Ò¯dqm=±NÍ*•?ù×›kÿ°­ÃDŽÈÊÇò&«œžT~kÛiÖvîïmimnì>co¡aïÍ:êÉ/`š B¼n¥XØ×Úþ$ý‡¯ìã26™$HNÝíPO×ZómköGÕ,ÙŒQΘþé?ÖŸ2ò>Ÿð¾ÇLÔ!º³],Gp†H”dö䟅v‚&žÝ¡28Và¨b+Ôµ?ÙÿÄzy;Èáãÿ W5{ðÛÄxmÖBB?»‘T¤…ÊÏž¤ðŸ‹t JXô潆Ýå*·Ó•Fõ`ç‘]½ÇÃý7S+=Ü-5Ú¢ù“Ç+!$¸í®4=FßåšÆâ0U¥S`b?¼Æ˜¤Sß©6ÖÇ”^ø¢_ x¶ì_i6ú¬RŽĒF!”¡=¹ÍK¨h2xäÇ®iñG¥»äYäf Cãž;‘^}¥iÚ®ÓumovÃå *‚@ö=iöö©j¡0¨(QÑG¥P¬8»Õf𥽮Ÿ,V÷R$¡×|j:qŸçLñÜ7†e<0…‰[ç‚Ý8ÉèÀ ë|Iàû4-$o,'),j#û¤8­ 3M}61œÎÈH¢ácË|'b·:n¥m¨ aÓÜ VUùÄÙÀ Sí]©áøWV×׉çÛÒ0Š·ùOc‚ØïZÞ?Ñnµ½%M±yn¢: <¿ÿ^±´=?ÄºŽ¦ñøŠ[Ù­RK×fÜRßNÔ„ïÐÇÑ<[¨ëÒK¤ê7’OÚ4hXòŽGô¦i¾׬oí¥š²EÚà0` sž=Eu—ž±ðý¼÷ÚU³­ÜP¶ÕyKŒã¨ÈÈ?ržñŒP,V·2\I/îÚQ;Û¸$¡È={Uo»­²/G«øbÿX´¶ŽFŸ?jW;Y³Ô¯L}+ÕõèüAvÓÍ$3Ç'X€1ÓðÆ+t|7¿·¸fŽKgµ/À2ê¹ëŒuÇ¥t:N©¢ë771ÜÜi6Æ QÿhnW•Bãvð1׌/ØVèÌ]K ®Üé}ºÚÂâê‘í¦m¬[{Ó‹ÍsþĶѡ†ÞöD]ó4èX·?.z ÆñcO‰çi΂P)•)Ûô­¦Ðm¼Ag¦Ë}u%¥ï”Jùqãå,;z4è-v(ø²æé}嵸Ž˜Å%œ Äm×p±õ§x~ÆÚoj0ê†KM4H…\rË'ûõã­Z¿Ô§ð5­¥¥Á2\1–K ¸Èè})šœ÷Þ4Ñ<´Ýq{já„qŒyˆ}½E;u 쉡‹KðÎyªè—/}t©äï’0¦Çïc'óªÚ‹um|¾•u5ÅÜf ùæ7#å?Óñ¦è:LúBßK«ÛImd )::‘æg ïW4ÿìH"žëE¶¸Q†h㙃œq’qG¦Àÿ½¹§ü?×­õ g{vµ ´uUçvG§CZ·ׄïuÉ>Ó¥H]æù®RRÎz•é¥aøÄ—°ßDÏ<“Fí¶H™ÉÜŠ»7ûï·J°-½Å³9 ™öº/¸¥d;Ýö(x·QÔWÄ×¥åxä± øHÇlVÍç†äñm®Ÿª­Íµ•ÔÑm‘._a”¯×êz’ëÅ:]­ñ¶—K‡Pè"3Ê>vÀÇ^+ÆòKu©ÛËÝg4*Öʃ€¸åqìiú‰yww‡áî—m`ñA¨]ܱ¸—Í]ñ…è1Û·_­WÖ5ŸøH¼*%±·K7µœ4öÖëÃ÷\¯ZŠÏJZð½©ÔÐJÑÛË"î2'R|Þ¬7—àM#í:}ÒÝÜ^H\F2ˆœr:ÒÔ4!ðœBGÔc¹‰á°šÜ›“&6§¡ù«Z.‡¡ÙÌú…ž¢ú£YÆgKY#ØÅ€êFy¢ÿ„“Pñ†›{§\8k¶O2&peÛÕO¯™á}R‹[µ•à’Ö8²f’e*¡?‹ ûqF—{]4߉º¼wÑý²èÍc¼…‡Iç˜ÍWÕ¼ ¬GrÖö’ÝZ—ÝÈ7SÈä}{Ö¦iá;íR5…nÞieŽR ns3޵`ê*ÕâÖ.%RÛȲå…\˜£üE+}“¢Ôî´KW±³Ö¡–òú9n |cÐ`ðqô¬ßÞ›H´ÈtÂðif-ð²¥›?6qÜTú¯„/|G4z¶Ÿ´7q‰Z6p_#­M=Í·„´«-7R³R¸,Ó4NqägŒëÅõ*i¶·3Ð^Ö[…’ÅÃapÝT·ëV4ÝoGq«_¶ÒnFªú•¾¡oh Û-˜ä‘Ó#°Í.—ñ f¿I.íí<†r»Ö $@{ƒíš,ý´¼ÇjÞÒ®õyÏöÌ:}Ü„-r¨Çz‹[ñUÏ…ïIÓsœb2sæ¥Ö¹íkM¼³Õ.¼Ø¤—s–YJœ8'‚zèõ?K–=S2F.zÖWƒaiu ¡5œ°°¹ÝÀUÇûæ´tÿ imv­°—‘G—haۺм¾ìç®­î,/îpìCŸœ†>ƺ-RÃK¸¿Ú—’YߘFï-CmÞõJ_ê)|ïQüˆŠô¡ñ™u¨^‹ëXg¹·¹Q"´h[n{Q¢ ;£CVÔ‡4«+M.bb—3¥2ÔV×÷¾+Òn,f‘¥»÷Ñs÷€ê*[{[ ÛÇ­ù¨d”¼§"ûþ9àÓLÖZVƒu.ŽòÈò¸ŽIdÆôœ”õùµüÊžðî§o¬E4ÖòÙÃ^Id_”OCš¹e7†gÔÐKm:3Iò>ÿ“vx$z{UëwWwßÙ÷—Mmt¦;IèE'ü º»]$~N"fÇžQŸ¼psSЭnzƯ|“ϽApqo åN)aˆ8·3lP»›©Ç4Û¦ ‹ßiæªÂÜó}jV{Ù@$4Xú‘Фò›“„îu!X÷#<~°æ=Vr9º{bªÃ/Ù§eô=¦ec¯ÒáÚ;’NMoÛ’ ÕÈZx¦8ÈUÏUæ¶­|Sc3 ÎÑóœ0¢Ìµ$ŽÚCN9 }Áª‘jv× pè7U†yeÝÁïCE&™ú?û(ÞÚÃðýb{ˆ£™¢·ýÙpágˆ¯qgÜ8ç5ù‰¯éúŒ6zN¥aªMgµ‰&€”`‚·å_oþÏZî©á ÓU½’üB°<2ÍËíx÷'¾09®F’:5m¶zÍÊÚ¦÷ €æ¹½_Äqh6gQºO>êRÎÐu•û~ÿ¯éK¬ëÙ[M¨ß1[8Ž5ë#vAêIÿ=kkàÿÂÛÿˆZáñ.¾†+e8Š/á‰z„_~™?ýaR3càÁÛ­bñ¼SâLË4çp ÆïE_E¿×$_ð¿ÃïkRøž-þÝÒôhòcWÐüAåC®ßª[ÅnEÄoé]u#«,CÍ “(Ufú(’Ò8ÑcUE @:·§YÒ½–ÿ†ëO¼™AJÆw‡|?aá?éš•Ùt½2Ö++H7³ùpÆw1,pªI$ã“Z4QX¶Û»4ÛDQE (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ «u¥Ù_0k›H. ,JÇœŠµEs7 |3|ìÓhð1bIÁe€Šå5OÙÓÂZŒN2G!è͵€ü0?zóηûèÑ“oÔ¤sg¢´AÈüAʼû\ýˆìîbv­]»"’ üÀ­W;,OÊ(ã?ÂES‹CÒã•^ xdCñ¦9õëŒû×é‰?`û¯,ºØ,ªN0›d?ɯ+ñ/ìCya! §I‘ 2=qÅ>"y<ÏŽÙ `€kˆÔþ¥åýÅÌ7‚Ý$mÂ6B0{ô¾¶ÖdÍ^ȱnW?ˆ~µÅjŸüI§“….÷£ þ•\é‹‘žYc`¶61ZÄ£ÊD †‚¨5Äx kJ×ãÔ´™nÑš?/}¦íÑŽãåì*ökï‡^ ²'̲Ýî“ýEbÜhÚ…™&[+ˆÈîÿ1O™tdò>¨óí'Hºñn²ø†I¥LZ&ád率éUüGj<¦/Ø<÷K‰—Ì‘ØUÀéžy®õä X1esÔ¸Áýj½õ•®­jö÷H’ÀÄ|æ*®C]u¸|ig6•W1NÈd‹Î”:†_|>´š?‡u/Ý¥Åú$6Ö »Ê’÷F:æ»?ÃvDï-¥¨ÜmbX·°ÏJšúÊ-FÎ{i€)*”§v++Xå4?ì«ÕŽêßN³‚á²ñºOóFÝ·!= â­ï® Ô¥3HñÞG.IÏñg¥t–_ ®¢º‚I¯a1#†"2wàsÜu®öM6Õä%¤H|ÃîÏ®qŸÎ‹¾‚å¾ìàõŨêR\G¨ÛYÏ*‡{Y² ±ô­2÷_o O‘kS,âCÔ~Ý;ióÄ wÊ#L€?ÞöÍN{¾ÆWŒo.ã×ä_0Å*ˆLU|¼eqZK¡Éâý"Âõîaµ¹MгÜ6ß8/B=êΣâ -6x´ùl!Õ^Ò1Í!Ã:€GjÌñ•Á¼m6hcÛ¦¼XŠèüKõ¦üÂý‹íü S™7—wŽ6£aã½ý æ¢MU¸Ö¦Yï§·¸gfÄ=Ýð{sU|QâÝ'Xk;{{dXâHÏqÃ{çÖ‡w¸½ oe¦øfÊG)g•¥‚ŽÙ"SëžÇ®)××–:g…š]JiÕ.$‘¿x¸äâªÞXÞøßI³Ô Fžö"mç^™Ç!†jm3Lo é7²ë–çÊœ¬idü0s»Úš}ƒÔDÔçÖÆ“<­<7HBdçË déïM²ð§ÄM1Š;tmï”íÔZZÆu£#\Ë¥ZM¦±e“pÆ9ǽs6šÝåêN—qBÇ Ï#³¡økPÒõD¼¼…­mí²ï&àCq÷Fzè´ÝM¼)x–§w˜sŒöÈéK[i ô¾§GÉ–Ü©RÊäS.þx\óÀëKÎG4Ë‚LüG¨Gšk`j\}Gòª±Ä$˜5o\ÈÕ.3ýïéP[ciúÐgÐzX<Ÿu‡ãSÇ¥\¯H÷} Oh~aŠÞ°¸ßÒ›VCZî`Çk<$n‰ÇÔUëiåŒ ¬Êsë]4@p:Ÿz´–±É÷£RÞëšI²¹Q麊ÄÞqâÛlRíŒûgàÔ:g‚å¹¼—ɳ†ÞÕ³ÛÉÈÔäšüùð¢ io#ˆâÜÊ:0Çó¯ÑÙóáíÏÄk2Ñ2ÖvñÛK2tLù*oaÏçô¬'duBú÷Ã?‡úůÅ©ßDÖÚ=©Í¼>X×ûÄwséÿ×5õž›i­¬K¼Kµ#AÀ[CÐìü9¦Cac†Þ!€;±îIîkB±,(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÏºðö—}æyúu¬¦Lîf‰wõ9Æsï\þ¡ð“ºŒL¥"3ËDc‘ù’?Jì(  Öf/ ê`yJðwE|ý1ŒW®~ÅZMìŽ-§¶Øz4ªTþ@ç_NQ@ ø‹öžHžHì–E••ÏàÍyO‰ÿaË»?™ôLJvv“LãÒ¿O¨ w?5¯ÙT±f1GÖ|5câ‹íŠÙˆåNÐûSôŸ ÙèK*Z®<ù˜ŽO¥}?­~Ⱥ•“7• Éþé?Ö¸m[öwñ ƒ1_0ã¦øóúÕs¡r>‡ˆø§DmsFšÙI}èÉC$óË ‘ ž€ ½z`¼¨ùï\ωüoâ{ˆçyÚÞH”È›·èéëLV¹ËxÍÓTÒ-fÓ¤‚x`“Çf¤.OCŒ UO Y$ÖÚ”Wa °h|Ì1†þ¾§­w¾𭿇-ä‰%3´Œä#:è*iêšñÛgÎJz¾;S@¬s6>±ðô’êI,×RÚÆdŽ ¢(s޾ø¬Ý'Ç©¹C=ËOj͉## >ŸJ¹á£â‹F K¹¯ ’ó,wD•ÛÓoÊ·Sáîhés›zþQqµˆü:{S½¶MîpúŸƒµXog0ZMqlÎLs*ä8<ÿZÛÕÛF„YZjÐÍuoÇ$ÖïŒz늊ÇDZÙOpºÔ“y¬D–÷; îí Ž*=CÃWºåòêºu¹–Þé†9+éÉþT‡©‹5²³Ó-ô°ði… ˆUˆfló¸úÓtÈ®|_¢ÜX¼›®mXK ³7<&¶m---a²Ò5Hí„ò3M‹©¶$P=+¡ÓÄZÓ_ÛÃ$öWˆ%ãøIíWn|¥^\I)ó‘Ý·6×O>˜ãó¨¬nüívêÒPa€‘Çœ £¦*•ú‰Û¡oYû%ëÚEsnd™ÛzÆk/½Wñ,ï¦hñýž6HŒ€MºBÇ_J5Íéõ ;Û1¾DùX3€ þ5oU»HôÐ/-ÔyÇbÄä|ß•õ%[h5-, !£™0N{UOZÞé°‹iÄrB¬q"¸8_qÖŸ5´–:Dïin±ÊSåÚÇ`(ðœð^iQ°+æŽÈ4­0 çn¾3M¸LÛ¿|.y¡ÈRr3ŠdÌL/ÐŒEÞð ÇüQt„½½Œ?¼–p„‚>Pzdû×?â=>#Äúµ•²”··¹h£RrBzú?á ðçVÿkQoýkço6|i®ûÞÉÓë^­\<)áá5»9y¯7¥®K[öL@äâ°-9uç8®‚Ä`WœÙª5!]Äuõ«Ðg995NôçëZ0.çØVf¨ÜðÖ ÜýÔŸø×ë_ì'Ïêl@ ±'ß÷M_’Þ\ÝÝ û?ñõ¯Öߨ`cÁŠ÷X¬‡þBcýk ›4ögÓTQEdPQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEVïK²¿`×6\0X•Ž=9ƒðËÃ:—˜eÒa ùù•Á=ÀÎåŠê( *Õÿfÿ jQá"xœžY¸ÇÓù× ®þƺðfž';¼ØÊcÓÎkèê(â¿~Âo4’-´0ν™dPýõƒ^OâoØ^ö(ä”éR,kÕÌ$øâ¿K( w? õÏÙR³$ÃÑã¦Òqùáu_Ù×ÄzhaóïÇ_µ×z}­øQum È\íÆëŒÖÿà jR3Ühöì[¨@P~J@ªRk¨¬»ˆWß üI§ÌKÛ##ùŠÃ»Ðµ[N&ÓæP;ªæ¿jõ_ÙÏÂZ”N2G)è͵€ü0?pºïìo¡ßm§„“œù±”ÇÓÍW;!Â,ü~˜ø:cødcó¦±Y×õ•úyâØKí:ÛÁëÙ•Ôÿ}`þ•äÞ&ý„®bŠI¿²dH׫ùE@üiªÉök¡ðß‚ô‹»§¸’ßtÎrÌ®FïÃ¥j-¸(ª…WÓ:ïìo¨Y–0Ç<î’Gäk‚Ö?f¯éäìióÒ<Õ)Ä\ŒùãÆ¾›^–ìÌi2Œ%m ¯n}i¾ðTÚU½Ñ¿XØÌBy ‡LçÖ½zÿáW‰´æ%ìV\tkãÃÚµ›>›p€z.EU×ryZÒÇâmô+ÏìÛt‚fO›Ë,£¨ü«™Ó<{¯ê?dÓÖò+×…rµŽ0+ÒDd‰QÔôéΡH-CïB¯Œ#ñªärÛsŒ_‡ Ä’Á{@ïŸ*HIÀô¬YøÛH±»¹²¿Žâ8a"8|”V!«¬Îô=k˜Ö¼o«Þ½Ð¡wr…gÖ€±Ðhú­®­›k/™ۃǷjžææ;U;íç:‚¨èúL:š[@ÕêärÌz“Qkgu¬õÙ?ô!LxÜÆN #ÜŒSYO•@j'$" f\œ¢ŸÂ„8cžN+6çA´–ø]Iï±´2±zT ¨é¹~ŒhÜø!f`?Ú aåÊ0p£u¬ßh‡UÓÑa N„Vôâ¹h›wâ1>Òœ)Çd¿BÒrîjÙœ·®Moéý¸®rÓ ƒÒº-<àWô5FÜÁã5v>ÄþµFÓŽƒŽµ¡Ì@<åRhoø\¥\zùCÿCZýpý‡÷¨“œyvxÈÿ¦F¿$<,Úîaÿèb¿]ÿb… àkÐ $Giœž?Õ•…MΊ{3èÚ(¢²,(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š¯w§Úß…6ÐÜÎÑ,a±ôÍb_|;ðÞ¥#<úE»ê’+£¢€<»Uý|'©DàC$rŒÛXÃù× ®þÇ:ðfš"NsæÆSLg5ôUñoˆ¿a!s#¬ð\/fWPýõƒ^KâoØBâ(¤—û&DŒu“Ê*ã_¥”Pä»û꛼”¸Œv ÄÖ¸-_öhñ›»Ë.øè$Ž¿lîôû[ð¢æÚ€¹À–0ØõÆkûá׆õ)çÒ-Ø·P€ ü”UÌКOsðçRøKâm?p{/4g¤ç\¾­àíWj¤ö3ÁµÕ÷ˆ÷ƒžƒé_¸¯ìëá=J#ôcµ€ü0?pº÷ìq¡ßmf„“œù±”Ǧ1œÕ)²y"~5M±BóÀ`Pþ£~J«wRùWꇈÿa´Èë½½Âö`êÿ¾°kÈüOû\E“dHˆ½dñªU<‰ök£> *§;O£ :_'8ÚÀŠú‹]ýŽ5;ÞGÚc²±#õ®Výš¼I§Ú ùk?˜æ«Ú"\CÆÌD „–\óŠï5„Þ#Ó‹ 4³(õ†R¿¡ÍswžÕ,›ØÝEÏ,bÞ劾dú’ã%ÐÉRÅOj" Ž "žÊÑY_÷SùKj##׃L‘Œ£Ž¹ª×¹1Î8«ÇdóíU¯ãÝnäÙ GškGþ&w'ÇTãlƺü1©x£ÄÇJ´’òîVÈŽ1œR{zìì¹ñ,AæÅáãt„g΄þDŠM¥¸”[[wi.XWC`ÙaÎ*{<Ð 7ÞÖ AÕ…«:þkš‚ÞÖæÉÕn­g¶#¨š&CúŠi«Œ»ÖÙ´íÆx'+&ÉÕ ‚?:ضÆàWŽœÐYÐxiC\\ñÿ,׿ûb¿^ÿb»)!øm-ÎͶò‹xã9ä•…KèB¿2¿eÿ‡¶~+ØøcQšh-5°¼Ðcz ÙÊçŒñ_³~ðF—ðëÂöZ޶V‹µZR ޼ēøtv®i½ltÁZ7îoÑE (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€+Ýéö·áEÍ´7!s´Klg®3Xwÿ<5©HÏq£Û±n¡Aù)ºJ(Ë5_ÙÇÂZ”.2G!è͵€ü0?pš÷ìk¢_mg„“ÞleôÆ3šú:Šø›Äß°œeò­ ¹EÜ…NxÏàŸÊ¼›Ä¿°\ñÅ$ߨò"²™@ükôÊŠü€Öb›èŒ+sÿdçù×;ÿ e¯ÞÎ!û\±ÆÇ´98öæ¿fîm ¼Œ%Ä1΀çlŠgתiJr4Ë0}D þ\ÍuIŸþᆬ–Y-D*øi®î/1Î:÷Ç<+ê[Oµ·Hü©IÀ¨Éúb½Š‘žg¨|ðíÔx…¦…óÉ|8ÇÐüë”Öÿe/P@©-½Êœî[˜pþ…š÷z(ä/þÂz¢ä7‡´‹½Ã%â‰þxS\­ÿíðú²Ÿì ˆÍÓ~E±_|ÑFû>dý›ÿbŸ |ññH·¾›VXöZ¥õÈ‘aÏW |Ø8'ñœúnŠ( …Q@‚Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ÿÙ endstream endobj 8 0 obj <> stream xœíÝO„dçúð!„ßâB!‹.ár!„B!„KY„!„!dBBaa²Â0 C/š¦iš¦MÓ4M/Š¢(Š¢EQœ_×ôôd&ÓªºÎsžª·>ŸÅýMîTÕóÔy¿¿÷ÔyÏ{ª àoãa¿Ûít:íN§Ûíözý^0ŽÆãì°ðV«ucie·Xeãþr'èÙMVÔ¨×^ú¨®þ5’ S™Älv ;­£ãìdkØÓùjvë¥×ïäZ"“R`ƒöÑÁê&èS•®aÜk¯ÜYüä(0›Q·u|”] eøôÿ ‡#7—vLA/5˜8‰Óá`8šüÇðÉ?œüY¾sÐyœ&êh4šÌXGãOþy<šü9û»¢ ÚG‡‡Ù9T®áé„u’°Ã'©:ž¤ë(û[j1îìgçÌ*:™¢N²ttš«çÈ>4€+»Ç‡4ÍIŠ^ú??ÍQy ‹iÜm9‰ÏurZù_8‹Ñ—¾;¹ Éúã#’ß…sQ1 yN¦ GtEdlPœ~ÛtÅdrPŽA÷øÐÏ «.û(„%5êœÃ PlQ×àžœî›š}X^`4Ìþð‚AçÈ9<çYÌ9é°½w˜ýàÌd1ýåb/>{*û€<ñxûÆìýöÑ oNÏ5å´£ÎéÿÏßÎýP ]‡§Ùãˆ5î¶ö¶³¨Aö`b :Çöd¢ÙŠÕ2îµ\F¢0Ù£ŠÕ1p‰"e,V¸w|èÇ*{xQ<‰§pÙCŒ’&;Ó»ŽDá²Ç¥´(+!{¬Q Q÷hO‚²*²…´O4û¨†&e:Ê1žLA%(+&{ÜQŠAë`o7ûp†Ùct÷w%(«*{ü±ä†íƒÝ{Š°Ê²!K¬s(@AŠr-£“Ý– pCŠ2»þÑž…g²G$KeÔ9 ð¢ìaÉÒèïû^–=4Y£ÎþöÖVö± ‹){|²èúG;Û[Ù‡),°ì1Êu¶7·²QXpÙ•Õ?ÜÝÞÌ>:adVϸ}°³)AaJÙ#–ÅÒ?ÚÝÜÈ>(a©dZÆÉt[‚Â̲‡. ¡¼»%@áZ²‡/ÙÆƒ­ ×–=†ÉÔ?ÞqsÊÇ$·÷·6ײ?(@ö`&Aÿȯ P›ìM³FýÍõõì£J’=ªiNïpgC€BݲG6¶ö¶$(„ÈÞ„ëìl¸Œa²‡8‘Ç;›ëBes‚Œ;û[=Ø Ð?r “=à©×¨µ·év$hRö¨§>Ýým—‘ qÙ#ŸZ Žv7×$(dÈþÌkÜv7dÊÎæÑ;Ø ,;¸¦AkÏRPXÙaÀìFí=KAaad'³él®=Î>h€çd§Sïn¬=Ê>`€Èަ1nïYÈ *;¸Jÿ`[€ÂËÎ.1jíú]vPpîÁ–…e¼lp´³öØe$XÙ‰Á FíÝM K%;6x¦ç–Qvt01lí¬?2…¥”töœÃÃ2ËΕÖ?ÜZ{ô0ûæ’$«jp|r/@¡Ùi²Š:{(”";QVLÿÈ9<&;VVÇèäþáƒìï¨[v¶¬†îÞÆc eÊΗâ ·?¸Ÿý5a²C¦híÝu ¥ËšRõ6ûVAvÚhØÚY{ @aUdGNaº{(¬”ìØ)Çä2Òÿ²¿O iÙÙS„QËRPXYÙ´ô&·sšÂ Ë¡eÖÛß|ô—•L°â²“hIŽ·=0¤èìÆ­]7#ÏdgÒréîm<ü3û+Jv.-ÑÑæ£¿$(ðOÙá´:»(p¾ì€Ztýý“sø{Ùß°¸²Sj·Þ Àå²£jAõö×P` Ùqµ€ÚÛïÝÍþ^€e‘Y cÐ:ÜßßÛ]ð§f^:·Þ{åÆ×ÞúàËïýsm÷°3<ÿïõ6Ü»ûGö7,§fƒ­I{oœSîo¿ÿþ'_Þüá·{·º£É_ÛzÜxÓ‚dg]œŸ³[ ¬„쬋#E&dg]œ_²[ ¬„쬋#E&dg]œß³[ ¬„쬋cÙ'Є쬋ãN  ÙYÇvô@²³.Žšuq¤(Ð„ì¬‹ó »µÀ ¨ NчÙÍVAvÔ²É/;é"­e7XÙIi3»¹À ÈNºHëÙÍV@vÒErFÄËNºHÙÍV@vÒEÚÉn.°²“.Ònvst‘¤(/;é"d7XÙIé8»¹À ÈNºH­ìæ+ ;é"u³› ¬€ì¤‹ÔËn.°²“.Ò »¹@ñJÞ]´ªFÙíÊ—t¡Æd·(^vÐÅú4»½@é²c.ØÇÙýJ—sÁ¤(,;æ‚}”Ý_ tÙ1ì³ìþ¥Ë޹`_f÷(]vÌû"»¿@é²c.ØçÙýÊv¯ôµ^ˆ•rѾÊn0P¸ì”‹&EP²S.š«K@¨ÇÙ)Í\µ–rѾÎî0P¶õ씋öMv‡²md§\´›Ùʶ™rѾÍî0P¶âSôVv‡²me§\4) „ÚÉN¹h?fw([ñ)úSv‡²íe§\4sQ Ô~vÊEû-»Ã@Ù²S.Ú½ìe+>Eïgw(ÛQvÊEs歹rѲ ®rÁ¶² ®“sÁÞËn0P¸nvÌËî/Pº^vÌÅrm VxŠf·(^Ù)ú(»½@ñ†ÙAêìöÅ+:EÙÝŠ÷ó(;é"}™Ý^ x·³ƒ.Tvwò¢6"Âý’t‘<Š÷kvÒEú.»»@ù~ËNºHŸgw(ß줋ôYvwò¢_dw(_Ñ)úUvwòýžt‘þ—Ý] |R`E§¨kô@¸»ÙIÉÍ@¸{ÙIéëìî廟t‘Ü»„{t‘new(_Ñ)úCvwò=ÌNºH?gw(_Ñ)úKvwò=ÊNºH¿ew(ßzvÒEº›Ý] |›ÙIÉC€pE§è_ÙÝÊ·t‘fw(ßVvÒEzÝ] |EÏEew(Ÿ˜ÇNvÒEZËî.P¾½ì¤‹ô8»»@ù²“.’¹(î0;é"mdw(ßQvÒEÚÊî.P¾VvÒEÚÊî.P¾vvÒEÚÉî.P¾NvÒE:Ìî.P¾nvÒE’¢@¸^vÒE:Êî.P¾~vÒEêdw(_Ñ)ÚÍî.P¾AvÒEêgw(_ÑsÑчÙíŠWô\´ú$»½@ñ†ÙAêýìöÅe]() û©ìý(»¿@éngç\,) +Ín1P´‡Ù!îËìE{”ráþ—Ýb hå§èÍìE+?EÍEH³C.ÜWÙ-ж–rá¾Én1P´òç¢Rˆ´žrá¤(©üõ»(i#;äÂYuD’¢ó(?E¿Ën1P´òSôVv‹¢•Ÿ¢?d·(ÚfvÈ…û5»Å@ÑÊOÑ;Ù-ж•ráîf·(ÚvvÈ…»ŸÝb h;Ù!îAv‹¢•Ÿ¢ëÙ-ж—rá¤(é ;äÂd·(Zé)Ú?ÞÉn1P´Ã옋Ôk·ZÙ  w”tQF] 4 Ìíw:ÝìΫá8;ðj7ê´»"hJa)Úo·³[ ¬”VvîÕgØ9>je÷X5¥¤h¿}ÜÊî%°ŠJHÑQ§ÝrähgGà¼ú $êd§à<Æ'ÚÊî °ÚzÙIxmƒv§“Ý=€åLÑqÏy<°–0E.Ç‹£Ÿ‰³µ޲{ð·Av.Î`p|x˜Ý/€-KŠŽ;GG&¡ÀâfÇã4úm ,¨qvB^¥×:nYÑ,¬QvJ^ªë4Xl.î\´·¿½¹•Ý€ËýÙL"Þyÿ×nÜxu}†¥}7»7Wk*EŸ¾ÝÇÓÿ+¿§ö`:÷ã’óo½áÔ;ñ}›Ù€)5•¢[ÏÞqÊaçÛOóº0­¦R´º}öŽ[ÓþƒÌ¾LçAdr>oûì×.ú½ãã£Î³»Fý̾L§±}vÅý÷óþ×ã{ßÝ9½uó`’£ÃnË:Q`4Ÿ¢ß½ð_üúýÏ¿þñø¯ç>Ò°×>¶é°$KÑ{gïøÙ³ÿª»þÓ×_f0·‡M¥èŸgïøá“ì¬ýrK‚ËïQS)úÇÙ;¾_õÖùêóÌ¢jó88€X®Þ¬Ç[W€eœ¢ÿÍ® ÖFlŠŽßÏ. ÔflŠVm³Q hÑ)Z}]!@¤ðý"»B€HSïSw]æ¢@ÑÂSô‡ì "íD§èÙDÚ‹NÑß²+ˆ´¢\ý–Wø\ô~v…‘ö£SôAv…‘ÂSôQv…‘ÂSôVv…‘¢S4»@€P‡añ9~ð¨m* ”.,E“Wͯ¢@ᎣRôÛìʚЊJѲ+hB;*EßË®   a)êQ!ÀJèF¥è§Ù•4!,EíÎ ¬„~TŠþš]@Q)º]@ÂRt”]@†Q)Zý_vi ˆKÑϲKhÀ(,E·²Kh@\ŠÚXãRô»ìâÂ=ˆ Q“Q`„¦èÙÕD{™¢ÕkÙå{š¢›Ùå{š¢Õ­W³ œ¢v¼ ¢Õ²+ˆ´¢f£@ÑâS´z;»F€8ñ)úSvq¤(À<6ãSô·ìâHQ€y4pFÿ{vqHчÙ5ÄiàŒ~=»F€8Ûñ)ê‘Ê@ÁHÑýìâ4¢GÙ5ÄÙOÑVvqöâS´›]#@œýøíg×ç >E=} (Øa)Ú}/»J€(M¤hu;»J€(¤èÙUDiâwÑêÛì*¢42•¢@±Iѯ³«ˆb. 0ã&Rô“ì*¢´šHÑ7²«ˆÒn"E³‹Ói DmÓ ”«Û@Šþ•]$@˜&Rônv‘aúR`M¤èÙE„4¢÷²‹3l Ed fÔ@Š>Ê. LsÑõì"ÂŒHÑ­ì"Â4‘¢{ÙE„i"E²‹ˆò¨‰]Ë® ÊÃB´º™]%@”FRô¿ÙUDi$E_É® ÊãBt?»H€0k ¤è/ÙE„i"E?Î. L)úVv‘aÖãCtäâP®æ¢[Ù5Äi`.úkvq6âSô‹ìâ4¢ïd×g3>E]\ ¶¢GÙ%ÚOQJ¶ž¢¶ÅJ?µ-P²ø¹èkÙ%ŠOÑW³K´¢6Šž¢fWi?:E¿É® RxŠ~˜]!@¤ð}3»B€HÑ)ê=P´ÃèÍ. Tô\´] @¨è¹èzv¡ŽƒSÔŽN@Ù¢Sôvv¡ŽnĦ¨}ñ€²EÏE?Î. T+8Eÿ“] @¨vpо] @¨NpŠÚ£([78EÝ ”-x.:ή VpŠv³ëˆ|Fœ]@¬^lŠzêP¸à]Ë® V?6Eïf×k›¢?g×k›¢ße×k›¢ž£ .8E?Ï® Ö86EmŒ”m-8E?Ì. ÔzlˆVïgj#8Em/ ”m38E_Ï. TtŠþ+»@€P[Á)úJv¡¢S4»>€XR`±)Úÿ,»>€XÛ¡)êWQ t¡)ê¡K@ñv"Sô »:€h»‘)ê¡K@ñö"SÔ@â…¦h?»:€h¡):ή ZhŠZso_ŠÌAŠÌCŠÌã@ŠÌÁ\`R`±gôod—ì04E·³Ë›¢UõAv¡b­*›Ýe;’¢s¢óˆNÑϳ ¢_eªœ¢ßd*:E¿Í. T;8EÊ. TtŠÞÉ. TôýïÙ„ŠNÑÙ„ŠNÑÇÙ„ŠNÑìBE§èVv¡ºÁ)j‡Q l=) 0sQ€yHQ€y8£˜G?8Ew² 5NѽìB ƒSô »@€PR`£àmei+:EÛÙDÚ Ѫ“]!@¤qpŠö²+ˆ´¢Õ0»B€HÛÑsQ) mWŠÌa/8D«Qv…‘­²+ˆ>•¢@Ѥ(À<öNÑïo¿šS(@ˆø}ç…÷û±ZKª BüýÖ ï·Vus ?}a©Óí±Í§è sÏûUõUV©ÃS´ÿÜ»ý~TU®.%‰OÑás1zÏ®Í@aâSôùF7ªþ[yµÔï¨míwgP}šZ-@ÝHѪ{vgÿᎇÙ¥9n"E_ðßì’jÔ|Šº±(IBŠþ_vÍõi7Ÿ¢¯g× PŸ„};»f€útÑß³K¨Qã)Úw(P’¦ÏèÞÌ® NMÏEof P«¦StøQvÅuê6œ¢Uµã‡Q  ͧè?İԚ_éT}œ]3@}zͧ¨G†é7¢í[Ù5Ô§ù½]2@†M‡hÇf$@IšNÑÞÙÔiÔpж¯þHK¤é­6?²ê(Hã)ZUïe× PŸ„µ! Pqó)úcvÍõi>D+«î‚$¤¨½ñ€‚4¢³K¨Qã!:°ì(Iã)jwQ (§èÙÔ©ñ­þÊ. FͧhõIvÍõIHÑVvÍõIHÑ~vÍõIHÑìšê“¢¿g× PŸæC´mÙ=PÆCtçÍì’jÔxо–]1@OÑ»ÙÔ©ñõÄ ( )zä¤(GBŠVÙ5Ô'#Eÿ•]4@mB´ûïì¢j“¢î] Ò|ˆ¶^Í® >‡è‘…N@IOÑ/²+¨Sã):ú4»d€5ž¢Uõà•ì¢j“¢Õÿe P›ŒµÁ(PŽŒ}?»h€Ú$„èÁçÙEÔ&!EÈ® >͇ènvÉ5jE­ºJ’‘¢6$Ê‘‘¢–:åÈHÑÛÙEÔ&#E?Ì. 6 !ú0»f€ú4¢[¶t Òxˆö³+¨Sã)Zy(P’æS´ú#»f€ú$¤hõIvѵÉHÑ¿²‹¨˜GFŠºw (GFŠÞÌ. 6 !zÇZ' ͇èú›Ù5Ô§ù5JÒ|Šþ”]2@šOѪòà% )ú8»h€Úd¤h/»h€Úd¤èFvѵÉHÑ;ÙEÔ&#EÝ»”#!D]\ Ò|ˆ®½–]3@}šOÑϲK¨Qó)ZÝÊ® . zânvÙ5ÉIÑê_ÙuÔ )B¥(P†¼­ÞË®`nGƒ´Ýy#»x€ùõÒRôÛìÒjÐÏ Ñ‡Ù•Ôàx˜¢¿gWP‡nRˆZt¡5ÊJÑjãÃìâæu˜w…þDvõsÚO»´ôÄ;ÙõÌe¯éEƒáø¹ü »sé4¢ÝÓéÃí'“à²0öøªØ«Yûï÷þcTUkî–Y«é­ZϽûZU½ŸU9@ –Û=÷ö¿µ,»–ÙQó!:êf P—Ä5NÃì¢êr±Pt]5@MöS¶Ã“¢@!_mª—]7@=š^mÿT?»n€Z4¾Ú^Š%IÛ ïvvå5HÛܾz3»t€ù%¬¶?óZvísËÜ–ùõìâ敲Ú^Š¥ÈYmÆï¢À’KZmæÝìúæ“´ÚþÌ¿³ë˜KÖjû3³,µæ÷¶ÿ‡Ï³;0‡ã¬[–žù,»×—¸ÚþÌÙ=¸¶ÌÕögnf7àºRWÛŸù>» ×´—ºÚþÌoÙm¸žäÕögîf÷àz’WÛŸ¹ŸÝ€kÉ^mf=»ב¾ÚþÌfv'®!µý™½ìVÌîhŠ>ÕÎîÀÌaµýÏ–ÎB¬¶?3ÌîÀŒr÷¶Iv;f³»«íŸÉîÀldµý3Ùý˜É¢¬¶&»!3Y˜…¢g²0‹… ÑÐ=÷"_X=ù{Û¿$²ÜËQZ-Ðjûg^ ¬w¯¾:°z²ó<‘)º#E:eæyF¼íÖ( >ÝELÑnhÉ›Õ8ôõÕ’˜ç¹ZñF5 }}`µd'æybºa. Ô';0ÏõshɛըúÀ*ÉÌsŦèFô¯À*ÉÌsÝ-y½ªÌEzT‹™¢¿‡½VݼÔ$;/Ïw/´æG®.µÉÎËóÝ ­ù±U÷@]²ãò±)º^lêÔaA­ªû¡eoT–ÝõÈNË‹<­ú$EmGÔ";-/²Zõɽõ¢@²ÃòBÛ¡e¯»ºÔaa­ªvháî£ê‘•—ø4²îMsQ ÙQy™›u;£j‘”—ú5°ð5) Ô!;(/¹bô±ßE:då¥6 _“¢Àüø ýÄn`é'sQëE¹eçäå+TUvÆæ–“—‹Ü.DŠ5ÈŽÉ«–þ°òÃ(0·ì”¼Êkq¥?´§0·ì¼Ò{qµ›‹sËÎÈ«ý7®øû£jÔŠ{y`dgäÕ>¬~½ß P¼ìŒ¼ÚWÕªñqàË+ ;#¯ös`õ}7ÒsÊÎÈ«E>À®ï=0ŸìˆœBäô½jìwQ`Ù 9Þ«qõw«ÊôÀõeät^k@Ûãë€9dÇã”ÞŠë@ÏôÀ²ãqJÅu ãôÀ²ãqJßÄuàHŠ×—ŽÓú)®‡•£Àue‡ãÔÇõ`×v$Àµe‡ãÔw»ß±5pmÙá8µÑ›a=Ø”¢Àõd'ãLâöÆÛô»(p þÔÏ—|Ö‰ sQà:²cqF?†5â±®#;gô0¬k')ù¨f LÙ©8«ã°;é׫ØÞeÊNÅ™½Õ‰“3úÊf÷ÀŒ²3qvawÒOj. Ì&;¯áû¨^LRô(êÅ2e'âu„Ýz’¢Îè™dâµô£¶½ï=0›ì<¼¦‚Úq×ï¢ÀL²Ó𺾠êÇIŠV_L/; ¯ëAP?þ<™‹ú]˜Ö²Ý?ÿ·aУ')Zub^(Qv^_Њѻ#) Ì ; ¯ï— Ž <˜^vÎáà˜–ô=J˜Nuc©S´z?¦-) L);çt+¦+R˜Vv Îiçí®´¤(0ìœ[Ì)ýaU B^(MvÎífH[v=2˜JvÎo#ä*ý¦¹(0ì¬Ã"³n. L!;k²UóZU#^(JvþÕã â^úu) \);þêq/ýCgôÀU²Ã¯6¿4篓Ýx]  ÙáW›µ€æL¶Æ“¢À¥²Ã¯6Íùõäu^(GvöÕ'âI ·O^·ðº@1²£¯F ù¡ò(eà2ÙÉW§Gý‘¢À¥²ƒ¯V¿‹þtòºG¯ ”!;÷êuøïú;4IQsQàÙ±W·€Íñ&)Úªÿedg^ý¾«¿I·N^¶]ÿËËnyŸ<™€F¥(pž2C´:¬¿S7+RΑw1&ßž¼l§þ—–]vÞÅHÑÉÕ¥^ý/ ,¹ì¸ 0iü¹òÈà%Ùi%à™Ç?ÍEçUOþ£PÀ†õ]]^t¡^©¿_) ûÈ‘fi>‰hääñu—=Ïéуý¿?Á¿">!-ÉÅ<6þëK_ym£ýüGØ™H‘”c¹ÞiågÕśݯo·^üæ¢Pˆ”˶ÓË/ª St«õÏÏ E¡ ¶ÖŠNܬ.xèæáø¥ÏðzÌgšÔ||-†iVÆ_Ç)º¾÷r†š‹B š¯…ó«èé5ú—–P=Úžû!Þú@sš®Åöl¤/«—Rt}­sÁ§x+êSMi2¸Ê÷Qý_õG)oì .üÏ}šÕ\l-˜°ë:ŸW/ÌE×vÚ—|Š +\@3š ¬E·ýãçRtmãèÒ!Ea©5X éÛ°®N®Ñ?}”òúæå*EaÉ5‘V‹*îÉN梣' Ù:¸òcØ–Zaµ¨:¯Äµur-iÿÆýÑÕŸãqÜÇ¢…'Õ"»ØØÉ ´½³ßŸêƒüòjà'ņÔÂû,°µ·O^pñâ¦øÒ¶N°”j)¼ØÛ_º3}”¨{¨€PAá´,úWwhfú,Ý÷B? "(œ–FЦxO=žíÃl¼úi€1Ù´<~ íîæŒŸæWûãÁ² I¦e·æ~bwÖónèÇêLK%òý‡³~kïaÉDäÒr ½.¾Ñ›õãHQX2¹´\"O¡ï>œùãHQX*¡´tÎ6G~­öUF¿mÌþq,…¥QÉÐ'žÞ/t»úñãúšÛévîß™ùl~âÃú>¬î8ZRï<ëÆŸÖÔÙ^wTõf¾:ªÆ(‚ÕšEËëç'{€ü8ùãíêèk«=ÅNªå#¨)…–ÞÍOþ}ã›Ó?Þ®c§änUM½ÿÈË>©á¨'‚ ssþ¾¾>>ïaóS«ëW \]ÁS”Ѽ7`¾öÁƒù>Áÿjùrp®ÐŸo¾åN¯þûî¼àËš¾` Z‘S ûóì7ÿÁó€ojû†Pó÷Bݹö~óÿý¥SÃûWç· Ä¨„è%®ùÃä{?¶jyûêý®µ ÷R®3}ïÖÕOJžÎOµÛ@ýjð…š}{’w¾½æJçø9àûjåêünÍØÐwoκ¡ýe~ ùÒ:Õ8ä‹´9[;ÿ·^ë»ß‰ùÒÕ:è ôt6øÅw7?¹z›ºÿ=˜ç¦ùsüüíó«wÔ—ç‹Ó6½qòÇþáÚÝ?ÿ迵òË{ýºßý~S‡p]uûâ<Ý*ïË¿ÿ›ÑñæÝï¿ùìýìCÿæ÷õ,nzÁƒæ`6õü²ô.îÓñæŸ?Ýüß³óüï"ÞþaÖqL+bè—äé)õñÅcp¸~ïöçïÏ}Ëü¹ÖràJ!C¿$§[ÓÝÉzûWËJ‡¥ñæ¤K?¦½ýVòñ\!-–ÆÏ·n~µŸ÷ö;ÙGp¹¼x`*{ÙGp©ìŒà*‡Ù‡p™ìˆàJÇÙÇp‰ì„àj­ìƒ¸DvBpµvöA\,; ˜B7û(.b_ѥлú›’dçÓèg&ÀE²ã© ²àÙéÀt†Ù p¾ìp`Jãì#8Wv60µìC8Wv40µìC8Ov20½ìcx™•¢Ë$ûhΑ Ì û`^– Ìâ•ìÃø§ìX`&R‹ßD—Í¿²àEÙ¡ÀŒ^Ï>b€dg³z;ûž— Ìì½ìcxÆo¢ËèýìÃø[v p d5À3ÙyÀu|›}Øg²ã€ëµ²à©ì8àZFì8•\“Ç×Á"pu~y¦`¥dxêç””=à‰àžPhLöp'ÄØÚ{hHöh'Ȩ³Ÿ}lÁjÈì„é·³.XÙ#HÃ~·},J!Tö8'Üd³§NK˜BˆìNs„)DÈÙ4îi˜fyP†ìMšñhò“iËÒ|˜OöP&Ûx4èw;®+{ ³ ž„©™)Ì.{ð²X„)Ì${Ȳ¨&n²Ì®”=TYtã'ó²TXPÙC”eab çÊš,™‘‰)GÏI>‹/{¬À¥N÷„¦,®ì1S±Ã ‹*{lÀ,ìpÂÂÉp v8aad˜ÇäSëõIÐ?ûcö(€ùYEÓZãêôÙ?ÔÈþú4æxT¦höQƶ1%ÚѰš¤h%E)˜«OÄ9œe7¤(峿>õÛïe×дÉÄ´cbJ=ö„(+Ëz}j°ÛÍ>!ÙdYT×Mù\W'û†ñdYTK–2£ö8ûÐ……≤Ìf²Px‰õúLçx˜}¬Â"»úÄåΊ—p#)¢0ƒ“,íyˆÏ;°PföôêSöðeXm׿Þ'NBÔj{˜×d·([B¯,«í¡&ONòMLWŽÕöP³‘‰éJiYm!ž.1=Èã³ÚbYbZ¸# E¡ ¶„.•ÕöÐ$Ï*)ÎA?û ‚UäêS1< ÞûtìêÓ³Ú€«OKÌj{XvÞ[FVÛâyrS¾%¦ËÂÞö°¨œä/…¶5N°Øœä/¶GNça)<=ÉÏŽ ^²ž}h3x²\ßóHÊZöAÌέO Ä\–Ö“[Ÿdi¶ìã˜Ïi–úÁ4…"ŒŸìe^š`+û»êcQT‚Íìo¨›G;7JŠB¡diC¶³¿i ’;òÃídÇ@&YÚ6/ ±›ýåMŸf©yi½œÑê±ST½œÑÃjrãS]¤(¬2Y:?) Lë·ÝøtMR8eéõ¸F÷ß? ÓÁI˜¶_üÛ½QÃe¤]õ¸§ÖàòŸœè÷ONôŸÄi·o[Q`Ÿ\{:ï÷Ò£îùÑs_d4šú/èÉ>QÏo`zÜu~0«ÉÌ´×ëöúCSK fÿ‹Œ_ endstream endobj 9 0 obj 10864 endobj 4 0 obj <> stream ÿØÿàJFIFÿÛC     ÿÛC   ÿÀOÂ"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ýS¢Š(¢Š(¢Š(¢“ŸJ†[Ø!Ï™¥‰¨ct”•WWƒ†ÉáEÂÇ­Mâ.!“{üçùU9|u¥Fx‘ßýÔ&¼Ð'#Œþ4ªIb ?½Æ?*W)ßÍñÍxŽ ¤úá­@>#FIÅ‹ãþºð®/¤ÑµÃd³Ó4\vGn¿b=lœ}?Ò”|C¶ïi/æ+ŠH÷`ñšp„Äç±äQrt;Qñ Ðÿˬÿ˜ÿzüB²8Ì3ƒéòŸë\PˆÔ›W¦zÕŒîì;Ã8çû£üißð°´±œ‰øÿ¦ýzáL({dþŸdNO–õ 4;ÏøX:Iî”}Sÿ¯Nÿ„ÿG=guú¡¯;khÈË ÆqÉ}•:Ôu89¤…¡èãÇz; ý¡ñÿ\›ü)ëãm³þ™¬oþædsœPȪ|²0n>RHj¨@û||ûò_².ì}CÒ›$7ôõ [+ÑÏMBΜ¾(Ò¦£nàb¼‚;b²0tP?„«r —ìàpú“@hzðñ–Ý5 ûú)Ã]ÓKûcÿm—ükÇšÙ]FT;€8¦Ž6îõ#$Ð4®{8Ö,[¥í¿á*ÔŸÚV‡þ^aÿ¿ƒükÄšÔ±{ q…Í7ì˜èì? «ãöËsÿ-£?ð!N’/ýõ^ö#»™ºjXḟsÉ =ÀJ§£øŠp óž+Ùq´…ÇR¦fe9ûK&zrq@4{©ÏjJðÀ÷c¥ä£ñ4°Üj9ɽ¹tÃuþt ǹsõ£?xÂjWÑqöéÏü ªOíEpEíÀúJ€±ìy÷µãk¯j ó¨Ýo0Óÿá"Õ×þb7þ@Xö+ÈŠ5~×ÓçßœW ¯¤ÍîÚ¤)Ïç_8ÿÁL®¬ì¼ à·¹eŒJeW “+1ß¡ü+ó²óÆ}­Ìh²ÄbeÜÓ0q´ç§OAY94ìRW?fgøÅfGîo4znÖ¡'ôªrüR½¸[^è9ÿbþ'ú~9_øæÖÊÜOo5–£y÷›]û¬*Œ_Ñ×|ZUÛ©ç廞zÑÌÔý•oø†ïˆõ??ôÂæêÕº—‰¦äÞ±uŽî0?G¯È½7Çßnr£OÔ!ÁåŒÉŒú}êØ_Ü$°Ä°jM(ÝpÏöûü­¸ícõB]?[¼Æö¹“$–pAÿÇ©£AÕ¤ÈûÔ„z)bkò÷QñŒúÑÁww{Ë(u‚)ZVöùO_aY§ãΙbdß®êÖ¦2DŠË2²ŸB;5ZØÕoøFõ\ó¦Þg¯0¶>”jk’tËÏÂÝ~[ézæ¥{áôÖáÕuÓÄVæáodÉ)Ê nÈïÐVï€4Ï|Añ_Ší´-O^¼M6MòlÔåX­!¤³|Ø“B•úÇéZh‘é—¨cnç?¥5ô»¨y{;”Ǭ?¥~oøãSñ¿€f•-üK©ê2ÃW -¦µ9¢~êÛºœÒ¹ø¾=|CY'Dñ&¸ I‘b‘5ÉH–9|Ü€x¢ï°¯æ~Ÿ5ÙÃ%¬Êž­šs[ȧ ƒ¡Fý+ó.–QŸø›aZ”€œâO½Óµ^´ý¢¾$¡ˆø–0ÌU¿âi!ÚF0y=ïÒÆ¬ÒF‹r࣌ÿ²A¥M‰ÆHíd×çEŸí7ñ@˜€ñ—‰cóä@üŒ¹ùyî@Í^´ýª¾+*DWÆ> ÜÑ1$êß0¯ àðNZ.Gèfô#€üqJ$ˆw¨>Äf¿?“ö»ø¯ÿ ޲ÄEæýÈÛ#¸û½}©í«ñbÚFFñ.© [oµk(2ñÀÊryéÖ‹Œý3F@ùöÝM>S¸sã£d+à‘ûiüQPÌuÛ‚R5”“¥Ûƒßîúªñý·þ(Ù‰„š¼ˆ‚³t{~Œ¹È÷íEÀû»z·B1Øç Ð'BNYsÓ–¯íŸñrmQõˆÄÑ*ÂѶ•„FfÞûU´ß·?ÄLÞ}Ζå$UË£ÄcМÖ‹öø¸N›—ó§Çr’œXŽÀ_ÃyxÖâA¡“‚& £¨Ã€óÅ_·ý¿Ñ,ÇþY¶>”ß-Ðe\;õ¯Žâÿ‚€xˆe¿²¼4q'”Û¬\aý>ÿZ¹üXSÍÑ<2á¥X8µ™~sÐ}þ=hæAcë %* *©>‡4ôÊÈ ¸c•Î>•ò?ðQ ‰¼¼h^>eÓY®!¸\ÊÊýþOz×þ ³ª¹ðþ&n>Ëò™ÆéGU?©âŽarŸRÍaç.†s‚H¥€q“_-ø(5š´*þÐ7K9µŒ-Ôùy‡Uu÷5j/ø(.Œè¼?¡º›Ÿ±üº”«™Æ~@6õâŸ0ùO¦%…%B§î÷‚>¿þºH¢Ű’ĸÇô¯±ý§µFÉ/!øX÷Nv­Ä³<ãù|œÔÃö™Ôcž yþ]‹™ÁÙ¾˜;cÚ<®zŽ{QÌ+¸ëÇ=)08Áçé^>¿µJ47·Ã+± icÕ\¤GÑÏ•…>Ʊìÿm¿ Þjé¥Íà«ûk×F“Ê®XF?Œü §Ì=à(Î:w¤dó^\?iÏ ùBWðΰƒòÞ)?ðAûMx(6çÐuÐ=®U€£™Qe |§o¹Ôe<Woaƒ^bjO)Ãèºð_ï c9ý(‡ö¤øy$Á'Ó¼Aoþ5XßÓQÌ…fzs® dö(f\” }5æíûQü.“â4ÿ·Xÿøª¿j_…óßĉõ²ŒÿìÔs ³=%âbFÖÛöA¥#dW—¿íOð³µçˆ—>¶öziý¨¾1çP××ÄÚjãôz.‹=@B’ëÞ“hÎr+Í#ý¥þË*!ÖõhCo“MGך߃⇼K¢\j¾Õιmi:ZÝ… ò”ºŸ›¨!OJNH­€ìsMÎX(u$vï^w/µY\ˆ’Pÿ‚Hüë*ëÅÚ„« 7o‰dòÔ¡¾zcšŸh#Öd•b$¼«ÿh€k:_ÙBO›wÜ6ïÐ ò»‹™åy]Ï}ìM!a´c‚)sŠÇwãÝ:#ˆÞYX“‚ª'ӚιøŽê¸†Ôýé['ò¯>HdýÑ` £±8ç¯~jrØ$g#êTÛÑ]x÷TŸ;eXí€kï[¿»âk¹œåÎ*ƒ€9üi‡­l4…ÎI$ôɨËNOjãŽõ‡o9Í@Å ÆkÔÿgOŸÇÄõ i&~¹åùkÖ?f¥Ýã›’G dÿú¢‰»£éÚ(¢ºÌ‰ÿà¦ÙøvFüM.?õÀ×ç~¡ãïØÜÞÛÝNCÚÎL¾Al;ýߨÏzýÿ‚˜¨>ø|N05iÇ?õîkó Æ³=׈îÅ´w–¢ÑE¼Â8 ÝÔ„”zíÎsÚ²µÝŠz#rOxVYü§xKý¨ÙäÛ@ëÓÏZ–ßľž8=± B‡·eÆÌîíÇCõ¯;:…奪Z ËŸµ$ßaûI´%Ù ‰~˜ã=}kcL¶²Ô´„½¶¸–I‰1”–©Ž%Ø;nÁÉ=sUÊÇ­øÈÇ-ºFa™ŒŠ` øôÅTñè—Ãút~/Ó¤[MWC“Ì·51K»¨‘{Ž>µcáûÇÿÅ …6Å”F§µ3â‰áˆ3ÁÌdc¹æ”[‹º-««3±ðítÚ¦•h×¾ ¶¸£ #Á>ÐO¨{gŠæ¾?ø¦Óã>ƒm¶€4DÓ#šêlH\¼rè}kɾ¿™¥Ú;AÏ@+ÐõG)áí_‚l¦SŽãiâ½ ˜êõ!ìäôôG$0Ôá.tµ<ËÃ÷úž‰m£ÛYÌ´ÖñLÑȹ“^©¤ø¯Ä¾Ô<~<)©¶—w¨:ÚʨåRxŒkº6Çcè{× áß Ï©ižÔxÑVÆ1°äàÔšßdð¯ŒõØ“O“PI¥ó [ÈEõê1\ìt¯3¤˜xši'­%#Ž;u•ÉP¸ùÓ˜Íg ]Û†X,töŽ#å[‰$l½³¬ý¬“Šæï~%Ûë2é–³Ûk>´žPe¿†ØÌÑÆîÆ <Ž tZMï‚´«™eÿ…Ÿâ+””ßøUÝGþ?ÁÀ¨w[”•ö)i³E¨ëÍa6œb´1=’íc•d#,ÙÎì€ßNjéðÍýÌŠ’X[¢L<‹’—lHHòÝ}8϶kPxŸÁBV’?ˆq$Œ0LÞ”1ãÔ=Å^’@±|MÑrF6ÍáË¥9çÑë.v·Eò£Âº•úºÝiñÆn°× ÖS ýÞß÷¸ÉúÒ·„õ ÷Èús$— ·rïò#3µý–ÀÏÖµc×4 F⟄Ž›I½Oä}êuÔôÖʯÄÿÏá½LéT¦.C)ü5{#‡:TžU½ /àõcýž:Öf¥¦Üèq ûÍ?PŠÚÚo¶$‹v=Ãá|ƒê¹=k°ÓþNµÝ'ó^*ÑЮõKw…üQðæòWcGý¹*äz`¥'Q³g áË—Ô-ÃÕÕÝœ¯,vöóÞ©l4d· ®= i®}hªb²Õn±fLJž¯Õ>«ŸÒº7Àzš·Ø/| .á‚Ñø« @è2ÉúV”~ ñtØX­|3sÀ EâÈ?ï (UÜ9æŸ}b›]fa”\?hGïõOzrZßX¢o‹W-×È…í(ÿvAþîkÔÇÁoŒ §¥ü_fŸNeóö×Y…àdþð“¡N+Ž_†_´ ëÊúO­5;Hت›{¸å`?ºJ>3Š¥R=ÅÊÎtG{Q)Õä/Ù¥+oŸ8»7¾ßSQ^jgG¶ioﵿc1¼M̼”•Ku ×'¦+ÐÓÁÿm\Csà R ¡dŒßÚ«)î6´€Ÿ^Õ¯ü3ñ߈­â‚÷áæº¦&G$sÚ¹B8ã÷œ‚ î*\âö)ËÁyúU– 5;©a¹ì³¬vÞiY¹)1#‚9þbæìÁg"ÜÍ8•Ü[I!±ÜEÎNÙ±Üp>nØ®‡Eð'ü7gö+o‡Þ"Us–Â@KãŒ`IÀ°­c£xþ0VOx¤‡PˆÙœ= HYçTxÎ.µ9"Òì6œFëñ÷'ú{ýjuÕ·)IµMîßg˜›1~1¶N8ëõ®úH‡ÜÑ%s7¼S²Aµ‹hRžn?>d·81ªãâÿM!È‚plˆ#PÚãЙ÷­-ÒïÄ“IÒï%Qþ‘VÙe¾Ã(Ç óÈà×Q>¯«|þwƒüF¥€ÝæhÿëïIiâ²\J×þÖä·ž·šÑî gV\pÊž‡¨æ“–—CQWÔúŸá—ñþÏÚ\0K4Ä~!‹Î‚9ÄF8A× Ðy„w<×¼x– xx§Ã‘ém|“¶¸òN.&™­|¯œÛ€r°î#®kói~& Vr©­ZD6Ÿ-­/0¡Fd§$O4³üq];ý*MGVóáS´Æ³‰ž¡r½xéëUé¨8ö>ìø›umÿ ›ÆçÁ±ËæßM£©… „Šl™Tç Wžµñ÷ÃÝOÀÚÅkVñ¹¼_°øudÓV 4O cÄœôû f£ÅwßÙî«s½Ôj%Ì H½·ÿCÞ¼ŸÇ&+êñ¢¥ÀþÉ·V@ücBW§Ò®ä¥­üpÓµtÖ¼B¶BßH²Š)^ÎÖ`Åq…ôëžx«¶>>Óµ+n¾Ï{ Ï‘TÂÎv‘ê¼f¼ƒÅ6––?üqqkl–1Ë*°ÆÌʃpùwOLûW°|ð½Ç‰üiå\‹Sic†IAòÀÛüXä~ŠMj Tð•iòœ†L½»éK5ôEAÅ"‘VT'Lõ¬}wU›LH‘˜g›É‘þðõUVH¥È–äÞXÉ>´¬±”\3ˆQæ1ýñnÛõÛœU—™Êèÿ»õ¯ñ†±©üñeì³êú…Õž£"²Aa!Œ¢‘À#¾®Š?Ënš¨‘üHWN1‡aÈ¿¦~èúõíO”/c¼¸Ôå„Úméç´cŸA÷ª¼zæé–3§ß!møÀèyž:Ô—Ÿ,§ŽþÒçRÖ#´[‰³h hÛoÊ;çæÝhå±W7_]‚&ÁŽàg¦#àþ¼þ5õ/ìÁuoyðcÄòBÈ5è•·©RÙÉüzŸÆ¾0Ð¤ð†µ¨Á¤Äú„²ÝÛ­ÆÉ‘Ñv‘зföõ¯²¿f2ß@ø-â}*ÅZ++oF"˜¶ÝÖ¡'“ÉÍKV&úª²61U–ÜD6‡,8ïÏ?­ZèIíQÉú~µWœü¦ŒñïCr9çëL&‹ØHGR:TLÀö§;~&¢cVÄTlÔ3TlÔ×ÇqÎ*9¤ ;µA9j5,.¤$e0&‡ýäeAà‚ d¡˜K 8èê¨ì?³"ñ–¢ã¢Ù¾îµãJ¢4Uôô¯iý—>ë-ž÷óøUGâB{IþtS¨®³3âßø)¨Çƒþ7¦³/þ“½~axò{¹uÙ]ìæ&Ê?"×ÊŸ`¹òñê¹Î}«ôûþ j3࿇üôÖä?ù.õùyñ ]®¶Zá,œˆñ§¬ìAhÈýòŸø aY¯ˆ®‡?1Œà_ùJ¿ÙѺܩßlý£ëž3ÓJ[Ÿ·|°ê\³”gEå$?ïþµ£eâ¿_ÇäÏ` µò G-­Ò°xR§îª‘ŒuÏÒ¬ø~ÙÈܼP¤·ih¦, kþ­‡±_έù‚=+À-CÁ9ÅWø¤~ø€’Hù ç¨çгàV-¡Å»U_ŠD²ñ9Îà{f³4¶‡˜|*pÚU™ÁQ債躴…¼;«(á¾Ç63Óîšó…²)Ó-’?vȯHÔÔÉ¡j€àÙÌ=¾í[ܘì_øká ÍKá÷‡®â¹µX¤³FUypÝNxü+•Ò6EñGĤª’¬6³ ‘Â…hø$ž ÒßËt³ŒÆ ’ç§·™¦b_Š>(ÀOî¥rÓSN\Һ饿áͦàÔyU»êWŸâF­oªÞY·‡×݈Q¤p¥âç2sÛéÍ4üR½[”GðÔ…d¾6àÆÁ‰Þ{~•ðÍÖµâË»Ïéo%¢±´¶šÖ`ä09b3ÏjµmàÜÛ4šf·lâÑôÓ,wJp2J¸ôVàzÖ×K¡›7¼âTñ}„÷m¥½€Šv‡lñ¿Ä8éúVÛÚ[0Á¶€œçýXæ³<)rE¶…l/tä¶_³ˆ¯°\…‘ޫӓɭw<ç¿°¢ýŠµŠ¿Ùt¹-ajwuÌ TcÂú4¹i6€Lc¥t’\ø}t 6á!¾K¸®^NáîU"ÿoiÆ;œU„…ñ"K†18Ṳ́yk“ÌŸÝ=¥K’]AY茟øB¼8À¢Y–õÙÍcøŸDð?„¬WPÕ4è,áy^b+˜ò8ÝMupÜ`ŒœœdŒŒž‡§aX¾àÄ’I¸ °î{W?ñ^C Ï‚ä$€u”;»}ßåWoLrüJØYm¡è^¦Û\ѶQñ¶­àMkÄš¾¡â[»‹½n-²ÞÜ\\Je|œu“Û•BK…À^¥Î‚Ö4yofÆÜ|Üœ‘\÷Ä}VÖçÅÓGd f 5[qe曽Älíc¯jÁd¼Ó4¸¯5]bÊ[XG©DÖÙ’t|rJŒž0zÕ¥¦¤¹;ž§¦øÁ:ÅìöÖ·òÏlªÒ$Z”Ù À`ýîœÖ¯ü*$01j:êö5Y†?ñêçþ ÞÙ]6¥g=Ä~'PÝ\Á @ðyc>ÜqJõ=†>ðOZ–†®qÿð­¡„‰ ø†++uDaëó× |Kù|m•å­œ>U±•§‘‘€ùT‘íÐ×ûKicOø9¬sâG‰vÄr~÷_νOöq¼ºˆyÞ|¶P¢ù ?/9'€?ZÎ#RÐØ©ÁÂ\²ZžwãIMB̰Pæõ‰ Âçž úÔ£÷Žpsžz}*¿Œäs«Z«¶¾F8ÎMH2(S‘éZOý§d âÍ, À|‹û¾§(z{ó\Õ„’h°Ç$’kr&Š |¹b^‡¿Ý÷ϵlþÓóñ†û§œ‚ÇÚq³·¡Ç5 Z]‚(­5yN” ´/öê9 ýæ}½²=qZ/†æN×#ûuΆ@—SÖ&‹@a-Ø{`~פmN»ŸâÈlt®–úþ]1P^þ94à—w'ìÅŒð¶ßÝŸnO“éVôÏ…÷v¿ÙFßV¾´ÆvX¥™GÚƒsµ½;Žr+V–ÿ×Çu6´ãFo¶ÌÞH"ê6eWÐ\Œn8 óáŒã›\6¡pÚ†¥<îÒä[y`[·!IìÀ=+í¯ÙÜîøUâìðO‰cךWÂßüC¶¿.‡?Ûï¯/!ö÷—VÁQ0Vg¨àôÎ21_sþμ|&ñCcåo‘ø‹H¿ÄÔKaô;òœ~µ ‡ŸzÀ ÄóUœÖVµBæžç¯µC!RÜÉüê'oœÍïQIÈë@ g¦3ÔL_Ï$1#©|ÿ*×8¤˜çÿÕL2g¨ÏãQ³í’@äÓRPê‚2µ++’3uÏ·¥{wì±óxY'¯ÙWÿBᥰx¯pý•>맸µÿCÿëUGâ +#éj(¢ºÌO‹¿à¦£þ(g㌟ñï%~aüD´º]_h¿e’ñ3b~ϼ[m¼ìr=ëõþ l™ø}àFþî¼Gço-~`øçNGÖ#ží›PP“%Y•Á^;nÆ8ÇZÍ|L¾–8¸ W$ɰGo*4°Fö8)f¤ùÐôîyÇ=ù®¯ÃŒfû3ÍÀÆаõcÜŽeDeo6âtÔã2ƒz¶ÙRC&A€zoÆqÆxàÓR{ó§RâãPز›µ€@¥¶0¸Çªç<ã5£ÔKMið;7ö •Îy ÓÿÕU¾*d|7×}ÕHüÔß Ø·†-÷4Œ –eÚÇ>£±æ£øªAø{­ ùG§zË©¡ä¿ É}*бÕé·?>©¯­¤ÃÓø+ÌþÚu¨Î0¼}3^Ÿpé:€ê~É)ãýÃT÷%lTøy´þÑÞ[“¢ÝvÅå¯~ÕÏ&«.›ñ'[œ[IvnDÀAE?w©­_àø/DÏO³¦MI èV:׎¼Q-Ü ÒÅ<*²Ç!I2.B°éYÇwržËBGǯ¤7ÞÖmÎQæµÚ[žÞµ>ŸãÝ?R€H–÷Èù­˜àëW¾1h~ðoÅŸx6ÛNÖu[M%a’«ÝL±)$1¿s×.zvª–~ µ‚0`Ñî#æ+ày<ÿxsUd$Û'>6ÒTÓË<.ð§§Œ´ÉЛwk²¼0H*æ|egq¡-ª[iÚ§›3>JÞ0o˜ú×+l56ukë_Ì€’¦9£ ËŸÆ‹\W=ãÅ0<Áä]$“Î1äìY8ùÇ£eTäzUȾ$ÞCe{k÷B í¦éY7yåOs“\Z_évæ ÚwŒÎýÜ,?Zlž6ÒìQÌZ~½«R{uÉ÷àúÖr§/y&²wGa‹â0‹~‰æy§tGq8¯§ÅY:õ•èX'n²â)b,»¤rxÍr?"¬Q[K,ŒÕe*Oû?Z³sñÔx_Ä>Ôo´+›;:ò;衸”È‘ƒÆ@9ëZÓIÉ'°¤ìެMg ÎϤÞFÈÿd!ٱÎN8æ¡Yt;IÚå4È-ç3†• 1±“¦òG|qÍvGþ 8š…ÉÂYûÇ^2{ó”ý+Ÿñ—íݦøÛÁºÎŽ| g—ð5ºÜÃub'Œ 8ã­z’Âá¹[]}%ZµÒpüN⦻¡„ R¤¡5¥k‚Em´©Å9&žEŠ -LJìÀÙé^Gájþ,¼Ò5Ô6ñiÐÜ&¹°u=JwéŽ+ÕüKàë­OÅÐ_\êz|‚5[ÎÞRLàô½½+ÊjÍ#º÷;Èî´ø$,’Ú¬í€òMÄ~§÷²Òµ1–ÖÖáæJY·¨<ëŒæ¼³Å ÑA§i>³Ú¥|Ë}AÉsëÉàÖf“à-G@KÙç‡L’ »°nå&0=6°É4ì;žÛkegasqqokD’ÄYÀŽ£%ÅЊ#$ލŠpK_8\xÒ+`…´ÌI!Õ'‡¿< ØÑµ WX8±ÑâW\ßkáЃê½¸&i:Í¢Œ›˜8ûâý¯m Èž0:pÃç–¾ñ…ÜhãÃÖ.˜É+«[ò?:Yü9¯Z"}«Ã.“¸Ãsãö[šZŽéñÕC7ÊÊ@醭ÙjÈœ’ç­yt¶vŽ¢ïH½‰Çú¶?ÈóøVÄ/𥩠¾]CuµÄm»[ÉJÍæ)íèIüj;ï¾¾M@'Ûã7wkvÁ'à2çìsÔò3Åtÿ¾!|¶±ñüA½»Žéµýœ¯ÀÛÊ^›G÷·y®Ùþ"þË×\Eâim‰ëºk…ÇýôµéÓÁʤ”â¯æqO¡'VþGà¯èþ ×µ]GN’çÎÔä (¸›r€ 8§'©®?á•À¼| xÏ œõü«[ã§< ia¢Ið¿ÅrjR<’}¶##JÈ0G?Jàÿg uKÿ‰^"¿ÕÑ¡¹¼…&vdÀpO…rU¥ì¤ã&»jtSŸ=šV¿sÔÿiTŽ/…ºÊ[¹–!%¸ßÀÉÝ]ÏÃ_êÑ [Ë«H£\rT÷Ocï^}ûHùq|*Ô2™U® •ÛÎîœ×G¡’º=€Î@·OýW4~sY|E?JÓêšt„2\I!³Ž ëß­X‰°ã8ê*§ˆFýCKðϿݫ1Æ2ƒÐj˜ý¤%i¼qf<†”“µ£ ·+°sÛŠ×ðNššrÅVL ´ýÕ£ý§› KûõíÀ¬oÚIöøþÓlqËÛÒv˜ö Äœð:ûÖÇ‚DK‹kK*~Ä#¹Ýæ[y#¿9äàûVŸdÏí3½‚0"‘•‡ûÊO§øV¼É4h5ÓϤ:É 6톕3ѽF>§Ú­Â#†DC ÈŒ y çÃKÅ7³izA’ÖÒk»ˆÊ¼6ÑMµ¦ç:žøÔ—¸Ÿ u•Óõ)t(¬oöMÛþÕvCl.lÏnN> ð+íßÙÕü)Íuû7‹&•¬?ã_ |{½S¾Ð#Ó/¿³Y~ßý¡u7˜¢F ˜ýSõ æ¾çýTÿÂÕŒnñeÑÿÉh*e°ŽÆnõUñéV%a3Éü…UqïP2»óº¡‘³Oº™-¢.äÎ=OOçP½@µA!<ÔŽO­DçŠL —÷ÖÚY±ƒ8'¯ÿ^†8ë×úÖ7ŽÜ j8-¸„\ƒ‚á[l¬©¤kÇòí¦l•䃌â¨è7Ow iÓÉÄ’[FÌ=Êñ«sâH䌖Ã)N:à÷ýjµ¥¼z}œ¨Ä¤,JORÆ~¸‹Œàw¯xý“T6«â=D1.àGξ~gô/ìŽsqâ>9 ?÷Õ\>!Mh}!EWQ‰ñ§üÝGü+?±ç _ý%~`øßL³¼Õ¥1E ¼ñ…ÔYå*È£”aøíæ¿P¿à¦«ÿ»Á¬Nñ gþüË_œzšÅ6¤P VEÄ„Æ>pzsߎÌÑlyËèWkÜXÄóÈ|ùžÞä®.#Ï”„Qߟ£ ëÌeMðȬu,%ÙÃÎØ »ß9í^­á} _ßY#D'•îz¨ IŸÇõ¯Qo Ú»£¥½òA´\,NrÞí»·'\Â<ïáÖôðͨtt/̮ۙy÷9¥øŸ†ø}­óü‹Ç©ÏJÑÑ-Þæ #YÝT8ÃcqëéÅUñüŽž ÔäŠ?2EhÊ .Á†¸à –Yå? 4‹ýZÆÒ:Í®î\1#m!Te=÷¯RÔ|?©ÙøJ}Zk)b°žÖEŽå—ä-´ñžçŒWðóûsZ¸q´°ê·2É#ÛZ~é£`>p¤ôêQ^‘­ØxŽ/†ßh½{¥ðëC*ZE,£Ë µ¾ê÷äi_Þf“ö’WV]:œ_Û§‹ÀºR¨VÚ`Ã$|ƯxE±ãîê'·<Ž~ટ lþÕà-!ÅŬE-†VyB1äôé<5v‘øïÅêXÜàsÆÁÒ’³m#¡§£f‡í(ÿ†§ñlDï“û2ÎBÝ ¤#üæºËT) |ÃÊ^Š}_νKø}àoŠ?5¹üKuogÆ™MN;øàód[xUPÈä®2ÀÁãkдßÙ“À·ñÄ ñ¤±’ÛÊÕíQ0TŒ—mÁx‰5[¤$¬|•ñ ³q¦9ùÎNAíU¬½Ggã&™?‚¼D4»ûmCP½´–H˜é®—1 `çrðAr œ×!¦xŸW•ˆ‡Áþ ˜(ÈÛh ?‘¤“k@½·;è¤É&µ´Öýàç=p+Ï¿á.Ö-á'‚•ÙiŸ´ž“i[T· 93BT*òŸŠŸt¿øjVÚÆ—gX’Ö{c(.eÀãŒf¶¦ù[ºèLÝÖŒà-e›Reu}=œ‘þ¾5Ì֪隔1ɪÅi£=¢æ1J†?/¯\ŸÎ®E{¦ÇO6¯¤_¢®Ó Õ«F=øÉ«êV6wÓ¬6V^7 ÷Ö9Øï'~è瞔۹;Íá}7R±ÐtçÔü9‹2Ë^Úm®<1wCס¬ÏÚ5£šÇè©ÂšŠžyÉýØÈ]ÿw`ŒŠÞø‰à+¯Ë¥Aos Þí.˜]²ưÙêhõF§ƒô{§_±¶ô¢hPðÓ¥O­èšsé·£ìVày-÷aµz™û:üNÐæ“NŸÂSÏu$æ@–÷Øw×—ž¼×7ã¿ ëžµ{m[G¹Ó®n­ Ä1NÊ ±œËÏLŒT²ÖÇ‹ižÐ/ S>‘jç¸==«b?†þuÁÒâ F1“ƒõ¤ÒæªN­ àö둚ܴ½¶~— ä†ãj‰Ð§Âß O¾•÷Ö¡¨DÖR²Í6?|ß­|¬Êš‡Š5]B)u«X®gycȶFO±çƒ[E+_©œˆ¦ÔDö¸ê©n0‚X6–P9üjm6]:þx–÷ľVéÕL²ÁÂ&2O¹ÈÅiC©Kg |Cdàr`Ô,núgÓŽõcGÔgñóÁkoáÝNi×÷qºµ·”AÆàKs냜Ð%Ø÷-É—Çþ1Ý麪Gì·6„dï ÜÖ³|Šß>!¾cËLŽëÓÓéZ^k†ø…á±rt©žÞ ÕßKM¦6Ú¹ó~Q{c5“ðíËügø‚ääy©œóž+>憷í‡øOy–;ݸ6sóŠë4~4› xÄ?ñÑ\—í'ðâyƒß[Š;n×W§ºÿgÛvm‰NXÆÑþsI6Ö£v¾…y³©iƒÞCúUÛU&d2+#UÔ­¯µ-1à•eP$;c¿Ô}+ZÝKJ˜dqIII]Mn|ñûFÈGÄkr)s r‚=ª>ØãŽ}*Ž—¨Ág"6›.ƒ ‘ƒ-‹K#/›eó2B6“†ù¸j±ûANÃâTn$Ž1g”È›ŒÜ1ƒÛŒw¬›i‚1ò5=¦eûU¯fWËÓ°þdD•À=¶òxl75ºIÇS'ñõ¿‹î¥ó%³‡I¼vý柺è)žÜnóž…qßç­s×څΫ¨­ýµñ´K¤¯7\â\ËíÏA·ïSi³i÷m¶:©*»iq22lµ!ƒ«g¡Èèç# ƒT´­ɺ÷M³Ðe·³ù´o.ç†b%ܬێ9?>íR¬>§¦|'šêgÓ­ôàš _=.Öq(óÞMÃŽG×Ûÿ³«“ð*ô±Á>+½çé¾ø? ÝŒ×XÙÚGá]¢[{˜&.^~7àžHÈ#§ï_müb?géÝOü$º“zò#‹ŸÒ²‘}®Öñ/¬âž1û©W*[©¦=PðŒïqáy ³Éi1•?:¾æ¤ ­}ÊénF21ƒÏñŠšB7f­l÷–M2£—F' À`xü©dnIõ¨¼É¨dl t™Éüj9Áê*@«{wQ¦Ex‰ Мð:d’3O\æ©x–ù4ý-¥pÄcŒëËã?NjÔä«°ÎpHÏã@Ò¹WP¸ÖW—cŸq¢·ŸÏ¶‚]Û„‘«†éœ€­C­‡ŸEÔ#ˆ3ÈÐHRvô÷¦ØÆÑiÖHÙ –ñ©± þT†Ùd·Ò¾ŽýÆSÄâ„~_6³{×ÒŸ±ð&ÇÄÍŽ<èGþ:ßãZCâ%ì}E éEuÿÁLÓþ-…‚JøŠǼ2׿O‹u‹›+÷ÙÜH-â#FF'-€FOB3šý9ÿ‚˜|ðÙ-ÿ ¸¿º—Šü´ø†/ßQ€-½¤«§‰&1´³ÿžFÜžÝ:úçmKÙ4ïÜé<±< A a,±nù›@wqWGÆo,ø7Qïý”‡Ò¤T2ÿså~!<ü£¡ï^n¶›J¦™d’¥º‘n°j,¢Oõíí°ñÇãšÒÑb—DÔbKç‡ a“t® C$OŽÃ$Nj¬‘7=‡ÁwÏ¥-Ô¤y³1w©U ž@ ’}rißn/êrÄvÍG˜t`ræ*¯ .elå‡<·SR|E\ü;ÖÀ'!Ö³5KKœwÁëox²àGaç\ëŒó±ˆˆÜ¶>b è1ƽ;ÄŠ“á¹Óµ8¯‡‡Är5«]@vPÃjIŒœñÎMxŸÂ}~úÇKµk{Û‹fÇË,Rmt=8=†8Åz]Ö©yw¡Ïi%åÝÅ´vò”¶–vtiä)8œäW:e^NVä²·{õ¿–Ö.Ô}šqOŸ¯fº~§?ðéð>†IòàžOå\÷†t‹/x‡Å—Zª³Ëovª&Žf‹ ñm##×5Õ|,¿žÓãG(žÓÊÞã%>n£ßµax¸Ö|aÚn”F}y÷é])¾i\ÍÚȲ¿ ¼-®Z¤ÇNºKe?#4ÒÆsÈÏPpyïTn~øBÅãÌš„2¹ùc†òF®8õí>?´×ÚMæ¤Öˆ³X(†&b˜ùrÍ»¡Î8 ñTþZÝÚxžþëK²¶Ônî¬Yon„KQãÁíâH§vM{ð‡JHPO\X“UoKëÐ}+—×ü/…ä˯ëö– ÏŸÓ3Ù“€èJŽÝkØâÔç±Ó¤¼»¹f`WMØ9<Øvü+Ÿñ$ÖÚV‹§êÍe-ì¶Óβ[F¹.¾Bž·¯4)°qLòÉîõ i­§ñ–­jöȳ\©NÛ"m»yb]AAÓ?{ЗÄzÄLþouA;µûºÃ¼~ìýßœ6F@û¹ç¹®ÓÊŠÂ0·ŒúŠØÆ᥀1ºŽf3ž«=ÐŽ}2ȉmî„2G·Lº–KPÞ|ÎÃ1ÏU\Ž`ּə$s?Ûz¸ |a,SDë‹<ÊþT‡8Fõ-ƒ‚¹Äb’âm]¦Âx®‘eå1ŸŸ?êÛž_®È>µ§â›[D¸ìâˆLlo ¶AÌ÷j¤$8rN1¸`ç'µŠu7Óh÷$¡'ŒÛº 5’­¹@ÂãŒ.z­OThíµ«–|j:Mßï< $†"ÌÝãÆï¾?»úÕ Ï ëjƒD¹9Àh¡œvOÌøŠÖam#=­—‡HWýÔq‡5À“Œ¯OÊxªQiÖ¢tm:×GrKfé{̨™H,2Àà`šW¾Á·CKHÄ:&†–6Z-”sG(“í°Ü͆;'Ëå[ÐÈïŠê‡ÄOA"K&‰§3C(a–r ŽTçºäÆ«Zø#H·M º“k+Ím¶å€0¿ú×÷Ç#½M%—€4­:M<ÛEt‰g$‰ KÂq™Ý/¿^ƒÖ¡Ù—ve¶ý»>0[ûƒü/p1Rùv©B>îH^ é‘\ÿÅÚ÷^ø­ ¶›â‡v6ÂZ%ºÓ^8] ©[9ÈPFMyäZø8èséjW3ZÜýŽ(ïz˜$<ÌBŽ@Î~^|Wg¢x—íÑ!‹X”ÜNUÕ1¤A‚LÃø3œ€zàsQ&“W-jx8ƒL÷ ^Ë&ï)¼ÍE«àb†ÀéÔúV•ž§ Û3¼ž Ô€˜˜ä1k2)8<©ëƒÇN¸¯Y¾²ñ2‰ Ö®^yT[ÛÆâ_!OúRúǹÛÖ¤¾Ui„“Ú^Ÿ´”‘V%4°!/v8á[8ÏPVŸ9<‡˜¶½á³Âá/Æ#CzÓ`¤r=AàóQA¬øJ6-‡âëG#y-¨$œzò?Ï¥z†£kw#‚tß³ À.a_ìPøž%-%ÐÀáõZ­$Ì„ØÚB'–)cvÒÈåifã#/ôRUùO6—Ä4ë‘yâ‹`ÌUfÓ ÈúÕ /ÙA;=¶¿¯Û–çÛFãê9à{Šõ/²ZÉl±Ò„—WB[YE´‰ÚTîsï¦~\ñL‚2îVZDòÍvÏ *!¹áÚ6$ÿ«)“ŽW;}M aÊyÝ׉LŸh'Åä¼À.,W î`ð:uâ±ç×"ºDŽ[ýT+"ÓÀbb8àöœd~5뉧hQ8·Ó´¹KÜ lÌWÎLJæÏðmÜØ}ÑÜÓfð·…î­çXm­V¸2Y˜5! ip1nF>ëÀ/|{ÓRî ¾×´¤ñÖ‰$“ø~Ý~Ï7–t‹¤ØÔÊÉÀç=÷¤øXŸløµã׃7IãØc ‚1úŠï<ð›Â^$ðäú–¹à"ÇQŠ+ØÇnûˆúƒÍyÁ]6Çž9²‚á‚Úá"D‰p LóÞ›ÖíßS¦ý¢ãšßáàŠttc¨[Œ2ãø«Ð!Ö$ŸÀçÃ×6VI¦ÞÂÞ- @c’ý{W›~ÑÂl ÎíJÛ¯?Ä+Õõ¦·ðƽ©·ÝnbmApeŒññïÓ­.š”÷Ðã5a®£ðÖÓÙ]ÛéPIo ö±lfQŒÞõ÷«°dÜ'<–Îǧ¾•y¢Ùcß©­ëWhBÇõˆ¡O MS¥-_Þîÿʽ\Köµ¾'úhøÍ0‹â[JKb-ò±UÜJ ¹ïéƒ[ž´‹RhÄw+3ʾ|m’†[vÏîºp¸=Ëï\Æ™ŸþY‘äÛ³Î~Ê2î—ÛõúWOàÙi’yw7Zš¼ÑÿiumÕr¹éžØÕØÓJæWÔõM+áUë$ï§[ éÚ{¸gµ·ŽG íQÓñ;“Ö¤Še¹Ž9Àu Žã¥FýI¨$«pþZƒ´·!q×ñýj¼œ5v"ÙJ±SæÇÈôÝÓò¤•¾cÏzw¸œÕwb^Õ4§Ž•RY1Û­@þ*±ŸTÓ£‚Üëu „gPàŸåVç<ŽG±?­=Û‚sÍUsùR)! ÎzÔLxÓµ9ˆÉüj­ÜÆ8òNà? b±!lŸlt¯§cõ?Ø~"|pnbøé¯—œ•$žÙ¯©ÿcèÈð®ºÙÈ7Š?$ÿëÕÃâ%ì}:Q@t͹™ò'üÉ3ðGÃÏ»âK_NñË_–_£¼[ëg7vþT¸ŠÅf·/å\Œ|ÙÇCÈç#Ú¿Tÿà¥ü|јô#´çÓ÷r×åwÄäS%Íè7©öQ³gìù#ã±ãúÔý¢ºðªøfãJ´·²ÔlF¡)pðm1™_£ªÁc’sŽƒ‘Ågj¾Œk2ØÜÁk¢)FæÜ°“¼¸sšåÃ]Þ° &¥i,íåÂÆÕXÂÑ/ï#ó1ÛuzÓÝZ›™¤˜‰z‰àÚÉ~áöã5o@G x ¶Ð¢‰ ¡e ’xÏsߎõ7Äoù'zàæ>ß'‚Xc¦~a¹‡ ž”|?Ö°ýß×Ú³±¢Øñ¿…Å›IµvBdôäש3îÓî€%O‘' ã)¯-øXÅ´ûBÿxƒ‘é^¤qö;‘ÛÈ“ÿA5r܈ìgü-¶–çÁTˆð_vY äçžMdø_x¬NV"×HËæ8çŸÿU[øuƒàç?ºlg¯Þ5V "ÏŠ­ä¥ƒ[Å Ž1Êî)Õ—¿ëP“»»+¶‡ Ýø‰õ˜ ëxmãòáýâ‹‘Çøë×Þ¬hZôúÓÝÛy+FcÄÑïR§¾~ùê5ÌøƒIŸÄ0ªKu¸Œ|¦;(”© 3ø×!l·šm¡X®.ƒÍx!ÚÖÊÀ1¸îžxúÓhB9$sJå|G«_i÷°>_\Ã+ºÚ†*]Ì ÷á[ZåáñëEQ:·Ä—:xàF>`ÛXuêx浦C}j—7«o9Ùö‚lá¶í8+ðØ-ÀÏímXs&e&¡y¥ºGca}s”ROlædýóH{ùNYI'<°ÛéV$º»Ò¬ÃK+˜¬í d/:ÉÏ<|¬„’Hä ÖÆ—á« ôhõIí­-­cxÒl³¥nñ·9çéVm´÷¶2ÛØ-«ÛAj× ±¬¥ƒ*îaƒ’W©ÈÉž”ÛŽq仼²”Ïu*Áj«dòÉå´ÉÑ$ Xü˹OÍÉÛÁ*¤šf§}(_·å~Ïÿð%À'8-À×-ÜèošâÛDƒV¾ÐâþΚSl³´ŠÈdíÉ^OÌ8ëÉÔ“éDš¤úzèƒP¸Œ †6ЫdíÝœpIœút¤›BiÖ> ñ@Þawͯ˜|Û—÷£é]y g¯¨¨î<¯[„6úDQ4j·6í&šß$§äm €ŽùŽsè*ç•£}BÊbæqŒœJ\Ž»wŒ~>ÕÖ|)ƒ@±ø—¥ZxÂÖú}X%{ˆŒ2ª³²ƒ Îá•á¥oFÖj.I_¹œß$[µÎbyõØŒ…4eP#Qñb÷ã|¡Ú§’¤ç>ÔÆÕnÔÈ•&P¬$Löý]HdHê ‘Ø×Ô¶úŸìÝyk%õõ’+ˆdr/Ï€Oc=+ã‡þ'ÃK{ÚÕìš«ÈOûEÕÓ,ŒÂÊ?…s×í^…LµÂj¬]»3â9š\­|›o5Iä½³½´Óííœè-g7GÛŒ¸`¯?xóØõ=Sã7ˆoäÔDºŒWÚRÄ×AŠƒ%¼YÌ}ÚaÎpkÄ #‹Än"ʆF¸\>æw¾Õ«gñ}Qõ{¹Íùºt2¹ŒS¡9S“ÇCøWŠâ祎å.^¦õÏÆ-oSMD] y¥r— c‹ý\Ý8hÜŠ»/ÆmoQk³=µ :…úK1XPl‘¶eÀùblT|§wZóÍwÅÓÍux¿e+àS'2±;qƒ¿6:äð;Õiõáy Á– YåH|È}¸Çnœ:qÈ©ö/±^Ñ¹Æ íoí&]ÎÜÞß Ü,|•Œt\}دCšµ'ÅnœðõœMªj;‘cR‚LçåÁÆ:œšò'ñ¤vSºÛÚO1T øÈ•WQ´î—Ö‹½kU¿{‡>ºŠ µÂÝãpŠÁV ÈÀ Àüj]6º TOcÖ#ø×§jŠ/ %¹Ôu0°.¢SíG‡¥2OA —ÍÒõËG›Î`›÷ 1ÓÆIûÃæ÷àP龃ç=Ž×â7‚µ-¢ÓÃq@o/BØ…@|»DÚ$ƒæï‚ H~a»®3þOE¥\Ëáým5+ÙÌù(B[„fÒŸ3‚T‰<ã"¼}|y¢"Ë¥dó0 L.¾@¯Ýãv:ýîp*øYÞšjM æ@`óp ¹nûœtpç‘ÅJƒêƒýàzÿLðÄöÚ¸UÕ.âT™­Æcg“שqÆ{WŠü"Ùÿ 'Çí)% ¡›¾?ýUÔh?ü5%¥²\x–Êêáeß´¶Qšä~ Þ%绀:AˆãHÀÕŠå[sãæ·õ÷aÝj¿ÅÓ|Vp¬óG™ ¥Ø$H~\’3ô⤲Ðˬ6:LÒj1Io¨d=×ñCž!†Þ­Ó²DînéÏyö­÷Þ$´–T¤[”ۭǨ÷8åùjÕLjîA‰-ï¯Râá^úÜÏcæ,p.ýñ`t_2e>\€ãËÛž ÆprH¬]FÞÎîнĶ/c6ÓpÍ¡mýÇN„g88&«¤1,/ öúoÛÞq,å&dQt3åÇB9ãŠÒÉŠÏ¡î^“ÌÐc“ 'Þþ”ÿˆ$Ÿë8?À:þ5OáËøE­„RNw"¶BžàzŠ·ãì·€õž˜ÍdYãß ae°³áÝŽ8ëËžµï~5ø{}à[+g½š9â¿´’XBd:§ïŽpyè ¯øVGÙm™ 6p¼ãšú›ãBY>“¡Ü[Ko=ËÚÈ.^ ¼ÖËá\ö8ço8õ§&ù„´G‹|+¿ŽÏÀVí–àÍjñ)~vÇçúÔY?ð°uуÿÐäœñR|,±–÷ÀºiˆÅ±Uƒ $ q¸ôóS–IãýXÚJò¸µ…f-€ ó÷GeÆ=ꔥbÝì»7‘Å5”ñÜ>ÈHvÈZäoe7 ¶ÒÁ²®#ŽiVç¹Û&ãÐwÇ~•ÕjóÚ[is_k4Œ™€\½ÿJã|5§[xŽÑô»£i<‡ýD,P´ýÖsÐóÔsT‰zž¥ðgD³Õ| oõ]+ì×/xJÛÞï˜Ü…QQ èTIÇ®zW£ÝøFO^øs~ƒiif Fê'iˆ"pÃ$²¹í…oSYÞ ¹½ð·‡`Ó4[»‘R<ö1£!çdÜ#z-çÓ#“]ׄõ§Ð|I>³§^›‘öHôÛT–ÁdÙ¶áñê››“éÎEKcMXù‡LÒï Óg¼žú{‹g½hż¸% d/÷~\çŽÜS„Wq2ϦšjÚ‡’{™AUªN{€NçŽõ×kÿaðDRɦúŒwŽÖêñ:! ~üûÊOCžÕÎÝNÚ|2Ȱ€¿»ÚpI >ðÏCß=¨Ü–;ZÔdi-Íâytyôæ[ˆìE½«â••w~®X©Æàzæ×QX“NÍw¡Ñ'ðBÙ7Û%ýÖô¹þ=ÝÃù¸ä⺠¿á.—A—QÔ4˜.üiieZmÄ(7؉%N98“ŠÎ è oÿúè’M.¡q¡¦ÒÆÒ[&ÒÌ>œg–ç=ªøÕ<7w¨éÞ#¼}nítiEŠÚÜ~îWµ*ʾT¸r2:Çz+R=& ñ¨¿‡ÓDµ±Ðµ;x§s[Fï—çÊ99È ×oà;ëWQוèn´½ž1Ó®ŠAm—)µžì¬óNc`è°€»¹ì*ùˆµÙéÿbðg†ú2ê>H—ÄÞ\–wÚUØy „Æ«p¯‘ò³à¶FO מ§Ã¿ <éà´‰gñ=ÍìW6šã@›¼–‹Ì äãaÊbC¹@õô>¨4y¼gouªxKJ¸ÖmaÕ ½¹µ2‹ˆcUÅ9ÉcÏ8xiRÒH’w£Gµ@#7q^‘aàíjÛÄZ–ñxsUÐ/-ÓR×,4VŽ(]@O69œ‘°†ÂŽ…°Aªx3ÅzåÞµi¨èchö‹}¢X]…‹ìÐ ˜àË~ý`ÛFH Ÿj`p2|/ðœöÐhvÕÅ·ˆl®fi¶{aó@Ìe@I(Øà‚«xOÁwsÛëvþ/Š?AvÖRÃo,¯tË´…s¶:àà6àp=+¸¹‹Äú쵘<-&¡ã©ìå}JòXus`áT AŸ$:« Ä‘œóTí~âDúDþ¼ÓüwöÔÓY¢5Á·Ú]X¸Î~`þØ(Ký60¾kYؤ0Ý +¦äÊçßÃþÍFk+¯°aæ‹°VA‘ŒóíÇWÒÖɧh©âû+{¦½€)†Úv`žz Œíq€r+ç?ÙÒ??Rñ\Nä Ôvì£<þçMèî%º7¾>\Iw è+—vÕ 5Ü ó©Åpÿ­ÒÛMÐáI<ÕþÚ‰C¯ñZíÔíÚéÐzûÑ… ß™¦dÜüÞ&Œ-Éúr+JÉwßC“´nb³§ŒÿÂF§&ß?øõhÙ©iÎHaýiˆù—â|R\|S”ÃöWºu¨º8V“ÌéŽçއŒ×màÛkk5¶¶B2<åò'ng y‹ÉäsÀè;â>#³·ÄéVm༠F¸MÈ$ÞOáõ5ÞøR[[Û(^Ñ´é oš‰J0Ì>Ü玞ÕOáD-Ùi·RÛÌM¤M‘¹Z;ž Ç)ïÔðy÷®kÇ:SF.`°™^IEË¥´ÁwÍœ&‚Ì3×è+fQ<¨`8ÃÆC`oïøqÓ¥gxÞÂ-GKH ¤NÎD± ½ƒp:F =ñŽÃ½ILèþD×6×:ÓÉuº‹ƒ&vÀµ³)è{óÉçWÚ?gƒÕîµ7úæé¿Â¾$ø;áø4ë{ýU£’ÛUÔ¦2_X›"Û¸cÀôÉ$óž8é_m| ãöoøx1‚´ó»ð©[C¢—®=j¬‡¯ãV%<ãµU”øÖleYIæªÈGz³7Bjœ¤àÔ0+ÊÜgµT•ºŸZ±)?J¥+qõ¤v'$vªïŒTîq“Už±ÃsQ1äúS܃֢fǽ2‘>ƒ Ïr‰ Hì\Lä,¡?tïg=q_[þÈv†ׯÎdÔdcŸ÷R¾Gµ¾khn&UÆp3_a~Éj¦#ŒßÌ? µT—¼)ì{OñE-Õcå/ø)`ÏìÜœ׬þ<ßã_•1’òóS‚Ê k!UºûD"AžaúWë/ü[N“Rý›.–'Dxµ[9²çáÏø×äµÌúýœŽ·³]K9óm­vϪ孌Ë-6äÊ–²Í#£H¥ÍÄ#k+”e'©ô­y>M8Bo­ÙL•V>bžú°=Eg¿ˆ%Hƒùc|à­ÆžàõÅMŠxÙwjH9ÌÐgñZwÚx¶Ðb‰ÛÌ*Hó0ìÒ­xç2x'W\²€÷ö®wÃ^+°³‚x.®í q&Ty»g9úÕ‰~>ŠßÃBÊÂKKÖ¿ÆÎeɈ÷†>½èÜ{ÃKY,âŠÂèØ‘%yëïÇ5ôO´Í^×Ãuæ¡©M{er&û s’XF#ûÄ]§ãpÞj¿a£Ú´Òë Ò-íâþþRØ\)#§næ¡ø_r¶ ·ŽkhæfŠXˆ”œÆÛÈÈÇR+Fó§$,rc»× Oj‹êÊKDÇ[Eí¡‘%’Kv;AeÈaÏ<õTs-¦—å<³Å|"eT1Ç@1Ú»¯‰7ÚÝæ•5ö“Ø¡‚ ww|öýÞÞõCá² /ßݼEq5£´Qª©6ÛWï ÝW®Hä zl*jÚyWKÙ"(r¥AcßñûojÚn£¦CÉ“Í3Ç{™B¦ÕfÁ‰Ç±æ£þÒH´Ë˜ç.%œÞt yéíÏæ+"ëJ’î=*{[‡¶»”ÞA î1Ž2¤ø'ò©Ð}.t^'øa§ÚGž^[ÂZÖÔêW QÑûŒÉ-Èa€ÇZ£§ÏyâÉí–ø@–Q*{và0`}@$ýkÌõ˜ŸNŽÒ9õˆ¤•˜ZæK Äjü³N8ÏèkgÁCWñÔöºv·gnþQS#[ãʹh%N7g$ߌ ¤’W3»nÖ>“Ð4]:ÞÚIÒ n€Žêg´lY*ó™ÿ¦œzƒ]]—‡t-_Mknt­.-X«›I-ÝÉáé=  u=ëËÃ߉öÖ×àk1È‘¥¹œ9ܱ¡ÆÆ|˜Œ÷I¹.‰ñ~ÒmI.Ì…Ò굉”1Š\$HprÌíÇ VNq4ågqaðÿÃRÃÙ“G€\Àu¡œÊÖÑÆ0ÖdŸã`2 Áç¥\ ´fYŸÈÓÞ/ ë³$:Ž3bs›^z8<ç§·5ÀM¨|]ŠIÚ{–I5urÙIK¤*·ËÄö Dž/ø“në$Ú £´w¯¨:½šq6PŒrpÔþ”sÄv‘Û_üѤKwm8liªÉ-­ôlÐXI‡wG€AÀôªiðQðf‘{o <º§‹q­_.CYÌwEòÙ‰Œy®E¾)x·JÍàë"†y/$2”à|™9á3•ôÍYþÕ0ÛɤÁqáµùòÜ+« @¹QÒ)ÎyD< >”þ-‰z§û-êV Ðmô糹Χ<–²Kä ˜²“‡ùž\ã#…¨“öXšÉä´¹#OŠ(¤±»ÝæÅ›˜á`¤îgÈÃ.@õ¨4Ú¢ÊòÞÌÜørîD»ŠY.{Éb{Єì2ú¸+ޏ«¶¶r-ÅÚê“ýºº»?n*ײÄO—1$|†<ÞÇ4Ø®u¾3ø{ªøÃÖ:.¤Ö‘}™P=Áá–Òd€D-[ Aw@§9# ƒ\«ü<ñ-·tÿÛYiË=µ¬jtÉ/ @‚(¤ÊdLTgË<±Ï<ŠÚ³ý­<=¨ÞïRÖ%7Q Jîdž67Qãʸ\•S¾*Ä?µG‡¯mzà5ÁMvë6Ñ17ÈWd©éÊÏËOq]4¿„÷ðè×vÑIjËyd5³\ä¢FNbã~H#ï:T²ü/Ô/4ý"7(úu”zžèîÖAöpÅsa—'±äWMíá›´/&´ˆ^d×X¾›|6,mÿ—s€7uÎêы㿅&!—TÒ% uý¹²m9”=ÑkO—þY0ç‚qëKD3˜ñâC®xSÐíuéZ¥ƒÞÆ,λµ°—#ÎÓàž01Ц¾×l<&ŠË©Á=¼i¨ùÀ¶ZÁ³Ë má·6 œàô¯D·ø¯áio4)L7Y!„Ñ´ûߥû×'å"xbßË\hWk¯}"Å©:™ìÜ6tµ >fN·hÇZ{ÀÝÉãi`CýŽå#gžé­µ´a.”Ûñb3΀Ýîã<Ö´z¾›‚.>Ó$ˆ¯ z”—Ñÿ.IæE£æ[ÔQ`>O´iç²îaÜ´ež ÙT89¯#ýŸŽÉü^X€¤zÿ*öïɤRþÁ®ˆecd.>øœnÏSÛšñ_ÙêAž'(—‹d¯²Ç»FÇÆÑÿÿ Œc:¼]ð+¹G'óÓð®#ãd¢á|,UV0Ú¼cl}:Whà÷ÇéMjîSº‘‰%F-T`}kB̽LrsŸ§¸¾p1n£ùÖ­ƒƒv¹G¿Jb>bñÎû‰óÁ ÛYÞNª-ço(ÁÉ8ÇNQ[ú‰Å„¶®5KTƒRP¶òØ”"e*$fÛ÷CyÎGÏø¶7¹øyl“ÝBó¨ 5ªî1Iü¸ÇrÚêó\x¥‹PÔ,¥ÕIK$–̱ÉÝÌmÃ#+ƒÉÏJÖ׊¹—VÎæˆšeý¬Mgu§È÷,aµÞŒ»®T ¯N#æVÞ3€i³c¨èj}b ò…ê1UÝêiœ–,NNrMU‘éLhcâ cŒÒ»š¯,Øã<Ò, „HNxþ5öŸì•ÏÂ8ÏM×ÓŸýü+â'˜ää×ܲz‘ðrÄ‘×3î7õ«ZØö:)Ð`|Óÿ ¹K?ÙŸU•¢yñfGÔ“(Ö¿(µ‰õß´Úµ»Ãoó ‚U]³Æ ú÷¯ÕÏø(Šný˜µsÙu}ÿ~¿ã_“Þ&ñö‹¨àÓæÕà,’™ï›b6zŽOÒ½ Â:¡Ô£»¼„ÍK)P².ÓÆqÚ¬øšÈ^X-ó»-Ö• ¾µ‘T%^›‡ñ/±¤­xvÐóýOÄ:~‡öd“×<ªÑlôë×ðª’ü@ðôÑÏmu¥\Ù>Ý¥«$‰î=z÷OþÙzΧcÕ¼¥ßÜíÚ÷¸Päw AÛÇaNø·ã›µÒ[ÂPé—1LníIu ~\¨µz5(á£hU»íc’5+9(Ê^§ à¿´øƒO’HŒsË!ŒŒ±±\|­Žç󿢷»Ž8#Fp î 7AÜÜõëœøga>¶˜ÆFqósŒ1þ€ ·o£Zju9çBÆÞÞ- Êòr;×™gwvvßE¦§G¬øîmu,ÖêA7Ùbòa* ¹}Oš<9ãÄð•Ü÷‚Ñ/wBÑ2JÄ/Íü\w¨¬OX½¿‡nïâ‚Æ3kà±Á´·8õ÷¯4ð÷'Z”w’½Äfη ±`{g*’@HÔBö=_Û¦B,„(ÎæçÒ§:Ÿü$¶m²»ÚX\Ïx¦æ<+©1 ëÛsøVŸ¨MyK½%@óÎ3Œâ¶ä±±¼´ŠÞX;xÉ‘bÐ<KD˜öZÄ× ¹ÔÑ!Œéþ{*ÝJÜ{ô?­vQésiÑ"Ü걓cå•K™—ø¸èXrAëëY1xoOtP³ËcÑoŠàÜŽ*ì›HeK½¸çœ3}3ÆE&Ó@¢ÎâÒÃ\»ðþµ©Ùê±Ã¥,±¥ÑYJyÎN|µ“ÐŽ˜«‘ø‹Ä-}%óêÏpc0™íN7àasî09ê¯=:ä®0YœwrO®3QϧkQ)DŠúã's¢Ê 'ž¾µŠŠ}JØõ1â¿iÚDÚtÌi¢/%|Ì÷LÇÜz0r{Ö¥¯ÅoÚëöÚšÜO(†ô\5¤³#Ç%ö ¤cïæ¼³ÃöZ­ÙæîêÐ';n$·®{‘êzW{ðßÁ–ÿŽaÓuÝpizZZKp·Kò“p%ºœs[ÒúÓTãk²'S’<Ï¡ŽükâŸ|8—ÂÚ¬RKm>¡-Ü·Q(YD¯È¬¾ý«š²HtƒeEÉ1ƱË#“¾y€À$÷ãÓñ¯££ýž¼+p±}‹âIIC,eÚ&ÃyÆá“^oñãàóü$ð-®¿kâèõÈc¿ŽÝmB„mÒ“™ Rr:+Ñ«”biAÍ¥eæsÇNR²çI2Ÿ$Ï¥]‰@2A 'eáLû1–ØO¤Ü/–½ÄHv±?p{Æ*ŽãB.;–åábF”ª’~ñ9ý+¤°Å·QÆÐéÖÊ–á’1qp ¸n®F:Œñ^7²Gb“hóè4kˆ¼ÔûD§šZä²EÎø¾‡Òº ïhZ}ÄÒ¹±0CCü–¥•¦óUè3•ǹ5¼–šåœ®%Ò"ŸÊGó·1êÞõ¥i$Ω Δf¶HÙ¼’@Wœ®<Î:ñÆ}+FÙ |<¿Ð4 ;­SHƒZmAŠÃ ’¢=«ÆÙÌß÷â!þd ôïþj7züW-µ¤zmºÝÄÓZ ·Y¶@§‹sœ„ê1Ö¼ú9tÚ>¯e³JŽç¼q¬‡>OEêxW9‹t׸ehׄH9¹(¥Ž0þýqʳq¹|Ö=šóIønóiЛ2.u¾Ô¶ñ@AKÌ>Ã.Óû¸Îß•ù?v²@øe¤Þê;î ŽÍÒI¡–)c”ÊİÆ9ÉçqŒ×#m¨èeCndˆ †ÐK\g¿?w§Ò¯­¾‰"²Ç,Äíü·JK\ÿÏ>½:r9©öaÌwZ‡ÁÿXkQéFü½üÖ£YˆA1m¾Âæ=UQç¯Lrk‘ñ‡€¼-cá+ýOBñ}¼÷K‰-K\n‰Ém¾J®ÔòÄqŽhH±W–[{»Å"/;ppÅåç÷c v=* W–W:[Ø.§0€©»É„„Nœ7{Ó³êØÈÓšæ >$»‘f»Xÿzè¤+6Þqé^oû9Û½âø‚°e—SePÇ NkС"ÖÝ".HT(õÎø×œþÏë‹•,OöƒòN;õ®•¬]ˆºæW6>4ï·ºð¬,G˜º¸S·H×Tu×9õÅwðïÃ?³ˆRªÏo2¾™›‡ˆ†ÇÌ~^§ë]$ß ~ jeÚÓÅ’Û09Ú·À‘ÿ}kס—T¯MN3޽±ÃSsqqqã¶² µÙX)ó­KBäÇΰ|Cmcðëâ%þŠºÍ®¯§Ë\ZßFxÁÏîÛœŠKÿéÚ5¬×îâê8PŸ*Ûè;šó'NnݱjQMâM2]gâ6¡c7r …]ÒZ:Éö=+«Ñ4‰õ˜„—êútº²ãk’L^ÆìCɪzF¿6›â»ÝPè—òCpÜ(Ü1Þ½ Ï≄ö„nùÐ>´›ÒÄ¥ÔK_K¨­Ü©¬L‚H×ibG\rœpÜ7#““Zßð¨õs)ûU¬â8ãk*•I0?x?Û8nEeEñƒÃ’Œ†¹Dä«5¹#=ϵjYüIÐ/W庑wÞhY@8ëŸ^j7rô:Û-OØ¢Om K•Œ âöë_[ü*~Ïß F8:oÎyM|coâÝ"òÆY¢Ôc’2­¶L’¤àñùŒq_i|4ŒCðá4Gr¸ðìD‚9É–Oñ4¥¶ \“’xéUf'Œ22xçÓò¦ëº‹é¶’Ážæ(–HáÁ;ó"¯áÄÕF´ºm^öwœ›mâŠ(:`öúóYíC6ÐïØda´ì^à°×5GY²ƒQ·žÚQº##=úV”­ÂŽ ? qúU)Fâ? L 3 3-Œ98ªçõ­)—9ÏÓFdÎx>•#3¤j´×'æ´"Éïš©,)äŒEQ‘Çcš£1,ÀçŽE^’€£ ÅU{vÎ:Ši ²Œ­HÍ}ãû*¡_‚š9îÒLGýü?á_ F#s_xþÌp˜~ è*zþôÿäV­©­I“ÐõAÒŠZ+s#æÿø(0Ïì¹â#·vÛ«#ûyŽ¿ þ"$í%‹Lm €aä‰ò Ý‚v:Óú×ìügöWñQþìÖMÿ“QWä?læO³]ý²DÇÙVÕ!VÈI½‚’9¨ûE­Ž*ßMk©û&ÒÒy v•|»† öƒ…˜?°#úÔɧɠÝ@ö±O9·>T#í¤ù¹&G>»Iü±é]gƒðßMzð]^ÛÁ³ÏuAŸ—¸èsßž+?ZµÓµØÍ¥Å嬑ù‘Ê °0C®{ƒj˜Ž¿Á¯çZÌÃ8ó¶ì_ë[Ú“ j r~ÎÕ…à{X¬¬d·· ¾ÔTÉqÅojüèšªŽ¦Ý¿*K[5ð¿&Ñ9Ã$óÔ×®ZLðîulŒ2?Ý5ä \µ %J‘#Œ{×­Àw!ªÝ?ݦɎÆ«´²ð\Eí£¹YxWqÁV,yúŠ“HÇü'Ø çìÖà’:ðj…út·þ €A±¼¦“pw ~ùõëSé*GŽ5¾ ?g€qÓ<çùVjÜÎÏÔѶҹcÇÀÿ ¬ã“äôüzW‡xvÒiï'ž+[‹¨-cM,HYb]Ê2qÐn sÜ×·üD/ÀšÛt+àg"¼[À>&ºÓµ[‹Ki¥ßBñÍkm[€0ÊŒ;ÀžüÖ©\ÍÚúž…¤ë6`€d+Œ“¹OZêìüA`ãö1Ž1¸ŒJó$›Än‚q©H#YÈ[q3„ÉÌC×½ªûxÿW†9­ç}:VòÑ&'N>h#cGâç zRÕÙ”º¬¤í¹ˆç¶áŠz›IÀâ ^@'5æ°xâê8+í'F–à•Fu‰Ð#€pƒò°ÆOcšÕѼe¡µÊOÃpM¸£³»òÙ€ûð)#¯9Ó¶)5d;¦vfÊÒO»Dû ºE²±":«CXž&ð„·!çÒõ5¶óÝ‚Z]!‘ãÇ®Xe×¹èFjµÇŠ4âƒÈÓµ÷e%'’9U•É'kEó|Ê>PÄô9ëSò*éu:_ì¤l|÷AÈÅÃŒ~µ?öy@o/qèf,?ñì×0ƒh3s´ýŸSš-‘ÿÏNOÚ¤ðÍ­íë'ŸS¶›í.ê"¼ó¾=zšö£éò–&Ú@än™ŽÆ©^i¶VÙÍ:¿™‚Y³Øû{U\i+ø{_ ¨N·š›42y–æI”)P9Èîj?ÙÚµÓu϶,“‘|áš'Ãõ÷=+Ñ®¯KZÊ£²·ÝúW›þÏVÒÝhú¤qeæ}F@ª;úÐþp[«WŽ5É4MkÃÿa¶Ižâáà tÃpR;z:Ñ?‰op‰qáØX¨ î w÷•ñ%¤]Á‘²àÿhIûÃñí^Æ|{ÿBx•5ŠÜ»!†y 4Œü³þÿ¸4tÔç“Éâ¨m¾vðäq½Œ†±îÙ—@)ÎAŸK,sé^ái2¾•­Úi)sk<ªÖ!@Éɓ޻øsP0ª.”Z{sp©¶XÛ`êNƒÁ¡¡'®å-oÄÿµ»¦º¶›9£µxâ{v⟡KàFiÞï[76’ ¢6šH’&õŒ}ëjÛ]ðõêÛ„†ÉÄfHÀºpBþÖpF_J†ù,u{{X´÷µ†)þeC2Ê%+üX+îihgWá_ÁÚF˜–Z>¡cŸ i88Py$näò{×Ýzi‰þ|>ò‡A€¡ig?Ö¿7îüoìVâÊ}--  $¡mQšPY7Á¯Ñ_ ²7Âo†aT>²eŽH ý L¶“Œ\æí+¿¹ŸŸ5N@xÏ8èjô‹Ðõ"«ºñœf³°¥gY֮ȪξԬ#ÍDЃÔUâ b˜S?þªV$[³G—ONx¤k!’s×ÖµDd!iLYе0ÚÀq¹'1Á'Óß½BÚqÅZÖàÍþ„„r×ÀñÐa ëéÅi |cz«$ém)Úˆ]±Øgñ¯¶gëCeð“@Œõ)#cÓ25|±±`PVÎØHfn:¹þíÖ¾´ø+‹áw‡‡ÀOîÆˆ;¶)+#¸´VægÎÿ·âoý•|aس9ÿ·¨«ñÿÇÖÑy–÷ò=ù‰ 0G>Â`l^Õûûq[ ¿Ù—۱;Y®OA›¨…~9üHKH/ ¶)ÕWpWISϘ=‰gö‹Z#‰‚ÚíÉ$Õ!W b³%ʰ©.G±dvÏ5Ðø{Íòe•ÅÒmÂaQ°ãûØÝþ5h4¨ãsvÚ|6b2ª#•Õ™?!Çc’NHî*έ¯ÚDÆÎÚÐã ·àGú {àþµ[»µÏFð£~æã’|ò1Ž:VΩ–Ñõ ÿ*³ð›PM?ÂêÒÛGv$“€¤±Ãpy¨¬ÑÓâóÁ^Â,6Î ¬ÓnNè«h¬Íc·Ö…u`ÚÕìèQ–XÓk ð ‘Ô óm/áî“oo=ÔKÑÜ-º««/ÏœÓ;yá¹úW°]F—VrÅ#˜‘—Ôão¾k•Þ}æ ×Í,±Ä¬i?8ö õô«½´%­N 6ÚO±›-^G–æw[hÝŠy¡r$ê>V<žã©­ŸøEî-˜DšìBS+–Lõ\öÇcŽæ½ßáo4©¼#±©YÛÝ]ðÁs*,â&ÜEtV …Û'8uï×´Ÿá¦¤ü@ƒÁÚ†"¹Ô­l„ÒCr¤K$ì>Îèù2‚©85<ÁÊÙó>•àcR¶yŽ«h‘¤{_Ì*0GÝ}KG¦95§­xò{‹»mÞ;èÖ8îc¸»d À Ѫ¡*Í’Oàt­íN»´Ò®üùa{(îÚ4ò£ C ÁF{ާOSššâáÙpoM—“*L&Vec"²œ!ÉãŒÓAcÌEÖ¼è#NŠi'%áT…a¸†>RÁ´·º¯¥Ý\[\èAd± ç*1À¸üW'z›\ÙY^ëúž§s§>½ÂdeùÃ31e ”ŒpT”É$œRêšdº§‡ìôdñ©¹ÑnfšÒV` r Q)Qæ*ò6·##ƒ‘I{+¨¬¢º—F,ÜQ2¶Ç÷ôä(hnVw¶’Âþ œ,G¸«¸Âã·ý+è­ÞlêÔôG÷‘¶›nÚ†Èb^È猦3æ,2j„ñ4Z: mFÃSñY»û+ØA²]Y¢\à»giˆäî`AÚ=(¹6x‚Ê÷ÂÒÙ%ÉÐgû Chý¤Ü•\}íÄöÎi_¹v±óV£ã;·°• xm¤`¸cæªò9ÚGÍTׯºœ k@c^âŘí<çÒª»lTtò”›eéM—Xù"' Þƒ?Q[Þ ðÌ^!×lmoôÁik#(¼¾†á]lÉl$“ÃVþ.½Hn­¡¼""Œ3y†FÀÁU-Ž˜îzSM¦Xñ¦`ßxžÛ2ù¼·ŽAï}=êX|oa•Ùâ]NÒycíZNOÅÇoz½©|ž+8µ3Äp^èdýžãP—÷KȈIå²6Y•†v²ä0”i¿¼]ªé6w­%µ¤úªƒ¤ØÜʾv§ó”Û2:Œ€H'ðÅ=j-Ží§‘ì1ã=¨°jv“Â$‰Æ?å›túWšþϳ½®…¨Ë1ºj2è9¯E¹»¸²…Þ}>ö(ÌnÛžÙÂí ’sŒy÷ìúm§ðÅü²Jb…ï¦ee]ÙçÓŠ_eܵ~ecCâ>eño‚Él¹¾vÉ=NÓ^éoý²žˆ‹Ë7ÓÒmº{LUÈ,3!fô$ð+¾ ²x)co1܇vÒ O8í_Mè×®ÿ/íbŽçËHäi”„ޘ˟ulâ•ôBêxÚÅÈ9#ËAïßš½jAfÏM§†ät5Hø›Ýg¦ÔþF­Å±èB1ý*Ä|ÑâYdÿ„÷Vò® ´‘3™¾5O™1ïèk£ðåí¼±Ê¢êÃÍ1ýºÐËc°ÇhK‹îô##ߚ絈¥›ÇZ³D׫,,.CY®KìQò}O§?Jìü=¥ÞÜ¡¸]VöÙ.^F.-T˜£9ÝëÇC…ÀVšY[S6þh ²“D7% Úrή›-~o5=^ž*M9nàY'Ðì4˨mÁ“JìŸ= ýê°c–#ïcõÖ_ø"çR³¸¹Òu{&¹GCÅ¢‡Ž#ÑÇÇ*r8ç<úÖ÷‘éî,,N™m+’Æ a1”P[ÍVÏ Ó1'Ò ¯3Òô_ìÿøBngÓŒKÛÊò$RD“gιpx¯¿ô8? þ¦3·ÂºhÀéÌúšüøÐF‡w³h†1hm¦fhrWÍÛóŸ~>•ú~G¼8Ùá}0cþÝ×üj$YVNN{Uw¯aûûT*§ ¨š¦|ž•©íNÌ åI8¥ÙíSÉíÏ­?ÊÇQNÈ –»kÐÙ_%í^f8çpp?,•£åý*³ZgÄqO»ìMÐ;ïù Óò=…1\θ±óî-¤vÄåØÏÝ#?­9ÔÇ­¨Kg¬h–hŠRöIUÉ䀑3ð{r\ñV0B»vÎ!•ç•äW*¯Rª0 õú×Ù'ÃOÀû(?©¯nÄ$úWÙÿ SËøqáåóè½h†Œ™mQ[xWíÀ…ÿe¯•áÒO¡1é_ŽÞ<¸šäÛÛGñO&éþÝ 1íŠfäWìoí´¥¿eoˆ˜8"Á?I£?Ò¿SÁïÁ¯8øoáÉà½6×’®œí2ïšQ•‰çÔt¯g¶ð„«áIµÈõ +‹xn×ËI?xø$oUþïj—%{©§'¶<÷áu”·¾AŒå›"IU7ŸSÉ©-c#âþ÷$­”k哜rz{U‡(ÂÑ)Ëÿ¤Mëýþ•¥¦xj+íJóX7SÃu(2©B©>½8zSZ6ÍV55¶}:å.Î-J0ôÂ÷5ÈèºE®­ ú}ÎØâ¹ËQ ÃxT‡ÙŽqÇå]d:Zj?•~·0Qò¡ÔŽýé@{,­Ì*€ªÞ^ÜsÀõö£q´{†õèö¾¶ñ=¤Qi3˜oc7šu¬Z³¶²jƒà °=zŠ.ÐÑòö«§ÚMâ4#O¹ŸÃ:jKŵʵüò°Üc|“òî!sÀt5Ój^(†-O^xfâ_\#YÏáÈt D«ö´lòÊ p'Ú½æ?…^‘CÙiÕµ¤Ëý£n°KÑÏúÌÿÓ@A8äã=jøA£@ÄOq¯iðZá–Õ_ÊÒ[>UÏËÕ³Á‘ÎTR»çïG¦ërMàk»ËÝ8mþЋ[Ô-™a‰Ädù~W9$ÈÁ¹¯bð7Œ¬~"xÄz‡"–Ã[²Óš+;ûëçI,Œpî–AFY‡;TžÍ_‚zD¢¯ùÚ7oS´ìä2àçò¯A³Mçˆ4Í" 3]ðí´·ö“]FMÌ… ”ÚùŽ7Ù>õ_Ãß³ˆá¶¶"m+XŽëNþÖËÍib‰þrÀXàŒpç4“¬ÏAý¡u;-?ÂÖ“ƒý£âûAöO ZkV º]-€+<[‡2€ÜyÆÑ´g5çi¨øšßE²›FÒìSQÕ,M§Šm ´BÖà:yo>r#ÜŒ­æ®ÞTgžkªø“ð“Äÿõ­V¹Ð%½µÓìÿµmí~سÓ·)Hãmá®X`ç;‡k¡Ö´ëSÄ)¯êÚÞ¦·ÂÖK]BÈéû·@`1Äv¾ÉT`IcÒ¤V²ðƬ¥§„´Ï ]ÏcâCº|º•è’{yÀr [# ;—˜t5æ—Ã7·í©Äú¶•¨è°C•m¼\y¦) >d‡Øï,Ãj‘’@ô¨ôë-OÂÿ ¼¾+²7𦠲Gt¨ëeaö£(_Ý ©ÀnJ©'œÔv>ñ§àmJjÝÀÖÚœûM£<— ¤á™ÝÜžøÍ1ìhϧé1[êzüiâ .ãÅÉ$P]¹ rFzÖ¯x—Á:†½>˜¹yuqku|.Ú” éåw–ÜÀ±¸äÒ¸X¿5®ï„zü¦  .G ´ä{ðEx—À ÁN‹©~SÉ''óéš–§$>¿°‰c É·Ë)ÀÝút¯:ýœïfÒ¼$—Vä cºœêäàþ†©ß•Ûq+])¼rKxÓÁqçÈF; ~•ëvÞ>Õm|+/‡ ¬šS)6²1êw =›"¼Æß7޼žI–f>ç»Vã$u•Ìxã̸¹„Z^Åe¨Ì¦H'¸´óxÜeÚq¸ëœsŒ×Orà1Šê-ĹÃã¨ý~µÉøßRžêx,-®õ+9åFºŽê }Án.œrÀ˜ÏË‘Í!½ŽÏKŸKo†·Ï¤À–ÖŸc—äH| dç;{s_£sFÃ~LržÓŸèÉþ5ù¿k­ÛkŸ ¯ní {X^ÒUòž0„0\y¯Ò}F2šg‡ºèzrãÓý:Î[ ÆuëUÜÖ¯J†¡ò‰¡!”D|ôíœdg‚#éD°ÿÄî ÏÙØã±ùÿúÕoËúÓ¨ˆŽÔï.¬ùB‚„S°›*Ìc ¦`›Šç ñŸ¥LW `øâõˆRF›ŽÜyŸýjÚn”Äcêj\ëZMÉ$=¡™Õ{Ñ•þLžu5rV㎠ŸÄU9É 3H WjJ‘ÜœWÚߣò¼  §LYEÿ ŠøªfËg©üÿ*ûwÁI³Áú*ôÅœ?ú¢;„Ê(¢´ ñOÛF?3öYøŒ¿õ 'òt5øõâyM­”L©d¤ —q,~ëWì_튞gì¿ñ qÿ ‰=8 ×ã7ǧÛß,—.ð¿c·`UaŒ…îT{VOrÖÅ;=rÆÎâpÒ@$óV)À, ”õԑߦk¶ÿ…¹¥Nì$ŠîHäAH]#'hU8Ã)“Á+ÉEåÆŸ ‘O5íì‚Ú9ÞØ8.Ù+/@éÇ>ýjäºN±—šæÞÜ< Äh›Á}ˆØ=r«0=)|CŠ/îµ8BìŸhùT*’8Á‰‰kö0"XÙXNr>q€0;àäóÖªxRÇNŸÅrÝëdú¼ß6ÐÁJb”¸”r8Î{TºÆ§w­[ÙCp‹‹8¼¨Œiƒ·Ž½yÀŒ})|-«/‡5¤¾’ÙîB«-e1’J‘÷ºãœã¿JJVcЧ Ì ¦J·VÊÓHØUVÚ¨rxÏÎx“O¸–}&òÆUK¼Í &A•y@®qÔgô®Ž4ÜîÄ$³p ÆN½kœñEÔ·XiÑ1·3K) %¢&¼{Ž´ÕØ:Õ­lñK7¢_2Mò2gQyxÆ88n8JÞøy¡iÚˆ,aÕ'M3DûRÉ=í¥ë1Šñ—÷IÊägó5Ÿg§Ïspmæ¼¹w¶&Þi.,UƒÎ9KŒú€1“šë,4»k8•&Ô,r²€ˆ7ÇåÎIÿëÓ“ÒÆvÔôíá†î?³â;¼°‰.®`¾k–b¶ gÊiIû¹Æ'‚8­m#á,— £¥·Ä»H.o,®.š;©º4g…<õ`zŒ;ãítÛGú½Ìz„O¢\L‡P’Vî%r Û9Î8ç¥YŽòâmVÛQ“Sµ70WíA»ÊXÁX—¼0HÇzæ³îk{t; /áÏŽ„siþ5Óç,ºŠÇö€¥cRD:¹¥iÍáŒ6q\˜õX/tXî˜ ¬‡³'ýOQòƒ“´r:×—êqÜÛxHiW q]¯³DŒ&2I´4l{ (ltç¥iér^Yx±õ©à·¼+ y,Ñû/’S=œd‚sZV—Fv;/øƒãƒìu«½j8žÒ;a{3Î’Ù¹ˆ3ÀÀÁ^xç5ÄÝ~Ø~2×aÕ[Xë_¬ íèr°œPS ³9å…7Ŷ¸þ} É2ß<ÂkAç3<¶ýc¶eÏ(¾ƒ‘XV+m¥ÚÁ–™e|¶¨»".OÞ]¼†ö9¸­ij&“;[¯ÚÇYšM^KßX]¾¥yo¨JÐ4nexñ‰#mLpÙÉô"´_ö·³º’ìÝø*=òêÑ^—·¶ Q6·Í‚üŽO¼âW?h•ï4H't> åNß÷GZ­-–‘*\ "‘”FMº*áOðŒ•q”RR}PÜWsÙí?j_ ‹†i¼1u ¶¯’в§îX Öb8'<.ON•«aûTü:—ÈŠãûRåÔŸO™ælÍ`GüxŒ÷RAÇÑ«åH4'Wpö×Öƒ`Ûkv6¬%¸”zœ}+¹›Â6Vk©ZA¯¸û4¸ÔZ•®ÝU ?ÀNæ\ž¥sÆk[£5séM/ö‘ðV©·Ú|S«m¾žM:ýŒ¡Œº`Ï•ÈÈt, •ù±žOÐY|oðˆ-ï§Aª—ÓõI^[mœeþÌÉ…À|2‚FO-À##çÿßxkÃV^Oøa¼Toî¾Ý+Å…kxB´-ÙÆÖ2ùÈë]¦¢ü1Õ ºšïÂWvðx{T–=BXnU™â•Ú8D\‚ä>Ñ•Æ@'<Ö~ѦZ]™ëCâ&â¼Gâ½Ä[¬µI¥ÓT 8àÝöyÔvó>\ƒ‘’0 °/¼?ã¦d¸—Â0]xŸ÷7 Ö¡N{c”n[¤ Î:ðMxï€>èÚ‡†luˆµÍ.[ˆîﮕxxc €®Tqƒ»Ò©è?~ëg†®äñf§¦[^Ëqo,Ð0Hi0Œ•ä3œöÅ/iÝ/cèáÝÅaM¿‡ü-lj9µXnÌCO{r7©ÀJô»ŠÏ¸øG᯦¡q x3OÒõ_Á»FšÛSØÖÒ”HW ×9èqƒ^?aðGAšûH°ˆm¥j+p·ß#DÖ…3峆Æ[¯c\_Ä ëáo€ô?ÚøÖOGq$ôý6mÓ¡ Ü€s׌ûÓDÅkþ"‚[K=ZÚq‰bŽXä·a€9ç¿ ó\À~ÑàuQ$Pÿ¤JwÊÅAùv:ŒÿjÑ.燛jÎCe23ï\?ÀÁÿú ž^ü¼þu»O”[3OƼ|Aðd`«•y¾d9Zì˜æ¸Ÿ1ˆ^r9àq]¥Û$OÉ$îh˜4¤ôUùÒ‡%y; IÉÙu2³©^®x ¿Ê¬>LÞÑ·òªÂ7‡UÔRThdIv²H¥YHŒ˜¯ú=Ã@òÉý)ÆJJë`i§f|Õu*Ëâí^7{5ón Û}ª"ÁgÛÈÜä{Wgሥ–è%£é9gx¥pVñrXc#+ŽÜ)õÉ(oøJu0.M±¸¹h¡sn$ò¥ÈÃûtÆEuvWïÇ‘wd“οg_6À¨7ƒï9ÂôlýãÁî+W²2WÔÒ¸Öõ Ý­„/«1’EP‹±œEÔàœ9ë÷Ž)­ewu§N±A«ZOv Üße¹ ÑÌ»³ã†è0Ná‘׌Ð[ÍYmôg.ÛÙÖW‹:ŠƒÛ²œuSš»ka=ÔZt^d…§¹{]@nŠõw~ë8ÎOãqÁ©Ð«ÜôHõ—×>Ý^Ée.Ÿ$–r/Ùçá{uëÚ¿Lü@ÑZG£$²,yÓ,"MÌ[ì©Ç×׿¶¡uyà+¹oíM¥ÛÛ,!‰+À{ðkôcâªÔ<-òÜiÀäYŸð¬ŸùöC ÓJÚ§eëéQ ÏM8LBÿÌÇ>VÝÞœš˜ÅŽÕ!uó<¾Ø™§ž‚¨L®PZ‰ç¥Y>ÔÇ!T’@\OÐP˜Š lVñçÈ!£ŽýT²‘%D²¦ :†¾*½ÜÂÞ•°I<´^iõBKŸôÃ"0Ùí׫·GhpqŒöªWCiÜÍÀÈþ_J’ˆfc‘ÀÇ_ç_sxHm𮌲„cþ+á‰AxÉ<qšû¯Ã‰³ÃºZž ÚÄ1ÿCvL:(¢µ òÚæ1/ìÍñOý§?¯Å¯-ŸØl¥Ä2j¨Ùc™Š‚¤ücÞ¿l?jh|ÿÙËâ:zèwGòŒŸé_Š1VÎÆÚ4d¿—æ·ºïayú=k7ñ#HìpY,¸ŠÎk`†Þ7†øäÚ¹æAž¥[ר×Ee{?ölzs¥äL¤Ç‚U•€QÃ1뇯LÔ¾Ò îŸżQ-¤¡Œ"HDEa'”Æ}yÏ¿j{i–¶ÚÕÊ0ƒíq"Ç&ÙO ŒÆ}qTؼΟÁ¡Å¤¥Äˆ]Ëyr€ sÓŽµ»xÃì7y&&á°|¹8 K’T6à kÝl®ºÝ·_¥"‘âÿK£NÄ|é qÆzQ^·`ê0ãÛóÖ¼›ÀjLósÞ¸Çã^µ` (½N?¥) lsGüS¼ãjœ{ýú·eá5MªÉwt“!òÄɈŠQß9ëKðŸPþËÑåsw?¿¹d£ n$gê:־С½ˆ; bË2@ sQw{X»+&1ü3§ß@E”©‘’X&vç¡ù¹5—ÿ¿‰ôñ+Ãâ8 «u ¾ÙÝɯFÕìä²Ó<>©¡®j¶Œ<ÀÊÂìÿ}p8OÍ““Ö²ô]"ÓSñdRjÖWZ–ž!ýÜÈÒ°wòÇÞôèyíT$rR[øÊÍAšMÀé󗯯ǫÜÇn5±kr¶×¦0Ël’ÛxCx¯Eí—L»KØ •ÛlQ«c˸SÓÇøßNÓ§Ñìîu6NY^„=œç+ÔñÔsJã³9X/×$mz[ÉUŒŒqÏD=CëÈ«°ëVw)\¶¥;¹&)æ·*ħSòô+‚rq3ÍR>Ó5E/yy–Ùmn¥‚䀩ò›lg¦àª2yÏãD¾Šâ9ò/­ç¹†10†àÌXÙç¦ìg'5m".ÎŽ?B$Þ&Ÿdß½Xæbªñœ8è:gÖ´"Ö5Û“!]^Öê9XHÂHQ„˜.ÙÀÇ{׫é2ÇÍÄ7‰²ß2 1Bß÷àŒg’AÁ¬»ygyÕžóP¶‹h¾Ïk•KRyƒ#¸=†µO*è;÷=WO\eDó,çL‰•|—{€;WKàÏ kž9ñ¯†¬-lžôÁ.¤¯4»Uʰ »Œã‘€?:ñ6Ö¢ÓÔ“¯ÝªÂ‚âmÖÅFßêñŽËÇLZ]â‰<9¬Å¨Áâ„ÓoíÑ¢»½³¸x¤‰˜ÕìÜç½kF4ÔÓ¨½Þ¶"mÙòî}Rß³‡Ä;#ÝÆácv|Ç|£{^˜Lšâücð·Æ¾Óm¯µ2ëH²‚LKµz·¶»`‘Â\ȇˆPíÉ÷'‘^•XåΓ™>›Zç4>°¤¹­bä:©‘ãP÷ÎÅZI6²’òÁùºï’i[U¸’" Rè:y²8±Þ/< v¹®/x‚Ô8›Nyv¢ÌØ…vüÇýX#a×# zW@¾:Õ4·xž]?È‹,›& ¨ÃålŒç‘‚z ðùQÝvËp>œó™fŠT™cÜÛ­] >Aœý+¬ŠçF×ôF-böT–æÌZ(%¸“h+(+ÈÚ azvæ¸ñ–³u$[E $ëo¸‘vÿVÜŽC`ŠKOxŽå 1iÚK¬Ò˜7­ö?ðõêœ)´hzÜZNˆ³Áefê+{T¸óoeU{‰‰ÈÆáœ…'¦M`>§¦Cy-¤¶3ÛJ·ç„‘Ô8" FGÊHÁŸÎ¼ÚçÄ>%Ö­!ˆèpmºvE1^ÈëÉRÁ¸c‚F:ÕmOWŒ@bÑõ¨Œ¡ä„EvìNÐKsƒÆqÔ“IA63ÚgžÈª ‘zˆ‘u‰‹b%¶ ÏNO#¿§4ÖŠÞKµ¹¼¼Ž8¤Ü!PÉÊV2£¹Çõy 6Ôb$ø‚!"™ã,«&ôÜpÉÆ0O<ÔƒâdÈI}^ùREó€¸Ó‘Ĉ?‹ÔôÅ>Bu=™î¯u CV¼ÔuyV÷Q­õ ç‡s<8PˆÞ¡‚¨ã¥s> м»]2ò$ŽylÁQoo”-'‡B[ƒ\Hø©?’øÖ,'…n,ž30ƒÜŽƒ#5jÃ⻬@$[; ¡rq!†VSŽvôÎzöüèå ÷:MV}ÚEùÚGú4‡“½3\¿ÀIÚÇÀÖsW"Y¸aAb?­gÝxê_쫹.l¢… K U½Œ¾ü6œ>µàE¤÷>´TUr$‘°Ì#qõêkGn]F®å ÿfO‰¾T>ɰÆOÿ®½?⥮۶•o58Î*¾šï)ßœ`ÄØ;ŽäW™xˆ4_|,Ä‹ÇgœOzôˆ¾-¹ñtºULje“L:d‹&Ÿ$qì1IŽ †p$t9öÅDâ§V®˜¹¥OÞŽlrÂî]CPÔngžIåyIi¥]©÷ö§LqiqïþU^ÚQ-Íô¦S;<ìÆR¸,Ç«c·Ó4àý’ã§Ü#éNœT"£dƒšS÷§»Üð­&êC®ß ûR‰îZ2Ùwl9á·nÕêþµ7ñ«;ÈU>ðš *pO±>½}ëÄ,mg¹ÖõFhæxn§{y¤†äFaMÃkŒý:œŠôß ø“X±û167±‘ ’uIV0£å•½CwCZµ¢3î{&à(¯b öK3aoÛ|rÞçÿ¯WáøY¦`²é×I4‹s‰y6ÜfN;Œž9úW¤ü[º¶Xšb1{¤Kk"–äeú£éúÖ¤_´…Ð;Êc1·IÒDz.3äâ3Œg­fõ,­ãÈmmô½RÞÊssk°,r‘À‘þ5ú/ñÈÜë¶Èbó ³Û8ÏUÛ3õí_œ~)/´«§‚Èéé3G¶×Î2ùYuà9×éÄ=F ?ÅÕ–êQo Î#Ýnõ¦Õ™ƒ’ÄžÔÀç±ÆjhÓr:Œ“E´»lŒI5)ŒªÊóHןƜsÞŸ$ ²K.AÜ ^ÿãA•hI w¨¥ ©RcÒ¦qƒZ†UA5 W"„E ªgj©{]Û¼2Œ£Œù…Z~ªÒ“ô4^áÆ{žž• ª¸ôšt€—Œd3[Þø}¬|GÕ~ɧ³ÙFqs~ëòF¾ƒûÍíÛ©¤2ô êž5Õ£Òt‹o6rwI)8Ž$ÏÞfíôê{ ûkNµ6:}µ±mæ–2Àc8gô¬_øJð‡›¥Á±G2LüÉ3ysú é*ã »…QVIç´„^wÀˆië¡^è–¯ÄK,úU­¼p¸¶¸ %¹ŽP à©õ#ñ_·ÿ£ü ñúú èÿÈ_‡~1…ÛÃÐ<é «öåIÊ`cïŸJÍîZØáçûd‡zNÔÌ|öŒJ®#1ç1ÀÇ8=}ëGEºòe–9ÞwóL{|‘}Èò;©íUî좗ÒÔŸ1d‘£œ§ïט¿b¦‘ßM±kŸ²K,¤´ñÛ%Ï/!ǘƒÔ.IÀæÄz‡˜¦ÜT¸äªíñZó6-.sÿ<Ûƒ\Ï€„¿Ù%e–Yˆs¶IJ–eàöëŒâºI×6ÓŒg÷mÇáKbÏø|$¹$™ÜóÏs^·§È©a‚xõæ¼£ÀL­-Ö gqŸ|þ•ô¼7£èú‡î´Ëk„»ºœ® bTvn½)0^G’ü3·7šDè²Å³s3mçé[Ú*´^¦rÂFŒzý+šø~?âGr¤ð/gÿЩ“éqê#2Ë$i’˱[ ç'ƒJÚêWCÔ5jïUÓì­®6˜¬£)ÔÁçáRxW]O kQjÎ#W]‹)ŒàŒ}îÝsÅyN¯«,÷/£XXG#óæDrÁA9;ö«ºD>$µ‰ÅùŽYs¹uñúÓ³ìvlÂæyãYö·8ôúà×+ãMZ;-<ëdºiä@»‹/’ãf;ç$Ô‚ûV^¶¸í¦¨ê’ßj)ºOÇ(™^2 ;F4¬;œªk¶¶ï2Éo4 n²Í$–ι¶b<³ÇVŒ00=êäZ¹eß/Ø ÊD“ºÎˉð tä‘ëÍYM åUBêwê@#l°£Ž{sÔ{t©l- ]ÊóÎ@V!(CùUVÕ­%ÔtRo,$·…¦iãas±Eꟙ3ÆC|§×®kZÏ4±´v—Óý5’ µ#Î 9ã’yÉÅoË%Ãf+m|#UÂzã=Î:õÍ#OâPЍú\è[6•^ç#ø½ê}àv2áÓ/,¶–]P™]ncW+Œ„ç²þU—ula'í·mq Rñ&°ÞgÝ“÷ÙÇÒº8,üT'É‚9rven‰ù;}¿*ê|ðûÇß5Ùt#NïRØÜfº@ !°H8ääô­)Âu%Ë[3“P\Ïcþ9’;Ûkv„F±«£ Šç›§F`T°j–[™ìn-|Ø\›HüÜl˜ÿ®VôÏ8+½Ô?gO‹öˆDÞ k ARbš)pCÛŸå\?Šþx¯ÀâÎç]ðåÎmrrK%Ú'þ¸¹¸Ïk¦¦½5Í84½´çðÈSe§jóXYO{%ŽÜfÚXfË-™7 ó´ó·©®í¾øRIÑôïÅ"FKtue€ Ó°¼üGZòQw§®-Q@a g…SŸ½Œu§^^èÀ¡¸[¶èĉ"…VûÄã·9À® \Ý4zõ¿Áø®E‘µñv—$y.ž‚âPC>[‡ùxˆ%OPM%ÀMvítä³Öt{ùo.%ÓáY%wÜÄÙdé²0A(ǯJòh'°‰WȽDäGˆa€KAɸ«V‘ÏFmõ)[ÊÝP\(ÞŒ>÷°êj5,ô_€>1¿¶°Övš€Ôe‘,ãƒj›˜3Î|…ã“ÃUmþ xÂ8­ž×Dyb¼g¸³û!ô™¡ ¿Ëô IÞ8Èü+LŸ_¶û µÕ/$• µ‹k ÅŽs Î'®kFÛÅþ2Òîm>Íâ ÐÛ¶‹ À¤ä|θ<‚ ãñ¢ì,VÁ>%±duîÒ¦{g‚geÔ’é#•9*Ç ü*»h:Ε+HjE-# »™]XÌÑ'÷ƒnÛ‘Àã5»¥|SñÎ&šmuA¾Ê9mm0[LÙó8ä69޹­?/Ó–a6÷é¶òÛXÇ*)P\~ñ9ë»§9#=©] ±Ã¼†šÒ™ žU²Œ#-ÅŠ2˜å Ïñ­€ªpiMx-좵MF ,r}‰¢X¾íŽÃ€Û 5èÖµ»°†Ñ¬çK I-aÄŒ¾w+ÿyÆ Éö¦ëž6¹ñ&“g¢ÚÙ[i“Åh„ÞD¤;êÄÉýéùF{¥&+õèÚgÂÙõ84»4½º,ešHU˜ 3ôí\ÁÖ'ÀV.@ÜÏ#¼–?—á]Æ·â ®|>‘$d%¼rÈ$ÜrISÁ•ÈüšÒÛÁkÝÀna)(†Æ“‚}yÁ«–‰érc¬’½ŠÚÜ…~)ø\ƒ‡[i\7¡¯æ+Ñüoâ;ÿˆ÷zUÞ³vb¿ÒÙd³»‚ùtÞ}y¯6Öü]OƒÈ“ù×i¸oŒ‘Ž{ÕØ–”“Lȶg3Þ<’y²´ìYÂíÜÇ©Çaš–á±erOAj“p@82±ôü*kÆÙ·\Ë2(Zh $¬ôËXçÔu´Åo%¼³4W~l¥ D_å+éÍnǧ‰É|Öï:‹;³o¨àCÛåËÉàp99ÓšÁðýå¬wº’ÞÉjbYȸK„$”.6êsé]ÆáK-B9›V†ÈI4~MÁµv¢ãÊÇ¡àr:ãš½‰Zê]¼/,Püº¥»]F,œÆÁŒ@c}8ú{ÖbkóFñK-þ¢ ,4Õ†âÓpóÇI~ý}ë§Öü ±¼š}Ì— %º[\,S”d‹#GvÎO®^ÂÖîKµ’xu›T#û5Ѧ (]³}IGõ> îz¼öÓÇ¢ÚÛÜÊg¸óíÒG=ÛÍOÌó_£_”?ĽÂj—'ñî3ú×絘C¥Z”:…¤j  ˆÀ=G=kôŸÇ–ÆãÅwr€“}+G®GáS&Q“°yl?Ù¤Ž?“ëSl>Yãœbœ‰òTØ ÒEòð9\¯5nbU2@@*?:ЊÎ9ªÒð*܃áU¤B¤ R7$wª³2X€ÎO@*ä¸@Ià×µzoÂÏâ&ƒU×âh4ÐCÃfÜ5Ç¡EïŽôZâ9¯† /¾ η7K-OÏ>0ÓàýÔ‡«tô¯§´MÃÚd6u²ZÚD0± ëî}O¹ëW-í¢´‚8`b†5 ± Â¨€©ªÒ°‚Š(ªQEÄ|oÎø1ã´$èWßúNõøqâxYô{)Öiv[…gµˆ3©t©ë޵û¥ñfqð³ÆQ²hת?¿ u6Ó®àÓžî+Ô{2 :#('n=Æ ¬Þå­ŽX .fyHV2Úç.yÇ®5Þ…s"‰Q-%’0d„´l¤Mümô ÕÆþÊ%þиEUe*䌂¥]Xc’,E¨°&0 ’#¿â3L,Í?i©¥imm K +#2¤lHóßß5ÐËŸ&pü³5¡®Èœùži$œŽÃ?:Ò‘KA6ICÇáAkCÉ< ]ÞÔÌà;æ¾—ñwˆ­µÏh6\G3Ù ‰÷¿ÜíÀØãæ¾pð}“}¢ä¨'t¬qӹ⾂ÖfÒ'ð¾—=œðÜj³Ì­xcR¢"©´ VéëÆA5<‹ÀK·H¼SÔ_N?ñêS&ß¾[ntõß1¬«|øk×—†Ò[¥þÓ–2±unµoQŠ[ßÄÖM$Íg €EÎN}ûSÔzå•›k6×7qC0¸Ý¶Lލ9÷5¼ºµ…ÎLWö®ÅG>jƒ\íÿ†5>!i%ðÖ”£|vË þôlV±_WÕá{È{gìŠýÿÙ5 ñÌ9ß=  ýÙ •?*ï5o†š¯‡4ëëè/´ûKåÝk1œ”cGüG xäæ²®êâ&€ù°‹FÆ÷U»Þx#îõïMYì't;Rñý¬ÚÛ5†¡n&âW¸ƒ`’{qS|³žëÀVTJ1;W$ ÇœzW?6Ÿ£à=OTŸN—N¿’ X%˜³8ùˆ>¸Îp+á+´?ô-Ù ŒýÖÁê:·~] V¾¤Zº‘ñ_BSÂÊ^½Žk³ÏÍÖ¸íM·üUÒ É+§Èzç<õ®¸>Hã=i¡£6ÈŸ.\²5>øgNºç!¨í>>c~&—Rliw~›:þóXµ;—k–E17›pë,lü}<ô¯PÒö¢â{›k‚Ÿ,Ža(Y6ÃÛ¥y†®ä±ž{µKéÖbY-Ô2NŽØäwÛø×¬ióùpíyæ”E'%Ѻ*¦gRÊcm:J<€êq##ã#ŒqÛ¯Zå[0ÚpÄ‚>”ÝOLMNÌۻɖ º3ƒÇo¥~ êðO_…Wª~Κµ“ö1Þnð+\–£ÿÒð¤Ùû‹u{OO6$—Ê‹1ù½gá¸4õÅ»*/' ¹$ÕåŠxØ2˜‰ðA¯¹õ?ø&]è'û;ÇQ°íö«2 ÿ¾I®WRÿ‚nxúÚCö?h—ˆ9ŒˆOþ;Jú>Ô¢»ðg…/î-Ö+‰Äþg–ãríÓõëVmŠŸ[É: ‚™`ddN⾞ñ_ìñr;YíÃöº­«ukKèòØï‚Aü+Ï5?Ù?âþ—â{/ÃÍjHØDÏo™ÈnØþ•,.Šþ-×ôgC¶KM&âÊu`É<‘€¯Œ)ïÓ+Äuk8“QœY‰nÍ3³Es‚'U?ºÇ`í}'ã ߈ ô/êþ¸ÒtÍF–£¤Ë̬w¬~ãæ?^=+Ã5/L5f“û: 8%+3K<.…fú W¾ãg3 jÕ`H›í¥‡»ƒ^ªN~•j NþÁQ§zRC!-¼?Üo|gŸLVÌúÙ^J–éñÅ#IÌʲHb3ÚššsÆ€yw!;[pÁþ}qVN¦\Zæ ‰µï­ep¦æÛðf<ƒÓ¦;Ñý³s(9ƒN™Œx\,™ù‡åŸjÕžÎU!Ï»>hÁþö8â«Il$S†‹q%—|aÇ_ÏŸð¥`½ˆW¸òÝãÓ•±´¡Šl†ùàjGñÄd/§Lè’,yp ÿöÍF¶QäIvŽ–PýñõëMþÊ*$•G–W~é?ˆÍ6&\‹ÄZ{0Yô¢ ˜Â|ÈTœý}+Ѿ xçáf“ªêRxÇG·¹´»…a·Yl  :±Ý:qŽkËÓOI»o‘•—vû¯õè?­"YHTóÂ[ ! µ×«}½ ®…EQ$íßc:‘ö‘ågÖ#Wý˜|F‘m¥Z4¹(MlÇCÒ¼ÿ㟃>ÚxsM½ð¬±ßÉvhm57säí9;ð2:׆[ Qà†è¼Ø1ïlÔRÚ@ŽÈ¢®Sæ(ÞIûÕéVÌ}½7J)¾©Xç†ÙÉII—×AyÖ&*Ä]Uøü{T¯àó%ÔW?Ú1¬‘©Q²ÙPG|V+Û#G˜í”ƈ47C-é úzÔ—Zp[ƒ±ÔDN·šYN8Îÿ§lž=ëÅgeͱ¥ÜÀË·Q©8%9þ•nÚ]NÉÞHµVŒ¹Ë´l˼äõõ<÷®dyÎ?w=ä 0û:¬Ðƒ±×1ö8ëM{é¤b"¼„¼êž¤2}ð}8ïß4Xw;Gñ¶·£èæÔj7w DmgœmcθÏ8¤Ö~3êÚÕºC«Í©N‘Ê¥–ë¸8*8À$W&ž"»rïjt‹ƒ0h$\ýç^„ÐþkþË£æ´zFqmh|‰Hß;˜`òFN”X|ÇI«|UðΫm*6´¹€w0t8ù~a–,i p!ýk¯óOa\}ÛñZלÿÄ´êÙ†88¦+&ÄHÁÞßÌÒjÿ‹¼vŒÒÙ©û><±çêj-Y€Ò/?å™ lðO [Êf3[ZMq=´ŒaX®UÏÇSŒçŠêR¹ðùu†-ZKm/¦Ö‹´s×?ìûøW+áØÝ•½½œ÷ˆÌöÉ,Û¡Ï™þ?ʺ‹=>}.$k [¨¬:{CzY¥ŠCûÂ=H'< zжd®ibç|©s}tñX'™u¶ƒë•\v ðsXÞGÖu+í2ìµՑ¤´}žZŽ99#ÈÊúV¼O.ˆ¤„Ö$‡MÃ(|H.QÈÈ÷ œwü( ^‹g¹¹¹KI—1ÜÙna|{•Éã“H£Þ¾­œþ=øpšpSe&¿¦ˆ6—gž„}x¯Ñ}W÷Ú½ñõ™ÎàF¿>þÁ ß~¥´Bsâ J¸ ¢Lù Wè-Ñó5 ’‰úüÇük&SF|à.ÑŽ•0û€vÆqK*@ÆNzUiY¢$ƒœü¸÷¡; Ã.1¨,<7©øŸÄQXÙÃöˆe·e`xÚIûÌ{ ©í[¾ðÆ¡âÛÿ³Y&Øk™R!ýOµ{ç…ü#aá+md™sƒ,ïËÊÞ¤ÿNÔÒL.eøá͇¬FÅù@²\°çÝ_Aí]†=͵©˜QEQEQEQEQEQEQE˜šZ(»}éqîih ÇNj•þ‹§ê€‹Ûk°x"xUò?W¨ ;Sø=àMd§x7A¹8ÆdÓ¡'óÛšãµÙ àî©+I?€ôÕsÞ$_ú ö*( OœµØàõùce»µ¾¡&ýõšåµ_ø&×û”o±kž!³“ª™'ŠP® cù×ÖÔ‡§\R²ÙðÞ¥ÿ¿ÒäBl|wr’J‹­26ö;\W%©Á/¼@Œ¿`ñ~‹s€F.lä‹O—u~ˆàQŽÙ¥`»?1õoø'Ä>Åí¬×Ú£»î7Q^K¸À~ugÇê¿°ÆM08_  Ta­5(‘ßü+õ£Γ9Bçã>«û,üYÑÕÄÞñUlæ!:ƒßîgŠãõO„¾ Óýÿ‡5«c;šçNtǨå8_ns_¹iHÈëŠ\£¹ø5sàp#%RÑ#´yÑq ®{þ<ŠÏ“Áǃ²’£»GrA1g‚=ë÷‡PðÆ«¦Ûí&ÆõOQqlŽýô sÚŸÁ/‡ÚÌ>Uç‚<=q£iŒ~KJÌ“ðêOÜ;È WH¯ˆ¡Ÿ û¬sÚ£m;Q(Iñ4øhÄ‚'\søãõï_´ÿ²GÂFO2_iÑ?÷­ÚHOþ8¹MKö øG~ÄǦj6Yím¨È>¿6iÙŒüƒš n1J‘H„ö8Wï®{g¯=j‘²†3¾(ô÷ù|Ëudd"3÷×õ=y¯ÖMKþ Íðúà²kÞ#³Á,¡®"•Aõæ:ãµ?ø&F›*9³ñÕǘz-Þ—®q܇{QªÏÌ¥Ó’6CoiÑÀ¥b]•-}ïÄsÏoz°Úl¶K°%ðH×ìá ¸ º#Ñþ£ÛúWÞúüÄ‘àÙx›Ã·E~êÜÚKG¡+»jäu_ø&×Ä{ÐAiáýL (¾ ñ’ŸÝùÑx¤?™ñèŽæÞDIg¿ˆövó!V Ÿ»/Ö¤k‚øY§Lÿªq-±H1‡ÿë×Óÿ°OÅ*0„¤¹O,¡û« ½¸Þ9­rúì£ñSMùn¼âf_—#Akö…Àèß&yâÂÇ™ÃçG¥0¸*ó˜Ÿ,™ÛÓ·¥ršVµŸ¦xjÆ]:K§½SÍm ‚r1‘Æps^™¬|:ño†ìeQðÆ¼’1þ÷M˜3Óø}둃Á7ö‡Ãæò'´ŸL,d‚XØ‘ÓÛ­MÊ0¯¼ë_ˆïtðKäEe·Î vžz[ âX[$’ÛÏùô—€>?é^ðŽŸáûÿ> ¶@†•š&¸“­ŸÖ§ñ‡¾|LÑ%ÒuÜik)Ü/,lâŠh˜w G±àׯ.pRuÍÙ¦ŽIU«YÓvûÏ´÷ó,щ`XzŒÿ>j=g+¤^q‘³¨«–:,úzKng[˜£•…»·ÅŸ“>‡ÕmkNÔç´h- ¶•e]§”®Ï~3ŸÒ¼›ÛCµyž=á/ êZ…—Ú- –ô—0­Â|Ë8gÜð¯EÒ< ¶¬Iok$ˆJ£°w/ÞÉÎzœb©hÞñV…Š ìž<ä!R+bK¿XĬ-næÈE¸qëœZmÜ„KD«mömJÑe€I ‰äÙ›ç¯b/ Ý[[Á:5£ÆÌD(nÂ’GÞÜ ã¾z×%ïcp²éC©c˜ãÒ¶"ñjBÑ%Õ´°I+,jW ǰÁöëRQë¢3|tøh„ψ-NÑÈn8¯¿••ÈÉ$þuðoìá—Ÿ¾…Õ¢ÕÖrX€±IÍ}å#xÛ Þ$ô4n}åÔ]}›zý¡âiQ3ÉùŒñZÿ|}ã[[in¬ì”4Áq¹¿ºžþ§µkøá›ø¢ú-kR­¬vŽ3ò¼ëœþ žsœšöË[8¬­ã‚ÖcP¨ˆ0Ô(÷!² 'F´Ð¬#³²„AvQÉ=Éõ>õ~Š+RŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ›ÎE&:ÐFih À¤*ÇAN¢€ƒŽ¼Õ[­*ÎùJÜZÁp=%ˆ7ó«”P!¨ü!ðF®¬/|!¡Ü%´è²µË겿Â}Q Ïà}1sÞhæ¬+Õè¥`>Ôÿa„ZÜÐî¬ëÚúQÿ¡\Î¥ÿîøqu“i¨ëÖ,}.‘Çê•õ5YìøËPÿ‚lhrlüo¨À;-ÅšIü™k˜Ô¿à›ZÌ`ýƒÆösîÜÙ:Ñš¾ô¤ô¥Ê‡ÌÏÍíoþ ¿ãµ}Ð_xwT9ÎKÉÏü +šÔa?‹:` ‡¬.ÀÆ ¥ìYüŽ?JýG¦ãæŽTÌü×ø û>|Dð7Ç _k¾¿²°‚Yä’ëâLC&2ÊN9 c½}³àré¨k‘tÃbýßßÚ½?o©qB±¡€p)ôQTHQEQEQEQEQEQEÿÙ endstream endobj 11 0 obj <> stream xœí]Énô8¾ç)ê<@g´x $ÿü¹7`^` L_æõ§¼É}¤e¹ä*Ù!äÀ’©ER”ºüïå¿uùE½êK¥ÍõÝvÿÿüçåï¹ü§ÿ±ûûóß/ïŸ/eõZ_j£^‹Ëç?.ý°]]>ÿuùUéß.Ÿ¼huý]u¿ýªÌD©&Š(úÕL”¢§”Wv#¡„ª±H9ê©H3QšžRÍ„ÊgÛN5WÀŵ÷ Z÷>5§¹ÈB©=íççËïÔpUm{m|?\æ¢M?\ZõŸÔsíÃøY×ýÞ WB×Þ'ºK´_ûTÎ%~ŒŸLmÕ¥Ïão~; o,]-ŽðÓo)ÔRsã¡‹âZŠŸë“ m&í¾H_Ž@¾äI8S_NL ”‡¢f´£¸ojuðª)à ‡kˆ#U3Ú™`üOìˆýúF_u/5kpƒÒ1+U ë 6dÇO¡ðÖ·ú9¶Å1õukã½PW¯v©Á¾Æ£ì¤-š¹:¿…S§¸ö¡¦õáÏ(V“Æ×°ÃR3âT/F›k1vì]áWÛ² ƒ¦ûЦ|Ã!¯5Z®¥¸þŠqX®énÔç©ãvŠmºÖ’[å#îo˜‚ùh‘Tôž˜/òˆI ‰¼ZoyãanéÆÊ·Â`éï"w@¸ÁœD€“{Áu` ß¾JYŸ% ’)¹ucš~­Q gi£e&ÛGxá‘nÀ›ôšòR•uØ8É= è ®åa£`öpdª©ˆŠá>MÅí¥Ø8[qÉöÌÇ$ ´‚JYZûÃU±ã7!ß<.#ÈhëÚ6R*ì3L”Ãm_ÛÇšg!h…#L•ša„®‡3‡Áþ ­Ê,¤º7ïRÛc½&]7åßêê /¸ˆ^\…ÝEp…õhÓŽûÌ­Ä·Q.Ëyv¶Ù\W3 v“Ã)7Šñº%F—ÒÒiNüP—¨æ›,St}$çëŽ- Ÿ¤ÿäLL¥/y2•¾Ä•à“¨ËˆiVøî·¨ú`9ß 1Œ%\S‡Œ;ŒÊNsó±/¢ÄkȬE© ´”Bت͠æ7¯Å,%¤„”éÁ}Ë`¨cüÊëÁÐ< ƒ0ü­Àš_C)!%¤Ä9Jð`HȾ1®œCq†á0¬AÐ;s§ ò·¾p°ÎÖâÉÇ›7~ËÐùÃZZÑÅ–V•Ãð‹¹ÓÎaÕÛ×@ûXoG8B#Ï,dpýéZ;¹Vî€ÍÐ+<„‡ðHǃGbóóÈÒG³•ML€#„3>Â-Q‰2¶:IôÊo˜ŽÄ‘ÅS)®˜Gÿ`‰€>šMW¦æ¶r³kJvzïX‰»Rl‘\Ò—< gê‹v'°K TÃ~3@l ãL{aK¥8›Ùæà6"ŽŽ€7Wøƒ†® ݧÈË ÜßËŽl†!T76ÖÃkƒ¹ðà· ±Vø-Óßc/KÂ_pàþ–ýD@'ÞU߈ˆÙ¿¦Ï(@ ñêÀɪAÁ•é²ÂCx|O<$ÂÏ._û+ ÂjïChqçºgÁ#Ñ¢¡ZÍÆk¸SàßÅ“\‡÷.®i:“ 5ã÷¬ÖLýTRBJœ¥Äq˜FWËc!¦BXf ?AËV\½ñ,|ãë•êNÓðõ0ßG8 ¼ŽP¶Ž¦KG—ÜÜÂCx£ðà”ï!ÕÄ}ØðipƒÛ<—Ó ‹¦á(e«Gß÷m4T ƒŽúÊà/ÇÐ3ÿpkÍ8àësŸ®¾l[-ŒâWM> ‚æ´·N¿ZÊegj˜@>#A:þp]¨..µ’ªàòÉy?‰æAŠ~E/BðÌ@÷<ƒHöîò‚‰;)Þl &Û²vu_ÁOýŒ¢¼œ™3ýÁA3ð-˜ôL×`j²¬¶¤(q¦Ò—<™f[­”8k ƒ)‘ l1¸hV„‹ ‡¯¿À%NÈ^ «”'¤g¡oyDØE!¥×¶Ë.³;mÍ9ñQ—]X0¯º.jÖƒÖ7Ш6‰î‚G;˜­NNØú­ÞG†5á” g8PIuůØ-ÑøxH÷«žÎì5ó{.>‘%Uº»ANÄÑê™6ôEBÂ"SBÛGà@þû¢"œá8¾²½!ڕؤ³Ú'8‡¬íÁl¹`WÞï~¥Tô@Ý,9`û멃ÚаùN)ò¥/yòè '© + •”вã-iðÅ…Ïë E\Ù! Ùû£­Ž3­té‹ôå鋞Màô Õà³”Ʋ°„sƒÕ ^'x¾…0ÉÇ¿a§'«'éJª¤ {[2Yv/}³‘rï á!<„‡ðØ@Êh@»¥l™…&¼Œ 0wËËCDïx-öf< e3@€![óR¼7XK¨1¯Tô6ªúæa$ÕƒŒ¨Èò´®=‹yiçÒ÷ÏÔ!áÙß(¹‡ojEÌ| GÑø)/}ø˜_xœßÌ[ñœý^ÑcD,Îzc:D»óÍOgL7µ¥§÷QmÃ`µêTHG_8Y@MõzYÐûl»ÉŽ˜‹9ÅÕ]âøð«É#äÔUƒ7Hîàã È0Öò:Tä >bÃÙøFÝœ ò:)f˃ÙÖä„FA¼­cœÉà÷˜§ˆw6r4¿ˆw?(~¨÷!lg'—ÖcwQ¶·“¤/G­ö<%8L¡¶m¦T[\‘aL ›E½c£ ët²’€¡®]ÁÍ‹o1vÑÍΓ!¦Ðô:cW¿d{óøNŸpðAmJ>)lãW[Ÿè"MìÇz©¶%ȵªèî?ò˜žœÍ0Êe³e®\vÔ˜Å.;cî^·{¯ey[ × z…ƒ©¯ÂQ8 × [ŽÊNÍ >dˆÁÆÙÊc²§%¾{L±¢×Þ QxäÉC>y”>DllL&³Åó¢~x%˜¦—=œØòŸ0|¦K5¡–ÕvGNrXÝe~ ÿ½-<„‡ð9ó Ñ²óQB ¿oËx©6ÝmBxyü¨¤„D}t9ÒY›*úþ˜vɱ·NØ­rbÜbW¹icÜ,î|ÿZåasE²…Ÿ2ÿE§¡‘C“o²й¤/y¤/y¤/y6ã1h¥YN kê-^+»á~µ²£>¨2²cVÖÀËx% ’`sº§T0•¦‡tÙËT´ A‰ßq͉ }É“ }É“°ïÁwÕw9†¾x8ÉÊL Ú:x¬,ÛÃëß#áƒôÖ¼=œèVÇÌ0ì㆗ºšéÜ¡2'ÏOëwžPF?:îmym¹‚RîSá!<„Gö<îÿ„:BÄБƒ,ЕIÒ;táLZøœÕÑ‚¹ÏlB®˜õ«]JdQâ8L¥/y2®–Ç1B¢Dã˜ÝâÇ›ŸßƒHÝt= .AcæW“usû7¶öKø¯ê:D`¯ca-þ•.W‹e{”½‹~ØN «ÓͲ窭ºƒ;¹€ïPUž$„Sx!vP4Œ˜-q'ÜëkQÇ¡ðõþ-ÂùåòÈk³ŠÛZ:i¹@í†ë7^ò%pàõ6 ä0!Ò)³`XÙspf×Vл%/i!˜•ÚÄB¡½|…¤{94ÐvwlY¡¢j¼SÂí9”&N¬ºÍ°ž*VL€qôaM_KbÕñõÅ&+XÙj2«ìI(æ(Pv¥Èõ¼GàñÐùêæÐšRh®>þݺMâ¯5a3v1®)Höìú¼BÌ'-qCæ¯\eíha°³“7ÆA+ûì«%»³8‘‹†Ž¼’;rÂCx‹:Ôæ@þuÝ ázE¦tëmx{I 4„ø`ÆŒ ¡“zz•;ˆ% ¾€Äƒ¤kÊÂç¦C|bìïYHò‰|"ŸÈ'òI¶ŸðXN`Þ8]ί+ô–»–ñäðËÃp™ÂwÑè²Ê⃇,ööäy‡^Áä"±äÐòËBrY ïÂC>‘ONù ÕDCu‰>£0T‡3l{6I—aÛ}oìŒÃóÕD|@]põ®˜|ÝÀ{‘|¸3úRó±–vY Ob*}É“©ô%O¦ÙV›i W «ƒ9Û¢#6œ35ssgSš—,ìgÅ×,¦§ìµåƒÀ04„ݱC¯kûZ‘ö‹»~6CïZ‘Y"—SÓöMBÍx8Þ9&ƒòiÐo›”ϰ(M"õÑó®«Å'¬WEþ`PèŸá«éÐÄæ$Øéëòç‘:v’™®×ðº7»È¬R6L,{ aœy¼‡©ô%O¦çé “SàDÃi".!ˆQ+ $Ùb”3o@¸ÛȇÜBÌXzP·œ0iªéNDba÷D2m7ÈÔrpª_šd±¹Rh“¹¤/y¾S_ø£%Sà(µœä¹%<îá“Ôú 6GÀ 6Bƒ÷Üψî_¨@‹…Z& ÌÔ€ ¡rì T‰ÎBû OÕ߈Ûƒ¤¬–¾„ }É“°Å(ù´Äz£yÙKeÁ'[\º¸­¹jÚÎ6KUÃ6¬íÜ»Ôp óßÄâ[¡UÇ`ЇÓwñï—ÿ‹Ûáž endstream endobj 12 0 obj 3523 endobj 14 0 obj <> stream xœí•ËjÄ0 E÷þ ­ M%Ù‰m:m²ôú€. MœøÅhœ]—!Èõ±®ì áOýÂ#vqx[¿¼/ðö?ëâò\¾ÔiV;–Mæwxšˆaþ„ãæoe;ذt itøUH‰p™ˆ‚¯Ë-šì*‘)ù¨`×g*:à´~ÖwÆÈÉxÈ[^’1g¢&Ô™¬Œ¡QDM©6ìóù"᪯Dq¡,Ä-}ͽd¦·lèùæ>îcòßyAzÆYEA°uÁ¸U¥¼¬'…؉؉"mª7Ë|k¶)9c’Ð 2¨÷Áî6Dž7µ¡ÊÙ€Sr£GºtÃÆcÀ6Û‰yœZ‰ÉAG”FaÉt3 Â%Því ;Ã7ÎJ endstream endobj 15 0 obj 305 endobj 17 0 obj <> stream xœí]K‹ä6¾Ï¯ð9Žõð –ÀÌîö}a  ØC {ÉßÝ-ÉzØ–í¶Ë10µT*É¥ïS•^yöïË?Yžýœ_TV*Ýþ¯šîÿ?²ß~Êþ¾ýØýýøëåíý¥(/UV6öb³÷ß³_®&Seöþgö)ÿòköþý¥¸4mÞö§Oùë-A©V–KùêSŒO)î)ù¥ô)WŸJ•Npá*Ÿ¥ò)õ-¥ìëöe¬OP¨ŒFU¯žö)ŠÁú~¾¥|}ùFöTeZ½o=¥3¥o=¥îSÿ¿Wª¾ÖÒ%xUÕ] s ELßßd•ÃRWP*ä𺛷[‚í»Z"úžÐô Ô’å>‡í+j¼rá“Ý£5)_uÅU­Œ+RÃ^h`Ç¡VîÞ—ªìMŽR¸vÚ-Vèýy$áмoÞoŒÏ_càS—¶M~kÖèÐg7Üñ„$ã42R‘Tdï"$æ4СðÒ1%†•Z‰Cð…W4Ìá2J7^®a+Gí‚bpCǃ2ȃq-£]‡Wlµ^ÓÐo(ÀÛ¢ßɳ½ˆ“8¨«56 …n`;·±eä²±?ä<®bl鲱丫Y#!ÕñÄ:8ü§l ÿUµÕÂ\’Àø?#zæÃì^7<ê!P¸‘Õc=J@ÃåÀîOãð‰"V ¢ìþ@ü…Q3aðwT*Š]°ÂC \M{Ha™$à×gv-ivNew×uþ^èä{#ªæ‚Æß ObeyT÷Cè ¼ç›­™ŽBÇœ˜Šè@zŒOñdMä ÔÏ㜩؂@ï `‹½Î‚â¶ÜŒ†4Ìçb‹G—ú!Øuøà‡T÷FbGQoµh7aÚ1Ã픂p{ö%'£ï£uÁÐi£“q—›©TÌï£Sª€&¡JŒüLešèNÒT§©´N&³Z)BS‘§axŒر4]失‎.lLø`œÚ"3aöJ5œ¢ù£¼ÈkbWŽÄ)^ÆSÎ*ñ²Âv.eßk†?f@“X¡©H*2vˆ!…hÇíÏai§³€žR Çá#n®ÜñºBˆ3^…†û„ZΰN.«|òd"<khë=þ E¢Tä#áyˆ…ÑÞ¿ˆ¯_Ü&ŠŸd$”Á“ 1ТÉ%—³){5$œŽ\^/ÔA|Ä~‹§û1·íH#Ÿ‡X#–‘jIµˆ«…gbÀÄ2Ëý o¡Ì΄G0Ëk‹¼wœÕ:ÀÞ!=¾Øa*˜cüýÈÑ­Úá“ ÖÂß ¶*Íá/NË?Ûƒ:cÙ¼ûêäàÙ6n’rœ$‹ò”‘a”¾nQׂWççTë²µ\r´³8´ÆE…kD—á!”èh-$/ZÆ?—}Ð;áØí1»Âœ€+ë¢QíH«°Ý¥9Š‚»"ΑŠÈØXò”jyà',&øàÅORkëF3š)±¨3aNÉÞÍÑ/s0=$LÙ¹ðî v>xÂéŸiMÕÒ+<¤w$¡©-{=Jž‹ˆaËEEÓVD°Ò€@ŽÜCTÓäm6¢~m´éR Qt0x-TÞÉ#„bŠ|8âý-ûñ’Pý endstream endobj 18 0 obj 2513 endobj 20 0 obj <> stream xœí]ÛŽä8r}ï¯Èg®I]ÅUÕ•~»€×kÀØ1à}Ùß·”IÉ8 J•ÙSclЀ(‰—¸œ¸0¨ì.ÿö¿—îòÏÝ‹»ŒÎ¯ÿOËöÿßþóòïÿtùŸÛÍíïoÿõííÇ·ay/S·\~üùò‡k¸¸á¥¿üøËå®ûÓåÇûøñíöÊì¶>…WºñöÊvÙm7ÿØ} Sjx½58—®ßn×ÓKˆ Îņ1=1ÝßèrËG݇óì:Ü®—$MËõqZ^äU[ý0®«—î¾zqÝ\‰ÍqCwjå =6¦¶ð2¤¶ûtÆÜ0߈¬!Ωç߿̩áNÆ@+tË­aΜøÇH î­K´Oóõ£“K/¥™øõŸ{¿ÏΣóéðùÃì>XìÔWê.C`$£9ÐúÞãN[Lw ÄÖ¸Àè!N„H˜…"pP)jXIŸFvyú0OÊáô±Â{|Ë©Tè#á–¬b|¨ð=6ÍytGäñê)‘*Ý$oîʤ—ú¸ÁtUö Dè3ªÔ ( š¯b]߯óC°‹ƒ¨è8Í›E¨^ñsœFb?輦YªD|Uåi•¹÷$ºôÐ¥pà Ä^P¤ãÊâo ÄŸKÂÅ€FÛàTç«[Çž"«™Ð(Ëlu ³E &õ™ã‹“hTÚÜ ¾X/U~ˆ¯,Ü Ù™&À½Iã {¡A×O‰Q‰Vpê#­àê>YPœ¸A=séÉÖ4Ÿ±ÇP&dÍqQ²æ€2>D„s}îÕx'NC‚ÑàW’J8jAï¸ýÏ^1¥Û%é¦Õ¼3?å&0ÆñA$ÑìI‚U‹'9Pk_ÄÒ”}ˆM•2\ÙS‚Séµòu¼´Š­ˆ‡ýHÛÈìël~/k­pØPói‡fb„Ð]¥fœÅGàÐTß9¾Ibü=v]C@€@XŠ!MMÀÒ2ÄÓ•ðÓ!^©‚Š®šþ=Í.Gà™cÜwe¤°P¨ß‚Þ…N¹ÍÜóð7‘Ž €¥0ü”€˜9³ïƒóÓôôlQD’Íø-ö {©¦·d; 0 ì#qyÚ ºWÚ&I&ìŠÇvQÅöTr†!6؃'}åk¿Æ¦ÈÒ0<íØ&ç=@GUl;„)_ m®Ž®±Ÿ¸¤½Æ—ˆ.£'£ªãú¤K“Ê' 7,™k ôF@!ÙݶÍù“ÐÏÌ0¡§wD©ÉÖì+µšæiˆ ­¨Ïð2ËlÓ##šÏ: @øÌój@Hà Iã°¯Â{p¨3û$>; ü 3¦á ò6ysDÞž’ÑŠgð jfÕÃØí¹Â E*Qç®$)gA ÐõÃúbý w˜U}FÒx±xÏ….m~ÙìQ¦Œ%_V£¿Œ‘–n·\…@LjãPÀ»p.Ã[\9 i½Ö@¹å7ŒÚ€›;»2ª¶f…€xc äOðHpw#¹»ld†HçÿøõÛ¶Wù÷Šÿú/ßnÛ¾Ëå׋óý:âí⯗Sä¿›1Jã®Úq{Z)„ïÙÌ&yz®fkŸgóËDØ´³ªGmxðÄ RÓE¼­eeÕü•š~ÂÑvk¿È…HÄiÇ󤆽–­ûúLÛ5¤¼È?\vHgšîRöбñâc Lΰ,ç@IÀ|Ê£¥ð[3Wê¦eCpmú â¦y1<ž3»I¶ÎŸ±M@¾–d¥ž(Z­n©SYaâ1*ÀZC «8´ÙÞÙ'&#¯´ž“)íê—,L­|Ãù©ê¹Äci“• ‰ EüÎMLTß[6¯PS ç\|´ê&(„%>¡o§ð.œêߢžãe¦lüÛ‚(#iG‘þrÈ Ù7ÛÄÜ›kñ¸¾fJÜrJŠzb¼ë²BÜ4aÌ€Qw„¶¡6a2ÐÍ èt¸ŽËLû5$úÁÖ~BH%¿jlqbŒÆÌÉaåØ [ =mÃÿøÂµÊ¿‡¨F÷ÁÃ}P@‚‰}¦ÖTÍÞ>Å~ö’ÎT-){XA[|ÙV³=9ò8»ºz†š³œt6JxbAÐèÀÕÔiDñv 'wâL4ÒïW > ¬ªû'Wvªï‚;ºÜ<¶GlÑ>¾PêKU<5Šsù•ŠÆ,ùh)$¶Š§­.Ñox´›g|@ÁݱÝ–"t]ù‰0ORþOL»Ù!¤ûɰҢ΃%pµð¸_^ö fƒ>QÓ?ògÔCY¦$ª¿~Fm?¿ÒºKaÏ Õ•ðaÑ4»¢*Ì”ñ†ÆºÏÁQÁzq¾Æ"ªõQ³ÓyëNì40Eëúˆ×58ÌY<ï€ÎjSæ åIx—šñ9VŽGB{n=é2n\§Ë÷úî÷züc~W>º1ÿx\· ‘ÙJç(ÈÐ×øÎ̳yF#X4ôPÌ@¥¢R” ꯜº¸t°Ø±A¹§RL &î" VŸdâDåÅè3SWõtV¨Ã鹤*T×=a‹¾Åê|:œûÉõR çNœEO®. œ?¹æT€ZC̘YXµÚå+ì›­‹:"Š)[¶t)Ã*hÛ­ÊæÅÓ²Ú˜KX¶:Þ¨|¿~ûÃÕ‘kõƧ×q¦œ¸©š4"i’¯ûÈO5ŠWR§´8>…:U‘¥gX®mÔé§í€‰Hõ« ýÔ+pv"¯uBEOŠŒ6’èŽw{ëÓ¾Ÿç3É‘ƒ»Š}Î0È,£'r ©<)Xlf}:l˜îŸøàÑ^áÎ\8–`•L˜N9Ï:7fvþ_U)=®0n±8¨Èê'}![[3]Û~jÁɱ½OlW´%ÿçjó8M±:lPPÑÒiÄä+[.ªVÃ'Q‡ÍÔÑžLPú"CÊs‹ pdÉ÷]7véh´ÏöŽ Ð{Þ4ÐÏÀø ™ž£™õÙ‰>DP6¯!Û>nvÏqÐk8(»’÷ƒ¿¶y<‚¶ ‚õ-‰j»Ÿ'#Ì7¼\ÝÌ1YWùÄÏÎö¹Pƒ •ÃçËB›klàÐñMù3%(Rå[ ‹ª~³D8ž„Qȳ1I,ùÚö,$„´@u°z`Çœ&-Xx.d¬Œºé}蘘8K˜Øžd~&&ª¼è'Œ> Ò¶0Uãa€Ÿ÷gTÿÛaÓSÀBWèöOñà½)Úÿð(vy+•<¶D—R\Œ'^“}·é‡ù× ,¦A¾vZ¶Å–©¨¼z–Í loþö•’ÏÍ?¶ìE¯=#‰z+KXÙˆ•fÁ n4Ÿ²7‚K‡ kïþiÖ˜bf&×Ú¾Ÿ‰ªï‹ÿÓN:|Ãòž[Žÿ~Ä´!?Z®ùG€SD|d:G Ãcj޶4ü_t¨ÞRB^ ¬oç”XK†;‹Ü¬Êƒ×&б/et#ZìØŠq¥-²xÀ§‘Àï„8&ʆkŒ^fzøÍ>³ôLùïƒY@däž}ˆ/Uw™½ÆléÐà‰/øÌOû¦GÃIBé­¤;}§D…‘nK 2¢ukã‚ ºSnªÔ{¶%’€m}þþ¼¾Å)oü|ŒÄ…·8’Æ¿Úó©„ÚM¾A¦åëþ - ðF…³­niA„QŠêñT-ù‰ŒeC¾_àDÕ’ŸÈXQ6äUxQµä'2f” ùþÀèPYœ’wO±ñ7¾¦»Û÷~û•[Ný/äÚg3¾Wù‚XªWDv}*¢ïrÒ1}¶¢Œw½ªÝõ~íLœKú€``­ÅÁ‘8[~Z¡œJ¬­yhYHDpZ·k/é7Æ ÷ðEÇ–˜óê9K=ì0aàÓI'riH|bGF¤zÂ0¸B—¥ÌÝÅkÜÖ¥Úä\b×¥˜†­«xñ>v^T7¯j˜ 7¤-¼ŸWÞð‡æçpr<ñËÕGEÌîÚÁ R:98—Ø”½qyƒ é§ê 6F©/¾¦Äi©j͇í#™ÝÂf ¬v¯‘ÑYQVîó³\ñtb¡LC—Žn¨§o /~ðgx×kÇý^‡×^#Ië‹×ºÙ½Ò®®ƒŠ>gYº8(ÛöËO¬ÝL\\`y0õÙ;üAlÒ:òvò„zT"Óª¢«e µ¬%e‡ˆ<÷Ž‹=µ¡K(„¯ Õ\@U|àO„¨q#Ï´A= ûnAÁŽA~d¯ÄoÐù'b&F$ètSH?;beÁ®-«(+® 4xç—4XPÅä•5CÝÔ q;S¾«<Šà¡îØG¼é]ÚÓÙ±$ôÁÂB³îjJ³,—ñxgÖK¤®åKNƒæ‚âI«ïz&¤?¥þ®óM'LË-å! 7|·¥ßiøÎÖB‹#¦s`tSœc¤Êê?KÕ±õagž@­øb²Ûš“ð¹SçàG]q2ú¢U¬TˆT"J¶K,ž2Y6Ý&»“‘˜¸*ê[\@q¾v£lXGgæLF0eœf+GSæ:;¯™'Y žìqƒ êX&I­M$]ÚN¯xîŽd€|¼!ƒ¸7&{®T°B+øË-O$¢­Üõß#ãUÄ)76IáüFZphðàHEÉöô @ðeòÆb8>DNœ}ú”ÛÙ§j`Í>¯²¯É û«ÐÇàUÞÈŒº>; |5Ô³ÒñÄ4û &¾'hϸ‡ìB¬÷éÊÄgP;Å 69€;þLífµÙþTA¾eUºÜg€áY ÖkL`· !ôaH³Î¶¶§”5M\"k³àáL? ãs·CXÌ\Nü‹{U-ë„R)BñSåo ™Q}…ˆ¤œÄ6Š£1‘å =mz‚©âK—×2…V{1õ)‘¶»;nÏ¢´hZâç-'ZIExµL"âXQ0ê;vç®XÂLŲ¤\ê%Öê&‚@þâêéórw_- °]Xðò40£oJ@9t“Ä)ê¾ï9Få`6Ô²OVj£Li5BRDu ¥Ð~uðlèÖu/ÂnÔá³rÞ`a-®²ëÄ$挫 ¶¤¹ÀäË®ÔÍECGlÅÞ¯ëmKÙrC}þÑîìxÛà‰>(¿ Þ‚¸Ú£Üôˆ)©Bz!ƒÜ—¹ˆüµN©:¬\ÈWÛ¶…w Èüó‚[_FÛÀåÅÁ¿•Yúù·>CS‘Kóœè„¢kG‘\bHÇ#òÂù “£‹"_ÈU\ =[œx3]‰™p¯ÔÕ“®ã[MGÇòkFÏCÒ]¼DZ€5UÒIÝ›ÁñÁ›r®Á[Ò«b,;GmùDÂ\ãmNAœN1á3T‘uád-7ËÈá?dÕ{¾NuŒªš-%`—ÂÄAÙÑäo‰B‡ž–’ëèóŽó싸Ɗßo¤¶„|€ó`€^Ú¼]˜Cƒâçõq(·_Ò‚ M:GØÙù-µN‚j™^ʰ ¥…LGìä)ù»oäš5Z¿É×µ”gµ÷8Œ°gaçZw$ØœùzŒ5P˜¯C:®!–èâ¸7Ä ¸¥.h«í>X†BXრA´aïf'Áú0sàSØ)c0i4~Ž1È›æµ1ðæËfóýÛ o• Þ¥Œ`_æEŽì“ÉÇÈV‹’²á.T{Ã.ÄB¬ò§N Ÿ¹}6¤Ñ¤C,EµÌ‹øöàRœÁ~é]×`ÎrʷȇCœ™«r0®#7Sw¹ù ·-d„ž‡‹’„•Ôëuê•ðèàQ­.ûjàxÃX’Wlx i³/óéä$ܨö!ŽmƒÊ–êì”c܃M!gQmo_Æn*=ýdF•b=uè·´(«…™nYì=½Fc2j2` ¨›ä;;Ù.³w‰œú{VwTVŒEæ~u|¢m5B=%ŠÓʼn}?Ä#mFmU–añ4Ó g˜Õ"‚ƒæ=C™øy (MØe)8<”Q~ÁaÝË%ë[^ ÿÈãœ?ž[gÐà <¾˜¾†ò ExU÷ÁÏÒv²r2†¶ßô­oŒ}´§ôAMBK39mo–cP11µ}zÂðN…µöO¥>žCPÉ êJÛ¦ó×i¥ðáN°Üpº C¡á—÷—I{‹äúÏwÔÝ0Bõ ,n=wÎãgº ƒ°9gj‹Ù톤NíûýôНý–®Öò¢‡ ¶ÜxŽõÐÞÚjjµƒðçôžmT ¡ç[rÎ~„«8Ì×_ý qØ^e gT6õÅBÄ §¯4õxD 6ydãÄKŠ¥½Gpn,KŽÓ9nÉ…>þaÉŸfÉ…Êl©ZbÆ)eŸ6‰‘+>Ûv岦mO<ÈŸxüNõ×ð'Š6úV`ø³< åWhe´ uÀãdû¨ùÈÀR¬ÌX!Œ¶¿ä&uÿ¤g£å?ú<}§N?Å4oe”qŒlCg(äÛsOÔ­Ñ»'{ÛJè*%«ÙºVZƒv6}ᾓx>‡Ïçtòå_Ò–jñÆtV>h³Ÿ·Q¾Õ;‰êgi¬ÇÓœ˜‰Ê{¨åù2<ÒóÛ”^[¹ÕÇëx Œ{"åfžîìÞfé 'ðYtá‰.&§Æqzxž{ÉÏn?—S£>ðƒÝIuƒ-†M>JþhÃÆB㟣ÒÑÄŸDò¯nôŠw÷k)n¿:½Ÿq?¸¾> stream xœí]Ûnä¸}÷Wôs€8âEj XpÛîY×=ýéìúù³o§¾ïž§øç¿Oyê‡ç3½5ËÿçoW¾V-ïãs~îcïá¯Øyz;£×«©wz ãÒkìýþWê=¾ ¥×«Ô{z̤|¶‰2÷?‰2ñmè,½]= ÞYkšyê h~ÿcE²DÏÔ ã†m!¨F’| +ŠÓKË€¨ŒèÙÌ+ž®è– h’×DŸü½O¸ë‡¨>¿œH3.O相Z;Sùão§?\ýÉts·ÿ8ýdÆ?ž>þõ4ÎÓê–—?uo·çð§1·?{zo|øbî‚>šîmæ>C'¯Ýp{ôþñô3›ŒñvîL˜ÍK˜Mì9tsNÃßø4T˜ï¼øð……ɘ.t;ÄGîöÀ¥D2©Û¹—{ÇÆ¤gâ"Ý,Ò~ó"i ózËÒ*JŒèù„ÂB©7}äÕ;Ksî§y°s7Ìy›ršîó½’›uv^axàï£ÐŠÜ §ï;ëÃvì‹°Ç©’š4Ìcì\7†®MzjÞDat Ë ‹î¦Ðw¿–BÖ¹…×…>.+nØ>pÐʼn]­öv}"æ…¢¤’Ö~*K††û"ÜlxÒ¬mÓÂf’s_¯IÊjz;E9¶Òô;íIÖƒå” |Mö#°À§‰ÂŠ")‡HyÞÂú8÷ÜzeÂÚÛ—Ð;‘ÇpZ¼„…e³´á«äB?+b³ù¡K&Ëñ!mÆß™Ãž-t&Foœy™ÿ½€Üðym­ ”’}ç,› Ù3¢‘}¡Ù½ñF|h`<•÷Q WXcÉûż—Lp_7>ÃÔÏ[7™4‰GñèñŸÝŒ½7›¨´ÖœV³Ø˜ÐÈK³1‹îwÁ=’ mt¡VdDÒù›—@¤ôÍ<%®\3Õ.\ßZìàgX >q‡=^´x~܇pÎôIÞ¹”¬])nF6PA‹ŒD®‘Œx+ÊB?‚Öå˜üEÍ’=QŒç9¿ñ•¡½Ÿ¿›i»°#¬ÐÖ:•£4»Ã%…×lĸð³1²û ù¾^wûsgž³f‰2D2=’|„‰'áDŽ$CDD:d·œ¢–Ã3‰È<\Á8Ëï,ŒÁH˜1ùWÝã¹¥±ˆ æˆëJsŽa£q°J¸]X „Ûôº>D9Cæ[‰/ŒóI!y!” 1Ùä‚ÃPjœ½â;¤ ª(EΗ@‰¯ÍãÚ$&ÏáÙ…/ßsõ‚VžÛQtoáþuÅoÜ»¿gÛS¢'Œ2¦¬€Â™)Pi‚…à¡æF¹Ÿù«kÐ ã¯zÊ`¦J[«o¾7ܤM%¿©;À8]X#·)8'«Ün&æ$"Ú»„®41A*ñ&´[5ý9:—Lt<“.ˆ \±êYÑ‘^ÉÙU& ¼€iY=ÎÊÓñz¹¤í£L#HÐËTƒè³'HÉFût«o [͹C¢ {Ÿì£«X?Ñ>[ícú¢b!sŸS³‘{Lœì 6RÖFÛ›Eµü²¼›j QµŒØd˜ÖMHíÊ-´(úFCJ²É³i}!ðÇØŽU° ÐUæ]Ê‹*Ѧ–™‡©¥R÷5SÒ?Tó¥{‡D—–Àh[ø â.ûÇ‚zÄ%ˆ=Kü®*å̲c°I¥RJÜJ¥f¡dÀL=!—6 _[t5K¸yRQòoêàШIµŠAsnÀ Ž¬BM1[ñ¤ëMqœ¨Å4v6GÀvý .\L1ÐÍîaZÍÀòèò{2-¡ÊhÈçôÊF·É6K¦Y’Í‚RUÍ»ÚͶ®c:‰vš\ K`bü(M*4†²Ä§ÿX`FœÎ³²-Ÿœ…#Ý ›ãžÔDÌBæõ,@ì+—i`¦½ ‚Ïq„\#ducð’î]Ç&ì}x™ÌÃÑr¨9¼QÌ­;fà äÊjQÐñ^ÿh°áî BLcúJ:Ä™0 ãë-áׯHkC‹N+Êpˆ™t•„Þ-j[Ð ÍÎö`Ú =zÁ°„9¿q¯Ìÿ2Xƒ"sX”Ô²Á+¢¾dYÛÄs¼écÏsƒxŠ(—,žbj²Oq»­¬² Û„zœ²a×·¶Ùt½mÀ¦ˆÆvÇM%-X~=~XfÖs–-kcNݛɱ•_ ”‚«:?.rÕ$`B}¾{Ä7a,çs Eš¼8‚ªu,K @ ¤+ÜÌ’ ezè©_²Û´,ƒ–ß8!Ç0^’(ÄÄ ¶È³~JßðÃ7ê£ÅyýÙD´¹5ÎËšlOš¹ËrÈ,Î(É)úš@)Z¶Õ*~úVßëÇ´õllît™\ö‰ºWö ¬Èr™É¾ÍÀ¸Ì¾4 çø°q›Œ` ÑM‹þ–:õ}èc\OÌ&zEô›èÎWK‹#¶[¾Z£ÐŒ}ŽÍžF&µ~e¬²"'^ʘM¥‹î6-æÛñ¹A7Á¹Ì0B†²PXÞ©½ðQøF(Rø×uc\_/¶záëó|n|*0Y¤gR‘¦ÚWfÊ…Â]¹PÀ°|b0ì6’TÊÜnfäI~„Úh›[ÔÌ“XnÊÅÒ‚q)w(v÷«h¦—0 ÁË!Ärú"ú*ÒšÓÅ?cYÈ ¼?³ö÷ Œ ÓÎöùóYÍz…b´!ŒBÞų•“MÌò&Öûg–‰Ï>ö«ÎŒèÇ™£r‡]ì°Q¸ü8İÒe…÷íqëyú5¹ä÷]Å{xaÐÀØŒxçµhø äY¸Ä-;ÂЇDи½z¿xá}¬K_¨é¼a‚3ÍZŸxsgy*c`6s'Ô/œØð¤£ƒ8™.c@´ø`WÈiнÒÉ3pŸR£-Œ§›âÔÈæ„ö/£™×˜RL™Ê…yÚu÷¢´cNì,xwYwaFÔ©ïâÎy^s=aÒŽR6žK…‘)sÏkˆ=Çå’DZC”y¶ÆéËï»kš»[³sâþ5M z+án,mï§™’Ux]Ï4&7&‹1<™oZqa$ñ çølßy“¸©v3l<É4H÷`˜'='QIެ#qcÁi&F>LåÌÓ€l²—tÜ & ÉN?Ï(äÀIûA€ÞÈ¢‰Ó{cÄ£>¬4¬¬)ï¶Â6O¤{gàÒö$+ÕÙî'R%ÁøÜ¯˜<”›X&ºyš’…“Óï»Qì)LF±cÜrüAQURö+ç84yeMì•}}t#kBÅ›bÖñ™ã`b“+êå;À4›£™íòȼ±hÎ 2A„”ÞÆÄ:m¸ØÉÇ„“Ž>_CZÑÆ»¸J¦áëŒ(aR1Óc†´Š¸²V!7™9óuŠ⦸¯Mb§¸kØñ()7äßL–"rÃÁ£° {‘æ\Ѱ€‹Tý.›·fš³a­Ù¢×½‹ž²Ùã|S$—â€0îÌ6a…P¡óqƒ9ƒ”7wH¦l7E<²WƒØKõÈßV‘a‘¨© wj«1¤·‰AA7„¥e!"ÒG EÝ:ÅÀÏ\ãl9@RÑ'Šž¦Á9½²&²OdIbF4Ñ'iêМƒÎ’§Úl/$!,îy-•D%»«™j{ŽÀtjÂMK˜Wź¸ýp> "Ô¨"à%,ŠÐY!Z-LVçºÃök^ÙŸW¼žã#ØŠ¶€6À¨-†­! å’‰í»º/ôòìwô¬ œžatQz²ÀdN^jÙ¾]óH8®9Í£fQ;7Ô@ab*•…#4?S‰kâ~½”|rtÚ½»‰ UCtP‹ì6N)u2¸•”šEë™òpQ?ä@*.E…‰Ü\…92’eQðš€Ö»!´>ŒØñZ›îY’ŒàïD´äFÁZá]=CpP¾¶ÕÛh[„³Ù2ì -·½ ™Œ¶ò(©&=ŠÜQi1A,zW´ÂŠáv“…èùÓ¤#Âe!’1t5.ÑÖ­õ¦˜ëÀ­uQÆe`”rq÷ô@£’ÙnàØn‰ÇÇYîMYÚnÜU‚ ~D#[P Ù~›–xG´ºyßÙñ*1êÍl 6î2Y5&^{«+ŠåN±$‘)ñ˜9}s‰ÕY&=íˆJPÅêÂøÈXjÆË¡hã±—¾èŸýìUL¬ò2Ù [b‰ÝCžçÍȲ†kc!nW‰¡ÌoW› i3ÇeãÓÓsÑוBI³ŽTVe lG„:Øa–AÞ Þá=ìJÕMviÆÇœ º;äY”‚R• „Ââƒv¬ÀöÐëƒqa)5›¹YJ4àËļ<. /ç„—¶M`SAÜßÑ!•wé›É+æ åjÛK¿n,t”Ñ TiöËøhÒ´àúv•ÕÇáÁõÌ%ºg*KËfˆ×EëÌA—Dçk te‹zG-by`£lÒ—äD1CP13r ÔGÅ1”BÝæ\Â.¾_´85:‡´ˆsÖƒŠá9.ß鯛Y³r&Œrï6†{22G;ˆ=‘P‹[îÊØCå{¢G3©‚´ÝW,]z/@ÍfZ:Š)GŽYR\˜EfÞqFë{bpk¥\7àDPž qdiֱϒ9­ˆa§4!™l°O—ˆ÷w˜ÒŠHÃgÃÞí˜GC ¿^p´£ÉFaŒN©f<‰‚è4?¥>¤j¦ˆCz>ðʬV‘µàRñ‹j/ô¨ûÔÂÕž[ª¬éŠ}!h¨„§n,§floÎöƒÕ÷¬Æ=Çí<§@%å•눠$^*‚“¨dÇîN£¡&+yƒšJC4ÙXeÏô*MÎÄ!²Ä þé 1‚%\j5¢nšµLœyŽšEŽP±ß3ðéq=‘Ÿƒ…ýíYyB7Žßýš™ÂÕþºî}ýS½œut WÂb!9&ü-Ý)¿ü÷³Γ?™“™¶f|{ÊMЮÃ!š~8À+gÁjžæ"ù˜-‘&Ão„}<Žn¤I[Z±*%½^÷ݰ,·¤X (_¦Ár¨ŸUÔ¦¸Q/5‚¡O·ÓЧ^ëµ|9ˆmðØÇOxŒ¶VI¿Ü`R ÑL÷]áÐÓ—‡–¡ËŸZÊõ‹,d‡xm°QÄEU"Q¤ã¨ Mn91µ‰†bV®‹¨DCùL”—sç¯+¬vBáÁL¯žö×¹â@ÏOEð%;¯(=J ‹3ÄApõc±Áùj®—w¨ƒ¬ò‰ Vo©4 »‡¡åŒ·hüœ¬Ÿf0݉µe»á'ò‰~ƒìç4çß^< WÛèÖTDöwvi n2ŒY®çpÏ ¸vªC±È%#Ò|(졳h:î§îľ—ß§‹ƒ¸gÄ!J%´©‡8øeW“ëØ­Sާ_·Ò7~åêâh9¶‰|ĤÍM¥=èr„q/ßRÕ/ˆ@ɶjæØâµ­þª²‡y8ëÄxfód±À@ô¦#¦ B½}y‡@`"á} á7Z>`²[wSÕC©•^`9´N’<à¡çîÙaù–RS:Èùð)ÓÏŽÔâI[VqPjÔ%ƒÙ¥P¯d 5ëièºéÔ¤}¿V;vî×>¸ÿÿ=õC¨F{Ÿ` ¥F}aƒ 8BÃ=6ëªTç«RÓmä[ïZ tÈø/³ÝuÚéÑPÃIå€ß‚ÞD½³kC¢•€C Ôh¡Œ(ÔåÜc/Ý$Ò~v!ÇËÆL>3p³p–u_1«ÛÎàÇRÒt„CR¯Œ¾PøíΫ²ô¢’V\ñ8èBÍ-š¨ñ¡ñ6Þ+„ÚR´t”W.§7,Ç,nhtEëÙêqˆ?4–¶3`}§lo@mk%s:¾ÒrW¥Z‡Þ (Š…@E;úý«³ê¸¥m´Êü†Ø¬p¢ãY›£è­98òÃø¯¸ùòuFÔ“-«‚{ ÃÚz”¾Gg§ä´ÛCm^z‡ìlë‡i+Î øR2·š…>ŽOkЮ®p6Ê™‘½fùæ„öt¸uû ↠QÅs¨Lq²ò‘X!Ð*î-‰Ö—žÛ²•—NˆÉET‡FÂtdž}é‹ÿûɯò“Ÿìäqwƒ>͘A…\#'óEØpùÌ¢AVløFÿ{ל°ßšÚr÷fãÇ™aæ×†rQIÔm›(è'ˆ«.QÑÝQ? ªºÌ†»£ô0`Ÿ¯«ké–îЫ÷`ïM¬wOÍ쾿¢xì>ôU´­fî«`(ËÚÄ/>ñB,íØYÑÖtr-þº‰¬òÇï=iz*!·¢Þ|ÁÌ_5¨.{Ê_öT|Çø¨V òí,>pš¶²0´HÉ–EJ3/JÉj6óv0(|"…·{@Æyå±î7€Êg¾;ïrʰýÕ¯æ~ÂŽæ÷– eá˜gYæUl±ü•ZDn¤Ÿ£,«Té8V·ôWè”N屟ý»õñó銭¬Û endstream endobj 24 0 obj 5246 endobj 26 0 obj <> stream xœí]ÙŠäÊ}ﯨgƒËÊE\ ]=Uïü^à‚ ¾/þ}KU¹)NFF¦ªj¦Ç.F­”R±œˆŒ­»ÃÞþ}èìŽê0(½üçõçï;üå‡]¹þûýo§Ï·~8އQ‡Ï¿þtÑÕ>ÿ~øE>|þö6Írçò«_´Q“»4ºK¹^賿p[d“¿ ®ÌQû§œÜ’Á]P× á¿ßnÿ=öî‚9›ùzi:Zöµô-ªw÷,_ŸìÿìžíשÑ]`Ÿ¼<èöì9nøF¿Ä²aywz¸í­Ë\1t‘òÎ[:Ñ­gvÚ Y*|¸Û&Ê4ÂÖÛJàá(ðвüÙÒÄÞ€{PZ»}êîÈSÅËNxß›•:u³ku÷vdá g*½[¢¸   ð ß ÊÀYÔ•‘¼•€H¼‚e·ìݶÂ;µNŒ”Š×ü:xP¿ý¾µP6e)y£ÁùóíW —V/OB¼t¯É­¸¬²‹’%€–”òvvR°hðÌÝ„ä'â øcÜ›§([[ F2 *PÇ{õ7`ÏÉ={ {ƒÍ¯c †ÀÞA 4¦ï@³ [1 ãîXÝlæX´N;Ð é¡Ì-Ú­¶h4W "Ê:°náå$HʸÝ%jGVGUoNÔ¢•g¿£DAÇ$Ü¥žÆ.ƒA?3ned+2îë2À6®.Ã0ÛåAW`³…‹ºY½M/@ü§Pri­oôY5ДXë>mæý*°fÎÝL¼›Îmž¡¹gHî85¿C+G£åûY‚Uu÷LQZ©qRÛ.ªÔÐ`œÁ-DÞR<«eûGˆЋªÅ¢ ÐMþ¶e#gGȈq ¡nU<7©~ñAF•(YÆŠLeµhÀ¡Ðgg Ù·©TïÞ“z];}Á”!¶$lß‚!qÅ9KòÉïøD‹$Ã681¢{V˜©z4MʺWÏh© >)ã΂"oYóéÏ‘#Ë!B~å” 2IMï.Þ¼»gøM£,÷hÎN]Æ‚¬!B÷ăDT9­Ý׳q0mÁ {»8Ad|TkÈï3ƒ ¦Š4g˜ÌPv"ú¡Õ‰ˆ+ît"ü‰~¯¿Oq"J¦š=XoMõÈÝÆ›êž£]µ©ÃV¢©æVSÔ.P§ûMu ¤¦šqäÈ ÚÏ ½@¥ïДüvÜõoÑà µ?£{—vÊKؼ…:ÈÏyí·°áDîOËhn»2Ö™ \=5ó¯b0“ªìB>ÁÕÛQ0Ú!&ºøØpÈ2^B˜TÃrÜ¿›+ñ†nE+#̈!®¬èœG=þ­_3”¯-Ëýšò/í÷µÁÀ|so!G«h<Ô¤Nn™V1v­)4ª.ð+°Â‡È‰[¿É©cÄÒÎÍè±èàxM6­¨€ú;ˆ¾…Övµà½ÈÅ~îÀu0ÚÛ*C•)õDç2±þìÑïô¦L‚‡2Q‘>ܧ³`äØRp€\¨7Cýu—  ãlê æ•íŽÿ|Ký¸]1ÉÁ»=‰NHÑErâ°Æ;ÙÁ‰ž9ƒö¾» lRÜG= ,¡ÛòºB¼¤Iú4rö";ÈEP-‘0Ãú¹9ŪŒ'Ì[ñt¡Ù´Õägf!ij# r´í–½x–šäÐÕ˜… )`y\­ÔvÉ>7B6ùpÌ23NÎ)ö½Mç°¨h'xÍÞa'@n™ÈJm¾ºèA´Ú¬-'û­@àU‹ൠô/±áTI-¡±¥ác ß ì9ø‰BrfÍAù8D†<ÊYù¦¾_3Ÿ ¡¢dEô÷žÁ«P„@Ñ·ÓaS 5Á¸–pòi ¼vÖ+F< Y¯~·#ñVᬠ’`CP›îïtÊ|«žÖTeN€øS>_# p.ÿÚA‘79†EeBüRÖ<³z¬MšWÿÞ›· Pù€(DÈIBòH¬·’ 7çK˜D&¹lOîl K¡|¡Q)–,Åî( À²©QCý{Xf»pZ x&—ÂÍQ—§2µŠ7HnTsê]þJŒ6´sª¢~(CYø+#š¹pEuws( æÕ } -rQ8ä’.ÞßÕ”°±v½–ĘñÞøÌWx¡`•]F; Ö%Y±Éu¹W‰ ä‹ûŠ•K‚W«Í ns¯§*â ›‚ŠTwbìK5 ñ#yìM&þP*7ñ'{u騡÷AYZ”ž¶KÚ8Býaºyc)‰¤¢zÈÜ]êP „ï ±¹àûÆ~y‡ãØF‡Š¾-µcyÆlý®ÚÑÜÉÂYü:WÜ[ã^Q´YÓ—³g9×ÈŒ¡ÑŽL=|)ÖÛ~yWA&x ëW°"k2…‚¨p!Ÿè+„Ö4Йš”.1 )¹U{ÚF2†]6x8iu¬dùƒ3¯ Zø¸>RÞSrÆÏ˜fã—ð>¥‚'*rO{±v"¹tM¡È¸5+UÑT´'Ï•µhˆŸ–ùe{¾Dûj:»Ú×›PT†â§HˆàòY1î‰ÁI»FÐ3‹Ë×L°5Qf\Ÿ“}¾T”­Ä«Èé4ØáвNªd‡£ÊTø@¹ÀvPÅÿ Hœ]m+²–tÛ(µEŒJBÂcªVh‡‰C Q )œ@{ÎeÍÂÈ ø_róϾk¹¿{¬3>Û6DŒ¿’}ìT³}ŒK"/ïàé©FÄÁ^©£¦ÁT±AÝfc_ø“FOøš¢-όֳ+³JúÛd”­7azºúÏ7¾}lòNóláI`?zÉÛ°XÌØ+öÄðx{ÕSÎ<øšt®Ãß‚G{‡="`ÊLª>=~¨d ïÀoòÍ*zPhú „½*q_KC>{@ÁÍ„âMyt-×åãòÕ\‹K¢¦Ò9Í#'Ä^TÙ.{òÄVO'÷Ë—òO”ëI-P»2¨R¹6–$í||O<È\V¸št›Sþ=­ÞîÌ”ë ó³Ýp Jc׌æÚ—¦ßL¢á3]“¤x°¹–9 û| YËiþkÈÏÃÚší×µšz’׵܅3d ñ’wÍnk¶žˆe'¯!k¯!k¹hÅkÈÚkÈÚNƒðè!kF5Ä®uTÉŠŸcÈšXô Y«ðÍlð“J>±ñ!3É$c{ñ+ –õ™û±]èб›þ¹íðé!‚‘Ø/Jf‹MÂö Ç]9( “¡²õ2O/‘»?Äe …¹6‹yLêyFñ‹ b÷Ê*üñ‡‡÷. {Øœ}“û|}”5)²ð Y4WI”Uô- 6M™Ö´MeOßrß—¸_Y  Ø ßxÊ&ÅÁp¹¶O@°™EÁn͈å`PBN݃ߋN,üi-á]kAÈ ¡Ïdyïà8 4X¬¨Z„ÍŠm{Šu*ÂH0š»5Ü&"úŽV&a˜©\¾üøˆ í6ŒÛäã!å¶õp¡¥·‡ÿ(ÑnâÃ4ž*{Ë¢+„Ñ*n>?ö ÂlmE,¦êí¤ŽdL>:Ñ ¶ì(P̶æ®Oʱ„ßÊÂ_±ý^‘r«bê—à(í-ÝÚB°}GãèOž·yà Cœ‘¢ã8ú$Ù4ò´!øú ÒZs¡ý@wÚwRèU©É $cukU¥)UÍOØ{Š/È…28TàUfýû29”p³Óè*ËÇn© A<%Mà$*ÃÿaåÄ&ètÜâDYŸt\Ü…HÑBõ:Å ÷š‰]±VväVxñ ߦ(AØ]¨n}^æ¡¡îŽô~\Ÿñëá¿“d,R endstream endobj 27 0 obj 3804 endobj 29 0 obj <> stream xœí]ÛŽãÆ}Ÿ¯Ðs€LØ’"`Øñjòìd€|@œ²âÿ~ØRßX§ª«)i4ãØ0°€¹"ûVuêÔ­w8üüôßÃpøýðl“±ëŸóþüéþîðŸó_†ÿ~úçÓËÛÓ8=χÙN‡·xµ3ÞþqøÎ|ùãáí_Oá/‡ðWß™ï/âÿæü¿îÙ¦>þ˜çô#3ÇøøÀ:sŠ–ôÞ«ùzyÏ–g—÷||püà& tŒ/¤Α‘ãÆ2]€.Ó˜'N|ÉÅU/e®iòGi¶ø :93â¦Àfšq8¥yéGƒ·/éXÒ*ÜåÉéíé" sØòy˜Ö©žÅa:,giˆK`ÞX%kóF )Ƀ+2ô(yòàÕÖè2rHØ1ž¿røø<¦™œÈ/ÒÔèÄFé“Ò ;¤¦}ÚnéÅz¼þ“°ãqŒJηë€|å˜uż _ÓÌÒTp qÕ–‹™9ã¬)/A^Ó+ Î&!ç$',S—¡k^xPO•à~þÈæûb1O\ß×8Ⱥø ÞªHÃââZÜcaOAÊiñäDºã•-ÈJàãÜ—²Ë§(3ÝVf.á¥uo§yŽ9o/ûöÔœs* -=¨O´Ì!Ýï Q)Ÿ 5’/ñÁ,ž-K„eÂpè´\Z‡¬r/q­õi‚ôÓ¬‹Ò¼¤J^±«xÞÌñ:ã×ñQÖ:¬€ò duõ&Ÿ°€’å˜f¿“rToüF9~½”wkŽ ˜õoŠo­?:òoÉÁÈ8ÌþWB dŸ«—ÜQ‚Ð!¢Ó ¿ØC DºÑ f ØËÀ“†h“}85èhÊ9>Ïõz¶Eh[@÷™†&Êw cH*3Ù ßÊkÆÔ‰? ‘/ô°‰íá ÙRU\!-0Á¥Ùxqƒ’ÔpK’6Ù£ýcf³Â­!ÇÙ¸ô:N! ì8ÈŽÌðÉþÂ,Žü;Qå*FaeåñSø£ÚÔѬ‰—–{5íâ×7“õ¡½ØíÒ±ŽÒðv@CÃ1ìÃö§Å$} ˆU!HorLÞõhLµÛ@¡`ûUK|…3ÀÄAy4¨8f…-ò²÷EI€ ÉH¿=©µ@ š‰„ôúøÓ«d›>S•£LcvʼnŃ—ÂéÅ(Š hu×PËýY9ùB½™®Þ—îÂu˜Ô-IíY¨›7bK;o ùkêt—kó‹Óh›ænÐÝÉÒJ(ÓK7o’j6á÷q1’ÀäËc>h P®›SewñAQpÛ…-KçèNC’ø~‘‘7H „…W´°;mËó6¿¿vËN—†ú8wWœÇX⃌ÏSÜ[ý²®‡J [- +¬^%aÑñå=Æ vôœ‚—qÀóLW?ÛÖK;–oØ8ʸ…ùè1xrìG€á%Ž’;T–_¿öïéNÊ 3ý{Gà¤|T†-ÊWo\ìã‘‘)Ø1ªp>¡$nù ¿Ä1ÅIØÎ;͈[eJhí¸ªxòóüL#õþËvuj¦ªÃ‘W½vn&g¢S®$ÑÜˆŽ–;ÅIM" …ígs$ZÍ>d\œrÀÍŒå4€“0é¬ðªéW„?QqB–ÀØ+³Îþ2-;´—‡Bðð•ìëj–L4ÂY+\V6)u&._öÕ4þâÌÄ•îËKÊÜT2בWïq5n&ÌÆçh`È¡#JA¥UƒbÖ&$¬b¬`% ö ^6j†t‘#è®?hËqô,Öm’Gù«†„;Hé~n©ÒÔŽúµ`0=Ñï›í„jÀÆ©«éÅõæH— î¨?˜ŽýþP‡gw¥ò«»0ˆZ±ÉÙPÞ–““ÎŽuUsZ¬`ÒÚräâMH‰öÇ`†)T6ùéˆ8+-Ø-!¨É*>#ð)ýÏdÌòa¼¡S¹³´1ª¼»¸)…4#x492èа“Â¥þ<Ã~Vˆ¥TUáY7¢aaiC|dr§½t)ê¦i9ª“š¨÷= 1fÚ_L—EIÎ>“•aêžýQœÚ¨bxÓâN+¡9 ^ø&Y¯Ú4ÊìwÇæ>KìºÂ–wd;O¶#àq/¶‹EËepœÝá®@ô©;¿0õºû E ô Z¿~‡ET„½â3£9€Œ~Iõ6B9Žºk·—$ïGÕ<ÖI<Ê`RЦ  ¨X‹¹Ë¨§ÓcQ[tÓ³;±bËê”5U¶d7NwÔŽÀ+ºÎIÅAý'«&<;âé­¢39ËtýàzT7©²ë”Þ’(n6xe éu³º¶_éUçNɽa•ö~Õ/ Élưƒ® »ä%¯ì<®àY ÍtHÄ+²½¥æî…¤jgâõP}sLƒ,í 5Ôµ¡Þü¡„íY˜Pï.'°©¹Cmt‡@^oö$:?Î@¨\QOä2$M/,dÍ9n(óVÍOû°&9Ü̬‚ËfÁF”¨ý‡ö[ïPî:3†AÞ#ZߺaÆ•ª°ïêîŽf‹$ëjëÓÔƒÀjž¾ÞY9‚Ñ›åLUÎWe½ØíJu+êûË^Ÿ^Aü«¸hšÃ:Y[eÒÛCzv”9z•ÇP™ËÁ²†äÜŠeÊ+J¾àþõ®{“U7\Nˆ*òèäA«²›#ìè±¼¾]oæm ›Åj“y»‹XA ¢|—µµ~¦XlÅeÖü¸Ê«Ÿ,>v,õUÍU ;‚­ ý4`ø9Þš³£`ÏŠ²s.Øc> Ei6Ö“™R7I©Õ¶6Θô†£¤­…³ð‰ö•1~ ¨þ¶£»z£Ðf¦!îîÊ‹ÄØA7=j„ŽWN Ô x1»s})•\—ÂdU²}ß]¸Ã]Ÿz(¿¾ÓLRlðTúõ¦Š}UÞ»[ªŠsc|°ëê(bþŸ®(µ%|T¨2 ‚ȶ|Y<Ó Ð;´ªÄðû"È3“Ôô£ð7—ú†fÙϸ¾ik‡þsŒ#­z] ©Óé@ÖÛ hÂ>rP7 ®AãÇ»¤x”Pr~ V 7BÉõaÏÖËÿË©f‡XŸzt—¯°é¨p'‹D x9‘RNn¹.7v‹[¢­§<ï³ë­§4ÓˆúeýTOY‹XÉÔ… ­Z¿)Fû’)ï ]fIf˜À îü•2^±hX.¢¹jV ˜¬Þ¢y¥ý]²ý¨÷’A0^ìu©²B4QÀ”Å>´ðùÊšÃ{ ”ôFÒ…˜ 'ì¦Ú¹|kBu)ò宿|eÁªª©=]wÕ òÙcùÀöö±eK¼a)Æúçå·®:Ö*Ï®sŒ:ÒKb`̺ oÕfÊ1ˆÓõ•÷\͇©™—ú¨|®ðïO¾ÏJUf»Z`1¤5¶3t\È¢Ön˜’Ë¿ô$Ù(‡-/àæÐ{ÄÜ.‹p¥W/@Ö¨;*³ZwiÅ“Õp¯3©6î—¬îÀbôæª"U\ÕçNI¡¡$LF rœZ{³Ûv?"‡šÇÒ¶ÿîöZaŠ“S ÕˆPÇæoà p Uã@êKÓŒþÅžX…ÌsÕà‘fÞ?öZ®â1qÙÝM§w5Ãyõ¢ :ç‹Ü9ìÐiÎܸz£œí'}ð%æ·íÜ7^4*#`oÐc_%n$SWÕWe[LV¾{–³nlgù•÷'ÔÊñ¼~x™Ò5“6Ð,NGð†ácܱìÊÚèCVŽ”Ó`؈jÀ–b)%h½ÁkÑGÃ0é° xž)ìúgØ%;^¶i<üíÛSàt?o¶óÏz:ÿË9ËáÛºƒaóÿüûð¦µ*œ‹KrÙ€“°Lƒ?7¢i›Šé¯/Îq3lÇÍErî•Z+¸Í‰Dºà´`Å,G­Q©Ÿ·±˜]v²zU} ™"Š•ÒºY÷Ž<ø-›õ lVwþD-eܽu´MÎ ÷6](%^¦çFn´»C ›Ý{̆YçÞÓÏLÙz.F·K¼)ÜTN2;êU4Ø`>¶“‰t/o|ðöråÖ¹mØÄr>pæE‰LHr!¥-n‹£D@Ñ™F\^â<ó(–‚Ò.î!ßé's ËÔàKg³# ){£tßÏ%¥'*Ø,<2Õaj¡T¯·DZ%y*= !¹•͉ü̶ÇËOëLÇ?^¦æºäQ£J 3ÉÑ{5ÇÈ5j‚‡‡} «³¬n…2›=y{‘á.Õ_ŽÒɶÁpÅr´HúµSã1?Pn:¹µTP©Dë`Y¬þQ’Èï\Q‰ø @û”‘ÆŠ;7±$¿Ä&}áâ|CøóÑð¥§ÑT¡üÿ…ó&Ê endstream endobj 30 0 obj 3353 endobj 32 0 obj <> stream xœíÙŠåºñ}¾ÂÏt¬Í \Ý=}ò|“†ü@™@îK~?^j‘ªT–ݳõ0‡f\.I¥Ú%•|úîþÛõÝïû× Î/ÇyýûÛß»¿þ®ûÏörý÷Û??<½~HóÃÐýܽþ­ûÃ-t.=ÄîõÝ/nøc÷ú¯/¯~M&·öYiÒïMÖÇ~}ù‹7€s#@ú(~Gé©Qÿð9!FBÈ 0Ÿuü(Z=mÏ#¤ºqP¨_I¿þYõBä>oùÁ#`Tù’6x@@€>æül‰# †qXØ;çw ~ÜšLLÙNGäN)ãi™`­Ó>@‚ѳèYb|„éÎ¥„'æáÎç oð~0Þ¢½ëApFçzä0ÒàƒϬC-ºÔÌ€8Ì# BãÆò=ê——WȬZ( öôwºF³“§cÝIÓ.dß¹~ל}"q&ÄræÄï]‘MÄ;ïÇ÷¬ç£èÆÍ0¢ý£Ù=õh-ĵ LÛE¡K0úâ m@X8 h*D&ç9‚Œrâ8°÷.‚á9jusHŸ7YtÉ?á œE-Ì›J0 yžA^ɽ2RtQ¥fVeéEn5éÓ3,»ôIZŒÀ*…ci‰íc’v­„*GjÂ*ç*üa‹g•K–èëLdòˆ“5gÍ×ç‚kUÑEè&Ó}%’²ðì¯x’8ÏGb˜ÝóÄupÑ$ñ‹†šz­'üQÎEqù”)HM8¡ 7˜$·RÁ&c•ŠJ†®ÝVRT,ó£LÄÖ-ÑoCÉü¼E¨â :2”§i8efAJN9Mª4{eWà“öî4;3^QÈçxå¬ ·<@K]´*7åänR¡ÓÏÆü#ÇÔ­$]ÉM1'¼Àô;ê¶ÌCIÖ2@[*`³Ý›Þã-º"#2}êféU§ÚðÃaÑ¢IÉRï·Ì<æ\õ¢†Ѽ|>–Öu‡ ,L»C—0®x=”±™4¾Z¼Rʲ¬6€,ù¦‰^föW jé £ÙËu'ݶS-$!õRÈ ]Û†V8tól Úu6›&T­>ÊNET´?K†ÊôC»µfŽ™IR都ܨE½íAû¹Å#€\÷õ”ŽZ[¿dv “AØI<†Ã9aÔÍÙê+œšÔÝ%f15¯ÖéUÝrÓû•Ùe“ÅóÉå§>ðÊ$œžµV­3©˜fï`/%Ùd­U£Œ'âH#ê·v5Â,Ò¹þ–ŠÕ }Òóœp³ßb÷ÃÎ]ÛÁåÊb”—Ó0ñ‰è Yšók·ªzVÞ·´]XÔ¸¥½›ÁŸÿôì!÷0¦.Íkþ©KaÝŸÜŸþÝýe·|é&÷Rö¶|êüÐ? ùûð© 1k}_>u-ë{L«ÍìÄMøˆÔñk¤†^&Þ&Þ&Þ#`X´0§oÎD$ˆJÓÈ%„©dŒÂt2Bâ¢ù9¡ûsF(" YŒPB˜PÆ(!L(c”&”1²(mÈ ÝŸ3BÉb„„2F aB£„0¡Œ7>ÄœÐý9#,F(!L(c”&”1JÊé¥Í ÝŸ3BÉb„„2F aB£„0¡Œ8¥µ+"ž™PB²2„B„f%„Í0Jša dq²#:ã#ùLzDñûÂd2F a2£„0™’ âfF“òëûCáUÙçn¥GË<ÞöTº‘ÌÍlO¥íf¶½=•“ÔöTji¦ÅÙäD : Ú~¸íÛž§mòm[k+y¦M“ ºg¢^;â´]}ÛǶ[Û«´Í9³›I&g"|;¶¶ƒZ;š´ÝxÛ¶Wæ!¦"/ÌlFd;:‹y†ß2Àë¸)#«X2¤©H!cIÅEK'N¼ŸÇšÒ…gi0%Åì ³gz›¹È@ï3'™è}æ&s½Ïe ÷™«Ì49æÎ¾H8Yö2¯ ÷4­ëš×½¾aÞÖÊ~/‘à£tØm]–·|Ô‹&Zmy¹Šr°F+ ¬êÅ,®qÓ¼ôS¡ ê,² DØåÀG\JÊ#£¬š +îðñÈ3µý2ms›ÁqÓ’óÊBA˜ÞN S›ꬡ2‡W‹y/LvQîhd,›¬9ĸªÓ4‡¬ÜÉLZw ÒæÏ¶9%œVP¸>«sX¯C[FxøÆÛ~–³Eã$€ïƒKý­Ÿü~æ=ï“9Ø¡Qg‚Ù±yãÝT›ŒKÁq9pie?õª|â£ö”½hF"YĈ3Úý”Øy÷m‰µÂ‹†Ÿ»ÔÄz¥ ˆU790°mC2yn×Ê¥œÃ#x’ØM€Ÿ^&}†IÅ´2½FEHrØ£ˆ"¶J§ó¸ˆ¶Öi„»%\Ò‡J¾°Jh°&§ùñX·ƒ”/¦.°ÈKy„%õ2éË0FPq/©çÛ° sl'ÈSSL‚לهÌK€ŒMÍé€M'9F´¦ uYQÎäQÌDl.à š„_Òˆ~ÀZÒTÚx²õ°-µ¦¡’.ÓLå\›‚VÃ*Qª®FÑ}(@²ƒœí("‚æÇ|Â:”šžðno`‰©d¦²+ÝVjØK©NÕ°Q|/çò,gkŠWUäÚJdÆ”xžëMu׆+]¬©8榹kÑÈ~ÓÚÔ‡GÉø¶Î(˜¤$Ϋ*Êcl;gLüD”l¢äC%ÊAÖüÚ^AùE펑'™f» ©š0™Yé@«ôYÒ¡l^5‰ævÜÕ 5 ‚OE\uÒIh‘%{=5)·/XÌü‡´î|R¥©—ü ±–7àÃò*]}j cáŠkö«]§&ï s/Ä70·™jêͨýn/62g²½hIO«‰³Í>.¬MëSqߎÙÔ$‹Ùv¤o:ß/³/,/$ØG±²ê_,:ç°œWi¼Û™îäJ j1(­‚¨¡ã”°íïˆ&öP\v$w3¬5.¯?òÖGjªn¥šð õá>Cp~a[PB>u¡ŸÖúÊ £„|êÊA·ºÒâ祕+øT~ CfïK‘a”""Ã@H LÁò~{#Á›ì‘G…wÙ#ïàÑÍŠM·ñà‘†¤×0Lö¾„ÐØF ! 2 „¤5³!¶'&^âxô¶ðøô¾ðèônë†TžYõd„Â40F a*Ô È‚|ÈŠúï¥bú\q÷GVO µ÷\Øç Ñ!Íê”Ê)f[}Zâ%VʤO™Û‘i´U·¥\$æ!W-¤Î6ué Jã, ·b6Ò°”j ÕêPÑs«+u®p„‘k]a Ô;~äþ3Í+ ŒAô_*dÖ°¹Ö ´†ë¡’¿å–u’;ÔY¶VÖ¿S%»ÚäåäÌŠ™n+M®’eJˆÙ eKxÂD„DˆÕÑÂðIf A4éÕI°ÊU±S:é·Ëj†õÛŒµÙAí4¯NWs¥‚Éê=Y[s§Âúpš;„!n œù¬ÌZ4ÖÙKŽb*^ÝÉWã*3'#>W-Cêüy¯e*ËÁÄ?œÜ·ä|v›‚^n U vb‚\¡9½´Vu~¼ÌMÔ°îY&çBekÞPMb»Áùõc,&÷X4¡ÒkÅdòCÒ¡1’$}°X(ζ²a§–\œ]îÖßÖ¦ÿ$uÌK€’óAb¨ÙÊÉiéËQt§ CYƒ6( B ᲄCŠÒ»dÛPÊ]7–ÅÖAà…á ûNÏ.™1ÝårE.r ó<ÜdXáê­&Z#ˆ2¶Išˆ‚<³…÷¶n ‰ï»Üµã„v(T29Hvž§³†;Ï߯s²7j"èÇ(÷©ÅÑ­-¹8riì]r'$§Ø£$§=%6!_:Úµ_.{?¹‡öªF[ØvÄ_“ýà¹*vg†ŽW˜TŠ^U•A•ì¿YÓ Bqgs¿Ñ)­•å‚@/;ž¤NIJ<ꨜ%kûtÔ¹Õ;W˜xpž½0݇™eaý EüGA•f©\ƒÙ»ï°æÐdê5ÇWµâpÛ®¥âëeŠrÊ¿Hß û¸áí»ì Ï7¿qž–›!²;ªÄ“|RSqÁ©›mÒ&¼\yÙ -yEÕ~¦ufEåï1ø]¬3+Šy—Ìav$Ý…½°Tnu0•c(²—̸oÒE¾åxä·Yö‰¯Zßyþ- Ýœ¸öñ.¹÷³(|7‰Â;XºíêJfÐ/0!2G´—bæù-ÅT!gëÈ {tʸ¾Üº*ÃPKU¥*ªv*+; æÖí©}MJ2µWÔ:\)õ,ôOmW[N¯wdK(ÕDºÖÏYð™[âù‚¬Ÿ™%.÷F‹Ó:â4gXIÇz,W'ã'Iýˆ­Y;ú‰5úÇ诛ÑÖTîÎó"£ÞKæô£HîÛd´ïÇ‹½‡Œ6ÊsëÛ’ÑB ôöaþ… $u8¢~9Žú!‹Ê‰Tlwz![ì×ëWЇ'nýÈ~‰¯«ä–f^¨´IËYmpÀrþíbK'Á.ûƒyÏ(éŸcv­Èòdmn¼a;Êqì£UŒ'JCšG”eR—­,SëØ}ýb„ŽûúåÒúÅS¥íO¹~Qîîžåc±¼y¨,9šáø]qdwŽqüg*š¬9£»v|åÝßßKï>çß|7V­ß'v-‹A/æñ7_y¾¶ÚÁÏfá–_yÍ>ñ×ý)þãe'÷v×Ü/h•a‚yF?¯ß5©†éÏ$¹(>»P]PÎÛà¨Nñ —»ÿÁfCë endstream endobj 33 0 obj 4272 endobj 35 0 obj <> stream xœí]Ý®ãÆ ¾?O¡ëuçO äl{½íúMÙÉM_¿’5¿äŒh¯-Û²ˆvWœ‘H‘ò#G’Eó¿·?ÑüUdÓI5þm‡éï?nþý—æ¿o_›ixÚ wº ƒ¢™þüóî?þúflhÛÆêv<á[Óšá`ýáïÍ¿ÞÚî â°TíaH‡3·F‹þ ÓñŒð­É¸Mãž ûQRÇÞ9î: z^a4#Dæa<#DæaÜ:uºgÏÝöaرKÆsJ ™‘S‚ É Gi‡îÐæ£ ‚tüâhFüãxFÜã¸'ŒÓTÔ€;Œìý°gÇsJ” ÎÈ)Q†8ÃQÌÈËæ£ ‚tüâhFüãxFÜã¸'(=ý¸Ï‡‘½öìâxN‰Ä9%Êg8ŠîåAæ£ ‚tüâhFüãxFÜã¸#¨1ŠôQî0°ÃŽ]2žS‚ÉŒœdHfxJ;$>0EÜ çF3BäÆ3BäÆ=aœ& ̇‘½öìâxN‰Ä9%Êg8ŠL"‘LÃLcÌL£ÌCLãŽÌƒŽÔêÐ%üæÃÈÒ{6q<§DÞqFN‰ÄŽ2¦ª ‚;Š‰Ç :va0=ÌÃhzƒ Ç[|p¾sGi>RI¶:åùB¥ùät˜År•Dúù(‹µ*ŧÃ,ª$JÎGYœRi;f1D%æt”¯q•Æ€ù0]*YóQ¶>Tº~f gJ‘‰F°MúN3L5ÇÓ9˜Ê‘t£r ¨MÇP*ÆÑ1h)RÐë9Y`Ùš †¢À …(°BC *ÙÓ©˜J–t*£’ –Â6V“X—EÕ`¨ê¨#RˆY1j¨!:ˆù0ê¨ !"ˆ™j¨¦€( æ@Y ”‘aΆ94˯(»Áü å^žƒÓL”–b±2‹¹(%„ñ4e”0#ÉG)!Ž')£„INJ q<ÉJ%ÌHòRJãifÊ(qFÌM)!Ž'Ù)£„2W“Lu”Øq®§«åöM(¥ß?ߺqÑ5v¼YÕ|þ§ùÛÑ4R4Ÿ¿4?(%º›ÏßÞ¤ÇÄ4úƒ|?QÚCï í‰0éÒÔ‰åéÐľ¸+ Žà˜||¾}’É~šUÍ®Â:‚¿ªŽod>ELm†ò·âg NÃ|o£.áïðîýE;ÑêÝéNŒ«¦twâèØ(ÈÆ_U´™’Ѹr#À{_AŸ­0CçvKîý½v«fS‹¤dH5Ú[QZñE.V½™.7uAÔvt8aÇKäl›ÞYD~œÎN«‹Ö³øp„Àâ„„3·tmFàzAînèlj@nÑgr«Ÿ€Ü ò”³/ɨo4£u3¼¾õ—ê Výdø‚Bg9Ttñwg¢à‘ $4¢†34̹J¼[ñNqŽÝÜ-% ÃSb(©[L ÁÏPÕkÍì’RD=0Rœ/ËQY·Ö¥¿Gõ¤¡k"-¸#ã’ª˜8 vÙæ%g„6WPqAÒ¶ê´×Ð5 \u›wU=£S:xÊ^¡Ïñ My…WiÏñ [Ó4ºeú‘_)ëdëc6À‘êž HyV?Œk†ˆ&ÕHîÅ /©©Îh¤XEÊÑC¶=<r!oßÊüæMŸûb …B&@ëåK{†KV]-•]e|'(% Ø‡ôýè ]4f¼9LN8›u’àÞ`«Èx›£gØœL€R[wÙTfAïð*0®¬`£ÉôÁÀ„Éwm|}»/`¢¥œzL…*oÕøV Eˆ ¾(š d‹œ*ÌQôX Žœ?Gnh-»ÅQÕx©Æb/iœN…ú¯ã8=ÇTعTØ‘¢–Ý‚NanT„wê$öŽ%ïG'Ç„A’ºÌXMWÈ®X_0Ò²œ™3 ¥âï(Y±w,yG϶fÙ…^ÿ¬sXº³Æ/Ó8Æ‚ºÂhí˜ÖmR(ÍÙ*7¶Š²Ê p­ JpÙºå 6[n1¿UWK½;9Û”¶ùz9^éau@’¾‚Ü}†øÓšD˜ [ ná­¿Ÿ däÖÚ†£ ´K÷å w»á¶$f‹šÖdçIJ¯uÜ\¬ö'Tí”;õ'$†|;êO”¼óÅʈ·àr¬óM +ÁµÊóa«ç‰a86 kÀŒýýɵ ÖÚ~záãóþ`ÂUÁ6Œ«p¼ñJ®ïl!l¶Ê†Úí!Rk§'_ÅrŒˆ)swv¼Ï‡æÔ„V?4T­™Ÿ¦HÒvÏoS”¼ÓÌÊ ¬àr¬óM€2Åï?!${šöoS©apù.Œ‡%‡x¹J“è“…Gè 0á]Aú¢ð£… OL +©hq›Pï ÛwV±\íË‹‰#  Z§ò~C{|£Ú¢spß;Îî >g‡|Œk*pn·æÐƒAŸVØSÍQˆAŒ£–pÔÕ3(º°¾—ô½§w"JÁˆ½cÝ€îÛóh[Wk>*wÝ ý¯­@G>sûŸêÔîgÃ3‘ûíç#âjѹ–í$ù4 —.Cm°tiýá+–.îöµ»òOñ»dC‚È#3£2œ9ž9dû$Ï‘s+2³‹èÈÏýe2º¦W§v˜Ñ])^("¸_³YªXãÜŽtÞQ(0Ø;–¼cOïh£Q²bïXlœB±nò‰–BÌvX¶Ãõ›…¢•u~‘ÎWøDK©Še«ÜØ*«<ÌYªsÙr‹Hã.s>¬"»Á›êzE‚ šU}Ù/xæñ»öäB]á÷äZȸÞ{­¾’SÿjËÕ¯ä´úÒ©«0ÛE.rÕ þüÁåaãQ.‹‹‡uºJ«ˆóݺ˜½är¬ó- CÕq…{™å'Š=ÁË>Êàß¹{)¸I"C¬€ oä/á¾*›+PŸ…|UMõ­× ýCw ûöSn¤ÉŸzaÐ_ c–ÜöÚííRÔb/i|OÛÛ8±o¬\‚+Éï7]§óG•à’þ2ËÝ©¦¸ÁЯÚÓßЯ—ÐèÓç?õÿ›nÿ¥K*æÎøv;YxS½¨­i é”þÝF¼»KËÏ®§¤FO¸¼°æ8ï­Œ .Ç:ßJzç/#½_æÏH®Ø˜$N|š8öðq7rnï§jTͬÿÀ(xÖÆôrt„˜MDµÉ0ˆqZÝBÐ_üM‰v<½$ªÏ·=0TžK—”¶"–b¥›}mþ+ endstream endobj 36 0 obj 3032 endobj 38 0 obj <> stream xœíÙŽ#7¢žÄ«³ X`úpž'i ?°Ù™™—ýý­²)Š"Å’;îÃvWÌŒ.Þ¤H©ÊeºÿÝýÕ™îG³³]oÝüç0-~ÿ½ûí‡îÏ»¯Ý2ìûi7Á¸ïã.à¸é–ÿùþñý?waw1vƒ;ß}ëb˜vCjþÑýzûËÃÖÅÝD‡‹Žo7ãÎÓñ¢ã[W`[ÆS‡gZ=´»ÇÁ„ G‹ŽŒÇ‹ŽŒÇ¡£ïû寄šˆ‡/{2£ìAÈŒÔãý¬'¤áÐÊ$À`‡£EGÆãEGÆŽãÐG»³ ‰èqБñ²) 3ʤÌH=aœq# ‡V&>-:2~/:2v‡Ž0 ;›%MDÃ€ŽŒ—=H™Qö dFêé³,ÿÎè{¢ý4Bšk_èý8F Sdsx„ãc3£Là M/{2î<£ìÉäÐã“ý>5sØIÀ1HA/:?ŸE@°É -” Y‡V4 *Ç&uhGÜýÐ*ÎQ‡<6©38â*G6 cuԘ͞b#£`ܵ«Á¶ [ÁªLZÎÞvÆ5—i6µ²Â°QJ­-§½!´Bv; ¶B^; ­¶sS_+œ¥¤m¼lc®lŠ|ÛäÛØ*› ßvxàgC%(ó°ÍÂhbE€ã!H b^‡‹(Ds±œšå8D;pœF¢¢'Ïȱˆvà8FEOž‘ãíÀq‘Šž<£/( ;_!Åc>«¦»u˜ÇÞ?ßÍ™®ëçç?ŸÿÕýc:kºçw?9gúvÏÿ½³a3ËèOöþÐwcꈇŽ~æ:Ü¡›öÐ yÁ@˜ <=ß}e”Ùq™U%-0¬f€ŽÕÀ‹„—,*Sf¸ÄJša<[b¦#o³,¡ã‘sŸ€ö ¨ÊïÍ.V¹3{@ã8šÕÄBÈbÜN¥8ïæ:üÉÒÁ¾Ôáý^c5Lf©OjŠ4\¢=cÅ \+¯01•™¾Tu…Ô8œfP:c7‚FÌI2/÷PÄDÕ§Åû3P'f0­!_GFŠB@­ûì dâÜ?¨¾ä–PScí  Ec»a¡m8Þa¹8=Ÿáa 4"¯'¶T¸x<^G‹@/à}ÄŠ9a’tΜ¤´g3„€¼Ðœ ýQ*`˜NX`¤kÚ'ö1¬›C?3Eëæà8È\TícâªäzÑE7‡^5‡¦^^`0ºn_Ó`MbB¦ºÁ¨^) FÀž-кÄŒÛh2:$ý|£§907bå¤;. a¥AÁçÐÀé9Ú‘/áXtö½µK*V ÁoqÑ’ù&(°H b†°BŽV„>œ¡m{ªÙ&™‡±X \4Øu‰×¢Ü&ñ5‰Ë Ç7g¿on½ÍýÜ  Ê){S3†áޢʔq ãºuTÂÑfkÖ!·3®“•¢dnR%°ÉüïÉ\$B€n€À8q½)V×Ü`7½½@oB<'Ô=i FÒA÷§0Úåªï£r ³°ÙÆÂsü äÏÕv¿œ©—´KRQ\£œyææŽdÄ ƒ'®’]Qµ9ÞÁÓR$,hX¤ø’RÊvνvžÑ‡¡”¯7\X¢§?¢Èỹ”ïòuqaJމšËAñ ­å¦+ÖöÑ‚ŒsèÀbâå9s†JœôvŪW›ùhD4îD½ùЇÜü?SµYó—mÇ~ãìVÜ&ñ«Èmýv2ó2ͽOv{91¬} Ó"±›Êöª.Éœó;V‚ÝRºüÂÌÖ.‚~~ÿÜVnÌœw=ÕMt4S]©é+¾«“çv­òœR=÷Ey4ÏOˆ¤"Ws_¤ã ²ViÚ[¡ÓúÉ ³°Ñ7\êTâå–¾­¥og_¬UbÔ&ñ5‰ª‹µJ8Ú¬ãmâgh›Ì¯ïð!ŽËë#›æ.îðᣲŠW¸Z‹ƒÑ`ïÊYµ‚›P¶‡Ü,'¯øô+òg™rÄ„< ê7e"GTsÕ3Ïbï¸^ñ]YMý·\Bš=Äek’Èç=/µv«XÞgªÝj¦ºí~oœ+VLn“ùUäŠq;éx™æÞ'W¼œ(vUÑâ¹ÚËM>‘vÿ¥ðæ&~#yÍybES×{ÑTË×^þJ—îbªöäy™:BˆÍ;0¹ñXç¬UnDÊþ¬ô‰­Úàk.¥Úp¦åï7\kTÂÝ–=­Åœsï‰j¡a“øšÄ?Ó=‘ F›m¼qåoÍö ãy2ÿ¨ÊߨÝö*ëVþ•S¼Â-Q{ ¤Hx‰-².÷Ä—ˆÌMC#v«mN[R{êr¥,Ç*\”å" lTr{þT•\Ŷ½ð-+¹šÁmÛ\ÝÛyÅ™2ÿ \ÝÛ¹ÇË4÷N¹úGígçêËWË|tù–Óº#ùð·Dɤè{ÖÙ§HÈ 5‘ÃbÛ*<¿x€ïì¹|j¥–O­ `°‡Ð¿w!Ÿ¯ãÌIy|Ž ²o Ë:ž9Ež9eþHƒÄí^f´M>a'HI¶‰¹óÈÙ±œ[•á0,ªÕ9›|&$ÕØ”õºR@!Ý«F´Ò)4n|ºtàÒJŒ'7 >ðÔ?£ùt´ØÐ°øô3(ìFËxêòÚŒ¦šÐrBå.}3Dn!ü{—ÎÃ'S ë³3[–ö‘Á@ ¬àÏ_aM2kžÏ.92*)í}¢Vuu bîyŽ<¬ e9 ýî(,Ê!Ø¥L¡Øï5™Û˜¼ÊñL hxÊi#芮ã, â$Ï‚ž‡’^Æ _,7Üpæÿ©DŸ »ˆ¤‘Ê™e>)’U—¾0Ü«Òa5pZ€ÁÉ¥ƒdzÎÈ7i"³ÜL’!Ruxç~ò±\êdÉI’íɲ[…0?„›ò1„ëaNŸkáÉ<¢Hcа?ÚÓ×ùµxê—LT£ž€"°›ìŽ/‘Ñ" -hF'³érOûbi˜aµÃòW^yl“ÅiB¹€‚0fVX†ph0\Ì&Ëíèw#¡ÚN(Pý¬3„C“€áb6]¦eZ^liB¹€‚ðËùV†ph0\̦Ëg{ë³ñ@‡Ëéy¯°„øaZþL!¾Ü—ûaÞ8\ÒV>à¬5éžbâûnŠ¡,?øÙ¿é¡‹ åšô€ç@IÊ¥‘Œôxà€¼/›l”ÿLæÃ‚$±ÕG$ƒ˜ž8•‰!âÕ@Kh{ó€ç’Q“¢µ\‚Ô­óe„åÊÅ$4pY Në{®|Uê=ÔníPu8³­HmÔqÎûšgTŸHÛ-zÊT¤…†Ã§kPöPu$¥^Êl-9Î}¹â›·FÖëù8Ÿ'±+óŒ1|³ë_r§׿9ç5Ö&Ȥr»gè‘ÛüV (A®Ý¼›ñ°ÃK¡ P†ùŠît‰¼$S=#¥ÖDÜs΢ì ‰XHFR#–ò8 ' ˜«¦ÍCÁ˜t”⯫’;V#®7Bº¸d/?’Ó‘‰Åó»=ïÙ X¢º“£WÈ—ëNB ÂÆ…IC#pUƒ£FäªÇ™6C·+U¨ÈÛmu¯­ènóÚ›ðZ¯Ä¼vÎì¯Òk+«„„·åKwBRŸì*“.½’›‰ãn*Dò1Ž\QçæÈ·áÈëÙ¬Çü°ê;²Tœð“¶j÷Á˜=àV¼ÔìÁƒ¬Ë œ‚9ÐT˜³0\Ý[ÿv²\ÓÙæ­·á­úóDoìUxk›&±EéÙó‹ÂÂù{aMÆ›wÝ„wÙ•—*ïŠ ºË÷.±MÓ &},MF¦¹bU”œ´sÜì“Íl>y> #©>釫ðÉåó ðAKžkl°"¡Í7nÃ7ûÕáQ²Ë÷ kRáD2DnæÖÇ1ž³µ0÷i¿%ÞT‘éæM·áMúEÄòÇ4îðW>ì-½ '¼¤§‡—ô*0oý= tä´ñ¿—n¢%a#—€ E5¡ ^äÁœxà -ÂÀ”'gÄZ˜ÌãÎs{Ì ñð­Hp;¯½J)œæÓ «&a4­£ñžWÄÛkÇbÇÈ þô}©N$w2ó´ xT$¿hÕßÙ]f­‘š—Í/Cg©•H;(d9NùQ¹¯ÝÿMEº endstream endobj 39 0 obj 3983 endobj 41 0 obj <> stream xœTËjÄ0 ¼ç+t.Ô+ÉvÃRØÝ&÷…@ (´Ð½ô÷;Š“81]Œ%ÍH£á·ú„GT5ñðv>¼ooðòßñ0<·êÜW¶V[å¡…CÇ@ý;éôýgŽ1µÀ€È'ÛøiªÕy(-E@+.Eh#ÀDJML)\&*©˜8¨ÍHé²’ý…$;5Ö®*àXÁ¨æîÆÉJÌàžxµH­ËÝmû·RÛ«ºØð¦ÊFÎzÊÉi{wCLÌŘò6Ìä#ÐÌ£zζŒÎRÛ¥qï Æ™ŸMÓÚ¾ºf+"Pqí¼!G6þ«:t”6Þ q¶ž‹9\GÛfŒ Sï<ÇŽ«<õ…67¡6_ŒØè›Ô¦è´CèÅ(%F%¹º4&Ãz°e÷*èJ9ñö°~‘Á1Clmò_fÑK'@ú‹tÙACظá朊K€¡¯=©Ó*7ÉÐõ•SÞ+rYœÉ Ö¸Âõ4 endstream endobj 42 0 obj 377 endobj 44 0 obj <> stream xœí\[kìF~÷¯ÐóÂNú. BÀcϼ û6YXØ@ò’¿¿’¦ú¢ª.UK3αãã†#KÝÕuùêÒÕ­º?Ÿ~ïT÷OuÒ]ÐfúÝóï?~éþõî·åó¿?þót~{òáÔwat'ß½ý»ûáê:mº·_»õëOÝÛŸ†“™Þþô£2˃ùÍÛ£——·§ŸÑ ÃprÕA•…1tÃÝf‰sô0©ƒZ-ü)Ä·Ø¿¿<è§UÁxJ5Âñõ ŸŒxÐ8† ð‰åëÈFÔ¯g‰+5ÏË'ù$þz´võ‚)«!ô™ãÿM¨}˜Æ^øo:­þ»›ÈBžÃÂRÓÚ{ô†ú²<°‰ðøF\Ù‰Ä)ëxJ¤ß–Ðóë!¿'þkL& ôÀgæ‘O<,~’A×X(P†x–eƳ–a¶rŒ6†6*MFŵ7é÷+¼‘ÕÂ^`õZ§§Š5Ö™AêdB?NfÚ¯¦U€îüïé‡«Žº£Î0QœÌ$³ 4¸XdFù«-<0ë1Òì»øÄ#Ý t¤YÒ [«5–± "* Šn8ؘ5÷ʃ "-ym °‡—¿‡)ãÖ!sS—õ€(L°mÙÚg­%º©‰Y¥±°p’zmÙÍ`ÙU€ æ`¦¡ËzH"X÷©‹‡i%êÂboH¾/}b¯‘›ÑÝ„©m–Ö¨Ÿñ3kÀ!éì^œÒ°Áè<"6 3NžÍâ6…Ÿ$ú%ZbBáË­H†ee\R!rõo‡J¦Ÿñ£¦3¼U2öbmÝÁÿ…5h$vi„Z´Á»$98°l(5ÎZp³{B©É´nëÐ{|õÅbA“0ò^ËT††¡ò×%4¤P[…†À14A’Ë?ëåPô}ùw‰¡^J´Ñð¢Iª.š[2syå7G°@ôzå÷$"çŒ>»áZ0ó‚ݨ›þ½D6%© ƒ¡í•ÄÄ E-É – ë’ÐD È•Îs´ÉìnO³$ÍtO³êSrqÑÀ+ÒdPÙÒüõ¸UÄ8ûCš™iÖI«9š­ Rkvƒ4åggØ…%àöˆÏ| fë#ìŠÁ; ƒi3Î̹­mÅÈè8„÷½šÔiù$±,+× Æ'JE^&¡²d 0Q«¼àg~å\s-6;PüÒ*Vtág =2¯Vk½AÜ+Æ|Ó¹à¡"Îv˜Ëf¬á½™Ö±Èc@ú],À`Õ±°f]”Û<ÚM{L~}õ¸¦>`ÔcÖo?bÊHÄ‘âü€ŒAr‘ÈùŒ,à§å–öXÊHžPa¬Ñè½z;£äç• ™4BRrÛë\‰ “PI„iAXeeXV,à–=³6V¶ú¨luqðSʳ”%Ðó4LÞºqŽcåUh∉ ÀË›p„' 8ì°Çè?£€u¯!÷[ Ë[˜¸D n0&V¸îŒ4®hØzÁo\@  @K[äbXs‘cɘI¤ˆƒ•)Ä¡Á þŠ.ï aëš×+5 Ø"J¢!4Š"ˆRáhšDä4 DR"d‘IÉêñ'°§\(²«çfýLÁ© îk9I‘†h§§ž]˜:S]Pv‡ØÉRo”%É’–Œ`upf’dÿðŒ×+8Y¾g/X#>HöâÌø={yû{f/Në¯Ì_-{±£ýž½Ü›½Ø>ÜXø²—ËꛆJ'ŽÄIÌL‚yB¹YÓ‰#Oº2¾÷ù­J†ä0á½La*5,G¯0êȽabhÚ_Ê‘5ËvÂæJ[?›^ŒÏ"9°mʸ¾‚ˆðPý×É®|Œœ}Fl h|š‚I`kÙ`_°‚EîX†ÈˆŽû$DwêS‡ÊdiÖ=øcm7Ò2*y@–B¼<ãWŒ(ÊVçllCdMv÷ŽåquÇEYD*0d'ÖhÏl˜\ØsflaÑœ×ß²hT—Ë탼E{–Mß$®ß«YÊ-¯ðÕâz3ôßãú{ãzÓ«ˆ¿¹Kí6éÀ6¡î¡µbîè°ìg°žÀÎHèF¡)å&øüE¦™Tñv©e&ñ—m+L^ô Ý».5Ì%a»èn4ioß8-ƒØ(6äÚ˜Q1­re¯@.îs Q¤é IuçáE©• ¾/:™0Ÿh—£BŒqgxƒÌÒ|2"uê"§RÊ2?9²‘»%IÙ’íŸç:³Û» vÊD™$AhÜðFt'aejø ‘LÇ$ÕX¤WÚí&·LÊçΨT¥ÉÜ‘myª‘C^1>²Cµ•´àbjIß)ž™ð YÑEð5”¶³Ë¨Až„’v ÈŽ[zIÿ0Õ3g£LY˜"[ªB£mH†Hbc{ # ¹aqÌ߇@/" פ}ß7ßoŒ ÅŒâõ•;Ö/È×ET(…F'=b(K,Ëö ŸƒBhØ•ú©Ò,ѵ§Ç‹“"éµäiH+‹xÔòD§ÂŸ{J09ýÄb¹G¤ð'ª$8K*ªN†l±Æ8¯#‹ MÙ׬+öP°£yÇ·ÍX‰>(?¢‡ì0÷­_ˤ•'xPb8ˆµàPš²‘6’åˆÆB#wT†%•ˆ½¹O£C¯ÞQP‡› ¿´ ”ôÑÁšù«tP5o¸ˆæAJ%È*¥CÏö‡røÈ ÿ¯<„z$£•ƒÖ¸lÕ‹º*ñÒ•Ô‡Ùçß׫ŒñÈŸxR&Fy™/jÐe¢3¨´BNÂó'má V@eçÈùSjb¦&ûðØ–ä›*'Í“’%ødï³²—´YÕ~áIÔlVsäR ¢á-½¶Ù/ñC!Åðº8)R9îýˆ LŽxF´Ô`îOÛi$¶ïf¢Ò$âÇNbú‰Œ.JŠ¡¼"MŽ·G©èYgÀ$t³GŠÿ0ªSm#V-[jÇGì³eØgGÙM¬¸ÉɆ³^¹* JÀi-Ý æò´­üFé³I1¸õ’¥öL 3°ÓC{Yn"|@¤y<èc÷Íß©–>áJêÝâöTLÅòäxýÈ ¢ùîn'Ø+ï†Ç=åeŒ˜EÇ› ­¤o•*ʺÄç ØþÊ>ÝOìî»p·ˆ^®:Z£š#ë½ÿη—È)©Ü-oËjÀC®èa’m‘ÙÆ\ŽOʲ$ìótC’'ç@t@›„ͱ®Õsrk޵߽Íß®Ô';`GqyYd˜n^Z{Ô¾p;@f¤‹ý„vÌ%ÅÎv¯ËUÑQ×>›SÙúF5¨tÓØ5ü•öûÔœS¯?™|Þˆ g.šà£3¼4T»™ÌlÏþûÞP§ÁôÄÚËn8R—É’8m5t_ùH½òœ:y–[Ûä§kÁ.)Œ1»|âkA@²7ñ´-mPF‡> stream xœíXM‹Û0½çWø\hªÛ²a)4»Î}!Ð?ÐØC¡{é߯b$gž&ãdié¡»°ližÞŒÞŒÆ4¿v?Ó¼7{ÛôÖÅß0ž_¿6Ÿß5?æ—çÿ×ï»Ãi×õûÐ×7§/͇£k¬iNßšûécszÙ_šó«û¸ У±ó£ß»4ÐÍ㾫O°ñó@DäÓXKËôû6 ó@zôžÞçU'²kiÀ-v»õh9¯› ™é­iÕžÛuaÁ½ÒÀÈap\vÁÖtLD¢»ÆZÞ/ðÂui  ¸LkâÙ>1O¸øG$Ø¡l›óÀ€Àºè®KOä÷Ùáœ6îØ]€›Ü¿ ÌdÅõËVM¡9Ý~äNè¤/̱¸3›æ‡>©¬+9œXá0ÇPöì ‰ìˆrŽã†,_áMH¬-¤p(¾£‘Dz óâ{{¤i°é ø@|O§Ý3WÏvŒ°Q>i‘ÚŒYom!0Ååa,+›-nL‚ÑK“X¬ Žñà2ÇJl¨ØPP!Š;Â_ÀšÞ’)‘~~4/èꢼC·qy;šT¼î-E•ˆH—ÚMÉx€” ìNHòf[:`%g˜”FâñÖÕ²*x%ÙFBñ0$+|iÉù¬´Y$Lzõ³ò|\å+ŸÑ’Ãðø@rY±›‹¬cÞ ”RÂݤ“z~½¹ôᵨP A$H¼”ÃTDõö\×VdTS^ãâ/›²ŠåZ¹º½vAŸ²LÍj¥XÚ"Ö ªn ù“K×›Eư/JÚ§ðûƒž MGE¿ÈçÊ'(º8ËùÔú,äÿ‹½ 7:@ª&HéÒ”¡_æÔØU£*_»ÚÂÅĸ¸ùÚÅENDòìH€WiJÉ.¬šŽc/xâ(+í¹¢®Êæu¥íGË'(•\¥BDɽLFR²ºÆ¸xÕ“u^å_Kæ¨A0áÈŸ(©yó¼9¢×Z.×Ôm¢-XÕù»ÙÏAt óZبM‘›¯"[® ˜||Ö£\Yƒ²bÙ¯S¤‹žåV4wuVîˆ0 y@=_-Q4ˆç\QæšøüJj[úÚÞü#¬Ú¬jª¬Èx#:6eûåFº`ÞÕ²r–š¡ö’”›ˆ°L©[œš€¦÷Û/PðE”<,ô0 §¡~½I˾âW~'z{%ƒHî^¯n}³äǪcê gƒòKóöd }µy¯ß26Ëž˜õ^ê*ʶ5”˜¾TÔü/ŠžX¶Ü&•V(D6V7£Qrl­@¼©•ýŽ«ºŠµ{ŠˆT¢»1ÚO í–dòDÇ­4òMjÑ—ÂMNZ£‰ŸUÌP#”»æ“´„5g–jPËY¬íåéQYXŽÁ¢yçæ7kqkø endstream endobj 48 0 obj 1064 endobj 50 0 obj <> stream xœí]Ûnìº }ÏWÌs¦–dùH&IŸO ?Ð Ptèyéï×K”Ì%švf’IvȆ%[¢Hjñ"ÚÓþw÷ßCsø}so±Óß~ ûû᯿;üçÔþýöÏ»Ç×;?Þw‡¾¯;üáÅŒ¿o¯ÿ8übͯÿº{~½û•=2˜0f呦;=.›Ðù‹Œ¹bKãç–æÞ§–ã©e¼·©¡ç·‡I×3iýDylpq Ó$RVhÓ(ãÜb‰Ú ý|3Ì·ø{—n±|nóÂèç×m”†xXÞ`Ýò:ò¬"ßÝ÷‡nlfÙØƒifaöÒ]›oÒí¦9Ýæ™/{^B€èHˆQ{І™+v"o±¦.Ï“²9Z“fIŠa}lplÐ¥ü *XÿÌ––¦´Ã²Ÿ 46q†ž?2CŽë$EÑv¤•ê’lÒþ‘-‹1}3ËÓ´Ä9ÓÇÛò0œÿ|æ#éen[NmŸâò‹-4üGê„™`Gû")pßïÚ”¸;Œ3‰ø5Úå¤öÍq…i¹Ïœ}ˆ\êé‚–su ²®I€aê2Çg ÎÎ4Ú GŽ3¨îÇ8ô°²OŸyÑTÎÐFäZ :‡ÚãÖ9Çt™H¨\L–*Ö$–ÄxW\6gekîg”³$¤QXêYZ·«›™­ø™O¬Ù‰Š‚¦ÀòH¬@mñ6ŠÒxh‘2AÚ2Çdë -…ï’{fú»,Á>3²2¡Õ܇ÖMwÕ°1®M„S?ð¸Ëà@ölíÇé_´KÜãB&?,¦QvþçÒŠvmð±€à0ºsÛ‹ÓòåO›)úÉVc×&ÉÚ<0W Õiy5dÙ ùŠ—ÛØOÙ¼ >U’…õ°QÝ!û ©/pÓÓ¿É€n7À5sÒöZU7šio#?Ƭj‚‡Ì0im’èªÚN”TðQÔ¶ Qõâb…Ó¸§!•Ȫ…eäèµ]ô ’¢Û#F˜¢¹(7Ã1à mTÑdˆÁƒ åëžà!?A!vÌ $‹æ‰óؤÄŠgy÷Û„OEJ¤M›É˜5pûðÌYzäbëcm™Nôn‹™;il€™‡Å~ƒiŒÔ<¶÷™”¤!IÒMgÚ&"D |±œ\³“Áãd8Š7OI÷†º8'òŒÊqÇVÔÁ#‰»i„íÃf©:F‘Š®/¢Àé¼Ë“8Š0îüå<ÇMã—ÄÒ Þ‡Ò1ˆIDÇe£©é Y-‘¤Š`[9%ׄ‘j¡¡Œi“ ȉ¼1š.Slü ÈÓ6¶Xï#c“9qÑ“¾ÏöÃÙH¤é‹ðʤœm/q„o âáÚ–7ì'Ú–{7‡ëÌznÉíNóP|>tÜš¯KŠEæ5Ì?šÕpCƒ3 æ«xjùÄ䇌Kõ`YvÄ1•âš{Ûõc{0ãC¸×û㮌‰Õ܀„›UAõM¦òÒvÍDî×ã%Û©¨‚)8n¶È‚p§:™‹ Âõ]–íÇ "A ÅáçqB Õ'•%HØ©Èm¿W‘Åì#ÚZÛñäN×fÝ(¤h›°Ä÷—‘Ý+£RûW²" Í«çß°EÀSU|èvjóºÃ‡.žÈ>4·ÁÜ›RRbàÏbôÀ™Œñ»–Ùd¼„Ÿ)G uxÿ‰É†G|Ε8im)ÖEï8ö`P´½`¼«>tö³_ Å“ÙV`¬=« E²Ø†ÒØ*êÆ]ÊZ¸ª§ÓµŒžësË⼟!û ›«l4ÙŒCÎÿ;%gôn\^Ž]K(¼Ç9 ¼«…‘ÿÚÁŒì€2…\ßVÜ”Èlëñk f®fú6=(yAÂwø|ø¬*ŸžÐðE=Ûç ˜Þ¾‘=þê‰2`Om¤æ¥›ÁæcRùY=Ý«|uKóÖŠþ®óÝIý±œFT¥ÓÙ¥ëÂ1¯;Î.‹'r"g®±j8DGkkÔ:AÜdÞj ì÷Ÿ/ÕÐP¦’`ÁlúÎAñÂó“ÎjMÈÛw¶ìøîyƒtG:Y:üûa„JìS«Ï/ŒoVÂýAJUuÀM/UšIßâ.PÑÿö˜çBáÇÖŸ³mÈJ%PõíJèâ%x“±òʈó6½ÖcÈ8?q ‡¼èCB âû¹OŸlÌÚ—3pQkÊêù·`‘”ô;ÁCœ8‘Ì”“f–gaUx®°»lŒ•:½à)8^^;ÉebµÙš¾ˆ@{ÂFõfxQû}‹€® ¤È“¤YˆA]l %Š#5{œþÅO± ê’ +,D”{‘ͱæ1ýë!=ö§/Å…/ïÚ&(Yú™yEþÓ-mþÃWå~ÂWZ/ÿ}øËÌËÔk|Gî,¯ìÐ/zËë“šç ½åõ4o³ì×Ýd—}"+]&²|î„äþE‘–û D\î_4yÅüsCþy§«‚ºØi¡ÞòšH£Þòš£ÞòšÈÊóÎסš¦àÚ|YЕú#!¹Ñ@¤åþE—û D^1ÿ©ÁŒáH0‘7_eêRïLKî-¯i¹·¼N„åÞò:‘UÌ;_wc˜žÈš/ ºR$$÷/ˆ´Ü¿h ârÿ¢È+æŸÚðF"ïtUP{#-Ô[^iÔ[^aÔ[^YyÞùÚšû¡àÚ|YЕú#!¹Ñ@¤åþE—û D^1ÿ©a K°vº"T‹}3!ÔU\&ª¨¯¸LQ_q™¨YN—I¥É`ç‹%Ì(tºZ L†‚ÓÅr«;ñDÀb§åípºXª{¡§«…¶e•(–µ4n (¯ã¢Nëø mÒõ}¢)kÖ‘.¦…kÖfò5Ô]‡> }Ö!@Û…y,?-\3£ëÖL3'먮Áê:ºið’w÷Âþ§…Kþó¸¡^šqn'™ƒµ4g`/˜=áÀ½„uŽ› W‹…ÏHºÄýYK2û“g-ùŽÌ›²!÷ÜY´ÐʆÜ_phÑ’ïÈ<*ræÒìfoü5½!„5v1~ b,EN:t,¶JqÅ1LxTD bc›i©‘AQ/;{(¢r¿ £‘?~Ñ„À¤6IŒŠŠŒí[k `‹³ŽÑѯç‹ï—‹‡÷jß{°V ÿô‹&%¾2@ãõ#§­&”ô¢ðË‹üz§q£0ÍJz£ éKÛ7)½‘Ië9ßEAPj‰Òšøk”„œ­õ>UqûÃ0Ó‘¢wÊñăMÙíüÎÁL¦KéËbÎ÷\ÑÀéÀYfŽå_Â1";€,Ï—ŸÎ‚TY'Nú¬-Íòii v\VKmùΩˆ)&ŒŠ_äü"uÉIj~§4îÁb-O±øRy±Þä÷ÄTM¦eËçiñ½4†\>f‡ðý²ëñŒ/Ÿ ¥ÛÌf³uù aq°–Þ¥¢%Ä(Úœ!ø×g¢•–´ê´Ð k*Ìö•'ZÈä¶»±¸$ì%®7—’·ü[&¶ãa`Aä/x4‚r·ì %a;ŒžH¡ËʈŽ]¤ƒË?þSñûm#çX²GÎDn§Ð’ñóȘŒåÊïDÃ5»Î$ßˆÜ ®—éóÃÅo¥€çÓ¼4±¸&ÝóÀ׋‰¥xhé¥Õ‘f žOÛIÓ‚£”¢¿ÀÏ&ŠŠÝdóÇ@=’k¸tKÏj)pcOÒOg=£4,L¼wDXŽĵ¸úBwBRRÏ Cx(«)Ú¾«3y‡õ¸êr/ ´ HäÇÊ,_P”í0ÔQH¶ÀQúÖ¦ª»O/ýÏ" É8¥ …¶oÒÇû Ë>Ie_òõºdÚ êL+FZ û›A,;Ë£‰NHÓó¥ —:0BÓ/Р/ '`)ÉkxÆfÅÀÕÁ¢ß"zv;üÑÕy¿%só[¶ú-E²@dstd®ÅæoåÈ\É7GæRŽ ŠRsdÌ8Ü™ÏéÈTöåudÌàÒ ÑëÈ`ú‰¯ RÀ®Áé °ƒO˘ÆŒME”7ÏçòžÏÕØü<Ÿë3ùæù\Èó©ˆRõ|úöËœ~¹|ŒçSÛ—_Õóñã÷ò|<[ËOäù (ožÏ;x>×bó·ò|®Îä›çs)ÏE©z>¾¹y>ŸÓó©ì˯êù8Ÿ>2Bz …ÐGÍlceo'E/âŵÜÿBvYœ•#´ô]$¶£F88dP~‹.xW¢sIZ™ô‰$-8—5G¨ Éâšd]°ä¥A8fCE3Hʹ=g©—ä„.-€–¯«ì";>È/ì£"X}»ÃAÓK%=•P'Z€£ŽëÉ"[‰E8†Šü4‹ß<=„|eÙe½–üLÛ&‚â!RÃÛrYg#Ìî$ñ½udi@W;­n¶‚‡P9ÛÆß(“À¯áT¢Õâ†P©y5§ ú¶wèö•@1³¦ +.²M·|ù`ÓŜʊMŸÊþfľ—»–üTF ™øF g¹†kì'3bᵋɒÅ/2Yú"Sö¥¶âÝãô2r¦kå+†á ØÊ4éƒ[™ã⬦ _Y«‘šp›½¿ÝªšaN¿™U#Ë2²bCü<ÔÿúêJ endstream endobj 51 0 obj 4712 endobj 53 0 obj <> stream xœí]ÉŽ$¹ ½÷WäÙ€ËZcjKŸÇ.À?à0\f.þ}Ç"Q >1¤Èʬ¬ötº1’BER$E2%uúï·_Nêô{õ O6Ó¿ý8ÿûëßOýÝé?ß~>ÍÍUCh×Ê=xjW§ù¿?ÿ)üϯÿüæ•~èN½õöô~òn|p>ÿ}úË7ß=ôÔª½}ÈóòûÉ ý¦5/¿Ÿìæ™[óò4¯Ú¶†²êfhX±Áò©=’Ú7ZjßTp©}SAàeó/Ý`xk)A[WXRk^Ž ¥Ö¼K­y9‚•Í»–'ê>3”‰šÔIÍ› -µo*¸Ô¾© ðøôø à´µ°¥wFŽ4Ζ M 3ìÓ#â@36-|´Ö>Í6€iaÁ}Nˆ˜×ùî‰C Ü˸ØhËdqèÀS9çoY,— I d“ojÒ4ý*ÃD÷ˉd×ÓÛ·ÁÏ+1öÁœÞþvúÃÙMïôöÓOFýñôö¯oýÔSÍM?©n©è¦ïCE¿~Šúi)úIr† :P…^*^ß¾ýÌ 0Ób| ý‰Ó˜8ª‹`ø ÌÂ$V (¥IÔ9¬ÕÄA^ØZõŠ ÷ÐslÐòíž·ë0°]HPgŒDDZÑslÔ¨ÄÈVïÌS"ÊãÒg@|y_/â4v¦QV죦­y굞&d õï"!ƈÃu5ZUÉ_‚dœEÒØMKXñ§a…ðü¼TØ„¢×PÑm)a ¨P+ù5Q»øðŰ] ±ÇÀ 8N¬>)ÌqV‘/©Ê°Qt3qAš_ÀÄÆ$[¾¼8­y _šÖK¤Õ®›.ÑVܹ+7 ÝÄ[nxåÜpæhçt0gNºˆR/Q Ô¨„/ C=1*hÃ+4£N`_~Xy  êW6¬éø|X yN*í%Œá ðÏá #¡ÇàkÑcYe Qƒ×I]LoDj†q>Ý‹#ªF] ÁÑ‹ÂgÁÅÁZzûX³Û«d… n>ë ñPVƒP *¯„YGá½yd«B,g;-2L€å¡])gh?¸U‹ÂOq(QoqUheä,Rº7Ñàøj:Û [ #€œ‡½Ó®åVdt¶B ”`°ù¶l‚VB•q]Q;Ù-M Jªê ©üÉŠÛÔHUz¡l:ÐÆ:uÏ–r¨«2R&CÐw'ÃQÕ¢ö\Õ³€óºñ\ÑwG¡„¶š3•Õpóe׃‚~dâš,¨lOžÃjFQZ‚îÃÛaY×wÓJ Ø”Å^ €›ÑøÝÀ0†s#³TnI &Ÿhˆ³E•(&¡¿J1;»¾йzÖ/@?:ÁÜ/(*РŒ³Ð`Æ¡ì¨ L£f`–Ö²„H´M ¤Íº–àŒC®KóÉkufaRÃך}!B1ñ¤.BaŸø´.Ì™ÁŠÎÓ±_‚›8¨óa †b“±\8鬎c@GÎ¥ åJbì€ÏK¶òÚžüË€Ã@ë({d]úÀVš6l¨¤’±>ÓQðÇ!€n8èf4c@¢Ñ ܱMÆ%kˆÇ›Ù¶Æx|·¥vVMóýg}?y?»–(:u¯æèkjÝT¼Ÿ¬òs¬*µo*ÞOùTss(w3µ×©µÅëÍq.jÞT¤É©}SA“Ss(›q¶­ë^JiÝ¡1ÎD­›Š45µo*hj6x\vš ž}ÈÐm}J205§‡õ 8ËÖ¡s¤ÅþN·§Îǹ7Ï8ZiäC‘ËÑN=û‡pŽcyªFÄx¤™òYͨYcáZeÞ¼8&Œ:J€°Èfè Â4¤M3\1vê°®+NâF¸Œ¨)ˆg¡Ælg¾Jltfhïu=Ðs"ZÓS| Ñç:HpÈ—oLˆsˆHw³~~;âMdN^Cˆœ{Y޾ɶ$7a1\ùÌ—ÊÇ0`W%„ú B3žË¼ëœ°ØEtJ‹ÑHXx­H°àaµ‚ë[dkcÎ^`'#~!º§ˆí4½âã!¡>;.©ñËixaÙÇcÆyݮÃÌiÁk‘|±UÏ~î¼uSñ~ÊÇZ±×r§Ö¤äyìPJ>œØ‡¢æMMÍky^¨Ïe‚œÚÃhYû¶&NÀ à³Ñ/Ù— +Î7,-ƒ¤Ëñû——¾ELêI˜c}»®œÆ‰ä4ü!J7N=)ú‘ŽÞK§ƒ4d3_÷±0µ¹á-éÑÚÏyV‡µÙ PÏ ö|®ÎÃѯO‚‰`ñ$ä›úw–g §ð;ð[ñI˜×ªJi9·žw²£ ’¾û‡|æ_l稸~œW[Sñ«8~Ж†ã]{ìMξ#1ºXJÑ ¶}íü»@à'‘ Š8òAy¸Ï/0ìgÆØ…ý€˜¯ýXeÄ¥‰~l9ñ bÌ@ñh&Ãq\¿%þ.…”±É(3”ô“ÃkàR”r窄1æ>c?8ä8ä‚TïºÌr{›å¦ŸÇþಛé±úï窖RºäN¥®+Õ9øFùˆ±ó³½•ƒÔ)õÙRªá¤x\GâSåŽÕ:d9»w‹ƒ” hˆƒˆžš…ïKƒ~á8ˆe×Ü7ÙÕTXƒVSa•çKûnrcKìíU´â]äðƒû싸Y?—¸uÎâ+ ª¢ ¨0 iR˜3Ôó¬¾lHãËC²(ÌŽ¿rÁ€%+Õ°[<’×4¡;pƒd$eÔ.î“.­ˆý|U3bM½B¬Oñà¼Oü6°eX<çûlÜ0»ŸØK]Âj˜[3ùªaRòêÊPð.°V\‰‰q zñÅHËíøbS2@ôãfA÷V$Š£~…!ËbH"Î22’• ßhpb‹XžXÕ%¡î¥Éi=02çoªöÍ…ƒ°¸!…0žB§^^’™þL‹Z«õ˜¡'|ªuÒ^̈â(edƒ­RG' | Š…’%—ì?‚Õ(Ù‚²ºÜöû¨ÙR”ÕóF. Þš¬Vc¼'u©ªT³/œøõÅÖ„!ÚŽÐÃic2/®¤"°e¢ {C#{f,‘5†µ&¸£ñÆ~Vo“81ft*:x²Ä¦h’ÌÝéÃéoHËH?`¢óY« CÔèAá›7BßI(þ,Yüìò€ÒG õ8ˆíÈìà/°H#RÛÙpÂÙJ}26L°?´hbâÆ=‹2Ie‘´/Åfo²?,Åj6i]¨•N¯²DÓð=t‰–«sÍUl OQ8è%¦ö l é;JV! –Vý!çç°´ÌÆ/ )Ñ2ùu lI½É–¥RÒ%DÓ]Fé2§ÕuÞPƼ!;Ϊ¢L¨ˆ‘ÁãÁ5iZîU.8JÒÅNå 4‹³ŽF‡Ík’úú5Ò S9š\7舨&4жâíÙAÚU>¬§4A4þR>mXNm­Ò”«žÜ†€k ä$„gå•Üòiɾºäfo“³ÝŽÁêÆÙ=W¦5lè'˜×4rÃ¥é<Ìiq,z4ŠHÂM÷îmÓ¿»6‡KÌK>À™FjCìS?×VÚ¤Ö†P:E’˜ò[’`ïÈVDÊ3’¢["ßߟÙ6™ðë/9wÍÍÑ‘’D­ a5¢§¡bWÕÑWKë¼UÖÈ‚—É‹R÷ØË¿sˆ6‘ìVÏ«$® `.h_& Еéš=ûçʺ暿+hÖ5Ç{چƚ·ÌÇSÍÐήgÖÿ¦ý(Å þº!5^1T=;ÍK2µ"†õ8Ä»ñSˆL»ãÕô‰úñ@îÝ%©ïö5tëlźs‹+ŸéwMî-Õ¡YÞ Ó Ô‹7ÌÚ»ÏÜ.æîÄÈ*‘ºäPùÈÏF@•0̲­ÊнÛð®’¹š¦Gô×·dænX/;–§úÏæ®S¼.×/OµèÞ„ËUgCm-Ñ­°±QO¢65¥ÒûÉLöÏÚòòûÉúùñÓÔš—ßOÎÏ‘ZóòPÞÐZvv½Iv†WS9]ÂK,P¦Ö¬HP§ÖMÁÚ7yjßTìlk…ŽÏ0­°ëü9¤Ô¼€Jm©DpS[^&¨©5/ÌÔš— âÑRž˜Ézb޵DÌgSS*EpS[^Žà¦Ö¼ÁM­y9‚Ë¢µ$耓×–i2º¥arF75~’)ÐáØæ0-\¸OmB¦c[Ë´pð>¯)Û˜¦…û÷9éòÇ–vÛYŒO·\œÆ^eZ¶ë6LœI<’ÙÄyµÓÄÇ®–žã “"Œ®_ùráêåÌñ4os±›+KÏêyžƒ!Þr —›—í«“•‡oVÅ[U$Àäåš^ÏlWXî5ïfC 4 <Ù÷Y×ï}ŽIkÍH–aïü(JCpc¸ãp1ÛÎÓm;×±,7¹É3Ãcâ5­JΆvJ˜fçXªºEŽ 1±.l×ïDÇç×îØÖÖÆ§Éw–UßLjx7®4†.p‡ÿB>·ë%f[X ¼Oá…lp¿“ oM…{âø}bÒC9{·–]psLË»dKÃ<4Š«áÝXxŒ)>>=Jô‡ëãL4È÷´! à­e¸\´ý‰"£ç»¹švħ¼N o³×_–®_¹‡äæ6<ûtœ¥=SRwÝœaûuÈ ©Ð¡P¤þ:¿Xay,E¹øàŽ·Tù²Ô…K£ ëpuµÈÚ.¹„ 9m Åë e§EHÝB¹Œ<¶áöo>,\׋ʳn)‰gРόZ ïuÀ¶uS—Í«{qÀæ𽇸8‘P¤¹bz*{DU6° ²öÎrKk&ájO‚7œèÁÌáooíX[ËÛ¢yts¥öÀ¥cæ$‹^³—Lƒq¾€¸0ŽîLö+ú¢å4G×J F³†ûÚªœ1»YË`V¨Ñ»ÿýPû0 endstream endobj 54 0 obj 5035 endobj 56 0 obj <> stream xœí]ÙŽ%· }ﯸÏÒ.-µF€é-ÏNÈd‚Lû%¿Ÿª{%JÅ#UËí†Û¾µHI‘G$¥j.ÿ{øõÒ\þØ<šKgìô·ç¿¿ýãò·?\þûðËe¾ÝùñцûC—Ýn.ó?ùsøŸßþõÐ6î±½ô®}t—¯—¶m¦o¿þsùëCÛ=ötÓ˜&»•~}½XÓP#ó½ü÷׋kÇÇ!»›ÿþzñ­Ÿþ›îæ¿'‚2ò®Ý~7Ý£o½†~Gг®T¦»ÙO¢:Ý]\ ºÓýÅ¢<Ý_\ Ú3Ú®ºÁ>f´ß~&Òãí™Ôt/ýŠt§{ùïHuº›ÿŽ4§»ùïHqFÑí÷¤M®%í?I=èö•Æt3ûI4§»‹ Duº¿¸@t§û‹ D9'-Ž+£Ôúöc©A™S;¹Ö[M¹dñE¾x6UlN®Ë>1Õ³™fkz]u’D<›¨¶f6¬k^§Ïçyl\˜Jlªâ.Õ:5~Óãl.µ:3‚d³®ó ô:u}³À¢þõB¦÷éý¡s㥷njáýï—ŸÞüeRŽ÷^~¶ÍŸ.ïÿ~è§7›ùÖÏMw½Ð=vñB{"ü4Oןí$¢p¡ /ÐæzáõýáF…1s?w&cX’áéBã®Ü$œÛûbìõ’™¤¯}¹]ièŠaòpmofÅ, ×¼2žÙH}¤­iK½:qƒ™H)uÒ¼žÆ‘4/œô&°Hœ[r]erHP?Më2¡Ösnôœ{¢‰OŒÒP‚‚iÍLBQ,7áȱV䨋Øo„n‚"–Þ™&û¤1ÆL2ÒzÆiÚyb ª²¤%JÆÙ’3¦»Ò^†íO¡›¸µi’¬†0Íhæºð›ªÙµKá¹ÔK¼@Cñ¬[ûÄ»µáB”]cØA…ÑÃìpôFÔY!oXÇøEì‰dÙW®RœÎ ìEƒjË„ÚgÖ­{eÝωÅ#§ã•?•¿“ž³?{â%t;Нte”É«\E·üÛ‡~Fì§“Zñ+ŽìÊwwóš9›­8˜Q|¾øß[q´ ¨‘?cåji{Ì…I>XUÉÕ™y®VÙ Ð;ÈÚ€!8œ>(ÚoVÖ<‘KH‹¬ïEÒ@áAÞ@ü3S`‘>pòÞu•pHg§?Mh4ÄDÛ8Ù6!`›x/88Ã^±}0½C2½£Œ‘f\²ç\ñÀ»£á‰Ö«mÚ²×ðœxâ{Ïu¤—˜è8›¨2´¢î&;Kl¶‰š|åcýÌÁ„“Ùsu彸í®Ðgrý¢$ëܨMÚˆ*6A_m:÷‘À¦ïçhïS£±u_—oÀ²pÐ×W®\ö½BòhEEàC‡°Jè¦ûLÇu]óÆÅh· -…‡2Öª1P?°Ö÷Œµ>K¾+¬U°³wÀZØËç`-nÝ>i]sŽ8cìM‹_J4´ X¼± Áÿ¦QydOˆîvð³ î‰wêC½Ê뱟Y Mú6´ÀÀ åF ‹ÏÁÀFV`FVË.@£Àœ Î NÆà:ï”ÐLDì¤NÃlN±çE§à=aª ·†ÑaG;í°&yNŒµn ؘÝåšØºZ±ºIÃŒ4³qßÄpê¤^èˆl%Ipˆi‰>Én I7¼½É…fâóôTß4K.’,Ádô¡]“º Ý7Üâ÷éBˤ×<¯ò¸ümà–ÚO¡ç©Ò«¸@ ­qœá>2¦gÚh‚l&¨x š’ fö•Æà‚~1MÊRHc ÐH7‘hÚÔwÆ`ÞÛ•¶Ú0Ôv)šÑFuR Їµ‘8›øÙ•óÂyé7³ÿʉ±kg uf8Í6µýÌe>,æ “uVÒªúICœãã†AêR%ý0ë¶+ª8j#ÂW–ÚÒxuPT—‘xm:‰(°1<3±Rè›É IU7¼"NfTçðµ'3„#d%áÒÕ§ )( Çí/ÙZ7Lí :½Úæ~6JËW€ŒÜp8ΠȰÏIò“QxŽí¶’¤@õY¦Êa]A?Q¬2 ÛmMœÉôø«J¾|Aô©]y8“û2ë®kz¥«VÆóï¨\OPŒ­’l^Ù(ÐmkMrtež"K¨¶Â¥íK.‹yU{¹¾ÖÂR•AòŽyÇ¡›#ɨ*IMú•ò7£®’½ÕLt×L—¯èàd£;,ŠÓx;X#Ò¼bWeïæ–È}îñ èËJ‚:~q  v\lfò/sd£bÔÃÆ÷¶z€&‹¬¦ì|¸ŸúÕ ZpuÝJÖzÔLYU°·¸&±ÜBer9mе®q͉¯:ômùºR·ü Yûâ+#[N­ò}« òMµ;Ë  Ý48*šfÓ+ç%[ˆÆ9tOFzäO0iE€`lÅIÝÁa—œA1Ií’s%_ÛÎËn4¬štsJ•½²Ôb°È¾}Ðqt]€'¤No0é>aM±Ùó5&B•£¡Ñµh¹:ÂÐèKè…eïW“&²5q)Å7iúÖ/ZËÍFLó§H–’7Œã8¦˜²bÕ°©]ÛGç;@}x¢:ZÈúÁÅ"cËêŸS)Ê «#qöNJ‹VMá„Öz‡x:Òí¬u4ãz•Üš(›øÎ+Ó‰ Ã."ë—Â’—è+…MÚÁ‚+ôRX€˜aVáféÕíH§dùuQKõˆˆŽ˜vÄ—+µ™w5¡Î®ýÅÜ6Áù~ο}øéͰí=·+sŸCöÍdvÀ4¦!îdÆåò­Í7ÑŒâ@O%4Jæ%“ž ¢$rEΚ~Æ=1K“-†…HɶõŠdÄýÂõÕV5\_mdFßóŽzN™ÈЋ†}d ’§wÇQ@¼C©¶šêVj¹äî–Ù©FÏvz'³zirG£Í*€²åñ“‹FÛ•é„<˜RŽã»&–…§p—¼i1’ÎÇ×—ÃhâìºMUÐXÅÿr\¬™IëŽ@œñ+æ Â\Ý-%AÌ–%œÉùš´èj<`ú‚ÞæyàVh)¦%cý\'S’&°Çµáx”g7RvyÅf_…ˆh¤qU!†encþ¤Ý«†îø úp-„eæGÐIBÕM2ÎZŽ`ÕL?wLÓÄ£êSSŸe3(Š­Þbï@è&éwq;°Y›¢9öD¼ÎX6È®¥°Åµ›ÑÚ-, Ö¸ÔÚ6Ñ­ïX=mLò«v§-l˪ª*# cи2>,›³5,·õdU_ˆeqÈÖO)Ó[Š >à¿'ÂWw°†Z…«>¦Ðöðià)Ç™õ!Áâ: n~­áœ )™6ÍvsÅ{EåbòFße“y! ªG½‹`[ŒF\”‹ÄTø·cz"Öê!(Só݇k³Y=a„BÑI) ]ª\§â™Å ßÜ~Y$„ï¤';Lj4­(ȦìS’\KÛ³Ó…¸œl¯‡ M¦be[0µ[¼ë96D-ON;“¾o‰"ÚSšõ;Se²­zQ«%ZKÕê|u¹ Êx°AuŸN+Ý!lr,h]”‚(Y%^¢™ |½]`Õ¥ïb… nfÒÌÍÖ[Žf§È}k~Åx)ûPDªsIyÉ j6Ô¶ÿÝ%bU±‹·û=wªŽŒªH3Oݶ&*¼¼mm_Àh%QN!£ÚÄm!#q—$6sg¿‰²%M殉÷p޼Íë…³#îã qzîm˜ó¤¥FÃX³¶.LzÛÿ³-,1!Erü‰e6)hŸ‡ÅÒM¼‹P›ÁrJcÒpäù¢¬Ë {^NwFtbcÙb–)³+_(˜¥g‡&A”$g1ñ¹~U¹qL÷ñ]&“í3á’2Ääd¼0;n¶:òŠD·Wy©!ëxW|S”ícbtà­¶eòW3²lÏf!#›¯RFV>I³ãÜå«cxBI¨ÚÎbµØñM]Ïatì4ÏÌ›ü›¾…‰Ã“‚.¸€Š# (¹k6•õLó ›v%JËé ÁÚ±#v>G1¥µ›÷ŒÜW' .¾à)ó?P®mÇ9 ×l3€½a¥ z¥”k—Ì©ÎýÈöŒ‡¡H&®\Ú; ¯d{•¥ mñX—ŠS’Ji‹ó %„¡Å]ž1ÑÒÎ+ £Œqƒ;šµ`ÏÉpú¯BŒÏzÐc}a¿…!³ù+*•sPd~à•M< feS•äyä^`9W,ö,³# ‡úf(Z2¬,W°‘8Ç>bÛ|ÔБÂñlräóƒÓ¿7[á²*n=vHM4Yׯ_–l–fæ,sÊ~za™²âî¤*Fq^TUd§Cå”1”ñ%½á1áC<±)ËFæ„U K»‚Râ Mþ' –`¨;×ve¬¾Ôª¨"ݯÎ1œ|÷¾y¹VîÔåñÒooüylù¼© ¢ý!¶=%° cÏÃDZà¬hÔÛù[ %«®9‚f„½8ŸtK©²^ÙW³xÔ¤_P*÷ŸoYf¼›/œk w©¤U l>Ù¸˜vζa¬ñMœÒ§P¦öL˜Ï6}åczš–æô¢žÉ4„à;u“ò‘¶Yfò¥ôOê-~^®“èwÖ7ñÛ$M†±;‚ÏLü°:Ú鉰ÂZ‰´+Qø´/Z)Ű™qP\±¡®P¾ÿM›ŒaÉû=ìÃñú.ë­ÉCfs†xÏ] 9C‹bqÎ+:áÐPð)‹ÿ=1‹m‡êk»âi{”?ÉZðD‚Ï"={\ýŽCžvœY¡¤dt °ôèxeMö!%Î+_¹ã0‹v}®\(iÍ®wÏà¨võ @øÉU¿»[Áþš”væ7«²c!ŠË°–é&Ã¾ç– öÉÙ¸ÔJ †­Q`ßÎÈ.tïfµ[7ƒ+ZÁ¹•\•CýÞÖ3ŽÄJå}ªkøÝEKÃÛ.;­‘ïË ¿ÍV^pRÈz–é\½"ì ¡á©'€-õü: F)/Nç§­œÉ¸®/»ÆC™ÃéĹ:¤`ÃÎÎ’£Æ‡7ôí8Á 7Ig0ìN%mƳgÀJIÝґƸŸJ<«xKú”°naŸíncJPï*,  CÕúøªh+[ó¨îxß¼xÂ(&pC‚EÉ€¨Ã¯pYw?CwÇ'Õ¯.AåŽvÖ™¾Eð­Ç£úøv/ø׊·‚Q¡¶ªP¼`> '"aäYgç¥T\Á²ðA¸ÐnáHT‡UØLÔbúOÝ•¾¶`:¶ñî̢ϒ‡)|Ó b'©lsý¼f*]mëFü´ÄÊT‘‡8U²P!VÂiÇÃÝõ0è G©ân4Àì8+O7®R„é®Ö¸â;š…ƒ1Õ¼ºVŠ8  Ãh(¨vQeuK¦«"±ª®Ò·î2×Oª¿ÿ@[û¾´¥Ÿ°´õ4´ž<[AÒH…ÈŸb ŸBz*_‚t)_@#, 2M*‚ý¢ “T²ðÍ™­' «›+¢ì@·†va>\ÙªRQ+C·œžºŠ×Dck­`m5˜e@fÇ"¯*¹ÝÒÞÓû×ëêóþì+Ay<¿‡®Ï¦ýÞ%Rälúl‡¼¯[q5ßP££à÷/E†í9•äö«ÕN²‚iü¯!©§ÕÝHÐ `WE-«v.ßö­óOý¯Óbíú¼¾d†Ë=xðÒg. ÅŸ°ç+;ÅGÄú…‚IÓú§pIÔ]÷Ì•Bu\§DÛï¢XrVªôI’ÚHýÚñâñ 5±zy®—ªûAõ¤ —ê‚XŸOmË9&zÁNåiKâÇsÇ Ñ…ƒ2^‚§cåÁY>hëänÆfz¬ÐM8ü!;°@¬N4ÍÌÉ©‘=ìðz¯Þ\q(‘eYáµ_.ÿ`¥, endstream endobj 57 0 obj 5013 endobj 59 0 obj <> stream xœí][oå¸ ~ϯ8ÏšÚòXHf’}Þíý½E§@÷¥¿¶E‘?Ór2“øäììÁH´¥O$Å‹¤#W—ÿÝý÷R]þXÝ×—¾óßaZþþö÷Ë_ÿpùÏJ\þÿíŸw_îºþ~¸ ¡¿|ùÛåOÏáRW—/ÿ¸ü†?_¾üën¸oæ'gÒOU½V4sCTÑÖŸÖªº¾ï©®Žoõ÷]ª׊6½éíý˜è± ~¿¥núûôJýDýªÝZÑ Ú>¨ŸYm:âŠf¢fz¯£º«šØL`.Ìu±·IÞˇ!ãžÌ˜kædàa‡ØêÈÝ@3©_QcXGð»ûÉãT=Q/Czâ3µÁz¤—‹_š óóbu=qëUKj 1ܦ…° Ufƒiµ£¡'&µUËy“CÏÁãvÕÇFª˜W‚žvT³å1¤*ÖçÁ•>L¾g;"ËÜ0É ÿl’!ëå3L¢2/q|ö•™)Ÿ­`Ë3 ×–_xúr÷‹µ“a±§h(©Å­7VËZ·³¨mȺ֊kfâlûúa­J_žh~¦14ôfªh«0Ñ{õÈúÌžY‘ÞKšÐVcžÕ iÛÒÖë/LË›¡‘ÐlØÂoŒì\ÕýæQMń޵›û‘©˜¦4¸–o™Š ÞŽ§³ÐŽ{Ê]îÎpFÏL)zqªe‰5+ŸÍèe' wc&¶ašÛÙšŠ¥Ù[…ùoyöÎû¿„fæÌ—¨uƒóœ™¹ÌóGš;¡æúðÉÌW˜ÀÀ³óI¼cH@óvž®ŸiZžÕÆlùFOƒPé¾õ/™ŠE}ñÜqo[0¾À§ v5ZmBY迬âiµö¦ÐkW±|÷¡–½À¬ƒoB]O~<{…Õ­Ú&Û¢»C)›B2¸[Æb¨c±1ó Æ¢ŸêìègwÝÆy³¥ýðé>ã6Jvf+5:4õ@7ïàq6f8¦‡;ÒAòª9óÉxóD|V‰4æ0ùL7&Ý5Ôr„þ +{ªÓöà—Ë2»ÃÐÏ8. 4ÓâGÒJœù¿þ|Ç&`û,¬¾ïf^½tÝœÇwTü÷å/dˆZwͽ&êò×¹×™ÕšœU|½4C3BȺ<÷¬p¬Çò‡„‹J VÇTÂÁT]\LÎ*“u™qIÏk¹›á•W¢FBÕeÆ%ä¬"á².'\ªçXî—g×ZR¸ˆJ8˜ªË‚‹ÉYãb².3.é9–›é~R ‹E…,Ñ ŠÐ³ 'ä5 OÈ* B+ê^àÍÿVØV á Š”‘T‘ÁIJ #õ´–Ú)(­Š%Á‘¨±o¡ê2£rV‘ Y—*Õs,÷ãlI×ZR¸ˆJ8˜ªË‚‹ÉYãb².3.é9–Ûvi‚Å¢B–èEèY…€“ò†'d P!ˆ¡Rö+–>¢¦ê²€crVÁИ¬Ë Lz^ËÍ4Û3áÓ#EÏ*œz ¯IðÔYE¨ÄŠaI"àZRøˆJh˜ªËŽÉYCc².30é9–Ûñ¾Qœ‹E…,Ñ ŠÐ³ 'ä5 OÈ* B+B;ÿe€kIá#*¡aª. 8&g ɺÌÀ¤çX®ª%¶``±¨%:AzV!à伆áÉYTÖŠ%nRQP,r”¨u™Á 9«HЄ¬Ë ˜éX` ˆÍb! $†Y y"qÄZÈñåk!÷ÕÊ‘®%å*“g[þ™;/ñ/k!s bã×BnÕ]K™·r)·aÊÀ¬¥Ì€È_ ùVl-eHt\I&‹…‹ñè~T¸›•Â#?JÙö}wÉ}îû¯’ Ù·á%3ºoÇJ¦DÍ]›³ÈJ|)’.³{±e)Ò+E\å §y”É—`É•6À&ó,fû9Ø~&TJDüÜ`?Fß”Kê~´X Öö#¦RÀ²5”œ¶ò”ÙA¯–Lšž'ñ,ç©´MYó„òE“Of‰œNñ ™ÊS-›Òä ä&ß0a}ôcLmbnÚæ/Ä•&î´á]üÙØÊÄ^ZŒ1ÚÊÃÃ,úÒ‹R²F%²ÖLWÒÖByë ¡+‰g5òD’¹™¦¤®+„.r×BW’Ïjä ‘½®`º–~V#Oˆüu…Еd5ò„耮ºhA\™™ö`w==ØB²èC—Àw—1b¤^øWg·,í†mhâ>ºœ™¡)ÖäƒS¯<Ó„e#˜Vx¯Älœ5xŒÐ힀^`4ŒÕœUÛ¨¯›u³ì-mð½vçU”TݧÛôÆ´>Ë`üf—/à~“;ܪ¥ ž›£Ç28›Ãã§“ò„å!ª°½ŒÔ7Ëݺ»u@»ë`+Ò,3‡æÔ€£·Z7ÐKê´è“Õ™ÞÚ3‹„&s#&Ðv<÷ÓÙ YÛJó井˜ÆœÅ$à›ÞÞ{÷\Djq4I­:ï˜Þ~½;Z+»ê“'†fX×áNk*ÌLPïÞtÛ&&ÖQÀlêrgÚh]×EC‹ˆ³ Ba¿ ÇèXŒŠ*l4Úβصܤ?Ÿ¦«%Ùù *7´é'|Ôϵ°¯àD/ª\åÚÊ®ZÐnMRËu:¶´qÖÕuŸ~Ä!†ž^ÑÅšt º§ËóuQWr\f7U¶ÂTÁ+èÝ-W(kvQwÄÑÿo ù‡ÿ7þÿ4&½Âÿ£j:6Oy@ žÈ¾‚>^¤ï~>“›Ú6…û“e!¨´sLmeC¨«¥ŸÞ·Ã²Â´!9ßì°‡äW!P“2|Ùá_vfiFÙÀËÐ!Ôvsn6qU Ö¡ÜÅR‡~L‹=nÐà©åÎÐÊB€ÁÏA”=¿‹^L›Ó¬$mÙºw ’üuŠWÇLÝòn>ùA++;”â‚JyôËc•{¤Ÿ‚Äz’Õ)ÏÓÃéòžå²H_1!ÊóЛ~8uº^N½/ ËYLd!ªTšënƱós–h¦°pR`ü=;Í3»7°jX ð-N„Õ.»c¬&2PÖpYLnf Pãsc5ta*j­¿@{<ë ÏVJNN—[¾b¢wþÛ÷ö¶ït1||Û‡,| Û‡½\…í Õ¶¯êŽ-ŒiÂØ:KÛoµ×Î~w “S0¢¾ÏìÂÌ}æõ8wvÃü/¯ÇaRëØßbžÆ³—[LôdG‡¿cBq,C“Θ•ßfžÎÄ,®»…в¦"°g¯,â´“ ´Â@íLÖ>ï¤ØgW˜³1¾'A•x;ç¢h§Þ.‚?ÃmÌî l´…¡¥3ŸêÊ Xƒ°kú>[ÝÍ„°•|ê®ÙIMÂ0p”â†Ø @/ù\/ø\°‡­½ò—Ö••üe7Ìï^…¿ìì+à/'#©wñ—tCþò¬ÑÞ”¿<‰7í/Ûx!2¹t¢mÇ+YŽ¿-‹’8ÇÅ¢x¯ÃÅ6͵¸X›²£‹}4’z{€A7äbÏíM¹ØÓ™xÓ.–˜Úþò ü%êî9þÅ{þ²š®äÇŸœpº;¾7ì,ÌAßþ yóF{SÞðt&þ¼aU}˜Uðä QwÏñ†(Þ«ð†Íx-W!´v÷[Üã«“Å#ü¸÷xÚhoÉ=žÏÄß{Œ?“?{ÜÐÝSÜã†x¯Ã=öá*œ#œöíLß9–Ùu4w,sã†\ã9c½)Çx2 n± f¡ú#¹E«¹ç8Eîu8ÅÆªÜs•®:äV<ÁÏ7ð²´âëŽü`îÓk>YÜšŽÁýÂÅvøc¸ª¦)É!$ÍìhÌoO6¯Ï[Àß —ç5a„3 ð3~¸.äÓöÙâ¶ E•ƒ_ÁŒ|é-7¨„ïtÇ ÍëÝ­ë]Ë®Á¿äÎíû?¡*_{‘~b<•ì‡wzÙßþÁ /[TÜ[‚k>)‚;GCn*‚³,|ƒ_eB'üdeCáÀÓR¬âšÅÊ¢üv?»~aòJ=-Îø± $ÂÖ ào|Š8p´®'v…Ù»½ìxâh 6$óÃýÜŒû©Úâ‚î÷s–ŽÜ”B&¾… Â^ÎpB¨vWà„ÂT]¯Ú@‚7h½iºçÌñÓ½N¦i¶9_HøÂXÁýê7“ðm)âŸ{+>wCu_ásOÓ‘[ò¹L|Ÿ»ÑË >wCíNö¹«ºåeBU‡¨ÇŸ·PtâožMÙd¸É¦³©ÓŠq‰‡¶PÐ8T·-õÂ(¸Ú5-¿ãÙj´í¨ sñE°;€ê[FꪢI6ícvȤ¦Ši±Ií+ƒ^máÒ<•O/Ñ “ |¢3lè!Açdy I=Ô7¡3ûÑ®jÕ|:<°j¥È6¨áv&óÄÚKü~UÝ/7ªÄX­ßùI߯Š~ýùޱ,'Ãg‹_Wé›aõ ¬Ê>¦Êäz¨–oà*z^óuœ— GÔYÅ×KÖßBõÔ,ÍD}—ÊòÙ]~€:Tä5 ‚z «H*f¦Ì‚Xb$bê‹©Y÷Íd]æžMÓ<ôûÁ¨G-ßqEÉàš‰æZzÝcªaº¼NlÖrÏF¯‘ÉÒü‹>Ô6-@xUÑÿx|ïÊ~¦ øä%GÛON÷ZöP-nkWKQ§äF/ø7*§#,&ìmüŠOÅ5Ý’ilë;~®íÆû× U¾YÖ@MÈ{ö?Ø÷‚OÁ-Ù`=6ö^Áíþà2p ql:‡G‡l@xà®køH—Ÿ# 3 w‰îQ—ó°u8ê€Ùßæi$È—^’aâ•þ§„ªE‰o‰ŸåëdË'x ­Å+Ø¡1–3ö|¨¤ K¼xuB’±ÀÑü ˆ  Š :pÏ%,zØÑÂZ *Tqcës7þGA£ì†ö~ÿ æÑöWxÑþËo¹s.v}°öâ{šýÆÂ-Ÿr‰ñf§n2:-÷ÝBq ÷uc‡5÷Ýjô»å¾uE²¨åUÈv) 6ØTâ²é/°R×oIYCSú˼µ+¤¿,èýô·ã_ƒ£\£=‚¨¾/œÂ; eýÕ­©šÛè¦Nßgf¶ù_¶¨–Cù[Pmžì|®å[MÖƒ+XTA™ýÿm”&  endstream endobj 60 0 obj 4169 endobj 62 0 obj <> stream xœí]ݎܺ ¾ÏSøº@§ÖŸ€¢Àn²ÛëÓè ô´@Ñ-ÐsÓׯeSEŠÖììf=3YH"R–(R"?Ñ’§ïþ÷å¿]ßý¾?™n0vù{œãß¿ýÚýíwÝVfüóÛ?¿<~ÿ†ÓØ6œB÷ýïÝž]gúøÿt´Æ„?ußÿõŘ“[XøUšVÊÓ÷/¿°Æçñ䕯ûí!·ô­<Úyk9œlê­_)ÃiBÿÕxã¶jÃ2& Ú•2f‚‡æGlÊLPËŒ§!U{€J^kÈ: „T#ð#Ì”»àO=®,бOý(„{‚FÁX.­O]÷Ø’hÚn„,œ™ Öè¿f{þÒE‹a\¬½M¦!,O¦¹´û/þ‚V÷Ãmnâà_ºìÉ(þ»û+L7àš¥ä “–_:¢…3—–_:Â2+2—–_:*EänåažOŠ•ŠI¬ù› „_’h„_’p„_’x„„Phm+¢Öd ¥Ö$ ¥Öä¥Ö—J‘»E¥e!„%iÍÂ’g(“ÈÏ }†¦ÉðØ<8à dôÔ ÛÚ˜ óÃÉjÅ$+¬HCæç¶Åv¦ãž¢{š7ßêߺ¹íž{ü(º–ÍÙdÏ»y'ô²àâ‡ìŸŒæáÍWRM óı©UÏ|i)f¥;ŨQë¤fn¾ÿÆÆj6mxî!I Wj#‰9•ƒ÷H€Tu³ÓŒâ¹6F®–•ø@Àl1ü4£<€¯ú ª¾¸F{!&InF>]Ú*|H«e¸Êð¼H;LsB¡›`2ôÏ Ø<  ä¾Gó ZÀ€l`HL÷6Ç'^PHÖ“6:Á#H°¬ ѨùmxMx@ÁÊ15%E&˜>“Ì¢k[Õ5—Ð !$›'9K‘\0/øÈÍyž<±V¾uÁ%©å–Õ t¼ô ŸAkÅ=©î)LKÓ‡) 5‚sUqyngpϼ !)—ÉÉ˱_Ïn#¨£å¶£à”9ߊÙA.U1½Ö­7Ìr0-‰`œ çr`mxÕ‘zëê3z„%÷˨nCɰß!«· Ü*ªCÁ&…X¬†®ÀÑ,@á6hG?A¼L‹^{¤½®Å,íU÷ LB3W¯1}´ƒÚ†ˆQJü©(yhŠ.b¥ê–H¨Âp¿LÚ:àý¸u&–e3Dâ‰Ûà¡IÇK°¥ÈëžlÛ²úˆ@a0Æn£$šZØPRûÌ …å£ ƒV¤˜|ÜìU¤p¼[½¤ã&­ÑyŒÛÚJ£>@LÉ–/ÿ29ú4—q¦>2Bï™>lÏá:*DÁÐ?p?óµ8p$8èìq'þÈXŸDYm6eYR¤E 1 G¦iËE·³AS–8¨$+ BÒuaˆëjK!„¨=]g'»fö<¤$â~f+å0 k¾¹ᥣM­™šµæ!¥CÌi©œ“nXš#JJêTÂÓIú­„Ò'fj ¹Ûf£ðƒl•Fj–j9kPT:ªíymÈL%ùaPÕz!9±0rsë¯Ê@ ˦§72'ó’Ù9-Ù3sÎ@Ëv åú¹(-cBt,o—õìÌŒ’?Ë>salŸã!lžò;ц«©y¿œœæ˜þ¬èTäÓ‹ ¥‹²¨ënÒÔ-çÒSÙC;aå¹OM~å5Ê>ôÊš­ Ópf¶JàQ”^­Ô ¦¦D¾Ë”V©-&³‡µ}5ÄfLìß°  &ºôËWúr~&ùÐä>Bl´D#t;ë^noU‰¤fÒt@÷4jÖ·Sˆ âpëÚð…‚Db´²[±Ÿ¹.‘PòTçLu¹8ˆd‘ÿAÛq­Êá C()þüˆhT_ V«¡ïy`ã19¤Ÿk‰G*[~dÖ'•€cÜýq‹ eUR©daý4ýÙ³l˜ŽI´ýä³L±º¢Qž5éñþbfvÚ<Ó2@ÁGðûýà PMŠ32@j˜^3@µFï.K‚Tã ÌD:5G„îÌ1-µsD ” Iµ)£ÊšðSÞÓmÓߘÛRe>÷¬™â9ÙdŸ\†)G7IÇ„5¾†°Æ<ÂâÐTÚ1·`-œ€0SŽ*–nÞ¶ ȼ¾Ñ]3 nЧKv¼-km Ëû“É9(b²Ù&Ä IØᥳk’ð ÂKçÆÅc ””—®h=¹”Ïlb&n+æD\bƒ@È¥e”¹´œ¥CvAȲ!ÎûxŒ eƒr+lÒ~AHò~A@ I…’‚2’‰bb(Ê2®E""°A äÒ2ʇ\ZÎÒ!» dÙ;÷Q$” ÊY8¬°ICø!ÉGø%$J ÊHj$Ê0`žvHE""°A äÒ2ʇ\ZÎÒ!» dÙŸÞÆ²l[™—*€4™_P¾Ì/YÂ\¡¤dsDYV–q- !—–Q>äÒr–Ù!ˆ| ˜ÙY~(gá°Â& á„$á”T()(#©‘(c¿xõ,ãZ$"B.-£|È¥å,² B– ù‰°@µ™êo+áR&ó Ê—ù!K˜+””,c®‘(–DX âÙ9'—P*KcÆÆI½Û"^l<Ò/cžÉ»‹µ€QX[ÏÈ"Å$ òHeA&-£4e “Aˆ’ñÀZ*bmŽÄ±Àb‰…k©ˆ29Åóò$ ¬¥Â¿fï»JÿFüßZ*‘7ñ±Š9οMÄÎ× 9{þ}¢°^ö­äâÛDµNÜTírxµ'z3‹³ÜY0õF’~"çÍ7’¼g/šäýq½‡¿­±ŒÐ‹»:;×™ÄCêñŽö%!¼Î„3Jœy‡ëLo¹ß¤ž¶|ø{÷›â,a¹ÏÛMÄUŽþ(}Þl‚³vãš48Ø8áÞp¯I=ÆòŠ{MبêŽA_.>|kß(Ò.)©s´}ïiç’Ò¦@ß ß†õKJ; äBo_Üѯ)m:3.¿s¿rµ¾ë5%ñõ“ ®)e¼»s¬£ïkhì Û–gšœÐW«Kép,Mðøo@"/ñ›zm2ƒÕjˆËçö‰ÛÖ6F#W¿s—ŒæQM% ÖE“‹Ì…KDã:‘°Xœ‹Š8YKßWm£é}¾¨5Ñ£?¯Í3HÙ]¨’¸™ßKà9Ääl~]AÞ>m%òIè]“2‹Ä^Jþøúuó% ó9b’}Ñãõ\g|ýâ±ÇUT­¾yjƘÆ}ÀES¢ç ÷”Ìé5ö3jsD*@¬^åÞƒ®€ažæ—®ûgµ×ó.]ш>¼0 ×3^0¼t¨* Ï—«Øµ‹%`¾²òƒ*ÜK4§¯g7Æ¿ÄvM9dæeæ3Vï[&oÌG9'âÊÇd¤úgheÖ&{ Oeéï_íIæÎ’>ðœê+RG6ž,¯(yçÊùjË‚ì^OïšÀSÍ"—±pÂïð="=.o鹊Ž?te‚î0}¦èèîÿx3ÜZ’NxÃëÕ×á&5•9ö†ï¯¼"Xæï¯°Kø4b_ïù¿zI&2[Ïé5-¿nq𻨊Š>è¿â'SÌMÿ(/g‹—Ìj¾PM¾:q×¾›z†ïwàÔ×kü=ÊjÄß ’º26ÒàÇëã|ÇþŽúØK¶‹6™å¤M¬Ù–CÇãǾn¨ÿÛ)ãpð·ë®Î¶íïªÖ× M/öë–¨,Ó[ÁV~ƒòc°„ð°b*Ëëó¼ö›iÜfFDf ßá|%òRí{ÅPä/Ú+ù7øç¿Œl{ ùWqù}w7œÆ.@¡¾þÛ!rpB£KW}q]6N/¯ÄóÃT~¶¿ÉÐþœ„ŽðG>¸öqMPòáß±½6%W¾ÙãÓKDŒäéô‚øŽ‰™jè®LoöU^±³ª|NJ;ò€‹¬qä¡b×C|`ÇŒ¼–dö_‰1;¡ ß'YU£|ú;ý}ð 0ÂÀßýÝÀhž‡¸#€! õ 0öÆa»'€q¸¯-öý€áÇ›y£rgCNï#†´ÿý go`4(ÞÀ†úûã0ÝÀ8\‰×û~À°î`0äô>`HûßÀ裳¹Q€Ñ¾{pGCê`ìŒÃ4vOãp%^[ìûÃÌóç{¨c†œÞŒŠýï`˜Éß.ÀhŸÁ¿zÐþÝ¡tÑ­øeqLüªaóNNvREË}ŒW‡ýIÜÒ&—„} a+6Ö{ Ç+ñ¦Ã˜®×1Ü <¨„K7?Mö€ï«IÇ59ïøëJhÿä |¹RŽ€r^ Ø¡‡"ýP&‡¿âo 2 ý‰])¿!ÈÐìiÙO¶O|‚_òI?íƒóÁéÜøPµnLú$ü võûf¦Ëã5QSÅÉ` 3íl»Í¨ˆe™X†|Üû—îÿ5†øM endstream endobj 63 0 obj 3846 endobj 65 0 obj <> stream xœí]ÛŽ¹ }Ÿ¯¨çé”Tw`À³ö쳓òIXdì¾ä÷S‰Q*yìnS-7 Ø&©*‘*’Õ3Ý6ÿ{ú½i›?·ӌƮOËö÷ÿjþñ§æ¿OŸ›Íl†áÒ;û0-—ìm³ýùÛ/î?üúÔ/Óeš©.]óÖ ƒ¹LNúOó÷§añm½owˆ‘ÊoÌÅ+•ßšnê. ½˜)Þ†c³{E;^úÁ!AöØÈ‡íLøÐΈp bÄN3ÎöB0"BôæZ©ìñ¡•Ê€ÍLØÐîÃ|(¶C&àü‡íLøÐΈp bÄ^Óõ—‘`ÜEÑ™ °Rð•ʈÌLØÀî¦Ý !¶C&àü‡íLøÐΈp bÄN3ÌÛc !zó­TöøÐJe@‡f¦lh÷ŠÑnÿ ¶C&àü‡íLøÐΈp bÄ^ÓÍ—™`ÜEÑ™ °Rð•ʈÌLØÀÌÔ‡LÀù Ú™ð¡)!àĈ#œ¦_Ú•dã!"Do>¡•ÊZ© èÐÌ€ í^1ŽÛ0ÄvÈœàР)Ú™â®AŒ8ÂkúŽ ì; ¯Gæõ”UO9÷°øÙ{Æ·‡ÌKa˜…ÒØ!(Îì¦+•X©Œ ÀÌ ìNÑ-Ú̴CDhÞ|@A+•=4´R ¡™)Ú½b½‹!ns2ç84hg À‡v¦@„8€k#Žðš~Zï„w‘@tf¬T|`¥2¢3S 6°{…í.–úï 8?À¡A;S>´3"Ä\ƒq„ÓØe¹gô¢7€ÐJe­Tthf À†v¯˜Ö”™øÏÉœàР)Ú™â®AŒ8ÂkVl=Á¸‹¢3;@`¥2à+•˜™±Ý+ìÄ* 'p~€Cƒv¦|hg Dˆ¸1â¯i;z4"èÌX© øÀJeDf¦@l`w ³V˜´Âp2‚ƒbg Ø™’\ɯYKb_aLN‚úÖ0RЕʈ ÌLÈ‚™Áw£„5ù.ðº—ÔÅ›Ä+N¬GwW|¤"Ü%Vka%¶ ¼Ö!µÐ&ñ*k]àY>©v‰åט}ïÏoIþ»I<³Ä¼sxfG2¿]"Y•Ï·öÿ²$S MàYæ »ÀYžd»ÄøÙw8¿þÛ$Î,È;»ÀOvròï;SñÄÝ~¦‘3o—Øi‚g Ù¡ø8l»’°qºßrÞíÈuÎký\­}^éæ*Íó:/WgW9¹*#韧Ýç™o.ó<Ïûry×yÖ“Ë:Î9?ǹ猗cr³ž ß㹞áyÏ.×1;ïXåúEçýš\·ä¼[‘ëœ×ê¹J9]³žçõ[®z:¯^rµÃyîžËœÏ3×\Þxž·å²&’§ð¶¶ßäùÆw®ùœoýæÚ¯ùæg®™oÿåZpùX® •o5er½‘\ƒ"ßÈ•èù9W¤æKÄ\™–/’r…J¾L ¹9+à™H¾ê _É.Á ù²#|"^9¯$D»?|! ›îAS^6¼Ã–¸h;miÑò ›Â²ñ4feÓ3l‹ÍHÖ¨ ûA¿P6傦lˆ…-3Ñ– ÚV¢%6dc&hÜȦHØ6­‰ u!Ûaã ,΃â=R‡¥3>®V¦å=«QÉ«bxqLªTªðvR§¬¤R¥ °c­Jd°’j•*¼Ô«D+©X©ìX³¬¤j¥ o'u+‘ÁJ*Wª»¯]A V¯DöVR¿¬¤‚¥ °c Kd°’*–*¼Ô±D+©d©ìXˬ¤š¥ °c=KdØÁø —H~šâ÷>&ñüú4oÚVÙ¼þ³ùËKߘ¶yýwó“mÿÚ¼þö4­W¶›é§vÜã:Þ)¦c„Íó.ërŠÁ] ³+>½>}P˜eÞŠì óÉÝÄOcý]{c`0ÌÈ$vÙ›¤}qkµþ&ƒµšÃýeJyÃt܉Å÷ p ‰íÍvY4(}è)ôÆŒhýˆ%µ¸Á˜u{GÃòa¿f–’û˜œf=uâÓ´]òš¶_×<­‡ÚxB1…¡ð.±ÇjÖ“5·bH¶Ãi\Æuoí@†f>bõ³›¥ó·8îi Vnow0‰ÃŠÖ8ÅÀ×b`u/Á,v ýþâ.ÂGY\ÔÎÁÄ«‹N,Á?XüÈÁÇžÿa\±DœØ>‡N´¡Âptሺ{FøÃ‡ßNÝ'·ÁG¾#:|ŽB$ý±E`ùŸ’ÑÔë­ÕÁµ¦Ž¶îd釨tá,rq&¸„øvû’ra7í­{u'v©å‰Kúì´B!f7I`/n½ N¼¸1¸¹m’#_ç.îï?‡X^ïŽsƒ¹Ëu=Ù…ž\Â3΄YÐ5QlãìÓ'zŸö,\û‘_2—˜ä®q(ä®é޳ÅÂÞK3Ìâ™ÎQ¿k‚|ÃÐ%óʃ›'ë‹ïËÍ6dU—¾öîãáw:LPuà°4ÍJÔK³Zk­ŠfÕXÍöcójúœw»; C¬œf*éz ¾ £Y[ö³[v]–- ¶”þ¨—-µÖZ[ª;±J¶”^Ͳe÷¨a¯Â–ÒõlF³ ¶´Ût l)7U¶AÛÚÔ´¶—ðϸ6…ã[X{Ê.׎N³¶ŒK½¬­µÖªX[݉U²¶ôj–µÍp7=ýÂy[:_ƒ·e<Ë`î scvKö¦7 Pé z)Tk­UQ¨º«¤PéÕ…‹yPèu(T:_B#ñ,‚B‡iûÜY™º#Ò/ÙoX…FT-…ª­µ& Õwbñj–BÇénšøeShÄù*ãY…V‡B靖¤ò[2·ŒK½Ì­µÖª˜[݉U2·ôj–¹ûîÁÜ×ané| æ–ñ,ƒ¹íìô¨¸âwJ1æ ?'ñG½Œ©µÖªS݉U2¦ôj–1Ír7}ûÂS:_ƒ1e<Ë`̶×aÌ;ªu“Ì}ËZWÆ¥^æÖZkUÌ­îÄ*™[z5ÇÜý2<˜û:Ì-¯ÀÜ‘xÁÜýÜ®ÎU`nñI¨¯xÑ{ƒZ7âjSm­51¦¾kd̈W³Œ9™»iӗ͘çk0¦ŒgŒ9Œ:ŒYL­û Ì}ÃZ7—z™[k­U1·º«dnéÕ,s÷Óƒ¹¯ÃÜÒùÌ-ãYswv½V¹»çð‚1Ãߥ֕þ¨—1µÖZcª;±JÆ”^Í2¦íî¦M_8cJçk0¦ŒgŒÙÎ:ŒYL­û Ì}ËZWÆ¥^æÖZkUÌ­îÄ*™[z5ÇÜݲ<˜û:Ì-¯ÀÜ‘xÁÜݼ}…s¿ã­íõø0²ÚjùPm­5ñ¡¾käÈW³|8 wÓ„/›#Î×àCÏ2øpluø°˜JV…—¥×ëåe­µVÅËêN¬’—¥W³¼<˜/_‡—¥ó5xYƳ ^îÄ7 }^î§põ¿‰1²üz Rk­U¤º«$HéÕ,AÚén:ê…¤t¾AÊx–AÆê¤ø‘Öw|GÏ»ý“&H¹üz Rk­U¤º«$HéÕ,A¶Ýƒ ¯CÒù)ãYAÚY…‹éëAÓ"Õ’´ÒJk¢hmÖHЧ9z¶Ór7ö²éY¸^œ#Ñ,ƒœG_ õâÆø£ÏaÒ­ÛÖ÷ƒa? ÁRÅ{åZòŒïÏäŸÇ˜ÖÚu”ðhúA?"0 â9ç›M¸S8ˈ´Ä¤¼gCWˆ­äj“÷0|–tÒºâ;`!¯ÊíÅÝvIŸzâtXÅ<½à^q§.Jþª)uQvai© „2Rˆ‹m,lŒ2²™Lä„û±£ò­ ¥Ë)Â@hä52¶eä5½øÞ¦Gf“Ël’ϱËl¤Os¹MgD¯·–ÜF:ã‘Ýœg7j«)¿Qwbi\z‹ ç=‹Kä¤û±ãr¥G†B#Ë‘Ñ-#Ë1Ó#Ëyo–óœÉr¤OsYN;U›åHg<²œó,GÍc5e9êN,Mo‘å¼ç sq‰œt?v\®”åÈPhd92ºEd9f_CöÈr2YN:ÖG–ñi&Ë1sø+ +Éq"®xä8§9ŽžÇ*ÊqôX—Þ Çy×1çâ"ιR£Rö§n"®WÈiD4ËÈhÆE'£ù‚\CìT¡g¬ýŠýêŸÔ<ùø®}å˜_†¡ÚŪ­µ*ÎVwbÕœíÜÞ‰‹ '`¹Y58Œ¦:ï{¬›/ðmoÆÒzvöáœ!üÙ!„ExÏ„#’¹æÜ¯$†Â½ž Óönøuµ}ê¦Ë´Uö‘›öƒ»ÇÌY|`ŽÄ` ùW”âØ§è3ËGèî‘ÃŒ/q­rÿ.|w aú!² \­{R&x&Ý9 9" Ýš`ùv±‹s’5×£ƒÝn³ì_ð¹øœ 6æ)n¼§À,.û,Û—GŦùàn,9–>µÛ§¾b÷ð¹!l42A7ÆLkL#7ugsŠýŸ›ÿÜ») endstream endobj 66 0 obj 3488 endobj 68 0 obj <> stream xœí]ÛŽä¸ }Ÿ¯¨çéH²å °0³=çMÈä™»/ùýøB‘)ZÕÕ»œÆ3#Ò)’Ö¡dÊå.ÿýòëÅ]~ïü¥óaú»ç¿ûû寿»üçË/—™Ýõ¸]|hé.óŸ?ÿ þóÛ?¿´{è.}3_õãcó õïË_¾Äî¡G¦ïÝC7#ü¸4.>ŒœŸ~\¸¨™ m?LZ®¢}„f’‘d!;#pägŽìµÝ í|J‡6‰Ç @» § 슜’t`aê( ñ×?1“4äf’ŽüŒ€²Eç8|¥Ü¾62·ÓX/""B¼Âku«òaFU!^áùº_¸©¸cPD9xòÐÒnn§ÞÁÑ<ö2¿³‡I²?kã½${}üÍÙá× >ùßž¿ŒÍ¥sÏ»ü᩽xwyþÇå'÷ôÇËó¿¾ôÃͬŸ|\³³W‚ë×+ß-ÍùÞa=$‚ûy!|þò‹P*¸æ!–õj—{†‡6õ ×ÑRÄÅ\Ѱ­·kBC¾‹‘‡4¶,ÁuÖ¸šØãzC!mæè¸É©áëBðnŠ;I ¹än è+#ᛥjgs¸~ ‰EÓxEÃÏÐEÒÂ?®ZH§4¨èIçóÁzŒ¿FöáÙ©B°ÄB´P§ ¤©êÔ…—+ö]ÚcÜ4i7Ó½™I›u(‡Ò®Nœ' 1(‡Ú›>xå6tJg½îú û¨wŠƒ² •}¨á+Çê[d,àXâÕƒ «b5Õ~ R5Z¤~;|†qR("«®µŸÈxµŸ”}ÐÆ‰ð¾Od"4^<  iÁ`¾oÊs˜û&C,HBBH´X#¯Pcé¤ èí&Äxê_Ï-²Ë«–À¹aN Od è¡ÁüÂÉ Jé©ì…ÆÜ€l¶QCSö’CScÑb•êßÍœ¡™ó›“\R½}R$ÕzàBOöW9%? ‚ž´i5yEA4ä4?¨DÏ1r~P©„žØ«˜~ÅðbM Nu„5áûx”&ª"JØÎ຾•éÆÇdpJŠ{‚çÄ;óõÜ(XR1¤2Žf ¹Û °]»4Á*óªÆj›€r&{þ?JÁo8«¿PôâäægvcF¶g“ÒÄ·l{Å0ÙÆçØ«‘D2®¦ð()HÕ£œ÷ Z í²½«µh¾I±-HIfG°+sRsËSAL¡WaTFí$b±ÜZYè« X!)Þ$û 1946BY«†>ˆ[”oôøÖ§†í©Œ@ðò oõÏ&Ù(x¡GÃv ž?¥? ”u0¶ã§ë6`;Ýi¿C˜:êüðб-ɵIÛʼní›I»Èù9åÇ%ëo¾ÎÏ—Ñ~ûÚfûíé‚Ô!]SP]°æA8„µ…#HL苸!õ-n&å©+m~©´ÌUãâªd¶ƒŒq »°ÛÁ™Üô™a¸¯ÑõÔý‹v”»qºµ›žÕç|óñ+„«wôðôøØê»Ì=ØBCn;{éÃ2Ì×êzõ>¨ÜmE]Ç\W&C®`:íi*”}hµ%á=w¸—W%›ÂÎ ›åν"öí«žÖ[ùÊßs ʽôP+®Ð]þ,¯ÈeT6¿ãè'ƒ<üÒITƨvÅ’;Ç’·Ô7M1µ ¹ÛKÏk3̳–¶Ø­T9ÊNSÝË>¢¥˜¾Em¶¥[Ð@ùäˇ` M…\èAì¸±Š“kÛbb^¡[Ú8ö–÷Ã'¿ïïýÞ¾^?©¥´­+½¯Ö“*èÞt=‰>¡ÿ;ÓwÒªzxÊj†–Ê«Ní$XWØË%ˆ¡ÁÓBæ3†Þ+†Ô-jpÓ,3B”™AUÛQS¬ŠSåJ÷dï[@„ôóâì3BÎ!ÍSMSmdå}iÓÐCà×ÏC]“²äÏ({G,“6½eƒZºA¿$UÁ]ÅK÷y¬¥šCq¾ö3†>z¦²y[3B:!ý›DȺGÕ°R Ý¶¨KZܰEÝØïÝ–-ê’˜ÃlQ7‚€ûÓ8º¯àÚÑêTÝâT§ƒ¼ÂØ#&)ö–6ÿú-mñº©#‹É±Ü°¥]ïvèY™ãêq¿†ï@ÑšV”mnÊ sei©S—fŸpÐó ^ñV¯Ë¹›$J̨x"0ÇH~èrã°ó{àã´õ v´¼—¾S÷´¦VMÚ<åD­êrY7`žk‡ž¹&·÷h˜¦IËSPê>C*C(o |‡nÝè^Ü¿nt7ý¼Kg¿4‰ÎÏï,ÚnÞ(žwÎý\á½6—õž³}œ‹,ˆËÛ?.¡ïZ?.Íà‡Z“@.„fј4JMÐh 6h@ìŒ:—5A+â±&éÅä®”fÈRÐBµsU‚˜¼½êDÐD…½jÀØaÕ‰qYsÕŠñXõâr™V‘«™>1S&¢&‘©Q‡Èˆ\zÌE7so(|i‘x`‚Hdò6(k“Âóf«ÄΠqY´"k’^L.P¦\ª!½–©LP™¼ :!Z r¨Eú¼•0%/ š)5)IìUâòöªñ¨µ*Dj¡BR êÛ—¸˜Çô2]à„ÄÏÒžLôD9ùD9ÄöZ8ùZ8ðôrÂåäÇŒ‡Ï‡|¶ìÅtÁÚ‰›OÙdÒ‹‡ˆµ‘›=BÙ#Æ<—ç©Ý5IãvúVK¥¶“šZ‚± õ5صapŸ¶á¢6uoO¢µ m{jÁçºÍV]-¹·“ì­T×N9·?;ÛJƒÊ‰‰)Ø ½6„m‰=¡Ã\Úf+¹®¶œ²6[‹ ;ÍßJµí¤w+ñ,'„vvf'J[ÉŠ6lA· ¢€_-Ptˆ¹†•«\½ª«N½º“ë?µÞë1½î‘+#¹+•Š@®DÖžeô*‰I¶ÌjEÖ[È.eþ©ò=‘ê¼Kff2™ùyÍŒ²¼-ËLø&íé°0È(x N > ƒŒBWPpñYdº‚€Ïà £Ð1gGΣ0àâSpòydº‚€ˆÏ £Ð/ªZâ¼MÖâû»n±Z÷™Þk¨ˆºÏÒkŒq.É-©ñ–5š®)ŠPŸP•£v…¥xËQ/y­—ç¶a.b.º¤•¶è¥-Œ:âÏDljú²°™<¼Ä^¦Ö•b¾òŠ®[vv»TÌDŠ©2Öºôgå=æY˜i¢œfÃàe5ƒ>P£^´>jìÝRïoÌzê<лœWêB\u0TÕ¨JSS fãlS±‚}–T°üÇÔ„n)jÌÚ »K¾(ߪ­é¬^»¤«Ÿßöìf$U¯hM¢ÍÆàždJS©‡.”P ªÎÜì#š£5Š-J¨3!ý‘Ü UÞ²¤CÕg¨ Eб¬Ê‚쳯«Å|اÂç‹é’pÙ‡8M\Ÿt}Ï ¾F±Ð5û”Œßr=ÔDQYT5£:ql>¤*äìò×èÚ2”ëB¬W±Oàö.• ØŸkˆB°]z´ä%ÍRÒñú¼Dc½(3•GnðË=˜-È7¼E^¤X} Æ^m,éCÁ@ô|Çɹ0Á¨Õ¿µ6ÐÙ‡ ìRÅJ6±ŸÍ^žMèüêåg,ôà” û&•‰˜óqŒXŸ˜õ¹U»^­*­Ä*gÖ+“í%¹S-Û§‘ÓÜžÎ6a6 L™V˜x¬”&Š–Âûh(j‚f×¾ hê£ê{RêFÕsø&MRC8=šyԺ͒öô,5)ÇÆ¦½F{*l:ŒïrÚ,~–¶/YÕžEÁ1Þ ~©=—i9ûªTn]?¿zÍiÜ™ð¨ÒwƒG­S›ËÕ˜VÏEý“{zIb~µ¾ª3Wd7ì¿|U§-ö¹ª«!çn6;rƈGAÎ÷XÕ5þn6…˜ž¼fU§Ã[ìЪ ÙÂÇTÄÞa£¾SÃríõw½s®°L-¤ªßY¬xQ[TžÏoLèZ±Þw‚õö—(ñ sõjç1ö Õ–õàμÝk´§ÔÃñ.çzk)ª­Z]Šºþn@÷àKQmü=@TûSèíÀ¾Œ‘ WÙÛÆù#¶€þCk]aÿTÍͼ&D†bˆÜm´g‚ÈãñLY°j "ÃÐÜͶù±!²`ü ²àÏc@d§~àì} r¬^ñökÄÂàÎ €{öTx#ž µU«ÕOçÖ@mü=Pûóضò µ³IjßÒWÍqû’Pö̈¸×hO…ˆ‡1â©Q[µŠˆM¼›íëƒ#¢6þˆ¨ýy D îCñ–#žê'8åﵨßõ´N¹\ƒÌºY«­~fdÞk´§BæÃñTȬ­ZEf?gqŽÌÚø{ ³öç!Ùó¶åÈ\={®ù¾¢Vûxטµ**D ú¬Õ­@ñ~6;LjGâw¨ÕõCÿ¹7{¾óŠZÝBxïËÿŸ¦V×÷á= ×¶â§aÞæÅìÍ‹ÝÂhO¼ØÝm´§BØÃñ.'c±[°jm±ë»ænPøØ‹Ý‚ñ÷@UíÏc,vÛAþ¸ì› ¢¬Äµku?õhÏŒˆ{öTˆx#ž µU«ˆØŒw³pDÔÆßµ?ˆ¡}D¼¢îh—%¡Ü™p¯Ñž cÄS ¶j}üÀ·@mü=PûóèÄç‡o¨KzMaî;UQC;3øí3ÖSAßALx*à“6­ÁÞèïfGúà¨'-¿æigî yqþŘ8¦| LÉÁdðÓôÒoìç†ÒïQ©]93ºé²’˜¯ÐIýgk¼‹Óí¥>Ò‹S|-ê3/mÔ󸾬8ž©¨_.ÿ®ûmä endstream endobj 69 0 obj 3941 endobj 71 0 obj <> stream xœí]Ûn$¹ }÷WÔs€8ºÕ Xð̸ó¼‰ü@6‚8@ö%¿ŸRII¤Xª¶w¦ËNÃ@¢TÒIQu±éþûðŸÎt¿7¶¬[~Ç9þþúK÷×ßuÿ^3ã߯ÿxøòòÐc7ºÐ½ü­ûÃÅuÖu/ï~²Oì^þùðüòð3û`ù=}ð¼~Ð?öKÉ%ë'waûm%¸Gc¡DÀ½Öè4ÄnˆFýÞh€6F xÏJxµ kúšl$ôPçTÂL¸¯+ax°gÏ@ÀVÍ>²)_xËǸ}g,1ñOÆ•à‰Å–cwÃJ‡A–àÝ%èØ]Ç¡»ÙÍ ÎRÛ„Î#A•Ū•Ãh–WaR³M«¦¤D˜B6ªM‹¦Õ*5ê á<‘zËfS4k0Í«p%>'<xRxÇfÓ$Jn²˜ÔFŒS;% ;Г•?w‘½™amÆÀ³4‡Æ`ãÏŸÿô@Œ ó¸(Ø"G_»¾·®‡ä¿º¿DÉPúµ³Kög„×Î…E)òü‚ðÚù0/’LÙyúµË¡Ä\HÛ8N¤™§LÄA¹!£ü‚@À(;O0ÊÝÒýàcˆ ’²J–_R]V¢¤ ¾¬@A@„Y>¼_!\S d"Ê- åÂFÙyšQ.¤ 3…ƒtÒ8*€`R’’ð¥%…¦0 Ƚ¡ ‘ÆÌ–ÊÓ%Í‚ åp™dó¦Êu@­ÛªÕnÆÌ‰Øæ­¸-åÉD5•&¡9*[cb_/“ L¹±YÛ­÷ÒÈ±ÆÆ"×ør“ÈÁÍNuLüÇZ•Šî ðVžã˜šH'•«ê °}ˆ )rÃ:N@Å#az^‚ƒñœÉ„æÔßgV ,S; è·OVApd5ëµøgÕÖ†)Ï[1Ip„¬Ñ }";wi"å8<êY¯}±†#u jo¹ì`ÙYƒïÝ „@FU T¡Ü\qâ`ÓŒ¤&÷¬Ž°) Iˆ#ûú¹_>üìƒhP6çò:X׉ߣړ™õD­y—}Ó€›Ó³ÏO¿@Ú'rÄ7µÏ¨Fså×8¢Gsz~é}Ô:ļ£Ì)«¦»=ÿIÂèÔuBoL _ðédy÷¼àY£ÙйqÜi"ˆ Ú7 õº›(<-‡X/AŸð†Ý3ï¯kôFŽ~é_Ù›/4Õ³tê@“ 6®„Æy"Mî8 QH?YK_£m½âªì çÙ¡Þ\øGÜÀíðuîúÞs¦žz!d.ö™µ#F')c¯µãf`«ŠDª€X³ˆ5w¯Y³„¸ÿS“޾‡³H3®T{ E¡ïVã è, b˜ºPTÅò}ŠcÙ[u]Xáñ}]È×…7cÒ}]˜yš7ÂI×…¿¤5-4—X³6pKƒ†ýW0½V‡„ÅÏOQ¥d9»“p~˜¢ÂWx*Ný»‘ŽñFÊd[Òí“tàŠŒ*#įÀJÈ*¿òe;GàæEˆÁÇú/oPWpRÁ6£V‚b³y*™×%Ü[;¿Â·Óá"B/¶¹ô1íãÁÁ WŒw/JˆCr >p®‹®²j¯ô…2ä·G,œÖ5¹I4Ò‚AßÇFTމp+¹˜¨¤Ú£&}7õу¾¹ôG­ûíe˜è­lV¬§Dü^œ¬Qâ÷׬ ÷Œ"2N²ã\•Ý‚PN÷¾!¬µ’õ}G/W¸¾«°ƒáƒøöq†Ö®ëw~?ðê‡æ+L¿‡„ûs+&݃Ŭ}1œ,üptÛ´b1ÏËÀSD#j*÷A|˜0ðͶ»óý}Éõ}Æ³×Ø¥ùnkWó!ÅöÆSÛÑ£9ú;Õ\ìû¬p£Ø¶4¬gRƒ›ÿFHˆð QHîˆMø§Ö€>ò8¸ÿʰz5–f³«’ÃpžVaÞەήòÈÚ‘Ž€*ÇÍ™™ÚoèÁ9¼ôO; Ïywlló_Žxíe—P,ñ‰ròig\1ßuçµçaýÇ%è¹:v>]´ÅW—’,ñÂB²ìúîÀl–bµfž ê¼zê%þ“ð©ZÎ9âšÃ] úªT ùNÜÜýwÐû endstream endobj 72 0 obj 3356 endobj 74 0 obj <> stream xœí]ÍŽä¸ ¾÷Sø ëϲÅÓ3]9OÒ@^ ?@^`÷’×eS¤Dж«ªÓUƒm,0;]Ò'’¢HŠöôÝŸ~íúîýÉtƒ±óŸqJþöîoè~yúÞ%òÒ{²Hî»ôß_þ ùí_O~ò§ºèÂÉuo]þþŸî¯Oa8Y¢™`NC(ÈUÇ[g}8 ¹l¿uÎOóÿ‰Z¶ßº F"çŽ~8ù°3§ ÛÎ=c!z݃ðèª½ê ˆôô$ngÞ­'Þe€!rÕ‘Á¹lghD-ÛŒOM¬+H©V3©Úcœ-טèíÖ« L9ìÑü¨$ƒ¨²ãÒ-ÆX¶©_%[Ü%°chÜuªûó×wÞóëÓ8ÏÙEëæúú÷îOgß™¾{ýg÷“íî^ÿýç_ö‰ôS?,ÃÌ&èˆëÐ4ÏK3œÆÜàø„Y:^^Ÿ¾3f†16a˜6ˆÍ£ú #T0fcmsŠþ +µyˆol¥få…?EÆÕ¼È Çzé;` ˜¾·§©-Ïy9/ödÄBkÀý¤‰äËò›ñ~}S§qƒ2MïthóÆ3fV\,r…S4°úÓËÅ0žµpLÝ0 óY`„n\¥ä`—G—‡ì±/ðJɰ'@lQÁJ ïÏ0ì8+Kµ–bžgøQa žáDrÞ›Xt€¶( ‹qÖÿŠa®g«·_9a\ [›Ôb¾5Pð'Ye™¹'99ýT ~þYCY¨’\t©Åޝe`Ð}^ܤ͢Ö÷„Þ¿ìÉV®VL¸•ãÐ¥ª¿p¤=× Û§Lê“ÆslÛ¶àJpÐ,Y´£\m{U)ý“£(ga+q¸DõDüúVÿd`?1ª/(¤]”Ûü€Ò·`Hçè†<‰±«Ã![Ò@k=³0–[çÀφٷ4 î™OêaŽ,fçØNÕÓ'ƒ$'ñÆdN1Mì,\¶fÍbµ/°ØÙ™gg‘#µæã¢ƒ`Íõ…/Ù°¹ó¹˜è™/€ÿvG1 °^[ñþê@+):m¹ÞOìܰ“@7­A3.Ðõ…ê­ÁWÄ^¡ŸÙ ç>ìhÓ>tiÏ®†-“#ÍíÍQ«Ž9‚-†Zܵmˆ×yiæ±’óXH®:pp$¯íy™'CÀ¡‰È‘ ƒôº'Ï@ðCctd=ɸâÕHlÉ·üûöÊk¾ÐA‚Ókà…€QÜ8ôEû0{i6¹E¯uÔôÔsiD˜ˆ ›ÃÄX«´™ãvU&¸O€ïP :pé ÏZ„râ'"ðÈ?a™&”ëW>¤YmiVŒ!ƒáÐãòÕØNDU""±.ØñVh;†tÀÝYöQ[¼`ϸ^LËeïxÊK¨( z:8 iF鋨%ǹºŸ¶ÐÒ»ô™ P·‡ˆ3ÙY¤jP˜’;ò©Cÿg?‘ H&]©„GÉ7°î¼‡T2YHŸóÔFPÿ鸖ñôi©>^ËôVÇ!åHTKJ’À‰IRÓ3-¹¢!3t·ôV Å5 .u­k‚«5Íï ÅÛÆr‡š‡:ð!=ÿ>áøbFþ„’f¢TÏŠaÚ>gÅ âc³b­}cÆ|Åä³*Á5Vq³œ­*¨W·Aº0i ÚgÓbêŽÒ€1¦diÃ61=75” I&ò-\“ψFê+Õ5Û㜛ékºÇ é¾j«P*¦?%Ý]ÓG67—ìRL)½LN%1%µl¯õ.¾ –íTÍ2¦R'"W©T¥@²Ö²¬ÃR»Ør°D,D®:ÝPUóx¢g8CQ®Sö¡(ÈY{L2aˆpi@ $–mD‡Ô²MØ\u2¤C‡çâ4’W,¹êÈè zÕøŠêDX<‘{f$!\Zˆ‰eÑ!µl6$W„ é¹cÞES =mÚø !zÕøˆ^uBz î!ŒBf^ Hn[hU;'–;km–z ­^¯t'–ºU@©‚9²/·÷ÅžfnkF„göÈ1Û[roKl+eÖÏ-¡9fŠö Âþ†ÜÛ¨‚¾²t¢n ¹µä6‰Ù¬†Eà6CìL¶sbÞ§¥A©7Ey¸ÑYWl‹ª‡ž QvÐÅÖ¨zè \Âe…”!'cŸ¯õïWH94a¼k!eŠJ[“<\)¥×„r¼”’Ý‘ ä~_PL¹øŽM±¼o1eT¦Ù*¦L~¯Fq•ôÑå”Cº*÷ÁÕÙ‘Ò–"j}¥¸¼a±ÕF}å¬ã9%tú(¢:Rä[üxYP)22¼ŠÁ³®È·ˆ+]¤ò"JÕîTgç¤ä>&Of£Í±ꜚ*Œ‘LÚÊÚ(ÀOŒã „È#ùÚÁ kcýò–ýRam6ë«cz%Ü:›j$×ÏêAƒ*)‘º–+ôªã­³q(©Eó-•œ•´¢ùÖU –BºµÃ„T?‡_¡„6Vß"`¹ê\D-š€‹hEquíHÍH°Ö&¢ÊÔËö ‰hÔZ…ZÑ =Ëz̲ƒÉ©0=Ñ«DÔ¢ ˆV4”˜7ó¨DÑP)hV’…èÊјÆü¶ ˆS­¯;*£Ë.smªu|GÍt‰gNO宀ådÊ+´¥Ö%{QÔëZ‘È&€(¤EMøÎwy%©µ}>´ïTI:¥—YZ0Þó;½kNqK){ië‚âÅ:Òtú5Eò±u¤>¦Ï6…¢Ö‘•cû_,Q+@õb\½”‰N‹ômx BŸP|6ý½|5¬WMŠ"Iöòþ}4ó/*½Ó½·z§qÁ½·^‘rsÑhKØŸáÈ$“o{7&}^„Ã15º‡Ã-áê½÷áø™‡f騸LS9j¦ÇÈ%ÞrM.¾`!.ÉU ”Y<ÕÀÁßÐÀ.É/¨+£Kòãip]úëj„ô/Hè# ¿ ]˜ 1ßú qwPõ“8zF¸1ŠÏÙì20Š”íáÂâ˜RZ¼Qð‰‚2×3ùr "5¬W4£…¢ÒT½ÂW}Ÿ &¦DÙ~ññÆÄ²Ö@Tî°]}kñ÷â¢ùño+³UË[.(³U«9ß·ÌÖ§4CCP;e¶fùÇ>jõ¼pã±Êl[Ûá3ºèêèânLúŒ.*_øaÄð`Ñ…Î1i—c?´tìÑâíÔô‘°ßíʾ…âš+{õë¨ë•}kšý+{tõZßCC6{ÆÁ59nÎà⽿¿cèß*SïÎõ6àŠk«M{˵ÿþ'ÒÚ×þ#Gçj.©ŸH›ò¿Îa™Æ$ ø6it¾:!¯Iw“¦t‘Кæ Â|“¦Â¦ë¥ÖÙnˆ»SK¼5¨Iúß4ͼ ì{÷?¶¨_m endstream endobj 75 0 obj 3455 endobj 77 0 obj <> stream xœí\Ùnì6}÷Wè9ÀôpÕ\ðÖyÎŒùdâÉËü~$±ªHV±¬nomû 0.·bm¤È££6Ýÿ¯þìL÷s°]oÝüw˜–¿ýÚýç‡î«Ÿ»¥¹Ìa„öh‘šM·üû×OðŸ¿þwåFwðÝàìü÷±‹Ñ”~ïþ}ûÃ@ÖÇCˆEkUñØ•¢–f(›0k‘DÛE”©eQsUA©9•C§HŠC‘4§fV´×5(Ÿ å iÂ/EOæO°Œ4) £Ñm»k¯àPˆ^áðÚ%Ep)Ô$8eŽšXv”27Wý4œæñ¿tÿ<†Îšîá¿Ý7sm†»‡ß®¬™]b–Öo.Õôó¤©ÂôP=` ­Y‹áÐcE„#VXè.õ¸¸ú™)j£[­|©®ý†®×uàºNµ®Å~­ðó2…·iª2¤Zw¼…”qÏ#=°‡‰•i0Gç~N©¶OÍ-Îê`’I™¤.nGZ8\ºâ¾žA8bà ¬‡yË{ÔsØÍUqšƒØO~ÖõTìÆ”|G“,£¬¸fI`’V–ÐóeaÉ7>;;™º¬&#Öþ÷”ŒB¨õPAuLªã,`Zî!†ÏU¹b\u£/q?.û\ÃÉ7+dœã˜^¨˜ó¼‡Ð´çaà=ìÄ…öíœÍÖ Åä{ÍWGŸRô–‹ä¦‘H§™æ„Œ¦¤¦=7_X+<ƶ¢<$`:Ðò´è»1.O¬‹GÐÌ2„µrZ}/6žtr38=!¼¦©9Rü{5vÜ«Ò<±©så…P}8­‡UwÈ¡q¿çÐç"Œ›w™ ²LM*qHäÛßbýqKSéd}îS7@úO§gÙ0Ÿö÷,{÷,Ó±ºBhdC(-i:Â33oZžµN‹ë-3Ny².eïÑ–$2æÑUØ4Àñ3YÑCÍÓq¹¶´ð7|Ú³ ùÞ³>h³X³ÞNÓ„RÇZUWx̱>'ï5LM;@`.^“rñ…×8…z]†Á”˜¸Pv€vü]8éšÉÁ¢!dœg³À:ò´çhÕxHËâî6± ÙC8ðH+†[â&7]±k ²¾VV]#ÎwÏ”66­1Œ+>ÖnÍ=¼º§~¹·5f1¸¯Sna»²žŇœÒÓŽu³3rƒ&œ4ò{ê 7N«ÍâœEEòCÌÙÌ'“{Þó”»éi¶#×x„­R?ÉÐm†;®Q-¼­ê°ÿ9g9€ ¿ŠÞÎÉ—¬~,ð+‰|†i8ÄØÅùê0$q…Ü ¼fÃò?ê`çU{Uñع°x«h¯*;ÆŠ+:Ô5]­ÒÒkúew¡ŽÔêPcY&í¨µ,gݨ¹ªÈšQ;VÌþ®¼—Ê…÷°h“Û« Ò/·WYÃÜ¡®É: Ðy¥Bø–½Yx7½›yè7}Ÿ EVœšÂ c¯†Ž…–Æc(Ëœ«ýV­”܃f8 KžÅsJ:š¸‰Æâ…Û:¬·¿–¯ˆœÎ7›YJkØLþ éåGE>á¤q:˜ªÃæÁ-({càÞPðý KÔ\P­™‡5ÃrÍŸ÷Û»S§ñƒ2 <´ZcÖW'q0\10«ï(ðP6Òö¦¡¡G¿¼à‹Q€òy—5: 8˜£®n‚¥âÃò¢Å/|ýåø0)ÔY:Þ©RHy«j"n«d'Z(/|Æ”oÓË›¥VdÔu—b¶!aʶ±ÎrSÔUgã2SCó÷*܃¦¼T´fÐ4÷ù§à›^“øEk3ËÞs1' ÀS{@ø'Œ;rBS®‡Äs°Âá]FT­U0¡ÖÛÈhÛ«ìÃ@i'–ªHoŽÑ„nÂ~Ì 6nØSh0”&áØ¦½¥'h ßû¦#Š0R3=—ÜVìôáSû^®ëNîãä¾–Owr_‹Üâ²¹?œ¼¨\>]ð¢C"§/ìØ9À‹<¿Lú_# ;ýï4Å ÿ]>úß©æKÓÿBXäžC;ý{¼ý/øEÞGÈ21íös ²,¨“òE¨ç˜ºÔ_’cQ3m;Øò1®¼ðú"Ôéy%z úd×éA.âÑ|ß§ÞqŸú4Ò`¦¼Å\ üliñ ðÓ«@o?[Ó|uð“¥£&îd‘Ïøê!Hª*Ÿ”O0_ß–Qú¼´±h|?Íc^Ê(5*¿he”¶f‘MéY²1Ñsì ]‚tÏ–‘_4ÇìÁœÒó)¤tÿœR7.HŸC!õóÕ!D8(gŠ!uH4Á¢½ª@*`Ñ^UׯèP×›¯è5vyì …4•ˆBŠ 5–eÒŽZËrÖš«Š¬µCÅâïÒ{PÎÞ£I›¢½ª@ýŠöª‚4,:Ô5¤£PœW*ÔˆoÙ›…wÓ»ÙúMßgCeVœšÂ uÎÀx-t,´y<.„2çj¿U+%¯šá| ©÷—¤¶Ôxu ik’I!måÒfX^ŸBÚ Ì…Ô¯l¦Ú%H¤ÞHpâèê*ðøº„O‹ÜÑpvýº`x°S¯åG«µ$gÍœPýTN¨ ʰ3|¡ÚyœÐ¾åè N¨›¶oýïÁ m¥ÈÎ Í»óÊ ½˜“vNhIi¼|>9'ô”MçÃ8ðƒpB[[û›sBzNèIOõÄ•êú}t1X´¥Ås`Q±Â¢­iNù®Þ‰ïê=îÜæ+¾Æù(ú?Öá+ø,§zr'}>Eú´+]ë Ò§s|Õ¹æÉZ"ª#6c1·VÈKÌÍP¶nýàhŸ©˜‰ŸØŒ²¨¹ª áԜʋ¡>@¡HšS3+Úë”Ïò…4á—¢'óÊO°¬Ð$”~ÃñmËk¿äÁÁÂéµ[ŠS¸Iô¹„Pgü­O}¹®;!”B[>Ý ¡-B¨3N|H¥‚(ì‘ñLE?© Ê›ð;uLE|VËù®[üΖWw~çI‡/Àï¼|ô¿ ÎË—æwÚÉóÏ÷zýúÎùvÜ÷©·ß§Þ”ßµi·÷—±÷ ƒ†°ÿ”ñö©OÃï´‘׋Á˜R‡ç€˜ú»ÆÄ”“|zs§n¾>uÓZú Ù—P7õwö+u³5‹äFÞÁÚf;DñK ð.''l†çô˜=ký€Ù©ò?àBpj§”{ "XஜO±LÙŽž)—Ä2U8˜à}’ó¦ì=¡à—’SF góKU-1L)í †ië·JˆìØ~ž#…TNç#›Äø'¨Ç å¤5Í5¡-O§­˜…×’`ÀðHw/g‡õ÷5…PH ¬TÀ{¿mDÑ) endstream endobj 78 0 obj 2832 endobj 80 0 obj <> stream xœí]Ùn,¹ }÷WÔs€t´Ö ðÖyžÄ@~ “A<ÀÌK~?¥EI¤ØUÝn»ìëÆŒ«¤Hj㑪U÷¿»ß;ÕýYt×k3ÿ¦ð÷_»ü©ûíî—.÷ƒÅòÞ «.üûÛ_á?üûÎMÃÁûn°þ`»×Î{}0)ùßîïw~8 ¹XÏÅei™~íŒóW”–é×κñ0•«Œ×®’$”§ ÕœO²¥$È6æb%W(].¯2²|¹B“%Ì5 'è»Ð^Lfí¥â(P.-ÓI¾\Z¦Qº\\e l”uV^! ·kU¹6¬Ù¢Û¢'ž˜ÞlÑ}ÑWO}Ãl3N©Ê8HC45pA#‡Ê+=–&ŸÌ#ŽHqÀþÞáP|x¹}ðpcç¿/ÿìþrtVÝË¿ºŸŒú¹{ùÏÝ0·T¡è'Õ/ý¡OC¬Iý°$ý£’¨ä½“ÄxæãO/Q±ÏâÂâÂ<¸›’P#88…ÅÊžèÜ‘Ò`’R9,s^ÚÄÄ Æâ³1¹5–ÁšŠµõ!˜Q”×9¯]Eo ïÄŒùTèíS:qð¹B"˜+Ô9È"Wˆ~ o¦.Äö ­\Ze$Ú¤q>“âº)«RÍlêW)J¥;  ô›è¥hÆ,U_)¦´5š>“?+\ÕOsÓ°I©ã÷à¬óž…FÈî…FÈßÑ5좎öféæ[e•‚m,ˆ#9¦ZÖ‚GZ³qx„©ÄK4¸X4ìƒDq&½^ÏJÐ) VÂ5G½(“:¹néõ ìQ,.åH Nò‘Ö¨yœˆÜM³ýäRDíA)”ŠÅ5h°äŒ v…mìØ®T¢WJÉ[ÌA);ój¨YÞFÃŒ~å°€¡¢d›ä¶¢áht‰G¨V §äù̆G£«s6d5`T¥a ¤á%ÁxzÅ&$.Œ®A#¬k,8ÃϰŒÆl'.iO»/‡xXÔ}vR†U¨áýì#û[ºÏÄh°Þr¶ÔúŠz•>\¸¼Þ¯BŽJk©½ÐïZ+ØÔP¨¼V  ‘ð¹0ŒLÚ|zæí²Þ` ôtzƒaZÑ~ç‡ zÁ¨ïçWaH vgÕLtûÇnµR.üòè‡C(:¬ ­@(Î…eñå<…#"ë÷~´»b• c¶epËû‚·ØîWÙŠ€»^Î$%Çjùö ú.€Ð뿯;ˆ÷†è¨Ù'DˆÖ#¯[¢ÆÌ~‹¼^߇~HŒhÚîevÚç™À÷ò²4’}ÈLû¼”ø^>ôu1"§]ždvÈZR\‚­¼@h±YLjð$¬-‡>œ¨$*>Ó‰™öÄDžžOŠ—ñ[÷D¼3ðWYÇrÆñŠhêKˆÿ fA‘”¤I2ÁßÉ’;¿+’%¾ YA²¦a¥‰Ä.½¸z ’eÄ0Ì‚dµ¸¬ƒ76Mœ8Sƒƒad"'í‘ÎO€ º"Дf"׌Çì4¹ŸºÔ„r?K6‘ñQ»‹Á&ÔC¨ ǃšÌÌwÔ¾ b2IX°@’¢¼ÎI@HQ2lÀf|ŠÉ >¥âD ‹« ¤ŽÅ1º; ð1…²§B ”K«ŒDš4F±3%®”¢&ÕȆ.•bTƒöí.× )ƒ uW)Í‹ÖFÚçBOÖâkÛO=½]ÖôD¡§–NoÐS %±FÈKmvÌs=É0s%Ü3 ˆl|ëȎìÐヲ·l¾ ‡ð–šOÃW6_újo€½A>ßòÙßúß"æõ žë½jL~7º¾}s„Ç*sÃ?`¦ú‘3ÙJ¸ÃLõe3 óÑìeg„§%Å%Ï(q‰O‹Í:ÂÃð8p9‚È »|Êg8oaÈ·-N}*jèùÒûâ.äQΉ·Zg /ìÃXì Ñ¥ÈËÆ7DÆÂÓâ7á.b”fÁ]8­×)::…O,}u Ý`(yÃB!˜z:Í"Kòò‡A=«˜Ö0Oþ¼FÛð22†­Ç·[ýá£S|ùp{Læä§âøû\Z¦_;ãÕ¾Çâ*¿MŸË« üî|.‡ =šCŸú’øÓX¥)Š« ”¯¨Pç „E:e,j¤«gm£c2k0ƒHXZ¦³„X\edù°¼ÊÈÒQæ¨ÀBnݪrm^·E¿E_˜ýÝ6”ýe>â¶™¨ÔIe"¤!‘š9ÓHv­|±Òe9tryæqþO èiJ{›½~aĸêO 8É[~ì@Ö©­?Ð4Ê?Ð4Ëõ¡i+¶Y~!øÍ@EÛã'ôÀâ-p%·/ ¨aõ ùìÉ XèœAB.ahâK™õÏîÓžÐoýKß%^GªÄî7ô¹Ó÷äùGWß¼ ñÓþëoz©¿$yÁû„aÄåšÂþf`Á{1ⳋ» 8ûöOònú¢¼YéM¿SLð‚Þ\‚ã2ƒQâ påŸÔU{ûe~Š`Vlèñ±Ä[P·"BMVšf£Žéºai5Ùm Ôº\û%íð>èWP?LÝDÖý÷S?‹›oè¸åt>¨¦¡üU{Y¿®zÉÌD³ ÖŽ#±}ýö'þ´Ek©bkè^^ËïìÙ/}±‹b[ÌÓ‘K½D_v†&ZR\MÈ›åšh±Y‡&`°“yfÁîÕ/lñ`wÜ1 B¸t‚ÃòÌ ëŸÔZÿ8}úAŸ†ÈˆÃÇü8NÁW‰ã{|ªgÈ`È1õt·2;{ Šäq,ÉbRsµ›{ ‚!ž£µòË÷Ä94ð۩º¶wó á:oƒ(LŽ-!ºýÏ­šx endstream endobj 81 0 obj 3242 endobj 83 0 obj <> stream xœuŽË Â0E÷ùŠ»Œ3©I(‚v_ø>À…`7þ¾y"”–À,Μ;„¯ø€°%É0¬Â´.ÎéŽëïÆ7=ÅÉ m¤…vÒÁß°XÁ?ÐÑåÿmøH1ê¨OÀJUÁP€© !N¨÷bœÕ8 kK5Ç"±Ur^S0iÙ.:rkÒìà öÿÛWïb¶R/IYÍ+ 9Fü“Lv endstream endobj 84 0 obj 158 endobj 86 0 obj <> stream xœí]ÛŽã¸}ï¯Ðs€8¢HI°Оi¿/Ð@~ `d_òû‘l^ä:U*’’{º'» 0‰¤ŠU§îtÛü÷å?MÛü¹=™f0Ýüç8-þþæojþ}ûÇåÿßÿõryé§ÓÐŒíÔ¼ÿ½ùËÕ6¦?¹æýŸÍ/ûkóþÛËÛû˯䕳Yæd^i‡Û+Ë_Ûåé^oó&&?ÒŽ÷‘v^Õ\n#ãɆ:‹ù~gYÖ|»¸S^ê¼ñ­«Kš¶»/l,}!.Óö0©ñ›Äuá{Œó [™¯d¯ß$Ú÷Ãil†©½Ó¾kL{£¼±~ѸQ׾݆¦D´¾µá8âcC³§>ŒÝ·7¤óm ~ õßCÎÔÎaàN%OÇZ?eœã¾¹Î0ƽv÷EMŸù†ßÕ@·Iêui 6®ÌIãxÒç™êœˆC7Òõž|8~_iÒnþ/pø÷væ×†yaåðBÚÊÙo6žô7žˆâ9†` i†¸KØÃðxЉ½ºÎÏ2¥gz? l|ÍêI ýÚg Œ˜ ã¡7AšéŽpFzc†Ø‡7¢hv“y òn¤ýÏî–û8Šô¿Rê½úOBÐ#Gvì™Ä9T‘·è¢dÈ+SfSQ¤=ÈÅ]8¿Jâ OëÉ&¿ÓQÚº³„¨°p»m󖛿-â­ôF‚ýWOõðq´@U@o8gþ=þï¼±\&.‘ÏÇg¬q±‘žPUßD9ƒnÄ\LÔî–§Ö1\«oåÇ‹‹¬%Šænó˜1°¿kLw‡V㹆XŽ"(gÄ.j€›Ôïl¥%[ª6}"š¹„éoÑ­àðnޱŒ‡ƒŠœ&Œ$lý1 dyßÖrüݳÈô¸oéúišÿ$úíÍÏA6²!wT¸ƒO ̰¨M\¥Yµ5ÀÒj|(ê)"¾ëÚh{GµLÕ#jÔ‰.‹ŒÂd¿£õTnœëdº¤.˜1S‰ ~U%`Gô`ýPŽ:¯i "µó{óF³¡Ÿè <ᣠ`Øå€(9cø7* `ždà)*IXe‹?tïˆ`ù+eíKu镸K`•ŒcÌó\9̵Ã<-º²^»ãô,Ezœ`ê ~&‚ê’DzR⌴Š+KN´â„îtBÃ!Ž¹Ä F3Xä¦råJ=SΕ¨Ø§Õ}„Ù³ºöÄÀp®iôc¸e#œPÀ/r»%GÈA·†öƒCAð: `µ*êíÇÒŽH`…¨: í§ ÑhÃ]ì›_k>9"²•²IA‘d°&Äûн´ñò´Úó¥4Çú„Dšá C7ç(¢O fs‰›[ =XhÔ–%„3”Ã~9½2gâ¢ÛYe溑a¬]Îb’c½Åì)=BÝ‚DSŒ>‘Êma1™žaÚ~“åÃ^-ÀP“@’lmÚ²õ ËE `¾Â׿ú=†’çàÙÏD˜°=ú¶_8 õXî4""WBü)~ÂW³‘¶ÝØ/f%ùiò‹Þ´p“•BÃY Ž¢Â}KTZ¸ÌdÁ¹%v̉>x‹”ÌCViU¦!å ÌR$–Úoê±R»®"E^šÖFw¡ÊŠ,?M=ôÇ 8¢@V/äþè'êÑõuƒT”[q‹´ ?Z‡ªŽn ´±z@Q݈q¦½©¬Ö-#䊕á‘ñþoü÷#;4µtOEÍ´.v2þŠ&›qµ覱®ÆŠ» Õ‹WÊ+ÖPaYÏîÓŽ¨ËÞ´]é ?¦º¾³þ@’ý“Ñ£5ÎÁ *`m܉ж,Rjàjz¬I îd‡)SŒFlòA±2C‰Òû'/~ÑqÃÖ•N•fn"›|xè„yd½˜ƒ×ûˆ š5Ü/–N«ºjÃØYtPµêˆmQ¹ˆ£û³‡D ÊÝŒZcûFPrBš¨*s­IÉÙÙ(×Ù°rª®«Òƒ9ý%R±PœÔE­‘”Lÿ² êv©îâ0ZƒõÖaåü1×…Øð•Ræ@•ðìËÿRþ7”i:I‡×´IÈu-¢‘]Žf¥-µ5jºM¤gƒŸÂïûû+`w“­….Àžl¦]ãuì`¤_ ¹j!»Å¸Rrwd§P†*«;µ=/~yLwÿ´Ñ'6\3ŠÜ/×~q¬€¶ºPÔ“^ãuà‡ ûì/†ÌÒúªÚjÃ@n1Ñp’fÝ<$/`ݲ!ÐÆÔm“àŽ†Õű²¹³¿¸Wûç•ð=]dG&cžtEã^ÖÙß$Vše:òcwd™áܸ¥“€\Áþs[s™ëW‘¯ Zr weó¡]Ô×h‘“O /¸B%j÷ÉiÎt”¹u¤›é㌈8öËðѵ‚k Ÿâ<èõ85Ñn:ç,o´éÆLA^Ddïõ]Dr‹&650EwÛÕòvX¶õˆƒÝ”(%Wá)HÚ'›S™= š •áˆéµ+ª÷šseŸ m"Œ–öÃaF‡&÷ŠüÕŽ¸²ë¾•ÚÛÆlqMu„e׸_ fþ¤»ø÷dïV½ñ>#‹Ãòyï­/–„R?ZkÊÎÎ>wDñ°©Yœ½#K2òQ ìWLIÀ2W+sYåI¼”AJ°à>ÚAÚ/ºWhz®ñMk®ŠbN^¿@öiÙꬣS Dµ††)‹#:zCÞ%æ‘‘k«¤?ÁW¶èl2ê4t´ËO-¼«±Xz½—æ;è6óñ±— *é¬À©ë)É ñ»øðjÜŸëÊÓWÝ”hí(›;ïžÜUpœyùŒ‚Ó’Û”¹—­RXhÅ"¦²Ý™qöE³nUvŒQ—qm%5‚jBßÌ-MK&ÍoÈҟܺË9'ÂrD ¥ªttEM¨5„jÇÕ³ ‰­Ÿ#9âºÁY³ŸGeî®ýûJ9·ÃÓPZ%dVa>ý®WE>ôF€q ùÍ©¯Tx+dj¼¯êÒ‹3,]j6)Ád­H»Œ­"ܬuÈŸÜkÒ’©‹3׋,‡¼šŸ”•ä€Sýª¥2®Ý¬øâÈèÞG³‚±K]Fn¶Æm‹´€ØÙpÕ˜_Bìà©åäe·JëSš[¥Æñ&6i5pnXòÝÔ¢”W×Ä.˜tÎõk;¸Â¦¬ ³Ê%Ÿk/È_ÌõÝOAÎ}eq\ý@ŠÉg4µ·ß€Ãe^ý$‘Ó7.®[*ʹ9•"¬ʑ⾌Ynd&5Ù˜¸Íñkó?]—·} endstream endobj 87 0 obj 3305 endobj 89 0 obj <> stream xœíÙŽäÆí½¿BÏ2VRF€éÝyÛx€|À$v`ŒxóàßO±n‘¢Jê9ÒŒÝU©E‹Å›%ç߇qøÓx'+¤ÿ{rð÷× ûnøWøþÿúËéüx2ön”1wjxüûðýƒÄ8<þ<ü õŸ‡Ç_O“Òÿðƒø†6 Ç) õÝœoˆpCù‰Ò µP¹+.K„& ÝN7¤:á ”ÃÓäye†›Ã¹€¨DHÁœ°š;—×6¥' »D,žt´žØ &V˜¼éÙË€Š šKšDžÜ BPpnÍdEä›^ß>¿‘6È`*$GB‰Eˆ,kù8·o¾¬Q«Ân´quÝ„»„Ud]”™o?»CÌÚ¨±2©†[J ïÓÉMûÂ=4,уKú›-Ïø9á(¦èœ€¦ºgçD¸«¸ Õ‰6Wõ¯^¹DÝ´›\*>h§—T¬kY³í=Ñ’SZ;Ú²Ëãé ¶íjö²°fÜÖ5˜à´ò/Aúê.U’Wù—E²ÜÈfÞìât)Ôrc}÷vY`‘f%¬ØB*aÄaJˆzbóD-OöT /¤,6·1–—"±è  FŸ©x)¡ÓÒ¼u˜T‹Û–oÂp–CØ‘¤N¸ª…Å»‹»—Š*ï:ºA”Ie”¬ë¢“>™z©Û¥’O”þ²Í ¢=÷ùr^K•¨¬Ú‡%Ô°&R¬[ÈžQUH—Œ¹¨ÌÛcœ¼I‹O‰©*¤Ó£tâ>Ü—¦ò–¸‹{¤JzÈ'ªµéAQã =&b¼”ã’ð›‚N:ÿ'«‘Ÿ·/H=›ÑðsoÆÜ›V¹71ÜS˜{ ¯Â6ÜçÌ?ÃÂÙÊÎrï,?ev–D¦  dˆ¥;{ñù1Àó.«oC¯0‡\°Ï©(MZøuî³L$h^Ó@ )UÁžÎJ؆N ´#¥øÜ£¼ŸôQ‹¬*6~ë.ÈÔeåéÀ:¸±R (y{•ª‡KÝ&ÆŽìÆ%ùð:à–´Qìë–fº{H¶ÌÙŠÝõùVJ„–FÄso`Î'¬ø¾}hîøzííDÖ±akbÃâ?šØ°Äs²}Û%ÖR|Õªm+ €7š¸¬°²(„>™8`(2hÚ §N“žUŸÇhÜêÊò#²€éûÅ#TD«û(ht[{)Œ e¢ã¥yª1䱓†„Gk™ZžéQLzF°ÁIÏHm»²‘U·•µ'«¤•%¶TÇF-×»&®æÍ9&ÖXS·Ä­VmCϜ̆fT¯¹¾Ÿ«;ê舓Zqt\ÚÀ:º•ÈK|¬òÆ–¸0ªk‰‹ôVKÜ·Ã¥huŸ¨ß+:$Þ¾áè"Óјþ+ M¬tÑjcM×´Ý(¶¦î= 1)Ï3‚´× º¥ÃÝyëAsR5³ó[Œ®÷ièãjþŽŠÐƒ"%•횪0ê’èoŒÀJ5´ö~^6Û_ïx…v^ÏŽ?¹ötpº’! J¦9M“ïp#gOK}·Woö•üš’ábˆcán_ÕúA÷áN™:s¶t‚m“Š–Á–ÚÁu¬¯“Kˆšîm"ÖsGñ™DÑÛ»w²©¼k¸ðVÊ#ÐjYæîE£@9-ñF¥¶gr)UmhÞZmR§âpuÔµ8ÌlªÎ ØU4ÂtN7&¼ó¼tu‹«ØÄu+ù;Εõ{ržk9 ôqJY nEÔàHu×síVî|B›@Â'E )x,™§§.Ù&Ön¦þ¬ã¢eSÿ—%dc5O)äæUˆWÖ¼Âk¶(ʶ}°¨°QA«–Û„×9ƒõJ›•£B¬b–eµ$ç`Hù‚8Ñ®Zh±]ç­%-KÕd[ú­jn7ÖÕ,ʪIzêD5kFxT5˾ïPL<9¤˜âÿD17ŽK¶­¸ÛSÖ5ʸٗxP´îÄ× Ô”5W¨©-ý¯<¨hÊ6UQ›#2×ùPád®ìTÕâµU•œèájŒ¢®¨Ü+d©dOp£‘Ë9,CfgU¸«ÑõeÊÝWíÛùJÈ‹Âã£õÚTÖ3máÔf\µ¬'Õ5"&ÁØlQ q6Kh97 ³Š›¶š8å ÜŠíþGÍžäÁè¸øÐì·ÐìG}{Ž:ã²MÐ[g-û¾l‚x°ÒOaCl­·õÓÈÜØÛ«ŸâÆô³–:Õúó\á~5æÛXýž;q8ÝJú‡÷}+ï‹p;¯}Oß[ÑUßÛ z¹ïUâhT]!>tû­tûÃÿ~øßÒbåL•–Qؚϻ*dÍñïò˜Í÷Tm[ôNí?$µÿ<:_«d¨7ï÷ ´z)òiÈÚÆ!j‰c`“D±ízæúXåâ/|SëG8L›°Ôæw©£ìÃÊiÿ¾iâÞ Ý8ñB2à ÎÎ;8Ë¿Š`è H*„¹³Ë•c–äˆ{7‡Û‚)·ƒø+/øpCm¨)Úñ,98Å¿Ž¥GÆÊu‰WâIYr­f±#4ìÚùF{ Ë¸¦k.ãJ>§A®¹i‡= Ç4ªHlô­M“Ï·÷ÍÙ£ñʹ†#s£¨®X·kH4ŠV ‰M\:ÞçÿàõE˜”Öƒvà¡~;) ñf©¨2#O×Îò=å‘ó!Œ/ùyLñêé¤,Hcº?ÃrÒóñ:cŠ£8G€HsšžNÿ<ýüÝ)®û¯?üáÿüÅÿë7@ûOô}€{˜…¦};§½GÁBóÖ yP'$ï¢"›So¤Î‘Å!äºtH §=‡¥˜=àZŽà̧FÓõ |xÊ#7yñy;BŽñÄë§“´Ð¤H¿ÌQ¿¦zqÅQœ%@„¹ EÛ²që”SÉá%3OÍWCöJF²¢¨Ù :Þñ aà_ñ•!O6“jêPÈ+L—æ" ¾A(#Zñ°!À:|/ÀXˆ;;éÐ#$…MRõ:°þ)ìH"„ Y\įŸNÚB@’~™K‚×WÅYDš½¡k[¿•PÖ¡?iÜH:UJª`(¬‘P$Á¼)d1¼DƵ˜«ín gÅõµ%\)¨ ØðÉ!ïÃAº8’êfV»zm!ðzÊ£)¼Ü!fˆ†®pí¡W—~™‚¬Dˆxp¥Q˜%AÄÏ5tuÜø7²‚5gn=k1}©Zá°t¾•£VrœCÊÿGj„p\‡l=]K( =å‘_Ÿ„†•$\áÂ!à^úe®'ˆxqÅQœ%BÄÙºzÁÜ·±‚)/wj NIÁ}ÎwÙ}')@1)¨èÇúöžï§hÞ4'Œû ]%¿ þÕ3°îÙ³TÒðÈË¢ VD>*¡˜ sëøgEä½Á Ùð&ÚóIpêÂJfWäVOGƒ¿³×ïL ¬ !\”Ñ™ÏPc5:Jƒš|¾mÆÀ75ÅÌz ¨9s4„ª^ƒf°F«DOȘm”¶ÿöêß›’•ŒÎÁž˜¦‹weFGý€…NŽdZÞXû&›g›s=É]]–A É"ËKa¨Ý|…l+jA1õšëNTM¦‘¸uØËx‰›•a qX²”ËðE œ­=¾'婹4A´qþucdêPE3J :aBçã’•]HqIqQº4$ÛÈF«¶¡.ÕœEÄc£ ×2‘zò}‡¡„ªž-# ïÕ©zCTo]–J—tXº2!z7ǹpÿ{øÂ'D¡Šh¢ÿ± c¢·‰#ðßàyµ}XŽÒ“ ,ÙK• IôcEÒ$R2 â!Â`]˜4W Qzp#Ïÿeø/Ìâ?< endstream endobj 90 0 obj 3202 endobj 91 0 obj <> stream xœ3´0Ö³0U034Ó3SÈå2±4×3†qs \SS#¢Cˆjt>T9W—Bš·1ˆ endstream endobj 92 0 obj <> endobj 94 0 obj <> stream xœíZÛŠ#7}Ÿ¯èç@œÖ¥/‚ea¼3~_0är<²/ùý•ݺ´ëTuu·ía I``å–Tª:uê"µÍ¿/ÿ4mós{0Molü;„Ëßo¿7¿þÔü}ýñòÿ·?_Žç—Á†f°.þ=ÿÖürê›Ðœÿh>µæssþëåýüò•̈‹Ý̰i¯SlwÒlü6þô©}O! ˜pãÔiÀZ3}=ýfÌ_®å÷ñúOŸWv0ÝÁßîÛ×MŽf˜>êë²]ÙºËó|šiÌAØ. õ™æL ûz¤¦˜¶œ›DÖlQ“T ýžç!ܤyW¾p}²ß Hà³ÖLQXËÓ@9Z6p9¼IûZª UöüÏ·¤ÏNÒg²\ýB—"b"™;oã[gm²m¨œF†²´oúŒ+û·YÂ"Ð1~Ö§lÕ9|˜>Š\Æ¥rú£{ÍX)¦9ó^rÆÉ}[—Üä¾uÆÿîûh÷µ! Eòù9 [E“]Vðê{v¸=¤¿ŒqOç—ƒä „U–ÁT dw-c·›/[cÃŽôò¼è°n¥Ãæ-e‡í.rõc—¼u¿´HÛ9ªë[Ó€ÁõMh(³ñ?ãMÑ|1ÚÌ·:‚*À;Aõ}Š „cG}Z J¸Æ©ºŸ#¢Js€Ù–TgoíQes! ô¼Åàü” UWÑã«ËS6Eh|¥F£.VÌx‘ºjÛàl©6Œ`Ä5¬\~=QMÂv>‰ˆäXÐkxŠVŠg@üÅÿ2€»ª¬@·ùÇdƒ|d‰?fñ\õGôhu ’hŸùÑÏû%ÓIIb­È™Î³”)'9Ë.*CIrö€jf=Õ,B2“Vr5ÃX}s‡µüâ]|áNHð_ÚâÍÈ‹ÉñIhÅžê+º*a mSL„(8‹O œimaÕ^üÞ ´ž—©5 ÖÂ+†JÁ h³eéÜ&Dc1dì`Gé d¾müZóÔʯŸ,1Okéûè0EY–Â/Ž‘5ï-¥ðR’ÈŒù¼­w™‚D–zbê$–—k’§Lž5±FRÞ™GÊeɽTÝìÀ¾uI¡’<죆ŸÔJÓJ:¦¯øÑ,Ý!Ñ2Ý<´ôhšU²Ò+òê0в+Æ ªµfˆ5%é¹5€¨hÓ73.“£Ü ê@)kV_{@’¹J¦!½e Ú(Ól÷FÎÔH¶k!¹~p¦¼®8 ÷ Ø.­©³©:/ð‡ [+‹T‡™ìïSïy¤¬rp\Ûßè$IlŸ#°–è `j1CD= Š ™zîJdóã…'cÔïöwö®Å«Y(16m¸0\Ÿ"mµ7ÇÀ6¬°vL±™~: sp\ÑîÚS"„ë@lø„û…ØÅFÓŠ1õæïÿW“é\ÁÙˆ1 ™¬ä¾‹!:´þãzþ˜–•3ñ-fýù†Ð¿ûñÆÚÎÕAR ü;‹¸6Ëš ÑŽW Sz,¸v]ûª5 Å8x§”éÞ0R Û®õÖ½oÈËJ½‚å"×½Ôú„ëf+nx—õQ Üö`¢ÄwçtZ>×a¨/,¸«ÕÕI\i1È £ÚsÐc‘Z=Gdz±#½¥€N5{J5Õ’· í5ÝÄm^Ó"¥]ÒJK˜¶‹1ž[#Ÿ¶t­ ˸E¯dÉ,j,ÌÌÞ,m¾ôæc, endstream endobj 95 0 obj 1748 endobj 97 0 obj <> stream xœÕ]o$·í}Å<螨¯‘€ €}^è[jý×&E°n‘ëCþ~EŠÒHÔh×nwƒÞηœ¥HФø¥±Z~?ü¶¨åOê‹~®~ýûò×ï–Ò—ø÷ë/‡Ç׃‹G¿¬*.¯[>=›ÜÑ.¯?/ßk÷ÃòúëáôzøI, €4w–(OKTøå÷ú3=utåÉSyüD¹ò¤¬RùIÅx$x=šò@òG^QQx/kV) zz.Ég‰RÙÀ²(f"¼635:\UV£^@‘!À/3cøA•Š0oÕ7–pâ%±à<+^oϲFlet®òŒ‘ˆTÍ[:Ò„ªèJ¨b8VÈ-VÛ|îD©$ç²öeŸ²diý¸¹ªN›;• ‡ Ê5L»<ÇücØDÆñSþ’Ê|Óz¢%Ûhƒï|\±½S ûßÃ*fvf‡aSÒ’ÅKÃLO£­u9ì°™›÷½ñµÅ™a³¸n”Vìv3tuv¯‹ÏL÷¨!ɘIé& º‹lº÷'àQ•@79 #ÑÑ9…fg/†MTÆ Æ,¦Qo ˜2ú¸gx#[há­4ÑÖíD •̨I·¿Ãч/*EŽ¡Õ7Ÿá$U9¨ûù¢&RúU:ë.,ºnGäY&73WxT m‡ h&RÃÿãŒ(—³'jÑRQ§]+](¬É<ïŒtZbú³¨ÄÒo˧Ó/ ÔòË¿—O¯_ÓwOÿZ"±úËÄõ÷ôïÏ ?·] "ßãAÎ ΣšÏ‹3&™°‡±£q^þqxunÓWιaoº½šNÊfkü0â{Tó ÊJ¦zLM 4Å·ì-$Œõ:/ yM[ƒýX@³£‚Jøù»™ÊïÃoT:$#ùÅZß„vS-µžuZóõƒP±}¾¢?»˜É…p‘¡¼Ÿ¸XQw`ˆ1;*×õw{~Sý)Ôðý-Î|HƒzE)"Ư´¡P$3)7&YÏ‹ñ#”[—µw{^£æ´²©þp2’™ÞÍ,GËqOòh»«ÑÀw$ß-8óÍIrî*ÀzX<§Üž˜6àñ—U[—\$Cç…¡˜·Ñá”1;*WÌ{~;&vè°Æ!¸ì„ciV¡áÁÊ\…oçë…цÓ4«¦5ðn8Õõ—Ö•k{/Ây"Wâì—B…IzÕÉ’ž“Î 2„Á!c L§°oï!Æì¨\ö§ûðÛ ¶¨3á!cêÿW!£:Γp­!ôq)=xA#ÅIHÁrÎ’2ö°Æ›¦ÈÈP)2LTZíe̎ʵ¤|~{~â“'™UerѧެƒÊ.†i‡Å·Ænëí°bÿ’ó’I$ËàʈkAúöÜvB´&ZÆ‘NG¡›Á¡¹Ñ÷ûàèŠ2† gh8öIÄøñ ó*†qB0!¸ñâûËeY@êÔóä\JÍAgŽeFå iŒ Æì¨\s‹{ðÛq [ÔÉd´•gèŠ[Œf,$£ÝϨ»y=[¯Xeî6Ù{k<¸öÖÜ7·×6àÌí p—zqìd2zq¼‹tØÅI1bGãJf¿·_3ئzíÇxý‡¶þ¬&šßAŒáÁ˜¼e<¬~>/S¤3½;¦’ï¤ 6ýM6ÍhîÓ×$Wwïˆ0”D².BJò /:Rðp(e1fGeJpšÍdGµ×eÍEЉèÞxBïò> --Îk9À½¯ cÇ0Ó·•gUR³(c —û=s”‘éÇø÷› k”í(ú¯”ë HE^™œ 4¶.=Ĉ}ƒÑ]¥‹ª ý÷µWø˜½Ö™½Ìƒ´hsÑÕÏüåºGp®Ú6̵(ˆl8½ Ö Ûé^ë7ð»>¬XFZMóÚ Â y…Òâ¼ðZ¢ƒ³£²ï3Ö8šÌ›oÌeþ{ƒ90Ý~ßa¬1›Gê‡}ž´á 2+/¨¢£Ï8dŒË—‘}ò ëwK–?9Xýd5aÑ þÌ´2”¹ä̽‘ëËáb…ðì`ôXCwIðgï³7w²RNôõÇ4L•Úaö'b஦—gfE½¹¦ÊRWŠe³ÚÝ m½þ¬RÈ@)_”(a îczÐ ¥6m¢% åD™Æ·^ã=w9íC4RY!õ°àâqÖÒø<Ó–œÚçV†œÒ¹†2è˜=Ę•kÍà=øíTpƒ»µv(Ðÿ˜ži(Øåpxh¡†Úú}ËÝ~1¦À£Ž2ÐÏgvºóÉlbß™ìª9>jÌÜû§ Ycñ@P6Ο­ÂêKŒ¦˜Š+0~¦D+N‘5ެ©L}Qäü™ieˆ¹Ð æÞÈu97|+;Ø©flâEwí"RmÞéJ|‘E„úË™¥ÑJ¿¯6çÛ:K÷’þ( ²„îY*¸éá±N§À-µ8 Ûr4^Àò’Ùº¯ô¡j¯V¨7­—‚6D|aÅxG2Muƒ£J7Cår¯,A@ŒÙQ¹2¿ ¿)8]ÕâåÿÐvÛ™½€æ}V·Ã1v›Ó•5оBÀk.ñ¡ºäŠiC C°‰fØÍ|<ô zØZû5›uÂZg\o€5'Í—×àÉõVÙç­ˆ]e1_{É_¥"ÙáTÀÒû.ç…¡ÀPƒ)ݨe¨ØÐ`¾lÌØkèÕ…T@®¯-ù C–¡S2ËåÃFÅ7˜3³ ñ™¼ &Ï Ò5 C æ>3üÎUf™ÝÚ£î V²CŠ¡s²3ÐÔ±ðΠظ2ã·DÀäcJí6tL3 5˜’yP%Ð ¶£9Q¹ëÑ}ÀÑëzi+¡ƒÌacù;Åêɸ‘™©ÓYD ôΖ§é,–‚ Ô`ŽÌL½vz+„ùr€33v`¨É+w9Üa‹†o)9 wyÇï.žËvÇ  @ R bf¨PɘÁn4¦cp! ,àƒÇÿMj×,êB~­-­Ikv !gCµ]uNŸ3‰ãpN—“àùm"!u³£¥]wæ2ê¸&Že%““ÈYÖFº*káÒkQh¸ÙJ›¥/Ò¶2Hùzk4몴^GšÕà> stream xœ33Ó3T053×3RÈå256Ö36…rs \#C3=KS ß ¤•UÊ•Á¥¦ÅP*1 endstream endobj 100 0 obj <> endobj 102 0 obj <> stream xœí]Ûªì¸}?_ÑÏìXò­ C`öœÓïò¹À@™—ü~ìnI¶kU¹J¶ÜÓçÂÀñnËR©´ê^ª.ÿûôßKuùsõæ.óã¿ý0ýûû?.ûÓå?÷?Nÿýþ¯OïŸÚî­¿t÷|üýò—[sqþòñÏËOþý¯—ß>]ßüøÛñO?Uþþ ykãwðåãÓ¯dÐëõ­a­ê0†‹cį ñÁ/ôŸïúù_Â+M|Ð=Äÿ½…¿wÂß{ò¾«îZéç´‡y×ðà*Ír|é1O×$ Öa\5üöø¸«ç±)Ñ|³šŸïà ýîÓ/ÔC2îµk×$©¥­ðSß<6Þ_\õà¦8Ç:Žð `ÚÃ/Õ‰VäïtݼéuXà P5îÁKÎÍ íÃB¯æa q_‡_tóž SmíS¥¿ô‡ŠÿëzB2÷…®‚¾PÝÂ,†ô ߆Ɨ´ø G>;ŸVXk¾’¨1ÐÅGj8iò01|…Îc¿ž^°hŽð0ÿ¦ ㌸š~ÖÅgõ›º?„¢¬Y ëîgn…9áh§£ÿeÅ'0¨ký5ÂÒ`|G']íÃŽdÖoY9Çü9¼FXÄêæn„aŒ„:‰^͸©”ïqjë/é{hzçIÚKC¿†³Ç!l}—ì±²8~`r7±ìú•º K ñ#…2Éu³¼¡Ç À@( GiWàÐïž”ù“ùŒÐJ“ÞÏ mz¥îÂÔûõ<â<%é1Ï3­´åi©ï¸AÂXEzO<¢yšÂ¾éìûVD|RÑw½]T”f"ŽÚÁ-’l.#i)vJrV& 7ºÐ`ºQ0ôÒdBfg– )„9ÌõÓHèj8ÝVã¿ëW¼Ÿyº‘( Z’Nžåí0q&*H ª_Ä„´û3&¤ß´H¿%&´ÖõªJª1°á¼Î‡,jh­ñ Bä}><Ö;NÐÈ£GsK´kP“×Õ`]˜1ó_ î4F¿#}°Ë«'øRx±—H›4®!ÃLÕ÷cÇ®gKR3V H%H#k ªºPPq$šR×57xD<ª[|•aLÕÒ;û©´¯Ô˜JÌÐJ;¯[ᨚñ¿€±=²T¢_®:—jQ’½( 9öÙpŽâ‹œªÑž jž“Mï…¯³ã3Ä­NâLÆ«ÁÿI–xB¬ÄZŸ cØÜh •ÂzP´¶aãÇqÓ³ý8œÒãç|C_8Ɇc­ú†6 ½{_+kÄW7—)N?ãH%–ò‘=fÕJ—ò…ü¸±¨ê¢¾N²¬_oЯuΦF~˜œg]'.¯FïqªÎ¢>Á#'`ù‚—¥¤¯Ö»dùjC}÷(…;÷])’óþ~žB0gaFØXà¢ê…Ïe:«Ö·»²HþKx jåš÷-I5ƒýLá$å¦m‰°,‡©MËBª†ÂÕ6»Aåk z˜@‘&߈|»¡Õê>(ÎR?'°º†ßå~þ—À“"Œ¢¦E,ð$P+†RÍ@Åô¢zò µ Ýaží›ÁyÒÙF­Á/×cß2æ(‰s@÷šuÅ-žZêRi¿dMJtÓÖñ²«—PÍ£~|Æ¡‰@Þž¾y,ÞN¹|*ˆÛט\2#îù(mœÝt–qšFšdÒ‰X%("×W"²]tªûyÀ—³¨Ø4h˜”ñw„ô¤wÆÐ £\¥TÑ@¯û6v$y.â¢}G?¶Ù’lÒÉiÙåjŽää ”°åýgßPYëtñ#-XœU ¹éP)Wò‹€9Ę ×í ûåŽ}½-Æ:—¥h«n–ërÔ¹?sî$nfò1±ä99K(1Ï—[¯`Š}çmÖ &8¨e@e ƒ˜ÒËr^ïŒÏtKC³PMúÛ“Ü›ÿŠîN2$ØäµcrÝ‚/Q Ô :î_©ƒÑ3jCwÃ|ÅI É|§‡]‡ƒ=m1Y3ÚBE ç[6¤zçGw †0R¾Àx†äP£Þýl9%œ CÝ,+PÓ“ß4_.«Õº © /CÑ’ãõd°« ´÷ és¶&ç½LÁóIòpkRWT©ÒaC­„" ˜ÂþØM ôL€&‹˜(0êý7èbXĈkžô†ö¶Zò¢ê~ßs̘2aCN¯’ZІ m ©  ’?¨ëjg4 Ïí[ÝT-èwp3žeξgÒˆ-©§ûo³’UBÌ/Ìï\vþÕ,†SÔ1õ”Î…î-ÛUή“d®‰÷p´YßĤ<ÃËv¤Žõ;¯‡®Å¢„~Rêk¯é.ƒ¢ˆ ~ýÆŒ@¡‘ÚiNÌÖnPMÈÍo•3éù¥øKÝõzØ7Ð6àÇ™XŸ ô ©¥GHBÈWØT/tgQA~ßß%<¸hÑžîÏHDÓâÅcô$ZÉõG»N­G9Ù„ÐwÚ“œ† Æ¹ùdÓó>9Ý’áNK}FÒD?ô–£aüÙ{j?‹thy Ú$ž¨÷DIž›qè.z~q”Iá¦èw‘“,šö'•¥gÕ3H1´l#ƒ¬R{¼pwA)½SGÔ>Œá«p6Ý7¼ÙBþ­kC2¸[¦vËg«i'„;\‡z‘mx@ôWÖ.ƒ`}G*±ëSð¦©Áw„[$º/ ~såÌ7ÞkM(oÝ ”Ràújí–VBàE}}dž½ _<¦³üÞk¢Ê…jÁì;üôÍ=Êpr]‘©7$¯¥sä©W ’ äHë÷†/»\(ž J Cl± ­®L²5ù ¨…POnHëy9áÝM°Âu F…”éÂÍ™wcê1õIbäÃÊS¿é>ën¶|å€(`yº†êŸàâ;Õ™U½æ»‰T¨é¦Žõºçú]Ò‹v°Ï±ƒþ„f[cÛN­`¸5jhW<ž}‚ÕŸf"À}fë¥ò–°­¹¥YCÐúû–™à&?%°E~*S‡]Àâ—7±QYž8fï÷ ëmÐ)ªsކìÙ»‡FüµŽ­K¡‘Å3Eÿ îç4òØÙ#ˆB´¡Þáh¶(X—ûÞÉw4‘åG…ÝÔª–€§X¸…ÎÅžt?5'Ý”%kö«> b)£¤½ÀL‘# ÝMcv5ƒÎRÛŠÇ;·•œ¬Ë4°B)#6{äïý§„h¨ès~T!š®W®éuªû‡í‚%–ܵ[1w•‘ê %”‡Ásq;ñ"§-Y…‹VŠ­Þã%ƒhµ£fÉ^²eˇ;Þ°Oø¦Aeì&Ò…'(‹$2!ÿx_6ƒ‡UHMÜB\}É€»•×µ˜‚©¹íá+ºÜ÷ð@\+Ÿ’Ç–Oú~^6/ú„26îŠ5OWÍָѥ¿KÄk%ÏçhƒŠ±«k5•6{n®R ,Ň ŠR≜KŽ×3çX4{¶.ôâ.·7XÈZo‰œŽgvÜzySmëËQêìNVm¼ò˜¦À`]Ñ:\j/|9D~84×fI<±ÑdGî{u¥kºN²an.Ëo—\äæ Å#ˆi~`çA †.ÎGl}û¨ËðY³Â`@\ £$ÎI‡BäÑØ7˜QÝì—Ou¢ö¨·æÚi°p é§©1¨€æ½oô‡)Žü¹Q¸Ê8&”òbÙÁùšyMÅíyÖ¨."=ªÏf¨‰^þST_õJe5iT5%-åÏšÞ÷œ®ùuSšõ ònqgè"œ»ÀEj}¼^ùÄÕhêxÈŒÍü^/<»oìsnÁ28f'™ÐcewÆÚ‹t#?~3 Þ#Wrà̹¹¦OΧß/Pë)ƒBE¤ºëÏ\ÑöÇõÝâŒAQ¨Zî^MéÀ¢Ian,)·S¶\3óZ)?UOE:.—è`‚œÖ$[_´]Ô-C1É‘p¤(ÂÌáH)ùÁu“õò‘‘ü°xÃ’¥-]œëÑ´è"@æ¶üAaüGÞG&Âgë>‘f%WQ ^ÝÓ÷#)c}r ;†®fu”—‹åÉVÁ>»•^‹}ÉÀùúœ< *¶›™ñgëÄÐæõùA¢½{¬fªåá@LSë<1†žƒ>ÎÒdô!ÆAeèTª)í§`ªêJÐKatwŽÚsoÍuÅ‚ çù%Pœ¨ÕÅsÛ,™ÔèýU£Íj]’v"g.ŒdKÙSÍv^‘YàXå<Óª1.‚_5‰±H¦€ŸïáØoÔf6„›¨9YyÇÌ©¹<”gJ6 µ&©±Í°ÏmßkÔ¼¸3›AÛ5±ìë–Ê;*‹\5¿ƒºAôÔžµD¬ -Š{ÿ4ȼãÎG¦¾hº¡>;l‡³ÉP}Å`;rz,rOž‘º£´Øšûx;èìk: $ƪŠÍï®ÒcvBŠ2¯´YÞïJò+/AއE(ðâ±IW}.âág8d Átµ•-gfÃ1w»š='+¦¯° >úUBlšwŽåcN‹Èw†¸‹ãë uʘ£ªÝPm 2óx„5ZÕƒ;AÀÀ©mqEÚÖd¬NìvŽýëö55VoS`-ŠüSôŒóO<í|¦íd¯s¹ ªƒÿ^Ìõ!n5Ä­\,Þ‹æVþÁ]ŸÔ£l¡zÝ€¤,9)~ÌgBùN?c}% ᪉DÜT#=’Žê8zqCºÞ:­Åý[¿^þü*–ô endstream endobj 103 0 obj 4702 endobj 105 0 obj <> stream xœí]ÙŠ$»}Ÿ¯¨gƒû¦”R.p1LÏt¿_hðxƒ ¾/þ}gVi«X!eVwÏØ6\˜ê\”RèDĉEÃå?_þ}.žÌe2vûï¼îÿýý¯—?ÿáò¯ë÷ÿÿþ÷/Ïo_f÷4_f;nÿ}ûËå—×é²^Þþvùu0º¼ýãËËÛ—ßÀÛÃîî°3\o¿^o™¶? ûŸ~5ßn?Ä.׺ðOë¯ÿôÛÐn?„WŽO–¾ßŽáŠéi ?v\¯?™1>d O—˜9ÜãÀ0ð{ãvº=sxbŸŠŸ~ˆƒ^À-Ãkxʶ&`èY¶—yðO“r–‹/†xÆL£g€Õ4ßà >=#=e›Èø«yoÆóWø0º5_óš'syZâ…>Ü»ò¯KÒàÙ×ÁÙG @HðtÞ®˜“üÄ!Ã6Ú$é²)þ6>Mpļü¢ñÌáŠ83ãK˜æ9}÷m#-I®Âˆ'î¡ÆÛÛHŒËOî‘§.ïh›/ïq„›ö™qˤ'qÏSøŠDgü~Z°ð8î9ÒH(lÂíÒ«áðøÝˆåZxqÚž}-·4v 7™¡Ø‹i(Ì䃱ã 1‹#KrõÌa¢÷n[ «ÚÊ^¦ÕÁîÕnÿÛ–âö£Y³\Ä}kÌ£ÆðR­§ñ.1+ÝÂlf$ÉH Äâß‚TÜ´ÝÌ?!0ì”Á9:M¨’’|7ÍXóp›ÜCƒ ·[ªAñ8^!jˆß c Ÿ¸—õð $siFWqP:²`Èjæ®*Ššáž€o¹dúÿáU) ¾»ÅO ©½ËnÞ¼5š°…>žàJ²û¯¶1ÎIÔŒÅpœÃk˜åb¸§ÎÌ2ù€ kElŸK{{Ÿ÷3Y³Ø_Ûuw°UJ›ÎÄQ²oǘE¦TøÄ·áIòñFËO-–>8 ñ%LÈ„?7íëYØÃÐ*Mꀤ0°˜BÚ6 œš=v¼wÇ@7ëìÑf…~£aÀL¿y@D ØÝœ.Vp¬ˆøðƒ8¬½£½kì\’v"»ONb¤)ãê{¼2ÌÇ·Ö>8ŒúFXHñ+£]Œ8ð¤"v<ÙÀ ìeå+€‡Ô ™ÝÀ"8‡‰á;ôD+dø²Á>Ç'‘ò* S´.0¶­¶¤qÇñY^€°ÚlNwƒ$ö÷¸(©Û7Êý-J<°wù ßãvïföEÚaVßD9™Ø"CÜ‚È A1$yéËÑvBÚÓå9þ6ó¯:ÓVãÙî9L «Ä†IVb,Á©§­ñ{ ‹g[f<€›êÂ`§Š¡ˆ³ ÛQˆŠP˜É¡<‡™˜ˆÕ»`è d@dF’¾a,‹kã²M'S²Y•Ø3†D4Úcû\Û›$"ÎÚV%¿¸p³-1Œ?¶ïÁ…PØÛPËÀƒF•ˆð"Él#Ü`ÙéM]‰»C²Ã Þ7KÏãWXA D› º³¼U†øÛ‚Hó´îa[.¼ú>Mcžï:ÉI ˆN‹ÏH³·¯göU=aØæÐ¤4!rFÑñÐZÀλ&+‘”ÈÎ7PP(é»aB,¸5I¾í€ã-#”&­2¦ÉÎi3áe+DŸn·?ex²Ó¼º‹¹˜Ùåïüç—_^MšäŠÞ|S|ôp»$½ÓF§.-=Ø€ÖøØì©dûOAœÒLy¸²HaEaæOá¹0Gžý€Lª›3»ì££¤óñ‰‡\óOý2E£K™ZÜ‘ßú ¡¡;ìTljÄ'»†gaV1ÀÏ$K¦gÚêŽóÓ‚ç:Å=ÞY2·ÐúC3,R™')‚té Q ܱ§<52×¼9ŽØ "?ËÎfƒO;Zbòõø$He>^ôˆø;ïáËJìlo貄E¶&ô9 }•0ãgNÃHa Ò¶Ø-l ¶…÷ò¥ÕéTógZê ´ñ16+9íì´™þƒB·…„ç‡fìKlŸgûk”Ø4½rR$œO̵§q~]¡0žÃ¼[¦ô~ÂA6"þýR_uÙÙÆ:žý¢ƒÂÈ{‚-€R[Ð3.4⫾æ'ä¤ Ÿ¹ßW«)ÞŠ7g¶«(ø”×yx“5÷„ULMñ±ˆ´š>‚˜áè%•*—™·`"ÔY$Ìœ”:ʧ"rª%SÆ­3žQÑx•@k¶×Ë*…#©>Eòùk»ärñ#^fºö³*%³•‹ñó¥Òng¾ŸÛ•LÖ¦¡N€ÄqÄ1 ‰˜b}ǨÙ*’í“¡ÚÌ\q-è¯ 3ÇùåÒx‘¤‘eed ²ÌfXnÓuõ-ßtì±Ëý-ÙÌ/Ї&Ȭ´8£G}íÇKÕÑ„õD©TÕªË8*ÞâÖ1_è‰K‚E;L¶{܉ ©5ákÓkOLdà7Å`NÓÆ-̦?`J$¼VvèåŽ Ÿ–8°çÜ8¿ºí›Þ…„Ð ~µìFÀbySÑÐÏ'nÆìb˜å£\rœ:Jç™t®÷ͳ~¾‰dÄÏÈŒðVb×Î ÕªÕÛ‰©b69»½¼"Ï,„¹eÅþ§Ëz½Rð¸¸Ò)HÊÕòjs*‹‹%±‰Wa—c|)HærW)j;RCdJŒ1ñùÌ"läSþÑHÀãLWEɹÈɵmĈÇk¬A %|À¥ï#LÄè W¸ø8ñÉP7ûÝM»wòÖb¿·¤}î|˜g¨ÆŒ‡ˆdWXߨ.÷'éL+)ÿàÄ¡Šãxnéãî­¼c"æ­ôtzð˜ƒÖ½D…I+HZ19eÛòÔ¦J×'”Tœ¾wP•§¬1]<å{„÷61žaá ½™6sÙÚ¤Eůb“'ù`ܬ…„0öÜ„ó×Y+"éF‘²RžDH¹Éoˆ¾j—âÄ8›Ä…GIuý¹g.@ÅV}<`º’Å?C˜à];mÿ}krò-YõBÃ É _S£”öïé½…Fµ¢]Öñ6St{ÕCùgm…­ÂL¡¢¸µHÛlMæl76ÄàaëE¯œG°‚ýà˜BÆ¢ë(ÓÀŠÓ1Ëp¸uÏ3§€CãÂkM‰ý??M~Ë;ñÓì6cwÄ¡äô#Æ8Ê áÓ»yQG_–U 9|œµ ~>,3ª«ˆ¾§Ù&S1Ì÷ïäÝ2†ÚXIø!o°8,SmmÚŽæEcÑ“ìnÆ ²:,o…“{~Œ”€0Û•‡…ÙÁ)°`÷!æUNTà"ò]t‰Y•’ÇkÃàƒç\sÒ$$/‡]Þ3*¤ê€ôCOÒØ‘O×…’à#Ö¸˜å—:s²¡æÓT¡øŸ”O©éY¨ÈS$;÷¼ÊV¾”Íyÿ÷÷(­CÀg¤º ÁµTŸÐç¤búIéºz.JÝ\…àåÀ'Žá3«ÛeŸ¦Ûñóv—. DP™WìøÉ”ÙùU¿%¯®¼:Ê<)Rž‘Z²t©¾%×áM$œZ-Ä&Fóö>‘µ‰È}ý–”ëûÁ´»Ê˜QÁÙGv²Ã' H¢úKbxœ2$âˆ(5Í(]®‘É ©k3n*ÕžjU'[²Ýš{w¦ˆ(ÀgHKž˜m§b½šÝMØÉ…!gÆ8»à3q2t%égÞ9jOðúøÅ%ŠéÛɶñD1çZÝÞxb×û°á}bÕAËipXådë‘Y–¡)Rޤ&ðèë=²+)++²¸¼æ?`,7 “Å:ä~ö¼½0eŸ³¢¤ôu`7vÝõ)/úŽE×ëѺØÚb›U{›ÀØ%.=Æ-*=ˆ‡.{î!õÐðõ¶Å·¤•ÿ¯øö*°–™¹ŸáWeàï3¸?ô„òÜ Æ¤€g¶ZÃ5&ÛºÁ3…œÛð¦Äu™œ¹³0£ƒ3dÝÝßScÇùþþBWíûà;‚ç|PSHÓ§ðÞðU€A‹6‡LI*SÖÄæ·Bƒ·CÑŸÜÅ!èêÐF6­›aîô&çþæ /Ÿ±QûmÔ{_¡GíÑqFÊ-álqÎÇiØãæžFõif^´ºUg’Ø;uEum’Îf¼ot:Úd¨oL PÙ„ù°OT鬂š{–{ × Øõ©ˆŽdÉÒÍ‘JÅǵĪǎ,bñð-±ýÔãƒ^Šš0™ÞÑz¦Ú‡Ú9'`™[B¶]ÙûÍ‘0* ï²³^÷·Èæ˜" p8¢Ù“5&TKüà=@5‚Ë‚¬a×»ñPߨÏÓÒEÈ¡iÏÀÂq?ÅüºLÑä^®\mhù"ÚàÎ.~T¢=˜ß)9ìT·è~¶vÌõä|I˜;›4ï»ë$>u#“GöNæ‰ ´q _®„+ö9Âàæ8…Pò:¼êór+¸&3÷c3ây=€Ëã…+Ù[*»n»Ûï²{¿»Õy‘¬ÒQ K‰Xû†µMÁæþØh– ÿÈ£AšV>[ËCûosIÓ2}èü¦EÂÞûQ—|œF&ï jâqÑ:7í$ …`xKj²…OíÆAfíÕó•ñ² í r{ÐF"ê&Ô-QgÀJo±žl^hdÁ&në»”4 ýU!êí\Ò²x`Nš>1SßÌ«ÒÃÀE#}¨äw¾ÃùÄŸ_÷¼«½ˆ³Â’ >Vl¾Q#£‹:ÝÃg†tEýÕûE,fÄ&”WuòûªZyõ±¼Ã‚qíî=P+¡´Y0sñ?h”]ä ÖãÝÓyC½Bíhv Ým]sƒšOp¸@OŠõ5ôëÖ—½Èû¸£ÿos&D{H<‡ªùà|2S£Z×·ŒRVÌž|ܤˋßuÊsïÖf¡h<• xµ¯…»×_ÔùNyR¤¥ˆ9®EtÈ- !seÕ¢\jÀo ¹~R5:-Û¹Œ¬”ûkpŽOètä¬I¶€Ãšh|‡{„㯭ufö1©§¥îí@~­{ ŠëB,}¸9¾¨!&õƒã±WÅ~ ïÛ=-ô×ð„l^†'¤}ú5âRš‹ïw£ †²ƒƒ„oü±ŠŒŸ1£52yxîGt³d›ËJ~ÆG>©Ou9¤÷¥Ž¢eþ/2«9wM†|¶EWƒ.ª?•Ôq“ȯƒ&­§4 Ù®µzæ3cXj`¡&’j¿ÃŽOe+¹ÙœÉ&µÕÓmO ~d‘²à±ÛÞ¹™SµWl%­í<ê1ýiR"q73¹®€O„)æñ!æUÌ5ÙÀlLIgì!D­€ú6éh!±%-ÊìæÙží Äç~Hü,j±gñt…>ýG.Êï7ZÚ¡«Áb@ú>'R<¨B`¬;šÅ<³šdMö'QÈ)í8∤¦m+Õðö•8…SN‹ÀirÅLú«(Ôl‰|è¤_óDÞçO™àP™Ì¯D§+M¬¢Ù A˘"®˜7ØÕ<ûÛ¨­ÍšÄn[¸6Mús<¾Èå zާ 0"IÕ¹û)ñAsœü¼ºguŽ¡œþæ]þ}ùLÚ]“ ç*Ý«… ö}-¼H”Ì}ÿc‚‹]\šÀ"ŽbbßÂ'¥Yf‰DŠzï+Æ>ÕY7¨±ûÝ?ËÉSé¾…áò:™ÕüÌî¨ýYÙ÷5Cxþð¶ \iHÐOÖ1j6•±¥'ùr¸Bo˜Ê@(O뜆ÆÛ‡ï^ãmŽ~24¶WZƒZ…ßÓA <@w·ßUo8è¾É‘²³ =V¶–è²—+¢¹cœ{ž¾`“»Amâ°wj*öԪ߀t¦8!þ[Ø@9a…ÅOãó‡ÜóC±1H¥OÁž²/r{™ae§rà¾%ábú¨*†ÅR&¾y-ÿ ”†¨Cv¯Ëä„6aTŒ6¦Ž!V´ÆH ³é?äDËž,²QBÇÜ®™Žƒþc³T©)ô ½{K+QQ~³s?»ìòg›ØmuÊþ̆ÚÛøÎEÃ.àðÕÎò¾‚¥_‹{B = ¡d¦#•ž· É×#¼ˆ×„Î}Eõ+»*ÃÞ‘j\ÙÜGlµŠÍköðµf`¦P†¿]þ 4éo2 endstream endobj 106 0 obj 5026 endobj 108 0 obj <> stream xœÍY[«7~÷¯ØçB]n»‚8>—÷€¡ m¡Ð@ò’¿_É;#íÎhŽÖÁ)= ÖjçúÍÕfú~ú:™éWs†)‚ÍŸs*Ÿßþ˜~ÿeúr{Xþ¿ýuº\O!žçi¶>_¸~ž~{óØéúçôÁ^>N׿OËÙæ»ùÑcoþðÀÂíàõzúĈ.ËÙw‰‡4€ˆúÛú«§ƒ¸Ðן;:Xnéœè áHOȳ’D!ð+¡î±¯ª‰™#P«d\ÀƒÔ7q•^ð¥ØqÞðŽ)à˜ °—Ùduz¥b4ô¶zÓºj¹êQ úZ•<ÂlÖãô E„‰bY r\¹…Ýc›eÖ•’fˆ­äqËÖzF‹n*Û0Ö~a6•-ˆG²»sÔ*y'Q!›ðzäÌÿ¿ã,™cU¨M™Ìn”rOq¼„›ØÅ©—(Á°.*ªú0C{,Cq·±|§Œ$5šâö^åÜÅžEK,Bƒïe™9jÓ©ª"3vâùñZ ð‡UÔŽ-‹ãÍÙÆ9åÙpÊq”ý€¦ýç´-g€}TÎRCUA«¶f>¹5ÃJ-ÁÉRÉ‹\nè\ª…m§³¹ØÕÙ¬âíBíŸß´H´c›JôÕ‰U„T/Vë<îjŠ«0ykí²Ž%ÞGŽÑÝÝù[‹<Àœ‡lŽ39Ú$éan±^ Õ5—ƒlY8ô(€Ya·¯B±eSKÞÎ0 ¸ØÜû–âÂjä¡®|2=”bí9HM±`î:jWïž@~å?êË;=ò®¡U{3rah–} Q´Qr›Ió?DP3IU.*†,:=ÿÿ”¡ö‘ɦ&×qzç’A܃ôÀ&ê§O¼ã yÔ Òlmò>e‰ÇÍïÛÇÊqR6¥ßÛÄØƒúŒí ˆúŒ™ÛPJ—A §´Y³÷œU³+SõÂËE´ÕÌaÖÙÖÖFQµfðð~«©?g±W†-ßGŒ 9lò5\°ôÆ(uÊ7i $ml_4Þã¥÷=¬M«˜bèS·J¶þb0䃽ÍÔ /Rƒ™9UWº³d<šFl* >bú”Fü*?¸f­”ù¯Ž²°¹IÃËfš¸sxñÞu£ºîç´TÊOuôþ*ˆ¿¦ñµÙ©ÑίMÈzÆÉ k챋DªÕŒ ¦læ{¢bk¸šÞïå¡"Ü-اé_Yˆh endstream endobj 109 0 obj 1233 endobj 117 0 obj <> stream xœå“ÍkAÆŸÙÍnÚXlR"Ô‹lÄj{0$µ­ ö¤ôPZZŒ¨PÝn7݄ݿƒÅ‹^¼ŠxòâMöÙwfJ^ÙÆ AEØrÌbT°¼ÄH&_I?»úõ$ù-µlÖ67¦Æ.”QÆ3MázãZñ2ã3Y§´y€¡ãã|Á2£˜"*÷øÒs³8‚ËÍx‹/Ã5û½ÿøã׬ÛÅ‚_ŠâAÐ6šý¬-;"ê­ø/ ª€ZÕÓÜ1fþB$‹EbU¿*¨COÿzQÕÒÌÔm¬i{Z Ç™6‘pPçÎFÂgÔq^líl×?Ö÷w÷j;Z­~§¾_ÿ´½³[cO²VkgZ|KÏo<ý~kxîê@ëó쟹^;Úp¯é«]8/˜j¤z†ü½gJ¨êCô´‡hý×°\CÁѾÏwæœJ‡çzVŽv"…ÿ¹,Y¥¾&9@öŽÌbO$ëÔ_u¼Â;É!|–¬0Ã_$«Ô$È?$k<›‡’u„x}TˆÀ`Ó§8&™>ÅÉô)nJ¦O‘“LŸâ¾dúÏ%Ó§xƒqX˜à˜D‚Ï4ie¸l‘cŸ‡|TXK°á°5°À~ q,¡HÍåŒ {Ö92*®‡É¹ýFôÓRT<®cÔüv’«Ï²í3vÜš0&‰icµì‹9Ë+ø¿d;¾±àZñ¥¢í®VœõB~ÅΔó¦×º”²=?Wpd|Öèªÿ^*šg§Uwyæú”?w4¼G endstream endobj 118 0 obj 603 endobj 119 0 obj <> endobj 120 0 obj <> stream xœ]Ak„0…ïùsÜ=,Q¡7ŠeÁC»¥¶? &£ ÔIãÁß1k[è!—÷¾äMtÛ=uä“~å`{L0zrŒKXÙ" 8yReÎÛt¨¼ÛÙD¥…í·%áÜÑêZé7ñ–Äœ]ð¬ô²§ Nm/º_cüÂ)A¡šŽrϳ‰/fF©KçÄöi»òxß"B•uy¯bƒÃ%‹lhBUEõõÚ($÷Ï;ˆa´Ÿ†%YJ²zhïÙãt§ö±~Ú€]™¥Iž=WØ÷„¿ßCÜ©¼¾Šôm£ endstream endobj 121 0 obj <> endobj 122 0 obj <> stream xœÝz XT×¹èÚ³öž÷{†Ù3# òtÄÈ  JD@@IL`Q`Æ™XFS‹6¡IS£y„ZÖ4䣯›ÇiZOZs{Ú´MÛ˜žÞ[jÓsmNkd{þµö^1iÎwîùîwïlfïõø×¿þ÷ÿ¯=Ä£}A¤Eƒ#_{O òî ÇßB½ƒcnïóÃGþÐí_Ã÷PgdcÏÿ²÷áݳocw¢3þOÏý/„X#Bò®` Ã0p#3 æuÁ€_Ø­€~=ôçtõÄ·ý>å_ž~út‡Û§ö~¼!Ö£úžÀ¶Èÿæ",ô[¡Ï÷z‚ëî<‘ ÍAX£„cñÑü«•ƒÌG¢ÁÈÝû›—C !nƸÈG M9éË0ËÉJ•Z£Õé F“Ù’bMµ¥¥Û32YNÞåöÌÉž‹þ?þÈŒÙNîpµ¢O#Ú„t|=ÌÜÊ´Ao܇Q+³9°µèVtºýŒï¤ëÌN¸ŽS|§`䔨‚ñ〡&´íDèo²·²ìv¶“icö1û`ä—dŽ-€+`wÂw;̵‘6SW.êD•(ÂÈ'0Ÿ@1jùûL6ê‚}já{ˆ‘3J å=F/ëd@¿(Æ*„?î=àª%`Ý{ôúú(Á½'O‘}|­‚99ÛŠ>ì[ÐFÍ”àÙ_am-Œ ®˜cH†7-·Â5^•¨ ðˆzDÖ&+aç(Jû è}ô"¥»ÝýtŒÞ¾‚~‚K™N ŸÈ&;ƒÖ+nd\r=S¤Y!¹í”u"'®D1„RЋrŽÅ2åóÆ1Yvuǘom3ÿV‹« V—7*ø1T?¦Kð/_½ZßÌfp-c\æÎVŽ±Ùžß|Þäo òW×7ócïú+%¬þÖJkl†&éÁ0Œû+ ˆ]t ûÙNîD²û´ì9$?Ç(¹‹ŠÎž_€ŒçÇÏ[L.S¶ËäêdÑ•θò‘°_¡ÿë¿Eå¹°²¸l­˜Qšƒ|9ZK¿ç^;îçb™L?²§X´¼Üìq°›GÅgX”“iñÈÜÙÆKãÞ ^²É¶Ä×’¨hÜ £WÆ—¿èœ[?723JJKLžRÏZSäŠ,ƚºp‰wQé¹yŒ)Ùh=}÷1&Æ|ò•ß|,<#<,ì:~ø‰gv Ÿ~ù•“à öÃÄËÿp÷#)Ö7ýêǸsÇλú?uxìñGª@?•§ Zà3ËG•ƒ,•1¥È¨À¥\…Úxé‚÷ÊJÛ•ñbŸÆ©)Ò´j†5cŽÙ]bu‰ôÉÊL„|ù["‘à<Û@ºMW?äX–å ¯ûdÍENcªž›Ë8GõsŸP¦>fJËaF•=æõ6µÄ&+Í2@„õmo®ñÒYŽ×{ÁxÑd¦ÒyãÂEá útþඤؗïœ_–Rn-O-·•§•§/±×͘¯Î³¥Ù´ºý€aÀ9À¸Üš ÌP­g<î¹¥ ]Ï€=n¹ÂSºŒ)áY¦:Ö”T-Ûu@WïýöÓŸN¼rÇà¦XÚ–ÛßÙÂ8•0rwû¦5u ²{&Æ{šêŸþösÏ–ïÜ~SûGn÷ù‰_½× vt#I ] ]-r¡_6ƒL5{È®>”’5ÊêFS"öƒ³ÔaDF}©n©b™ÍëÓ¸táÊÒ¥TêƯŒSŽ—À§øÅrÏ€çiØ…D¶H)—䙌¨Ä›j#*ÁáÖPoËÍ=¡V¦íAAQp0ò[a‚Á¿,8À\f>½røé>;|<±§q-“Ïpxæ¯md®HÚc_í)P& úÜrŒÔF4ª4>¦JQÆCö‘”ˆÃhBË”KTòr›×AìùÒøùwÀk.\7=Q%ûÜ­YYeËbO£ÓòÓŠÓÊÓªÓêsèœüœâœòœêœZKÔBùq0œKäiq‰œõð„!piím·ÔÉÞŸÈþÊÞØ½)‡ó®¢ß ãÂϘBFÇ(»¬ùÇG¿nÞªüÑKwÄ_8Æx= ço _:ø"¥•ûÒÑ7lwbݰéN­j;ŽdèÍZ;JÉ–ë2Œ„zêõ.™ `íºâÌpfŸl{úvûc™r QκD’¼,ȸ$.3Í„Zî“ë… ‚ðU¡šy‰¹ãn†b`ÞŽþüüù_|ëdsì_Í<Á™Næ _…pß«'„ÓÂsp½vøIѹQê+ _¾=E¡³1x”³=¡É0ë13Ê1"Ó–ÌUrC©Å¨«bQ©]n”Ud‰QäÒø#\`.K/^´yÑA¨½ §9b/«ÇÔMÍ'QòÁ†Y(ëêk×™_×òb‘sØ9æÄÉ@c/ð¦ZM¢g‹6*âÛ¾C;ž{éÀÄÝ;ýë6wÜ•À¥‰ý·7ýä‡ï%²Ò=¡G¿+x€|ÁÕñ“ÜdC·ù6µQ‰FYµœˆ\v$ͨ01*ΈÑuiÆKKǽïœ?K¬ÌçÊãÙ‹^°ôb VÓD(¾HN£$§¡´$Éué·§¤ã ‘Ùê2I&#zõzï<ágùe¾e²o©}íýGð÷Ì‹‰‰¾}•ëo~|çÐK€ózÈ‚5 ÷4´Î—RMJ•…á £&î‰ÔjÔtD£^¨”• ã ³Ò¨-ÕW¤C8‰Ÿ§Ò¾x‘ÊÚx–pbé:§½È^n¯³ßn°{mDžç¤|Ùš-òúšøWÏLT=8*c~÷+ζDx}]ã;/·&ˆhO†7«’„5 ÏŸ iåCæm$ /³^¯Zfð¦‘x1.úñbñ‹Æt_zk:¨<Û»Èd”‚„-éIp—Üró–-·ÞºEøWá &éŒY&œizT•§ÏÂ?naò (˜\á§Âß„ËÂ{Ä ×)J ×e€^ T÷Ûî5h÷ë¸XºÕ„™~ JѨíò¥YŸ“ªö!Ù¥)!Ùe&“ÜŒôšªÍûÉRj®$­8ꃎÇO;¸Éœgõ€rŧ(>E ‚}ú'Öôé= °‰"a=WÞ¤E´Å——ÌǺQƒ2¤åÃþ[öÈçBÉx©KOs³îº9Ći¬%®o¼0Nó²w*5'ì­æ 9R´ò©ŒÙåÙÙOg³1µ‰©;; ˆOBØš'ò%˽}SOKKϦۅÈÓ"2œð金‡&ÚÈVAÞû裧ż-¼'| ×ùµÂªµúd=§AVt½/ S™GS޵£z´Z®+Õ-†RSEªha$ßÑÊî´¶³ÙZmö18¡eá"’Rä@3¾^¬­ ‡ëÖF˜]RÁÇ5­ ‡a°÷Ó>·hÌ–p] e'ÊGq_!Ôó™“{È‚FJí‚õJqaŸ´D T%ЬR>Ó`DKç.S¤z HáwI,ü&ý†p–Hš:%ÈÚ—©T§©sÔå…,R" 9ƨJQóJ^5G­¢5ÔÉ ÒÒ’,ð¢˜éň™V<•²ï g„_núyl‹aßÎC{¦JÌßE²ŠÂß»Òú뿸\B¨óÑ7ÓK¦= á!©˜zt_N²9hÀ¶‰ÙœLù|PLæê‘™ÉœærvÍæ$¹ÌÊæW¦Š¿ÿt27}^2‘¡YÉŠö‰×Êæ‡¯~(ó0­`O)>Žª"Z¹ i´Rº4^¼xš™ŽÔÖE"uµ‘ÑÚm’¬A*É]` väõÙmëLCZÕ©½JHíµLî^{]9{å¬Q8[ü¬!"Ñ›Tp¥Ú’ÉTÌõ쮹ø'á‚ð³1‡Û1Þ}`Ç{7ïÔ35/>ÇÌe4¤œ?_øÙž]oýûŸÏ nuƒ?ݪv®"™Õ£Jô;”™>.’¢<¢gJ.O¥Q ¥Èb5U@e»ôìY¨ÇÏRƒ„„YŸC¼æinï ªp ‡¤Šç‹UÅjÙF¤ÙÁ"%éE%¥Th6üAD¹Ú_¿ŠÑùáDÙƒ##¿}Ýh-§®­‰íJ\ùu¨»ŸyÉb!’Ü•@ Ô±¹ŒÂW•ç—S«ÉrʼS£ÕÌ×hy›ÊàîDóRØï´š·Ï‹Ìç5Z—Ci3[ef¤´XÌqX¡x>=]]7N–Š“uïÂød8×ÿš z‡XŽòH,ÿšïñ¼±<²Âb“èßP‹à(PºpÎTaNìÄɈ'f÷œ‘Ç¿œ~x´÷ø¯ß–™Ç¨w1g_xàÁ®üúŸOo ïÞ/üzÓöäáþèÍy‹¯{óå_ý{~¾ðâCÃ;7.^ø‹3¿ýƒWªƒ¸1È­6t“¯P÷€ÆúM‹¦ßð€IñMÕý¸ßt/³Üéܨ5ës•fyŠ9’¨Y …PÚÔ©$ô“ķ p+~¾>=œ.›Ìíô+^ú„<Ï-Û;ñufÏÐí"yNxü§‚ëÔÄ•S‡~*<.¾dÂÎCL‰/h2Ê »S¬)úÝ:½5=­LWõ–ɘÝP ÝŠTà kª5Ý.˨IMµÎ·êˆUÚS9[iøˆÅ ÅÊQ“:#Ýf5ô:‚•1H¯2½#Öã®ÈmZ=`ó*ŒÊ?Š_±÷Ù1b[@÷ß ‹ 2Vk µÖ 5è´z¥KGéœâG†95N­S—©7¥›ì¦Œl”§ÉÓæérõît·Ý±„Y"+—-Áåx‰î:}©±Ô´(}‘½†©–Uãy¥¡2åfæ6Ùmøfy³î¦Œm†mÖë z3ÊÔÏAóõ¥h‰^AR‡…VU*1çićСƒ²s¯îbFîþÌ,½gâÖ¡·Þn<ÀØ…s[eC;e‡%Ô¡w U‰“&üî÷0O&âùN¹ b`1úНœ·[t¬<a£bÞh®ÃøD!Év¥¥h8ÅhîOª ¥[Ô«´¶Út%dk¹µ6Ýhq¯šÏsæ”έX@÷RÈÜä$ ð_"{ñè·””$&³m‰G·Èëó¶z#Þa/9Ž\;|¦3uLyÿÆã±—^80±gà†ÆÛº&XÖp;<¿F2ÿ²Ç{ïʼnMsï’¤Á|òf×}_ø·é-rDܰ¾h÷2Xå÷!z©Q™/ƒÝÍÉ9¼[.çæ³X®dúåÛ‘J‘Æ"™Æxþ,¤àr!9 R;kÊ· +%oã¬pjIÞf¶2×3é öå—¿õÛËC¤Â{òÕb›ŒÊ&),_8ý»‹TÕ× Ì>F¥Qk4t½œøÑ@Þcy§óp®*W«É׿ƒ‹,òø=-ªu‹¦EÛ¢kÑ·8[øW‹»Å³IµI½I³I»I·I¿É¹‰ßäÚäÞä٫ګޫ٫ݫ۫ßËïuíuïõTTÔÔÔÔ人zŽªŽªjŽjêŽêòG]GÝG=KÁ>›•ÌÈᓱynëýþݱêÐýßyàãË·½·s‹jh°;ìk¼ïÝÇ…«ÂŸÛådr·îX]嫲gç¼ë©£N—p©§×¿|Ñ2kvé#ûžÿnÑÆ0äG=XØ|8ͨœ‹ÍÑï´õ™ ¹sûÞnˆ8óx‡'Ke—çªQ–Ç&·Û´)jd¶æ‰ïÏCå!½Y$r?KòáYãô„OŽ÷–E‹JÄ÷°ÅúÒT’š,è!­'+{…gl÷_û¡vq~üõׄ„7ú?JhÙ{àðS-_øÍöÝÕ¿WŸàŽyôéØ/™ŒW‡‡úïe;˜åÙÙÿóŸøÃŸƄ/|1¿ôÔ Ã@uèaäŸtòyRœFkyBi##Ê3ŠÓV¥²FY)ªÒ•ŒšëìähI^xŠï;!x“ï³Ã¤j—¼"/ƒì´Î‚t¬³†3Æ2d3^êÒt)–öÐd/=(ÈËi±Ë\^Þ¼¹}';ïJƒøæJ–—˜øæ›GŽ3ïÓs ¡¼ ªÃäB+}s\VΔ–uH™vHd¢Q}D9bÎX¦Yj‘•ZM¬]çž<~öeí³å†øA²Ožó€PfÚ9Ðúæ¬cž g.'Ï€´.ÿúôsÞžÓ)_!VF8ƒošuÈáÓëú‘¢_>A@mÁz#X4‰uWÈÏ̲¶UNÞXÚðmÂÓÂóÌ*fÝȾ}#™Ì™›ázg÷¶VapDxRØÓ ØmPë|µŽ…}*ŽÑàû1T7¬Y®6+õ9Zʑˌµ/ã¤T"_š|§Íé›nY=f¤ê3^} °Â‰ùÄÓ±ÍgºÝÔjf‡¹aù°bP9¨Tj4¨-&_v™ØÂÆ!î­=BÇ› ö'ãLŸ°oüÓ‚‘AÈ@ž”Cd Ôk,P¼€ ÎzÇ“2°”.2CA4¯”%²è"¬3ë˜já9á̶V&Á43-L¢uÛna¡p®B‚  ï#ŒôÏ#2Ty[yþbôÈ¢+0wêb®¾O|¬^vøÊÔ*™ .Š+=fx»°/‘˜h•=žH\i@”C°|Ä}÷ÖÛ Kÿ‚œJú£ç+§K?Hþ´zõ}Á¡Üò¥ßé:Å.Á1íXÍüÌcˆ:寣V¬FU\jâÀ׆šä·¡õÜ»¨ ?‹°‹Ñõ²·ÁÊÖ£&Å0j•³ µ*ߘ¨ˆ®%ëÞEåw˜ý5á-¨œ{í‘§£VöûP[m˜ûÐeÙ%ô*»5C{¾C°¦ˆâxá.!<»Èo©ìa¢-äF»ÐÓŒ—¹—¹$óËŽc7ÂuÌÞÀö²—¹ÍÜSò|ù7åÏÉ/+š•™ÊnU©ê%ÕÔ.õï5k5ǵ*m»ö~íG:‹nžnå~Zv"þ ްW7cd6•ÑOʨlR^ D›2©-C,ª•ÚâgƒÔf¡½YjsH‹vKm9øç7¤¶ªË#R[ VøS©­Aiè#©­SYС†UA/®6Jmå¨wKmRªKmŒ¼êç¥6 íßIm¥iÒ¤¶jŠ¥¶µjn“ÚJ”©9%µ5@ÆÏ¥¶Îæ½ >ŒÆ`A¸-õ†z7Â>í@8ŒwùÎp/h~"Nâ]€½;Ôì©æ¸«„;uðX,Ü À~|G¸½¯'ØÄ =¡î`ŒÏ!é¾1Ü߈ݹ”’h0 wôµ)šŽ°jë‹) 3äó¡Þöî¾BÉÖP¼+ÜbzBÒF>*JÐöÅž°“Ï÷)ב¾¶îP¬+ÚùdÏ¢p”AR%ögmMˆ´"è¸$:ºÑÖ®pÏg5töE{aà ]Øæcá|>Ö×¶)Ø'#¢Œ»»Ã[ CíáÞŽá#VFÚ“¶pò Ú%aÒzÃqPDL%z‰LÙ€8ÇǺÀV[P’êå38 ÷‚eDùžp4xMÆùx"ì ÀF…I²fÎ÷d‡žpG¨3DŒ-Ðóƒ  ttPîEñÁæ‘@(ëëDéVÁXhc/%dcw"Ò#‹ˆ•ÚIŒ¬HR›½“hu¢ÐÝ×F ­IÒ1… ÈëíNð¡¦ìDƒä_µ(,iĈ(‰n’.» ŠÄo G;b¼{ÒÝdïäï&Îë–„Ú©‘¼¦-þDðö ýáÐ$iÁmqð>‰€“ÚºƒdBäpÏRLW Îwb€1Ø;S*°Ý”wð}½Éî™±Å-òøÅšA”寧#Š ðÝ$Š€Ï$#öÍÀøcox2†|yÓš±. 2ØÝ)’µÊÏWÕÕ6ñuUM7U4øùêF¾¾¡n}u¥¿’wW4BßÏßTÝ´ªn] µM-|]_QÛ¯®®­ÌçýÍõ þÆF¾®¯^S_S퇱êÚ5ë*«kWòËa]m]_S½¦º 6ÕÑ¥ªj#A¶Æß°bt+–W×T7µäóUÕMµg ­àë+šªW¬«©hàë×5Ô×5úG% ­­®­j€]üküÀ ZQWßÒP½rUS>,j‚Á|¾©¡¢Ò¿¦¢au>¡°Xnà)H!P 8xÿz²¸qUEM ¿¼º©±©Á_±†À鬬­[Cd´®¶²¢©º®–_îV*–×øEÚ€•5ÕkòùÊŠ5+ýS›0‰)q+ýµþ†Šš|¾±Þ¿¢š4@ŽÕ þMd’¨¡ä®¨«mô¯]—ܲÊO·*ào¥Œ²_ ì&Aek(FýÒaOXʱ@7l«&¡ fºaYl’Ì™N•LŒ‘h–l†âRø@ŒFCwH)9*¥¬Ù]fÓ Æ"±BýÁîD!ÀFI^£”„z;Ãщu*¾öxY2–Æùy0Žn,D+PEPEQmD](Žx”ƒÚQ.<½PÙ£h‘ÿáäÑr€‰£|£(ˆ¨åÃh5êøBhU n¸x¨ž“¸b´„gÖôý ?‹‡Gë)DZ´B|_žÿ/¬ TvSXB+ç‰Bø_SÏ–‚/¹oˆÊƒ´ât¤fzà…3:ÿ®Œ¯…?9÷N“:¤þÒº$°ÿÝ\“=È·žâì¡cpÃ| Jüm¤;õ>B%ÁÕIgƒ“;¶Ã BÃF˧´…)•½t}„b‹I;„kæBÐ#ß?í’Ä“8ã” ²W˜î-òÝNázRÄžÄ@ EÚ»áÙ+{%ÛËrÕ$7Õ YÛAŸ1JW;¬ Hüñð%#}°K®"3IùtB«›ê`NÒ8µñBm¥ Ò§dBF"pÃ.}”Î)j:(qjsm0§³É=>‡|ª7¢ÝnXÕ1)“­Ôºº®#’é¡cÓ9JâΰM‘Ú>*ÃüiÚ!íªÏ¤®#ÕFqÇ`uþçð‘?Ég`ŠB/FcD÷$î$Õ™Úÿb®“’©LZt|–ÕMq´•Ê£çKíô†Nà!J­5F×LíØAïd|úì£ÿŽâ“0Óí˜ð¦z5ÔN÷î ‡$JË&=´IZ¬a#¦ô0=.MI᳡àã’GÄfÀ&ýeJjÓãÀôu<å; i«M’Ì”½‰ Ñu/Ð)Á,ÆŒ(µ¢°$å/«q“ ôvÒH@p~FZ_´žÈ%1ÉCõÂõédd#ôÇ¥è'ŽˆÔ¹vLÓýtë9Ð]D™õ–]—䪃RKtÖ;M"ŽpÔ%E§ÅÒµ"ц“{Ì–Qìïò4=Öṵ´ÕÓ—§`æ>³åq-Úò%wÓu¡/ˆêQ))]=3ð&Gb“V™ô›ÙY$(Å»à Éo¥\uÐõîkäF÷$ß³Wødæuϲ4Ñwjfåš6êûáiôöIþÔB?̆®!µ ÚFeÝ+yt.1“ht N®˜®{‘î/ö˜.íyúŒI4©5}¾­ˆÜ]+Ž“Ù> 5SÊ×’,?MzÓõø_ñÙ˜Tò7I¯Kz©$º'k‘¨´b&ƵìÍpß(iM̽T¾³ëÿލõù\µI¾—òcç i­B~ºWª…Ù«zMè&¨0è\5ŒñPÛ5ÀÌzèUÂh%ÕO!ónê™7A›`¬Cë(.GÜ î!¸yÚ'½Õ_ ¸ÈZ?j¦{ø[#…l ¸×Àh <ýY±FÖAŸ´W"RŠûÕª&êCd¡E¤´ ƧvIU5Ý1IÙè5þUÒl஦øýùTR¤];Ig•Di•ÁLp®ŠjhŒ®ƒg=À5RyVPžEjk)U0/ò⧈š)ZÏzØ›@¬ºš(d§& 2ŸrHø©¤ëÉ®«é¨HY¤eÒžÂR(ÉR¤ƒÈýäΔÿ¸xÊŒ4QÝTþ$Þ¤í¬¤ÖLÚÑ:Ê_•CÝa9#R$ò¬™„l˜¦•T^Do„òJºS•Hã59Ib›©kYGr‡•”??•T …n9ú¾zrD´ÇjÊë I¶"NÑîE›¨™&Ý”G¢Ùµ°«_²© *»™\ˆBèŸâBÔ@…t_1MfSÚ¯•´»bR×uÔÊ>+•›¨/ú)TÕu㤪¨ÿ®‘(_7ÍÂ’z\'ÙgÝ$e3å›ô£$Ü—‰"®äÞ35XIí©F¢°qRïTüòCŽk§çŸødüž™É§W’SêôZ4ZÌ^ˆÑx%…í™75*Æi1M¦×r_ôN@¬ñ§*ád5"Æpñ¬4½î 5»XÆ&«1„'+•­tv*¿‹§Ã 1ýü£ûŠœõI+fãëÌ­Èn±kHó‹2Õìc„æ~q—­´—ªÂ_ŸKÆï˜uJŽÎ:eý=$yù{òR}G¤3VˆJ˜Ô—…Þ(Jž×¦dB$ÐIçzfi}Êú¶24».%2Ø8òIãaZ_Òß·Åÿ-˜‡>F×ø¼,ô]8'à­Æ?ð;jü¶¿åÅožÀoœÀß¿ŒÏîÇÿ(à3~íôJîµøôJ|ªŸÜ_Õà~EÀÿ à— øE5~ÁŠŸŸ‹ŸSãç|ì³Ïعgìxìi;7–…Ÿ¶ãï=¦ã¾·?§\øøbü] >vÔÄóâ£&|t}²y(‹;"àÃß1s‡ø;f|èÛyÜ¡øÛq÷í<< Ñø‰ÇíÜ~ÜŽÓá‘GOp#~ô‘ Ü£'ð£ƒì#gslÀøØ‡ÛÃÙø¡ƒ&î¡,üÐËW_ó]ešð->àctàýü­ýøþf:¾ÿ¾î~ß[Ü׿1¬á¾‘‚‡5xØÇÞ{Ž»7ߣÃ_ß§æ¾îÅûÔx¯}m7$à¯ÁНíÀ_Õ໳ðnèìöâ]wY¸]¾k‹»Ë‚tÜ €txÀÇÞ w xÇWœÜʼn·ßq‚Û.à;¸;Nà;ÙĶl.±'|ì¶l¼u1î‡ý›q<ú.ã¸ÇÌQo1à-ƒl$\ÈE.Ľîp·o^7©q—€7ªñFÛéÂÁ¸CÀ¾{Ú7ã¶8°· ø¶T¼Acà6ønivp-¸ÙoòâõÜÔhçšöãF;n°ãµõ©ÜÚl\¯7rõ©¸u6\»&“«Ý×Të¸5™x­1dr5 ðj˜^íÅ7Âø;pµ¯Z©æVíÀ+ոʯ㪼Ø_©åü:ìUR©Å+–§q+öãåi¸Â§ç*v`ß"çÓcß [~C.W~/ƒÇ² øØâ†\¼ôú4n©__fæ®OÃeKÔ\™/Qãë¸ëvàŰz±/d©ð"[º0+Ý橸…i¸DåàJöco®Žó xk5\q.š“Ë-Æ….5W˜… òM\Á~œkòM8ßÇæ©ðü¹Jn¾çêp®Í™gâröãy06Ï„çùعJœ (²Oà97'{àá°º÷c¯ä\jìdy%æ}¬fó±ïù,S—U†.œ¹gX±Ý‹Ó½8 ¦ÓlKÍål›q*ôRs±•SsÖ,œ’†- d‹ ›a­y6K¦lél€9C&Ö±~ÕsºËX«ÁZ«1`5€ªO`•+Ny+,Xhå)˜ScÎDzØÌ±6̲˜1pØŒ±•AK&@3ƒ,Òcæe¦ãî{˜¼ÿ7?èÿ6SúÛ¶/ endstream endobj 123 0 obj 10175 endobj 124 0 obj <> endobj 125 0 obj <> stream xœ]’Ínƒ0 €ï> endobj 127 0 obj <> stream xœÕ½ |TÕ½8~Î=÷Þ™;Û½³'“m²’˜ €0HBL²ˆd™ ™l²DPË&›(Z´”V´©RÜ1ê³jm+ê£j­·>J}ïQŸÅäòûž33I@jýÿþÿßçÿÿç2sÏ=÷,ß}9çŒvutû‘­Cyë[kÛ;K'¹Bo „-õ+»Üž€òŸà³«¡}y뛿ã„H´Ù²¼¥·aŽÝô[„xxœúE£¿Ö÷ü®jèïý*&4BE»Ú¦A¨€Ž™ÒØÚµj‚ë¿ÛàyŒWܬ¯]µô«ùÍØ ïµÖ®jÿ½°›y=<»Ûj[ýƒ¨}/†yèoÂø‡Ñ o@Z ŽÂO¾DÈŠ^Ds4sD5kP5¼]MrñbªAkH5ŒPuÛP9~fA6tLxÂaäq+ý\j‰¯ß{ãB÷¿-Jï¹êÑ­hÜý¨¢ßØë>~ùrÅB>FXÔ/Äö“Tm?Ÿšüñ?{ùñxÏÜŠ…îþ× g…G-¬™uU ¡HŸ ê g§|jPwó ÂA°äòøW‘ø*Ö K9e œ9RΜ?s>ÛjN4§&šx4ØIb?UwkLßüW‡˜c¬ý»|Ò";ºÁmÐMu:”4Ø.#Þd1J)ȬOt(ÏŸË9sÞœס¬ó9Ïçd{¥lç<ç:ç~'—¦æº‘YA‰É8/לœ—z—žÅÉx¢úkõƒgÕž'¸J|~B­P×6áR<®âK»›Ô¬®TV¨]¯ËŸð €Ï6ƒÊ½ñœÖÞ‡´÷ ; Q;Ð-[ 5±ZÉîB1Ø%À®3o¶çÏŸWÔsÊK~¶×âŽóÆ­#o¡·ð[Ü[ö·b„¥x)N´Û¹9&æšprÊ»åæ M&”E ¿`ðóGêýqÂ.Ï__üRý;þüŸ˜;#îÜ´ö…CÚ÷Þ_»æ‰~œ«âëÕ÷ž|ö…ÏP»E¡h](ÏëB÷;wãÃ}æÒVRcop!›Kpžyƒ1À¤pf Æbi‡ÓœÌ` ÉÇ¥ÿ±ÿ õ3ìúÂÿoþfû¶;ïÛ»gwÏvž~ø(r_—•­~µuÝçŸ}öÅ­k(4sÒÜÐd£G½n—ÕÈ‹ãÑÄ)ëIz_ƾÔÄ(›^Ðôe’­É E[u7’0]—w’yâ¤E^k–.KŸåÌŠzK÷–þ-ç[Q§r¤¥xÜíæ\{"ˆÎõi”×z¡²³¦|jÞOÛ~vðʨ ®¾ý€ª ß¹Cý¸1÷!ß­‡ÈÂîž·~7ôJS—ú“»ž=ªº äÙ¿1T"ÕšÚÁ )À½ã`‰l(Íö¦& f;Añ»´Q»L¸¬@}¦íVKŒKŸgåº68:‘Bj¦Zì6.9)-ÀÇŒ¥y!„Î?‰~¶zà›oVÿl‚ºîݺmçÎm[ïm¼MC­¾eê¯/]R_[æ;Ô„»O½öç>üÓ¯O†ùKÞþF¡û¼IZÉ*`$÷™‘àØj”úÌûô:-7)‹6Ýà1eG‡xæ¼2°^¸£¾ò ûŠ9ß <›¤ +œB^»âPœJT–Ë‹¼ØËy‰—÷ ³ì^‡×é²ÃÔmìÆnN\:ÂáhÆáh¸BÆ ¾šgäí&¡|î¦ï ½I™4ápßøz>Cýz^ùóý–›MÇÇ!.¹“Ù¤o!tj‚1*0éÑÔa°Àñ:$r’rqà<p»¦)ì¤FþJ?‹’B‰B(1%¸ÂÎí·°zä Õ_>ÅêŸrâ(Â-•À\%ړ͉üCÇïãÆ•w“÷„à¥ÂuÇñÍ”ê—øeô @ë5¤å%-,ˆHÊ™óT=”3o€(8'LÈËËEÍœ[¾¬ÝyÏ«…Ï­O}ìï‹a„-€_9xÃXTæM4ØlD]œÏ寳Íhp"vŠZ“NÁ}àHÍ8HXÈô^øú(Þ<ÖéŠôE†"[‘j]2:Þn‡†)õAì¦áÌa±½ùlã—Ø¤þ&Ê nä‚݃7à—w¯{ð®ûøX—?õϧßWßr»ãêÁV<°ûÛ»öÞNýÌFБ¯9Q²×ŠüÑo j¢*I”õQ ™i»pf§æXÌ È=gV,Î$êÀÈÂ7·åþ½{ï§ŸÿVÿ†Íÿ}+êWE¸Wáj\¡ö««¿Pûëñ^܆ƒx¯Ú¨îTïQ‚ÍÁnA*ª÷&è—‘ßžÐß›ì ØkÒܺx-vƒ( Qú4èüLTCß½@E>U2HF3wQјµVƒÕ¨˜YQÌæ C†±<¡Ü]žhYš:¬©6¡4EvJf¨$‚•¶3縇¶íÝ»mÇî½ÏÌz¼å#LÔ/¿R¿Â3pê¼#KVîh;}¢è­Ó§ßú·^}—ûjîõâŸâ½ø¼ ‰ÿÚߤþ!샣™¼G£™ÞD´ßÉü°SòÃ|TrØ;¨/vQûC±òYÄ_ÈùtûBöÑe1Ô£$†ÀO {b*|r"h$¾„µ÷íÛwŸú óŧÿ„EõÒŸÔW?ç¾yxïýBžø“Oú° …=ñ°6:4ÝæÍŠIÔG#Å€û¢ïÕî°&nOÞ¿#m«µÆÐg⢔8>ÉèqÉ(]/¸’c3¨vž¡¦dׂóœzáëÏa€ÜœOýtŠ268vÕ˜Scù¾1§ð)îà„qÀ>àpžŠ:}Êe¤'oØ/Z™m¡n3-ïú ¹‰!Vi’óB†&믛7lêêÜvü zð†ÍOþöÂYÌÝ»¾íeYÍÓ >ü—¼²/xÇvüüÐï›:ç=à§ÇJz×ûêÞËÈx?WåóŸÖ ȃ¼¹$c«ë&¨/.c—UûưƒOÞ ˜óÆí/×Ä{ܱr:ÊKsi&:ÆŽ§f÷bsÀóçÏQ üãga?´ ˜K(SÉ\›ÙŸ Á6ÛDê(òr㇠7° €Ë»ÞBƒ0¡8"Ô‡ð¹ƒ_N-¬±lXóÈêFþñÍËàFp£º÷Þ­Ûwîܾõ^òüà’Oÿ‘–öQcͯvø–቗.á àNšÕ­'ý§?øókÔ*^orôJ‡VycyŸ Ä' eDä± ´¸I38=ضÁPà7À¼µµ<˜Z>djuÔ¤ê™IÕ#}ؤz%7rã,)KÇS‡¡gm˜9ÖÓ¶¬M"¸J!/l•,/¯¾[îÂ|ÿ‡—î<©¯‰útywôƒ ±^3GàŽ9\Æ¡Ï!L²Þ ¢¥\|#lþ_£€)'s–Cïü£FÙ²¼p VwœçO°vYüN‚œÑ…üi~kƹ㥸ä JE—h°é…’âˆÎ¶(¯P3|!?Û:a^l¢Æß|"pÑœëˆ8ûä¼a¯¯I~µû½[Þÿúð¾ã¯«Ÿ«ßtÔÖ®;òÐýOë_–óÄwoÜxŸ±]ØíÉ|áçŸv»Þ{ìwåä⤻w=ù@ÿÓ ;ï¹s˺Ûwj-|ÌZ˜Q *ô¦Çk‚’] :묷ßfQtŸ" £)†7%:,)2ÛS#Vã õ˜¡ žEñ‡ÔˆÅˆ@ âG#ÆcÜS‡~ú´úŽzpÏžƒ*3!ÿùÓý÷ŸxYýB}¯ißáGÜtÛ¦ÍkBvä™ãë²D½tð¿êOŪ„8 ¼®×"öiWð¨Ã”®!![ “3xŽÉ×àùì£;ôx$ÄÐ1‰ÑÁ’˜ÔáÈ<2ôå“K55Ѹ)b±> Çsó¼i^x.z—1a—ÆÜg…xNScÜÊYÐÜádƒ”¾ÈŽe%¬MèO #ÜŽgÜŽ‡+ÄíÜÑAäwÒ‚jðÿ¤¥ÿÐA•ß_Ó»nÃ&RÙüBKÛ¯ßeÁ?ziçs¿„ø’ÚˆõIº°¢˜FoœS‡ã¯E}"·ÏV¥QÌØ# éeA<3•†Ío0m„ò€¢²ˆ  4R(£˜¥‹BQKg4‚Ö®±kÓ4iÚ¬èµÑ;¢÷Gë–ZAÿÍÔ¶%šGåiy>òÈ3x±zèú¢âÜíöûDžoÆsÔcÍCK7–Î_¶söG)Ì íâfÐöt‹7Ó¹N’õB‚F¡.Ún&ôÝŠl†KLÑZL)YáQJ”ÖÌ%ÆF¾ö/Bý¯§ÂÄi`žãÚãÖÅŒáŽÐ"ßð=Dj6¬EŸ}‚ˆôûÄÐ3'/  Þ<4ÈñÍÍß" óC·1ÛÀ:Íxe´Ú# zÔÔqéd-/‹¦­¬–È)àPÎ œ£ŠÆâ—‹êÔœìHÌ®0òBz&ïÑ3y¹ý†ê%´…¶ 1@Ÿe®1ï00Ÿ4 KàThܳñ¤Z²ZÈ\­–œlâ/~‰kÔ_~kh S˜;ëÑD¯M'µu< rNAf I !Û”3²êaÌ6VkŒíÆuÆýF1lÂÔ×((¡¨M…mRhŸÇAü¼Ã î ËQÄeŸ%¹ä±#ñ35=ÙO¹£ƒÑ Ò££Pgd±Q®qמ=»víÙ{/]ˆþòK­~^ô—sç¾üòܹ¿Ôã\UÅ9êoTU}𛳿yk4êö&9Í¢ÁhãÖKQÆ>í“jxäq‚Ì{ðd“GI7dÑà’&üÌ2ѧ9>u|ÙîbÌq!W$qZÓà +°‹qÆE›…ò­ÄQáãG(Š1'sïà…GÔri~òg‡ð²e} ½|úà̦盂¯½Çå7Ýwúîç‰?‚âj„O€†vTâuÉÒgÛ§@à‰ˆhôÒ­²Çœí±êÌù°#9ó¸ç(Wâ`°9à Áf½>ì»6ë0_™•9sFVÖÌÿ82ô—~00ŠÌY³2³fÌøvL5/0Æ‹—?Á¯£ Í+‘Z©Æ "dPØÏÅóÙG übiþÄòò‰ù¥“ÊË'M,/£Rw¸Ò R—€~áM%bÜ*—_Tºd¿Í/pª3Ô¸ãÌœ.9E)Þ¬“97 ‰à C™‹@Ôs–üÞPö,™Û/3ýp3L!üõÎí·†^2ºi£ò¤ÉDæeAe¬•£e—#ÇÊqr¼A†à7%à,”…Å¥h)¶‡V6¨†B°F"3/U_¿eÁá(õÓËhù¿¯X!ýäÞ‡?ºñæ¼Â;Õê”ȃþªþm¶ïþíK§ßòÎä.Pß ^PŒcYžy¼ÔfÛ¢ ÏL$¦ÉdIMdîo8Í<¶,)˜t ‰PEp2'x½e"€é†È‡Ó˜0)þû¥KÿúÒ¥¯÷^ØÚ^7ø.Äw·A¡߈çà¹øFõ õiõ˜úD3u…±O?ãÚëêÕêO~©~¬«§NQðÇA“ (Í÷z02Ç#¿ËÊ”ßçÖí²muÕ¸ï÷¥$xÆ‘»É§ tcvÊð¢õ‚‘” g8Ðxjmj*uãöQëDéÇYG Ùd|0²ZtüŠu$ qÅðrÑÓ͇F–‘Ô˜ææðêÑ ˆŽbÑ ošÆ,º>-ŠåwD¯U²i÷™$#ŒzM:še7gÇ+<—† ,x`ªi¦ùî+¼…®x툥_qLêâà IݯjP æ¦Çc*9¡…¡8LaD×ró˜¢8ÉŠZ\5oy5ÎPß;?ôxÿ3¿œ¹a†=·|ÅÎÍ̓G˜Þ­?z,*:l³…‰ =vTäM—o7¯3Þ®×HëHP¨³â þ6HRe“M§•M"¸C‹Ü¡#ìÎ+€JNh9ìë ê€rN=—ö~ì¶!¿Ç¿²zhVW¯V¹¿±eê§~§žS•çÂþd–‰È@g½ )‰Ó úø.Î=MoЗé îDÞF„鎇í\`ùÓkƺõ†Ä8­s¼=nš¬M·¥pãeT8–åçBá§%’m ž§âþ5•“PŠcú+5ì{QÒQ÷8`€wazBº;=1=)=y±n±~±a±qqÂb÷âÄÅI “7$lpoHÜ´!ywÂn÷îÄÝI»“%rJ<”t(9Î;ní¸'lOØŸp<á|"ê‰è“¶“ö“Ž“Î“Q'£MÀ¹‰yÃJž…3q˜eöá¥êC¦®³‰ßv×­w,»ýæÕï¾Pýl}¿©»«gñÆ{ö¬ÿüõåS¾éY¹tQÑ‚ëÆ{~ÔpÏ!ÏØ/–wUVμqìø¬mÁ=¿ð°õt„4¯o£°Õ;ÛêÓh5ŸV«±+¢F´)Xf·Z4<Ö‘ V¨s(ƒLà°jˆS+§˜)v³Ù˜"¥èù»ŒR¸D¶ zîÌ9 ,¡ù,gÁ3çâT¶„=²tȇ?t ñ¨ì¢´Ý$i´Ù­‰²$XÆX²,Ö Û$ËtK¾5ßV¢)¶Ì³Ì±Î±-Ô,´,³,¶.¶4– %` Øz4k- ¢ k‰UkshlZ›5M“¢M³¦Ù&hrµyÖ<[‘¦P;ËZd›¯©ÖηVÛ|ŸÖg­·uiºµ]ÖNÛ:×~×®“®àEXP%<¡AÚÌdõ5üKÎÀðÞWO?¡¢m*baÚ·gùt¤ñw|û7Þü-.wù"hÐû@eYÐ#ÞÍý9æDQ°˜9Å' 2«RÀŠVc‚ÞÀ`F'š‚ dZÂÅ:1+²É¨×j FF«D¬Ê™7B ³SÏwBj&±3Gt¦¤Ö22kXUøh>ÆBin#ŒÇǘ<æqq)ŒÁðÁEQ&‰bº¸õÂPñœíçœýÞ¡­Úºæ ǽòm\“Ð|龦&\¬o™J„(úÄ@6<à]¢ßoµYuû% nÓô:º < cÄŽÛO‘Ý0àhf³ŒÅÌY¦†2«­Ù(®OæÑ>=0Ò¢ z¤ÕÐMAY0ÙëÒLÚ£+‚bMú¡À0â5ŠøeȬ°C粦`nŒ5ß Ë·ÎÂst%Ö›t·X}8  X» ãê³Þ¥sˆHƒµœœ ÕH¢N£×D›•­ë[‰5¼ÐéÔ*ZE²èlú(ƒÃjµ¥¡18CJÓ%ëÇ*cÍ© Š“Ñ<›N¦óÓ…éâtÍdí)_7Å0É8É2¤¼âBm¡D×›K ÅÆb¥Ø\l)¡½Uà ®‚TðB…X¡©ÐVH•ºjýBËk•­ÂQ †ó_#Ôˆ5šmT§óé¬u¶G7Z…{¹5d C½b¯¦OëMè•VêVè» ++M+å¥ÇÜcé²öØî’6ëN9VHØ ¶“éj=+Z1y+_=€o_©ܯ^Rÿq¯úrþøñ Ø1åiîíææÁYt÷ò¬æ¡ñdÛi€(ìSˆ82pºw³ÞŠ>l¾Èù^ êÑ–îXk÷¹Ú,ó-Û9i3ìš”¸ $s×6ß¡ågõjó­Dì·Âì·Þ=.{\ŸöqëÆ KG‚µ¹ý6±eÛX46±uÑeèé’uFB†;#1#iðk²~²a²1ß”?9a²{rb~Ò¤ä]‰~Ž¡ÄXœPâ.I,IZ¤[¤_dXd\ä^”¸(©Ijѵè[ ÍÆæ„wKbKR yµnµ~µaµ±×´:aµ{uâê¤Þ䉯õã¨/0;¯ô)Wn[†|];Ñ)ýÐOo}í™×¡þEýëêËŸþɶ-]§œ~ôÄïÇSO?´íöÕÍ}S'ÞðÂþ³äP.ù .<¶ÊŠÚ½ãê4ЬÈeŠƒ ê„:3uRŠÆ’¢èS4²œ¾"s‰¶ð®udíá• 4÷Í¡ùLˆ‘Ì£n;e‚IÐàlû<{»}}¿]1·8œ3Kë{í5¼–¬ý7ÎðZïà¬×˜‰m೚›/õòùöA°7—/©ùüZ°7±˜xáý–M1±œ í—e“^ÇIûM²I ¶µÓ$-æ° rši‡Ë´qœìBœÃ‘‚Q¢ÖFÏï³<ÇÙMÔÒie94Ý‘w泌àü 59 „ft}ÖlùÓ’@-E‚c@|±SY„xæ5²]É2ıº±útSºœ¦,ÄUÜ|¡B˜/VˆUšºúFìã¨2û4+Q^ÅÝFn㻄.±WZeXbÓ-w++Í+]+cVÆŽ" C:*…nlm{x©?[¤vöâ/ãqxÜ~¼£GÎé fÕçÜ"æO8ó¥'Éo@_S¹÷››¿­¾u‰"¿>kÊ —σû¤Â„îñæSÛMCìc¶¬–t’ÑÄ!E§“ʰV'r |Ö1Ø’,èåa?u‘ìJ4J*ðK½IZ0¸<áy­…£¸()ÖkÃ5Ž55ØÓ1YŠ—J\Ø@1”q~ÿ9>¶sè?ºpçš¾ÝÀ÷ÈìšØÁt„ø~°D2£ýÞTÎàcƒ]g@&€¢S œ–‘ÙHd½–³(ÏL€Ðœæ£ŸtÝðdÚŽÝ»·CâÅv1·…÷Q³Ð4oRJñÛ%¼ìˆ¯ÉN‰2X„tƒ0‰1vQLOÔgSr1²ùÉ|ß½@WcF-;“QåÐb}rR „éÓÒò" äÙýwß½Ÿ~2îºuõ–-«o½«åð õëoþGýû‰Çö<üÍÙ³ß<Œ÷xòÉ?ù$Y¹iïÞM›÷î}ÍùæþßòÉï÷¿éŒybÓSo½õÔ¦'(oãRA)RËí'ÖK¯Ó/—_ È5i6‰É‚Á'Z"Ý“¥›bçÙ–à1 ° º+“€¸’À' ñ î„Ä„¤k­Àn}>†í¿› Þ»>œ˜y¤õêeìürËê õƒyG–´ïh=}B=±}ÏžíÛ÷ìåœ;¾ø›Õê#ê*µ2>þ Nå“Þ:}ú·¯½ðê» ‹ñ{Üb®ø¥<Í!âB….:óF¶„}1‡TÄuî g¡¹ ËNTék·^™‡â u]8ÕÊ¢MvDѨ‘˜3çÙª"ݪdy¨2ýTvô<ºøw­Œ”ÞiNztõP%þrR'wbõ•YéŽß©O¡ÈŠ=dúq(èõ¸lcx½~Åÿþz=[üÁ öæ²`Ï–üØ‘—£Vìw°C:ˆ+A|øÑÜï]nV8y¿Ín3í7šìp›&›4¡”dš–Ztï‡ÐíA$¢iÙöh3 4¢ÌnÒ ^ër€|Ùg• DÛgÖÅDÛYê¢`°ð’Å ^õƒpî.aðòßu˜šXJ j\c…bá ×?ñHg²£S*kšJL7¡›4‹L í ¨AÓhj´÷šzíëÑ“M‡%N"’Q”…hÁ%Ƹ°‹s‘h}´Áe´ËÑÑÑ.{Ì_=œ‡¤êS cŒé¦4pÚiæŒè WzL>7Ë'ÓI1*Á³MEòì˜Åx·ˆ,aBãM¦ùòÇ‚è®1M¸‰k"Ë5úFC£q¹É/7ĬB·â[¹[É­b¯±ÇÔ%w)]æ.Û*ûJGwt·«;fÚ¬ÙªßjØlÜlÚ(o´m°oˆÞàÚ³„: kØç3Їnါþh¾›ú .Ý¢Ú7~þÅ]jË6œª¾p'~-·ç67«=êDÈߦ©§á{>Nhøˆú"· ¤Úˆb½F‰+L"Ò™ gR.€2)ƒôì N£+í"[ä¶ý÷7ßü÷6< ¾ØŠÏâzìÃg[ëšÔµêOÔƒêZ&i;aä5lä¯AAÖ “Þ "cqÈ9Øš7®4¦ç9èmç7>pñ›oÔëšðíøfЉۛêZÕtuŸú šÚõä?‡Q£ñZïBç~IëØowHZy¿"k%­i¿$i­6ÎbŸ¦(²<Í$SIuÈZÂ%ûúÄQ6…F€û, DcЉf‡ÆbFÈãÔ¤ ’íRØr=ø=ðmÎüð ½óTtÏ+£7´7œzÂ?üÊôЈ÷­$K­Ó¡uÉ.Gš6CÎpL’óùÎbyö&y¹v¹¼ÜÑèìÑnrì–i£xI §`Œ¢ ™DYkÕÛ4‹dÕYõôdŤ˜ìrŒ-ÊîtŒ‘ÆèÆèÓLòxH9ÇZÆÙ<ö GVÌÃãS¾’gÍ·O)’ffg™ ­‹¤…º…ú›äæH6J †&”Ë•Zs­¥Îê·58jbVI«t«ô}Ê*ó*ËJkŸ}‹u‹m³}³cGÌny·òŒô¬îYýqG5ˆcFxCÛŒG‹%Ö@ì2ghðГýžº|LÀ»îº¸W=½ó5Lƒzü HãC¿9|z£J÷²+Á™Ÿ«dDMÞ$iDïÜ4`g™^â¹>qŸÔ‡$NGÆ ºñƒ€¨ÑUÇϺ ª`æ¯>ª6²³ebÖ¶O¸‰:–fg¡W%÷ÀÐ6‘†¡nFóÒp'/¼ÿEõ_©£Ù‡ ÷æë$N Ó¨ãh‚Û4­†çN¤kedÐR›¨#ûÉ‘±ÈÓÈXÏDƃÿ22Öꨋ‡&]ãÖTiê5+5­V+Åð1‚]²ëÀÐñc…±¤¦I([)F³³Áì-4-G¦•üJ¡G\¥eì4Æ»¯Ìð%µ÷Š¡—eñ,+œYN_lDÙ^—^ÒP,­ÃA$¦hu²œ/Ý5…BæÙ.\€˜X1jç3ä_¹Ù'¸Ã̯6k¾¤n¡ñÎ;—?Á‘^»%xeR+Ùke©&Ê""ŠRhäMé]±ùcU~§lÒ¤²ÒüüÒ²Iù¥¥ù“ÊØ†Ð¤²2n \3]ž¢æã£l§+¼IñŠÓ@$§#f‡U2ô™öYLˆï@DtLÓCvÕ61Ki\õî+Êoh ÞÚ]ãnwòÖ Lºà KW§³3ŠCK¯Ø c›t£Ï#å½I·Ä ²³fŽ?‚^z¬øÎiË4ó+—Ü4¼3¦ö5»âàs‰‰ï×,^};;µƒ?äWq”é)Geý&EÑ”Gƒðn=m÷9ŒÙéó1Œê O8àºøF6äÝfܸ_xgènpáwäkB³$zö%Ëeâ¼Y°˜ ’‹ ,&‹rfpþ…l¡rqê9`±(ÚíÉ&L"Ò_Zøwë&õ¥²ÂÓxÍ&á€÷ðíÓŸøjI½ùÏ% 5ŽGj+@'?6`€.‹ƒç³1ІÚZQx`¤å`ëSÐ-ÞìhÙ®%—b× îÄ8©S:±½Óº"Q'Hªâ@VÎnƒÇ. ©L€À„Ó?š½XBšÇbÄ|zVŽU²[¶`g;©Ã‡‹¨ˆåÚY|:«C7Xyç´<Ú²ý†¶·<úi³¶-ðÝñ£ºÛ> ìús»»]»1÷á½ ·©?´)>iÃêÇÛ^Åo–Á-'ðÚ»>ZÜ|Lg4êL–;Í+øX<ìH*¼vÙìéz~ sÈ Á ?‚Bnš D Á=ŒHr2FE[ç×ÝyGýü­EÓÿñ³–íÓ¦moùÙ?¦zÓvœðà†¤øMá„í75Þû¡ª2ŒTõÃ]TWw’÷IGø„T®×ŤĬ5òuLJ@-’žØ9Ó"숤X#GwS#…åE§ñm›±·” ÊF~ÜôÇï¸áÿµ¤búcL`¨Õý,Ðb˜Õ†³¼…F§÷)fEy¼nŠ^Gs\-'±4W‡!'|Ð(ÖYÀFÌz« rÉ®áÉšb6 (…³+gÎ ž0[Bd£ÿ¿½ø—Y¦kÉG‘ƒ)>;Rag+ˆvd¯ Ž^í Û™i°Ó–¡0Õ§ÑMÐê–ÅæÝ*Ò£Ój$­žˆÑ¥qiƒb««ÍrLÖLÖN”&é¦ëó Ó ùÆéÆé¦éòt¥H*Ñ/é—–V!° k+5+µ«ôt­h‡#ƒ{¶‰1ÚÞÓ#wžTs·rãŽànÜýs|t›:ýdÍ}vÿ w3|{†ÎеýšËŸˆu@÷hÔæM5ˆÑV$­w˜¨öîâŸÅqõ#x1ι—?ñí ÊñoŸäŸý6Ÿ¿™î¿_®VpïQ.£VoŒV–0ÝX°¥ ¾ÎrÝL0¤˜Ì:­&vŒE9ÏNhª¯„Ÿé®¥ÊG³CznªŽ,ç]Íñãá@‡9÷Ç;ÈÂ…=·|Á­8ñʳïUøúÚÝò››/üŸ’¨o>‹nÞç!bE‡kD.ŠGN =$ú¹µ™yØŽóðY»¤ò&2xXÍ:¤fƽì<õvžÚ’Q•w\²Æê$ȽK‡úlî#®]ÊV] ¹Ã¶/…÷8­bºó ¼8—ql ;˜™:™ù=g&‹ ßfºè/GþÙaéo…æfüé?9&>ŸùÄñh¶7É`–ŒAYj³¡µq>Òæ Øjg2˜ãÒÑäLM çTÎ DVº"??€xÌíÎvÏcñX&Nvsì§&šé!h‘OýdŽÞ’ÿøŠªªXTWüf©ú9>·^}ó õˆÀ{ñ¢uØüï|î—êSj¿ú+õȤIøöæ¡·ËÊðÏð2\‡:eªúõ„ô·*Ÿ@Ôª‰Kò*ô×*–Zo—,XˆÙ ²ˆ3ú7+££ÁðïW¦Óà•~"?dáõ“ÊÊ'Býõ)nÞ'±_"ÆyM\;x­€©œhÙaÊá#BðG/&(ôC:ðÍvúG=ÎNÿ8Pòzceg²ØâÚ¤€ Õ$[dä¶Y]&ƒÛDR“Ù9 N„ÖD.øôó±e)Á”)@^H9|HAB<ž‚í™8}ÔA!R£>ª6 RϨßLøqk£ÿé ŸŠÃ?ŵ#§€ÔW['Ïô>£½ïWŸè·\þ„|ÎÖv“ÐT¯Û B”=Ñï·Ë©&YD(Æe±cä´$b—Ìs œ8fpP_ÎNEzB–óô6èì„áCV¸±,t¢¬ìæ“ÕÄøÃV?ùË{nëØi¯œ1ê³2ß=öìù\ûõ¾Íݹšîƒs¥ä#€ÒŒJ¼ã£^'ixp :ƒ–fƒ)`ÑŠ&ƒN4f’BC ¯—Œ”¦ä|g84U.ÂósX4©Öd«žš:Q ¹$•|¤öâ¥êAã&£z°oT{KñÍð€oæß9öÌʳêxÍÙ•¿:Þs¯Qï<9çÍN}ŒñÎR|fE‚@YÏé|²"Û¡EVìv[™]‘6éè)XƒPç0ã éŒzæD‹SL±kÍ|äÈŽs9–üÈb^N8pºrEdÄ÷‡kg>ÑH)EJW&HER±ý&i‘²ÈÞ¨ô)}v£N§£{ìFÑ$Ê¢"š£tv£Ýd—f‡ÅaµÛÆêè:\øªtyŒ2YG—7讹W_dðŠŒ^c‘Ékš!{Í^‹×êµy]Uº…ú…†ùÆù¦ y¡²ÐÐ ~ðK r¹ÆRc­±õê×ê{ kÃ;â½J¯yæÈÞ$ˆÆ¨5 <|\—»óüÕχÖroV:45|b÷u.¾ßÊmâ^ú)Ÿn†¸u:Ëœ[½É’BW3”ÈjÆ:’h¶š¡$šÈ‚!´œ‚;ùIÏ×ß]Ï8*Ë”Œ.æ´œÈQ€ÀB=äÊF$Ï“u üÑ 7“GWóûo!¥}Å‚å#¼¸øÒº˜ÙoÒÑ©´·×-“§þ%hÙïãŸ=:w[ä·ò3Çis!k *üß`¨¦Uý“ú«~b_É¿‰8HïÅ&´‚5ð«Qƒf7š#$ )äm¸;ÑãðžÞ·Àg#|6 uÐöeÔmàùwèçDû„Ñ nšBëÅÔ)¤£9d"š"^B+„ÈF2 ßï O:šíæÀ¸/B¿#âh óq_Ã<Û M êÔ^í^½|Q<‹…Õèq B>~ýåKPwúLE“ÂâD·sO¡ÅÂ{ð óñw¢h’€ÏNþ,šÂOi¿ €í(z‡[}y ým>—‹^ãèw´,81ûÀóN¡øò—â T£ÍG:’w¹Z| eøøP'ôŸCŸ)¼ü´ú& ·T‚Àê%¡ôÖáGð%®…{Žû€\OºÉ9þ:þq!Qèöߊ Ä»ÄO5yš½šÿÒÎÑþD{F²J+¥ÒuºgôÑú5úÓ†fc¼ñ>ÓÃr—ü¦²Vù̼Øüï–i–Ç,§¬&ë [¯ííwöçÇÇ1Ç8ç9ë½Î£ÎW£ÆFmz5úÎèÏ\gc®‹©Žy:Ö[»<ö•¸è¸†øäø®°T¢ëÀO!&Uôœ9—× ·Ð_A›†ådò°ÌÐsí“ÃeˆPy¸ !6ª —y(/—ôÕᲈ¢ÐÆpYƒ²ÑþpY‹Lè­pYm> —’ýBÃKðÔ¥Ó†ËÑÝ.sH§;.¨?.óP~7\P”N —E”­w„ËT£/ —µ(V(\Ö§Ãe£%Mzf°½·#°¼±Ë=¦>Óë®ëuÏtuvuøk[=î’¶úLwAK‹»’¶êtWú;ý+ý¾Ìá6îþŽZw•¿#ÐPl­m»Ö‹k6ö·øk;ýîë2¯Ë~O_³·ã¯5V Ó]ëîê¨õù[k;šÝÁ†«!iOŸ»ºÚ'geõôôdÖE^dÖ[ÒFݵ°6êþ¯‚dÔuþŽÖ@gg ØFÛ7ú;ü0ßòŽÚ¶.¿ÏãnèðûiÇúÆÚŽå~»+è®mëu·û;:¡C°®«6Ðh[óÔà´eW£ßÝlÀjëŸvhNt5Âè-zuLRm‘”ƒùܵÁú@-Ìçöë»[ým]µ]ž†@‹¿Ó=†ŽÈ:¸«‚ ]=µþ¤ I‡¿½#èë®÷³a|@-P×Ýåg0\ÑÁã´Õ·tû($=®Æ`wÓODÛw„¨ ÃvwB{ŠŽÇÝêgX·w×µ:=£æðÐ9³‚îN?°ZÔ0úWMMƒaÛ)¡»Â¤cõ4[¿Û²¡¡»£ &ô³Ž¾ »3èqwv×5ùë»hMˆÆ--ÁŠP}°Í xtN¦ ­†—µuÁ•~†CH–ÂÐìFt†j)_ÚGd ôÎÝÙX hÕùÃt@mîÚ+0 ¶dt¸[ƒþk"îîêm÷7ÔÂD™°®|ßZÛKgh ú *lµ-] ~P€ak}>†}ˆ|0y{m@ÖÝRÛÁ¦òù;ËÛ Ë[zÛ;i'*¥µõ0H'í¨óê™BRç ­¶åÚ„ûDà Àkkéu®u@§ÃOÿ³C¬--tRRRÞDTÄrçßìðuº“†µ1‰ÎyáN¢Ê›&p§4¬5u~Ð':n7ð¢°2Í¿ª ôÆ]ÛÞJV[×â§/BØÃØW1¦±¶ËÝXÛ #úÛ®¤ L7"ã>ww›/ rÒ•¶%)„ã÷s¶3ØBµ›±Ž2ªÖÝB­èL¤a{m}sír@ ô±-8lC~¸h]1.ÒßÒ«¸Ð]4¯¼Ú]5¯¨ú¦‚ÊBwI•»¢rÞ‚’Y…³ÜIUðœäqßTR]ÈjQ+ò@m jƒö™P*€,¡î•Ãcu²'?ÜýÐg%|û åwÇq£¬E-”ªX)€ gÞÕÂø?´ÇÙÒ27d ™ðɾFÿHã0\†?-u±¼¡ý:P3Ôa¬EÓky÷ÿ猾ÿPÞѶÿ§±¦sÐO³•Ø ßAx¿‘½ó‡ñ[Îfjƒñ(”t¬öÖ?´¦fñ³^ôM„> Pja|£#G`™ê…¿ õ0ŠøÙŒ#4¡5íð„Yºœ#Ðø]Læêàm{™ãŸÏàa|£Üm^¾ašô09h„Öݬ¥L+«QdüŽ+d3m7£¡gwh¹•ñ3ÂëvhUÇÆî„Þž‚‡gÏ,©ž:™•h;¦ê•Üÿ~¬#” AÛ>,Ñ]WIÝF=Œ­?h†ˆ64LZ;YŸ‘}ì›ÎáawJ‰&hQÏÆ µ-Çß ãKˆCõlnƒ8†tò°†V‡{Ö¨Af#Fø0Ú.Pỡ Úw…5¢óж}¡Úh;0ºŸ›á]æV]˜2#ò¢H€õ«ýžÒ‘C6£ƒIQ0LåÊqÚ¦—ÁÛÀ,;ó;Ôú¾þ”.½Ã8´2- 0ŽX6 WØú…jBÐRºúFñ~´ô…0og³„hÖ £Ô²~¬| Zʳ¶QYí(FẎQ¶´–IQH†#s\M£Î‰Óh[ç»BÒjŸ~8WÎs5=®›'ÌóÖ/ð=V½#lü ®Ö+ÆÔtKeDo®ö"þ°½ó_Aù†•õOº†oLÆûê´}Äó&]%i!Ý)½Ê×Ô1ÝŽ‚·;¬.¬„·kPÍV1Z·…5º®'«eÖÕ?Üc4ïCp¿Æ42kïf÷Î0Œ~&Mÿ\VBØ]ˎӷݬՕT¾eÝ£¨7šÿwt¶“YшïѺˆFÑH¢e8é÷¸rÄv&ÙÍð½<̵lcô½:ù?aµþ9Vua]é ûdž+¨UŒ Ù\óP9<ѹæÁS5º "ÌJö®êÜÛU›ð4 jg1þ°7ô}ÓÌ› LGœ‡æ³±BcTÂ7{ÔбÝì™>Í…öå0í[ˆ²9 a´*Ö²’]µ¥p/ ·£=fBÍ|x¦åÙˆF§¡ùÊ¡W5Ó!Ú‚´êGf½ª6c²2xª„ñ‹Ão `ì6…ßÃ(EËåÃp…!-`4¢#Ó1gD¥ì‰Ö·{´«bô,`8‡ -g8Áû.… ‚'BÍ„{ÌM[̸ªt¦êpKÃâ3‹õ§³Îeµ!Èæ…¹LË#£d†i‚ƒÒÁðÌU ÿR¸Ü ÿj¨©f¼)€ñ#ãFdg6¡lXŽæ3ü æ±f°w”Š”ž¥Ã-+Gqe&£å…|›©€Q¤êš˜DF»’;×’ŽÈ ³~…ŒR¥¬uбÚ— ׄ䱄á:3LÛИ!¹ÉDé(êÎd8RÎÞ³†eª€ÑîJ,BBáÁ"Ä‚ð÷ÌQ4á~y˜»3‡y=IÙw©rÓÅBÖª€ñºj˜ ELËÂÏ%a>ÎËç¼aÈ®¤oD"í~ˆí™ûJÎbòT†°j˜ÿzÜûU>®žå?]ÃöûJO>:’‰PGÇ¢žQ6wtd²Æ³YÛÖ«ÚÔ†ìtÈä@£c¹ï[Åø#‘p$ ÙðP®4:ö±˜=vG)!?ŽTzØÛÿÊ[Y‹Ñù_'›7„Yw¸ÇÕc…âÌZ9ÐÙ:¯AÍïóTWgŒíÌ÷‡féaå®p”Bñë·¥õ}WeÉWeYÿŠ\þý;¿ÛÃ9V€Q˜Æ—™áq;P$_¡ ¥@{×z×G¤Ž6]—R,¹/Ìñ ‹/2Ù>vèÅ8´þZÿ/‚ãÜ:ïŸ^UÉ+Vòò@Šð²¼ìåRÈKFrúÅtá´¼˜NN-%'×çõä9=yö›ðlyÆFŽç_©ä˜JžVÉ/UrT%OöÏž¼Dúg“'Trd ù…J7‘Ç„Çlä°<šC~î#?‹'sÈOñ ?QÉ#>òðn“ðp*9°J'H%ûç’‡ò`&Ù·)^ا’? ?Ž#(äþ½&áþT²Úí5‘½^~tÜc#{Öñ»Md·—¿/•ìúQ¶°K%÷ÞcîM%÷ì4 ÷XÉ=DZ×+ñ;ïÖ ;dçqŒ¼%üÝ:r÷)~Gp°ã9²ýv½°ÝL¶{ùmPÚ6™lÝòœ°U%[îZ*lyŽlYÇßµ9U¸k)¹ËËo¸6§’Mͦx²éøåSÞËüF3YS¯÷‘e“;äŽÝäv=Yçó ëT²¶EÖF“ÛÖ˜„Ûrȹuµ,Üj%«eÒ·›ôšÉ*éYéz.‘•ݱÂJ7éŽ%]Щ+žtª¤C%+Ú •´I»—®!m­Ó„¶fÒ:´4„…´¬ã› ¤ÙË7Á”M—H ñ9! ’ÆåK…ÆçHã:~yCª°|)YîåR‰ù/ŸÔÛIJjUR³,S¨QɲLr‹J–ªäæ¹dɲX%‹f‘…*¹I% ž#óURå#•6rc©˜' kÈ<™”xgR=™ã#%IZ¡d7)Î!³‰"̶’" )ätBa4™5Ó*Ìj&3g(ÂL+™Q f(¤À+ z╈—Ò±ŠŸ¾›LãÇ ÓÊÈ Sm sÉÔ):aªLõòStdr¾E˜¼”äO2 ù2ÉL&É•ä]oòTr}®U¸ÞFrstB®•ä\' 9:’âÏuÉΊ²g‘¬L»E²Nñ™ñ:!ÓN2×ñã%Ÿ0~7ñŒ³ ž¹d 1ÎFÆyù±úXÉ“-d1ؘl’·t•¤M&©Æ(!u)II¶)U$º%[H²—OÒ’Dw”¸”¸Ì‚;ЏOñ 0Y‚™$¬ããu$ÞËÇ%“X™Ä¤Wt¶àª"Ñ0jt6‰R‰&uªÄ¡»Í&Ø›‰Íjl6bóòV+±@;ËsÄ ä5«D›2ƒÈ¿¼›˜àI%FÀEŒ^Þ =<轓š‰ÚèÖÉG´³ µ™ˆBŽ ®!ôrƒñã Êé®"H%ø8ö­ß†Çýöý¿ À÷þÅ!ô¿Á•Ûä endstream endobj 128 0 obj 16590 endobj 129 0 obj <> endobj 130 0 obj <> stream xœ]”ËŽÚ@E÷þ /'‹‘Ý/š‘ƒÄ"…É»a, ¶eÌ‚¿oÝJ"e:nWUŸ.ww±=ì];?ƾ>¦)?·]3¦[딟ҥí2có¦­'}’ÿúZ Y1ç·)]ݹ_­²âçüî6üiÓô§ô%+¾MÛî’?ýÚççã}>Ó5uS^fëuÞ¤ó\çk5|«®©¬çC3¿n§Çóœò/àý1¤Üʳ¡JÝ7é6Tu«î’²UY®óÕ~¿ÎR×ü÷n©)§sýQs¨™CËÒ–ë™­°÷`'¼`Ovà@Þd ŽÂQx)ì"ø…õ·à Ç%æ•,ónÉ ðN8Èøë𞌚¦d<ÆúïÁôwð4ô÷˜Ë¨?Œúc†þ^âé¿xÓ?J ýýLÿ ãô÷/`ú/Äþ}3ê/1ô·¨oÕ1–þ¹–þk·ÚôÄÒß Ó?ÂÙª?¾…¥¿GO¬ú£W–þAâéïÅþn–þAêÓßa–þ=´ôwèƒSä:í?œî¬Ë©¿ÄÓ? Óß ÓßJíÿ+Xý7`úG¸9õÇwtº$Fû/ [¬×ÑߢnÏqäzúôÜÓ?b^¯ýÇZ¼c¼0ý<=ýÖèéPßkÿáàuÿ£Ï^ýñ]¼úK¼ú˼ºÿe.ÝÿO'žºP?Ðß#7Ð?lä°ë©Æ±Ç½ôç:Éëû8ÎW‰\^r‡àöh»ô÷~úYòû Þ)† endstream endobj 131 0 obj <> endobj 132 0 obj <> stream xœÕüyXGþŽWUßÝsôÜ3 8Ã€Š Šˆ$$´ xEÅ1ހЀQAÔ(£$’¨ñÌB£954Éjîc7Ñ»ÙÄÏ®n>æØÝ°º‰Ñlâ ßwõ ¨{|žßóûãû<_†êªêªî®ã]¯÷ë]UÝ‹–T!jB Òfͯ¬OþåÛB¿E[gݽØÿäè¿\„ðy„Ø™sê«ç_{+ý „øBˆ—WÏkœ#=>÷ÏÉO"4<¥¦ªröŽ·WHî1¨N<]) 4¢(µfþâe·¤Íû â©pÏÁóêfU ç>ÐÄéþ«ù•ËêÉ“ˆ_ƒ¸Aåüªõ{݊ФDxÞÂúºE‹ç ÚN„¦¶Ðôú†ªúGÆ|Yñ0BÒX8‡áGÿ äiœ0,Ç ¢$+£É¬Z¬6»Ãér{¼‰I=|þä”@j0-½g¯Þ}úöËÌê? {`ΠÜÁy·ÜšÛíÚ¡Ã ‹Š‡9jôcÐÿÿ¸È.ÛòßJгÑhÊDÏ£h:ºmEkPjÅŸ¡y ŸàZ´í@p"²Cú6t óE”ƒ!§ˆ´íAÃÐx8ÿ$\ùÜpŠv~ >\Ó¹íè¬ïÜ yt~ˆÑdtº—\FäA ¨Ý¹[±™Iè wžDhœÙ‰Žw>ÙÙw°Ág¡ãèÆÅ¤1ï"‚ŠÑ¨-€Ú<Ïz½„^íüâÊ^޶âQ„#¯wþ×J( ü“ÐP’#è:…×ãVÒ›9ܹJnD&¸?ÔÍAëÐãèsìÆ÷à-øü¾H‚ä×ìXh¹T4M„vX€ÐZ¨ßv´ íCatFÐWè\‚ßÂﲫ:oëÛ9JBïÚõ…ër¡¶ÕhÚŒ…>‰ÎcŒSp&žŽçágñóø,#0N¦‰¹ŸÙÎ|ɺÙHô‡Nogk燀ÑDlðsAzBËd¢,¸ã`T€†£Ñ0°§B_Ì€²Ï…Ò-‚¾X m×5¹=ˆZ UE­Ð‹mP³' èï8üN —Ñ[èSô?èÔ‰ElŨw>.ÆSà77à»q#¾oÀ@[ìÄÏácð{ ŸÆg¡eb%r;y‹ü™ü/£2L>3ùkeDz{Ùß ÷F'FŸŒ¾×¹JO[ØŠ¼(Ý¢—wš¢—y´I ”yZrÖŒ6 ÐF›Ð(ócPÖ'Ð èEø½‰>@_@ ÿ E ÕÒáׂ_”u ‹'áÉPÞ» -×ã]x?ôÛ§øsü7|~¿L$â%=ˆøI2”‘Ñd ™Ffz²ˆÜK¶“¤\$—ÉŒ™q3)L?Fc†Ã¯’¹‹Y¿×X•u°³Ù*vfÏ!®›À•q¹K¼Ìx ?ŸÈoá¿ mPú›þÈ\|ïA—¡­ÿ†^'¯‚|öMC³Ñ:Q¦ÍÇÛð’èf¦“é$ÇÐLŒ ÂNE}™íø+h…‰L"#pa*¹K$ó0ÛÙßájòV„ö8…ï@HËœ;0{@ÿ¬Ì~}ûdôîÕ3=-˜HIöûz$%zEâ 8­"̦FŒèKãJ8QyÃ‰Š°Nßœ'ì¯Ð³ùoΩAÎ9ÿ’S‹åÔºsbÕŸòûöñüá þv£'LM†RŠî÷ÓjL˜ª×nŠÝ™PHzŽV3Váª@=S1×–C5›æV@g%l £ ɇFiÇ;Ï£QEþM“¦’ÃÞ@Yeaâ!;Ú4¡ñÈHÍ?ò放}©–XK2™ãƒñÆ@UwšÒ³Ó”º«©1-Q`$ˆHØ?Ë%™“à`z¨Œ6Í Ù௠C‹ÖBûUlRo¡ÁÕ€Ó!ÐñÝÍg*ãgø ú#¢A*.Ý"é]ápFF¸wo*)Â0èZ(Ùíz<§oŸ»Ã£õª?<š •L…‹ÊnÉ„&ON¦½¼¹]C3!n?5÷£™ÞÃHËÌ( “ šrª+Å1™¦4u¥t_^q~Q'Kް˜ÖýoV¶¢š[ÂØù$WÅÒaøù±\pSÉÔ´ÊM›½i›î/ƒ®)†¡¸iSqÀ_¼©bSe{gÓÌ€_ l:4zô¦ú¢Š®*µwžÚì k÷—Õ`hÔpv¬5¶aS/)‹…ˆ—)ë ˜…ð!.ИCÛŽÓ#^x§C"Æße$ó\;îyŒaÈ(I`i£‘âÔÕêåü1‘ü±ê•ü1j$äÃ1Bý³²-É–`²%¹^}÷ŒþC¿ ¶>õ–Îo™{;h?/zD´:i¿ú’Ê42™] Ó_t ;¶o5™Í¬§TÐC*(ÖËÖRV±;Ìh9^äXŽLØÔN<‡ÍË…ãИ‰ê•ŽH¨ãr‡Åš‡ x¡ Ãš—™YÖ¨¥:½œÅ•fáÌ“‘[qLÆ ’}2Ryëdä4x&c¯‡ŒŒ ê2Ö¬A!Â.ž¤‹jÍ`µÉNgöœœ–žHáÉ©iïl=þÕ7‡žþGî–¶Í}*:-÷¾`ÖýxŠë™ç±K؆“£¢?d9†#› gí£,z4uÔ܉k)N1M$2^·2Nk3/ÌŒF'’â” !“±ÏÓdD9CX…« r©WBù‘ Ðò‘|½ºùùj~A~A‡%¯9©QSmv–³³ÖZÎÆ9jË`5?éõʶd; ÊЃ8,ËÀ4Z‡eÞú¬ÍÓŠ—ŽLÝÖsò๫شSKsËÜYDî[2ïÖ_мBËžÜù=~ÛŒ¥E³ú=YÍSâ©÷4yZ×"Öd§Ùª ¢-ÂíøyÍa´,Gªª®V™-j›J̪O%j;.ÑœFi¹f–}r½Ì4Ée‚dU&2MÊPÆKF5c ”§Íx¢B–­76Ïy‰æ!y´$‡Üþ™šÑ°0t\‚»Ã£Ò€î»/ÐÞ‡¾|­^(Ð[¹ £™ë—aZ©¾ ¾;C¤Q}S|õƒÁа/ - ÙÒAåÊÅÙ6§kP®-›H ¥FíȼÍ.dG¶KIòNl‹2º<¿w´úi5­§éq¶gd×¢µ÷ÜMîúåݸú©ór'bvÎ9é¡™0úš0x‡F²M÷P4¼ ~2)"öÏ’ÉæåkE»çÄÇ=)‚qoAOjæi™DR4^a°"}'žÀë‘-.é`At Mªψ¤@Ä"mþ …!€²P ªJF§ÐXTÁÄêø`U¯@ƒÅPX½¼0t!&ƒ Žq„pÌ,g2Í„7³J-gàÔë8Ñ{Íšnœp !#²'çŒ3 w`æX5‘M{¬~ä-ûÓ‡ÞZ½8ò)ŒŸ@ô*¨ŸèP£ÙV{p®è(es©¤X«y ׆jDáÚƒkÄ:>÷Æ.U´NÆ&Ù0rMÆN!‹xmTà@6»°CGé8Lã-Î*t&±Ùi'ç ¤åÍùæÐ ýúðÁ¿ìx¤®fû#uµÛˆ ÐØý6úSôËè·€ÎÖßûÍo?xï}:ö ™/0µÍe°Z·hÎtk®u¸µÔZm嬊E@¼Ñ0[SÚ±¢I–& Oðl ÑXY-õ&¯gš\nj¼tfŒB6˜KŠ¡Æ8Ò9m®*A.T@³+!Ý«U~zsü£‚k p:?A¥>ô”ÞYx!vrÊe$®ñŸ[ ‡{÷cýjX!õÙg?Ú÷À†´áŽ©wÆ¥ÓAêúEljû¬Ë'µ •T›èM ˆ©Å[S‡Š£R§HÓR«¤¹©&§ÍËÈðÃ(ä,>ð´‘~›ÓÙ3Ã`  ~0¾ •"0î]ݬ´å!‰žm6ÅÀ“6~(DTnF´™Aܲ8:O€^ ?èJÐ&ÿjÖƒæ-:ùLKÉ×oÜ÷^»Ë°u}óƒ;¢0ûøš+l¨‡Î!²a?%Qø82RfÑ S‹Ëjœ7æÇt mP*1]J…Ó4I²åº±àO£ý_ÿ®8'gì_ŽGýd>3&Z¼vÉ¢|ðÚ‘ÈVxLo`zÿ uÐm ’p–T'ÕKmË‘20Ò$rïóä} £Y¨@H ‚õóèâý( ÕéøÎQl'|’‡$Ò¤:T›^ƒ j ãã$8w( >]Ì6pÆçŸÿù(Ñzh]J¤ ¹Z:Ï• Å“ <"bØ2‚‰,•)HøÝ yBÖ” å’ÂìÓˆ•*0-1*Ž ½F†n]…á ?DKA1ÆzÀ €²ÄÜz¦*r Ù©&_r'ž<5>wZ åú ÊeÆ÷k¿VYŸ’d*aË•rS Ûª´šÎ°g¡ŸYƒ"›>eÏ)çL ³|ŒeFGš>U>5œ5ž5ñˆÈc,$Ù|¡Rd¦(S -VÄ#¨–4Ò“é)¤+ƒÈ`¡˜ŒJc•RcZFîV–™8Æ †c¥ÜRKê,[,­–“–ÓÃ:²Q¸Où”ùw–ç·1{ùmJ‹¡Õ¸ÇÄ{»B/ñ𦠓”2“ØÞ9JÓX£Áo2²ÄβD1²„“Â2f³Ñh0È"1š+JŠ*—Ë[äVàN܃üÎÒÌ*[Îna[Ùƒ,·Ø%=—l2ǺøÑIt:‚uJºD@Jb}¢ê}B߃þóÝ´;€8Q×IS—ˆ³]¼‰2@xè•¡ÐÂ…Fp좤 ,À–•qRž#û¿+úø–è“܉_¾ÿ|ünæÚÏÅìo~ÉaÏÿâ§rQÒù »°Ô‹Îh…ž„‚¤d„i”e´wªéNË˲۲+a¯÷YòtÂó^5ô4õ±½¹d°)ß’ã}Ö"eˆæNõÖwR£§¿¦=+XI=h~Ôp Øýõ¸ ·áSX(À €œHO·ft6žq–XÀȈ iƒðAÝ»ð‚ÎÒ*{¢t¦Bm6í7½d:£ ‚Ÿ™ZRË4’F†åEQà$€6ÉÀJN4ð¼h0"$–‹¿;vT^wïXy‹×Õ›;ñs1~%ZH¦áG^^òÀf*Ùmp(ÐmÄ;µB?WÏ5q-\wŠ;Ãç.q’ÊizWAÓ=R)„SDçÔ8cg)[娏&¦cUp]ËÐÎik¥Ï§Ï|0ú'¬¡€›?$ð”v›PYàßkk)!L >E1¹ ázÔ7©,Y¯óM Í:çLÐ fBGÂ5à”Ù`ƒÚy!}РÜЇõêÛ|ðÁÒæÔ1îò” Û@oMÔÙ°ýJ“d–7Ö`f˜§yº5°Œ`ì áXNFX$ˆ/C§qHÆG ˆÝ{JË–|çm¬£É‡€î¡rÐi«ÑÔŠ"ÉŒèÉrˆœD§AA‹™b-Ú ˆ"4ËeèXKL5ëÒ ‘x?S9¦šgëÖ>cÁ$1r•—=ñĶè\¾9vmÔ¾èc„%Û#wAK £..¬HLÐ+9‚½¤`0O)ˤÉÁZ©*hr¹Ð<Œ~Ê…“-&Ê… 68Û+Ùü7½!áí^Àñaöm›Ûz؈L[L§LgLçM—@™T“ßTaª7qM:… ëi¼é8î…úÀÕ©0˜gÿ'ÆxúãÊÉTàŹii9ë§(sõ å» OÌ3ZÆÌËßL†Éì'HáúãGo­’ÕûÑQë°ãŽY þÜ?ûcZNï>~ß0:7ÖÐè ÙÑFMla™j©±°Æ=¯êvP“<[3( Ѳ_š­Œ,j½Q7†œ` Ù— 5²Yñ)DyXЉ)éˆ[B1±¤óXùco6ƒò" ßé#üëv­Kjsoßá­……©SØC­`õÊdØo?Þ÷à†`qŸ½1ß1­ ê³ ¬Bç”´_ëí÷â<Ñí¡„Çd,ÎhkŒ)‹‹"‹D¬€H‹È$¹´Dä1bã@ëGbü`€qtm«Cnd!5iãüGW.}—œf±ªVÂSøfH´ÓF·b«Ä.VÉT‰ì‚;®jz÷îM [€çйVä “éäPòtèöU¸uwIíî)u<ÚÑž¶Œ¼Ærmó5î„7p"úÕëÿŒî{èùªúígÎuf$ÔÃh&*H½=®9üî,·æ.q×»;Ý|“»ÅÝæf í8Y›lR75KØîp`L¶26«•e´Û‰dèh›ý3'ù ²89g(ÖYÐ %ql“b¸ÆPøiA 0U <Õíêâ©Ý4õrþ€L}0‡º¦Èbs8_©t/Õ±££{âÁá cû‘µkÞ5¾`´³_¯¡yÏ<Ãì¾áÊ•C­ÊE•3ï¿6j9°óF`oG=q‚6QQÙ Wµ§üF}ÛþùËgöoÈ_-ߨ®Œ“3Œþ”[’‹’“õd³q“{;ÙcÜíÞ‘²<ã>JN¸ß5¾“òNÏ/Œß¤üÓà–“ý€#µ\ƒlÚfð'3½äÁr±†[¡vPˆ T¯bµ¤©¼}¹£¥Wu Í|OøãDDý㨴©‘ÐB«ù. Ê™úô]~·Ì…:B /w„t¸è³z¼&Õœ¦zŒ“q‚×”`™Œ3h¯@§@› …¡ CH£ƒ=wPnî@}]…‚:J ¤+Æð‚ d’ í ò䨶)¿cÝ}/NÂé¹ ÕsÜù^ oÜÛË–¸ÛeßÕkÆÄqk´µcÆ>¹yúƒ%¶„Ô~óûh“—¸ŸÝ[½óáK×ÖÞž‹ÿÔ3Qí5ºÿwNظ–ÎúGk™ }V6 }®¥­öá0‚”zƒ¢jdÞR°ÎyG©Q¥nÂjqWËí$Aë…È" ¶„b3±1àëš½„¢…ÚÊ1)î¡/ tPŒÄgc íèŠM¼µœ ‚A : nh-.Å1y$ï丢¬ zbË%±ÞZ.ñ_¦šLv›ÙQËÚMfVãi8d‹OæBÃÒ©Ò´t sÃd鼿ËÇU?Uõ¿» ïÎ0mš9ãÁM³ÊŽÖr¯nšrÇòŒþ#z¶X‹üÂ<ùáïræÝÏ RC@ŠC»yÐsš¿Î»Â¼ÂÃl6oö—ay‡IMAéâXe3´a®RV1-7.BËU»í faì`?ÎÂ-1CNÅšn×µè©çñ%,áíÕMB‹ŽŠ¬¾Ð—@ñ B§nb–ÜuCÎmur’“³OFVº¶çà]“‘M´ÄJ]è¦5½ë³Z´)Èþ‡<ï=ðìÏl>ž°ÅQ3rþ–wMZŠ×»~ý.ö`v`ÇÞyw½öñ篯¨…È`Ó@¯®ÔÒ=|O~0ßlÜaäzhfË».§€ò47³ ¨UgȾéø&ÊŠ¤„T0äºóbøvé±!¥\7¸QúÀX‚Vb®“ÈV‹ Žõ¬ŽoÉ9||å+Ûb§øL‚dö¦Òê‡ûoM.Ë›[x˶½Ó¦Õ=³•<9òdݰÒÑï’¼_¾€Z gŽ ‹€sÊ;Æbº'‰kÇs5jšÁ9†%l í x¢ÀÇ9”,†Áú$u&ðCµæ§HgŽ`ë?FÿNqî^`].u9Q‹èÕ.3Èá¤Ì h—¥Q*„&èÛ‹—%`¡ôмÈièšiÒÙØ5tˆÕVQ¶åº¾¶#[ñ©¦.ÂÕƒ±s< °eK3K–UØÎÀAM«•w¬Š¥ÞkâôŠª»d „õùÎ@ò½ø­¶;jîyÿ§èoqîÖ ÃÊï‰þ–;‘˜öá#oÿyŽÁëï+½§´ÚPÃÀ&cP_ÍKfSðo6{³ †èBe®{|ðŠÏyeé,»Y+dƒXÈŒ×2ˆŸ0ÿ#ŠvÆ+–0å"›ËŒ†#²P 0`V2å‚h‘YB$A$‚Dk\ÁÐi+¥›š/6+ ÓY½Ñ:ôi€¸=•×ÜmH!€':ÝCç°eådÙÎ'"¹¿¬aWÿ\Ì6ýÒDû”ÎTìƒ2;áöŸiÙ…ÊóVÒGT‹Ù\nRì&“"In»ÛUøm7ùü´§‘Ói6›DIJtš÷)u¿æHlÌâKøzP/,âý¼ÆW@ÚñyÍüÎXñ/ÅçKâ5H¾©ßõéÚÌ€@zèi}>+Æ{è ›J…§#&Ù GL\…{0pð îUÐXIœ¤FS|á?ƼuÉè\·-Àô#€.#:\&¯!Žý­sžß7,0|ÐÇï¶…ÊËJÚñ”úÅ…÷6E×q'&œ\õÔ‡‰={MªŽ.ÄýÜ“YÂdZ<¦n5´ßäÎoØO¸O‘ %¢Õšÿ%ËK¶vO»—.&¬`ë Er4!®šÍf¬Ïä'Åð²A8‘ ºœn'á¥4cÐÃ:*±M†ƒÅ`®D^'ŸP‰í¢µ©&8$â„ÊëËf ÿ€6e`­t…%ÙŸž_IÓMË2ºÒŠù]Ûžˆþ½òøÖ'/>{°ã¶ÌWë_ü y/Å[_Œ>Ý=ñÁ—ß~ŒÓ@?ü÷ÃÁW·7lŒ~Jåd°ñ‰Ü)ûn4GsÝ":W2œºR6ÚÖ£Œ ¬ìן›µìí7ž;»cã]U6ΟÝL>Á ñ=»OD«£E×â¼7ºç‡+x&žóý·q2è¶ú“69Mƒrši›+æÈƒLÅÐYEòp(HP Ö·[ƒ'ƒ<  #|ͼ³Ù`ЗqU‹%!Áë ,y0«!«ji±K;®Õ¯'!”¨z[¼ÄKã9@(R¡èä}^ä ’TT ³ Ê0Î aœ¾ÚKƒ1™™H>ØWúÑ1Ë9>FbãÂ*pÝž]ß âtÝ@c ¹›*/X×gӄ髽›'¬lÙš<ª_ù²mã‡W-aÓ¶OœV~g(ôÌË‘tòhCùÀGvÃëæ=ñ‡Èç ¹T?VPfõŽ–Ìjœ{5ë…ª÷M v˜‘·Tìj€Ý&ƼF~ÈBé•ÙZ=ô1 ­`1ºêï›Æ¥,J_΢Ê’g‰¨ÄÄ$›“¥4;gŒe8Øx PIâ *Ρ< £Ç*Áà®ÅFÓMJuºã"À¢œŒûº®hX×µÄ20Öj–øEë¹jäî?ÏÞ?gäÊ^Û"Ol)Ÿ±iSmè¾ûÆŒÇ,½¶|L1ý\L¬¾{êõs¼­”Ï Yó£>¸Ÿ64«ß¸~gú1«ûá»É}ä²%œWK5x5{ïá¢dp¥ö.µ 7ŸZj©=I…….üƒUÙܾÈÝŽ×hyR(!¡ÂÓâ!ª{TñrÔ’\]§®V·¨­êAõ¤zZ=§^T¥‹*6«™jœ=§rj´ol.ƒ}(5råB—]Û^'«3ú¤¼IF'š‚‰i‚È‹„·¦ŒÉ“—$A{Û ”bNŒD/;õ±ô¾¾¹ª·Þ]ݳ—ÃÙÓÙ»–ëåH¯ÅN×Í]L“•49µ– **K×­:0!\.glW‡Þ)é`IXõ^ɤS¢7”´È³Ë*9ŒYËFî­¾»æéÚ1«ûo(9Öôô±U›fϾ¿¥zúæ© “'†¦~±¨xÝÎÎg1ZvÇM׿þøQã1Æ÷Ñ©W>x÷7@ãß:P¹VÃ{¢³Ú-“A·YÓ­–²ž=¦ŸL'ééÈ›H5_¤2•ª¾Ñµ;ШÛl~ƒf¨04Ú § ¼¡ôÕœ½“nÐØñ56]çõêÒÚ—C¡Èå}0ß°¶Ö¥ïb*NcÒN;èPri¦´ä áƒi6ѵŠI`\«°ÏX…ÓäÀ*Æ)XAõ¹9ï*œbì± ¥*é«° –YF\ Ò>Š“¤¸&Œ­øâd —1ª°\'ßƒßØØ6gjImãüc­  Ø9·»­jí?pƬÌÂá…‹VDÿʘüâüªÇû§½tßú÷îd&˜³&«íùK›5aé´‰‹rwëb†èë gµæV¶…'#¤©ÒÛÌï™o¥Ÿe~“ ln ³WÚ+³\–q»™ex^dI”9I— <ð"žaÙeœlç8Ê¿!¢`ı¼"ŠœéöhAi°OÀ™–Ì…W‘Ÿ(yË»Èfb5}ŽžRôî5ÎÚg„f€õaqÅ ``Xþu1’ATóE}>ØÔÿj*CpLÕ,8"–ú­xÆÉè¼àhô\ wâÚ+8½;2›ø–GïDúˆ}l ^ …Er»ùíÂÃâCƽ¦­QRE‹Gu[X³-ÓV`k²´¶uÚ„æ/ÐYî,ÿ©ð;ñwÆÏM¢U¥‰R Û"q„%’YƓֲk¥OØO$©Cå{gàˆd2‚ï×f±ÈâGÀ.—ad›@PM¦=’`—$Á()Ê2ƒÑn0©~ÛÃòv–奇XUÅ,‹ Š=Àº‰ÉDɾ,¨ŠA¢Ê5š$ 0^%:çX¦Éþé D2%,µãñš”©â@'º§ bZ«±%,ÃBÖý'1ÆÇñº·)”à‰„Ü€P`&x:B–ìlúoÍÓ5žµ{eèºêƒQbÉËT/ܼBt³"öÖ€ùPC2ζ¹rm±0é 6D¯ìÚ”ÝoÓÎ{û ØÞ½¸ksr˜M‹ì¹p–,ˆìüÍdÎ/_{Ž^; ½v辺îë¾ÐÒVûAñ9M^MH Ь`q”X*Xv–š‹•.xyªªöÒ1³®eu/qRÛ8f._ µéR'¦béû÷9…›Ub‚Ë+¥ Ëص¿ÕmpNF râ¿Î)$õàø\b-—Ä[ka´Ü Âf‡Ø¡³–u˜!UµtÙž@•]sk]ó ŒÝys/oÜš¹täœý³¿ÜqGc’¿`Øl˜u']hüqÄðå?Š~=;n,~dß“S>øíGo~_¿ç>æx‡fu*i á9‹ÙP½«ç 'ˆñĬ%Èëü̦•9Èœd¸f5CÊ!F˜‡ú`\¸T'Òµ¦Âi`óãlL‡jÃŹõ“û_‰Žÿ„}øküùߢ‘èûFýQy·A9Þ×ËQ¨9=¤!¢`AØ&Ö ¨ŒayÓå0Ò©Z›¯¥$¥Wl_ (Pju?ßjMHz6‚ºîý'ÕÏÅà!ÆçŃ0ó·hz4!ú—¨Dùóàh-ÓXÕ1¯k½W÷Àãz€Ù;É A³F{B©,˜x;0'dÂ.#cZ„BfU§N–§NI”"vDò#þÃÔ“7Ñjã$g™Œ¼¬¼”˜Ð=s·G1¸ µœGqÕbƒñf1q8 ã$vÆõ/´ [â´É×Ï7±¦•{/œ _Õo}d_Ëì²M;³9ZKÄÛîÀ=±ñ¯8wâÄÆ<ú7o¼vöwïÐþyš©, •Ù(`ò*~,i?Š8üº¦È‡°A’ ݸ¾ÿ0–Q;.ÐT‚p ¡zÌžA4R9kðJ¤"ñ•Ò+ù]"ÐúcJ/ä ”›Mê¶e?7bùËiìŠü•þŠß¯è²v¦AY¼(ýVK™M“{ÉÄõkA¥X}ÊÊ`Ðã[iáðG±]>íØt”Yé1Љí¸X3;FõÂ'ÐK)kL#{v›E—uÃ(rãföŽ.ú•”jp³¼+ Ú‚©†”*ĺ…*ÜÚX…ý*DÆ`âLJ²ûªp²Ùw£©ÔÝ£ÇÒÒ%9] ¶ã GØ4 3á0–Äë$Ë–K»Éšc½9z÷ÑÍ–”\á×çÎÊLyjTã¤~{ÇoýÝUÿú܆77¶“Ñ÷ßY¾ýÁY37à‰ê·U˜<—ZVƒñ¹¯±´-zŒÆ£‡w¿Ì ~ôÅSm-Ï>G{5À½%ÐDOáçW7º¶ œSô¸8žU¼¦ˆ¹WiFe¥•CÞL âG;^­9Ѩ$Ó óK-Þ6oØËTxë½M^ÆÛNä£ddbwÆB±¦½_ªëˆ\ à©·¬Éf—dÙ&VaÉ®@›á8× :’Ó¬1ºC+›¤vØ ÝœÈŒ¹ö³þÐ馵Õëvª§ŸnuÛéucÜÏ?_‹ÙCþ¹²þÚ>ùÝO¿º?Úùûæ™ýAòAb¦Ä%æ´æ«e™û™½ HŒ!8L”|›D×ÇuqÑÜJç[i3J‰Î˜°˜Gõ¢âsÔyƒÐè¶t×;Ýó]r3 )ÕèæE!hIãÝRò[S@jì‰U(Õ!ÑŬ¨>¦àMRs]hd%]Ö…†KSt¡A71sAEˆm%kl«`|ÆõÆqÏ ÙêèuëÄ5c‡áìÝS¶üî®UǾûþÕÇ#Ç™UºqÃÌŠ-ìDÓ¬â¶MÑï+fE#Ÿo½Ø€GàÕøi\ûòµß·¾v¬uïsÏW.°Ø3Ñ5mÊ"Ñ€¼}‘¡‡Û»²o_kòJžK_i5öXc–ðiéœtQê”XéS³$õ^sÐ|Ò|ÎÌøÌåfbÕß½1øs†9Ï\bXæSä®qŒÌênb —C iK7,ìŽu/Ýc}ŠôŸŠ3{ZzWá4[*4·Ð£ §pî*”€ÝU¤Ÿ+µŠ$*=ª˜>ÆÞUL/5½ ípð‰ÉU8ÀÂÁC¼Ug:ûVaJ’!¢d˜ b4@kçgè‡Ç5èdº; &œqÖ[b¹Ñºqê§•ÝùÖöGÞ™Z6ÉÿxæÇ5Lß°¤¤dQÿ‡ªæ<øðœªoÏíuû?þýÓs·öÊ8õà›W¯¾·õ$ž8¯iÕìêµM×~iÞ×v_ó¾'aôŽÑ[Êíþž§É ê ˜åƒÒއ¿Dß2òk„v,E# ]­©Äü1jG÷îE[N²ƒGL`Õš;†‘_ˆþdßÉÔ½^Ïþüüý_F2¢{Ûñ_ñ+{áiu+¸§PúPsÐ>›™\[1™Bf6 Zm¶v|»æ5™í0ªMf›l4±òJ‡Ãk±v¨f°¸{‰]©yÖO!ïpÍeò[ÔO…5>w¹›œtŸvŸs3îQ>€›‡4ƒñ„é%x#{܀Рô  D-ƒÈà tA"f Å¶)5‹ýâÛG©‘æv&p’ä°æ:âä*Ì{Ø*„º×(ÐõUÚØ‚˜-Ù‘ÌÄF¥XÃöXWOªÝ¹µnØ’”ÍKÈähò»–í8wŸá&õþ¯íôùÑÜäÏEïžíüâ³èŸCk9 o‚%!cNë3‘ÛJßôQDÀÇ›™ ‚0™)¶1{6ÓP`Fj›á¤á’AhåqHö#Œ—ÎN'KÒ2‘³‹"µº(×ç.É2`Àrº'yµÈlÛDb}"_Æ%ú– GñrnŒ¯'L9H"*!äd@˜h}üt‰µDßRu†ã‘¡{«è¾*Aå*Àc$ê“<î86#Å£^Ž™b ñEÔ¯»^¡³^1úO)?µË€äÇ·8iF:ÁoäÅÑ£{_ö»m×wF¥_7oÉ}}¤°ókéS¨úRKšíXB;^"l1))cF‰~Õ°R’Òœ ô1ÛÊG¨`iyÌÊt£á%EIEêšÓIç’.&u&±æ¤qI$)‰_s2õtê¹TÆ—ZžJRGe8O¸téê}³þAŒ¾;/óB÷rEpœåçxÓLVVL š‚V¯Z…Ù4$+FD-‰6¶ p! Q.ÐÃãGqð¸î8’gíģʢ!`úBhg™ÐLMRX™™­a^Ö_biâgk¬¬Èo M™– ú n5ËþË‚–ù†-•’å|ÝÈÉïÞ[øôÕý%·7ˆo3dÊ>øàÚþë› 1ZP­¯?Þ¡™0ÝøÊ!±‚ma ØýŸh@˜›Ób{)»6`ñÝKC¡¥£{Îé®óe­¤„;ñóÏSYãoÈè#-CŸŒ+”k14œ3pw¢2Ë3’PÌŒ>bÿÄó*ëãI{ç4ÍÀòn,¿ »5ƒ¬Ét÷¼È2t·F3<´ù(çjR;~BdŸ†!¤™üÜ9ލ€p§8Ðì-ÍÃ"€bT•ļŽvº&ü<£{YC ͰSß©ñÑ~Ïá¼Tob*.z<Ú›;ñËg÷,n\Êöú¹Z!Ôù {ìÚô†–4Õr§cƒ}§ý€ýiÇ»v¡—#Ï1ÒÁˆÉ êAÚ±OóⲄx“µÓöG× Óc/Ao¤xm­í8E“IJrèÐí$ñ°·Q¦KVúò‰>? }8ÆFuÜÊ×½tõqûY£ô i>.yfr’à­Dn#ülU(QêQ‰We|þ˜6Á Û±s‚ºi™Úµ!Ûéúݰ%;×Õˆ,ùy]8úÝccþȺ·›ü[’¦¶L[ûê¢+oÍxëRðŽœoXÆ:.áÙOÏ|ñѬ{V¯Ž^~-úEôì´Û±…îІVËÖw25kA•UMªõ¨ù% §š}–9BŠ"•¶h¶ ›¾G€J6T¨Ðd’*ù¥K@:©ÀÚ»_j½Û¢ïÚ˜5ÎXÙ4Sš…³Ub³`¨DVF­DF×_{ƒºg[èÎ@ Ö]Ëþƒ,ÌÖ¶‰gŸþ{GëíT=³‹;qíÐq 3îÚáw‡Na' t{†>Ïú±vO/y)»”k”w0í2ÀìÿÈ$Qž.“óF|Ãܪ$‹ïÅfWY†)—9»,súìª0A\»'Wé+½­ÂAá¤pZ8'\D³)Œƒ“'õh§ ú„rÈÁt¥Õ@” ìC­±·_ºæ¾ V阾@_TrÅÖ± âïæÄ(UsüuÏî™Ö`½qzõžV2ùQ˜?ŽNz‹;éE>‹¼pm'ùú¯Q6ŽSô^ýFÛ˜ŽÓÙ^bO¥§)Ýšå¨V–*õއ²]W9Ý GUmfªq`˜ÇÔ ¨U5Z€mÊXUxð ”KyL¹H²ÍVS9ñ7”lºžcY¥}òn³ìFÆ}õ€DÄðgÛ>¨} •ë*ÅêÊCÿ‡&‰½Å¥¾I•†þê+¨ ªDòóã'¨jÉ×wê:¤›ö0ÝùŽEüQtΫg‡%¥þá¹è4üΛÑ<Þ^–èÇäùutÃbml^síŸDé3¨¤GSš†¾dîfß@<ªÖ#¨ÙöØ\1qßÎñv8ÜWüWŒŸ}GãþÄüÉOÞÁ̽<%êƒG w®mÖghÁè@™z‘nì»yv–¾ãCÿ™»¯] K#™D²&Zyàü#Ñ9 <úž ]Ç h˜–ÎÏf™Ù˜geŒþ›Bÿ“B£»öô™Ÿ.%¶´W—Þ¢5GßàOAt›–Ñ9±Æ Œ(³d‡G‚öšvèw†G%ØGñè¼1:~÷ÏrP)¾4ú„‡ûîgúVÊíð3™wÎÔ žÏ òclL”è+¾|l³- ½«ƒÊì¶šrð[¸ýèQ¸Ï SÛõ%ó´Dú–ב¾çÅt¿ç%šòÓrq–&3§ÉEBNRÇ š±–bo£©è""ç®o!¹a›s>àûõÍ7ÿúž×LFd1ù-}Çë–ç#úûÏ};¿!¯Óï_¡­oluóI²ßo|‘?Fß?O°aŽYØp]ÃdW˜cø Úó-,ï~o ¶ ö<’hô}³ \ßÌxœ$![×f Y©9ÛŽÈ™b딜IZ…E#» œö¾ÑâŠmœRõÅľ[øéãóJÍŽÖC=:¦ ·¹ÜS5dóý5Oôû?Ín€¹@5&ÓÝ0ø°¶}™e©³Yj65›wˆ;L;Ìø}Ò~Ó~óK¦—Ì?£UÕïε v·ŒpjîR©ÆRí¨p/5µ¸ ›-ëœgùO¥3òÿXÎZ?u|â”$^8`œ,Z<È©f¹‹¤fq½lx˜ÝÃï¥+@R‹¼×°Ç²ÇºÍ±Í©ðQg¸3 «rª2› <Ì=¬´ÚÀx³h‡œþ¯m‚èoï´i¥ŠEõ‹6‹e¡"ÚET»wî6§s!'ÀÈ®3›Â1N³É/P¢ã´XT€“`Áɉ›Iõ›±jÆ`#WóTN)ìýéGÚNÙ(Á隬Ñ÷d€ì` IZŠ¿nŽ+ðA܉Y3‘V|s’ 'I~ )´^·í¨Uç‰PÓ.Š@°caHçC–›Þÿ¹a•'¶ W q츋-𕦯"‡b Í–m³Æð(5/0xJôµ'^JrúêÔs>Wê«mÑc»¢ik'èÓ‚m;±™ùS$!úŸ¶„™~.fCÏUÜñËT¾§£@Äc€ã4…?+2ó%rVAb;®|‘Wör`VjIÔê-'u`7‘3DÈ‚¡ôi¤!އPé1ôÃ`hë~ÿ¬ }Ó^ø‰èq<ü~<@_dÅ l¨;É(}”¼íyç¬R¼õaFä^™±BÚ`>?­ÏëèŸý"( `:I³ ü|ì h”Äã‘b·Ö¹’2õ)ÿ+±Wâhƒõò5“@3ã@dÏýóyºÃ‘7Þý®Üœÿ#òŠú÷¿öå®ZÔý¾ËÑñ€ŸBPŒ'Q¿N¸':öÆñýˇùÆâOPæ)t ¸yNÆKÐZºÅúsfC¾ùà7 »à\šóÿW—µPßÓ»5‚?S¿‚–¨Zêb½\±6ªÕ¯š¥Ÿ¡m‹ÏEKô².‚<ôn]÷_õ¸^ ? iZÞH[Š&è÷ÀÖÏý{‰ûÞÔ7_ëÿ—«ÿ[¾)z9u×v”'+~ïQpõýIƒPŸîÞʹá^7ÞIǘ®šMýþ4¥n>ûr‰oþÞß âG":ì{¯¢zåCzÚó!?¡à3ñBÔ î ¸“àλ®@UpåàVƒÛÏÉë)ãâ×2$Q˺:È—uU»ZrµþjÓÕ–«mWO]U8QwõÌU]U¯fAZÓU ‡W+®’¼qC j×. î¸óàxº‡ JVA =B. À•ƒ«·Üp­àΑŽe*W® \ ¸6papgÀw œ ˆì»zàIhLš~ Au€¹«Ám× î ¸“˜²¦Ë4|S@‡çAê<83Új@m&[Á…ÁÈÑž)צ§û‰JhA¸p,Ô)ƒ»Á±\=¸&bÑ|¬ÇmáNr¬ÇnaO²lw#ìA–%½'êiC|RlR*KbóZ¤6),’ÎHç¥K’ ™Ÿ)ã„r¡NònœÍé–ëëãz—Ÿdf|L&ÃäŶâœfÎ1™NFXÖŽGk³ð²­xY^¶/+ÃËVàeÍxY)öyÆyˆÏ=ÎMGõx4O½‡CnÕ]àÖÜõnNBPSX,wlqrû;AÕQàÐ,²«ö»f ä âíØ{˜ó½ñ öv^ _ Æo~ñµã·_|A`œSÛñ¸#Y¢îkF âbu«UÔÚñ•£H*[q;d~ìpc2x­‡'ù^Á»pÙ ]1öpc"œ½ãpã-à<ܨ7üpãŸÀ+¦Þ3@óÞŽBÂøx~ ád¤AHÔŒ|«}o¬óý5ÔNvó½×˜å{{ ûNÄÎiî;Ô¨Ÿ9¸æ¸{#7ð˜s\VíâÄ·¡R&Šþg£R,¢[ Ä£f½Þ*%Ð68ÃB¨ú¥ûœ—Êzú:VOø'<ßù]óqÃv²[Sœï”ýÉ÷bÙ$ß¶R½Ü[KÛtd¿se,:…îÍ£1Íé›]ÖÛ7½4:ØY̳ÅÜd‹d‘Z^ƶ´à:í6¡å·BËSBË*¡¥Jh©Z¦-“…T1Eô‹=ÄD1At‹NÑ.ZEU4”ElV$"¥ça3šŒž8Ÿš…FÏô‡¯L ´cyü´0ŠÃÖÑhô¤¡îðàŒÑ ä¹£ÃBÉSaü`Y˜lпõÚŽ=4¾ÞK?óz,æ”õx©ß¹þ²2äÌø÷?ww.i<­7á˜àû^ðÕ pnôD8ÕBOµ|/´è§ÜIáGFOœ~&©,<€:“ÊF‡ë&ú§O=ŽÂWŠ ã«Ô+›zœ üSÑzž Â²²ÑíXÑó¡ |ò¡FêA>nª ùP7 –oL,_®‡|ÕÔƒ|€Õ!=_ˆÝì¦ù­©.*z³:ú¬™»þCò.š<“>k}Ö.ú¬™ÚLýY¸¨–Ž·’©‡D4´lØô˜„(2Œž orÙP§Z»>”nMv¯òž`>€”Œ²°!04lG“úé;„&±HO2Ñï8ǓܫnMöžÀâI*œ¶ÀXŽ7<š±hü/^Üå/éú›±hFF=ÆB4 /Y¼èæš¼xQ¸E±Û…IQM;1Õ„µÍa 0ÌÓÆø‰”@á"„þÂÒw÷ endstream endobj 133 0 obj 17972 endobj 134 0 obj <> endobj 135 0 obj <> stream xœ]”ËŽ›0†÷<ËébœHR&™HYô¢fúœ©DÈ"o_ÿçw[©‹Dp.ŸÆÙî¸?ý’}›Çöä—ôÒÝìïãcn}zö×~H I»¾]â•þ··fJ²{zÞ;—q³I²ïáÙ}™Ÿé˶ÏþS’};?÷Ã5}ù±;…ëÓcš~ù›–4Oê:íü%ÔùÜL_š›Ï4ëõØ…Çýò| )ÿ>ž“OE¯ ª´cçïSÓú¹®>Ùäyn‡:ñC÷ß3ç˜r¾´?›9„!4Ï«²,äw°Qvly .y_¹R.`Çû^1^ï¯K^ìÀ[ƼߘkÀ;²ÖÜ“µï»²U·y¸ÈÉÈ-èoW`úÛL‹šýý%Óß WýµþŠÎÊkÖÑúW˜þNè_©ý+íEÿJ}èïÐWè_!Wèï°F¡¿80ýKþx/B«ç™ ý-f.œ¿Ñ\úWX‹D¬Eè_i/ú[­ýñŽ„þNcè_!ÆÐ_°^CÁœ ýÖkèo”éo4†þFëÄùcž†þFkFô5ô7˜‰ûGãéo0CC§¹ô7ð7qÿà]ú—ȵqÿ ¾¥‰ú6îäÚ8Ô´Ñ3·Ñ ¦¿`æ–þ‚9[ú[í÷ÆÓ¿Ô¾ôíý5&úïõã_)>cœ3އ´}Ìs8ô0Ò3§A?ø¿çÕ4NÈÒßo¢  endstream endobj 136 0 obj <> endobj 137 0 obj <> stream xœåzy\T×õø9÷¾7o6fÞ0Ã,"ÌÀ  ‚¢ JdT "Յ—Tk5%ZÉRÓo–jÓÔ%IãÑŒ&­&5i–&ÚÄ6mVÛM£46Ñ,*Ì÷¼Ç¸¤Ë÷·|>¿¿~ïñÞ=÷Þsï=û=÷1í­5`„ ÀÁ_½¢ª¹ø–qSà·YÝÙîy¼çΑŸk›ëV\}9é=i:€°¸nùšÚÏ~ðÞaÃÓQ³ëkª–î|ý1€ç*Í‘YO ûàÏ@ܪ'Ô¯h_]©·çS½„ê·-oª®Ú2i÷Xª?KõôU«›·k_çT?MuÏʪ5ø ñôo57µµg̨H<©ô7·Ö4oûø•¯©~@;“Únå2¨QêŒ ¢FÒêôc„É,["­¶(;üÿs‰‡Á¥>»`ˆN€ÐYz>UÊe¡3JßÀòÐ'ìlèïâ‹`dï†.ŠGÁú;ªÈñÆú›‹Wû7Ólÿöăóžÿ¤þ >/a;ü.Á9¨…nx¦Âcpôùð$Yå×§Ã'(a<¯Æ.jù1|@£/ÁÕÐq(€ƒ Ãp¸•ÆeÂbx‘°Þ„3è€ù4âC¸Â Á‹` 4C;tÂîПA„D àmꯂe4æ7´Ö…ÐÂEs4ÀxvÂaxNm_±˜ÐyÐAä]Õ°ö!¢e„>"j  nH†B¸ž‚§áz>#οF=NÄéü~þµÐZº/ô ('ÌûˆóŸÂÐ ÏÂsð‘Oæ ù&þc!3ô5X‰«8šaÍ‘M«OƒyPC<.'i¬…ïÁDÍ6â÷ixöÁ ðÝ'á=’ñGp úà$éË( #0‡c&®Ã-¸_óØÏ^æv~€÷ñ>……gC©¡±¡ÛBÏ„Þ õVðÁHÒç4˜ ³`.­=Š¡”(¨…•ÐD’^뉫{` Éuc þŠû±àA<„/àÛø>þ¿ .#™ƒ¹Xñ:†ÍbsX1[È–°jVÇV°­ìQö4{žõq3ç#ù¾„×ñõün~„(ˆ‚Cp áqNŒ‰1Yœ+.o¿/îOhtšÍ6ÍNi¸t§ÖKvû%ùÖw¯Zؤ–Ïaõ¿Ê?&^—’•ïaëq¬XúïÄí0y@"NwÃd/sá8>ŸÃëð4úàA¾µÌ+Ðn€I8fº ~Ïvb-I«6a³æ~ø »êØâa|§àe–Ä_Ä|x^ÇrÜL+ô‘}_„Å$Á1hƒí¸ŒßÃRal.ŸÅû ߀„û¹$Ôð•ü~‰?È^ã[ø8ý…—‰ ðg0BËùù«œþœ™òÅœý9›#÷S•^£Ò3,q–aq–¸Ü4°“þ(Rò4VØ©¬3…2ï=”×Y(ïH„çü¥u1™3thLÌB ¨ ¨f–h,ËMÄ´Äʼn;' ‰‰=´,™!KŽ)K¶€VŸˆÙXˆ¥iÅÊ%¬ßáè˜%¡dwûuÍ´õ¥e!ˆ–Þ$8|¾µòäHåýå}Ùi}>9-‘ŽìrKd6ñàë‡_. –‘Ùiå-È9Ô¹Yé['“rˆ?,ϰÆvØ)üj$õ­ñòŒÑ™™cÇ$&z¯ƒÞ¸)WðÑŸ¬èlm-]vÇñ_=ùËï-Ÿ8² ýÈÞ¿o©/¸­šs8Êó̆;žI}´þ‡gjxcò’ÜŒ[W“’—M™U¦œ?&“š†“¼8¬òÏŽÉl7ÛÍÆyñ ´(Ü'“Žšh«e(¤¬à$e_‚¨¤FñÀÑNúüR4?ÌE"ݤn²Û{…›$ÒÚÒRîË)W¤›fw× >ùÊù«âáËŠÍL}Ê7)sI‡7üž‚dt›$cZB w[$£±Øâ¶Y,nKŠ O|L ñiÿ„ï'àŒ„­ &ð´L¸tGÌŸbXLLJ|­ ™Ìú” ›Á2*Ù-'X2,Í–ç-B®e±åû–ãÁb ²¿Í¡ƒvÄᎶÁ¢ÿÀ(‹Ã2JOJ$clmÔèZùoÄ‹O> ¹}¹9¹ý–ì´–>Bh9­èÒ4Òg"îTÍ+Š9*Z0i"fŒVuª‰²9¼‰I&ôÆ'Ž“•©ÜŠBã­É„Q6{Æè‰˜…Ýg†¿þÈOžŒᵞ6ñ1›§4vÏsdO¶yÒ¸µ/Û½?o¸%mTY¦•}ë|àáÇîYÿé‘éùsÆO,˜¶gËO.Œ´8oIHŸ0°NÒ8çäœUÝBÒ]úT¨&}›);|Â_ÞíÆ’¡ &V¨/Õ—¸VA—kƒûa—4ASè,Úé˜ÃîŒMh(F“ Ñd6ArÄ ƒÄ¬¢Ac’1ç`-®Â{ð>”"0ïFŽdßóëur{¥»µ¨ ²ÊžXtøäÖã©°É rû²éï†Y¨‚Slƒ®8oÖ œäÈŒÑkJG— yýǶÉë¦mzò‹_î+©8wõÌâ¼q³j'g4Îj›1ñ£éäuÿ^6ìÊWíë~бz뢿’ ªÈÂ~FE2øÜŸ\*c’œ%Ê]C»'&=ÆÃwÆ ÄÈmˆéŽ9£¹ƒ1Atû#¡›‘ÍÂmø±ÂâQÄiþô€„•R³´Sâé’_š-QÀ“%Äu ¡¤ Ò ‰+í ÒI”‚øKÒÅZƒaH­EŠq ôV›Fv×6Û°·q·-ׯÜ6´ÙZ¿Û+M“Mݦ&n:Ä*!Vd¿b—åd˜j„éËí/¿ØÚRQ^¡ÈN1F’qNyKK«XÊ1N5¯,Å”x6v ¨&™”¥ˆS#ñú÷/-hŸòÎÄ·6<ùg„3¼ø.–Þ:µÃ†‡£—mxÐ÷Èèûë%ì8÷QCùÐ5í›îRbÈŽÐá´øDÃNZ)+åõŒOcSùTÏÆñq6nÐ9uÉŒë"t¨k«+«Äf‡hú›9ˆ>Td§#eíè!ŸWÂÇJôƒøG¿ÙÕI!¤CgFÔî¡3kŸ:`Þ;Þ„¦ J~ƒ½ãâ¡›^púfÊWËgô]*ï»J¼WôAnÿÅò–Óô>MÎWŽa‰ C#ß92wH#É´4LI&úÛ¢÷_üccv=ÿ­½/ªuQùÓk¶,]ü8“SCtzËA3>öÚWŸ ݸrÓÀË¿ÜÿË)üSØâ§Èž\pÈ?{Œ”‡yÒ|œ+µJQ29쌣Sg0M6£Ñ„Ng± l.DÖŠùO²Áhtºô&#ÈŒXaÜa:€O‘42É6†’mÈÐà;‚ßJÁ-|³IdSÍÅ2Ød$î˜ ™e½b R¤F òpù¨Ì@FY¢±×¢“Õ}ô/ᘉDtd¶ªS ž£¯ÅÍììkº¤X)]Wáù¼k»GO(óx³Ò g&Ž'í½u&öœiXvðÔ@/EÄZŠˆ'*0 ýñr… 9*ô†ˆö€t\ú\â¹Ô*)p(Žid5ùYå×ÙÚgv“J4о”0ÔG„Xå,Õ¤d é¡aÂò̬í¼ë›Ãô}tà/lGõtóüºé•SÊé8+>÷ÚÕ?|3°í2>Ѱºä½ŽUw×nQ¼lnbÙìÊTbý&²¤eD7Ç_ˆ< ÈgäÓ–ŒÑÖ§ÀÇãZðÕ´,öÈÀ9Y:+4Q|Wý‰¾ø㲨NϤ½Îƒ±¯{~÷züÙÈÏÜÆüX¼Ýr·á^ wÇÅY»¤!Âf0Dì24¼oàC’¡ËÀ5`„Û'¸DûY¿c¶ã”ƒïpà6%_ÀWýú³.tuZ9œE%°M;“twœà@mÇö„³ ì §XB‚c¯}èÞ£ò ™}®è÷¦Ù?·cçfû,û= ö ÛìÃI•àQ¤ŒÏmžå-}j&B/¹_-T/V"Ý`ðW¾#›Êkyˆb Xu,£07vLRbÒH ý™jT´BéˆÝKa5ω)µ%­mqq]ûÚrÏüæµû"_­.OñÝõ‹Ö[.¿ûø'óð}sçmc—ÎÉž\X^·½òØgŸ¾ñ§yS'Q°¨æòßvQ´–Oùøó”oà ÿQ«.œˆKÚ2 ˆÄtÑ/VŠT€ ¢Ú²S ˆ'ÄS¢Fu\(Srs½®ÌÚÛ(#y"ŽÇ",£Êjü-¾‡Ÿâ7¨×¡À$ ½úNiPó«t6›ídG™Ð­<¦bA¶Ñ­› •0˜ÃŸ¬œœ ”³.¾×é#›)_P×rßÚߪ@ËÅòÓ>J"3F«I} ¹_¿Zûs,J2ßJÀ͉<¥ñ£úä_á·è_—ÍVŽè¿?ŸõRÒ}i ÷Ò@ë%²ã;Ï.1c+cbdÑ.N2ÙÖq\úX ËŠ6»ü&’“nÀ£xE%G²ôÑᓨo­b¼åƒgQGvKøÖŸ£@ÿÉb‘òm:{ÆÒ!Ä„’ƇYƒÉvR¢1çë+ø·{î/]¶cÅ„};FLnら wöˆ‡gî^sÿ¥Î(×£7–,Nˆºž‘†Ð|Öh]0Y7W·JhÕidaõ""ŠM²Íd’¹r´P¥"H&½­V’ˆW™²Ý é‚‰U˜v˜Ž›>4 NÓ,Ó:J~S"LG?;êèØ±â1<‰zD;ŽC¾àqJÏ•”(ÚäPd¡ìN7§Dʹ-‡¼öŸ2"É$“µŒ "ƒ‡l7çDtã¨sWΗÍïšV·Þ±ìÜ Ë¸Ô c lqâáþ¯fOì^Ÿ{wÿlM]LÖÄQS–Œ}I±ŠB²ŠÃ箳þnI?N3US'¿+Ÿ•5:ƒÞÈt’u‘icd9!-r™´CcÔØ7§Q°«§`·„»ð ü~†ß¢Ñ‰˜I‹°7áCø>‹/Q§QGÒFbc¸òéÂÑ1KۤݦýX+lÓîÓ×~® iEкµL«|̈ü×`¨ØRìÍgøruƒ[’"MÅŽÔ(xýDåX^AyÔàW e[aŠ-y“È“&b$‰Q±¦Â+˜·7§æ¡’²Ÿ=³xâ=÷¬ûAÖÔõ·å¦6o›\~ý‹ƒoœm°Fœ·:„ºgºŸˆ!ׇ2²;íåxÚß´À40C;×J D ê¦A;·s^,èl´ÛÈæÈ sF j~M™ô2*— {ÌÍæ˜¹y+ôÛ×ðEº5šCñBº/ µÂná9á7‚v¢P$T w ‚b”¬S‡ÎÓ§ûO_<]®ŠBÙ›"1ä–‡Ó1ÅšÌt R.éµz)¯œÈ®§ffd'ìzàÜýw%ÜeuMX9}ÅêÔâ±ñQ²!$¾}õi>ÿí6Ý’þ¦×e½­Hñª#ôÇ’ià)Mž€ €ca ÎbÓù4a9R-Ô`n†ø¼ŒK lF’(DˆH$_ÈÐÆ(¥i“aÚYZACÁEfiš54G5á]ýʵ˜51æ&#<„$Cù+2–r—’0SPÍ.§Â;ù•Â÷æuª3Q¡rNѦ|8ò +f°_¿ûõá?.‰‡¯<%?¡O³úÞü‹óxžç(&Å-ph2Y¦9ÓYËj¢Å`ä²Ùd*Žm2’n@ǰHµVm¦Ú#®dÊ—r¾¼PÞ.Ÿ”«¼H®’“ßß—5”GSÔHÖyé¿#ß9ÛÑáØìØîØå8èxÉqÒqÑÁV{Êñ¼ƒ9(™3úu.ʺér©€¸¬~Æ*¿þíBVVòQu‡Q>©Ç 1N¾óƒBI8õˆ´·poVøDñõùåÖìáéi“gºœ;ðó¾=ë†ÒÎroËÐt|ÚCÝxùÊ{Ý{¸#ó õ».ž½ý¥Õ‹Í9— Z«þ[ëçYw­»ñÏ®9d!ïP&¡ ÿ¶@Ò÷fÞÀa…°ô;ÿ!sà;"¼S¨œÌwÁtÁR*«¨mÁ, Ö³­Iý@õZªO*¡Žž|jË#\ƒ+¸4¦ú˨~„ê46ü‡àk´»}ÉÛøeáÚµOЉâJÏÔ|.­•úµuÃu{ô²~J·F)ŸUbéìdƒòûríL²|¥W†W®sw`Cõm¤†GàÅ0ÌÁ ¿ ÃÙÚçaX„!(…a Ø1. KPY4 MÚˆ‡a'¥cƒ0£˜34 s(à£Ã°é|ua ߆5Â?Ñ¡Ík¨khoX[³Ô³´ª½ÊSÝÔ¼¦µ¡®¾Ý3¿¾Æ3£ieSûšæÏ”¦Öæ¦Öªö†¦•žQ”‘¥ÒkìHϤåË=*v›§µ¦­¦µ³f)5¶6T-ßãihóTyÚ[«–Ö¬¨j]æiªýÏ3®ªo¨®÷¬¨ZãYRCÕ5´µ×´E +=Õ5­íUT6v´6´-m¨VðÛFªKxfVµ¶6­šÜ´|©§°½jyCõõÉS=7cxnBùOí jZÛRFL§ÑÓ:VÖx2SVǪ#¤*nšçÿ-“”7@=íô¬…ò=UT¯"¨šh—\­*–òÿţ²†ÊÔ§ü* ú›Õ–)Tk%XyW©3*žð¯FAj #©u,§ÛsÓÜmj­†Ê*;Uj1œ*Â~†j *žB]»ºÎRÂ[Ae+,£¶&¨ý¿¢qh ~ë Vf[Cåu„BQºj»J× ŒÔQÕj‹"«Áz#t¨´¶Ž2ÛµùÛˆ\x`¦Jo+õ­‚Éô^®ÎY¨Î´\ù¯”§~GßÃófù?Å_ òÓv]*£‰îôðÚÓˆ·•*%™r]«coZãæR¯¯póüJ|‚ÐWÓß Õ’žþÍõ\Àz%4a½ßƒŽ!à ¿Fø5^¸„p /Ô"Ôâ… „ ôLŠ`C:=~zfÓSIO3=GÙãþaÒÑΧ:ù½Â½âót.¢…h±H(… Âñ)á)Q@ÔBþSn™»yÏåBö¾áÇùÇüsâ’t²Î£K× Ùݺº€î¨î„î”î‚NÒ™%·”&åJ³¤ÅR“$eïöIG¤ÁCKH¢‘Ùà1¤ü†Ù†Jƒ”ÝmØiŽNN.¤Yînfv»ÝlVìŽXfŽuÇ29ÖìfZÓãbM® .–ëò»è@$SÕyÁÉr~'§ìd:Šð.¦mŠêŽb¹Qþ(FÇÂ(Ödë¶±\›ßÆÀ&ÛÉQ4Ý$ë%qõ’¸zÓSJ{ª›õø£K—º!KÎògÍÎjÎÚ¥IϪÌÚ™È:‘%qXÏ[¢û0ƒ·B_öˆö¿ñ¯=¢[)ü£³D{õZŸ»zm”Ïþ³ÕÑΎ¾Ðþ CFÛs‘ Ò¢õ?Ï<éð=ñî žìéæž$ãqX˜t»8†6¦ß@#Ó“±ÙñehÄXNÐK½_zíA<ÚÛø®Û>I‡Ë  àFò7œAåÒ0Buoã«1TŽê鈢ÙÓz:âÜ“ô˜ —U´$h”ši c4þÜiÿöò¡aï‹czìß46V¾j "óG ³Ùx‡Õ~ª#Éýá Îsö÷”©_鲇{Ü/Zª?Âg±ñr‚ý@‡Ï½÷2uø#Ü» ÞxÍþPcPxÂoÜm¿§ã#÷ÝÉî;iPWï8{u õë´77n·Û›ƒlOo¥}%õNîi¯SVxÎ]©¬¿è²ºZiã¡È‡°/h<Ì&>ÞééLwOŠÆP–ô–*µß’?(y=\¾F¥Âñ+ä-JýÔrNÞŽ+{:‡*o¸>¶Êx…8;.!ì¹äÞvLïéŒ%¦ötn¢"¥§s·ûeêò‰=GÜ“"Ð †ø¡»i ›b…V‹®ÞTû¥Ú «ðë*íïÖ¾o¹,(Ôô>h?Vä?é]kÿuÅ!Í4ôØŸí Rá~¬ìtI©?Z«ˆ1Þ½¹â#÷]¥îå™îekÝ5µß&Û è¤]ÀŠ5:®›´z%ݸJ}TßÑþ R÷Ÿ¥î¤î“R÷SR÷©»DJÐÆk=ÚXíPí­Sk×Ú´‘ZYkÒµz­V«Ñ t&$~„L3›ž©ô¼J€+/bEó&c[Qàh5-ñ¾šç ¢~NY@ôNÆ@dÍŸç+¢27å+ èf/*ÙøÃÒ»Gý1K]J}c´ò;–CäÃ7nVÊÐÆ­¥¥N°ûþõrÞ±höš÷EÉW4oMO7•ΘÀö¢y%'cJ£ SZØ4Ïs[É!Ï<ùy‡XœR”–âo²øü¹J;3¯´´(ˆ3T<ò±x/^)O× 4êZT<öð ^±Šía¼ÈÏ XÅ+Žüì;x Yœ‚ס„g= U¼…ÖÃ7áí¿ÜžŸ·¿½ýÚ\—UœËê\PHPq**§³BÁÙ®‚0öWœSæ¤Þè.S»‘cW¨ST`²Š²öJí O½†ÂS ›I_Î+é)ˆ+È¿7(ãg•Z•ZëéXX_ïͯÌûŸÑÚ‹ÿ·Ð/‡Ñàߨø;þ¯nºj&c~ÙdÑì’ýZ˜\:å¶Á²—ôda•Ñq¥“íróDÕÜôoæFE†_ð€ÁWÐ{' ÞÉ›ëTóic@CM= ö„8çúèÃàÛHÍá®ÔI©“”.Ô.“òÓ¯p—sý„¸èø'Ü%S³…œã&ž ÀòëƒlD~}ÀoeÀãÍ h”_¸!ž@iHl²o^[»Ï×mmêuhCTÞüv{{{ÛÍ7À™=¸ endstream endobj 138 0 obj 8630 endobj 139 0 obj <> endobj 140 0 obj <> stream xœ]’Ënƒ0E÷|…—é"ÈCBH) ‹>TÚ{H‘б Yð÷õÌÐVêtÆž{¹š!,ªKeú9|u£ªa]o´ƒi¼;¢…[o Ý«y­è­†Æ¡×ÖË4ÃP™n̲ |ówÓì±9ë±…‡ |q\onbóQÔ¾®ïÖ~ÁfQçBCç}žûÜ ’j[iÝÏËÖKþÞ "¦Zr5j˜l£À5æAE¹ÈÊ2ÀèwqÌ’¶SŸó­Ò·FQçžcâ}¼c–È s‚œ2§È{Öî|~E>¨ÿÄLþgâ8B~äþ¹àó ò…8%Ï+ûÓ·Jî?y–{sþ=åšÿˆÌùÌ ×ü{dΟsþCJƒZ'‚#Ãþ¬B¨»s~ ´xš?N¾7ðûoØÑ¢ŠžonžŒ endstream endobj 141 0 obj <> endobj 142 0 obj <> stream xœÝ| XUUÚðZ{í}.ûÜç€Èm¢â­Ò J"  ieqäq@Dt°ESÃR°Ì”)3ocæ4f·ÉÉÌl.éÌ8Ù×T66ß9óÙL£°ýÞµö>ܲ¦ÿùÿïùŸÿwsÎY{­w½÷ÛÚç<Ö×5x‘­F¹ÊªÝµ kÜE¡÷Âö²eõÒ”ßþÆ‚Woyí’ê3_½€Ú°¤ª©}J¾Pn]¯­óÖ–_áÏÃ}Bð€0\ôŸ†zÏ^ÐhuzÑ`4™-V›=Èá :2,<"2JŠŽ‰Ÿ0:qÌØ¤qÉ)©·¤¥Gÿ?ýè †ëM´íÀ{஦€™NîZƒ`æ-|¯çÆÁÜt}­è4ÙÏ#|J‡Y„Î ºŠKÐK€c2vàÉZ ø|þ%¾ˆïâ/ñgÐDÞÏŸáKy?N'Ïó…=ðšL~ÉÙÑ)…ºðÇÈŽ‘¿trœŸÁ›ÑÇä Ù>*`o Ñ†v£fàÅ}¨…kæŠ`æ¤pm‡ËëgðNüpw ?ŒÎ¡'ÏÍB;ñ9ë4úz˜”p-à—é\9ðpýÛ‘ŸGÂ9,"™ sÀ=ÐZÌÞ#È8á»®  \‚vkº4m,P¡ÛƒßÂ=š-¨}@î!ñ>–ßËÏBmŠH)jÜÛéM9nÙéÕL±s|)Þþ—jî_R‰€æK\HTŽŽÃ«Qc™nÅkÈzà”®F 3Ú;øØ´«@j„|$-…Q3:„Ž q¤µ&&¯f¢ðعƒÿdnÛ¸ 3d„V9tè¨Fà ‡Q’d=ÌÅåz»æ.ÞY=.iØ­dÕJ‡QáaS“ÔuãFá>LXxX?Lât‡ù¸ØO¾kñ“qI³ H‡û²g¨X³KgÀ\ñÒ;˜†ùìã@%¨\îàË…Ýi´h¤ËÈ_GšëX'´pl,Yð*Š»ñd–8¸\“l'-<‚âñ"Á;?g¤§M€Ñ„[1Ìi"°C£ÄðœÎ‡Lý×¾ªGo¿½íþ}ÿš:cÓü»k|wÍßôÚæ­}µ­¾Íß~å£-m 6}óô£¡aîøfÓ Ózã3þðËô#×m&#g6p‘Q‘:=§¹¨¨È,ÑÅ;1rþıuD»oG[ã³m)¢Â´(&,Ôç N/Â6ÅÚ±qÑi<¸ÀXl‹Å[äMÛ·o’'áw®c,߸.¿+¤ôýêñÖµïùìÃ>í۫Ȇ·}‚&¿Œ^à¨8<2=4®¬4®xWPJÔ¸r™R—P(” mÂ.ACA´kc¾Ñ#Gðù `´üq¼õĉ[ðŒÑ¼ãúäƒmmH¡Ío`zMv95í<׎Ôµó?¬íªŠ=Kw§ôôÐÈO=Å4í„Ü£¼N‘Ã}#©6¹oz§ çöË9ûû>Û¯Z-°ëQ“+RkÃæl­&KËô‚NÐ`-ÎOÐÈ€r'3/쬣8!ÿ%}»E¨»¥Nà&igq3µ•\¹v5§Õ`½Æ‰Gjrp®æN¼@ãÅ•š&Íüˆ¦êÍ.ƒœ,( cƒ·ØSØÊuœ¯ô-=!œ»Årm,ÿÉõ(Ð×5ÐÂ_€O-ºÃeÖPðØÒ»õìÅÞ‹ÌâiÔ"5†¹@8ÒÝxC1FÒG!+ ÒZõ.}­~—^¿ˆPí€çiø¯ú.Ÿî» йvN Å—i½‡yœ Ihº+6µ‹úvûƒ¸]üi”Í ã‚B£dBÓõ(ÜÎG+îw–: Ó’bÉ©G,1˜:_´â|ýðÂ`'K¯à‹±Ñx žñìÓO?+Çc·>öØVÙÀñ—®­^Ùþœ|åzßÜ©¾Z7l\ÕËS}uÔîyãÅõÏ8¤ÓO¼óGÕã3!òl(šàiú‰ùØnÃ?A‡øöH§#µ¡&”ê°Ž¤,ö°ìÉxûÇåÔ—,aQaVò£„lVÜMtšûo‚…„òKÝ@òlÅè¡KåK¿ü±üSy^‹‹×~),>wß½òIùòyùä½÷}0kÞ…!«à]3Uß] ZPœË¨-œLA¼ø ÑsBTŸª-Ô®&«y^Ià¬ïr¿ï½åÜ~%ö…ê% hàCüë8«H#?¾Ð]¥®©¨ý*ä–Ò ¦òtEˆ¸hö aËUœ£äOäÓrpzwÈr¡ìR®7âP’pÈy›¼Zþ‘Üì¼aÇo!$uÉNô°†ð8 œ}UÛÔ‰éNtåƒÝÉå70u½P÷ü`ѨٕŒœAâZ}ÔZ)¨ÓiêÔoÑ„wJ[bÓlt>›„ˆ#4<^²†G”^“hí==ÄUæF@ ‡Uº?_¶² êuòà’Ù‡%wƒ§'2OOD‰O×{"ÝQnÉÍ£E7©tJ§î£ÑfL…YÈ„2í±gå_Ë_Ü{riÉ;Õ¯ì~îÐÑöÏ>QüZÿÔÂ?cã£$.êÄæþ÷Ö-im?nßÓXëoÿ’$ýæÈÊCú™® QqaÁF‹.Ìà µð‚DPè¾0´/ö0Ë>Û‹qá¡#Ì#ÝHg¬G#£œÓ­ÈÀ³Ž& Zµ™¹iOÃ&Õ¾¦?Üã˜âhoÔóæïîuÔgb2îïx‚iƒ3ÐñŒqr6λËç»kÞÆœiÿz¾êÑ©S­zþ_Ó^›ßöÍŽGÃB}ú›GïlÛòÑ•v[ý¶¯>Ú 9ª¼ýóÔ­®ÑÄÆê=æúA8ÈE؆.‹&V §å]d/­že/;óÛ´ºÎª¹RÑ!µ"‘¦ÖÛÎÁep©\ªªËá\œKpéærs…¹:/÷cn g Æ#I”ÉD<‰¸DˆC²œÔŠ»D¤Y’®‡ZùŽ?§Î÷]9 uv;WÞûw¨ 'i¥Yä$næ‚yl A8ŒÄâ$’ ­o#óu õ^ÝRý2]d¨M¤?E¬ºAZDZ¬Àëp ÷K¹å´ÜU®WG¾¹6Vˆê…ÆáÚ'`xÑnÖ9šÐFW6tŠ&è ÚNv†Ø(¢pŽ7š­Î2ᨔÏBU´†ü)îÔ¤ Kf%fd¤Š14ÍB Q%jD m0 2–LÀù¸ÀX`šËq^AÖ`“Ò ’t[º3––Ì ¢‘9,gÈçÎê»WˆëýŒœéMß+wâÒ·ÔŽM()‚P8zÑ•½,56ÂÁÆó$ ŽÜNÂ;ÛõŽvÓƒ^ÐÔÐ`³ ††ò¶i1ÜÈG°zz‚ѦdöÛhSgŸL¯c j»ïФvÌZ„$`]-ïDNìà‚I9Çqñ$A¯×Åë¥È x—ƒs¸ ¡oƒÖiÖiŸÐ<¡ZÄòfHP,IÆ´C´EK´L÷7dSfóÔ3ç_¿cÃò ïâw0ê}¸o½üx{ûãÜñàÍ?’+pKÇâ¾õ¹ßýaÓ1® ïrëï¡:¡g¡¶AÑÕiGJt…["I¸3l«cƒ¢‹³Yíéiv›•K`1ËâÛ°ãé§áï駯c½üÏë×åb½P(Ÿ‘߃×òt<§wÊ~y­Ü*ûñ&Ü„WàM´›¼=Ð¥ƒ®rô6ѧ­Î@?ôÐî Z›F# Ï]‡ÜeÈ2èއxÓkØ 9p4¹pB´ž´›ÇÙ·ãŽG™gÒ\MÝÓÈ’µ.µîÒBÀs¡ºC‚.Á0ž›¤›`˜­[ Ü­+çî×5r†µÜj®UØ [cØÊmæ¶ Oë: aÐsV«‡c Ն警x<šK$ñÂhm‚>Ñ ™2Ø[ù)š[µãõãÅI†i¦YúÓÃ}&/òâ¥d)_!Tj*µUú*q9iÒ4Ááh•¾E\nXVㇹudðcÝÆ6Óf´oÒÛ4íº-†]¦L.õ4Ùêq,üáÏc?n8/K:/ß#/ü#ç„Ä{ŽÛ—Þû ×Ü·†D€àŸ@Üß–Ñl—3‹tò\§ð uêuQšp‚¢0œ{N(‡Ž4vº=3=Zh©30í¥Tí½d!ž[41Ú&dı¶JÆwÈObï»øŽÞÝûyÿ¬®Y´ÁR{Ç à—h²KBBn'aí:ûOl‡œíæÇt#9nϧ5X#i^½Ø{¢¿‡”Ï^†èLƒ”mÓð®‘qÆÇ÷÷“ü[òQÎÞ ÿ¹S~FnÀð½c­¯¶wƒ|Yþaûý{ÏáÇöôµÏÃOâj\ƒŸœ•óûûJå÷åßÈ¿•ß.—‰ è'XÇÙ Hh7oÔ£íºpqÉ2íýÅ)Míûgv–úìÈ®¦¾£QAmA»‚í8Á4°á¢T¯#§½õ‹C§å¡D}. ºáÊ\!zï‘/È¿Ãcð(@ÕÖºtŽžs%„Ž ##Âá(èQ>ËúÛVS§ã1urÈ*rX ± ä3èëÞxæV{ª¾Ay–Å€_g mïîôwŒóHÚióøùÂ|í ~…°,¬5T QÊäÄðz´LÓ0ÒVþZúÐȇ ߋö†ÙÀãÀ2& ‰SñðÖO«Ax=÷foä‰t÷œç×Þ÷Áòg|Ùw‡ÊW÷ïß߈›R½-·±#kú{·¤}ñ‹{ž«ÿJ=矑K|3œ:¦¹ÂÐZ¼Ž7¯5­»m|wH=vØMh–#ŽÇ«|õ²õëËôhf [¶9¬3LÀƒϤ«ÇõøA.å?]ø³·ßþYáÓùsž[Ô&‡5óžá3ŽûÙ™3Ÿ»Ô(<›±O‰…< \ñ Àͳw@ží¶£ncͳvË\bwf˳®Øi¡Í¨YÓ¢mѵ@Œ·š-¦s‹¥ÅÚbk¶w†^ µ‹ö@ƒCÒ±ëÁí[ÜrÛåËWþ&…mäãK§N]úâ“Ù!¿#÷È_Ê'ñdðtžz;.àK¡:Np…="f¬i5Û6Šø¸Ñ¤×ò¡]Ìq0.éóðg(ƒÐü¦¾Têü•NkA¶A~›AÕ¨kåÊöŸvuM±áÍwð1nOŸ{×®×vsÍ×;–—]¡è˜<Ÿß š±‚ßNu…ìFfG· ë2oį’ã6»af´å\«½iŠŽ.^êÖ '}iäêÈÎÈ?EÂQ- cº“:-O@3¿R4„ýÝÝS^l~ïÆ÷š_ä&=ÿøãÏÓ×Þ¾Cq¿Ç-—¿ë¸ÿõô¥K§á:yª ÎżŒ¶q4ÐÿŒÅe²ªÏRj…+‚†cßìêÒ8þÕƒT‹·€\†j]£ êë×êÖ Î}Xè6âWFtÛ»ŒÃܜΩC³9»%;œ)÷‹EêÙñê*;_¹§EÔFtFü:âJ„0 MÃÓ¸iÎiaB’6E—¢O}ȇ}œÏé Ó/z€ºn4;\ š¡!Ö2wÖò-½GŒg^^zrqٯ‚$ö~е]Üsë¶w›¹{ïzíäøñ‡Æ$áIXï˜.tbÛK‡vÒØJÁ¾}Dá‚uû4¸m3kŽ‹\iõ‚Îd1ä›°çÀ'ØI)…>Z³^NSŸø²Ó‘ƒ•\®!§#K-º®$E—³ÐÙé¤ÏJÙ9Hy:›‘ž1~B:÷Íá²98EþM÷áÇ^Õ8ž,¬(këM!¿iËå³øÖ],êFCÔņ#ôöµAÁÝÒÛ•p\ßmyudD|(Ògjìv)›t©ƒS?q±‡y™|î2{X}´tÌê1chw[…X¹³ìí˜z½Ò!‡d¤“gžkßúÜs[ÛŸë’åkîƒsçî,úùK“¬|¿·÷ý•G&wq·¿sáÂ;'/\ø«ü©ü—ˆÈŸ%yõõ»ËÃñ„`OY\ƪá1ÈìcXlv‹pAù4>Yl²ðH¹íâðؤ-£Âtˆóœ»»³~ÖðæÛÜî¾{¸»v¾¶»¯•/=äõ|¥Ð%w]Ju94-²H«¹K\+jàð˜c§êbÙüöì{ÔQ_*„F)*¹s€\¹#*7iÇó…ÇÖ%‡“—ì¶Ó¯õbåe‚Öj†ˆÔD8‡ eћѾM·Ù&­:Þ <ĈBÈ*qÑ9²ãAê÷΂Ŕ§€'.^í…ú6},-:œšÔˆÔÈÔ¨T)5:5fZ‚+ÂéŠrI®hWLaDadaT¡T]S˜P›°&¢5²5ªUj^³9¡3áJBd`k`S`CidiT©T]YU+ÕF¯Ž\µZZ=bÑ ¬|;žÈ„Ô_£×¹`îµ>è{²»«kÚñuO÷]ÇÜóÛJ–x_»ë¿®péåÍ‹ýç_JÌë{p¹ûÍg^}ÃÞ²!9yBBo »Ü‘H³æ$Wh kn4wám„åË™9³#”|MMÔH™G•ŒIس(•=Õeq –—ä™®®)/®<}ãÆé•/ö„\¹w/äKr”»÷_={=n<ëàšá–„ 3˜û»°<¸2 : Ù‡lø¸®U4èôÐë¬vsN =¤©ÏÆ”óâäÔ#/8•‡’äê£ø ì6܈›å5³ý¯¾zî™ÖVa§ü‹¶¾ÎõùÛwý–+mÃSYìn£Eß=¹ÑÒ¶-Ùí3G5º‘ƒªˆª‘·‡hdpÁTHà„™N>¾Gû+É”în.EUW4¨Žxö3 ô#'Á«Ð%õÛ¦bõ˦âÈþ/› OYÏ;Ö:× }J\×À·MEa:³VçˆÉMcíìo› 7}MûÐo›_6¡zú¬à áÆd(I†$ã­ú[Å[ · ’ð(n´8Ú0&(Å‘â<:rtT¢”=*a­¸Ö°Ö¸Öd§_qsœFÔˆ‘˜ˆ™Xˆ•„’‘$Œ„óú„”Äi‰÷%¶$®Nܜؙx%q´u ÿZKûí¯µ&€·‘ ù{ïZ¿~ñÖi'žûçîz«ªüm÷C½\žøÓûå/ñÓ]RâÊ6yrýŽ£±±¯ed,œ;»0Î2ªý¡#Õ³#TÙR¤ÁvWÂð3¢¦áŒ¨¡Ï·^‡ƒ$}Ã#mà{«ï|¸(RZV¤ ¬ )G í†i¬e•JK”&øÑYÜR®™káèð1n7§£ôõDÏŽü#ÉH>Ñç`‰¼¤Ë@x ™Â§êrPÎ%¹|Ž0KãÒÍGóñB²/Ô•£r\I*ù%B…¦T×€êq3i愚5h ^OÖóë…µšÔ·qÛÉüpØÛ+<¯9¬{C÷±î†njàÀ‡co ß‹ï}K¾ç_Ú[B^ï¤ñ2ÐÛhÑX—Yóÿ":Î XÇ£¨’×{éVôÛ‰B}©¾V/(m}â­NW_z½Sãø ÅÍ~‹eøÂßÃüô0à#<Ñ/&ÒÇ5ð‚ÌÈ2+*ë,Æ­pÛn^ázîH©’3×7Û¿©oGßNZà€î|p ð#‡]¹Â< õül£§,;} ¢oæj&æ‡&¸úý°ÿ9…U`Îh¢Š3Þ¸`.Xˆ3Ä\.WÈ]âÝÜÝÂ<±P¬áj„r± µIhZ¹'¹'„­âqî¸ð>w’üJˆ8=ÑðAÔôðatr¡$˜)„éÂôƒÓHŸ[År $šb41Ú8]‚~”mˆ5N&ø ºÉÆTs7‹äð.>Kpi\Z—n†~†8Ãà2»ÌÔÅçs…ü\¡HS¤-ÔëKÄy†2äÁ^n)ñòK…¥š¥Ú½Û°Äè37 ÜÄ­"ËùUàú-šÚír]“¾Eß,.3¬2¶rë„6ó6´ oå¶üS}^ö¤Î•ÒaÜeÞƒöàÝÜnr€? ìÓìÓÐí6¾`þ9÷"y•EèÒ¿n>Á½EÞãßšX¸„aú‡c 8v~ן??ÿçÏ»äÏÿíïç!p:ÈRúºÞI:z—Ò̽%Í<üŒkºVÇémÈ"Ú "B³Í‚,&›Ñ„è‡Ù®d´#e™ z+2­äU³á¸Õl2Šzð…·¬•”'Vê£Û'ŠÃ[œiÊ5çZ\¶4Ïåæ‘B¾P˜¯™§¯»S'8Æ<ãBóBK¡­—sb¥¹ÒRjkÖ-7/·¬Gè×Ö×›Ö›×[žÔ·ÚÛÍÛ-» »Ì,‡m¿²}l»aó‚i3V¾dš†é#°tnKþÖ•[ªòJÒ£å[•ôXñΊí³Ö–ðù½[IhìCH‡ ùÌö2$2ú[ÿÙ¦°iòR2—6ê{ ºË¯±ëGX&Bë4¶FH¤+ìx¨ºf‹N§)´é,…á# ‰e‘{{{”§.·A»Î: šÎ\A©£ GÕŽÚ<ª®×G}<êÆ(=ä7–Ñœƒ³Ü·ÚùÄì7záµîº†¶=Ýu›ötwO;Ü´âY¿rÙןÒä÷“4ùq;ŸyêõgY“¿dñJö#6Dó7šƒ³ò>Ëm_£(ûmÛ±î+]ß¹Ñßh#hCƒtêoÙ>mµ1øçpÃ~—ÁŸAåBF‚µ MȪáÑ)þtŠ»>«`F§„^vãš° ÆÈÏ7 SšD€Ù€v !hÅ0½š<ä×\¸äÚØg«ÐŒn‡ÏO4éÈ/|ˆŽÀ¸ƒ/GðŸ£;:´q“Ñ›|z€û J{:ŒÜŽñ—P3½'±h"…ãÇ"ÝNá¹#è …Ól@óÙÜô¡ö4µ7غÛð#¸ ÃEs8/×Íýä’­ä(ùš·Áõˆ`ª„5ɚǴaÚEº1º%ºcz¬ÿ±þW¢$Þ#îß1¤1\6Ž1ºÿ4M‡¨{ÏÜlaqYËxzWQ__;%%¥±±1yq`!¹ÌWýƒ6‰7“Ø$þ¯²dMb¡·®ºÒï¯ôÕPø oè-©s×Ô{=IRy×K7–U¸ë–x“¤zŸä®i’j½u~Øà[\ﮬ©¬YtÊ€q Y_á•Ê}5À˜» ä©p P_Ø«*˼5 ÕÑ19"&y$·ßï+«t=Éã+k¨öÖÔ»ë)?å•U^¿4šbd¤b_y}£»Î“È8©óÖÖù< e^†ÆS ¢U.n¨÷2†lH’*kʪ<”“ÆÊú _C=0S]©¢ðuŠ6mƒà©8IRµ—I]Û°¸ªÒ_‘4ˆF¥™â«“ü^0@W«ªøÃHSæm-Ut½ª:F¨±ÂWýí Ô å u5@ÐË6z|’ß—$ù/õ–ÕÓEÇUU¾F*P™¯ÆSIåðO¡-E÷bß2/“Añ%ÆB¿#ÔøêÁ~e–Ú¥vÀ”5É_á±{U½#•5’{ˆ¤¾ðŒ:©ÚW罩àR}S­·Ü „’l ]¯v7Q Õ>Oey%u6wU=¸ ­ÛãaÒ+êâµî:ଡÊ]ÇHy¼þÊ%5Œ‘%UMµ~º‰z©» øéŽGþᔯó(JsWݺ'ÀÇ6`¯¦ªIªâê N—þüžÁÒŸª’Ú&"^ð;¯Â|£¯Îã—bú£1†Ò,H14xcT¥uòÔ¨Yì…x¢xÀT„e¾Ê~Ö¼Ëë!n$wm-™{q•—.(Òîa†©p×Kn?`ôÖ Õ ðqÔPãQYŽš[b¿ß²~_nf:j(·TE³ÄL°Ö]v¿{ ˆñXãëÏ!?ܵ†‚ÄLz«Ê¶feK9ù%RqANÉ™EÙRn±TXT0?wFö )&³îc’¤;sKfÌ+‘¢(3¿d¡T#eæ/”fçæÏH’²eKERîœÂ¼Ül˜ËÍŸž7oFnþL) öå”Hy¹srKiIÛª¢ÊÍ.¦ÈædMŸ·™Y¹y¹% “¤œÜ’|Š3fJ…™E%¹ÓçåeI…óŠ Š³Ç @›Ÿ›ŸST²çdƒ€hzAá¢ܙ³J’`S L&I%E™3²çdÍN¢€ÈEI.‡”=Ÿn.ž•™—'eå–—egΡ°T;3ó æPÍËŸ‘Y’[/eeƒ(™YyÙ o Êô¼ÌÜ9IÒŒÌ9™3³‹ˆP0UœuÐ 3³ó³‹2ó’¤âÂìé¹tzÌ-Êž^ A÷ ‰<Æîô‚üâì¹ó`à$À ³²  þ¦3Θøù .ÅSRPTÒÏʹÅÙIRfQn1e!§¨Ø¥ö„TÆy Oj¼|•_j#:÷mï(º[pFvf ,¦l| –ùWöò2om=õo5È•$ɪ’E“˜ç*ÉÜxf „¯2džàÓ_¬)Ynh‡¤&ašFÀá*)IØ³Ì ™ÐOS Ĉ&•ÆJ?‹w(‡Õ>µþùÝU@ võCAÎtWÁ6?›Cƒ*Pkë*aKc]e=¤Éݳu•+Ô’\§–¬áP*Ãù¯óúk¡bU.óV5%l­kŒ“Êšr_]µ*:S_Yý”@.­—–0äÜW·$MG>T‹šPªDKPªGÊ ‡–Pt³©(F‹BBYSüðªƒNتQÌæ¢€O†Q&ª‚K‚Ž9€ËÏî¼ðé…=ËàÝ߯#¡ù  £bx¯Õ"ଚüÅêé:åIB·?·€”ßÞØØ9îsTÉ䦣z6㺯Ýs>Tþouy3üµÿs3!ñÛŒÂþOKMiÐW!ÃYÍ0úáÝëülͫʷ„Qª|”KŠ«œ­zû)–ÁÊØKb¼ù—5l-ÃæW)øk=¬UÂ}-Qå)S5ÀYϸ ´|Œ¶"wƒ«H{…Vx¯‚Ï2ØY£úÞh8çôãˆa¤{=ìÓÏø*ƒ=nU> ^t¦¨xÙ.ºÐO9Œª˜Ý(æh PþëQ#Óˆ—QÐ ©…wPi`|pãaÔ3Ÿ[ «õl5@ã»)$1»QëVÁ.O¿N™TtÛG5SÍæKÀ_7Ä7n˜“Y‡Ž«™=¶®¨Å ·v'}‡Iýr¦¦:¸ó³QÕ»RÕêPë¿ÔÍ)ÜÖö{tý0¯¨‘é£úQDC9ÈPǼÕÏö Pô°wJ#‰}RM,ˆ2†OìÇT^³‹b¡2FÛÃ8®T9Ò¡%êN7`õ±1`‡Áyi@ ßÎ5_¯F„l ^´68 Þ'1¹Ýªµ«šð7E#•lŸû{lJ1+9£Žy‘OÕòµ8…ibü–³L@q'K[ß·Ÿê¥©_†j…•,¦™ò_¯f?eFá–êÕ3Èöƒ½O‘¼–QQtÖXÜl_@*ã–Ú¬fF–•¨B«”KÝ̋Ю#ÿ¿•ip®ó ñ47³Óç`(áú¸oIªÍ«Ø¾ÊïÉêujò2¾ª‡à Ìøû½27ëˆWÍwÞ!šodRyØþ˜›ÔƘ~¹‡ï ðÊ3ÌÓ”ØÉVk³Ø÷ â·A‡€–ÁjåM´æEË™®kÔˆ®…K©dn–]½ý;Û^áûû#¦‚e{‰}úU½Ì›¾ÛWén–Çéjƒªå›iV¤½Ávü߉Y?Ë¢Ú=uˆ¢DU/R§îб–yöýð¾DµšRk˜~‡÷!ÿY뻥Z¬ÆJ½ZˇhkÊf´ P>ÜQZpW‚ˆ­åœ½]¬Ì‡»0;ƒÙ'“­Ðõ™w˜b,@ó.G¼SÜ a†â–Ø=½› ðù€‹îÍF lÀVÌ ‹î90›ŸÙ*Ý1fæÁ=ÏD´;UèåîCtåEá´æ¨å*—Q p6îŠÿ,u5pç2|”ÿ$¦):Îïç3Gå4“éˆb¦8§GyìŽÎ΃ÏB€+fúÌd2+Üæ3r`]‘%›q XBáh:|m 1ø*a\PJ%*d“Ê3ƒí§Tg³Y…³ÕÊt<€%YÕ¥ÂÕÿü~ÊÅLþ<¸$& Ì”0ÛdþÞ€ïÌdæôûÑ<&_&ÓC£ÅÖ¨©>óú!‹Ye:Óµå|£”É4R|SI؆ZçfÞ 0“É—Í4•Ç ‹AÙŸÛ?£øc.“uºª[§â÷ŠOä Òît&#µì\ š­úT&ÓÝP)”¡üH¡X S}Ÿ>HgÖÏW­;½ßÖÌ˾­•;Y,f3¨Lfëâ~-ä°ø£r>o‡ì8OõÏ‚~Άê7G¸’;\ÚC-8ƒùSžÊaq¿6þ=Þü• 5®Œêûó÷ÐJ>¸“èP÷¢IƒrîàÎ@ÉÆ3lõ0¸Y%O+õkà 4¸—û¾gJ?Ð º%‡+g¥Á°‡õìJOèïïR”:âëïTÙê@}WN‡Õ bðùÏÏè*’5¨;†ãRúL7ë(5ÿM´ù}•jø‰±–Õ~…J#׫] •¯A…¥ó+†’놲þ ²ü;ý×1{תg¬J¦aÚ_&«xëPà¼6 ªr¶V=ÌêÞG±MAÃûRªƒ%ƒ8÷¨÷±þ"™}w­üa,j»ÙÿÅÓÅ­vݸ.“kò¯8òMùgù‡™|-“«2ù¯8òw3ù[¹G¾z$SøJ&—;È—¤çùë5òŸ2ùËòE¹$“?§‘Ï/ Ÿw‹x±˜|öiŠðÙ5òi ùD&’ÉÇiä?ä£rA&ÚÉW‘ó¯?Èäwþ»UäÜٙ¹UäìLòÁoÄdòÛ0ò™üZ&¿’Éû29ÓAÞ;)¼'“Ó‘äÝ4rJ&o¯± o‡“_“2yK&¿É›2yC&¯Ëä5™¼*“ã2yE&Çl¤{mœÐ-“®—_ºdòòÑEÂ˯—WóG']äºAŽºøŸÇ‘—dò³rD&/Êä°L^É!ù©™<'ôûíÂ8²ßNöÓû®‘½2y^&{dòœì–ɳϘ…gÓÈ3fòéβK&;Ÿ6 ;eò´‘ìx*TØá!Om· O…’íVò¤HžÉ¶“°M&&Ò›Ú;ÈÖ-faëh²ÅL¿FÛüŠð˜L6·-6¿B6¯æÛÚ‘6ÿhÙ$“’…2ÙL1É$ëׄõ²Î@Za¢ÕCÖ‚¦ÖÆ‘56òc™<üMxX&Ùȃ2Y-“™¸nühÕ*áG2YµŠ¬ôæ§ÐGVȤI&ËͤÑH–‰¤A&õ׈ÿ©»F¸Fjeâ“ILª¢Éý2YjË–“J™T¬"Kà¦\&^™xdR&“Å2qO!¥×ȽF²H&wËä.™,\ ¯‘"¹38T¸3Ì—É< > endobj 145 0 obj <> stream xœ]“ÍŽÛ F÷~ –ÓÅÈb<#E–2ÉDÊ¢?j¦àØ$µÔ`‹8‹¼}ùîG[© [¸W—r{ظ”ßâÔý¢Îc¢¿M÷Ø{uò—1Ú¨aì—<’íæ¢L¹ÇÇmñ×C8OëuQ~Ok·%>ÔÓf˜NþSQ~ƒc¸¨§ÛcïóüË_}XTU´­ü9í󹛿tW_JÖóaHËãòxN)ÿ>³WFÆš*ý4øÛÜõ>váâ‹uUµj½ß·…ÃkµaÊéÜÿìb Õ)´ªš·6±®-Ø ¯4xE~׌©ÀŽó¯à†ó{ð çkð+ù¼aÌ üÆyÞ’åÜy ~'Kü^Ø`^Wd8hú[äjú7;0ýk¸éì7Mÿ•ÄÐßbýá£éoeú׸»¦¿EMtöoÀô¯q_M+ûÐ߉ý ýÄ›\œeèïpGC'1ôwL‡s ýjkèßà\COC‡;ú7ÂôwOÿž†þœ•ýQCC»IléïP›ýácsýoéoàf³ÿN2wZoçOË«þcjwy`Òçèð1ø¿opžfdÉ÷¶8äï endstream endobj 146 0 obj <> endobj 147 0 obj <> stream xœÝ| xUºè9uªª»«÷îlµ:‰  &¨t€0 `wÒ¤ÉÒ!Ý!QqGDEä*ƒË(Ãè¨è88â(.ãx…™ë6ŽO¼3jô:z@*ï?§ª“NÀå~ïÞï~ßKÙU§NóŸ_NFzzÈ„6#‚<;î—ì¾!ôBØÑ¼6"_ó—ð¿Aû/ðûmKwkçë_ßõBä~sckGKÃ[gâ'#4ÑÓðùg¯0f 4¥žOoƒŽ¥K÷á>»­3²®=9Þ÷ý­#ÔìË,Ÿ5¡âÇá~m§o]÷Ÿ…5ïî t}Ï©\¸xB;ôa8èŸ š"½ç/ˆ:½A2šÌ«ÍîpÆÅ'$&¹’SRÓÒ3dwfVvNü 'N*š<¥¸dê´é¥–¡ÿoþp.Â-¸· gÑ'¬çb4Hf èmÁõhoÁù×ùü,:‚>†þ-x—¸R,þ3‹p/–½v¢§ø=üÿ®†yÕh·ÏÁ.<‡{ïÁ3„W…WÑIt/AÀÑÇI0·ÆYèô ΀»iÜ4.ÿ— ÝèMÒÀ·Àj_¡0„“x+ÚÎ'Ñ èCô'èGh5æàœF& 'áøD«ÑúsÂI1Nçæ[¸oÑw€û(äàpà ’V‘×y/ÿ=Ðô€” 2 Î+é´}(¶à~C °Â÷÷÷:z°‡U¹•Ünz?Š`ô\ƒ÷ð è J1z“Q»„Q{#º‘Ñ—¤{ùƒèy›#<*èÖ-h^ ÛJJ¡w:Žb$<¯0B/¦¡]€!ÇmŒr½Žû¹2t7iBw£ø)ô #Ó% <á0*”m‡¸œ*ÿ!Ï¥ òËËÝ ÇÝÊ6|-9dî—Ÿ^ÒÀ§Ë ©‡HŽþŸ“õáw=üpbáÂ% ò¡¿TÎÑ Vzç@_]4étC圉q¨EÙÅ·÷ƒÇСd‰ÿ3ÿŒõÂ¥ŠŽ˜‚l'N LvÚÝö·ÝÝ£³a’röce—ÎòíW=b>ØhøŒ} m E<%ƒ`9@„¢ƒãp9éå¹^¡N‡z HôO‘°žIFÛ‰ÇlGíŽÄ2ú›‚ŠŠOÓåYMøœþì‰eË3ñÂCRýÂCÆúË~ŒÃGaQ#ž í¥.wº‚3ÇMà¸×?£ÜQ‚ƒ¸ës\[ræ3,‘çcqþ™iÊ70iìí$¨ÈÏ € À–£z@„CxÛ‰S¶£ “X$–g:úC¸m¡r'Þªl¤œ[0ü‘¸4Ù‚d4Ãã4ô&‘^«?ÉëF)Žt1%Åì¶8M9xêô€í‹É@ƒ­Ðw3ôÝp¨è㩹Y™È—PR<½ôLdhs:‘Ï‚ÆTGéôl~àÞ;_Vþ¾÷æð/g^T¡à p{hõUÊ=Sþ¤ìêjߌ›ÉšCO)w)_=òœïŠËOqÿ©<¡|ý+åÙ-÷Þƒ`Ó“xÎU{ïFÜð€²LX VâDh—g‘+‰KNã: m‡“³##€§ ƒ§OÊQ²]ˆ#ÉA{\P¿ÝîÅûÉz9‘ÇD@$Ím$2'ÛÞ;ubÀ^VF¥h;uŠ‘lw€XËFøÈd©‰T7"\&âÓÝ7æ7Ü%¸¤8!>NÔYpVf.Îãw¦MÍÅ/…•Ýx"ns×>Þþë÷Í¿üã­áûpÅ 57l;tÅþ¡ÇEéþ¦Æ/ߨrÚåU¤tøµ•Á3ÇZÚ5‰ @š€æ{òPúÝØ´Ã¸[ßjÅ?ÍnMÚnõæ!œbœÎÁdt[Œ)‚ÅaÎ1ž8´Ù©––•©=eSNaû¢l2Ö¹ã4üJ •Zö´©ÓAj%ÅÙä ¦äx’œžÌ¹\nƈÔÈ@iÙyù¡ÒŸEœÑNuCnÀP¦zGJZ#—Vÿé’ÀÕ·4>ªæijoùÌМÅU`ixÙÙvùŒK”cCá+×.œ¯ôs®Ô;ºþ®ü]8y÷¿\ÿ†jqä)·bâF;ã–LÌ£Ü8gŒp«·)o*w‰qÿ=Éþˆÿ¬X¾ýÃÓœž–š’,d¸Àó$â„$¸€As\uzN4F“Ñfåìè0 &“±Ü "Wf¢Å$Ñ®ÄÛÅV{ÖŽÌ[3ZsÁ?›\If“Q2 ½%1•äg‘LbÉ+´;f/‹rôÔé³ÔKóE™ê¨¿ÇW;U32*Ï…%îÉ™³ÝžÌ:÷’Ìf·7óv÷­™÷»÷e>î>”i™–YžUž½0kaöåY—g·gµgÿ4ë§Ùg=œmnD#n}&¯_Ê\ý´©Ùî’ÒïáŒznÿµ×_:¯ëv—oݨìIo8¾÷¼_øOðÆ ¡?ø¦wvå?¿2àoë.½xî5ýùÛ†¶ð_ñÀMü(ÕbfÍž4 ÛSÓ~,óÒh$xäi„Hx“g¡Às"7‰©ç5ÍÐHÏàÒLÔ¯–›ÒÀ["1˜†‚qÞ´íæv«ÍLˆÝd°Êƒ;Ñ,Ó`q*jÁç ƒ£Áï||Í)Öâ°S¯S VNù!e:ð‚ë½áç¾Ë®;t~+‚ƒ MwŽ „U^ol£áŽ;É5üs`ÿh$¤ž”Q K*ZàIµ:Mˆ¤ºz‰ÍÙkòoZªÍЬ )¢9 ˆ°=ugÙ”c* ‹Éf²s¢M´ç§ä§ò±ApÑLL$“ðh:ÿ}ƒÒ£¼¥ìî mÅkNF>í¿ÄûÛÐ_•—>øèæ¹SŠ!?±ý_¼uÏÒ •W«æ(w+_?r¬ªFË*Â^ˆrû=—%æ)L‚çŠãW†\®¸ò8ÁO‚‰x½1ˆÌ‰ É®¤ø8 ¨¿òlŒ,œÝžlƒ$3±ŒÑStlàôEÅc#šî¼©æÂCNzŠ£';=Xú™Œ<€]2J>Êò·Ãùñ,èÁaÁ ¶ÐV%æÌr–8¹/Æ]%Êm+yrñü§K”·ö?$Š+M9|‰°Wùí0Rrm Ò¤¼atÝæT¿ õÄ%ªÇáW‚w°£Û<Ó!y0èyHËDÁ 7›8#\$Á`ЗÛ-Fuˆl³l7¬×%ˆƒÝ«7;À#½fZ:Ø=ÕÃXªcÃ8X´l§ ²”±l‘­²Íƒ<ØcñX=6Ý‹¼ØkñZ½6¯ÝÞˆ©Œcƒ{"Ÿ–³bêõOÈ-,ªO˜wò*çd7)ŠO8t`è,ï=ºz ÏU@üdúžgÑ83SÓ½QsÃhR“ºxÍx½u4uÁ¶@ö’LË”S4qq0‚‹ÏM\l#ÄÆd.£B7ÔSÁ_®IÞDOfz²Ð“ž¬#ŠàДã|Ú9Pc ÖtÚÍ¢Þmú[që“inEh_zn}ìwå+ÝwÔãǹG†ž.[’8sî#wqÎì»ßçÝ{V õVùÊ\¡—ï_U€î÷,/¸€“ó‡}Î̓ TËÁ5-KÍ» nÌÎdì{9Ê% KGF.IÚáÚÚ/MÛmëã÷æI¾Íšá@¼Ý•å¶‹æBÛéc4Ë-S}u^Ê×Ô}•}— ûŽè3Öi%–º ‡À(&8Ô<9&£' ËŸ{Ñü†S[×ÞWšŽƒ¿.W®Vm{~Õ´¥-?üwýÕ­Z±õЪçšV~}bÍGþþM+›œKRþ"»qâôi»ñ‹Ç[Ú?ÿE['å×h´Ö¡OdŒ¼Nx^ܤ\¼­çÛ9‘ƒF‡x³È?}êh4Ù`ÄŽæ·Ñ`n#92ЈNKø¹pÛ»Ê]`meʼ÷Ì>1NyO‹1ÓÀ‚Poä{œb0çã½é·5Ÿ¸“ÌécëÃÃÝ4Qˆe–çñY™ZQAÐûáçÄé+–µ(Ÿ>üŸÊG+—ùq<Ùpö…Õ¡¡cÁ.Œ”w7ýGóÚuÊ»WþÝYúÙÞ¤8âDz.’£Õh¬F~/)€ÑËm6éƒ"nEíq½d2ZˆÙicŽW€bY­æ8Û Õ•ªn¥ø, ^ì(¯Qvi¾ÔòÖǬ'ÅiÖã1xu^}·®[¡E>ÆŠY]O=)¤%|mÑ‹ +Ív\4Eyó ²ûà/ŠÙr>ý71î³ÒÙ‹‡ÑÙ}Ä‹QÍ‘GÔ WX Ù¨-öèÈ s‡L×PÎo¯á¶¡:=ó6PñÒ´×à’X"§%àç«ÔŠ@=p o) OçZˇö°ZÒáO•÷i%€ÑÝP¹<ˆhg±òfX1'Ð ¸.$b+ (ë­ƒ:†Öß<ÒÙN¼¦ñ6ÆséµSA=¡~ª™x.‡›Æñzˆ œ v‡OJ¹é‚²+§ÛIsλqדÜj|óÙ'”iÂÉ3÷ó+!S Ý\ýùϘ”gl iC&³É¤@^(#ÛÍjþc…äR šÿÄT0çËÎÙã9ÆÔú:j`̃håNf.™©UúÊ$·jt½±ùé‹ÖûCûŸ¡ƒ1 «ÌĬ>IDˆµŽDC"rËÑ6CÞ– ‡\ž— BŠÍÀ%º’ÆÒ2Æ%¦¤„¦=Pw¹e>‘tÓÆíævÿòlÆå¯¿¢á;0Päõ5ýìΫ•Qv)«ùÃg×ÖøÑÃ8«òÒKÿzÛ«Ê]ë;WRm‰ƒz`ø‹ è1Oy‹‘ÏH×8ħg¤—KÆô ÇíˆßÔjG;ðn¾5Rý¼t)غ›RhÑ]™Ç¶ëŽ¥N;š¾©nLV…ñÛ2&Ûqަ7yÌ$óP^Ô$Óƒ†ÕÒjãêôÕ«åÕn×éóÆ{BùkãÖÆëh&Ïr>*¸ œag®>«b,zi^_œÀo˜üCãê°gUÅÛ*¿W>¹qºïýÈš¿âèý8ëÂð+ŸO--IÏŽ3MÚ±å…w³³±«¬|úÔì¼xSÞÝ7<óJåV5pëp+•xR-;Ì»¥ Ê•`2p%ÍŒ-HçDq4—¥{7±¼8ýÅdLrµ$[ݶÙ¶–ÂòÊæß4û±?ßpeýþªÒå_®|«|lêÄÉO-=è½7¹ø³'{·OQÞÍÈøüë1׺¦+p²ÇÉ€ü: ýÄ“Àܹø$°÷r! Y¬Æ°ÃÖBÅodM"zG…Å}Ê—8Eù§á–Ü¿¨vÅÂ|qñ”ºíKúê5]gÁntÈëIãé¦ ¡[0å"uŸÎ)ñ 2±Ëæ$.g®¡hìn¨Â)Í.Øek”«ùŒ«ùphû³T¥Ñ•.À¥%ÑBm´H%/­¹RéS^õY[Ùò >øâ®;ïš²ÿž'7õ/}¹£tíÇÝCÿ 9É{Ãß*æäàü©e›Ú—/ÿ¶ÇW½¤ðœ,ËÜñåwPY TNÀ¢góÖŒt}Éã â¯Kêµ#|ß›ãG`L±dd¦KÌ0Æ0¬™”s_ÿîüîà°ÓàrS™¡L*3–™ÊÌe–²´²ô²Œ2¹Ì]e¨’ªŒU¦*s•¥*­*½*£J®r/ׯ0¬VW˜V˜WXV¤­H_‘±B^áî4tJÆNS§¹ÓÒîlëLíLëLïÌè”;Ýý†~©ßØoê7÷[úSûÓúÓû3úå~÷E2`k~ Ná¢nÆpÒÈï`8¡ö’5ïo½o^hïïžV¶+Çw(^ñ5gÖ_ýÀ‚÷<úàIýÃÂ娅¥+–””¥L(þõ®(ïLŸ†+UwÔ—^,O(8rû'Ø•¹À°zzÏ!3ºÏ3›‰ÚÎ Ï J1ž–b|9"F]¯€IÁ(APÅÄ 8Þd?u”¾åPcû ¨@ç ,Ê?רM£oaºiCÕÍ'3ÐBÄ¥# L2°-Ê’EíÇIª‡>Ç{BøWOŸœvrš²sú·‚¿yhyôl­ò Ø» /ˆîVn`11Ýꙟš’L\Ö„Ä„$kbb‚Þa2ê&“Q‚†Áa4Ë] ’õÄ^S]¢”˜êJb "2˜œ‰fq$Ú ÷ÍPôÅšÖÇfõ&¢½j?÷½|î{¡Ó,§¿4v{óûÞ |¿ë­KêÏûZˆ&ô£ï…¶­ sí÷äŽ2­®x­ºZ/1˜ÿ1ÅÕÉÑ0N˜:&LÒE…·™ÛÌqs…eB jÁ«ÅëÉõ¢n´Û‚ìÀpûP—r Hï+b9³ÒR‚Ÿå>ä>@%z$®­á9„éËè×Xâ 6B£N.R6t#÷ÓùáG€þU@¿ {ª  DÒó:¨“xU½ÀCj|!Tþ<¦z jàõjŸ‘ žÇë%µNªöz“`4šl¯ÙŽžãËô1~LΕ±ÍZŸT™‹ÀFYT#«!ÇrH¾X`˜B摆Íd»Á$é$}"/Ä‹P~ðÄ|]þãt4ÌC•x?Wœg˜'Í3¶ Íú6CPÚÎo–’µÈ‡Ýp&Àã•?áÈœ…¯Q8|¡rã!å9ew1—¥<Ž«‡>z7){5[Ñ}DðoœÁÞ¿¸ôî$!>!>Q Óa·`ÖÇ›x FÁ*%ä 1GÊÎb[n'ÎÒÌ”:¶Óý⢋N©Õ`höÄ|ÿs«fr6Ûεq6bãm‚M´¬l›d3ÚL6³Íb³Úl6{ÑD{#yßFZ:}ôÕíy^ã |Ý[=»~n0\£Ü¹†$Ϝ޺ŒöΰÕtIióiÚ[ÝúçZ#ÈÖ®nM_4…±õ'Y¥žïz››¿pQÂ…3»“½æ½ÂÛGe‘ïˆ&iè6O™•OCi 8­œOÖÙVÙãÒ“úþ¸°™[‹êÌÞô4;(p¢“0œ!)lé´’:}—¥¥ùô—rÊÆ¶1csÌ®ïø$+%Yéph˜#ž·­(kðjòëÒ¡µ ¯˜ü1æ”åá‘¡7;ö>wëOê_ˆ@¨úø¯&ó›O+ï(?›RŒ‹æÏyàZïšúõÍð°ám¬²’Ð^O…äÐKP]¢€¢/ºõV°eÉjx»x‚é}¹Ä£^=_'r4¸‚ËÃÈ`‰FÔx©R‰¬1F<ÒCõDOõ$Ý"eHR‘4SÚ.ý½ ×K†C¾t­^diõÚô ä‹¡GnWzI5~ ë•ÛÞ±Û”/ék`.ƒ›ûÖÞ€6z.‹~Ôn\ƒzjóÔzº#Têè~œŽn„Ñ,Àh‚¨¤F7äNŸ>fÈà—ÊÆù¥‘ëqú£I$A‡ :ö╾FÃìÝý£xÙqÜiC­òÐË4¯9ó /A^#ù†â¼WùŠ<': Û—=VÔ¡k· =æuz£‡ þì±2{»`;;0»s¹i`bn޳Ç9¸•Êû5‹Œpæ'OW¾:€gîŸE8_yeè>å]ÊIê±+_qŸ0øé‹®µ[tz„y›Þà=qÌ>=ÁoãˆÛá°Oå ÈYT=¤(ï~òïÓEÇýÊóû”?ýRyO缸xΧßq (̾€h0õxÜÎdZen´¡p‚Nµ…sü©Þ<§˜M§‹83bjè™üñ ÍJ˜YÐ fytGHõÜ./¢Û³^ƒWò½ ÞDo’×åMö¦˜Æl[kÕšöÙ5™Ñ׃ÜÇ=·­X²fggŸ¾lÿ¥GþÝUó@ãSŸ*w*§†•¿ý¤{ž÷ÚªÃ܇ÏÞ¾¼ù雽-ÜëÊ@aáËO”LyçAe@¹$© ‡¯Ý~«L9:cxég_1Lò89º¹H9‡êh* ~ÍuÌv”‘xú˜º{­¯J fØñ·³ýM8ùÏN °p3Û«-ñ$²l´”påxšBA:AÓ‡cªž÷’»uÌ6&ð-Ï>¯l" C 'ß=#òG6$̺Õ©Mèž¹Ô¾%%F€/$fJVÌ zVep-iöU}çŒQO_çëÕO:dŽf2` c*ý8kˆVúã#QÚ¥AÌf ÍÈ ÐyD° U‘#”aVKŠ˜£Ï1Îæ‹s—™Zø6Ó:Ñ÷mѼ†¥6{ãp-NÍÇK°WAÊÕ9Ÿß yŽB¸!Ñ™}„; E5AÁßϾmÍBE(âÉN2]Fb8õe‡þtï䤉)&2Ái58R&:ã‰ÓêžL?_ ZkûÂ>²›1pÊFwp˜ÒÆîŽi™[Ì«†ÉL›'áyõÍÑv(yµÂT7¦M;†;Ô{OKCßÝ­ÊáŽv¼ç`þ‰ƒë#Ê]ÊKÿ©|þWÒ²ayü¸»ïÔùîé­kÚ4ñÖÀ«;´ï–W&ííÿwåô‹‡îý.©¯iN}_SeXm=Xm)Xm XífO†.UB«p#Ÿ–ø°KÊ Ûü.ož.'ÃéÌqšU›µk„£„Z¬ñ|Ë$~¾=]gÈ2…Ì!KÈÊå„rC ¥j\ÓÞU‚ÝG¿DÌÌÅ1ß%ÔO»ŒZnÒ¢ûŸüqê0NüÉšuÊ3¯]ñ8§ï¹í²K×ÜÑàÆq T»Åqا| |ûªró6°[îógw^Þtä&oKôKŒù  ‰(eB-N7…'€\`p&ÅÇ;ÝØÞ‹}I–SLß)–Ž|U'Òÿè·¢#žqþE}y©“âìŽ%õ5k'¤OqØµä®æ€ò}­œéljÅ©‡ÿuŸ¬\>ó¾®å»¦u—_^q iÅži¡vî‹—”ën¹íœ€…c¸ÿ¦»”O´úêÔWzÎS¡ç z¾\„(M¨»€ˆf€‚R/èôPÎsФ_ Iåz°b²µD˜ÀAŸÈ#Y2Ù&‰¯N%ž®ÇlDãµU¡Ís‘‰³+Ýy‚ü]0äë*¹K¹ÒÌõqÝÜZa½x'÷3ÎaäLú ô•\ç‡î^!¬¿ºìí%˘i\ìÄm÷ãð¡^ü¶ÒªÜ±Š~¢tö |çÐàÐü‘’F=íñ‡À‡Ð:O)¥/¤þQDëIP0Я-(aQÉAÎñ’ª²ïM ÄTØUQK>—K¡UŸ¬/2òÌ×èhRŠÝ7§ ÍåfO9›XÄ=;t’÷íFƒ\‹šyð4óP•'…sH _¶ åêf5‡ ½\âè.Ä©ñŸléxšh E³g¾kx˧ÚþÙmçtýæÁWž½ÂzÑ×(CϾÒ?rÄöYô‹ýáÊ\Ýìm´^û÷ lž®“2vôÃþqú—ó¯£aj à¸ãM½ŽG†„N¸F3Åè@xpƒ¨@tÁõ94ŠÎ,á<ÿ- oÁܯ ï0Ú}ùìù&èßpû`Ît7ôÏïGü (ŽUÃz6¡5Á /  aǰ"æ£Ý7°ÌJ¡Ö†ëR‹J„üáGôËà~J§ o 8‘ƒh/98|úZ¸ápݧó£Ãp¿zø-jÑLþàð‚‹J e¢>tßàµøÐã¹³$—ì$¿æ7ðß‹„×ÄRñ_u«u?×ýCß©TưÖð¢´R:`t/3¾bº‚×Kª¥ÙòWk£õëû¶öÙöß8 ×:~å8å¼ÂyµópÜŒ¸ßÄ{âïLˆK&ìÓ8^á€0~slcQ>Yh‡;ú4[FäR>"#Œœp‡µY&´Hk$£åZìõkmÆÜ¥µE¨pÐÚ:Xû·Z[,è+­mDI8º–ÙàÄIóP´£ˆT µ1Ê•îÕÚJ’^ÔÚy¤÷µ6<Æ4­- $c£ÖQ¹±Wkë×ø˜ÖÖ£T“Uk!ùˆ®eväš f‡ºû{‚­m9¯9_.ž<¹Dnê—g#áHOÀ×Y(Wu5O’+::äZ:*,מµÿ¤‘1ò²@O®óu…g…:üò⦎àšÞÀyËÿ•絎€/§Lš2yd,JGN¤#Ï(–}r¤ÇçtúzÚåPËxbFÇÓ»¶H¤»¼¨¨¯¯oRSôÁ¤æPçâ‹Y:cÌÒ%³d––z:ƒáp0ÔEÇ·z°^k¯+ðÊ-=ØÜæëi Ê‘ìëê—»=a˜jŠø‚]Á®VX§§##m¹%ÔˆùšžnNDÚzG°9мÍËœKGdæ0¿ì ‡CÍA¬'ûCͽ®ˆ/Bñi vÂr…È&Èu¡–HŸ¯'™Ï0é t÷„ü½ÍÆÒ‚M½‘ÃaÌ„B9ØÕÜÑ맘ô#m¡Þ ÓÔ¢ã{TnØÞ0Œ§äÊFuw/ˆ<ÜV³F!]³(Ô#‡ T5òÇ-M‘°Ý”Ñul¡¾¶P繨Zz{º`Á›èÉáP¡îmZhŽÐ•Ç¡>JPs¨Ë¤t„Ë©@ëᡯ)´6ÀhPu‰¡0¢]¡"¬öR¹tê€úL·ù€¬¦€Æ7@$Ø%ûÆPêÍè‘;C=ó.Gú»->XhR­±Ï;}ýt…Î?Ø¤Êæëˆ€úAÀúü~F½Ê>X¼ÛטõvøzØRþ@8ØÚÅiíèïn ÓITK}Í$LgD1 _IÕ:¿Ê4_Çùhs¢xŒBôº:úåàUrzô_$²±´¦¬¤²‰šHô. "ßêñ‡åÌk̤kGÈ™Ôx35¦tª5«i €=Q¸½ JÂÚPpµÀºØìëî#ó5uè•z€=N0m¾ˆÜæ Ä@×X®Àr£:î—{»üÊ™c}K¦Jã÷K6LÝ*,CEGå“;¨›‰ìö5·ûZ4°Ç®Ðˆùñª5f)p\€d £EEk~¥VûTÊ»Ù**ÏzŠÍ‹RågØR™uÅp¤ÆQŠÚ´¾ž_êcZ¤êptñ< ÿ M±¾Î?FÓ|LN?ƒ±ëŒçÇùp+ÔdÞÁæ¿Ç«÷h(Àðê7ÚÑʨ݌"Í߯p¾Qågó3Ï3Gè?ƒŽFÞÌqš¦ÚNõ¸XÓÄl?ƒo¯fQ)¬…§Áóp-€Ö1^wiÝ ‡É|Ì»FfÄÊ^Åûû-¦y{™]ÃŽ¦Mß­+*uçóãôi/5–Ëçã¬ýX9þ¿Ølx$ûôiÞKµº¨EÑL¢c$éÑfŒ…ØÍ4»έšÔÔøØÅø;>ùŸðZßMU“f+->¶ŒáÖ|TÉÖZŒjàŽ®µîêÑeaÖ²gUÐ'CnW O–ÁÝèÃäSÁžÐç™Ì2/ƒ6…¸-e°Tµp¦°—#™Á–Ù=½[ãk[‰Ø•­Ž¬e°Ao5\+µqtÆlèY ÷´=ÑìT]¯fÕ3¢ó(.*¦õÐ?ºêX¬ªØŠQÌÁ]-ÀŸ¯=­ØU Å¿qжkFðœ«aZÁxD!S˜³£jvG{—Âu Œ«cü¬`4«ØÖ0æÂs•–J†* £Ùp]kÓó¯z†]©^YÈ(¤ôÌaóéª Y¯ŠÙbMÊ´= e’ÆKÊÿe#+×1ú«áýõÐSÏdSð£p£º3AX4¢GK}Œ‹Ù ³Ø3ÊEÊÏê‘‘µ1R™ÍøEåF1ŸÃVª`©;/%Qhc¥s>툮0ÑWÉ8UÍF×+a|ÕHªUŒÖÙoU˜ªÞ«:QÃÝÙŒF*ÙKaÕJM§*ïÆR¡ZÅ” UÚyv ÏF¥_£Iwöˆ¬3-;—+—1[¬d£*˜¬ëF¸0—Ùï" ó¥1•ãRM?`6–¿Q;ŠŽû1¾C…]{¬ç0}ªÖ0¬áÆÃõ_•ãšYýñßc#yl&9𡯿¢…1>763P½ñ<6¶sܸÑ^ÕO«ñk´ŠÍå¾oO@ÍñG3áh6¢úpµVŠÍ„ý,gWsÂðH–¢Æ‘ÐH¦ÒÇžŽÆwµ:ìd#bë¿0[W¥¬W›1–šgúXæ@W Ÿ‡›ß©ÆWŒÝ,ö««ô±vDËR(}½ÚXÚ¿~\•Ü3®Êú!Diù!þ÷0ywk5Vq˜æ—“4¸=(Z¯ò„r …=ë'õQí£ÐÊÑø¼”ò 5s¿&ñË/&Ñ÷åhøkø¥±ÿ3à9Oq›=ÃVÈûvò^y÷rá]…¼SNÞö“{†üI!L'']ä„BÞRÈ¿*äM…üA!oüÞ"¼¡ß[È«¯l^UÈ+Éñ—oŽ+äøQþå—– /ßD^ÞÌ¿ô»\á¥åä%ÿ»\ò¢BŽ ’òÛAò¼‰<¿™?ªß ’ç6’__BžUÈ‘§ …# yº<¥'5Oxr#ùÕ<òÄ y\!¿TÈa…üârH!¥“GòóG$áç yD"xø‡’„‡‹ÉCyp\ž TÈÏÉAòÜ< ûò/ Ù?HîÛ—$Üç'û’Ƚmé½~²×3|OްwÜ“Cî†Áw’Ÿî‰~š@öÜeöÄ‘»ld÷Fa·Lî4’]wä»É0ðŽrûÎ8áö\²ó6‡°3ŽÜæ ; G¹5Žl¿åa»Bn¹¹Q¸årËfþæ›r„›ÉÍþ¦r£Bnð“ëlÂõ ¹.•l»¶\Ø6H®¤×–“k®N®)&Woµ W'“­WY…­vrÕ“p••l1‘ͰÈf…lRÈ•ñd£ƒüD!²^!ý‰d‹ô%µgí é…Kï ‰ÀøH Ã%¼‘ô(dM.éVHH!] 锈g¸C!í«-B»BV[ÈjÖIÌhK'­pi$-+MBK* (ÄßüŒàWHsS£Ðü iÞÌ7]–#45’&ïSˆ÷ŠI‚W!WL"«`âªtÒe²ÒD.‡ŽË’pY¡å@þòÒ`#—åe Yªz…Ô)¤V!—*dÉâaÉ.²8‡ÔØÈ"…T+d¡B ’ªA2ß@æ{ø¹•„¹ ©<@æÌNæ ’Ù)d¶‡Ÿå'³<|ÅFâQÈÌK …K ÉŃä"…ÌPH¹Bʦš„²br¡BJ‹Éôi’0Ý3¬i™æá§–HÂT)‘H±B¦ðvaÊF2¹(E˜ì'EpW”B&)dâ ),p … Iô¸Èp¹`!ÉϳùI$o‚$äYȉäÚHN¶EÈ)&Ù’•i²âH¦¸­9‚{ÈXäb’‘D2<|zš$¤[IšDR $Õç8Ê…”]$†&û‰K!I~’¨„xgâí$ÎBœ0ƹ‹8`Œ£œØb> endobj 150 0 obj <> stream xœ]“ÍŽ›0F÷<…—ÓÅlž‘"¤ ™HYôGÍô8)RÈ!‹¼}ýÝÏm¥.‚Ží{íãß¼=ìÓ¸æßÂÜýªÎã4›ï¡÷êä/ã”i£†±_ÓH¾ýµ[²<æ·Õ_ÓyÞl²ü{\»­á¡ž¶Ã|òŸ²ük|§‹zúÑãøx_–_þê§UYÓ¨ÁŸã>Ÿ»åKwõ¹d=†¸<®ç˜ò/àã±xed¬©Òσ¿-]ïC7]|¶)ŠFmöû&óÓðßZå˜r:÷?»Cu - «›ÈFؼƒ-¹—Âå\ ;™¯…ë ìÈ’ûÂøð«p%ñ[ο‚ßÈÜ2·ïÈâóN.Á{ÆÛȺ æ5ýöÑôwðÑô¯˜þ5ÎÕô¯qük0ýKaúWÂô¯eÿä/çÒ߉Oò¦¿•xúWO‹CÿJ8Õ1†þr ýË8Õ÷2©þ¸‹Iþ¨³¡¿ƒ³¡¿‘\ú;‰¡-óô·²'ýKÔÜпÄÿhèo$—þçZú[œeéoPOK‹š[ú;aú[ìcéoeú[¼ ›ÞϘþn ¦ÙÊcN¯Ï}÷§]T!¶Š4§ôºcœüßþ]æYòû Éið} endstream endobj 151 0 obj <> endobj 152 0 obj <> stream xœÝ| xUÖè½u«ª»«÷$ÝÙÓ•„B”Ù!$1 šNÒY0IÇtLjˆÀ8î2ê¯ àÂ"ƒˆˆE@E£âŽ ã6èˆËhDãhHŠwî­êl2êÿÞû¿÷}?eWßåÜsÏ~νÏ`{‡™ÐjD§¶ÅÛ6Æ |z!V{ePþtÒþAûc„¸Šú¶†×Ìöƒñ“涆æåõEw/†þa„d®Ñç­krl•Õ óSa DiÕA¿ú£[‚W¥Å,ÿ!7À ýÍþZïÁ]k…þ_¡i‹÷ª¶pý4¡”iЗ[½-¾gÑïwÊB„\\›?ä°|¡ü%t¾­Ý×¶xsM/ô¯AH÷Œaxè?4EÚç/ˆ:½A2šÌ«ÍápFFEÇÄÆÅ'¸äĤäQî”ÑcRÇŽKþþÃõx®G‡Ð? }Ú†z‰ qðÔÃ(ýÞ«PÌ×äþz\ß-üvÄÁü*þ @ÁáI¨]-7¿BÐg°z ^+ —Ph¶Åõƒð"þNÈæ²ÑB¾…¿€ß˯á÷D_ϯA]ðÎæÞâïãWðGùh!¥ —Ð¥mÂsp2ÚÄmÂy8çqo çý³ð&ÁœpBŒÐ%òõܨ_Çíà~Äɘƒ' »@š—’7øjþeþf˜é€ÉM".2ÞK(„po*>ëñr€£Ï ا‡{‘Û<>‹>¾`wn ·‚Û„>Â{ð ¡ëñ¾ZWÃÇ¢Mâ&~!:MeƒÞâÞy”3yÜŠn'¢x}GJp5¿“J ¹…çÁ usÄ0´ÏÑ]œ 2­@0û*FÂóêPz1­çG“€vŽ[’^ŽÞà²I º=wáýè.´Cñ¤(ð„Ã(M¶uqîâº.ÏE åW%ŽOÑ•m:¹ •w™—ËûÏ+_ÈÇ ‹º„¸.âÖwñîäOþÝä'ãÓæ–/”÷ã1ùyÚüê<¬\MÚƒaÏÏO-YYÏ× Û!‚éëâq Ð(â”'±^¸™ãÑ„îã=‘íxÏñžŒp{¢ÝhO¬çQ_€Äö}¦¬×Y~ü¾]L¥±CBHX6¡Cz,"w­åñ4âDÓ=,ï,Îôdfà¹]RÕÜ.KÕâ…Ï ý¹Ã°Rgš}ê´E{=¼4¶ $T+ve•bN(-å÷R?YxîSþ%° ¹Ñýž±E»Œè/‘GÅÍ–cvùu×kq›“Ø7˜Pr$‰2ÌÆ \Ä1#ÅÖ×Ó ûgÚ³³³”SgúÎôØ>?ýÃéì°l{Xv†§dÂè ä gž'ÏK\*/Ml•[¯•¯Ml}›|[âýòý‰Ê&>#?“èÈLÈpå&x\• å®Ú„j×õ «]w%ÜáÚ–°Åµ7¡Ëe[Š—â$Ñ᜔9åì¶'fYprRJÖäQ‰“²&§$'‰:û…x’ÌsÛÚ®X|‘ïܤÜS´oÍž÷°'½}Þø2NiÆ?–ÌÉ›wgKêýkvÔ/}mÛKûãæ—¥§c{\ü·Ô÷Ï}*\*F #ŠCÓ<±âVÓ1+ÚêØ`=û`Ô±h2;Ìe2˜clñ ‚ÌÌ3T§zN1î3ö•%T'px©;sŠJL€°Ld·! x´AP`ùò@`ÅŠsöuÅ’òÃÑŽ}s”M¸þ‹[¶ì|x󿇹5K•§”~xžZZ³ ȽA“ „§Ðƒ6#oc†Ð“á1” ÕB›°ZàUïÆõÊ&1â§MË‚ÄSŸ‹E¹žDäø+6¼®?.l6áw£6‡1mˆ‹upz‡åqfëŒ8Àz¦§Ô¦ œ²)gNÛNggì›?+ØÃŽÄ`jÊT;¨A¦¼%ÊHPõ H}Í÷ÝvÅ7+W±SÃsqÖã ”;:«gã&Õ_{mnžÒ“1gáHˆJÓ•îª_ÙÑ¢t4PjD‘h¼'\܆¶šŽ„mˆ2̶–ÙŽQ@å™Òe;ñäÔðYÑ…ádˆ}€àIˆ&xsÏw®\ÙÙqÍ58ç+•“Êß”§q!YñÈÖ­ÐFÊ+J<¯ài8žiTÚ£!N­i‡£jOœMÀ&ýVoFZÄ'$.\‡tÁlη#lÎìé›Ùݦ:BfЕ êšæ׌`®êšƒMgÓ¯Ö­Öó N\ܱòóe— ¼ÙÓófàØåS§á­Øùpë´©ÊkÅyÊ_~¡ü˜W¬Z©ŒDYž(3¤7郰cŽ#¶',˜3£B»ÙlµQ%ªž3óÔ™S=4†d쫎^Mm œÛ>9e4¥DtP‘8¨9…0eƒÙæ(Jo[M]å¢'[_x•ÛÕ¿Àï½³5&yô£ûßã«·×,=Mµ ÚÛ.<Ú»ÊcôV²ÕŽŸÐoE’Þhà <2ÛÂ,U6PÜ îº{ÎÌ졪Πª³U-žÛe§¯°ó+1jšN« bµYíå\9)wTsÕİQFà‰p΀„*ªX;7 _¡Ü~á’ýÊÇß»Wx@yáRÜ¥SÏ¡Çã ^H©_Q¹d8}èñ˜MœÅ8%Á•ÀjG—¦¸\ nɘàâèu|œxÝq^§ùxAHû¯€ïÊõ}?)×spÉÊ>\Ò²ÿy\£<²ù4ȃµJhŒÇAöðÜa­í1è£Ä‚¢l…ôt«ö á”–”‰vÕ”öÄïp•ò ^Œ[qÕÙ,‘—аXt6KùAѤ⋪§Ýæ€ÈaãÝ–#†'t’hFz[džLVØêë¶³ŒŠ ¯Í…!àCaç3Íá‘¡:’ôLX:á–u4Nç?±2lì2Áéxüý}|õþV¨/nÏÁ>iöе‚å™>ˆ8¹Á†Ÿ9n5Û !_ØbT¿aµ$×Ál»šf/¨¡°œ‘jØð¤”-¸‘³Ø…/h)tÑŸZ^x ïãv·-V¾I¿±369e÷F.õì–mZÆ •pÈ$MõݸjyÝ|\Újç·FB\ÑÍ6£ˆóéE3ö]»*–¹q(œ / €eßU¶þ¡‡ÖWÝã©zôbå-e^€',|âÖ‡™Ýÿc™•\.<;à™êBìª÷t(Ρ'ø9CRµé!s1ý€phñg¨6´VøÁrŸ€ôÃWŸÝ"F(oÆl|`´?…v©…Ä?ºî-jðuÊJ€Ý†ª‹(´Þ“ŠâyÄΨxAàÝB²Üa5î»GqQYôN޵hÛ‡Ý}Ç©ŠìÙVIêÐ4£3µ¥hfKÑ(Z³%O 9Ö96’d‰¢"##£’PRdRTÊŠÌŠšæ‘QVš=(›øB<¬þwDˆ:®”»óì‹\bqÁÚŽKÞ¹úwÊÕØ„S¯=‚c•Ïp,þdöµyM«ç•à¢qã{Þ¾úíÇÁhfn_ÓƒOȨÜãCO[ŸŸŽYkx:JD:–`²¢byq&˜œ›ÎMiCrÀ–ZUe«9Ó J²%MH*O¥`ÐÇa{x¨0$¼TýŒh¶øÒKŸø{°#Øñw®èš›”•wú×p³Á""ëÉ]å¥ó.Rºû5µ^¯²œ‹õÂÚ¿N:Ú²QÍkºl Þ„ÞôL"Stz7szúE8HâxŠ$Ü’Ž#HOÐóFÁ ‡3³ ‰yi"‚ª±OeB ì4ÄŸ/´Ce`%´2¨7pV½Õàâ:—ÞepHã¸Y\WÆ•èJ¤‹¹EºER#ç×ù¥uÜú; s]º.)†Ç_,NMl–±ØM¦ã,R†=¤P¿@¿ÈPniÄ Ä§_f¨¶\¯¿Åp> tN#&Us2¦y÷+\~óåneçe§r—p¢ïâêÇçõ}@Ügiz§²³™&#QºÇÖâÃN=ç”0Þ–Žœ¢ž!ìj=ÄžðDŠ7Hêc÷ü»•Â¥PµÑó× Oüàùëˆeþy"Î^v r_g;ujäÌ=P½j7uáC®“¸0ZI ¹¬ÛX±"ǰmýûDiû«:2•ÞÞi'°h¥@ƒØaÅ9ž\k<²B¤0™‰…ÖP„TpÔâúE8+@AȰº-g´Yÿ>AOج£A/@Ð0@ͧ¥TÁ v0½8 ÊÒFŒ!‡.‹6x´ˆ±þVbƒGæ<\9çã‚Ü Üjînîn ·c‘ƒƒ¨ÁçŽq5¸(ˆ @Ó z'vÑ¡%ŒGéhœ˜F¦ˆStÙ–lk>ÊÇsÈ>_È8Ÿx)B¼É|“ån½°^ÜhÞhÙÉí"»ø‡-[ÿ„‘ý|—¡KzÎø´ùiË+Ükæ×,¯Zßá>ã²C…¶àq8 t2 Gãz<#¨oS Ÿ¹÷hÛâÊH8ìöë¹ÏN9¸îëés]Ôão†šþ4xüT⇻à ë¥ÇÍ»Ey½ëñ¸Ýá]É÷‰RáÑp~v¦ØœÄá’ ©¶¾SÝÔ¸C5ž‚´k“Ópr\V85INΚ:´ëìS¦¨¥(9pÏýÊnå@à‹+šO4l|ð¡7m»ó·\»ôÙKÛ?n†¢&ñâýüº¿}ávãÔ)S—ÕÖ7ý¸xé‚KǦâY~îðu©¿°JBD<£‡âD$RÃÝÔ=éaê:éBåøåùK9Í6ìÌ,tÌ,tðhf‘†˜ItqåNÂ)9ì)Lj‡øuF½6ðsÁþÛ¸“ÊG(tÿ/FüìþÿÁóßÿ÷üúý¿ýWîÿ7Þºÿ#úwÒëœÁ*ƈ.ô„s‡õÏòh­$‚• zëkR ™ÌºfÒ+‡•Xy«`­:«¾Ü\mn3o6Kƒ×)võâ—›F/û_¡Àý/sÙpFYÞ#µûúsŸŠõkè/W™žpqOÚcºþr5Þ:•ŒwŒñ˕Lj¢#ÃmÑ¢gE ôç+õg—°,8L ùùŠÔw½ðB×ã/¼ð8nÄ”Feƒ²QiÀù÷”¾ž¯•>Ì݃y©Ô)ë”õJ¾/×ãûTðŸ0d@ tX|–þˆ¬?,aÁ‚ ¡»;tg‘ñ¤Í\|“\óÖþv®¡#·ýìô·cå+øìRµMo™£¡ÆÑ—#s–›Nþ×sSØùsÓ5ƒ%K- ¸z(Xh¹Ò5¤\9¦•+sßÁ- ›‰Ä;P8Ž#1| …Ç‘T~ šŒ³I6Ÿ¡/@¸˜óÕú«D8¤…›Äõh=ÞH6òë„MâNÇ2j0×¹ ‰ÄNÜ *pÜè%âÙ-ô\X]ŠŠx1ï2ëÌ"—žýIʧ_· þ%ŒR Û>B«Ç¡?ŽhÒ¢Äýs™>“οê…$ õh¡píæžE»…´{´° -$+Ðhá$ÀìE»ÉÛ(–-ãzÑ!€]"¤"—p'ú‚|kö¢-ü³°Ö ½ãÛÄhtH÷:$n‡ÏDØã#èס"áEt—¸—áØ-LEÑ{3›§8ïdŸÄTtH¿í"ÈO÷¦ð"¥µÖM¥61r!úÎ+sñx>ã¦pk¸n’LŽ’¡”H*…uÂGbŠX&úÄu3tpÒÐ?¢ÿÒð¦ä•öEã˦±¦[Mÿižh^cþÁ²Ì²ÆÒmé·X¯²aMRé("”ú×?PÞ‚½ °«‡ GgØ2 Ïé²Å(zX[Å£yZ› (t‘Öæ¡Ý¤µdBk´¶ˆœh­ÖÖ¡ ô ÖÖ# z[kaí'ZÛlG?fÌ ”LZ‚¼´ZksH/íÐÚeH{´6í¿imE-Z[DiÆ­­CÕÆ ­ ¹×¸WkŒ7µ¶9,Åøf®¿my{SCcPS›*gfdL’k–˳›‚`»ÏÛ’&·Ö¦Ë9ÍÍr… Ⱦ€¯ýJ_]úŒ¼À×î•+½­Ùþæºó Ë¿4^áköy>ybúÄŒ B!ÆŸgeS@öÊÁvo¯ÅÛ~¹ì¯Ií <í5ƒmÓ'LèììL¯ M¤×ú[~ãfé|œ›¥ÿ*IfÉ,•ûÚ[š&+…oôµû`¿†vokÐW—&×·û|tam£·½Á—&ý²·u¹ÜækÀMÐÛÔÚÔÚûÔá2Øè“ëý­@˜·øip lìÍMµ¾V꘤ ‘” Èêdo à¯mòÂ~r¿¶£Å×ô)=õM;€<†bd äJ}°ÓÛîKJe”´ûÚÚýuµ>†¦® Xkªéú äÉM­µÍu”’Φ`£¿#Ä´4iQøvUš€¶#ð”4¹ÅǸnë¨in 4¦ Ù#î9Áß.|  €nR5öGlM‰´mTÐAMtl£ÎFËÏP5Ôw´·Â†>¶°Î/üir £f™¯6HGT77û;)CµþÖº&ÊG`:UhLzküWúª-1 ¡ÕEÔQª—¶APçä@£تñirBšZeï0Ný­`ír‹¿Ýw^Æåàò6_½6J‘5|¾Å»œîÐâ¯kªo¢Ææm‚ùAÐzëê÷ªø`ó6o;PÖÑìmg[ÕùM ­Œ†æåmºˆZ©·èŠE‘;©VW§ ÍÛ|~ÚšƒØ€¼ÖæårÓ0SvÚ}ôÏo,m¨(©nB.â»ó©ÄwúÛërÒ€7&ѽCruÞ$Mh Íkj|àOoè²p¥¿i€4ßUAðÙÛÖNæ­iöÑ •{À=B1Þ Üè F_ëp©Àvƒ6^'w´Öi$' -I*¿¬ÙDIðn¦:ª(¯ÜL£øL°Í[{¹·XlõÄßnZö‚ÀDúšëU²Šò傲Ò*¹²¬ ê✊|¹¸R.¯([Pœ—Ÿ''åTB?)M¾¸¸ª¨l~• 9¥U‹ä²9§t‘<·¸4/MÎ_X^‘_Y)—UÈÅóÊKŠóa¬¸4·d~^qi¡<Ö•–UÉ%ÅóŠ«iU[ª¡*ί¤ÈæåWäA7gvqIqÕ¢4¹ ¸ª”â,¤9ryNEUqîü’œ ¹|~EyYe>àÈ´¥Å¥°Kþ¼|`å–•/ª(.,ªJƒEU0˜&WUääåÏË©˜›F),–+d’T9]\Y”SR"Ï.®ª¬ªÈÏ™Ga©t KËæQÍ/ÍË©*.+•gç+9³KòUÚ€•Ü’œâyir^μœÂüÊÁM(˜ÆÎ 8è‚ÂüÒüŠœ’4¹²aåq>È“*¯T£—ꈎýÜ:Š®ÖÌËÏ)„•”ŒŸÁ2ûÊ¿ªÖפö­9¹$Y@U£h³\5€¶‚ûªc¬ 6 þÅ2å†WiZ¦a,²’„ë®ôA$ Ð>â§A¥³)ÀüÒa‹_Ëo3l«  fz›aY`€ÌáNJŒmíM°¤³½)!EövÀh{ÓÕZJn×RÖHè.#éo÷Ú c5]ék^ž°í4¯1JšZëýí-ëL|µÁé¡X”ò:`ÜßÞŽr‘µ¡å¨jÜÔˆ‚HFcP-ÔÒ2Ê„ª6M‚V @Èh6ÀQ>íȇ¼¨¥Áh1jøthå fxdT1€+Àz>øöÁš+á]?Ç#£  ­Jx·Âìl ¬à´ü Oékf”JM 'ß?ÇÂÂ1þ7îÙÄö£­ ©ƒ™ønG—ØÕÿªlχ?4÷ÿNƒf$ýfRØÿn®éôSÎp¶0Œxûa>„¿‘Íù4þØN­€RIqÕ³YßÀ޵°‚ÒÐciŒ6?£²•­ocØÚ~À„¹&èÑOƒÆO­&ñÎ £‚îåg{«|×2¸€T±‡0Ph•öfø®…•­šåAI¨`GÓ ][ǾŒ®ZXãÕø“áCG:`[EgBò©‡V3ÓÅ¢qpê ”þ êdñ±eBGÚàí‡]:ƒÔÔ1‚Ìæj`6ÈfC{üûÒ˜Þ¨v›aUÝ€L:™4t[G%ÓÂÆ†rÂß>Ì6Uj;˜ Ó†h‡¶[˜>Cºn¨†;«Óþ i|NLíÐ °Ñ<€»I“êpíÿ2×!ɩԶ Xtp„Õ rÔÉäÑò›vyC=ðÐά5ÀÖ îXÇÞt4öM%± j>f¨S~ýL/ª†jÙÞuŒâ&ÒéZ¥­ôV?‹ƒz—¥ðóˆÐ ðAÍ#Ã`Cþ2(µ¡q`è:™ñíÕ´U£IfÐÞT‰4±uÞ_Ð)ŬƌvfE~MÊ¿Uãf9£·žEŠ;ýgÒú¥õT.Ëxha^ØÄ|:Ù(ýA-ú©#*µT®uCt?ÔúTÎÛØ.ªÌ:‹—­ qUǨ¥:k"‘€£5jcíCb©—Y‘já=FÊ(ð«< uuÃ,ÍËôôÛ)¾ÏHyœ¶4MçÍl]Ó/Dõv-ù]-Ãð†FVò›‘YħÅ;ß0Éw2®êØú¤ó䯤¾G® ð¡Ì›4ÂÒTß)‘kj˜ïû‡ÐÛ¡ùCH WÂlÓy¤æCW1Y·jݚɼ,ºúV Õ½J÷/{L#‹ö2ûh4ú˜5ý{[Q¹;_§³ j¸”Ï'Yyˆô†êñÿÆgZm(kÜ„¼.äQ´’h¨EÚµÃ1¶1˾Þ šÖÔüØÊä;²ùïˆZÿž«ÍW‚Z~¬&­"”Ïö*C¥Ð£{•A¯ ] f›+†1j» ˜Y½<ÍcúÉa3t>‰yæÅЦËÐ|†KÅQoŠ{ŒPÜ2ëÓÞ\€/\tm>ZÈöÈl• ²‚ឣ%ð¯Áѹ02ú´]ˆhuªîW «ª˜Ñu”•Ò*Üu8UÅlÇeó Wø‹´ÙÀ]ÌðQúÓ˜¤h»t€ÎÒ&#Š™âÌŠJXŽÎ‡ïr€«dòÌa<«Ô–2 `^å%ŸQ jB¥(¾Ëao QtU1*èNUdãò“ÇÖÓ]ç²Q•²2MË´=ˆ%]“¥J•ÿ‚+ÿ%ðÈŒÿ*©bºÉü!¼!Û)dæ ØÑ|Æ_“CÛa6›£R¤ò,€¬¢•\&/ª7JyÛ)‡I¤ò¼œ„° ×Îù¬#´C!ã/ŸIª„AW‚ó¾x`DµÇbÆk®&[§j÷ªM” ‘n.ã‘jö"Ø5_³©&»á\¨BéäBÕ@ŽöÎ"³Aí—jÚÍÐu³²ŸKåbæ‹ù *‡éºr@ Ìçi”Ïba!=Î×ì³l€²áò ùQî·ÄWhïáÌcöT¢QX9 _Ç;¿ò!ÇÕ²óOp ~ÏäC+ÉÁ uh-š6$æ­ Ôh\È`[FÀ ŽªqZÍ_ƒg ¡µÜ/Ý ¨5þ`%ªFÔ®ž•†VÂu¬fWkÂÀ@•¢æÿ@¥ÒÉfó»z:laC϶¯ÊY‡¶b$.µÎô²Êî84)S<1¶±Ü¯îÒÉÚA­J¡üuh°tüê§äö§¬_ÓAˆ—_“;Ów›vÆjb¦õeº†·…Îkƒ2¡¨gs-#´>h}Ût4².¥2hBy¦q?«/ÒÙoÚìß¹xö–øÙ¿œßs«q RÁnd‡÷(œûxê…^2rÂ;IKbp´M°Ìæ]è ¼`_‚ãÙlІw,J€w ‰fï(öŽdo'{;p²VëÑ6Áá¬ÆÞVlA+aÞÊz´M°›Ðm0ffcftñØ„O6C0ýÿÈð؈%”ct†ÀÛct„`[©go2±7]!î½']È Ç"ãK`ožAÆÇF0{#Ϲ•äÜ…DQHßÙ4¡O!gÓH¯B~ú±Pøi%ù±ü«—ü *äŒBþ×Aò½BþS!ß)äÛrZ!ßôHÂ7 é‘H‡ÿú+Iø:“|%‘ô’/ït _*ä‹^òy/ù :Ÿ)ä”B>UÈßò‰B>VÈI…ü­—|ôa”ðQù0Š|°%Aø Ž¼ÿž[x¿—¼ç&}Ë-üµ—¼ûN„𮓼sÂ&¼ANØÈñ·Âq™¼m$ˆ¿ô’·ÿ[nrìn“p,™}3B8šBÞ|#Lx3‚¼F^‡é×ãÉkäÈ«…# yõ•¥Â«É««ùW<ç^v ¯,%¯xø—ÝäÏ y©ŽtßaºòbyA!Ï+äðsӅýä¹Gc…禓gŸ‰žÍ$ϲ ÏÄC­Â!;9xÀ$´’&ò4lö´Bö+ä)y2ŒüI!ûò„BöF’Ç£I—“<xë%{àkO/yà%»ák÷JòˆBv¥‡²S!)d‡Bþ(‘í yp›ExP!Û,d›‡ß ‚ÚÚK¶À’- d3|mî%óÄ‘ûrß½…ûr殮½ɽ«ùM·»…MKÉ&¿Q!À:6(äžt²®Oðœ#ë`é:™Üm"wÁÐ]sÉÀ×(äNÃNr‡Üî&PÈZ…ܦ[r‹BnVÈM7º…›r£›Ü ëòûLrÝzò;…¬QÈêh²J"×*d¥B®QÈŠ^ru/Y®Î+w ¹réÆ ½$K½¤}%¹B!mþ4ÁŸFZ{IK/iî%—+d™BšÒXk3IƒBê3‰¯N| ©“H‡¯­‘„Z©‘ˆ·Ú!xדjlªä2‰\ª¥ Yý% Y|I¬°X!—@ï’X²H! {ÉÅ Y}Ϲ ™¯ªRA*.Š*zÉE0qQ4)/‹Ê{IY©](‹&¥v2/”ÌJdî»07‚Ì)¶sì¤ØBŠzIaA„Pè $¿—äåZ„<+ɵÙ9nav/Éœ9nâ™e< ™u¡E˜e%ZÈ3ÍÂN2ÓLfÔ‘é ÉŽ Ó25œLÉŠ¦¸IÖä!+†dæ'Kfar™¼šŸ”i&EI>ÓD&fì&*$ðgì L$=œŒO›.Œï%i·6Œ«#cëHªBÆ8ÈèH»0:¤ÈÄ@F%ƒÆJ Év’„ÌBR/I´’D/G—DH|\´ï&qÖp!.šÄ퇘q'k&1Ñs…˜•$6žK¢i'NØÍÙK0æp“ˆ:n'a ±Cß®[±Zl‚5œX󱬿Í0cî%¦LbÖŒNb\ÍKf"yxƒBô Ñ)D$ATˆ ÁÃó½„ÔVq D/³€í™ Þë®_‹ÇýÏø‡þðßø/ýo¿‡Å endstream endobj 153 0 obj 11607 endobj 154 0 obj <> endobj 155 0 obj <> stream xœ]“Án£0†ï<…í¡Z)Bj“FÊaÛU³û&)RcCyûõ?ãÝ•z}ÆÿØfÈ×»ÍÎKþ3Lýžsýø2]CÏæÀ§Ñg–Ì0öKɽ?ws–ÇÚýí²ðyçÓj•åq›¹{¦ßgù{8Œþdî~¯÷q¼¿ÎóŸÙ/¦ÈÚÖ |Œëüèæ·î̹T=ì†8=.·‡Xò?ðë6³![Ué§/s×sèü‰³UQ´fµÝ¶ûáÛœ«´äpì?»£6F‹¢rmd®-¸T&°S^ƒ+å \ Snôùü¨\ƒŸ„] ~Öç¯àáFö]+Kf£ù'ð«æ%³ÕÌcd[—ð´êßÀÓª7›ü±¦MþXÓª?ÁÁª)µêï„ÕßmÀÉVýì«þÞÝ&ÿ¬þ•ì«þNöJþÈ“ú7ð!õ/‘'õ¯pn”ü±&© RÿïHê_Á™ÒùÙԟ„տƹQòV‡ïEêïdMõojižÔ%h#ôùßö4ý5„Øšò3HO¢GÏÿþ—yšQ%×èÔm endstream endobj 156 0 obj <> endobj 157 0 obj << /F1 126 0 R /F2 131 0 R /F3 156 0 R /F4 151 0 R /F5 136 0 R /F6 121 0 R /F7 141 0 R /F8 146 0 R >> endobj 158 0 obj <> endobj 159 0 obj <> endobj 160 0 obj <> endobj 1 0 obj <>/Contents 2 0 R>> endobj 10 0 obj <>/Contents 11 0 R>> endobj 13 0 obj <>/Contents 14 0 R>> endobj 16 0 obj <>/Contents 17 0 R>> endobj 19 0 obj <>/Contents 20 0 R>> endobj 22 0 obj <>/Contents 23 0 R>> endobj 25 0 obj <>/Contents 26 0 R>> endobj 28 0 obj <>/Contents 29 0 R>> endobj 31 0 obj <>/Contents 32 0 R>> endobj 34 0 obj <>/Contents 35 0 R>> endobj 37 0 obj <>/Contents 38 0 R>> endobj 40 0 obj <>/Contents 41 0 R>> endobj 43 0 obj <>/Contents 44 0 R>> endobj 46 0 obj <>/Contents 47 0 R>> endobj 49 0 obj <>/Contents 50 0 R>> endobj 52 0 obj <>/Contents 53 0 R>> endobj 55 0 obj <>/Contents 56 0 R>> endobj 58 0 obj <>/Contents 59 0 R>> endobj 61 0 obj <>/Contents 62 0 R>> endobj 64 0 obj <>/Contents 65 0 R>> endobj 67 0 obj <>/Contents 68 0 R>> endobj 70 0 obj <>/Contents 71 0 R>> endobj 73 0 obj <>/Contents 74 0 R>> endobj 76 0 obj <>/Contents 77 0 R>> endobj 79 0 obj <>/Contents 80 0 R>> endobj 82 0 obj <>/Contents 83 0 R>> endobj 85 0 obj <>/Contents 86 0 R>> endobj 88 0 obj <>/Contents 89 0 R>> endobj 93 0 obj <>/Contents 94 0 R>> endobj 96 0 obj <>/Contents 97 0 R>> endobj 101 0 obj <>/Contents 102 0 R>> endobj 104 0 obj <>/Contents 105 0 R>> endobj 107 0 obj <>/Contents 108 0 R>> endobj 161 0 obj <> endobj 162 0 obj < /Dest[19 0 R/XYZ 81.1 723.3 0]/Parent 161 0 R/Next 172 0 R>> endobj 163 0 obj < /Dest[19 0 R/XYZ 88.4 529.5 0]/Parent 162 0 R/Next 164 0 R>> endobj 164 0 obj < /Dest[22 0 R/XYZ 88.4 528.4 0]/Parent 162 0 R/Prev 163 0 R/Next 170 0 R>> endobj 165 0 obj < /Dest[22 0 R/XYZ 97.4 496.4 0]/Parent 164 0 R/Next 166 0 R>> endobj 166 0 obj < /Dest[22 0 R/XYZ 97.4 372.6 0]/Parent 164 0 R/Prev 165 0 R/Next 167 0 R>> endobj 167 0 obj < /Dest[22 0 R/XYZ 97.4 289.8 0]/Parent 164 0 R/Prev 166 0 R/Next 168 0 R>> endobj 168 0 obj < /Dest[25 0 R/XYZ 97.4 618 0]/Parent 164 0 R/Prev 167 0 R/Next 169 0 R>> endobj 169 0 obj < /Dest[25 0 R/XYZ 97.4 211.8 0]/Parent 164 0 R/Prev 168 0 R>> endobj 170 0 obj < /Dest[28 0 R/XYZ 88.4 606.7 0]/Parent 162 0 R/Prev 164 0 R/Next 171 0 R>> endobj 171 0 obj < /Dest[28 0 R/XYZ 88.4 487.1 0]/Parent 162 0 R/Prev 170 0 R>> endobj 172 0 obj < /Dest[31 0 R/XYZ 81.1 723.3 0]/Parent 161 0 R/Prev 162 0 R/Next 178 0 R>> endobj 173 0 obj < /Dest[31 0 R/XYZ 88.4 687.3 0]/Parent 172 0 R/Next 174 0 R>> endobj 174 0 obj < /Dest[31 0 R/XYZ 88.4 378.7 0]/Parent 172 0 R/Prev 173 0 R/Next 175 0 R>> endobj 175 0 obj < /Dest[37 0 R/XYZ 88.4 332.3 0]/Parent 172 0 R/Prev 174 0 R/Next 176 0 R>> endobj 176 0 obj < /Dest[43 0 R/XYZ 88.4 705.6 0]/Parent 172 0 R/Prev 175 0 R/Next 177 0 R>> endobj 177 0 obj < /Dest[43 0 R/XYZ 88.4 197.4 0]/Parent 172 0 R/Prev 176 0 R>> endobj 178 0 obj < /Dest[49 0 R/XYZ 81.1 723.3 0]/Parent 161 0 R/Prev 172 0 R/Next 199 0 R>> endobj 179 0 obj < /Dest[49 0 R/XYZ 88.4 332 0]/Parent 178 0 R/Next 180 0 R>> endobj 180 0 obj < /Dest[52 0 R/XYZ 88.4 361.7 0]/Parent 178 0 R/Prev 179 0 R/Next 184 0 R>> endobj 181 0 obj < /Dest[55 0 R/XYZ 97.4 611.6 0]/Parent 180 0 R/Next 182 0 R>> endobj 182 0 obj < /Dest[55 0 R/XYZ 97.4 511.1 0]/Parent 180 0 R/Prev 181 0 R/Next 183 0 R>> endobj 183 0 obj < /Dest[55 0 R/XYZ 97.4 416.5 0]/Parent 180 0 R/Prev 182 0 R>> endobj 184 0 obj < /Dest[55 0 R/XYZ 88.4 321.9 0]/Parent 178 0 R/Prev 180 0 R/Next 187 0 R>> endobj 185 0 obj < /Dest[55 0 R/XYZ 97.4 290 0]/Parent 184 0 R/Next 186 0 R>> endobj 186 0 obj < /Dest[61 0 R/XYZ 97.4 735.3 0]/Parent 184 0 R/Prev 185 0 R>> endobj 187 0 obj < /Dest[61 0 R/XYZ 88.4 500.1 0]/Parent 178 0 R/Prev 184 0 R/Next 188 0 R>> endobj 188 0 obj < /Dest[67 0 R/XYZ 88.4 498.3 0]/Parent 178 0 R/Prev 187 0 R/Next 189 0 R>> endobj 189 0 obj < /Dest[70 0 R/XYZ 88.4 681.7 0]/Parent 178 0 R/Prev 188 0 R/Next 190 0 R>> endobj 190 0 obj < /Dest[70 0 R/XYZ 88.4 352.4 0]/Parent 178 0 R/Prev 189 0 R/Next 191 0 R>> endobj 191 0 obj < /Dest[73 0 R/XYZ 88.4 529.8 0]/Parent 178 0 R/Prev 190 0 R/Next 192 0 R>> endobj 192 0 obj < /Dest[73 0 R/XYZ 88.4 270.4 0]/Parent 178 0 R/Prev 191 0 R/Next 193 0 R>> endobj 193 0 obj < /Dest[76 0 R/XYZ 96.5 631.4 0]/Parent 178 0 R/Prev 192 0 R/Next 194 0 R>> endobj 194 0 obj < /Dest[76 0 R/XYZ 96.5 381.1 0]/Parent 178 0 R/Prev 193 0 R/Next 195 0 R>> endobj 195 0 obj < /Dest[76 0 R/XYZ 96.5 130.8 0]/Parent 178 0 R/Prev 194 0 R/Next 196 0 R>> endobj 196 0 obj < /Dest[79 0 R/XYZ 96.5 522.6 0]/Parent 178 0 R/Prev 195 0 R/Next 197 0 R>> endobj 197 0 obj < /Dest[79 0 R/XYZ 96.5 385.9 0]/Parent 178 0 R/Prev 196 0 R/Next 198 0 R>> endobj 198 0 obj < /Dest[79 0 R/XYZ 96.5 249.1 0]/Parent 178 0 R/Prev 197 0 R>> endobj 199 0 obj < /Dest[85 0 R/XYZ 81.1 723.3 0]/Parent 161 0 R/Prev 178 0 R/Next 202 0 R>> endobj 200 0 obj < /Dest[85 0 R/XYZ 88.4 629 0]/Parent 199 0 R/Next 201 0 R>> endobj 201 0 obj < /Dest[85 0 R/XYZ 88.4 491.7 0]/Parent 199 0 R/Prev 200 0 R>> endobj 202 0 obj < /Dest[96 0 R/XYZ 81.1 723.3 0]/Parent 161 0 R/Prev 199 0 R>> endobj 203 0 obj < /Dest[101 0 R/XYZ 88.4 703.3 0]/Parent 202 0 R/Next 204 0 R>> endobj 204 0 obj < /Dest[104 0 R/XYZ 88.4 335.5 0]/Parent 202 0 R/Prev 203 0 R/Next 205 0 R>> endobj 205 0 obj < /Dest[104 0 R/XYZ 88.4 186.6 0]/Parent 202 0 R/Prev 204 0 R/Next 206 0 R>> endobj 206 0 obj < /Dest[107 0 R/XYZ 88.4 735.3 0]/Parent 202 0 R/Prev 205 0 R>> endobj 116 0 obj <> endobj 110 0 obj <> >> endobj 111 0 obj <> >> endobj 112 0 obj <> >> endobj 113 0 obj <> endobj 114 0 obj <> endobj 115 0 obj <> endobj 207 0 obj <> endobj 208 0 obj < /Creator /Producer /CreationDate (D:20070125131433-05'00') >> endobj xref 0 209 0000000000 65535 f 0000705803 00000 n 0000000019 00000 n 0000000776 00000 n 0000448959 00000 n 0000122325 00000 n 0000092541 00000 n 0000000796 00000 n 0000437891 00000 n 0000448937 00000 n 0000705949 00000 n 0000496503 00000 n 0000500099 00000 n 0000706097 00000 n 0000500121 00000 n 0000500499 00000 n 0000706245 00000 n 0000500520 00000 n 0000503106 00000 n 0000706393 00000 n 0000503128 00000 n 0000508971 00000 n 0000706560 00000 n 0000508993 00000 n 0000514312 00000 n 0000706708 00000 n 0000514334 00000 n 0000518211 00000 n 0000706856 00000 n 0000518233 00000 n 0000521659 00000 n 0000707031 00000 n 0000521681 00000 n 0000526026 00000 n 0000707198 00000 n 0000526048 00000 n 0000529153 00000 n 0000707346 00000 n 0000529175 00000 n 0000533231 00000 n 0000707494 00000 n 0000533253 00000 n 0000533703 00000 n 0000707642 00000 n 0000533724 00000 n 0000536808 00000 n 0000707790 00000 n 0000536830 00000 n 0000537967 00000 n 0000707938 00000 n 0000537989 00000 n 0000542774 00000 n 0000708086 00000 n 0000542796 00000 n 0000547904 00000 n 0000708234 00000 n 0000547926 00000 n 0000553012 00000 n 0000708382 00000 n 0000553034 00000 n 0000557276 00000 n 0000708530 00000 n 0000557298 00000 n 0000561217 00000 n 0000708678 00000 n 0000561239 00000 n 0000564800 00000 n 0000708826 00000 n 0000564822 00000 n 0000568836 00000 n 0000708974 00000 n 0000568858 00000 n 0000572287 00000 n 0000709122 00000 n 0000572309 00000 n 0000575837 00000 n 0000709270 00000 n 0000575859 00000 n 0000578764 00000 n 0000709418 00000 n 0000578786 00000 n 0000582101 00000 n 0000709566 00000 n 0000582123 00000 n 0000582354 00000 n 0000709714 00000 n 0000582375 00000 n 0000585753 00000 n 0000709889 00000 n 0000585775 00000 n 0000589050 00000 n 0000589072 00000 n 0000589258 00000 n 0000710037 00000 n 0000589301 00000 n 0000591122 00000 n 0000710185 00000 n 0000591144 00000 n 0000593984 00000 n 0000594006 00000 n 0000594191 00000 n 0000710333 00000 n 0000594233 00000 n 0000599010 00000 n 0000710483 00000 n 0000599033 00000 n 0000604134 00000 n 0000710633 00000 n 0000604157 00000 n 0000605465 00000 n 0000721134 00000 n 0000721288 00000 n 0000721451 00000 n 0000721593 00000 n 0000721709 00000 n 0000721827 00000 n 0000720804 00000 n 0000605488 00000 n 0000606179 00000 n 0000606201 00000 n 0000606394 00000 n 0000606687 00000 n 0000606851 00000 n 0000617115 00000 n 0000617139 00000 n 0000617345 00000 n 0000617807 00000 n 0000618135 00000 n 0000634814 00000 n 0000634838 00000 n 0000635045 00000 n 0000635683 00000 n 0000636184 00000 n 0000654245 00000 n 0000654269 00000 n 0000654462 00000 n 0000655087 00000 n 0000655557 00000 n 0000664276 00000 n 0000664299 00000 n 0000664506 00000 n 0000664899 00000 n 0000665160 00000 n 0000677296 00000 n 0000677320 00000 n 0000677526 00000 n 0000678051 00000 n 0000678433 00000 n 0000691460 00000 n 0000691484 00000 n 0000691699 00000 n 0000692241 00000 n 0000692650 00000 n 0000704346 00000 n 0000704370 00000 n 0000704575 00000 n 0000705069 00000 n 0000705423 00000 n 0000705543 00000 n 0000705636 00000 n 0000705690 00000 n 0000710783 00000 n 0000710842 00000 n 0000711028 00000 n 0000711318 00000 n 0000711597 00000 n 0000711887 00000 n 0000712094 00000 n 0000712309 00000 n 0000712522 00000 n 0000712752 00000 n 0000712967 00000 n 0000713117 00000 n 0000713352 00000 n 0000713578 00000 n 0000713749 00000 n 0000714064 00000 n 0000714267 00000 n 0000714477 00000 n 0000714713 00000 n 0000714869 00000 n 0000715064 00000 n 0000715250 00000 n 0000715469 00000 n 0000715675 00000 n 0000715926 00000 n 0000716162 00000 n 0000716404 00000 n 0000716567 00000 n 0000716822 00000 n 0000717005 00000 n 0000717196 00000 n 0000717363 00000 n 0000717546 00000 n 0000717785 00000 n 0000718020 00000 n 0000718295 00000 n 0000718602 00000 n 0000718881 00000 n 0000719107 00000 n 0000719334 00000 n 0000719502 00000 n 0000719692 00000 n 0000719894 00000 n 0000720125 00000 n 0000720369 00000 n 0000720589 00000 n 0000721946 00000 n 0000722015 00000 n trailer < ] >> startxref 722271 %%EOF openhpi-3.6.1/plugins/snmp_bc/snmp_bc_hotswap.h0000644000175100017510000000267012575647274020644 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #ifndef __SNMP_BC_HOTSWAP_H #define __SNMP_BC_HOTSWAP_H SaErrorT snmp_bc_get_hotswap_state(void *hnd, SaHpiResourceIdT rid, SaHpiHsStateT *state); SaErrorT snmp_bc_set_hotswap_state(void *hnd, SaHpiResourceIdT rid, SaHpiHsStateT state); SaErrorT snmp_bc_request_hotswap_action(void *hnd, SaHpiResourceIdT rid, SaHpiHsActionT act); SaErrorT snmp_bc_get_indicator_state(void *hnd, SaHpiResourceIdT rid, SaHpiHsIndicatorStateT *state); SaErrorT snmp_bc_set_indicator_state(void *hnd, SaHpiResourceIdT rid, SaHpiHsIndicatorStateT state); SaErrorT snmp_bc_set_autoinsert_timeout(void *hnd, SaHpiTimeoutT Timeout); SaErrorT snmp_bc_get_autoextract_timeout(void *hnd, SaHpiResourceIdT rid, SaHpiTimeoutT *Timeout); SaErrorT snmp_bc_set_autoextract_timeout(void *hnd, SaHpiResourceIdT rid, SaHpiTimeoutT Timeout); #endif openhpi-3.6.1/plugins/snmp_bc/snmp_bc_sel.c0000644000175100017510000011376312575647274017743 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Sean Dague * Peter Phan * Steve Sherman */ #include #include #include #include oh_el *bc_selcache = NULL; /** * snmp_bc_get_sel_size: * @handle: Pointer to handler's data. * @id: Resource ID that owns the Event Log. * * Get size of event log. * * Return values: * Number of event log entries - normal case. **/ static int snmp_bc_get_sel_size(struct oh_handler_state *handle, SaHpiResourceIdT id) { int i; SaErrorT err; SaHpiEventLogInfoT elinfo; i = 1; err = SA_OK; /* Go synchronize cache and hardware copy of the SEL */ err = snmp_bc_check_selcache(handle, id, SAHPI_NEWEST_ENTRY); if (err) /* --------------------------------------------------------------- */ /* If an error is encounterred during building of snmp_bc elcache, */ /* only log the error. Do not do any recovery because log entries */ /* are still kept in bc mm. We'll pick them up during synch. */ /* --------------------------------------------------------------- */ err("snmp_bc_discover, Error %s when building elcache.\n", oh_lookup_error(err)); /* Return the entry count */ oh_el_info(handle->elcache, &elinfo); i = elinfo.Entries; return i; } /** * snmp_bc_get_sel_info: * @hnd: Pointer to handler's data. * @id: Resource ID that owns the Event Log. * @info: Location to store Event Log information. * * Returns SaHpiEventLogInfoT information about Event Log. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_INVALID_PARAMS - Any pointer parameter is NULL. **/ SaErrorT snmp_bc_get_sel_info(void *hnd, SaHpiResourceIdT id, SaHpiEventLogInfoT *info) { char oid[SNMP_BC_MAX_OID_LENGTH]; SaErrorT err; struct snmp_value first_value; struct oh_handler_state *handle; struct tm curtime; sel_entry sel_entry; struct snmp_bc_hnd *custom_handle; SaHpiEventLogInfoT sel, elinfo; if (!hnd || !info) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; snmp_bc_lock_handler(custom_handle); /* Build local copy of EventLogInfo */ /* Max number of entries that can be stored */ /* in bc EventLog varies, depending on */ /* what events have been logged so far and */ /* the information each logged event contains*/ sel.Size = BC_EL_MAX_SIZE; /* This is clearly a guess but looks about right * from the 75% full errors we have seen. */ sel.UserEventMaxSize = SAHPI_MAX_TEXT_BUFFER_LENGTH; sel.Enabled = SAHPI_TRUE; sel.OverflowFlag = SAHPI_FALSE; sel.OverflowResetable = SAHPI_FALSE; sel.OverflowAction = SAHPI_EL_OVERFLOW_OVERWRITE; sel.UpdateTimestamp = 0; /* In Event Log, the newest entry is index at index 1 */ /* Need first value to figure out what update time is */ if (custom_handle->platform == SNMP_BC_PLATFORM_RSA) { snprintf(oid, SNMP_BC_MAX_OID_LENGTH,"%s.%d", SNMP_BC_SEL_ENTRY_OID_RSA, 1); } else { snprintf(oid, SNMP_BC_MAX_OID_LENGTH,"%s.%d", SNMP_BC_SEL_ENTRY_OID, 1); } err = snmp_bc_snmp_get(custom_handle, oid, &first_value, SAHPI_TRUE); if (err == SA_OK) { if (first_value.type == ASN_OCTET_STR) { err = snmp_bc_parse_sel_entry(handle, first_value.string, &sel_entry); if (err) { err("Cannot get first date"); snmp_bc_unlock_handler(custom_handle); return(err); } else { sel.UpdateTimestamp = (SaHpiTimeT) mktime(&sel_entry.time) * 1000000000; } } } else { snmp_bc_unlock_handler(custom_handle); return(err); } err = snmp_bc_get_sp_time(handle, &curtime); if ( err == SA_OK) { sel.CurrentTime = (SaHpiTimeT) mktime(&curtime) * 1000000000; } else { snmp_bc_unlock_handler(custom_handle); return(err); } sel.Entries = snmp_bc_get_sel_size(handle, id); oh_el_info(handle->elcache, &elinfo); sel.OverflowFlag = elinfo.OverflowFlag; *info = sel; snmp_bc_unlock_handler(custom_handle); return(SA_OK); } /** * snmp_bc_get_sel_entry: * @hnd: Pointer to handler's data. * @id: Resource ID that owns the Event Log. * @current: Current event's ID. * @prev: Location to store previous event's ID. * @next: Location to store next event's ID. * @entry: Location to store retrieved event. * * Gets an entry from the system Event Log. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_INVALID_PARAMS - Any pointer parameter is NULL. **/ SaErrorT snmp_bc_get_sel_entry(void *hnd, SaHpiResourceIdT id, SaHpiEventLogEntryIdT current, SaHpiEventLogEntryIdT *prev, SaHpiEventLogEntryIdT *next, SaHpiEventLogEntryT *entry, SaHpiRdrT *rdr, SaHpiRptEntryT *rptentry) { SaErrorT err; oh_el_entry tmpentry, *tmpentryptr; struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; if (!hnd || !prev || !next || !entry) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } memset(entry, 0, sizeof(SaHpiEventLogEntryT)); err = SA_OK; tmpentryptr = &tmpentry; handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; snmp_bc_lock_handler(custom_handle); if (handle->elcache != NULL) { /* Force a cache sync before servicing the request */ err = snmp_bc_check_selcache(handle, id, current); if (err) { err("Event Log cache sync failed %s\n", oh_lookup_error(err)); /* --------------------------------------------------------------- */ /* If an error is encountered during building of snmp_bc elcache, */ /* only log the error. Do not do any recovery because log entries */ /* are still kept in bc mm. We'll pick them up during synch. */ /* --------------------------------------------------------------- */ } err = oh_el_get(handle->elcache, current, prev, next, &tmpentryptr); if (err) { err("Getting Event Log entry=%d from cache failed. Error=%s.", current, oh_lookup_error(err)); snmp_bc_unlock_handler(custom_handle); return(err); } else { memcpy(entry, &(tmpentryptr->event), sizeof(SaHpiEventLogEntryT)); if (rdr) memcpy(rdr, &tmpentryptr->rdr, sizeof(SaHpiRdrT)); else dbg("NULL rdrptr with SaHpiEventLogEntryGet()\n"); if (rptentry) memcpy(rptentry, &(tmpentryptr->res), sizeof(SaHpiRptEntryT)); else dbg("NULL rptptr with SaHpiEventLogEntryGet()\n"); } } else { err("Missing handle->elcache"); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } snmp_bc_unlock_handler(custom_handle); return(SA_OK); } /** * snmp_bc_bulk_selcache * @handle: Pointer to handler's data. * @id: Resource ID that owns the Event Log. * * Builds internal event log cache using SNMP_MSG_GETBULK. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_INVALID_PARAMS - @handle is NULL. **/ SaErrorT snmp_bc_bulk_selcache( struct oh_handler_state *handle, SaHpiResourceIdT id) { struct snmp_bc_hnd *custom_handle; SaErrorT err; int isdst; sel_entry sel_entry; SaHpiEventT tmpevent; netsnmp_pdu *pdu, *response; netsnmp_variable_list *vars; LogSource2ResourceT logsrc2res; int count; int running; int status; char logstring[MAX_ASN_STR_LEN]; char objoid[SNMP_BC_MAX_OID_LENGTH]; oid name[MAX_OID_LEN]; oid root[MAX_OID_LEN]; size_t rootlen; size_t name_length; size_t str_len; int reps; if (!handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } str_len = MAX_ASN_STR_LEN; isdst=0; custom_handle = (struct snmp_bc_hnd *)handle->data; reps = custom_handle->count_per_getbulk; /* --------------------------------------------------- */ /* Set initial Event Log Entry OID and root tree */ /* --------------------------------------------------- */ if (custom_handle->platform == SNMP_BC_PLATFORM_RSA) { snprintf(objoid, SNMP_BC_MAX_OID_LENGTH, "%s", SNMP_BC_SEL_ENTRY_OID_RSA); } else { snprintf(objoid, SNMP_BC_MAX_OID_LENGTH, "%s",SNMP_BC_SEL_ENTRY_OID); } rootlen = MAX_OID_LEN; read_objid(objoid, root, &rootlen); /* --------------------------------------------------- */ /* Object ID for GETBULK request */ /* --------------------------------------------------- */ g_memmove(name, root, rootlen * sizeof(oid)); name_length = rootlen; running = 1; while (running) { /* --------------------------------------------------- */ /* Create PDU for GETBULK request */ /* --------------------------------------------------- */ pdu = snmp_pdu_create(SNMP_MSG_GETBULK); status = snmp_getn_bulk(custom_handle->sessp, name, name_length, pdu, &response, reps); if (pdu) snmp_free_pdu(pdu); if (status == STAT_SUCCESS) { if (response->errstat == SNMP_ERR_NOERROR) { for (vars = response->variables; vars; vars = vars->next_variable) { /* ------------------------------------------------- */ /* Check if this variable is of the same OID tree */ /* ------------------------------------------------- */ if ((vars->name_length < rootlen) || (memcmp(root, vars->name, rootlen * sizeof(oid)) != 0)) { /* Exit vars processing */ running = 0; continue; } if ((vars->type != SNMP_ENDOFMIBVIEW) && (vars->type != SNMP_NOSUCHOBJECT) && (vars->type != SNMP_NOSUCHINSTANCE)) { if (snmp_oid_compare(name, name_length, vars->name, vars->name_length) >= 0) { fprintf(stderr, "Error: OID not increasing: "); fprint_objid(stderr, name, name_length); fprintf(stderr, " >= "); fprint_objid(stderr, vars->name, vars->name_length); fprintf(stderr, "\n"); running = 0; } /* ---------------------------------- */ /* Check if last variable, */ /* and if so, save for next request. */ /* ---------------------------------- */ if (vars->next_variable == NULL) { g_memmove(name, vars->name, vars->name_length * sizeof(oid)); name_length = vars->name_length; } /* ---------------------------------- */ /* ---------------------------------- */ /* ---------------------------------- */ if ((running == 1) && (vars->type == ASN_OCTET_STR)) { if (vars->val_len < MAX_ASN_STR_LEN) str_len = vars->val_len; else str_len = MAX_ASN_STR_LEN; /* ---------------------------------- */ /* Guarantee NULL terminated string */ /* ---------------------------------- */ // memcpy(logstring, vars->val.string, str_len); g_memmove(logstring, vars->val.string, str_len); logstring[str_len] = '\0'; err = snmp_bc_parse_sel_entry(handle,logstring, &sel_entry); isdst = sel_entry.time.tm_isdst; snmp_bc_log2event(handle, logstring, &tmpevent, isdst, &logsrc2res); err = oh_el_prepend(handle->elcache, &tmpevent, NULL, NULL); if (custom_handle->isFirstDiscovery == SAHPI_FALSE) err = snmp_bc_add_to_eventq(handle, &tmpevent, SAHPI_TRUE); } } else { /* Stop on an exception value */ running = 0; } } /* end for */ } else { /* if (response->errstat != SNMP_ERR_NOERROR) */ /* --------------------------------------------- */ /* Error condition is seen in response, */ /* for now, print the error then exit */ /* Not sure what to do for recovery */ running = 0; if (response->errstat == SNMP_ERR_NOSUCHNAME) { printf("End of MIB\n"); } else { fprintf(stderr, "Error in packet.\nReason: %s\n", snmp_errstring(response->errstat)); if (response->errindex != 0) { fprintf(stderr, "Failed object: "); for (count = 1, vars = response->variables; vars && count != response->errindex; vars = vars->next_variable, count++) if (vars) fprint_objid(stderr, vars->name, vars->name_length); fprintf(stderr, "\n"); } } } } else if (status == STAT_TIMEOUT) { fprintf(stderr, "Timeout: No Response\n"); running = 0; } else { /* status == STAT_ERROR */ snmp_sess_perror("snmp_bulk_sel",custom_handle->sessp ); running = 0; } if (response) snmp_free_pdu(response); } return(SA_OK); } /** * snmp_bc_check_selcache: * @handle: Pointer to handler's data. * @id: Resource ID that owns Event Log. * @entryId: Event Log entry ID. * * Sync Event Log's cache. If this is first entry, then create the * event log cache. * * Return values: * SA_OK - normal operation. * SA_ERR_HPI_INVALID_PARAMS - @handler is NULL. **/ SaErrorT snmp_bc_check_selcache(struct oh_handler_state *handle, SaHpiResourceIdT id, SaHpiEventLogEntryIdT entryId) { SaErrorT err; SaHpiEventLogInfoT elinfo; if (!handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } err = SA_OK; oh_el_info(handle->elcache, &elinfo); if (elinfo.Entries == 0 && !(is_simulator())) { /* err = snmp_bc_build_selcache(handle, id); */ dbg("elcache sync called before discovery?\n"); } else { err = snmp_bc_selcache_sync(handle, id, entryId); } if (err) { err("Event Log cache build/sync failed. Error=%s", oh_lookup_error(err)); return(err); } return(SA_OK); } /** * snmp_bc_selcache_sync * @handle: Pointer to handler's data. * @id: Resource ID that owns Event Log. * @entryId: Event Log entry ID. * * Synchronizes internal event log cache. Although BladeCenter can read events from * the hardware in any order; RSA requires that they be read from first to last. * To support common code, events are read in order and preappended to the * cache log. * * Return values: * SA_OK - normal operation. * SA_ERR_HPI_INVALID_PARAMS - @handle is NULL. **/ SaErrorT snmp_bc_selcache_sync(struct oh_handler_state *handle, SaHpiResourceIdT id, SaHpiEventLogEntryIdT entryId) { SaHpiEventLogEntryIdT prev; SaHpiEventLogEntryIdT next; struct snmp_value get_value, *this_value; sel_entry sel_entry; oh_el_entry *fetchentry, tmpentry; SaHpiTimeT new_timestamp; char oid[SNMP_BC_MAX_OID_LENGTH]; SaErrorT err; int current, cacheupdate; struct snmp_bc_hnd *custom_handle; int isdst; SaHpiEventT tmpevent; LogSource2ResourceT logsrc2res; GList *sync_log, *proc_log; if (!handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } err = SA_OK; sync_log = NULL; proc_log = NULL; fetchentry = &tmpentry; cacheupdate = 0; custom_handle = (struct snmp_bc_hnd *)handle->data; err = oh_el_get(handle->elcache, SAHPI_NEWEST_ENTRY, &prev, &next, &fetchentry); if (err) fetchentry = NULL; if (fetchentry == NULL) { err = snmp_bc_build_selcache(handle, id); return(err); } current = 1; if (custom_handle->platform == SNMP_BC_PLATFORM_RSA) { snprintf(oid, SNMP_BC_MAX_OID_LENGTH, "%s.%d", SNMP_BC_SEL_ENTRY_OID_RSA, current); } else { snprintf(oid, SNMP_BC_MAX_OID_LENGTH, "%s.%d", SNMP_BC_SEL_ENTRY_OID, current); } err = snmp_bc_snmp_get(custom_handle, oid, &get_value, SAHPI_TRUE); if (err) { err("Error %s snmp_get latest BC Event Log.\n", oh_lookup_error(err)); /* Error attempting to sync elcache and BC Event Log */ /* Leave thing as is, instead of clearing elcache. */ /* Clearing cache will cause snmp traffic to re-read */ /* all BC Event Log. We want to keep traffic to min */ /* for snmp interface recovery */ /* err = oh_el_clear(handle->elcache); */ return(err); } if (snmp_bc_parse_sel_entry(handle, get_value.string, &sel_entry) < 0) { err("Cannot parse Event Log entry"); return(SA_ERR_HPI_INTERNAL_ERROR); } new_timestamp = (SaHpiTimeT)mktime(&sel_entry.time) * 1000000000; if (fetchentry->event.Event.Timestamp != new_timestamp) { this_value = g_memdup(&get_value, sizeof(get_value)); if (this_value != NULL) sync_log = g_list_prepend(sync_log, this_value); while (1) { current++; if (custom_handle->platform == SNMP_BC_PLATFORM_RSA) { snprintf(oid, SNMP_BC_MAX_OID_LENGTH, "%s.%d", SNMP_BC_SEL_ENTRY_OID_RSA, current); } else { snprintf(oid, SNMP_BC_MAX_OID_LENGTH, "%s.%d", SNMP_BC_SEL_ENTRY_OID, current); } err = snmp_bc_snmp_get(custom_handle,oid,&get_value, SAHPI_TRUE); if (err == SA_OK) { if (snmp_bc_parse_sel_entry(handle, get_value.string, &sel_entry) < 0) { err("Cannot parse SEL entry."); err = SA_ERR_HPI_INTERNAL_ERROR; goto out; } if (fetchentry->event.Event.Timestamp == (SaHpiTimeT)mktime(&sel_entry.time) * 1000000000) { current--; cacheupdate = 1; break; } else { this_value = g_memdup(&get_value, sizeof(struct snmp_value)); if (this_value != NULL) sync_log = g_list_prepend(sync_log, this_value); } } else { dbg("End of BladeCenter log reached."); break; } } if (cacheupdate) { proc_log = g_list_first(sync_log); while(proc_log != NULL) { this_value = (struct snmp_value *)proc_log->data; err = snmp_bc_parse_sel_entry(handle,this_value->string, &sel_entry); if (err != SA_OK) goto out; if (g_ascii_strncasecmp(get_value.string, EVT_EN_LOG_FULL, sizeof(EVT_EN_LOG_FULL)) == 0 ) oh_el_overflowset(handle->elcache, SAHPI_TRUE); isdst = sel_entry.time.tm_isdst; snmp_bc_log2event(handle, this_value->string, &tmpevent, isdst, &logsrc2res); /* append to end-of-elcache and end-of-eventq */ err = snmp_bc_add_entry_to_elcache(handle, &tmpevent, SAHPI_FALSE); proc_log = g_list_next(proc_log); } } else { err = oh_el_clear(handle->elcache); if (err != SA_OK) err("Invalid elcache pointer or mode, err %s\n", oh_lookup_error(err)); err = snmp_bc_build_selcache(handle, id); if ( (err == SA_ERR_HPI_OUT_OF_MEMORY) || (err == SA_ERR_HPI_INVALID_PARAMS)) { /* either of these 2 errors prevent us from doing anything meaningful */ /* tell user about them */ goto out; } } } else { dbg("EL Sync: there are no new entry indicated.\n"); } out: if (sync_log) { proc_log = g_list_first(sync_log); while (proc_log){ if ( (this_value = (struct snmp_value *) proc_log->data)) { g_free(this_value); } proc_log = g_list_next(proc_log); } g_list_free(sync_log); } return(err); } /** * snmp_bc_build_selcache * @handle: Pointer to handler's data. * @id: Resource ID that owns the Event Log. * * Builds internal event log cache. Although BladeCenter can read events from * the hardware in any order; RSA requires that they be read from first to last. * To support common code, events are read in order and preappended to the * cache log. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_INVALID_PARAMS - @handle is NULL. **/ SaErrorT snmp_bc_build_selcache(struct oh_handler_state *handle, SaHpiResourceIdT id) { int i; SaErrorT err; struct snmp_bc_hnd *custom_handle; if (!handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } err = SA_OK; custom_handle = (struct snmp_bc_hnd *)handle->data; /* ------------------------------------------------------------------- */ /* If user has configured for snmpV3, then use GETBULK for performance */ /* Else, stay with individual GETs */ /* ------------------------------------------------------------------- */ if ((custom_handle->session.version == SNMP_VERSION_3) && (custom_handle->count_per_getbulk != 0)) { /* ------------------------------------------------- */ /* DO NOT remove this trace statement!!!! */ /* ------------------------------------------------- */ /* Without this trace statement, */ /* -- stack corruption issue with multiple handlers */ /* gcc (GCC) 4.0.2 20051125 (Red Hat 4.0.2-8) */ /* -- works OK with with multiple handlers */ /* gcc (GCC) 4.1.0 20060123 (SLES10 Beta 2) */ /* -- works OK with with multiple handlers */ /* gcc (GCC) 4.0.1 (4.0.1-5mdk Mandriva 2006) */ /* -- works OK with all gcc vers for single handler */ dbg(">>>>>> bulk build selcache %p. count_per_getbulk %d\n", handle,custom_handle->count_per_getbulk); /* ------------------------------------------------- */ err = snmp_bc_bulk_selcache(handle, id); } else { i = 1; while(1) { err = snmp_bc_sel_read_add(handle, id, i, SAHPI_TRUE); if ( (err == SA_ERR_HPI_OUT_OF_MEMORY) || (err == SA_ERR_HPI_INVALID_PARAMS)) { /* Either of these 2 errors prevent us from doing anything meaningful */ return(err); } else if (err != SA_OK) { /* other errors (mainly HPI_INTERNAL_ERROR or HPI_BUSY) means */ /* only this record has problem. record error then go to next */ err("Error, %s, encountered with EventLog entry %d\n", oh_lookup_error(err), i); break; } i++; } } return(SA_OK); } /** * snmp_bc_set_sel_time: * @hnd: Pointer to handler's data. * @id: Resource's ID that owns Event Log. * @time: HPI time. * * Set Event Log's time. * * Return values: * SA_OK - normal operation. * SA_ERR_HPI_INVALID_PARAMS - @hnd is NULL. **/ SaErrorT snmp_bc_set_sel_time(void *hnd, SaHpiResourceIdT id, SaHpiTimeT time) { struct tm tv; time_t tt; SaErrorT err; struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; if ( (!hnd) || (time == SAHPI_TIME_UNSPECIFIED)) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; snmp_bc_lock_handler(custom_handle); tt = time / 1000000000; localtime_r(&tt, &tv); if ( time < SAHPI_TIME_MAX_RELATIVE ) { dbg("Time input is relative time. Make it absolute.\n"); /* c time utilities have base epoch of 00:00:00 UTC, January 1, 1970 */ /* Bladecenter code has base epoch year 1999. */ /* So if the user chooses relative time, then */ /* we just adjust the year to the BladeCenter based year 1999. */ /* (1) tv.tm_year has (year - 1900) */ /* (2) which is (year - 1900 - 70) from year zero */ tv.tm_year = tv.tm_year - 70 + 99; } err = snmp_bc_set_sp_time(custom_handle, &tv); if (err) { snmp_bc_unlock_handler(custom_handle); err("Cannot set time. Error=%s.", oh_lookup_error(err)); return(SA_ERR_HPI_INTERNAL_ERROR); } snmp_bc_unlock_handler(custom_handle); return(SA_OK); } /** * snmp_bc_add_sel_entry: * @hnd: Pointer to handler's data. * @id: Resource's ID that owns Event Log. * @Event: Location of event to be added. * * Add is not supported by the hardware. * * Return values: * SA_ERR_HPI_INVALID_CMD - normal operation. **/ SaErrorT snmp_bc_add_sel_entry(void *hnd, SaHpiResourceIdT id, const SaHpiEventT *Event) { return(SA_ERR_HPI_INVALID_CMD); } /** * snmp_bc_sel_read_add: * @hnd: Pointer to handler's data. * @id: Resource's ID that owns Event Log. * @current: Current Event Log entry ID. * * Add event to Event Log. * * Return values: * SA_OK - normal operation. * SA_ERR_HPI_INVALID_PARAMS - @hnd is NULL. **/ SaErrorT snmp_bc_sel_read_add (struct oh_handler_state *handle, SaHpiResourceIdT id, SaHpiEventLogEntryIdT current, SaHpiBoolT prepend) { int isdst; char oid[SNMP_BC_MAX_OID_LENGTH]; sel_entry sel_entry; SaErrorT err; SaHpiEventT tmpevent; LogSource2ResourceT logsrc2res; struct snmp_value get_value; struct snmp_bc_hnd *custom_handle; if (!handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } isdst=0; custom_handle = (struct snmp_bc_hnd *)handle->data; if (custom_handle->platform == SNMP_BC_PLATFORM_RSA) { snprintf(oid, SNMP_BC_MAX_OID_LENGTH, "%s.%d", SNMP_BC_SEL_ENTRY_OID_RSA, current); } else { snprintf(oid, SNMP_BC_MAX_OID_LENGTH, "%s.%d", SNMP_BC_SEL_ENTRY_OID, current); } err = snmp_bc_snmp_get(custom_handle, oid, &get_value, SAHPI_TRUE); if (err != SA_OK) return(err); else if ((err == SA_OK) && (get_value.type != ASN_OCTET_STR)) { err("Cannot get EL entry"); return(SA_ERR_HPI_INTERNAL_ERROR); } err = snmp_bc_parse_sel_entry(handle,get_value.string, &sel_entry); if (err != SA_OK) return(err); if (g_ascii_strncasecmp(get_value.string, EVT_EN_LOG_FULL, sizeof(EVT_EN_LOG_FULL)) == 0 ) oh_el_overflowset(handle->elcache, SAHPI_TRUE); isdst = sel_entry.time.tm_isdst; snmp_bc_log2event(handle, get_value.string, &tmpevent, isdst, &logsrc2res); err = snmp_bc_add_entry_to_elcache(handle, &tmpevent, prepend); return(err); } /** * snmp_bc_add_entry_to_elcache * @hnd: Pointer to handler's data. * @id: Resource's ID that owns Event Log. * @current: Current Event Log entry ID. * * Add event to Event Log. * * Return values: * SA_OK - normal operation. * SA_ERR_HPI_INVALID_PARAMS - @hnd is NULL. **/ SaErrorT snmp_bc_add_entry_to_elcache(struct oh_handler_state *handle, SaHpiEventT *tmpevent, SaHpiBoolT prepend) { SaHpiEntryIdT rdrid; SaHpiRdrT rdr, *rdr_ptr; struct snmp_bc_hnd *custom_handle; SaHpiResourceIdT id; SaErrorT err; if (!handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } rdrid=0; rdr_ptr=NULL; custom_handle = (struct snmp_bc_hnd *)handle->data; /* See feature 1077241 */ switch (tmpevent->EventType) { case SAHPI_ET_OEM: case SAHPI_ET_HOTSWAP: case SAHPI_ET_USER: memset(&rdr, 0, sizeof(SaHpiRdrT)); /* There is no RDR associated to OEM event */ rdr.RdrType = SAHPI_NO_RECORD; /* Set RDR Type to SAHPI_NO_RECORD, spec B-01.01 */ /* It is redundant because SAHPI_NO_RECORD == 0 */ /* This code is here for clarity. */ rdr_ptr = &rdr; break; case SAHPI_ET_SENSOR: rdrid = oh_get_rdr_uid(SAHPI_SENSOR_RDR, tmpevent->EventDataUnion.SensorEvent.SensorNum); rdr_ptr = oh_get_rdr_by_id(handle->rptcache, tmpevent->Source, rdrid); break; case SAHPI_ET_WATCHDOG: rdrid = oh_get_rdr_uid(SAHPI_WATCHDOG_RDR, tmpevent->EventDataUnion.WatchdogEvent.WatchdogNum); rdr_ptr = oh_get_rdr_by_id(handle->rptcache, tmpevent->Source, rdrid); break; default: err("Unrecognized Event Type=%d.", tmpevent->EventType); return(SA_ERR_HPI_INTERNAL_ERROR); break; } /* Since oh_el_append() does a copy of RES and RDR into it own data struct, */ /* just pass the pointers to it. */ id = tmpevent->Source; if (NULL == oh_get_resource_by_id(handle->rptcache, id)) { dbg("Warning: NULL RPT for rid %d.", id); } if (prepend) err = oh_el_prepend(handle->elcache, tmpevent, rdr_ptr, oh_get_resource_by_id(handle->rptcache, id)); else err = oh_el_append(handle->elcache, tmpevent, rdr_ptr, oh_get_resource_by_id(handle->rptcache, id)); /* If can not add el entry to elcache, do not add entry to eventq */ /* If entry is not added to elcache and is added to eventq, there */ /* will be an indefinite loop: */ /* 1. get_event is called. get_event call elcache_sync */ /* 2. elcache_sync finds new el entry */ /* 3a. adding new el entry to elcache fails */ /* 3b. adding new el entry to eventq */ /* 4. new event is propergate to infrastructure */ /* 5. infrastructure consume new event */ /* *and* call get_event for any more */ /* 6. we repeat step 1 ... indefinite loop */ if (!err) { if (custom_handle->isFirstDiscovery == SAHPI_FALSE) err = snmp_bc_add_to_eventq(handle, tmpevent, prepend); if (err) err("Cannot add el entry to eventq. Error=%s.", oh_lookup_error(err)); } else { err("Cannot add el entry to elcache. Error=%s.", oh_lookup_error(err)); } return(err); } /** * snmp_bc_parse_sel_entry: * @handle: Pointer to handler data. * @logstr: Hardware log string. * @sel: blade center system event log * * Parses a hardware log entry into its various components. * Another transform has to happen to turn this into an HPI entry. * * Return values: * SA_OK - normal operation. * SA_ERR_HPI_INVALID_PARAMS - @handle, @logstr, @sel NULL. **/ SaErrorT snmp_bc_parse_sel_entry(struct oh_handler_state *handle, char *logstr, sel_entry *sel) { sel_entry ent; char level[8]; char *findit; struct snmp_bc_hnd *custom_handle; if (!handle || !logstr || !sel) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) return(SA_ERR_HPI_INVALID_PARAMS); /* Severity first */ findit = strstr(logstr, "Severity:"); if (findit != NULL) { if(sscanf(findit,"Severity:%7s",level)) { if(g_ascii_strncasecmp(level,"INFO", sizeof("INFO")) == 0) { ent.sev = SAHPI_INFORMATIONAL; } else if(g_ascii_strncasecmp(level,"WARN", sizeof("WARN")) == 0) { ent.sev = SAHPI_MINOR; } else if(g_ascii_strncasecmp(level,"ERR", sizeof("ERR")) == 0) { ent.sev = SAHPI_CRITICAL; } else { ent.sev = SAHPI_DEBUG; } } else { err("Cannot parse severity from log entry."); return(SA_ERR_HPI_INTERNAL_ERROR); } } findit = strstr(logstr, "Source:"); if (findit != NULL) { if(!sscanf(findit,"Source:%19s",ent.source)) { err("Cannot parse source from log entry."); return(SA_ERR_HPI_INTERNAL_ERROR); } } else { err("Premature data termination."); return(SA_ERR_HPI_INTERNAL_ERROR); } /* No Name field in RSA event messages */ if (custom_handle->platform == SNMP_BC_PLATFORM_RSA) { strncpy(ent.sname, "RSA", sizeof("RSA")); } else { findit = strstr(logstr, "Name:"); if (findit != NULL) { if(!sscanf(findit,"Name:%19s",ent.sname)) { err("Cannot parse name from log entry."); return(SA_ERR_HPI_INTERNAL_ERROR); } } else { err("Premature data termination."); return(SA_ERR_HPI_INTERNAL_ERROR); } } findit = strstr(logstr, "Date:"); if (findit != NULL) { if(sscanf(findit,"Date:%2d/%2d/%2d Time:%2d:%2d:%2d", &ent.time.tm_mon, &ent.time.tm_mday, &ent.time.tm_year, &ent.time.tm_hour, &ent.time.tm_min, &ent.time.tm_sec)) { snmp_bc_set_dst(handle, &ent.time); ent.time.tm_mon--; ent.time.tm_year += 100; } else { err("Cannot parse date/time from log entry."); return(SA_ERR_HPI_INTERNAL_ERROR); } } else { err("Premature data termination."); return(SA_ERR_HPI_INTERNAL_ERROR); } findit = strstr(logstr, "Text:"); if (findit != NULL) { /* Advance to data */ findit += 5; strncpy(ent.text,findit, SNMP_BC_MAX_SEL_ENTRY_LENGTH - 1); ent.text[SNMP_BC_MAX_SEL_ENTRY_LENGTH - 1] = '\0'; } else { err("Premature data termination."); return(SA_ERR_HPI_INTERNAL_ERROR); } *sel = ent; return(SA_OK); } /** * snmp_bc_clear_sel: * @hnd: Pointer to handler's data. * @id: Resource ID that owns the Event Log. * * Clears the system event log. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_INVALID_PARAMS - @hnd is NULL. **/ SaErrorT snmp_bc_clear_sel(void *hnd, SaHpiResourceIdT id) { struct snmp_value set_value; struct oh_handler_state *handle; SaErrorT err; struct snmp_bc_hnd *custom_handle; if (!hnd) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; snmp_bc_lock_handler(custom_handle); err = oh_el_clear(handle->elcache); if (err) { snmp_bc_unlock_handler(custom_handle); err("Cannot clear system Event Log. Error=%s.", oh_lookup_error(err)); return(err); } set_value.type = ASN_INTEGER; set_value.str_len = 1; set_value.integer = (long) clearEventLogExecute; if (custom_handle->platform == SNMP_BC_PLATFORM_RSA) { err = snmp_bc_snmp_set(custom_handle, SNMP_BC_SEL_CLEAR_OID_RSA, set_value); } else { err = snmp_bc_snmp_set(custom_handle, SNMP_BC_SEL_CLEAR_OID, set_value); } if (err) { snmp_bc_unlock_handler(custom_handle); err("SNMP set failed. Error=%s.", oh_lookup_error(err)); return(err); } else if (!is_simulator()) { /* Pick up the newly created entry, Log Clear message */ err = snmp_bc_build_selcache(handle, 1); } snmp_bc_unlock_handler(custom_handle); return(SA_OK); } /** * snmp_bc_sel_overflowreset: * @hnd: Pointer to handler's data. * @id: Resource ID that owns the Event Log. * * Clear the overflow flag by itself is not supported by snmp_bc plugin. * Rather, it can be cleared implicitly via clear_sel command, saHpiEventLogClear() * * Return values: * SA_ERR_HPI_INVALID_CMD - normal case. **/ SaErrorT snmp_bc_sel_overflowreset(void *hnd, SaHpiResourceIdT id) { return(SA_ERR_HPI_INVALID_CMD); } /** * snmp_bc_sel_state_set: * @hnd: Pointer to handler's data. * @id: Resource ID that owns the Event Log. * @enable: State to which to set Resource Event Log. * * Enable/Disable logging of event is not allowed via SMMP for BladeCenter. * * Return values: * SA_ERR_HPI_READ_ONLY - normal case. **/ SaErrorT snmp_bc_sel_state_set(void *hnd, SaHpiResourceIdT id, SaHpiBoolT enable) { /* Other required test, SA_ERR_HPI_CAPABILITY, is done in infrastructure */ return SA_ERR_HPI_READ_ONLY; } void * oh_get_el_info (void *, SaHpiResourceIdT, SaHpiEventLogInfoT *) __attribute__ ((weak, alias("snmp_bc_get_sel_info"))); void * oh_set_el_time (void *, SaHpiResourceIdT, const SaHpiEventT *) __attribute__ ((weak, alias("snmp_bc_set_sel_time"))); void * oh_add_el_entry (void *, SaHpiResourceIdT, const SaHpiEventT *) __attribute__ ((weak, alias("snmp_bc_add_sel_entry"))); void * oh_get_el_entry (void *, SaHpiResourceIdT, SaHpiEventLogEntryIdT, SaHpiEventLogEntryIdT *, SaHpiEventLogEntryIdT *, SaHpiEventLogEntryT *, SaHpiRdrT *, SaHpiRptEntryT *) __attribute__ ((weak, alias("snmp_bc_get_sel_entry"))); void * oh_clear_el (void *, SaHpiResourceIdT) __attribute__ ((weak, alias("snmp_bc_clear_sel"))); void * oh_reset_el_overflow (void *, SaHpiResourceIdT) __attribute__ ((weak, alias("snmp_bc_sel_overflowreset"))); void * oh_set_el_state(void *, SaHpiResourceIdT, SaHpiBoolT) __attribute__ ((weak, alias("snmp_bc_sel_state_set"))); openhpi-3.6.1/plugins/snmp_bc/Makefile.am0000644000175100017510000000560112575647274017336 0ustar mohanmohan# (C) Copyright IBM Corp 2003, 2006 # All rights reserved. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. MAINTAINERCLEANFILES = Makefile.in AM_CPPFLAGS = -DG_LOG_DOMAIN=\"snmp_bc\" # Generated files - need to keep in sync with t/Makefile.am GENERATED_EVENT_XML_MAP = event.xml GENERATED_EVENT_CODE = el2event.c GENERATED_CODE = $(GENERATED_EVENT_XML_MAP) $(GENERATED_EVENT_CODE) MOSTLYCLEANFILES = @TEST_CLEAN@ MOSTLYCLEANFILES += $(GENERATED_CODE) SNMPUTILSDIR = $(top_srcdir)/$(SNMPDIR) SNMPUTILBDIR = $(top_builddir)/$(SNMPDIR) SUBDIRS = t AM_CPPFLAGS += @OPENHPI_INCLUDES@ -I$(top_srcdir)/snmp -I$(SNMPUTILSDIR) AM_CFLAGS = @SNMPFLAGS@ pkglib_LTLIBRARIES = libsnmp_bc.la EXTRA_DIST = \ bc2hpi.pdf \ eventmap2code.pl \ snmp_bc_event.map \ snmp_bc.h \ snmp_bc_annunciator.h \ snmp_bc_control.h \ snmp_bc_discover.h \ snmp_bc_discover_bc.h \ snmp_bc_el.h \ snmp_bc_el2event.h \ snmp_bc_event.h \ snmp_bc_hotswap.h \ snmp_bc_inventory.h \ snmp_bc_plugin.h \ snmp_bc_power.h \ snmp_bc_reset.h \ snmp_bc_resources.h \ snmp_bc_sel.h \ snmp_bc_sensor.h \ snmp_bc_session.h \ snmp_bc_time.h \ snmp_bc_utils.h \ snmp_bc_watchdog.h \ snmp_bc_lock.h \ sim_init.h # Generated files must be listed first libsnmp_bc_la_SOURCES = \ sim_init.c \ snmp_bc.c \ snmp_bc_annunciator.c \ snmp_bc_control.c \ snmp_bc_discover.c \ snmp_bc_discover_bc.c \ snmp_bc_discover_rsa.c \ snmp_bc_event.c \ snmp_bc_hotswap.c \ snmp_bc_inventory.c \ snmp_bc_power.c \ snmp_bc_reset.c \ snmp_bc_resources.c \ snmp_bc_resources_rsa.c \ snmp_bc_sel.c \ snmp_bc_sensor.c \ snmp_bc_session.c \ snmp_bc_time.c \ snmp_bc_utils.c \ snmp_bc_watchdog.c \ snmp_bc_xml2event.c nodist_libsnmp_bc_la_SOURCES = $(GENERATED_EVENT_CODE) libsnmp_bc_la_LIBADD = -luuid @SNMPLIBS@ $(SNMPUTILBDIR)/libopenhpi_snmp.la $(top_builddir)/utils/libopenhpiutils.la libsnmp_bc_la_LDFLAGS = -module -version-info @HPI_LIB_VERSION@ #libsnmp_bc_la_LDFLAGS = -module -avoid-version # Note same rules and files are generated in the t sub-directory - Make sure # you change the t/Makefile.am, if you change these EVENT_MAP_FILE = $(top_srcdir)/plugins/snmp_bc/snmp_bc_event.map EVENT_MAP_SCRIPT = $(top_srcdir)/plugins/snmp_bc/eventmap2code.pl EVENT_XML_MAP_SCRIPT = $(top_srcdir)/scripts/text2cstr.pl $(GENERATED_EVENT_CODE): $(EVENT_MAP_FILE) $(EVENT_MAP_SCRIPT) $(EVENT_XML_MAP_SCRIPT) $(EVENT_MAP_SCRIPT) -xml -idir $(top_srcdir)/plugins/snmp_bc -mapfile snmp_bc_event.map $(EVENT_XML_MAP_SCRIPT) -s eventxml $(GENERATED_EVENT_XML_MAP) > $(GENERATED_EVENT_CODE) openhpi-3.6.1/plugins/snmp_bc/snmp_bc_control.h0000644000175100017510000000154112575647274020633 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #ifndef __SNMP_BC_CONTROL_H #define __SNMP_BC_CONTROL_H SaErrorT snmp_bc_get_control_state(void *hnd, SaHpiResourceIdT rid, SaHpiCtrlNumT cid, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state); SaErrorT snmp_bc_set_control_state(void *hnd, SaHpiResourceIdT rid, SaHpiCtrlNumT cid, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state); #endif openhpi-3.6.1/plugins/snmp_bc/snmp_bc_sensor.c0000644000175100017510000022750012575647274020464 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #include /** * snmp_bc_get_sensor_reading: * @hnd: Handler data pointer. * @rid: Resource ID. * @sid: Sensor ID. * @data: Location to store sensor's value (may be NULL). * @state: Location to store sensor's state (may be NULL). * * Retrieves a sensor's value and/or state. Both @data and @state * may be NULL, in which case this function can be used to test for * sensor presence. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_SENSOR. * SA_ERR_HPI_INVALID_REQUEST - Sensor is disabled. * SA_ERR_HPI_NOT_PRESENT - Sensor doesn't exist. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT snmp_bc_get_sensor_reading(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiSensorReadingT *reading, SaHpiEventStateT *state) { SaErrorT err; SaHpiSensorReadingT working_reading; SaHpiEventStateT working_state; struct SensorInfo *sinfo; struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; SaHpiRptEntryT *rpt; SaHpiRdrT *rdr; if (!hnd) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } snmp_bc_lock_handler(custom_handle); /* Check if resource exists and has sensor capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_CAPABILITY); } /* Check if sensor exists and is enabled */ rdr = oh_get_rdr_by_type(handle->rptcache, rid, SAHPI_SENSOR_RDR, sid); if (rdr == NULL) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_NOT_PRESENT); } sinfo = (struct SensorInfo *)oh_get_rdr_data(handle->rptcache, rid, rdr->RecordId); if (sinfo == NULL) { snmp_bc_unlock_handler(custom_handle); err("No sensor data. Sensor=%s", rdr->IdString.Data); return(SA_ERR_HPI_INTERNAL_ERROR); } if (sinfo->sensor_enabled == SAHPI_FALSE) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_REQUEST); } memset(&working_reading, 0, sizeof(SaHpiSensorReadingT)); working_state = SAHPI_ES_UNSPECIFIED; dbg("Sensor Reading: Resource=%s; RDR=%s", rpt->ResourceTag.Data, rdr->IdString.Data); /************************************************************ * Get sensor's reading. * Need to go through this logic, since user may request just * the event state for a readable sensor. Need to translate * sensor reading to event in this case. ************************************************************/ if (rdr->RdrTypeUnion.SensorRec.DataFormat.IsSupported == SAHPI_TRUE) { err = SA_OK; if ((sid == BLADECENTER_SENSOR_NUM_MGMNT_ACTIVE) || (sid == BLADECENTER_SENSOR_NUM_MGMNT_STANDBY)) { err = snmp_bc_get_logical_sensors(hnd, rid, sid, &working_reading); } else if (sid == BLADECENTER_SENSOR_NUM_SLOT_STATE) { err = snmp_bc_get_slot_state_sensor(hnd, rid, sid, &working_reading); } else if ( (sid == BLADECENTER_SENSOR_NUM_MAX_POWER) || (sid == BLADECENTER_SENSOR_NUM_ASSIGNED_POWER) || (sid == BLADECENTER_SENSOR_NUM_MIN_POWER) ) { err = snmp_bc_get_slot_power_sensor(hnd, rid, sid, &working_reading); } else /* Normal sensors */ { err = snmp_bc_get_sensor_oid_reading(hnd, rid, sid, sinfo->mib.oid, &working_reading); } if (err) { err("Cannot determine sensor's reading. Error=%s", oh_lookup_error(err)); snmp_bc_unlock_handler(custom_handle); return(err); } } else { working_reading.IsSupported = SAHPI_FALSE; } /****************************************************************** * Get sensor's event state. * Always get the event state, to reset the sensor's current state, * whether caller wants to know event state or not. ******************************************************************/ err = snmp_bc_get_sensor_eventstate(hnd, rid, sid, &working_reading, &working_state); if (err) { err("Cannot determine sensor's event state. Error=%s", oh_lookup_error(err)); snmp_bc_unlock_handler(custom_handle); return(err); } #if 0 { /* Debug section */ SaHpiTextBufferT buffer; dbg("Sensor=%s", rdr->IdString.Data); oh_decode_sensorreading(working_reading, rdr->RdrTypeUnion.SensorRec.DataFormat, &buffer); dbg(" Reading: %s.", buffer.Data); oh_decode_eventstate(working_state, rdr->RdrTypeUnion.SensorRec.Category, &buffer); dbg(" Event State: %s\n", buffer.Data); } #endif /* sinfo->cur_state = working_state; */ if (reading) memcpy(reading, &working_reading, sizeof(SaHpiSensorReadingT)); if (state) memcpy(state, &working_state, sizeof(SaHpiEventStateT)); snmp_bc_unlock_handler(custom_handle); return(SA_OK); } /** * snmp_bc_get_sensor_eventstate: * @hnd: Handler data pointer. * @rid: Resource ID. * @sid: Sensor ID. * @reading: Location of sensor's reading * @state: Location to store sensor's state. * * Translates and sensor's reading into an event state(s). * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_SENSOR. * SA_ERR_HPI_INVALID_REQUEST - Sensor is disabled. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. * SA_ERR_HPI_NOT_PRESENT - Sensor doesn't exist. **/ SaErrorT snmp_bc_get_sensor_eventstate(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiSensorReadingT *reading, SaHpiEventStateT *state) { int i; struct SensorInfo *sinfo; struct oh_handler_state *handle; SaHpiRptEntryT *rpt; SaHpiRdrT *rdr; SaErrorT err; if (!hnd || !reading || !state) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } handle = (struct oh_handler_state *)hnd; /* Check if resource exists and has sensor capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) return(SA_ERR_HPI_INVALID_RESOURCE); if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) return(SA_ERR_HPI_CAPABILITY); /* Check if sensor exist and is enabled */ rdr = oh_get_rdr_by_type(handle->rptcache, rid, SAHPI_SENSOR_RDR, sid); if (rdr == NULL) return(SA_ERR_HPI_NOT_PRESENT); sinfo = (struct SensorInfo *)oh_get_rdr_data(handle->rptcache, rid, rdr->RecordId); if (sinfo == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); return(SA_ERR_HPI_INTERNAL_ERROR); } if (sinfo->sensor_enabled == SAHPI_FALSE) return(SA_ERR_HPI_INVALID_REQUEST); /* If sensor is not readable, return current event state */ if (rdr->RdrTypeUnion.SensorRec.DataFormat.IsSupported == SAHPI_FALSE) { *state = sinfo->cur_state; return(SA_OK); } /*************************************************************************** * Translate reading into event state. Algorithm is: * - If sensor is a threshold and has readable thresholds. * - If so, check from most severe to least * - If not found or (not a threshold value && not present sensor), search reading2event array. * - Check for Ranges supported; return after first match. * - Nominal only - reading must match nominal value * - Max && Min - min value <= reading <= max value * - Max only - reading > max value * - Min only - reading < min value * - else SAHPI_ES_UNSPECIFIED ***************************************************************************/ if (rdr->RdrTypeUnion.SensorRec.Category == SAHPI_EC_THRESHOLD && rdr->RdrTypeUnion.SensorRec.ThresholdDefn.ReadThold != 0) { SaHpiSensorThresholdsT thres; memset(&thres, 0, sizeof(SaHpiSensorThresholdsT)); err = snmp_bc_get_sensor_thresholds(hnd, rid, sid, &thres); if (err) { err("Cannot get sensor thresholds for Sensor=%s. Error=%s", rdr->IdString.Data, oh_lookup_error(err)); return(err); } if (thres.LowCritical.IsSupported == SAHPI_TRUE) { if (oh_compare_sensorreading(reading->Type, reading, &thres.LowCritical) <= 0) { *state = *state | SAHPI_ES_LOWER_CRIT; return(SA_OK); } } if (thres.LowMajor.IsSupported == SAHPI_TRUE) { if (oh_compare_sensorreading(reading->Type, reading, &thres.LowMajor) <= 0) { *state = *state | SAHPI_ES_LOWER_MAJOR; return(SA_OK); } } if (thres.LowMinor.IsSupported == SAHPI_TRUE) { if (oh_compare_sensorreading(reading->Type, reading, &thres.LowMinor) <= 0) { *state = *state | SAHPI_ES_LOWER_MINOR; return(SA_OK); } } if (thres.UpCritical.IsSupported == SAHPI_TRUE) { if (oh_compare_sensorreading(reading->Type, reading, &thres.UpCritical) >= 0) { *state = *state | SAHPI_ES_UPPER_CRIT; return(SA_OK); } } if (thres.UpMajor.IsSupported == SAHPI_TRUE) { if (oh_compare_sensorreading(reading->Type, reading, &thres.UpMajor) >= 0) { *state = *state | SAHPI_ES_UPPER_MAJOR; return(SA_OK); } } if (thres.UpMinor.IsSupported == SAHPI_TRUE) { if (oh_compare_sensorreading(reading->Type, reading, &thres.UpMinor) >= 0) { *state = *state | SAHPI_ES_UPPER_MINOR; return(SA_OK); } } } else if (rdr->RdrTypeUnion.SensorRec.Category == SAHPI_EC_PRESENCE) { if ((sid == BLADECENTER_SENSOR_NUM_SLOT_STATE) || (sid == BLADECENTER_SENSOR_NUM_MGMNT_STANDBY)) *state = sinfo->cur_state; else *state = SAHPI_ES_PRESENT; } else { /* Check reading2event array */ for (i=0; i < SNMP_BC_MAX_SENSOR_READING_MAP_ARRAY_SIZE && sinfo->reading2event[i].num != 0; i++) { /* reading == nominal */ if (sinfo->reading2event[i].rangemap.Flags & SAHPI_SRF_NOMINAL) { if (oh_compare_sensorreading(reading->Type, reading, &sinfo->reading2event[i].rangemap.Nominal) == 0) { *state = sinfo->reading2event[i].state; return(SA_OK); } } /* min <= reading <= max */ if (sinfo->reading2event[i].rangemap.Flags & SAHPI_SRF_MAX && sinfo->reading2event[i].rangemap.Flags & SAHPI_SRF_MIN) { if (oh_compare_sensorreading(reading->Type, reading, &sinfo->reading2event[i].rangemap.Min) >= 0 && oh_compare_sensorreading(reading->Type, reading, &sinfo->reading2event[i].rangemap.Max) <= 0) { *state = sinfo->reading2event[i].state; return(SA_OK); } } /* reading > max */ if (sinfo->reading2event[i].rangemap.Flags & SAHPI_SRF_MAX && !(sinfo->reading2event[i].rangemap.Flags & SAHPI_SRF_MIN)) { if (oh_compare_sensorreading(reading->Type, reading, &sinfo->reading2event[i].rangemap.Max) > 0) { *state = sinfo->reading2event[i].state; return(SA_OK); } } /* reading < min */ if (!(sinfo->reading2event[i].rangemap.Flags & SAHPI_SRF_MAX) && sinfo->reading2event[i].rangemap.Flags & SAHPI_SRF_MIN) { if (oh_compare_sensorreading(reading->Type, reading, &sinfo->reading2event[i].rangemap.Min) < 0) { *state = sinfo->reading2event[i].state; return(SA_OK); } } } /* Unfortunately for thresholds, this also means normal */ *state = SAHPI_ES_UNSPECIFIED; } return(SA_OK); } #define get_threshold(thdmask, thdname) \ do { \ if (rdr->RdrTypeUnion.SensorRec.ThresholdDefn.ReadThold & thdmask) { \ if (sinfo->mib.threshold_oids.thdname == NULL || \ sinfo->mib.threshold_oids.thdname[0] == '\0') { \ err("No OID defined for readable threshold. Sensor=%s", rdr->IdString.Data); \ snmp_bc_unlock_handler(custom_handle); \ return(SA_ERR_HPI_INTERNAL_ERROR); \ } \ err = snmp_bc_get_sensor_oid_reading(hnd, rid, sid, \ sinfo->mib.threshold_oids.thdname, \ &(working.thdname)); \ if (err) { \ snmp_bc_unlock_handler(custom_handle); \ return(err); \ } \ if (working.thdname.Type == SAHPI_SENSOR_READING_TYPE_BUFFER) { \ err("Sensor type SAHPI_SENSOR_READING_TYPE_BUFFER cannot have thresholds. Sensor=%s", \ rdr->IdString.Data); \ snmp_bc_unlock_handler(custom_handle); \ return(SA_ERR_HPI_INTERNAL_ERROR); \ } \ found_thresholds = found_thresholds | thdmask; \ } \ else { \ working.thdname.IsSupported = SAHPI_FALSE; \ } \ } while(0) /** * snmp_bc_get_virtual_MM_sensor: * @hnd: Handler data pointer. * @rid: Resource ID. * @sid: Sensor ID. * @reading: Location of sensor's reading * * Re-direct and read sensors from real physical MM for Virtual MM.. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_SENSOR. * SA_ERR_HPI_INVALID_REQUEST - Sensor is disabled. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. * SA_ERR_HPI_NOT_PRESENT - Sensor doesn't exist. **/ SaErrorT snmp_bc_get_logical_sensors(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiSensorReadingT *reading) { struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; struct snmp_value mm_install_mask, active_mm_id; SaHpiEntityPathT ep_root, res_ep; char * root_tuple; int mm_id; SaErrorT err; if (!hnd) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } err = SA_OK; handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } /* Fetch MMs installed vector */ get_installed_mask(SNMP_BC_MM_INSTALLED, mm_install_mask); /* Fetch Active MM ID */ err = snmp_bc_snmp_get(custom_handle, SNMP_BC_MGMNT_ACTIVE, &active_mm_id, SAHPI_TRUE); if (err || active_mm_id.type != ASN_INTEGER) { err("Cannot get SNMP_BC_MGMNT_ACTIVE=%s; Received Type=%d; Error=%s.", SNMP_BC_MGMNT_ACTIVE, active_mm_id.type, oh_lookup_error(err)); if (err) { return(err); } else { return(SA_ERR_HPI_INTERNAL_ERROR); } } mm_id = SNMP_BC_NOT_VALID; /* Init it to someting invalid, so we can visually catch error */ switch (sid) { case BLADECENTER_SENSOR_NUM_MGMNT_ACTIVE: mm_id = active_mm_id.integer; break; case BLADECENTER_SENSOR_NUM_MGMNT_STANDBY: if ( atoi(mm_install_mask.string) > 10) { switch(active_mm_id.integer) { case 1: mm_id = 2; break; case 2: mm_id = 1; break; default: err("Internal Error."); break; } } break; default: err("Should not be here. sid is not one of the special sensors."); break; } /* Complete Sensor Read record */ reading->IsSupported = SAHPI_TRUE; reading->Type = SAHPI_SENSOR_READING_TYPE_UINT64; if (mm_id != SNMP_BC_NOT_VALID) { root_tuple = (char *)g_hash_table_lookup(handle->config, "entity_root"); if (root_tuple == NULL) { err("Cannot find configuration parameter."); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } err = oh_encode_entitypath(root_tuple, &ep_root); res_ep = snmp_bc_rpt_array[BC_RPT_ENTRY_MGMNT_MODULE].rpt.ResourceEntity; oh_concat_ep(&res_ep, &ep_root); oh_set_ep_location(&res_ep, BLADECENTER_SYS_MGMNT_MODULE_SLOT, mm_id); oh_set_ep_location(&res_ep, SAHPI_ENT_SYS_MGMNT_MODULE, mm_id); reading->Value.SensorUint64 = (SaHpiUint64T) oh_uid_from_entity_path(&res_ep); } else { reading->Value.SensorUint64 = SAHPI_UNSPECIFIED_RESOURCE_ID; } return(err); } /** * snmp_bc_get_sensor_thresholds: * @hnd: Handler data pointer. * @rid: Resource ID. * @sid: Sensor ID. * @thres: Location to store sensor's threshold values. * * Retreives sensor's threshold values, if defined. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_SENSOR. * SA_ERR_HPI_INVALID_CMD - Sensor is not threshold type, has accessible or readable thresholds. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. * SA_ERR_HPI_NOT_PRESENT - Sensor doesn't exist. **/ SaErrorT snmp_bc_get_sensor_thresholds(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiSensorThresholdsT *thres) { int upper_thresholds, lower_thresholds; SaHpiSensorThdMaskT found_thresholds; SaHpiSensorThresholdsT working; struct SensorInfo *sinfo; struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; SaHpiRptEntryT *rpt; SaHpiRdrT *rdr; SaErrorT err; if (!hnd || !thres) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; snmp_bc_lock_handler(custom_handle); /* Check if resource exists and has sensor capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_CAPABILITY); } /* Check if sensor exits and has readable thresholds */ rdr = oh_get_rdr_by_type(handle->rptcache, rid, SAHPI_SENSOR_RDR, sid); if (rdr == NULL){ snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_NOT_PRESENT); } sinfo = (struct SensorInfo *)oh_get_rdr_data(handle->rptcache, rid, rdr->RecordId); if (sinfo == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } if (rdr->RdrTypeUnion.SensorRec.Category != SAHPI_EC_THRESHOLD || rdr->RdrTypeUnion.SensorRec.ThresholdDefn.IsAccessible == SAHPI_FALSE || rdr->RdrTypeUnion.SensorRec.ThresholdDefn.ReadThold == 0) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_CMD); } memset(&working, 0, sizeof(SaHpiSensorThresholdsT)); found_thresholds = lower_thresholds = upper_thresholds = 0; get_threshold(SAHPI_STM_LOW_MINOR, LowMinor); if (found_thresholds & SAHPI_STM_LOW_MINOR) lower_thresholds++; get_threshold(SAHPI_STM_LOW_MAJOR, LowMajor); if (found_thresholds & SAHPI_STM_LOW_MAJOR) lower_thresholds++; get_threshold(SAHPI_STM_LOW_CRIT, LowCritical); if (found_thresholds & SAHPI_STM_LOW_CRIT) lower_thresholds++; get_threshold(SAHPI_STM_UP_MINOR, UpMinor); if (found_thresholds & SAHPI_STM_UP_MINOR) upper_thresholds++; get_threshold(SAHPI_STM_UP_MAJOR, UpMajor); if (found_thresholds & SAHPI_STM_UP_MAJOR) upper_thresholds++; get_threshold(SAHPI_STM_UP_CRIT, UpCritical); if (found_thresholds & SAHPI_STM_UP_CRIT) upper_thresholds++; /************************************************************************ * Find Hysteresis Values * * Hardware can define hysteresis values two ways: * * - As delta values as defined in the spec. In this case, * PosThdHysteresis and/or NegThdHysteresis values are defined * and this routine just returns those values. * * - Total values - as in threshold is 80 degrees; positive hysteresis is * defined to be 78 degrees. In this case, TotalPosThdHysteresis and/or * TotalNegThdHysteresis are defined and this routine needs to make * the required calculations to return to the user a delta value. Total * values can only be used if: * 1) if there is more thanone upper/lower threshold defined, the least * critical threshold is used as the base for calculating delta values. * 2) Total values cannot be of type SAHPI_SENSOR_READING_TYPE_UINT64 or * SAHPI_SENSOR_READING_TYPE_BUFFER. * * Code can support a delta value for one set of thresholds (upper or * lower) and a total value for the opposite set. *************************************************************************/ if (sinfo->mib.threshold_oids.NegThdHysteresis) { get_threshold(SAHPI_STM_LOW_HYSTERESIS, NegThdHysteresis); } if (sinfo->mib.threshold_oids.PosThdHysteresis) { get_threshold(SAHPI_STM_UP_HYSTERESIS, PosThdHysteresis); } /* Negative Total Hysteresis - applies to lower thresholds */ if (sinfo->mib.threshold_oids.TotalNegThdHysteresis) { SaHpiSensorReadingT reading; if (found_thresholds & SAHPI_STM_LOW_HYSTERESIS) { err("Cannot define both delta and total negative hysteresis. Sensor=%s", rdr->IdString.Data); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } if (lower_thresholds == 0) { err("No lower thresholds are defined for total negative hysteresis. Sensor=%s", rdr->IdString.Data); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } /* Get negative hysteresis value */ err = snmp_bc_get_sensor_oid_reading(hnd, rid, sid, sinfo->mib.threshold_oids.TotalNegThdHysteresis, &reading); if (err) { snmp_bc_unlock_handler(custom_handle); return(err); } switch (rdr->RdrTypeUnion.SensorRec.DataFormat.ReadingType) { case SAHPI_SENSOR_READING_TYPE_INT64: { SaHpiInt64T delta; if (found_thresholds & SAHPI_STM_LOW_MINOR) { delta = reading.Value.SensorInt64 - working.LowMinor.Value.SensorInt64; } else { if (found_thresholds & SAHPI_STM_LOW_MAJOR) { delta = reading.Value.SensorInt64 - working.LowMajor.Value.SensorInt64; } else { delta = reading.Value.SensorInt64 - working.LowCritical.Value.SensorInt64; } } if (delta < 0) { err("Negative hysteresis delta is less than 0"); working.NegThdHysteresis.IsSupported = SAHPI_FALSE; } else { working.NegThdHysteresis.IsSupported = SAHPI_TRUE; working.NegThdHysteresis.Type = SAHPI_SENSOR_READING_TYPE_INT64; working.NegThdHysteresis.Value.SensorInt64 = delta; } break; } case SAHPI_SENSOR_READING_TYPE_FLOAT64: { SaHpiFloat64T delta; if (found_thresholds & SAHPI_STM_LOW_MINOR) { delta = reading.Value.SensorFloat64 - working.LowMinor.Value.SensorFloat64; } else { if (found_thresholds & SAHPI_STM_LOW_MAJOR) { delta = reading.Value.SensorFloat64 - working.LowMajor.Value.SensorFloat64; } else { delta = reading.Value.SensorFloat64 - working.LowCritical.Value.SensorFloat64; } } if (delta < 0) { err("Negative hysteresis delta is less than 0"); working.NegThdHysteresis.IsSupported = SAHPI_FALSE; } else { working.NegThdHysteresis.IsSupported = SAHPI_TRUE; working.NegThdHysteresis.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; working.NegThdHysteresis.Value.SensorFloat64 = delta; } break; } case SAHPI_SENSOR_READING_TYPE_UINT64: case SAHPI_SENSOR_READING_TYPE_BUFFER: default: err("Invalid reading type for threshold. Sensor=%s", rdr->IdString.Data); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } } /* Positive Total Hysteresis - applies to upper thresholds */ if (sinfo->mib.threshold_oids.TotalPosThdHysteresis) { SaHpiSensorReadingT reading; if (found_thresholds & SAHPI_STM_UP_HYSTERESIS) { err("Cannot define both delta and total positive hysteresis. Sensor=%s", rdr->IdString.Data); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } if (upper_thresholds == 0) { err("No upper thresholds are defined for total positive hysteresis. Sensor=%s", rdr->IdString.Data); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } /* Get positive hysteresis value */ err = snmp_bc_get_sensor_oid_reading(hnd, rid, sid, sinfo->mib.threshold_oids.TotalPosThdHysteresis, &reading); if (err) { snmp_bc_unlock_handler(custom_handle); return(err); } switch (rdr->RdrTypeUnion.SensorRec.DataFormat.ReadingType) { case SAHPI_SENSOR_READING_TYPE_INT64: { SaHpiInt64T delta; if (found_thresholds & SAHPI_STM_UP_MINOR) { delta = working.UpMinor.Value.SensorInt64 - reading.Value.SensorInt64; } else { if (found_thresholds & SAHPI_STM_UP_MAJOR) { delta = working.UpMajor.Value.SensorInt64 - reading.Value.SensorInt64; } else { delta = working.UpCritical.Value.SensorInt64 - reading.Value.SensorInt64; } } if (delta < 0) { err("Positive hysteresis delta is less than 0"); working.PosThdHysteresis.IsSupported = SAHPI_FALSE; } else { working.PosThdHysteresis.IsSupported = SAHPI_TRUE; working.PosThdHysteresis.Type = SAHPI_SENSOR_READING_TYPE_INT64; working.PosThdHysteresis.Value.SensorInt64 = delta; } break; } case SAHPI_SENSOR_READING_TYPE_FLOAT64: { SaHpiFloat64T delta; if (found_thresholds & SAHPI_STM_UP_MINOR) { delta = working.UpMinor.Value.SensorFloat64 - reading.Value.SensorFloat64; } else { if (found_thresholds & SAHPI_STM_UP_MAJOR) { delta = working.UpMajor.Value.SensorFloat64 - reading.Value.SensorFloat64; } else { delta = working.UpCritical.Value.SensorFloat64 - reading.Value.SensorFloat64; } } if (delta < 0) { err("Positive hysteresis delta is less than 0"); working.PosThdHysteresis.IsSupported = SAHPI_FALSE; } else { working.PosThdHysteresis.IsSupported = SAHPI_TRUE; working.PosThdHysteresis.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; working.PosThdHysteresis.Value.SensorFloat64 = delta; } break; } case SAHPI_SENSOR_READING_TYPE_UINT64: case SAHPI_SENSOR_READING_TYPE_BUFFER: default: err("Invalid reading type for threshold. Sensor=%s", rdr->IdString.Data); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } } if (found_thresholds == 0) { err("No readable thresholds found. Sensor=%s", rdr->IdString.Data); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } memcpy(thres, &working, sizeof(SaHpiSensorThresholdsT)); snmp_bc_unlock_handler(custom_handle); return(SA_OK); } #define merge_threshold(thdname) \ do { \ if (thres->thdname.IsSupported) { \ working.thdname.IsSupported = SAHPI_TRUE; \ working.thdname.Type = thres->thdname.Type; \ switch(thres->thdname.Type) { \ case SAHPI_SENSOR_READING_TYPE_INT64: \ working.thdname.Value.SensorInt64 = thres->thdname.Value.SensorInt64; \ break; \ case SAHPI_SENSOR_READING_TYPE_FLOAT64: \ working.thdname.Value.SensorFloat64 = thres->thdname.Value.SensorFloat64; \ break; \ case SAHPI_SENSOR_READING_TYPE_UINT64: \ working.thdname.Value.SensorUint64 = thres->thdname.Value.SensorUint64; \ break; \ case SAHPI_SENSOR_READING_TYPE_BUFFER: \ default: \ err("Invalid threshold reading type."); \ snmp_bc_unlock_handler(custom_handle); \ return(SA_ERR_HPI_INVALID_CMD); \ } \ } \ } while(0) #define write_valid_threshold(thdname) \ do { \ if (thres->thdname.IsSupported) { \ if (sinfo->mib.threshold_write_oids.thdname == NULL || \ sinfo->mib.threshold_oids.thdname[0] == '\0') { \ err("No writable threshold OID defined for thdname."); \ snmp_bc_unlock_handler(custom_handle); \ return(SA_ERR_HPI_INTERNAL_ERROR); \ } \ err = snmp_bc_set_threshold_reading(hnd, rid, sid, \ sinfo->mib.threshold_write_oids.thdname, \ &(working.thdname)); \ if (err) { \ snmp_bc_unlock_handler(custom_handle); \ return(err); \ } \ } \ } while(0) /** * snmp_bc_set_sensor_thresholds: * @hnd: Handler data pointer. * @rid: Resource ID. * @sid: Sensor ID. * @thres: Location of sensor's settable threshold values. * * Sets sensor's threshold values. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_SENSOR. * SA_ERR_HPI_INVALID_CMD - Non-writable thresholds or invalid thresholds. * SA_ERR_HPI_INVALID_DATA - Threshold values out of order; negative hysteresis * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. * SA_ERR_HPI_NOT_PRESENT - Sensor doesn't exist. **/ SaErrorT snmp_bc_set_sensor_thresholds(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, const SaHpiSensorThresholdsT *thres) { SaErrorT err; SaHpiSensorThresholdsT working; struct oh_handler_state *handle; struct SensorInfo *sinfo; struct snmp_bc_hnd *custom_handle; SaHpiRptEntryT *rpt; SaHpiRdrT *rdr; if (!hnd || !thres) { err("Invalid parameter"); return(SA_ERR_HPI_INVALID_PARAMS); } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; snmp_bc_lock_handler(custom_handle); /* Check if resource exists and has sensor capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_CAPABILITY); } /* Check if sensor exists and has writable thresholds */ rdr = oh_get_rdr_by_type(handle->rptcache, rid, SAHPI_SENSOR_RDR, sid); if (rdr == NULL) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_NOT_PRESENT); } sinfo = (struct SensorInfo *)oh_get_rdr_data(handle->rptcache, rid, rdr->RecordId); if (sinfo == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } if (rdr->RdrTypeUnion.SensorRec.Category != SAHPI_EC_THRESHOLD || rdr->RdrTypeUnion.SensorRec.ThresholdDefn.IsAccessible == SAHPI_FALSE || rdr->RdrTypeUnion.SensorRec.ThresholdDefn.WriteThold == 0) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_CMD); } /* Overlay proposed thresholds on top of existing ones and validate */ err = snmp_bc_get_sensor_thresholds(hnd, rid, sid, &working); if (err) { snmp_bc_unlock_handler(custom_handle); return(err); } merge_threshold(LowCritical); merge_threshold(LowMajor); merge_threshold(LowMinor); merge_threshold(UpCritical); merge_threshold(UpMajor); merge_threshold(UpMinor); merge_threshold(PosThdHysteresis); merge_threshold(NegThdHysteresis); err = oh_valid_thresholds(&working, rdr); if (err) { snmp_bc_unlock_handler(custom_handle); return(err); } /************************ * Write valid thresholds ************************/ write_valid_threshold(UpCritical); write_valid_threshold(UpMajor); write_valid_threshold(UpMinor); write_valid_threshold(LowCritical); write_valid_threshold(LowMajor); write_valid_threshold(LowMinor); /* We don't support writing total value hysteresis only deltas */ write_valid_threshold(NegThdHysteresis); write_valid_threshold(PosThdHysteresis); snmp_bc_unlock_handler(custom_handle); return(SA_OK); } SaErrorT snmp_bc_get_sensor_oid_reading(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, const char *raw_oid, SaHpiSensorReadingT *reading) { SaHpiSensorReadingT working; SaErrorT err; struct SensorInfo *sinfo; struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; struct snmp_value get_value; SaHpiEntityPathT valEntity; SaHpiRdrT *rdr; handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; rdr = oh_get_rdr_by_type(handle->rptcache, rid, SAHPI_SENSOR_RDR, sid); if (rdr == NULL) return(SA_ERR_HPI_NOT_PRESENT); sinfo = (struct SensorInfo *)oh_get_rdr_data(handle->rptcache, rid, rdr->RecordId); if (sinfo == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); return(SA_ERR_HPI_INTERNAL_ERROR); } /* Normalize and read sensor's raw SNMP OID */ err = snmp_bc_validate_ep(&(rdr->Entity), &valEntity); err = snmp_bc_oid_snmp_get(custom_handle, &valEntity, sinfo->mib.loc_offset, raw_oid, &get_value, SAHPI_TRUE); if (err) { err("SNMP cannot read sensor OID=%s. Type=%d", raw_oid, get_value.type); return(err); } /* Convert SNMP value to HPI reading value */ working.IsSupported = SAHPI_TRUE; if (get_value.type == ASN_INTEGER) { working.Type = SAHPI_SENSOR_READING_TYPE_INT64; working.Value.SensorInt64 = (SaHpiInt64T)get_value.integer; } else { SaHpiTextBufferT buffer; oh_init_textbuffer(&buffer); oh_append_textbuffer(&buffer, get_value.string); err = oh_encode_sensorreading(&buffer, rdr->RdrTypeUnion.SensorRec.DataFormat.ReadingType, &working); if (err) { err("Cannot convert sensor OID=%s value=%s. Error=%s", sinfo->mib.oid, buffer.Data, oh_lookup_error(err)); return(SA_ERR_HPI_INTERNAL_ERROR); } } memcpy(reading, &working, sizeof(SaHpiSensorReadingT)); return(SA_OK); } SaErrorT snmp_bc_set_threshold_reading(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, const char *raw_oid, const SaHpiSensorReadingT *reading) { SaErrorT err; SaHpiTextBufferT buffer; SaHpiFloat64T tmp_num; struct SensorInfo *sinfo; struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; struct snmp_value set_value; SaHpiEntityPathT valEntity; SaHpiRdrT *rdr; if (!hnd || !reading || !raw_oid) { err("Invalid parameter."); return(SA_ERR_HPI_INTERNAL_ERROR); } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; rdr = oh_get_rdr_by_type(handle->rptcache, rid, SAHPI_SENSOR_RDR, sid); if (rdr == NULL) return(SA_ERR_HPI_NOT_PRESENT); sinfo = (struct SensorInfo *)oh_get_rdr_data(handle->rptcache, rid, rdr->RecordId); if (sinfo == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); return(SA_ERR_HPI_INTERNAL_ERROR); } /* Convert reading into SNMP string structure */ err = oh_init_textbuffer(&buffer); if (err) return(err); switch (reading->Type) { case SAHPI_SENSOR_READING_TYPE_INT64: tmp_num = (SaHpiFloat64T)reading->Value.SensorInt64; break; case SAHPI_SENSOR_READING_TYPE_FLOAT64: tmp_num = reading->Value.SensorFloat64; break; case SAHPI_SENSOR_READING_TYPE_UINT64: tmp_num = (SaHpiFloat64T)reading->Value.SensorUint64; break; case SAHPI_SENSOR_READING_TYPE_BUFFER: default: err("Invalid type for threshold. Sensor=%s", rdr->IdString.Data); return(SA_ERR_HPI_INTERNAL_ERROR); } /************************************************************* * NOTE! Assuming max format for writable thresholds is ddd.dd *************************************************************/ snprintf((char *)buffer.Data, SAHPI_MAX_TEXT_BUFFER_LENGTH, "%'+3.2f", tmp_num); /* Copy string to SNMP structure */ set_value.type = ASN_OCTET_STR; g_ascii_strncasecmp(set_value.string, (char *)buffer.Data, buffer.DataLength); /* Normalize and read sensor's raw SNMP OID */ err = snmp_bc_validate_ep(&(rdr->Entity), &valEntity); err = snmp_bc_oid_snmp_set(custom_handle, &valEntity, sinfo->mib.loc_offset, raw_oid, set_value); if (err) { err("SNMP cannot set sensor OID=%s.", raw_oid); return(err); } return(SA_OK); } /** * snmp_bc_get_sensor_enable: * @hnd: Handler data pointer. * @rid: Resource ID. * @sid: Sensor ID. * @enable: Location to store sensor's enablement boolean. * * Retrieves a sensor's boolean enablement status. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - @enable is NULL. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_SENSOR. * SA_ERR_HPI_NOT_PRESENT - Sensor doesn't exist. **/ SaErrorT snmp_bc_get_sensor_enable(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiBoolT *enable) { struct oh_handler_state *handle; struct SensorInfo *sinfo; struct snmp_bc_hnd *custom_handle; SaHpiRptEntryT *rpt; SaHpiRdrT *rdr; if (!hnd || !enable) { err("Invalid parameter"); return(SA_ERR_HPI_INVALID_PARAMS); } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; snmp_bc_lock_handler(custom_handle); /* Check if resource exists and has sensor capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_CAPABILITY); } /* Check if sensor exists and return enablement status */ rdr = oh_get_rdr_by_type(handle->rptcache, rid, SAHPI_SENSOR_RDR, sid); if (rdr == NULL) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_NOT_PRESENT); } sinfo = (struct SensorInfo *)oh_get_rdr_data(handle->rptcache, rid, rdr->RecordId); if (sinfo == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } *enable = sinfo->sensor_enabled; snmp_bc_unlock_handler(custom_handle); return(SA_OK); } /** * snmp_bc_set_sensor_enable: * @hnd: Handler data pointer. * @rid: Resource ID. * @sid: Sensor ID. * @enable: Enable/disable sensor. * * Sets a sensor's boolean enablement status. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_SENSOR. * SA_ERR_HPI_NOT_PRESENT - Sensor doesn't exist. **/ SaErrorT snmp_bc_set_sensor_enable(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, const SaHpiBoolT enable) { struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; SaHpiRptEntryT *rpt; SaHpiRdrT *rdr; struct SensorInfo *sinfo; if (!hnd ) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; snmp_bc_lock_handler(custom_handle); /* Check if resource exists and has sensor capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_CAPABILITY); } /* Check if sensor exists and if it supports setting of sensor enablement */ rdr = oh_get_rdr_by_type(handle->rptcache, rid, SAHPI_SENSOR_RDR, sid); if (rdr == NULL) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_NOT_PRESENT); } if (rdr->RdrTypeUnion.SensorRec.EnableCtrl == SAHPI_TRUE) { err("BladeCenter/RSA do not support snmp_bc_set_sensor_enable"); sinfo = (struct SensorInfo *)oh_get_rdr_data(handle->rptcache, rid, rdr->RecordId); if (sinfo == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } if (sinfo->sensor_enabled != enable) { /* Probably need to drive an OID, if hardware supported it */ sinfo->sensor_enabled = enable; /* FIXME:: Add SAHPI_ET_SENSOR_ENABLE_CHANGE event on IF event Q */ } } else { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_READ_ONLY); } snmp_bc_unlock_handler(custom_handle); return(SA_OK); } /** * snmp_bc_get_sensor_event_enable: * @hnd: Handler data pointer. * @rid: Resource ID. * @sid: Sensor ID. * @enable: Location to store sensor event enablement boolean. * * Retrieves a sensor's boolean event enablement status. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_SENSOR. * SA_ERR_HPI_NOT_PRESENT - Sensor doesn't exist. **/ SaErrorT snmp_bc_get_sensor_event_enable(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiBoolT *enable) { struct oh_handler_state *handle; struct SensorInfo *sinfo; struct snmp_bc_hnd *custom_handle; SaHpiRptEntryT *rpt; SaHpiRdrT *rdr; if (!hnd || !enable) { err("Invalid parameter"); return(SA_ERR_HPI_INVALID_PARAMS); } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; snmp_bc_lock_handler(custom_handle); /* Check if resource exists and has sensor capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_CAPABILITY); } /* Check if sensor exists and return enablement status */ rdr = oh_get_rdr_by_type(handle->rptcache, rid, SAHPI_SENSOR_RDR, sid); if (rdr == NULL) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_NOT_PRESENT); } sinfo = (struct SensorInfo *)oh_get_rdr_data(handle->rptcache, rid, rdr->RecordId); if (sinfo == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } *enable = sinfo->events_enabled; snmp_bc_unlock_handler(custom_handle); return(SA_OK); } /** * snmp_bc_set_sensor_event_enable: * @hnd: Handler data pointer. * @rid: Resource ID. * @sid: Sensor ID. * @enable: Enable/disable sensor. * * Sets a sensor's boolean event enablement status. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_SENSOR. * SA_ERR_HPI_NOT_PRESENT - Sensor doesn't exist. **/ SaErrorT snmp_bc_set_sensor_event_enable(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, const SaHpiBoolT enable) { struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; SaHpiRptEntryT *rpt; SaHpiRdrT *rdr; struct SensorInfo *sinfo; if (!hnd ) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; snmp_bc_lock_handler(custom_handle); /* Check if resource exists and has sensor capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_CAPABILITY); } /* Check if sensor exists and if it supports setting of sensor event enablement */ rdr = oh_get_rdr_by_type(handle->rptcache, rid, SAHPI_SENSOR_RDR, sid); if (rdr == NULL) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_NOT_PRESENT); } if (rdr->RdrTypeUnion.SensorRec.EventCtrl == SAHPI_SEC_PER_EVENT || rdr->RdrTypeUnion.SensorRec.EventCtrl == SAHPI_SEC_READ_ONLY_MASKS) { err("BladeCenter/RSA do not support snmp_bc_set_sensor_event_enable."); sinfo = (struct SensorInfo *)oh_get_rdr_data(handle->rptcache, rid, rdr->RecordId); if (sinfo == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } if (sinfo->events_enabled != enable) { /* Probably need to drive an OID, if hardware supported it */ sinfo->events_enabled = enable; /* FIXME:: Add SAHPI_ET_SENSOR_ENABLE_CHANGE event on IF event Q */ } } else { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_READ_ONLY); } snmp_bc_unlock_handler(custom_handle); return(SA_OK); } /** * snmp_bc_get_sensor_event_masks: * @hnd: Handler data pointer. * @rid: Resource ID. * @sid: Sensor ID. * @AssertEventMask: Location to store sensor's assert event mask. * @DeassertEventMask: Location to store sensor's deassert event mask. * * Retrieves a sensor's assert and deassert event masks. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_SENSOR. * SA_ERR_HPI_NOT_PRESENT - Sensor doesn't exist. **/ SaErrorT snmp_bc_get_sensor_event_masks(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiEventStateT *AssertEventMask, SaHpiEventStateT *DeassertEventMask) { struct oh_handler_state *handle; struct SensorInfo *sinfo; struct snmp_bc_hnd *custom_handle; SaHpiRptEntryT *rpt; SaHpiRdrT *rdr; if (!hnd ) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; snmp_bc_lock_handler(custom_handle); /* Check if resource exists and has sensor capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_CAPABILITY); } /* Check if sensor exists and return enablement status */ rdr = oh_get_rdr_by_type(handle->rptcache, rid, SAHPI_SENSOR_RDR, sid); if (rdr == NULL) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_NOT_PRESENT); } sinfo = (struct SensorInfo *)oh_get_rdr_data(handle->rptcache, rid, rdr->RecordId); if (sinfo == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } if (AssertEventMask) *AssertEventMask = sinfo->assert_mask; if (DeassertEventMask) { if (rpt->ResourceCapabilities & SAHPI_CAPABILITY_EVT_DEASSERTS) { *DeassertEventMask = sinfo->assert_mask; } else { *DeassertEventMask = sinfo->deassert_mask; } } snmp_bc_unlock_handler(custom_handle); return(SA_OK); } /** * snmp_bc_set_sensor_event_masks: * @hnd: Handler data pointer. * @rid: Resource ID. * @sid: Sensor ID. * @act: Add/Remove action to perform on event masks. * @AssertEventMask: Sensor's assert event mask. * @DeassertEventMask: sensor's deassert event mask. * * Sets a sensor's assert and deassert event masks. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_SENSOR. * SA_ERR_HPI_INVALID_DATA - @act not valid or @AssertEventMask/@DeassertEventMask * contain events not supported by sensor. * SA_ERR_HPI_NOT_PRESENT - Sensor doesn't exist. **/ SaErrorT snmp_bc_set_sensor_event_masks(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiSensorEventMaskActionT act, const SaHpiEventStateT AssertEventMask, const SaHpiEventStateT DeassertEventMask) { struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; SaHpiRptEntryT *rpt; SaHpiRdrT *rdr; struct SensorInfo *sinfo; SaHpiEventStateT orig_assert_mask; SaHpiEventStateT orig_deassert_mask; if (!hnd ) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } if (oh_lookup_sensoreventmaskaction(act) == NULL) { return(SA_ERR_HPI_INVALID_DATA); } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; snmp_bc_lock_handler(custom_handle); /* Check if resource exists and has sensor capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_CAPABILITY); } /* Check if sensor exists and if it supports setting of sensor event masks */ rdr = oh_get_rdr_by_type(handle->rptcache, rid, SAHPI_SENSOR_RDR, sid); if (rdr == NULL) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_NOT_PRESENT); } if (rdr->RdrTypeUnion.SensorRec.EventCtrl == SAHPI_SEC_PER_EVENT) { err("BladeCenter/RSA do not support snmp_bc_set_sensor_event_masks"); /* Probably need to drive an OID, if hardware supported it */ sinfo = (struct SensorInfo *)oh_get_rdr_data(handle->rptcache, rid, rdr->RecordId); if (sinfo == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } orig_assert_mask = sinfo->assert_mask; orig_deassert_mask = sinfo->deassert_mask; /* Check for invalid data in user masks */ if ( (AssertEventMask != SAHPI_ALL_EVENT_STATES) && (AssertEventMask & ~(rdr->RdrTypeUnion.SensorRec.Events)) ) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_DATA); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_EVT_DEASSERTS)) { if ( (DeassertEventMask != SAHPI_ALL_EVENT_STATES) && (DeassertEventMask & ~(rdr->RdrTypeUnion.SensorRec.Events)) ) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_DATA); } } /* Add to event masks */ if (act == SAHPI_SENS_ADD_EVENTS_TO_MASKS) { if (AssertEventMask == SAHPI_ALL_EVENT_STATES) { sinfo->assert_mask = rdr->RdrTypeUnion.SensorRec.Events; } else { sinfo->assert_mask = sinfo->assert_mask | AssertEventMask; } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_EVT_DEASSERTS)) { if (DeassertEventMask == SAHPI_ALL_EVENT_STATES) { sinfo->deassert_mask = rdr->RdrTypeUnion.SensorRec.Events; } else { sinfo->deassert_mask = sinfo->deassert_mask | DeassertEventMask; } } } else { /* Remove from event masks */ if (AssertEventMask == SAHPI_ALL_EVENT_STATES) { sinfo->assert_mask = 0; } else { sinfo->assert_mask = sinfo->assert_mask & ~AssertEventMask; } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_EVT_DEASSERTS)) { if (DeassertEventMask == SAHPI_ALL_EVENT_STATES) { sinfo->deassert_mask = 0; } else { sinfo->deassert_mask = sinfo->deassert_mask & ~DeassertEventMask; } } } /* Generate event, if needed */ if (sinfo->assert_mask != orig_assert_mask) { /* FIXME:: Add SAHPI_ET_SENSOR_ENABLE_CHANGE event on IF event Q */ } else { if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_EVT_DEASSERTS) && sinfo->deassert_mask != orig_deassert_mask) { /* FIXME:: Add SAHPI_ET_SENSOR_ENABLE_CHANGE event on IF event Q */ } } } else { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_READ_ONLY); } snmp_bc_unlock_handler(custom_handle); return(SA_OK); } /** * snmp_bc_set_slot_state_sensor: * @hnd: Handler data pointer. * @e: Pointer to struct oh_event of the resource * @slot_ep: Pointer to Slot Entity Path of the resource. * * Sets Slot State Sensor values. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - Resource doesn't have SAHPI_CAPABILITY_SENSOR. **/ SaErrorT snmp_bc_set_slot_state_sensor(void *hnd, struct oh_event *e, SaHpiEntityPathT *slot_ep) { SaErrorT err; SaHpiRptEntryT *res; SaHpiRdrT *rdr; struct SensorInfo *sinfo; struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; if (!e || !hnd || !slot_ep ) return(SA_ERR_HPI_INVALID_PARAMS); handle = (struct oh_handler_state *) hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; res = oh_get_resource_by_ep(handle->rptcache, slot_ep); if (!res) { err("No valid resource or rdr at hand. Could not process new rdr."); return(SA_ERR_HPI_INVALID_DATA); } rdr = oh_get_rdr_next(handle->rptcache, res->ResourceId, SAHPI_FIRST_ENTRY); while (rdr) { if ((rdr->RdrType == SAHPI_SENSOR_RDR) && (rdr->RdrTypeUnion.SensorRec.Num == BLADECENTER_SENSOR_NUM_SLOT_STATE)) { sinfo = (struct SensorInfo *)oh_get_rdr_data(handle->rptcache, res->ResourceId, rdr->RecordId); sinfo->cur_state = SAHPI_ES_PRESENT; sinfo->cur_child_rid = e->resource.ResourceId; err = oh_add_rdr(handle->rptcache, res->ResourceId, rdr, sinfo, 0); break; } rdr = oh_get_rdr_next(handle->rptcache, res->ResourceId, rdr->RecordId); } return(SA_OK); } /** * snmp_bc_reset_slot_state_sensor: * @hnd: Handler data pointer. * @slot_ep: Pointer to Slot Entity Path of the resource. * * REsets Slot State Sensor values. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - Resource doesn't have SAHPI_CAPABILITY_SENSOR. **/ SaErrorT snmp_bc_reset_slot_state_sensor(void *hnd, SaHpiEntityPathT *slot_ep) { SaErrorT err; SaHpiRptEntryT *res; SaHpiRdrT *rdr; struct SensorInfo *sinfo; struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; if (!hnd || !slot_ep ) return(SA_ERR_HPI_INVALID_PARAMS); handle = (struct oh_handler_state *) hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; res = oh_get_resource_by_ep(handle->rptcache, slot_ep); if (!res) { err("No valid resource or rdr at hand. Could not process new rdr."); return(SA_ERR_HPI_INVALID_DATA); } rdr = oh_get_rdr_next(handle->rptcache, res->ResourceId, SAHPI_FIRST_ENTRY); while (rdr) { if ((rdr->RdrType == SAHPI_SENSOR_RDR) && (rdr->RdrTypeUnion.SensorRec.Num == BLADECENTER_SENSOR_NUM_SLOT_STATE)) { sinfo = (struct SensorInfo *)oh_get_rdr_data(handle->rptcache, res->ResourceId, rdr->RecordId); sinfo->cur_state = SAHPI_ES_ABSENT; sinfo->cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID; err = oh_add_rdr(handle->rptcache, res->ResourceId, rdr, sinfo, 0); break; } rdr = oh_get_rdr_next(handle->rptcache, res->ResourceId, rdr->RecordId); } return(SA_OK); } /** * snmp_bc_set_resource_slot_state_sensor: * @hnd: Handler data pointer. * @e: Pointer to struct oh_event of the resource * @resourcewidth: Number of physical slot this resource occupies * * Setting Slot State Sensor values for all slots occupied by this resource. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - Resource doesn't have SAHPI_CAPABILITY_SENSOR. **/ SaErrorT snmp_bc_set_resource_slot_state_sensor(void *hnd, struct oh_event *e, guint resourcewidth) { guint i, j; SaErrorT err; SaHpiEntityPathT slot_ep; struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; if (!e) return(SA_ERR_HPI_INVALID_PARAMS); handle = (struct oh_handler_state *) hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; err = snmp_bc_extract_slot_ep( &(e->resource.ResourceEntity), &slot_ep); j = slot_ep.Entry[0].EntityLocation; if ( (custom_handle->platform == SNMP_BC_PLATFORM_BC) || (custom_handle->platform == SNMP_BC_PLATFORM_BCH)) { for (i = 0; i < resourcewidth; i++) { oh_set_ep_location(&slot_ep, slot_ep.Entry[0].EntityType, j+i); err = snmp_bc_set_slot_state_sensor(handle, e, &slot_ep); } } else if ( (custom_handle->platform == SNMP_BC_PLATFORM_BCT) || (custom_handle->platform == SNMP_BC_PLATFORM_BCHT) ){ for (i = 0; i < resourcewidth; i++) { oh_set_ep_location(&slot_ep, slot_ep.Entry[0].EntityType, j - i); err = snmp_bc_set_slot_state_sensor(handle, e, &slot_ep); } } return(SA_OK); } /** * snmp_bc_get_slot_state_sensor: * @hnd: Handler data pointer. * @rid: Resource ID. * @sid: Sensor ID. * @reading: Location of sensor's reading * * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - Resource doesn't have SAHPI_CAPABILITY_SENSOR. **/ SaErrorT snmp_bc_get_slot_state_sensor(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiSensorReadingT *reading) { SaHpiRdrT *rdr; struct SensorInfo *sinfo; struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; if (!hnd || !reading) return(SA_ERR_HPI_INVALID_PARAMS); handle = (struct oh_handler_state *) hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; rdr = oh_get_rdr_by_type(handle->rptcache, rid, SAHPI_SENSOR_RDR, sid); if (rdr == NULL) return(SA_ERR_HPI_NOT_PRESENT); sinfo = (struct SensorInfo *)oh_get_rdr_data(handle->rptcache, rid, rdr->RecordId); if (sinfo == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); return(SA_ERR_HPI_INTERNAL_ERROR); } /* Set SensorReading structure using data stored in rptcache */ reading->IsSupported = rdr->RdrTypeUnion.SensorRec.DataFormat.IsSupported; reading->Type = rdr->RdrTypeUnion.SensorRec.DataFormat.ReadingType; reading->Value.SensorUint64 = (SaHpiUint64T) sinfo->cur_child_rid; return(SA_OK); } /** * snmp_bc_clear_resource_slot_state_sensor: * @hnd: Handler data pointer. * @rid: Resource ID. * @sid: Sensor ID. * @reading: Location of sensor's reading * * * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - Resource doesn't have SAHPI_CAPABILITY_SENSOR. **/ SaErrorT snmp_bc_reset_resource_slot_state_sensor(void *hnd, SaHpiRptEntryT *res) { guint i, j; SaErrorT err; guint resourcewidth; SaHpiEntityPathT slot_ep; struct oh_handler_state *handler; struct snmp_bc_hnd *custom_handler; struct ResourceInfo *res_info_ptr; if (!hnd || !res ) return(SA_ERR_HPI_INVALID_PARAMS); handler = (struct oh_handler_state *) hnd; custom_handler = (struct snmp_bc_hnd *)handler->data; err = snmp_bc_extract_slot_ep( &(res->ResourceEntity), &slot_ep); res_info_ptr = (struct ResourceInfo *)oh_get_resource_data(handler->rptcache, res->ResourceId); resourcewidth = res_info_ptr->resourcewidth; res_info_ptr->resourcewidth = 1; j = slot_ep.Entry[0].EntityLocation; if ( (custom_handler->platform == SNMP_BC_PLATFORM_BC) || (custom_handler->platform == SNMP_BC_PLATFORM_BCH)) { for (i = 0; i < resourcewidth; i++) { oh_set_ep_location(&slot_ep, slot_ep.Entry[0].EntityType, j+i); err = snmp_bc_reset_slot_state_sensor(handler, &slot_ep); } } else if ( (custom_handler->platform == SNMP_BC_PLATFORM_BCT) || (custom_handler->platform == SNMP_BC_PLATFORM_BCHT) ) { for (i = 0; i < resourcewidth; i++) { oh_set_ep_location(&slot_ep, slot_ep.Entry[0].EntityType, j - i); err = snmp_bc_reset_slot_state_sensor(handler, &slot_ep); } } return(SA_OK); } #define usepowerdomain1 \ do { \ switch(sid) { \ case BLADECENTER_SENSOR_NUM_MAX_POWER: \ thisOID = SNMP_BC_PD1POWERMAX; \ break; \ case BLADECENTER_SENSOR_NUM_ASSIGNED_POWER: \ thisOID = SNMP_BC_PD1POWERCURRENT; \ break; \ case BLADECENTER_SENSOR_NUM_MIN_POWER: \ thisOID = SNMP_BC_PD1POWERMIN; \ break; \ default: \ err("Not one of the Slot Power Sensors."); \ return(SA_ERR_HPI_INTERNAL_ERROR); \ break; \ } \ } while(0) #define usepowerdomain2 \ do { \ switch(sid) { \ case BLADECENTER_SENSOR_NUM_MAX_POWER: \ thisOID = SNMP_BC_PD2POWERMAX; \ break; \ case BLADECENTER_SENSOR_NUM_ASSIGNED_POWER: \ thisOID = SNMP_BC_PD2POWERCURRENT; \ break; \ case BLADECENTER_SENSOR_NUM_MIN_POWER: \ thisOID = SNMP_BC_PD2POWERMIN; \ break; \ default: \ err("Not one of the Slot Power Sensors."); \ return(SA_ERR_HPI_INTERNAL_ERROR); \ break; \ } \ } while(0) /** * snmp_bc_get_slot_power_sensor: * @hnd: Handler data pointer. * @rid: Resource ID. * @sid: Sensor ID. * @reading: Location of sensor's reading * * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS. **/ SaErrorT snmp_bc_get_slot_power_sensor(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiSensorReadingT *reading) { #define totalPower 0xEE guint slotnum; guint oidIndex; SaErrorT err; char *thisOID; SaHpiRdrT *rdr; gchar **power_substrs; char oid[SNMP_BC_MAX_OID_LENGTH]; SaHpiRptEntryT *res; struct snmp_value get_value; struct snmp_value pm3_state, pm4_state; struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; if (!hnd || !reading ) return(SA_ERR_HPI_INVALID_PARAMS); handle = (struct oh_handler_state *) hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; res = oh_get_resource_by_id(handle->rptcache, rid); slotnum = res->ResourceEntity.Entry[0].EntityLocation; rdr = oh_get_rdr_by_type(handle->rptcache, rid, SAHPI_SENSOR_RDR, sid); if (rdr == NULL) return(SA_ERR_HPI_NOT_PRESENT); oidIndex = SNMP_BC_NOT_VALID; thisOID = NULL; switch ((int)res->ResourceEntity.Entry[0].EntityType) { case BLADECENTER_PERIPHERAL_BAY_SLOT: oidIndex = 2; usepowerdomain1; break; case BLADECENTER_SWITCH_SLOT: if (custom_handle->platform == SNMP_BC_PLATFORM_BCT) { switch (slotnum) { case 1: oidIndex = 9; break; case 2: oidIndex = 10; break; case 3: oidIndex = 11; break; case 4: oidIndex = 12; break; default: err("Not one of the valid BC-T Swich Slots."); return(SA_ERR_HPI_INTERNAL_ERROR); break; } usepowerdomain1; } else if (custom_handle->platform == SNMP_BC_PLATFORM_BC) { switch (slotnum) { case 1: oidIndex = 7; break; case 2: oidIndex = 8; break; case 3: oidIndex = 9; break; case 4: oidIndex = 10; break; default: err("Not one of the valid BC Switch Slots."); return(SA_ERR_HPI_INTERNAL_ERROR); break; } usepowerdomain1; } else if (custom_handle->platform == SNMP_BC_PLATFORM_BCH) { switch (slotnum) { case 1: oidIndex = 9; break; case 2: oidIndex = 10; break; case 3: oidIndex = 11; break; case 4: oidIndex = 12; break; case 5: oidIndex = 11; break; case 6: oidIndex = 12; break; case 7: oidIndex = 13; break; case 8: oidIndex = 14; break; case 9: oidIndex = 15; break; case 10: oidIndex = 16; break; default: err("Not one of the valid BC H Switch Slots."); return(SA_ERR_HPI_INTERNAL_ERROR); break; } if ( (slotnum == 5) || (slotnum == 6)){ usepowerdomain2; } else { usepowerdomain1; } } else if (custom_handle->platform == SNMP_BC_PLATFORM_BCHT) { switch (slotnum) { case 1: oidIndex = 19; break; case 2: oidIndex = 20; break; case 3: oidIndex = 21; break; case 4: oidIndex = 22; break; case 5: case 6: /* Reading is not supported on BC-HT*/ oidIndex = SNMP_BC_NOT_VALID; thisOID = NULL; break; case 7: oidIndex = 9; break; case 8: oidIndex = 10; break; case 9: oidIndex = 11; break; case 10: oidIndex = 12; break; default: err("Not one of the valid BC HT Switch Slots."); return(SA_ERR_HPI_INTERNAL_ERROR); break; } if (slotnum > 6){ usepowerdomain2; } else if (slotnum < 5) { usepowerdomain1; } } else { err("Not one of the supported platform."); return(SA_ERR_HPI_INTERNAL_ERROR); } break; case BLADECENTER_SYS_MGMNT_MODULE_SLOT: if (custom_handle->platform == SNMP_BC_PLATFORM_BCT) { switch (slotnum) { case 1: oidIndex = 7; break; case 2: oidIndex = 8; break; default: err("Not one of the valid BC-T MM Slots."); return(SA_ERR_HPI_INTERNAL_ERROR); break; } usepowerdomain1; } else if (custom_handle->platform == SNMP_BC_PLATFORM_BC) { switch (slotnum) { case 1: oidIndex = 5; break; case 2: oidIndex = 6; break; default: err("Not one of the valid BC MM Slots."); return(SA_ERR_HPI_INTERNAL_ERROR); break; } usepowerdomain1; } else if (custom_handle->platform == SNMP_BC_PLATFORM_BCH) { switch (slotnum) { case 1: oidIndex = 7; break; case 2: oidIndex = 8; break; default: err("Not one of the valid BC H MM Slots."); return(SA_ERR_HPI_INTERNAL_ERROR); break; } usepowerdomain1; } else if (custom_handle->platform == SNMP_BC_PLATFORM_BCHT) { switch (slotnum) { case 1: oidIndex = 17; break; case 2: oidIndex = 18; break; default: err("Not one of the valid BC HT MM Slots."); return(SA_ERR_HPI_INTERNAL_ERROR); break; } usepowerdomain1; } else { err("Not one of the supported platform."); return(SA_ERR_HPI_INTERNAL_ERROR); } break; case BLADECENTER_BLOWER_SLOT: if (custom_handle->platform == SNMP_BC_PLATFORM_BCT) { if ( (slotnum == 3) || (slotnum == 4)) { snprintf(oid, SNMP_BC_MAX_OID_LENGTH, "%s.%d", SNMP_BC_PMSTATE, 3); get_integer_object(oid, pm3_state); // getsnmpvalue(pm3_state); snprintf(oid, SNMP_BC_MAX_OID_LENGTH, "%s.%d", SNMP_BC_PMSTATE, 4); get_integer_object(oid, pm4_state); // getsnmpvalue(pm4_state); } switch (slotnum) { case 1: oidIndex = 3; break; case 2: oidIndex = 4; break; case 3: if ((pm3_state.integer == 3) && (pm4_state.integer == 3)) oidIndex = 5; else oidIndex = 1; break; case 4: if ((pm3_state.integer == 3) && (pm4_state.integer == 3)) oidIndex = 6; else oidIndex = 2; break; default: err("Not one of the valid BC-T Fan Slots."); return(SA_ERR_HPI_INTERNAL_ERROR); break; } if (slotnum < 3) { usepowerdomain1; } else { if ((pm3_state.integer == 3) && (pm4_state.integer == 3)) usepowerdomain1; else usepowerdomain2; } } else if (custom_handle->platform == SNMP_BC_PLATFORM_BC) { switch (slotnum) { case 1: oidIndex = 3; break; case 2: oidIndex = 4; break; default: err("Not one of the valid BC Fan Slots."); return(SA_ERR_HPI_INTERNAL_ERROR); break; } usepowerdomain1; } else if (custom_handle->platform == SNMP_BC_PLATFORM_BCH) { /* Reading is not supported on BC-H */ oidIndex = SNMP_BC_NOT_VALID; thisOID = NULL; } else if (custom_handle->platform == SNMP_BC_PLATFORM_BCHT) { /* pdp - FIX ME - Reading is not supported on BC-H */ oidIndex = SNMP_BC_NOT_VALID; thisOID = NULL; } else { err("Not one of the supported platform."); return(SA_ERR_HPI_INTERNAL_ERROR); } break; case SAHPI_ENT_PHYSICAL_SLOT: if (custom_handle->platform == SNMP_BC_PLATFORM_BCT) { switch (slotnum) { case 1: oidIndex = 13; break; case 2: oidIndex = 14; break; case 3: oidIndex = 15; break; case 4: oidIndex = 16; break; case 5: oidIndex = 3; break; case 6: oidIndex = 4; break; case 7: oidIndex = 5; break; case 8: oidIndex = 6; break; default: err("Not one of the valid BC-T Blade Slots."); return(SA_ERR_HPI_INTERNAL_ERROR); break; } if (slotnum < 5) { usepowerdomain1; } else { usepowerdomain2; } } else if (custom_handle->platform == SNMP_BC_PLATFORM_BC) { switch (slotnum) { case 1: oidIndex = 11; break; case 2: oidIndex = 12; break; case 3: oidIndex = 13; break; case 4: oidIndex = 14; break; case 5: oidIndex = 15; break; case 6: oidIndex = 16; break; case 7: oidIndex = 1; break; case 8: oidIndex = 2; break; case 9: oidIndex = 3; break; case 10: oidIndex = 4; break; case 11: oidIndex = 5; break; case 12: oidIndex = 6; break; case 13: oidIndex = 7; break; case 14: oidIndex = 8; break; default: err("Not one of the valid BC Blade Slots."); return(SA_ERR_HPI_INTERNAL_ERROR); break; } if (slotnum < 7) { usepowerdomain1; } else { usepowerdomain2; } } else if (custom_handle->platform == SNMP_BC_PLATFORM_BCH) { switch (slotnum) { case 1: case 8: oidIndex = 17; break; case 2: case 9: oidIndex = 18; break; case 3: case 10: oidIndex = 19; break; case 4: case 11: oidIndex = 20; break; case 5: case 12: oidIndex = 21; break; case 6: case 13: oidIndex = 22; break; case 7: case 14: oidIndex = 23; break; default: err("Not one of the valid BC H Switch Slots."); return(SA_ERR_HPI_INTERNAL_ERROR); break; } if ( slotnum > 7){ usepowerdomain2; } else { usepowerdomain1; } } else if (custom_handle->platform == SNMP_BC_PLATFORM_BCHT) { switch (slotnum) { case 1: oidIndex = 23; break; case 2: oidIndex = 24; break; case 3: oidIndex = 25; break; case 4: oidIndex = 26; break; case 5: oidIndex = 27; break; case 6: oidIndex = 28; break; case 7: oidIndex = 13; break; case 8: oidIndex = 14; break; case 9: oidIndex = 15; break; case 10: oidIndex = 16; break; case 11: oidIndex = 17; break; case 12: oidIndex = 18; break; default: err("Not one of the valid BC H Switch Slots."); return(SA_ERR_HPI_INTERNAL_ERROR); break; } if ( slotnum > 6){ usepowerdomain2; } else { usepowerdomain1; } } else { err("Not one of the supported platform."); return(SA_ERR_HPI_INTERNAL_ERROR); } break; case BLADECENTER_POWER_SUPPLY_SLOT: if ((custom_handle->platform == SNMP_BC_PLATFORM_BCT) || (custom_handle->platform == SNMP_BC_PLATFORM_BC) || (custom_handle->platform == SNMP_BC_PLATFORM_BCHT)) { /* Reading is not supported on BC, BC-T and BC-HT*/ oidIndex = SNMP_BC_NOT_VALID; thisOID = NULL; } else if (custom_handle->platform == SNMP_BC_PLATFORM_BCH) { switch (slotnum) { case 1: oidIndex = 3; break; case 2: oidIndex = 4; break; case 3: oidIndex = 5; break; case 4: oidIndex = 6; break; default: err("Not one of the valid BC H Power Module Slots."); return(SA_ERR_HPI_INTERNAL_ERROR); break; } usepowerdomain1; } else { err("Not one of the supported platform."); return(SA_ERR_HPI_INTERNAL_ERROR); } break; case SAHPI_ENT_SYS_MGMNT_MODULE: /* Assign Midplane Power reading to Virtual management module */ switch (slotnum) { case 0: oidIndex = 1; break; default: err("Not one of the valid resources."); return(SA_ERR_HPI_INTERNAL_ERROR); break; } usepowerdomain1; break; case SAHPI_ENT_SYSTEM_CHASSIS: usepowerdomain1; oidIndex = totalPower; break; default: thisOID = NULL; oidIndex = SNMP_BC_NOT_VALID; break; } if ( (thisOID == NULL) || (oidIndex == SNMP_BC_NOT_VALID)) { reading->IsSupported = SAHPI_FALSE; return(SA_OK); } else if (oidIndex == totalPower) { if (custom_handle->platform == SNMP_BC_PLATFORM_BCT) { usepowerdomain1; snprintf(oid, SNMP_BC_MAX_OID_LENGTH, "%s.%d", thisOID, 17); get_string_object(oid, pm3_state); usepowerdomain2; snprintf(oid, SNMP_BC_MAX_OID_LENGTH, "%s.%d", thisOID, 7); get_string_object(oid, pm4_state); } else if (custom_handle->platform == SNMP_BC_PLATFORM_BC) { usepowerdomain1; snprintf(oid, SNMP_BC_MAX_OID_LENGTH, "%s.%d", thisOID, 17); get_string_object(oid, pm3_state); usepowerdomain2; snprintf(oid, SNMP_BC_MAX_OID_LENGTH, "%s.%d", thisOID, 9); get_string_object(oid, pm4_state); } else if (custom_handle->platform == SNMP_BC_PLATFORM_BCH) { usepowerdomain1; snprintf(oid, SNMP_BC_MAX_OID_LENGTH, "%s.%d", thisOID, 24); get_string_object(oid, pm3_state); usepowerdomain2; snprintf(oid, SNMP_BC_MAX_OID_LENGTH, "%s.%d", thisOID, 24); get_string_object(oid, pm4_state); } else if (custom_handle->platform == SNMP_BC_PLATFORM_BCHT) { usepowerdomain1; snprintf(oid, SNMP_BC_MAX_OID_LENGTH, "%s.%d", thisOID, 29); get_string_object(oid, pm3_state); usepowerdomain2; snprintf(oid, SNMP_BC_MAX_OID_LENGTH, "%s.%d", thisOID, 19); get_string_object(oid, pm4_state); } else { err("Not one of the supported platform.\n"); return(SA_ERR_HPI_INTERNAL_ERROR); } power_substrs = g_strsplit(pm3_state.string, " ", -1); if (power_substrs[0] == NULL) return(SA_ERR_HPI_INTERNAL_ERROR); reading->Value.SensorUint64 = g_strtod(power_substrs[0], NULL); power_substrs = g_strsplit(pm4_state.string, " ", -1); if (power_substrs[0] == NULL) return(SA_ERR_HPI_INTERNAL_ERROR); reading->Value.SensorUint64 = reading->Value.SensorUint64 + g_strtod(power_substrs[0], NULL); /* Set SensorReading structure */ reading->IsSupported = rdr->RdrTypeUnion.SensorRec.DataFormat.IsSupported; reading->Type = rdr->RdrTypeUnion.SensorRec.DataFormat.ReadingType; return(SA_OK); } snprintf(oid, SNMP_BC_MAX_OID_LENGTH, "%s.%d", thisOID, oidIndex); get_string_object(oid, get_value); /* Set SensorReading structure */ if (g_ascii_strncasecmp(get_value.string, "N/A", sizeof("N/A")) == 0) { reading->Value.SensorUint64 = 0; } else { power_substrs = g_strsplit(get_value.string, " ", -1); if (power_substrs[0] == NULL) return(SA_ERR_HPI_INTERNAL_ERROR); reading->Value.SensorUint64 = g_strtod(power_substrs[0], NULL); } reading->IsSupported = rdr->RdrTypeUnion.SensorRec.DataFormat.IsSupported; reading->Type = rdr->RdrTypeUnion.SensorRec.DataFormat.ReadingType; return(SA_OK); } /** * * Intrastructure to Plugin APIs * **/ void * oh_get_sensor_reading (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiSensorReadingT *, SaHpiEventStateT *) __attribute__ ((weak, alias("snmp_bc_get_sensor_reading"))); void * oh_get_sensor_thresholds (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiSensorThresholdsT *) __attribute__ ((weak, alias("snmp_bc_get_sensor_thresholds"))); void * oh_set_sensor_thresholds (void *, SaHpiResourceIdT, SaHpiSensorNumT, const SaHpiSensorThresholdsT *) __attribute__ ((weak, alias("snmp_bc_set_sensor_thresholds"))); void * oh_get_sensor_enable (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT *) __attribute__ ((weak, alias("snmp_bc_get_sensor_enable"))); void * oh_set_sensor_enable (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT) __attribute__ ((weak, alias("snmp_bc_set_sensor_enable"))); void * oh_get_sensor_event_enables (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT *) __attribute__ ((weak, alias("snmp_bc_get_sensor_event_enable"))); void * oh_set_sensor_event_enables (void *, SaHpiResourceIdT id, SaHpiSensorNumT, SaHpiBoolT *) __attribute__ ((weak, alias("snmp_bc_set_sensor_event_enable"))); void * oh_get_sensor_event_masks (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiEventStateT *, SaHpiEventStateT *) __attribute__ ((weak, alias("snmp_bc_get_sensor_event_masks"))); void * oh_set_sensor_event_masks (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiSensorEventMaskActionT, SaHpiEventStateT, SaHpiEventStateT) __attribute__ ((weak, alias("snmp_bc_set_sensor_event_masks"))); openhpi-3.6.1/plugins/snmp_bc/snmp_bc_utils.c0000644000175100017510000003013012575647274020302 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia */ #include #include #include SaErrorT snmp_bc_get_guid(struct snmp_bc_hnd *custom_handle, struct oh_event *e, struct ResourceInfo *res_info_ptr) { SaErrorT status; gchar *UUID; gchar *BC_UUID; gchar **tmpstr; SaHpiGuidT guid; struct snmp_value get_value; const gchar *UUID_delimiter1; const gchar *UUID_delimiter2; const gchar *UUID_delimiter; const gchar *NA; /* not case sensitive */ guint UUID_cnt, i; uuid_t UUID_val; UUID_delimiter1 = " "; UUID_delimiter2 = "-"; UUID_delimiter = "-"; NA = "NOT AVAILABLE"; UUID_cnt = 0; i = 0; UUID = NULL; BC_UUID = NULL; tmpstr = NULL; if ( (custom_handle == NULL) || (e == NULL) || (res_info_ptr == NULL)) { err("Invalid parameter."); status = SA_ERR_HPI_INVALID_PARAMS; goto CLEANUP2; } memset(&guid, 0, sizeof(SaHpiGuidT)); /* default to zero */ if (res_info_ptr->mib.OidUuid == NULL) { dbg("NULL UUID OID"); status = SA_OK; goto CLEANUP; } status = snmp_bc_oid_snmp_get(custom_handle, &(e->resource.ResourceEntity), 0, res_info_ptr->mib.OidUuid, &get_value, SAHPI_TRUE); if(( status != SA_OK) || (get_value.type != ASN_OCTET_STR)) { dbg("Cannot get OID rc=%d; oid=%s type=%d.", status, res_info_ptr->mib.OidUuid, get_value.type); if ( status != SA_ERR_HPI_BUSY) status = SA_ERR_HPI_NO_RESPONSE; goto CLEANUP; } dbg("UUID=%s.", get_value.string); /* rid lead+trail blanks */ BC_UUID = g_strstrip(g_strdup(get_value.string)); if (BC_UUID == NULL || BC_UUID[0] == '\0') { err("UUID is NULL."); status = SA_ERR_HPI_ERROR; goto CLEANUP; } if (g_ascii_strcasecmp( BC_UUID, NA ) == 0) { dbg("UUID is N/A %s, set GUID to zeros.", BC_UUID); for ( i=0; i<16; i++ ) UUID_val[i] = 0; memmove ( guid, &UUID_val, sizeof(uuid_t)); status = SA_OK; goto CLEANUP; } /* separate substrings */ tmpstr = g_strsplit(BC_UUID, UUID_delimiter1, -1); for ( UUID_cnt=0; tmpstr[UUID_cnt] != NULL; UUID_cnt++ ); /* dbg("number of UUID substrings = %d, strings =", UUID_cnt); */ /* for (i=0; iresource.ResourceInfo.Guid, guid, sizeof(SaHpiGuidT)); CLEANUP2: g_free(UUID); g_free(BC_UUID); g_strfreev(tmpstr); /* dbg("get_guid exit status %d.", status); */ return(status); } /** * snmp_bc_discover_resources: * @resource_ep: Pointer to full FRU Resource Entity Path. * @slot_ep : Pointer to Slot Entity Path extracted from resource_ep * * Extract Slot Entity Path portion from the full FRU Entity Path * * Return values: * Slot Entity Path - normal operation. * SA_ERR_HPI_INVALID_PARAMS - Invalid input pointer or data **/ SaErrorT snmp_bc_extract_slot_ep(SaHpiEntityPathT *resource_ep, SaHpiEntityPathT *slot_ep) { guint i,j; if (!resource_ep || !slot_ep) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } for (i = 0; i < SAHPI_MAX_ENTITY_PATH ; i++) { if ( (resource_ep->Entry[i].EntityType == SAHPI_ENT_PHYSICAL_SLOT) || (resource_ep->Entry[i].EntityType == BLADECENTER_SWITCH_SLOT) || (resource_ep->Entry[i].EntityType == BLADECENTER_POWER_SUPPLY_SLOT) || (resource_ep->Entry[i].EntityType == BLADECENTER_PERIPHERAL_BAY_SLOT) || (resource_ep->Entry[i].EntityType == BLADECENTER_SYS_MGMNT_MODULE_SLOT) || (resource_ep->Entry[i].EntityType == BLADECENTER_ALARM_PANEL_SLOT) || (resource_ep->Entry[i].EntityType == BLADECENTER_MUX_SLOT) || (resource_ep->Entry[i].EntityType == BLADECENTER_CLOCK_SLOT) || (resource_ep->Entry[i].EntityType == BLADECENTER_BLOWER_SLOT) ) break; } /* There must alway be a SAHPI_ENT_ROOT, so xx_SLOT entry index must always be less than SAHPI_MAX_ENTITY_PATH */ if ( i == SAHPI_MAX_ENTITY_PATH) return(SA_ERR_HPI_INVALID_PARAMS); for ( j = 0; i < SAHPI_MAX_ENTITY_PATH; i++) { slot_ep->Entry[j].EntityType = resource_ep->Entry[i].EntityType; slot_ep->Entry[j].EntityLocation = resource_ep->Entry[i].EntityLocation; if (resource_ep->Entry[i].EntityType == SAHPI_ENT_ROOT) break; j++; } return(SA_OK); } /** * snmp_bc_copy_oh_event: * @new_event: Pointer to new oh_event. * @old_event: Pointer to old oh_event. * * Allocate and create a duplicate copy of old_event * * Return values: **/ SaErrorT snmp_bc_copy_oh_event(struct oh_event *new_event, struct oh_event *old_event) { GSList *node; if (!new_event || !old_event) return(SA_ERR_HPI_INVALID_PARAMS); node = NULL; *new_event = *old_event; new_event->rdrs = NULL; for (node = old_event->rdrs; node; node = node->next) { new_event->rdrs = g_slist_append(new_event->rdrs, g_memdup(node->data, sizeof(SaHpiRdrT))); } return(SA_OK); } /** * snmp_bc_alloc_oh_event: * * Allocate and create a copy of oh_event with default data * * Return values: * NULL - No space or invalid parm * (oh_event *) - Normal **/ struct oh_event *snmp_bc_alloc_oh_event() { struct oh_event *e = NULL; e = (struct oh_event *)g_malloc0(sizeof(struct oh_event)); if (e == NULL) return(e); e->rdrs = NULL; return e; } /** * snmp_bc_free_oh_event: * @event: Pointer to oh_event. * * Free oh_event space * * Return values: * NULL - No space or invalid parm * (oh_event *) - Normal **/ void snmp_bc_free_oh_event(struct oh_event *e) { if (!e) return; g_slist_free(e->rdrs); g_free(e); return; } /** * snmp_bc_set_resource_add_oh_event: * @e: Pointer to oh_event. * @res_info_ptr * * Initialize (oh_event *).event to default value for resource_add * e->resource must be initialized prior to using this util. * * Return values: * NULL - No space or invalid parm * (oh_event *) - Normal **/ SaErrorT snmp_bc_set_resource_add_oh_event(struct oh_event *e, struct ResourceInfo *res_info_ptr) { if (!e || !res_info_ptr) return(SA_ERR_HPI_INVALID_PARAMS); e->event.Severity = e->resource.ResourceSeverity; e->event.Source = e->resource.ResourceId; if (oh_gettimeofday(&e->event.Timestamp) != SA_OK) e->event.Timestamp = SAHPI_TIME_UNSPECIFIED; if (e->resource.ResourceCapabilities & SAHPI_CAPABILITY_FRU) { e->event.EventType = SAHPI_ET_HOTSWAP; e->event.EventDataUnion.HotSwapEvent.HotSwapState = res_info_ptr->cur_state; } else { e->event.EventType = SAHPI_ET_RESOURCE; e->event.EventDataUnion.ResourceEvent.ResourceEventType = SAHPI_RESE_RESOURCE_ADDED; } return(SA_OK); } /** * snmp_bc_extend_ep: * @e: Pointer to oh_event. * @resource_index: * @interposer_installed_mask: * * If there is an interposer installed in this resource slot, * insert interposer into entitypath between physical slot and resource entity. * * Currently there are 2 types of interposer cards, Switch (smi) and Management Module (mmi) * interposers. * * Return values: * * SA_OK - Normal **/ SaErrorT snmp_bc_extend_ep(struct oh_event *e, guint resource_index, gchar *interposer_install_mask) { guint i; if (interposer_install_mask[resource_index] == '1') { for (i=0; iresource.ResourceEntity.Entry[i].EntityType == SAHPI_ENT_ROOT) break; } do { e->resource.ResourceEntity.Entry[i+1].EntityType = e->resource.ResourceEntity.Entry[i].EntityType; e->resource.ResourceEntity.Entry[i+1].EntityLocation = e->resource.ResourceEntity.Entry[i].EntityLocation; i--; } while (i > 0); /* i == 0 at this point; setting ep Entry[1] */ e->resource.ResourceEntity.Entry[i+1].EntityType = SAHPI_ENT_INTERCONNECT; e->resource.ResourceEntity.Entry[i+1].EntityLocation = SNMP_BC_HPI_LOCATION_BASE + resource_index; /* Entry[0] remains untouched */ } return(SA_OK); } openhpi-3.6.1/plugins/snmp_bc/snmp_bc_event.h0000644000175100017510000000407212575647274020276 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #ifndef __SNMP_BC_EVENT_H #define __SNMP_BC_EVENT_H typedef enum { EVENT_NOT_MAPPED, EVENT_NOT_ALERTABLE, } OEMReasonCodeT; typedef struct { SaHpiResourceIdT rid; BCRptEntryT rpt; struct snmp_bc_sensor *sensor_array_ptr; SaHpiEntityPathT ep; } LogSource2ResourceT; typedef struct { SaHpiEventT hpievent; SaHpiEntityPathT ep; /* ep that matches hpievent.ResourceID */ SaHpiEventStateT sensor_recovery_state; SaHpiHsStateT hs_event_auto_state; /* Hot swap state in hpievent */ SaHpiHsStateT hs_recovery_state; /* Kill this when BC removes "Recovery" hot swap events */ SaHpiHsStateT hs_recovery_auto_state; /* Kill this when BC removes "Recovery" hot swap events */ SaHpiBoolT event_res_failure; SaHpiBoolT event_res_failure_unexpected; } EventMapInfoT; SaErrorT event2hpi_hash_init(struct oh_handler_state *handle); SaErrorT event2hpi_hash_free(struct oh_handler_state *handle); SaErrorT snmp_bc_discover_res_events(struct oh_handler_state *handle, SaHpiEntityPathT *ep, const struct ResourceInfo *resinfo); SaErrorT snmp_bc_discover_sensor_events(struct oh_handler_state *handle, SaHpiEntityPathT *ep, SaHpiSensorNumT sid, const struct snmp_bc_sensor *sinfo); SaErrorT snmp_bc_log2event(struct oh_handler_state *handle, gchar *logstr, SaHpiEventT *event, int isdst, LogSource2ResourceT *ret_logsrc2res); SaErrorT snmp_bc_add_to_eventq(struct oh_handler_state *handle, SaHpiEventT *thisEvent, SaHpiBoolT prepend); #endif openhpi-3.6.1/plugins/snmp_bc/snmp_bc_session.c0000644000175100017510000004227412575647274020641 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Steve Sherman */ #include #include #define check_snmp_parm(input_parm) \ do { \ if (input_parm != NULL) { \ if ( (strlen(input_parm) == 0) || \ ( g_ascii_strncasecmp(input_parm, "NONE", 4) == 0 )) { \ input_parm = NULL; \ } \ } \ } while(0) /** * snmp_bc_open: * @handler_config: Pointer to hash table (passed by infrastructure) * * Open an SNMP BladeCenter/RSA plugin handler instance. * * Returns: * Plugin handle - normal operation. * NULL - on error. **/ void *snmp_bc_open(GHashTable *handler_config, unsigned int hid, oh_evt_queue *eventq) { struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; char *hostname, *version, *sec_level, *authtype, *user, *pass, *community, *context_name, *count_per_getbulk, *privacy_passwd, *privacy_protocol; char *root_tuple; SaErrorT rv; if (!handler_config) { err("INVALID PARM - NULL handler_config pointer."); return NULL; } else if (!hid) { err("Bad handler id passed."); return NULL; } else if (!eventq) { err("No event queue was passed."); return NULL; } root_tuple = (char *)g_hash_table_lookup(handler_config, "entity_root"); if (!root_tuple) { err("Cannot find \"entity_root\" configuration parameter."); return NULL; } hostname = (char *)g_hash_table_lookup(handler_config, "host"); if (!hostname) { err("Cannot find \"host\" configuration parameter."); return NULL; } handle = (struct oh_handler_state *)g_malloc0(sizeof(struct oh_handler_state)); custom_handle = (struct snmp_bc_hnd *)g_malloc0(sizeof(struct snmp_bc_hnd)); if (!handle || !custom_handle) { err("Out of memory."); return NULL; } handle->data = custom_handle; handle->config = handler_config; handle->hid = hid; handle->eventq = eventq; /* Initialize the lock */ /* g_static_rec_mutex_init(&handle->handler_lock); */ g_static_rec_mutex_init(&custom_handle->snmp_bc_hlock.lock); custom_handle->snmp_bc_hlock.count = 0; /* Initialize resource masks */ /* Set all masks and counts to zero's */ custom_handle->max_pb_supported = 0; /* pb - processor blade */ custom_handle->max_blower_supported = 0; /* blower - blower */ custom_handle->max_pm_supported = 0; /* pm - power module */ custom_handle->max_sm_supported = 0; /* sm - switch module */ custom_handle->max_mm_supported = 0; /* mm - management module */ custom_handle->max_mt_supported = 0; /* mt - media tray */ custom_handle->max_filter_supported = 0; /* filter - front bezel */ custom_handle->max_tap_supported = 0; /* tap-telco alarm panel */ custom_handle->max_nc_supported = 0; /* nc - network clock card*/ custom_handle->max_mx_supported = 0; /* mx - multiplex card */ custom_handle->max_mmi_supported = 0; /* mmi- mm interposer */ custom_handle->max_smi_supported = 0; /* smi- switch interposer */ memset(&custom_handle->installed_pb_mask, '\0', SNMP_BC_MAX_RESOURCES_MASK); memset(&custom_handle->installed_blower_mask, '\0', SNMP_BC_MAX_RESOURCES_MASK); memset(&custom_handle->installed_pm_mask, '\0', SNMP_BC_MAX_RESOURCES_MASK); memset(&custom_handle->installed_sm_mask, '\0', SNMP_BC_MAX_RESOURCES_MASK); memset(&custom_handle->installed_mm_mask, '\0', SNMP_BC_MAX_RESOURCES_MASK); memset(&custom_handle->installed_tap_mask, '\0', SNMP_BC_MAX_RESOURCES_MASK); memset(&custom_handle->installed_nc_mask, '\0', SNMP_BC_MAX_RESOURCES_MASK); memset(&custom_handle->installed_mx_mask, '\0', SNMP_BC_MAX_RESOURCES_MASK); memset(&custom_handle->installed_mmi_mask, '\0', SNMP_BC_MAX_RESOURCES_MASK); memset(&custom_handle->installed_smi_mask, '\0', SNMP_BC_MAX_RESOURCES_MASK); custom_handle->installed_mt_mask = 0; custom_handle->installed_filter_mask = 0; custom_handle->host = NULL; custom_handle->host_alternate = NULL; /* Indicate this is the 1st discovery (T0 discovery) */ /* Use to see if we need to create events for log entries. */ /* Do not report any event from event log entries, for */ /* entries that are created before this instance of OpenHPI */ custom_handle->isFirstDiscovery = SAHPI_TRUE; /* Initialize RPT cache */ handle->rptcache = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(handle->rptcache); /* Initialize event log cache */ handle->elcache = oh_el_create(BC_EL_MAX_SIZE); handle->elcache->gentimestamp = FALSE; /* Initialize simulator tables */ if (is_simulator()) { custom_handle->ss = NULL; sim_init(); } else { /* Initialize SNMP library */ init_snmp("oh_snmp_bc"); snmp_sess_init(&(custom_handle->session)); custom_handle->session.peername = hostname; custom_handle->host = hostname; custom_handle->host_alternate = ((char *)g_hash_table_lookup(handle->config, "host_alternate")); /* Set retries/timeouts - based on testing with BC/BCT MM SNMP V3 agent */ custom_handle->session.retries = 3; custom_handle->session.timeout = 15000000; /* 15000000 in microseconds */ version = (char *)g_hash_table_lookup(handle->config, "version"); if (!version) { err("Cannot find \"version\" configuration parameter."); return NULL; } sec_level = (char *)g_hash_table_lookup(handle->config, "security_level"); authtype = (char *)g_hash_table_lookup(handle->config, "auth_type"); user = (char *)g_hash_table_lookup(handle->config, "security_name"); pass = (char *)g_hash_table_lookup(handle->config, "passphrase"); community = (char *)g_hash_table_lookup(handle->config, "community"); context_name = (char *)g_hash_table_lookup(handle->config, "context_name"); count_per_getbulk = (char *)g_hash_table_lookup(handle->config, "count_per_getbulk"); privacy_passwd = (char *)g_hash_table_lookup(handle->config, "privacy_passwd"); privacy_protocol = (char *)g_hash_table_lookup(handle->config, "privacy_protocol"); /* Treating three (3) cases of non-declared parm the same */ /* That is Not-declared-parm, parm = "", parm ="none" */ /* are the same to us */ check_snmp_parm(sec_level); check_snmp_parm(authtype); check_snmp_parm(user); check_snmp_parm(pass); check_snmp_parm(community); check_snmp_parm(context_name); check_snmp_parm(count_per_getbulk); check_snmp_parm(privacy_passwd); check_snmp_parm(privacy_protocol); /* Configure SNMP V3 session */ if (!g_ascii_strncasecmp(version, "3", sizeof("3"))) { if (!user) { err("Cannot find \"security_name\" configuration parameter."); return NULL; } custom_handle->session.version = SNMP_VERSION_3; custom_handle->session.securityName = user; custom_handle->session.securityNameLen = strlen(user); custom_handle->session.securityLevel = SNMP_SEC_LEVEL_NOAUTH; if (!g_ascii_strncasecmp(sec_level, "auth", 4)) { /* If using password */ if (!pass) { err("Cannot find \"passphrase\" configuration parameter."); return NULL; } custom_handle->session.securityLevel = SNMP_SEC_LEVEL_AUTHNOPRIV; if (!authtype || !g_ascii_strncasecmp(authtype, "MD5", sizeof("MD5"))) { custom_handle->session.securityAuthProto = usmHMACMD5AuthProtocol; custom_handle->session.securityAuthProtoLen = USM_AUTH_PROTO_MD5_LEN; } else if (!g_ascii_strncasecmp(authtype, "SHA", sizeof("SHA"))) { custom_handle->session.securityAuthProto = usmHMACSHA1AuthProtocol; custom_handle->session.securityAuthProtoLen = USM_AUTH_PROTO_SHA_LEN; } else { err("Unrecognized authenication type=%s.", authtype); return NULL; } custom_handle->session.securityAuthKeyLen = USM_AUTH_KU_LEN; if (generate_Ku(custom_handle->session.securityAuthProto, custom_handle->session.securityAuthProtoLen, (u_char *) pass, strlen(pass), custom_handle->session.securityAuthKey, &(custom_handle->session.securityAuthKeyLen)) != SNMPERR_SUCCESS) { snmp_perror("snmp_bc"); snmp_log(LOG_ERR, "Error generating Ku from authentication passphrase.\n"); err("Unable to establish SNMP authnopriv session."); return NULL; } if (!g_ascii_strncasecmp(sec_level, "authPriv", sizeof("authPriv"))) { /* if using encryption */ if (!privacy_passwd) { err("Cannot find \"privacy_passwd\" configuration parameter."); return NULL; } custom_handle->session.securityLevel = SNMP_SEC_LEVEL_AUTHPRIV; custom_handle->session.securityPrivProto = usmDESPrivProtocol; custom_handle->session.securityPrivProtoLen = USM_PRIV_PROTO_DES_LEN; custom_handle->session.securityPrivKeyLen = USM_PRIV_KU_LEN; if (generate_Ku(custom_handle->session.securityAuthProto, custom_handle->session.securityAuthProtoLen, (u_char *) privacy_passwd, strlen(privacy_passwd), custom_handle->session.securityPrivKey, &(custom_handle->session.securityPrivKeyLen)) != SNMPERR_SUCCESS) { snmp_perror("snmp_bc"); snmp_log(LOG_ERR, "Error generating Ku from private passphrase.\n"); err("Unable to establish SNMP authpriv session."); return NULL; } } if (context_name != NULL) { custom_handle->session.contextName = (char *)context_name; custom_handle->session.contextNameLen = strlen(context_name); } } if (count_per_getbulk != NULL) { custom_handle->count_per_getbulk = atoi((char *)count_per_getbulk); if (custom_handle->count_per_getbulk != 0) { if (custom_handle->count_per_getbulk <= SNMP_BC_BULK_MIN) custom_handle->count_per_getbulk = SNMP_BC_BULK_MIN; else if (custom_handle->count_per_getbulk > SNMP_BC_MM_BULK_MAX) custom_handle->count_per_getbulk = SNMP_BC_MM_BULK_MAX; } } else { custom_handle->count_per_getbulk = SNMP_BC_BULK_DEFAULT; } /* Configure SNMP V1 session */ } else if (!g_ascii_strncasecmp(version, "1", sizeof("1"))) { if (!community) { err("Cannot find \"community\" configuration parameter."); return NULL; } custom_handle->session.version = SNMP_VERSION_1; custom_handle->session.community = (u_char *)community; custom_handle->session.community_len = strlen(community); } else { err("Unrecognized SNMP version=%s.", version); return NULL; } rv = snmp_bc_manage_snmp_open(custom_handle, SAHPI_TRUE); if (rv != SA_OK) return NULL; } /* Determine BladeCenter chassis type */ { const char *oid; struct snmp_value get_value; SaErrorT err; do { err = snmp_bc_snmp_get(custom_handle, SNMP_BC_CHASSIS_TYPE_OID, &get_value, SAHPI_FALSE); if (err == SA_OK) { int chassis_type, chassis_subtype; chassis_type = get_value.integer; err = snmp_bc_snmp_get(custom_handle, SNMP_BC_CHASSIS_SUBTYPE_OID, &get_value, SAHPI_FALSE); if (err) { err("Cannot read model subtype"); chassis_subtype = SNMP_BC_CHASSIS_SUBTYPE_ORIG; } else { chassis_subtype = get_value.integer; } if (chassis_type == SNMP_BC_CHASSIS_TYPE_BC && chassis_subtype == SNMP_BC_CHASSIS_SUBTYPE_ORIG) { dbg("Found BC"); custom_handle->platform = SNMP_BC_PLATFORM_BC; break; } if (chassis_type == SNMP_BC_CHASSIS_TYPE_BC && chassis_subtype == SNMP_BC_CHASSIS_SUBTYPE_H) { dbg("Found BCH"); custom_handle->platform = SNMP_BC_PLATFORM_BCH; break; } if (chassis_type == SNMP_BC_CHASSIS_TYPE_BCT && chassis_subtype == SNMP_BC_CHASSIS_SUBTYPE_ORIG) { dbg("Found BCT"); custom_handle->platform = SNMP_BC_PLATFORM_BCT; break; } if (chassis_type == SNMP_BC_CHASSIS_TYPE_BCT && chassis_subtype == SNMP_BC_CHASSIS_SUBTYPE_H) { dbg("Found BCHT"); custom_handle->platform = SNMP_BC_PLATFORM_BCHT; break; } err("Unknown BladeCenter model"); return NULL; } else { /* Older MM software doesn't support chassis type and subtype OIDs */ err = snmp_bc_snmp_get(custom_handle, SNMP_BC_PLATFORM_OID_BCT, &get_value, SAHPI_FALSE); if (err == SA_OK) { dbg("Found BCT"); custom_handle->platform = SNMP_BC_PLATFORM_BCT; break; } err = snmp_bc_snmp_get(custom_handle, SNMP_BC_PLATFORM_OID_BC, &get_value, SAHPI_FALSE); if (err == SA_OK) { dbg("Found BC"); custom_handle->platform = SNMP_BC_PLATFORM_BC; break; } err = snmp_bc_snmp_get(custom_handle, SNMP_BC_PLATFORM_OID_RSA, &get_value, SAHPI_FALSE); if (err == SA_OK) { dbg("Found RSA"); custom_handle->platform = SNMP_BC_PLATFORM_RSA; break; } err("Unknown BladeCenter model"); return NULL; } } while(0); /* Determine if daylight savings time (DST) is enabled */ if (custom_handle->platform == SNMP_BC_PLATFORM_RSA) { oid = SNMP_BC_DST_RSA; } else { oid = SNMP_BC_DST; } err = snmp_bc_snmp_get(custom_handle, oid, &get_value, SAHPI_TRUE); if (err == SA_OK) { strncpy(custom_handle->handler_timezone, get_value.string,9); } else { err("Cannot read DST=%s; Error=%d.", oid, get_value.type); return NULL; } } /* Initialize "String to Event" mapping hash table */ if (errlog2event_hash_use_count == 0) { if (errlog2event_hash_init(custom_handle)) { err("Out of memory."); return NULL; } } errlog2event_hash_use_count++; /* Initialize "Event Number to HPI Event" mapping hash table */ if (event2hpi_hash_init(handle)) { err("Out of memory."); return NULL; } if (is_simulator()) { sim_banner(custom_handle); } return handle; } /** * snmp_bc_close: * @hnd: Pointer to handler structure. * * Close an SNMP BladeCenter/RSA plugin handler instance. * * Returns: * Void **/ void snmp_bc_close(void *hnd) { struct oh_handler_state *handle; if (!hnd) { err("INVALID PARM - NULL handle pointer."); return; } handle = (struct oh_handler_state *)hnd; oh_el_close(handle->elcache); if (is_simulator()) { sim_close(); } else { struct snmp_bc_hnd *custom_handle = (struct snmp_bc_hnd *)handle->data; snmp_sess_close(custom_handle->sessp); /* Windows32 specific net-snmp cleanup (noop on unix) */ SOCK_CLEANUP; } /* Cleanup event2hpi hash table */ event2hpi_hash_free(handle); /* Cleanup errlog2event_hash table */ errlog2event_hash_use_count--; if (errlog2event_hash_use_count == 0) { errlog2event_hash_free(); } oh_flush_rpt(handle->rptcache); g_free(handle->rptcache); } /** * snmp_bc_manage_snmp_open: * @hnd: Pointer to handler structure. * * . * * Returns: * SA_OK - able to open a snmp session **/ SaErrorT snmp_bc_manage_snmp_open(struct snmp_bc_hnd *custom_handle, SaHpiBoolT recovery_requested) { SaErrorT rv; rv = SA_OK; /* Windows32 specific net-snmp initialization (noop on unix) */ SOCK_STARTUP; custom_handle->sessp = snmp_sess_open(&(custom_handle->session)); if (custom_handle->sessp == NULL) { // snmp_perror("ack"); // snmp_log(LOG_ERR, "Something horrible happened!!!\n"); if (recovery_requested) { rv = snmp_bc_recover_snmp_session(custom_handle); } else { rv = SA_ERR_HPI_NO_RESPONSE; } } if (rv == SA_OK) custom_handle->ss = snmp_sess_session(custom_handle->sessp); return(rv); } /** * snmp_bc_recover_snmp_session: * @hnd: Pointer to handler structure. * * . * * Returns: * SA_OK - able to open a snmp session **/ SaErrorT snmp_bc_recover_snmp_session(struct snmp_bc_hnd *custom_handle) { SaErrorT rv; rv = SA_OK; if (custom_handle->host_alternate != NULL) { /* This openhpi.conf stanza has 2 different hosts defined */ if (!custom_handle->sessp) { snmp_sess_close(custom_handle->sessp); /* Windows32 specific net-snmp cleanup (noop on unix) */ SOCK_CLEANUP; } if ( strcmp(custom_handle->host, custom_handle->session.peername) == 0 ) { dbg("Attemp recovery with custom_handle->host_alternate %s\n", custom_handle->host_alternate); custom_handle->session.peername = custom_handle->host_alternate; } else { dbg("Attemp recovery with custom_handle->host %s\n", custom_handle->host); custom_handle->session.peername = custom_handle->host; } rv = snmp_bc_manage_snmp_open(custom_handle, SAHPI_FALSE); } else { dbg("No host_alternate defined in openhpi.conf. No recovery on host_alternate.\n"); rv = SA_ERR_HPI_NO_RESPONSE; } return(rv); } /** **/ void * oh_open (GHashTable *, unsigned int, oh_evt_queue *) __attribute__ ((weak, alias("snmp_bc_open"))); void * oh_close (void *) __attribute__ ((weak, alias("snmp_bc_close"))); openhpi-3.6.1/plugins/snmp_bc/snmp_bc_discover_bc.h0000644000175100017510000002005412575647274021435 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ #ifndef __SNMP_BC_DISCOVER_BC_H #define __SNMP_BC_DISCOVER_BC_H #define SNMP_BC_IPMI_STRING_DELIMITER "=" #define SNMP_BC_MAX_IPMI_TEMP_SENSORS 6 #define SNMP_BC_MAX_IPMI_VOLTAGE_SENSORS 30 #define SNMP_BC_IPMI_TEMP_BLADE_OID ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.11.x" #define SNMP_BC_IPMI_VOLTAGE_BLADE_OID ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.14.x" #define SNMP_BC_RESOURCE_INSTALLED 1 #define SNMP_BC_RESOURCE_REMOVED 2 #define get_installed_mask(maskOID, getvalue) \ do { \ err = snmp_bc_snmp_get(custom_handle, maskOID, &getvalue, SAHPI_TRUE); \ if (err || getvalue.type != ASN_OCTET_STR) { \ dbg("Cannot get OID=%s; Received Type=%d; Error=%s.", \ maskOID, getvalue.type, oh_lookup_error(err)); \ if (err != SA_ERR_HPI_NOT_PRESENT) { return(err); } \ else if (err == SA_ERR_HPI_NOT_PRESENT) {getvalue.type = ASN_OCTET_STR; \ memset(&getvalue.string, '0', SNMP_BC_MAX_RESOURCES_MASK); \ getvalue.string[SNMP_BC_MAX_RESOURCES_MASK -1] = '\0';} \ else { return(SA_ERR_HPI_INTERNAL_ERROR); } \ } else if (getvalue.str_len == 0) {getvalue.type = ASN_OCTET_STR; \ memset(&getvalue.string, '0', SNMP_BC_MAX_RESOURCES_MASK); \ getvalue.string[SNMP_BC_MAX_RESOURCES_MASK -1] = '\0';} \ } while(0) #define get_string_object(maskOID, getvalue) get_installed_mask(maskOID, getvalue) #define get_integer_object(maskOID, getintvalue) \ do { \ err = snmp_bc_snmp_get(custom_handle, maskOID, &getintvalue, SAHPI_TRUE); \ if (err || getintvalue.type != ASN_INTEGER) { \ dbg("Cannot get OID=%s; Received Type=%d; Error=%s.", \ maskOID, getintvalue.type, oh_lookup_error(err)); \ if (err != SA_ERR_HPI_NOT_PRESENT) { return(err); } \ else if (err == SA_ERR_HPI_NOT_PRESENT) {getintvalue.type = ASN_INTEGER; getintvalue.integer = 0;} \ else { return(SA_ERR_HPI_INTERNAL_ERROR); } \ } \ } while(0) #define get_dualmode_object(maskOID, getintvalue) \ do { \ err = snmp_bc_snmp_get(custom_handle, maskOID, &getintvalue, SAHPI_TRUE); \ if (err == SA_ERR_HPI_NOT_PRESENT) {getintvalue.type = ASN_INTEGER; getintvalue.integer = 0;} \ else if (err != SA_OK) { \ dbg("Cannot get OID=%s; Received Type=%d; Error=%s.", \ maskOID, getintvalue.type, oh_lookup_error(err)); \ if (err) { return(err); } \ else { return(SA_ERR_HPI_INTERNAL_ERROR); } \ } else { \ if (getintvalue.type == ASN_OCTET_STR) { \ if (getintvalue.str_len == 0) getintvalue.integer = 0; \ else getintvalue.integer = atoi(getintvalue.string); \ } else if (getintvalue.type == ASN_INTEGER) { \ if (getintvalue.str_len == 0) { getintvalue.integer = 0; \ } else if (getintvalue.integer == 1) getintvalue.integer = 10; \ } \ } \ } while(0) guint snmp_bc_isrediscover(SaHpiEventT *working_event); SaErrorT snmp_bc_construct_blade_rpt(struct oh_event *e, struct ResourceInfo **res_info_ptr, SaHpiEntityPathT *ep_root, guint blade_index); SaErrorT snmp_bc_construct_blower_rpt(struct oh_event* e, struct ResourceInfo **res_info_ptr, SaHpiEntityPathT *ep_root, guint blower_index); SaErrorT snmp_bc_construct_pm_rpt(struct oh_event *e, struct ResourceInfo **res_info_ptr, SaHpiEntityPathT *ep_root, guint pm_index); SaErrorT snmp_bc_construct_sm_rpt(struct oh_event *e, struct ResourceInfo **res_info_ptr, SaHpiEntityPathT *ep_root, guint sm_index, char *interposer_install_mask); SaErrorT snmp_bc_construct_mm_rpt(struct oh_event *e, struct ResourceInfo **res_info_ptr, SaHpiEntityPathT *ep_root, guint mm_index, char *interposer_install_mask); SaErrorT snmp_bc_construct_tap_rpt(struct oh_event *e, struct ResourceInfo **res_info_ptr, SaHpiEntityPathT *ep_root, guint tap_index); SaErrorT snmp_bc_construct_nc_rpt(struct oh_event *e, struct ResourceInfo **res_info_ptr, SaHpiEntityPathT *ep_root, guint nc_index); SaErrorT snmp_bc_construct_mx_rpt(struct oh_event *e, struct ResourceInfo **res_info_ptr, SaHpiEntityPathT *ep_root, guint mx_index); SaErrorT snmp_bc_construct_smi_rpt(struct oh_event *e, struct ResourceInfo **res_info_ptr, SaHpiEntityPathT *ep_root, guint smi_index); SaErrorT snmp_bc_construct_mmi_rpt(struct oh_event *e, struct ResourceInfo **res_info_ptr, SaHpiEntityPathT *ep_root, guint mmi_index); SaErrorT snmp_bc_add_blade_rptcache(struct oh_handler_state *handle, struct oh_event *e, struct ResourceInfo *res_info_ptr, guint blade_index); SaErrorT snmp_bc_add_blower_rptcache(struct oh_handler_state *handle, struct oh_event *e, struct ResourceInfo *res_info_ptr, guint blower_index); SaErrorT snmp_bc_add_pm_rptcache(struct oh_handler_state *handle, struct oh_event *e, struct ResourceInfo *res_info_ptr, guint pm_index); SaErrorT snmp_bc_add_switch_rptcache(struct oh_handler_state *handle, struct oh_event *e, struct ResourceInfo *res_info_ptr, guint switch_index); SaErrorT snmp_bc_add_mm_rptcache(struct oh_handler_state *handle, struct oh_event *e, struct ResourceInfo *res_info_ptr, guint mm_index); SaErrorT snmp_bc_add_tap_rptcache(struct oh_handler_state *handle, struct oh_event *e, struct ResourceInfo *res_info_ptr, guint tap_index); SaErrorT snmp_bc_add_nc_rptcache(struct oh_handler_state *handle, struct oh_event *e, struct ResourceInfo *res_info_ptr, guint nc_index); SaErrorT snmp_bc_add_mx_rptcache(struct oh_handler_state *handle, struct oh_event *e, struct ResourceInfo *res_info_ptr, guint mx_index); SaErrorT snmp_bc_add_smi_rptcache(struct oh_handler_state *handle, struct oh_event *e, struct ResourceInfo *res_info_ptr, guint smi_index); SaErrorT snmp_bc_add_mmi_rptcache(struct oh_handler_state *handle, struct oh_event *e, struct ResourceInfo *res_info_ptr, guint mmi_index); SaErrorT snmp_bc_discover_blade_i(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, guint blade_index); SaErrorT snmp_bc_discover_blower_i(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, guint blower_index); SaErrorT snmp_bc_discover_pm_i(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, guint pm_index); SaErrorT snmp_bc_discover_switch_i(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, guint sm_index); SaErrorT snmp_bc_discover_mm_i(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, guint mm_index); SaErrorT snmp_bc_discover_tap_i(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, guint tap_index); SaErrorT snmp_bc_discover_nc_i(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, guint nc_index); SaErrorT snmp_bc_discover_mx_i(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, guint mx_index); SaErrorT snmp_bc_discover_mmi_i(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, guint mmi_index); SaErrorT snmp_bc_discover_smi_i(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, guint smi_index); SaErrorT snmp_bc_fetch_MT_install_mask(struct oh_handler_state *handle, struct snmp_value *getintvalue); #endif openhpi-3.6.1/plugins/snmp_bc/t/0000755000175100017510000000000012605014546015523 5ustar mohanmohanopenhpi-3.6.1/plugins/snmp_bc/t/tsensorset008.c0000644000175100017510000000710312575647274020351 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiResourceIdT id; SaHpiSessionIdT sessionid; SaHpiBoolT enable = SAHPI_FALSE; SaHpiSensorNumT sid = 0; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundSensor; /* ************************************* * Find a resource with Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid,SAHPI_CAPABILITY_SENSOR,SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: find a sensor with desired property **************************/ entryid = SAHPI_FIRST_ENTRY; foundSensor = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if ((rdr.RdrType == SAHPI_SENSOR_RDR) && (rdr.RdrTypeUnion.SensorRec.EventCtrl == SAHPI_SEC_PER_EVENT)) { foundSensor = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundSensor) { err("Did not find desired resource for test\n"); return(SA_OK); } else { sid = rdr.RdrTypeUnion.SensorRec.Num; } /************************** * Test **************************/ enable = SAHPI_FALSE; expected_err = SA_OK; err = saHpiSensorEventEnableSet(sessionid, id, sid, enable); checkstatus(err, expected_err, testfail); /************************** * Test: find a sensor with desired property **************************/ entryid = SAHPI_FIRST_ENTRY; foundSensor = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if ((rdr.RdrType == SAHPI_SENSOR_RDR) && (rdr.RdrTypeUnion.SensorRec.EventCtrl == SAHPI_SEC_READ_ONLY_MASKS)) { foundSensor = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundSensor) { err("Did not find desired resource for test\n"); return(SA_OK); } else { sid = rdr.RdrTypeUnion.SensorRec.Num; } /************************** * Test * expected_err = SA_OK; **************************/ enable = SAHPI_TRUE; err = saHpiSensorEventEnableSet(sessionid, id, sid, enable); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/tsensorget004.c0000644000175100017510000000367312575647274020341 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiResourceIdT id; SaHpiSessionIdT sessionid; SaHpiRptEntryT rptentry; SaHpiSensorNumT sid = 0; SaHpiEventStateT state; SaHpiSensorReadingT reading; /* ************************************* * Find a resource with NO Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid, SAHPI_CAPABILITY_SENSOR, SAHPI_FIRST_ENTRY, &rptentry, SAHPI_FALSE); if (err != SA_OK) { dbg("Error! Can not find resources for test environment\n"); dbg(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test 4: Invalid Capability *************************/ expected_err = SA_ERR_HPI_CAPABILITY; err = saHpiSensorReadingGet(sessionid, id, sid, &reading, &state); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/sim_resources.h0000644000175100017510000000161312575647274020577 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003, 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #ifndef __SIM_RESOURCES_H #define __SIM_RESOURCES_H typedef union { char string[MAX_ASN_STR_LEN]; long integer; } SnmpValueT; typedef struct { int type; SnmpValueT value; } SnmpMibInfoT; struct snmp_bc_data { const char *oid; SnmpMibInfoT mib; }; extern GHashTable * sim_hash; extern struct snmp_bc_data sim_resource_array[]; #define SNMP_FORCE_TIMEOUT -7777 #define SNMP_FORCE_ERROR -9999 #endif openhpi-3.6.1/plugins/snmp_bc/t/tinv003.c0000644000175100017510000000662412575647274017122 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiResourceIdT id = 0; SaHpiSessionIdT sessionid; SaHpiIdrIdT idrId= 0; SaHpiEntryIdT areaId = 0; /* SaHpiIdrAreaTypeT areatype; */ SaHpiEntryIdT nextAreaId; SaHpiIdrAreaHeaderT header; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundControl; /* ************************************* * Find a resource with inventory capability * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid, SAHPI_CAPABILITY_INVENTORY_DATA, SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Can not find an Inventory resource for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: find an Inventory RDR **************************/ entryid = SAHPI_FIRST_ENTRY; foundControl = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if (rdr.RdrType == SAHPI_INVENTORY_RDR) { foundControl = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundControl) { err("Did not find desired resource for test\n"); return(SA_OK); } else { idrId = rdr.RdrTypeUnion.InventoryRec.IdrId; } /************************** * Test: Invalid IdrId **************************/ expected_err = SA_ERR_HPI_NOT_PRESENT; err = saHpiIdrAreaHeaderGet(sessionid , id, 5000, SAHPI_IDR_AREATYPE_UNSPECIFIED, areaId, &nextAreaId, &header); checkstatus(err, expected_err, testfail); /************************** * Test: Invalid AreaType **************************/ expected_err = SA_OK; err = saHpiIdrAreaHeaderGet(sessionid , id, idrId, SAHPI_IDR_AREATYPE_UNSPECIFIED, areaId, &nextAreaId, &header); checkstatus(err, expected_err, testfail); /************************** * Test: Normal code path **************************/ expected_err = SA_OK; err = saHpiIdrAreaHeaderGet(sessionid , id, idrId, SAHPI_IDR_AREATYPE_UNSPECIFIED, SAHPI_FIRST_ENTRY, &nextAreaId, &header); checkstatus(err, expected_err, testfail); /**************************&* * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/tcontrol_parms.c0000644000175100017510000000630612575647274020762 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2005, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaHpiResourceIdT id; SaHpiParmActionT act; SaErrorT err; SaErrorT expected_err; SaHpiSessionIdT sessionid; struct oh_handler_state *handle; // SaHpiDomainIdT did; struct oh_handler *h = NULL; struct oh_domain *d = NULL; unsigned int *hid = NULL; // /* ************************ * Find a resource with Control type rdr * ***********************/ SaHpiRptEntryT rptentry; err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not setup session for test environment.\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid, SAHPI_CAPABILITY_CONTROL, SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resource for test environment.\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return -1; } id = rptentry.ResourceId; act = SAHPI_RESTORE_PARM; // ----------- did = oh_get_session_domain(sessionid); d = oh_get_domain(did); hid = oh_get_resource_data(&(d->rpt), id); h = oh_get_handler(*hid); // ---------- // memset(&handle, 0, sizeof(struct oh_handler_state)); /************************** * Test 1: Invalid Control Action **************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; act = 0xFF; err = snmp_bc_control_parm(h->hnd, id, act); checkstatus(err, expected_err, testfail); /************************** * Test 2: Invalid ResourceId **************************/ act = SAHPI_DEFAULT_PARM; expected_err = SA_ERR_HPI_INVALID_RESOURCE; err = snmp_bc_control_parm(h->hnd, 5000, act); checkstatus(err, expected_err, testfail); /************************** * Test 3: Resource configuration saving not supported *************************/ handle = (struct oh_handler_state *) h->hnd; rptentry.ResourceCapabilities |= SAHPI_CAPABILITY_CONFIGURATION; oh_add_resource(handle->rptcache, &rptentry, NULL, 0); expected_err = SA_ERR_HPI_INTERNAL_ERROR; err = snmp_bc_control_parm(h->hnd, id, act); checkstatus(err, expected_err, testfail); /************************** * Test 4: Normal Path **************************/ expected_err = SA_ERR_HPI_CAPABILITY; err = saHpiParmControl(sessionid, id, act); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/tinv001.c0000644000175100017510000000736112575647274017117 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiResourceIdT id = 0; SaHpiSessionIdT sessionid; SaHpiIdrIdT idrId = 0; SaHpiEntryIdT areaId = 0; SaHpiEntryIdT fieldId = 0; SaHpiIdrFieldT field; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundControl; memset (&field, 0, sizeof(SaHpiIdrFieldT)); /* ************************************* * Find a resource with inventory capability * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid, SAHPI_CAPABILITY_INVENTORY_DATA, SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Can not find an Inventory resource for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: find an Inventory RDR **************************/ entryid = SAHPI_FIRST_ENTRY; foundControl = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if (rdr.RdrType == SAHPI_INVENTORY_RDR) { foundControl = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundControl) { err("Did not find desired resource for test\n"); return(SA_OK); } else { idrId = rdr.RdrTypeUnion.InventoryRec.IdrId; } /************************** * Test: Add to a read-only Idr Area **************************/ expected_err = SA_ERR_HPI_READ_ONLY; err = saHpiIdrAreaAdd(sessionid, id, idrId, SAHPI_IDR_AREATYPE_CHASSIS_INFO, &areaId); checkstatus(err, expected_err, testfail); /************************** * Test: Add to a read-only Idr Field * expected_err = SA_ERR_HPI_READ_ONLY; **************************/ err = saHpiIdrFieldAdd(sessionid, id, idrId, &field); checkstatus(err, expected_err, testfail); /************************** * Test: Del a read-only Idr Area * expected_err = SA_ERR_HPI_READ_ONLY; **************************/ err = saHpiIdrAreaDelete(sessionid, id, idrId, areaId); checkstatus(err, expected_err, testfail); /************************** * Test: Del a read-only Idr Field * expected_err = SA_ERR_HPI_READ_ONLY; **************************/ err = saHpiIdrFieldDelete(sessionid, id, idrId, areaId, fieldId); checkstatus(err, expected_err, testfail); /************************** * Test: Set a read-only Idr Field * expected_err = SA_ERR_HPI_READ_ONLY; **************************/ err = saHpiIdrFieldSet(sessionid, id, idrId, &field); checkstatus(err, expected_err, testfail); /**************************&* * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/tsensorget040.c0000644000175100017510000000366112575647274020336 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiResourceIdT id; SaHpiSessionIdT sessionid; SaHpiRptEntryT rptentry; SaHpiSensorNumT sid = 0; SaHpiEventStateT assertMask; SaHpiEventStateT deassertMask; /* *************************************** * Find a resource with No Sensor type rdr * ***************************************/ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid,SAHPI_CAPABILITY_SENSOR,SAHPI_FIRST_ENTRY, &rptentry, SAHPI_FALSE); if (err != SA_OK) { dbg("Error! Can not find resources for test environment\n"); dbg(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test Capability checking **************************/ expected_err = SA_ERR_HPI_CAPABILITY; err = saHpiSensorEventMasksGet(sessionid, id, sid, &assertMask, &deassertMask); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/tcontrol003.c0000644000175100017510000001027112575647274017777 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiResourceIdT id; SaHpiSessionIdT sessionid; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiCtrlNumT cid = 1; SaHpiCtrlModeT mode = SAHPI_CTRL_MODE_AUTO; SaHpiCtrlStateT state; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundControl; struct oh_handler_state l_handle; /* ************************************* * Find a resource with Control type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid, SAHPI_CAPABILITY_CONTROL, SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Can not find a control resource for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: find a control RDR **************************/ entryid = SAHPI_FIRST_ENTRY; foundControl = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if (rdr.RdrType == SAHPI_CTRL_RDR) { foundControl = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundControl) { err("Did not find desired resource for test\n"); return(SA_OK); } else { cid = rdr.RdrTypeUnion.CtrlRec.Num; } /************************** * Test 1: Invalid Handle *************************/ memset(&l_handle, 0, sizeof(struct oh_handler_state)); expected_err = SA_ERR_HPI_INVALID_PARAMS; err = snmp_bc_set_control_state(NULL, id, cid, mode, &state); checkstatus(err, expected_err, testfail); /************************** * Test 2: Resource ID with no RPT *************************/ expected_err = SA_ERR_HPI_INVALID_RESOURCE; err = saHpiControlSet(sessionid, 5000, cid, mode, &state); checkstatus(err, expected_err, testfail); /************************** * Test 3: Control ID with no RDR *************************/ expected_err = SA_ERR_HPI_NOT_PRESENT; err = saHpiControlSet(sessionid, id, 5000, mode, &state); checkstatus(err, expected_err, testfail); /************************** * Test 4: NULL state with AUTO mode *************************/ expected_err = SA_ERR_HPI_READ_ONLY; err = saHpiControlSet(sessionid, id, cid, mode, NULL); checkstatus(err, expected_err, testfail); /************************** * Test 5: NULL state with AUTO mode *************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = saHpiControlSet(sessionid, id, cid, SAHPI_CTRL_MODE_MANUAL, NULL); checkstatus(err, expected_err, testfail); /************************** * Test 6: Invalid Capability *************************/ err = tfind_resource(&sessionid, SAHPI_CAPABILITY_CONTROL, SAHPI_FIRST_ENTRY, &rptentry, SAHPI_FALSE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } expected_err = SA_ERR_HPI_CAPABILITY; err = saHpiControlSet(sessionid, rptentry.ResourceId, cid, mode, &state); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/tsensorget001.c0000644000175100017510000000221212575647274020322 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiResourceIdT id =0; SaHpiSensorNumT sid = 0; SaHpiEventStateT state; SaHpiSensorReadingT reading; /************************** * Test : NULL handle **************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = snmp_bc_get_sensor_reading(NULL, id, sid, &reading, &state); checkstatus(err, expected_err, testfail); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/tsensorset024.c0000644000175100017510000000544312575647274020354 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiResourceIdT id = 0; SaHpiSessionIdT sessionid; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiSensorNumT sid = 0; SaHpiSensorThresholdsT thres; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundSensor; /* ************************************* * Find a resource with Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid,SAHPI_CAPABILITY_SENSOR,SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: find a sensor with desired property **************************/ entryid = SAHPI_FIRST_ENTRY; foundSensor = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if ((rdr.RdrType == SAHPI_SENSOR_RDR) && (rdr.RdrTypeUnion.SensorRec.Category == SAHPI_EC_THRESHOLD) && (rdr.RdrTypeUnion.SensorRec.ThresholdDefn.WriteThold == 0xFF) && (rdr.RdrTypeUnion.SensorRec.ThresholdDefn.ReadThold == 0xFF)) { foundSensor = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundSensor) { err("Did not find desired resource for test\n"); return(SA_OK); } else { sid = rdr.RdrTypeUnion.SensorRec.Num; } /************************** * Test **************************/ expected_err = SA_ERR_HPI_INTERNAL_ERROR; err = saHpiSensorThresholdsSet(sessionid, id, sid, &thres); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/tsensorset004.c0000644000175100017510000000560412575647274020351 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiResourceIdT id; SaHpiSessionIdT sessionid; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundSensor; SaHpiBoolT enable = SAHPI_TRUE; SaHpiSensorNumT sid = 0; /* ************************************* * Find a resource with Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid,SAHPI_CAPABILITY_SENSOR,SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: find a sensor with desired property **************************/ entryid = SAHPI_FIRST_ENTRY; foundSensor = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if ((rdr.RdrType == SAHPI_SENSOR_RDR) && (rdr.RdrTypeUnion.SensorRec.EnableCtrl == SAHPI_TRUE)) { foundSensor = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundSensor) { err("Did not find desired resource for test\n"); return(SA_OK); } else { sid = rdr.RdrTypeUnion.SensorRec.Num; } /************************** * Test **************************/ expected_err = SA_OK; err = saHpiSensorEnableSet(sessionid, id, sid, enable); checkstatus(err, expected_err, testfail); /************************** * Test **************************/ enable = SAHPI_FALSE; expected_err = SA_OK; err = saHpiSensorEnableSet(sessionid, id, sid, enable); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/openhpi.conf0000644000175100017510000000703512575647274020061 0ustar mohanmohan#File format is outlined here and examples are given ###First section, declare global parameters #example: #global { # OPENHPI_LOG_SEV = "MAJOR" #} #Parameters in the global stanza will be converted to #environment variables. #OPENHPI_LOG_SEV sets which events will be logged in the domain #system event log based on severity: CRITICAL, MAJOR, MINOR, #INFORMATIONAL, OK, and DEBUG. ###Second section, declare plugin to use: #example: #plugin plugin-name #plugin libdummy #Depends on openipmi to be installed on this system: #plugin libipmi #Depends on net-snmp being installed on the system: plugin libsnmp_bc #Depends openhpi being configured #"configure --enable-dummy=static": #plugin dummy #plugin libipmidirect ############################################################################# ##**WARNING** System administrators have to make sure that entity paths are ## unique in a domain. If entity paths are conflicting among handlers, make ## sure the "entity_root" is unique here across handlers. ############################################################################# ###Third section is a handler (instance) declaration with arguments understood by plugin #Strings are enclosed by "", numbers are not. #handler libdummy { # entity_root = "{SYSTEM_CHASSIS,1}" # name = "test" # addr = 0 #} # Dummy allows you open second virtual by addr 1 #handler libdummy { # addr = 1 #} #section for ipmi plugin using SMI -- local interface #handler libipmi { # entity_root = "{SYSTEM_CHASSIS,2}" # name = "smi" # addr = 0 #} #Section for ipmi plugin based on OpenIPMI: #handler libipmi { # entity_root = "{SYSTEM_CHASSIS,3}" # name = "lan" # addr = "x.x.x.x" #ipaddress # port = 999 # auth_type = "straight" # auth_level= "user" # username = "joe" # password = "blow" #} #Section for snmp_bc plugin: #The root entry can be omitted in 'entity_root', #but not the chassis entry. handler libsnmp_bc { entity_root = "{SYSTEM_CHASSIS,1}" # Required host = "1.2.3.4" # Required community = "test" # Version 1 Required. version = "1" # Required. SNMP protocol version (1|3) security_name = "snmpv3_user" # Version 3 Required. passphrase = "opensesame" # Version 3. Required if security_level is authNoPriv or authPriv. auth_type = "MD5" # Version 3. Passphrase encoding (MD5|SHA) security_level = "noAuthNoPriv" # Version 3. (noAuthNoPriv|authNoPriv|authPriv) } #Section for static dummy plugin: #If openhpi configured with #configure --enable-dummy=static #the dummy plugin is compiled in. #It is possible to use dummy and libdummy #at the same time. #handler dummy { # entity_root = "{SYSTEM_CHASSIS,5}" # name = "test" # addr = 2 #} #section for ipmidirect plugin using SMI -- local interface #handler libipmidirect { # entity_root = "{SYSTEM_CHASSIS,6}" # name = "smi" # addr = 0 #} #Section for ipmidirect plugin using RMCP: #handler libipmidirect { # entity_root = "{SYSTEM_CHASSIS,7}" # name = "lan" # RMCP # addr = "localhost" # ipaddress # port = "623" # RMCP port # auth_type = "none" # none, md2, md5 or straight # auth_level = "admin" # none, callback, user, operator or admin # username = "arthur" # password = "pieman" # logflags = "" # logging off # # logflags = "file stdout" # # infos goes to logfile and stdout # # the logfile are log00.log, log01.log ... # # if #logfile_max reached replace the oldest one # logfile = "log" # logfile_max = 10 #} openhpi-3.6.1/plugins/snmp_bc/t/sim_resources.c0000644000175100017510000131664412575647274020610 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ /************************************************************************** * This source file defines the resource arrays declared in sim_resources.h *************************************************************************/ #include #include #include struct snmp_bc_data sim_resource_array[] = { { /* TIMEOUT * This OID is used to force a SNMP Access timeout condition. * It is used to test Device Busy/Device Not Respond */ .oid = ".1.3.6.1.4.1.2.3.51.2.4.4.1.7777", .mib = { .type = ASN_INTEGER, .value = { .integer = SNMP_FORCE_TIMEOUT, }, }, }, { /* DATETIME */ .oid = ".1.3.6.1.4.1.2.3.51.2.4.4.1.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "12/25/2003,06:30:00", }, }, }, { /* Chassis Type * * This OID is used to determine if the chassis type. Only available on * newer levels of BladeCenter code. * If integer == 97 system is a BC; if integer = 98 system in BCT */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.4.38.0", .mib = { .type = ASN_INTEGER, .value = { .integer = 98, }, }, }, { /* Chassis Subtype * * This OID is used to determine if the chassis subtype. Only available on * newer levels of BladeCenter code. * If integer == 0, its the orignal system; 2 its the H models */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.4.39.0", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* RSA Health * * This OID is used to determine if the system is a RSA or not * If integer == SA_ERR_SNMP_NOSUCHOBJECT, platform is not an RSA. * Code checks for RSA platform before it checks for BC platform * type. */ .oid = ".1.3.6.1.4.1.2.3.51.1.2.7.1.0", .mib = { .type = ASN_INTEGER, .value = { .integer = SA_ERR_SNMP_NOSUCHOBJECT, /* 255 = RSA */ }, }, }, { /* BCT System Health Status * * This OID is used to determine if the system is a BCT or not. * If integer == 255 system is a BCT; if integer = SA_ERR_SNMP_NOSUCHOBJECT * system is not a BCT; Need to coordinate with BCI Health value below. */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.9.1.0", .mib = { .type = ASN_INTEGER, .value = { .integer = SA_ERR_SNMP_NOSUCHOBJECT, /* .integer = 255, BCT */ }, }, }, { /* TimeZone - DayLight Savings Time */ .oid = ".1.3.6.1.4.1.2.3.51.2.4.4.2.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+0:00,no", }, }, }, /* * OIDs definitions for Blade Center Chassis Topology */ { /* SNMP_BC_NOS_FP_SUPPORTED mmblade.mib - chassisNoOfFPsSupported, FanPack */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.4.18.0", .mib = { .type = ASN_INTEGER, .value = { .integer = 2, }, }, }, { /* SNMP_BC_NOS_PB_SUPPORTED mmblade.mib - chassisNoOfPBsSupported, ProcessorBlade */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.4.19.0", .mib = { .type = ASN_INTEGER, .value = { .integer = 14, }, }, }, { /* SNMP_BC_NOS_SM_SUPPORTED mmblade.mib - chassisNoOfSMsSupported, SwitchModule */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.4.20.0", .mib = { .type = ASN_INTEGER, .value = { .integer = 4, }, }, }, { /* SNMP_BC_NOS_MM_SUPPORTED mmblade.mib - chassisNoOfMMsSupported, ManagementModule */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.4.21.0", .mib = { .type = ASN_INTEGER, .value = { .integer = 2, }, }, }, { /* SNMP_BC_NOS_PM_SUPPORTED mmblade.mib - chassisNoOfPMsSupported, PowerModule */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.4.22.0", .mib = { .type = ASN_INTEGER, .value = { .integer = 4, }, }, }, { /* SNMP_BC_NOS_MT_SUPPORTED mmblade.mib - chassisNoOfMTsSupported, MediaTray */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.4.23.0", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, }, }, }, { /* SNMP_BC_NOS_BLOWER_SUPPORTED mmblade.mib - chassisNoOfBlowersSupported, Blower */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.4.24.0", .mib = { .type = ASN_INTEGER, .value = { .integer = 4, }, }, }, { /* SNMP_BC_PB_INSTALLED mmblade.mib - chassisPBsInstalled, ProcessorBlade */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.4.25.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "10101010101010", }, }, }, { /* SNMP_BC_SM_INSTALLED mmblade.mib - chassisSMsInstalled, SwitchModule */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.4.29.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "1111", }, }, }, { /* SNMP_BC_MM_INSTALLED mmblade.mib - chassisMMsInstalled, ManagementModule */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.4.30.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "11", }, }, }, { /* SNMP_BC_PM_INSTALLED mmblade.mib - chassisPMsInstalled, PowerModule */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.4.31.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "1111", }, }, }, { /* SNMP_BC_MT_INSTALLED mmblade.mib - chassisMTsInstalled, MediaTray */ .oid = ",1.3.6.1.4.1.2.3.51.2.22.4.32.0", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, }, }, }, { /* SNMP_BC_BLOWER_INSTALLED mmblade.mib - chassisBlowersInstalled, Blower */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.4.33.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "1111", }, }, }, { /* SNMP_BC_FP_INSTALLED mmblade.mib - chassisFPsinstalled, FanPack */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.4.37.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "11", }, }, }, /* NOTE:: Must have one plus the END of Log Entry for each event in the simulator's event log */ { /* Event Log Index Number for Event 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.3.4.2.1.1.1", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, }, }, }, { /* Event Log Index Number for Event 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.3.4.2.1.1.2", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, }, }, }, { /* Event Log Index Number for Event 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.3.4.2.1.1.3", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, }, }, }, { /* Event Log Index Number for Event 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.3.4.2.1.1.4", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, }, }, }, /* Event Log Index Number for Event 5 */ { .oid = ".1.3.6.1.4.1.2.3.51.2.3.4.2.1.1.5", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, }, }, }, /* * Special End of Log Entry - Simulator ONLY * Code always reads one SNMP OID past end of log. When * snmp_get returns a negative value, the code knows its read * the entire error log. This entry allows the simulator to * force the snmp_get to return a negative value */ { .oid = ".1.3.6.1.4.1.2.3.51.2.3.4.2.1.1.6", .mib = { .type = ASN_INTEGER, .value = { .integer = SNMP_FORCE_ERROR, /* Force negative return */ }, }, }, { /* Event Log Message */ .oid = ".1.3.6.1.4.1.2.3.51.2.3.4.2.1.2.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Severity:ERR Source:BLADE_01 Name:SN#ZJ1R6G5932JX Date:11/19/05 Time:14:13:15 Text:CPU 3 ", }, }, }, { /* Event Log Message */ .oid = ".1.3.6.1.4.1.2.3.51.2.3.4.2.1.2.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Severity:WARN Source:BLADE_01 Name:SN#ZJ1R6G5932JX Date:11/19/05 Time:16:49:42 Text:System shutoff due to VRM 1 over voltage. Read value 247.01. Threshold value. 0.", }, }, }, { /* Event Log Message */ .oid = ".1.3.6.1.4.1.2.3.51.2.3.4.2.1.2.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Severity:WARN Source:BLADE_01 Name:SN#ZJ1R6G5932JX Date:11/19/05 Time:16:49:42 Text:System shutoff due to VRM 1 over voltage. Read value 247.01. Threshold value. 0.", }, }, }, { /* Event Log Message */ .oid = ".1.3.6.1.4.1.2.3.51.2.3.4.2.1.2.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Severity:WARN Source:BLADE_01 Name:SN#ZJ1R6G5932JX Date:11/19/05 Time:16:49:42 Text:System shutoff due to VRM 1 over voltage. Read value 247.01. Threshold value. 0.", }, }, }, { /* Event Log Message */ .oid = ".1.3.6.1.4.1.2.3.51.2.3.4.2.1.2.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Severity:WARN Source:BLADE_01 Name:SN#ZJ1R6G5932JX Date:11/19/05 Time:16:49:42 Text:System shutoff due to VRM 1 over voltage. Read value 247.01. Threshold value. 0.", }, }, }, { .oid = ".1.3.6.1.4.1.2.3.51.2.3.4.2.1.2.6", .mib = { .type = ASN_INTEGER, .value = { .integer = SNMP_FORCE_ERROR, /* Force negative return */ }, }, }, #if 0 .string = "Severity:ERR Source:BLADE_02 Name:SN#ZJ1R6G5931XY Date:11/19/05 Time:17:26:32 Text:Critical Interrupt - Front panel NMI", .string = "Severity:WARN Source:BLADE_01 Name:SN#ZJ1R6G5932JX Date:11/19/05 Time:16:49:42 Text:System shutoff due to VRM 1 over voltage. Read value 247.01. Threshold value. 0.", .string = "Severity:INFO Source:SERVPROC Name:SN# Date:11/19/05 Time:15:34:05 Text:Management Module 2 was removed.", .string = "Severity:ERR Source:BLADE_01 Name:SN#ZJ1R6G5932JX Date:11/19/05 Time:14:13:15 Text:CPU 3 shut off due to over temperature ", .string = "Severity:ERR Source:SERVPROC Name:SN# Date:11/19/05 Time:12:27:43 Text:Blower 1 Fault Single blower failure", .string = "Severity:INFO Source:SERVPROC Name:SN# Date:11/19/05 Time:12:17:51 Text:Management Module 2 was removed.", .string "Severity:WARN Source:SERVPROC Name:SN# Date:11/19/05 Time:10:56:35 Text:Management Module network uplink loss.", . .string = "Severity:ERR Source:SERVPROC Name:SN# Date:11/18/05 Time:21:46:49 Text:Blower 1 Failure Single blower failure", .string = "Severity:WARN Source:BLADE_01 Name:SN#ZJ1R6G5932JX Date:11/18/05 Time:18:15:47 Text:System over temperature for CPU 4. Read value. 0. Threshold value. 0.", .string = "Severity:INFO Source:SERVPROC Name:SN# Date:11/18/05 Time:18:15:47 Text:TAM MNR alert for Event (ID = 0x0421d504) System over temperature for CPU 4.", .string = "Severity:ERR Source:BLADE_01 Name:SN#ZJ1R6G5932JX Date:11/18/05 Time:18:14:37 Text:System shutoff due to CPU 3 over temperature. Read value 247.01. Threshold value. 0.", .string = "Severity:ERR Source:SERVPROC Name:SN# Date:11/18/05 Time:17:44:41 Text:CPU 1 shut off due to over temperature ", . .string = "Severity:ERR Source:BLADE_01 Name:SN#ZJ1R6G5932JX Date:11/18/05 Time:17:15:15 Text:Planar voltage fault. Read value. 0. Threshold value. 0.", .string = "Severity:ERR Source:BLADE_01 Name:SN#ZJ1R6G5932JX Date:11/18/05 Time:16:43:46 Text:IO Board voltage fault. Read value. 0. Threshold value. 0.", .string = "Severity:WARN Source:BLADE_01 Name:SN#ZJ1R6G5932JX Date:11/18/05 Time:15:26:02 Text:System shutoff due to VRM 1 over voltage. Read value 247.01. Threshold value. 0.", .string = "Severity:ERR Source:BLADE_01 Name:SN#ZJ1R6G5932JX Date:11/17/05 Time:14:08:22 Text:BEM +1.5V Fault. Read value 247.01. Threshold value. 0.", .string = "Severity:ERR Source:BLADE_01 Name:SN#ZJ1R6G5932JX Date:11/17/05 Time:14:08:10 Text:BEM Option failure ", .string = "Severity:ERR Source:BLADE_01 Name:SN#ZJ1R6G5932JX Date:11/17/05 Time:14:08:22 Text:BEM +1.5V Fault. Read value 247.01. Threshold value. 0.", .string = "Severity:ERR Source:BLADE_01 Name:SN#ZJ1R6G5932JX Date:11/17/05 Time:14:08:10 Text:BEM Option failure ", .string = "Severity:INFO Source:SERVPROC Name:SN# Date:11/12/05 Time:21:39:10 Text:Management Module in bay 1 is Active.", .string = "Severity:ERR Source:SERVPROC Name:bct-33 Date:11/12/05 Time:21:29:08 Text:Blower 1 Fault Single blower failure", .string = "Severity:WARN Source:SERVPROC Name:SN# Date:11/13/05 Time:16:19:07 Text:Power modules are nonredundant in domain 2", .string = "Severity:ERR Source:SERVPROC Name:SN# Date:11/13/05 Time:16:19:07 Text:Power Supply 4 Removed.", #endif { /* Clear Event Log */ .oid = ".1.3.6.1.4.1.2.3.51.2.3.4.3.0", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* write-only */ }, }, }, { /* SNMP_BC_BLADE_VECTOR */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.4.25.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "10101010101010", }, }, }, { /* SNMP_BC_FAN_VECTOR */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.4.33.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "1111", }, }, }, { /* SNMP_BC_MGMNT_VECTOR */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.4.30.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "11", }, }, }, { /* SNMP_BC_MGMNT_ACTIVE */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.4.34.0", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* number of active MM */ }, }, }, { /* SNMP_BC_MEDIA_TRAY_EXISTS */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.4.32.0", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* 0=no; 1=yes */ }, }, }, { /* SNMP_BC_POWER_VECTOR */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.4.31.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "1111", }, }, }, { /* SNMP_BC_SWITCH_VECTOR */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.4.29.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "1111", }, }, }, { /* Management module - Reset */ .oid = ".1.3.6.1.4.1.2.3.51.2.7.4.0", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* 1=execute */ }, }, }, { /* Management module - Failover */ .oid = ".1.3.6.1.4.1.2.3.51.2.7.7.0", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* 1=execute */ }, }, }, { /* Management module 1 UUID */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.6.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "0000 0000 0000 0000 0000 0000 0000 0000" }, }, }, { /* Management module 2 UUID */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.6.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Not available" }, }, }, { /* Switch Reset - Switch 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.8.1", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* 1=execute */ }, }, }, { /* Switch 1 UUID */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.8.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "EC4E 1D7C 704B 11D7 B69E 0005 5D89 A738 " }, }, }, { /* Switch Reset - Switch 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.8.2", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* 1=execute */ }, }, }, { /* Switch 2 UUID */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.8.2", .mib = { .type = ASN_OCTET_STR, .value = { // intentional error .string = "No value available" }, }, }, { /* Switch Reset - Switch 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.8.3", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* 1=execute */ }, }, }, { /* Switch 3 UUID */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.8.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "21DA E982 1B9E 95B8 7821 00C0 DD01 C65A " }, }, }, { /* Switch Reset - Switch 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.8.4", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* 1=execute */ }, }, }, { /* Switch 4 UUID */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.8.4", .mib = { .type = ASN_OCTET_STR, .value = { // intentional error .string = " " }, }, }, { /* Switch Power State - Switch 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.7.1", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* poweroff=0; poweron=1 */ }, }, }, { /* Switch Power State - Switch 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.7.2", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* poweroff=0; poweron=1 */ }, }, }, { /* Switch Power State - Switch 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.7.3", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* poweroff=0; poweron=1 */ }, }, }, { /* Switch Power State - Switch 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.7.4", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* poweroff=0; poweron=1 */ }, }, }, { /* Blade 1 UUID */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.8.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "D63F A294 1BB4 4A12 9D42 48D0 BE6A 3A20 " }, }, }, { /* Blade 2 UUID */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.8.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Not available" }, }, }, { /* Blade 3 UUID */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.8.3", .mib = { .type = ASN_OCTET_STR, .value = { // intentional error .string = "06DC 3B85 D61D B211 8576 8CF2 8F52 " }, }, }, { /* Blade 4 UUID */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.8.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "21DA-E8E3-8C36-22E2-92E1-00C0-DD01-C53C " }, }, }, { /* Blade 5 UUID */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.8.5", .mib = { .type = ASN_OCTET_STR, .value = { // intentional error .string = " Z4EE EE02 24B4 4A12 9B01 D094 209B 532C " }, }, }, { /* Blade 6 UUID */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.8.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Not available" }, }, }, { /* Blade 7 UUID */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.8.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = "64EE EE02 24B4 4A12 9B01 D094 209B 532C " }, }, }, { /* Blade 8 UUID */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.8.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Not available" }, }, }, { /* Blade 9 UUID */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.8.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Not available" }, }, }, { /* Blade 10 UUID */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.8.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Not available" }, }, }, { /* Blade 11 UUID */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.8.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Not available" }, }, }, { /* Blade 12 UUID */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.8.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Not available" }, }, }, { /* Blade 13 UUID */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.8.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Not available" }, }, }, { /* Blade 14 UUID */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.8.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Not available" }, }, }, { /* Media Tray UUID */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.9.8.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "0000 0000 0000 0000 0000 0000 0000 0000 " }, }, }, { /* Power module 1 UUID */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.8.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "22C2 2ADF 51A4 11D7 004B 0090 0005 0047 " }, }, }, { /* Power module 2 UUID */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.8.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = " B62965A8 6EB2 11D7 00D5 007400B00020 " }, }, }, { /* Power module 3 UUID */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.8.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "B62965A8-6EB2-11D7-00D5-007400B00020 " }, }, }, { /* Power module 4 UUID */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.8.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "3D2E 1265 6EB2 11D7 001C 007F 00C7 00A5 " }, }, }, #if 0 /* Simulator currently checks for duplicate OIDs - same as Power State */ { /* Switch Power On/Off - Switch 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.7.1", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* poweroff=0; poweron=1 */ }, }, }, { /* Switch Power On/Off - Switch 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.7.2", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* poweroff=0; poweron=1 */ }, }, }, { /* Switch Power On/Off - Switch 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.7.3", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* poweroff=0; poweron=1 */ }, }, }, { /* Switch Power On/Off - Switch 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.7.4", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* poweroff=0; poweron=1 */ }, }, }, #endif { /* BCT ONLY (BC will add on its next release) * * Blade 1 Number of reboots - bootCountPowerOnTimeBoots */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.3.1", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, }, }, }, { /* BCT ONLY (BC will add on its next release) * * Blade 2 Number of reboots - bootCountPowerOnTimeBoots */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.3.2", .mib = { .type = ASN_INTEGER, .value = { .integer = 2, }, }, }, { /* BCT ONLY (BC will add on its next release) * * Blade 3 Number of reboots - bootCountPowerOnTimeBoots */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.3.3", .mib = { .type = ASN_INTEGER, .value = { .integer = 3, }, }, }, { /* BCT ONLY (BC will add on its next release) * * Blade 4 Number of reboots - bootCountPowerOnTimeBoots */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.3.4", .mib = { .type = ASN_INTEGER, .value = { .integer = 4, }, }, }, { /* BCT ONLY (BC will add on its next release) * * Blade 5 Number of reboots - bootCountPowerOnTimeBoots */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.3.5", .mib = { .type = ASN_INTEGER, .value = { .integer = 5, }, }, }, { /* BCT ONLY (BC will add on its next release) * * Blade 6 Number of reboots - bootCountPowerOnTimeBoots */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.3.6", .mib = { .type = ASN_INTEGER, .value = { .integer = 6, }, }, }, { /* BCT ONLY (BC will add on its next release) * * Blade 7 Number of reboots - bootCountPowerOnTimeBoots */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.3.7", .mib = { .type = ASN_INTEGER, .value = { .integer = 7, }, }, }, { /* BCT ONLY (BC will add on its next release) * * Blade 8 Number of reboots - bootCountPowerOnTimeBoots */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.3.8", .mib = { .type = ASN_INTEGER, .value = { .integer = 8, }, }, }, { /* BCT ONLY (BC will add on its next release) * * Blade 9 Number of reboots - bootCountPowerOnTimeBoots */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.3.9", .mib = { .type = ASN_INTEGER, .value = { .integer = 9, }, }, }, { /* BCT ONLY (BC will add on its next release) * * Blade 10 Number of reboots - bootCountPowerOnTimeBoots */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.3.10", .mib = { .type = ASN_INTEGER, .value = { .integer = 10, }, }, }, { /* BCT ONLY (BC will add on its next release) * * Blade 11 Number of reboots - bootCountPowerOnTimeBoots */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.3.11", .mib = { .type = ASN_INTEGER, .value = { .integer = 11, }, }, }, { /* BCT ONLY (BC will add on its next release) * * Blade 12 Number of reboots - bootCountPowerOnTimeBoots */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.3.12", .mib = { .type = ASN_INTEGER, .value = { .integer = 12, }, }, }, { /* BCT ONLY (BC will add on its next release) * * Blade 13 Number of reboots - bootCountPowerOnTimeBoots */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.3.13", .mib = { .type = ASN_INTEGER, .value = { .integer = 13, }, }, }, { /* BCT ONLY (BC will add on its next release) * * Blade 14 Number of reboots - bootCountPowerOnTimeBoots */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.3.14", .mib = { .type = ASN_INTEGER, .value = { .integer = 14, }, }, }, { /* Blade Health - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.5.1", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* unknown=0; good=1; warning=2; bad=3 */ }, }, }, { /* Blade Health - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.5.2", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* unknown=0; good=1; warning=2; bad=3 */ }, }, }, { /* Blade Health - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.5.3", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* unknown=0; good=1; warning=2; bad=3 */ }, }, }, { /* Blade Health - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.5.4", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* unknown=0; good=1; warning=2; bad=3 */ }, }, }, { /* Blade Health - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.5.5", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* unknown=0; good=1; warning=2; bad=3 */ }, }, }, { /* Blade Health - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.5.6", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* unknown=0; good=1; warning=2; bad=3 */ }, }, }, { /* Blade Health - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.5.7", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* unknown=0; good=1; warning=2; bad=3 */ }, }, }, { /* Blade Health - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.5.8", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* unknown=0; good=1; warning=2; bad=3 */ }, }, }, { /* Blade Health - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.5.9", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* unknown=0; good=1; warning=2; bad=3 */ }, }, }, { /* Blade Health - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.5.10", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* unknown=0; good=1; warning=2; bad=3 */ }, }, }, { /* Blade Health - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.5.11", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* unknown=0; good=1; warning=2; bad=3 */ }, }, }, { /* Blade Health - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.5.12", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* unknown=0; good=1; warning=2; bad=3 */ }, }, }, { /* Blade Health - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.5.13", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* unknown=0; good=1; warning=2; bad=3 */ }, }, }, { /* Blade Health - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.5.14", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* unknown=0; good=1; warning=2; bad=3 */ }, }, }, { /* Blade Restart - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.8.1", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* execute=1 */ }, }, }, { /* Blade Restart - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.8.2", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* execute=1 */ }, }, }, { /* Blade Restart - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.8.3", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* execute=1 */ }, }, }, { /* Blade Restart - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.8.4", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* execute=1 */ }, }, }, { /* Blade Restart - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.8.5", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* execute=1 */ }, }, }, { /* Blade Restart - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.8.6", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* execute=1 */ }, }, }, { /* Blade Restart - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.8.7", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* execute=1 */ }, }, }, { /* Blade Restart - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.8.8", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* execute=1 */ }, }, }, { /* Blade Restart - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.8.9", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* execute=1 */ }, }, }, { /* Blade Restart - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.8.10", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* execute=1 */ }, }, }, { /* Blade Restart - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.8.11", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* execute=1 */ }, }, }, { /* Blade Restart - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.8.12", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* execute=1 */ }, }, }, { /* Blade Restart - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.8.13", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* execute=1 */ }, }, }, { /* Blade Restart - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.8.14", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* execute=1 */ }, }, }, { /* Blade Power State - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.4.1", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* off=0; on=1 */ }, }, }, { /* Blade Power State - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.4.2", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* off=0; on=1 */ }, }, }, { /* Blade Power State - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.4.3", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* off=0; on=1 */ }, }, }, { /* Blade Power State - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.4.4", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* off=0; on=1 */ }, }, }, { /* Blade Power State - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.4.5", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* off=0; on=1 */ }, }, }, { /* Blade Power State - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.4.6", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* off=0; on=1 */ }, }, }, { /* Blade Power State - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.4.7", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* off=0; on=1 */ }, }, }, { /* Blade Power State - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.4.8", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* off=0; on=1 */ }, }, }, { /* Blade Power State - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.4.9", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* off=0; on=1 */ }, }, }, { /* Blade Power State - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.4.10", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* off=0; on=1 */ }, }, }, { /* Blade Power State - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.4.11", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* off=0; on=1 */ }, }, }, { /* Blade Power State - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.4.12", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* off=0; on=1 */ }, }, }, { /* Blade Power State - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.4.13", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* off=0; on=1 */ }, }, }, { /* Blade Power State - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.4.14", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* off=0; on=1 */ }, }, }, { /* Blade Power On/Off - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.7.1", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* off=0; on=1 */ }, }, }, { /* Blade Power On/Off - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.7.2", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* off=0; on=1 */ }, }, }, { /* Blade Power On/Off - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.7.3", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* off=0; on=1 */ }, }, }, { /* Blade Power On/Off - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.7.4", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* off=0; on=1 */ }, }, }, { /* Blade Power On/Off - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.7.5", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* off=0; on=1 */ }, }, }, { /* Blade Power On/Off - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.7.6", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* off=0; on=1 */ }, }, }, { /* Blade Power On/Off - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.7.7", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* off=0; on=1 */ }, }, }, { /* Blade Power On/Off - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.7.8", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* off=0; on=1 */ }, }, }, { /* Blade Power On/Off - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.7.9", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* off=0; on=1 */ }, }, }, { /* Blade Power On/Off - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.7.10", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* off=0; on=1 */ }, }, }, { /* Blade Power On/Off - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.7.11", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* off=0; on=1 */ }, }, }, { /* Blade Power On/Off - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.7.12", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* off=0; on=1 */ }, }, }, { /* Blade Power On/Off - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.7.13", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* off=0; on=1 */ }, }, }, { /* Blade Power On/Off - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.7.14", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* off=0; on=1 */ }, }, }, { /* Front Panel LED - System Error */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.1.1.0", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Front Panel LED - Temperature */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.1.3.0", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Ambient temperature */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.1.5.1.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Management module temperature */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.1.1.2.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Chassis Plus 1.8 Volt */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.2.1.8.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.80 Volts", }, }, }, { /* Chassis Plus 1.8 Volt - Low Major */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.10.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.62 Volts", }, }, }, { /* Chassis Plus 1.8 Volt - Up Major */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.6.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.89 Volts", }, }, }, { /* Chassis Plus 1.8 Volt - Low Hysteresis */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.11.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.74 Volts", }, }, }, { /* Chassis Plus 1.8 Volt - Up Hysteresis */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.7.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.86 Volts", }, }, }, { /* Chassis Plus 2.5 Volt */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.2.1.6.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.50 Volts", }, }, }, { /* Chassis Plus 2.5 Volt - Low Major */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.10.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.25 Volts", }, }, }, { /* Chassis Plus 2.5 Volt - Up Major */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.6.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.63 Volts", }, }, }, { /* Chassis Plus 2.5 Volt - Low Hysteresis */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.11.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.42 Volts", }, }, }, { /* Chassis Plus 2.5 Volt - Up Hysteresis */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.7.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.58 Volts", }, }, }, { /* Chassis Plus 3.3 Volt */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.2.1.2.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.30 Volts", }, }, }, { /* Chassis Plus 3.3 Volt - Low Major */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.10.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.00 Volts", }, }, }, { /* Chassis Plus 3.3 Volt - Up Major */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.6.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.47 Volts", }, }, }, { /* Chassis Plus 3.3 Volt - Low Hysteresis */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.11.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.20 Volts", }, }, }, { /* Chassis Plus 3.3 Volt - Up Hysteresis */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.7.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.40 Volts", }, }, }, { /* Chassis Plus 5 Volt */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.2.1.1.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.00 Volts", }, }, }, { /* Chassis Plus 5 Volt - Low Major */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.10.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 4.50 Volts", }, }, }, { /* Chassis Plus 5 Volt - Up Major */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.6.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.25 Volts", }, }, }, { /* Chassis Plus 5 Volt - Low Hysteresis */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.11.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 4.85 Volts", }, }, }, { /* Chassis Plus 5 Volt - Up Hysteresis */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.7.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.15 Volts", }, }, }, { /* Chassis Negative 5 Volt */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.2.1.5.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "- 5.00 Volts", }, }, }, { /* Chassis Negative 5 Volt - Low Major */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.10.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "- 5.50 Volts", }, }, }, { /* Chassis Negative 5 Volt - Up Major */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.6.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "- 4.75 Volts", }, }, }, { /* Chassis Negative 5 Volt - Low Hysteresis */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.11.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "- 5.15 Volts", }, }, }, { /* Chassis Negitive 5 Volt - Up Hysteresis */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.7.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "- 4.85 Volts", }, }, }, { /* Chassis Plus 12 Volt */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.2.1.3.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+12.00 Volts", }, }, }, { /* Chassis Plus 12 Volt - Low Major */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.10.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+10.80 Volts", }, }, }, { /* Chassis Plus 12 Volt - Up Major */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.6.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+12.60 Volts", }, }, }, { /* Chassis Plus 12 Volt - Low Hysteresis */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.11.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+11.64 Volts", }, }, }, { /* Chassis Plus 12 Volt - Up Hysteresis */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.7.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+12.36 Volts", }, }, }, { /* Chassis Health */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.7.1.0", .mib = { .type = ASN_INTEGER, .value = { .integer = 255, /* critical=0; nonCritical=2; systemLevel=4; normal=255 */ }, }, }, { /* Chassis UUID */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.1.1.4.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "F161 42C1 6593 11D7 8D0E F738 156C AAAC " }, }, }, { /* Blade Error LED - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.7.1", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Blade Error LED - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.7.2", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Blade Error LED - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.7.3", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Blade Error LED - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.7.4", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Blade Error LED - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.7.5", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Blade Error LED - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.7.6", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Blade Error LED - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.7.7", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Blade Error LED - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.7.8", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Blade Error LED - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.7.9", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Blade Error LED - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.7.10", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Blade Error LED - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.7.11", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Blade Error LED - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.7.12", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Blade Error LED - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.7.13", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Blade Error LED - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.7.14", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Blade KVM Usage LED - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.9.1", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2 */ }, }, }, { /* Blade KVM Usage LED - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.9.2", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2 */ }, }, }, { /* Blade KVM Usage LED - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.9.3", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2 */ }, }, }, { /* Blade KVM Usage LED - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.9.4", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2 */ }, }, }, { /* Blade KVM Usage LED - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.9.5", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2 */ }, }, }, { /* Blade KVM Usage LED - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.9.6", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2 */ }, }, }, { /* Blade KVM Usage LED - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.9.7", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2 */ }, }, }, { /* Blade KVM Usage LED - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.9.8", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2 */ }, }, }, { /* Blade KVM Usage LED - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.9.9", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2 */ }, }, }, { /* Blade KVM Usage LED - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.9.10", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2 */ }, }, }, { /* Blade KVM Usage LED - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.9.11", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2 */ }, }, }, { /* Blade KVM Usage LED - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.9.12", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2 */ }, }, }, { /* Blade KVM Usage LED - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.9.13", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2 */ }, }, }, { /* Blade KVM Usage LED - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.9.14", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2 */ }, }, }, { /* Blade Media Tray Usage - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.10.1", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2 */ }, }, }, { /* Blade Media Tray Usage - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.10.2", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2 */ }, }, }, { /* Blade Media Tray Usage - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.10.3", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2 */ }, }, }, { /* Blade Media Tray Usage - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.10.4", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2 */ }, }, }, { /* Blade Media Tray Usage - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.10.5", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2 */ }, }, }, { /* Blade Media Tray Usage - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.10.6", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2 */ }, }, }, { /* Blade Media Tray Usage - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.10.7", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2 */ }, }, }, { /* Blade Media Tray Usage - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.10.8", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2 */ }, }, }, { /* Blade Media Tray Usage - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.10.9", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2 */ }, }, }, { /* Blade Media Tray Usage - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.10.10", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2 */ }, }, }, { /* Blade Media Tray Usage - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.10.11", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2 */ }, }, }, { /* Blade Media Tray Usage - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.10.12", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2 */ }, }, }, { /* Blade Media Tray Usage - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.10.13", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2 */ }, }, }, { /* Blade Media Tray Usage - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.10.14", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2 */ }, }, }, { /* Blade CPU 1 temperature - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.6.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 1 temperature - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.6.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 1 temperature - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.6.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 1 temperature - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.6.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 1 temperature - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.6.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 1 temperature - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.6.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 1 temperature - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.6.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 1 temperature - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.6.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 1 temperature - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.6.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 1 temperature - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.6.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 1 temperature - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.6.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 1 temperature - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.6.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 1 temperature - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.6.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 1 temperature - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.6.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 1 Up Critical temperature - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.6.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 1 Up Critical temperature - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.6.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 1 Up Critical temperature - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.6.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 1 Up Critical temperature - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.6.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 1 Up Critical temperature - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.6.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 1 Up Critical temperature - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.6.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 1 Up Critical temperature - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.6.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 1 Up Critical temperature - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.6.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 1 Up Critical temperature - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.6.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 1 Up Critical temperature - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.6.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 1 Up Critical temperature - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.6.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 1 Up Critical temperature - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.6.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 1 Up Critical temperature - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.6.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 1 Up Critical temperature - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.6.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 1 Up Major temperature - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.7.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 1 Up Major temperature - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.7.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 1 Up Major temperature - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.7.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 1 Up Major temperature - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.7.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 1 Up Major temperature - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.7.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 1 Up Major temperature - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.7.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 1 Up Major temperature - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.7.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 1 Up Major temperature - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.7.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 1 Up Major temperature - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.7.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 1 Up Major temperature - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.7.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 1 Up Major temperature - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.7.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 1 Up Major temperature - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.7.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 1 Up Major temperature - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.7.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 1 Up Major temperature - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.7.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 2 temperature - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.7.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 2 temperature - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.7.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 2 temperature - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.7.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 2 temperature - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.7.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 2 temperature - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.7.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 2 temperature - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.7.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 2 temperature - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.7.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 2 temperature - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.7.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 2 temperature - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.7.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 2 temperature - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.7.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 2 temperature - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.7.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 2 temperature - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.7.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 2 temperature - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.7.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 2 temperature - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.7.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 2 Up Critical temperature - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.9.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 2 Up Critical temperature - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.9.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 2 Up Critical temperature - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.9.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 2 Up Critical temperature - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.9.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 2 Up Critical temperature - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.9.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 2 Up Critical temperature - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.9.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 2 Up Critical temperature - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.9.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 2 Up Critical temperature - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.9.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 2 Up Critical temperature - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.9.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 2 Up Critical temperature - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.9.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 2 Up Critical temperature - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.9.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 2 Up Critical temperature - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.9.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 2 Up Critical temperature - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.9.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 2 Up Critical temperature - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.9.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 2 Up Major temperature - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.10.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 2 Up Major temperature - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.10.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 2 Up Major temperature - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.10.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 2 Up Major temperature - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.10.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 2 Up Major temperature - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.10.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 2 Up Major temperature - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.10.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 2 Up Major temperature - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.10.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 2 Up Major temperature - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.10.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 2 Up Major temperature - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.10.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 2 Up Major temperature - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.10.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 2 Up Major temperature - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.10.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 2 Up Major temperature - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.10.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 2 Up Major temperature - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.10.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 2 Up Major temperature - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.10.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 3 temperature - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.8.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 3 temperature - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.8.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 3 temperature - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.8.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 3 temperature - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.8.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 3 temperature - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.8.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 3 temperature - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.8.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 3 temperature - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.8.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 3 temperature - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.8.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 3 temperature - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.8.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 3 temperature - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.8.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 3 temperature - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.8.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 3 temperature - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.8.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 3 temperature - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.8.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 3 temperature - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.8.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 3 Up Critical temperature - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.12.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 3 Up Critical temperature - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.12.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 3 Up Critical temperature - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.12.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 3 Up Critical temperature - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.12.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 3 Up Critical temperature - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.12.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 3 Up Critical temperature - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.12.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 3 Up Critical temperature - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.12.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 3 Up Critical temperature - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.12.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 3 Up Critical temperature - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.12.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 3 Up Critical temperature - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.12.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 3 Up Critical temperature - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.12.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 3 Up Critical temperature - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.12.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 3 Up Critical temperature - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.12.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 3 Up Critical temperature - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.12.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 3 Up Major temperature - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.13.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 3 Up Major temperature - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.13.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 3 Up Major temperature - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.13.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 3 Up Major temperature - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.13.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 3 Up Major temperature - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.13.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 3 Up Major temperature - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.13.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 3 Up Major temperature - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.13.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 3 Up Major temperature - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.13.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 3 Up Major temperature - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.13.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 3 Up Major temperature - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.13.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 3 Up Major temperature - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.13.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 3 Up Major temperature - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.13.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 3 Up Major temperature - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.13.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 3 Up Major temperature - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.13.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 4 temperature - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.9.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 4 temperature - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.9.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 4 temperature - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.9.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 4 temperature - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.9.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 4 temperature - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.9.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 4 temperature - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.9.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 4 temperature - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.9.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 4 temperature - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.9.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 4 temperature - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.9.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 4 temperature - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.9.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 4 temperature - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.9.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 4 temperature - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.9.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 4 temperature - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.9.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 4 temperature - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.9.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 4 Up Critical temperature - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.15.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 4 Up Critical temperature - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.15.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 4 Up Critical temperature - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.15.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 4 Up Critical temperature - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.15.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 4 Up Critical temperature - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.15.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 4 Up Critical temperature - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.15.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 4 Up Critical temperature - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.15.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 4 Up Critical temperature - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.15.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 4 Up Critical temperature - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.15.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 4 Up Critical temperature - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.15.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 4 Up Critical temperature - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.15.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 4 Up Critical temperature - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.15.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 4 Up Critical temperature - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.15.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 4 Up Critical temperature - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.15.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 4 Up Major temperature - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.16.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 4 Up Major temperature - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.16.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 4 Up Major temperature - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.16.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 4 Up Major temperature - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.16.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 4 Up Major temperature - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.16.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 4 Up Major temperature - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.16.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 4 Up Major temperature - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.16.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 4 Up Major temperature - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.16.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 4 Up Major temperature - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.16.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 4 Up Major temperature - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.16.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 4 Up Major temperature - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.16.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 4 Up Major temperature - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.16.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 4 Up Major temperature - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.16.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 4 Up Major temperature - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.16.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade DASD1 Temperature - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.10.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 199.99 Centigrade", }, }, }, { /* Blade DASD1 Temperature - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.10.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 9.99 Centigrade", }, }, }, { /* Blade DASD1 Temperature - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.10.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "-199.99 Centigrade", }, }, }, { /* Blade DASD1 Temperature - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.10.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "- 9.99 Centigrade", }, }, }, { /* Blade DASD1 Temperature - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.10.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 0.00 Centigrade", }, }, }, { /* Blade DASD1 Temperature - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.10.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "- 0.00 Centigrade", }, }, }, { /* Blade DASD1 Temperature - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.10.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 0.00 Centigrade", }, }, }, { /* Blade DASD1 Temperature - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.10.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 0.00 Centigrade", }, }, }, { /* Blade DASD1 Temperature - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.10.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 0.00 Centigrade", }, }, }, { /* Blade DASD1 Temperature - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.10.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 0.00 Centigrade", }, }, }, { /* Blade DASD1 Temperature - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.10.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 0.00 Centigrade", }, }, }, { /* Blade DASD1 Temperature - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.10.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 0.00 Centigrade", }, }, }, { /* Blade DASD1 Temperature - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.10.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 0.00 Centigrade", }, }, }, { /* Blade DASD1 Temperature - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.10.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 0.00 Centigrade", }, }, }, { /* Blade IPMI Temperature Capability - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.11.1", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, }, }, }, { /* Blade IPMI Temperature Capability - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.11.2", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade IPMI Temperature Capability - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.11.3", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, }, }, }, { /* Blade IPMI Temperature Capability - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.11.4", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade IPMI Temperature Capability - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.11.5", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade IPMI Temperature Capability - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.11.6", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade IPMI Temperature Capability - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.11.7", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade IPMI Temperature Capability - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.11.8", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade IPMI Temperature Capability - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.11.9", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade IPMI Temperature Capability - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.11.10", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade IPMI Temperature Capability - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.11.11", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade IPMI Temperature Capability - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.11.12", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade IPMI Temperature Capability - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.11.13", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade IPMI Temperature Capability - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.11.14", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade IPMI Temperature Sensor 1 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.12.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "CPU 1 TeMP = +37.00 Centigrade", }, }, }, { /* Blade IPMI Temperature Sensor 1 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.12.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Not Readable!", }, }, }, { /* Blade IPMI Temperature Sensor 2 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.13.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Not Readable!", }, }, }, { /* Blade IPMI Temperature Sensor 2 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.13.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Not Readable!", }, }, }, { /* Blade IPMI Temperature Sensor 3 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.14.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = " CPU2 temp = +90.00 Centigrade ", }, }, }, { /* Blade IPMI Temperature Sensor 3 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.14.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No temperature)", }, }, }, { /* Blade IPMI Temperature Sensor 4 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.15.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "GARBAGE", }, }, }, { /* Blade IPMI Temperature Sensor 4 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.15.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "GARBAGE", }, }, }, { /* Blade IPMI Temperature Sensor 5 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.16.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No temperature)", }, }, }, { /* Blade IPMI Temperature Sensor 5 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.16.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No temperature)", }, }, }, { /* Blade IPMI Temperature Sensor 6 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.17.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No temperature)", }, }, }, { /* Blade IPMI Temperature Sensor 6 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.17.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No temperature)", }, }, }, { /* Blade DASD1 Up Critical temperature - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.18.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade DASD1 Up Critical temperature - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.18.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade DASD1 Up Critical temperature - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.18.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade DASD1 Up Critical temperature - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.18.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade DASD1 Up Critical temperature - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.18.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade DASD1 Up Critical temperature - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.18.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade DASD1 Up Critical temperature - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.18.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade DASD1 Up Critical temperature - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.18.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade DASD1 Up Critical temperature - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.18.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade DASD1 Up Critical temperature - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.18.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade DASD1 Up Critical temperature - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.18.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade DASD1 Up Critical temperature - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.18.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade DASD1 Up Critical temperature - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.18.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade DASD1 Up Critical temperature - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.18.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade DASD1 Up Major temperature - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.19.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade DASD1 Up Major temperature - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.19.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade DASD1 Up Major temperature - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.19.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade DASD1 Up Major temperature - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.19.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade DASD1 Up Major temperature - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.19.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade DASD1 Up Major temperature - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.19.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade DASD1 Up Major temperature - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.19.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade DASD1 Up Major temperature - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.19.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade DASD1 Up Major temperature - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.19.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade DASD1 Up Major temperature - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.19.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade DASD1 Up Major temperature - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.19.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade DASD1 Up Major temperature - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.19.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade DASD1 Up Major temperature - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.19.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade DASD1 Up Major temperature - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.19.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade IPMI Temperature Sensor 1 Up Critical - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.22.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = " +95.00 Centigrade", }, }, }, { /* Blade IPMI Temperature Sensor 1 Up Major - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.23.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = " +85.00 Centigrade", }, }, }, { /* Blade IPMI Temperature Sensor 3 Up Critical - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.28.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = " +95.00 Centigrade", }, }, }, { /* Blade IPMI Temperature Sensor 3 Up Major - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.29.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = " +85.00 Centigrade", }, }, }, { /* Blade 5V - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.6.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.00 Volts", }, }, }, { /* Blade 5V - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.6.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.00 Volts", }, }, }, { /* Blade 5V - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.6.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.00 Volts", }, }, }, { /* Blade 5V - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.6.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.00 Volts", }, }, }, { /* Blade 5V - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.6.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.00 Volts", }, }, }, { /* Blade 5V - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.6.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.00 Volts", }, }, }, { /* Blade 5V - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.6.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.00 Volts", }, }, }, { /* Blade 5V - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.6.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.00 Volts", }, }, }, { /* Blade 5V - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.6.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.00 Volts", }, }, }, { /* Blade 5V - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.6.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.00 Volts", }, }, }, { /* Blade 5V - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.6.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.00 Volts", }, }, }, { /* Blade 5V - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.6.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.00 Volts", }, }, }, { /* Blade 5V - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.6.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.00 Volts", }, }, }, { /* Blade 5V - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.6.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.00 Volts", }, }, }, { /* Blade 5V Low Major - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.7.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 4.40 Volts", }, }, }, { /* Blade 5V Low Major - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.7.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 4.40 Volts", }, }, }, { /* Blade 5V Low Major - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.7.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 4.40 Volts", }, }, }, { /* Blade 5V Low Major - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.7.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 4.40 Volts", }, }, }, { /* Blade 5V Low Major - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.7.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 4.40 Volts", }, }, }, { /* Blade 5V Low Major - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.7.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 4.40 Volts", }, }, }, { /* Blade 5V Low Major - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.7.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 4.40 Volts", }, }, }, { /* Blade 5V Low Major - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.7.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 4.40 Volts", }, }, }, { /* Blade 5V Low Major - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.7.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 4.40 Volts", }, }, }, { /* Blade 5V Low Major - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.7.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 4.40 Volts", }, }, }, { /* Blade 5V Low Major - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.7.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 4.40 Volts", }, }, }, { /* Blade 5V Low Major - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.7.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 4.40 Volts", }, }, }, { /* Blade 5V Low Major - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.7.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 4.40 Volts", }, }, }, { /* Blade 5V Low Major - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.7.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 4.40 Volts", }, }, }, { /* Blade 5V Up Major - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.6.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.50 Volts", }, }, }, { /* Blade 5V Up Major - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.6.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.50 Volts", }, }, }, { /* Blade 5V Up Major - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.6.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.50 Volts", }, }, }, { /* Blade 5V Up Major - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.6.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.50 Volts", }, }, }, { /* Blade 5V Up Major - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.6.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.50 Volts", }, }, }, { /* Blade 5V Up Major - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.6.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.50 Volts", }, }, }, { /* Blade 5V Up Major - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.6.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.50 Volts", }, }, }, { /* Blade 5V Up Major - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.6.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.50 Volts", }, }, }, { /* Blade 5V Up Major - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.6.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.50 Volts", }, }, }, { /* Blade 5V Up Major - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.6.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.50 Volts", }, }, }, { /* Blade 5V Up Major - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.6.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.50 Volts", }, }, }, { /* Blade 5V Up Major - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.6.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.50 Volts", }, }, }, { /* Blade 5V Up Major - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.6.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.50 Volts", }, }, }, { /* Blade 5V Up Major - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.6.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.50 Volts", }, }, }, { /* Blade 3.3 Volts - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.7.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.30 Volts", }, }, }, { /* Blade 3.3 Volts - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.7.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.30 Volts", }, }, }, { /* Blade 3.3 Volts - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.7.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.30 Volts", }, }, }, { /* Blade 3.3 Volts - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.7.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.30 Volts", }, }, }, { /* Blade 3.3 Volts - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.7.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.30 Volts", }, }, }, { /* Blade 3.3 Volts - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.7.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.30 Volts", }, }, }, { /* Blade 3.3 Volts - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.7.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.30 Volts", }, }, }, { /* Blade 3.3 Volts - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.7.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.30 Volts", }, }, }, { /* Blade 3.3 Volts - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.7.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.30 Volts", }, }, }, { /* Blade 3.3 Volts - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.7.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.30 Volts", }, }, }, { /* Blade 3.3 Volts - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.7.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.30 Volts", }, }, }, { /* Blade 3.3 Volts - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.7.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.30 Volts", }, }, }, { /* Blade 3.3 Volts - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.7.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.30 Volts", }, }, }, { /* Blade 3.3 Volts - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.7.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.30 Volts", }, }, }, { /* Blade 3.3 Volts Low Major - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.9.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.97 Volts", }, }, }, { /* Blade 3.3 Volts Low Major - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.9.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.97 Volts", }, }, }, { /* Blade 3.3 Volts Low Major - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.9.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.97 Volts", }, }, }, { /* Blade 3.3 Volts Low Major - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.9.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.97 Volts", }, }, }, { /* Blade 3.3 Volts Low Major - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.9.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.97 Volts", }, }, }, { /* Blade 3.3 Volts Low Major - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.9.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.97 Volts", }, }, }, { /* Blade 3.3 Volts Low Major - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.9.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.97 Volts", }, }, }, { /* Blade 3.3 Volts Low Major - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.9.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.97 Volts", }, }, }, { /* Blade 3.3 Volts Low Major - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.9.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.97 Volts", }, }, }, { /* Blade 3.3 Volts Low Major - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.9.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.97 Volts", }, }, }, { /* Blade 3.3 Volts Low Major - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.9.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.97 Volts", }, }, }, { /* Blade 3.3 Volts Low Major - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.9.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.97 Volts", }, }, }, { /* Blade 3.3 Volts Low Major - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.9.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.97 Volts", }, }, }, { /* Blade 3.3 Volts Low Major - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.9.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.97 Volts", }, }, }, { /* Blade 3.3 Volts Up Major - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.8.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.63 Volts", }, }, }, { /* Blade 3.3 Volts Up Major - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.8.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.63 Volts", }, }, }, { /* Blade 3.3 Volts Up Major - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.8.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.63 Volts", }, }, }, { /* Blade 3.3 Volts Up Major - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.8.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.63 Volts", }, }, }, { /* Blade 3.3 Volts Up Major - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.8.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.63 Volts", }, }, }, { /* Blade 3.3 Volts Up Major - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.8.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.63 Volts", }, }, }, { /* Blade 3.3 Volts Up Major - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.8.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.63 Volts", }, }, }, { /* Blade 3.3 Volts Up Major - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.8.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.63 Volts", }, }, }, { /* Blade 3.3 Volts Up Major - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.8.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.63 Volts", }, }, }, { /* Blade 3.3 Volts Up Major - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.8.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.63 Volts", }, }, }, { /* Blade 3.3 Volts Up Major - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.8.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.63 Volts", }, }, }, { /* Blade 3.3 Volts Up Major - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.8.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.63 Volts", }, }, }, { /* Blade 3.3 Volts Up Major - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.8.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.63 Volts", }, }, }, { /* Blade 3.3 Volts Up Major - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.8.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.63 Volts", }, }, }, { /* Blade 12 Volts - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.8.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+12.00 Volts", }, }, }, { /* Blade 12 Volts - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.8.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+12.00 Volts", }, }, }, { /* Blade 12 Volts - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.8.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+12.00 Volts", }, }, }, { /* Blade 12 Volts - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.8.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+12.00 Volts", }, }, }, { /* Blade 12 Volts - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.8.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+12.00 Volts", }, }, }, { /* Blade 12 Volts - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.8.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+12.00 Volts", }, }, }, { /* Blade 12 Volts - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.8.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+12.00 Volts", }, }, }, { /* Blade 12 Volts - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.8.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+12.00 Volts", }, }, }, { /* Blade 12 Volts - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.8.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+12.00 Volts", }, }, }, { /* Blade 12 Volts - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.8.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+12.00 Volts", }, }, }, { /* Blade 12 Volts - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.8.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+12.00 Volts", }, }, }, { /* Blade 12 Volts - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.8.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+12.00 Volts", }, }, }, { /* Blade 12 Volts - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.8.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+12.00 Volts", }, }, }, { /* Blade 12 Volts - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.8.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+12.00 Volts", }, }, }, { /* Blade 12 Volts Low Major - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.11.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+10.80 Volts", }, }, }, { /* Blade 12 Volts Low Major - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.11.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+10.80 Volts", }, }, }, { /* Blade 12 Volts Low Major - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.11.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+10.80 Volts", }, }, }, { /* Blade 12 Volts Low Major - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.11.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+10.80 Volts", }, }, }, { /* Blade 12 Volts Low Major - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.11.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+10.80 Volts", }, }, }, { /* Blade 12 Volts Low Major - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.11.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+10.80 Volts", }, }, }, { /* Blade 12 Volts Low Major - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.11.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+10.80 Volts", }, }, }, { /* Blade 12 Volts Low Major - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.11.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+10.80 Volts", }, }, }, { /* Blade 12 Volts Low Major - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.11.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+10.80 Volts", }, }, }, { /* Blade 12 Volts Low Major - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.11.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+10.80 Volts", }, }, }, { /* Blade 12 Volts Low Major - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.11.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+10.80 Volts", }, }, }, { /* Blade 12 Volts Low Major - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.11.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+10.80 Volts", }, }, }, { /* Blade 12 Volts Low Major - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.11.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+10.80 Volts", }, }, }, { /* Blade 12 Volts Low Major - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.11.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+10.80 Volts", }, }, }, { /* Blade 12 Volts Up Major - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.10.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+13.20 Volts", }, }, }, { /* Blade 12 Volts Up Major - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.10.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+13.20 Volts", }, }, }, { /* Blade 12 Volts Up Major - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.10.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+13.20 Volts", }, }, }, { /* Blade 12 Volts Up Major - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.10.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+13.20 Volts", }, }, }, { /* Blade 12 Volts Up Major - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.10.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+13.20 Volts", }, }, }, { /* Blade 12 Volts Up Major - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.10.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+13.20 Volts", }, }, }, { /* Blade 12 Volts Up Major - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.10.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+13.20 Volts", }, }, }, { /* Blade 12 Volts Up Major - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.10.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+13.20 Volts", }, }, }, { /* Blade 12 Volts Up Major - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.10.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+13.20 Volts", }, }, }, { /* Blade 12 Volts Up Major - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.10.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+13.20 Volts", }, }, }, { /* Blade 12 Volts Up Major - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.10.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+13.20 Volts", }, }, }, { /* Blade 12 Volts Up Major - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.10.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+13.20 Volts", }, }, }, { /* Blade 12 Volts Up Major - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.10.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+13.20 Volts", }, }, }, { /* Blade 12 Volts Up Major - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.10.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+13.20 Volts", }, }, }, { /* Blade 2.5 Volts - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.10.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.50 Volts", }, }, }, { /* Blade 2.5 Volts - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.10.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.50 Volts", }, }, }, { /* Blade 2.5 Volts - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.10.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.50 Volts", }, }, }, { /* Blade 2.5 Volts - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.10.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.50 Volts", }, }, }, { /* Blade 2.5 Volts - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.10.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.50 Volts", }, }, }, { /* Blade 2.5 Volts - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.10.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.50 Volts", }, }, }, { /* Blade 2.5 Volts - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.10.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.50 Volts", }, }, }, { /* Blade 2.5 Volts - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.10.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.50 Volts", }, }, }, { /* Blade 2.5 Volts - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.10.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.50 Volts", }, }, }, { /* Blade 2.5 Volts - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.10.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.50 Volts", }, }, }, { /* Blade 2.5 Volts - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.10.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.50 Volts", }, }, }, { /* Blade 2.5 Volts - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.10.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.50 Volts", }, }, }, { /* Blade 2.5 Volts - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.10.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.50 Volts", }, }, }, { /* Blade 2.5 Volts - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.10.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.50 Volts", }, }, }, { /* Blade 2.5 Volts Low Major - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.15.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.25 Volts", }, }, }, { /* Blade 2.5 Volts Low Major - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.15.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.25 Volts", }, }, }, { /* Blade 2.5 Volts Low Major - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.15.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.25 Volts", }, }, }, { /* Blade 2.5 Volts Low Major - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.15.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.25 Volts", }, }, }, { /* Blade 2.5 Volts Low Major - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.15.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.25 Volts", }, }, }, { /* Blade 2.5 Volts Low Major - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.15.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.25 Volts", }, }, }, { /* Blade 2.5 Volts Low Major - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.15.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.25 Volts", }, }, }, { /* Blade 2.5 Volts Low Major - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.15.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.25 Volts", }, }, }, { /* Blade 2.5 Volts Low Major - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.15.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.25 Volts", }, }, }, { /* Blade 2.5 Volts Low Major - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.15.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.25 Volts", }, }, }, { /* Blade 2.5 Volts Low Major - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.15.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.25 Volts", }, }, }, { /* Blade 2.5 Volts Low Major - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.15.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.25 Volts", }, }, }, { /* Blade 2.5 Volts Low Major - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.15.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.25 Volts", }, }, }, { /* Blade 2.5 Volts Low Major - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.15.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.25 Volts", }, }, }, { /* Blade 2.5 Volts Up Major - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.14.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.95 Volts", }, }, }, { /* Blade 2.5 Volts Up Major - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.14.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.95 Volts", }, }, }, { /* Blade 2.5 Volts Up Major - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.14.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.95 Volts", }, }, }, { /* Blade 2.5 Volts Up Major - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.14.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.95 Volts", }, }, }, { /* Blade 2.5 Volts Up Major - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.14.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.95 Volts", }, }, }, { /* Blade 2.5 Volts Up Major - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.14.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.95 Volts", }, }, }, { /* Blade 2.5 Volts Up Major - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.14.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.95 Volts", }, }, }, { /* Blade 2.5 Volts Up Major - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.14.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.95 Volts", }, }, }, { /* Blade 2.5 Volts Up Major - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.14.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.95 Volts", }, }, }, { /* Blade 2.5 Volts Up Major - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.14.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.95 Volts", }, }, }, { /* Blade 2.5 Volts Up Major - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.14.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.95 Volts", }, }, }, { /* Blade 2.5 Volts Up Major - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.14.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.95 Volts", }, }, }, { /* Blade 2.5 Volts Up Major - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.14.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.95 Volts", }, }, }, { /* Blade 2.5 Volts Up Major - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.14.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.95 Volts", }, }, }, { /* Blade IPMI Voltage Sensor 1 Up Major - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.23.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.95 Volts", }, }, }, { /* Blade IPMI Voltage Sensor 1 Low Major - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.24.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.6 Volts", }, }, }, { /* Blade IPMI Voltage Sensor 25 Up Major - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.71.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.95 Volts", }, }, }, { /* Blade IPMI Voltage Sensor 25 Low Major - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.72.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.5 Volts", }, }, }, { /* Blade 1.5 Volts - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.11.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.50 Volts", }, }, }, { /* Blade 1.5 Volts - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.11.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.50 Volts", }, }, }, { /* Blade 1.5 Volts - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.11.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.50 Volts", }, }, }, { /* Blade 1.5 Volts - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.11.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.50 Volts", }, }, }, { /* Blade 1.5 Volts - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.11.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.50 Volts", }, }, }, { /* Blade 1.5 Volts - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.11.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.50 Volts", }, }, }, { /* Blade 1.5 Volts - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.11.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.50 Volts", }, }, }, { /* Blade 1.5 Volts - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.11.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.50 Volts", }, }, }, { /* Blade 1.5 Volts - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.11.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.50 Volts", }, }, }, { /* Blade 1.5 Volts - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.11.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.50 Volts", }, }, }, { /* Blade 1.5 Volts - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.11.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.50 Volts", }, }, }, { /* Blade 1.5 Volts - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.11.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.50 Volts", }, }, }, { /* Blade 1.5 Volts - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.11.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.50 Volts", }, }, }, { /* Blade 1.5 Volts - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.11.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.50 Volts", }, }, }, { /* Blade 1.5 Volts Low Major - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.17.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.32 Volts", }, }, }, { /* Blade 1.5 Volts Low Major - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.17.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.32 Volts", }, }, }, { /* Blade 1.5 Volts Low Major - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.17.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.32 Volts", }, }, }, { /* Blade 1.5 Volts Low Major - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.17.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.32 Volts", }, }, }, { /* Blade 1.5 Volts Low Major - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.17.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.32 Volts", }, }, }, { /* Blade 1.5 Volts Low Major - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.17.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.32 Volts", }, }, }, { /* Blade 1.5 Volts Low Major - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.17.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.32 Volts", }, }, }, { /* Blade 1.5 Volts Low Major - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.17.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.32 Volts", }, }, }, { /* Blade 1.5 Volts Low Major - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.17.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.32 Volts", }, }, }, { /* Blade 1.5 Volts Low Major - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.17.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.32 Volts", }, }, }, { /* Blade 1.5 Volts Low Major - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.17.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.32 Volts", }, }, }, { /* Blade 1.5 Volts Low Major - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.17.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.32 Volts", }, }, }, { /* Blade 1.5 Volts Low Major - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.17.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.32 Volts", }, }, }, { /* Blade 1.5 Volts Low Major - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.17.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.32 Volts", }, }, }, { /* Blade 1.5 Volts Up Major - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.16.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.68 Volts", }, }, }, { /* Blade 1.5 Volts Up Major - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.16.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.68 Volts", }, }, }, { /* Blade 1.5 Volts Up Major - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.16.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.68 Volts", }, }, }, { /* Blade 1.5 Volts Up Major - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.16.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.68 Volts", }, }, }, { /* Blade 1.5 Volts Up Major - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.16.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.68 Volts", }, }, }, { /* Blade 1.5 Volts Up Major - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.16.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.68 Volts", }, }, }, { /* Blade 1.5 Volts Up Major - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.16.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.68 Volts", }, }, }, { /* Blade 1.5 Volts Up Major - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.16.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.68 Volts", }, }, }, { /* Blade 1.5 Volts Up Major - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.16.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.68 Volts", }, }, }, { /* Blade 1.5 Volts Up Major - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.16.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.68 Volts", }, }, }, { /* Blade 1.5 Volts Up Major - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.16.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.68 Volts", }, }, }, { /* Blade 1.5 Volts Up Major - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.16.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.68 Volts", }, }, }, { /* Blade 1.5 Volts Up Major - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.16.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.68 Volts", }, }, }, { /* Blade 1.5 Volts Up Major - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.16.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.68 Volts", }, }, }, { /* Blade 1.25 Volts - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.12.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.25 Volts", }, }, }, { /* Blade 1.25 Volts - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.12.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.25 Volts", }, }, }, { /* Blade 1.25 Volts - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.12.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.25 Volts", }, }, }, { /* Blade 1.25 Volts - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.12.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.25 Volts", }, }, }, { /* Blade 1.25 Volts - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.12.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.25 Volts", }, }, }, { /* Blade 1.25 Volts - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.12.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.25 Volts", }, }, }, { /* Blade 1.25 Volts - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.12.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.25 Volts", }, }, }, { /* Blade 1.25 Volts - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.12.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.25 Volts", }, }, }, { /* Blade 1.25 Volts - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.12.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.25 Volts", }, }, }, { /* Blade 1.25 Volts - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.12.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.25 Volts", }, }, }, { /* Blade 1.25 Volts - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.12.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.25 Volts", }, }, }, { /* Blade 1.25 Volts - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.12.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.25 Volts", }, }, }, { /* Blade 1.25 Volts - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.12.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.25 Volts", }, }, }, { /* Blade 1.25 Volts - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.12.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.25 Volts", }, }, }, { /* Blade 1.25 Volts Low Major - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.19.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.10 Volts", }, }, }, { /* Blade 1.25 Volts Low Major - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.19.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.10 Volts", }, }, }, { /* Blade 1.25 Volts Low Major - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.19.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.10 Volts", }, }, }, { /* Blade 1.25 Volts Low Major - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.19.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.10 Volts", }, }, }, { /* Blade 1.25 Volts Low Major - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.19.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.10 Volts", }, }, }, { /* Blade 1.25 Volts Low Major - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.19.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.10 Volts", }, }, }, { /* Blade 1.25 Volts Low Major - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.19.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.10 Volts", }, }, }, { /* Blade 1.25 Volts Low Major - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.19.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.10 Volts", }, }, }, { /* Blade 1.25 Volts Low Major - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.19.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.10 Volts", }, }, }, { /* Blade 1.25 Volts Low Major - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.19.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.10 Volts", }, }, }, { /* Blade 1.25 Volts Low Major - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.19.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.10 Volts", }, }, }, { /* Blade 1.25 Volts Low Major - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.19.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.10 Volts", }, }, }, { /* Blade 1.25 Volts Low Major - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.19.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.10 Volts", }, }, }, { /* Blade 1.25 Volts Low Major - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.19.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.10 Volts", }, }, }, { /* Blade 1.25 Volts Up Major - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.18.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.40 Volts", }, }, }, { /* Blade 1.25 Volts Up Major - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.18.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.40 Volts", }, }, }, { /* Blade 1.25 Volts Up Major - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.18.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.40 Volts", }, }, }, { /* Blade 1.25 Volts Up Major - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.18.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.40 Volts", }, }, }, { /* Blade 1.25 Volts Up Major - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.18.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.40 Volts", }, }, }, { /* Blade 1.25 Volts Up Major - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.18.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.40 Volts", }, }, }, { /* Blade 1.25 Volts Up Major - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.18.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.40 Volts", }, }, }, { /* Blade 1.25 Volts Up Major - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.18.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.40 Volts", }, }, }, { /* Blade 1.25 Volts Up Major - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.18.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.40 Volts", }, }, }, { /* Blade 1.25 Volts Up Major - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.18.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.40 Volts", }, }, }, { /* Blade 1.25 Volts Up Major - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.18.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.40 Volts", }, }, }, { /* Blade 1.25 Volts Up Major - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.18.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.40 Volts", }, }, }, { /* Blade 1.25 Volts Up Major - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.18.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.40 Volts", }, }, }, { /* Blade 1.25 Volts Up Major - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.18.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.40 Volts", }, }, }, { /* Blade VRM 1 Volts - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.13.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.49 Volts", }, }, }, { /* Blade VRM 1 Volts - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.13.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.49 Volts", }, }, }, { /* Blade VRM 1 Volts - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.13.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.49 Volts", }, }, }, { /* Blade VRM 1 Volts - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.13.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.49 Volts", }, }, }, { /* Blade VRM 1 Volts - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.13.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.49 Volts", }, }, }, { /* Blade VRM 1 Volts - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.13.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.49 Volts", }, }, }, { /* Blade VRM 1 Volts - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.13.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.49 Volts", }, }, }, { /* Blade VRM 1 Volts - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.13.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.49 Volts", }, }, }, { /* Blade VRM 1 Volts - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.13.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.49 Volts", }, }, }, { /* Blade VRM 1 Volts - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.13.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.49 Volts", }, }, }, { /* Blade VRM 1 Volts - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.13.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.49 Volts", }, }, }, { /* Blade VRM 1 Volts - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.13.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.49 Volts", }, }, }, { /* Blade VRM 1 Volts - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.13.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.49 Volts", }, }, }, { /* Blade VRM 1 Volts - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.13.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.49 Volts", }, }, }, { /* Blade IPMI Voltage Capability - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.14.1", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade IPMI Voltage Capability - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.14.2", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade IPMI Voltage Capability - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.14.3", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, }, }, }, { /* Blade IPMI Voltage Capability - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.14.4", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade IPMI Voltage Capability - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.14.5", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade IPMI Voltage Capability - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.14.6", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade IPMI Voltage Capability - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.14.7", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade IPMI Voltage Capability - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.14.8", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade IPMI Voltage Capability - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.14.9", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade IPMI Voltage Capability - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.14.10", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade IPMI Voltage Capability - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.14.11", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade IPMI Voltage Capability - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.14.12", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade IPMI Voltage Capability - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.14.13", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade IPMI Voltage Capability - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.14.14", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade IPMI Voltage Sensor 1 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.15.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "1.8VSB Sense = +3.2 Volts", }, }, }, { /* Blade IPMI Voltage Sensor 2 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.16.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 3 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.17.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 4 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.18.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 5 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.19.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 6 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.20.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 7 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.21.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 8 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.22.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 9 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.23.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 10 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.24.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 11 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.25.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 12 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.26.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 13 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.27.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 14 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.28.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 15 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.29.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 16 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.30.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 17 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.31.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 18 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.32.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 19 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.33.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 20 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.34.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 21 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.35.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 22 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.36.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 23 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.37.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 24 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.38.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 25 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.39.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 1 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.15.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "2.5V Sense = +2.50 Volts", }, }, }, { /* Blade IPMI Voltage Sensor 2 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.16.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 3 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.17.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 4 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.18.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 5 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.19.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 6 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.20.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 7 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.21.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 8 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.22.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 9 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.23.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 10 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.24.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 11 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.25.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 12 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.26.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 13 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.27.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 14 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.28.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 15 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.29.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 16 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.30.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 17 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.31.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 18 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.32.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 19 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.33.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 20 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.34.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 21 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.35.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 22 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.36.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 23 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.37.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 24 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.38.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 25 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.39.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "3.3VSB Sense = + 3.33 Volts", }, }, }, { /* Bower Fan Speed - Blower 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.3.1.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 67% of maximum", }, }, }, { /* Bower Fan Speed - Blower 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.3.2.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "100% of maximum", }, }, }, { /* Bower Fan Speed - Blower 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.3.3.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 7% of maximum", }, }, }, { /* Bower Fan Speed - Blower 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.3.4.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Not Readable!", }, }, }, { /* Chassis Information LED */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.1.2.0", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Chassis Identity LED - BC */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.1.4.0", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2; NA=3 */ }, }, }, { /* Chassis Identity LED - BCT */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.3.4.0", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2; NA=3 */ }, }, }, { /* Blade Information LED - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.8.1", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Blade Information LED - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.8.2", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Blade Information LED - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.8.3", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Blade Information LED - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.8.4", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Blade Information LED - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.8.5", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Blade Information LED - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.8.6", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Blade Information LED - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.8.7", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Blade Information LED - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.8.8", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Blade Information LED - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.8.9", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Blade Information LED - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.8.10", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Blade Information LED - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.8.11", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Blade Information LED - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.8.12", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Blade Information LED - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.8.13", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Blade Information LED - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.8.14", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Blade Identity LED - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.11.1", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2; NA=3 */ }, }, }, { /* Blade Identity LED - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.11.2", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2; NA=3 */ }, }, }, { /* Blade Identity LED - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.11.3", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2; NA=3 */ }, }, }, { /* Blade Identity LED - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.11.4", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2; NA=3 */ }, }, }, { /* Blade Identity LED - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.11.5", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2; NA=3 */ }, }, }, { /* Blade Identity LED - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.11.6", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2; NA=3 */ }, }, }, { /* Blade Identity LED - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.11.7", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2; NA=3 */ }, }, }, { /* Blade Identity LED - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.11.8", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2; NA=3 */ }, }, }, { /* Blade Identity LED - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.11.9", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2; NA=3 */ }, }, }, { /* Blade Identity LED - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.11.10", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2; NA=3 */ }, }, }, { /* Blade Identity LED - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.11.11", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2; NA=3 */ }, }, }, { /* Blade Identity LED - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.11.12", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2; NA=3 */ }, }, }, { /* Blade Identity LED - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.11.13", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2; NA=3 */ }, }, }, { /* Blade Identity LED - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.11.14", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2; NA=3 */ }, }, }, /* Need to test 0 length, maximum, and max +1 strings here */ { /* Chassis Manufacturer VPD */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.1.1.5.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "SLRM", }, }, }, { /* Chassis Product Name VPD */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.1.1.1.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "8677", /* 8677 (BCE); 8720 (BCT DC); 8730 (BCT AC) */ }, }, }, { /* Chassis Product Version VPD */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.1.1.6.0", .mib = { .type = ASN_INTEGER, .value = { .integer = 5, }, }, }, { /* Chassis Model Number VPD */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.1.1.2.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "1XX", }, }, }, { /* Chassis Serial Number VPD */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.1.1.3.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "78F9128", }, }, }, { /* Chassis Part Number VPD */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.1.1.7.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "59P6609", }, }, }, { /* Management Module Manufacturer VPD - MM 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.3.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "SLRM", }, }, }, { /* Management Module Manufacturer VPD - MM 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.3.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "SLRM", }, }, }, { /* Management Module Product Version VPD - MM 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.5.1", .mib = { .type = ASN_INTEGER, .value = { .integer = 4, }, }, }, { /* Management Module Product Version VPD - MM 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.5.2", .mib = { .type = ASN_INTEGER, .value = { .integer = 4, }, }, }, { /* Management Module Part Number VPD - MM 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.4.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "73P9273", }, }, }, { /* Management Module Part Number VPD - MM 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.4.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "73P9273", }, }, }, { /* Switch Manufacturer VPD - Switch 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.3.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "DLNK", }, }, }, { /* Switch Manufacturer VPD - Switch 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.3.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "DLNK", }, }, }, { /* Switch Manufacturer VPD - Switch 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.3.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "DLNK", }, }, }, { /* Switch Manufacturer VPD - Switch 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.3.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "DLNK", }, }, }, { /* Switch Product Version VPD - Switch 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.5.1", .mib = { .type = ASN_INTEGER, .value = { .integer = 2, }, }, }, { /* Switch Product Version VPD - Switch 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.5.2", .mib = { .type = ASN_INTEGER, .value = { .integer = 2, }, }, }, { /* Switch Product Version VPD - Switch 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.5.3", .mib = { .type = ASN_INTEGER, .value = { .integer = 2, }, }, }, { /* Switch Product Version VPD - Switch 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.5.4", .mib = { .type = ASN_INTEGER, .value = { .integer = 2, }, }, }, { /* Switch Part Number VPD - Switch 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.4.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "59P6620", }, }, }, { /* Switch Part Number VPD - Switch 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.4.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "59P6620", }, }, }, { /* Switch Part Number VPD - Switch 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.4.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "59P6620", }, }, }, { /* Switch Part Number VPD - Switch 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.4.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "59P6620", }, }, }, { /* Blade Manufacturer VPD - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.3.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "SLRM", }, }, }, { /* Blade Manufacturer VPD - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.3.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "SLRM", }, }, }, { /* Blade Manufacturer VPD - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.3.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "SLRM", }, }, }, { /* Blade Manufacturer VPD - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.3.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "SLRM", }, }, }, { /* Blade Manufacturer VPD - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.3.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "SLRM", }, }, }, { /* Blade Manufacturer VPD - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.3.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "SLRM", }, }, }, { /* Blade Manufacturer VPD - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.3.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = "SLRM", }, }, }, { /* Blade Manufacturer VPD - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.3.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = "SLRM", }, }, }, { /* Blade Manufacturer VPD - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.3.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = "SLRM", }, }, }, { /* Blade Manufacturer VPD - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.3.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = "SLRM", }, }, }, { /* Blade Manufacturer VPD - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.3.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = "SLRM", }, }, }, { /* Blade Manufacturer VPD - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.3.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = "SLRM", }, }, }, { /* Blade Manufacturer VPD - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.3.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = "SLRM", }, }, }, { /* Blade Manufacturer VPD - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.3.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = "SLRM", }, }, }, { /* Blade Product Name VPD - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.7.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "867821Z", }, }, }, { /* Blade Product Name VPD - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.7.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "867821Z", }, }, }, { /* Blade Product Name VPD - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.7.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "867821Z", }, }, }, { /* Blade Product Name VPD - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.7.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "867821Z", }, }, }, { /* Blade Product Name VPD - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.7.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "867821Z", }, }, }, { /* Blade Product Name VPD - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.7.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "867821Z", }, }, }, { /* Blade Product Name VPD - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.7.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = "867821Z", }, }, }, { /* Blade Product Name VPD - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.7.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = "867821Z", }, }, }, { /* Blade Product Name VPD - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.7.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = "867821Z", }, }, }, { /* Blade Product Name VPD - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.7.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = "867821Z", }, }, }, { /* Blade Product Name VPD - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.7.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = "867821Z", }, }, }, { /* Blade Product Name VPD - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.7.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = "867821Z", }, }, }, { /* Blade Product Name VPD - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.7.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = "867821Z", }, }, }, { /* Blade Product Name VPD - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.7.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = "867821Z", }, }, }, { /* Blade Product Version VPD - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.5.1", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade Product Version VPD - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.5.2", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade Product Version VPD - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.5.3", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade Product Version VPD - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.5.4", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade Product Version VPD - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.5.5", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade Product Version VPD - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.5.6", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade Product Version VPD - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.5.7", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade Product Version VPD - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.5.8", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade Product Version VPD - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.5.9", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade Product Version VPD - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.5.10", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade Product Version VPD - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.5.11", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade Product Version VPD - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.5.12", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade Product Version VPD - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.5.13", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade Product Version VPD - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.5.14", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade Serial Number VPD - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.6.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "J1P4A28Y192", }, }, }, { /* Blade Serial Number VPD - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.6.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "J1P4A28Y192", }, }, }, { /* Blade Serial Number VPD - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.6.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "J1P4A28Y192", }, }, }, { /* Blade Serial Number VPD - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.6.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "J1P4A28Y192", }, }, }, { /* Blade Serial Number VPD - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.6.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "J1P4A28Y192", }, }, }, { /* Blade Serial Number VPD - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.6.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "J1P4A28Y192", }, }, }, { /* Blade Serial Number VPD - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.6.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = "J1P4A28Y192", }, }, }, { /* Blade Serial Number VPD - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.6.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = "J1P4A28Y192", }, }, }, { /* Blade Serial Number VPD - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.6.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = "J1P4A28Y192", }, }, }, { /* Blade Serial Number VPD - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.6.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = "J1P4A28Y192", }, }, }, { /* Blade Serial Number VPD - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.6.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = "J1P4A28Y192", }, }, }, { /* Blade Serial Number VPD - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.6.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = "J1P4A28Y192", }, }, }, { /* Blade Serial Number VPD - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.6.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = "J1P4A28Y192", }, }, }, { /* Blade Serial Number VPD - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.6.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = "J1P4A28Y192", }, }, }, { /* Blade Part Number VPD - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.4.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "596610", }, }, }, { /* Blade Part Number VPD - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.4.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "596610", }, }, }, { /* Blade Part Number VPD - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.4.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "596610", }, }, }, { /* Blade Part Number VPD - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.4.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "596610", }, }, }, { /* Blade Part Number VPD - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.4.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "596610", }, }, }, { /* Blade Part Number VPD - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.4.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "596610", }, }, }, { /* Blade Part Number VPD - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.4.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = "596610", }, }, }, { /* Blade Part Number VPD - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.4.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = "596610", }, }, }, { /* Blade Part Number VPD - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.4.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = "596610", }, }, }, { /* Blade Part Number VPD - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.4.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = "596610", }, }, }, { /* Blade Part Number VPD - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.4.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = "596610", }, }, }, { /* Blade Part Number VPD - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.4.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = "596610", }, }, }, { /* Blade Part Number VPD - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.4.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = "596610", }, }, }, { /* Blade Part Number VPD - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.4.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = "596610", }, }, }, /* Used to determine if expansion card attached to blade */ { /* BladeServerExpansion - bladeExpBoardVpdBladeBayNumber */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.3.1.19.1", .mib = { .type = ASN_INTEGER, .value = { .integer = SA_ERR_SNMP_NOSUCHOBJECT, /* .integer = 255, BCT */ }, }, }, { /* BladeServerExpansion - bladeExpBoardVpdCardType */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.3.1.20.1", .mib = { .type = ASN_INTEGER, .value = { .integer = SA_ERR_SNMP_NOSUCHOBJECT, /* .integer = 255, BCT */ }, }, }, { /* BladeServerExpansion - Blade Add-on 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.14.2", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* BladeServerExpansion - Blade Add-on 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.14.3", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, }, }, }, { /* BladeServerExpansion - Blade Add-on 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.14.4", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* BladeServerExpansion - Blade Add-on 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.14.5", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, }, }, }, { /* BladeServerExpansion - Blade Add-on 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.14.6", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* BladeServerExpansion - Blade Add-on 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.14.7", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, }, }, }, { /* BladeServerExpansion - Blade Add-on 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.14.8", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* BladeServerExpansion - Blade Add-on 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.14.9", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, }, }, }, { /* BladeServerExpansion - Blade Add-on 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.14.10", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* BladeServerExpansion - Blade Add-on 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.14.11", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, }, }, }, { /* BladeServerExpansion - Blade Add-on 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.14.12", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* BladeServerExpansion - Blade Add-on 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.14.13", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, }, }, }, { /* BladeServerExpansion - Blade Add-on 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.14.14", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade Add-on Product Name VPD - Blade Add-on 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.25.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "867821Z", }, }, }, { /* Blade Add-on Product Name VPD - Blade Add-on 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.25.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "867821Z", }, }, }, { /* Blade Add-on Product Name VPD - Blade Add-on 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.25.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "867821Z", }, }, }, { /* Blade Add-on Product Name VPD - Blade Add-on 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.25.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "867821Z", }, }, }, { /* Blade Add-on Product Name VPD - Blade Add-on 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.25.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "867821Z", }, }, }, { /* Blade Add-on Product Name VPD - Blade Add-on 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.25.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "867821Z", }, }, }, { /* Blade Add-on Product Name VPD - Blade Add-on 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.25.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = "867821Z", }, }, }, { /* Blade Add-on Product Name VPD - Blade Add-on 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.25.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = "867821Z", }, }, }, { /* Blade Add-on Product Name VPD - Blade Add-on 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.25.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = "867821Z", }, }, }, { /* Blade Add-on Product Name VPD - Blade Add-on 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.25.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = "867821Z", }, }, }, { /* Blade Add-on Product Name VPD - Blade Add-on 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.25.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = "867821Z", }, }, }, { /* Blade Add-on Product Name VPD - Blade Add-on 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.25.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = "867821Z", }, }, }, { /* Blade Add-on Product Name VPD - Blade Add-on 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.25.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = "867821Z", }, }, }, { /* Blade Add-on Product Name VPD - Blade Add-on 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.25.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = "867821Z", }, }, }, { /* Blade Add-on Product Version VPD - Blade Add-on 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.23.1", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade Add-on Product Version VPD - Blade Add-on 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.23.2", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade Add-on Product Version VPD - Blade Add-on 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.23.3", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade Add-on Product Version VPD - Blade Add-on 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.23.4", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade Add-on Product Version VPD - Blade Add-on 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.23.5", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade Add-on Product Version VPD - Blade Add-on 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.23.6", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade Add-on Product Version VPD - Blade Add-on 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.23.7", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade Add-on Product Version VPD - Blade Add-on 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.23.8", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade Add-on Product Version VPD - Blade Add-on 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.23.9", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade Add-on Product Version VPD - Blade Add-on 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.23.10", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade Add-on Product Version VPD - Blade Add-on 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.23.11", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade Add-on Product Version VPD - Blade Add-on 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.23.12", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade Add-on Product Version VPD - Blade Add-on 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.23.13", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade Add-on Product Version VPD - Blade Add-on 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.23.14", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade Add-on Part Number VPD - Blade Add-on 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.22.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "596610", }, }, }, { /* Blade Add-on Part Number VPD - Blade Add-on 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.22.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "596610", }, }, }, { /* Blade Add-on Part Number VPD - Blade Add-on 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.22.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "596610", }, }, }, { /* Blade Add-on Part Number VPD - Blade Add-on 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.22.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "596610", }, }, }, { /* Blade Add-on Part Number VPD - Blade Add-on 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.22.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "596610", }, }, }, { /* Blade Add-on Part Number VPD - Blade Add-on 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.22.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "596610", }, }, }, { /* Blade Add-on Part Number VPD - Blade Add-on 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.22.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = "596610", }, }, }, { /* Blade Add-on Part Number VPD - Blade Add-on 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.22.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = "596610", }, }, }, { /* Blade Add-on Part Number VPD - Blade Add-on 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.22.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = "596610", }, }, }, { /* Blade Add-on Part Number VPD - Blade Add-on 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.22.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = "596610", }, }, }, { /* Blade Add-on Part Number VPD - Blade Add-on 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.22.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = "596610", }, }, }, { /* Blade Add-on Part Number VPD - Blade Add-on 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.22.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = "596610", }, }, }, { /* Blade Add-on Part Number VPD - Blade Add-on 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.22.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = "596610", }, }, }, { /* Blade Add-on Part Number VPD - Blade Add-on 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.22.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = "596610", }, }, }, { /* Media Tray Manufacturer VPD */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.9.3.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "SLRM", }, }, }, { /* Media Tray Product Version VPD */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.9.5.0", .mib = { .type = ASN_INTEGER, .value = { .integer = 5, }, }, }, { /* Media Tray Part Number VPD */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.9.4.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "59P6609", }, }, }, { /* Power Module Manufacturer VPD - PM 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.3.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "SLRM", }, }, }, { /* Power Module Manufacturer VPD - PM 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.3.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "SLRM", }, }, }, { /* Power Module Manufacturer VPD - PM 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.3.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "SLRM", }, }, }, { /* Power Module Manufacturer VPD - PM 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.3.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "SLRM", }, }, }, { /* Power Module Product Version VPD - PM 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.5.1", .mib = { .type = ASN_INTEGER, .value = { .integer = 5, }, }, }, { /* Power Module Product Version VPD - PM 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.5.2", .mib = { .type = ASN_INTEGER, .value = { .integer = 5, }, }, }, { /* Power Module Product Version VPD - PM 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.5.3", .mib = { .type = ASN_INTEGER, .value = { .integer = 5, }, }, }, { /* Power Module Product Version VPD - PM 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.5.4", .mib = { .type = ASN_INTEGER, .value = { .integer = 5, }, }, }, { /* Power Module Part Number VPD - PM 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.4.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "59P6609", }, }, }, { /* Power Module Part Number VPD - PM 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.4.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "59P6609", }, }, }, { /* Power Module Part Number VPD - PM 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.4.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "59P6609", }, }, }, { /* Power Module Part Number VPD - PM 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.4.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "59P6609", }, }, }, { /* Blade Name - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.6.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Blade 1", }, }, }, { /* Blade Name - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.6.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Blade 2", }, }, }, { /* Blade Name - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.6.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Blade 3", }, }, }, { /* Blade Name - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.6.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Blade 4", }, }, }, { /* Blade Name - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.6.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Blade 5", }, }, }, { /* Blade Name - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.6.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Blade 6", }, }, }, { /* Blade Name - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.6.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Blade 7", }, }, }, { /* Blade Name - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.6.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Blade 8", }, }, }, { /* Blade Name - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.6.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Blade 9", }, }, }, { /* Blade Name - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.6.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Blade 10", }, }, }, { /* Blade Name - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.6.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Blade 11", }, }, }, { /* Blade Name - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.6.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Blade 12", }, }, }, { /* Blade Name - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.6.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Blade 13", }, }, }, { /* Blade Name - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.6.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Blade 14", }, }, }, {} /* Terminate array with a null element */ }; openhpi-3.6.1/plugins/snmp_bc/t/thotswap-mhs001.c0000644000175100017510000001212712575647274020571 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan * Steve Sherman */ #include #include #include int main(int argc, char **argv) { int testfail = 0; SaErrorT err, expected_err; SaHpiCapabilitiesT cap_mask; SaHpiHsIndicatorStateT hs_ind_state = 0; SaHpiHsStateT hs_state; SaHpiResourceIdT id = 0; SaHpiRptEntryT rptentry; SaHpiSessionIdT sessionid; SaHpiTimeoutT timeout; /************************************************ * Find a resource with simple hotswap capability ************************************************/ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Cannot open session\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } cap_mask = SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_MANAGED_HOTSWAP; err = tfind_resource(&sessionid, cap_mask, SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { dbg("Cannot find a managed hotswap resource\n"); dbg(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; #if 0 printf("Found resource = %s\n", rptentry.ResourceTag.Data); #endif /*************************************************************** * Test: Capability checking * No BladeCenter resource currently supports hotswap indicators ***************************************************************/ expected_err = SA_ERR_HPI_CAPABILITY; err = saHpiHotSwapIndicatorStateGet(sessionid, id, &hs_ind_state); checkstatus(err, expected_err, testfail); err = saHpiHotSwapIndicatorStateSet(sessionid, id, hs_ind_state); checkstatus(err, expected_err, testfail); /*********************************************** * Test: Immediate Auto-insert/extraction policy * BladeCenter only supports immediate read-only * auto-insert/extraction policies. ***********************************************/ expected_err = SA_ERR_HPI_INVALID_REQUEST; err = saHpiHotSwapPolicyCancel(sessionid, id); checkstatus(err, expected_err, testfail); err = saHpiResourceActiveSet(sessionid, id); checkstatus(err, expected_err, testfail); err = saHpiResourceInactiveSet(sessionid, id); checkstatus(err, expected_err, testfail); #if 0 /* Currently defined by domain */ /* Timeouts are READ-ONLY */ expected_err = SA_ERR_HPI_READ_ONLY; err = saHpiAutoInsertTimeoutSet(sessionid, timeout); checkstatus(err, expected_err, testfail); err = saHpiAutoExtractTimeoutSet(sessionid, id, timeout); checkstatus(err, expected_err, testfail); #endif /* Timeouts are IMMEDIATE */ expected_err = SA_OK; err = saHpiAutoInsertTimeoutGet(sessionid, &timeout); checkstatus(err, expected_err, testfail); if (timeout != SAHPI_TIMEOUT_IMMEDIATE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } err = saHpiAutoExtractTimeoutGet(sessionid, id, &timeout); checkstatus(err, expected_err, testfail); if (timeout != SAHPI_TIMEOUT_IMMEDIATE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } /************************* * Test: Normal Operations *************************/ expected_err = SA_OK; /* Assume resource is in ACTIVE state; else can't test saHpiHotSwapActionRequest Simulator needs to be setup to ensure this */ err = saHpiHotSwapStateGet(sessionid, id, &hs_state); checkstatus(err, expected_err, testfail); if (hs_state != SAHPI_HS_STATE_ACTIVE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Hotswap resource needs to be in ACTIVE state\n"); printf(" Current state = %s\n", oh_lookup_hsstate(hs_state)); return -1; } err = saHpiHotSwapActionRequest(sessionid, id, SAHPI_HS_ACTION_EXTRACTION); checkstatus(err, expected_err, testfail); #if 0 err = saHpiHotSwapStateGet(sessionid, id, &hs_state); checkstatus(err, expected_err, testfail); if (hs_state != SAHPI_HS_STATE_INACTIVE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Current state = %s\n", oh_lookup_hsstate(hs_state)); return -1; } err = saHpiHotSwapActionRequest(sessionid, id, SAHPI_HS_ACTION_INSERTION); checkstatus(err, expected_err, testfail); err = saHpiHotSwapStateGet(sessionid, id, &hs_state); checkstatus(err, expected_err, testfail); if (hs_state != SAHPI_HS_STATE_ACTIVE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Current state = %s\n", oh_lookup_hsstate(hs_state)); return -1; } #endif /************************* * Cleanup after all tests *************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/sim_file.c0000644000175100017510000001647012575647274017506 0ustar mohanmohan/* -*- linux-c -*- * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * * Main function: * Parse a file, either pointed to by the environmental variable OPENHPI_SIMTEST_FILE * or default file name "test_file", to build a hash table that will be used by * bladecenter/RSA simulator to simulate resource access. * * Each line in input file represents an entry in the hash table * for example: * .1.3.6.1.4.1.2.3.51.2.2.3.1.0 = STRING: " 46% of maximum" * ".1.3.6..." is the key into hash table * STRING and "46% of maximum" are values associated to this key * Sample input file * .1.3.6.1.2.1.1.2.0 = OID: .1.3.6.1.4.1.2.6.158.3 * .1.3.6.1.4.1.2.3.51.2.2.3.1.0 = STRING: " 46% of maximum" * .1.3.6.1.4.1.2.3.51.2.2.5.2.6.0 = INTEGER: 0 * .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.9.1 = Hex-STRING: D0 07 F0 D2 * .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.14 = "" * .1.3.6.1.4.1.2.3.51.2.22.5.1.1.3.1 = IpAddress: 9.3.202.71 * .1.3.6.1.6.3.11.2.1.1.0 = Counter32: 0 * .1.3.6.1.6.3.12.1.1.0 = INTEGER: 0 * .1.3.6.1.6.3.12.1.2.1.2.72.111.115.116.49 = Wrong Type (should be OBJECT IDENTIFIER): INTEGER: 1 * * Input file can be hand made or the output of snmp walk, such as: * snmpwalk -v 3 -t 10 -l authNoPriv -A netsnmpv3 -n "" -u $user $host -Of -On .1 * */ #include #include #include #include #include #include #include //static void print_entry(gpointer, gpointer, gpointer); // hash table debug code //static void print_entry (gpointer key, gpointer val, gpointer data) //{ // SnmpMibInfoT* key_val = val; // printf ("\t%s translates to ", (gchar *)key); // if (key_val->type == ASN_INTEGER ) // printf (" integer type: %d \n", (int)key_val->value.integer); // else if (key_val->type == ASN_OCTET_STR ) // printf (" string type: %s \n", key_val->value.string); // else printf(" invalid type: %d\n", key_val->type); //} static void free_hash_data(gpointer key, gpointer value, gpointer user_data); SaErrorT sim_file() { #define MAX_STR_LEN 1024 #define STD_TOKEN_CNT 4 FILE *file; char *file_in; char file_std[] = "./sim_test_file"; char str_in[MAX_STR_LEN]; gchar OID_HDR[] = ".1.3.6.1.4.1.2.3.51.?"; gchar BC_OID_HDR[] = ".1.3.6.1.4.1.2.3.51.2"; gchar RSA_OID_HDR[] = ".1.3.6.1.4.1.2.3.51.1"; gchar STR_TYPE[] = "STRING:"; gchar INT_TYPE[] = "INTEGER:"; gchar **tokens = NULL; gchar *tmpstr = NULL; const gchar *str_delimiter = " "; int valid, invalid, total, token_cnt, ii; int rc; gboolean found_plat = FALSE; gchar *key = NULL; gchar *key_exists = NULL; SnmpMibInfoT *mibinfo; rc = valid = invalid = total = token_cnt = ii = 0; file_in = getenv("OPENHPI_SIMTEST_FILE"); if (!file_in) file_in = file_std; dbg("file to be tested - %s\n", file_in); file = fopen( file_in, "r"); if ( file == NULL ) { printf("file %s open failed\n", file_in); rc = -1; goto cleanup; } clearerr( file ); sim_hash = g_hash_table_new(g_str_hash, g_str_equal); if (sim_hash == NULL) { printf("Cannot allocate simulation hash table"); rc = -1; goto cleanup; } dbg("---- hash table address %p ----\n", sim_hash); while ( !feof(file) ) { // process each line in file dbg("xxx--- hash table size %d ---xxx\n", g_hash_table_size(sim_hash)); //g_hash_table_foreach (sim_hash, print_entry, NULL); if (fgets(str_in, MAX_STR_LEN, file) == NULL) dbg("xxx--- Experience problem, check env OPENHPI_SIMTEST_FILE or ./sim_test_file ---xxx\n"); //dbg("%s", str_in); g_strstrip(str_in); if (str_in[0] == '\0') { //dbg("Skipped a blank line\n"); continue; } total++; tokens = g_strsplit(str_in, str_delimiter, STD_TOKEN_CNT); for (token_cnt=0; tokens[token_cnt]; token_cnt++); //dbg("line has %d tokens\n", token_cnt); if (token_cnt != STD_TOKEN_CNT) { //dbg("Error: tokens (%d) < then expected\n",token_cnt); g_strfreev(tokens); invalid++; continue; } if ( found_plat == FALSE ) { // not knowing which platform to test // first see if this is BladeCenter tmpstr = strstr(tokens[0], BC_OID_HDR); if (tmpstr != tokens[0]) { // then see if it's RSA tmpstr = strstr(tokens[0], RSA_OID_HDR); if (tmpstr != tokens[0]) { // not a valid platform, skip this line //dbg("invalid oid %s\n", tokens[0]); g_strfreev(tokens); invalid++; continue; } else { // we are testing RSA found_plat = TRUE; strcpy( OID_HDR, RSA_OID_HDR ); } } else { // we are testing BladeCenter found_plat = TRUE; strcpy( OID_HDR, BC_OID_HDR ); } } else { // platform has been identified, check against ID tmpstr = strstr(tokens[0], OID_HDR); if (tmpstr != tokens[0]) { g_strfreev(tokens); invalid++; continue; } } key = g_strdup(tokens[0]); //dbg("key = %s\n", key); key_exists = g_hash_table_lookup(sim_hash, key); if (key_exists) { // key already processed, skip this line dbg("=== oid %s already processed ===\n", key); g_free(key); g_strfreev(tokens); invalid++; continue; } mibinfo = g_malloc0(sizeof(SnmpMibInfoT)); if (!mibinfo) { printf("Error: Malloc failed for oid (%s) hash", tmpstr); invalid++; g_free(key); g_strfreev(tokens); rc = -1; goto cleanup; } if (!g_ascii_strcasecmp(tokens[2], INT_TYPE)) { // Integer dbg("=== oid %s got a int type: %d\n", key, atoi(tokens[3])); mibinfo->value.integer = atoi(tokens[3]); mibinfo->type = ASN_INTEGER; g_hash_table_insert(sim_hash, key, mibinfo); g_strfreev(tokens); valid++; } else if (!g_ascii_strcasecmp(tokens[2], STR_TYPE)) { // String // delete quote marks (") at both ends of string tmpstr = tokens[3]; if ( *tmpstr == '\"' ) tmpstr++; ii = strlen( tmpstr ); if (tmpstr[ii -1] == '\"') tmpstr[ii -1] = '\0'; dbg("=== oid %s got a string type: %s\n", key, tmpstr); strcpy(mibinfo->value.string, tmpstr); mibinfo->type = ASN_OCTET_STR; g_hash_table_insert(sim_hash, key, mibinfo); g_strfreev(tokens); valid++; } else { dbg("not a valid type %s\n", tokens[2]); g_free(key); g_strfreev(tokens); g_free(mibinfo); invalid++; } } dbg("%d out of %d lines in file %s got processed\n", valid, total, file_in); fclose( file ); // g_hash_table_foreach (sim_hash, print_entry, NULL); goto done; cleanup: fclose( file ); g_hash_table_foreach(sim_hash, free_hash_data, NULL); g_hash_table_destroy(sim_hash); done: return rc; } static void free_hash_data(gpointer key, gpointer value, gpointer user_data) { g_free(key); g_free(value); } openhpi-3.6.1/plugins/snmp_bc/t/tsensorset018.c0000644000175100017510000000634112575647274020355 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiResourceIdT id; SaHpiSessionIdT sessionid; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundSensor; SaHpiSensorNumT sid = 0; SaHpiSensorEventMaskActionT act = SAHPI_SENS_ADD_EVENTS_TO_MASKS; SaHpiEventStateT assertMask = SAHPI_ES_UPPER_MINOR; SaHpiEventStateT deassertMask = SAHPI_ES_UPPER_CRIT; /* ************************************* * Find a resource with Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid,SAHPI_CAPABILITY_SENSOR,SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: find a sensor with desired property **************************/ entryid = SAHPI_FIRST_ENTRY; foundSensor = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if ((rdr.RdrType == SAHPI_SENSOR_RDR) && (rdr.RdrTypeUnion.SensorRec.EventCtrl == SAHPI_SEC_PER_EVENT)) { foundSensor = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundSensor) { err("Did not find desired resource for test\n"); return(SA_OK); } else { sid = rdr.RdrTypeUnion.SensorRec.Num; } /************************** * Test **************************/ act = SAHPI_SENS_REMOVE_EVENTS_FROM_MASKS; deassertMask = SAHPI_ALL_EVENT_STATES; assertMask = SAHPI_ALL_EVENT_STATES; expected_err = SA_OK; err = saHpiSensorEventMasksSet(sessionid, id, sid, act, assertMask, deassertMask); checkstatus(err, expected_err, testfail); /************************** * Test * expected_err = SA_OK; **************************/ deassertMask = rdr.RdrTypeUnion.SensorRec.Events; err = saHpiSensorEventMasksSet(sessionid, id, sid, act, assertMask, deassertMask); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/tsensorset009.c0000644000175100017510000000517612575647274020362 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiResourceIdT id = 0; SaHpiSessionIdT sessionid; SaHpiSensorNumT sid = 0; SaHpiEventStateT assertMask = SAHPI_ES_LOWER_MINOR; SaHpiEventStateT deassertMask = SAHPI_ES_LOWER_CRIT; SaHpiSensorEventMaskActionT act = SAHPI_SENS_ADD_EVENTS_TO_MASKS; /* ************************************* * Find a resource with Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid,SAHPI_CAPABILITY_SENSOR,SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: Invalid handler **************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = snmp_bc_set_sensor_event_masks(NULL, id, sid, act, assertMask, deassertMask); checkstatus(err, expected_err, testfail); /************************** * Test: Invalid resource id **************************/ expected_err = SA_ERR_HPI_INVALID_RESOURCE; err = saHpiSensorEventMasksSet(sessionid, 5000, sid, act, assertMask, deassertMask); checkstatus(err, expected_err, testfail); /************************** * Test: Invalid Sensor Id **************************/ expected_err = SA_ERR_HPI_NOT_PRESENT; err = saHpiSensorEventMasksSet(sessionid, id, 5000, act, assertMask, deassertMask); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/tsensorset007.c0000644000175100017510000000540012575647274020346 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiResourceIdT id; SaHpiSessionIdT sessionid; SaHpiBoolT enable = SAHPI_FALSE; SaHpiSensorNumT sid = 0; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundSensor; /* ************************************* * Find a resource with Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid,SAHPI_CAPABILITY_SENSOR,SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: find a sensor with desired property **************************/ entryid = SAHPI_FIRST_ENTRY; foundSensor = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if ((rdr.RdrType == SAHPI_SENSOR_RDR) && (rdr.RdrTypeUnion.SensorRec.EventCtrl != SAHPI_SEC_PER_EVENT) && (rdr.RdrTypeUnion.SensorRec.EventCtrl != SAHPI_SEC_READ_ONLY_MASKS)) { foundSensor = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundSensor) { err("Did not find desired resource for test\n"); return(SA_OK); } else { sid = rdr.RdrTypeUnion.SensorRec.Num; } /************************** * Test: Setting a read-only sensor **************************/ expected_err = SA_ERR_HPI_READ_ONLY; err = saHpiSensorEventEnableSet(sessionid, id, sid, enable); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/tsensorget016.c0000644000175100017510000000426312575647274020340 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiResourceIdT id = 1; SaHpiSensorNumT sid = 1; SaHpiEventStateT state; SaHpiSensorReadingT reading; /* ************************************* * Find a resource with Sensor type rdr * ************************************* */ struct oh_handler_state handle; memset(&handle, 0, sizeof(struct oh_handler_state)); /************************** * Test: snmp_bc_get_sensor_eventstate() * NULL handle pointer **************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = snmp_bc_get_sensor_eventstate(NULL, id, sid, &reading, &state); checkstatus(err, expected_err, testfail); /************************** * Test: NULL Reading pointer * expected_err = SA_ERR_HPI_INVALID_PARAMS; **************************/ err = snmp_bc_get_sensor_eventstate(&handle, id, sid, NULL, &state); checkstatus(err, expected_err, testfail); /************************** * Test: NULL State pointer * expected_err = SA_ERR_HPI_INVALID_PARAMS; **************************/ err = snmp_bc_get_sensor_eventstate(&handle, id, sid, &reading, NULL); checkstatus(err, expected_err, testfail); /************************** * Test: Multiple NULL pointers * expected_err = SA_ERR_HPI_INVALID_PARAMS; **************************/ err = snmp_bc_get_sensor_eventstate(NULL , id, sid, NULL, NULL); checkstatus(err, expected_err, testfail); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/tsensorset006.c0000644000175100017510000000526612575647274020357 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiResourceIdT id; SaHpiSessionIdT sessionid; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundSensor; SaHpiSensorNumT sid = 0; SaHpiBoolT enable = SAHPI_FALSE; /* ************************************* * Find a resource with Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid,SAHPI_CAPABILITY_SENSOR,SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: find a sensor with desired property **************************/ entryid = SAHPI_FIRST_ENTRY; foundSensor = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if ((rdr.RdrType == SAHPI_SENSOR_RDR) && (rdr.RdrTypeUnion.SensorRec.DataFormat.IsSupported == SAHPI_FALSE)) { foundSensor = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundSensor) { err("Did not find desired resource for test\n"); return(SA_OK); } else { sid = rdr.RdrTypeUnion.SensorRec.Num; } /************************** * Test: enable event for nonsupported capability **************************/ expected_err = SA_ERR_HPI_READ_ONLY; err = saHpiSensorEventEnableSet(sessionid, id, sid, enable); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/snmp_utils.c0000644000175100017510000000501312575647274020103 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Steve Sherman */ #include #include #include #include #include int snmp_get(void *sessp, const char *objid, struct snmp_value *value) { SnmpMibInfoT *hash_data; hash_data = (SnmpMibInfoT *)g_hash_table_lookup(sim_hash, objid); if (hash_data) { value->type = hash_data->type; switch (value->type) { case ASN_INTEGER: value->integer = hash_data->value.integer; if (value->integer == SNMP_FORCE_ERROR) { return -1; } if (value->integer == SNMP_FORCE_TIMEOUT) {return SA_ERR_HPI_TIMEOUT;} if (value->integer == SA_ERR_SNMP_NOSUCHOBJECT) { return SA_ERR_HPI_NOT_PRESENT; } break; case ASN_OCTET_STR: strcpy(value->string, hash_data->value.string); value->str_len = strlen(hash_data->value.string); break; default: err("Unknown SNMP type=%d for oid=%s\n", value->type, objid); return -1; } } else { err("No value in sim_hash for OID = %s\n", objid); return SA_ERR_HPI_NOT_PRESENT; } return 0; } int snmp_set(void *sessp, char *objid, struct snmp_value value) { SnmpMibInfoT *hash_data; hash_data = (SnmpMibInfoT *)g_hash_table_lookup(sim_hash, objid); if (hash_data) { switch (hash_data->type) { case ASN_INTEGER: err("Setting oid=%s with value=%d\n", objid, (int)hash_data->value.integer); if (hash_data->value.integer == SNMP_FORCE_TIMEOUT) {return SA_ERR_HPI_TIMEOUT;} hash_data->value.integer = value.integer; break; case ASN_OCTET_STR: err("Setting oid=%s with value=%s\n", objid, hash_data->value.string); strcpy(hash_data->value.string, value.string); break; default: err("Unknown SNMP type=%d for oid=%s\n", hash_data->type, objid); return -1; } } else { err("No value in sim_hash for OID = %s\n", objid); return SA_ERR_HPI_NOT_PRESENT; } return 0; } int snmp_getn_bulk( void *sessp, oid *bulk_objid, size_t bulk_objid_len, struct snmp_pdu *bulk_pdu, struct snmp_pdu **bulk_response, int num_repetitions ) { return 0; } openhpi-3.6.1/plugins/snmp_bc/t/tsptime001.c0000644000175100017510000000273512575647274017624 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; struct tm time; struct oh_handler_state l_handle; memset(&time, 0, sizeof(struct tm)); memset(&l_handle, 0, sizeof(struct oh_handler_state)); /************************** * Test : Invalid handle **************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = snmp_bc_get_sp_time(NULL, &time); checkstatus(err, expected_err, testfail); /************************** * Test : Invalid pointer to time struct **************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = snmp_bc_get_sp_time(&l_handle, NULL); checkstatus(err, expected_err, testfail); /************************** * Cleanup after all tests ***************************/ return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/tsensorget003.c0000644000175100017510000000247012575647274020332 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiResourceIdT id = 5000; SaHpiSensorNumT sid = 0; SaHpiEventStateT state; SaHpiSensorReadingT reading; struct oh_handler_state handle; memset(&handle, 0, sizeof(struct oh_handler_state)); /************************** * Test 3: Invalid custom_handle pointer **************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = snmp_bc_get_sensor_reading(&handle, id, sid, &reading, &state); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/tsensorget031.c0000644000175100017510000000453612575647274020340 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiResourceIdT id; SaHpiSessionIdT sessionid; SaHpiSensorNumT sid = 0; SaHpiBoolT enable; /* ************************************* * Find a resource with NO Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid, SAHPI_CAPABILITY_SENSOR, SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test:invalid handler **************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = snmp_bc_get_sensor_event_enable(NULL, id, sid, &enable); checkstatus(err, expected_err, testfail); /************************** * Test: invalid data pointer **************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = saHpiSensorEventEnableGet(sessionid, id, sid, NULL); checkstatus(err, expected_err, testfail); /************************** * Test 32 **************************/ expected_err = SA_ERR_HPI_INVALID_RESOURCE; err = saHpiSensorEventEnableGet(sessionid, 5000, sid, &enable); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/thotswap-simple001.c0000644000175100017510000000657612575647274021306 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan * Steve Sherman */ #include #include #include int main(int argc, char **argv) { int testfail = 0; SaErrorT err, expected_err; SaHpiHsIndicatorStateT hs_ind_state = 0; SaHpiHsStateT hs_state = 0; SaHpiResetActionT act = 0; SaHpiResourceIdT id = 0; SaHpiEntryIdT rptid, next_rptid; SaHpiRptEntryT rptentry; SaHpiSessionIdT sessionid; SaHpiTimeoutT timeout; /************************************************ * Find a resource with simple hotswap capability ************************************************/ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Cannot open session\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } /* Can't use tfind_resource(); Need to look for SAHPI_CAPABILITY_FRU and not SAHPI_CAPABILITY_MANAGED_HOTSWAP */ rptid = SAHPI_FIRST_ENTRY; while ((err == SA_OK) && (rptid != SAHPI_LAST_ENTRY)) { err = saHpiRptEntryGet(sessionid, rptid, &next_rptid, &rptentry); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if ((rptentry.ResourceCapabilities & SAHPI_CAPABILITY_FRU) && !(rptentry.ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP)) { id = rptentry.ResourceId; break; } else { rptid = next_rptid; continue; } } if (id == 0) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Cannot find a simple hotswap resource\n"); return -1; } #if 0 printf("Found resource = %s\n", rptentry.ResourceTag.Data); #endif /*************************** * Test: Capability checking ***************************/ expected_err = SA_ERR_HPI_CAPABILITY; err = saHpiHotSwapPolicyCancel(sessionid, id); checkstatus(err, expected_err, testfail); err = saHpiResourceActiveSet(sessionid, id); checkstatus(err, expected_err, testfail); err = saHpiResourceInactiveSet(sessionid, id); checkstatus(err, expected_err, testfail); err = saHpiAutoExtractTimeoutGet(sessionid, id, &timeout); checkstatus(err, expected_err, testfail); timeout = SAHPI_TIMEOUT_IMMEDIATE; err = saHpiAutoExtractTimeoutSet(sessionid, id, timeout); checkstatus(err, expected_err, testfail); err = saHpiHotSwapStateGet(sessionid, id, &hs_state); checkstatus(err, expected_err, testfail); err = saHpiHotSwapActionRequest(sessionid, id, act); checkstatus(err, expected_err, testfail); err = saHpiHotSwapIndicatorStateGet(sessionid, id, &hs_ind_state); checkstatus(err, expected_err, testfail); err = saHpiHotSwapIndicatorStateSet(sessionid, id, hs_ind_state); checkstatus(err, expected_err, testfail); /************************* * Cleanup after all tests *************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/tsnmp_bc_getset.c0000644000175100017510000000750012575647274021071 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ // gchar *BUSY_OID = ".1.3.6.1.4.1.2.3.51.2.4.4.1.7777"; int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiSessionIdT sessionid; struct snmp_value value; struct snmp_bc_hnd custom_handle; /* ************************ * Find a resource with Control type rdr * ***********************/ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid, SAHPI_CAPABILITY_CONTROL, SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return -1; } memset (&custom_handle, 0, sizeof(struct snmp_bc_hnd)); /************************** * Test 1: Test Busy Status * Under simulation it is ok for custom_handle == NULL **************************/ // expected_err = SA_ERR_HPI_BUSY; // err = snmp_bc_snmp_get(&custom_handle, BUSY_OID, &value, SAHPI_FALSE); // checkstatus(err, expected_err, testfail); /************************** * Test 2: Test Timeout Status **************************/ // custom_handle.handler_retries = SNMP_BC_MAX_SNMP_RETRY_ATTEMPTED; // expected_err = SA_ERR_HPI_NO_RESPONSE; // err = snmp_bc_snmp_get(&custom_handle, BUSY_OID, &value, SAHPI_TRUE); // checkstatus(err, expected_err, testfail); /************************** * Test 3: Valid case **************************/ expected_err = SA_OK; err = snmp_bc_snmp_get(&custom_handle, SNMP_BC_DATETIME_OID, &value, SAHPI_TRUE); checkstatus(err, expected_err, testfail); /************************** * Test 4: validate field **************************/ if (custom_handle.handler_retries != 0) { printf("Error! handler_retries does not get cleared after a successful snmp_get, Line=%d\n", __LINE__); testfail = -1; } /************************** * Test 5: Test Busy Status, snmp_set **************************/ // expected_err = SA_ERR_HPI_BUSY; // err = snmp_bc_snmp_set(&custom_handle, BUSY_OID, value); // checkstatus(err, expected_err, testfail); /************************** * Test 6: Test Timeout Status, snmp_set **************************/ // custom_handle.handler_retries = SNMP_BC_MAX_SNMP_RETRY_ATTEMPTED; // expected_err = SA_ERR_HPI_NO_RESPONSE; // err = snmp_bc_snmp_set(&custom_handle, BUSY_OID, value); // checkstatus(err, expected_err, testfail); /************************** * Test 7: Valid case **************************/ expected_err = SA_OK; err = snmp_bc_snmp_set(&custom_handle, SNMP_BC_DATETIME_OID, value); checkstatus(err, expected_err, testfail); /************************** * Test 8: validate field **************************/ if (custom_handle.handler_retries != 0) { printf("Error! handler_retries does not get cleared after a successful snmp_set, Line=%d\n", __LINE__); testfail = -1; } /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/tsensorset010.c0000644000175100017510000000554212575647274020347 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiResourceIdT id; SaHpiSessionIdT sessionid; SaHpiSensorNumT sid = 0; SaHpiSensorEventMaskActionT act = SAHPI_SENS_ADD_EVENTS_TO_MASKS; SaHpiEventStateT assertMask = SAHPI_ES_UPPER_MINOR; SaHpiEventStateT deassertMask = SAHPI_ES_UPPER_CRIT; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundSensor; /* ************************************* * Find a resource with Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid,SAHPI_CAPABILITY_SENSOR,SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: find a sensor with desired property **************************/ entryid = SAHPI_FIRST_ENTRY; foundSensor = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if ((rdr.RdrType == SAHPI_SENSOR_RDR) && (rdr.RdrTypeUnion.SensorRec.EventCtrl != SAHPI_SEC_PER_EVENT)) { foundSensor = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundSensor) { err("Did not find desired resource for test\n"); return(SA_OK); } else { sid = rdr.RdrTypeUnion.SensorRec.Num; } /************************** * Test: Sensor with !SAHPI_SEC_PER_EVENT **************************/ expected_err = SA_ERR_HPI_READ_ONLY; err = saHpiSensorEventMasksSet(sessionid, id, sid, act, assertMask, deassertMask); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/tinv007.c0000644000175100017510000000547112575647274017125 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiResourceIdT id = 0; SaHpiSessionIdT sessionid; SaHpiIdrIdT idrId = 0; SaHpiIdrInfoT info; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundControl; /* ************************************* * Find a resource with inventory capability * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid, SAHPI_CAPABILITY_INVENTORY_DATA, SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Can not find an Inventory resource for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: find an Inventory RDR **************************/ entryid = SAHPI_FIRST_ENTRY; foundControl = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if (rdr.RdrType == SAHPI_INVENTORY_RDR) { foundControl = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundControl) { err("Did not find desired resource for test\n"); return(SA_OK); } else { idrId = rdr.RdrTypeUnion.InventoryRec.IdrId; } /************************** * Test : invalid IdrId **************************/ expected_err = SA_ERR_HPI_NOT_PRESENT; err = saHpiIdrInfoGet(sessionid, id, 5000, &info); checkstatus(err, expected_err,testfail); /************************** * Test : Valid case **************************/ expected_err = SA_OK; err = saHpiIdrInfoGet(sessionid, id, idrId, &info); checkstatus(err, expected_err, testfail); /**************************&* * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/Makefile.am0000644000175100017510000004743212575647274017611 0ustar mohanmohan# (C) Copyright IBM Corp 2003, 2006 # All rights reserved. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # Generated files - need to keep in sync with parent directory's Makefile.am GENERATED_EVENT_XML_MAP = event.xml GENERATED_EVENT_CODE = el2event.c GENERATED_CODE = $(GENERATED_EVENT_XML_MAP) $(GENERATED_EVENT_CODE) REMOTE_SIM_SOURCES = \ snmp_bc.c \ snmp_bc_annunciator.c \ snmp_bc_control.c \ snmp_bc_discover.c \ snmp_bc_discover_bc.c \ snmp_bc_discover_rsa.c \ snmp_bc_event.c \ snmp_bc_inventory.c \ snmp_bc_hotswap.c \ snmp_bc_power.c \ snmp_bc_reset.c \ snmp_bc_resources.c \ snmp_bc_resources_rsa.c \ snmp_bc_sel.c \ snmp_bc_sensor.c \ snmp_bc_session.c \ snmp_bc_time.c \ snmp_bc_utils.c \ snmp_bc_watchdog.c \ snmp_bc_xml2event.c MOSTLYCLEANFILES = @TEST_CLEAN@ $(REMOTE_SIM_SOURCES) uid_map MOSTLYCLEANFILES += $(GENERATED_CODE) MAINTAINERCLEANFILES = Makefile.in AM_CPPFLAGS = -DG_LOG_DOMAIN=\"t\" SNMPUTILSDIR = $(top_srcdir)/$(SNMPDIR) AM_CPPFLAGS += \ @OPENHPI_INCLUDES@ \ -I$(top_srcdir)/snmp \ -I$(top_srcdir)/include \ -I$(SNMPUTILSDIR) \ -I$(top_srcdir)/plugins/snmp_bc AM_CFLAGS = @SNMPFLAGS@ # AM_CFLAGS = @CFLAGS@ -I$(top_srcdir)/include @SNMPFLAGS@ EXTRA_DIST = sim_resources.h openhpi.conf tsetup.h sim_test_file noinst_LTLIBRARIES = libsnmp_bc.la $(REMOTE_SIM_SOURCES): if test ! -f $@ -a ! -L $@; then \ $(LN_S) $(top_srcdir)/plugins/snmp_bc/$@; \ fi libsnmp_bc_la_SOURCES = \ sim_init.c \ sim_resources.c \ sim_file.c \ snmp_utils.c \ tsetup.c nodist_libsnmp_bc_la_SOURCES = $(GENERATED_EVENT_CODE) $(REMOTE_SIM_SOURCES) # libopenhpi_la_LIBADD = $(top_builddir)/utils/libopenhpiutils.la # libopenhpi_la_LDFLAGS = -L$(top_builddir)/utils -version-info @HPI_LIB_VERSION@ -export-symbols $(top_srcdir)/src/hpi.sym libsnmp_bc_la_LIBADD = -luuid @SNMPLIBS@ $(top_builddir)/utils/libopenhpiutils.la libsnmp_bc_la_LDFLAGS = -L$(top_builddir)/utils -module -version-info @HPI_LIB_VERSION@ # libsnmp_bc_la_LDFLAGS = -version 0:0:0 libsnmp_bc.la: $(libsnmp_bc_la_OBJECTS) $(libsnmp_bc_la_DEPENDENCIES) $(LINK) -rpath $(pkglibdir) $(libsnmp_bc_la_LDFLAGS) $(libsnmp_bc_la_OBJECTS) $(libsnmp_bc_la_LIBADD) $(LIBS) # Keep in sync with parent directory's Makefile.am # FIXME:: Be nice if auto-generation rules where just in snmp_bc/Makefile.am # and not repeated here; but t directory is done first. EVENT_MAP_FILE = $(top_srcdir)/plugins/snmp_bc/snmp_bc_event.map EVENT_MAP_SCRIPT = $(top_srcdir)/plugins/snmp_bc/eventmap2code.pl EVENT_XML_MAP_SCRIPT = $(top_srcdir)/scripts/text2cstr.pl $(GENERATED_EVENT_CODE): $(EVENT_MAP_FILE) $(EVENT_MAP_SCRIPT) $(EVENT_XML_MAP_SCRIPT) $(EVENT_MAP_SCRIPT) -xml -idir $(top_srcdir)/plugins/snmp_bc -mapfile snmp_bc_event.map $(EVENT_XML_MAP_SCRIPT) -s eventxml $(GENERATED_EVENT_XML_MAP) > $(GENERATED_EVENT_CODE) # Setup environment variables for TESTS programs TESTS_ENVIRONMENT = OPENHPI_CONF=$(srcdir)/openhpi.conf TESTS_ENVIRONMENT += OPENHPI_SIMTEST_FILE=$(srcdir)/sim_test_file #TESTS_ENVIRONMENT += OPENHPI_ERROR=YES #TESTS_ENVIRONMENT += OPENHPI_DEBUG=YES TESTS_ENVIRONMENT += LD_LIBRARY_PATH=$(top_srcdir)/openhpid/.libs:$(top_srcdir)/ssl/.libs:$(top_srcdir)/utils/.libs:$(top_srcdir)/plugins/snmp/.libs:$(top_srcdir)/plugins/snmp_bc/t/.libs TESTS_ENVIRONMENT += OPENHPI_UID_MAP=$(shell pwd)/uid_map TESTS_ENVIRONMENT += OPENHPI_PATH=$(shell pwd) TESTS = \ setup_conf \ tsim_file \ tevent \ tcontrol_parms \ tset_resource_tag \ tset_resource_sev \ tsnmp_bc_getset \ tsensorget001 \ tsensorget002 \ tsensorget003 \ tsensorget004 \ tsensorget005 \ tsensorget010 \ tsensorget013 \ tsensorget016 \ tsensorget031 \ tsensorget033 \ tsensorget034 \ tsensorget035 \ tsensorget036 \ tsensorget040 \ tsensorget041 \ tcontrol001 \ tcontrol002 \ tcontrol003 \ tcontrolfailover \ tdiscover001 \ tel001 \ tel002 \ tel003 \ tel004 \ tel005 \ tel006 \ tel007 \ thotswap001 \ thotswap-mhs001 \ thotswap-simple001 \ tinv001 \ tinv002 \ tinv003 \ tinv004 \ tinv005 \ tinv006 \ tinv007 \ tpower001 \ treset001 \ tsptime001 \ tsptime002 \ tsensorset001 \ tsensorset002 \ tsensorset003 \ tsensorset004 \ tsensorset005 \ tsensorset006 \ tsensorset007 \ tsensorset008 \ tsensorset009 \ tsensorset010 \ tsensorset011 \ tsensorset012 \ tsensorset013 \ tsensorset015 \ tsensorset017 \ tsensorset018 \ tsensorset019 \ tsensorset020 \ tsensorset021 \ tsensorset022 \ tsensorset023 \ tsensorset024 # tdiscover002 # tsnmp_bc_get_guid # Need to put expected test failures in BOTH TESTS and XFAIL_TESTS # XFAIL_TESTS = thotswap_reset check_PROGRAMS = $(TESTS) # Unit test using normal IF calls and simulation library setup_conf_SOURCES = setup_conf.c # Unit test using normal IF calls and simulation library tsim_file_SOURCES = tsim_file.c tsim_file_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # Unit test using normal IF calls and simulation library tevent_SOURCES = tevent.c tevent_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # Unit test using normal IF calls and simulation library tcontrol_parms_SOURCES = tcontrol_parms.c tcontrol_parms_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # Unit test using normal IF calls and simulation library tset_resource_tag_SOURCES = tset_resource_tag.c tset_resource_tag_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # Unit test using normal IF calls and simulation library tset_resource_sev_SOURCES = tset_resource_sev.c tset_resource_sev_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # Unit test using normal IF calls and simulation library tsnmp_bc_getset_SOURCES = tsnmp_bc_getset.c tsnmp_bc_getset_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorget001_SOURCES = tsensorget001.c tsensorget001_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorget002_SOURCES = tsensorget002.c tsensorget002_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorget003_SOURCES = tsensorget003.c tsensorget003_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorget004_SOURCES = tsensorget004.c tsensorget004_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorget005_SOURCES = tsensorget005.c tsensorget005_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorget010_SOURCES = tsensorget010.c tsensorget010_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorget013_SOURCES = tsensorget013.c tsensorget013_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorget016_SOURCES = tsensorget016.c tsensorget016_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorget031_SOURCES = tsensorget031.c tsensorget031_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorget033_SOURCES = tsensorget033.c tsensorget033_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorget034_SOURCES = tsensorget034.c tsensorget034_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorget035_SOURCES = tsensorget035.c tsensorget035_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorget036_SOURCES = tsensorget036.c tsensorget036_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorget040_SOURCES = tsensorget040.c tsensorget040_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorget041_SOURCES = tsensorget041.c tsensorget041_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorset001_SOURCES = tsensorset001.c tsensorset001_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorset002_SOURCES = tsensorset002.c tsensorset002_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorset003_SOURCES = tsensorset003.c tsensorset003_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorset004_SOURCES = tsensorset004.c tsensorset004_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorset005_SOURCES = tsensorset005.c tsensorset005_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorset006_SOURCES = tsensorset006.c tsensorset006_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorset007_SOURCES = tsensorset007.c tsensorset007_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorset008_SOURCES = tsensorset008.c tsensorset008_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorset009_SOURCES = tsensorset009.c tsensorset009_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorset010_SOURCES = tsensorset010.c tsensorset010_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorset011_SOURCES = tsensorset011.c tsensorset011_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorset012_SOURCES = tsensorset012.c tsensorset012_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorset013_SOURCES = tsensorset013.c tsensorset013_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorset015_SOURCES = tsensorset015.c tsensorset015_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorset017_SOURCES = tsensorset017.c tsensorset017_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorset018_SOURCES = tsensorset018.c tsensorset018_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorset019_SOURCES = tsensorset019.c tsensorset019_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorset020_SOURCES = tsensorset020.c tsensorset020_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorset021_SOURCES = tsensorset021.c tsensorset021_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorset022_SOURCES = tsensorset022.c tsensorset022_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorset023_SOURCES = tsensorset023.c tsensorset023_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorset024_SOURCES = tsensorset024.c tsensorset024_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tel001_SOURCES = tel001.c tel001_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tel002_SOURCES = tel002.c tel002_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tel003_SOURCES = tel003.c tel003_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tel004_SOURCES = tel004.c tel004_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tel005_SOURCES = tel005.c tel005_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tel006_SOURCES = tel006.c tel006_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tel007_SOURCES = tel007.c tel007_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tinv001_SOURCES = tinv001.c tinv001_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tinv002_SOURCES = tinv002.c tinv002_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tinv003_SOURCES = tinv003.c tinv003_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tinv004_SOURCES = tinv004.c tinv004_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tinv005_SOURCES = tinv005.c tinv005_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tinv006_SOURCES = tinv006.c tinv006_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tinv007_SOURCES = tinv007.c tinv007_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # thotswap001_SOURCES = thotswap001.c thotswap001_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # thotswap_mhs001_SOURCES = thotswap-mhs001.c thotswap_mhs001_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # thotswap_simple001_SOURCES = thotswap-simple001.c thotswap_simple001_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tpower001_SOURCES = tpower001.c tpower001_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # treset001_SOURCES = treset001.c treset001_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsptime001_SOURCES = tsptime001.c tsptime001_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsptime002_SOURCES = tsptime002.c tsptime002_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tdiscover001_SOURCES = tdiscover001.c tdiscover001_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # #tdiscover002_SOURCES = tdiscover002.c #tdiscover002_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ # $(top_builddir)/openhpid/libopenhpidaemon.la \ # $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tcontrol001_SOURCES = tcontrol001.c tcontrol001_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tcontrol002_SOURCES = tcontrol002.c tcontrol002_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tcontrol003_SOURCES = tcontrol003.c tcontrol003_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la tcontrolfailover_SOURCES = tcontrolfailover.c tcontrolfailover_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # Unit test using normal IF calls and simulation library #tsnmp_bc_get_guid_SOURCES = tsnmp_bc_get_guid.c #tsnmp_bc_get_guid_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ # $(top_builddir)/openhpid/libopenhpidaemon.la \ # $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la openhpi-3.6.1/plugins/snmp_bc/t/tel003.c0000644000175100017510000000353012575647274016717 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiResourceIdT id = 0; SaHpiSessionIdT sessionid; /* ************************************* * Find a resource with EventLog type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid, SAHPI_CAPABILITY_EVENT_LOG, SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Can not find a control resource for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test 001: snmp_bc_get_sel_info() **************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = snmp_bc_clear_sel(NULL, id); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/tsensorget036.c0000644000175100017510000000532412575647274020341 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiResourceIdT id; SaHpiSessionIdT sessionid; SaHpiSensorNumT sid = 0; SaHpiEventStateT assertMask; SaHpiEventStateT deassertMask; /* ************************************* * Find a resource with Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid,SAHPI_CAPABILITY_SENSOR,SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: Invalid assert and deassert masks **************************/ expected_err = SA_ERR_HPI_NOT_PRESENT; err = saHpiSensorEventMasksGet(sessionid, id, sid, NULL, NULL); checkstatus(err, expected_err, testfail); /************************** * Test:Invalid deassert mask * expected_err = SA_ERR_HPI_INVALID_PARAMS; **************************/ err = saHpiSensorEventMasksGet(sessionid, id, sid, &assertMask, NULL); checkstatus(err, expected_err, testfail); /************************** * Test Invalid assert mask * expected_err = SA_ERR_HPI_INVALID_PARAMS; **************************/ err = saHpiSensorEventMasksGet(sessionid, id, sid, NULL, &deassertMask); checkstatus(err, expected_err, testfail); /************************** * Test Invalid resource Id **************************/ expected_err = SA_ERR_HPI_INVALID_RESOURCE; err = saHpiSensorEventMasksGet(sessionid, 5000, sid, &assertMask, &deassertMask); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/tsensorset017.c0000644000175100017510000000643012575647274020353 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiResourceIdT id; SaHpiSessionIdT sessionid; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundSensor; SaHpiSensorNumT sid = 0; SaHpiSensorEventMaskActionT act = SAHPI_SENS_ADD_EVENTS_TO_MASKS; SaHpiEventStateT assertMask = SAHPI_ES_UPPER_MINOR; SaHpiEventStateT deassertMask = SAHPI_ES_UPPER_CRIT; /* ************************************* * Find a resource with Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid,SAHPI_CAPABILITY_SENSOR,SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: find a sensor with desired property **************************/ entryid = SAHPI_FIRST_ENTRY; foundSensor = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if ((rdr.RdrType == SAHPI_SENSOR_RDR) && (rdr.RdrTypeUnion.SensorRec.EventCtrl == SAHPI_SEC_PER_EVENT)) { foundSensor = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundSensor) { err("Did not find desired resource for test\n"); return(SA_OK); } else { sid = rdr.RdrTypeUnion.SensorRec.Num; } /************************** * Test: excercise normal code path **************************/ act = SAHPI_SENS_REMOVE_EVENTS_FROM_MASKS; deassertMask = ~(rdr.RdrTypeUnion.SensorRec.Events); assertMask = SAHPI_ALL_EVENT_STATES; expected_err = SA_OK; err = saHpiSensorEventMasksSet(sessionid, id, sid, act, assertMask, deassertMask); checkstatus(err, expected_err, testfail); /************************** * Test excercise normal code path **************************/ assertMask = rdr.RdrTypeUnion.SensorRec.Events; expected_err = SA_OK; err = saHpiSensorEventMasksSet(sessionid, id, sid, act, assertMask, deassertMask); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/tsensorget005.c0000644000175100017510000000370112575647274020332 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiResourceIdT id; SaHpiSessionIdT sessionid; SaHpiRptEntryT rptentry; SaHpiSensorNumT sid = 0; SaHpiEventStateT state; SaHpiSensorReadingT reading; /* ************************************* * Find a resource with Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid, SAHPI_CAPABILITY_SENSOR,SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return -1; } id = rptentry.ResourceId; /************************** * Test: Invalid sensor id **************************/ sid = 5000; expected_err = SA_ERR_HPI_NOT_PRESENT; err = saHpiSensorReadingGet(sessionid, id, sid, &reading, &state); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/thotswap001.c0000644000175100017510000001150312575647274020001 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan * Steve Sherman */ #include #include #include int main(int argc, char **argv) { int testfail = 0; SaErrorT err, expected_err; SaHpiHsIndicatorStateT hs_ind_state = SAHPI_HS_INDICATOR_OFF; SaHpiHsStateT hs_state = SAHPI_HS_STATE_INACTIVE; SaHpiHsActionT act = 0; SaHpiResourceIdT id = 0; SaHpiRptEntryT rptentry; SaHpiSessionIdT sessionid; SaHpiTimeoutT timeout = SAHPI_TIMEOUT_IMMEDIATE; /***************************************** * Find a resource with hotswap capability *****************************************/ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Cannot open session\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid, SAHPI_CAPABILITY_FRU, SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { dbg("Cannot find a hotswap resource\n"); dbg(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /****************************** * Test: Bad parameter checking ******************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = saHpiAutoInsertTimeoutGet(sessionid, NULL); checkstatus(err, expected_err, testfail); err = saHpiAutoInsertTimeoutSet(sessionid, -5); checkstatus(err, expected_err, testfail); err = saHpiAutoExtractTimeoutGet(sessionid, id, NULL); checkstatus(err, expected_err, testfail); err = saHpiAutoExtractTimeoutSet(sessionid, id, -5); checkstatus(err, expected_err, testfail); err = saHpiHotSwapStateGet(sessionid, id, NULL); checkstatus(err, expected_err, testfail); err = saHpiHotSwapActionRequest(sessionid, id, -1); checkstatus(err, expected_err, testfail); err = saHpiHotSwapIndicatorStateGet(sessionid, id, NULL); checkstatus(err, expected_err, testfail); err = saHpiHotSwapIndicatorStateSet(sessionid, id, -1); checkstatus(err, expected_err, testfail); /******************************* * Test: Invalid session checking *******************************/ expected_err = SA_ERR_HPI_INVALID_SESSION; err = saHpiHotSwapPolicyCancel(-1, id); checkstatus(err, expected_err, testfail); err = saHpiResourceActiveSet(-1, id); checkstatus(err, expected_err, testfail); err = saHpiResourceInactiveSet(-1, id); checkstatus(err, expected_err, testfail); err = saHpiAutoInsertTimeoutGet(-1, &timeout); checkstatus(err, expected_err, testfail); err = saHpiAutoInsertTimeoutSet(-1, timeout); checkstatus(err, expected_err, testfail); err = saHpiAutoExtractTimeoutGet(-1, id, &timeout); checkstatus(err, expected_err, testfail); err = saHpiAutoExtractTimeoutSet(-1, id, timeout); checkstatus(err, expected_err, testfail); err = saHpiHotSwapStateGet(-1, id, &hs_state); checkstatus(err, expected_err, testfail); err = saHpiHotSwapActionRequest(-1, id, act); checkstatus(err, expected_err, testfail); err = saHpiHotSwapIndicatorStateGet(-1, id, &hs_ind_state); checkstatus(err, expected_err, testfail); err = saHpiHotSwapIndicatorStateSet(-1, id, hs_ind_state); checkstatus(err, expected_err, testfail); /**************************** * Test: Invalid RID checking ****************************/ expected_err = SA_ERR_HPI_INVALID_RESOURCE; err = saHpiHotSwapPolicyCancel(sessionid, -1); checkstatus(err, expected_err, testfail); err = saHpiResourceActiveSet(sessionid, -1); checkstatus(err, expected_err, testfail); err = saHpiResourceInactiveSet(sessionid, -1); checkstatus(err, expected_err, testfail); err = saHpiAutoExtractTimeoutGet(sessionid, -1, &timeout); checkstatus(err, expected_err, testfail); err = saHpiAutoExtractTimeoutSet(sessionid, -1, timeout); checkstatus(err, expected_err, testfail); err = saHpiHotSwapStateGet(sessionid, -1, &hs_state); checkstatus(err, expected_err, testfail); err = saHpiHotSwapActionRequest(sessionid, -1, act); checkstatus(err, expected_err, testfail); err = saHpiHotSwapIndicatorStateGet(sessionid, -1, &hs_ind_state); checkstatus(err, expected_err, testfail); err = saHpiHotSwapIndicatorStateSet(sessionid, -1, hs_ind_state); checkstatus(err, expected_err, testfail); /************************* * Cleanup after all tests *************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/tpower001.c0000644000175100017510000000752112575647274017455 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan * Steve Sherman */ #include #include #include int main(int argc, char **argv) { int testfail = 0; SaErrorT err, expected_err; SaHpiPowerStateT state = 0; SaHpiResourceIdT id = 0; SaHpiRptEntryT rptentry; SaHpiSessionIdT sessionid; /*************************************** * Find a resource with Power capability ***************************************/ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Cannot open session\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid, SAHPI_CAPABILITY_POWER, SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Cannot find a Power capable resource\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; #if 0 printf("Found resource = %s\n", rptentry.ResourceTag.Data); #endif /*********************** * Test: Invalid session ***********************/ expected_err = SA_ERR_HPI_INVALID_SESSION; err = saHpiResourcePowerStateGet(-1, id, &state); checkstatus(err, expected_err, testfail); err = saHpiResourcePowerStateSet(-1, id, state); checkstatus(err, expected_err, testfail); /************************ * Test: Invalid resource ************************/ expected_err = SA_ERR_HPI_INVALID_RESOURCE; err = saHpiResourcePowerStateGet(sessionid, -1, &state); checkstatus(err, expected_err, testfail); err = saHpiResourcePowerStateSet(sessionid, -1, state); checkstatus(err, expected_err, testfail); /************************** * Test: Invalid parameters **************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = saHpiResourcePowerStateGet(sessionid, id, NULL); checkstatus(err, expected_err, testfail); err = saHpiResourcePowerStateSet(sessionid, id, -1); checkstatus(err, expected_err, testfail); /************************* * Test: Normal operations *************************/ expected_err = SA_OK; err = saHpiResourcePowerStateSet(sessionid, id, SAHPI_POWER_ON); checkstatus(err, expected_err, testfail); err = saHpiResourcePowerStateGet(sessionid, id, &state); checkstatus(err, expected_err, testfail); if (state != SAHPI_POWER_ON) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Current state = %s\n", oh_lookup_powerstate(state)); return -1; } err = saHpiResourcePowerStateSet(sessionid, id, SAHPI_POWER_CYCLE); checkstatus(err, expected_err, testfail); err = saHpiResourcePowerStateGet(sessionid, id, &state); checkstatus(err, expected_err, testfail); if (state != SAHPI_POWER_ON) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Current state = %s\n", oh_lookup_powerstate(state)); return -1; } err = saHpiResourcePowerStateSet(sessionid, id, SAHPI_POWER_OFF); checkstatus(err, expected_err, testfail); #if 0 err = saHpiResourcePowerStateGet(sessionid, id, &state); checkstatus(err, expected_err, testfail); if (state != SAHPI_POWER_OFF) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Current state = %s\n", oh_lookup_powerstate(state)); return -1; } #endif /************************* * Cleanup after all tests *************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/tsensorget002.c0000644000175100017510000000262512575647274020333 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiResourceIdT id =0; SaHpiSensorNumT sid = 0; SaHpiEventStateT state; SaHpiSensorReadingT reading; struct oh_handler_state dd_hnd = { .rptcache = (RPTable *)NULL, .eventq = NULL, .config = NULL, .data = (void *)NULL }; /************************** * Test NULL cache **************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = snmp_bc_get_sensor_reading(&dd_hnd, id, sid, &reading, &state); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/tsensorset021.c0000644000175100017510000000527712575647274020356 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiResourceIdT id = 0; SaHpiSessionIdT sessionid; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiSensorNumT sid = 0; SaHpiSensorThresholdsT thres; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundSensor; /* ************************************* * Find a resource with Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid,SAHPI_CAPABILITY_SENSOR,SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: find a sensor with desired property **************************/ entryid = SAHPI_FIRST_ENTRY; foundSensor = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if ((rdr.RdrType == SAHPI_SENSOR_RDR) && (rdr.RdrTypeUnion.SensorRec.Category != SAHPI_EC_THRESHOLD)) { foundSensor = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundSensor) { err("Did not find desired resource for test\n"); return(SA_OK); } else { sid = rdr.RdrTypeUnion.SensorRec.Num; } /************************** * Test: set theshold to a non-threshold sensor **************************/ expected_err = SA_ERR_HPI_INVALID_CMD; err = saHpiSensorThresholdsSet(sessionid, id, sid, &thres); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/tinv005.c0000644000175100017510000000675512575647274017131 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiResourceIdT id = 0; SaHpiSessionIdT sessionid; SaHpiIdrIdT idrId = 0; SaHpiEntryIdT areaId = 0; SaHpiEntryIdT fieldId = 0; SaHpiEntryIdT nextfieldId; SaHpiIdrFieldT field; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundControl; /* ************************************* * Find a resource with inventory capability * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid, SAHPI_CAPABILITY_INVENTORY_DATA, SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Can not find an Inventory resource for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: find an Inventory RDR **************************/ entryid = SAHPI_FIRST_ENTRY; foundControl = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if (rdr.RdrType == SAHPI_INVENTORY_RDR) { foundControl = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundControl) { err("Did not find desired resource for test\n"); return(SA_OK); } else { idrId = rdr.RdrTypeUnion.InventoryRec.IdrId; } /************************** * Test: Invalid FieldId **************************/ expected_err = SA_ERR_HPI_NOT_PRESENT; err = saHpiIdrFieldGet(sessionid , id, idrId, areaId, SAHPI_IDR_FIELDTYPE_UNSPECIFIED, fieldId, &nextfieldId, &field); checkstatus(err, expected_err, testfail); /************************** * Test : Normal path, with real ID **************************/ areaId = 1; fieldId = 1; expected_err = SA_OK; err = saHpiIdrFieldGet(sessionid , id, idrId, areaId, SAHPI_IDR_FIELDTYPE_UNSPECIFIED, fieldId, &nextfieldId, &field); checkstatus(err, expected_err, testfail); /************************** * Test :Normal Path with HPI defined ID * expected_err = SA_OK; **************************/ areaId = 1; fieldId = SAHPI_FIRST_ENTRY; err = saHpiIdrFieldGet(sessionid , id, idrId, areaId, SAHPI_IDR_FIELDTYPE_UNSPECIFIED, fieldId, &nextfieldId, &field); checkstatus(err, expected_err, testfail); /**************************&* * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/tel005.c0000644000175100017510000000504312575647274016722 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiResourceIdT id = 0; SaHpiEventLogEntryIdT current = 0; SaHpiEventLogEntryIdT previd; SaHpiEventLogEntryIdT nextid; SaHpiEventLogEntryT entry; SaHpiRdrT rdr; SaHpiRptEntryT rptentry; struct oh_handler_state l_handle; memset(&l_handle, 0, sizeof(struct oh_handler_state)); /************************** * Test: NULL handle, rdr, rpt **************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = snmp_bc_get_sel_entry(NULL, id, current, &previd, &nextid, &entry, NULL, NULL); checkstatus(err, expected_err,testfail); /************************** * Test: NULL previd * expected_err = SA_ERR_HPI_INVALID_PARAMS; **************************/ err = snmp_bc_get_sel_entry(&l_handle, id, current, NULL, &nextid, &entry, NULL, NULL); checkstatus(err, expected_err, testfail); /************************** * Test: NULL nextid * expected_err = SA_ERR_HPI_INVALID_PARAMS; **************************/ err = snmp_bc_get_sel_entry(&l_handle, id, current, &previd, NULL, &entry, NULL, NULL); checkstatus(err, expected_err, testfail); /************************** * Test: NULL nextid * expected_err = SA_ERR_HPI_INVALID_PARAMS; **************************/ err = snmp_bc_get_sel_entry(&l_handle, id, current, &previd, &nextid, NULL, NULL, NULL); checkstatus(err, expected_err, testfail); /************************** * Test: NULL handle * expected_err = SA_ERR_HPI_INVALID_PARAMS; **************************/ err = snmp_bc_get_sel_entry(NULL, id, current, &previd, &nextid, &entry, &rdr, &rptentry); checkstatus(err, expected_err, testfail); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/tcontrol002.c0000644000175100017510000000576112575647274020006 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiResourceIdT id; SaHpiSessionIdT sessionid; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiCtrlNumT cid = 1; SaHpiCtrlModeT mode; SaHpiCtrlStateT state; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundControl; /* ************************************* * Find a resource with Control type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid, SAHPI_CAPABILITY_CONTROL, SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Can not find a control resource for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: find a control RDR **************************/ entryid = SAHPI_FIRST_ENTRY; foundControl = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if (rdr.RdrType == SAHPI_CTRL_RDR) { foundControl = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundControl) { err("Did not find desired resource for test\n"); return(SA_OK); } else { cid = rdr.RdrTypeUnion.CtrlRec.Num; } /************************** * Test 1: Normal get *************************/ expected_err = SA_OK; err = saHpiControlGet(sessionid, id, cid, &mode, &state); checkstatus(err, expected_err, testfail); /************************** * Test 2: Get with no mode * expected_err = SA_OK; *************************/ err = saHpiControlGet(sessionid, id, cid, NULL, &state); checkstatus(err, expected_err, testfail); /************************** * Test 3: Get with no state * expected_err = SA_OK; *************************/ err = saHpiControlGet(sessionid, id, cid, &mode, NULL); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/tel002.c0000644000175100017510000000356712575647274016730 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiResourceIdT id = 0; SaHpiSessionIdT sessionid; SaHpiEventLogInfoT info; /* ************************************* * Find a resource with EventLog type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid, SAHPI_CAPABILITY_EVENT_LOG, SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Can not find a control resource for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: valid snmp_bc_get_eventlog_info **************************/ expected_err = SA_OK; err = saHpiEventLogInfoGet(sessionid, id, &info); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/tsensorset001.c0000644000175100017510000000464412575647274020351 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiResourceIdT id = 0; SaHpiSessionIdT sessionid; SaHpiSensorNumT sid = 0; SaHpiBoolT enable = SAHPI_FALSE; /* ************************************* * Find a resource with Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid,SAHPI_CAPABILITY_SENSOR,SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: Invalid handle **************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = snmp_bc_set_sensor_enable(NULL, id, sid, enable); checkstatus(err, expected_err, testfail); /************************** * Test:Invalid resoruce id **************************/ expected_err = SA_ERR_HPI_INVALID_RESOURCE; err = saHpiSensorEnableSet(sessionid, 5000, sid, enable); checkstatus(err, expected_err, testfail); /************************** * Test: invalid sensor Id **************************/ expected_err = SA_ERR_HPI_NOT_PRESENT; err = saHpiSensorEnableSet(sessionid, id, 5000, enable); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/tcontrolfailover.c0000644000175100017510000000737612575647274021320 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #include #include #include int main(int argc, char **argv) { int testfail = 0; gchar *rdr_name; SaErrorT err, expected_err; SaHpiCtrlModeT mode; SaHpiCtrlStateT state; SaHpiEntityPathT ep, vmm_ep; SaHpiRdrT rdr; SaHpiRptEntryT rpt; SaHpiSessionIdT sessionid; vmm_ep.Entry[0].EntityType = SAHPI_ENT_SYS_MGMNT_MODULE; vmm_ep.Entry[0].EntityLocation = 0; vmm_ep.Entry[1].EntityType = SAHPI_ENT_SYSTEM_CHASSIS; vmm_ep.Entry[1].EntityLocation = 1; vmm_ep.Entry[2].EntityType = SAHPI_ENT_ROOT; vmm_ep.Entry[2].EntityLocation = 0; rdr_name = "MM Failover Control"; /*********************** * Find the VMM resource ***********************/ err = tsetup(&sessionid); if (err) { printf("Error! Cannot open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } oh_init_ep(&ep); oh_concat_ep(&ep, &vmm_ep); err = tfind_resource_by_ep(&sessionid, &ep, SAHPI_FIRST_ENTRY, &rpt); if (err) { printf("Cannot find resource for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return -1; } /************************** * Find MM Failover control **************************/ err = tfind_rdr_by_name(&sessionid, rpt.ResourceId, rdr_name, &rdr); if (err) { printf("Cannot find resource for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return -1; } /*************************** * Test: Write Invalid State ***************************/ expected_err = SA_ERR_HPI_INVALID_REQUEST; state.Type = SAHPI_CTRL_TYPE_DIGITAL; state.StateUnion.Digital = SAHPI_CTRL_STATE_OFF; err = saHpiControlSet(sessionid, rpt.ResourceId, rdr.RdrTypeUnion.CtrlRec.Num, SAHPI_CTRL_MODE_MANUAL, &state); checkstatus(err, expected_err, testfail); /************************** * Test: Write Invalid Mode **************************/ expected_err = SA_ERR_HPI_READ_ONLY; state.Type = SAHPI_CTRL_TYPE_DIGITAL; state.StateUnion.Digital = SAHPI_CTRL_STATE_PULSE_ON; err = saHpiControlSet(sessionid, rpt.ResourceId, rdr.RdrTypeUnion.CtrlRec.Num, SAHPI_CTRL_MODE_AUTO, &state); checkstatus(err, expected_err, testfail); /*************************** * Test: Write Valid State ***************************/ expected_err = SA_OK; state.Type = SAHPI_CTRL_TYPE_DIGITAL; state.StateUnion.Digital = SAHPI_CTRL_STATE_PULSE_ON; err = saHpiControlSet(sessionid, rpt.ResourceId, rdr.RdrTypeUnion.CtrlRec.Num, SAHPI_CTRL_MODE_MANUAL, &state); checkstatus(err, expected_err, testfail); /*********************** * Test: Read State/Mode ***********************/ err = saHpiControlGet(sessionid, rpt.ResourceId, rdr.RdrTypeUnion.CtrlRec.Num, &mode, &state); if (mode != SAHPI_CTRL_MODE_MANUAL || state.StateUnion.Digital != SAHPI_CTRL_STATE_OFF) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf("State=%s; Mode=%s\n", oh_lookup_ctrlmode(mode), oh_lookup_ctrlstatedigital(state.StateUnion.Digital)); return -1; } /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/tel007.c0000644000175100017510000000546212575647274016731 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiResourceIdT id = 0; SaHpiSessionIdT sessionid; SaHpiEventLogEntryIdT previd; SaHpiEventLogEntryIdT nextid; SaHpiEventLogEntryT entry; SaHpiRdrT rdr; SaHpiRptEntryT rptentry; /* ************************************* * Find a resource with EventLog type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid, SAHPI_CAPABILITY_EVENT_LOG, SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Can not find a control resource for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test **************************/ expected_err = SA_OK; err = saHpiEventLogEntryGet(sessionid, id, SAHPI_NEWEST_ENTRY, &previd, &nextid, &entry, &rdr, &rptentry); checkstatus(err, expected_err, testfail); /************************** * Test: NULL rdr * expected_err = SA_OK; **************************/ err = saHpiEventLogEntryGet(sessionid, id, SAHPI_OLDEST_ENTRY, &previd, &nextid, &entry, NULL, &rptentry); checkstatus(err, expected_err, testfail); /************************** * Test: NULL rpt * expected_err = SA_OK; **************************/ err = saHpiEventLogEntryGet(sessionid, id, SAHPI_NEWEST_ENTRY, &previd, &nextid, &entry, &rdr, NULL); checkstatus(err, expected_err, testfail); /************************** * Test: NULL rpt and rdr * expected_err = SA_OK; **************************/ err = saHpiEventLogEntryGet(sessionid, id, SAHPI_OLDEST_ENTRY, &previd, &nextid, &entry, NULL, NULL); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/tsensorset003.c0000644000175100017510000000525612575647274020353 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiResourceIdT id; SaHpiSessionIdT sessionid; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundSensor; SaHpiSensorNumT sid = 0; SaHpiBoolT enable = SAHPI_FALSE; /* ************************************* * Find a resource with Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid,SAHPI_CAPABILITY_SENSOR,SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: find a sensor with desired property **************************/ entryid = SAHPI_FIRST_ENTRY; foundSensor = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if ((rdr.RdrType == SAHPI_SENSOR_RDR) && (rdr.RdrTypeUnion.SensorRec.EnableCtrl == SAHPI_FALSE)) { foundSensor = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundSensor) { err("Did not find desired resource for test\n"); return(SA_OK); } else { sid = rdr.RdrTypeUnion.SensorRec.Num; } /************************** * Test: Setting a sensor with EnableCtrl == FALSE **************************/ expected_err = SA_ERR_HPI_READ_ONLY; err = saHpiSensorEnableSet(sessionid, id, sid, enable); checkstatus(err,expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/tevent.c0000644000175100017510000016524212575647274017226 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ /************************************************************************ * Notes: * * All these test cases depend on values defined in errlog2event_hash and * sensor and resource definitions in snmp_bc_resources.c. These are real * hardware events and sensors, which hopefully won't change much. ************************************************************************/ #include #include #include #include #include #include #define SNMP_BC_ERROR_LOG_MSG_OID ".1.3.6.1.4.1.2.3.51.2.3.4.2.1.2.1" #define SNMP_BC_ERROR_LOG_MSG_OID_RSA ".1.3.6.1.4.1.2.3.51.1.3.4.2.1.2.1" #define SNMP_BC_MM_VOLT_3_3_OID ".1.3.6.1.4.1.2.3.51.2.2.2.1.2.0" #define SNMP_BC_CHASSIS_TEMP_OID ".1.3.6.1.4.1.2.3.51.2.2.1.5.1.0" int main(int argc, char **argv) { SaErrorT err; SaHpiRdrT rdr; SaHpiEntryIdT rptid, next_rptid; SaHpiRptEntryT rpt; SaHpiResourceIdT rid_eventlog=0; SaHpiEventLogEntryT logentry; SaHpiEventLogEntryIdT prev_logid, next_logid; SaHpiSessionIdT sessionid; char *hash_key, *logstr; SnmpMibInfoT *hash_value; SnmpMibInfoT *hash_set_value; SnmpMibInfoT * hash_data; err = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sessionid, NULL); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } err = saHpiDiscover(sessionid); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* Find first Event Log capable resource - assume its MM */ rptid = SAHPI_FIRST_ENTRY; while ((err == SA_OK) && (rptid != SAHPI_LAST_ENTRY)) { err = saHpiRptEntryGet(sessionid, rptid, &next_rptid, &rpt); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if ((rpt.ResourceCapabilities & SAHPI_CAPABILITY_EVENT_LOG)) { rid_eventlog = rpt.ResourceId; break; } else { rptid = next_rptid; continue; } } if (rid_eventlog == 0) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Cannot find Chassis RID\n"); return -1; } /* Determine platform */ hash_data = (SnmpMibInfoT *)g_hash_table_lookup(sim_hash, SNMP_BC_PLATFORM_OID_RSA); if ((hash_data != NULL) && (hash_data->value.integer == 255)) { printf("Executing RSA event tests\n"); goto RSA_TESTS; } else { printf("Executing BladeCenter event tests\n"); } /* If test OID not already in sim hash table; create it */ if (!g_hash_table_lookup_extended(sim_hash, SNMP_BC_ERROR_LOG_MSG_OID, (gpointer)&hash_key, (gpointer)&hash_value)) { hash_key = g_strdup(SNMP_BC_ERROR_LOG_MSG_OID); if (!hash_key) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Cannot allocate memory for OID key=%s.\n", SNMP_BC_ERROR_LOG_MSG_OID); return -1; } hash_value = g_malloc0(sizeof(SnmpMibInfoT)); if (!hash_value) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Cannot allocate memory for hash value for OID=%s.\n", SNMP_BC_ERROR_LOG_MSG_OID); return -1; } } err = saHpiEventLogClear(sessionid, rid_eventlog); if (err) { printf("Error! saHpiEventLogClear: line=%d; err=%d\n", __LINE__, err); return -1; } /************************************************************** * TestCase - Blade 1 is defined as an IPMI blade in simulator. * Test to see that a common event defined in blade_sensors * (as opposed to blade_ipmi_sensors) are mapped to IPMI blade. **************************************************************/ logstr = "Severity:INFO Source:BLADE_01 Name:WMN315702424 Date:10/11/03 Time:09:09:46 Text:CPU 1 shut off due to over temperature"; memset(&logentry, 0 , sizeof(SaHpiEventLogEntryT)); strcpy(hash_value->value.string, logstr); g_hash_table_insert(sim_hash, hash_key, hash_value); err = saHpiEventLogEntryGet(sessionid, rid_eventlog, SAHPI_NEWEST_ENTRY, &prev_logid, &next_logid, &logentry, &rdr, &rpt); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* Check expected values */ if (!(!(logentry.Event.Source == rid_eventlog) && (logentry.Event.EventType == SAHPI_ET_SENSOR) && (logentry.Event.Severity == SAHPI_CRITICAL) && (logentry.Event.EventDataUnion.SensorEvent.SensorType == SAHPI_TEMPERATURE) && (logentry.Event.EventDataUnion.SensorEvent.Assertion == SAHPI_TRUE) && (logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_CRIT) && (!(logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_MAJOR)) && (!(logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_MINOR)) && (logentry.Event.EventDataUnion.SensorEvent.PreviousState == SAHPI_ES_UNSPECIFIED) && (logentry.Event.EventDataUnion.SensorEvent.CurrentState == SAHPI_ES_UNSPECIFIED))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); oh_print_event(&(logentry.Event), (rdr.RdrType != SAHPI_NO_RECORD) ? &rdr.Entity : NULL, 1); return -1; } err = saHpiEventLogClear(sessionid, rid_eventlog); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /*************************************************************** * TestCase - Blade 1 is defined as an IPMI blade in simulator. * Test to see that an IPMI unique event is mapped correctly. ***************************************************************/ logstr = "Severity:INFO Source:BLADE_01 Name:WMN315702424 Date:10/11/03 Time:09:09:46 Text:1.8V standby over recommended voltage"; memset(&logentry, 0 , sizeof(SaHpiEventLogEntryT)); strcpy(hash_value->value.string, logstr); g_hash_table_insert(sim_hash, hash_key, hash_value); err = saHpiEventLogEntryGet(sessionid, rid_eventlog, SAHPI_NEWEST_ENTRY, &prev_logid, &next_logid, &logentry, &rdr, &rpt); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } #if 0 /* Check expected values */ if (!(!(logentry.Event.Source == rid_eventlog) && (logentry.Event.EventType == SAHPI_ET_SENSOR) && (logentry.Event.Severity == SAHPI_MAJOR) && (logentry.Event.EventDataUnion.SensorEvent.SensorType == SAHPI_VOLTAGE) && (logentry.Event.EventDataUnion.SensorEvent.Assertion == SAHPI_TRUE) && (!(logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_CRIT)) && ((logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_MAJOR)) && (!(logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_MINOR)) && (logentry.Event.EventDataUnion.SensorEvent.PreviousState == SAHPI_ES_UNSPECIFIED) && (logentry.Event.EventDataUnion.SensorEvent.CurrentState & SAHPI_ES_UPPER_MAJOR))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); oh_print_event(&(logentry.Event), (rdr.RdrType != SAHPI_NO_RECORD) ? &rdr.Entity : NULL, 1); return -1; } #endif err = saHpiEventLogClear(sessionid, rid_eventlog); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /************************************************************ * TestCase - Mapped OVR_MM_PRIME Event (EN_FAULT_OC_USB_HUB) ************************************************************/ logstr = "Severity:INFO Source:SERVPROC Name:WMN315702424 Date:10/11/03 Time:09:09:46 Text:USB hub over-current failure"; memset(&logentry, 0 , sizeof(SaHpiEventLogEntryT)); strcpy(hash_value->value.string, logstr); g_hash_table_insert(sim_hash, hash_key, hash_value); err = saHpiEventLogEntryGet(sessionid, rid_eventlog, SAHPI_NEWEST_ENTRY, &prev_logid, &next_logid, &logentry, &rdr, &rpt); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* Check expected values */ if (!(!(logentry.Event.Source == rid_eventlog) && (logentry.Event.EventType == SAHPI_ET_SENSOR) && (logentry.Event.Severity == SAHPI_MAJOR) && (logentry.Event.EventDataUnion.SensorEvent.SensorType == SAHPI_OPERATIONAL) && (logentry.Event.EventDataUnion.SensorEvent.Assertion == SAHPI_TRUE) && (logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_DEGRADED) && (logentry.Event.EventDataUnion.SensorEvent.PreviousState & SAHPI_ES_RUNNING) && (logentry.Event.EventDataUnion.SensorEvent.CurrentState & SAHPI_ES_DEGRADED))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); oh_print_event(&(logentry.Event), (rdr.RdrType != SAHPI_NO_RECORD) ? &rdr.Entity : NULL, 1); return -1; } err = saHpiEventLogClear(sessionid, rid_eventlog); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /***************************************************************** * TestCase - Mapped OVR_MM_STBY Event (EN_STBIST_FAIL_R_BOOT_ROM) *****************************************************************/ logstr = "Severity:INFO Source:SERVPROC Name:WMN315702424 Date:10/11/03 Time:09:09:46 Text:BIST standby MM bootrom failed."; memset(&logentry, 0 , sizeof(SaHpiEventLogEntryT)); strcpy(hash_value->value.string, logstr); g_hash_table_insert(sim_hash, hash_key, hash_value); err = saHpiEventLogEntryGet(sessionid, rid_eventlog, SAHPI_NEWEST_ENTRY, &prev_logid, &next_logid, &logentry, &rdr, &rpt); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } #if 0 /* Check expected values */ if (!(!(logentry.Event.Source == rid_eventlog) && (logentry.Event.EventType == SAHPI_ET_SENSOR) && (logentry.Event.Severity == SAHPI_MAJOR) && (logentry.Event.EventDataUnion.SensorEvent.SensorType == SAHPI_OPERATIONAL) && (logentry.Event.EventDataUnion.SensorEvent.Assertion == SAHPI_TRUE) && (logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_DEGRADED) && (logentry.Event.EventDataUnion.SensorEvent.PreviousState & SAHPI_ES_RUNNING) && (logentry.Event.EventDataUnion.SensorEvent.CurrentState & SAHPI_ES_DEGRADED))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); oh_print_event(&(logentry.Event), (rdr.RdrType != SAHPI_NO_RECORD) ? &rdr.Entity : NULL, 1); return -1; } #endif err = saHpiEventLogClear(sessionid, rid_eventlog); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /*************************************************************** * TestCase - Mapped MM Voltage Event (EN_PFA_HI_FAULT_3_35V) * Event recovered in next testcase. * Also tests double space handling in text ***************************************************************/ logstr = "Severity:INFO Source:SERVPROC Name:WMN315702424 Date:10/11/03 Time:09:09:46 Text:System over recommended voltage on +3.3v. Read value 3.5. Threshold value 3.4"; memset(&logentry, 0 , sizeof(SaHpiEventLogEntryT)); strcpy(hash_value->value.string, logstr); g_hash_table_insert(sim_hash, hash_key, hash_value); err = saHpiEventLogEntryGet(sessionid, rid_eventlog, SAHPI_NEWEST_ENTRY, &prev_logid, &next_logid, &logentry, &rdr, &rpt); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* Check expected values */ if (!((logentry.Event.Source == rid_eventlog) && (logentry.Event.EventType == SAHPI_ET_SENSOR) && (logentry.Event.Severity == SAHPI_CRITICAL) && (logentry.Event.EventDataUnion.SensorEvent.SensorType == SAHPI_VOLTAGE) && (logentry.Event.EventDataUnion.SensorEvent.Assertion == SAHPI_TRUE) && (logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_CRIT) && (!(logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_MAJOR)) && (!(logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_MINOR)) && (logentry.Event.EventDataUnion.SensorEvent.PreviousState == SAHPI_ES_UNSPECIFIED) && (logentry.Event.EventDataUnion.SensorEvent.CurrentState == SAHPI_ES_UNSPECIFIED) && (logentry.Event.EventDataUnion.SensorEvent.TriggerReading.Value.SensorFloat64 == (double)3.5) && (logentry.Event.EventDataUnion.SensorEvent.TriggerThreshold.Value.SensorFloat64 == (double)3.4))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); oh_print_event(&(logentry.Event), (rdr.RdrType != SAHPI_NO_RECORD) ? &rdr.Entity : NULL, 1); return -1; } err = saHpiEventLogClear(sessionid, rid_eventlog); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /***************************************************************** * TestCase - MM Voltage Recovery Event (EN_PFA_HI_FAULT_3_35V) * Recover event in previous testcase. * Also test BladeCenter alternate threshold format *****************************************************************/ logstr = "Severity:INFO Source:SERVPROC Name:WMN315702424 Date:10/11/03 Time:09:09:46 Text:Recovery System over recommended voltage on +3.3v. Reading: 3.5, Threshold: 3.4."; memset(&logentry, 0 , sizeof(SaHpiEventLogEntryT)); strcpy(hash_value->value.string, logstr); g_hash_table_insert(sim_hash, hash_key, hash_value); err = saHpiEventLogEntryGet(sessionid, rid_eventlog, SAHPI_NEWEST_ENTRY, &prev_logid, &next_logid, &logentry, &rdr, &rpt); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* Check expected values */ if (!((logentry.Event.Source == rid_eventlog) && (logentry.Event.EventType == SAHPI_ET_SENSOR) && (logentry.Event.Severity == SAHPI_CRITICAL) && (logentry.Event.EventDataUnion.SensorEvent.SensorType == SAHPI_VOLTAGE) && (logentry.Event.EventDataUnion.SensorEvent.Assertion == SAHPI_FALSE) && (logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_CRIT) && (!(logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_MAJOR)) && (!(logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_MINOR)) && (logentry.Event.EventDataUnion.SensorEvent.PreviousState == SAHPI_ES_UNSPECIFIED) && (logentry.Event.EventDataUnion.SensorEvent.CurrentState == SAHPI_ES_UNSPECIFIED) && (logentry.Event.EventDataUnion.SensorEvent.TriggerReading.Value.SensorFloat64 == (double)3.5) && (logentry.Event.EventDataUnion.SensorEvent.TriggerThreshold.Value.SensorFloat64 == (double)3.4))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); oh_print_event(&(logentry.Event), (rdr.RdrType != SAHPI_NO_RECORD) ? &rdr.Entity : NULL, 1); return -1; } err = saHpiEventLogClear(sessionid, rid_eventlog); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /******************************************************** * TestCase - MM Voltage Event (EN_PFA_HI_FAULT_3_35V) * Change current sensor reading to a LOWER CRITICAL value. * Previous state depends upon previous testcase. * Test some possible grammer changes in read/threshold values. ********************************************************/ logstr = "Severity:INFO Source:SERVPROC Name:WMN315702424 Date:10/11/03 Time:09:09:46 Text:System over recommended voltage on +3.3v. Reading: 3.5; Threshold: 3.4."; memset(&logentry, 0 , sizeof(SaHpiEventLogEntryT)); strcpy(hash_value->value.string, logstr); g_hash_table_insert(sim_hash, hash_key, hash_value); /* Change sensor's simulator value */ hash_set_value = (SnmpMibInfoT *)g_hash_table_lookup(sim_hash, SNMP_BC_MM_VOLT_3_3_OID); if (hash_set_value == NULL) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Null hash value\n"); return -1; } strcpy(hash_set_value->value.string, "2.9 Volts"); err = saHpiEventLogEntryGet(sessionid, rid_eventlog, SAHPI_NEWEST_ENTRY, &prev_logid, &next_logid, &logentry, &rdr, &rpt); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* Check expected values */ if (!((logentry.Event.Source == rid_eventlog) && (logentry.Event.EventType == SAHPI_ET_SENSOR) && (logentry.Event.Severity == SAHPI_CRITICAL) && (logentry.Event.EventDataUnion.SensorEvent.SensorType == SAHPI_VOLTAGE) && (logentry.Event.EventDataUnion.SensorEvent.Assertion == SAHPI_TRUE) && (logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_CRIT) && (!(logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_MAJOR)) && (!(logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_MINOR)) && (logentry.Event.EventDataUnion.SensorEvent.PreviousState == SAHPI_ES_UNSPECIFIED) && ((logentry.Event.EventDataUnion.SensorEvent.CurrentState & SAHPI_ES_LOWER_CRIT)) && (!(logentry.Event.EventDataUnion.SensorEvent.CurrentState & SAHPI_ES_LOWER_MAJOR)) && (!(logentry.Event.EventDataUnion.SensorEvent.CurrentState & SAHPI_ES_LOWER_MINOR)) && (logentry.Event.EventDataUnion.SensorEvent.TriggerReading.Value.SensorFloat64 == (double)3.5) && (logentry.Event.EventDataUnion.SensorEvent.TriggerThreshold.Value.SensorFloat64 == (double)3.4))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); oh_print_event(&(logentry.Event), (rdr.RdrType != SAHPI_NO_RECORD) ? &rdr.Entity : NULL, 1); return -1; } err = saHpiEventLogClear(sessionid, rid_eventlog); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* Set sensor's simulator value back to default */ hash_set_value = (SnmpMibInfoT *)g_hash_table_lookup(sim_hash, SNMP_BC_MM_VOLT_3_3_OID); if (hash_set_value == NULL) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Null hash value\n"); return -1; } strcpy(hash_set_value->value.string, "3.3 Volts"); /******************************************************** * TestCase - MM Voltage Event (EN_PFA_HI_FAULT_3_35V) * Change sensor reading to a UPPER CRITICAL value. * Previous state depends upon previous testcase. ********************************************************/ logstr = "Severity:INFO Source:SERVPROC Name:WMN315702424 Date:10/11/03 Time:09:09:46 Text:System over recommended voltage on +3.3v. Read value 3.5 Threshold value 3.4"; memset(&logentry, 0 , sizeof(SaHpiEventLogEntryT)); strcpy(hash_value->value.string, logstr); g_hash_table_insert(sim_hash, hash_key, hash_value); /* Change sensor's simulator value */ hash_set_value = (SnmpMibInfoT *)g_hash_table_lookup(sim_hash, SNMP_BC_MM_VOLT_3_3_OID); if (hash_set_value == NULL) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Null hash value\n"); return -1; } strcpy(hash_set_value->value.string, "3.5 Volts"); err = saHpiEventLogEntryGet(sessionid, rid_eventlog, SAHPI_NEWEST_ENTRY, &prev_logid, &next_logid, &logentry, &rdr, &rpt); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* Check expected values */ if (!((logentry.Event.Source == rid_eventlog) && (logentry.Event.EventType == SAHPI_ET_SENSOR) && (logentry.Event.Severity == SAHPI_CRITICAL) && (logentry.Event.EventDataUnion.SensorEvent.SensorType == SAHPI_VOLTAGE) && (logentry.Event.EventDataUnion.SensorEvent.Assertion == SAHPI_TRUE) && (logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_CRIT) && (!(logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_MAJOR)) && (!(logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_MINOR)) && ((logentry.Event.EventDataUnion.SensorEvent.PreviousState & SAHPI_ES_LOWER_CRIT)) && (!(logentry.Event.EventDataUnion.SensorEvent.PreviousState & SAHPI_ES_LOWER_MAJOR)) && (!(logentry.Event.EventDataUnion.SensorEvent.PreviousState & SAHPI_ES_LOWER_MINOR)) && ((logentry.Event.EventDataUnion.SensorEvent.CurrentState & SAHPI_ES_UPPER_CRIT)) && (!(logentry.Event.EventDataUnion.SensorEvent.CurrentState & SAHPI_ES_UPPER_MAJOR)) && (!(logentry.Event.EventDataUnion.SensorEvent.CurrentState & SAHPI_ES_UPPER_MINOR)) && (logentry.Event.EventDataUnion.SensorEvent.TriggerReading.Value.SensorFloat64 == (double)3.5) && (logentry.Event.EventDataUnion.SensorEvent.TriggerThreshold.Value.SensorFloat64 == (double)3.4))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); oh_print_event(&(logentry.Event), (rdr.RdrType != SAHPI_NO_RECORD) ? &rdr.Entity : NULL, 1); return -1; } err = saHpiEventLogClear(sessionid, rid_eventlog); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* Set sensor's simulator value back to default */ hash_set_value = (SnmpMibInfoT *)g_hash_table_lookup(sim_hash, SNMP_BC_MM_VOLT_3_3_OID); if (hash_set_value == NULL) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Null hash value\n"); return -1; } strcpy(hash_set_value->value.string, "3.3 Volts"); /********************************************************** * TestCase - Blade Duplicate Event (EN_PFA_HI_FAULT_3_35V) * Same as previous testcase only for the blade. **********************************************************/ logstr = "Severity:INFO Source:BLADE_11 Name:WMN315702424 Date:10/11/03 Time:09:09:46 Text:System over recommended voltage on +3.3v. Read value 3.5 Threshold value 3.4"; memset(&logentry, 0 , sizeof(SaHpiEventLogEntryT)); strcpy(hash_value->value.string, logstr); g_hash_table_insert(sim_hash, hash_key, hash_value); err = saHpiEventLogEntryGet(sessionid, rid_eventlog, SAHPI_NEWEST_ENTRY, &prev_logid, &next_logid, &logentry, &rdr, &rpt); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* Check expected values */ if (!((!(logentry.Event.Source == rid_eventlog)) && (logentry.Event.EventType == SAHPI_ET_SENSOR) && (logentry.Event.Severity == SAHPI_MAJOR) && (logentry.Event.EventDataUnion.SensorEvent.SensorType == SAHPI_VOLTAGE) && (logentry.Event.EventDataUnion.SensorEvent.Assertion == SAHPI_TRUE) && (!(logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_CRIT)) && (logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_MAJOR) && (!(logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_MINOR)) && (logentry.Event.EventDataUnion.SensorEvent.PreviousState == SAHPI_ES_UNSPECIFIED) && (logentry.Event.EventDataUnion.SensorEvent.CurrentState == SAHPI_ES_UNSPECIFIED) && (logentry.Event.EventDataUnion.SensorEvent.TriggerReading.Value.SensorFloat64 == (double)3.5) && (logentry.Event.EventDataUnion.SensorEvent.TriggerThreshold.Value.SensorFloat64 == (double)3.4))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); oh_print_event(&(logentry.Event), (rdr.RdrType != SAHPI_NO_RECORD) ? &rdr.Entity : NULL, 1); return -1; } err = saHpiEventLogClear(sessionid, rid_eventlog); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /************************************************************** * TestCase - Chassis Temperature (EN_PFA_HI_OVER_TEMP_AMBIENT) * Set at nominal temperature value. **************************************************************/ logstr = "Severity:INFO Source:SERVPROC Name:WMN315702424 Date:10/11/03 Time:09:09:46 Text:System over recommended ambient temperature."; memset(&logentry, 0 , sizeof(SaHpiEventLogEntryT)); strcpy(hash_value->value.string, logstr); g_hash_table_insert(sim_hash, hash_key, hash_value); /* Change sensor's simulator value */ hash_set_value = (SnmpMibInfoT *)g_hash_table_lookup(sim_hash, SNMP_BC_CHASSIS_TEMP_OID); if (hash_set_value == NULL) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Null hash value\n"); return -1; } strcpy(hash_set_value->value.string, "39 Centigrade"); err = saHpiEventLogEntryGet(sessionid, rid_eventlog, SAHPI_NEWEST_ENTRY, &prev_logid, &next_logid, &logentry, &rdr, &rpt); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* Check expected values */ if (!(!(logentry.Event.Source == rid_eventlog) && (logentry.Event.EventType == SAHPI_ET_SENSOR) && (logentry.Event.Severity == SAHPI_MAJOR) && (logentry.Event.EventDataUnion.SensorEvent.SensorType == SAHPI_TEMPERATURE) && (logentry.Event.EventDataUnion.SensorEvent.Assertion == SAHPI_TRUE) && (!(logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_CRIT)) && (logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_MAJOR) && (!(logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_MINOR)) && (logentry.Event.EventDataUnion.SensorEvent.PreviousState == SAHPI_ES_UNSPECIFIED) && (logentry.Event.EventDataUnion.SensorEvent.CurrentState == SAHPI_ES_UNSPECIFIED))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); oh_print_event(&(logentry.Event), (rdr.RdrType != SAHPI_NO_RECORD) ? &rdr.Entity : NULL, 1); return -1; } err = saHpiEventLogClear(sessionid, rid_eventlog); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /************************************************************** * TestCase - Chassis Temperature (EN_PFA_HI_OVER_TEMP_AMBIENT) * Set above warning level. **************************************************************/ logstr = "Severity:INFO Source:SERVPROC Name:WMN315702424 Date:10/11/03 Time:09:09:46 Text:System over recommended ambient temperature."; memset(&logentry, 0 , sizeof(SaHpiEventLogEntryT)); strcpy(hash_value->value.string, logstr); g_hash_table_insert(sim_hash, hash_key, hash_value); /* Change sensor's simulator value */ hash_set_value = (SnmpMibInfoT *)g_hash_table_lookup(sim_hash, SNMP_BC_CHASSIS_TEMP_OID); if (hash_set_value == NULL) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Null hash value\n"); return -1; } strcpy(hash_set_value->value.string, "61 Centigrade"); err = saHpiEventLogEntryGet(sessionid, rid_eventlog, SAHPI_NEWEST_ENTRY, &prev_logid, &next_logid, &logentry, &rdr, &rpt); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* Check expected values */ if (!(!(logentry.Event.Source == rid_eventlog) && (logentry.Event.EventType == SAHPI_ET_SENSOR) && (logentry.Event.Severity == SAHPI_MAJOR) && (logentry.Event.EventDataUnion.SensorEvent.SensorType == SAHPI_TEMPERATURE) && (logentry.Event.EventDataUnion.SensorEvent.Assertion == SAHPI_TRUE) && (!(logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_CRIT)) && (logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_MAJOR) && (!(logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_MINOR)) && (logentry.Event.EventDataUnion.SensorEvent.PreviousState == SAHPI_ES_UNSPECIFIED) && (!(logentry.Event.EventDataUnion.SensorEvent.CurrentState & SAHPI_ES_UPPER_CRIT)) && (logentry.Event.EventDataUnion.SensorEvent.CurrentState & SAHPI_ES_UPPER_MAJOR) && (!(logentry.Event.EventDataUnion.SensorEvent.CurrentState & SAHPI_ES_UPPER_MINOR)))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); oh_print_event(&(logentry.Event), (rdr.RdrType != SAHPI_NO_RECORD) ? &rdr.Entity : NULL, 1); return -1; } err = saHpiEventLogClear(sessionid, rid_eventlog); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /************************************************************* * TestCase - Non-mapped Event (Severity=INFO) *************************************************************/ logstr = "Severity:INFO Source:BLADE_01 Name:WMN315702424 Date:10/11/03 Time:09:09:46 Text:Bogus message not in string to event table"; memset(&logentry, 0 , sizeof(SaHpiEventLogEntryT)); strcpy(hash_value->value.string, logstr); g_hash_table_insert(sim_hash, hash_key, hash_value); err = saHpiEventLogEntryGet(sessionid, rid_eventlog, SAHPI_NEWEST_ENTRY, &prev_logid, &next_logid, &logentry, &rdr, &rpt); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* Check expected values */ if (!((!(logentry.Event.Source == rid_eventlog)) && (logentry.Event.EventType == SAHPI_ET_OEM) && (logentry.Event.Severity == SAHPI_INFORMATIONAL))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); oh_print_event(&(logentry.Event), (rdr.RdrType != SAHPI_NO_RECORD) ? &rdr.Entity : NULL, 1); return -1; } err = saHpiEventLogClear(sessionid, rid_eventlog); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /************************************************************* * TestCase - Expansion Card Event (EN_PFA_HI_OVER_TEMP_DASD1) *************************************************************/ logstr = "Severity:INFO Source:BLADE_03 Name:WMN315702424 Date:10/11/03 Time:09:09:46 Text:BEM Option over recommended temperature. Read value 87 Threshold value 75"; memset(&logentry, 0 , sizeof(SaHpiEventLogEntryT)); strcpy(hash_value->value.string, logstr); g_hash_table_insert(sim_hash, hash_key, hash_value); err = saHpiEventLogEntryGet(sessionid, rid_eventlog, SAHPI_NEWEST_ENTRY, &prev_logid, &next_logid, &logentry, &rdr, &rpt); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* Check expected values */ if (!((!(logentry.Event.Source == rid_eventlog)) && (logentry.Event.EventType == SAHPI_ET_SENSOR) && (logentry.Event.Severity == SAHPI_MAJOR) && (logentry.Event.EventDataUnion.SensorEvent.SensorType == SAHPI_TEMPERATURE) && (logentry.Event.EventDataUnion.SensorEvent.Assertion == SAHPI_TRUE) && (!(logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_CRIT)) && (logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_MAJOR) && (!(logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_MINOR)) && (logentry.Event.EventDataUnion.SensorEvent.PreviousState == SAHPI_ES_UNSPECIFIED) && (logentry.Event.EventDataUnion.SensorEvent.CurrentState & SAHPI_ES_UPPER_MAJOR))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); oh_print_event(&(logentry.Event), (rdr.RdrType != SAHPI_NO_RECORD) ? &rdr.Entity : NULL, 1); return -1; } err = saHpiEventLogClear(sessionid, rid_eventlog); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /************************************************************* * TestCase - Non-mapped Login Event (Severity=WARN) *************************************************************/ logstr = "Severity:WARN Source:SWITCH_4 Name:WMN315702424 Date:10/11/03 Time:09:09:46 Text:Bogus login message Login ID:\'\'myid\' @ someaddress\'"; memset(&logentry, 0 , sizeof(SaHpiEventLogEntryT)); strcpy(hash_value->value.string, logstr); g_hash_table_insert(sim_hash, hash_key, hash_value); err = saHpiEventLogEntryGet(sessionid, rid_eventlog, SAHPI_NEWEST_ENTRY, &prev_logid, &next_logid, &logentry, &rdr, &rpt); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* Check expected values */ if (!((!(logentry.Event.Source == rid_eventlog)) && (logentry.Event.EventType == SAHPI_ET_OEM) && (logentry.Event.Severity == SAHPI_MINOR))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); oh_print_event(&(logentry.Event), (rdr.RdrType != SAHPI_NO_RECORD) ? &rdr.Entity : NULL, 1); return -1; } err = saHpiEventLogClear(sessionid, rid_eventlog); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /*********************************************************** * TestCase - Power over temperature (EN_FAULT_PSx_OVR_TEMP) * This is a non-readable sensor. Recover in next testcase. ***********************************************************/ logstr = "Severity:INFO Source:SERVPROC Name:WMN315702424 Date:10/11/03 Time:09:09:46 Text:Power Supply 1 Temperature Fault"; memset(&logentry, 0 , sizeof(SaHpiEventLogEntryT)); strcpy(hash_value->value.string, logstr); g_hash_table_insert(sim_hash, hash_key, hash_value); err = saHpiEventLogEntryGet(sessionid, rid_eventlog, SAHPI_NEWEST_ENTRY, &prev_logid, &next_logid, &logentry, &rdr, &rpt); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* Check expected values */ if (!((!(logentry.Event.Source == rid_eventlog)) && (logentry.Event.EventType == SAHPI_ET_SENSOR) && (logentry.Event.Severity == SAHPI_CRITICAL) && (logentry.Event.EventDataUnion.SensorEvent.SensorType == SAHPI_TEMPERATURE) && (logentry.Event.EventDataUnion.SensorEvent.Assertion == SAHPI_TRUE) && (logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_CRIT) && (logentry.Event.EventDataUnion.SensorEvent.PreviousState == SAHPI_ES_UNSPECIFIED) && ((logentry.Event.EventDataUnion.SensorEvent.CurrentState & SAHPI_ES_UPPER_CRIT)) && (!(logentry.Event.EventDataUnion.SensorEvent.CurrentState & SAHPI_ES_UPPER_MAJOR)) && (!(logentry.Event.EventDataUnion.SensorEvent.CurrentState & SAHPI_ES_UPPER_MINOR)))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); oh_print_event(&(logentry.Event), (rdr.RdrType != SAHPI_NO_RECORD) ? &rdr.Entity : NULL, 1); return -1; } err = saHpiEventLogClear(sessionid, rid_eventlog); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /*********************************************************** * TestCase - Power over temperature (EN_FAULT_PSx_OVR_TEMP) * This is a non-readable sensor. Recover previous testcase. ***********************************************************/ logstr = "Severity:INFO Source:SERVPROC Name:WMN315702424 Date:10/11/03 Time:09:09:46 Text:Recovery Power Supply 1 Temperature Fault"; memset(&logentry, 0 , sizeof(SaHpiEventLogEntryT)); strcpy(hash_value->value.string, logstr); g_hash_table_insert(sim_hash, hash_key, hash_value); err = saHpiEventLogEntryGet(sessionid, rid_eventlog, SAHPI_NEWEST_ENTRY, &prev_logid, &next_logid, &logentry, &rdr, &rpt); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* Check expected values */ if (!((!(logentry.Event.Source == rid_eventlog)) && (logentry.Event.EventType == SAHPI_ET_SENSOR) && (logentry.Event.Severity == SAHPI_CRITICAL) && (logentry.Event.EventDataUnion.SensorEvent.SensorType == SAHPI_TEMPERATURE) && (logentry.Event.EventDataUnion.SensorEvent.Assertion == SAHPI_FALSE) && (logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_CRIT) && (!(logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_MAJOR)) && (!(logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_MINOR)) && ((logentry.Event.EventDataUnion.SensorEvent.PreviousState & SAHPI_ES_UPPER_CRIT)) && (!(logentry.Event.EventDataUnion.SensorEvent.PreviousState & SAHPI_ES_UPPER_MAJOR)) && (!(logentry.Event.EventDataUnion.SensorEvent.PreviousState & SAHPI_ES_UPPER_MINOR)) && (!(logentry.Event.EventDataUnion.SensorEvent.CurrentState & SAHPI_ES_UPPER_CRIT)) && ((logentry.Event.EventDataUnion.SensorEvent.CurrentState & SAHPI_ES_UPPER_MAJOR)) && (!(logentry.Event.EventDataUnion.SensorEvent.CurrentState & SAHPI_ES_UPPER_MINOR)))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); oh_print_event(&(logentry.Event), (rdr.RdrType != SAHPI_NO_RECORD) ? &rdr.Entity : NULL, 1); return -1; } err = saHpiEventLogClear(sessionid, rid_eventlog); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /************************************************************* * TestCase - Hotswap switch installed (EN_SWITCH_3_INSTALLED) *************************************************************/ logstr = "Severity:INFO Source:SWITCH_3 Name:WMN315702424 Date:10/11/03 Time:09:09:46 Text:I/O module 3 was installed."; memset(&logentry, 0 , sizeof(SaHpiEventLogEntryT)); strcpy(hash_value->value.string, logstr); g_hash_table_insert(sim_hash, hash_key, hash_value); err = saHpiEventLogEntryGet(sessionid, rid_eventlog, SAHPI_NEWEST_ENTRY, &prev_logid, &next_logid, &logentry, &rdr, &rpt); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* Check expected values */ if (!((!(logentry.Event.Source == rid_eventlog)) && (logentry.Event.EventType == SAHPI_ET_HOTSWAP) && (logentry.Event.Severity == SAHPI_INFORMATIONAL) && (logentry.Event.EventDataUnion.HotSwapEvent.HotSwapState == SAHPI_HS_STATE_INACTIVE) && (logentry.Event.EventDataUnion.HotSwapEvent.PreviousHotSwapState == SAHPI_HS_STATE_ACTIVE))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); oh_print_event(&(logentry.Event), (rdr.RdrType != SAHPI_NO_RECORD) ? &rdr.Entity : NULL, 1); return -1; } err = saHpiEventLogClear(sessionid, rid_eventlog); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /**************************************************************** * TestCase - hotswap Media Tray removal (EN_MEDIA_TRAY_REMOVED) * This event is recovered in the next testcase. Should be * MAJOR severity, since this is an unexpected failure. ****************************************************************/ logstr = "Severity:INFO Source:SERVPROC Name:WMN315702424 Date:10/11/03 Time:09:09:46 Text:The media tray was removed."; memset(&logentry, 0 , sizeof(SaHpiEventLogEntryT)); strcpy(hash_value->value.string, logstr); g_hash_table_insert(sim_hash, hash_key, hash_value); err = saHpiEventLogEntryGet(sessionid, rid_eventlog, SAHPI_NEWEST_ENTRY, &prev_logid, &next_logid, &logentry, &rdr, &rpt); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* Check expected values */ if (!((!(logentry.Event.Source == rid_eventlog)) && (logentry.Event.EventType == SAHPI_ET_HOTSWAP) && (logentry.Event.Severity == SAHPI_MAJOR) && (logentry.Event.EventDataUnion.HotSwapEvent.HotSwapState == SAHPI_HS_STATE_NOT_PRESENT) && (logentry.Event.EventDataUnion.HotSwapEvent.PreviousHotSwapState == SAHPI_HS_STATE_ACTIVE))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); oh_print_event(&(logentry.Event), (rdr.RdrType != SAHPI_NO_RECORD) ? &rdr.Entity : NULL, 1); return -1; } err = saHpiEventLogClear(sessionid, rid_eventlog); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /**************************************************************** * TestCase - hotswap Media Tray recovery (EN_MEDIA_TRAY_REMOVED) * Recovery of previous event. ****************************************************************/ logstr = "Severity:INFO Source:SERVPROC Name:WMN315702424 Date:10/11/03 Time:09:09:46 Text:Recovery The media tray was removed."; memset(&logentry, 0 , sizeof(SaHpiEventLogEntryT)); strcpy(hash_value->value.string, logstr); g_hash_table_insert(sim_hash, hash_key, hash_value); err = saHpiEventLogEntryGet(sessionid, rid_eventlog, SAHPI_NEWEST_ENTRY, &prev_logid, &next_logid, &logentry, &rdr, &rpt); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* Check expected values */ if (!((!(logentry.Event.Source == rid_eventlog)) && (logentry.Event.EventType == SAHPI_ET_HOTSWAP) && (logentry.Event.Severity == SAHPI_INFORMATIONAL) && (logentry.Event.EventDataUnion.HotSwapEvent.HotSwapState == SAHPI_HS_STATE_ACTIVE) && (logentry.Event.EventDataUnion.HotSwapEvent.PreviousHotSwapState == SAHPI_HS_STATE_NOT_PRESENT))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); oh_print_event(&(logentry.Event), (rdr.RdrType != SAHPI_NO_RECORD) ? &rdr.Entity : NULL, 1); return -1; } err = saHpiEventLogClear(sessionid, rid_eventlog); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } goto COMMON_TESTS; RSA_TESTS: /* If test OID not already in sim hash table; create it */ if (!g_hash_table_lookup_extended(sim_hash, SNMP_BC_ERROR_LOG_MSG_OID_RSA, (gpointer)&hash_key, (gpointer)&hash_value)) { hash_key = g_strdup(SNMP_BC_ERROR_LOG_MSG_OID_RSA); if (!hash_key) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Cannot allocate memory for OID key=%s.\n", SNMP_BC_ERROR_LOG_MSG_OID_RSA); return -1; } hash_value = g_malloc0(sizeof(SnmpMibInfoT)); if (!hash_value) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Cannot allocate memory for hash value for OID=%s.\n", SNMP_BC_ERROR_LOG_MSG_OID_RSA); return -1; } } err = saHpiEventLogClear(sessionid, rid_eventlog); if (err) { printf("Error! saHpiEventLogClear: line=%d; err=%d\n", __LINE__, err); return -1; } /************************************************************ * TestCase - Mapped Chassis Event (EN_CUTOFF_HI_FAULT_3_35V) ************************************************************/ logstr = "Severity:INFO Source:SERVPROC Name:WMN08032480 Date:10/11/03 Time:09:09:46 Text:System shutoff due to +3.3v over voltage."; memset(&logentry, 0 , sizeof(SaHpiEventLogEntryT)); strcpy(hash_value->value.string, logstr); g_hash_table_insert(sim_hash, hash_key, hash_value); err = saHpiEventLogEntryGet(sessionid, rid_eventlog, SAHPI_NEWEST_ENTRY, &prev_logid, &next_logid, &logentry, &rdr, &rpt); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* Check expected values */ if (!((logentry.Event.Source == rid_eventlog) && (logentry.Event.EventType == SAHPI_ET_SENSOR) && (logentry.Event.Severity == SAHPI_CRITICAL) && (logentry.Event.EventDataUnion.SensorEvent.SensorType == SAHPI_VOLTAGE) && (logentry.Event.EventDataUnion.SensorEvent.Assertion == SAHPI_TRUE) && (logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_CRIT) && (!(logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_MAJOR)) && (!(logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_MINOR) && (logentry.Event.EventDataUnion.SensorEvent.PreviousState == SAHPI_ES_UNSPECIFIED)) && (logentry.Event.EventDataUnion.SensorEvent.CurrentState == SAHPI_ES_UNSPECIFIED) && (logentry.Event.EventDataUnion.SensorEvent.TriggerReading.Value.SensorFloat64 == (double)0) && (logentry.Event.EventDataUnion.SensorEvent.TriggerThreshold.Value.SensorFloat64 == (double)0) )) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); oh_print_event(&(logentry.Event), (rdr.RdrType != SAHPI_NO_RECORD) ? &rdr.Entity : NULL, 1); return -1; } err = saHpiEventLogClear(sessionid, rid_eventlog); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } COMMON_TESTS: /************************************ * Drive some error paths in the code ************************************/ /****************************************************************** * TestCase - Bogus threshold strings ******************************************************************/ logstr = "Severity:INFO Source:SERVPROC Name:WMN315702424 Date:10/11/03 Time:09:09:46 Text:System shutoff due to +3.3v over voltage. Bogus Read value 3.5 Bogus Threshold value 3.4"; memset(&logentry, 0 , sizeof(SaHpiEventLogEntryT)); strcpy(hash_value->value.string, logstr); g_hash_table_insert(sim_hash, hash_key, hash_value); err = saHpiEventLogEntryGet(sessionid, rid_eventlog, SAHPI_NEWEST_ENTRY, &prev_logid, &next_logid, &logentry, &rdr, &rpt); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* Check expected values */ if (!((!(logentry.Event.Source == rid_eventlog)) && (logentry.Event.EventType == SAHPI_ET_OEM) && (logentry.Event.Severity == SAHPI_INFORMATIONAL))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); oh_print_event(&(logentry.Event), (rdr.RdrType != SAHPI_NO_RECORD) ? &rdr.Entity : NULL, 1); return -1; } err = saHpiEventLogClear(sessionid, rid_eventlog); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /****************************************************************** * TestCase - Recovery string not first character of text string * (blank is first character). Should not treat as a recovery event ******************************************************************/ logstr = "Severity:INFO Source:SERVPROC Name:WMN315702424 Date:10/11/03 Time:09:09:46 Text: Recovery System shutoff due to +3.3v over voltage. Read value 3.5 Threshold value 3.4"; memset(&logentry, 0 , sizeof(SaHpiEventLogEntryT)); strcpy(hash_value->value.string, logstr); g_hash_table_insert(sim_hash, hash_key, hash_value); err = saHpiEventLogEntryGet(sessionid, rid_eventlog, SAHPI_NEWEST_ENTRY, &prev_logid, &next_logid, &logentry, &rdr, &rpt); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* Check expected values */ if (!((!(logentry.Event.Source == rid_eventlog)) && (logentry.Event.EventType == SAHPI_ET_OEM) && (logentry.Event.Severity == SAHPI_INFORMATIONAL))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); oh_print_event(&(logentry.Event), (rdr.RdrType != SAHPI_NO_RECORD) ? &rdr.Entity : NULL, 1); return -1; } err = saHpiEventLogClear(sessionid, rid_eventlog); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /****************************************************************** * TestCase - In string table but not mapped * Uses special defined Test event in bc_str2event.c ******************************************************************/ logstr = "Severity:INFO Source:SERVPROC Name:WMN315702424 Date:10/11/03 Time:09:09:46 Text:Bogus Test Event."; memset(&logentry, 0 , sizeof(SaHpiEventLogEntryT)); strcpy(hash_value->value.string, logstr); g_hash_table_insert(sim_hash, hash_key, hash_value); err = saHpiEventLogEntryGet(sessionid, rid_eventlog, SAHPI_NEWEST_ENTRY, &prev_logid, &next_logid, &logentry, &rdr, &rpt); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* Check expected values */ if (!((!(logentry.Event.Source == rid_eventlog)) && (logentry.Event.EventType == SAHPI_ET_OEM) && (logentry.Event.Severity == SAHPI_INFORMATIONAL))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); oh_print_event(&(logentry.Event), (rdr.RdrType != SAHPI_NO_RECORD) ? &rdr.Entity : NULL, 1); return -1; } err = saHpiEventLogClear(sessionid, rid_eventlog); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /****************** * End of testcases ******************/ err = saHpiSessionClose(sessionid); if (err) { printf("Error! saHpiSessionClose: err=%d\n", err); return -1; } return 0; } openhpi-3.6.1/plugins/snmp_bc/t/tsensorget035.c0000644000175100017510000000221312575647274020332 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiResourceIdT id =0; SaHpiSensorNumT sid = 0; SaHpiEventStateT assertMask; SaHpiEventStateT deassertMask; /************************** * Test Invalid handler **************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = snmp_bc_get_sensor_event_masks(NULL, id, sid, &assertMask, &deassertMask); checkstatus(err, expected_err, testfail); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/tdiscover001.c0000644000175100017510000000211412575647274020130 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; /************************** * Test : Invalid handle **************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = snmp_bc_discover_resources(NULL); checkstatus(err, expected_err, testfail); /************************** * Cleanup after all tests ***************************/ return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/tcontrol001.c0000644000175100017510000000764412575647274020007 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiResourceIdT id; SaHpiSessionIdT sessionid; SaHpiRdrT rdr; SaHpiCtrlNumT cid = 1; SaHpiCtrlModeT mode; SaHpiCtrlStateT state; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundControl; struct oh_handler_state l_handle; /* ************************************* * Find a resource with Control type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid, SAHPI_CAPABILITY_CONTROL, SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Can not find a control resource for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: find a control RDR **************************/ entryid = SAHPI_FIRST_ENTRY; foundControl = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if (rdr.RdrType == SAHPI_CTRL_RDR) { foundControl = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundControl) { err("Did not find desired resource for test\n"); return(SA_OK); } else { cid = rdr.RdrTypeUnion.CtrlRec.Num; } /************************** * Test 1: Invalid Handle *************************/ memset(&l_handle, 0, sizeof(struct oh_handler_state)); expected_err = SA_ERR_HPI_INVALID_PARAMS; err = snmp_bc_get_control_state(NULL, id, cid, &mode, &state); checkstatus(err, expected_err, testfail); /************************** * Test 2: Resource ID with no RPT *************************/ expected_err = SA_ERR_HPI_INVALID_RESOURCE; err = saHpiControlGet(sessionid, 5000, cid, &mode, &state); checkstatus(err, expected_err, testfail); /************************** * Test 3: Control ID with no RDR *************************/ expected_err = SA_ERR_HPI_NOT_PRESENT; err = saHpiControlGet(sessionid, id, 5000, &mode, &state); checkstatus(err, expected_err, testfail); /************************** * Test 4: NULL mode and state *************************/ expected_err = SA_OK; err = saHpiControlGet(sessionid, id, cid, NULL, NULL); checkstatus(err, expected_err, testfail); /************************** * Test: resource without SAHPI_CAPABILITY_CONTROL *************************/ err = tfind_resource(&sessionid, SAHPI_CAPABILITY_CONTROL, SAHPI_FIRST_ENTRY, &rptentry, SAHPI_FALSE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } expected_err = SA_ERR_HPI_CAPABILITY; err = saHpiControlGet(sessionid, rptentry.ResourceId, cid, &mode, &state); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/tel001.c0000644000175100017510000000261112575647274016714 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiResourceIdT id = 0; SaHpiEventLogInfoT info; struct oh_handler_state l_handle; memset(&l_handle, 0, sizeof(struct oh_handler_state)); /************************** * Test: Invalid handle **************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = snmp_bc_get_sel_info(NULL, id, &info); checkstatus(err, expected_err, testfail); /************************** * Test: Invalid info space * expected_err = SA_ERR_HPI_INVALID_PARAMS; **************************/ err = snmp_bc_get_sel_info(&l_handle, id, NULL); checkstatus(err, expected_err, testfail); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/tsetup.h0000644000175100017510000000433712575647274017247 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #ifndef TSETUP_H #define TSETUP_H SaErrorT tsetup (SaHpiSessionIdT *sessionid_ptr); SaErrorT tfind_resource(SaHpiSessionIdT *sessionid_ptr, SaHpiCapabilitiesT search_rdr_type, SaHpiEntryIdT i_rptentryid, SaHpiRptEntryT *rptentry, SaHpiBoolT samecap); SaErrorT tfind_resource_by_ep(SaHpiSessionIdT *sessionid_ptr, SaHpiEntityPathT *ep, SaHpiEntryIdT i_rptentryid, SaHpiRptEntryT *rptentry); SaErrorT tfind_rdr_by_name(SaHpiSessionIdT *sessionid_ptr, SaHpiResourceIdT rid, char *rdr_name, SaHpiRdrT *rdr); SaErrorT tcleanup(SaHpiSessionIdT *sessionid_ptr); #define checkstatus(err, expected_err, testfail) \ do { \ if (err != expected_err) { \ printf("Error! Test fails: File=%s, Line=%d\n", __FILE__, __LINE__); \ printf("Returned err=%s, expected=%s\n", \ oh_lookup_error(err), oh_lookup_error(expected_err)); \ testfail = -1; \ } \ } while(0) #define DECLARE_HANDLE() \ do { \ SaHpiSessionIdT sessionid; \ SaHpiDomainIdT did; \ struct oh_handler *h = NULL; \ struct oh_domain *d = NULL; \ unsigned int *hid = NULL; \ struct oh_handler_state *handle; \ } while(0) #define INIT_HANDLE(did, d, hid, h, handle) \ do { \ did = oh_get_session_domain(sessionid); \ d = oh_get_domain(did); \ hid = oh_get_resource_data(&(d->rpt), id); \ h = oh_get_handler(*hid); \ handle = (struct oh_handler_state *) h->hnd; \ } while(0) #endif openhpi-3.6.1/plugins/snmp_bc/t/tsensorset005.c0000644000175100017510000000464112575647274020352 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiSessionIdT sessionid; SaHpiResourceIdT id = 0; SaHpiSensorNumT sid = 0; SaHpiBoolT enable = SAHPI_FALSE; /* ************************************* * Find a resource with Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid,SAHPI_CAPABILITY_SENSOR,SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * TestInvalid handler **************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = snmp_bc_set_sensor_event_enable(NULL, id, sid, enable); checkstatus(err, expected_err, testfail); /************************** * Test Invalid resource id **************************/ expected_err = SA_ERR_HPI_INVALID_RESOURCE; err = saHpiSensorEventEnableSet(sessionid, 5000, sid, enable); checkstatus(err, expected_err, testfail); /************************** * Test Invalid sensor id **************************/ expected_err = SA_ERR_HPI_NOT_PRESENT; err = saHpiSensorEventEnableSet(sessionid, id, 5000, enable); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/tsensorset020.c0000644000175100017510000000365412575647274020352 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiResourceIdT id = 0; SaHpiSessionIdT sessionid; SaHpiSensorNumT sid = 0; SaHpiSensorThresholdsT thres; /* *************************************** * Find a resource with No Sensor type rdr * ***************************************/ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid,SAHPI_CAPABILITY_SENSOR,SAHPI_FIRST_ENTRY, &rptentry, SAHPI_FALSE); if (err != SA_OK) { dbg("Error! Can not find resources for test environment\n"); dbg(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /*************************** * Test : Invalid capability **************************/ expected_err = SA_ERR_HPI_CAPABILITY; err = saHpiSensorThresholdsSet(sessionid, id, sid, &thres); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/tsensorget034.c0000644000175100017510000000556712575647274020350 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiResourceIdT id; SaHpiSessionIdT sessionid; SaHpiSensorNumT sid = 0; SaHpiBoolT enable; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundSensor; /* ************************************* * Find a resource with Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid,SAHPI_CAPABILITY_SENSOR,SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: find a sensor with desired property **************************/ entryid = SAHPI_FIRST_ENTRY; foundSensor = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if ((rdr.RdrType == SAHPI_SENSOR_RDR) && (rdr.RdrTypeUnion.SensorRec.DataFormat.IsSupported == SAHPI_FALSE)) { foundSensor = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundSensor) { err("Did not find desired resource for test\n"); return(SA_OK); } else { sid = rdr.RdrTypeUnion.SensorRec.Num; } /************************** * Test:Invalid SensorId **************************/ expected_err = SA_ERR_HPI_NOT_PRESENT; err = saHpiSensorEventEnableGet(sessionid, id, 5000, &enable); checkstatus(err, expected_err, testfail); /************************** * Test: Normal Path **************************/ expected_err = SA_OK; err = saHpiSensorEventEnableGet(sessionid, id, sid, &enable); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/treset001.c0000644000175100017510000000747312575647274017451 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan * Steve Sherman */ #include #include #include int main(int argc, char **argv) { int testfail = 0; SaErrorT err, expected_err; SaHpiResetActionT act = 0; SaHpiResourceIdT id = 0; SaHpiRptEntryT rptentry; SaHpiSessionIdT sessionid; /*************************************** * Find a resource with Reset capability ***************************************/ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Cannot open session\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid, SAHPI_CAPABILITY_RESET, SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Cannot find a Reset capable resource\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; #if 0 printf("Found resource = %s\n", rptentry.ResourceTag.Data); #endif /*********************** * Test: Invalid session ***********************/ expected_err = SA_ERR_HPI_INVALID_SESSION; err = saHpiResourceResetStateGet(-1, id, &act); checkstatus(err, expected_err, testfail); err = saHpiResourceResetStateSet(-1, id, act); checkstatus(err, expected_err, testfail); /************************ * Test: Invalid resource ************************/ expected_err = SA_ERR_HPI_INVALID_RESOURCE; err = saHpiResourceResetStateGet(sessionid, -1, &act); checkstatus(err, expected_err, testfail); err = saHpiResourceResetStateSet(sessionid, -1, act); checkstatus(err, expected_err, testfail); /************************** * Test: Invalid parameters **************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = saHpiResourceResetStateGet(sessionid, id, NULL); checkstatus(err, expected_err, testfail); err = saHpiResourceResetStateSet(sessionid, id, -1); checkstatus(err, expected_err, testfail); /*********************** * Test: Invalid command ***********************/ expected_err = SA_ERR_HPI_INVALID_CMD; err = saHpiResourceResetStateSet(sessionid, id, SAHPI_RESET_ASSERT); checkstatus(err, expected_err, testfail); err = saHpiResourceResetStateSet(sessionid, id, SAHPI_RESET_DEASSERT); checkstatus(err, expected_err, testfail); /************************* * Test: Normal operations *************************/ expected_err = SA_OK; act = SAHPI_COLD_RESET; err = saHpiResourceResetStateSet(sessionid, id, act); checkstatus(err, expected_err, testfail); err = saHpiResourceResetStateGet(sessionid, id, &act); checkstatus(err, expected_err, testfail); if (act != SAHPI_RESET_DEASSERT) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Current state = %s\n", oh_lookup_resetaction(act)); return -1; } act = SAHPI_WARM_RESET; err = saHpiResourceResetStateSet(sessionid, id, act); checkstatus(err, expected_err, testfail); err = saHpiResourceResetStateGet(sessionid, id, &act); checkstatus(err, expected_err, testfail); if (act != SAHPI_RESET_DEASSERT) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Current state = %s\n", oh_lookup_resetaction(act)); return -1; } /************************* * Cleanup after all tests *************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/tsensorset013.c0000644000175100017510000000562712575647274020356 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiResourceIdT id; SaHpiSessionIdT sessionid; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundSensor; SaHpiSensorNumT sid = 0; SaHpiSensorEventMaskActionT act = SAHPI_SENS_ADD_EVENTS_TO_MASKS; SaHpiEventStateT assertMask = SAHPI_ES_UPPER_MINOR; SaHpiEventStateT deassertMask = SAHPI_ES_UPPER_CRIT; /* ************************************* * Find a resource with Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid,SAHPI_CAPABILITY_SENSOR,SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: find a sensor with desired property **************************/ entryid = SAHPI_FIRST_ENTRY; foundSensor = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if ((rdr.RdrType == SAHPI_SENSOR_RDR) && (rdr.RdrTypeUnion.SensorRec.EventCtrl == SAHPI_SEC_PER_EVENT)) { foundSensor = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundSensor) { err("Did not find desired resource for test\n"); return(SA_OK); } else { sid = rdr.RdrTypeUnion.SensorRec.Num; } /************************** * Test: Request with invlaid data **************************/ assertMask = ~(rdr.RdrTypeUnion.SensorRec.Events); expected_err = SA_ERR_HPI_INVALID_DATA; err = saHpiSensorEventMasksSet(sessionid, id, sid, act, assertMask, deassertMask); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/tinv006.c0000644000175100017510000000553412575647274017124 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiResourceIdT id = 0; SaHpiSessionIdT sessionid; SaHpiIdrIdT idrId = 0; SaHpiIdrInfoT info; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundControl; /* ************************************* * Find a resource with inventory capability * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid, SAHPI_CAPABILITY_INVENTORY_DATA, SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Can not find an Inventory resource for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: find an Inventory RDR **************************/ entryid = SAHPI_FIRST_ENTRY; foundControl = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if (rdr.RdrType == SAHPI_INVENTORY_RDR) { foundControl = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundControl) { err("Did not find desired resource for test\n"); return(SA_OK); } else { idrId = rdr.RdrTypeUnion.InventoryRec.IdrId; } /************************** * Test : Invalid handle **************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = snmp_bc_get_idr_info(NULL , id, idrId, &info); checkstatus(err, expected_err, testfail); /************************** * Test : Invalid info pointer * expected_err = SA_ERR_HPI_INVALID_PARAMS; **************************/ err = saHpiIdrInfoGet(sessionid, id, idrId, NULL); checkstatus(err, expected_err, testfail); /**************************&* * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/tsensorset015.c0000644000175100017510000000640012575647274020346 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiResourceIdT id; SaHpiSessionIdT sessionid; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundSensor; SaHpiSensorNumT sid = 0; SaHpiSensorEventMaskActionT act = SAHPI_SENS_ADD_EVENTS_TO_MASKS; SaHpiEventStateT assertMask = SAHPI_ES_UPPER_MINOR; SaHpiEventStateT deassertMask = SAHPI_ES_UPPER_CRIT; /* ************************************* * Find a resource with Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid,SAHPI_CAPABILITY_SENSOR,SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: find a sensor with desired property **************************/ entryid = SAHPI_FIRST_ENTRY; foundSensor = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if ((rdr.RdrType == SAHPI_SENSOR_RDR) && (rdr.RdrTypeUnion.SensorRec.EventCtrl == SAHPI_SEC_PER_EVENT)) { foundSensor = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundSensor) { err("Did not find desired resource for test\n"); return(SA_OK); } else { sid = rdr.RdrTypeUnion.SensorRec.Num; } /************************** * Test : Normal path **************************/ act = SAHPI_SENS_ADD_EVENTS_TO_MASKS; deassertMask = ~(rdr.RdrTypeUnion.SensorRec.Events); assertMask = SAHPI_ALL_EVENT_STATES; expected_err = SA_OK; err = saHpiSensorEventMasksSet(sessionid, id, sid, act, assertMask, deassertMask); checkstatus(err, expected_err, testfail); /************************** * Test: Normal path **************************/ assertMask = rdr.RdrTypeUnion.SensorRec.Events; expected_err = SA_OK; err = saHpiSensorEventMasksSet(sessionid, id, sid, act, assertMask, deassertMask); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/tel004.c0000644000175100017510000000347212575647274016725 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiResourceIdT id = 0; SaHpiSessionIdT sessionid; /* ************************************* * Find a resource with EventLog type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid, SAHPI_CAPABILITY_EVENT_LOG, SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Can not find a control resource for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: valid case **************************/ expected_err = SA_OK; err = saHpiEventLogClear(sessionid, id); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/tsim_file.c0000644000175100017510000000332012575647274017660 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia */ /********************************************************************** * Notes: * * Test depends on companion input file called sim_test_file, any change * in that file needs to be reflected in this test. **********************************************************************/ #include #include #include int main(int argc, char **argv) { SaErrorT err; SaHpiSessionIdT sessionid; err = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sessionid, NULL); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } // regular sim_init is part of saHpiSessionOpen, here we close it sim_close(); // env variable OPENHPI_SIMTEST_FILE is now defined in Makefile.am // setenv("OPENHPI_SIMTEST_FILE","./sim_test_file", 1); // create hash table based on input file err = sim_file(); if (err != SA_OK) { printf(" Error! sim_file failed\n"); return -1; } /****************** * End of testcases ******************/ err = saHpiSessionClose(sessionid); if (err) { printf("Error! saHpiSessionClose: err=%d\n", err); return -1; } return 0; } openhpi-3.6.1/plugins/snmp_bc/t/tel006.c0000644000175100017510000000513112575647274016721 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiEventLogEntryIdT current = 0; SaHpiEventLogEntryIdT previd; SaHpiEventLogEntryIdT nextid; SaHpiEventLogEntryT entry; SaHpiRdrT rdr; SaHpiRptEntryT rptentry; SaHpiResourceIdT id; // DECLARE_HANDLE(); SaHpiSessionIdT sessionid; SaHpiDomainIdT did; struct oh_handler *h = NULL; struct oh_domain *d = NULL; unsigned int *hid = NULL; struct oh_handler_state *handle; /* ************************************* * Find a resource with EventLog type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid, SAHPI_CAPABILITY_EVENT_LOG, SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Can not find a control resource for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; INIT_HANDLE(did, d, hid, h, handle); #if 0 did = oh_get_session_domain(sessionid); d = oh_get_domain(did); hid = oh_get_resource_data(&(d->rpt), id); h = oh_get_handler(*hid); handle = (struct oh_handler_state *) h->hnd; #endif /************************** * Test: NULL EventLog cache **************************/ handle->elcache = NULL; expected_err = SA_ERR_HPI_INTERNAL_ERROR; err = snmp_bc_get_sel_entry(handle, id, current, &previd, &nextid, &entry, &rdr, &rptentry); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/tsensorset022.c0000644000175100017510000000541612575647274020352 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiResourceIdT id = 0; SaHpiSessionIdT sessionid; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiSensorNumT sid = 0; SaHpiSensorThresholdsT thres; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundSensor; /* ************************************* * Find a resource with Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid,SAHPI_CAPABILITY_SENSOR,SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: find a sensor with desired property **************************/ entryid = SAHPI_FIRST_ENTRY; foundSensor = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if ((rdr.RdrType == SAHPI_SENSOR_RDR) && (rdr.RdrTypeUnion.SensorRec.Category == SAHPI_EC_THRESHOLD) && (rdr.RdrTypeUnion.SensorRec.ThresholdDefn.IsAccessible == SAHPI_FALSE)) { foundSensor = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundSensor) { err("Did not find desired resource for test\n"); return(SA_OK); } else { sid = rdr.RdrTypeUnion.SensorRec.Num; } /************************** * Test: Set threshold to a non-accessible sensor **************************/ expected_err = SA_ERR_HPI_INVALID_CMD; err = saHpiSensorThresholdsSet(sessionid, id, sid, &thres); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/sim_test_file0000644000175100017510000131705512575647274020330 0ustar mohanmohan.1.3.6.1.2.1.1.2.0 = OID: .1.3.6.1.4.1.2.6.158.3 .1.3.6.1.2.1.1.3.0 = Timeticks: (52347100) 6 days, 1:24:31.00 .1.3.6.1.2.1.1.4.0 = STRING: MrBladeCenter .1.3.6.1.2.1.1.5.0 = STRING: BladeCenter Management Module .1.3.6.1.2.1.1.6.0 = STRING: USA .1.3.6.1.2.1.1.7.0 = INTEGER: 31 .1.3.6.1.4.1.2.3.51.2.2.1.1.2.0 = STRING: "26.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.2.1.5.1.0 = STRING: "23.50 Centigrade" .1.3.6.1.4.1.2.3.51.2.2.2.1.1.0 = STRING: "+5.13 Volts" .1.3.6.1.4.1.2.3.51.2.2.2.1.2.0 = STRING: "+3.31 Volts" .1.3.6.1.4.1.2.3.51.2.2.2.1.3.0 = STRING: "+11.81 Volts" .1.3.6.1.4.1.2.3.51.2.2.2.1.5.0 = STRING: "-5.23 Volts" .1.3.6.1.4.1.2.3.51.2.2.2.1.6.0 = STRING: "+2.46 Volts" .1.3.6.1.4.1.2.3.51.2.2.2.1.8.0 = STRING: "+1.77 Volts" .1.3.6.1.4.1.2.3.51.2.2.3.1.0 = STRING: " 46% of maximum" .1.3.6.1.4.1.2.3.51.2.2.3.2.0 = STRING: " 46% of maximum" .1.3.6.1.4.1.2.3.51.2.2.3.3.0 = STRING: " 48% of maximum" .1.3.6.1.4.1.2.3.51.2.2.3.4.0 = STRING: " 54% of maximum" .1.3.6.1.4.1.2.3.51.2.2.3.10.0 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.3.11.0 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.3.12.0 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.3.13.0 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.4.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.4.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.4.1.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.2.4.1.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.4.1.1.2.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.4.1.1.2.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.4.1.1.2.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.4.1.1.2.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.4.1.1.3.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.4.1.1.3.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.4.1.1.3.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.4.1.1.3.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.4.1.1.4.1 = STRING: "Power module status OK" .1.3.6.1.4.1.2.3.51.2.2.4.1.1.4.2 = STRING: "Power module status OK" .1.3.6.1.4.1.2.3.51.2.2.4.1.1.4.3 = STRING: "Power module status OK" .1.3.6.1.4.1.2.3.51.2.2.4.1.1.4.4 = STRING: "Power module status OK" .1.3.6.1.4.1.2.3.51.2.2.5.2.1.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.5.2.2.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.5.2.3.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.5.2.4.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.5.2.5.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.5.2.7.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.5.2.8.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.5.2.9.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.5.2.10.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.5.2.11.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.5.2.12.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.5.2.13.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.5.2.14.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.5.2.15.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.5.2.16.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.5.2.17.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.5.2.18.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.5.2.19.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.5.2.33.0 = STRING: "10111001000000" .1.3.6.1.4.1.2.3.51.2.2.5.2.49.0 = STRING: "10111001000000" .1.3.6.1.4.1.2.3.51.2.2.5.2.65.0 = STRING: "11" .1.3.6.1.4.1.2.3.51.2.2.5.2.73.0 = STRING: "11" .1.3.6.1.4.1.2.3.51.2.2.5.2.74.0 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.5.2.75.0 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.5.2.81.0 = STRING: "1111" .1.3.6.1.4.1.2.3.51.2.2.5.2.89.0 = STRING: "1111" .1.3.6.1.4.1.2.3.51.2.2.5.2.97.0 = STRING: "1111" .1.3.6.1.4.1.2.3.51.2.2.5.2.113.0 = STRING: "1111" .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.1.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.2.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.2.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.2.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.2.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.2.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.2.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.2.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.2.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.3.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.3.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.3.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.3.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.3.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.3.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.3.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.3.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.4.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.4.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.4.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.4.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.4.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.4.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.4.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.4.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.5.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.5.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.5.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.5.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.5.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.5.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.5.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.5.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.6.1 = STRING: "Mor38____FC3" .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.6.2 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.6.3 = STRING: "L99_P_____FC" .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.6.4 = STRING: "G71______SU" .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.6.5 = STRING: "J52_Lin_p64" .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.6.6 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.6.7 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.6.8 = STRING: "M01____RHEL4" .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.7.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.7.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.7.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.7.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.7.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.7.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.7.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.7.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.8.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.8.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.8.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.8.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.8.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.8.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.8.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.8.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.9.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.9.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.9.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.9.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.9.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.9.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.9.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.9.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.10.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.10.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.10.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.10.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.10.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.10.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.10.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.10.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.11.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.11.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.11.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.11.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.11.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.11.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.11.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.11.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.3.1.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.3.2.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.3.3.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.3.4.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.3.5.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.3.6.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.4.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.8.4.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.8.4.1.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.2.8.4.1.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.8.4.1.1.2.1 = STRING: "(Not Readable)" .1.3.6.1.4.1.2.3.51.2.2.8.4.1.1.2.2 = STRING: "(Not Readable)" .1.3.6.1.4.1.2.3.51.2.2.8.4.1.1.2.3 = STRING: "(Not Readable)" .1.3.6.1.4.1.2.3.51.2.2.8.4.1.1.2.4 = STRING: "(Not Readable)" .1.3.6.1.4.1.2.3.51.2.2.9.1.0 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.9.2.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.9.2.1.2.1 = STRING: "Good" .1.3.6.1.4.1.2.3.51.2.2.9.2.1.3.1 = STRING: "No alarm events" .1.3.6.1.4.1.2.3.51.2.2.9.2.1.4.1 = INTEGER: 1315905633 .1.3.6.1.4.1.2.3.51.2.2.9.2.1.5.1 = STRING: "No alarm events" .1.3.6.1.4.1.2.3.51.2.2.9.2.1.6.1 = INTEGER: 1315905633 .1.3.6.1.4.1.2.3.51.2.2.10.1.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.10.1.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.10.1.1.1.2.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.10.1.1.1.2.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.10.1.1.1.3.1 = STRING: "1 - Power domain status is good." .1.3.6.1.4.1.2.3.51.2.2.10.1.1.1.3.2 = STRING: "1 - Power domain status is good." .1.3.6.1.4.1.2.3.51.2.2.10.1.1.1.4.1 = STRING: "Bay 1: 1300W" .1.3.6.1.4.1.2.3.51.2.2.10.1.1.1.4.2 = STRING: "Bay 3: 1300W" .1.3.6.1.4.1.2.3.51.2.2.10.1.1.1.5.1 = STRING: "Bay 2: 1300W" .1.3.6.1.4.1.2.3.51.2.2.10.1.1.1.5.2 = STRING: "Bay 4: 1300W" .1.3.6.1.4.1.2.3.51.2.2.10.1.1.1.6.1 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.10.1.1.1.6.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.10.1.1.1.7.1 = STRING: "1500W" .1.3.6.1.4.1.2.3.51.2.2.10.1.1.1.7.2 = STRING: "2240W" .1.3.6.1.4.1.2.3.51.2.2.10.1.1.1.8.1 = STRING: "1060W" .1.3.6.1.4.1.2.3.51.2.2.10.1.1.1.8.2 = STRING: "916W" .1.3.6.1.4.1.2.3.51.2.2.10.1.1.1.9.1 = STRING: "440W" .1.3.6.1.4.1.2.3.51.2.2.10.1.1.1.9.2 = STRING: "1324W" .1.3.6.1.4.1.2.3.51.2.2.10.1.1.1.10.1 = STRING: "980W" .1.3.6.1.4.1.2.3.51.2.2.10.1.1.1.10.2 = STRING: "916W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.1.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.1.9 = INTEGER: 9 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.1.10 = INTEGER: 10 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.1.11 = INTEGER: 11 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.1.12 = INTEGER: 12 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.1.13 = INTEGER: 13 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.1.14 = INTEGER: 14 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.1.15 = INTEGER: 15 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.1.16 = INTEGER: 16 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.1.17 = INTEGER: 17 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.2.1 = STRING: "notApplicable(1)" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.2.2 = STRING: "notApplicable(2)" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.2.3 = STRING: "blowerBay1(3)" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.2.4 = STRING: "blowerBay2(4)" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.2.5 = STRING: "blowerBay3(5)" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.2.6 = STRING: "blowerBay4(6)" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.2.7 = STRING: "managementModuleBay1(7)" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.2.8 = STRING: "managementModuleBay2(8)" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.2.9 = STRING: "switchModuleBay1(9)" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.2.10 = STRING: "switchModuleBay2(10)" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.2.11 = STRING: "switchModuleBay3(11)" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.2.12 = STRING: "switchModuleBay4(12)" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.2.13 = STRING: "serverBladeBay1(13)" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.2.14 = STRING: "serverBladeBay2(14)" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.2.15 = STRING: "serverBladeBay3(15)" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.2.16 = STRING: "serverBladeBay4(16)" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.2.17 = STRING: "notApplicable(17)" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.3.1 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.3.2 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.3.3 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.3.4 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.3.5 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.3.6 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.3.7 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.3.8 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.3.9 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.3.10 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.3.11 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.3.12 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.3.13 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.3.14 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.3.15 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.3.16 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.3.17 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.4.1 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.4.2 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.4.3 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.4.4 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.4.5 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.4.6 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.4.7 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.4.8 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.4.9 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.4.10 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.4.11 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.4.12 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.4.13 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.4.14 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.4.15 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.4.16 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.4.17 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.5.1 = STRING: "Midplane" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.5.2 = STRING: "Media Tray" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.5.3 = STRING: "Blower 1" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.5.4 = STRING: "Blower 2" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.5.5 = STRING: "Blower 3" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.5.6 = STRING: "Blower 4" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.5.7 = STRING: "Backup MM" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.5.8 = STRING: "BCT-81" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.5.9 = STRING: "Ethernet SM" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.5.10 = STRING: "Ethernet SM" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.5.11 = STRING: "Fibre SM" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.5.12 = STRING: "Fibre SM" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.5.13 = STRING: "Mor38____FC3" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.5.14 = STRING: "Blade Server" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.5.15 = STRING: "L99_P_____FC" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.5.16 = STRING: "G71______SU" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.5.17 = STRING: "Total Power Domain Allocation" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.6.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.6.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.6.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.6.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.6.5 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.6.6 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.6.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.6.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.6.9 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.6.10 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.6.11 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.6.12 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.6.13 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.6.14 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.6.15 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.6.16 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.6.17 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.7.1 = STRING: "0W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.7.2 = STRING: "10W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.7.3 = STRING: "80W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.7.4 = STRING: "80W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.7.5 = STRING: "0W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.7.6 = STRING: "0W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.7.7 = STRING: "15W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.7.8 = STRING: "25W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.7.9 = STRING: "45W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.7.10 = STRING: "45W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.7.11 = STRING: "45W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.7.12 = STRING: "45W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.7.13 = STRING: "125W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.7.14 = STRING: "50W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.7.15 = STRING: "220W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.7.16 = STRING: "285W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.7.17 = STRING: "1070W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.8.1 = STRING: "0W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.8.2 = STRING: "10W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.8.3 = STRING: "80W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.8.4 = STRING: "80W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.8.5 = STRING: "0W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.8.6 = STRING: "0W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.8.7 = STRING: "15W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.8.8 = STRING: "25W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.8.9 = STRING: "45W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.8.10 = STRING: "45W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.8.11 = STRING: "45W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.8.12 = STRING: "45W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.8.13 = STRING: "125W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.8.14 = STRING: "50W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.8.15 = STRING: "220W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.8.16 = STRING: "285W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.8.17 = STRING: "1070W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.9.1 = STRING: "0W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.9.2 = STRING: "10W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.9.3 = STRING: "80W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.9.4 = STRING: "80W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.9.5 = STRING: "0W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.9.6 = STRING: "0W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.9.7 = STRING: "15W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.9.8 = STRING: "25W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.9.9 = STRING: "45W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.9.10 = STRING: "45W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.9.11 = STRING: "45W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.9.12 = STRING: "45W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.9.13 = STRING: "85W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.9.14 = STRING: "50W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.9.15 = STRING: "220W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.9.16 = STRING: "179W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.9.17 = STRING: "924W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.10.1 = STRING: "notApplicable" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.10.2 = STRING: "notApplicable" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.10.3 = STRING: "notApplicable" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.10.4 = STRING: "notApplicable" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.10.5 = STRING: "notApplicable" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.10.6 = STRING: "notApplicable" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.10.7 = STRING: "notApplicable" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.10.8 = STRING: "notApplicable" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.10.9 = STRING: "notApplicable" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.10.10 = STRING: "notApplicable" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.10.11 = STRING: "notApplicable" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.10.12 = STRING: "notApplicable" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.10.13 = STRING: "100% ,0%" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.10.14 = STRING: "notApplicable" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.10.15 = STRING: "notApplicable" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.10.16 = STRING: "100% ,100%" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.10.17 = STRING: "notApplicable" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.11.1 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.11.2 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.11.3 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.11.4 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.11.5 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.11.6 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.11.7 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.11.8 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.11.9 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.11.10 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.11.11 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.11.12 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.11.13 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.11.14 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.11.15 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.11.16 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.11.17 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.2.1 = STRING: "blowerBay3(1)" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.2.2 = STRING: "blowerBay4(2)" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.2.3 = STRING: "serverBladeBay5(3)" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.2.4 = STRING: "serverBladeBay6(4)" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.2.5 = STRING: "serverBladeBay7(5)" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.2.6 = STRING: "serverBladeBay8(6)" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.2.7 = STRING: "notApplicable(7)" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.3.1 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.3.2 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.3.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.3.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.3.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.3.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.3.7 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.4.1 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.4.2 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.4.3 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.4.4 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.4.5 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.4.6 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.4.7 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.5.1 = STRING: "Blower 3" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.5.2 = STRING: "Blower 4" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.5.3 = STRING: "J52_Lin_p64" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.5.4 = STRING: "Blade Server 06" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.5.5 = STRING: "Blade Server 07" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.5.6 = STRING: "M01____RHEL4" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.5.7 = STRING: "Total Power Domain Allocation" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.6.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.6.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.6.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.6.4 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.6.5 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.6.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.6.7 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.7.1 = STRING: "80W" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.7.2 = STRING: "80W" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.7.3 = STRING: "210W" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.7.4 = STRING: "50W" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.7.5 = STRING: "203W" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.7.6 = STRING: "203W" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.7.7 = STRING: "826W" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.8.1 = STRING: "80W" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.8.2 = STRING: "80W" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.8.3 = STRING: "210W" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.8.4 = STRING: "50W" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.8.5 = STRING: "203W" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.8.6 = STRING: "203W" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.8.7 = STRING: "826W" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.9.1 = STRING: "80W" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.9.2 = STRING: "80W" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.9.3 = STRING: "210W" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.9.4 = STRING: "50W" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.9.5 = STRING: "203W" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.9.6 = STRING: "203W" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.9.7 = STRING: "826W" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.10.1 = STRING: "notApplicable" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.10.2 = STRING: "notApplicable" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.10.3 = STRING: "notApplicable" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.10.4 = STRING: "notApplicable" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.10.5 = STRING: "notApplicable" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.10.6 = STRING: "notApplicable" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.10.7 = STRING: "notApplicable" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.11.1 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.11.2 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.11.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.11.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.11.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.11.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.11.7 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.2.1 = STRING: "+5v" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.2.2 = STRING: "+3.3v" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.2.3 = STRING: "+12v" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.2.4 = STRING: "-5v" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.2.5 = STRING: "+2.5v" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.2.6 = STRING: "+1.8v" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.3.1 = STRING: "+5.15 Volts" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.3.2 = STRING: "+3.31 Volts" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.3.3 = STRING: "+11.81 Volts" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.3.4 = STRING: "-5.23 Volts" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.3.5 = STRING: "+2.46 Volts" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.3.6 = STRING: "+1.77 Volts" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.6.1 = STRING: "+5.25 Volts" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.6.2 = STRING: "+3.47 Volts" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.6.3 = STRING: "+12.24 Volts" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.6.4 = STRING: "-4.50 Volts" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.6.5 = STRING: "+2.58 Volts" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.6.6 = STRING: "+1.85 Volts" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.7.1 = STRING: "+5.13 Volts" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.7.2 = STRING: "+3.38 Volts" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.7.3 = STRING: "+12.06 Volts" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.7.4 = STRING: "-4.75 Volts" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.7.5 = STRING: "+2.54 Volts" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.7.6 = STRING: "+1.82 Volts" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.10.1 = STRING: "+4.75 Volts" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.10.2 = STRING: "+3.14 Volts" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.10.3 = STRING: "+11.53 Volts" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.10.4 = STRING: "-5.50 Volts" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.10.5 = STRING: "+2.43 Volts" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.10.6 = STRING: "+1.75 Volts" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.11.1 = STRING: "+4.88 Volts" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.11.2 = STRING: "+3.22 Volts" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.11.3 = STRING: "+11.70 Volts" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.11.4 = STRING: "-5.25 Volts" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.11.5 = STRING: "+2.46 Volts" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.11.6 = STRING: "+1.78 Volts" .1.3.6.1.4.1.2.3.51.2.2.21.1.1.1.0 = STRING: "0000" .1.3.6.1.4.1.2.3.51.2.2.21.1.1.2.0 = STRING: "000" .1.3.6.1.4.1.2.3.51.2.2.21.1.1.3.0 = STRING: "0000000" .1.3.6.1.4.1.2.3.51.2.2.21.1.1.4.0 = STRING: "A1B7 F231 6F85 11D8 B22B 0010 8303 6DC3" .1.3.6.1.4.1.2.3.51.2.2.21.1.1.5.0 = STRING: "Not Available" .1.3.6.1.4.1.2.3.51.2.2.21.1.1.6.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.1.1.7.0 = STRING: "Not Available" .1.3.6.1.4.1.2.3.51.2.2.21.1.1.8.0 = STRING: "Not Available" .1.3.6.1.4.1.2.3.51.2.2.21.1.1.9.0 = STRING: "Not Available" .1.3.6.1.4.1.2.3.51.2.2.21.1.1.10.0 = STRING: "Not Available" .1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.2.1 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.2.2 = STRING: "2" .1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.3.1 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.3.2 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.4.1 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.4.2 = STRING: "90P3793" .1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.5.1 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.5.2 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.6.1 = STRING: "0000 0000 0000 0000 0000 0000 0000 0000 " .1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.6.2 = STRING: "0074 50C1 5932 11D9 AE84 0010 8335 FCF9 " .1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.7.1 = STRING: "4003" .1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.7.2 = STRING: "0105" .1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.8.1 = STRING: "90P3678" .1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.8.2 = STRING: "90P3685" .1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.9.1 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.9.2 = STRING: "ZJ1UKR4CW00K" .1.3.6.1.4.1.2.3.51.2.2.21.3.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.3.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.3.1.1.2.1 = STRING: "Management Module 1" .1.3.6.1.4.1.2.3.51.2.2.21.3.1.1.2.2 = STRING: "Management Module 2" .1.3.6.1.4.1.2.3.51.2.2.21.3.1.1.3.1 = STRING: "BVET43J" .1.3.6.1.4.1.2.3.51.2.2.21.3.1.1.3.2 = STRING: "BVET43J" .1.3.6.1.4.1.2.3.51.2.2.21.3.1.1.4.1 = STRING: " 16" .1.3.6.1.4.1.2.3.51.2.2.21.3.1.1.4.2 = STRING: " 16" .1.3.6.1.4.1.2.3.51.2.2.21.3.1.1.5.1 = STRING: "CNETMNUS.PKT" .1.3.6.1.4.1.2.3.51.2.2.21.3.1.1.5.2 = STRING: "CNETMNUS.PKT" .1.3.6.1.4.1.2.3.51.2.2.21.3.1.1.6.1 = STRING: "06-27-06" .1.3.6.1.4.1.2.3.51.2.2.21.3.1.1.6.2 = STRING: "06-27-06" .1.3.6.1.4.1.2.3.51.2.2.21.3.2.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.3.2.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.3.2.1.2.1 = STRING: "Management Module 1" .1.3.6.1.4.1.2.3.51.2.2.21.3.2.1.2.2 = STRING: "Management Module 2" .1.3.6.1.4.1.2.3.51.2.2.21.3.2.1.3.1 = STRING: "BVBR33D" .1.3.6.1.4.1.2.3.51.2.2.21.3.2.1.3.2 = STRING: "BVBR33D" .1.3.6.1.4.1.2.3.51.2.2.21.3.2.1.4.1 = STRING: " 16" .1.3.6.1.4.1.2.3.51.2.2.21.3.2.1.4.2 = STRING: " 16" .1.3.6.1.4.1.2.3.51.2.2.21.3.2.1.5.1 = STRING: "CNETBRUS.PKT" .1.3.6.1.4.1.2.3.51.2.2.21.3.2.1.5.2 = STRING: "CNETBRUS.PKT" .1.3.6.1.4.1.2.3.51.2.2.21.3.2.1.6.1 = STRING: "04-12-05" .1.3.6.1.4.1.2.3.51.2.2.21.3.2.1.6.2 = STRING: "04-12-05" .1.3.6.1.4.1.2.3.51.2.2.21.3.3.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.3.3.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.3.3.1.2.1 = STRING: "Management Module 1" .1.3.6.1.4.1.2.3.51.2.2.21.3.3.1.2.2 = STRING: "Management Module 2" .1.3.6.1.4.1.2.3.51.2.2.21.3.3.1.3.1 = STRING: "BVRG43J" .1.3.6.1.4.1.2.3.51.2.2.21.3.3.1.3.2 = STRING: "BVRG43J" .1.3.6.1.4.1.2.3.51.2.2.21.3.3.1.4.1 = STRING: " 16" .1.3.6.1.4.1.2.3.51.2.2.21.3.3.1.4.2 = STRING: " 16" .1.3.6.1.4.1.2.3.51.2.2.21.3.3.1.5.1 = STRING: "CNETRGUS.PKT" .1.3.6.1.4.1.2.3.51.2.2.21.3.3.1.5.2 = STRING: "CNETRGUS.PKT" .1.3.6.1.4.1.2.3.51.2.2.21.3.3.1.6.1 = STRING: "06-27-06" .1.3.6.1.4.1.2.3.51.2.2.21.3.3.1.6.2 = STRING: "06-27-06" .1.3.6.1.4.1.2.3.51.2.2.21.3.4.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.3.4.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.3.4.1.2.1 = STRING: "Management Module 1" .1.3.6.1.4.1.2.3.51.2.2.21.3.4.1.2.2 = STRING: "Management Module 2" .1.3.6.1.4.1.2.3.51.2.2.21.3.4.1.3.1 = STRING: "BREZ15" .1.3.6.1.4.1.2.3.51.2.2.21.3.4.1.3.2 = STRING: "BREZ15" .1.3.6.1.4.1.2.3.51.2.2.21.3.4.1.4.1 = STRING: " 1" .1.3.6.1.4.1.2.3.51.2.2.21.3.4.1.4.2 = STRING: " 1" .1.3.6.1.4.1.2.3.51.2.2.21.3.4.1.5.1 = STRING: "DUALPS2.PKT" .1.3.6.1.4.1.2.3.51.2.2.21.3.4.1.5.2 = STRING: "DUALPS2.PKT" .1.3.6.1.4.1.2.3.51.2.2.21.3.4.1.6.1 = STRING: "12-14-05" .1.3.6.1.4.1.2.3.51.2.2.21.3.4.1.6.2 = STRING: "12-14-05" .1.3.6.1.4.1.2.3.51.2.2.21.3.5.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.3.5.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.3.5.1.2.1 = STRING: "Management Module 1" .1.3.6.1.4.1.2.3.51.2.2.21.3.5.1.2.2 = STRING: "Management Module 2" .1.3.6.1.4.1.2.3.51.2.2.21.3.5.1.3.1 = STRING: "BRPI33" .1.3.6.1.4.1.2.3.51.2.2.21.3.5.1.3.2 = STRING: "BRPI33" .1.3.6.1.4.1.2.3.51.2.2.21.3.5.1.4.1 = STRING: " 1" .1.3.6.1.4.1.2.3.51.2.2.21.3.5.1.4.2 = STRING: " 1" .1.3.6.1.4.1.2.3.51.2.2.21.3.5.1.5.1 = STRING: "DUALPS2.PKT" .1.3.6.1.4.1.2.3.51.2.2.21.3.5.1.5.2 = STRING: "DUALPS2.PKT" .1.3.6.1.4.1.2.3.51.2.2.21.3.5.1.6.1 = STRING: "01-07-04" .1.3.6.1.4.1.2.3.51.2.2.21.3.5.1.6.2 = STRING: "01-07-04" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.1.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.2.1 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.2.2 = STRING: "2" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.2.3 = STRING: "3" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.2.4 = STRING: "4" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.2.5 = STRING: "5" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.2.6 = STRING: "6" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.2.7 = STRING: "7" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.2.8 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.3.1 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.3.2 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.3.3 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.3.4 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.3.5 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.3.6 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.3.7 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.3.8 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.4.1 = STRING: "31R3389" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.4.2 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.4.3 = STRING: "13N2292" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.4.4 = STRING: "13N2346" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.4.5 = STRING: "13N0504" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.4.6 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.4.7 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.4.8 = STRING: "13N1605" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.5.1 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.5.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.5.3 = INTEGER: 39 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.5.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.5.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.5.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.5.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.5.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.6.1 = STRING: "23A0138" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.6.2 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.6.3 = STRING: "23Z9899" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.6.4 = STRING: "23A0771" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.6.5 = STRING: "RAZ0052" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.6.6 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.6.7 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.6.8 = STRING: "23Z9101" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.7.1 = STRING: "8850" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.7.2 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.7.3 = STRING: "8832" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.7.4 = STRING: "8843" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.7.5 = STRING: "8842" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.7.6 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.7.7 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.7.8 = STRING: "8839" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.8.1 = STRING: "8CB6 F79B 0AB4 4A12 9AE5 45EF FB7F 4020 " .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.8.2 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.8.3 = STRING: "64EE EE02 24B4 4A12 9B01 D094 209B 532C " .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.8.4 = STRING: "FEC0 A5BF 43B4 4A12 896F 03B6 7345 2997 " .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.8.5 = STRING: "74B7 6C80 B764 11D5 9FF5 000D 601E 811A " .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.8.6 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.8.7 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.8.8 = STRING: "D5BF 6A11 CFC8 11D8 A265 0060 B0F9 D9C9 " .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.9.1 = STRING: "0505" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.9.2 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.9.3 = STRING: "0404" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.9.4 = STRING: "3204" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.9.5 = STRING: "2004" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.9.6 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.9.7 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.9.8 = STRING: "2804" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.10.1 = STRING: "13M8325" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.10.2 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.10.3 = STRING: "13N2290" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.10.4 = STRING: "26K9392" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.10.5 = STRING: "24P8895" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.10.6 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.10.7 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.10.8 = STRING: "13N1604" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.11.1 = STRING: "ZJ1Z0051W00B" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.11.2 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.11.3 = STRING: "ZJ1TS741T1GG" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.11.4 = STRING: "ZJ1WLX48512Y" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.11.5 = STRING: "ZJ1W6745E17L" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.11.6 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.11.7 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.11.8 = STRING: "YJ1SM045701G" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.12.1 = STRING: "01Z" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.12.2 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.12.3 = STRING: "9TZ" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.12.4 = STRING: "11Z" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.12.5 = STRING: "41X" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.12.6 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.12.7 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.12.8 = STRING: "6TZ" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.20.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.20.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.20.3 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.20.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.20.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.20.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.20.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.20.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.21.1 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.21.2 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.21.3 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.21.4 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.21.5 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.21.6 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.21.7 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.21.8 = STRING: "SLRM" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.22.1 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.22.2 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.22.3 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.22.4 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.22.5 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.22.6 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.22.7 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.22.8 = STRING: "59P6624" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.23.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.23.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.23.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.23.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.23.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.23.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.23.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.23.8 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.24.1 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.24.2 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.24.3 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.24.4 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.24.5 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.24.6 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.24.7 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.24.8 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.25.1 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.25.2 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.25.3 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.25.4 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.25.5 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.25.6 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.25.7 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.25.8 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.26.1 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.26.2 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.26.3 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.26.4 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.26.5 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.26.6 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.26.7 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.26.8 = STRING: "0000 0000 0000 0000 0000 0000 0000 0000 " .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.27.1 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.27.2 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.27.3 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.27.4 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.27.5 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.27.6 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.27.7 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.27.8 = STRING: "4603" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.28.1 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.28.2 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.28.3 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.28.4 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.28.5 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.28.6 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.28.7 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.28.8 = STRING: "59P6623" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.29.1 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.29.2 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.29.3 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.29.4 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.29.5 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.29.6 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.29.7 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.29.8 = STRING: "J1RJH3BH12J" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.1.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.2.1 = STRING: "00:11:25:75:00:c2" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.2.2 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.2.3 = STRING: "00:0d:60:4e:74:be" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.2.4 = STRING: "00:0d:60:5b:93:d0" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.2.5 = STRING: "00:0d:60:1e:81:1a" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.2.6 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.2.7 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.2.8 = STRING: "00:0e:0c:32:04:2a" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.3.1 = STRING: "00:11:25:75:00:c3" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.3.2 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.3.3 = STRING: "00:0d:60:4e:74:bf" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.3.4 = STRING: "00:0d:60:5b:93:d1" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.3.5 = STRING: "00:0d:60:1e:81:1b" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.3.6 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.3.7 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.3.8 = STRING: "00:0e:0c:32:04:2b" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.4.1 = STRING: "Not Available" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.4.2 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.4.3 = STRING: "Not Available" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.4.4 = STRING: "Not Available" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.4.5 = STRING: "Not Available" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.4.6 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.4.7 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.4.8 = STRING: "00:0e:0c:32:04:28" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.5.1 = STRING: "Not Available" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.5.2 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.5.3 = STRING: "Not Available" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.5.4 = STRING: "Not Available" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.5.5 = STRING: "Not Available" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.5.6 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.5.7 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.5.8 = STRING: "00:0e:0c:32:04:29" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.10.1 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.10.2 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.10.3 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.10.4 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.10.5 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.10.6 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.10.7 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.10.8 = STRING: "Not Available" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.11.1 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.11.2 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.11.3 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.11.4 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.11.5 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.11.6 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.11.7 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.11.8 = STRING: "Not Available" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.12.1 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.12.2 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.12.3 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.12.4 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.12.5 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.12.6 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.12.7 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.12.8 = STRING: "Not Available" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.13.1 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.13.2 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.13.3 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.13.4 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.13.5 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.13.6 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.13.7 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.13.8 = STRING: "Not Available" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.18.1 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.18.2 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.18.3 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.18.4 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.18.5 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.18.6 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.18.7 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.18.8 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.19.1 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.19.2 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.19.3 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.19.4 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.19.5 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.19.6 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.19.7 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.19.8 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.20.1 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.20.2 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.20.3 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.20.4 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.20.5 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.20.6 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.20.7 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.20.8 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.21.1 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.21.2 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.21.3 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.21.4 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.21.5 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.21.6 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.21.7 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.21.8 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.1.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.2.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.2.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.2.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.2.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.2.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.2.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.2.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.2.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.3.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.3.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.3.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.3.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.3.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.3.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.3.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.3.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.4.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.4.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.4.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.4.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.4.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.4.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.4.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.4.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.5.1 = STRING: "Mor38____FC3" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.5.2 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.5.3 = STRING: "L99_P_____FC" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.5.4 = STRING: "G71______SU" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.5.5 = STRING: "J52_Lin_p64" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.5.6 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.5.7 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.5.8 = STRING: "M01____RHEL4" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.6.1 = STRING: "BKE121AUS " .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.6.2 = STRING: "(No build ID)" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.6.3 = STRING: "(No build ID)" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.6.4 = STRING: "BWE124AUS " .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.6.5 = STRING: "(No build ID)" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.6.6 = STRING: "(No build ID)" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.6.7 = STRING: "(No build ID)" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.6.8 = STRING: "(No build ID)" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.7.1 = STRING: "1.08" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.7.2 = STRING: "(No revision)" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.7.3 = STRING: "(No revision)" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.7.4 = STRING: "1.08" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.7.5 = STRING: "(No revision)" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.7.6 = STRING: "(No revision)" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.7.7 = STRING: "(No revision)" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.7.8 = STRING: "(No revision)" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.8.1 = STRING: "01/12/2006" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.8.2 = STRING: "(No build date)" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.8.3 = STRING: "(No build date)" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.8.4 = STRING: "05/11/2006" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.8.5 = STRING: "(No build date)" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.8.6 = STRING: "(No build date)" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.8.7 = STRING: "(No build date)" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.8.8 = STRING: "(No build date)" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.1.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.2.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.2.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.2.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.2.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.2.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.2.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.2.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.2.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.3.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.3.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.3.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.3.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.3.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.3.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.3.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.3.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.4.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.4.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.4.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.4.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.4.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.4.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.4.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.4.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.5.1 = STRING: "Mor38____FC3" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.5.2 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.5.3 = STRING: "L99_P_____FC" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.5.4 = STRING: "G71______SU" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.5.5 = STRING: "J52_Lin_p64" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.5.6 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.5.7 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.5.8 = STRING: "M01____RHEL4" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.6.1 = STRING: "BKYT16AUS " .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.6.2 = STRING: "(No build ID)" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.6.3 = STRING: "(No build ID)" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.6.4 = STRING: "BWYT01AUS " .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.6.5 = STRING: "(No build ID)" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.6.6 = STRING: "(No build ID)" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.6.7 = STRING: "(No build ID)" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.6.8 = STRING: "(No build ID)" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.7.1 = STRING: "1.03" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.7.2 = STRING: "(No revision)" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.7.3 = STRING: "1.02" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.7.4 = STRING: "1.00" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.7.5 = STRING: "(No revision)" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.7.6 = STRING: "(No revision)" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.7.7 = STRING: "(No revision)" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.7.8 = STRING: "(No revision)" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.8.1 = STRING: "12/20/2005" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.8.2 = STRING: "(No build date)" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.8.3 = STRING: "02/11/2004" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.8.4 = STRING: "06/11/2004" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.8.5 = STRING: "(No build date)" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.8.6 = STRING: "(No build date)" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.8.7 = STRING: "(No build date)" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.8.8 = STRING: "(No build date)" .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.1.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.2.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.2.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.2.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.2.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.2.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.2.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.2.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.2.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.3.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.3.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.3.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.3.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.3.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.3.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.3.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.3.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.4.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.4.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.4.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.4.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.4.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.4.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.4.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.4.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.5.1 = STRING: "Mor38____FC3" .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.5.2 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.5.3 = STRING: "L99_P_____FC" .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.5.4 = STRING: "G71______SU" .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.5.5 = STRING: "J52_Lin_p64" .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.5.6 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.5.7 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.5.8 = STRING: "M01____RHEL4" .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.6.1 = Hex-STRING: 02 42 4B 42 54 31 37 43 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.6.2 = STRING: "(No build ID)" .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.6.3 = STRING: "BR8T34A" .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.6.4 = Hex-STRING: 01 42 57 42 54 32 35 41 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.6.5 = STRING: "BQ8T18A" .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.6.6 = STRING: "(No build ID)" .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.6.7 = STRING: "(No build ID)" .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.6.8 = STRING: "BRMK26A" .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.7.1 = STRING: " 2.04" .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.7.2 = STRING: "(No revision)" .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.7.3 = STRING: "34" .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.7.4 = STRING: " 1.16" .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.7.5 = STRING: "17" .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.7.6 = STRING: "(No revision)" .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.7.7 = STRING: "(No revision)" .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.7.8 = STRING: "26" .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.2.1 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.2.2 = STRING: "2" .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.2.3 = STRING: "3" .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.2.4 = STRING: "4" .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.3.1 = STRING: "AD " .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.3.2 = STRING: "AD " .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.3.3 = STRING: "Qlgc" .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.3.4 = STRING: "Qlgc" .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.4.1 = STRING: "90P3711" .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.4.2 = STRING: "90P3711" .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.4.3 = STRING: "59P6621" .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.4.4 = STRING: "59P6621" .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.5.1 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.5.2 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.5.3 = INTEGER: 13 .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.5.4 = INTEGER: 13 .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.8.1 = STRING: "5952 4A32 8CD5 4FB6 B915 75C9 E57A 2251 " .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.8.2 = STRING: "5CEC 35DE 0FD0 4A5A 9F28 17D7 5ECF 939C " .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.8.3 = STRING: "21DA E5FC 737A CC18 00D9 00C0 DD02 0AE9 " .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.8.4 = STRING: "21DA E5F5 D735 7F8E AA36 00C0 DD02 0AB5 " .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.9.1 = STRING: "4104" .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.9.2 = STRING: "4104" .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.9.3 = STRING: "0504" .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.9.4 = STRING: "0504" .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.10.1 = STRING: "C56081010" .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.10.2 = STRING: "C56081010" .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.10.3 = STRING: "48P7062" .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.10.4 = STRING: "48P7062" .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.11.1 = STRING: "000E0C635B52" .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.11.2 = STRING: "000E0C6356B2" .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.11.3 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.11.4 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.2.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.2.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.2.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.2.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.3.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.3.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.3.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.3.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.4.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.4.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.4.3 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.4.4 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.5.1 = STRING: "BRISM43 " .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.5.2 = STRING: "BRISM43 " .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.5.3 = STRING: "BRFSM " .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.5.4 = STRING: "BRFSM " .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.6.1 = STRING: "10/14/2004" .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.6.2 = STRING: "10/14/2004" .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.6.3 = STRING: "06/03/2003" .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.6.4 = STRING: "06/03/2003" .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.7.1 = STRING: "1.00" .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.7.2 = STRING: "1.00" .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.7.3 = STRING: "1449" .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.7.4 = STRING: "1449" .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.8.1 = STRING: "BRISM_MCU " .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.8.2 = STRING: "BRISM_MCU " .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.8.3 = STRING: " " .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.8.4 = STRING: " " .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.9.1 = STRING: "09/29/2004" .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.9.2 = STRING: "09/29/2004" .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.9.3 = STRING: " " .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.9.4 = STRING: " " .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.10.1 = STRING: "1.93" .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.10.2 = STRING: "1.93" .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.10.3 = STRING: " " .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.10.4 = STRING: " " .1.3.6.1.4.1.2.3.51.2.2.21.7.2.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.7.2.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.7.2.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.2.21.7.2.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.21.7.2.1.2.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.7.2.1.2.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.7.2.1.2.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.2.21.7.2.1.2.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.21.7.2.1.3.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.7.2.1.3.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.7.2.1.3.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.7.2.1.3.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.7.2.1.4.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.7.2.1.4.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.7.2.1.4.3 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.7.2.1.4.4 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.7.2.1.5.1 = STRING: "BRISM02 " .1.3.6.1.4.1.2.3.51.2.2.21.7.2.1.5.2 = STRING: "BRISM02 " .1.3.6.1.4.1.2.3.51.2.2.21.7.2.1.5.3 = STRING: " " .1.3.6.1.4.1.2.3.51.2.2.21.7.2.1.5.4 = STRING: " " .1.3.6.1.4.1.2.3.51.2.2.21.7.2.1.6.1 = STRING: "07/02/2004" .1.3.6.1.4.1.2.3.51.2.2.21.7.2.1.6.2 = STRING: "07/02/2004" .1.3.6.1.4.1.2.3.51.2.2.21.7.2.1.6.3 = STRING: " " .1.3.6.1.4.1.2.3.51.2.2.21.7.2.1.6.4 = STRING: " " .1.3.6.1.4.1.2.3.51.2.2.21.7.2.1.7.1 = STRING: "3.05" .1.3.6.1.4.1.2.3.51.2.2.21.7.2.1.7.2 = STRING: "3.05" .1.3.6.1.4.1.2.3.51.2.2.21.7.2.1.7.3 = STRING: " " .1.3.6.1.4.1.2.3.51.2.2.21.7.2.1.7.4 = STRING: " " .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.2.1 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.2.2 = STRING: "2" .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.2.3 = STRING: "3" .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.2.4 = STRING: "4" .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.3.1 = STRING: "DELT" .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.3.2 = STRING: "DELT" .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.3.3 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.3.4 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.4.1 = STRING: "90P3714" .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.4.2 = STRING: "90P3714" .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.4.3 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.4.4 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.5.1 = INTEGER: 51 .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.5.2 = INTEGER: 51 .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.5.3 = INTEGER: 159 .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.5.4 = INTEGER: 159 .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.8.1 = STRING: "A3A1 3C00 7C8A 11D8 00DF 0065 0032 0091 " .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.8.2 = STRING: "8E2B 90C0 7C84 11D8 000E 00A8 005D 00BB " .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.8.3 = STRING: "FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF " .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.8.4 = STRING: "FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF " .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.9.1 = STRING: "1204" .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.9.2 = STRING: "1204" .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.9.3 = Hex-STRING: D0 07 F0 D2 .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.9.4 = Hex-STRING: D0 07 F0 D2 .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.10.1 = STRING: "90P3688" .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.10.2 = STRING: "90P3688" .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.10.3 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.10.4 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.11.1 = STRING: "ZJ1UKT43J066" .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.11.2 = STRING: "ZJ1UKT43J02X" .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.11.3 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.11.4 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.9.3.0 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.9.4.0 = STRING: "90P3697" .1.3.6.1.4.1.2.3.51.2.2.21.9.5.0 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.9.8.0 = STRING: "A8A1 21A1 7D1F 11D8 ABB6 0010 8305 F52E " .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.9 = INTEGER: 9 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.10 = INTEGER: 10 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.11 = INTEGER: 11 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.12 = INTEGER: 12 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.13 = INTEGER: 13 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.14 = INTEGER: 14 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.15 = INTEGER: 15 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.16 = INTEGER: 16 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.17 = INTEGER: 17 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.18 = INTEGER: 18 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.19 = INTEGER: 19 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.20 = INTEGER: 20 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.21 = INTEGER: 21 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.22 = INTEGER: 22 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.23 = INTEGER: 23 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.24 = INTEGER: 24 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.25 = INTEGER: 25 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.26 = INTEGER: 26 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.27 = INTEGER: 27 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.28 = INTEGER: 28 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.29 = INTEGER: 29 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.30 = INTEGER: 30 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.31 = INTEGER: 31 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.32 = INTEGER: 32 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.33 = INTEGER: 33 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.34 = INTEGER: 34 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.35 = INTEGER: 35 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.36 = INTEGER: 36 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.37 = INTEGER: 37 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.1 = STRING: "13N2292" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.2 = STRING: "90P3697" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.3 = STRING: "13N1605" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.4 = STRING: "13N1607" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.5 = STRING: "90P3711" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.6 = STRING: "13N2346" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.7 = STRING: "59P6624" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.8 = STRING: "90P3711" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.9 = STRING: "90P3711" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.10 = STRING: "90P3711" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.11 = STRING: "13N1607" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.12 = STRING: "13N1607" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.13 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.14 = STRING: "90P3711" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.15 = STRING: "90P3714" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.16 = STRING: "90P3714" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.17 = STRING: "90P3697" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.18 = STRING: "13N0504" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.19 = STRING: "13N2292" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.20 = STRING: "73P9092" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.21 = STRING: "31R3389" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.22 = STRING: "13N1605" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.23 = STRING: "59P6624" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.24 = STRING: "25K8238" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.25 = STRING: "13N1607" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.26 = STRING: "13N2346" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.27 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.28 = STRING: "13N0497" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.29 = STRING: "90P3711" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.30 = STRING: "90P3793" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.31 = STRING: "13N0497" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.32 = STRING: "13N0497" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.33 = STRING: "90P3711" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.34 = STRING: "J85503A" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.35 = STRING: "13N1605" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.36 = STRING: "13N1607" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.37 = STRING: "90P4769" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.1 = STRING: "ZJ1TS741T1GG" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.2 = STRING: "348ICHT00091" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.3 = STRING: "YJ1SM045703H" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.4 = STRING: "YJ1SM1447091" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.5 = STRING: "000E0C6356B2" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.6 = STRING: "ZJ1WLX48512Y" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.7 = STRING: "J1RJH3BH12J" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.8 = STRING: "000E0C635C92" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.9 = STRING: "000E0C635B52" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.10 = STRING: "000E0C6356B2" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.11 = STRING: "YJ1SM1447091" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.12 = STRING: "YJ1SM14S6013" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.13 = STRING: "J1UKP00242" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.14 = STRING: "000E0C635B52" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.15 = STRING: "ZJ1UKT43J066" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.16 = STRING: "ZJ1UKT43J02X" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.17 = STRING: "J1UKS43F040" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.18 = STRING: "ZJ1W6745E17L" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.19 = STRING: "ZJ1TS741T1GG" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.20 = STRING: "J1RJW3671EH" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.21 = STRING: "ZJ1Z0051W00B" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.22 = STRING: "YJ1SM045701G" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.23 = STRING: "J1RJH3BH12J" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.24 = STRING: "ZJ1VZU45510W" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.25 = STRING: "YJ1SM14S601M" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.26 = STRING: "ZJ1WLX48512Y" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.27 = STRING: "J1UKR438006" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.28 = STRING: "ZJ1Z9E53B114" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.29 = STRING: "000E0C6356B2" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.30 = STRING: "ZJ1UKR4CW00K" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.31 = STRING: "ZJ1ZB753A10V" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.32 = STRING: "ZJ1Z9E52W101" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.33 = STRING: "000E0C6356B2" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.34 = STRING: "ZK11SV5AH10P" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.35 = STRING: "YJ1SM0457035" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.36 = STRING: "YJ1SM14S6013" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.37 = STRING: "K10XD3AP1AM" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.1 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.2 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.3 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.4 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.5 = STRING: "AD " .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.6 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.7 = STRING: "SLRM" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.8 = STRING: "AD " .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.9 = STRING: "AD " .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.10 = STRING: "AD " .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.11 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.12 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.13 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.14 = STRING: "AD " .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.15 = STRING: "DELT" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.16 = STRING: "DELT" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.17 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.18 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.19 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.20 = STRING: "SLRM" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.21 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.22 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.23 = STRING: "SLRM" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.24 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.25 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.26 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.27 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.28 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.29 = STRING: "AD " .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.30 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.31 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.32 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.33 = STRING: "AD #" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.34 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.35 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.36 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.37 = STRING: "SLRM" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.1 = STRING: "3" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.2 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.3 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.4 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.5 = STRING: "2" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.6 = STRING: "4" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.7 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.8 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.9 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.10 = STRING: "2" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.11 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.12 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.13 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.14 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.15 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.16 = STRING: "2" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.17 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.18 = STRING: "5" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.19 = STRING: "3" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.20 = STRING: "3" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.21 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.22 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.23 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.24 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.25 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.26 = STRING: "4" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.27 = STRING: "2" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.28 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.29 = STRING: "2" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.30 = STRING: "2" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.31 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.32 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.33 = STRING: "2" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.34 = STRING: "7" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.35 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.36 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.37 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.1 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.2 = INTEGER: 129 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.3 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.5 = INTEGER: 17 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.6 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.7 = INTEGER: 34 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.8 = INTEGER: 17 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.9 = INTEGER: 17 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.10 = INTEGER: 17 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.11 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.12 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.13 = INTEGER: 98 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.14 = INTEGER: 17 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.15 = INTEGER: 113 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.16 = INTEGER: 113 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.17 = INTEGER: 129 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.18 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.19 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.20 = INTEGER: 35 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.21 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.22 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.23 = INTEGER: 34 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.24 = INTEGER: 39 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.25 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.26 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.27 = INTEGER: 98 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.28 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.29 = INTEGER: 17 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.30 = INTEGER: 81 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.31 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.32 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.33 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.34 = INTEGER: 42 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.35 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.36 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.37 = INTEGER: 35 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.1 = STRING: "88329TZ" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.2 = "" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.3 = STRING: "88396TZ" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.4 = "" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.5 = "" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.6 = STRING: "884311Z" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.7 = "" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.8 = "" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.9 = "" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.10 = "" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.11 = "" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.12 = "" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.13 = "" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.14 = "" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.15 = "" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.16 = "" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.17 = "" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.18 = STRING: "884241X" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.19 = STRING: "88329TZ" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.20 = "" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.21 = STRING: "885001Z" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.22 = STRING: "88396TZ" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.23 = "" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.24 = "" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.25 = "" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.26 = STRING: "884311Z" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.27 = "" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.28 = STRING: "884242X" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.29 = "" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.30 = "" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.31 = STRING: "88424TX" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.32 = STRING: "884242x" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.33 = "" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.34 = "" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.35 = STRING: "88396TZ" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.36 = "" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.37 = "" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.9 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.10 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.11 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.13 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.14 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.15 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.16 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.17 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.18 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.19 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.20 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.21 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.22 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.23 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.24 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.25 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.26 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.27 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.28 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.29 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.30 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.31 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.32 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.33 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.34 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.35 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.36 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.37 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.9 = INTEGER: 9 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.10 = INTEGER: 10 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.11 = INTEGER: 11 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.12 = INTEGER: 12 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.13 = INTEGER: 13 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.14 = INTEGER: 14 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.15 = INTEGER: 15 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.16 = INTEGER: 16 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.17 = INTEGER: 17 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.18 = INTEGER: 18 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.19 = INTEGER: 19 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.20 = INTEGER: 20 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.21 = INTEGER: 21 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.22 = INTEGER: 22 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.23 = INTEGER: 23 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.24 = INTEGER: 24 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.25 = INTEGER: 25 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.26 = INTEGER: 26 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.27 = INTEGER: 27 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.28 = INTEGER: 28 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.29 = INTEGER: 29 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.30 = INTEGER: 30 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.31 = INTEGER: 31 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.32 = INTEGER: 32 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.33 = INTEGER: 33 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.34 = INTEGER: 34 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.35 = INTEGER: 35 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.36 = INTEGER: 36 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.37 = INTEGER: 37 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.38 = INTEGER: 38 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.39 = INTEGER: 39 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.40 = INTEGER: 40 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.41 = INTEGER: 41 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.42 = INTEGER: 42 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.43 = INTEGER: 43 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.44 = INTEGER: 44 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.45 = INTEGER: 45 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.46 = INTEGER: 46 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.47 = INTEGER: 47 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.48 = INTEGER: 48 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.49 = INTEGER: 49 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.50 = INTEGER: 50 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.51 = INTEGER: 51 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.52 = INTEGER: 52 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.53 = INTEGER: 53 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.54 = INTEGER: 54 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.55 = INTEGER: 55 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.56 = INTEGER: 56 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.57 = INTEGER: 57 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.58 = INTEGER: 58 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.59 = INTEGER: 59 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.60 = INTEGER: 60 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.61 = INTEGER: 61 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.62 = INTEGER: 62 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.63 = INTEGER: 63 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.64 = INTEGER: 64 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.65 = INTEGER: 65 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.66 = INTEGER: 66 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.67 = INTEGER: 67 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.68 = INTEGER: 68 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.69 = INTEGER: 69 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.70 = INTEGER: 70 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.71 = INTEGER: 71 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.72 = INTEGER: 72 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.73 = INTEGER: 73 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.74 = INTEGER: 74 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.75 = INTEGER: 75 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.76 = INTEGER: 76 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.77 = INTEGER: 77 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.78 = INTEGER: 78 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.79 = INTEGER: 79 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.80 = INTEGER: 80 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.81 = INTEGER: 81 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.82 = INTEGER: 82 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.83 = INTEGER: 83 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.84 = INTEGER: 84 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.85 = INTEGER: 85 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.86 = INTEGER: 86 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.87 = INTEGER: 87 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.88 = INTEGER: 88 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.89 = INTEGER: 89 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.90 = INTEGER: 90 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.91 = INTEGER: 91 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.92 = INTEGER: 92 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.93 = INTEGER: 93 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.94 = INTEGER: 94 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.95 = INTEGER: 95 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.96 = INTEGER: 96 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.97 = INTEGER: 97 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.98 = INTEGER: 98 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.99 = INTEGER: 99 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.100 = INTEGER: 100 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.101 = INTEGER: 101 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.102 = INTEGER: 102 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.103 = INTEGER: 103 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.104 = INTEGER: 104 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.105 = INTEGER: 105 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.106 = INTEGER: 106 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.107 = INTEGER: 107 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.108 = INTEGER: 108 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.109 = INTEGER: 109 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.110 = INTEGER: 110 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.111 = INTEGER: 111 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.112 = INTEGER: 112 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.113 = INTEGER: 113 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.114 = INTEGER: 114 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.115 = INTEGER: 115 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.116 = INTEGER: 116 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.117 = INTEGER: 117 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.118 = INTEGER: 118 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.119 = INTEGER: 119 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.120 = INTEGER: 120 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.121 = INTEGER: 121 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.122 = INTEGER: 122 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.123 = INTEGER: 123 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.124 = INTEGER: 124 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.125 = INTEGER: 125 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.126 = INTEGER: 126 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.127 = INTEGER: 127 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.128 = INTEGER: 128 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.129 = INTEGER: 129 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.130 = INTEGER: 130 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.131 = INTEGER: 131 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.132 = INTEGER: 132 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.133 = INTEGER: 133 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.134 = INTEGER: 134 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.135 = INTEGER: 135 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.136 = INTEGER: 136 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.137 = INTEGER: 137 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.138 = INTEGER: 138 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.139 = INTEGER: 139 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.140 = INTEGER: 140 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.141 = INTEGER: 141 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.142 = INTEGER: 142 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.143 = INTEGER: 143 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.144 = INTEGER: 144 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.145 = INTEGER: 145 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.146 = INTEGER: 146 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.147 = INTEGER: 147 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.148 = INTEGER: 148 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.149 = INTEGER: 149 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.150 = INTEGER: 150 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.151 = INTEGER: 151 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.152 = INTEGER: 152 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.153 = INTEGER: 153 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.154 = INTEGER: 154 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.155 = INTEGER: 155 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.156 = INTEGER: 156 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.157 = INTEGER: 157 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.158 = INTEGER: 158 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.159 = INTEGER: 159 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.160 = INTEGER: 160 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.161 = INTEGER: 161 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.162 = INTEGER: 162 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.163 = INTEGER: 163 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.164 = INTEGER: 164 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.165 = INTEGER: 165 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.166 = INTEGER: 166 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.167 = INTEGER: 167 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.168 = INTEGER: 168 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.169 = INTEGER: 169 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.170 = INTEGER: 170 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.171 = INTEGER: 171 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.172 = INTEGER: 172 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.173 = INTEGER: 173 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.174 = INTEGER: 174 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.175 = INTEGER: 175 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.176 = INTEGER: 176 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.177 = INTEGER: 177 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.178 = INTEGER: 178 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.179 = INTEGER: 179 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.180 = INTEGER: 180 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.181 = INTEGER: 181 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.182 = INTEGER: 182 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.183 = INTEGER: 183 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.184 = INTEGER: 184 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.185 = INTEGER: 185 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.186 = INTEGER: 186 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.187 = INTEGER: 187 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.188 = INTEGER: 188 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.189 = INTEGER: 189 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.190 = INTEGER: 190 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.191 = INTEGER: 191 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.192 = INTEGER: 192 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.193 = INTEGER: 193 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.194 = INTEGER: 194 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.195 = INTEGER: 195 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.196 = INTEGER: 196 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.197 = INTEGER: 197 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.198 = INTEGER: 198 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.199 = INTEGER: 199 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.200 = INTEGER: 200 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.201 = INTEGER: 201 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.202 = INTEGER: 202 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.203 = INTEGER: 203 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.204 = INTEGER: 204 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.205 = INTEGER: 205 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.206 = INTEGER: 206 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.207 = INTEGER: 207 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.208 = INTEGER: 208 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.209 = INTEGER: 209 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.210 = INTEGER: 210 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.211 = INTEGER: 211 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.212 = INTEGER: 212 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.213 = INTEGER: 213 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.214 = INTEGER: 214 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.215 = INTEGER: 215 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.216 = INTEGER: 216 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.217 = INTEGER: 217 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.218 = INTEGER: 218 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.219 = INTEGER: 219 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.220 = INTEGER: 220 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.221 = INTEGER: 221 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.222 = INTEGER: 222 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.223 = INTEGER: 223 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.224 = INTEGER: 224 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.225 = INTEGER: 225 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.226 = INTEGER: 226 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.227 = INTEGER: 227 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.228 = INTEGER: 228 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.229 = INTEGER: 229 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.230 = INTEGER: 230 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.231 = INTEGER: 231 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.232 = INTEGER: 232 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.233 = INTEGER: 233 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.234 = INTEGER: 234 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.235 = INTEGER: 235 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.236 = INTEGER: 236 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.237 = INTEGER: 237 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.238 = INTEGER: 238 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.239 = INTEGER: 239 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.1 = STRING: "90P3793" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.2 = STRING: "90P3697" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.3 = STRING: "13N1605" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.4 = STRING: "13N1607" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.5 = STRING: "39M3420" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.6 = STRING: "13N2346" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.7 = STRING: "59P6624" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.8 = STRING: "90P3711" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.9 = STRING: "90P3711" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.10 = STRING: "39M3418" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.11 = STRING: "13N1605" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.12 = STRING: "13N1607" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.13 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.14 = STRING: "90P3711" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.15 = STRING: "90P3714" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.16 = STRING: "90P3714" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.17 = STRING: "90P3697" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.18 = STRING: "13N0504" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.19 = STRING: "13N2292" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.20 = STRING: "73P9092" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.21 = STRING: "31R3389" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.22 = STRING: "13N1605" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.23 = STRING: "59P6624" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.24 = STRING: "25K8238" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.25 = STRING: "13N1607" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.26 = STRING: "13N2346" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.27 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.28 = STRING: "13N0504" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.29 = STRING: "13N0504" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.30 = STRING: "31R3389" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.31 = STRING: "31R3389" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.32 = STRING: "13N0497" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.33 = STRING: "90P3711" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.34 = STRING: "90P3793" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.35 = STRING: "13N0497" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.36 = STRING: "13N0497" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.37 = STRING: "13N2346" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.38 = STRING: "59P6624" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.39 = STRING: "39M3418" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.40 = STRING: "13N1605" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.41 = STRING: "13N1607" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.42 = STRING: "39M3420" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.43 = STRING: "90P3711" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.44 = STRING: "90P3711" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.45 = STRING: "90P3793" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.46 = STRING: "90P3711" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.47 = STRING: "90P3711" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.48 = STRING: "J85503A" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.49 = STRING: "13N1605" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.50 = STRING: "13N1607" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.51 = STRING: "13N1605" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.52 = STRING: "13N1605" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.53 = STRING: "90P4769" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.54 = STRING: "13N1607" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.55 = STRING: "13N1607" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.56 = STRING: "13N2346" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.57 = STRING: "13N2346" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.58 = STRING: "J85503A" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.59 = STRING: "J85503A" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.60 = STRING: "13N1605" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.61 = STRING: "13N1607" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.62 = STRING: "59P6624" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.63 = STRING: "25K8238" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.64 = STRING: "13N1605" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.65 = STRING: "59P6624" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.66 = STRING: "25K8238" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.67 = STRING: "13N1607" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.68 = STRING: "J85503A" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.69 = STRING: "J85503A" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.70 = STRING: "13N2346" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.71 = STRING: "13N2346" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.72 = STRING: "13N0504" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.73 = STRING: "13N0504" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.74 = STRING: "90P3793" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.75 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.76 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.77 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.78 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.79 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.80 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.81 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.82 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.83 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.84 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.85 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.86 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.87 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.88 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.89 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.90 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.91 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.92 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.93 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.94 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.95 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.96 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.97 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.98 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.99 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.100 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.101 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.102 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.103 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.104 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.105 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.106 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.107 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.108 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.109 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.110 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.111 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.112 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.113 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.114 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.115 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.116 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.117 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.118 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.119 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.120 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.121 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.122 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.123 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.124 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.125 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.126 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.127 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.128 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.129 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.130 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.131 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.132 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.133 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.134 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.135 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.136 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.137 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.138 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.139 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.140 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.141 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.142 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.143 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.144 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.145 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.146 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.147 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.148 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.149 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.150 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.151 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.152 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.153 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.154 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.155 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.156 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.157 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.158 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.159 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.160 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.161 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.162 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.163 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.164 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.165 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.166 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.167 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.168 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.169 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.170 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.171 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.172 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.173 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.174 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.175 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.176 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.177 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.178 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.179 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.180 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.181 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.182 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.183 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.184 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.185 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.186 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.187 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.188 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.189 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.190 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.191 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.192 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.193 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.194 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.195 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.196 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.197 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.198 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.199 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.200 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.201 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.202 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.203 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.204 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.205 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.206 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.207 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.208 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.209 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.210 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.211 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.212 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.213 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.214 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.215 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.216 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.217 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.218 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.219 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.220 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.221 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.222 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.223 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.224 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.225 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.226 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.227 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.228 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.229 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.230 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.231 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.232 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.233 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.234 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.235 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.236 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.237 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.238 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.239 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.1 = STRING: "ZJ1UKR4CW00K" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.2 = STRING: "348ICHT00091" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.3 = STRING: "YJ1SM045703H" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.4 = STRING: "YJ1SM1447091" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.5 = STRING: "ZK11LG59XR12" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.6 = STRING: "ZJ1WLX48511J" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.7 = STRING: "J1RJH33J10Z" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.8 = STRING: "000E0C635C92" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.9 = STRING: "000E0C635832" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.10 = STRING: "ZK11LK5A3131" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.11 = STRING: "YJ1SM045703W" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.12 = STRING: "YJ1SM14L60N4" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.13 = STRING: "J1UKP00242" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.14 = STRING: "000E0C635B52" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.15 = STRING: "ZJ1UKT43J066" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.16 = STRING: "ZJ1UKT43J02X" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.17 = STRING: "J1UKS43F040" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.18 = STRING: "ZJ1W6745E17L" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.19 = STRING: "ZJ1TS741T1GG" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.20 = STRING: "J1RJW3671EH" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.21 = STRING: "ZJ1Z0051W00B" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.22 = STRING: "YJ1SM045701G" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.23 = STRING: "J1RJH3BH12J" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.24 = STRING: "ZJ1VZU45510W" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.25 = STRING: "YJ1SM14S601M" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.26 = STRING: "ZJ1WLX48512Y" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.27 = STRING: "J1UKR438006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.28 = STRING: "ZJ1W6745E17L" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.29 = STRING: "ZJ1W6745E17L" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.30 = STRING: "ZJ1Z0051W00B" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.31 = STRING: "ZJ1Z0051W00B" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.32 = STRING: "ZJ1Z9E53B114" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.33 = STRING: "000E0C6356B2" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.34 = STRING: "ZJ1UKR4CW00K" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.35 = STRING: "ZJ1ZB753A10V" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.36 = STRING: "ZJ1Z9E52W101" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.37 = STRING: "ZJ1WLX48511J" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.38 = STRING: "J1RJH33J10Z" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.39 = STRING: "ZK11LK5A3131" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.40 = STRING: "YJ1SM045703W" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.41 = STRING: "YJ1SM14L60N4" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.42 = STRING: "ZK11LG59XR12" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.43 = STRING: "000E0C6356B2" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.44 = STRING: "000E0C635832" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.45 = STRING: "ZJ1UKR4CW00K" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.46 = STRING: "000E0C6356B2" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.47 = STRING: "000E0C6356B2" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.48 = STRING: "ZK11SV5AH10P" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.49 = STRING: "YJ1SM0457035" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.50 = STRING: "YJ1SM14S6013" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.51 = STRING: "YJ1SM0457035" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.52 = STRING: "YJ1SM0457035" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.53 = STRING: "K10XD3AP1AM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.54 = STRING: "YJ1SM14S6013" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.55 = STRING: "YJ1SM14S6013" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.56 = STRING: "ZJ1WLX48512Y" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.57 = STRING: "ZJ1WLX48512Y" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.58 = STRING: "ZK11SV5AH10P" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.59 = STRING: "ZK11SV5AH10P" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.60 = STRING: "YJ1SM045701G" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.61 = STRING: "YJ1SM14S601M" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.62 = STRING: "J1RJH3BH12J" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.63 = STRING: "ZJ1VZU45510W" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.64 = STRING: "YJ1SM045701G" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.65 = STRING: "J1RJH3BH12J" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.66 = STRING: "ZJ1VZU45510W" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.67 = STRING: "YJ1SM14S601M" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.68 = STRING: "ZK11SV5AH10P" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.69 = STRING: "ZK11SV5AH10P" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.70 = STRING: "ZJ1WLX48512Y" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.71 = STRING: "ZJ1WLX48512Y" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.72 = STRING: "ZJ1W6745E17L" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.73 = STRING: "ZJ1W6745E17L" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.74 = STRING: "ZJ1UKR4CW00K" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.75 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.76 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.77 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.78 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.79 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.80 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.81 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.82 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.83 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.84 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.85 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.86 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.87 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.88 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.89 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.90 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.91 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.92 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.93 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.94 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.95 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.96 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.97 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.98 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.99 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.100 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.101 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.102 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.103 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.104 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.105 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.106 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.107 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.108 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.109 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.110 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.111 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.112 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.113 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.114 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.115 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.116 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.117 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.118 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.119 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.120 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.121 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.122 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.123 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.124 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.125 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.126 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.127 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.128 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.129 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.130 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.131 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.132 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.133 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.134 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.135 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.136 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.137 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.138 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.139 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.140 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.141 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.142 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.143 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.144 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.145 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.146 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.147 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.148 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.149 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.150 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.151 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.152 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.153 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.154 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.155 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.156 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.157 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.158 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.159 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.160 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.161 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.162 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.163 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.164 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.165 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.166 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.167 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.168 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.169 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.170 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.171 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.172 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.173 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.174 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.175 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.176 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.177 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.178 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.179 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.180 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.181 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.182 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.183 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.184 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.185 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.186 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.187 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.188 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.189 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.190 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.191 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.192 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.193 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.194 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.195 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.196 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.197 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.198 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.199 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.200 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.201 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.202 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.203 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.204 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.205 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.206 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.207 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.208 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.209 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.210 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.211 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.212 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.213 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.214 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.215 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.216 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.217 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.218 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.219 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.220 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.221 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.222 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.223 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.224 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.225 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.226 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.227 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.228 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.229 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.230 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.231 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.232 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.233 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.234 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.235 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.236 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.237 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.238 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.239 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.1 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.2 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.3 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.4 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.5 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.6 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.7 = STRING: "SLRM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.8 = STRING: "AD " .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.9 = STRING: "AD " .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.10 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.11 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.12 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.13 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.14 = STRING: "AD " .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.15 = STRING: "DELT" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.16 = STRING: "DELT" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.17 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.18 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.19 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.20 = STRING: "SLRM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.21 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.22 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.23 = STRING: "SLRM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.24 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.25 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.26 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.27 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.28 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.29 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.30 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.31 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.32 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.33 = STRING: "AD " .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.34 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.35 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.36 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.37 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.38 = STRING: "SLRM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.39 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.40 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.41 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.42 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.43 = STRING: "AD " .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.44 = STRING: "AD " .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.45 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.46 = STRING: "AD " .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.47 = STRING: "AD #" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.48 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.49 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.50 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.51 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.52 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.53 = STRING: "SLRM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.54 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.55 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.56 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.57 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.58 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.59 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.60 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.61 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.62 = STRING: "SLRM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.63 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.64 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.65 = STRING: "SLRM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.66 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.67 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.68 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.69 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.70 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.71 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.72 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.73 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.74 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.75 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.76 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.77 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.78 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.79 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.80 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.81 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.82 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.83 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.84 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.85 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.86 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.87 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.88 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.89 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.90 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.91 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.92 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.93 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.94 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.95 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.96 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.97 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.98 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.99 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.100 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.101 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.102 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.103 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.104 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.105 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.106 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.107 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.108 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.109 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.110 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.111 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.112 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.113 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.114 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.115 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.116 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.117 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.118 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.119 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.120 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.121 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.122 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.123 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.124 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.125 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.126 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.127 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.128 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.129 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.130 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.131 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.132 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.133 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.134 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.135 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.136 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.137 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.138 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.139 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.140 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.141 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.142 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.143 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.144 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.145 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.146 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.147 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.148 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.149 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.150 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.151 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.152 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.153 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.154 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.155 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.156 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.157 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.158 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.159 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.160 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.161 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.162 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.163 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.164 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.165 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.166 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.167 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.168 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.169 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.170 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.171 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.172 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.173 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.174 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.175 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.176 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.177 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.178 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.179 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.180 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.181 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.182 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.183 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.184 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.185 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.186 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.187 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.188 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.189 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.190 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.191 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.192 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.193 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.194 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.195 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.196 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.197 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.198 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.199 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.200 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.201 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.202 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.203 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.204 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.205 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.206 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.207 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.208 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.209 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.210 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.211 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.212 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.213 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.214 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.215 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.216 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.217 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.218 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.219 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.220 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.221 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.222 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.223 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.224 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.225 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.226 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.227 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.228 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.229 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.230 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.231 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.232 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.233 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.234 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.235 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.236 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.237 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.238 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.239 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.1 = STRING: "2" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.2 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.3 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.4 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.5 = STRING: "6" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.6 = STRING: "2" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.7 = STRING: "2" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.8 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.9 = STRING: "2" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.10 = STRING: "5" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.11 = STRING: "6" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.12 = STRING: "6" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.13 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.14 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.15 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.16 = STRING: "2" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.17 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.18 = STRING: "5" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.19 = STRING: "3" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.20 = STRING: "3" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.21 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.22 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.23 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.24 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.25 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.26 = STRING: "4" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.27 = STRING: "2" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.28 = STRING: "5" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.29 = STRING: "5" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.30 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.31 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.32 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.33 = STRING: "2" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.34 = STRING: "2" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.35 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.36 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.37 = STRING: "2" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.38 = STRING: "2" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.39 = STRING: "5" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.40 = STRING: "6" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.41 = STRING: "6" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.42 = STRING: "6" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.43 = STRING: "2" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.44 = STRING: "2" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.45 = STRING: "2" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.46 = STRING: "2" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.47 = STRING: "2" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.48 = STRING: "7" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.49 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.50 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.51 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.52 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.53 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.54 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.55 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.56 = STRING: "4" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.57 = STRING: "4" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.58 = STRING: "7" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.59 = STRING: "7" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.60 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.61 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.62 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.63 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.64 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.65 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.66 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.67 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.68 = STRING: "7" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.69 = STRING: "7" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.70 = STRING: "4" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.71 = STRING: "4" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.72 = STRING: "5" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.73 = STRING: "5" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.74 = STRING: "2" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.75 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.76 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.77 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.78 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.79 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.80 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.81 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.82 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.83 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.84 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.85 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.86 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.87 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.88 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.89 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.90 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.91 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.92 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.93 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.94 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.95 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.96 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.97 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.98 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.99 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.100 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.101 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.102 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.103 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.104 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.105 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.106 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.107 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.108 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.109 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.110 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.111 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.112 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.113 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.114 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.115 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.116 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.117 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.118 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.119 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.120 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.121 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.122 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.123 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.124 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.125 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.126 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.127 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.128 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.129 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.130 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.131 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.132 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.133 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.134 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.135 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.136 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.137 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.138 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.139 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.140 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.141 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.142 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.143 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.144 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.145 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.146 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.147 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.148 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.149 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.150 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.151 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.152 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.153 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.154 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.155 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.156 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.157 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.158 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.159 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.160 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.161 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.162 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.163 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.164 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.165 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.166 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.167 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.168 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.169 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.170 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.171 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.172 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.173 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.174 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.175 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.176 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.177 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.178 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.179 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.180 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.181 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.182 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.183 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.184 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.185 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.186 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.187 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.188 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.189 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.190 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.191 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.192 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.193 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.194 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.195 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.196 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.197 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.198 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.199 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.200 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.201 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.202 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.203 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.204 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.205 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.206 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.207 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.208 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.209 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.210 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.211 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.212 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.213 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.214 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.215 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.216 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.217 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.218 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.219 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.220 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.221 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.222 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.223 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.224 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.225 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.226 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.227 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.228 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.229 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.230 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.231 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.232 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.233 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.234 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.235 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.236 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.237 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.238 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.239 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.1 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.2 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.3 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.4 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.5 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.6 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.7 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.8 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.9 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.10 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.11 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.12 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.13 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.14 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.15 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.16 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.17 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.18 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.19 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.20 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.21 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.22 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.23 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.24 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.25 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.26 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.27 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.28 = STRING: "Removed" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.29 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.30 = STRING: "Removed" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.31 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.32 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.33 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.34 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.35 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.36 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.37 = STRING: "Removed" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.38 = STRING: "Removed" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.39 = STRING: "Removed" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.40 = STRING: "Removed" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.41 = STRING: "Removed" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.42 = STRING: "Removed" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.43 = STRING: "Removed" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.44 = STRING: "Removed" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.45 = STRING: "Removed" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.46 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.47 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.48 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.49 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.50 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.51 = STRING: "Removed" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.52 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.53 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.54 = STRING: "Removed" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.55 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.56 = STRING: "Removed" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.57 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.58 = STRING: "Removed" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.59 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.60 = STRING: "Removed" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.61 = STRING: "Removed" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.62 = STRING: "Removed" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.63 = STRING: "Removed" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.64 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.65 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.66 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.67 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.68 = STRING: "Removed" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.69 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.70 = STRING: "Removed" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.71 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.72 = STRING: "Removed" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.73 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.74 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.75 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.76 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.77 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.78 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.79 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.80 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.81 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.82 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.83 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.84 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.85 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.86 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.87 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.88 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.89 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.90 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.91 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.92 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.93 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.94 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.95 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.96 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.97 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.98 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.99 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.100 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.101 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.102 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.103 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.104 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.105 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.106 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.107 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.108 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.109 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.110 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.111 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.112 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.113 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.114 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.115 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.116 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.117 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.118 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.119 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.120 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.121 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.122 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.123 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.124 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.125 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.126 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.127 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.128 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.129 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.130 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.131 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.132 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.133 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.134 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.135 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.136 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.137 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.138 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.139 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.140 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.141 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.142 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.143 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.144 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.145 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.146 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.147 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.148 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.149 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.150 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.151 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.152 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.153 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.154 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.155 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.156 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.157 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.158 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.159 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.160 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.161 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.162 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.163 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.164 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.165 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.166 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.167 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.168 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.169 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.170 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.171 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.172 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.173 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.174 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.175 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.176 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.177 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.178 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.179 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.180 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.181 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.182 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.183 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.184 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.185 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.186 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.187 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.188 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.189 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.190 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.191 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.192 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.193 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.194 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.195 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.196 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.197 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.198 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.199 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.200 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.201 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.202 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.203 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.204 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.205 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.206 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.207 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.208 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.209 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.210 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.211 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.212 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.213 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.214 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.215 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.216 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.217 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.218 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.219 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.220 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.221 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.222 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.223 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.224 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.225 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.226 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.227 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.228 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.229 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.230 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.231 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.232 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.233 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.234 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.235 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.236 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.237 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.238 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.239 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.1 = STRING: "Time:09:16:37,Date:07/26/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.2 = STRING: "Time:17:07:35,Date:01/12/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.3 = STRING: "Time:17:07:38,Date:01/12/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.4 = STRING: "Time:17:07:39,Date:01/12/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.5 = STRING: "Time:17:07:48,Date:01/12/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.6 = STRING: "Time:17:08:52,Date:01/12/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.7 = STRING: "Time:17:08:53,Date:01/12/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.8 = STRING: "Time:17:08:57,Date:01/12/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.9 = STRING: "Time:17:09:00,Date:01/12/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.10 = STRING: "Time:17:27:15,Date:01/12/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.11 = STRING: "Time:19:26:55,Date:01/12/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.12 = STRING: "Time:19:26:59,Date:01/12/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.13 = STRING: "Time:15:50:37,Date:01/13/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.14 = STRING: "Time:15:51:01,Date:01/13/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.15 = STRING: "Time:15:51:02,Date:01/13/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.16 = STRING: "Time:15:51:11,Date:01/13/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.17 = STRING: "Time:15:51:13,Date:01/13/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.18 = STRING: "Time:15:51:14,Date:01/13/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.19 = STRING: "Time:15:51:19,Date:01/13/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.20 = STRING: "Time:15:51:23,Date:01/13/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.21 = STRING: "Time:15:51:24,Date:01/13/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.22 = STRING: "Time:15:51:27,Date:01/13/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.23 = STRING: "Time:15:51:28,Date:01/13/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.24 = STRING: "Time:15:51:28,Date:01/13/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.25 = STRING: "Time:15:51:29,Date:01/13/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.26 = STRING: "Time:15:51:30,Date:01/13/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.27 = STRING: "Time:19:32:09,Date:01/18/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.28 = STRING: "Time:15:47:41,Date:02/06/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.29 = STRING: "Time:15:47:41,Date:02/06/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.30 = STRING: "Time:15:47:47,Date:02/06/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.31 = STRING: "Time:15:47:47,Date:02/06/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.32 = STRING: "Time:14:05:02,Date:02/24/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.33 = STRING: "Time:08:25:31,Date:03/13/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.34 = STRING: "Time:08:51:42,Date:03/23/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.35 = STRING: "Time:20:32:22,Date:01/09/2070" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.36 = STRING: "Time:20:41:59,Date:01/09/2070" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.37 = STRING: "Time:13:00:41,Date:06/19/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.38 = STRING: "Time:13:00:41,Date:06/19/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.39 = STRING: "Time:13:00:41,Date:06/19/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.40 = STRING: "Time:13:00:41,Date:06/19/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.41 = STRING: "Time:13:00:41,Date:06/19/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.42 = STRING: "Time:13:00:41,Date:06/19/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.43 = STRING: "Time:13:00:41,Date:06/19/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.44 = STRING: "Time:13:00:41,Date:06/19/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.45 = STRING: "Time:13:00:41,Date:06/19/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.46 = STRING: "Time:12:23:34,Date:06/20/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.47 = STRING: "Time:07:44:20,Date:06/21/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.48 = STRING: "Time:10:40:19,Date:06/29/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.49 = STRING: "Time:14:32:39,Date:06/29/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.50 = STRING: "Time:14:32:42,Date:06/29/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.51 = STRING: "Time:08:00:03,Date:06/30/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.52 = STRING: "Time:08:00:03,Date:06/30/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.53 = STRING: "Time:08:00:07,Date:06/30/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.54 = STRING: "Time:08:00:08,Date:06/30/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.55 = STRING: "Time:08:00:08,Date:06/30/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.56 = STRING: "Time:08:01:57,Date:06/30/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.57 = STRING: "Time:08:01:57,Date:06/30/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.58 = STRING: "Time:08:27:11,Date:06/30/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.59 = STRING: "Time:08:27:11,Date:06/30/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.60 = STRING: "Time:10:39:19,Date:06/30/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.61 = STRING: "Time:10:39:19,Date:06/30/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.62 = STRING: "Time:10:39:19,Date:06/30/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.63 = STRING: "Time:10:39:19,Date:06/30/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.64 = STRING: "Time:12:57:28,Date:06/30/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.65 = STRING: "Time:12:57:32,Date:06/30/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.66 = STRING: "Time:12:57:33,Date:06/30/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.67 = STRING: "Time:12:57:33,Date:06/30/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.68 = STRING: "Time:14:34:26,Date:06/30/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.69 = STRING: "Time:14:34:26,Date:06/30/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.70 = STRING: "Time:12:55:25,Date:07/19/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.71 = STRING: "Time:12:55:25,Date:07/19/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.72 = STRING: "Time:12:59:24,Date:07/19/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.73 = STRING: "Time:12:59:24,Date:07/19/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.74 = STRING: "Time:09:16:37,Date:07/26/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.75 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.76 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.77 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.78 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.79 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.80 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.81 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.82 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.83 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.84 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.85 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.86 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.87 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.88 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.89 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.90 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.91 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.92 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.93 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.94 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.95 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.96 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.97 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.98 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.99 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.100 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.101 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.102 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.103 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.104 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.105 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.106 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.107 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.108 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.109 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.110 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.111 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.112 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.113 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.114 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.115 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.116 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.117 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.118 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.119 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.120 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.121 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.122 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.123 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.124 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.125 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.126 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.127 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.128 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.129 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.130 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.131 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.132 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.133 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.134 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.135 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.136 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.137 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.138 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.139 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.140 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.141 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.142 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.143 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.144 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.145 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.146 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.147 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.148 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.149 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.150 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.151 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.152 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.153 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.154 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.155 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.156 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.157 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.158 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.159 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.160 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.161 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.162 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.163 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.164 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.165 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.166 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.167 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.168 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.169 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.170 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.171 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.172 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.173 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.174 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.175 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.176 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.177 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.178 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.179 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.180 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.181 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.182 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.183 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.184 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.185 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.186 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.187 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.188 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.189 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.190 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.191 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.192 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.193 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.194 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.195 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.196 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.197 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.198 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.199 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.200 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.201 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.202 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.203 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.204 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.205 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.206 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.207 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.208 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.209 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.210 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.211 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.212 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.213 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.214 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.215 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.216 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.217 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.218 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.219 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.220 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.221 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.222 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.223 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.224 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.225 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.226 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.227 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.228 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.229 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.230 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.231 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.232 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.233 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.234 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.235 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.236 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.237 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.238 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.239 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.3.4.2.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.3.4.2.1.2.1 = STRING: "Severity:INFO Source:SERVPROC Name:BCT-81 Date:08/02/06 Time:09:49:27 Text:System log cleared by user user01." .1.3.6.1.4.1.2.3.51.2.3.4.3.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.3.4.4.0 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.3.4.5.0 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.1.3.0 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.4.1.1.4.0 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.4.1.1.5.0 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.4.1.1.6.0 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.4.1.1.7.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.1.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.1.9 = INTEGER: 9 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.1.10 = INTEGER: 10 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.1.11 = INTEGER: 11 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.1.12 = INTEGER: 12 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.2.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.2.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.2.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.2.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.2.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.2.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.2.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.2.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.2.9 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.2.10 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.2.11 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.2.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.3.1 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.3.2 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.3.3 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.3.4 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.3.5 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.3.6 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.3.7 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.3.8 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.3.9 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.3.10 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.3.11 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.3.12 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.4.1 = STRING: "(No description)" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.4.2 = STRING: "(No description)" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.4.3 = STRING: "(No description)" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.4.4 = STRING: "(No description)" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.4.5 = STRING: "(No description)" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.4.6 = STRING: "(No description)" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.4.7 = STRING: "(No description)" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.4.8 = STRING: "(No description)" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.4.9 = STRING: "(No description)" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.4.10 = STRING: "(No description)" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.4.11 = STRING: "(No description)" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.4.12 = STRING: "(No description)" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.5.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.5.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.5.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.5.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.5.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.5.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.5.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.5.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.5.9 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.5.10 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.5.11 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.5.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.9.1 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.9.2 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.9.3 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.9.4 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.9.5 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.9.6 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.9.7 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.9.8 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.9.9 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.9.10 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.9.11 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.9.12 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.13.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.13.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.13.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.13.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.13.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.13.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.13.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.13.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.13.9 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.13.10 = INTEGER: 43 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.13.11 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.13.12 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.3.30.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.1.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.1.9 = INTEGER: 9 .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.1.10 = INTEGER: 10 .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.1.11 = INTEGER: 11 .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.1.12 = INTEGER: 12 .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.2.1 = STRING: "USERID" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.2.2 = STRING: "user01" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.2.3 = STRING: "user02" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.2.4 = STRING: "user03" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.2.5 = STRING: "user123" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.2.6 = STRING: "(Not configured)" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.2.7 = STRING: "(Not configured)" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.2.8 = STRING: "(Not configured)" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.2.9 = STRING: "(Not configured)" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.2.10 = STRING: "(Not configured)" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.2.11 = STRING: "(Not configured)" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.2.12 = STRING: "user22" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.3.1 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.3.2 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.3.3 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.3.4 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.3.5 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.3.6 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.3.7 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.3.8 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.3.9 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.3.10 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.3.11 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.3.12 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.5.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.5.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.5.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.5.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.5.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.5.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.5.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.5.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.5.9 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.5.10 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.5.11 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.5.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.7.1 = STRING: "VV" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.7.2 = STRING: "aH" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.7.3 = STRING: "Y2" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.7.4 = STRING: "aH" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.7.5 = STRING: "dX" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.7.6 = STRING: "(Not configured)" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.7.7 = STRING: "(Not configured)" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.7.8 = STRING: "(Not configured)" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.7.9 = STRING: "(Not configured)" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.7.10 = STRING: "(Not configured)" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.7.11 = STRING: "(Not configured)" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.7.12 = STRING: "a2" .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.1.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.1.9 = INTEGER: 9 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.1.10 = INTEGER: 10 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.1.11 = INTEGER: 11 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.1.12 = INTEGER: 12 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.2.1 = STRING: "USERID" .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.2.2 = STRING: "user01" .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.2.3 = STRING: "user02" .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.2.4 = STRING: "user03" .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.2.5 = STRING: "user123" .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.2.6 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.2.7 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.2.8 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.2.9 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.2.10 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.2.11 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.2.12 = STRING: "user22" .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.3.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.3.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.3.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.3.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.3.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.3.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.3.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.3.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.3.9 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.3.10 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.3.11 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.3.12 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.4.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.4.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.4.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.4.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.4.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.4.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.4.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.4.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.4.9 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.4.10 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.4.11 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.4.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.5.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.5.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.5.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.5.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.5.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.5.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.5.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.5.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.5.9 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.5.10 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.5.11 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.5.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.6.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.6.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.6.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.6.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.6.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.6.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.6.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.6.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.6.9 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.6.10 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.6.11 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.6.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.7.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.7.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.7.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.7.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.7.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.7.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.7.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.7.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.7.9 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.7.10 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.7.11 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.7.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.8.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.8.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.8.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.8.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.8.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.8.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.8.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.8.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.8.9 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.8.10 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.8.11 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.8.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.9.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.9.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.9.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.9.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.9.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.9.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.9.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.9.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.9.9 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.9.10 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.9.11 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.9.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.10.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.10.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.10.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.10.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.10.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.10.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.10.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.10.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.10.9 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.10.10 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.10.11 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.10.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.11.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.11.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.11.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.11.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.11.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.11.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.11.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.11.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.11.9 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.11.10 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.11.11 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.11.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.12.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.12.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.12.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.12.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.12.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.12.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.12.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.12.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.12.9 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.12.10 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.12.11 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.12.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.1.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.1.9 = INTEGER: 9 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.1.10 = INTEGER: 10 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.1.11 = INTEGER: 11 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.1.12 = INTEGER: 12 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.2.1 = STRING: "USERID" .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.2.2 = STRING: "user01" .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.2.3 = STRING: "user02" .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.2.4 = STRING: "user03" .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.2.5 = STRING: "user123" .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.2.6 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.2.7 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.2.8 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.2.9 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.2.10 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.2.11 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.2.12 = STRING: "user22" .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.3.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.3.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.3.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.3.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.3.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.3.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.3.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.3.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.3.9 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.3.10 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.3.11 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.3.12 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.4.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.4.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.4.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.4.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.4.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.4.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.4.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.4.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.4.9 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.4.10 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.4.11 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.4.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.5.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.5.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.5.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.5.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.5.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.5.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.5.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.5.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.5.9 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.5.10 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.5.11 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.5.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.6.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.6.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.6.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.6.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.6.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.6.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.6.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.6.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.6.9 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.6.10 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.6.11 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.6.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.7.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.7.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.7.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.7.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.7.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.7.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.7.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.7.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.7.9 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.7.10 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.7.11 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.7.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.8.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.8.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.8.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.8.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.8.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.8.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.8.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.8.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.8.9 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.8.10 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.8.11 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.8.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.9.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.9.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.9.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.9.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.9.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.9.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.9.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.9.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.9.9 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.9.10 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.9.11 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.9.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.10.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.10.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.10.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.10.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.10.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.10.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.10.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.10.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.10.9 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.10.10 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.10.11 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.10.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.11.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.11.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.11.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.11.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.11.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.11.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.11.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.11.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.11.9 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.11.10 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.11.11 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.11.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.12.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.12.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.12.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.12.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.12.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.12.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.12.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.12.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.12.9 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.12.10 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.12.11 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.12.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.13.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.13.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.13.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.13.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.13.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.13.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.13.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.13.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.13.9 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.13.10 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.13.11 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.13.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.14.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.14.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.14.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.14.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.14.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.14.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.14.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.14.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.14.9 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.14.10 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.14.11 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.14.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.15.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.15.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.15.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.15.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.15.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.15.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.15.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.15.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.15.9 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.15.10 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.15.11 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.15.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.16.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.16.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.16.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.16.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.16.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.16.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.16.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.16.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.16.9 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.16.10 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.16.11 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.16.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.1.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.1.9 = INTEGER: 9 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.1.10 = INTEGER: 10 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.1.11 = INTEGER: 11 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.1.12 = INTEGER: 12 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.2.1 = STRING: "USERID" .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.2.2 = STRING: "user01" .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.2.3 = STRING: "user02" .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.2.4 = STRING: "user03" .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.2.5 = STRING: "user123" .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.2.6 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.2.7 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.2.8 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.2.9 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.2.10 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.2.11 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.2.12 = STRING: "user12" .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.3.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.3.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.3.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.3.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.3.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.3.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.3.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.3.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.3.9 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.3.10 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.3.11 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.3.12 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.4.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.4.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.4.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.4.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.4.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.4.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.4.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.4.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.4.9 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.4.10 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.4.11 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.4.12 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.5.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.5.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.5.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.5.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.5.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.5.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.5.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.5.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.5.9 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.5.10 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.5.11 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.5.12 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.6.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.6.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.6.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.6.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.6.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.6.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.6.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.6.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.6.9 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.6.10 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.6.11 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.6.12 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.7.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.7.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.7.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.7.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.7.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.7.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.7.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.7.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.7.9 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.7.10 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.7.11 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.7.12 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.8.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.8.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.8.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.8.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.8.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.8.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.8.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.8.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.8.9 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.8.10 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.8.11 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.8.12 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.9.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.9.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.9.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.9.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.9.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.9.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.9.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.9.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.9.9 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.9.10 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.9.11 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.9.12 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.10.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.10.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.10.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.10.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.10.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.10.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.10.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.10.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.10.9 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.10.10 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.10.11 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.10.12 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.11.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.11.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.11.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.11.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.11.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.11.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.11.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.11.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.11.9 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.11.10 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.11.11 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.11.12 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.12.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.12.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.12.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.12.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.12.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.12.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.12.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.12.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.12.9 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.12.10 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.12.11 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.12.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.13.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.13.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.13.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.13.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.13.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.13.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.13.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.13.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.13.9 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.13.10 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.13.11 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.13.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.14.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.14.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.14.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.14.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.14.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.14.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.14.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.14.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.14.9 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.14.10 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.14.11 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.14.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.15.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.15.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.15.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.15.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.15.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.15.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.15.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.15.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.15.9 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.15.10 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.15.11 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.15.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.16.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.16.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.16.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.16.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.16.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.16.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.16.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.16.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.16.9 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.16.10 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.16.11 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.16.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.17.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.17.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.17.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.17.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.17.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.17.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.17.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.17.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.17.9 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.17.10 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.17.11 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.17.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.18.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.18.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.18.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.18.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.18.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.18.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.18.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.18.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.18.9 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.18.10 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.18.11 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.18.12 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.19.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.19.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.19.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.19.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.19.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.19.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.19.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.19.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.19.9 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.19.10 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.19.11 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.19.12 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.20.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.20.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.20.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.20.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.20.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.20.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.20.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.20.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.20.9 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.20.10 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.20.11 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.20.12 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.21.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.21.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.21.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.21.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.21.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.21.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.21.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.21.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.21.9 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.21.10 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.21.11 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.21.12 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.2.1.1.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.2.1.2.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.2.1.4.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.2.1.5.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.2.1.6.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.2.1.7.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.2.1.8.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.2.1.9.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.2.2.2.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.2.2.3.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.2.2.4.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.2.2.6.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.2.2.7.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.2.3.4.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.2.3.5.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.2.3.8.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.2.3.10.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.2.3.11.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.2.3.12.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.2.3.13.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.2.3.14.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.4.1.0 = STRING: "08/02/2006,09:51:53" .1.3.6.1.4.1.2.3.51.2.4.4.2.0 = STRING: "-6:00,yes" .1.3.6.1.4.1.2.3.51.2.4.5.1.0 = STRING: "BCT-81" .1.3.6.1.4.1.2.3.51.2.4.9.1.1.1.0 = STRING: "ETH_EXT" .1.3.6.1.4.1.2.3.51.2.4.9.1.1.3.0 = STRING: "MM010101010101" .1.3.6.1.4.1.2.3.51.2.4.9.1.1.4.0 = IpAddress: 192.168.70.125 .1.3.6.1.4.1.2.3.51.2.4.9.1.1.5.0 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.4.9.1.1.6.0 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.4.9.1.1.7.0 = STRING: "01:01:01:01:01:01" .1.3.6.1.4.1.2.3.51.2.4.9.1.1.8.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.1.1.9.0 = IpAddress: 192.168.70.1 .1.3.6.1.4.1.2.3.51.2.4.9.1.1.10.0 = STRING: "02:02:02:02:02:02" .1.3.6.1.4.1.2.3.51.2.4.9.1.1.13.0 = INTEGER: 1500 .1.3.6.1.4.1.2.3.51.2.4.9.1.1.14.0 = IpAddress: 255.255.255.0 .1.3.6.1.4.1.2.3.51.2.4.9.1.1.16.1.0 = STRING: "(Not configured)" .1.3.6.1.4.1.2.3.51.2.4.9.1.1.16.2.0 = IpAddress: 0.0.0.0 .1.3.6.1.4.1.2.3.51.2.4.9.1.1.16.3.0 = IpAddress: 0.0.0.0 .1.3.6.1.4.1.2.3.51.2.4.9.1.1.16.4.0 = IpAddress: 0.0.0.0 .1.3.6.1.4.1.2.3.51.2.4.9.1.1.16.5.0 = STRING: "(Not configured)" .1.3.6.1.4.1.2.3.51.2.4.9.1.1.16.6.0 = IpAddress: 0.0.0.0 .1.3.6.1.4.1.2.3.51.2.4.9.1.1.16.7.0 = IpAddress: 0.0.0.0 .1.3.6.1.4.1.2.3.51.2.4.9.1.1.16.8.0 = IpAddress: 0.0.0.0 .1.3.6.1.4.1.2.3.51.2.4.9.1.1.16.9.0 = IpAddress: 0.0.0.0 .1.3.6.1.4.1.2.3.51.2.4.9.1.2.1.0 = STRING: "ETH_INT" .1.3.6.1.4.1.2.3.51.2.4.9.1.2.2.0 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.9.1.2.4.0 = IpAddress: 192.168.70.126 .1.3.6.1.4.1.2.3.51.2.4.9.1.2.5.0 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.4.9.1.2.6.0 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.9.1.2.7.0 = STRING: "00:00:00:00:00:00" .1.3.6.1.4.1.2.3.51.2.4.9.1.2.9.0 = IpAddress: 0.0.0.0 .1.3.6.1.4.1.2.3.51.2.4.9.1.2.10.0 = STRING: "03:03:03:03:03:03" .1.3.6.1.4.1.2.3.51.2.4.9.1.2.13.0 = INTEGER: 1500 .1.3.6.1.4.1.2.3.51.2.4.9.1.2.14.0 = IpAddress: 255.255.255.0 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.1.0 = STRING: "MrBladeCenterTelco" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.2.0 = STRING: "USA" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.3.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.4.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.4.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.4.1.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.4.1.1.2.1 = STRING: "BCT3public" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.4.1.1.2.2 = STRING: "BCT3private" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.4.1.1.2.3 = STRING: "BCT3test" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.4.1.1.3.1 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.4.1.1.3.2 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.4.1.1.3.3 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.4.1.1.4.1 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.4.1.1.4.2 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.4.1.1.4.3 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.4.1.1.5.1 = STRING: "0.0.0.0" " .1.3.6.1.4.1.2.3.51.2.4.9.3.1.4.1.1.5.2 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.4.1.1.5.3 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.4.1.1.6.1 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.4.1.1.6.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.4.1.1.6.3 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.5.0 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.6.0 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.1.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.1.9 = INTEGER: 9 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.1.10 = INTEGER: 10 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.1.11 = INTEGER: 11 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.1.12 = INTEGER: 12 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.2.1 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.2.2 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.2.3 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.2.4 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.2.5 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.2.6 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.2.7 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.2.8 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.2.9 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.2.10 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.2.11 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.2.12 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.3.1 = STRING: "Not configured" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.3.2 = STRING: "Not configured" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.3.3 = STRING: "Not configured" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.3.4 = STRING: "Not configured" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.3.5 = STRING: "Not configured" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.3.6 = STRING: "Not configured" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.3.7 = STRING: "Not configured" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.3.8 = STRING: "Not configured" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.3.9 = STRING: "Not configured" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.3.10 = STRING: "Not configured" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.3.11 = STRING: "Not configured" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.3.12 = STRING: "Not configured" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.4.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.4.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.4.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.4.4 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.4.5 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.4.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.4.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.4.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.4.9 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.4.10 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.4.11 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.4.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.5.1 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.5.2 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.5.3 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.5.4 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.5.5 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.5.6 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.5.7 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.5.8 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.5.9 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.5.10 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.5.11 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.5.12 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.6.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.6.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.6.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.6.4 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.6.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.6.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.6.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.6.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.6.9 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.6.10 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.6.11 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.6.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.7.1 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.7.2 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.7.3 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.7.4 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.7.5 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.7.6 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.7.7 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.7.8 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.7.9 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.7.10 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.7.11 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.7.12 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.8.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.8.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.8.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.8.4 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.8.5 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.8.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.8.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.8.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.8.9 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.8.10 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.8.11 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.8.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.9.1 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.9.2 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.9.3 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.9.4 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.9.5 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.9.6 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.9.7 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.9.8 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.9.9 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.9.10 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.9.11 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.9.12 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.9.3.2.1.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.2.2.0 = IpAddress: 0.0.0.0 .1.3.6.1.4.1.2.3.51.2.4.9.3.2.3.0 = IpAddress: 0.0.0.0 .1.3.6.1.4.1.2.3.51.2.4.9.3.2.4.0 = IpAddress: 0.0.0.0 .1.3.6.1.4.1.2.3.51.2.4.9.3.3.1.0 = STRING: "(Not configured)" .1.3.6.1.4.1.2.3.51.2.4.9.3.3.2.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.4.1.0 = INTEGER: 6000 .1.3.6.1.4.1.2.3.51.2.4.9.3.4.2.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.4.4.0 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.9.3.4.5.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.4.6.0 = IpAddress: 239.255.255.253 .1.3.6.1.4.1.2.3.51.2.4.9.3.5.1.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.5.2.0 = INTEGER: 80 .1.3.6.1.4.1.2.3.51.2.4.9.3.5.3.0 = INTEGER: 443 .1.3.6.1.4.1.2.3.51.2.4.9.3.5.4.0 = INTEGER: 23 .1.3.6.1.4.1.2.3.51.2.4.9.3.5.5.0 = INTEGER: 22 .1.3.6.1.4.1.2.3.51.2.4.9.3.5.6.0 = INTEGER: 161 .1.3.6.1.4.1.2.3.51.2.4.9.3.5.7.0 = INTEGER: 162 .1.3.6.1.4.1.2.3.51.2.4.9.3.6.1.0 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.6.2.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.6.3.0 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.6.4.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.6.5.0 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.6.6.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.6.7.0 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.6.8.0 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.6.9.0 = STRING: "RSA*" .1.3.6.1.4.1.2.3.51.2.4.9.3.6.10.0 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.4.9.3.6.11.0 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.6.12.0 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.6.13.0 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.6.14.0 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.6.15.0 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.6.16.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.6.17.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.6.18.0 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.6.19.0 = STRING: "ldap" .1.3.6.1.4.1.2.3.51.2.4.9.3.7.1.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.7.2.0 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.10.1.1.0 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.10.1.2.0 = INTEGER: 4095 .1.3.6.1.4.1.2.3.51.2.4.10.1.3.0 = INTEGER: 50 .1.3.6.1.4.1.2.3.51.2.4.10.1.4.0 = INTEGER: 250 .1.3.6.1.4.1.2.3.51.2.4.10.1.5.0 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.4.10.1.6.0 = INTEGER: 250 .1.3.6.1.4.1.2.3.51.2.4.10.1.7.0 = STRING: "^[(" .1.3.6.1.4.1.2.3.51.2.4.10.1.8.0 = STRING: "^[R^[r^[R" .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.1.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.2.1 = STRING: "Mor38____FC3" .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.2.2 = STRING: "combo blade" .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.2.3 = STRING: "L99_P_____FC" .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.2.4 = STRING: "G71______SU" .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.2.5 = STRING: "J52_Lin_p64" .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.2.6 = STRING: "combo blade" .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.2.7 = STRING: "combo blade" .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.2.8 = STRING: "M01____RHEL4" .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.3.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.3.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.3.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.3.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.3.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.3.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.3.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.3.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.4.1 = IpAddress: 10.10.10.80 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.4.2 = IpAddress: 10.10.10.81 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.4.3 = IpAddress: 10.10.10.82 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.4.4 = IpAddress: 10.10.10.83 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.4.5 = IpAddress: 10.10.10.84 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.4.6 = IpAddress: 10.10.10.85 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.4.7 = IpAddress: 10.10.10.86 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.4.8 = IpAddress: 10.10.10.87 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.5.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.5.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.5.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.5.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.5.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.5.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.5.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.5.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.6.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.6.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.6.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.6.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.6.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.6.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.6.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.6.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.5.1.1.0 = "" .1.3.6.1.4.1.2.3.51.2.5.1.2.0 = "" .1.3.6.1.4.1.2.3.51.2.5.1.3.0 = "" .1.3.6.1.4.1.2.3.51.2.5.127.1.0 = Hex-STRING: 80 .1.3.6.1.4.1.2.3.51.2.5.127.2.1.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.5.127.2.1.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.5.127.2.1.1.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.5.127.2.1.1.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.5.127.2.1.1.1.2.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.5.127.2.1.1.1.2.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.5.127.2.1.1.1.2.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.5.127.2.1.1.1.2.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.5.127.2.1.1.1.3.1 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.5.127.2.1.1.1.3.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.5.127.2.1.1.1.3.3 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.5.127.2.1.1.1.3.4 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.5.127.2.1.1.1.4.1 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.5.127.2.1.1.1.4.2 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.5.127.2.1.1.1.4.3 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.5.127.2.1.1.1.4.4 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.1.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.2.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.2.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.2.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.2.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.2.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.2.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.2.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.2.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.3.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.3.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.3.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.3.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.3.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.3.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.3.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.3.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.4.1 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.4.2 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.4.3 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.4.4 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.4.5 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.4.6 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.4.7 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.4.8 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.5.1 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.5.2 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.5.3 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.5.4 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.5.5 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.5.6 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.5.7 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.5.8 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.6.1 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.6.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.6.3 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.6.4 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.6.5 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.6.6 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.6.7 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.6.8 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.7.1 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.7.2 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.7.3 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.7.4 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.7.5 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.7.6 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.7.7 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.7.8 = STRING: "0.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.8.1 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.8.2 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.8.3 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.8.4 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.8.5 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.8.6 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.8.7 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.8.8 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.9.1 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.9.2 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.9.3 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.9.4 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.9.5 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.9.6 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.9.7 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.9.8 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.10.1 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.10.2 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.10.3 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.10.4 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.10.5 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.10.6 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.10.7 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.10.8 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.7.4.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.7.7.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.7.20.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.1.0 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.2.0 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.1.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.2.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.2.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.2.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.2.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.2.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.2.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.2.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.2.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.3.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.3.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.3.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.3.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.3.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.3.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.3.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.3.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.4.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.4.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.4.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.4.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.4.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.4.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.4.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.4.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.5.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.5.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.5.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.5.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.5.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.5.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.5.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.5.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.6.1 = STRING: "Mor38____FC3" .1.3.6.1.4.1.2.3.51.2.22.1.3.1.6.2 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.22.1.3.1.6.3 = STRING: "L99_P_____FC" .1.3.6.1.4.1.2.3.51.2.22.1.3.1.6.4 = STRING: "G71______SU" .1.3.6.1.4.1.2.3.51.2.22.1.3.1.6.5 = STRING: "J52_Lin_p64" .1.3.6.1.4.1.2.3.51.2.22.1.3.1.6.6 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.22.1.3.1.6.7 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.22.1.3.1.6.8 = STRING: "M01____RHEL4" .1.3.6.1.4.1.2.3.51.2.22.1.3.1.7.1 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.7.2 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.7.3 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.7.4 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.7.5 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.7.6 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.7.7 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.7.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.8.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.8.2 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.8.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.8.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.8.5 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.8.6 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.8.7 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.8.8 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.9.1 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.9.2 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.9.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.9.4 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.9.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.9.6 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.9.7 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.9.8 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.10.1 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.10.2 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.10.3 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.10.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.10.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.10.6 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.10.7 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.10.8 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.1.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.2.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.2.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.2.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.2.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.2.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.2.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.2.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.2.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.3.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.3.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.3.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.3.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.3.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.3.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.3.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.3.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.4.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.4.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.4.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.4.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.4.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.4.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.4.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.4.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.5.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.5.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.5.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.5.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.5.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.5.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.5.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.5.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.6.1 = STRING: "Mor38____FC3" .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.6.2 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.6.3 = STRING: "L99_P_____FC" .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.6.4 = STRING: "G71______SU" .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.6.5 = STRING: "J52_Lin_p64" .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.6.6 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.6.7 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.6.8 = STRING: "M01____RHEL4" .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.7.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.7.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.7.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.7.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.7.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.7.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.7.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.7.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.8.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.8.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.8.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.8.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.8.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.8.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.8.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.8.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.9.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.9.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.9.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.9.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.9.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.9.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.9.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.9.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.10.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.10.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.10.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.10.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.10.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.10.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.10.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.10.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.2.1.0 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.2.2.0 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.2.3.0 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.2.4.0 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.1.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.2.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.2.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.2.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.2.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.2.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.2.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.2.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.2.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.3.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.3.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.3.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.3.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.3.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.3.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.3.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.3.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.4.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.4.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.4.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.4.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.4.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.4.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.4.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.4.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.5.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.5.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.5.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.5.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.5.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.5.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.5.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.5.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.6.1 = STRING: "Mor38____FC3" .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.6.2 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.6.3 = STRING: "L99_P_____FC" .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.6.4 = STRING: "G71______SU" .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.6.5 = STRING: "J52_Lin_p64" .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.6.6 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.6.7 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.6.8 = STRING: "M01____RHEL4" .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.7.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.7.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.7.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.7.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.7.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.7.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.7.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.7.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.8.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.8.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.8.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.8.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.8.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.8.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.8.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.8.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.9.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.9.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.9.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.9.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.9.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.9.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.9.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.9.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.10.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.10.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.10.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.10.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.10.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.10.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.10.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.10.8 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.11.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.11.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.11.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.11.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.11.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.11.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.11.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.11.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.12.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.12.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.12.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.12.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.12.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.12.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.12.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.12.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.13.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.13.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.13.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.13.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.13.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.13.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.13.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.13.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.14.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.14.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.14.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.14.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.14.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.14.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.14.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.14.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.15.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.15.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.15.3 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.15.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.15.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.15.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.15.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.15.8 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.16.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.16.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.16.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.16.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.16.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.16.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.16.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.16.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.1.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.2.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.2.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.2.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.2.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.2.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.2.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.2.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.2.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.3.1 = STRING: "Good" .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.3.2 = STRING: "(No severity)" .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.3.3 = STRING: "Good" .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.3.4 = STRING: "Good" .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.3.5 = STRING: "Good" .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.3.6 = STRING: "(No severity)" .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.3.7 = STRING: "(No severity)" .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.3.8 = STRING: "Good" .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.4.1 = STRING: "No critical or warning events" .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.4.2 = STRING: "(No description)" .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.4.3 = STRING: "No critical or warning events" .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.4.4 = STRING: "No critical or warning events" .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.4.5 = STRING: "No critical or warning events" .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.4.6 = STRING: "(No description)" .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.4.7 = STRING: "(No description)" .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.4.8 = STRING: "No critical or warning events" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.1.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.2.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.2.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.2.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.2.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.2.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.2.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.2.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.2.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.3.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.3.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.3.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.3.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.3.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.3.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.3.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.3.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.4.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.4.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.4.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.4.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.4.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.4.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.4.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.4.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.5.1 = STRING: "Mor38____FC3" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.5.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.5.3 = STRING: "L99_P_____FC" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.5.4 = STRING: "G71______SU" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.5.5 = STRING: "J52_Lin_p64" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.5.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.5.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.5.8 = STRING: "M01____RHEL4" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.6.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.6.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.6.3 = STRING: "44.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.6.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.6.5 = STRING: "73.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.6.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.6.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.6.8 = STRING: "28.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.7.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.7.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.7.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.7.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.7.5 = STRING: "69.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.7.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.7.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.7.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.8.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.8.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.8.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.8.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.8.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.8.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.8.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.8.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.9.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.9.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.9.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.9.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.9.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.9.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.9.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.9.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.10.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.10.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.10.3 = STRING: "35.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.10.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.10.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.10.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.10.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.10.8 = STRING: "44.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.11.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.11.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.11.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.11.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.11.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.11.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.11.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.11.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.12.1 = STRING: "CPU1 TEMP = +45.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.12.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.12.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.12.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.12.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.12.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.12.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.12.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.13.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.13.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.13.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.13.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.13.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.13.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.13.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.13.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.14.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.14.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.14.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.14.4 = STRING: "CPU1 TEMP = +67.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.14.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.14.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.14.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.14.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.15.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.15.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.15.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.15.4 = STRING: "CPU2 TEMP = +55.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.15.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.15.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.15.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.15.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.16.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.16.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.16.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.16.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.16.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.16.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.16.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.16.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.17.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.17.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.17.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.17.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.17.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.17.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.17.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.17.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.1.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.2.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.2.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.2.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.2.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.2.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.2.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.2.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.2.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.3.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.3.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.3.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.3.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.3.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.3.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.3.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.3.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.4.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.4.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.4.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.4.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.4.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.4.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.4.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.4.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.5.1 = STRING: "Mor38____FC3" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.5.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.5.3 = STRING: "L99_P_____FC" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.5.4 = STRING: "G71______SU" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.5.5 = STRING: "J52_Lin_p64" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.5.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.5.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.5.8 = STRING: "M01____RHEL4" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.6.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.6.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.6.3 = STRING: "95.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.6.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.6.5 = STRING: "105.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.6.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.6.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.6.8 = STRING: "80.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.7.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.7.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.7.3 = STRING: "85.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.7.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.7.5 = STRING: "90.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.7.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.7.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.7.8 = STRING: "73.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.8.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.8.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.8.3 = STRING: "78.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.8.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.8.5 = STRING: "88.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.8.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.8.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.8.8 = STRING: "71.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.9.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.9.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.9.3 = STRING: "95.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.9.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.9.5 = STRING: "105.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.9.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.9.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.9.8 = STRING: "80.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.10.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.10.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.10.3 = STRING: "85.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.10.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.10.5 = STRING: "90.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.10.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.10.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.10.8 = STRING: "73.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.11.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.11.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.11.3 = STRING: "78.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.11.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.11.5 = STRING: "88.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.11.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.11.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.11.8 = STRING: "71.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.12.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.12.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.12.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.12.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.12.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.12.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.12.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.12.8 = STRING: "80.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.13.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.13.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.13.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.13.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.13.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.13.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.13.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.13.8 = STRING: "73.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.14.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.14.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.14.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.14.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.14.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.14.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.14.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.14.8 = STRING: "71.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.15.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.15.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.15.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.15.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.15.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.15.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.15.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.15.8 = STRING: "80.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.16.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.16.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.16.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.16.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.16.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.16.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.16.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.16.8 = STRING: "73.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.17.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.17.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.17.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.17.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.17.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.17.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.17.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.17.8 = STRING: "71.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.18.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.18.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.18.3 = STRING: "64.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.18.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.18.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.18.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.18.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.18.8 = STRING: "65.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.19.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.19.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.19.3 = STRING: "56.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.19.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.19.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.19.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.19.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.19.8 = STRING: "57.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.20.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.20.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.20.3 = STRING: "49.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.20.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.20.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.20.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.20.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.20.8 = STRING: "55.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.21.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.21.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.21.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.21.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.21.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.21.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.21.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.21.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.22.1 = STRING: "CPU1 TEMP = +85.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.22.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.22.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.22.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.22.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.22.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.22.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.22.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.23.1 = STRING: "CPU1 TEMP = +70.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.23.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.23.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.23.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.23.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.23.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.23.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.23.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.24.1 = STRING: "CPU1 TEMP = +66.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.24.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.24.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.24.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.24.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.24.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.24.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.24.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.25.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.25.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.25.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.25.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.25.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.25.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.25.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.25.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.26.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.26.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.26.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.26.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.26.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.26.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.26.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.26.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.27.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.27.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.27.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.27.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.27.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.27.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.27.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.27.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.28.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.28.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.28.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.28.4 = STRING: "CPU1 TEMP = +95.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.28.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.28.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.28.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.28.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.29.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.29.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.29.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.29.4 = STRING: "CPU1 TEMP = +85.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.29.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.29.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.29.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.29.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.30.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.30.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.30.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.30.4 = STRING: "CPU1 TEMP = +78.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.30.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.30.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.30.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.30.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.31.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.31.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.31.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.31.4 = STRING: "CPU2 TEMP = +95.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.31.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.31.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.31.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.31.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.32.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.32.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.32.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.32.4 = STRING: "CPU2 TEMP = +85.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.32.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.32.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.32.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.32.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.33.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.33.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.33.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.33.4 = STRING: "CPU2 TEMP = +78.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.33.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.33.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.33.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.33.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.34.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.34.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.34.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.34.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.34.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.34.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.34.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.34.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.35.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.35.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.35.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.35.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.35.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.35.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.35.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.35.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.36.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.36.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.36.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.36.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.36.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.36.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.36.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.36.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.37.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.37.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.37.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.37.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.37.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.37.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.37.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.37.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.38.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.38.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.38.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.38.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.38.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.38.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.38.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.38.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.39.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.39.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.39.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.39.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.39.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.39.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.39.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.39.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.1.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.2.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.2.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.2.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.2.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.2.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.2.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.2.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.2.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.3.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.3.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.3.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.3.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.3.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.3.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.3.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.3.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.4.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.4.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.4.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.4.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.4.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.4.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.4.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.4.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.5.1 = STRING: "Mor38____FC3" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.5.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.5.3 = STRING: "L99_P_____FC" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.5.4 = STRING: "G71______SU" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.5.5 = STRING: "J52_Lin_p64" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.5.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.5.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.5.8 = STRING: "M01____RHEL4" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.6.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.6.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.6.3 = STRING: "+5.16 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.6.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.6.5 = STRING: "+5.04 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.6.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.6.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.6.8 = STRING: "+5.04 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.7.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.7.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.7.3 = STRING: "+3.35 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.7.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.7.5 = STRING: "+3.33 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.7.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.7.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.7.8 = STRING: "+3.28 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.8.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.8.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.8.3 = STRING: "+12.25 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.8.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.8.5 = STRING: "+12.28 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.8.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.8.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.8.8 = STRING: "+12.34 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.10.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.10.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.10.3 = STRING: "+2.58 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.10.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.10.5 = STRING: "+2.50 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.10.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.10.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.10.8 = STRING: "+2.55 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.11.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.11.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.11.3 = STRING: "+1.51 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.11.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.11.5 = STRING: "+1.61 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.11.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.11.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.11.8 = STRING: "+1.52 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.12.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.12.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.12.3 = STRING: "+1.29 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.12.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.12.5 = STRING: "+1.25 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.12.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.12.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.12.8 = STRING: "+1.27 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.13.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.13.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.13.3 = STRING: "+1.50 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.13.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.13.5 = STRING: "(No voltage)" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.13.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.13.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.13.8 = STRING: "+1.47 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.14.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.14.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.14.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.14.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.14.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.14.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.14.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.14.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.15.1 = STRING: "12VSB Sense = +12.17 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.15.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.15.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.15.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.15.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.15.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.15.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.15.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.16.1 = STRING: "1.8VSB Sense = +1.83 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.16.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.16.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.16.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.16.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.16.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.16.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.16.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.17.1 = STRING: "12V Sense = +12.39 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.17.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.17.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.17.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.17.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.17.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.17.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.17.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.18.1 = STRING: "5V Sense = +5.06 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.18.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.18.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.18.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.18.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.18.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.18.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.18.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.19.1 = STRING: "3.3V Sense = +3.33 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.19.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.19.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.19.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.19.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.19.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.19.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.19.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.20.1 = STRING: "1.8V Sense = +1.80 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.20.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.20.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.20.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.20.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.20.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.20.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.20.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.21.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.21.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.21.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.21.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.21.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.21.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.21.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.21.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.22.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.22.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.22.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.22.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.22.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.22.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.22.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.22.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.23.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.23.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.23.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.23.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.23.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.23.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.23.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.23.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.24.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.24.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.24.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.24.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.24.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.24.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.24.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.24.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.25.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.25.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.25.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.25.4 = STRING: "CPU 2 VCore = +1.31 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.25.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.25.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.25.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.25.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.26.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.26.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.26.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.26.4 = STRING: "CPU 1 VCore = +1.31 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.26.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.26.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.26.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.26.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.27.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.27.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.27.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.27.4 = STRING: "VBATT Sense = +3.23 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.27.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.27.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.27.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.27.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.28.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.28.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.28.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.28.4 = STRING: "12VSB Sense = +11.96 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.28.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.28.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.28.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.28.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.29.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.29.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.29.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.29.4 = STRING: "5VSB Sense = +5.04 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.29.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.29.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.29.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.29.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.30.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.30.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.30.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.30.4 = STRING: "3.3VSB Sense = +3.32 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.30.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.30.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.30.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.30.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.31.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.31.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.31.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.31.4 = STRING: "2.5VSB Sense = +2.53 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.31.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.31.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.31.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.31.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.32.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.32.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.32.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.32.4 = STRING: "1.5VSB Sense = +1.49 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.32.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.32.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.32.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.32.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.33.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.33.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.33.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.33.4 = STRING: "1.2VSB Sense = +1.23 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.33.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.33.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.33.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.33.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.34.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.34.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.34.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.34.4 = STRING: "-5V Sense = -4.59 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.34.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.34.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.34.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.34.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.35.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.35.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.35.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.35.4 = STRING: "12V Sense = +12.27 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.35.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.35.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.35.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.35.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.36.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.36.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.36.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.36.4 = STRING: "5V Sense = +4.96 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.36.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.36.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.36.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.36.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.37.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.37.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.37.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.37.4 = STRING: "3.3V Sense = +3.32 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.37.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.37.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.37.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.37.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.38.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.38.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.38.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.38.4 = STRING: "2.5V Sense = +2.48 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.38.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.38.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.38.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.38.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.39.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.39.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.39.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.39.4 = STRING: "1.8V Sense = +1.79 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.39.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.39.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.39.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.39.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.40.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.40.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.40.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.40.4 = STRING: "1.5V Sense = +1.48 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.40.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.40.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.40.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.40.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.41.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.41.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.41.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.41.4 = STRING: "1.2V Sense = +1.18 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.41.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.41.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.41.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.41.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.42.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.42.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.42.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.42.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.42.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.42.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.42.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.42.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.43.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.43.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.43.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.43.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.43.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.43.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.43.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.43.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.44.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.44.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.44.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.44.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.44.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.44.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.44.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.44.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.1.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.2.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.2.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.2.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.2.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.2.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.2.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.2.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.2.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.3.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.3.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.3.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.3.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.3.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.3.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.3.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.3.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.4.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.4.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.4.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.4.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.4.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.4.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.4.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.4.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.5.1 = STRING: "Mor38____FC3" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.5.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.5.3 = STRING: "L99_P_____FC" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.5.4 = STRING: "G71______SU" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.5.5 = STRING: "J52_Lin_p64" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.5.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.5.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.5.8 = STRING: "M01____RHEL4" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.6.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.6.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.6.3 = STRING: "+5.50 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.6.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.6.5 = STRING: "+5.50 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.6.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.6.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.6.8 = STRING: "+5.35 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.7.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.7.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.7.3 = STRING: "+4.40 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.7.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.7.5 = STRING: "+4.40 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.7.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.7.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.7.8 = STRING: "+4.65 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.8.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.8.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.8.3 = STRING: "+3.63 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.8.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.8.5 = STRING: "+3.63 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.8.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.8.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.8.8 = STRING: "+3.52 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.9.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.9.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.9.3 = STRING: "+2.97 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.9.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.9.5 = STRING: "+2.97 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.9.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.9.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.9.8 = STRING: "+3.06 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.10.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.10.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.10.3 = STRING: "+13.20 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.10.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.10.5 = STRING: "+13.20 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.10.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.10.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.10.8 = STRING: "+12.91 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.11.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.11.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.11.3 = STRING: "+10.80 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.11.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.11.5 = STRING: "+10.80 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.11.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.11.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.11.8 = STRING: "+11.27 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.14.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.14.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.14.3 = STRING: "+2.75 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.14.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.14.5 = STRING: "+2.75 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.14.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.14.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.14.8 = STRING: "+2.67 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.15.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.15.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.15.3 = STRING: "+2.25 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.15.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.15.5 = STRING: "+2.25 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.15.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.15.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.15.8 = STRING: "+2.32 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.16.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.16.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.16.3 = STRING: "+1.68 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.16.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.16.5 = STRING: "+1.68 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.16.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.16.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.16.8 = STRING: "+1.60 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.17.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.17.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.17.3 = STRING: "+1.32 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.17.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.17.5 = STRING: "+1.32 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.17.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.17.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.17.8 = STRING: "+1.39 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.18.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.18.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.18.3 = STRING: "+1.40 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.18.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.18.5 = STRING: "+1.40 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.18.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.18.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.18.8 = STRING: "+1.33 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.19.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.19.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.19.3 = STRING: "+1.10 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.19.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.19.5 = STRING: "+1.10 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.19.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.19.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.19.8 = STRING: "+1.16 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.22.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.22.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.22.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.22.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.22.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.22.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.22.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.22.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.23.1 = STRING: "12VSB Sense Hi = +13.19 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.23.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.23.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.23.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.23.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.23.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.23.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.23.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.24.1 = STRING: "12VSB Sense Low = +10.74 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.24.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.24.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.24.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.24.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.24.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.24.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.24.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.25.1 = STRING: "1.8VSB Sense Hi = +1.97 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.25.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.25.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.25.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.25.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.25.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.25.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.25.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.26.1 = STRING: "1.8VSB Sense Low = +1.61 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.26.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.26.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.26.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.26.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.26.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.26.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.26.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.27.1 = STRING: "12V Sense Hi = +13.21 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.27.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.27.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.27.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.27.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.27.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.27.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.27.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.28.1 = STRING: "12V Sense Low = +10.79 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.28.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.28.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.28.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.28.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.28.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.28.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.28.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.29.1 = STRING: "5V Sense Hi = +5.48 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.29.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.29.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.29.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.29.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.29.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.29.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.29.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.30.1 = STRING: "5V Sense Low = +4.39 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.30.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.30.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.30.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.30.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.30.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.30.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.30.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.31.1 = STRING: "3.3V Sense Hi = +3.62 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.31.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.31.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.31.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.31.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.31.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.31.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.31.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.32.1 = STRING: "3.3V Sense Low = +2.96 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.32.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.32.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.32.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.32.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.32.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.32.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.32.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.33.1 = STRING: "1.8V Sense Hi = +1.97 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.33.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.33.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.33.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.33.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.33.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.33.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.33.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.34.1 = STRING: "1.8V Sense Low = +1.61 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.34.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.34.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.34.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.34.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.34.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.34.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.34.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.35.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.35.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.35.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.35.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.35.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.35.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.35.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.35.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.36.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.36.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.36.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.36.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.36.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.36.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.36.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.36.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.37.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.37.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.37.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.37.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.37.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.37.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.37.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.37.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.38.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.38.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.38.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.38.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.38.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.38.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.38.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.38.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.39.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.39.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.39.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.39.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.39.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.39.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.39.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.39.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.40.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.40.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.40.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.40.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.40.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.40.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.40.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.40.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.41.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.41.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.41.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.41.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.41.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.41.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.41.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.41.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.42.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.42.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.42.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.42.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.42.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.42.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.42.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.42.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.43.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.43.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.43.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.43.4 = STRING: "CPU 2 VCore Hi = +2.49 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.43.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.43.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.43.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.43.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.44.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.44.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.44.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.44.4 = STRING: "CPU 2 VCore Low = +0.00 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.44.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.44.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.44.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.44.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.45.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.45.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.45.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.45.4 = STRING: "CPU 1 VCore Hi = +2.98 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.45.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.45.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.45.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.45.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.46.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.46.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.46.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.46.4 = STRING: "CPU 1 VCore Low = +0.00 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.46.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.46.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.46.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.46.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.47.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.47.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.47.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.47.4 = STRING: "VBATT Sense Hi = +3.31 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.47.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.47.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.47.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.47.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.48.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.48.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.48.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.48.4 = STRING: "VBATT Sense Low = +2.71 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.48.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.48.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.48.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.48.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.49.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.49.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.49.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.49.4 = STRING: "12VSB Sense Hi = +13.20 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.49.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.49.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.49.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.49.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.50.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.50.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.50.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.50.4 = STRING: "12VSB Sense Low = +10.78 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.50.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.50.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.50.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.50.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.51.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.51.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.51.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.51.4 = STRING: "5VSB Sense Hi = +5.48 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.51.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.51.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.51.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.51.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.52.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.52.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.52.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.52.4 = STRING: "5VSB Sense Low = +4.50 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.52.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.52.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.52.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.52.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.53.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.53.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.53.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.53.4 = STRING: "3.3VSB Sense Hi = +3.65 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.53.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.53.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.53.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.53.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.54.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.54.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.54.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.54.4 = STRING: "3.3VSB Sense Low = +2.97 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.54.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.54.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.54.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.54.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.55.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.55.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.55.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.55.4 = STRING: "2.5VSB Sense Hi = +2.74 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.55.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.55.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.55.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.55.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.56.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.56.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.56.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.56.4 = STRING: "2.5VSB Sense Low = +2.25 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.56.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.56.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.56.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.56.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.57.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.57.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.57.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.57.4 = STRING: "1.5VSB Sense Hi = +1.64 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.57.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.57.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.57.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.57.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.58.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.58.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.58.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.58.4 = STRING: "1.5VSB Sense Low = +1.35 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.58.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.58.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.58.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.58.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.59.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.59.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.59.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.59.4 = STRING: "1.2VSB Sense Hi = +1.49 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.59.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.59.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.59.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.59.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.60.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.60.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.60.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.60.4 = STRING: "1.2VSB Sense Low = +1.12 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.60.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.60.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.60.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.60.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.61.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.61.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.61.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.61.4 = STRING: "-5V Sense Hi = -4.02 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.61.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.61.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.61.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.61.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.62.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.62.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.62.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.62.4 = STRING: "-5V Sense Low = -5.31 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.62.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.62.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.62.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.62.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.63.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.63.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.63.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.63.4 = STRING: "12V Sense Hi = +13.21 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.63.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.63.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.63.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.63.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.64.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.64.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.64.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.64.4 = STRING: "12V Sense Low = +10.79 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.64.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.64.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.64.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.64.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.65.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.65.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.65.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.65.4 = STRING: "5V Sense Hi = +5.48 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.65.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.65.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.65.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.65.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.66.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.66.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.66.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.66.4 = STRING: "5V Sense Low = +4.49 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.66.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.66.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.66.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.66.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.67.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.67.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.67.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.67.4 = STRING: "3.3V Sense Hi = +3.65 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.67.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.67.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.67.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.67.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.68.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.68.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.68.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.68.4 = STRING: "3.3V Sense Low = +2.97 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.68.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.68.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.68.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.68.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.69.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.69.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.69.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.69.4 = STRING: "2.5V Sense Hi = +2.74 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.69.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.69.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.69.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.69.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.70.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.70.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.70.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.70.4 = STRING: "2.5V Sense Low = +2.24 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.70.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.70.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.70.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.70.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.71.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.71.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.71.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.71.4 = STRING: "1.8V Sense Hi = +1.97 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.71.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.71.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.71.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.71.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.72.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.72.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.72.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.72.4 = STRING: "1.8V Sense Low = +1.61 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.72.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.72.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.72.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.72.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.73.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.73.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.73.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.73.4 = STRING: "1.5V Sense Hi = +1.60 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.73.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.73.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.73.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.73.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.74.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.74.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.74.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.74.4 = STRING: "1.5V Sense Low = +1.31 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.74.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.74.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.74.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.74.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.75.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.75.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.75.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.75.4 = STRING: "1.2V Sense Hi = +1.29 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.75.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.75.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.75.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.75.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.76.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.76.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.76.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.76.4 = STRING: "1.2V Sense Low = +1.05 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.76.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.76.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.76.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.76.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.77.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.77.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.77.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.77.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.77.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.77.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.77.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.77.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.78.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.78.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.78.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.78.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.78.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.78.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.78.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.78.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.79.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.79.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.79.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.79.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.79.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.79.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.79.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.79.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.80.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.80.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.80.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.80.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.80.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.80.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.80.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.80.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.81.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.81.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.81.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.81.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.81.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.81.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.81.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.81.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.82.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.82.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.82.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.82.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.82.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.82.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.82.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.82.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.1.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.2.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.2.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.2.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.2.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.2.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.2.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.2.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.2.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.3.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.3.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.3.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.3.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.3.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.3.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.3.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.3.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.4.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.4.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.4.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.4.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.4.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.4.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.4.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.4.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.5.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.5.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.5.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.5.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.5.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.5.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.5.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.5.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.6.1 = STRING: "Mor38____FC3" .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.6.2 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.6.3 = STRING: "L99_P_____FC" .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.6.4 = STRING: "G71______SU" .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.6.5 = STRING: "J52_Lin_p64" .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.6.6 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.6.7 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.6.8 = STRING: "M01____RHEL4" .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.7.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.7.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.7.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.7.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.7.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.7.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.7.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.7.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.8.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.8.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.8.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.8.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.8.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.8.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.8.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.8.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.9.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.9.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.9.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.9.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.9.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.9.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.9.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.9.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.10.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.10.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.10.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.10.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.10.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.10.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.10.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.10.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.11.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.11.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.11.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.11.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.11.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.11.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.11.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.11.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.12.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.12.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.12.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.12.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.12.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.12.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.12.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.12.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.13.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.13.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.13.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.13.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.13.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.13.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.13.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.13.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.1.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.2.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.2.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.2.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.2.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.2.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.2.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.2.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.2.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.3.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.3.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.3.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.3.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.3.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.3.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.3.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.3.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.4.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.4.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.4.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.4.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.4.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.4.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.4.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.4.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.5.1 = STRING: "Mor38____FC3" .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.5.2 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.5.3 = STRING: "L99_P_____FC" .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.5.4 = STRING: "G71______SU" .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.5.5 = STRING: "J52_Lin_p64" .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.5.6 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.5.7 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.5.8 = STRING: "M01____RHEL4" .1.3.6.1.4.1.2.3.51.2.22.1.7.2.1.0 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.7.2.2.0 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.7.2.3.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.8.0 = IpAddress: 10.10.10.80 .1.3.6.1.4.1.2.3.51.2.22.1.9.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.9.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.9.1.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.1.9.1.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.1.9.1.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.22.1.9.1.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.22.1.9.1.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.22.1.9.1.1.1.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.22.1.9.1.1.2.1 = STRING: "Mor38____FC3" .1.3.6.1.4.1.2.3.51.2.22.1.9.1.1.2.2 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.22.1.9.1.1.2.3 = STRING: "L99_P_____FC" .1.3.6.1.4.1.2.3.51.2.22.1.9.1.1.2.4 = STRING: "G71______SU" .1.3.6.1.4.1.2.3.51.2.22.1.9.1.1.2.5 = STRING: "J52_Lin_p64" .1.3.6.1.4.1.2.3.51.2.22.1.9.1.1.2.6 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.22.1.9.1.1.2.7 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.22.1.9.1.1.2.8 = STRING: "M01____RHEL4" .1.3.6.1.4.1.2.3.51.2.22.1.9.1.1.3.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.9.1.1.3.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.9.1.1.3.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.9.1.1.3.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.9.1.1.3.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.9.1.1.3.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.9.1.1.3.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.9.1.1.3.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.1.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.2.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.2.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.2.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.2.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.2.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.2.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.2.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.2.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.3.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.3.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.3.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.3.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.3.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.3.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.3.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.3.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.4.1 = INTEGER: 4823579 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.4.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.4.3 = INTEGER: 604582 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.4.4 = INTEGER: 521741 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.4.5 = INTEGER: 1198372 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.4.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.4.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.4.8 = INTEGER: 776659 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.2.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.2.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.2.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.2.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.3.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.3.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.3.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.3.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.4.1 = STRING: "FF: Switch module completed POST successfully." .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.4.2 = STRING: "FF: Switch module completed POST successfully." .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.4.3 = STRING: "FF: Switch module completed POST successfully." .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.4.4 = STRING: "FF: Switch module completed POST successfully." .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.5.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.5.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.5.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.5.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.6.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.6.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.6.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.6.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.7.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.7.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.7.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.7.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.8.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.8.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.8.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.8.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.9.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.9.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.9.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.9.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.15.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.15.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.15.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.15.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.2.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.2.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.2.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.2.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.3.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.3.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.3.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.3.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.4.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.4.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.4.3 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.4.4 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.5.1 = STRING: "00:0E:0C:63:5B:52" .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.5.2 = STRING: "00:0E:0C:63:56:B2" .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.5.3 = STRING: "00:C0:DD:02:0A:E9" .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.5.4 = STRING: "00:C0:DD:02:0A:B5" .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.6.1 = IpAddress: 192.168.70.127 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.6.2 = IpAddress: 192.168.70.128 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.6.3 = IpAddress: 192.168.70.129 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.6.4 = IpAddress: 192.168.70.130 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.7.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.7.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.7.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.7.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.8.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.8.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.8.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.8.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.9.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.9.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.9.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.9.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.10.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.10.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.10.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.10.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.11.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.11.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.11.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.11.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.12.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.12.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.12.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.12.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.2.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.2.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.2.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.2.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.3.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.3.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.3.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.3.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.4.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.4.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.4.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.4.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.6.1 = IpAddress: 192.168.70.127 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.6.2 = IpAddress: 192.168.70.128 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.6.3 = IpAddress: 192.168.70.129 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.6.4 = IpAddress: 192.168.70.130 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.7.1 = IpAddress: 255.255.255.0 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.7.2 = IpAddress: 255.255.255.0 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.7.3 = IpAddress: 255.255.255.0 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.7.4 = IpAddress: 255.255.255.0 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.8.1 = IpAddress: 0.0.0.0 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.8.2 = IpAddress: 0.0.0.0 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.8.3 = IpAddress: 0.0.0.0 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.8.4 = IpAddress: 0.0.0.0 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.9.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.9.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.9.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.9.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.2.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.2.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.2.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.2.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.3.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.3.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.3.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.3.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.4.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.4.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.4.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.4.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.6.1 = IpAddress: 192.168.70.127 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.6.2 = IpAddress: 192.168.70.128 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.6.3 = IpAddress: 192.168.70.129 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.6.4 = IpAddress: 192.168.70.130 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.7.1 = IpAddress: 255.255.255.0 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.7.2 = IpAddress: 255.255.255.0 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.7.3 = IpAddress: 255.255.255.0 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.7.4 = IpAddress: 255.255.255.0 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.8.1 = IpAddress: 0.0.0.0 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.8.2 = IpAddress: 0.0.0.0 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.8.3 = IpAddress: 0.0.0.0 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.8.4 = IpAddress: 0.0.0.0 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.9.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.9.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.9.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.9.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.10.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.10.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.10.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.10.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.4.1.0 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.4.2.0 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.4.3.0 = STRING: "BCT-81" .1.3.6.1.4.1.2.3.51.2.22.4.19.0 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.22.4.20.0 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.4.21.0 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.4.22.0 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.4.23.0 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.4.24.0 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.4.25.0 = STRING: "10111001" .1.3.6.1.4.1.2.3.51.2.22.4.29.0 = STRING: "1111" .1.3.6.1.4.1.2.3.51.2.22.4.30.0 = STRING: "11" .1.3.6.1.4.1.2.3.51.2.22.4.31.0 = STRING: "1111" .1.3.6.1.4.1.2.3.51.2.22.4.32.0 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.4.33.0 = STRING: "1111" .1.3.6.1.4.1.2.3.51.2.22.4.34.0 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.4.35.0 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.4.36.0 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.5.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.5.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.5.1.1.2.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.5.1.1.2.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.5.1.1.3.1 = IpAddress: 192.168.70.125 .1.3.6.1.4.1.2.3.51.2.22.5.1.1.3.2 = IpAddress: 192.168.70.125 .1.3.6.1.4.1.2.3.51.2.22.5.1.1.4.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.5.1.1.4.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.9.1.0 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.22.9.2.0 = "" .1.3.6.1.4.1.2.3.51.2.22.9.3.0 = "" .1.3.6.1.4.1.2.3.51.2.22.9.4.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.9.5.0 = STRING: "Flash update fails with 0 percent completion." .1.3.6.1.6.3.10.2.1.1.0 = Hex-STRING: 80 00 04 50 01 09 03 CA 55 .1.3.6.1.6.3.10.2.1.2.0 = INTEGER: 1 .1.3.6.1.6.3.10.2.1.3.0 = INTEGER: 487188 seconds .1.3.6.1.6.3.10.2.1.4.0 = INTEGER: 8192 .1.3.6.1.6.3.11.2.1.1.0 = Counter32: 0 .1.3.6.1.6.3.11.2.1.2.0 = Counter32: 0 .1.3.6.1.6.3.11.2.1.3.0 = Counter32: 0 .1.3.6.1.6.3.12.1.1.0 = INTEGER: 0 .1.3.6.1.6.3.12.1.2.1.2.72.111.115.116.49 = Wrong Type (should be OBJECT IDENTIFIER): INTEGER: 1 .1.3.6.1.6.3.12.1.2.1.2.72.111.115.116.50 = Wrong Type (should be OBJECT IDENTIFIER): INTEGER: 1 .1.3.6.1.6.3.12.1.2.1.2.72.111.115.116.51 = Wrong Type (should be OBJECT IDENTIFIER): INTEGER: 1 .1.3.6.1.6.3.12.1.2.1.2.72.111.115.116.52 = Wrong Type (should be OBJECT IDENTIFIER): INTEGER: 1 .1.3.6.1.6.3.12.1.2.1.2.72.111.115.116.53 = Wrong Type (should be OBJECT IDENTIFIER): INTEGER: 1 .1.3.6.1.6.3.12.1.2.1.2.72.111.115.116.54 = Wrong Type (should be OBJECT IDENTIFIER): INTEGER: 1 .1.3.6.1.6.3.12.1.2.1.2.72.111.115.116.55 = Wrong Type (should be OBJECT IDENTIFIER): INTEGER: 1 .1.3.6.1.6.3.12.1.2.1.2.72.111.115.116.56 = Wrong Type (should be OBJECT IDENTIFIER): INTEGER: 1 .1.3.6.1.6.3.12.1.2.1.2.72.111.115.116.57 = Wrong Type (should be OBJECT IDENTIFIER): INTEGER: 1 .1.3.6.1.6.3.12.1.2.1.3.72.111.115.116.49 = Hex-STRING: 00 00 00 00 .1.3.6.1.6.3.12.1.2.1.3.72.111.115.116.50 = Hex-STRING: 00 00 00 00 .1.3.6.1.6.3.12.1.2.1.3.72.111.115.116.51 = Hex-STRING: 00 00 00 00 .1.3.6.1.6.3.12.1.2.1.3.72.111.115.116.52 = Hex-STRING: 00 00 00 00 .1.3.6.1.6.3.12.1.2.1.3.72.111.115.116.53 = Hex-STRING: 00 00 00 00 .1.3.6.1.6.3.12.1.2.1.3.72.111.115.116.54 = Hex-STRING: 00 00 00 00 .1.3.6.1.6.3.12.1.2.1.3.72.111.115.116.55 = Hex-STRING: 00 00 00 00 .1.3.6.1.6.3.12.1.2.1.3.72.111.115.116.56 = Hex-STRING: 00 00 00 00 .1.3.6.1.6.3.12.1.2.1.3.72.111.115.116.57 = Hex-STRING: 00 00 00 00 .1.3.6.1.6.3.12.1.2.1.4.72.111.115.116.49 = INTEGER: 0 .1.3.6.1.6.3.12.1.2.1.4.72.111.115.116.50 = INTEGER: 0 .1.3.6.1.6.3.12.1.2.1.4.72.111.115.116.51 = INTEGER: 0 .1.3.6.1.6.3.12.1.2.1.4.72.111.115.116.52 = INTEGER: 0 .1.3.6.1.6.3.12.1.2.1.4.72.111.115.116.53 = INTEGER: 0 .1.3.6.1.6.3.12.1.2.1.4.72.111.115.116.54 = INTEGER: 0 .1.3.6.1.6.3.12.1.2.1.4.72.111.115.116.55 = INTEGER: 0 .1.3.6.1.6.3.12.1.2.1.4.72.111.115.116.56 = INTEGER: 0 .1.3.6.1.6.3.12.1.2.1.4.72.111.115.116.57 = INTEGER: 0 .1.3.6.1.6.3.12.1.2.1.5.72.111.115.116.49 = INTEGER: 0 .1.3.6.1.6.3.12.1.2.1.5.72.111.115.116.50 = INTEGER: 0 .1.3.6.1.6.3.12.1.2.1.5.72.111.115.116.51 = INTEGER: 0 .1.3.6.1.6.3.12.1.2.1.5.72.111.115.116.52 = INTEGER: 0 .1.3.6.1.6.3.12.1.2.1.5.72.111.115.116.53 = INTEGER: 0 .1.3.6.1.6.3.12.1.2.1.5.72.111.115.116.54 = INTEGER: 0 .1.3.6.1.6.3.12.1.2.1.5.72.111.115.116.55 = INTEGER: 0 .1.3.6.1.6.3.12.1.2.1.5.72.111.115.116.56 = INTEGER: 0 .1.3.6.1.6.3.12.1.2.1.5.72.111.115.116.57 = INTEGER: 0 .1.3.6.1.6.3.12.1.2.1.6.72.111.115.116.49 = STRING: group1 .1.3.6.1.6.3.12.1.2.1.6.72.111.115.116.50 = STRING: group1 .1.3.6.1.6.3.12.1.2.1.6.72.111.115.116.51 = STRING: group1 .1.3.6.1.6.3.12.1.2.1.6.72.111.115.116.52 = STRING: group1 .1.3.6.1.6.3.12.1.2.1.6.72.111.115.116.53 = STRING: group1 .1.3.6.1.6.3.12.1.2.1.6.72.111.115.116.54 = STRING: group1 .1.3.6.1.6.3.12.1.2.1.6.72.111.115.116.55 = STRING: group1 .1.3.6.1.6.3.12.1.2.1.6.72.111.115.116.56 = STRING: group1 .1.3.6.1.6.3.12.1.2.1.6.72.111.115.116.57 = STRING: group1 .1.3.6.1.6.3.12.1.2.1.7.72.111.115.116.49 = STRING: v3User1 .1.3.6.1.6.3.12.1.2.1.7.72.111.115.116.50 = STRING: v3User2 .1.3.6.1.6.3.12.1.2.1.7.72.111.115.116.51 = STRING: v3User3 .1.3.6.1.6.3.12.1.2.1.7.72.111.115.116.52 = STRING: v3User4 .1.3.6.1.6.3.12.1.2.1.7.72.111.115.116.53 = STRING: v3User5 .1.3.6.1.6.3.12.1.2.1.7.72.111.115.116.54 = STRING: v3User6 .1.3.6.1.6.3.12.1.2.1.7.72.111.115.116.55 = STRING: v3User7 .1.3.6.1.6.3.12.1.2.1.7.72.111.115.116.56 = STRING: v3User8 .1.3.6.1.6.3.12.1.2.1.7.72.111.115.116.57 = STRING: v3User9 .1.3.6.1.6.3.12.1.2.1.8.72.111.115.116.49 = INTEGER: nonVolatile(3) .1.3.6.1.6.3.12.1.2.1.8.72.111.115.116.50 = INTEGER: nonVolatile(3) .1.3.6.1.6.3.12.1.2.1.8.72.111.115.116.51 = INTEGER: nonVolatile(3) .1.3.6.1.6.3.12.1.2.1.8.72.111.115.116.52 = INTEGER: nonVolatile(3) .1.3.6.1.6.3.12.1.2.1.8.72.111.115.116.53 = INTEGER: nonVolatile(3) .1.3.6.1.6.3.12.1.2.1.8.72.111.115.116.54 = INTEGER: nonVolatile(3) .1.3.6.1.6.3.12.1.2.1.8.72.111.115.116.55 = INTEGER: nonVolatile(3) .1.3.6.1.6.3.12.1.2.1.8.72.111.115.116.56 = INTEGER: nonVolatile(3) .1.3.6.1.6.3.12.1.2.1.8.72.111.115.116.57 = INTEGER: nonVolatile(3) .1.3.6.1.6.3.12.1.2.1.9.72.111.115.116.49 = INTEGER: active(1) .1.3.6.1.6.3.12.1.2.1.9.72.111.115.116.50 = INTEGER: active(1) .1.3.6.1.6.3.12.1.2.1.9.72.111.115.116.51 = INTEGER: active(1) .1.3.6.1.6.3.12.1.2.1.9.72.111.115.116.52 = INTEGER: active(1) .1.3.6.1.6.3.12.1.2.1.9.72.111.115.116.53 = INTEGER: active(1) .1.3.6.1.6.3.12.1.2.1.9.72.111.115.116.54 = INTEGER: active(1) .1.3.6.1.6.3.12.1.2.1.9.72.111.115.116.55 = INTEGER: active(1) .1.3.6.1.6.3.12.1.2.1.9.72.111.115.116.56 = INTEGER: active(1) .1.3.6.1.6.3.12.1.2.1.9.72.111.115.116.57 = INTEGER: active(1) .1.3.6.1.6.3.12.1.3.1.2.118.51.85.115.101.114.49 = INTEGER: 3 .1.3.6.1.6.3.12.1.3.1.2.118.51.85.115.101.114.50 = INTEGER: 3 .1.3.6.1.6.3.12.1.3.1.2.118.51.85.115.101.114.51 = INTEGER: 3 .1.3.6.1.6.3.12.1.3.1.2.118.51.85.115.101.114.52 = INTEGER: 3 .1.3.6.1.6.3.12.1.3.1.2.118.51.85.115.101.114.53 = INTEGER: 3 .1.3.6.1.6.3.12.1.3.1.2.118.51.85.115.101.114.54 = INTEGER: 3 .1.3.6.1.6.3.12.1.3.1.2.118.51.85.115.101.114.55 = INTEGER: 3 .1.3.6.1.6.3.12.1.3.1.2.118.51.85.115.101.114.56 = INTEGER: 3 .1.3.6.1.6.3.12.1.3.1.2.118.51.85.115.101.114.57 = INTEGER: 3 .1.3.6.1.6.3.12.1.3.1.3.118.51.85.115.101.114.49 = INTEGER: 3 .1.3.6.1.6.3.12.1.3.1.3.118.51.85.115.101.114.50 = INTEGER: 3 .1.3.6.1.6.3.12.1.3.1.3.118.51.85.115.101.114.51 = INTEGER: 3 .1.3.6.1.6.3.12.1.3.1.3.118.51.85.115.101.114.52 = INTEGER: 3 .1.3.6.1.6.3.12.1.3.1.3.118.51.85.115.101.114.53 = INTEGER: 3 .1.3.6.1.6.3.12.1.3.1.3.118.51.85.115.101.114.54 = INTEGER: 3 .1.3.6.1.6.3.12.1.3.1.3.118.51.85.115.101.114.55 = INTEGER: 3 .1.3.6.1.6.3.12.1.3.1.3.118.51.85.115.101.114.56 = INTEGER: 3 .1.3.6.1.6.3.12.1.3.1.3.118.51.85.115.101.114.57 = INTEGER: 3 .1.3.6.1.6.3.12.1.3.1.4.118.51.85.115.101.114.49 = STRING: USERID .1.3.6.1.6.3.12.1.3.1.4.118.51.85.115.101.114.50 = STRING: .1.3.6.1.6.3.12.1.3.1.4.118.51.85.115.101.114.51 = STRING: .1.3.6.1.6.3.12.1.3.1.4.118.51.85.115.101.114.52 = STRING: .1.3.6.1.6.3.12.1.3.1.4.118.51.85.115.101.114.53 = STRING: .1.3.6.1.6.3.12.1.3.1.4.118.51.85.115.101.114.54 = STRING: .1.3.6.1.6.3.12.1.3.1.4.118.51.85.115.101.114.55 = STRING: .1.3.6.1.6.3.12.1.3.1.4.118.51.85.115.101.114.56 = STRING: .1.3.6.1.6.3.12.1.3.1.4.118.51.85.115.101.114.57 = STRING: .1.3.6.1.6.3.12.1.3.1.5.118.51.85.115.101.114.49 = INTEGER: noAuthNoPriv(1) .1.3.6.1.6.3.12.1.3.1.5.118.51.85.115.101.114.50 = INTEGER: authNoPriv(2) .1.3.6.1.6.3.12.1.3.1.5.118.51.85.115.101.114.51 = INTEGER: noAuthNoPriv(1) .1.3.6.1.6.3.12.1.3.1.5.118.51.85.115.101.114.52 = INTEGER: authPriv(3) .1.3.6.1.6.3.12.1.3.1.5.118.51.85.115.101.114.53 = INTEGER: authNoPriv(2) .1.3.6.1.6.3.12.1.3.1.5.118.51.85.115.101.114.54 = INTEGER: 0 .1.3.6.1.6.3.12.1.3.1.5.118.51.85.115.101.114.55 = INTEGER: 0 .1.3.6.1.6.3.12.1.3.1.5.118.51.85.115.101.114.56 = INTEGER: 0 .1.3.6.1.6.3.12.1.3.1.5.118.51.85.115.101.114.57 = INTEGER: 0 .1.3.6.1.6.3.12.1.3.1.6.118.51.85.115.101.114.49 = INTEGER: 0 .1.3.6.1.6.3.12.1.3.1.6.118.51.85.115.101.114.50 = INTEGER: 0 .1.3.6.1.6.3.12.1.3.1.6.118.51.85.115.101.114.51 = INTEGER: 0 .1.3.6.1.6.3.12.1.3.1.6.118.51.85.115.101.114.52 = INTEGER: 0 .1.3.6.1.6.3.12.1.3.1.6.118.51.85.115.101.114.53 = INTEGER: 0 .1.3.6.1.6.3.12.1.3.1.6.118.51.85.115.101.114.54 = INTEGER: 0 .1.3.6.1.6.3.12.1.3.1.6.118.51.85.115.101.114.55 = INTEGER: 0 .1.3.6.1.6.3.12.1.3.1.6.118.51.85.115.101.114.56 = INTEGER: 0 .1.3.6.1.6.3.12.1.3.1.6.118.51.85.115.101.114.57 = INTEGER: 0 .1.3.6.1.6.3.12.1.3.1.7.118.51.85.115.101.114.49 = INTEGER: 0 .1.3.6.1.6.3.12.1.3.1.7.118.51.85.115.101.114.50 = INTEGER: 0 .1.3.6.1.6.3.12.1.3.1.7.118.51.85.115.101.114.51 = INTEGER: 0 .1.3.6.1.6.3.12.1.3.1.7.118.51.85.115.101.114.52 = INTEGER: 0 .1.3.6.1.6.3.12.1.3.1.7.118.51.85.115.101.114.53 = INTEGER: 0 .1.3.6.1.6.3.12.1.3.1.7.118.51.85.115.101.114.54 = INTEGER: 0 .1.3.6.1.6.3.12.1.3.1.7.118.51.85.115.101.114.55 = INTEGER: 0 .1.3.6.1.6.3.12.1.3.1.7.118.51.85.115.101.114.56 = INTEGER: 0 .1.3.6.1.6.3.12.1.3.1.7.118.51.85.115.101.114.57 = INTEGER: 0 .1.3.6.1.6.3.12.1.4.0 = Wrong Type (should be Counter32): INTEGER: 0 .1.3.6.1.6.3.12.1.5.0 = Wrong Type (should be Counter32): INTEGER: 0 .1.3.6.1.6.3.13.1.1.1.2.103.114.111.117.112.49 = STRING: group1 .1.3.6.1.6.3.13.1.1.1.3.103.114.111.117.112.49 = INTEGER: trap(1) .1.3.6.1.6.3.13.1.1.1.4.103.114.111.117.112.49 = INTEGER: readOnly(5) .1.3.6.1.6.3.13.1.1.1.5.103.114.111.117.112.49 = INTEGER: active(1) .1.3.6.1.6.3.13.1.2.1.1.118.51.85.115.101.114.49 = STRING: filter-2 .1.3.6.1.6.3.13.1.2.1.1.118.51.85.115.101.114.50 = STRING: filter-2 .1.3.6.1.6.3.13.1.2.1.1.118.51.85.115.101.114.51 = STRING: filter-2 .1.3.6.1.6.3.13.1.2.1.1.118.51.85.115.101.114.52 = STRING: filter-2 .1.3.6.1.6.3.13.1.2.1.1.118.51.85.115.101.114.53 = STRING: filter-2 .1.3.6.1.6.3.13.1.2.1.1.118.51.85.115.101.114.54 = STRING: filter-2 .1.3.6.1.6.3.13.1.2.1.1.118.51.85.115.101.114.55 = STRING: filter-2 .1.3.6.1.6.3.13.1.2.1.1.118.51.85.115.101.114.56 = STRING: filter-2 .1.3.6.1.6.3.13.1.2.1.1.118.51.85.115.101.114.57 = STRING: filter-2 .1.3.6.1.6.3.13.1.2.1.2.118.51.85.115.101.114.49 = INTEGER: nonVolatile(3) .1.3.6.1.6.3.13.1.2.1.2.118.51.85.115.101.114.50 = INTEGER: nonVolatile(3) .1.3.6.1.6.3.13.1.2.1.2.118.51.85.115.101.114.51 = INTEGER: nonVolatile(3) .1.3.6.1.6.3.13.1.2.1.2.118.51.85.115.101.114.52 = INTEGER: nonVolatile(3) .1.3.6.1.6.3.13.1.2.1.2.118.51.85.115.101.114.53 = INTEGER: nonVolatile(3) .1.3.6.1.6.3.13.1.2.1.2.118.51.85.115.101.114.54 = INTEGER: nonVolatile(3) .1.3.6.1.6.3.13.1.2.1.2.118.51.85.115.101.114.55 = INTEGER: nonVolatile(3) .1.3.6.1.6.3.13.1.2.1.2.118.51.85.115.101.114.56 = INTEGER: nonVolatile(3) .1.3.6.1.6.3.13.1.2.1.2.118.51.85.115.101.114.57 = INTEGER: nonVolatile(3) .1.3.6.1.6.3.13.1.2.1.3.118.51.85.115.101.114.49 = INTEGER: active(1) .1.3.6.1.6.3.13.1.2.1.3.118.51.85.115.101.114.50 = INTEGER: active(1) .1.3.6.1.6.3.13.1.2.1.3.118.51.85.115.101.114.51 = INTEGER: active(1) .1.3.6.1.6.3.13.1.2.1.3.118.51.85.115.101.114.52 = INTEGER: active(1) .1.3.6.1.6.3.13.1.2.1.3.118.51.85.115.101.114.53 = INTEGER: active(1) .1.3.6.1.6.3.13.1.2.1.3.118.51.85.115.101.114.54 = INTEGER: active(1) .1.3.6.1.6.3.13.1.2.1.3.118.51.85.115.101.114.55 = INTEGER: active(1) .1.3.6.1.6.3.13.1.2.1.3.118.51.85.115.101.114.56 = INTEGER: active(1) .1.3.6.1.6.3.13.1.2.1.3.118.51.85.115.101.114.57 = INTEGER: active(1) .1.3.6.1.6.3.13.1.3.1.2.8.102.105.108.116.101.114.45.49.1.3.6.1 = Hex-STRING: F0 .1.3.6.1.6.3.13.1.3.1.2.8.102.105.108.116.101.114.45.50.1.3.6.1 = Hex-STRING: F0 .1.3.6.1.6.3.13.1.3.1.3.8.102.105.108.116.101.114.45.49.1.3.6.1 = INTEGER: included(1) .1.3.6.1.6.3.13.1.3.1.3.8.102.105.108.116.101.114.45.50.1.3.6.1 = INTEGER: included(1) .1.3.6.1.6.3.13.1.3.1.4.8.102.105.108.116.101.114.45.49.1.3.6.1 = INTEGER: readOnly(5) .1.3.6.1.6.3.13.1.3.1.4.8.102.105.108.116.101.114.45.50.1.3.6.1 = INTEGER: readOnly(5) .1.3.6.1.6.3.13.1.3.1.5.8.102.105.108.116.101.114.45.49.1.3.6.1 = INTEGER: active(1) .1.3.6.1.6.3.13.1.3.1.5.8.102.105.108.116.101.114.45.50.1.3.6.1 = INTEGER: active(1) .1.3.6.1.6.3.15.1.1.1.0 = Counter32: 0 .1.3.6.1.6.3.15.1.1.2.0 = Counter32: 0 .1.3.6.1.6.3.15.1.1.3.0 = Counter32: 0 .1.3.6.1.6.3.15.1.1.4.0 = Counter32: 20 .1.3.6.1.6.3.15.1.1.5.0 = Counter32: 0 .1.3.6.1.6.3.15.1.1.6.0 = Counter32: 0 .1.3.6.1.6.3.15.1.2.1.0 = INTEGER: 0 openhpi-3.6.1/plugins/snmp_bc/t/sim_init.c0000644000175100017510000000763212575647274017532 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #include #include #include #include #include #include #include GHashTable * sim_hash; static void free_hash_data(gpointer key, gpointer value, gpointer user_data); SaHpiBoolT is_simulator(void) { return(SAHPI_TRUE); } SaErrorT sim_banner(struct snmp_bc_hnd *custom_handle) { printf("************************************\n"); printf("************ Simulator *************\n"); if (custom_handle->platform == SNMP_BC_PLATFORM_BC) { printf("****** BladeCenter Integrated ******\n"); } if (custom_handle->platform == SNMP_BC_PLATFORM_BCT) { printf("********** BladeCenter T ***********\n"); } if (custom_handle->platform == SNMP_BC_PLATFORM_BCH) { printf("********** BladeCenter H ***********\n"); } if (custom_handle->platform == SNMP_BC_PLATFORM_BCHT) { printf("********** BladeCenter HT ***********\n"); } if (custom_handle->platform == SNMP_BC_PLATFORM_RSA) { printf("*************** RSA ****************\n"); } printf("************************************\n"); return(SA_OK); } SaErrorT sim_init() { /* ------------------------------------------------ */ /* snmpwalk-based simulator uses */ /* sim_file() and file sim_test_file */ /* sim_test_file is the output of snmpwalk command */ /* snmpwalk $host -On .1 (option -On is important) */ /* ------------------------------------------------ */ sim_file(); /* ------------------------------------------------ */ /* Old snmp_bc simulator uses */ /* followed code and file sim_resources.c */ /* If old method is desired, */ /* 1) comment out sim_file() above */ /* 2) remove #if 0/#endif below */ /* ------------------------------------------------ */ #if 0 int i; sim_hash = g_hash_table_new(g_str_hash, g_str_equal); if (sim_hash == NULL) { err("Cannot allocate simulation hash table"); return(SA_ERR_HPI_INTERNAL_ERROR); } for (i=0; sim_resource_array[i].oid != NULL; i++) { char *key; char *key_exists; SnmpMibInfoT *mibinfo; key = g_strdup(sim_resource_array[i].oid); if (!key) { err("Cannot allocate memory for key for oid=%s", sim_resource_array[i].oid); sim_close(); return(SA_ERR_HPI_INTERNAL_ERROR); } mibinfo = g_malloc0(sizeof(SnmpMibInfoT)); if (!mibinfo) { err("Cannot allocate memory for hash value for oid=%s", sim_resource_array[i].oid); sim_close(); return(SA_ERR_HPI_INTERNAL_ERROR); } key_exists = g_hash_table_lookup(sim_hash, key); if (!key_exists) { mibinfo->type = sim_resource_array[i].mib.type; switch (mibinfo->type) { case ASN_INTEGER: mibinfo->value.integer = sim_resource_array[i].mib.value.integer; break; case ASN_OCTET_STR: strcpy(mibinfo->value.string, sim_resource_array[i].mib.value.string); break; default: err("Unknown SNMP type=%d for oid=%s", mibinfo->type, key); return(SA_ERR_HPI_INTERNAL_ERROR); } g_hash_table_insert(sim_hash, key, mibinfo); } else { err("Oid %s is defined twice", sim_resource_array[i].oid); } } #endif return(SA_OK); } SaErrorT sim_close() { g_hash_table_foreach(sim_hash, free_hash_data, NULL); g_hash_table_destroy(sim_hash); return(SA_OK); } static void free_hash_data(gpointer key, gpointer value, gpointer user_data) { g_free(key); g_free(value); } openhpi-3.6.1/plugins/snmp_bc/t/tsensorset002.c0000644000175100017510000000525312575647274020347 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiResourceIdT id; SaHpiSessionIdT sessionid; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundSensor; SaHpiSensorNumT sid = 0; SaHpiBoolT enable = SAHPI_FALSE; /* ************************************* * Find a resource with Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid,SAHPI_CAPABILITY_SENSOR,SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: find a sensor with desired property **************************/ entryid = SAHPI_FIRST_ENTRY; foundSensor = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if ((rdr.RdrType == SAHPI_SENSOR_RDR) && (rdr.RdrTypeUnion.SensorRec.DataFormat.IsSupported == SAHPI_FALSE)) { foundSensor = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundSensor) { err("Did not find desired resource for test\n"); return(SA_OK); } else { sid = rdr.RdrTypeUnion.SensorRec.Num; } /************************** * Test: invalid Capability **************************/ expected_err = SA_ERR_HPI_READ_ONLY; err = saHpiSensorEnableSet(sessionid, id, sid, enable); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/tsptime002.c0000644000175100017510000000251512575647274017621 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; struct tm time; struct snmp_bc_hnd custom_handle; memset(&time, 0, sizeof(struct tm)); /************************** * Test : Invalid handle **************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = snmp_bc_set_sp_time(NULL, &time); checkstatus(err, expected_err, testfail); /************************** * Test : Invalid pointer to struct **************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = snmp_bc_set_sp_time(&custom_handle, NULL); checkstatus(err, expected_err, testfail); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/tinv004.c0000644000175100017510000000667512575647274017131 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiResourceIdT id = 0; SaHpiSessionIdT sessionid; SaHpiIdrIdT idrId = 0; SaHpiEntryIdT areaId = 0; SaHpiEntryIdT fieldId = 0; SaHpiEntryIdT nextfieldId; SaHpiIdrFieldT field; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundControl; /* ************************************* * Find a resource with inventory capability * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid, SAHPI_CAPABILITY_INVENTORY_DATA, SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Can not find an Inventory resource for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: find an Inventory RDR **************************/ entryid = SAHPI_FIRST_ENTRY; foundControl = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if (rdr.RdrType == SAHPI_INVENTORY_RDR) { foundControl = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundControl) { err("Did not find desired resource for test\n"); return(SA_OK); } else { idrId = rdr.RdrTypeUnion.InventoryRec.IdrId; } /************************** * Test: Invalid handle **************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = snmp_bc_get_idr_field(NULL , id, idrId, areaId, SAHPI_IDR_FIELDTYPE_UNSPECIFIED, fieldId, &nextfieldId, &field); checkstatus(err, expected_err, testfail); /************************** * Test :Invalid NextfieldId * expected_err = SA_ERR_HPI_INVALID_PARAMS; **************************/ err = saHpiIdrFieldGet(sessionid , id, idrId, areaId, SAHPI_IDR_FIELDTYPE_UNSPECIFIED, fieldId, NULL, &field); checkstatus(err, expected_err, testfail); /************************** * Test : Invalid pointer to Field * expected_err = SA_ERR_HPI_INVALID_PARAMS; **************************/ err = saHpiIdrFieldGet(sessionid, id, idrId, areaId, SAHPI_IDR_FIELDTYPE_UNSPECIFIED, fieldId, &nextfieldId, NULL); checkstatus(err, expected_err, testfail); /**************************&* * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/tsensorset011.c0000644000175100017510000000555012575647274020347 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiResourceIdT id; SaHpiSessionIdT sessionid; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundSensor; SaHpiSensorNumT sid = 0; SaHpiSensorEventMaskActionT act = SAHPI_SENS_ADD_EVENTS_TO_MASKS; SaHpiEventStateT assertMask = SAHPI_ES_UPPER_MINOR; SaHpiEventStateT deassertMask = SAHPI_ES_UPPER_CRIT; /* ************************************* * Find a resource with Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid,SAHPI_CAPABILITY_SENSOR,SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: find a sensor with desired property **************************/ entryid = SAHPI_FIRST_ENTRY; foundSensor = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if ((rdr.RdrType == SAHPI_SENSOR_RDR) && (rdr.RdrTypeUnion.SensorRec.EventCtrl != SAHPI_SEC_PER_EVENT)) { foundSensor = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundSensor) { err("Did not find desired resource for test\n"); return(SA_OK); } else { sid = rdr.RdrTypeUnion.SensorRec.Num; } /************************** * Test: Sensor with !SAHPI_SEC_PER_EVENT **************************/ expected_err = SA_ERR_HPI_READ_ONLY; err = saHpiSensorEventMasksSet(sessionid, id, sid, act, assertMask, deassertMask); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/tsensorset019.c0000644000175100017510000000520712575647274020356 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiResourceIdT id = 0; SaHpiSessionIdT sessionid; SaHpiSensorNumT sid = 0; SaHpiSensorThresholdsT thres; /* ************************************* * Find a resource with Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid,SAHPI_CAPABILITY_SENSOR,SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: Invalid handler **************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = snmp_bc_set_sensor_thresholds(NULL, id, sid, &thres); checkstatus(err, expected_err, testfail); /************************** * Test: Invalid pointer **************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = saHpiSensorThresholdsSet(sessionid, id, sid, NULL); checkstatus(err, expected_err, testfail); /************************** * Test: Invalid resource **************************/ expected_err = SA_ERR_HPI_INVALID_RESOURCE; err = saHpiSensorThresholdsSet(sessionid, 5000, sid, &thres); checkstatus(err, expected_err, testfail); /************************** * Test: Invalid sensor id **************************/ expected_err = SA_ERR_HPI_NOT_PRESENT; err = saHpiSensorThresholdsSet(sessionid, id, 5000, &thres); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/tset_resource_sev.c0000644000175100017510000000507412575647274021460 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaHpiResourceIdT id; SaErrorT err; SaErrorT expected_err; SaHpiSeverityT sev; SaHpiRptEntryT rptentry; // DECLARE_HANDLE(); SaHpiSessionIdT sessionid; SaHpiDomainIdT did; struct oh_handler *h = NULL; struct oh_domain *d = NULL; unsigned int *hid = NULL; struct oh_handler_state *handle; /* ************************ * Find a resource with Control type rdr * ***********************/ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid, SAHPI_CAPABILITY_CONTROL, SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return -1; } id = rptentry.ResourceId; INIT_HANDLE(did, d, hid, h, handle); /************************** * Test 1: Invalid severity **************************/ sev = 0xFE; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = snmp_bc_set_resource_severity(handle, id, sev); checkstatus(err, expected_err, testfail); /************************** * Test 2: Invalid ResourceId **************************/ sev = SAHPI_INFORMATIONAL; expected_err = SA_ERR_HPI_INVALID_RESOURCE; err = snmp_bc_set_resource_severity(handle, 5000, sev); checkstatus(err, expected_err, testfail); /************************** * Test 3: Valid case **************************/ sev = SAHPI_INFORMATIONAL; expected_err = SA_OK; err = saHpiResourceSeveritySet(sessionid, id, sev); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/tsensorset012.c0000644000175100017510000000572712575647274020356 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include #define SAHPI_SENS_NONSENSE_ACTION (SaHpiSensorEventMaskActionT) 0xF0 int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiResourceIdT id; SaHpiSessionIdT sessionid; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundSensor; SaHpiSensorNumT sid = 1; SaHpiEventStateT assertMask = SAHPI_ES_UPPER_MINOR; SaHpiEventStateT deassertMask = SAHPI_ES_UPPER_CRIT; SaHpiSensorEventMaskActionT act = SAHPI_SENS_NONSENSE_ACTION; /* ************************************* * Find a resource with Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid,SAHPI_CAPABILITY_SENSOR,SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: find a sensor with desired property **************************/ entryid = SAHPI_FIRST_ENTRY; foundSensor = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if ((rdr.RdrType == SAHPI_SENSOR_RDR) && (rdr.RdrTypeUnion.SensorRec.EventCtrl == SAHPI_SEC_PER_EVENT)) { foundSensor = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundSensor) { err("Did not find desired resource for test\n"); return(SA_OK); } else { sid = rdr.RdrTypeUnion.SensorRec.Num; } /************************** * Test : Invalid data **************************/ act = SAHPI_SENS_NONSENSE_ACTION; expected_err = SA_ERR_HPI_INVALID_DATA; err = saHpiSensorEventMasksSet(sessionid, id, sid, act, assertMask, deassertMask); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/tsensorget033.c0000644000175100017510000000361012575647274020332 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiResourceIdT id; SaHpiSessionIdT sessionid; SaHpiSensorNumT sid = 0; SaHpiBoolT enable; SaHpiRptEntryT rptentry; /* ************************************* * Find a resource with NO Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid, SAHPI_CAPABILITY_SENSOR, SAHPI_FIRST_ENTRY, &rptentry, SAHPI_FALSE); if (err != SA_OK) { dbg("Error! Can not find resources for test environment\n"); dbg(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test Invalid Capability **************************/ expected_err = SA_ERR_HPI_CAPABILITY; err = saHpiSensorEventEnableGet(sessionid, id, sid, &enable); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/tsetup.c0000644000175100017510000001502512575647274017236 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include SaErrorT tsetup (SaHpiSessionIdT *sessionid_ptr) { SaErrorT err; /******************************** * Hook in simulation environment ********************************/ err = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, sessionid_ptr, NULL); if (err != SA_OK) { printf("Error! Cannot open session.\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); } if (!err) err = saHpiDiscover(*sessionid_ptr); if (err != SA_OK) { printf("Error! Cannot discover resources.\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); err = saHpiSessionClose(*sessionid_ptr); } return err; } SaErrorT tfind_resource(SaHpiSessionIdT *sessionid_ptr, SaHpiCapabilitiesT search_rdr_type, SaHpiEntryIdT i_rptentryid, SaHpiRptEntryT *rptentry, SaHpiBoolT samecap) { SaErrorT rvRptGet; SaHpiRptEntryT l_rptentry; SaHpiEntryIdT rptentryid; SaHpiEntryIdT nextrptentryid; SaHpiCapabilitiesT cap_mask; if (!sessionid_ptr) { printf("Error! Invalid test setup.\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return(SA_ERR_HPI_INVALID_PARAMS); } cap_mask = (SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_AGGREGATE_STATUS | SAHPI_CAPABILITY_CONFIGURATION | SAHPI_CAPABILITY_MANAGED_HOTSWAP | SAHPI_CAPABILITY_WATCHDOG | SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_ANNUNCIATOR | SAHPI_CAPABILITY_POWER | SAHPI_CAPABILITY_RESET | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_EVENT_LOG | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_SENSOR); if ((search_rdr_type & cap_mask) == 0) { printf("Error! Invalid resource type.\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return(SA_ERR_HPI_INVALID_PARAMS); } /*************** * Find resource ***************/ rptentryid = SAHPI_FIRST_ENTRY; do { rvRptGet = saHpiRptEntryGet(*sessionid_ptr, rptentryid, &nextrptentryid, &l_rptentry); if (rvRptGet != SA_OK) { printf("Cannot get resource; Error=%s\n", oh_lookup_error(rvRptGet)); } else { if (l_rptentry.ResourceFailed == SAHPI_FALSE) { if (samecap) { if ((l_rptentry.ResourceCapabilities & search_rdr_type)) { memcpy(rptentry,&l_rptentry, sizeof(SaHpiRptEntryT)); break; } } else { if (!(l_rptentry.ResourceCapabilities & search_rdr_type)) { memcpy(rptentry,&l_rptentry, sizeof(SaHpiRptEntryT)); break; } } } else { printf("Resource %s is marked failed.\n", l_rptentry.ResourceTag.Data); } } rptentryid = nextrptentryid; } while ((rvRptGet == SA_OK) && (rptentryid != SAHPI_LAST_ENTRY)); if (rptentryid != SAHPI_LAST_ENTRY) return(SA_OK); return(SA_ERR_HPI_NOT_PRESENT); } SaErrorT tfind_resource_by_ep(SaHpiSessionIdT *sessionid_ptr, SaHpiEntityPathT *ep, SaHpiEntryIdT i_rptentryid, SaHpiRptEntryT *rptentry) { SaErrorT err; SaHpiRptEntryT l_rptentry; SaHpiEntryIdT rptentryid; SaHpiEntryIdT nextrptentryid; if (!sessionid_ptr || !ep || !rptentry) { printf("Error! Invalid test setup.\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return(SA_ERR_HPI_INVALID_PARAMS); } /*************** * Find resource ***************/ rptentryid = SAHPI_FIRST_ENTRY; do { err = saHpiRptEntryGet(*sessionid_ptr, rptentryid, &nextrptentryid, &l_rptentry); if (err) { printf("Cannot get Resource; Error=%s\n", oh_lookup_error(err)); } else { if (l_rptentry.ResourceFailed == SAHPI_FALSE) { if (oh_cmp_ep(ep, &(l_rptentry.ResourceEntity))) { memcpy(rptentry, &l_rptentry, sizeof(SaHpiRptEntryT)); break; } } else { printf("Resource %s is marked failed.\n", l_rptentry.ResourceTag.Data); } } rptentryid = nextrptentryid; } while ((err == SA_OK) && (rptentryid != SAHPI_LAST_ENTRY)); if (rptentryid != SAHPI_LAST_ENTRY) return(SA_OK); return(SA_ERR_HPI_NOT_PRESENT); } SaErrorT tfind_rdr_by_name(SaHpiSessionIdT *sessionid_ptr, SaHpiResourceIdT rid, char *rdr_name, SaHpiRdrT *rdr) { SaErrorT err; SaHpiEntryIdT entryid, nextentryid; SaHpiRdrT working_rdr; if (!sessionid_ptr || !rdr_name || !rdr) { printf("Error! Invalid test setup.\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return(SA_ERR_HPI_INVALID_PARAMS); } /********** * Find RDR **********/ entryid = SAHPI_FIRST_ENTRY; do { err = saHpiRdrGet(*sessionid_ptr, rid, entryid, &nextentryid, &working_rdr); if (err) { printf("Cannot get RDR; Error=%s\n", oh_lookup_error(err)); } else { if (strncmp((char *)working_rdr.IdString.Data, rdr_name, SAHPI_MAX_TEXT_BUFFER_LENGTH) == 0) { memcpy(rdr, &working_rdr, sizeof(SaHpiRdrT)); break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)); if (entryid != SAHPI_LAST_ENTRY) return(SA_OK); return(SA_ERR_HPI_NOT_PRESENT); } SaErrorT tcleanup(SaHpiSessionIdT *sessionid_ptr) { SaErrorT err = SA_OK; /*************************** * Close session, free memory ***************************/ err = saHpiSessionClose(*sessionid_ptr); return(err); } openhpi-3.6.1/plugins/snmp_bc/t/tset_resource_tag.c0000644000175100017510000000523012575647274021430 0ustar mohanmohan /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include #define SAHPI_LANG_NONSENSE (SaHpiLanguageT)0xFFFFFFFF int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaHpiResourceIdT id; SaErrorT err; SaErrorT expected_err; SaHpiTextBufferT tag; SaHpiRptEntryT rptentry; // DECLARE_HANDLE(); SaHpiSessionIdT sessionid; SaHpiDomainIdT did; struct oh_handler *h = NULL; struct oh_domain *d = NULL; unsigned int *hid = NULL; struct oh_handler_state *handle; /* ************************ * Find a resource with Control type rdr * ***********************/ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid, SAHPI_CAPABILITY_CONTROL, SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return -1; } id = rptentry.ResourceId; INIT_HANDLE(did, d, hid, h, handle); oh_init_textbuffer(&tag); /************************** * Test 1: Invalid Tag **************************/ tag.Language = SAHPI_LANG_NONSENSE; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = snmp_bc_set_resource_tag(handle, id, &tag); checkstatus(err, expected_err, testfail); /************************** * Test 2: Invalid ResourceId **************************/ oh_init_textbuffer(&tag); expected_err = SA_ERR_HPI_INVALID_RESOURCE; err = snmp_bc_set_resource_tag(handle, 5000, &tag); checkstatus(err, expected_err, testfail); /************************** * Test 3: Valid case **************************/ oh_init_textbuffer(&tag); expected_err = SA_OK; err = saHpiResourceTagSet(sessionid, id, &tag); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/tsensorset023.c0000644000175100017510000000537212575647274020354 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiResourceIdT id = 0; SaHpiSessionIdT sessionid; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiSensorNumT sid = 0; SaHpiSensorThresholdsT thres; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundSensor; /* ************************************* * Find a resource with Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid,SAHPI_CAPABILITY_SENSOR,SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: find a sensor with desired property **************************/ entryid = SAHPI_FIRST_ENTRY; foundSensor = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if ((rdr.RdrType == SAHPI_SENSOR_RDR) && (rdr.RdrTypeUnion.SensorRec.Category == SAHPI_EC_THRESHOLD) && (rdr.RdrTypeUnion.SensorRec.ThresholdDefn.WriteThold == 0)) { foundSensor = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundSensor) { err("Did not find desired resource for test\n"); return(SA_OK); } else { sid = rdr.RdrTypeUnion.SensorRec.Num; } /************************** * Test: setting to a non-writeable sensor **************************/ expected_err = SA_ERR_HPI_INVALID_CMD; err = saHpiSensorThresholdsSet(sessionid, id, sid, &thres); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/tsensorget041.c0000644000175100017510000000566112575647274020341 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiResourceIdT id; SaHpiSessionIdT sessionid; SaHpiSensorNumT sid = 0; SaHpiEventStateT assertMask; SaHpiEventStateT deassertMask; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundSensor; /* ************************************* * Find a resource with Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid,SAHPI_CAPABILITY_SENSOR,SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: find a sensor with desired property **************************/ entryid = SAHPI_FIRST_ENTRY; foundSensor = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if ((rdr.RdrType == SAHPI_SENSOR_RDR) && (rdr.RdrTypeUnion.SensorRec.DataFormat.IsSupported == SAHPI_FALSE)) { foundSensor = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundSensor) { err("Did not find desired resource for test\n"); return(SA_OK); } else { sid = rdr.RdrTypeUnion.SensorRec.Num; } /************************** * Test: Invalid sensor id **************************/ expected_err = SA_ERR_HPI_NOT_PRESENT; err = saHpiSensorEventMasksGet(sessionid, id, 5000, &assertMask, &deassertMask); checkstatus(err, expected_err, testfail); /************************** * Test: Normal path **************************/ expected_err = SA_OK; err = saHpiSensorEventMasksGet(sessionid, id, sid, &assertMask, &deassertMask); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/tsensorget010.c0000644000175100017510000000577312575647274020341 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiResourceIdT id; SaHpiSessionIdT sessionid; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiSensorNumT dd_sid = 0; SaHpiEventStateT state; SaHpiSensorReadingT reading; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundSensor; /* ************************************* * Find a resource with Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid,SAHPI_CAPABILITY_SENSOR,SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return -1; } id = rptentry.ResourceId; /************************** * Test: find a sensor with desired property **************************/ entryid = SAHPI_FIRST_ENTRY; foundSensor = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if ((rdr.RdrType == SAHPI_SENSOR_RDR) && (rdr.RdrTypeUnion.SensorRec.DataFormat.IsSupported == SAHPI_FALSE)) { foundSensor = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundSensor) { err("Did not find desired resource for test\n"); return(SA_OK); } else { dd_sid = rdr.RdrTypeUnion.SensorRec.Num; } /************************** * Test: Reading sensor with DataFormat.IsSupported == SAHPI_FALSE **************************/ expected_err = SA_OK; err = saHpiSensorReadingGet(sessionid, id, dd_sid, &reading, &state); checkstatus(err, expected_err, testfail); /************************** * Test: Verified returned data **************************/ if (reading.IsSupported ) { printf("Error! Invalid returned data\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); testfail = -1; } /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/tsensorget013.c0000644000175100017510000000630012575647274020327 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiResourceIdT id; SaHpiSessionIdT sessionid; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiSensorNumT dd_sid = 0; SaHpiEventStateT state; SaHpiSensorReadingT reading; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundSensor; /* ************************************* * Find a resource with Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid,SAHPI_CAPABILITY_SENSOR,SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return -1; } id = rptentry.ResourceId; /************************** * Test: find a sensor with desired property **************************/ entryid = SAHPI_FIRST_ENTRY; foundSensor = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if ((rdr.RdrType == SAHPI_SENSOR_RDR) && (rdr.RdrTypeUnion.SensorRec.DataFormat.IsSupported == SAHPI_TRUE)) { foundSensor = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundSensor) { err("Did not find desired resource for test\n"); return(SA_OK); } else { dd_sid = rdr.RdrTypeUnion.SensorRec.Num; } /************************** * Test : Read sensor with NULL Reading area. State only **************************/ expected_err = SA_OK; err = saHpiSensorReadingGet(sessionid, id, dd_sid, NULL, &state); checkstatus(err, expected_err, testfail); /************************** * Test:Read with NULL State area, Read Value only **************************/ err = saHpiSensorReadingGet(sessionid, id, dd_sid, &reading, NULL); checkstatus(err, expected_err, testfail); /************************** * Test: Both Reading and State are NULL. ie checking for sensor existance **************************/ err = saHpiSensorReadingGet(sessionid, id, dd_sid, NULL, NULL); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/t/setup_conf.c0000644000175100017510000000562312575647274020062 0ustar mohanmohan/* * Copyright (C) 2013, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Mohanasundaram Devarajulu (mohanasundaram.devarajulu@hp.com) * */ #include #include #include #include #include #include #include #include #include #include #include /** * openhpi.conf in this directory needs to have 600 or 400 permissions * SVN does not allow to remove read permissions, so set it up now **/ int main(int argc, char **argv) { struct stat fst; char filename[30] = "./openhpi.conf"; char modestr[] = "0600"; int mode = 0; mode = strtol(modestr, 0 ,8); if (stat (filename, &fst) == -1) { printf("stat of %s failed. Error is %s \n", filename, strerror(errno)); if (errno == ENOENT) { #ifdef OPENHPI_CONF if(stat (OPENHPI_CONF, &fst) == -1) { printf("stat of %s failed. Quitingi. \n", OPENHPI_CONF); if (errno == ENOENT) return 0; else return -1; } if (chmod(filename,mode) < 0) { printf("chmod (%s, %s) failed as %s\n", filename, modestr, strerror(errno)); return -1; } #endif return 0; } else return -1; } if (chmod(filename,mode) < 0) { printf("chmod (%s, %s) failed with %d(%s)\n", filename, modestr, errno, strerror(errno)); return -1; } return 0; } openhpi-3.6.1/plugins/snmp_bc/t/tinv002.c0000644000175100017510000000540412575647274017114 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiResourceIdT id = 0; SaHpiSessionIdT sessionid; SaHpiIdrIdT idrId = 0; SaHpiEntryIdT areaId = 0; /* SaHpiIdrAreaTypeT areatype; */ SaHpiEntryIdT nextAreaId; SaHpiIdrAreaHeaderT header; /* ************************************* * Find a resource with inventory capability * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid, SAHPI_CAPABILITY_INVENTORY_DATA, SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Can not find an Inventory resource for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: Invalid handler **************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = snmp_bc_get_idr_area_header(NULL , id, idrId, SAHPI_IDR_AREATYPE_UNSPECIFIED, areaId, &nextAreaId, &header); checkstatus(err, expected_err, testfail); /************************** * Test : Invalid nextAreaId pointer * expected_err = SA_ERR_HPI_INVALID_PARAMS; **************************/ err = saHpiIdrAreaHeaderGet(sessionid, id, idrId, SAHPI_IDR_AREATYPE_UNSPECIFIED, areaId, NULL, &header); checkstatus(err, expected_err, testfail); /************************** * Test : Invalid header pointer * expected_err = SA_ERR_HPI_INVALID_PARAMS; **************************/ err = saHpiIdrAreaHeaderGet(sessionid, id, idrId, SAHPI_IDR_AREATYPE_UNSPECIFIED, areaId, &nextAreaId, NULL); checkstatus(err, expected_err, testfail); /**************************&* * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-3.6.1/plugins/snmp_bc/snmp_bc_event.map0000644000175100017510000057234612575647274020642 0ustar mohanmohan######################################################################## # (C) Copyright IBM Corp. 2004, 2007 # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # # Author(s): # Steve Sherman ######################################################################### ######################################################################### # This file serves as input to eventmap2code.pl. # # NOTES: # - Strip ending periods from event strings # - MM's generic threshold event strings are assigned event numbers # starting with FFFF. # - BIOS events start with BBBB. # - Cannot have duplicate events with the chassis and any other resource # that cannot be explicitly derived from the event log's Source field. # - Add FF to beginning of event numbers for duplicate events # (e.g. EN_PFA_HI_FAULT_2_5V). Only need to do this if different resources # have events with the same string text message (don't care if same string # text has multiple event numbers for the same resource). # - OVR_MM1 and OVR_MM2 used to identify MM1 or MM2 for hotswap and # takeover events. # - OVR_VMM is for entities assigned to the virtual MM resource. # - OVR_EXP is used to assign BEM events to the add-in card resource. # They are reported by the SNMP event log's Source field as blade events. ########################################################################### # Test event - used to unit test code EN_TEST_EVENT|0xFFFFFFFF|SAHPI_CRITICAL|NO_OVR|"Bogus Test Event" ###################################################### # BladeCenter, BladeCenter H, and BladeCenter T Events ###################################################### ################## # Chassis Resource ################## # None ################# # Chassis Sensors ################# # Ambient Air Temperature Sensor EN_FAULT_CRT_AMBIENT|0x6F400000|SAHPI_CRITICAL|OVR_SEV|"Telco Ambient Temperature is outside the supported range (4-40)" EN_FAULT_CRT_AMBIENT|0x6F400000|SAHPI_CRITICAL|OVR_SEV|"Ambient temperature is outside of the supported range" EN_PFA_HI_OVER_TEMP_AMBIENT|0x0001D500|SAHPI_MAJOR|OVR_SEV|"System over recommended ambient temperature" EN_PFA_HI_OVER_TEMP_AMBIENT|0x0001D500|SAHPI_MAJOR|OVR_SEV|"Chassis over recommended ambient temperature" # I/O Module Redundancy Sensor - event-only EN_SWITCH_NON_REDUNDANT|0x0EA16000|SAHPI_MINOR|OVR_SEV|"Chassis Running Nonredundant I/O Modules" EN_SWITCH_NON_REDUNDANT|0x0EA16000|SAHPI_MINOR|OVR_SEV|"Chassis running with nonredundant I/O modules" # Power Module Redundancy Sensor - event-only EN_NR_PWR_SUPPLY|0x08080001|SAHPI_INFORMATIONAL|OVR_SEV|"Insufficient chassis power to support redundancy" EN_NR_PWR_SUPPLY_DOM_1|0x08081001|SAHPI_MINOR|OVR_SEV|"Power modules are nonredundant in domain 1" EN_NR_PWR_SUPPLY_DOM_2|0x08081002|SAHPI_MINOR|OVR_SEV|"Power modules are nonredundant in domain 2" # Power Domain 1 Redundancy Sensor - event-only # This string necessary since Recovery string is truncated EN_PWR_DOMAIN_1_OVER_SUBSCRIP|0x08009401|SAHPI_INFORMATIONAL|OVR_SEV|"Demand exceeds a single power module. Throttling can occur in domain 1 if redundancy is lo" EN_PWR_DOMAIN_1_OVER_SUBSCRIP|0x08009401|SAHPI_INFORMATIONAL|OVR_SEV|"Demand exceeds a single power module. Throttling can occur in domain 1 if redundancy is lost" EN_PWR_DOMAIN_1_OVER_SUBSCRIP|0x08009401|SAHPI_INFORMATIONAL|OVR_SEV|"Blades in domain 1 will throttle if a single Power Module fails" # This string necessary since Recovery string is truncated EN_PWR_DOMAIN_1_OVER_SUBSCRIP_NONREC|0x08008401|SAHPI_MINOR|OVR_SEV|"Demand exceeds a single power module. Immediate shutdown in domain 1 may occur if module f" EN_PWR_DOMAIN_1_OVER_SUBSCRIP_NONREC|0x08008401|SAHPI_MINOR|OVR_SEV|"Demand exceeds a single power module. Immediate shutdown in domain 1 may occur if module fails" EN_PWR_DOMAIN_1_OVER_SUBSCRIP_NONREC|0x08008401|SAHPI_MINOR|OVR_SEV|"The budgeted power is more than a what a single Power Module can provide in domain 1" # Power Domain 2 Redundancy Sensor - event-only # This string necessary since Recovery string is truncated EN_PWR_DOMAIN_2_OVER_SUBSCRIP|0x08009402|SAHPI_INFORMATIONAL|OVR_SEV|"Demand exceeds a single power module. Throttling can occur in domain 2 if redundancy is lo" EN_PWR_DOMAIN_2_OVER_SUBSCRIP|0x08009402|SAHPI_INFORMATIONAL|OVR_SEV|"Demand exceeds a single power module. Throttling can occur in domain 2 if redundancy is lost" EN_PWR_DOMAIN_2_OVER_SUBSCRIP|0x08009402|SAHPI_INFORMATIONAL|OVR_SEV|"Blades in domain 2 will throttle if a single Power Module fails" # This string necessary since Recovery string is truncated EN_PWR_DOMAIN_2_OVER_SUBSCRIP_NONREC|0x08008402|SAHPI_MINOR|OVR_SEV|"Demand exceeds a single power module. Immediate shutdown in domain 2 may occur if module f" EN_PWR_DOMAIN_2_OVER_SUBSCRIP_NONREC|0x08008402|SAHPI_MINOR|OVR_SEV|"Demand exceeds a single power module. Immediate shutdown in domain 2 may occur if module fails" EN_PWR_DOMAIN_2_OVER_SUBSCRIP_NONREC|0x08008402|SAHPI_MINOR|OVR_SEV|"The budgeted power is more than a what a single Power Module can provide in domain 2" # Chassis Filter Sensor - event only EN_FAULT_CRT_FILTER|0x6F100000|SAHPI_CRITICAL|OVR_SEV|"Telco Filter is in CRITICAL condition. Replace filter needed" EN_FAULT_CRT_FILTER|0x6F100000|SAHPI_CRITICAL|OVR_SEV|"Air filter needs service" EN_FAULT_CRT_FILTER|0x6F100000|SAHPI_CRITICAL|OVR_SEV|"The air filter needs service" EN_FAULT_MJR_FILTER|0x6F200000|SAHPI_MAJOR|OVR_SEV|"Telco Filter is in BAD condition" EN_FAULT_MJR_FILTER|0x6F200000|SAHPI_MAJOR|OVR_SEV|"The air filter is in bad condition, may need service." EN_FAULT_MNR_FILTER|0x6F300000|SAHPI_MINOR|OVR_SEV|"Telco Filter is in WARNING condition" EN_FAULT_MNR_FILTER|0x6F300000|SAHPI_MINOR|OVR_SEV|"The air filter may need service" EN_FAULT_MNR_FILTER_SERVICE|0x6F500000|SAHPI_INFORMATIONAL|OVR_SEV|"Telco Filter: Routine Service Check is required" ############################ # Management Module Resource ############################ EN_MM_1_INSTALLED|0x00282001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_MM1|"Management Module 1 was installed" EN_MM_1_INSTALLED|0x00282001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_MM1|"Management Module 1 installed" EN_MM_2_INSTALLED|0x00282002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_MM2|"Management Module 2 was installed" EN_MM_2_INSTALLED|0x00282002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_MM2|"Management Module 2 installed" EN_MM_1_REMOVED|0x00284001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_MM1|"Management Module 1 was removed" EN_MM_1_REMOVED|0x00284001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_MM1|"Management Module 1 removed" EN_MM_2_REMOVED|0x00284002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_MM2|"Management Module 2 was removed" EN_MM_2_REMOVED|0x00284002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_MM2|"Management Module 2 removed" ################################### # Virtual Management Module Sensors ################################### # System Management Bus Operational State Sensor - event only #### Mapped to Off-line Operational State EN_I2C_BUS_0_FAIL|0x00020000|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading I2C device. Check devices on bus 0" EN_I2C_BUS_0_FAIL|0x00020000|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading device on system management bus 0" EN_I2C_BUS_1_FAIL|0x00020001|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading I2C device. Check devices on bus 1" EN_I2C_BUS_1_FAIL|0x00020001|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading device on system management bus 1" EN_I2C_BUS_2_FAIL|0x00020002|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading I2C device. Check devices on bus 2" EN_I2C_BUS_2_FAIL|0x00020002|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading device on system management bus 2" EN_I2C_BUS_3_FAIL|0x00020003|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading I2C device. Check devices on bus 3" EN_I2C_BUS_3_FAIL|0x00020003|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading device on system management bus 3" EN_I2C_BUS_4_FAIL|0x00020004|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading I2C device. Check devices on bus 4" EN_I2C_BUS_4_FAIL|0x00020004|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading device on system management bus 4" EN_I2C_BUS_5_FAIL|0x00020005|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading I2C device. Check devices on bus 5" EN_I2C_BUS_5_FAIL|0x00020005|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading device on system management bus 5" EN_I2C_BUS_6_FAIL|0x00020006|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading I2C device. Check devices on bus 6" EN_I2C_BUS_6_FAIL|0x00020006|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading device on system management bus 6" EN_I2C_BUS_7_FAIL|0x00020007|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading I2C device. Check devices on bus 7" EN_I2C_BUS_7_FAIL|0x00020007|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading device on system management bus 7" EN_I2C_BUS_8_FAIL|0x00020008|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading I2C device. Check devices on bus 8" EN_I2C_BUS_8_FAIL|0x00020008|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading device on system management bus 8" EN_I2C_BUS_9_FAIL|0x00020009|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading I2C device. Check devices on bus 9" EN_I2C_BUS_9_FAIL|0x00020009|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading device on system management bus 9" EN_I2C_BUS_10_FAIL|0x0002000A|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading I2C device. Check devices on bus 10" EN_I2C_BUS_10_FAIL|0x0002000A|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading device on system management bus 10" EN_I2C_BUS_11_FAIL|0x0002000B|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading I2C device. Check devices on bus 11" EN_I2C_BUS_11_FAIL|0x0002000B|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading device on system management bus 11" EN_I2C_BUS_12_FAIL|0x0002000C|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading I2C device. Check devices on bus 12" EN_I2C_BUS_12_FAIL|0x0002000C|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading device on system management bus 12" EN_I2C_BUS_13_FAIL|0x0002000D|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading I2C device. Check devices on bus 13" EN_I2C_BUS_13_FAIL|0x0002000D|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading device on system management bus 13" EN_I2C_BUS_14_FAIL|0x0002000E|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading I2C device. Check devices on bus 14" EN_I2C_BUS_14_FAIL|0x0002000E|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading device on system management bus 14" EN_I2C_BUS_15_FAIL|0x0002000F|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading I2C device. Check devices on bus 15" EN_I2C_BUS_15_FAIL|0x0002000F|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading device on system management bus 15" EN_I2C_BUS_16_FAIL|0x00020010|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading I2C device. Check devices on bus 16" EN_I2C_BUS_16_FAIL|0x00020010|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading device on system management bus 16" EN_I2C_BUS_17_FAIL|0x00020011|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading I2C device. Check devices on bus 17" EN_I2C_BUS_17_FAIL|0x00020011|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading device on system management bus 17" EN_I2C_BUS_18_FAIL|0x00020012|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading I2C device. Check devices on bus 18" EN_I2C_BUS_18_FAIL|0x00020012|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading device on system management bus 18" EN_I2C_BUS_19_FAIL|0x00020013|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading I2C device. Check devices on bus 19" EN_I2C_BUS_19_FAIL|0x00020013|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading device on system management bus 19" EN_I2C_BUS_20_FAIL|0x00020014|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading I2C device. Check devices on bus 20" EN_I2C_BUS_20_FAIL|0x00020014|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading device on system management bus 20" EN_I2C_BUS_21_FAIL|0x00020015|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading I2C device. Check devices on bus 21" EN_I2C_BUS_21_FAIL|0x00020015|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading device on system management bus 21" EN_I2C_BUS_22_FAIL|0x00020016|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading I2C device. Check devices on bus 22" EN_I2C_BUS_22_FAIL|0x00020016|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading device on system management bus 22" EN_I2C_BUS_23_FAIL|0x00020017|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading I2C device. Check devices on bus 23" EN_I2C_BUS_23_FAIL|0x00020017|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading device on system management bus 23" EN_I2C_BUS_24_FAIL|0x00020018|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading I2C device. Check devices on bus 24" EN_I2C_BUS_24_FAIL|0x00020018|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading device on system management bus 24" EN_I2C_BUS_25_FAIL|0x00020019|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading device on system management bus 25" EN_I2C_BUS_25_FAIL|0x00020019|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading I2C device. Check devices on bus 25" EN_I2C_BUS_26_FAIL|0x0002001A|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading I2C device. Check devices on bus 26" EN_I2C_BUS_26_FAIL|0x0002001A|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading device on system management bus 26" EN_SP_CTRL_OFFLINE|0x00216015|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Service processor controller access off-line" EN_SP_CTRL_UNAVAILABLE|0x00216016|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Service processor controller access unavailable" EN_STCONN_FAIL_MIDPLANE|0x00022014|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Connectivity status midplane communication failed" #### Mapped to Degraded Operational State EN_SP_CTRL_DEGRADED|0x00216014|SAHPI_MINOR|OVR_SEV,OVR_VMM|"Service processor controller access degraded" EN_SP_SENSOR_DEGRADED|0x00216013|SAHPI_MINOR|OVR_SEV,OVR_VMM|"Service processor sensor access degraded" EN_IPMI_BMC_COMM_FAIL|0x00216000|SAHPI_MINOR|OVR_SEV,OVR_VMM|"Problem communicating with BMC" EN_UNABLE_ISLOATE_BUS|0x00101007|SAHPI_MAJOR|OVR_SEV,OVR_VMM|"Unable to isolate bus fault - bus was not recovered" EN_MGMT_BUS_FAULT|0x00103000|SAHPI_MAJOR|OVR_SEV,OVR_VMM|"Management bus communication fault" # MM Air Temperature Sensor EN_PFA_HI_OVER_TEMP_SP_CARD|0x0001D400|SAHPI_MAJOR|OVR_SEV,OVR_VMM|"Management Module is over recommended temperature" # System 1.8 Volt Sensor EN_I2C_HI_FAULT_1_8V|0x0807B401|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"System is over recommended voltage for 1.8V CPU" EN_I2C_HI_FAULT_1_8V|0x0807B401|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Chassis 1.8V over recommended voltage" EN_I2C_LO_FAULT_1_8V|0x0807B801|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"System is under recommended voltage for 1.8V CPU" EN_I2C_LO_FAULT_1_8V|0x0807B801|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Chassis 1.8V under recommended voltage" # System 2.5 Volt Sensor EN_I2C_HI_FAULT_2_5V|0x08031481|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"System over recommended voltage on +2.5v" EN_I2C_HI_FAULT_2_5V|0x08031481|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Chassis 2.5V over recommended voltage" EN_I2C_LO_FAULT_2_5V|0x08031881|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"System under recommended voltage on +2.5v" EN_I2C_LO_FAULT_2_5V|0x08031881|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Chassis 2.5V under recommended voltage" # System 3.3 Volt Sensor EN_I2C_HI_FAULT_3_35V|0x08033481|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"System over recommended voltage on +3.3v" EN_I2C_HI_FAULT_3_35V|0x08033481|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Chassis 3.3V over recommended voltage" EN_I2C_LO_FAULT_3_35V|0xFF000000|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"System under recommended voltage on +3.3v" EN_I2C_LO_FAULT_3_35V|0xFF000000|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Chassis 3.3V under recommended voltage" # System 5 Volt Sensor EN_I2C_HI_FAULT_PLANAR_5V|0xFF000001|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"System over recommended voltage for +5v" EN_I2C_HI_FAULT_PLANAR_5V|0xFF000001|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Chassis 5V over recommended voltage" EN_I2C_LO_FAULT_PLANAR_5V|0x06035801|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"System under recommended voltage for +5v" EN_I2C_LO_FAULT_PLANAR_5V|0x06035801|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Chassis 5V under recommended voltage" # System -5 Volt Sensor EN_I2C_HI_FAULT_N5V|0x0803D501|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"System over recommended voltage for -5v" EN_I2C_HI_FAULT_N5V|0x0803D501|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Chassis -5V over recommended voltage" EN_I2C_LO_FAULT_N5V|0x0803D801|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"System under recommended voltage for -5v" EN_I2C_LO_FAULT_N5V|0x0803D801|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Chassis -5V under recommended voltage" # System 12 Volt Sensor EN_I2C_HI_FAULT_12V_PLANAR|0x06037503|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"System over recommended voltage for +12v" EN_I2C_HI_FAULT_12V_PLANAR|0x06037503|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Chassis 12V over recommended voltage" EN_I2C_LO_FAULT_12V_PLANAR|0x06037801|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"System under recommended voltage for +12v" EN_I2C_LO_FAULT_12V_PLANAR|0x06037801|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Chassis 12V under recommended voltage" ##################### # Physical MM Sensors ##################### # MM Operational Status Sensor #### Mapped to Off-line Operational State EN_OTHER_I2C|0x00222000|SAHPI_CRITICAL|OVR_SEV,OVR_MM_STBY|"Standby MM failure on system management bus, check devices" EN_STCONN_FAIL_OTHERMM|0x0002201E|SAHPI_CRITICAL|OVR_SEV,OVR_MM_STBY|"Connectivity status alternate MM communication failed" #### Mapped to Degraded Operational State EN_STBIST_FAIL_R_BOOT_ROM|0x0002201B|SAHPI_MAJOR|OVR_SEV,OVR_MM_STBY|"BIST standby MM bootrom failed" EN_STBIST_FAIL_R_CORE_1|0x00022052|SAHPI_MAJOR|OVR_SEV,OVR_MM_STBY|"BIST standby MM primary core Failed" EN_STBIST_FAIL_R_CORE_2|0x00022053|SAHPI_MAJOR|OVR_SEV,OVR_MM_STBY|"BIST standby MM backup core Failed" EN_STBIST_FAIL_R_CPLD|0x00022019|SAHPI_MAJOR|OVR_SEV,OVR_MM_STBY|"BIST standby MM internal I/O expander failed" EN_STBIST_FAIL_R_ENET_PORT|0x0002201C|SAHPI_MAJOR|OVR_SEV,OVR_MM_STBY|"BIST standby MM ethernet port 0 failed" EN_STBIST_FAIL_R_ENET_SWITCH|0x0002201D|SAHPI_MAJOR|OVR_SEV,OVR_MM_STBY|"BIST standby MM internal ethernet switch failed" EN_STBIST_FAIL_R_I2C|0x00022016|SAHPI_MAJOR|OVR_SEV,OVR_MM_STBY|"BIST standby MM local management bus failed" EN_STBIST_FAIL_R_PRI_FS|0x00022017|SAHPI_MAJOR|OVR_SEV,OVR_MM_STBY|"BIST standby MM primary file system failed" EN_STBIST_FAIL_R_RTC|0x00022015|SAHPI_MAJOR|OVR_SEV,OVR_MM_STBY|"BIST standby MM realtime clock failed" EN_STBIST_FAIL_R_SEC_FS|0x00022018|SAHPI_MAJOR|OVR_SEV,OVR_MM_STBY|"BIST standby MM secondary file system failed" EN_FAULT_OC_USB_HUB|0x00014034|SAHPI_MAJOR|OVR_SEV,OVR_MM_PRIME|"USB hub over-current failure" EN_FAULT_OC_USB_PORT|0x00014033|SAHPI_MAJOR|OVR_SEV,OVR_MM_PRIME|"USB port over-current failure" EN_STBIST_FAIL_ADC|0x0002200B|SAHPI_MAJOR|OVR_SEV,OVR_MM_PRIME|"BIST primary MM video capture failed" EN_STBIST_FAIL_BOOT_ROM|0x00022007|SAHPI_MAJOR|OVR_SEV,OVR_MM_PRIME|"BIST primary MM bootrom failed" EN_STBIST_FAIL_CORE_1|0x00022058|SAHPI_MAJOR|OVR_SEV,OVR_MM_PRIME|"BIST primary MM primary core failed" EN_STBIST_FAIL_CORE_2|0x00022059|SAHPI_MAJOR|OVR_SEV,OVR_MM_PRIME|"BIST primary MM backup core failed" EN_STBIST_FAIL_CPLD|0x0002205A|SAHPI_CRITICAL|OVR_SEV,OVR_MM_PRIME|"BIST primary MM internal I/O expander failed" EN_STBIST_FAIL_ENET_PORT|0x00022008|SAHPI_MAJOR|OVR_SEV,OVR_MM_PRIME|"BIST primary MM ethernet port 0 failed" EN_STBIST_FAIL_ENET_SWITCH|0x0002200A|SAHPI_CRITICAL|OVR_SEV,OVR_MM_PRIME|"BIST primary MM internal ethernet switch failed" EN_STBIST_FAIL_I2C|0x00022004|SAHPI_CRITICAL|OVR_SEV,OVR_MM_PRIME|"BIST primary MM local management bus failed" EN_STBIST_FAIL_I2C_DEVICE|0x00022009|SAHPI_CRITICAL|OVR_SEV,OVR_MM_PRIME|"BIST primary MM external management bus failed" EN_STBIST_FAIL_PRI_FS|0x00022005|SAHPI_MAJOR|OVR_SEV,OVR_MM_PRIME|"BIST primary MM primary file system failed" EN_STBIST_FAIL_R485_1|0x00022001|SAHPI_CRITICAL|OVR_SEV,OVR_MM_PRIME|"BIST blade management bus 1 failed" EN_STBIST_FAIL_R485_2|0x00022002|SAHPI_CRITICAL|OVR_SEV,OVR_MM_PRIME|"BIST blade management bus 2 failed" EN_STBIST_FAIL_RPSERV|0x00022013|SAHPI_MAJOR|OVR_SEV,OVR_MM_PRIME|"BIST primary MM remote control firmware failed" EN_STBIST_FAIL_RTC|0x00022003|SAHPI_MAJOR|OVR_SEV,OVR_MM_PRIME|"BIST primary MM realtime clock failed" EN_STBIST_FAIL_SEC_FS|0x00022006|SAHPI_MAJOR|OVR_SEV,OVR_MM_PRIME|"BIST primary MM secondary file system failed" EN_STBIST_FAIL_USB_1|0x00022011|SAHPI_MAJOR|OVR_SEV,OVR_MM_PRIME|"BIST primary MM USB keyboard/mouse emulation failed" EN_STBIST_FAIL_USB_2|0x00022012|SAHPI_MAJOR|OVR_SEV,OVR_MM_PRIME|"BIST primary MM USB mass storage emulation failed" EN_STBIST_FAIL_USB_I2C_1|0x00022054|SAHPI_MAJOR|OVR_SEV,OVR_MM_PRIME|"BIST primary MM USB keyboard/mouse firmware failed" EN_STBIST_FAIL_USB_I2C_2|0x00022055|SAHPI_MAJOR|OVR_SEV,OVR_MM_PRIME|"BIST primary MM USB mass storage firmware failed" EN_SYSTEM_BATTERY_FAILURE|0x06000000|SAHPI_INFORMATIONAL|OVR_SEV,OVR_MM_PRIME|"The real time clock battery in the MM needs service" #### Mapped to Install Error Operational State EN_MM_MISMATCHED|0x00282005|SAHPI_CRITICAL|OVR_SEV,OVR_MM_PRIME|"Configuration of mismatched management modules is not supported" ################ # Blade Resource ################ EN_BLADE_1_INSTALLED|0x0E002001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade Server 1 was installed" EN_BLADE_1_INSTALLED|0x0E002001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade 1 installed" EN_BLADE_2_INSTALLED|0x0E002002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade Server 2 was installed" EN_BLADE_2_INSTALLED|0x0E002002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade 2 installed" EN_BLADE_3_INSTALLED|0x0E002003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade Server 3 was installed" EN_BLADE_3_INSTALLED|0x0E002003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade 3 installed" EN_BLADE_4_INSTALLED|0x0E002004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade Server 4 was installed" EN_BLADE_4_INSTALLED|0x0E002004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade 4 installed" EN_BLADE_5_INSTALLED|0x0E002005|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade Server 5 was installed" EN_BLADE_5_INSTALLED|0x0E002005|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade 5 installed" EN_BLADE_6_INSTALLED|0x0E002006|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade Server 6 was installed" EN_BLADE_6_INSTALLED|0x0E002006|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade 6 installed" EN_BLADE_7_INSTALLED|0x0E002007|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade Server 7 was installed" EN_BLADE_7_INSTALLED|0x0E002007|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade 7 installed" EN_BLADE_8_INSTALLED|0x0E002008|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade Server 8 was installed" EN_BLADE_8_INSTALLED|0x0E002008|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade 8 installed" EN_BLADE_9_INSTALLED|0x0E002009|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade Server 9 was installed" EN_BLADE_9_INSTALLED|0x0E002009|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade 9 installed" EN_BLADE_A_INSTALLED|0x0E00200A|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade Server 10 was installed" EN_BLADE_A_INSTALLED|0x0E00200A|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade 10 installed" EN_BLADE_B_INSTALLED|0x0E00200B|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade Server 11 was installed" EN_BLADE_B_INSTALLED|0x0E00200B|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade 11 installed" EN_BLADE_C_INSTALLED|0x0E00200C|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade Server 12 was installed" EN_BLADE_C_INSTALLED|0x0E00200C|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade 12 installed" EN_BLADE_D_INSTALLED|0x0E00200D|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade Server 13 was installed" EN_BLADE_D_INSTALLED|0x0E00200D|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade 13 installed" EN_BLADE_E_INSTALLED|0x0E00200E|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade Server 14 was installed" EN_BLADE_E_INSTALLED|0x0E00200E|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade 14 installed" EN_BLADE_1_REMOVED|0x0E004001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade Server 1 was removed" EN_BLADE_1_REMOVED|0x0E004001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade 1 removed" EN_BLADE_2_REMOVED|0x0E004002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade Server 2 was removed" EN_BLADE_2_REMOVED|0x0E004002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade 2 removed" EN_BLADE_3_REMOVED|0x0E004003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade Server 3 was removed" EN_BLADE_3_REMOVED|0x0E004003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade 3 removed" EN_BLADE_4_REMOVED|0x0E004004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade Server 4 was removed" EN_BLADE_4_REMOVED|0x0E004004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade 4 removed" EN_BLADE_5_REMOVED|0x0E004005|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade Server 5 was removed" EN_BLADE_5_REMOVED|0x0E004005|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade 5 removed" EN_BLADE_6_REMOVED|0x0E004006|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade Server 6 was removed" EN_BLADE_6_REMOVED|0x0E004006|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade 6 removed" EN_BLADE_7_REMOVED|0x0E004007|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade Server 7 was removed" EN_BLADE_7_REMOVED|0x0E004007|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade 7 removed" EN_BLADE_8_REMOVED|0x0E004008|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade Server 8 was removed" EN_BLADE_8_REMOVED|0x0E004008|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade 8 removed" EN_BLADE_9_REMOVED|0x0E004009|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade Server 9 was removed" EN_BLADE_9_REMOVED|0x0E004009|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade 9 removed" EN_BLADE_A_REMOVED|0x0E00400A|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade Server 10 was removed" EN_BLADE_A_REMOVED|0x0E00400A|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade 10 removed" EN_BLADE_B_REMOVED|0x0E00400B|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade Server 11 was removed" EN_BLADE_B_REMOVED|0x0E00400B|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade 11 removed" EN_BLADE_C_REMOVED|0x0E00400C|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade Server 12 was removed" EN_BLADE_C_REMOVED|0x0E00400C|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade 12 removed" EN_BLADE_D_REMOVED|0x0E00400D|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade Server 13 was removed" EN_BLADE_D_REMOVED|0x0E00400D|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade 13 removed" EN_BLADE_E_REMOVED|0x0E00400E|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade Server 14 was removed" EN_BLADE_E_REMOVED|0x0E00400E|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade 14 removed" EN_BLADE_PWR_DWN|0x1C000001|SAHPI_INFORMATIONAL|OVR_SEV|"Blade Server Powered Down" EN_BLADE_PWR_DWN|0x1C000001|SAHPI_INFORMATIONAL|OVR_SEV|"Blade powered off" EN_BLADE_PWR_UP|0x1C000002|SAHPI_INFORMATIONAL|OVR_SEV|"Blade Server Powered Up" EN_BLADE_PWR_UP|0x1C000002|SAHPI_INFORMATIONAL|OVR_SEV|"Blade powered on" EN_BLADE_PWR_DN_FAN_FAIL|0x06026080|SAHPI_INFORMATIONAL|OVR_SEV|"Critical Blower Failure, Blade Server Powering Down" EN_BLADE_PWR_DN_FAN_FAIL|0x06026080|SAHPI_INFORMATIONAL|OVR_SEV|"Critical blower failure, blade powered off" EN_BLADE_PWR_DN_PM_TEMP|0x0821C080|SAHPI_INFORMATIONAL|OVR_SEV|"Power Modules are over temperature, Blade Server Powering Down" EN_BLADE_PWR_DN_PM_TEMP|0x0821C080|SAHPI_INFORMATIONAL|OVR_SEV|"Blade powered off due to Power Modules over temperature" ############### # Blade Sensors ############### # Blade CPU 1 Temperature Sensor EN_PROC_HOT_CPU1|0x0421C401|SAHPI_CRITICAL|OVR_SEV|"CPU 1 shut off due to over temperature" EN_CUTOFF_HI_OVER_TEMP_CPU1|0x0421C481|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to CPU 1 over temperature" EN_CUTOFF_HI_OVER_TEMP_CPU1|0x0421C481|SAHPI_CRITICAL|OVR_SEV|"CPU 1 temperature fault" EN_THERM_TRIP_CPU1|0x0421D081|SAHPI_CRITICAL|OVR_SEV|"CPU 1 Over Temperature" EN_THERM_TRIP_CPU1|0x0421D081|SAHPI_CRITICAL|OVR_SEV|"CPU 1 over temperature" EN_PFA_HI_OVER_TEMP_CPU1|0x0421D501|SAHPI_MAJOR|OVR_SEV|"System over temperature for CPU 1" EN_PFA_HI_OVER_TEMP_CPU1|0x0421D501|SAHPI_MAJOR|OVR_SEV|"CPU 1 over recommended temperature" EN_GENERIC_HI_CRIT_TEMP|0xFFFFFF1C|SAHPI_CRITICAL|OVR_SEV|"processor 1 (CPU 1 Temp) over critical temperature" EN_GENERIC_HI_CRIT_TEMP|0xFFFFFF1C|SAHPI_CRITICAL|OVR_SEV|"processor 1 (CPU1 TEMP) over critical temperature" EN_GENERIC_HI_WARN_TEMP|0xFFFFFF1D|SAHPI_MAJOR|OVR_SEV|"processor 1 (CPU 1 Temp) over recommended temperature" EN_GENERIC_HI_WARN_TEMP|0xFFFFFF1D|SAHPI_MAJOR|OVR_SEV|"processor 1 (CPU 1 TEMP) over recommended temperature" # Blade CPU 2 Temperature Sensor EN_PROC_HOT_CPU2|0x0421C402|SAHPI_CRITICAL|OVR_SEV|"CPU 2 shut off due to over temperature" EN_CUTOFF_HI_OVER_TEMP_CPU2|0x0421C482|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to CPU 2 over temperature" EN_CUTOFF_HI_OVER_TEMP_CPU2|0x0421C482|SAHPI_CRITICAL|OVR_SEV|"CPU 2 temperature fault" EN_THERM_TRIP_CPU2|0x0421D082|SAHPI_CRITICAL|OVR_SEV|"CPU 2 Over Temperature" EN_THERM_TRIP_CPU2|0x0421D082|SAHPI_CRITICAL|OVR_SEV|"CPU 2 over temperature" EN_PFA_HI_OVER_TEMP_CPU2|0x0421D502|SAHPI_MAJOR|OVR_SEV|"System over temperature for CPU 2" EN_PFA_HI_OVER_TEMP_CPU2|0x0421D502|SAHPI_MAJOR|OVR_SEV|"CPU 2 over recommended temperature" EN_GENERIC_HI_CRIT_TEMP|0xFFFFFF20|SAHPI_CRITICAL|OVR_SEV|"processor 2 (CPU 2 Temp) over critical temperature" EN_GENERIC_HI_CRIT_TEMP|0xFFFFFF20|SAHPI_CRITICAL|OVR_SEV|"processor 2 (CPU2 TEMP) over critical temperature" EN_GENERIC_HI_WARN_TEMP|0xFFFFFF21|SAHPI_MAJOR|OVR_SEV|"processor 2 (CPU 2 Temp) over recommended temperature" EN_GENERIC_HI_WARN_TEMP|0xFFFFFF21|SAHPI_MAJOR|OVR_SEV|"processor 2 (CPU 2 TEMP) over recommended temperature" # Blade CPU 3 Temperature Sensor EN_PROC_HOT_CPU3|0x0421C403|SAHPI_CRITICAL|OVR_SEV|"CPU 3 shut off due to over temperature" EN_CUTOFF_HI_OVER_TEMP_CPU3|0x0421C483|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to CPU 3 over temperature" EN_CUTOFF_HI_OVER_TEMP_CPU3|0x0421C483|SAHPI_CRITICAL|OVR_SEV|"CPU 3 temperature fault" EN_THERM_TRIP_CPU3|0x0421D083|SAHPI_CRITICAL|OVR_SEV|"CPU 3 Over Temperature" EN_THERM_TRIP_CPU3|0x0421D083|SAHPI_CRITICAL|OVR_SEV|"CPU 3 over temperature" EN_PFA_HI_OVER_TEMP_CPU3|0x0421D503|SAHPI_MAJOR|OVR_SEV|"System over temperature for CPU 3" EN_PFA_HI_OVER_TEMP_CPU3|0x0421D503|SAHPI_MAJOR|OVR_SEV|"CPU 3 over recommended temperature" EN_GENERIC_HI_CRIT_TEMP|0xFFFFFF22|SAHPI_CRITICAL|OVR_SEV|"processor 3 (CPU 3 Temp) over critical temperature" EN_GENERIC_HI_CRIT_TEMP|0xFFFFFF22|SAHPI_CRITICAL|OVR_SEV|"processor 3 (CPU3 TEMP) over critical temperature" EN_GENERIC_HI_WARN_TEMP|0xFFFFFF23|SAHPI_MAJOR|OVR_SEV|"processor 3 (CPU 3 Temp) over recommended temperature" EN_GENERIC_HI_WARN_TEMP|0xFFFFFF23|SAHPI_MAJOR|OVR_SEV|"processor 3 (CPU 3 TEMP) over recommended temperature" # Blade CPU 4 Temperature Sensor EN_PROC_HOT_CPU4|0x0421C404|SAHPI_CRITICAL|OVR_SEV|"CPU 4 shut off due to over temperature" EN_CUTOFF_HI_OVER_TEMP_CPU4|0x0421C484|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to CPU 4 over temperature" EN_CUTOFF_HI_OVER_TEMP_CPU4|0x0421C484|SAHPI_CRITICAL|OVR_SEV|"CPU 4 temperature fault" EN_THERM_TRIP_CPU4|0x0421D084|SAHPI_CRITICAL|OVR_SEV|"CPU 4 Over Temperature" EN_THERM_TRIP_CPU4|0x0421D084|SAHPI_CRITICAL|OVR_SEV|"CPU 4 over temperature" EN_PFA_HI_OVER_TEMP_CPU4|0x0421D504|SAHPI_MAJOR|OVR_SEV|"System over temperature for CPU 4" EN_PFA_HI_OVER_TEMP_CPU4|0x0421D504|SAHPI_MAJOR|OVR_SEV|"CPU 4 over recommended temperature" EN_GENERIC_HI_CRIT_TEMP|0xFFFFFF24|SAHPI_CRITICAL|OVR_SEV|"processor 4 (CPU 4 Temp) over critical temperature" EN_GENERIC_HI_CRIT_TEMP|0xFFFFFF24|SAHPI_CRITICAL|OVR_SEV|"processor 4 (CPU4 TEMP) over critical temperature" EN_GENERIC_HI_WARN_TEMP|0xFFFFFF25|SAHPI_MAJOR|OVR_SEV|"processor 4 (CPU 4 Temp) over recommended temperature" EN_GENERIC_HI_WARN_TEMP|0xFFFFFF25|SAHPI_MAJOR|OVR_SEV|"processor 4 (CPU 4 TEMP) over recommended temperature" # Blade Memory Bank 1 Temperature Sensor EN_GENERIC_HI_CRIT_TEMP|0xFFFFFF14|SAHPI_CRITICAL|OVR_SEV|"memory bank 1 (BANK1 TEMP) over critical temperature" EN_GENERIC_HI_CRIT_TEMP|0xFFFFFF14|SAHPI_CRITICAL|OVR_SEV|"memory bank 1 (BANK 1 Temp) over critical temperature" EN_GENERIC_HI_WARN_TEMP|0xFFFFFF15|SAHPI_MAJOR|OVR_SEV|"memory bank 1 (BANK1 TEMP) over recommended temperature" EN_GENERIC_HI_WARN_TEMP|0xFFFFFF15|SAHPI_MAJOR|OVR_SEV|"memory bank 1 (BANK 1 Temp) over recommended temperature" # Blade Memory Bank 2 Temperature Sensor EN_GENERIC_HI_CRIT_TEMP|0xFFFFFF16|SAHPI_CRITICAL|OVR_SEV|"memory bank 2 (BANK2 TEMP) over critical temperature" EN_GENERIC_HI_CRIT_TEMP|0xFFFFFF16|SAHPI_CRITICAL|OVR_SEV|"memory bank 2 (BANK 2 Temp) over critical temperature" EN_GENERIC_HI_WARN_TEMP|0xFFFFFF17|SAHPI_MAJOR|OVR_SEV|"memory bank 2 (BANK2 TEMP) over recommended temperature" EN_GENERIC_HI_WARN_TEMP|0xFFFFFF17|SAHPI_MAJOR|OVR_SEV|"memory bank 2 (BANK 2 Temp) over recommended temperature" # Blade Memory Bank 3 Temperature Sensor EN_GENERIC_HI_CRIT_TEMP|0xFFFFFF18|SAHPI_CRITICAL|OVR_SEV|"memory bank 3 (BANK3 TEMP) over critical temperature" EN_GENERIC_HI_CRIT_TEMP|0xFFFFFF18|SAHPI_CRITICAL|OVR_SEV|"memory bank 3 (BANK 3 Temp) over critical temperature" EN_GENERIC_HI_WARN_TEMP|0xFFFFFF19|SAHPI_MAJOR|OVR_SEV|"memory bank 3 (BANK3 TEMP) over recommended temperature" EN_GENERIC_HI_WARN_TEMP|0xFFFFFF19|SAHPI_MAJOR|OVR_SEV|"memory bank 3 (BANK 3 Temp) over recommended temperature" # Blade Memory Bank 4 Temperature Sensor EN_GENERIC_HI_CRIT_TEMP|0xFFFFFF1A|SAHPI_CRITICAL|OVR_SEV|"memory bank 4 (BANK4 TEMP) over critical temperature" EN_GENERIC_HI_CRIT_TEMP|0xFFFFFF1A|SAHPI_CRITICAL|OVR_SEV|"memory bank 4 (BANK 4 Temp) over critical temperature" EN_GENERIC_HI_WARN_TEMP|0xFFFFFF1B|SAHPI_MAJOR|OVR_SEV|"memory bank 4 (BANK4 TEMP) over recommended temperature" EN_GENERIC_HI_WARN_TEMP|0xFFFFFF1B|SAHPI_MAJOR|OVR_SEV|"memory bank 4 (BANK 4 Temp) over recommended temperature" # Blade 0.9 Volt Sensor EN_GENERIC_UPPER_WARN_VOLT|0xFFFFFFF1|SAHPI_MAJOR|OVR_SEV|"system board 1 (Planar 0.9V) over recommended voltage" EN_GENERIC_LOWER_WARN_VOLT|0xFFFFFFF2|SAHPI_MAJOR|OVR_SEV|"system board 1 (Planar 0.9V) under recommended voltage" # Blade 1.2 Volt Sensor EN_PFA_HI_FAULT_1_2V|0x08001401|SAHPI_MAJOR|OVR_SEV|"System over recommended voltage on +1.2v" EN_PFA_HI_FAULT_1_2V|0x08001401|SAHPI_MAJOR|OVR_SEV|"Blade 1.2V over recommended voltage" EN_PFA_LO_FAULT_1_2V|0x08001801|SAHPI_MAJOR|OVR_SEV|"System under recommended voltage on +1.2v" EN_PFA_LO_FAULT_1_2V|0x08001801|SAHPI_MAJOR|OVR_SEV|"Blade 1.2V under recommended voltage" # Blade Standby 1.2 Volt Sensor EN_1_2VS_WARNING_HI|0x0A00BC02|SAHPI_MAJOR|OVR_SEV|"Standby +1.2V over recommended voltage" EN_1_2VS_WARNING_HI|0x0A00BC02|SAHPI_MAJOR|OVR_SEV|"1.2V standby over recommended voltage" EN_1_2VS_WARNING_LOW|0x0A00AC02|SAHPI_MAJOR|OVR_SEV|"Standby +1.2V under recommended voltage" EN_1_2VS_WARNING_LOW|0x0A00AC02|SAHPI_MAJOR|OVR_SEV|"1.2V standby under recommended voltage" # Blade 1.25 Volt Sensor EN_PFA_HI_FAULT_1_25V|0x08001400|SAHPI_MAJOR|OVR_SEV|"System over recommended voltage on +1.25v" EN_PFA_HI_FAULT_1_25V|0x08001400|SAHPI_MAJOR|OVR_SEV|"Blade 1.25V over recommended voltage" EN_PFA_LO_FAULT_1_25V|0x08001800|SAHPI_MAJOR|OVR_SEV|"System under recommended voltage on +1.25v" EN_PFA_LO_FAULT_1_25V|0x08001800|SAHPI_MAJOR|OVR_SEV|"Blade 1.25V under recommended voltage" # Blade 1.5 Volt Sensor EN_IO_1_5V_WARNING_HI|0x0A041C00|SAHPI_MAJOR|OVR_SEV|"IO Board +1.5V over recommended voltage" EN_IO_1_5V_WARNING_HI|0x0A041C00|SAHPI_MAJOR|OVR_SEV|"I/O board 1.5V over recommended voltage" EN_IO_1_5V_WARNING_LOW|0x0A040C00|SAHPI_MAJOR|OVR_SEV|"IO Board +1.5V under recommended voltage" EN_IO_1_5V_WARNING_LOW|0x0A040C00|SAHPI_MAJOR|OVR_SEV|"I/O board 1.5V under recommended voltage" EN_PFA_HI_FAULT_1_5V|0x08041400|SAHPI_MAJOR|OVR_SEV|"System over recommended voltage on +1.5v" EN_PFA_HI_FAULT_1_5V|0x08041400|SAHPI_MAJOR|OVR_SEV|"Blade 1.5V over recommended voltage" EN_PFA_LO_FAULT_1_5V|0x08041800|SAHPI_MAJOR|OVR_SEV|"System under recommended voltage on +1.5v" EN_PFA_LO_FAULT_1_5V|0x08041800|SAHPI_MAJOR|OVR_SEV|"Blade 1.5V under recommended voltage" # Blade Standby 1.5 Volt Sensor EN_1_5VS_WARNING_HI|0x0A041C02|SAHPI_MAJOR|OVR_SEV|"Standby +1.5V over recommended voltage" EN_1_5VS_WARNING_HI|0x0A041C02|SAHPI_MAJOR|OVR_SEV|"1.5V standby over recommended voltage" EN_1_5VS_WARNING_LOW|0x0A040C02|SAHPI_MAJOR|OVR_SEV|"Standby +1.5V under recommended voltage" EN_1_5VS_WARNING_LOW|0x0A040C02|SAHPI_MAJOR|OVR_SEV|"1.5V standby under recommended voltage" # Blade 1.8 Volt Sensor EN_PFA_HI_FAULT_1_8V|0x0807B400|SAHPI_MAJOR|OVR_SEV|"System is over recommended voltage for 1.8V CPU" EN_PFA_HI_FAULT_1_8V|0x0807B400|SAHPI_MAJOR|OVR_SEV|"Blade 1.8V over recommended voltage" EN_PFA_LO_FAULT_1_8V|0x0807B800|SAHPI_MAJOR|OVR_SEV|"System is under recommended voltage for 1.8V CPU" EN_PFA_LO_FAULT_1_8V|0x0807B800|SAHPI_MAJOR|OVR_SEV|"Blade 1.8V under recommended voltage" # Blade Standby 1.8 Volt Sensor EN_1_8VS_WARNING_HI|0x0A07BC02|SAHPI_MAJOR|OVR_SEV|"1.8V standby over recommended voltage" EN_1_8VS_WARNING_LOW|0x0A07AC02|SAHPI_MAJOR|OVR_SEV|"1.8V standby under recommended voltage" # Blade 2.5 Volt Sensor EN_IO_2_5V_WARNING_HI|0x0A031C00|SAHPI_MAJOR|OVR_SEV|"IO Board +2.5V over recommended voltage" EN_IO_2_5V_WARNING_HI|0x0A031C00|SAHPI_MAJOR|OVR_SEV|"I/O board 2.5V over recommended voltage" EN_IO_2_5V_WARNING_LOW|0x0A030C00|SAHPI_MAJOR|OVR_SEV|"IO Board 2.5V under recommended voltage" EN_IO_2_5V_WARNING_LOW|0x0A030C00|SAHPI_MAJOR|OVR_SEV|"I/O board 2.5V under recommended voltage" EN_PFA_HI_FAULT_2_5V|0x08031480|SAHPI_MAJOR|OVR_SEV|"System over recommended voltage on +2.5v" EN_PFA_HI_FAULT_2_5V|0x08031480|SAHPI_MAJOR|OVR_SEV|"Blade 2.5V over recommended voltage" EN_PFA_LO_FAULT_2_5V|0x08031880|SAHPI_MAJOR|OVR_SEV|"System under recommended voltage on +2.5v" EN_PFA_LO_FAULT_2_5V|0x08031880|SAHPI_MAJOR|OVR_SEV|"Blade 2.5V under recommended voltage" # Blade Standby 2.5 Volt Sensor EN_2_5VS_WARNING_HI|0x0A031C02|SAHPI_MAJOR|OVR_SEV|"Standby +2.5V over recommended voltage" EN_2_5VS_WARNING_HI|0x0A031C02|SAHPI_MAJOR|OVR_SEV|"2.5V standby over recommended voltage" EN_2_5VS_WARNING_LOW|0x0A030C02|SAHPI_MAJOR|OVR_SEV|"Standby +2.5V under recommended voltage" EN_2_5VS_WARNING_LOW|0x0A030C02|SAHPI_MAJOR|OVR_SEV|"2.5V standby under recommended voltage" # Blade 3.3 Volt Sensor EN_IO_3_3V_WARNING_HI|0x0A02DC00|SAHPI_MAJOR|OVR_SEV|"IO Board +3.3V over recommended voltage" EN_IO_3_3V_WARNING_HI|0x0A02DC00|SAHPI_MAJOR|OVR_SEV|"I/O board 3.3V over recommended voltage" EN_IO_3_3V_WARNING_LOW|0x0A02CC00|SAHPI_MAJOR|OVR_SEV|"IO Board +3.3V under recommended voltage" EN_IO_3_3V_WARNING_LOW|0x0A02CC00|SAHPI_MAJOR|OVR_SEV|"I/O board 3.3V under recommended voltage" EN_PFA_HI_FAULT_3_35V|0x08033480|SAHPI_MAJOR|OVR_SEV|"System over recommended voltage on +3.3v" EN_PFA_HI_FAULT_3_35V|0x08033480|SAHPI_MAJOR|OVR_SEV|"Blade 3.3V over recommended voltage" EN_MAJOR_LO_FAULT_3_35V|0xFF032900|SAHPI_MAJOR|OVR_SEV|"System under recommended voltage on +3.3v" EN_GENERIC_UPPER_WARN_VOLT|0xFFFFFFF3|SAHPI_MAJOR|OVR_SEV|"system board 1 (Planar 3.3V) over recommended voltage" EN_GENERIC_UPPER_WARN_VOLT|0xFFFFFFF3|SAHPI_MAJOR|OVR_SEV|"system board 1 (3.3V Sense) over recommended voltage" EN_GENERIC_LOWER_WARN_VOLT|0xFFFFFFF4|SAHPI_MAJOR|OVR_SEV|"system board 1 (Planar 3.3V) under recommended voltage" EN_GENERIC_LOWER_WARN_VOLT|0xFFFFFFF4|SAHPI_MAJOR|OVR_SEV|"system board 1 (3.3V Sense) under recommended voltage" # Blade Standby 3.3 Volt Sensor EN_3_3VS_WARNING_HI|0x0A02DC02|SAHPI_MAJOR|OVR_SEV|"Standby +3.3V over recommended voltage" EN_3_3VS_WARNING_HI|0x0A02DC02|SAHPI_MAJOR|OVR_SEV|"3.3V standby over recommended voltage" EN_3_3VS_WARNING_LOW|0x0A02CC02|SAHPI_MAJOR|OVR_SEV|"Standby +3.3V under recommended voltage" EN_3_3VS_WARNING_LOW|0x0A02CC02|SAHPI_MAJOR|OVR_SEV|"3.3V standby under recommended voltage" # Blade 5 Volt Sensor EN_IO_5V_WARNING_HI|0x0A035C00|SAHPI_MAJOR|OVR_SEV|"IO Board +5V over recommended voltage" EN_IO_5V_WARNING_HI|0x0A035C00|SAHPI_MAJOR|OVR_SEV|"I/O board 5V over recommended voltage" EN_IO_5V_WARNING_LOW|0x0A034C00|SAHPI_MAJOR|OVR_SEV|"IO Board +5V under recommended voltage" EN_IO_5V_WARNING_LOW|0x0A034C00|SAHPI_MAJOR|OVR_SEV|"I/O board 5V under recommended voltage" EN_PFA_HI_FAULT_5V|0x08035500|SAHPI_MAJOR|OVR_SEV|"System over recommended 5V Fault" EN_PFA_HI_FAULT_5V|0x08035500|SAHPI_MAJOR|OVR_SEV|"Blade 5V over fault" EN_PFA_HI_FAULT_5V|0x08035500|SAHPI_MAJOR|OVR_SEV|"Blade 5V over recommended voltage" EN_PFA_LO_FAULT_5V|0x08035800|SAHPI_MAJOR|OVR_SEV|"System under recommended 5V Fault" EN_PFA_LO_FAULT_5V|0x08035800|SAHPI_MAJOR|OVR_SEV|"Blade 5V under recommended voltage" EN_GENERIC_UPPER_WARN_VOLT|0xFFFFFFF5|SAHPI_MAJOR|OVR_SEV|"system board 1 (Planar 5V) over recommended voltage" EN_GENERIC_UPPER_WARN_VOLT|0xFFFFFFF5|SAHPI_MAJOR|OVR_SEV|"system board 2 (5V Sense) over recommended voltage" EN_GENERIC_UPPER_WARN_VOLT|0xFFFFFFF5|SAHPI_MAJOR|OVR_SEV|"system board 1 (5V Sense) over recommended voltage" EN_GENERIC_LOWER_WARN_VOLT|0xFFFFFFF6|SAHPI_MAJOR|OVR_SEV|"system board 1 (Planar 5V) under recommended voltage" EN_GENERIC_LOWER_WARN_VOLT|0xFFFFFFF6|SAHPI_MAJOR|OVR_SEV|"system board 2 (5V Sense) under recommended voltage" EN_GENERIC_LOWER_WARN_VOLT|0xFFFFFFF6|SAHPI_MAJOR|OVR_SEV|"system board 1 (5V Sense) under recommended voltage" # Blade Standby 5 Volt Sensor EN_5VS_WARNING_HI|0x0A035C02|SAHPI_MAJOR|OVR_SEV|"Standby +5V over recommended voltage" EN_5VS_WARNING_HI|0x0A035C02|SAHPI_MAJOR|OVR_SEV|"5V standby over recommended voltage" EN_5VS_WARNING_LOW|0x0A034C02|SAHPI_MAJOR|OVR_SEV|"Standby +5V under recommended voltage" EN_5VS_WARNING_LOW|0x0A034C02|SAHPI_MAJOR|OVR_SEV|"5V standby under recommended voltage" # Blade -5 Volt Sensor EN_PFA_HI_FAULT_N5V|0x0803D500|SAHPI_MAJOR|OVR_SEV|"Blade -5V over voltage fault" EN_PFA_HI_FAULT_N5V|0x0803D500|SAHPI_MAJOR|OVR_SEV|"Blade -5V over recommended voltage" EN_PFA_LO_FAULT_N5V|0x0803D800|SAHPI_MAJOR|OVR_SEV|"Blade -5V under recommended voltage" # Blade 12 Volt Sensor EN_IO_12V_WARNING_HI|0x0A037C00|SAHPI_MAJOR|OVR_SEV|"IO Board +12V over recommended voltage" EN_IO_12V_WARNING_HI|0x0A037C00|SAHPI_MAJOR|OVR_SEV|"I/O board 12V over recommended voltage" EN_IO_12V_WARNING_LOW|0x0A036C00|SAHPI_MAJOR|OVR_SEV|"IO Board +12V under recommended voltage" EN_IO_12V_WARNING_LOW|0x0A036C00|SAHPI_MAJOR|OVR_SEV|"I/O board 12V under recommended voltage" EN_PFA_HI_FAULT_12V_PLANAR|0x06037500|SAHPI_MAJOR|OVR_SEV|"System over recommended voltage for +12v" EN_PFA_HI_FAULT_12V_PLANAR|0x06037500|SAHPI_MAJOR|OVR_SEV|"Blade 12V over recommended voltage" EN_PFA_LO_FAULT_12V_PLANAR|0x06037800|SAHPI_MAJOR|OVR_SEV|"System under recommended voltage for +12v" EN_PFA_LO_FAULT_12V_PLANAR|0x06037800|SAHPI_MAJOR|OVR_SEV|"Blade 12V under recommended voltage" EN_GENERIC_UPPER_WARN_VOLT|0xFFFFFFF7|SAHPI_MAJOR|OVR_SEV|"system board 1 (Planar 12V) over recommended voltage" EN_GENERIC_UPPER_WARN_VOLT|0xFFFFFFF7|SAHPI_MAJOR|OVR_SEV|"system board 3 (12V Sense) over recommended voltage" EN_GENERIC_UPPER_WARN_VOLT|0xFFFFFFF7|SAHPI_MAJOR|OVR_SEV|"system board 1 (12V Sense) over recommended voltage" EN_GENERIC_LOWER_WARN_VOLT|0xFFFFFFF8|SAHPI_MAJOR|OVR_SEV|"system board 1 (Planar 12V) under recommended voltage" EN_GENERIC_LOWER_WARN_VOLT|0xFFFFFFF8|SAHPI_MAJOR|OVR_SEV|"system board 3 (12V Sense) under recommended voltage" EN_GENERIC_LOWER_WARN_VOLT|0xFFFFFFF8|SAHPI_MAJOR|OVR_SEV|"system board 1 (12V Sense) under recommended voltage" # Blade Standby 12 Volt Sensor EN_12VS_WARNING_HI|0x0A037C02|SAHPI_MAJOR|OVR_SEV|"Standby +12V over recommended voltage" EN_12VS_WARNING_HI|0x0A037C02|SAHPI_MAJOR|OVR_SEV|"12V standby over recommended voltage" EN_12VS_WARNING_LOW|0x0A036C02|SAHPI_MAJOR|OVR_SEV|"Standby +12V under recommended voltage" EN_12VS_WARNING_LOW|0x0A036C02|SAHPI_MAJOR|OVR_SEV|"12V standby under recommended voltage" # Blade VRM Volt Sensor EN_PFA_HI_FAULT_VRM1|0x04401501|SAHPI_MAJOR|OVR_SEV|"System is over recommended voltage on VRM 1" EN_PFA_LO_FAULT_VRM1|0x04401801|SAHPI_MAJOR|OVR_SEV|"System is under recommended voltage on VRM 1" EN_PFA_HI_FAULT_VRM2|0x04401502|SAHPI_MAJOR|OVR_SEV|"System is over recommended voltage on VRM 2" EN_PFA_LO_FAULT_VRM2|0x04401802|SAHPI_MAJOR|OVR_SEV|"System is under recommended voltage on VRM 2" # Blade CPU 1 Core Voltage Sensor EN_GENERIC_UPPER_WARN_VOLT|0xFFFFFFF9|SAHPI_MAJOR|OVR_SEV|"processor 1 (CPU 1 VCore) over recommended voltage" EN_GENERIC_LOWER_WARN_VOLT|0xFFFFFFFA|SAHPI_MAJOR|OVR_SEV|"processor 1 (CPU 1 VCore) under recommended voltage" # Blade CPU 2 Core Voltage Sensor EN_GENERIC_UPPER_WARN_VOLT|0xFFFFFFFB|SAHPI_MAJOR|OVR_SEV|"processor 2 (CPU 2 VCore) over recommended voltage" EN_GENERIC_LOWER_WARN_VOLT|0xFFFFFFFC|SAHPI_MAJOR|OVR_SEV|"processor 2 (CPU 2 VCore) under recommended voltage" # Blade CPU 3 Core Voltage Sensor EN_GENERIC_UPPER_WARN_VOLT|0xFFFFFFFD|SAHPI_MAJOR|OVR_SEV|"processor 3 (CPU 3 VCore) over recommended voltage" EN_GENERIC_LOWER_WARN_VOLT|0xFFFFFFFE|SAHPI_MAJOR|OVR_SEV|"processor 3 (CPU 3 VCore) under recommended voltage" # Blade CPU 4 Core Voltage Sensor EN_GENERIC_UPPER_WARN_VOLT|0xFFFFFF10|SAHPI_MAJOR|OVR_SEV|"processor 4 (CPU 4 VCore) over recommended voltage" EN_GENERIC_LOWER_WARN_VOLT|0xFFFFFF11|SAHPI_MAJOR|OVR_SEV|"processor 4 (CPU 4 VCore) under recommended voltage" # Blade Battery Voltage Sensor EN_GENERIC_UPPER_WARN_VOLT|0xFFFFFF12|SAHPI_MAJOR|OVR_SEV|"battery 1 (Planar VBAT) over recommended voltage" EN_GENERIC_UPPER_WARN_VOLT|0xFFFFFF12|SAHPI_MAJOR|OVR_SEV|"battery 1 (VBATT Sense) over recommended voltage" EN_GENERIC_LOWER_WARN_VOLT|0xFFFFFF13|SAHPI_MAJOR|OVR_SEV|"battery 1 (Planar VBAT) under recommended voltage" EN_GENERIC_LOWER_WARN_VOLT|0xFFFFFF13|SAHPI_MAJOR|OVR_SEV|"battery 1 (VBATT Sense) under recommended voltage" # Blade Operational Status Sensor #### Mapped to Off-line Operational State EN_BLADE_1_INSUFFICIENT_PWR|0x0E00A001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 1 is not allowed to power on because of insufficient power" EN_BLADE_1_INSUFFICIENT_PWR|0x0E00A001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 1 not allowed to power on due to insufficient power" EN_BLADE_2_INSUFFICIENT_PWR|0x0E00A002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 2 is not allowed to power on because of insufficient power" EN_BLADE_2_INSUFFICIENT_PWR|0x0E00A002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 2 not allowed to power on due to insufficient power" EN_BLADE_3_INSUFFICIENT_PWR|0x0E00A003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 3 is not allowed to power on because of insufficient power" EN_BLADE_3_INSUFFICIENT_PWR|0x0E00A003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 3 not allowed to power on due to insufficient power" EN_BLADE_4_INSUFFICIENT_PWR|0x0E00A004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 4 is not allowed to power on because of insufficient power" EN_BLADE_4_INSUFFICIENT_PWR|0x0E00A004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 4 not allowed to power on due to insufficient power" EN_BLADE_5_INSUFFICIENT_PWR|0x0E00A005|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 5 is not allowed to power on because of insufficient power" EN_BLADE_5_INSUFFICIENT_PWR|0x0E00A005|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 5 not allowed to power on due to insufficient power" EN_BLADE_6_INSUFFICIENT_PWR|0x0E00A006|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 6 is not allowed to power on because of insufficient power" EN_BLADE_6_INSUFFICIENT_PWR|0x0E00A006|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 6 not allowed to power on due to insufficient power" EN_BLADE_7_INSUFFICIENT_PWR|0x0E00A007|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 7 is not allowed to power on because of insufficient power" EN_BLADE_7_INSUFFICIENT_PWR|0x0E00A007|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 7 not allowed to power on due to insufficient power" EN_BLADE_8_INSUFFICIENT_PWR|0x0E00A008|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 8 is not allowed to power on because of insufficient power" EN_BLADE_8_INSUFFICIENT_PWR|0x0E00A008|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 8 not allowed to power on due to insufficient power" EN_BLADE_9_INSUFFICIENT_PWR|0x0E00A009|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 9 is not allowed to power on because of insufficient power" EN_BLADE_9_INSUFFICIENT_PWR|0x0E00A009|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 9 not allowed to power on due to insufficient power" EN_BLADE_10_INSUFFICIENT_PWR|0x0E00A00A|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 10 is not allowed to power on because of insufficient power" EN_BLADE_10_INSUFFICIENT_PWR|0x0E00A00A|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 10 not allowed to power on due to insufficient power" EN_BLADE_11_INSUFFICIENT_PWR|0x0E00A00B|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 11 is not allowed to power on because of insufficient power" EN_BLADE_11_INSUFFICIENT_PWR|0x0E00A00B|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 11 not allowed to power on due to insufficient power" EN_BLADE_12_INSUFFICIENT_PWR|0x0E00A00C|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 12 is not allowed to power on because of insufficient power" EN_BLADE_12_INSUFFICIENT_PWR|0x0E00A00C|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 12 not allowed to power on due to insufficient power" EN_BLADE_13_INSUFFICIENT_PWR|0x0E00A00D|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 13 is not allowed to power on because of insufficient power" EN_BLADE_13_INSUFFICIENT_PWR|0x0E00A00D|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 13 not allowed to power on due to insufficient power" EN_BLADE_14_INSUFFICIENT_PWR|0x0E00A00E|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 14 is not allowed to power on because of insufficient power" EN_BLADE_14_INSUFFICIENT_PWR|0x0E00A00E|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 14 not allowed to power on due to insufficient power" EN_BLADE_1_SHUTDOWN_OVER_PWR_BUDGET|0x0F00C001|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade 1 not allowed to power on; constrained by power budget" EN_BLADE_2_SHUTDOWN_OVER_PWR_BUDGET|0x0F00C002|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade 2 not allowed to power on; constrained by power budget" EN_BLADE_3_SHUTDOWN_OVER_PWR_BUDGET|0x0F00C003|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade 3 not allowed to power on; constrained by power budget" EN_BLADE_4_SHUTDOWN_OVER_PWR_BUDGET|0x0F00C004|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade 4 not allowed to power on; constrained by power budget" EN_BLADE_5_SHUTDOWN_OVER_PWR_BUDGET|0x0F00C005|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade 5 not allowed to power on; constrained by power budget" EN_BLADE_6_SHUTDOWN_OVER_PWR_BUDGET|0x0F00C006|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade 6 not allowed to power on; constrained by power budget" EN_BLADE_7_SHUTDOWN_OVER_PWR_BUDGET|0x0F00C007|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade 7 not allowed to power on; constrained by power budget" EN_BLADE_8_SHUTDOWN_OVER_PWR_BUDGET|0x0F00C008|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade 8 not allowed to power on; constrained by power budget" EN_BLADE_9_SHUTDOWN_OVER_PWR_BUDGET|0x0F00C009|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade 9 not allowed to power on; constrained by power budget" EN_BLADE_10_SHUTDOWN_OVER_PWR_BUDGET|0x0F00C00A|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade 10 not allowed to power on; constrained by power budget" EN_BLADE_11_SHUTDOWN_OVER_PWR_BUDGET|0x0F00C00B|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade 11 not allowed to power on; constrained by power budget" EN_BLADE_12_SHUTDOWN_OVER_PWR_BUDGET|0x0F00C00C|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade 12 not allowed to power on; constrained by power budget" EN_BLADE_13_SHUTDOWN_OVER_PWR_BUDGET|0x0F00C00D|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade 13 not allowed to power on; constrained by power budget" EN_BLADE_14_SHUTDOWN_OVER_PWR_BUDGET|0x0F00C00E|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade 14 not allowed to power on; constrained by power budget" EN_BLADE_1_UNIDENTIABLE_HW_DENY_POWER|0x0E012001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power denied to blade 1 because it has unidentified hardware" EN_BLADE_2_UNIDENTIABLE_HW_DENY_POWER|0x0E012002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power denied to blade 2 because it has unidentified hardware" EN_BLADE_3_UNIDENTIABLE_HW_DENY_POWER|0x0E012003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power denied to blade 3 because it has unidentified hardware" EN_BLADE_4_UNIDENTIABLE_HW_DENY_POWER|0x0E012004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power denied to blade 4 because it has unidentified hardware" EN_BLADE_5_UNIDENTIABLE_HW_DENY_POWER|0x0E012005|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power denied to blade 5 because it has unidentified hardware" EN_BLADE_6_UNIDENTIABLE_HW_DENY_POWER|0x0E012006|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power denied to blade 6 because it has unidentified hardware" EN_BLADE_7_UNIDENTIABLE_HW_DENY_POWER|0x0E012007|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power denied to blade 7 because it has unidentified hardware" EN_BLADE_8_UNIDENTIABLE_HW_DENY_POWER|0x0E012008|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power denied to blade 8 because it has unidentified hardware" EN_BLADE_9_UNIDENTIABLE_HW_DENY_POWER|0x0E012009|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power denied to blade 9 because it has unidentified hardware" EN_BLADE_10_UNIDENTIABLE_HW_DENY_POWER|0x0E01200A|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power denied to blade 10 because it has unidentified hardware" EN_BLADE_11_UNIDENTIABLE_HW_DENY_POWER|0x0E01200B|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power denied to blade 11 because it has unidentified hardware" EN_BLADE_12_UNIDENTIABLE_HW_DENY_POWER|0x0E01200C|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power denied to blade 12 because it has unidentified hardware" EN_BLADE_13_UNIDENTIABLE_HW_DENY_POWER|0x0E01200D|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power denied to blade 13 because it has unidentified hardware" EN_BLADE_14_UNIDENTIABLE_HW_DENY_POWER|0x0E01200E|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power denied to blade 14 because it has unidentified hardware" EN_CPU_BD_POWER_FAULT|0x0401A000|SAHPI_CRITICAL|OVR_SEV|"CPU Board power fault" EN_CPU_BD_POWER_FAULT|0x0401A000|SAHPI_CRITICAL|OVR_SEV|"Blade power fault" EN_CPU_BD_POWER_FAULT|0x0401A000|SAHPI_CRITICAL|OVR_SEV|"Planar power fault" EN_CPU_BD_VOLTAGE_FAULT|0x04018000|SAHPI_CRITICAL|OVR_SEV|"CPU Board voltage fault" EN_CPU_BD_VOLTAGE_FAULT|0x04018000|SAHPI_CRITICAL|OVR_SEV|"Blade voltage fault" EN_CPU_INVALID_CONFIG|0x0401E000|SAHPI_CRITICAL|OVR_SEV|"Invalid CPU configuration" EN_IERR_CPU1|0x04300201|SAHPI_CRITICAL|OVR_SEV|"CPU 1 internal fault" EN_IERR_CPU2|0x04300202|SAHPI_CRITICAL|OVR_SEV|"CPU 2 internal fault" EN_IERR_CPU3|0x04300203|SAHPI_CRITICAL|OVR_SEV|"CPU 3 internal fault" EN_IERR_CPU4|0x04300204|SAHPI_CRITICAL|OVR_SEV|"CPU 4 internal fault" EN_OVER_TEMP_CPU1|0x0421C081|SAHPI_CRITICAL|OVR_SEV|"CPU 1 over temperature" EN_OVER_TEMP_CPU2|0x0421C082|SAHPI_CRITICAL|OVR_SEV|"CPU 2 over temperature" EN_OVER_TEMP_CPU3|0x0421C083|SAHPI_CRITICAL|OVR_SEV|"CPU 3 over temperature" EN_OVER_TEMP_CPU4|0x0421C084|SAHPI_CRITICAL|OVR_SEV|"CPU 4 over temperature" EN_DASD|0x00000069|SAHPI_CRITICAL|OVR_SEV|"DASD backplane Failure" EN_IO_BD_FAULT|0x06016000|SAHPI_CRITICAL|OVR_SEV|"I/O Board fault" EN_IO_BD_POWER_FAULT|0x0601A000|SAHPI_CRITICAL|OVR_SEV|"IO Board power fault" EN_IO_BD_POWER_FAULT|0x0601A000|SAHPI_CRITICAL|OVR_SEV|"I/O board power fault" EN_IO_BD_VOLTAGE_FAULT|0x06018000|SAHPI_CRITICAL|OVR_SEV|"IO Board voltage fault" EN_IO_BD_VOLTAGE_FAULT|0x06018000|SAHPI_CRITICAL|OVR_SEV|"I/O board voltage fault" EN_FAULT_POWER_GOOD|0x00028000|SAHPI_CRITICAL|OVR_SEV|"Power Good Fault" EN_FAULT_SYS_POWER_GOOD|0x00028001|SAHPI_CRITICAL|OVR_SEV|"System Power Good Fault" #EN_FAULT_SYS_POWER_GOOD|0x00028001|SAHPI_CRITICAL|OVR_SEV|"Blade power fault" EN_FAULT_VRM_POWER_GOOD|0x04428000|SAHPI_CRITICAL|OVR_SEV|"VRM Power Good Fault" EN_FAULT_VRM_POWER_GOOD|0x04428000|SAHPI_CRITICAL|OVR_SEV|"Voltage regulator fault" EN_FAULT_VRM_POWER_GOOD_1|0x04428001|SAHPI_CRITICAL|OVR_SEV|"CPU voltage regulator 1 fault" EN_FAULT_VRM_POWER_GOOD_2|0x04428002|SAHPI_CRITICAL|OVR_SEV|"CPU voltage regulator 2 fault" EN_FAULT_VRM_POWER_GOOD_3|0x04428003|SAHPI_CRITICAL|OVR_SEV|"CPU voltage regulator 3 fault" EN_FAULT_VRM_POWER_GOOD_4|0x04428004|SAHPI_CRITICAL|OVR_SEV|"CPU voltage regulator 4 fault" EN_AUTO_BIOS_ALERT|0x04000000|SAHPI_MAJOR|OVR_SEV|"Firmware (BIOS) ROM corruption detected" EN_HSDC_FAULT|0x0D01E000|SAHPI_CRITICAL|OVR_SEV|"High speed expansion card fault" EN_IPMI_SM_INIT_FAIL|0x00216030|SAHPI_CRITICAL|OVR_SEV|"Firmware (BIOS) halted, System Management Bus error" EN_IPMI_SYS_BOARD_FAIL|0x0021601C|SAHPI_CRITICAL|OVR_SEV|"Firmware (BIOS) backup ROM corruption. System board failure" EN_IPMI_PCI_BUS_TIMEOUT|0x0021603E|SAHPI_CRITICAL|OVR_SEV|"PCI bus timeout: system error" EN_IPMI_BIOS_HALTED_UNSPEC|0x0021603F|SAHPI_CRITICAL|OVR_SEV|"Firmware (BIOS) halted, unspecified error" EN_PWR_CONTROLLER_TIMEOUT|0x08016080|SAHPI_CRITICAL|OVR_SEV|"Power controller timeout" EN_MEMORY_FAIL|0x05200000|SAHPI_CRITICAL|OVR_SEV|"System Memory Error" EN_MEMORY_FAIL|0x05200000|SAHPI_CRITICAL|OVR_SEV|"Blade memory fault" EN_UNCORRECT_DIMM_1_ERR|0x0A000281|SAHPI_CRITICAL|OVR_SEV|"Uncorrectable DIMM 1 memory error" EN_UNCORRECT_DIMM_2_ERR|0x0A000282|SAHPI_CRITICAL|OVR_SEV|"Uncorrectable DIMM 2 memory error" EN_UNCORRECT_DIMM_3_ERR|0x0A000283|SAHPI_CRITICAL|OVR_SEV|"Uncorrectable DIMM 3 memory error" EN_UNCORRECT_DIMM_4_ERR|0x0A000284|SAHPI_CRITICAL|OVR_SEV|"Uncorrectable DIMM 4 memory error" EN_UNCORRECT_DIMM_5_ERR|0x0A000285|SAHPI_CRITICAL|OVR_SEV|"Uncorrectable DIMM 5 memory error" EN_UNCORRECT_DIMM_6_ERR|0x0A000286|SAHPI_CRITICAL|OVR_SEV|"Uncorrectable DIMM 6 memory error" EN_UNCORRECT_DIMM_7_ERR|0x0A000287|SAHPI_CRITICAL|OVR_SEV|"Uncorrectable DIMM 7 memory error" EN_UNCORRECT_DIMM_8_ERR|0x0A000288|SAHPI_CRITICAL|OVR_SEV|"Uncorrectable DIMM 8 memory error" EN_IPMI_UNCORRECT_BUS_ERR|0x00216012|SAHPI_CRITICAL|OVR_SEV|"Uncorrectable memory/system bus error" EN_IPMI_DIMM_ERR|0x00216003|SAHPI_CRITICAL|OVR_SEV|"DIMM error" EN_IPMI_DIMM_ERR|0x00216003|SAHPI_CRITICAL|OVR_SEV|"DIMM failed: DIMM number unknown" EN_MEM_MOD_BUS_UNCORR_ERR|0x06C16000|SAHPI_CRITICAL|OVR_SEV|"Memory module bus fault" #### Mapped to Degraded Operational State EN_BLADE_1_NO_PWR_VPD|0x0E00E001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Can not read power-on VPD for blade 1" EN_BLADE_1_NO_PWR_VPD|0x0E00E001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 1 VPD cannot be read" EN_BLADE_2_NO_PWR_VPD|0x0E00E002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Can not read power-on VPD for blade 2" EN_BLADE_2_NO_PWR_VPD|0x0E00E002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 2 VPD cannot be read" EN_BLADE_3_NO_PWR_VPD|0x0E00E003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Can not read power-on VPD for blade 3" EN_BLADE_3_NO_PWR_VPD|0x0E00E003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 3 VPD cannot be read" EN_BLADE_4_NO_PWR_VPD|0x0E00E004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Can not read power-on VPD for blade 4" EN_BLADE_4_NO_PWR_VPD|0x0E00E004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 4 VPD cannot be read" EN_BLADE_5_NO_PWR_VPD|0x0E00E005|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Can not read power-on VPD for blade 5" EN_BLADE_5_NO_PWR_VPD|0x0E00E005|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 5 VPD cannot be read" EN_BLADE_6_NO_PWR_VPD|0x0E00E006|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Can not read power-on VPD for blade 6" EN_BLADE_6_NO_PWR_VPD|0x0E00E006|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 6 VPD cannot be read" EN_BLADE_7_NO_PWR_VPD|0x0E00E007|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Can not read power-on VPD for blade 7" EN_BLADE_7_NO_PWR_VPD|0x0E00E007|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 7 VPD cannot be read" EN_BLADE_8_NO_PWR_VPD|0x0E00E008|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Can not read power-on VPD for blade 8" EN_BLADE_8_NO_PWR_VPD|0x0E00E008|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 8 VPD cannot be read" EN_BLADE_9_NO_PWR_VPD|0x0E00E009|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Can not read power-on VPD for blade 9" EN_BLADE_9_NO_PWR_VPD|0x0E00E009|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 9 VPD cannot be read" EN_BLADE_A_NO_PWR_VPD|0x0E00E00A|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Can not read power-on VPD for blade 10" EN_BLADE_A_NO_PWR_VPD|0x0E00E00A|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 10 VPD cannot be read" EN_BLADE_B_NO_PWR_VPD|0x0E00E00B|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Can not read power-on VPD for blade 11" EN_BLADE_B_NO_PWR_VPD|0x0E00E00B|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 11 VPD cannot be read" EN_BLADE_C_NO_PWR_VPD|0x0E00E00C|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Can not read power-on VPD for blade 12" EN_BLADE_C_NO_PWR_VPD|0x0E00E00C|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 12 VPD cannot be read" EN_BLADE_D_NO_PWR_VPD|0x0E00E00D|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Can not read power-on VPD for blade 13" EN_BLADE_D_NO_PWR_VPD|0x0E00E00D|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 13 VPD cannot be read" EN_BLADE_E_NO_PWR_VPD|0x0E00E00E|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Can not read power-on VPD for blade 14" EN_BLADE_E_NO_PWR_VPD|0x0E00E00E|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 14 VPD cannot be read" EN_BLADE_1_NO_MGT_VPD|0x0E010001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Can not read VPD for blade 1 management" EN_BLADE_2_NO_MGT_VPD|0x0E010002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Can not read VPD for blade 2 management" EN_BLADE_3_NO_MGT_VPD|0x0E010003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Can not read VPD for blade 3 management" EN_BLADE_4_NO_MGT_VPD|0x0E010004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Can not read VPD for blade 4 management" EN_BLADE_5_NO_MGT_VPD|0x0E010005|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Can not read VPD for blade 5 management" EN_BLADE_6_NO_MGT_VPD|0x0E010006|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Can not read VPD for blade 6 management" EN_BLADE_7_NO_MGT_VPD|0x0E010007|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Can not read VPD for blade 7 management" EN_BLADE_8_NO_MGT_VPD|0x0E010008|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Can not read VPD for blade 8 management" EN_BLADE_9_NO_MGT_VPD|0x0E010009|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Can not read VPD for blade 9 management" EN_BLADE_A_NO_MGT_VPD|0x0E01000A|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Can not read VPD for blade 10 management" EN_BLADE_B_NO_MGT_VPD|0x0E01000B|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Can not read VPD for blade 11 management" EN_BLADE_C_NO_MGT_VPD|0x0E01000C|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Can not read VPD for blade 12 management" EN_BLADE_D_NO_MGT_VPD|0x0E01000D|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Can not read VPD for blade 13 management" EN_BLADE_E_NO_MGT_VPD|0x0E01000E|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Can not read VPD for blade 14 management" # If this error occurs while blade is up, blade continues to operate; if this error occurs # on power up/restart blade is not allowed to power on EN_BLADE_1_COMM_FAIL|0x0E008001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"SP Communications Failure on Blade 1" EN_BLADE_1_COMM_FAIL|0x0E008001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 1 is not responding on the management bus" EN_BLADE_2_COMM_FAIL|0x0E008002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"SP Communications Failure on Blade 2" EN_BLADE_2_COMM_FAIL|0x0E008002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 2 is not responding on the management bus" EN_BLADE_3_COMM_FAIL|0x0E008003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"SP Communications Failure on Blade 3" EN_BLADE_3_COMM_FAIL|0x0E008003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 3 is not responding on the management bus" EN_BLADE_4_COMM_FAIL|0x0E008004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"SP Communications Failure on Blade 4" EN_BLADE_4_COMM_FAIL|0x0E008004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 4 is not responding on the management bus" EN_BLADE_5_COMM_FAIL|0x0E008005|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"SP Communications Failure on Blade 5" EN_BLADE_5_COMM_FAIL|0x0E008005|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 5 is not responding on the management bus" EN_BLADE_6_COMM_FAIL|0x0E008006|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"SP Communications Failure on Blade 6" EN_BLADE_6_COMM_FAIL|0x0E008006|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 6 is not responding on the management bus" EN_BLADE_7_COMM_FAIL|0x0E008007|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"SP Communications Failure on Blade 7" EN_BLADE_7_COMM_FAIL|0x0E008007|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 7 is not responding on the management bus" EN_BLADE_8_COMM_FAIL|0x0E008008|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"SP Communications Failure on Blade 8" EN_BLADE_8_COMM_FAIL|0x0E008008|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 8 is not responding on the management bus" EN_BLADE_9_COMM_FAIL|0x0E008009|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"SP Communications Failure on Blade 9" EN_BLADE_9_COMM_FAIL|0x0E008009|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 9 is not responding on the management bus" EN_BLADE_A_COMM_FAIL|0x0E00800A|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"SP Communications Failure on Blade 10" EN_BLADE_A_COMM_FAIL|0x0E00800A|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 10 is not responding on the management bus" EN_BLADE_B_COMM_FAIL|0x0E00800B|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"SP Communications Failure on Blade 11" EN_BLADE_B_COMM_FAIL|0x0E00800B|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 11 is not responding on the management bus" EN_BLADE_C_COMM_FAIL|0x0E00800C|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"SP Communications Failure on Blade 12" EN_BLADE_C_COMM_FAIL|0x0E00800C|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 12 is not responding on the management bus" EN_BLADE_D_COMM_FAIL|0x0E00800D|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"SP Communications Failure on Blade 13" EN_BLADE_D_COMM_FAIL|0x0E00800D|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 13 is not responding on the management bus" EN_BLADE_E_COMM_FAIL|0x0E00800E|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"SP Communications Failure on Blade 14" EN_BLADE_E_COMM_FAIL|0x0E00800E|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 14 is not responding on the management bus" EN_BLADE_1_THROTTLED|0x0E00C001|SAHPI_MINOR|OVR_SEV,OVR_RID|"Blade 1 is throttled" EN_BLADE_1_THROTTLED|0x0E00C001|SAHPI_MINOR|OVR_SEV,OVR_RID|"Blade 1 throttled" EN_BLADE_2_THROTTLED|0x0E00C002|SAHPI_MINOR|OVR_SEV,OVR_RID|"Blade 2 is throttled" EN_BLADE_2_THROTTLED|0x0E00C002|SAHPI_MINOR|OVR_SEV,OVR_RID|"Blade 2 throttled" EN_BLADE_3_THROTTLED|0x0E00C003|SAHPI_MINOR|OVR_SEV,OVR_RID|"Blade 3 is throttled" EN_BLADE_3_THROTTLED|0x0E00C003|SAHPI_MINOR|OVR_SEV,OVR_RID|"Blade 3 throttled" EN_BLADE_4_THROTTLED|0x0E00C004|SAHPI_MINOR|OVR_SEV,OVR_RID|"Blade 4 is throttled" EN_BLADE_4_THROTTLED|0x0E00C004|SAHPI_MINOR|OVR_SEV,OVR_RID|"Blade 4 throttled" EN_BLADE_5_THROTTLED|0x0E00C005|SAHPI_MINOR|OVR_SEV,OVR_RID|"Blade 5 is throttled" EN_BLADE_5_THROTTLED|0x0E00C005|SAHPI_MINOR|OVR_SEV,OVR_RID|"Blade 5 throttled" EN_BLADE_6_THROTTLED|0x0E00C006|SAHPI_MINOR|OVR_SEV,OVR_RID|"Blade 6 is throttled" EN_BLADE_6_THROTTLED|0x0E00C006|SAHPI_MINOR|OVR_SEV,OVR_RID|"Blade 6 throttled" EN_BLADE_7_THROTTLED|0x0E00C007|SAHPI_MINOR|OVR_SEV,OVR_RID|"Blade 7 is throttled" EN_BLADE_7_THROTTLED|0x0E00C007|SAHPI_MINOR|OVR_SEV,OVR_RID|"Blade 7 throttled" EN_BLADE_8_THROTTLED|0x0E00C008|SAHPI_MINOR|OVR_SEV,OVR_RID|"Blade 8 is throttled" EN_BLADE_8_THROTTLED|0x0E00C008|SAHPI_MINOR|OVR_SEV,OVR_RID|"Blade 8 throttled" EN_BLADE_9_THROTTLED|0x0E00C009|SAHPI_MINOR|OVR_SEV,OVR_RID|"Blade 9 is throttled" EN_BLADE_9_THROTTLED|0x0E00C009|SAHPI_MINOR|OVR_SEV,OVR_RID|"Blade 9 throttled" EN_BLADE_10_THROTTLED|0x0E00C00A|SAHPI_MINOR|OVR_SEV,OVR_RID|"Blade 10 is throttled" EN_BLADE_10_THROTTLED|0x0E00C00A|SAHPI_MINOR|OVR_SEV,OVR_RID|"Blade 10 throttled" EN_BLADE_11_THROTTLED|0x0E00C00B|SAHPI_MINOR|OVR_SEV,OVR_RID|"Blade 11 is throttled" EN_BLADE_11_THROTTLED|0x0E00C00B|SAHPI_MINOR|OVR_SEV,OVR_RID|"Blade 11 throttled" EN_BLADE_12_THROTTLED|0x0E00C00C|SAHPI_MINOR|OVR_SEV,OVR_RID|"Blade 12 is throttled" EN_BLADE_12_THROTTLED|0x0E00C00C|SAHPI_MINOR|OVR_SEV,OVR_RID|"Blade 12 throttled" EN_BLADE_13_THROTTLED|0x0E00C00D|SAHPI_MINOR|OVR_SEV,OVR_RID|"Blade 13 is throttled" EN_BLADE_13_THROTTLED|0x0E00C00D|SAHPI_MINOR|OVR_SEV,OVR_RID|"Blade 13 throttled" EN_BLADE_14_THROTTLED|0x0E00C00E|SAHPI_MINOR|OVR_SEV,OVR_RID|"Blade 14 is throttled" EN_BLADE_14_THROTTLED|0x0E00C00E|SAHPI_MINOR|OVR_SEV,OVR_RID|"Blade 14 throttled" EN_CKVM_FAULT|0x0A000000|SAHPI_MINOR|OVR_SEV|"cKVM card fault" EN_BOOT_FAIL|0x00000077|SAHPI_MAJOR|OVR_SEV|"System Boot Failed" EN_CPU_1_DISABLED|0x04204001|SAHPI_MAJOR|OVR_SEV|"CPU 1 disabled" EN_CPU_2_DISABLED|0x04204002|SAHPI_MAJOR|OVR_SEV|"CPU 2 disabled" EN_CPU_3_DISABLED|0x04204003|SAHPI_MAJOR|OVR_SEV|"CPU 3 disabled" EN_CPU_4_DISABLED|0x04204004|SAHPI_MAJOR|OVR_SEV|"CPU 4 disabled" EN_IERR_CPU_RESTART1|0x04306201|SAHPI_MAJOR|OVR_SEV|"CPU 1 halted" EN_IERR_CPU_RESTART2|0x04306202|SAHPI_MAJOR|OVR_SEV|"CPU 2 halted" EN_IERR_CPU_RESTART3|0x04306203|SAHPI_MAJOR|OVR_SEV|"CPU 3 halted" EN_IERR_CPU_RESTART4|0x04306204|SAHPI_MAJOR|OVR_SEV|"CPU 4 halted" EN_NC_VOLT|0x0000006F|SAHPI_MAJOR|OVR_SEV|"System over/under recommended voltage" EN_NC_VOLT|0x0000006F|SAHPI_MAJOR|OVR_SEV|"Blade voltage outside of recommended range" EN_FP_NP|0x09025000|SAHPI_MAJOR|OVR_SEV|"Front panel cable is not connected to system board" EN_CPU1_TEMP_WARN|0x0421D401|SAHPI_MAJOR|OVR_SEV|"CPU 1 temperature warning" EN_CPU2_TEMP_WARN|0x0421D402|SAHPI_MAJOR|OVR_SEV|"CPU 2 temperature warning" EN_PFA_HI_EXCEDED_CUR_12V_A_MAX|0x0801B402|SAHPI_MAJOR|OVR_SEV|"Blade 12V over recommended current" EN_FAULT_DASD1_HARD_DRIVE_0|0x06802000|SAHPI_CRITICAL|OVR_SEV|"Hard drive 0 fault" EN_FAULT_DASD1_HARD_DRIVE_1|0x06800001|SAHPI_CRITICAL|OVR_SEV|"Hard drive 1 fault" # 8839 side board voltage events but these cannot be read through SNMP EN_IO_1_8V_WARNING_HI|0x0A07BC00|SAHPI_MAJOR|OVR_SEV|"IO Board +1.8V over recommended voltage" EN_IO_1_8V_WARNING_HI|0x0A07BC00|SAHPI_MAJOR|OVR_SEV|"I/O board 1.8V over recommended voltage" EN_IO_1_8V_WARNING_LOW|0x0A07AC00|SAHPI_MAJOR|OVR_SEV|"IO Board +1.8V under recommended voltage" EN_IO_1_8V_WARNING_LOW|0x0A07AC00|SAHPI_MAJOR|OVR_SEV|"I/O board 1.8V under recommended voltage" EN_IO_2_5VS_WARNING_HI|0x0A031C01|SAHPI_MAJOR|OVR_SEV|"I/O board 2.5V standby over recommended voltage" EN_IO_2_5VS_WARNING_LOW|0x0A030C01|SAHPI_MAJOR|OVR_SEV|"I/O board 2.5V standby under recommended voltage" EN_IO_3_3VS_WARNING_HI|0x0A02DC01|SAHPI_MAJOR|OVR_SEV|"I/O board 3.3V standby over recommended voltage" EN_IO_3_3VS_WARNING_LOW|0x0A02CC01|SAHPI_MAJOR|OVR_SEV|"I/O board 3.3V standby under recommended voltage" EN_IO_12VS_WARNING_HI|0x0A037C01|SAHPI_MAJOR|OVR_SEV|"I/O board 12V standby over recommended voltage" EN_IO_12VS_WARNING_LOW|0x0A036C01|SAHPI_MAJOR|OVR_SEV|"I/O board 12V standby under recommended voltage" EN_IO_N5V_WARNING_HI|0x0A03DC00|SAHPI_MAJOR|OVR_SEV|"I/O board -5V over recommended voltage" EN_IO_N5V_WARNING_LOW|0x0A03CC00|SAHPI_MAJOR|OVR_SEV|"I/O board -5V under recommended voltage" # IPMI events EN_IPMI_CPU_SPEED_FAIL|0x00216025|SAHPI_MAJOR|OVR_SEV|"CPU speed failure" EN_IPMI_CPU_VOLT_MISMATCH|0x00216024|SAHPI_MAJOR|OVR_SEV|"CPU voltage mismatch" EN_IPMI_PROC_INIT_FAIL|0x0021603D|SAHPI_MAJOR|OVR_SEV|"Failure during processor initialization" EN_IPMI_SP2_INIT_FAIL|0x00216028|SAHPI_MAJOR|OVR_SEV|"Failure during secondary processor initialization" EN_IPMI_BOARD_INIT_FAIL|0x00216039|SAHPI_MAJOR|OVR_SEV|"Failure during board initialization" EN_IPMI_BOOT_MEDIA_MISSING|0x00216020|SAHPI_MAJOR|OVR_SEV|"Removable boot media missing" EN_IPMI_CACHE_INIT_FAIL|0x0021602F|SAHPI_MAJOR|OVR_SEV|"Failure during cache initialization" EN_IPMI_DISK_CTRL_FAIL|0x0021601E|SAHPI_MAJOR|OVR_SEV|"Hard disk controller failure" EN_IPMI_DRIVE_INIT_FAIL|0x00216027|SAHPI_MAJOR|OVR_SEV|"Failure during hard drive initialization" EN_IPMI_FW_ROM_CORRUPT|0x00216023|SAHPI_MAJOR|OVR_SEV|"Firmware ROM corruption" EN_IPMI_MEM_FAILED|0x0021601A|SAHPI_MAJOR|OVR_SEV|"All memory has failed" EN_IPMI_MEM_INIT_FAIL|0x00216026|SAHPI_MAJOR|OVR_SEV|"Failure during memory initialization" EN_IPMI_MGMT_CTRL_INIT_FAIL|0x00216032|SAHPI_MAJOR|OVR_SEV|"Failure during management controller initialization" EN_IPMI_NO_MEM|0x00216019|SAHPI_MAJOR|OVR_SEV|"No memory installed" EN_IPMI_OS_BOOT_FAIL|0x00216038|SAHPI_MAJOR|OVR_SEV|"Failure starting OS boot process" EN_IPMI_PCI_CONF_FAIL|0x0021602B|SAHPI_MAJOR|OVR_SEV|"Failure during PCI configuration" EN_IPMI_PCI_SERR|0x00216011|SAHPI_MAJOR|OVR_SEV|"PCI SERR: system error" EN_IPMI_ROM_INIT_FAIL|0x0021602D|SAHPI_MAJOR|OVR_SEV|"Failure during option ROM initialization" EN_IPMI_STORAGE_DEV_FAIL|0x0021601B|SAHPI_MAJOR|OVR_SEV|"Storage device failure" EN_IPMI_USB_CONF_FAIL|0x0021602C|SAHPI_MAJOR|OVR_SEV|"Failure during USB configuration" EN_WAKEUP_VECTOR_FAIL|0x00216037|SAHPI_MAJOR|OVR_SEV|"Failure calling OS wakeup vector" EN_BIOS_RTC|0xBBBB0001|SAHPI_MAJOR|OVR_SEV|"The System real time clock battery is no longer reliable" #### Mapped to Install Error Operational State # On old MMs (MM and CMM1), the blade is not allowed to power up if an incompatible switch is already installed. # On newer AMMs, the blade is allowed to power up. EN_BLADE_1_CFG_FAIL|0x0E006001|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade Server 1 is incompatible with I/O module configuration" EN_BLADE_1_CFG_FAIL|0x0E006001|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade 1 incompatible with I/O module configuration" EN_BLADE_2_CFG_FAIL|0x0E006002|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade Server 2 is incompatible with I/O module configuration" EN_BLADE_2_CFG_FAIL|0x0E006002|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade 2 incompatible with I/O module configuration" EN_BLADE_3_CFG_FAIL|0x0E006003|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade Server 3 is incompatible with I/O module configuration" EN_BLADE_3_CFG_FAIL|0x0E006003|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade 3 incompatible with I/O module configuration" EN_BLADE_4_CFG_FAIL|0x0E006004|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade Server 4 is incompatible with I/O module configuration" EN_BLADE_4_CFG_FAIL|0x0E006004|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade 4 incompatible with I/O module configuration" EN_BLADE_5_CFG_FAIL|0x0E006005|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade Server 5 is incompatible with I/O module configuration" EN_BLADE_5_CFG_FAIL|0x0E006005|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade 5 incompatible with I/O module configuration" EN_BLADE_6_CFG_FAIL|0x0E006006|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade Server 6 is incompatible with I/O module configuration" EN_BLADE_6_CFG_FAIL|0x0E006006|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade 6 incompatible with I/O module configuration" EN_BLADE_7_CFG_FAIL|0x0E006007|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade Server 7 is incompatible with I/O module configuration" EN_BLADE_7_CFG_FAIL|0x0E006007|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade 7 incompatible with I/O module configuration" EN_BLADE_8_CFG_FAIL|0x0E006008|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade Server 8 is incompatible with I/O module configuration" EN_BLADE_8_CFG_FAIL|0x0E006008|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade 8 incompatible with I/O module configuration" EN_BLADE_9_CFG_FAIL|0x0E006009|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade Server 9 is incompatible with I/O module configuration" EN_BLADE_9_CFG_FAIL|0x0E006009|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade 9 incompatible with I/O module configuration" EN_BLADE_A_CFG_FAIL|0x0E00600A|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade Server 10 is incompatible with I/O module configuration" EN_BLADE_A_CFG_FAIL|0x0E00600A|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade 10 incompatible with I/O module configuration" EN_BLADE_B_CFG_FAIL|0x0E00600B|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade Server 11 is incompatible with I/O module configuration" EN_BLADE_B_CFG_FAIL|0x0E00600B|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade 11 incompatible with I/O module configuration" EN_BLADE_C_CFG_FAIL|0x0E00600C|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade Server 12 is incompatible with I/O module configuration" EN_BLADE_C_CFG_FAIL|0x0E00600C|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade 12 incompatible with I/O module configuration" EN_BLADE_D_CFG_FAIL|0x0E00600D|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade Server 13 is incompatible with I/O module configuration" EN_BLADE_D_CFG_FAIL|0x0E00600D|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade 13 incompatible with I/O module configuration" EN_BLADE_E_CFG_FAIL|0x0E00600E|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade Server 14 is incompatible with I/O module configuration" EN_BLADE_E_CFG_FAIL|0x0E00600E|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade 14 incompatible with I/O module configuration" EN_BEM_1_FAULT|0x0EC00001|SAHPI_CRITICAL|OVR_SEV|"BEM 1 fault" EN_BEM_2_FAULT|0x0EC00002|SAHPI_CRITICAL|OVR_SEV|"BEM 2 fault" EN_BLADE_INCOMPATIABLE|0x04000280|SAHPI_CRITICAL|OVR_SEV|"Blade incompatible with chassis" EN_BSE_LEGACY_DC1_DONT_WORK|0x0D000281|SAHPI_CRITICAL|OVR_SEV|"Expansion card in slot 1 is not supported in current BSE configuration" EN_BSE_LEGACY_DC2_DONT_WORK|0x0D000282|SAHPI_CRITICAL|OVR_SEV|"Expansion card in slot 2 is not supported in current BSE configuration" EN_POWER_JUMPER_NP|0x04000300|SAHPI_CRITICAL|OVR_SEV|"Power jumper not present" EN_PWR_CONTROLLER_MISMATCH|0x08100080|SAHPI_CRITICAL|OVR_SEV|"Incompatible power controller firmware" # Blade Management Bus Operational Status Sensor - event only EN_STCONN_FAIL_BLADE_1|0x0E022001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status blade 1 communication failed" EN_STCONN_FAIL_BLADE_2|0x0E022002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status blade 2 communication failed" EN_STCONN_FAIL_BLADE_3|0x0E022003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status blade 3 communication failed" EN_STCONN_FAIL_BLADE_4|0x0E022004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status blade 4 communication failed" EN_STCONN_FAIL_BLADE_5|0x0E022005|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status blade 5 communication failed" EN_STCONN_FAIL_BLADE_6|0x0E022006|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status blade 6 communication failed" EN_STCONN_FAIL_BLADE_7|0x0E022007|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status blade 7 communication failed" EN_STCONN_FAIL_BLADE_8|0x0E022008|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status blade 8 communication failed" EN_STCONN_FAIL_BLADE_9|0x0E022009|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status blade 9 communication failed" EN_STCONN_FAIL_BLADE_10|0x0E02200A|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status blade 10 communication failed" EN_STCONN_FAIL_BLADE_11|0x0E02200B|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status blade 11 communication failed" EN_STCONN_FAIL_BLADE_12|0x0E02200C|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status blade 12 communication failed" EN_STCONN_FAIL_BLADE_13|0x0E02200D|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status blade 13 communication failed" EN_STCONN_FAIL_BLADE_14|0x0E02200E|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status blade 14 communication failed" # Blade NMI Status Sensor EN_SYSERR_LED_ONLY|0x0000007E|SAHPI_CRITICAL|OVR_SEV|"Critical Interrupt - Front panel NMI" ################################# # Blade Expansion Module Resource ################################# # None ################################ # Blade Expansion Module Sensors ################################ # BEM Operational Sensor - event only EN_FAULT_DASD|0x06800000|SAHPI_CRITICAL|OVR_SEV,OVR_EXP|"BEM Option failure" EN_FAULT_DASD|0x06800000|SAHPI_CRITICAL|OVR_SEV,OVR_EXP|"BEM failure" EN_BSE_RAID_BATTERY_FAILURE|0x0EE18000|SAHPI_CRITICAL|OVR_SEV,OVR_EXP|"BSE RAID battery failure" EN_BSE_RAID_FAULT|0x0EE00000|SAHPI_CRITICAL|OVR_SEV,OVR_EXP|"BSE RAID fault" # First two events are for DASD on blades and aren't currently generated #EN_DASD1_REMOVED_DRIVE_0|0x0681E000|SAHPI_INFORMATIONAL|OVR_SEV,OVR_EXP|"Hard drive 0 removal detected" #EN_DASD1_REMOVED_DRIVE_1|0x0681E001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_EXP|"Hard drive 1 removal detected" EN_DASD1_REMOVED_DRIVE_2|0x0681E002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_EXP|"Hard drive 2 removal detected" EN_DASD1_REMOVED_DRIVE_3|0x0681E003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_EXP|"Hard drive 3 removal detected" EN_DASD1_REMOVED_DRIVE_4|0x0681E004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_EXP|"Hard drive 4 removal detected" EN_FAULT_DASD1_SCSI_ID_2|0x06801002|SAHPI_CRITICAL|OVR_SEV,OVR_EXP|"Hard Drive Fault (SCSI ID 2)" EN_FAULT_DASD1_HARD_DRIVE_2|0x06800002|SAHPI_CRITICAL|OVR_SEV,OVR_EXP|"Hard drive 2 fault" EN_FAULT_DASD1_SCSI_ID_3|0x06801003|SAHPI_CRITICAL|OVR_SEV,OVR_EXP|"Hard Drive Fault (SCSI ID 3)" EN_FAULT_DASD1_HARD_DRIVE_3|0x06800003|SAHPI_CRITICAL|OVR_SEV,OVR_EXP|"Hard drive 3 fault" EN_FAULT_DASD1_HARD_DRIVE_4|0x06800004|SAHPI_CRITICAL|OVR_SEV,OVR_EXP|"Hard drive 4 fault" ###################################### # Blade Storage Expansion (BSE) Module ###################################### # BEM Temperature Sensor - event only EN_CUTOFF_HI_OVER_TEMP_BEM|0x0621C481|SAHPI_CRITICAL|OVR_SEV,OVR_EXP|"System shutoff due to BEM Option temperature" EN_CUTOFF_HI_OVER_TEMP_BEM|0x0621C481|SAHPI_CRITICAL|OVR_SEV,OVR_EXP|"BEM temperature fault" EN_CUTOFF_HI_OVER_TEMP_DASD1_2|0x0681C482|SAHPI_CRITICAL|OVR_SEV,OVR_EXP|"System shutoff due to DASD Option temperature" #EN_CUTOFF_HI_OVER_TEMP_DASD1_3|0x0681C483|SAHPI_CRITICAL|OVR_SEV,OVR_EXP|"System shutoff due to DASD Option temperature" EN_OVER_TEMP_BEM|0x0621C081|SAHPI_CRITICAL|OVR_SEV,OVR_EXP|"BEM 1 Over Temperature" EN_PFA_HI_OVER_TEMP_BEM|0x0621D481|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM over recommended temperature" EN_PFA_HI_OVER_TEMP_BEM|0x0621D481|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM Option over recommended temperature" EN_PFA_HI_OVER_TEMP_BEM|0x0681D481|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"DASD Option over recommended temperature" # BEM Voltage Sensor - event only EN_BEM_1V_WARNING_HI|0x0E850402|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM 1V over recommended voltage" EN_BEM_1V_WARNING_LOW|0x0E850802|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM 1V under recommended voltage" EN_BEM_1_5V_WARNING_HI|0x0E840402|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM +1.5V over recommended voltage" EN_BEM_1_5V_WARNING_HI|0x0E840402|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM 1.5V over recommended voltage" EN_BEM_1_5V_WARNING_LOW|0x0E840802|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM +1.5V under recommended voltage" EN_BEM_1_5V_WARNING_LOW|0x0E840802|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM 1.5V under recommended voltage" EN_BEM_1_8V_WARNING_HI|0x0E87A402|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM +1.8V over recommended voltage" EN_BEM_1_8V_WARNING_HI|0x0E87A402|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM 1.8V over recommended voltage" EN_BEM_1_8V_WARNING_LOW|0x0E87A802|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM +1.8V under recommended voltage" EN_BEM_1_8V_WARNING_LOW|0x0E87A802|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM 1.8V under recommended voltage" EN_BEM_2_5V_WARNING_HI|0x0E830402|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM +2.5V over recommended voltage" EN_BEM_2_5V_WARNING_HI|0x0E830402|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM 2.5V over recommended voltage" EN_BEM_2_5V_WARNING_LOW|0x0E830802|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM +2.5V under recommended voltage" EN_BEM_2_5V_WARNING_LOW|0x0E830802|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM 2.5V under recommended voltage" EN_BEM_3_3V_WARNING_HI|0x0E832402|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM +3.3V over recommended voltage" EN_BEM_3_3V_WARNING_HI|0x0E832402|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM 3.3V over recommended voltage" EN_BEM_3_3V_WARNING_LOW|0x0E832802|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM +3.3V under recommended voltage" EN_BEM_3_3V_WARNING_LOW|0x0E832802|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM 3.3V under recommended voltage" EN_BEM_5V_WARNING_HI|0x0E834402|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM +5V over recommended voltage" EN_BEM_5V_WARNING_HI|0x0E834402|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM 5V over recommended voltage" EN_BEM_5V_WARNING_LOW|0x0E834802|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM +5V under recommended voltage" EN_BEM_5V_WARNING_LOW|0x0E834802|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM 5V under recommended voltage" EN_BEM_12V_WARNING_HI|0x0E836402|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM +12V over recommended voltage" EN_BEM_12V_WARNING_HI|0x0E836402|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM 12V over recommended voltage" EN_BEM_12V_WARNING_LOW|0x0E836802|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM +12V under recommended voltage" EN_BEM_12V_WARNING_LOW|0x0E836802|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM 12V under recommended voltage" EN_BEM_12VSB_WARNING_HI|0x0E860402|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM 12V standby over recommended voltage" EN_BEM_12VSB_WARNING_LOW|0x0E860802|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM 12V standby under recommended voltage" EN_BEM_18V_WARNING_HI|0x0E83C402|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM +18V over recommended voltage" EN_BEM_18V_WARNING_HI|0x0E83C402|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM 18V over recommended voltage" EN_BEM_18V_WARNING_LOW|0x0E83C802|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM +18V under recommended voltage" EN_BEM_18V_WARNING_LOW|0x0E83C802|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM 18V under recommended voltage" ############################# # PCI Expansion (PEU2) Module ############################# # PEU2 Temperature Sensor EN_GENERIC_HI_CRIT_TEMP|0xFFFFFF26|SAHPI_CRITICAL|OVR_SEV|"expansion board 3 (PEU2 Local Temp) over critical temperature" EN_GENERIC_HI_CRIT_TEMP|0xFFFFFF26|SAHPI_CRITICAL|OVR_SEV|"expansion board 2 (PEU2 Local Temp) over critical temperature" EN_GENERIC_HI_WARN_TEMP|0xFFFFFF27|SAHPI_MAJOR|OVR_SEV|"expansion board 3 (PEU2 Local Temp) over recommended temperature" EN_GENERIC_HI_WARN_TEMP|0xFFFFFF27|SAHPI_MAJOR|OVR_SEV|"expansion board 2 (PEU2 Local Temp) over recommended temperature" # PEU2 1 Volt Sensor EN_GENERIC_UPPER_WARN_VOLT|0xFFFFFF28|SAHPI_MAJOR|OVR_SEV|"expansion board 3 (PEU2 1V Sense) over recommended voltage" EN_GENERIC_LOWER_WARN_VOLT|0xFFFFFF29|SAHPI_MAJOR|OVR_SEV|"expansion board 3 (PEU2 1V Sense) under recommended voltage" # PEU2 3.3 Volt Sensor EN_GENERIC_UPPER_WARN_VOLT|0xFFFFFF2A|SAHPI_MAJOR|OVR_SEV|"expansion board 3 (PEU2 3.3V Sense) over recommended voltage" EN_GENERIC_LOWER_WARN_VOLT|0xFFFFFF2B|SAHPI_MAJOR|OVR_SEV|"expansion board 3 (PEU2 3.3V Sense) under recommended voltage" # PEU2 5 Volt Sensor EN_GENERIC_UPPER_WARN_VOLT|0xFFFFFF2C|SAHPI_MAJOR|OVR_SEV|"expansion board 3 (PEU2 5V Sense) over recommended voltage" EN_GENERIC_LOWER_WARN_VOLT|0xFFFFFF2D|SAHPI_MAJOR|OVR_SEV|"expansion board 3 (PEU2 5V Sense) under recommended voltage" # PEU2 12 Volt Sensor EN_GENERIC_UPPER_WARN_VOLT|0xFFFFFF30|SAHPI_MAJOR|OVR_SEV|"expansion board 3 (PEU2 12V Sense) over recommended voltage" EN_GENERIC_LOWER_WARN_VOLT|0xFFFFFF31|SAHPI_MAJOR|OVR_SEV|"expansion board 3 (PEU2 12V Sense) under recommended voltage" # PEU2 Standby 12 Volt Sensor EN_GENERIC_UPPER_WARN_VOLT|0xFFFFFF32|SAHPI_MAJOR|OVR_SEV|"expansion board 3 (PEU2 12VSB Sense) over recommended voltage" EN_GENERIC_LOWER_WARN_VOLT|0xFFFFFF33|SAHPI_MAJOR|OVR_SEV|"expansion board 3 (PEU2 12VSB Sense) under recommended voltage" ################################## # BIE (Blade I/O Expansion) Module ################################## # BIE Temperature Sensor EN_GENERIC_HI_CRIT_TEMP|0xFFFFFF34|SAHPI_CRITICAL|OVR_SEV|"expansion board 1 (BIE Local Temp) over critical temperature" EN_GENERIC_HI_WARN_TEMP|0xFFFFFF35|SAHPI_MAJOR|OVR_SEV|"expansion board 1 (BIE Local Temp) over recommended temperature" # BIE 1.5 Volt Sensor EN_GENERIC_UPPER_WARN_VOLT|0xFFFFFF36|SAHPI_MAJOR|OVR_SEV|"expansion board 1 (BIE 1.5V Sense) over recommended voltage" EN_GENERIC_LOWER_WARN_VOLT|0xFFFFFF37|SAHPI_MAJOR|OVR_SEV|"expansion board 1 (BIE 1.5V Sense) under recommended voltage" # BIE 3.3 Volt Sensor EN_GENERIC_UPPER_WARN_VOLT|0xFFFFFF38|SAHPI_MAJOR|OVR_SEV|"expansion board 1 (BIE 3.3V Sense) over recommended voltage" EN_GENERIC_LOWER_WARN_VOLT|0xFFFFFF39|SAHPI_MAJOR|OVR_SEV|"expansion board 1 (BIE 3.3V Sense) under recommended voltage" # BIE 5 Volt Sensor EN_GENERIC_UPPER_WARN_VOLT|0xFFFFFF3A|SAHPI_MAJOR|OVR_SEV|"expansion board 1 (BIE 5V Sense) over recommended voltage" EN_GENERIC_LOWER_WARN_VOLT|0xFFFFFF3B|SAHPI_MAJOR|OVR_SEV|"expansion board 1 (BIE 5V Sense) under recommended voltage" # BIE 12 Volt Sensor EN_GENERIC_UPPER_WARN_VOLT|0xFFFFFF3C|SAHPI_MAJOR|OVR_SEV|"expansion board 1 (BIE 12V Sense) over recommended voltage" EN_GENERIC_LOWER_WARN_VOLT|0xFFFFFF3D|SAHPI_MAJOR|OVR_SEV|"expansion board 1 (BIE 12V Sense) under recommended voltage" ##################### # Media Tray Resource ##################### # For non-AMM systems, the recovery of the removed event represents an install. EN_MEDIA_TRAY_REMOVED|0x06A1E001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"The media tray was removed" EN_MEDIA_TRAY_REMOVED|0x06A1E001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Media Tray removed" # For AMM, there are separate install/removed events EN_MEDIA_TRAY_INSTALLED|0x06A02001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Media Tray 1 installed" EN_MEDIA_TRAY_2_INSTALLED|0x06A02002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Media Tray 2 installed" EN_MEDIA_TRAY_REMOVED|0x06A1E001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Media Tray 1 removed" EN_MEDIA_TRAY_2_REMOVED|0x06A1E002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Media Tray 2 removed" #################### # Media Tray Sensors #################### # Media Tray Operational Status Sensor - event only (except for BCHT, which supports a readable Fault LED) # EN_FAULT_FP_R|0x09020000|SAHPI_MINOR|OVR_SEV,OVR_RID|"System front panel controller not responding" EN_FRONT_PANEL_TEMP_FAIL|0x06A2E001|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Media Tray 1 temperature is unavailable. Cooling capacity set to maximum" EN_FRONT_PANEL_B_TEMP_FAIL|0x06A2E002|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Media Tray 2 temperature is unavailable. Cooling capacity set to maximum" EN_MT_1_HW_FAILURE|0x6F60C001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Media Tray module 1 hardware failure" EN_MT_2_HW_FAILURE|0x6F60C002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Media Tray module 2 hardware failure" # Media Tray Management Bus Operational Status Sensor - event only EN_STCONN_FAIL_MEDIATRAY|0x0002205B|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status mediatray communication failed" EN_STCONN_FAIL_MEDIATRAY|0x0002205B|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status Media Tray 1 communication failed" EN_STCONN_FAIL_MEDIATRAYB|0x0002205C|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status Media Tray 2 communication failed" ##################### # I/O Module Resource ##################### EN_SWITCH_1_INSTALLED|0x0EA02001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 1 was installed" EN_SWITCH_1_INSTALLED|0x0EA02001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 1 installed" EN_SWITCH_2_INSTALLED|0x0EA02002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 2 was installed" EN_SWITCH_2_INSTALLED|0x0EA02002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 2 installed" EN_SWITCH_3_INSTALLED|0x0EA02003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 3 was installed" EN_SWITCH_3_INSTALLED|0x0EA02003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 3 installed" EN_SWITCH_4_INSTALLED|0x0EA02004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 4 was installed" EN_SWITCH_4_INSTALLED|0x0EA02004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 4 installed" EN_SWITCH_5_INSTALLED|0x0EA02005|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 5 installed" EN_SWITCH_6_INSTALLED|0x0EA02006|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 6 installed" EN_SWITCH_7_INSTALLED|0x0EA02007|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 7 installed" EN_SWITCH_8_INSTALLED|0x0EA02008|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 8 installed" EN_SWITCH_9_INSTALLED|0x0EA02009|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 9 installed" EN_SWITCH_10_INSTALLED|0x0EA0200A|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 10 installed" EN_SWITCH_1_INSTALLED|0x0EA02001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 1 was installed Multiple I/O module failures" EN_SWITCH_1_INSTALLED|0x0EA02001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 1 installed Multiple I/O module failures" EN_SWITCH_2_INSTALLED|0x0EA02002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 2 was installed Multiple I/O module failures" EN_SWITCH_2_INSTALLED|0x0EA02002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 2 installed Multiple I/O module failures" EN_SWITCH_3_INSTALLED|0x0EA02003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 3 was installed Multiple I/O module failures" EN_SWITCH_3_INSTALLED|0x0EA02003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 3 installed Multiple I/O module failures" EN_SWITCH_4_INSTALLED|0x0EA02004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 4 was installed Multiple I/O module failures" EN_SWITCH_4_INSTALLED|0x0EA02004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 4 installed Multiple I/O module failures" EN_SWITCH_5_INSTALLED|0x0EA02005|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 5 installed Multiple I/O module failures" EN_SWITCH_6_INSTALLED|0x0EA02006|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 6 installed Multiple I/O module failures" EN_SWITCH_7_INSTALLED|0x0EA02007|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 7 installed Multiple I/O module failures" EN_SWITCH_8_INSTALLED|0x0EA02008|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 8 installed Multiple I/O module failures" EN_SWITCH_9_INSTALLED|0x0EA02009|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 9 installed Multiple I/O module failures" EN_SWITCH_10_INSTALLED|0x0EA0200A|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 10 installed Multiple I/O module failures" EN_SWITCH_1_REMOVED|0x0EA04001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 1 was removed" EN_SWITCH_1_REMOVED|0x0EA04001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 1 removed" EN_SWITCH_2_REMOVED|0x0EA04002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 2 was removed" EN_SWITCH_2_REMOVED|0x0EA04002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 2 removed" EN_SWITCH_3_REMOVED|0x0EA04003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 3 was removed" EN_SWITCH_3_REMOVED|0x0EA04003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 3 removed" EN_SWITCH_4_REMOVED|0x0EA04004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 4 was removed" EN_SWITCH_4_REMOVED|0x0EA04004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 4 removed" EN_SWITCH_5_REMOVED|0x0EA04005|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 5 removed" EN_SWITCH_6_REMOVED|0x0EA04006|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 6 removed" EN_SWITCH_7_REMOVED|0x0EA04007|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 7 removed" EN_SWITCH_8_REMOVED|0x0EA04008|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 8 removed" EN_SWITCH_9_REMOVED|0x0EA04009|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 9 removed" EN_SWITCH_10_REMOVED|0x0EA0400A|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 10 removed" EN_SWITCH_1_REMOVED|0x0EA04001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 1 was removed Multiple I/O module failures" EN_SWITCH_1_REMOVED|0x0EA04001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 1 removed Multiple I/O module failures" EN_SWITCH_2_REMOVED|0x0EA04002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 2 was removed Multiple I/O module failures" EN_SWITCH_2_REMOVED|0x0EA04002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 2 removed Multiple I/O module failures" EN_SWITCH_3_REMOVED|0x0EA04003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 3 was removed Multiple I/O module failures" EN_SWITCH_3_REMOVED|0x0EA04003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 3 removed Multiple I/O module failures" EN_SWITCH_4_REMOVED|0x0EA04004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 4 was removed Multiple I/O module failures" EN_SWITCH_4_REMOVED|0x0EA04004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 4 removed Multiple I/O module failures" EN_SWITCH_5_REMOVED|0x0EA04005|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 5 removed Multiple I/O module failures" EN_SWITCH_6_REMOVED|0x0EA04006|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 6 removed Multiple I/O module failures" EN_SWITCH_7_REMOVED|0x0EA04007|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 7 removed Multiple I/O module failures" EN_SWITCH_8_REMOVED|0x0EA04008|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 8 removed Multiple I/O module failures" EN_SWITCH_9_REMOVED|0x0EA04009|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 9 removed Multiple I/O module failures" EN_SWITCH_10_REMOVED|0x0EA0400A|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 10 removed Multiple I/O module failures" EN_SWITCH_1_POWERED_OFF|0x0EA06001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 1 was instructed to power off" EN_SWITCH_2_POWERED_OFF|0x0EA06002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 2 was instructed to power off" EN_SWITCH_3_POWERED_OFF|0x0EA06003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 3 was instructed to power off" EN_SWITCH_4_POWERED_OFF|0x0EA06004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 4 was instructed to power off" EN_SWITCH_5_POWERED_OFF|0x0EA06005|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 5 was instructed to power off" EN_SWITCH_6_POWERED_OFF|0x0EA06006|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 6 was instructed to power off" EN_SWITCH_7_POWERED_OFF|0x0EA06007|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 7 was instructed to power off" EN_SWITCH_8_POWERED_OFF|0x0EA06008|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 8 was instructed to power off" EN_SWITCH_9_POWERED_OFF|0x0EA06009|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 9 was instructed to power off" EN_SWITCH_10_POWERED_OFF|0x0EA0600A|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 10 was instructed to power off" EN_SWITCH_1_POWERED_ON|0x0EA08001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 1 was instructed to power on" EN_SWITCH_2_POWERED_ON|0x0EA08002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 2 was instructed to power on" EN_SWITCH_3_POWERED_ON|0x0EA08003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 3 was instructed to power on" EN_SWITCH_4_POWERED_ON|0x0EA08004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 4 was instructed to power on" EN_SWITCH_5_POWERED_ON|0x0EA08005|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 5 was instructed to power on" EN_SWITCH_6_POWERED_ON|0x0EA08006|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 6 was instructed to power on" EN_SWITCH_7_POWERED_ON|0x0EA08007|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 7 was instructed to power on" EN_SWITCH_8_POWERED_ON|0x0EA08008|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 8 was instructed to power on" EN_SWITCH_9_POWERED_ON|0x0EA08009|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 9 was instructed to power on" EN_SWITCH_10_POWERED_ON|0x0EA0800A|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 10 was instructed to power on" #################### # I/O Module Sensors #################### # I/O Module Operational Status Sensor EN_FAULT_SWITCH_1|0x0EA00001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 1 Fault" EN_FAULT_SWITCH_1|0x0EA00001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 1 fault" EN_FAULT_SWITCH_1|0x0EA00001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 1 Fault Multiple I/O module failures" EN_FAULT_SWITCH_1|0x0EA00001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 1 fault Multiple I/O module failures" EN_FAULT_SWITCH_2|0x0EA00002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 2 Fault" EN_FAULT_SWITCH_2|0x0EA00002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 2 fault" EN_FAULT_SWITCH_2|0x0EA00002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 2 Fault Multiple I/O module failures" EN_FAULT_SWITCH_2|0x0EA00002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 2 fault Multiple I/O module failures" EN_FAULT_SWITCH_3|0x0EA00003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 3 Fault" EN_FAULT_SWITCH_3|0x0EA00003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 3 fault" EN_FAULT_SWITCH_3|0x0EA00003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 3 Fault Multiple I/O module failures" EN_FAULT_SWITCH_3|0x0EA00003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 3 fault Multiple I/O module failures" EN_FAULT_SWITCH_4|0x0EA00004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 4 Fault" EN_FAULT_SWITCH_4|0x0EA00004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 4 fault" EN_FAULT_SWITCH_4|0x0EA00004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 4 Fault Multiple I/O module failures" EN_FAULT_SWITCH_4|0x0EA00004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 4 fault Multiple I/O module failures" EN_FAULT_SWITCH_5|0x0EA00005|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 5 fault" EN_FAULT_SWITCH_5|0x0EA00005|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 5 fault Multiple I/O module failures" EN_FAULT_SWITCH_6|0x0EA00006|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 6 fault" EN_FAULT_SWITCH_6|0x0EA00006|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 6 fault Multiple I/O module failures" EN_FAULT_SWITCH_7|0x0EA00007|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 7 fault" EN_FAULT_SWITCH_7|0x0EA00007|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 7 fault Multiple I/O module failures" EN_FAULT_SWITCH_8|0x0EA00008|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 8 fault" EN_FAULT_SWITCH_8|0x0EA00008|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 8 fault Multiple I/O module failures" EN_FAULT_SWITCH_9|0x0EA00009|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 9 fault" EN_FAULT_SWITCH_9|0x0EA00009|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 9 fault Multiple I/O module failures" EN_FAULT_SWITCH_10|0x0EA0000A|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 10 fault" EN_FAULT_SWITCH_10|0x0EA0000A|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 10 fault Multiple I/O module failures" EN_SWITCH_1_INSUFFICIENT_PWR|0x0E00B001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Switch 1 is not allowed to power on because of insufficient power" EN_SWITCH_1_INSUFFICIENT_PWR|0x0E00B001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 1 is not allowed to power on due to insufficient power" EN_SWITCH_2_INSUFFICIENT_PWR|0x0E00B002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Switch 2 is not allowed to power on because of insufficient power" EN_SWITCH_2_INSUFFICIENT_PWR|0x0E00B002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 2 is not allowed to power on due to insufficient power" EN_SWITCH_3_INSUFFICIENT_PWR|0x0E00B003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Switch 3 is not allowed to power on because of insufficient power" EN_SWITCH_3_INSUFFICIENT_PWR|0x0E00B003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 3 is not allowed to power on due to insufficient power" EN_SWITCH_4_INSUFFICIENT_PWR|0x0E00B004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Switch 4 is not allowed to power on because of insufficient power" EN_SWITCH_4_INSUFFICIENT_PWR|0x0E00B004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 4 is not allowed to power on due to insufficient power" EN_SWITCH_5_INSUFFICIENT_PWR|0x0E00B005|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 5 is not allowed to power on due to insufficient power" EN_SWITCH_6_INSUFFICIENT_PWR|0x0E00B006|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 6 is not allowed to power on due to insufficient power" EN_SWITCH_7_INSUFFICIENT_PWR|0x0E00B007|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 7 is not allowed to power on due to insufficient power" EN_SWITCH_8_INSUFFICIENT_PWR|0x0E00B008|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 8 is not allowed to power on due to insufficient power" EN_SWITCH_9_INSUFFICIENT_PWR|0x0E00B009|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 9 is not allowed to power on due to insufficient power" EN_SWITCH_10_INSUFFICIENT_PWR|0x0E00B00A|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 10 is not allowed to power on due to insufficient power" # In old MM code, this condition caused the I/O module not to be powered up. In newer MM2 code, this condition is # just a warning and the I/O module powers on. EN_SWITCH_1_CFG_ERROR|0x0EA0C001|SAHPI_MINOR|OVR_SEV,OVR_RID|"I/O module 1 is incompatible with Blade Server configuration" EN_SWITCH_1_CFG_ERROR|0x0EA0C001|SAHPI_MINOR|OVR_SEV,OVR_RID|"I/O Module 1 incompatible with blade configuration" EN_SWITCH_2_CFG_ERROR|0x0EA0C002|SAHPI_MINOR|OVR_SEV,OVR_RID|"I/O module 2 is incompatible with Blade Server configuration" EN_SWITCH_2_CFG_ERROR|0x0EA0C002|SAHPI_MINOR|OVR_SEV,OVR_RID|"I/O Module 2 incompatible with blade configuration" EN_SWITCH_3_CFG_ERROR|0x0EA0C003|SAHPI_MINOR|OVR_SEV,OVR_RID|"I/O module 3 is incompatible with Blade Server configuration" EN_SWITCH_3_CFG_ERROR|0x0EA0C003|SAHPI_MINOR|OVR_SEV,OVR_RID|"I/O Module 3 incompatible with blade configuration" EN_SWITCH_4_CFG_ERROR|0x0EA0C004|SAHPI_MINOR|OVR_SEV,OVR_RID|"I/O module 4 is incompatible with Blade Server configuration" EN_SWITCH_4_CFG_ERROR|0x0EA0C004|SAHPI_MINOR|OVR_SEV,OVR_RID|"I/O Module 4 incompatible with blade configuration" EN_SWITCH_5_CFG_ERROR|0x0EA0C005|SAHPI_MINOR|OVR_SEV,OVR_RID|"I/O Module 5 incompatible with blade configuration" EN_SWITCH_6_CFG_ERROR|0x0EA0C006|SAHPI_MINOR|OVR_SEV,OVR_RID|"I/O Module 6 incompatible with blade configuration" EN_SWITCH_7_CFG_ERROR|0x0EA0C007|SAHPI_MINOR|OVR_SEV,OVR_RID|"I/O Module 7 incompatible with blade configuration" EN_SWITCH_8_CFG_ERROR|0x0EA0C008|SAHPI_MINOR|OVR_SEV,OVR_RID|"I/O Module 8 incompatible with blade configuration" EN_SWITCH_9_CFG_ERROR|0x0EA0C009|SAHPI_MINOR|OVR_SEV,OVR_RID|"I/O Module 9 incompatible with blade configuration" EN_SWITCH_10_CFG_ERROR|0x0EA0C00A|SAHPI_MINOR|OVR_SEV,OVR_RID|"I/O Module 10 incompatible with blade configuration" EN_SWITCH_1_POST_ERROR|0x0EA0E001|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 1 POST Error" EN_SWITCH_1_POST_ERROR|0x0EA0E001|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 1 POST failure" EN_SWITCH_2_POST_ERROR|0x0EA0E002|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 2 POST Error" EN_SWITCH_2_POST_ERROR|0x0EA0E002|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 2 POST failure" EN_SWITCH_3_POST_ERROR|0x0EA0E003|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 3 POST Error" EN_SWITCH_3_POST_ERROR|0x0EA0E003|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 3 POST failure" EN_SWITCH_4_POST_ERROR|0x0EA0E004|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 4 POST Error" EN_SWITCH_4_POST_ERROR|0x0EA0E004|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 4 POST failure" EN_SWITCH_5_POST_ERROR|0x0EA0E005|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 5 POST failure" EN_SWITCH_6_POST_ERROR|0x0EA0E006|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 6 POST failure" EN_SWITCH_7_POST_ERROR|0x0EA0E007|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 7 POST failure" EN_SWITCH_8_POST_ERROR|0x0EA0E008|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 8 POST failure" EN_SWITCH_9_POST_ERROR|0x0EA0E009|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 9 POST failure" EN_SWITCH_10_POST_ERROR|0x0EA0E00A|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 10 POST failure" EN_SWITCH_1_POST_ERROR|0x0EA0E001|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 1 POST Error. Multiple I/O module failures" EN_SWITCH_1_POST_ERROR|0x0EA0E001|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 1 POST failure Multiple I/O module failures" EN_SWITCH_2_POST_ERROR|0x0EA0E002|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 2 POST Error. Multiple I/O module failures" EN_SWITCH_2_POST_ERROR|0x0EA0E002|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 2 POST failure Multiple I/O module failures" EN_SWITCH_3_POST_ERROR|0x0EA0E003|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 3 POST Error. Multiple I/O module failures" EN_SWITCH_3_POST_ERROR|0x0EA0E003|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 3 POST failure Multiple I/O module failures" EN_SWITCH_4_POST_ERROR|0x0EA0E004|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 4 POST Error. Multiple I/O module failures" EN_SWITCH_4_POST_ERROR|0x0EA0E004|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 4 POST failure Multiple I/O module failures" EN_SWITCH_5_POST_ERROR|0x0EA0E005|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 5 POST failure Multiple I/O module failures" EN_SWITCH_6_POST_ERROR|0x0EA0E006|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 6 POST failure Multiple I/O module failures" EN_SWITCH_7_POST_ERROR|0x0EA0E007|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 7 POST failure Multiple I/O module failures" EN_SWITCH_8_POST_ERROR|0x0EA0E008|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 8 POST failure Multiple I/O module failures" EN_SWITCH_9_POST_ERROR|0x0EA0E009|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 9 POST failure Multiple I/O module failures" EN_SWITCH_10_POST_ERROR|0x0EA0E00A|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 10 POST failure Multiple I/O module failures" EN_SWITCH_1_POST_TIMEOUT|0x0EA0D001|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 1 POST Timeout" EN_SWITCH_1_POST_TIMEOUT|0x0EA0D001|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 1 POST timeout" EN_SWITCH_2_POST_TIMEOUT|0x0EA0D002|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 2 POST Timeout" EN_SWITCH_2_POST_TIMEOUT|0x0EA0D002|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 2 POST timeout" EN_SWITCH_3_POST_TIMEOUT|0x0EA0D003|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 3 POST Timeout" EN_SWITCH_3_POST_TIMEOUT|0x0EA0D003|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 3 POST timeout" EN_SWITCH_4_POST_TIMEOUT|0x0EA0D004|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 4 POST Timeout" EN_SWITCH_4_POST_TIMEOUT|0x0EA0D004|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 4 POST timeout" EN_SWITCH_5_POST_TIMEOUT|0x0EA0D005|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 5 POST timeout" EN_SWITCH_6_POST_TIMEOUT|0x0EA0D006|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 6 POST timeout" EN_SWITCH_7_POST_TIMEOUT|0x0EA0D007|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 7 POST timeout" EN_SWITCH_8_POST_TIMEOUT|0x0EA0D008|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 8 POST timeout" EN_SWITCH_9_POST_TIMEOUT|0x0EA0D009|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 9 POST timeout" EN_SWITCH_10_POST_TIMEOUT|0x0EA0D00A|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 10 POST timeout" EN_SWITCH_1_POST_TIMEOUT|0x0EA0D001|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 1 POST Timeout. Multiple I/O module failures" EN_SWITCH_1_POST_TIMEOUT|0x0EA0D001|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 1 POST timeout. Multiple I/O module failures" EN_SWITCH_2_POST_TIMEOUT|0x0EA0D002|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 2 POST Timeout. Multiple I/O module failures" EN_SWITCH_2_POST_TIMEOUT|0x0EA0D002|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 2 POST timeout. Multiple I/O module failure" EN_SWITCH_3_POST_TIMEOUT|0x0EA0D003|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 3 POST Timeout. Multiple I/O module failures" EN_SWITCH_3_POST_TIMEOUT|0x0EA0D003|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 3 POST timeout. Multiple I/O module failures" EN_SWITCH_4_POST_TIMEOUT|0x0EA0D004|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 4 POST Timeout. Multiple I/O module failures" EN_SWITCH_4_POST_TIMEOUT|0x0EA0D004|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 4 POST timeout. Multiple I/O module failures" EN_SWITCH_5_POST_TIMEOUT|0x0EA0D005|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 5 POST timeout. Multiple I/O module failures" EN_SWITCH_6_POST_TIMEOUT|0x0EA0D006|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 6 POST timeout. Multiple I/O module failures" EN_SWITCH_7_POST_TIMEOUT|0x0EA0D007|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 7 POST timeout. Multiple I/O module failures" EN_SWITCH_8_POST_TIMEOUT|0x0EA0D008|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 8 POST timeout. Multiple I/O module failures" EN_SWITCH_9_POST_TIMEOUT|0x0EA0D009|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 9 POST timeout. Multiple I/O module failures" EN_SWITCH_10_POST_TIMEOUT|0x0EA0D00A|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 10 POST timeout. Multiple I/O module failures" EN_OVER_CURRENT_SWITCH_1|0x0EA1A401|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 1 Current Fault" EN_OVER_CURRENT_SWITCH_1|0x0EA1A401|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 1 current fault" EN_OVER_CURRENT_SWITCH_2|0x0EA1A402|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 2 Current Fault" EN_OVER_CURRENT_SWITCH_2|0x0EA1A402|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 2 current fault" EN_OVER_CURRENT_SWITCH_3|0x0EA1A403|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 3 Current Fault" EN_OVER_CURRENT_SWITCH_3|0x0EA1A403|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 3 current fault" EN_OVER_CURRENT_SWITCH_4|0x0EA1A404|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 4 Current Fault" EN_OVER_CURRENT_SWITCH_4|0x0EA1A404|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 4 current fault" EN_OVER_CURRENT_SWITCH_5|0x0EA1A405|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 5 current fault" EN_OVER_CURRENT_SWITCH_6|0x0EA1A406|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 6 current fault" EN_OVER_CURRENT_SWITCH_7|0x0EA1A407|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 7 current fault" EN_OVER_CURRENT_SWITCH_8|0x0EA1A408|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 8 current fault" EN_OVER_CURRENT_SWITCH_9|0x0EA1A409|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 9 current fault" EN_OVER_CURRENT_SWITCH_10|0x0EA1A40A|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 10 current fault" EN_OVER_CURRENT_SWITCH_1|0x0EA1A401|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 1 Current Fault Multiple I/O module failures" EN_OVER_CURRENT_SWITCH_1|0x0EA1A401|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 1 current fault Multiple I/O module failures" EN_OVER_CURRENT_SWITCH_2|0x0EA1A402|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 2 Current Fault Multiple I/O module failures" EN_OVER_CURRENT_SWITCH_2|0x0EA1A402|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 2 current fault Multiple I/O module failures" EN_OVER_CURRENT_SWITCH_3|0x0EA1A403|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 3 Current Fault Multiple I/O module failures" EN_OVER_CURRENT_SWITCH_3|0x0EA1A403|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 3 current fault Multiple I/O module failures" EN_OVER_CURRENT_SWITCH_4|0x0EA1A404|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 4 Current Fault Multiple I/O module failures" EN_OVER_CURRENT_SWITCH_4|0x0EA1A404|SAHPI_CRITICAL|OVR_SE,OVR_RIDV|"I/O module 4 current fault Multiple I/O module failures" EN_OVER_CURRENT_SWITCH_5|0x0EA1A405|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 5 current fault Multiple I/O module failures" EN_OVER_CURRENT_SWITCH_6|0x0EA1A406|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 6 current fault Multiple I/O module failures" EN_OVER_CURRENT_SWITCH_7|0x0EA1A407|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 7 current fault Multiple I/O module failures" EN_OVER_CURRENT_SWITCH_8|0x0EA1A408|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 8 current fault Multiple I/O module failures" EN_OVER_CURRENT_SWITCH_9|0x0EA1A409|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 9 current fault Multiple I/O module failures" EN_OVER_CURRENT_SWITCH_10|0x0EA1A40A|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 10 current fault Multiple I/O module failures" # I/O Module Temperature Sensor - event-only EN_OVER_TEMP_SWITCH_1|0x0EA1C401|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 1 Temperature Fault" EN_OVER_TEMP_SWITCH_1|0x0EA1C401|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 1 temperature fault" EN_OVER_TEMP_SWITCH_2|0x0EA1C402|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 2 Temperature Fault" EN_OVER_TEMP_SWITCH_2|0x0EA1C402|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 2 temperature fault" EN_OVER_TEMP_SWITCH_3|0x0EA1C403|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 3 Temperature Fault" EN_OVER_TEMP_SWITCH_3|0x0EA1C403|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 3 temperature fault" EN_OVER_TEMP_SWITCH_4|0x0EA1C404|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 4 Temperature Fault" EN_OVER_TEMP_SWITCH_4|0x0EA1C404|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 4 temperature fault" EN_OVER_TEMP_SWITCH_5|0x0EA1C405|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 5 temperature fault" EN_OVER_TEMP_SWITCH_6|0x0EA1C406|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 6 temperature fault" EN_OVER_TEMP_SWITCH_7|0x0EA1C407|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 7 temperature fault" EN_OVER_TEMP_SWITCH_8|0x0EA1C408|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 8 temperature fault" EN_OVER_TEMP_SWITCH_9|0x0EA1C409|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 9 temperature fault" EN_OVER_TEMP_SWITCH_10|0x0EA1C40A|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 10 temperature fault" EN_OVER_TEMP_SWITCH_1|0x0EA1C401|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 1 Temperature Fault Multiple I/O module failures" EN_OVER_TEMP_SWITCH_1|0x0EA1C401|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 1 temperature fault Multiple I/O module failures" EN_OVER_TEMP_SWITCH_2|0x0EA1C402|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 2 Temperature Fault Multiple I/O module failures" EN_OVER_TEMP_SWITCH_2|0x0EA1C402|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 2 temperature fault Multiple I/O module failures" EN_OVER_TEMP_SWITCH_3|0x0EA1C403|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 3 Temperature Fault Multiple I/O module failures" EN_OVER_TEMP_SWITCH_3|0x0EA1C403|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 3 temperature fault Multiple I/O module failures" EN_OVER_TEMP_SWITCH_4|0x0EA1C404|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 4 Temperature Fault Multiple I/O module failures" EN_OVER_TEMP_SWITCH_4|0x0EA1C404|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 4 temperature fault Multiple I/O module failures" EN_OVER_TEMP_SWITCH_5|0x0EA1C405|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 5 temperature fault Multiple I/O module failures" EN_OVER_TEMP_SWITCH_6|0x0EA1C406|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 6 temperature fault Multiple I/O module failures" EN_OVER_TEMP_SWITCH_7|0x0EA1C407|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 7 temperature fault Multiple I/O module failures" EN_OVER_TEMP_SWITCH_8|0x0EA1C408|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 8 temperature fault Multiple I/O module failures" EN_OVER_TEMP_SWITCH_9|0x0EA1C409|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 9 temperature fault Multiple I/O module failures" EN_OVER_TEMP_SWITCH_10|0x0EA1C40A|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 10 temperature fault Multiple I/O module failures" EN_OVER_TEMP_WARN_SWITCH_1|0x0EA1D401|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 1 Temperature Warning" EN_OVER_TEMP_WARN_SWITCH_1|0x0EA1D401|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 1 over recommended temperature" EN_OVER_TEMP_WARN_SWITCH_2|0x0EA1D402|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 2 Temperature Warning" EN_OVER_TEMP_WARN_SWITCH_2|0x0EA1D402|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 2 over recommended temperature" EN_OVER_TEMP_WARN_SWITCH_3|0x0EA1D403|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 3 Temperature Warning" EN_OVER_TEMP_WARN_SWITCH_3|0x0EA1D403|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 3 over recommended temperature" EN_OVER_TEMP_WARN_SWITCH_4|0x0EA1D404|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 4 Temperature Warning" EN_OVER_TEMP_WARN_SWITCH_4|0x0EA1D404|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 4 over recommended temperature" EN_OVER_TEMP_WARN_SWITCH_5|0x0EA1D405|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 5 over recommended temperature" EN_OVER_TEMP_WARN_SWITCH_6|0x0EA1D406|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 6 over recommended temperature" EN_OVER_TEMP_WARN_SWITCH_7|0x0EA1D407|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 7 over recommended temperature" EN_OVER_TEMP_WARN_SWITCH_8|0x0EA1D408|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 8 over recommended temperature" EN_OVER_TEMP_WARN_SWITCH_9|0x0EA1D409|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 9 over recommended temperature" EN_OVER_TEMP_WARN_SWITCH_10|0x0EA1D40A|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 10 over recommended temperature" EN_OVER_TEMP_WARN_SWITCH_1|0x0EA1D401|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 1 Temperature Warning Multiple I/O module failures" EN_OVER_TEMP_WARN_SWITCH_1|0x0EA1D401|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 1 over recommended temperature Multiple I/O module failures" EN_OVER_TEMP_WARN_SWITCH_2|0x0EA1D402|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 2 Temperature Warning Multiple I/O module failures" EN_OVER_TEMP_WARN_SWITCH_2|0x0EA1D402|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 2 over recommended temperature Multiple I/O module failures" EN_OVER_TEMP_WARN_SWITCH_3|0x0EA1D403|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 3 Temperature Warning Multiple I/O module failures" EN_OVER_TEMP_WARN_SWITCH_3|0x0EA1D403|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 3 over recommended temperature Multiple I/O module failures" EN_OVER_TEMP_WARN_SWITCH_4|0x0EA1D404|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 4 Temperature Warning Multiple I/O module failures" EN_OVER_TEMP_WARN_SWITCH_4|0x0EA1D404|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 4 over recommended temperature Multiple I/O module failures" EN_OVER_TEMP_WARN_SWITCH_5|0x0EA1D405|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 5 over recommended temperature Multiple I/O module failures" EN_OVER_TEMP_WARN_SWITCH_6|0x0EA1D406|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 6 over recommended temperature Multiple I/O module failures" EN_OVER_TEMP_WARN_SWITCH_7|0x0EA1D407|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 7 over recommended temperature Multiple I/O module failures" EN_OVER_TEMP_WARN_SWITCH_8|0x0EA1D408|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 8 over recommended temperature Multiple I/O module failures" EN_OVER_TEMP_WARN_SWITCH_9|0x0EA1D409|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 9 over recommended temperature Multiple I/O module failures" EN_OVER_TEMP_WARN_SWITCH_10|0x0EA1D40A|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 10 over recommended temperature Multiple I/O module failures" # I/O Module Management Bus Operational Status Sensor - event only EN_STCONN_FAIL_SWITCH_1|0x0EA22001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status switch 1 communication failed" EN_STCONN_FAIL_SWITCH_2|0x0EA22002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status switch 2 communication failed" EN_STCONN_FAIL_SWITCH_3|0x0EA22003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status switch 3 communication failed" EN_STCONN_FAIL_SWITCH_4|0x0EA22004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status switch 4 communication failed" EN_STCONN_FAIL_SWITCH_5|0x0EA22005|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status switch 5 communication failed" EN_STCONN_FAIL_SWITCH_6|0x0EA22006|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status switch 6 communication failed" EN_STCONN_FAIL_SWITCH_7|0x0EA22007|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status switch 7 communication failed" EN_STCONN_FAIL_SWITCH_8|0x0EA22008|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status switch 8 communication failed" EN_STCONN_FAIL_SWITCH_9|0x0EA22009|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status switch 9 communication failed" EN_STCONN_FAIL_SWITCH_10|0x0EA2200A|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status switch 10 communication failed" ######################## # Blower Module Resource ######################## # There are not separate hot-swap installed/removed events for fans. # These events represent fan removal; the recovery of these events represent an install. EN_FAULT_FAN1|0x0A026001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blower 1 Fault Multiple blower failures" EN_FAULT_FAN1|0x0A026001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blower 1 Fault Single blower failure" EN_FAULT_FAN1|0x0A026001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blower 1 Fault" EN_FAULT_FAN2|0x0A026002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blower 2 Fault Multiple blower failures" EN_FAULT_FAN2|0x0A026002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blower 2 Fault Single blower failure" EN_FAULT_FAN2|0x0A026002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blower 2 Fault" EN_FAULT_FAN3|0x0A026003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blower 3 Fault Multiple blower failures" EN_FAULT_FAN3|0x0A026003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blower 3 Fault Single blower failure" EN_FAULT_FAN3|0x0A026003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blower 3 Fault" EN_FAULT_FAN4|0x0A026004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blower 4 Fault Multiple blower failures" EN_FAULT_FAN4|0x0A026004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blower 4 Fault Single blower failure" EN_FAULT_FAN4|0x0A026004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blower 4 Fault" # For newer AMM code levels there are installed/removed events EN_FAULT_FAN1|0x0A026001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blower 1 removed Multiple blower failures" EN_FAULT_FAN1|0x0A026001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blower 1 removed Single blower failure" EN_FAULT_FAN1|0x0A026001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blower 1 removed" EN_FAULT_FAN2|0x0A026002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blower 2 removed Multiple blower failures" EN_FAULT_FAN2|0x0A026002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blower 2 removed Single blower failure" EN_FAULT_FAN2|0x0A026002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blower 2 removed" EN_FAULT_FAN3|0x0A026003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blower 3 removed Multiple blower failures" EN_FAULT_FAN3|0x0A026003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blower 3 removed Single blower failure" EN_FAULT_FAN3|0x0A026003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blower 3 removed" EN_FAULT_FAN4|0x0A026004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blower 4 removed Multiple blower failures" EN_FAULT_FAN4|0x0A026004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blower 4 removed Single blower failure" EN_FAULT_FAN4|0x0A026004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blower 4 removed" EN_FAN_1_INSTALLED|0x0A002001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blower 1 installed" EN_FAN_2_INSTALLED|0x0A002002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blower 2 installed" EN_FAN_3_INSTALLED|0x0A002003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blower 3 installed" EN_FAN_4_INSTALLED|0x0A002004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blower 4 installed" ####################### # Blower Module Sensors ####################### # Blower Operational Status Sensor EN_FAN1_SPEED|0x00026801|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 1 Failure Multiple blower failures" EN_FAN1_SPEED|0x00026801|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 1 Failure Single blower failure" EN_FAN1_SPEED|0x00026801|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 1 Failure" EN_FAN1_SPEED|0x00026801|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 1 failure Multiple blower failures" EN_FAN1_SPEED|0x00026801|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 1 failure Single blower failure" EN_FAN1_SPEED|0x00026801|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 1 failure" EN_FAN2_SPEED|0x00026802|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 2 Failure Multiple blower failures" EN_FAN2_SPEED|0x00026802|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 2 Failure Single blower failure" EN_FAN2_SPEED|0x00026802|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 2 Failure" EN_FAN2_SPEED|0x00026802|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 2 failure Multiple blower failures" EN_FAN2_SPEED|0x00026802|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 2 failure Single blower failure" EN_FAN2_SPEED|0x00026802|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 2 failure" EN_FAN3_SPEED|0x00026803|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 3 Failure Multiple blower failures" EN_FAN3_SPEED|0x00026803|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 3 Failure Single blower failure" EN_FAN3_SPEED|0x00026803|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 3 Failure" EN_FAN3_SPEED|0x00026803|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 3 failure Multiple blower failures" EN_FAN3_SPEED|0x00026803|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 3 failure Single blower failure" EN_FAN3_SPEED|0x00026803|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 3 failure" EN_FAN4_SPEED|0x00026804|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 4 Failure Multiple blower failures" EN_FAN4_SPEED|0x00026804|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 4 Failure Single blower failure" EN_FAN4_SPEED|0x00026804|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 4 Failure" EN_FAN4_SPEED|0x00026804|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 4 failure Multiple blower failures" EN_FAN4_SPEED|0x00026804|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 4 failure Single blower failure" EN_FAN4_SPEED|0x00026804|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 4 failure" EN_UNREC_FAN1|0x0B026001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Unrecognized Blower 1" EN_UNREC_FAN2|0x0B026002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Unrecognized Blower 2" EN_UNREC_FAN3|0x0B026003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Unrecognized Blower 3" EN_UNREC_FAN4|0x0B026004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Unrecognized Blower 4" EN_UNREC_FAN5|0x0B026005|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Unrecognized Blower 5" EN_UNREC_FAN6|0x0B026006|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Unrecognized Blower 6" EN_UNREC_FAN7|0x0B026007|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Unrecognized Blower 7" EN_UNREC_FAN8|0x0B026008|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Unrecognized Blower 8" EN_UNREC_FAN9|0x0B026009|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Unrecognized Blower 9" # Blower Management Bus Operational Status Sensor - event only EN_STCONN_FAIL_BLOWER_1|0x000A2001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status blower module 1 communication failed" EN_STCONN_FAIL_BLOWER_2|0x000A2002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status blower module 2 communication failed" EN_STCONN_FAIL_BLOWER_3|0x000A2003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status blower module 3 communication failed" EN_STCONN_FAIL_BLOWER_4|0x000A2004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status blower module 4 communication failed" # Blower Speed Percentage (Percent of Max) Sensor EN_FAN1_PFA|0x000A6001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 1 Outside Recommended Speed" EN_FAN1_PFA|0x000A6001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 1 outside of recommended speed" EN_FAN2_PFA|0x000A6002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 2 Outside Recommended Speed" EN_FAN2_PFA|0x000A6002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 2 outside of recommended speed" EN_FAN3_PFA|0x000A6003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 3 Outside Recommended Speed" EN_FAN3_PFA|0x000A6003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 3 outside of recommended speed" EN_FAN4_PFA|0x000A6004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 4 Outside Recommended Speed" EN_FAN4_PFA|0x000A6004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 4 outside of recommended speed" # Blower RPM Speed Sensor # None ####################### # Power Module Resource ####################### EN_PS1_INSTALLED|0x08216001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Power Supply 1 was installed" EN_PS1_INSTALLED|0x08216001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Power Module 1 installed" EN_PS2_INSTALLED|0x08216002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Power Supply 2 was installed" EN_PS2_INSTALLED|0x08216002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Power Module 2 installed" EN_PS3_INSTALLED|0x08216003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Power Supply 3 was installed" EN_PS3_INSTALLED|0x08216003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Power Module 3 installed" EN_PS4_INSTALLED|0x08216004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Power Supply 4 was installed" EN_PS4_INSTALLED|0x08216004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Power Module 4 installed" EN_FAULT_PS1_REMOVED|0x0821E001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Power Supply 1 Removed" EN_FAULT_PS1_REMOVED|0x0821E001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Power Module 1 removed" EN_FAULT_PS1_REMOVED|0x0821E001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Power Module 1 Removed" EN_FAULT_PS2_REMOVED|0x0821E002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Power Supply 2 Removed" EN_FAULT_PS2_REMOVED|0x0821E002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Power Module 2 removed" EN_FAULT_PS2_REMOVED|0x0821E002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Power Module 2 Removed" EN_FAULT_PS3_REMOVED|0x0821E003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Power Supply 3 Removed" EN_FAULT_PS3_REMOVED|0x0821E003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Power Module 3 removed" EN_FAULT_PS3_REMOVED|0x0821E003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Power Module 3 Removed" EN_FAULT_PS4_REMOVED|0x0821E004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Power Supply 4 Removed" EN_FAULT_PS4_REMOVED|0x0821E004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Power Module 4 removed" EN_FAULT_PS4_REMOVED|0x0821E004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Power Module 4 Removed" ###################### # Power Module Sensors ###################### # Power Module Operational Status Sensor #### Mapped to Off-line Operational State EN_FAULT_PS1|0x08200001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Supply 1 Fault" EN_FAULT_PS1|0x08200001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Module 1 communication failure" EN_FAULT_PS2|0x08200002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Supply 2 Fault" EN_FAULT_PS2|0x08200002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Module 2 communication failure" EN_FAULT_PS3|0x08200003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Supply 3 Fault" EN_FAULT_PS3|0x08200003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Module 3 communication failure" EN_FAULT_PS4|0x08200004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Supply 4 Fault" EN_FAULT_PS4|0x08200004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Module 4 communication failure" EN_FAULT_PS1_12V_OVR_CUR|0x08236001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Supply 1 12V Over Current Fault" EN_FAULT_PS1_12V_OVR_CUR|0x08236001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Module 1 over current fault" EN_FAULT_PS2_12V_OVR_CUR|0x08236002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Supply 2 12V Over Current Fault" EN_FAULT_PS2_12V_OVR_CUR|0x08236002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Module 2 over current fault" EN_FAULT_PS3_12V_OVR_CUR|0x08236003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Supply 3 12V Over Current Fault" EN_FAULT_PS3_12V_OVR_CUR|0x08236003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Module 3 over current fault" EN_FAULT_PS4_12V_OVR_CUR|0x08236004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Supply 4 12V Over Current Fault" EN_FAULT_PS4_12V_OVR_CUR|0x08236004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Module 4 over current fault" EN_FAULT_PS1_DC_GOOD|0x08028001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Supply 1 DC Good Fault" EN_FAULT_PS1_DC_GOOD|0x08028001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Module 1 is off, DC fault" EN_FAULT_PS2_DC_GOOD|0x08028002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Supply 2 DC Good Fault" EN_FAULT_PS2_DC_GOOD|0x08028002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Module 2 is off, DC fault" EN_FAULT_PS3_DC_GOOD|0x08028003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Supply 3 DC Good Fault" EN_FAULT_PS3_DC_GOOD|0x08028003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Module 3 is off, DC fault" EN_FAULT_PS4_DC_GOOD|0x08028004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Supply 4 DC Good Fault" EN_FAULT_PS4_DC_GOOD|0x08028004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Module 4 is off, DC fault" EN_FAULT_PS1_12V_OVER|0x08236481|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Supply 1 12V Over Voltage Fault" EN_FAULT_PS1_12V_OVER|0x08236481|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Module 1 over voltage fault" EN_FAULT_PS2_12V_OVER|0x08236482|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Supply 2 12V Over Voltage Fault" EN_FAULT_PS2_12V_OVER|0x08236482|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Module 2 over voltage fault" EN_FAULT_PS3_12V_OVER|0x08236483|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Supply 3 12V Over Voltage Fault" EN_FAULT_PS3_12V_OVER|0x08236483|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Module 3 over voltage fault" EN_FAULT_PS4_12V_OVER|0x08236484|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Supply 4 12V Over Voltage Fault" EN_FAULT_PS4_12V_OVER|0x08236484|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Module 4 over voltage fault" EN_FAULT_PS1_12V_UNDER|0x08236801|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Supply 1 12V Under Voltage Fault" EN_FAULT_PS1_12V_UNDER|0x08236801|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Module 1 under voltage fault" EN_FAULT_PS2_12V_UNDER|0x08236802|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Supply 2 12V Under Voltage Fault" EN_FAULT_PS2_12V_UNDER|0x08236802|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Module 2 under voltage fault" EN_FAULT_PS3_12V_UNDER|0x08236803|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Supply 3 12V Under Voltage Fault" EN_FAULT_PS3_12V_UNDER|0x08236803|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Module 3 under voltage fault" EN_FAULT_PS4_12V_UNDER|0x08236804|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Supply 4 12V Under Voltage Fault" EN_FAULT_PS4_12V_UNDER|0x08236804|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Module 4 under voltage fault" EN_FAULT_PS1_EPOW|0x08180001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Input Voltage Removed from Power Supply 1" EN_FAULT_PS2_EPOW|0x08180002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Input Voltage Removed from Power Supply 2" EN_FAULT_PS3_EPOW|0x08180003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Input Voltage Removed from Power Supply 3" EN_FAULT_PS4_EPOW|0x08180004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Input Voltage Removed from Power Supply 4" #### Mapped to Degraded Operational State EN_FAULT_PS1_CUR_FAIL|0x0821A001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Power Supply 1 Current Fault" EN_FAULT_PS1_CUR_FAIL|0x0821A001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Power Module 1 current share mis-match" EN_FAULT_PS2_CUR_FAIL|0x0821A002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Power Supply 2 Current Fault" EN_FAULT_PS2_CUR_FAIL|0x0821A002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Power Module 2 current share mis-match" EN_FAULT_PS3_CUR_FAIL|0x0821A003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Power Supply 3 Current Fault" EN_FAULT_PS3_CUR_FAIL|0x0821A003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Power Module 3 current share mis-match" EN_FAULT_PS4_CUR_FAIL|0x0821A004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Power Supply 4 Current Fault" EN_FAULT_PS4_CUR_FAIL|0x0821A004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Power Module 4 current share mis-match" # Power Module Management Bus Operational Status Sensor - event only EN_STCONN_FAIL_POWER_1|0x08222001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status power module 1 communication failed" EN_STCONN_FAIL_POWER_2|0x08222002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status power module 2 communication failed" EN_STCONN_FAIL_POWER_3|0x08222003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status power module 3 communication failed" EN_STCONN_FAIL_POWER_4|0x08222004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status power module 4 communication failed" # Power Module Temperature Sensor - event-only EN_FAULT_PS1_OVR_TEMP|0x0821C081|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Supply 1 Temperature Fault" EN_FAULT_PS1_OVR_TEMP|0x0821C081|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Module 1 temperature fault" EN_FAULT_PS2_OVR_TEMP|0x0821C082|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Supply 2 Temperature Fault" EN_FAULT_PS2_OVR_TEMP|0x0821C082|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Module 2 temperature fault" EN_FAULT_PS3_OVR_TEMP|0x0821C083|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Supply 3 Temperature Fault" EN_FAULT_PS3_OVR_TEMP|0x0821C083|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Module 3 temperature fault" EN_FAULT_PS4_OVR_TEMP|0x0821C084|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Supply 4 Temperature Fault" EN_FAULT_PS4_OVR_TEMP|0x0821C084|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Module 4 temperature fault" EN_FAULT_PS1_TEMP_WARN|0x0821C001|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Power Supply 1 Temperature Warning" EN_FAULT_PS1_TEMP_WARN|0x0821C001|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Power Module 1 has exceeded the warning temperature" EN_FAULT_PS2_TEMP_WARN|0x0821C002|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Power Supply 2 Temperature Warning" EN_FAULT_PS2_TEMP_WARN|0x0821C002|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Power Module 2 has exceeded the warning temperature" EN_FAULT_PS3_TEMP_WARN|0x0821C003|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Power Supply 3 Temperature Warning" EN_FAULT_PS3_TEMP_WARN|0x0821C003|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Power Module 3 has exceeded the warning temperature" EN_FAULT_PS4_TEMP_WARN|0x0821C004|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Power Supply 4 Temperature Warning" EN_FAULT_PS4_TEMP_WARN|0x0821C004|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Power Module 4 has exceeded the warning temperature" # Power Module Fan Pack Operational Sensor EN_FAN_PACK1_SPEED|0x00036801|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan Pack 1 failure" EN_FAN_PACK2_SPEED|0x00036002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan Pack 2 failure" EN_FAN_PACK3_SPEED|0x00036003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan Pack 3 failure" EN_FAN_PACK4_SPEED|0x00036004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan Pack 4 failure" EN_FAN_PACK1_NOT_PRESENT|0x000A7001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan Pack 1 not present" EN_FAN_PACK2_NOT_PRESENT|0x000A7002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan Pack 2 not present" EN_FAN_PACK3_NOT_PRESENT|0x000A7003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan Pack 3 not present" EN_FAN_PACK4_NOT_PRESENT|0x000A7004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan Pack 4 not present" # Power Module Fan Pack Average Speed (Percent of Max) Sensor EN_FAN_PACK1_PFA|0x000B6001|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Fan pack 1 outside recommended speed" EN_FAN_PACK2_PFA|0x000B6002|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Fan pack 2 outside recommended speed" EN_FAN_PACK3_PFA|0x000B6003|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Fan pack 3 outside recommended speed" EN_FAN_PACK4_PFA|0x000B6004|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Fan pack 4 outside recommended speed" # Power Module Fan Pack Average RPM Speed Sensor # None ############################# # Alarm Panel Module Resource ############################# EN_AP_INSTALLED|0x6F60A001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Alarm Panel module installed" EN_AP_REMOVED|0x6F60A002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Alarm Panel module removed" ############################ # Alarm Panel Module Sensors ############################ # Alarm Panel Module Operational Status Sensor EN_AP_HW_FAILURE|0x6F60A101|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Alarm Panel hardware failure" ##################### # Mux Module Resource ##################### EN_MX_1_INSTALLED|0x6F608001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Multiplexer Expansion Module 1 installed" EN_MX_2_INSTALLED|0x6F608002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Multiplexer Expansion Module 2 installed" EN_MX_1_REMOVED|0x6F609001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Multiplexer Expansion Module 1 removed" EN_MX_2_REMOVED|0x6F609002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Multiplexer Expansion Module 2 removed" #################### # Mux Module Sensors #################### # Mux Module Operational Status Sensor EN_MX_1_HW_FAILURE|0x6F60D001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity to the active Multiplexer Expansion module 1 failed" EN_MX_2_HW_FAILURE|0x6F60D002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity to the active Multiplexer Expansion module 2 failed" ############################### # Network Clock Module Resource ############################### EN_NC_1_INSTALLED|0x6F606001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Network Clock module 1 installed" EN_NC_2_INSTALLED|0x6F606002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Network Clock module 2 installed" EN_NC_1_REMOVED|0x6F607001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Network Clock module 1 removed" EN_NC_2_REMOVED|0x6F607002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Network Clock module 2 removed" ############################## # Network Clock Module Sensors ############################## # Network Clock Module Operational Status Sensor EN_NC_1_HW_FAILURE|0x6F607101|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Network Clock module 1 hardware failure" EN_NC_2_HW_FAILURE|0x6F607102|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Network Clock module 2 hardware failure" ###################### # Front Bezel Resource ###################### EN_FB_INSTALLED|0x6F60B001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Front Bezel installed" EN_FB_REMOVED|0x6F60B101|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Front Bezel removed" ##################### # Front Bezel Sensors ##################### # FIXME:: ADD filter sensor events here for BCHT only ######################## # MM Interposer Resource ######################## EN_MM_INP_1_INSTALLED|0x6F600001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Management Module Interposer 1 installed" EN_MM_INP_2_INSTALLED|0x6F600002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Management Module Interposer 2 installed" EN_MM_INP_1_REMOVED|0x6F601001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Management Module Interposer 1 removed" EN_MM_INP_2_REMOVED|0x6F601002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Management Module Interposer 2 removed" ####################### # MM Interposer Sensors ####################### # None ######################### # I/O Interposer Resource ######################### EN_IO_INP_1_INSTALLED|0x6F602001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module Interposer 1 installed" EN_IO_INP_2_INSTALLED|0x6F602002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module Interposer 2 installed" EN_IO_INP_3_INSTALLED|0x6F602003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module Interposer 3 installed" EN_IO_INP_4_INSTALLED|0x6F602004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module Interposer 4 installed" EN_IO_INP_5_INSTALLED|0x6F602005|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module Interposer 5 installed" EN_IO_INP_6_INSTALLED|0x6F602006|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module Interposer 6 installed" EN_IO_INP_7_INSTALLED|0x6F602007|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module Interposer 7 installed" EN_IO_INP_8_INSTALLED|0x6F602008|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module Interposer 8 installed" EN_IO_INP_9_INSTALLED|0x6F602009|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module Interposer 9 installed" EN_IO_INP_10_INSTALLED|0x6F60200A|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module Interposer 10 installed" EN_IO_INP_1_REMOVED|0x6F603001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module Interposer 1 removed" EN_IO_INP_2_REMOVED|0x6F603002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module Interposer 2 removed" EN_IO_INP_3_REMOVED|0x6F603003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module Interposer 3 removed" EN_IO_INP_4_REMOVED|0x6F603004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module Interposer 4 removed" EN_IO_INP_5_REMOVED|0x6F603005|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module Interposer 5 removed" EN_IO_INP_6_REMOVED|0x6F603006|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module Interposer 6 removed" EN_IO_INP_7_REMOVED|0x6F603007|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module Interposer 7 removed" EN_IO_INP_8_REMOVED|0x6F603008|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module Interposer 8 removed" EN_IO_INP_9_REMOVED|0x6F603009|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module Interposer 9 removed" EN_IO_INP_10_REMOVED|0x6F60300A|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module Interposer 10 removed" ######################## # I/O Interposer Sensors ######################## # None ########################################### # Remote System Adapter (RSA) Unique Events ########################################### ###################### # RSA Chassis Resource ###################### # None ##################### # RSA Chassis Sensors ##################### # RSA planar temperature sensor #EN_CUTOFF_HI_OVER_TEMP_PLANAR|0x0601C480|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to board over temperature" EN_OVER_TEMP_PLANAR|0x0601C080|SAHPI_CRITICAL|OVR_SEV|"PLANAR Over Temperature" #EN_PFA_HI_OVER_TEMP_PLANAR|0x0601D500|SAHPI_MAJOR|OVR_SEV|"System board is over recommended temperature" # RSA CPU area thermal sensor EN_CUTOFF_HI_OVER_TEMP_PROC|0x0401C480|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to Processor area over temperature" EN_PFA_HI_OVER_TEMP_PROC|0x0401D400|SAHPI_MAJOR|OVR_SEV|"System over recommended temperature for Processor area" # RSA I/O thermal sensor # None # RSA system ambient thermal sensor EN_TEMP|0x00000064|SAHPI_CRITICAL|OVR_SEV|"System cutoff temperature exceed" EN_OVER_TEMP|0x0001C000|SAHPI_CRITICAL|OVR_SEV|"Over Temperature" EN_OVER_TEMP_AMBIENT|0x0001C080|SAHPI_CRITICAL|OVR_SEV|"System ambient temperature is too high" #EN_CUTOFF_HI_OVER_TEMP_AMBIENT|0x0001C480|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to high ambient temperature" #EN_PFA_HI_OVER_TEMP_AMBIENT|0x0001D500|SAHPI_MAJOR|OVR_SEV|"System over recommended ambient temperature" EN_NC_TEMP|0x0000006E|SAHPI_MAJOR|OVR_SEV|"System over recommended temperature" # RSA memory thermal sensor EN_CUTOFF_HI_OVER_TEMP_MEM_AREA|0x0501C480|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to Memory area over temperature" EN_CUTOFF_HI_OVER_TEMP_MEMORY1|0x0501C481|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to memory planar 1 over hard shutoff temperature" EN_CUTOFF_HI_OVER_TEMP_MEMORY2|0x0501C482|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to memory planar 2 over hard shutoff temperature" EN_PFA_HI_OVER_TEMP_MEM_AREA|0x0501D400|SAHPI_MAJOR|OVR_SEV|"System over recommended temperature for Memory area" EN_PFA_HI_OVER_TEMP_MEMORY1|0x0501D501|SAHPI_CRITICAL|OVR_SEV|"System over recommended temperature for memory planar 1" EN_PFA_HI_OVER_TEMP_MEMORY2|0x0501D502|SAHPI_CRITICAL|OVR_SEV|"System over recommended temperature for memory planar 2" # RSA planar 5V sensor #EN_CUTOFF_HI_FAULT_PLANAR_5V|0x06034480|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to +5v over voltage" #EN_CUTOFF_LO_FAULT_PLANAR_5V|0x06034800|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to +5v under voltage" EN_CUTOFF_HI_FAULT_5V|0x08034480|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to 5V Fault Over max value" EN_CUTOFF_LO_FAULT_5V|0x08034800|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to 5V Fault under min value" #EN_PFA_HI_FAULT_PLANAR_5V|0x06035500|SAHPI_MAJOR|OVR_SEV|"System over recommended voltage for +5v" #EN_PFA_LO_FAULT_PLANAR_5V|0x06035800|SAHPI_MAJOR|OVR_SEV|"System under recommended voltage for +5v" # RSA planar 3.3V sensor #EN_CUTOFF_HI_FAULT_3_35V|0x08032480|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to +3.3v over voltage" #EN_CUTOFF_LO_FAULT_3_35V|0x08032880|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to +3.3v under voltage" EN_CUTOFF_HI_FAULT_3_35V_CONT|0x0002C480|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to Continuous 3.3V over max allowed" EN_CUTOFF_LO_FAULT_3_35V_CONT|0x0002C880|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to Continuous 3.3V under minimum value" #EN_PFA_HI_FAULT_3_35V|0x08033480|SAHPI_MAJOR|OVR_SEV|"System over recommended voltage on +3.3v" #EN_PFA_LO_FAULT_3_35V|0x08033880|SAHPI_MAJOR|OVR_SEV|"System under recommended voltage on +3.3v" EN_PFA_HI_FAULT_3_35V_CONT|0x0002D400|SAHPI_MAJOR|OVR_SEV|"Continuous 3.3V over recommended value" EN_PFA_LO_FAULT_3_35V_CONT|0x0002D800|SAHPI_MAJOR|OVR_SEV|"Continuous 3.3V under recommended value" # RSA planar 12V sensor #EN_CUTOFF_HI_FAULT_12V_PLANAR|0x06036480|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to +12v over voltage" #EN_CUTOFF_LO_FAULT_12V_PLANAR|0x06036800|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to +12v under voltage" #EN_PFA_HI_FAULT_12V_PLANAR|0x06037500|SAHPI_MAJOR|OVR_SEV|"System over recommended voltage for +12v" #EN_PFA_LO_FAULT_12V_PLANAR|0x06037800|SAHPI_MAJOR|OVR_SEV|"System under recommended voltage for +12v" # RSA planar -12V sensor EN_CUTOFF_HI_FAULT_N12V|0x0803E480|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to -12v over voltage" EN_CUTOFF_LO_FAULT_N12V|0x0803E800|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to -12v under voltage" EN_PFA_HI_FAULT_N12V|0x0803F500|SAHPI_MAJOR|OVR_SEV|"System over recommended voltage for -12v" EN_PFA_LO_FAULT_N12V|0x0803F800|SAHPI_MAJOR|OVR_SEV|"System under recommended voltage for -12v" # RSA planar -5V sensor #EN_CUTOFF_HI_FAULT_N5V|0x0803C480|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to -5v over voltage" #EN_CUTOFF_LO_FAULT_N5V|0x0803C800|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to -5v under voltage" #EN_PFA_HI_FAULT_N5V|0x0803D500|SAHPI_MAJOR|OVR_SEV|"System over recommended voltage for -5v" #EN_PFA_LO_FAULT_N5V|0x803D800|SAHPI_MAJOR|OVR_SEV|"System under recommended voltage for -5v" # RSA planar 2.5V sensor #EN_CUTOFF_HI_FAULT_2_5V|0x08030480|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to +2.5v over voltage" #EN_CUTOFF_LO_FAULT_2_5V|0x08030880|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to +2.5v under voltage" #EN_PFA_HI_FAULT_2_5V|0x08031480|SAHPI_MAJOR|OVR_SEV|"System over recommended voltage on +2.5v" #EN_PFA_LO_FAULT_2_5V|0x08031880|SAHPI_MAJOR|OVR_SEV|"System under recommended voltage on +2.5v" # RSA planar 1.5V sensor EN_CUTOFF_HI_FAULT_1_5V|0x08040480|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to +1.5v over voltage" EN_CUTOFF_LO_FAULT_1_5V|0x08040880|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to +1.5v under voltage" #EN_PFA_HI_FAULT_1_5V|0x08041400|SAHPI_MAJOR|OVR_SEV|"System over recommended voltage on +1.5v" #EN_PFA_LO_FAULT_1_5V|0x08041800|SAHPI_MAJOR|OVR_SEV|"System under recommended voltage on +1.5v" # RSA planar 1.25V sensor EN_CUTOFF_HI_FAULT_1_25V|0x08000480|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to +1.25v over voltage" EN_CUTOFF_LO_FAULT_1_25V|0x08000880|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to +1.25v under voltage" #EN_PFA_HI_FAULT_1_2V|0x08001401|SAHPI_MAJOR|OVR_SEV|"System over recommended voltage on +1.2v" #EN_PFA_LO_FAULT_1_2V|0x08001801|SAHPI_MAJOR|OVR_SEV|"System under recommended voltage on +1.2v" ################## # RSA CPU Resource ################## # None ################# # RSA CPU sensors ################# # RSA CPU thermal sensor #EN_PROC_HOT_CPU1|0x0421C401|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"CPU 1 shut off due to over temperature" #EN_CUTOFF_HI_OVER_TEMP_CPU1|0x0421C481|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"System shutoff due to CPU 1 over temperature" #EN_THERM_TRIP_CPU1|0x0421D081|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"CPU 1 Over Temperature" #EN_PFA_HI_OVER_TEMP_CPU1|0x0421D501|SAHPI_MAJOR|OVR_SEV,OVR_RID|"System over temperature for CPU 1" #EN_PROC_HOT_CPU2|0x0421C402|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"CPU 2 shut off due to over temperature" #EN_CUTOFF_HI_OVER_TEMP_CPU2|0x0421C482|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"System shutoff due to CPU 2 over temperature" #EN_THERM_TRIP_CPU2|0x0421D082|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"CPU 2 Over Temperature" #EN_PFA_HI_OVER_TEMP_CPU2|0x0421D502|SAHPI_MAJOR|OVR_SEV,OVR_RID|"System over temperature for CPU 2" #EN_PROC_HOT_CPU3|0x0421C403|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"CPU 3 shut off due to over temperature" #EN_CUTOFF_HI_OVER_TEMP_CPU3|0x0421C483|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"System shutoff due to CPU 3 over temperature" #EN_THERM_TRIP_CPU3|0x0421D083|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"CPU 3 Over Temperature" #EN_PFA_HI_OVER_TEMP_CPU3|0x0421D503|SAHPI_MAJOR|OVR_SEV,OVR_RID|"System over temperature for CPU 3" #EN_PROC_HOT_CPU4|0x0421C404|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"CPU 4 shut off due to over temperature" #EN_CUTOFF_HI_OVER_TEMP_CPU4|0x0421C484|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"System shutoff due to CPU 4 over temperature" #EN_THERM_TRIP_CPU4|0x0421D084|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"CPU 4 Over Temperature" #EN_PFA_HI_OVER_TEMP_CPU4|0x0421D504|SAHPI_MAJOR|OVR_SEV,OVR_RID|"System over temperature for CPU 4" EN_PROC_HOT_CPU5|0x0421C405|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"CPU 5 shut off due to over temperature" EN_CUTOFF_HI_OVER_TEMP_CPU5|0x0421C485|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"System shutoff due to CPU 5 over temperature" EN_THERM_TRIP_CPU5|0x0421D085|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"CPU 5 Over Temperature" EN_PFA_HI_OVER_TEMP_CPU5|0x0421D505|SAHPI_MAJOR|OVR_SEV,OVR_RID|"System over temperature for CPU 5" EN_PROC_HOT_CPU6|0x0421C406|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"CPU 6 shut off due to over temperature" EN_CUTOFF_HI_OVER_TEMP_CPU6|0x0421C486|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"System shutoff due to CPU 6 over temperature" EN_THERM_TRIP_CPU6|0x0421D086|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"CPU 6 Over Temperature" EN_PFA_HI_OVER_TEMP_CPU6|0x0421D506|SAHPI_MAJOR|OVR_SEV,OVR_RID|"System over temperature for CPU 6" EN_PROC_HOT_CPU7|0x0421C407|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"CPU 7 shut off due to over temperature" EN_CUTOFF_HI_OVER_TEMP_CPU7|0x0421C487|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"System shutoff due to CPU 7 over temperature" EN_THERM_TRIP_CPU7|0x0421D087|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"CPU 7 Over Temperature" EN_PFA_HI_OVER_TEMP_CPU7|0x0421D507|SAHPI_MAJOR|OVR_SEV,OVR_RID|"System over temperature for CPU 7" EN_PROC_HOT_CPU8|0x0421C408|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"CPU 8 shut off due to over temperature" EN_CUTOFF_HI_OVER_TEMP_CPU8|0x0421C488|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"System shutoff due to CPU 8 over temperature" EN_THERM_TRIP_CPU8|0x0421D088|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"CPU 8 Over Temperature" EN_PFA_HI_OVER_TEMP_CPU8|0x0421D508|SAHPI_MAJOR|OVR_SEV,OVR_RID|"System over temperature for CPU 8" ################### # RSA DASD Resource ################### # None ################## # RSA DASD Sensors ################## # Changed # EN_PFA_HI_OVER_TEMP_DASD1 from 0x0681D481 to 0x0681C401 # EN_CUTOFF_HI_OVER_TEMP_DASD1_2 from 0x0681C882 to 0x0681C482 # to allow for oh_derive_string() expansion # RSA DASD thermal sensor #EN_OVER_TEMP_DASD1|0x0681C081|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"DASD 1 Over Temperature" EN_CUTOFF_HI_OVER_TEMP_DASD1|0x0681C481|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"System shutoff due to DASD 1 temperature" EN_PFA_HI_OVER_TEMP_DASD1|0x0681C401|SAHPI_MAJOR|OVR_SEV,OVR_RID|"DASD 1 over recommended temperature" EN_CUTOFF_HI_OVER_TEMP_DASD1_2|0x0681C482|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"System shutoff due to DASD 2 temperature" EN_PFA_HI_OVER_TEMP_DASD1_2|0x0681C402|SAHPI_MAJOR|OVR_SEV,OVR_RID|"DASD 2 over recommended temperature" EN_CUTOFF_HI_OVER_TEMP_DASD1_3|0x0681C483|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"System shutoff due to DASD 3 temperature" EN_PFA_HI_OVER_TEMP_DASD1_3|0x0681C403|SAHPI_MAJOR|OVR_SEV,OVR_RID|"DASD 3 over recommended temperature" EN_CUTOFF_HI_OVER_TEMP_DASD1_4|0x0681C484|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"System shutoff due to DASD 4 temperature" EN_PFA_HI_OVER_TEMP_DASD1_4|0x0681C404|SAHPI_MAJOR|OVR_SEV,OVR_RID|"DASD 4 over recommended temperature" ################## # RSA Fan Resource ################## # None ################# # RSA Fan Sensors ################# # RSA Fan speed sensor #EN_FAN1_PFA|0x000A6001|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blower 1 Outside Recommended Speed" #EN_FAN2_PFA|0x000A6002|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blower 2 Outside Recommended Speed" #EN_FAN3_PFA|0x000A6003|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blower 3 Outside Recommended Speed" #EN_FAN4_PFA|0x000A6004|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blower 4 Outside Recommended Speed" EN_FAN5_PFA|0x000A6005|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blower 5 Outside Recommended Speed" EN_FAN6_PFA|0x000A6006|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blower 6 Outside Recommended Speed" EN_FAN7_PFA|0x000A6007|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blower 7 Outside Recommended Speed" EN_FAN8_PFA|0x000A6008|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blower 8 Outside Recommended Speed" # Mapped to operational sensor #EN_FAN1_SPEED|0x00026801|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 1 Failure Multiple blower failures" #EN_FAN1_SPEED|0x00026801|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 1 Failure Single blower failure" #EN_FAN2_SPEED|0x00026802|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 2 Failure Multiple blower failures" #EN_FAN2_SPEED|0x00026802|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 2 Failure Single blower failure" #EN_FAN3_SPEED|0x00026803|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 3 Failure Multiple blower failures" #EN_FAN3_SPEED|0x00026803|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 3 Failure Single blower failure" #EN_FAN4_SPEED|0x00026804|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 4 Failure Multiple blower failures" #EN_FAN4_SPEED|0x00026804|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 4 Failure Single blower failure" EN_FAN5_SPEED|0x00026805|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 5 Failure Multiple blower failures" EN_FAN5_SPEED|0x00026805|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 5 Failure Single blower failure" EN_FAN6_SPEED|0x00026806|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 6 Failure Multiple blower failures" EN_FAN6_SPEED|0x00026806|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 6 Failure Single blower failure" EN_FAN7_SPEED|0x00026807|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 7 Failure Multiple blower failures" EN_FAN7_SPEED|0x00026807|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 7 Failure Single blower failure" EN_FAN8_SPEED|0x00026808|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 8 Failure Multiple blower failures" EN_FAN8_SPEED|0x00026808|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 8 Failure Single blower failure" EN_FAULT_FAN1|0x0A026001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 1 Fault Single fan failure" EN_FAULT_FAN1|0x0A026001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 1 Fault Multiple fan failures" EN_FAULT_FAN2|0x0A026002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 2 Fault Single fan failure" EN_FAULT_FAN2|0x0A026002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 2 Fault Multiple fan failures" EN_FAULT_FAN3|0x0A026003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 3 Fault Multiple fan failures" EN_FAULT_FAN3|0x0A026003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 3 Fault Single fan failure" EN_FAULT_FAN4|0x0A026004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 4 Fault Single fan failure" EN_FAULT_FAN5|0x0A026004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 4 Fault Multiple fan failures" EN_FAULT_FAN5|0x0A026005|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 5 Fault Single fan failure" EN_FAULT_FAN5|0x0A026005|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 5 Fault Multiple fan failures" EN_FAULT_FAN6|0x0A026006|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 6 Fault Single fan failure" EN_FAULT_FAN6|0x0A026006|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 6 Fault Multiple fan failures" EN_FAULT_FAN7|0x0A026007|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 7 Fault Multiple fan failures" EN_FAULT_FAN7|0x0A026007|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 7 Fault Single fan failure" EN_FAULT_FAN8|0x0A026008|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 8 Fault Single fan failure" EN_FAULT_FAN8|0x0A026008|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 8 Fault Multiple fan failures" EN_FAN_1_NOT_PRESENT|0x06026001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 1 not detected Multiple fan failures" EN_FAN_1_NOT_PRESENT|0x06026001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 1 not detected Single fan failure" EN_FAN_2_NOT_PRESENT|0x06026002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 2 not detected Multiple fan failures" EN_FAN_2_NOT_PRESENT|0x06026002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 2 not detected Single fan failure" EN_FAN_3_NOT_PRESENT|0x06026003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 3 not detected Multiple fan failures" EN_FAN_3_NOT_PRESENT|0x06026003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 3 not detected Single fan failure" EN_FAN_4_NOT_PRESENT|0x06026004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 4 not detected Multiple fan failures" EN_FAN_4_NOT_PRESENT|0x06026004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 4 not detected Single fan failure" EN_FAN_5_NOT_PRESENT|0x06026005|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 5 not detected Multiple fan failures" EN_FAN_5_NOT_PRESENT|0x06026005|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 5 not detected Single fan failure" EN_FAN_6_NOT_PRESENT|0x06026006|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 6 not detected Multiple fan failures" EN_FAN_6_NOT_PRESENT|0x06026006|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 6 not detected Single fan failure" EN_FAN_7_NOT_PRESENT|0x06026007|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 7 not detected Multiple fan failures" EN_FAN_7_NOT_PRESENT|0x06026007|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 7 not detected Single fan failure" EN_FAN_8_NOT_PRESENT|0x06026008|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 8 not detected Multiple fan failures" EN_FAN_8_NOT_PRESENT|0x06026008|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 8 not detected Single fan failure" ############ # OEM Events ############ #EN_KEY_PRESS_ENTER | 0x09002002 | I | R | "" #EN_KEY_PRESS_NEXT | 0x09002001 | I | R | "" #EN_ACCT_MGMT_DISABLED | 0x00016018 | W | | "Account has been disabled manually or because of inactivity for more than the configured limit for user " #EN_ACCT_MGMT_SUPERUSER_NOT_DISABLED | 0x00016019 | W | | "Account has been inactive for more than the configured disable and alert limit for Supervisor " #EN_ACCT_MGMT_INACTIVE | 0x00016017 | W | | "Account has been inactive for more than the configured inactivity alert limit for user " #EN_ACCT_MGMT_ACTIVE | 0x00016016 | W | | "Account has changed to the active user " #EN_DISABLE_ACCOUNT | 0x0001602D | I | | "Account is disabled for user " #EN_ENABLE_ACCOUNT | 0x0001602E | I | | "Account is enabled for user " #EN_UNLOCK_ACCOUNT | 0x0001602F | I | | "Account is unlocked for user " #EN_ACCT_MGMT_PASSWORD_TO_EXPIRE | 0x00016020 | W | | "Account password will expire for user " ###EN_IPMI_MEM_FAILED | 0x0021601A | E | | "All memory has failed." #EN_PWM_PWDS_EXPIRE_ON_FIRSTACCESS | 0x00016028 | I | | "All new account passwords expire on first access setting has been changed" #EN_ACCT_PWD_REQUIRED | 0x00016051 | W | | "A password is required for user " #EN_APP_ALERT | 0x00000014 | E | | "Application Posted Alert to ASM" ###EN_PFA_HI_FAULT_1_6V | 0x08039480 | N | R | "Blade 1.6V over recommended voltage" ###EN_PFA_LO_FAULT_1_6V | 0x08039880 | N | R | "Blade 1.6V under recommended voltage" ###EN_CUTOFF_HI_OVER_TEMP_AMBIENT | 0x0001C480 | E | R | "Blade ambient over temperature" ###EN_CUTOFF_LO_OVER_TEMP_AMBIENT | 0x0001C800 | E | R | "Blade ambient under temperature fault." ###EN_BLADE_10_MISMATCH | 0x0400038A | W | R | "Blade %d incompatible with chassis" ###EN_BLADE_11_MISMATCH | 0x0400038B | W | R | "Blade %d incompatible with chassis" ###EN_BLADE_12_MISMATCH | 0x0400038C | W | R | "Blade %d incompatible with chassis" ###EN_BLADE_13_MISMATCH | 0x0400038D | W | R | "Blade %d incompatible with chassis" ###EN_BLADE_14_MISMATCH | 0x0400038E | W | R | "Blade %d incompatible with chassis" ###EN_BLADE_1_MISMATCH | 0x04000381 | W | R | "Blade %d incompatible with chassis" ###EN_BLADE_2_MISMATCH | 0x04000382 | W | R | "Blade %d incompatible with chassis" ###EN_BLADE_3_MISMATCH | 0x04000383 | W | R | "Blade %d incompatible with chassis" ###EN_BLADE_4_MISMATCH | 0x04000384 | W | R | "Blade %d incompatible with chassis" ###EN_BLADE_5_MISMATCH | 0x04000385 | W | R | "Blade %d incompatible with chassis" ###EN_BLADE_6_MISMATCH | 0x04000386 | W | R | "Blade %d incompatible with chassis" ###EN_BLADE_7_MISMATCH | 0x04000387 | W | R | "Blade %d incompatible with chassis" ###EN_BLADE_8_MISMATCH | 0x04000388 | W | R | "Blade %d incompatible with chassis" ###EN_BLADE_9_MISMATCH | 0x04000389 | W | R | "Blade %d incompatible with chassis" ###EN_PEX_CAR_THRESHOLD_REACHED | 0x0E012047 | I | R | "Blade has been throttled; low clock rate" ###EN_BLADE_INCOMPATIABLE | 0x04000280 | E | R | "Blade incompatible with chassis" ###EN_MEMORY_FAIL | 0x05200000 | E | | "Blade memory fault" #EN_IPMI_BMC_RESET | 0x00216002 | I | | "Blade service processor reset" #EN_IPMI_OUT_OF_DATE_SDR_BMC | 0x10016000 | I | | "Blade sensor data records updated" #EN_COD_BLADE_ACTIVATED | 0x04001001 | I | | "Blade standby capacity activated" #EN_IPMI_BMC_RESET_NOT_SUPPORTED | 0x00216001 | I | R | "BMC reset not supported." ###EN_ADDIN_CABLE | 0x64001000 | N | R | "Cable on add-in card not connected to system board" ###EN_CUTOFF_HI_FAULT_12V_PLANAR | 0x06036480 | E | R | "Chassis 12V over voltage fault" ###EN_CUTOFF_LO_FAULT_12V_PLANAR | 0x06036800 | E | R | "Chassis 12V under voltage fault" ###EN_CUTOFF_HI_FAULT_1_8V | 0x0807A480 | E | R | "Chassis 1.8V over voltage fault." ###EN_CUTOFF_LO_FAULT_1_8V | 0x0807A880 | E | R | "Chassis 1.8V under voltage fault." ###EN_CUTOFF_HI_FAULT_2_5V | 0x08030480 | E | R | "Chassis 2.5V over voltage fault" ###EN_CUTOFF_LO_FAULT_2_5V | 0x08030880 | E | R | "Chassis 2.5V under voltage fault" ###EN_CUTOFF_HI_FAULT_3_35V | 0x08032480 | E | R | "Chassis 3.3V over voltage fault" ###EN_CUTOFF_LO_FAULT_3_35V | 0x08032880 | E | R | "Chassis 3.3V under voltage fault" ###EN_CUTOFF_HI_FAULT_N5V | 0x0803C480 | E | R | "Chassis -5V over voltage fault" ###EN_CUTOFF_HI_FAULT_PLANAR_5V | 0x06034480 | E | R | "Chassis 5V over voltage fault" ###EN_CUTOFF_LO_FAULT_N5V | 0x0803C800 | E | R | "Chassis -5V under voltage fault" ###EN_CUTOFF_LO_FAULT_PLANAR_5V | 0x06034800 | E | R | "Chassis 5V under voltage fault" ###EN_MAJOR_LO_OVER_TEMP_AMBIENT | 0x0011C900 | E | R | "Chassis under recommended ambient temperature" ###EN_PFA_LO_OVER_TEMP_AMBIENT | 0x0001D800 | W | R | "Chassis under recommended ambient temperature" #EN_CMD_MD_ENABLED | 0x0001605E | I | | "Command mode has been changed" #EN_CMD_MD_INACTIV | 0x0001605D | I | | "Command mode inactivity timeout has been changed" #EN_PWM_COMPLEX_PASSWORD_RULES | 0x00016026 | I | | "Complex password rules setting has been changed" #EN_I2C_CONST_FAN_SPEED | 0x000A6000 | N | R | "Constant fan speed override enabled" ###EN_FAULT_CPU1 | 0x04200201 | E | R | "CPU %d Fault" ###EN_FAULT_CPU2 | 0x04200202 | E | R | "CPU %d Fault" ###EN_FAULT_CPU3 | 0x04200203 | E | R | "CPU %d Fault" ###EN_FAULT_CPU4 | 0x04200204 | E | R | "CPU %d Fault" ###EN_FAULT_CPU | 0x04200200 | E | R | "CPU Fault" ###EN_PFA_HI_FAULT_VRM1 | 0x04401501 | W | R | "CPU voltage regulator %d over recommended voltage." ###EN_PFA_HI_FAULT_VRM2 | 0x04401502 | W | R | "CPU voltage regulator %d over recommended voltage." ###EN_PFA_LO_FAULT_VRM1 | 0x04401801 | W | R | "CPU voltage regulator %d under recommended voltage." ###EN_PFA_LO_FAULT_VRM2 | 0x04401802 | W | R | "CPU voltage regulator %d under recommended voltage." #EN_ENABLE_ENCRYPTION | 0x0001604E | I | | "Data encryption has been" #EN_PWM_DFT_PW_EXPIRE_ON_FIRSTACCESS | 0x00016024 | I | | "Default account password expires on first access setting has been changed" #EN_IPMI_DIMM_ERR | 0x00216003 | E | R | "DIMM failed: DIMM number unknown." #EN_LOG75 | 0x00000071 | W | R | "Event log 75%% full" #EN_LOG_CLEARED | 0x0001600B | I | | "Event log cleared" #EN_LOG_FULL | 0x0000006B | W | R | "Event log full" #EN_IPMI_WAKEUP_VECTOR_FAIL | 0x00216037 | E | | "Failure calling OS wakeup vector." #EN_IPMI_DOCK_DISABLE_FAIL | 0x00216036 | E | | "Failure disabling docking station." #EN_IPMI_BOARD_INIT_FAIL | 0x00216039 | E | | "Failure during board initialization." #EN_IPMI_CACHE_INIT_FAIL | 0x0021602F | E | | "Failure during cache initialization." #EN_IPMI_DOCK_ATTACHMENT_FAIL | 0x00216033 | E | | "Failure during docking station attachment." #EN_IPMI_DOCK_EJECTION_FAIL | 0x00216035 | E | | "Failure during docking station ejection." #EN_IPMI_FLOPPY_INIT_FAIL | 0x0021603A | E | | "Failure during floppy initialization." #EN_IPMI_DRIVE_INIT_FAIL | 0x00216027 | E | | "Failure during hard drive initialization." #EN_IPMI_KEY_INIT_FAIL | 0x00216031 | E | | "Failure during keyboard controller initialization." #EN_IPMI_KEY_TEST_FAIL | 0x0021603B | E | | "Failure during keyboard test." #EN_IPMI_MGMT_CTRL_INIT_FAIL | 0x00216032 | E | | "Failure during management controller initialization." #EN_IPMI_MEM_INIT_FAIL | 0x00216026 | E | | "Failure during memory initialization." #EN_IPMI_ROM_INIT_FAIL | 0x0021602D | E | | "Failure during option ROM initialization." #EN_IPMI_PCI_CONF_FAIL | 0x0021602B | E | | "Failure during PCI configuration." #EN_IPMI_POINT_TEST_FAIL | 0x0021603C | E | | "Failure during pointing device test." #EN_IPMI_USB_CONF_FAIL | 0x0021602C | E | | "Failure during USB configuration." #EN_IPMI_USER_AUTH_FAIL | 0x00216029 | E | | "Failure during user authentication." #EN_IPMI_USER_SETUP_FAIL | 0x0021602A | E | | "Failure during user setup." #EN_IPMI_VIDEO_INIT_FAIL | 0x0021602E | E | | "Failure during video initialization." #EN_IPMI_DOCK_ENABLE_FAIL | 0x00216034 | E | | "Failure enabling docking station." #EN_FTPDATA_PORT | 0x0001603C | I | | "FTP Data port has been changed" #EN_FTP_PORT | 0x0001603B | I | | "FTP port has been changed" #EN_FTP_ENABLED | 0x00016058 | I | | "FTP server has been" #EN_FTP_TIMEOUT | 0x0001605C | I | | "FTP timeout has been changed" #EN_HTTP_PORT | 0x00016033 | I | | "HTTP port has been changed" #EN_PWM_INACTIVITY_ALERT_DISABLE | 0x0001602A | I | | "Inactivity alert and disable period setting has been changed" #EN_PWM_INACTIVITY_ALERT | 0x00016029 | I | | "Inactivity alert period setting has been changed" #EN_PEX_POWER_INVENTORY_COMPLETE | 0x0E01204B | I | R | "Initial power inventory has been completed" #EN_SWITCH_1_PMC_WO_PERMIT | 0x0EA0F501 | I | | "I/O module %d controls Protected Mode Capability without MM permision." #EN_SWITCH_2_PMC_WO_PERMIT | 0x0EA0F502 | I | | "I/O module %d controls Protected Mode Capability without MM permision." #EN_SWITCH_3_PMC_WO_PERMIT | 0x0EA0F503 | I | | "I/O module %d controls Protected Mode Capability without MM permision." #EN_SWITCH_4_PMC_WO_PERMIT | 0x0EA0F504 | I | | "I/O module %d controls Protected Mode Capability without MM permision." #EN_SWITCH_5_PMC_WO_PERMIT | 0x0EA0F505 | I | | "I/O module %d controls Protected Mode Capability without MM permision." #EN_SWITCH_6_PMC_WO_PERMIT | 0x0EA0F506 | I | | "I/O module %d controls Protected Mode Capability without MM permision." #EN_SWITCH_7_PMC_WO_PERMIT | 0x0EA0F507 | I | | "I/O module %d controls Protected Mode Capability without MM permision." #EN_SWITCH_8_PMC_WO_PERMIT | 0x0EA0F508 | I | | "I/O module %d controls Protected Mode Capability without MM permision." #EN_SWITCH_9_PMC_WO_PERMIT | 0x0EA0F509 | I | | "I/O module %d controls Protected Mode Capability without MM permision." #EN_SWITCH_10_PMC_WO_PERMIT | 0x0EA0F50A | I | | "I/O module %d controls Protected Mode Capability without MM permision." #EN_SWITCH_1_PMC_EXT_MGT | 0x0EA0F301 | I | | "I/O module %d enters Protected Mode Control of Ext. Management." #EN_SWITCH_2_PMC_EXT_MGT | 0x0EA0F302 | I | | "I/O module %d enters Protected Mode Control of Ext. Management." #EN_SWITCH_3_PMC_EXT_MGT | 0x0EA0F303 | I | | "I/O module %d enters Protected Mode Control of Ext. Management." #EN_SWITCH_4_PMC_EXT_MGT | 0x0EA0F304 | I | | "I/O module %d enters Protected Mode Control of Ext. Management." #EN_SWITCH_5_PMC_EXT_MGT | 0x0EA0F305 | I | | "I/O module %d enters Protected Mode Control of Ext. Management." #EN_SWITCH_6_PMC_EXT_MGT | 0x0EA0F306 | I | | "I/O module %d enters Protected Mode Control of Ext. Management." #EN_SWITCH_7_PMC_EXT_MGT | 0x0EA0F307 | I | | "I/O module %d enters Protected Mode Control of Ext. Management." #EN_SWITCH_8_PMC_EXT_MGT | 0x0EA0F308 | I | | "I/O module %d enters Protected Mode Control of Ext. Management." #EN_SWITCH_9_PMC_EXT_MGT | 0x0EA0F309 | I | | "I/O module %d enters Protected Mode Control of Ext. Management." #EN_SWITCH_10_PMC_EXT_MGT | 0x0EA0F30A | I | | "I/O module %d enters Protected Mode Control of Ext. Management." #EN_SWITCH_1_PMC_EXT_PORTS | 0x0EA0F201 | I | | "I/O module %d enters Protected Mode Control of Ext. Ports." #EN_SWITCH_2_PMC_EXT_PORTS | 0x0EA0F202 | I | | "I/O module %d enters Protected Mode Control of Ext. Ports." #EN_SWITCH_3_PMC_EXT_PORTS | 0x0EA0F203 | I | | "I/O module %d enters Protected Mode Control of Ext. Ports." #EN_SWITCH_4_PMC_EXT_PORTS | 0x0EA0F204 | I | | "I/O module %d enters Protected Mode Control of Ext. Ports." #EN_SWITCH_5_PMC_EXT_PORTS | 0x0EA0F205 | I | | "I/O module %d enters Protected Mode Control of Ext. Ports." #EN_SWITCH_6_PMC_EXT_PORTS | 0x0EA0F206 | I | | "I/O module %d enters Protected Mode Control of Ext. Ports." #EN_SWITCH_7_PMC_EXT_PORTS | 0x0EA0F207 | I | | "I/O module %d enters Protected Mode Control of Ext. Ports." #EN_SWITCH_8_PMC_EXT_PORTS | 0x0EA0F208 | I | | "I/O module %d enters Protected Mode Control of Ext. Ports." #EN_SWITCH_9_PMC_EXT_PORTS | 0x0EA0F209 | I | | "I/O module %d enters Protected Mode Control of Ext. Ports." #EN_SWITCH_10_PMC_EXT_PORTS | 0x0EA0F20A | I | | "I/O module %d enters Protected Mode Control of Ext. Ports." #EN_SWITCH_1_PMC_IP_CFG | 0x0EA0F101 | I | | "I/O module %d enters Protected Mode Control of IP CFG." #EN_SWITCH_2_PMC_IP_CFG | 0x0EA0F102 | I | | "I/O module %d enters Protected Mode Control of IP CFG." #EN_SWITCH_3_PMC_IP_CFG | 0x0EA0F103 | I | | "I/O module %d enters Protected Mode Control of IP CFG." #EN_SWITCH_4_PMC_IP_CFG | 0x0EA0F104 | I | | "I/O module %d enters Protected Mode Control of IP CFG." #EN_SWITCH_5_PMC_IP_CFG | 0x0EA0F105 | I | | "I/O module %d enters Protected Mode Control of IP CFG." #EN_SWITCH_6_PMC_IP_CFG | 0x0EA0F106 | I | | "I/O module %d enters Protected Mode Control of IP CFG." #EN_SWITCH_7_PMC_IP_CFG | 0x0EA0F107 | I | | "I/O module %d enters Protected Mode Control of IP CFG." #EN_SWITCH_8_PMC_IP_CFG | 0x0EA0F108 | I | | "I/O module %d enters Protected Mode Control of IP CFG." #EN_SWITCH_9_PMC_IP_CFG | 0x0EA0F109 | I | | "I/O module %d enters Protected Mode Control of IP CFG." #EN_SWITCH_10_PMC_IP_CFG | 0x0EA0F10A | I | | "I/O module %d enters Protected Mode Control of IP CFG." #EN_SWITCH_1_PMC_RESET_DFLT | 0x0EA0F401 | I | | "I/O module %d enters Protected Mode Control of Reset CFG to Default." #EN_SWITCH_2_PMC_RESET_DFLT | 0x0EA0F402 | I | | "I/O module %d enters Protected Mode Control of Reset CFG to Default." #EN_SWITCH_3_PMC_RESET_DFLT | 0x0EA0F403 | I | | "I/O module %d enters Protected Mode Control of Reset CFG to Default." #EN_SWITCH_4_PMC_RESET_DFLT | 0x0EA0F404 | I | | "I/O module %d enters Protected Mode Control of Reset CFG to Default." #EN_SWITCH_5_PMC_RESET_DFLT | 0x0EA0F405 | I | | "I/O module %d enters Protected Mode Control of Reset CFG to Default." #EN_SWITCH_6_PMC_RESET_DFLT | 0x0EA0F406 | I | | "I/O module %d enters Protected Mode Control of Reset CFG to Default." #EN_SWITCH_7_PMC_RESET_DFLT | 0x0EA0F407 | I | | "I/O module %d enters Protected Mode Control of Reset CFG to Default." #EN_SWITCH_8_PMC_RESET_DFLT | 0x0EA0F408 | I | | "I/O module %d enters Protected Mode Control of Reset CFG to Default." #EN_SWITCH_9_PMC_RESET_DFLT | 0x0EA0F409 | I | | "I/O module %d enters Protected Mode Control of Reset CFG to Default." #EN_SWITCH_10_PMC_RESET_DFLT | 0x0EA0F40A | I | | "I/O module %d enters Protected Mode Control of Reset CFG to Default." #EN_SWITCH_1_IOM_CFG_ERROR | 0x0EA0B001 | I | R | "I/O Module %d incompatible with other I/O modules" #EN_SWITCH_2_IOM_CFG_ERROR | 0x0EA0B002 | I | R | "I/O Module %d incompatible with other I/O modules" #EN_SWITCH_3_IOM_CFG_ERROR | 0x0EA0B003 | I | R | "I/O Module %d incompatible with other I/O modules" #EN_SWITCH_4_IOM_CFG_ERROR | 0x0EA0B004 | I | R | "I/O Module %d incompatible with other I/O modules" #EN_SWITCH_5_IOM_CFG_ERROR | 0x0EA0B005 | I | R | "I/O Module %d incompatible with other I/O modules" #EN_SWITCH_6_IOM_CFG_ERROR | 0x0EA0B006 | I | R | "I/O Module %d incompatible with other I/O modules" #EN_SWITCH_7_IOM_CFG_ERROR | 0x0EA0B007 | I | R | "I/O Module %d incompatible with other I/O modules" #EN_SWITCH_8_IOM_CFG_ERROR | 0x0EA0B008 | I | R | "I/O Module %d incompatible with other I/O modules" #EN_SWITCH_9_IOM_CFG_ERROR | 0x0EA0B009 | I | R | "I/O Module %d incompatible with other I/O modules" #EN_SWITCH_10_IOM_CFG_ERROR | 0x0EA0B00A | I | R | "I/O Module %d incompatible with other I/O modules" #EN_SWITCH_1_HW_CFG_ERROR | 0x0EA05001 | E | R | "I/O Module %d in the interposer is not supported in this configuration." #EN_SWITCH_2_HW_CFG_ERROR | 0x0EA05002 | E | R | "I/O Module %d in the interposer is not supported in this configuration." #EN_SWITCH_3_HW_CFG_ERROR | 0x0EA05003 | E | R | "I/O Module %d in the interposer is not supported in this configuration." #EN_SWITCH_4_HW_CFG_ERROR | 0x0EA05004 | E | R | "I/O Module %d in the interposer is not supported in this configuration." #EN_SWITCH_5_HW_CFG_ERROR | 0x0EA05005 | E | R | "I/O Module %d in the interposer is not supported in this configuration." #EN_SWITCH_6_HW_CFG_ERROR | 0x0EA05006 | E | R | "I/O Module %d in the interposer is not supported in this configuration." #EN_SWITCH_7_HW_CFG_ERROR | 0x0EA05007 | E | R | "I/O Module %d in the interposer is not supported in this configuration." #EN_SWITCH_8_HW_CFG_ERROR | 0x0EA05008 | E | R | "I/O Module %d in the interposer is not supported in this configuration." #EN_SWITCH_9_HW_CFG_ERROR | 0x0EA05009 | E | R | "I/O Module %d in the interposer is not supported in this configuration." #EN_SWITCH_10_HW_CFG_ERROR | 0x0EA0500A | E | R | "I/O Module %d in the interposer is not supported in this configuration." #EN_SWITCH_1_IP_CFG_CHANGE | 0x0EA0A001 | I | | "I/O module %d IP configuration was changed." #EN_SWITCH_2_IP_CFG_CHANGE | 0x0EA0A002 | I | | "I/O module %d IP configuration was changed." #EN_SWITCH_3_IP_CFG_CHANGE | 0x0EA0A003 | I | | "I/O module %d IP configuration was changed." #EN_SWITCH_4_IP_CFG_CHANGE | 0x0EA0A004 | I | | "I/O module %d IP configuration was changed." #EN_SWITCH_5_IP_CFG_CHANGE | 0x0EA0A005 | I | | "I/O module %d IP configuration was changed." #EN_SWITCH_6_IP_CFG_CHANGE | 0x0EA0A006 | I | | "I/O module %d IP configuration was changed." #EN_SWITCH_7_IP_CFG_CHANGE | 0x0EA0A007 | I | | "I/O module %d IP configuration was changed." #EN_SWITCH_8_IP_CFG_CHANGE | 0x0EA0A008 | I | | "I/O module %d IP configuration was changed." #EN_SWITCH_9_IP_CFG_CHANGE | 0x0EA0A009 | I | | "I/O module %d IP configuration was changed." #EN_SWITCH_10_IP_CFG_CHANGE | 0x0EA0A00A | I | | "I/O module %d IP configuration was changed." #EN_SWITCH_1_NAT_ACTIVATE | 0x0EA0F001 | I | | "I/O module %d NAT table is activated." #EN_SWITCH_2_NAT_ACTIVATE | 0x0EA0F002 | I | | "I/O module %d NAT table is activated." #EN_SWITCH_3_NAT_ACTIVATE | 0x0EA0F003 | I | | "I/O module %d NAT table is activated." #EN_SWITCH_4_NAT_ACTIVATE | 0x0EA0F004 | I | | "I/O module %d NAT table is activated." #EN_SWITCH_5_NAT_ACTIVATE | 0x0EA0F005 | I | | "I/O module %d NAT table is activated." #EN_SWITCH_6_NAT_ACTIVATE | 0x0EA0F006 | I | | "I/O module %d NAT table is activated." #EN_SWITCH_7_NAT_ACTIVATE | 0x0EA0F007 | I | | "I/O module %d NAT table is activated." #EN_SWITCH_8_NAT_ACTIVATE | 0x0EA0F008 | I | | "I/O module %d NAT table is activated." #EN_SWITCH_9_NAT_ACTIVATE | 0x0EA0F009 | I | | "I/O module %d NAT table is activated." #EN_SWITCH_10_NAT_ACTIVATE | 0x0EA0F00A | I | | "I/O module %d NAT table is activated." #EN_SWITCH_1_BLOWN_FUSE | 0x0EA0F701 | E | R | "I/O Module %d - Open fuse detected. Power redundancy lost for this module." #EN_SWITCH_2_BLOWN_FUSE | 0x0EA0F702 | E | R | "I/O Module %d - Open fuse detected. Power redundancy lost for this module." #EN_SWITCH_3_BLOWN_FUSE | 0x0EA0F703 | E | R | "I/O Module %d - Open fuse detected. Power redundancy lost for this module." #EN_SWITCH_4_BLOWN_FUSE | 0x0EA0F704 | E | R | "I/O Module %d - Open fuse detected. Power redundancy lost for this module." #EN_SWITCH_5_BLOWN_FUSE | 0x0EA0F705 | E | R | "I/O Module %d - Open fuse detected. Power redundancy lost for this module." #EN_SWITCH_6_BLOWN_FUSE | 0x0EA0F706 | E | R | "I/O Module %d - Open fuse detected. Power redundancy lost for this module." #EN_SWITCH_7_BLOWN_FUSE | 0x0EA0F707 | E | R | "I/O Module %d - Open fuse detected. Power redundancy lost for this module." #EN_SWITCH_8_BLOWN_FUSE | 0x0EA0F708 | E | R | "I/O Module %d - Open fuse detected. Power redundancy lost for this module." #EN_SWITCH_9_BLOWN_FUSE | 0x0EA0F709 | E | R | "I/O Module %d - Open fuse detected. Power redundancy lost for this module." #EN_SWITCH_10_PM_CFG_MISMATCH | 0x0EA0F60A | I | | "I/O module %d Protected Mode Permission and MM configured permission mismatch." #EN_SWITCH_1_PM_CFG_MISMATCH | 0x0EA0F601 | I | | "I/O module %d Protected Mode Permission and MM configured permission mismatch." #EN_SWITCH_2_PM_CFG_MISMATCH | 0x0EA0F602 | I | | "I/O module %d Protected Mode Permission and MM configured permission mismatch." #EN_SWITCH_3_PM_CFG_MISMATCH | 0x0EA0F603 | I | | "I/O module %d Protected Mode Permission and MM configured permission mismatch." #EN_SWITCH_4_PM_CFG_MISMATCH | 0x0EA0F604 | I | | "I/O module %d Protected Mode Permission and MM configured permission mismatch." #EN_SWITCH_5_PM_CFG_MISMATCH | 0x0EA0F605 | I | | "I/O module %d Protected Mode Permission and MM configured permission mismatch." #EN_SWITCH_6_PM_CFG_MISMATCH | 0x0EA0F606 | I | | "I/O module %d Protected Mode Permission and MM configured permission mismatch." #EN_SWITCH_7_PM_CFG_MISMATCH | 0x0EA0F607 | I | | "I/O module %d Protected Mode Permission and MM configured permission mismatch." #EN_SWITCH_8_PM_CFG_MISMATCH | 0x0EA0F608 | I | | "I/O module %d Protected Mode Permission and MM configured permission mismatch." #EN_SWITCH_9_PM_CFG_MISMATCH | 0x0EA0F609 | I | | "I/O module %d Protected Mode Permission and MM configured permission mismatch." #EN_SWITCH_10_BLOWN_FUSE | 0x0EA0F70A | E | R | "I/O Module %d - Open fuse detected. Power redundancy lost for this module." #EN_TCPAPPS_DUPLICATE_IP | 0x00016015 | W | | "IP address of primary MM is the same as the IP address of standby MM. Standby network interface is disabled." #EN_PORT_CFG_RESET | 0x0001604A | I | | "IP port numbers is reset to defaults" #EN_IPMI_KEY_FAIL | 0x0021601F | E | | "Keyboard failure." #EN_FIVE_LOGIN_FAILURES | 0x0001600A | W | | "LAN: Web Server tamper delay triggered. Possible break in attempt." #EN_PWM_LDAP_AUTHMETHOD | 0x00016030 | I | | "LDAP authentication method has been changed" #EN_LOAD_WD | 0x00000078 | E | | "Loader Watchdog Triggered" #EN_PWM_MAX_LOGIN_FAILURE_LOCKOUT | 0x0001602B | I | | "Lockout period after maximum login failures setting has been changed" #EN_MM_NETWORK_LOG_LINK_LOSS | 0x00217001 | W | | "Management Module external network logical link lost." #EN_MM_NETWORK_LOSS | 0x00217000 | W | | "Management Module external network physical link lost." #EN_MM_NETWORK_INIT_CMPLT | 0x00016001 | I | | "Management Module network initialization complete" #EN_PWM_MAX_LOGIN_FAILURES | 0x00016022 | I | | "Max login failures setting has been changed" #EN_PEX_CONSISTENCY_CHECK | 0x0E012044 | I | R | "Measured power of blade is higher than current Power Cap" #EN_PWM_MIN_DIFF_CHARS_IN_PWDS | 0x00016027 | I | | "Minimum different characters in passwords setting has been changed" #EN_PWM_MIN_PW_REUSE_CYCLE | 0x00016025 | I | | "Minimum password reuse cycle setting has been changed" #EN_PWR_DOMAIN_1_MISMATCHED_PS | 0x08006001 | W | R | "Mismatched Power Modules in power domain %d" #EN_PWR_DOMAIN_2_MISMATCHED_PS | 0x08006002 | W | R | "Mismatched Power Modules in power domain %d" #EN_CPK_FET_FAIL | 0x08237080 | N | R | "Multiple +12v FET failures, power domain 2 inoperable." #EN_MPE_BD_FAULT | 0x04000080 | E | R | "Multi Processor Expansion board fault." #EN_PEX_PCAPMIN_GT_PCAP | 0x0E012043 | I | R | "New minimum Power Cap is greater than current Power Cap of blade" #EN_MM_NON_REDUNDANT | 0x00284000 | W | R | "No standby Management Module in chassis" #EN_IPMI_NO_VIDEO | 0x00216022 | E | | "No video device detected." #EN_NTP_ENABLED | 0x0001605B | I | | "NTP server has been" #EN_OS_WD | 0x00000073 | E | | "OS Watchdog Triggered" #EN_PERR | 0x06500000 | E | | "Parity Error PCI Bus" #EN_PWM_PW_EXIRATION | 0x00016023 | I | | "Password expiration setting has been changed" #EN_PWM_PW_REQUIRED | 0x0001602C | I | | "Password required setting has been changed" #EN_FANP1_SPEED | 0x00026A01 | E | R | "Peer Blower %d failure" #EN_FANP2_SPEED | 0x00026A02 | E | R | "Peer Blower %d failure" #EN_FANP3_SPEED | 0x00026A03 | E | R | "Peer Blower %d failure" #EN_FANP4_SPEED | 0x00026A04 | E | R | "Peer Blower %d failure" #EN_FANP1_PFA | 0x000A7801 | E | R | "Peer Blower %d outside of recommended speed" #EN_FANP2_PFA | 0x000A7802 | E | R | "Peer Blower %d outside of recommended speed" #EN_FANP3_PFA | 0x000A7803 | E | R | "Peer Blower %d outside of recommended speed" #EN_FANP4_PFA | 0x000A7804 | E | R | "Peer Blower %d outside of recommended speed" #EN_PFA | 0x0000007B | E | R | "PFA Alert, see preceding error in event log." #EN_SMI_ERROR | 0x00100000 | E | | "PFA Alert, see preceding error in event log." #EN_CPK_FET_NON_REDUNDANT | 0x082A9000 | N | R | "Possible +12v FET failure, make sure chassis power supplies are redundant." #EN_POST_WD | 0x00000072 | E | | "POST Watchdog Triggered" #EN_PEX_PCAPMIN_PCAPMAX_CHANGED | 0x0E012045 | I | R | "Power Cap range of blade has changed" #EN_PEX_PCAP_CHANGED | 0x0E012046 | I | R | "Power Cap value of blade has been changed" #EN_PEX_CAPABILITY_CHANGED | 0x0E012042 | I | R | "PowerExecutive capability of blade has changed" #EN_PEX_HW_ERROR | 0x0E012041 | W | R | "PowerExecutive hardware error has occurred" #EN_PEX_HOST_SYSTEM_WRITE | 0x0E012048 | I | R | "PowerExecutive parameters have been modified by external source" #EN_BLADE_NO_DC_FAULT_DOM1 | 0x00029401 | W | R | "Power module 1 or 2 is required to power blades 1 to 6." #EN_BLADE_NO_DC_FAULT_DOM1 | 0x00029401 | W | R | "Power module 1 or 2 is required to power blades in power domain 1." #EN_BLADE_NO_DC_FAULT | 0x00029402 | W | R | "Power module 3 or 4 is required to power blades 5 to 8." #EN_BLADE_NO_DC_FAULT | 0x00029400 | W | R | "Power module 3 or 4 is required to power blades in power domain 2." #EN_BLADE_NO_DC_FAULT_BCT | 0x00029402 | W | R | "Power module 3 or 4 is required to power blades in power domain 2." #EN_MM_1_ISPRIME | 0x06000201 | I | | "Primary Management Module in bay %d is active." #EN_MM_2_ISPRIME | 0x06000202 | I | | "Primary Management Module in bay %d is active." #EN_READ_THE_LOG | 0x0000007F | I | | "Read the event log" #EN_RDOC_PORT_ENABLED | 0x00016046 | I | | "Remote Disk-on-Card port has been" #EN_RDOC_PORT | 0x00016042 | I | | "Remote Disk-on-Card port has been changed" #EN_RD_PORT_ENABLED | 0x00016045 | I | | "Remote Disk port has been" #EN_RD_PORT | 0x00016041 | I | | "Remote Disk port has been changed" #EN_KVM_PORT_ENABLED | 0x00016047 | I | | "Remote KVM port has been" #EN_KVM_PORT | 0x00016043 | I | | "Remote KVM port has been changed" #EN_LOGIN_FAILED | 0x00200000 | I | | "Remote login failed for user " #EN_RAT_LOGIN | 0x0000007A | I | | "Remote login successful for user " #EN_RAT_LOGOFF | 0x0001601A | I | | "Remote logoff successful for user " #EN_IPMI_BOOT_MEDIA_MISSING | 0x00216020 | E | | "Removable boot media missing." #EN_SDS_PORT | 0x00016056 | I | | "SDS port has been changed" #EN_TCPAPPS_SSL_CMD_MODE_DISABLED | 0x00016005 | I | | "Secure TCP Command Mode disabled." #EN_TCPAPPS_SSL_CMD_MODE_ENABLED | 0x00016004 | I | | "Secure TCP Command Mode enabled." #EN_SEC_TCP_CMDMODE_PORT | 0x0001603A | I | | "Secure TCP Command Mode port has been changed" #EN_TCPAPPS_SSL_CMD_MODE_PORT | 0x00016006 | I | | "Secure TCP Command Mode port number changed. New port number: " #EN_PWM_SECLVL | 0x00016021 | I | | "Security level has been changed" #EN_SNMP_PASSWORD_REQUIRED | 0x00016101 | W | | "Security settings now require passwords. An SNMP v3 authentication protocol must be specified for user " #EN_BAUD_RATE | 0x00016053 | I | | "Serial port baud rate has been changed" #EN_PARITY | 0x00016054 | I | | "Serial port parity has been changed" #EN_STOPBITS | 0x00016055 | I | | "Serial port stop bits number has been changed" #EN_SP_EVT_FULL | 0x00216017 | I | R | "Service processor event log is full." #EN_SFTP_PORT | 0x0001603E | I | | "SFTP port has been changed" #EN_SFTP_ENABLED | 0x0001605A | I | | "SFTP server has been" #EN_NFPORT_CFG_RESET | 0x0001604B | I | | "SLIM port numbers is reset to defaults" #EN_SLP_PORT_ENABLED | 0x00016048 | I | | "SLP port has been" #EN_SLP_PORT | 0x00016044 | I | | "SLP port has been changed" #EN_SMASH_SSH_ENABLEMENT | 0x0001604D | I | | "SMASH SSH port has been" #EN_SMASH_SSH_PORT | 0x00016040 | I | | "SMASH SSH port has been changed" #EN_SMASH_TELNET_ENABLEMENT | 0x0001604C | I | | "SMASH Telnet port has been" #EN_SMASH_TELNET_PORT | 0x0001603F | I | | "SMASH Telnet port has been changed" #EN_SNMP_AGENT_PORT | 0x00016037 | I | | "SNMP Agent port has been changed" #EN_SNMP_TRAP_DISABLED | 0x0001605F | I | | "SNMP trap has been" #EN_SNMP_TRAPS_PORT | 0x00016038 | I | | "SNMP Traps port has been changed" #EN_SNMP1_AGENT_ENABLED | 0x00016060 | I | | "SNMP v1 agent has been" #EN_SNMP_COMM_ACCTYPE1 | 0x00016065 | I | | "SNMP v1 community 1 access type has been changed to" #EN_SNMP_COMM_NAME1 | 0x00016062 | I | | "SNMP v1 community 1 name has been changed to" #EN_SNMP_COMM_ACCTYPE2 | 0x00016066 | I | | "SNMP v1 community 2 access type has been changed to" #EN_SNMP_COMM_NAME2 | 0x00016063 | I | | "SNMP v1 community 2 name has been changed to" #EN_SNMP_COMM_ACCTYPE3 | 0x00016067 | I | | "SNMP v1 community 3 access type has been changed to" #EN_SNMP_COMM_NAME3 | 0x00016064 | I | | "SNMP v1 community 3 name has been changed to" #EN_SNMP3_AGENT_ENABLED | 0x00016061 | I | | "SNMP v3 agent has been" #EN_LOGIN_FAILED_PASSWORD_EXPIRED | 0x00016100 | W | | "SNMP v3 login failed due to expired password for user " #EN_SSH_PORT | 0x00016036 | I | | "SSH port has been changed" #EN_TCPAPPS_SSL_CLIENT_CERT_INVALID | 0x00016010 | E | R | "SSL Client Certificate Error" #EN_SSL_PORT | 0x00016034 | I | | "SSL port has been changed" #EN_TCPAPPS_SSL_SERVER_CERT_INVALID | 0x0001600F | E | R | "SSL Server Certificate Error" #EN_TCPAPPS_SSL_STANDBY_SERVER_CERT_INVALID | 0x00016014 | E | R | "SSL Server Certificate Error" #EN_TCPAPPS_SSL_TRUST1_CERT_INVALID | 0x00016011 | E | R | "SSL Trusted CA Certificate 1 Error" #EN_TCPAPPS_SSL_TRUST2_CERT_INVALID | 0x00016012 | E | R | "SSL Trusted CA Certificate 2 Error" #EN_TCPAPPS_SSL_TRUST3_CERT_INVALID | 0x00016013 | E | R | "SSL Trusted CA Certificate 3 Error" #EN_THRESH_HI_CRIT_TEMP | 0x80010901 | N | R | "%s %s (%s) %s critical %s." #EN_THRESH_HI_CRIT_VOLT | 0x80010902 | N | R | "%s %s (%s) %s critical %s." #EN_THRESH_LO_CRIT_VOLT | 0x80010202 | N | R | "%s %s (%s) %s critical %s." #EN_THRESH_HI_NONRECOV_TEMP | 0x80010B01 | N | R | "%s %s (%s) %s non-recoverable %s fault." #EN_THRESH_HI_NONRECOV_VOLT | 0x80010B02 | N | R | "%s %s (%s) %s non-recoverable %s fault." #EN_THRESH_LO_NONRECOV_VOLT | 0x80010402 | N | R | "%s %s (%s) %s non-recoverable %s fault." #EN_THRESH_HI_WARN_TEMP | 0x80010701 | N | R | "%s %s (%s) %s recommended %s." #EN_THRESH_HI_WARN_VOLT | 0x80010702 | N | R | "%s %s (%s) %s recommended %s." #EN_THRESH_LO_WARN_VOLT | 0x80010002 | N | R | "%s %s (%s) %s recommended %s." #EN_MM_1_ISSTANDBY | 0x06000301 | I | | "Standby Management Module in bay %d is active." #EN_MM_2_ISSTANDBY | 0x06000302 | I | | "Standby Management Module in bay %d is active." #EN_TCPAPPS_CMD_MODE_DISABLED | 0x00016003 | I | | "TCP Command Mode disabled." #EN_TCPAPPS_CMD_MODE_ENABLED | 0x00016002 | I | | "TCP Command Mode enabled." #EN_TCP_CMDMODE_PORT | 0x00016039 | I | | "TCP Command Mode port has been changed" #EN_TCPAPPS_CMD_MODE_PORT | 0x00016007 | I | | "TCP Command Mode port number changed. New port number: " #EN_PWM_TELNET_INACTIV | 0x00016032 | I | | "Telnet inactivity timeout has been changed" #EN_TELNET_PORT | 0x00016035 | I | | "TELNET port has been changed" #EN_TN_MD_ENABLED | 0x00016057 | I | | "Telnet Protocol has been" #EN_TFTP_PORT | 0x0001603D | I | | "TFTP port has been changed" #EN_TFTP_ENABLED | 0x00016059 | I | | "TFTP server has been" #EN_DELETE_ACCOUNT | 0x0001604F | I | | "The account has been deleted for user " #EN_ACCT_LEGACY_PWD_EXPIRED | 0x00016052 | W | | "The password expired for user " #EN_ACCT_PWD_EXPIRED | 0x00016050 | W | | "The password expired for user " #EN_UNSUPPORTED_EVENT | 0x80000000 | N | R | "Unsupported event, sensor = 0x%02X, SEL: 0x%s." #EN_IPMI_VIDEO_CTRL_FAIL | 0x00216021 | E | | "Video controller failure." #EN_PWM_WEB_INACTIVITY_TIMEOUT | 0x00016031 | I | | "Web inactivity timout has been changed" #EN_WEBS_PORT_ENABLED | 0x00016049 | I | | "Web server port has been" # Events Mapped but not in current list - obsolete?? #EN_AUTO_BIOS_ALERT|0x04000000|SAHPI_MAJOR|OVR_SEV|"Firmware (BIOS) ROM corruption detected" #EN_OVER_TEMP_BEM|0x0621C081|SAHPI_CRITICAL|OVR_SEV,OVR_EXP|"BEM 1 Over Temperature" #EN_PFA_HI_OVER_TEMP_DASD1_2|0x0681C402|SAHPI_MAJOR|OVR_SEV,OVR_RID|"DASD 2 over recommended temperature" #EN_PFA_HI_OVER_TEMP_DASD1_3|0x0681C403|SAHPI_MAJOR|OVR_SEV,OVR_RID|"DASD 3 over recommended temperature" #EN_PFA_HI_OVER_TEMP_DASD1_4|0x0681C404|SAHPI_MAJOR|OVR_SEV,OVR_RID|"DASD 4 over recommended temperature" openhpi-3.6.1/plugins/snmp_bc/snmp_bc_hotswap.c0000644000175100017510000003306512575647274020641 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #include /** * snmp_bc_get_hotswap_state: * @hnd: Handler data pointer. * @rid: Resource ID. * @state: Location to store resource's hotswap state. * * Retrieves a managed hotswap resource's state. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_MANAGED_HOTSWAP. * SA_ERR_HPI_INVALID_RESOURCE - Resource doesn't exist. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT snmp_bc_get_hotswap_state(void *hnd, SaHpiResourceIdT rid, SaHpiHsStateT *state) { struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; struct ResourceInfo *resinfo; SaHpiRptEntryT *rpt; if (!hnd || !state) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } snmp_bc_lock_handler(custom_handle); /* Check if resource exists and has managed hotswap capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP)) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_CAPABILITY); } resinfo = (struct ResourceInfo *)oh_get_resource_data(handle->rptcache, rid); if (!resinfo) { err("No resource data for %s", rpt->ResourceTag.Data); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } /* Set current hot swap state */ *state = resinfo->cur_state; snmp_bc_unlock_handler(custom_handle); return(SA_OK); } /** * snmp_bc_set_hotswap_state: * @hnd: Handler data pointer. * @rid: Resource ID. * @state: Hotswap state to set. * * Sets a managed hotswap resource's state. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_MANAGED_HOTSWAP. * SA_ERR_HPI_INVALID_REQUEST - @state invalid. * SA_ERR_HPI_INVALID_RESOURCE - Resource doesn't exist. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT snmp_bc_set_hotswap_state(void *hnd, SaHpiResourceIdT rid, SaHpiHsStateT state) { struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; struct ResourceInfo *resinfo; SaHpiRptEntryT *rpt; if (!hnd) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } if (NULL == oh_lookup_hsstate(state)) { err("Invalid hotswap state."); return(SA_ERR_HPI_INVALID_REQUEST); } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } snmp_bc_lock_handler(custom_handle); /* Check if resource exists and has managed hotswap capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP)) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_CAPABILITY); } resinfo = (struct ResourceInfo *)oh_get_resource_data(handle->rptcache, rid); if (!resinfo) { err("No resource data for %s", rpt->ResourceTag.Data); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } if (resinfo->cur_state != SAHPI_HS_STATE_INSERTION_PENDING || resinfo->cur_state != SAHPI_HS_STATE_EXTRACTION_PENDING) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_REQUEST); } /* Don't currently support managed hotswap resources that don't have immediate/read-only auto insertion/extraction policies If this type of hardware is supported in the future, need to add: - indicators in resinfo structure for: - auto-insertion timeout not started or cancelled - auto-extraction timeout not started or cancelled - set previous/current hotswap states - generate event for transition to active state */ snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_REQUEST); } /** * snmp_bc_request_hotswap_action: * @hnd: Handler data pointer. * @rid: Resource ID. * @act: Hotswap state to set. * * Sets a managed hotswap resource's insertion or extraction action. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_MANAGED_HOTSWAP. * SA_ERR_HPI_INVALID_REQUEST - @act invalid. * SA_ERR_HPI_INVALID_RESOURCE - Resource doesn't exist. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT snmp_bc_request_hotswap_action(void *hnd, SaHpiResourceIdT rid, SaHpiHsActionT act) { struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; struct ResourceInfo *resinfo; SaHpiRptEntryT *rpt; if (!hnd) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } if (NULL == oh_lookup_hsaction(act)) { err("Invalid hotswap action."); return(SA_ERR_HPI_INVALID_PARAMS); } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } snmp_bc_lock_handler(custom_handle); /* Check if resource exists and has managed hotswap capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP)) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_CAPABILITY); } resinfo = (struct ResourceInfo *)oh_get_resource_data(handle->rptcache, rid); if (!resinfo) { err("No resource data for %s", rpt->ResourceTag.Data); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } /* Issue power-on command for insertion */ if (act == SAHPI_HS_ACTION_INSERTION) { if (resinfo->cur_state == SAHPI_HS_STATE_INACTIVE) { SaErrorT err; err = snmp_bc_set_power_state(hnd, rid, SAHPI_POWER_ON); if (err) { err("%s resource does not support power on", rpt->ResourceTag.Data); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } } else { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_REQUEST); } } /* Issue power-off command for extraction */ if (act == SAHPI_HS_ACTION_EXTRACTION) { if (resinfo->cur_state == SAHPI_HS_STATE_ACTIVE) { SaErrorT err; err = snmp_bc_set_power_state(hnd, rid, SAHPI_POWER_OFF); if (err) { err("%s resource does not support power off", rpt->ResourceTag.Data); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } } else { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_REQUEST); } } snmp_bc_unlock_handler(custom_handle); return(SA_OK); } /** * snmp_bc_get_indicator_state: * @hnd: Handler data pointer. * @rid: Resource ID. * @state: Location to store the hotswap indicator state. * * Gets a managed hotswap resource's hotswap indicator state. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_MANAGED_HOTSWAP. * SA_ERR_HPI_INVALID_RESOURCE - Resource doesn't exist. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT snmp_bc_get_indicator_state(void *hnd, SaHpiResourceIdT rid, SaHpiHsIndicatorStateT *state) { struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; SaHpiRptEntryT *rpt; if (!hnd || !state) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } snmp_bc_lock_handler(custom_handle); /* Check if resource exists and has managed hotswap capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP) || !(rpt->HotSwapCapabilities & SAHPI_HS_CAPABILITY_INDICATOR_SUPPORTED)) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_CAPABILITY); } err("Hotswap indicators are not supported by platform"); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } /** * snmp_bc_set_indicator_state: * @hnd: Handler data pointer. * @rid: Resource ID. * @state: Hotswap indicator state to set. * * Sets a managed hotswap resource's hotswap indicator. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_MANAGED_HOTSWAP. * SA_ERR_HPI_INVALID_REQUEST - @state invalid. * SA_ERR_HPI_INVALID_RESOURCE - Resource doesn't exist. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT snmp_bc_set_indicator_state(void *hnd, SaHpiResourceIdT rid, SaHpiHsIndicatorStateT state) { struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; SaHpiRptEntryT *rpt; if (!hnd) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } if (NULL == oh_lookup_hsindicatorstate(state)) { err("Invalid hotswap indicator state."); return(SA_ERR_HPI_INVALID_PARAMS); } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } snmp_bc_lock_handler(custom_handle); /* Check if resource exists and has managed hotswap capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP) || !(rpt->HotSwapCapabilities & SAHPI_HS_CAPABILITY_INDICATOR_SUPPORTED)) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_CAPABILITY); } err("Hotswap indicators are not supported by platform"); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } /** * snmp_bc_set_autoinsert_timeout: * @hnd: Handler data pointer. * @rid: Resource ID. * @timeout: timeout to set. * * Set hotswap autoinsert timeout. * * Return values: * SA_ERR_HPI_READ_ONLY - Normal case. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT snmp_bc_set_autoinsert_timeout(void *hnd, SaHpiTimeoutT Timeout) { if (!hnd) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } return(SA_ERR_HPI_READ_ONLY); } /** * snmp_bc_get_autoextract_timeout: * @hnd: Handler data pointer. * @rid: Resource ID. * @timeout: Storage for returned timeout value. * * Get a resource's hotswap autoextract timeout. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT snmp_bc_get_autoextract_timeout(void *hnd, SaHpiResourceIdT rid, SaHpiTimeoutT *Timeout) { if (!hnd || !Timeout) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } *Timeout = SAHPI_TIMEOUT_IMMEDIATE; return(SA_OK); } /** * snmp_bc_set_autoextract_timeout: * @hnd: Handler data pointer. * @rid: Resource ID. * @timeout: timeout to set. * * Set a resource hotswap autoextract timeout. * * Return values: * SA_ERR_HPI_READ_ONLY - Normal case. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT snmp_bc_set_autoextract_timeout(void *hnd, SaHpiResourceIdT rid, SaHpiTimeoutT Timeout) { if (!hnd) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } return(SA_ERR_HPI_READ_ONLY); } void * oh_get_hotswap_state (void *, SaHpiResourceIdT, SaHpiHsStateT *) __attribute__ ((weak, alias("snmp_bc_get_hotswap_state"))); void * oh_set_hotswap_state (void *, SaHpiResourceIdT, SaHpiHsStateT) __attribute__ ((weak, alias("snmp_bc_set_hotswap_state"))); void * oh_request_hotswap_action (void *, SaHpiResourceIdT, SaHpiHsActionT) __attribute__ ((weak, alias("snmp_bc_request_hotswap_action"))); void * oh_set_indicator_state (void *, SaHpiResourceIdT, SaHpiHsIndicatorStateT) __attribute__ ((weak, alias("snmp_bc_set_indicator_state"))); void * oh_get_indicator_state (void *, SaHpiResourceIdT, SaHpiHsIndicatorStateT) __attribute__ ((weak, alias("snmp_bc_get_indicator_state"))); void * oh_set_autoinsert_timeout (void *, SaHpiTimeoutT) __attribute__ ((weak, alias("snmp_bc_set_autoinsert_timeout"))); void * oh_get_autoextract_timeout (void *, SaHpiResourceIdT, SaHpiTimeoutT *) __attribute__ ((weak, alias("snmp_bc_get_autoextract_timeout"))); void * oh_set_autoextract_timeout (void *, SaHpiResourceIdT, SaHpiTimeoutT) __attribute__ ((weak, alias("snmp_bc_set_autoextract_timeout"))); openhpi-3.6.1/plugins/snmp_bc/sim_init.h0000644000175100017510000000126112575647274017264 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #ifndef __SIM_INIT_H #define __SIM_INIT_H SaHpiBoolT is_simulator(void); SaErrorT sim_banner(struct snmp_bc_hnd *custom_handle); SaErrorT sim_init(void); SaErrorT sim_close(void); SaErrorT sim_file(void); #endif openhpi-3.6.1/plugins/snmp_bc/snmp_bc_discover.h0000644000175100017510000001045312575647274020773 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #ifndef __SNMP_BC_DISCOVER_H #define __SNMP_BC_DISCOVER_H SaErrorT snmp_bc_discover_resources(void *hnd); SaErrorT snmp_bc_discover(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root); SaErrorT snmp_bc_discover_rsa(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root); SaErrorT snmp_bc_rediscover(struct oh_handler_state *handle, SaHpiEventT *event, LogSource2ResourceT *logsrc2res); SaErrorT snmp_bc_discover_sensors(struct oh_handler_state *handle, struct snmp_bc_sensor *sensor_array, struct oh_event *res_oh_event); SaErrorT snmp_bc_discover_controls(struct oh_handler_state *handle, struct snmp_bc_control *control_array, struct oh_event *res_oh_event); SaErrorT snmp_bc_discover_inventories(struct oh_handler_state *handle, struct snmp_bc_inventory *inventory_array, struct oh_event *res_oh_event); SaErrorT snmp_bc_create_resourcetag(SaHpiTextBufferT *buffer, const char *str, SaHpiEntityLocationT location); SaHpiBoolT rdr_exists(struct snmp_bc_hnd *custom_handle, SaHpiEntityPathT *ep, SaHpiEntityLocationT loc_offset, const gchar *oidstr, unsigned int na, SaHpiBoolT write_only); SaErrorT snmp_bc_validate_ep(SaHpiEntityPathT *org_ep, SaHpiEntityPathT *val_ep); SaErrorT snmp_bc_mod_sensor_ep(SaHpiRdrT *rdrptr, void *sensor_array, int index); SaErrorT snmp_bc_add_ep(SaHpiRdrT *rdrptr, SaHpiEntityPathT *ep_add); SaErrorT snmp_bc_discover_media_tray(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, int media_tray_installed); SaErrorT snmp_bc_discover_filter(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, int filter_installed); SaErrorT snmp_bc_discover_chassis(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root); SaErrorT snmp_bc_discover_blade(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, char *blade_vector); SaErrorT snmp_bc_discover_blowers(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, char *blower_vector); SaErrorT snmp_bc_discover_tap(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, char *tap_vector); SaErrorT snmp_bc_discover_nc(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, char *nc_vector); SaErrorT snmp_bc_discover_mx(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, char *mx_vector); SaErrorT snmp_bc_discover_smi(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, char *smi_vector); SaErrorT snmp_bc_discover_mmi(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, char *mmi_vector); SaErrorT snmp_bc_discover_power_module(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, char *power_module_vector); SaErrorT snmp_bc_discover_switch(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, char *switch_vector); SaErrorT snmp_bc_discover_mm(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, char *mm_vector, SaHpiBoolT global_discovery); SaErrorT snmp_bc_update_chassis_topo(struct oh_handler_state *handle); SaErrorT snmp_bc_discover_all_slots(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root); SaErrorT snmp_bc_discover_slot(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, SaHpiEntityTypeT entitytype, guint entitylocation); SaErrorT snmp_bc_discover_blade_expansion(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, guint blade_index); SaErrorT snmp_bc_add_blade_expansion_resource(struct oh_handler_state *handle, SaHpiEntityPathT *ep, guint blade_index, BCExpansionTypeT expansionType, guint expansionindex); #endif openhpi-3.6.1/plugins/snmp_bc/snmp_bc_annunciator.h0000644000175100017510000000324312575647274021475 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #ifndef __SNMP_BC_ANNUNCIATOR_H #define __SNMP_BC_ANNUNCIATOR_H SaErrorT snmp_bc_get_next_announce(void *hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT aid, SaHpiSeverityT sev, SaHpiBoolT unackonly, SaHpiAnnouncementT *announcement); SaErrorT snmp_bc_get_announce(void *hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT aid, SaHpiEntryIdT entry, SaHpiAnnouncementT *announcement); SaErrorT snmp_bc_ack_announce(void *hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT aid, SaHpiEntryIdT entry, SaHpiSeverityT sev); SaErrorT snmp_bc_add_announce(void *hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT aid, SaHpiAnnouncementT *announcement); SaErrorT snmp_bc_del_announce(void *hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT aid, SaHpiEntryIdT entry, SaHpiSeverityT sev); SaErrorT snmp_bc_get_annunc_mode(void *hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT aid, SaHpiAnnunciatorModeT *mode); SaErrorT snmp_bc_set_annunc_mode(void *hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT aid, SaHpiAnnunciatorModeT mode); #endif openhpi-3.6.1/plugins/snmp_bc/snmp_bc_inventory.c0000644000175100017510000006107012575647274021206 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter Phan * Renier Morales */ #include static SaErrorT snmp_bc_build_idr( void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, struct bc_inventory_record *i_record); static SaErrorT snmp_bc_idr_build_field(struct snmp_bc_hnd *custom_handle, SaHpiEntityPathT *ep, const gchar *oidstr, SaHpiIdrFieldT *thisField, struct bc_idr_area *thisInventoryArea); static SaErrorT snmp_bc_build_area( void *hnd, struct InventoryMibInfo *thisMib, struct bc_idr_area *thisInventoryArea, SaHpiIdrFieldT *thisField, SaHpiEntityPathT *valEntity); /************************************************************************/ /* Inventory functions */ /************************************************************************/ /** * vpd_exists: * @thisMib: Pointer to resource VPD structure * * Verify at least one of the OIDs in VPD structure is defined. * * Return value: * SAHPI_FALSE - None of the OIDs in the VPD structure is defined. * SAHPI_TRUE - At lease one on the OIDs in VPD structure is defined. **/ SaHpiBoolT vpd_exists(struct InventoryMibInfo *thisMib) { if ( (thisMib->oid.OidChassisType == NULL) && (thisMib->oid.OidMfgDateTime == NULL) && (thisMib->oid.OidManufacturer == NULL) && (thisMib->oid.OidProductName == NULL) && (thisMib->oid.OidProductVersion == NULL) && (thisMib->oid.OidSerialNumber == NULL) && (thisMib->oid.OidPartNumber == NULL) && (thisMib->oid.OidFileId == NULL) && (thisMib->oid.OidAssetTag == NULL) ) return(SAHPI_FALSE); else return(SAHPI_TRUE); } /** * snmp_bc_get_idr_info: * @hnd: Pointer to handler's data * @ResourceId: Resource identifier for this operation * @IdrId: Identifier for the Inventory Data Repository * @IdrInfo: Pointer to the information describing the requested Inventory Data Repository * * Build the Inventory Data Record for the inputed resource id, idr id. * Copy the IdrInfo found for the input resource id and idr id * * Return value: * SA_OK - Normal * SA_ERR_HPI_INVALID_PARAMS - NULL input pointers, hnd or IdrInfo * SA_ERR_HPI_NOT_PRESENT - If can not find idr with matched requested IdrId **/ SaErrorT snmp_bc_get_idr_info( void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, SaHpiIdrInfoT *IdrInfo) { SaErrorT rv; struct bc_inventory_record *i_record; struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; if (!hnd || !IdrInfo) return(SA_ERR_HPI_INVALID_PARAMS); rv = SA_OK; handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; i_record = (struct bc_inventory_record *)g_malloc0(sizeof(struct bc_inventory_record)); if (!i_record) { err("Cannot allocate memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } snmp_bc_lock_handler(custom_handle); rv = snmp_bc_build_idr(hnd, ResourceId, IdrId, i_record); if (rv == SA_OK) { if (IdrId == i_record->idrinfo.IdrId) memcpy(IdrInfo, &(i_record->idrinfo), sizeof(SaHpiIdrInfoT)); else rv = SA_ERR_HPI_NOT_PRESENT; } g_free(i_record); snmp_bc_unlock_handler(custom_handle); return rv; } /** * snmp_bc_get_idr_area_header: * @hnd: Pointer to handler's data * @ResourceId: Resource identifier for this operation * @IdrId: Identifier for the Inventory Data Repository * @AreaType: Type of Inventory Data Area * @AreaId: Identifier of Area entry to retrieve from the IDR * @NextAreaId: Pointer to location to store the AreaId of the next area * of the requested type within the IDR * @Header: Pointer to Inventory Data Area Header into which the header information is placed * * Build the Inventory Data Record for the inputed resource id, idr id. * Copy the Inventory Data Area Header to the space provided by user. * * Internal code makes an assumption that there is only one (1) Idr per * resource in snmp_bc plugin. For this to be expanded to more than one * Idr per resource, the base bc_resources.c/h has to be changed together * with the rest of inventory code. * * Return value: * SA_OK - Normal * SA_ERR_HPI_INVALID_PARAMS - NULL input pointers, hnd or NextAreaId or Header * SA_ERR_HPI_OUT_OF_MEMORY - If can not allocate temp work space * SA_ERR_HPI_NOT_PRESENT - If can not find idr area with matched requested AreaId **/ SaErrorT snmp_bc_get_idr_area_header( void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, SaHpiIdrAreaTypeT AreaType, SaHpiEntryIdT AreaId, SaHpiEntryIdT *NextAreaId, SaHpiIdrAreaHeaderT *Header) { SaErrorT rv; gint index, foundit; struct bc_inventory_record *i_record; struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; if (!hnd || !NextAreaId || !Header) return(SA_ERR_HPI_INVALID_PARAMS); rv = SA_OK; handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; i_record = (struct bc_inventory_record *)g_malloc0(sizeof(struct bc_inventory_record)); if (!i_record) { err("Cannot allocate memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } snmp_bc_lock_handler(custom_handle); rv = snmp_bc_build_idr(hnd, ResourceId, IdrId, i_record); if (rv == SA_OK) { rv = SA_ERR_HPI_NOT_PRESENT; foundit = 0; if (IdrId == i_record->idrinfo.IdrId) { for (index = 0; index < i_record->idrinfo.NumAreas; index++) { if ( (i_record->area[index].idrareas.Type == AreaType) || (SAHPI_IDR_AREATYPE_UNSPECIFIED == AreaType) ) { if ( (i_record->area[index].idrareas.AreaId == AreaId) || (SAHPI_FIRST_ENTRY == AreaId) ) { memcpy(Header, &(i_record->area[index].idrareas), sizeof(SaHpiIdrAreaHeaderT)); foundit = 1; } *NextAreaId = SAHPI_LAST_ENTRY; if (foundit) { if (index < (i_record->idrinfo.NumAreas -1)) *NextAreaId = i_record->area[index+1].idrareas.AreaId; rv = SA_OK; break; } } } } } g_free(i_record); snmp_bc_unlock_handler(custom_handle); return (rv); } /** * snmp_bc_add_idr_area: * @hnd: Pointer to handler's data * @ResourceId: Resource identifier for this operation * @IdrId: Identifier for the Inventory Data Repository * @AreaType: Type of Inventory Data Area * @AreaId: Pointer to store the identifier of the newly allocated Inventory Area * * This function is not suported/implemented for snmp_bc plugin * * Return value: * SA_ERR_HPI_READ_ONLY - Normal - snmp_bc does not allow Inventory Update **/ SaErrorT snmp_bc_add_idr_area( void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, SaHpiIdrAreaTypeT AreaType, SaHpiEntryIdT *AreaId) { return SA_ERR_HPI_READ_ONLY; } /** * snmp_bc_del_idr_area: * @hnd: Pointer to handler's data * @ResourceId: Resource identifier for this operation * @IdrId: Identifier for the Inventory Data Repository * @AreaId: Identifier of Area entry to delete from the IDR * * This function is not suported/implemented for snmp_bc plugin * * Return value: * SA_ERR_HPI_READ_ONLY - Normal - snmp_bc does not allow Inventory Update **/ SaErrorT snmp_bc_del_idr_area( void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, SaHpiEntryIdT AreaId) { return SA_ERR_HPI_READ_ONLY; } /** * snmp_bc_get_idr_field: * @hnd: Pointer to handler's data * @ResourceId: Resource identifier for this operation * @IdrId: Identifier for the Inventory Data Repository * @AreaId: Identifier of Area for the IDA * @FieldType: Type of Inventory Data Field * @FieldId: Identier of Field to retrieve from the IDA * @NextFieldId: Pointer to location to store the FieldId * of the next field of the requested type in IDA * @Field: Pointer to Inventory Data Field into which the field information will be placed. * * Return value: * SA_OK - Normal * SA_ERR_HPI_INVALID_PARAMS - NULL input pointers, hnd or IdrInfo * SA_ERR_HPI_NOT_PRESENT - If can not find requested field **/ SaErrorT snmp_bc_get_idr_field( void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, SaHpiEntryIdT AreaId, SaHpiIdrFieldTypeT FieldType, SaHpiEntryIdT FieldId, SaHpiEntryIdT *NextFieldId, SaHpiIdrFieldT *Field) { SaErrorT rv = SA_OK; struct bc_inventory_record *i_record; gint i; gint index; SaHpiBoolT foundit = SAHPI_FALSE; struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; if (!hnd || !NextFieldId || !Field) return(SA_ERR_HPI_INVALID_PARAMS); rv = SA_OK; handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; i_record = (struct bc_inventory_record *)g_malloc0(sizeof(struct bc_inventory_record)); if (!i_record) { err("Cannot allocate memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } snmp_bc_lock_handler(custom_handle); rv = snmp_bc_build_idr(hnd, ResourceId, IdrId, i_record); if (rv == SA_OK) { rv = SA_ERR_HPI_NOT_PRESENT; for (index = 0; index < i_record->idrinfo.NumAreas; index++) { if (i_record->area[index].idrareas.AreaId == AreaId) { /* Search for fieldId here */ for (i=0; i < i_record->area[index].idrareas.NumFields; i++) { if ( ((i_record->area[index].field[i].FieldId == FieldId) || (SAHPI_FIRST_ENTRY == FieldId)) && ((i_record->area[index].field[i].Type == FieldType) || (SAHPI_IDR_FIELDTYPE_UNSPECIFIED == FieldType)) ) { memcpy(Field, &(i_record->area[index].field[i]), sizeof(SaHpiIdrFieldT)); foundit = SAHPI_TRUE; rv = SA_OK; break; } } *NextFieldId = SAHPI_LAST_ENTRY; i++; if (foundit) { if (i < i_record->area[index].idrareas.NumFields) { do { if ((i_record->area[index].field[i].Type == FieldType) || (SAHPI_IDR_FIELDTYPE_UNSPECIFIED == FieldType)) { *NextFieldId = i_record->area[index].field[i].FieldId; break; } i++; } while (i < i_record->area[index].idrareas.NumFields); } } } } } g_free(i_record); snmp_bc_unlock_handler(custom_handle); return rv; } /** * snmp_bc_add_idr_field: * @hnd: Pointer to handler's data * @ResourceId: Resource identifier for this operation * @IdrId: Identifier for the Inventory Data Repository * @Field: Pointer to Inventory Data Field which contains field information to be added. * * This function is not suported/implemented for snmp_bc plugin * * Return value: * SA_ERR_HPI_READ_ONLY - Normal - snmp_bc does not allow Inventory Update **/ SaErrorT snmp_bc_add_idr_field( void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, SaHpiIdrFieldT *Field) { return SA_ERR_HPI_READ_ONLY; } /** * snmp_bc_set_idr_field: * @hnd: Pointer to handler's data * @ResourceId: Resource identifier for this operation * @IdrId: Identifier for the Inventory Data Repository * @Field: Pointer to Inventory Data Field which contains updated field information. * * This function is not suported/implemented for snmp_bc plugin * * Return value: * SA_ERR_HPI_READ_ONLY - Normal - snmp_bc does not allow Inventory Update **/ SaErrorT snmp_bc_set_idr_field( void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, SaHpiIdrFieldT *Field) { return SA_ERR_HPI_READ_ONLY; } /** * snmp_bc_del_idr_field: * @hnd: Pointer to handler's data * @ResourceId: Resource identifier for this operation * @IdrId: Identifier for the Inventory Data Repository * @AreaId: Identifier of Inventory Area whose field is to bo deleted * @FieldId: Identifier of field to be deleted * * This function is not suported/implemented for snmp_bc plugin * * Return value: * SA_ERR_HPI_READ_ONLY - Normal - snmp_bc does not allow Inventory Update **/ SaErrorT snmp_bc_del_idr_field( void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, SaHpiEntryIdT AreaId, SaHpiEntryIdT FieldId) { return SA_ERR_HPI_READ_ONLY; } /** * snmp_bc_build_area: * @hnd: Pointer to handler's data * @thisMib: VPD mib structure to be built * @thisInventoryArea: Pointer into inventory area is stored * @thisField: Pointer into which individual inventory field is stored * @valEntity: Pointer to this resource EntityPath * * Build the complete Inventory Record for the resource identifier * * Return value: * SA_OK - Normal * SA_ERR_HPI_INVALID_PARAMS - If any in pointer is NULL * SA_ERR_HPI_NOT_PRESENT - If Inventory RDR is not found in rptcache **/ static SaErrorT snmp_bc_build_area( void *hnd, struct InventoryMibInfo *thisMib, struct bc_idr_area *thisInventoryArea, SaHpiIdrFieldT *thisField, SaHpiEntityPathT *valEntity) { SaErrorT rv; struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; struct snmp_value get_value; handle = (struct oh_handler_state *) hnd; custom_handle = handle->data; thisInventoryArea->idrareas.Type = thisMib->area_type; thisInventoryArea->idrareas.ReadOnly = SAHPI_TRUE; thisInventoryArea->idrareas.NumFields = 0; /* Increment it as we find field */ thisField->AreaId = thisInventoryArea->idrareas.AreaId; thisField->ReadOnly = SAHPI_TRUE; thisField->Field.Language = SAHPI_LANG_ENGLISH; /* SaHpiLanguageT */ /** * **/ thisField->FieldId = 1; thisField->Type = SAHPI_IDR_FIELDTYPE_CHASSIS_TYPE; if(thisMib->oid.OidChassisType != NULL) { rv = snmp_bc_idr_build_field(custom_handle, valEntity, thisMib->oid.OidChassisType, thisField, thisInventoryArea); if (rv != SA_OK) err("Cannot build Chassis Idr Field, continue to next field."); } /** * **/ memset(thisField->Field.Data, 0, SAHPI_MAX_TEXT_BUFFER_LENGTH); thisField->FieldId = 2; thisField->Type = SAHPI_IDR_FIELDTYPE_MFG_DATETIME; thisField->Field.DataLength = 0; /* SaHpiUint8T */ if(thisMib->oid.OidMfgDateTime == NULL){ thisField->Field.DataLength = sizeof("SAHPI_TIME_UNSPECIFIED"); /* SaHpiUint8T */ thisField->Field.DataType = SAHPI_TL_TYPE_TEXT; /* SaHpiTextTypeT */ strncpy((char *)thisField->Field.Data,"SAHPI_TIME_UNSPECIFIED", sizeof("SAHPI_TIME_UNSPECIFIED")); } else { rv = snmp_bc_oid_snmp_get(custom_handle, valEntity, 0, thisMib->oid.OidMfgDateTime, &get_value, SAHPI_TRUE); if(rv != SA_OK) { err("SNMP could not read %s; Type=%d.", thisMib->oid.OidMfgDateTime, get_value.type); return rv; } else if((rv == SA_OK) && (get_value.type == ASN_OCTET_STR )) { thisField->Field.DataLength = get_value.str_len; thisField->Field.DataType = SAHPI_TL_TYPE_TEXT; memcpy(thisField->Field.Data, get_value.string, get_value.str_len); } else err("%s Invalid type for MfgDateTime inventory data", thisMib->oid.OidMfgDateTime); } /** * **/ if (thisField->Field.DataLength != 0) { memcpy(&thisInventoryArea->field[thisInventoryArea->idrareas.NumFields], thisField, sizeof(SaHpiIdrFieldT)); thisInventoryArea->idrareas.NumFields++; } thisField->FieldId = 3; thisField->Type = SAHPI_IDR_FIELDTYPE_MANUFACTURER; if(thisMib->oid.OidManufacturer != NULL) { rv = snmp_bc_idr_build_field(custom_handle, valEntity, thisMib->oid.OidManufacturer, thisField, thisInventoryArea); if (rv != SA_OK) err("Cannot build ManufacturerId Idr Field, continue to next field."); } /** * **/ thisField->FieldId = 4; thisField->Type = SAHPI_IDR_FIELDTYPE_PRODUCT_NAME; if(thisMib->oid.OidProductName != NULL) { rv = snmp_bc_idr_build_field(custom_handle, valEntity, thisMib->oid.OidProductName, thisField, thisInventoryArea); if (rv != SA_OK) err("Cannot build ProductName Idr Field, continue to next field."); } /** * **/ thisField->FieldId = 5; thisField->Type = SAHPI_IDR_FIELDTYPE_PRODUCT_VERSION; if(thisMib->oid.OidProductVersion != NULL) { rv = snmp_bc_idr_build_field(custom_handle, valEntity, thisMib->oid.OidProductVersion, thisField, thisInventoryArea); if (rv != SA_OK) err("Cannot build ProductVersion Idr Field, continue to next field."); } /** * **/ thisField->FieldId = 6; thisField->Type = SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER; if(thisMib->oid.OidSerialNumber != NULL) { rv = snmp_bc_idr_build_field(custom_handle, valEntity, thisMib->oid.OidSerialNumber, thisField, thisInventoryArea); if (rv != SA_OK) err("Cannot build SerialNumber Idr Field, continue to next field."); } /** * **/ thisField->FieldId = 7; thisField->Type = SAHPI_IDR_FIELDTYPE_PART_NUMBER; if(thisMib->oid.OidPartNumber != NULL) { rv = snmp_bc_idr_build_field(custom_handle, valEntity, thisMib->oid.OidPartNumber, thisField, thisInventoryArea); if (rv != SA_OK) err("Cannot build PartNumber Idr Field, continue to next field."); } /** * **/ thisField->FieldId = 8; thisField->Type = SAHPI_IDR_FIELDTYPE_FILE_ID; if(thisMib->oid.OidFileId != NULL) { rv = snmp_bc_idr_build_field(custom_handle, valEntity, thisMib->oid.OidFileId, thisField, thisInventoryArea); if (rv != SA_OK) err("Cannot build FileID Idr Field, continue to next field."); } /** * **/ thisField->FieldId = 9; thisField->Type = SAHPI_IDR_FIELDTYPE_ASSET_TAG; if(thisMib->oid.OidAssetTag != NULL) { rv = snmp_bc_idr_build_field(custom_handle, valEntity, thisMib->oid.OidAssetTag, thisField, thisInventoryArea); if (rv != SA_OK) printf("Cannot build AssetTag Idr Field, continue ..."); } /** * **/ return(SA_OK); } /** * snmp_bc_build_idr: * @hnd: Pointer to handler's data * @ResourceId: Resource identifier for this operation * @IdrId: Identifier for the Inventory Data Repository * @i_record: Pointer into which inventory data is stored * * Build the complete Inventory Record for the resource identifier * * Return value: * SA_OK - Normal * SA_ERR_HPI_INVALID_PARAMS - If any in pointer is NULL * SA_ERR_HPI_NOT_PRESENT - If Inventory RDR is not found in rptcache **/ static SaErrorT snmp_bc_build_idr( void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, struct bc_inventory_record *i_record) { SaErrorT rv; struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; SaHpiRdrT *rdr; SaHpiEntityPathT valEntity; //struct snmp_value get_value; /* Local work spaces */ SaHpiIdrFieldT thisField; struct bc_idr_area thisInventoryArea; if (!hnd || !i_record) return(SA_ERR_HPI_INVALID_PARAMS); rv = SA_OK; handle = (struct oh_handler_state *) hnd; custom_handle = handle->data; rdr = oh_get_rdr_by_type(handle->rptcache, ResourceId, SAHPI_INVENTORY_RDR, IdrId); if (rdr != NULL) { struct InventoryInfo *s = (struct InventoryInfo *)oh_get_rdr_data(handle->rptcache, ResourceId, rdr->RecordId); rv = snmp_bc_validate_ep(&(rdr->Entity), &valEntity); i_record->idrinfo.IdrId = IdrId; i_record->idrinfo.UpdateCount = 0; i_record->idrinfo.ReadOnly = SAHPI_TRUE; i_record->idrinfo.NumAreas = 0; /* Build hardware vpd area */ if (vpd_exists(&s->hardware_mib) ) { i_record->idrinfo.NumAreas++; memset(&thisField, '\0', sizeof(SaHpiIdrFieldT)); memset(&thisInventoryArea, '\0', sizeof(struct bc_idr_area)); thisInventoryArea.idrareas.AreaId = i_record->idrinfo.NumAreas; rv = snmp_bc_build_area( hnd, &s->hardware_mib, &thisInventoryArea, &thisField, &valEntity); memcpy( &(i_record->area[i_record->idrinfo.NumAreas - 1]), &thisInventoryArea, sizeof(struct bc_idr_area)); } /* Build firmware vpd area */ if (vpd_exists(&s->firmware_mib) ) { i_record->idrinfo.NumAreas++; memset(&thisField, '\0', sizeof(SaHpiIdrFieldT)); memset(&thisInventoryArea, '\0', sizeof(struct bc_idr_area)); thisInventoryArea.idrareas.AreaId = i_record->idrinfo.NumAreas; rv = snmp_bc_build_area( hnd, &s->firmware_mib, &thisInventoryArea, &thisField, &valEntity); memcpy( &(i_record->area[i_record->idrinfo.NumAreas - 1]), &thisInventoryArea, sizeof(struct bc_idr_area)); } rv = SA_OK; } else { rv = SA_ERR_HPI_NOT_PRESENT; } return rv; } /** * snmp_bc_idr_build_field: * @custom_handle: snmp_bc custom handler data * @oid: SNMP Object Id of the BC Inventory object * @thisField: Pointer to Inventory Field under construction * @thisInventoryArea: Pointer to Inventory Record under contruction * * Get data from target snmp agent for the corresponding oid. * Construct IDR Field for the retrieved data and place in Inventory Record * * Return value: * SA_OK - Normal * SA_ERR_HPI_INVALID_PARAMS - If any in pointer is NULL * SA_ERR_HPI_INTERNAL_ERROR - If can not process get_value.type from bc snmp agent **/ static SaErrorT snmp_bc_idr_build_field(struct snmp_bc_hnd *custom_handle, SaHpiEntityPathT *ep, const gchar *oidstr, SaHpiIdrFieldT *thisField, struct bc_idr_area *thisInventoryArea) { struct snmp_value get_value; SaErrorT rv; if (!custom_handle || !thisField || !thisInventoryArea) return(SA_ERR_HPI_INVALID_PARAMS); rv = SA_OK; memset(thisField->Field.Data, 0, SAHPI_MAX_TEXT_BUFFER_LENGTH); thisField->Field.DataLength = 0; /* SaHpiUint8T */ rv = snmp_bc_oid_snmp_get(custom_handle, ep, 0, oidstr, &get_value, SAHPI_TRUE); if(rv != SA_OK) { err("SNMP could not read %s; Type=%d.", oidstr, get_value.type); return(rv); } else { if( get_value.type == ASN_OCTET_STR ) { thisField->Field.DataLength = get_value.str_len; thisField->Field.DataType = SAHPI_TL_TYPE_TEXT; memcpy(thisField->Field.Data, get_value.string, get_value.str_len); } else if ( get_value.type == ASN_INTEGER ){ thisField->Field.DataLength = sizeof(long); thisField->Field.DataType = SAHPI_TL_TYPE_TEXT; snprintf((char *)thisField->Field.Data, SAHPI_MAX_TEXT_BUFFER_LENGTH, "%ld",get_value.integer ); } else err("%s Invalid data type for Chassis data", oidstr); } if (thisField->Field.DataLength != 0) { memcpy(&thisInventoryArea->field[thisInventoryArea->idrareas.NumFields], thisField, sizeof(SaHpiIdrFieldT)); thisInventoryArea->idrareas.NumFields++; } return(SA_OK); } void * oh_get_idr_info (void *hnd, SaHpiResourceIdT, SaHpiIdrIdT,SaHpiIdrInfoT) __attribute__ ((weak, alias("snmp_bc_get_idr_info"))); void * oh_get_idr_area_header (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrAreaTypeT, SaHpiEntryIdT, SaHpiEntryIdT, SaHpiIdrAreaHeaderT) __attribute__ ((weak, alias("snmp_bc_get_idr_area_header"))); void * oh_add_idr_area (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrAreaTypeT, SaHpiEntryIdT) __attribute__ ((weak, alias("snmp_bc_add_idr_area"))); void * oh_del_idr_area (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT) __attribute__ ((weak, alias("snmp_bc_del_idr_field"))); void * oh_get_idr_field (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT, SaHpiIdrFieldTypeT, SaHpiEntryIdT, SaHpiEntryIdT, SaHpiIdrFieldT) __attribute__ ((weak, alias("snmp_bc_get_idr_field"))); void * oh_add_idr_field (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrFieldT) __attribute__ ((weak, alias("snmp_bc_add_idr_field"))); void * oh_set_idr_field (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrFieldT) __attribute__ ((weak, alias("snmp_bc_set_idr_field"))); void * oh_del_idr_field (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT, SaHpiEntryIdT) __attribute__ ((weak, alias("snmp_bc_del_idr_field"))); openhpi-3.6.1/plugins/snmp_bc/snmp_bc_el.h0000644000175100017510000000161412575647274017554 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ #ifndef __EL_H #define __EL_H #define LOG_LOGIN_STRING "Login ID:" #define LOG_POST_STRING "(POST Status:" #define EVT_RECOVERY "Recovery " #define LOG_THRESHOLD_VALUE_STRING "Threshold value" #define LOG_THRESHOLD_STRING "Threshold:" #define EVT_EN_LOG_FULL "System error log full" #define ER_STR_POST_LOG_CLEARED "System log cleared." #define LOG_READ_VALUE_STRING "Read value" #define LOG_READ_STRING "Reading:" #define LOG_LOGIN_CHAR "'" #define LOG_DISCOVERING "Discovering" #endif openhpi-3.6.1/plugins/snmp_bc/snmp_bc_event.c0000644000175100017510000015601212575647274020273 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #include #include #include #include #include #include static SaErrorT snmp_bc_parse_threshold_str(gchar *str, gchar *root_str, SaHpiTextBufferT *read_value_str, SaHpiTextBufferT *trigger_value_str); static SaErrorT snmp_bc_logsrc2rid(struct oh_handler_state *handle, gchar *src, LogSource2ResourceT *logsrc2res, unsigned long long ovr_flags); static SaErrorT snmp_bc_set_cur_prev_event_states(struct oh_handler_state *handle, EventMapInfoT *eventmap_info, SaHpiEventT *event, int recovery_event); static SaErrorT snmp_bc_set_event_severity(struct oh_handler_state *handle, EventMapInfoT *eventmap_info, SaHpiEventT *event, SaHpiSeverityT *event_severity); static SaErrorT snmp_bc_map2oem(SaHpiEventT *event, sel_entry *sel_entry, OEMReasonCodeT reason); static ErrLog2EventInfoT *snmp_bc_findevent4dupstr(gchar *search_str, ErrLog2EventInfoT *dupstrhash_data, LogSource2ResourceT *logsrc2res); /** * event2hpi_hash_init: * @handle: Pointer to handler's data. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) or event2hpi_hash_ptr are NULL. * SA_ERR_HPI_OUT_OF_MEMORY - Can not malloc space **/ SaErrorT event2hpi_hash_init(struct oh_handler_state *handle) { struct snmp_bc_hnd *custom_handle; if (!handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle->event2hpi_hash_ptr = g_hash_table_new(g_str_hash, g_str_equal); if (custom_handle->event2hpi_hash_ptr == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } return(SA_OK); } /** * free_hash_data: * @key * @value * @user_data * * Return values: none **/ static void free_hash_data(gpointer key, gpointer value, gpointer user_data) { g_free(key); /* Memory was created for these during normalization process */ g_free(value); } /** * event2hpi_hash_free: * @handle: Pointer to handler's data. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) or event2hpi_hash_ptr are NULL. **/ SaErrorT event2hpi_hash_free(struct oh_handler_state *handle) { struct snmp_bc_hnd *custom_handle; if (!handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } if (custom_handle->event2hpi_hash_ptr != NULL) { g_hash_table_foreach(custom_handle->event2hpi_hash_ptr, free_hash_data, NULL); g_hash_table_destroy(custom_handle->event2hpi_hash_ptr); } return(SA_OK); } /** * snmp_bc_discover_res_events: * @handle: Pointer to handler's data. * @ep: Pointer to resource's entity path. * @resinfo: Pointer to a resource's event mapping information. * * Discovers a resource's events and records the static mapping * information needed to translate BladeCenter event log messages * into HPI event types. It is assumed that all resource events are * hot swap events. * * Mapping information is stored in the hash table - event2hpi_hash. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) or event2hpi_hash_ptr are NULL. **/ SaErrorT snmp_bc_discover_res_events(struct oh_handler_state *handle, SaHpiEntityPathT *ep, const struct ResourceInfo *resinfo) { int i; int max; char *normalized_str; char *hash_existing_key, *hash_value; EventMapInfoT *eventmap_info; SaHpiResourceIdT rid; struct snmp_bc_hnd *custom_handle; if (!handle || !ep || !resinfo) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle || !custom_handle->event2hpi_hash_ptr) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } rid = oh_uid_lookup(ep); if (rid == 0) { err("No RID."); return(SA_ERR_HPI_INTERNAL_ERROR); } max = SNMP_BC_MAX_RESOURCE_EVENT_ARRAY_SIZE; for (i=0; resinfo->event_array[i].event != NULL && i < max; i++) { /* Normalized and convert event string */ normalized_str = oh_derive_string(ep, 0, 16, resinfo->event_array[i].event); if (normalized_str == NULL) { err("Cannot derive %s.", resinfo->event_array[i].event); return(SA_ERR_HPI_INTERNAL_ERROR); } /* Add to hash; Set HPI values */ if (!g_hash_table_lookup_extended(custom_handle->event2hpi_hash_ptr, normalized_str, (gpointer)&hash_existing_key, (gpointer)&hash_value)) { eventmap_info = g_malloc0(sizeof(EventMapInfoT)); if (!eventmap_info) { err("Out of memory."); g_free(normalized_str); return(SA_ERR_HPI_OUT_OF_MEMORY); } eventmap_info->hpievent.Source = rid; eventmap_info->ep = *ep; eventmap_info->hpievent.EventType = SAHPI_ET_HOTSWAP; eventmap_info->hpievent.EventDataUnion.HotSwapEvent.HotSwapState = resinfo->event_array[i].event_state; eventmap_info->hs_event_auto_state = resinfo->event_array[i].event_auto_state; eventmap_info->hs_recovery_state = resinfo->event_array[i].recovery_state; eventmap_info->hs_recovery_auto_state = resinfo->event_array[i].recovery_auto_state; eventmap_info->event_res_failure = resinfo->event_array[i].event_res_failure; eventmap_info->event_res_failure_unexpected = resinfo->event_array[i].event_res_failure_unexpected; dbg("Discovered resource event=%s.", normalized_str); g_hash_table_insert(custom_handle->event2hpi_hash_ptr, normalized_str, eventmap_info); /* normalized_str space is recovered when hash is freed */ } else { /* Event already exists (e.g. same event for multiple blades) */ dbg("Event already exists=%s.", normalized_str); g_free(normalized_str); } } return(SA_OK); } /** * snmp_bc_discover_sensor_events: * @handle: Pointer to handler's data. * @ep: Pointer to parent resource's entity path. * @sid: Sensor ID. * @sinfo: Pointer to a sensor's event mapping information. * * Discovers a sensor's events and records the static mapping * information needed to translate BladeCenter event log messages * into HPI event types. * * Mapping information is stored in the hash table - event2hpi_hash. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL; sid <= 0. **/ SaErrorT snmp_bc_discover_sensor_events(struct oh_handler_state *handle, SaHpiEntityPathT *ep, SaHpiSensorNumT sid, const struct snmp_bc_sensor *sinfo) { int i; int max = SNMP_BC_MAX_SENSOR_EVENT_ARRAY_SIZE; char *normalized_str; char *hash_existing_key, *hash_value; EventMapInfoT *eventmap_info; SaHpiResourceIdT rid; struct snmp_bc_hnd *custom_handle; if (!handle || !ep || !sinfo || sid <= 0) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } max = SNMP_BC_MAX_SENSOR_EVENT_ARRAY_SIZE; custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle || !custom_handle->event2hpi_hash_ptr) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } rid = oh_uid_lookup(ep); if (rid == 0) { err("No RID."); return(SA_ERR_HPI_INTERNAL_ERROR); } for (i=0; sinfo->sensor_info.event_array[i].event != NULL && i < max; i++) { /* Normalized and convert event string */ normalized_str = oh_derive_string(ep, 0, 16, sinfo->sensor_info.event_array[i].event); if (normalized_str == NULL) { err("Cannot derive %s.", sinfo->sensor_info.event_array[i].event); return(SA_ERR_HPI_INTERNAL_ERROR); } /* Add to hash; Set HPI values */ if (!g_hash_table_lookup_extended(custom_handle->event2hpi_hash_ptr, normalized_str, (gpointer)&hash_existing_key, (gpointer)&hash_value)) { eventmap_info = g_malloc0(sizeof(EventMapInfoT)); if (!eventmap_info) { err("Out of memory."); g_free(normalized_str); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* Set default values */ eventmap_info->hpievent.Source = rid; eventmap_info->hpievent.EventType = SAHPI_ET_SENSOR; eventmap_info->hpievent.EventDataUnion.SensorEvent.SensorNum = sid; eventmap_info->hpievent.EventDataUnion.SensorEvent.SensorType = sinfo->sensor.Type; eventmap_info->hpievent.EventDataUnion.SensorEvent.EventCategory = sinfo->sensor.Category; eventmap_info->hpievent.EventDataUnion.SensorEvent.Assertion = sinfo->sensor_info.event_array[i].event_assertion; eventmap_info->hpievent.EventDataUnion.SensorEvent.EventState = eventmap_info->hpievent.EventDataUnion.SensorEvent.CurrentState = sinfo->sensor_info.event_array[i].event_state; eventmap_info->sensor_recovery_state = sinfo->sensor_info.event_array[i].recovery_state; eventmap_info->event_res_failure = sinfo->sensor_info.event_array[i].event_res_failure; eventmap_info->event_res_failure_unexpected = sinfo->sensor_info.event_array[i].event_res_failure_unexpected; /* Setup static trigger info for threshold sensors - some may be event-only */ if (sinfo->sensor.Category == SAHPI_EC_THRESHOLD) { eventmap_info->hpievent.EventDataUnion.SensorEvent.TriggerReading.IsSupported = eventmap_info->hpievent.EventDataUnion.SensorEvent.TriggerThreshold.IsSupported = SAHPI_TRUE; eventmap_info->hpievent.EventDataUnion.SensorEvent.TriggerReading.Type = eventmap_info->hpievent.EventDataUnion.SensorEvent.TriggerThreshold.Type = sinfo->sensor.DataFormat.ReadingType; } dbg("Discovered sensor event=%s.", normalized_str); g_hash_table_insert(custom_handle->event2hpi_hash_ptr, normalized_str, eventmap_info); /* normalized_str space is recovered when hash is freed */ } else { /* Event already exists (e.g. same event for multiple blades) */ dbg("Event already exists=%s.", normalized_str); g_free(normalized_str); } } return(SA_OK); } /** * snmp_bc_log2event: * @handle: Pointer to handler's data. * @logstr: BladeCenter event log string to be mapped to an HPI event. * @event: Location to store mapped HPI event. * @isdst: Is Daylight Savings Time on or off. * * Maps BladeCenter event log messages to HPI events. * * @isdst ("is DayLight Savings Time") parameter is a performance hack. * Design assumes the event's timestamp is the time local to the platform itself. * So instead of forcing platform accesses for each log entry to determine if * DST is in effect, the isdst parameter allows the caller to query the * hardware DST info once then make multiple translation calls. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT snmp_bc_log2event(struct oh_handler_state *handle, gchar *logstr, SaHpiEventT *event, int isdst, LogSource2ResourceT *ret_logsrc2res) { sel_entry log_entry; gchar *recovery_str, *login_str, *post_str; gchar root_str[SNMP_BC_MAX_SEL_ENTRY_LENGTH]; gchar search_str[SNMP_BC_MAX_SEL_ENTRY_LENGTH]; EventMapInfoT *eventmap_info; LogSource2ResourceT logsrc2res; SaErrorT err; SaHpiBoolT is_recovery_event, is_threshold_event; SaHpiEventT working; SaHpiResourceIdT event_rid; SaHpiSeverityT event_severity; SaHpiTextBufferT thresh_read_value, thresh_trigger_value; SaHpiTimeT event_time; ErrLog2EventInfoT *strhash_data; struct snmp_bc_hnd *custom_handle; int dupovrovr; struct oh_event *e; SaHpiHsStateT sav_cur_state; if (!handle || !logstr || !event || !ret_logsrc2res) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } memset(&working, 0, sizeof(SaHpiEventT)); is_recovery_event = is_threshold_event = SAHPI_FALSE; dbg("Original event string = %s", logstr); /* Parse hardware log entry into its various components */ err = snmp_bc_parse_sel_entry(handle, logstr, &log_entry); if (err) { err("Cannot parse log entry=%s. Error=%s.", logstr, oh_lookup_error(err)); return(err); } /********************************************************************** * For some types of BladeCenter events (e.g. thresholds), dynamic * data is appended to a root event log string. Need to find this root * string, since its what mapped in the event hash table. **********************************************************************/ /* Set default search string */ strncpy(search_str, log_entry.text, SNMP_BC_MAX_SEL_ENTRY_LENGTH); /* Discover "recovery" event strings */ recovery_str = strstr(search_str, EVT_RECOVERY); if (recovery_str && (recovery_str == search_str)) { is_recovery_event = SAHPI_TRUE; memset(search_str, 0, SNMP_BC_MAX_SEL_ENTRY_LENGTH); strncpy(search_str, (log_entry.text + strlen(EVT_RECOVERY)), SNMP_BC_MAX_SEL_ENTRY_LENGTH - strlen(EVT_RECOVERY)); } /* Adjust "login" event strings - strip username */ login_str = strstr(log_entry.text, LOG_LOGIN_STRING); if (login_str) { gchar *id_str = strstr(log_entry.text, LOG_LOGIN_CHAR); if (id_str != NULL) { memset(search_str, 0, SNMP_BC_MAX_SEL_ENTRY_LENGTH); strncpy(search_str, log_entry.text, (id_str - log_entry.text)); search_str[(id_str - log_entry.text)] = '\0'; } } /* Adjust "POST" event strings - strip post results */ post_str = strstr(log_entry.text, LOG_POST_STRING); if (post_str) { memset(search_str, 0, SNMP_BC_MAX_SEL_ENTRY_LENGTH); strncpy(search_str, log_entry.text, (post_str - log_entry.text)); search_str[(post_str - log_entry.text - 1)] = '\0'; } /* Replace internal double blanks with a single blank */ { gchar *double_blanks; double_blanks = strstr(log_entry.text, " "); if (double_blanks) { gchar *tmp_str; int len; tmp_str = log_entry.text; memset(search_str, 0, SNMP_BC_MAX_SEL_ENTRY_LENGTH); do { strncat(search_str, tmp_str, (double_blanks - tmp_str)); tmp_str = double_blanks + 1; len = strlen(tmp_str); double_blanks = strstr(tmp_str, " "); } while (double_blanks); strncat(search_str, tmp_str, len); } } /* Adjust "threshold" event strings */ if (strstr(log_entry.text, LOG_THRESHOLD_VALUE_STRING) || strstr(log_entry.text, LOG_THRESHOLD_STRING)) { is_threshold_event = SAHPI_TRUE; oh_init_textbuffer(&thresh_read_value); oh_init_textbuffer(&thresh_trigger_value); err = snmp_bc_parse_threshold_str(search_str, root_str, &thresh_read_value, &thresh_trigger_value); if (err) { err("Cannot parse threshold string=%s.", search_str); } else { memset(search_str, 0, SNMP_BC_MAX_SEL_ENTRY_LENGTH); strncpy(search_str, root_str, SNMP_BC_MAX_SEL_ENTRY_LENGTH); } } /* Strip any leading/trailing blanks */ { gchar *tmp_str; tmp_str = g_strstrip(g_strdup(search_str)); strncpy(search_str, tmp_str, SNMP_BC_MAX_SEL_ENTRY_LENGTH); g_free(tmp_str); if ((search_str == NULL || search_str[0] == '\0')) { err("Search string is NULL for log string=%s", log_entry.text); return(SA_ERR_HPI_INTERNAL_ERROR); } } /* Strip any trailing period */ if (search_str[strlen(search_str) - 1] == '.') search_str[strlen(search_str) - 1] = '\0'; dbg("Event search string=%s", search_str); /* Set dynamic event fields with default values from the log string. These may be overwritten in the code below */ event_severity = log_entry.sev; event_time = (SaHpiTimeT)mktime(&log_entry.time) * 1000000000; /* Find default RID from Error Log's "Source" field - need if NOT_ALERTABLE OEM event */ err = snmp_bc_logsrc2rid(handle, log_entry.source, &logsrc2res, 0); if (err) { err("Cannot translate %s to RID. Error=%s", log_entry.source, oh_lookup_error(err)); return(err); } event_rid = logsrc2res.rid; /*********************************************************** * See if adjusted root string is in errlog2event_hash table ***********************************************************/ strhash_data = (ErrLog2EventInfoT *)g_hash_table_lookup(errlog2event_hash, search_str); if (!strhash_data) { if (snmp_bc_map2oem(&working, &log_entry, EVENT_NOT_ALERTABLE)) { err("Cannot map to OEM Event %s.", log_entry.text); return(SA_ERR_HPI_INTERNAL_ERROR); } goto DONE; } /* See if need to override default RID; These are hardcoded exceptions caused by the fact that we have to handle duplicates event strings for resources that the BladeCenter's event log Source field doesn't define. These options must not be used with the OVR_RID option. Note: OVR_EXP messages always assumed to have a SOURCE field = BLADE_0x */ if (strhash_data->event_ovr & OVR_EXP || strhash_data->event_ovr & OVR_VMM || strhash_data->event_ovr & OVR_MM1 || strhash_data->event_ovr & OVR_MM2 || strhash_data->event_ovr & OVR_MM_PRIME || strhash_data->event_ovr & OVR_MM_STBY) { err = snmp_bc_logsrc2rid(handle, log_entry.source, &logsrc2res, strhash_data->event_ovr); if (err) { err("Cannot translate %s to RID. Error=%s.", log_entry.source, oh_lookup_error(err)); return(err); } event_rid = logsrc2res.rid; } /* Handle duplicate strings that have different event numbers */ dupovrovr = 0; if (strhash_data->event_dup) { strhash_data = snmp_bc_findevent4dupstr(search_str, strhash_data, &logsrc2res); if (strhash_data == NULL) { err("Cannot find valid event for duplicate string=%s and RID=%d.", search_str, logsrc2res.rid); if (snmp_bc_map2oem(&working, &log_entry, EVENT_NOT_ALERTABLE)) { err("Cannot map to OEM Event %s.", log_entry.text); return(SA_ERR_HPI_INTERNAL_ERROR); } goto DONE; } if (strhash_data->event_ovr & OVR_RID) { err("Cannot have RID override on duplicate strin;g=%s.", search_str); dupovrovr = 1; } } /* If OVR_SEV, use BCT-level severity calculated in off-line scripts */ if (strhash_data->event_ovr & OVR_SEV) { event_severity = strhash_data->event_sev; } /************************************************** * Find event string's mapped HPI event information **************************************************/ eventmap_info = (EventMapInfoT *)g_hash_table_lookup(custom_handle->event2hpi_hash_ptr, strhash_data->event); if (!eventmap_info) { if (snmp_bc_map2oem(&working, &log_entry, EVENT_NOT_MAPPED)) { err("Cannot map to OEM Event %s.", log_entry.text); return(SA_ERR_HPI_INTERNAL_ERROR); } goto DONE; } /* Set static event data defined during resource discovery */ working = eventmap_info->hpievent; logsrc2res.ep = eventmap_info->ep; logsrc2res.rid = eventmap_info->hpievent.Source; /* Handle OVR_RID - only for non-duplicate event strings */ if ((strhash_data->event_ovr & OVR_RID) && !dupovrovr) { event_rid = eventmap_info->hpievent.Source; } /* Set RID in structure - used in later calls */ working.Source = event_rid; /* Handle sensor events */ if (working.EventType == SAHPI_ET_SENSOR) { if (is_recovery_event == SAHPI_TRUE) { working.EventDataUnion.SensorEvent.Assertion = SAHPI_FALSE; } /* Determine severity of event */ err = snmp_bc_set_event_severity(handle, eventmap_info, &working, &event_severity); /* Set optional event current and previous states, if possible */ err = snmp_bc_set_cur_prev_event_states(handle, eventmap_info, &working, is_recovery_event); /* Set optional event threshold values */ if (is_threshold_event == SAHPI_TRUE) { if (oh_encode_sensorreading(&thresh_read_value, working.EventDataUnion.SensorEvent.TriggerReading.Type, &working.EventDataUnion.SensorEvent.TriggerReading)) { err("Cannot convert trigger reading=%s; text=%s.", thresh_read_value.Data, log_entry.text); return(SA_ERR_HPI_INTERNAL_ERROR); } working.EventDataUnion.SensorEvent.OptionalDataPresent = working.EventDataUnion.SensorEvent.OptionalDataPresent | SAHPI_SOD_TRIGGER_READING; if (oh_encode_sensorreading(&thresh_trigger_value, working.EventDataUnion.SensorEvent.TriggerThreshold.Type, &working.EventDataUnion.SensorEvent.TriggerThreshold)) { err("Cannot convert trigger threshold=%s; text=%s.", thresh_trigger_value.Data, log_entry.text); return(SA_ERR_HPI_INTERNAL_ERROR); } working.EventDataUnion.SensorEvent.OptionalDataPresent = working.EventDataUnion.SensorEvent.OptionalDataPresent | SAHPI_SOD_TRIGGER_THRESHOLD; } } /* Handle hot swap events */ else if (working.EventType == SAHPI_ET_HOTSWAP) { SaHpiHsStateT hs_event_state, hs_event_auto_state; SaHpiRptEntryT *rpt; struct ResourceInfo *resinfo2; rpt = oh_get_resource_by_id(handle->rptcache, event_rid); resinfo2 = (struct ResourceInfo *)oh_get_resource_data(handle->rptcache, event_rid); if ( (custom_handle->isFirstDiscovery == SAHPI_TRUE)||!rpt || !resinfo2) { if (is_recovery_event != SAHPI_TRUE) { snmp_bc_set_event_severity(handle, eventmap_info, &working, &event_severity); } snmp_bc_set_cur_prev_event_states(handle, eventmap_info, &working, is_recovery_event); if (custom_handle->isFirstDiscovery == SAHPI_FALSE) { /* Call rediscover() here to discover newly installed resource */ err = snmp_bc_rediscover(handle, &working, &logsrc2res); } goto RESUME_TO_EXIT; } /* Find hot swap state and any defined hot swap events to generate */ if (is_recovery_event) { hs_event_state = eventmap_info->hs_recovery_state; hs_event_auto_state = eventmap_info->hs_recovery_auto_state; } else { hs_event_state = eventmap_info->hpievent.EventDataUnion.HotSwapEvent.HotSwapState; hs_event_auto_state = eventmap_info->hs_event_auto_state; } /******************************************************************** * Check for reannouncement of current state * - don't auto-generate any events * - reannoucement has same current/previous state as original event ********************************************************************/ if (hs_event_state == resinfo2->cur_state) { working.EventDataUnion.HotSwapEvent.HotSwapState = resinfo2->cur_state; working.EventDataUnion.HotSwapEvent.PreviousHotSwapState = resinfo2->cur_state; event_severity = SAHPI_INFORMATIONAL; } else { /* Generate any automatic hot swap state event */ if (hs_event_auto_state) { if (rpt->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP) { SaErrorT err; SaHpiEventT autoevent; /* Build event */ memcpy((void *)&autoevent, (void *)&working, sizeof(SaHpiEventT)); autoevent.Timestamp = event_time; autoevent.Severity = SAHPI_INFORMATIONAL; autoevent.EventDataUnion.HotSwapEvent.PreviousHotSwapState = resinfo2->prev_state = resinfo2->cur_state; autoevent.EventDataUnion.HotSwapEvent.HotSwapState = resinfo2->cur_state = hs_event_auto_state; if (custom_handle->isFirstDiscovery == SAHPI_FALSE) { err = snmp_bc_add_to_eventq(handle, &autoevent, SAHPI_TRUE); if (err) { err("Cannot add entry to eventq. Error=%s.", oh_lookup_error(err)); return(err); } } } else { err("Invalid Hot Swap State for %s", rpt->ResourceTag.Data); return(SA_ERR_HPI_INTERNAL_ERROR); } } /* Normal hot swap event transitions */ sav_cur_state = resinfo2->cur_state; if (is_recovery_event) working.EventDataUnion.HotSwapEvent.HotSwapState = resinfo2->cur_state = eventmap_info->hs_recovery_state; else working.EventDataUnion.HotSwapEvent.HotSwapState = resinfo2->cur_state = eventmap_info->hpievent.EventDataUnion.HotSwapEvent.HotSwapState; if ( (rpt->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP) && (resinfo2->cur_state == SAHPI_HS_STATE_NOT_PRESENT)){ working.EventDataUnion.HotSwapEvent.PreviousHotSwapState = sav_cur_state; resinfo2->prev_state = SAHPI_HS_STATE_EXTRACTION_PENDING; } else { working.EventDataUnion.HotSwapEvent.PreviousHotSwapState = resinfo2->prev_state = sav_cur_state; } /* Determine severity */ if (resinfo2->cur_state == SAHPI_HS_STATE_NOT_PRESENT && resinfo2->prev_state != SAHPI_HS_STATE_INACTIVE) { event_severity = rpt->ResourceSeverity; } else { event_severity = SAHPI_INFORMATIONAL; } /* Call rediscover() here to do cleanup for hotswap-remove event */ /* cleanup = removing rpt and rdrs from plugin handle->rptcache */ /* rpt and rdrs will be remove in snmp_bc_add_to_eventq() becasue*/ /* the new oh_event requires rpt present, else infrastructure */ /* drops the event. We have to wait to the very last min to */ /* remove rpt from rptcache. */ /* err = snmp_bc_rediscover(handle, &working, &logsrc2res); */ } } else { err("Platform doesn't support events of type=%s.", oh_lookup_eventtype(working.EventType)); return(SA_ERR_HPI_INTERNAL_ERROR); } /************************************************** * Check to see if need to mark resource as failed. **************************************************/ RESUME_TO_EXIT: if (eventmap_info->event_res_failure) { SaHpiRptEntryT *rpt = oh_get_resource_by_id(handle->rptcache, event->Source); if (rpt) { /* Only notify if change in status */ if (rpt->ResourceFailed == SAHPI_FALSE) { rpt->ResourceFailed = SAHPI_TRUE; /* Add changed resource to event queue */ e = snmp_bc_alloc_oh_event(); if (e == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } e->resource = *rpt; e->event.Severity = e->resource.ResourceSeverity; e->event.Source = e->resource.ResourceId; e->event.EventType = SAHPI_ET_RESOURCE; e->event.EventDataUnion.ResourceEvent.ResourceEventType = SAHPI_RESE_RESOURCE_FAILURE; if (oh_gettimeofday(&e->event.Timestamp) != SA_OK) e->event.Timestamp = SAHPI_TIME_UNSPECIFIED; custom_handle->eventq = g_slist_append(custom_handle->eventq, e); } } } DONE: working.Source = event_rid; working.Timestamp = event_time; working.Severity = event_severity; memcpy((void *)event, (void *)&working, sizeof(SaHpiEventT)); memcpy(ret_logsrc2res, &logsrc2res, sizeof(LogSource2ResourceT)); return(SA_OK); } /** * snmp_bc_findevent4dupstr: * @search_str: Error Log string. * @strhash_data: Pointer to string to event ID mapping information. * @resinfo: Pointer to resource mapping information * * Returns a pointer to the error log event number to HPI event mapping * information. A NULL is returned if the information cannot be found. * * There are several identical Error Log messages strings that are shared by * multiple resources. The scripts that populate errlog2event_hash * create unique entries for these duplicate strings by tacking on * an unique string (HPIDUP_duplicate_number) to the error log message. * This is then stored in errlog2event_hash. So there is a unique mapping * for each resource with a duplicate string. * * This routine goes finds the unique mapping for all the duplicate strings. * Then searches through all the resource's events and all the resource's * sensor events to find a match. It does this for each duplicate string * mapping until it finds a match or runs out of strings to test (in which * case, it returns NULL). * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - Parameter pointer(s) are NULL. **/ static ErrLog2EventInfoT *snmp_bc_findevent4dupstr(gchar *search_str, ErrLog2EventInfoT *strhash_data, LogSource2ResourceT *logsrc2res) { gchar dupstr[SNMP_BC_MAX_SEL_ENTRY_LENGTH]; ErrLog2EventInfoT *dupstr_hash_data; short strnum; if (!search_str || !strhash_data || !logsrc2res) { err("Invalid parameter."); return(NULL); } strncpy(dupstr, search_str, SNMP_BC_MAX_SEL_ENTRY_LENGTH); dupstr_hash_data = strhash_data; strnum = strhash_data->event_dup + 1; /* Original string plus dups */ while (strnum && (dupstr_hash_data != NULL)) { int i,j; gchar *normalized_event; /* Search entire sensor array for the duplicate string's event */ for (i=0; (logsrc2res->sensor_array_ptr + i)->sensor.Num != 0; i++) { for (j=0; (logsrc2res->sensor_array_ptr + i)->sensor_info.event_array[j].event != NULL; j++) { normalized_event = oh_derive_string(&(logsrc2res->ep), 0, 16, (logsrc2res->sensor_array_ptr + i)->sensor_info.event_array[j].event); if (!g_ascii_strcasecmp(dupstr_hash_data->event, normalized_event)) { g_free(normalized_event); return(dupstr_hash_data); } g_free(normalized_event); } } /* Search resource array for the duplicate string's event */ for (i=0; snmp_bc_rpt_array[logsrc2res->rpt].res_info.event_array[i].event != NULL; i++) { normalized_event = oh_derive_string(&(logsrc2res->ep), 0, 16, snmp_bc_rpt_array[logsrc2res->rpt].res_info.event_array[i].event); if (!g_ascii_strcasecmp(dupstr_hash_data->event, normalized_event)) { g_free(normalized_event); return(dupstr_hash_data); } g_free(normalized_event); } /* Find next duplicate string */ strnum--; if (strnum) { gchar strnum_str[OH_MAX_LOCATION_DIGITS]; gchar *tmpstr; snprintf(strnum_str, OH_MAX_LOCATION_DIGITS, "%d", strnum); tmpstr = g_strconcat(search_str, HPIDUP_STRING, strnum_str, NULL); strncpy(dupstr, tmpstr, SNMP_BC_MAX_SEL_ENTRY_LENGTH); g_free(tmpstr); dupstr_hash_data = (ErrLog2EventInfoT *)g_hash_table_lookup(errlog2event_hash, dupstr); if (dupstr_hash_data == NULL) { err("Cannot find duplicate string=%s.", dupstr); } } } return(NULL); } /** * snmp_bc_parse_threshold_str: * @str: Input Error Log threshold string. * @root_str: Location to store threshold's root string. * @read_value_str: Location to store threshold's read value string. * @trigger_value_str: Location to store threshold's trigger value string. * * Parses a Error Log threshold string into its root string, read, * and trigger value strings. * * Format is a root string (in the errlog2event_hash table) followed by a * read threshold value string, followed by a trigger threshold value string. * Unfortunately cannot convert directly to sensor values yet because * don't yet know if event is in the event2hpi_hash table or if it is, * what the sensor's threshold data type is. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - Parameter pointer(s) are NULL. **/ static SaErrorT snmp_bc_parse_threshold_str(gchar *str, gchar *root_str, SaHpiTextBufferT *read_value_str, SaHpiTextBufferT *trigger_value_str) { gchar **event_substrs; gchar **thresh_substrs; SaErrorT err; if (!str || !root_str || !read_value_str || !trigger_value_str) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } event_substrs = NULL; thresh_substrs = NULL; err = SA_OK; /* Handle BladeCenter's two basic threshold event formats */ if (strstr(str, LOG_READ_VALUE_STRING)) { event_substrs = g_strsplit(str, LOG_READ_VALUE_STRING, -1); thresh_substrs = g_strsplit(event_substrs[1], LOG_THRESHOLD_VALUE_STRING, -1); } else { event_substrs = g_strsplit(str, LOG_READ_STRING, -1); thresh_substrs = g_strsplit(event_substrs[1], LOG_THRESHOLD_STRING, -1); } if (thresh_substrs == NULL || (thresh_substrs[0] == NULL || thresh_substrs[0][0] == '\0') || (thresh_substrs[1] == NULL || thresh_substrs[1][0] == '\0') || (thresh_substrs[2] != NULL)) { err("Cannot split threshold string=%s.", str); err = SA_ERR_HPI_INTERNAL_ERROR; goto CLEANUP; } /* Strip any leading/trailing blanks */ event_substrs[0]= g_strstrip(event_substrs[0]); thresh_substrs[0] = g_strstrip(thresh_substrs[0]); thresh_substrs[1] = g_strstrip(thresh_substrs[1]); if ((event_substrs[0] == NULL || event_substrs[0] == '\0') || (thresh_substrs[0] == NULL || thresh_substrs[0][0] == '\0') || (thresh_substrs[1] == NULL || thresh_substrs[1][0] == '\0')) { err("NULL base string or threshold values=%s.", str); err = SA_ERR_HPI_INTERNAL_ERROR; goto CLEANUP; } /* Change any leading period to a blank. This put here because MM code added a period after the Threadhold Value string and before the threshold value (e.g. "Threshold value. 23.0") */ if (thresh_substrs[0][0] == '.') thresh_substrs[0][0] = ' '; if (thresh_substrs[1][0] == '.') thresh_substrs[1][0] = ' '; /* Strip any leading/trailing blanks - in case of leading period */ thresh_substrs[0] = g_strstrip(thresh_substrs[0]); thresh_substrs[1] = g_strstrip(thresh_substrs[1]); if ((event_substrs[0] == NULL || event_substrs[0] == '\0') || (thresh_substrs[0] == NULL || thresh_substrs[0][0] == '\0') || (thresh_substrs[1] == NULL || thresh_substrs[1][0] == '\0')) { err("NULL base string or threshold values=%s.", str); err = SA_ERR_HPI_INTERNAL_ERROR; goto CLEANUP; } /* Strip any ending periods, commas, colons, or semicolons */ if ((thresh_substrs[0][strlen(thresh_substrs[0]) - 1] == '.') || (thresh_substrs[0][strlen(thresh_substrs[0]) - 1] == ',') || (thresh_substrs[0][strlen(thresh_substrs[0]) - 1] == ':') || (thresh_substrs[0][strlen(thresh_substrs[0]) - 1] == ';')) thresh_substrs[0][strlen(thresh_substrs[0]) - 1] = '\0'; if ((thresh_substrs[1][strlen(thresh_substrs[1]) - 1] == '.') || (thresh_substrs[1][strlen(thresh_substrs[1]) - 1] == ',') || (thresh_substrs[1][strlen(thresh_substrs[1]) - 1] == ':') || (thresh_substrs[1][strlen(thresh_substrs[1]) - 1] == ';')) thresh_substrs[1][strlen(thresh_substrs[1]) - 1] = '\0'; /* Check for valid length */ if ((strlen(thresh_substrs[0]) > SAHPI_MAX_TEXT_BUFFER_LENGTH) || (strlen(thresh_substrs[1]) > SAHPI_MAX_TEXT_BUFFER_LENGTH)) { err("Threshold value string(s) exceed max size for %s.", str); err = SA_ERR_HPI_INTERNAL_ERROR; goto CLEANUP; } dbg("Threshold strings: %s and %s", thresh_substrs[0], thresh_substrs[1]); strcpy(root_str, event_substrs[0]); oh_append_textbuffer(read_value_str, thresh_substrs[0]); oh_append_textbuffer(trigger_value_str, thresh_substrs[1]); if (root_str == NULL) { err("Cannot parse threshold string=%s.", str); err = SA_ERR_HPI_INTERNAL_ERROR; } CLEANUP: g_strfreev(event_substrs); g_strfreev(thresh_substrs); return(err); } /** * snmp_bc_set_event_severity: * @handle: Handler data pointer. * @eventmap_info: Event state and recovery information pointer. * @event: Event pointer. * @event_severity: Location to store severity. * * Overwrites normal severity, if sensor is of type SAHPI_EC_THRESHOLD or * SAHPI_EC_SEVERITY. If event is not one of these types, this routine * checks to see if it's an unexpected resource failure event. * If it is, the resource's severity (user writable) is used. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - Parameter pointer(s) are NULL. **/ static SaErrorT snmp_bc_set_event_severity(struct oh_handler_state *handle, EventMapInfoT *eventmap_info, SaHpiEventT *event, SaHpiSeverityT *event_severity) { int sensor_severity_override; sensor_severity_override = 0; if (!handle || !eventmap_info || !event || !event_severity) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } if (event->EventType == SAHPI_ET_SENSOR) { /* Force HPI Threshold and Severity category severities */ if (event->EventDataUnion.SensorEvent.EventCategory == SAHPI_EC_THRESHOLD) { sensor_severity_override = 1; if (event->EventDataUnion.SensorEvent.EventState & SAHPI_ES_LOWER_CRIT || event->EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_CRIT) { *event_severity = SAHPI_CRITICAL; } else { if (event->EventDataUnion.SensorEvent.EventState & SAHPI_ES_LOWER_MAJOR || event->EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_MAJOR) { *event_severity = SAHPI_MAJOR; } else { if (event->EventDataUnion.SensorEvent.EventState & SAHPI_ES_LOWER_MINOR || event->EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_MINOR) { *event_severity = SAHPI_MINOR; } } } } else { if (event->EventDataUnion.SensorEvent.EventCategory == SAHPI_EC_SEVERITY) { sensor_severity_override = 1; if (event->EventDataUnion.SensorEvent.EventState & SAHPI_ES_OK) *event_severity = SAHPI_OK; if (event->EventDataUnion.SensorEvent.EventState & SAHPI_ES_MINOR_FROM_OK) *event_severity = SAHPI_MINOR; if (event->EventDataUnion.SensorEvent.EventState & SAHPI_ES_MAJOR_FROM_LESS) *event_severity = SAHPI_MAJOR; if (event->EventDataUnion.SensorEvent.EventState & SAHPI_ES_CRITICAL_FROM_LESS) *event_severity = SAHPI_CRITICAL; if (event->EventDataUnion.SensorEvent.EventState & SAHPI_ES_MINOR_FROM_MORE) *event_severity = SAHPI_MINOR; if (event->EventDataUnion.SensorEvent.EventState & SAHPI_ES_MAJOR_FROM_CRITICAL) *event_severity = SAHPI_MAJOR; if (event->EventDataUnion.SensorEvent.EventState & SAHPI_ES_CRITICAL) *event_severity = SAHPI_CRITICAL; if (event->EventDataUnion.SensorEvent.EventState & SAHPI_ES_INFORMATIONAL) *event_severity = SAHPI_INFORMATIONAL; } } } /* Use resource's severity, if unexpected failure */ if (!sensor_severity_override && eventmap_info->event_res_failure_unexpected) { SaHpiRptEntryT *rpt = oh_get_resource_by_id(handle->rptcache, event->Source); if (!rpt) return(SA_ERR_HPI_INVALID_RESOURCE); *event_severity = rpt->ResourceSeverity; } return(SA_OK); } /** * snmp_bc_set_cur_prev_event_states: * @handle: Handler data pointer. * @eventmap_info: Event state and recovery information pointer. * @event: Location to store current/previous event infomation. * @recovery_event: Is the event a recovery event or not. * * Attempts to set the optional current and previous state information * in an event. * * NOTES: * A sensor's previous state depends on if it is readable or not. If * the sensor is not readable, then the previous state is just the state * of the sensor's last processed event. If the sensor is readable, * the previous state is set to the sensor's current state when the * last event was processed. That is when an event is processed, * the sensor is read and the info stored to be placed in the previous * state field for the next time an event for that sensor is processed. * * For non-readable sensors, current state is simply the processed * event's state. * * This routine is optional for sensors; but NOT hot swap. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ static SaErrorT snmp_bc_set_cur_prev_event_states(struct oh_handler_state *handle, EventMapInfoT *eventmap_info, SaHpiEventT *event, int recovery_event) { SaErrorT err; SaHpiRdrT *rdr; if (!handle || !eventmap_info || !event) { err("Invalid parameters."); return(SA_ERR_HPI_INVALID_PARAMS); } if ( (((struct snmp_bc_hnd *)handle->data)->isFirstDiscovery == SAHPI_TRUE) && (event->EventType == SAHPI_ET_HOTSWAP) ) { /* This is HPI time zero processing */ /* Discovery routines set proper current state for each resource */ /* Do not override state setting with (stale) data from Event Log processing */ return(SA_OK); } switch (event->EventType) { case SAHPI_ET_SENSOR: { SaHpiSensorReadingT cur_reading; SaHpiEventStateT cur_state, prev_state; struct SensorInfo *sinfo; /* Initialize previous and current state event info */ event->EventDataUnion.SensorEvent.PreviousState = SAHPI_ES_UNSPECIFIED; event->EventDataUnion.SensorEvent.CurrentState = SAHPI_ES_UNSPECIFIED; /* Set previous state to sensor's current state */ rdr = oh_get_rdr_by_type(handle->rptcache, event->Source, SAHPI_SENSOR_RDR, event->EventDataUnion.SensorEvent.SensorNum); if (rdr == NULL) { return(SA_ERR_HPI_NOT_PRESENT); } sinfo = (struct SensorInfo *)oh_get_rdr_data(handle->rptcache, event->Source, rdr->RecordId); if (sinfo == NULL) { err("No sensor data. Sensor=%s.", rdr->IdString.Data); return(SA_ERR_HPI_INTERNAL_ERROR); } /* Record previous state info */ prev_state = sinfo->cur_state; /* Try to read sensor to get and record the current state */ err = snmp_bc_get_sensor_reading((void *)handle, event->Source, event->EventDataUnion.SensorEvent.SensorNum, &cur_reading, &cur_state); /* If can't read sensor (error, sensor disabled, or event-only), use static event state definitions */ if (err || cur_reading.IsSupported == SAHPI_FALSE) { if (recovery_event) { cur_state = sinfo->cur_state = eventmap_info->sensor_recovery_state; } else { cur_state = sinfo->cur_state = event->EventDataUnion.SensorEvent.EventState; } } else { sinfo->cur_state = cur_state; } #if 0 { /* Debug section */ SaHpiTextBufferT buffer; err("Event for Sensor=%s", rdr->IdString.Data); oh_decode_eventstate(prev_state, event->EventDataUnion.SensorEvent.EventCategory, &buffer); err(" Previous Event State: %s.", buffer.Data); oh_decode_eventstate(cur_state, event->EventDataUnion.SensorEvent.EventCategory, &buffer); err(" Current Event State: %s", buffer.Data); } #endif /* Set previous and current state event info */ event->EventDataUnion.SensorEvent.PreviousState = prev_state; event->EventDataUnion.SensorEvent.CurrentState = cur_state; event->EventDataUnion.SensorEvent.OptionalDataPresent = event->EventDataUnion.SensorEvent.OptionalDataPresent | SAHPI_SOD_PREVIOUS_STATE | SAHPI_SOD_CURRENT_STATE; break; } case SAHPI_ET_HOTSWAP: { struct ResourceInfo *resinfo; resinfo = (struct ResourceInfo *)oh_get_resource_data(handle->rptcache, event->Source); if (resinfo == NULL) { /* If there is no resource data in rptcache, ie. no rpt, */ /* this resource either did not exist at HPI time 0, or */ /* has previously been removed from system. */ /* It is safe to assume that it is being Hotswap-Installed */ dbg("No resource data. RID=%x", event->Source); event->EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_NOT_PRESENT; event->EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_INACTIVE; return(SA_OK); } event->EventDataUnion.HotSwapEvent.PreviousHotSwapState = resinfo->cur_state; if (recovery_event) { event->EventDataUnion.HotSwapEvent.HotSwapState = resinfo->cur_state = eventmap_info->hs_recovery_state; } else { event->EventDataUnion.HotSwapEvent.HotSwapState = resinfo->cur_state = eventmap_info->hpievent.EventDataUnion.HotSwapEvent.HotSwapState; } break; } default: err("Unrecognized Event Type=%s.", oh_lookup_eventtype(event->EventType)); return(SA_ERR_HPI_INTERNAL_ERROR); } return(SA_OK); } /** * snmp_bc_map2oem: * @event: Pointer to handler's data. * @sel_entry: Error Log's "Source" field string. * @reason: Location to store HPI mapping data for resource. * * Any event not explicitly recognized is mapped into an HPI * OEM event. This routine performs the mapping. * * NOTE: * A reason code is passed, if in the future we record in some temp file, * non-mapped events. Reason records why the event wasn't mapped. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ static SaErrorT snmp_bc_map2oem(SaHpiEventT *event, sel_entry *sel_entry, OEMReasonCodeT reason) { if (!event || !sel_entry) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } dbg("OEM Event Reason Code=%s\n", reason ? "NOT_ALERTABLE" : "NOT MAPPED"); event->EventType = SAHPI_ET_OEM; event->EventDataUnion.OemEvent.MId = IBM_MANUFACTURING_ID; /* Language set to ENGLISH, default */ oh_init_textbuffer(&(event->EventDataUnion.OemEvent.OemEventData)); strncpy((char *)(event->EventDataUnion.OemEvent.OemEventData.Data), sel_entry->text, SAHPI_MAX_TEXT_BUFFER_LENGTH - 1); event->EventDataUnion.OemEvent.OemEventData.Data[SAHPI_MAX_TEXT_BUFFER_LENGTH - 1] = '\0'; event->EventDataUnion.OemEvent.OemEventData.DataLength = strlen(sel_entry->text); return(SA_OK); } /** * snmp_bc_logsrc2rid: * @handle: Pointer to handler's data. * @src: Error Log's "Source" field string. * @resinfo: Location to store HPI resource mapping information. * @ovr_flags: Override flags * * Translates platform error log's "Source" field into an HPI resource ID * and stores HPI mapping info needed by other routines in * @resinfo. Assume "Source" field text is in the following format: * * "BLADE_0x" - map to blade x RID * "SWITCH_x" - map to switch x RID * * All other "Source" field text strings are mapped to the * Chassis's resource ID. * * @ovr_flags is used to indicate exception cases. The two case * supported are: * - OVR_EXP - indicates resource is an expansion card. * - OVR_VMM - indicates resource is Virtual MM * - OVR_MM1 - indicates resource is the MM 1 card. * - OVR_MM2 - indicates resource is the MM 2 card. * - OVR_MM_PRIME - indicates resource is the physical MM of primary MM. * - OVR_MM_STBY - indicates resource is the physical MM of the standby MM. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ static SaErrorT snmp_bc_logsrc2rid(struct oh_handler_state *handle, gchar *src, LogSource2ResourceT *logsrc2res, unsigned long long ovr_flags) { int rpt_index; guint src_loc; gchar **src_parts, *endptr, *root_tuple; SaErrorT err; SaHpiBoolT isblade, isexpansioncard, isswitch, ismm; SaHpiEntityPathT ep, ep_root; SaHpiEntityTypeT entity_type; struct snmp_bc_sensor *array_ptr; struct snmp_bc_hnd *custom_handle; if (!handle || !src || !logsrc2res) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } src_parts = NULL; endptr = NULL; custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } /* Find top-level chassis entity path */ oh_init_ep(&ep); oh_init_ep(&ep_root); root_tuple = (gchar *)g_hash_table_lookup(handle->config, "entity_root"); oh_encode_entitypath(root_tuple, &ep_root); /* Assume chassis location/type unless another resource type is discovered */ src_loc = ep_root.Entry[0].EntityLocation; entity_type = ep_root.Entry[0].EntityType; /* Break down "Source" text string to find source's RPT index and location */ src_parts = g_strsplit(src, "_", -1); if (src_parts == NULL) { err("Cannot split Source text string."); g_strfreev(src_parts); return(SA_ERR_HPI_INTERNAL_ERROR); } /* See if resource is something other than the chassis */ isblade = isexpansioncard = isswitch = ismm = SAHPI_FALSE; if (!g_ascii_strncasecmp(src_parts[0], "BLADE", sizeof("BLADE"))) { /* All expansion card events are reported as blade events in the Error Log */ if (ovr_flags & OVR_EXP) { isexpansioncard = SAHPI_TRUE; } else { isblade = SAHPI_TRUE; } } else { if (!g_ascii_strncasecmp(src_parts[0], "SWITCH", sizeof("SWITCH"))) { isswitch = SAHPI_TRUE; } } /* Find the location value from last part of log's source string */ if (isexpansioncard == SAHPI_TRUE || isblade == SAHPI_TRUE || isswitch == SAHPI_TRUE) { if (src_parts[1]) src_loc = strtoul(src_parts[1], &endptr, 10); if (isexpansioncard == SAHPI_TRUE) { rpt_index = BC_RPT_ENTRY_BLADE_EXPANSION_CARD; array_ptr = &snmp_bc_bem_sensors[0]; } else { if (isblade == SAHPI_TRUE) { rpt_index = BC_RPT_ENTRY_BLADE; array_ptr = &snmp_bc_blade_sensors[0]; } else { rpt_index = BC_RPT_ENTRY_SWITCH_MODULE; array_ptr = &snmp_bc_switch_sensors[0]; } } entity_type = snmp_bc_rpt_array[rpt_index].rpt.ResourceEntity.Entry[0].EntityType; } else { /* Check for OVR_MMx overrides, if cannot find explict resource from error logs "Source" field */ if (ovr_flags & OVR_VMM || ovr_flags & OVR_MM1 || ovr_flags & OVR_MM2 || ovr_flags & OVR_MM_PRIME || ovr_flags & OVR_MM_STBY) { if (ovr_flags & OVR_VMM) { rpt_index = BC_RPT_ENTRY_VIRTUAL_MGMNT_MODULE; src_loc = 0; array_ptr = &snmp_bc_virtual_mgmnt_sensors[0]; } else { ismm = SAHPI_TRUE; rpt_index = BC_RPT_ENTRY_MGMNT_MODULE; array_ptr = &snmp_bc_mgmnt_sensors[0]; if (ovr_flags & OVR_MM1 || ovr_flags & OVR_MM2) { if (ovr_flags & OVR_MM1) { src_loc = 1; } else { src_loc = 2; } } else { /* Assign primary/standby events to physical MM */ struct snmp_value value; int primary, standby; err = snmp_bc_snmp_get(custom_handle, SNMP_BC_MGMNT_ACTIVE, &value, SAHPI_TRUE); if (err) { err("Cannot get OID=%s.", SNMP_BC_MGMNT_ACTIVE); return(SA_ERR_HPI_INTERNAL_ERROR); } primary = value.integer; if (value.integer == 1) { standby = 2; } else { standby = 1; } if (ovr_flags & OVR_MM_PRIME) { src_loc = primary; } else { src_loc = standby; } /* Standby override */ } } entity_type = snmp_bc_rpt_array[rpt_index].rpt.ResourceEntity.Entry[0].EntityType; } else { rpt_index = BC_RPT_ENTRY_CHASSIS; array_ptr = &snmp_bc_chassis_sensors[0]; } } g_strfreev(src_parts); /* Find rest of Entity Path and calculate the RID */ err = oh_concat_ep(&ep, &snmp_bc_rpt_array[rpt_index].rpt.ResourceEntity); if (err) { err("Cannot concat Entity Path. Error=%s.", oh_lookup_error(err)); return(SA_ERR_HPI_INTERNAL_ERROR); } err = oh_concat_ep(&ep, &ep_root); if (err) { err("Cannot concat Entity Path. Error=%s.", oh_lookup_error(err)); return(SA_ERR_HPI_INTERNAL_ERROR); } /* FIXME:: Need to rewrite this section when discover multiple BEMs/blade */ /* Also switches aren't currently supported with the Source field - can remove this logic */ if (isexpansioncard == SAHPI_TRUE) { err = oh_set_ep_location(&ep, entity_type, 1); } else { err = oh_set_ep_location(&ep, entity_type, src_loc); } if (err) { err("Cannot set location. Type=%s; Location=%d; Error=%s.", oh_lookup_entitytype(entity_type), src_loc, oh_lookup_error(err)); return(SA_ERR_HPI_INTERNAL_ERROR); } if ((isblade == SAHPI_TRUE) || (isexpansioncard == SAHPI_TRUE)) { err = oh_set_ep_location(&ep, SAHPI_ENT_PHYSICAL_SLOT, src_loc); } else if (ismm == SAHPI_TRUE) { err = oh_set_ep_location(&ep, BLADECENTER_SYS_MGMNT_MODULE_SLOT, src_loc); } /* Special case - if Expansion Card set location of parent blade as well */ if (isexpansioncard == SAHPI_TRUE) { err = oh_set_ep_location(&ep, SAHPI_ENT_SBC_BLADE, src_loc); if (err) { err("Cannot set location. Type=%s; Location=%d; Error=%s.", oh_lookup_entitytype(SAHPI_ENT_SBC_BLADE), src_loc, oh_lookup_error(err)); return(SA_ERR_HPI_INTERNAL_ERROR); } } /* Fill in RID and RPT table info about "Source" */ logsrc2res->rpt = rpt_index; logsrc2res->sensor_array_ptr = array_ptr; logsrc2res->ep = ep; logsrc2res->rid = oh_uid_lookup(&ep); /********************************************************************************** * Generate RID, if necessary. * * RID may be zero if resource hasn't ever been discovered since HPI initialization. * In this case, generate a valid RID. Infra-structure always assigns same RID * number to an unique entity path. User app needs to worry about if resource * is actually in the chassis - just as they do for hot swapped resources. **********************************************************************************/ if (logsrc2res->rid == 0) { logsrc2res->rid = oh_uid_from_entity_path(&ep); if (logsrc2res->rid == 0) { err("No RID."); return(SA_ERR_HPI_INTERNAL_ERROR); } } return(SA_OK); } /** * snmp_bc_add_to_eventq * @handle: Pointer to handler's data. * @thisEvent: Location to store event. * * Add event to Infrastructure's event queue. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT snmp_bc_add_to_eventq(struct oh_handler_state *handle, SaHpiEventT *thisEvent, SaHpiBoolT prepend) { SaHpiEntryIdT rdrid; struct oh_event *e = NULL; SaHpiRptEntryT *thisRpt; SaHpiRdrT *thisRdr; LogSource2ResourceT logsrc2res; SaErrorT err; struct snmp_bc_hnd *custom_handle = (struct snmp_bc_hnd *)handle->data; /* Insert entry to eventq for processing */ e = snmp_bc_alloc_oh_event(); if (!e) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } thisRpt = oh_get_resource_by_id(handle->rptcache, thisEvent->Source); if (thisRpt) e->resource = *thisRpt; memcpy(&e->event, thisEvent, sizeof(SaHpiEventT)); /* Setting RDR ID to event struct */ switch (thisEvent->EventType) { case SAHPI_ET_HOTSWAP: if (snmp_bc_isrediscover(thisEvent) == SNMP_BC_RESOURCE_INSTALLED) { for (thisRdr = oh_get_rdr_by_id(handle->rptcache, thisEvent->Source, SAHPI_FIRST_ENTRY); thisRdr != NULL; thisRdr = oh_get_rdr_next(handle->rptcache, thisEvent->Source, thisRdr->RecordId)) { e->rdrs = g_slist_append(e->rdrs, g_memdup(thisRdr, sizeof(SaHpiRdrT))); } } else if (snmp_bc_isrediscover(thisEvent) == SNMP_BC_RESOURCE_REMOVED) { /* Call rediscovery to remove rpt and rdrs from rptcache */ if (thisRpt) logsrc2res.ep = thisRpt->ResourceEntity; err = snmp_bc_rediscover(handle, thisEvent, &logsrc2res); } break; case SAHPI_ET_OEM: case SAHPI_ET_USER: /* There is no RDR associated to OEM event */ e->rdrs = NULL; /* Set RDR Type to SAHPI_NO_RECORD, spec B-01.01 */ /* It is redundant because SAHPI_NO_RECORD == 0, Put code here for clarity */ break; case SAHPI_ET_SENSOR: rdrid = oh_get_rdr_uid(SAHPI_SENSOR_RDR, thisEvent->EventDataUnion.SensorEvent.SensorNum); thisRdr = oh_get_rdr_by_id(handle->rptcache, thisEvent->Source, rdrid); if (thisRdr) e->rdrs = g_slist_append(e->rdrs, g_memdup(thisRdr, sizeof(SaHpiRdrT))); else err("Rdr not found for rid %d, rdrid %d\n",thisEvent->Source, rdrid); break; case SAHPI_ET_WATCHDOG: rdrid = oh_get_rdr_uid(SAHPI_WATCHDOG_RDR, thisEvent->EventDataUnion.WatchdogEvent.WatchdogNum); thisRdr = oh_get_rdr_by_id(handle->rptcache, thisEvent->Source, rdrid); if (thisRdr) e->rdrs = g_slist_append(e->rdrs, g_memdup(thisRdr, sizeof(SaHpiRdrT))); else err("Rdr not found for rid %d, rdrid %d\n",thisEvent->Source, rdrid); break; case SAHPI_ET_RESOURCE: case SAHPI_ET_DOMAIN: case SAHPI_ET_SENSOR_ENABLE_CHANGE: case SAHPI_ET_HPI_SW: default: err("Unsupported Event Type=%s.", oh_lookup_eventtype(thisEvent->EventType)); return(SA_ERR_HPI_INTERNAL_ERROR); break; } if (prepend == SAHPI_TRUE) { custom_handle->eventq = g_slist_prepend(custom_handle->eventq, e); } else { custom_handle->eventq = g_slist_append(custom_handle->eventq, e); } return(SA_OK); } openhpi-3.6.1/plugins/snmp_bc/snmp_bc_resources.c0000644000175100017510000200573512575647274021173 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003, 2007 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Sean Dague * Renier Morales * Steve Sherman */ #include /************************************************************************** * Resource Definitions **************************************************************************/ struct snmp_rpt snmp_bc_rpt_array[] = { /* BladeCenter Chassis */ { .rpt = { .ResourceInfo = { .ManufacturerId = IBM_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, } }, .ResourceCapabilities = SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_CRITICAL, .ResourceFailed = SAHPI_FALSE, }, .res_info = { .mib = { .OidReset = '\0', .OidPowerState = '\0', .OidPowerOnOff = '\0', /* bladeCenterUUID */ .OidUuid = ".1.3.6.1.4.1.2.3.51.2.2.21.1.1.4.0", .OidResourceWidth = '\0', }, .cur_state = 0, .prev_state = 0, .event_array = { {}, }, }, .comment = "BladeCenter Chassis", }, /* Virtual Management Module */ { .rpt = { .ResourceInfo = { .ManufacturerId = IBM_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_SYS_MGMNT_MODULE, /* Must be zero for a virtual resource */ .EntityLocation = 0, }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, } }, .ResourceCapabilities = SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_EVENT_LOG | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_CRITICAL, .ResourceFailed = SAHPI_FALSE, }, .res_info = { .mib = { .OidReset = '\0', .OidPowerState = '\0', .OidPowerOnOff = '\0', .OidUuid = '\0', .OidResourceWidth = '\0', }, .cur_state = SAHPI_HS_STATE_ACTIVE, .prev_state = SAHPI_HS_STATE_NOT_PRESENT, .event_array = { {}, }, }, .comment = "Virtual Management Module", }, /* Management Module */ { .rpt = { .ResourceInfo = { .ManufacturerId = IBM_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_SYS_MGMNT_MODULE, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = BLADECENTER_SYS_MGMNT_MODULE_SLOT, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, } }, .ResourceCapabilities = SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_MANAGED_HOTSWAP | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESET | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_MAJOR, .ResourceFailed = SAHPI_FALSE, }, .res_info = { .mib = { /* restartSPImmediately */ .OidReset = ".1.3.6.1.4.1.2.3.51.2.7.4.0", .OidPowerState = '\0', .OidPowerOnOff = '\0', /* mmHardwareVpdUuid */ .OidUuid = ".1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.6.x", .OidResourceWidth = '\0', }, .cur_state = SAHPI_HS_STATE_NOT_PRESENT, .prev_state = SAHPI_HS_STATE_NOT_PRESENT, .event_array = { { .event = "0028200x", /* EN_MM_x_INSTALLED */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_INSERTION_PENDING, .event_auto_state = 0, .recovery_state = SAHPI_HS_STATE_NOT_PRESENT, .recovery_auto_state = 0, }, { .event = "0028400x", /* EN_MM_x_REMOVED */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_NOT_PRESENT, .event_auto_state = 0, .recovery_state = SAHPI_HS_STATE_ACTIVE, .recovery_auto_state = 0, }, {}, }, }, .comment = "Management Module", }, /* I/O Module */ { .rpt = { .ResourceInfo = { .ManufacturerId = IBM_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_SWITCH, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = BLADECENTER_SWITCH_SLOT, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, } }, .ResourceCapabilities = SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_MANAGED_HOTSWAP | SAHPI_CAPABILITY_POWER | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESET | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR, .HotSwapCapabilities = SAHPI_HS_CAPABILITY_AUTOEXTRACT_READ_ONLY, .ResourceSeverity = SAHPI_MAJOR, .ResourceFailed = SAHPI_FALSE, }, .res_info = { .mib = { /* smReset */ .OidReset = ".1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.8.x", /* smCurrentIPInfoPowerState */ .OidPowerState = ".1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.4.x", /* switchModulePowerOnOff */ .OidPowerOnOff = ".1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.7.x", /* smHardwareVpdUuid */ .OidUuid = ".1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.8.x", .OidResourceWidth = '\0', }, .cur_state = SAHPI_HS_STATE_NOT_PRESENT, .prev_state = SAHPI_HS_STATE_NOT_PRESENT, .event_array = { { .event = "0EA0200x", /* EN_SWITCH_x_INSTALLED */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_INACTIVE, .event_auto_state = 0, .recovery_state = 0, .recovery_auto_state = 0, }, { .event = "0EA0800x", /* EN_SWITCH_x_POWERED_ON */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_ACTIVE, .event_auto_state = SAHPI_HS_STATE_INSERTION_PENDING, .recovery_state = 0, .recovery_auto_state = 0, }, { .event = "0EA0600x", /* EN_SWITCH_x_POWERED_OFF */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_INACTIVE, .event_auto_state = SAHPI_HS_STATE_EXTRACTION_PENDING, .recovery_state = 0, .recovery_auto_state = 0, }, { .event = "0EA0400x", /* EN_SWITCH_x_REMOVED */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_NOT_PRESENT, .event_auto_state = 0, .recovery_state = 0, .recovery_auto_state = 0, }, {}, }, }, .comment = "I/0 Module", }, /* Blade */ { .rpt = { .ResourceInfo = { .ManufacturerId = IBM_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = SAHPI_ENT_PHYSICAL_SLOT, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, } }, .ResourceCapabilities = SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_MANAGED_HOTSWAP | SAHPI_CAPABILITY_POWER | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESET | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR, .HotSwapCapabilities = SAHPI_HS_CAPABILITY_AUTOEXTRACT_READ_ONLY, .ResourceSeverity = SAHPI_MAJOR, .ResourceFailed = SAHPI_FALSE, }, .res_info = { .mib = { /* restartBlade */ .OidReset = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.8.x", /* powerRestartBladePowerState */ .OidPowerState = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.4.x", /* powerOnOffBlade */ .OidPowerOnOff = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.7.x", /* bladeHardwareVpdUuid */ .OidUuid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.8.x", /* bladeWidth */ .OidResourceWidth = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.15.x", }, .cur_state = SAHPI_HS_STATE_NOT_PRESENT, .prev_state = SAHPI_HS_STATE_NOT_PRESENT, .event_array = { { .event = "0E00200x", /* EN_BLADE_x_INSTALLED */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_INACTIVE, .event_auto_state = 0, .recovery_state = 0, .recovery_auto_state = 0, }, { .event = "1C000001", /* EN_BLADE_PWR_DWN */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_INACTIVE, .event_auto_state = SAHPI_HS_STATE_EXTRACTION_PENDING, .recovery_state = 0, .recovery_auto_state = 0, }, { .event = "1C000002",/* EN_BLADE_PWR_UP */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_ACTIVE, .event_auto_state = SAHPI_HS_STATE_INSERTION_PENDING, .recovery_state = 0, .recovery_auto_state = 0, }, { .event = "06026080", /* EN_BLADE_PWR_DN_FAN_FAIL */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_INACTIVE, .event_auto_state = SAHPI_HS_STATE_EXTRACTION_PENDING, .recovery_state = SAHPI_HS_STATE_ACTIVE, .recovery_auto_state = SAHPI_HS_STATE_INSERTION_PENDING, }, { .event = "0821C080", /* EN_BLADE_PWR_DN_PM_TEMP */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_INACTIVE, .event_auto_state = SAHPI_HS_STATE_EXTRACTION_PENDING, .recovery_state = SAHPI_HS_STATE_ACTIVE, .recovery_auto_state = SAHPI_HS_STATE_INSERTION_PENDING, }, { .event = "0E00400x", /* EN_BLADE_x_REMOVED */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_NOT_PRESENT, .event_auto_state = 0, .recovery_state = 0, .recovery_auto_state = 0, }, {}, }, }, .comment = "Blade", /* ledBladeName */ .OidResourceTag = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.6.x" }, /* Blade Expansion Module (BEM) */ { .rpt = { .ResourceInfo = { .ManufacturerId = IBM_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_SYS_EXPANSION_BOARD, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = SAHPI_ENT_PHYSICAL_SLOT, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, } }, .ResourceCapabilities = SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_MANAGED_HOTSWAP | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_MAJOR, .ResourceFailed = SAHPI_FALSE, }, .res_info = { .mib = { .OidReset = '\0', .OidPowerState = '\0', .OidPowerOnOff = '\0', /* bladeExpBoardVpdUuid */ .OidUuid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.3.1.8.x", .OidResourceWidth = '\0', }, .cur_state = 0, .prev_state = 0, .event_array = { {}, }, }, .comment = "Expansion Module", }, /* Media Tray */ { .rpt = { .ResourceInfo = { .ManufacturerId = IBM_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_PERIPHERAL_BAY, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = BLADECENTER_PERIPHERAL_BAY_SLOT, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, } }, .ResourceCapabilities = SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_MAJOR, .ResourceFailed = SAHPI_FALSE, }, .res_info = { .mib = { .OidReset = '\0', .OidPowerState = '\0', .OidPowerOnOff = '\0', /* mtHardwareVpdUuid */ .OidUuid = ".1.3.6.1.4.1.2.3.51.2.2.21.9.8.0", .OidResourceWidth = '\0', }, .cur_state = SAHPI_HS_STATE_NOT_PRESENT, .prev_state = SAHPI_HS_STATE_NOT_PRESENT, .event_array = { { .event = "06A02001", /* EN_MEDIA_TRAY_INSTALLED */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_INACTIVE, .event_auto_state = 0, .recovery_state = 0, .recovery_auto_state = 0, }, { .event = "06A1E001", /* EN_MEDIA_TRAY_REMOVED */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_NOT_PRESENT, .event_auto_state = 0, /* still needed for old Recovery Media Tray removed messages */ .recovery_state = SAHPI_HS_STATE_ACTIVE, .recovery_auto_state = 0, }, {}, }, }, .comment = "Media Tray", }, /* Media Tray 2 */ { .rpt = { .ResourceInfo = { .ManufacturerId = IBM_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_PERIPHERAL_BAY, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = BLADECENTER_PERIPHERAL_BAY_SLOT, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, } }, .ResourceCapabilities = SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_MAJOR, .ResourceFailed = SAHPI_FALSE, }, .res_info = { .mib = { .OidReset = '\0', .OidPowerState = '\0', .OidPowerOnOff = '\0', /* mt2HardwareVpdUuid */ .OidUuid = ".1.3.6.1.4.1.2.3.51.2.2.21.10.8.0", .OidResourceWidth = '\0', }, .cur_state = SAHPI_HS_STATE_NOT_PRESENT, .prev_state = SAHPI_HS_STATE_NOT_PRESENT, .event_array = { { .event = "06A02002", /* EN_MEDIA_TRAY_2_INSTALLED */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_INACTIVE, .event_auto_state = 0, .recovery_state = 0, .recovery_auto_state = 0, }, { .event = "06A1E002", /* EN_MEDIA_TRAY_2_REMOVED */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_NOT_PRESENT, .event_auto_state = 0, .recovery_state = 0, .recovery_auto_state = 0, }, {}, }, }, .comment = "Media Tray", }, /* Blower Module */ { .rpt = { .ResourceInfo = { .ManufacturerId = IBM_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_FAN, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = BLADECENTER_BLOWER_SLOT, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, } }, .ResourceCapabilities = SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_MAJOR, .ResourceFailed = SAHPI_FALSE, }, .res_info = { .mib = { .OidReset = '\0', .OidPowerState = '\0', .OidPowerOnOff = '\0', /* blowerHardwareVpdUuid */ .OidUuid = ".1.3.6.1.4.1.2.3.51.2.2.21.13.1.1.8.x", .OidResourceWidth = '\0', }, .cur_state = SAHPI_HS_STATE_NOT_PRESENT, .prev_state = SAHPI_HS_STATE_NOT_PRESENT, .event_array = { { .event = "0A00200x", /* EN_FAN_x_INSTALLED */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_ACTIVE, .event_auto_state = 0, .recovery_state = 0, .recovery_auto_state = 0, }, { .event = "0A02600x", /* EN_FAULT_FANx */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_NOT_PRESENT, .event_auto_state = 0, /* still needed for old Recovery Blower %d Fault messages */ .recovery_state = SAHPI_HS_STATE_ACTIVE, .recovery_auto_state = 0, }, {}, }, }, .comment = "Blower Module", }, /* Power Module */ { .rpt = { .ResourceInfo = { .ManufacturerId = IBM_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_POWER_SUPPLY, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = BLADECENTER_POWER_SUPPLY_SLOT, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, } }, .ResourceCapabilities = SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_MAJOR, .ResourceFailed = SAHPI_FALSE, }, .res_info = { .mib = { .OidReset = '\0', .OidPowerState = '\0', .OidPowerOnOff = '\0', /* pmHardwareVpdUuid */ .OidUuid = ".1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.8.x", .OidResourceWidth = '\0', }, .cur_state = SAHPI_HS_STATE_NOT_PRESENT, .prev_state = SAHPI_HS_STATE_NOT_PRESENT, .event_array = { { .event = "0821600x", /* EN_PSx_INSTALLED */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_ACTIVE, .event_auto_state = 0, .recovery_state = SAHPI_HS_STATE_NOT_PRESENT, .recovery_auto_state = 0, }, { .event = "0821E00x", /* EN_FAULT_PSx_REMOVED */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_NOT_PRESENT, .event_auto_state = 0, .recovery_state = SAHPI_HS_STATE_ACTIVE, .recovery_auto_state = 0, }, {}, }, }, .comment = "Power Module", }, /* Slot */ { .rpt = { .ResourceInfo = { .ManufacturerId = IBM_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { /* dummy setting - set during discovery */ .EntityType = SAHPI_ENT_CHASSIS_SPECIFIC, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, } }, .ResourceCapabilities = SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_MAJOR, .ResourceFailed = SAHPI_FALSE, }, .res_info = { .mib = { .OidReset = '\0', .OidPowerState = '\0', .OidPowerOnOff = '\0', .OidUuid = '\0', .OidResourceWidth = '\0', }, .cur_state = SAHPI_HS_STATE_ACTIVE, .prev_state = SAHPI_HS_STATE_ACTIVE, .event_array = { {}, }, }, .comment = "Slot", }, /* BEM DASD */ { .rpt = { .ResourceInfo = { .ManufacturerId = IBM_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_DISK_DRIVE, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = SAHPI_ENT_SYS_EXPANSION_BOARD, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = SAHPI_ENT_PHYSICAL_SLOT, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, } }, .ResourceCapabilities = SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_MAJOR, .ResourceFailed = SAHPI_FALSE, }, .res_info = { .mib = { .OidReset = '\0', .OidPowerState = '\0', .OidPowerOnOff = '\0', .OidUuid = '\0', .OidResourceWidth = '\0', }, .cur_state = SAHPI_HS_STATE_ACTIVE, .prev_state = SAHPI_HS_STATE_ACTIVE, .event_array = { /* remove from BEM Operational Sensor, if DASD becomes a resource */ { .event = "0681E00x", /* EN_DASD1_REMOVED_DRIVE_x */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_NOT_PRESENT, .event_auto_state = 0, .recovery_state = SAHPI_HS_STATE_ACTIVE, .recovery_auto_state = 0, }, {}, }, }, .comment = "BEM DASD", }, /* Alarm Panel Module */ { .rpt = { .ResourceInfo = { .ManufacturerId = IBM_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_DISPLAY_PANEL, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = BLADECENTER_ALARM_PANEL_SLOT, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, } }, .ResourceCapabilities = SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_MAJOR, .ResourceFailed = SAHPI_FALSE, }, .res_info = { .mib = { .OidReset = '\0', .OidPowerState = '\0', .OidPowerOnOff = '\0', /* tapHardwareVpdUuid */ .OidUuid = ".1.3.6.1.4.1.2.3.51.2.2.21.15.8.0", .OidResourceWidth = '\0', }, .cur_state = SAHPI_HS_STATE_ACTIVE, .prev_state = SAHPI_HS_STATE_ACTIVE, .event_array = { { .event = "6F60A001", /* EN_AP_INSTALLED */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_ACTIVE, .event_auto_state = 0, .recovery_state = SAHPI_HS_STATE_NOT_PRESENT, .recovery_auto_state = 0, }, { .event = "6F60A002", /* EN_AP_REMOVED */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_NOT_PRESENT, .event_auto_state = 0, .recovery_state = SAHPI_HS_STATE_ACTIVE, .recovery_auto_state = 0, }, {}, }, }, .comment = "Alarm Panel Module", }, /* Multiplexer Expansion Module */ { .rpt = { .ResourceInfo = { .ManufacturerId = IBM_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_OTHER_CHASSIS_BOARD, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = BLADECENTER_MUX_SLOT, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, } }, .ResourceCapabilities = SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_MAJOR, .ResourceFailed = SAHPI_FALSE, }, .res_info = { .mib = { .OidReset = '\0', .OidPowerState = '\0', .OidPowerOnOff = '\0', /* mxHardwareVpdUuid */ .OidUuid = ".1.3.6.1.4.1.2.3.51.2.2.21.17.1.1.8.x", .OidResourceWidth = '\0', }, .cur_state = SAHPI_HS_STATE_ACTIVE, .prev_state = SAHPI_HS_STATE_ACTIVE, .event_array = { { .event = "6F60800x", /* EN_MX_x_INSTALLED */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_ACTIVE, .event_auto_state = 0, .recovery_state = SAHPI_HS_STATE_NOT_PRESENT, .recovery_auto_state = 0, }, { .event = "6F60900x", /* EN_MX_x_REMOVED */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_NOT_PRESENT, .event_auto_state = 0, .recovery_state = SAHPI_HS_STATE_ACTIVE, .recovery_auto_state = 0, }, {}, }, }, .comment = "Multiplexer Expansion Module", }, /* Network Clock Module */ { .rpt = { .ResourceInfo = { .ManufacturerId = IBM_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { /* FIXME:: SAHPI_ENT_CLOCK */ .EntityType = SAHPI_ENT_BATTERY + 13, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = BLADECENTER_CLOCK_SLOT, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, } }, .ResourceCapabilities = SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_MAJOR, .ResourceFailed = SAHPI_FALSE, }, .res_info = { .mib = { .OidReset = '\0', .OidPowerState = '\0', .OidPowerOnOff = '\0', /* ncHardwareVpdUuid */ .OidUuid = ".1.3.6.1.4.1.2.3.51.2.2.21.16.1.1.8.x", .OidResourceWidth = '\0', }, .cur_state = SAHPI_HS_STATE_ACTIVE, .prev_state = SAHPI_HS_STATE_ACTIVE, .event_array = { { .event = "6F60600x", /* EN_NC_x_INSTALLED */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_ACTIVE, .event_auto_state = 0, .recovery_state = SAHPI_HS_STATE_NOT_PRESENT, .recovery_auto_state = 0, }, { .event = "6F60700x", /* EN_NC_x_REMOVED */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_NOT_PRESENT, .event_auto_state = 0, .recovery_state = SAHPI_HS_STATE_ACTIVE, .recovery_auto_state = 0, }, {}, }, }, .comment = "Network Clock Module", }, /* Front Bezel */ { .rpt = { .ResourceInfo = { .ManufacturerId = IBM_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { /* FIXME:: SAHPI_ENT_FILTRATION_UNIT */ .EntityType = SAHPI_ENT_PHYSICAL_SLOT + 3, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, } }, .ResourceCapabilities = SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_MAJOR, .ResourceFailed = SAHPI_FALSE, }, .res_info = { .mib = { .OidReset = '\0', .OidPowerState = '\0', .OidPowerOnOff = '\0', .OidUuid = '\0', .OidResourceWidth = '\0', }, .cur_state = SAHPI_HS_STATE_ACTIVE, .prev_state = SAHPI_HS_STATE_ACTIVE, .event_array = { { .event = "6F60B001", /* EN_FB_INSTALLED */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_ACTIVE, .event_auto_state = 0, .recovery_state = SAHPI_HS_STATE_NOT_PRESENT, .recovery_auto_state = 0, }, { .event = "6F60B101", /* EN_FB_REMOVED */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_NOT_PRESENT, .event_auto_state = 0, .recovery_state = SAHPI_HS_STATE_ACTIVE, .recovery_auto_state = 0, }, {}, }, }, .comment = "Front Bezel", }, /* I/O Module Interposer */ { .rpt = { .ResourceInfo = { .ManufacturerId = IBM_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_INTERCONNECT, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = BLADECENTER_SWITCH_SLOT, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, } }, .ResourceCapabilities = SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE, .ResourceSeverity = SAHPI_MAJOR, .ResourceFailed = SAHPI_FALSE, }, .res_info = { .mib = { .OidReset = '\0', .OidPowerState = '\0', .OidPowerOnOff = '\0', /* smInpHardwareVpdUuid */ .OidUuid = ".1.3.6.1.4.1.2.3.51.2.2.21.6.2.1.8.x", .OidResourceWidth = '\0', }, .cur_state = SAHPI_HS_STATE_ACTIVE, .prev_state = SAHPI_HS_STATE_ACTIVE, .event_array = { { .event = "6F60200x", /* EN_IO_INP_x_INSTALLED */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_ACTIVE, .event_auto_state = 0, .recovery_state = SAHPI_HS_STATE_NOT_PRESENT, .recovery_auto_state = 0, }, { .event = "6F60300x", /* EN_IO_INP_x_REMOVED */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_NOT_PRESENT, .event_auto_state = 0, .recovery_state = SAHPI_HS_STATE_ACTIVE, .recovery_auto_state = 0, }, {}, }, }, .comment = "I/O Module Interposer", }, /* Management Module Interposer */ { .rpt = { .ResourceInfo = { .ManufacturerId = IBM_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_INTERCONNECT, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = BLADECENTER_SYS_MGMNT_MODULE_SLOT, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, } }, .ResourceCapabilities = SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE, .ResourceSeverity = SAHPI_MAJOR, .ResourceFailed = SAHPI_FALSE, }, .res_info = { .mib = { .OidReset = '\0', .OidPowerState = '\0', .OidPowerOnOff = '\0', /* mmInpHardwareVpdUuid */ .OidUuid = ".1.3.6.1.4.1.2.3.51.2.2.21.2.2.1.6.x", .OidResourceWidth = '\0', }, .cur_state = SAHPI_HS_STATE_ACTIVE, .prev_state = SAHPI_HS_STATE_ACTIVE, .event_array = { { .event = "6F60000x", /* EN_MM_INP_x_INSTALLED */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_ACTIVE, .event_auto_state = 0, .recovery_state = SAHPI_HS_STATE_NOT_PRESENT, .recovery_auto_state = 0, }, { .event = "6F60100x", /* EN_MM_INP_x_REMOVED */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_NOT_PRESENT, .event_auto_state = 0, .recovery_state = SAHPI_HS_STATE_ACTIVE, .recovery_auto_state = 0, }, {}, }, }, .comment = "Management Module Interposer", }, {} /* Terminate array with a null element */ }; /************************************************************************* * Sensor Definitions *************************************************************************/ /************************************************************************* * WARNING - WARNING - WARNING - WARNING * Most of the .sensor.num are assigned sequentially. * There are 8 hardcoded, specifically assigned, sensor numbers: * * SAHPI_DEFAGSENS_OPER (SaHpiSensorNumT)0x00000100 * BLADECENTER_SENSOR_NUM_MGMNT_REDUNDANCY (SaHpiSensorNumT) 0x1001 * BLADECENTER_SENSOR_NUM_MGMNT_ACTIVE (SaHpiSensorNumT) 0x1002 * BLADECENTER_SENSOR_NUM_MGMNT_STANDBY (SaHpiSensorNumT) 0x1003 * BLADECENTER_SENSOR_NUM_SLOT_STATE (SaHpiSensorNumT) 0x1010 * BLADECENTER_SENSOR_NUM_MAX_POWER (SaHpiSensorNumT) 0x1012 * BLADECENTER_SENSOR_NUM_ASSIGNED_POWER (SaHpiSensorNumT) 0x1011 * BLADECENTER_SENSOR_NUM_MIN_POWER (SaHpiSensorNumT) 0x1013 *************************************************************************/ /***************** * Chassis Sensors *****************/ struct snmp_bc_sensor snmp_bc_chassis_sensors[] = { /* Ambient Air Temperature Sensor */ { .index = 1, .sensor = { .Num = 1, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, .ReadThold = 0, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* frontPanelTemp */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.1.5.1.0", .loc_offset = 0, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "6F400000", /* EN_FAULT_CRT_AMBIENT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR, }, { .event = "0001D500", /* EN_PFA_HI_OVER_TEMP_AMBIENT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = { { .num = 1, .rangemap = { .Flags = SAHPI_SRF_MIN, .Min = { .Value = { .SensorFloat64 = 39.0, }, }, }, .state = SAHPI_ES_UNSPECIFIED, }, { .num = 2, .rangemap = { .Flags = SAHPI_SRF_MAX, .Max = { .Value = { .SensorFloat64 = 39.0, }, }, }, .state = SAHPI_ES_UPPER_MAJOR, }, { .num = 3, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Nominal = { .Value = { .SensorFloat64 = 39.0, }, }, }, .state = SAHPI_ES_UNSPECIFIED, }, {}, }, }, .comment = "Ambient Air Temperature Sensor", }, /* I/O Module Redundancy Sensor - event-only */ { .index = 2, .sensor = { .Num = 2, .Type = SAHPI_PLATFORM_ALERT, .Category = SAHPI_EC_REDUNDANCY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_REDUNDANCY_LOST | SAHPI_ES_FULLY_REDUNDANT, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_FULLY_REDUNDANT, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_REDUNDANCY_LOST, .deassert_mask = SAHPI_ES_REDUNDANCY_LOST, .event_array = { { .event = "0EA16000", /* EN_SWITCH_NON_REDUNDANT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_REDUNDANCY_LOST, .recovery_state = SAHPI_ES_FULLY_REDUNDANT, }, {}, }, .reading2event = {}, }, .comment = "I/O Module Redundancy Sensor", }, /* Power Module Redundancy Sensor - event-only */ { .index = 3, .sensor = { .Num = 3, .Type = SAHPI_PLATFORM_ALERT, .Category = SAHPI_EC_REDUNDANCY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_REDUNDANCY_LOST | SAHPI_ES_FULLY_REDUNDANT, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_FULLY_REDUNDANT, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_REDUNDANCY_LOST, .deassert_mask = SAHPI_ES_REDUNDANCY_LOST, .event_array = { { .event = "08080001", /* EN_NR_PWR_SUPPLY */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_REDUNDANCY_LOST, .recovery_state = SAHPI_ES_FULLY_REDUNDANT, }, { .event = "08081001", /* EN_NR_PWR_SUPPLY_DOM_1 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_REDUNDANCY_LOST, .recovery_state = SAHPI_ES_FULLY_REDUNDANT, }, { .event = "08081002", /* EN_NR_PWR_SUPPLY_DOM_2 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_REDUNDANCY_LOST, .recovery_state = SAHPI_ES_FULLY_REDUNDANT, }, {}, }, .reading2event = {}, }, .comment = "Power Module Redundancy Sensor", }, /* Power Domain 1 Redundancy Sensor - event-only */ { .index = 4, .sensor = { .Num = 4, .Type = SAHPI_PLATFORM_ALERT, .Category = SAHPI_EC_REDUNDANCY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_REDUNDANCY_LOST | SAHPI_ES_FULLY_REDUNDANT, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_FULLY_REDUNDANT, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_REDUNDANCY_LOST, .deassert_mask = SAHPI_ES_REDUNDANCY_LOST, .event_array = { { .event = "08008401", /* EN_PWR_DOMAIN_1_OVER_SUBSCRIP */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_REDUNDANCY_LOST, .recovery_state = SAHPI_ES_FULLY_REDUNDANT, }, { .event = "08008401", /* EN_PWR_DOMAIN_1_OVER_SUBSCRIP_NONREC */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_REDUNDANCY_LOST, .recovery_state = SAHPI_ES_FULLY_REDUNDANT, }, {}, }, .reading2event = {}, }, .comment = "Power Domain 1 Redundancy Sensor", }, /* Power Domain 2 Redundancy Sensor - event-only */ { .index = 5, .sensor = { .Num = 5, .Type = SAHPI_PLATFORM_ALERT, .Category = SAHPI_EC_REDUNDANCY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_REDUNDANCY_LOST | SAHPI_ES_FULLY_REDUNDANT, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_FULLY_REDUNDANT, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_REDUNDANCY_LOST, .deassert_mask = SAHPI_ES_REDUNDANCY_LOST, .event_array = { { .event = "08008402", /* EN_PWR_DOMAIN_2_OVER_SUBSCRIP_NONREC */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_REDUNDANCY_LOST, .recovery_state = SAHPI_ES_FULLY_REDUNDANT, }, {}, }, .reading2event = {}, }, .comment = "Power Domain 2 Redundancy Sensor", }, /* Chassis Total Maximum Power Capability Sensor */ { .index = 6, .sensor = { .Num = BLADECENTER_SENSOR_NUM_MAX_POWER, .Type = SAHPI_OTHER_UNITS_BASED_SENSOR, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = 0, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64, .BaseUnits = SAHPI_SU_WATTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = {}, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* pd1ModuleAllocatedPowerMax */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.8.1", .threshold_oids = {}, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_FALSE, .assert_mask = 0, .deassert_mask = 0, .event_array = { {}, }, .reading2event = {}, }, .comment = "Chassis Total Maximum Power Capability Sensor", }, /* Chassis Total Assigned Power Sensor */ { .index = 7, .sensor = { .Num = BLADECENTER_SENSOR_NUM_ASSIGNED_POWER, .Type = SAHPI_OTHER_UNITS_BASED_SENSOR, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = 0, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64, .BaseUnits = SAHPI_SU_WATTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = {}, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, .ReadThold = 0, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* pd1ModuleAllocatedPowerCurrent */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.7.1", .threshold_oids = {}, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_FALSE, .assert_mask = 0, .deassert_mask = 0, .event_array = { {}, }, .reading2event = {}, }, .comment = "Chassis Total Assigned Power Sensor", }, /* Chassis Total Minumum Power Capability Sensor */ { .index = 8, .sensor = { .Num = BLADECENTER_SENSOR_NUM_MIN_POWER, .Type = SAHPI_OTHER_UNITS_BASED_SENSOR, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = 0, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64, .BaseUnits = SAHPI_SU_WATTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = {}, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, .ReadThold = 0, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* pd1ModuleAllocatedPowerMin */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.9.1", .threshold_oids = {}, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_FALSE, .assert_mask = 0, .deassert_mask = 0, .event_array = { {}, }, .reading2event = {}, }, .comment = "Chassis Total Minumum Power Capability Sensor", }, {} /* Terminate array with a null element */ }; #define SNMP_BC_MAX_COMMON_CHASSIS_SENSORS 8 struct snmp_bc_sensor snmp_bc_chassis_sensors_bct_filter[] = { /* Chassis Filter Sensor - event only */ { .index = SNMP_BC_MAX_COMMON_CHASSIS_SENSORS + 1, .sensor = { .Num = SNMP_BC_MAX_COMMON_CHASSIS_SENSORS + 1, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_SEVERITY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_OK | SAHPI_ES_MINOR_FROM_OK | SAHPI_ES_INFORMATIONAL | SAHPI_ES_MAJOR_FROM_LESS | SAHPI_ES_CRITICAL, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_OK, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_OK | SAHPI_ES_MINOR_FROM_OK | SAHPI_ES_INFORMATIONAL | SAHPI_ES_MAJOR_FROM_LESS | SAHPI_ES_CRITICAL, .deassert_mask = SAHPI_ES_OK | SAHPI_ES_MINOR_FROM_OK | SAHPI_ES_INFORMATIONAL | SAHPI_ES_MAJOR_FROM_LESS | SAHPI_ES_CRITICAL, .event_array = { { .event = "6F100000", /* EN_FAULT_CRT_FILTER */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_CRITICAL, .recovery_state = SAHPI_ES_MAJOR_FROM_LESS, }, { .event = "6F200000", /* EN_FAULT_MJR_FILTER */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_MAJOR_FROM_LESS, .recovery_state = SAHPI_ES_MINOR_FROM_OK, }, { .event = "6F300000", /* EN_FAULT_MNR_FILTER */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_MINOR_FROM_OK, .recovery_state = SAHPI_ES_OK, }, { .event = "6F500000", /* EN_FAULT_MNR_FILTER_SERVICE */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_INFORMATIONAL, .recovery_state = SAHPI_ES_OK, }, }, .reading2event = {}, }, .comment = "Chassis Filter Sensor", }, {} /* Terminate array with a null element */ }; /*********************************** * Virtual Management Module Sensors ***********************************/ struct snmp_bc_sensor snmp_bc_virtual_mgmnt_sensors[] = { /* MM Air Temperature */ { .index = 1, .sensor = { .Num = 1, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, .ReadThold = 0, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* mmTemp */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.1.1.2.0", .loc_offset = 0, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "0001D400", /* EN_PFA_HI_OVER_TEMP_SP_CARD */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = { { .num = 1, .rangemap = { .Flags = SAHPI_SRF_MIN, .Min = { .Value = { .SensorFloat64 = 60.0, }, }, }, .state = SAHPI_ES_UNSPECIFIED, }, { .num = 2, .rangemap = { .Flags = SAHPI_SRF_MAX, .Max = { .Value = { .SensorFloat64 = 60.0, }, }, }, .state = SAHPI_ES_UPPER_MAJOR, }, { .num = 3, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Nominal = { .Value = { .SensorFloat64 = 60.0, }, }, }, .state = SAHPI_ES_UNSPECIFIED, }, {}, }, }, .comment = "MM Air Temperature Sensor", }, /* System 1.8 Volt Sensor */ { .index = 2, .sensor = { .Num = 2, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 4.4, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 1.8, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_CRIT | SAHPI_STM_UP_CRIT | SAHPI_STM_LOW_HYSTERESIS | SAHPI_STM_UP_HYSTERESIS, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* plus1Pt8Volt */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.2.1.8.0", .loc_offset = 0, .threshold_oids = { /* voltageThresholdEntryWarningLowValue */ .LowCritical = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.10.6", /* voltageThresholdEntryWarningHighValue */ .UpCritical = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.6.6", /* voltageThresholdEntryWarningResetHighValue */ .TotalPosThdHysteresis = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.7.6", /* voltageThresholdEntryWarningResetLowValue */ .TotalNegThdHysteresis = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.11.6", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "0807B401", /* EN_I2C_HI_FAULT_1_8V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0807B801", /* EN_I2C_LO_FAULT_1_8V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_CRIT, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "System 1.8 Volt Sensor", }, /* System 2.5 Volt Sensor */ { .index = 3, .sensor = { .Num = 3, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 4.4, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 2.5, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_CRIT | SAHPI_STM_UP_CRIT | SAHPI_STM_LOW_HYSTERESIS | SAHPI_STM_UP_HYSTERESIS, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* plus2Pt5Volt */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.2.1.6.0", .loc_offset = 0, .threshold_oids = { /* voltageThresholdEntryWarningLowValue */ .LowCritical = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.10.5", /* voltageThresholdEntryWarningHighValue */ .UpCritical = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.6.5", /* voltageThresholdEntryWarningResetHighValue */ .TotalPosThdHysteresis = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.7.5", /* voltageThresholdEntryWarningResetLowValue */ .TotalNegThdHysteresis = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.11.5", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "08031481", /* EN_I2C_HI_FAULT_2_5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "08031881", /* EN_I2C_LO_FAULT_2_5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_CRIT, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "System 2.5 Volt Sensor", }, /* System 3.3 Volt Sensor */ { .index = 4, .sensor = { .Num = 4, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 3.6, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 3.3, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_CRIT | SAHPI_STM_UP_CRIT | SAHPI_STM_LOW_HYSTERESIS | SAHPI_STM_UP_HYSTERESIS, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* plus3Pt3Volt */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.2.1.2.0", .loc_offset = 0, .threshold_oids = { /* voltageThresholdEntryWarningLowValue */ .LowCritical = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.10.2", /* voltageThresholdEntryWarningHighValue */ .UpCritical = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.6.2", /* voltageThresholdEntryWarningResetHighValue */ .TotalPosThdHysteresis = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.7.2", /* voltageThresholdEntryWarningResetLowValue */ .TotalNegThdHysteresis = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.11.2", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "08033481", /* EN_I2C_HI_FAULT_3_35V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "FF000000", /* EN_I2C_LO_FAULT_3_35V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_CRIT, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "System 3.3 Volt Sensor", }, /* System 5 Volt Sensor */ { .index = 5, .sensor = { .Num = 5, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 6.7, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 5, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_CRIT | SAHPI_STM_UP_CRIT | SAHPI_STM_LOW_HYSTERESIS | SAHPI_STM_UP_HYSTERESIS, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* plus5Volt */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.2.1.1.0", .loc_offset = 0, .threshold_oids = { /* voltageThresholdEntryWarningLowValue */ .LowCritical = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.10.1", /* voltageThresholdEntryWarningHighValue */ .UpCritical = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.6.1", /* voltageThresholdEntryWarningResetHighValue */ .TotalPosThdHysteresis = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.7.1", /* voltageThresholdEntryWarningResetLowValue */ .TotalNegThdHysteresis = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.11.1", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "FF000001", /* EN_I2C_HI_FAULT_PLANAR_5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "06035801", /* EN_I2C_LO_FAULT_PLANAR_5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_CRIT, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "System 5 Volt Sensor", }, /* System -5 Volt Sensor */ { .index = 6, .sensor = { .Num = 6, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = -5, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = -6.7, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_CRIT | SAHPI_STM_UP_CRIT | SAHPI_STM_LOW_HYSTERESIS | SAHPI_STM_UP_HYSTERESIS, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* minus5Volt */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.2.1.5.0", .loc_offset = 0, .threshold_oids = { /* voltageThresholdEntryWarningLowValue */ .LowCritical = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.10.4", /* voltageThresholdEntryWarningHighValue */ .UpCritical = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.6.4", /* voltageThresholdEntryWarningResetHighValue */ .TotalPosThdHysteresis = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.7.4", /* voltageThresholdEntryWarningResetLowValue */ .TotalNegThdHysteresis = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.11.4", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "0803D501", /* EN_I2C_HI_FAULT_N5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0803D801", /* EN_I2C_LO_FAULT_N5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_CRIT, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "System -5 Volt Sensor", }, /* System 12 Volt Sensor */ { .index = 7, .sensor = { .Num = 7, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 16, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 12, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_CRIT | SAHPI_STM_UP_CRIT | SAHPI_STM_LOW_HYSTERESIS | SAHPI_STM_UP_HYSTERESIS, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* plus12Volt */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.2.1.3.0", .loc_offset = 0, .threshold_oids = { /* voltageThresholdEntryWarningLowValue */ .LowCritical = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.10.3", /* voltageThresholdEntryWarningHighValue */ .UpCritical = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.6.3", /* voltageThresholdEntryWarningResetHighValue */ .TotalPosThdHysteresis = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.7.3", /* voltageThresholdEntryWarningResetLowValue */ .TotalNegThdHysteresis = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.11.3", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "06037503", /* EN_I2C_HI_FAULT_12V_PLANAR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "06037801", /* EN_I2C_LO_FAULT_12V_PLANAR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_CRIT, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "System 12 Volt Sensor", }, /* System Management Bus Operational State Sensor - event only */ { .index = 8, .sensor = { .Num = 8, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_AVAILABILITY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_RUNNING | SAHPI_ES_DEGRADED | SAHPI_ES_OFF_LINE, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_RUNNING, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_DEGRADED | SAHPI_ES_OFF_LINE, .deassert_mask = SAHPI_ES_DEGRADED | SAHPI_ES_OFF_LINE, .event_array = { { .event = "00020000", /* EN_I2C_BUS_0_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00020001", /* EN_I2C_BUS_1_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00020002", /* EN_I2C_BUS_2_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00020003", /* EN_I2C_BUS_3_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00020004", /* EN_I2C_BUS_4_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00020005", /* EN_I2C_BUS_5_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00020006", /* EN_I2C_BUS_6_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00020007", /* EN_I2C_BUS_7_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00020008", /* EN_I2C_BUS_8_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00020009", /* EN_I2C_BUS_9_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0002000A", /* EN_I2C_BUS_10_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0002000B", /* EN_I2C_BUS_11_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0002000C", /* EN_I2C_BUS_12_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0002000D", /* EN_I2C_BUS_13_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0002000E", /* EN_I2C_BUS_14_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0002000F", /* EN_I2C_BUS_15_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00020010", /* EN_I2C_BUS_16_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00020011", /* EN_I2C_BUS_17_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00020012", /* EN_I2C_BUS_18_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00020013", /* EN_I2C_BUS_19_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00020014", /* EN_I2C_BUS_20_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00020015", /* EN_I2C_BUS_21_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00020016", /* EN_I2C_BUS_22_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00020017", /* EN_I2C_BUS_23_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00020018", /* EN_I2C_BUS_24_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00020019", /* EN_I2C_BUS_25_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0002001A", /* EN_I2C_BUS_26_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00216015", /* EN_SP_CTRL_OFFLINE */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00216016", /* EN_SP_CTRL_UNAVAILABLE */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022014", /* EN_STCONN_FAIL_MIDPLANE */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00216014", /* EN_SP_CTRL_DEGRADED */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00216013", /* EN_SP_SENSOR_DEGRADED */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00216000", /* EN_IPMI_BMC_COMM_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00101007", /* EN_UNABLE_ISLOATE_BUS */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00103000", /* EN_MGMT_BUS_FAULT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, {}, }, .reading2event = {}, }, .comment = "System Management Bus Operational State Sensor", }, /* MM Redundancy Sensor - event-only */ { .index = 9, .sensor = { .Num = BLADECENTER_SENSOR_NUM_MGMNT_REDUNDANCY, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_REDUNDANCY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_FULLY_REDUNDANT | SAHPI_ES_NON_REDUNDANT_SUFFICIENT_RESOURCES, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_NON_REDUNDANT_SUFFICIENT_RESOURCES | SAHPI_ES_FULLY_REDUNDANT, .deassert_mask = SAHPI_ES_NON_REDUNDANT_SUFFICIENT_RESOURCES | SAHPI_ES_FULLY_REDUNDANT, .event_array = { { .event = "00284000", /* EN_MM_NON_REDUNDANT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_NON_REDUNDANT_SUFFICIENT_RESOURCES, .recovery_state = SAHPI_ES_FULLY_REDUNDANT, }, {}, }, .reading2event = {}, }, .comment = "MM Redundancy Sensor", }, /* Active MM Sensor */ { .index = 10, .sensor = { .Num = BLADECENTER_SENSOR_NUM_MGMNT_ACTIVE, .Type = SAHPI_ENTITY_PRESENCE, .Category = SAHPI_EC_PRESENCE, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_PRESENT | SAHPI_ES_ABSENT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64, .BaseUnits = SAHPI_SU_UNSPECIFIED, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = {} }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* chassisActiveMM */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.4.34.0", .loc_offset = 0, }, .cur_state = SAHPI_ES_PRESENT, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_FALSE, .assert_mask = 0, .deassert_mask = 0, .event_array = { {}, }, .reading2event = {}, }, .comment = "Active MM Sensor", }, /* Standby MM Sensor */ { .index = 11, .sensor = { .Num = BLADECENTER_SENSOR_NUM_MGMNT_STANDBY, .Type = SAHPI_ENTITY_PRESENCE, .Category = SAHPI_EC_PRESENCE, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_PRESENT | SAHPI_ES_ABSENT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64, .BaseUnits = SAHPI_SU_UNSPECIFIED, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = {} }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* chassisActiveMM */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.4.34.0", .loc_offset = 0, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_FALSE, .assert_mask = 0, .deassert_mask = 0, .event_array = { {}, }, .reading2event = {}, }, .comment = "Standby MM Sensor", }, /* Midplane Maximum Power Capability Sensor */ { .index = 12, .sensor = { .Num = BLADECENTER_SENSOR_NUM_MAX_POWER, .Type = SAHPI_OTHER_UNITS_BASED_SENSOR, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = 0, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64, .BaseUnits = SAHPI_SU_WATTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = {}, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* pd1ModuleAllocatedPowerMax */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.8.1", .threshold_oids = {}, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_FALSE, .assert_mask = 0, .deassert_mask = 0, .event_array = { {}, }, .reading2event = {}, }, .comment = "Midplane Maximum Power Capability Sensor", }, /* Midplane Assigned Power Sensor */ { .index = 13, .sensor = { .Num = BLADECENTER_SENSOR_NUM_ASSIGNED_POWER, .Type = SAHPI_OTHER_UNITS_BASED_SENSOR, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = 0, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64, .BaseUnits = SAHPI_SU_WATTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = 0x00, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, .ReadThold = 0, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* pd1ModuleAllocatedPowerCurrent */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.7.1", .threshold_oids = {}, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_FALSE, .assert_mask = 0x00, .deassert_mask = 0x00, .event_array = { {}, }, .reading2event = {}, }, .comment = "Midplane Assigned Power Sensor", }, /* Midplane Minumum Power Capability Sensor */ { .index = 14, .sensor = { .Num = BLADECENTER_SENSOR_NUM_MIN_POWER, .Type = SAHPI_OTHER_UNITS_BASED_SENSOR, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = 0, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64, .BaseUnits = SAHPI_SU_WATTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = {}, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, .ReadThold = 0, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* pd1ModuleAllocatedPowerMin */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.9.1", .threshold_oids = {}, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_FALSE, .assert_mask = 0, .deassert_mask = 0, .event_array = { {}, }, .reading2event = {}, }, .comment = "Midplane Minumum Power Capability Sensor", }, {} /* Terminate array with a null element */ }; /*************************** * Management Module Sensors ***************************/ struct snmp_bc_sensor snmp_bc_mgmnt_sensors[] = { /* MM Operational Status Sensor - event only */ { .index = 1, .sensor = { .Num = 1, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_AVAILABILITY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_RUNNING | SAHPI_ES_DEGRADED | SAHPI_ES_OFF_LINE | SAHPI_ES_INSTALL_ERROR, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_RUNNING, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_DEGRADED | SAHPI_ES_OFF_LINE | SAHPI_ES_INSTALL_ERROR, .deassert_mask = SAHPI_ES_DEGRADED | SAHPI_ES_OFF_LINE | SAHPI_ES_INSTALL_ERROR, .event_array = { { .event = "00222000", /* EN_OTHER_I2C */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0002201E", /* EN_STCONN_FAIL_OTHERMM */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0002201B", /* EN_STBIST_FAIL_R_BOOT_ROM */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022052", /* EN_STBIST_FAIL_R_CORE_1 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022053", /* EN_STBIST_FAIL_R_CORE_2 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022019", /* EN_STBIST_FAIL_R_CPLD */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0002201C", /* EN_STBIST_FAIL_R_ENET_PORT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0002201D", /* EN_STBIST_FAIL_R_ENET_SWITCH */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022016", /* EN_STBIST_FAIL_R_I2C */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022017", /* EN_STBIST_FAIL_R_PRI_FS */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022015", /* EN_STBIST_FAIL_R_RTC */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022018", /* EN_STBIST_FAIL_R_SEC_FS */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00014034", /* EN_FAULT_OC_USB_HUB */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00014033", /* EN_FAULT_OC_USB_PORT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0002200B", /* EN_STBIST_FAIL_ADC */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022007", /* EN_STBIST_FAIL_BOOT_ROM */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022058", /* EN_STBIST_FAIL_CORE_1 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022059", /* EN_STBIST_FAIL_CORE_2 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0002205A", /* EN_STBIST_FAIL_CPLD */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022008", /* EN_STBIST_FAIL_ENET_PORT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0002200A", /* EN_STBIST_FAIL_ENET_SWITCH */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022004", /* EN_STBIST_FAIL_I2C */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022009", /* EN_STBIST_FAIL_I2C_DEVICE */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022005", /* EN_STBIST_FAIL_PRI_FS */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022001", /* EN_STBIST_FAIL_R485_1 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022002", /* EN_STBIST_FAIL_R485_2 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022013", /* EN_STBIST_FAIL_RPSERV */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022003", /* EN_STBIST_FAIL_RTC */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022006", /* EN_STBIST_FAIL_SEC_FS */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022011", /* EN_STBIST_FAIL_USB_1 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022012", /* EN_STBIST_FAIL_USB_2 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022054", /* EN_STBIST_FAIL_USB_I2C_1 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022055", /* EN_STBIST_FAIL_USB_I2C_2 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "06000000", /* EN_SYSTEM_BATTERY_FAILURE */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00282005", /* EN_MM_MISMATCHED */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_INSTALL_ERROR, .recovery_state = SAHPI_ES_RUNNING, }, {}, }, .reading2event = {}, }, .comment = "MM Operational Status Sensor", }, {} /* Terminate array with a null element */ }; struct snmp_bc_sensor snmp_bc_mgmnt_health_sensors[] = { /* MM Operational Status Sensor for platforms supporting MM Health OID */ { .index = 1, .sensor = { .Num = 1, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_AVAILABILITY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_RUNNING | SAHPI_ES_DEGRADED | SAHPI_ES_OFF_LINE | SAHPI_ES_INSTALL_ERROR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_INT64, .BaseUnits = SAHPI_SU_UNSPECIFIED, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_INT64, .Value = { .SensorInt64 = 3, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_INT64, .Value = { .SensorInt64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* mmHealthState */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.5.1.1.5.x", .loc_offset = 0, }, .cur_state = SAHPI_ES_RUNNING, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_DEGRADED | SAHPI_ES_OFF_LINE | SAHPI_ES_INSTALL_ERROR, .deassert_mask = SAHPI_ES_DEGRADED | SAHPI_ES_OFF_LINE | SAHPI_ES_INSTALL_ERROR, .event_array = { { .event = "00222000", /* EN_OTHER_I2C */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0002201E", /* EN_STCONN_FAIL_OTHERMM */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0002201B", /* EN_STBIST_FAIL_R_BOOT_ROM */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022052", /* EN_STBIST_FAIL_R_CORE_1 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022053", /* EN_STBIST_FAIL_R_CORE_2 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022019", /* EN_STBIST_FAIL_R_CPLD */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0002201C", /* EN_STBIST_FAIL_R_ENET_PORT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0002201D", /* EN_STBIST_FAIL_R_ENET_SWITCH */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022016", /* EN_STBIST_FAIL_R_I2C */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022017", /* EN_STBIST_FAIL_R_PRI_FS */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022015", /* EN_STBIST_FAIL_R_RTC */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022018", /* EN_STBIST_FAIL_R_SEC_FS */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00014034", /* EN_FAULT_OC_USB_HUB */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00014033", /* EN_FAULT_OC_USB_PORT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0002200B", /* EN_STBIST_FAIL_ADC */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022007", /* EN_STBIST_FAIL_BOOT_ROM */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022058", /* EN_STBIST_FAIL_CORE_1 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022059", /* EN_STBIST_FAIL_CORE_2 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0002205A", /* EN_STBIST_FAIL_CPLD */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022008", /* EN_STBIST_FAIL_ENET_PORT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0002200A", /* EN_STBIST_FAIL_ENET_SWITCH */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022004", /* EN_STBIST_FAIL_I2C */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022009", /* EN_STBIST_FAIL_I2C_DEVICE */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022005", /* EN_STBIST_FAIL_PRI_FS */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022001", /* EN_STBIST_FAIL_R485_1 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022002", /* EN_STBIST_FAIL_R485_2 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022013", /* EN_STBIST_FAIL_RPSERV */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022003", /* EN_STBIST_FAIL_RTC */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022006", /* EN_STBIST_FAIL_SEC_FS */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022011", /* EN_STBIST_FAIL_USB_1 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022012", /* EN_STBIST_FAIL_USB_2 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022054", /* EN_STBIST_FAIL_USB_I2C_1 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022055", /* EN_STBIST_FAIL_USB_I2C_2 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "06000000", /* EN_SYSTEM_BATTERY_FAILURE */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00282005", /* EN_MM_MISMATCHED */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_INSTALL_ERROR, .recovery_state = SAHPI_ES_RUNNING, }, {}, }, .reading2event = { /* 0 = unknown */ { .num = 1, .rangemap = { .Flags = SAHPI_SRF_MIN, .Min = { .Value = { .SensorInt64 = 1, }, }, }, .state = SAHPI_ES_UNSPECIFIED, }, /* 1 = good */ { .num = 2, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Nominal = { .Value = { .SensorInt64 = 1, }, }, }, .state = SAHPI_ES_RUNNING, }, /* 2 = warning */ { .num = 3, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Nominal = { .Value = { .SensorInt64 = 2, }, }, }, .state = SAHPI_ES_DEGRADED, }, /* 3 = bad */ { .num = 4, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Nominal = { .Value = { .SensorInt64 = 3, }, }, }, .state = SAHPI_ES_OFF_LINE, }, }, }, .comment = "MM Operational Status Sensor", }, {} /* Terminate array with a null element */ }; /*************** * Blade Sensors ***************/ struct snmp_bc_sensor snmp_bc_blade_sensors[] = { /* Blade CPU 1 Temperature Sensor */ { .index = 1, .sensor = { .Num = 1, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* temperatureCPU1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.6.x", .loc_offset = 0, .threshold_oids = { /* temperatureCPU1HardShutdown */ .UpCritical = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.6.x", /* temperatureCPU1Warning */ .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.7.x", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "0421C401", /* EN_PROC_HOT_CPU1 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR, }, { .event = "0421C481", /* EN_CUTOFF_HI_OVER_TEMP_CPU1 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR, }, { .event = "0421D081", /* EN_THERM_TRIP_CPU1 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR, }, { .event = "0421D501", /* EN_PFA_HI_OVER_TEMP_CPU1 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade CPU 1 Temperature Sensor", }, /* Blade CPU 2 Temperature Sensor */ { .index = 2, .sensor = { .Num = 2, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* temperatureCPU2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.7.x", .loc_offset = 0, .threshold_oids = { /* temperatureCPU2HardShutdown */ .UpCritical = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.9.x", /* temperatureCPU2Warning */ .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.10.x", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "0421C402", /* EN_PROC_HOT_CPU2 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR, }, { .event = "0421C482", /* EN_CUTOFF_HI_OVER_TEMP_CPU2 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR, }, { .event = "0421D082", /* EN_THERM_TRIP_CPU2 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR, }, { .event = "0421D502", /* EN_PFA_HI_OVER_TEMP_CPU2 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade CPU 2 Temperature Sensor", }, /* Blade CPU 3 Temperature Sensor */ { .index = 3, .sensor = { .Num = 3, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* temperatureCPU3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.8.x", .loc_offset = 0, .threshold_oids = { /* temperatureCPU3HardShutdown */ .UpCritical = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.12.x", /* temperatureCPU3Warning */ .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.13.x", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "0421C403", /* EN_PROC_HOT_CPU3 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR, }, { .event = "0421C483", /* EN_CUTOFF_HI_OVER_TEMP_CPU3 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR, }, { .event = "0421D083", /* EN_THERM_TRIP_CPU3 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR, }, { .event = "0421D503", /* EN_PFA_HI_OVER_TEMP_CPU3 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade CPU 3 Temperature Sensor", }, /* Blade CPU 4 Temperature Sensor */ { .index = 4, .sensor = { .Num = 4, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* temperatureCPU4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.9.x", .loc_offset = 0, .threshold_oids = { /* temperatureCPU4HardShutdown */ .UpCritical = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.15.x", /* temperatureCPU4Warning */ .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.16.x", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "0421C404", /* EN_PROC_HOT_CPU4 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR, }, { .event = "0421C484", /* EN_CUTOFF_HI_OVER_TEMP_CPU4 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR, }, { .event = "0421D084", /* EN_THERM_TRIP_CPU4 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR, }, { .event = "0421D504", /* EN_PFA_HI_OVER_TEMP_CPU4 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade CPU 4 Temperature Sensor", }, /* Blade 1.25 Volt Sensor */ { .index = 5, .sensor = { .Num = 5, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 3.3, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 1.25, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* bladePlus1pt25Volt */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.12.x", .loc_offset = 0, .threshold_oids = { /* bladePlus1pt25VoltHighWarning */ .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.18.x", /* bladePlus1pt25VoltLowWarning */ .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.19.x", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "08001400", /* EN_PFA_HI_FAULT_1_25V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "08001800", /* EN_PFA_LO_FAULT_1_25V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade 1.25 Volt Sensor", }, /* Blade 1.5 Volt Sensor */ { .index = 6, .sensor = { .Num = 6, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 4.4, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 1.5, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* bladePlus1pt5Volt */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.11.x", .loc_offset = 0, .threshold_oids = { /* bladePlus1pt5VoltHighWarning */ .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.16.x", /*bladePlus1pt5VoltLowWarning */ .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.17.x", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "0A041C00", /* EN_IO_1_5V_WARNING_HI */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0A040C00", /* EN_IO_1_5V_WARNING_LOW */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "08041400", /* EN_PFA_HI_FAULT_1_5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "08041800", /* EN_PFA_LO_FAULT_1_5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade 1.5 Volt Sensor", }, /* Blade 2.5 Volt Sensor */ { .index = 7, .sensor = { .Num = 7, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 4.4, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 2.5, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* bladePlus2pt5Volt */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.10.x", .loc_offset = 0, .threshold_oids = { /* bladePlus2pt5VoltHighWarning */ .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.14.x", /* bladePlus2pt5VoltLowWarning */ .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.15.x", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "0A031C00", /* EN_IO_2_5V_WARNING_HI */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0A030C00", /* EN_IO_2_5V_WARNING_LOW */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "08031480", /* EN_PFA_HI_FAULT_2_5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "08031880", /* EN_PFA_LO_FAULT_2_5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade 2.5 Volt Sensor", }, /* Blade 3.3 Volt Sensor */ { .index = 8, .sensor = { .Num = 8, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 4.4, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 3.3, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* bladePlus3pt3Volt */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.7.x", .loc_offset = 0, .threshold_oids = { /* bladePlus3pt3VoltHighWarning */ .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.8.x", /* bladePlus3pt3VoltLowWarning */ .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.9.x", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "0A02DC00", /* EN_IO_3_3V_WARNING_HI */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0A02CC00", /* EN_IO_3_3V_WARNING_LOW */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "08033480", /* EN_PFA_HI_FAULT_3_35V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "FF032900", /* EN_MAJOR_LO_FAULT_3_35V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade 3.3 Volt Sensor", }, /* Blade 5 Volt Sensor */ { .index = 9, .sensor = { .Num = 9, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 6.7, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 5, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* bladePlus5Volt */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.6.x", .loc_offset = 0, .threshold_oids = { /* bladePlus5VoltHighWarning */ .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.6.x", /* bladePlus5VoltLowWarning */ .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.7.x", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "0A035C00", /* EN_IO_5V_WARNING_HI */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0A034C00", /* EN_IO_5V_WARNING_LOW */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_CRIT, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "08035500", /* EN_PFA_HI_FAULT_5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "08035800", /* EN_PFA_LO_FAULT_5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade 5 Volt Sensor", }, /* Blade 12 Volt Sensor */ { .index = 10, .sensor = { .Num = 10, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 16, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 12, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* bladePlus12Volt */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.8.x", .loc_offset = 0, .threshold_oids = { /* bladePlus12VoltHighWarning */ .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.10.x", /*bladePlus12VoltLowWarning */ .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.11.x", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "0A037C00", /* EN_IO_12V_WARNING_HI */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0A036C00", /* EN_IO_12V_WARNING_LOW */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "06037500", /* EN_PFA_HI_FAULT_12V_PLANAR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "06037800", /* EN_PFA_LO_FAULT_12V_PLANAR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade 12 Volt Sensor", }, /* Blade VRM Voltage Sensor */ { .index = 11, .sensor = { .Num = 11, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 3.6, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, .ReadThold = 0, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* bladeVRM1Volt */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.13.x", .loc_offset = 0, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "04401501", /* EN_PFA_HI_FAULT_VRM1 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "04401801", /* EN_PFA_LO_FAULT_VRM1 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "04401502", /* EN_PFA_HI_FAULT_VRM2 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "04401802", /* EN_PFA_LO_FAULT_VRM2 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade VRM Voltage Sensor", }, /* Blade Operational Status Sensor */ { .index = 12, .sensor = { .Num = 12, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_AVAILABILITY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_RUNNING | SAHPI_ES_OFF_LINE | SAHPI_ES_DEGRADED | SAHPI_ES_INSTALL_ERROR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_INT64, .BaseUnits = SAHPI_SU_UNSPECIFIED, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_INT64, .Value = { .SensorInt64 = 9, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_INT64, .Value = { .SensorInt64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* bladeHealthState */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.5.x", .loc_offset = 0, }, .cur_state = SAHPI_ES_RUNNING, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_DEGRADED | SAHPI_ES_OFF_LINE | SAHPI_ES_INSTALL_ERROR, .deassert_mask = SAHPI_ES_DEGRADED | SAHPI_ES_OFF_LINE | SAHPI_ES_INSTALL_ERROR, .event_array = { { .event = "0E00A00x", /* EN_BLADE_x_INSUFFICIENT_PWR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0F00C00x", /* EN_BLADE_1_SHUTDOWN_OVER_PWR_BUDGET */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0E01200x", /* EN_BLADE_2_UNIDENTIABLE_HW_DENY_POWER */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0401A000", /* EN_CPU_BD_POWER_FAULT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "04018000", /* EN_CPU_BD_VOLTAGE_FAULT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0401E000", /* EN_CPU_INVALID_CONFIG */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "04300201", /* EN_IERR_CPU1 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "04300202", /* EN_IERR_CPU2 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "04300203", /* EN_IERR_CPU3 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "04300204", /* EN_IERR_CPU4 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0421C081", /* EN_OVER_TEMP_CPU1 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0421C082", /* EN_OVER_TEMP_CPU2 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0421C083", /* EN_OVER_TEMP_CPU3 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0421C084", /* EN_OVER_TEMP_CPU4 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00000069", /* EN_DASD */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "06016000", /* EN_IO_BD_FAULT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0601A000", /* EN_IO_BD_POWER_FAULT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "06018000", /* EN_IO_BD_VOLTAGE_FAULT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00028000", /* EN_FAULT_POWER_GOOD */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00028001", /* EN_FAULT_SYS_POWER_GOOD */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "04428000", /* EN_FAULT_VRM_POWER_GOOD */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "04428001", /* EN_FAULT_VRM_POWER_GOOD_1 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "04428002", /* EN_FAULT_VRM_POWER_GOOD_2 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "04428003", /* EN_FAULT_VRM_POWER_GOOD_3 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "04428004", /* EN_FAULT_VRM_POWER_GOOD_4 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "04000000", /* EN_AUTO_BIOS_ALERT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0D01E000", /* EN_HSDC_FAULT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00216030", /* EN_IPMI_SM_INIT_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0021601C", /* EN_IPMI_SYS_BOARD_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0021603E", /* EN_IPMI_PCI_BUS_TIMEOUT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0021603F", /* EN_IPMI_BIOS_HALTED_UNSPEC */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "08016080", /* EN_PWR_CONTROLLER_TIMEOUT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "05200000", /* EN_MEMORY_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0A000281", /* EN_UNCORRECT_DIMM_1_ERR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0A000282", /* EN_UNCORRECT_DIMM_2_ERR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0A000283", /* EN_UNCORRECT_DIMM_3_ERR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0A000284", /* EN_UNCORRECT_DIMM_4_ERR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0A000285", /* EN_UNCORRECT_DIMM_5_ERR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0A000286", /* EN_UNCORRECT_DIMM_6_ERR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0A000287", /* EN_UNCORRECT_DIMM_7_ERR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0A000288", /* EN_UNCORRECT_DIMM_8_ERR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00216012", /* EN_IPMI_UNCORRECT_BUS_ERR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00216003", /* EN_IPMI_DIMM_ERR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "06C16000", /* EN_MEM_MOD_BUS_UNCORR_ERR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0E00E00x", /* EN_BLADE_x_NO_PWR_VPD */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0E01000x", /* EN_BLADE_x_NO_MGT_VPD */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0E00800x", /* EN_BLADE_x_COMM_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0E00C00x", /* EN_BLADE_x_THROTTLED */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00000077", /* EN_BOOT_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0A000000", /* EN_CKVM_FAULT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "04204001", /* EN_CPU_1_DISABLED */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "04204002", /* EN_CPU_2_DISABLED */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "04204003", /* EN_CPU_3_DISABLED */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "04204004", /* EN_CPU_4_DISABLED */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "04306201", /* EN_IERR_CPU_RESTART1 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "04306202", /* EN_IERR_CPU_RESTART2 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "04306203", /* EN_IERR_CPU_RESTART3 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "04306204", /* EN_IERR_CPU_RESTART4 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0000006F", /* EN_NC_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "09025000", /* EN_FP_NP */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0421D401", /* EN_CPU1_TEMP_WARN */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0421D402", /* EN_CPU2_TEMP_WARN */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0801B402", /* EN_PFA_HI_EXCEDED_CUR_12V_A_MAX */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "06802000", /* EN_FAULT_DASD1_HARD_DRIVE_0 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "06800001", /* EN_FAULT_DASD1_HARD_DRIVE_1 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0A07BC00", /* EN_IO_1_8V_WARNING_HI */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0A07AC00", /* EN_IO_1_8V_WARNING_LOW */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0A031C01", /* EN_IO_2_5VS_WARNING_HI */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0A030C01", /* EN_IO_2_5VS_WARNING_LOW */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0A02DC01", /* EN_IO_3_3VS_WARNING_HI */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0A02CC01", /* EN_IO_3_3VS_WARNING_LOW */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0A037C01", /* EN_IO_12VS_WARNING_HI */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0A036C01", /* EN_IO_12VS_WARNING_LOW */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0A03DC00", /* EN_IO_N5V_WARNING_HI */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0A03CC00", /* EN_IO_N5V_WARNING_LOW */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00216025", /* EN_IPMI_CPU_SPEED_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00216024", /* EN_IPMI_CPU_VOLT_MISMATCH */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0021603D", /* EN_IPMI_PROC_INIT_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00216028", /* EN_IPMI_SP2_INIT_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00216039", /* EN_IPMI_BOARD_INIT_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00216020", /* EN_IPMI_BOOT_MEDIA_MISSING */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0021602F", /* EN_IPMI_CACHE_INIT_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0021601E", /* EN_IPMI_DISK_CTRL_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00216027", /* EN_IPMI_DRIVE_INIT_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00216023", /* EN_IPMI_FW_ROM_CORRUPT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0021601A", /* EN_IPMI_MEM_FAILED */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00216026", /* EN_IPMI_MEM_INIT_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00216032", /* EN_IPMI_MGMT_CTRL_INIT_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00216019", /* EN_IPMI_NO_MEM */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00216038", /* EN_IPMI_OS_BOOT_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0021602B", /* EN_IPMI_PCI_CONF_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00216011", /* EN_IPMI_PCI_SERR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0021602D", /* EN_IPMI_ROM_INIT_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0021601B", /* EN_IPMI_STORAGE_DEV_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0021602C", /* EN_IPMI_USB_CONF_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00216037", /* EN_IPMI_WAKEUP_VECTOR_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "BBBB0001", /* EN_BIOS_RTC */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0E00600x", /* EN_BLADE_x_CFG_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_INSTALL_ERROR, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0EC00001", /* EN_BEM_1_FAULT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_INSTALL_ERROR, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0EC00002", /* EN_BEM_2_FAULT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_INSTALL_ERROR, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "08100080", /* EN_PWR_CONTROLLER_MISMATCH */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_INSTALL_ERROR, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0D000281", /* EN_BSE_LEGACY_DC1_DONT_WORK */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_INSTALL_ERROR, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0D000282", /* EN_BSE_LEGACY_DC2_DONT_WORK */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_INSTALL_ERROR, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "04000300", /* EN_POWER_JUMPER_NP */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_INSTALL_ERROR, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "04000280", /* EN_BLADE_INCOMPATIABLE */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_INSTALL_ERROR, .recovery_state = SAHPI_ES_RUNNING, }, {}, }, .reading2event = { /* 0 = unknown */ { .num = 1, .rangemap = { .Flags = SAHPI_SRF_MIN, .Min = { .Value = { .SensorInt64 = 1, }, }, }, .state = SAHPI_ES_UNSPECIFIED, }, /* 1 = good */ { .num = 2, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Nominal = { .Value = { .SensorInt64 = 1, }, }, }, .state = SAHPI_ES_RUNNING, }, /* 2 = warning */ { .num = 3, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Nominal = { .Value = { .SensorInt64 = 2, }, }, }, .state = SAHPI_ES_DEGRADED, }, /* 3 = bad, 4 = kernelMode, 5 = discovering, 6 = commError 7 = noPower, 8 = flashing */ { .num = 4, .rangemap = { .Flags = SAHPI_SRF_MIN | SAHPI_SRF_MAX, .Min = { .Value = { .SensorInt64 = 3, }, }, .Max = { .Value = { .SensorInt64 = 8, }, }, }, .state = SAHPI_ES_OFF_LINE, }, /* 9 = initFailure */ { .num = 5, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Nominal = { .Value = { .SensorInt64 = 9, }, }, }, .state = SAHPI_ES_INSTALL_ERROR, }, }, }, .comment = "Blade Operational Status Sensor", }, /* Blade NMI Status Sensor */ { .index = 13, .sensor = { .Num = 13, .Type = SAHPI_CRITICAL_INTERRUPT, .Category = SAHPI_EC_STATE, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_STATE_ASSERTED | SAHPI_ES_STATE_DEASSERTED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_STATE_DEASSERTED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_STATE_ASSERTED, .deassert_mask = SAHPI_ES_STATE_ASSERTED, .event_array = { { .event = "0000007E", /* EN_SYSERR_LED_ONLY */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_STATE_ASSERTED, .recovery_state = SAHPI_ES_STATE_DEASSERTED, }, {}, }, .reading2event = {}, }, .comment = "Blade NMI Status Sensor", }, /* Blade Management Bus Operational Status Sensor - event only */ { .index = 14, .sensor = { .Num = 14, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_AVAILABILITY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_RUNNING | SAHPI_ES_OFF_LINE, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_RUNNING, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_OFF_LINE, .deassert_mask = SAHPI_ES_OFF_LINE, .event_array = { { .event = "0E02200x", /* EN_STCONN_FAIL_BLADE_x */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, {}, }, .reading2event = {}, }, .comment = "Blade Management Bus Operations Sensor", }, {} /* Terminate array with a null element */ }; /* Blade IPMI Sensors */ /* NOTE: Define IPMI Tags as uppercase */ #define SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR 14 struct snmp_bc_ipmi_sensor snmp_bc_blade_ipmi_sensors[] = { /* Blade CPU 1 Temperature Sensor */ { .ipmi_tag = "CPU1 TEMP", .ipmi_tag_alias1 = "CPU 1 TEMP", .ipmi = { .index = 1, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR + 1, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpCritical = "discovered", .UpMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "FFFFFF1C", /* EN_GENERIC_HI_CRIT_TEMP */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR, }, { .event = "FFFFFF1D", /* EN_GENERIC_HI_WARN_TEMP */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade CPU 1 Temperature Sensor", }, }, /* Blade CPU 2 Temperature Sensor */ { .ipmi_tag = "CPU2 TEMP", .ipmi_tag_alias1 = "CPU 2 TEMP", .ipmi = { .index = 2, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR + 2, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpCritical = "discovered", .UpMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "FFFFFF20", /* EN_GENERIC_HI_CRIT_TEMP */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR, }, { .event = "FFFFFF21", /* EN_GENERIC_HI_WARN_TEMP */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade CPU 2 Temperature Sensor", }, }, /* Blade CPU 3 Temperature Sensor */ { .ipmi_tag = "CPU3 TEMP", .ipmi_tag_alias1 = "CPU 3 TEMP", .ipmi = { .index = 3, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR + 3, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpCritical = "discovered", .UpMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "FFFFFF22", /* EN_GENERIC_HI_CRIT_TEMP */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR, }, { .event = "FFFFFF23", /* EN_GENERIC_HI_WARN_TEMP */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade CPU 3 Temperature Sensor", }, }, /* Blade CPU 4 Temperature Sensor */ { .ipmi_tag = "CPU4 TEMP", .ipmi_tag_alias1 = "CPU 4 TEMP", .ipmi = { .index = 4, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR + 4, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpCritical = "discovered", .UpMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "FFFFFF24", /* EN_GENERIC_HI_CRIT_TEMP */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR, }, { .event = "FFFFFF25", /* EN_GENERIC_HI_WARN_TEMP */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade CPU 4 Temperature Sensor", }, }, /* Blade 0.9 Volt Sensor */ { .ipmi_tag = "PLANAR 0.9V", .ipmi_tag_alias1 = '\0', .ipmi = { .index = 5, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR + 5, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 1.5, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0.9, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpMajor = "discovered", .LowMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "FFFFFFF1", /* EN_GENERIC_UPPER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "FFFFFFF2", /* EN_GENERIC_LOWER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade 0.9 Volt Sensor", }, }, /* Blade 1.2 Volt Sensor */ { .ipmi_tag = "1.2V SENSE", .ipmi_tag_alias1 = "PLANAR 1.2V", .ipmi = { .index = 6, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR + 6, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 3.3, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 1.2, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpMajor = "discovered", .LowMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "08001401", /* EN_PFA_HI_FAULT_1_2V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "08001801", /* EN_PFA_LO_FAULT_1_2V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade 1.2 Volt Sensor", }, }, /* Blade Standby 1.2 Volt Sensor */ { .ipmi_tag = "1.2VSB SENSE", .ipmi_tag_alias1 = "PLANAR 1.2VSB", .ipmi = { .index = 7, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR + 7, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 3.3, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 1.2, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpMajor = "discovered", .LowMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "0A00BC02", /* EN_1_2VS_WARNING_HI */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0A00AC02", /* EN_1_2VS_WARNING_LOW */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade Standby 1.2 Volt Sensor", }, }, /* Blade 1.5 Volt Sensor */ { .ipmi_tag = "1.5V SENSE", .ipmi_tag_alias1 = "PLANAR 1.5V", .ipmi = { .index = 8, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR + 8, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 4.4, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 1.5, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpMajor = "discovered", .LowMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { /* No IPMI unique events */ {}, }, .reading2event = {}, }, .comment = "Blade 1.5 Volt Sensor", }, }, /* Blade Standby 1.5 Volt Sensor */ { .ipmi_tag = "1.5VSB SENSE", .ipmi_tag_alias1 = "PLANAR 1.5VSB", .ipmi = { .index = 9, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR + 9, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 4.4, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 1.5, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpMajor = "discovered", .LowMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "0A041C02", /* EN_1_5VS_WARNING_HI */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0A040C02", /* EN_1_5VS_WARNING_LOW */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade Standby 1.5 Volt Sensor", }, }, /* Blade 1.8 Volt Sensor */ { .ipmi_tag = "1.8V SENSE", .ipmi_tag_alias1 = "PLANAR 1.8V", .ipmi = { .index = 10, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR + 10, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 4.4, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 1.8, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .LowMajor = "discovered", .UpMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "0807B400", /* EN_PFA_HI_FAULT_1_8V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0807B800", /* EN_PFA_LO_FAULT_1_8V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade 1.8 Volt Sensor", }, }, /* Blade Standby 1.8 Volt Sensor */ { .ipmi_tag = "1.8VSB SENSE", .ipmi_tag_alias1 = "PLANAR 1.8VSB", .ipmi = { .index = 11, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR + 11, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 4.4, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 1.8, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .LowMajor = "discovered", .UpMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "0A07BC02", /* EN_1_8VS_WARNING_HI */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0A07AC02", /* EN_1_8VS_WARNING_LOW */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade Standby 1.8 Volt Sensor", }, }, /* Blade 2.5 Volt Sensor */ { .ipmi_tag = "2.5V SENSE", .ipmi_tag_alias1 = "PLANAR 2.5V", .ipmi = { .index = 12, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR + 12, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 4.4, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 2.5, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpMajor = "discovered", .LowMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { /* No IPMI unique events */ {}, }, .reading2event = {}, }, .comment = "Blade 2.5 Volt Sensor", }, }, /* Blade Standby 2.5 Volt Sensor */ { .ipmi_tag = "2.5VSB SENSE", .ipmi_tag_alias1 = "PLANAR 2.5VSB", .ipmi = { .index = 13, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR + 13, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 4.4, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 2.5, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpMajor = "discovered", .LowMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "0A031C02", /* EN_2_5VS_WARNING_HI */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0A030C02", /* EN_2_5VS_WARNING_LOW */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade Standby 2.5 Volt Sensor", }, }, /* Blade 3.3 Volt Sensor */ { .ipmi_tag = "3.3V SENSE", .ipmi_tag_alias1 = "PLANAR 3.3V", .ipmi = { .index = 14, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR + 14, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 4.4, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 3.3, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpMajor = "discovered", .LowMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "FFFFFFF3", /* EN_GENERIC_UPPER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "FFFFFFF4", /* EN_GENERIC_UPPER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade 3.3 Volt Sensor", }, }, /* Blade Standby 3.3 Volt Sensor */ { .ipmi_tag = "3.3VSB SENSE", .ipmi_tag_alias1 = "PLANAR 3.3VSB", .ipmi = { .index = 15, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR + 15, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 4.4, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 3.3, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpMajor = "discovered", .LowMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "0A02DC02", /* EN_3_3VS_WARNING_HI */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0A02CC02", /* EN_3_3VS_WARNING_LOW */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade Standby 3.3 Volt Sensor", }, }, /* Blade 5 Volt Sensor */ { .ipmi_tag = "5V SENSE", .ipmi_tag_alias1 = "PLANAR 5V", .ipmi = { .index = 16, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR + 16, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 6.7, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 5, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpMajor = "discovered", .LowMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "FFFFFFF5", /* EN_GENERIC_UPPER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "FFFFFFF6", /* EN_GENERIC_UPPER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade 5 Volt Sensor", }, }, /* Blade Standby 5 Volt Sensor */ { .ipmi_tag = "5VSB SENSE", .ipmi_tag_alias1 = "PLANAR 5VSB", .ipmi = { .index = 17, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR + 17, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 6.7, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 5, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpMajor = "discovered", .LowMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "0A035C02", /* EN_5VS_WARNING_HI */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0A034C02", /* EN_5VS_WARNING_LOW */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade Standby 5 Volt Sensor", }, }, /* Blade -5 Volt Sensor */ { .ipmi_tag = "-5V SENSE", .ipmi_tag_alias1 = "PLANAR -5V", .ipmi = { .index = 18, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR + 18, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = -5, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = -6.7, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpMajor = "discovered", .LowMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "0803D500", /* EN_PFA_HI_FAULT_N5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0803D800", /* EN_PFA_LO_FAULT_N5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade -5 Volt Sensor", }, }, /* Blade 12 Voltage Sensor */ { .ipmi_tag = "12V SENSE", .ipmi_tag_alias1 = "PLANAR 12V", .ipmi = { .index = 19, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR + 19, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 16, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 12, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpMajor = "discovered", .LowMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "FFFFFFF7", /* EN_GENERIC_UPPER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "FFFFFFF8", /* EN_GENERIC_UPPER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade 12 Volt Sensor", }, }, /* Blade Standby 12 Volt Sensor */ { .ipmi_tag = "12VSB SENSE", .ipmi_tag_alias1 = "PLANAR 12VSB", .ipmi = { .index = 20, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR + 20, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 16, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 12, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpMajor = "discovered", .LowMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "0A037C02", /* EN_12VS_WARNING_HI */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0A036C02", /* EN_12VS_WARNING_LOW */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade Standby 12 Volt Sensor", }, }, /* Blade CPU 1 Core Voltage Sensor */ { .ipmi_tag = "CPU 1 VCORE", .ipmi_tag_alias1 = "CPU1 VCORE", .ipmi = { .index = 21, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR + 21, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 3.67, }, }, /* No nominal reading - depends on CPU versions and number */ .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpMajor = "discovered", .LowMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "FFFFFFF9", /* EN_GENERIC_UPPER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "FFFFFFFA", /* EN_GENERIC_UPPER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade CPU 1 Core Voltage Sensor", }, }, /* Blade CPU 2 Core Voltage Sensor */ { .ipmi_tag = "CPU 2 VCORE", .ipmi_tag_alias1 = "CPU2 VCORE", .ipmi = { .index = 22, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR + 22, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 3.67, }, }, /* No nominal reading - depends on CPU versions and number */ .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpMajor = "discovered", .LowMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "FFFFFFFB", /* EN_GENERIC_UPPER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "FFFFFFFC", /* EN_GENERIC_UPPER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade CPU 2 Core Voltage Sensor", }, }, /* Blade CPU 3 Core Voltage Sensor */ { .ipmi_tag = "CPU 3 VCORE", .ipmi_tag_alias1 = '\0', .ipmi = { .index = 23, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR + 23, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 3.67, }, }, /* No nominal reading - depends on CPU versions and number */ .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpMajor = "discovered", .LowMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "FFFFFFFD", /* EN_GENERIC_UPPER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "FFFFFFFE", /* EN_GENERIC_UPPER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade CPU 3 Core Voltage Sensor", }, }, /* Blade CPU 4 Core Voltage Sensor */ { .ipmi_tag = "CPU 4 VCORE", .ipmi_tag_alias1 = '\0', .ipmi = { .index = 24, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR + 24, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 3.67, }, }, /* No nominal reading - depends on CPU versions and number */ .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpMajor = "discovered", .LowMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "FFFFFF10", /* EN_GENERIC_UPPER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "FFFFFF11", /* EN_GENERIC_UPPER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade CPU 4 Core Voltage Sensor", }, }, /* Blade Battery Voltage Sensor */ { .ipmi_tag = "VBATT SENSE", .ipmi_tag_alias1 = "PLANAR VBAT", .ipmi = { .index = 25, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR + 25, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 4.4, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 3.3, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpMajor = "discovered", .LowMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "FFFFFF12", /* EN_GENERIC_UPPER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "FFFFFF13", /* EN_GENERIC_UPPER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade Battery Voltage Sensor", }, }, /* Blade Memory Bank 1 Temperature Sensor */ { .ipmi_tag = "BANK1 TEMP", .ipmi_tag_alias1 = "BANK 1 TEMP", .ipmi = { .index = 26, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR + 26, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpCritical = "discovered", .UpMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "FFFFFF14", /* EN_GENERIC_HI_CRIT_TEMP */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR, }, { .event = "FFFFFF15", /* EN_GENERIC_HI_WARN_TEMP */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade Memory Bank 1 Temperature Sensor", }, }, /* Blade Memory Bank 2 Temperature Sensor */ { .ipmi_tag = "BANK2 TEMP", .ipmi_tag_alias1 = "BANK 2 TEMP", .ipmi = { .index = 27, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR + 27, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpCritical = "discovered", .UpMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "FFFFFF16", /* EN_GENERIC_HI_CRIT_TEMP */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR, }, { .event = "FFFFFF17", /* EN_GENERIC_HI_WARN_TEMP */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade Memory Bank 2 Temperature Sensor", }, }, /* Blade Memory Bank 3 Temperature Sensor */ { .ipmi_tag = "BANK3 TEMP", .ipmi_tag_alias1 = "BANK 3 TEMP", .ipmi = { .index = 28, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR + 28, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpCritical = "discovered", .UpMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "FFFFFF18", /* EN_GENERIC_HI_CRIT_TEMP */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR, }, { .event = "FFFFFF19", /* EN_GENERIC_HI_WARN_TEMP */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade Memory Bank 3 Temperature Sensor", }, }, /* Blade Memory Bank 4 Temperature Sensor */ { .ipmi_tag = "BANK4 TEMP", .ipmi_tag_alias1 = "BANK 4 TEMP", .ipmi = { .index = 29, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR + 29, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpCritical = "discovered", .UpMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "FFFFFF1A", /* EN_GENERIC_HI_CRIT_TEMP */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR, }, { .event = "FFFFFF1B", /* EN_GENERIC_HI_WARN_TEMP */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade Memory Bank 4 Temperature Sensor", }, }, {} /* Terminate array with a null element */ }; /************************************** * Blade Expansion Module (BEM) Sensors **************************************/ struct snmp_bc_sensor snmp_bc_bem_sensors[] = { /* BEM Operational Status Sensor - event only */ { .index = 1, .sensor = { .Num = 1, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_AVAILABILITY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_RUNNING | SAHPI_ES_DEGRADED | SAHPI_ES_OFF_LINE, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_RUNNING, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_DEGRADED | SAHPI_ES_OFF_LINE, .deassert_mask = SAHPI_ES_DEGRADED | SAHPI_ES_OFF_LINE, .event_array = { { .event = "06800000", /* EN_FAULT_DASD */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0681E002", /* EN_DASD1_REMOVED_DRIVE_2 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0681E003", /* EN_DASD1_REMOVED_DRIVE_3 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0681E004", /* EN_DASD1_REMOVED_DRIVE_4 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "06801002", /* EN_FAULT_DASD1_SCSI_ID_2 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "06800002", /* EN_FAULT_DASD1_HARD_DRIVE_2 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "06801003", /* EN_FAULT_DASD1_SCSI_ID_3 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "06800003", /* EN_FAULT_DASD1_HARD_DRIVE_3 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "06800004", /* EN_FAULT_DASD1_HARD_DRIVE_4 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0EE18000", /* EN_BSE_RAID_BATTERY_FAILURE */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0EE00000", /* EN_BSE_RAID_FAULT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, {}, }, .reading2event = {}, }, .comment = "BEM Operational Status Sensor", }, /* BEM Temperature Sensor - event only */ { .index = 2, .sensor = { .Num = 2, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "0621C481", /* EN_CUTOFF_HI_OVER_TEMP_BEM */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR, }, { .event = "0681C482", /* EN_CUTOFF_HI_OVER_TEMP_DASD1_2 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR, }, { .event = "0621C081", /* EN_OVER_TEMP_BEM */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR, }, { .event = "0621D481", /* EN_PFA_HI_OVER_TEMP_BEM */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "BEM Temperature Sensor", }, /* BEM Voltage Sensor - event only */ { .index = 3, .sensor = { .Num = 3, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "0E850402", /* EN_BEM_1V_WARNING_HI */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0E850802", /* EN_BEM_1V_WARNING_LOW */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0E840402", /* EN_BEM_1_5V_WARNING_HI */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0E840802", /* EN_BEM_1_5V_WARNING_LOW */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0E87A402", /* EN_BEM_1_8V_WARNING_HI */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0E87A802", /* EN_BEM_1_8V_WARNING_LOW */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0E830402", /* EN_BEM_2_5V_WARNING_HI */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0E830802", /* EN_BEM_2_5V_WARNING_LOW */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0E832402", /* EN_BEM_3_3V_WARNING_HI */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0E832802", /* EN_BEM_3_3V_WARNING_LOW */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0E834402", /* EN_BEM_5V_WARNING_HI */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0E834802", /*EN_BEM_5V_WARNING_LOW */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0E836402", /* EN_BEM_12V_WARNING_HI */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0E836802", /* EN_BEM_12V_WARNING_LOW */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0E860402", /* EN_BEM_12VSB_WARNING_HI */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0E860802", /* EN_BEM_12VSB_WARNING_LOW */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0E83C402", /* EN_BEM_18V_WARNING_HI */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0E83C802", /* EN_BEM_18V_WARNING_LOW */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "BEM Voltage Sensor", }, {} /* Terminate array with a null element */ }; #define SNMP_BC_LAST_NON_IPMI_BEM_SENSOR 3 /* BEM IPMI Sensors */ /* NOTE: Define IPMI tags as uppercase */ struct snmp_bc_ipmi_sensor snmp_bc_bem_ipmi_sensors[] = { /* PEU2 Temperature Sensor */ { .ipmi_tag = "PEU2 TEMP SENSE", .ipmi_tag_alias1 = "PEU2 LOCAL TEMP", .ipmi = { .index = 1, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BEM_SENSOR + 1, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpCritical = "discovered", .UpMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "FFFFFF26", /* EN_GENERIC_HI_CRIT_TEMP */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR, }, { .event = "FFFFFF27", /* EN_GENERIC_HI_WARN_TEMP */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "PEU2 Temperature Sensor", }, }, /* PEU2 1 Volt Sensor */ { .ipmi_tag = "PEU2 1V SENSE", .ipmi_tag_alias1 = '\0', .ipmi = { .index = 2, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BEM_SENSOR + 2, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 2, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 1, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpMajor = "discovered", .LowMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "FFFFFF28", /* EN_GENERIC_UPPER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "FFFFFF29", /* EN_GENERIC_LOWER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "PEU2 1 Volt Sensor", }, }, /* PEU2 3.3 Volt Sensor */ { .ipmi_tag = "PEU2 3.3V SENSE", .ipmi_tag_alias1 = '\0', .ipmi = { .index = 3, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BEM_SENSOR + 3, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 3.6, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 3.3, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpMajor = "discovered", .LowMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "FFFFFF2A", /* EN_GENERIC_UPPER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "FFFFFF2B", /* EN_GENERIC_LOWER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "PEU2 3.3 Volt Sensor", }, }, /* PEU2 5 Volt Sensor */ { .ipmi_tag = "PEU2 5V SENSE", .ipmi_tag_alias1 = '\0', .ipmi = { .index = 4, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BEM_SENSOR + 4, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 6.7, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 5, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpMajor = "discovered", .LowMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "FFFFFF2C", /* EN_GENERIC_UPPER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "FFFFFF2D", /* EN_GENERIC_LOWER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "PEU2 5 Volt Sensor", }, }, /* PEU2 12 Volt Sensor */ { .ipmi_tag = "PEU2 12V SENSE", .ipmi_tag_alias1 = '\0', .ipmi = { .index = 5, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BEM_SENSOR + 5, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 16, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 12, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpMajor = "discovered", .LowMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "FFFFFF30", /* EN_GENERIC_UPPER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "FFFFFF31", /* EN_GENERIC_LOWER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "PEU2 12 Volt Sensor", }, }, /* PEU2 Standby 12 Volt Sensor */ { .ipmi_tag = "PEU2 12VSB SENSE", .ipmi_tag_alias1 = '\0', .ipmi = { .index = 6, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BEM_SENSOR + 6, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 16, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 12, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpMajor = "discovered", .LowMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "FFFFFF32", /* EN_GENERIC_UPPER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "FFFFFF33", /* EN_GENERIC_LOWER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "PEU2 Standby 12 Volt Sensor", }, }, /* BIE Temperature Sensor */ { .ipmi_tag = "BIE LOCAL TEMP", .ipmi_tag_alias1 = '\0', .ipmi = { .index = 7, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BEM_SENSOR + 7, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpCritical = "discovered", .UpMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "FFFFFF34", /* EN_GENERIC_HI_CRIT_TEMP */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR, }, { .event = "FFFFFF35", /* EN_GENERIC_HI_WARN_TEMP */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "BIE Temperature Sensor", }, }, /* BIE 1.5 Volt Sensor */ { .ipmi_tag = "BIE 1.5V SENSE", .ipmi_tag_alias1 = '\0', .ipmi = { .index = 8, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BEM_SENSOR + 8, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 4.4, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 1.5, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpMajor = "discovered", .LowMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "FFFFFF36", /* EN_GENERIC_UPPER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "FFFFFF37", /* EN_GENERIC_LOWER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "BIE 1.5 Volt Sensor", }, }, /* BIE 3.3 Volt Sensor */ { .ipmi_tag = "BIE 3.3V SENSE", .ipmi_tag_alias1 = '\0', .ipmi = { .index = 9, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BEM_SENSOR + 9, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 3.6, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 3.3, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpMajor = "discovered", .LowMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "FFFFFF38", /* EN_GENERIC_UPPER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "FFFFFF39", /* EN_GENERIC_LOWER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "BIE 3.3 Volt Sensor", }, }, /* BIE 5 Volt Sensor */ { .ipmi_tag = "BIE 5V SENSE", .ipmi_tag_alias1 = '\0', .ipmi = { .index = 10, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BEM_SENSOR + 10, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 6.7, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 5, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpMajor = "discovered", .LowMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "FFFFFF3A", /* EN_GENERIC_UPPER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "FFFFFF3B", /* EN_GENERIC_LOWER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "BIE 5 Volt Sensor", }, }, /* BIE 12 Volt Sensor */ { .ipmi_tag = "BIE 12V SENSE", .ipmi_tag_alias1 = '\0', .ipmi = { .index = 11, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BEM_SENSOR + 11, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 16, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 12, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpMajor = "discovered", .LowMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "FFFFFF3C", /* EN_GENERIC_UPPER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "FFFFFF3D", /* EN_GENERIC_LOWER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "BIE 12 Volt Sensor", }, }, {} /* Terminate array with a null element */ }; #if 0 /* BEM DASD Sensors */ struct snmp_bc_sensor snmp_bc_bse_dasd_sensors[] = { /* BEM DASD 1 Operational Sensor - event only */ { .index = 1, .sensor = { .Num = 1, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_AVAILABILITY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_RUNNING | SAHPI_ES_OFF_LINE, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_RUNNING, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_OFF_LINE, .deassert_mask = SAHPI_ES_OFF_LINE, .event_array = { { .event = "06801002", /* EN_FAULT_DASD1_SCSI_ID_2 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "06800002", /* EN_FAULT_DASD1_HARD_DRIVE_2 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, {}, }, .reading2event = {}, }, .comment = "BEM DASD 1 Operational Sensor", }, /* BEM DASD 2 Operational Sensor - event only */ { .index = 2, .sensor = { .Num = 2, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_AVAILABILITY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_RUNNING | SAHPI_ES_OFF_LINE, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_RUNNING, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_OFF_LINE, .deassert_mask = SAHPI_ES_OFF_LINE, .event_array = { { .event = "06801003", /* EN_FAULT_DASD1_SCSI_ID_3 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "06800003", /* EN_FAULT_DASD1_HARD_DRIVE_3 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, {}, }, .reading2event = {}, }, .comment = "BEM DASD 2 Operational Sensor", }, {} /* Terminate array with a null element */ }; struct snmp_bc_sensor snmp_bc_bse3_dasd_sensors[] = { /* BEM DASD 3 Operational Sensor - event only */ { .index = 1, .sensor = { .Num = 3, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_AVAILABILITY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_RUNNING | SAHPI_ES_OFF_LINE, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_RUNNING, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_OFF_LINE, .deassert_mask = SAHPI_ES_OFF_LINE, .event_array = { { .event = "06800004", /* EN_FAULT_DASD1_HARD_DRIVE_4 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, {}, }, .reading2event = {}, }, .comment = "BEM DASD 3 Operational Sensor", }, {} /* Terminate array with a null element */ }; #endif /******************** * Media Tray Sensors ********************/ struct snmp_bc_sensor snmp_bc_mediatray_sensors_faultled[] = { /* Media Tray Operational Status Sensor - Readable Fault LED (BCHT) */ /* Media Trays without readable Fault LED are supported in snmp_bc_mediatray_sensors_nofaultled as an event-only sensor */ { .index = 1, .sensor = { .Num = 1, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_AVAILABILITY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_RUNNING | SAHPI_ES_OFF_LINE, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_INT64, .BaseUnits = SAHPI_SU_UNSPECIFIED, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_INT64, .Value = { .SensorInt64 = 1, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_INT64, .Value = { .SensorInt64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* ledMediaTrayFault for Media Tray 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.7.1.1.5.1", .loc_offset = 0, }, .cur_state = SAHPI_ES_RUNNING, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_OFF_LINE, .deassert_mask = SAHPI_ES_OFF_LINE, .event_array = { { .event = "6F60C001", /* EN_MT_1_HW_FAILURE */ .event_assertion = SAHPI_TRUE, .event_state = SAHPI_ES_OFF_LINE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "06A2E001", /* EN_FRONT_PANEL_TEMP_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, {}, }, .reading2event = { /* 0 = Fault LED is off - ok */ { .num = 1, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Min = { .Value = { .SensorInt64 = 0, }, }, }, .state = SAHPI_ES_RUNNING, }, /* 1 = Fault LED is on - fault */ { .num = 2, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Nominal = { .Value = { .SensorInt64 = 1, }, }, }, .state = SAHPI_ES_OFF_LINE, }, }, }, .comment = "Media Tray Operational Status Sensor", }, {} /* Terminate array with a null element */ }; struct snmp_bc_sensor snmp_bc_mediatray_sensors_nofaultled[] = { /* Media Tray Operational Status Sensor - event only */ { .index = 1, .sensor = { .Num = 1, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_AVAILABILITY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_RUNNING | SAHPI_ES_OFF_LINE, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_RUNNING, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_OFF_LINE, .deassert_mask = SAHPI_ES_OFF_LINE, .event_array = { { .event = "6F60C001", /* EN_MT_1_HW_FAILURE */ .event_assertion = SAHPI_TRUE, .event_state = SAHPI_ES_OFF_LINE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "06A2E001", /* EN_FRONT_PANEL_TEMP_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, {}, }, .reading2event = {}, }, .comment = "Media Tray Operational Status Sensor", }, {} /* Terminate array with a null element */ }; /* This structure is for all common Media Tray 1 (all types) sensors */ struct snmp_bc_sensor snmp_bc_mediatray_sensors[] = { /* Media Tray Management Bus Operational Status Sensor - event only */ { .index = 2, /* Sensor 1 is the Operational Status Sensor above */ .sensor = { .Num = 2, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_AVAILABILITY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_RUNNING | SAHPI_ES_OFF_LINE, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_RUNNING, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_OFF_LINE, .deassert_mask = SAHPI_ES_OFF_LINE, .event_array = { { .event = "0002205B", /* EN_STCONN_FAIL_MEDIATRAY */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, {}, }, .reading2event = {}, }, .comment = "Media Tray Management Bus Operational Status Sensor", }, {} /* Terminate array with a null element */ }; struct snmp_bc_sensor snmp_bc_mediatray2_sensors[] = { /* Media Tray Operational Status Sensor - Readable Fault LED (BCHT) */ { .index = 1, .sensor = { .Num = 1, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_AVAILABILITY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_RUNNING | SAHPI_ES_OFF_LINE, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_INT64, .BaseUnits = SAHPI_SU_UNSPECIFIED, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_INT64, .Value = { .SensorInt64 = 1, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_INT64, .Value = { .SensorInt64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* ledMediaTrayFault for Media Tray 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.7.1.1.5.2", .loc_offset = 0, }, .cur_state = SAHPI_ES_RUNNING, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_OFF_LINE, .deassert_mask = SAHPI_ES_OFF_LINE, .event_array = { { .event = "6F60C002", /* EN_MT_2_HW_FAILURE */ .event_assertion = SAHPI_TRUE, .event_state = SAHPI_ES_OFF_LINE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "06A2E002", /* EN_FRONT_PANEL_B_TEMP_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, {}, }, .reading2event = { /* 0 = Fault LED is off - ok */ { .num = 1, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Min = { .Value = { .SensorInt64 = 0, }, }, }, .state = SAHPI_ES_RUNNING, }, /* 1 = Fault LED is on - fault */ { .num = 2, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Nominal = { .Value = { .SensorInt64 = 1, }, }, }, .state = SAHPI_ES_OFF_LINE, }, }, }, .comment = "Media Tray Operational Status Sensor", }, /* Media Tray Management Bus Operational Status Sensor - event only */ { .index = 2, .sensor = { .Num = 2, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_AVAILABILITY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_RUNNING | SAHPI_ES_OFF_LINE, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_RUNNING, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_OFF_LINE, .deassert_mask = SAHPI_ES_OFF_LINE, .event_array = { { .event = "0002205C", /* EN_STCONN_FAIL_MEDIATRAYB */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, {}, }, .reading2event = {}, }, .comment = "Media Tray Management Bus Operational Status Sensor", }, {} /* Terminate array with a null element */ }; /**************** * Blower Sensors ****************/ struct snmp_bc_sensor snmp_bc_blower_sensors[] = { /* Blower Operational Status Sensor */ { .index = 1, .sensor = { .Num = 1, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_AVAILABILITY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_RUNNING | SAHPI_ES_OFF_LINE, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_INT64, .BaseUnits = SAHPI_SU_UNSPECIFIED, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_INT64, .Value = { .SensorInt64 = 3, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_INT64, .Value = { .SensorInt64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* blower1State - blower4State */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.3.x.0", .loc_offset = (10 - 1), }, .cur_state = SAHPI_ES_RUNNING, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_OFF_LINE, .deassert_mask = SAHPI_ES_OFF_LINE, .event_array = { { .event = "0002680x", /* EN_FAN1_SPEED */ .event_assertion = SAHPI_TRUE, .event_state = SAHPI_ES_OFF_LINE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0B02600x", /* EN_UNREC_FANx */ .event_assertion = SAHPI_TRUE, .event_state = SAHPI_ES_OFF_LINE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .recovery_state = SAHPI_ES_RUNNING, }, {}, }, .reading2event = { /* 0 = unknown */ { .num = 1, .rangemap = { .Flags = SAHPI_SRF_MIN, .Min = { .Value = { .SensorInt64 = 1, }, }, }, .state = SAHPI_ES_UNSPECIFIED, }, /* 1 = good */ { .num = 2, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Nominal = { .Value = { .SensorInt64 = 1, }, }, }, .state = SAHPI_ES_RUNNING, }, /* 2 = warning */ { .num = 3, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Nominal = { .Value = { .SensorInt64 = 2, }, }, }, .state = SAHPI_ES_DEGRADED, }, /* 3 = bad */ { .num = 4, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Nominal = { .Value = { .SensorInt64 = 3, }, }, }, .state = SAHPI_ES_OFF_LINE, }, }, }, .comment = "Blower Operational Status Sensor", }, /* Blower Speed (Percent of Max) Sensor */ { .index = 2, .sensor = { .Num = 2, .Type = SAHPI_FAN, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_RPM, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_TRUE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 100, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, .ReadThold = 0, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* blower1speed - blower4speed */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.3.x.0", .loc_offset = 0, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "000A600x", /* EN_FAN1_PFA */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blower Speed (Percent of Max) Sensor", }, /* Blower Management Bus Operational Status Sensor - event only */ { .index = 3, .sensor = { .Num = 3, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_AVAILABILITY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_RUNNING | SAHPI_ES_OFF_LINE, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_RUNNING, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_OFF_LINE, .deassert_mask = SAHPI_ES_OFF_LINE, .event_array = { { .event = "000A200x", /* EN_STCONN_FAIL_BLOWER_x */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, {}, }, .reading2event = {}, }, .comment = "Blower Management Bus Operational Status Sensor", }, {} /* Terminate array with a null element */ }; /* BladeCenter H specific blower sensors */ #define SNMP_BC_LAST_COMMON_BLOWER_SENSOR 3 struct snmp_bc_sensor snmp_bc_blower_sensors_bch[] = { /* Blower RPM Speed Sensor */ { .index = 1, .sensor = { .Num = SNMP_BC_LAST_COMMON_BLOWER_SENSOR + 1, .Type = SAHPI_FAN, .Category = SAHPI_EC_UNSPECIFIED, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = 0x00, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_RPM, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 4000, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* blower1speedRPM - blower2speedRPM */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.3.x.0", .loc_offset = (20 - 1), }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = 0x00, .deassert_mask = 0x00, .event_array = { {}, }, .reading2event = {}, }, .comment = "Blower RPM Speed Sensor", }, {} /* Terminate array with a null element */ }; /*************** * Power Sensors ***************/ struct snmp_bc_sensor snmp_bc_power_sensors[] = { /* Power Module Operational Status Sensor */ { .index = 1, .sensor = { .Num = 1, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_AVAILABILITY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_RUNNING | SAHPI_ES_DEGRADED | SAHPI_ES_OFF_LINE, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_INT64, .BaseUnits = SAHPI_SU_UNSPECIFIED, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_INT64, .Value = { .SensorInt64 = 3, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_INT64, .Value = { .SensorInt64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* powerModuleState */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.4.1.1.3.x", .loc_offset = 0, }, .cur_state = SAHPI_ES_RUNNING, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_DEGRADED | SAHPI_ES_OFF_LINE, .deassert_mask = SAHPI_ES_DEGRADED | SAHPI_ES_OFF_LINE, .event_array = { { .event = "0820000x", /* EN_FAULT_PSx */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0823600x", /* EN_FAULT_PSx_12V_OVR_CUR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0802800x", /* EN_FAULT_PSx_DC_GOOD */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0823648x", /* EN_FAULT_PSx_12V_OVER */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0823680x", /* EN_FAULT_PSx_12V_UNDER */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0818000x", /* EN_FAULT_PSx_EPOW */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0821A00x", /* EN_FAULT_PSx_CUR_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, {}, }, .reading2event = { /* 0 = unknown */ { .num = 1, .rangemap = { .Flags = SAHPI_SRF_MIN, .Min = { .Value = { .SensorInt64 = 1, }, }, }, .state = SAHPI_ES_UNSPECIFIED, }, /* 1 = good */ { .num = 2, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Nominal = { .Value = { .SensorInt64 = 1, }, }, }, .state = SAHPI_ES_RUNNING, }, /* 2 = warning */ { .num = 3, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Nominal = { .Value = { .SensorInt64 = 2, }, }, }, .state = SAHPI_ES_DEGRADED, }, /* 3 = bad */ { .num = 4, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Nominal = { .Value = { .SensorInt64 = 3, }, }, }, .state = SAHPI_ES_OFF_LINE, }, }, }, .comment = "Power Module Operational Status Sensor", }, /* Power Module Temperature Sensor - event-only */ { .index = 2, .sensor = { .Num = 2, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, .ReadThold = 0, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "0821C08x", /* EN_FAULT_PSx_OVR_TEMP */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR, }, { .event = "0821C00x", /* EN_FAULT_PS1_TEMP_WARN */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Power Module Temperature Sensor", }, /* Power Module Management Bus Operational Status Sensor - event only */ { .index = 3, .sensor = { .Num = 3, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_AVAILABILITY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_RUNNING | SAHPI_ES_OFF_LINE, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_RUNNING, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_OFF_LINE, .deassert_mask = SAHPI_ES_OFF_LINE, .event_array = { { .event = "0822200x", /* EN_STCONN_FAIL_POWER_x */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, {}, }, .reading2event = {}, }, .comment = "Power Module Management Bus Operational Status Sensor", }, {} /* Terminate array with a null element */ }; #define SNMP_BC_LAST_COMMON_POWER_MODULE_SENSOR 3 /* BladeCenter H specific power module sensors */ struct snmp_bc_sensor snmp_bc_power_sensors_bch[] = { /* Power Module Fan Pack Operational Status Sensor */ { .index = 1, .sensor = { .Num = SNMP_BC_LAST_COMMON_POWER_MODULE_SENSOR + 1, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_AVAILABILITY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_RUNNING | SAHPI_ES_OFF_LINE, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_INT64, .BaseUnits = SAHPI_SU_UNSPECIFIED, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_INT64, .Value = { .SensorInt64 = 3, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_INT64, .Value = { .SensorInt64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* fanPackState */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.6.1.1.3.x", .loc_offset = 0, }, .cur_state = SAHPI_ES_RUNNING, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_OFF_LINE, .deassert_mask = SAHPI_ES_OFF_LINE, .event_array = { { .event = "0003680x", /* EN_FAN_PACKx_SPEED */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "000A7001", /* EN_FAN_PACK1_NOT_PRESENT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, {}, }, .reading2event = { /* 0 = unknown */ { .num = 1, .rangemap = { .Flags = SAHPI_SRF_MIN, .Min = { .Value = { .SensorInt64 = 1, }, }, }, .state = SAHPI_ES_UNSPECIFIED, }, /* 1 = good */ { .num = 2, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Nominal = { .Value = { .SensorInt64 = 1, }, }, }, .state = SAHPI_ES_RUNNING, }, /* 2 = warning */ { .num = 3, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Nominal = { .Value = { .SensorInt64 = 2, }, }, }, .state = SAHPI_ES_DEGRADED, }, /* 3 = bad */ { .num = 4, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Nominal = { .Value = { .SensorInt64 = 3, }, }, }, .state = SAHPI_ES_OFF_LINE, }, }, }, .comment = "Power Module Fan Pack Operational Status Sensor", }, /* Power Module Fan Pack Average Speed (Percent of Max) Sensor */ { .index = 2, .sensor = { .Num = SNMP_BC_LAST_COMMON_POWER_MODULE_SENSOR + 2, .Type = SAHPI_FAN, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_RPM, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_TRUE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 100, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, .ReadThold = 0, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* fanPackAverageSpeed */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.6.1.1.5.x", .loc_offset = 0, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "000B600x", /* EN_FAN_PACKx_PFA */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Power Module Fan Pack Average Speed (Percent of Max) Sensor", }, /* Power Module Fan Pack Average RPM Speed Sensor */ { .index = 3, .sensor = { .Num = SNMP_BC_LAST_COMMON_POWER_MODULE_SENSOR + 3, .Type = SAHPI_FAN, .Category = SAHPI_EC_UNSPECIFIED, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = 0x00, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_RPM, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 13000, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* fanPackAverageSpeedRPM */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.6.1.1.6.x", .loc_offset = 0, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = 0x00, .deassert_mask = 0x00, .event_array = { {}, }, .reading2event = {}, }, .comment = "Power Module Fan Pack Average RPM Speed Sensor", }, {} /* Terminate array with a null element */ }; /******************** * I/O Module Sensors ********************/ struct snmp_bc_sensor snmp_bc_switch_sensors[] = { /* I/O Module Operational Status Sensor */ { .index = 1, .sensor = { .Num = 1, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_AVAILABILITY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_RUNNING | SAHPI_ES_OFF_LINE | SAHPI_ES_DEGRADED | SAHPI_ES_INSTALL_ERROR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_INT64, .BaseUnits = SAHPI_SU_UNSPECIFIED, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_INT64, .Value = { .SensorInt64 = 3, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_INT64, .Value = { .SensorInt64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* smHealthState */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.15.x", .loc_offset = 0, }, .cur_state = SAHPI_ES_RUNNING, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_DEGRADED | SAHPI_ES_OFF_LINE | SAHPI_ES_INSTALL_ERROR, .deassert_mask = SAHPI_ES_DEGRADED | SAHPI_ES_OFF_LINE | SAHPI_ES_INSTALL_ERROR, .event_array = { { .event = "0EA0000x", /* EN_FAULT_SWITCH_x */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0E00B00x", /* EN_SWITCH_x_INSUFFICIENT_PWR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0EA0C00x", /* EN_SWITCH_x_CFG_ERROR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_INSTALL_ERROR, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0EA0E00x", /* EN_SWITCH_x_POST_ERROR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_INSTALL_ERROR, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0EA0D00x", /* EN_SWITCH_x_POST_TIMEOUT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_INSTALL_ERROR, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0EA1A40x", /* EN_OVER_CURRENT_SWITCH_x */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, {}, }, .reading2event = { /* 0 = unknown */ { .num = 1, .rangemap = { .Flags = SAHPI_SRF_MIN, .Min = { .Value = { .SensorInt64 = 1, }, }, }, .state = SAHPI_ES_UNSPECIFIED, }, /* 1 = good */ { .num = 2, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Nominal = { .Value = { .SensorInt64 = 1, }, }, }, .state = SAHPI_ES_RUNNING, }, /* 2 = warning */ { .num = 3, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Nominal = { .Value = { .SensorInt64 = 2, }, }, }, .state = SAHPI_ES_DEGRADED, }, /* 3 = bad */ { .num = 4, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Nominal = { .Value = { .SensorInt64 = 3, }, }, }, .state = SAHPI_ES_OFF_LINE, }, }, }, .comment = "I/O Module Operational Status Sensor", }, /* I/O Module Temperature Sensor - event-only */ { .index = 2, .sensor = { .Num = 2, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, .ReadThold = 0, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "0EA1C40x", /* EN_OVER_TEMP_SWITCH_x */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR, }, { .event = "0EA1D40x", /* EN_OVER_TEMP_WARN_SWITCH_x */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "I/O Module Temperature Sensor", }, /* I/O Module Management Bus Operational Status Sensor - event only */ { .index = 3, .sensor = { .Num = 3, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_AVAILABILITY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_RUNNING | SAHPI_ES_OFF_LINE, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_RUNNING, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_OFF_LINE, .deassert_mask = SAHPI_ES_OFF_LINE, .event_array = { { .event = "0EA2200x", /* EN_STCONN_FAIL_SWITCH_x */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, {}, }, .reading2event = {}, }, .comment = "I/O Module Management Bus 0perations Sensor", }, {} /* Terminate array with a null element */ }; /*********************************** * BladeCenter Physical Slot Sensors ***********************************/ struct snmp_bc_sensor snmp_bc_slot_sensors[] = { /* Slot State Sensor */ { .index = 1, .sensor = { .Num = BLADECENTER_SENSOR_NUM_SLOT_STATE, .Type = SAHPI_ENTITY_PRESENCE, .Category = SAHPI_EC_PRESENCE, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_PRESENT | SAHPI_ES_ABSENT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64, .BaseUnits = SAHPI_SU_UNSPECIFIED, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = 0x00, } }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* Dummy OID to bypass test */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.8.1", .loc_offset = 0, }, .cur_state = SAHPI_ES_ABSENT, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_FALSE, .assert_mask = 0, .deassert_mask = 0, .event_array = { {}, }, .reading2event = {}, }, .comment = "Slot State Sensor", }, /* Slot Maximum Power Capability Sensor */ { .index = 2, .sensor = { .Num = BLADECENTER_SENSOR_NUM_MAX_POWER, .Type = SAHPI_OTHER_UNITS_BASED_SENSOR, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = 0x00, /* No event state */ .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64, .BaseUnits = SAHPI_SU_WATTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = 0x00, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* pd1ModuleAllocatedPowerMax */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.8.1", .loc_offset = 0, .threshold_oids = {}, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_FALSE, .assert_mask = 0x00, .deassert_mask = 0x00, .event_array = { {}, }, .reading2event = {}, }, .comment = "Slot Maximum Power Capability Sensor", }, /* Slot Assigned Power Sensor */ { .index = 3, .sensor = { .Num = BLADECENTER_SENSOR_NUM_ASSIGNED_POWER, .Type = SAHPI_OTHER_UNITS_BASED_SENSOR, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = 0, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64, .BaseUnits = SAHPI_SU_WATTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = 0x00, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, .ReadThold = 0, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* pd1ModuleAllocatedPowerCurrent */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.7.1", .loc_offset = 0, .threshold_oids = {}, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_FALSE, .assert_mask = 0x00, .deassert_mask = 0x00, .event_array = { {}, }, .reading2event = {}, }, .comment = "Slot Assigned Power Sensor", }, /* Slot Minumum Power Capability Sensor */ { .index = 4, .sensor = { .Num = BLADECENTER_SENSOR_NUM_MIN_POWER, .Type = SAHPI_OTHER_UNITS_BASED_SENSOR, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = 0, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64, .BaseUnits = SAHPI_SU_WATTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = {}, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, .ReadThold = 0, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* pd1ModuleAllocatedPowerMin */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.9.1", .loc_offset = 0, .threshold_oids = {}, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_FALSE, .assert_mask = 0, .deassert_mask = 0, .event_array = { {}, }, .reading2event = {}, }, .comment = "Slot Minumum Power Capability Sensor", }, {} /* Terminate array with a null element */ }; /********************* * Alarm Panel Sensors *********************/ struct snmp_bc_sensor snmp_bc_alarm_sensors[] = { /* Alarm Panel Operational Status Sensor */ { .index = 1, .sensor = { .Num = 1, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_AVAILABILITY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_RUNNING | SAHPI_ES_OFF_LINE, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_INT64, .BaseUnits = SAHPI_SU_UNSPECIFIED, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_INT64, .Value = { .SensorInt64 = 1, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_INT64, .Value = { .SensorInt64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* tapFaultLED */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.8.5.0", .loc_offset = 0, }, .cur_state = SAHPI_ES_RUNNING, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_OFF_LINE, .deassert_mask = SAHPI_ES_OFF_LINE, .event_array = { { .event = "6F60A101", /* EN_AP_HW_FAILURE */ .event_assertion = SAHPI_TRUE, .event_state = SAHPI_ES_OFF_LINE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .recovery_state = SAHPI_ES_RUNNING, }, {}, }, .reading2event = { /* 0 = Fault LED is off - ok */ { .num = 1, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Min = { .Value = { .SensorInt64 = 0, }, }, }, .state = SAHPI_ES_RUNNING, }, /* 1 = Fault LED is on - fault */ { .num = 2, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Nominal = { .Value = { .SensorInt64 = 1, }, }, }, .state = SAHPI_ES_OFF_LINE, }, }, }, .comment = "Alarm Panel Operational Status Sensor", }, {} /* Terminate array with a null element */ }; /******************************************** * Multiplexer Expansion Module (Mux) Sensors ********************************************/ struct snmp_bc_sensor snmp_bc_mux_sensors[] = { { .index = 1, .sensor = { .Num = 1, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_AVAILABILITY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_RUNNING | SAHPI_ES_OFF_LINE, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_INT64, .BaseUnits = SAHPI_SU_UNSPECIFIED, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_INT64, .Value = { .SensorInt64 = 1, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_INT64, .Value = { .SensorInt64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* ledMuxFault */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.10.1.1.5.x", .loc_offset = 0, }, .cur_state = SAHPI_ES_RUNNING, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_OFF_LINE, .deassert_mask = SAHPI_ES_OFF_LINE, .event_array = { { .event = "6F60D00x", /* EN_MX_1_HW_FAILURE */ .event_assertion = SAHPI_TRUE, .event_state = SAHPI_ES_OFF_LINE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .recovery_state = SAHPI_ES_RUNNING, }, {}, }, .reading2event = { /* 0 = Fault LED is off - ok */ { .num = 1, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Min = { .Value = { .SensorInt64 = 0, }, }, }, .state = SAHPI_ES_RUNNING, }, /* 1 = Fault LED is on - fault */ { .num = 2, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Nominal = { .Value = { .SensorInt64 = 1, }, }, }, .state = SAHPI_ES_OFF_LINE, }, }, }, .comment = "Mux Module Operational Status Sensor", }, {} /* Terminate array with a null element */ }; /****************************** * Network Clock Module Sensors ******************************/ struct snmp_bc_sensor snmp_bc_clock_sensors[] = { { .index = 1, .sensor = { .Num = 1, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_AVAILABILITY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_RUNNING | SAHPI_ES_OFF_LINE, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_INT64, .BaseUnits = SAHPI_SU_UNSPECIFIED, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_INT64, .Value = { .SensorInt64 = 1, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_INT64, .Value = { .SensorInt64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* ledNetworkClockFault */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.9.1.1.5.x", .loc_offset = 0, }, .cur_state = SAHPI_ES_RUNNING, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_OFF_LINE, .deassert_mask = SAHPI_ES_OFF_LINE, .event_array = { { .event = "6F60710x", /* EN_NC_x_HW_FAILURE */ .event_assertion = SAHPI_TRUE, .event_state = SAHPI_ES_OFF_LINE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .recovery_state = SAHPI_ES_RUNNING, }, {}, }, .reading2event = { /* 0 = Fault LED is off - ok */ { .num = 1, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Min = { .Value = { .SensorInt64 = 0, }, }, }, .state = SAHPI_ES_RUNNING, }, /* 1 = Fault LED is on - fault */ { .num = 2, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Nominal = { .Value = { .SensorInt64 = 1, }, }, }, .state = SAHPI_ES_OFF_LINE, }, }, }, .comment = "Alarm Panel Operational Status Sensor", }, {} /* Terminate array with a null element */ }; /**************************** * Front Bezel Filter Sensors ****************************/ struct snmp_bc_sensor snmp_bc_filter_sensors[] = { /* Front Bezel Filter Sensor - event only */ { .index = 1, .sensor = { .Num = 1, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_SEVERITY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_OK | SAHPI_ES_MINOR_FROM_OK | SAHPI_ES_INFORMATIONAL | SAHPI_ES_MAJOR_FROM_LESS | SAHPI_ES_CRITICAL, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_OK, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_OK | SAHPI_ES_MINOR_FROM_OK | SAHPI_ES_INFORMATIONAL | SAHPI_ES_MAJOR_FROM_LESS | SAHPI_ES_CRITICAL, .deassert_mask = SAHPI_ES_OK | SAHPI_ES_MINOR_FROM_OK | SAHPI_ES_INFORMATIONAL | SAHPI_ES_MAJOR_FROM_LESS | SAHPI_ES_CRITICAL, .event_array = { { .event = "6F100000", /* EN_FAULT_CRT_FILTER */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_CRITICAL, .recovery_state = SAHPI_ES_MAJOR_FROM_LESS, }, { .event = "6F200000", /* EN_FAULT_MJR_FILTER */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_MAJOR_FROM_LESS, .recovery_state = SAHPI_ES_MINOR_FROM_OK, }, { .event = "6F300000", /* EN_FAULT_MNR_FILTER */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_MINOR_FROM_OK, .recovery_state = SAHPI_ES_OK, }, { .event = "6F500000", /* EN_FAULT_MNR_FILTER_SERVICE */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_INFORMATIONAL, .recovery_state = SAHPI_ES_OK, }, }, .reading2event = {}, }, .comment = "Front Bezel Filter Sensor", }, {} /* Terminate array with a null element */ }; /************************************************************************* * Control Definitions *************************************************************************/ /************************************************************************* * WARNING - WARNING - WARNING - WARNING * Most of the .control.num are assigned sequentially. * There is 1 hardcoded control number: * BLADECENTER_CTRL_NUM_MGMNT_FAILOVER *************************************************************************/ /****************** * Chassis Controls ******************/ struct snmp_bc_control snmp_bc_chassis_controls_bc[] = { /* Chassis Location LED */ /* 0 is Off; 1 is solid on; 2 is blinking */ { .index = 1, .control = { .Num = 1, .OutputType = SAHPI_CTRL_LED, .Type = SAHPI_CTRL_TYPE_DISCRETE, .TypeUnion.Discrete.Default = 0, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_MANUAL, .ReadOnly = SAHPI_TRUE, }, .WriteOnly = SAHPI_FALSE, .Oem = 0, }, .control_info = { .mib = { .not_avail_indicator_num = 3, .write_only = SAHPI_FALSE, /* identityLED */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.1.4.0", .loc_offset = 0, }, .cur_mode = SAHPI_CTRL_MODE_MANUAL, }, .comment = "Chassis Location LED", }, {} /* Terminate array with a null element */ }; struct snmp_bc_control snmp_bc_chassis_controls_bct[] = { /* Chassis Location LED */ /* 0 is Off; 1 is solid on; 2 is blinking */ { .index = 1, .control = { .Num = 1, .OutputType = SAHPI_CTRL_LED, .Type = SAHPI_CTRL_TYPE_DISCRETE, .TypeUnion.Discrete.Default = 0, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_MANUAL, .ReadOnly = SAHPI_TRUE, }, .WriteOnly = SAHPI_FALSE, .Oem = 0, }, .control_info = { .mib = { .not_avail_indicator_num = 3, .write_only = SAHPI_FALSE, /* telcoIdentityLED */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.3.4.0", .loc_offset = 0, }, .cur_mode = SAHPI_CTRL_MODE_MANUAL, }, .comment = "Chassis Location LED", }, {} /* Terminate array with a null element */ }; /**************** * Blade Controls ****************/ struct snmp_bc_control snmp_bc_blade_controls[] = { /* Blade Location LED */ /* 0 is Off; 1 is solid on; 2 is blinking */ { .index = 1, .control = { .Num = 1, .OutputType = SAHPI_CTRL_LED, .Type = SAHPI_CTRL_TYPE_DISCRETE, .TypeUnion.Discrete.Default = 0, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_MANUAL, .ReadOnly = SAHPI_TRUE, }, .WriteOnly = SAHPI_FALSE, .Oem = 0, }, .control_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* ledBladeIdentity */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.11.x", .loc_offset = 0, }, .cur_mode = SAHPI_CTRL_MODE_MANUAL, }, .comment = "Blade Location LED", }, /* Blade BMC Reset */ /* 1 = reset */ { .index = 2, .control = { .Num = 2, .OutputType = SAHPI_CTRL_GENERIC, .Type = SAHPI_CTRL_TYPE_DISCRETE, .TypeUnion.Discrete.Default = 1, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_MANUAL, .ReadOnly = SAHPI_TRUE, }, .WriteOnly = SAHPI_TRUE, .Oem = 0, }, .control_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /*restartBladeSMP */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.9.x", .loc_offset = 0, }, .cur_mode = SAHPI_CTRL_MODE_MANUAL, }, .comment = "Blade BMC Reset", }, {} /* Terminate array with a null element */ }; /*************************************** * Blade Expansion Module (BEM) Controls ***************************************/ struct snmp_bc_control snmp_bc_bem_controls[] = { {} /* Terminate array with a null element */ }; /************************************ * Virtual Management Module Controls ************************************/ struct snmp_bc_control snmp_bc_virtual_mgmnt_controls[] = { /* MM Failover Control */ { .index = 1, .control = { .Num = BLADECENTER_CTRL_NUM_MGMNT_FAILOVER, .OutputType = SAHPI_CTRL_GENERIC, .Type = SAHPI_CTRL_TYPE_DIGITAL, .TypeUnion.Digital.Default = SAHPI_CTRL_STATE_OFF, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_MANUAL, .ReadOnly = SAHPI_TRUE, }, .WriteOnly = SAHPI_FALSE, .Oem = 0, }, .control_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* switchOverRedundantMM */ .oid = ".1.3.6.1.4.1.2.3.51.2.7.7.0", .loc_offset = 0, /* Read values */ .digitalmap[0] = -1, /* Always return SAHPI_CTRL_STATE_OFF */ .digitalmap[1] = -1, /* Always return SAHPI_CTRL_STATE_OFF */ .digitalmap[2] = -1, /* Always return SAHPI_CTRL_STATE_OFF */ .digitalmap[3] = -1, /* Always return SAHPI_CTRL_STATE_OFF */ /* Write values */ .digitalwmap[0] = -1, /* SAHPI_CTRL_STATE_OFF - Invalid */ .digitalwmap[1] = -1, /* SAHPI_CTRL_STATE_ON - Invalid */ .digitalwmap[2] = -1, /* SAHPI_CTRL_STATE_PULSE_OF - Invalid */ .digitalwmap[3] = 1, /* SAHPI_CTRL_STATE_PULSE_ON */ /* Constant read state */ .isDigitalReadStateConstant = SAHPI_TRUE, .DigitalStateConstantValue = SAHPI_CTRL_STATE_OFF, }, .cur_mode = SAHPI_CTRL_MODE_MANUAL, }, .comment = "MM Failover Control", }, {} /* Terminate array with a null element */ }; /**************************** * Management Module Controls ****************************/ struct snmp_bc_control snmp_bc_mgmnt_controls[] = { {} /* Terminate array with a null element */ }; /********************* * Media Tray Controls *********************/ struct snmp_bc_control snmp_bc_mediatray_controls[] = { {} /* Terminate array with a null element */ }; struct snmp_bc_control snmp_bc_mediatray2_controls[] = { {} /* Terminate array with a null element */ }; /***************** * Blower Controls *****************/ struct snmp_bc_control snmp_bc_blower_controls[] = { {} /* Terminate array with a null element */ }; /**************** * Power Controls ****************/ struct snmp_bc_control snmp_bc_power_controls[] = { {} /* Terminate array with a null element */ }; /************************ * Switch Module Controls ************************/ struct snmp_bc_control snmp_bc_switch_controls[] = { {} /* Terminate array with a null element */ }; /************************ * Physical Slot Controls ************************/ struct snmp_bc_control snmp_bc_slot_controls[] = { {} /* Terminate array with a null element */ }; /******************* * BEM DASD Controls *******************/ struct snmp_bc_control snmp_bc_bem_dasd_controls[] = { {} /* Terminate array with a null element */ }; /********************** * Alarm Panel Controls **********************/ struct snmp_bc_control snmp_bc_alarm_controls[] = { {} /* Terminate array with a null element */ }; /*************************************** * Multiplexer Expansion Module Controls ***************************************/ struct snmp_bc_control snmp_bc_mux_controls[] = { {} /* Terminate array with a null element */ }; /******************************* * Network Clock Module Controls *******************************/ struct snmp_bc_control snmp_bc_clock_controls[] = { {} /* Terminate array with a null element */ }; /********************* * Air Filter Controls *********************/ struct snmp_bc_control snmp_bc_filter_controls[] = { {} /* Terminate array with a null element */ }; /************************************************************************* * Inventory Definitions *************************************************************************/ /************* * Chassis VPD *************/ struct snmp_bc_inventory snmp_bc_chassis_inventories[] = { { .inventory = { .IdrId = 1, .Oem = 0, }, .inventory_info = { .hardware_mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .area_type = SAHPI_IDR_AREATYPE_CHASSIS_INFO, .oid = { /* bladeCenterVpdMachineModel */ .OidChassisType = ".1.3.6.1.4.1.2.3.51.2.2.21.1.1.2.0", .OidMfgDateTime = '\0', /* Set to SAHPI_TIME_UNSPECIFIED */ /* bladeCenterManufacturingId */ .OidManufacturer = ".1.3.6.1.4.1.2.3.51.2.2.21.1.1.5.0", /* bladeCenterVpdMachineType */ .OidProductName = ".1.3.6.1.4.1.2.3.51.2.2.21.1.1.1.0", /* bladeCenterHardwareRevision */ .OidProductVersion = ".1.3.6.1.4.1.2.3.51.2.2.21.1.1.6.0", /* bladeCenterSerialNumber */ .OidSerialNumber = ".1.3.6.1.4.1.2.3.51.2.2.21.1.1.3.0", /* bladeCenterFruNumber */ .OidPartNumber = ".1.3.6.1.4.1.2.3.51.2.2.21.1.1.7.0", .OidFileId = '\0', .OidAssetTag = '\0', } }, .firmware_mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .area_type = SAHPI_IDR_AREATYPE_PRODUCT_INFO, .oid = { .OidChassisType = '\0', .OidMfgDateTime = '\0', /* Set to SAHPI_TIME_UNSPECIFIED */ .OidManufacturer = '\0', .OidProductName = '\0', .OidProductVersion = '\0', .OidSerialNumber = '\0', .OidPartNumber = '\0', .OidFileId = '\0', .OidAssetTag = '\0', } }, }, .comment = "Chassis VPD", }, {} /* Terminate array with a null element */ }; /************ * Blower VPD ************/ struct snmp_bc_inventory snmp_bc_blower_inventories[] = { { .inventory = { .IdrId = 6, .Oem = 0, }, .inventory_info = { .hardware_mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .area_type = SAHPI_IDR_AREATYPE_BOARD_INFO, .oid = { .OidChassisType = '\0', .OidMfgDateTime = '\0', /* Set to SAHPI_TIME_UNSPECIFIED */ /* blowerHardwareVpdManufacturingId */ .OidManufacturer = ".1.3.6.1.4.1.2.3.51.2.2.21.13.1.1.3.x", /* blowerHardwareVpdMachineType */ .OidProductName = "\0", /* blowerHardwareVpdHardwareRevision */ .OidProductVersion = ".1.3.6.1.4.1.2.3.51.2.2.21.13.1.1.5.x", /* blowerHardwareVpdFruSerial */ .OidSerialNumber = ".1.3.6.1.4.1.2.3.51.2.2.21.13.1.1.11.x", /* blowerHardwareVpdFruNumber */ .OidPartNumber = ".1.3.6.1.4.1.2.3.51.2.2.21.13.1.1.4.x", .OidFileId = '\0', .OidAssetTag = '\0', } }, .firmware_mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .area_type = SAHPI_IDR_AREATYPE_PRODUCT_INFO, .oid = { .OidChassisType = '\0', .OidMfgDateTime = '\0', /* Set to SAHPI_TIME_UNSPECIFIED */ .OidManufacturer = '\0', .OidProductName = '\0', .OidProductVersion = '\0', .OidSerialNumber = '\0', .OidPartNumber = '\0', .OidFileId = '\0', .OidAssetTag = '\0', } }, }, .comment = "Blower VPD", }, {} /* Terminate array with a null element */ }; /******************************* * Virtual Management Module VPD *******************************/ struct snmp_bc_inventory snmp_bc_virtual_mgmnt_inventories[] = { {} /* Terminate array with a null element */ }; /*********************** * Management Module VPD ***********************/ struct snmp_bc_inventory snmp_bc_mgmnt_inventories[] = { { .inventory = { .IdrId = 4, .Oem = 0, }, .inventory_info = { .hardware_mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .area_type = SAHPI_IDR_AREATYPE_BOARD_INFO, .oid = { .OidChassisType = '\0', .OidMfgDateTime = '\0', /* Set to SAHPI_TIME_UNSPECIFIED */ /* mmHardwareVpdManufacturingId */ .OidManufacturer = ".1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.3.x", .OidProductName = '\0', /* mmHardwareVpdHardwareRevision */ .OidProductVersion = ".1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.5.x", .OidSerialNumber = '\0', /* mmHardwareVpdFruNumber */ .OidPartNumber = ".1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.4.x", .OidFileId = '\0', .OidAssetTag = '\0', } }, .firmware_mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .area_type = SAHPI_IDR_AREATYPE_PRODUCT_INFO, .oid = { .OidChassisType = '\0', /* mmMainApplVpdBuildDate */ .OidMfgDateTime = ".1.3.6.1.4.1.2.3.51.2.2.21.3.1.1.6.x", .OidManufacturer = '\0', .OidProductName = '\0', /* mmMainApplVpdBuildId */ .OidProductVersion = ".1.3.6.1.4.1.2.3.51.2.2.21.3.1.1.3.x", .OidSerialNumber = '\0', .OidPartNumber = '\0', /* mmMainApplVpdFilename */ .OidFileId = ".1.3.6.1.4.1.2.3.51.2.2.21.3.1.1.5.x", /* mmMainApplVpdName */ .OidAssetTag = ".1.3.6.1.4.1.2.3.51.2.2.21.3.1.1.2.x", } }, }, .comment = "MM VPD", }, {} /* Terminate array with a null element */ }; /**************** * I/O Module VPD ****************/ struct snmp_bc_inventory snmp_bc_switch_inventories[] = { { .inventory = { .IdrId = 5, .Oem = 0, }, .inventory_info = { .hardware_mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .area_type = SAHPI_IDR_AREATYPE_BOARD_INFO, .oid = { .OidChassisType = '\0', .OidMfgDateTime = '\0', /* Set to SAHPI_TIME_UNSPECIFIED */ /* smHardwareVpdManufacturingId */ .OidManufacturer = ".1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.3.x", .OidProductName = '\0', /* smHardwareVpdHardwareRevision */ .OidProductVersion = ".1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.5.x", .OidSerialNumber = '\0', /* smHardwareVpdFruNumber */ .OidPartNumber = ".1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.4.x", .OidFileId = '\0', .OidAssetTag = '\0', } }, .firmware_mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .area_type = SAHPI_IDR_AREATYPE_PRODUCT_INFO, .oid = { .OidChassisType = '\0', /* smBootRomVpdBuildDate */ .OidMfgDateTime = ".1.3.6.1.4.1.2.3.51.2.2.21.7.2.1.6.x", .OidManufacturer = '\0', /* smMainApp1VpdBuildId */ .OidProductName = ".1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.5.x", /* smMainApp1VpdRevisionNumber */ .OidProductVersion = ".1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.7.x", .OidSerialNumber = '\0', .OidPartNumber = '\0', .OidFileId = '\0', .OidAssetTag = '\0', } }, }, .comment = "I/O Module VPD", }, {} /* Terminate array with a null element */ }; /*********** * Blade VPD ***********/ struct snmp_bc_inventory snmp_bc_blade_inventories[] = { { .inventory = { .IdrId = 6, .Oem = 0, }, .inventory_info = { .hardware_mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .area_type = SAHPI_IDR_AREATYPE_BOARD_INFO, .oid = { .OidChassisType = '\0', .OidMfgDateTime = '\0', /* Set to SAHPI_TIME_UNSPECIFIED */ /* bladeHardwareVpdManufacturingId */ .OidManufacturer = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.3.x", /* bladeHardwareVpdMachineType */ .OidProductName = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.7.x", /* bladeHardwareVpdHardwareRevision */ .OidProductVersion = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.5.x", /* bladeHardwareVpdSerialNumber */ .OidSerialNumber = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.6.x", /* bladeHardwareVpdFruNumber */ .OidPartNumber = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.4.x", .OidFileId = '\0', .OidAssetTag = '\0', } }, .firmware_mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .area_type = SAHPI_IDR_AREATYPE_PRODUCT_INFO, .oid = { .OidChassisType = '\0', /* bladeBiosVpdDate */ .OidMfgDateTime = ".1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.8.x", .OidManufacturer = '\0', /* bladeBiosVpdBuildId */ .OidProductName = ".1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.6.x", /* bladeBiosVpdRevision */ .OidProductVersion = ".1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.7.x", .OidSerialNumber = '\0', .OidPartNumber = '\0', .OidFileId = '\0', .OidAssetTag = '\0', } }, }, .comment = "Blade VPD", }, {} /* Terminate array with a null element */ }; /********************************** * Blade Expansion Module (BEM) VPD **********************************/ struct snmp_bc_inventory snmp_bc_bem_inventories[] = { {} /* Terminate array with a null element */ }; /**************** * Media Tray VPD ****************/ struct snmp_bc_inventory snmp_bc_mediatray_inventories[] = { { .inventory = { .IdrId = 8, .Oem = 0, }, .inventory_info = { .hardware_mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .area_type = SAHPI_IDR_AREATYPE_BOARD_INFO, .oid = { .OidChassisType = '\0', .OidMfgDateTime = '\0', /* Set to SAHPI_TIME_UNSPECIFIED */ /* mtHardwareVpdManufacturingId */ .OidManufacturer = ".1.3.6.1.4.1.2.3.51.2.2.21.9.3.0", .OidProductName = '\0', /* mtHardwareVpdHardwareRevision */ .OidProductVersion = ".1.3.6.1.4.1.2.3.51.2.2.21.9.5.0", .OidSerialNumber = '\0', /* mtHardwareVpdFruNumber */ .OidPartNumber = ".1.3.6.1.4.1.2.3.51.2.2.21.9.4.0", .OidFileId = '\0', .OidAssetTag = '\0', } }, .firmware_mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .area_type = SAHPI_IDR_AREATYPE_PRODUCT_INFO, .oid = { .OidChassisType = '\0', .OidMfgDateTime = '\0', /* Set to SAHPI_TIME_UNSPECIFIED */ .OidManufacturer = '\0', .OidProductName = '\0', .OidProductVersion = '\0', .OidSerialNumber = '\0', .OidPartNumber = '\0', .OidFileId = '\0', .OidAssetTag = '\0', } }, }, .comment = "Media Tray VPD", }, {} /* Terminate array with a null element */ }; struct snmp_bc_inventory snmp_bc_mediatray2_inventories[] = { { .inventory = { .IdrId = 82, .Oem = 0, }, .inventory_info = { .hardware_mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .area_type = SAHPI_IDR_AREATYPE_BOARD_INFO, .oid = { .OidChassisType = '\0', .OidMfgDateTime = '\0', /* Set to SAHPI_TIME_UNSPECIFIED */ /* mt2HardwareVpdManufacturingId */ .OidManufacturer = ".1.3.6.1.4.1.2.3.51.2.2.21.10.3.0", .OidProductName = '\0', /* mt2HardwareVpdHardwareRevision */ .OidProductVersion = ".1.3.6.1.4.1.2.3.51.2.2.21.10.5.0", .OidSerialNumber = '\0', /* mt2HardwareVpdFruNumber */ .OidPartNumber = ".1.3.6.1.4.1.2.3.51.2.2.21.10.4.0", .OidFileId = '\0', .OidAssetTag = '\0', } }, .firmware_mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .area_type = SAHPI_IDR_AREATYPE_PRODUCT_INFO, .oid = { .OidChassisType = '\0', .OidMfgDateTime = '\0', /* Set to SAHPI_TIME_UNSPECIFIED */ .OidManufacturer = '\0', .OidProductName = '\0', .OidProductVersion = '\0', .OidSerialNumber = '\0', .OidPartNumber = '\0', .OidFileId = '\0', .OidAssetTag = '\0', } }, }, .comment = "Media Tray 2 VPD", }, {} /* Terminate array with a null element */ }; /****************** * Power Module VPD ******************/ struct snmp_bc_inventory snmp_bc_power_inventories[] = { { .inventory = { .IdrId = 10, .Oem = 0, }, .inventory_info = { .hardware_mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .area_type = SAHPI_IDR_AREATYPE_BOARD_INFO, .oid = { .OidChassisType = '\0', .OidMfgDateTime = '\0', /* Set to SAHPI_TIME_UNSPECIFIED */ /* pmHardwareVpdManufacturingId */ .OidManufacturer = ".1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.3.x", .OidProductName = '\0', /* pmHardwareVpdHardwareRevision */ .OidProductVersion = ".1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.5.x", .OidSerialNumber = '\0', /* pmHardwareVpdFruNumber */ .OidPartNumber = ".1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.4.x", .OidFileId = '\0', .OidAssetTag = '\0', } }, .firmware_mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .area_type = SAHPI_IDR_AREATYPE_PRODUCT_INFO, .oid = { .OidChassisType = '\0', .OidMfgDateTime = '\0', /* Set to SAHPI_TIME_UNSPECIFIED */ .OidManufacturer = '\0', .OidProductName = '\0', .OidProductVersion = '\0', .OidSerialNumber = '\0', .OidPartNumber = '\0', .OidFileId = '\0', .OidAssetTag = '\0', } }, }, .comment = "Power Module VPD", }, {} /* Terminate array with a null element */ }; /******************* * Physical Slot VPD *******************/ struct snmp_bc_inventory snmp_bc_slot_inventories[] = { {} /* Terminate array with a null element */ }; /************** * BEM DASD VPD **************/ struct snmp_bc_inventory snmp_bc_bem_dasd_inventories[] = { {} /* Terminate array with a null element */ }; /***************** * Alarm Panel VPD *****************/ struct snmp_bc_inventory snmp_bc_alarm_inventories[] = { { .inventory = { .IdrId = 14, .Oem = 0, }, .inventory_info = { .hardware_mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .area_type = SAHPI_IDR_AREATYPE_BOARD_INFO, .oid = { .OidChassisType = '\0', .OidMfgDateTime = '\0', /* Set to SAHPI_TIME_UNSPECIFIED */ /* tapHardwareVpdManufacturingId */ .OidManufacturer = ".1.3.6.1.4.1.2.3.51.2.2.21.15.3.0", .OidProductName = '\0', /* tapHardwareVpdHardwareRevision */ .OidProductVersion = ".1.3.6.1.4.1.2.3.51.2.2.21.15.5.0", /* tapHardwareVpdFruSerial */ .OidSerialNumber = ".1.3.6.1.4.1.2.3.51.2.2.21.15.11.0", /* tapHardwareVpdFruNumber */ .OidPartNumber = ".1.3.6.1.4.1.2.3.51.2.2.21.15.4.0", .OidFileId = '\0', .OidAssetTag = '\0', } }, .firmware_mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .area_type = SAHPI_IDR_AREATYPE_PRODUCT_INFO, .oid = { .OidChassisType = '\0', .OidMfgDateTime = '\0', .OidManufacturer = '\0', .OidProductName = '\0', .OidProductVersion = '\0', .OidSerialNumber = '\0', .OidPartNumber = '\0', .OidFileId = '\0', .OidAssetTag = '\0', } }, }, .comment = "Alarm Panel VPD", }, {} /* Terminate array with a null element */ }; /********************************** * Multiplexer Expansion Module VPD **********************************/ struct snmp_bc_inventory snmp_bc_mux_inventories[] = { { .inventory = { .IdrId = 15, .Oem = 0, }, .inventory_info = { .hardware_mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .area_type = SAHPI_IDR_AREATYPE_BOARD_INFO, .oid = { .OidChassisType = '\0', .OidMfgDateTime = '\0', /* Set to SAHPI_TIME_UNSPECIFIED */ /* mxHardwareVpdManufacturingId */ .OidManufacturer = ".1.3.6.1.4.1.2.3.51.2.2.21.17.1.1.3.x", .OidProductName = '\0', /* mxHardwareVpdHardwareRevision */ .OidProductVersion = ".1.3.6.1.4.1.2.3.51.2.2.21.17.1.1.5.x", /* mxHardwareVpdFruSerial */ .OidSerialNumber = ".1.3.6.1.4.1.2.3.51.2.2.21.17.1.1.11.x", /* mxHardwareVpdFruNumber */ .OidPartNumber = ".1.3.6.1.4.1.2.3.51.2.2.21.17.1.1.4.x", .OidFileId = '\0', .OidAssetTag = '\0', } }, .firmware_mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .area_type = SAHPI_IDR_AREATYPE_PRODUCT_INFO, .oid = { .OidChassisType = '\0', .OidMfgDateTime = '\0', /* Set to SAHPI_TIME_UNSPECIFIED */ .OidManufacturer = '\0', .OidProductName = '\0', .OidProductVersion = '\0', .OidSerialNumber = '\0', .OidPartNumber = '\0', .OidFileId = '\0', .OidAssetTag = '\0', } }, }, .comment = "Multiplexer Expansion Module VPD", }, {} /* Terminate array with a null element */ }; /************************** * Network Clock Module VPD **************************/ struct snmp_bc_inventory snmp_bc_clock_inventories[] = { { .inventory = { .IdrId = 16, .Oem = 0, }, .inventory_info = { .hardware_mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .area_type = SAHPI_IDR_AREATYPE_BOARD_INFO, .oid = { .OidChassisType = '\0', .OidMfgDateTime = '\0', /* Set to SAHPI_TIME_UNSPECIFIED */ /* ncHardwareVpdManufacturingId */ .OidManufacturer = ".1.3.6.1.4.1.2.3.51.2.2.21.16.1.1.3.x", .OidProductName = '\0', /* ncHardwareVpdHardwareRevision */ .OidProductVersion = ".1.3.6.1.4.1.2.3.51.2.2.21.16.1.1.5.x", /* ncHardwareVpdFruSerial */ .OidSerialNumber = ".1.3.6.1.4.1.2.3.51.2.2.21.16.1.1.11.x", /* ncHardwareVpdFruNumber */ .OidPartNumber = ".1.3.6.1.4.1.2.3.51.2.2.21.16.1.1.4.x", .OidFileId = '\0', .OidAssetTag = '\0', } }, .firmware_mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .area_type = SAHPI_IDR_AREATYPE_PRODUCT_INFO, .oid = { .OidChassisType = '\0', .OidMfgDateTime = '\0', /* Set to SAHPI_TIME_UNSPECIFIED */ .OidManufacturer = '\0', .OidProductName = '\0', .OidProductVersion = '\0', .OidSerialNumber = '\0', .OidPartNumber = '\0', .OidFileId = '\0', .OidAssetTag = '\0', } }, }, .comment = "Network Clock Module VPD", }, {} /* Terminate array with a null element */ }; /**************** * Air Filter VPD ****************/ struct snmp_bc_inventory snmp_bc_filter_inventories[] = { {} /* Terminate array with a null element */ }; /*********************** * Switch Interposer VPD ***********************/ struct snmp_bc_inventory snmp_bc_interposer_switch_inventories[] = { { .inventory = { .IdrId = 18, .Oem = 0, }, .inventory_info = { .hardware_mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .area_type = SAHPI_IDR_AREATYPE_BOARD_INFO, .oid = { .OidChassisType = '\0', .OidMfgDateTime = '\0', /* Set to SAHPI_TIME_UNSPECIFIED */ /* smInpHardwareVpdManufacturingId */ .OidManufacturer = ".1.3.6.1.4.1.2.3.51.2.2.21.6.2.1.3.x", .OidProductName = '\0', /* smInpHardwareVpdHardwareRevision */ .OidProductVersion = ".1.3.6.1.4.1.2.3.51.2.2.21.6.2.1.5.x", /* smInpHardwareVpdFruSerial */ .OidSerialNumber = ".1.3.6.1.4.1.2.3.51.2.2.21.6.2.1.11.x", /* smInpHardwareVpdFruNumber */ .OidPartNumber = ".1.3.6.1.4.1.2.3.51.2.2.21.6.2.1.4.x", .OidFileId = '\0', .OidAssetTag = '\0', } }, .firmware_mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .area_type = SAHPI_IDR_AREATYPE_PRODUCT_INFO, .oid = { .OidChassisType = '\0', .OidMfgDateTime = '\0', /* Set to SAHPI_TIME_UNSPECIFIED */ .OidManufacturer = '\0', .OidProductName = '\0', .OidProductVersion = '\0', .OidSerialNumber = '\0', .OidPartNumber = '\0', .OidFileId = '\0', .OidAssetTag = '\0', } }, }, .comment = "Switch Interposer VPD", }, {} /* Terminate array with a null element */ }; /******************* * MM Interposer VPD *******************/ struct snmp_bc_inventory snmp_bc_interposer_mm_inventories[] = { { .inventory = { .IdrId = 19, .Oem = 0, }, .inventory_info = { .hardware_mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .area_type = SAHPI_IDR_AREATYPE_BOARD_INFO, .oid = { .OidChassisType = '\0', .OidMfgDateTime = '\0', /* Set to SAHPI_TIME_UNSPECIFIED */ /* mmInpHardwareVpdManufacturingId */ .OidManufacturer = ".1.3.6.1.4.1.2.3.51.2.2.21.2.2.1.3.x", .OidProductName = '\0', /* mmInpHardwareVpdHardwareRevision */ .OidProductVersion = ".1.3.6.1.4.1.2.3.51.2.2.21.2.2.1.5.x", /* mmInpHardwareVpdFruSerial */ .OidSerialNumber = ".1.3.6.1.4.1.2.3.51.2.2.21.2.2.1.9.x", /* mmInpHardwareVpdFruNumber */ .OidPartNumber = ".1.3.6.1.4.1.2.3.51.2.2.21.2.2.1.4.x", .OidFileId = '\0', .OidAssetTag = '\0', } }, .firmware_mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .area_type = SAHPI_IDR_AREATYPE_PRODUCT_INFO, .oid = { .OidChassisType = '\0', .OidMfgDateTime = '\0', /* Set to SAHPI_TIME_UNSPECIFIED */ .OidManufacturer = '\0', .OidProductName = '\0', .OidProductVersion = '\0', .OidSerialNumber = '\0', .OidPartNumber = '\0', .OidFileId = '\0', .OidAssetTag = '\0', } }, }, .comment = "Management Module Interposer VPD", }, {} /* Terminate array with a null element */ }; openhpi-3.6.1/plugins/snmp_bc/snmp_bc_reset.c0000644000175100017510000001176512575647274020301 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #include /** * snmp_bc_get_reset_state: * @hnd: Handler data pointer. * @rid: Resource ID. * @act: Location to store resource's reset action state. * * Retrieves a resource's reset action state. * Always return SAHPI_RESET_DEASSERT. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_RESET. * SA_ERR_HPI_INVALID_RESOURCE - Resource doesn't exist. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT snmp_bc_get_reset_state(void *hnd, SaHpiResourceIdT rid, SaHpiResetActionT *act) { struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; SaHpiRptEntryT *rpt; if (!hnd || !act) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } snmp_bc_lock_handler(custom_handle); /* Check if resource exists and has reset capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_RESET)) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_CAPABILITY); } *act = SAHPI_RESET_DEASSERT; snmp_bc_unlock_handler(custom_handle); return(SA_OK); } /** * snmp_bc_set_reset_state: * @hnd: Handler data pointer. * @rid: Resource ID. * @act: Reset action state to set. * * Sets a resource's reset action state. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_RESET. * SA_ERR_HPI_INVALID_CMD - Resource doesn't support SAHPI_RESET_ASSERT. * SA_ERR_HPI_INVALID_RESOURCE - Resource doesn't exist. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL; @act invalid. **/ SaErrorT snmp_bc_set_reset_state(void *hnd, SaHpiResourceIdT rid, SaHpiResetActionT act) { SaErrorT err; struct ResourceInfo *resinfo; struct snmp_value set_value; struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; SaHpiRptEntryT *rpt; if (!hnd || NULL == oh_lookup_resetaction(act)){ err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } if (act == SAHPI_RESET_ASSERT || act == SAHPI_RESET_DEASSERT) return(SA_ERR_HPI_INVALID_CMD); handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } snmp_bc_lock_handler(custom_handle); /* Check if resource exists and has reset capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_RESET)) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_CAPABILITY); } resinfo = (struct ResourceInfo *)oh_get_resource_data(handle->rptcache, rid); if (resinfo == NULL) { err("No resource data. Resource=%s", rpt->ResourceTag.Data); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } if (resinfo->mib.OidReset == NULL) { err("No Reset OID."); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } switch (act) { case SAHPI_COLD_RESET: /* COLD = WARM Reset Action */ case SAHPI_WARM_RESET: set_value.type = ASN_INTEGER; set_value.str_len = 1; set_value.integer = 1; err = snmp_bc_oid_snmp_set(custom_handle, &(rpt->ResourceEntity), 0, resinfo->mib.OidReset, set_value); if (err) { err("Cannot set SNMP OID=%s; Type=%d.", resinfo->mib.OidReset, set_value.type); snmp_bc_unlock_handler(custom_handle); return(err); } break; case SAHPI_RESET_ASSERT: /* RESET_ASSERT = RESET_DEASSERT Action */ case SAHPI_RESET_DEASSERT: snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_CMD); default: err("Invalid Reset Action Type=%d.", act); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } snmp_bc_unlock_handler(custom_handle); return(SA_OK); } void * oh_get_reset_state (void *, SaHpiResourceIdT, SaHpiResetActionT *) __attribute__ ((weak, alias("snmp_bc_get_reset_state"))); void * oh_set_reset_state (void *, SaHpiResourceIdT, SaHpiResetActionT) __attribute__ ((weak, alias("snmp_bc_set_reset_state"))); openhpi-3.6.1/plugins/snmp_bc/snmp_bc_resources.h0000644000175100017510000005272312575647274021175 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Sean Dague * Renier Morales * Steve Sherman */ /************************************************************************* * This header file stubs resource and RDR static infomation that are used * in constructing RPTs and RDRs for IBM BladeCenter chassis and * RSA (Integrated and separate adapter models). * * Differences between the models are discovered dynamically by this * plugin at run-time during resource discovery. *************************************************************************/ #ifndef __SNMP_BC_RESOURCES_H #define __SNMP_BC_RESOURCES_H /* Start HPI location numbers from 1 */ #define SNMP_BC_HPI_LOCATION_BASE 1 /* An invalid snmp_bc index */ #define SNMP_BC_NOT_VALID 0xFF /* IBM Manufacturing Number - Use IANA number for "Modular Blade Server" */ #define IBM_MANUFACTURING_ID 20944 /* Maximum OID string length */ #define SNMP_BC_MAX_OID_LENGTH 50 /* OIDs to determine platform types */ #define SNMP_BC_CHASSIS_TYPE_OID ".1.3.6.1.4.1.2.3.51.2.22.4.38.0" /* chassisType */ #define SNMP_BC_CHASSIS_SUBTYPE_OID ".1.3.6.1.4.1.2.3.51.2.22.4.39.0" /* chassisSubtype */ #define SNMP_BC_CHASSIS_TYPE_BC 97 #define SNMP_BC_CHASSIS_TYPE_BCT 98 #define SNMP_BC_CHASSIS_SUBTYPE_ORIG 0 #define SNMP_BC_CHASSIS_SUBTYPE_H 2 /* Original models don't have chassis type/subtype OIDs - just health OIDs */ #define SNMP_BC_PLATFORM_OID_BC ".1.3.6.1.4.1.2.3.51.2.2.7.1.0" /* systemHealthStat, BC System Health */ #define SNMP_BC_PLATFORM_OID_BCT ".1.3.6.1.4.1.2.3.51.2.2.9.1.0" /* telcoSystemHealthStat, BCT System Health */ #define SNMP_BC_PLATFORM_OID_RSA ".1.3.6.1.4.1.2.3.51.1.2.7.1.0" /* RSA System Health */ /* Run-time variables to distinguish platform types */ #define SNMP_BC_PLATFORM_BCT 0x0001 #define SNMP_BC_PLATFORM_BC 0x0002 #define SNMP_BC_PLATFORM_RSA 0x0004 #define SNMP_BC_PLATFORM_BCH 0x0008 #define SNMP_BC_PLATFORM_BCHT 0x0009 #define SNMP_BC_PLATFORM_ALL 0xFFFF /* Resource indexes to snmp_rpt array in discovery */ typedef enum { BC_RPT_ENTRY_CHASSIS = 0, BC_RPT_ENTRY_VIRTUAL_MGMNT_MODULE, BC_RPT_ENTRY_MGMNT_MODULE, BC_RPT_ENTRY_SWITCH_MODULE, BC_RPT_ENTRY_BLADE, BC_RPT_ENTRY_BLADE_EXPANSION_CARD, BC_RPT_ENTRY_MEDIA_TRAY, BC_RPT_ENTRY_MEDIA_TRAY_2, BC_RPT_ENTRY_BLOWER_MODULE, BC_RPT_ENTRY_POWER_MODULE, BC_RPT_ENTRY_PHYSICAL_SLOT, BC_RPT_ENTRY_BEM_DASD, BC_RPT_ENTRY_ALARM_PANEL, BC_RPT_ENTRY_MUX_MODULE, BC_RPT_ENTRY_CLOCK_MODULE, BC_RPT_ENTRY_AIR_FILTER, BC_RPT_ENTRY_INTERPOSER_SWITCH, BC_RPT_ENTRY_INTERPOSER_MM } BCRptEntryT; /* Matching mmblade.mib definitions */ /* storageExpansion(1), */ /* pciExpansion(2) */ typedef enum { DEFAULT_BLADE_EXPANSION_CARD_TYPE = 0, BLADE_STORAGE_EXPANSION, BLADE_PCI_EXPANSION } BCExpansionTypeT; typedef enum { RSA_RPT_ENTRY_CHASSIS = 0, RSA_RPT_ENTRY_CPU, RSA_RPT_ENTRY_DASD, RSA_RPT_ENTRY_FAN } RSARptEntryT; /* Maximum number of RSA resources */ #define RSA_MAX_CPU 8 #define RSA_MAX_FAN 8 #define RSA_MAX_DASD 4 /* Maximum entries in eventlog, approximate */ #define BC_EL_MAX_SIZE 768 /* 512 */ /* OIDs definitions for Blade Center Chassis Topology */ #define SNMP_BC_NOS_FP_SUPPORTED ".1.3.6.1.4.1.2.3.51.2.22.4.18.0" /* chassisNoOfFPsSupported, FanPack */ #define SNMP_BC_NOS_PB_SUPPORTED ".1.3.6.1.4.1.2.3.51.2.22.4.19.0" /* chassisNoOfPBsSupported, ProcessorBlade */ #define SNMP_BC_NOS_SM_SUPPORTED ".1.3.6.1.4.1.2.3.51.2.22.4.20.0" /* chassisNoOfSMsSupported, SwitchModule */ #define SNMP_BC_NOS_MM_SUPPORTED ".1.3.6.1.4.1.2.3.51.2.22.4.21.0" /* chassisNoOfMMsSupported, ManagementModule */ #define SNMP_BC_NOS_PM_SUPPORTED ".1.3.6.1.4.1.2.3.51.2.22.4.22.0" /* chassisNoOfPMsSupported, PowerModule */ #define SNMP_BC_NOS_MT_SUPPORTED ".1.3.6.1.4.1.2.3.51.2.22.4.23.0" /* chassisNoOfMTsSupported, MediaTray */ #define SNMP_BC_NOS_BLOWER_SUPPORTED ".1.3.6.1.4.1.2.3.51.2.22.4.24.0" /* chassisNoOfBlowersSupported, Blower */ #define SNMP_BC_NOS_FILTER_SUPPORTED ".1.3.6.1.4.1.2.3.51.2.22.4.40.0" /* chassisNoOfFBsSupported, Front Bezel */ #define SNMP_BC_NOS_AP_SUPPORTED ".1.3.6.1.4.1.2.3.51.2.22.4.41.0" /* chassisNoOfAPsSupported, AlarmPanel */ #define SNMP_BC_NOS_NC_SUPPORTED ".1.3.6.1.4.1.2.3.51.2.22.4.42.0" /* chassisNoOfNCsSupported, NetworkClock Card */ #define SNMP_BC_NOS_MX_SUPPORTED ".1.3.6.1.4.1.2.3.51.2.22.4.43.0" /* chassisNoOfMXsSupported, Multiplexer Expansion Mod */ #define SNMP_BC_NOS_MMI_SUPPORTED ".1.3.6.1.4.1.2.3.51.2.22.4.44.0" /* chassisNoOfMMIsSupported, MM Interposer */ #define SNMP_BC_NOS_SMI_SUPPORTED ".1.3.6.1.4.1.2.3.51.2.22.4.45.0" /* chassisNoOfSMIsSupported, Switch Interposer */ #define SNMP_BC_PB_INSTALLED ".1.3.6.1.4.1.2.3.51.2.22.4.25.0" /* chassisPBsInstalled, ProcessorBlade */ #define SNMP_BC_SM_INSTALLED ".1.3.6.1.4.1.2.3.51.2.22.4.29.0" /* chassisSMsInstalled, SwitchModule */ #define SNMP_BC_MM_INSTALLED ".1.3.6.1.4.1.2.3.51.2.22.4.30.0" /* chassisMMsInstalled, ManagementModule */ #define SNMP_BC_PM_INSTALLED ".1.3.6.1.4.1.2.3.51.2.22.4.31.0" /* chassisPMsInstalled, PowerModule */ #define SNMP_BC_MT_INSTALLED ".1.3.6.1.4.1.2.3.51.2.22.4.32.0" /* chassisMTInstalled, MediaTray */ #define SNMP_BC_NOS_MT_INSTALLED ".1.3.6.1.4.1.2.3.51.2.22.4.52.0" /* chassisNoOfMTsInstalled, MediaTray */ #define SNMP_BC_BLOWER_INSTALLED ".1.3.6.1.4.1.2.3.51.2.22.4.33.0" /* chassisBlowersInstalled, Blower */ #define SNMP_BC_FP_INSTALLED ".1.3.6.1.4.1.2.3.51.2.22.4.37.0" /* chassisFPsinstalled, FanPack */ #define SNMP_BC_FILTER_INSTALLED ".1.3.6.1.4.1.2.3.51.2.22.4.46.0" /* chassisNoOfFBsInstalled, FrontBezel (Filter) */ #define SNMP_BC_AP_INSTALLED ".1.3.6.1.4.1.2.3.51.2.22.4.47.0" /* chassisNoOfAPsInstalled, AlarmPanel */ #define SNMP_BC_NC_INSTALLED ".1.3.6.1.4.1.2.3.51.2.22.4.48.0" /* chassisNoOfNCsInstalled, NetworkClock Card */ #define SNMP_BC_MX_INSTALLED ".1.3.6.1.4.1.2.3.51.2.22.4.49.0" /* chassisNoOfMXsInstalled, Multiplexer Expansion Mod */ #define SNMP_BC_MMI_INSTALLED ".1.3.6.1.4.1.2.3.51.2.22.4.50.0" /* chassisNoOfMMIsInstalled. MM Interposer*/ #define SNMP_BC_SMI_INSTALLED ".1.3.6.1.4.1.2.3.51.2.22.4.51.0" /* chassisNoOfSMIsInstalled, Switch Interposer */ #define SNMP_BC_NC_VPD_BAY_NUMBER ".1.3.6.1.4.1.2.3.51.2.2.21.16.1.1.2.x" /* ncHardwareVpdBayNumber, */ #define SNMP_BC_MX_VPD_BAY_NUMBER ".1.3.6.1.4.1.2.3.51.2.2.21.17.1.1.2.x" /* mxHardwareVpdBayNumber, */ #define SNMP_BC_SMI_VPD_BAY_NUMBER ".1.3.6.1.4.1.2.3.51.2.2.21.6.2.1.2.x" /* smInpHardwareVpdBayNumber, Switch Interposer VpsBayNumber */ #define SNMP_BC_BLADE_EXPANSION_VECTOR ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.14.x" /* bladeServerExpansion */ #define SNMP_BC_BLADE_EXP_BLADE_BAY ".1.3.6.1.4.1.2.3.51.2.2.21.4.3.1.19.x" /* bladeExpBoardVpdBladeBayNumber */ #define SNMP_BC_BLADE_EXP_TYPE ".1.3.6.1.4.1.2.3.51.2.2.21.4.3.1.20.x" /* bladeExpBoardVpdCardType */ #define SNMP_BC_MGMNT_ACTIVE ".1.3.6.1.4.1.2.3.51.2.22.4.34.0" /* chassisActiveMM */ #define SNMP_BC_DST ".1.3.6.1.4.1.2.3.51.2.4.4.2.0" /* spClockTimezoneSetting */ #define SNMP_BC_DST_RSA ".1.3.6.1.4.1.2.3.51.1.4.4.2.0" #define SNMP_BC_CPU_OID_RSA ".1.3.6.1.4.1.2.3.51.1.2.20.1.5.1.1.3.x" #define SNMP_BC_DASD_OID_RSA ".1.3.6.1.4.1.2.3.51.1.2.20.1.6.1.1.3.x" #define SNMP_BC_FAN_OID_RSA ".1.3.6.1.4.1.2.3.51.1.2.3.x.0" /* OID definitions for System Event Log */ #define SNMP_BC_DATETIME_OID ".1.3.6.1.4.1.2.3.51.2.4.4.1.0" /* spClockDateAndTimeSetting */ #define SNMP_BC_DATETIME_OID_RSA ".1.3.6.1.4.1.2.3.51.1.4.4.1.0" #define SNMP_BC_SEL_INDEX_OID ".1.3.6.1.4.1.2.3.51.2.3.4.2.1.1" /* readEventLogIndex */ #define SNMP_BC_SEL_INDEX_OID_RSA ".1.3.6.1.4.1.2.3.51.1.3.4.2.1.1" #define SNMP_BC_SEL_ENTRY_OID ".1.3.6.1.4.1.2.3.51.2.3.4.2.1.2" /* readEventLogString */ #define SNMP_BC_SEL_ENTRY_OID_RSA ".1.3.6.1.4.1.2.3.51.1.3.4.2.1.2" #define SNMP_BC_SEL_CLEAR_OID ".1.3.6.1.4.1.2.3.51.2.3.4.3.0" /* clearEventLog */ #define SNMP_BC_SEL_CLEAR_OID_RSA ".1.3.6.1.4.1.2.3.51.1.3.4.3.0" /* mmHeathState OID */ #define SNMP_BC_MM_HEALTH_OID ".1.3.6.1.4.1.2.3.51.2.22.5.1.1.5.1" /* mmHealthState */ /* Slot ResourceTag */ #define SNMP_BC_PHYSICAL_SLOT "Blade Slot" #define SNMP_BC_SWITCH_SLOT "I/O Module Slot" #define SNMP_BC_POWER_SUPPLY_SLOT "Power Module Slot" #define SNMP_BC_PERIPHERAL_BAY_SLOT "Media Tray Slot" #define SNMP_BC_SYS_MGMNT_MODULE_SLOT "Management Module Slot" #define SNMP_BC_BLOWER_SLOT "Blower Slot" #define SNMP_BC_ALARM_PANEL_SLOT "Alarm Panel Slot" #define SNMP_BC_MUX_SLOT "Multiplexer Expansion Module Slot" #define SNMP_BC_CLOCK_SLOT "Network Clock Module Slot" /* Slot Power OIDs */ #define SNMP_BC_PD1POWERCURRENT ".1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.7" /* pd1ModuleAllocatedPowerCurrent */ #define SNMP_BC_PD1POWERMAX ".1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.8" /* pd1ModuleAllocatedPowerMax */ #define SNMP_BC_PD1POWERMIN ".1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.9" /* pd1ModuleAllocatedPowerMin */ #define SNMP_BC_PD2POWERCURRENT ".1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.7" /* pd2ModuleAllocatedPowerCurrent */ #define SNMP_BC_PD2POWERMAX ".1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.8" /* pd2ModuleAllocatedPowerMax */ #define SNMP_BC_PD2POWERMIN ".1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.9" /* pd2ModuleAllocatedPowerMin */ #define SNMP_BC_PD1STATE ".1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.6" /* pd1ModuleState */ #define SNMP_BC_PD2STATE ".1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.6" /* pd2ModuleState: standby(0), on(1), notPresent(2),notApplicable(255)*/ #define SNMP_BC_PMSTATE ".1.3.6.1.4.1.2.3.51.2.2.4.1.1.3" /* powerModuleState: unknown(0), good(1), warning(2), not available(3) */ /* Sensor and Control Numbers defined for Redundancy MM Implementation */ #define BLADECENTER_SENSOR_NUM_MGMNT_REDUNDANCY (SaHpiSensorNumT) 0x1001 #define BLADECENTER_SENSOR_NUM_MGMNT_ACTIVE (SaHpiSensorNumT) 0x1002 #define BLADECENTER_SENSOR_NUM_MGMNT_STANDBY (SaHpiSensorNumT) 0x1003 #define BLADECENTER_CTRL_NUM_MGMNT_FAILOVER (SaHpiCtrlNumT) 0x1010 #define BLADECENTER_CTRL_NUM_FAILED_RESOURCE_EXTRACT (SaHpiCtrlNumT) 0x101E /********************** * Resource Definitions **********************/ struct ResourceMibInfo { const char *OidReset; const char *OidPowerState; const char *OidPowerOnOff; const char *OidUuid; const char *OidResourceWidth; /* OID specifying how many physical slots a blade occupies */ }; /* SNMP_BC_MAX_RESOURCE_EVENT_ARRAY_SIZE includes an ending NULL entry */ #define SNMP_BC_MAX_EVENTS_PER_RESOURCE 10 #define SNMP_BC_MAX_RESOURCE_EVENT_ARRAY_SIZE (SNMP_BC_MAX_EVENTS_PER_RESOURCE + 1) /* For BladeCenter resources, some managed hot swap state events (e.g. INSERTION_PENDING and EXTRACTION_PENDING) are automatically generated. The "auto" fields below determine the auto-generated events. It's assummed that the INACTIVE state (0) never needs to be auto generated. */ struct res_event_map { char *event; SaHpiBoolT event_res_failure; SaHpiBoolT event_res_failure_unexpected; SaHpiHsStateT event_state; SaHpiHsStateT event_auto_state; SaHpiHsStateT recovery_state; SaHpiHsStateT recovery_auto_state; }; struct ResourceInfo { struct ResourceMibInfo mib; unsigned int resourcewidth; SaHpiHsStateT cur_state; SaHpiHsStateT prev_state; /* Needed to handle events that re-announce current hot swap state */ struct res_event_map event_array[SNMP_BC_MAX_RESOURCE_EVENT_ARRAY_SIZE]; }; struct snmp_rpt { SaHpiRptEntryT rpt; struct ResourceInfo res_info; const char *comment; const char *OidResourceTag; }; extern struct snmp_rpt snmp_bc_rpt_array[]; extern struct snmp_rpt snmp_bc_rpt_array_rsa[]; /******************** * Sensor Definitions ********************/ struct SnmpSensorThresholdOids { const char *LowMinor; const char *LowMajor; const char *LowCritical; const char *UpMinor; const char *UpMajor; const char *UpCritical; const char *PosThdHysteresis; const char *NegThdHysteresis; const char *TotalPosThdHysteresis; const char *TotalNegThdHysteresis; }; struct SnmpSensorWritableThresholdOids { const char *LowMinor; const char *LowMajor; const char *LowCritical; const char *UpMinor; const char *UpMajor; const char *UpCritical; const char *PosThdHysteresis; const char *NegThdHysteresis; }; struct SensorMibInfo { unsigned int not_avail_indicator_num; /* 0 for none, n>0 otherwise */ SaHpiBoolT write_only; /* TRUE - Write-only SNMP command */ const char *oid; SaHpiEntityLocationT loc_offset; struct SnmpSensorThresholdOids threshold_oids; struct SnmpSensorWritableThresholdOids threshold_write_oids; }; /* Size definitions include an ending NULL entry */ #define SNMP_BC_MAX_EVENTS_PER_SENSOR 128 #define SNMP_BC_MAX_READING_MAPS_PER_SENSOR 6 #define SNMP_BC_MAX_SENSOR_EVENT_ARRAY_SIZE (SNMP_BC_MAX_EVENTS_PER_SENSOR + 1) #define SNMP_BC_MAX_SENSOR_READING_MAP_ARRAY_SIZE (SNMP_BC_MAX_READING_MAPS_PER_SENSOR + 1) /* If you add to this structure, you may also have to change EventMapInfoT and event discovery in snmp_bc_event.c */ struct sensor_event_map { char *event; SaHpiBoolT event_assertion; SaHpiBoolT event_res_failure; SaHpiBoolT event_res_failure_unexpected; SaHpiEventStateT event_state; SaHpiEventStateT recovery_state; }; struct sensor_reading_map { int num; SaHpiSensorRangeT rangemap; SaHpiEventStateT state; }; struct SensorInfo { struct SensorMibInfo mib; SaHpiEventStateT cur_state; /* This really records the last state read from the SEL */ /* Which may not be the current state of the sensor */ SaHpiResourceIdT cur_child_rid; SaHpiBoolT sensor_enabled; SaHpiBoolT events_enabled; SaHpiEventStateT assert_mask; SaHpiEventStateT deassert_mask; struct sensor_event_map event_array[SNMP_BC_MAX_SENSOR_EVENT_ARRAY_SIZE]; struct sensor_reading_map reading2event[SNMP_BC_MAX_SENSOR_READING_MAP_ARRAY_SIZE]; }; /* Usually sensor.Num = index in snmp_bc_resources.c. But to support HPI-defined sensor numbers (e.g. aggregate sensors), they can be different. sensor.Num supports the HPI sensor number while index is used to search through the plugin's sensor definition arrays */ struct snmp_bc_sensor { int index; SaHpiSensorRecT sensor; struct SensorInfo sensor_info; const char *comment; }; struct snmp_bc_ipmi_sensor { const char *ipmi_tag; const char *ipmi_tag_alias1; struct snmp_bc_sensor ipmi; }; extern struct snmp_bc_sensor snmp_bc_chassis_sensors[]; extern struct snmp_bc_sensor snmp_bc_chassis_sensors_bct_filter[]; extern struct snmp_bc_sensor snmp_bc_blade_sensors[]; extern struct snmp_bc_ipmi_sensor snmp_bc_blade_ipmi_sensors[]; extern struct snmp_bc_sensor snmp_bc_bem_sensors[]; extern struct snmp_bc_ipmi_sensor snmp_bc_bem_ipmi_sensors[]; extern struct snmp_bc_sensor snmp_bc_bse_dasd_sensors[]; extern struct snmp_bc_sensor snmp_bc_bse3_dasd_sensors[]; extern struct snmp_bc_sensor snmp_bc_mgmnt_sensors[]; extern struct snmp_bc_sensor snmp_bc_mgmnt_health_sensors[]; extern struct snmp_bc_sensor snmp_bc_virtual_mgmnt_sensors[]; extern struct snmp_bc_sensor snmp_bc_mediatray_sensors[]; extern struct snmp_bc_sensor snmp_bc_mediatray_sensors_faultled[]; extern struct snmp_bc_sensor snmp_bc_mediatray_sensors_nofaultled[]; extern struct snmp_bc_sensor snmp_bc_mediatray2_sensors[]; extern struct snmp_bc_sensor snmp_bc_blower_sensors[]; extern struct snmp_bc_sensor snmp_bc_blower_sensors_bch[]; extern struct snmp_bc_sensor snmp_bc_power_sensors[]; extern struct snmp_bc_sensor snmp_bc_power_sensors_bch[]; extern struct snmp_bc_sensor snmp_bc_switch_sensors[]; extern struct snmp_bc_sensor snmp_bc_slot_sensors[]; extern struct snmp_bc_sensor snmp_bc_alarm_sensors[]; extern struct snmp_bc_sensor snmp_bc_mux_sensors[]; extern struct snmp_bc_sensor snmp_bc_clock_sensors[]; extern struct snmp_bc_sensor snmp_bc_filter_sensors[]; extern struct snmp_bc_sensor snmp_bc_chassis_sensors_rsa[]; extern struct snmp_bc_sensor snmp_bc_cpu_sensors_rsa[]; extern struct snmp_bc_sensor snmp_bc_dasd_sensors_rsa[]; extern struct snmp_bc_sensor snmp_bc_fan_sensors_rsa[]; /********************* * Control Definitions *********************/ struct ControlMibInfo { unsigned int not_avail_indicator_num; /* 0 for none, n>0 otherwise */ int write_only; /* Write-only SNMP command; 0 no; 1 yes */ const char *oid; SaHpiEntityLocationT loc_offset; int digitalmap[OH_MAX_CTRLSTATEDIGITAL]; /* Readable digital controls */ int digitalwmap[OH_MAX_CTRLSTATEDIGITAL]; /* Writable digital controls */ SaHpiBoolT isDigitalReadStateConstant; SaHpiCtrlStateDigitalT DigitalStateConstantValue; }; struct ControlInfo { struct ControlMibInfo mib; SaHpiCtrlModeT cur_mode; SaHpiCtrlStateUnionT valid_states_get; /* Only meaningful for Digital Controls */ SaHpiCtrlStateUnionT allowed_states_set; /* Only meaningful for Digital Controls */ }; /* Usually control.Num = index in snmp_bc_resources.c. But to support ATCA/HPI defined control numbers, they can be different. control.Num supports the HPI control number while index is used to search through the plugin's control definition arrays */ struct snmp_bc_control { int index; SaHpiCtrlRecT control; struct ControlInfo control_info; const char *comment; }; extern struct snmp_bc_control snmp_bc_chassis_controls_bc[]; extern struct snmp_bc_control snmp_bc_chassis_controls_bct[]; extern struct snmp_bc_control snmp_bc_blade_controls[]; extern struct snmp_bc_control snmp_bc_bem_controls[]; extern struct snmp_bc_control snmp_bc_mgmnt_controls[]; extern struct snmp_bc_control snmp_bc_virtual_mgmnt_controls[]; extern struct snmp_bc_control snmp_bc_mediatray_controls[]; extern struct snmp_bc_control snmp_bc_mediatray2_controls[]; extern struct snmp_bc_control snmp_bc_blower_controls[]; extern struct snmp_bc_control snmp_bc_power_controls[]; extern struct snmp_bc_control snmp_bc_switch_controls[]; extern struct snmp_bc_control snmp_bc_slot_controls[]; extern struct snmp_bc_control snmp_bc_bem_dasd_controls[]; extern struct snmp_bc_control snmp_bc_alarm_controls[]; extern struct snmp_bc_control snmp_bc_mux_controls[]; extern struct snmp_bc_control snmp_bc_clock_controls[]; extern struct snmp_bc_control snmp_bc_filter_controls[]; extern struct snmp_bc_control snmp_bc_chassis_controls_rsa[]; extern struct snmp_bc_control snmp_bc_cpu_controls_rsa[]; extern struct snmp_bc_control snmp_bc_dasd_controls_rsa[]; extern struct snmp_bc_control snmp_bc_fan_controls_rsa[]; /*********************** * Inventory Definitions ***********************/ struct SnmpInventoryOids { const char *OidChassisType; const char *OidMfgDateTime; const char *OidManufacturer; const char *OidProductName; const char *OidProductVersion; const char *OidSerialNumber; const char *OidPartNumber; const char *OidFileId; const char *OidAssetTag; }; struct InventoryMibInfo { unsigned int not_avail_indicator_num; /* 0 for none, n>0 otherwise */ int write_only; /* Write-only SNMP command; 0 no; 1 yes */ SaHpiIdrAreaTypeT area_type; struct SnmpInventoryOids oid; }; struct InventoryInfo { struct InventoryMibInfo hardware_mib; struct InventoryMibInfo firmware_mib; }; struct snmp_bc_inventory { SaHpiInventoryRecT inventory; struct InventoryInfo inventory_info; const char *comment; }; extern struct snmp_bc_inventory snmp_bc_chassis_inventories[]; extern struct snmp_bc_inventory snmp_bc_blower_inventories[]; extern struct snmp_bc_inventory snmp_bc_mgmnt_inventories[]; extern struct snmp_bc_inventory snmp_bc_virtual_mgmnt_inventories[]; extern struct snmp_bc_inventory snmp_bc_switch_inventories[]; extern struct snmp_bc_inventory snmp_bc_blade_inventories[]; extern struct snmp_bc_inventory snmp_bc_bem_inventories[]; extern struct snmp_bc_inventory snmp_bc_mediatray_inventories[]; extern struct snmp_bc_inventory snmp_bc_mediatray2_inventories[]; extern struct snmp_bc_inventory snmp_bc_power_inventories[]; extern struct snmp_bc_inventory snmp_bc_slot_inventories[]; extern struct snmp_bc_inventory snmp_bc_bem_dasd_inventories[]; extern struct snmp_bc_inventory snmp_bc_alarm_inventories[]; extern struct snmp_bc_inventory snmp_bc_mux_inventories[]; extern struct snmp_bc_inventory snmp_bc_clock_inventories[]; extern struct snmp_bc_inventory snmp_bc_filter_inventories[]; extern struct snmp_bc_inventory snmp_bc_interposer_switch_inventories[]; extern struct snmp_bc_inventory snmp_bc_interposer_mm_inventories[]; extern struct snmp_bc_inventory snmp_bc_chassis_inventories_rsa[]; extern struct snmp_bc_inventory snmp_bc_cpu_inventories_rsa[]; extern struct snmp_bc_inventory snmp_bc_dasd_inventories_rsa[]; extern struct snmp_bc_inventory snmp_bc_fan_inventories_rsa[]; #endif openhpi-3.6.1/plugins/snmp_bc/eventmap2code.pl0000755000175100017510000004423312575647274020402 0ustar mohanmohan#!/usr/bin/perl ################################################################## # (C) COPYRIGHT IBM Corp 2004, 2006 # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # # Author(s): # Steve Sherman ################################################################### ################################################################### # NOTE!! Parallel make had problems with generated header files. To # get around this, the code in this script that generates the # header files has been commented out. Instead the header files have # been checked into CVS. The HPI_DEF in snmp_bc_event.map have also # been commented out. ################################################################### ################################################################### # Script Description: # # This script takes raw event information contained in # snmp_bc_event.map and generates code that populates the # errlog2event_hash table. This can be done in two ways - # with C code or with XML code. The C code way is simpler # but takes more memory. XML is more complex but takes less space. # # The default way is to generate C code and header files to # populate the hash table. This generates the following files: # # el.h - Error log header file with common #defines # el2event.h - Header file definitions need by generated C file. # el2event.c - Generated C code that adds events to directly to # the errlog2event_hash table. # # The second way is to translate events into XML data which is # (in a later step and script) turned into source code that # populates the hash table. This generates the following files: # # el.h - Error log header file with common #defines # el2event.h - Header file definitions need by generated source. # event.xml - XML formatted events. # # If the XML method is used, another script, scripts/text2cstr.pl, # needs to be invoked to turn the XML formatted events into source # code that populates the hash table. # # Script Input: # # --debug (optional) Turn on debug info. # Default is no. # --idir (optional) Root directory for input file(s). # Default is current directory. # --mapfile (optional) Input file name of the event map file. # Default is snmp_bc_event.map. # --odir (optional) Directory for output file(s). # Default is current directory. # --xml (optional) Generate XML formatted events. # Default is to generate C formatted # events and code. # # Exit codes # - 1 successful # - 0 error occurred #################################################################### use strict; use Getopt::Long; sub check4dups($$); #sub print_h_file_header; #sub print_h_file_ending; sub print_c_file_header; sub print_c_file_ending; sub print_c_file_hash_member($); sub print_xml_file_header; sub print_xml_file_ending; sub print_xml_file_hash_member($); #sub print_err_hfile_header; #sub print_err_hfile_ending; GetOptions( "debug" => \my $debug, "idir=s" => \my $idir, "mapfile=s" => \my $mapfile, "odir=s" => \my $odir, "xml" => \my $xml, ); ########################## # Set directory/file names ########################## if ($idir eq "") { $idir = `pwd`; chomp $idir; } if ($mapfile eq "") { $mapfile = "snmp_bc_event.map"; } my $file_map = $idir . "/$mapfile"; if ($odir eq "") { $odir = `pwd`; chomp $odir; } my $oevent_cfile = "el2event.c"; #my $oerror_hfile = "el.h"; #my $oevent_hfile = "el2event.h"; if ($xml) { $oevent_cfile = "event.xml"; } my $file_c = $odir . "/$oevent_cfile"; #my $file_err_h = $odir . "/$oerror_hfile"; #my $file_h = $odir . "/$oevent_hfile"; unlink $file_c; #unlink $file_h; #unlink $file_err_h; ############ # Open files ############ open (FILE_MAP, $file_map) or die "$0 Error! Cannot open $file_map. $! Stopped"; open (FILE_C, ">>$file_c") or die "$0 Error! Cannot open file $file_c. $! Stopped"; #open (FILE_H, ">>$file_h") or die "$0 Error! Cannot open file $file_h. $! Stopped"; #open (FILE_ERR_H, ">>$file_err_h") or die "$0 Error! Cannot open file $file_err_h. $! Stopped"; ################################################################# # Parse event map file information into internal perl hash tables ################################################################# my $err = 0; my %eventmap = (); #my %defmap = (); while ( ) { # Skip comments/blank lines next if /^\s*\/\// || /^\s*#/ || /^\s*$/; my $line = $_; # (my $hpidef_event, my $hpidef, my $def) = split/\|/,$line; (my $event_name, my $event_hex, my $event_severity, my $override_flags, my $event_msg, my $rest) = split/\|/,$line; # chomp($def); chomp($event_msg); # if ($hpidef_event eq "HPI_DEF") { # if ($hpidef eq "" || $def eq "" || $defmap{$hpidef} ne "") { # print "******************************************************\n"; # print "$0: Error! Definition $hpidef not found or not unique.\n"; # print "******************************************************\n\n"; # $err = 1; # goto CLEANUP; # } # $defmap{$hpidef} = $def; # } # else { if ($event_name eq "" || $event_hex eq "" || $event_severity eq "" || $override_flags eq "" || $event_msg eq "") { print "Line is $_\n"; print "*************************************************************\n"; print "$0: Error! Format for event incomplete for event=$event_name.\n"; print "**************************************************************\n\n"; $err = 1; goto CLEANUP; } # Put message string into internal hash. my $hash_msg = $event_msg; $hash_msg =~ s/\"$//; check4dups($line, $hash_msg); # } } ############################## # Create error log header file ############################## #if (&print_err_hfile_header) { $err = 0; goto CLEANUP; } #foreach my $d (keys %defmap) { # chomp $defmap{$d}; # print FILE_ERR_H "#define $d $defmap{$d}\n"; #} #if (&print_err_hfile_ending) { $err = 0; goto CLEANUP; } ################################################# # Create "Error Log to event" mapping header file ################################################# #if (&print_h_file_header) { $err = 0; goto CLEANUP; } #if (&print_h_file_ending) { $err = 0; goto CLEANUP; } ################################################ # Create "Error Log 2 event" mapping source file ################################################ if ($xml) { if (&print_xml_file_header) { $err = 0; goto CLEANUP; } foreach my $event_message (sort keys %eventmap) { if (&print_xml_file_hash_member($event_message)) { $err = 0; goto CLEANUP; } } if (&print_xml_file_ending) { $err = 0; goto CLEANUP; } } else { if (&print_c_file_header) { $err = 0; goto CLEANUP; } foreach my $event_message (sort keys %eventmap) { if (&print_c_file_hash_member($event_message)) { $err = 0; goto CLEANUP; } } if (&print_c_file_ending) { $err = 0; goto CLEANUP; } } CLEANUP: close FILE_MAP; close FILE_C; #close FILE_H; #close FILE_ERR_H; exit ($err); ################################################################## # Check for duplicate event messages. # Add _HPIDUP to both the internal hash_msg name and to the # external event_msg name. HPI code handles stripping the _HPIDUP # string from the external names. # The internal tables thus have hash keys that look like: # - msg # - msg_HPIDUPx ################################################################## sub check4dups($$) { my ($line, $hash_msg) = @_; my ($event_name, $event_hex, $event_severity, $override_flags, $event_msg, $rest) = split/\|/,$line; chomp($event_msg); if ($eventmap{$hash_msg} ne "") { if ($debug) { print "$0: Warning! Event=$event_hex; MSG=$event_name not unique.\n"; } # Update number of dups in original entry my ($num, $entry) = split/\|/,$eventmap{$hash_msg},2; my $dups = $num + 1; chomp($entry); $eventmap{$hash_msg} = $dups . "|$entry"; # Create unique hash entry and HPI string identifier for each duplicate my $hashdup = $hash_msg; my $msgdup = $event_msg; $hashdup =~ s/\"$//; $msgdup =~ s/\"$//; $hashdup = $hashdup . "_HPIDUP" . $dups . "\""; $msgdup = $msgdup . "_HPIDUP" . $dups . "\""; $eventmap{$hashdup} = "0|$event_name|$event_hex|$event_severity|$override_flags|$msgdup|$rest"; # print ("DUPS msg=$hashdup; 0|$event_name|$event_hex|$event_severity|$override_flags|$msgdup|$rest\n"); } else { $eventmap{$hash_msg} = "0|$event_name|$event_hex|$event_severity|$override_flags|$event_msg|$rest"; # print ("NonDUPS msg=$hash_msg; 0|$event_name|$event_hex|$event_severity|$override_flags|$event_msg|$rest\n"); } return 0; } ####################################################### # Print "Error Log to Event" header file's leading text ####################################################### #sub print_h_file_header { # # print FILE_H < #include #include #include #include GHashTable *errlog2event_hash; static void free_hash_data(gpointer key, gpointer value, gpointer user_data); /************************************************************************ * errlog2event_hash_init: * \@custom_handle: Plugin's data pointer. * * Initializes the Error Log to event translation hash table. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_OUT_OF_SPACE - No memory to allocate hash table structures. * SA_ERR_HPI_INVALID_PARAMS - \@custom_handle is NULL. ************************************************************************/ SaErrorT errlog2event_hash_init(struct snmp_bc_hnd *custom_handle) { gchar *key; /* gchar *key_exists; */ ErrLog2EventInfoT *strinfo; if (!custom_handle) { dbg("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } errlog2event_hash = g_hash_table_new(g_str_hash, g_str_equal); if (errlog2event_hash == NULL) { dbg("No memory."); return(SA_ERR_HPI_OUT_OF_SPACE); } EOF return 0; } ##################################### # Print c file's static trailing text ##################################### sub print_c_file_ending { print FILE_C <event = $event_hex_str; /* $event_name */ $tab strinfo->event_sev = $event_severity; $tab strinfo->event_ovr = $override_flags; $tab strinfo->event_dup = $event_count; $tab g_hash_table_insert(errlog2event_hash, key, strinfo); EOF #$tab #$tab key_exists = g_hash_table_lookup(errlog2event_hash, key); #$tab if (!key_exists) { #$tab strinfo->event = $event_hex_str; /* $event_name */ #$tab strinfo->event_sev = $event_severity; #$tab strinfo->event_ovr = $override_flags; #$tab strinfo->event_dup = $event_count; #$tab g_hash_table_insert(errlog2event_hash, key, strinfo); #$tab } #$tab else { #$tab dbg("Error!: Key %s defined twice", key); #$tab errlog2event_hash_free(); #$tab return -1; #$tab } #EOF print FILE_C "\n"; return 0; } ############################################ # Print error log header file's leading text ############################################ #sub print_err_hfile_header { # print FILE_ERR_H < EOF return 0; } ####################################### # Print XML file's static trailing text ####################################### sub print_xml_file_ending { print FILE_C < EOF return 0; } ############################### # Print XML file's dynamic text ############################### sub print_xml_file_hash_member($) { my ($event_message) = @_; my ($event_count, $event_name, $event_hex, $event_severity, $override_flags, $event_msg, $rest) = split/\|/,$eventmap{$event_message}; chomp($event_msg); my $event_hex_str = "\"$event_hex\""; $event_hex_str =~ s/^\"0x/\"/; # Format override flags if ($override_flags ne "NO_OVR") { $override_flags =~ s/,/ | /g; } print FILE_C < EOF print FILE_C "\n"; return 0; } openhpi-3.6.1/plugins/snmp_bc/snmp_bc_resources_rsa.c0000644000175100017510000024426612575647274022042 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman * W. David Ashley */ #include /************************************************************************* * Resource Definitions *************************************************************************/ struct snmp_rpt snmp_bc_rpt_array_rsa[] = { /* Chassis */ { .rpt = { .ResourceInfo = { .ManufacturerId = IBM_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .ResourceCapabilities = SAHPI_CAPABILITY_EVENT_LOG | SAHPI_CAPABILITY_EVT_DEASSERTS | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_CRITICAL, .ResourceFailed = SAHPI_FALSE, }, .res_info = { .mib = { .OidReset = '\0', .OidPowerState = '\0', .OidPowerOnOff = '\0', .OidUuid = ".1.3.6.1.4.1.2.3.51.1.2.21.2.1.4.0", }, .event_array = {}, }, .comment = "RSA Chassis" }, /* CPUs */ { .rpt = { .ResourceInfo = { .ManufacturerId = IBM_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_PROCESSOR, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .ResourceCapabilities = SAHPI_CAPABILITY_EVT_DEASSERTS | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_MAJOR, .ResourceFailed = SAHPI_FALSE, }, .res_info = { .mib = { .OidReset = '\0', .OidPowerState = '\0', .OidPowerOnOff = '\0', .OidUuid = '\0', }, .event_array = {}, }, .comment = "CPU" }, /* DASD */ { .rpt = { .ResourceInfo = { .ManufacturerId = IBM_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_DISK_BAY, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .ResourceCapabilities = SAHPI_CAPABILITY_EVT_DEASSERTS | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_MAJOR, .ResourceFailed = SAHPI_FALSE, }, .res_info = { .mib = { .OidReset = '\0', .OidPowerState = '\0', .OidPowerOnOff = '\0', .OidUuid = '\0', }, .event_array = {}, }, .comment = "DASD" }, /* Fans */ { .rpt = { .ResourceInfo = { .ManufacturerId = IBM_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_FAN, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, } }, .ResourceCapabilities = SAHPI_CAPABILITY_EVT_DEASSERTS | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_MAJOR, .ResourceFailed = SAHPI_FALSE, }, .res_info = { .mib = { .OidReset = '\0', .OidPowerState = '\0', .OidPowerOnOff = '\0', .OidUuid = '\0', }, .event_array = { {}, }, }, .comment = "Fan" }, {} /* Terminate array with a null element */ }; /****************************************************************************** * Sensor Definitions ******************************************************************************/ /***************** * Chassis Sensors *****************/ struct snmp_bc_sensor snmp_bc_chassis_sensors_rsa[] = { /* Thermal sensor on planar */ { .index = 1, .sensor = { .Num = 1, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT | SAHPI_STM_UP_HYSTERESIS, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = 0, .oid = ".1.3.6.1.4.1.2.3.51.1.2.20.1.1.1.1.3.1", .loc_offset = 0, .threshold_oids = { .UpCritical = ".1.3.6.1.4.1.2.3.51.1.2.20.1.1.1.1.4.1", .UpMajor = ".1.3.6.1.4.1.2.3.51.1.2.20.1.1.1.1.6.1", .TotalPosThdHysteresis = ".1.3.6.1.4.1.2.3.51.1.2.20.1.1.1.1.7.1", }, }, .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "0601C480", /* EN_CUTOFF_HI_OVER_TEMP_PLANAR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "0601C080", /* EN_OVER_TEMP_PLANAR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "0601D500", /* EN_PFA_HI_OVER_TEMP_PLANAR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, }, .comment = "Planar temperature sensor" }, /* CPU area thermal sensor on planar */ { .index = 2, .sensor = { .Num = 2, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT | SAHPI_STM_UP_HYSTERESIS, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = 0, .oid = ".1.3.6.1.4.1.2.3.51.1.2.20.1.1.1.1.3.3", .loc_offset = 0, .threshold_oids = { .UpCritical = ".1.3.6.1.4.1.2.3.51.1.2.20.1.1.1.1.4.3", .UpMajor = ".1.3.6.1.4.1.2.3.51.1.2.20.1.1.1.1.6.3", .TotalPosThdHysteresis = ".1.3.6.1.4.1.2.3.51.1.2.20.1.1.1.1.7.3", }, }, .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "0401C480", /* EN_CUTOFF_HI_OVER_TEMP_PROC */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "0401D400", /* EN_PFA_HI_OVER_TEMP_PROC */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, }, .comment = "Planar CPU area temperature sensor" }, /* I/O thermal sensor on planar */ { .index = 3, .sensor = { .Num = 3, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT | SAHPI_STM_UP_HYSTERESIS, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = 0, .oid = ".1.3.6.1.4.1.2.3.51.1.2.20.1.1.1.1.3.4", .loc_offset = 0, .threshold_oids = { .UpCritical = ".1.3.6.1.4.1.2.3.51.1.2.20.1.1.1.1.4.4", .UpMajor = ".1.3.6.1.4.1.2.3.51.1.2.20.1.1.1.1.6.4", .TotalPosThdHysteresis = ".1.3.6.1.4.1.2.3.51.1.2.20.1.1.1.1.7.4", }, }, .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { {}, }, }, .comment = "Planar I/O area temperature sensor" }, /* System ambient thermal sensor on planar */ { .index = 4, .sensor = { .Num = 4, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT | SAHPI_STM_UP_HYSTERESIS, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = 0, .oid = ".1.3.6.1.4.1.2.3.51.1.2.20.1.1.1.1.3.5", .loc_offset = 0, .threshold_oids = { .UpCritical = ".1.3.6.1.4.1.2.3.51.1.2.20.1.1.1.1.4.5", .UpMajor = ".1.3.6.1.4.1.2.3.51.1.2.20.1.1.1.1.6.5", .TotalPosThdHysteresis = ".1.3.6.1.4.1.2.3.51.1.2.20.1.1.1.1.7.5", }, }, .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "00000064", /* EN_TEMP */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "0001C000", /* EN_OVER_TEMP */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "0001C080", /* EN_OVER_TEMP_AMBIENT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "0001C480", /* EN_CUTOFF_HI_OVER_TEMP_AMBIENT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "0001D500", /* EN_PFA_HI_OVER_TEMP_AMBIENT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0000006E", /* EN_NC_TEMP */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, }, .comment = "Planar system ambient temperature sensor" }, /* Memory thermal sensor on planar */ { .index = 5, .sensor = { .Num = 5, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT | SAHPI_STM_UP_HYSTERESIS, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = 0, .oid = ".1.3.6.1.4.1.2.3.51.1.2.20.1.1.1.1.3.6", .loc_offset = 0, .threshold_oids = { .UpCritical = ".1.3.6.1.4.1.2.3.51.1.2.20.1.1.1.1.4.6", .UpMajor = ".1.3.6.1.4.1.2.3.51.1.2.20.1.1.1.1.6.6", .TotalPosThdHysteresis = ".1.3.6.1.4.1.2.3.51.1.2.20.1.1.1.1.7.6", }, }, .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "0501C480", /* EN_CUTOFF_HI_OVER_TEMP_MEM_AREA */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "0501C481", /* EN_CUTOFF_HI_OVER_TEMP_MEMORY1 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "0501C482", /* EN_CUTOFF_HI_OVER_TEMP_MEMORY2 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "0501D400", /* EN_PFA_HI_OVER_TEMP_MEM_AREA */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0501D501", /* EN_PFA_HI_OVER_TEMP_MEMORY1 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0501D502", /* EN_PFA_HI_OVER_TEMP_MEMORY2 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, }, .comment = "Planar memory temperature sensor" }, /* 5V sensor */ { .index = 6, .sensor = { .Num = 6, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 6.7, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 5, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_LOW_CRIT | SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT | SAHPI_STM_LOW_HYSTERESIS | SAHPI_STM_UP_HYSTERESIS, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = 0, .oid = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.3.1", .loc_offset = 0, .threshold_oids = { .LowCritical = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.8.1", .LowMajor = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.10.1", .UpCritical = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.4.1", .UpMajor = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.6.1", .TotalPosThdHysteresis = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.7.1", .TotalNegThdHysteresis = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.11.1", }, }, .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "06034480", /* EN_CUTOFF_HI_FAULT_PLANAR_5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "06034800", /* EN_CUTOFF_LO_FAULT_PLANAR_5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_LOWER_CRIT, .recovery_state = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_MINOR, }, { .event = "08034480", /* EN_CUTOFF_HI_FAULT_5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "08034800", /* EN_CUTOFF_LO_FAULT_5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_LOWER_CRIT, .recovery_state = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_MINOR, }, { .event = "06035500", /* EN_PFA_HI_FAULT_PLANAR_5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "06035800", /* EN_PFA_LO_FAULT_PLANAR_5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, }, .comment = "5 volt sensor" }, /* 3.3V sensor */ { .index = 7, .sensor = { .Num = 7, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 3.6, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 3.3, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_LOW_CRIT | SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT | SAHPI_STM_LOW_HYSTERESIS | SAHPI_STM_UP_HYSTERESIS, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = 0, .oid = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.3.2", .loc_offset = 0, .threshold_oids = { .LowCritical = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.8.2", .LowMajor = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.10.2", .UpCritical = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.4.2", .UpMajor = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.6.2", .TotalPosThdHysteresis = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.7.2", .TotalNegThdHysteresis = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.11.2", }, }, .cur_state = SAHPI_ES_UNSPECIFIED, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "08032480", /* EN_CUTOFF_HI_FAULT_3_35V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "08032880", /* EN_CUTOFF_LO_FAULT_3_35V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_LOWER_CRIT, .recovery_state = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_MINOR, }, { .event = "0002C480", /* EN_CUTOFF_HI_FAULT_3_35V_CONT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "0002C880", /* EN_CUTOFF_LO_FAULT_3_35V_CONT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_LOWER_CRIT, .recovery_state = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_MINOR, }, { .event = "08033480", /* EN_PFA_HI_FAULT_3_35V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "08033880", /* EN_PFA_LO_FAULT_3_35V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0002D400", /* EN_PFA_HI_FAULT_3_35V_CONT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0002D800", /* EN_PFA_LO_FAULT_3_35V_CONT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, }, .comment = "3.3 volt sensor" }, /* 12V sensor */ { .index = 8, .sensor = { .Num = 8, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 16, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 12, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_LOW_CRIT | SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT | SAHPI_STM_LOW_HYSTERESIS | SAHPI_STM_UP_HYSTERESIS, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = 0, .oid = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.3.3", .loc_offset = 0, .threshold_oids = { .LowCritical = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.8.3", .LowMajor = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.10.3", .UpCritical = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.4.3", .UpMajor = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.6.3", .TotalPosThdHysteresis = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.7.3", .TotalNegThdHysteresis = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.11.3", }, }, .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "06036480", /* EN_CUTOFF_HI_FAULT_12V_PLANAR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "06036800", /* EN_CUTOFF_LO_FAULT_12V_PLANAR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_LOWER_CRIT, .recovery_state = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_MINOR, }, { .event = "06037500", /* EN_PFA_HI_FAULT_12V_PLANAR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "06037800", /* EN_PFA_LO_FAULT_12V_PLANAR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, }, .comment = "12 volt sensor" }, /* -12V voltage sensor on Chassis */ { .index = 9, .sensor = { .Num = 9, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = -12, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = -16, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_LOW_CRIT | SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT | SAHPI_STM_LOW_HYSTERESIS | SAHPI_STM_UP_HYSTERESIS, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = 0, .oid = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.3.4", .loc_offset = 0, .threshold_oids = { .LowCritical = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.8.4", .LowMajor = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.10.4", .UpCritical = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.4.4", .UpMajor = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.6.4", .TotalPosThdHysteresis = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.7.4", .TotalNegThdHysteresis = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.11.4", }, }, .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "0803E480", /* EN_CUTOFF_HI_FAULT_N12V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "0803E800", /* EN_CUTOFF_LO_FAULT_N12V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_LOWER_CRIT, .recovery_state = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_MINOR, }, { .event = "0803F500", /* EN_PFA_HI_FAULT_N12V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0803F800", /* EN_PFA_LO_FAULT_N12V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, }, .comment = "-12 volt sensor" }, /* -5V voltage sensor on Chassis */ { .index = 10, .sensor = { .Num = 10, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = -5, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = -6.7, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_LOW_CRIT | SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT | SAHPI_STM_LOW_HYSTERESIS | SAHPI_STM_UP_HYSTERESIS, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = 0, .oid = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.3.5", .loc_offset = 0, .threshold_oids = { .LowCritical = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.8.5", .LowMajor = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.10.5", .UpCritical = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.4.5", .UpMajor = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.6.5", .TotalPosThdHysteresis = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.7.5", .TotalNegThdHysteresis = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.11.5", }, }, .cur_state = SAHPI_ES_UNSPECIFIED, .event_array = { { .event = "0803C480", /* EN_CUTOFF_HI_FAULT_N5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "0803C800", /* EN_CUTOFF_LO_FAULT_N5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_LOWER_CRIT, .recovery_state = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_MINOR, }, { .event = "0803D500", /* EN_PFA_HI_FAULT_N5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0803D800", /* EN_PFA_LO_FAULT_N5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, }, .comment = "-5 volt sensor" }, /* 2.5V voltage sensor on Chassis */ { .index = 11, .sensor = { .Num = 11, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 4.4, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 2.5, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_LOW_CRIT | SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT | SAHPI_STM_LOW_HYSTERESIS | SAHPI_STM_UP_HYSTERESIS, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = 0, .oid = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.3.6", .loc_offset = 0, .threshold_oids = { .LowCritical = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.8.6", .LowMajor = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.10.6", .UpCritical = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.4.6", .UpMajor = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.6.6", .TotalPosThdHysteresis = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.7.6", .TotalNegThdHysteresis = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.11.6", }, }, .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "08030480", /* EN_CUTOFF_HI_FAULT_2_5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "08030880", /* EN_CUTOFF_LO_FAULT_2_5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_LOWER_CRIT, .recovery_state = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_MINOR, }, { .event = "08031480", /* EN_PFA_HI_FAULT_2_5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "08031880", /* EN_PFA_LO_FAULT_2_5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, }, .comment = "2.5 volt sensor" }, /* 1.5V voltage sensor on Chassis */ { .index = 12, .sensor = { .Num = 12, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 4.4, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 1.5, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_LOW_CRIT | SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT | SAHPI_STM_LOW_HYSTERESIS | SAHPI_STM_UP_HYSTERESIS, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = 0, .oid = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.3.7", .loc_offset = 0, .threshold_oids = { .LowCritical = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.8.7", .LowMajor = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.10.7", .UpCritical = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.4.7", .UpMajor = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.6.7", .TotalPosThdHysteresis = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.7.7", .TotalNegThdHysteresis = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.11.7", }, }, .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "08040480", /* EN_CUTOFF_HI_FAULT_1_5V */ .event_state = SAHPI_ES_UPPER_CRIT, .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "08040880", /* EN_CUTOFF_LO_FAULT_1_5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_LOWER_CRIT, .recovery_state = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_MINOR, }, { .event = "08041400", /* EN_PFA_HI_FAULT_1_5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "08041800", /* EN_PFA_LO_FAULT_1_5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, }, .comment = "1.5 volt sensor" }, /* 1.25V sensor on Chassis */ { .index = 13, .sensor = { .Num = 13, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 3.3, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 1.25, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_LOW_CRIT | SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT | SAHPI_STM_LOW_HYSTERESIS | SAHPI_STM_UP_HYSTERESIS, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = 0, .oid = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.3.8", .loc_offset = 0, .threshold_oids = { .LowCritical = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.8.8", .LowMajor = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.10.8", .UpCritical = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.4.8", .UpMajor = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.6.8", .TotalPosThdHysteresis = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.7.8", .TotalNegThdHysteresis = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.11.8", }, }, .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "08000480", /* EN_CUTOFF_HI_FAULT_1_25V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "08000880", /* EN_CUTOFF_LO_FAULT_1_25V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_LOWER_CRIT, .recovery_state = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_MINOR, }, { .event = "08001401", /* EN_PFA_HI_FAULT_1_25V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "08001801", /* EN_PFA_LO_FAULT_1_25V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, }, .comment = "1.25 volt sensor" }, {} /* Terminate array with a null element */ }; /************* * CPU Sensors *************/ struct snmp_bc_sensor snmp_bc_cpu_sensors_rsa[] = { /* CPU thermal sensor */ { .index = 1, .sensor = { .Num = 1, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT | SAHPI_STM_UP_HYSTERESIS, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = 0, .oid = ".1.3.6.1.4.1.2.3.51.1.2.20.1.5.1.1.3.x", .loc_offset = 0, .threshold_oids = { .UpCritical = ".1.3.6.1.4.1.2.3.51.1.2.20.1.5.1.1.4.x", .UpMajor = ".1.3.6.1.4.1.2.3.51.1.2.20.1.5.1.1.6.x", .TotalPosThdHysteresis = ".1.3.6.1.4.1.2.3.51.1.2.20.1.5.1.1.7.x", }, }, .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "0421C40x", /* EN_PROC_HOT_CPUx */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "0421C48x", /* EN_CUTOFF_HI_OVER_TEMP_CPUx */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "0421D08x", /* EN_THERM_TRIP_CPUx */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "0421D50x", /* EN_PFA_HI_OVER_TEMP_CPUx */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, }, .comment = "CPU temperature sensor" }, {} /* Terminate array with a null element */ }; /************** * DASD Sensors **************/ struct snmp_bc_sensor snmp_bc_dasd_sensors_rsa[] = { /* DASD thermal sensor */ { .index = 1, .sensor = { .Num = 1, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT | SAHPI_STM_UP_HYSTERESIS, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = 0, .oid = ".1.3.6.1.4.1.2.3.51.1.2.20.1.6.1.1.3.x", .loc_offset = 0, .threshold_oids = { .UpCritical = ".1.3.6.1.4.1.2.3.51.1.2.20.1.6.1.1.4.x", .UpMajor = ".1.3.6.1.4.1.2.3.51.1.2.20.1.6.1.1.6.x", .TotalPosThdHysteresis = ".1.3.6.1.4.1.2.3.51.1.2.20.1.6.1.1.7.x", }, }, .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "0681C08x", /* EN_CUTOFF_HI_OVER_TEMP_DASD1 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "0681C40x", /* EN_PFA_HI_OVER_TEMP_DASD1 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, }, .comment = "DASD temperature sensor" }, {} /* Terminate array with a null element */ }; /************* * Fan Sensors *************/ struct snmp_bc_sensor snmp_bc_fan_sensors_rsa[] = { /* Fan speed */ { .index = 1, .sensor = { .Num = 1, .Type = SAHPI_FAN, .Category = SAHPI_EC_PRED_FAIL, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_PRED_FAILURE_ASSERT | SAHPI_ES_PRED_FAILURE_DEASSERT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_RPM, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_TRUE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 100, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = 0, .oid = ".1.3.6.1.4.1.2.3.51.1.2.3.x.0", .loc_offset = 0, }, .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_PRED_FAILURE_ASSERT, .deassert_mask = SAHPI_ES_PRED_FAILURE_ASSERT, .event_array = { { .event = "000A600x", /* EN_FANx_PFA */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_PRED_FAILURE_ASSERT, .recovery_state = SAHPI_ES_PRED_FAILURE_DEASSERT, }, {}, }, }, .comment = "Blower fan speed - percent of maximum RPM" }, /* Blower's global operational sensor - event-only */ { .index = 2, .sensor = { .Num = 2, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_AVAILABILITY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_RUNNING | SAHPI_ES_OFF_LINE, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_OFF_LINE, .deassert_mask = SAHPI_ES_OFF_LINE, .event_array = { { .event = "0002680x", /* EN_FAN1_SPEED */ .event_assertion = SAHPI_TRUE, .event_state = SAHPI_ES_OFF_LINE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0A02600x", /* EN_FAULT_FAN1 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0602600x", /* EN_FAN_x_NOT_PRESENT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, {}, }, .reading2event = {}, }, .comment = "Blower global operational sensor" }, {} /* Terminate array with a null element */ }; /************************************************************************* * Control Definitions *************************************************************************/ struct snmp_bc_control snmp_bc_chassis_controls_rsa[] = { {} /* Terminate array with a null element */ }; struct snmp_bc_control snmp_bc_cpu_controls_rsa[] = { {} /* Terminate array with a null element */ }; struct snmp_bc_control snmp_bc_dasd_controls_rsa[] = { {} /* Terminate array with a null element */ }; struct snmp_bc_control snmp_bc_fan_controls_rsa[] = { {} /* Terminate array with a null element */ }; /************************************************************************* * Inventory Definitions *************************************************************************/ /************* * Chassis VPD *************/ struct snmp_bc_inventory snmp_bc_chassis_inventories_rsa[] = { { .inventory = { .IdrId = 1, .Oem = 0, }, .inventory_info = { .hardware_mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .area_type = SAHPI_IDR_AREATYPE_CHASSIS_INFO, .oid = { .OidChassisType = ".1.3.6.1.4.1.2.3.51.1.2.21.2.1.2.0", .OidMfgDateTime = '\0', /* Set to SAHPI_TIME_UNSPECIFIED */ .OidManufacturer = '\0', .OidProductName = '\0', .OidProductVersion = ".1.3.6.1.4.1.2.3.51.1.2.21.1.1.1.0", .OidSerialNumber = ".1.3.6.1.4.1.2.3.51.1.2.21.2.1.3.0", .OidPartNumber = ".1.3.6.1.4.1.2.3.51.1.2.21.2.1.1.0", .OidFileId = '\0', .OidAssetTag = '\0', } }, .firmware_mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .area_type = SAHPI_IDR_AREATYPE_PRODUCT_INFO, .oid = { .OidChassisType = '\0', .OidMfgDateTime = '\0', /* Set to SAHPI_TIME_UNSPECIFIED */ .OidManufacturer = '\0', .OidProductName = '\0', .OidProductVersion = '\0', .OidSerialNumber = '\0', .OidPartNumber = '\0', .OidFileId = '\0', .OidAssetTag = '\0', } }, }, .comment = "RSA VPD", }, {} /* Terminate array with a null element */ }; struct snmp_bc_inventory snmp_bc_cpu_inventories_rsa[] = { {} /* Terminate array with a null element */ }; struct snmp_bc_inventory snmp_bc_dasd_inventories_rsa[] = { {} /* Terminate array with a null element */ }; struct snmp_bc_inventory snmp_bc_fan_inventories_rsa[] = { {} /* Terminate array with a null element */ }; openhpi-3.6.1/plugins/snmp_bc/snmp_bc_annunciator.c0000644000175100017510000003155112575647274021473 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #include /** * snmp_bc_get_next_announce: * @hnd: Handler data pointer. * @rid: Resource ID. * @aid: Annunciator ID. * @sev: Severity. * @unackonly: Boolean to get unacknowledged annunicators only. * * Gets the next annunicator. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_ANNUNICATOR. * SA_ERR_HPI_INVALID_RESOURCE - Resource doesn't exist. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL @sev invalid. **/ SaErrorT snmp_bc_get_next_announce(void *hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT aid, SaHpiSeverityT sev, SaHpiBoolT unackonly, SaHpiAnnouncementT *announcement) { struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; SaHpiRptEntryT *rpt; if (!hnd || !announcement || oh_lookup_severity(sev) == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } snmp_bc_lock_handler(custom_handle); /* Check if resource exists and has managed hotswap capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_ANNUNCIATOR)) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_CAPABILITY); } err("Annunciators not supported by platform"); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } /** * snmp_bc_get_announce: * @hnd: Handler data pointer. * @rid: Resource ID. * @aid: Annunciator ID. * @entry: Annunicator's announcement ID. * @announcment: Location to store annunicator's announcement. * * Gets the annunicator's announcement information. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_ANNUNICATOR. * SA_ERR_HPI_INVALID_RESOURCE - Resource doesn't exist. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT snmp_bc_get_announce(void *hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT aid, SaHpiEntryIdT entry, SaHpiAnnouncementT *announcement) { struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; SaHpiRptEntryT *rpt; if (!hnd || !announcement) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } snmp_bc_lock_handler(custom_handle); /* Check if resource exists and has managed hotswap capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_ANNUNCIATOR)) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_CAPABILITY); } err("Annunciators not supported by platform"); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } /** * snmp_bc_ack_announce: * @hnd: Handler data pointer. * @rid: Resource ID. * @aid: Annunciator ID. * @entry: Annunicator's announcement ID. * @sev: Severity. * * Acknowledge an annunicator's announcement(s). * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_ANNUNICATOR. * SA_ERR_HPI_INVALID_RESOURCE - Resource doesn't exist. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL; @sev invalid. **/ SaErrorT snmp_bc_ack_announce(void *hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT aid, SaHpiEntryIdT entry, SaHpiSeverityT sev) { struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; SaHpiRptEntryT *rpt; if (!hnd || oh_lookup_severity(sev) == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } snmp_bc_lock_handler(custom_handle); /* Check if resource exists and has managed hotswap capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_ANNUNCIATOR)) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_CAPABILITY); } err("Annunciators not supported by platform"); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } /** * snmp_bc_add_announce: * @hnd: Handler data pointer. * @rid: Resource ID. * @aid: Annunciator ID. * @announcement: Pointer to annunicator's announcement data. * * Add an announcement to an annunicator. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_ANNUNICATOR. * SA_ERR_HPI_INVALID_RESOURCE - Resource doesn't exist. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT snmp_bc_add_announce(void *hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT aid, SaHpiAnnouncementT *announcement) { struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; SaHpiRptEntryT *rpt; if (!hnd || !announcement) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } snmp_bc_lock_handler(custom_handle); /* Check if resource exists and has managed hotswap capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_ANNUNCIATOR)) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_CAPABILITY); } err("Annunciators not supported by platform"); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } /** * snmp_bc_del_announce: * @hnd: Handler data pointer. * @rid: Resource ID. * @aid: Annunciator ID. * @entry: Annunicator's announcement ID. * @sev: Severity. * * Delete announcement(s) from an annunicator. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_ANNUNICATOR. * SA_ERR_HPI_INVALID_RESOURCE - Resource doesn't exist. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL; @sev invalid. **/ SaErrorT snmp_bc_del_announce(void *hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT aid, SaHpiEntryIdT entry, SaHpiSeverityT sev) { struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; SaHpiRptEntryT *rpt; if (!hnd || oh_lookup_severity(sev) == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } snmp_bc_lock_handler(custom_handle); /* Check if resource exists and has managed hotswap capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_ANNUNCIATOR)) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_CAPABILITY); } err("Annunciators not supported by platform"); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } /** * snmp_bc_get_annunc_mode: * @hnd: Handler data pointer. * @rid: Resource ID. * @aid: Annunciator ID. * @mode: Location to store mode information. * * Gets an annunciator's current operating mode. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_ANNUNICATOR. * SA_ERR_HPI_INVALID_RESOURCE - Resource doesn't exist. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT snmp_bc_get_annunc_mode(void *hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT aid, SaHpiAnnunciatorModeT *mode) { struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; SaHpiRptEntryT *rpt; if (!hnd || !mode) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } snmp_bc_lock_handler(custom_handle); /* Check if resource exists and has managed hotswap capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_ANNUNCIATOR)) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_CAPABILITY); } err("Annunciators not supported by platform"); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } /** * snmp_bc_get_annunc_mode: * @hnd: Handler data pointer. * @rid: Resource ID. * @aid: Annunciator ID. * @mode: Anninciator mode to set. * * Sets an annunciator's current operating mode. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_ANNUNICATOR. * SA_ERR_HPI_INVALID_RESOURCE - Resource doesn't exist. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL; @mode invalid. **/ SaErrorT snmp_bc_set_annunc_mode(void *hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT aid, SaHpiAnnunciatorModeT mode) { struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; SaHpiRptEntryT *rpt; if (!hnd || oh_lookup_annunciatormode(mode) == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } snmp_bc_lock_handler(custom_handle); /* Check if resource exists and has managed hotswap capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_ANNUNCIATOR)) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_CAPABILITY); } err("Annunciators not supported by platform"); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } void * oh_get_next_announce (void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiSeverityT, SaHpiBoolT, SaHpiAnnouncementT) __attribute__ ((weak, alias("snmp_bc_get_next_announce"))); void * oh_get_announce (void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiEntryIdT, SaHpiAnnouncementT *) __attribute__ ((weak, alias("snmp_bc_get_announce"))); void * oh_ack_announce (void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiEntryIdT, SaHpiSeverityT) __attribute__ ((weak, alias("snmp_bc_ack_announce"))); void * oh_add_announce (void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiAnnouncementT *) __attribute__ ((weak, alias("snmp_bc_add_announce"))); void * oh_del_announce (void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiEntryIdT, SaHpiSeverityT) __attribute__ ((weak, alias("snmp_bc_del_announce"))); void * oh_get_annunc_mode (void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiAnnunciatorModeT *) __attribute__ ((weak, alias("snmp_bc_get_annunc_mode"))); void * oh_set_annunc_mode (void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiAnnunciatorModeT) __attribute__ ((weak, alias("snmp_bc_set_annunc_mode"))); openhpi-3.6.1/plugins/snmp_bc/snmp_bc_power.h0000644000175100017510000000134412575647274020310 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #ifndef __SNMP_BC_POWER_H #define __SNMP_BC_POWER_H SaErrorT snmp_bc_get_power_state(void *hnd, SaHpiResourceIdT rid, SaHpiPowerStateT *state); SaErrorT snmp_bc_set_power_state(void *hnd, SaHpiResourceIdT rid, SaHpiPowerStateT state); #endif openhpi-3.6.1/plugins/snmp_bc/snmp_bc_discover_rsa.c0000644000175100017510000002420512575647274021633 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley * Steve Sherman */ #include SaErrorT snmp_bc_discover_rsa(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root) { int i; SaErrorT err; struct oh_event *e; struct snmp_value get_value; struct ResourceInfo *res_info_ptr; struct snmp_bc_hnd *custom_handle; if (!handle || !ep_root) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } /****************** * Discover chassis ******************/ err = snmp_bc_snmp_get(custom_handle, SNMP_BC_PLATFORM_OID_RSA, &get_value, SAHPI_TRUE); if (err || get_value.type != ASN_INTEGER) { err("Cannot get OID=%s; Received Type=%d; Error=%s.", SNMP_BC_PLATFORM_OID_RSA, get_value.type, oh_lookup_error(err)); if (err) { return(err); } else { return(SA_ERR_HPI_INTERNAL_ERROR); } } e = snmp_bc_alloc_oh_event(); if (e == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } e->resource = snmp_bc_rpt_array_rsa[RSA_RPT_ENTRY_CHASSIS].rpt; e->resource.ResourceEntity = *ep_root; e->resource.ResourceId = oh_uid_from_entity_path(&(e->resource.ResourceEntity)); snmp_bc_create_resourcetag(&(e->resource.ResourceTag), snmp_bc_rpt_array_rsa[RSA_RPT_ENTRY_CHASSIS].comment, ep_root->Entry[0].EntityLocation); dbg("Discovered resource=%s.", e->resource.ResourceTag.Data); /* Create platform-specific info space to add to infra-structure */ res_info_ptr = g_memdup(&(snmp_bc_rpt_array_rsa[RSA_RPT_ENTRY_CHASSIS].res_info), sizeof(struct ResourceInfo)); if (!res_info_ptr) { err("Out of memory."); g_free(e); return(SA_ERR_HPI_OUT_OF_MEMORY); } res_info_ptr->cur_state = SAHPI_HS_STATE_ACTIVE; /* Get UUID and convert to GUID */ err = snmp_bc_get_guid(custom_handle, e, res_info_ptr); /* Add resource to temporary event cache/queue */ err = oh_add_resource(handle->rptcache, &(e->resource), res_info_ptr, 0); if (err) { err("Failed to add resource. Error=%s.", oh_lookup_error(err)); g_free(e); return(err); } /* Find resource's events, sensors, controls, etc. */ snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); snmp_bc_discover_sensors(handle, snmp_bc_chassis_sensors_rsa, e); snmp_bc_discover_controls(handle, snmp_bc_chassis_controls_rsa, e); snmp_bc_discover_inventories(handle, snmp_bc_chassis_inventories_rsa, e); /* ---------------------------------------- */ /* Construct .event of struct oh_event */ /* ---------------------------------------- */ snmp_bc_set_resource_add_oh_event(e, res_info_ptr); e->hid = handle->hid; oh_evt_queue_push(handle->eventq, e); /*************** * Discover CPUs ***************/ for (i=0; iresource = snmp_bc_rpt_array_rsa[RSA_RPT_ENTRY_CPU].rpt; oh_concat_ep(&(e->resource.ResourceEntity), ep_root); oh_set_ep_location(&(e->resource.ResourceEntity), SAHPI_ENT_PROCESSOR, i + SNMP_BC_HPI_LOCATION_BASE); /* See if CPU exists */ if (!rdr_exists(custom_handle, &(e->resource.ResourceEntity), 0, SNMP_BC_CPU_OID_RSA, 0, 0 )) { snmp_bc_free_oh_event(e); continue; } e->resource.ResourceId = oh_uid_from_entity_path(&(e->resource.ResourceEntity)); snmp_bc_create_resourcetag(&(e->resource.ResourceTag), snmp_bc_rpt_array_rsa[RSA_RPT_ENTRY_CPU].comment, i + SNMP_BC_HPI_LOCATION_BASE); dbg("Discovered resource=%s.", e->resource.ResourceTag.Data); /* Create platform-specific info space to add to infra-structure */ res_info_ptr = g_memdup(&(snmp_bc_rpt_array_rsa[RSA_RPT_ENTRY_CPU].res_info), sizeof(struct ResourceInfo)); if (!res_info_ptr) { err("Out of memory."); snmp_bc_free_oh_event(e); return(SA_ERR_HPI_OUT_OF_MEMORY); } res_info_ptr->cur_state = SAHPI_HS_STATE_ACTIVE; /* Get UUID and convert to GUID */ err = snmp_bc_get_guid(custom_handle, e, res_info_ptr); /* Add resource to temporary event cache/queue */ err = oh_add_resource(handle->rptcache, &(e->resource), res_info_ptr, 0); if (err) { err("Failed to add resource. Error=%s.", oh_lookup_error(err)); snmp_bc_free_oh_event(e); return(err); } /* Find resource's events, sensors, controls, etc. */ snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); snmp_bc_discover_sensors(handle, snmp_bc_cpu_sensors_rsa, e); snmp_bc_discover_controls(handle, snmp_bc_cpu_controls_rsa, e); snmp_bc_discover_inventories(handle, snmp_bc_cpu_inventories_rsa, e); /* ---------------------------------------- */ /* Construct .event of struct oh_event */ /* ---------------------------------------- */ snmp_bc_set_resource_add_oh_event(e, res_info_ptr); e->hid = handle->hid; oh_evt_queue_push(handle->eventq, e); } /**************** * Discover DASDs ****************/ for (i=0; iresource = snmp_bc_rpt_array_rsa[RSA_RPT_ENTRY_DASD].rpt; oh_concat_ep(&(e->resource.ResourceEntity), ep_root); oh_set_ep_location(&(e->resource.ResourceEntity), SAHPI_ENT_DISK_BAY, i + SNMP_BC_HPI_LOCATION_BASE); /* See if DASD exists */ if (!rdr_exists(custom_handle, &(e->resource.ResourceEntity), 0, SNMP_BC_DASD_OID_RSA, 0, 0 )) { snmp_bc_free_oh_event(e); continue; } e->resource.ResourceId = oh_uid_from_entity_path(&(e->resource.ResourceEntity)); snmp_bc_create_resourcetag(&(e->resource.ResourceTag), snmp_bc_rpt_array_rsa[RSA_RPT_ENTRY_DASD].comment, i + SNMP_BC_HPI_LOCATION_BASE); dbg("Discovered resource=%s.", e->resource.ResourceTag.Data); /* Create platform-specific info space to add to infra-structure */ res_info_ptr = g_memdup(&(snmp_bc_rpt_array_rsa[RSA_RPT_ENTRY_DASD].res_info), sizeof(struct ResourceInfo)); if (!res_info_ptr) { err("Out of memory."); snmp_bc_free_oh_event(e); return(SA_ERR_HPI_OUT_OF_MEMORY); } res_info_ptr->cur_state = SAHPI_HS_STATE_ACTIVE; /* Get UUID and convert to GUID */ err = snmp_bc_get_guid(custom_handle, e, res_info_ptr); /* Add resource to temporary event cache/queue */ err = oh_add_resource(handle->rptcache, &(e->resource), res_info_ptr, 0); if (err) { err("Failed to add resource. Error=%s.", oh_lookup_error(err)); snmp_bc_free_oh_event(e); return(err); } /* Find resource's events, sensors, controls, etc. */ snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); snmp_bc_discover_sensors(handle, snmp_bc_dasd_sensors_rsa, e); snmp_bc_discover_controls(handle, snmp_bc_dasd_controls_rsa, e); snmp_bc_discover_inventories(handle, snmp_bc_dasd_inventories_rsa, e); /* ---------------------------------------- */ /* Construct .event of struct oh_event */ /* ---------------------------------------- */ snmp_bc_set_resource_add_oh_event(e, res_info_ptr); e->hid = handle->hid; oh_evt_queue_push(handle->eventq, e); } /*************** * Discover Fans ***************/ for (i=0; iresource = snmp_bc_rpt_array_rsa[RSA_RPT_ENTRY_FAN].rpt; oh_concat_ep(&(e->resource.ResourceEntity), ep_root); oh_set_ep_location(&(e->resource.ResourceEntity), SAHPI_ENT_FAN, i + SNMP_BC_HPI_LOCATION_BASE); /* See if fan exists */ if (!rdr_exists(custom_handle, &(e->resource.ResourceEntity), 0, SNMP_BC_FAN_OID_RSA, 0, 0 )) { snmp_bc_free_oh_event(e); continue; } e->resource.ResourceId = oh_uid_from_entity_path(&(e->resource.ResourceEntity)); snmp_bc_create_resourcetag(&(e->resource.ResourceTag), snmp_bc_rpt_array_rsa[RSA_RPT_ENTRY_FAN].comment, i + SNMP_BC_HPI_LOCATION_BASE); dbg("Discovered resource=%s.", e->resource.ResourceTag.Data); /* Create platform-specific info space to add to infra-structure */ res_info_ptr = g_memdup(&(snmp_bc_rpt_array_rsa[RSA_RPT_ENTRY_FAN].res_info), sizeof(struct ResourceInfo)); if (!res_info_ptr) { err("Out of memory."); snmp_bc_free_oh_event(e); return(SA_ERR_HPI_OUT_OF_MEMORY); } res_info_ptr->cur_state = SAHPI_HS_STATE_ACTIVE; /* Get UUID and convert to GUID */ err = snmp_bc_get_guid(custom_handle, e, res_info_ptr); /* Add resource to temporary event cache/queue */ err = oh_add_resource(handle->rptcache, &(e->resource), res_info_ptr, 0); if (err) { err("Failed to add resource. Error=%s.", oh_lookup_error(err)); snmp_bc_free_oh_event(e); return(err); } /* Find resource's events, sensors, controls, etc. */ snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); snmp_bc_discover_sensors(handle, snmp_bc_fan_sensors_rsa, e); snmp_bc_discover_controls(handle, snmp_bc_fan_controls_rsa, e); snmp_bc_discover_inventories(handle, snmp_bc_fan_inventories_rsa, e); /* ---------------------------------------- */ /* Construct .event of struct oh_event */ /* ---------------------------------------- */ snmp_bc_set_resource_add_oh_event(e, res_info_ptr); e->hid = handle->hid; oh_evt_queue_push(handle->eventq, e); } return(SA_OK); } openhpi-3.6.1/plugins/snmp_bc/snmp_bc_el2event.h0000644000175100017510000000345412575647274020704 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ #ifndef __EL2EVENT_H #define __EL2EVENT_H #define HPIDUP_STRING "_HPIDUP" #define NO_OVR 0x0000000000000000 /* No overrides */ #define OVR_SEV 0x0000000000000001 /* Override Error Log's severity */ #define OVR_RID 0x0000000000000010 /* Override Error Log's source */ #define OVR_EXP 0x0000000000000100 /* Override Error Log's source for expansion cards */ #define OVR_VMM 0x0000000000001000 /* Override Error Log's source for VMM */ #define OVR_MM1 0x0000000000010000 /* Override Error Log's source for MM 1 */ #define OVR_MM2 0x0000000000100000 /* Override Error Log's source for MM 2 */ #define OVR_MM_STBY 0x0000000001000000 /* Override Error Log's source - set resource to standby MM */ #define OVR_MM_PRIME 0x0000000010000000 /* Override Error Log's source - set resource to primary MM */ typedef struct { gchar *event; SaHpiSeverityT event_sev; unsigned long long event_ovr; short event_dup; } ErrLog2EventInfoT; /* Global "Error Log to Event" mapping hash table and usage count */ extern GHashTable *errlog2event_hash; extern unsigned int errlog2event_hash_use_count; SaErrorT errlog2event_hash_init(struct snmp_bc_hnd *custom_handle); SaErrorT errlog2event_hash_free(void); /* XML event code and mapping structures */ extern char *eventxml; struct errlog2event_hash_info { GHashTable *hashtable; }; #endif openhpi-3.6.1/plugins/snmp_bc/sim_init.c0000644000175100017510000000140312575647274017255 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #include #include #include SaHpiBoolT is_simulator() { return(SAHPI_FALSE); } SaErrorT sim_banner(struct snmp_bc_hnd *custom_handle) { return(SA_OK); } SaErrorT sim_init() { return(SA_OK); } SaErrorT sim_close() { return(SA_OK); } openhpi-3.6.1/plugins/snmp_bc/snmp_bc_inventory.h0000644000175100017510000000662212575647274021215 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003, 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter Phan * Renier Morales */ #ifndef __SNMP_BC_INVENTORY_H #define __SNMP_BC_INVENTORY_H #include #define NOS_BC_INVENTORY_FIELDS 10 /************************************************************************/ /* Resource one inventory data */ /************************************************************************/ struct bc_idr_area { SaHpiIdrAreaHeaderT idrareas; SaHpiIdrFieldT field[NOS_BC_INVENTORY_FIELDS]; }; struct bc_inventory_record { SaHpiIdrInfoT idrinfo; struct bc_idr_area area[3]; }; /* * Functions prototype */ /** * snmp_bc_get_idr_info: * @hnd: * @event: * @timeout: * * Return value: **/ SaErrorT snmp_bc_get_idr_info( void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, SaHpiIdrInfoT *IdrInfo); /** * snmp_bc_get_idr_area_header: * @hnd: * @event: * @timeout: * * Return value: **/ SaErrorT snmp_bc_get_idr_area_header( void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, SaHpiIdrAreaTypeT AreaType, SaHpiEntryIdT AreaId, SaHpiEntryIdT *NextAreaId, SaHpiIdrAreaHeaderT *Header); /** * snmp_bc_add_idr_area: * @hnd: * @event: * @timeout: * * Return value: **/ SaErrorT snmp_bc_add_idr_area( void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, SaHpiIdrAreaTypeT AreaType, SaHpiEntryIdT *AreaId); /** * snmp_bc_del_idr_area: * @hnd: * @event: * @timeout: * * Return value: **/ SaErrorT snmp_bc_del_idr_area( void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, SaHpiEntryIdT AreaId); /** * snmp_bc_get_idr_field: * @hnd: * @event: * @timeout: * * Return value: **/ SaErrorT snmp_bc_get_idr_field( void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, SaHpiEntryIdT AreaId, SaHpiIdrFieldTypeT FieldType, SaHpiEntryIdT FieldId, SaHpiEntryIdT *NextFieldId, SaHpiIdrFieldT *Field); /** * snmp_bc_add_idr_field: * @hnd: * @event: * @timeout: * * Return value: **/ SaErrorT snmp_bc_add_idr_field( void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, SaHpiIdrFieldT *Field); /** * snmp_bc_set_idr_field: * @hnd: * @event: * @timeout: * * Return value: **/ SaErrorT snmp_bc_set_idr_field( void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, SaHpiIdrFieldT *Field); /** * snmp_bc_del_idr_field: * @hnd: * @event: * @timeout: * * Return value: **/ SaErrorT snmp_bc_del_idr_field( void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, SaHpiEntryIdT AreaId, SaHpiEntryIdT FieldId); /** * vpd_exists: * @thisMib: * * Return value: **/ SaHpiBoolT vpd_exists(struct InventoryMibInfo *thisMib); #endif openhpi-3.6.1/plugins/snmp_bc/snmp_bc_time.h0000644000175100017510000000535512575647274020120 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003, 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter Phan */ #ifndef __SNMP_BC_TIME_H #define __SNMP_BC_TIME_H /* * Set timezone constants */ typedef enum { SNMP_BC_DST_NONE = 0, SNMP_BC_DST_USA, SNMP_BC_DST_ESA, SNMP_BC_DST_MID, SNMP_BC_DST_EEC, SNMP_BC_DST_EEU, SNMP_BC_DST_EGT, SNMP_BC_DST_FLE, SNMP_BC_DST_IRN, SNMP_BC_DST_AUS, SNMP_BC_DST_TAS, SNMP_BC_DST_NWZ, SNMP_BC_DST_AUTOMATIC // Must be last in list, used to validate entry } SNMP_BC_DST_STANDARDS; typedef enum { FIRST_WEEK = 1, SECOND_WEEK, THIRD_WEEK, FOURTH_WEEK, LAST_WEEK } SNMP_BC_DST_WEEK; typedef enum { SUNDAY = 1, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY } SNMP_BC_DST_WEEKDAY; typedef enum { JANUARY = 1, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER } SNMP_BC_DST_MONTH; /* * Daylight saving time standards table entry * * This structure contains the definition of how daylight saving * time is observed for the supported timezones. */ typedef struct tag_DST_ENTRY { unsigned char start_hour; // Hour daylight saving begins unsigned char start_day; // Specific day daylight saving begins unsigned char start_week; // Week number daylight saving begins unsigned char start_weekday; // Day of week daylight saving begins unsigned char start_month; // Month daylight saving begins unsigned char end_hour; // Hour daylight saving ends unsigned char end_day; // Specific day daylight saving ends unsigned char end_week; // Week number daylight saving ends unsigned char end_weekday; // Day of week daylight saving ends unsigned char end_month; // Month daylight saving ends } DST_ENTRY; /* * Function Prototyping */ gboolean is_dst_in_effect(struct tm *, gchar **); gboolean is_leap_year(guchar ); guchar get_day_of_month(guchar, guchar, guchar, guchar); SaErrorT snmp_bc_set_dst(struct oh_handler_state *, struct tm *); SaErrorT snmp_bc_set_sp_time(struct snmp_bc_hnd *, struct tm *); SaErrorT snmp_bc_get_sp_time(struct oh_handler_state *, struct tm *); #endif openhpi-3.6.1/plugins/snmp_bc/snmp_bc_plugin.h0000644000175100017510000000256512575647274020460 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #ifndef __SNMP_BC_PLUGIN_H #define __SNMP_BC_PLUGIN_H /* Order is important */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* has to be before discover.h */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #endif openhpi-3.6.1/plugins/snmp_bc/snmp_bc_control.c0000644000175100017510000002715212575647274020634 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #include /** * snmp_bc_get_control_state: * @hnd: Handler data pointer. * @rid: Resource ID. * @cid: Control ID. * @mode: Location to store control's operational mode. * @state: Location to store control's state. * * Retrieves a control's operational mode and/or state. Both @mode and @state * may be NULL (e.g. check for presence). * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_CONTROL. * SA_ERR_HPI_INVALID_CMD - Control is write-only. * SA_ERR_HPI_INVALID_DATA - @state contain invalid text line number. * SA_ERR_HPI_INVALID_RESOURCE - Resource doesn't exist. * SA_ERR_HPI_NOT_PRESENT - Control doesn't exist. **/ SaErrorT snmp_bc_get_control_state(void *hnd, SaHpiResourceIdT rid, SaHpiCtrlNumT cid, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state) { SaErrorT err; SaHpiCtrlStateT working_state; struct ControlInfo *cinfo; struct snmp_value get_value; struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; SaHpiRptEntryT *rpt; SaHpiRdrT *rdr; if (!hnd) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } snmp_bc_lock_handler(custom_handle); memset(&working_state, 0, sizeof(SaHpiCtrlStateT)); /* Check if resource exists and has control capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_CONTROL)) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_CAPABILITY); } /* Find control and its mapping data - see if it accessable */ rdr = oh_get_rdr_by_type(handle->rptcache, rid, SAHPI_CTRL_RDR, cid); if (rdr == NULL) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_NOT_PRESENT); } cinfo = (struct ControlInfo *)oh_get_rdr_data(handle->rptcache, rid, rdr->RecordId); if (cinfo == NULL) { err("No control data. Control=%s", rdr->IdString.Data); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } if (rdr->RdrTypeUnion.CtrlRec.WriteOnly) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_CMD); } if (!mode && !state) { snmp_bc_unlock_handler(custom_handle); return(SA_OK); } if (state) { if (state->Type == SAHPI_CTRL_TYPE_TEXT) { if (state->StateUnion.Text.Line != SAHPI_TLN_ALL_LINES || state->StateUnion.Text.Line > rdr->RdrTypeUnion.CtrlRec.TypeUnion.Text.MaxLines) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_DATA); } } /* Find control's state */ working_state.Type = rdr->RdrTypeUnion.CtrlRec.Type; err = snmp_bc_oid_snmp_get(custom_handle, &(rdr->Entity), cinfo->mib.loc_offset, cinfo->mib.oid, &get_value, SAHPI_TRUE); if (err || get_value.type != ASN_INTEGER) { err("Cannot read SNMP OID=%s; Type=%d.", cinfo->mib.oid, get_value.type); snmp_bc_unlock_handler(custom_handle); return(err); } switch (rdr->RdrTypeUnion.CtrlRec.Type) { case SAHPI_CTRL_TYPE_DIGITAL: if (cinfo->mib.isDigitalReadStateConstant) { /* If control always returns a constant state */ working_state.StateUnion.Digital = cinfo->mib.DigitalStateConstantValue; } else { /* Translate SNMP reading into digital state */ int i, found; found = 0; for (i=0; imib.digitalmap[i] == get_value.integer) { found++; break; } } if (found) { switch (i) { case 0: working_state.StateUnion.Digital = SAHPI_CTRL_STATE_OFF; break; case 1: working_state.StateUnion.Digital = SAHPI_CTRL_STATE_ON; break; case 2: working_state.StateUnion.Digital = SAHPI_CTRL_STATE_PULSE_OFF; break; case 3: working_state.StateUnion.Digital = SAHPI_CTRL_STATE_PULSE_ON; break; default: err("HPI Spec change: Add control digital states"); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } } else { err("Control's value not defined"); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } } break; case SAHPI_CTRL_TYPE_DISCRETE: working_state.StateUnion.Discrete = get_value.integer; break; case SAHPI_CTRL_TYPE_ANALOG: snmp_bc_unlock_handler(custom_handle); err("Analog controls not supported."); return(SA_ERR_HPI_INTERNAL_ERROR); case SAHPI_CTRL_TYPE_STREAM: snmp_bc_unlock_handler(custom_handle); err("Stream controls not supported."); return(SA_ERR_HPI_INTERNAL_ERROR); case SAHPI_CTRL_TYPE_TEXT: snmp_bc_unlock_handler(custom_handle); err("Text controls not supported."); return(SA_ERR_HPI_INTERNAL_ERROR); case SAHPI_CTRL_TYPE_OEM: snmp_bc_unlock_handler(custom_handle); err("Oem controls not supported."); return(SA_ERR_HPI_INTERNAL_ERROR); default: err("%s has invalid control state=%d.", cinfo->mib.oid, working_state.Type); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } } if (state) memcpy(state, &working_state, sizeof(SaHpiCtrlStateT)); if (mode) *mode = cinfo->cur_mode; snmp_bc_unlock_handler(custom_handle); return(SA_OK); } /** * snmp_bc_set_control_state: * @hnd: Handler data pointer. * @rid: Resource ID. * @cid: Control ID. * @mode: Control's operational mode to set. * @state: Pointer to control's state to set. * * Sets a control's operational mode and/or state. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_CONTROL. * SA_ERR_HPI_INVALID_REQUEST - @state contains bad text control data. * SA_ERR_HPI_INVALID_RESOURCE - Resource doesn't exist. * SA_ERR_HPI_NOT_PRESENT - Control doesn't exist. * SA_ERR_HPI_READ_ONLY - Change mode of a read-only mode control. * Note this is only returned if the specified mode * is different than the control's default mode. **/ SaErrorT snmp_bc_set_control_state(void *hnd, SaHpiResourceIdT rid, SaHpiCtrlNumT cid, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state) { int value; SaErrorT err; SaHpiRptEntryT *rpt; SaHpiRdrT *rdr; struct ControlInfo *cinfo; struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; struct snmp_value set_value; if (!hnd) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } snmp_bc_lock_handler(custom_handle); /* Check if resource exists and has control capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_CONTROL)) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_CAPABILITY); } /* Find control and its mapping data - see if it accessable */ rdr = oh_get_rdr_by_type(handle->rptcache, rid, SAHPI_CTRL_RDR, cid); if (rdr == NULL) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_NOT_PRESENT); } cinfo = (struct ControlInfo *)oh_get_rdr_data(handle->rptcache, rid, rdr->RecordId); if (cinfo == NULL) { err("No control data. Control=%s", rdr->IdString.Data); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } /* Validate static control state and mode data */ err = oh_valid_ctrl_state_mode(&(rdr->RdrTypeUnion.CtrlRec), mode, state); if (err) { snmp_bc_unlock_handler(custom_handle); return(err); } /* Write control state */ if (mode != SAHPI_CTRL_MODE_AUTO && state) { switch (state->Type) { case SAHPI_CTRL_TYPE_DIGITAL: /* Code with switch to discover spec changes that need to be reflected in snmp_bc_resources.c digital read/write arrays */ switch (state->StateUnion.Digital) { case SAHPI_CTRL_STATE_OFF: value = cinfo->mib.digitalwmap[SAHPI_CTRL_STATE_OFF]; break; case SAHPI_CTRL_STATE_ON: value = cinfo->mib.digitalwmap[SAHPI_CTRL_STATE_ON]; break; case SAHPI_CTRL_STATE_PULSE_OFF: value = cinfo->mib.digitalwmap[SAHPI_CTRL_STATE_PULSE_OFF]; break; case SAHPI_CTRL_STATE_PULSE_ON: value = cinfo->mib.digitalwmap[SAHPI_CTRL_STATE_PULSE_ON]; break; default: err("HPI Spec change: Add control digital states"); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } if (value < 0) { err("Invalid hardware control state - %s", oh_lookup_ctrlstatedigital(state->StateUnion.Digital)); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_REQUEST); } set_value.type = ASN_INTEGER; set_value.str_len = 1; set_value.integer = value; err = snmp_bc_oid_snmp_set(custom_handle, &(rdr->Entity), cinfo->mib.loc_offset, cinfo->mib.oid, set_value); if (err) { err("Cannot set SNMP OID=%s; Value=%d.", cinfo->mib.oid, (int)set_value.integer); snmp_bc_unlock_handler(custom_handle); return(err); } break; case SAHPI_CTRL_TYPE_DISCRETE: set_value.type = ASN_INTEGER; set_value.str_len = 1; set_value.integer = state->StateUnion.Discrete; err = snmp_bc_oid_snmp_set(custom_handle, &(rdr->Entity), cinfo->mib.loc_offset, cinfo->mib.oid, set_value); if (err) { err("Cannot set SNMP OID=%s; Value=%d.", cinfo->mib.oid, (int)set_value.integer); snmp_bc_unlock_handler(custom_handle); return(err); } break; case SAHPI_CTRL_TYPE_ANALOG: err("Analog controls not supported."); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); case SAHPI_CTRL_TYPE_STREAM: err("Stream controls not supported."); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); case SAHPI_CTRL_TYPE_TEXT: err("Text controls not supported."); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); case SAHPI_CTRL_TYPE_OEM: err("OEM controls not supported."); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); default: err("Invalid control state=%d", state->Type); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } } /* Write control mode, if changed */ if (mode != cinfo->cur_mode) { cinfo->cur_mode = mode; } snmp_bc_unlock_handler(custom_handle); return(SA_OK); } void * oh_get_control_state (void *, SaHpiResourceIdT, SaHpiCtrlNumT, SaHpiCtrlModeT *, SaHpiCtrlStateT *) __attribute__ ((weak, alias("snmp_bc_get_control_state"))); void * oh_set_control_state (void *, SaHpiResourceIdT,SaHpiCtrlNumT, SaHpiCtrlModeT, SaHpiCtrlStateT *) __attribute__ ((weak, alias("snmp_bc_set_control_state"))); openhpi-3.6.1/plugins/snmp_bc/snmp_bc_sel.h0000644000175100017510000000515512575647274017743 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003, 2005, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Sean Dague */ #ifndef __SNMP_BC_SEL_H #define __SNMP_BC_SEL_H #define clearEventLogExecute 1 #define SNMP_BC_MAX_SEL_ID_LENGTH 20 #define SNMP_BC_MAX_SEL_ENTRY_LENGTH 256 typedef struct { struct tm time; SaHpiSeverityT sev; char source[SNMP_BC_MAX_SEL_ID_LENGTH]; char sname[SNMP_BC_MAX_SEL_ID_LENGTH]; char text[SNMP_BC_MAX_SEL_ENTRY_LENGTH]; } sel_entry; /* Function Prototyping */ SaErrorT snmp_bc_parse_sel_entry(struct oh_handler_state *handle, char *logstr, sel_entry *sel); SaErrorT snmp_bc_get_sel_entry(void *hnd, SaHpiResourceIdT id, SaHpiEventLogEntryIdT current, SaHpiEventLogEntryIdT *prev, SaHpiEventLogEntryIdT *next, SaHpiEventLogEntryT *entry, SaHpiRdrT *rdr, SaHpiRptEntryT *rptentry); SaErrorT snmp_bc_get_sel_info(void *hnd, SaHpiResourceIdT id, SaHpiEventLogInfoT *info); SaErrorT snmp_bc_set_sel_time(void *hnd, SaHpiResourceIdT id, SaHpiTimeT time); SaErrorT snmp_bc_add_sel_entry(void *hnd, SaHpiResourceIdT id, const SaHpiEventT *Event); SaErrorT snmp_bc_clear_sel(void *hnd, SaHpiResourceIdT id); SaErrorT snmp_bc_check_selcache(struct oh_handler_state *handle, SaHpiResourceIdT id, SaHpiEventLogEntryIdT entryId); SaErrorT snmp_bc_build_selcache(struct oh_handler_state *handle, SaHpiResourceIdT id); SaErrorT snmp_bc_sel_read_add (struct oh_handler_state *handle, SaHpiResourceIdT id, SaHpiEventLogEntryIdT sid, SaHpiBoolT prepend); SaErrorT snmp_bc_selcache_sync(struct oh_handler_state *handle, SaHpiResourceIdT id, SaHpiEventLogEntryIdT entryId); SaErrorT snmp_bc_sel_overflowreset(void *hnd, SaHpiResourceIdT id); SaErrorT snmp_bc_sel_state_set(void *hnd, SaHpiResourceIdT id, SaHpiBoolT enable); SaErrorT snmp_bc_bulk_selcache( struct oh_handler_state *handle, SaHpiResourceIdT id); SaErrorT snmp_bc_add_entry_to_elcache(struct oh_handler_state *handle, SaHpiEventT *tmpevent, SaHpiBoolT prepend); #endif openhpi-3.6.1/plugins/snmp_bc/snmp_bc.c0000644000175100017510000003512112575647274017067 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Steve Sherman */ #include #include /** * snmp_bc_get_event: * @hnd: Handler data pointer. * @event: Infra-structure event pointer. * * Passes plugin events up to the infra-structure for processing. * * Return values: * 1 - events to be processed. * SA_OK - No events to be processed. * SA_ERR_HPI_INVALID_PARAMS - @event is NULL. **/ SaErrorT snmp_bc_get_event(void *hnd) { SaErrorT err; struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; if (!hnd) { err("Invalid parameter"); return(SA_ERR_HPI_INVALID_PARAMS); } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; snmp_bc_lock_handler(custom_handle); err = snmp_bc_check_selcache(handle, 1, SAHPI_NEWEST_ENTRY); /* If err is encountered during el cache sync, */ /* log error but take no corrected action. */ /* New entry will still be there next time */ if (err) { err("Event Log cache build/sync failed. Error=%s", oh_lookup_error(err)); /* return(err); */ } if (g_slist_length(custom_handle->eventq) > 0) { struct oh_event *e = custom_handle->eventq->data; e->hid = handle->hid; oh_evt_queue_push(handle->eventq, e); custom_handle->eventq = g_slist_remove_link(custom_handle->eventq, custom_handle->eventq); snmp_bc_unlock_handler(custom_handle); return(1); } /* No events for infra-structure to process */ snmp_bc_unlock_handler(custom_handle); return(SA_OK); } /** * snmp_bc_set_resource_tag: * @hnd: Handler data pointer. * @rid: Resource ID. * @tag: Pointer to SaHpiTextBufferT. * * Sets resource's tag. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - @tag is NULL or invalid. * SA_ERR_HPI_OUT_OF_MEMORY - No memory to allocate event. **/ SaErrorT snmp_bc_set_resource_tag(void *hnd, SaHpiResourceIdT rid, SaHpiTextBufferT *tag) { SaErrorT err; SaHpiRptEntryT *rpt; struct oh_event *e; struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; struct ResourceInfo *res_info_ptr; if (!oh_valid_textbuffer(tag) || !hnd) { err("Invalid parameter"); return(SA_ERR_HPI_INVALID_PARAMS); } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; snmp_bc_lock_handler(custom_handle); rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { snmp_bc_unlock_handler(custom_handle); err("No RID."); return(SA_ERR_HPI_INVALID_RESOURCE); } res_info_ptr = (struct ResourceInfo *)oh_get_resource_data( handle->rptcache, rpt->ResourceId); if (!res_info_ptr) { snmp_bc_unlock_handler(custom_handle); err("No resource information."); return(SA_ERR_HPI_INVALID_RESOURCE); } err = oh_copy_textbuffer(&(rpt->ResourceTag), tag); if (err) { snmp_bc_unlock_handler(custom_handle); err("Cannot copy textbuffer"); return(err); } /* Add changed resource to event queue */ e = snmp_bc_alloc_oh_event(); if (e == NULL) { snmp_bc_unlock_handler(custom_handle); err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } e->resource = *rpt; /* ---------------------------------------- */ /* Construct .event of struct oh_event */ /* ---------------------------------------- */ snmp_bc_set_resource_add_oh_event(e, res_info_ptr); /* ---------------------------------------- */ /* Prime event to evenq */ /* ---------------------------------------- */ e->hid = handle->hid; oh_evt_queue_push(handle->eventq, e); snmp_bc_unlock_handler(custom_handle); return(SA_OK); } /** * snmp_bc_set_resource_severity: * @hnd: Handler data pointer. * @rid: Resource ID. * @tag: Resource's severity. * * Sets severity of events when resource unexpectedly becomes unavailable. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - @sev is invalid. * SA_ERR_HPI_OUT_OF_MEMORY - No memory to allocate event. **/ SaErrorT snmp_bc_set_resource_severity(void *hnd, SaHpiResourceIdT rid, SaHpiSeverityT sev) { SaHpiRptEntryT *rpt; struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; struct oh_event *e; struct ResourceInfo *res_info_ptr; if (oh_lookup_severity(sev) == NULL) { err("Invalid parameter"); return(SA_ERR_HPI_INVALID_PARAMS); } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; snmp_bc_lock_handler(custom_handle); rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { snmp_bc_unlock_handler(custom_handle); err("No RID."); return(SA_ERR_HPI_INVALID_RESOURCE); } res_info_ptr = (struct ResourceInfo *)oh_get_resource_data( handle->rptcache, rpt->ResourceId); if (!res_info_ptr) { snmp_bc_unlock_handler(custom_handle); err("No resource information."); return(SA_ERR_HPI_INVALID_RESOURCE); } rpt->ResourceSeverity = sev; /* Add changed resource to event queue */ /* Add changed resource to event queue */ e = snmp_bc_alloc_oh_event(); if (e == NULL) { snmp_bc_unlock_handler(custom_handle); err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } e->resource = *rpt; /* ---------------------------------------- */ /* Construct .event of struct oh_event */ /* ---------------------------------------- */ snmp_bc_set_resource_add_oh_event(e, res_info_ptr); /* ---------------------------------------- */ /* Prime event to evenq */ /* ---------------------------------------- */ e->hid = handle->hid; oh_evt_queue_push(handle->eventq, e); snmp_bc_unlock_handler(custom_handle); return(SA_OK); } /** * snmp_bc_control_parm: * @hnd: Handler data pointer. * @rid: Resource ID. * @act: Configuration action. * * Save and restore saved configuration parameters. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - @act is invalid. **/ SaErrorT snmp_bc_control_parm(void *hnd, SaHpiResourceIdT rid, SaHpiParmActionT act) { SaHpiRptEntryT *rpt; struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; if (!hnd) { dbg("Invalid parameter - hnd"); return(SA_ERR_HPI_INVALID_PARAMS); } if (oh_lookup_parmaction(act) == NULL) { dbg("Invalid parameter - act"); return(SA_ERR_HPI_INVALID_PARAMS); } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; snmp_bc_lock_handler(custom_handle); rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { err("No RID."); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_RESOURCE); } if (rpt->ResourceCapabilities & SAHPI_CAPABILITY_CONFIGURATION) { err("Resource configuration saving not supported."); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } else { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_CAPABILITY); } } #define snmp_bc_internal_retry() \ if (l_retry >= 2) { \ custom_handle->handler_retries = SNMP_BC_MAX_SNMP_RETRY_ATTEMPTED; \ err = SA_ERR_HPI_BUSY; \ break; \ } else { \ l_retry++; \ continue; \ } /** * snmp_bc_snmp_get: * @custom_handle: Plugin's data pointer. * @objid: SNMP OID. * loc_offset: Offset to add to location in entity path * @value: Location to store returned SNMP value. * @retry: retry is requested on snmp timeout * * Plugin wrapper for SNMP get call. If SNMP command times out, * this function returns an SA_ERR_HPI_BUSY until a max number * of retries occurs - then it returns SA_ERR_HPI_NO_RESPONSE. * BladeCenter hardware often takes several SNMP attempts before * it responses. User applications should continue to retry on * BUSY and only fail on NO_RESPONSE. * * Return values: * SA_OK - Normal case. **/ SaErrorT snmp_bc_snmp_get(struct snmp_bc_hnd *custom_handle, const char *objid, struct snmp_value *value, SaHpiBoolT retry) { SaErrorT err; /* struct snmp_session *ss = custom_handle->ss; */ int l_retry; if (retry) l_retry = 0; else l_retry = 2; do { err = snmp_get(custom_handle->sessp, objid, value); if ((err == SA_ERR_HPI_TIMEOUT) || (err == SA_ERR_HPI_ERROR)) { if ( (err == SA_ERR_HPI_ERROR) || (custom_handle->handler_retries == SNMP_BC_MAX_SNMP_RETRY_ATTEMPTED)) { err = snmp_bc_recover_snmp_session(custom_handle); if (err) { custom_handle->handler_retries = 0; err = SA_ERR_HPI_NO_RESPONSE; break; } else { if (retry) l_retry = 0; else l_retry = 2; custom_handle->handler_retries = 0; } } else { dbg("HPI_TIMEOUT %s", objid); snmp_bc_internal_retry(); /* l_retry got incremented here */ } } else { custom_handle->handler_retries = 0; if ((err == SA_OK) && (value->type == ASN_OCTET_STR)) { if ((g_ascii_strncasecmp(value->string,"Not Readable!", sizeof("Not Readable!")) == 0) || (g_ascii_strncasecmp(value->string,"Not Readable", sizeof("Not Readable")) == 0) || (g_ascii_strncasecmp(value->string,"(No temperature)", sizeof("(No temperature)")) == 0) || (g_ascii_strncasecmp(value->string,"NO_TEMPERATURE", sizeof("NO_TEMPERATURE")) == 0) || (!value->string) ) /*|| (value->string[0] == '\0'))*/ { custom_handle->handler_retries = 0; dbg("Not readable reading from OID=%s.", objid); err = SA_ERR_HPI_NO_RESPONSE; break; } else { break; } } else break; } } while(l_retry < 3); return(err); } /** * snmp_bc_oid_snmp_get: * @custom_handle: Plugin's data pointer. * @ep: Entity path of the resource * @oidstr: raw SNMP OID. * loc_offset: Offset to add to location in entity path * @value: Location to store returned SNMP value. * @retry: Retry requested on snmp timeout * * Plugin wrapper for SNMP get call. If SNMP command times out, * this function returns an SA_ERR_HPI_BUSY until a max number * of retries occurs - then it returns SA_ERR_HPI_NO_RESPONSE. * BladeCenter hardware often takes several SNMP attempts before * it responses. User applications should continue to retry on * BUSY and only fail on NO_RESPONSE. * * Return values: * SA_OK - Normal case. **/ SaErrorT snmp_bc_oid_snmp_get(struct snmp_bc_hnd *custom_handle, SaHpiEntityPathT *ep, SaHpiEntityLocationT loc_offset, const gchar *oidstr, struct snmp_value *value, SaHpiBoolT retry) { SaErrorT rv; gchar *oid; rv = SA_OK; oid = oh_derive_string(ep, loc_offset, 10, oidstr); if (oid == NULL) { err("Cannot derive %s.", oidstr); return(SA_ERR_HPI_INTERNAL_ERROR); } rv = snmp_bc_snmp_get(custom_handle, oid, value, retry); g_free(oid); return(rv); } /** * snmp_bc_snmp_set: * @custom_handle: Plugin's data pointer. * @objid: SNMP OID. * @value: SNMP value to set. * * Plugin wrapper for SNMP set call. If SNMP command times out, * this function returns an SA_ERR_HPI_BUSY until a max number * of retries occurs - then it returns SA_ERR_HPI_NO_RESPONSE. * BladeCenter hardware often takes several SNMP attempts before * it responses. User applications should continue to retry on * BUSY and only fail on NO_RESPONSE. * * Return values: * SA_OK - Normal case. **/ SaErrorT snmp_bc_snmp_set(struct snmp_bc_hnd *custom_handle, char *objid, struct snmp_value value) { SaErrorT err; /* struct snmp_session *ss = custom_handle->ss; */ err = snmp_set(custom_handle->sessp, objid, value); if (err == SA_ERR_HPI_TIMEOUT) { if (custom_handle->handler_retries == SNMP_BC_MAX_SNMP_RETRY_ATTEMPTED) { custom_handle->handler_retries = 0; err = SA_ERR_HPI_NO_RESPONSE; } else { custom_handle->handler_retries++; err = SA_ERR_HPI_BUSY; } } else { custom_handle->handler_retries = 0; } return(err); } /** * snmp_bc_oid_snmp_set: * @custom_handle: Plugin's data pointer. * @ep: Entity path of the resource * @oidstr: raw SNMP OID. * loc_offset: Offset to add to location in entity path * @value: SNMP value to set. * * Plugin wrapper for SNMP set call. If SNMP command times out, * this function returns an SA_ERR_HPI_BUSY until a max number * of retries occurs - then it returns SA_ERR_HPI_NO_RESPONSE. * BladeCenter hardware often takes several SNMP attempts before * it responses. User applications should continue to retry on * BUSY and only fail on NO_RESPONSE. * * Return values: * SA_OK - Normal case. **/ SaErrorT snmp_bc_oid_snmp_set(struct snmp_bc_hnd *custom_handle, SaHpiEntityPathT *ep, SaHpiEntityLocationT loc_offset, const gchar *oidstr, struct snmp_value value) { SaErrorT rv; gchar *oid; rv = SA_OK; oid = oh_derive_string(ep, loc_offset, 10, oidstr); if (oid == NULL) { err("NULL SNMP OID returned for %s.", oidstr); return(SA_ERR_HPI_INTERNAL_ERROR); } rv = snmp_bc_snmp_set(custom_handle, oid, value); g_free(oid); return(rv); } void * oh_get_event (void *) __attribute__ ((weak, alias("snmp_bc_get_event"))); void * oh_set_resource_tag (void *, SaHpiResourceIdT, SaHpiTextBufferT *) __attribute__ ((weak, alias("snmp_bc_set_resource_tag"))); void * oh_set_resource_severity (void *, SaHpiResourceIdT, SaHpiSeverityT) __attribute__ ((weak, alias("snmp_bc_set_resource_severity"))); void * oh_control_parm (void *, SaHpiResourceIdT, SaHpiParmActionT) __attribute__ ((weak, alias("snmp_bc_control_parm"))); openhpi-3.6.1/plugins/snmp_bc/snmp_bc_discover_bc.c0000644000175100017510000053412412575647274021440 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter Phan * Steve Sherman */ #include #include #include static void free_hash_data(gpointer key, gpointer value, gpointer user_data); struct SensorMibInfo snmp_bc_ipmi_sensors_temp[SNMP_BC_MAX_IPMI_TEMP_SENSORS] = { { /* Generic IPMI Temp Sensor 1 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.12.x", .threshold_oids = { .UpCritical = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.22.x", .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.23.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Temp Sensor 2 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.13.x", .threshold_oids = { .UpCritical = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.25.x", .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.26.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Temp Sensor 3 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.14.x", .threshold_oids = { .UpCritical = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.28.x", .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.29.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Temp Sensor 4 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.15.x", .threshold_oids = { .UpCritical = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.31.x", .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.32.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Temp Sensor 5 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.16.x", .threshold_oids = { .UpCritical = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.34.x", .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.35.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Temp Sensor 6 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.17.x", .threshold_oids = { .UpCritical = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.37.x", .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.38.x", }, .threshold_write_oids = {}, }, }; struct SensorMibInfo snmp_bc_ipmi_sensors_voltage[SNMP_BC_MAX_IPMI_VOLTAGE_SENSORS] = { { /* Generic IPMI Voltage Sensor 1 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.15.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.23.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.24.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Voltage Sensor 2 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.16.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.25.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.26.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Voltage Sensor 3 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.17.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.27.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.28.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Voltage Sensor 4 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.18.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.29.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.30.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Voltage Sensor 5 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.19.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.31.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.32.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Voltage Sensor 6 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.20.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.33.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.34.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Voltage Sensor 7 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.21.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.35.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.36.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Voltage Sensor 8 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.22.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.37.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.38.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Voltage Sensor 9 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.23.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.39.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.40.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Voltage Sensor 10 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.24.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.41.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.42.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Voltage Sensor 11 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.25.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.43.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.44.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Voltage Sensor 12 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.26.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.45.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.46.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Voltage Sensor 13 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.27.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.47.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.48.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Voltage Sensor 14 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.28.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.49.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.50.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Voltage Sensor 15 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.29.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.51.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.52.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Voltage Sensor 16 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.30.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.53.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.54.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Voltage Sensor 17 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.31.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.55.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.56.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Voltage Sensor 18 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.32.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.57.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.58.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Voltage Sensor 19 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.33.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.59.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.60.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Voltage Sensor 20 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.34.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.61.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.62.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Voltage Sensor 21 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.35.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.63.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.64.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Voltage Sensor 22 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.36.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.65.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.66.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Voltage Sensor 23 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.37.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.67.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.68.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Voltage Sensor 24 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.38.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.69.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.70.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Voltage Sensor 25 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.39.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.71.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.72.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Voltage Sensor 26 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.40.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.73.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.74.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Voltage Sensor 27 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.41.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.75.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.76.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Voltage Sensor 28 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.42.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.77.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.78.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Voltage Sensor 29 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.43.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.79.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.80.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Voltage Sensor 30 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.44.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.81.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.82.x", }, .threshold_write_oids = {}, }, }; static SaErrorT snmp_bc_discover_ipmi_sensors(struct oh_handler_state *handle, struct snmp_bc_ipmi_sensor *sensor_array, struct oh_event *res_oh_event); /* Matching mmblade.mib definitions */ /* storageExpansion(1), */ /* pciExpansion(2) */ char *bladeexpansiondesc[] = { "Blade Expansion Module, BEM", "Blade Storage Expansion, BSE", "Blade PCI I/O Expansion, PEU" }; /** * snmp_bc_discover: * @handler: Pointer to handler's data. * @ep_root: Pointer to chassis Root Entity Path which comes from openhpi.conf. * * Discovers IBM BladeCenter resources and RDRs. * * Return values: * SA_OK - normal case * SA_ERR_HPI_DUPLICATE - There is no changes to BladeCenter resource masks; normal case for re-discovery. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_discover(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root) { SaErrorT err; struct snmp_value get_value_blade, get_value_blower, get_value_power_module, get_value_switch, get_value_media, get_value_mm, get_value_tap, get_value_nc, get_value_mx, get_value_smi, get_value_filter, get_value_mmi; struct snmp_bc_hnd *custom_handle; if (!handle || !ep_root) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } /* If this is a rediscovery, then sync event log before all else. */ /* If event log synchronization process finds any hotswap event, */ /* eventlog synchronization process will kick off a targeted discovery*/ /* for the hotswap resource. This is for both removal and installation*/ if (custom_handle->isFirstDiscovery == SAHPI_FALSE) err = snmp_bc_check_selcache(handle, 1, SAHPI_NEWEST_ENTRY); /************************************************************** * Fetch various resource installation vectors from BladeCenter **************************************************************/ /* Fetch blade installed vector */ get_installed_mask(SNMP_BC_PB_INSTALLED, get_value_blade); /* Fetch switch installed vector */ get_installed_mask(SNMP_BC_SM_INSTALLED, get_value_switch); /* Fetch MM installed vector */ get_installed_mask(SNMP_BC_MM_INSTALLED, get_value_mm); /* Fetch power module installed vector */ get_installed_mask(SNMP_BC_PM_INSTALLED, get_value_power_module); /* Fetch media tray installed vector */ /* get_dualmode_object(SNMP_BC_MT_INSTALLED, get_value_media); */ snmp_bc_fetch_MT_install_mask(handle, &get_value_media); /* Fetch filter (front bezel) installed vector */ get_dualmode_object(SNMP_BC_FILTER_INSTALLED, get_value_filter); /* Fetch blower installed vector */ get_installed_mask(SNMP_BC_BLOWER_INSTALLED, get_value_blower); /* Fetch telco-alarm-panel installed vector */ get_installed_mask(SNMP_BC_AP_INSTALLED, get_value_tap); /* Fetch network-clock-card installed vector */ get_installed_mask(SNMP_BC_NC_INSTALLED, get_value_nc); /* Fetch mux-card installed vector */ get_installed_mask(SNMP_BC_MX_INSTALLED, get_value_mx); /* Fetch switch interposer-card installed vector */ get_installed_mask(SNMP_BC_SMI_INSTALLED, get_value_smi); /* Fetch mm interposer-card installed vector */ get_installed_mask(SNMP_BC_MMI_INSTALLED, get_value_mmi); if ( (g_ascii_strncasecmp(get_value_blade.string, custom_handle->installed_pb_mask, get_value_blade.str_len) == 0) && (g_ascii_strncasecmp(get_value_blower.string, custom_handle->installed_blower_mask, get_value_blower.str_len) == 0) && (g_ascii_strncasecmp(get_value_power_module.string, custom_handle->installed_pm_mask, get_value_power_module.str_len) == 0) && (g_ascii_strncasecmp(get_value_switch.string, custom_handle->installed_sm_mask, get_value_switch.str_len) == 0) && (g_ascii_strncasecmp(get_value_mm.string, custom_handle->installed_mm_mask, get_value_mm.str_len) == 0) && (g_ascii_strncasecmp(get_value_tap.string, custom_handle->installed_tap_mask, get_value_tap.str_len) == 0) && (g_ascii_strncasecmp(get_value_nc.string, custom_handle->installed_nc_mask, get_value_nc.str_len) == 0) && (g_ascii_strncasecmp(get_value_mx.string, custom_handle->installed_mx_mask, get_value_mx.str_len) == 0) && (g_ascii_strncasecmp(get_value_mmi.string, custom_handle->installed_mmi_mask, get_value_smi.str_len) == 0) && (g_ascii_strncasecmp(get_value_smi.string, custom_handle->installed_smi_mask, get_value_smi.str_len) == 0) && (get_value_filter.integer == custom_handle->installed_filter_mask) && (get_value_media.integer == custom_handle->installed_mt_mask) ) { /**************************************************** * If **ALL** the resource masks are still the same, * do not rediscover, return with special return code ****************************************************/ return(SA_ERR_HPI_DUPLICATE); } else { /************************************************************* * Set saved masks to the newly read values * Use strcpy() instead of strncpy(), counting on snmp_utils.c * to NULL terminate strings read from snmp agent *************************************************************/ err = snmp_bc_update_chassis_topo(handle); if (err != SA_OK) return (err); strncpy(custom_handle->installed_pb_mask, get_value_blade.string, SNMP_BC_MAX_RESOURCES_MASK); strncpy(custom_handle->installed_blower_mask, get_value_blower.string, SNMP_BC_MAX_RESOURCES_MASK); strncpy(custom_handle->installed_pm_mask, get_value_power_module.string, SNMP_BC_MAX_RESOURCES_MASK); strncpy(custom_handle->installed_smi_mask, get_value_smi.string, SNMP_BC_MAX_RESOURCES_MASK); strncpy(custom_handle->installed_sm_mask, get_value_switch.string, SNMP_BC_MAX_RESOURCES_MASK); strncpy(custom_handle->installed_mmi_mask, get_value_mmi.string, SNMP_BC_MAX_RESOURCES_MASK); strncpy(custom_handle->installed_mm_mask, get_value_mm.string, SNMP_BC_MAX_RESOURCES_MASK); strncpy(custom_handle->installed_tap_mask, get_value_tap.string, SNMP_BC_MAX_RESOURCES_MASK); strncpy(custom_handle->installed_nc_mask, get_value_nc.string, SNMP_BC_MAX_RESOURCES_MASK); strncpy(custom_handle->installed_mx_mask, get_value_mx.string, SNMP_BC_MAX_RESOURCES_MASK); custom_handle->installed_mt_mask = get_value_media.integer; custom_handle->installed_filter_mask = get_value_filter.integer; } /****************************** * Discover BladeCenter Chassis ******************************/ err = snmp_bc_discover_chassis(handle, ep_root); if (err != SA_OK) return(err); /****************************** * Discover ALL BladeCenter Slots * Warning: * Discovery of Physical Slots must come **before** discovery of sloted resources. * Discovery of slots sets Slot State Sensor to empty. * Subsequent resource discovery changes state of Slot State Sensor accordingly. ******************************/ err = snmp_bc_discover_all_slots(handle, ep_root); if (err != SA_OK) return(err); /***************** * Discover Blades *****************/ err = snmp_bc_discover_blade(handle, ep_root,get_value_blade.string); if (err != SA_OK) return(err); /****************** * Discover Blowers ******************/ err = snmp_bc_discover_blowers(handle, ep_root, get_value_blower.string); if (err != SA_OK) return(err); /************************ * Discover Power Modules ************************/ err = snmp_bc_discover_power_module(handle, ep_root, get_value_power_module.string); if (err != SA_OK) return(err); /*********************************** * Discover Switch Module Interposers (smi) * It is **important** to update custom_handle->installed_smi_mask * **prior** to switch discovery (discover_sm) ***********************************/ err = snmp_bc_discover_smi(handle, ep_root, get_value_smi.string); if (err != SA_OK) return(err); /******************* * Discover Switches *******************/ err = snmp_bc_discover_switch(handle, ep_root, get_value_switch.string); if (err != SA_OK) return(err); /********************** * Discover Media Trays **********************/ err = snmp_bc_discover_media_tray(handle, ep_root, get_value_media.integer); if (err != SA_OK) return(err); /********************** * Discover Filter (Front Bezel) **********************/ err = snmp_bc_discover_filter(handle, ep_root, get_value_filter.integer); if (err != SA_OK) return(err); /*********************************** * Discover Management Module Interposers (mmi) * It is **important** to update custom_handle->installed_mmi_mask * **prior** to mm discovery (discover_mm) ***********************************/ err = snmp_bc_discover_mmi(handle, ep_root, get_value_mmi.string); if (err != SA_OK) return(err); /*********************************** * Discover Management Modules (MMs) ***********************************/ err = snmp_bc_discover_mm(handle, ep_root, get_value_mm.string, SAHPI_TRUE); if (err != SA_OK) return(err); /*********************************** * Discover Telco Alarm Panel (TAPs) ***********************************/ err = snmp_bc_discover_tap(handle, ep_root, get_value_tap.string); if (err != SA_OK) return(err); /*********************************** * Discover Network Clock Cards (nc) ***********************************/ err = snmp_bc_discover_nc(handle, ep_root, get_value_nc.string); if (err != SA_OK) return(err); /*********************************** * Discover Mux Cards (mx) ***********************************/ err = snmp_bc_discover_mx(handle, ep_root, get_value_mx.string); if (err != SA_OK) return(err); return(SA_OK); } /** * snmp_bc_update_chassis_topo: * @handler: Pointer to handler's data. * * Update OpenHPI snmp_bc chassis topology from BladeCenter. * * Return values: * SA_OK - normal case. **/ SaErrorT snmp_bc_update_chassis_topo(struct oh_handler_state *handle) { SaErrorT err; struct snmp_value get_value; struct snmp_bc_hnd *custom_handle; if (!handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } if (custom_handle->isFirstDiscovery == SAHPI_TRUE) { get_integer_object(SNMP_BC_NOS_PB_SUPPORTED, get_value); custom_handle->max_pb_supported = get_value.integer; /* pb - processor blade */ get_integer_object(SNMP_BC_NOS_SMI_SUPPORTED, get_value); custom_handle->max_smi_supported = get_value.integer; /* smi - switch interposer */ get_integer_object(SNMP_BC_NOS_SM_SUPPORTED, get_value); custom_handle->max_sm_supported = get_value.integer; /* sm - switch module */ get_integer_object(SNMP_BC_NOS_MMI_SUPPORTED, get_value); custom_handle->max_mmi_supported = get_value.integer; /* mmi - mm interposer */ get_integer_object(SNMP_BC_NOS_MM_SUPPORTED, get_value); custom_handle->max_mm_supported = get_value.integer; /* mm - management module */ get_integer_object(SNMP_BC_NOS_PM_SUPPORTED, get_value); custom_handle->max_pm_supported = get_value.integer; /* pm - power module */ get_integer_object(SNMP_BC_NOS_MT_SUPPORTED, get_value); custom_handle->max_mt_supported = get_value.integer; /* mt - media tray */ get_integer_object(SNMP_BC_NOS_BLOWER_SUPPORTED, get_value); custom_handle->max_blower_supported = get_value.integer; /* blower - blower */ get_integer_object(SNMP_BC_NOS_FILTER_SUPPORTED, get_value); custom_handle->max_filter_supported = get_value.integer; /* filter - front bezel */ get_integer_object(SNMP_BC_NOS_AP_SUPPORTED, get_value); custom_handle->max_tap_supported = get_value.integer; /* ap - alarm panel */ get_integer_object(SNMP_BC_NOS_NC_SUPPORTED, get_value); custom_handle->max_nc_supported = get_value.integer; /* nc - network clock */ get_integer_object(SNMP_BC_NOS_MX_SUPPORTED, get_value); custom_handle->max_mx_supported = get_value.integer; /* mx - multiplex (mux) */ } return(SA_OK); } /** * snmp_bc_discover_media_tray: * @handler: Pointer to handler's data. * @ep_root: Pointer to chassis Root Entity Path which comes from openhpi.conf. * @media_tray_installed: Media tray installed flag. * * Discovers media tray resources and their RDRs. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameters are NULL. **/ SaErrorT snmp_bc_discover_media_tray(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, int media_tray_installed) { SaErrorT err; guint mt_width; struct oh_event *e; struct snmp_value get_value; struct ResourceInfo *res_info_ptr; struct snmp_bc_hnd *custom_handle; if (!handle || !ep_root) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } e = snmp_bc_alloc_oh_event(); if (e == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* ---------------------------------------- */ /* Construct .resource of struct oh_event */ /* ---------------------------------------- */ e->resource = snmp_bc_rpt_array[BC_RPT_ENTRY_MEDIA_TRAY].rpt; oh_concat_ep(&(e->resource.ResourceEntity), ep_root); oh_set_ep_location(&(e->resource.ResourceEntity), BLADECENTER_PERIPHERAL_BAY_SLOT, SNMP_BC_HPI_LOCATION_BASE); oh_set_ep_location(&(e->resource.ResourceEntity), SAHPI_ENT_PERIPHERAL_BAY, SNMP_BC_HPI_LOCATION_BASE); e->resource.ResourceId = oh_uid_from_entity_path(&(e->resource.ResourceEntity)); snmp_bc_create_resourcetag(&(e->resource.ResourceTag), snmp_bc_rpt_array[BC_RPT_ENTRY_MEDIA_TRAY].comment, SNMP_BC_HPI_LOCATION_BASE); dbg("Discovered resource=%s; ID=%d", e->resource.ResourceTag.Data, e->resource.ResourceId); /* Create platform-specific info space to add to infra-structure */ res_info_ptr = g_memdup(&(snmp_bc_rpt_array[BC_RPT_ENTRY_MEDIA_TRAY].res_info), sizeof(struct ResourceInfo)); if (!res_info_ptr) { err("Out of memory."); snmp_bc_free_oh_event(e); return(SA_ERR_HPI_OUT_OF_MEMORY); } if (media_tray_installed < 10) { res_info_ptr->cur_state = SAHPI_HS_STATE_NOT_PRESENT; snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); snmp_bc_free_oh_event(e); g_free(res_info_ptr); } else if (media_tray_installed >= 10 ) { res_info_ptr->cur_state = SAHPI_HS_STATE_ACTIVE; /* Get UUID and convert to GUID */ err = snmp_bc_get_guid(custom_handle, e, res_info_ptr); /* Add resource to resource */ err = oh_add_resource(handle->rptcache, &(e->resource), res_info_ptr, 0); if (err) { err("Failed to add resource. Error=%s.", oh_lookup_error(err)); snmp_bc_free_oh_event(e); return(err); } /* Add resource event entries to event2hpi_hash table */ snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); /* ---------------------------------------- */ /* Construct .rdrs of struct oh_event */ /* ---------------------------------------- */ /* Find resource's rdrs: sensors, controls, etc. */ if (custom_handle->platform == SNMP_BC_PLATFORM_BCHT) { snmp_bc_discover_sensors(handle, snmp_bc_mediatray_sensors_faultled, e); } else { snmp_bc_discover_sensors(handle, snmp_bc_mediatray_sensors_nofaultled, e); } snmp_bc_discover_sensors(handle, snmp_bc_mediatray_sensors, e); snmp_bc_discover_controls(handle, snmp_bc_mediatray_controls, e); snmp_bc_discover_inventories(handle, snmp_bc_mediatray_inventories, e); mt_width = 1; /* Default to 1-wide */ if (res_info_ptr->mib.OidResourceWidth != NULL) { err = snmp_bc_oid_snmp_get(custom_handle, &(e->resource.ResourceEntity), 0, res_info_ptr->mib.OidResourceWidth, &get_value, SAHPI_TRUE); if (!err && (get_value.type == ASN_INTEGER)) { mt_width = get_value.integer; } } res_info_ptr->resourcewidth = mt_width; err = snmp_bc_set_resource_slot_state_sensor(handle, e, mt_width); /* ---------------------------------------- */ /* Construct .event of struct oh_event */ /* ---------------------------------------- */ snmp_bc_set_resource_add_oh_event(e, res_info_ptr); /* ---------------------------------------- */ /* Place the event in tmpqueue */ /* ---------------------------------------- */ /*custom_handle->eventq = g_slist_append(custom_handle->eventq, e);*/ e->hid = handle->hid; oh_evt_queue_push(handle->eventq, e); } /* ------------------------------------------------ */ /* For BC-HT, we have to examine the 2nd media tray */ /* ------------------------------------------------ */ if (custom_handle->platform == SNMP_BC_PLATFORM_BCHT) { e = snmp_bc_alloc_oh_event(); if (e == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* ---------------------------------------- */ /* Construct .resource of struct oh_event */ /* ---------------------------------------- */ e->resource = snmp_bc_rpt_array[BC_RPT_ENTRY_MEDIA_TRAY_2].rpt; oh_concat_ep(&(e->resource.ResourceEntity), ep_root); oh_set_ep_location(&(e->resource.ResourceEntity), BLADECENTER_PERIPHERAL_BAY_SLOT, SNMP_BC_HPI_LOCATION_BASE+1); oh_set_ep_location(&(e->resource.ResourceEntity), SAHPI_ENT_PERIPHERAL_BAY, SNMP_BC_HPI_LOCATION_BASE + 1); e->resource.ResourceId = oh_uid_from_entity_path(&(e->resource.ResourceEntity)); snmp_bc_create_resourcetag(&(e->resource.ResourceTag), snmp_bc_rpt_array[BC_RPT_ENTRY_MEDIA_TRAY_2].comment, SNMP_BC_HPI_LOCATION_BASE + 1); dbg("Discovered resource=%s; ID=%d", e->resource.ResourceTag.Data, e->resource.ResourceId); /* Create platform-specific info space to add to infra-structure */ res_info_ptr = g_memdup(&(snmp_bc_rpt_array[BC_RPT_ENTRY_MEDIA_TRAY_2].res_info), sizeof(struct ResourceInfo)); if (!res_info_ptr) { err("Out of memory."); snmp_bc_free_oh_event(e); return(SA_ERR_HPI_OUT_OF_MEMORY); } if ((media_tray_installed != 01) && (media_tray_installed != 11)) { res_info_ptr->cur_state = SAHPI_HS_STATE_NOT_PRESENT; snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); snmp_bc_free_oh_event(e); g_free(res_info_ptr); } else { res_info_ptr->cur_state = SAHPI_HS_STATE_ACTIVE; /* Get UUID and convert to GUID */ err = snmp_bc_get_guid(custom_handle, e, res_info_ptr); /* Add resource to resource */ err = oh_add_resource(handle->rptcache, &(e->resource), res_info_ptr, 0); if (err) { err("Failed to add resource. Error=%s.", oh_lookup_error(err)); snmp_bc_free_oh_event(e); return(err); } /* Add resource event entries to event2hpi_hash table */ snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); /* --------------------------------------------- */ /* Construct .rdrs of struct oh_event */ /* --------------------------------------------- */ /* Find resource's rdrs: sensors, controls, etc. */ snmp_bc_discover_sensors(handle, snmp_bc_mediatray2_sensors, e); snmp_bc_discover_controls(handle, snmp_bc_mediatray2_controls, e); snmp_bc_discover_inventories(handle, snmp_bc_mediatray2_inventories, e); mt_width = 1; /* Default to 1-wide */ if (res_info_ptr->mib.OidResourceWidth != NULL) { err = snmp_bc_oid_snmp_get(custom_handle, &(e->resource.ResourceEntity), 0, res_info_ptr->mib.OidResourceWidth, &get_value, SAHPI_TRUE); if (!err && (get_value.type == ASN_INTEGER)) { mt_width = get_value.integer; } } res_info_ptr->resourcewidth = mt_width; err = snmp_bc_set_resource_slot_state_sensor(handle, e, mt_width); /* ---------------------------------------- */ /* Construct .event of struct oh_event */ /* ---------------------------------------- */ snmp_bc_set_resource_add_oh_event(e, res_info_ptr); /* ---------------------------------------- */ /* Place the event in tmpqueue */ /* ---------------------------------------- */ /*handle->eventq = g_slist_append(handle->eventq, e);*/ e->hid = handle->hid; oh_evt_queue_push(handle->eventq, e); } } /* ---------------------------------------- */ return(SA_OK); } /** * snmp_bc_discover_filter: * @handler: Pointer to handler's data. * @ep_root: Pointer to chassis Root Entity Path which comes from openhpi.conf. * @media_tray_installed: Filter installed flag. * * Discovers filter resources and their RDRs. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameters are NULL. **/ SaErrorT snmp_bc_discover_filter(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, int filter_installed) { SaErrorT err; struct oh_event *e; struct ResourceInfo *res_info_ptr; struct snmp_bc_hnd *custom_handle; if (!handle || !ep_root) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } e = snmp_bc_alloc_oh_event(); if (e == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* ---------------------------------------- */ /* Construct .resource of struct oh_event */ /* ---------------------------------------- */ e->resource = snmp_bc_rpt_array[BC_RPT_ENTRY_AIR_FILTER].rpt; oh_concat_ep(&(e->resource.ResourceEntity), ep_root); oh_set_ep_location(&(e->resource.ResourceEntity), (SAHPI_ENT_PHYSICAL_SLOT + 16), SNMP_BC_HPI_LOCATION_BASE); e->resource.ResourceId = oh_uid_from_entity_path(&(e->resource.ResourceEntity)); snmp_bc_create_resourcetag(&(e->resource.ResourceTag), snmp_bc_rpt_array[BC_RPT_ENTRY_AIR_FILTER].comment, SNMP_BC_HPI_LOCATION_BASE); dbg("Discovered resource=%s; ID=%d", e->resource.ResourceTag.Data, e->resource.ResourceId); /* Create platform-specific info space to add to infra-structure */ res_info_ptr = g_memdup(&(snmp_bc_rpt_array[BC_RPT_ENTRY_AIR_FILTER].res_info), sizeof(struct ResourceInfo)); if (!res_info_ptr) { err("Out of memory."); snmp_bc_free_oh_event(e); return(SA_ERR_HPI_OUT_OF_MEMORY); } if (filter_installed == 0) { res_info_ptr->cur_state = SAHPI_HS_STATE_NOT_PRESENT; snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); snmp_bc_free_oh_event(e); g_free(res_info_ptr); } else { res_info_ptr->cur_state = SAHPI_HS_STATE_ACTIVE; /* Get UUID and convert to GUID */ err = snmp_bc_get_guid(custom_handle, e, res_info_ptr); /* Add resource to resource */ err = oh_add_resource(handle->rptcache, &(e->resource), res_info_ptr, 0); if (err) { err("Failed to add resource. Error=%s.", oh_lookup_error(err)); snmp_bc_free_oh_event(e); return(err); } /* Add resource event entries to event2hpi_hash table */ snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); /* ---------------------------------------- */ /* Construct .rdrs of struct oh_event */ /* ---------------------------------------- */ /* Find resource's rdrs: sensors, controls, etc. */ snmp_bc_discover_sensors(handle, snmp_bc_filter_sensors, e); snmp_bc_discover_controls(handle, snmp_bc_filter_controls, e); snmp_bc_discover_inventories(handle, snmp_bc_filter_inventories, e); /* ---------------------------------------- */ /* Construct .event of struct oh_event */ /* ---------------------------------------- */ snmp_bc_set_resource_add_oh_event(e, res_info_ptr); /* ---------------------------------------- */ /* Place the event in tmpqueue */ /* ---------------------------------------- */ /*custom_handle->eventq = g_slist_append(custom_handle->eventq, e);*/ e->hid = handle->hid; oh_evt_queue_push(handle->eventq, e); } /* ---------------------------------------- */ return(SA_OK); } /** * snmp_bc_discover_chassis: * @handler: Pointer to handler's data. * @ep_root: Pointer to chassis Root Entity Path which comes from openhpi.conf. * * Discovers the BladeCenter chassis resource and its RDRs. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_discover_chassis(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root) { SaErrorT err; struct oh_event *e; struct ResourceInfo *res_info_ptr; struct snmp_bc_hnd *custom_handle; if (!handle || !ep_root) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } /****************** * Discover Chassis ******************/ e = snmp_bc_alloc_oh_event(); if (e == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } e->resource = snmp_bc_rpt_array[BC_RPT_ENTRY_CHASSIS].rpt; /* ---------------------------------------- */ /* Construct .resource of struct oh_event */ /* ---------------------------------------- */ e->resource.ResourceEntity = *ep_root; e->resource.ResourceId = oh_uid_from_entity_path(&(e->resource.ResourceEntity)); { /* Generate Chassis Resource Tag */ SaHpiTextBufferT build_name; oh_init_textbuffer(&build_name); switch (custom_handle->platform) { case SNMP_BC_PLATFORM_BC: oh_append_textbuffer(&build_name, "BladeCenter Chassis"); break; case SNMP_BC_PLATFORM_BCH: oh_append_textbuffer(&build_name, "BladeCenter H Chassis"); break; case SNMP_BC_PLATFORM_BCT: oh_append_textbuffer(&build_name, "BladeCenter T Chassis"); break; case SNMP_BC_PLATFORM_BCHT: oh_append_textbuffer(&build_name, "BladeCenter HT Chassis"); break; default: oh_append_textbuffer(&build_name, "BladeCenter Chassis"); } snmp_bc_create_resourcetag(&(e->resource.ResourceTag), (char *)build_name.Data, ep_root->Entry[0].EntityLocation); } dbg("Discovered resource=%s; ID=%d", e->resource.ResourceTag.Data, e->resource.ResourceId); /* Create platform-specific info space */ res_info_ptr = g_memdup(&(snmp_bc_rpt_array[BC_RPT_ENTRY_CHASSIS].res_info), sizeof(struct ResourceInfo)); if (!res_info_ptr) { err("Out of memory."); snmp_bc_free_oh_event(e); return(SA_ERR_HPI_OUT_OF_MEMORY); } res_info_ptr->cur_state = SAHPI_HS_STATE_ACTIVE; /* Get UUID and convert to GUID */ err = snmp_bc_get_guid(custom_handle, e, res_info_ptr); /* Add resource to resource */ err = oh_add_resource(handle->rptcache, &(e->resource), res_info_ptr, 0); if (err) { err("Cannot add resource. Error=%s.", oh_lookup_error(err)); snmp_bc_free_oh_event(e); return(err); } /* Add resource event entries to event2hpi_hash table */ snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); /* ---------------------------------------- */ /* Construct .rdrs of struct oh_event */ /* ---------------------------------------- */ /* Find resource's rdrs: sensors, controls, etc. */ snmp_bc_discover_sensors(handle, snmp_bc_chassis_sensors, e); if ( custom_handle->platform == SNMP_BC_PLATFORM_BCT ) { snmp_bc_discover_sensors(handle, snmp_bc_chassis_sensors_bct_filter, e); } if ( (custom_handle->platform == SNMP_BC_PLATFORM_BCT) || (custom_handle->platform == SNMP_BC_PLATFORM_BCHT) ){ snmp_bc_discover_controls(handle, snmp_bc_chassis_controls_bct, e); } else if ( (custom_handle->platform == SNMP_BC_PLATFORM_BC) || (custom_handle->platform == SNMP_BC_PLATFORM_BCH) ) { snmp_bc_discover_controls(handle, snmp_bc_chassis_controls_bc, e); } snmp_bc_discover_inventories(handle, snmp_bc_chassis_inventories, e); /* ---------------------------------------- */ /* Construct .event of struct oh_event */ /* ---------------------------------------- */ snmp_bc_set_resource_add_oh_event(e, res_info_ptr); /* ---------------------------------------- */ /* Place the event in queue */ /* ---------------------------------------- */ /*custom_handle->eventq = g_slist_append(custom_handle->eventq, e);*/ e->hid = handle->hid; oh_evt_queue_push(handle->eventq, e); /* ---------------------------------------- */ /* ---------------------------------------- */ return(SA_OK); } /** * snmp_bc_discover_blade: * @handler: Pointer to handler's data. * @ep_root: Pointer to chassis Root Entity Path which comes from openhpi.conf. * @blade_vector: Bitmap vector of installed blades. * * Discovers blade resources and their RDRs. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_discover_blade(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, char *blade_vector) { guint i; SaErrorT err; struct oh_event *e; struct ResourceInfo *res_info_ptr; struct snmp_bc_hnd *custom_handle; if (!handle || !blade_vector) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } e = NULL; res_info_ptr = NULL; for (i=0; i < strlen(blade_vector); i++) { if ((blade_vector[i] == '1') || (custom_handle->isFirstDiscovery == SAHPI_TRUE)) { e = snmp_bc_alloc_oh_event(); if (e == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* ---------------------------------------- */ /* Construct .resource of struct oh_event */ /* res_info is malloc in the construcion */ /* ---------------------------------------- */ err = snmp_bc_construct_blade_rpt(e, &res_info_ptr, ep_root, i); if (err) { snmp_bc_free_oh_event(e); return(err); } } if ((blade_vector[i] == '0') && (custom_handle->isFirstDiscovery == SAHPI_TRUE)) { /* Make sure that we have static infomation * for this **empty** blade slot in hash during HPI initialization */ res_info_ptr->cur_state = SAHPI_HS_STATE_NOT_PRESENT; snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); snmp_bc_free_oh_event(e); g_free(res_info_ptr); } else if (blade_vector[i] == '1') { err = snmp_bc_add_blade_rptcache(handle, e, res_info_ptr, i); if (err == SA_OK) { /* ---------------------------------------- */ /* Construct .event of struct oh_event */ /* ---------------------------------------- */ snmp_bc_set_resource_add_oh_event(e, res_info_ptr); /* ---------------------------------------- */ /* Place the event in tmpqueue */ /* ---------------------------------------- */ /*custom_handle->eventq = g_slist_append(custom_handle->eventq, e);*/ if (e) e->hid = handle->hid; oh_evt_queue_push(handle->eventq, e); /********************************** * Discover Blade Expansion Modules **********************************/ err = snmp_bc_discover_blade_expansion(handle, ep_root, i); } else { snmp_bc_free_oh_event(e); } } } return(SA_OK); } /** * snmp_bc_discover_blade_expansion: * @handler: Pointer to handler's data. * @ep_root: Pointer to chassis Root Entity Path which comes from openhpi.conf. * @blade_index: Index of the main blade * * Discovers blade expansion resources and their RDRs, if any. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_discover_blade_expansion(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, guint blade_index) { SaErrorT err; gint i, j; SaHpiEntityPathT ep; struct snmp_value get_value; BCExpansionTypeT expansionType; struct snmp_bc_hnd *custom_handle; if (!handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } ep = snmp_bc_rpt_array[BC_RPT_ENTRY_BLADE_EXPANSION_CARD].rpt.ResourceEntity; oh_concat_ep(&ep, ep_root); oh_set_ep_location(&ep, SAHPI_ENT_PHYSICAL_SLOT, blade_index + SNMP_BC_HPI_LOCATION_BASE); oh_set_ep_location(&ep, SAHPI_ENT_SBC_BLADE, blade_index + SNMP_BC_HPI_LOCATION_BASE); /* Determine which scheme to detect blade expansion */ /* Set entity_path index to the first entry (SNMP_BC_HPI_LOCATION_BASE) in table */ oh_set_ep_location(&ep, SAHPI_ENT_SYS_EXPANSION_BOARD, SNMP_BC_HPI_LOCATION_BASE); /* Go get value at (SNMP_BC_HPI_LOCATION_BASE + offset 0) */ err = snmp_bc_oid_snmp_get(custom_handle, &ep, 0, SNMP_BC_BLADE_EXP_BLADE_BAY, &get_value, SAHPI_TRUE); j = 0; if (err == SA_ERR_HPI_NOT_PRESENT) { /* No object exists with SNMP_BC_BLADE_EXP_BLADE_BAY oid */ /* Ether the target is running with older MM mib version,*/ /* or there is no expansion board at all in system. */ /* Use old scheme to discover BladeExpandion resource. */ /* Set entity_path index to the desired entry */ /* (blade_index + SNMP_BC_HPI_LOCATION_BASE) in table */ oh_set_ep_location(&ep, SAHPI_ENT_SYS_EXPANSION_BOARD, blade_index + SNMP_BC_HPI_LOCATION_BASE); /* Go get value at (SNMP_BC_HPI_LOCATION_BASE + offset 0) */ err = snmp_bc_oid_snmp_get(custom_handle, &ep, 0, SNMP_BC_BLADE_EXPANSION_VECTOR, &get_value, SAHPI_TRUE); /* With the old scheme, we can only detect one of the blade expansion board */ /* For example, if a blade has BSE and PEU, we see only one with this scheme*/ oh_set_ep_location(&ep, SAHPI_ENT_SYS_EXPANSION_BOARD, j + SNMP_BC_HPI_LOCATION_BASE); if (!err && get_value.integer != 0) { err = snmp_bc_add_blade_expansion_resource(handle, &ep, blade_index, DEFAULT_BLADE_EXPANSION_CARD_TYPE, j); } } else if(err == SA_OK) { /* New scheme; i == index for Processor Blade, j == index for Blade Expansion for each Processor Blade */ for (i=0; i < (custom_handle->max_pb_supported ); i++) { /* Set entity_path index to the first entry (SNMP_BC_HPI_LOCATION_BASE) in table */ oh_set_ep_location(&ep, SAHPI_ENT_SYS_EXPANSION_BOARD, SNMP_BC_HPI_LOCATION_BASE); /* Go get value at (SNMP_BC_HPI_LOCATION_BASE + offset i) */ err = snmp_bc_oid_snmp_get(custom_handle, &ep, i, SNMP_BC_BLADE_EXP_BLADE_BAY, &get_value, SAHPI_TRUE); if (err == SA_OK) { if (get_value.type != ASN_OCTET_STR) continue; if ( atoi(get_value.string) == (blade_index + SNMP_BC_HPI_LOCATION_BASE)) { /* Go get value at (SNMP_BC_HPI_LOCATION_BASE + offset i) */ err = snmp_bc_oid_snmp_get(custom_handle, &ep, i, SNMP_BC_BLADE_EXP_TYPE, &get_value, SAHPI_TRUE); if ((err == SA_OK) && (get_value.type == ASN_INTEGER)) { /* storageExpansion(1), pciExpansion(2) */ expansionType = get_value.integer; } else { err(" Error reading Expansion Board Type\n"); expansionType = DEFAULT_BLADE_EXPANSION_CARD_TYPE; } oh_set_ep_location(&ep, SAHPI_ENT_SYS_EXPANSION_BOARD, j + SNMP_BC_HPI_LOCATION_BASE); err = snmp_bc_add_blade_expansion_resource(handle, &ep, blade_index, expansionType, j); j++; } } } /* end for custom_handle->max_pb_supported */ } return(SA_OK); } /** * snmp_bc_add_blade_expansion_resource: * @handler: Pointer to handler's data. * @ep_root: Pointer to chassis Root Entity Path which comes from openhpi.conf. * @blade_index: Index of the main blade * * Discovers blade expansion resources and their RDRs, if any. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_add_blade_expansion_resource(struct oh_handler_state *handle, SaHpiEntityPathT *ep, guint blade_index, BCExpansionTypeT expansionType, guint expansionindex) { SaErrorT err; struct oh_event *e; struct ResourceInfo *res_info_ptr; struct snmp_bc_hnd *custom_handle; if (!handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } { e = snmp_bc_alloc_oh_event(); if (e == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* ---------------------------------------- */ /* Construct .resource of struct oh_event */ /* ---------------------------------------- */ e->resource = snmp_bc_rpt_array[BC_RPT_ENTRY_BLADE_EXPANSION_CARD].rpt; e->resource.ResourceEntity = *ep; e->resource.ResourceId = oh_uid_from_entity_path(ep); { SaHpiTextBufferT working, working2; snmp_bc_create_resourcetag(&working, "Blade", blade_index + SNMP_BC_HPI_LOCATION_BASE); snmp_bc_create_resourcetag(&working2, bladeexpansiondesc[expansionType], SNMP_BC_HPI_LOCATION_BASE + expansionindex); oh_init_textbuffer(&(e->resource.ResourceTag)); oh_append_textbuffer(&(e->resource.ResourceTag), (char *)working.Data); oh_append_textbuffer(&(e->resource.ResourceTag), " "); oh_append_textbuffer(&(e->resource.ResourceTag), (char *)working2.Data); } dbg("Discovered resource=%s; ID=%d", e->resource.ResourceTag.Data, e->resource.ResourceId); /* Create platform-specific info space to add to infra-structure */ res_info_ptr = g_memdup(&(snmp_bc_rpt_array[BC_RPT_ENTRY_BLADE_EXPANSION_CARD].res_info), sizeof(struct ResourceInfo)); if (!res_info_ptr) { err("Out of memory."); snmp_bc_free_oh_event(e); return(SA_ERR_HPI_OUT_OF_MEMORY); } res_info_ptr->cur_state = SAHPI_HS_STATE_ACTIVE; /* Get UUID and convert to GUID */ err = snmp_bc_get_guid(custom_handle, e, res_info_ptr); /* Add resource to resource cache */ err = oh_add_resource(handle->rptcache, &(e->resource), res_info_ptr, 0); if (err) { err("Failed to add resource. Error=%s.", oh_lookup_error(err)); snmp_bc_free_oh_event(e); return(err); } /* ---------------------------------------- */ /* Construct .rdrs of struct oh_event */ /* ---------------------------------------- */ /* Find resource's events, sensors, controls, etc. */ snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); snmp_bc_discover_sensors(handle, snmp_bc_bem_sensors, e); snmp_bc_discover_ipmi_sensors(handle, snmp_bc_bem_ipmi_sensors, e); snmp_bc_discover_controls(handle, snmp_bc_bem_controls, e); snmp_bc_discover_inventories(handle, snmp_bc_bem_inventories, e); /* ---------------------------------------- */ /* Construct .event of struct oh_event */ /* ---------------------------------------- */ snmp_bc_set_resource_add_oh_event(e, res_info_ptr); /* ---------------------------------------- */ /* Place the event in queue */ /* ---------------------------------------- */ /*custom_handle->eventq = g_slist_append(custom_handle->eventq, e);*/ e->hid = handle->hid; oh_evt_queue_push(handle->eventq, e); } return(SA_OK); } /** * snmp_bc_discover_blowers: * @handler: Pointer to handler's data. * @ep_root: Pointer to chassis Root Entity Path which comes from openhpi.conf. * @blower_vector: Bitmap vector of installed blowers. * * Discovers blower resources and their RDRs. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer paramter(s) NULL. **/ SaErrorT snmp_bc_discover_blowers(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, char *blower_vector) { guint i; SaErrorT err; struct oh_event *e; struct ResourceInfo *res_info_ptr; struct snmp_bc_hnd *custom_handle; if (!handle || !blower_vector) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } e= NULL; res_info_ptr = NULL; for (i=0; i < strlen(blower_vector); i++) { if ((blower_vector[i] == '1') || (custom_handle->isFirstDiscovery == SAHPI_TRUE)) { e = snmp_bc_alloc_oh_event(); if (e == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* ---------------------------------------- */ /* Construct .resource of struct oh_event */ /* ---------------------------------------- */ err = snmp_bc_construct_blower_rpt(e, &res_info_ptr, ep_root, i); if (err) { snmp_bc_free_oh_event(e); return(err); } } if ((blower_vector[i] == '0') && (custom_handle->isFirstDiscovery == SAHPI_TRUE)) { res_info_ptr->cur_state = SAHPI_HS_STATE_NOT_PRESENT; snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); snmp_bc_free_oh_event(e); g_free(res_info_ptr); } else if (blower_vector[i] == '1') { err = snmp_bc_add_blower_rptcache(handle, e, res_info_ptr, i); if (err == SA_OK) { /* ---------------------------------------- */ /* Construct .event of struct oh_event */ /* ---------------------------------------- */ snmp_bc_set_resource_add_oh_event(e, res_info_ptr); /* ---------------------------------------- */ /* Place the event in tmpqueue */ /* ---------------------------------------- */ /*custom_handle->eventq = g_slist_append(custom_handle->eventq, e);*/ if (e) e->hid = handle->hid; oh_evt_queue_push(handle->eventq, e); } else { snmp_bc_free_oh_event(e); } } } return(SA_OK); } /** * snmp_bc_discover_tap: * @handler: Pointer to handler's data. * @ep_root: Pointer to chassis Root Entity Path which comes from openhpi.conf. * @blower_vector: Bitmap vector of installed Telco Alarm Panel. * * Discovers Telco Alarm Panel resources and their RDRs. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer paramter(s) NULL. **/ SaErrorT snmp_bc_discover_tap(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, char *tap_vector) { guint i; SaErrorT err; struct oh_event *e; struct ResourceInfo *res_info_ptr; struct snmp_bc_hnd *custom_handle; if (!handle || !tap_vector) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } e= NULL; res_info_ptr = NULL; for (i=0; i < strlen(tap_vector); i++) { if ((tap_vector[i] == '1') || (custom_handle->isFirstDiscovery == SAHPI_TRUE)) { e = snmp_bc_alloc_oh_event(); if (e == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* ---------------------------------------- */ /* Construct .resource of struct oh_event */ /* ---------------------------------------- */ err = snmp_bc_construct_tap_rpt(e, &res_info_ptr, ep_root, i); if (err) { snmp_bc_free_oh_event(e); return(err); } } if ((tap_vector[i] == '0') && (custom_handle->isFirstDiscovery == SAHPI_TRUE)) { res_info_ptr->cur_state = SAHPI_HS_STATE_NOT_PRESENT; snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); snmp_bc_free_oh_event(e); g_free(res_info_ptr); } else if (tap_vector[i] == '1') { err = snmp_bc_add_tap_rptcache(handle, e, res_info_ptr, i); if (err == SA_OK) { /* ---------------------------------------- */ /* Construct .event of struct oh_event */ /* ---------------------------------------- */ snmp_bc_set_resource_add_oh_event(e, res_info_ptr); /* ---------------------------------------- */ /* Place the event in tmpqueue */ /* ---------------------------------------- */ /*custom_handle->eventq = g_slist_append(custom_handle->eventq, e);*/ if (e) e->hid = handle->hid; oh_evt_queue_push(handle->eventq, e); } else { snmp_bc_free_oh_event(e); } } } return(SA_OK); } /** * snmp_bc_construct_tap_rpt: * @e: Pointer to oh_event struct. * @res_info_ptr: Pointer to pointer of res_info_ptr * @ep_root: Pointer to chassis Root Entity Path which comes from openhpi.conf. * @tap_index: Index of discovered tap. * * Build rpt structure for a blade resource using model data * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_construct_tap_rpt(struct oh_event* e, struct ResourceInfo **res_info_ptr, SaHpiEntityPathT *ep_root, guint tap_index) { if (!e || !res_info_ptr) return (SA_ERR_HPI_INVALID_PARAMS); e->resource = snmp_bc_rpt_array[BC_RPT_ENTRY_ALARM_PANEL].rpt; oh_concat_ep(&(e->resource.ResourceEntity), ep_root); oh_set_ep_location(&(e->resource.ResourceEntity), BLADECENTER_ALARM_PANEL_SLOT, tap_index + SNMP_BC_HPI_LOCATION_BASE); oh_set_ep_location(&(e->resource.ResourceEntity), SAHPI_ENT_DISPLAY_PANEL, tap_index + SNMP_BC_HPI_LOCATION_BASE); e->resource.ResourceId = oh_uid_from_entity_path(&(e->resource.ResourceEntity)); snmp_bc_create_resourcetag(&(e->resource.ResourceTag), snmp_bc_rpt_array[BC_RPT_ENTRY_ALARM_PANEL].comment, tap_index + SNMP_BC_HPI_LOCATION_BASE); dbg("Discovered resource=%s; ID=%d", e->resource.ResourceTag.Data, e->resource.ResourceId); /* Create platform-specific info space to add to infra-structure */ *res_info_ptr = g_memdup(&(snmp_bc_rpt_array[BC_RPT_ENTRY_ALARM_PANEL].res_info), sizeof(struct ResourceInfo)); if (!(*res_info_ptr)) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } return(SA_OK); } /** * snmp_bc_add_tap_rptcache: * @handle: Pointer to hpi handle * @e: Pointer to oh_event struct. * @res_info_ptr: Pointer to pointer of res_info_ptr * @tap_index: Index of discovered tap. * * Build rpt and rdrs for a tap (Telco Alarm Panel) then add to rptcache * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_add_tap_rptcache(struct oh_handler_state *handle, struct oh_event *e, struct ResourceInfo *res_info_ptr, guint tap_index) { SaErrorT err; guint tap_width; struct snmp_value get_value; struct snmp_bc_hnd *custom_handle; if (!handle || !e || !res_info_ptr) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } dbg("Discovering Telco Alarm Panel %d resource.\n", tap_index); res_info_ptr->cur_state = SAHPI_HS_STATE_ACTIVE; /* Get UUID and convert to GUID */ err = snmp_bc_get_guid(custom_handle, e, res_info_ptr); /* Add resource to temporary event cache/queue */ err = oh_add_resource(handle->rptcache, &(e->resource), res_info_ptr, 0); if (err) { err("Failed to add resource. Error=%s.", oh_lookup_error(err)); return(err); } /* ---------------------------------------- */ /* Construct .rdrs of struct oh_event */ /* ---------------------------------------- */ /* Find resource's events, sensors, controls, etc. */ snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); snmp_bc_discover_sensors(handle, snmp_bc_alarm_sensors, e); snmp_bc_discover_controls(handle, snmp_bc_alarm_controls, e); snmp_bc_discover_inventories(handle, snmp_bc_alarm_inventories, e); tap_width = 1; /* Default to 1-wide blade */ if (res_info_ptr->mib.OidResourceWidth != NULL) { err = snmp_bc_oid_snmp_get(custom_handle, &(e->resource.ResourceEntity), 0, res_info_ptr->mib.OidResourceWidth, &get_value, SAHPI_TRUE); if (!err && (get_value.type == ASN_INTEGER)) { tap_width = get_value.integer; } } res_info_ptr->resourcewidth = tap_width; err = snmp_bc_set_resource_slot_state_sensor(handle, e, tap_width); return(err); } /** * snmp_bc_discover_tap_i: * @handle: Pointer to hpi handle * @ep_root: Pointer to . * @tap_index: Index of discovered tap. * * Discover a particular Telco Alarm Card at index tap_index. * This routine is used to rediscover a Telco Alarm Panel (tap). * Blower rpt and rdrs will be added to rptcache. * No event will be generated. The event is handled separately in log2event. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_discover_tap_i(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, guint tap_index) { SaErrorT err; struct oh_event *e; struct ResourceInfo *res_info_ptr; if (!handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } e= NULL; res_info_ptr = NULL; e = snmp_bc_alloc_oh_event(); if (e == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* ---------------------------------------- */ /* Construct .resource of struct oh_event */ /* ---------------------------------------- */ err = snmp_bc_construct_tap_rpt(e, &res_info_ptr, ep_root, tap_index); if (err) { snmp_bc_free_oh_event(e); return(err); } /* ---------------------------------------- */ /* Discover rdrs. */ /* Add rpt and rdrs to rptcache. */ /* ---------------------------------------- */ err = snmp_bc_add_tap_rptcache(handle, e, res_info_ptr, tap_index); snmp_bc_free_oh_event(e); return(SA_OK); } /** * snmp_bc_discover_smi: * @handler: Pointer to handler's data. * @ep_root: Pointer to chassis Root Entity Path which comes from openhpi.conf. * @smi_vector: Bitmap vector of installed Switch Module Interposers (smi). * * Discovers Switch Module Interposers resources and their RDRs. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer paramter(s) NULL. **/ SaErrorT snmp_bc_discover_smi(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, char *smi_vector) { guint i; SaErrorT err; struct oh_event *e; struct ResourceInfo *res_info_ptr; struct snmp_bc_hnd *custom_handle; if (!handle || !smi_vector) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } e= NULL; res_info_ptr = NULL; for (i=0; i < strlen(smi_vector); i++) { if ((smi_vector[i] == '1') || (custom_handle->isFirstDiscovery == SAHPI_TRUE)) { e = snmp_bc_alloc_oh_event(); if (e == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* ---------------------------------------- */ /* Construct .resource of struct oh_event */ /* ---------------------------------------- */ err = snmp_bc_construct_smi_rpt(e, &res_info_ptr, ep_root, i); if (err) { snmp_bc_free_oh_event(e); return(err); } } if ((smi_vector[i] == '0') && (custom_handle->isFirstDiscovery == SAHPI_TRUE)) { res_info_ptr->cur_state = SAHPI_HS_STATE_NOT_PRESENT; snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); snmp_bc_free_oh_event(e); g_free(res_info_ptr); } else if (smi_vector[i] == '1') { err = snmp_bc_add_smi_rptcache(handle, e, res_info_ptr, i); if (err == SA_OK) { /* ---------------------------------------- */ /* Construct .event of struct oh_event */ /* ---------------------------------------- */ snmp_bc_set_resource_add_oh_event(e, res_info_ptr); /* ---------------------------------------- */ /* Place the event in tmpqueue */ /* ---------------------------------------- */ /*custom_handle->eventq = g_slist_append(custom_handle->eventq, e);*/ if (e) e->hid = handle->hid; oh_evt_queue_push(handle->eventq, e); } else { snmp_bc_free_oh_event(e); } } } return(SA_OK); } /** * snmp_bc_construct_smi_rpt: * @e: Pointer to oh_event struct. * @res_info_ptr: Pointer to pointer of res_info_ptr * @ep_root: Pointer to chassis Root Entity Path which comes from openhpi.conf. * @smi_index: Index of discovered smi. * * Build rpt structure for a blade resource using model data * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_construct_smi_rpt(struct oh_event* e, struct ResourceInfo **res_info_ptr, SaHpiEntityPathT *ep_root, guint smi_index) { if (!e || !res_info_ptr) return (SA_ERR_HPI_INVALID_PARAMS); e->resource = snmp_bc_rpt_array[BC_RPT_ENTRY_INTERPOSER_SWITCH].rpt; oh_concat_ep(&(e->resource.ResourceEntity), ep_root); oh_set_ep_location(&(e->resource.ResourceEntity), BLADECENTER_SWITCH_SLOT, smi_index + SNMP_BC_HPI_LOCATION_BASE); oh_set_ep_location(&(e->resource.ResourceEntity), SAHPI_ENT_INTERCONNECT, smi_index + SNMP_BC_HPI_LOCATION_BASE); e->resource.ResourceId = oh_uid_from_entity_path(&(e->resource.ResourceEntity)); snmp_bc_create_resourcetag(&(e->resource.ResourceTag), snmp_bc_rpt_array[BC_RPT_ENTRY_INTERPOSER_SWITCH].comment, smi_index + SNMP_BC_HPI_LOCATION_BASE); dbg("Discovered resource=%s; ID=%d", e->resource.ResourceTag.Data, e->resource.ResourceId); /* Create platform-specific info space to add to infra-structure */ *res_info_ptr = g_memdup(&(snmp_bc_rpt_array[BC_RPT_ENTRY_INTERPOSER_SWITCH].res_info), sizeof(struct ResourceInfo)); if (!(*res_info_ptr)) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } return(SA_OK); } /** * snmp_bc_add_smi_rptcache: * @handle: Pointer to hpi handle * @e: Pointer to oh_event struct. * @res_info_ptr: Pointer to pointer of res_info_ptr * @smi_index: Index of discovered smi. * * Build rpt and rdrs for a smi (Switch Module interposer) then add to rptcache * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_add_smi_rptcache(struct oh_handler_state *handle, struct oh_event *e, struct ResourceInfo *res_info_ptr, guint smi_index) { SaErrorT err; struct snmp_bc_hnd *custom_handle; if (!handle || !e || !res_info_ptr) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } dbg("Discovering Switch Module Interposer %d resource.\n", smi_index); res_info_ptr->cur_state = SAHPI_HS_STATE_ACTIVE; /* Get UUID and convert to GUID */ err = snmp_bc_get_guid(custom_handle, e, res_info_ptr); /* Add resource to temporary event cache/queue */ err = oh_add_resource(handle->rptcache, &(e->resource), res_info_ptr, 0); if (err) { err("Failed to add resource. Error=%s.", oh_lookup_error(err)); return(err); } /* ---------------------------------------- */ /* Construct .rdrs of struct oh_event */ /* ---------------------------------------- */ /* Find resource's events, sensors, controls, etc. */ snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); //snmp_bc_discover_sensors(handle, snmp_bc_alarm_sensors, e); //snmp_bc_discover_controls(handle, snmp_bc_alarm_controls, e); snmp_bc_discover_inventories(handle, snmp_bc_interposer_switch_inventories, e); return(err); } /** * snmp_bc_discover_smi_i: * @handle: Pointer to hpi handle * @ep_root: Pointer to . * @smi_index: Index of discovered smi. * * Discover a Switch Module Interposer card at index mmi_index. * This routine is used to rediscover a Network Clock card (nc). * Blower rpt and rdrs will be added to rptcache. * No event will be generated. The event is handled separately in log2event. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_discover_smi_i(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, guint smi_index) { SaErrorT err; struct oh_event *e; struct ResourceInfo *res_info_ptr; if (!handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } e= NULL; res_info_ptr = NULL; e = snmp_bc_alloc_oh_event(); if (e == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* ---------------------------------------- */ /* Construct .resource of struct oh_event */ /* ---------------------------------------- */ err = snmp_bc_construct_smi_rpt(e, &res_info_ptr, ep_root, smi_index); if (err) { snmp_bc_free_oh_event(e); return(err); } /* ---------------------------------------- */ /* Discover rdrs. */ /* Add rpt and rdrs to rptcache. */ /* ---------------------------------------- */ err = snmp_bc_add_smi_rptcache(handle, e, res_info_ptr, smi_index); snmp_bc_free_oh_event(e); return(SA_OK); } /** * snmp_bc_discover_mmi: * @handler: Pointer to handler's data. * @ep_root: Pointer to chassis Root Entity Path which comes from openhpi.conf. * @mmi_vector: Bitmap vector of installed Management Module Interposers (mmi). * * Discovers Management Module Interposers resources and their RDRs. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer paramter(s) NULL. **/ SaErrorT snmp_bc_discover_mmi(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, char *mmi_vector) { guint i; SaErrorT err; struct oh_event *e; struct ResourceInfo *res_info_ptr; struct snmp_bc_hnd *custom_handle; if (!handle || !mmi_vector) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } e= NULL; res_info_ptr = NULL; for (i=0; i < strlen(mmi_vector); i++) { if ((mmi_vector[i] == '1') || (custom_handle->isFirstDiscovery == SAHPI_TRUE)) { e = snmp_bc_alloc_oh_event(); if (e == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* ---------------------------------------- */ /* Construct .resource of struct oh_event */ /* ---------------------------------------- */ err = snmp_bc_construct_mmi_rpt(e, &res_info_ptr, ep_root, i); if (err) { snmp_bc_free_oh_event(e); return(err); } } if ((mmi_vector[i] == '0') && (custom_handle->isFirstDiscovery == SAHPI_TRUE)) { res_info_ptr->cur_state = SAHPI_HS_STATE_NOT_PRESENT; snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); snmp_bc_free_oh_event(e); g_free(res_info_ptr); } else if (mmi_vector[i] == '1') { err = snmp_bc_add_mmi_rptcache(handle, e, res_info_ptr, i); if (err == SA_OK) { /* ---------------------------------------- */ /* Construct .event of struct oh_event */ /* ---------------------------------------- */ snmp_bc_set_resource_add_oh_event(e, res_info_ptr); /* ---------------------------------------- */ /* Place the event in tmpqueue */ /* ---------------------------------------- */ /*custom_handle->eventq = g_slist_append(custom_handle->eventq, e);*/ if (e) e->hid = handle->hid; oh_evt_queue_push(handle->eventq, e); } else { snmp_bc_free_oh_event(e); } } } return(SA_OK); } /** * snmp_bc_construct_mmi_rpt: * @e: Pointer to oh_event struct. * @res_info_ptr: Pointer to pointer of res_info_ptr * @ep_root: Pointer to chassis Root Entity Path which comes from openhpi.conf. * @mmi_index: Index of discovered mmi. * * Build rpt structure for a blade resource using model data * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_construct_mmi_rpt(struct oh_event* e, struct ResourceInfo **res_info_ptr, SaHpiEntityPathT *ep_root, guint mmi_index) { if (!e || !res_info_ptr) return (SA_ERR_HPI_INVALID_PARAMS); e->resource = snmp_bc_rpt_array[BC_RPT_ENTRY_INTERPOSER_MM].rpt; oh_concat_ep(&(e->resource.ResourceEntity), ep_root); oh_set_ep_location(&(e->resource.ResourceEntity), BLADECENTER_SYS_MGMNT_MODULE_SLOT, mmi_index + SNMP_BC_HPI_LOCATION_BASE); oh_set_ep_location(&(e->resource.ResourceEntity), SAHPI_ENT_INTERCONNECT, mmi_index + SNMP_BC_HPI_LOCATION_BASE); e->resource.ResourceId = oh_uid_from_entity_path(&(e->resource.ResourceEntity)); snmp_bc_create_resourcetag(&(e->resource.ResourceTag), snmp_bc_rpt_array[BC_RPT_ENTRY_INTERPOSER_MM].comment, mmi_index + SNMP_BC_HPI_LOCATION_BASE); dbg("Discovered resource=%s; ID=%d", e->resource.ResourceTag.Data, e->resource.ResourceId); /* Create platform-specific info space to add to infra-structure */ *res_info_ptr = g_memdup(&(snmp_bc_rpt_array[BC_RPT_ENTRY_INTERPOSER_MM].res_info), sizeof(struct ResourceInfo)); if (!(*res_info_ptr)) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } return(SA_OK); } /** * snmp_bc_add_mmi_rptcache: * @handle: Pointer to hpi handle * @e: Pointer to oh_event struct. * @res_info_ptr: Pointer to pointer of res_info_ptr * @mmi_index: Index of discovered mmi. * * Build rpt and rdrs for a mmi (Management Module interposer) then add to rptcache * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_add_mmi_rptcache(struct oh_handler_state *handle, struct oh_event *e, struct ResourceInfo *res_info_ptr, guint mmi_index) { SaErrorT err; struct snmp_bc_hnd *custom_handle; if (!handle || !e || !res_info_ptr) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } dbg("Discovering Management Module Interposer %d resource.\n", mmi_index); res_info_ptr->cur_state = SAHPI_HS_STATE_ACTIVE; /* Get UUID and convert to GUID */ err = snmp_bc_get_guid(custom_handle, e, res_info_ptr); /* Add resource to temporary event cache/queue */ err = oh_add_resource(handle->rptcache, &(e->resource), res_info_ptr, 0); if (err) { err("Failed to add resource. Error=%s.", oh_lookup_error(err)); return(err); } /* ---------------------------------------- */ /* Construct .rdrs of struct oh_event */ /* ---------------------------------------- */ /* Find resource's events, sensors, controls, etc. */ snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); //snmp_bc_discover_sensors(handle, snmp_bc_alarm_sensors, e); //snmp_bc_discover_controls(handle, snmp_bc_alarm_controls, e); snmp_bc_discover_inventories(handle, snmp_bc_interposer_mm_inventories, e); return(err); } /** * snmp_bc_discover_mmi_i: * @handle: Pointer to hpi handle * @ep_root: Pointer to . * @mmi_index: Index of discovered mmi. * * Discover a Management Module Interposer card at index mmi_index. * This routine is used to rediscover a Network Clock card (nc). * Blower rpt and rdrs will be added to rptcache. * No event will be generated. The event is handled separately in log2event. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_discover_mmi_i(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, guint mmi_index) { SaErrorT err; struct oh_event *e; struct ResourceInfo *res_info_ptr; if (!handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } e= NULL; res_info_ptr = NULL; e = snmp_bc_alloc_oh_event(); if (e == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* ---------------------------------------- */ /* Construct .resource of struct oh_event */ /* ---------------------------------------- */ err = snmp_bc_construct_mmi_rpt(e, &res_info_ptr, ep_root, mmi_index); if (err) { snmp_bc_free_oh_event(e); return(err); } /* ---------------------------------------- */ /* Discover rdrs. */ /* Add rpt and rdrs to rptcache. */ /* ---------------------------------------- */ err = snmp_bc_add_mmi_rptcache(handle, e, res_info_ptr, mmi_index); snmp_bc_free_oh_event(e); return(SA_OK); } /** * snmp_bc_discover_nc: * @handler: Pointer to handler's data. * @ep_root: Pointer to chassis Root Entity Path which comes from openhpi.conf. * @nc_vector: Bitmap vector of installed Network Clock (nc) cards. * * Discovers Network Clock Card resources and their RDRs. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer paramter(s) NULL. **/ SaErrorT snmp_bc_discover_nc(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, char *nc_vector) { guint i; SaErrorT err; struct oh_event *e; struct ResourceInfo *res_info_ptr; struct snmp_bc_hnd *custom_handle; if (!handle || !nc_vector) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } e= NULL; res_info_ptr = NULL; for (i=0; i < strlen(nc_vector); i++) { if ((nc_vector[i] == '1') || (custom_handle->isFirstDiscovery == SAHPI_TRUE)) { e = snmp_bc_alloc_oh_event(); if (e == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* ---------------------------------------- */ /* Construct .resource of struct oh_event */ /* ---------------------------------------- */ err = snmp_bc_construct_nc_rpt(e, &res_info_ptr, ep_root, i); if (err) { snmp_bc_free_oh_event(e); return(err); } } if ((nc_vector[i] == '0') && (custom_handle->isFirstDiscovery == SAHPI_TRUE)) { res_info_ptr->cur_state = SAHPI_HS_STATE_NOT_PRESENT; snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); snmp_bc_free_oh_event(e); g_free(res_info_ptr); } else if (nc_vector[i] == '1') { err = snmp_bc_add_nc_rptcache(handle, e, res_info_ptr, i); if (err == SA_OK) { /* ---------------------------------------- */ /* Construct .event of struct oh_event */ /* ---------------------------------------- */ snmp_bc_set_resource_add_oh_event(e, res_info_ptr); /* ---------------------------------------- */ /* Place the event in tmpqueue */ /* ---------------------------------------- */ /*custom_handle->eventq = g_slist_append(custom_handle->eventq, e);*/ if (e) e->hid = handle->hid; oh_evt_queue_push(handle->eventq, e); } else { snmp_bc_free_oh_event(e); } } } return(SA_OK); } /** * snmp_bc_construct_nc_rpt: * @e: Pointer to oh_event struct. * @res_info_ptr: Pointer to pointer of res_info_ptr * @ep_root: Pointer to chassis Root Entity Path which comes from openhpi.conf. * @nc_index: Index of discovered nc. * * Build rpt structure for a blade resource using model data * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_construct_nc_rpt(struct oh_event* e, struct ResourceInfo **res_info_ptr, SaHpiEntityPathT *ep_root, guint nc_index) { if (!e || !res_info_ptr) return (SA_ERR_HPI_INVALID_PARAMS); e->resource = snmp_bc_rpt_array[BC_RPT_ENTRY_CLOCK_MODULE].rpt; oh_concat_ep(&(e->resource.ResourceEntity), ep_root); oh_set_ep_location(&(e->resource.ResourceEntity), BLADECENTER_CLOCK_SLOT, nc_index + SNMP_BC_HPI_LOCATION_BASE); oh_set_ep_location(&(e->resource.ResourceEntity), (SAHPI_ENT_BATTERY + 13), nc_index + SNMP_BC_HPI_LOCATION_BASE); e->resource.ResourceId = oh_uid_from_entity_path(&(e->resource.ResourceEntity)); snmp_bc_create_resourcetag(&(e->resource.ResourceTag), snmp_bc_rpt_array[BC_RPT_ENTRY_CLOCK_MODULE].comment, nc_index + SNMP_BC_HPI_LOCATION_BASE); dbg("Discovered resource=%s; ID=%d", e->resource.ResourceTag.Data, e->resource.ResourceId); /* Create platform-specific info space to add to infra-structure */ *res_info_ptr = g_memdup(&(snmp_bc_rpt_array[BC_RPT_ENTRY_CLOCK_MODULE].res_info), sizeof(struct ResourceInfo)); if (!(*res_info_ptr)) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } return(SA_OK); } /** * snmp_bc_add_nc_rptcache: * @handle: Pointer to hpi handle * @e: Pointer to oh_event struct. * @res_info_ptr: Pointer to pointer of res_info_ptr * @nc_index: Index of discovered nc. * * Build rpt and rdrs for a nc (Network Clock Card) then add to rptcache * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_add_nc_rptcache(struct oh_handler_state *handle, struct oh_event *e, struct ResourceInfo *res_info_ptr, guint nc_index) { SaErrorT err; guint nc_width; struct snmp_value get_value; struct snmp_bc_hnd *custom_handle; if (!handle || !e || !res_info_ptr) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } dbg("Discovering Network Clocd Card %d resource.\n", nc_index); res_info_ptr->cur_state = SAHPI_HS_STATE_ACTIVE; /* Get UUID and convert to GUID */ err = snmp_bc_get_guid(custom_handle, e, res_info_ptr); /* Add resource to temporary event cache/queue */ err = oh_add_resource(handle->rptcache, &(e->resource), res_info_ptr, 0); if (err) { err("Failed to add resource. Error=%s.", oh_lookup_error(err)); return(err); } /* ---------------------------------------- */ /* Construct .rdrs of struct oh_event */ /* ---------------------------------------- */ /* Find resource's events, sensors, controls, etc. */ snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); snmp_bc_discover_sensors(handle, snmp_bc_clock_sensors, e); snmp_bc_discover_controls(handle, snmp_bc_clock_controls, e); snmp_bc_discover_inventories(handle, snmp_bc_clock_inventories, e); nc_width = 1; /* Default to 1-wide blade */ if (res_info_ptr->mib.OidResourceWidth != NULL) { err = snmp_bc_oid_snmp_get(custom_handle, &(e->resource.ResourceEntity), 0, res_info_ptr->mib.OidResourceWidth, &get_value, SAHPI_TRUE); if (!err && (get_value.type == ASN_INTEGER)) { nc_width = get_value.integer; } } res_info_ptr->resourcewidth = nc_width; err = snmp_bc_set_resource_slot_state_sensor(handle, e, nc_width); return(err); } /** * snmp_bc_discover_nc_i: * @handle: Pointer to hpi handle * @ep_root: Pointer to . * @nc_index: Index of discovered nc. * * Discover a Network Clock card at index nc_index. * This routine is used to rediscover a Network Clock card (nc). * Blower rpt and rdrs will be added to rptcache. * No event will be generated. The event is handled separately in log2event. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_discover_nc_i(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, guint nc_index) { SaErrorT err; struct oh_event *e; struct ResourceInfo *res_info_ptr; if (!handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } e= NULL; res_info_ptr = NULL; e = snmp_bc_alloc_oh_event(); if (e == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* ---------------------------------------- */ /* Construct .resource of struct oh_event */ /* ---------------------------------------- */ err = snmp_bc_construct_nc_rpt(e, &res_info_ptr, ep_root, nc_index); if (err) { snmp_bc_free_oh_event(e); return(err); } /* ---------------------------------------- */ /* Discover rdrs. */ /* Add rpt and rdrs to rptcache. */ /* ---------------------------------------- */ err = snmp_bc_add_nc_rptcache(handle, e, res_info_ptr, nc_index); snmp_bc_free_oh_event(e); return(SA_OK); } /** * snmp_bc_discover_mx: * @handler: Pointer to handler's data. * @ep_root: Pointer to chassis Root Entity Path which comes from openhpi.conf. * @blower_vector: Bitmap vector of installed Multiplex (mx) cards. * * Discovers Multiplex Card resources and their RDRs. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer paramter(s) NULL. **/ SaErrorT snmp_bc_discover_mx(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, char *mx_vector) { guint i; SaErrorT err; struct oh_event *e; struct ResourceInfo *res_info_ptr; struct snmp_bc_hnd *custom_handle; if (!handle || !mx_vector) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } e= NULL; res_info_ptr = NULL; for (i=0; i < strlen(mx_vector); i++) { if ((mx_vector[i] == '1') || (custom_handle->isFirstDiscovery == SAHPI_TRUE)) { e = snmp_bc_alloc_oh_event(); if (e == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* ---------------------------------------- */ /* Construct .resource of struct oh_event */ /* ---------------------------------------- */ err = snmp_bc_construct_mx_rpt(e, &res_info_ptr, ep_root, i); if (err) { snmp_bc_free_oh_event(e); return(err); } } if ((mx_vector[i] == '0') && (custom_handle->isFirstDiscovery == SAHPI_TRUE)) { res_info_ptr->cur_state = SAHPI_HS_STATE_NOT_PRESENT; snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); snmp_bc_free_oh_event(e); g_free(res_info_ptr); } else if (mx_vector[i] == '1') { err = snmp_bc_add_mx_rptcache(handle, e, res_info_ptr, i); if (err == SA_OK) { /* ---------------------------------------- */ /* Construct .event of struct oh_event */ /* ---------------------------------------- */ snmp_bc_set_resource_add_oh_event(e, res_info_ptr); /* ---------------------------------------- */ /* Place the event in tmpqueue */ /* ---------------------------------------- */ /*custom_handle->eventq = g_slist_append(custom_handle->eventq, e);*/ if (e) e->hid = handle->hid; oh_evt_queue_push(handle->eventq, e); } else { snmp_bc_free_oh_event(e); } } } return(SA_OK); } /** * snmp_bc_construct_mx_rpt: * @e: Pointer to oh_event struct. * @res_info_ptr: Pointer to pointer of res_info_ptr * @ep_root: Pointer to chassis Root Entity Path which comes from openhpi.conf. * @blower_index: Index of discovered mx. * * Build rpt structure for a blade resource using model data * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_construct_mx_rpt(struct oh_event* e, struct ResourceInfo **res_info_ptr, SaHpiEntityPathT *ep_root, guint mx_index) { if (!e || !res_info_ptr) return (SA_ERR_HPI_INVALID_PARAMS); e->resource = snmp_bc_rpt_array[BC_RPT_ENTRY_MUX_MODULE].rpt; oh_concat_ep(&(e->resource.ResourceEntity), ep_root); oh_set_ep_location(&(e->resource.ResourceEntity), BLADECENTER_MUX_SLOT, mx_index + SNMP_BC_HPI_LOCATION_BASE); oh_set_ep_location(&(e->resource.ResourceEntity), SAHPI_ENT_OTHER_CHASSIS_BOARD, mx_index + SNMP_BC_HPI_LOCATION_BASE); e->resource.ResourceId = oh_uid_from_entity_path(&(e->resource.ResourceEntity)); snmp_bc_create_resourcetag(&(e->resource.ResourceTag), snmp_bc_rpt_array[BC_RPT_ENTRY_MUX_MODULE].comment, mx_index + SNMP_BC_HPI_LOCATION_BASE); dbg("Discovered resource=%s; ID=%d", e->resource.ResourceTag.Data, e->resource.ResourceId); /* Create platform-specific info space to add to infra-structure */ *res_info_ptr = g_memdup(&(snmp_bc_rpt_array[BC_RPT_ENTRY_MUX_MODULE].res_info), sizeof(struct ResourceInfo)); if (!(*res_info_ptr)) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } return(SA_OK); } /** * snmp_bc_add_mx_rptcache: * @handle: Pointer to hpi handle * @e: Pointer to oh_event struct. * @res_info_ptr: Pointer to pointer of res_info_ptr * @blower_index: Index of discovered mx. * * Build rpt and rdrs for a mx (Multiplex Card) then add to rptcache * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_add_mx_rptcache(struct oh_handler_state *handle, struct oh_event *e, struct ResourceInfo *res_info_ptr, guint mx_index) { SaErrorT err; guint mx_width; struct snmp_value get_value; struct snmp_bc_hnd *custom_handle; if (!handle || !e || !res_info_ptr) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } dbg("Discovering Mux Card %d resource.\n", mx_index); res_info_ptr->cur_state = SAHPI_HS_STATE_ACTIVE; /* Get UUID and convert to GUID */ err = snmp_bc_get_guid(custom_handle, e, res_info_ptr); /* Add resource to temporary event cache/queue */ err = oh_add_resource(handle->rptcache, &(e->resource), res_info_ptr, 0); if (err) { err("Failed to add resource. Error=%s.", oh_lookup_error(err)); return(err); } /* ---------------------------------------- */ /* Construct .rdrs of struct oh_event */ /* ---------------------------------------- */ /* Find resource's events, sensors, controls, etc. */ snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); snmp_bc_discover_sensors(handle, snmp_bc_mux_sensors, e); snmp_bc_discover_controls(handle, snmp_bc_mux_controls, e); snmp_bc_discover_inventories(handle, snmp_bc_mux_inventories, e); mx_width = 1; /* Default to 1-wide blade */ if (res_info_ptr->mib.OidResourceWidth != NULL) { err = snmp_bc_oid_snmp_get(custom_handle, &(e->resource.ResourceEntity), 0, res_info_ptr->mib.OidResourceWidth, &get_value, SAHPI_TRUE); if (!err && (get_value.type == ASN_INTEGER)) { mx_width = get_value.integer; } } res_info_ptr->resourcewidth = mx_width; err = snmp_bc_set_resource_slot_state_sensor(handle, e, mx_width); return(err); } /** * snmp_bc_discover_mx_i: * @handle: Pointer to hpi handle * @ep_root: Pointer to . * @blower_index: Index of discovered mx. * * Discover a particular MUX at index mx_index. * This routine is used to rediscover a Multiplexer Card (mx). * Blower rpt and rdrs will be added to rptcache. * No event will be generated. The event is handled separately in log2event. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_discover_mx_i(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, guint mx_index) { SaErrorT err; struct oh_event *e; struct ResourceInfo *res_info_ptr; if (!handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } e= NULL; res_info_ptr = NULL; e = snmp_bc_alloc_oh_event(); if (e == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* ---------------------------------------- */ /* Construct .resource of struct oh_event */ /* ---------------------------------------- */ err = snmp_bc_construct_mx_rpt(e, &res_info_ptr, ep_root, mx_index); if (err) { snmp_bc_free_oh_event(e); return(err); } /* ---------------------------------------- */ /* Discover rdrs. */ /* Add rpt and rdrs to rptcache. */ /* ---------------------------------------- */ err = snmp_bc_add_mx_rptcache(handle, e, res_info_ptr, mx_index); snmp_bc_free_oh_event(e); return(SA_OK); } /** * snmp_bc_discover_power_module: * @handler: Pointer to handler's data. * @ep_root: Pointer to chassis Root Entity Path which comes from openhpi.conf. * @power_module_vector: Bitmap vector of installed power modules. * * Discovers power module resources and their RDRs. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_discover_power_module(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, char *power_module_vector) { int i; SaErrorT err; struct oh_event *e; struct ResourceInfo *res_info_ptr; struct snmp_bc_hnd *custom_handle; if (!handle || !power_module_vector) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } e = NULL; res_info_ptr = NULL; for (i=0; i < strlen(power_module_vector); i++) { if ((power_module_vector[i] == '1') || (custom_handle->isFirstDiscovery == SAHPI_TRUE)) { e = snmp_bc_alloc_oh_event(); if (e == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* ---------------------------------------- */ /* Construct .resource of struct oh_event */ /* ---------------------------------------- */ err = snmp_bc_construct_pm_rpt(e, &res_info_ptr, ep_root, i); if (err) { snmp_bc_free_oh_event(e); return(err); } } if ((power_module_vector[i] == '0') && (custom_handle->isFirstDiscovery == SAHPI_TRUE)) { res_info_ptr->cur_state = SAHPI_HS_STATE_NOT_PRESENT; snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); snmp_bc_free_oh_event(e); g_free(res_info_ptr); } else if (power_module_vector[i] == '1') { err = snmp_bc_add_pm_rptcache(handle, e, res_info_ptr, i); if (err == SA_OK) { /* ---------------------------------------- */ /* Construct .event of struct oh_event */ /* ---------------------------------------- */ snmp_bc_set_resource_add_oh_event(e, res_info_ptr); /* ---------------------------------------- */ /* Place the event in tmpqueue */ /* ---------------------------------------- */ /*custom_handle->eventq = g_slist_append(custom_handle->eventq, e);*/ e->hid = handle->hid; oh_evt_queue_push(handle->eventq, e); } else { snmp_bc_free_oh_event(e); } } } return(SA_OK); } /** * snmp_bc_discover_switch: * @handler: Pointer to handler's data. * @ep_root: Pointer to chassis Root Entity Path which comes from openhpi.conf. * @switch_vector: Bitmap vector of installed I/O modules. * * Discovers I/O module resources and their RDRs. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_discover_switch(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, char *switch_vector) { int i; SaErrorT err; struct oh_event *e; struct ResourceInfo *res_info_ptr; struct snmp_bc_hnd *custom_handle; if (!handle || !switch_vector) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } e = NULL; res_info_ptr = NULL; for (i=0; i < strlen(switch_vector); i++) { if ((switch_vector[i] == '1') || (custom_handle->isFirstDiscovery == SAHPI_TRUE)) { e = snmp_bc_alloc_oh_event(); if (e == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* ---------------------------------------- */ /* Construct .resource of struct oh_event */ /* ---------------------------------------- */ err = snmp_bc_construct_sm_rpt(e, &res_info_ptr, ep_root, i, custom_handle->installed_smi_mask); if (err) { snmp_bc_free_oh_event(e); return(err); } } if ((switch_vector[i] == '0') && (custom_handle->isFirstDiscovery == SAHPI_TRUE)) { res_info_ptr->cur_state = SAHPI_HS_STATE_NOT_PRESENT; snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); snmp_bc_free_oh_event(e); g_free(res_info_ptr); } else if (switch_vector[i] == '1') { err = snmp_bc_add_switch_rptcache(handle, e, res_info_ptr, i); if (err == SA_OK) { /* ---------------------------------------- */ /* Construct .event of struct oh_event */ /* ---------------------------------------- */ snmp_bc_set_resource_add_oh_event(e, res_info_ptr); /* ---------------------------------------- */ /* Place the event in tmpqueue */ /* ---------------------------------------- */ /*custom_handle->eventq = g_slist_append(custom_handle->eventq, e);*/ if (e) e->hid = handle->hid; oh_evt_queue_push(handle->eventq, e); } else { snmp_bc_free_oh_event(e); } } } return(SA_OK); } /** * snmp_bc_discover_mm: * @handler: Pointer to handler's data. * @ep_root: Pointer to chassis Root Entity Path which comes from openhpi.conf. * @mm_vector: Bitmap vector of installed MMs. * @global_discovery: Also include Virtual MM in the discovery * * Discovers management module (MM) resources and their RDRs. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_discover_mm(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, char *mm_vector, SaHpiBoolT global_discovery) { guint i; SaErrorT err; struct oh_event *e; struct snmp_value get_value; SaHpiRdrT *rdr; struct SensorInfo *sinfo; struct ResourceInfo *res_info_ptr; struct snmp_bc_hnd *custom_handle; if (!handle || !mm_vector) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } e = NULL; res_info_ptr = NULL; /* Discover Virtual MM */ if (global_discovery == SAHPI_TRUE) { e = snmp_bc_alloc_oh_event(); if (e == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* ---------------------------------------- */ /* Construct .resource of struct oh_event */ /* ---------------------------------------- */ e->resource = snmp_bc_rpt_array[BC_RPT_ENTRY_VIRTUAL_MGMNT_MODULE].rpt; oh_concat_ep(&(e->resource.ResourceEntity), ep_root); oh_set_ep_location(&(e->resource.ResourceEntity), SAHPI_ENT_SYS_MGMNT_MODULE, 0); e->resource.ResourceId = oh_uid_from_entity_path(&(e->resource.ResourceEntity)); snmp_bc_create_resourcetag(&(e->resource.ResourceTag), snmp_bc_rpt_array[BC_RPT_ENTRY_VIRTUAL_MGMNT_MODULE].comment, 0); dbg("Discovered resource=%s; ID=%d", e->resource.ResourceTag.Data, e->resource.ResourceId); /* Create platform-specific info space to add to infra-structure */ res_info_ptr = g_memdup(&(snmp_bc_rpt_array[BC_RPT_ENTRY_VIRTUAL_MGMNT_MODULE].res_info), sizeof(struct ResourceInfo)); if (!res_info_ptr) { err("Out of memory."); snmp_bc_free_oh_event(e); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* Add resource to resource cache */ err = oh_add_resource(handle->rptcache, &(e->resource), res_info_ptr, 0); if (err) { err("Failed to add resource. Error=%s.", oh_lookup_error(err)); snmp_bc_free_oh_event(e); return(err); } /* ---------------------------------------- */ /* Construct .rdrs of struct oh_event */ /* ---------------------------------------- */ /* Find resource's events, sensors, controls, etc. */ snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); snmp_bc_discover_sensors(handle, snmp_bc_virtual_mgmnt_sensors, e); snmp_bc_discover_controls(handle, snmp_bc_virtual_mgmnt_controls, e); snmp_bc_discover_inventories(handle, snmp_bc_virtual_mgmnt_inventories, e); /* -------------------------------------------- */ /* Adjust initial state of VMM Redudancy Sensor */ /* -------------------------------------------- */ rdr = oh_get_rdr_by_type(handle->rptcache, e->resource.ResourceId, SAHPI_SENSOR_RDR, BLADECENTER_SENSOR_NUM_MGMNT_REDUNDANCY); if (rdr) { sinfo = (struct SensorInfo *)oh_get_rdr_data(handle->rptcache, e->resource.ResourceId, rdr->RecordId); if ((strncmp(mm_vector, "11", 2) == 0)) { sinfo->cur_state = SAHPI_ES_FULLY_REDUNDANT; } else { sinfo->cur_state = SAHPI_ES_NON_REDUNDANT_INSUFFICIENT_RESOURCES; } sinfo->cur_child_rid = e->resource.ResourceId; err = oh_add_rdr(handle->rptcache, e->resource.ResourceId, rdr, sinfo, 0); } rdr = oh_get_rdr_by_type(handle->rptcache, e->resource.ResourceId, SAHPI_SENSOR_RDR, BLADECENTER_SENSOR_NUM_MGMNT_STANDBY); if (rdr) { sinfo = (struct SensorInfo *)oh_get_rdr_data(handle->rptcache, e->resource.ResourceId, rdr->RecordId); if ((strncmp(mm_vector, "11", 2) == 0)) { sinfo->cur_state = SAHPI_ES_PRESENT; } else { sinfo->cur_state = SAHPI_ES_ABSENT; } sinfo->cur_child_rid = e->resource.ResourceId; err = oh_add_rdr(handle->rptcache, e->resource.ResourceId, rdr, sinfo, 0); } /* ---------------------------------------- */ /* Construct .event of struct oh_event */ /* ---------------------------------------- */ snmp_bc_set_resource_add_oh_event(e, res_info_ptr); /* ---------------------------------------- */ /* Place the event in tmpqueue */ /* ---------------------------------------- */ /*custom_handle->eventq = g_slist_append(custom_handle->eventq, e);*/ e->hid = handle->hid; oh_evt_queue_push(handle->eventq, e); } /* Discover Physical MM */ for (i=0; i < strlen(mm_vector); i++) { dbg("Management Module installed bit map %s", get_value.string); if ((mm_vector[i] == '1') || (custom_handle->isFirstDiscovery == SAHPI_TRUE)) { e = snmp_bc_alloc_oh_event(); if (e == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* ---------------------------------------- */ /* Construct .resource of struct oh_event */ /* ---------------------------------------- */ err = snmp_bc_construct_mm_rpt(e, &res_info_ptr, ep_root, i, custom_handle->installed_mmi_mask); if (err) { snmp_bc_free_oh_event(e); return(err); } } if ((mm_vector[i] == '0') && (custom_handle->isFirstDiscovery == SAHPI_TRUE)) { res_info_ptr->cur_state = SAHPI_HS_STATE_NOT_PRESENT; snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); snmp_bc_free_oh_event(e); g_free(res_info_ptr); } else if (mm_vector[i] == '1'){ err = snmp_bc_add_mm_rptcache(handle, e, res_info_ptr, i); if (err == SA_OK) { /* ---------------------------------------- */ /* Construct .event of struct oh_event */ /* ---------------------------------------- */ snmp_bc_set_resource_add_oh_event(e, res_info_ptr); /* ---------------------------------------- */ /* Place the event in tmpqueue */ /* ---------------------------------------- */ /*custom_handle->eventq = g_slist_append(custom_handle->eventq, e);*/ if (e) e->hid = handle->hid; oh_evt_queue_push(handle->eventq, e); } else snmp_bc_free_oh_event(e); } } return(SA_OK); } /** * snmp_bc_discover_ipmi_sensors: * @handler: Pointer to handler's data. * @sensor_array: Pointer to resource's static sensor data array. * @parent_res_event: Pointer to resource's event structure. * * Discovers resource's available IPMI sensors and their events. * * Return values: * Adds sensor RDRs to internal Infra-structure queues - normal case * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory **/ static SaErrorT snmp_bc_discover_ipmi_sensors(struct oh_handler_state *handle, struct snmp_bc_ipmi_sensor *sensor_array, struct oh_event *res_oh_event) { int i; GHashTable *ipmi_sensor_hash; SaErrorT err, rtn_code = SA_OK; struct SensorMibInfo *mib_info; struct snmp_bc_hnd *custom_handle; struct snmp_value get_value; SaHpiRdrT *rdrptr; struct SensorInfo *sinfo; custom_handle = (struct snmp_bc_hnd *)handle->data; /* Check if this is an IPMI blade */ err = snmp_bc_oid_snmp_get(custom_handle, &(res_oh_event->resource.ResourceEntity), 0, SNMP_BC_IPMI_TEMP_BLADE_OID, &get_value, SAHPI_FALSE); if (err || get_value.type != ASN_INTEGER) { err("Cannot get OID=%s; Received Type=%d; Error=%s.", SNMP_BC_IPMI_TEMP_BLADE_OID, get_value.type, oh_lookup_error(err)); if (err) { return(err); } else { return(SA_ERR_HPI_INTERNAL_ERROR); } } if (get_value.integer == 0) return(SA_OK); /* Not an IPMI Blade */ /* Create an temporary hash table and populate with all of the blade's active IPMI sensors */ ipmi_sensor_hash = g_hash_table_new(g_str_hash, g_str_equal); if (ipmi_sensor_hash == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /***************************************** * Search for all the defined IPMI sensors *****************************************/ /* Find blade's defined temperature IPMI sensors */ for (i=0; iresource.ResourceEntity), 0, snmp_bc_ipmi_sensors_temp[i].oid, &get_value, SAHPI_FALSE); if (!err) { char *hash_existing_key, *hash_value; gchar **strparts = NULL; gchar *s, *ipmi_tag; /* Find IPMI tag in returned value */ strparts = g_strsplit(get_value.string, SNMP_BC_IPMI_STRING_DELIMITER, -1); if (strparts == NULL || strparts[0] == '\0') { err("Cannot split IPMI temp returned value=%s.", get_value.string); g_strfreev(strparts); continue; } ipmi_tag = g_strstrip(g_strdup(strparts[0])); g_strfreev(strparts); if (ipmi_tag == NULL || ipmi_tag[0] == '\0') { err("Stripped IPMI tag is NULL"); g_free(ipmi_tag); continue; } /* Change IPMI Tag to upper case */ for (s=ipmi_tag; *s; s++) { *s = g_ascii_toupper(*s); } dbg("Found OID IPMI sensor=%s", ipmi_tag); /* Insert tag and OID info in temporary hash */ if (!g_hash_table_lookup_extended(ipmi_sensor_hash, ipmi_tag, (gpointer)&hash_existing_key, (gpointer)&hash_value)) { mib_info = g_memdup(&(snmp_bc_ipmi_sensors_temp[i]), sizeof(struct SensorMibInfo)); if (!mib_info) { err("Out of memory."); g_free(ipmi_tag); rtn_code = SA_ERR_HPI_OUT_OF_MEMORY; goto CLEANUP; } g_hash_table_insert(ipmi_sensor_hash, ipmi_tag, mib_info); } else { /* Already exists */ err("Duplicate IPMI OID=%s.", snmp_bc_ipmi_sensors_temp[i].oid); g_free(ipmi_tag); } } } /* Find blade's voltage IPMI sensors */ for (i=0; iresource.ResourceEntity), 0, snmp_bc_ipmi_sensors_voltage[i].oid, &get_value, SAHPI_FALSE); if (!err) { char *hash_existing_key, *hash_value; gchar **strparts = NULL; gchar *s, *ipmi_tag; /* Find IPMI tag in returned value */ strparts = g_strsplit(get_value.string, SNMP_BC_IPMI_STRING_DELIMITER, -1); if (strparts == NULL || strparts[0] == '\0') { err("Cannot split IPMI voltage returned value=%s.", get_value.string); g_strfreev(strparts); continue; } ipmi_tag = g_strstrip(g_strdup(strparts[0])); g_strfreev(strparts); if (ipmi_tag == NULL || ipmi_tag[0] == '\0') { err("Stripped IPMI tag is NULL"); g_free(ipmi_tag); continue; } /* Change IPMI Tag to upper case */ for (s=ipmi_tag; *s; s++) { *s = g_ascii_toupper(*s); } dbg("Found OID IPMI sensor=%s", ipmi_tag); /* Insert tag and OID info in temporary hash */ if (!g_hash_table_lookup_extended(ipmi_sensor_hash, ipmi_tag, (gpointer)&hash_existing_key, (gpointer)&hash_value)) { mib_info = g_memdup(&(snmp_bc_ipmi_sensors_voltage[i]), sizeof(struct SensorMibInfo)); if (!mib_info) { err("Out of memory."); g_free(ipmi_tag); rtn_code = SA_ERR_HPI_OUT_OF_MEMORY; goto CLEANUP; } g_hash_table_insert(ipmi_sensor_hash, ipmi_tag, mib_info); } else { /* Already exists */ dbg("Duplicate IPMI OID=%s.", snmp_bc_ipmi_sensors_voltage[i].oid); g_free(ipmi_tag); } } } /* Iterate thru all the possible IPMI sensors, if it's defined for this blade, push up its RDR info to Infra-structure */ for (i=0; sensor_array[i].ipmi.index != 0; i++) { mib_info = (struct SensorMibInfo *)g_hash_table_lookup(ipmi_sensor_hash, sensor_array[i].ipmi_tag); /* See if the tag has an alias */ if (!mib_info && (sensor_array[i].ipmi_tag_alias1 && sensor_array[i].ipmi_tag_alias1[0] != '\0')) { mib_info = (struct SensorMibInfo *)g_hash_table_lookup(ipmi_sensor_hash, sensor_array[i].ipmi_tag_alias1); } if (mib_info) { rdrptr = (SaHpiRdrT *)g_malloc0(sizeof(SaHpiRdrT)); if (rdrptr == NULL) { err("Out of memory."); rtn_code = SA_ERR_HPI_OUT_OF_MEMORY; goto CLEANUP; } rdrptr->RdrType = SAHPI_SENSOR_RDR; rdrptr->Entity = res_oh_event->resource.ResourceEntity; err = snmp_bc_mod_sensor_ep(rdrptr, sensor_array, i); rdrptr->RdrTypeUnion.SensorRec = sensor_array[i].ipmi.sensor; dbg("Blade Found IPMI Sensor=%s", sensor_array[i].ipmi.comment); oh_init_textbuffer(&(rdrptr->IdString)); oh_append_textbuffer(&(rdrptr->IdString), sensor_array[i].ipmi.comment); sinfo = g_memdup(&(sensor_array[i].ipmi.sensor_info), sizeof(struct SensorInfo)); if (!sinfo) { err("Out of memory."); rtn_code = SA_ERR_HPI_OUT_OF_MEMORY; g_free(rdrptr); goto CLEANUP; } sinfo->mib = *mib_info; /* Add rdr to resource cache */ err = oh_add_rdr(handle->rptcache, res_oh_event->resource.ResourceId, rdrptr, sinfo, 0); if (err) { err("Cannot add RDR. Error=%s.", oh_lookup_error(err)); g_free(rdrptr); } else { res_oh_event->rdrs = g_slist_append(res_oh_event->rdrs, rdrptr); snmp_bc_discover_sensor_events(handle, &(res_oh_event->resource.ResourceEntity), sensor_array[i].ipmi.sensor.Num, &(sensor_array[i].ipmi)); } } } CLEANUP: /* Destroy temporary hash table */ g_hash_table_foreach(ipmi_sensor_hash, free_hash_data, NULL); g_hash_table_destroy(ipmi_sensor_hash); return(rtn_code); } static void free_hash_data(gpointer key, gpointer value, gpointer user_data) { g_free(key); g_free(value); } /** * snmp_bc_rediscover: * @handler: Pointer to handler's data. * @event: Pointer to event being processed. * * Check install masks and target discovery * -- If resource is removed, then remove rpt and associated rdr's * -- In resource is newly installed, then rediscover ... * * Return values: * **/ SaErrorT snmp_bc_rediscover(struct oh_handler_state *handle, SaHpiEventT *working_event, LogSource2ResourceT *logsrc2res) { SaErrorT err; gint i, j; SaHpiRptEntryT *res; guint rediscovertype; SaHpiBoolT foundit, isSMI; struct snmp_value get_value; struct snmp_bc_hnd *custom_handle; char *root_tuple; struct ResourceInfo *resinfo; char resource_mask[SNMP_BC_MAX_RESOURCES_MASK]; SaHpiEntityPathT ep_root; SaHpiEntityTypeT hotswap_entitytype; SaHpiEntityLocationT hotswap_entitylocation; if (!handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } memset(&resource_mask, 0, SNMP_BC_MAX_RESOURCES_MASK); rediscovertype = snmp_bc_isrediscover(working_event); /* ------------------------------------------------------------------ */ /* Parse EntityPath to find out the type of resource being hotswapped */ /* ------------------------------------------------------------------ */ memset(resource_mask, '\0', SNMP_BC_MAX_RESOURCES_MASK); isSMI = SAHPI_FALSE; foundit = SAHPI_FALSE; hotswap_entitytype = SAHPI_ENT_UNKNOWN; hotswap_entitylocation = SNMP_BC_NOT_VALID; /* Invalid location */ /* Do not use 0 for invalid location */ /* because virtual resource has loc 0 */ for (i=0; logsrc2res->ep.Entry[i].EntityType != SAHPI_ENT_SYSTEM_CHASSIS; i++) { switch ((int)logsrc2res->ep.Entry[i].EntityType) { case SAHPI_ENT_SBC_BLADE: case SAHPI_ENT_FAN: case SAHPI_ENT_POWER_SUPPLY: case SAHPI_ENT_SWITCH: case SAHPI_ENT_SYS_MGMNT_MODULE: case SAHPI_ENT_PERIPHERAL_BAY: case SAHPI_ENT_DISPLAY_PANEL: case SAHPI_ENT_OTHER_CHASSIS_BOARD: case (SAHPI_ENT_BATTERY + 13): case (SAHPI_ENT_PHYSICAL_SLOT + 16): case SAHPI_ENT_INTERCONNECT: foundit = SAHPI_TRUE; hotswap_entitytype = logsrc2res->ep.Entry[i].EntityType; hotswap_entitylocation = logsrc2res->ep.Entry[i].EntityLocation; for (j=0; j < SNMP_BC_MAX_RESOURCES_MASK; j++) { if ( j != (hotswap_entitylocation - 1) ) resource_mask[j] = '0'; else resource_mask[j] = '1'; } isSMI = SAHPI_TRUE; if ( logsrc2res->ep.Entry[i].EntityType == SAHPI_ENT_INTERCONNECT) { if (logsrc2res->ep.Entry[i+1].EntityType == BLADECENTER_SYS_MGMNT_MODULE_SLOT) { isSMI = SAHPI_FALSE; } } break; default: break; } if (foundit) break; } if ( (!foundit) || ( hotswap_entitylocation == 0xFF) ) { err("Hotswap event for non hotswap-able resource\n"); return(SA_OK); } /* ------------------------------------------------------------------ */ /* Hotswap: removal ... */ /* remove rpt and associated rdrs of the removed resource */ /* ------------------------------------------------------------------ */ if (rediscovertype == SNMP_BC_RESOURCE_REMOVED ) { res = oh_get_resource_by_id(handle->rptcache, working_event->Source); resinfo = (struct ResourceInfo *)oh_get_resource_data(handle->rptcache, working_event->Source); if (res) { /* Remove resource, rpt and rdr's, from plugin copy of rptcache */ /* No longer need to generate OH_ET_RESOURCE_DEL event, */ /* because the new oh_event struct handler will remove infrastru*/ /* rpt and rdr's based on hotswap event state. */ if (resinfo) resinfo->cur_state = SAHPI_HS_STATE_NOT_PRESENT; err = snmp_bc_reset_resource_slot_state_sensor(handle, res); oh_remove_resource(handle->rptcache, res->ResourceId); switch ((int)hotswap_entitytype) { case SAHPI_ENT_SBC_BLADE: /* Fetch blade installed vector */ get_installed_mask(SNMP_BC_PB_INSTALLED, get_value); strncpy(custom_handle->installed_pb_mask, get_value.string, SNMP_BC_MAX_RESOURCES_MASK); break; case SAHPI_ENT_FAN: /* Fetch blower installed vector */ get_installed_mask(SNMP_BC_BLOWER_INSTALLED, get_value); strncpy(custom_handle->installed_blower_mask, get_value.string, SNMP_BC_MAX_RESOURCES_MASK); break; case SAHPI_ENT_POWER_SUPPLY: /* Fetch power module installed vector */ get_installed_mask(SNMP_BC_PM_INSTALLED, get_value); strncpy(custom_handle->installed_pm_mask, get_value.string, SNMP_BC_MAX_RESOURCES_MASK); break; case SAHPI_ENT_SWITCH: /* Fetch switch installed vector */ get_installed_mask(SNMP_BC_SM_INSTALLED, get_value); strncpy(custom_handle->installed_sm_mask, get_value.string, SNMP_BC_MAX_RESOURCES_MASK); break; case SAHPI_ENT_SYS_MGMNT_MODULE: /* Fetch MMs installed vector */ get_installed_mask(SNMP_BC_MM_INSTALLED, get_value); strncpy(custom_handle->installed_mm_mask, get_value.string, SNMP_BC_MAX_RESOURCES_MASK); break; case SAHPI_ENT_PERIPHERAL_BAY: /* get_dualmode_object(SNMP_BC_MT_INSTALLED, get_value); */ snmp_bc_fetch_MT_install_mask(handle, &get_value); custom_handle->installed_mt_mask = get_value.integer; break; case (SAHPI_ENT_PHYSICAL_SLOT + 16): /* Fetch filter (front bezel) installed vector */ get_dualmode_object(SNMP_BC_FILTER_INSTALLED, get_value); custom_handle->installed_filter_mask = get_value.integer; break; case SAHPI_ENT_DISPLAY_PANEL: /* Fetch telco-alarm-panel installed vector */ get_installed_mask(SNMP_BC_AP_INSTALLED, get_value); strncpy(custom_handle->installed_tap_mask, get_value.string, SNMP_BC_MAX_RESOURCES_MASK); break; case (SAHPI_ENT_BATTERY + 13): /* Fetch network-clock-card installed vector */ get_installed_mask(SNMP_BC_NC_INSTALLED, get_value); strncpy(custom_handle->installed_nc_mask, get_value.string, SNMP_BC_MAX_RESOURCES_MASK); break; case SAHPI_ENT_OTHER_CHASSIS_BOARD: /* Fetch mux-card installed vector */ get_installed_mask(SNMP_BC_MX_INSTALLED, get_value); strncpy(custom_handle->installed_mx_mask, get_value.string, SNMP_BC_MAX_RESOURCES_MASK); break; case SAHPI_ENT_INTERCONNECT: /* Fetch new interposer-card installed vector */ if(isSMI) { get_installed_mask(SNMP_BC_SMI_INSTALLED, get_value); strncpy(custom_handle->installed_smi_mask, get_value.string, SNMP_BC_MAX_RESOURCES_MASK); } else { get_installed_mask(SNMP_BC_MMI_INSTALLED, get_value); strncpy(custom_handle->installed_mmi_mask, get_value.string, SNMP_BC_MAX_RESOURCES_MASK); } break; default: err("Unrecognize Hotswap Entity %d\n", hotswap_entitytype); break; } } else err("No valid resource at hand. Could not remove resource."); return(SA_OK); } if ( rediscovertype == SNMP_BC_RESOURCE_INSTALLED) { oh_init_ep(&ep_root); root_tuple = (gchar *)g_hash_table_lookup(handle->config, "entity_root"); oh_encode_entitypath(root_tuple, &ep_root); /* Initialize tmpqueue for temporary RDR cache */ /* tmpqueue is no longer used, 08/16/06 */ /* custom_handle->tmpqueue = NULL; */ /* --------------------------------------------------------- */ /* Fetch various resource installation maps from BladeCenter */ /* --------------------------------------------------------- */ switch ((int)hotswap_entitytype) { case SAHPI_ENT_SBC_BLADE: /* Fetch blade installed vector */ get_installed_mask(SNMP_BC_PB_INSTALLED, get_value); for (i=0; i < strlen(get_value.string); i++) { if ( custom_handle->installed_pb_mask[i] != get_value.string[i] ) { err = snmp_bc_discover_blade_i(handle, &ep_root,i); } } strncpy(custom_handle->installed_pb_mask, get_value.string, SNMP_BC_MAX_RESOURCES_MASK); break; case SAHPI_ENT_FAN: /* Fetch blower installed vector */ get_installed_mask(SNMP_BC_BLOWER_INSTALLED, get_value); for (i=0; i < strlen(get_value.string); i++) { if ( custom_handle->installed_blower_mask[i] != get_value.string[i] ) { err = snmp_bc_discover_blower_i(handle, &ep_root,i); } } strncpy(custom_handle->installed_blower_mask, get_value.string, SNMP_BC_MAX_RESOURCES_MASK); break; case SAHPI_ENT_POWER_SUPPLY: /* Fetch power module installed vector */ get_installed_mask(SNMP_BC_PM_INSTALLED, get_value); for (i=0; i < strlen(get_value.string); i++) { if ( custom_handle->installed_pm_mask[i] != get_value.string[i] ) { err = snmp_bc_discover_pm_i(handle, &ep_root,i); } } strncpy(custom_handle->installed_pm_mask, get_value.string, SNMP_BC_MAX_RESOURCES_MASK); break; case SAHPI_ENT_SWITCH: /* Fetch switch installed vector */ get_installed_mask(SNMP_BC_SM_INSTALLED, get_value); for (i=0; i < strlen(get_value.string); i++) { if ( custom_handle->installed_sm_mask[i] != get_value.string[i] ) { err = snmp_bc_discover_switch_i(handle, &ep_root,i); } } strncpy(custom_handle->installed_sm_mask, get_value.string, SNMP_BC_MAX_RESOURCES_MASK); break; case SAHPI_ENT_SYS_MGMNT_MODULE: /* Fetch MMs installed vector */ get_installed_mask(SNMP_BC_MM_INSTALLED, get_value); for (i=0; i < strlen(get_value.string); i++) { if ( custom_handle->installed_mm_mask[i] != get_value.string[i] ) { err = snmp_bc_discover_mm_i(handle, &ep_root,i); } } strncpy(custom_handle->installed_mm_mask, get_value.string, SNMP_BC_MAX_RESOURCES_MASK); break; case SAHPI_ENT_PERIPHERAL_BAY: /* get_dualmode_object(SNMP_BC_MT_INSTALLED, get_value); */ snmp_bc_fetch_MT_install_mask(handle, &get_value); custom_handle->installed_mt_mask = get_value.integer; switch (hotswap_entitylocation) { case 1: err = snmp_bc_discover_media_tray(handle, &ep_root, 10); break; case 2: err = snmp_bc_discover_media_tray(handle, &ep_root, 01); break; default: break; } break; case SAHPI_ENT_DISPLAY_PANEL: get_installed_mask(SNMP_BC_AP_INSTALLED, get_value); for (i=0; i < strlen(get_value.string); i++) { if ( custom_handle->installed_tap_mask[i] != get_value.string[i] ) { err = snmp_bc_discover_tap_i(handle, &ep_root,i); } } strncpy(custom_handle->installed_tap_mask, get_value.string, SNMP_BC_MAX_RESOURCES_MASK); break; case SAHPI_ENT_OTHER_CHASSIS_BOARD: /* Fetch mux-card installed vector */ get_installed_mask(SNMP_BC_MX_INSTALLED, get_value); for (i=0; i < strlen(get_value.string); i++) { if ( custom_handle->installed_mx_mask[i] != get_value.string[i] ) { err = snmp_bc_discover_mx_i(handle, &ep_root,i); } } strncpy(custom_handle->installed_mx_mask, get_value.string, SNMP_BC_MAX_RESOURCES_MASK); break; case (SAHPI_ENT_BATTERY + 13): /* Fetch network-clock-card installed vector */ get_installed_mask(SNMP_BC_NC_INSTALLED, get_value); for (i=0; i < strlen(get_value.string); i++) { if ( custom_handle->installed_nc_mask[i] != get_value.string[i] ) { err = snmp_bc_discover_nc_i(handle, &ep_root,i); } } strncpy(custom_handle->installed_nc_mask, get_value.string, SNMP_BC_MAX_RESOURCES_MASK); break; case (SAHPI_ENT_PHYSICAL_SLOT + 16): /* Fetch filter (front bezel) installed vector */ get_dualmode_object(SNMP_BC_FILTER_INSTALLED, get_value); err = snmp_bc_discover_filter(handle, &ep_root, get_value.integer); custom_handle->installed_filter_mask = get_value.integer; break; case SAHPI_ENT_INTERCONNECT: if (isSMI) { /* Fetch Switch Module Interposer installed vector */ get_installed_mask(SNMP_BC_SMI_INSTALLED, get_value); for (i=0; i < strlen(get_value.string); i++) { if ( custom_handle->installed_smi_mask[i] != get_value.string[i] ) { err = snmp_bc_discover_smi_i(handle, &ep_root,i); } } strncpy(custom_handle->installed_smi_mask, get_value.string, SNMP_BC_MAX_RESOURCES_MASK); } else { /* Fetch Management Module Interposer installed vector */ get_installed_mask(SNMP_BC_MMI_INSTALLED, get_value); for (i=0; i < strlen(get_value.string); i++) { if ( custom_handle->installed_mmi_mask[i] != get_value.string[i] ) { err = snmp_bc_discover_mmi_i(handle, &ep_root,i); } } strncpy(custom_handle->installed_mmi_mask, get_value.string, SNMP_BC_MAX_RESOURCES_MASK); } break; default: err("Unrecognize Hotswap Entity %d\n", hotswap_entitytype); break; } /** ** Before returning, see if we need to readjust current Hotswap state. ** (1) Previously, snmp_bc_log2event()/snmp_bc_set_cur_prev_event_states() set ** HotSwapState = SAHPI_HS_STATE_INACTIVE by default if there **was** no rpt, ** no resinfo. ** (2) Now that rediscovery is complete, check handle->rptcache for this resource ** CAPABILITY. If it is Managed Hotswap, then INACTIVE HotSwapState is OK. ** If it is Simple Hotswap, then HotSwapState needs to be set to ACTIVE in both event ** and resinfo. **/ res = oh_get_resource_by_ep(handle->rptcache, &logsrc2res->ep); if (res) { if ( (working_event->EventType == SAHPI_ET_HOTSWAP) && (working_event->EventDataUnion.HotSwapEvent.HotSwapState == SAHPI_HS_STATE_INACTIVE) ) { if (!(res->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP)) { resinfo = (struct ResourceInfo *)oh_get_resource_data(handle->rptcache, working_event->Source); resinfo->cur_state = working_event->EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_ACTIVE; } } } } return(SA_OK); } /** * snmp_bc_discover_all_slots * @handler: Pointer to handler's data. * @ep_root: Pointer to chassis Root Entity Path which comes from openhpi.conf. * * Discovers all BladeCenter physical slots. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_discover_all_slots(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root) { guint i; SaErrorT err; struct snmp_bc_hnd *custom_handle; if (!handle || !ep_root) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } for (i = 0; i < custom_handle->max_pb_supported; i++) { err = snmp_bc_discover_slot(handle, ep_root, SAHPI_ENT_PHYSICAL_SLOT,i); } for (i = 0; i < custom_handle->max_blower_supported; i++) { err = snmp_bc_discover_slot(handle, ep_root, BLADECENTER_BLOWER_SLOT,i); } for (i = 0; i < custom_handle->max_pm_supported; i++) { err = snmp_bc_discover_slot(handle, ep_root, BLADECENTER_POWER_SUPPLY_SLOT,i); } for (i = 0; i < custom_handle->max_sm_supported; i++) { err = snmp_bc_discover_slot(handle, ep_root, BLADECENTER_SWITCH_SLOT,i); } for (i = 0; i < custom_handle->max_mm_supported; i++) { err = snmp_bc_discover_slot(handle, ep_root, BLADECENTER_SYS_MGMNT_MODULE_SLOT,i); } for (i = 0; i < custom_handle->max_mt_supported; i++) { err = snmp_bc_discover_slot(handle, ep_root, BLADECENTER_PERIPHERAL_BAY_SLOT,i); } for (i = 0; i < custom_handle->max_tap_supported; i++) { err = snmp_bc_discover_slot(handle, ep_root, BLADECENTER_ALARM_PANEL_SLOT,i); } for (i = 0; i < custom_handle->max_nc_supported; i++) { err = snmp_bc_discover_slot(handle, ep_root, BLADECENTER_CLOCK_SLOT,i); } for (i = 0; i < custom_handle->max_mx_supported; i++) { err = snmp_bc_discover_slot(handle, ep_root, BLADECENTER_MUX_SLOT,i); } return(SA_OK); } /** * snmp_bc_discovery_slot: * @handler: Pointer to handler's data. * @ep_root: Pointer to chassis Root Entity Path which comes from openhpi.conf. * @entitytype: Resource type of the slot. * @entitylocation: Slot location of the resource. * * Discovers slot resources and their RDRs. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_discover_slot( struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, SaHpiEntityTypeT entitytype, guint entitylocation) { SaErrorT err; char *comment; struct oh_event *e; struct snmp_bc_hnd *custom_handle; struct ResourceInfo *res_info_ptr; if (!handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } e = NULL; res_info_ptr = NULL; e = snmp_bc_alloc_oh_event(); if (e == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* ---------------------------------------- */ /* Construct .resource of struct oh_event */ /* ---------------------------------------- */ e->resource = snmp_bc_rpt_array[BC_RPT_ENTRY_PHYSICAL_SLOT].rpt; oh_concat_ep(&(e->resource.ResourceEntity), ep_root); oh_set_ep_location(&(e->resource.ResourceEntity), SAHPI_ENT_CHASSIS_SPECIFIC, entitylocation + SNMP_BC_HPI_LOCATION_BASE); switch ((int)entitytype) { case SAHPI_ENT_PHYSICAL_SLOT: e->resource.ResourceEntity.Entry[0].EntityType = SAHPI_ENT_PHYSICAL_SLOT; comment = SNMP_BC_PHYSICAL_SLOT; break; case BLADECENTER_SWITCH_SLOT: e->resource.ResourceEntity.Entry[0].EntityType = BLADECENTER_SWITCH_SLOT; comment = SNMP_BC_SWITCH_SLOT; break; case BLADECENTER_POWER_SUPPLY_SLOT: e->resource.ResourceEntity.Entry[0].EntityType = BLADECENTER_POWER_SUPPLY_SLOT; comment = SNMP_BC_POWER_SUPPLY_SLOT; break; case BLADECENTER_PERIPHERAL_BAY_SLOT: e->resource.ResourceEntity.Entry[0].EntityType = BLADECENTER_PERIPHERAL_BAY_SLOT; comment = SNMP_BC_PERIPHERAL_BAY_SLOT; break; case BLADECENTER_SYS_MGMNT_MODULE_SLOT: e->resource.ResourceEntity.Entry[0].EntityType = BLADECENTER_SYS_MGMNT_MODULE_SLOT; comment = SNMP_BC_SYS_MGMNT_MODULE_SLOT; break; case BLADECENTER_BLOWER_SLOT: e->resource.ResourceEntity.Entry[0].EntityType = BLADECENTER_BLOWER_SLOT; comment = SNMP_BC_BLOWER_SLOT; break; case BLADECENTER_ALARM_PANEL_SLOT: e->resource.ResourceEntity.Entry[0].EntityType = BLADECENTER_ALARM_PANEL_SLOT; comment = SNMP_BC_ALARM_PANEL_SLOT; break; case BLADECENTER_CLOCK_SLOT: e->resource.ResourceEntity.Entry[0].EntityType = BLADECENTER_CLOCK_SLOT; comment = SNMP_BC_CLOCK_SLOT; break; case BLADECENTER_MUX_SLOT: e->resource.ResourceEntity.Entry[0].EntityType = BLADECENTER_MUX_SLOT; comment = SNMP_BC_MUX_SLOT; break; default: err("Invalid slot resource type\n"); return(SA_ERR_HPI_INVALID_PARAMS); } e->resource.ResourceId = oh_uid_from_entity_path(&(e->resource.ResourceEntity)); snmp_bc_create_resourcetag(&(e->resource.ResourceTag), comment, entitylocation + SNMP_BC_HPI_LOCATION_BASE); res_info_ptr = g_memdup(&(snmp_bc_rpt_array[BC_RPT_ENTRY_PHYSICAL_SLOT].res_info), sizeof(struct ResourceInfo)); if (!res_info_ptr) { err("Out of memory."); g_free(e); return(SA_ERR_HPI_OUT_OF_MEMORY); } err = oh_add_resource(handle->rptcache, &(e->resource), res_info_ptr, 0); if (err) { err("Failed to add resource. Error=%s.", oh_lookup_error(err)); g_free(e); return(err); } /* ---------------------------------------- */ /* Construct .rdrs of struct oh_event */ /* ---------------------------------------- */ /* Find resource's rdrs: sensors, controls, etc. */ snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); snmp_bc_discover_sensors(handle, snmp_bc_slot_sensors, e); snmp_bc_discover_controls(handle, snmp_bc_slot_controls, e); snmp_bc_discover_inventories(handle, snmp_bc_slot_inventories, e); /* ---------------------------------------- */ /* Construct .event of struct oh_event */ /* ---------------------------------------- */ snmp_bc_set_resource_add_oh_event(e, res_info_ptr); /* ---------------------------------------- */ /* Place the event in event queue */ /* ---------------------------------------- */ /*custom_handle->eventq = g_slist_append(custom_handle->eventq, e);*/ e->hid = handle->hid; oh_evt_queue_push(handle->eventq, e); /* ---------------------------------------- */ /* ---------------------------------------- */ return(SA_OK); } /** * snmp_bc_isrediscover: * @e: Pointer to event structure. * * Examine event and determine if this is hotswap install, remove or none * * Return values: * 0 - Neither hotswap install not remove. * SNMP_BC_RESOURCE_INSTALLED - This is a hotswap install event. * SNMP_BC_RESOURCE_REMOVED - This is a hotswap remove event. **/ guint snmp_bc_isrediscover(SaHpiEventT *working_event) { guint rediscovertype; rediscovertype = 0; /* Default - do nothing */ if (working_event->EventType == SAHPI_ET_HOTSWAP) { if (working_event->EventDataUnion.HotSwapEvent.PreviousHotSwapState == SAHPI_HS_STATE_NOT_PRESENT) { if (working_event->EventDataUnion.HotSwapEvent.HotSwapState == SAHPI_HS_STATE_NOT_PRESENT) err("Sanity check FAILED! PreviousHotSwapState = HotSwapState == SAHPI_HS_STATE_NOT_PRESENT\n"); rediscovertype = SNMP_BC_RESOURCE_INSTALLED; /* New resource is installed */ } else if (working_event->EventDataUnion.HotSwapEvent.HotSwapState == SAHPI_HS_STATE_NOT_PRESENT) { if (working_event->EventDataUnion.HotSwapEvent.PreviousHotSwapState == SAHPI_HS_STATE_NOT_PRESENT) err("Sanity check FAILED! PreviousHotSwapState = HotSwapState == SAHPI_HS_STATE_NOT_PRESENT\n"); rediscovertype = SNMP_BC_RESOURCE_REMOVED; /* resource is removed */ } } return(rediscovertype); } /** * snmp_bc_construct_blade_rpt: * @e: Pointer to oh_event struct. * @res_info_ptr: Pointer to pointer of res_info_ptr * @ep_root: Pointer to chassis Root Entity Path which comes from openhpi.conf. * @blade_index: Index of discovered blade. * * Build rpt structure for a blade resource using model data * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_construct_blade_rpt(struct oh_event *e, struct ResourceInfo **res_info_ptr, SaHpiEntityPathT *ep_root, guint blade_index) { if (!e || !res_info_ptr) return (SA_ERR_HPI_INVALID_PARAMS); e->resource = snmp_bc_rpt_array[BC_RPT_ENTRY_BLADE].rpt; oh_concat_ep(&(e->resource.ResourceEntity), ep_root); oh_set_ep_location(&(e->resource.ResourceEntity), SAHPI_ENT_PHYSICAL_SLOT, blade_index + SNMP_BC_HPI_LOCATION_BASE); oh_set_ep_location(&(e->resource.ResourceEntity), SAHPI_ENT_SBC_BLADE, blade_index + SNMP_BC_HPI_LOCATION_BASE); e->resource.ResourceId = oh_uid_from_entity_path(&(e->resource.ResourceEntity)); *res_info_ptr = g_memdup(&(snmp_bc_rpt_array[BC_RPT_ENTRY_BLADE].res_info), sizeof(struct ResourceInfo)); if (!(*res_info_ptr)) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } return(SA_OK); } /** * snmp_bc_construct_blower_rpt: * @e: Pointer to oh_event struct. * @res_info_ptr: Pointer to pointer of res_info_ptr * @ep_root: Pointer to chassis Root Entity Path which comes from openhpi.conf. * @blower_index: Index of discovered blower. * * Build rpt structure for a blade resource using model data * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_construct_blower_rpt(struct oh_event* e, struct ResourceInfo **res_info_ptr, SaHpiEntityPathT *ep_root, guint blower_index) { if (!e || !res_info_ptr) return (SA_ERR_HPI_INVALID_PARAMS); e->resource = snmp_bc_rpt_array[BC_RPT_ENTRY_BLOWER_MODULE].rpt; oh_concat_ep(&(e->resource.ResourceEntity), ep_root); oh_set_ep_location(&(e->resource.ResourceEntity), BLADECENTER_BLOWER_SLOT, blower_index + SNMP_BC_HPI_LOCATION_BASE); oh_set_ep_location(&(e->resource.ResourceEntity), SAHPI_ENT_FAN, blower_index + SNMP_BC_HPI_LOCATION_BASE); e->resource.ResourceId = oh_uid_from_entity_path(&(e->resource.ResourceEntity)); snmp_bc_create_resourcetag(&(e->resource.ResourceTag), snmp_bc_rpt_array[BC_RPT_ENTRY_BLOWER_MODULE].comment, blower_index + SNMP_BC_HPI_LOCATION_BASE); dbg("Discovered resource=%s; ID=%d", e->resource.ResourceTag.Data, e->resource.ResourceId); /* Create platform-specific info space to add to infra-structure */ *res_info_ptr = g_memdup(&(snmp_bc_rpt_array[BC_RPT_ENTRY_BLOWER_MODULE].res_info), sizeof(struct ResourceInfo)); if (!(*res_info_ptr)) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } return(SA_OK); } /** * snmp_bc_construct_pm_rpt: * @e: Pointer to oh_event struct. * @res_info_ptr: Pointer to pointer of res_info_ptr * @ep_root: Pointer to chassis Root Entity Path which comes from openhpi.conf. * @pm_index: Index of discovered power module. * * Build rpt structure for a power module resource using model data * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_construct_pm_rpt(struct oh_event *e, struct ResourceInfo **res_info_ptr, SaHpiEntityPathT *ep_root, guint pm_index) { if (!e || !res_info_ptr) return(SA_ERR_HPI_INVALID_PARAMS); e->resource = snmp_bc_rpt_array[BC_RPT_ENTRY_POWER_MODULE].rpt; oh_concat_ep(&(e->resource.ResourceEntity), ep_root); oh_set_ep_location(&(e->resource.ResourceEntity), BLADECENTER_POWER_SUPPLY_SLOT, pm_index + SNMP_BC_HPI_LOCATION_BASE); oh_set_ep_location(&(e->resource.ResourceEntity), SAHPI_ENT_POWER_SUPPLY, pm_index + SNMP_BC_HPI_LOCATION_BASE); e->resource.ResourceId = oh_uid_from_entity_path(&(e->resource.ResourceEntity)); snmp_bc_create_resourcetag(&(e->resource.ResourceTag), snmp_bc_rpt_array[BC_RPT_ENTRY_POWER_MODULE].comment, pm_index + SNMP_BC_HPI_LOCATION_BASE); dbg("Discovered resource=%s; ID=%d", e->resource.ResourceTag.Data, e->resource.ResourceId); /* Create platform-specific info space to add to infra-structure */ *res_info_ptr = g_memdup(&(snmp_bc_rpt_array[BC_RPT_ENTRY_POWER_MODULE].res_info), sizeof(struct ResourceInfo)); if (!(*res_info_ptr)) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } return(SA_OK); } /** * snmp_bc_construct_sm_rpt: * @e: Pointer to oh_event struct. * @res_info_ptr: Pointer to pointer of res_info_ptr * @ep_root: Pointer to chassis Root Entity Path which comes from openhpi.conf. * @sm_index: Index of discovered switch module. * * Build rpt structure for a switch module resource using model data * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_construct_sm_rpt(struct oh_event *e, struct ResourceInfo **res_info_ptr, SaHpiEntityPathT *ep_root, guint sm_index, char *interposer_install_mask) { if (!e || !res_info_ptr) return(SA_ERR_HPI_INVALID_PARAMS); e->resource = snmp_bc_rpt_array[BC_RPT_ENTRY_SWITCH_MODULE].rpt; /* Adjust entity path, if there is a switch interposer installed in this slot */ snmp_bc_extend_ep(e, sm_index, interposer_install_mask); /* Setting entity path for this instance */ /* oh_set_ep_location() does nothing if it can not */ /* find the specified entity type in ep structure */ oh_concat_ep(&(e->resource.ResourceEntity), ep_root); oh_set_ep_location(&(e->resource.ResourceEntity), BLADECENTER_SWITCH_SLOT, sm_index + SNMP_BC_HPI_LOCATION_BASE); oh_set_ep_location(&(e->resource.ResourceEntity), SAHPI_ENT_INTERCONNECT, sm_index + SNMP_BC_HPI_LOCATION_BASE); oh_set_ep_location(&(e->resource.ResourceEntity), SAHPI_ENT_SWITCH, sm_index + SNMP_BC_HPI_LOCATION_BASE); e->resource.ResourceId = oh_uid_from_entity_path(&(e->resource.ResourceEntity)); snmp_bc_create_resourcetag(&(e->resource.ResourceTag), snmp_bc_rpt_array[BC_RPT_ENTRY_SWITCH_MODULE].comment, sm_index + SNMP_BC_HPI_LOCATION_BASE); dbg("Discovered resource=%s; ID=%d", e->resource.ResourceTag.Data, e->resource.ResourceId); /* Create platform-specific info space to add to infra-structure */ *res_info_ptr = g_memdup(&(snmp_bc_rpt_array[BC_RPT_ENTRY_SWITCH_MODULE].res_info), sizeof(struct ResourceInfo)); if (!(*res_info_ptr)) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } return(SA_OK); } /** * snmp_bc_construct_mm_rpt: * @e: Pointer to oh_event struct. * @res_info_ptr: Pointer to pointer of res_info_ptr * @ep_root: Pointer to chassis Root Entity Path which comes from openhpi.conf. * @mm_index: Index of discovered management module. * * Build rpt structure for a management module resource using model data * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_construct_mm_rpt(struct oh_event *e, struct ResourceInfo **res_info_ptr, SaHpiEntityPathT *ep_root, guint mm_index, char *interposer_install_mask) { if (!e || !res_info_ptr) return(SA_ERR_HPI_INVALID_PARAMS); e->resource = snmp_bc_rpt_array[BC_RPT_ENTRY_MGMNT_MODULE].rpt; /* Adjust entity path, if there is a switch interposer installed in this slot */ snmp_bc_extend_ep(e, mm_index, interposer_install_mask); /* Setting entity path for this instance */ /* oh_set_ep_location() does nothing if it can not */ /* find the specified entity type in ep structure */ oh_concat_ep(&(e->resource.ResourceEntity), ep_root); oh_set_ep_location(&(e->resource.ResourceEntity), BLADECENTER_SYS_MGMNT_MODULE_SLOT, mm_index + SNMP_BC_HPI_LOCATION_BASE); oh_set_ep_location(&(e->resource.ResourceEntity), SAHPI_ENT_INTERCONNECT, mm_index + SNMP_BC_HPI_LOCATION_BASE); oh_set_ep_location(&(e->resource.ResourceEntity), SAHPI_ENT_SYS_MGMNT_MODULE, mm_index + SNMP_BC_HPI_LOCATION_BASE); e->resource.ResourceId = oh_uid_from_entity_path(&(e->resource.ResourceEntity)); snmp_bc_create_resourcetag(&(e->resource.ResourceTag), snmp_bc_rpt_array[BC_RPT_ENTRY_MGMNT_MODULE].comment, mm_index + SNMP_BC_HPI_LOCATION_BASE); dbg("Discovered resource=%s; ID=%d", e->resource.ResourceTag.Data, e->resource.ResourceId); /* Create platform-specific info space to add to infra-structure */ *res_info_ptr = g_memdup(&(snmp_bc_rpt_array[BC_RPT_ENTRY_MGMNT_MODULE].res_info), sizeof(struct ResourceInfo)); if (!(*res_info_ptr)) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } return(SA_OK); } /** * snmp_bc_add_blade_rptcache: * @handle: Pointer to hpi handle * @e: Pointer to oh_event struct. * @res_info_ptr: Pointer to pointer of res_info_ptr * @blade_index: Index of discovered blade. * * Build rpt and rdrs for a blade then add to rptcache * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_add_blade_rptcache(struct oh_handler_state *handle, struct oh_event *e, struct ResourceInfo *res_info_ptr, guint blade_index) { SaErrorT err; guint blade_width; guint local_retry; struct snmp_value get_value, get_blade_resourcetag; struct snmp_bc_hnd *custom_handle; if (!handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } local_retry = 0; while(1) { err = snmp_bc_oid_snmp_get(custom_handle, &(e->resource.ResourceEntity), 0, snmp_bc_rpt_array[BC_RPT_ENTRY_BLADE].OidResourceTag, &get_blade_resourcetag, SAHPI_TRUE); /* If MM is busy discovering blade, we gives MM */ /* 3 seconds to collect blade info then try again*/ if ( (get_blade_resourcetag.type == ASN_OCTET_STR) && ( g_ascii_strncasecmp(get_blade_resourcetag.string, LOG_DISCOVERING, sizeof(LOG_DISCOVERING)) == 0 ) ) { /* Give the AMM 12 sec max to discover this resource */ /* Give up on this resource if AMM can not find it after 12 sec */ if (local_retry < 4) local_retry++; else break; sleep(3); } else break; } snmp_bc_create_resourcetag(&(e->resource.ResourceTag), snmp_bc_rpt_array[BC_RPT_ENTRY_BLADE].comment, blade_index + SNMP_BC_HPI_LOCATION_BASE); /* Tack on MM's defined blade name */ if (!err && (get_blade_resourcetag.type == ASN_OCTET_STR)) { oh_append_textbuffer(&(e->resource.ResourceTag), " - "); oh_append_textbuffer(&(e->resource.ResourceTag), get_blade_resourcetag.string); } dbg("Discovered resource=%s; ID=%d", e->resource.ResourceTag.Data, e->resource.ResourceId); /* Create platform-specific info space to add to infra-structure */ /* Determine and set current resource state */ res_info_ptr->cur_state = SAHPI_HS_STATE_ACTIVE; /* Default to ACTIVE */ if (res_info_ptr->mib.OidPowerState != NULL) { /* Read power state of resource */ err = snmp_bc_oid_snmp_get(custom_handle, &(e->resource.ResourceEntity), 0, res_info_ptr->mib.OidPowerState, &get_value, SAHPI_TRUE); if (!err && (get_value.type == ASN_INTEGER)) { if (get_value.integer == 0) /* state = SAHPI_POWER_OFF */ res_info_ptr->cur_state = SAHPI_HS_STATE_INACTIVE; } } /* Get UUID and convert to GUID */ err = snmp_bc_get_guid(custom_handle, e, res_info_ptr); /* Add resource to resource */ err = oh_add_resource(handle->rptcache, &(e->resource), res_info_ptr, 0); if (err) { err("Failed to add resource. Error=%s.", oh_lookup_error(err)); return(err); } /* ---------------------------------------- */ /* Construct .rdrs of struct oh_event */ /* ---------------------------------------- */ /* Find resource's events, sensors, controls, etc. */ snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); snmp_bc_discover_sensors(handle, snmp_bc_blade_sensors, e); snmp_bc_discover_ipmi_sensors(handle, snmp_bc_blade_ipmi_sensors, e); snmp_bc_discover_controls(handle, snmp_bc_blade_controls, e); snmp_bc_discover_inventories(handle, snmp_bc_blade_inventories, e); blade_width = 1; /* Default to 1-wide blade */ if (res_info_ptr->mib.OidResourceWidth != NULL) { err = snmp_bc_oid_snmp_get(custom_handle, &(e->resource.ResourceEntity), 0, res_info_ptr->mib.OidResourceWidth, &get_value, SAHPI_TRUE); if (!err && (get_value.type == ASN_INTEGER)) { blade_width = get_value.integer; } } res_info_ptr->resourcewidth = blade_width; err = snmp_bc_set_resource_slot_state_sensor(handle, e, blade_width); /********************************** * Discover Blade Expansion Modules * err = snmp_bc_discover_blade_expansion(handle, * ep_root, * blade_index); **********************************/ return(err); } /** * snmp_bc_add_blower_rptcache: * @handle: Pointer to hpi handle * @e: Pointer to oh_event struct. * @res_info_ptr: Pointer to pointer of res_info_ptr * @blower_index: Index of discovered blower. * * Build rpt and rdrs for a blower then add to rptcache * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_add_blower_rptcache(struct oh_handler_state *handle, struct oh_event *e, struct ResourceInfo *res_info_ptr, guint blower_index) { SaErrorT err; guint blower_width; struct snmp_value get_value; struct snmp_bc_hnd *custom_handle; if (!handle || !e || !res_info_ptr) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } dbg("Discovering blower %d resource.\n", blower_index); res_info_ptr->cur_state = SAHPI_HS_STATE_ACTIVE; /* Get UUID and convert to GUID */ err = snmp_bc_get_guid(custom_handle, e, res_info_ptr); /* Add resource to temporary event cache/queue */ err = oh_add_resource(handle->rptcache, &(e->resource), res_info_ptr, 0); if (err) { err("Failed to add resource. Error=%s.", oh_lookup_error(err)); return(err); } /* ---------------------------------------- */ /* Construct .rdrs of struct oh_event */ /* ---------------------------------------- */ /* Find resource's events, sensors, controls, etc. */ snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); snmp_bc_discover_sensors(handle, snmp_bc_blower_sensors, e); if ( (custom_handle->platform == SNMP_BC_PLATFORM_BCH) || (custom_handle->platform == SNMP_BC_PLATFORM_BCHT) ){ snmp_bc_discover_sensors(handle, snmp_bc_blower_sensors_bch, e); } snmp_bc_discover_controls(handle, snmp_bc_blower_controls, e); snmp_bc_discover_inventories(handle, snmp_bc_blower_inventories, e); blower_width = 1; /* Default to 1-wide blade */ if (res_info_ptr->mib.OidResourceWidth != NULL) { err = snmp_bc_oid_snmp_get(custom_handle, &(e->resource.ResourceEntity), 0, res_info_ptr->mib.OidResourceWidth, &get_value, SAHPI_TRUE); if (!err && (get_value.type == ASN_INTEGER)) { blower_width = get_value.integer; } } res_info_ptr->resourcewidth = blower_width; err = snmp_bc_set_resource_slot_state_sensor(handle, e, blower_width); return(err); } /** * snmp_bc_add_pm_rptcache: * @handle: Pointer to hpi handle * @e: Pointer to oh_event struct. * @res_info_ptr: Pointer to pointer of res_info_ptr * @pm_index: Index of discovered power module. * * Build rpt and rdrs for a power module then add to rptcache * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_add_pm_rptcache(struct oh_handler_state *handle, struct oh_event *e, struct ResourceInfo *res_info_ptr, guint pm_index) { SaErrorT err; guint pm_width; struct snmp_value get_value; struct snmp_bc_hnd *custom_handle; if (!handle || !e || !res_info_ptr) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } dbg("Discovering power module %d resource.\n", pm_index); res_info_ptr->cur_state = SAHPI_HS_STATE_ACTIVE; /* Get UUID and convert to GUID */ err = snmp_bc_get_guid(custom_handle, e, res_info_ptr); /* Add resource to temporary event cache/queue */ err = oh_add_resource(handle->rptcache, &(e->resource), res_info_ptr, 0); if (err) { err("Failed to add resource. Error=%s.", oh_lookup_error(err)); return(err); } /* ---------------------------------------- */ /* Construct .rdrs of struct oh_event */ /* ---------------------------------------- */ /* Find resource's events, sensors, controls, etc. */ snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); snmp_bc_discover_sensors(handle, snmp_bc_power_sensors, e); if ( (custom_handle->platform == SNMP_BC_PLATFORM_BCH) || (custom_handle->platform == SNMP_BC_PLATFORM_BCHT) ){ snmp_bc_discover_sensors(handle, snmp_bc_power_sensors_bch, e); } snmp_bc_discover_controls(handle, snmp_bc_power_controls, e); snmp_bc_discover_inventories(handle, snmp_bc_power_inventories, e); pm_width = 1; /* Default to 1-wide */ if (res_info_ptr->mib.OidResourceWidth != NULL) { err = snmp_bc_oid_snmp_get(custom_handle, &(e->resource.ResourceEntity), 0, res_info_ptr->mib.OidResourceWidth, &get_value, SAHPI_TRUE); if (!err && (get_value.type == ASN_INTEGER)) { pm_width = get_value.integer; } } res_info_ptr->resourcewidth = pm_width; err = snmp_bc_set_resource_slot_state_sensor(handle, e, pm_width); return(err); } /** * snmp_bc_add_switch_rptcache: * @handle: Pointer to hpi handle * @e: Pointer to oh_event struct. * @res_info_ptr: Pointer to pointer of res_info_ptr * @switch_index: Index of discovered power module. * * Build rpt and rdrs for a switch module then add to rptcache * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_add_switch_rptcache(struct oh_handler_state *handle, struct oh_event *e, struct ResourceInfo *res_info_ptr, guint switch_index) { SaErrorT err; guint sw_width; struct snmp_value get_value; struct snmp_bc_hnd *custom_handle; if (!handle || !e || !res_info_ptr) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } dbg("Discovering switch module %d resource.\n", switch_index); res_info_ptr->cur_state = SAHPI_HS_STATE_ACTIVE; /* Default to ACTIVE */ if (res_info_ptr->mib.OidPowerState != NULL) { /* Read power state of resource */ err = snmp_bc_oid_snmp_get(custom_handle, &(e->resource.ResourceEntity), 0, res_info_ptr->mib.OidPowerState, &get_value, SAHPI_TRUE); if (!err && (get_value.type == ASN_INTEGER)) { if (get_value.integer == 0) /* state = SAHPI_POWER_OFF */ res_info_ptr->cur_state = SAHPI_HS_STATE_INACTIVE; } } /* Get UUID and convert to GUID */ err = snmp_bc_get_guid(custom_handle, e, res_info_ptr); /* Add resource to temporary event cache */ err = oh_add_resource(handle->rptcache, &(e->resource), res_info_ptr, 0); if (err) { err("Failed to add resource. Error=%s.", oh_lookup_error(err)); return(err); } /* ---------------------------------------- */ /* Construct .rdrs of struct oh_event */ /* ---------------------------------------- */ /* Find resource's events, sensors, controls, etc. */ snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); snmp_bc_discover_sensors(handle, snmp_bc_switch_sensors, e); snmp_bc_discover_controls(handle, snmp_bc_switch_controls, e); snmp_bc_discover_inventories(handle, snmp_bc_switch_inventories, e); sw_width = 1; /* Default to 1-wide */ if (res_info_ptr->mib.OidResourceWidth != NULL) { err = snmp_bc_oid_snmp_get(custom_handle, &(e->resource.ResourceEntity), 0, res_info_ptr->mib.OidResourceWidth, &get_value, SAHPI_TRUE); if (!err && (get_value.type == ASN_INTEGER)) { sw_width = get_value.integer; } } res_info_ptr->resourcewidth = sw_width; err = snmp_bc_set_resource_slot_state_sensor(handle, e, sw_width); return(err); } /** * snmp_bc_add_mm_rptcache: * @handle: Pointer to hpi handle * @e: Pointer to oh_event struct. * @res_info_ptr: Pointer to pointer of res_info_ptr * @mm_index: Index of discovered management module. * * Build rpt and rdrs for a management module then add to rptcache * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_add_mm_rptcache(struct oh_handler_state *handle, struct oh_event *e, struct ResourceInfo *res_info_ptr, guint mm_index) { SaErrorT err; guint mm_width; struct snmp_value get_value, get_active; struct snmp_bc_hnd *custom_handle; if (!handle || !e || !res_info_ptr) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } dbg("Discovering management module %d resource.\n", mm_index); err = snmp_bc_snmp_get(custom_handle, SNMP_BC_MGMNT_ACTIVE, &get_active, SAHPI_TRUE); if (err || get_active.type != ASN_INTEGER) { err("Cannot get OID=%s; Received Type=%d; Error=%s.", SNMP_BC_MGMNT_ACTIVE, get_active.type, oh_lookup_error(err)); if (err) { return(err); } else { return(SA_ERR_HPI_INTERNAL_ERROR); } } /* Set active MM location in handler's custom data */ /* - used to override duplicate MM events in snmp_bc_event.c */ custom_handle->active_mm = get_active.integer; if (custom_handle->active_mm == mm_index+1) res_info_ptr->cur_state = SAHPI_HS_STATE_ACTIVE; else res_info_ptr->cur_state = SAHPI_HS_STATE_INACTIVE; /* Get UUID and convert to GUID */ err = snmp_bc_get_guid(custom_handle, e, res_info_ptr); /* Add resource to resource */ err = oh_add_resource(handle->rptcache, &(e->resource), res_info_ptr, 0); if (err) { err("Failed to add resource. Error=%s.", oh_lookup_error(err)); return(err); } /* Find resource's events, sensors, controls, etc. */ snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); /* ---------------------------------------- */ /* Construct .rdrs of struct oh_event */ /* ---------------------------------------- */ /* See if mmHeathState OID is supported; If it is a readable Operational State sensor is supported; else the Operational State sensor is event only */ { struct snmp_value value; err = snmp_bc_snmp_get(custom_handle, SNMP_BC_MM_HEALTH_OID, &value, SAHPI_TRUE); if (err) { snmp_bc_discover_sensors(handle, snmp_bc_mgmnt_sensors, e); } else { snmp_bc_discover_sensors(handle, snmp_bc_mgmnt_health_sensors, e); } } snmp_bc_discover_controls(handle, snmp_bc_mgmnt_controls, e); snmp_bc_discover_inventories(handle, snmp_bc_mgmnt_inventories, e); mm_width = 1; /* Default to 1-wide */ if (res_info_ptr->mib.OidResourceWidth != NULL) { err = snmp_bc_oid_snmp_get(custom_handle, &(e->resource.ResourceEntity), 0, res_info_ptr->mib.OidResourceWidth, &get_value, SAHPI_TRUE); if (!err && (get_value.type == ASN_INTEGER)) { mm_width = get_value.integer; } } res_info_ptr->resourcewidth = mm_width; err = snmp_bc_set_resource_slot_state_sensor(handle, e, mm_width); return(err); } /** * snmp_bc_discover_blade_i: * @handle: Pointer to hpi handle * @ep_root: Pointer to . * @blade_index: Index of discovered blade. * * Discover a particular blade at index blade_index. * This routine is used to rediscover a blade. * Blade rpt and rdrs will be added to rptcache. * No event will be generated. The event is handled separately in log2event. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_discover_blade_i(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, guint blade_index) { SaErrorT err; struct oh_event *e; struct ResourceInfo *res_info_ptr; if (!handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } e = NULL; res_info_ptr = NULL; e = snmp_bc_alloc_oh_event(); if (e == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* ---------------------------------------- */ /* Construct .resource of struct oh_event */ /* ---------------------------------------- */ err = snmp_bc_construct_blade_rpt(e, &res_info_ptr, ep_root, blade_index); if (err) { snmp_bc_free_oh_event(e); return(err); } /* ---------------------------------------- */ /* Discover rdrs. */ /* Add rpt and rdrs to rptcache. */ /* ---------------------------------------- */ err = snmp_bc_add_blade_rptcache(handle, e, res_info_ptr, blade_index); snmp_bc_free_oh_event(e); /********************************** * Discover Blade Expansion Modules **********************************/ err = snmp_bc_discover_blade_expansion(handle, ep_root, blade_index); return(SA_OK); } /** * snmp_bc_discover_blower_i: * @handle: Pointer to hpi handle * @ep_root: Pointer to . * @blower_index: Index of discovered blower. * * Discover a particular blower at index blower_index. * This routine is used to rediscover a blower. * Blower rpt and rdrs will be added to rptcache. * No event will be generated. The event is handled separately in log2event. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_discover_blower_i(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, guint blower_index) { SaErrorT err; struct oh_event *e; struct ResourceInfo *res_info_ptr; if (!handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } e= NULL; res_info_ptr = NULL; e = snmp_bc_alloc_oh_event(); if (e == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* ---------------------------------------- */ /* Construct .resource of struct oh_event */ /* ---------------------------------------- */ err = snmp_bc_construct_blower_rpt(e, &res_info_ptr, ep_root, blower_index); if (err) { snmp_bc_free_oh_event(e); return(err); } /* ---------------------------------------- */ /* Discover rdrs. */ /* Add rpt and rdrs to rptcache. */ /* ---------------------------------------- */ err = snmp_bc_add_blower_rptcache(handle, e, res_info_ptr, blower_index); snmp_bc_free_oh_event(e); return(SA_OK); } /** * snmp_bc_discover_pm_i: * @handle: Pointer to hpi handle * @ep_root: Pointer to . * @pm_index: Index of discovered power module. * * Discover a particular power module at index pm_index. * This routine is used to rediscover a power module. * Power module rpt and rdrs will be added to rptcache. * No event will be generated. The event is handled separately in log2event. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_discover_pm_i(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, guint pm_index) { SaErrorT err; struct oh_event *e; struct ResourceInfo *res_info_ptr; if (!handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } e = NULL; res_info_ptr = NULL; e = snmp_bc_alloc_oh_event(); if (e == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* ---------------------------------------- */ /* Construct .resource of struct oh_event */ /* ---------------------------------------- */ err = snmp_bc_construct_pm_rpt(e, &res_info_ptr, ep_root, pm_index); if (err) { snmp_bc_free_oh_event(e); return(err); } /* ---------------------------------------- */ /* Discover rdrs. */ /* Add rpt and rdrs to rptcache. */ /* ---------------------------------------- */ err = snmp_bc_add_pm_rptcache(handle, e, res_info_ptr, pm_index); snmp_bc_free_oh_event(e); return(SA_OK); } /** * snmp_bc_discover_switch_i: * @handle: Pointer to hpi handle * @ep_root: Pointer to . * @sm_index: Index of discovered switch module. * * Discover a particular switch module at index sm_index. * This routine is used to rediscover a switch module. * Switch module rpt and rdrs will be added to rptcache. * No event will be generated. The event is handled separately in log2event. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_discover_switch_i(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, guint sm_index) { SaErrorT err; struct oh_event *e; struct ResourceInfo *res_info_ptr; struct snmp_bc_hnd *custom_handle; struct snmp_value get_value; if (!handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } e = NULL; res_info_ptr = NULL; e = snmp_bc_alloc_oh_event(); if (e == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* ---------------------------------------- */ /* Construct .resource of struct oh_event */ /* ---------------------------------------- */ /* Fetch switch interposer-card installed vector */ /* Have to fetch from hardware in case we have yet to rediscover the SMI */ get_installed_mask(SNMP_BC_SMI_INSTALLED, get_value); err = snmp_bc_construct_sm_rpt(e, &res_info_ptr, ep_root, sm_index, get_value.string); if (err) { snmp_bc_free_oh_event(e); return(err); } /* ---------------------------------------- */ /* Discover rdrs. */ /* Add rpt and rdrs to rptcache. */ /* ---------------------------------------- */ err = snmp_bc_add_switch_rptcache(handle, e, res_info_ptr, sm_index); snmp_bc_free_oh_event(e); return(SA_OK); } /** * snmp_bc_discover_mm_i: * @handle: Pointer to hpi handle * @ep_root: Pointer to . * @mm_index: Index of discovered management module. * * Discover a particular management module at index mm_index. * This routine is used to rediscover a management module. * Management module rpt and rdrs will be added to rptcache. * No event will be generated. The event is handled separately in log2event. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_discover_mm_i(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, guint mm_index) { SaErrorT err; struct oh_event *e; struct ResourceInfo *res_info_ptr; struct snmp_bc_hnd *custom_handle; struct snmp_value get_value; if (!handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } e = NULL; res_info_ptr = NULL; e = snmp_bc_alloc_oh_event(); if (e == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* ---------------------------------------- */ /* Construct .resource of struct oh_event */ /* ---------------------------------------- */ /* Fetch mm interposer-card installed vector */ /* Have to fetch from hardware in case we have yet to rediscover the MMI */ get_installed_mask(SNMP_BC_MMI_INSTALLED, get_value); err = snmp_bc_construct_mm_rpt(e, &res_info_ptr, ep_root, mm_index, get_value.string); if (err) { snmp_bc_free_oh_event(e); return(err); } /* ---------------------------------------- */ /* Discover rdrs. */ /* Add rpt and rdrs to rptcache. */ /* ---------------------------------------- */ err = snmp_bc_add_mm_rptcache(handle, e, res_info_ptr, mm_index); snmp_bc_free_oh_event(e); return(SA_OK); } /** * snmp_bc_fetch_MT_install_mask: * @handle: Pointer to hpi handle * @getintvalue: Pointer to a struct snmp_value * * The MM presents MediaTray Installed Mask in three different ways, * depending on the code level. * * Older code: chassisMTInstalled is an integer. * It is either 0 (no media tray) or 1 (one media tray) * * Intermediate Code: chassisMTInstalled is an OCT_STR bitmap of installed mediatray * * Later Code: chassisMTInstalled is an integer. 0 (no media tray), 1(yes media tray) * chassisMTInstalled is qualified by chassisNoOfMTsInstalled, a media tray installed bitmap * * This module is designed to work with any of the Media Tray repesentation above * * Return values: * SA_OK - normal case. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_fetch_MT_install_mask(struct oh_handler_state *handle, struct snmp_value *getintvalue) { SaErrorT err; struct snmp_value get_value, get_value2; struct snmp_bc_hnd *custom_handle; if (!handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } err = SA_OK; getintvalue->type = ASN_INTEGER; err = snmp_bc_snmp_get(custom_handle, SNMP_BC_MT_INSTALLED, &get_value, SAHPI_TRUE); if (err == SA_ERR_HPI_NOT_PRESENT) {getintvalue->type = ASN_INTEGER; getintvalue->integer = 0;} else if (err != SA_OK) { dbg("Cannot get OID=%s; Received Type=%d; Error=%s.", SNMP_BC_MT_INSTALLED, get_value.type, oh_lookup_error(err)); if (err) { return(err); } else { return(SA_ERR_HPI_INTERNAL_ERROR); } } else { if (get_value.type == ASN_OCTET_STR) { getintvalue->integer = atoi(get_value.string); } else if (get_value.type == ASN_INTEGER) { if (get_value.integer == 0) { getintvalue->integer = 0; } else { err = snmp_bc_snmp_get(custom_handle, SNMP_BC_NOS_MT_INSTALLED, &get_value2, SAHPI_TRUE); if (err == SA_ERR_HPI_NOT_PRESENT) { getintvalue->integer = get_value.integer; if (getintvalue->integer == 1) getintvalue->integer = 10; } else if (err != SA_OK) { if (err) { return(err); } else { return(SA_ERR_HPI_INTERNAL_ERROR); } } else { if (get_value2.type == ASN_OCTET_STR) getintvalue->integer = atoi(get_value2.string); else getintvalue->integer = 0; } } } } return(err); } openhpi-3.6.1/plugins/snmp_bc/snmp_bc_power.c0000644000175100017510000001411112575647274020277 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #include /** * snmp_bc_get_power_state: * @hnd: Handler data pointer. * @rid: Resource ID. * @state: Location to store resource's power state. * * Retrieves a resource's power state. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_POWER. * SA_ERR_HPI_INVALID_RESOURCE - Resource doesn't exist. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT snmp_bc_get_power_state(void *hnd, SaHpiResourceIdT rid, SaHpiPowerStateT *state) { SaErrorT err; struct ResourceInfo *resinfo; struct snmp_value get_value; struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; SaHpiRptEntryT *rpt; if (!hnd || !state) { err("Invalid parameter"); return SA_ERR_HPI_INVALID_PARAMS; } err = SA_OK; handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } snmp_bc_lock_handler(custom_handle); /* Check if resource exists and has power capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_POWER)) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_CAPABILITY); } resinfo = (struct ResourceInfo *)oh_get_resource_data(handle->rptcache, rid); if (resinfo == NULL) { err("No resource data. Resource=%s", rpt->ResourceTag.Data); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } if (resinfo->mib.OidPowerState == NULL) { err("No Power OID."); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } /* Read power state of resource */ err = snmp_bc_oid_snmp_get(custom_handle, &(rpt->ResourceEntity), 0, resinfo->mib.OidPowerState, &get_value, SAHPI_TRUE); if (!err && (get_value.type == ASN_INTEGER)) { switch (get_value.integer) { case 0: *state = SAHPI_POWER_OFF; break; case 1: *state = SAHPI_POWER_ON; break; default: err("Invalid power state for OID=%s.", resinfo->mib.OidPowerState); err = SA_ERR_HPI_INTERNAL_ERROR; } } else { err("Cannot read SNMP OID=%s; Type=%d.", resinfo->mib.OidPowerState, get_value.type); } snmp_bc_unlock_handler(custom_handle); return(err); } /** * snmp_bc_set_power_state: * @hnd: Handler data pointer. * @rid: Resource ID. * @state: Resource's power state to set. * * Sets a resource's power state. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_POWER. * SA_ERR_HPI_INVALID_RESOURCE - Resource doesn't exist. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL; @state invalid. **/ SaErrorT snmp_bc_set_power_state(void *hnd, SaHpiResourceIdT rid, SaHpiPowerStateT state) { SaErrorT err; struct ResourceInfo *resinfo; struct snmp_value set_value; struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; SaHpiRptEntryT *rpt; if (!hnd || NULL == oh_lookup_powerstate(state)) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } err = SA_OK; handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } snmp_bc_lock_handler(custom_handle); /* Check if resource exists and has power capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_POWER)) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_CAPABILITY); } resinfo = (struct ResourceInfo *)oh_get_resource_data(handle->rptcache, rid); if (resinfo == NULL) { err("No resource data. Resource=%s", rpt->ResourceTag.Data); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } if (resinfo->mib.OidPowerOnOff == NULL) { err("No Power OnOff OID."); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } /* Set power on/off */ set_value.type = ASN_INTEGER; set_value.str_len = 1; switch (state) { case SAHPI_POWER_OFF: set_value.integer = 0; err = snmp_bc_oid_snmp_set(custom_handle, &(rpt->ResourceEntity), 0, resinfo->mib.OidPowerOnOff, set_value); if (err) { err("Cannot set SNMP OID=%s; Type=%d.", resinfo->mib.OidPowerOnOff, set_value.type); if (err != SA_ERR_HPI_BUSY) err = SA_ERR_HPI_NO_RESPONSE; } break; case SAHPI_POWER_ON: set_value.integer = 1; err = snmp_bc_oid_snmp_set(custom_handle, &(rpt->ResourceEntity), 0, resinfo->mib.OidPowerOnOff, set_value); if (err) { err("Cannot set SNMP OID=%s; Type=%d.", resinfo->mib.OidPowerOnOff, set_value.type); if (err != SA_ERR_HPI_BUSY) err = SA_ERR_HPI_NO_RESPONSE; } break; case SAHPI_POWER_CYCLE: { SaHpiResetActionT act = SAHPI_COLD_RESET; err = snmp_bc_set_reset_state(hnd, rid, act); } break; default: err("Invalid Power Action Type=%d.", state); err = SA_ERR_HPI_INTERNAL_ERROR; } snmp_bc_unlock_handler(custom_handle); return(err); } void * oh_get_power_state (void *, SaHpiResourceIdT, SaHpiPowerStateT *) __attribute__ ((weak, alias("snmp_bc_get_power_state"))); void * oh_set_power_state (void *, SaHpiResourceIdT, SaHpiPowerStateT) __attribute__ ((weak, alias("snmp_bc_set_power_state"))); openhpi-3.6.1/plugins/snmp_bc/snmp_bc_discover.c0000644000175100017510000004556312575647274021000 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Steve Sherman */ #include #include /** * snmp_bc_discover_resources: * @hnd: Handler data pointer. * * Discover all the resources, sensors, controls, etc. for this instance * of the plugin. Found entities are compared with what the HPI * Infra-structure thinks is there and any new, deleted, or changed * entities are updated. * * Return values: * Builds/updates internal RPT cache - normal operation. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory **/ SaErrorT snmp_bc_discover_resources(void *hnd) { char *root_tuple; SaErrorT err, err1; SaHpiEntityPathT ep_root; SaHpiEventLogInfoT elinfo; struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; if (!hnd) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } err = SA_OK; err1 = SA_OK; handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } snmp_bc_lock_handler(custom_handle); /* Find root Entity Path */ root_tuple = (char *)g_hash_table_lookup(handle->config, "entity_root"); if (root_tuple == NULL) { err("Cannot find configuration parameter."); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } err = oh_encode_entitypath(root_tuple, &ep_root); if (err) { err("Cannot convert entity path to string. Error=%s.", oh_lookup_error(err)); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } /* --------------------------------------------------------------- */ /* tmpcache and tmpqueue are no longer used. pdphan 08/16/06 */ /* Allocate space for temporary RPT cache */ /*custom_handle->tmpcache = (RPTable *)g_malloc0(sizeof(RPTable)); */ /*if (custom_handle->tmpcache == NULL) { */ /* err("Out of memory."); */ /* snmp_bc_unlock_handler(custom_handle); */ /* return(SA_ERR_HPI_OUT_OF_MEMORY); */ /*} */ /* */ /* Initialize tmpqueue */ /*custom_handle->tmpqueue = NULL; */ /* --------------------------------------------------------------- */ /* Individual platform discovery */ if (custom_handle->platform == SNMP_BC_PLATFORM_RSA) { err = snmp_bc_discover_rsa(handle, &ep_root); } else { err = snmp_bc_discover(handle, &ep_root); } if (err) { if (err == SA_ERR_HPI_DUPLICATE) { /* Special case: * snmp_bc_discover() has found there is * no changes in any of the BladeCenter * resource masks, so there is nothing to do. * Setting returncode to SA_OK then return. */ err = SA_OK; } else { err("Discovery failed. Error=%s.", oh_lookup_error(err)); } goto CLEANUP; } /* Build cache copy of SEL. RID == 1 (2nd parm) is a dummy id */ /** * This design depends on the BladeCenter management of the Event Log. * That is, * (a) The BC Event Log will always have at least one entry. It *never* has zero entry. * (b) If a Clear Event Log command is received, the BC clears the log, then creates * "Event Log has just been cleared by xxx" entry * So, if the cache copy of the Event Log is empty, this is the first invocation of OpenHPI/snmp_bc. * Otherwise, only processes newer entries for (re) discovery. **/ oh_el_info(handle->elcache, &elinfo); if (elinfo.Entries == 0) err1 = snmp_bc_build_selcache(handle, 1); else err1 = snmp_bc_check_selcache(handle, 1, SAHPI_NEWEST_ENTRY); if (err1) { /* --------------------------------------------------------------- */ /* If an error is encounterred during building of snmp_bc elcache, */ /* only log the error. Do not do any recovery because log entries */ /* are still kept in bc mm. We'll pick them up during synch. */ /* --------------------------------------------------------------- */ dbg("snmp_bc_discover, Error %s when building elcache.\n", oh_lookup_error(err1)); } if (custom_handle->isFirstDiscovery == SAHPI_TRUE) custom_handle->isFirstDiscovery = SAHPI_FALSE; CLEANUP: snmp_bc_unlock_handler(custom_handle); return(err); } /** * snmp_bc_discover_sensors: * @handler: Pointer to handler's data. * @sensor_array: Pointer to resource's static sensor data array. * @parent_res_event: Pointer to resource's event structure. * * Discovers resource's available sensors and their events. * * Return values: * Adds sensor RDRs to internal Infra-structure queues - normal case * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory **/ SaErrorT snmp_bc_discover_sensors(struct oh_handler_state *handle, struct snmp_bc_sensor *sensor_array, struct oh_event *res_oh_event) { int i; SaErrorT err; SaHpiBoolT valid_sensor; SaHpiRdrT *rdrptr; struct snmp_bc_hnd *custom_handle; struct SensorInfo *sensor_info_ptr; custom_handle = (struct snmp_bc_hnd *)handle->data; for (i=0; sensor_array[i].index != 0; i++) { rdrptr = (SaHpiRdrT *)g_malloc0(sizeof(SaHpiRdrT)); if (rdrptr == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } valid_sensor = SAHPI_FALSE; /* Check for event-only sensor */ if (sensor_array[i].sensor.DataFormat.IsSupported == SAHPI_FALSE) { valid_sensor = SAHPI_TRUE; } else { if (sensor_array[i].sensor_info.mib.oid != NULL) { valid_sensor = rdr_exists(custom_handle, &(res_oh_event->resource.ResourceEntity), sensor_array[i].sensor_info.mib.loc_offset, sensor_array[i].sensor_info.mib.oid, sensor_array[i].sensor_info.mib.not_avail_indicator_num, sensor_array[i].sensor_info.mib.write_only); } else { err("Sensor %s cannot be read.", sensor_array[i].comment); g_free(rdrptr); return(SA_ERR_HPI_INTERNAL_ERROR); } } /* Add sensor RDR, if sensor is event-only or can be read */ if (valid_sensor) { rdrptr->RdrType = SAHPI_SENSOR_RDR; rdrptr->Entity = res_oh_event->resource.ResourceEntity; err = snmp_bc_mod_sensor_ep(rdrptr, sensor_array, i); rdrptr->RdrTypeUnion.SensorRec = sensor_array[i].sensor; oh_init_textbuffer(&(rdrptr->IdString)); oh_append_textbuffer(&(rdrptr->IdString), sensor_array[i].comment); dbg("Discovered sensor: %s.", rdrptr->IdString.Data); sensor_info_ptr = g_memdup(&(sensor_array[i].sensor_info), sizeof(struct SensorInfo)); err = oh_add_rdr(handle->rptcache, res_oh_event->resource.ResourceId, rdrptr, sensor_info_ptr, 0); if (err) { err("Cannot add RDR. Error=%s.", oh_lookup_error(err)); g_free(rdrptr); } else { res_oh_event->rdrs = g_slist_append(res_oh_event->rdrs, rdrptr); snmp_bc_discover_sensor_events(handle, &(res_oh_event->resource.ResourceEntity), sensor_array[i].sensor.Num, &(sensor_array[i])); } } else { g_free(rdrptr); } } return(SA_OK); } /** * snmp_bc_discover_controls: * @handler: Pointer to handler's data. * @control_array: Pointer to resource's static control data array. * @res_oh_event: Pointer to resource's event structure. * * Discovers resource's available controls. * * Return values: * Adds control RDRs to internal Infra-structure queues - normal case * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory **/ SaErrorT snmp_bc_discover_controls(struct oh_handler_state *handle, struct snmp_bc_control *control_array, struct oh_event *res_oh_event) { int i; SaErrorT err; SaHpiBoolT valid_control; SaHpiRdrT *rdrptr; struct snmp_bc_hnd *custom_handle; struct ControlInfo *control_info_ptr; custom_handle = (struct snmp_bc_hnd *)handle->data; for (i=0; control_array[i].index != 0; i++) { rdrptr = (SaHpiRdrT *)g_malloc0(sizeof(SaHpiRdrT)); if (rdrptr == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } valid_control = rdr_exists(custom_handle, &(res_oh_event->resource.ResourceEntity), control_array[i].control_info.mib.loc_offset, control_array[i].control_info.mib.oid, control_array[i].control_info.mib.not_avail_indicator_num, control_array[i].control_info.mib.write_only); /* Add control RDR, if control can be read */ if (valid_control) { rdrptr->RdrType = SAHPI_CTRL_RDR; rdrptr->Entity = res_oh_event->resource.ResourceEntity; rdrptr->RdrTypeUnion.CtrlRec = control_array[i].control; oh_init_textbuffer(&(rdrptr->IdString)); oh_append_textbuffer(&(rdrptr->IdString), control_array[i].comment); dbg("Discovered control: %s.", rdrptr->IdString.Data); control_info_ptr = g_memdup(&(control_array[i].control_info), sizeof(struct ControlInfo)); err = oh_add_rdr(handle->rptcache, res_oh_event->resource.ResourceId, rdrptr, control_info_ptr, 0); if (err) { err("Cannot add RDR. Error=%s.", oh_lookup_error(err)); g_free(rdrptr); } else { res_oh_event->rdrs = g_slist_append(res_oh_event->rdrs, rdrptr); } } else { g_free(rdrptr); } } return(SA_OK); } /** * snmp_bc_discover_inventory: * @handler: Pointer to handler's data. * @inventory_array: Pointer to resource's static inventory data array. * @res_oh_event: Pointer to resource's event structure. * * Discovers resource's available inventory data records. * * Return values: * Adds inventory RDRs to internal Infra-structure queues - normal case * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory **/ SaErrorT snmp_bc_discover_inventories(struct oh_handler_state *handle, struct snmp_bc_inventory *inventory_array, struct oh_event *res_oh_event) { int i; SaHpiBoolT valid_idr; SaErrorT err; SaHpiRdrT *rdrptr; struct snmp_bc_hnd *custom_handle; struct InventoryInfo *inventory_info_ptr; custom_handle = (struct snmp_bc_hnd *)handle->data; /* Assumming OidManufacturer is defined and determines readable of other VPD */ for (i=0; inventory_array[i].inventory_info.hardware_mib.oid.OidManufacturer != NULL; i++) { rdrptr = (SaHpiRdrT *)g_malloc0(sizeof(SaHpiRdrT)); if (rdrptr == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } valid_idr = rdr_exists(custom_handle, &(res_oh_event->resource.ResourceEntity), 0, inventory_array[i].inventory_info.hardware_mib.oid.OidManufacturer, 0, 0); /* Add inventory RDR, if inventory can be read */ if (valid_idr) { rdrptr->RdrType = SAHPI_INVENTORY_RDR; rdrptr->Entity = res_oh_event->resource.ResourceEntity; rdrptr->RdrTypeUnion.InventoryRec = inventory_array[i].inventory; oh_init_textbuffer(&(rdrptr->IdString)); oh_append_textbuffer(&(rdrptr->IdString), inventory_array[i].comment); dbg("Discovered inventory: %s.", rdrptr->IdString.Data); inventory_info_ptr = g_memdup(&(inventory_array[i].inventory_info), sizeof(struct InventoryInfo)); err = oh_add_rdr(handle->rptcache, res_oh_event->resource.ResourceId, rdrptr, inventory_info_ptr, 0); if (err) { err("Cannot add RDR. Error=%s.", oh_lookup_error(err)); g_free(rdrptr); } else { res_oh_event->rdrs = g_slist_append(res_oh_event->rdrs, rdrptr); } } else { g_free(rdrptr); } } return(SA_OK); } /** * snmp_bc_create_resourcetag: * @buffer: Location of Resource Tag buffer. * @str: Resource name. * @location: Resource location. * * Creates a user friendly Resource Tag. Takes the comment found in the * Resource's static definition, appends a trailing string (can be NULL) * plus the resource's location. * * Return values: * SaHpiTextBufferT - normal operation. * SA_ERR_HPI_INVALID_PARAMS - @buffer is NULL; or @loc not valid * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. **/ SaErrorT snmp_bc_create_resourcetag(SaHpiTextBufferT *buffer, const char *str, SaHpiEntityLocationT loc) { SaErrorT err; SaHpiTextBufferT working; if (!buffer || loc > (pow(10, OH_MAX_LOCATION_DIGITS) - 1)) { return(SA_ERR_HPI_INVALID_PARAMS); } err = oh_init_textbuffer(&working); if (err) { return(err); } if (str) { err = oh_append_textbuffer(&working, str); } if (err) { return(err); } if (loc) { char *locstr; locstr = (gchar *)g_malloc0(OH_MAX_LOCATION_DIGITS + 1); if (locstr == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } if (loc != SNMP_BC_NOT_VALID) { snprintf(locstr, OH_MAX_LOCATION_DIGITS + 1, " %d", loc); } err = oh_append_textbuffer(&working, locstr); g_free(locstr); if (err) { return(err); } } err = oh_copy_textbuffer(buffer, &working); return(err); } /** * rdr_exists: * @custom_handle: Custom handler data pointer. * @ep: Pointer to Entity Path * @loc_offset: Entity Path location offset * @oidstr: SNMP OID string * @na: Not available integer, if applicable * @write-only: SNMP OID write-only indicator * * Determines if an SNMP OID is available to be read. OID may not exist, or if * it does exist may be write-only or indicate that it's value is non-existant. * * Return values: * SAHPI_TRUE - if OID is valid and readable. * SAHPI_FALSE - if OID's value cannot be read. **/ SaHpiBoolT rdr_exists(struct snmp_bc_hnd *custom_handle, SaHpiEntityPathT *ep, SaHpiEntityLocationT loc_offset, const gchar *oidstr, unsigned int na, SaHpiBoolT write_only) { SaErrorT err; struct snmp_value get_value; if (write_only == SAHPI_TRUE) { return(SAHPI_FALSE); }; /* Can't check it if its non-readable */ err = snmp_bc_oid_snmp_get(custom_handle, ep, loc_offset, oidstr, &get_value, SAHPI_TRUE); if (err || (get_value.type == ASN_INTEGER && na && na == get_value.integer)) { return(SAHPI_FALSE); } return(SAHPI_TRUE); } /** * snmp_bc_validate_ep: * @org_ep: Pointer to entity path contained within SaHpiRdrT structure. * @val_ep: Pointer to returned entity path that has been validated. * * Remove entity path entries that is not a snmp resource in entity path structures (SaHpiEntityPathT). * The validated entity path is returned in val_ep structure. * This is used for CPU sensors. We wish to have CPU in entity path. But snmp_bc does not have CPU as a * resource. * * Returns: * SA_OK - normal operations. * SA_ERR_HPI_INVALID_PARAMS - @org_ep or @val_ep is NULL. **/ SaErrorT snmp_bc_validate_ep(SaHpiEntityPathT *org_ep, SaHpiEntityPathT *val_ep) { int i, j; if (!org_ep || !val_ep) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } i = 0; for (j=0; iEntry[i].EntityType != SAHPI_ENT_PROCESSOR) { val_ep->Entry[j].EntityLocation = org_ep->Entry[i].EntityLocation; val_ep->Entry[j].EntityType = org_ep->Entry[i].EntityType; j++; } if (org_ep->Entry[i].EntityType == SAHPI_ENT_ROOT) break; } return(SA_OK); } /** * snmp_bc_mod_sensor_ep: * @e: Pointer to event structure for this sensor. * @sensor_array: Pointer to resource's static sensor data array. * @index: index in the static sensor data array for the current sensor. * * If the sensor being discoverred is belong to blade CPU, then add CPU tuple * to sensor entity path. Else, do nothing. * * Returns: * SA_OK - normal operations. * SA_ERR_HPI_INVALID_PARAMS - @e or @sensor is NULL. **/ SaErrorT snmp_bc_mod_sensor_ep(SaHpiRdrT *rdrptr, void *sensor_array_in, int index) { int j; gchar *pch; struct snmp_bc_sensor *sensor_array; struct snmp_bc_ipmi_sensor *sensor_array_ipmi; SaHpiEntityPathT ep_add = { .Entry[0] = { .EntityType = SAHPI_ENT_PROCESSOR, .EntityLocation = 0, }, }; sensor_array = (struct snmp_bc_sensor *)sensor_array_in; sensor_array_ipmi = (struct snmp_bc_ipmi_sensor *)sensor_array_in; if (!rdrptr || !sensor_array) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } if (((struct snmp_bc_sensor *)sensor_array_in == (struct snmp_bc_sensor *)snmp_bc_blade_sensors)) { for (j=0; j < 3; j++) { if (sensor_array[index].sensor_info.mib.oid != NULL) { if ((g_ascii_strncasecmp(sensor_array[index].sensor_info.mib.oid, snmp_bc_blade_sensors[j].sensor_info.mib.oid, 34) == 0)) { ep_add.Entry[0].EntityLocation = j + 1; snmp_bc_add_ep(rdrptr, &ep_add); break; } } } } else if ((struct snmp_bc_ipmi_sensor *)sensor_array_in == (struct snmp_bc_ipmi_sensor *)snmp_bc_blade_ipmi_sensors) { if ( (pch = strstr(sensor_array_ipmi[index].ipmi_tag, "CPU")) != NULL) { ep_add.Entry[0].EntityLocation = atoi(&pch[3]); snmp_bc_add_ep(rdrptr,&ep_add); } } else { dbg("This not one of the Blade sensor.\n"); } return(SA_OK); } /** * snmp_bc_add_ep: * @e: Pointer to event structure for this sensor. * @ep_add: Pointer to entity path tuple to be prepended. * * Prepend an entity path tuple to the existing (parent) * entity path in oh_event struct. * * Returns: * SA_OK - normal operations. * SA_ERR_HPI_INVALID_PARAMS - @e or @ep_add is NULL. **/ SaErrorT snmp_bc_add_ep(SaHpiRdrT *rdrptr, SaHpiEntityPathT *ep_add) { int i, j; SaHpiEntityPathT ep_copy; if ( !rdrptr || !ep_add) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } for (i=0; iEntity.Entry[i]; if (ep_copy.Entry[i].EntityType == SAHPI_ENT_ROOT) break; } for (i=0; iEntry[i].EntityType == SAHPI_ENT_ROOT) break; rdrptr->Entity.Entry[i] = ep_add->Entry[i]; } for (j=0; iEntity.Entry[i] = ep_copy.Entry[j]; if (ep_copy.Entry[j].EntityType == SAHPI_ENT_ROOT) break; } return(SA_OK); } /** * Aliasing **/ void * oh_discover_resources (void *) __attribute__ ((weak, alias("snmp_bc_discover_resources"))); openhpi-3.6.1/plugins/snmp_bc/snmp_bc.h0000644000175100017510000001022512575647274017072 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Steve Sherman */ #ifndef __SNMP_BC_H #define __SNMP_BC_H #define SNMP_BC_MAX_SNMP_RETRY_ATTEMPTED 3 #define SNMP_BC_MAX_RESOURCES_MASK 16 /* 15-char long plus NULL terminated */ #include #include typedef struct { GStaticRecMutex lock; guint32 count; } ohpi_bc_lock; /* This handle is unique per instance of this plugin. * SNMP session data is stored in the handle along with config file data. */ struct snmp_bc_hnd { void *sessp; /* Opaque pointer, not a pointer to struct snmp_session */ struct snmp_session session; struct snmp_session *ss; /* SNMP Session pointer */ guint count_per_getbulk; /* For performance, GETBULK is used with snmpV3. */ /* This value indicates max OIDs per GETBULK request */ GSList *eventq; /* Event queue cache */ GHashTable *event2hpi_hash_ptr; /* Global "Event Number to HPI Event" hash table */ guint platform; guint active_mm; /* Used for duplicate event RID override */ char *host; char *host_alternate; SaHpiBoolT isFirstDiscovery; gchar handler_timezone[10]; guint handler_retries; /* Number of retries attempted on SNMP target (agent) */ ohpi_bc_lock snmp_bc_hlock; guint max_pb_supported; /* pb - processor blade */ guint max_blower_supported; /* blower - fan/blower */ guint max_pm_supported; /* pm - power module */ guint max_sm_supported; /* sm - i/o module */ guint max_mm_supported; /* mm - management module */ guint max_mt_supported; /* mt - media tray */ guint max_filter_supported; /* filter - front bezel */ guint max_tap_supported; /* tap - telco alarm panel */ guint max_nc_supported; /* nc - network clock */ guint max_mx_supported; /* mx - multiplex card */ guint max_mmi_supported; /* mmi - mm interposer */ guint max_smi_supported; /* smi - switch interposer */ gchar installed_pb_mask[SNMP_BC_MAX_RESOURCES_MASK]; gchar installed_blower_mask[SNMP_BC_MAX_RESOURCES_MASK]; gchar installed_pm_mask[SNMP_BC_MAX_RESOURCES_MASK]; gchar installed_sm_mask[SNMP_BC_MAX_RESOURCES_MASK]; gchar installed_mm_mask[SNMP_BC_MAX_RESOURCES_MASK]; gchar installed_tap_mask[SNMP_BC_MAX_RESOURCES_MASK]; gchar installed_nc_mask[SNMP_BC_MAX_RESOURCES_MASK]; gchar installed_mx_mask[SNMP_BC_MAX_RESOURCES_MASK]; gchar installed_mmi_mask[SNMP_BC_MAX_RESOURCES_MASK]; gchar installed_smi_mask[SNMP_BC_MAX_RESOURCES_MASK]; gulong installed_mt_mask; gulong installed_filter_mask; }; SaErrorT snmp_bc_snmp_get(struct snmp_bc_hnd *custom_handle, const char *objid, struct snmp_value *value, SaHpiBoolT retry); SaErrorT snmp_bc_oid_snmp_get(struct snmp_bc_hnd *custom_handle, SaHpiEntityPathT *ep, SaHpiEntityLocationT loc_offset, const gchar *oidstr, struct snmp_value *value, SaHpiBoolT retry); SaErrorT snmp_bc_snmp_set(struct snmp_bc_hnd *custom_handle, char *objid, struct snmp_value value); SaErrorT snmp_bc_oid_snmp_set(struct snmp_bc_hnd *custom_handle, SaHpiEntityPathT *ep, SaHpiEntityLocationT loc_offset, const gchar *oidstr, struct snmp_value value); SaErrorT snmp_bc_get_event(void *hnd); SaErrorT snmp_bc_set_resource_tag(void *hnd, SaHpiResourceIdT rid, SaHpiTextBufferT *tag); SaErrorT snmp_bc_set_resource_severity(void *hnd, SaHpiResourceIdT rid, SaHpiSeverityT sev); SaErrorT snmp_bc_control_parm(void *hnd, SaHpiResourceIdT rid, SaHpiParmActionT act); #endif openhpi-3.6.1/plugins/snmp_bc/snmp_bc_utils.h0000644000175100017510000000236512575647274020320 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003, 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia */ #ifndef __SNMP_BC_UTILS_H #define __SNMP_BC_UTILS_H #define UUID_SUBSTRINGS_CNT1 8 #define UUID_SUBSTRINGS_CNT2 5 SaErrorT snmp_bc_get_guid(struct snmp_bc_hnd *custom_handle, struct oh_event *e, struct ResourceInfo *res_info_ptr); SaErrorT snmp_bc_extract_slot_ep(SaHpiEntityPathT *resource_ep, SaHpiEntityPathT *slot_ep); SaErrorT snmp_bc_extend_ep(struct oh_event *e, guint resource_index, gchar *interposer_intalled_mask); struct oh_event *snmp_bc_alloc_oh_event(void); void snmp_bc_free_oh_event(struct oh_event *e); SaErrorT snmp_bc_set_resource_add_oh_event(struct oh_event *e, struct ResourceInfo *res_info_ptr); SaErrorT snmp_bc_copy_oh_event(struct oh_event *new_event, struct oh_event *old_event); #endif openhpi-3.6.1/plugins/snmp_bc/snmp_bc_lock.h0000644000175100017510000000771512575647274020114 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Sean Dague */ #ifndef __SNMP_BC_LOCK_H #define __SNMP_BC_LOCK_H #include #include /* * Define our own lock type, this allows for debuging * */ /* FIXME: turn all this off if there isn't thread safe enabled */ #if 0 typedef struct { GStaticRecMutex lock; guint32 count; } ohpi_bc_lock; #endif #define dbg_snmp_lock(format, ...) \ do { \ if (getenv("OPENHPI_DEBUG_BCLOCK") && !strcmp("YES",getenv("OPENHPI_DEBUG_BCLOCK"))) { \ fprintf(stderr, " BC_LOCK Thread: %p - %s:%d:%s: ", g_thread_self(), __FILE__, __LINE__, __func__); \ fprintf(stderr, format "\n", ## __VA_ARGS__); \ } \ } while(0) #define snmp_bc_lock(bclock) \ do { \ if (!g_static_rec_mutex_trylock(&bclock.lock)) { \ dbg_snmp_lock("Going to block for a lock now. Lockcount %d\n", \ bclock.count); \ g_static_rec_mutex_lock(&bclock.lock); \ bclock.count++; \ dbg_snmp_lock("Got the lock after blocking, Lockcount %d\n", bclock.count); \ } else { \ bclock.count++; \ dbg_snmp_lock("Got the lock because no one had it. Lockcount %d\n", \ bclock.count); \ } \ } while(0) #define snmp_bc_unlock(bclock) \ do { \ bclock.count--; \ g_static_rec_mutex_unlock(&bclock.lock); \ dbg_snmp_lock("Released the lock, lockcount %d\n", bclock.count); \ } while(0) #define snmp_bc_lock_handler(custom_handle) \ do { \ dbg_snmp_lock("Attempt to lock custom_handle %p, lock count %d \n", \ custom_handle, (custom_handle->snmp_bc_hlock.count)); \ snmp_bc_lock( custom_handle->snmp_bc_hlock ); \ dbg_snmp_lock("custom_handle %p got lock, lock count %d \n", \ custom_handle, (custom_handle->snmp_bc_hlock.count)); \ } while(0) #define snmp_bc_unlock_handler(custom_handle) \ do { \ dbg_snmp_lock("Attempt to unlock custom_handle %p, lock count %d \n", \ custom_handle, (custom_handle->snmp_bc_hlock.count)); \ snmp_bc_unlock( custom_handle->snmp_bc_hlock ); \ dbg_snmp_lock("custom_handle %p released lock, lock count %d \n", \ custom_handle, (custom_handle->snmp_bc_hlock.count)); \ } while(0) #endif openhpi-3.6.1/plugins/snmp_bc/snmp_bc_watchdog.c0000644000175100017510000000313712575647274020751 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #include SaErrorT snmp_bc_get_watchdog_info(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num, SaHpiWatchdogT *wdt) { /* Watchdog not supported */ return SA_ERR_HPI_NOT_PRESENT; } SaErrorT snmp_bc_set_watchdog_info(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num, SaHpiWatchdogT *wdt) { /* Watchdog not supported */ return SA_ERR_HPI_NOT_PRESENT; } SaErrorT snmp_bc_reset_watchdog(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num) { /* Watchdog not supported */ return SA_ERR_HPI_NOT_PRESENT; } void * oh_get_watchdog_info (void *, SaHpiResourceIdT, SaHpiWatchdogNumT, SaHpiWatchdogT *) __attribute__ ((weak, alias("snmp_bc_get_watchdog_info"))); void * oh_set_watchdog_info (void *, SaHpiResourceIdT, SaHpiWatchdogNumT, SaHpiWatchdogT *) __attribute__ ((weak, alias("snmp_bc_set_watchdog_info"))); void * oh_reset_watchdog (void *, SaHpiResourceIdT, SaHpiWatchdogNumT) __attribute__ ((weak, alias("snmp_bc_reset_watchdog"))); openhpi-3.6.1/plugins/snmp_bc/snmp_bc_watchdog.h0000644000175100017510000000161412575647274020754 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #ifndef __SNMP_BC_WATCHDOG_H #define __SNMP_BC_WATCHDOG_H SaErrorT snmp_bc_get_watchdog_info(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num, SaHpiWatchdogT *wdt); SaErrorT snmp_bc_set_watchdog_info(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num, SaHpiWatchdogT *wdt); SaErrorT snmp_bc_reset_watchdog(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num); #endif openhpi-3.6.1/plugins/slave/0000755000175100017510000000000012605014551014745 5ustar mohanmohanopenhpi-3.6.1/plugins/slave/baselib.cpp0000644000175100017510000004773412575647277017120 0ustar mohanmohan/* -*- linux-c++ -*- * *(C) Copyright Pigeon Point Systems. 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #include #include #include #include #include "baselib.h" namespace Slave { /************************************************************** * class cBaseLib *************************************************************/ cBaseLib::cBaseLib() : m_handle( 0 ) { memset( &m_abi, 0, sizeof(m_abi) ); } cBaseLib::~cBaseLib() { if ( m_handle ) { m_abi.saHpiFinalize(); g_module_close( m_handle ); } } void GetF( GModule * handle, const char * name, gpointer * pf, size_t& nerrors ) { gboolean rc = g_module_symbol( handle, name, pf ); if ( rc == FALSE ) { *pf = 0; CRIT( "Problem with symbol %s in base library.", name ); CRIT( "%s", g_module_error() ); ++nerrors; } } bool cBaseLib::LoadBaseLib() { if ( g_module_supported() == FALSE ) { CRIT( "GModule is not supported. Cannot load base library." ); return false; } m_handle = g_module_open( "libopenhpi", G_MODULE_BIND_LOCAL ); if ( !m_handle ) { CRIT( "Cannot load base library." ); return false; } size_t nerrors = 0; GetF( m_handle, "saHpiVersionGet", reinterpret_cast( &m_abi.saHpiVersionGet ), nerrors ); GetF( m_handle, "saHpiInitialize", reinterpret_cast( &m_abi.saHpiInitialize ), nerrors ); GetF( m_handle, "saHpiFinalize", reinterpret_cast( &m_abi.saHpiFinalize ), nerrors ); GetF( m_handle, "saHpiSessionOpen", reinterpret_cast( &m_abi.saHpiSessionOpen ), nerrors ); GetF( m_handle, "saHpiSessionClose", reinterpret_cast( &m_abi.saHpiSessionClose ), nerrors ); GetF( m_handle, "saHpiDiscover", reinterpret_cast( &m_abi.saHpiDiscover ), nerrors ); GetF( m_handle, "saHpiDomainInfoGet", reinterpret_cast( &m_abi.saHpiDomainInfoGet ), nerrors ); GetF( m_handle, "saHpiDrtEntryGet", reinterpret_cast( &m_abi.saHpiDrtEntryGet ), nerrors ); GetF( m_handle, "saHpiDomainTagSet", reinterpret_cast( &m_abi.saHpiDomainTagSet ), nerrors ); GetF( m_handle, "saHpiRptEntryGet", reinterpret_cast( &m_abi.saHpiRptEntryGet ), nerrors ); GetF( m_handle, "saHpiRptEntryGetByResourceId", reinterpret_cast( &m_abi.saHpiRptEntryGetByResourceId ), nerrors ); GetF( m_handle, "saHpiResourceSeveritySet", reinterpret_cast( &m_abi.saHpiResourceSeveritySet ), nerrors ); GetF( m_handle, "saHpiResourceTagSet", reinterpret_cast( &m_abi.saHpiResourceTagSet ), nerrors ); GetF( m_handle, "saHpiMyEntityPathGet", reinterpret_cast( &m_abi.saHpiMyEntityPathGet ), nerrors ); GetF( m_handle, "saHpiResourceIdGet", reinterpret_cast( &m_abi.saHpiResourceIdGet ), nerrors ); GetF( m_handle, "saHpiGetIdByEntityPath", reinterpret_cast( &m_abi.saHpiGetIdByEntityPath ), nerrors ); GetF( m_handle, "saHpiGetChildEntityPath", reinterpret_cast( &m_abi.saHpiGetChildEntityPath ), nerrors ); GetF( m_handle, "saHpiResourceFailedRemove", reinterpret_cast( &m_abi.saHpiResourceFailedRemove ), nerrors ); GetF( m_handle, "saHpiEventLogInfoGet", reinterpret_cast( &m_abi.saHpiEventLogInfoGet ), nerrors ); GetF( m_handle, "saHpiEventLogCapabilitiesGet", reinterpret_cast( &m_abi.saHpiEventLogCapabilitiesGet ), nerrors ); GetF( m_handle, "saHpiEventLogEntryGet", reinterpret_cast( &m_abi.saHpiEventLogEntryGet ), nerrors ); GetF( m_handle, "saHpiEventLogEntryAdd", reinterpret_cast( &m_abi.saHpiEventLogEntryAdd ), nerrors ); GetF( m_handle, "saHpiEventLogClear", reinterpret_cast( &m_abi.saHpiEventLogClear ), nerrors ); GetF( m_handle, "saHpiEventLogTimeGet", reinterpret_cast( &m_abi.saHpiEventLogTimeGet ), nerrors ); GetF( m_handle, "saHpiEventLogTimeSet", reinterpret_cast( &m_abi.saHpiEventLogTimeSet ), nerrors ); GetF( m_handle, "saHpiEventLogStateGet", reinterpret_cast( &m_abi.saHpiEventLogStateGet ), nerrors ); GetF( m_handle, "saHpiEventLogStateSet", reinterpret_cast( &m_abi.saHpiEventLogStateSet ), nerrors ); GetF( m_handle, "saHpiEventLogOverflowReset", reinterpret_cast( &m_abi.saHpiEventLogOverflowReset ), nerrors ); GetF( m_handle, "saHpiSubscribe", reinterpret_cast( &m_abi.saHpiSubscribe ), nerrors ); GetF( m_handle, "saHpiUnsubscribe", reinterpret_cast( &m_abi.saHpiUnsubscribe ), nerrors ); GetF( m_handle, "saHpiEventGet", reinterpret_cast( &m_abi.saHpiEventGet ), nerrors ); GetF( m_handle, "saHpiEventAdd", reinterpret_cast( &m_abi.saHpiEventAdd ), nerrors ); GetF( m_handle, "saHpiAlarmGetNext", reinterpret_cast( &m_abi.saHpiAlarmGetNext ), nerrors ); GetF( m_handle, "saHpiAlarmGet", reinterpret_cast( &m_abi.saHpiAlarmGet ), nerrors ); GetF( m_handle, "saHpiAlarmAcknowledge", reinterpret_cast( &m_abi.saHpiAlarmAcknowledge ), nerrors ); GetF( m_handle, "saHpiAlarmAdd", reinterpret_cast( &m_abi.saHpiAlarmAdd ), nerrors ); GetF( m_handle, "saHpiAlarmDelete", reinterpret_cast( &m_abi.saHpiAlarmDelete ), nerrors ); GetF( m_handle, "saHpiRdrGet", reinterpret_cast( &m_abi.saHpiRdrGet ), nerrors ); GetF( m_handle, "saHpiRdrGetByInstrumentId", reinterpret_cast( &m_abi.saHpiRdrGetByInstrumentId ), nerrors ); GetF( m_handle, "saHpiRdrUpdateCountGet", reinterpret_cast( &m_abi.saHpiRdrUpdateCountGet ), nerrors ); GetF( m_handle, "saHpiSensorReadingGet", reinterpret_cast( &m_abi.saHpiSensorReadingGet ), nerrors ); GetF( m_handle, "saHpiSensorThresholdsGet", reinterpret_cast( &m_abi.saHpiSensorThresholdsGet ), nerrors ); GetF( m_handle, "saHpiSensorThresholdsSet", reinterpret_cast( &m_abi.saHpiSensorThresholdsSet ), nerrors ); GetF( m_handle, "saHpiSensorTypeGet", reinterpret_cast( &m_abi.saHpiSensorTypeGet ), nerrors ); GetF( m_handle, "saHpiSensorEnableGet", reinterpret_cast( &m_abi.saHpiSensorEnableGet ), nerrors ); GetF( m_handle, "saHpiSensorEnableSet", reinterpret_cast( &m_abi.saHpiSensorEnableSet ), nerrors ); GetF( m_handle, "saHpiSensorEventEnableGet", reinterpret_cast( &m_abi.saHpiSensorEventEnableGet ), nerrors ); GetF( m_handle, "saHpiSensorEventEnableSet", reinterpret_cast( &m_abi.saHpiSensorEventEnableSet ), nerrors ); GetF( m_handle, "saHpiSensorEventMasksGet", reinterpret_cast( &m_abi.saHpiSensorEventMasksGet ), nerrors ); GetF( m_handle, "saHpiSensorEventMasksSet", reinterpret_cast( &m_abi.saHpiSensorEventMasksSet ), nerrors ); GetF( m_handle, "saHpiControlTypeGet", reinterpret_cast( &m_abi.saHpiControlTypeGet ), nerrors ); GetF( m_handle, "saHpiControlGet", reinterpret_cast( &m_abi.saHpiControlGet ), nerrors ); GetF( m_handle, "saHpiControlSet", reinterpret_cast( &m_abi.saHpiControlSet ), nerrors ); GetF( m_handle, "saHpiIdrInfoGet", reinterpret_cast( &m_abi.saHpiIdrInfoGet ), nerrors ); GetF( m_handle, "saHpiIdrAreaHeaderGet", reinterpret_cast( &m_abi.saHpiIdrAreaHeaderGet ), nerrors ); GetF( m_handle, "saHpiIdrAreaAdd", reinterpret_cast( &m_abi.saHpiIdrAreaAdd ), nerrors ); GetF( m_handle, "saHpiIdrAreaAddById", reinterpret_cast( &m_abi.saHpiIdrAreaAddById ), nerrors ); GetF( m_handle, "saHpiIdrAreaDelete", reinterpret_cast( &m_abi.saHpiIdrAreaDelete ), nerrors ); GetF( m_handle, "saHpiIdrFieldGet", reinterpret_cast( &m_abi.saHpiIdrFieldGet ), nerrors ); GetF( m_handle, "saHpiIdrFieldAdd", reinterpret_cast( &m_abi.saHpiIdrFieldAdd ), nerrors ); GetF( m_handle, "saHpiIdrFieldAddById", reinterpret_cast( &m_abi.saHpiIdrFieldAddById ), nerrors ); GetF( m_handle, "saHpiIdrFieldSet", reinterpret_cast( &m_abi.saHpiIdrFieldSet ), nerrors ); GetF( m_handle, "saHpiIdrFieldDelete", reinterpret_cast( &m_abi.saHpiIdrFieldDelete ), nerrors ); GetF( m_handle, "saHpiWatchdogTimerGet", reinterpret_cast( &m_abi.saHpiWatchdogTimerGet ), nerrors ); GetF( m_handle, "saHpiWatchdogTimerSet", reinterpret_cast( &m_abi.saHpiWatchdogTimerSet ), nerrors ); GetF( m_handle, "saHpiWatchdogTimerReset", reinterpret_cast( &m_abi.saHpiWatchdogTimerReset ), nerrors ); GetF( m_handle, "saHpiAnnunciatorGetNext", reinterpret_cast( &m_abi.saHpiAnnunciatorGetNext ), nerrors ); GetF( m_handle, "saHpiAnnunciatorGet", reinterpret_cast( &m_abi.saHpiAnnunciatorGet ), nerrors ); GetF( m_handle, "saHpiAnnunciatorAcknowledge", reinterpret_cast( &m_abi.saHpiAnnunciatorAcknowledge ), nerrors ); GetF( m_handle, "saHpiAnnunciatorAdd", reinterpret_cast( &m_abi.saHpiAnnunciatorAdd ), nerrors ); GetF( m_handle, "saHpiAnnunciatorDelete", reinterpret_cast( &m_abi.saHpiAnnunciatorDelete ), nerrors ); GetF( m_handle, "saHpiAnnunciatorModeGet", reinterpret_cast( &m_abi.saHpiAnnunciatorModeGet ), nerrors ); GetF( m_handle, "saHpiAnnunciatorModeSet", reinterpret_cast( &m_abi.saHpiAnnunciatorModeSet ), nerrors ); GetF( m_handle, "saHpiDimiInfoGet", reinterpret_cast( &m_abi.saHpiDimiInfoGet ), nerrors ); GetF( m_handle, "saHpiDimiTestInfoGet", reinterpret_cast( &m_abi.saHpiDimiTestInfoGet ), nerrors ); GetF( m_handle, "saHpiDimiTestReadinessGet", reinterpret_cast( &m_abi.saHpiDimiTestReadinessGet ), nerrors ); GetF( m_handle, "saHpiDimiTestStart", reinterpret_cast( &m_abi.saHpiDimiTestStart ), nerrors ); GetF( m_handle, "saHpiDimiTestCancel", reinterpret_cast( &m_abi.saHpiDimiTestCancel ), nerrors ); GetF( m_handle, "saHpiDimiTestStatusGet", reinterpret_cast( &m_abi.saHpiDimiTestStatusGet ), nerrors ); GetF( m_handle, "saHpiDimiTestResultsGet", reinterpret_cast( &m_abi.saHpiDimiTestResultsGet ), nerrors ); GetF( m_handle, "saHpiFumiSpecInfoGet", reinterpret_cast( &m_abi.saHpiFumiSpecInfoGet ), nerrors ); GetF( m_handle, "saHpiFumiServiceImpactGet", reinterpret_cast( &m_abi.saHpiFumiServiceImpactGet ), nerrors ); GetF( m_handle, "saHpiFumiSourceSet", reinterpret_cast( &m_abi.saHpiFumiSourceSet ), nerrors ); GetF( m_handle, "saHpiFumiSourceInfoValidateStart", reinterpret_cast( &m_abi.saHpiFumiSourceInfoValidateStart ), nerrors ); GetF( m_handle, "saHpiFumiSourceInfoGet", reinterpret_cast( &m_abi.saHpiFumiSourceInfoGet ), nerrors ); GetF( m_handle, "saHpiFumiSourceComponentInfoGet", reinterpret_cast( &m_abi.saHpiFumiSourceComponentInfoGet ), nerrors ); GetF( m_handle, "saHpiFumiTargetInfoGet", reinterpret_cast( &m_abi.saHpiFumiTargetInfoGet ), nerrors ); GetF( m_handle, "saHpiFumiTargetComponentInfoGet", reinterpret_cast( &m_abi.saHpiFumiTargetComponentInfoGet ), nerrors ); GetF( m_handle, "saHpiFumiLogicalTargetInfoGet", reinterpret_cast( &m_abi.saHpiFumiLogicalTargetInfoGet ), nerrors ); GetF( m_handle, "saHpiFumiLogicalTargetComponentInfoGet", reinterpret_cast( &m_abi.saHpiFumiLogicalTargetComponentInfoGet ), nerrors ); GetF( m_handle, "saHpiFumiBackupStart", reinterpret_cast( &m_abi.saHpiFumiBackupStart ), nerrors ); GetF( m_handle, "saHpiFumiBankBootOrderSet", reinterpret_cast( &m_abi.saHpiFumiBankBootOrderSet ), nerrors ); GetF( m_handle, "saHpiFumiBankCopyStart", reinterpret_cast( &m_abi.saHpiFumiBankCopyStart ), nerrors ); GetF( m_handle, "saHpiFumiInstallStart", reinterpret_cast( &m_abi.saHpiFumiInstallStart ), nerrors ); GetF( m_handle, "saHpiFumiUpgradeStatusGet", reinterpret_cast( &m_abi.saHpiFumiUpgradeStatusGet ), nerrors ); GetF( m_handle, "saHpiFumiTargetVerifyStart", reinterpret_cast( &m_abi.saHpiFumiTargetVerifyStart ), nerrors ); GetF( m_handle, "saHpiFumiTargetVerifyMainStart", reinterpret_cast( &m_abi.saHpiFumiTargetVerifyMainStart ), nerrors ); GetF( m_handle, "saHpiFumiUpgradeCancel", reinterpret_cast( &m_abi.saHpiFumiUpgradeCancel ), nerrors ); GetF( m_handle, "saHpiFumiAutoRollbackDisableGet", reinterpret_cast( &m_abi.saHpiFumiAutoRollbackDisableGet ), nerrors ); GetF( m_handle, "saHpiFumiAutoRollbackDisableSet", reinterpret_cast( &m_abi.saHpiFumiAutoRollbackDisableSet ), nerrors ); GetF( m_handle, "saHpiFumiRollbackStart", reinterpret_cast( &m_abi.saHpiFumiRollbackStart ), nerrors ); GetF( m_handle, "saHpiFumiActivate", reinterpret_cast( &m_abi.saHpiFumiActivate ), nerrors ); GetF( m_handle, "saHpiFumiActivateStart", reinterpret_cast( &m_abi.saHpiFumiActivateStart ), nerrors ); GetF( m_handle, "saHpiFumiCleanup", reinterpret_cast( &m_abi.saHpiFumiCleanup ), nerrors ); GetF( m_handle, "saHpiHotSwapPolicyCancel", reinterpret_cast( &m_abi.saHpiHotSwapPolicyCancel ), nerrors ); GetF( m_handle, "saHpiResourceActiveSet", reinterpret_cast( &m_abi.saHpiResourceActiveSet ), nerrors ); GetF( m_handle, "saHpiResourceInactiveSet", reinterpret_cast( &m_abi.saHpiResourceInactiveSet ), nerrors ); GetF( m_handle, "saHpiAutoInsertTimeoutGet", reinterpret_cast( &m_abi.saHpiAutoInsertTimeoutGet ), nerrors ); GetF( m_handle, "saHpiAutoInsertTimeoutSet", reinterpret_cast( &m_abi.saHpiAutoInsertTimeoutSet ), nerrors ); GetF( m_handle, "saHpiAutoExtractTimeoutGet", reinterpret_cast( &m_abi.saHpiAutoExtractTimeoutGet ), nerrors ); GetF( m_handle, "saHpiAutoExtractTimeoutSet", reinterpret_cast( &m_abi.saHpiAutoExtractTimeoutSet ), nerrors ); GetF( m_handle, "saHpiHotSwapStateGet", reinterpret_cast( &m_abi.saHpiHotSwapStateGet ), nerrors ); GetF( m_handle, "saHpiHotSwapActionRequest", reinterpret_cast( &m_abi.saHpiHotSwapActionRequest ), nerrors ); GetF( m_handle, "saHpiHotSwapIndicatorStateGet", reinterpret_cast( &m_abi.saHpiHotSwapIndicatorStateGet ), nerrors ); GetF( m_handle, "saHpiHotSwapIndicatorStateSet", reinterpret_cast( &m_abi.saHpiHotSwapIndicatorStateSet ), nerrors ); GetF( m_handle, "saHpiParmControl", reinterpret_cast( &m_abi.saHpiParmControl ), nerrors ); GetF( m_handle, "saHpiResourceLoadIdGet", reinterpret_cast( &m_abi.saHpiResourceLoadIdGet ), nerrors ); GetF( m_handle, "saHpiResourceLoadIdSet", reinterpret_cast( &m_abi.saHpiResourceLoadIdSet ), nerrors ); GetF( m_handle, "saHpiResourceResetStateGet", reinterpret_cast( &m_abi.saHpiResourceResetStateGet ), nerrors ); GetF( m_handle, "saHpiResourceResetStateSet", reinterpret_cast( &m_abi.saHpiResourceResetStateSet ), nerrors ); GetF( m_handle, "saHpiResourcePowerStateGet", reinterpret_cast( &m_abi.saHpiResourcePowerStateGet ), nerrors ); GetF( m_handle, "saHpiResourcePowerStateSet", reinterpret_cast( &m_abi.saHpiResourcePowerStateSet ), nerrors ); GetF( m_handle, "oHpiDomainAdd", reinterpret_cast( &m_abi.oHpiDomainAdd ), nerrors ); GetF( m_handle, "oHpiDomainAdd", reinterpret_cast( &m_abi.oHpiDomainAdd ), nerrors ); if ( nerrors != 0 ) { g_module_close( m_handle ); m_handle = 0; return false; } SaErrorT rv = m_abi.saHpiInitialize( SAHPI_INTERFACE_VERSION, 0, 0, 0, 0 ); if ( rv != SA_OK ) { g_module_close( m_handle ); m_handle = 0; CRIT( "saHpiInitialize failed with rv = %d", rv ); return false; } return true; } }; // namespace Slave openhpi-3.6.1/plugins/slave/baselib.h0000644000175100017510000011655612575647277016564 0ustar mohanmohan/* -*- linux-c++ -*- * *(C) Copyright Pigeon Point Systems. 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #ifndef __BASELIB_H__ #define __BASELIB_H__ #include #include #include /************************************************************** * Pointers to Base Lib API functions (SAI-HPI-B.03.02) *************************************************************/ typedef SaHpiVersionT SAHPI_API (*saHpiVersionGetPtr)( void ); typedef SaErrorT SAHPI_API (*saHpiInitializePtr) ( SAHPI_IN SaHpiVersionT RequestedVersion, SAHPI_IN SaHpiUint32T NumOptions, SAHPI_INOUT SaHpiInitOptionT *Options, SAHPI_OUTNN SaHpiUint32T *FailedOption, SAHPI_OUTNN SaErrorT *OptionError ); typedef SaErrorT SAHPI_API (*saHpiFinalizePtr)( void ); typedef SaErrorT SAHPI_API (*saHpiSessionOpenPtr)( SAHPI_IN SaHpiDomainIdT DomainId, SAHPI_OUT SaHpiSessionIdT *SessionId, SAHPI_IN void *SecurityParams ); typedef SaErrorT SAHPI_API (*saHpiSessionClosePtr)( SAHPI_IN SaHpiSessionIdT SessionId ); typedef SaErrorT SAHPI_API (*saHpiDiscoverPtr)( SAHPI_IN SaHpiSessionIdT SessionId ); typedef SaErrorT SAHPI_API (*saHpiDomainInfoGetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_OUT SaHpiDomainInfoT *DomainInfo ); typedef SaErrorT SAHPI_API (*saHpiDrtEntryGetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiEntryIdT EntryId, SAHPI_OUT SaHpiEntryIdT *NextEntryId, SAHPI_OUT SaHpiDrtEntryT *DrtEntry ); typedef SaErrorT SAHPI_API (*saHpiDomainTagSetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiTextBufferT *DomainTag ); typedef SaErrorT SAHPI_API (*saHpiRptEntryGetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiEntryIdT EntryId, SAHPI_OUT SaHpiEntryIdT *NextEntryId, SAHPI_OUT SaHpiRptEntryT *RptEntry ); typedef SaErrorT SAHPI_API (*saHpiRptEntryGetByResourceIdPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiRptEntryT *RptEntry ); typedef SaErrorT SAHPI_API (*saHpiResourceSeveritySetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSeverityT Severity ); typedef SaErrorT SAHPI_API (*saHpiResourceTagSetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiTextBufferT *ResourceTag ); typedef SaErrorT SAHPI_API (*saHpiMyEntityPathGetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_OUT SaHpiEntityPathT *EntityPath ); typedef SaErrorT SAHPI_API (*saHpiResourceIdGetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_OUT SaHpiResourceIdT *ResourceId ); typedef SaErrorT SAHPI_API (*saHpiGetIdByEntityPathPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiEntityPathT EntityPath, SAHPI_IN SaHpiRdrTypeT InstrumentType, SAHPI_INOUT SaHpiUint32T *InstanceId, SAHPI_OUT SaHpiResourceIdT *ResourceId, SAHPI_OUT SaHpiInstrumentIdT *InstrumentId, SAHPI_OUT SaHpiUint32T *RptUpdateCount ); typedef SaErrorT SAHPI_API (*saHpiGetChildEntityPathPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiEntityPathT ParentEntityPath, SAHPI_INOUT SaHpiUint32T *InstanceId, SAHPI_OUT SaHpiEntityPathT *ChildEntityPath, SAHPI_OUT SaHpiUint32T *RptUpdateCount ); typedef SaErrorT SAHPI_API (*saHpiResourceFailedRemovePtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId ); typedef SaErrorT SAHPI_API (*saHpiEventLogInfoGetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiEventLogInfoT *Info ); typedef SaErrorT SAHPI_API (*saHpiEventLogCapabilitiesGetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiEventLogCapabilitiesT *EventLogCapabilities ); typedef SaErrorT SAHPI_API (*saHpiEventLogEntryGetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiEventLogEntryIdT EntryId, SAHPI_OUT SaHpiEventLogEntryIdT *PrevEntryId, SAHPI_OUT SaHpiEventLogEntryIdT *NextEntryId, SAHPI_OUT SaHpiEventLogEntryT *EventLogEntry, SAHPI_INOUT SaHpiRdrT *Rdr, SAHPI_INOUT SaHpiRptEntryT *RptEntry ); typedef SaErrorT SAHPI_API (*saHpiEventLogEntryAddPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiEventT *EvtEntry ); typedef SaErrorT SAHPI_API (*saHpiEventLogClearPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId ); typedef SaErrorT SAHPI_API (*saHpiEventLogTimeGetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiTimeT *Time ); typedef SaErrorT SAHPI_API (*saHpiEventLogTimeSetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiTimeT Time ); typedef SaErrorT SAHPI_API (*saHpiEventLogStateGetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiBoolT *EnableState ); typedef SaErrorT SAHPI_API (*saHpiEventLogStateSetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiBoolT EnableState ); typedef SaErrorT SAHPI_API (*saHpiEventLogOverflowResetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId ); typedef SaErrorT SAHPI_API (*saHpiSubscribePtr)( SAHPI_IN SaHpiSessionIdT SessionId ); typedef SaErrorT SAHPI_API (*saHpiUnsubscribePtr)( SAHPI_IN SaHpiSessionIdT SessionId ); typedef SaErrorT SAHPI_API (*saHpiEventGetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiTimeoutT Timeout, SAHPI_OUT SaHpiEventT *Event, SAHPI_INOUT SaHpiRdrT *Rdr, SAHPI_INOUT SaHpiRptEntryT *RptEntry, SAHPI_INOUT SaHpiEvtQueueStatusT *EventQueueStatus ); typedef SaErrorT SAHPI_API (*saHpiEventAddPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiEventT *EvtEntry ); typedef SaErrorT SAHPI_API (*saHpiAlarmGetNextPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiSeverityT Severity, SAHPI_IN SaHpiBoolT UnacknowledgedOnly, SAHPI_INOUT SaHpiAlarmT *Alarm ); typedef SaErrorT SAHPI_API (*saHpiAlarmGetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiAlarmIdT AlarmId, SAHPI_OUT SaHpiAlarmT *Alarm ); typedef SaErrorT SAHPI_API (*saHpiAlarmAcknowledgePtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiAlarmIdT AlarmId, SAHPI_IN SaHpiSeverityT Severity ); typedef SaErrorT SAHPI_API (*saHpiAlarmAddPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_INOUT SaHpiAlarmT *Alarm ); typedef SaErrorT SAHPI_API (*saHpiAlarmDeletePtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiAlarmIdT AlarmId, SAHPI_IN SaHpiSeverityT Severity ); typedef SaErrorT SAHPI_API (*saHpiRdrGetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiEntryIdT EntryId, SAHPI_OUT SaHpiEntryIdT *NextEntryId, SAHPI_OUT SaHpiRdrT *Rdr ); typedef SaErrorT SAHPI_API (*saHpiRdrGetByInstrumentIdPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiRdrTypeT RdrType, SAHPI_IN SaHpiInstrumentIdT InstrumentId, SAHPI_OUT SaHpiRdrT *Rdr ); typedef SaErrorT SAHPI_API (*saHpiRdrUpdateCountGetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiUint32T *UpdateCount ); typedef SaErrorT SAHPI_API (*saHpiSensorReadingGetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_INOUT SaHpiSensorReadingT *Reading, SAHPI_INOUT SaHpiEventStateT *EventState ); typedef SaErrorT SAHPI_API (*saHpiSensorThresholdsGetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_OUT SaHpiSensorThresholdsT *SensorThresholds ); typedef SaErrorT SAHPI_API (*saHpiSensorThresholdsSetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_IN SaHpiSensorThresholdsT *SensorThresholds ); typedef SaErrorT SAHPI_API (*saHpiSensorTypeGetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_OUT SaHpiSensorTypeT *Type, SAHPI_OUT SaHpiEventCategoryT *Category ); typedef SaErrorT SAHPI_API (*saHpiSensorEnableGetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_OUT SaHpiBoolT *SensorEnabled ); typedef SaErrorT SAHPI_API (*saHpiSensorEnableSetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_IN SaHpiBoolT SensorEnabled ); typedef SaErrorT SAHPI_API (*saHpiSensorEventEnableGetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_OUT SaHpiBoolT *SensorEventsEnabled ); typedef SaErrorT SAHPI_API (*saHpiSensorEventEnableSetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_IN SaHpiBoolT SensorEventsEnabled ); typedef SaErrorT SAHPI_API (*saHpiSensorEventMasksGetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_INOUT SaHpiEventStateT *AssertEventMask, SAHPI_INOUT SaHpiEventStateT *DeassertEventMask ); typedef SaErrorT SAHPI_API (*saHpiSensorEventMasksSetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_IN SaHpiSensorEventMaskActionT Action, SAHPI_IN SaHpiEventStateT AssertEventMask, SAHPI_IN SaHpiEventStateT DeassertEventMask ); typedef SaErrorT SAHPI_API (*saHpiControlTypeGetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiCtrlNumT CtrlNum, SAHPI_OUT SaHpiCtrlTypeT *Type ); typedef SaErrorT SAHPI_API (*saHpiControlGetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiCtrlNumT CtrlNum, SAHPI_OUT SaHpiCtrlModeT *CtrlMode, SAHPI_INOUT SaHpiCtrlStateT *CtrlState ); typedef SaErrorT SAHPI_API (*saHpiControlSetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiCtrlNumT CtrlNum, SAHPI_IN SaHpiCtrlModeT CtrlMode, SAHPI_IN SaHpiCtrlStateT *CtrlState ); typedef SaErrorT SAHPI_API (*saHpiIdrInfoGetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT IdrId, SAHPI_OUT SaHpiIdrInfoT *IdrInfo ); typedef SaErrorT SAHPI_API (*saHpiIdrAreaHeaderGetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT IdrId, SAHPI_IN SaHpiIdrAreaTypeT AreaType, SAHPI_IN SaHpiEntryIdT AreaId, SAHPI_OUT SaHpiEntryIdT *NextAreaId, SAHPI_OUT SaHpiIdrAreaHeaderT *Header ); typedef SaErrorT SAHPI_API (*saHpiIdrAreaAddPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT IdrId, SAHPI_IN SaHpiIdrAreaTypeT AreaType, SAHPI_OUT SaHpiEntryIdT *AreaId ); typedef SaErrorT SAHPI_API (*saHpiIdrAreaAddByIdPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT IdrId, SAHPI_IN SaHpiIdrAreaTypeT AreaType, SAHPI_IN SaHpiEntryIdT AreaId ); typedef SaErrorT SAHPI_API (*saHpiIdrAreaDeletePtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT IdrId, SAHPI_IN SaHpiEntryIdT AreaId ); typedef SaErrorT SAHPI_API (*saHpiIdrFieldGetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT IdrId, SAHPI_IN SaHpiEntryIdT AreaId, SAHPI_IN SaHpiIdrFieldTypeT FieldType, SAHPI_IN SaHpiEntryIdT FieldId, SAHPI_OUT SaHpiEntryIdT *NextFieldId, SAHPI_OUT SaHpiIdrFieldT *Field ); typedef SaErrorT SAHPI_API (*saHpiIdrFieldAddPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT IdrId, SAHPI_INOUT SaHpiIdrFieldT *Field ); typedef SaErrorT SAHPI_API (*saHpiIdrFieldAddByIdPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT IdrId, SAHPI_INOUT SaHpiIdrFieldT *Field ); typedef SaErrorT SAHPI_API (*saHpiIdrFieldSetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT IdrId, SAHPI_IN SaHpiIdrFieldT *Field ); typedef SaErrorT SAHPI_API (*saHpiIdrFieldDeletePtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT IdrId, SAHPI_IN SaHpiEntryIdT AreaId, SAHPI_IN SaHpiEntryIdT FieldId ); typedef SaErrorT SAHPI_API (*saHpiWatchdogTimerGetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiWatchdogNumT WatchdogNum, SAHPI_OUT SaHpiWatchdogT *Watchdog ); typedef SaErrorT SAHPI_API (*saHpiWatchdogTimerSetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiWatchdogNumT WatchdogNum, SAHPI_IN SaHpiWatchdogT *Watchdog ); typedef SaErrorT SAHPI_API (*saHpiWatchdogTimerResetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiWatchdogNumT WatchdogNum ); typedef SaErrorT SAHPI_API (*saHpiAnnunciatorGetNextPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiAnnunciatorNumT AnnunciatorNum, SAHPI_IN SaHpiSeverityT Severity, SAHPI_IN SaHpiBoolT UnacknowledgedOnly, SAHPI_INOUT SaHpiAnnouncementT *Announcement ); typedef SaErrorT SAHPI_API (*saHpiAnnunciatorGetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiAnnunciatorNumT AnnunciatorNum, SAHPI_IN SaHpiEntryIdT EntryId, SAHPI_OUT SaHpiAnnouncementT *Announcement ); typedef SaErrorT SAHPI_API (*saHpiAnnunciatorAcknowledgePtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiAnnunciatorNumT AnnunciatorNum, SAHPI_IN SaHpiEntryIdT EntryId, SAHPI_IN SaHpiSeverityT Severity ); typedef SaErrorT SAHPI_API (*saHpiAnnunciatorAddPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiAnnunciatorNumT AnnunciatorNum, SAHPI_INOUT SaHpiAnnouncementT *Announcement ); typedef SaErrorT SAHPI_API (*saHpiAnnunciatorDeletePtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiAnnunciatorNumT AnnunciatorNum, SAHPI_IN SaHpiEntryIdT EntryId, SAHPI_IN SaHpiSeverityT Severity ); typedef SaErrorT SAHPI_API (*saHpiAnnunciatorModeGetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiAnnunciatorNumT AnnunciatorNum, SAHPI_OUT SaHpiAnnunciatorModeT *Mode ); typedef SaErrorT SAHPI_API (*saHpiAnnunciatorModeSetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiAnnunciatorNumT AnnunciatorNum, SAHPI_IN SaHpiAnnunciatorModeT Mode ); typedef SaErrorT SAHPI_API (*saHpiDimiInfoGetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiDimiNumT DimiNum, SAHPI_OUT SaHpiDimiInfoT *DimiInfo ); typedef SaErrorT SAHPI_API (*saHpiDimiTestInfoGetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiDimiNumT DimiNum, SAHPI_IN SaHpiDimiTestNumT TestNum, SAHPI_OUT SaHpiDimiTestT *DimiTest ); typedef SaErrorT SAHPI_API (*saHpiDimiTestReadinessGetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiDimiNumT DimiNum, SAHPI_IN SaHpiDimiTestNumT TestNum, SAHPI_OUT SaHpiDimiReadyT *DimiReady ); typedef SaErrorT SAHPI_API (*saHpiDimiTestStartPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiDimiNumT DimiNum, SAHPI_IN SaHpiDimiTestNumT TestNum, SAHPI_IN SaHpiUint8T NumberOfParams, SAHPI_IN SaHpiDimiTestVariableParamsT *ParamsList ); typedef SaErrorT SAHPI_API (*saHpiDimiTestCancelPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiDimiNumT DimiNum, SAHPI_IN SaHpiDimiTestNumT TestNum ); typedef SaErrorT SAHPI_API (*saHpiDimiTestStatusGetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiDimiNumT DimiNum, SAHPI_IN SaHpiDimiTestNumT TestNum, SAHPI_OUT SaHpiDimiTestPercentCompletedT *PercentCompleted, SAHPI_OUT SaHpiDimiTestRunStatusT *RunStatus ); typedef SaErrorT SAHPI_API (*saHpiDimiTestResultsGetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiDimiNumT DimiNum, SAHPI_IN SaHpiDimiTestNumT TestNum, SAHPI_OUT SaHpiDimiTestResultsT *TestResults ); typedef SaErrorT SAHPI_API (*saHpiFumiSpecInfoGetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_OUT SaHpiFumiSpecInfoT *SpecInfo ); typedef SaErrorT SAHPI_API (*saHpiFumiServiceImpactGetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_OUT SaHpiFumiServiceImpactDataT *ServiceImpact ); typedef SaErrorT SAHPI_API (*saHpiFumiSourceSetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum, SAHPI_IN SaHpiTextBufferT *SourceUri ); typedef SaErrorT SAHPI_API (*saHpiFumiSourceInfoValidateStartPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum ); typedef SaErrorT SAHPI_API (*saHpiFumiSourceInfoGetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum, SAHPI_OUT SaHpiFumiSourceInfoT *SourceInfo ); typedef SaErrorT SAHPI_API (*saHpiFumiSourceComponentInfoGetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum, SAHPI_IN SaHpiEntryIdT ComponentEntryId, SAHPI_OUT SaHpiEntryIdT *NextComponentEntryId, SAHPI_OUT SaHpiFumiComponentInfoT *ComponentInfo ); typedef SaErrorT SAHPI_API (*saHpiFumiTargetInfoGetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum, SAHPI_OUT SaHpiFumiBankInfoT *BankInfo ); typedef SaErrorT SAHPI_API (*saHpiFumiTargetComponentInfoGetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum, SAHPI_IN SaHpiEntryIdT ComponentEntryId, SAHPI_OUT SaHpiEntryIdT *NextComponentEntryId, SAHPI_OUT SaHpiFumiComponentInfoT *ComponentInfo ); typedef SaErrorT SAHPI_API (*saHpiFumiLogicalTargetInfoGetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_OUT SaHpiFumiLogicalBankInfoT *BankInfo ); typedef SaErrorT SAHPI_API (*saHpiFumiLogicalTargetComponentInfoGetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiEntryIdT ComponentEntryId, SAHPI_OUT SaHpiEntryIdT *NextComponentEntryId, SAHPI_OUT SaHpiFumiLogicalComponentInfoT *ComponentInfo ); typedef SaErrorT SAHPI_API (*saHpiFumiBackupStartPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum ); typedef SaErrorT SAHPI_API (*saHpiFumiBankBootOrderSetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum, SAHPI_IN SaHpiUint32T Position ); typedef SaErrorT SAHPI_API (*saHpiFumiBankCopyStartPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT SourceBankNum, SAHPI_IN SaHpiBankNumT TargetBankNum ); typedef SaErrorT SAHPI_API (*saHpiFumiInstallStartPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum ); typedef SaErrorT SAHPI_API (*saHpiFumiUpgradeStatusGetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum, SAHPI_OUT SaHpiFumiUpgradeStatusT *UpgradeStatus ); typedef SaErrorT SAHPI_API (*saHpiFumiTargetVerifyStartPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum ); typedef SaErrorT SAHPI_API (*saHpiFumiTargetVerifyMainStartPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum ); typedef SaErrorT SAHPI_API (*saHpiFumiUpgradeCancelPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum ); typedef SaErrorT SAHPI_API (*saHpiFumiAutoRollbackDisableGetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_OUT SaHpiBoolT *Disable ); typedef SaErrorT SAHPI_API (*saHpiFumiAutoRollbackDisableSetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBoolT Disable ); typedef SaErrorT SAHPI_API (*saHpiFumiRollbackStartPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum ); typedef SaErrorT SAHPI_API (*saHpiFumiActivatePtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum ); typedef SaErrorT SAHPI_API (*saHpiFumiActivateStartPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBoolT Logical ); typedef SaErrorT SAHPI_API (*saHpiFumiCleanupPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum ); typedef SaErrorT SAHPI_API (*saHpiHotSwapPolicyCancelPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId ); typedef SaErrorT SAHPI_API (*saHpiResourceActiveSetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId ); typedef SaErrorT SAHPI_API (*saHpiResourceInactiveSetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId ); typedef SaErrorT SAHPI_API (*saHpiAutoInsertTimeoutGetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_OUT SaHpiTimeoutT *Timeout ); typedef SaErrorT SAHPI_API (*saHpiAutoInsertTimeoutSetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiTimeoutT Timeout ); typedef SaErrorT SAHPI_API (*saHpiAutoExtractTimeoutGetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiTimeoutT *Timeout ); typedef SaErrorT SAHPI_API (*saHpiAutoExtractTimeoutSetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiTimeoutT Timeout ); typedef SaErrorT SAHPI_API (*saHpiHotSwapStateGetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiHsStateT *State ); typedef SaErrorT SAHPI_API (*saHpiHotSwapActionRequestPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiHsActionT Action ); typedef SaErrorT SAHPI_API (*saHpiHotSwapIndicatorStateGetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiHsIndicatorStateT *State ); typedef SaErrorT SAHPI_API (*saHpiHotSwapIndicatorStateSetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiHsIndicatorStateT State ); typedef SaErrorT SAHPI_API (*saHpiParmControlPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiParmActionT Action ); typedef SaErrorT SAHPI_API (*saHpiResourceLoadIdGetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiLoadIdT *LoadId ); typedef SaErrorT SAHPI_API (*saHpiResourceLoadIdSetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiLoadIdT *LoadId ); typedef SaErrorT SAHPI_API (*saHpiResourceResetStateGetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiResetActionT *ResetAction ); typedef SaErrorT SAHPI_API (*saHpiResourceResetStateSetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiResetActionT ResetAction ); typedef SaErrorT SAHPI_API (*saHpiResourcePowerStateGetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiPowerStateT *State ); typedef SaErrorT SAHPI_API (*saHpiResourcePowerStateSetPtr)( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiPowerStateT State ); /************************************************************** * Pointers to oHpi* functions *************************************************************/ typedef SaErrorT SAHPI_API (*oHpiDomainAddPtr)( const SaHpiTextBufferT *host, SaHpiUint16T port, const SaHpiEntityPathT *entity_root, SaHpiDomainIdT *domain_id ); namespace Slave { /************************************************************** * struct BaseLibAbi *************************************************************/ struct BaseLibAbi { saHpiVersionGetPtr saHpiVersionGet; saHpiInitializePtr saHpiInitialize; saHpiFinalizePtr saHpiFinalize; saHpiSessionOpenPtr saHpiSessionOpen; saHpiSessionClosePtr saHpiSessionClose; saHpiDiscoverPtr saHpiDiscover; saHpiDomainInfoGetPtr saHpiDomainInfoGet; saHpiDrtEntryGetPtr saHpiDrtEntryGet; saHpiDomainTagSetPtr saHpiDomainTagSet; saHpiRptEntryGetPtr saHpiRptEntryGet; saHpiRptEntryGetByResourceIdPtr saHpiRptEntryGetByResourceId; saHpiResourceSeveritySetPtr saHpiResourceSeveritySet; saHpiResourceTagSetPtr saHpiResourceTagSet; saHpiMyEntityPathGetPtr saHpiMyEntityPathGet; saHpiResourceIdGetPtr saHpiResourceIdGet; saHpiGetIdByEntityPathPtr saHpiGetIdByEntityPath; saHpiGetChildEntityPathPtr saHpiGetChildEntityPath; saHpiResourceFailedRemovePtr saHpiResourceFailedRemove; saHpiEventLogInfoGetPtr saHpiEventLogInfoGet; saHpiEventLogCapabilitiesGetPtr saHpiEventLogCapabilitiesGet; saHpiEventLogEntryGetPtr saHpiEventLogEntryGet; saHpiEventLogEntryAddPtr saHpiEventLogEntryAdd; saHpiEventLogClearPtr saHpiEventLogClear; saHpiEventLogTimeGetPtr saHpiEventLogTimeGet; saHpiEventLogTimeSetPtr saHpiEventLogTimeSet; saHpiEventLogStateGetPtr saHpiEventLogStateGet; saHpiEventLogStateSetPtr saHpiEventLogStateSet; saHpiEventLogOverflowResetPtr saHpiEventLogOverflowReset; saHpiSubscribePtr saHpiSubscribe; saHpiUnsubscribePtr saHpiUnsubscribe; saHpiEventGetPtr saHpiEventGet; saHpiEventAddPtr saHpiEventAdd; saHpiAlarmGetNextPtr saHpiAlarmGetNext; saHpiAlarmGetPtr saHpiAlarmGet; saHpiAlarmAcknowledgePtr saHpiAlarmAcknowledge; saHpiAlarmAddPtr saHpiAlarmAdd; saHpiAlarmDeletePtr saHpiAlarmDelete; saHpiRdrGetPtr saHpiRdrGet; saHpiRdrGetByInstrumentIdPtr saHpiRdrGetByInstrumentId; saHpiRdrUpdateCountGetPtr saHpiRdrUpdateCountGet; saHpiSensorReadingGetPtr saHpiSensorReadingGet; saHpiSensorThresholdsGetPtr saHpiSensorThresholdsGet; saHpiSensorThresholdsSetPtr saHpiSensorThresholdsSet; saHpiSensorTypeGetPtr saHpiSensorTypeGet; saHpiSensorEnableGetPtr saHpiSensorEnableGet; saHpiSensorEnableSetPtr saHpiSensorEnableSet; saHpiSensorEventEnableGetPtr saHpiSensorEventEnableGet; saHpiSensorEventEnableSetPtr saHpiSensorEventEnableSet; saHpiSensorEventMasksGetPtr saHpiSensorEventMasksGet; saHpiSensorEventMasksSetPtr saHpiSensorEventMasksSet; saHpiControlTypeGetPtr saHpiControlTypeGet; saHpiControlGetPtr saHpiControlGet; saHpiControlSetPtr saHpiControlSet; saHpiIdrInfoGetPtr saHpiIdrInfoGet; saHpiIdrAreaHeaderGetPtr saHpiIdrAreaHeaderGet; saHpiIdrAreaAddPtr saHpiIdrAreaAdd; saHpiIdrAreaAddByIdPtr saHpiIdrAreaAddById; saHpiIdrAreaDeletePtr saHpiIdrAreaDelete; saHpiIdrFieldGetPtr saHpiIdrFieldGet; saHpiIdrFieldAddPtr saHpiIdrFieldAdd; saHpiIdrFieldAddByIdPtr saHpiIdrFieldAddById; saHpiIdrFieldSetPtr saHpiIdrFieldSet; saHpiIdrFieldDeletePtr saHpiIdrFieldDelete; saHpiWatchdogTimerGetPtr saHpiWatchdogTimerGet; saHpiWatchdogTimerSetPtr saHpiWatchdogTimerSet; saHpiWatchdogTimerResetPtr saHpiWatchdogTimerReset; saHpiAnnunciatorGetNextPtr saHpiAnnunciatorGetNext; saHpiAnnunciatorGetPtr saHpiAnnunciatorGet; saHpiAnnunciatorAcknowledgePtr saHpiAnnunciatorAcknowledge; saHpiAnnunciatorAddPtr saHpiAnnunciatorAdd; saHpiAnnunciatorDeletePtr saHpiAnnunciatorDelete; saHpiAnnunciatorModeGetPtr saHpiAnnunciatorModeGet; saHpiAnnunciatorModeSetPtr saHpiAnnunciatorModeSet; saHpiDimiInfoGetPtr saHpiDimiInfoGet; saHpiDimiTestInfoGetPtr saHpiDimiTestInfoGet; saHpiDimiTestReadinessGetPtr saHpiDimiTestReadinessGet; saHpiDimiTestStartPtr saHpiDimiTestStart; saHpiDimiTestCancelPtr saHpiDimiTestCancel; saHpiDimiTestStatusGetPtr saHpiDimiTestStatusGet; saHpiDimiTestResultsGetPtr saHpiDimiTestResultsGet; saHpiFumiSpecInfoGetPtr saHpiFumiSpecInfoGet; saHpiFumiServiceImpactGetPtr saHpiFumiServiceImpactGet; saHpiFumiSourceSetPtr saHpiFumiSourceSet; saHpiFumiSourceInfoValidateStartPtr saHpiFumiSourceInfoValidateStart; saHpiFumiSourceInfoGetPtr saHpiFumiSourceInfoGet; saHpiFumiSourceComponentInfoGetPtr saHpiFumiSourceComponentInfoGet; saHpiFumiTargetInfoGetPtr saHpiFumiTargetInfoGet; saHpiFumiTargetComponentInfoGetPtr saHpiFumiTargetComponentInfoGet; saHpiFumiLogicalTargetInfoGetPtr saHpiFumiLogicalTargetInfoGet; saHpiFumiLogicalTargetComponentInfoGetPtr saHpiFumiLogicalTargetComponentInfoGet; saHpiFumiBackupStartPtr saHpiFumiBackupStart; saHpiFumiBankBootOrderSetPtr saHpiFumiBankBootOrderSet; saHpiFumiBankCopyStartPtr saHpiFumiBankCopyStart; saHpiFumiInstallStartPtr saHpiFumiInstallStart; saHpiFumiUpgradeStatusGetPtr saHpiFumiUpgradeStatusGet; saHpiFumiTargetVerifyStartPtr saHpiFumiTargetVerifyStart; saHpiFumiTargetVerifyMainStartPtr saHpiFumiTargetVerifyMainStart; saHpiFumiUpgradeCancelPtr saHpiFumiUpgradeCancel; saHpiFumiAutoRollbackDisableGetPtr saHpiFumiAutoRollbackDisableGet; saHpiFumiAutoRollbackDisableSetPtr saHpiFumiAutoRollbackDisableSet; saHpiFumiRollbackStartPtr saHpiFumiRollbackStart; saHpiFumiActivatePtr saHpiFumiActivate; saHpiFumiActivateStartPtr saHpiFumiActivateStart; saHpiFumiCleanupPtr saHpiFumiCleanup; saHpiHotSwapPolicyCancelPtr saHpiHotSwapPolicyCancel; saHpiResourceActiveSetPtr saHpiResourceActiveSet; saHpiResourceInactiveSetPtr saHpiResourceInactiveSet; saHpiAutoInsertTimeoutGetPtr saHpiAutoInsertTimeoutGet; saHpiAutoInsertTimeoutSetPtr saHpiAutoInsertTimeoutSet; saHpiAutoExtractTimeoutGetPtr saHpiAutoExtractTimeoutGet; saHpiAutoExtractTimeoutSetPtr saHpiAutoExtractTimeoutSet; saHpiHotSwapStateGetPtr saHpiHotSwapStateGet; saHpiHotSwapActionRequestPtr saHpiHotSwapActionRequest; saHpiHotSwapIndicatorStateGetPtr saHpiHotSwapIndicatorStateGet; saHpiHotSwapIndicatorStateSetPtr saHpiHotSwapIndicatorStateSet; saHpiParmControlPtr saHpiParmControl; saHpiResourceLoadIdGetPtr saHpiResourceLoadIdGet; saHpiResourceLoadIdSetPtr saHpiResourceLoadIdSet; saHpiResourceResetStateGetPtr saHpiResourceResetStateGet; saHpiResourceResetStateSetPtr saHpiResourceResetStateSet; saHpiResourcePowerStateGetPtr saHpiResourcePowerStateGet; saHpiResourcePowerStateSetPtr saHpiResourcePowerStateSet; oHpiDomainAddPtr oHpiDomainAdd; }; /************************************************************** * class cBaseLib *************************************************************/ class cBaseLib { public: const BaseLibAbi * Abi() const { return &m_abi; } protected: explicit cBaseLib(); ~cBaseLib(); bool LoadBaseLib(); private: GModule * m_handle; BaseLibAbi m_abi; }; }; // namespace Slave #endif // __BASELIB_H__ openhpi-3.6.1/plugins/slave/Makefile.am0000644000175100017510000000217512575647277017035 0ustar mohanmohan# -*- linux-c++ -*- # # (C) Copyright Pigeon Point Systems. 2010 # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # # Author(s): # Anton Pak # MAINTAINERCLEANFILES = Makefile.in AM_CPPFLAGS = -DG_LOG_DOMAIN=\"slave\" AM_CPPFLAGS += @OPENHPI_INCLUDES@ EXTRA_DIST = Makefile.mingw32 version.rc pkglib_LTLIBRARIES = libslave.la libslave_la_SOURCES = baselib.cpp \ baselib.h \ handler.cpp \ handler.h \ lock.h \ resourcemap.cpp \ resourcemap.h \ slave.cpp \ slave.h \ util.cpp \ util.h libslave_la_LDFLAGS = -module -version-info @HPI_LIB_VERSION@ libslave_la_LIBADD = @GMODULE_ONLY_LIBS@ openhpi-3.6.1/plugins/slave/Makefile.mingw320000644000175100017510000000121312575647277017716 0ustar mohanmohaninclude ../../Makefile.mingw32.def TARGET := libslave.dll SRC := baselib.cpp \ handler.cpp \ resourcemap.cpp \ slave.cpp \ util.cpp \ version.rc OBJ := $(patsubst %.rc, %.o, $(patsubst %.cpp, %.o, ${SRC})) DEFS := -DG_LOG_DOMAIN=\"slave\" INCLUDES := ${GLIB_INCLUDES} -I ../../mingw32 -I ../../include -I ../../utils LIBS := ${GLIB_LIBS} ${GTHREAD_LIBS} ${GMODULE_LIBS} LIBS += -L ../../utils -lopenhpiutils CPPFLAGS += ${DEFS} ${INCLUDES} .PHONY: all clean .SUFFIXES: .rc all : ${TARGET} ${TARGET} : ${OBJ} ${CXX} -shared -o $@ $^ ${LIBS} .rc.o: ${RC} ${RCFLAGS} $< $@ clean: rm -f ${OBJ} ${TARGET} openhpi-3.6.1/plugins/slave/util.cpp0000644000175100017510000001043612575647277016461 0ustar mohanmohan/* -*- linux-c++ -*- * * (C) Copyright Pigeon Point Systems. 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #include #include "util.h" namespace Slave { /************************************************************** * Utility Functions *************************************************************/ bool IsLeavingEvent( const SaHpiEventT& event ) { if ( event.EventType == SAHPI_ET_RESOURCE ) { const SaHpiResourceEventT& re = event.EventDataUnion.ResourceEvent; return ( re.ResourceEventType == SAHPI_RESE_RESOURCE_REMOVED ); } else if ( event.EventType == SAHPI_ET_HOTSWAP ) { const SaHpiHotSwapEventT& hse = event.EventDataUnion.HotSwapEvent; return ( hse.HotSwapState == SAHPI_HS_STATE_NOT_PRESENT ); } return false; } bool IsUpdateEvent( const SaHpiEventT& event ) { if ( event.EventType == SAHPI_ET_RESOURCE ) { const SaHpiResourceEventT& re = event.EventDataUnion.ResourceEvent; return ( re.ResourceEventType == SAHPI_RESE_RESOURCE_UPDATED ); } return false; } bool IsEntityPathValid( const SaHpiEntityPathT& ep ) { for ( unsigned int i = 0; i < SAHPI_MAX_ENTITY_PATH; ++i ) { if ( ep.Entry[i].EntityType != SAHPI_ENT_UNSPECIFIED ) { return true; } } return false; } bool IsRptEntryValid( const SaHpiRptEntryT& rpte ) { if ( rpte.ResourceId == SAHPI_UNSPECIFIED_RESOURCE_ID ) { return false; } if ( rpte.ResourceCapabilities == 0 ) { return false; } return true; } bool IsRdrValid( const SaHpiRdrT& rdr ) { return ( rdr.RdrType != SAHPI_NO_RECORD ); } /************************************************************** * Various HPI Data structures translation * Slave -> Master *************************************************************/ void TranslateEntityPath( SaHpiEntityPathT& ep, const SaHpiEntityPathT& root ) { if ( !IsEntityPathValid( ep ) ) { return; } oh_concat_ep( &ep, &root ); } void TranslateDimiTest( SaHpiDimiTestT& dt, const SaHpiEntityPathT& root ) { for ( unsigned int i = 0; i < SAHPI_DIMITEST_MAX_ENTITIESIMPACTED; ++i ) { TranslateEntityPath( dt.EntitiesImpacted[i].EntityImpacted, root ); } } void TranslateFumiServiceImpact( SaHpiFumiServiceImpactDataT& fsi, const SaHpiEntityPathT& root ) { for ( unsigned int i = 0; i < SAHPI_FUMI_MAX_ENTITIES_IMPACTED; ++i ) { TranslateEntityPath( fsi.ImpactedEntities[i].ImpactedEntity, root ); } } void TranslateEvent( SaHpiEventT& event, SaHpiResourceIdT master_rid ) { event.Source = master_rid; } void TranslateRptEntry( SaHpiRptEntryT& rpte, SaHpiResourceIdT master_rid, const SaHpiEntityPathT& root ) { if ( !IsRptEntryValid( rpte ) ) { return; } rpte.EntryId = SAHPI_ENTRY_UNSPECIFIED; rpte.ResourceId = master_rid; TranslateEntityPath( rpte.ResourceEntity, root ); } void TranslateRdr( SaHpiRdrT& rdr, const SaHpiEntityPathT& root ) { if ( !IsRdrValid( rdr ) ) { return; } rdr.RecordId = SAHPI_ENTRY_UNSPECIFIED; TranslateEntityPath( rdr.Entity, root ); } void TranslateRdrs( const GSList * rdr_list, const SaHpiEntityPathT& root ) { for ( const GSList * node = rdr_list; node; node = node->next ) { SaHpiRdrT * rdr = (SaHpiRdrT *)node->data; TranslateRdr( *rdr, root ); } } void TranslateAnnouncement( SaHpiAnnouncementT& a, SaHpiResourceIdT master_rid, const SaHpiEntityPathT& root ) { if ( a.AddedByUser != SAHPI_FALSE ) { return; } TranslateEntityPath( a.StatusCond.Entity, root ); a.StatusCond.DomainId = SAHPI_UNSPECIFIED_DOMAIN_ID; // TODO a.StatusCond.ResourceId = master_rid; } }; // namespace Slave openhpi-3.6.1/plugins/slave/resourcemap.h0000644000175100017510000000351712575647277017500 0ustar mohanmohan/* -*- linux-c++ -*- * * (C) Copyright Pigeon Point Systems. 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #ifndef __RESOURCE_MAP_H__ #define __RESOURCE_MAP_H__ #include #include #include #include "lock.h" namespace Slave { /************************************************************** * struct ResourceMapEntry *************************************************************/ struct ResourceMapEntry { SaHpiResourceIdT slave_rid; SaHpiResourceIdT master_rid; }; /************************************************************** * class cResourceMap *************************************************************/ class cResourceMap { public: SaHpiResourceIdT GetMaster( SaHpiResourceIdT slave_rid ) const; SaHpiResourceIdT GetSlave( SaHpiResourceIdT master_rid ) const; protected: explicit cResourceMap(); ~cResourceMap(); bool IsSlaveKnown( SaHpiResourceIdT slave_rid ) const; void AddEntry( SaHpiResourceIdT master_rid, SaHpiResourceIdT slave_rid ); void RemoveEntry( SaHpiResourceIdT slave_rid ); void TakeEntriesAway( std::vector& entries ); private: cResourceMap( const cResourceMap& ); cResourceMap& operator =( const cResourceMap& ); private: // data mutable cLock m_lock; typedef std::map OneWayMap; OneWayMap m_master_rids; OneWayMap m_slave_rids; }; }; // namespace Slave #endif // __RESOURCE_MAP_H__ openhpi-3.6.1/plugins/slave/handler.cpp0000644000175100017510000003231012575647277017114 0ustar mohanmohan/* -*- linux-c++ -*- * * (C) Copyright Pigeon Point Systems. 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #include #include #include #include #include #include #include #include #include #include #include "handler.h" #include "util.h" namespace Slave { /************************************************************** * class cHandler *************************************************************/ cHandler::cHandler( unsigned int id, const SaHpiEntityPathT& root, const std::string& host, unsigned short port, oh_evt_queue& eventq ) : m_id( id ), m_root( root ), m_port( port ), m_did( SAHPI_UNSPECIFIED_DOMAIN_ID ), m_sid( InvalidSessionId ), m_eventq( eventq ), m_stop( false ), m_thread( 0 ), m_startup_discovery_status( StartupDiscoveryUncompleted ) { m_host.DataType = SAHPI_TL_TYPE_TEXT; m_host.Language = SAHPI_LANG_UNDEF; m_host.DataLength = std::min( host.size(), SAHPI_MAX_TEXT_BUFFER_LENGTH ); memcpy( &m_host.Data[0], host.c_str(), m_host.DataLength ); } cHandler::~cHandler() { if ( m_thread ) { m_stop = true; g_thread_join( m_thread ); } CloseSession(); RemoveAllResources(); } bool cHandler::Init() { if ( g_thread_supported() == FALSE ) { g_thread_init( 0 ); } bool rc; rc = LoadBaseLib(); if ( !rc ) { return false; } SaHpiEntityPathT root; oh_init_ep( &root ); SaHpiDomainIdT did; SaErrorT rv = Abi()->oHpiDomainAdd( &m_host, m_port, &root, &did ); if ( rv != SA_OK ) { CRIT( "oHpiDomainAdd failed with rv = %d", rv ); return false; } m_did = did; DBG( "Domain %u is created", m_did ); rc = StartThread(); if ( !rc ) { CRIT( "cannot start thread" ); return false; } return true; } bool cHandler::WaitForDiscovery() { while ( m_startup_discovery_status == StartupDiscoveryUncompleted ) { g_usleep( (gulong)( DiscoveryStatusCheckInterval / 1000ULL ) ); } return ( m_startup_discovery_status == StartupDiscoveryDone ); } SaHpiResourceIdT cHandler::GetOrCreateMaster( const SaHpiRptEntryT& slave_rpte ) { if ( !IsRptEntryValid( slave_rpte ) ) { return SAHPI_UNSPECIFIED_RESOURCE_ID; } SaHpiResourceIdT slave_rid = slave_rpte.ResourceId; SaHpiResourceIdT master_rid = GetMaster( slave_rid ); // New Entry? if ( slave_rid != SAHPI_UNSPECIFIED_RESOURCE_ID ) { if ( master_rid == SAHPI_UNSPECIFIED_RESOURCE_ID ) { if ( IsEntityPathValid( slave_rpte.ResourceEntity ) ) { // Yes, New Entry! SaHpiEntityPathT ep = slave_rpte.ResourceEntity; TranslateEntityPath( ep, m_root ); master_rid = oh_uid_from_entity_path( &ep ); AddEntry( master_rid, slave_rid ); } } } return master_rid; } bool cHandler::StartThread() { m_thread = g_thread_create( cHandler::ThreadProcAdapter, this, TRUE, 0 ); return ( m_thread != 0 ); } gpointer cHandler::ThreadProcAdapter( gpointer data ) { cHandler * handler = reinterpret_cast(data); handler->ThreadProc(); return 0; } void cHandler::ThreadProc() { bool rc; while ( !m_stop ) { rc = OpenSession(); if ( rc ) { rc = Discover(); if ( rc ) { if ( m_startup_discovery_status == StartupDiscoveryUncompleted ) { m_startup_discovery_status = StartupDiscoveryDone; } while ( !m_stop ) { struct oh_event * e = 0; rc = ReceiveEvent( e ); if ( rc ) { if ( e != 0 ) { HandleEvent( e ); } } else { break; } } } else { if ( m_startup_discovery_status == StartupDiscoveryUncompleted ) { m_startup_discovery_status = StartupDiscoveryFailed; } } CloseSession(); RemoveAllResources(); } else { if ( m_startup_discovery_status == StartupDiscoveryUncompleted ) { m_startup_discovery_status = StartupDiscoveryFailed; } } if ( !m_stop ) { g_usleep( (gulong)( OpenSessionRetryInterval / 1000ULL ) ); } } } bool cHandler::OpenSession() { if ( m_sid != InvalidSessionId ) { CRIT( "Session is already open" ); return true; } SaErrorT rv; SaHpiSessionIdT sid; rv = Abi()->saHpiSessionOpen( m_did, &sid, 0 ); if ( rv != SA_OK ) { CRIT( "saHpiSessionOpen failed with rv = %d", rv ); return false; } rv = Abi()->saHpiSubscribe( sid ); if ( rv != SA_OK ) { CRIT( "saHpiSubscribe failed with rv = %d", rv ); rv = Abi()->saHpiSessionClose( m_sid ); if ( rv != SA_OK ) { CRIT( "saHpiSessionClose failed with rv = %d", rv ); } return false; } m_sid = sid; return true; } bool cHandler::CloseSession() { SaErrorT rv; if ( m_sid == InvalidSessionId ) { return true; } rv = Abi()->saHpiSessionClose( m_sid ); if ( rv != SA_OK ) { CRIT( "saHpiSessionClose failed with rv = %d", rv ); } m_sid = InvalidSessionId; return true; } bool cHandler::Discover() { bool rc; SaErrorT rv; rv = Abi()->saHpiDiscover( m_sid ); if ( rv != SA_OK ) { CRIT( "saHpiDiscover failed with rv = %d", rv ); return false; } std::queue events; rc = FetchRptAndRdrs( events ); if ( !rc ) { return false; } while( !events.empty() ) { struct oh_event * e = events.front(); events.pop(); SaHpiResourceIdT master_rid = GetOrCreateMaster( e->resource ); // TODO may be e->event.Source is better than e->resource.ResourceId CompleteAndPostResourceUpdateEvent( e, master_rid ); } return true; } void cHandler::RemoveAllResources() { std::vector entries; TakeEntriesAway( entries ); for ( unsigned int i = 0, n = entries.size(); i < n; ++i ) { struct oh_event * e = g_new0( struct oh_event, 1 ); e->event.Source = entries[i].slave_rid; e->resource.ResourceCapabilities = 0; SaHpiEventT& he = e->event; he.EventType = SAHPI_ET_RESOURCE; he.Severity = SAHPI_MAJOR; SaHpiResourceEventT& re = he.EventDataUnion.ResourceEvent; re.ResourceEventType = SAHPI_RESE_RESOURCE_REMOVED; CompleteAndPostEvent( e, entries[i].master_rid, true ); } } bool cHandler::ReceiveEvent( struct oh_event *& e ) { e = g_new0( struct oh_event, 1 ); SaHpiRdrT * rdr = g_new0( SaHpiRdrT, 1 ); e->rdrs = g_slist_append( e->rdrs, rdr ); SaErrorT rv = Abi()->saHpiEventGet( m_sid, GetEventTimeout, &e->event, rdr, &e->resource, 0 ); if ( rv != SA_OK ) { oh_event_free( e, 0 ); e = 0; if ( rv != SA_ERR_HPI_TIMEOUT ) { CRIT( "saHpiEventGet failed with rv = %d", rv ); return false; } return true; } if ( !IsRdrValid( *rdr ) ) { oh_event_free( e, 1 ); e->rdrs = 0; } // We do not pass Domain Event to the Master OpenHPI daemon if ( e->event.EventType == SAHPI_ET_DOMAIN ) { oh_event_free( e, 0 ); e = 0; } return true; } void cHandler::HandleEvent( struct oh_event * e ) { SaHpiResourceIdT slave_rid = e->event.Source; bool is_known = IsSlaveKnown( slave_rid ); bool is_update = IsUpdateEvent( e->event ); bool is_leaving = IsLeavingEvent( e->event ); SaHpiResourceIdT master_rid; if ( is_known ) { master_rid = GetMaster( slave_rid ); } else { master_rid = GetOrCreateMaster( e->resource ); } struct oh_event * e_main = e; struct oh_event * e_update = 0; if ( !is_leaving ) { if ( ( !is_known ) || is_update ) { e_update = g_new0( struct oh_event, 1 ); e_update->event.Source = slave_rid; e_update->resource = e->resource; } } CompleteAndPostEvent( e_main, master_rid, false ); if ( is_leaving ) { RemoveEntry( slave_rid ); } if ( e_update != 0 ) { bool rc = FetchRdrs( e_update ); if ( rc ) { CompleteAndPostResourceUpdateEvent( e_update, master_rid ); } else { oh_event_free( e_update, 0 ); } } } SaHpiUint32T cHandler::GetRptUpdateCounter() const { SaErrorT rv; SaHpiDomainInfoT di; rv = Abi()->saHpiDomainInfoGet( m_sid, &di ); if ( rv == SA_OK ) { return di.RptUpdateCount; } else { CRIT( "saHpiDomainInfoGet failed with rv = %d", rv ); return 0; } } SaHpiUint32T cHandler::GetRdrUpdateCounter( SaHpiResourceIdT slave_rid ) const { SaErrorT rv; SaHpiUint32T cnt; rv = Abi()->saHpiRdrUpdateCountGet( m_sid, slave_rid, &cnt ); if ( rv == SA_OK ) { return cnt; } else { CRIT( "saHpiRdrUpdateCountGet failed with rv = %d", rv ); return 0; } } bool cHandler::FetchRptAndRdrs( std::queue& events ) const { for ( unsigned int attempt = 0; attempt < MaxFetchAttempts; ++attempt ) { while( !events.empty() ) { oh_event_free( events.front(), 0 ); events.pop(); } SaHpiUint32T cnt = GetRptUpdateCounter(); SaHpiEntryIdT id, next_id; for ( id = SAHPI_FIRST_ENTRY; id != SAHPI_LAST_ENTRY; id = next_id ) { struct oh_event * e = g_new0( struct oh_event, 1 ); SaErrorT rv = Abi()->saHpiRptEntryGet( m_sid, id, &next_id, &e->resource ); if ( rv != SA_OK ) { CRIT( "saHpiRptEntryGet failed with rv = %d", rv ); break; } e->event.Source = e->resource.ResourceId; bool rc = FetchRdrs( e ); if ( !rc ) { break; } events.push( e ); } if ( cnt == GetRptUpdateCounter() ) { return true; } } while( !events.empty() ) { oh_event_free( events.front(), 0 ); events.pop(); } return false; } bool cHandler::FetchRdrs( struct oh_event * e ) const { SaHpiResourceIdT slave_rid = e->event.Source; for ( unsigned int attempt = 0; attempt < MaxFetchAttempts; ++attempt ) { oh_event_free( e, 1 ); e->rdrs = 0; SaHpiUint32T cnt = GetRdrUpdateCounter( slave_rid ); SaHpiEntryIdT id, next_id; for ( id = SAHPI_FIRST_ENTRY; id != SAHPI_LAST_ENTRY; id = next_id ) { SaHpiRdrT * rdr = g_new0( SaHpiRdrT, 1 ); SaErrorT rv = Abi()->saHpiRdrGet( m_sid, slave_rid, id, &next_id, rdr ); if ( rv != SA_OK ) { g_free( rdr ); CRIT( "saHpiRdrGet failed with rv = %d", rv ); break; } e->rdrs = g_slist_append( e->rdrs, rdr ); } if ( cnt == GetRdrUpdateCounter( slave_rid ) ) { return true; } } oh_event_free( e, 1 ); e->rdrs = 0; return false; } void cHandler::CompleteAndPostEvent( struct oh_event * e, SaHpiResourceIdT master_rid, bool set_timestamp ) { TranslateEvent( e->event, master_rid ); TranslateRptEntry( e->resource, master_rid, m_root ); TranslateRdrs( e->rdrs, m_root ); e->hid = m_id; SaHpiEventT& he = e->event; if ( set_timestamp ) { oh_gettimeofday( &he.Timestamp ); } oh_evt_queue_push( &m_eventq, e ); } void cHandler::CompleteAndPostResourceUpdateEvent( struct oh_event * e, SaHpiResourceIdT master_rid ) { SaHpiEventT& he = e->event; he.EventType = SAHPI_ET_RESOURCE; he.Severity = SAHPI_MAJOR; // TODO SaHpiResourceEventT& re = he.EventDataUnion.ResourceEvent; re.ResourceEventType = SAHPI_RESE_RESOURCE_UPDATED; CompleteAndPostEvent( e, master_rid, true ); } }; // namespace Slave openhpi-3.6.1/plugins/slave/util.h0000644000175100017510000000416312575647277016126 0ustar mohanmohan/* -*- linux-c++ -*- * * (C) Copyright Pigeon Point Systems. 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #ifndef __UTIL_H__ #define __UTIL_H__ #include #include namespace Slave { /************************************************************** * Utility Functions *************************************************************/ bool IsLeavingEvent( const SaHpiEventT& ); bool IsUpdateEvent( const SaHpiEventT& ); bool IsEntityPathValid( const SaHpiEntityPathT& ep ); bool IsRptEntryValid( const SaHpiRptEntryT& rpte ); bool IsRdrValid( const SaHpiRdrT& rdr ); /************************************************************** * Various HPI Data structures translation * Slave -> Master *************************************************************/ void TranslateEntityPath( SaHpiEntityPathT& ep, const SaHpiEntityPathT& root ); void TranslateDimiTest( SaHpiDimiTestT& dt, const SaHpiEntityPathT& root ); void TranslateFumiServiceImpact( SaHpiFumiServiceImpactDataT& fsi, const SaHpiEntityPathT& root ); void TranslateEvent( SaHpiEventT& event, SaHpiResourceIdT master_rid ); void TranslateRptEntry( SaHpiRptEntryT& rpte, SaHpiResourceIdT master_rid, const SaHpiEntityPathT& root ); void TranslateRdr( SaHpiRdrT& rdr, const SaHpiEntityPathT& root ); void TranslateRdrs( const GSList * rdr_list, const SaHpiEntityPathT& root ); void TranslateAnnouncement( SaHpiAnnouncementT& a, SaHpiResourceIdT master_rid, const SaHpiEntityPathT& root ); }; // namespace Slave #endif // __UTIL_H__ openhpi-3.6.1/plugins/slave/slave.cpp0000644000175100017510000016434612575647277016630 0ustar mohanmohan/* -*- linux-c++ -*- * * (C) Copyright Pigeon Point Systems. 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #include #include #include #include #include #include #include #include #include "handler.h" #include "slave.h" #include "util.h" using Slave::cHandler; /************************************************************** * Helpers *************************************************************/ static bool slave_parse_config( GHashTable * config, SaHpiEntityPathT& root, std::string& host, unsigned short& port ) { const char * param; root.Entry[0].EntityType = SAHPI_ENT_ROOT; root.Entry[0].EntityLocation = 0; param = (const char*)g_hash_table_lookup( config, "entity_root" ); if ( param && ( strlen( param ) > 0 ) ) { if ( oh_encode_entitypath( param, &root ) != SA_OK ) { CRIT( "Cannot decode entity_root." ); return false; } } param = (const char*)g_hash_table_lookup( config, "host" ); if ( !param ) { CRIT( "No host specified." ); return false; } host = param; port = OPENHPI_DEFAULT_DAEMON_PORT; param = (const char*)g_hash_table_lookup( config, "port" ); if ( param ) { port = atoi( param ); } return true; } #define GET_SLAVE( h, master_rid, slave_rid ) \ slave_rid = h->GetSlave( master_rid ); \ if ( slave_rid == SAHPI_UNSPECIFIED_RESOURCE_ID ) { \ return SA_ERR_HPI_NOT_PRESENT; \ } #define CALL_ABI( h, FFF, rv, ... ) \ rv = h->Abi()->FFF( handler->GetSessionId(), ##__VA_ARGS__ ); /************************************************************** * slave_open *************************************************************/ void * oh_open( GHashTable * handler_config, unsigned int hid, oh_evt_queue * eventq ) { if ( !handler_config ) { CRIT( "handler_config is NULL!" ); return 0; } if ( hid == 0 ) { CRIT( "Bad handler id passed." ); return 0; } if ( !eventq ) { CRIT( "No event queue was passed." ); return 0; } bool rc; SaHpiEntityPathT root; std::string host; unsigned short port; rc = slave_parse_config( handler_config, root, host, port ); if ( !rc ) { CRIT( "Error while parsing config." ); return 0; } cHandler * handler = new cHandler( hid, root, host, port, *eventq ); rc = handler->Init(); if ( !rc ) { CRIT( "Handler::Init failed."); return 0; } return handler; } /************************************************************** * slave_close *************************************************************/ void oh_close( void * hnd ) { cHandler * handler = reinterpret_cast(hnd); delete handler; } /************************************************************** * slave_discover_resources *************************************************************/ SaErrorT oh_discover_resources( void * hnd ) { cHandler * handler = reinterpret_cast(hnd); bool rc = handler->WaitForDiscovery(); return rc ? SA_OK : SA_ERR_HPI_ERROR; } /************************************************************** * slave_set_resource_tag *************************************************************/ SaErrorT oh_set_resource_tag( void * hnd, SaHpiResourceIdT id, SaHpiTextBufferT * tag ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiResourceTagSet, rv, slave_id, tag ); return rv; } /************************************************************** * slave_set_resource_severity *************************************************************/ SaErrorT oh_set_resource_severity( void * hnd, SaHpiResourceIdT id, SaHpiSeverityT sev ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiResourceSeveritySet, rv, slave_id, sev ); return rv; } /************************************************************** * slave_resource_failed_remove *************************************************************/ SaErrorT oh_resource_failed_remove( void * hnd, SaHpiResourceIdT id ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiResourceFailedRemove, rv, slave_id ); return rv; } /************************************************************** * slave_get_el_info *************************************************************/ SaErrorT oh_get_el_info( void * hnd, SaHpiResourceIdT id, SaHpiEventLogInfoT * info ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiEventLogInfoGet, rv, slave_id, info ); return rv; } /************************************************************** * slave_get_el_caps *************************************************************/ SaErrorT oh_get_el_caps( void * hnd, SaHpiResourceIdT id, SaHpiEventLogCapabilitiesT * caps ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiEventLogCapabilitiesGet, rv, slave_id, caps ); return rv; } /************************************************************** * slave_set_el_time *************************************************************/ SaErrorT oh_set_el_time( void * hnd, SaHpiResourceIdT id, SaHpiTimeT time ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiEventLogTimeSet, rv, slave_id, time ); return rv; } /************************************************************** * slave_add_el_entry *************************************************************/ SaErrorT oh_add_el_entry( void * hnd, SaHpiResourceIdT id, const SaHpiEventT * event ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; // Workaround for const event pointer SaHpiEventT event2 = *event; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiEventLogEntryAdd, rv, slave_id, &event2 ); return rv; } /************************************************************** * slave_get_el_entry *************************************************************/ SaErrorT oh_get_el_entry( void * hnd, SaHpiResourceIdT id, SaHpiEventLogEntryIdT current, SaHpiEventLogEntryIdT * prev, SaHpiEventLogEntryIdT * next, SaHpiEventLogEntryT * entry, SaHpiRdrT * rdr, SaHpiRptEntryT * rpte ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiEventLogEntryGet, rv, slave_id, current, prev, next, entry, rdr, rpte ); if ( rv == SA_OK ) { const SaHpiEntityPathT& root = handler->GetRoot(); SaHpiResourceIdT master_src = handler->GetMaster( entry->Event.Source ); Slave::TranslateEvent( entry->Event, master_src ); Slave::TranslateRdr( *rdr, root ); if ( Slave::IsRptEntryValid( *rpte ) ) { SaHpiResourceIdT master_rpte = handler->GetMaster( rpte->ResourceId ); Slave::TranslateRptEntry( *rpte, master_rpte, root ); } } return rv; } /************************************************************** * slave_clear_el *************************************************************/ SaErrorT oh_clear_el( void * hnd, SaHpiResourceIdT id ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiEventLogClear, rv, slave_id ); return rv; } /************************************************************** * slave_set_el_state *************************************************************/ SaErrorT oh_set_el_state( void * hnd, SaHpiResourceIdT id, SaHpiBoolT e ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiEventLogStateSet, rv, slave_id, e ); return rv; } /************************************************************** * slave_reset_el_overflow *************************************************************/ SaErrorT oh_reset_el_overflow( void * hnd, SaHpiResourceIdT id ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiEventLogOverflowReset, rv, slave_id ); return rv; } /************************************************************** * slave_get_sensor_reading *************************************************************/ SaErrorT oh_get_sensor_reading( void * hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiSensorReadingT * reading, SaHpiEventStateT * state ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiSensorReadingGet, rv, slave_id, num, reading, state ); return rv; } /************************************************************** * slave_get_sensor_thresholds *************************************************************/ SaErrorT oh_get_sensor_thresholds( void * hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiSensorThresholdsT * thres ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiSensorThresholdsGet, rv, slave_id, num, thres ); return rv; } /************************************************************** * slave_set_sensor_thresholds *************************************************************/ SaErrorT oh_set_sensor_thresholds( void * hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, const SaHpiSensorThresholdsT * thres ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; // Workaround for const thres pointer SaHpiSensorThresholdsT thres2 = *thres; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiSensorThresholdsSet, rv, slave_id, num, &thres2 ); return rv; } /************************************************************** * slave_get_sensor_enable *************************************************************/ SaErrorT oh_get_sensor_enable( void * hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiBoolT * enable ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiSensorEnableGet, rv, slave_id, num, enable ); return rv; } /************************************************************** * slave_set_sensor_enable *************************************************************/ SaErrorT oh_set_sensor_enable( void * hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiBoolT enable ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiSensorEnableSet, rv, slave_id, num, enable ); return rv; } /************************************************************** * slave_get_sensor_event_enables *************************************************************/ SaErrorT oh_get_sensor_event_enables( void * hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiBoolT * enables ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiSensorEventEnableGet, rv, slave_id, num, enables ); return rv; } /************************************************************** * slave_set_sensor_event_enables *************************************************************/ SaErrorT oh_set_sensor_event_enables( void * hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, const SaHpiBoolT enables ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiSensorEventEnableSet, rv, slave_id, num, enables ); return rv; } /************************************************************** * slave_get_sensor_event_masks *************************************************************/ SaErrorT oh_get_sensor_event_masks( void * hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiEventStateT * AssertEventMask, SaHpiEventStateT * DeassertEventMask ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiSensorEventMasksGet, rv, slave_id, num, AssertEventMask, DeassertEventMask ); return rv; } /************************************************************** * slave_set_sensor_event_masks *************************************************************/ SaErrorT oh_set_sensor_event_masks( void * hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiSensorEventMaskActionT act, SaHpiEventStateT AssertEventMask, SaHpiEventStateT DeassertEventMask ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiSensorEventMasksSet, rv, slave_id, num, act, AssertEventMask, DeassertEventMask ); return rv; } /************************************************************** * slave_get_control_state *************************************************************/ SaErrorT oh_get_control_state( void * hnd, SaHpiResourceIdT id, SaHpiCtrlNumT num, SaHpiCtrlModeT * mode, SaHpiCtrlStateT * state ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiControlGet, rv, slave_id, num, mode, state ); return rv; } /************************************************************** * slave_set_control_state *************************************************************/ SaErrorT oh_set_control_state( void * hnd, SaHpiResourceIdT id, SaHpiCtrlNumT num, SaHpiCtrlModeT mode, SaHpiCtrlStateT * state ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiControlSet, rv, slave_id, num, mode, state ); return rv; } /************************************************************** * slave_get_idr_info *************************************************************/ SaErrorT oh_get_idr_info( void * hnd, SaHpiResourceIdT id, SaHpiIdrIdT idrid, SaHpiIdrInfoT * idrinfo ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiIdrInfoGet, rv, slave_id, idrid, idrinfo ); return rv; } /************************************************************** * slave_get_idr_area_header *************************************************************/ SaErrorT oh_get_idr_area_header( void * hnd, SaHpiResourceIdT id, SaHpiIdrIdT idrid, SaHpiIdrAreaTypeT areatype, SaHpiEntryIdT areaid, SaHpiEntryIdT * nextareaid, SaHpiIdrAreaHeaderT * header ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiIdrAreaHeaderGet, rv, slave_id, idrid, areatype, areaid, nextareaid, header ); return rv; } /************************************************************** * slave_add_idr_area *************************************************************/ SaErrorT oh_add_idr_area( void * hnd, SaHpiResourceIdT id, SaHpiIdrIdT idrid, SaHpiIdrAreaTypeT areatype, SaHpiEntryIdT * areaid ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiIdrAreaAdd, rv, slave_id, idrid, areatype, areaid ); return rv; } /************************************************************** * slave_add_idr_area_id *************************************************************/ SaErrorT oh_add_idr_area_id( void * hnd, SaHpiResourceIdT id, SaHpiIdrIdT idrid, SaHpiIdrAreaTypeT areatype, SaHpiEntryIdT areaid ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiIdrAreaAddById, rv, slave_id, idrid, areatype, areaid ); return rv; } /************************************************************** * slave_del_idr_area *************************************************************/ SaErrorT oh_del_idr_area( void * hnd, SaHpiResourceIdT id, SaHpiIdrIdT idrid, SaHpiEntryIdT areaid ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiIdrAreaDelete, rv, slave_id, idrid, areaid ); return rv; } /************************************************************** * slave_get_idr_field *************************************************************/ SaErrorT oh_get_idr_field( void * hnd, SaHpiResourceIdT id, SaHpiIdrIdT idrid, SaHpiEntryIdT areaid, SaHpiIdrFieldTypeT fieldtype, SaHpiEntryIdT fieldid, SaHpiEntryIdT * nextfieldid, SaHpiIdrFieldT * field ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiIdrFieldGet, rv, slave_id, idrid, areaid, fieldtype, fieldid, nextfieldid, field ); return rv; } /************************************************************** * slave_add_idr_field *************************************************************/ SaErrorT oh_add_idr_field( void * hnd, SaHpiResourceIdT id, SaHpiIdrIdT idrid, SaHpiIdrFieldT * field ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiIdrFieldAdd, rv, slave_id, idrid, field ); return rv; } /************************************************************** * slave_add_idr_field_id *************************************************************/ SaErrorT oh_add_idr_field_id( void * hnd, SaHpiResourceIdT id, SaHpiIdrIdT idrid, SaHpiIdrFieldT * field ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiIdrFieldAddById, rv, slave_id, idrid, field ); return rv; } /************************************************************** * slave_set_idr_field *************************************************************/ SaErrorT oh_set_idr_field( void * hnd, SaHpiResourceIdT id, SaHpiIdrIdT idrid, SaHpiIdrFieldT * field ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiIdrFieldSet, rv, slave_id, idrid, field ); return rv; } /************************************************************** * slave_del_idr_field *************************************************************/ SaErrorT oh_del_idr_field( void * hnd, SaHpiResourceIdT id, SaHpiIdrIdT idrid, SaHpiEntryIdT areaid, SaHpiEntryIdT fieldid ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiIdrFieldDelete, rv, slave_id, idrid, areaid, fieldid ); return rv; } /************************************************************** * slave_get_watchdog_info *************************************************************/ SaErrorT oh_get_watchdog_info( void * hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num, SaHpiWatchdogT * wdt ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiWatchdogTimerGet, rv, slave_id, num, wdt ); return rv; } /************************************************************** * slave_set_watchdog_info *************************************************************/ SaErrorT oh_set_watchdog_info( void * hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num, SaHpiWatchdogT * wdt ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiWatchdogTimerSet, rv, slave_id, num, wdt ); return rv; } /************************************************************** * slave_reset_watchdog *************************************************************/ SaErrorT oh_reset_watchdog( void * hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiWatchdogTimerReset, rv, slave_id, num ); return rv; } /************************************************************** * slave_get_next_announce *************************************************************/ SaErrorT oh_get_next_announce( void * hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiSeverityT sev, SaHpiBoolT ack, SaHpiAnnouncementT * ann ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiAnnunciatorGetNext, rv, slave_id, num, sev, ack, ann ); if ( rv == SA_OK ) { SaHpiResourceIdT master_rid; master_rid = handler->GetMaster( ann->StatusCond.ResourceId ); Slave::TranslateAnnouncement( *ann, master_rid, handler->GetRoot() ); } return rv; } /************************************************************** * slave_get_announce *************************************************************/ SaErrorT oh_get_announce( void * hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiEntryIdT annid, SaHpiAnnouncementT * ann ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiAnnunciatorGet, rv, slave_id, num, annid, ann ); if ( rv == SA_OK ) { SaHpiResourceIdT master_rid; master_rid = handler->GetMaster( ann->StatusCond.ResourceId ); Slave::TranslateAnnouncement( *ann, master_rid, handler->GetRoot() ); } return rv; } /************************************************************** * slave_ack_announce *************************************************************/ SaErrorT oh_ack_announce( void * hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiEntryIdT annid, SaHpiSeverityT sev ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiAnnunciatorAcknowledge, rv, slave_id, num, annid, sev ); return rv; } /************************************************************** * slave_add_announce *************************************************************/ SaErrorT oh_add_announce( void * hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiAnnouncementT * ann ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiAnnunciatorAdd, rv, slave_id, num, ann ); return rv; } /************************************************************** * slave_del_announce *************************************************************/ SaErrorT oh_del_announce( void * hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiEntryIdT annid, SaHpiSeverityT sev ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiAnnunciatorDelete, rv, slave_id, num, annid, sev ); return rv; } /************************************************************** * slave_get_annunc_mode *************************************************************/ SaErrorT oh_get_annunc_mode( void * hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiAnnunciatorModeT * mode ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiAnnunciatorModeGet, rv, slave_id, num, mode ); return rv; } /************************************************************** * slave_set_annunc_mode *************************************************************/ SaErrorT oh_set_annunc_mode( void * hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiAnnunciatorModeT mode ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiAnnunciatorModeSet, rv, slave_id, num, mode ); return rv; } /************************************************************** * slave_get_dimi_info *************************************************************/ SaErrorT oh_get_dimi_info( void * hnd, SaHpiResourceIdT id, SaHpiDimiNumT num, SaHpiDimiInfoT * info ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiDimiInfoGet, rv, slave_id, num, info ); return rv; } /************************************************************** * slave_get_dimi_test *************************************************************/ SaErrorT oh_get_dimi_test( void * hnd, SaHpiResourceIdT id, SaHpiDimiNumT num, SaHpiDimiTestNumT testnum, SaHpiDimiTestT * test ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiDimiTestInfoGet, rv, slave_id, num, testnum, test ); if ( rv == SA_OK ) { Slave::TranslateDimiTest( *test, handler->GetRoot() ); } return rv; } /************************************************************** * slave_get_dimi_test_ready *************************************************************/ SaErrorT oh_get_dimi_test_ready( void * hnd, SaHpiResourceIdT id, SaHpiDimiNumT num, SaHpiDimiTestNumT testnum, SaHpiDimiReadyT * ready ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiDimiTestReadinessGet, rv, slave_id, num, testnum, ready ); return rv; } /************************************************************** * slave_start_dimi_test *************************************************************/ SaErrorT oh_start_dimi_test( void * hnd, SaHpiResourceIdT id, SaHpiDimiNumT num, SaHpiDimiTestNumT testnum, SaHpiUint8T numparams, SaHpiDimiTestVariableParamsT * paramslist ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiDimiTestStart, rv, slave_id, num, testnum, numparams, paramslist ); return rv; } /************************************************************** * slave_cancel_dimi_test *************************************************************/ SaErrorT oh_cancel_dimi_test( void * hnd, SaHpiResourceIdT id, SaHpiDimiNumT num, SaHpiDimiTestNumT testnum ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiDimiTestCancel, rv, slave_id, num, testnum ); return rv; } /************************************************************** * slave_get_dimi_test_status *************************************************************/ SaErrorT oh_get_dimi_test_status( void * hnd, SaHpiResourceIdT id, SaHpiDimiNumT num, SaHpiDimiTestNumT testnum, SaHpiDimiTestPercentCompletedT * percentcompleted, SaHpiDimiTestRunStatusT * runstatus ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiDimiTestStatusGet, rv, slave_id, num, testnum, percentcompleted, runstatus ); return rv; } /************************************************************** * slave_get_dimi_test_results *************************************************************/ SaErrorT oh_get_dimi_test_results( void * hnd, SaHpiResourceIdT id, SaHpiDimiNumT num, SaHpiDimiTestNumT testnum, SaHpiDimiTestResultsT * testresults ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiDimiTestResultsGet, rv, slave_id, num, testnum, testresults ); return rv; } /************************************************************** * slave_get_fumi_spec *************************************************************/ SaErrorT oh_get_fumi_spec( void * hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiFumiSpecInfoT * specinfo ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiFumiSpecInfoGet, rv, slave_id, num, specinfo ); return rv; } /************************************************************** * slave_get_fumi_service_impact *************************************************************/ SaErrorT oh_get_fumi_service_impact( void * hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiFumiServiceImpactDataT * serviceimpact ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiFumiServiceImpactGet, rv, slave_id, num, serviceimpact ); if ( rv == SA_OK ) { for ( unsigned int i = 0; i < serviceimpact->NumEntities; ++i ) { Slave::TranslateFumiServiceImpact( *serviceimpact, handler->GetRoot() ); } } return rv; } /************************************************************** * slave_set_fumi_source *************************************************************/ SaErrorT oh_set_fumi_source( void * hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiTextBufferT * sourceuri ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiFumiSourceSet, rv, slave_id, num, banknum, sourceuri ); return rv; } /************************************************************** * slave_validate_fumi_source *************************************************************/ SaErrorT oh_validate_fumi_source( void * hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT banknum ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiFumiSourceInfoValidateStart, rv, slave_id, num, banknum ); return rv; } /************************************************************** * slave_get_fumi_source *************************************************************/ SaErrorT oh_get_fumi_source( void * hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiFumiSourceInfoT * sourceinfo ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiFumiSourceInfoGet, rv, slave_id, num, banknum, sourceinfo ); return rv; } /************************************************************** * slave_get_fumi_source_component *************************************************************/ SaErrorT oh_get_fumi_source_component( void * hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiEntryIdT compid, SaHpiEntryIdT * nextcompid, SaHpiFumiComponentInfoT * compinfo ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiFumiSourceComponentInfoGet, rv, slave_id, num, banknum, compid, nextcompid, compinfo ); return rv; } /************************************************************** * slave_get_fumi_target *************************************************************/ SaErrorT oh_get_fumi_target( void * hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiFumiBankInfoT * bankinfo ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiFumiTargetInfoGet, rv, slave_id, num, banknum, bankinfo ); return rv; } /************************************************************** * slave_get_fumi_target_component *************************************************************/ SaErrorT oh_get_fumi_target_component( void * hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiEntryIdT compid, SaHpiEntryIdT * nextcompid, SaHpiFumiComponentInfoT * compinfo ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiFumiTargetComponentInfoGet, rv, slave_id, num, banknum, compid, nextcompid, compinfo ); return rv; } /************************************************************** * slave_get_fumi_logical_target *************************************************************/ SaErrorT oh_get_fumi_logical_target( void * hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiFumiLogicalBankInfoT * bankinfo ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiFumiLogicalTargetInfoGet, rv, slave_id, num, bankinfo ); return rv; } /************************************************************** * slave_get_fumi_logical_target_component *************************************************************/ SaErrorT oh_get_fumi_logical_target_component( void * hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiEntryIdT compid, SaHpiEntryIdT * nextcompid, SaHpiFumiLogicalComponentInfoT * compinfo ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiFumiLogicalTargetComponentInfoGet, rv, slave_id, num, compid, nextcompid, compinfo ); return rv; } /************************************************************** * slave_start_fumi_backup *************************************************************/ SaErrorT oh_start_fumi_backup( void * hnd, SaHpiResourceIdT id, SaHpiFumiNumT num ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiFumiBackupStart, rv, slave_id, num ); return rv; } /************************************************************** * slave_set_fumi_bank_order *************************************************************/ SaErrorT oh_set_fumi_bank_order( void * hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiUint32T position ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiFumiBankBootOrderSet, rv, slave_id, num, banknum, position ); return rv; } /************************************************************** * slave_start_fumi_bank_copy *************************************************************/ SaErrorT oh_start_fumi_bank_copy( void * hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT sourcebanknum, SaHpiBankNumT targetbanknum ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiFumiBankCopyStart, rv, slave_id, num, sourcebanknum, targetbanknum ); return rv; } /************************************************************** * slave_start_fumi_install *************************************************************/ SaErrorT oh_start_fumi_install( void * hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT banknum ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiFumiInstallStart, rv, slave_id, num, banknum ); return rv; } /************************************************************** * slave_get_fumi_status *************************************************************/ SaErrorT oh_get_fumi_status( void * hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiFumiUpgradeStatusT * status ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiFumiUpgradeStatusGet, rv, slave_id, num, banknum, status ); return rv; } /************************************************************** * slave_start_fumi_verify *************************************************************/ SaErrorT oh_start_fumi_verify( void * hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT banknum ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiFumiTargetVerifyStart, rv, slave_id, num, banknum ); return rv; } /************************************************************** * slave_start_fumi_verify_main *************************************************************/ SaErrorT oh_start_fumi_verify_main( void * hnd, SaHpiResourceIdT id, SaHpiFumiNumT num ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiFumiTargetVerifyMainStart, rv, slave_id, num ); return rv; } /************************************************************** * slave_cancel_fumi_upgrade *************************************************************/ SaErrorT oh_cancel_fumi_upgrade( void * hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT banknum ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiFumiUpgradeCancel, rv, slave_id, num, banknum ); return rv; } /************************************************************** * slave_get_fumi_autorollback_disable *************************************************************/ SaErrorT oh_get_fumi_autorollback_disable( void * hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBoolT * disable ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiFumiAutoRollbackDisableGet, rv, slave_id, num, disable ); return rv; } /************************************************************** * slave_set_fumi_autorollback_disable *************************************************************/ SaErrorT oh_set_fumi_autorollback_disable( void * hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBoolT disable ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiFumiAutoRollbackDisableSet, rv, slave_id, num, disable ); return rv; } /************************************************************** * slave_start_fumi_rollback *************************************************************/ SaErrorT oh_start_fumi_rollback( void * hnd, SaHpiResourceIdT id, SaHpiFumiNumT num ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiFumiRollbackStart, rv, slave_id, num ); return rv; } /************************************************************** * slave_activate_fumi *************************************************************/ SaErrorT oh_activate_fumi( void * hnd, SaHpiResourceIdT id, SaHpiFumiNumT num ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiFumiActivate, rv, slave_id, num ); return rv; } /************************************************************** * slave_start_fumi_activate *************************************************************/ SaErrorT oh_start_fumi_activate( void * hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBoolT logical ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiFumiActivateStart, rv, slave_id, num, logical ); return rv; } /************************************************************** * slave_cleanup_fumi *************************************************************/ SaErrorT oh_cleanup_fumi( void * hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT banknum ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiFumiCleanup, rv, slave_id, num, banknum ); return rv; } /************************************************************** * slave_hotswap_policy_cancel *************************************************************/ SaErrorT oh_hotswap_policy_cancel( void * hnd, SaHpiResourceIdT id, SaHpiTimeoutT timeout ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; // TODO timeout GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiHotSwapPolicyCancel, rv, slave_id ); return rv; } /************************************************************** * slave_set_autoinsert_timeout *************************************************************/ SaErrorT oh_set_autoinsert_timeout( void * hnd, SaHpiTimeoutT timeout ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; CALL_ABI( handler, saHpiAutoInsertTimeoutSet, rv, timeout ); return rv; } /************************************************************** * slave_get_autoextract_timeout *************************************************************/ SaErrorT oh_get_autoextract_timeout( void * hnd, SaHpiResourceIdT id, SaHpiTimeoutT * timeout ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiAutoExtractTimeoutGet, rv, slave_id, timeout ); return rv; } /************************************************************** * slave_set_autoextract_timeout *************************************************************/ SaErrorT oh_set_autoextract_timeout( void * hnd, SaHpiResourceIdT id, SaHpiTimeoutT timeout ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiAutoExtractTimeoutSet, rv, slave_id, timeout ); return rv; } /************************************************************** * slave_get_hotswap_state *************************************************************/ SaErrorT oh_get_hotswap_state( void * hnd, SaHpiResourceIdT id, SaHpiHsStateT * state ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiHotSwapStateGet, rv, slave_id, state ); return rv; } /************************************************************** * slave_set_hotswap_state *************************************************************/ SaErrorT oh_set_hotswap_state( void * hnd, SaHpiResourceIdT id, SaHpiHsStateT state ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); if ( state == SAHPI_HS_STATE_ACTIVE ) { CALL_ABI( handler, saHpiResourceActiveSet, rv, slave_id ); } else if ( state == SAHPI_HS_STATE_INACTIVE ) { CALL_ABI( handler, saHpiResourceInactiveSet, rv, slave_id ); } else { rv = SA_ERR_HPI_INVALID_PARAMS; } return rv; } /************************************************************** * slave_request_hotswap_action *************************************************************/ SaErrorT oh_request_hotswap_action( void * hnd, SaHpiResourceIdT id, SaHpiHsActionT act ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiHotSwapActionRequest, rv, slave_id, act ); return rv; } /************************************************************** * slave_get_indicator_state *************************************************************/ SaErrorT oh_get_indicator_state( void * hnd, SaHpiResourceIdT id, SaHpiHsIndicatorStateT * state ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiHotSwapIndicatorStateGet, rv, slave_id, state ); return rv; } /************************************************************** * slave_set_indicator_state *************************************************************/ SaErrorT oh_set_indicator_state( void * hnd, SaHpiResourceIdT id, SaHpiHsIndicatorStateT state ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiHotSwapIndicatorStateSet, rv, slave_id, state ); return rv; } /************************************************************** * slave_get_power_state *************************************************************/ SaErrorT oh_get_power_state( void * hnd, SaHpiResourceIdT id, SaHpiPowerStateT * state ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiResourcePowerStateGet, rv, slave_id, state ); return rv; } /************************************************************** * slave_set_power_state *************************************************************/ SaErrorT oh_set_power_state( void * hnd, SaHpiResourceIdT id, SaHpiPowerStateT state ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiResourcePowerStateSet, rv, slave_id, state ); return rv; } /************************************************************** * slave_control_parm *************************************************************/ SaErrorT oh_control_parm( void * hnd, SaHpiResourceIdT id, SaHpiParmActionT act ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiParmControl, rv, slave_id, act ); return rv; } /************************************************************** * slave_load_id_get *************************************************************/ SaErrorT oh_load_id_get( void * hnd, SaHpiResourceIdT id, SaHpiLoadIdT * load_id ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiResourceLoadIdGet, rv, slave_id, load_id ); return rv; } /************************************************************** * slave_load_id_set *************************************************************/ SaErrorT oh_load_id_set( void * hnd, SaHpiResourceIdT id, SaHpiLoadIdT * load_id ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiResourceLoadIdSet, rv, slave_id, load_id ); return rv; } /************************************************************** * slave_get_reset_state *************************************************************/ SaErrorT oh_get_reset_state( void * hnd, SaHpiResourceIdT id, SaHpiResetActionT * act ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiResourceResetStateGet, rv, slave_id, act ); return rv; } /************************************************************** * slave_set_reset_state *************************************************************/ SaErrorT oh_set_reset_state( void * hnd, SaHpiResourceIdT id, SaHpiResetActionT act ) { cHandler * handler = reinterpret_cast(hnd); SaErrorT rv; SaHpiResourceIdT slave_id; GET_SLAVE( handler, id, slave_id ); CALL_ABI( handler, saHpiResourceResetStateSet, rv, slave_id, act ); return rv; } openhpi-3.6.1/plugins/slave/resourcemap.cpp0000644000175100017510000000622212575647277020027 0ustar mohanmohan/* -*- linux-c++ -*- * * (C) Copyright Pigeon Point Systems. 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #include "resourcemap.h" namespace Slave { /************************************************************** * class cResourceMap *************************************************************/ cResourceMap::cResourceMap() { // empty } cResourceMap::~cResourceMap() { // empty } bool cResourceMap::IsSlaveKnown( SaHpiResourceIdT slave_rid ) const { if ( slave_rid == SAHPI_UNSPECIFIED_RESOURCE_ID ) { return true; } cLocker locker( m_lock ); OneWayMap::const_iterator iter = m_master_rids.find( slave_rid ); return ( iter != m_master_rids.end() ); } void cResourceMap::AddEntry( SaHpiResourceIdT master_rid, SaHpiResourceIdT slave_rid ) { if ( master_rid == SAHPI_UNSPECIFIED_RESOURCE_ID ) { return; } if ( slave_rid == SAHPI_UNSPECIFIED_RESOURCE_ID ) { return; } cLocker locker( m_lock ); m_master_rids[slave_rid] = master_rid; m_slave_rids[master_rid] = slave_rid; } void cResourceMap::RemoveEntry( SaHpiResourceIdT slave_rid ) { if ( slave_rid == SAHPI_UNSPECIFIED_RESOURCE_ID ) { return; } cLocker locker( m_lock ); OneWayMap::iterator iter = m_master_rids.find( slave_rid ); if ( iter != m_master_rids.end() ) { SaHpiResourceIdT master_rid = iter->second; m_slave_rids.erase( master_rid ); m_master_rids.erase( iter ); } } void cResourceMap::TakeEntriesAway( std::vector& entries ) { cLocker locker( m_lock ); ResourceMapEntry entry; OneWayMap::const_iterator iter, end; for ( iter = m_master_rids.begin(), end = m_master_rids.end(); iter != end; ++iter ) { entry.slave_rid = iter->first; entry.master_rid = iter->second; entries.push_back( entry ); } m_slave_rids.clear(); m_master_rids.clear(); } SaHpiResourceIdT cResourceMap::GetMaster( SaHpiResourceIdT slave_rid ) const { if ( slave_rid == SAHPI_UNSPECIFIED_RESOURCE_ID ) { return SAHPI_UNSPECIFIED_RESOURCE_ID; } cLocker locker( m_lock ); OneWayMap::const_iterator iter = m_master_rids.find( slave_rid ); if ( iter != m_master_rids.end() ) { return iter->second; } else { return SAHPI_UNSPECIFIED_RESOURCE_ID; } } SaHpiResourceIdT cResourceMap::GetSlave( SaHpiResourceIdT master_rid ) const { if ( master_rid == SAHPI_UNSPECIFIED_RESOURCE_ID ) { return SAHPI_UNSPECIFIED_RESOURCE_ID; } cLocker locker( m_lock ); OneWayMap::const_iterator iter = m_slave_rids.find( master_rid ); if ( iter != m_slave_rids.end() ) { return iter->second; } else { return SAHPI_UNSPECIFIED_RESOURCE_ID; } } }; // namespace Slave openhpi-3.6.1/plugins/slave/handler.h0000644000175100017510000000664612575647277016576 0ustar mohanmohan/* -*- linux-c++ -*- * * (C) Copyright Pigeon Point Systems. 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #ifndef __HANDLER_H__ #define __HANDLER_H__ #include #include #include #include #include #include "baselib.h" #include "lock.h" #include "resourcemap.h" namespace Slave { /************************************************************** * class cHandler *************************************************************/ class cHandler : public cBaseLib, public cResourceMap { public: explicit cHandler( unsigned int id, const SaHpiEntityPathT& root, const std::string& host, unsigned short port, oh_evt_queue& eventq ); ~cHandler(); bool Init(); bool WaitForDiscovery(); const SaHpiEntityPathT& GetRoot() const { return m_root; } SaHpiSessionIdT GetSessionId() const { return m_sid; } private: cHandler( const cHandler& ); cHandler& operator =( const cHandler& ); SaHpiResourceIdT GetOrCreateMaster( const SaHpiRptEntryT& slave_rpte ); bool StartThread(); static gpointer ThreadProcAdapter( gpointer data ); void ThreadProc(); bool OpenSession(); bool CloseSession(); bool Discover(); void RemoveAllResources(); bool ReceiveEvent( struct oh_event *& e ); void HandleEvent( struct oh_event * e ); SaHpiUint32T GetRptUpdateCounter() const; SaHpiUint32T GetRdrUpdateCounter( SaHpiResourceIdT slave_rid ) const; bool FetchRptAndRdrs( std::queue& events ) const; bool FetchRdrs( struct oh_event * e ) const; void CompleteAndPostEvent( struct oh_event * e, SaHpiResourceIdT master_rid, bool set_timestamp ); void CompleteAndPostResourceUpdateEvent( struct oh_event * e, SaHpiResourceIdT master_rid ); // constants static const SaHpiSessionIdT InvalidSessionId = 0xFFFFFFFF; static const SaHpiTimeoutT DiscoveryStatusCheckInterval = 500000000ULL; static const SaHpiTimeoutT OpenSessionRetryInterval = 5000000000ULL; static const unsigned int MaxFetchAttempts = 42; static const SaHpiTimeoutT GetEventTimeout = 5000000000ULL; enum eStartupDiscoveryStatus { StartupDiscoveryUncompleted, StartupDiscoveryFailed, StartupDiscoveryDone, }; // data unsigned int m_id; SaHpiEntityPathT m_root; SaHpiTextBufferT m_host; unsigned short m_port; SaHpiDomainIdT m_did; volatile SaHpiSessionIdT m_sid; oh_evt_queue& m_eventq; volatile bool m_stop; GThread * m_thread; volatile eStartupDiscoveryStatus m_startup_discovery_status; }; }; // namespace Slave #endif // __HANDLER_H__ openhpi-3.6.1/plugins/slave/version.rc0000644000175100017510000000161112575647277017006 0ustar mohanmohan#include LANGUAGE 0x09,0x01 // English(US) VS_VERSION_INFO VERSIONINFO FILEVERSION BINARY_VERSION PRODUCTVERSION BINARY_VERSION FILEFLAGSMASK 0 FILEFLAGS 0 FILEOS VOS_NT_WINDOWS32 FILETYPE VFT_DLL FILESUBTYPE VFT2_UNKNOWN BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904E4" // English(US), Multilingual BEGIN VALUE "Comments", "" VALUE "CompanyName", "OpenHPI Community (http://openhpi.org/)" VALUE "FileDescription", "OpenHPI Slave Plug-in" VALUE "FileVersion", VERSION VALUE "InternalName", "libslave" VALUE "LegalCopyright", "OpenHPI is distributed under BSD license" VALUE "OriginalFilename", "libslave.dll" VALUE "ProductName", "OpenHPI" VALUE "ProductVersion", VERSION END END END openhpi-3.6.1/plugins/slave/lock.h0000644000175100017510000000334712575647277016104 0ustar mohanmohan/* -*- linux-c++ -*- * * (C) Copyright Pigeon Point Systems. 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #ifndef __LOCK_H__ #define __LOCK_H__ #include namespace Slave { /************************************************************** * class cLock *************************************************************/ class cLock { public: friend class cLocker; explicit cLock() { m_mutex = g_mutex_new(); } ~cLock() { g_mutex_free( m_mutex ); } void Lock() { g_mutex_lock( m_mutex ); } void Unlock() { g_mutex_unlock( m_mutex ); } private: cLock( const cLock& ); cLock& operator =( const cLock& ); // data GMutex * m_mutex; }; /************************************************************** * class cLocker *************************************************************/ class cLocker { public: explicit cLocker( GMutex * mutex ) : m_mutex( mutex ) { g_mutex_lock( m_mutex ); } explicit cLocker( cLock& lock ) : m_mutex( lock.m_mutex ) { g_mutex_lock( m_mutex ); } ~cLocker() { g_mutex_unlock( m_mutex ); } private: cLocker( const cLocker& ); cLocker& operator =( const cLocker& ); // data GMutex * m_mutex; }; }; // namespace Slave #endif // __LOCK_H__ openhpi-3.6.1/plugins/slave/slave.h0000644000175100017510000003121312575647277016257 0ustar mohanmohan/* -*- linux-c++ -*- * * (C) Copyright Pigeon Point Systems. 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #include extern "C" { /************************************************************** * Slave plugin interface *************************************************************/ void * oh_open( GHashTable * handler_config, unsigned int hid, oh_evt_queue * eventq ); void oh_close( void * hnd ); SaErrorT oh_discover_resources( void * hnd ); SaErrorT oh_set_resource_tag( void * hnd, SaHpiResourceIdT id, SaHpiTextBufferT * tag ); SaErrorT oh_set_resource_severity( void * hnd, SaHpiResourceIdT id, SaHpiSeverityT sev ); SaErrorT oh_resource_failed_remove( void * hnd, SaHpiResourceIdT id ); SaErrorT oh_get_el_info( void * hnd, SaHpiResourceIdT id, SaHpiEventLogInfoT * info ); SaErrorT oh_get_el_caps( void * hnd, SaHpiResourceIdT id, SaHpiEventLogCapabilitiesT * caps ); SaErrorT oh_set_el_time( void * hnd, SaHpiResourceIdT id, SaHpiTimeT time ); SaErrorT oh_add_el_entry( void * hnd, SaHpiResourceIdT id, const SaHpiEventT * event ); SaErrorT oh_get_el_entry( void * hnd, SaHpiResourceIdT id, SaHpiEventLogEntryIdT current, SaHpiEventLogEntryIdT * prev, SaHpiEventLogEntryIdT * next, SaHpiEventLogEntryT * entry, SaHpiRdrT * rdr, SaHpiRptEntryT * rpte ); SaErrorT oh_clear_el( void * hnd, SaHpiResourceIdT id ); SaErrorT oh_set_el_state( void * hnd, SaHpiResourceIdT id, SaHpiBoolT e ); SaErrorT oh_reset_el_overflow( void * hnd, SaHpiResourceIdT id ); SaErrorT oh_get_sensor_reading( void * hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiSensorReadingT * reading, SaHpiEventStateT * state ); SaErrorT oh_get_sensor_thresholds( void * hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiSensorThresholdsT * thres ); SaErrorT oh_set_sensor_thresholds( void * hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, const SaHpiSensorThresholdsT * thres ); SaErrorT oh_get_sensor_enable( void * hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiBoolT * enable ); SaErrorT oh_set_sensor_enable( void * hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiBoolT enable ); SaErrorT oh_get_sensor_event_enables( void * hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiBoolT * enables ); SaErrorT oh_set_sensor_event_enables( void * hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, const SaHpiBoolT enables ); SaErrorT oh_get_sensor_event_masks( void * hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiEventStateT * AssertEventMask, SaHpiEventStateT * DeassertEventMask ); SaErrorT oh_set_sensor_event_masks( void * hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiSensorEventMaskActionT act, SaHpiEventStateT AssertEventMask, SaHpiEventStateT DeassertEventMask ); SaErrorT oh_get_control_state( void * hnd, SaHpiResourceIdT id, SaHpiCtrlNumT num, SaHpiCtrlModeT * mode, SaHpiCtrlStateT * state ); SaErrorT oh_set_control_state( void * hnd, SaHpiResourceIdT id, SaHpiCtrlNumT num, SaHpiCtrlModeT mode, SaHpiCtrlStateT * state ); SaErrorT oh_get_idr_info( void * hnd, SaHpiResourceIdT id, SaHpiIdrIdT idrid, SaHpiIdrInfoT * idrinfo ); SaErrorT oh_get_idr_area_header( void * hnd, SaHpiResourceIdT id, SaHpiIdrIdT idrid, SaHpiIdrAreaTypeT areatype, SaHpiEntryIdT areaid, SaHpiEntryIdT * nextareaid, SaHpiIdrAreaHeaderT * header ); SaErrorT oh_add_idr_area( void * hnd, SaHpiResourceIdT id, SaHpiIdrIdT idrid, SaHpiIdrAreaTypeT areatype, SaHpiEntryIdT * areaid ); SaErrorT oh_add_idr_area_id( void * hnd, SaHpiResourceIdT id, SaHpiIdrIdT idrid, SaHpiIdrAreaTypeT areatype, SaHpiEntryIdT areaid ); SaErrorT oh_del_idr_area( void * hnd, SaHpiResourceIdT id, SaHpiIdrIdT idrid, SaHpiEntryIdT areaid ); SaErrorT oh_get_idr_field( void * hnd, SaHpiResourceIdT id, SaHpiIdrIdT idrid, SaHpiEntryIdT areaid, SaHpiIdrFieldTypeT fieldtype, SaHpiEntryIdT fieldid, SaHpiEntryIdT * nextfieldid, SaHpiIdrFieldT * field ); SaErrorT oh_add_idr_field( void * hnd, SaHpiResourceIdT id, SaHpiIdrIdT idrid, SaHpiIdrFieldT * field ); SaErrorT oh_add_idr_field_id( void * hnd, SaHpiResourceIdT id, SaHpiIdrIdT idrid, SaHpiIdrFieldT * field ); SaErrorT oh_set_idr_field( void * hnd, SaHpiResourceIdT id, SaHpiIdrIdT idrid, SaHpiIdrFieldT * field ); SaErrorT oh_del_idr_field( void * hnd, SaHpiResourceIdT id, SaHpiIdrIdT idrid, SaHpiEntryIdT areaid, SaHpiEntryIdT fieldid ); SaErrorT oh_get_watchdog_info( void * hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num, SaHpiWatchdogT * wdt ); SaErrorT oh_set_watchdog_info( void * hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num, SaHpiWatchdogT * wdt ); SaErrorT oh_reset_watchdog( void * hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num ); SaErrorT oh_get_next_announce( void * hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiSeverityT sev, SaHpiBoolT ack, SaHpiAnnouncementT * ann ); SaErrorT oh_get_announce( void * hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiEntryIdT annid, SaHpiAnnouncementT * ann ); SaErrorT oh_ack_announce( void * hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiEntryIdT annid, SaHpiSeverityT sev ); SaErrorT oh_add_announce( void * hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiAnnouncementT * ann ); SaErrorT oh_del_announce( void * hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiEntryIdT annid, SaHpiSeverityT sev ); SaErrorT oh_get_annunc_mode( void * hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiAnnunciatorModeT * mode ); SaErrorT oh_set_annunc_mode( void * hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiAnnunciatorModeT mode ); SaErrorT oh_get_dimi_info( void * hnd, SaHpiResourceIdT id, SaHpiDimiNumT num, SaHpiDimiInfoT * info ); SaErrorT oh_get_dimi_test( void * hnd, SaHpiResourceIdT id, SaHpiDimiNumT num, SaHpiDimiTestNumT testnum, SaHpiDimiTestT * test ); SaErrorT oh_get_dimi_test_ready( void * hnd, SaHpiResourceIdT id, SaHpiDimiNumT num, SaHpiDimiTestNumT testnum, SaHpiDimiReadyT * ready ); SaErrorT oh_start_dimi_test( void * hnd, SaHpiResourceIdT id, SaHpiDimiNumT num, SaHpiDimiTestNumT testnum, SaHpiUint8T numparams, SaHpiDimiTestVariableParamsT * paramslist ); SaErrorT oh_cancel_dimi_test( void * hnd, SaHpiResourceIdT id, SaHpiDimiNumT num, SaHpiDimiTestNumT testnum ); SaErrorT oh_get_dimi_test_status( void * hnd, SaHpiResourceIdT id, SaHpiDimiNumT num, SaHpiDimiTestNumT testnum, SaHpiDimiTestPercentCompletedT * percentcompleted, SaHpiDimiTestRunStatusT * runstatus ); SaErrorT oh_get_dimi_test_results( void * hnd, SaHpiResourceIdT id, SaHpiDimiNumT num, SaHpiDimiTestNumT testnum, SaHpiDimiTestResultsT * testresults ); SaErrorT oh_get_fumi_spec( void * hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiFumiSpecInfoT * specinfo ); SaErrorT oh_get_fumi_service_impact( void * hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiFumiServiceImpactDataT * serviceimpact ); SaErrorT oh_set_fumi_source( void * hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiTextBufferT * sourceuri ); SaErrorT oh_validate_fumi_source( void * hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT banknum ); SaErrorT oh_get_fumi_source( void * hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiFumiSourceInfoT * sourceinfo ); SaErrorT oh_get_fumi_source_component( void * hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiEntryIdT compid, SaHpiEntryIdT * nextcompid, SaHpiFumiComponentInfoT * compinfo ); SaErrorT oh_get_fumi_target( void * hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiFumiBankInfoT * bankinfo ); SaErrorT oh_get_fumi_target_component( void * hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiEntryIdT compid, SaHpiEntryIdT * nextcompid, SaHpiFumiComponentInfoT * compinfo ); SaErrorT oh_get_fumi_logical_target( void * hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiFumiLogicalBankInfoT * bankinfo ); SaErrorT oh_get_fumi_logical_target_component( void * hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiEntryIdT compid, SaHpiEntryIdT * nextcompid, SaHpiFumiLogicalComponentInfoT * compinfo ); SaErrorT oh_start_fumi_backup( void * hnd, SaHpiResourceIdT id, SaHpiFumiNumT num ); SaErrorT oh_set_fumi_bank_order( void * hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiUint32T position ); SaErrorT oh_start_fumi_bank_copy( void * hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT sourcebanknum, SaHpiBankNumT targetbanknum ); SaErrorT oh_start_fumi_install( void * hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT banknum ); SaErrorT oh_get_fumi_status( void * hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiFumiUpgradeStatusT * status ); SaErrorT oh_start_fumi_verify( void * hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT banknum ); SaErrorT oh_start_fumi_verify_main( void * hnd, SaHpiResourceIdT id, SaHpiFumiNumT num ); SaErrorT oh_cancel_fumi_upgrade( void * hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT banknum ); SaErrorT oh_get_fumi_autorollback_disable( void * hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBoolT * disable ); SaErrorT oh_set_fumi_autorollback_disable( void * hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBoolT disable ); SaErrorT oh_start_fumi_rollback( void * hnd, SaHpiResourceIdT id, SaHpiFumiNumT num ); SaErrorT oh_activate_fumi( void * hnd, SaHpiResourceIdT id, SaHpiFumiNumT num ); SaErrorT oh_start_fumi_activate( void * hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBoolT logical ); SaErrorT oh_cleanup_fumi( void * hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT banknum ); SaErrorT oh_hotswap_policy_cancel( void * hnd, SaHpiResourceIdT id, SaHpiTimeoutT timeout ); SaErrorT oh_set_autoinsert_timeout( void * hnd, SaHpiTimeoutT timeout ); SaErrorT oh_get_autoextract_timeout( void * hnd, SaHpiResourceIdT id, SaHpiTimeoutT * timeout ); SaErrorT oh_set_autoextract_timeout( void * hnd, SaHpiResourceIdT id, SaHpiTimeoutT timeout ); SaErrorT oh_get_hotswap_state( void * hnd, SaHpiResourceIdT id, SaHpiHsStateT * state ); SaErrorT oh_set_hotswap_state( void * hnd, SaHpiResourceIdT id, SaHpiHsStateT state ); SaErrorT oh_request_hotswap_action( void * hnd, SaHpiResourceIdT id, SaHpiHsActionT act ); SaErrorT oh_get_indicator_state( void * hnd, SaHpiResourceIdT id, SaHpiHsIndicatorStateT * state ); SaErrorT oh_set_indicator_state( void * hnd, SaHpiResourceIdT id, SaHpiHsIndicatorStateT state ); SaErrorT oh_get_power_state( void * hnd, SaHpiResourceIdT id, SaHpiPowerStateT * state ); SaErrorT oh_set_power_state( void * hnd, SaHpiResourceIdT id, SaHpiPowerStateT state ); SaErrorT oh_control_parm( void * hnd, SaHpiResourceIdT id, SaHpiParmActionT act ); SaErrorT oh_load_id_get( void * hnd, SaHpiResourceIdT id, SaHpiLoadIdT * load_id ); SaErrorT oh_load_id_set( void * hnd, SaHpiResourceIdT id, SaHpiLoadIdT * load_id ); SaErrorT oh_get_reset_state( void * hnd, SaHpiResourceIdT id, SaHpiResetActionT * act ); SaErrorT oh_set_reset_state( void * hnd, SaHpiResourceIdT id, SaHpiResetActionT act ); }; // extern "C" openhpi-3.6.1/plugins/ipmidirect/0000755000175100017510000000000012605014554015767 5ustar mohanmohanopenhpi-3.6.1/plugins/ipmidirect/ipmi_event.h0000644000175100017510000000403412575647277020324 0ustar mohanmohan/* * * Copyright (c) 2003 by FORCE Computers * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #ifndef dIpmiEvent_h #define dIpmiEvent_h #ifndef dIpmiLog_h #include "ipmi_log.h" #endif enum tIpmiEventType { eIpmiEventData0 = 0, eIpmiEventData1, eIpmiEventData2, eIpmiEventData3 }; // Event types and directions for sensors. enum tIpmiThresh { eIpmiLowerNonCritical = 0, eIpmiLowerCritical, eIpmiLowerNonRecoverable, eIpmiUpperNonCritical, eIpmiUpperCritical, eIpmiUpperNonRecoverable }; const char *IpmiThresToString( tIpmiThresh val ); void IpmiThresholdMaskToString( unsigned int mask, char *str ); // The event state is which events are set and cleared for the given // sensor. Events are enumerated for threshold events and numbered // for discrete events. Use the provided functions to initialize, // read, and modify an event state. #define dIpmiSensorEventsEnabled 0x80 #define dIpmiSensorScanningEnabled 0x40 #define dIpmiSensorBusy 0x20 // Maximum amount of data allowed in a SEL. #define dIpmiMaxSelData 13 class cIpmiMc; // An entry from the system event log. class cIpmiEvent { public: cIpmiMc *m_mc; // The MC this event is stored in. unsigned int m_record_id; unsigned int m_type; unsigned char m_data[dIpmiMaxSelData]; public: cIpmiEvent(); int Cmp( const cIpmiEvent &event ) const; void Dump( cIpmiLog &dump, const char *name ) const; }; #endif openhpi-3.6.1/plugins/ipmidirect/ipmi_resource.h0000644000175100017510000000736212575647277021041 0ustar mohanmohan/* * ipmi_resource.h * * Copyright (c) 2004 by FORCE Computers. * Copyright (c) 2005 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #ifndef dIpmiResource_h #define dIpmiResource_h #ifndef dIpmiSensorHotswap_h #include "ipmi_sensor_hotswap.h" #endif #ifndef dIpmiControl_h #include "ipmi_control.h" #endif #ifndef dArray_h #include "array.h" #endif #ifndef dIpmiCon_h #include "ipmi_con.h" #endif class cIpmiResource : cArray { public: bool m_sel; // true if this is a resource, // which provides access to SEL // find a specific rdr cIpmiRdr *FindRdr( cIpmiMc *mc, SaHpiRdrTypeT type, unsigned int num, unsigned int lun = 0, unsigned int sa = 0x20 ); cIpmiRdr *FindRdr( cIpmiMc *mc, SaHpiRdrTypeT type, cIpmiRdr *rdr ); bool AddRdr( cIpmiRdr *rdr ); bool RemRdr( cIpmiRdr *rdr ); int FindRdr( cIpmiRdr *rdr ) { return Find( rdr ); } int NumRdr() { return Num(); } cIpmiRdr *GetRdr( int idx ) { return operator[]( idx ); } protected: cIpmiMc *m_mc; unsigned int m_fru_id; cIpmiEntityPath m_entity_path; bool m_is_fru; cIpmiSensorHotswap *m_hotswap_sensor; // state only to create state change Mx -> M0 // where Mx is m_picmg_fru_state tIpmiFruState m_picmg_fru_state; bool m_policy_canceled; SaHpiTimeoutT m_extract_timeout; tIpmiFruState m_prev_prev_fru_state; unsigned int m_oem; // mapping of sensor numbers int m_sensor_num[256]; public: int CreateSensorNum( SaHpiSensorNumT num ); public: cIpmiMc *Mc() const { return m_mc; } unsigned int FruId() const { return m_fru_id; } tIpmiFruState &PicmgFruState() { return m_picmg_fru_state; } bool &PolicyCanceled() { return m_policy_canceled; } SaHpiTimeoutT &ExtractTimeout() { return m_extract_timeout; } tIpmiFruState &PreviousPrevFruState() { return m_prev_prev_fru_state; } cIpmiDomain *Domain() const; unsigned int &Oem() { return m_oem; } cIpmiEntityPath &EntityPath() { return m_entity_path; } bool &IsFru() { return m_is_fru; } protected: cIpmiTextBuffer m_resource_tag; public: cIpmiTextBuffer &ResourceTag() { return m_resource_tag; } public: cIpmiResource( cIpmiMc *mc, unsigned int fru_id ); virtual ~cIpmiResource(); public: // return hotswap sensor if there is one cIpmiSensorHotswap *GetHotswapSensor() { return m_hotswap_sensor; } protected: unsigned int m_current_control_id; public: // get a unique control num for this resource unsigned int GetControlNum() { return ++m_current_control_id; } // HPI resource id SaHpiResourceIdT m_resource_id; virtual bool Create( SaHpiRptEntryT &entry ); virtual void Destroy(); SaErrorT SendCommand( const cIpmiMsg &msg, cIpmiMsg &rsp, unsigned int lun = 0, int retries = dIpmiDefaultRetries ); SaErrorT SendCommandReadLock( cIpmiRdr *rdr, const cIpmiMsg &msg, cIpmiMsg &rsp, unsigned int lun = 0, int retries = dIpmiDefaultRetries ); SaErrorT SendCommandReadLock( const cIpmiMsg &msg, cIpmiMsg &rsp, unsigned int lun = 0, int retries = dIpmiDefaultRetries ); void Activate(); void Deactivate(); SaHpiHsStateT GetHpiState(); private: bool m_populate; public: // create and populate hpi resource virtual bool Populate(); }; #endif openhpi-3.6.1/plugins/ipmidirect/ipmi_mc.h0000644000175100017510000001343012575647277017602 0ustar mohanmohan/* * * Copyright (c) 2003,2004 by FORCE Computers * Copyright (c) 2005 by ESO Technologies. * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #ifndef dIpmiMc_h #define dIpmiMc_h #include #include #ifndef dIpmiSdr_h #include "ipmi_sdr.h" #endif #ifndef dIpmiAddr_h #include "ipmi_addr.h" #endif #ifndef dIpmiMsg_h #include "ipmi_msg.h" #endif #ifndef dIpmiSensorHotswap_h #include "ipmi_sensor_hotswap.h" #endif #ifndef dIpmiSel_h #include "ipmi_sel.h" #endif #ifndef dIpmiCon_h #include "ipmi_con.h" #endif #ifndef dIpmiMcVendor_h #include "ipmi_mc_vendor.h" #endif #ifndef dIpmiInventory_h #include "ipmi_inventory.h" #endif class cIpmiDomain; class cIpmiMcThread; class cIpmiMc : cArray { protected: cIpmiMcVendor *m_vendor; cIpmiAddr m_addr; // If the MC is known to be good in the system, then active is // true. If active is false, that means that there are sensors // that refer to this MC, but the MC is not currently in the // system. bool m_active; cIpmiDomain *m_domain; cIpmiSdrs *m_sdrs; // The sensors that came from the device SDR on this MC. GList *m_sensors_in_my_sdr; // The system event log, for querying and storing events. cIpmiSel *m_sel; // PICMG version for ATCA boards unsigned char m_picmg_major; unsigned char m_picmg_minor; // The rest is the actual data from the get device id and SDRs. unsigned char m_device_id; unsigned char m_device_revision; bool m_provides_device_sdrs; bool m_device_available; unsigned char m_device_support; bool m_chassis_support; bool m_bridge_support; bool m_ipmb_event_generator_support; bool m_ipmb_event_receiver_support; bool m_fru_inventory_support; bool m_sel_device_support; bool m_sdr_repository_support; bool m_sensor_device_support; unsigned char m_major_fw_revision; unsigned char m_minor_fw_revision; unsigned char m_major_version; unsigned char m_minor_version; unsigned int m_manufacturer_id; unsigned short m_product_id; unsigned char m_aux_fw_revision[4]; bool m_is_tca_mc; bool m_is_rms_board; SaErrorT SendSetEventRcvr( unsigned int addr ); public: void AddResource( cIpmiResource *res ); void RemResource( cIpmiResource *res ); cIpmiResource *FindResource( const cIpmiEntityPath &ep ); cIpmiResource *FindResource( cIpmiResource *res ); cIpmiResource *GetResource( int i ); int NumResources() const { return Num(); } public: cIpmiMc( cIpmiDomain *domain, const cIpmiAddr &addr ); virtual ~cIpmiMc(); cIpmiDomain *Domain() const { return m_domain; } unsigned char DeviceRevision() const { return m_device_revision; } unsigned char DeviceSupport() const { return m_device_support; } unsigned char MajorFwRevision() const { return m_major_fw_revision; } unsigned char MinorFwRevision() const { return m_minor_fw_revision; } unsigned char MajorVersion() const { return m_major_version; } unsigned char MinorVersion() const { return m_minor_version; } unsigned int ManufacturerId() const { return m_manufacturer_id; } unsigned short ProductId() const { return m_product_id; } unsigned char AuxFwRevision( int v ) const { if ( v >= 0 && v < 4 ) return m_aux_fw_revision[v]; else return 0; } const cIpmiAddr &Addr() { return m_addr; } void CheckTca(); bool IsTcaMc() { return m_is_tca_mc; } bool &IsRmsBoard() { return m_is_rms_board; } void SetSel( bool sel ) { m_sel_device_support = sel; } cIpmiSensorHotswap *FindHotswapSensor(); GList *GetSdrSensors() const { return m_sensors_in_my_sdr; } void SetSdrSensors( GList *sensors ) { m_sensors_in_my_sdr = sensors; } bool ProvidesDeviceSdrs() const { return m_provides_device_sdrs; } void SetProvidesDeviceSdrs(bool val) { m_provides_device_sdrs = val; } bool &SdrRepositorySupport() { return m_sdr_repository_support; } bool SelDeviceSupport() const { return m_sel_device_support; } cIpmiSel *Sel() const { return m_sel; } bool Cleanup(); // true => it is safe to destroy mc SaErrorT HandleNew(); bool DeviceDataCompares( const cIpmiMsg &msg ) const; int GetDeviceIdDataFromRsp( const cIpmiMsg &msg ); void CheckEventRcvr(); SaErrorT SendCommand( const cIpmiMsg &msg, cIpmiMsg &rsp_msg, unsigned int lun = 0, int retries = dIpmiDefaultRetries ); unsigned int GetChannel() const; unsigned int GetAddress() const; void SetActive(); cIpmiSensor *FindSensor( unsigned int lun, unsigned int sensor_id, unsigned int sa ); cIpmiRdr *FindRdr( cIpmiRdr *r ); void SetVendor( cIpmiMcVendor *mv ) { if ( mv ) m_vendor = mv; } cIpmiMcVendor *GetVendor() { return m_vendor; } protected: bool DumpFrus( cIpmiLog &dump, const char *name ) const; bool DumpControls( cIpmiLog &dump, const char *name ) const; public: void Dump( cIpmiLog &dump, const char *name ) const; // create and populate resources and rdrs virtual bool Populate(); }; #endif openhpi-3.6.1/plugins/ipmidirect/ipmi_mc_vendor_intel.h0000644000175100017510000000527112575647277022356 0ustar mohanmohan/* * Intel specific code * * Copyright (c) 2004-2006 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Andy Cress */ #ifndef dIpmiMcVendorIntel_h #define dIpmiMcVendorIntel_h #ifndef dIpmiMcVendor_h #include "ipmi_mc_vendor.h" #endif #ifndef dIpmiControl_h #include "ipmi_control.h" #endif #define OEM_ALARM_BASE 0x10 #define LED_POWER 0 #define LED_CRIT 1 #define LED_MAJOR 2 #define LED_MINOR 3 #define LED_IDENT 4 #define PRIVATE_BUS_ID 0x03 // w Sahalee, the 8574 is on Private Bus 1 #define PRIVATE_BUS_ID5 0x05 // for Intel TIGI2U #define PRIVATE_BUS_ID7 0x07 // for Intel Harbison #define PERIPHERAL_BUS_ID 0x24 // w mBMC, the 8574 is on the Peripheral Bus #define ALARMS_PANEL_WRITE 0x40 #define ALARMS_PANEL_READ 0x41 #define DISK_LED_WRITE 0x44 // only used for Chesnee mBMC #define DISK_LED_READ 0x45 // only used for Chesnee mBMC #define NETFN_PICMG 0x2c #define PICMG_GET_LED_PROPERTIES 0x05 #define PICMG_SET_LED_STATE 0x07 #define PICMG_GET_LED_STATE 0x08 class cIpmiControlIntelRmsLed : public cIpmiControl { protected: public: cIpmiControlIntelRmsLed( cIpmiMc *mc, unsigned int num ); virtual ~cIpmiControlIntelRmsLed(); virtual bool CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ); virtual SaErrorT GetState( SaHpiCtrlModeT &mode, SaHpiCtrlStateT &state ); virtual SaErrorT SetState( const SaHpiCtrlModeT &mode, const SaHpiCtrlStateT &state ); virtual void Dump( cIpmiLog &dump, const char *name ) const; unsigned char m_busid; private: unsigned char GetAlarms(); int SetAlarms(unsigned char val); int SetIdentify(unsigned char tval); unsigned char GetAlarmsPicmg(unsigned char picmg_id, unsigned char fruid); int SetAlarmsPicmg(unsigned char picmg_id, unsigned char fruid, unsigned char val); }; class cIpmiMcVendorIntelBmc : public cIpmiMcVendor { public: cIpmiMcVendorIntelBmc( unsigned int product_id ); virtual ~cIpmiMcVendorIntelBmc(); virtual bool InitMc( cIpmiMc *mc, const cIpmiMsg &devid ); bool ProcessSdr( cIpmiDomain *domain, cIpmiMc *mc, cIpmiSdrs *sdrs ); bool ProcessFru( cIpmiInventory *inv, cIpmiMc *mc, unsigned int sa, SaHpiEntityTypeT type); bool CreateControls( cIpmiDomain *domain, cIpmiMc *mc, cIpmiSdrs *sdrs ); unsigned char m_busid; private: }; #endif openhpi-3.6.1/plugins/ipmidirect/ipmi_sensor.cpp0000644000175100017510000005120612575647277021052 0ustar mohanmohan/* * ipmi_sensor.cpp * * Copyright (c) 2003,2004 by FORCE Computers * Copyright (c) 2005 by ESO Technologies. * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #include #include #include #include #include #include #include #include "ipmi_domain.h" #include "ipmi_mc.h" #include "ipmi_sensor.h" #include "ipmi_entity.h" #include "ipmi_utils.h" #include "ipmi_text_buffer.h" static const char *sensor_types[] = { "Unspecified", "Temperature", "Voltage", "Current", "Fan", "PhysicalSecurity", "PlatformSecurity", "Processor", "PowerSupply", "PowerUnit", "CoolingDevice", "OtherUnitsBasedSensor", "Memory", "DriveSlot", "PowerMemoryResize", "SystemFirmwareProgress", "EventLoggingDisabled", "Watchdog1", "SystemEvent", "CriticalInterrupt", "Button", "ModuleBoard", "MicrocontrollerCoprocessor", "AddInCard", "Chassis", "ChipSet", "OtherFru", "CableInterconnect", "Terminator", "SystemBootInitiated", "BootError", "OsBoot", "OsCriticalStop", "SlotConnector", "SystemAcpiPowerState", "Watchdog2", "PlatformAlert", "EntityPresense", "MonitorAsicIc", "Lan", "ManagementSubsystemHealth", "Battery" }; const char * IpmiSensorTypeToString( tIpmiSensorType val ) { if ( val > eIpmiSensorTypeBattery ) { if ( val == eIpmiSensorTypeAtcaHotSwap ) return "AtcaHotswap"; if ( val == eIpmiSensorTypeAtcaIpmb ) return "AtcaIpmb"; return "Invalid"; } return sensor_types[val]; } static const char *event_support_types[] = { "PerState", "EntireSensor", "GlobalDisable", "None", }; const char * IpmiEventSupportToString( tIpmiEventSupport val ) { if ( val > eIpmiEventSupportNone ) return "Invalid"; return event_support_types[val]; } static const char *event_reading_types[] = { "Unspecified", "Threshold", "DiscreteUsage", "DiscreteState", "DiscretePredictiveFailure", "DiscreteLimitExceeded", "DiscretePerformanceMet", "DiscreteSeverity", "DiscreteDevicePresense", "DiscreteDeviceEnable", "DiscreteAvailability", "DiscreteRedundancy", "DiscreteAcpiPower", }; const char * IpmiEventReadingTypeToString( tIpmiEventReadingType val ) { if ( val == eIpmiEventReadingTypeSensorSpecific ) return "SensorSpecific"; if (( val >= eIpmiEventReadingTypeOemFirst ) && ( val <= eIpmiEventReadingTypeOemLast )) return "Oem"; if ( val > eIpmiEventReadingTypeDiscreteAcpiPower ) return "Invalid"; return event_reading_types[val]; } cIpmiSensor::cIpmiSensor( cIpmiMc *mc ) : cIpmiRdr( mc, SAHPI_SENSOR_RDR ), m_source_mc( 0 ), m_destroyed( false ), m_use_count( 0 ), m_owner( 0 ), m_channel( 0 ), m_num( 0 ), m_sensor_init_scanning( false ), m_sensor_init_events( false ), m_sensor_init_type( false ), m_sensor_init_pu_events( false ), m_sensor_init_pu_scanning( false ), m_ignore_if_no_entity( false ), m_supports_auto_rearm( false ), m_assertion_event_mask( 0 ), m_deassertion_event_mask( 0 ), m_reading_mask( 0 ), m_enabled( SAHPI_TRUE ), m_event_support( eIpmiEventSupportPerState ), m_sensor_type( eIpmiSensorTypeInvalid ), m_event_reading_type( eIpmiEventReadingTypeInvalid ), m_oem( 0 ), m_sensor_type_string( 0 ), m_event_reading_type_string( 0 ), m_rate_unit_string( 0 ), m_base_unit_string( 0 ), m_modifier_unit_string( 0 ), m_sdr( 0 ) { } cIpmiSensor::~cIpmiSensor() { } bool cIpmiSensor::GetDataFromSdr( cIpmiMc *mc, cIpmiSdr *sdr ) { m_use_count = 1; m_destroyed = false; m_mc = mc; m_source_mc = mc; m_sdr_type = sdr->m_data[3]; /*or sdr->m_type; */ m_owner = sdr->m_data[5]; m_channel = sdr->m_data[6] >> 4; m_lun = sdr->m_data[6] & 0x03; m_num = sdr->m_data[7]; m_sensor_init_scanning = (sdr->m_data[10] >> 6) & 1; m_sensor_init_events = (sdr->m_data[10] >> 5) & 1; if ( m_sensor_init_events ) m_events_enabled = SAHPI_TRUE; else m_events_enabled = SAHPI_FALSE; m_sensor_init_type = (sdr->m_data[10] >> 2) & 1; m_sensor_init_pu_events = (sdr->m_data[10] >> 1) & 1; m_sensor_init_pu_scanning = (sdr->m_data[10] >> 0) & 1; m_ignore_if_no_entity = (sdr->m_data[11] >> 7) & 1; m_supports_auto_rearm = (sdr->m_data[11] >> 6) & 1; m_event_support = (tIpmiEventSupport)(sdr->m_data[11] & 3); m_sensor_type = (tIpmiSensorType)sdr->m_data[12]; m_event_reading_type = (tIpmiEventReadingType)(sdr->m_data[13] & 0x7f); m_oem = sdr->m_data[46]; IdString().SetIpmi( sdr->m_data+47 ); if ( m_owner != mc->GetAddress() ) stdlog << "WARNING : SDR " << sdr->m_record_id << " sensor " << m_num << " slave address " << m_owner << " NOT equal to MC slave address " << (unsigned char)mc->GetAddress() << "\n"; if ( m_channel != mc->GetChannel() ) stdlog << "WARNING : SDR " << sdr->m_record_id << " sensor " << m_num << " channel " << m_channel << " NOT equal to MC channel " << (unsigned short)mc->GetChannel() << "\n"; return true; } void cIpmiSensor::HandleNew( cIpmiDomain *domain ) { m_sensor_type_string = IpmiSensorTypeToString( m_sensor_type ); m_event_reading_type_string = IpmiEventReadingTypeToString( m_event_reading_type ); } bool cIpmiSensor::Cmp( const cIpmiSensor &s2 ) const { if ( m_entity_path != s2.m_entity_path ) return false; if ( m_sensor_init_scanning != s2.m_sensor_init_scanning ) return false; if ( m_sensor_init_events != s2.m_sensor_init_events ) return false; if ( m_sensor_init_type != s2.m_sensor_init_type ) return false; if ( m_sensor_init_pu_events != s2.m_sensor_init_pu_events ) return false; if ( m_sensor_init_pu_scanning != s2.m_sensor_init_pu_scanning ) return false; if ( m_ignore_if_no_entity != s2.m_ignore_if_no_entity ) return false; if ( m_supports_auto_rearm != s2.m_supports_auto_rearm ) return false; if ( m_event_support != s2.m_event_support ) return false; if ( m_sensor_type != s2.m_sensor_type ) return false; if ( m_event_reading_type != s2.m_event_reading_type ) return false; if ( m_oem != s2.m_oem ) return false; if ( IdString() != s2.IdString() ) return false; return true; } void cIpmiSensor::Dump( cIpmiLog &dump ) const { char str[256]; IdString().GetAscii( str, 256 ); dump << "Sensor: " << m_num << " " << str << "\n"; } bool cIpmiSensor::CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ) { if ( cIpmiRdr::CreateRdr( resource, rdr ) == false ) return false; // update resource resource.ResourceCapabilities |= SAHPI_CAPABILITY_RDR|SAHPI_CAPABILITY_SENSOR; // sensor record SaHpiSensorRecT &rec = rdr.RdrTypeUnion.SensorRec; int v = Resource()->CreateSensorNum( Num() ); if ( v == -1 ) { stdlog << "too many sensors (> 255) for a resource !\n"; assert( v != -1 ); return false; } /* IPMI sensors have a unique index, a number, and a slave addr. * We need to save the real number and slave addr so that FindRdr * will always work properly. */ SetSNum(Num()); SetSa(m_owner); m_virtual_num = v; rec.Num = v; rec.Type = HpiSensorType(SensorType()); rec.Category = HpiEventCategory(EventReadingType()); rec.Oem = GetOem(); switch( EventSupport() ) { case eIpmiEventSupportPerState: m_event_control = SAHPI_SEC_PER_EVENT; break; case eIpmiEventSupportEntireSensor: case eIpmiEventSupportGlobalEnable: m_event_control = SAHPI_SEC_READ_ONLY_MASKS; break; case eIpmiEventSupportNone: m_event_control = SAHPI_SEC_READ_ONLY; break; } rec.Events = m_reading_mask; rec.EventCtrl = m_event_control; rec.EnableCtrl = SAHPI_TRUE; return true; } SaErrorT cIpmiSensor::GetSensorData( cIpmiMsg &rsp ) { unsigned char sa, chan = 0; unsigned char n = m_num; if (m_channel != 0) { /* Get sensor reading for ME/NM has diff channel */ chan = m_channel; sa = m_owner; } else sa = dIpmiBmcSlaveAddr; cIpmiMsg msg( eIpmiNetfnSensorEvent, eIpmiCmdGetSensorReading, 1,&n, sa,chan); if (m_sdr_type == eSdrTypeEventOnlySensorRecord) { /* EventOnly sensors do not support readings, so just return 0 */ memset(rsp.m_data,0,5); rsp.m_data_len = 5; return SA_OK; } SaErrorT rv = Resource()->SendCommandReadLock( this, msg, rsp, m_lun ); if ( rv != SA_OK ) { stdlog << "IPMI error getting states: " << rv << " \n"; return rv; } if ( rsp.m_data[0] != 0 ) { stdlog << "IPMI error getting " << m_num << " reading: " << rsp.m_data[0] << " !\n"; return SA_ERR_HPI_INVALID_DATA; } if ( rsp.m_data_len < 4 ) { stdlog << "IPMI error getting reading: data too small " << rsp.m_data_len << " !\n"; return SA_ERR_HPI_INVALID_DATA; } if ( (m_sdr_type == eSdrTypeFullSensorRecord) && ((rsp.m_data[2] & 0x20) != 0) ) { stdlog << "IPMI sensor " << m_num << " is in Init state\n"; return SA_ERR_HPI_INVALID_REQUEST; } return SA_OK; } SaErrorT cIpmiSensor::GetEnable( SaHpiBoolT &enable ) { enable = m_enabled; return SA_OK; } SaErrorT cIpmiSensor::SetEnable( const SaHpiBoolT &enable ) { if (m_enabled == enable) return SA_OK; m_enabled = enable; CreateEnableChangeEvent(); return SA_OK; } SaErrorT cIpmiSensor::GetEventEnables( SaHpiBoolT &enables ) { SaErrorT rv = GetEventEnableHw( m_events_enabled ); enables = m_events_enabled; return rv; } SaErrorT cIpmiSensor::SetEventEnables( const SaHpiBoolT &enables ) { if ( m_event_control == SAHPI_SEC_READ_ONLY ) return SA_ERR_HPI_READ_ONLY; if ( m_events_enabled == enables ) return SA_OK; m_events_enabled = enables; SaErrorT rv = SetEventEnableHw( m_events_enabled ); if ( rv == SA_OK ) CreateEnableChangeEvent(); return rv; } SaErrorT cIpmiSensor::GetEventMasks( SaHpiEventStateT &AssertEventMask, SaHpiEventStateT &DeassertEventMask ) { SaErrorT rv = GetEventMasksHw( m_current_hpi_assert_mask, m_current_hpi_deassert_mask ); stdlog << "GetEventMasks sensor " << m_num << " assert " << m_current_hpi_assert_mask << " deassert " << m_current_hpi_deassert_mask << "\n"; if (&AssertEventMask) AssertEventMask = m_current_hpi_assert_mask; if (&DeassertEventMask) DeassertEventMask = m_current_hpi_deassert_mask; return rv; } SaErrorT cIpmiSensor::SetEventMasks( const SaHpiSensorEventMaskActionT &act, SaHpiEventStateT &AssertEventMask, SaHpiEventStateT &DeassertEventMask ) { if ( m_event_control != SAHPI_SEC_PER_EVENT ) return SA_ERR_HPI_READ_ONLY; if ( AssertEventMask == SAHPI_ALL_EVENT_STATES ) AssertEventMask = m_hpi_assert_mask; if ( DeassertEventMask == SAHPI_ALL_EVENT_STATES ) DeassertEventMask = m_hpi_deassert_mask; if ( act == SAHPI_SENS_ADD_EVENTS_TO_MASKS ) { if ((( AssertEventMask & ~m_hpi_assert_mask ) != 0 ) || (( DeassertEventMask & ~m_hpi_deassert_mask ) != 0 )) return SA_ERR_HPI_INVALID_DATA; } SaHpiEventStateT save_assert_mask = m_current_hpi_assert_mask; SaHpiEventStateT save_deassert_mask = m_current_hpi_deassert_mask; if ( act == SAHPI_SENS_ADD_EVENTS_TO_MASKS ) { m_current_hpi_assert_mask |= AssertEventMask; m_current_hpi_deassert_mask |= DeassertEventMask; } else if ( act == SAHPI_SENS_REMOVE_EVENTS_FROM_MASKS ) { m_current_hpi_assert_mask &= (AssertEventMask ^ SAHPI_ALL_EVENT_STATES); m_current_hpi_deassert_mask &= (DeassertEventMask ^ SAHPI_ALL_EVENT_STATES); } else return SA_ERR_HPI_INVALID_PARAMS; stdlog << "SetEventMasks sensor " << m_num << " assert " << m_current_hpi_assert_mask << " deassert " << m_current_hpi_deassert_mask << "\n"; if (( save_assert_mask == m_current_hpi_assert_mask ) && ( save_deassert_mask == m_current_hpi_deassert_mask )) return SA_OK; SaErrorT rv = SetEventMasksHw( m_current_hpi_assert_mask, m_current_hpi_deassert_mask ); if ( rv == SA_OK ) CreateEnableChangeEvent(); return rv; } SaErrorT cIpmiSensor::GetEventEnableHw( SaHpiBoolT &enables ) { cIpmiMsg msg( eIpmiNetfnSensorEvent, eIpmiCmdGetSensorEventEnable ); msg.m_data_len = 1; msg.m_data[0] = m_num; cIpmiMsg rsp; stdlog << "get event enables command for sensor : " << m_num << " !\n"; SaErrorT rv = Resource()->SendCommandReadLock( this, msg, rsp, m_lun ); if ( rv != SA_OK ) { stdlog << "Error sending get event enables command: " << rv << " !\n"; return rv; } if ( rsp.m_data[0] ) { stdlog << "IPMI error getting sensor enables: " << rsp.m_data[0] << " !\n"; return SA_ERR_HPI_INVALID_CMD; } enables = (rsp.m_data[1] & 0x80) ? SAHPI_TRUE : SAHPI_FALSE; return SA_OK; } SaErrorT cIpmiSensor::SetEventEnableHw( const SaHpiBoolT &enables ) { cIpmiMsg msg; msg.m_netfn = eIpmiNetfnSensorEvent; msg.m_cmd = eIpmiCmdSetSensorEventEnable; msg.m_data[0] = m_num; msg.m_data[1] = ((m_events_enabled == SAHPI_TRUE) ? 0x80 : 0) | (1<<6); msg.m_data_len = 2; cIpmiMsg rsp; stdlog << "set event enables command for sensor : " << m_num << " !\n"; SaErrorT rv = Resource()->SendCommandReadLock( this, msg, rsp, m_lun ); if ( rv != SA_OK ) { stdlog << "Error sending set event enables command: " << rv << " !\n"; return rv; } if ( rsp.m_data[0] ) { stdlog << "IPMI error setting sensor enables: " << rsp.m_data[0] << " !\n"; return SA_ERR_HPI_INVALID_CMD; } return SA_OK; } SaErrorT cIpmiSensor::GetEventMasksHw( cIpmiMsg &rsp ) { cIpmiMsg msg( eIpmiNetfnSensorEvent, eIpmiCmdGetSensorEventEnable ); msg.m_data_len = 1; msg.m_data[0] = m_num; stdlog << "get event enables command for sensor : " << m_num << " !\n"; SaErrorT rv = Resource()->SendCommandReadLock( this, msg, rsp, m_lun ); if ( rv != SA_OK ) { stdlog << "Error sending get event enables command: " << rv << " !\n"; return rv; } if ( rsp.m_data[0] ) { stdlog << "IPMI error getting sensor enables: " << rsp.m_data[0] << " !\n"; return SA_ERR_HPI_INVALID_CMD; } return SA_OK; } SaErrorT cIpmiSensor::SetEventMasksHw( cIpmiMsg &msg, bool evt_enable) { msg.m_netfn = eIpmiNetfnSensorEvent; msg.m_cmd = eIpmiCmdSetSensorEventEnable; msg.m_data[0] = m_num; msg.m_data[1] = ((m_events_enabled == SAHPI_TRUE) ? 0x80 : 0) | (1<<6); if ( m_event_support == eIpmiEventSupportEntireSensor ) { // We can only turn on/off the entire sensor, just pass the // status to the sensor. msg.m_data_len = 2; } else { if ( evt_enable == true ) msg.m_data[1] |= (1<<4); // enable selected event messages else msg.m_data[1] |= (1<<5); // disable selected event messages msg.m_data_len = 6; } cIpmiMsg rsp; stdlog << "set event enables command for sensor : " << m_num << " !\n"; SaErrorT rv = Resource()->SendCommandReadLock( this, msg, rsp, m_lun ); if ( rv != SA_OK ) { stdlog << "Error sending set event enables command: " << rv << " !\n"; return rv; } if ( rsp.m_data[0] ) { stdlog << "IPMI error setting sensor enables: " << rsp.m_data[0] << " !\n"; return SA_ERR_HPI_INVALID_CMD; } return SA_OK; } SaHpiSensorTypeT cIpmiSensor::HpiSensorType(tIpmiSensorType sensor_type) { if ( sensor_type >= eIpmiSensorTypeOemFirst) return SAHPI_OEM_SENSOR; return (SaHpiSensorTypeT)sensor_type; } SaHpiEventCategoryT cIpmiSensor::HpiEventCategory(tIpmiEventReadingType reading_type) { if ( reading_type == eIpmiEventReadingTypeSensorSpecific ) return SAHPI_EC_SENSOR_SPECIFIC; if (( reading_type >= eIpmiEventReadingTypeOemFirst ) && ( reading_type <= eIpmiEventReadingTypeOemLast )) return SAHPI_EC_GENERIC; return (SaHpiEventCategoryT)reading_type; } void cIpmiSensor::CreateEnableChangeEvent() { cIpmiResource *res = Resource(); if( !res ) { stdlog << "CreateEnableChangeEvent: No resource !\n"; return; } oh_event *e = (oh_event *)g_malloc0( sizeof( struct oh_event ) ); e->event.EventType = SAHPI_ET_SENSOR_ENABLE_CHANGE; SaHpiRptEntryT *rptentry = oh_get_resource_by_id( res->Domain()->GetHandler()->rptcache, res->m_resource_id ); SaHpiRdrT *rdrentry = oh_get_rdr_by_id( res->Domain()->GetHandler()->rptcache, res->m_resource_id, m_record_id ); if ( rptentry ) e->resource = *rptentry; else e->resource.ResourceCapabilities = 0; if ( rdrentry ) e->rdrs = g_slist_append(e->rdrs, g_memdup(rdrentry, sizeof(SaHpiRdrT))); else e->rdrs = NULL; // hpi event e->event.Source = res->m_resource_id; e->event.EventType = SAHPI_ET_SENSOR_ENABLE_CHANGE; e->event.Severity = SAHPI_INFORMATIONAL; oh_gettimeofday(&e->event.Timestamp); // sensor enable event SaHpiSensorEnableChangeEventT *se = &e->event.EventDataUnion.SensorEnableChangeEvent; se->SensorNum = m_num; se->SensorType = HpiSensorType(SensorType()); se->EventCategory = HpiEventCategory(EventReadingType()); se->SensorEnable = m_enabled; se->SensorEventEnable = m_events_enabled; se->AssertEventMask = m_current_hpi_assert_mask; se->DeassertEventMask = m_current_hpi_deassert_mask; stdlog << "cIpmiSensor::CreateEnableChangeEvent OH_ET_HPI Event enable change resource " << res->m_resource_id << "\n"; m_mc->Domain()->AddHpiEvent( e ); return; } SaErrorT cIpmiSensor::CreateEvent( cIpmiEvent *event, SaHpiEventT &h ) { memset( &h, 0, sizeof( SaHpiEventT ) ); cIpmiResource *res = Resource(); if( !res ) { stdlog << "CreateEvent: No resource !\n"; return SA_ERR_HPI_NOT_PRESENT; } h.Source = res->m_resource_id; h.EventType = SAHPI_ET_SENSOR; h.Timestamp = (SaHpiTimeT)IpmiGetUint32( event->m_data ); if ( h.Timestamp == 0 ) h.Timestamp = SAHPI_TIME_UNSPECIFIED; else h.Timestamp *= 1000000000; // sensor event SaHpiSensorEventT &s = h.EventDataUnion.SensorEvent; s.SensorNum = m_num; s.SensorType = HpiSensorType((tIpmiSensorType)event->m_data[7]); tIpmiEventReadingType reading_type = (tIpmiEventReadingType)(event->m_data[9] & 0x7f); s.EventCategory = HpiEventCategory(reading_type); return SA_OK; } void cIpmiSensor::HandleEvent( cIpmiEvent *event ) { cIpmiResource *res = Resource(); if( !res ) { stdlog << "HandleEvent: No resource !\n"; return; } SaHpiRptEntryT *rptentry; SaHpiRdrT *rdrentry; // Sensor disabled -> ignore event if (m_enabled == SAHPI_FALSE) { stdlog << "reading event : Ignore (Sensor disabled).\n"; return; } stdlog << "reading event.\n"; oh_event *e = (oh_event *)g_malloc0( sizeof( struct oh_event ) ); rptentry = oh_get_resource_by_id( res->Domain()->GetHandler()->rptcache, res->m_resource_id ); rdrentry = oh_get_rdr_by_id( res->Domain()->GetHandler()->rptcache, res->m_resource_id, m_record_id ); if ( rptentry ) e->resource = *rptentry; else e->resource.ResourceCapabilities = 0; if ( rdrentry ) e->rdrs = g_slist_append(e->rdrs, g_memdup(rdrentry, sizeof(SaHpiRdrT))); else e->rdrs = NULL; // hpi event SaHpiEventT &he = e->event; int rv = CreateEvent( event, he ); if ( rv != SA_OK ) return; stdlog << "cIpmiSensor::HandleEvent OH_ET_HPI Event resource " << res->m_resource_id << "\n"; m_mc->Domain()->AddHpiEvent( e ); } openhpi-3.6.1/plugins/ipmidirect/ipmi_log.cpp0000644000175100017510000001465512575647277020331 0ustar mohanmohan/* * * Copyright (c) 2003,2004 by FORCE Computers. * Copyright (c) 2007 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #include #include #include #include #include #include #include #include #include #include #include "ipmi_log.h" #include "ipmi_utils.h" cIpmiLog stdlog; cIpmiLog::cIpmiLog() : m_lock_count( 0 ), m_open_count( 0 ), m_hex( false ), m_time( false ), m_recursive( false ), m_std_out( false ), m_std_err( false ) { } cIpmiLog::~cIpmiLog() { } bool cIpmiLog::Open( int properties, const char *filename, int max_log_files ) { m_open_count++; if ( m_open_count > 1 ) // already open return true; assert( m_lock_count == 0 ); if ( properties & dIpmiLogStdOut ) m_std_out = true; if ( properties & dIpmiLogStdErr ) m_std_err = true; char file[1024] = ""; if ( properties & dIpmiLogLogFile ) { char tf[1024]; int i; struct stat st1, st2; if ( filename == 0 || *filename == 0 ) { fprintf( stderr, "not filename for logfile !\n" ); return false; } // max numbers of logfiles if ( max_log_files < 1 ) max_log_files = 1; // find a new one or the oldes logfile for( i = 0; i < max_log_files; i++ ) { snprintf( tf, sizeof(tf), "%s%02d.log", filename, i ); if ( file[0] == 0 ) strcpy( file, tf ); if ( !stat( tf, &st1 ) && S_ISREG( st1. st_mode ) ) { if ( !stat( file, &st2 ) && S_ISREG( st1. st_mode ) && st2.st_mtime > st1.st_mtime ) strcpy( file, tf ); } else { strcpy( file, tf ); break; } } } if ( properties & dIpmiLogFile ) { if ( filename == 0 || *filename == 0 ) { fprintf( stderr, "not filename for logfile !\n" ); return false; } strcpy( file, filename ); } if ( file[0] ) { m_fd = fopen( file, "w" ); if ( m_fd == 0 ) { fprintf( stderr, "can not open logfile %s\n", file ); return false; } } m_nl = true; return true; } void cIpmiLog::Close() { m_open_count--; assert( m_open_count >= 0 ); if ( m_open_count > 0 ) return; assert( m_lock_count == 0 ); assert( m_nl ); if ( m_fd ) { fclose( m_fd ); m_fd = 0; } m_std_out = false; m_std_err = false; } void cIpmiLog::Output( const char *str ) { int l = strlen( str ); size_t fwrote; if ( m_fd ) fwrote = fwrite( str, l, 1, m_fd ); if ( m_std_out ) fwrote = fwrite( str, l, 1, stdout ); if ( m_std_err ) fwrote = fwrite( str, l, 1, stderr ); } void cIpmiLog::Start() { //Lock(); if ( m_nl ) { if ( m_time ) { struct timeval tv; gettimeofday( &tv, 0 ); char b[dDateTimeStringSize+5]; IpmiDateTimeToString( tv.tv_sec, b ); #if defined(__sparc) || defined(__sparc__) snprintf( b + dDateTimeStringSize - 1, 6, ".%03ld ", (long)tv.tv_usec / 1000 ); #else snprintf( b + dDateTimeStringSize - 1, 6, ".%03ld ", tv.tv_usec / 1000 ); #endif Output( b ); } } } cIpmiLog & cIpmiLog::operator<<( bool b ) { Start(); Output( b ? "true" : "false" ); return *this; } cIpmiLog & cIpmiLog::operator<<( unsigned char c ) { Start(); char b[5]; snprintf( b, sizeof(b), "0x%02x", c ); Output( b ); return *this; } cIpmiLog & cIpmiLog::operator<<( int i ) { Start(); char b[20]; snprintf( b, sizeof(b), "%d", i ); Output( b ); return *this; } cIpmiLog & cIpmiLog::operator<<( unsigned int i ) { Start(); char b[20]; if ( m_hex ) snprintf( b, sizeof(b), "0x%08x", i ); else snprintf( b, sizeof(b), "%u", i ); Output( b ); return *this; } cIpmiLog & cIpmiLog::operator<<( double d ) { Start(); char b[20]; snprintf( b, sizeof(b), "%f", d ); Output( b ); return *this; } cIpmiLog & cIpmiLog::operator<<( const char *str ) { Log( "%s", str ); return *this; } void cIpmiLog::Log( const char *fmt, ... ) { Start(); va_list ap; va_start( ap, fmt ); char b[10240]; vsnprintf( b, 10240, fmt, ap ); va_end( ap ); char buf[10240] = ""; char *p = b; char *q = buf; m_nl = false; while( *p ) { if ( *p == '\n' ) { m_nl = true; *q++ = *p++; *q = 0; Output( buf ); q = buf; continue; } m_nl = false; *q++ = *p++; } if ( q != b ) { *q = 0; Output( buf ); } if ( m_nl ) { if ( m_fd ) fflush( m_fd ); if ( m_std_out ) fflush( stdout ); if ( m_std_err ) fflush( stderr ); //while( m_lock_count > 0 ) // Unlock(); } } void cIpmiLog::Hex( const unsigned char *data, int size ) { char str[256]; char *s = str; int i, remaining; for( i = 0; i < size; i++ ) { if ( i != 0 && (i % 16) == 0 ) { Log( "%s\n", str ); s = str; } remaining = sizeof(str) - (s - str); if (remaining > 0) s += snprintf( s, remaining, " %02x", *data++ ); } if ( s != str ) Log( "%s\n", str ); } void cIpmiLog::Begin( const char *section, const char *name ) { if ( IsRecursive() ) *this << section << " \"" << name << "\"\n{\n"; } void cIpmiLog::End() { if ( IsRecursive() ) *this << "}\n\n\n"; } cIpmiLog & cIpmiLog::Entry( const char *entry ) { char str[256]; strcpy( str, entry ); int l = 30 - strlen( entry ); if ( l > 0 ) { char *p = str + strlen( entry ); while( l-- > 0 ) *p++ = ' '; *p = 0; } *this << " " << str << " = "; return *this; } openhpi-3.6.1/plugins/ipmidirect/ipmi_control.h0000644000175100017510000000274212575647277020667 0ustar mohanmohan/* * ipmi_control.h * * Copyright (c) 2004 by FORCE Computers. * Copyright (c) 2005 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #ifndef dIpmiControl_h #define dIpmiControl_h #ifndef dIpmiRdr_h #include "ipmi_rdr.h" #endif extern "C" { #include "SaHpi.h" } class cIpmiControl : public cIpmiRdr { protected: unsigned int m_num; // control num unsigned int m_oem; SaHpiCtrlOutputTypeT m_output_type; SaHpiCtrlTypeT m_type; public: cIpmiControl( cIpmiMc *mc, unsigned int num, SaHpiCtrlOutputTypeT output_type, SaHpiCtrlTypeT type ); virtual ~cIpmiControl(); virtual unsigned int Num() const { return m_num; } // create an RDR sensor record virtual bool CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ); // hpi virtual SaErrorT SetState( const SaHpiCtrlModeT &mode, const SaHpiCtrlStateT &state ) = 0; virtual SaErrorT GetState( SaHpiCtrlModeT &mode, SaHpiCtrlStateT &state ) = 0; virtual void Dump( cIpmiLog &dump, const char *name ) const = 0; }; #endif openhpi-3.6.1/plugins/ipmidirect/ipmi_inventory.cpp0000644000175100017510000001026212575647277021573 0ustar mohanmohan/* * ipmi_inventory.cpp * * Copyright (c) 2004 by FORCE Computers * Copyright (c) 2005 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #include #include #include "ipmi_domain.h" #include "ipmi_inventory.h" ////////////////////////////////////////////////// // cIpmiInventory ////////////////////////////////////////////////// cIpmiInventory::cIpmiInventory( cIpmiMc *mc, unsigned int fru_device_id ) : cIpmiRdr( mc, SAHPI_INVENTORY_RDR ), m_fru_device_id( fru_device_id ), m_access( eInventoryAccessModeByte ), m_size( 0 ), m_oem( 0 ), m_addr(eIpmiAddrTypeIpmb, mc->GetChannel(), 0,mc->GetAddress()) { } cIpmiInventory::~cIpmiInventory() { } bool cIpmiInventory::SetAddr(cIpmiAddr addr) { m_addr = addr; return true; } SaErrorT cIpmiInventory::GetFruInventoryAreaInfo( unsigned int &size, tInventoryAccessMode &byte_access ) { cIpmiMsg msg( eIpmiNetfnStorage, eIpmiCmdGetFruInventoryAreaInfo ); msg.m_data[0] = m_fru_device_id; msg.m_data_len = 1; cIpmiMsg rsp; SaErrorT rv = Domain()->SendCommand( m_addr, msg, rsp ); if ( rv != SA_OK ) { stdlog << "cannot GetFruInventoryAreaInfo: " << rv << " !\n"; return rv; } if ( rsp.m_data[0] != eIpmiCcOk ) { stdlog << "cannot GetFruInventoryAreaInfo: " << IpmiCompletionCodeToString( (tIpmiCompletionCode)rsp.m_data[0] ) << " !\n"; return SA_ERR_HPI_INVALID_PARAMS; } byte_access = (rsp.m_data[3] & 1) ? eInventoryAccessModeWord : eInventoryAccessModeByte; size = IpmiGetUint16( rsp.m_data + 1 ) >> byte_access; return SA_OK; } SaErrorT cIpmiInventory::ReadFruData( unsigned short offset, unsigned int num, unsigned int &n, unsigned char *data ) { cIpmiMsg msg( eIpmiNetfnStorage, eIpmiCmdReadFruData ); msg.m_data[0] = m_fru_device_id; IpmiSetUint16( msg.m_data + 1, offset >> m_access ); msg.m_data[3] = num >> m_access; msg.m_data_len = 4; cIpmiMsg rsp; SaErrorT rv = Domain()->SendCommand( m_addr, msg, rsp ); if ( rv != SA_OK ) { stdlog << "cannot ReadFruData: " << rv << " !\n"; return rv; } if ( rsp.m_data[0] != eIpmiCcOk ) { stdlog << "cannot ReadFruData: " << IpmiCompletionCodeToString( (tIpmiCompletionCode)rsp.m_data[0] ) << " !\n"; return SA_ERR_HPI_INVALID_PARAMS; } n = rsp.m_data[1] << m_access; if ( n < 1 ) { stdlog << "ReadFruData: read 0 bytes !\n"; return SA_ERR_HPI_INVALID_PARAMS; } memcpy( data, rsp.m_data + 2, n ); return SA_OK; } SaErrorT cIpmiInventory::Fetch() { m_fetched = false; SaErrorT rv = GetFruInventoryAreaInfo( m_size, m_access ); if ( rv != SA_OK || m_size == 0 ) return rv != SA_OK ? rv : SA_ERR_HPI_INVALID_DATA; unsigned short offset = 0; unsigned char *data = new unsigned char[m_size]; while( offset < m_size ) { unsigned int num = m_size - offset; if ( num > dMaxFruFetchBytes ) num = dMaxFruFetchBytes; unsigned int n; rv = ReadFruData( offset, num, n, data + offset ); if ( rv != SA_OK ) { delete [] data; return rv; } offset += n; } rv = ParseFruInfo( data, m_size, Num() ); delete [] data; m_fetched = ((rv != SA_OK) ? false : true); return rv; } bool cIpmiInventory::CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ) { if ( cIpmiRdr::CreateRdr( resource, rdr ) == false ) return false; // update resource resource.ResourceCapabilities |= SAHPI_CAPABILITY_RDR|SAHPI_CAPABILITY_INVENTORY_DATA; // control record SaHpiInventoryRecT &rec = rdr.RdrTypeUnion.InventoryRec; rec.IdrId = Num(); rec.Oem = m_oem; return true; } openhpi-3.6.1/plugins/ipmidirect/ipmi_watchdog.cpp0000644000175100017510000001163312575647277021341 0ustar mohanmohan/* * ipmi_watchdog.cpp * * Copyright (c) 2006-2008 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Pierre Sangouard */ #include "ipmi_watchdog.h" #include "ipmi_domain.h" cIpmiWatchdog::cIpmiWatchdog( cIpmiMc *mc, unsigned int num, unsigned int oem ) : cIpmiRdr( mc, SAHPI_WATCHDOG_RDR ), m_num( num ), m_oem( oem ) { } cIpmiWatchdog::~cIpmiWatchdog() { } bool cIpmiWatchdog::CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ) { if ( cIpmiRdr::CreateRdr( resource, rdr ) == false ) return false; // update resource resource.ResourceCapabilities |= SAHPI_CAPABILITY_RDR|SAHPI_CAPABILITY_WATCHDOG; // watchdog record SaHpiWatchdogRecT &rec = rdr.RdrTypeUnion.WatchdogRec; rec.WatchdogNum = m_num; rec.Oem = m_oem; return true; } /* * Watchdog Timer routines * - added 10/10/2006 ARCress * */ SaHpiWatchdogPretimerInterruptT WDPI2Hpi(unsigned char b) { switch(b) { case 0x10: return SAHPI_WPI_SMI; case 0x20: return SAHPI_WPI_NMI; case 0x30: return SAHPI_WPI_MESSAGE_INTERRUPT; case 0x70: return SAHPI_WPI_OEM; default: return SAHPI_WPI_NONE; } } SaHpiWatchdogTimerUseT WDTimerUse2Hpi(unsigned char b) { switch(b) { case 0: return SAHPI_WTU_NONE; case 1: return SAHPI_WTU_BIOS_FRB2; case 2: return SAHPI_WTU_BIOS_POST; case 3: return SAHPI_WTU_OS_LOAD; case 4: return SAHPI_WTU_SMS_OS; case 5: return SAHPI_WTU_OEM; default: return SAHPI_WTU_UNSPECIFIED; } } SaHpiWatchdogActionT WDAction2Hpi(unsigned char b) { switch(b) { case 0: return SAHPI_WA_NO_ACTION; case 1: return SAHPI_WA_RESET; case 2: return SAHPI_WA_POWER_DOWN; case 3: return SAHPI_WA_POWER_CYCLE; default: return SAHPI_WA_RESET; } } SaErrorT cIpmiWatchdog::GetWatchdogInfo( SaHpiWatchdogT &watchdog) { cIpmiMsg msg( eIpmiNetfnApp, eIpmiCmdGetWatchdogTimer ); cIpmiMsg rsp; SaErrorT rv; stdlog << "GetWatchdogInfo: num " << m_num << "\n"; msg.m_data_len = 0; rv = Resource()->SendCommandReadLock( msg, rsp ); if (rv != SA_OK || rsp.m_data[0] != eIpmiCcOk) { stdlog << "GetWatchdogInfo error " << rv << " cc=" << rsp.m_data[0] << "\n"; if (rv == SA_OK) rv = SA_ERR_HPI_INTERNAL_ERROR; } else { if ((rsp.m_data[1] & 0x40) == 0) watchdog.Running = 0; else watchdog.Running = 1; if ((rsp.m_data[1] & 0x80) == 0) watchdog.Log = 1; else watchdog.Log = 0; watchdog.TimerUse = WDTimerUse2Hpi(rsp.m_data[1] & 0x07); watchdog.TimerAction = WDAction2Hpi(rsp.m_data[2] & 0x07); watchdog.PretimerInterrupt = WDPI2Hpi(rsp.m_data[2] & 0x70); watchdog.PreTimeoutInterval = rsp.m_data[3] * 1000; watchdog.TimerUseExpFlags = rsp.m_data[4]; watchdog.InitialCount = (rsp.m_data[5] + (rsp.m_data[6] << 8)) * 100; watchdog.PresentCount = (rsp.m_data[7] + (rsp.m_data[8] << 8)) * 100; } return rv; } SaErrorT cIpmiWatchdog::SetWatchdogInfo( SaHpiWatchdogT &watchdog) { cIpmiMsg msg( eIpmiNetfnApp, eIpmiCmdSetWatchdogTimer ); cIpmiMsg rsp; SaErrorT rv; unsigned char blog; int tval = watchdog.InitialCount / 100; stdlog << "SetWatchdogInfo to " << watchdog.InitialCount << " msec\n"; msg.m_data_len = 6; if (watchdog.Log) blog = 0; else blog = 0x80; /* DontLog bit */ if (watchdog.TimerAction != 0) blog |= 0x40; msg.m_data[0] = blog | (watchdog.TimerUse & 0x07); msg.m_data[1] = (watchdog.TimerAction & 0x07) | ((watchdog.PretimerInterrupt & 0x07) << 4); msg.m_data[2] = (watchdog.PreTimeoutInterval / 1000); msg.m_data[3] = watchdog.TimerUseExpFlags; msg.m_data[4] = tval & 0x00ff; msg.m_data[5] = (tval & 0xff00) >> 8; rv = Resource()->SendCommandReadLock( msg, rsp ); if (rv != SA_OK || rsp.m_data[0] != eIpmiCcOk) { stdlog << "SetWatchdogInfo error " << rv << " cc=" << rsp.m_data[0] << "\n"; if (rv == SA_OK) rv = SA_ERR_HPI_INTERNAL_ERROR; } return (rv); } SaErrorT cIpmiWatchdog::ResetWatchdog() { cIpmiMsg msg( eIpmiNetfnApp, eIpmiCmdResetWatchdogTimer ); cIpmiMsg rsp; SaErrorT rv; stdlog << "ResetWatchdog: num " << m_num << "\n"; /* add functionality here */ msg.m_data_len = 0; rv = Resource()->SendCommandReadLock( msg, rsp ); if (rv != SA_OK || rsp.m_data[0] != eIpmiCcOk) { stdlog << "ResetWatchdog error " << rv << " cc=" << rsp.m_data[0] << "\n"; if (rv == SA_OK) rv = SA_ERR_HPI_INTERNAL_ERROR; } return (rv); } openhpi-3.6.1/plugins/ipmidirect/ipmi.h0000644000175100017510000000640012575647277017122 0ustar mohanmohan/* * * Copyright (c) 2003,2004 by FORCE Computers. * Copyright (c) 2005 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #ifndef dIpmi_h #define dIpmi_h #include #include #include #include #include #ifndef dIpmiDomain_h #include "ipmi_domain.h" #endif #define dIpmiMagic 0x47110815 class cIpmi : public cIpmiDomain { unsigned int m_magic; oh_handler_state *m_handler; cIpmiEntityPath m_entity_root; bool GetParams( GHashTable *handler_config ); public: bool CheckMagic() { if ( m_magic == dIpmiMagic ) return true; return false; } bool CheckHandler( oh_handler_state *handler ) { if ( handler == m_handler ) return true; return false; } cIpmiCon *AllocConnection( GHashTable *handler_config ); virtual void IfEnter(); virtual void IfLeave(); // openhpi abi interface functions virtual bool IfOpen( GHashTable *handler_config ); virtual void IfClose(); virtual SaErrorT IfGetEvent( oh_event *event ); virtual SaErrorT IfDiscoverResources(); virtual SaErrorT IfSetResourceTag( cIpmiResource *ent, SaHpiTextBufferT *tag ); virtual SaErrorT IfSetResourceSeverity( cIpmiResource *res, SaHpiSeverityT sev ); // hot swap virtual SaErrorT IfGetHotswapState( cIpmiResource *res, SaHpiHsStateT &state ); virtual SaErrorT IfSetHotswapState( cIpmiResource *res, SaHpiHsStateT state ); virtual SaErrorT IfRequestHotswapAction( cIpmiResource *res, SaHpiHsActionT act ); virtual SaErrorT IfHotswapPolicyCancel( cIpmiResource *res, SaHpiTimeoutT timeout ); virtual SaErrorT IfSetAutoInsertTimeout( SaHpiTimeoutT timeout); virtual SaErrorT IfGetAutoExtractTimeout( cIpmiResource *res, SaHpiTimeoutT &timeout); virtual SaErrorT IfSetAutoExtractTimeout( cIpmiResource *res, SaHpiTimeoutT timeout); virtual SaErrorT IfGetPowerState ( cIpmiResource *res, SaHpiPowerStateT &state ); virtual SaErrorT IfSetPowerState ( cIpmiResource *res, SaHpiPowerStateT state ); virtual SaErrorT IfGetIndicatorState( cIpmiResource *res, SaHpiHsIndicatorStateT &state ); virtual SaErrorT IfSetIndicatorState( cIpmiResource *res, SaHpiHsIndicatorStateT state ); virtual SaErrorT IfGetResetState ( cIpmiResource *res, SaHpiResetActionT &state ); virtual SaErrorT IfSetResetState ( cIpmiResource *res, SaHpiResetActionT state ); virtual SaErrorT IfControlParm( cIpmiResource *res, SaHpiParmActionT act ); // lock for the hpi event queue cThreadLock m_event_lock; virtual void AddHpiEvent( oh_event *event ); virtual oh_evt_queue *GetHpiEventList() { return m_handler->eventq; } cIpmi(); ~cIpmi(); void SetHandler( oh_handler_state *handler ); oh_handler_state *GetHandler(); virtual const cIpmiEntityPath &EntityRoot(); virtual SaHpiRptEntryT *FindResource( SaHpiResourceIdT id ); }; #endif openhpi-3.6.1/plugins/ipmidirect/ipmi_control_atca_led.h0000644000175100017510000000323212575647277022476 0ustar mohanmohan/* * ipmi_control_atca_led.h * * Copyright (c) 2006 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Pierre Sangouard */ #ifndef dIpmiControlAtcaLed_h #define dIpmiControlAtcaLed_h #ifndef dIpmiControl_h #include "ipmi_control.h" #endif class cIpmiControlAtcaLed : public cIpmiControl { protected: unsigned int m_num; unsigned char m_led_color_capabilities; unsigned char m_led_default_local_color; unsigned char m_led_local_color; unsigned char m_led_default_override_color; unsigned char m_led_override_color; bool m_set_led_state_supported; public: cIpmiControlAtcaLed( cIpmiMc *mc, unsigned int num, unsigned char led_color_capabilities, unsigned char led_color_local_control_state, unsigned char led_color_override_state); virtual ~cIpmiControlAtcaLed(); // create an RDR sensor record virtual bool CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ); // virtual void Log(); virtual SaErrorT SetState( const SaHpiCtrlModeT &mode, const SaHpiCtrlStateT &state ); virtual SaErrorT GetState( SaHpiCtrlModeT &mode, SaHpiCtrlStateT &state ); virtual void Dump( cIpmiLog &dump, const char *name ) const; protected: bool IsSupportedColor(AtcaHpiLedColorT hpi_color); }; #endif openhpi-3.6.1/plugins/ipmidirect/ipmi_sdr.cpp0000644000175100017510000012167712575647277020343 0ustar mohanmohan/* * ipmi_sdr.cpp * * Copyright (c) 2003,2004 by FORCE Computers * Copyright (c) 2005-2007 by ESO Technologies. * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard * Andy Cress */ #include #include #include #include #include #include "ipmi_mc.h" #include "ipmi_cmd.h" #include "ipmi_log.h" #include "ipmi_utils.h" #include "ipmi_text_buffer.h" #include "ipmi_sensor_threshold.h" static const char *repository_sdr_update_map[] = { "Unspecified", "NonModal", "Modal", "Both" }; static int repository_sdr_update_num = sizeof( repository_sdr_update_map ) / sizeof( char * ); const char * IpmiRepositorySdrUpdateToString( tIpmiRepositorySdrUpdate val ) { if ( (int)val >= repository_sdr_update_num ) return "Invalid"; return repository_sdr_update_map[val]; } struct cIpmiSdrTypeToName { tIpmiSdrType m_type; const char *m_name; }; static cIpmiSdrTypeToName type_to_name[] = { { eSdrTypeFullSensorRecord , "FullSensor" }, { eSdrTypeCompactSensorRecord , "CompactSensor" }, { eSdrTypeEventOnlySensorRecord , "EventOnlySensor" }, { eSdrTypeEntityAssociationRecord , "EntityAssociation" }, { eSdrTypeDeviceRelativeEntityAssociationRecord, "DeviceRelativeEntityAssociation" }, { eSdrTypeGenericDeviceLocatorRecord , "GenericDeviceLocator" }, { eSdrTypeFruDeviceLocatorRecord , "FruDeviceLocator" }, { eSdrTypeMcDeviceLocatorRecord , "McDeviceLocator" }, { eSdrTypeMcConfirmationRecord , "McConfirmation" }, { eSdrTypeBmcMessageChannelInfoRecord , "BmcMessageChannelInfo" }, { eSdrTypeOemRecord , "Oem" }, { eSdrTypeUnknown, 0 } }; const char * IpmiSdrTypeToName( tIpmiSdrType type ) { if ( type == eSdrTypeUnknown ) return "Unknown"; for( cIpmiSdrTypeToName *t = type_to_name; t->m_name; t++ ) if ( t->m_type == type ) return t->m_name; return "Invalid"; } static bool Bit( unsigned char v, int bit ) { return v & (1<> 4) << ";\n"; dump.Entry( "Lun" ) << (int)(m_data[6] & 0x3) << ";\n"; dump.Entry( "SensorNum" ) << m_data[7] << ";\n"; tIpmiEntityId id = (tIpmiEntityId)m_data[8]; if ( !strcmp( IpmiEntityIdToString( id ), "Invalid" ) ) snprintf( str, sizeof(str), "0x%02x", id ); else snprintf( str, sizeof(str), "%s", IpmiEntityIdToString( id ) ); dump.Entry( "EntityId" ) << str << ";\n"; dump.Entry( "EntityInstance" ) << (int)m_data[9] << ";\n"; dump.Entry( "InitScanning" ) << Bit( m_data[10], 6 ) << ";\n"; dump.Entry( "InitEvents" ) << Bit( m_data[10], 5 ) << ";\n"; dump.Entry( "InitThresholds" ) << Bit( m_data[10], 4 ) << ";\n"; dump.Entry( "InitHysteresis" ) << Bit( m_data[10], 3 ) << ";\n"; dump.Entry( "InitSensorType" ) << Bit( m_data[10], 2 ) << ";\n"; dump.Entry( "SensorInitPuEvents" ) << Bit( m_data[10], 1 ) << ";\n"; dump.Entry( "SensorInitPuScanning" ) << Bit( m_data[10], 0 ) << ";\n"; dump.Entry( "IgnoreIfNoEntity" ) << Bit( m_data[11], 7 ) << ";\n"; dump.Entry( "SupportsAutoRearm" ) << Bit( m_data[11], 6 ) << ";\n"; tIpmiHysteresisSupport hs = (tIpmiHysteresisSupport)((m_data[11] >> 4) & 3); dump.Entry( "HysteresisSupport" ) << IpmiHysteresisSupportToString( hs ) << ";\n"; tIpmiThresholdAccessSuport ts = (tIpmiThresholdAccessSuport)((m_data[11] >> 2) & 3); dump.Entry( "ThresholdAccess" ) << IpmiThresholdAccessSupportToString( ts ) << ";\n"; tIpmiEventSupport es = (tIpmiEventSupport)(m_data[11] & 3); dump.Entry( "EventSupport" ) << IpmiEventSupportToString( es ) << ";\n"; tIpmiSensorType sensor_type = (tIpmiSensorType)m_data[12]; if ( !strcmp( IpmiSensorTypeToString( sensor_type ), "Invalid" ) ) snprintf( str, sizeof(str), "0x%02x", sensor_type ); else snprintf( str, sizeof(str), "%s", IpmiSensorTypeToString( sensor_type ) ); dump.Entry( "SensorType" ) << str << ";\n"; tIpmiEventReadingType reading_type = (tIpmiEventReadingType)m_data[13]; if ( !strcmp( IpmiEventReadingTypeToString( reading_type ), "Invalid" ) ) snprintf( str, sizeof(str), "0x%02x", reading_type ); else snprintf( str, sizeof(str), "%s", IpmiEventReadingTypeToString( reading_type ) ); dump.Entry( "EventReadingType" ) << str << ";\n"; if ( reading_type == eIpmiEventReadingTypeThreshold ) { // assertion unsigned short em = IpmiGetUint16( m_data + 14 ); IpmiThresholdEventMaskToString( em, str ); if ( str[0] == 0 ) strcat( str, "0" ); dump.Entry( "AssertionEventMask" ) << str << ";\n"; snprintf( str, sizeof(str), "0x%04x", em >> 12 ); dump.Entry( "LowerThresholdReadingMask" ) << str << ";\n"; // deassertion em = IpmiGetUint16( m_data + 16 ); IpmiThresholdEventMaskToString( em, str ); if ( str[0] == 0 ) strcat( str, "0" ); dump.Entry( "DeassertionEventMask" ) << str << ";\n"; snprintf( str, sizeof(str), "0x%04x", em >> 12 ); dump.Entry( "UpperThresholdReadingMask" ) << str << ";\n"; // settable threshold em = IpmiGetUint16( m_data + 18 ); IpmiThresholdMaskToString( em >> 8, str ); if ( str[0] == 0 ) strcat( str, "0" ); dump.Entry( "SettableThresholdsMask" ) << str << ";\n"; IpmiThresholdMaskToString( em & 0xff, str ); if ( str[0] == 0 ) strcat( str, "0" ); dump.Entry( "ReadableThresholdsMask" ) << str << ";\n"; tIpmiRateUnit ru = (tIpmiRateUnit)((m_data[20] >> 3) & 7); dump.Entry( "RateUnit" ) << IpmiRateUnitToString( ru ) << ";\n"; tIpmiModifierUnit mu = (tIpmiModifierUnit)( (m_data[20] >> 1) & 3); dump.Entry( "ModifierUnit" ) << IpmiModifierUnitToString( mu ) << ";\n"; dump.Entry( "Percentage" ) << ((m_data[20] & 1) == 1) << ";\n"; dump.Entry( "BaseUnit" ) << IpmiUnitTypeToString( (tIpmiUnitType)m_data[21] ) << ";\n"; dump.Entry( "ModifierUnit2" ) << IpmiUnitTypeToString( (tIpmiUnitType)m_data[22] ) << ";\n"; cIpmiSensorFactors sf; sf.GetDataFromSdr( this ); dump.Entry( "AnalogDataFormat" ) << IpmiAnalogeDataFormatToString( sf.AnalogDataFormat() ) << ";\n"; dump.Entry( "Linearization" ) << IpmiLinearizationToString( sf.Linearization() ) << ";\n"; dump.Entry( "M" ) << sf.M() << ";\n"; dump.Entry( "Tolerance" ) << sf.Tolerance() << ";\n"; dump.Entry( "B" ) << sf.B() << ";\n"; dump.Entry( "Accuracy" ) << sf.Accuracy() << ";\n"; dump.Entry( "AccuracyExp" ) << sf.AccuracyExp() << ";\n"; dump.Entry( "RExp" ) << sf.RExp() << ";\n"; dump.Entry( "BExp" ) << sf.BExp() << ";\n"; bool v = m_data[30] & 1; dump.Entry( "NominalReadingSpecified" ) << v << ";\n"; if ( v ) dump.Entry( "NominalReading" ) << m_data[31] << ";\n"; v = m_data[30] & 2; dump.Entry( "NormalMaxSpecified" ) << v << ";\n"; if ( v ) dump.Entry( "NormalMax" ) << m_data[32] << ";\n"; v = m_data[30] & 4; dump.Entry( "NormalMinSpecified" ) << v << ";\n"; if ( v ) dump.Entry( "NormalMin" ) << m_data[33] << ";\n"; dump.Entry( "SensorMax" ) << m_data[34] << ";\n"; dump.Entry( "SensorMin" ) << m_data[35] << ";\n"; dump.Entry( "UpperNonRecoverableThreshold" ) << m_data[36] << ";\n"; dump.Entry( "UpperCriticalThreshold" ) << m_data[37] << ";\n"; dump.Entry( "UpperNonCriticalThreshold" ) << m_data[38] << ";\n"; dump.Entry( "LowerNonRecoverableThreshold" ) << m_data[39] << ";\n"; dump.Entry( "LowerCriticalThreshold" ) << m_data[40] << ";\n"; dump.Entry( "LowerNonCriticalThreshold" ) << m_data[41] << ";\n"; dump.Entry( "PositiveGoingThresholdHysteresis" ) << m_data[42] << ";\n"; dump.Entry( "NegativeGoingThresholdHysteresis" ) << m_data[43] << ";\n"; } else { // assertion unsigned short em = IpmiGetUint16( m_data + 14 ); dump.Hex( true ); dump.Entry( "AssertionEventMask" ) << em << ";\n"; // deassertion em = IpmiGetUint16( m_data + 16 ); dump.Entry( "DeassertionEventMask" ) << em << ";\n"; // event mask em = IpmiGetUint16( m_data + 18 ); dump.Entry( "DiscreteReadingMask" ) << em << ";\n"; dump.Hex( false ); } dump.Entry( "Oem" ) << m_data[46] << ";\n"; cIpmiTextBuffer tb; tb.SetIpmi( m_data + 47 ); tb.GetAscii( str, 80 ); dump.Entry( "Id" ) << "\"" << str << "\";\n"; } void cIpmiSdr::DumpFruDeviceLocator( cIpmiLog &dump ) const { dump.Entry( "DeviceAccessAddress" ) << m_data[5] << ";\n"; if ( m_data[7] & 0x80 ) { // logical FRU device dump.Entry( "FruDeviceId" ) << (int)m_data[6] << ";\n"; } else { // device is directly on IPMB dump.Entry( "SlaveAddress" ) << m_data[6] << ";\n"; dump.Entry( "Lun" ) << (int)((m_data[7] >> 3) & 3) << ";\n"; } dump.Entry( "LogicalDevice" ) << Bit(m_data[7], 7 ) << ";\n"; dump.Entry( "Channel" ) << (int)(m_data[8] >> 4) << ";\n"; dump.Entry( "DeviceType" ) << m_data[10] << ";\n"; dump.Entry( "DeviceTypeModifier" ) << m_data[11] << ";\n"; tIpmiEntityId id = (tIpmiEntityId)m_data[12]; char str[80]; if ( !strcmp( IpmiEntityIdToString( id ), "Invalid" ) ) snprintf( str, sizeof(str), "0x%02x", id ); else snprintf( str, sizeof(str), "%s", IpmiEntityIdToString( id ) ); dump.Entry( "EntityId" ) << str << ";\n"; dump.Entry( "EntityInstance" ) << (int)m_data[13] << ";\n"; dump.Entry( "Oem" ) << m_data[14] << ";\n"; cIpmiTextBuffer tb; tb.SetIpmi( m_data + 15 ); tb.GetAscii( str, 80 ); dump.Entry( "Id" ) << "\"" << str << "\";\n"; } void cIpmiSdr::DumpMcDeviceLocator( cIpmiLog &dump ) const { dump.Entry( "SlaveAddress" ) << m_data[5] << ";\n"; dump.Entry( "Channel" ) << (int)(m_data[6] & 0x0f) << ";\n"; dump.Entry( "AcpiSystemPower" ) << Bit( m_data[7], 7 ) << ";\n"; dump.Entry( "AcpiDevicePower" ) << Bit( m_data[7], 6 ) << ";\n"; dump.Entry( "ControllerLogInitAgentErrors" ) << Bit( m_data[7], 3 ) << ";\n"; dump.Entry( "LogInitializationAgentError" ) << Bit( m_data[7], 2 ) << ";\n"; dump.Entry( "EventMessageGeneration" ) << ( m_data[7] & 3 ) << ";\n"; dump.Entry( "ChassisSupport" ) << Bit( m_data[8], 7 ) << ";\n"; dump.Entry( "BridgeSupport" ) << Bit( m_data[8], 6 ) << ";\n"; dump.Entry( "IpmbEventGeneratorSupport" ) << Bit( m_data[8], 5 ) << ";\n"; dump.Entry( "IpmbEventReceiverSupport" ) << Bit( m_data[8], 4 ) << ";\n"; dump.Entry( "FruInventorySupport" ) << Bit( m_data[8], 3 ) << ";\n"; dump.Entry( "SelDeviceSupport" ) << Bit( m_data[8], 2 ) << ";\n"; dump.Entry( "SdrRepositorySupport" ) << Bit( m_data[8], 1 ) << ";\n"; dump.Entry( "SensorDeviceSupport" ) << Bit( m_data[8], 0 ) << ";\n"; tIpmiEntityId id = (tIpmiEntityId)m_data[12]; char str[80]; if ( !strcmp( IpmiEntityIdToString( id ), "Invalid" ) ) snprintf( str, sizeof(str), "0x%02x", id ); else snprintf( str, sizeof(str), "%s", IpmiEntityIdToString( id ) ); dump.Entry( "EntityId" ) << str << ";\n"; dump.Entry( "EntityInstance" ) << (int)m_data[13] << ";\n"; dump.Entry( "Oem" ) << m_data[14] << ";\n"; cIpmiTextBuffer tb; tb.SetIpmi( m_data + 15 ); tb.GetAscii( str, 80 ); dump.Entry( "Id" ) << "\"" << str << "\";\n"; } void cIpmiSdr::Dump( cIpmiLog &dump, const char *name ) const { char str[80]; snprintf( str, sizeof(str), "%sRecord", IpmiSdrTypeToName( m_type ) ); dump.Begin( str, name ); dump.Entry( "Type" ) << IpmiSdrTypeToName( m_type ) << "\n"; dump.Entry( "RecordId" ) << m_record_id << ";\n"; dump.Entry( "Version" ) << (int)m_major_version << ", " << (int)m_minor_version << ";\n"; switch( m_type ) { case eSdrTypeFullSensorRecord: DumpFullSensor( dump ); break; case eSdrTypeFruDeviceLocatorRecord: DumpFruDeviceLocator( dump ); break; case eSdrTypeMcDeviceLocatorRecord: DumpMcDeviceLocator( dump ); break; default: dump.Entry( "SDR Type " ) << m_type << ";\n"; break; } dump.End(); } static void IpmiSdrDestroyRecords( cIpmiSdr **&sdr, unsigned int &n ) { if ( sdr == 0 ) return; for( unsigned int i = 0; i < n; i++ ) { assert( sdr[i] ); delete sdr[i]; } delete [] sdr; n = 0; sdr = 0; } cIpmiSdrs::cIpmiSdrs( cIpmiMc *mc, bool device_sdr ) : m_mc( mc ), m_device_sdr( device_sdr ), m_fetched( false ), m_major_version( 0 ), m_minor_version( 0 ), m_last_addition_timestamp( 0 ), m_last_erase_timestamp( 0 ), m_overflow( 0 ), m_update_mode( eIpmiRepositorySdrUpdateUnspecified ), m_supports_delete_sdr( false ), m_supports_partial_add_sdr( false ), m_supports_reserve_sdr( false ), m_supports_get_sdr_repository_allocation( false ), m_reservation( 0 ), m_sdr_changed( false ), m_num_sdrs( 0 ), m_sdrs( 0 ) { for( int i = 0; i < 4; i++ ) m_lun_has_sensors[i] = false; } cIpmiSdrs::~cIpmiSdrs() { if ( m_sdrs ) IpmiSdrDestroyRecords( m_sdrs, m_num_sdrs ); } cIpmiSdr * cIpmiSdrs::ReadRecord( unsigned short record_id, unsigned short &next_record_id, tReadRecord &err, unsigned int lun ) { cIpmiMsg msg; cIpmiMsg rsp; SaErrorT rv; int offset = 0; unsigned char data[dMaxSdrData]; int record_size = 0; int read_len = 0; cIpmiSdr *sdr; memset( data, 0xaa, dMaxSdrData ); do { if ( m_device_sdr ) { msg.m_netfn = eIpmiNetfnSensorEvent; msg.m_cmd = eIpmiCmdGetDeviceSdr; } else { msg.m_netfn = eIpmiNetfnStorage; msg.m_cmd = eIpmiCmdGetSdr; } msg.m_data_len = 6; IpmiSetUint16( msg.m_data, m_reservation ); IpmiSetUint16( msg.m_data + 2, record_id ); msg.m_data[4] = offset; if ( offset == 0 ) read_len = dSdrHeaderSize; else { read_len = record_size - offset; if ( read_len > dMaxSdrFetch ) read_len = dMaxSdrFetch; } msg.m_data[5] = read_len; rv = m_mc->SendCommand( msg, rsp, lun ); if ( rv != SA_OK ) { stdlog << "initial_sdr_fetch: Couldn't send GetSdr or GetDeviveSdr fetch: " << rv << " !\n"; err = eReadError; return 0; } if ( rsp.m_data[0] == 0x80 ) { // Data changed during fetch, retry. Only do this so many // times before giving up. stdlog << "SDR reservation lost 1.\n"; err = eReadReservationLost; return 0; } if ( rsp.m_data[0] == eIpmiCcInvalidReservation ) { stdlog << "SDR reservation lost 2.\n"; err = eReadReservationLost; return 0; } if ( record_id == 0 && ( (rsp.m_data[0] == eIpmiCcUnknownErr ) || (rsp.m_data[0] == eIpmiCcNotPresent ) ) ) { // We got an error fetching the first SDR, so the repository is // probably empty. Just go on. stdlog << "SDR reservation lost 3.\n"; err = eReadEndOfSdr; return 0; } if ( rsp.m_data[0] != eIpmiCcOk ) { stdlog << "SDR fetch error getting sdr " << record_id << ": " << rsp.m_data[0] << " !\n"; err = eReadError; return 0; } if ( rsp.m_data_len != read_len + 3 ) { stdlog << "Got an invalid amount of SDR data: " << rsp.m_data_len << ", expected " << read_len + 3 << " !\n"; err = eReadError; return 0; } // copy the data memcpy( data + offset, rsp.m_data + 3, read_len ); // header => get record size if ( offset == 0 ) { record_size = rsp.m_data[7] + dSdrHeaderSize; next_record_id = IpmiGetUint16( rsp.m_data + 1 ); } offset += read_len; } while( offset < record_size ); // create sdr sdr = new cIpmiSdr; memset( sdr, 0, sizeof( cIpmiSdr )); sdr->m_record_id = IpmiGetUint16( data ); sdr->m_major_version = data[2] & 0xf; sdr->m_minor_version = (data[2] >> 4) & 0xf; sdr->m_type = (tIpmiSdrType)data[3]; // Hack to support 1.0 MCs if ( (sdr->m_major_version == 1) && (sdr->m_minor_version == 0) && (sdr->m_type == eSdrTypeMcDeviceLocatorRecord)) { data[8] = data[7]; data[7] = data[6]; data[6] = 0; } sdr->m_length = record_size; memcpy( sdr->m_data, data, record_size ); err = eReadOk; return sdr; } SaErrorT cIpmiSdrs::Reserve(unsigned int lun) { cIpmiMsg msg; cIpmiMsg rsp; SaErrorT rv; if ( !m_supports_reserve_sdr ) { stdlog << "cIpmiSdrs::Reserve: Reserve SDR not supported\n"; return SA_ERR_HPI_INTERNAL_ERROR; } // Now get the reservation. if ( m_device_sdr ) { msg.m_netfn = eIpmiNetfnSensorEvent; msg.m_cmd = eIpmiCmdReserveDeviceSdrRepository; } else { msg.m_netfn = eIpmiNetfnStorage; msg.m_cmd = eIpmiCmdReserveSdrRepository; } msg.m_data_len = 0; rv = m_mc->SendCommand( msg, rsp, lun ); if ( rv != SA_OK ) { stdlog << "Couldn't send SDR reservation: " << rv << " !\n"; return rv; } if ( rsp.m_data[0] != 0) { if ( m_device_sdr && rsp.m_data[0] == eIpmiCcInvalidCmd ) { // This is a special case. We always attempt a // reservation with a device SDR (since there is nothing // telling us if this is supported), if it fails then we // just go on without the reservation. m_supports_reserve_sdr = false; m_reservation = 0; return SA_OK; } stdlog << "Error getting SDR fetch reservation: " << rsp.m_data[0] << " !\n"; return SA_ERR_HPI_INVALID_PARAMS; } if ( rsp.m_data_len < 3 ) { stdlog << "SDR Reservation data not long enough: " << rsp.m_data_len << " bytes!\n"; return SA_ERR_HPI_INVALID_DATA; } m_reservation = IpmiGetUint16( rsp.m_data + 1 ); return SA_OK; } SaErrorT cIpmiSdrs::GetInfo( unsigned short &working_num_sdrs ) { SaErrorT rv; cIpmiMsg msg; cIpmiMsg rsp; unsigned int add_timestamp; unsigned int erase_timestamp; // sdr info if ( m_device_sdr ) { msg.m_netfn = eIpmiNetfnSensorEvent; msg.m_cmd = eIpmiCmdGetDeviceSdrInfo; } else { msg.m_netfn = eIpmiNetfnStorage; msg.m_cmd = eIpmiCmdGetSdrRepositoryInfo; } msg.m_data_len = 0; rv = m_mc->SendCommand( msg, rsp ); if ( rv != SA_OK ) { stdlog << "IpmiSdrsFetch: GetDeviceSdrInfoCmd or GetSdrRepositoryInfoCmd " << rv << ", " << strerror( rv ) << " !\n"; m_sdr_changed = true; IpmiSdrDestroyRecords( m_sdrs, m_num_sdrs ); return rv; } if ( rsp.m_data[0] != 0 ) { if ( m_device_sdr == false ) { // The device doesn't support the get device SDR info // command, so just assume some defaults. working_num_sdrs = 0xfffe; m_dynamic_population = false; // Assume it uses reservations, if the reservation returns // an error, then say that it doesn't. m_supports_reserve_sdr = true; m_lun_has_sensors[0] = true; m_lun_has_sensors[1] = false; m_lun_has_sensors[2] = false; m_lun_has_sensors[3] = false; add_timestamp = 0; erase_timestamp = 0; } else { stdlog << "IPMI Error getting SDR info: " << rsp.m_data[0] << " !\n"; m_sdr_changed = true; IpmiSdrDestroyRecords( m_sdrs, m_num_sdrs ); return SA_ERR_HPI_INVALID_PARAMS; } } else if ( m_device_sdr ) { // device SDR if ( rsp.m_data_len < 3 ) { stdlog << "SDR info is not long enough !\n"; m_sdr_changed = true; IpmiSdrDestroyRecords( m_sdrs, m_num_sdrs ); return SA_ERR_HPI_INVALID_DATA; } working_num_sdrs = rsp.m_data[1]; m_dynamic_population = (rsp.m_data[2] & 0x80) == 0x80; // Assume it uses reservations, if the reservation returns // an error, then say that it doesn't. m_supports_reserve_sdr = true; m_lun_has_sensors[0] = (rsp.m_data[2] & 0x01) == 0x01; m_lun_has_sensors[1] = (rsp.m_data[2] & 0x02) == 0x02; m_lun_has_sensors[2] = (rsp.m_data[2] & 0x04) == 0x04; m_lun_has_sensors[3] = (rsp.m_data[2] & 0x08) == 0x08; if ( m_dynamic_population ) { if ( rsp.m_data_len < 7 ) { stdlog << "SDR info is not long enough !\n"; m_sdr_changed = 1; IpmiSdrDestroyRecords( m_sdrs, m_num_sdrs ); return SA_ERR_HPI_INVALID_DATA; } add_timestamp = IpmiGetUint32( rsp.m_data + 3 ); } else add_timestamp = 0; erase_timestamp = 0; } else { // repository SDR if ( rsp.m_data_len < 15 ) { stdlog << "SDR info is not long enough\n"; m_sdr_changed = true; IpmiSdrDestroyRecords( m_sdrs, m_num_sdrs ); return SA_ERR_HPI_INVALID_DATA; } /* Pull pertinant info from the response. */ m_major_version = rsp.m_data[1] & 0xf; m_minor_version = (rsp.m_data[1] >> 4) & 0xf; working_num_sdrs = IpmiGetUint16( rsp.m_data + 2 ); m_overflow = (rsp.m_data[14] & 0x80) == 0x80; m_update_mode = (tIpmiRepositorySdrUpdate)((rsp.m_data[14] >> 5) & 0x3); m_supports_delete_sdr = (rsp.m_data[14] & 0x08) == 0x08; m_supports_partial_add_sdr = (rsp.m_data[14] & 0x04) == 0x04; m_supports_reserve_sdr = (rsp.m_data[14] & 0x02) == 0x02; m_supports_get_sdr_repository_allocation = (rsp.m_data[14] & 0x01) == 0x01; add_timestamp = IpmiGetUint32( rsp.m_data + 6 ); erase_timestamp = IpmiGetUint32( rsp.m_data + 10 ); } // If the timestamps still match, no need to re-fetch the repository if ( m_fetched && ( add_timestamp == m_last_addition_timestamp ) && ( erase_timestamp == m_last_erase_timestamp ) ) return -1; m_last_addition_timestamp = add_timestamp; m_last_erase_timestamp = erase_timestamp; return SA_OK; } SaErrorT cIpmiSdrs::ReadRecords( cIpmiSdr **&records, unsigned short &working_num_sdrs, unsigned int &num, unsigned int lun ) { int retry_count = 0; bool loop = true; unsigned short save_working = working_num_sdrs; unsigned int save_num = num; struct timespec ts; ts.tv_sec = 0; ts.tv_nsec = 0; while( loop ) { unsigned short next_record_id = 0; working_num_sdrs = save_working; num = save_num; if ( retry_count++ == dMaxSdrFetchRetries ) { stdlog << "Too many retries trying to fetch SDRs\n"; return SA_ERR_HPI_BUSY; } SaErrorT rv = Reserve(lun); if ( rv ) return rv; // read sdr records while( 1 ) { tReadRecord err; unsigned short record_id = next_record_id; cIpmiSdr *sdr = ReadRecord( record_id, next_record_id, err, lun ); if ( sdr == 0 ) { if ( err == eReadReservationLost ) { stdlog << "MC " << (unsigned char)m_mc->GetAddress() << " Lost SDR reservation " << retry_count << " - sleeping\n"; // Most likely the Shelf Manager is trying to access the device SDR too // Give him a break and wait till it's done ts.tv_sec = 5+2*retry_count; nanosleep(&ts, NULL); break; } if ( err != eReadEndOfSdr ) return SA_ERR_HPI_BUSY; // SDR is empty loop = false; break; } GList *list = 0; if (( sdr->m_type == eSdrTypeCompactSensorRecord ) || ( sdr->m_type == eSdrTypeEventOnlySensorRecord )) { // convert compact sensor record to full sensor records list = CreateFullSensorRecords( sdr ); delete sdr; } else list = g_list_append( 0, sdr ); while( list ) { sdr = (cIpmiSdr *)list->data; list = g_list_remove( list, sdr ); sdr->Dump( stdlog, "sdr" ); if ( num >= working_num_sdrs ) { // resize records cIpmiSdr **rec = new cIpmiSdr*[ working_num_sdrs + 10 ]; memcpy( rec, records, sizeof( cIpmiSdr * ) * working_num_sdrs ); delete [] records; records = rec; working_num_sdrs += 10; } records[num++] = sdr; } if ( next_record_id == 0xffff ) { // finish loop = false; break; } } } return SA_OK; } GList * cIpmiSdrs::CreateFullSensorRecords( cIpmiSdr *sdr ) { int n = 1; int itag, len; if (sdr->m_data[3] == eSdrTypeEventOnlySensorRecord ) n = 1; else if ( sdr->m_data[23] & 0x0f ) n = sdr->m_data[23] & 0x0f; GList *list = 0; for( int i = 0; i < n; i++ ) { cIpmiSdr *s = new cIpmiSdr; *s = *sdr; s->m_type = eSdrTypeFullSensorRecord; memset( s->m_data + 23, 0, dMaxSdrData - 23 ); // sensor num s->m_data[7] = sdr->m_data[7] + i; // entity instance if ( sdr->m_data[24] & 0x80 ) s->m_data[9] = sdr->m_data[9] + i; if (sdr->m_data[3] == eSdrTypeEventOnlySensorRecord ) { itag = 16; /* sdr[17] = tag*/ len = sdr->m_data[itag] & 0x3f; memcpy( s->m_data + 47, sdr->m_data + itag, len + 1 ); } else /*Compact SDRs*/ { itag = 31; /*Compact: sdr[32] = tag*/ // positive-going threshold hysteresis value s->m_data[42] = sdr->m_data[25]; // negativ-going threshold hysteresis value s->m_data[43] = sdr->m_data[26]; // oem s->m_data[46] = sdr->m_data[30]; // id (tag) int val = (sdr->m_data[24] & 0x7f) + i; len = sdr->m_data[itag] & 0x3f; memcpy( s->m_data + 47, sdr->m_data + itag, len + 1 ); if (n > 1) { int base = 0; int start = 0; if (( sdr->m_data[23] & 0x30 ) == 0 ) { // numeric base = 10; start = '0'; } else if (( sdr->m_data[23] & 0x30 ) == 0x10 ) { // alpha base = 26; start = 'A'; } if ( base ) { // add id string postfix if ( val / base > 0 ) { s->m_data[48+len] = (val / base) + start; len++; } s->m_data[48+len] = (val % base) + start; len++; s->m_data[48+len] = 0; s->m_data[47] = (sdr->m_data[31] & 0xc0) | len; } } } /*end-else compact*/ list = g_list_append( list, s ); } return list; } SaErrorT cIpmiSdrs::Fetch() { SaErrorT rv; cIpmiSdr **records; unsigned short working_num_sdrs; m_sdr_changed = false; assert( m_mc ); if ( m_device_sdr ) { m_device_sdr = m_mc->ProvidesDeviceSdrs(); /* added ARCress 09/21/06 */ // if ( !m_mc->ProvidesDeviceSdrs() ) return SA_ERR_HPI_NOT_PRESENT; } else if ( !m_mc->SdrRepositorySupport() ) return SA_ERR_HPI_NOT_PRESENT; // working num sdrs is just an estimation rv = GetInfo( working_num_sdrs ); // sdr records are up to date if ( rv == -1 ) return SA_OK; if ( rv ) return rv; m_sdr_changed = true; IpmiSdrDestroyRecords( m_sdrs, m_num_sdrs ); // because working_num_sdrs is an estimation // read the sdr to get the real number if ( working_num_sdrs == 0 ) working_num_sdrs = 1; // read sdr unsigned int num = 0; records = new cIpmiSdr *[working_num_sdrs]; rv = SA_OK; if ( m_device_sdr ) { for( unsigned int i = 0; rv == SA_OK && i < 4; i++ ) if ( m_lun_has_sensors[i] ) rv = ReadRecords( records, working_num_sdrs, num, i ); } else rv = ReadRecords( records, working_num_sdrs, num, 0 ); if ( rv != SA_OK ) { IpmiSdrDestroyRecords( records, num ); return rv; } if ( num == 0 ) { delete [] records; m_sdrs = 0; m_num_sdrs = 0; return SA_OK; } if ( num == working_num_sdrs ) { m_sdrs = records; m_num_sdrs = working_num_sdrs; return SA_OK; } m_sdrs = new cIpmiSdr *[num]; memcpy( m_sdrs, records, num * sizeof( cIpmiSdr * ) ); m_num_sdrs = num; delete [] records; return SA_OK; } void cIpmiSdrs::Dump( cIpmiLog &dump, const char *name ) const { unsigned int i; char str[80]; if ( dump.IsRecursive() ) { for( i = 0; i < m_num_sdrs; i++ ) { snprintf( str, sizeof(str), "Sdr%02x_%d", m_mc->GetAddress(), i ); m_sdrs[i]->Dump( dump, str ); } } dump.Begin( "Sdr", name ); if ( m_device_sdr ) { dump.Entry( "DynamicPopulation" ) << m_dynamic_population << ";\n"; dump.Entry( "LunHasSensors" ) << m_lun_has_sensors[0] << ", " << m_lun_has_sensors[1] << ", " << m_lun_has_sensors[2] << ", " << m_lun_has_sensors[3] << ";\n"; } else { dump.Entry( "Version" ) << m_major_version << ", " << m_minor_version << ";\n"; dump.Entry( "Overflow" ) << m_overflow << ";\n"; dump.Entry( "UpdateMode" ) << "dMainSdrUpdate" << IpmiRepositorySdrUpdateToString( m_update_mode ) << ";\n"; dump.Entry( "SupportsDeleteSdr" ) << m_supports_delete_sdr << ";\n"; dump.Entry( "SupportsPartialAddSdr" ) << m_supports_partial_add_sdr << ";\n"; dump.Entry( "SupportsReserveSdr" ) << m_supports_reserve_sdr << ";\n"; dump.Entry( "SupportsGetSdrRepositoryAllocation" ) << m_supports_get_sdr_repository_allocation << ";\n"; } if ( dump.IsRecursive() && m_num_sdrs ) { dump.Entry( "Sdr" ); for( i = 0; i < m_num_sdrs; i++ ) { if ( i != 0 ) dump << ", "; snprintf( str, sizeof(str), "Sdr%02x_%d", m_mc->GetAddress(), i ); dump << str; } dump << ";\n"; } dump.End(); } cIpmiSdr * cIpmiSdrs::FindSdr( cIpmiMc *mc ) { for( unsigned int i = 0; i < NumSdrs(); i++ ) { cIpmiSdr *sdr = Sdr( i ); if ( sdr->m_type != eSdrTypeMcDeviceLocatorRecord ) continue; if ( mc->GetAddress() == (unsigned int)sdr->m_data[5] && mc->GetChannel() == (unsigned int)(sdr->m_data[6] & 0x0f) ) return sdr; } return 0; } // Here we try to find the FRU that is the "parent" // of the entity this SDR is attached to // The algorithm here is *not* sophisticated at all // The assumption is that most of the SDR will be attached // directly to a FRU so it was optimized for this case // Also only one level of parenthood is assumed - sorry Grand Pa ! unsigned int cIpmiSdrs::FindParentFru( SaHpiEntityTypeT type, SaHpiEntityLocationT instance, SaHpiEntityTypeT & parent_type, SaHpiEntityLocationT & parent_instance ) { SaHpiEntityTypeT mc_type = SAHPI_ENT_UNSPECIFIED; SaHpiEntityLocationT mc_instance = 0; parent_type = SAHPI_ENT_UNSPECIFIED; parent_instance = 0; // First look for FRUs themselves for( unsigned int i = 0; i < NumSdrs(); i++ ) { cIpmiSdr *sdr = Sdr( i ); if ( sdr->m_type == eSdrTypeMcDeviceLocatorRecord ) { mc_type = (SaHpiEntityTypeT)sdr->m_data[12]; mc_instance = (SaHpiEntityLocationT)sdr->m_data[13]; if ( ( type != (SaHpiEntityTypeT)sdr->m_data[12] ) || ( instance != (SaHpiEntityLocationT)sdr->m_data[13] ) ) continue; parent_type = type; parent_instance = instance; return 0; } else if ( sdr->m_type == eSdrTypeFruDeviceLocatorRecord ) { if ( (( sdr->m_data[7] & 0x80) == 0 ) || ( type != (SaHpiEntityTypeT)sdr->m_data[12] ) || ( instance != (SaHpiEntityLocationT)sdr->m_data[13] ) ) continue; parent_type = type; parent_instance = instance; return sdr->m_data[6]; } } stdlog << "Entity ID " << type << ", Instance " << instance << " is not a FRU\n"; // SDR entity is not a FRU: look for association records for( unsigned int i = 0; i < NumSdrs(); i++ ) { cIpmiSdr *sdr = Sdr( i ); if ( sdr->m_type == eSdrTypeEntityAssociationRecord ) { // Entity range if ( sdr->m_data[7] & 0x80 ) { if (( type == (SaHpiEntityTypeT)sdr->m_data[8] ) && ( type == (SaHpiEntityTypeT)sdr->m_data[10] ) && ( ( instance >= (SaHpiEntityLocationT)sdr->m_data[9] ) && ( instance <= (SaHpiEntityLocationT)sdr->m_data[11] ))) { parent_type = (SaHpiEntityTypeT)sdr->m_data[5]; parent_instance = (SaHpiEntityLocationT)sdr->m_data[6]; break; } if (( type == (SaHpiEntityTypeT)sdr->m_data[12] ) && ( type == (SaHpiEntityTypeT)sdr->m_data[14] ) && ( ( instance >= (SaHpiEntityLocationT)sdr->m_data[13] ) && ( instance <= (SaHpiEntityLocationT)sdr->m_data[15] ))) { parent_type = (SaHpiEntityTypeT)sdr->m_data[5]; parent_instance = (SaHpiEntityLocationT)sdr->m_data[6]; break; } } // Entity list else { if (( type == (SaHpiEntityTypeT)sdr->m_data[8] ) && ( instance == (SaHpiEntityLocationT)sdr->m_data[9] )) { parent_type = (SaHpiEntityTypeT)sdr->m_data[5]; parent_instance = (SaHpiEntityLocationT)sdr->m_data[6]; break; } if (( type == (SaHpiEntityTypeT)sdr->m_data[10] ) && ( instance == (SaHpiEntityLocationT)sdr->m_data[11] )) { parent_type = (SaHpiEntityTypeT)sdr->m_data[5]; parent_instance = (SaHpiEntityLocationT)sdr->m_data[6]; break; } if (( type == (SaHpiEntityTypeT)sdr->m_data[12] ) && ( instance == (SaHpiEntityLocationT)sdr->m_data[13] )) { parent_type = (SaHpiEntityTypeT)sdr->m_data[5]; parent_instance = (SaHpiEntityLocationT)sdr->m_data[6]; break; } if (( type == (SaHpiEntityTypeT)sdr->m_data[14] ) && ( instance == (SaHpiEntityLocationT)sdr->m_data[15] )) { parent_type = (SaHpiEntityTypeT)sdr->m_data[5]; parent_instance = (SaHpiEntityLocationT)sdr->m_data[6]; break; } } } else if ( sdr->m_type == eSdrTypeDeviceRelativeEntityAssociationRecord ) { // Entity range if ( sdr->m_data[9] & 0x80 ) { if (( type == (SaHpiEntityTypeT)sdr->m_data[12] ) && ( type == (SaHpiEntityTypeT)sdr->m_data[16] ) && ( ( instance >= (SaHpiEntityLocationT)sdr->m_data[13] ) && ( instance <= (SaHpiEntityLocationT)sdr->m_data[17] ))) { parent_type = (SaHpiEntityTypeT)sdr->m_data[5]; parent_instance = (SaHpiEntityLocationT)sdr->m_data[6]; break; } if (( type == (SaHpiEntityTypeT)sdr->m_data[20] ) && ( type == (SaHpiEntityTypeT)sdr->m_data[24] ) && ( ( instance >= (SaHpiEntityLocationT)sdr->m_data[21] ) && ( instance <= (SaHpiEntityLocationT)sdr->m_data[25] ))) { parent_type = (SaHpiEntityTypeT)sdr->m_data[5]; parent_instance = (SaHpiEntityLocationT)sdr->m_data[6]; break; } } // Entity list else { if (( type == (SaHpiEntityTypeT)sdr->m_data[12] ) && ( instance == (SaHpiEntityLocationT)sdr->m_data[13] )) { parent_type = (SaHpiEntityTypeT)sdr->m_data[5]; parent_instance = (SaHpiEntityLocationT)sdr->m_data[6]; break; } if (( type == (SaHpiEntityTypeT)sdr->m_data[16] ) && ( instance == (SaHpiEntityLocationT)sdr->m_data[17] )) { parent_type = (SaHpiEntityTypeT)sdr->m_data[5]; parent_instance = (SaHpiEntityLocationT)sdr->m_data[6]; break; } if (( type == (SaHpiEntityTypeT)sdr->m_data[20] ) && ( instance == (SaHpiEntityLocationT)sdr->m_data[21] )) { parent_type = (SaHpiEntityTypeT)sdr->m_data[5]; parent_instance = (SaHpiEntityLocationT)sdr->m_data[6]; break; } if (( type == (SaHpiEntityTypeT)sdr->m_data[24] ) && ( instance == (SaHpiEntityLocationT)sdr->m_data[25] )) { parent_type = (SaHpiEntityTypeT)sdr->m_data[5]; parent_instance = (SaHpiEntityLocationT)sdr->m_data[6]; break; } } } } // Didn't find proper association record if ( parent_type == SAHPI_ENT_UNSPECIFIED ) { stdlog << "WARNING : Entity ID " << type << ", Instance " << instance << " did not find parent FRU\n"; stdlog << "WARNING : Defaulting to FRU 0, Entity ID " << mc_type << ", Instance " << mc_instance << "\n"; // We didn't find an exact match // Since a lot of ATCA boards have wrong SDRs // we default the parent to the MC itself parent_type = mc_type; parent_instance = mc_instance; return 0; } stdlog << "Entity ID " << type << ", Instance " << instance << " parent ID " << parent_type << ", Instance " << parent_instance << "\n"; // We found the parent now we want its FRU number // We already have MC == FRU #0 data if (( parent_type == mc_type ) && ( parent_instance == mc_instance )) return 0; // Now look for FRUs other than #0 for( unsigned int i = 0; i < NumSdrs(); i++ ) { cIpmiSdr *sdr = Sdr( i ); if ( sdr->m_type == eSdrTypeFruDeviceLocatorRecord ) { if ( (( sdr->m_data[7] & 0x80) == 0 ) || ( parent_type != (SaHpiEntityTypeT)sdr->m_data[12] ) || ( parent_instance != (SaHpiEntityLocationT)sdr->m_data[13] ) ) continue; return sdr->m_data[6]; } } stdlog << "WARNING : Entity ID " << type << ", Instance " << instance << " did not find parent FRU\n"; stdlog << "WARNING : Defaulting to FRU 0, Entity ID " << mc_type << ", Instance " << mc_instance << "\n"; // We didn't find an exact match // Since a lot of ATCA boards have wrong SDRs // we default the parent to the MC itself parent_type = mc_type; parent_instance = mc_instance; return 0; } openhpi-3.6.1/plugins/ipmidirect/ipmi_mc.cpp0000644000175100017510000004654012575647277020145 0ustar mohanmohan/* * * Copyright (c) 2003,2004 by FORCE Computers * Copyright (c) 2005 by ESO Technologies. * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard * Andy Cress */ #include #include #include #include #include #include "ipmi_mc.h" #include "ipmi_inventory.h" #include "ipmi_sensor.h" #include "ipmi_utils.h" #include "ipmi_domain.h" cIpmiMc::cIpmiMc( cIpmiDomain *domain, const cIpmiAddr &addr ) : m_addr( addr ), m_active( true ), m_domain( domain ), m_sensors_in_my_sdr( 0 ), m_sel( 0 ), m_device_id( 0 ), m_device_revision( 0 ), m_provides_device_sdrs( false ), m_device_available( false ), m_device_support ( 0 ), m_chassis_support( false ), m_bridge_support( false ), m_ipmb_event_generator_support( false ), m_ipmb_event_receiver_support( false ), m_fru_inventory_support( false ), m_sel_device_support( false ), m_sdr_repository_support( false ), m_sensor_device_support( false ), m_major_fw_revision( 0 ), m_minor_fw_revision( 0 ), m_major_version( 0 ), m_minor_version( 0 ), m_manufacturer_id( 0 ), m_product_id( 0 ), m_is_tca_mc( false ), m_is_rms_board( false ) { stdlog << "adding MC: " << addr.m_channel << " " << addr.m_slave_addr << "\n"; // use default as long as the manufactorer // and product id is unknown m_vendor = cIpmiMcVendorFactory::GetFactory()->Default(); m_aux_fw_revision[0] = 0; m_aux_fw_revision[1] = 0; m_aux_fw_revision[2] = 0; m_aux_fw_revision[3] = 0; m_sdrs = new cIpmiSdrs( this, true ); m_sel = new cIpmiSel( this, 0 ); } cIpmiMc::~cIpmiMc() { assert( !m_active ); if ( m_sdrs ) { delete m_sdrs; m_sdrs = 0; } if ( m_sel ) { delete m_sel; m_sel = 0; } assert( Num() == 0 ); } cIpmiResource * cIpmiMc::FindResource( cIpmiResource *res ) { for( int i = 0; i < Num(); i++ ) { cIpmiResource *r = operator[]( i ); if ( r == res ) return res; } return 0; } cIpmiResource * cIpmiMc::GetResource( int i ) { if ( i >= Num() ) return 0; cIpmiResource *res = operator[]( i ); return res; } cIpmiResource * cIpmiMc::FindResource( const cIpmiEntityPath &ep ) { for( int i = 0; i < Num(); i++ ) { cIpmiResource *res = operator[]( i ); if ( res->EntityPath() == ep ) return res; } return 0; } void cIpmiMc::AddResource( cIpmiResource *res ) { if ( FindResource( res ) ) { assert( 0 ); return; } Add( res ); } void cIpmiMc::RemResource( cIpmiResource *res ) { int idx = Find( res ); if ( idx == -1 ) { assert( 0 ); return; } Rem( idx ); } bool cIpmiMc::Cleanup() { m_vendor->CleanupMc( this ); // First the device SDR sensors, since they can be there for any MC. while( m_sensors_in_my_sdr ) { cIpmiSensor *sensor = (cIpmiSensor *)m_sensors_in_my_sdr->data; m_sensors_in_my_sdr = g_list_remove( m_sensors_in_my_sdr, sensor ); sensor->Resource()->RemRdr( sensor ); delete sensor; } while( Num() ) { cIpmiResource *res = operator[]( 0 ); res->Destroy(); } m_active = false; stdlog << "removing MC: " << m_addr.m_channel << " " << m_addr.m_slave_addr << "\n"; return true; } SaErrorT cIpmiMc::SendSetEventRcvr( unsigned int addr ) { cIpmiMsg msg( eIpmiNetfnSensorEvent, eIpmiCmdSetEventReceiver ); cIpmiMsg rsp; SaErrorT rv; stdlog << "Send set event receiver: " << addr << ".\n"; msg.m_data_len = 2; msg.m_data[0] = addr; msg.m_data[1] = 0; // LUN is 0 per the spec (section 7.2 of 1.5 spec). stdlog << "SendSetEventRcvr: " << GetChannel() << " " << (unsigned char)GetAddress() << " -> 0 " << (unsigned char)addr << "\n"; rv = SendCommand( msg, rsp ); if ( rv != SA_OK ) return rv; if ( rsp.m_data[0] != 0 ) { // Error setting the event receiver, report it. stdlog << "Could not set event receiver for MC at " << m_addr.m_slave_addr << " !\n"; // Intel ShMc does not like being told where to send events ! if ( rsp.m_data[0] == eIpmiCcInsufficientPrivilege ) return SA_OK; return SA_ERR_HPI_INVALID_DATA; } return SA_OK; } SaErrorT cIpmiMc::HandleNew() { SaErrorT rv; m_active = true; /* fix for SdrRep also - ARCress 09/21/06 */ if ( m_provides_device_sdrs || m_sdr_repository_support ) { rv = m_sdrs->Fetch(); if ( rv ) return rv; if ( m_sdrs->NumSdrs() == 0 ) { stdlog << "WARNING: MC " << m_addr.m_slave_addr << " SDR is empty !!!\n"; return SA_ERR_HPI_INVALID_PARAMS; } if ( m_vendor->ProcessSdr( Domain(), this, m_sdrs ) == false ) return SA_ERR_HPI_INVALID_PARAMS; if ( m_vendor->CreateRdrs( Domain(), this, m_sdrs ) == false ) return SA_ERR_HPI_INVALID_PARAMS; } // read the sel first if ( m_sel_device_support ) { rv = m_sel->GetInfo(); if ( rv != SA_OK ) { m_sel_device_support = false; } else { SaHpiTimeT sel_time; oh_gettimeofday( &sel_time ); m_sel->SetSelTime( sel_time ); m_sel->m_fetched = false; if (IsTcaMc()) { rv = m_sel->ClearSel(); if ( rv != SA_OK ) m_sel_device_support = false; } if ( m_sel_device_support ) { // read old events GList *list = m_sel->GetEvents(); m_sel->ClearList( list ); } } } // We set the event receiver here, so that we know all the SDRs // are installed. That way any incoming events from the device // will have the proper sensor set. unsigned int event_rcvr = 0; if ( m_ipmb_event_generator_support ) { cIpmiMc *er = m_domain->GetEventRcvr(); if ( er ) event_rcvr = er->GetAddress(); } else if ( m_sel_device_support && m_provides_device_sdrs) { // If it is an SEL device and not an event receiver, then // may want to set its event receiver to itself. event_rcvr = GetAddress(); stdlog << "New mc, event_rcvr " << GetAddress() << "\n"; } if ( event_rcvr && IsTcaMc()) { // This is a re-arm of all sensors of the MC // => each sensor sends the pending events again. // because we now which events are old, // we can get the current state. rv = SendSetEventRcvr( event_rcvr ); if ( rv ) return rv; } return 0; } bool cIpmiMc::DeviceDataCompares( const cIpmiMsg &rsp ) const { const unsigned char *rsp_data = rsp.m_data; if ( rsp.m_data_len < 12 ) return false; if ( m_device_id != rsp_data[1] ) return false; if ( m_device_revision != (rsp_data[2] & 0xf) ) return false; if ( m_provides_device_sdrs != ((rsp_data[2] & 0x80) == 0x80) ) ; /* dont return false; ARCress */ if ( m_device_available != ((rsp_data[3] & 0x80) == 0x80) ) return false; if ( m_major_fw_revision != (rsp_data[3] & 0x7f) ) return false; if ( m_minor_fw_revision != (rsp_data[4]) ) return false; if ( m_major_version != (rsp_data[5] & 0xf) ) return false; if ( m_minor_version != ((rsp_data[5] >> 4) & 0xf) ) return false; if ( m_chassis_support != ((rsp_data[6] & 0x80) == 0x80) ) return false; if ( m_bridge_support != ((rsp_data[6] & 0x40) == 0x40) ) return false; if ( m_ipmb_event_generator_support != ((rsp_data[6] & 0x20)==0x20) ) return false; if ( m_ipmb_event_receiver_support != ((rsp_data[6] & 0x10) == 0x10) ) return false; if ( m_fru_inventory_support != ((rsp_data[6] & 0x08) == 0x08) ) return false; if ( m_sel_device_support != ((rsp_data[6] & 0x04) == 0x04) ) return false; if ( m_sdr_repository_support != ((rsp_data[6] & 0x02) == 0x02) ) return false; if ( m_sensor_device_support != ((rsp_data[6] & 0x01) == 0x01) ) return false; if ( m_manufacturer_id != (unsigned int)( (rsp_data[7] | (rsp_data[8] << 8) | (rsp_data[9] << 16))) ) return false; if ( m_product_id != (rsp_data[10] | (rsp_data[11] << 8)) ) return false; if ( rsp.m_data_len < 16 ) { // no aux revision, it should be all zeros. if ( ( m_aux_fw_revision[0] != 0 ) || ( m_aux_fw_revision[1] != 0 ) || ( m_aux_fw_revision[2] != 0 ) || ( m_aux_fw_revision[3] != 0 ) ) return false; } else if ( memcmp( m_aux_fw_revision, rsp_data + 12, 4 ) != 0 ) return false; // Everything's the same. return true; } void cIpmiMc::CheckTca() { cIpmiMsg msg( eIpmiNetfnPicmg, eIpmiCmdGetPicMgProperties ); msg.m_data_len = 1; msg.m_data[0] = dIpmiPicMgId; cIpmiMsg rsp; SaErrorT rv; m_is_tca_mc = false; m_picmg_major = 0; m_picmg_minor = 0; rv = SendCommand( msg, rsp ); if ( rv != SA_OK || rsp.m_data[0] || rsp.m_data[1] != dIpmiPicMgId ) { stdlog << "WARNING: MC " << m_addr.m_slave_addr << " is not a TCA MC !!!\n"; return; } m_picmg_minor = (rsp.m_data[2] >> 4) & 0x0f; m_picmg_major = rsp.m_data[2] & 0x0f; if ( m_picmg_major == 2 ) { stdlog << "MC " << m_addr.m_slave_addr << " is an ATCA MC, PICMG Extension version " << (int)m_picmg_major << "." << (int)m_picmg_minor << "\n"; m_is_tca_mc = true; return; } else if ( m_picmg_major == 5 ) { stdlog << "MC " << m_addr.m_slave_addr << " is a MicroTCA MC, PICMG Extension version " << (int)m_picmg_major << "." << (int)m_picmg_minor << "\n"; m_is_tca_mc = true; return; } stdlog << "WARNING: MC " << m_addr.m_slave_addr << " is not an ATCA MC !!!\n"; return; } int cIpmiMc::GetDeviceIdDataFromRsp( const cIpmiMsg &rsp ) { const unsigned char *rsp_data = rsp.m_data; if ( rsp_data[0] != 0 ) return EINVAL; if ( rsp.m_data_len < 12 ) return EINVAL; m_device_id = rsp_data[1]; m_device_revision = rsp_data[2] & 0xf; m_provides_device_sdrs = (rsp_data[2] & 0x80) == 0x80; m_device_available = (rsp_data[3] & 0x80) == 0x80; m_major_fw_revision = rsp_data[3] & 0x7f; m_minor_fw_revision = (rsp_data[4] & 0x0f) + 10 * ((rsp_data[4] >> 4) & 0x0f); m_major_version = rsp_data[5] & 0xf; m_minor_version = (rsp_data[5] >> 4) & 0xf; m_device_support = rsp_data[6]; m_chassis_support = (rsp_data[6] & 0x80) == 0x80; m_bridge_support = (rsp_data[6] & 0x40) == 0x40; m_ipmb_event_generator_support = (rsp_data[6] & 0x20) == 0x20; m_ipmb_event_receiver_support = (rsp_data[6] & 0x10) == 0x10; m_fru_inventory_support = (rsp_data[6] & 0x08) == 0x08; m_sel_device_support = (rsp_data[6] & 0x04) == 0x04; m_sdr_repository_support = (rsp_data[6] & 0x02) == 0x02; m_sensor_device_support = (rsp_data[6] & 0x01) == 0x01; m_manufacturer_id = (rsp_data[7] | (rsp_data[8] << 8) | (rsp_data[9] << 16)); m_product_id = rsp_data[10] | (rsp_data[11] << 8); if ( rsp.m_data_len < 16 ) // no aux revision. memset( m_aux_fw_revision, 0, 4 ); else memcpy( m_aux_fw_revision, rsp_data + 12, 4 ); return 0; } void cIpmiMc::CheckEventRcvr() { SaErrorT rv; if ( m_ipmb_event_generator_support ) return; // We have an MC that is live (or still live) and generates // events, make sure the event receiver is set properly. cIpmiMc *er = m_domain->GetEventRcvr(); if ( !er ) return; unsigned int event_rcvr = er->GetAddress(); // Don't bother if we have no possible event receivers. if ( !event_rcvr ) return; cIpmiMsg msg( eIpmiNetfnSensorEvent, eIpmiCmdGetEventReceiver ); cIpmiMsg rsp; rv = SendCommand( msg, rsp ); if ( rv != SA_OK ) // No care about return values, if this fails it will be done // again later. return; if ( rsp.m_data[0] != 0 ) { // Error getting the event receiver, report it. stdlog << "Could not get event receiver for MC at " << m_addr.m_slave_addr << " !\n"; return; } if ( rsp.m_data_len < 2 ) { stdlog << "Get event receiver length invalid for MC at " << m_addr.m_slave_addr << " !\n"; return; } cIpmiDomain *domain = m_domain; cIpmiMc *destmc; cIpmiAddr ipmb( eIpmiAddrTypeIpmb, GetChannel(), 0, rsp.m_data[1] ); destmc = domain->FindMcByAddr( ipmb ); if ( !destmc || destmc->m_ipmb_event_receiver_support == 0 ) { // The current event receiver doesn't exist or cannot // receive events, change it. er = m_domain->GetEventRcvr(); if ( er ) SendSetEventRcvr( er->GetAddress() ); } } SaErrorT cIpmiMc::SendCommand( const cIpmiMsg &msg, cIpmiMsg &rsp_msg, unsigned int lun, int retries ) { cIpmiAddr addr = m_addr; addr.m_lun = lun; if (msg.m_chan != 0) { /* if ME command, set correct sa/chan */ stdlog << "SendCommand: sa=" << msg.m_sa << " chan=" << msg.m_chan << "\n"; addr.m_channel = msg.m_chan; addr.m_slave_addr = msg.m_sa; } return m_domain->SendCommand( addr, msg, rsp_msg, retries ); } unsigned int cIpmiMc::GetChannel() const { if ( m_addr.m_type == eIpmiAddrTypeSystemInterface ) return dIpmiBmcChannel; return m_addr.m_channel; } unsigned int cIpmiMc::GetAddress() const { if ( m_addr.m_type == eIpmiAddrTypeIpmb ) return m_addr.m_slave_addr; if ( m_addr.m_type == eIpmiAddrTypeSystemInterface ) return m_addr.m_channel; // Address is ignore for other types. return 0; } cIpmiRdr * cIpmiMc::FindRdr( cIpmiRdr *r ) { for( int i = 0; i < Num(); i++ ) { cIpmiResource *res = operator[]( i ); int idx = res->FindRdr( r ); if ( idx != -1 ) return r; } return 0; } cIpmiSensor * cIpmiMc::FindSensor( unsigned int lun, unsigned int sensor_id, unsigned int sa) { for( int i = 0; i < Num(); i++ ) { cIpmiResource *res = operator[]( i ); cIpmiRdr *r = res->FindRdr( this, SAHPI_SENSOR_RDR, sensor_id, lun, sa); if ( r ) { stdlog << "mc.FindSensor(" << lun << "," << sensor_id << "," << sa << ") found RecordId " << r->RecordId() << "\n"; return (cIpmiSensor *)r; } } return 0; } cIpmiSensorHotswap * cIpmiMc::FindHotswapSensor() { for( int i = 0; i < Num(); i++ ) { cIpmiResource *res = operator[]( i ); cIpmiSensorHotswap *hs = res->GetHotswapSensor(); if ( hs ) return hs; } return 0; } bool cIpmiMc::DumpControls( cIpmiLog &dump, const char *name ) const { int i; // create a list of controls cArray controls; for( i = 0; i < Num(); i++ ) { cIpmiResource *res = operator[]( i ); for( int j = 0; j < res->NumRdr(); j++ ) { cIpmiRdr *rdr = res->GetRdr( j ); cIpmiControl *control = dynamic_cast( rdr ); if ( control ) controls.Add( control ); } } if ( controls.Num() == 0 ) return false; char control_device_name[80]; snprintf( control_device_name, sizeof(control_device_name), "ControlDevice%02x_", GetAddress() ); // dump controls for( i = 0; i < controls.Num(); i++ ) { cIpmiControl *control = controls[i]; char str[80]; snprintf( str, sizeof(str), "%s%d", control_device_name, control->Num() ); control->Dump( dump, str ); } // dump control device dump.Begin( "Control", name ); dump.Entry( "ControlDevices" ); bool first = true; while( controls.Num() ) { cIpmiControl *control = controls.Rem( 0 ); if ( first ) first = false; else dump << ", "; dump << control_device_name << control->Num(); } dump << ";\n"; dump.End(); return true; } void cIpmiMc::Dump( cIpmiLog &dump, const char *name ) const { char sel_name[80]; snprintf( sel_name, sizeof(sel_name), "Sel%02x", GetAddress() ); char fru_name[80]; snprintf( fru_name, sizeof(fru_name), "Fru%02x", GetAddress() ); bool fru_inventory = false; char control_name[80]; snprintf( control_name, sizeof(control_name), "Control%02x", GetAddress() ); bool control = false; char sdr_name[80]; snprintf( sdr_name, sizeof(sdr_name), "Sdr%02x", GetAddress() ); if ( dump.IsRecursive() ) { if ( m_provides_device_sdrs && m_sdrs ) m_sdrs->Dump( dump, sdr_name ); if ( m_sel && m_sel_device_support ) m_sel->Dump( dump, sel_name ); control = DumpControls( dump, control_name ); } dump.Begin( "Mc", name ); if ( dump.IsRecursive() ) { if ( m_provides_device_sdrs && m_sdrs ) dump.Entry( "Sdr" ) << sdr_name << ";\n"; if ( m_sel && m_sel_device_support ) dump.Entry( "Sel" ) << sel_name << ";\n"; if ( fru_inventory ) dump.Entry( "Fru" ) << fru_name << "\n"; if ( control ) dump.Entry( "Control" ) << control_name << "\n"; } dump.Entry( "DeviceId" ) << (int)m_device_id << ";\n"; dump.Entry( "DeviceRevision" ) << (int)m_device_revision << ";\n"; dump.Entry( "ProvidesDeviceSdr" ) << m_provides_device_sdrs << ";\n"; dump.Entry( "DeviceAvailable" ) << (m_device_available ? "UpdateInProgress" : "NormalOperation" ) << ";\n"; dump.Entry( "ChassisSupport" ) << m_chassis_support << ";\n"; dump.Entry( "BridgeSupport" ) << m_bridge_support << ";\n"; dump.Entry( "IpmbEventGeneratorSupport" ) << m_ipmb_event_generator_support << ";\n"; dump.Entry( "IpmbEventReceiverSupport" ) << m_ipmb_event_receiver_support << ";\n"; dump.Entry( "FruInventorySupport" ) << m_fru_inventory_support << ";\n"; dump.Entry( "SelDeviceSupport" ) << m_sel_device_support << ";\n"; dump.Entry( "SdrRepositorySupport" ) << m_sdr_repository_support << ";\n"; dump.Entry( "SensorDeviceSupport" ) << m_sensor_device_support << ";\n"; dump.Entry( "FwVersion" ) << (int)m_major_fw_revision << ", " << (int)m_minor_fw_revision << ";\n"; dump.Entry( "Version" ) << (int)m_major_version << ", " << (int)m_minor_version << ";\n"; dump.Hex( true ); dump.Entry( "ManufacturerId" ) << m_manufacturer_id << ";\n"; dump.Entry( "ProductId" ) << m_product_id << ";\n"; dump.Hex( false ); dump.End(); } bool cIpmiMc::Populate() { for( int i = 0; i < Num(); i++ ) { cIpmiResource *res = operator[]( i ); if ( res->Populate() == false ) return false; } return true; } openhpi-3.6.1/plugins/ipmidirect/ipmi_con.h0000644000175100017510000001161012575647277017760 0ustar mohanmohan/* * ipmi_con.h * * abstract interface for handling IPMI connections * * Copyright (c) 2003,2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #ifndef dIpmiCon_h #define dIpmiCon_h #ifndef dIpmiLog_h #include "ipmi_log.h" #endif #ifndef dIpmiAddr_h #include "ipmi_addr.h" #endif #ifndef dIpmiMsg_h #include "ipmi_msg.h" #endif #ifndef dIpmiCmd_h #include "ipmi_cmd.h" #endif #ifndef dIpmiUtils_h #include "ipmi_utils.h" #endif #ifndef dThread_h #include "thread.h" #endif extern "C" { #include "SaHpi.h" } #include #define dIpmiConLogCmd 1 #define dIpmiConLogEvent 2 #define dIpmiConLogAll 0xffff // default retries for an IPMI command before timeoue #define dIpmiDefaultRetries 3 // ipmi command class cIpmiRequest { public: cIpmiAddr m_addr; cIpmiAddr m_send_addr; cIpmiMsg m_msg; int m_seq; // seq of msg cIpmiAddr *m_rsp_addr; cIpmiMsg *m_rsp; SaErrorT m_error; // if != 0 => error cThreadCond *m_signal; // the calling thread is waiting for this cTime m_timeout; int m_retries_left; cIpmiRequest( const cIpmiAddr &addr, const cIpmiMsg &msg ) : m_addr( addr ), m_send_addr( addr ), m_msg( msg ), m_rsp_addr( 0 ), m_rsp( 0 ), m_error( SA_OK ), m_signal( 0 ), m_retries_left( -1 ) {} virtual ~cIpmiRequest() {} }; #define dMaxSeq 256 class cIpmiCon : public cThread { protected: bool m_is_open; // file handle returned by IfOpen int m_fd; // address of SMI unsigned char m_slave_addr; cThreadLock m_log_lock; // maximum outstanding requests int m_max_outstanding; // must be <= dMaxSeq // max seq number int m_max_seq; // must be <= dMaxSeq // lock for m_queue and m_outstanding cThreadLock m_queue_lock; GList *m_queue; cIpmiRequest *m_outstanding[dMaxSeq]; int m_num_outstanding; int m_current_seq; void RequeueOutstanding(); int AddOutstanding( cIpmiRequest *r ); void RemOutstanding( int seq ); void HandleMsgError( cIpmiRequest *r, int err ); // send a command SaErrorT SendCmd( cIpmiRequest *request ); // send the first command of the given queue void SendCmds(); // thread entry function virtual void *Run(); // signal the exit of the thread bool m_exit; // log output int m_log_level; public: bool LogLevel( int v ) { return m_log_level & v; } // current timeout in ms unsigned int m_timeout; public: cIpmiCon( unsigned int timeout, int log_level ); virtual ~cIpmiCon(); bool IsOpen() { return m_is_open; } protected: // get number of seq ids virtual int IfGetMaxSeq() = 0; // connection interface functions // open connection return file handle virtual int IfOpen() = 0; // close connection virtual void IfClose(); // convertion from addr to send addr virtual void IfAddrToSendAddr( const cIpmiAddr &addr, cIpmiAddr &send_addr ); // send an ipmi command virtual SaErrorT IfSendCmd( cIpmiRequest *r ) = 0; // read ipmi response virtual void IfReadResponse() = 0; // true => connection check mode bool m_check_connection; cTime m_check_connection_timeout; // called to check the connection // true => going to check connection mode virtual bool IfCheckConnection( cTime &timeout ); // called in case of check connection timeout virtual void IfCheckConnectionTimeout(); protected: cTime m_last_receive_timestamp; // handle response called within IfReadResponse virtual void HandleResponse( int seq, const cIpmiAddr &addr, const cIpmiMsg &msg ); // handle event called within IfReadResponse virtual void HandleEvent( const cIpmiAddr &addr, const cIpmiMsg &msg ); virtual void HandleAsyncEvent( const cIpmiAddr &addr, const cIpmiMsg &msg ) = 0; // handle a check connection response virtual void HandleCheckConnection( bool state ); public: bool Open(); void Close(); SaErrorT Cmd( const cIpmiAddr &addr, const cIpmiMsg &msg, cIpmiAddr &rsp_addr, cIpmiMsg &rsp_msg, int retries = dIpmiDefaultRetries ); SaErrorT ExecuteCmd( const cIpmiAddr &addr, const cIpmiMsg &msg, cIpmiMsg &rsp_msg, int retries = dIpmiDefaultRetries ); int GetMaxOutstanding() { return m_max_outstanding; } bool SetMaxOutstanding( int max ) { if ( max < 1 || max > 32 ) return false; m_max_outstanding = max; return true; } }; void IpmiLogDataMsg( const cIpmiAddr &addr, const cIpmiMsg &msg ); #endif openhpi-3.6.1/plugins/ipmidirect/ipmi_con_lan.cpp0000644000175100017510000007251512575647277021160 0ustar mohanmohan/* * * Copyright (c) 2003,2004 by FORCE Computers * Copyright (c) 2005 by ESO Technologies. * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #include #include #include #include #include #include #include #include #include "ipmi_con_lan.h" // For Solaris #ifndef timersub #define timersub(a, b, result) \ do { \ (result)->tv_sec = (a)->tv_sec - (b)->tv_sec; \ (result)->tv_usec = (a)->tv_usec - (b)->tv_usec; \ if ((result)->tv_usec < 0) { \ --(result)->tv_sec; \ (result)->tv_usec += 1000000; \ } \ } while (0) #endif #define dIpmiMaxLanLen (dIpmiMaxMsgLength + 42) cIpmiConLan::cIpmiConLan( unsigned int timeout, int log_level, struct in_addr addr, int port, tIpmiAuthType auth, tIpmiPrivilege priv, char *user, char *passwd ) : cIpmiCon( timeout, log_level ), m_port( port ), m_auth( auth ), m_priv( priv ), m_auth_method( 0 ), m_session_id( 0 ), m_working_auth( eIpmiAuthTypeNone ), m_ping_count( 0 ), m_outbound_seq_num( 0 ), m_inbound_seq_num( 0 ), m_recv_msg_map( 0 ) { m_ip_addr.sin_family = AF_INET; m_ip_addr.sin_port = htons( port ); m_ip_addr.sin_addr = addr; m_port = port; memset( m_username, 0, dIpmiUsernameMax ); strncpy( m_username, user, dIpmiUsernameMax ); memset( m_passwd, 0, dIpmiPasswordMax ); strncpy( m_passwd, passwd, dIpmiPasswordMax ); } cIpmiConLan::~cIpmiConLan() { if ( IsOpen() ) Close(); if ( m_auth_method ) delete m_auth_method; } int cIpmiConLan::AuthGen( unsigned char *out, uint8_t *ses_id, uint8_t *seq, unsigned char *data, unsigned int data_len ) { if ( m_auth != m_working_auth ) return SA_ERR_HPI_INVALID_PARAMS; if ( !m_auth_method ) return SA_ERR_HPI_INVALID_PARAMS; int rv; cIpmiAuthSg l[] = { { ses_id, 4 }, { data, data_len }, { seq, 4 }, { NULL, 0 } }; rv = m_auth_method->Gen( l, out ); return rv; } int cIpmiConLan::AuthCheck( uint8_t *ses_id, uint8_t *seq, unsigned char *data, unsigned int data_len, unsigned char *code ) { if ( m_auth != m_working_auth ) return SA_ERR_HPI_INVALID_PARAMS; if ( !m_auth_method ) return SA_ERR_HPI_INVALID_PARAMS; int rv; cIpmiAuthSg l[] = { { ses_id, 4 }, { data, data_len }, { seq, 4 }, { NULL, 0 } }; rv = m_auth_method->Check( l, code ); return rv; } int cIpmiConLan::OpenLanFd() { int fd; struct sockaddr_in addr; int curr_port; int rv; fd = socket( PF_INET, SOCK_DGRAM, IPPROTO_UDP ); if ( fd == -1 ) return fd; curr_port = 7000; do { curr_port++; addr.sin_family = AF_INET; addr.sin_port = htons( curr_port ); addr.sin_addr.s_addr = INADDR_ANY; rv = bind( fd, (struct sockaddr *)&addr, sizeof( addr ) ); } while( curr_port < 7100 && rv == -1 ); if ( rv == -1 ) { int tmp_errno = errno; close( fd ); errno = tmp_errno; return -1; } stdlog << "using port " << curr_port << ".\n"; return fd; } unsigned char cIpmiConLan::Checksum( unsigned char *data, int size ) { unsigned char csum = 0; for( ; size > 0; size--, data++ ) csum += *data; return -csum; } int cIpmiConLan::SendPing() { unsigned char data[dIpmiMaxLanLen]; data[0] = 6; // RMCP version 1.0. data[1] = 0; data[2] = 0xff; // no RMCP ACK data[3] = 0x06; // ASF IpmiSetUint32( data + 4, dAsfIana ); data[8] = 0x80; // presence ping data[9] = 0xff; // ???? data[10] = 0x00; data[11] = 0x00; stdlog << "sending RMCP ping.\n"; int rv = sendto( m_fd, data, 12, 0, (struct sockaddr *)&m_ip_addr, sizeof( struct sockaddr_in ) ); if ( rv == -1 ) return errno; m_ping_count++; return 0; } bool cIpmiConLan::WaitForPong( unsigned int timeout_ms ) { struct pollfd pfd; pfd.fd = m_fd; pfd.events = POLLIN; tResponseType ret; // loop do { int rv = poll( &pfd, 1, timeout_ms ); // timeout if ( !rv ) return false; if ( rv == -1 ) { stdlog << "poll failed while waiting for pong.\n"; return false; } if ( rv != 1 ) stdlog << "poll return != 1 while waiting for pong.\n"; int seq; cIpmiAddr addr; cIpmiMsg msg; ret = ReadResponse( seq, addr, msg ); if ( ret == eResponseTypeMessage ) { stdlog << "reading unexpected message while waiting for pong:\n"; IpmiLogDataMsg( addr, msg ); } } while( ret != eResponseTypePong ); return true; } cIpmiConLan::tResponseType cIpmiConLan::WaitForResponse( unsigned int timeout_ms, int &seq, cIpmiAddr &addr, cIpmiMsg &msg ) { struct timeval tv; struct timeval timeout; struct timeval t0; // create absolute timeout gettimeofday( &timeout, 0 ); timeout.tv_sec += timeout_ms / 1000; timeout.tv_usec += (timeout_ms % 1000) * 1000; while( timeout.tv_usec > 1000000 ) { timeout.tv_sec++; timeout.tv_usec -= 1000000; } tResponseType ret; // loop do { struct pollfd pfd; pfd.fd = m_fd; pfd.events = POLLIN; // relative timeout gettimeofday( &t0, 0 ); timersub( &timeout, &t0, &tv ); if ( tv.tv_sec < 0 || tv.tv_usec < 0 ) { tv.tv_sec = 0; tv.tv_usec = 0; } timeout_ms = tv.tv_sec * 1000 + tv.tv_usec / 1000; int rv = poll( &pfd, 1, timeout_ms ); // timeout if ( !rv ) return eResponseTypeTimeout; if ( rv == -1 ) { stdlog << "poll failed while waiting for response.\n"; return eResponseTypeError; } if ( rv != 1 ) stdlog << "poll return != 1 while waiting for response.\n"; ret = ReadResponse( seq, addr, msg ); } while( ret != eResponseTypeMessage ); if ( m_log_level & dIpmiConLogCmd ) { m_log_lock.Lock(); stdlog << "m_retries_left = dIpmiDefaultRetries; int seq; while( r->m_retries_left > 0 ) { SaErrorT rv = SendCmd( r ); if ( rv != SA_OK ) continue; tResponseType rt; do { rt = WaitForResponse( m_timeout, seq, rsp_addr, rsp_msg ); } while( rt == eResponseTypeEvent || rt == eResponseTypePong ); RemOutstanding( r->m_seq ); if ( rt == eResponseTypeMessage ) { // check seq if ( seq == r->m_seq ) { delete r; return SA_OK; } } // resend message stdlog << "resending RMCP msg.\n"; } return SA_ERR_HPI_TIMEOUT; } SaErrorT cIpmiConLan::AuthCap() { SaErrorT rv; cIpmiAddr addr( eIpmiAddrTypeSystemInterface ); cIpmiMsg msg( eIpmiNetfnApp, eIpmiCmdGetChannelAuthCapabilities ); cIpmiAddr rsp_addr; cIpmiMsg rsp_msg; msg.m_data[0] = 0xe; msg.m_data[1] = m_priv; msg.m_data_len = 2; rv = SendMsgAndWaitForResponse( addr, msg, rsp_addr, rsp_msg ); if ( rv != SA_OK ) return rv; if ( (rsp_msg.m_data[0] != 0 ) || (rsp_msg.m_data_len < 9 ) ) { stdlog << "auth response = " << rsp_msg.m_data[0] << " !\n"; return SA_ERR_HPI_INVALID_DATA; } if ( !( rsp_msg.m_data[2] & (1 << m_auth ) ) ) { stdlog << "Requested authentication not supported !\n"; char str[256] = ""; if ( rsp_msg.m_data[2] & ( 1 << eIpmiAuthTypeNone ) ) strcat( str, " none" ); if ( rsp_msg.m_data[2] & ( 1 << eIpmiAuthTypeMd2 ) ) strcat( str, " md2" ); if ( rsp_msg.m_data[2] & ( 1 << eIpmiAuthTypeMd5 ) ) strcat( str, " md5" ); if ( rsp_msg.m_data[2] & ( 1 << eIpmiAuthTypeStraight ) ) strcat( str, " straight" ); if ( rsp_msg.m_data[2] & ( 1 << eIpmiAuthTypeOem ) ) strcat( str, " oem" ); stdlog << "supported authentication types: " << str << ".\n"; return SA_ERR_HPI_INVALID_DATA; } return SA_OK; } SaErrorT cIpmiConLan::SetSessionPriv() { SaErrorT rv; cIpmiAddr addr( eIpmiAddrTypeSystemInterface ); cIpmiMsg msg( eIpmiNetfnApp, eIpmiCmdSetSessionPrivilege ); cIpmiAddr rsp_addr; cIpmiMsg rsp_msg; msg.m_data[0] = m_priv; msg.m_data_len = 1; rv = SendMsgAndWaitForResponse( addr, msg, rsp_addr, rsp_msg ); if ( rv != SA_OK ) return rv; if ( rsp_msg.m_data[0] != 0 ) { stdlog << "set session priv: " << rsp_msg.m_data[0] << " !\n"; return SA_ERR_HPI_INVALID_DATA; } if ( rsp_msg.m_data_len < 2 ) { stdlog << "set session priv: msg to small: " << rsp_msg.m_data_len << " !\n"; return SA_ERR_HPI_INVALID_DATA; } if ( (unsigned char)m_priv != (rsp_msg.m_data[1] & 0xf)) { // Requested privilege level did not match. stdlog << "set session priv: Requested privilege level did not match: " << m_priv << ", " << (rsp_msg.m_data[1] & 0xf ) << " !\n"; return SA_ERR_HPI_INVALID_DATA; } return SA_OK; } SaErrorT cIpmiConLan::ActiveSession() { SaErrorT rv; cIpmiAddr addr( eIpmiAddrTypeSystemInterface ); cIpmiMsg msg( eIpmiNetfnApp, eIpmiCmdActivateSession ); cIpmiAddr rsp_addr; cIpmiMsg rsp_msg; msg.m_data[0] = m_auth; msg.m_data[1] = m_priv; memcpy( msg.m_data + 2, m_challenge_string, 16 ); IpmiSetUint32( msg.m_data + 18, m_inbound_seq_num ); msg.m_data_len = 22; rv = SendMsgAndWaitForResponse( addr, msg, rsp_addr, rsp_msg ); if ( rv != SA_OK ) return rv; if ( rsp_msg.m_data[0] != 0 ) { stdlog << "active session: " << rsp_msg.m_data[0] << " !\n"; return SA_ERR_HPI_INVALID_DATA; } if ( rsp_msg.m_data_len < 11 ) { stdlog << "active session: msg to small: " << rsp_msg.m_data_len << " !\n"; return SA_ERR_HPI_INVALID_DATA; } m_working_auth = (tIpmiAuthType)(rsp_msg.m_data[1] & 0xf); if ( m_working_auth != eIpmiAuthTypeNone && m_working_auth != m_auth ) { // Eh? It didn't return a valid authtype. stdlog << "active session: wrong auth: " << m_working_auth << " !\n"; return SA_ERR_HPI_INVALID_DATA; } m_session_id = IpmiGetUint32( rsp_msg.m_data + 2 ); m_outbound_seq_num = IpmiGetUint32( rsp_msg.m_data + 6 ); return SA_OK; } SaErrorT cIpmiConLan::Challange() { SaErrorT rv; cIpmiAddr addr( eIpmiAddrTypeSystemInterface ); cIpmiMsg msg( eIpmiNetfnApp, eIpmiCmdGetSessionChallenge ); cIpmiAddr rsp_addr; cIpmiMsg rsp_msg; msg.m_data[0] = m_auth; msg.m_data_len = 1; memcpy( msg.m_data + 1, m_username, dIpmiUsernameMax ); msg.m_data_len += dIpmiUsernameMax; rv = SendMsgAndWaitForResponse( addr, msg, rsp_addr, rsp_msg ); if ( rv != SA_OK ) return rv; if ( rsp_msg.m_data[0] != 0 ) { stdlog << "Challange returns: " << rsp_msg.m_data[0] << " !\n"; return SA_ERR_HPI_INVALID_DATA; } if ( rsp_msg.m_data_len < 21 ) { stdlog << "Challange response to small !\n"; return SA_ERR_HPI_INVALID_DATA; } // Get the temporary session id. m_session_id = IpmiGetUint32( rsp_msg.m_data + 1 ); m_outbound_seq_num = 0; m_working_auth = m_auth; memcpy( m_challenge_string, rsp_msg.m_data + 5, 16 ); // Get a random number of the other end to start sending me sequence // numbers at, but don't let it be zero. while( m_inbound_seq_num == 0 ) m_inbound_seq_num = random(); return SA_OK; } int cIpmiConLan::IfGetMaxSeq() { return 64; } int cIpmiConLan::IfOpen() { m_auth_method = IpmiAuthFactory( m_auth ); if ( m_auth_method == 0 ) { stdlog << "unknown authentication method " << m_auth << " !\n"; return -1; } m_auth_method->Init( (unsigned char *)m_passwd ); m_fd = OpenLanFd(); if ( m_fd < 0 ) return -1; SaErrorT rv = CreateSession(); if ( rv != SA_OK ) { close( m_fd ); m_fd = -1; } return m_fd; } SaErrorT cIpmiConLan::CreateSession() { m_ping_count = 0; m_outbound_seq_num = 0; m_session_id = 0; m_working_auth = eIpmiAuthTypeNone; m_recv_msg_map = 0; m_inbound_seq_num = 0; // start seq with 0 m_current_seq = 0; SaErrorT rv = AuthCap(); if ( rv != SA_OK ) return rv; rv = Challange(); if ( rv != SA_OK ) return rv; rv = ActiveSession(); if ( rv != SA_OK ) return rv; rv = SetSessionPriv(); if ( rv != SA_OK ) return rv; if ( m_num_outstanding != 0 ) return SA_ERR_HPI_INTERNAL_ERROR; // reset seq m_current_seq = 0; stdlog << "RMCP session is up.\n"; return SA_OK; } // Send a final "close session" to shut down the connection. void cIpmiConLan::SendCloseSession() { cIpmiAddr si( eIpmiAddrTypeSystemInterface ); cIpmiMsg msg( eIpmiNetfnApp, eIpmiCmdCloseSession ); IpmiSetUint32( msg.m_data, m_session_id ); msg.m_data_len = 4; cIpmiRequest r( si, msg ); r.m_seq = 1; IfSendCmd( &r ); } void cIpmiConLan::IfClose() { if ( m_fd >= 0 ) { SendCloseSession(); close( m_fd ); m_fd = -1; if ( m_auth_method ) { delete m_auth_method; m_auth_method = 0; } } } void cIpmiConLan::Reconnect() { stdlog << "RMCP reconnection in progress.\n"; RequeueOutstanding(); GList *list = m_queue; m_queue = 0; while( true ) { // send a ping SendPing(); if ( WaitForPong( m_timeout ) == false ) continue; stdlog << "close old RMCP session.\n"; SendCloseSession(); stdlog << "create new RMCP session.\n"; if ( CreateSession() == SA_OK ) break; } m_queue = list; stdlog << "RMCP reconnection done.\n"; } SaErrorT cIpmiConLan::IfSendCmd( cIpmiRequest *r ) { IfAddrToSendAddr( r->m_addr, r->m_send_addr ); unsigned char data[dIpmiMaxLanLen]; unsigned char *tmsg; int pos; int msgstart; switch( r->m_send_addr.m_type ) { case eIpmiAddrTypeSystemInterface: case eIpmiAddrTypeIpmb: case eIpmiAddrTypeIpmbBroadcast: break; default: return SA_ERR_HPI_INVALID_PARAMS; } data[0] = 6; // RMCP version 1.0. data[1] = 0; data[2] = 0xff; data[3] = 0x07; data[4] = m_working_auth; IpmiSetUint32( data+5, m_outbound_seq_num ); IpmiSetUint32( data+9, m_session_id ); if ( m_working_auth == eIpmiAuthTypeNone ) tmsg = data + 14; else tmsg = data + 30; if ( r->m_send_addr.m_type == eIpmiAddrTypeSystemInterface ) { // It's a message straight to the BMC. tmsg[0] = dIpmiBmcSlaveAddr; // To the BMC. tmsg[1] = (r->m_msg.m_netfn << 2) | r->m_send_addr.m_lun; tmsg[2] = Checksum( tmsg, 2 ); tmsg[3] = 0x81; // Remote console IPMI Software ID tmsg[4] = r->m_seq << 2; tmsg[5] = r->m_msg.m_cmd; memcpy( tmsg + 6, r->m_msg.m_data, r->m_msg.m_data_len ); pos = r->m_msg.m_data_len + 6; tmsg[pos] = Checksum( tmsg + 3, pos - 3 ); pos++; } else { // It's an IPMB address, route it using a send message // command. pos = 0; tmsg[pos++] = dIpmiBmcSlaveAddr; // BMC is the bridge. tmsg[pos++] = (eIpmiNetfnApp << 2) | 0; tmsg[pos++] = Checksum( tmsg, 2 ); tmsg[pos++] = 0x81; // Remote console IPMI Software ID tmsg[pos++] = r->m_seq << 2; tmsg[pos++] = eIpmiCmdSendMsg; tmsg[pos++] = (r->m_send_addr.m_channel & 0xf) | (1 << 6); // Turn on tracking if ( r->m_send_addr.m_type == eIpmiAddrTypeIpmbBroadcast ) tmsg[pos++] = 0; // Do a broadcast. msgstart = pos; tmsg[pos++] = r->m_send_addr.m_slave_addr; tmsg[pos++] = (r->m_msg.m_netfn << 2) | r->m_send_addr.m_lun; tmsg[pos++] = Checksum( tmsg + msgstart, 2 ); msgstart = pos; tmsg[pos++] = dIpmiBmcSlaveAddr; tmsg[pos++] = (r->m_seq << 2) | 2; // Add 2 as the SMS Lun tmsg[pos++] = r->m_msg.m_cmd; memcpy( tmsg + pos, r->m_msg.m_data, r->m_msg.m_data_len ); pos += r->m_msg.m_data_len; tmsg[pos] = Checksum( tmsg + msgstart, pos - msgstart ); pos++; tmsg[pos] = Checksum( tmsg + 3, pos - 3 ); pos++; } if ( m_working_auth == eIpmiAuthTypeNone ) { // No authentication, so no authcode. data[13] = pos; pos += 14; // Convert to pos in data } else { data[29] = pos; int rv = AuthGen( data+13, data+9, data+5, tmsg, pos ); if ( rv ) return SA_ERR_HPI_INVALID_PARAMS; pos += 30; // Convert to pos in data } // Increment the outbound number, but make sure it's not zero. If // it's already zero, ignore it, we are in pre-setup. if ( m_outbound_seq_num != 0 ) { m_outbound_seq_num++; if ( m_outbound_seq_num == 0 ) m_outbound_seq_num++; } int rv = sendto( m_fd, data, pos, 0, (struct sockaddr *)&m_ip_addr, sizeof(struct sockaddr_in) ); if ( rv == -1 ) return SA_ERR_HPI_NOT_PRESENT; return SA_OK; } cIpmiConLan::tResponseType cIpmiConLan::ReadResponse( int &seq, cIpmiAddr &addr, cIpmiMsg &msg ) { unsigned char data[dIpmiMaxLanLen]; struct sockaddr ipaddrd; struct sockaddr_in *ipaddr; int len; socklen_t from_len; uint32_t sess_id; unsigned char *tmsg; unsigned int data_len; from_len = sizeof( ipaddrd ); len = recvfrom( m_fd, data, dIpmiMaxLanLen, 0, &ipaddrd, &from_len ); if ( len < 0 ) return eResponseTypeError; // Make sure the source IP matches what we expect the other end to // be. ipaddr = (struct sockaddr_in *)(void *)&ipaddrd; if ( (ipaddr->sin_port != m_ip_addr.sin_port) || (ipaddr->sin_addr.s_addr != m_ip_addr.sin_addr.s_addr) ) { stdlog << "Dropped message due to invalid IP !\n"; return eResponseTypeError; } // Validate the length first, so we know that all the data in the // buffer we will deal with is valid. if ( len < 21 ) { // Minimum size of an IPMI msg. stdlog << "Dropped message because too small(1)\n"; return eResponseTypeError; } // Validate the RMCP portion of the message. if ( data[0] != 6 || data[2] != 0xff ) { stdlog << "Dropped message not valid IPMI/RMCP !\n"; return eResponseTypeError; } if ( data[3] == 0x06 ) { unsigned int asf_iana = IpmiGetUint32( data+4 ); if ( asf_iana != dAsfIana || data[8] != 0x40 ) { stdlog.Log( "Dropped message not valid RMCP pong message %04x, %04x, %02x !\n", asf_iana, dAsfIana, data[8] ); return eResponseTypeError; } m_ping_count--; stdlog << "reading RMCP pong.\n"; return eResponseTypePong; } if ( data[3] != 0x07 ) { stdlog << "Dropped message not valid IPMI/RMCP\n"; return eResponseTypeError; } if ( data[4] == 0 ) { // No authentication. if ( len < data[13] + 14 ) { // Not enough data was supplied, reject the message. stdlog << "Dropped message because too small(2)\n"; return eResponseTypeError; } // not enoough data bytes if ( data[13] <= 0 ) { // Not enough data was supplied, reject the message. stdlog << "Dropped message because data len is <=0 (1)\n"; return eResponseTypeError; } data_len = data[13]; } else { if ( len < 37 ) { // Minimum size of an authenticated IPMI msg. stdlog << "Dropped message because too small(3)\n"; return eResponseTypeError; } // authcode in message, add 16 to the above checks. if ( len < data[29] + 30 ) { // Not enough data was supplied, reject the message. stdlog << "Dropped message because too small(4)\n"; return eResponseTypeError; } // not enoough data bytes if ( data[29] <= 0 ) { // Not enough data was supplied, reject the message. stdlog << "Dropped message because data len is <=0 (2)\n"; return eResponseTypeError; } data_len = data[29]; } // Drop if the authtypes are incompatible. if ( m_working_auth != data[4] ) { stdlog << "Dropped message not valid authtype\n"; return eResponseTypeError; } // Drop if sessions ID's don't match. sess_id = IpmiGetUint32( data+9 ); if ( sess_id != m_session_id ) { stdlog << "Dropped message not valid session id " << sess_id << " != " << m_session_id << " !\n"; return eResponseTypeError; } seq = IpmiGetUint32( data+5 ); if ( data[4] != 0 ) { // Validate the message's authcode. Do this before checking // the session seq num so we know the data is valid. int rv = AuthCheck( data+9, data+5, data+30, data[29], data+13 ); if ( rv ) { stdlog << "Dropped message auth fail !\n"; return eResponseTypeError; } tmsg = data + 30; } else tmsg = data + 14; // Check the sequence number. if ( seq - m_inbound_seq_num <= 8 ) { // It's after the current sequence number, but within 8. We // move the sequence number forward. m_recv_msg_map <<= seq - m_inbound_seq_num; m_recv_msg_map |= 1; m_inbound_seq_num = seq; } else if ( m_inbound_seq_num - seq <= 8 ) { // It's before the current sequence number, but within 8. uint8_t bit = 1 << (m_inbound_seq_num - seq); if ( m_recv_msg_map & bit ) { stdlog << "Dropped message duplicate\n"; return eResponseTypeError; } m_recv_msg_map |= bit; } else { // It's outside the current sequence number range, discard // the packet. stdlog << "Dropped message out of seq range\n"; return eResponseTypeError; } // Now we have an authentic in-sequence message. // We don't check the checksums, because the network layer should // validate all this for us. if ( tmsg[5] == eIpmiCmdReadEventMsgBuffer && (tmsg[1] >> 2) == eIpmiNetfnAppRsp ) { // event if ( tmsg[6] != 0 ) { // An error getting the events, just ignore it. stdlog << "Dropped message err getting event\n"; return eResponseTypeError; } addr.m_type = eIpmiAddrTypeIpmb; addr.m_slave_addr = tmsg[3]; addr.m_lun = tmsg[4] & 0x3; addr.m_channel = 0; msg.m_netfn = (tIpmiNetfn)(tmsg[1] >> 2); msg.m_cmd = (tIpmiCmd)tmsg[5]; msg.m_data_len = data_len - 6 - 2; /* Remove completion code and checksum */ memcpy( msg.m_data, tmsg + 6 + 1, msg.m_data_len ); return eResponseTypeEvent; } seq = tmsg[4] >> 2; if ( m_outstanding[seq] == 0 ) { stdlog << "Dropped message seq not in use: " << (unsigned char)seq << " !\n"; return eResponseTypeError; } if ( tmsg[5] == eIpmiCmdSendMsg && (tmsg[1] >> 2) == eIpmiNetfnAppRsp ) { // It's a response to a sent message. // FIXME - this entire thing is a cheap hack. if ( tmsg[6] != 0 ) { // Got an error from the send message. We don't have any // IPMB information to work with, so just extract it from // the message. addr = m_outstanding[seq]->m_send_addr; // Just in case it's a broadcast. addr.m_type = eIpmiAddrTypeIpmb; msg.m_netfn = (tIpmiNetfn)(m_outstanding[seq]->m_msg.m_netfn | 1); msg.m_cmd = m_outstanding[seq]->m_msg.m_cmd; msg.m_data[0] = tmsg[6]; msg.m_data_len = 1; stdlog << "Read sent message " << tmsg[0] << " error " << tmsg[6] << ".\n"; } else { if ( data_len < 15 ) return eResponseTypeError; if ( tmsg[10] == m_slave_addr ) addr.Si(); else { addr.m_type = eIpmiAddrTypeIpmb; addr.m_channel = m_outstanding[seq]->m_send_addr.m_channel; addr.m_slave_addr = tmsg[10]; } addr.m_lun = tmsg[11] & 0x3; msg.m_netfn = (tIpmiNetfn)(tmsg[8] >> 2); msg.m_cmd = (tIpmiCmd)tmsg[12]; msg.m_data_len = data_len - 15; memcpy( msg.m_data, tmsg + 13, msg.m_data_len ); } } else if ( m_outstanding[seq]->m_send_addr.m_type == eIpmiAddrTypeSystemInterface && tmsg[3] == m_slave_addr ) { // In some cases, a message from the IPMB looks like it came // from the BMC itself, IMHO a misinterpretation of the // errata. IPMIv1_5_rev1_1_0926 markup, section 6.12.4, // didn't clear things up at all. Some manufacturers have // interpreted it this way, but IMHO it is incorrect. addr = m_outstanding[seq]->m_send_addr; msg.m_netfn = (tIpmiNetfn)(tmsg[1] >> 2); msg.m_cmd = (tIpmiCmd)tmsg[5]; msg.m_data_len = data_len - 7; memcpy( msg.m_data, tmsg+6, msg.m_data_len ); } else { // It's not encapsulated in a send message response. if ( tmsg[3] == m_slave_addr ) { // It's directly from the BMC, so it's a system interface // message. addr.Si(); addr.m_lun = tmsg[1] & 3; } else { // A message from the IPMB. addr.m_type = eIpmiAddrTypeIpmb; // This is a hack, but the channel does not come back in the // message. So we use the channel from the original // instead. addr.m_channel = m_outstanding[seq]->m_send_addr.m_channel; addr.m_slave_addr = tmsg[3]; addr.m_lun = tmsg[4] & 0x3; } msg.m_netfn = (tIpmiNetfn)(tmsg[1] >> 2); msg.m_cmd = (tIpmiCmd)tmsg[5]; msg.m_data_len = data_len - 6 - 1; // Remove the checksum memcpy( msg.m_data, tmsg+6, msg.m_data_len ); } if ( (tIpmiNetfn)(m_outstanding[seq]->m_msg.m_netfn | 1) != msg.m_netfn || m_outstanding[seq]->m_msg.m_cmd != msg.m_cmd ) { stdlog << "Message mismatch seq " << (unsigned char)seq << ":\n" << "read "; IpmiLogDataMsg( addr, msg ); stdlog << "\n"; stdlog << "expt "; IpmiLogDataMsg( m_outstanding[seq]->m_send_addr, m_outstanding[seq]->m_msg ); stdlog << "\n"; stdlog.Hex( data, len ); stdlog << "len " << len << ", m_num_outstanding " << m_num_outstanding << ", m_queue " << (m_queue ? "full" : "empty") << "\n"; return eResponseTypeError; } if ( m_outstanding[seq]->m_send_addr != m_outstanding[seq]->m_addr ) addr = m_outstanding[seq]->m_addr; return eResponseTypeMessage; } void cIpmiConLan::IfReadResponse() { int seq; cIpmiAddr addr; cIpmiMsg msg; tResponseType rt = ReadResponse( seq, addr, msg ); switch( rt ) { case eResponseTypeError: break; case eResponseTypePong: stdlog << "connection seems to be ok.\n"; HandleCheckConnection( true ); break; case eResponseTypeTimeout: break; case eResponseTypeMessage: HandleResponse( seq, addr, msg ); break; case eResponseTypeEvent: HandleEvent( addr, msg ); break; } } bool cIpmiConLan::IfCheckConnection( cTime &timeout ) { stdlog << "check connection.\n"; SendPing(); timeout = cTime::Now(); timeout += m_timeout; return true; } void cIpmiConLan::IfCheckConnectionTimeout() { stdlog << "connection timeout !\n"; m_queue_lock.Lock(); Reconnect(); m_queue_lock.Unlock(); } openhpi-3.6.1/plugins/ipmidirect/ipmi_entity.h0000644000175100017510000001064112575647277020520 0ustar mohanmohan/* * ipmi_entity.h * * Copyright (c) 2003,2004 by FORCE Computers * Copyright (c) 2005 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #ifndef dIpmiEntity_h #define dIpmiEntity_h #include #include extern "C" { #include "SaHpi.h" } #ifndef dIpmiEvent_h #include "ipmi_event.h" #endif enum tIpmiEntityId { eIpmiEntityInvalid = 0, eIpmiEntityIdOther = 1, eIpmiEntityIdUnknown = 2, eIpmiEntityIdProcessor = 3, eIpmiEntityIdDisk = 4, eIpmiEntityIdPeripheral = 5, eIpmiEntityIdSystemManagementModule = 6, eIpmiEntityIdSystemBoard = 7, eIpmiEntityIdMemoryModule = 8, eIpmiEntityIdProcessorModule = 9, eIpmiEntityIdPowerSupply = 10, eIpmiEntityIdAddInCard = 11, eIpmiEntityIdFrontPanelBoard = 12, eIpmiEntityIdBackPanelBoard = 13, eIpmiEntityIdPowerSystemBoard = 14, eIpmiEntityIdDriveBackplane = 15, eIpmiEntityIdSystemInternalExpansionBoard = 16, eIpmiEntityIdOtherSystemBoard = 17, eIpmiEntityIdProcessorBoard = 18, eIpmiEntityIdPowerUnit = 19, eIpmiEntityIdPowerModule = 20, eIpmiEntityIdPowerManagementBoard = 21, eIpmiEntityIdChassisBackPanelBoard = 22, eIpmiEntityIdSystemChassis = 23, eIpmiEntityIdSubChassis = 24, eIpmiEntityIdOtherChassisBoard = 25, eIpmiEntityIdDiskDriveBay = 26, eIpmiEntityIdPeripheralBay = 27, eIpmiEntityIdDeviceBay = 28, eIpmiEntityIdFanCooling = 29, eIpmiEntityIdCoolingUnit = 30, eIpmiEntityIdCableInterconnect = 31, eIpmiEntityIdMemoryDevice = 32, eIpmiEntityIdSystemManagementSoftware = 33, eIpmiEntityIdBios = 34, eIpmiEntityIdOperatingSystem = 35, eIpmiEntityIdSystemBus = 36, eIpmiEntityIdGroup = 37, eIpmiEntityIdRemoteMgmtCommDevice = 38, eIpmiEntityIdExternalEnvironment = 39, eIpmiEntityIdBattery = 40, eIpmiEntityIdProcessingBlade = 41, eIpmiEntityIdConnectivitySwitch = 42, eIpmiEntityIdProcessorMemoryModule = 43, eIpmiEntityIdIoModule = 44, eIpmiEntityIdProcessorIoModule = 45, eIpmiEntityIdMgmtControllerFirmware = 46, // PIGMIG entity ids eIpmiEntityIdPicMgFrontBoard = 0xa0, eIpmiEntityIdPicMgRearTransitionModule = 0xc0, eIpmiEntityIdPicMgAdvancedMcModule = 0xc1, eIpmiEntityIdPicMgMicroTcaCarrierHub = 0xc2, eIpmiEntityIdPicmgShelfManager = 0xf0, eIpmiEntityIdPicmgFiltrationUnit = 0xf1, eIpmiEntityIdPicmgShelfFruInformation = 0xf2, eIpmiEntityIdPicmgAlarmPanel = 0xf3, }; const char *IpmiEntityIdToString( tIpmiEntityId id ); // wrapper class for entity path class cIpmiEntityPath { public: SaHpiEntityPathT m_entity_path; cIpmiEntityPath(); cIpmiEntityPath( const SaHpiEntityPathT &entity_path ); operator SaHpiEntityPathT() { return m_entity_path; } void SetEntry( int idx, SaHpiEntityTypeT type, SaHpiEntityLocationT instance ); SaHpiEntityTypeT GetEntryType( int idx ); void SetEntryType( int idx, SaHpiEntityTypeT type ); SaHpiEntityLocationT GetEntryInstance( int idx ); void SetEntryInstance( int idx, SaHpiEntityLocationT instance ); cIpmiEntityPath &operator+=( const cIpmiEntityPath &epath ); bool operator==( const cIpmiEntityPath &epath ) const; bool operator!=( const cIpmiEntityPath &epath ) const; void AppendRoot( int idx ); bool FromString( const char *str ); }; cIpmiLog &operator<<( cIpmiLog &log, const cIpmiEntityPath &epath ); #endif openhpi-3.6.1/plugins/ipmidirect/ipmi_sensor_factors.h0000644000175100017510000000666412575647277022250 0ustar mohanmohan/* * ipmi_sensor_factors.h * * Copyright (c) 2004 by FORCE Computers * Copyright (c) 2005 by ESO Technologies. * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #ifndef dIpmiSensorFactors_h #define dIpmiSensorFactors_h extern "C" { #include "SaHpi.h" } #ifndef dIpmiSdr_h #include "ipmi_sdr.h" #endif // analog data format enum tIpmiAnalogeDataFormat { eIpmiAnalogDataFormatUnsigned = 0, eIpmiAnalogDataFormat1Compl = 1, eIpmiAnalogDataFormat2Compl = 2, eIpmiAnalogDataFormatNotAnalog = 3 }; const char *IpmiAnalogeDataFormatToString( tIpmiAnalogeDataFormat fmt ); // raw value linearization enum tIpmiLinearization { eIpmiLinearizationLinear = 0, eIpmiLinearizationLn = 1, eIpmiLinearizationLog10 = 2, eIpmiLinearizationLog2 = 3, eIpmiLinearizationE = 4, eIpmiLinearizationExp10 = 5, eIpmiLinearizationExp2 = 6, eIpmiLinearization1OverX = 7, eIpmiLinearizationSqr = 8, eIpmiLinearizationCube = 9, eIpmiLinearizationSqrt = 10, eIpmiLinearization1OverCube = 11, eIpmiLinearizationNonlinear = 0x70 }; const char *IpmiLinearizationToString( tIpmiLinearization val ); class cIpmiSensorFactors { public: cIpmiSensorFactors(); virtual ~cIpmiSensorFactors(); virtual bool GetDataFromSdr( const cIpmiSdr *sdr ); virtual bool Cmp( const cIpmiSensorFactors &sf ) const; tIpmiAnalogeDataFormat m_analog_data_format; tIpmiLinearization m_linearization; bool m_is_non_linear; int m_m : 10; unsigned int m_tolerance : 6; int m_b : 10; int m_r_exp : 4; unsigned int m_accuracy_exp : 2; int m_accuracy : 10; int m_b_exp : 4; double m_accuracy_factor; public: tIpmiAnalogeDataFormat AnalogDataFormat() const { return m_analog_data_format; } tIpmiLinearization Linearization() const { return m_linearization; } int M() const { return m_m; } unsigned int Tolerance() const { return m_tolerance; } int B() const { return m_b; } int RExp() const { return m_r_exp; } unsigned int AccuracyExp() const { return m_accuracy_exp; } int Accuracy() const { return m_accuracy; } double AccuracyFactor() const { return m_accuracy_factor; } int BExp() const { return m_b_exp; } bool IsNonLinear() const { return m_is_non_linear; } enum tIpmiRound { eRoundNormal, eRoundDown, eRoundUp }; bool ConvertFromRaw( unsigned int val, double &result, bool is_hysteresis ) const; bool ConvertToRaw( tIpmiRound rounding, double val, unsigned int &result, bool is_hysteresis, bool swap_thresholds ) const; }; #endif openhpi-3.6.1/plugins/ipmidirect/ipmi_inventory.h0000644000175100017510000000333412575647277021242 0ustar mohanmohan/* * * Copyright (c) 2004 by FORCE Computers. * Copyright (c) 2005 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #ifndef dIpmiInventory_h #define dIpmiInventory_h #ifndef dIpmiRdr_h #include "ipmi_rdr.h" #endif #ifndef dIpmiInventoryParser_h #include "ipmi_inventory_parser.h" #endif #ifndef dIpmiAddr_h #include "ipmi_addr.h" #endif enum tInventoryAccessMode { eInventoryAccessModeByte = 0, eInventoryAccessModeWord = 1 }; #define dMaxFruFetchBytes 20 class cIpmiInventory : public cIpmiRdr, public cIpmiInventoryParser { protected: unsigned char m_fru_device_id; // fru device id tInventoryAccessMode m_access; unsigned int m_size; bool m_fetched; unsigned int m_oem; cIpmiAddr m_addr; SaErrorT GetFruInventoryAreaInfo( unsigned int &size, tInventoryAccessMode &byte_access ); SaErrorT ReadFruData( unsigned short offset, unsigned int num, unsigned int &n, unsigned char *data ); public: cIpmiInventory( cIpmiMc *mc, unsigned int fru_device_id ); ~cIpmiInventory(); SaErrorT Fetch(); bool SetAddr( cIpmiAddr addr ); virtual unsigned int Num() const { return m_fru_device_id; } unsigned int &Oem() { return m_oem; } // create an RDR inventory record virtual bool CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ); }; #endif openhpi-3.6.1/plugins/ipmidirect/ipmi_control_sun_led.h0000644000175100017510000000323212575647277022373 0ustar mohanmohan/* * Copyright (c) 2009 by Sun Microsystems, Inc. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Chris Rinaldo */ #ifndef dIpmiControlSunLed_h #define dIpmiControlSunLed_h #include #include "ipmi_control.h" #include "ipmi_log.h" #include "ipmi_mc.h" #include "SaHpi.h" class cIpmiControlSunLed : public cIpmiControl { protected: uint8_t m_dev_access_addr; uint8_t m_dev_slave_addr; uint8_t m_entity_id; uint8_t m_entity_inst; uint8_t m_oem; SaHpiBoolT m_read_only; public: cIpmiControlSunLed(cIpmiMc *mc, unsigned int num, uint8_t dev_access_addr, uint8_t dev_slave_addr, uint8_t entity_id, uint8_t entity_inst, uint8_t oem, SaHpiBoolT read_only); virtual ~cIpmiControlSunLed(); virtual bool CreateRdr(SaHpiRptEntryT &resource, SaHpiRdrT &rdr); virtual SaErrorT SetState(const SaHpiCtrlModeT &mode, const SaHpiCtrlStateT &state); virtual SaErrorT GetState(SaHpiCtrlModeT &mode, SaHpiCtrlStateT &state); virtual void Dump(cIpmiLog &dump, const char *name) const; private: static const tIpmiCmd eIpmiCmdSunOemLedGet = static_cast (0x21); static const tIpmiCmd eIpmiCmdSunOemLedSet = static_cast (0x22); enum tLedState { eLedStateOff, eLedStateOn, eLedStateStandByBlink, eLedStateSlowBlink, eLedStateFastBlink }; }; #endif openhpi-3.6.1/plugins/ipmidirect/ipmi_control.cpp0000644000175100017510000000263512575647277021223 0ustar mohanmohan/* * ipmi_control.cpp * * Copyright (c) 2004 by FORCE Computers. * Copyright (c) 2005 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #include "ipmi_control.h" #include "ipmi_domain.h" cIpmiControl::cIpmiControl( cIpmiMc *mc, unsigned int num, SaHpiCtrlOutputTypeT output_type, SaHpiCtrlTypeT type ) : cIpmiRdr( mc, SAHPI_CTRL_RDR ), m_num( num ), m_output_type( output_type ), m_type( type ) { } cIpmiControl::~cIpmiControl() { } bool cIpmiControl::CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ) { if ( cIpmiRdr::CreateRdr( resource, rdr ) == false ) return false; // update resource resource.ResourceCapabilities |= SAHPI_CAPABILITY_RDR|SAHPI_CAPABILITY_CONTROL; // control record SaHpiCtrlRecT &rec = rdr.RdrTypeUnion.CtrlRec; rec.Num = (SaHpiCtrlNumT)m_num; rec.OutputType = m_output_type; rec.Type = m_type; rec.Oem = m_oem; return true; } openhpi-3.6.1/plugins/ipmidirect/ipmi_cmd.cpp0000644000175100017510000004733612575647277020315 0ustar mohanmohan/* * * Copyright (c) 2003 by FORCE Computers. * Copyright (c) 2005 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #include "ipmi_cmd.h" struct cConvMap { const char *m_name; int m_value; }; const char * ConvIntToString( int flags, const cConvMap *map, const char *def ) { for( int i = 0; map->m_name; i++, map++ ) if ( flags == map->m_value ) return map->m_name; return def; } static cConvMap netfn_map[] = { { "Chassis" , eIpmiNetfnChassis }, { "Bridge" , eIpmiNetfnBridge }, { "SensorEvent", eIpmiNetfnSensorEvent }, { "App" , eIpmiNetfnApp }, { "Firmware" , eIpmiNetfnFirmware }, { "Storage " , eIpmiNetfnStorage }, { "Transport" , eIpmiNetfnTransport }, { "Picmg " , eIpmiNetfnPicmg }, { "Oem" , eIpmiNetfnOem }, { 0, 0 } }; const char * IpmiNetfnToString( tIpmiNetfn netfn ) { return ConvIntToString( netfn, netfn_map, "Invalid" ); } static cConvMap completion_code_map[] = { { "Ok" , eIpmiCcOk }, { "NodeBusy" , eIpmiCcNodeBusy }, { "InvalidCmd" , eIpmiCcInvalidCmd }, { "CommandInvalidForLun" , eIpmiCcCommandInvalidForLun }, { "Timeout" , eIpmiCcTimeout }, { "OutOfSpace" , eIpmiCcOutOfSpace }, { "InvalidReservation" , eIpmiCcInvalidReservation }, { "RequestDataTruncated" , eIpmiCcRequestDataTruncated }, { "RequestDataLengthInvalid" , eIpmiCcRequestDataLengthInvalid }, { "RequestedDataLengthExceeded", eIpmiCcRequestedDataLengthExceeded }, { "ParameterOutOfRange" , eIpmiCcParameterOutOfRange }, { "CannotReturnReqLength" , eIpmiCcCannotReturnReqLength }, { "NotPresent" , eIpmiCcNotPresent }, { "InvalidDataField" , eIpmiCcInvalidDataField }, { "CommandIllegalForSensor" , eIpmiCcCommandIllegalForSensor }, { "CouldNotProvideResponse" , eIpmiCcCouldNotProvideResponse }, { "CannotExecDuplicateRequest" , eIpmiCcCannotExecDuplicateRequest }, { "RepositoryInUpdateMode" , eIpmiCcRepositoryInUpdateMode }, { "DeviceInFirmwareUpdate" , eIpmiCcDeviceInFirmwareUpdate }, { "BmcInitInProgress" , eIpmiCcBmcInitInProgress }, { "DestinationUnavailable" , eIpmiCcDestinationUnavailable }, { "InsufficientPrivilege" , eIpmiCcInsufficientPrivilege }, { "NotSupportedInPresentState" , eIpmiCcNotSupportedInPresentState }, { "UnknownErr" , eIpmiCcUnknownErr }, { 0, 0 } }; const char * IpmiCompletionCodeToString( tIpmiCompletionCode cc ) { return ConvIntToString( cc, completion_code_map, "Invalid" ); } struct cIpmiCmdToClass { const char *m_name; tIpmiNetfn m_netfn; tIpmiCmd m_cmd; }; static cIpmiCmdToClass cmd_class_map[] = { // Chassis netfn { "GetChassisCapabilities" , eIpmiNetfnChassis , eIpmiCmdGetChassisCapabilities }, { "GetChassisStatus" , eIpmiNetfnChassis , eIpmiCmdGetChassisStatus }, { "ChassisControl" , eIpmiNetfnChassis , eIpmiCmdChassisControl }, { "ChassisReset" , eIpmiNetfnChassis , eIpmiCmdChassisReset }, { "ChassisIdentify" , eIpmiNetfnChassis , eIpmiCmdChassisIdentify }, { "SetChassisCapabilities" , eIpmiNetfnChassis , eIpmiCmdSetChassisCapabilities }, { "SetPowerRestorePolicy" , eIpmiNetfnChassis , eIpmiCmdSetPowerRestorePolicy }, { "GetSystemRestartCause" , eIpmiNetfnChassis , eIpmiCmdGetSystemRestartCause }, { "SetSystemBootOptions" , eIpmiNetfnChassis , eIpmiCmdSetSystemBootOptions }, { "GetSystemBootOptions" , eIpmiNetfnChassis , eIpmiCmdGetSystemBootOptions }, { "GetPohCounter" , eIpmiNetfnChassis , eIpmiCmdGetPohCounter }, // Bridge netfn { "GetBridgeState" , eIpmiNetfnBridge , eIpmiCmdGetBridgeState }, { "SetBridgeState" , eIpmiNetfnBridge , eIpmiCmdSetBridgeState }, { "GetIcmbAddress" , eIpmiNetfnBridge , eIpmiCmdGetIcmbAddress }, { "SetIcmbAddress" , eIpmiNetfnBridge , eIpmiCmdSetIcmbAddress }, { "SetBridgeProxyAddress" , eIpmiNetfnBridge , eIpmiCmdSetBridgeProxyAddress }, { "GetBridgeStatistics" , eIpmiNetfnBridge , eIpmiCmdGetBridgeStatistics }, { "GetIcmbCapabilities" , eIpmiNetfnBridge , eIpmiCmdGetIcmbCapabilities }, { "ClearBridgeStatistics" , eIpmiNetfnBridge , eIpmiCmdClearBridgeStatistics }, { "GetBridgeProxyAddress" , eIpmiNetfnBridge , eIpmiCmdGetBridgeProxyAddress }, { "GetIcmbConnectorInfo" , eIpmiNetfnBridge , eIpmiCmdGetIcmbConnectorInfo }, { "SetIcmbConnectorInfo" , eIpmiNetfnBridge , eIpmiCmdSetIcmbConnectorInfo }, { "SendIcmbConnectionId" , eIpmiNetfnBridge , eIpmiCmdSendIcmbConnectionId }, { "PrepareForDiscovery" , eIpmiNetfnBridge , eIpmiCmdPrepareForDiscovery }, { "GetAddresses" , eIpmiNetfnBridge , eIpmiCmdGetAddresses }, { "SetDiscovered" , eIpmiNetfnBridge , eIpmiCmdSetDiscovered }, { "GetChassisDeviceId" , eIpmiNetfnBridge , eIpmiCmdGetChassisDeviceId }, { "SetChassisDeviceId" , eIpmiNetfnBridge , eIpmiCmdSetChassisDeviceId }, { "BridgeRequest" , eIpmiNetfnBridge , eIpmiCmdBridgeRequest }, { "BridgeMessage" , eIpmiNetfnBridge , eIpmiCmdBridgeMessage }, { "GetEventCount" , eIpmiNetfnBridge , eIpmiCmdGetEventCount }, { "SetEventdestination" , eIpmiNetfnBridge , eIpmiCmdSetEventdestination }, { "SetEventReceptionState" , eIpmiNetfnBridge , eIpmiCmdSetEventReceptionState }, { "SendIcmbEventMessage" , eIpmiNetfnBridge , eIpmiCmdSendIcmbEventMessage }, { "GetEventDestiation" , eIpmiNetfnBridge , eIpmiCmdGetEventDestiation }, { "GetEventReceptionState" , eIpmiNetfnBridge , eIpmiCmdGetEventReceptionState }, { "ErrorReport" , eIpmiNetfnBridge , eIpmiCmdErrorReport }, // Sensor/Event netfn { "SetEventReceiver" , eIpmiNetfnSensorEvent, eIpmiCmdSetEventReceiver }, { "GetEventReceiver" , eIpmiNetfnSensorEvent, eIpmiCmdGetEventReceiver }, { "PlatformEvent" , eIpmiNetfnSensorEvent, eIpmiCmdPlatformEvent }, { "GetPefCapabilities" , eIpmiNetfnSensorEvent, eIpmiCmdGetPefCapabilities }, { "ArmPefPostponeTimer" , eIpmiNetfnSensorEvent, eIpmiCmdArmPefPostponeTimer }, { "SetPefConfigParms" , eIpmiNetfnSensorEvent, eIpmiCmdSetPefConfigParms }, { "GetPefConfigParms" , eIpmiNetfnSensorEvent, eIpmiCmdGetPefConfigParms }, { "SetLastProcessedEventId" , eIpmiNetfnSensorEvent, eIpmiCmdSetLastProcessedEventId }, { "GetLastProcessedEventId" , eIpmiNetfnSensorEvent, eIpmiCmdGetLastProcessedEventId }, { "AlertImmediate" , eIpmiNetfnSensorEvent, eIpmiCmdAlertImmediate }, { "PetAcknowledge" , eIpmiNetfnSensorEvent, eIpmiCmdPetAcknowledge }, { "GetDeviceSdrInfo" , eIpmiNetfnSensorEvent, eIpmiCmdGetDeviceSdrInfo }, { "GetDeviceSdr" , eIpmiNetfnSensorEvent, eIpmiCmdGetDeviceSdr }, { "ReserveDeviceSdrRepository", eIpmiNetfnSensorEvent, eIpmiCmdReserveDeviceSdrRepository }, { "GetSensorReadingFactors" , eIpmiNetfnSensorEvent, eIpmiCmdGetSensorReadingFactors }, { "SetSensorHysteresis" , eIpmiNetfnSensorEvent, eIpmiCmdSetSensorHysteresis }, { "GetSensorHysteresis" , eIpmiNetfnSensorEvent, eIpmiCmdGetSensorHysteresis }, { "SetSensorThreshold" , eIpmiNetfnSensorEvent, eIpmiCmdSetSensorThreshold }, { "GetSensorThreshold" , eIpmiNetfnSensorEvent, eIpmiCmdGetSensorThreshold }, { "SetSensorEventEnable" , eIpmiNetfnSensorEvent, eIpmiCmdSetSensorEventEnable }, { "GetSensorEventEnable" , eIpmiNetfnSensorEvent, eIpmiCmdGetSensorEventEnable }, { "RearmSensorEvents" , eIpmiNetfnSensorEvent, eIpmiCmdRearmSensorEvents }, { "GetSensorEventStatus" , eIpmiNetfnSensorEvent, eIpmiCmdGetSensorEventStatus }, { "GetSensorReading" , eIpmiNetfnSensorEvent, eIpmiCmdGetSensorReading }, { "SetSensorType" , eIpmiNetfnSensorEvent, eIpmiCmdSetSensorType }, { "GetSensorType" , eIpmiNetfnSensorEvent, eIpmiCmdGetSensorType }, // App netfn { "GetDeviceId" , eIpmiNetfnApp , eIpmiCmdGetDeviceId }, { "BroadcastGetDeviceId" , eIpmiNetfnApp , eIpmiCmdBroadcastGetDeviceId }, { "ColdReset" , eIpmiNetfnApp , eIpmiCmdColdReset }, { "WarmReset" , eIpmiNetfnApp , eIpmiCmdWarmReset }, { "GetSelfTestResults" , eIpmiNetfnApp , eIpmiCmdGetSelfTestResults }, { "ManufacturingTestOn" , eIpmiNetfnApp , eIpmiCmdManufacturingTestOn }, { "SetAcpiPowerState" , eIpmiNetfnApp , eIpmiCmdSetAcpiPowerState }, { "GetAcpiPowerState" , eIpmiNetfnApp , eIpmiCmdGetAcpiPowerState }, { "GetDeviceGuid" , eIpmiNetfnApp , eIpmiCmdGetDeviceGuid }, { "ResetWatchdogTimer" , eIpmiNetfnApp , eIpmiCmdResetWatchdogTimer }, { "SetWatchdogTimer" , eIpmiNetfnApp , eIpmiCmdSetWatchdogTimer }, { "GetWatchdogTimer" , eIpmiNetfnApp , eIpmiCmdGetWatchdogTimer }, { "SetBmcGlobalEnables" , eIpmiNetfnApp , eIpmiCmdSetBmcGlobalEnables }, { "GetBmcGlobalEnables" , eIpmiNetfnApp , eIpmiCmdGetBmcGlobalEnables }, { "ClearMsgFlags" , eIpmiNetfnApp , eIpmiCmdClearMsgFlags }, { "GetMsgFlags" , eIpmiNetfnApp , eIpmiCmdGetMsgFlags }, { "EnableMessageChannelRcv" , eIpmiNetfnApp , eIpmiCmdEnableMessageChannelRcv }, { "GetMsg" , eIpmiNetfnApp , eIpmiCmdGetMsg }, { "SendMsg" , eIpmiNetfnApp , eIpmiCmdSendMsg }, { "ReadEventMsgBuffer" , eIpmiNetfnApp , eIpmiCmdReadEventMsgBuffer }, { "GetBtInterfaceCapabilities", eIpmiNetfnApp , eIpmiCmdGetBtInterfaceCapabilities }, { "GetSystemGuid" , eIpmiNetfnApp , eIpmiCmdGetSystemGuid }, { "GetChannelAuthCapabilities", eIpmiNetfnApp , eIpmiCmdGetChannelAuthCapabilities }, { "GetSessionChallenge" , eIpmiNetfnApp , eIpmiCmdGetSessionChallenge }, { "ActivateSession" , eIpmiNetfnApp , eIpmiCmdActivateSession }, { "SetSessionPrivilege" , eIpmiNetfnApp , eIpmiCmdSetSessionPrivilege }, { "CloseSession" , eIpmiNetfnApp , eIpmiCmdCloseSession }, { "GetSessionInfo" , eIpmiNetfnApp , eIpmiCmdGetSessionInfo }, { "GetAuthcode" , eIpmiNetfnApp , eIpmiCmdGetAuthcode }, { "SetChannelAccess" , eIpmiNetfnApp , eIpmiCmdSetChannelAccess }, { "GetChannelAccess" , eIpmiNetfnApp , eIpmiCmdGetChannelAccess }, { "GetChannelInfo" , eIpmiNetfnApp , eIpmiCmdGetChannelInfo }, { "SetUserAccess" , eIpmiNetfnApp , eIpmiCmdSetUserAccess }, { "GetUserAccess" , eIpmiNetfnApp , eIpmiCmdGetUserAccess }, { "SetUserName" , eIpmiNetfnApp , eIpmiCmdSetUserName }, { "GetUserName" , eIpmiNetfnApp , eIpmiCmdGetUserName }, { "SetUserPassword" , eIpmiNetfnApp , eIpmiCmdSetUserPassword }, { "MasterReadWrite" , eIpmiNetfnApp , eIpmiCmdMasterReadWrite }, // Storage netfn { "GetFruInventoryAreaInfo" , eIpmiNetfnStorage , eIpmiCmdGetFruInventoryAreaInfo }, { "ReadFruData" , eIpmiNetfnStorage , eIpmiCmdReadFruData }, { "WriteFruData" , eIpmiNetfnStorage , eIpmiCmdWriteFruData }, { "GetSdrRepositoryInfo" , eIpmiNetfnStorage , eIpmiCmdGetSdrRepositoryInfo }, { "GetSdrRepositoryAllocInfo" , eIpmiNetfnStorage , eIpmiCmdGetSdrRepositoryAllocInfo }, { "ReserveSdrRepository" , eIpmiNetfnStorage , eIpmiCmdReserveSdrRepository }, { "GetSdr" , eIpmiNetfnStorage , eIpmiCmdGetSdr }, { "AddSdr" , eIpmiNetfnStorage , eIpmiCmdAddSdr }, { "PartialAddSdr" , eIpmiNetfnStorage , eIpmiCmdPartialAddSdr }, { "DeleteSdr" , eIpmiNetfnStorage , eIpmiCmdDeleteSdr }, { "ClearSdrRepository" , eIpmiNetfnStorage , eIpmiCmdClearSdrRepository }, { "GetSdrRepositoryTime" , eIpmiNetfnStorage , eIpmiCmdGetSdrRepositoryTime }, { "SetSdrRepositoryTime" , eIpmiNetfnStorage , eIpmiCmdSetSdrRepositoryTime }, { "EnterSdrRepositoryUpdate" , eIpmiNetfnStorage , eIpmiCmdEnterSdrRepositoryUpdate }, { "ExitSdrRepositoryUpdate" , eIpmiNetfnStorage , eIpmiCmdExitSdrRepositoryUpdate }, { "RunInitializationAgent" , eIpmiNetfnStorage , eIpmiCmdRunInitializationAgent }, { "GetSelInfo" , eIpmiNetfnStorage , eIpmiCmdGetSelInfo }, { "GetSelAllocationInfo" , eIpmiNetfnStorage , eIpmiCmdGetSelAllocationInfo }, { "ReserveSel" , eIpmiNetfnStorage , eIpmiCmdReserveSel }, { "GetSelEntry" , eIpmiNetfnStorage , eIpmiCmdGetSelEntry }, { "AddSelEntry" , eIpmiNetfnStorage , eIpmiCmdAddSelEntry }, { "PartialAddSelEntry" , eIpmiNetfnStorage , eIpmiCmdPartialAddSelEntry }, { "DeleteSelEntry" , eIpmiNetfnStorage , eIpmiCmdDeleteSelEntry }, { "ClearSel" , eIpmiNetfnStorage , eIpmiCmdClearSel }, { "GetSelTime" , eIpmiNetfnStorage , eIpmiCmdGetSelTime }, { "SetSelTime" , eIpmiNetfnStorage , eIpmiCmdSetSelTime }, { "GetAuxiliaryLogStatus" , eIpmiNetfnStorage , eIpmiCmdGetAuxiliaryLogStatus }, { "SetAuxiliaryLogStatus" , eIpmiNetfnStorage , eIpmiCmdSetAuxiliaryLogStatus }, // Transport netfn { "SetLanConfigParms" , eIpmiNetfnTransport , eIpmiCmdSetLanConfigParms }, { "GetLanConfigParms" , eIpmiNetfnTransport , eIpmiCmdGetLanConfigParms }, { "SuspendBmcArps" , eIpmiNetfnTransport , eIpmiCmdSuspendBmcArps }, { "GetIpUdpRmcpStats" , eIpmiNetfnTransport , eIpmiCmdGetIpUdpRmcpStats }, { "SetSerialModemConfig" , eIpmiNetfnTransport , eIpmiCmdSetSerialModemConfig }, { "GetSerialModemConfig" , eIpmiNetfnTransport , eIpmiCmdGetSerialModemConfig }, { "SetSerialModemMux" , eIpmiNetfnTransport , eIpmiCmdSetSerialModemMux }, { "GetTapResponseCodes" , eIpmiNetfnTransport , eIpmiCmdGetTapResponseCodes }, { "SetPppUdpProxyXmitData" , eIpmiNetfnTransport , eIpmiCmdSetPppUdpProxyXmitData }, { "GetPppUdpProxyXmitData" , eIpmiNetfnTransport , eIpmiCmdGetPppUdpProxyXmitData }, { "SendPppUdpProxyPacket" , eIpmiNetfnTransport , eIpmiCmdSendPppUdpProxyPacket }, { "GetPppUdpProxyRecvData" , eIpmiNetfnTransport , eIpmiCmdGetPppUdpProxyRecvData }, { "SerialModemConnActive" , eIpmiNetfnTransport , eIpmiCmdSerialModemConnActive }, { "Callback" , eIpmiNetfnTransport , eIpmiCmdCallback }, { "SetUserCallbackOptions" , eIpmiNetfnTransport , eIpmiCmdSetUserCallbackOptions }, { "GetUserCallbackOptions" , eIpmiNetfnTransport , eIpmiCmdGetUserCallbackOptions }, // PICMG netfn { "GetPicMgProperties" , eIpmiNetfnPicmg , eIpmiCmdGetPicMgProperties }, { "GetAddressInfo" , eIpmiNetfnPicmg , eIpmiCmdGetAddressInfo }, { "GetShelfAddressInfo" , eIpmiNetfnPicmg , eIpmiCmdGetShelfAddressInfo }, { "SetShelfAddressInfo" , eIpmiNetfnPicmg , eIpmiCmdSetShelfAddressInfo }, { "FruControl" , eIpmiNetfnPicmg , eIpmiCmdFruControl }, { "GetFruLedProperties" , eIpmiNetfnPicmg , eIpmiCmdGetFruLedProperties }, { "GetLedColorCapabilities" , eIpmiNetfnPicmg , eIpmiCmdGetLedColorCapabilities }, { "SetFruLedState" , eIpmiNetfnPicmg , eIpmiCmdSetFruLedState }, { "GetFruLedState" , eIpmiNetfnPicmg , eIpmiCmdGetFruLedState }, { "SetIpmbState" , eIpmiNetfnPicmg , eIpmiCmdSetIpmbState }, { "SetFruActivationPolicy" , eIpmiNetfnPicmg , eIpmiCmdSetFruActivationPolicy }, { "GetFruActivationPolicy" , eIpmiNetfnPicmg , eIpmiCmdGetFruActivationPolicy }, { "SetFruActivation" , eIpmiNetfnPicmg , eIpmiCmdSetFruActivation }, { "GetDeviceLocatorRecordId" , eIpmiNetfnPicmg , eIpmiCmdGetDeviceLocatorRecordId }, { "SetPortState" , eIpmiNetfnPicmg , eIpmiCmdSetPortState }, { "GetPortState" , eIpmiNetfnPicmg , eIpmiCmdGetPortState }, { "ComputePowerProperties" , eIpmiNetfnPicmg , eIpmiCmdComputePowerProperties }, { "SetPowerLevel" , eIpmiNetfnPicmg , eIpmiCmdSetPowerLevel }, { "GetPowerLevel" , eIpmiNetfnPicmg , eIpmiCmdGetPowerLevel }, { "RenegotiatePower" , eIpmiNetfnPicmg , eIpmiCmdRenegotiatePower }, { "GetFanSpeedProperties" , eIpmiNetfnPicmg , eIpmiCmdGetFanSpeedProperties }, { "SetFanLevel" , eIpmiNetfnPicmg , eIpmiCmdSetFanLevel }, { "GetFanLevel" , eIpmiNetfnPicmg , eIpmiCmdGetFanLevel }, { "BusedResource" , eIpmiNetfnPicmg , eIpmiCmdBusedResource }, { "GetIpmbLinkInfo" , eIpmiNetfnPicmg , eIpmiCmdGetIpmbLinkInfo }, { 0 , eIpmiNetfnChassis , eIpmiCmdGetChassisCapabilities } }; const char * IpmiCmdToString( tIpmiNetfn netfn, tIpmiCmd cmd ) { for( int i = 0; cmd_class_map[i].m_name; i++ ) { cIpmiCmdToClass *cc = &cmd_class_map[i]; if ( cc->m_netfn == netfn && cc->m_cmd == cmd ) return cc->m_name; } return "Invalid"; } openhpi-3.6.1/plugins/ipmidirect/ipmi_fru_info.cpp0000644000175100017510000001122112575647277021341 0ustar mohanmohan/* * ipmi_fru_info.cpp * * Copyright (c) 2004 by FORCE Computers. * Copyright (c) 2005 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ extern "C" { #include "SaHpiAtca.h" } #include #include "ipmi_fru_info.h" SaHpiEntityTypeT MapAtcaSiteTypeToEntity( tIpmiAtcaSiteType type ) { static SaHpiEntityTypeT et[] = { SAHPI_ENT_PHYSICAL_SLOT, SaHpiEntityTypeT(ATCAHPI_ENT_POWER_ENTRY_MODULE_SLOT), SaHpiEntityTypeT(ATCAHPI_ENT_SHELF_FRU_DEVICE_SLOT), SaHpiEntityTypeT(ATCAHPI_ENT_SHELF_MANAGER_SLOT), SaHpiEntityTypeT(ATCAHPI_ENT_FAN_TRAY_SLOT), SaHpiEntityTypeT(ATCAHPI_ENT_FAN_FILTER_TRAY_SLOT), SaHpiEntityTypeT(ATCAHPI_ENT_ALARM_SLOT), SaHpiEntityTypeT(ATCAHPI_ENT_AMC_SLOT), SaHpiEntityTypeT(ATCAHPI_ENT_PMC_SLOT), SaHpiEntityTypeT(ATCAHPI_ENT_RTM_SLOT), SaHpiEntityTypeT(ATCAHPI_ENT_SHELF_MANAGER_SLOT), SaHpiEntityTypeT(ATCAHPI_ENT_POWER_ENTRY_MODULE_SLOT) }; if ( type >= eIpmiAtcaSiteTypeUnknown ) { return SAHPI_ENT_UNKNOWN; } return et[type]; } cIpmiFruInfo::cIpmiFruInfo( unsigned int addr, unsigned int fru_id, SaHpiEntityTypeT entity, unsigned int slot, tIpmiAtcaSiteType site, unsigned int properties ) : m_addr( addr ), m_fru_id( fru_id ), m_slot( slot ), m_entity( entity ), m_site( site ), m_properties( properties ) { } cIpmiFruInfo::~cIpmiFruInfo() { } cIpmiEntityPath cIpmiFruInfo::CreateEntityPath( const cIpmiEntityPath &top, const cIpmiEntityPath &bottom ) { cIpmiEntityPath middle; middle.SetEntry( 0, m_entity, m_slot ); middle.AppendRoot( 1 ); cIpmiEntityPath ep = bottom; ep += middle; ep += top; return ep; } cIpmiFruInfoContainer::cIpmiFruInfoContainer() : m_fru_info( 0 ) { } cIpmiFruInfoContainer::~cIpmiFruInfoContainer() { while( m_fru_info ) { cIpmiFruInfo *fi = (cIpmiFruInfo *)m_fru_info->data; m_fru_info = g_list_remove( m_fru_info, fi ); delete fi; } } cIpmiFruInfo * cIpmiFruInfoContainer::FindFruInfo( unsigned int addr, unsigned int fru_id ) const { for( GList *list = m_fru_info; list; list = g_list_next( list ) ) { cIpmiFruInfo *fi = (cIpmiFruInfo *)list->data; if ( fi->Address() == addr && fi->FruId() == fru_id ) return fi; } return 0; } bool cIpmiFruInfoContainer::AddFruInfo( cIpmiFruInfo *fru_info ) { if ( FindFruInfo( fru_info->Address(), fru_info->FruId() ) ) { return false; } m_fru_info = g_list_append( m_fru_info, fru_info ); return true; } bool cIpmiFruInfoContainer::RemFruInfo( cIpmiFruInfo *fru_info ) { for( GList *list = m_fru_info; list; list = g_list_next( list ) ) { cIpmiFruInfo *fi = (cIpmiFruInfo *)list->data; if ( fi == fru_info ) { m_fru_info = g_list_remove( m_fru_info, fru_info ); delete fru_info; return true; } } return false; } cIpmiFruInfo * cIpmiFruInfoContainer::NewFruInfo( unsigned int addr, unsigned int fru_id, SaHpiEntityTypeT entity, unsigned int slot, tIpmiAtcaSiteType site, unsigned int properties ) { assert( fru_id == 0 ); cIpmiFruInfo *fi = FindFruInfo( addr, fru_id ); if ( fi ) return fi; fi = new cIpmiFruInfo( addr, fru_id, entity, slot, site, properties ); if ( !AddFruInfo( fi ) ) { delete fi; return 0; } return fi; } cIpmiFruInfo * cIpmiFruInfoContainer::NewFruInfo( unsigned int addr, unsigned int fru_id ) { assert( fru_id != 0 ); cIpmiFruInfo *fi = FindFruInfo( addr, fru_id ); if ( fi ) return fi; cIpmiFruInfo *fi0 = FindFruInfo( addr, 0 ); assert ( fi0 != NULL ); fi = new cIpmiFruInfo( addr, fru_id, fi0->Entity(), fi0->Slot(), fi0->Site(), 0 ); if ( !AddFruInfo( fi ) ) { delete fi; return 0; } return fi; } unsigned int cIpmiFruInfoContainer::GetFreeSlotForOther( unsigned int addr ) { return addr; #if 0 unsigned int slot = 0; for( GList *list = m_fru_info; list; list = g_list_next( list ) ) { cIpmiFruInfo *fi = (cIpmiFruInfo *)list->data; if ( fi->Address() != addr || fi->Entity() ) continue; if ( slot < fi->Slot() ) slot = fi->Slot(); } return slot + 1; #endif } openhpi-3.6.1/plugins/ipmidirect/ipmi_event.cpp0000644000175100017510000000773212575647277020667 0ustar mohanmohan/* * ipmi_event.c * * Copyright (c) 2003 by FORCE Computers * Copyright (c) 2007 by ESO Technologies. * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #include #include "ipmi_event.h" #include "ipmi_utils.h" #include "ipmi_log.h" #include "ipmi_sensor.h" #include "ipmi_mc.h" static const char *thres_map[] = { "LowerNonCritical", "LowerCritical", "LowerNonRecoverable", "UpperNonCritical", "UpperCritical", "UpperNonRecoverable" }; static int thres_map_num = sizeof( thres_map ) / sizeof( char * ); const char * IpmiThresToString( tIpmiThresh val ) { if ( val >= thres_map_num ) return "invalid"; return thres_map[val]; } void IpmiThresholdMaskToString( unsigned int mask, char *str ) { *str = 0; for( int i = 0; i < 6; i++ ) if ( mask & ( 1 << i ) ) { if ( *str ) strcat( str, " | " ); strcat( str, thres_map[i] ); } } cIpmiEvent::cIpmiEvent() : m_mc( 0 ), m_record_id( 0 ), m_type( 0 ) { memset( m_data, 0, dIpmiMaxSelData ); } int cIpmiEvent::Cmp( const cIpmiEvent &event2 ) const { // if ( event1->mc != event2->mc ) // return 1; if ( m_record_id > event2.m_record_id ) return 1; if ( m_record_id < event2.m_record_id ) return -1; if ( m_type > event2.m_type ) return 1; if ( m_type < event2.m_type ) return -1; return memcmp( m_data, event2.m_data, 13 ); } void cIpmiEvent::Dump( cIpmiLog &dump, const char *name ) const { dump.Begin( "Event", name ); dump.Entry( "RecordId" ) << m_record_id << ";\n"; char str[80]; if ( m_type == 0x02 ) strcpy( str, "SystemEvent" ); else snprintf( str, sizeof(str), "0x%02x", m_type ); dump.Entry( "RecordType" ) << str << ";\n"; unsigned int t = IpmiGetUint32( m_data ); dump.Hex( true ); dump.Entry( "Timestamp" ) << t << ";\n"; dump.Hex( false ); dump.Entry( "SlaveAddr" ) << m_data[4] << ";\n"; dump.Entry( "Channel" ) << (m_data[5] >> 4) << ";\n"; dump.Entry( "Lun" ) << (m_data[5] & 3 ) << ";\n"; dump.Entry( "Revision" ) << (unsigned int)m_data[6] << ";\n"; tIpmiSensorType sensor_type = (tIpmiSensorType)m_data[7]; if ( !strcmp( IpmiSensorTypeToString( sensor_type ), "Invalid" ) ) snprintf( str, sizeof(str), "0x%02x", sensor_type ); else snprintf( str, sizeof(str), "%s", IpmiSensorTypeToString( sensor_type ) ); dump.Entry( "SensorType" ) << str << ";\n"; snprintf( str, sizeof(str), "0x%02x", m_data[8] ); dump.Entry( "SensorNum" ) << str << ";\n"; dump.Entry( "EventDirection" ) << ((m_data[9] & 0x80) ? "Deassertion" : "Assertion" ) << ";\n"; tIpmiEventReadingType reading_type = (tIpmiEventReadingType)(m_data[9] & 0x7f); if ( !strcmp( IpmiEventReadingTypeToString( reading_type ), "Invalid" ) ) snprintf( str, sizeof(str), "0x%02x", reading_type ); else snprintf( str, sizeof(str), "%s", IpmiEventReadingTypeToString( reading_type ) ); dump.Entry( "EventReadingType" ) << str << ";\n"; snprintf( str, sizeof(str), "0x%02x", m_data[10] ); dump.Entry( "EventData1" ) << str << ";\n"; snprintf( str, sizeof(str), "0x%02x", m_data[11] ); dump.Entry( "EventData2" ) << str << ";\n"; snprintf( str, sizeof(str), "0x%02x", m_data[12] ); dump.Entry( "EventData3" ) << str << ";\n"; dump.End(); } openhpi-3.6.1/plugins/ipmidirect/ipmi_mc_vendor.h0000644000175100017510000001417412575647277021165 0ustar mohanmohan/* * ipmi_mc_vendor.h * * Copyright (c) 2004 by FORCE Computers * Copyright (c) 2005-2006 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #ifndef dIpmiMcVendor_h #define dIpmiMcVendor_h #ifndef dIpmiSensorHotswap_h #include "ipmi_sensor_hotswap.h" #endif #ifndef dIpmiSensorThreshold_h #include "ipmi_sensor_threshold.h" #endif #ifndef dIpmiMsg_h #include "ipmi_msg.h" #endif #ifndef dIpmiFruInfo_h #include "ipmi_fru_info.h" #endif #ifndef dIpmiInventory_h #include "ipmi_inventory.h" #endif class cIpmiMc; class cIpmiMcVendor { static SaHpiEntityLocationT m_unique_instance; public: unsigned int m_manufacturer_id; unsigned int m_product_id; char m_description[80]; cIpmiMcVendor( unsigned int manufacturer_id, unsigned int product_id, const char *desc ); virtual ~cIpmiMcVendor(); SaHpiEntityLocationT GetUniqueInstance() { return m_unique_instance++; } // a new MC is found virtual bool InitMc( cIpmiMc *mc, const cIpmiMsg &devid ); // cleanup code for an MC virtual void CleanupMc( cIpmiMc *mc ); // give vendors a chance to modify the sdrs virtual bool ProcessSdr( cIpmiDomain *domain, cIpmiMc *mc, cIpmiSdrs *sdrs ); virtual bool ProcessFru( cIpmiInventory *inv, cIpmiMc *mc, unsigned int sa, SaHpiEntityTypeT type); // called after reading an SDR to create sensors, controls, frus, sel virtual bool CreateRdrs( cIpmiDomain *domain, cIpmiMc *mc, cIpmiSdrs *sdrs ); // create resources from sdr virtual bool CreateResources( cIpmiDomain *domain, cIpmiMc *source_mc, cIpmiSdrs *sdrs ); // find or create resource virtual cIpmiResource *FindOrCreateResource( cIpmiDomain *domain, cIpmiMc *mc, unsigned int fru_id, cIpmiSdr *sdr, cIpmiSdrs *sdrs ); // find resource virtual cIpmiResource *FindResource( cIpmiDomain *domain, cIpmiMc *mc, unsigned int fru_id, cIpmiSdr *sdr, cIpmiSdrs *sdrs ); virtual cIpmiResource *FindResource( cIpmiDomain *domain, cIpmiMc *mc, unsigned int fru_id, SaHpiEntityTypeT type, SaHpiEntityLocationT instance, cIpmiSdrs *sdrs ); protected: // create a new resource virtual cIpmiResource *CreateResource( cIpmiDomain *domain, cIpmiMc *mc, unsigned int fru_id, cIpmiSdr *sdr, cIpmiSdrs *sdrs ); cIpmiEntityPath CreateEntityPath( cIpmiDomain *domain, unsigned int mc_addr, unsigned int fru_id, SaHpiEntityTypeT type, SaHpiEntityLocationT instance, cIpmiSdrs *sdrs ); public: // create sensors virtual bool CreateSensors( cIpmiDomain *domain, cIpmiMc *source_mc, cIpmiSdrs *sdrs ); protected: virtual GList *GetSensorsFromSdrs( cIpmiDomain *domain, cIpmiMc *source_mc, cIpmiSdrs *sdrs ); virtual GList *CreateSensorFromFullSensorRecord( cIpmiDomain *domain, cIpmiMc *source_mc, cIpmiSdr *sdr, cIpmiSdrs *sdrs ); virtual GList *CreateSensorHotswap( cIpmiDomain *domain, cIpmiMc *mc, cIpmiSdr *sdr, cIpmiSdrs *sdrs ); virtual GList *CreateSensorThreshold( cIpmiDomain *domain, cIpmiMc *mc, cIpmiSdr *sdr, cIpmiSdrs *sdrs ); virtual GList *CreateSensorDiscrete( cIpmiDomain *domain, cIpmiMc *mc, cIpmiSdr *sdr , cIpmiSdrs *sdrs); virtual GList *CreateSensorDefault( cIpmiDomain *domain, cIpmiMc *mc, cIpmiSdr *sdr, cIpmiSdrs *sdrs ); void CreateSensorEntityPath( cIpmiDomain *domain, cIpmiSensor *s, cIpmiMc *source_mc, cIpmiSdr *sdr, cIpmiSdrs *sdrs ); virtual cIpmiMc *FindMcBySdr( cIpmiDomain *domain, cIpmiSdr *sdr ); public: // create controls virtual bool CreateControls( cIpmiDomain *domain, cIpmiMc *mc, cIpmiSdrs *sdrs ); protected: virtual bool CreateControlsAtca( cIpmiDomain *domain, cIpmiMc *mc, cIpmiSdrs *sdrs ); virtual bool CreateControlAtcaFan( cIpmiDomain *domain, cIpmiResource *res, cIpmiSdrs *sdrs ); virtual bool CreateControlAtcaLed( cIpmiDomain *domain, cIpmiResource *res, cIpmiSdrs *sdrs ); public: // create inventory virtual bool CreateInvs( cIpmiDomain *domain, cIpmiMc *mc, cIpmiSdrs *sdrs ); protected: virtual bool CreateInv( cIpmiDomain *domain, cIpmiMc *mc, cIpmiSdr *sdr, cIpmiSdrs *sdrs ); public: // create watchdogs virtual bool CreateWatchdogs( cIpmiDomain *domain, cIpmiMc *mc ); public: // create SEL virtual bool CreateSels( cIpmiDomain *domain, cIpmiMc *source_mc, cIpmiSdrs *sdrs ); }; class cIpmiMcVendorFactory { static cIpmiMcVendorFactory *m_factory; cIpmiMcVendorFactory(); ~cIpmiMcVendorFactory(); public: static void InitFactory(); static void CleanupFactory(); static cIpmiMcVendorFactory *GetFactory() { return m_factory; } protected: // list of all vendor MCs GList *m_mc_vendors; // default mc vendor cIpmiMcVendor *m_default; public: // register a new cIpmiMcVendor bool Register( cIpmiMcVendor *mv ); // unregister cIpmiMcVendor bool Unregister( unsigned int manufacturer_id, unsigned int product_id ); // find a cIpmiMcVendor to a give manufacturer id and product id cIpmiMcVendor *Find( unsigned int manufacturer_id, unsigned int product_id ); // returns the default if not found cIpmiMcVendor *Get( unsigned int manufacturer_id, unsigned int product_id ); cIpmiMcVendor *Default() { return m_default; } }; #endif openhpi-3.6.1/plugins/ipmidirect/Makefile.am0000644000175100017510000000714512575647277020056 0ustar mohanmohan# # Copyright (c) 2003, Intel Corporation # All rights reserved. # # Redistribution and use in source and binary forms, with or # without modification, are permitted provided that the following # conditions are met: # # Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the distribution. # # Neither the name of Intel Corporation nor the names # of its contributors may be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, # OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # MAINTAINERCLEANFILES = Makefile.in *~ core core.* AM_CPPFLAGS = -DG_LOG_DOMAIN=\"ipmidirect\" AM_CPPFLAGS += @OPENHPI_INCLUDES@ SUBDIRS = t DIST_SUBDIRS = t pkglib_LTLIBRARIES = libipmidirect.la libipmidirect_la_SOURCES= \ array.h \ hotswap.cpp \ ipmi.h \ ipmi.cpp \ ipmi_addr.h \ ipmi_addr.cpp \ ipmi_auth.h \ ipmi_auth.cpp \ ipmi_cmd.h \ ipmi_cmd.cpp \ ipmi_con.h \ ipmi_con.cpp \ ipmi_con_lan.h \ ipmi_con_lan.cpp \ ipmi_con_smi.h \ ipmi_con_smi.cpp \ ipmi_control.h \ ipmi_control.cpp \ ipmi_control_atca_led.h \ ipmi_control_atca_led.cpp \ ipmi_control_fan.h \ ipmi_control_fan.cpp \ ipmi_control_sun_led.h \ ipmi_control_sun_led.cpp \ ipmi_discover.h \ ipmi_discover.cpp \ ipmi_domain.h \ ipmi_domain.cpp \ ipmi_entity.h \ ipmi_entity.cpp \ ipmi_event.h \ ipmi_event.cpp \ ipmi_fru_info.h \ ipmi_fru_info.cpp \ ipmi_inventory.h \ ipmi_inventory.cpp \ ipmi_inventory_parser.h \ ipmi_inventory_parser.cpp \ ipmi_log.h \ ipmi_log.cpp \ ipmi_mc.h \ ipmi_mc.cpp \ ipmi_mc_vendor.h \ ipmi_mc_vendor.cpp \ ipmi_mc_vendor_force.h \ ipmi_mc_vendor_force.cpp \ ipmi_mc_vendor_intel.h \ ipmi_mc_vendor_intel.cpp \ ipmi_mc_vendor_sun.h \ ipmi_mc_vendor_sun.cpp \ ipmi_mc_vendor_fix_sdr.h \ ipmi_mc_vendor_fix_sdr.cpp \ ipmi_msg.h \ ipmi_msg.cpp \ ipmi_rdr.h \ ipmi_rdr.cpp \ ipmi_resource.h \ ipmi_resource.cpp \ ipmi_sdr.h \ ipmi_sdr.cpp \ ipmi_sel.h \ ipmi_sel.cpp \ ipmi_sensor.h \ ipmi_sensor.cpp \ ipmi_sensor_discrete.h \ ipmi_sensor_discrete.cpp \ ipmi_sensor_factors.h \ ipmi_sensor_factors.cpp \ ipmi_sensor_hotswap.h \ ipmi_sensor_hotswap.cpp \ ipmi_sensor_threshold.h \ ipmi_sensor_threshold.cpp \ ipmi_text_buffer.h \ ipmi_text_buffer.cpp \ ipmi_utils.h \ ipmi_utils.cpp \ ipmi_watchdog.h \ ipmi_watchdog.cpp \ thread.h \ thread.cpp libipmidirect_la_LIBADD = @CRYPTO_LIB@ -lm -lstdc++ $(top_builddir)/utils/libopenhpiutils.la libipmidirect_la_LDFLAGS= -module -version-info @HPI_LIB_VERSION@ clean-local: rm -f *~ openhpi-3.6.1/plugins/ipmidirect/ipmi_control_fan.h0000644000175100017510000000326012575647277021507 0ustar mohanmohan/* * ipmi_control_fan.h * * Copyright (c) 2004 by FORCE Computers. * Copyright (c) 2005 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #ifndef dIpmiControlFan_h #define dIpmiControlFan_h #ifndef dIpmiControl_h #include "ipmi_control.h" #endif #define dIpmiFanLocalControlMode 0xff #define dIpmiFanEmergencyMode 0xfe class cIpmiControlFan : public cIpmiControl { protected: unsigned int m_minimum_speed_level; unsigned int m_maximum_speed_level; unsigned int m_default_speed_level; // support for automatic speed adjustment bool m_local_control_mode; public: cIpmiControlFan( cIpmiMc *mc, unsigned int num, unsigned int minium_speed_level, unsigned int maximum_speed_level, unsigned int default_speed_level, bool local_control_mode ); virtual ~cIpmiControlFan(); // create an RDR sensor record virtual bool CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ); // virtual void Log(); virtual SaErrorT SetState( const SaHpiCtrlModeT &mode, const SaHpiCtrlStateT &state ); virtual SaErrorT GetState( SaHpiCtrlModeT &mode, SaHpiCtrlStateT &state ); virtual void Dump( cIpmiLog &dump, const char *name ) const; }; #endif openhpi-3.6.1/plugins/ipmidirect/ipmi_sensor.h0000644000175100017510000002413012575647277020513 0ustar mohanmohan/* * ipmi_sensor.h * * Copyright (c) 2003,2004 by FORCE Computers * Copyright (c) 2005 by ESO Technologies. * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #ifndef dIpmiSensor_h #define dIpmiSensor_h extern "C" { #include "SaHpi.h" } #ifndef dIpmiMsg_h #include "ipmi_msg.h" #endif #ifndef dIpmiEvent_h #include "ipmi_event.h" #endif #ifndef dIpmiSdr_h #include "ipmi_sdr.h" #endif #ifndef dIpmiRdr_h #include "ipmi_rdr.h" #endif struct tIpmiEntity; class cIpmiDomain; enum tIpmiSensorType { eIpmiSensorTypeInvalid = 0x00, eIpmiSensorTypeTemperature = 0x01, eIpmiSensorTypeVoltage = 0x02, eIpmiSensorTypeCurrent = 0x03, eIpmiSensorTypeFan = 0x04, eIpmiSensorTypePhysicalSecurity = 0x05, eIpmiSensorTypePlatformSecurity = 0x06, eIpmiSensorTypeProcessor = 0x07, eIpmiSensorTypePowerSupply = 0x08, eIpmiSensorTypePowerUnit = 0x09, eIpmiSensorTypeCoolingDevice = 0x0a, eIpmiSensorTypeOtherUnitsBasedSensor = 0x0b, eIpmiSensorTypeMemory = 0x0c, eIpmiSensorTypeDriveSlot = 0x0d, eIpmiSensorTypePowerMemoryResize = 0x0e, eIpmiSensorTypeSystemFirmwareProgress = 0x0f, eIpmiSensorTypeEventLoggingDisabled = 0x10, eIpmiSensorTypeWatchdog1 = 0x11, eIpmiSensorTypeSystemEvent = 0x12, eIpmiSensorTypeCriticalInterrupt = 0x13, eIpmiSensorTypeButton = 0x14, eIpmiSensorTypeModuleBoard = 0x15, eIpmiSensorTypeMicrocontrollerCoprocessor = 0x16, eIpmiSensorTypeAddInCard = 0x17, eIpmiSensorTypeChassis = 0x18, eIpmiSensorTypeChipSet = 0x19, eIpmiSensorTypeOtherFru = 0x1a, eIpmiSensorTypeCableInterconnect = 0x1b, eIpmiSensorTypeTerminator = 0x1c, eIpmiSensorTypeSystemBootInitiated = 0x1d, eIpmiSensorTypeBootError = 0x1e, eIpmiSensorTypeOsBoot = 0x1f, eIpmiSensorTypeOsCriticalStop = 0x20, eIpmiSensorTypeSlotConnector = 0x21, eIpmiSensorTypeSystemAcpiPowerState = 0x22, eIpmiSensorTypeWatchdog2 = 0x23, eIpmiSensorTypePlatformAlert = 0x24, eIpmiSensorTypeEntityPresence = 0x25, eIpmiSensorTypeMonitorAsicIc = 0x26, eIpmiSensorTypeLan = 0x27, eIpmiSensorTypeManagementSubsystemHealth = 0x28, eIpmiSensorTypeBattery = 0x29, eIpmiSensorTypeOemFirst = 0xc0, eIpmiSensorTypeOemLast = 0xef, eIpmiSensorTypeAtcaHotSwap = 0xf0, eIpmiSensorTypeAtcaIpmb = 0xf1, eIpmiSensorTypeAtcaAmcHotSwap = 0xf2, eIpmiSensorTypeAtcaLast = 0xff }; const char *IpmiSensorTypeToString( tIpmiSensorType type ); enum tIpmiEventReadingType { eIpmiEventReadingTypeInvalid = 0x00, eIpmiEventReadingTypeThreshold = 0x01, eIpmiEventReadingTypeDiscreteUsage = 0x02, eIpmiEventReadingTypeDiscreteState = 0x03, eIpmiEventReadingTypeDiscretePredictiveFailure = 0x04, eIpmiEventReadingTypeDiscreteLimitExceeded = 0x05, eIpmiEventReadingTypeDiscretePerformanceMet = 0x06, eIpmiEventReadingTypeDiscreteSeverity = 0x07, eIpmiEventReadingTypeDiscreteDevicePresence = 0x08, eIpmiEventReadingTypeDiscreteDeviceEnable = 0x09, eIpmiEventReadingTypeDiscreteAvailability = 0x0a, eIpmiEventReadingTypeDiscreteRedundancy = 0x0b, eIpmiEventReadingTypeDiscreteAcpiPower = 0x0c, eIpmiEventReadingTypeSensorSpecific = 0x6f, eIpmiEventReadingTypeOemFirst = 0x70, eIpmiEventReadingTypeOemLast = 0x7f }; const char *IpmiEventReadingTypeToString( tIpmiEventReadingType type ); enum tIpmiEventSupport { eIpmiEventSupportPerState = 0, eIpmiEventSupportEntireSensor = 1, eIpmiEventSupportGlobalEnable = 2, eIpmiEventSupportNone = 3 }; const char *IpmiEventSupportToString( tIpmiEventSupport val ); enum tIpmiValuePresent { eIpmiNoValuesPresent, eIpmiRawValuePresent, eIpmiBothValuesPresent }; #define dSensorIdLen 32 class cIpmiSensor : public cIpmiRdr { protected: cIpmiMc *m_source_mc; // If the sensor came from the main SDR, // this will be NULL. Otherwise, it // will be the MC that owned the device // SDR this came from. bool m_destroyed; int m_use_count; unsigned char m_owner; unsigned char m_channel; unsigned int m_num; unsigned char m_sdr_type; unsigned int m_virtual_num; // virtual sensor number bool m_sensor_init_scanning; bool m_sensor_init_events; bool m_sensor_init_type; bool m_sensor_init_pu_events; bool m_sensor_init_pu_scanning; bool m_ignore_if_no_entity; bool m_supports_auto_rearm; unsigned int m_assertion_event_mask; unsigned int m_deassertion_event_mask; unsigned int m_reading_mask; SaHpiBoolT m_enabled; SaHpiBoolT m_events_enabled; SaHpiEventStateT m_current_hpi_assert_mask; SaHpiEventStateT m_current_hpi_deassert_mask; SaHpiEventStateT m_hpi_assert_mask; SaHpiEventStateT m_hpi_deassert_mask; SaHpiSensorEventCtrlT m_event_control; tIpmiEventSupport m_event_support; tIpmiSensorType m_sensor_type; tIpmiEventReadingType m_event_reading_type; unsigned int m_oem; const char *m_sensor_type_string; const char *m_event_reading_type_string; const char *m_rate_unit_string; const char *m_base_unit_string; const char *m_modifier_unit_string; cIpmiSdr *m_sdr; // full sensor record or 0 public: cIpmiSensor( cIpmiMc *mc ); virtual ~cIpmiSensor(); cIpmiMc *&SourceMc() { return m_source_mc; } virtual unsigned int Num() const { return m_num; } virtual unsigned char Sa() const { return m_owner; } cIpmiSdr *GetSdr() { return m_sdr; } void SetSdr( cIpmiSdr *sdr ) { m_sdr = sdr; } tIpmiSensorType SensorType() const { return m_sensor_type; } tIpmiEventReadingType EventReadingType() const { return m_event_reading_type; } bool IgnoreIfNoEntity() const { return m_ignore_if_no_entity; } tIpmiEventSupport EventSupport() const { return m_event_support; } virtual void HandleNew( cIpmiDomain *domain ); virtual bool Cmp( const cIpmiSensor &s2 ) const; unsigned int GetOem() { return m_oem; } // create an HPI event from ipmi event virtual SaErrorT CreateEvent( cIpmiEvent *event, SaHpiEventT &h ); // create and send HPI sensor enable change event void CreateEnableChangeEvent(); // handle all incoming sensor events virtual void HandleEvent( cIpmiEvent *event ); virtual void Dump( cIpmiLog &dump ) const; // read sensor parameter from Full Sensor Record virtual bool GetDataFromSdr( cIpmiMc *mc, cIpmiSdr *sdr ); // create an RDR sensor record virtual bool CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ); SaHpiEventCategoryT HpiEventCategory(tIpmiEventReadingType reading_type); SaHpiSensorTypeT HpiSensorType(tIpmiSensorType sensor_type); // read sensor. must be called with a global read lock held. SaErrorT GetSensorData( cIpmiMsg &rsp ); // get sensor data. this function must called with the global read lock held virtual SaErrorT GetSensorReading( SaHpiSensorReadingT &data, SaHpiEventStateT &state ) = 0; // this function must called with the global read lock held SaErrorT GetEnable( SaHpiBoolT &enable ); // this function must called with the global read lock held SaErrorT GetEventEnables( SaHpiBoolT &enables ); SaErrorT GetEventEnableHw( SaHpiBoolT &enables ); // this function must called with the global read lock held SaErrorT GetEventMasks( SaHpiEventStateT &AssertEventMask, SaHpiEventStateT &DeassertEventMask ); // this function must called with the global read lock held virtual SaErrorT GetEventMasksHw( SaHpiEventStateT &AssertEventMask, SaHpiEventStateT &DeassertEventMask ) = 0; protected: // this function must called with the global read lock held virtual SaErrorT GetEventMasksHw( cIpmiMsg &rsp ); public: // this function must called with the global read lock held SaErrorT SetEnable( const SaHpiBoolT &enable ); // this function must called with the global read lock held SaErrorT SetEventEnables( const SaHpiBoolT &enables ); SaErrorT SetEventEnableHw( const SaHpiBoolT &enables ); // this function must called with the global read lock held SaErrorT SetEventMasks( const SaHpiSensorEventMaskActionT &act, SaHpiEventStateT &AssertEventMask, SaHpiEventStateT &DeassertEventMask ); // this function must called with the global read lock held virtual SaErrorT SetEventMasksHw( const SaHpiEventStateT &AssertEventMask, const SaHpiEventStateT &DeassertEventMask ) = 0; protected: // this function must called with the global read lock held virtual SaErrorT SetEventMasksHw( cIpmiMsg &msg, bool evt_enable ); }; #endif openhpi-3.6.1/plugins/ipmidirect/ipmi_sel.h0000644000175100017510000000752312575647277017774 0ustar mohanmohan/* * ipmi_sel.h * * Copyright (c) 2003 by FORCE Computers * Copyright (c) 2005 by ESO Technologies. * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #ifndef dIpmiSel_h #define dIpmiSel_h #ifndef dIpmiEvent_h #include "ipmi_event.h" #endif #ifndef dThread_h #include "thread.h" #endif #include extern "C" { #include "SaHpi.h" } class cIpmiDomain; class cIpmiSdrs; #define dMaxSelFetchRetries 3 class cIpmiSel { protected: cIpmiMc *m_mc; // LUN we are attached with. int m_lun; unsigned char m_major_version; unsigned char m_minor_version; unsigned short m_entries; unsigned int m_last_addition_timestamp; unsigned int m_last_erase_timestamp; bool m_overflow; bool m_supports_delete_sel; bool m_supports_partial_add_sel; bool m_supports_reserve_sel; bool m_supports_get_sel_allocation; public: bool m_fetched; private: // When fetching the data in event-driven mode, these are the // variables that track what is going on. unsigned int m_reservation; bool m_sels_changed; // SEL cThreadLock m_sel_lock; GList *m_sel; unsigned int m_sel_num; // async events cThreadLock m_async_events_lock; GList *m_async_events; unsigned int m_async_events_num; public: SaErrorT GetInfo(); private: SaErrorT Reserve(); int ReadSelRecord( cIpmiEvent &event, unsigned int &next_rec_id ); GList *ReadSel( unsigned int &num, bool &uptodate ); cIpmiEvent *FindEvent( GList *list, unsigned int record_id ); bool CheckEvent( GList *&list, cIpmiEvent *event ); public: cIpmiSel( cIpmiMc *mc, unsigned int lun ); ~cIpmiSel(); // clear a list of cIpmiEvent GList *ClearList( GList *list ); // read SEL and return a list of new events GList *GetEvents(); // add an event to the list of async events int AddAsyncEvent( cIpmiEvent *event ); SaErrorT GetSelInfo( SaHpiEventLogInfoT &info ); // get an event int GetSelEntry( unsigned short rid, unsigned short &prev, unsigned short &next, cIpmiEvent &event ); SaErrorT GetSelEntry( SaHpiEventLogEntryIdT current, SaHpiEventLogEntryIdT &prev, SaHpiEventLogEntryIdT &next, SaHpiEventLogEntryT &entry, SaHpiRdrT &rdr, SaHpiRptEntryT &rptentry ); SaErrorT AddSelEntry( const SaHpiEventT & /*Event*/ ); // delete SEL entry SaErrorT DeleteSelEntry( SaHpiEventLogEntryIdT sid ); // clear the SEL SaErrorT ClearSel(); // set SEL time SaErrorT SetSelTime( SaHpiTimeT t ); // get SEL time SaErrorT GetSelTime( SaHpiTimeT &t ); cIpmiMc *Mc() { return m_mc; } int Lun() { return m_lun; } int SelNum() { return m_sel_num; } unsigned int AdditionTimestamp() { return m_last_addition_timestamp; } unsigned int EraseTimestamp() { return m_last_erase_timestamp; } bool Overflow() { return m_overflow; } bool SupportsDeleteSel() { return m_supports_delete_sel; } void Lock() { m_sel_lock.Lock(); } void Unlock() { m_sel_lock.Unlock(); } void Dump( cIpmiLog &dump, const char *name ); }; #endif openhpi-3.6.1/plugins/ipmidirect/ipmi_sensor_factors.cpp0000644000175100017510000002447312575647277022601 0ustar mohanmohan/* * ipmi_sensor_factors.cpp * * Copyright (c) 2004 by FORCE Computers * Copyright (c) 2005 by ESO Technologies. * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #include "ipmi_sensor_factors.h" #include static const char *analoge_data_format[] = { "Unsigned", "1Compl", "2Compl", "Analog" }; const char * IpmiAnalogeDataFormatToString( tIpmiAnalogeDataFormat fmt ) { if ( (int)fmt <= eIpmiAnalogDataFormatNotAnalog ) return analoge_data_format[fmt]; return "Invalid"; } static const char *linearization_map[] = { "Linear", "Ln", "Log10", "Log2", "E", "Exp10", "Exp2", "1OverX", "Sqr", "Cube", "Sqrt", "1OverCube" }; const char * IpmiLinearizationToString( tIpmiLinearization val ) { if ( val == eIpmiLinearizationNonlinear ) return "NonLinear"; if ( val <= eIpmiLinearization1OverCube ) return linearization_map[val]; return "Invalid"; } cIpmiSensorFactors::cIpmiSensorFactors() : m_analog_data_format( eIpmiAnalogDataFormatUnsigned ), m_linearization( eIpmiLinearizationLinear ), m_is_non_linear( false ), m_m( 0 ), m_tolerance( 0 ), m_b( 0 ), m_r_exp( 0 ), m_accuracy_exp( 0 ), m_accuracy( 0 ), m_b_exp( 0 ) { } cIpmiSensorFactors::~cIpmiSensorFactors() { } bool cIpmiSensorFactors::GetDataFromSdr( const cIpmiSdr *sdr ) { m_analog_data_format = (tIpmiAnalogeDataFormat)((sdr->m_data[20] >> 6) & 3); m_linearization = (tIpmiLinearization)(sdr->m_data[23] & 0x7f); if ( m_linearization <= 11 ) { m_m = sdr->m_data[24] | ((sdr->m_data[25] & 0xc0) << 2); m_tolerance = sdr->m_data[25] & 0x3f; m_b = sdr->m_data[26] | ((sdr->m_data[27] & 0xc0) << 2); m_accuracy = ((sdr->m_data[27] & 0x3f) | ((sdr->m_data[28] & 0xf0) << 2)); m_accuracy_exp = (sdr->m_data[28] >> 2) & 0x3; m_r_exp = (sdr->m_data[29] >> 4) & 0xf; m_b_exp = sdr->m_data[29] & 0xf; m_accuracy_factor = (m_accuracy * pow( 10.0, m_accuracy_exp)) / 100.0; } if ( m_linearization == eIpmiLinearizationLinear ) m_is_non_linear = false; else m_is_non_linear = true; return true; } bool cIpmiSensorFactors::Cmp( const cIpmiSensorFactors &sf ) const { if ( m_analog_data_format != sf.m_analog_data_format ) return false; if ( m_linearization != sf.m_linearization ) return false; if ( m_linearization <= 11 ) { if ( m_m != sf.m_m ) return false; if ( m_tolerance != sf.m_tolerance ) return false; if ( m_b != sf.m_b ) return false; if ( m_accuracy != sf.m_accuracy ) return false; if ( m_accuracy_exp != sf.m_accuracy_exp ) return false; if ( m_r_exp != sf.m_r_exp ) return false; if ( m_b_exp != sf.m_b_exp ) return false; } return true; } static double c_linear( double val ) { return val; } static double c_exp10( double val ) { return pow( 10.0, val ); } static double c_exp2( double val ) { return pow( 2.0, val ); } static double c_1_over_x( double val ) { return 1.0 / val; } static double c_sqr( double val ) { return pow( val, 2.0 ); } static double c_cube( double val ) { return pow( val, 3.0 ); } static double c_1_over_cube( double val ) { return 1.0 / pow( val, 3.0 ); } // We have to define our own log2 function // because some versions of FreeBSD do not provide it // and some versions of FreeBSD provide it in a very // specific way. static double ipmi_log2( double val ) { return log( val ) / M_LN2; } typedef double (*linearizer)( double val ); static linearizer linearize[12] = { c_linear, log, log10, ipmi_log2, exp, c_exp10, c_exp2, c_1_over_x, c_sqr, c_cube, sqrt, c_1_over_cube }; static int sign_extend( int m, int bits ) { if ( m & (1 << (bits-1)) ) return m | (-1 << bits); else return m & (~(-1 << bits)); } bool cIpmiSensorFactors::ConvertFromRaw( unsigned int val, double &result, bool is_hysteresis) const { double m, b, b_exp, r_exp, fval; linearizer c_func; if ( m_linearization == eIpmiLinearizationNonlinear ) c_func = c_linear; else if ( m_linearization <= 11 ) c_func = linearize[m_linearization]; else return false; val &= 0xff; m = m_m; b = m_b; r_exp = m_r_exp; b_exp = m_b_exp; if ( is_hysteresis == true ) { if ( val == 0 ) { result = 0; return true; } // For hysteresis : no offset + abs value b = 0; if ( m < 0 ) m = -m; } switch( m_analog_data_format ) { case eIpmiAnalogDataFormatUnsigned: fval = val; break; case eIpmiAnalogDataFormat1Compl: val = sign_extend( val, 8 ); if ( val == 0xffffffff ) val += 1; fval = val; break; case eIpmiAnalogDataFormat2Compl: fval = sign_extend( val, 8 ); break; default: return false; } result = c_func( ((m * fval) + (b * pow(10, b_exp))) * pow(10, r_exp) ); return true; } bool cIpmiSensorFactors::ConvertToRaw( tIpmiRound rounding, double val, unsigned int &result, bool is_hysteresis, bool swap_thresholds ) const { bool rv; bool swap; double cval; int lowraw, highraw, raw, maxraw, minraw, next_raw; if (is_hysteresis == true) swap = false; else swap = swap_thresholds; switch( m_analog_data_format ) { case eIpmiAnalogDataFormatUnsigned: lowraw = 0; highraw = 255; minraw = 0; maxraw = 255; next_raw = 128; break; case eIpmiAnalogDataFormat1Compl: lowraw = -127; highraw = 127; minraw = -127; maxraw = 127; next_raw = 0; break; case eIpmiAnalogDataFormat2Compl: lowraw = -128; highraw = 127; minraw = -128; maxraw = 127; next_raw = 0; break; default: return false; } // We do a binary search for the right value. Yuck, but I don't // have a better plan that will work with non-linear sensors. do { raw = next_raw; rv = ConvertFromRaw( raw, cval, is_hysteresis ); if ( !rv ) return false; // If swap == true, when raw value increases // the corresponding interpreted value decreases // so we have to take that into account when searching if ((( swap == false) && ( cval < val )) || (( swap == true) && ( cval > val ))) { next_raw = ((highraw - raw) / 2) + raw; lowraw = raw; } else { next_raw = ((raw - lowraw) / 2) + lowraw; highraw = raw; } } while( raw != next_raw ); // The above loop gets us to within 1 of what it should be, we // have to look at rounding to make the final decision. switch( rounding ) { case eRoundNormal: // If swap == true, when raw value increases // the corresponding interpreted value decreases // so we have to take that into account when searching if ((( swap == false ) && ( val > cval )) || (( swap == true ) && ( val < cval ))) { if ( raw < maxraw ) { double nval; rv = ConvertFromRaw( raw + 1, nval, is_hysteresis ); if ( !rv ) return false; nval = cval + ((nval - cval) / 2.0); if ((( swap == false ) && ( val >= nval )) || (( swap == true ) && ( val <= nval ))) raw++; } } else { if ( raw > minraw ) { double pval; rv = ConvertFromRaw( raw-1, pval, is_hysteresis ); if ( !rv ) return false; pval = pval + ((cval - pval) / 2.0); if ((( swap == false ) && ( val < pval )) || (( swap == true ) && ( val > pval ))) raw--; } } break; case eRoundUp: // If swap == true, when raw value increases // the corresponding interpreted value decreases // so we have to take that into account when searching if ( swap == false ) { if ((val > cval) && (raw < maxraw)) raw++; } else { if ((val < cval) && (raw < maxraw)) raw++; }; break; case eRoundDown: // If swap == true, when raw value increases // the corresponding interpreted value decreases // so we have to take that into account when searching if ( swap == false ) { if ( ( val < cval) && (raw > minraw ) ) raw--; } else { if ( ( val > cval) && (raw > minraw ) ) raw--; }; break; } if ( m_analog_data_format == eIpmiAnalogDataFormat1Compl ) if ( raw < 0 ) raw -= 1; result = raw & 0xff; return true; } openhpi-3.6.1/plugins/ipmidirect/ipmi_cmd.h0000644000175100017510000002501712575647277017752 0ustar mohanmohan/* * ipmi_cmd.h * * Interface for IPMI file connection * * Copyright (c) 2003 by FORCE Computers. * Copyright (c) 2005 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #ifndef dIpmiCmd_h #define dIpmiCmd_h #define dMaxIpmiDataSize 36 // // IPMI commands // enum tIpmiCmd { // Chassis netfn (0x00) eIpmiCmdGetChassisCapabilities = 0x00, eIpmiCmdGetChassisStatus = 0x01, eIpmiCmdChassisControl = 0x02, eIpmiCmdChassisReset = 0x03, eIpmiCmdChassisIdentify = 0x04, eIpmiCmdSetChassisCapabilities = 0x05, eIpmiCmdSetPowerRestorePolicy = 0x06, eIpmiCmdGetSystemRestartCause = 0x07, eIpmiCmdSetSystemBootOptions = 0x08, eIpmiCmdGetSystemBootOptions = 0x09, eIpmiCmdGetPohCounter = 0x0f, // Bridge netfn (0x00) eIpmiCmdGetBridgeState = 0x00, eIpmiCmdSetBridgeState = 0x01, eIpmiCmdGetIcmbAddress = 0x02, eIpmiCmdSetIcmbAddress = 0x03, eIpmiCmdSetBridgeProxyAddress = 0x04, eIpmiCmdGetBridgeStatistics = 0x05, eIpmiCmdGetIcmbCapabilities = 0x06, eIpmiCmdClearBridgeStatistics = 0x08, eIpmiCmdGetBridgeProxyAddress = 0x09, eIpmiCmdGetIcmbConnectorInfo = 0x0a, eIpmiCmdSetIcmbConnectorInfo = 0x0b, eIpmiCmdSendIcmbConnectionId = 0x0c, eIpmiCmdPrepareForDiscovery = 0x10, eIpmiCmdGetAddresses = 0x11, eIpmiCmdSetDiscovered = 0x12, eIpmiCmdGetChassisDeviceId = 0x13, eIpmiCmdSetChassisDeviceId = 0x14, eIpmiCmdBridgeRequest = 0x20, eIpmiCmdBridgeMessage = 0x21, eIpmiCmdGetEventCount = 0x30, eIpmiCmdSetEventdestination = 0x31, eIpmiCmdSetEventReceptionState = 0x32, eIpmiCmdSendIcmbEventMessage = 0x33, eIpmiCmdGetEventDestiation = 0x34, eIpmiCmdGetEventReceptionState = 0x35, eIpmiCmdErrorReport = 0xff, // Sensor/Event netfn (0x04) eIpmiCmdSetEventReceiver = 0x00, eIpmiCmdGetEventReceiver = 0x01, eIpmiCmdPlatformEvent = 0x02, eIpmiCmdGetPefCapabilities = 0x10, eIpmiCmdArmPefPostponeTimer = 0x11, eIpmiCmdSetPefConfigParms = 0x12, eIpmiCmdGetPefConfigParms = 0x13, eIpmiCmdSetLastProcessedEventId = 0x14, eIpmiCmdGetLastProcessedEventId = 0x15, eIpmiCmdAlertImmediate = 0x16, eIpmiCmdPetAcknowledge = 0x17, eIpmiCmdGetDeviceSdrInfo = 0x20, eIpmiCmdGetDeviceSdr = 0x21, eIpmiCmdReserveDeviceSdrRepository = 0x22, eIpmiCmdGetSensorReadingFactors = 0x23, eIpmiCmdSetSensorHysteresis = 0x24, eIpmiCmdGetSensorHysteresis = 0x25, eIpmiCmdSetSensorThreshold = 0x26, eIpmiCmdGetSensorThreshold = 0x27, eIpmiCmdSetSensorEventEnable = 0x28, eIpmiCmdGetSensorEventEnable = 0x29, eIpmiCmdRearmSensorEvents = 0x2a, eIpmiCmdGetSensorEventStatus = 0x2b, eIpmiCmdGetSensorReading = 0x2d, eIpmiCmdSetSensorType = 0x2e, eIpmiCmdGetSensorType = 0x2f, // App netfn (0x06) eIpmiCmdGetDeviceId = 0x01, eIpmiCmdBroadcastGetDeviceId = 0x01, eIpmiCmdColdReset = 0x02, eIpmiCmdWarmReset = 0x03, eIpmiCmdGetSelfTestResults = 0x04, eIpmiCmdManufacturingTestOn = 0x05, eIpmiCmdSetAcpiPowerState = 0x06, eIpmiCmdGetAcpiPowerState = 0x07, eIpmiCmdGetDeviceGuid = 0x08, eIpmiCmdResetWatchdogTimer = 0x22, eIpmiCmdSetWatchdogTimer = 0x24, eIpmiCmdGetWatchdogTimer = 0x25, eIpmiCmdSetBmcGlobalEnables = 0x2e, eIpmiCmdGetBmcGlobalEnables = 0x2f, eIpmiCmdClearMsgFlags = 0x30, eIpmiCmdGetMsgFlags = 0x31, eIpmiCmdEnableMessageChannelRcv = 0x32, eIpmiCmdGetMsg = 0x33, eIpmiCmdSendMsg = 0x34, eIpmiCmdReadEventMsgBuffer = 0x35, eIpmiCmdGetBtInterfaceCapabilities = 0x36, eIpmiCmdGetSystemGuid = 0x37, eIpmiCmdGetChannelAuthCapabilities = 0x38, eIpmiCmdGetSessionChallenge = 0x39, eIpmiCmdActivateSession = 0x3a, eIpmiCmdSetSessionPrivilege = 0x3b, eIpmiCmdCloseSession = 0x3c, eIpmiCmdGetSessionInfo = 0x3d, eIpmiCmdGetAuthcode = 0x3f, eIpmiCmdSetChannelAccess = 0x40, eIpmiCmdGetChannelAccess = 0x41, eIpmiCmdGetChannelInfo = 0x42, eIpmiCmdSetUserAccess = 0x43, eIpmiCmdGetUserAccess = 0x44, eIpmiCmdSetUserName = 0x45, eIpmiCmdGetUserName = 0x46, eIpmiCmdSetUserPassword = 0x47, eIpmiCmdMasterReadWrite = 0x52, // Storage netfn (0x0a) eIpmiCmdGetFruInventoryAreaInfo = 0x10, eIpmiCmdReadFruData = 0x11, eIpmiCmdWriteFruData = 0x12, eIpmiCmdGetSdrRepositoryInfo = 0x20, eIpmiCmdGetSdrRepositoryAllocInfo = 0x21, eIpmiCmdReserveSdrRepository = 0x22, eIpmiCmdGetSdr = 0x23, eIpmiCmdAddSdr = 0x24, eIpmiCmdPartialAddSdr = 0x25, eIpmiCmdDeleteSdr = 0x26, eIpmiCmdClearSdrRepository = 0x27, eIpmiCmdGetSdrRepositoryTime = 0x28, eIpmiCmdSetSdrRepositoryTime = 0x29, eIpmiCmdEnterSdrRepositoryUpdate = 0x2a, eIpmiCmdExitSdrRepositoryUpdate = 0x2b, eIpmiCmdRunInitializationAgent = 0x2c, eIpmiCmdGetSelInfo = 0x40, eIpmiCmdGetSelAllocationInfo = 0x41, eIpmiCmdReserveSel = 0x42, eIpmiCmdGetSelEntry = 0x43, eIpmiCmdAddSelEntry = 0x44, eIpmiCmdPartialAddSelEntry = 0x45, eIpmiCmdDeleteSelEntry = 0x46, eIpmiCmdClearSel = 0x47, eIpmiCmdGetSelTime = 0x48, eIpmiCmdSetSelTime = 0x49, eIpmiCmdGetAuxiliaryLogStatus = 0x5a, eIpmiCmdSetAuxiliaryLogStatus = 0x5b, // Transport netfn (0x0c) eIpmiCmdSetLanConfigParms = 0x01, eIpmiCmdGetLanConfigParms = 0x02, eIpmiCmdSuspendBmcArps = 0x03, eIpmiCmdGetIpUdpRmcpStats = 0x04, eIpmiCmdSetSerialModemConfig = 0x10, eIpmiCmdGetSerialModemConfig = 0x11, eIpmiCmdSetSerialModemMux = 0x12, eIpmiCmdGetTapResponseCodes = 0x13, eIpmiCmdSetPppUdpProxyXmitData = 0x14, eIpmiCmdGetPppUdpProxyXmitData = 0x15, eIpmiCmdSendPppUdpProxyPacket = 0x16, eIpmiCmdGetPppUdpProxyRecvData = 0x17, eIpmiCmdSerialModemConnActive = 0x18, eIpmiCmdCallback = 0x19, eIpmiCmdSetUserCallbackOptions = 0x1a, eIpmiCmdGetUserCallbackOptions = 0x1b, // PICMG netfn (0x2c) eIpmiCmdGetPicMgProperties = 0x00, eIpmiCmdGetAddressInfo = 0x01, eIpmiCmdGetShelfAddressInfo = 0x02, eIpmiCmdSetShelfAddressInfo = 0x03, eIpmiCmdFruControl = 0x04, eIpmiCmdGetFruLedProperties = 0x05, eIpmiCmdGetLedColorCapabilities = 0x06, eIpmiCmdSetFruLedState = 0x07, eIpmiCmdGetFruLedState = 0x08, eIpmiCmdSetIpmbState = 0x09, eIpmiCmdSetFruActivationPolicy = 0x0a, eIpmiCmdGetFruActivationPolicy = 0x0b, eIpmiCmdSetFruActivation = 0x0c, eIpmiCmdGetDeviceLocatorRecordId = 0x0d, eIpmiCmdSetPortState = 0x0e, eIpmiCmdGetPortState = 0x0f, eIpmiCmdComputePowerProperties = 0x10, eIpmiCmdSetPowerLevel = 0x11, eIpmiCmdGetPowerLevel = 0x12, eIpmiCmdRenegotiatePower = 0x13, eIpmiCmdGetFanSpeedProperties = 0x14, eIpmiCmdSetFanLevel = 0x15, eIpmiCmdGetFanLevel = 0x16, eIpmiCmdBusedResource = 0x17, eIpmiCmdGetIpmbLinkInfo = 0x18, }; // PICMG Identifier. Indicates that this is a PICMG-defined // group extension command. #define dIpmiPicMgId 0 #define dIpmiDeactivateFru 0 #define dIpmiActivateFru 1 // // NetFNs // enum tIpmiNetfn { eIpmiNetfnChassis = 0x00, eIpmiNetfnChassisRsp = 0x01, eIpmiNetfnBridge = 0x02, eIpmiNetfnBridgeRsp = 0x03, eIpmiNetfnSensorEvent = 0x04, eIpmiNetfnSensorEventRsp = 0x05, eIpmiNetfnApp = 0x06, eIpmiNetfnAppRsp = 0x07, eIpmiNetfnFirmware = 0x08, eIpmiNetfnFirmwareRsp = 0x09, eIpmiNetfnStorage = 0x0a, eIpmiNetfnStorageRsp = 0x0b, eIpmiNetfnTransport = 0x0c, eIpmiNetfnTransportRsp = 0x0d, eIpmiNetfnPicmg = 0x2c, eIpmiNetfnPicmgRsp = 0x2d, eIpmiNetfnOem = 0x2e, eIpmiNetfnOemRsp = 0x2f }; const char *IpmiNetfnToString( tIpmiNetfn netfn ); // // Completion codes for IPMI. // enum tIpmiCompletionCode { eIpmiCcOk = 0x00, eIpmiCcNodeBusy = 0xC0, eIpmiCcInvalidCmd = 0xC1, eIpmiCcCommandInvalidForLun = 0xC2, eIpmiCcTimeout = 0xC3, eIpmiCcOutOfSpace = 0xC4, eIpmiCcInvalidReservation = 0xC5, eIpmiCcRequestDataTruncated = 0xC6, eIpmiCcRequestDataLengthInvalid = 0xC7, eIpmiCcRequestedDataLengthExceeded = 0xC8, eIpmiCcParameterOutOfRange = 0xC9, eIpmiCcCannotReturnReqLength = 0xCA, eIpmiCcNotPresent = 0xCB, eIpmiCcInvalidDataField = 0xCC, eIpmiCcCommandIllegalForSensor = 0xCD, eIpmiCcCouldNotProvideResponse = 0xCE, eIpmiCcCannotExecDuplicateRequest = 0xCF, eIpmiCcRepositoryInUpdateMode = 0xD0, eIpmiCcDeviceInFirmwareUpdate = 0xD1, eIpmiCcBmcInitInProgress = 0xD2, eIpmiCcDestinationUnavailable = 0xD3, eIpmiCcInsufficientPrivilege = 0xD4, eIpmiCcNotSupportedInPresentState = 0xD5, eIpmiCcUnknownErr = 0xff }; const char *IpmiCompletionCodeToString( tIpmiCompletionCode cc ); const char *IpmiCmdToString( tIpmiNetfn netfn, tIpmiCmd cmd ); #endif openhpi-3.6.1/plugins/ipmidirect/ipmi_control_atca_led.cpp0000644000175100017510000003373612575647277023045 0ustar mohanmohan/* * ipmi_control_atca_led.cpp * * Copyright (c) 2006 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Pierre Sangouard */ extern "C" { #include "SaHpiAtca.h" } #include "ipmi_control_atca_led.h" #include "ipmi_resource.h" #include "ipmi_log.h" cIpmiControlAtcaLed::cIpmiControlAtcaLed( cIpmiMc *mc, unsigned int num, unsigned char led_color_capabilities, unsigned char led_default_local_color, unsigned char led_default_override_color) : cIpmiControl( mc, num, SAHPI_CTRL_LED, SAHPI_CTRL_TYPE_OEM ), m_num( num ), m_led_color_capabilities( led_color_capabilities ), m_led_default_local_color( led_default_local_color ), m_led_local_color( led_default_local_color ), m_led_default_override_color( led_default_override_color ), m_led_override_color( led_default_override_color ), m_set_led_state_supported( false ) { } cIpmiControlAtcaLed::~cIpmiControlAtcaLed() { } bool cIpmiControlAtcaLed::IsSupportedColor(AtcaHpiLedColorT hpi_color) { switch(hpi_color) { case ATCAHPI_LED_COLOR_BLUE: return ((m_led_color_capabilities & ATCAHPI_LED_BLUE) != 0); case ATCAHPI_LED_COLOR_RED: return ((m_led_color_capabilities & ATCAHPI_LED_RED) != 0); case ATCAHPI_LED_COLOR_GREEN: return ((m_led_color_capabilities & ATCAHPI_LED_GREEN) != 0); case ATCAHPI_LED_COLOR_AMBER: return ((m_led_color_capabilities & ATCAHPI_LED_AMBER) != 0); case ATCAHPI_LED_COLOR_ORANGE: return ((m_led_color_capabilities & ATCAHPI_LED_ORANGE) != 0); case ATCAHPI_LED_COLOR_WHITE: return ((m_led_color_capabilities & ATCAHPI_LED_WHITE) != 0); case ATCAHPI_LED_COLOR_NO_CHANGE: return true; case ATCAHPI_LED_COLOR_USE_DEFAULT: return true; case ATCAHPI_LED_COLOR_RESERVED: return false; } return false; } static unsigned char hpi_to_atca_color( AtcaHpiLedColorT hpi_color, unsigned char current_color, unsigned char default_color ) { switch(hpi_color) { case ATCAHPI_LED_COLOR_BLUE: return 0x01; case ATCAHPI_LED_COLOR_RED: return 0x02; case ATCAHPI_LED_COLOR_GREEN: return 0x03; case ATCAHPI_LED_COLOR_AMBER: return 0x04; case ATCAHPI_LED_COLOR_ORANGE: return 0x05; case ATCAHPI_LED_COLOR_WHITE: return 0x06; case ATCAHPI_LED_COLOR_NO_CHANGE: return current_color; case ATCAHPI_LED_COLOR_USE_DEFAULT: return default_color; case ATCAHPI_LED_COLOR_RESERVED: return 0x00; } return 0x00; } static AtcaHpiLedColorT atca_to_hpi_color( unsigned char atca_color ) { switch(atca_color & 0x0F) { case 0x01: return ATCAHPI_LED_COLOR_BLUE; case 0x02: return ATCAHPI_LED_COLOR_RED; case 0x03: return ATCAHPI_LED_COLOR_GREEN; case 0x04: return ATCAHPI_LED_COLOR_AMBER; case 0x05: return ATCAHPI_LED_COLOR_ORANGE; case 0x06: return ATCAHPI_LED_COLOR_WHITE; } return ATCAHPI_LED_COLOR_RESERVED; } bool cIpmiControlAtcaLed::CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ) { if ( cIpmiControl::CreateRdr( resource, rdr ) == false ) return false; SaHpiCtrlRecT &rec = rdr.RdrTypeUnion.CtrlRec; SaHpiCtrlRecOemT &oem_rec = rec.TypeUnion.Oem; oem_rec.MId = ATCAHPI_PICMG_MID; oem_rec.ConfigData[0] = m_led_color_capabilities; oem_rec.ConfigData[1] = atca_to_hpi_color(m_led_default_local_color); oem_rec.ConfigData[2] = atca_to_hpi_color(m_led_default_override_color); oem_rec.Default.MId = ATCAHPI_PICMG_MID; oem_rec.Default.BodyLength = 6; oem_rec.Default.Body[0] = 0; oem_rec.Default.Body[1] = 0; oem_rec.Default.Body[2] = oem_rec.ConfigData[2]; oem_rec.Default.Body[3] = oem_rec.ConfigData[1]; oem_rec.Default.Body[4] = SAHPI_FALSE; oem_rec.Default.Body[5] = 0; cIpmiMsg ledmsg( eIpmiNetfnPicmg, eIpmiCmdSetFruLedState ); ledmsg.m_data[0] = dIpmiPicMgId; ledmsg.m_data[1] = Resource()->FruId(); ledmsg.m_data[2] = m_num; ledmsg.m_data_len = 6; cIpmiMsg ledrsp; /* There seems that there is an issue with ATCA-HPI mapping in that Req 4.5.7.7 says that an LED with a local control state and either an Override or Lamp test state should set the Control Mode Read Only status to SAHPI_FALSE, however there is no atomic way to check for support of the Override State. Therefore, there is no obvious "safe" way to implement the spec as stated, only best alternatives. The approach taken here is to set the Control Mode Read Only status to SAHPI_FALSE automatically if the LED has a local control state. This will allow for issuing the Set FRU LED state commands, however the unsupported states (Override and/or Lamp Test) will return the specified Completion Code of CCh(invalid date field), as stated in the ATCA base spec. */ if ( m_led_default_local_color == 0 ) { rec.DefaultMode.Mode = SAHPI_CTRL_MODE_MANUAL; rec.DefaultMode.ReadOnly = SAHPI_TRUE; m_set_led_state_supported = false; oem_rec.ConfigData[1] = 0; } else { rec.DefaultMode.Mode = SAHPI_CTRL_MODE_AUTO; rec.DefaultMode.ReadOnly = SAHPI_FALSE; m_set_led_state_supported = true; } rec.WriteOnly = SAHPI_FALSE; rec.Oem = ATCAHPI_PICMG_CT_ATCA_LED; return true; } SaErrorT cIpmiControlAtcaLed::SetState( const SaHpiCtrlModeT &mode, const SaHpiCtrlStateT &state ) { cIpmiMsg ledmsg( eIpmiNetfnPicmg, eIpmiCmdSetFruLedState ); ledmsg.m_data[0] = dIpmiPicMgId; ledmsg.m_data[1] = Resource()->FruId(); ledmsg.m_data[2] = m_num; ledmsg.m_data_len = 6; if ( mode == SAHPI_CTRL_MODE_AUTO ) { if ( m_led_default_local_color == 0 ) return SA_ERR_HPI_READ_ONLY; ledmsg.m_data[3] = 0xFC; ledmsg.m_data[4] = 0x00; ledmsg.m_data[5] = m_led_local_color; } else if ( mode != SAHPI_CTRL_MODE_MANUAL ) { return SA_ERR_HPI_INVALID_PARAMS; } else { if ( m_set_led_state_supported == false ) return SA_ERR_HPI_READ_ONLY; if ( &state == NULL ) return SA_ERR_HPI_INVALID_PARAMS; if ( state.Type != SAHPI_CTRL_TYPE_OEM ) return SA_ERR_HPI_INVALID_DATA; if ( state.StateUnion.Oem.MId != ATCAHPI_PICMG_MID ) return SA_ERR_HPI_INVALID_DATA; if ( state.StateUnion.Oem.BodyLength != 6 ) return SA_ERR_HPI_INVALID_DATA; if ( state.StateUnion.Oem.Body[4] == SAHPI_TRUE ) { if ( state.StateUnion.Oem.Body[5] > 127 ) return SA_ERR_HPI_INVALID_PARAMS; } if ( state.StateUnion.Oem.Body[1] == 0xFF ) { if ( state.StateUnion.Oem.Body[0] != 0x00 ) return SA_ERR_HPI_INVALID_PARAMS; } else if ( state.StateUnion.Oem.Body[1] == 0x00 ) { if ( state.StateUnion.Oem.Body[0] != 0x00 ) return SA_ERR_HPI_INVALID_PARAMS; } else if ( state.StateUnion.Oem.Body[1] > 0xFA ) { return SA_ERR_HPI_INVALID_PARAMS; } if ( state.StateUnion.Oem.Body[0] > 0xFA ) { return SA_ERR_HPI_INVALID_PARAMS; } else if ( state.StateUnion.Oem.Body[0] == 0 ) { if (( state.StateUnion.Oem.Body[1] != 0xFF ) && ( state.StateUnion.Oem.Body[1] != 0x00 )) return SA_ERR_HPI_INVALID_PARAMS; } if ( IsSupportedColor((AtcaHpiLedColorT)state.StateUnion.Oem.Body[2]) == false ) return SA_ERR_HPI_INVALID_PARAMS; if ( m_led_default_local_color != 0 ) { if ( IsSupportedColor((AtcaHpiLedColorT)state.StateUnion.Oem.Body[3]) == false ) return SA_ERR_HPI_INVALID_PARAMS; } m_led_override_color = hpi_to_atca_color((AtcaHpiLedColorT)state.StateUnion.Oem.Body[2], m_led_override_color, m_led_default_override_color); if ( m_led_default_local_color != 0 ) m_led_local_color = hpi_to_atca_color((AtcaHpiLedColorT)state.StateUnion.Oem.Body[3], m_led_local_color, m_led_default_local_color); if ( state.StateUnion.Oem.Body[4] == SAHPI_TRUE ) { ledmsg.m_data[3] = 0xFB; ledmsg.m_data[4] = state.StateUnion.Oem.Body[5]; } else { if ( state.StateUnion.Oem.Body[1] == 0xFF ) { ledmsg.m_data[3] = 0xFF; ledmsg.m_data[4] = 0x00; } else if ( state.StateUnion.Oem.Body[1] == 0x00 ) { ledmsg.m_data[3] = 0x00; ledmsg.m_data[4] = 0x00; } else { ledmsg.m_data[3] = state.StateUnion.Oem.Body[0]; ledmsg.m_data[4] = state.StateUnion.Oem.Body[1]; } } ledmsg.m_data[5] = m_led_override_color; } cIpmiMsg ledrsp; SaErrorT rv = Resource()->SendCommandReadLock( this, ledmsg, ledrsp ); if ( rv != SA_OK || ledrsp.m_data_len < 2 || ledrsp.m_data[0] != eIpmiCcOk || ledrsp.m_data[1] != dIpmiPicMgId ) { stdlog << "cannot set FRU LED state !\n"; return (rv != SA_OK) ? rv : SA_ERR_HPI_INVALID_REQUEST; } return SA_OK; } SaErrorT cIpmiControlAtcaLed::GetState( SaHpiCtrlModeT &mode, SaHpiCtrlStateT &state ) { cIpmiMsg ledmsg( eIpmiNetfnPicmg, eIpmiCmdGetFruLedState ); ledmsg.m_data[0] = dIpmiPicMgId; ledmsg.m_data[1] = Resource()->FruId(); ledmsg.m_data[2] = m_num; ledmsg.m_data_len = 3; cIpmiMsg ledrsp; SaErrorT rv = Resource()->SendCommandReadLock( this, ledmsg, ledrsp ); if ( rv != SA_OK || ledrsp.m_data_len < 6 || ledrsp.m_data[0] != eIpmiCcOk || ledrsp.m_data[1] != dIpmiPicMgId ) { stdlog << "cannot get FRU LED state !\n"; return (rv != SA_OK) ? rv : SA_ERR_HPI_INVALID_REQUEST; } if ( &mode != NULL ) { if ( (ledrsp.m_data[2] & 0x06) != 0 ) { mode = SAHPI_CTRL_MODE_MANUAL; } else { mode = SAHPI_CTRL_MODE_AUTO; } } if ( &state != NULL) { state.Type = SAHPI_CTRL_TYPE_OEM; state.StateUnion.Oem.MId = ATCAHPI_PICMG_MID; state.StateUnion.Oem.BodyLength = 6; // Lamp test on if ( (ledrsp.m_data[2] & 0x04) != 0 ) { if ( ledrsp.m_data[6] == 0x00 ) { state.StateUnion.Oem.Body[0] = 0; state.StateUnion.Oem.Body[1] = 0; } else if ( ledrsp.m_data[6] == 0xFF ) { state.StateUnion.Oem.Body[0] = 0; state.StateUnion.Oem.Body[1] = 0xFF; } else { state.StateUnion.Oem.Body[0] = ledrsp.m_data[6]; state.StateUnion.Oem.Body[1] = ledrsp.m_data[7]; } state.StateUnion.Oem.Body[2] = atca_to_hpi_color(ledrsp.m_data[8]); state.StateUnion.Oem.Body[3] = atca_to_hpi_color(ledrsp.m_data[5]); state.StateUnion.Oem.Body[4] = SAHPI_TRUE; state.StateUnion.Oem.Body[5] = ledrsp.m_data[9]; } // Override state on else if ( (ledrsp.m_data[2] & 0x02) != 0 ) { if ( ledrsp.m_data[6] == 0x00 ) { state.StateUnion.Oem.Body[0] = 0; state.StateUnion.Oem.Body[1] = 0; } else if ( ledrsp.m_data[6] == 0xFF ) { state.StateUnion.Oem.Body[0] = 0; state.StateUnion.Oem.Body[1] = 0xFF; } else { state.StateUnion.Oem.Body[0] = ledrsp.m_data[6]; state.StateUnion.Oem.Body[1] = ledrsp.m_data[7]; } state.StateUnion.Oem.Body[2] = atca_to_hpi_color(ledrsp.m_data[8]); state.StateUnion.Oem.Body[3] = atca_to_hpi_color(ledrsp.m_data[5]); state.StateUnion.Oem.Body[4] = SAHPI_FALSE; state.StateUnion.Oem.Body[5] = 0; } else { if ( ledrsp.m_data[3] == 0x00 ) { state.StateUnion.Oem.Body[0] = 0; state.StateUnion.Oem.Body[1] = 0; } else if ( ledrsp.m_data[3] == 0xFF ) { state.StateUnion.Oem.Body[0] = 0; state.StateUnion.Oem.Body[1] = 0xFF; } else { state.StateUnion.Oem.Body[0] = ledrsp.m_data[3]; state.StateUnion.Oem.Body[1] = ledrsp.m_data[4]; } state.StateUnion.Oem.Body[2] = atca_to_hpi_color(m_led_override_color); state.StateUnion.Oem.Body[3] = atca_to_hpi_color(ledrsp.m_data[5]); state.StateUnion.Oem.Body[4] = SAHPI_FALSE; state.StateUnion.Oem.Body[5] = 0; } } return SA_OK; } void cIpmiControlAtcaLed::Dump( cIpmiLog &dump, const char *name ) const { dump.Begin( "AtcaLedControl", name ); dump.Entry( "LedNum" ) << m_num << ";\n"; dump.End(); } openhpi-3.6.1/plugins/ipmidirect/ipmi_con_lan.h0000644000175100017510000000661612575647277020624 0ustar mohanmohan/* * * Copyright (c) 2003,2004 by FORCE Computers * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #ifndef dIpmiConLan_h #define dIpmiConLan_h #include #ifndef dIpmiCon_h #include "ipmi_con.h" #endif #ifndef dIpmiAuth_h #include "ipmi_auth.h" #endif // standard RMCP port #define dIpmiConLanStdPort 623 // # of times to try a message before we fail it. #define dLanRspRetries 2 #define dLanPingTimeout 2000 #define dAsfIana 0xbe110000 class cIpmiConLan : public cIpmiCon { protected: struct sockaddr_in m_ip_addr; int m_port; tIpmiAuthType m_auth; tIpmiPrivilege m_priv; cIpmiAuth *m_auth_method; char m_username[dIpmiUsernameMax+1]; char m_passwd[dIpmiPasswordMax+1]; uint32_t m_session_id; tIpmiAuthType m_working_auth; // connection challange unsigned char m_challenge_string[16]; // outstanding pongs int m_ping_count; uint32_t m_outbound_seq_num; uint32_t m_inbound_seq_num; uint16_t m_recv_msg_map; int AuthGen( unsigned char *out, uint8_t *ses_id, uint8_t *seq, unsigned char *data, unsigned int data_len ); int AuthCheck( uint8_t *ses_id, uint8_t *seq, unsigned char *data, unsigned int data_len, unsigned char *code ); int OpenLanFd(); unsigned char Checksum( unsigned char *data, int size ); int SendPing(); bool WaitForPong( unsigned int timeout_ms ); enum tResponseType { eResponseTypeError, eResponseTypePong, eResponseTypeMessage, eResponseTypeEvent, eResponseTypeTimeout }; tResponseType ReadResponse( int &seq, cIpmiAddr &addr, cIpmiMsg &msg ); tResponseType HandleData( int fd, cIpmiAddr &addr, cIpmiMsg &msg ); tResponseType WaitForResponse( unsigned int timeout_ms, int &seq, cIpmiAddr &addr, cIpmiMsg &msg ); SaErrorT SendMsgAndWaitForResponse( const cIpmiAddr &addr, const cIpmiMsg &msg, cIpmiAddr &rsp_addr, cIpmiMsg &rsp_msg ); SaErrorT AuthCap(); SaErrorT SetSessionPriv(); SaErrorT ActiveSession(); SaErrorT Challange(); void Reconnect(); void SendCloseSession(); SaErrorT CreateSession(); public: cIpmiConLan( unsigned int timeout, int log_level, struct in_addr addr, int port, tIpmiAuthType auth, tIpmiPrivilege priv, char *user, char *passwd ); virtual ~cIpmiConLan(); protected: virtual int IfGetMaxSeq(); virtual int IfOpen(); virtual void IfClose(); virtual SaErrorT IfSendCmd( cIpmiRequest *r ); virtual void IfReadResponse(); virtual bool IfCheckConnection( cTime &timeout ); virtual void IfCheckConnectionTimeout(); }; #endif openhpi-3.6.1/plugins/ipmidirect/ipmi_sensor_discrete.cpp0000644000175100017510000001574612575647277022745 0ustar mohanmohan/* * ipmi_sensor_discrete.cpp * * Copyright (c) 2004 by FORCE Computers * Copyright (c) 2005 by ESO Technologies. * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #include "ipmi_sensor_discrete.h" #include "ipmi_domain.h" #include #include #include #include #include #include cIpmiSensorDiscrete::cIpmiSensorDiscrete( cIpmiMc *mc ) : cIpmiSensor( mc ) { } cIpmiSensorDiscrete::~cIpmiSensorDiscrete() { } bool cIpmiSensorDiscrete::GetDataFromSdr( cIpmiMc *mc, cIpmiSdr *sdr ) { if ( !cIpmiSensor::GetDataFromSdr( mc, sdr ) ) return false; m_assertion_event_mask = IpmiGetUint16( sdr->m_data + 14 ); m_assertion_event_mask &= 0x7fff; m_current_hpi_assert_mask = m_assertion_event_mask; m_hpi_assert_mask = m_assertion_event_mask; m_deassertion_event_mask = IpmiGetUint16( sdr->m_data + 16 ); m_deassertion_event_mask &= 0x7fff; m_current_hpi_deassert_mask = m_deassertion_event_mask; m_hpi_deassert_mask = m_deassertion_event_mask; m_reading_mask = IpmiGetUint16( sdr->m_data + 18 ); m_reading_mask &= 0x7fff; return true; } bool cIpmiSensorDiscrete::CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ) { if ( cIpmiSensor::CreateRdr( resource, rdr ) == false ) return false; SaHpiSensorRecT &rec = rdr.RdrTypeUnion.SensorRec; rec.DataFormat.IsSupported = SAHPI_FALSE; rec.ThresholdDefn.IsAccessible = SAHPI_FALSE; switch (SensorType()) { // Don't want anybody to mess with these sensors case eIpmiSensorTypeAtcaHotSwap: case eIpmiSensorTypeAtcaIpmb: case eIpmiSensorTypeAtcaAmcHotSwap: rec.EventCtrl = SAHPI_SEC_READ_ONLY; rec.EnableCtrl = SAHPI_FALSE; break; default: break; } return true; } SaErrorT cIpmiSensorDiscrete::GetSensorReading( SaHpiSensorReadingT &data, SaHpiEventStateT &state ) { if ( m_enabled == SAHPI_FALSE ) return SA_ERR_HPI_INVALID_REQUEST; cIpmiMsg rsp; SaErrorT rv = GetSensorData( rsp ); if ( rv != SA_OK ) return rv; if ( &data != NULL ) { memset( &data, 0, sizeof( SaHpiSensorReadingT ) ); data.IsSupported = SAHPI_FALSE; } if ( &state != NULL ) { // only 15 states rsp.m_data[4] &= 0x7f; state = IpmiGetUint16( rsp.m_data + 3 ); } return SA_OK; } SaErrorT cIpmiSensorDiscrete::GetEventMasksHw( SaHpiEventStateT &AssertEventMask, SaHpiEventStateT &DeassertEventMask ) { cIpmiMsg rsp; SaErrorT rv = cIpmiSensor::GetEventMasksHw( rsp ); if ( rv != SA_OK ) return rv; AssertEventMask = IpmiGetUint16( rsp.m_data + 2 ); DeassertEventMask = IpmiGetUint16( rsp.m_data + 4 ); return SA_OK; } SaErrorT cIpmiSensorDiscrete::SetEventMasksHw( const SaHpiEventStateT &AssertEventMask, const SaHpiEventStateT &DeassertEventMask ) { // create de/assertion event mask unsigned int amask; unsigned int dmask; amask = AssertEventMask; dmask = DeassertEventMask; cIpmiMsg msg; SaErrorT rv = SA_OK; if (( amask != 0 ) || ( dmask != 0 )) { IpmiSetUint16( msg.m_data + 2, amask ); IpmiSetUint16( msg.m_data + 4, dmask ); rv = cIpmiSensor::SetEventMasksHw( msg, true ); } if ( rv != SA_OK ) return rv; amask = ( amask ^ m_assertion_event_mask ) & m_assertion_event_mask; dmask = ( dmask ^ m_deassertion_event_mask ) & m_deassertion_event_mask; if (( amask != 0 ) || ( dmask != 0 )) { IpmiSetUint16( msg.m_data + 2, amask ); IpmiSetUint16( msg.m_data + 4, dmask ); rv = cIpmiSensor::SetEventMasksHw( msg, false ); } return rv; } SaErrorT cIpmiSensorDiscrete::CreateEvent( cIpmiEvent *event, SaHpiEventT &h ) { SaErrorT rv = cIpmiSensor::CreateEvent( event, h ); if ( rv != SA_OK ) return rv; // sensor event SaHpiSensorEventT &se = h.EventDataUnion.SensorEvent; se.Assertion = (SaHpiBoolT)!(event->m_data[9] & 0x80); se.EventState = (1 << (event->m_data[10] & 0x0f)); // default value h.Severity = SAHPI_INFORMATIONAL; SaHpiSensorOptionalDataT optional_data = 0; // byte 2 tIpmiEventType type = (tIpmiEventType)(event->m_data[10] >> 6); if ( type == eIpmiEventData1 ) { if ((event->m_data[11] & 0x0f) != 0x0f) { se.PreviousState = (1 << (event->m_data[11] & 0x0f)); optional_data |= SAHPI_SOD_PREVIOUS_STATE; } if ((event->m_data[11] & 0xf0) != 0xf0) { SaHpiEventStateT evt_sec_state = (1 << ((event->m_data[11]>> 4) & 0x0f)); switch (evt_sec_state) { case SAHPI_ES_OK: h.Severity = SAHPI_OK; break; case SAHPI_ES_MINOR_FROM_OK: h.Severity = SAHPI_MINOR; break; case SAHPI_ES_MAJOR_FROM_LESS: h.Severity = SAHPI_MAJOR; break; case SAHPI_ES_CRITICAL_FROM_LESS: h.Severity = SAHPI_CRITICAL; break; case SAHPI_ES_MINOR_FROM_MORE: h.Severity = SAHPI_MINOR; break; case SAHPI_ES_MAJOR_FROM_CRITICAL: h.Severity = SAHPI_MAJOR; break; case SAHPI_ES_CRITICAL: h.Severity = SAHPI_CRITICAL; break; case SAHPI_ES_MONITOR: h.Severity = SAHPI_INFORMATIONAL; break; case SAHPI_ES_INFORMATIONAL: h.Severity = SAHPI_INFORMATIONAL; break; } } } else if ( type == eIpmiEventData2 ) { se.Oem = (SaHpiUint32T)event->m_data[11]; optional_data |= SAHPI_SOD_OEM; } else if ( type == eIpmiEventData3 ) { se.SensorSpecific = (SaHpiUint32T)event->m_data[11]; optional_data |= SAHPI_SOD_SENSOR_SPECIFIC; } // byte 3 type = (tIpmiEventType)((event->m_data[10] & 0x30) >> 4); if ( type == eIpmiEventData2 ) { se.Oem |= (SaHpiUint32T)((event->m_data[12] << 8) & 0xff00); optional_data |= SAHPI_SOD_OEM; } else if ( type == eIpmiEventData3 ) { se.SensorSpecific |= (SaHpiUint32T)((event->m_data[12] << 8) & 0xff00); optional_data |= SAHPI_SOD_SENSOR_SPECIFIC; } se.OptionalDataPresent = optional_data; return SA_OK; } openhpi-3.6.1/plugins/ipmidirect/ipmi_mc_vendor_force.h0000644000175100017510000000162212575647277022335 0ustar mohanmohan/* * Force specific code * * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #ifndef dIpmiMcVendorForce_h #define dIpmiMcVendorForce_h #ifndef dIpmiMcVendor_h #include "ipmi_mc_vendor.h" #endif class cIpmiMcVendorForceShMc : public cIpmiMcVendor { public: cIpmiMcVendorForceShMc( unsigned int product_id ); virtual ~cIpmiMcVendorForceShMc(); virtual bool InitMc( cIpmiMc *mc, const cIpmiMsg &devid ); bool ProcessSdr( cIpmiDomain *domain, cIpmiMc *mc, cIpmiSdrs *sdrs ); }; #endif openhpi-3.6.1/plugins/ipmidirect/ipmi_mc_vendor.cpp0000644000175100017510000010013412575647277021510 0ustar mohanmohan/* * ipmi_mc_vendor.cpp * * Copyright (c) 2004 by FORCE Computers * Copyright (c) 2005-2006 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard * Andy Cress */ #include extern "C" { #include "SaHpiAtca.h" } #include "ipmi_mc_vendor.h" #include "ipmi_mc_vendor_force.h" #include "ipmi_mc_vendor_intel.h" #include "ipmi_mc_vendor_sun.h" #include "ipmi_mc_vendor_fix_sdr.h" #include "ipmi_domain.h" #include "ipmi_control_fan.h" #include "ipmi_control_atca_led.h" #include "ipmi_watchdog.h" cIpmiMcVendorFactory *cIpmiMcVendorFactory::m_factory = 0; static int use_count = 0; static cThreadLock lock; cIpmiMcVendorFactory::cIpmiMcVendorFactory() : m_mc_vendors( 0 ), m_default( new cIpmiMcVendor( 0, 0, "default MC vendor" ) ) { } cIpmiMcVendorFactory::~cIpmiMcVendorFactory() { while( m_mc_vendors ) { cIpmiMcVendor *mv = (cIpmiMcVendor *)m_mc_vendors->data; m_mc_vendors = g_list_remove( m_mc_vendors, mv ); delete mv; } if ( m_default ) delete m_default; } void cIpmiMcVendorFactory::InitFactory() { lock.Lock(); if ( m_factory == 0 ) { m_factory = new cIpmiMcVendorFactory; // Force ShMC specific stuff m_factory->Register( new cIpmiMcVendorForceShMc( 0x1011 ) ); m_factory->Register( new cIpmiMcVendorForceShMc( 0x1080 ) ); // Intel BMC specific stuff m_factory->Register( new cIpmiMcVendorIntelBmc( 0x000C ) ); m_factory->Register( new cIpmiMcVendorIntelBmc( 0x001B ) ); m_factory->Register( new cIpmiMcVendorIntelBmc( 0x0022 ) ); m_factory->Register( new cIpmiMcVendorIntelBmc( 0x0026 ) ); m_factory->Register( new cIpmiMcVendorIntelBmc( 0x0028 ) ); m_factory->Register( new cIpmiMcVendorIntelBmc( 0x0029 ) ); m_factory->Register( new cIpmiMcVendorIntelBmc( 0x0100 ) ); m_factory->Register( new cIpmiMcVendorIntelBmc( 0x4311 ) ); m_factory->Register( new cIpmiMcVendorIntelBmc( 0x0811 ) ); m_factory->Register( new cIpmiMcVendorIntelBmc( 0x0900 ) ); /*HSC*/ m_factory->Register( new cIpmiMcVendorIntelBmc( 0x0911 ) ); /*HSC*/ m_factory->Register( new cIpmiMcVendorIntelBmc( 0x0A0C ) ); /*HSC*/ m_factory->Register( new cIpmiMcVendorIntelBmc( 0x003E ) ); for (int i = 0x0048; i <= 0x005D; i++) m_factory->Register( new cIpmiMcVendorIntelBmc( i ) ); /*Romley*/ // Sun BMC specific stuff m_factory->Register( new cIpmiMcVendorSunBmc( 0x4701 ) ); // Enabling this code will fix badly formed SDR // found on various boards tested with the plugin // It would be much better if vendors fixed those // This is why this code is not enabled by default #ifdef FIX_BAD_SDR for ( int i = 0; mc_patch[i].sdr_patch != NULL; i++ ) { m_factory->Register( new cIpmiMcVendorFixSdr( mc_patch[i].manufacturer_id, mc_patch[i].product_id ) ); } #endif } use_count++; lock.Unlock(); } void cIpmiMcVendorFactory::CleanupFactory() { lock.Lock(); use_count--; assert( use_count >= 0 ); if ( use_count == 0 ) { delete m_factory; m_factory = 0; } lock.Unlock(); } bool cIpmiMcVendorFactory::Register( cIpmiMcVendor *mv ) { if ( Find( mv->m_manufacturer_id, mv->m_product_id ) ) { assert( 0 ); return false; } m_mc_vendors = g_list_append( m_mc_vendors, mv ); return true; } bool cIpmiMcVendorFactory::Unregister( unsigned int manufacturer_id, unsigned int product_id ) { cIpmiMcVendor *mv = Find( manufacturer_id, product_id ); if ( !mv ) return false; m_mc_vendors = g_list_remove( m_mc_vendors, mv ); return true; } cIpmiMcVendor * cIpmiMcVendorFactory::Find( unsigned int manufacturer_id, unsigned int product_id ) { GList *list = m_mc_vendors; while( list ) { cIpmiMcVendor *mv = (cIpmiMcVendor *)list->data; if ( mv->m_manufacturer_id == manufacturer_id && mv->m_product_id == product_id ) return mv; list = g_list_next( list ); } return 0; } cIpmiMcVendor * cIpmiMcVendorFactory::Get( unsigned int manufacturer_id, unsigned int product_id ) { cIpmiMcVendor *mv = Find( manufacturer_id, product_id ); if ( mv ) return mv; return m_default; } SaHpiEntityLocationT cIpmiMcVendor::m_unique_instance = 256; cIpmiMcVendor::cIpmiMcVendor( unsigned int manufacturer_id, unsigned int product_id, const char *desc ) : m_manufacturer_id( manufacturer_id ), m_product_id( product_id ) { strncpy( m_description, desc, sizeof(m_description) - 1 ); m_description[sizeof(m_description) - 1] = 0; } cIpmiMcVendor::~cIpmiMcVendor() { } bool cIpmiMcVendor::InitMc( cIpmiMc * /*mc*/, const cIpmiMsg & /*devid*/ ) { return true; } void cIpmiMcVendor::CleanupMc( cIpmiMc * /*mc*/ ) { } bool cIpmiMcVendor::ProcessSdr( cIpmiDomain * /*domain*/, cIpmiMc * /*mc*/, cIpmiSdrs * /*sdrs*/ ) { return true; } bool cIpmiMcVendor::ProcessFru( cIpmiInventory * /*inv*/, cIpmiMc * /*mc*/, unsigned int /*sa*/, SaHpiEntityTypeT /*type*/) { return true; } bool cIpmiMcVendor::CreateRdrs( cIpmiDomain *domain, cIpmiMc *source_mc, cIpmiSdrs *sdrs ) { if ( CreateResources( domain, source_mc, sdrs ) == false ) return false; if ( CreateSensors( domain, source_mc, sdrs ) == false ) return false; if ( CreateControls( domain, source_mc, sdrs ) == false ) return false; if ( CreateSels( domain, source_mc, sdrs ) == false ) return false; if ( CreateInvs( domain, source_mc, sdrs ) == false ) return false; if ( CreateWatchdogs( domain, source_mc ) == false ) return false; return true; } bool cIpmiMcVendor::CreateResources( cIpmiDomain *domain, cIpmiMc *source_mc, cIpmiSdrs *sdrs ) { assert( source_mc ); bool found = false; // Make sure that there is a mcdlr for( unsigned int i = 0; i < sdrs->NumSdrs(); i++ ) { cIpmiSdr *sdr = sdrs->Sdr( i ); if ( sdr->m_type == eSdrTypeMcDeviceLocatorRecord ) { found = true; break; } } // there must be a mcdlr ! if ( found == false ) { stdlog << "WARNING : MC " << source_mc->GetAddress() << " NO MC Device Locator Record\n"; return false; } // create one resource per mcdlr and fdlr for( unsigned int i = 0; i < sdrs->NumSdrs(); i++ ) { cIpmiSdr *sdr = sdrs->Sdr( i ); cIpmiAddr addr; unsigned int fru_id; if ( sdr->m_type == eSdrTypeMcDeviceLocatorRecord ) { addr.m_slave_addr = sdr->m_data[5]; addr.m_channel = sdr->m_data[6] & 0xf; fru_id = 0; } else if ( sdr->m_type == eSdrTypeFruDeviceLocatorRecord ) { // We care only about logical FRUs if ( (sdr->m_data[7] & 0x80) == 0 ) continue; addr.m_slave_addr = sdr->m_data[5]; addr.m_channel = (sdr->m_data[8] >> 4) & 0xf; fru_id = sdr->m_data[6]; } else continue; stdlog << "CreateResources FRU " << fru_id << "\n"; if ( addr.m_slave_addr != source_mc->GetAddress() ) stdlog << "WARNING : SDR slave address " << addr.m_slave_addr << " NOT equal to MC slave address " << (unsigned char)source_mc->GetAddress() << "\n"; if ( addr.m_channel != source_mc->GetChannel() ) stdlog << "WARNING : SDR channel " << addr.m_channel << " NOT equal to MC channel " << source_mc->GetChannel() << "\n"; if ( FindOrCreateResource( domain, source_mc, fru_id, sdr, sdrs ) == false ) { return false; } } return true; } cIpmiResource * cIpmiMcVendor::FindResource( cIpmiDomain *domain, cIpmiMc *mc, unsigned int fru_id, SaHpiEntityTypeT type, SaHpiEntityLocationT instance, cIpmiSdrs *sdrs ) { assert( mc ); stdlog << "FindResource mc " << mc->GetAddress() << " FRU " << fru_id << " type " << type << " instance " << instance << "\n"; cIpmiEntityPath ep = CreateEntityPath( domain, mc->GetAddress(), fru_id, type, instance, sdrs ); stdlog << "Looking for resource: " << ep << ".\n"; cIpmiResource *res = mc->FindResource( ep ); return res; } cIpmiResource * cIpmiMcVendor::FindResource( cIpmiDomain *domain, cIpmiMc *mc, unsigned int fru_id, cIpmiSdr *sdr, cIpmiSdrs *sdrs ) { assert( mc ); SaHpiEntityTypeT type = SAHPI_ENT_UNKNOWN; SaHpiEntityLocationT instance = GetUniqueInstance(); unsigned char snum; if ( sdr ) { if ( sdr->m_type == eSdrTypeMcDeviceLocatorRecord || sdr->m_type == eSdrTypeFruDeviceLocatorRecord ) { type = (SaHpiEntityTypeT)sdr->m_data[12]; instance = (SaHpiEntityLocationT)sdr->m_data[13]; snum = 0; } else if ( sdr->m_type == eSdrTypeFullSensorRecord ) { type = (SaHpiEntityTypeT)sdr->m_data[8]; instance = (SaHpiEntityLocationT)sdr->m_data[9]; snum = sdr->m_data[7]; } else assert( 0 ); } stdlog << "FindResource mc " << mc->GetAddress() << " FRU " << fru_id << " type " << type << " instance " << instance << " snum " << snum << "\n"; cIpmiEntityPath ep = CreateEntityPath( domain, mc->GetAddress(), fru_id, type, instance, sdrs ); stdlog << "Looking for resource: " << ep << ".\n"; cIpmiResource *res = mc->FindResource( ep ); return res; } cIpmiResource * cIpmiMcVendor::FindOrCreateResource( cIpmiDomain *domain, cIpmiMc *mc, unsigned int fru_id, cIpmiSdr *sdr, cIpmiSdrs *sdrs ) { assert( mc ); SaHpiEntityTypeT type = SAHPI_ENT_UNKNOWN; SaHpiEntityLocationT instance = GetUniqueInstance(); if ( sdr ) { if ( sdr->m_type == eSdrTypeMcDeviceLocatorRecord || sdr->m_type == eSdrTypeFruDeviceLocatorRecord ) { type = (SaHpiEntityTypeT)sdr->m_data[12]; instance = (SaHpiEntityLocationT)sdr->m_data[13]; } else if ( sdr->m_type == eSdrTypeFullSensorRecord ) { type = (SaHpiEntityTypeT)sdr->m_data[8]; instance = (SaHpiEntityLocationT)sdr->m_data[9]; } else assert( 0 ); } stdlog << "FindOrCreateResource mc " << mc->GetAddress() << " FRU " << fru_id << " type " << type << " instance " << instance << "\n"; cIpmiEntityPath ep = CreateEntityPath( domain, mc->GetAddress(), fru_id, type, instance, sdrs ); stdlog << "Looking for resource: " << ep << ".\n"; cIpmiResource *res = mc->FindResource( ep ); if ( res ) return res; return CreateResource( domain, mc, fru_id, sdr, sdrs ); } cIpmiResource * cIpmiMcVendor::CreateResource( cIpmiDomain *domain, cIpmiMc *mc, unsigned int fru_id, cIpmiSdr *sdr, cIpmiSdrs *sdrs ) { // create a new resource cIpmiResource *res = new cIpmiResource( mc, fru_id ); SaHpiEntityTypeT type = SAHPI_ENT_UNKNOWN; SaHpiEntityLocationT instance = GetUniqueInstance(); if ( sdr ) { if ( sdr->m_type == eSdrTypeMcDeviceLocatorRecord || sdr->m_type == eSdrTypeFruDeviceLocatorRecord ) { type = (SaHpiEntityTypeT)sdr->m_data[12]; instance = (SaHpiEntityLocationT)sdr->m_data[13]; } else if ( sdr->m_type == eSdrTypeFullSensorRecord ) { type = (SaHpiEntityTypeT)sdr->m_data[8]; instance = (SaHpiEntityLocationT)sdr->m_data[9]; } else assert( 0 ); } res->EntityPath() = CreateEntityPath( domain, mc->GetAddress(), fru_id, type, instance, sdrs ); if ( sdr && ( sdr->m_type == eSdrTypeMcDeviceLocatorRecord || sdr->m_type == eSdrTypeFruDeviceLocatorRecord ) ) { stdlog << "Adding FRU " << fru_id << " "; // set mc id string res->ResourceTag().SetIpmi( sdr->m_data + 15 ); res->Oem() = sdr->m_data[14]; res->IsFru() = true; } // create rpt entry stdlog << "adding resource: " << res->EntityPath() << ".\n"; // add res to mc mc->AddResource( res ); return res; } // TODO: // Handling of entity association records. // This is the reason for the parameter sdrs. cIpmiEntityPath cIpmiMcVendor::CreateEntityPath( cIpmiDomain *domain, unsigned int mc_addr, unsigned int fru_id, SaHpiEntityTypeT type, SaHpiEntityLocationT instance, cIpmiSdrs * /*sdrs*/ ) { // find fru info cIpmiFruInfo *fi = domain->FindFruInfo( mc_addr, fru_id ); if ( ( fi == NULL ) && ( fru_id != 0) ) { fi = domain->NewFruInfo( mc_addr, fru_id ); } cIpmiEntityPath bottom; // clear bit 7 instance &= 0x7f; if ( instance >= 0x60 ) instance -= 0x60; switch ((tIpmiEntityId)type) { default: break; case eIpmiEntityIdPicMgFrontBoard: type = SaHpiEntityTypeT(ATCAHPI_ENT_PICMG_FRONT_BLADE); break; case eIpmiEntityIdPicMgRearTransitionModule: type = SAHPI_ENT_BACK_PANEL_BOARD; break; case eIpmiEntityIdPicMgAdvancedMcModule: type = SaHpiEntityTypeT(ATCAHPI_ENT_AMC); break; case eIpmiEntityIdPicMgMicroTcaCarrierHub: type = SAHPI_ENT_SWITCH_BLADE; break; case eIpmiEntityIdPicmgShelfManager: type = SAHPI_ENT_SHELF_MANAGER; break; case eIpmiEntityIdPicmgFiltrationUnit: type = SaHpiEntityTypeT(ATCAHPI_ENT_FILTRATION_UNIT); break; case eIpmiEntityIdPicmgShelfFruInformation: type = SaHpiEntityTypeT(ATCAHPI_ENT_SHELF_FRU_DEVICE); break; case eIpmiEntityIdPicmgAlarmPanel: type = SAHPI_ENT_ALARM_MANAGER; break; } bottom.SetEntry( 0, type, instance ); bottom.AppendRoot( 1 ); cIpmiEntityPath top = domain->EntityRoot(); if ( fi ) return fi->CreateEntityPath( top, bottom ); // fru info not found => use default entity path cIpmiEntityPath ep = bottom; ep += top; return ep; } static cIpmiSensor * FindSensor( GList *list, unsigned char sa, unsigned int num, unsigned char lun ) { for( ; list; list = g_list_next( list ) ) { cIpmiSensor *sensor = (cIpmiSensor *)list->data; if ( sensor->Num() == num && sensor->Sa() == sa && sensor->Lun() == lun ) return sensor; } return 0; } bool cIpmiMcVendor::CreateSensors( cIpmiDomain *domain, cIpmiMc *source_mc, cIpmiSdrs *sdrs ) { GList *old_sensors = domain->GetSdrSensors( source_mc ); GList *new_sensors = 0; GList *sensors = GetSensorsFromSdrs( domain, source_mc, sdrs ); unsigned int parent_fru_id; SaHpiEntityTypeT type, parent_type; SaHpiEntityLocationT instance, parent_instance; while( sensors ) { cIpmiSensor *sensor = (cIpmiSensor *)sensors->data; sensors = g_list_remove( sensors, sensor ); cIpmiSensor *old_sensor = FindSensor( old_sensors, sensor->Sa(), sensor->Num(), sensor->Lun() ); if ( old_sensor && sensor->Cmp( *old_sensor ) ) { // sensor already there, use old one delete sensor; old_sensor->HandleNew( domain ); old_sensors = g_list_remove( old_sensors, old_sensor ); new_sensors = g_list_append( new_sensors, old_sensor ); continue; } if ( old_sensor ) { // remove the old sensor old_sensors = g_list_remove( old_sensors, old_sensor ); old_sensor->Resource()->RemRdr( old_sensor ); delete old_sensor; } // check if the sensor is defined twice if ( FindSensor( new_sensors, sensor->Sa(), sensor->Num(), sensor->Lun() ) ) { stdlog << "sensor " << sensor->IdString() << " defined twice in SDR !\n"; delete sensor; continue; } cIpmiSdr *sdr = sensor->GetSdr(); if ( sdr == 0 ) { sdr = sdrs->FindSdr( sensor->Mc() ); if (!sdr) { delete sensor; continue; } } type = (SaHpiEntityTypeT)sdr->m_data[8]; instance = (SaHpiEntityLocationT)sdr->m_data[9]; parent_fru_id = sdrs->FindParentFru( type, instance, parent_type, parent_instance ); cIpmiResource *res = FindResource( domain, sensor->Mc(), parent_fru_id, parent_type, parent_instance, sdrs ); if (!res ) { delete sensor; continue; } new_sensors = g_list_append( new_sensors, sensor ); sensor->HandleNew( domain ); res->AddRdr( sensor ); } // destry old sensors while( old_sensors ) { cIpmiSensor *sensor = (cIpmiSensor *)old_sensors->data; old_sensors = g_list_remove( old_sensors, sensor ); sensor->Resource()->RemRdr( sensor ); delete sensor; } // set new sdr sensors domain->SetSdrSensors( source_mc, new_sensors ); return true; } GList * cIpmiMcVendor::GetSensorsFromSdrs( cIpmiDomain *domain, cIpmiMc *source_mc, cIpmiSdrs *sdrs ) { GList *sensors = 0; // create a list of full sensor records for( unsigned int i = 0; i < sdrs->NumSdrs(); i++ ) { cIpmiSdr *sdr = sdrs->Sdr( i ); if ( sdr->m_type != eSdrTypeFullSensorRecord ) continue; GList *l = CreateSensorFromFullSensorRecord( domain, source_mc, sdr, sdrs ); if ( l ) sensors = g_list_concat( sensors, l ); } return sensors; } GList * cIpmiMcVendor::CreateSensorFromFullSensorRecord( cIpmiDomain *domain, cIpmiMc *source_mc, cIpmiSdr *sdr, cIpmiSdrs *sdrs ) { GList *list = 0; tIpmiSensorType sensor_type = (tIpmiSensorType)sdr->m_data[12]; if ( sensor_type == eIpmiSensorTypeAtcaHotSwap ) list = CreateSensorHotswap( domain, source_mc, sdr, sdrs ); else { tIpmiEventReadingType reading_type = (tIpmiEventReadingType)sdr->m_data[13]; if ( reading_type == eIpmiEventReadingTypeThreshold ) list = CreateSensorThreshold( domain, source_mc, sdr, sdrs ); else list = CreateSensorDefault( domain, source_mc, sdr, sdrs ); } for( GList *l = list; l; l = g_list_next( l ) ) { cIpmiSensor *s = (cIpmiSensor *)l->data; if ( s->GetSdr() == 0 ) s->SetSdr( sdr ); } return list; } GList * cIpmiMcVendor::CreateSensorHotswap( cIpmiDomain *domain, cIpmiMc *source_mc, cIpmiSdr *sdr, cIpmiSdrs *sdrs ) { cIpmiMc *mc = source_mc; // FindMcBySdr( domain, sdr ); assert( mc ); cIpmiSensorHotswap *hs = new cIpmiSensorHotswap( mc ); hs->SourceMc() = source_mc; if ( !hs->GetDataFromSdr( mc, sdr ) ) { delete hs; return 0; } CreateSensorEntityPath( domain, hs, source_mc, sdr, sdrs ); return g_list_append( 0, hs ); } GList * cIpmiMcVendor::CreateSensorThreshold( cIpmiDomain *domain, cIpmiMc *source_mc, cIpmiSdr *sdr, cIpmiSdrs *sdrs ) { cIpmiMc *mc = source_mc; // FindMcBySdr( domain, sdr ); assert( mc ); cIpmiSensorThreshold *ts = new cIpmiSensorThreshold( mc ); ts->SourceMc() = source_mc; if ( !ts->GetDataFromSdr( mc, sdr ) ) { delete ts; return 0; } CreateSensorEntityPath( domain, ts, source_mc, sdr, sdrs ); return g_list_append( 0, ts ); } GList * cIpmiMcVendor::CreateSensorDiscrete( cIpmiDomain *domain, cIpmiMc *source_mc, cIpmiSdr *sdr, cIpmiSdrs *sdrs ) { cIpmiMc *mc = source_mc; //FindMcBySdr( domain, sdr ); assert( mc ); cIpmiSensorDiscrete *ds = new cIpmiSensorDiscrete( mc ); ds->SourceMc() = source_mc; if ( !ds->GetDataFromSdr( mc, sdr ) ) { delete ds; return 0; } CreateSensorEntityPath( domain, ds, source_mc, sdr, sdrs ); return g_list_append( 0, ds ); } GList * cIpmiMcVendor::CreateSensorDefault( cIpmiDomain *domain, cIpmiMc *source_mc, cIpmiSdr *sdr, cIpmiSdrs *sdrs ) { return CreateSensorDiscrete( domain, source_mc, sdr, sdrs ); } void cIpmiMcVendor::CreateSensorEntityPath( cIpmiDomain *domain, cIpmiSensor *s, cIpmiMc *source_mc, cIpmiSdr *sdr, cIpmiSdrs *sdrs ) { SaHpiEntityTypeT type, parent_type; SaHpiEntityLocationT instance, parent_instance; unsigned int parent_fru_id; if ( sdr ) { type = (SaHpiEntityTypeT)sdr->m_data[8]; instance = (SaHpiEntityLocationT)sdr->m_data[9]; } else { type = SAHPI_ENT_UNKNOWN; instance = GetUniqueInstance(); } parent_fru_id = sdrs->FindParentFru( type, instance, parent_type, parent_instance ); stdlog << "CreateSensorEntityPath mc " << source_mc->GetAddress() << " FRU " << parent_fru_id << " type " << type << " instance " << instance << "\n"; cIpmiEntityPath parent_ep = CreateEntityPath( domain, source_mc->GetAddress(), parent_fru_id, parent_type, parent_instance, sdrs ); if ((type != parent_type) || (instance != parent_instance)) { // clear bit 7 instance &= 0x7f; if ( instance >= 0x60 ) instance -= 0x60; cIpmiEntityPath child_ep; child_ep.SetEntry( 0, type, instance ); child_ep.AppendRoot( 1 ); child_ep += parent_ep; s->EntityPath() = child_ep; } else { s->EntityPath() = parent_ep; } } cIpmiMc * cIpmiMcVendor::FindMcBySdr( cIpmiDomain *domain, cIpmiSdr *sdr ) { unsigned char chan = 0; int findok = 0; switch( sdr->m_type ) { case eSdrTypeCompactSensorRecord: findok = 1; break; case eSdrTypeFullSensorRecord: findok = 1; break; case eSdrTypeMcDeviceLocatorRecord: chan = sdr->m_data[6] & 0xf; findok = 1; break; case eSdrTypeFruDeviceLocatorRecord: chan = (sdr->m_data[8] >> 4) & 0xf; findok = 1; break; default: break; } if (findok) { cIpmiAddr addr( eIpmiAddrTypeIpmb, chan, 0, sdr->m_data[5] ); return domain->FindMcByAddr( addr ); } return 0; } bool cIpmiMcVendor::CreateControls( cIpmiDomain *domain, cIpmiMc *source_mc, cIpmiSdrs *sdrs ) { // controls only for device SDR if ( source_mc == 0 ) return true; if ( source_mc->IsTcaMc() ) { return CreateControlsAtca( domain, source_mc, sdrs ); } return true; } bool cIpmiMcVendor::CreateWatchdogs( cIpmiDomain *domain, cIpmiMc *mc ) { cIpmiResource *res; for ( int i = 0; i < mc->NumResources(); i++ ) { res = mc->GetResource ( i ); if ( res == 0 ) continue; stdlog << "CreateWatchdogs: addr " << mc->GetAddress() << " FruId " << res->FruId() << "\n"; if (res->FruId() == 0) { cIpmiMsg msg( eIpmiNetfnApp, eIpmiCmdGetWatchdogTimer ); cIpmiMsg rsp; if (mc->IsRmsBoard() && res->EntityPath().GetEntryType(0) != SAHPI_ENT_SYSTEM_BOARD) continue; /* Do an IPMI GetWatchdogTimer command to verify this feature. */ msg.m_data_len = 0; SaErrorT rv = res->SendCommand( msg, rsp ); if (rv != 0 || rsp.m_data[0] != 0) { stdlog << "CreateWatchdogs: IPMI error " << rv << " ccode " << rsp.m_data[0] << "\n"; continue; } /* Everything is valid, create the Watchdog RDR */ stdlog << "CreateWatchdogs Resource type " << res->EntityPath().GetEntryType(0) << " instance " << res->EntityPath().GetEntryInstance(0) << "\n"; cIpmiRdr *wd = new cIpmiWatchdog( mc, SAHPI_DEFAULT_WATCHDOG_NUM, 0 ); wd->EntityPath() = res->EntityPath(); wd->IdString().SetAscii( "Watchdog", SAHPI_TL_TYPE_TEXT, SAHPI_LANG_ENGLISH ); res->AddRdr( wd ); } } return true; } bool cIpmiMcVendor::CreateControlsAtca( cIpmiDomain *domain, cIpmiMc *mc, cIpmiSdrs *sdrs ) { cIpmiResource *res; for ( int i = 0; i < mc->NumResources(); i++ ) { res = mc->GetResource ( i ); if ( res == 0 ) continue; if ( res->IsFru() ) { stdlog << "CreateControlsAtca Resource type " << res->EntityPath().GetEntryType(0) << " instance " << res->EntityPath().GetEntryInstance(0) << " FRU " << res->FruId() << "\n"; CreateControlAtcaLed( domain, res, sdrs ); CreateControlAtcaFan( domain, res, sdrs ); } } return true; } bool cIpmiMcVendor::CreateControlAtcaLed( cIpmiDomain *domain, cIpmiResource *res, cIpmiSdrs *sdrs ) { cIpmiMsg msg( eIpmiNetfnPicmg, eIpmiCmdGetFruLedProperties ); msg.m_data[0] = dIpmiPicMgId; msg.m_data[1] = res->FruId(); msg.m_data_len = 2; cIpmiMsg rsp; SaErrorT rv = res->SendCommand( msg, rsp ); if ( rv != SA_OK || rsp.m_data_len < 4 || rsp.m_data[0] != eIpmiCcOk || rsp.m_data[1] != dIpmiPicMgId ) { stdlog << "cannot get FRU Led properties !\n"; return true; } unsigned char num_app_leds = rsp.m_data[3]; if ( num_app_leds > 0xFB ) num_app_leds = 0; for (int i = 0; i <= (3+num_app_leds); i++) { if ( ( i <= 3 ) && ( rsp.m_data[2] & (1<FruId(); ledmsg.m_data[2] = i; ledmsg.m_data_len = 3; cIpmiMsg ledrsp; rv = res->SendCommand( ledmsg, ledrsp ); if ( rv != SA_OK || ledrsp.m_data_len < 5 || ledrsp.m_data[0] != eIpmiCcOk || ledrsp.m_data[1] != dIpmiPicMgId ) { stdlog << "cannot get Led color capabilities !\n"; continue; } unsigned char led_color_capabilities = ledrsp.m_data[2] & 0x7E; unsigned char led_default_local_color = ledrsp.m_data[3]; unsigned char led_default_override_color = ledrsp.m_data[4]; ledmsg.m_cmd = eIpmiCmdGetFruLedState; rv = res->SendCommand( ledmsg, ledrsp ); if ( rv != SA_OK || ledrsp.m_data_len < 6 || ledrsp.m_data[0] != eIpmiCcOk || ledrsp.m_data[1] != dIpmiPicMgId ) { continue; } if ( (ledrsp.m_data[2] & 0x01) == 0 ) led_default_local_color = 0; cIpmiControlAtcaLed *l = new cIpmiControlAtcaLed( res->Mc(), ATCAHPI_CTRL_NUM_BLUE_LED+i, led_color_capabilities, led_default_local_color, led_default_override_color ); l->EntityPath() = res->EntityPath(); char ledname[32]; if (i == 0) snprintf (ledname, sizeof(ledname), "Blue LED"); else snprintf (ledname, sizeof(ledname), "LED %d", i); l->IdString().SetAscii( ledname, SAHPI_TL_TYPE_TEXT, SAHPI_LANG_ENGLISH ); res->AddRdr( l ); } return true; } bool cIpmiMcVendor::CreateControlAtcaFan( cIpmiDomain *domain, cIpmiResource *res, cIpmiSdrs *sdrs ) { cIpmiMsg msg( eIpmiNetfnPicmg, eIpmiCmdGetFanSpeedProperties ); msg.m_data[0] = dIpmiPicMgId; msg.m_data[1] = res->FruId(); msg.m_data_len = 2; cIpmiMsg rsp; SaErrorT rv = res->SendCommand( msg, rsp ); if ( rv != SA_OK || rsp.m_data_len < 6 || rsp.m_data[0] != eIpmiCcOk || rsp.m_data[1] != dIpmiPicMgId ) { stdlog << "cannot get fan speed properties !\n"; return true; } unsigned int min = rsp.m_data[2]; unsigned int max = rsp.m_data[3]; unsigned int def = rsp.m_data[4]; bool auto_adj = rsp.m_data[5] & 0x80; cIpmiControlFan *f = new cIpmiControlFan( res->Mc(), ATCAHPI_CTRL_NUM_FAN_SPEED, min, max, def, auto_adj ); f->EntityPath() = res->EntityPath(); f->IdString().SetAscii( "Fan Control", SAHPI_TL_TYPE_TEXT, SAHPI_LANG_ENGLISH ); res->AddRdr( f ); return true; } bool cIpmiMcVendor::CreateInvs( cIpmiDomain *domain, cIpmiMc *source_mc, cIpmiSdrs *sdrs ) { for( unsigned int i = 0; i < sdrs->NumSdrs(); i++ ) { cIpmiSdr *sdr = sdrs->Sdr( i ); if ( sdr->m_type == eSdrTypeMcDeviceLocatorRecord ) { if ( (sdr->m_data[8] & 8) == 0 ) continue; } else if ( sdr->m_type != eSdrTypeFruDeviceLocatorRecord ) continue; if ( CreateInv( domain, source_mc, sdr, sdrs ) == false ) return false; } return true; } bool cIpmiMcVendor::CreateInv( cIpmiDomain *domain, cIpmiMc *mc, cIpmiSdr *sdr, cIpmiSdrs *sdrs ) { unsigned int fru_id; unsigned int lun; unsigned int sa = mc->GetAddress(); SaHpiEntityTypeT type; if ( sdr->m_type == eSdrTypeMcDeviceLocatorRecord ) /*0x12*/ { fru_id = 0; lun = 0; sa = sdr->m_data[5]; type = (SaHpiEntityTypeT)sdr->m_data[12]; /* chan = sdr->m_data[6]; */ } else if ( sdr->m_type == eSdrTypeGenericDeviceLocatorRecord ) /*0x10*/ { if ( sdr->m_data[5] != 0) sa = (sdr->m_data[5] >> 1); /*access addr*/ fru_id = (sdr->m_data[6] >> 1) & 0x7f; /*sa*/ lun = (sdr->m_data[7] >> 3) & 0x03; /*lun*/ type = (SaHpiEntityTypeT)sdr->m_data[12]; /* chan = (sdr->m_data[7] >> 5) & 0x07;; */ } else if ( sdr->m_type == eSdrTypeFruDeviceLocatorRecord ) /*0x11*/ { fru_id = sdr->m_data[6]; lun = (sdr->m_data[7] >> 3) & 3; sa = sdr->m_data[5]; type = (SaHpiEntityTypeT)sdr->m_data[12]; /* chan = sdr->m_data[8]; */ } else /* other/unknown sdr type */ { stdlog << "mc.CreateInv, unknown m_type=" << sdr->m_type << ", sdr[3]=" << sdr->m_data[3] << ", sdr[5]=" << sdr->m_data[5] << ", sdr[6]=" << sdr->m_data[6] << "\n"; fru_id = sdr->m_data[6]; lun = (sdr->m_data[7] >> 3) & 3; type = SAHPI_ENT_UNKNOWN; } cIpmiMc *m = mc; assert( m ); cIpmiResource *res = FindResource( domain, m, fru_id, sdr, sdrs ); if ( !res ) return true; cIpmiInventory *inv = (cIpmiInventory *)res->FindRdr( m, SAHPI_INVENTORY_RDR, fru_id ); bool need_add = false; if ( inv == 0 ) { inv = new cIpmiInventory( m, fru_id ); inv->IdString().SetIpmi( sdr->m_data + 15 ); inv->Oem() = sdr->m_data[14]; inv->Resource() = res; ProcessFru(inv, m, sa, type); need_add = true; } SaErrorT rv = inv->Fetch(); if ( rv != SA_OK ) { if ( need_add ) delete inv; // Ignore FRU errors return true; } inv->EntityPath() = res->EntityPath(); if ( !need_add ) return true; res->AddRdr( inv ); return true; } bool cIpmiMcVendor::CreateSels( cIpmiDomain *domain, cIpmiMc *source_mc, cIpmiSdrs *sdrs ) { if ( source_mc == 0 ) return false; if ( !source_mc->SelDeviceSupport() ) return true; cIpmiSdr *mcdlr = sdrs->FindSdr( source_mc ); if ( mcdlr == 0 ) return true; cIpmiResource *res = FindResource( domain, source_mc, 0, mcdlr, sdrs ); if ( !res ) return true; // create hpi sel stdlog << "adding SEL " << res->EntityPath() << "\n"; // sel capabilities res->m_sel = true; return true; } openhpi-3.6.1/plugins/ipmidirect/hotswap.cpp0000644000175100017510000003452412575647277020214 0ustar mohanmohan/* * * Copyright (c) 2003,2004 by FORCE Computers. * Copyright (c) 2005 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #include #include #include "ipmi_utils.h" #include "ipmi.h" #include "ipmi_sensor_hotswap.h" static const char *hotswap_states[] = { "inactive", "insertion_pending", "active", "extraction_pending", "not_present" }; static int hotswap_states_num = sizeof( hotswap_states ) / sizeof( char * ); const char * HotswapStateToString( SaHpiHsStateT state ) { if ( state >= hotswap_states_num ) return "invalid"; return hotswap_states[state]; } SaErrorT cIpmi::IfGetHotswapState( cIpmiResource *res, SaHpiHsStateT &state ) { // get hotswap sensor cIpmiSensorHotswap *hs = res->GetHotswapSensor(); if ( !hs ) return SA_ERR_HPI_INVALID_PARAMS; // get hotswap state return hs->GetHpiState( state ); } // state == SAHPI_HS_STATE_ACTIVE // => M2 -> M3 // => M5 -> M4 // state == SAHPI_HS_STATE_INACTIVE // => M5 -> M6 // => M2 -> M1 SaErrorT cIpmi::IfSetHotswapState( cIpmiResource *res, SaHpiHsStateT state ) { if ( !m_is_tca ) { stdlog << "ATCA not supported by SI !\n"; return SA_ERR_HPI_INVALID_CMD; } if (res->PolicyCanceled() != true) { return SA_ERR_HPI_INVALID_REQUEST; } cIpmiMsg msg( eIpmiNetfnPicmg, eIpmiCmdSetFruActivation ); msg.m_data_len = 3; msg.m_data[0] = dIpmiPicMgId; msg.m_data[1] = res->FruId(); if ( state == SAHPI_HS_STATE_ACTIVE ) { msg.m_data[2] = dIpmiActivateFru; } else { msg.m_data[2] = dIpmiDeactivateFru; } cIpmiMsg rsp; SaErrorT r = res->SendCommandReadLock( msg, rsp ); if ( r != SA_OK ) { stdlog << "IfSetHotSwapState: could not send set FRU activation: " << r << " !\n"; return r; } if ( rsp.m_data_len < 2 || rsp.m_data[0] != eIpmiCcOk || rsp.m_data[1] != dIpmiPicMgId ) { stdlog << "IfSetHotSwapState: IPMI error set FRU activation: " << rsp.m_data[0] << " !\n"; return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } // act == SAHPI_HS_ACTION_INSERTION => M1->M2 // act == SAHPI_HS_ACTION_EXTRACTION => M4->M5 SaErrorT cIpmi::IfRequestHotswapAction( cIpmiResource *res, SaHpiHsActionT act ) { if ( !m_is_tca ) { stdlog << "ATCA not supported by SI !\n"; return SA_ERR_HPI_INVALID_REQUEST; } cIpmiMsg msg( eIpmiNetfnPicmg, eIpmiCmdSetFruActivationPolicy ); msg.m_data_len = 4; msg.m_data[0] = dIpmiPicMgId; msg.m_data[1] = res->FruId(); if ( act == SAHPI_HS_ACTION_INSERTION ) { // m1 -> m2 msg.m_data[2] = 1; // M1->M2 lock bit msg.m_data[3] = 0; // clear locked bit M1->M2 } else { msg.m_data[2] = 2; // M4->M5 lock bit msg.m_data[3] = 0; // clear lock bit M4->M5 } cIpmiMsg rsp; SaErrorT r = res->SendCommandReadLock( msg, rsp ); if ( r != SA_OK ) { stdlog << "IfRequestHotswapAction: could not send set FRU activation policy: " << r << " !\n"; return r; } if ( rsp.m_data_len != 2 || rsp.m_data[0] != eIpmiCcOk || rsp.m_data[1] != dIpmiPicMgId ) { stdlog << "IfRequestHotswapAction: set FRU activation: " << rsp.m_data[0] << " !\n"; return SA_ERR_HPI_INVALID_CMD; } return SA_OK; } SaErrorT cIpmi::IfHotswapPolicyCancel( cIpmiResource *res, SaHpiTimeoutT timeout ) { if ( !m_is_tca ) { stdlog << "ATCA not supported by SI !\n"; return SA_ERR_HPI_INVALID_REQUEST; } res->PolicyCanceled() = true; return SA_OK; } SaErrorT cIpmi::IfSetAutoInsertTimeout( SaHpiTimeoutT timeout ) { if ( !m_is_tca ) { stdlog << "ATCA not supported by SI !\n"; return SA_ERR_HPI_INVALID_REQUEST; } InsertTimeout() = timeout; return SA_OK; } SaErrorT cIpmi::IfGetAutoExtractTimeout( cIpmiResource *res, SaHpiTimeoutT &timeout ) { if ( !m_is_tca ) { stdlog << "ATCA not supported by SI !\n"; return SA_ERR_HPI_INVALID_REQUEST; } timeout = res->ExtractTimeout(); return SA_OK; } SaErrorT cIpmi::IfSetAutoExtractTimeout( cIpmiResource *res, SaHpiTimeoutT timeout ) { if ( !m_is_tca ) { stdlog << "ATCA not supported by SI !\n"; return SA_ERR_HPI_INVALID_REQUEST; } res->ExtractTimeout() = timeout; return SA_OK; } SaErrorT cIpmi::IfGetPowerState( cIpmiResource *res, SaHpiPowerStateT &state ) { if (res->Mc()->IsRmsBoard()) { cIpmiMsg msg( eIpmiNetfnChassis, eIpmiCmdGetChassisStatus ); cIpmiMsg rsp; msg.m_data_len = 0; SaErrorT rv = res->SendCommandReadLock( msg, rsp ); if (rv != SA_OK) { stdlog << "IfGetPowerState: error " << rv << "\n"; } else if (rsp.m_data[0] != eIpmiCcOk) { stdlog << "IfGetPowerState: ccode " << rsp.m_data[0] << "\n"; return (SA_ERR_HPI_INVALID_DATA); } else { if (rsp.m_data[1] & 0x01) state = SAHPI_POWER_ON; else state = SAHPI_POWER_OFF; // if ((rsp.mdata[1] & 0x1E) != 0) /*power fault*/; } return rv; } // get power level cIpmiMsg msg( eIpmiNetfnPicmg, eIpmiCmdGetPowerLevel ); cIpmiMsg rsp; msg.m_data[0] = dIpmiPicMgId; msg.m_data[1] = res->FruId(); msg.m_data[2] = 0x01; // desired steady power msg.m_data_len = 3; SaErrorT rv = res->SendCommandReadLock( msg, rsp ); if ( rv != SA_OK ) { stdlog << "cannot send get power level: " << rv << " !\n"; return rv; } if ( rsp.m_data_len < 3 || rsp.m_data[0] != eIpmiCcOk || rsp.m_data[0] != dIpmiPicMgId ) { stdlog << "cannot get power level: " << rsp.m_data[0] << " !\n"; return SA_ERR_HPI_INVALID_CMD; } unsigned char power_level = rsp.m_data[2] & 0x1f; // get current power level msg.m_data[2] = 0; // steady state power rv = res->SendCommandReadLock( msg, rsp ); if ( rv != SA_OK ) { stdlog << "IfGetPowerState: could not send get power level: " << rv << " !\n"; return rv; } if ( rsp.m_data_len < 6 || rsp.m_data[0] != eIpmiCcOk || rsp.m_data[1] != dIpmiPicMgId ) { stdlog << "IfGetPowerState: IPMI error get power level: " << rsp.m_data[0] << " !\n"; return SA_ERR_HPI_INVALID_CMD; } unsigned char current_power_level = rsp.m_data[2] & 0x1f; if ( current_power_level >= power_level ) state = SAHPI_POWER_ON; else state = SAHPI_POWER_OFF; return SA_OK; } SaErrorT cIpmi::IfSetPowerState( cIpmiResource *res, SaHpiPowerStateT state ) { SaErrorT rv; unsigned int power_level = 0; if (res->Mc()->IsRmsBoard()) { unsigned char power_state = 0; switch (state) { case SAHPI_POWER_CYCLE: power_state = 0x02; break; case SAHPI_POWER_ON: power_state = 0x01; break; case SAHPI_POWER_OFF: power_state = 0x00; break; default: power_state = 0x02; break; } cIpmiMsg msg( eIpmiNetfnChassis, eIpmiCmdChassisControl ); msg.m_data[0] = power_state; msg.m_data_len = 1; cIpmiMsg rsp; rv = res->SendCommandReadLock( msg, rsp ); if (rv != SA_OK) stdlog << "IfSetPowerState: state " << power_state << " error " << rv << "\n"; return rv; } cIpmiMsg msg( eIpmiNetfnPicmg, eIpmiCmdGetPowerLevel ); msg.m_data[0] = dIpmiPicMgId; msg.m_data[1] = res->FruId(); cIpmiMsg rsp; if ( state == SAHPI_POWER_CYCLE ) { // power off msg.m_cmd = eIpmiCmdSetPowerLevel; msg.m_data[2] = power_level; msg.m_data[3] = 0x01; // copy desierd level to present level msg.m_data_len = 4; rv = res->SendCommandReadLock( msg, rsp ); if ( rv != SA_OK ) { stdlog << "cannot send set power level: " << rv << " !\n"; return rv; } if ( rsp.m_data_len < 2 || rsp.m_data[0] != eIpmiCcOk || rsp.m_data[1] != dIpmiPicMgId ) { stdlog << "cannot set power level: " << rsp.m_data[0] << " !\n"; return SA_ERR_HPI_INVALID_CMD; } // power on state = SAHPI_POWER_ON; } if ( state == SAHPI_POWER_ON ) { // get power level msg.m_cmd = eIpmiCmdGetPowerLevel; msg.m_data[2] = 0x01; // desired steady power msg.m_data_len = 3; rv = res->SendCommandReadLock( msg, rsp ); if ( rv != SA_OK ) { stdlog << "cannot send get power level: " << rv << " !\n"; return SA_ERR_HPI_INVALID_CMD; } if ( rsp.m_data_len < 3 || rsp.m_data[0] != eIpmiCcOk || rsp.m_data[1] != dIpmiPicMgId ) { stdlog << "cannot get power level: " << rsp.m_data[0] << " !\n"; return SA_ERR_HPI_INVALID_CMD; } power_level = rsp.m_data[2] & 0x1f; } else if ( state != SAHPI_POWER_OFF ) return SA_ERR_HPI_INVALID_PARAMS; // set power level msg.m_cmd = eIpmiCmdSetPowerLevel; msg.m_data[2] = power_level; msg.m_data[3] = 0x01; // copy desierd level to present level msg.m_data_len = 4; rv = res->SendCommandReadLock( msg, rsp ); if ( rv != SA_OK ) { stdlog << "cannot send set power level: " << rv << "! \n"; return rv; } if ( rsp.m_data_len < 2 || rsp.m_data[0] != eIpmiCcOk || rsp.m_data[1] != dIpmiPicMgId ) { stdlog << "cannot set power level: " << rsp.m_data[0] << " !\n"; return SA_ERR_HPI_INVALID_CMD; } return SA_OK; } SaErrorT cIpmi::IfGetIndicatorState( cIpmiResource *res, SaHpiHsIndicatorStateT &state ) { cIpmiMsg msg( eIpmiNetfnPicmg, eIpmiCmdGetFruLedState ); cIpmiMsg rsp; msg.m_data_len = 3; msg.m_data[0] = dIpmiPicMgId; msg.m_data[1] = res->FruId(); msg.m_data[2] = 0; // blue led; SaErrorT rv = res->SendCommandReadLock( msg, rsp ); if ( rv != SA_OK ) { stdlog << "IfGetIndicatorState: could not send get FRU LED state: " << rv << " !\n"; return rv; } if ( rsp.m_data_len < 6 || rsp.m_data[0] != 0 || rsp.m_data[1] != dIpmiPicMgId ) { stdlog << "IfGetIndicatorState: IPMI error set FRU LED state: " << rsp.m_data[0] << " !\n"; return SA_ERR_HPI_INVALID_DATA; } // lamp test if ( rsp.m_data[2] & 4 ) { if ( rsp.m_data_len < 10 ) { stdlog << "IfGetIndicatorState: IPMI error (lamp test) message to short: " << rsp.m_data_len << " !\n"; return SA_ERR_HPI_INVALID_DATA; } state = SAHPI_HS_INDICATOR_ON; return SA_OK; } // overwrite state if ( rsp.m_data[2] & 2 ) { if ( rsp.m_data_len < 9 ) { stdlog << "IfGetIndicatorState: IPMI error (overwrite) message to short: " << rsp.m_data_len << " !\n"; return SA_ERR_HPI_INVALID_DATA; } if ( rsp.m_data[6] == 0 ) state = SAHPI_HS_INDICATOR_OFF; else state = SAHPI_HS_INDICATOR_ON; return SA_OK; } // local control state if ( rsp.m_data[3] == 0 ) state = SAHPI_HS_INDICATOR_OFF; else state = SAHPI_HS_INDICATOR_ON; return SA_OK; } SaErrorT cIpmi::IfSetIndicatorState( cIpmiResource *res, SaHpiHsIndicatorStateT state ) { cIpmiMsg msg( eIpmiNetfnPicmg, eIpmiCmdSetFruLedState ); msg.m_data_len = 6; msg.m_data[0] = dIpmiPicMgId; msg.m_data[1] = res->FruId(); msg.m_data[2] = 0; // blue led; msg.m_data[3] = (state == SAHPI_HS_INDICATOR_ON) ? 0xff : 0; msg.m_data[4] = 0; msg.m_data[5] = 1; // blue cIpmiMsg rsp; SaErrorT rv = res->SendCommandReadLock( msg, rsp ); if ( rv != SA_OK ) { stdlog << "IfGetIndicatorState: could not send get FRU LED state: " << rv << " !\n"; return rv; } if ( rsp.m_data_len < 2 || rsp.m_data[0] != 0 || rsp.m_data[1] != dIpmiPicMgId ) { stdlog << "IfGetIndicatorState: IPMI error set FRU LED state: " << rsp.m_data[0] << " !\n"; return SA_ERR_HPI_INVALID_DATA; } return SA_OK; } SaErrorT cIpmi::IfGetResetState( cIpmiResource * /*res*/, SaHpiResetActionT &state ) { state = SAHPI_RESET_DEASSERT; return SA_OK; } SaErrorT cIpmi::IfSetResetState( cIpmiResource *res, SaHpiResetActionT state ) { unsigned char reset_state; unsigned char chassis_state; switch( state ) { case SAHPI_COLD_RESET: reset_state = 0x00; chassis_state = 0x02; break; case SAHPI_WARM_RESET: // There is no way to know whether an ATCA FRU supports // warm reset -> Let's use cold reset all the time for now reset_state = 0x00; chassis_state = 0x03; break; case SAHPI_RESET_DEASSERT: // Reset is *always* deasserted on ATCA return SA_OK; default: stdlog << "IfSetResetState: unsupported state " << state << " !\n"; return SA_ERR_HPI_INVALID_CMD; } if (res->Mc()->IsRmsBoard()) { cIpmiMsg msg( eIpmiNetfnChassis, eIpmiCmdChassisControl ); msg.m_data[0] = chassis_state; msg.m_data_len = 1; cIpmiMsg rsp; SaErrorT rv = res->SendCommandReadLock( msg, rsp ); if (rv != SA_OK) stdlog << "IfSetResetState: could not send Chassis Reset: " << rv << "\n"; return rv; } cIpmiMsg msg( eIpmiNetfnPicmg, eIpmiCmdFruControl ); msg.m_data[0] = dIpmiPicMgId; msg.m_data[1] = res->FruId(); msg.m_data[2] = reset_state; msg.m_data_len = 3; cIpmiMsg rsp; SaErrorT rv = res->SendCommandReadLock( msg, rsp ); if ( rv != SA_OK ) { stdlog << "IfSetResetState: could not send FRU control: " << rv << " !\n"; return rv; } if ( rsp.m_data_len < 2 || rsp.m_data[0] != 0 || rsp.m_data[1] != dIpmiPicMgId ) { stdlog << "IfSetResetState: IPMI error FRU control: " << rsp.m_data[0] << " !\n"; return SA_ERR_HPI_INVALID_CMD; } return SA_OK; } openhpi-3.6.1/plugins/ipmidirect/ipmi_con.cpp0000644000175100017510000003134212575647277020317 0ustar mohanmohan/* * ipmi_con.c * * Interface code for handling IPMI connections * * Copyright (c) 2003,2004 by FORCE Computers. * Copyright (c) 2005-2007 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #include #include #include #include #include #include #include "ipmi_con.h" cIpmiCon::cIpmiCon( unsigned int timeout, int log_level ) : m_is_open( false ), m_fd( -1 ), m_slave_addr( dIpmiBmcSlaveAddr ), m_max_outstanding( 1 ), m_queue( 0 ), m_num_outstanding( 0 ), m_current_seq( 0 ), m_exit( false ), m_log_level( log_level ), m_timeout( timeout ), m_check_connection( false ) { // m_log_level = dIpmiConLogEvent; for( int i = 0; i < dMaxSeq; i++ ) m_outstanding[i] = 0; m_last_receive_timestamp = cTime::Now(); } cIpmiCon::~cIpmiCon() { assert( !IsRunning() ); RequeueOutstanding(); while( m_queue ) { cIpmiRequest *r = (cIpmiRequest *)m_queue->data; delete r; m_queue = g_list_remove( m_queue, r ); } } void cIpmiCon::RequeueOutstanding() { for( int i = 0; i < dMaxSeq; i++ ) { if ( m_outstanding[i] == 0 ) continue; if ( m_outstanding[i]->m_retries_left == 0 ) m_outstanding[i]->m_retries_left = 1; m_queue = g_list_append( m_queue, m_outstanding[i] ); RemOutstanding( i ); } } int cIpmiCon::AddOutstanding( cIpmiRequest *r ) { assert( m_num_outstanding < m_max_outstanding ); // find next free seq while( true ) { if ( m_outstanding[m_current_seq] == 0 ) break; m_current_seq++; m_current_seq %= m_max_seq; } r->m_seq = m_current_seq; m_outstanding[m_current_seq] = r; m_num_outstanding++; m_current_seq++; m_current_seq %= m_max_seq; return r->m_seq; } void cIpmiCon::RemOutstanding( int seq ) { assert( seq >= 0 && seq < dMaxSeq ); if ( m_outstanding[seq] == 0 ) { assert( 0 ); return; } m_outstanding[seq] = 0; m_num_outstanding--; assert( m_num_outstanding >= 0 ); } void cIpmiCon::HandleMsgError( cIpmiRequest *r, SaErrorT err ) { // try again if ( r->m_retries_left > 0 ) { m_log_lock.Lock(); stdlog << "timeout: resending message.\n"; m_log_lock.Unlock(); m_queue = g_list_append( m_queue, r ); // if a check connection is not in progress // initiate a check connection cTime timeout = m_last_receive_timestamp; timeout += m_timeout; if ( !m_check_connection && timeout < cTime::Now() ) { m_check_connection = true; bool check = IfCheckConnection( timeout ); if ( !check ) m_check_connection = false; else m_check_connection_timeout = timeout; } return; } // error while sending command m_log_lock.Lock(); if ( err == SA_ERR_HPI_TIMEOUT ) stdlog << ">tim " << (unsigned char)r->m_seq << "\n"; else stdlog << ">err " << (unsigned char)r->m_seq << " " << err << "\n"; m_log_lock.Unlock(); r->m_error = err; r->m_signal->Lock(); r->m_signal->Signal(); r->m_signal->Unlock(); } SaErrorT cIpmiCon::SendCmd( cIpmiRequest *request ) { assert( m_num_outstanding < m_max_outstanding ); request->m_retries_left--; assert( request->m_retries_left >= 0 ); int seq = AddOutstanding( request ); if ( m_log_level & dIpmiConLogCmd ) { m_log_lock.Lock(); stdlog << ">cmd " << (unsigned char)seq << " "; IpmiLogDataMsg( request->m_addr, request->m_msg ); stdlog << "\n"; m_log_lock.Unlock(); } // message timeout request->m_timeout = cTime::Now(); // add timeout request->m_timeout += m_timeout; // addr translation IfAddrToSendAddr( request->m_addr, request->m_send_addr ); // send message SaErrorT rv = IfSendCmd( request ); if ( rv != SA_OK ) { RemOutstanding( seq ); return rv; } return SA_OK; } void cIpmiCon::SendCmds() { while( m_queue && m_num_outstanding < m_max_outstanding ) { cIpmiRequest *r = (cIpmiRequest *)m_queue->data; m_queue = g_list_remove( m_queue, r ); SaErrorT rv = SendCmd( r ); if ( rv != SA_OK ) HandleMsgError( r, rv ); } } void * cIpmiCon::Run() { stdlog << "starting reader thread.\n"; // create pollfd struct pollfd pfd; pfd.events = POLLIN; // reader loop while( !m_exit ) { // check for check connction timeout if ( m_check_connection ) { cTime now = cTime::Now(); if ( now >= m_check_connection_timeout ) { IfCheckConnectionTimeout(); // if a new connection is established // resend messages m_queue_lock.Lock(); SendCmds(); m_queue_lock.Unlock(); m_check_connection = false; } } assert( m_fd >= 0 ); // do this before every poll(), // because m_fd can change pfd.fd = m_fd; int rv = poll( &pfd, 1, 100 ); if ( rv == 1 ) // read response IfReadResponse(); else if ( rv != 0 ) { if ( errno != EINTR ) { // error stdlog << "poll returns " << rv << ", " << errno << ", " << strerror( errno ) << " !\n"; assert( 0 ); } } // check for expiered ipmi commands cTime now = cTime::Now(); m_queue_lock.Lock(); for( int i = 0; i < m_max_seq; i++ ) { if ( m_outstanding[i] == 0 ) continue; cIpmiRequest *r = m_outstanding[i]; if ( r->m_timeout > now ) continue; stdlog << "IPMI msg timeout: addr " << r->m_addr.m_slave_addr << " " << IpmiCmdToString( r->m_msg.m_netfn, r->m_msg.m_cmd ) << ", seq " << (unsigned char)r->m_seq << ", timeout " << (int)r->m_timeout.m_time.tv_sec << " " << (int)r->m_timeout.m_time.tv_usec << ", now " << (int)now.m_time.tv_sec << " " << (int)now.m_time.tv_usec << "!\n"; // timeout expired RemOutstanding( r->m_seq ); HandleMsgError( r, SA_ERR_HPI_TIMEOUT ); } // send new comands SendCmds(); m_queue_lock.Unlock(); } stdlog << "stop reader thread.\n"; return 0; } void cIpmiCon::IfClose() { } void cIpmiCon::IfAddrToSendAddr( const cIpmiAddr &addr, cIpmiAddr &send_addr ) { // address translation send_addr = addr; if ( addr.m_type == eIpmiAddrTypeIpmb || addr.m_type == eIpmiAddrTypeIpmbBroadcast ) { if ( addr.m_slave_addr == m_slave_addr ) { // Most systems don't handle sending to your own slave // address, so we have to translate here. send_addr.Si(); send_addr.m_lun = addr.m_lun; } } } bool cIpmiCon::IfCheckConnection( cTime & /*timeout*/ ) { // no connection check return false; } void cIpmiCon::IfCheckConnectionTimeout() { } void cIpmiCon::HandleCheckConnection( bool state ) { if ( state ) m_last_receive_timestamp = cTime::Now(); m_check_connection = false; } bool cIpmiCon::Open() { if ( IsOpen() ) return true; m_max_seq = IfGetMaxSeq(); assert( m_max_seq > 0 && m_max_seq <= dMaxSeq ); m_fd = IfOpen(); if ( m_fd == -1 ) return false; m_last_receive_timestamp = cTime::Now(); m_exit = false; // start reader thread if ( !Start() ) return false; m_is_open = true; return true; } void cIpmiCon::Close() { if ( !IsOpen() ) return; assert( IsRunning() ); // signal reader thread to terminate m_exit = true; // wait for reader thread void *rv; Wait( rv ); IfClose(); m_is_open = false; } // send an ipmi command and wait for response. SaErrorT cIpmiCon::Cmd( const cIpmiAddr &addr, const cIpmiMsg &msg, cIpmiAddr &rsp_addr, cIpmiMsg &rsp, int retries ) { assert( retries > 0 ); SaErrorT rv; assert( msg.m_data_len <= dIpmiMaxMsgLength ); assert( IsRunning() ); cThreadCond cond; // create request cIpmiRequest *r = new cIpmiRequest( addr, msg ); r->m_rsp_addr = &rsp_addr; r->m_rsp = &rsp; r->m_signal = &cond; r->m_error = SA_ERR_HPI_INVALID_CMD; r->m_retries_left = retries; // lock queue cond.Lock(); m_queue_lock.Lock(); if ( m_num_outstanding < m_max_outstanding ) { // send the command within this thread context. rv = SendCmd( r ); if ( rv != SA_OK ) { // error delete r; m_queue_lock.Unlock(); cond.Unlock(); return rv; } } else { stdlog << "send queue full.\n"; m_queue = g_list_append( m_queue, r ); } m_queue_lock.Unlock(); // wait for response cond.Wait(); cond.Unlock(); rv = r->m_error; delete r; if ( rv == SA_OK ) { if ( ((tIpmiNetfn)(msg.m_netfn | 1) != rsp.m_netfn) || (msg.m_cmd != rsp.m_cmd) ) { stdlog << "Mismatch send netfn " << msg.m_netfn << " cmd " << msg.m_cmd << ", recv netfn " << rsp.m_netfn << " cmd " << rsp.m_cmd << "\n"; rv = SA_ERR_HPI_INTERNAL_ERROR; } } return rv; } SaErrorT cIpmiCon::ExecuteCmd( const cIpmiAddr &addr, const cIpmiMsg &msg, cIpmiMsg &rsp_msg, int retries ) { cIpmiAddr rsp_addr; return Cmd( addr, msg, rsp_addr, rsp_msg, retries ); } void cIpmiCon::HandleResponse( int seq, const cIpmiAddr &addr, const cIpmiMsg &msg ) { m_last_receive_timestamp = cTime::Now(); m_queue_lock.Lock(); if ( m_outstanding[seq] == 0 ) { m_log_lock.Lock(); stdlog << "reading response without request:\n"; stdlog << "# " << (unsigned char)seq << " "; IpmiLogDataMsg( addr, msg ); stdlog << "\n"; m_log_lock.Unlock(); m_queue_lock.Unlock(); return; } cIpmiRequest *r = m_outstanding[seq]; assert( r->m_seq == seq ); if ( m_log_level & dIpmiConLogCmd ) { m_log_lock.Lock(); stdlog << "m_seq << " "; IpmiLogDataMsg( addr, msg ); stdlog << "\n"; m_log_lock.Unlock(); } RemOutstanding( seq ); // addr translation *r->m_rsp_addr = addr; // convert braodcast to ipmb if ( r->m_rsp_addr->m_type == eIpmiAddrTypeIpmbBroadcast ) r->m_rsp_addr->m_type = eIpmiAddrTypeIpmb; r->m_error = SA_OK; *r->m_rsp = msg; r->m_signal->Lock(); r->m_signal->Signal(); r->m_signal->Unlock(); m_queue_lock.Unlock(); } void cIpmiCon::HandleEvent( const cIpmiAddr &addr, const cIpmiMsg &msg ) { m_last_receive_timestamp = cTime::Now(); if ( m_log_level & dIpmiConLogEvent ) { m_log_lock.Lock(); stdlog << ">evt "; IpmiLogDataMsg( addr, msg ); stdlog << "\n"; m_log_lock.Unlock(); } HandleAsyncEvent( addr, msg ); } void IpmiLogDataMsg( const cIpmiAddr &addr, const cIpmiMsg &msg ) { char str[1024]; char *s = str; int remaining; // addr switch( addr.m_type ) { case eIpmiAddrTypeIpmb: s += snprintf( s, sizeof(str), "%02x %02x %02x %02x", eIpmiAddrTypeIpmb, addr.m_channel, addr.m_lun, addr.m_slave_addr ); break; case eIpmiAddrTypeSystemInterface: s += snprintf( s, sizeof(str), "%02x %02x %02x ", eIpmiAddrTypeSystemInterface, addr.m_channel, addr.m_lun ); break; case eIpmiAddrTypeIpmbBroadcast: s += snprintf( s, sizeof(str), "%02x %02x %02x %02x", eIpmiAddrTypeIpmbBroadcast, addr.m_channel, addr.m_lun, addr.m_slave_addr ); } remaining = sizeof(str) - (s - str); if (remaining > 0) s += snprintf( s, remaining, " %s (%02d) ", IpmiCmdToString( (tIpmiNetfn)(msg.m_netfn & 0xfe), msg.m_cmd ), msg.m_data_len ); const unsigned char *p = msg.m_data; for( int i = 0; i < msg.m_data_len; i++ ) { remaining = sizeof(str) - (s - str); if (remaining > 0) s += snprintf( s, remaining, " %02x", *p++ ); else break; } stdlog << str; } openhpi-3.6.1/plugins/ipmidirect/thread.h0000644000175100017510000000443512575647277017441 0ustar mohanmohan/* * thread.h * * thread classes * * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #ifndef dThread_h #define dThread_h #include #include enum tTheadState { eTsUnknown, eTsSuspend, eTsRun, eTsExit }; // thread class class cThread { protected: pthread_t m_thread; bool m_main; // true => main thread tTheadState m_state; static void *Thread( void *param ); public: cThread(); cThread( const pthread_t &thread, bool main_thread, tTheadState state ); virtual ~cThread(); // get the current thread class static cThread *GetThread(); // start thread virtual bool Start(); // wait for thread termination virtual bool Wait( void *&rv ); bool IsRunning() { return m_state == eTsRun; } bool IsMain() { return m_main; } protected: virtual void *Run() = 0; virtual void Exit( void *rv ); }; // simple locks class cThreadLock { protected: pthread_mutex_t m_lock; public: cThreadLock(); virtual ~cThreadLock(); virtual void Lock(); virtual void Unlock(); virtual bool TryLock(); }; class cThreadLockAuto { cThreadLock &m_lock; public: cThreadLockAuto( cThreadLock &lock ) : m_lock( lock ) { m_lock.Lock(); } ~cThreadLockAuto() { m_lock.Unlock(); } }; // read/write locks class cThreadLockRw { protected: pthread_rwlock_t m_rwlock; public: cThreadLockRw(); virtual ~cThreadLockRw(); virtual void ReadLock(); virtual void ReadUnlock(); virtual bool TryReadLock(); virtual void WriteLock(); virtual void WriteUnlock(); virtual bool TryWriteLock(); // true => no lock held bool CheckLock(); }; // condition class class cThreadCond : public cThreadLock { protected: pthread_cond_t m_cond; public: cThreadCond(); virtual ~cThreadCond(); // call Lock before Signal virtual void Signal(); // call Lock before Wait virtual void Wait(); }; #endif openhpi-3.6.1/plugins/ipmidirect/ipmi_rdr.cpp0000644000175100017510000000460612575647277020332 0ustar mohanmohan/* * ipmi_rdr.cpp * * Copyright (c) 2004 by FORCE Computers. * Copyright (c) 2005 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #include "ipmi_rdr.h" #include "ipmi_mc.h" #include "ipmi_entity.h" #include "ipmi_resource.h" #include "ipmi_domain.h" cIpmiRdr::cIpmiRdr( cIpmiMc *mc, SaHpiRdrTypeT type ) : m_mc( mc ), m_resource( 0 ), m_type( type ), m_lun( 0 ), m_populate( false ), m_sa( 0 ), m_snum( 0 ), m_chan( 0 ) { m_sa = mc->GetAddress(); m_chan = mc->GetChannel(); } cIpmiRdr::~cIpmiRdr() { } cIpmiDomain * cIpmiRdr::Domain() { return m_mc->Domain(); } bool cIpmiRdr::CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ) { rdr.RecordId = m_record_id; rdr.RdrType = m_type; rdr.Entity = m_entity_path; rdr.IdString = m_id_string; return true; } SaErrorT cIpmiRdr::SendCommand( const cIpmiMsg &msg, cIpmiMsg &rsp, unsigned int lun, int retries ) { return m_mc->SendCommand( msg, rsp, lun, retries ); } bool cIpmiRdr::Populate(GSList **list) { if ( m_populate ) return true; // find resource SaHpiRptEntryT *resource = Domain()->FindResource( Resource()->m_resource_id ); if ( !resource ) { stdlog << "Resource not found: Can't populate RDR !\n"; return false; } // create rdr SaHpiRdrT *rdr = (SaHpiRdrT *)g_malloc0(sizeof(SaHpiRdrT)); CreateRdr( *resource, *rdr ); int rv = oh_add_rdr( Domain()->GetHandler()->rptcache, resource->ResourceId, rdr, this, 1 ); if ( rv != 0 ) { stdlog << "Can't add RDR to plugin cache !\n"; g_free( rdr ); return false; } // assign the hpi record id to sensor, so we can find // the rdr for a given sensor. // the id comes from oh_add_rdr. RecordId() = rdr->RecordId; stdlog << "cIpmiRdr::Populate RDR for resource " << resource->ResourceId << " RDR " << RecordId() << "\n"; *list = g_slist_append(*list, rdr); m_populate = true; return true; } openhpi-3.6.1/plugins/ipmidirect/ipmi_resource.cpp0000644000175100017510000003213312575647277021366 0ustar mohanmohan/* * ipmi_resource.cpp * * Copyright (c) 2004 by FORCE Computers. * Copyright (c) 2005 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #include #include #include #include #include "ipmi_domain.h" cIpmiResource::cIpmiResource( cIpmiMc *mc, unsigned int fru_id ) : m_sel( false ), m_mc( mc ), m_fru_id( fru_id ), m_is_fru( false ), m_hotswap_sensor( 0 ), m_picmg_fru_state( eIpmiFruStateNotInstalled ), m_policy_canceled( true ), m_prev_prev_fru_state( eIpmiFruStateNotInstalled ), m_oem( 0 ), m_current_control_id( 0 ), m_populate( false ) { m_extract_timeout = Domain()->ExtractTimeout(); for( int i = 0; i < 256; i++ ) m_sensor_num[i] = -1; } cIpmiResource::~cIpmiResource() { } cIpmiDomain * cIpmiResource::Domain() const { return m_mc->Domain(); } SaErrorT cIpmiResource::SendCommand( const cIpmiMsg &msg, cIpmiMsg &rsp, unsigned int lun, int retries ) { return m_mc->SendCommand( msg, rsp, lun, retries ); } SaErrorT cIpmiResource::SendCommandReadLock( const cIpmiMsg &msg, cIpmiMsg &rsp, unsigned int lun, int retries ) { cIpmiResource *resource = this; cIpmiDomain *domain = Domain(); domain->ReadUnlock(); SaErrorT rv = SendCommand( msg, rsp, lun, retries ); domain->ReadLock(); if ( domain->VerifyResource( resource ) == false ) return SA_ERR_HPI_NOT_PRESENT; return rv; } SaErrorT cIpmiResource::SendCommandReadLock( cIpmiRdr *rdr, const cIpmiMsg &msg, cIpmiMsg &rsp, unsigned int lun, int retries ) { cIpmiDomain *domain = Domain(); domain->ReadUnlock(); SaErrorT rv = SendCommand( msg, rsp, lun, retries ); domain->ReadLock(); if ( domain->VerifyRdr( rdr ) == false ) return SA_ERR_HPI_NOT_PRESENT; return rv; } int cIpmiResource::CreateSensorNum( SaHpiSensorNumT num ) { int v = num; if ( m_sensor_num[v] != -1 ) { for( int i = 0xff; i >= 0; i-- ) if ( m_sensor_num[i] == -1 ) { v = i; break; } if ( m_sensor_num[v] != -1 ) { assert( 0 ); return -1; } } m_sensor_num[v] = num; return v; } bool cIpmiResource::Create( SaHpiRptEntryT &entry ) { stdlog << "add resource: " << m_entity_path << ".\n"; entry.EntryId = 0; // resource info SaHpiResourceInfoT &info = entry.ResourceInfo; memset( &info, 0, sizeof( SaHpiResourceInfoT ) ); entry.ResourceEntity = m_entity_path; entry.ResourceId = oh_uid_from_entity_path( &entry.ResourceEntity ); entry.ResourceCapabilities = SAHPI_CAPABILITY_RESOURCE; if ( m_sel ) entry.ResourceCapabilities |= SAHPI_CAPABILITY_EVENT_LOG; if ( m_is_fru == true ) { entry.ResourceCapabilities |= SAHPI_CAPABILITY_FRU; if ( m_fru_id == 0 ) { info.ResourceRev = (SaHpiUint8T)m_mc->DeviceRevision(); info.DeviceSupport = (SaHpiUint8T)m_mc->DeviceSupport(); info.ManufacturerId = (SaHpiManufacturerIdT)m_mc->ManufacturerId(); info.ProductId = (SaHpiUint16T)m_mc->ProductId(); info.FirmwareMajorRev = (SaHpiUint8T)m_mc->MajorFwRevision(); info.FirmwareMinorRev = (SaHpiUint8T)m_mc->MinorFwRevision(); info.AuxFirmwareRev = (SaHpiUint8T)m_mc->AuxFwRevision( 0 ); } // Reset supported on ATCA FRUs - Don't allow it on fru #0 of the active ShMC if ( m_mc->IsTcaMc() ) { if (!( (m_mc->GetAddress() == dIpmiBmcSlaveAddr) && (m_fru_id == 0) )) { entry.ResourceCapabilities |= SAHPI_CAPABILITY_RESET; } } else if ( m_mc->IsRmsBoard() ) { /*Rms enabling - 11/09/06 ARCress */ SaHpiEntityTypeT type = cIpmiEntityPath(m_entity_path).GetEntryType(0); if (type == SAHPI_ENT_SYSTEM_BOARD) { stdlog << "Enabling Reset on RMS type " << type << "\n"; entry.ResourceCapabilities |= SAHPI_CAPABILITY_RESET; entry.ResourceCapabilities |= SAHPI_CAPABILITY_POWER; } } } entry.HotSwapCapabilities = 0; entry.ResourceSeverity = SAHPI_OK; entry.ResourceFailed = SAHPI_FALSE; entry.ResourceTag = ResourceTag(); return true; } void cIpmiResource::Destroy() { SaHpiRptEntryT *rptentry; stdlog << "removing resource: " << m_entity_path << ").\n"; while( Num() ) { cIpmiRdr *rdr = GetRdr( 0 ); RemRdr( rdr ); delete rdr; } rptentry = oh_get_resource_by_id( Domain()->GetHandler()->rptcache, m_resource_id ); if ( !rptentry ) { stdlog << "Can't find resource in plugin cache !\n"; } else { // create remove event oh_event *e = (oh_event *)g_malloc0( sizeof( oh_event ) ); // remove sensors only if resource is FRU if ( rptentry->ResourceCapabilities & SAHPI_CAPABILITY_FRU ) { e->event.EventType = SAHPI_ET_HOTSWAP; if (e->resource.ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP) { e->event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_NOT_PRESENT; e->event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_NOT_PRESENT; } else { e->event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_NOT_PRESENT; e->event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_ACTIVE; } } else { e->event.EventType = SAHPI_ET_RESOURCE; e->event.EventDataUnion.ResourceEvent.ResourceEventType = SAHPI_RESE_RESOURCE_FAILURE; rptentry->ResourceFailed = SAHPI_TRUE; } e->event.Source = rptentry->ResourceId; oh_gettimeofday(&e->event.Timestamp); e->event.Severity = rptentry->ResourceSeverity; e->resource = *rptentry; stdlog << "cIpmiResource::Destroy OH_ET_RESOURCE_DEL Event resource " << m_resource_id << "\n"; Domain()->AddHpiEvent( e ); // remove resource from local cache int rv = oh_remove_resource( Domain()->GetHandler()->rptcache, m_resource_id ); if ( rv != 0 ) { stdlog << "Can't remove resource from plugin cache !\n"; } } m_mc->RemResource( this ); delete this; } cIpmiRdr * cIpmiResource::FindRdr( cIpmiMc *mc, SaHpiRdrTypeT type, unsigned int num, unsigned int lun, unsigned int sa ) { int found = 0; for( int i = 0; i < NumRdr(); i++ ) { cIpmiRdr *r = GetRdr( i ); if ( r->Mc() == mc && r->Type() == type && r->Lun() == lun ) { if (type == SAHPI_SENSOR_RDR) { if ((r->SNum() == num) && (r->Sa() == sa)) found = 1; } else if (r->Num() == num) found = 1; if (found) return r; } } return 0; } bool cIpmiResource::AddRdr( cIpmiRdr *rdr ) { stdlog << "adding rdr: " << rdr->EntityPath(); stdlog << " " << rdr->Num(); stdlog << " " << rdr->IdString() << "\n"; // set resource rdr->Resource() = this; // add rdr to resource Add( rdr ); // check for hotswap sensor cIpmiSensorHotswap *hs = dynamic_cast( rdr ); if ( hs ) { if (hs->EntityPath() == EntityPath()) { if ( m_hotswap_sensor ) stdlog << "WARNING: found a second hotswap sensor, discard it !\n"; else m_hotswap_sensor = hs; } else { stdlog << "WARNING: hotswap sensor ep " << hs->EntityPath() << "!= resource ep " << EntityPath() <<", discard it \n"; } } return true; } bool cIpmiResource::RemRdr( cIpmiRdr *rdr ) { int idx = Find( rdr ); if ( idx == -1 ) { stdlog << "user requested removal of a control" " from a resource, but the control was not there !\n"; return false; } if ( rdr == m_hotswap_sensor ) m_hotswap_sensor = 0; Rem( idx ); return true; } bool cIpmiResource::Populate() { if ( m_populate == false ) { // create rpt entry stdlog << "populate resource: " << EntityPath() << ".\n"; struct oh_event *e = (struct oh_event *)g_malloc0( sizeof( struct oh_event ) ); if ( Create( e->resource ) == false ) { g_free( e ); return false; } // assign the hpi resource id to ent, so we can find // the resource for a given entity m_resource_id = e->resource.ResourceId; // add the resource to the resource cache int rv = oh_add_resource( Domain()->GetHandler()->rptcache, &(e->resource), this, 1 ); if ( rv != 0 ) { stdlog << "Can't add resource to plugin cache !\n"; g_free( e ); return false; } for( int i = 0; i < NumRdr(); i++ ) { cIpmiRdr *rdr = GetRdr( i ); if ( rdr->Populate(&e->rdrs) == false ) return false; } // find updated resource in plugin cache SaHpiRptEntryT *resource = oh_get_resource_by_id( Domain()->GetHandler()->rptcache, m_resource_id ); if (!resource) return false; // Update resource in event accordingly memcpy(&e->resource, resource, sizeof (SaHpiRptEntryT)); if (e->resource.ResourceCapabilities & SAHPI_CAPABILITY_FRU) { e->event.EventType = SAHPI_ET_HOTSWAP; if (e->resource.ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP) { SaHpiHsStateT hpi_state = GetHpiState(); e->event.EventDataUnion.HotSwapEvent.HotSwapState = hpi_state; e->event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = hpi_state; stdlog << "cIpmiResource::Populate SAHPI_ET_HOTSWAP Managed FRU Event resource " << m_resource_id << " State " << hpi_state << "\n"; } else { e->event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_ACTIVE; e->event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_ACTIVE; stdlog << "cIpmiResource::Populate SAHPI_ET_HOTSWAP FRU Event resource " << m_resource_id << "\n"; } } else { e->event.EventType = SAHPI_ET_RESOURCE; e->event.EventDataUnion.ResourceEvent.ResourceEventType = SAHPI_RESE_RESOURCE_ADDED; stdlog << "cIpmiResource::Populate SAHPI_ET_RESOURCE Event resource " << m_resource_id << "\n"; } e->event.Source = e->resource.ResourceId; e->event.Severity = e->resource.ResourceSeverity; oh_gettimeofday(&e->event.Timestamp); Domain()->AddHpiEvent( e ); m_populate = true; } return true; } void cIpmiResource::Activate() { cIpmiMsg msg( eIpmiNetfnPicmg, eIpmiCmdSetFruActivation ); msg.m_data_len = 3; msg.m_data[0] = dIpmiPicMgId; msg.m_data[1] = FruId(); msg.m_data[2] = dIpmiActivateFru; cIpmiMsg rsp; SaErrorT rv = SendCommand( msg, rsp ); if ( rv != SA_OK ) { stdlog << "Activate: could not send set FRU Activation: " << rv << " !\n"; } else if ( rsp.m_data_len < 2 || rsp.m_data[0] != eIpmiCcOk || rsp.m_data[1] != dIpmiPicMgId ) { stdlog << "Activate: IPMI error set FRU Activation: " << rsp.m_data[0] << " !\n"; } } void cIpmiResource::Deactivate() { cIpmiMsg msg( eIpmiNetfnPicmg, eIpmiCmdSetFruActivation ); msg.m_data_len = 3; msg.m_data[0] = dIpmiPicMgId; msg.m_data[1] = FruId(); msg.m_data[2] = dIpmiDeactivateFru; cIpmiMsg rsp; SaErrorT rv = SendCommand( msg, rsp ); if ( rv != SA_OK ) { stdlog << "Deactivate: could not send set FRU deactivation: " << rv << " !\n"; } else if ( rsp.m_data_len < 2 || rsp.m_data[0] != eIpmiCcOk || rsp.m_data[1] != dIpmiPicMgId ) { stdlog << "Deactivate: IPMI error set FRU deactivation: " << rsp.m_data[0] << " !\n"; } } SaHpiHsStateT cIpmiResource::GetHpiState() { cIpmiSensorHotswap *hs = GetHotswapSensor(); if ( hs == 0 ) return SAHPI_HS_STATE_NOT_PRESENT; tIpmiFruState picmg_state; SaErrorT rv = hs->GetPicmgState( picmg_state ); if ( rv != SA_OK ) return SAHPI_HS_STATE_NOT_PRESENT; PicmgFruState() = picmg_state; SaHpiHsStateT hpi_state; rv = hs->GetHpiState( hpi_state ); if ( rv != SA_OK ) return SAHPI_HS_STATE_NOT_PRESENT; return hpi_state; } openhpi-3.6.1/plugins/ipmidirect/ipmi_mc_vendor_fix_sdr.cpp0000644000175100017510000001237012575647277023232 0ustar mohanmohan/* * Copyright (c) 2005 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Pierre Sangouard */ #include "ipmi_mc_vendor_fix_sdr.h" #include "ipmi_utils.h" #include "ipmi_log.h" #include "ipmi_mc.h" #include #include mc_sdr_patch_t sdr_patch_fboard[] = { // ATCA Front Board {ENTITY_DONT_CARE, ENTITY_DONT_CARE, eIpmiEntityIdPicMgFrontBoard, 0x60, false}, {ENTITY_DONT_CARE, ENTITY_DONT_CARE, ENTITY_DONT_CARE, ENTITY_DONT_CARE, true}, }; mc_sdr_patch_t sdr_patch_IShMC[] = { // ShMC itself {eIpmiEntityIdPicmgShelfManager, ENTITY_DONT_CARE, eIpmiEntityIdPicmgShelfManager, 0x60, false}, {eIpmiEntityIdBios, ENTITY_DONT_CARE, eIpmiEntityIdPicmgShelfManager, 0x60, false}, {eIpmiEntityIdSystemManagementSoftware, ENTITY_DONT_CARE, eIpmiEntityIdPicmgShelfManager, 0x60, false}, // Air Filter FRU {eIpmiEntityIdPicmgFiltrationUnit, ENTITY_DONT_CARE, eIpmiEntityIdPicmgFiltrationUnit, 0x60, false}, // Chassis Data Module 1 {eIpmiEntityIdPicmgShelfFruInformation, 0, eIpmiEntityIdPicmgShelfFruInformation, 0x60, false}, // Chassis Data Module 2 {eIpmiEntityIdPicmgShelfFruInformation, 1, eIpmiEntityIdPicmgShelfFruInformation, 0x61, false}, {ENTITY_DONT_CARE, ENTITY_DONT_CARE, ENTITY_DONT_CARE, ENTITY_DONT_CARE, true}, }; mc_sdr_patch_t sdr_patch_IPEM[] = { {ENTITY_DONT_CARE, ENTITY_DONT_CARE, eIpmiEntityIdPowerSupply, 0x60, false}, {ENTITY_DONT_CARE, ENTITY_DONT_CARE, ENTITY_DONT_CARE, ENTITY_DONT_CARE, true}, }; mc_sdr_patch_t sdr_patch_IFanTray[] = { {ENTITY_DONT_CARE, ENTITY_DONT_CARE, eIpmiEntityIdCoolingUnit, 0x60, false}, {ENTITY_DONT_CARE, ENTITY_DONT_CARE, ENTITY_DONT_CARE, ENTITY_DONT_CARE, true}, }; // Entries in this table are for boards // with badly formed SDRs that have been tested // with the plugin. As soon as a fixed firmware // is available from the vendor, the corresponding // entry will be removed from the table mc_patch_t mc_patch[] = { {0x157, 0x80A, sdr_patch_fboard}, // Tested with firmware <= 1.01 {0x157, 0x808, sdr_patch_fboard}, // Tested with firmware <= 1.10 {0x157, 0x841, sdr_patch_IShMC}, // Tested with firmware = 5.01 {0x157, 0x850, sdr_patch_IPEM}, // Tested with firmware = 1.04 {0x157, 0x870, sdr_patch_IFanTray}, // Tested with firmware = 1.02 {0, 0, NULL}, }; cIpmiMcVendorFixSdr::cIpmiMcVendorFixSdr( unsigned int manufacturer_id, unsigned int product_id ) : cIpmiMcVendor( manufacturer_id, product_id, "Some MC" ) { } cIpmiMcVendorFixSdr::~cIpmiMcVendorFixSdr() { } bool cIpmiMcVendorFixSdr::InitMc( cIpmiMc *mc, const cIpmiMsg &devid ) { stdlog << "InitMc : Found Mc with SDR to fix.\n"; m_sdr_patch = NULL; stdlog << "Manuf " << m_manufacturer_id << " Product " << m_product_id << ".\n"; for ( int i = 0; mc_patch[i].sdr_patch != NULL; i++ ) { if (( mc_patch[i].manufacturer_id == m_manufacturer_id ) && ( mc_patch[i].product_id == m_product_id )) { m_sdr_patch = mc_patch[i].sdr_patch; break; } } assert( m_sdr_patch != NULL ); return true; } bool cIpmiMcVendorFixSdr::ProcessSdr( cIpmiDomain *domain, cIpmiMc *mc, cIpmiSdrs *sdrs ) { unsigned char *pEntityId, *pEntityInstance; stdlog << "ProcessSdr : Special Mc found.\n"; for( unsigned int i = 0; i < sdrs->NumSdrs(); i++ ) { cIpmiSdr *sdr = sdrs->Sdr( i ); if ( (sdr->m_type == eSdrTypeMcDeviceLocatorRecord) || (sdr->m_type == eSdrTypeFruDeviceLocatorRecord) ) { pEntityId = &sdr->m_data[12]; pEntityInstance = &sdr->m_data[13]; } else if ( (sdr->m_type == eSdrTypeFullSensorRecord) || (sdr->m_type == eSdrTypeCompactSensorRecord) ) { pEntityId = &sdr->m_data[8]; pEntityInstance = &sdr->m_data[9]; } else { stdlog << "Type is " << sdr->m_type << "\n"; continue; } stdlog << "Old Type " << sdr->m_type << " Ent ID " << *pEntityId << " Inst " << *pEntityInstance << "\n"; for ( int j = 0; m_sdr_patch[j].last_entry != true; j++ ) { if (( m_sdr_patch[j].old_entity_id == ENTITY_DONT_CARE ) || ( m_sdr_patch[j].old_entity_id == *pEntityId )) { if (( m_sdr_patch[j].old_entity_instance == ENTITY_DONT_CARE ) || ( m_sdr_patch[j].old_entity_instance == *pEntityInstance )) { *pEntityId = m_sdr_patch[j].new_entity_id; *pEntityInstance = m_sdr_patch[j].new_entity_instance; break; } } } stdlog << "New Type " << sdr->m_type << " Ent ID " << *pEntityId << " Inst " << *pEntityInstance << "\n"; } return true; } openhpi-3.6.1/plugins/ipmidirect/ipmi_addr.h0000644000175100017510000000511712575647277020120 0ustar mohanmohan/* * ipmi_addr.h * * Interface for IPMI file connection * * Copyright (c) 2003,2004 by FORCE Computers. * Copyright (c) 2005 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #ifndef dIpmiAddr_h #define dIpmiAddr_h // This is an overlay for all the address types, so it's easy to // determine the actual address type. This is kind of like addresses // work for sockets. #define dIpmiMaxAddrSize 32 // When the address is not used, the type will be set to this value. // The channel is the BMC's channel number for the channel (usually // 0), or dIpmcBmcChannel if communicating directly with the BMC. // Channel for talking directly with the BMC. When using this // channel, This is for the system interface address type only. // FIXME - is this right, or should we use -1? #define dIpmiBmcChannel 0xf #define dIpmiNumChannels 0x10 #define dIpmiBmcSlaveAddr 0x20 enum tIpmiAddrType { eIpmiAddrTypeIpmb = 1, eIpmiAddrTypeSystemInterface = 0xc, eIpmiAddrTypeIpmbBroadcast = 0x41, }; #define dIpmiMaxChannel 16 class cIpmiAddr { public: // Try to take these from the "Channel Medium Type" table // in section 6.5 of the IPMI 1.5 manual. tIpmiAddrType m_type; unsigned short m_channel; unsigned char m_lun; unsigned char m_slave_addr; cIpmiAddr( tIpmiAddrType type = eIpmiAddrTypeIpmb, short channel = 0, unsigned char lun = 0, unsigned char slave_addr = dIpmiBmcSlaveAddr ) : m_type( type ), m_channel( channel ), m_lun( lun ), m_slave_addr( slave_addr ) { if ( type == eIpmiAddrTypeSystemInterface ) Si(); } int Cmp( const cIpmiAddr &addr ) const; bool operator==( const cIpmiAddr &addr ) const { return !Cmp( addr ); } bool operator!=( const cIpmiAddr &addr ) const { return Cmp( addr ); } void Log() const; short Channel() const { return m_channel; } bool IsType( tIpmiAddrType type ) const { return m_type == type; } unsigned char Lun() const { return m_lun; } unsigned char SlaveAddr() const { return m_slave_addr; } void Si() { m_type = eIpmiAddrTypeSystemInterface; m_channel = dIpmiBmcChannel; m_lun = 0; } }; #endif openhpi-3.6.1/plugins/ipmidirect/ipmi_utils.cpp0000644000175100017510000000474512575647277020707 0ustar mohanmohan/* * ipmi_utils.cpp * * Copyright (c) 2003 by FORCE Computers * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include #include "ipmi_utils.h" static const char *fru_state[] = { "not installed", "inactive", "activation request", "activation in progress", "active", "deactivation request", "deactivation in progress", "communication lost" }; const char * IpmiFruStateToString( tIpmiFruState val ) { if ( val > eIpmiFruStateCommunicationLost ) return "invalid"; return fru_state[val]; } unsigned int IpmiGetUint32( const unsigned char *data ) { return (data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24)); } // Extract a 16-bit integer from the data, IPMI (little-endian) style. unsigned int IpmiGetUint16( const unsigned char *data ) { return data[0] | (data[1] << 8); } // Add a 32-bit integer to the data, IPMI (little-endian) style. void IpmiSetUint32( unsigned char *data, int val ) { data[0] = val & 0xff; data[1] = (val >> 8) & 0xff; data[2] = (val >> 16) & 0xff; data[3] = (val >> 24) & 0xff; } // Add a 16-bit integer to the data, IPMI (little-endian) style. void IpmiSetUint16( unsigned char *data, int val ) { data[0] = val & 0xff; data[1] = (val >> 8) & 0xff; } void IpmiDateToString( unsigned int t, char *str ) { struct tm tmt; time_t dummy = t; localtime_r( &dummy, &tmt ); // 2003.10.30 strftime( str, dDateStringSize, "%Y.%m.%d", &tmt ); } void IpmiTimeToString( unsigned int t, char *str ) { struct tm tmt; time_t dummy = t; localtime_r( &dummy, &tmt ); // 11:11:11 strftime( str, dTimeStringSize, "%H:%M:%S", &tmt ); } void IpmiDateTimeToString( unsigned int t, char *str ) { struct tm tmt; time_t dummy = t; localtime_r( &dummy, &tmt ); // 2003.10.30 11:11:11 strftime( str, dDateTimeStringSize, "%Y.%m.%d %H:%M:%S", &tmt ); } openhpi-3.6.1/plugins/ipmidirect/t/0000755000175100017510000000000012605014553016231 5ustar mohanmohanopenhpi-3.6.1/plugins/ipmidirect/t/sensor_factors_000.cpp0000644000175100017510000000464312575647277022402 0ustar mohanmohan/* * Test convertion for raw -> interpreted and interpreted -> raw * * Copyright (c) 2004 by FORCE Computers * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * */ #include "test.h" #include "ipmi_sensor_factors.h" #define dAnalogDataFormat eIpmiAnalogDataFormatUnsigned #define dLinearization eIpmiLinearizationLinear #define dM 136 #define dTolerance 9 #define dB 0 #define dAccuracy 15 #define dAccuracyExp 0 #define dRExp -4 #define dBExp 0 static cIpmiSdr sdr = { 0, 1, 5, eSdrTypeFullSensorRecord, 60, { 0, 0, // record id 0x51, // ipmi version 0, // record type 0, // length 0, // owner id 0, // lun 0, // num 0, // entity id 0, // instance 0, // initialization 0, // capabilities 0, // type 0, // event reading type 0, 0, // event mask 0, 0, // event mask 0, 0, // event mask dAnalogDataFormat << 6, // units 1 0, // units 2 0, // units 3 eIpmiLinearizationLinear, dM & 0xff, ((dM >> 2) & 0xc0) | (dTolerance & 0x3f), dB & 0xff, ((dB >> 2) & 0xc0) | (dAccuracy & 0x3f), ((dAccuracy >> 2) & 0xf0) | ((dAccuracyExp << 2) & 0x0c), ((dRExp << 4) & 0xf0) | (dBExp & 0x0f ), 0, 0, } }; int main( int /*argc*/, char * /*argv*/[] ) { cIpmiSensorFactors *s = new cIpmiSensorFactors; Test( s->GetDataFromSdr( &sdr ) ); cIpmiSensorFactors c; c.m_analog_data_format = dAnalogDataFormat; c.m_linearization = dLinearization; c.m_m = dM; c.m_tolerance = dTolerance; c.m_b = dB; c.m_r_exp = dRExp; c.m_accuracy_exp = dAccuracyExp; c.m_accuracy = dAccuracy; c.m_b_exp = dBExp; Test( s->Cmp( c ) ); for( unsigned int i = 0; i < 256; i++ ) { double d; unsigned int r; Test( s->ConvertFromRaw( i, d, false ) ); Test( s->ConvertToRaw( cIpmiSensorFactors::eRoundNormal, d, r, false, false ) ); Test( r == i ); } delete s; return TestResult(); } openhpi-3.6.1/plugins/ipmidirect/t/thread_000.cpp0000644000175100017510000000243012575647277020607 0ustar mohanmohan/* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include "thread.h" #include "test.h" #include "ipmi_utils.h" #define dMagic 0x47130815 class cThreadTest : public cThread, public cThreadLock, public cThreadLockRw { public: cThreadTest() : m_magic( dMagic ) {} unsigned int m_magic; protected: virtual void *Run(); }; void * cThreadTest::Run() { cTime tn = cTime::Now(); tn += 1000; cThreadTest *thread = (cThreadTest *)cThread::GetThread(); Test( thread == this ); Test( thread->m_magic == dMagic ); while( tn > cTime::Now() ) usleep( 100000 ); return 0; } int main() { cThread *mt = cThread::GetThread(); Test( mt ); Test( mt->IsRunning() ); Test( mt->IsMain() ); cThreadTest thread; Test( thread.Start() ); Test( thread.IsRunning() ); while( thread.IsRunning() ) usleep( 100000 ); return TestResult(); } openhpi-3.6.1/plugins/ipmidirect/t/con_001.c0000644000175100017510000002112012575647277017555 0ustar mohanmohan/* * Check if async events work. * * Copyright (c) 2004 by FORCE Computers * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * * This test requires: * - IPMI hardware * - human assistance to generate an event * e.g. eject switch handle * * So it is not enabled by default. */ #include #include #include #include #include #include #include #include #include #include #define dIpmiMaxMsgLength 80 // This is an overlay for all the address types, so it's easy to // determine the actual address type. This is kind of like addresses // work for sockets. #define IPMI_MAX_ADDR_SIZE 32 struct ipmi_addr { // Try to take these from the "Channel Medium Type" table // in section 6.5 of the IPMI 1.5 manual. int addr_type; short channel; char data[IPMI_MAX_ADDR_SIZE]; }; // When the address is not used, the type will be set to this value. // The channel is the BMC's channel number for the channel (usually // 0), or IPMC_BMC_CHANNEL if communicating directly with the BMC. #define IPMI_SYSTEM_INTERFACE_ADDR_TYPE 0x0c struct ipmi_system_interface_addr { int addr_type; short channel; unsigned char lun; }; // An IPMB Address. #define IPMI_IPMB_ADDR_TYPE 0x01 // Used for broadcast get device id as described in section 17.9 of the // IPMI 1.5 manual. #define IPMI_IPMB_BROADCAST_ADDR_TYPE 0x41 struct ipmi_ipmb_addr { int addr_type; short channel; unsigned char slave_addr; unsigned char lun; }; // Channel for talking directly with the BMC. When using this // channel, This is for the system interface address type only. FIXME // - is this right, or should we use -1? #define IPMI_BMC_CHANNEL 0xf #define IPMI_NUM_CHANNELS 0x10 // A raw IPMI message without any addressing. This covers both // commands and responses. The completion code is always the first // byte of data in the response (as the spec shows the messages laid // out). struct ipmi_msg { unsigned char netfn; unsigned char cmd; unsigned short data_len; unsigned char *data; }; // Messages sent to the interface are this format. struct ipmi_req { unsigned char *addr; // Address to send the message to. unsigned int addr_len; long msgid; // The sequence number for the message. This // exact value will be reported back in the // response to this request if it is a command. // If it is a response, this will be used as // the sequence value for the response. struct ipmi_msg msg; }; // Receive types for messages coming from the receive interface. This // is used for the receive in-kernel interface and in the receive // IOCTL. #define IPMI_RESPONSE_RECV_TYPE 1 // A response to a command #define IPMI_ASYNC_EVENT_RECV_TYPE 2 // Something from the event queue #define IPMI_CMD_RECV_TYPE 3 // A command from somewhere else // Note that async events and received commands do not have a completion // code as the first byte of the incoming data, unlike a response. // Messages received from the interface are this format. struct ipmi_recv { int recv_type; // Is this a command, response or an // asyncronous event. unsigned char *addr; // Address the message was from is put // here. The caller must supply the // memory. unsigned int addr_len; // The size of the address buffer. // The caller supplies the full buffer // length, this value is updated to // the actual message length when the // message is received. long msgid; // The sequence number specified in the request // if this is a response. If this is a command, // this will be the sequence number from the // command. struct ipmi_msg msg; // The data field must point to a buffer. // The data_size field must be set to the // size of the message buffer. The // caller supplies the full buffer // length, this value is updated to the // actual message length when the message // is received. }; // Get/set the default timing values for an interface. You shouldn't // generally mess with these. struct ipmi_timing_parms { int retries; unsigned int retry_time_ms; }; // The magic IOCTL value for this interface. #define IPMI_IOC_MAGIC 'i' // Send a message to the interfaces. error values are: // - EFAULT - an address supplied was invalid. // - EINVAL - The address supplied was not valid, or the command // was not allowed. // - EMSGSIZE - The message to was too large. // - ENOMEM - Buffers could not be allocated for the command. #define IPMICTL_SEND_COMMAND _IOR(IPMI_IOC_MAGIC, 13, \ struct ipmi_req) // Like RECEIVE_MSG, but if the message won't fit in the buffer, it // will truncate the contents instead of leaving the data in the // buffer. #define IPMICTL_RECEIVE_MSG_TRUNC _IOWR(IPMI_IOC_MAGIC, 11, \ struct ipmi_recv) // Set whether this interface receives events. Note that the first // user registered for events will get all pending events for the // interface. error values: // - EFAULT - an address supplied was invalid. #define IPMICTL_SET_GETS_EVENTS_CMD _IOR(IPMI_IOC_MAGIC, 16, int) #define IPMICTL_SET_TIMING_PARMS_CMD _IOR(IPMI_IOC_MAGIC, 22, \ struct ipmi_timing_parms) static int OpenSmiFd( int if_num ) { int fd; char devname[30]; sprintf( devname, "/dev/ipmidev/%d", if_num ); fd = open( devname, O_RDWR ); if ( fd >= 0 ) return fd; sprintf( devname, "/dev/ipmi/%d", if_num ); fd = open( devname, O_RDWR ); if ( fd >= 0 ) return fd; sprintf( devname, "/dev/ipmi%d", if_num ); fd = open( devname, O_RDWR ); return fd; } int main( int argc, char *argv[] ) { // set timing and retries struct ipmi_timing_parms parms; int rv; int val; struct pollfd ufds[1]; // open ipmi device int fd = OpenSmiFd( 0 ); if ( fd < 0 ) { fprintf( stderr, "cannot open ipmi device !\n" ); return fd; } // set timing and retries parms.retries = 0; parms.retry_time_ms = 1000; rv = ioctl( fd, IPMICTL_SET_TIMING_PARMS_CMD, &parms ); if ( rv == -1 ) fprintf( stderr, "warning: could not set timing parms !\n" ); // we want async events val = 1; rv = ioctl( fd, IPMICTL_SET_GETS_EVENTS_CMD, &val ); if ( rv == -1 ) fprintf( stderr, "warning: could not set gets events !\n" ); ufds[0].fd = fd; ufds[0].events = POLLIN; while( 1 ) { unsigned char data[dIpmiMaxMsgLength]; struct ipmi_addr addr; struct ipmi_recv recv; rv = poll( ufds, 1, -1 ); if ( rv != 1 ) { fprintf( stderr, "poll: %d, %s !\n", errno, strerror( errno ) ); usleep( 100000 ); continue; } recv.msg.data = data; recv.msg.data_len = dIpmiMaxMsgLength; recv.addr = (unsigned char *)&addr; recv.addr_len = sizeof( struct ipmi_addr ); rv = ioctl( fd, IPMICTL_RECEIVE_MSG_TRUNC, &recv ); if ( rv == -1 ) { if ( errno == EMSGSIZE ) // The message was truncated, handle it as such. data[0] = 0xC8; else continue; } switch( recv.recv_type ) { case IPMI_RESPONSE_RECV_TYPE: printf( "read response: %02x %02x !\n", recv.msg.netfn, recv.msg.cmd ); break; case IPMI_ASYNC_EVENT_RECV_TYPE: // if we can read an event this test is passed printf( "read event: %02x, %02x\n", recv.msg.netfn, recv.msg.cmd ); break; case IPMI_CMD_RECV_TYPE: printf( "read incoming message: %02x, %02x\n", recv.msg.netfn, recv.msg.cmd ); break; default: break; } } return 1; } openhpi-3.6.1/plugins/ipmidirect/t/Makefile.am0000644000175100017510000000351112575647277020312 0ustar mohanmohan# # Copyright (c) 2004 by FORCE Computers # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # # Authors: # Thomas Kanngieser # CON_REMOTE_SOURCES = \ ipmi_con.cpp \ ipmi_con_lan.cpp \ ipmi_con_smi.cpp \ ipmi_auth.cpp \ ipmi_cmd.cpp \ ipmi_log.cpp \ ipmi_msg.cpp \ ipmi_addr.cpp \ ipmi_utils.cpp \ thread.cpp THREAD_REMOTE_SOURCES = thread.cpp SENSOR_FACTORS_REMOTE_SOURCES = ipmi_sensor_factors.cpp MOSTLYCLEANFILES = \ $(CON_REMOTE_SOURCES) \ $(THREAD_REMOTE_SOURCES) \ $(SENSOR_FACTORS_REMOTE_SOURCES) \ @TEST_CLEAN@ \ *.log MAINTAINERCLEANFILES = Makefile.in *~ CLEANFILES = @CLEANFILES@ $(MOSTLYCLEANFILES) AM_CPPFLAGS = -DG_LOG_DOMAIN=\"t\" AM_CPPFLAGS += @OPENHPI_INCLUDES@ -I$(top_srcdir)/plugins/ipmidirect $(CON_REMOTE_SOURCES): if test ! -f $@ -a ! -L $@; then \ ln -s $(top_srcdir)/plugins/ipmidirect/$@; \ fi $(SENSOR_FACTORS_REMOTE_SOURCES): if test ! -f $@ -a ! -L $@; then \ ln -s $(top_srcdir)/plugins/ipmidirect/$@; \ fi check_PROGRAMS = \ con_000 \ con_001 \ thread_000 \ sensor_factors_000 TESTS = \ thread_000 \ sensor_factors_000 con_000_SOURCES = con_000.cpp nodist_con_000_SOURCES = $(CON_REMOTE_SOURCES) con_000_LDADD = @CRYPTO_LIB@ con_001_SOURCES = con_001.c nodist_con_001_SOURCES = $(CON_REMOTE_SOURCES) con_001_LDADD = @CRYPTO_LIB@ thread_000_SOURCES = thread_000.cpp test.h nodist_thread_000_SOURCES = $(THREAD_REMOTE_SOURCES) sensor_factors_000_SOURCES = sensor_factors_000.cpp test.h nodist_sensor_factors_000_SOURCES = $(SENSOR_FACTORS_REMOTE_SOURCES) openhpi-3.6.1/plugins/ipmidirect/t/test.h0000644000175100017510000000074412575647277017413 0ustar mohanmohan#ifndef dTest_h #define dTest_h #include static int num_ok = 0; static int num_fail = 0; static void TestFunction( const char *str, const char *file, int line, bool expr ) { if ( expr ) num_ok++; else { printf( "FAIL %s:%d: %s\n", file, line, str ); num_fail++; } } #define Test(expr) TestFunction( __STRING(expr), __FILE__, __LINE__, expr ) static int TestResult() { if ( num_fail ) return 1; return 0; } #endif openhpi-3.6.1/plugins/ipmidirect/t/con_000.cpp0000644000175100017510000001156712575647277020132 0ustar mohanmohan/* * Stress test for the connection layer * * Copyright (c) 2004 by FORCE Computers * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * * This test requires: * - IPMI hardware with RMCP * - RMCP configuration like IP address, port, user, password * * So it is not enabled by default. */ #include #include "ipmi_con_lan.h" #include #include #define dNumThreads 30 #define dNumCmdsPerThread 100 static const char *host = "192.168.110.187"; static int port = 623; static const char *user = "kanne"; static const char *passwd = "kanne"; static tIpmiAuthType auth = eIpmiAuthTypeNone; static tIpmiPrivilege priv = eIpmiPrivilegeAdmin; static cIpmiConLan *con = 0; static int num_threads = 0; static int num_cmds = 0; cThreadLockRw lock; class cThreadTest : public cThread { int m_id; cIpmiAddr m_addr; public: cThreadTest( int id, unsigned char slave_addr ) : m_id( id ), m_addr( eIpmiAddrTypeIpmb, 0, 0, slave_addr ) { } int SendCommand( const cIpmiMsg &msg, cIpmiMsg &rsp ) { num_cmds++; return con->ExecuteCmd( m_addr, msg, rsp ); } void ClearSel() { lock.WriteLock(); // get a reservation cIpmiMsg msg( eIpmiNetfnStorage, eIpmiCmdReserveSel ); msg.m_data_len = 0; cIpmiMsg rsp; int rv = SendCommand( msg, rsp ); unsigned short reservation = IpmiGetUint16( rsp.m_data + 1 ); msg.m_netfn = eIpmiNetfnStorage; msg.m_cmd = eIpmiCmdClearSel; IpmiSetUint16( msg.m_data, reservation ); msg.m_data[2] = 'C'; msg.m_data[3] = 'L'; msg.m_data[4] = 'R'; msg.m_data_len = 6; bool first = true; int count = 100; do { msg.m_data[5] = first ? 0xaa : 0; // initiate erase/ erase status first = false; rsp.m_data[0] = 0xff; rv = SendCommand( msg, rsp ); } while( (rsp.m_data[1] & 0x7) != 0x1 && count-- > 0 ); lock.WriteUnlock(); } void Cmd() { cIpmiMsg msg( eIpmiNetfnStorage, eIpmiCmdAddSelEntry ); msg.m_data[0] = 0; msg.m_data[1] = 0; msg.m_data[2] = 0xc0; msg.m_data[3] = 0; msg.m_data[4] = 0; msg.m_data[5] = 0; msg.m_data[6] = 0; msg.m_data[7] = 1; msg.m_data[8] = 2; msg.m_data[9] = 3; msg.m_data[10] = 0; msg.m_data[11] = 0; msg.m_data[12] = 0; msg.m_data[13] = 0; msg.m_data[14] = 0; msg.m_data[15] = 0; msg.m_data_len = 16; cIpmiMsg rsp; lock.ReadLock(); for( int i = 0; i < 10; i++ ) { int rv = SendCommand( msg, rsp ); if ( rv || rsp.m_data[0] ) { lock.ReadUnlock(); ClearSel(); lock.ReadLock(); } } lock.ReadUnlock(); } virtual void *Run() { num_threads++; for( int i = 0; i < dNumCmdsPerThread; i++ ) Cmd(); num_threads--; delete this; return 0; } }; class cIpmiConLanTest : public cIpmiConLan { public: cIpmiConLanTest( unsigned int timeout, struct in_addr addr, int por, tIpmiAuthType aut, tIpmiPrivilege pri, char *u, char *p ) : cIpmiConLan( timeout, 0, addr, por, aut, pri, u, p ) { } virtual ~cIpmiConLanTest() { } virtual void HandleAsyncEvent( const cIpmiAddr & /*addr*/, const cIpmiMsg & /*msg*/ ) { } }; int main( int /*argc*/, char * /*argv*/[] ) { stdlog.Open( dIpmiLogFile|dIpmiLogStdOut ); struct hostent *ent = gethostbyname( host ); if ( !ent ) { stdlog << "unable to resolve IPMI LAN address: " << host << " !\n"; return 1; } struct in_addr lan_addr; memcpy( &lan_addr, ent->h_addr_list[0], ent->h_length ); con = new cIpmiConLanTest( 5000, lan_addr, port, auth, priv, const_cast(user), const_cast(passwd) ); con->SetMaxOutstanding( 4 ); int rv = con->Open() ? 0 : 1; if ( !rv ) { time_t t0 = time( 0 ); for( int i = 0; i < dNumThreads; i++ ) { cThreadTest *t = new cThreadTest( i, 0x20 ); t->Start(); } sleep( 1 ); while( num_threads ) { sleep( 1 ); stdlog << "### " << num_cmds << "\n"; } time_t t = time( 0 ) - t0; stdlog << "time: " << (int)t << "s\n"; } delete con; stdlog << num_cmds << " GetDeviceId\n"; stdlog.Close(); return rv; } openhpi-3.6.1/plugins/ipmidirect/ipmi_mc_vendor_force.cpp0000644000175100017510000001362412575647277022675 0ustar mohanmohan/* * Force specific code * * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include "ipmi_mc_vendor_force.h" #include "ipmi_utils.h" #include "ipmi_log.h" #include "ipmi_mc.h" #include cIpmiMcVendorForceShMc::cIpmiMcVendorForceShMc( unsigned int product_id ) : cIpmiMcVendor( 0x000e48, product_id, "Force ShMc" ) { } cIpmiMcVendorForceShMc::~cIpmiMcVendorForceShMc() { } bool cIpmiMcVendorForceShMc::InitMc( cIpmiMc *mc, const cIpmiMsg &devid ) { stdlog << "Force ShMc found.\n"; // because we are talking to a ShMC and not the ShM, // we need to do some setup: // 1.) set the MC in ShMc mode // 2.) clear repository SDR if ( mc->Addr().IsType( eIpmiAddrTypeSystemInterface ) ) { // we want to go into BMC mode stdlog << "switch to ShMc mode.\n"; cIpmiMsg msg( (tIpmiNetfn)0x30, (tIpmiCmd)0x03 ); msg.m_data[0] = 0; msg.m_data_len = 1; cIpmiMsg rsp; SaErrorT rv = mc->SendCommand( msg, rsp ); if ( rv != SA_OK ) { stdlog << "cannot send set BMC mode: " << rv << " !\n"; return false; } if ( rsp.m_data_len <= 0 || rsp.m_data[0] != eIpmiCcOk ) { stdlog << "cannot go into BMC mode: " << rsp.m_data[0] << " !\n"; return false; } // check if there is a repository SDR if ( devid.m_data[6] & 2 ) { stdlog << "clear repository SDR.\n"; // clear repository SDR // get a reservation msg.m_netfn = eIpmiNetfnStorage; msg.m_cmd = eIpmiCmdReserveSdrRepository; msg.m_data_len = 0; rv = mc->SendCommand( msg, rsp ); if ( rv != SA_OK ) { stdlog << "cannot send reserve reposotory SDR: " << rv << " !\n"; return true; } if ( rsp.m_data_len != 3 || rsp.m_data[0] != eIpmiCcOk ) { stdlog << "cannot reserve repository SDR: " << rsp.m_data[0] << " !\n"; return true; } unsigned short reservation = IpmiGetUint16( rsp.m_data + 1 ); // create repository SDR and wait until erase completed bool first = true; msg.m_netfn = eIpmiNetfnStorage; msg.m_cmd = eIpmiCmdClearSdrRepository; IpmiSetUint16( msg.m_data, reservation ); msg.m_data[2] = 'C'; msg.m_data[3] = 'L'; msg.m_data[4] = 'R'; msg.m_data_len = 6; do { msg.m_data[5] = first ? 0xaa : 0; // initiate erase/ erase status first = false; rv = mc->SendCommand( msg, rsp ); if ( rv != SA_OK ) { stdlog << "cannot send clear SDR reposotory: " << rv << " !\n"; return true; } if ( rsp.m_data_len != 2 || rsp.m_data[0] != eIpmiCcOk ) { stdlog << "cannot reserve repository SDR: " << rsp.m_data[0] << " !\n"; return true; } } // wait until erase is complete while( (rsp.m_data[1] & 0x7) != 0x1 ); } } // this is for debugging only if ( devid.m_data[6] & 4 ) { stdlog << "clear SEL.\n"; // get a reservation cIpmiMsg msg( eIpmiNetfnStorage, eIpmiCmdReserveSel ); msg.m_data_len = 0; cIpmiMsg rsp; SaErrorT rv = mc->SendCommand( msg, rsp ); if ( rv != SA_OK ) { stdlog << "cannot send reserve SEL: " << rv << " !\n"; return true; } if ( rsp.m_data_len != 3 || rsp.m_data[0] != eIpmiCcOk ) { stdlog << "cannot reserve SEL: " << rsp.m_data[0] << " !\n"; return true; } unsigned short reservation = IpmiGetUint16( rsp.m_data + 1 ); // clear SEL msg.m_netfn = eIpmiNetfnStorage; msg.m_cmd = eIpmiCmdClearSel; IpmiSetUint16( msg.m_data, reservation ); msg.m_data[2] = 'C'; msg.m_data[3] = 'L'; msg.m_data[4] = 'R'; msg.m_data_len = 6; bool first = true; do { msg.m_data[5] = first ? 0xaa : 0; // initiate erase/ erase status first = false; rv = mc->SendCommand( msg, rsp ); if ( rv != SA_OK ) { stdlog << "cannot send clear SDR reposotory: " << rv << " !\n"; return true; } if ( rsp.m_data_len != 2 || rsp.m_data[0] != eIpmiCcOk ) { stdlog << "cannot reserve repository SDR: " << rsp.m_data[0] << " !\n"; return true; } } // wait until erase is complete while( (rsp.m_data[1] & 0x7) != 0x1 ); } return true; } bool cIpmiMcVendorForceShMc::ProcessSdr( cIpmiDomain *domain, cIpmiMc *mc, cIpmiSdrs *sdrs ) { if ( mc->GetAddress() != 0x20 ) return true; // fix slave addr of ShMc at 0x20 // create one resource per mcdlr and fdlr for( unsigned int i = 0; i < sdrs->NumSdrs(); i++ ) { cIpmiSdr *sdr = sdrs->Sdr( i ); switch( sdr->m_type ) { case eSdrTypeMcDeviceLocatorRecord: sdr->m_data[5] = 0x20; break; default: break; } } return true; } openhpi-3.6.1/plugins/ipmidirect/ipmi_text_buffer.h0000644000175100017510000000471612575647277021527 0ustar mohanmohan/* * ipmi_text_buffer.h * * Copyright (c) 2003 by FORCE Computers * Copyright (c) 2005 by ESO Technologies. * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #ifndef dIpmiTextBuffer_h #define dIpmiTextBuffer_h #ifndef dIpmiLog_h #include "ipmi_log.h" #endif extern "C" { #include "SaHpi.h" } // wrapper class for SaHpiTextBufferT class cIpmiTextBuffer { protected: int BinaryToAscii( char *buffer, unsigned int len ) const; int BcdPlusToAscii( char *buffer, unsigned int len ) const; int Ascii6ToAscii( char *buffer, unsigned int len ) const; int LanguageToAscii( char *buffer, unsigned int len ) const; int AsciiToBcdPlus ( const char *input ); int AsciiToAscii6 ( const char *input ); int AsciiToLanguage( const char *input ); SaHpiTextBufferT m_buffer; public: cIpmiTextBuffer(); cIpmiTextBuffer( const char *string, SaHpiTextTypeT type, SaHpiLanguageT l = SAHPI_LANG_ENGLISH ); cIpmiTextBuffer( const unsigned char *data, SaHpiLanguageT l = SAHPI_LANG_ENGLISH ); cIpmiTextBuffer( const SaHpiTextBufferT &buf ); void Clear(); operator SaHpiTextBufferT () const { return m_buffer; } SaHpiUint8T DataLength() const { return m_buffer.DataLength; } const unsigned char *SetIpmi( const unsigned char *data, bool is_fru = false, SaHpiLanguageT l = SAHPI_LANG_ENGLISH ); SaHpiTextTypeT CheckAscii( const char *s ); // convert ascii string to text buffer bool SetAscii( const char *string, SaHpiTextTypeT type, SaHpiLanguageT l = SAHPI_LANG_ENGLISH ); // returns length of string or -1 on error int GetAscii( char *buffer, unsigned int len ) const; bool operator==( const cIpmiTextBuffer &tb ) const; bool operator!=( const cIpmiTextBuffer &tb ) const; }; cIpmiLog &operator<<( cIpmiLog &dump, const cIpmiTextBuffer &tb ); #endif openhpi-3.6.1/plugins/ipmidirect/ipmi_auth.cpp0000644000175100017510000000737412575647277020511 0ustar mohanmohan/* * Copyright (c) 2003,2004 by FORCE Computers * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include "ipmi_auth.h" #include #include cIpmiAuth * IpmiAuthFactory( tIpmiAuthType type ) { switch( type ) { case eIpmiAuthTypeNone: return new cIpmiAuthNone; case eIpmiAuthTypeMd2: #ifdef HAVE_OPENSSL_MD2_H return new cIpmiAuthMd2; #else break; #endif case eIpmiAuthTypeMd5: #ifdef HAVE_OPENSSL_MD5_H return new cIpmiAuthMd5; #else break; #endif case eIpmiAuthTypeStraight: return new cIpmiAuthStraight; case eIpmiAuthTypeOem: break; } return 0; } int cIpmiAuthNone::Init( const unsigned char * /*password*/ ) { return 0; } int cIpmiAuthNone::Gen( cIpmiAuthSg /*d*/[], void *output ) { memset( output, 0, 16 ); return 0; } int cIpmiAuthNone::Check( cIpmiAuthSg /*d*/[], void * /*code*/ ) { return 0; } #ifdef HAVE_OPENSSL_MD2_H #include int cIpmiAuthMd2::Init( const unsigned char *password ) { memcpy( data, password, 16 ); return 0; } int cIpmiAuthMd2::Gen( cIpmiAuthSg d[], void *output ) { MD2_CTX ctx; MD2_Init( &ctx ); MD2_Update( &ctx, data, 16 ); for( int i = 0; d[i].data != 0; i++ ) MD2_Update( &ctx, (unsigned char *)d[i].data, d[i].len ); MD2_Update( &ctx, data, 16 ); MD2_Final( (unsigned char *)output, &ctx ); return 0; } int cIpmiAuthMd2::Check( cIpmiAuthSg d[], void *code ) { MD2_CTX ctx; unsigned char md[16]; MD2_Init( &ctx ); MD2_Update( &ctx, data, 16 ); for( int i = 0; d[i].data != 0; i++ ) MD2_Update( &ctx, (unsigned char *)d[i].data, d[i].len ); MD2_Update( &ctx, data, 16 ); MD2_Final( md, &ctx ); if ( memcmp( code, md, 16 ) != 0 ) return EINVAL; return 0; } #endif #ifdef HAVE_OPENSSL_MD5_H #include int cIpmiAuthMd5::Init( const unsigned char *password ) { memcpy( data, password, 16 ); return 0; } int cIpmiAuthMd5::Gen( cIpmiAuthSg d[], void *output ) { MD5_CTX ctx; MD5_Init( &ctx ); MD5_Update( &ctx, data, 16 ); for( int i = 0; d[i].data != 0; i++ ) MD5_Update( &ctx, d[i].data, d[i].len ); MD5_Update( &ctx, data, 16 ); MD5_Final( (unsigned char *)output, &ctx ); return 0; } int cIpmiAuthMd5::Check( cIpmiAuthSg d[], void *code ) { MD5_CTX ctx; unsigned char md[16]; MD5_Init( &ctx ); MD5_Update( &ctx, data, 16 ); for( int i = 0; d[i].data != 0; i++ ) MD5_Update( &ctx, d[i].data, d[i].len ); MD5_Update( &ctx, data, 16 ); MD5_Final( md, &ctx ); if ( memcmp( code, md, 16 ) != 0 ) return EINVAL; return 0; } #endif int cIpmiAuthStraight::Init( const unsigned char *password ) { memcpy( data, password, 16 ); return 0; } int cIpmiAuthStraight::Gen( cIpmiAuthSg /*d*/[], void *output ) { memcpy( output, data, 16 ); return 0; } int cIpmiAuthStraight::Check( cIpmiAuthSg /*d*/[], void *code ) { if ( strncmp( (char *)data, (char *)code, 16 ) != 0 ) return EINVAL; return 0; } openhpi-3.6.1/plugins/ipmidirect/ipmi_con_smi.h0000644000175100017510000000226112575647277020632 0ustar mohanmohan/* * * Copyright (c) 2004 by FORCE Computers * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #ifndef dIpmiConSmi_h #define dIpmiConSmi_h #ifndef dIpmiCon_h #include "ipmi_con.h" #endif class cIpmiConSmi : public cIpmiCon { int m_if_num; int OpenSmiFd( int if_num ); public: cIpmiConSmi( unsigned int timeout, int log_level, int if_num ); virtual ~cIpmiConSmi(); protected: virtual int IfGetMaxSeq(); virtual int IfOpen(); virtual void IfClose(); virtual SaErrorT IfSendCmd( cIpmiRequest *r ); virtual void IfReadResponse(); }; #endif openhpi-3.6.1/plugins/ipmidirect/ipmi_control_fan.cpp0000644000175100017510000001001512575647277022036 0ustar mohanmohan/* * ipmi_control_fan.cpp * * Copyright (c) 2004 by FORCE Computers. * Copyright (c) 2005-2006 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #include "ipmi_control_fan.h" #include "ipmi_resource.h" #include "ipmi_log.h" cIpmiControlFan::cIpmiControlFan( cIpmiMc *mc, unsigned int num, unsigned int minium_speed_level, unsigned int maximum_speed_level, unsigned int default_speed_level, bool local_control_mode ) : cIpmiControl( mc, num, SAHPI_CTRL_FAN_SPEED, SAHPI_CTRL_TYPE_ANALOG ), m_minimum_speed_level( minium_speed_level ), m_maximum_speed_level( maximum_speed_level ), m_default_speed_level( default_speed_level ), m_local_control_mode( local_control_mode ) { } cIpmiControlFan::~cIpmiControlFan() { } bool cIpmiControlFan::CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ) { if ( cIpmiControl::CreateRdr( resource, rdr ) == false ) return false; SaHpiCtrlRecT &rec = rdr.RdrTypeUnion.CtrlRec; SaHpiCtrlRecAnalogT &ana_rec = rec.TypeUnion.Analog; ana_rec.Min = (SaHpiCtrlStateAnalogT)m_minimum_speed_level; ana_rec.Max = (SaHpiCtrlStateAnalogT)m_maximum_speed_level; ana_rec.Default = (SaHpiCtrlStateAnalogT)m_default_speed_level; rec.DefaultMode.Mode = SAHPI_CTRL_MODE_AUTO; rec.DefaultMode.ReadOnly = SAHPI_TRUE; rec.WriteOnly = SAHPI_FALSE; return true; } SaErrorT cIpmiControlFan::SetState( const SaHpiCtrlModeT &mode, const SaHpiCtrlStateT &state ) { if ( mode != SAHPI_CTRL_MODE_AUTO ) { return SA_ERR_HPI_READ_ONLY; } return SA_OK; } SaErrorT cIpmiControlFan::GetState( SaHpiCtrlModeT &mode, SaHpiCtrlStateT &state ) { cIpmiMsg msg( eIpmiNetfnPicmg, eIpmiCmdGetFanLevel ); msg.m_data[0] = dIpmiPicMgId; msg.m_data[1] = Resource()->FruId(); msg.m_data_len = 2; cIpmiMsg rsp; SaErrorT rv = Resource()->SendCommandReadLock( this, msg, rsp ); if ( rv != SA_OK || rsp.m_data_len < 3 || rsp.m_data[0] != eIpmiCcOk || rsp.m_data[1] != dIpmiPicMgId ) { stdlog << "cannot send get fan speed !\n"; return (rv != SA_OK) ? rv : SA_ERR_HPI_INVALID_REQUEST; } if ( &mode != NULL ) { mode = SAHPI_CTRL_MODE_AUTO; } if ( &state != NULL) { state.Type = SAHPI_CTRL_TYPE_ANALOG; if (( rsp.m_data_len >= 5 ) && ( rsp.m_data[4] == 0 )) { state.StateUnion.Analog = (SaHpiCtrlStateAnalogT)rsp.m_data[2]; } else if ( rsp.m_data_len >= 4 ) { if ( rsp.m_data[2] == dIpmiFanLocalControlMode ) { state.StateUnion.Analog = (SaHpiCtrlStateAnalogT)rsp.m_data[3]; } else { if ( rsp.m_data[2] > rsp.m_data[3] ) state.StateUnion.Analog = (SaHpiCtrlStateAnalogT)rsp.m_data[2]; else state.StateUnion.Analog = (SaHpiCtrlStateAnalogT)rsp.m_data[3]; } } else { state.StateUnion.Analog = (SaHpiCtrlStateAnalogT)rsp.m_data[2]; } } return SA_OK; } void cIpmiControlFan::Dump( cIpmiLog &dump, const char *name ) const { dump.Begin( "FanControl", name ); dump.Entry( "ControlNum" ) << m_num << ";\n"; dump.Entry( "Oem" ) << m_oem << ";\n"; dump.Entry( "MinimumSpeedLevel" ) << m_minimum_speed_level << ";\n"; dump.Entry( "MaximumSpeedLevel" ) << m_maximum_speed_level << ";\n"; dump.Entry( "DefaultSpeedLevel" ) << m_default_speed_level << ";\n"; dump.Entry( "LocalControlMode" ) << m_local_control_mode << ";\n"; dump.End(); } openhpi-3.6.1/plugins/ipmidirect/ipmi_log.h0000644000175100017510000000425612575647277017772 0ustar mohanmohan/* * * Copyright (c) 2003,2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #ifndef dIpmiLog_h #define dIpmiLog_h #ifndef dThread_h #include "thread.h" #endif #include #include #define dDefaultLogfile "log" /* log file properties */ #define dIpmiLogPropNone 0 #define dIpmiLogStdOut 1 // use stdout #define dIpmiLogStdErr 2 // use stderr #define dIpmiLogLogFile 4 // use a log file #define dIpmiLogFile 8 // use a file class cIpmiLog { protected: cThreadLock m_lock; int m_lock_count; int m_open_count; bool m_hex; // true => print int in hex bool m_time; // with time bool m_recursive; bool m_std_out; bool m_std_err; bool m_nl; FILE *m_fd; void Start(); void Output( const char *str ); public: cIpmiLog(); virtual ~cIpmiLog(); bool Open( int properties, const char *filename = "", int max_log_files = 1 ); void Close(); void Lock() { m_lock.Lock(); m_lock_count++; } void Unlock() { m_lock_count--; assert( m_lock_count >= 0 ); m_lock.Unlock(); } void Hex( bool hex = true ) { m_hex = hex; } bool IsHex() { return m_hex; } void Time( bool t = true ) { m_time = t; } bool WithTime() { return m_time; } void Recursive( bool r ) { m_recursive = true; } bool IsRecursive() { return m_recursive; } cIpmiLog &operator<<( bool b ); cIpmiLog &operator<<( unsigned char c ); cIpmiLog &operator<<( int i ); cIpmiLog &operator<<( unsigned int i ); cIpmiLog &operator<<( double d ); cIpmiLog &operator<<( const char *str ); void Log( const char *fmt, ... ); void Hex( const unsigned char *data, int size ); void Begin( const char *section, const char *name ); void End(); cIpmiLog &Entry( const char *entry ); }; extern cIpmiLog stdlog; #endif openhpi-3.6.1/plugins/ipmidirect/ipmi.cpp0000644000175100017510000015774612575647277017501 0ustar mohanmohan/* * * Copyright (c) 2003,2004 by FORCE Computers. * Copyright (c) 2005 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard * Andy Cress */ #include #include #include "ipmi.h" #include "ipmi_con_lan.h" #include "ipmi_con_smi.h" #include "ipmi_utils.h" static cIpmi * VerifyIpmi( void *hnd ) { if (!hnd) return 0; oh_handler_state *handler = (oh_handler_state *)hnd; cIpmi *ipmi = (cIpmi *)handler->data; if ( !ipmi ) { return 0; } if ( !ipmi->CheckMagic() ) { return 0; } if ( !ipmi->CheckHandler( handler ) ) { return 0; } return ipmi; } static cIpmiSensor * VerifySensorAndEnter( void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT num, cIpmi *&ipmi ) { ipmi = VerifyIpmi( hnd ); if ( !ipmi ) { return 0; } ipmi->IfEnter(); SaHpiRdrT *rdr = oh_get_rdr_by_type( ipmi->GetHandler()->rptcache, rid, SAHPI_SENSOR_RDR, num ); if ( !rdr ) { ipmi->IfLeave(); return 0; } cIpmiSensor *sensor = (cIpmiSensor *)oh_get_rdr_data( ipmi->GetHandler()->rptcache, rid, rdr->RecordId ); if ( !sensor ) { ipmi->IfLeave(); return 0; } if ( !ipmi->VerifySensor( sensor ) ) { ipmi->IfLeave(); return 0; } return sensor; } static cIpmiControl * VerifyControlAndEnter( void *hnd, SaHpiResourceIdT rid, SaHpiCtrlNumT num, cIpmi *&ipmi ) { ipmi = VerifyIpmi( hnd ); if ( !ipmi ) { return 0; } ipmi->IfEnter(); SaHpiRdrT *rdr = oh_get_rdr_by_type( ipmi->GetHandler()->rptcache, rid, SAHPI_CTRL_RDR, num ); if ( !rdr ) { ipmi->IfLeave(); return 0; } cIpmiControl *control = (cIpmiControl *)oh_get_rdr_data( ipmi->GetHandler()->rptcache, rid, rdr->RecordId ); if ( !control ) { ipmi->IfLeave(); return 0; } if ( !ipmi->VerifyControl( control ) ) { ipmi->IfLeave(); return 0; } return control; } static cIpmiWatchdog * VerifyWatchdogAndEnter( void *hnd, SaHpiResourceIdT rid, SaHpiWatchdogNumT num, cIpmi *&ipmi ) { ipmi = VerifyIpmi( hnd ); if ( !ipmi ) { return 0; } ipmi->IfEnter(); SaHpiRdrT *rdr = oh_get_rdr_by_type( ipmi->GetHandler()->rptcache, rid, SAHPI_WATCHDOG_RDR, num ); if ( !rdr ) { ipmi->IfLeave(); return 0; } cIpmiWatchdog *watchdog = (cIpmiWatchdog *)oh_get_rdr_data( ipmi->GetHandler()->rptcache, rid, rdr->RecordId ); if ( !watchdog ) { ipmi->IfLeave(); return 0; } if ( !ipmi->VerifyWatchdog( watchdog ) ) { ipmi->IfLeave(); return 0; } return watchdog; } static cIpmiInventory * VerifyInventoryAndEnter( void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, cIpmi *&ipmi ) { ipmi = VerifyIpmi( hnd ); if ( !ipmi ) { return 0; } ipmi->IfEnter(); SaHpiRdrT *rdr = oh_get_rdr_by_type( ipmi->GetHandler()->rptcache, rid, SAHPI_INVENTORY_RDR, idrid ); if ( !rdr ) { ipmi->IfLeave(); return 0; } cIpmiInventory *inv = (cIpmiInventory *)oh_get_rdr_data( ipmi->GetHandler()->rptcache, rid, rdr->RecordId ); if ( !inv ) { ipmi->IfLeave(); return 0; } if ( !ipmi->VerifyInventory( inv ) ) { ipmi->IfLeave(); return 0; } return inv; } static cIpmiResource * VerifyResourceAndEnter( void *hnd, SaHpiResourceIdT rid, cIpmi *&ipmi ) { ipmi = VerifyIpmi( hnd ); if ( !ipmi ) { return 0; } ipmi->IfEnter(); cIpmiResource *res = (cIpmiResource *)oh_get_resource_data( ipmi->GetHandler()->rptcache, rid ); if ( !res ) { ipmi->IfLeave(); return 0; } if ( !ipmi->VerifyResource( res ) ) { ipmi->IfLeave(); return 0; } return res; } static cIpmiSel * VerifySelAndEnter( void *hnd, SaHpiResourceIdT rid, cIpmi *&ipmi ) { ipmi = VerifyIpmi( hnd ); if ( !ipmi ) { return 0; } ipmi->IfEnter(); cIpmiResource *res = (cIpmiResource *)oh_get_resource_data( ipmi->GetHandler()->rptcache, rid ); if ( !res ) { ipmi->IfLeave(); return 0; } if ( !ipmi->VerifyResource( res ) ) { ipmi->IfLeave(); return 0; } if ( res->FruId() || !res->Mc()->SelDeviceSupport() ) { ipmi->IfLeave(); return 0; } return res->Mc()->Sel(); } // new plugin_loader extern "C" { // ABI Interface functions static void * IpmiOpen( GHashTable *, unsigned int, oh_evt_queue * ) __attribute__((used)); static void * IpmiOpen( GHashTable *handler_config, unsigned int hid, oh_evt_queue *eventq ) { // open log const char *logfile = 0; int max_logfiles = 10; char *tmp; int lp = dIpmiLogPropNone; dbg( "IpmiOpen" ); if ( !handler_config ) { err( "No config file provided.....ooops!" ); return 0; } logfile = (char *)g_hash_table_lookup( handler_config, "logfile" ); tmp = (char *)g_hash_table_lookup( handler_config, "logfile_max" ); if ( tmp ) max_logfiles = atoi( tmp ); tmp = (char *)g_hash_table_lookup( handler_config, "logflags" ); if ( tmp ) { if ( strstr( tmp, "StdOut" ) || strstr( tmp, "stdout" ) ) lp |= dIpmiLogStdOut; if ( strstr( tmp, "StdError" ) || strstr( tmp, "stderr" ) ) lp |= dIpmiLogStdErr; if ( strstr( tmp, "File" ) || strstr( tmp, "file" ) ) { lp |= dIpmiLogLogFile; if ( logfile == 0 ) logfile = dDefaultLogfile; } } stdlog.Open( lp, logfile, max_logfiles ); stdlog.Time( true ); // create domain cIpmi *ipmi = new cIpmi; // allocate handler oh_handler_state *handler = (oh_handler_state *)g_malloc0( sizeof( oh_handler_state ) ); if ( !handler ) { err("cannot allocate handler"); delete ipmi; stdlog.Close(); return 0; } handler->data = ipmi; handler->rptcache = (RPTable *)g_malloc0( sizeof( RPTable ) ); if ( !handler->rptcache ) { err("cannot allocate RPT cache"); g_free( handler ); delete ipmi; stdlog.Close(); return 0; } handler->config = handler_config; handler->hid = hid; handler->eventq = eventq; ipmi->SetHandler( handler ); if ( !ipmi->IfOpen( handler_config ) ) { ipmi->IfClose(); delete ipmi; oh_flush_rpt( handler->rptcache ); g_free( handler->rptcache ); g_free( handler ); stdlog.Close(); return 0; } return handler; } static void IpmiClose( void * ) __attribute__((used)); static void IpmiClose( void *hnd ) { dbg( "IpmiClose" ); cIpmi *ipmi = VerifyIpmi( hnd ); if ( !ipmi ) { return; } /** Commenting this code block due to the multi-domain changes ** in the infrastructure. ** (Renier Morales 11/21/06) if ( ipmi->DomainId() != oh_get_default_domain_id() ) { stdlog << "Releasing domain id " << ipmi->DomainId() << "\n"; SaErrorT rv = oh_request_domain_delete( ipmi->HandlerId(), ipmi->DomainId() ); if ( rv != SA_OK ) stdlog << "oh_request_domain_delete error " << rv << "\n"; }*/ ipmi->IfClose(); ipmi->CheckLock(); delete ipmi; oh_handler_state *handler = (oh_handler_state *)hnd; if ( handler->rptcache ) { oh_flush_rpt( handler->rptcache ); g_free( handler->rptcache ); } g_free( handler ); // close logfile stdlog.Close(); } static SaErrorT IpmiGetEvent( void * ) __attribute__((used)); static SaErrorT IpmiGetEvent( void *hnd ) { cIpmi *ipmi = VerifyIpmi( hnd ); struct oh_event event; if ( !ipmi ) { return SA_ERR_HPI_INTERNAL_ERROR; } // there is no need to get a lock because // the event queue has its own lock SaErrorT rv = ipmi->IfGetEvent( &event ); return rv; } static SaErrorT IpmiDiscoverResources( void * ) __attribute__((used)); static SaErrorT IpmiDiscoverResources( void *hnd ) { cIpmi *ipmi = VerifyIpmi( hnd ); if ( !ipmi ) { return SA_ERR_HPI_INTERNAL_ERROR; } stdlog << "Simple discovery let's go " << hnd << "\n"; SaErrorT rv = ipmi->IfDiscoverResources(); return rv; } static SaErrorT IpmiSetResourceTag( void *, SaHpiResourceIdT, SaHpiTextBufferT * ) __attribute__((used)); static SaErrorT IpmiSetResourceTag( void *hnd, SaHpiResourceIdT id, SaHpiTextBufferT *tag ) { cIpmi *ipmi = 0; cIpmiResource *res = VerifyResourceAndEnter( hnd, id, ipmi ); if ( !res ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = ipmi->IfSetResourceTag( res, tag ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiSetResourceSeverity( void *, SaHpiResourceIdT, SaHpiSeverityT ) __attribute__((used)); static SaErrorT IpmiSetResourceSeverity( void *hnd, SaHpiResourceIdT id, SaHpiSeverityT sev ) { cIpmi *ipmi = 0; cIpmiResource *res = VerifyResourceAndEnter( hnd, id, ipmi ); if ( !res ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = ipmi->IfSetResourceSeverity( res, sev ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiGetSensorReading( void *, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiSensorReadingT *data, SaHpiEventStateT *state ) __attribute__((used)); static SaErrorT IpmiGetSensorReading( void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiSensorReadingT *data, SaHpiEventStateT *state ) { cIpmi *ipmi = 0; cIpmiSensor *sensor = VerifySensorAndEnter( hnd, id, num, ipmi ); if ( !sensor ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = sensor->GetSensorReading( *data, *state ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiGetSensorThresholds( void *hnd, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiSensorThresholdsT * ) __attribute__((used)); static SaErrorT IpmiGetSensorThresholds( void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiSensorThresholdsT *thres ) { cIpmi *ipmi; cIpmiSensor *sensor = VerifySensorAndEnter( hnd, id, num, ipmi ); if ( !sensor ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = SA_ERR_HPI_INVALID_PARAMS; cIpmiSensorThreshold *t = dynamic_cast( sensor ); if ( t ) rv = t->GetThresholdsAndHysteresis( *thres ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiSetSensorThresholds( void *, SaHpiResourceIdT, SaHpiSensorNumT, const SaHpiSensorThresholdsT * ) __attribute__((used)); static SaErrorT IpmiSetSensorThresholds( void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, const SaHpiSensorThresholdsT *thres ) { cIpmi *ipmi; cIpmiSensor *sensor = VerifySensorAndEnter( hnd, id, num, ipmi ); if ( !sensor ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = SA_ERR_HPI_INVALID_PARAMS; cIpmiSensorThreshold *t = dynamic_cast( sensor ); if ( t ) rv = t->SetThresholdsAndHysteresis( *thres ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiGetSensorEnable( void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT * ) __attribute__((used)); static SaErrorT IpmiGetSensorEnable( void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiBoolT *enable ) { cIpmi *ipmi; cIpmiSensor *sensor = VerifySensorAndEnter( hnd, id, num, ipmi ); if ( !sensor ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = sensor->GetEnable( *enable ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiSetSensorEnable( void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT ) __attribute__((used)); static SaErrorT IpmiSetSensorEnable( void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiBoolT enable ) { cIpmi *ipmi; cIpmiSensor *sensor = VerifySensorAndEnter( hnd, id, num, ipmi ); if ( !sensor ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = sensor->SetEnable( enable ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiGetSensorEventEnables( void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT * ) __attribute__((used)); static SaErrorT IpmiGetSensorEventEnables( void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiBoolT *enables ) { cIpmi *ipmi; cIpmiSensor *sensor = VerifySensorAndEnter( hnd, id, num, ipmi ); if ( !sensor ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = sensor->GetEventEnables( *enables ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiSetSensorEventEnables( void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT ) __attribute__((used)); static SaErrorT IpmiSetSensorEventEnables( void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiBoolT enables ) { cIpmi *ipmi; cIpmiSensor *sensor = VerifySensorAndEnter( hnd, id, num, ipmi ); if ( !sensor ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = sensor->SetEventEnables( enables ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiGetSensorEventMasks( void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiEventStateT *, SaHpiEventStateT * ) __attribute__((used)); static SaErrorT IpmiGetSensorEventMasks( void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiEventStateT *AssertEventMask, SaHpiEventStateT *DeassertEventMask ) { cIpmi *ipmi; cIpmiSensor *sensor = VerifySensorAndEnter( hnd, id, num, ipmi ); if ( !sensor ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = sensor->GetEventMasks( *AssertEventMask, *DeassertEventMask ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiSetSensorEventMasks( void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiSensorEventMaskActionT, SaHpiEventStateT, SaHpiEventStateT ) __attribute__((used)); static SaErrorT IpmiSetSensorEventMasks( void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiSensorEventMaskActionT act, SaHpiEventStateT AssertEventMask, SaHpiEventStateT DeassertEventMask ) { cIpmi *ipmi; cIpmiSensor *sensor = VerifySensorAndEnter( hnd, id, num, ipmi ); if ( !sensor ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = sensor->SetEventMasks( act, AssertEventMask, DeassertEventMask ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiGetControlState( void *, SaHpiResourceIdT, SaHpiCtrlNumT, SaHpiCtrlModeT *, SaHpiCtrlStateT * ) __attribute__((used)); static SaErrorT IpmiGetControlState( void *hnd, SaHpiResourceIdT id, SaHpiCtrlNumT num, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state ) { cIpmi *ipmi; cIpmiControl *control = VerifyControlAndEnter( hnd, id, num, ipmi ); if ( !control ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = control->GetState( *mode, *state ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiSetControlState( void *, SaHpiResourceIdT, SaHpiCtrlNumT, SaHpiCtrlModeT, SaHpiCtrlStateT * ) __attribute__((used)); static SaErrorT IpmiSetControlState( void *hnd, SaHpiResourceIdT id, SaHpiCtrlNumT num, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state ) { cIpmi *ipmi; cIpmiControl *control = VerifyControlAndEnter( hnd, id, num, ipmi ); if ( !control ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = control->SetState( mode, *state ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiGetIdrInfo( void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrInfoT * ) __attribute__((used)); static SaErrorT IpmiGetIdrInfo( void *hnd, SaHpiResourceIdT id, SaHpiIdrIdT idrid, SaHpiIdrInfoT *idrinfo ) { cIpmi *ipmi = 0; cIpmiInventory *inv = VerifyInventoryAndEnter( hnd, id, idrid, ipmi ); if ( !inv ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = inv->GetIdrInfo( idrid, *idrinfo ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiGetIdrAreaHeader( void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrAreaTypeT, SaHpiEntryIdT, SaHpiEntryIdT *, SaHpiIdrAreaHeaderT * ) __attribute__((used)); static SaErrorT IpmiGetIdrAreaHeader( void *hnd, SaHpiResourceIdT id, SaHpiIdrIdT idrid, SaHpiIdrAreaTypeT areatype, SaHpiEntryIdT areaid, SaHpiEntryIdT *nextareaid, SaHpiIdrAreaHeaderT *header ) { cIpmi *ipmi = 0; cIpmiInventory *inv = VerifyInventoryAndEnter( hnd, id, idrid, ipmi ); if ( !inv ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = inv->GetIdrAreaHeader( idrid, areatype, areaid, *nextareaid, *header ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiAddIdrArea( void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrAreaTypeT, SaHpiEntryIdT * ) __attribute__((used)); static SaErrorT IpmiAddIdrArea( void *hnd, SaHpiResourceIdT id, SaHpiIdrIdT idrid, SaHpiIdrAreaTypeT areatype, SaHpiEntryIdT *areaid ) { cIpmi *ipmi = 0; cIpmiInventory *inv = VerifyInventoryAndEnter( hnd, id, idrid, ipmi ); if ( !inv ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = inv->AddIdrArea( idrid, areatype, *areaid ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiDelIdrArea( void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT ) __attribute__((used)); static SaErrorT IpmiDelIdrArea( void *hnd, SaHpiResourceIdT id, SaHpiIdrIdT idrid, SaHpiEntryIdT areaid ) { cIpmi *ipmi = 0; cIpmiInventory *inv = VerifyInventoryAndEnter( hnd, id, idrid, ipmi ); if ( !inv ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = inv->DelIdrArea( idrid, areaid ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiGetIdrField( void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT, SaHpiIdrFieldTypeT, SaHpiEntryIdT, SaHpiEntryIdT *, SaHpiIdrFieldT * ) __attribute__((used)); static SaErrorT IpmiGetIdrField( void *hnd, SaHpiResourceIdT id, SaHpiIdrIdT idrid, SaHpiEntryIdT areaid, SaHpiIdrFieldTypeT fieldtype, SaHpiEntryIdT fieldid, SaHpiEntryIdT *nextfieldid, SaHpiIdrFieldT *field ) { cIpmi *ipmi = 0; cIpmiInventory *inv = VerifyInventoryAndEnter( hnd, id, idrid, ipmi ); if ( !inv ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = inv->GetIdrField( idrid, areaid, fieldtype, fieldid, *nextfieldid, *field ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiAddIdrField( void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrFieldT * ) __attribute__((used)); static SaErrorT IpmiAddIdrField( void *hnd, SaHpiResourceIdT id, SaHpiIdrIdT idrid, SaHpiIdrFieldT *field ) { cIpmi *ipmi = 0; cIpmiInventory *inv = VerifyInventoryAndEnter( hnd, id, idrid, ipmi ); if ( !inv ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = inv->AddIdrField( idrid, *field ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiSetIdrField( void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrFieldT * ) __attribute__((used)); static SaErrorT IpmiSetIdrField( void *hnd, SaHpiResourceIdT id, SaHpiIdrIdT idrid, SaHpiIdrFieldT *field ) { cIpmi *ipmi = 0; cIpmiInventory *inv = VerifyInventoryAndEnter( hnd, id, idrid, ipmi ); if ( !inv ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = inv->SetIdrField( idrid, *field ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiDelIdrField( void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT, SaHpiEntryIdT ) __attribute__((used)); static SaErrorT IpmiDelIdrField( void *hnd, SaHpiResourceIdT id, SaHpiIdrIdT idrid, SaHpiEntryIdT areaid, SaHpiEntryIdT fieldid ) { cIpmi *ipmi = 0; cIpmiInventory *inv = VerifyInventoryAndEnter( hnd, id, idrid, ipmi ); if ( !inv ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = inv->DelIdrField( idrid, areaid, fieldid ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiGetSelInfo( void *, SaHpiResourceIdT, SaHpiEventLogInfoT * ) __attribute__((used)); static SaErrorT IpmiGetSelInfo( void *hnd, SaHpiResourceIdT id, SaHpiEventLogInfoT *info ) { cIpmi *ipmi = 0; cIpmiSel *sel = VerifySelAndEnter( hnd, id, ipmi ); if ( !sel ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = sel->GetSelInfo( *info ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiSetSelTime( void *, SaHpiResourceIdT, SaHpiTimeT ) __attribute__((used)); static SaErrorT IpmiSetSelTime( void *hnd, SaHpiResourceIdT id, SaHpiTimeT t ) { cIpmi *ipmi = 0; cIpmiSel *sel = VerifySelAndEnter( hnd, id, ipmi ); if ( !sel ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = sel->SetSelTime( t ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiAddSelEntry( void *, SaHpiResourceIdT, const SaHpiEventT * ) __attribute__((used)); static SaErrorT IpmiAddSelEntry( void *hnd, SaHpiResourceIdT id, const SaHpiEventT *Event ) { cIpmi *ipmi = 0; cIpmiSel *sel = VerifySelAndEnter( hnd, id, ipmi ); if ( !sel ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = sel->AddSelEntry( *Event ); ipmi->IfLeave(); return rv; } #ifdef NOTUSED static SaErrorT IpmiDelSelEntry( void *, SaHpiResourceIdT, SaHpiEventLogEntryIdT ) __attribute__((used)); static SaErrorT IpmiDelSelEntry( void *hnd, SaHpiResourceIdT id, SaHpiEventLogEntryIdT sid ) { cIpmi *ipmi = 0; cIpmiSel *sel = VerifySelAndEnter( hnd, id, ipmi ); if ( !sel ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = sel->DeleteSelEntry( sid ); ipmi->IfLeave(); return rv; } #endif static SaErrorT IpmiGetSelEntry( void *hnd, SaHpiResourceIdT, SaHpiEventLogEntryIdT, SaHpiEventLogEntryIdT *, SaHpiEventLogEntryIdT *, SaHpiEventLogEntryT *, SaHpiRdrT *, SaHpiRptEntryT * ) __attribute__((used)); static SaErrorT IpmiGetSelEntry( void *hnd, SaHpiResourceIdT id, SaHpiEventLogEntryIdT current, SaHpiEventLogEntryIdT *prev, SaHpiEventLogEntryIdT *next, SaHpiEventLogEntryT *entry, SaHpiRdrT *rdr, SaHpiRptEntryT *rptentry ) { cIpmi *ipmi = 0; cIpmiSel *sel = VerifySelAndEnter( hnd, id, ipmi ); if ( !sel ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = sel->GetSelEntry( current, *prev, *next, *entry, *rdr, *rptentry ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiClearSel( void *, SaHpiResourceIdT ) __attribute__((used)); static SaErrorT IpmiClearSel( void *hnd, SaHpiResourceIdT id ) { cIpmi *ipmi = 0; cIpmiSel *sel = VerifySelAndEnter( hnd, id, ipmi ); if ( !sel ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = sel->ClearSel(); ipmi->IfLeave(); return rv; } static SaErrorT IpmiHotswapPolicyCancel( void *, SaHpiResourceIdT, SaHpiTimeoutT ) __attribute__((used)); static SaErrorT IpmiHotswapPolicyCancel( void *hnd, SaHpiResourceIdT id, SaHpiTimeoutT timeout) { cIpmi *ipmi = 0; cIpmiResource *res = VerifyResourceAndEnter( hnd, id, ipmi ); if ( !res ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = ipmi->IfHotswapPolicyCancel( res, timeout ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiSetAutoInsertTimeout( void *, SaHpiTimeoutT ) __attribute__((used)); static SaErrorT IpmiSetAutoInsertTimeout( void *hnd, SaHpiTimeoutT timeout) { cIpmi *ipmi = VerifyIpmi( hnd ); if ( !ipmi ) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rv = ipmi->IfSetAutoInsertTimeout( timeout ); return rv; } static SaErrorT IpmiGetAutoExtractTimeout( void *, SaHpiResourceIdT, SaHpiTimeoutT * ) __attribute__((used)); static SaErrorT IpmiGetAutoExtractTimeout( void *hnd, SaHpiResourceIdT id, SaHpiTimeoutT *timeout ) { cIpmi *ipmi = 0; cIpmiResource *res = VerifyResourceAndEnter( hnd, id, ipmi ); if ( !res ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = ipmi->IfGetAutoExtractTimeout( res, *timeout ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiSetAutoExtractTimeout( void *, SaHpiResourceIdT, SaHpiTimeoutT ) __attribute__((used)); static SaErrorT IpmiSetAutoExtractTimeout( void *hnd, SaHpiResourceIdT id, SaHpiTimeoutT timeout ) { cIpmi *ipmi = 0; cIpmiResource *res = VerifyResourceAndEnter( hnd, id, ipmi ); if ( !res ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = ipmi->IfSetAutoExtractTimeout( res, timeout ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiGetHotswapState( void *, SaHpiResourceIdT , SaHpiHsStateT * ) __attribute__((used)); static SaErrorT IpmiGetHotswapState( void *hnd, SaHpiResourceIdT id, SaHpiHsStateT *state ) { cIpmi *ipmi = 0; cIpmiResource *res = VerifyResourceAndEnter( hnd, id, ipmi ); if ( !res ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = ipmi->IfGetHotswapState( res, *state ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiSetHotswapState( void *, SaHpiResourceIdT, SaHpiHsStateT ) __attribute__((used)); static SaErrorT IpmiSetHotswapState( void *hnd, SaHpiResourceIdT id, SaHpiHsStateT state ) { cIpmi *ipmi = 0; cIpmiResource *res = VerifyResourceAndEnter( hnd, id, ipmi ); if ( !res ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = ipmi->IfSetHotswapState( res, state ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiRequestHotswapAction( void *, SaHpiResourceIdT, SaHpiHsActionT ) __attribute__((used)); static SaErrorT IpmiRequestHotswapAction( void *hnd, SaHpiResourceIdT id, SaHpiHsActionT act ) { cIpmi *ipmi = 0; cIpmiResource *res = VerifyResourceAndEnter( hnd, id, ipmi ); if ( !res ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = ipmi->IfRequestHotswapAction( res, act ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiGetPowerState( void *, SaHpiResourceIdT, SaHpiPowerStateT * ) __attribute__((used)); static SaErrorT IpmiGetPowerState( void *hnd, SaHpiResourceIdT id, SaHpiPowerStateT *state ) { cIpmi *ipmi = 0; cIpmiResource *res = VerifyResourceAndEnter( hnd, id, ipmi ); if ( !res ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = ipmi->IfGetPowerState( res, *state ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiSetPowerState( void *, SaHpiResourceIdT, SaHpiPowerStateT ) __attribute__((used)); static SaErrorT IpmiSetPowerState( void *hnd, SaHpiResourceIdT id, SaHpiPowerStateT state ) { cIpmi *ipmi = 0; cIpmiResource *res = VerifyResourceAndEnter( hnd, id, ipmi ); if ( !res ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = ipmi->IfSetPowerState( res, state ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiGetIndicatorState( void *, SaHpiResourceIdT, SaHpiHsIndicatorStateT * ) __attribute__((used)); static SaErrorT IpmiGetIndicatorState( void *hnd, SaHpiResourceIdT id, SaHpiHsIndicatorStateT *state ) { cIpmi *ipmi = 0; cIpmiResource *res = VerifyResourceAndEnter( hnd, id, ipmi ); if ( !res ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = ipmi->IfGetIndicatorState( res, *state ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiSetIndicatorState( void *, SaHpiResourceIdT, SaHpiHsIndicatorStateT ) __attribute__((used)); static SaErrorT IpmiSetIndicatorState( void *hnd, SaHpiResourceIdT id, SaHpiHsIndicatorStateT state ) { cIpmi *ipmi = 0; cIpmiResource *res = VerifyResourceAndEnter( hnd, id, ipmi ); if ( !res ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = ipmi->IfSetIndicatorState( res, state ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiControlParm( void *, SaHpiResourceIdT, SaHpiParmActionT ) __attribute__((used)); static SaErrorT IpmiControlParm( void *hnd, SaHpiResourceIdT id, SaHpiParmActionT act ) { cIpmi *ipmi = 0; cIpmiResource *res = VerifyResourceAndEnter( hnd, id, ipmi ); if ( !res ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = ipmi->IfControlParm( res, act ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiGetResetState( void *, SaHpiResourceIdT, SaHpiResetActionT * ) __attribute__((used)); static SaErrorT IpmiGetResetState( void *hnd, SaHpiResourceIdT id, SaHpiResetActionT *act ) { cIpmi *ipmi = 0; cIpmiResource *res = VerifyResourceAndEnter( hnd, id, ipmi ); if ( !res ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = ipmi->IfGetResetState( res, *act ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiSetResetState( void *, SaHpiResourceIdT, SaHpiResetActionT ) __attribute__((used)); static SaErrorT IpmiSetResetState( void *hnd, SaHpiResourceIdT id, SaHpiResetActionT act ) { cIpmi *ipmi = 0; cIpmiResource *res = VerifyResourceAndEnter( hnd, id, ipmi ); if ( !res ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = ipmi->IfSetResetState( res, act ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiGetWatchdogInfo(void *, SaHpiResourceIdT, SaHpiWatchdogNumT, SaHpiWatchdogT *) __attribute__((used)); static SaErrorT IpmiGetWatchdogInfo(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num, SaHpiWatchdogT *watchdog) { cIpmi *ipmi = 0; cIpmiWatchdog *wd = VerifyWatchdogAndEnter( hnd, id, num, ipmi ); if ( !wd ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = wd->GetWatchdogInfo( *watchdog ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiSetWatchdogInfo(void *, SaHpiResourceIdT, SaHpiWatchdogNumT, SaHpiWatchdogT *) __attribute__((used)); static SaErrorT IpmiSetWatchdogInfo(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num, SaHpiWatchdogT *watchdog) { cIpmi *ipmi = 0; cIpmiWatchdog *wd = VerifyWatchdogAndEnter( hnd, id, num, ipmi ); if ( !wd ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = wd->SetWatchdogInfo( *watchdog ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiResetWatchdog(void *, SaHpiResourceIdT, SaHpiWatchdogNumT) __attribute__((used)); static SaErrorT IpmiResetWatchdog(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num) { cIpmi *ipmi = 0; cIpmiWatchdog *wd = VerifyWatchdogAndEnter( hnd, id, num, ipmi ); if ( !wd ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = wd->ResetWatchdog(); ipmi->IfLeave(); return rv; } } // new plugin_loader extern "C" { void * oh_open (GHashTable *, unsigned int, oh_evt_queue *) __attribute__ ((weak, alias("IpmiOpen"))); void * oh_close (void *) __attribute__ ((weak, alias("IpmiClose"))); void * oh_get_event (void *) __attribute__ ((weak, alias("IpmiGetEvent"))); void * oh_discover_resources (void *) __attribute__ ((weak, alias("IpmiDiscoverResources"))); void * oh_set_resource_tag (void *, SaHpiResourceIdT, SaHpiTextBufferT *) __attribute__ ((weak, alias("IpmiSetResourceTag"))); void * oh_set_resource_severity (void *, SaHpiResourceIdT, SaHpiSeverityT) __attribute__ ((weak, alias("IpmiSetResourceSeverity"))); void * oh_get_el_info (void *, SaHpiResourceIdT, SaHpiEventLogInfoT *) __attribute__ ((weak, alias("IpmiGetSelInfo"))); void * oh_set_el_time (void *, SaHpiResourceIdT, const SaHpiEventT *) __attribute__ ((weak, alias("IpmiSetSelTime"))); void * oh_add_el_entry (void *, SaHpiResourceIdT, const SaHpiEventT *) __attribute__ ((weak, alias("IpmiAddSelEntry"))); void * oh_get_el_entry (void *, SaHpiResourceIdT, SaHpiEventLogEntryIdT, SaHpiEventLogEntryIdT *, SaHpiEventLogEntryIdT *, SaHpiEventLogEntryT *, SaHpiRdrT *, SaHpiRptEntryT *) __attribute__ ((weak, alias("IpmiGetSelEntry"))); void * oh_clear_el (void *, SaHpiResourceIdT) __attribute__ ((weak, alias("IpmiClearSel"))); void * oh_get_sensor_reading (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiSensorReadingT *, SaHpiEventStateT *) __attribute__ ((weak, alias("IpmiGetSensorReading"))); void * oh_get_sensor_thresholds (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiSensorThresholdsT *) __attribute__ ((weak, alias("IpmiGetSensorThresholds"))); void * oh_set_sensor_thresholds (void *, SaHpiResourceIdT, SaHpiSensorNumT, const SaHpiSensorThresholdsT *) __attribute__ ((weak, alias("IpmiSetSensorThresholds"))); void * oh_get_sensor_enable (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT *) __attribute__ ((weak, alias("IpmiGetSensorEnable"))); void * oh_set_sensor_enable (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT) __attribute__ ((weak, alias("IpmiSetSensorEnable"))); void * oh_get_sensor_event_enables (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT *) __attribute__ ((weak, alias("IpmiGetSensorEventEnables"))); void * oh_set_sensor_event_enables (void *, SaHpiResourceIdT id, SaHpiSensorNumT, SaHpiBoolT *) __attribute__ ((weak, alias("IpmiSetSensorEventEnables"))); void * oh_get_sensor_event_masks (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiEventStateT *, SaHpiEventStateT *) __attribute__ ((weak, alias("IpmiGetSensorEventMasks"))); void * oh_set_sensor_event_masks (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiSensorEventMaskActionT, SaHpiEventStateT, SaHpiEventStateT) __attribute__ ((weak, alias("IpmiSetSensorEventMasks"))); void * oh_get_control_state (void *, SaHpiResourceIdT, SaHpiCtrlNumT, SaHpiCtrlModeT *, SaHpiCtrlStateT *) __attribute__ ((weak, alias("IpmiGetControlState"))); void * oh_set_control_state (void *, SaHpiResourceIdT,SaHpiCtrlNumT, SaHpiCtrlModeT, SaHpiCtrlStateT *) __attribute__ ((weak, alias("IpmiSetControlState"))); void * oh_get_idr_info (void *hnd, SaHpiResourceIdT, SaHpiIdrIdT,SaHpiIdrInfoT) __attribute__ ((weak, alias("IpmiGetIdrInfo"))); void * oh_get_idr_area_header (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrAreaTypeT, SaHpiEntryIdT, SaHpiEntryIdT, SaHpiIdrAreaHeaderT) __attribute__ ((weak, alias("IpmiGetIdrAreaHeader"))); void * oh_add_idr_area (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrAreaTypeT, SaHpiEntryIdT) __attribute__ ((weak, alias("IpmiAddIdrArea"))); void * oh_del_idr_area (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT) __attribute__ ((weak, alias("IpmiDelIdrArea"))); void * oh_get_idr_field (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT, SaHpiIdrFieldTypeT, SaHpiEntryIdT, SaHpiEntryIdT, SaHpiIdrFieldT) __attribute__ ((weak, alias("IpmiGetIdrField"))); void * oh_add_idr_field (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrFieldT) __attribute__ ((weak, alias("IpmiAddIdrField"))); void * oh_set_idr_field (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrFieldT) __attribute__ ((weak, alias("IpmiSetIdrField"))); void * oh_del_idr_field (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT, SaHpiEntryIdT) __attribute__ ((weak, alias("IpmiDelIdrField"))); void * oh_hotswap_policy_cancel (void *, SaHpiResourceIdT, SaHpiTimeoutT) __attribute__ ((weak, alias("IpmiHotswapPolicyCancel"))); void * oh_set_autoinsert_timeout (void *, SaHpiTimeoutT) __attribute__ ((weak, alias("IpmiSetAutoInsertTimeout"))); void * oh_get_autoextract_timeout (void *, SaHpiResourceIdT, SaHpiTimeoutT *) __attribute__ ((weak, alias("IpmiGetAutoExtractTimeout"))); void * oh_set_autoextract_timeout (void *, SaHpiResourceIdT, SaHpiTimeoutT) __attribute__ ((weak, alias("IpmiSetAutoExtractTimeout"))); void * oh_get_hotswap_state (void *, SaHpiResourceIdT, SaHpiHsStateT *) __attribute__ ((weak, alias("IpmiGetHotswapState"))); void * oh_set_hotswap_state (void *, SaHpiResourceIdT, SaHpiHsStateT) __attribute__ ((weak, alias("IpmiSetHotswapState"))); void * oh_request_hotswap_action (void *, SaHpiResourceIdT, SaHpiHsActionT) __attribute__ ((weak, alias("IpmiRequestHotswapAction"))); void * oh_get_power_state (void *, SaHpiResourceIdT, SaHpiPowerStateT *) __attribute__ ((weak, alias("IpmiGetPowerState"))); void * oh_set_power_state (void *, SaHpiResourceIdT, SaHpiPowerStateT) __attribute__ ((weak, alias("IpmiSetPowerState"))); void * oh_get_indicator_state (void *, SaHpiResourceIdT, SaHpiHsIndicatorStateT *) __attribute__ ((weak, alias("IpmiGetIndicatorState"))); void * oh_set_indicator_state (void *, SaHpiResourceIdT, SaHpiHsIndicatorStateT) __attribute__ ((weak, alias("IpmiSetIndicatorState"))); void * oh_control_parm (void *, SaHpiResourceIdT, SaHpiParmActionT) __attribute__ ((weak, alias("IpmiControlParm"))); void * oh_get_reset_state (void *, SaHpiResourceIdT, SaHpiResetActionT *) __attribute__ ((weak, alias("IpmiGetResetState"))); void * oh_set_reset_state (void *, SaHpiResourceIdT, SaHpiResetActionT) __attribute__ ((weak, alias("IpmiSetResetState"))); void * oh_get_watchdog_info (void *, SaHpiResourceIdT, SaHpiWatchdogNumT, SaHpiWatchdogT *) __attribute__ ((weak, alias("IpmiGetWatchdogInfo"))); void * oh_set_watchdog_info (void *, SaHpiResourceIdT, SaHpiWatchdogNumT, SaHpiWatchdogT *) __attribute__ ((weak, alias("IpmiSetWatchdogInfo"))); void * oh_reset_watchdog (void *, SaHpiResourceIdT , SaHpiWatchdogNumT ) __attribute__ ((weak, alias("IpmiResetWatchdog"))); } static unsigned int GetIntNotNull( GHashTable *handler_config, const char *str, unsigned int def = 0 ) { const char *value = (const char *)g_hash_table_lookup(handler_config, str ); if ( !value ) return def; unsigned int v = strtol( value, 0, 0 ); if ( v == 0 ) return def; return v; } static SaHpiTimeoutT GetTimeout( GHashTable *handler_config, const char *str, SaHpiTimeoutT def ) { const char *value = (const char *)g_hash_table_lookup(handler_config, str ); if ( !value ) return def; int v = strtol( value, 0, 0 ); if ( v == 0 ) return SAHPI_TIMEOUT_IMMEDIATE; if ( v == -1 ) return SAHPI_TIMEOUT_BLOCK; SaHpiTimeoutT timeout = v * 1000000000; return timeout; } cIpmi::cIpmi() : m_magic( dIpmiMagic ), m_handler( 0 ) { } cIpmi::~cIpmi() { } void cIpmi::SetHandler( oh_handler_state *handler ) { m_handler = handler; } // wrapper class move async events to domain class cIpmiConLanDomain : public cIpmiConLan { cIpmiDomain *m_domain; public: cIpmiConLanDomain( cIpmiDomain *domain, unsigned int timeout, int log_level, struct in_addr addr, int port, tIpmiAuthType auth, tIpmiPrivilege priv, char *user, char *passwd ) : cIpmiConLan( timeout, log_level, addr, port, auth, priv, user, passwd ), m_domain( domain ) { } virtual ~cIpmiConLanDomain() { } virtual void HandleAsyncEvent( const cIpmiAddr &addr, const cIpmiMsg &msg ) { m_domain->HandleAsyncEvent( addr, msg ); } }; // wrapper class move async events to domain class cIpmiConSmiDomain : public cIpmiConSmi { cIpmiDomain *m_domain; public: cIpmiConSmiDomain( cIpmiDomain *domain, unsigned int timeout, int log_level, int if_num ) : cIpmiConSmi( timeout, log_level, if_num ), m_domain( domain ) { } virtual ~cIpmiConSmiDomain() { } virtual void HandleAsyncEvent( const cIpmiAddr &addr, const cIpmiMsg &msg ) { m_domain->HandleAsyncEvent( addr, msg ); } }; cIpmiCon * cIpmi::AllocConnection( GHashTable *handler_config ) { // default is 5s for IPMI m_con_ipmi_timeout = GetIntNotNull( handler_config, "IpmiConnectionTimeout", 5000 ); stdlog << "AllocConnection: IPMITimeout " << m_con_ipmi_timeout << " ms.\n"; // default is 1s for ATCA systems m_con_atca_timeout = GetIntNotNull( handler_config, "AtcaConnectionTimeout", 1000 ); stdlog << "AllocConnection: AtcaTimeout " << m_con_atca_timeout << " ms.\n"; unsigned int enable_sel_on_all = GetIntNotNull( handler_config, "EnableSelOnAll", 0 ); if ( enable_sel_on_all == 1 ) { m_enable_sel_on_all = true; stdlog << "AllocConnection: Enable SEL on all MCs.\n"; } else { m_enable_sel_on_all = false; stdlog << "AllocConnection: Enable SEL only on BMC.\n"; } // outstanding messages 0 => read from BMC/ShMc m_max_outstanding = GetIntNotNull( handler_config, "MaxOutstanding", 0 ); if ( m_max_outstanding > 256 ) m_max_outstanding = 256; stdlog << "AllocConnection: Max Outstanding IPMI messages " << m_max_outstanding << ".\n"; unsigned int poll_alive = GetIntNotNull( handler_config, "AtcaPollAliveMCs", 0 ); if ( poll_alive == 1 ) { m_atca_poll_alive_mcs = true; stdlog << "AllocConnection: Poll alive MCs.\n"; } else { m_atca_poll_alive_mcs = false; stdlog << "AllocConnection: Don't poll alive MCs.\n"; } m_own_domain = false; /** This code block has been commented out due to the ** multi-domain changes in the infrastructure. ** (Renier Morales 11/21/06) const char *create_own_domain = (const char *)g_hash_table_lookup(handler_config, "MultipleDomains"); if ((create_own_domain != (char *)NULL) && ((strcmp(create_own_domain, "YES") == 0) || (strcmp(create_own_domain, "yes") == 0))) { int *hid = (int *)g_hash_table_lookup(handler_config, "handler-id"); if (hid) { m_own_domain = true; m_handler_id = *hid; stdlog << "AllocConnection: Multi domain handler " << *hid << "\n"; const char *domain_tag = (const char *)g_hash_table_lookup(handler_config, "DomainTag"); if (domain_tag != NULL) { m_domain_tag.SetAscii(domain_tag, SAHPI_TL_TYPE_TEXT, SAHPI_LANG_ENGLISH); } } }*/ m_insert_timeout = GetTimeout( handler_config, "InsertTimeout", SAHPI_TIMEOUT_IMMEDIATE ); m_extract_timeout = GetTimeout( handler_config, "ExtractTimeout", SAHPI_TIMEOUT_IMMEDIATE ); const char *name = (const char *)g_hash_table_lookup(handler_config, "name"); if ( !name ) { stdlog << "Empty parameter !\n"; return 0; } stdlog << "IpmiAllocConnection: connection name = '" << name << "'.\n"; if ( !strcmp( name, "lan" ) || !strcmp( name, "rmcp" ) ) { const char *addr; struct in_addr lan_addr; int lan_port = dIpmiConLanStdPort; tIpmiAuthType auth = eIpmiAuthTypeNone; tIpmiPrivilege priv = eIpmiPrivilegeAdmin; char user[32] = ""; char passwd[32] = ""; char *value; struct hostent *ent; // Address addr = (const char *)g_hash_table_lookup(handler_config, "addr"); if ( !addr ) { stdlog << "TCP/IP address missing in config file !\n"; return 0; } stdlog << "AllocConnection: addr = '" << addr << "'.\n"; ent = gethostbyname( addr ); if ( !ent ) { stdlog << "Unable to resolve IPMI LAN address: " << addr << " !\n"; return 0; } memcpy( &lan_addr, ent->h_addr_list[0], ent->h_length ); unsigned int a = *(unsigned int *)(void *)ent->h_addr_list[0]; stdlog << "Using host at " << (int)(a & 0xff) << "." << (int)((a >> 8 ) & 0xff) << "." << (int)((a >> 16) & 0xff) << "." << (int)((a >> 24) & 0xff) << ".\n"; // Port lan_port = GetIntNotNull( handler_config, "port", 623 ); stdlog << "AllocConnection: port = " << lan_port << ".\n"; // Authentication type value = (char *)g_hash_table_lookup( handler_config, "auth_type" ); if ( value ) { if ( !strcmp( value, "none" ) ) auth = eIpmiAuthTypeNone; else if ( !strcmp( value, "straight" ) ) auth = eIpmiAuthTypeStraight; else if ( !strcmp( value, "md2" ) ) #ifdef HAVE_OPENSSL_MD2_H auth = eIpmiAuthTypeMd2; #else { stdlog << "MD2 is not supported. Please install SSL and recompile.\n"; return 0; } #endif else if ( !strcmp( value, "md5" ) ) #ifdef HAVE_OPENSSL_MD5_H auth = eIpmiAuthTypeMd5; #else { stdlog << "MD5 is not supported. Please install SSL and recompile.\n"; return 0; } #endif else { stdlog << "Invalid IPMI LAN authentication method '" << value << "' !\n"; return 0; } } stdlog << "AllocConnection: authority: " << value << "(" << auth << ").\n"; // Priviledge value = (char *)g_hash_table_lookup(handler_config, "auth_level" ); if ( value ) { if ( !strcmp( value, "operator" ) ) priv = eIpmiPrivilegeOperator; else if ( !strcmp( value, "admin" ) ) priv = eIpmiPrivilegeAdmin; else { stdlog << "Invalid authentication method '" << value << "' !\n"; stdlog << "Only operator and admin are supported !\n"; return 0; } } stdlog << "AllocConnection: priviledge = " << value << "(" << priv << ").\n"; // User Name value = (char *)g_hash_table_lookup( handler_config, "username" ); if ( value ) strncpy( user, value, 32); stdlog << "AllocConnection: user = " << user << ".\n"; // Password value = (char *)g_hash_table_lookup( handler_config, "password" ); if ( value ) strncpy( passwd, value, 32 ); return new cIpmiConLanDomain( this, m_con_ipmi_timeout, dIpmiConLogAll, lan_addr, lan_port, auth, priv, user, passwd ); } else if ( !strcmp( name, "smi" ) ) { const char *addr = (const char *)g_hash_table_lookup(handler_config, "addr"); int if_num = 0; if ( addr ) if_num = strtol( addr, 0, 10 ); stdlog << "AllocConnection: interface number = " << if_num << ".\n"; return new cIpmiConSmiDomain( this, m_con_ipmi_timeout, dIpmiConLogAll, if_num ); } stdlog << "Unknown connection type: " << name << " !\n"; return 0; } void cIpmi::AddHpiEvent( oh_event *event ) { m_event_lock.Lock(); if ( m_handler ) { event->hid = m_handler->hid; oh_evt_queue_push(m_handler->eventq, event); } m_event_lock.Unlock(); } const cIpmiEntityPath & cIpmi::EntityRoot() { return m_entity_root; } oh_handler_state * cIpmi::GetHandler() { return m_handler; } SaHpiRptEntryT * cIpmi::FindResource( SaHpiResourceIdT rid ) { if ( m_handler ) { return oh_get_resource_by_id( m_handler->rptcache, rid); } else { return 0; } } void cIpmi::IfEnter() { ReadLock(); } void cIpmi::IfLeave() { ReadUnlock(); } bool cIpmi::GetParams( GHashTable *handler_config ) { // get mcs to scan char str[100]; for( unsigned int i = 1; i < 0xf1; i++ ) { snprintf( str, sizeof(str), "MC%02x", i ); char *value = (char *)g_hash_table_lookup( handler_config, str ); if ( value == 0 ) { snprintf( str, sizeof(str), "MC%02X", i ); value = (char *)g_hash_table_lookup( handler_config, str ); } if ( value == 0 ) continue; unsigned int properties = 0; char *tokptr; char *tok = strtok_r( value, " \t\n", &tokptr ); while( tok ) { if ( !strcmp( tok, "initial_discover" ) ) properties |= dIpmiMcThreadInitialDiscover; else if ( !strcmp( tok, "poll_alive" ) ) properties |= dIpmiMcThreadPollAliveMc; else if ( !strcmp(tok, "poll_dead" ) ) properties |= dIpmiMcThreadPollDeadMc; else stdlog << "unknown propertiy for MC " << (unsigned char)i << ": " << tok << " !\n"; tok = strtok_r( 0, " \t\n", &tokptr ); } if ( properties == 0 ) continue; char pp[256] = ""; if ( properties & dIpmiMcThreadInitialDiscover ) strcat( pp, " initial_discover" ); if ( properties & dIpmiMcThreadPollAliveMc ) strcat( pp, " poll_alive" ); if ( properties & dIpmiMcThreadPollDeadMc ) strcat( pp, " poll_dead" ); stdlog << "MC " << (unsigned char)i << " properties: " << pp << ".\n"; NewFruInfo( i, 0, SAHPI_ENT_SYS_MGMNT_MODULE, GetFreeSlotForOther( i ), eIpmiAtcaSiteTypeUnknown, properties ); } return true; } bool cIpmi::IfOpen( GHashTable *handler_config ) { const char *entity_root = (const char *)g_hash_table_lookup( handler_config, "entity_root" ); if ( !entity_root ) { err( "entity_root is missing in config file" ); return false; } if ( !m_entity_root.FromString( entity_root ) ) { err( "cannot decode entity path string" ); return false; } cIpmiCon *con = AllocConnection( handler_config ); if ( !con ) { stdlog << "IPMI cannot alloc connection !\n"; return false; } if ( !GetParams( handler_config ) ) { delete con; return false; } bool rv = con->Open(); if ( rv == false ) { stdlog << "IPMI open connection fails !\n"; delete con; return false; } if ( !Init( con ) ) { IfClose(); return false; } return true; } void cIpmi::IfClose() { Cleanup(); if ( m_con ) { delete m_con; m_con = 0; } } int cIpmi::IfGetEvent( oh_event *event ) { int rv = 0; m_event_lock.Lock(); m_event_lock.Unlock(); return rv; } SaErrorT cIpmi::IfDiscoverResources() { dbg( "ipmidirect discover_resources"); bool loop; do { usleep( 10000 ); m_initial_discover_lock.Lock(); loop = m_initial_discover ? true : false; m_initial_discover_lock.Unlock(); } while( loop ); return SA_OK; } SaErrorT cIpmi::IfSetResourceTag( cIpmiResource *ent, SaHpiTextBufferT *tag ) { // change tag in plugin cache SaHpiRptEntryT *rptentry = oh_get_resource_by_id( ent->Domain()->GetHandler()->rptcache, ent->m_resource_id ); if ( !rptentry ) return SA_ERR_HPI_NOT_PRESENT; memcpy(&rptentry->ResourceTag, tag, sizeof(SaHpiTextBufferT)); oh_add_resource(ent->Domain()->GetHandler()->rptcache, rptentry, ent, 1); return SA_OK; } SaErrorT cIpmi::IfSetResourceSeverity( cIpmiResource *ent, SaHpiSeverityT sev ) { // change severity in plugin cache SaHpiRptEntryT *rptentry = oh_get_resource_by_id( ent->Domain()->GetHandler()->rptcache, ent->m_resource_id ); if ( !rptentry ) return SA_ERR_HPI_NOT_PRESENT; rptentry->ResourceSeverity = sev; oh_add_resource(ent->Domain()->GetHandler()->rptcache, rptentry, ent, 1); return SA_OK; } SaErrorT cIpmi::IfControlParm( cIpmiResource * /*res*/, SaHpiParmActionT act ) { // TODO: implementation switch( act ) { case SAHPI_DEFAULT_PARM: break; case SAHPI_SAVE_PARM: break; case SAHPI_RESTORE_PARM: break; } return SA_OK; } openhpi-3.6.1/plugins/ipmidirect/ipmi_domain.h0000644000175100017510000001356712575647277020465 0ustar mohanmohan/* * * Copyright (c) 2003,2004 by FORCE Computers * Copyright (c) 2005 by ESO Technologies. * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #ifndef dIpmiDomain_h #define dIpmiDomain_h #include #include extern "C" { #include "SaHpi.h" } #include #include #include #ifndef dIpmiCon_h #include "ipmi_con.h" #endif #ifndef dIpmiMc_h #include "ipmi_mc.h" #endif #ifndef dIpmiResource_h #include "ipmi_resource.h" #endif #ifndef dIpmiSensorHotswap_h #include "ipmi_sensor_hotswap.h" #endif #ifndef dIpmiSensorThreshold_h #include "ipmi_sensor_threshold.h" #endif #ifndef dIpmiControl_h #include "ipmi_control.h" #endif #ifndef dIpmiWatchdog_h #include "ipmi_watchdog.h" #endif #ifndef dIpmiDiscover_h #include "ipmi_discover.h" #endif #ifndef dIpmiFruInfo_h #include "ipmi_fru_info.h" #endif // property for site types // found by get address info class cIpmiAtcaSiteProperty { public: unsigned int m_property; int m_max_side_id; unsigned int m_mc_type; // dIpmiMcTypeBitXXX ipmi_discover.cpp }; // Re-query the SEL every 5 seconds by default. #define dIpmiSelQueryInterval 5000 // Default poll interval for MCs #define dIpmiMcPollInterval 1000 class cIpmiDomain : public cIpmiFruInfoContainer { public: unsigned int m_con_ipmi_timeout; unsigned int m_con_atca_timeout; bool m_enable_sel_on_all; unsigned int m_max_outstanding; // 0 => use default bool m_atca_poll_alive_mcs; protected: // ipmi connection cIpmiCon *m_con; SaHpiDomainIdT m_did; cIpmiTextBuffer m_domain_tag; SaHpiTimeoutT m_insert_timeout; SaHpiTimeoutT m_extract_timeout; bool m_own_domain; int m_handler_id; public: SaHpiDomainIdT DomainId() { return m_did; } SaHpiTimeoutT &InsertTimeout() { return m_insert_timeout; } SaHpiTimeoutT &ExtractTimeout() { return m_extract_timeout; } int HandlerId() { return m_handler_id; } bool ConLogLevel( int v ) { return m_con->LogLevel( v ); } // true => TCA bool m_is_tca; public: bool IsTca() { return m_is_tca; } protected: // properties for site types // found by get address info cIpmiAtcaSiteProperty m_atca_site_property[256]; void SetAtcaSiteProperty( tIpmiAtcaSiteType type, unsigned int property, int max_id ) { cIpmiAtcaSiteProperty *p = &m_atca_site_property[type]; p->m_property = property; p->m_max_side_id = max_id; } // The main set of SDRs on a BMC. cIpmiSdrs *m_main_sdrs; // The sensors that came from the main SDR. GList *m_sensors_in_main_sdr; // Major and minor versions of the connection. unsigned int m_major_version; unsigned int m_minor_version; bool m_sdr_repository_support; // A special MC used to represent the system interface. cIpmiMc *m_si_mc; public: cIpmiMc *SiMc() { return m_si_mc; } protected: // global lock for reading/writing: // mcs, entities, sensors, frus, sels cThreadLockRw m_lock; cArray m_mcs; // list of all MCs public: void ReadLock() { m_lock.ReadLock(); } void ReadUnlock() { m_lock.ReadUnlock(); } void WriteLock() { m_lock.WriteLock(); } void WriteUnlock() { m_lock.WriteUnlock(); } bool CheckLock() { return m_lock.CheckLock(); } // lock m_initial_discover cThreadLock m_initial_discover_lock; // > 0 => initial discover in progress int m_initial_discover; protected: // array of mc threads cIpmiMcThread *m_mc_thread[256]; public: int m_num_mc_threads; cThreadLock m_mc_thread_lock; public: // time between mc poll in ms unsigned int m_mc_poll_interval; // time between sel rescan in ms unsigned int m_sel_rescan_interval; bool m_bmc_discovered; SaErrorT CheckTca(); public: void AddMc( cIpmiMc *mc ); bool CleanupMc( cIpmiMc *mc ); public: cIpmiDomain(); virtual ~cIpmiDomain(); bool Init( cIpmiCon *c ); void Cleanup(); cIpmiMc *FindMcByAddr( const cIpmiAddr &addr ); //cIpmiMc *FindOrCreateMcBySlaveAddr( unsigned int slave_addr ); SaErrorT SendCommand( const cIpmiAddr &addr, const cIpmiMsg &msg, cIpmiMsg &rsp_msg, int retries = dIpmiDefaultRetries ); GList *GetSdrSensors( cIpmiMc *mc ); void SetSdrSensors( cIpmiMc *mc, GList *sensors ); cIpmiMc *GetEventRcvr(); // called from cIpmiCon to handle async events void HandleAsyncEvent( const cIpmiAddr &addr, const cIpmiMsg &msg ); // called with a list of events to handle from cIpmiMcThread void HandleEvents( GList *list ); // handle a single event void HandleEvent( cIpmiEvent *event ); cIpmiResource *VerifyResource( cIpmiResource *res ); cIpmiMc *VerifyMc( cIpmiMc *mc ); cIpmiRdr *VerifyRdr( cIpmiRdr *rdr ); cIpmiSensor *VerifySensor( cIpmiSensor *s ); cIpmiControl *VerifyControl( cIpmiControl *c ); cIpmiWatchdog *VerifyWatchdog( cIpmiWatchdog *c ); cIpmiInventory *VerifyInventory( cIpmiInventory *i ); virtual void AddHpiEvent( oh_event *event ) = 0; virtual oh_evt_queue *GetHpiEventList() = 0; virtual const cIpmiEntityPath &EntityRoot() = 0; virtual oh_handler_state *GetHandler() = 0; virtual SaHpiRptEntryT *FindResource( SaHpiResourceIdT id ) = 0; void Dump( cIpmiLog &dump ) const; }; #endif openhpi-3.6.1/plugins/ipmidirect/ipmi_mc_vendor_sun.cpp0000644000175100017510000000467412575647277022411 0ustar mohanmohan/* * Copyright (c) 2009 by Sun Microsystems, Inc. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Chris Rinaldo */ #include #include "ipmi_control_sun_led.h" #include "ipmi_entity.h" #include "ipmi_log.h" #include "ipmi_mc_vendor.h" #include "ipmi_mc_vendor_sun.h" #include "ipmi_resource.h" #include "ipmi_sdr.h" #include "ipmi_text_buffer.h" #include "SaHpi.h" cIpmiMcVendorSunBmc::cIpmiMcVendorSunBmc(unsigned int product_id) : cIpmiMcVendor(0x2a, product_id, "Sun BMC") { } cIpmiMcVendorSunBmc::~cIpmiMcVendorSunBmc() { } bool cIpmiMcVendorSunBmc::InitMc(cIpmiMc *mc, const cIpmiMsg &dvid) { stdlog << "Sun BMC Init[" << mc->ManufacturerId() << "," << mc->ProductId() << "]: addr = " << mc->GetAddress() << "\n"; mc->IsRmsBoard() = true; return true; } bool cIpmiMcVendorSunBmc::CreateControls(cIpmiDomain *dom, cIpmiMc *mc, cIpmiSdrs *sdrs) { cIpmiSdr *sdr; for (unsigned int i = 0; i < sdrs->NumSdrs(); i++) { sdr = sdrs->Sdr(i); if (sdr->m_type != eSdrTypeGenericDeviceLocatorRecord) continue; SaHpiEntityTypeT type = (SaHpiEntityTypeT) sdr->m_data[12]; SaHpiEntityLocationT instance = (SaHpiEntityLocationT) sdr->m_data[13]; SaHpiEntityTypeT parent_type; SaHpiEntityLocationT parent_instance; unsigned int parent_fru_id; parent_fru_id = sdrs->FindParentFru(type, instance, parent_type, parent_instance); cIpmiResource *res = FindResource(dom, mc, parent_fru_id, parent_type, parent_instance, sdrs); uint8_t dev_slave_addr = sdr->m_data[6]; uint8_t dev_access_addr = sdr->m_data[5]; uint8_t oem = sdr->m_data[14]; uint8_t entity_id = sdr->m_data[12]; uint8_t entity_inst = sdr->m_data[13]; cIpmiTextBuffer tb; tb.SetIpmi(sdr->m_data + 15); char id[16]; tb.GetAscii(id, sizeof (id)); cIpmiControlSunLed *led = new cIpmiControlSunLed(mc, i, dev_access_addr, dev_slave_addr, entity_id, entity_inst, oem, SAHPI_FALSE); led->EntityPath() = res->EntityPath(); led->IdString().SetAscii(id, SAHPI_TL_TYPE_TEXT, SAHPI_LANG_ENGLISH); res->AddRdr(led); } return true; } openhpi-3.6.1/plugins/ipmidirect/thread.cpp0000644000175100017510000001210412575647277017764 0ustar mohanmohan/* * thread.cpp * * thread classes * * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include "thread.h" #include #include #include ////////////////////////////////////////////////// // cThread ////////////////////////////////////////////////// static pthread_key_t thread_key; class cThreadMain : public cThread { public: cThreadMain( const pthread_t &thread, bool main_thread, tTheadState state ) : cThread( thread, main_thread, state ) {} protected: virtual void *Run() { return 0; } }; class cInit { public: cInit(); ~cInit(); }; cInit::cInit() { pthread_key_create( &thread_key, 0 ); cThreadMain *thread = new cThreadMain( pthread_self(), true, eTsRun ); pthread_setspecific( thread_key, thread ); } cInit::~cInit() { cThreadMain *thread = (cThreadMain *)pthread_getspecific( thread_key ); if ( thread ) { delete thread; pthread_key_delete( thread_key ); } } static cInit init; cThread::cThread() : m_main( false ), m_state( eTsSuspend ) { } cThread::cThread( const pthread_t &thread, bool main_thread, tTheadState state ) : m_thread( thread ), m_main( main_thread ), m_state( state ) { } cThread::~cThread() { } cThread * cThread::GetThread() { cThread *thread = (cThread *)pthread_getspecific( thread_key ); return thread; } void * cThread::Thread( void *param ) { cThread *thread = (cThread *)param; pthread_setspecific( thread_key, thread ); thread->m_state = eTsRun; void *rv = thread->Run(); thread->m_state = eTsExit; return rv; } bool cThread::Start() { if ( m_state == eTsRun ) { return false; } m_state = eTsSuspend; int rv = pthread_create( &m_thread, 0, Thread, this ); if ( rv ) return false; // wait till the thread is runnung while( m_state == eTsSuspend ) // wait 100 ms usleep( 10000 ); return true; } bool cThread::Wait( void *&rv ) { if ( m_state != eTsRun ) return false; void *rr; int r = pthread_join( m_thread, &rr ); if ( r ) return false; rv = rr; return true; } void cThread::Exit( void *rv ) { m_state = eTsExit; pthread_exit( rv ); } ////////////////////////////////////////////////// // cThreadLock ////////////////////////////////////////////////// #if ( defined(__sun) && defined(__SVR4) ) || defined(__FreeBSD__) cThreadLock::cThreadLock() { pthread_mutexattr_t attr; pthread_mutexattr_init( &attr ); pthread_mutexattr_settype( &attr, PTHREAD_MUTEX_RECURSIVE ); pthread_mutex_init( &m_lock, &attr ); pthread_mutexattr_destroy( &attr ); } #else static pthread_mutex_t lock_tmpl = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP; cThreadLock::cThreadLock() : m_lock( lock_tmpl ) { } #endif cThreadLock::~cThreadLock() { pthread_mutex_destroy( &m_lock ); } void cThreadLock::Lock() { pthread_mutex_lock( &m_lock ); } void cThreadLock::Unlock() { pthread_mutex_unlock( &m_lock ); } bool cThreadLock::TryLock() { return pthread_mutex_trylock( &m_lock ) == 0; } ////////////////////////////////////////////////// // cThreadLockRw ////////////////////////////////////////////////// #if defined(__sun) && defined(__SVR4) cThreadLockRw::cThreadLockRw() { pthread_rwlock_init( &m_rwlock, NULL ); } #else static pthread_rwlock_t rwlock_tmpl = PTHREAD_RWLOCK_INITIALIZER; cThreadLockRw::cThreadLockRw() { m_rwlock = rwlock_tmpl; } #endif cThreadLockRw::~cThreadLockRw() { pthread_rwlock_destroy( &m_rwlock ); } void cThreadLockRw::ReadLock() { pthread_rwlock_rdlock( &m_rwlock ); } void cThreadLockRw::ReadUnlock() { pthread_rwlock_unlock( &m_rwlock ); } bool cThreadLockRw::TryReadLock() { int rv = pthread_rwlock_trywrlock( &m_rwlock ); return rv == 0; } void cThreadLockRw::WriteLock() { pthread_rwlock_wrlock( &m_rwlock ); } void cThreadLockRw::WriteUnlock() { pthread_rwlock_unlock( &m_rwlock ); } bool cThreadLockRw::TryWriteLock() { int rv = pthread_rwlock_trywrlock( &m_rwlock ); return rv == 0; } bool cThreadLockRw::CheckLock() { bool rv = TryWriteLock(); if ( rv ) WriteUnlock(); return rv; } ////////////////////////////////////////////////// // cThreadCond ////////////////////////////////////////////////// #if defined(__sun) && defined(__SVR4) cThreadCond::cThreadCond() { pthread_cond_init( &m_cond, NULL ); } #else static pthread_cond_t cond_tmpl = PTHREAD_COND_INITIALIZER; cThreadCond::cThreadCond() { m_cond = cond_tmpl; } #endif cThreadCond::~cThreadCond() { pthread_cond_destroy( &m_cond ); } void cThreadCond::Signal() { pthread_cond_signal( &m_cond ); } void cThreadCond::Wait() { pthread_cond_wait( &m_cond, &m_lock ); } openhpi-3.6.1/plugins/ipmidirect/ipmi_discover.cpp0000644000175100017510000004726312575647277021367 0ustar mohanmohan/* * ipmi_discover.cpp * * discover MCs * * Copyright (c) 2004 by FORCE Computers. * Copyright (c) 2005 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard * * This file contains: * 1. discover of MCs * 2. periodic polling of MCs * 3. periodic reading SEL * 4. handling of events */ #include "ipmi_domain.h" #include #include class cIpmiMcTask { public: cIpmiMcTask *m_next; tIpmiMcTask m_task; cTime m_timeout; void *m_userdata; cIpmiMcTask( tIpmiMcTask task, const cTime &timeout, void *userdata ) : m_next( 0 ), m_task( task ), m_timeout( timeout ), m_userdata( userdata ) {} }; cIpmiMcThread::cIpmiMcThread( cIpmiDomain *domain, unsigned char addr, unsigned int properties ) : m_domain( domain ), m_addr( addr ), m_chan( 0 ), m_mc( 0 ), m_properties( properties ), m_exit( false ), m_tasks( 0 ), m_sel( 0 ), m_events( 0 ) { } cIpmiMcThread::~cIpmiMcThread() { ClearMcTaskList(); } void cIpmiMcThread::WriteLock() { m_domain->WriteLock(); } void cIpmiMcThread::WriteUnlock() { m_domain->WriteUnlock(); } void cIpmiMcThread::AddMcTask( tIpmiMcTask task, const cTime &timeout, void *userdata ) { cIpmiMcTask *dt = new cIpmiMcTask( task, timeout, userdata ); cIpmiMcTask *prev = 0; cIpmiMcTask *current = m_tasks; // loop to right position while( current && current->m_timeout <= dt->m_timeout ) { prev = current; current = current->m_next; } if ( prev == 0 ) { // insert dt at first position m_tasks = dt; dt->m_next = current; } else { dt->m_next = current; prev->m_next = dt; } } void cIpmiMcThread::AddMcTask( tIpmiMcTask task, unsigned int ms, void *userdata ) { cTime timeout = cTime::Now(); timeout += ms; AddMcTask( task, timeout, userdata ); } bool cIpmiMcThread::RemMcTask( void *userdata ) { bool rv = false; cIpmiMcTask *prev = 0; cIpmiMcTask *current = m_tasks; // loop to right position while( current && current->m_userdata != userdata ) { prev = current; current = current->m_next; } if ( current && current->m_userdata ) { if ( prev == 0 ) m_tasks = current->m_next; else prev->m_next = current->m_next; delete current; rv = true; } else { /* got assert(0) here with this ME event: * ME #17 SPS FW Health FW Health, BMC Comm Error 75 [a0 06 00] * Handle it better instead. */ stdlog << "cIpmiMcThread::RemMcTask current = " << current << ", userdata = " << current->m_userdata << "\n"; rv = false; } return rv; } void cIpmiMcThread::ClearMcTaskList() { while( m_tasks ) { cIpmiMcTask *dt = m_tasks; m_tasks = m_tasks->m_next; delete dt; } } void * cIpmiMcThread::Run() { stdlog << "starting MC thread " << m_addr << ".\n"; m_domain->m_mc_thread_lock.Lock(); m_domain->m_num_mc_threads++; m_domain->m_mc_thread_lock.Unlock(); if ( m_properties & dIpmiMcThreadInitialDiscover ) { if ( m_addr != dIpmiBmcSlaveAddr ) { stdlog << "Waiting for BMC discovery (" << m_addr << ").\n"; while ( m_domain->m_bmc_discovered == false ) { usleep( 100000 ); } stdlog << "BMC Discovery done, let's go (" << m_addr << ").\n"; } else { stdlog << "BMC Discovery Start\n"; } Discover(); m_domain->m_initial_discover_lock.Lock(); m_domain->m_initial_discover--; m_domain->m_initial_discover_lock.Unlock(); // clear initial discover flag m_properties &= ~dIpmiMcThreadInitialDiscover; if ( m_addr == dIpmiBmcSlaveAddr ) { stdlog << "BMC Discovery done\n"; m_domain->m_bmc_discovered = true; } else { stdlog << "BMC Discovery (" << m_addr << ", " << m_chan << ") done\n"; if (m_domain->m_initial_discover == 0) stdlog << "All BMC Discoveries Completed\n"; } } if ( ( m_mc && (m_properties & dIpmiMcThreadPollAliveMc ) ) || ( !m_mc && (m_properties & dIpmiMcThreadPollDeadMc ) ) ) PollAddr( m_mc ); // this is a hack, because // of the usleep calls and polling // of event queue and task list. while( !m_exit ) { // handling all events in the event // in the event queue HandleEvents(); usleep( 100000 ); // check for tasks to do while( m_tasks ) { cTime now = cTime::Now(); if ( now < m_tasks->m_timeout ) break; // timeout cIpmiMcTask *dt = m_tasks; m_tasks = m_tasks->m_next; (this->*dt->m_task)( dt->m_userdata ); delete dt; } } stdlog << "stop MC thread " << m_addr << ".\n"; m_domain->m_mc_thread_lock.Lock(); assert( m_domain->m_num_mc_threads > 0 ); m_domain->m_num_mc_threads--; m_domain->m_mc_thread_lock.Unlock(); return 0; } void cIpmiMcThread::Discover( cIpmiMsg *get_device_id_rsp ) { // if (m_addr == 0x2c) m_chan = 0x06; set channel for Intel ME cIpmiAddr addr( eIpmiAddrTypeIpmb, m_chan, 0, m_addr ); cIpmiMsg gdi_rsp; if ( !get_device_id_rsp ) { // send a get device id cIpmiMsg msg( eIpmiNetfnApp, eIpmiCmdGetDeviceId ); // try sending the command only one time SaErrorT rv = m_domain->SendCommand( addr, msg, gdi_rsp, 1 ); if ( rv != SA_OK || gdi_rsp.m_data[0] != 0 ) return; get_device_id_rsp = &gdi_rsp; } stdlog << "MC at [" << m_addr << "," << m_chan << "] found:\n"; stdlog << "\tdevice id : " << get_device_id_rsp->m_data[1] << "\n"; stdlog << "\tdevice SDR : " << ((get_device_id_rsp->m_data[2] & 0x80) ? "yes" : "no") << "\n"; stdlog << "\tdevice revision : " << (get_device_id_rsp->m_data[2] & 0x0f ) << "\n"; stdlog << "\tdevice available : " << ((get_device_id_rsp->m_data[3] & 0x80) ? "update" : "normal operation" ) << "\n"; stdlog << "\tmajor FW revision : " << (get_device_id_rsp->m_data[3] & 0x7f) << "\n"; stdlog << "\tminor FW revision : " << (int)((get_device_id_rsp->m_data[4] >>4) & 0xf) << (int)(get_device_id_rsp->m_data[4] & 0xf) << "\n"; stdlog << "\tIPMI version : " << (int)(get_device_id_rsp->m_data[5] & 0xf) << "." << ((get_device_id_rsp->m_data[5] >> 4) & 0xf) << "\n"; stdlog << "\tchassis device : " << ((get_device_id_rsp->m_data[6] & 0x80) ? "yes" : "no") << "\n"; stdlog << "\tbridge : " << ((get_device_id_rsp->m_data[6] & 0x40) ? "yes" : "no") << "\n"; stdlog << "\tIPMB event generator : " << ((get_device_id_rsp->m_data[6] & 0x20) ? "yes" : "no") << "\n"; stdlog << "\tIPMB event receiver : " << ((get_device_id_rsp->m_data[6] & 0x10) ? "yes" : "no") << "\n"; stdlog << "\tFRU inventory data : " << ((get_device_id_rsp->m_data[6] & 0x08) ? "yes" : "no") << "\n"; stdlog << "\tSEL device : " << ((get_device_id_rsp->m_data[6] & 0x04) ? "yes" : "no") << "\n"; stdlog << "\tSDR repository device : " << ((get_device_id_rsp->m_data[6] & 0x02) ? "yes" : "no") << "\n"; stdlog << "\tsensor device : " << ((get_device_id_rsp->m_data[6] & 0x01) ? "yes" : "no") << "\n"; unsigned int mid = get_device_id_rsp->m_data[7] | (get_device_id_rsp->m_data[8] << 8) | (get_device_id_rsp->m_data[9] << 16); stdlog.Hex(); stdlog << "\tmanufacturer id : " << mid << "\n"; unsigned int pid = IpmiGetUint16( get_device_id_rsp->m_data + 10 ); stdlog << "\tproduct id : " << pid << "\n"; if ( m_mc ) { // m_mc should be NULL here // Let's clean up this mess stdlog << "m_mc not NULL !\n"; m_mc->Cleanup(); delete m_mc; m_mc = 0; return; } m_mc = new cIpmiMc( m_domain, addr ); int rrv = m_mc->GetDeviceIdDataFromRsp( *get_device_id_rsp ); if ( rrv ) { // If we couldn't handle the device data, just clean // it up stdlog << "couldn't handle the device data !\n"; m_mc->Cleanup(); delete m_mc; m_mc = 0; return; } m_mc->CheckTca(); if ( m_domain->IsTca() ) { // If board is not ATCA, just give up if (!m_mc->IsTcaMc()) { m_mc->Cleanup(); delete m_mc; m_mc = 0; return; } } if (( m_domain->m_enable_sel_on_all == false ) && ( addr.SlaveAddr() != dIpmiBmcSlaveAddr )) { stdlog << "Disabling SEL for MC " << addr.SlaveAddr() << "\n"; m_mc->SetSel(false); } cIpmiMcVendor *mv = cIpmiMcVendorFactory::GetFactory()->Get( mid, pid ); m_mc->SetVendor( mv ); if ( mv->InitMc( m_mc, *get_device_id_rsp ) == false ) { stdlog << "cannot initialize MC: " << (unsigned char)m_mc->GetAddress() << " !\n"; m_mc->Cleanup(); delete m_mc; m_mc = 0; return; } SaErrorT rv = m_mc->HandleNew(); if ( rv != SA_OK ) { stdlog << "ERROR while discover MC " << m_addr << ", giving up !\n"; m_mc->Cleanup(); delete m_mc; m_mc = 0; return; } WriteLock(); m_domain->AddMc( m_mc ); m_mc->Populate(); WriteUnlock(); if ( m_mc->SelDeviceSupport() ) { GList *new_events = m_mc->Sel()->GetEvents(); // We only care for events from the BMC SEL if (( m_addr == dIpmiBmcSlaveAddr ) && ( new_events )) m_domain->HandleEvents( new_events ); } if ( m_mc->SelDeviceSupport() ) { assert( m_sel == 0 ); stdlog << "addr " << m_addr << ": add read sel. cIpmiMcThread::Discover\n"; m_sel = m_mc->Sel(); AddMcTask( &cIpmiMcThread::ReadSel, m_domain->m_sel_rescan_interval, m_sel ); } } void cIpmiMcThread::HandleEvents() { bool loop = true; while( loop ) { cIpmiEvent *event = 0; m_events_lock.Lock(); if ( m_events ) { event = (cIpmiEvent *)m_events->data; m_events = g_list_remove( m_events, event ); } loop = m_events ? true : false; m_events_lock.Unlock(); if ( event ) { HandleEvent( event ); delete event; } } } void cIpmiMcThread::HandleEvent( cIpmiEvent *event ) { // can handle only events for that mc thread // assert( event->m_data[4] == m_addr ); stdlog << "event: "; event->Dump( stdlog, "event" ); if ( event->m_type != 0x02 ) { stdlog << "remove event: unknown event type " << (unsigned char)event->m_type << " !\n"; return; } /* Do not handle every System Event from BIOS on boot, but other * BIOS-generated events should be handled. * For example: offset 0 1 2 3 4 5 6 7 8 10 03 02 7a b9 3b 50 01 00 04 12 83 6f 01 ff ff --BIOS System Event 12 03 02 70 c3 3b 50 33 00 03 0c 02 6f a0 00 21 --ME Memory Event */ if ((event->m_data[4] & 0x01) != 0) /* SlaveAddr 0x01 or 0x33 */ { if (event->m_data[7] == 0x12) /* SensorType == System Event */ { stdlog << "remove event: system software event.\n"; return; } else { m_addr = dIpmiBmcSlaveAddr; /*0x20*/ m_chan = 0; cIpmiAddr addr( eIpmiAddrTypeIpmb, m_chan, 0, m_addr ); m_mc = m_domain->FindMcByAddr( addr ); stdlog << "BIOS event: addr = " << (unsigned char)m_addr << " sa = " << event->m_data[4] << ", mc: " << m_mc << "\n"; } } // reveive an event from an unknown MC // => discover if ( !m_mc ) { assert( m_sel == 0 ); // remove old task if ( ( m_mc && (m_properties & dIpmiMcThreadPollAliveMc ) ) || ( !m_mc && (m_properties & dIpmiMcThreadPollDeadMc ) ) ) { stdlog << "addr " << m_addr << ": rem poll. cIpmiMcThread::HandleEvent\n"; RemMcTask( m_mc ); } Discover(); // add new poll task if ( ( m_mc && (m_properties & dIpmiMcThreadPollAliveMc ) ) || ( !m_mc && (m_properties & dIpmiMcThreadPollDeadMc ) ) ) { stdlog << "addr " << m_addr << ": add poll. cIpmiMcThread::HandleEvent\n"; AddMcTask( &cIpmiMcThread::PollAddr, m_domain->m_mc_poll_interval, m_mc ); } } if ( m_mc == 0 ) { stdlog << "hotswap event without a MC !\n"; return; } cIpmiSensor *sensor = m_mc->FindSensor( (event->m_data[5] & 0x3), event->m_data[8] , event->m_data[4]); if ( sensor == 0 ) { stdlog << "sensor of event not found !\n"; return; } // hotswap event if ( event->m_data[7] == eIpmiSensorTypeAtcaHotSwap ) { cIpmiSensorHotswap *hs = dynamic_cast( sensor ); if ( !hs ) { stdlog << "Not a hotswap sensor !\n"; return; } HandleHotswapEvent( hs, event ); return; } sensor->HandleEvent( event ); } void cIpmiMcThread::HandleHotswapEvent( cIpmiSensorHotswap *sensor, cIpmiEvent *event ) { tIpmiFruState current_state = (tIpmiFruState)(event->m_data[10] & 0x0f); tIpmiFruState prev_state = (tIpmiFruState)(event->m_data[11] & 0x0f); unsigned int fru_id = event->m_data[12] & 0xff; stdlog << "hot swap event at MC " << m_addr << ", sensor " << sensor->Num() << ",FRU " << fru_id << ",M" << (int)prev_state << " -> M" << (int)current_state << ".\n"; if (sensor->Resource()->GetHotswapSensor() != sensor) { stdlog << "WARNING: sensor NOT resource hot swap sensor, discard event\n"; return; } if (sensor->Resource()->FruId() != fru_id) { stdlog << "WARNING: FRU id NOT resource FRU id, discard event\n"; return; } // remove old task if ( ( m_mc && (m_properties & dIpmiMcThreadPollAliveMc ) ) || ( !m_mc && (m_properties & dIpmiMcThreadPollDeadMc ) ) ) { stdlog << "addr " << m_addr << ": rem poll. cIpmiMcThread::HandleHotswapEvent\n"; RemMcTask( m_mc ); } sensor->Resource()->PicmgFruState() = current_state; sensor->HandleEvent( event ); switch (current_state) { case eIpmiFruStateNotInstalled: // We care only if it's the MC itself if ( sensor->Resource()->FruId() == 0 ) { // remove mc WriteLock(); if ( m_mc ) m_domain->CleanupMc( m_mc ); WriteUnlock(); m_mc = 0; } break; case eIpmiFruStateActivationRequest: if (sensor->Resource()->Domain()->InsertTimeout() == SAHPI_TIMEOUT_IMMEDIATE) { sensor->Resource()->Activate(); } else { sensor->Resource()->PolicyCanceled() = false; } break; case eIpmiFruStateDeactivationRequest: if (sensor->Resource()->ExtractTimeout() == SAHPI_TIMEOUT_IMMEDIATE) { sensor->Resource()->Deactivate(); } else { sensor->Resource()->PolicyCanceled() = false; } break; default: break; } if ( m_mc == 0 && m_sel ) { RemMcTask( m_sel ); m_sel = 0; } // add new poll task if ( ( m_mc && (m_properties & dIpmiMcThreadPollAliveMc ) ) || ( !m_mc && (m_properties & dIpmiMcThreadPollDeadMc ) ) ) { stdlog << "addr " << m_addr << ": add poll. cIpmiMcThread::HandleHotswapEvent\n"; AddMcTask( &cIpmiMcThread::PollAddr, m_domain->m_mc_poll_interval, m_mc ); } } void cIpmiMcThread::AddEvent( cIpmiEvent *event ) { m_events_lock.Lock(); m_events = g_list_append( m_events, event ); m_events_lock.Unlock(); } void cIpmiMcThread::PollAddr( void *userdata ) { cIpmiMc *mc = (cIpmiMc *)userdata; if ( m_domain->ConLogLevel( dIpmiConLogCmd ) ) stdlog << "poll MC at [" << m_addr << "," << m_chan << "]\n"; // send a get device id cIpmiAddr addr( eIpmiAddrTypeIpmb, m_chan, 0, m_addr ); cIpmiMsg msg( eIpmiNetfnApp, eIpmiCmdGetDeviceId ); cIpmiMsg rsp; SaErrorT rv = m_domain->SendCommand( addr, msg, rsp, 3 ); if ( rv != SA_OK ) { if ( m_mc ) { stdlog << "communication lost: " << m_addr << " !\n"; if ( m_properties & dIpmiMcThreadCreateM0 ) { cIpmiSensorHotswap *hs = m_mc->FindHotswapSensor(); if ( hs ) { // generate an event hotswap event M0 cIpmiEvent *event = new cIpmiEvent; event->m_mc = m_mc; event->m_data[0] = 0; // timestamp event->m_data[1] = 0; event->m_data[2] = 0; event->m_data[3] = 0; event->m_data[4] = m_mc->GetAddress(); event->m_data[5] = 0; event->m_data[6] = 0x04; // message format event->m_data[7] = hs->SensorType(); event->m_data[8] = hs->Num(); event->m_data[9] = 0; // assertion event->m_data[10] = 0; // M0 event->m_data[11] = hs->Resource()->PicmgFruState() | (7 << 4); // communication lost event->m_data[12] = 0; // this is because HandleHotswapEvent first removes the PollAddr task if ( ( m_mc && (m_properties & dIpmiMcThreadPollAliveMc ) ) || ( !m_mc && (m_properties & dIpmiMcThreadPollDeadMc ) ) ) { stdlog << "addr " << m_addr << ": add poll. cIpmiMcThread::PollAddr\n"; AddMcTask( &cIpmiMcThread::PollAddr, m_domain->m_mc_poll_interval, m_mc ); } HandleHotswapEvent( hs, event ); delete event; return; } } m_domain->CleanupMc( mc ); m_mc = 0; } } else { if ( !mc ) // MC found. Discover( &rsp ); // else if ( m_mc ) // Periodically check the event receiver for existing MCs. // m_mc->CheckEventRcvr(); } if ( m_mc == 0 && m_sel ) { RemMcTask( m_sel ); m_sel = 0; } if ( ( m_mc && (m_properties & dIpmiMcThreadPollAliveMc ) ) || ( !m_mc && (m_properties & dIpmiMcThreadPollDeadMc ) ) ) { if ( m_domain->ConLogLevel( dIpmiConLogCmd ) ) stdlog << "addr " << m_addr << ": add poll. cIpmiMcThread::PollAddr\n"; AddMcTask( &cIpmiMcThread::PollAddr, m_domain->m_mc_poll_interval, m_mc ); } } void cIpmiMcThread::ReadSel( void *userdata ) { cIpmiSel *sel = (cIpmiSel *)userdata; GList *new_events = sel->GetEvents(); if ( m_domain->ConLogLevel( dIpmiConLogCmd ) ) stdlog << "addr " << m_addr << ": add sel reading. cIpmiMcThread::ReadSel\n"; // add myself to task list AddMcTask( &cIpmiMcThread::ReadSel, m_domain->m_sel_rescan_interval, userdata ); // We only care for events from the BMC SEL if (( m_addr == dIpmiBmcSlaveAddr ) && ( new_events )) m_domain->HandleEvents( new_events ); } openhpi-3.6.1/plugins/ipmidirect/ipmi_sel.cpp0000644000175100017510000005120612575647277020324 0ustar mohanmohan/* * ipmi_sel.cpp * * Copyright (c) 2003 by FORCE Computers * Copyright (c) 2005 by ESO Technologies. * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #include #include #include #include "ipmi_cmd.h" #include "ipmi_sel.h" #include "ipmi_mc.h" #include "ipmi_log.h" #include "ipmi_utils.h" #include "ipmi_event.h" #include "ipmi_domain.h" cIpmiSel::cIpmiSel( cIpmiMc *mc, unsigned int lun ) : m_mc( mc ), m_lun( lun ), m_major_version( 0 ), m_minor_version( 0 ), m_entries( 0 ), m_last_addition_timestamp( 0 ), m_last_erase_timestamp( 0 ), m_overflow( false ), m_supports_delete_sel( false ), m_supports_partial_add_sel( false ), m_supports_reserve_sel( false ), m_supports_get_sel_allocation( false ), m_fetched( false ), m_reservation( 0 ), m_sels_changed( false ), m_sel( 0 ), m_sel_num( 0 ), m_async_events( 0 ), m_async_events_num( 0 ) { } cIpmiSel::~cIpmiSel() { m_sel_lock.Lock(); if ( m_sel ) ClearList( m_sel ); if ( m_async_events ) ClearList( m_async_events ); m_sel_lock.Unlock(); } SaErrorT cIpmiSel::ClearSel() { cThreadLockAuto al( m_sel_lock ); SaErrorT rv; // do a reservation only when needed if ( m_supports_reserve_sel && m_reservation == 0 ) { rv = Reserve(); if ( rv != SA_OK ) return rv; } stdlog << "clear SEL.\n"; cIpmiMsg msg( eIpmiNetfnStorage, eIpmiCmdClearSel ); msg.m_data_len = 6; IpmiSetUint16( msg.m_data, m_reservation ); msg.m_data[2] = 'C'; msg.m_data[3] = 'L'; msg.m_data[4] = 'R'; msg.m_data[5] = 0xaa; cIpmiMsg rsp; rv = m_mc->SendCommand( msg, rsp, m_lun ); if ( rv != SA_OK ) return rv; if ( rsp.m_data[0] == 0 ) { m_sel = ClearList( m_sel ); m_sel_num = 0; } return SA_OK; } SaErrorT cIpmiSel::GetInfo() { cIpmiMsg msg( eIpmiNetfnStorage, eIpmiCmdGetSelInfo ); cIpmiMsg rsp; SaErrorT rv; unsigned int add_timestamp; unsigned int erase_timestamp; // Fetch the repository info. rv = m_mc->SendCommand( msg, rsp, m_lun ); if ( rv != SA_OK ) { stdlog << "could not send get sel info: " << rv << " !\n"; return rv; } if ( rsp.m_data[0] != 0 ) { stdlog << "IpmiSelGetInfo: IPMI error from SEL info fetch: " << rsp.m_data[0] << " !\n"; return SA_ERR_HPI_INVALID_PARAMS; } if ( rsp.m_data_len < 15 ) { stdlog << "handle_sel_info: SEL info too short !\n"; return SA_ERR_HPI_INVALID_DATA; } unsigned short num = m_entries; // Pull pertinant info from the response. m_major_version = rsp.m_data[1] & 0xf; m_minor_version = (rsp.m_data[1] >> 4) & 0xf; m_entries = IpmiGetUint16( rsp.m_data + 2 ); m_overflow = (rsp.m_data[14] & 0x80) == 0x80; m_supports_delete_sel = (rsp.m_data[14] & 0x08) == 0x08; m_supports_partial_add_sel = (rsp.m_data[14] & 0x04) == 0x04; m_supports_reserve_sel = (rsp.m_data[14] & 0x02) == 0x02; m_supports_get_sel_allocation = (rsp.m_data[14] & 0x01) == 0x01; add_timestamp = IpmiGetUint32( rsp.m_data + 6 ); erase_timestamp = IpmiGetUint32( rsp.m_data + 10 ); // If the timestamps still match, no need to re-fetch the repository if ( m_fetched && m_entries == num && (add_timestamp == m_last_addition_timestamp ) && (erase_timestamp == m_last_erase_timestamp ) ) { // no need to read sel return -1; } m_last_addition_timestamp = add_timestamp; m_last_erase_timestamp = erase_timestamp; m_sels_changed = true; m_fetched = true; return SA_OK; } SaErrorT cIpmiSel::Reserve() { cIpmiMsg msg( eIpmiNetfnStorage, eIpmiCmdReserveSel ); cIpmiMsg rsp; SaErrorT rv; // Get a reservation. rv = m_mc->SendCommand( msg, rsp, m_lun ); if ( rv != SA_OK ) { stdlog << "cannot send reserve sel: " << rv << " !\n"; return rv; } if ( rsp.m_data[0] != 0 ) { stdlog << "sel_handle_reservation: Failed getting reservation !\n"; return SA_ERR_HPI_INVALID_PARAMS; } if ( rsp.m_data_len < 3 ) { stdlog << "sel_handle_reservation: got invalid reservation length !\n"; return SA_ERR_HPI_INVALID_DATA; } m_reservation = IpmiGetUint16( rsp.m_data + 1 ); return SA_OK; } GList * cIpmiSel::ClearList( GList *list ) { while( list ) { cIpmiEvent *e = (cIpmiEvent *)list->data; list = g_list_remove( list, e ); delete e; } return 0; } int cIpmiSel::ReadSelRecord( cIpmiEvent &event, unsigned int &next_rec_id ) { // read record cIpmiMsg msg( eIpmiNetfnStorage, eIpmiCmdGetSelEntry ); cIpmiMsg rsp; IpmiSetUint16( msg.m_data, m_reservation ); IpmiSetUint16( msg.m_data+2, next_rec_id ); msg.m_data[4] = 0; msg.m_data[5] = 0xff; msg.m_data_len = 6; SaErrorT rv = m_mc->SendCommand( msg, rsp, m_lun ); if ( rv != SA_OK ) { stdlog << "Could not send SEL fetch command: " << rv << " !\n"; return -1; } if ( rsp.m_data[0] == eIpmiCcInvalidReservation ) { stdlog << "SEL reservation lost !\n"; m_reservation = 0; return eIpmiCcInvalidReservation; } if ( rsp.m_data[0] != 0 ) { stdlog << "IPMI error from SEL fetch: " << rsp.m_data[0] << " !\n"; return -1; } next_rec_id = IpmiGetUint16( rsp.m_data + 1 ); event.m_mc = m_mc; event.m_record_id = IpmiGetUint16( rsp.m_data + 3 ); event.m_type = rsp.m_data[5]; memcpy( event.m_data, rsp.m_data + 6, 13 ); return 0; } GList * cIpmiSel::ReadSel( unsigned int &num, bool &uptodate ) { SaErrorT rv = SA_OK; GList *new_events = 0; num = 0; int fetch_retry_count = 0; uptodate = false; while( true ) { if ( fetch_retry_count >= dMaxSelFetchRetries ) { stdlog << "too many lost reservations in SEL fetch !\n"; return 0; } fetch_retry_count++; // get reservation m_reservation = 0; rv = GetInfo(); if ( rv == -1 ) { // no new entries uptodate = true; return 0; } if ( rv != SA_OK || m_entries == 0 ) return 0; if ( m_supports_reserve_sel ) { rv = Reserve(); if ( rv ) continue; } // read records unsigned int next_rec_id = 0; do { cIpmiEvent *event = new cIpmiEvent; rv = ReadSelRecord( *event, next_rec_id ); if ( rv ) { delete event; ClearList( new_events ); new_events = 0; num = 0; if ( rv == eIpmiCcInvalidReservation ) break; return 0; } new_events = g_list_append( new_events, event ); num++; } while( next_rec_id != 0xffff ); if ( next_rec_id == 0xffff ) break; } return new_events; } cIpmiEvent * cIpmiSel::FindEvent( GList *list, unsigned int record_id ) { while( list ) { cIpmiEvent *e = (cIpmiEvent *)list->data; if ( e ->m_record_id == record_id ) return e; list = g_list_next( list ); } return 0; } bool cIpmiSel::CheckEvent( GList *&list, cIpmiEvent *event ) { cIpmiEvent *e = FindEvent( list, event->m_record_id ); if ( !e ) return false; // remove old event from list list = g_list_remove( list, e ); // return true if event is old event bool rv = event->Cmp( *e ) == 0 ? true : false; delete e; return rv; } GList * cIpmiSel::GetEvents() { cThreadLockAuto al( m_sel_lock ); stdlog << "reading SEL.\n"; // read sel bool uptodate = false; unsigned int events_num = 0; GList *events = ReadSel( events_num, uptodate ); if ( uptodate ) { return 0; } // build a list of new events GList *new_events = 0; for( GList *item = events; item; item = g_list_next( item ) ) { cIpmiEvent *current = (cIpmiEvent *)item->data; if ( CheckEvent( m_sel, current ) == false ) { m_async_events_lock.Lock(); bool rv = CheckEvent( m_async_events, current ); m_async_events_lock.Unlock(); if ( rv == false ) { // new event found cIpmiEvent *e = new cIpmiEvent( *current ); new_events = g_list_append( new_events, e ); } } } ClearList( m_sel ); m_sel = events; m_sel_num = events_num; return new_events; } SaErrorT cIpmiSel::GetSelEntry( unsigned short rid, unsigned short &prev, unsigned short &next, cIpmiEvent &event ) { cThreadLockAuto al( m_sel_lock ); // empty sel if ( m_sel == 0 ) { prev = 0; next = 0xffff; return SA_ERR_HPI_NOT_PRESENT; } cIpmiEvent *e = 0; GList *item; GList *i; if ( rid == 0 ) { // first entry e = (cIpmiEvent *)m_sel->data; event = *e; // prev prev = 0; // next item = g_list_next( m_sel ); if ( item ) { e = (cIpmiEvent *)item->data; next = e->m_record_id; } else next = 0xffff; return SA_OK; } if ( rid == 0xffff ) { // last entry item = g_list_last( m_sel ); e = (cIpmiEvent *)item->data; event = *e; // prev item = g_list_previous( item ); if ( item ) { e = (cIpmiEvent *)item->data; prev = e->m_record_id; } else prev = 0; next = 0xffff; return SA_OK; } item = 0; // find rid event for( i = m_sel; i; i = g_list_next( i ) ) { e = (cIpmiEvent *)i->data; if ( e->m_record_id == rid ) { item = i; break; } } if ( item == 0 ) return SA_ERR_HPI_NOT_PRESENT; // event found e = (cIpmiEvent *)item->data; event = *e; // prev i = g_list_previous( item ); if ( i ) { e = (cIpmiEvent *)i->data; prev = e->m_record_id; } else prev = 0; // next i = g_list_next( item ); if ( i ) { e = (cIpmiEvent *)i->data; next = e->m_record_id; } else next = 0xffff; return SA_OK; } SaErrorT cIpmiSel::DeleteSelEntry( SaHpiEventLogEntryIdT sid ) { cThreadLockAuto al( m_sel_lock ); unsigned short rid = (unsigned short)sid; if ( sid == SAHPI_OLDEST_ENTRY ) rid = 0; else if ( sid == SAHPI_NEWEST_ENTRY ) rid = 0xffff; else rid = sid; for( int i = 0; i < dMaxSelFetchRetries; i++ ) { SaErrorT rv = Reserve(); if ( rv != SA_OK ) return rv; cIpmiMsg msg( eIpmiNetfnStorage, eIpmiCmdDeleteSelEntry ); cIpmiMsg rsp; IpmiSetUint16( msg.m_data, m_reservation ); IpmiSetUint16( msg.m_data + 2, rid ); msg.m_data_len = 4; rv = m_mc->SendCommand( msg, rsp ); if ( rv != SA_OK ) { stdlog << "Could not send delete SEL entry: " << rv << " !\n"; return rv; } if ( rsp.m_data[0] != eIpmiCcOk ) { if ( rsp.m_data[0] == eIpmiCcInvalidReservation ) // reservation lost continue; stdlog << "IPMI error from delete SEL entry: " << rsp.m_data[0] << " !\n"; return SA_ERR_HPI_INVALID_CMD; } if ( rsp.m_data_len < 3 ) { stdlog << "IPMI error from delete SEL entry: message to short " << rsp.m_data_len << " !\n"; return SA_ERR_HPI_INVALID_DATA; } // deleted record id rid = IpmiGetUint16( rsp.m_data + 1 ); // remove record from m_sel cIpmiEvent *e = FindEvent( m_sel, rid ); if ( e ) { m_sel = g_list_remove( m_sel, e ); m_sel_num--; } // remove record from async event list m_async_events_lock.Lock(); e = FindEvent( m_async_events, rid ); if ( e ) { m_async_events = g_list_remove( m_async_events, e ); m_async_events_num--; } m_async_events_lock.Unlock(); return SA_OK; } // reservation lost too many times stdlog << "IPMI error from delete SEL entry: reservation lost too many times !\n"; return SA_ERR_HPI_INVALID_CMD; } SaErrorT cIpmiSel::GetSelTime( SaHpiTimeT &ht ) { cIpmiMsg msg( eIpmiNetfnStorage, eIpmiCmdGetSelTime ); cIpmiMsg rsp; SaErrorT rv = m_mc->SendCommand( msg, rsp ); if ( rv != SA_OK ) { stdlog << "Could not send get SEL time: " << rv << " !\n"; return rv; } if ( rsp.m_data[0] != eIpmiCcOk ) { stdlog << "IPMI error from get SEL time: " << rsp.m_data[0] << " !\n"; return SA_ERR_HPI_INVALID_CMD; } if ( rsp.m_data_len < 5 ) { stdlog << "IPMI error from get SEL time: message to short " << rsp.m_data_len << " !\n"; return SA_ERR_HPI_INVALID_DATA; } ht = IpmiGetUint32( rsp.m_data + 1 ); ht *= 1000000000; return SA_OK; } static time_t CovertToAbsTimeT( SaHpiTimeT ti ) { if ( ti <= SAHPI_TIME_MAX_RELATIVE ) { timeval tv; gettimeofday( &tv, 0 ); tv.tv_sec += ti / 1000000000; tv.tv_usec += ti % 1000000000 / 1000; while( tv.tv_usec > 1000000 ) { tv.tv_sec++; tv.tv_usec -= 1000000; } return tv.tv_sec; } return ti / 1000000000; } SaErrorT cIpmiSel::SetSelTime( SaHpiTimeT ht ) { if ( ht == SAHPI_TIME_UNSPECIFIED ) return SA_ERR_HPI_ERROR; // convert HPI time to time_t time_t t = CovertToAbsTimeT( ht ); cIpmiMsg msg( eIpmiNetfnStorage, eIpmiCmdSetSelTime ); cIpmiMsg rsp; IpmiSetUint32( msg.m_data, t ); msg.m_data_len = 4; SaErrorT rv = m_mc->SendCommand( msg, rsp ); if ( rv != SA_OK ) { stdlog << "Could not send set SEL time: " << rv << " !\n"; return rv; } if ( rsp.m_data[0] != eIpmiCcOk ) { stdlog << "IPMI error from set SEL time: " << rsp.m_data[0] << " !\n"; return SA_ERR_HPI_INVALID_CMD; } return SA_OK; } int cIpmiSel::AddAsyncEvent( cIpmiEvent *new_event ) { cIpmiEvent *e = FindEvent( m_sel, new_event->m_record_id ); // event is already in the sel if ( e && new_event->Cmp( *e ) == 0 ) return 0; m_async_events_lock.Lock(); e = FindEvent( m_async_events, new_event->m_record_id ); if ( !e ) { // add new event to list e = new cIpmiEvent; *e = *new_event; m_async_events = g_list_append( m_async_events, e ); m_async_events_num++; m_async_events_lock.Unlock(); return 0; } m_async_events_lock.Unlock(); if ( new_event->Cmp( *e ) == 0 ) // event is already in the list of async events return 0; // overwrite old event *e = *new_event; return 0; } void cIpmiSel::Dump( cIpmiLog &dump, const char *name ) { if ( dump.IsRecursive() ) { // dump events int i = 0; for( GList *list = m_sel; list; list = g_list_next( list ) ) { cIpmiEvent *e = (cIpmiEvent *)list->data; char str[80]; snprintf( str, sizeof(str), "Event%02x_%d", m_mc->GetAddress(), i++ ); e->Dump( dump, str ); } } dump.Begin( "Sel", name ); dump.Entry( "Version" ) << (int)m_major_version << ", " << (int)m_minor_version << ";\n"; dump.Entry( "Overflow" ) << m_overflow << ";\n"; dump.Entry( "SupportsDeleteSel" ) << m_supports_delete_sel << ";\n"; dump.Entry( "SupportsPartialAddSel" ) << m_supports_partial_add_sel << ";\n"; dump.Entry( "SupportsReserveSel" ) << m_supports_reserve_sel << ";\n"; dump.Entry( "SupportsGetSelAllocation" ) << m_supports_get_sel_allocation << ";\n"; // dump events if ( dump.IsRecursive() && m_sel ) { int i = 0; dump.Entry( "Event" ); for( GList *list = m_sel; list; list = g_list_next( list ) ) { if ( i != 0 ) dump << ", "; char str[80]; snprintf( str, sizeof(str), "Event%02x_%d", m_mc->GetAddress(), i++ ); dump << str; } dump << ";\n"; } dump.End(); } SaErrorT cIpmiSel::GetSelInfo( SaHpiEventLogInfoT &info ) { cIpmiMc *mc = Mc(); int lun = Lun(); cIpmiMsg msg( eIpmiNetfnStorage, eIpmiCmdGetSelTime ); cIpmiMsg rsp; SaErrorT rv = mc->SendCommand( msg, rsp, lun ); if ( rv != SA_OK || rsp.m_data[0] != eIpmiCcOk ) return (rv != SA_OK) ? rv : SA_ERR_HPI_INVALID_DATA; Lock(); info.Entries = SelNum(); info.Size = 0xffff; // We don't support adding entries to SEL yet info.UserEventMaxSize = 0; if ( AdditionTimestamp() > EraseTimestamp() ) info.UpdateTimestamp = AdditionTimestamp(); else info.UpdateTimestamp = EraseTimestamp(); info.UpdateTimestamp *= 1000000000; info.CurrentTime = IpmiGetUint32( rsp.m_data + 1 ); info.CurrentTime *= 1000000000; info.Enabled = SAHPI_TRUE; // ????? info.OverflowFlag = Overflow() ? SAHPI_TRUE : SAHPI_FALSE; info.OverflowResetable = SAHPI_FALSE; info.OverflowAction = SAHPI_EL_OVERFLOW_DROP; Unlock(); return SA_OK; } SaErrorT cIpmiSel::AddSelEntry( const SaHpiEventT & /*Event*/ ) { return SA_ERR_HPI_UNSUPPORTED_API; } SaErrorT cIpmiSel::GetSelEntry( SaHpiEventLogEntryIdT current, SaHpiEventLogEntryIdT &prev, SaHpiEventLogEntryIdT &next, SaHpiEventLogEntryT &entry, SaHpiRdrT &rdr, SaHpiRptEntryT &rptentry ) { unsigned short rid = (unsigned short)current; if ( current == SAHPI_OLDEST_ENTRY ) rid = 0; else if ( current == SAHPI_NEWEST_ENTRY ) rid = 0xffff; unsigned short p; unsigned short n; cIpmiEvent e; SaErrorT rv = GetSelEntry( rid, p, n, e ); if ( rv != SA_OK ) return rv; cIpmiMc *mc = 0; cIpmiSensor *sensor = 0; cIpmiAddr addr; addr.m_type = eIpmiAddrTypeIpmb; if ( e.m_data[6] == 0x03 ) addr.m_channel = 0; else addr.m_channel = e.m_data[5] >> 4; addr.m_slave_addr = e.m_data[4]; addr.m_lun = 0; mc = Mc()->Domain()->FindMcByAddr( addr ); if ( mc ) sensor = mc->FindSensor((e.m_data[5] & 0x3), e.m_data[8], e.m_data[4]); prev = p; next = n; if ( prev == 0 ) prev = SAHPI_NO_MORE_ENTRIES; if ( next == 0xffff ) next = SAHPI_NO_MORE_ENTRIES; entry.EntryId = e.m_record_id; entry.Timestamp = IpmiGetUint32( e.m_data ); if ( entry.Timestamp == 0 ) entry.Timestamp = SAHPI_TIME_UNSPECIFIED; else entry.Timestamp *= 1000000000; entry.Event.Timestamp = entry.Timestamp; if ( &rptentry != NULL ) rptentry.ResourceCapabilities = 0; if ( &rdr != NULL ) rdr.RdrType = SAHPI_NO_RECORD; if ( !sensor ) { // this is possible an event of a resource // no longer present. entry.Event.Source = 0; entry.Event.EventType = SAHPI_ET_OEM; entry.Event.Severity = SAHPI_MAJOR; return SA_OK; } if ( &rptentry != NULL ) { SaHpiRptEntryT *selrpt = oh_get_resource_by_id( sensor->Resource()->Domain()->GetHandler()->rptcache, sensor->Resource()->m_resource_id ); if ( selrpt != NULL ) rptentry = *selrpt; } if ( &rdr != NULL ) { SaHpiRdrT *selrdr = oh_get_rdr_by_id( sensor->Resource()->Domain()->GetHandler()->rptcache, sensor->Resource()->m_resource_id, sensor->RecordId() ); if ( selrdr != NULL ) rdr = *selrdr; } rv = sensor->CreateEvent( &e, entry.Event ); if ( rv == SA_ERR_HPI_DUPLICATE ) rv = SA_OK; return rv; } openhpi-3.6.1/plugins/ipmidirect/array.h0000644000175100017510000000776612575647277017322 0ustar mohanmohan/* * * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #ifndef dArray_h #define dArray_h #include template class cArray { T **m_array; int m_num; int m_size; int m_resize; public: cArray( int r = 1 ) : m_array( 0 ), m_num( 0 ), m_size( 0 ), m_resize( r ) { assert( r > 0 ); } cArray( const cArray &array ) : m_array( 0 ), m_num( 0 ), m_size( 0 ), m_resize( array.m_resize ) { } ~cArray() { Clear(); } int Add( T *t ) { if ( m_num == m_size ) { T **newa = new T *[m_size+m_resize]; if ( m_num ) memcpy( newa, m_array, sizeof( T * ) * m_num ); delete[] m_array; m_array = newa; m_size += m_resize; } m_array[m_num++] = t; return m_num-1; } T *Rem( int idx ) { assert( idx >= 0 && idx < m_num ); T *rv = m_array[idx]; m_num--; if ( m_num == 0 ) return rv; int n = m_num/m_resize*m_resize+m_resize-1; if ( m_size > n ) { m_size = n; T **newa = new T *[n]; if ( idx != 0 ) memcpy( newa, m_array, sizeof( T * ) * idx ); if ( idx != m_num ) memcpy( newa+idx, m_array+idx+1, (m_num - idx)*sizeof( T * ) ); delete[] m_array; m_array = newa; return rv; } if ( idx != m_num ) memmove( m_array+idx, m_array+idx+1, (m_num - idx)*sizeof( T * ) ); return rv; } void RemAll() { if ( m_array ) { delete[] m_array; m_num = 0; m_array = 0; m_size = 0; } } T *operator[]( int idx ) const { assert( idx >= 0 && idx < m_num ); return m_array[idx]; } T * & operator[]( int idx ) { assert( idx >= 0 && idx < m_num ); return m_array[idx]; } cArray &operator+=( T *t ) { Add( t ); return *this; } cArray &operator-=( T *t ) { int idx = Find( t ); assert( idx != -1 ); if ( idx != -1 ) Rem( idx ); return *this; } int Num() const { return m_num; } int Find( T *t ) const { for( int i = 0; i < m_num; i++ ) if ( m_array[i] == t ) return i; return -1; } void Sort( int (*cmp)( T **t1, T **t2 ) ) { qsort( m_array, m_num, sizeof( T * ), (int (*)(const void *, const void *) )cmp ); } int Search( T *key, int (*cmp)( T **t1, T **t2 ), int mmax = -1 ) const { int n = m_num; if ( mmax >= 0 && mmax < m_num ) n = mmax; T **e = (T **)bsearch( &key, m_array, n, sizeof( T * ), (int (*)(const void *, const void *) )cmp ); if ( e == 0 ) return -1; int idx = (e - m_array); assert( idx >= 0 && idx < n ); return idx; } void Clear() { if ( m_array ) { for( int i = 0; i < m_num; i++ ) delete m_array[i]; delete[] m_array; m_num = 0; m_array = 0; m_size = 0; } } int Insert( int befor, T *t ) { assert( befor <= m_num ); if ( befor == -1 || befor == m_num ) return Add( t ); if ( m_num == m_size ) { T **newa = new T *[m_size+m_resize]; if ( m_num ) memcpy( newa, m_array, sizeof( T * ) * m_num ); delete[] m_array; m_array = newa; m_size += m_resize; } for( int i = m_num-1; i >= befor; i-- ) m_array[i+1] = m_array[i]; m_num++; m_array[befor] = t; return befor; } cArray &operator=( const cArray & /*array*/ ) { // this is not a real copy operator ! Clear(); return *this; } }; #endif openhpi-3.6.1/plugins/ipmidirect/ipmi_auth.h0000644000175100017510000000741612575647277020153 0ustar mohanmohan/* * Copyright (c) 2003,2004 by FORCE Computers * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #ifndef dIpmiAuth_h #define dIpmiAuth_h #include "config.h" /* Data is provided to the authorization code as an array of these items, a "scatter-gather" list. The algorithm will go through the item in the array until "data" is NULL. */ class cIpmiAuthSg { public: void *data; /* NULL to terminate. */ int len; }; class cIpmiAuth { public: virtual ~cIpmiAuth() {}; /* Initialize the authorization engine and return a handle for it. You must pass this handle into the other authorization calls. Return 0 on success or an errno on failure. */ virtual int Init( const unsigned char *password ) = 0; /* Generate a 16-byte authorization code and put it into "output". Returns 0 on success and an errno on failure. */ virtual int Gen( cIpmiAuthSg data[], void *output ) = 0; /* Check that the 16-byte authorization code given in "code" is valid. This will return 0 if it is valid or EINVAL if not. */ virtual int Check( cIpmiAuthSg data[], void *code ) = 0; }; // maximum number of charaters for username #define dIpmiUsernameMax 16 #define dIpmiPasswordMax 16 // Standard IPMI authentication algorithms. enum tIpmiAuthType { eIpmiAuthTypeNone = 0, eIpmiAuthTypeMd2 = 1, eIpmiAuthTypeMd5 = 2, eIpmiAuthTypeStraight = 4, eIpmiAuthTypeOem = 5, }; cIpmiAuth *IpmiAuthFactory( tIpmiAuthType type ); // This is a table of authentication algorithms. #define dMaxIpmiAuths 6 // IPMI privilege levels enum tIpmiPrivilege { eIpmiPrivilegeNone = 0, eIpmiPrivilegeCallback = 1, eIpmiPrivilegeUser = 2, eIpmiPrivilegeOperator = 3, eIpmiPrivilegeAdmin = 4, eIpmiPrivilegeOem = 5 }; // Tell if a specific command is permitted for the given priviledge // level. Returns one of the following. enum tIpmiPriv { eIpmiPrivInvalid = -1, eIpmiPrivDenied = 0, eIpmiPrivPermitted = 1, eIpmiPrivSend = 2, // Special send message handling needed. eIpmiPrivBoot = 3, // Special set system boot options handling. }; class cIpmiAuthNone : public cIpmiAuth { unsigned char data[16]; public: virtual int Init( const unsigned char *password ); virtual int Gen( cIpmiAuthSg data[], void *output ); virtual int Check( cIpmiAuthSg data[], void *code ); }; #ifdef HAVE_OPENSSL_MD2_H class cIpmiAuthMd2 : public cIpmiAuth { unsigned char data[16]; public: virtual int Init( const unsigned char *password ); virtual int Gen( cIpmiAuthSg data[], void *output ); virtual int Check( cIpmiAuthSg data[], void *code ); }; #endif #ifdef HAVE_OPENSSL_MD5_H class cIpmiAuthMd5 : public cIpmiAuth { unsigned char data[16]; public: virtual int Init( const unsigned char *password ); virtual int Gen( cIpmiAuthSg data[], void *output ); virtual int Check( cIpmiAuthSg data[], void *code ); }; #endif class cIpmiAuthStraight : public cIpmiAuth { unsigned char data[16]; public: virtual int Init( const unsigned char *password ); virtual int Gen( cIpmiAuthSg data[], void *output ); virtual int Check( cIpmiAuthSg data[], void *code ); }; #endif openhpi-3.6.1/plugins/ipmidirect/ipmi_entity.cpp0000644000175100017510000001230212575647277021047 0ustar mohanmohan/* * ipmi_entity.cpp * * Copyright (c) 2003,2004 by FORCE Computers * Copyright (c) 2005 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #include #include #include #include #include #include "ipmi_entity.h" #include "ipmi_log.h" #include static const char *entity_id_types[] = { "Unspecified", "Other", "Unknown", "Processor", "Disk", "Peripheral", "SystemManagementModule", "SystemBoard", "MemoryModule", "ProcessorModule", "PowerSupply", "AddInCard", "FrontPanelBoard", "BackPanelBoard", "PowerSystemBoard", "DriveBackplane", "SystemInternalExpansionBoard", "OtherSystemBoard", "ProcessorBoard", "PowerUnit", "PowerModule", "PowerManagementBoard", "ChassisBackPanelBoard", "SystemChassis", "SubChassis", "OtherChassisBoard", "DiskDriveBay", "PeripheralBay", "DeviceBay", "FanCooling", "CoolingUnit", "CableInterconnect", "MemoryDevice", "SystemManagementSoftware", "Bios", "OperatingSystem", "SystemBus", "Group", "RemoteMgmtCommDevice", "ExternalEnvironment", "Battery", "ProcessingBlade", "ConnectivitySwitch", "ProcessorMemoryModule", "IoModule", "ProcessorIoModule", "ManagementControllerFirmware", }; #define dNumEntityIdTypes (sizeof(entity_id_types)/sizeof(char *)) const char * IpmiEntityIdToString( tIpmiEntityId val ) { if ( (unsigned int)val < dNumEntityIdTypes ) return entity_id_types[val]; switch( val ) { case eIpmiEntityIdPicMgFrontBoard: return "PicmgFrontBoard"; case eIpmiEntityIdPicMgRearTransitionModule: return "PicmgRearTransitionModule"; case eIpmiEntityIdPicMgAdvancedMcModule: return "PicMgAdvancedMcModule"; case eIpmiEntityIdPicMgMicroTcaCarrierHub: return "PicMgMicroTcaCarrierHub"; case eIpmiEntityIdPicmgShelfManager: return "PicmgShelfManager"; case eIpmiEntityIdPicmgFiltrationUnit: return "PicmgFiltrationUnit"; case eIpmiEntityIdPicmgShelfFruInformation: return "PicmgShelfFruInformation"; case eIpmiEntityIdPicmgAlarmPanel: return "PicmgAlarmPanel"; default: break; } return "Invalid"; } cIpmiEntityPath::cIpmiEntityPath() { memset( &m_entity_path, 0, sizeof( SaHpiEntityPathT ) ); } cIpmiEntityPath::cIpmiEntityPath( const SaHpiEntityPathT &entity_path ) { m_entity_path = entity_path; } void cIpmiEntityPath::SetEntry( int idx, SaHpiEntityTypeT type, SaHpiEntityLocationT instance ) { assert( idx >= 0 && idx < SAHPI_MAX_ENTITY_PATH ); m_entity_path.Entry[idx].EntityType = type; m_entity_path.Entry[idx].EntityLocation = instance; } SaHpiEntityTypeT cIpmiEntityPath::GetEntryType( int idx ) { assert( idx >= 0 && idx < SAHPI_MAX_ENTITY_PATH ); return m_entity_path.Entry[idx].EntityType; } void cIpmiEntityPath::SetEntryType( int idx, SaHpiEntityTypeT type ) { assert( idx >= 0 && idx < SAHPI_MAX_ENTITY_PATH ); m_entity_path.Entry[idx].EntityType = type; } SaHpiEntityLocationT cIpmiEntityPath::GetEntryInstance( int idx ) { assert( idx >= 0 && idx < SAHPI_MAX_ENTITY_PATH ); return m_entity_path.Entry[idx].EntityLocation; } void cIpmiEntityPath::SetEntryInstance( int idx, SaHpiEntityLocationT instance ) { assert( idx >= 0 && idx < SAHPI_MAX_ENTITY_PATH ); m_entity_path.Entry[idx].EntityLocation = instance; } cIpmiEntityPath & cIpmiEntityPath::operator+=( const cIpmiEntityPath &epath ) { oh_concat_ep( &m_entity_path, &epath.m_entity_path ); return *this; } bool cIpmiEntityPath::operator==( const cIpmiEntityPath &epath ) const { SaHpiBoolT cmp_result; cmp_result = oh_cmp_ep( &m_entity_path, &epath.m_entity_path ); if ( cmp_result == SAHPI_TRUE ) return true; else return false; } bool cIpmiEntityPath::operator!=( const cIpmiEntityPath &epath ) const { SaHpiBoolT cmp_result; cmp_result = oh_cmp_ep( &m_entity_path, &epath.m_entity_path ); if ( cmp_result == SAHPI_TRUE ) return false; else return true; } void cIpmiEntityPath::AppendRoot( int idx ) { assert( idx >= 0 && idx < SAHPI_MAX_ENTITY_PATH ); m_entity_path.Entry[idx].EntityType = SAHPI_ENT_ROOT; m_entity_path.Entry[idx].EntityLocation = 0; } cIpmiLog & operator<<( cIpmiLog &log, const cIpmiEntityPath &epath ) { oh_big_textbuffer path_text; char str[OH_MAX_TEXT_BUFFER_LENGTH+1]; oh_decode_entitypath( &epath.m_entity_path, &path_text ); memcpy( str, path_text.Data, path_text.DataLength ); str[path_text.DataLength] = 0; log << str; return log; } bool cIpmiEntityPath::FromString( const char *str ) { return oh_encode_entitypath( str, &m_entity_path ) ? false : true; } openhpi-3.6.1/plugins/ipmidirect/ipmi_text_buffer.cpp0000644000175100017510000003064212575647277022057 0ustar mohanmohan/* * ipmi_text_buffer.cpp * * Copyright (c) 2003,2004 by FORCE Computers * Copyright (c) 2005 by ESO Technologies. * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard * Fix: * 10/03/04 2963277 Comparison of text buffer data field */ #include #include "ipmi_text_buffer.h" cIpmiTextBuffer::cIpmiTextBuffer() { Clear(); } cIpmiTextBuffer::cIpmiTextBuffer( const char *string, SaHpiTextTypeT type, SaHpiLanguageT l ) { m_buffer.DataType = type; m_buffer.Language = l; SetAscii( string, type, l ); } cIpmiTextBuffer::cIpmiTextBuffer( const unsigned char *data, SaHpiLanguageT l ) { SetIpmi( data, false, l ); } cIpmiTextBuffer::cIpmiTextBuffer( const SaHpiTextBufferT &buf ) { m_buffer = buf; } void cIpmiTextBuffer::Clear() { m_buffer.DataType = SAHPI_TL_TYPE_TEXT; m_buffer.Language = SAHPI_LANG_ENGLISH; m_buffer.DataLength = 0; memset( m_buffer.Data, 0, SAHPI_MAX_TEXT_BUFFER_LENGTH ); } const unsigned char * cIpmiTextBuffer::SetIpmi( const unsigned char *data, bool is_fru, SaHpiLanguageT l ) { Clear(); m_buffer.Language = l; if ( *data == 0xc1 ) return 0; // end mark m_buffer.DataType = (SaHpiTextTypeT)((*data >> 6) & 3); if (( is_fru == true ) && ( m_buffer.DataType == SAHPI_TL_TYPE_UNICODE )) { m_buffer.DataType = SAHPI_TL_TYPE_BINARY; } m_buffer.DataLength = *data & 0x3f; data++; memcpy( m_buffer.Data, data, m_buffer.DataLength ); data += m_buffer.DataLength; if (( m_buffer.DataType == SAHPI_TL_TYPE_BCDPLUS ) || ( m_buffer.DataType == SAHPI_TL_TYPE_ASCII6 )) { char tmpstr[SAHPI_MAX_TEXT_BUFFER_LENGTH]; int len; len = GetAscii( tmpstr, sizeof (tmpstr) ); if ( len == -1 ) return 0; m_buffer.DataLength = len; memcpy( m_buffer.Data, tmpstr, m_buffer.DataLength ); } return data; } // Element will be zero if not present, n-1 if present. static SaHpiUint8T table_4_bit[256] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0c, 0x0d, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; int cIpmiTextBuffer::AsciiToBcdPlus( const char *s ) { m_buffer.DataType = SAHPI_TL_TYPE_BCDPLUS; m_buffer.DataLength = 0; SaHpiUint8T *p = m_buffer.Data; int bit = 0; while( *s ) { if ( m_buffer.DataLength == SAHPI_MAX_TEXT_BUFFER_LENGTH ) break; switch( bit ) { case 0: m_buffer.DataLength++; *p = table_4_bit[(unsigned int)*s]; bit = 4; break; case 4: *p |= table_4_bit[(unsigned int)*s++] << 4; p++; bit = 0; break; } } return m_buffer.DataLength; } // Element will be zero if not present, n-1 if present. static SaHpiUint8T table_6_bit[256] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x21, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x00, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; //////// // 0 1 2 3 // 0123456789012345678901234567890 // 000000111111222222333333444444 int cIpmiTextBuffer::AsciiToAscii6( const char *s ) { m_buffer.DataType = SAHPI_TL_TYPE_ASCII6; m_buffer.DataLength = 0; SaHpiUint8T *p = m_buffer.Data; int bit = 0; while( *s ) { if ( m_buffer.DataLength == SAHPI_MAX_TEXT_BUFFER_LENGTH ) break; switch( bit ) { case 0: *p = table_6_bit[(unsigned int)*s++]; m_buffer.DataLength++; bit = 6; break; case 2: *p |= (table_6_bit[(unsigned int)*s] << 2); bit = 0; break; case 4: *p |= table_4_bit[(unsigned int)*s] << 4; p++; *p = (table_4_bit[(unsigned int)*s++] >> 4) & 0x3; m_buffer.DataLength++; bit = 2; break; case 6: *p |= table_4_bit[(unsigned int)*s] << 6; p++; *p = (table_4_bit[(unsigned int)*s++] >> 2) & 0xf; m_buffer.DataLength++; bit = 4; break; } } return m_buffer.DataLength; } int cIpmiTextBuffer::AsciiToLanguage( const char *s ) { m_buffer.DataType = SAHPI_TL_TYPE_TEXT; int l = strlen( s ); if ( l > SAHPI_MAX_TEXT_BUFFER_LENGTH ) l = SAHPI_MAX_TEXT_BUFFER_LENGTH; m_buffer.DataLength = l; strncpy( ( char *)m_buffer.Data, s, SAHPI_MAX_TEXT_BUFFER_LENGTH ); return l; } bool cIpmiTextBuffer::SetAscii( const char *string, SaHpiTextTypeT type, SaHpiLanguageT l ) { m_buffer.Language = l; switch( type ) { case SAHPI_TL_TYPE_BCDPLUS: AsciiToBcdPlus( string ); return true; case SAHPI_TL_TYPE_ASCII6: AsciiToAscii6( string ); return true; case SAHPI_TL_TYPE_TEXT: AsciiToLanguage( string ); return true; default: break; } return false; } SaHpiTextTypeT cIpmiTextBuffer::CheckAscii( const char *s ) { SaHpiTextTypeT type = SAHPI_TL_TYPE_BCDPLUS; while( *s ) { if ( type == SAHPI_TL_TYPE_BCDPLUS && table_4_bit[(int)*s] == 0 ) type = SAHPI_TL_TYPE_ASCII6; if ( type == SAHPI_TL_TYPE_ASCII6 && table_6_bit[(int) *s] == 0 ) { type = SAHPI_TL_TYPE_TEXT; break; } } return type; } int cIpmiTextBuffer::BinaryToAscii( char *buffer, unsigned int len ) const { unsigned int l = m_buffer.DataLength; if ( l >= len ) l = len - 1; memcpy( buffer, m_buffer.Data, l ); buffer[l] = 0; return len; } int cIpmiTextBuffer::BcdPlusToAscii( char *buffer, unsigned int len ) const { static char table[] = "0123456789 -.:,_"; unsigned int real_length = 2 * m_buffer.DataLength; if ( len > real_length ) len = real_length; bool first = true; const unsigned char *d = m_buffer.Data; for( unsigned int i = 0; i < len; i++ ) { int val = 0; if ( first ) val = *d & 0xf; else val = (*d++ >> 4) & 0xf; first = !first; *buffer++ = table[val]; } *buffer = 0; return len; } int cIpmiTextBuffer::Ascii6ToAscii( char *buffer, unsigned int len ) const { static char table[64] = { ' ', '!', '"', '#', '$', '%', '&', '\'', '(', ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', '&', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[', '\\', ']', '^', '_' }; unsigned int real_length = (m_buffer.DataLength * 8) / 6; if ( len >= real_length ) len = real_length; const unsigned char *d = m_buffer.Data; int bo = 0; for( unsigned int i =0; i < len; i++ ) { int val = 0; switch( bo ) { case 0: val = *d & 0x3f; bo = 6; break; case 2: val = (*d >> 2) & 0x3f; d++; bo = 0; break; case 4: val = (*d >> 4) & 0xf; d++; val |= (*d & 0x3) << 4; bo = 2; break; case 6: val = (*d >> 6) & 0x3; d++; val |= (*d & 0xf) << 2; bo = 4; break; } *buffer++ = table[val]; } *buffer = 0; return len; } int cIpmiTextBuffer::LanguageToAscii( char *buffer, unsigned int len ) const { if ( m_buffer.Language == SAHPI_LANG_ENGLISH ) return BinaryToAscii( buffer, len ); // unicode not supported return -1; } int cIpmiTextBuffer::GetAscii( char *buffer, unsigned int len ) const { switch( m_buffer.DataType ) { case SAHPI_TL_TYPE_BINARY: return BinaryToAscii( buffer, len ); case SAHPI_TL_TYPE_BCDPLUS: return BcdPlusToAscii( buffer, len ); case SAHPI_TL_TYPE_ASCII6: return Ascii6ToAscii( buffer, len ); case SAHPI_TL_TYPE_TEXT: return LanguageToAscii( buffer, len ); default: return -1; } } bool cIpmiTextBuffer::operator==( const cIpmiTextBuffer &tb ) const { if ( m_buffer.DataType != tb.m_buffer.DataType ) return false; if ( m_buffer.Language != tb.m_buffer.Language ) return false; if ( m_buffer.DataLength != tb.m_buffer.DataLength ) return false; if ( m_buffer.DataLength ) return memcmp( m_buffer.Data, tb.m_buffer.Data, tb.m_buffer.DataLength ) == 0; return true; } bool cIpmiTextBuffer::operator!=( const cIpmiTextBuffer &tb ) const { return !operator==( tb ); } cIpmiLog & operator<<( cIpmiLog &dump, const cIpmiTextBuffer &tb ) { char str[2*SAHPI_MAX_TEXT_BUFFER_LENGTH+1] = ""; tb.GetAscii( str, 2*SAHPI_MAX_TEXT_BUFFER_LENGTH+1 ); dump << str; return dump; } openhpi-3.6.1/plugins/ipmidirect/ipmi_inventory_parser.cpp0000644000175100017510000005255112575647277023156 0ustar mohanmohan/* * ipmi_inventory_parser.cpp * * Copyright (c) 2004 by FORCE Computers * Copyright (c) 2005 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #include "ipmi_inventory_parser.h" #include "ipmi_utils.h" #include #include #include #include "ipmi.h" unsigned char IpmiChecksum( const unsigned char *data, int size ) { unsigned char c = 0; while( size-- ) c += *data++; return c; } unsigned char IpmiChecksumMulti( const unsigned char *data, int size, unsigned char csum ) { unsigned char c = 0; while( size-- ) c += *data++; c += csum; return c; } static const char *inventory_record_type_map[] = { "Internal", "Chassis", "Board", "Product", "MultiRecord" }; const char * IpmiInventoryRecordTypeToString( tIpmiInventoryRecordType type ) { if ( type >= eIpmiInventoryRecordTypeLast ) return "Invalid"; return inventory_record_type_map[type]; } //////////////////////////////////////////////////////////// // cIpmiInventoryField //////////////////////////////////////////////////////////// cIpmiInventoryField::cIpmiInventoryField(SaHpiEntryIdT area_id, SaHpiEntryIdT field_id, SaHpiIdrFieldTypeT field_type) { m_idr_field.AreaId = area_id; m_idr_field.FieldId = field_id; m_idr_field.Type = field_type; m_idr_field.ReadOnly = SAHPI_TRUE; } cIpmiInventoryField::~cIpmiInventoryField() { } SaErrorT cIpmiInventoryField::ReadTextBuffer( const unsigned char *&data, unsigned int &size ) { if ( size < 1 ) return SA_ERR_HPI_INVALID_DATA; const unsigned char *d = m_ipmi_text_buffer.SetIpmi( data, true ); if ( d == 0 ) return SA_ERR_HPI_INVALID_DATA; m_idr_field.Field = m_ipmi_text_buffer; size -= d - data; data = d; return SA_OK; } void cIpmiInventoryField::SetAscii( char *str, int size ) { m_idr_field.Field.DataType = SAHPI_TL_TYPE_TEXT; m_idr_field.Field.Language = SAHPI_LANG_ENGLISH; m_idr_field.Field.DataLength = size; memcpy( m_idr_field.Field.Data, str, size ); } void cIpmiInventoryField::SetBinary( const unsigned char *data, unsigned int size ) { m_idr_field.Field.DataType = SAHPI_TL_TYPE_BINARY; m_idr_field.Field.Language = SAHPI_LANG_UNDEF; m_idr_field.Field.DataLength = size; memcpy( m_idr_field.Field.Data, data, size ); } //////////////////////////////////////////////////////////// // cIpmiInventoryAreaInternal //////////////////////////////////////////////////////////// cIpmiInventoryAreaInternal::cIpmiInventoryAreaInternal(SaHpiEntryIdT area_id) : cIpmiInventoryArea(area_id) { m_area_header.Type = SAHPI_IDR_AREATYPE_INTERNAL_USE; } cIpmiInventoryAreaInternal::~cIpmiInventoryAreaInternal() { } SaErrorT cIpmiInventoryAreaInternal::ParseFruArea( const unsigned char *data, unsigned int size ) { return SA_ERR_HPI_INVALID_DATA; } //////////////////////////////////////////////////////////// // cIpmiInventoryAreaMultiRecord //////////////////////////////////////////////////////////// cIpmiInventoryAreaMultiRecord::cIpmiInventoryAreaMultiRecord(SaHpiEntryIdT area_id) : cIpmiInventoryArea(area_id) { m_area_header.Type = SAHPI_IDR_AREATYPE_OEM; } cIpmiInventoryAreaMultiRecord::~cIpmiInventoryAreaMultiRecord() { } SaErrorT cIpmiInventoryAreaMultiRecord::ParseFruArea( const unsigned char *data, unsigned int size ) { cIpmiInventoryField *iif; unsigned int record_size; bool end_of_list = false; unsigned char record_type; unsigned char record_csum; do { if ( size < 5 ) return SA_ERR_HPI_INVALID_DATA; if ( IpmiChecksum(data, 5 )) { stdlog << "wrong Multirecord header area checksum !\n"; return SA_ERR_HPI_INVALID_DATA; } record_size = *(data+2); end_of_list = *(data+1) & 0x80; record_type = *data; record_csum = *(data+3); stdlog << "Multirecord type " << record_type << " size " << record_size << " EOL " << end_of_list << "\n"; data += 5; size -= 5; if ( record_size > size ) { stdlog << "wrong Multirecord area checksum !\n"; return SA_ERR_HPI_INVALID_DATA; } if ( IpmiChecksumMulti( data, record_size, record_csum ) ) { stdlog << "wrong Multirecord area checksum !\n"; return SA_ERR_HPI_INVALID_DATA; } if ( record_type >= eIpmiInventoryMultiRecordTypeOemFirst ) { iif = new cIpmiInventoryField( m_area_header.AreaId, m_field_id++, SAHPI_IDR_FIELDTYPE_CUSTOM); m_field_array.Add( iif ); iif->SetBinary( data, record_size ); } data += record_size; size -= record_size; } while (end_of_list == false); m_area_header.NumFields = m_field_array.Num(); return SA_OK; } //////////////////////////////////////////////////////////// // cIpmiInventoryAreaChassis //////////////////////////////////////////////////////////// cIpmiInventoryAreaChassis::cIpmiInventoryAreaChassis(SaHpiEntryIdT area_id) : cIpmiInventoryArea(area_id) { m_area_header.Type = SAHPI_IDR_AREATYPE_CHASSIS_INFO; } cIpmiInventoryAreaChassis::~cIpmiInventoryAreaChassis() { } static SaHpiIdrFieldTypeT ChassisInfoAreaFields[] = { SAHPI_IDR_FIELDTYPE_PART_NUMBER, SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER, }; SaErrorT cIpmiInventoryAreaChassis::ParseFruArea( const unsigned char *data, unsigned int size ) { cIpmiInventoryField *iif; SaErrorT rv; unsigned int area_size = *(data+1)*8; if ( area_size > size ) { stdlog << "wrong chassis area length !\n"; return SA_ERR_HPI_INVALID_DATA; } if ( IpmiChecksum( data, *(data+1)*8 ) ) { stdlog << "wrong chassis area checksum !\n"; return SA_ERR_HPI_INVALID_DATA; } data += 2; size -= 2; if ( size < 1 ) return SA_ERR_HPI_INVALID_DATA; // Skip Chassis type data++; size--; for ( unsigned int i = 0; i < sizeof(ChassisInfoAreaFields)/sizeof(ChassisInfoAreaFields[0]); i++ ) { iif = new cIpmiInventoryField( m_area_header.AreaId, m_field_id++, ChassisInfoAreaFields[i]); m_field_array.Add( iif ); rv = iif->ReadTextBuffer( data, size ); if ( rv != SA_OK ) return rv; } while( true ) { if ( size < 1 ) return SA_ERR_HPI_INVALID_DATA; if ( *data == 0xc1 ) break; iif = new cIpmiInventoryField( m_area_header.AreaId, m_field_id++, SAHPI_IDR_FIELDTYPE_CUSTOM); m_field_array.Add( iif ); rv = iif->ReadTextBuffer( data, size ); if ( rv != SA_OK ) return rv; } m_area_header.NumFields = m_field_array.Num(); return SA_OK; } //////////////////////////////////////////////////////////// // cIpmiInventoryAreaBoard //////////////////////////////////////////////////////////// cIpmiInventoryAreaBoard::cIpmiInventoryAreaBoard(SaHpiEntryIdT area_id) : cIpmiInventoryArea(area_id) { m_area_header.Type = SAHPI_IDR_AREATYPE_BOARD_INFO; } cIpmiInventoryAreaBoard::~cIpmiInventoryAreaBoard() { } static SaHpiIdrFieldTypeT BoardInfoAreaFields[] = { SAHPI_IDR_FIELDTYPE_MANUFACTURER, SAHPI_IDR_FIELDTYPE_PRODUCT_NAME, SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER, SAHPI_IDR_FIELDTYPE_PART_NUMBER, SAHPI_IDR_FIELDTYPE_FILE_ID, }; SaErrorT cIpmiInventoryAreaBoard::ParseFruArea( const unsigned char *data, unsigned int size ) { cIpmiInventoryField *iif; SaErrorT rv; unsigned int area_size = *(data+1)*8; if ( area_size > size ) { stdlog << "wrong board area length !\n"; return SA_ERR_HPI_INVALID_DATA; } if ( IpmiChecksum( data, *(data+1)*8 ) ) { stdlog << "wrong board area checksum !\n"; return SA_ERR_HPI_INVALID_DATA; } data += 2; size -= 2; if ( size < 4 ) return SA_ERR_HPI_INVALID_DATA; // Skip Language data++; size--; time_t mfg_time = (SaHpiTimeT)data[0] + (SaHpiTimeT)data[1] * 256 + (SaHpiTimeT)data[2] * 65536; size -= 3; data += 3; mfg_time *= 60; // create date offset struct tm tmt; tmt.tm_sec = 0; tmt.tm_min = 0; tmt.tm_hour = 0; tmt.tm_mday = 1; tmt.tm_mon = 0; tmt.tm_year = 96; tmt.tm_isdst = 0; mfg_time += mktime( &tmt ); char str[80]; IpmiDateTimeToString( mfg_time, str ); iif = new cIpmiInventoryField( m_area_header.AreaId, m_field_id++, SAHPI_IDR_FIELDTYPE_MFG_DATETIME); m_field_array.Add( iif ); iif->SetAscii ( str, strlen( str ) + 1 ); for ( unsigned int i = 0; i < sizeof(BoardInfoAreaFields)/sizeof(BoardInfoAreaFields[0]); i++ ) { iif = new cIpmiInventoryField( m_area_header.AreaId, m_field_id++, BoardInfoAreaFields[i]); m_field_array.Add( iif ); rv = iif->ReadTextBuffer( data, size ); if ( rv != SA_OK ) return rv; } while( true ) { if ( size < 1 ) return SA_ERR_HPI_INVALID_DATA; if ( *data == 0xc1 ) break; iif = new cIpmiInventoryField( m_area_header.AreaId, m_field_id++, SAHPI_IDR_FIELDTYPE_CUSTOM); m_field_array.Add( iif ); rv = iif->ReadTextBuffer( data, size ); if ( rv != SA_OK ) return rv; } m_area_header.NumFields = m_field_array.Num(); return SA_OK; } //////////////////////////////////////////////////////////// // cIpmiInventoryAreaProduct //////////////////////////////////////////////////////////// cIpmiInventoryAreaProduct::cIpmiInventoryAreaProduct(SaHpiEntryIdT area_id) : cIpmiInventoryArea(area_id) { m_area_header.Type = SAHPI_IDR_AREATYPE_PRODUCT_INFO; } cIpmiInventoryAreaProduct::~cIpmiInventoryAreaProduct() { } static SaHpiIdrFieldTypeT ProductInfoAreaFields[] = { SAHPI_IDR_FIELDTYPE_MANUFACTURER, SAHPI_IDR_FIELDTYPE_PRODUCT_NAME, SAHPI_IDR_FIELDTYPE_PART_NUMBER, SAHPI_IDR_FIELDTYPE_PRODUCT_VERSION, SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER, SAHPI_IDR_FIELDTYPE_ASSET_TAG, SAHPI_IDR_FIELDTYPE_FILE_ID, }; SaErrorT cIpmiInventoryAreaProduct::ParseFruArea( const unsigned char *data, unsigned int size ) { cIpmiInventoryField *iif; SaErrorT rv; unsigned int area_size = *(data+1)*8; if ( area_size > size ) { stdlog << "wrong product area length !\n"; return SA_ERR_HPI_INVALID_DATA; } if ( IpmiChecksum( data, *(data+1)*8 ) ) { stdlog << "wrong product area checksum !\n"; return SA_ERR_HPI_INVALID_DATA; } data += 2; size -= 2; if ( size < 1 ) return SA_ERR_HPI_INVALID_DATA; // Skip Language data++; size--; for ( unsigned int i = 0; i < sizeof(ProductInfoAreaFields)/sizeof(ProductInfoAreaFields[0]); i++ ) { iif = new cIpmiInventoryField( m_area_header.AreaId, m_field_id++, ProductInfoAreaFields[i]); m_field_array.Add( iif ); rv = iif->ReadTextBuffer( data, size ); if ( rv != SA_OK ) return rv; } while( true ) { if ( size < 1 ) return SA_ERR_HPI_INVALID_DATA; if ( *data == 0xc1 ) break; iif = new cIpmiInventoryField( m_area_header.AreaId, m_field_id++, SAHPI_IDR_FIELDTYPE_CUSTOM); m_field_array.Add( iif ); rv = iif->ReadTextBuffer( data, size ); if ( rv != SA_OK ) return rv; } m_area_header.NumFields = m_field_array.Num(); return SA_OK; } //////////////////////////////////////////////////////////// // cIpmiInventoryArea //////////////////////////////////////////////////////////// cIpmiInventoryArea::cIpmiInventoryArea(SaHpiEntryIdT area_id) { m_area_header.AreaId = area_id; m_area_header.Type = SAHPI_IDR_AREATYPE_UNSPECIFIED; m_area_header.ReadOnly = SAHPI_TRUE; m_area_header.NumFields = 0; m_field_id = 1; } cIpmiInventoryArea::~cIpmiInventoryArea() { } cIpmiInventoryField * cIpmiInventoryArea::FindIdrField( SaHpiIdrFieldTypeT fieldtype, SaHpiEntryIdT fieldid ) { cIpmiInventoryField *iif; if ( fieldid == SAHPI_FIRST_ENTRY ) { for ( int i = 0; i < m_field_array.Num(); i++ ) { iif = m_field_array[i]; if (( fieldtype == SAHPI_IDR_FIELDTYPE_UNSPECIFIED ) || ( fieldtype == iif->FieldType() )) return iif; } } else { for( int i = 0; i < m_field_array.Num(); i++ ) { iif = m_field_array[i]; if ( iif->FieldId() == fieldid ) { if (( fieldtype == SAHPI_IDR_FIELDTYPE_UNSPECIFIED ) || ( fieldtype == iif->FieldType() )) return iif; break; } } } return NULL; } SaErrorT cIpmiInventoryArea::GetIdrField( SaHpiIdrFieldTypeT &fieldtype, SaHpiEntryIdT &fieldid, SaHpiEntryIdT &nextfieldid, SaHpiIdrFieldT &field ) { cIpmiInventoryField *iif = FindIdrField( fieldtype, fieldid ); if ( iif == NULL ) return SA_ERR_HPI_NOT_PRESENT; field = iif->Field(); int idx = m_field_array.Find( iif ); idx++; nextfieldid = SAHPI_LAST_ENTRY; for ( ; idx < m_field_array.Num(); idx++ ) { iif = m_field_array[idx]; if (( fieldtype == SAHPI_IDR_FIELDTYPE_UNSPECIFIED ) || ( fieldtype == iif->FieldType() )) { nextfieldid = iif->FieldId(); break; } } return SA_OK; } //////////////////////////////////////////////////////////// // cIpmiInventoryParser //////////////////////////////////////////////////////////// cIpmiInventoryParser::cIpmiInventoryParser() { m_idr_info.IdrId = 0; m_idr_info.UpdateCount = 0; m_idr_info.ReadOnly = SAHPI_TRUE; m_idr_info.NumAreas = 0; m_area_id = 1; } cIpmiInventoryParser::~cIpmiInventoryParser() { } cIpmiInventoryArea * cIpmiInventoryParser::AllocArea( SaHpiEntryIdT area_id, tIpmiInventoryRecordType type ) { switch( type ) { case eIpmiInventoryRecordTypeInternal: return new cIpmiInventoryAreaInternal( area_id ); case eIpmiInventoryRecordTypeChassis: return new cIpmiInventoryAreaChassis( area_id ); case eIpmiInventoryRecordTypeBoard: return new cIpmiInventoryAreaBoard( area_id ); case eIpmiInventoryRecordTypeProduct: return new cIpmiInventoryAreaProduct( area_id ); case eIpmiInventoryRecordTypeMultiRecord: return new cIpmiInventoryAreaMultiRecord( area_id ); default: break; } return NULL; } SaErrorT cIpmiInventoryParser::ParseFruInfo( const unsigned char *data, unsigned int size, unsigned int idr_id ) { cIpmiInventoryArea *ia; if ( size < 8 ) { stdlog << "Inventory data too short (" << size << " < 8) !\n"; return SA_ERR_HPI_INVALID_DATA; } // checksum of common header if ( IpmiChecksum( data, 8 ) ) { stdlog << "wrong common header checksum for " << idr_id << ".\n"; stdlog.Hex( data, 8 ); stdlog << "\n"; return SA_ERR_HPI_INVALID_DATA; } // clear old m_area_array.Clear(); unsigned int pos = size; // No Internal support for now for( int i = 5; i >= 2; i-- ) { if ( data[i] == 0 ) continue; tIpmiInventoryRecordType type = (tIpmiInventoryRecordType)(i - 1); unsigned int offset = data[i] * 8; unsigned int len = pos - offset; stdlog << IpmiInventoryRecordTypeToString( type ) << ": offset " << offset << ", len " << len << "\n"; ia = AllocArea( m_area_id, type ); if ( ia ) { SaErrorT rv = ia->ParseFruArea( data + offset, len ); // If a FRU area is wrong just ignore it if ( rv ) delete ia; else { m_area_id++; m_area_array.Add( ia ); } } pos -= len; } m_idr_info.IdrId = idr_id; m_idr_info.UpdateCount++; m_idr_info.ReadOnly = SAHPI_TRUE; m_idr_info.NumAreas = m_area_array.Num(); return SA_OK; } cIpmiInventoryArea * cIpmiInventoryParser::FindIdrArea( SaHpiIdrAreaTypeT areatype, SaHpiEntryIdT areaid ) { cIpmiInventoryArea *ia; if ( areaid == SAHPI_FIRST_ENTRY ) { for ( int i = 0; i < m_area_array.Num(); i++ ) { ia = m_area_array[i]; if (( areatype == SAHPI_IDR_AREATYPE_UNSPECIFIED ) || ( areatype == ia->AreaType() )) return ia; } } else { for( int i = 0; i < m_area_array.Num(); i++ ) { ia = m_area_array[i]; if ( ia->AreaId() == areaid ) { if (( areatype == SAHPI_IDR_AREATYPE_UNSPECIFIED ) || ( areatype == ia->AreaType() )) return ia; break; } } } return NULL; } SaErrorT cIpmiInventoryParser::GetIdrInfo( SaHpiIdrIdT &idrid, SaHpiIdrInfoT &idrinfo ) { if ( m_idr_info.IdrId != idrid ) return SA_ERR_HPI_NOT_PRESENT; idrinfo = m_idr_info; return SA_OK; } SaErrorT cIpmiInventoryParser::GetIdrAreaHeader( SaHpiIdrIdT &idrid, SaHpiIdrAreaTypeT &areatype, SaHpiEntryIdT &areaid, SaHpiEntryIdT &nextareaid, SaHpiIdrAreaHeaderT &header ) { if ( m_idr_info.IdrId != idrid ) return SA_ERR_HPI_NOT_PRESENT; cIpmiInventoryArea *ia = FindIdrArea( areatype, areaid ); if ( ia == NULL ) return SA_ERR_HPI_NOT_PRESENT; header = ia->AreaHeader(); int idx = m_area_array.Find( ia ); idx++; nextareaid = SAHPI_LAST_ENTRY; for ( ; idx < m_area_array.Num(); idx++ ) { ia = m_area_array[idx]; if (( areatype == SAHPI_IDR_AREATYPE_UNSPECIFIED ) || ( areatype == ia->AreaType() )) { nextareaid = ia->AreaId(); break; } } return SA_OK; } SaErrorT cIpmiInventoryParser::AddIdrArea( SaHpiIdrIdT &idrid, SaHpiIdrAreaTypeT &areatype, SaHpiEntryIdT &areaid ) { if ( m_idr_info.IdrId != idrid ) return SA_ERR_HPI_NOT_PRESENT; // Read only support for the moment return SA_ERR_HPI_READ_ONLY; } SaErrorT cIpmiInventoryParser::DelIdrArea( SaHpiIdrIdT &idrid, SaHpiEntryIdT &areaid ) { if ( m_idr_info.IdrId != idrid ) return SA_ERR_HPI_NOT_PRESENT; cIpmiInventoryArea *ia = FindIdrArea( SAHPI_IDR_AREATYPE_UNSPECIFIED, areaid ); if ( ia == NULL ) return SA_ERR_HPI_NOT_PRESENT; // Read only support for the moment return SA_ERR_HPI_READ_ONLY; } SaErrorT cIpmiInventoryParser::GetIdrField( SaHpiIdrIdT &idrid, SaHpiEntryIdT &areaid, SaHpiIdrFieldTypeT &fieldtype, SaHpiEntryIdT &fieldid, SaHpiEntryIdT &nextfieldid, SaHpiIdrFieldT &field ) { if ( m_idr_info.IdrId != idrid ) return SA_ERR_HPI_NOT_PRESENT; cIpmiInventoryArea *ia = FindIdrArea( SAHPI_IDR_AREATYPE_UNSPECIFIED, areaid ); if ( ia == NULL ) return SA_ERR_HPI_NOT_PRESENT; return ia->GetIdrField( fieldtype, fieldid, nextfieldid, field ); } SaErrorT cIpmiInventoryParser::AddIdrField( SaHpiIdrIdT &idrid, SaHpiIdrFieldT &field ) { if ( m_idr_info.IdrId != idrid ) return SA_ERR_HPI_NOT_PRESENT; cIpmiInventoryArea *ia = FindIdrArea( SAHPI_IDR_AREATYPE_UNSPECIFIED, field.AreaId ); if ( ia == NULL ) return SA_ERR_HPI_NOT_PRESENT; // Read only support for the moment return SA_ERR_HPI_READ_ONLY; } SaErrorT cIpmiInventoryParser::SetIdrField( SaHpiIdrIdT &idrid, SaHpiIdrFieldT &field ) { SaErrorT rv=SA_OK; SaHpiEntryIdT nextfield; SaHpiIdrFieldT oldfield; if ( m_idr_info.IdrId != idrid ) return SA_ERR_HPI_NOT_PRESENT; cIpmiInventoryArea *ia = FindIdrArea( SAHPI_IDR_AREATYPE_UNSPECIFIED, field.AreaId ); if ( ia == NULL ) return SA_ERR_HPI_NOT_PRESENT; // Todo: May be check some more parameters before! // rv = ia->GetIdrField ( idrid, field.AreaId, field.Type, field.FieldId, nextfield, oldfield); rv = ia->GetIdrField ( field.Type, field.FieldId, nextfield, oldfield); if (rv != SA_OK) return rv; if (oldfield.ReadOnly) { return SA_ERR_HPI_READ_ONLY; } return SA_OK; // Todo: Read only support for the moment } SaErrorT cIpmiInventoryParser::DelIdrField( SaHpiIdrIdT &idrid, SaHpiEntryIdT &areaid, SaHpiEntryIdT &fieldid ) { if ( m_idr_info.IdrId != idrid ) return SA_ERR_HPI_NOT_PRESENT; cIpmiInventoryArea *ia = FindIdrArea( SAHPI_IDR_AREATYPE_UNSPECIFIED, areaid ); if ( ia == NULL ) return SA_ERR_HPI_NOT_PRESENT; // Read only support for the moment return SA_ERR_HPI_READ_ONLY; } openhpi-3.6.1/plugins/ipmidirect/ipmi_rdr.h0000644000175100017510000000456712575647277020005 0ustar mohanmohan/* * ipmi_rdr.h base class for cIpmiSensor, cIpmiControl * * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #ifndef dIpmiRdr_h #define dIpmiRdr_h #ifndef dIpmiTextBuffer_h #include "ipmi_text_buffer.h" #endif #include extern "C" { #include "SaHpi.h" } class cIpmiMc; class cIpmiResource; #ifndef dIpmiEntity_h #include "ipmi_entity.h" #endif #ifndef dIpmiMsg_h #include "ipmi_msg.h" #endif class cIpmiDomain; class cIpmiRdr { protected: cIpmiMc *m_mc; cIpmiResource *m_resource; SaHpiEntryIdT m_record_id; SaHpiRdrTypeT m_type; cIpmiTextBuffer m_id_string; unsigned int m_lun; unsigned int m_chan; unsigned int m_sa; unsigned int m_snum; cIpmiEntityPath m_entity_path; public: cIpmiRdr( cIpmiMc *mc, SaHpiRdrTypeT type ); virtual ~cIpmiRdr(); cIpmiMc *Mc() const { return m_mc; } cIpmiResource *&Resource() { return m_resource; } SaHpiEntryIdT &RecordId() { return m_record_id; } SaHpiRdrTypeT Type() const { return m_type; } unsigned int Sa() const { return m_sa; } unsigned int Channel() const { return m_chan; } cIpmiTextBuffer &IdString() { return m_id_string; } const cIpmiTextBuffer &IdString() const { return m_id_string; } cIpmiEntityPath &EntityPath() { return m_entity_path; } cIpmiDomain *Domain(); // create an RDR sensor record virtual bool CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ); // sensor num, control num, fru device id virtual unsigned int Num() const = 0; virtual unsigned int SNum() const { return m_snum; } virtual void SetSNum(unsigned int n) { m_snum = n; } virtual void SetSa(unsigned int n) { m_sa = n; } virtual unsigned int Lun() const { return m_lun; } //virtual void Dump( cIpmiLog &dump ) = 0; SaErrorT SendCommand( const cIpmiMsg &msg, cIpmiMsg &rsp, unsigned int lun = 0, int retries = 3 ); // populate rdrs private: bool m_populate; public: virtual bool Populate(GSList **); }; #endif openhpi-3.6.1/plugins/ipmidirect/ipmi_utils.h0000644000175100017510000000721212575647277020344 0ustar mohanmohan/* * ipmi_utils.cpp * * Copyright (c) 2003 by FORCE Computers * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #ifndef dIpmiUtils_h #define dIpmiUtils_h #include enum tIpmiFruState { eIpmiFruStateNotInstalled = 0, eIpmiFruStateInactive = 1, eIpmiFruStateActivationRequest = 2, eIpmiFruStateActivationInProgress = 3, eIpmiFruStateActive = 4, eIpmiFruStateDeactivationRequest = 5, eIpmiFruStateDeactivationInProgress = 6, eIpmiFruStateCommunicationLost = 7 }; const char *IpmiFruStateToString( tIpmiFruState state ); unsigned int IpmiGetUint16( const unsigned char *data ); void IpmiSetUint16( unsigned char *data, int val ); unsigned int IpmiGetUint32( const unsigned char *data ); void IpmiSetUint32( unsigned char *data, int val ); #define dDateStringSize 11 void IpmiDateToString( unsigned int time, char *str ); #define dTimeStringSize 9 void IpmiTimeToString( unsigned int time, char *str ); #define dDateTimeStringSize 20 void IpmiDateTimeToString( unsigned int time, char *str ); class cTime { public: timeval m_time; cTime() { m_time.tv_sec = 0; m_time.tv_usec = 0; } cTime( const struct timeval &tv ) { m_time.tv_sec = tv.tv_sec; m_time.tv_usec = tv.tv_usec; } cTime( const cTime &t ) { m_time.tv_sec = t.m_time.tv_sec; m_time.tv_usec = t.m_time.tv_usec; } cTime( unsigned int s, unsigned int u ) { m_time.tv_sec = s; m_time.tv_usec = u; } void Normalize() { while( m_time.tv_usec > 1000000 ) { m_time.tv_usec -= 1000000; m_time.tv_sec++; } while( m_time.tv_usec < 0 ) { m_time.tv_usec += 1000000; m_time.tv_sec--; } } int Cmp( const cTime &t ) { if ( m_time.tv_sec < t.m_time.tv_sec ) return -1; if ( m_time.tv_sec > t.m_time.tv_sec ) return 1; if ( m_time.tv_usec < t.m_time.tv_usec ) return -1; if ( m_time.tv_usec > t.m_time.tv_usec ) return 1; return 0; } bool operator<( const cTime &t ) { return Cmp( t ) < 0; } bool operator<=( const cTime &t ) { return Cmp( t ) < 0; } bool operator>( const cTime &t ) { return Cmp( t ) > 0; } bool operator>=( const cTime &t ) { return Cmp( t ) >= 0; } bool operator==( const cTime &t ) { return Cmp( t ) == 0; } bool operator!=( const cTime &t ) { return Cmp( t ) == 0; } cTime &operator+=( const cTime &t ) { m_time.tv_sec += t.m_time.tv_sec; m_time.tv_usec += t.m_time.tv_usec; Normalize(); return *this; } cTime &operator+=( int ms ) { m_time.tv_sec += ms / 1000; m_time.tv_usec += (ms % 1000) * 1000; Normalize(); return *this; } cTime &operator-=( int ms ) { m_time.tv_sec -= ms / 1000; m_time.tv_usec -= (ms % 1000) * 1000; Normalize(); return *this; } static cTime Now() { cTime t; gettimeofday( &t.m_time, 0 ); return t; } }; #endif openhpi-3.6.1/plugins/ipmidirect/ipmi_sdr.h0000644000175100017510000001075712575647277020004 0ustar mohanmohan/* * ipmi_sdr.h * * Copyright (c) 2003,2004 by FORCE Computers * Copyright (c) 2005 by ESO Technologies. * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #ifndef dIpmiSdr_h #define dIpmiSdr_h #include extern "C" { #include "SaHpi.h" } #include "glib.h" #ifndef dIpmiLog_h #include "ipmi_log.h" #endif #define dMaxSdrData 255 #define dSdrHeaderSize 5 // Max bytes to try to get at a time. #define dMaxSdrFetch 20 // Do up to this many retries when the reservation is lost. #define dMaxSdrFetchRetries 10 enum tIpmiSdrType { eSdrTypeUnknown = 0, eSdrTypeFullSensorRecord = 0x01, eSdrTypeCompactSensorRecord = 0x02, eSdrTypeEventOnlySensorRecord = 0x03, eSdrTypeEntityAssociationRecord = 0x08, eSdrTypeDeviceRelativeEntityAssociationRecord = 0x09, eSdrTypeGenericDeviceLocatorRecord = 0x10, eSdrTypeFruDeviceLocatorRecord = 0x11, eSdrTypeMcDeviceLocatorRecord = 0x12, eSdrTypeMcConfirmationRecord = 0x13, eSdrTypeBmcMessageChannelInfoRecord = 0x14, eSdrTypeOemRecord = 0xc0 }; const char *IpmiSdrTypeToName( tIpmiSdrType type ); class cIpmiSdr { public: unsigned short m_record_id; unsigned char m_major_version; unsigned char m_minor_version; tIpmiSdrType m_type; unsigned char m_length; unsigned char m_data[dMaxSdrData]; void Dump( cIpmiLog &dump, const char *name ) const; protected: void DumpFullSensor( cIpmiLog &dump ) const; void DumpFruDeviceLocator( cIpmiLog &dump ) const; void DumpMcDeviceLocator( cIpmiLog &dump ) const; }; enum tIpmiRepositorySdrUpdate { eIpmiRepositorySdrUpdateUnspecified = 0, eIpmiRepositorySdrUpdateNonModal = 1, eIpmiRepositorySdrUpdateModal = 2, eIpmiRepositorySdrUpdatBoth = 3 }; const char *IpmiRepositorySdrUpdateToString( tIpmiRepositorySdrUpdate val ); class cIpmiMc; class cIpmiSdrs { protected: cIpmiMc *m_mc; bool m_device_sdr; // Have the SDRs previously been fetched? bool m_fetched; // Information from the SDR Repository Info command, non-sensor // mode only. unsigned char m_major_version; unsigned char m_minor_version; unsigned int m_last_addition_timestamp; unsigned int m_last_erase_timestamp; bool m_overflow; tIpmiRepositorySdrUpdate m_update_mode; bool m_supports_delete_sdr; bool m_supports_partial_add_sdr; bool m_supports_reserve_sdr; bool m_supports_get_sdr_repository_allocation; // device SDR bool m_dynamic_population; bool m_lun_has_sensors[4]; unsigned int m_reservation; bool m_sdr_changed; // The actual current copy of the SDR repository. unsigned int m_num_sdrs; cIpmiSdr **m_sdrs; private: enum tReadRecord { eReadOk, eReadEndOfSdr, eReadReservationLost, eReadError }; SaErrorT ReadRecords( cIpmiSdr **&records, unsigned short &working_num_sdrs, unsigned int &num, unsigned int lun ); cIpmiSdr *ReadRecord( unsigned short record_id, unsigned short &next_record_id, tReadRecord &err, unsigned int lun ); GList *CreateFullSensorRecords( cIpmiSdr *sdr ); SaErrorT Reserve(unsigned int lun); int GetInfo( unsigned short &working_num_sdrs ); public: cIpmiSdrs( cIpmiMc *mc, bool device_sdr ); ~cIpmiSdrs(); unsigned int NumSdrs() const { return m_num_sdrs; } cIpmiSdr *Sdr( unsigned int i ) { assert( i < m_num_sdrs ); return m_sdrs[i]; } SaErrorT Fetch(); void Dump( cIpmiLog &dump, const char *name ) const; cIpmiSdr *FindSdr( cIpmiMc *mc ); unsigned int FindParentFru( SaHpiEntityTypeT type, SaHpiEntityLocationT instance, SaHpiEntityTypeT & parent_type, SaHpiEntityLocationT & parent_instance ); }; #endif openhpi-3.6.1/plugins/ipmidirect/ipmi_sensor_discrete.h0000644000175100017510000000320012575647277022370 0ustar mohanmohan/* * ipmi_sensor_discrete.h * * Copyright (c) 2004 by FORCE Computers * Copyright (c) 2005 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #ifndef dIpmiSensorDiscrete_h #define dIpmiSensorDiscrete_h #ifndef dIpmiSensor_h #include "ipmi_sensor.h" #endif class cIpmiSensorDiscrete : public cIpmiSensor { public: cIpmiSensorDiscrete( cIpmiMc *mc ); virtual ~cIpmiSensorDiscrete(); // create an hpi event from ipmi event virtual SaErrorT CreateEvent( cIpmiEvent *event, SaHpiEventT &h ); // read sensor parameter from Full Sensor Record virtual bool GetDataFromSdr( cIpmiMc *mc, cIpmiSdr *sdr ); // create an RDR sensor record virtual bool CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ); // get sensor data virtual SaErrorT GetSensorReading( SaHpiSensorReadingT &data, SaHpiEventStateT &state ); virtual SaErrorT GetEventMasksHw( SaHpiEventStateT &AssertEventMask, SaHpiEventStateT &DeassertEventMask ); virtual SaErrorT SetEventMasksHw( const SaHpiEventStateT &AssertEventMask, const SaHpiEventStateT &DeassertEventMask ); }; #endif openhpi-3.6.1/plugins/ipmidirect/ipmi_domain.cpp0000644000175100017510000005670612575647277021022 0ustar mohanmohan/* * * Copyright (c) 2003,2004 by FORCE Computers * Copyright (c) 2005 by ESO Technologies. * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #include #include "ipmi.h" #include "ipmi_utils.h" cIpmiDomain::cIpmiDomain() : m_con( 0 ), m_is_tca( false ), m_main_sdrs( 0 ), m_sensors_in_main_sdr( 0 ), m_major_version( 0 ), m_minor_version( 0 ), m_sdr_repository_support( false ), m_si_mc( 0 ), m_initial_discover( 0 ), m_mc_poll_interval( dIpmiMcPollInterval ), m_sel_rescan_interval( dIpmiSelQueryInterval ), m_bmc_discovered( false ) { cIpmiMcVendorFactory::InitFactory(); m_did = 0; m_own_domain = false; for( int i = 0; i < 256; i++ ) { m_mc_thread[i] = 0; m_atca_site_property[i].m_property = 0; m_atca_site_property[i].m_max_side_id = 0; m_atca_site_property[i].m_mc_type = 0; } // scan at least at dIpmiBmcSlaveAddr NewFruInfo( dIpmiBmcSlaveAddr, 0, SAHPI_ENT_SHELF_MANAGER, 0, eIpmiAtcaSiteTypeDedicatedShMc, dIpmiMcThreadInitialDiscover | dIpmiMcThreadPollDeadMc | dIpmiMcThreadPollAliveMc ); // default site type properties unsigned int prop = dIpmiMcThreadInitialDiscover | dIpmiMcThreadCreateM0; // atca board SetAtcaSiteProperty( eIpmiAtcaSiteTypeAtcaBoard, prop, 32 ); // power SetAtcaSiteProperty( eIpmiAtcaSiteTypePowerEntryModule, prop, 8 ); // shelf fru information SetAtcaSiteProperty( eIpmiAtcaSiteTypeShelfFruInformation, prop, 4 ); // dedicated ShMc SetAtcaSiteProperty( eIpmiAtcaSiteTypeDedicatedShMc, prop, 2 ); // fan tray SetAtcaSiteProperty( eIpmiAtcaSiteTypeFanTray, prop, 8 ); // fan filter tray SetAtcaSiteProperty( eIpmiAtcaSiteTypeFanFilterTray, prop, 8 ); // alarm SetAtcaSiteProperty( eIpmiAtcaSiteTypeAlarm, prop, 8 ); // AdvancedMC Module SetAtcaSiteProperty( eIpmiAtcaSiteTypeAdvancedMcModule, prop, 32 ); // PMC SetAtcaSiteProperty( eIpmiAtcaSiteTypePMC, prop, 32 ); // rear transition module SetAtcaSiteProperty( eIpmiAtcaSiteTypeRearTransitionModule, prop, 32 ); // MicroTca Carrier Hub SetAtcaSiteProperty( eIpmiAtcaSiteTypeMicroTcaCarrierHub, prop, 8 ); // Power Module SetAtcaSiteProperty( eIpmiAtcaSiteTypePowerModule, prop, 8 ); } cIpmiDomain::~cIpmiDomain() { cIpmiMcVendorFactory::CleanupFactory(); } bool cIpmiDomain::Init( cIpmiCon *con ) { if ( m_con != 0 ) { stdlog << "IPMI Domain already initialized !\n"; return false; } m_con = con; // create system interface cIpmiAddr si( eIpmiAddrTypeSystemInterface); m_si_mc = new cIpmiMc( this, si ); if ( m_si_mc == 0 ) { stdlog << "cannot create system interface !\n"; return false; } // create main sdr m_main_sdrs = new cIpmiSdrs( m_si_mc, false ); // send get device id to system interface cIpmiMsg msg( eIpmiNetfnApp, eIpmiCmdGetDeviceId ); cIpmiMsg rsp; SaErrorT rv = m_si_mc->SendCommand( msg, rsp ); if ( rv != SA_OK ) { stdlog << "cannot send IPMI get device id to system interface: " << rv << ", " << strerror( rv ) << " !\n"; return false; } if ( rsp.m_data[0] != 0 || rsp.m_data_len < 12 ) { // At least the get device id has to work. stdlog << "get device id fails " << rsp.m_data[0] << " !\n"; return false; } m_major_version = rsp.m_data[5] & 0xf; m_minor_version = (rsp.m_data[5] >> 4) & 0xf; m_sdr_repository_support = (rsp.m_data[6] & 0x02) == 0x02; m_si_mc->SdrRepositorySupport() = m_sdr_repository_support; if ( m_major_version < 1 ) { // We only support 1.0 and greater. stdlog << "ipmi version " << m_major_version << "." << m_minor_version << " not supported !\n"; return false; } // set vendor unsigned int mid = rsp.m_data[7] | (rsp.m_data[8] << 8) | (rsp.m_data[9] << 16); unsigned int pid = IpmiGetUint16( rsp.m_data + 10 ); cIpmiMcVendor *mv = cIpmiMcVendorFactory::GetFactory()->Get( mid, pid ); m_si_mc->SetVendor( mv ); // initialize system interface MC if ( mv->InitMc( m_si_mc, rsp ) == false ) { stdlog << "cannot initialize system interface !\n"; return false; } int num = m_max_outstanding; if ( m_max_outstanding == 0 ) { // Check the number of outstanding requests. // This is fine tuning if the BMC/ShMc has // a block transfer interface. // If not supported use the defaults // given in openhpi.conf. msg.m_netfn = eIpmiNetfnApp; msg.m_cmd = eIpmiCmdGetBtInterfaceCapabilities; msg.m_data_len = 0; rv = m_si_mc->SendCommand( msg, rsp, 0, 1 ); // ignore on error if ( rv == SA_OK && rsp.m_data[0] == 0 && rsp.m_data_len >= 6 ) { num = rsp.m_data[1]; stdlog << "reading bt capabilities: max outstanding " << num << ", input " << (int)rsp.m_data[2] << ", output " << (int)rsp.m_data[3] << ", retries " << (int)rsp.m_data[5] << ".\n"; // check if ( num < 1 ) num = 1; if ( num > 32 ) num = 32; } } if ( num == 0 ) { num = 1; } stdlog << "max number of outstanding = " << num << ".\n"; m_con->SetMaxOutstanding( num ); /** Commenting this code block due to the multi-domain ** changes in the infrastructure. ** (Renier Morales 11/21/06) if ( m_own_domain == true ) { SaHpiTextBufferT buf = m_domain_tag; m_did = oh_request_new_domain_aitimeout(m_handler_id, &buf, 0, m_insert_timeout, 0, 0); if ( m_did == 0 ) { stdlog << "Failed to get a Domain ID - using default\n"; m_did = oh_get_default_domain_id(); } } else {*/ m_insert_timeout = SAHPI_TIMEOUT_IMMEDIATE; m_did = 0; /*}*/ stdlog << "Domain ID " << m_did << "\n"; // check for TCA an modify m_mc_to_check CheckTca(); // Non TCA system -> adjust BMC info if ( !m_is_tca ) { cIpmiFruInfo *fi = FindFruInfo( dIpmiBmcSlaveAddr, 0 ); if ( !fi ) return false; fi->Entity() = SAHPI_ENT_SYS_MGMNT_MODULE; fi->Site() = eIpmiAtcaSiteTypeUnknown; fi->Slot() = GetFreeSlotForOther( dIpmiBmcSlaveAddr ); } if ( m_sdr_repository_support ) { stdlog << "reading repository SDR.\n"; rv = m_main_sdrs->Fetch(); if ( rv ) // Just report an error, it shouldn't be a big deal if this // fails. stdlog << "could not get main SDRs, error " << rv << " !\n"; else if ( !m_is_tca ) { // for each mc device locator record in main repository // create an entry in m_mc_to_check. for( unsigned int i = 0; i < m_main_sdrs->NumSdrs(); i++ ) { cIpmiSdr *sdr = m_main_sdrs->Sdr( i ); if ( sdr->m_type != eSdrTypeMcDeviceLocatorRecord ) continue; unsigned char addr = sdr->m_data[5]; cIpmiFruInfo *fi = FindFruInfo( addr, 0 ); if ( fi == 0 ) NewFruInfo( addr, 0, SAHPI_ENT_SYS_MGMNT_MODULE, GetFreeSlotForOther( addr ), eIpmiAtcaSiteTypeUnknown, dIpmiMcThreadInitialDiscover | dIpmiMcThreadPollDeadMc | dIpmiMcThreadPollAliveMc ); } } } // Start all MC threads with the // properties found in m_mc_to_check. m_initial_discover = 0; m_num_mc_threads = 0; for( GList *list = GetFruInfoList(); list; list = g_list_next( list ) ) { cIpmiFruInfo *fi = (cIpmiFruInfo *)list->data; if ( fi->FruId() != 0 ) continue; int addr = fi->Address(); if ( m_mc_thread[addr] != 0 ) { stdlog << "Thread already started for " << addr << " !\n"; continue; } m_mc_thread[addr] = new cIpmiMcThread( this, addr, fi->Properties() /*, m_mc_to_check[i], m_mc_type[i], m_mc_slot[i] */ ); // Count MC thread with initial discover. // This counter is used in cIpmi::IfDiscoverResources // to wait until discover is done if ( fi->Properties() & dIpmiMcThreadInitialDiscover ) { m_initial_discover_lock.Lock(); m_initial_discover++; m_initial_discover_lock.Unlock(); } m_mc_thread[addr]->Start(); } return true; } void cIpmiDomain::Cleanup() { int i; // stop MC threads for( i = 0; i < 256; i++ ) if ( m_mc_thread[i] ) m_mc_thread[i]->m_exit = true; // wait until all threads are finish bool loop = true; while( loop ) { m_mc_thread_lock.Lock(); loop = (bool)m_num_mc_threads; m_mc_thread_lock.Unlock(); usleep( 100000 ); } // wait for threads exit for( i = 0; i < 256; i++ ) if ( m_mc_thread[i] ) { void *rv; m_mc_thread[i]->Wait( rv ); delete m_mc_thread[i]; m_mc_thread[i] = 0; } // stop reader thread if ( m_con && m_con->IsOpen() ) m_con->Close(); // Delete the sensors from the main SDR repository. while( m_sensors_in_main_sdr ) { cIpmiSensor *sensor = (cIpmiSensor *)m_sensors_in_main_sdr->data; m_sensors_in_main_sdr = g_list_remove( m_sensors_in_main_sdr, sensor ); sensor->Resource()->RemRdr( sensor ); delete sensor; } // cleanup all MCs for( i = m_mcs.Num() - 1; i >= 0; i-- ) { cIpmiMc *mc = m_mcs[i]; CleanupMc( mc ); } // now all mc's are ready to destroy while( m_mcs.Num() ) { cIpmiMc *mc = m_mcs[0]; CleanupMc( mc ); } // destroy si if ( m_si_mc ) { m_si_mc->Cleanup(); delete m_si_mc; m_si_mc = 0; } /* Destroy the main SDR repository, if it exists. */ if ( m_main_sdrs ) { delete m_main_sdrs; m_main_sdrs = 0; } } void cIpmiDomain::AddMc( cIpmiMc *mc ) { m_mcs.Add( mc ); } bool cIpmiDomain::CleanupMc( cIpmiMc *mc ) { if ( !mc->Cleanup() ) return false; int idx = m_mcs.Find( mc ); if ( idx == -1 ) { stdlog << "unable to find mc at " << (unsigned char)mc->GetAddress() << " in mc list !\n"; return false; } m_mcs.Rem( idx ); delete mc; return true; } SaErrorT cIpmiDomain::CheckTca() { cIpmiMsg msg( eIpmiNetfnPicmg, eIpmiCmdGetPicMgProperties ); msg.m_data_len = 1; msg.m_data[0] = dIpmiPicMgId; cIpmiMsg rsp; SaErrorT rv; int i; m_is_tca = false; if ( !m_si_mc ) return SA_ERR_HPI_INTERNAL_ERROR; stdlog << "checking for TCA system.\n"; rv = m_si_mc->SendCommand( msg, rsp ); if ( rv != SA_OK || rsp.m_data[0] || rsp.m_data[1] != dIpmiPicMgId ) { stdlog << "not a TCA system.\n"; return (rv != SA_OK) ? rv : SA_ERR_HPI_INVALID_DATA; } unsigned char minor = (rsp.m_data[2] >> 4) & 0x0f; unsigned char major = rsp.m_data[2] & 0x0f; stdlog << "found a PICMG system, Extension Version " << (unsigned int)major << "." << (unsigned int)minor << ".\n"; switch ( major ) { default: return SA_OK; case 2: stdlog << "found an ATCA system.\n"; break; case 5: stdlog << "found a MicroTCA system.\n"; break; } // use atca timeout stdlog << "set timeout to " << m_con_atca_timeout << ".\n"; m_con->m_timeout = m_con_atca_timeout; m_is_tca = true; // MicroTCA systems have 1 to 16 Carriers if ( major == 5 ) { for ( int carrier_number = 1; carrier_number <= 16; carrier_number++ ) { NewFruInfo( 0x80 + (carrier_number*2), 0, SAHPI_ENT_SUBBOARD_CARRIER_BLADE, carrier_number, eIpmiAtcaSiteTypeAtcaBoard, dIpmiMcThreadInitialDiscover ); } return SA_OK; } // read all fru addr msg.m_netfn = eIpmiNetfnPicmg; msg.m_cmd = eIpmiCmdGetAddressInfo; msg.m_data[0] = dIpmiPicMgId; msg.m_data[1] = 0; // fru id 0 msg.m_data[2] = 0x03; // physical addr msg.m_data_len = 5; static const char *map[] = { "ATCA Board", "Power Entry Module", "Shelf FRU Information", "Dedicated ShMc", "Fan Tray", "Fan Filter Tray", "Alarm", "AdvancedMC Module", "PMC", "Rear Transition Module", "MicroTCA Carrier Hub", "Power Module" }; static int map_num = sizeof( map ) / sizeof( char * ); for( i = 0; i < 256; i++ ) { if ( !m_atca_site_property[i].m_property ) continue; if ( m_atca_poll_alive_mcs == true ) m_atca_site_property[i].m_property |= dIpmiMcThreadPollAliveMc; if ( i < map_num ) stdlog << "checking for " << map[i] << ".\n"; else stdlog << "checking for " << (unsigned char)i << ".\n"; SaHpiEntityTypeT entity = MapAtcaSiteTypeToEntity( (tIpmiAtcaSiteType)i ); for( int j = 0; j < m_atca_site_property[i].m_max_side_id; j++ ) { msg.m_data[3] = j + 1; msg.m_data[4] = i; rv = m_si_mc->SendCommand( msg, rsp ); if ( rv != SA_OK ) { stdlog << "cannot send get address info: " << rv << " !\n"; break; } if ( rsp.m_data[0] ) break; if ( i < map_num ) stdlog << "\tfound " << map[i] << " at " << rsp.m_data[3] << ".\n"; else stdlog << "\tfound " << (unsigned char)i << " at " << rsp.m_data[3] << ".\n"; // add MC for initial scan (FRU 0) if (rsp.m_data[5] == 0) NewFruInfo( rsp.m_data[3], rsp.m_data[5], entity, j + 1, (tIpmiAtcaSiteType)i, m_atca_site_property[i].m_property ); } } return SA_OK; } cIpmiMc * cIpmiDomain::FindMcByAddr( const cIpmiAddr &addr ) { if ( ( addr.m_type == eIpmiAddrTypeSystemInterface ) && ( addr.m_channel == dIpmiBmcChannel ) ) return m_si_mc; for( int i = 0; i < m_mcs.Num(); i++ ) { cIpmiMc *mc = m_mcs[i]; if ( addr == mc->Addr() ) return mc; } return 0; } SaErrorT cIpmiDomain::SendCommand( const cIpmiAddr &addr, const cIpmiMsg &msg, cIpmiMsg &rsp_msg, int retries ) { if ( m_con == 0 ) { return SA_ERR_HPI_NOT_PRESENT; } return m_con->ExecuteCmd( addr, msg, rsp_msg, retries ); } GList * cIpmiDomain::GetSdrSensors( cIpmiMc *mc ) { if ( mc ) return mc->GetSdrSensors(); return m_sensors_in_main_sdr; } void cIpmiDomain::SetSdrSensors( cIpmiMc *mc, GList *sensors ) { if ( mc ) mc->SetSdrSensors( sensors ); else m_sensors_in_main_sdr = sensors; } cIpmiMc * cIpmiDomain::GetEventRcvr() { for( int i = 0; i < m_mcs.Num(); i++ ) { cIpmiMc *mc = m_mcs[i]; // Event receiver on TCA must be set to the active ShMc if ( IsTca() ) { if ( mc->GetAddress() == dIpmiBmcSlaveAddr ) return mc; } else if ( mc->SelDeviceSupport() ) { return mc; } } return 0; } void cIpmiDomain::HandleEvents( GList *list ) { while( list ) { cIpmiEvent *event = (cIpmiEvent *)list->data; list = g_list_remove( list, event ); HandleEvent( event ); } } void cIpmiDomain::HandleAsyncEvent( const cIpmiAddr &addr, const cIpmiMsg &msg ) { // It came from an MC, so find the MC. cIpmiMc *mc = FindMcByAddr( addr ); if ( !mc ) { stdlog << "cannot find mc for event !\n"; return; } cIpmiEvent *event = new cIpmiEvent; event->m_mc = mc; event->m_record_id = IpmiGetUint16( msg.m_data ); event->m_type = msg.m_data[2]; memcpy( event->m_data, msg.m_data + 3, dIpmiMaxSelData ); // Add it to the MCs event log. mc->Sel()->AddAsyncEvent( event ); HandleEvent( event ); } void cIpmiDomain::HandleEvent( cIpmiEvent *event ) { // find MC thread unsigned char a = event->m_data[4]; bool hotswap = ( event->m_data[7] == eIpmiSensorTypeAtcaHotSwap ) ? true : false; // if there is no MC thread => create MC thread if ( m_mc_thread[a] == 0 ) { int slot = GetFreeSlotForOther( a ); cIpmiFruInfo *fi = NewFruInfo( a, 0, SAHPI_ENT_SYS_MGMNT_MODULE, slot, eIpmiAtcaSiteTypeUnknown, dIpmiMcThreadInitialDiscover | hotswap ? ( dIpmiMcThreadPollAliveMc | dIpmiMcThreadCreateM0) : 0 ); m_mc_thread[a] = new cIpmiMcThread( this, a, fi->Properties() ); m_mc_thread[a]->Start(); } m_mc_thread[a]->AddEvent( event ); } cIpmiResource * cIpmiDomain::VerifyResource( cIpmiResource *res ) { for( int i = 0; i < m_mcs.Num(); i++ ) { cIpmiMc *mc = m_mcs[i]; if ( mc->FindResource( res ) ) return res; } return 0; } cIpmiMc * cIpmiDomain::VerifyMc( cIpmiMc *mc ) { if ( m_si_mc == mc ) return mc; int idx = m_mcs.Find( mc ); if ( idx == -1 ) return 0; return mc; } cIpmiRdr * cIpmiDomain::VerifyRdr( cIpmiRdr *rdr ) { for( int i = 0; i < m_mcs.Num(); i++ ) { cIpmiMc *mc = m_mcs[i]; if ( mc->FindRdr( rdr ) ) return rdr; } return 0; } cIpmiSensor * cIpmiDomain::VerifySensor( cIpmiSensor *s ) { for( int i = 0; i < m_mcs.Num(); i++ ) { cIpmiMc *mc = m_mcs[i]; if ( mc->FindRdr( s ) ) return s; } return 0; } cIpmiControl * cIpmiDomain::VerifyControl( cIpmiControl *c ) { for( int i = 0; i < m_mcs.Num(); i++ ) { cIpmiMc *mc = m_mcs[i]; if ( mc->FindRdr( c ) ) return c; } return 0; } cIpmiWatchdog * cIpmiDomain::VerifyWatchdog ( cIpmiWatchdog *c ) { for( int i = 0; i < m_mcs.Num(); i++ ) { cIpmiMc *mc = m_mcs[i]; if ( mc->FindRdr( c ) ) return c; } return 0; } cIpmiInventory * cIpmiDomain::VerifyInventory( cIpmiInventory *inv ) { for( int i = 0; i < m_mcs.Num(); i++ ) { cIpmiMc *mc = m_mcs[i]; if ( mc->FindRdr( inv ) ) return inv; } return 0; } void cIpmiDomain::Dump( cIpmiLog &dump ) const { if ( dump.IsRecursive() ) { dump << "#include \"Mc.sim\"\n"; dump << "#include \"Entity.sim\"\n"; dump << "#include \"Sensor.sim\"\n"; dump << "#include \"Sdr.sim\"\n"; dump << "#include \"Sel.sim\"\n"; dump << "#include \"Fru.sim\"\n\n\n"; // main sdr if ( m_main_sdrs ) { dump << "// repository SDR\n"; m_main_sdrs->Dump( dump, "MainSdr1" ); } // dump all MCs for( int i = 0; i < 256; i++ ) { if ( m_mc_thread[i] == 0 || m_mc_thread[i]->Mc() == 0 ) continue; cIpmiMc *mc = m_mc_thread[i]->Mc(); char str[80]; snprintf( str, sizeof(str), "Mc%02x", i ); mc->Dump( dump, str ); } } // sim dump.Begin( "Sim", "Dump" ); for( GList *list = GetFruInfoList(); list; list = g_list_next( list ) ) { cIpmiFruInfo *fi = (cIpmiFruInfo *)list->data; const char *site = 0; switch( fi->Site() ) { case eIpmiAtcaSiteTypeAtcaBoard: site = "AtcaBoard"; break; case eIpmiAtcaSiteTypePowerEntryModule: site = "PowerUnit"; break; case eIpmiAtcaSiteTypeShelfFruInformation: site = "ShelfFruInformation"; break; case eIpmiAtcaSiteTypeDedicatedShMc: site = "ShMc"; break; case eIpmiAtcaSiteTypeFanTray: site = "FanTray"; break; case eIpmiAtcaSiteTypeFanFilterTray: site = "FanFilterTray"; break; case eIpmiAtcaSiteTypeAlarm: site = "Alarm"; break; case eIpmiAtcaSiteTypeAdvancedMcModule: site = "AdvancedMcModule"; break; case eIpmiAtcaSiteTypePMC: site = "PMC"; break; case eIpmiAtcaSiteTypeRearTransitionModule: site = "RearTransitionModule"; break; default: site = "Unknown"; break; } dump.Entry( site ) << fi->Slot() << ", " << (unsigned char)fi->Address() << ";\n"; } if ( dump.IsRecursive() ) { dump << "\n"; if ( m_main_sdrs ) dump.Entry( "MainSdr" ) << "MainSdr1\n"; for( int i = 0; i < 256; i++ ) { if ( m_mc_thread[i] == 0 || m_mc_thread[i]->Mc() == 0 ) continue; cIpmiFruInfo *fi = FindFruInfo( i, 0 ); if ( fi == 0 ) { continue; } const char *type = 0; switch( fi->Site() ) { case eIpmiAtcaSiteTypeAtcaBoard: type = "AtcaBoard"; break; case eIpmiAtcaSiteTypePowerEntryModule: type = "PowerUnit"; break; case eIpmiAtcaSiteTypeShelfFruInformation: type = "ShelfFruInformation"; break; case eIpmiAtcaSiteTypeDedicatedShMc: type = "ShMc"; break; case eIpmiAtcaSiteTypeFanTray: type = "FanTray"; break; case eIpmiAtcaSiteTypeFanFilterTray: type = "FanFilterTray"; break; case eIpmiAtcaSiteTypeAlarm: type = "Alarm"; break; case eIpmiAtcaSiteTypeAdvancedMcModule: type = "AdvancedMcModule"; break; case eIpmiAtcaSiteTypePMC: type = "PMC"; break; case eIpmiAtcaSiteTypeRearTransitionModule: type = "RearTransitionModule"; break; default: type = "Unknown"; break; } char str[30]; snprintf( str, sizeof(str), "Mc%02x", i ); dump.Entry( "Mc" ) << str << ", " << type << ", " << fi->Slot() << ";\n"; } } dump.End(); } openhpi-3.6.1/plugins/ipmidirect/ipmi_mc_vendor_fix_sdr.h0000644000175100017510000000246412575647277022702 0ustar mohanmohan/* * Copyright (c) 2005 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Pierre Sangouard */ #ifndef dIpmiMcVendorFixSdr_h #define dIpmiMcVendorFixSdr_h #ifndef dIpmiMcVendor_h #include "ipmi_mc_vendor.h" #endif #define ENTITY_DONT_CARE 0xff typedef struct { unsigned char old_entity_id; unsigned char old_entity_instance; unsigned char new_entity_id; unsigned char new_entity_instance; bool last_entry; } mc_sdr_patch_t; typedef struct { unsigned int manufacturer_id; unsigned int product_id; mc_sdr_patch_t *sdr_patch; } mc_patch_t; extern mc_patch_t mc_patch[]; class cIpmiMcVendorFixSdr : public cIpmiMcVendor { mc_sdr_patch_t *m_sdr_patch; public: cIpmiMcVendorFixSdr( unsigned int manufacturer_id, unsigned int product_id ); virtual ~cIpmiMcVendorFixSdr(); virtual bool InitMc( cIpmiMc *mc, const cIpmiMsg &devid ); bool ProcessSdr( cIpmiDomain *domain, cIpmiMc *mc, cIpmiSdrs *sdrs ); }; #endif openhpi-3.6.1/plugins/ipmidirect/ipmi_sensor_hotswap.h0000644000175100017510000000262312575647277022263 0ustar mohanmohan/* * ipmi_sensor_hotswap.h * * Copyright (c) 2004 by FORCE Computers * Copyright (c) 2005 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #ifndef dIpmiSensorHotswap_h #define dIpmiSensorHotswap_h #ifndef dIpmiSensorDiscrete_h #include "ipmi_sensor_discrete.h" #endif #ifndef dIpmiUtils_h #include "ipmi_utils.h" #endif class cIpmiSensorHotswap : public cIpmiSensorDiscrete { public: static SaHpiHsStateT ConvertIpmiToHpiHotswapState( tIpmiFruState h ); public: cIpmiSensorHotswap( cIpmiMc *mc ); virtual ~cIpmiSensorHotswap(); // handle hotswap sensor events virtual void HandleEvent( cIpmiEvent *event ); // read sensor parameter from Full Sensor Record virtual bool GetDataFromSdr( cIpmiMc *mc, cIpmiSdr *sdr ); // create an RDR sensor record virtual bool CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ); // read hotswap state SaErrorT GetPicmgState( tIpmiFruState &state ); SaErrorT GetHpiState( SaHpiHsStateT &state ); }; #endif openhpi-3.6.1/plugins/ipmidirect/ipmi_msg.h0000644000175100017510000000242312575647277017771 0ustar mohanmohan/* * * Copyright (c) 2003 by FORCE Computers * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #ifndef dIpmiMsg_h #define dIpmiMsg_h #ifndef dIpmiCmd_h #include "ipmi_cmd.h" #endif #define dIpmiMaxMsgLength 80 class cIpmiMsg { public: tIpmiNetfn m_netfn; tIpmiCmd m_cmd; unsigned short m_data_len; unsigned char m_data[dIpmiMaxMsgLength]; unsigned char m_sa; unsigned char m_chan; public: cIpmiMsg(); cIpmiMsg( tIpmiNetfn netfn, tIpmiCmd cmd, unsigned short data_len = 0, unsigned char *data = 0 , unsigned char sa = 0, unsigned char chan = 0 ); bool Equal( const cIpmiMsg &msg2 ) const; }; #endif openhpi-3.6.1/plugins/ipmidirect/ipmi_mc_vendor_intel.cpp0000644000175100017510000002625412575647277022715 0ustar mohanmohan/* * Intel specific code * * Copyright (c) 2004-2006 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Andy Cress */ #include "ipmi_mc_vendor_intel.h" #include "ipmi_utils.h" #include "ipmi_log.h" #include "ipmi_mc.h" #include "ipmi_domain.h" // #include #define HSC_SA 0xc0 /*slave address of HSC mc*/ int g_enableHSC = 0; /* flag to detect whether an HSC is present */ /*--------------------------------------- * cIpmiMcVendorIntelBmc object *---------------------------------------*/ cIpmiMcVendorIntelBmc::cIpmiMcVendorIntelBmc( unsigned int product_id ) : cIpmiMcVendor( 0x000157, product_id, "Intel BMC" ) { /* instantiate the cIpmiMcVendorIntelBmc */ } cIpmiMcVendorIntelBmc::~cIpmiMcVendorIntelBmc() { } bool cIpmiMcVendorIntelBmc::InitMc( cIpmiMc *mc, const cIpmiMsg &devid ) { stdlog << "Intel InitMc[" << mc->ManufacturerId() << "," << mc->ProductId() << "]: addr = " << mc->GetAddress() << "\n"; /* Set the m_busid for Leds */ switch(mc->ProductId()) { case 0x0022: m_busid = PRIVATE_BUS_ID5; break; /*TIGI2U*/ case 0x001B: m_busid = PRIVATE_BUS_ID; break; /*TIGPR2U*/ case 0x4311: m_busid = PERIPHERAL_BUS_ID; break; /*TIGPT1U mBMC*/ case 0x0026: case 0x0028: /*S5000PAL*/ case 0x0029: case 0x0811: m_busid = PRIVATE_BUS_ID7; break; /*TIGW1U*/ case 0x003E: /*S5520UR*/ case 0x0048: /*S1200BT*/ case 0x0049: /*S2600GL*/ case 0x004A: /*S2600CP*/ case 0x004D: /*S2600JF*/ case 0x004F: /*S2400SC*/ case 0x0051: /*S2400EP*/ case 0x0055: /*S2600IP*/ case 0x0056: /*W2600CR*/ case 0x005C: /*S4600LH*/ case 0x005D: /*S2600CO*/ case 0x0900: /*TIGPR2U HSC*/ case 0x0911: /*TIGI2U HSC*/ case 0x0A0C: /*TIGW1U HSC*/ default: m_busid = PRIVATE_BUS_ID; break; } if (mc->IsTcaMc()) return true; /* * If here, the MC has (manuf_id == 0x000157) Intel, and * product_id == one of these: { 0x000C, 0x001B, 0x0022, 0x4311, * 0x0100, 0x0026, 0x0028, 0x0811 }; * These return GetDeviceID with ProvidesDeviceSdrs() == true, and * use the SDR Repository. */ mc->SetProvidesDeviceSdrs(false); mc->IsRmsBoard() = true; /* * The FRUSDR should be set at the factory, so don't change it here. * Don't clear the SEL here either. */ return true; } bool cIpmiMcVendorIntelBmc::CreateControls(cIpmiDomain *dom, cIpmiMc * mc, cIpmiSdrs * sdrs ) { const char *name; char dstr[80]; int i; if (mc->IsTcaMc()) return true; for ( int j = 0; j < mc->NumResources(); j++ ) { cIpmiResource *res = mc->GetResource( j ); if ( res == 0 ) continue; /* Note that the RPT has not been Populated yet */ if (res->FruId() == 0) { /* Create the alarm LED RDRs for the baseboard */ for (i = 0; i <= LED_IDENT; i++) { cIpmiControlIntelRmsLed *led = new cIpmiControlIntelRmsLed( mc, i); led->EntityPath() = res->EntityPath(); switch (i) { case LED_POWER: name = "Power Alarm LED"; break; case LED_CRIT: name = "Critical Alarm LED"; break; case LED_MAJOR: name = "Major Alarm LED"; break; case LED_MINOR: name = "Minor Alarm LED"; break; case LED_IDENT: name = "Chassis Identify LED"; break; default: snprintf(dstr,sizeof(dstr),"Control LED %d",i); name = dstr; break; } led->IdString().SetAscii(name, SAHPI_TL_TYPE_TEXT, SAHPI_LANG_ENGLISH); res->AddRdr( led ); led->m_busid = m_busid; } break; } } return true; } bool cIpmiMcVendorIntelBmc::ProcessSdr( cIpmiDomain *domain, cIpmiMc *mc, cIpmiSdrs *sdrs ) { if ( mc->GetAddress() != 0x20 ) { stdlog << "Intel MC " << mc->GetAddress() << " skipped\n"; return true; } stdlog << "Intel MC " << mc->GetAddress() << ", ProcessSdr\n"; /* Cannot enable Watchdog here because RPT is not built yet. */ /* * Sort through the SDR DeviceLocatorRecords and handle them. * e.g.: slave address 0xc0 (HSC) or 0x28 (IPMB Bridge), */ for( unsigned int i = 0; i < sdrs->NumSdrs(); i++ ) { cIpmiSdr *sdr = sdrs->Sdr( i ); switch( sdr->m_type ) { case eSdrTypeMcDeviceLocatorRecord: stdlog << "Intel SDR[" << i << "] Locator " << sdr->m_data[5] << "\n"; if (sdr->m_data[5] == HSC_SA) g_enableHSC = 1; break; default: break; } } return true; } bool cIpmiMcVendorIntelBmc::ProcessFru( cIpmiInventory *inv, cIpmiMc *mc, unsigned int sa, SaHpiEntityTypeT type ) { stdlog << "ProcessFru: Intel MC " << sa << " enableHSC " << g_enableHSC << "\n"; if (mc->IsTcaMc()) return true; if (type == SAHPI_ENT_SYSTEM_BOARD) { cIpmiResource *res = inv->Resource(); stdlog << "ProcessFru: found " << inv->IdString() << " id " << res->m_resource_id << "\n"; /* RPTs are not built yet, so we can't enable RESET here */ /* see ipmi_resource.cpp for that. */ } else if ((sa != mc->GetAddress()) && (type != SAHPI_ENT_SYSTEM_BOARD)) { /* g_enableHSC == 1 */ stdlog << "ProcessFru: " << inv->IdString() << " setting addr " << mc->GetAddress() << " to " << sa << " type " << type << "\n"; cIpmiAddr addr(eIpmiAddrTypeIpmb,mc->GetChannel(),0,sa); inv->SetAddr(addr); } return true; } /*--------------------------------------- * cIpmiControlIntelRmsLed object *---------------------------------------*/ cIpmiControlIntelRmsLed::cIpmiControlIntelRmsLed( cIpmiMc *mc, unsigned int num) : cIpmiControl( mc, num, SAHPI_CTRL_LED, SAHPI_CTRL_TYPE_DIGITAL ) { } cIpmiControlIntelRmsLed::~cIpmiControlIntelRmsLed() { } bool cIpmiControlIntelRmsLed::CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ) { int n; if ( cIpmiControl::CreateRdr( resource, rdr ) == false ) return false; n = rdr.RdrTypeUnion.CtrlRec.Num; // rdr->RdrTypeUnion.CtrlRec.Num = n; rdr.RdrTypeUnion.CtrlRec.Oem = OEM_ALARM_BASE + n; rdr.RdrTypeUnion.CtrlRec.Type = SAHPI_CTRL_TYPE_DIGITAL; rdr.RdrTypeUnion.CtrlRec.OutputType = SAHPI_CTRL_LED; if (n == LED_IDENT) /* Identify LED */ rdr.RdrTypeUnion.CtrlRec.WriteOnly = SAHPI_TRUE; else rdr.RdrTypeUnion.CtrlRec.WriteOnly = SAHPI_FALSE; stdlog << "Intel:CreateRdr(Led): num = " << n << " oem_num = " << rdr.RdrTypeUnion.CtrlRec.Oem << "\n"; return true; } SaErrorT cIpmiControlIntelRmsLed::GetState( SaHpiCtrlModeT &mode, SaHpiCtrlStateT &state ) { unsigned char mask = 0x01; int i; SaErrorT rv = SA_OK; /*TODO: add GetAlarmsPicmg() if ATCA */ int idx = m_num; // m_oem - OEM_ALARM_BASE; if (idx == LED_IDENT) { /* Identify LED */ mode = SAHPI_CTRL_MODE_MANUAL; state.Type = SAHPI_CTRL_TYPE_DIGITAL; state.StateUnion.Digital = SAHPI_CTRL_STATE_OFF; return rv; } unsigned char val = GetAlarms(); mode = SAHPI_CTRL_MODE_MANUAL; /* or SAHPI_CTRL_MODE_AUTO */ state.Type = SAHPI_CTRL_TYPE_DIGITAL; for (i = 0; i < idx; i++) mask = mask << 1; if ((val & mask) == 0) state.StateUnion.Digital = SAHPI_CTRL_STATE_ON; else state.StateUnion.Digital = SAHPI_CTRL_STATE_OFF; stdlog << "Led:GetState(" << idx << "): mode = " << mode << " state = " << state.StateUnion.Digital << "\n"; return rv; } SaErrorT cIpmiControlIntelRmsLed::SetState( const SaHpiCtrlModeT &mode, const SaHpiCtrlStateT &state ) { static unsigned char id_time = 20; /*id_time = 20 seconds*/ unsigned char mask = 0x01; unsigned char val, newval; int i; SaErrorT rv = SA_OK; /*TODO: add SetAlarmsPicmg() if ATCA */ int idx = m_num; // m_oem - OEM_ALARM_BASE; if (idx == LED_IDENT) { /* Identify LED */ rv = SetIdentify(id_time); /* turn ID on for id_time seconds */ return rv; } val = GetAlarms(); for (i = 0; i < idx; i++) mask = mask << 1; if (state.StateUnion.Digital == SAHPI_CTRL_STATE_ON) { mask = ~mask; /*NOT*/ newval = val & mask; } else { newval = val | mask; } rv = SetAlarms(newval); stdlog << "Led:SetAlarms(" << idx << ") " << "state = " << state.StateUnion.Digital << " rv = " << rv << "\n"; return rv; } void cIpmiControlIntelRmsLed::Dump( cIpmiLog &dump, const char *name ) const { dump.Begin( "LedControl", name ); dump.End(); } unsigned char cIpmiControlIntelRmsLed::GetAlarms( void ) { cIpmiMsg msg( eIpmiNetfnApp, eIpmiCmdMasterReadWrite ); msg.m_data[0] = m_busid; msg.m_data[1] = ALARMS_PANEL_READ; msg.m_data[2] = 0x01; msg.m_data_len = 3; cIpmiMsg rsp; SaErrorT rv = Resource()->SendCommandReadLock( this, msg, rsp ); if (rv != SA_OK) return(0); // uchar cc = rsp.m_data[0]; return(rsp.m_data[1]); } unsigned char cIpmiControlIntelRmsLed::GetAlarmsPicmg( unsigned char picmg_id, unsigned char fruid) { cIpmiMsg msg( eIpmiNetfnPicmg, eIpmiCmdGetFruLedState ); cIpmiMsg rsp; msg.m_data[0] = picmg_id; msg.m_data[1] = fruid; msg.m_data[2] = 0; /* blue LED */ msg.m_data_len = 3; SaErrorT rv = Resource()->SendCommandReadLock( this, msg, rsp ); if (rv == 0 && rsp.m_data[0] != 0) rv = rsp.m_data[0]; /*comp code*/ if (rv != 0) { stdlog << "GetAlarmsPicmg error rv = " << rv << "\n"; return(0); } return(rsp.m_data[6]); /*status byte*/ } int cIpmiControlIntelRmsLed::SetAlarmsPicmg( unsigned char picmg_id, unsigned char fruid, unsigned char val) { cIpmiMsg msg( eIpmiNetfnPicmg, eIpmiCmdSetFruLedState ); cIpmiMsg rsp; msg.m_data[0] = picmg_id; msg.m_data[1] = fruid; msg.m_data[2] = 0; /* blue LED */ msg.m_data[3] = val; msg.m_data[4] = 0; msg.m_data[5] = 1; /* color blue */ msg.m_data_len = 6; SaErrorT rv = Resource()->SendCommandReadLock( this, msg, rsp ); if (rv != 0) return(rv); if (rsp.m_data[0] != 0) rv = rsp.m_data[0]; /*comp code*/ return(rv); } int cIpmiControlIntelRmsLed::SetAlarms( unsigned char value) { cIpmiMsg msg( eIpmiNetfnApp, eIpmiCmdMasterReadWrite ); msg.m_data[0] = m_busid; msg.m_data[1] = ALARMS_PANEL_WRITE; msg.m_data[2] = 0x01; msg.m_data[3] = value; msg.m_data_len = 4; cIpmiMsg rsp; SaErrorT rv = Resource()->SendCommandReadLock( this, msg, rsp ); if (rv != 0) return(rv); if (rsp.m_data[0] != 0) rv = rsp.m_data[0]; /*comp code*/ return(rv); } int cIpmiControlIntelRmsLed::SetIdentify( unsigned char tval) { cIpmiMsg msg( eIpmiNetfnChassis, eIpmiCmdChassisIdentify ); msg.m_data[0] = tval; /*num seconds*/ msg.m_data_len = 1; cIpmiMsg rsp; SaErrorT rv = Resource()->SendCommandReadLock( this, msg, rsp ); if (rv != 0) return(rv); if (rsp.m_data[0] != 0) rv = rsp.m_data[0]; /*comp code*/ return(rv); } /*end of ipmi_mc_vendor_intel.cpp */ openhpi-3.6.1/plugins/ipmidirect/ipmi_inventory_parser.h0000644000175100017510000001365212575647277022622 0ustar mohanmohan /* * ipmi_inventory_parser.h * * Copyright (c) 2004 by FORCE Computers * Copyright (c) 2005 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #ifndef dIpmiInventoryParser_h #define dIpmiInventoryParser_h #ifndef dArray_h #include "array.h" #endif #ifndef dIpmiTextBuffer #include "ipmi_text_buffer.h" #endif unsigned char IpmiChecksum( const unsigned char *data, int size ); unsigned char IpmiChecksumMulti( const unsigned char *data, int size, unsigned char csum ); enum tIpmiInventoryRecordType { eIpmiInventoryRecordTypeInternal, eIpmiInventoryRecordTypeChassis, eIpmiInventoryRecordTypeBoard, eIpmiInventoryRecordTypeProduct, eIpmiInventoryRecordTypeMultiRecord, eIpmiInventoryRecordTypeLast }; const char *IpmiInventoryRecordTypeToString( tIpmiInventoryRecordType ); #define eIpmiInventoryMultiRecordTypeOemFirst 0xc0 #define eIpmiInventoryMultiRecordTypeOemLast 0xff class cIpmiInventoryField { cIpmiTextBuffer m_ipmi_text_buffer; SaHpiIdrFieldT m_idr_field; public: cIpmiInventoryField(SaHpiEntryIdT area_id, SaHpiEntryIdT field_id, SaHpiIdrFieldTypeT field_type); virtual ~cIpmiInventoryField(); void SetAscii( char *str, int size ); void SetBinary( const unsigned char *data, unsigned int size ); SaHpiEntryIdT FieldId() const { return m_idr_field.FieldId; } SaHpiIdrFieldTypeT FieldType() const { return m_idr_field.Type; } SaHpiIdrFieldT Field() const { return m_idr_field; } SaErrorT ReadTextBuffer( const unsigned char *&data, unsigned int &size ); }; class cIpmiInventoryArea { protected: SaHpiEntryIdT m_field_id; SaHpiIdrAreaHeaderT m_area_header; cArray m_field_array; public: cIpmiInventoryArea(SaHpiEntryIdT area_id); virtual ~cIpmiInventoryArea(); cIpmiInventoryField *FindIdrField( SaHpiIdrFieldTypeT fieldtype, SaHpiEntryIdT fieldid ); SaErrorT GetIdrField( SaHpiIdrFieldTypeT &fieldtype, SaHpiEntryIdT &fieldid, SaHpiEntryIdT &nextfieldid, SaHpiIdrFieldT &field ); SaHpiEntryIdT AreaId() const { return m_area_header.AreaId; } SaHpiIdrAreaTypeT AreaType() const { return m_area_header.Type; } SaHpiIdrAreaHeaderT AreaHeader() const { return m_area_header; } virtual SaErrorT ParseFruArea( const unsigned char *data, unsigned int size ) = 0; }; class cIpmiInventoryAreaInternal : public cIpmiInventoryArea { public: cIpmiInventoryAreaInternal(SaHpiEntryIdT area_id); virtual ~cIpmiInventoryAreaInternal(); virtual SaErrorT ParseFruArea( const unsigned char *data, unsigned int size ); }; class cIpmiInventoryAreaMultiRecord : public cIpmiInventoryArea { public: cIpmiInventoryAreaMultiRecord(SaHpiEntryIdT area_id); virtual ~cIpmiInventoryAreaMultiRecord(); virtual SaErrorT ParseFruArea( const unsigned char *data, unsigned int size ); }; class cIpmiInventoryAreaChassis : public cIpmiInventoryArea { public: cIpmiInventoryAreaChassis(SaHpiEntryIdT area_id); virtual ~cIpmiInventoryAreaChassis(); virtual SaErrorT ParseFruArea( const unsigned char *data, unsigned int size ); }; class cIpmiInventoryAreaBoard : public cIpmiInventoryArea { public: cIpmiInventoryAreaBoard(SaHpiEntryIdT area_id); virtual ~cIpmiInventoryAreaBoard(); virtual SaErrorT ParseFruArea( const unsigned char *data, unsigned int size ); }; class cIpmiInventoryAreaProduct : public cIpmiInventoryArea { public: cIpmiInventoryAreaProduct(SaHpiEntryIdT area_id); virtual ~cIpmiInventoryAreaProduct(); virtual SaErrorT ParseFruArea( const unsigned char *data, unsigned int size ); }; class cIpmiInventoryParser { SaHpiIdrInfoT m_idr_info; SaHpiEntryIdT m_area_id; cArray m_area_array; public: cIpmiInventoryParser(); virtual ~cIpmiInventoryParser(); cIpmiInventoryArea *AllocArea( SaHpiEntryIdT area_id, tIpmiInventoryRecordType type ); virtual SaErrorT ParseFruInfo( const unsigned char *data, unsigned int size, unsigned int idr_id ); cIpmiInventoryArea *FindIdrArea( SaHpiIdrAreaTypeT areatype, SaHpiEntryIdT areaid ); virtual SaErrorT GetIdrInfo( SaHpiIdrIdT &idrid, SaHpiIdrInfoT &idrinfo ); virtual SaErrorT GetIdrAreaHeader( SaHpiIdrIdT &idrid, SaHpiIdrAreaTypeT &areatype, SaHpiEntryIdT &areaid, SaHpiEntryIdT &nextareaid, SaHpiIdrAreaHeaderT &header ); virtual SaErrorT AddIdrArea( SaHpiIdrIdT &idrid, SaHpiIdrAreaTypeT &areatype, SaHpiEntryIdT &areaid ); virtual SaErrorT DelIdrArea( SaHpiIdrIdT &idrid, SaHpiEntryIdT &areaid ); virtual SaErrorT GetIdrField( SaHpiIdrIdT &idrid, SaHpiEntryIdT &areaid, SaHpiIdrFieldTypeT &fieldtype, SaHpiEntryIdT &fieldid, SaHpiEntryIdT &nextfieldid, SaHpiIdrFieldT &field ); virtual SaErrorT AddIdrField( SaHpiIdrIdT &idrid, SaHpiIdrFieldT &field ); virtual SaErrorT SetIdrField( SaHpiIdrIdT &idrid, SaHpiIdrFieldT &field ); virtual SaErrorT DelIdrField( SaHpiIdrIdT &idrid, SaHpiEntryIdT &areaid, SaHpiEntryIdT &fieldid ); }; #endif openhpi-3.6.1/plugins/ipmidirect/ipmi_fru_info.h0000644000175100017510000000544112575647277021015 0ustar mohanmohan/* * ipmi_fru_info.h * * Copyright (c) 2004 by FORCE Computers. * Copyright (c) 2005 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #ifndef dIpmiFruInfo_h #define dIpmiFruInfo_h #ifndef dIpmiEntity_h #include "ipmi_entity.h" #endif enum tIpmiAtcaSiteType { eIpmiAtcaSiteTypeAtcaBoard = 0, eIpmiAtcaSiteTypePowerEntryModule = 1, eIpmiAtcaSiteTypeShelfFruInformation = 2, eIpmiAtcaSiteTypeDedicatedShMc = 3, eIpmiAtcaSiteTypeFanTray = 4, eIpmiAtcaSiteTypeFanFilterTray = 5, eIpmiAtcaSiteTypeAlarm = 6, eIpmiAtcaSiteTypeAdvancedMcModule = 7, eIpmiAtcaSiteTypePMC = 8, eIpmiAtcaSiteTypeRearTransitionModule = 9, eIpmiAtcaSiteTypeMicroTcaCarrierHub = 10, eIpmiAtcaSiteTypePowerModule = 11, eIpmiAtcaSiteTypeUnknown }; SaHpiEntityTypeT MapAtcaSiteTypeToEntity( tIpmiAtcaSiteType type ); class cIpmiFruInfo { unsigned int m_addr; unsigned int m_fru_id; unsigned int m_slot; SaHpiEntityTypeT m_entity; tIpmiAtcaSiteType m_site; // only valid if m_fru_id == 0 // dIpmiMcThreadXXXX properties unsigned int m_properties; public: cIpmiFruInfo( unsigned int addr, unsigned int fru_id, SaHpiEntityTypeT entity, unsigned int slot, tIpmiAtcaSiteType site, unsigned int properties ); virtual ~cIpmiFruInfo(); unsigned int Address() { return m_addr; } unsigned int FruId() { return m_fru_id; } SaHpiEntityTypeT &Entity() { return m_entity; } unsigned int &Slot() { return m_slot; } tIpmiAtcaSiteType &Site() { return m_site; } unsigned int Properties() { return m_properties; } virtual cIpmiEntityPath CreateEntityPath( const cIpmiEntityPath &top, const cIpmiEntityPath &bottom ); }; class cIpmiFruInfoContainer { GList *m_fru_info; public: cIpmiFruInfoContainer(); ~cIpmiFruInfoContainer(); cIpmiFruInfo *FindFruInfo( unsigned int addr, unsigned int fru_id ) const; bool AddFruInfo( cIpmiFruInfo *fru_info ); bool RemFruInfo( cIpmiFruInfo *fru_info ); cIpmiFruInfo *NewFruInfo( unsigned int addr, unsigned int fru_id, SaHpiEntityTypeT entity, unsigned int slot, tIpmiAtcaSiteType site, unsigned int properties ); cIpmiFruInfo *NewFruInfo( unsigned int addr, unsigned int fru_id ); unsigned int GetFreeSlotForOther( unsigned int addr ); GList *GetFruInfoList() const { return m_fru_info; } }; #endif openhpi-3.6.1/plugins/ipmidirect/ipmi_control_sun_led.cpp0000644000175100017510000000723412575647277022734 0ustar mohanmohan/* * Copyright (c) 2009 by Sun Microsystems, Inc. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Chris Rinaldo */ #include "ipmi_control_sun_led.h" #include "ipmi_resource.h" cIpmiControlSunLed::cIpmiControlSunLed(cIpmiMc* mc, unsigned int num, uint8_t dev_access_addr, uint8_t dev_slave_addr, uint8_t entity_id, uint8_t entity_inst, uint8_t oem, SaHpiBoolT read_only) : cIpmiControl(mc, num, SAHPI_CTRL_LED, SAHPI_CTRL_TYPE_OEM), m_dev_access_addr(dev_access_addr), m_dev_slave_addr(dev_slave_addr), m_entity_id(entity_id), m_entity_inst(entity_inst), m_oem(oem), m_read_only(read_only) { } cIpmiControlSunLed::~cIpmiControlSunLed() { } bool cIpmiControlSunLed::CreateRdr(SaHpiRptEntryT& resource, SaHpiRdrT& rdr) { if (cIpmiControl::CreateRdr(resource, rdr) == false) return false; rdr.RdrTypeUnion.CtrlRec.OutputType = SAHPI_CTRL_LED; rdr.RdrTypeUnion.CtrlRec.Type = SAHPI_CTRL_TYPE_OEM; rdr.RdrTypeUnion.CtrlRec.TypeUnion.Oem.MId = 0x2a; rdr.RdrTypeUnion.CtrlRec.TypeUnion.Oem.ConfigData[0] = m_oem; rdr.RdrTypeUnion.CtrlRec.TypeUnion.Oem.Default.MId = 0x2a; rdr.RdrTypeUnion.CtrlRec.TypeUnion.Oem.Default.BodyLength = 1; rdr.RdrTypeUnion.CtrlRec.TypeUnion.Oem.Default.Body[0] = 0; rdr.RdrTypeUnion.CtrlRec.DefaultMode.Mode = SAHPI_CTRL_MODE_AUTO; rdr.RdrTypeUnion.CtrlRec.DefaultMode.ReadOnly = m_read_only; rdr.RdrTypeUnion.CtrlRec.WriteOnly = SAHPI_FALSE; return true; } SaErrorT cIpmiControlSunLed::GetState(SaHpiCtrlModeT& mode, SaHpiCtrlStateT& state) { mode = SAHPI_CTRL_MODE_AUTO; state.Type = SAHPI_CTRL_TYPE_OEM; cIpmiMsg ledmsg(eIpmiNetfnOem, eIpmiCmdSunOemLedGet); ledmsg.m_data[0] = m_dev_slave_addr; ledmsg.m_data[1] = m_oem; ledmsg.m_data[2] = m_dev_access_addr; ledmsg.m_data[3] = m_oem; ledmsg.m_data[4] = m_entity_id; ledmsg.m_data[5] = m_entity_inst; ledmsg.m_data[6] = 0; ledmsg.m_data_len = 7; cIpmiMsg ledrsp; SaErrorT rv = Resource()->SendCommandReadLock(this, ledmsg, ledrsp); if (rv != SA_OK) return rv; if (ledrsp.m_data_len != 2 || ledrsp.m_data[0] != eIpmiCcOk) return SA_ERR_HPI_ERROR; state.StateUnion.Oem.MId = 0x2a; state.StateUnion.Oem.BodyLength = 1; state.StateUnion.Oem.Body[0] = ledrsp.m_data[1]; return SA_OK; } SaErrorT cIpmiControlSunLed::SetState(const SaHpiCtrlModeT& mode, const SaHpiCtrlStateT& state) { if (state.StateUnion.Oem.Body[0] > eLedStateFastBlink) { return SA_ERR_HPI_INVALID_DATA; } cIpmiMsg ledmsg(eIpmiNetfnOem, eIpmiCmdSunOemLedSet); ledmsg.m_data[0] = m_dev_slave_addr; ledmsg.m_data[1] = m_oem; ledmsg.m_data[2] = m_dev_access_addr; ledmsg.m_data[3] = m_oem; ledmsg.m_data[4] = state.StateUnion.Oem.Body[0]; // mode ledmsg.m_data[5] = m_entity_id; ledmsg.m_data[6] = m_entity_inst; ledmsg.m_data[7] = 0; // force ledmsg.m_data[8] = 0; // role ledmsg.m_data_len = 9; cIpmiMsg ledrsp; SaErrorT rv = Resource()->SendCommandReadLock(this, ledmsg, ledrsp); if (rv != SA_OK) return rv; if (ledrsp.m_data[0] == eIpmiCcInvalidCmd) return SA_ERR_HPI_UNSUPPORTED_PARAMS; if (ledrsp.m_data[0] == eIpmiCcInsufficientPrivilege) return SA_ERR_HPI_READ_ONLY; if (ledrsp.m_data[0] != eIpmiCcOk) return SA_ERR_HPI_ERROR; return SA_OK; } void cIpmiControlSunLed::Dump(cIpmiLog& dump, const char* name) const { dump.Begin("Sun LED", name); dump.End(); } openhpi-3.6.1/plugins/ipmidirect/ipmi_discover.h0000644000175100017510000000444412575647277021026 0ustar mohanmohan/* * * Copyright (c) 2004 by FORCE Computers * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #ifndef dIpmiDiscover_h #define dIpmiDiscover_h class cIpmiDomain; class cIpmiMcThread; class cIpmiMcTask; // cIpmiMcThread::m_properties #define dIpmiMcThreadInitialDiscover 1 // discover at startup #define dIpmiMcThreadPollAliveMc 2 // poll mc if found #define dIpmiMcThreadPollDeadMc 4 // poll mc if not found #define dIpmiMcThreadCreateM0 8 // create hotswap state M0 typedef void (cIpmiMcThread::*tIpmiMcTask)( void *userdata ); class cIpmiMcThread : public cThread { private: cIpmiDomain *m_domain; void WriteLock(); void WriteUnlock(); unsigned char m_addr; unsigned char m_chan; cIpmiMc *m_mc; // properties unsigned int m_properties; // dIpmiMcThreadXXXX public: cIpmiMc *Mc() { return m_mc; } protected: virtual void *Run(); public: // signal to MC thread to exit bool m_exit; cIpmiMcThread( cIpmiDomain *domain, unsigned char addr, unsigned int properties ); ~cIpmiMcThread(); protected: cIpmiMcTask *m_tasks; public: // add a task to MC thread void AddMcTask( tIpmiMcTask task, const cTime &timeout, void *userdata ); // add a task to MC thread void AddMcTask( tIpmiMcTask task, unsigned int diff_ms, void *userdata ); // remove MC task from list bool RemMcTask( void *userdata ); // clear the MC task list void ClearMcTaskList(); protected: // discover MC void Discover( cIpmiMsg *get_device_id_rsp = 0 ); // poll mc task void PollAddr( void *userdata ); cIpmiSel *m_sel; // read SEL task void ReadSel( void *userdata ); GList *m_events; cThreadLock m_events_lock; void HandleEvents(); void HandleEvent( cIpmiEvent *event ); void HandleHotswapEvent( cIpmiSensorHotswap *sensor, cIpmiEvent *event ); public: void AddEvent( cIpmiEvent *event ); }; #endif openhpi-3.6.1/plugins/ipmidirect/ipmi_watchdog.h0000644000175100017510000000230312575647277021000 0ustar mohanmohan/* * ipmi_watchdog.h * * Copyright (c) 2006 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Pierre Sangouard */ #ifndef dIpmiWatchdog_h #define dIpmiWatchdog_h #ifndef dIpmiRdr_h #include "ipmi_rdr.h" #endif extern "C" { #include "SaHpi.h" } class cIpmiWatchdog : public cIpmiRdr { protected: unsigned int m_num; // control num unsigned int m_oem; public: cIpmiWatchdog( cIpmiMc *mc, unsigned int num, unsigned int oem ); ~cIpmiWatchdog(); unsigned int Num() const { return m_num; } unsigned int Oem() const { return m_oem; } // create an RDR sensor record bool CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ); SaErrorT GetWatchdogInfo( SaHpiWatchdogT &watchdog); SaErrorT SetWatchdogInfo( SaHpiWatchdogT &watchdog); SaErrorT ResetWatchdog(); }; #endif openhpi-3.6.1/plugins/ipmidirect/ipmi_msg.cpp0000644000175100017510000000275712575647277020336 0ustar mohanmohan/* * * Copyright (c) 2003 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include #include #include "ipmi_msg.h" cIpmiMsg::cIpmiMsg() : m_netfn( eIpmiNetfnChassis ), m_cmd( eIpmiCmdGetChassisCapabilities ), m_data_len( 0 ), m_sa( 0 ), m_chan ( 0 ) { } cIpmiMsg::cIpmiMsg( tIpmiNetfn netfn, tIpmiCmd cmd, unsigned short data_len, unsigned char *data, unsigned char sa, unsigned char chan ) : m_netfn( netfn ), m_cmd( cmd ) { if ( data_len <= dIpmiMaxMsgLength ) m_data_len = data_len; else m_data_len = dIpmiMaxMsgLength; if ( data ) { memcpy( m_data, data, m_data_len ); } if (chan != 0) { m_sa = sa; m_chan = chan; } else { m_sa = dIpmiBmcSlaveAddr; //0x20 m_chan = 0; } } bool cIpmiMsg::Equal( const cIpmiMsg &msg2 ) const { if ( m_netfn != msg2.m_netfn || m_cmd != msg2.m_cmd || m_data_len != msg2.m_data_len ) return false; if ( m_data_len ) if ( memcmp( m_data, msg2.m_data, m_data_len ) ) return false; return true; } openhpi-3.6.1/plugins/ipmidirect/ipmi_addr.cpp0000644000175100017510000000261412575647277020452 0ustar mohanmohan/* * * Copyright (c) 2003 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include "ipmi_addr.h" #include "ipmi_log.h" #include int cIpmiAddr::Cmp( const cIpmiAddr &addr ) const { int v = (int)addr.m_type - (int)m_type; if ( v ) return v; v = (int)addr.m_channel - (int)m_channel; if ( v ) return v; v = (int)addr.m_lun - (int)m_lun; if ( v ) return v; v = (int)addr.m_slave_addr - (int)m_slave_addr; return v; } void cIpmiAddr::Log() const { switch( m_type ) { case eIpmiAddrTypeSystemInterface: stdlog << "si <" << m_channel << " " << m_lun << ">"; break; case eIpmiAddrTypeIpmb: stdlog << "ipmb <" << m_channel << " " << m_lun << " " << (unsigned char)m_slave_addr << ">"; break; case eIpmiAddrTypeIpmbBroadcast: stdlog << "bc <" << m_channel << " " << m_lun << " " << (unsigned char)m_slave_addr << ">"; break; } } openhpi-3.6.1/plugins/ipmidirect/ipmi_con_smi.cpp0000644000175100017510000002567612575647277021204 0ustar mohanmohan/* * * Copyright (c) 2004 by FORCE Computers * Copyright (c) 2007 by ESO Technologies. * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #include #include #include #include #include #include #include #include #if defined(__sun) && defined(__SVR4) #include #include #include #endif #include "ipmi_con_smi.h" // This is an overlay for all the address types, so it's easy to // determine the actual address type. This is kind of like addresses // work for sockets. #define IPMI_MAX_ADDR_SIZE 32 struct ipmi_addr { // Try to take these from the "Channel Medium Type" table // in section 6.5 of the IPMI 1.5 manual. int addr_type; short channel; char data[IPMI_MAX_ADDR_SIZE]; }; // When the address is not used, the type will be set to this value. // The channel is the BMC's channel number for the channel (usually // 0), or IPMC_BMC_CHANNEL if communicating directly with the BMC. #define IPMI_SYSTEM_INTERFACE_ADDR_TYPE 0x0c struct ipmi_system_interface_addr { int addr_type; short channel; unsigned char lun; }; // An IPMB Address. #define IPMI_IPMB_ADDR_TYPE 0x01 // Used for broadcast get device id as described in section 17.9 of the // IPMI 1.5 manual. #define IPMI_IPMB_BROADCAST_ADDR_TYPE 0x41 struct ipmi_ipmb_addr { int addr_type; short channel; unsigned char slave_addr; unsigned char lun; }; // Channel for talking directly with the BMC. When using this // channel, This is for the system interface address type only. FIXME // - is this right, or should we use -1? #define IPMI_BMC_CHANNEL 0xf #define IPMI_NUM_CHANNELS 0x10 // A raw IPMI message without any addressing. This covers both // commands and responses. The completion code is always the first // byte of data in the response (as the spec shows the messages laid // out). struct ipmi_msg { unsigned char netfn; unsigned char cmd; unsigned short data_len; unsigned char *data; }; // Messages sent to the interface are this format. struct ipmi_req { unsigned char *addr; // Address to send the message to. unsigned int addr_len; long msgid; // The sequence number for the message. This // exact value will be reported back in the // response to this request if it is a command. // If it is a response, this will be used as // the sequence value for the response. struct ipmi_msg msg; }; // Receive types for messages coming from the receive interface. This // is used for the receive in-kernel interface and in the receive // IOCTL. #define IPMI_RESPONSE_RECV_TYPE 1 // A response to a command #define IPMI_ASYNC_EVENT_RECV_TYPE 2 // Something from the event queue #define IPMI_CMD_RECV_TYPE 3 // A command from somewhere else // Note that async events and received commands do not have a completion // code as the first byte of the incoming data, unlike a response. // Messages received from the interface are this format. struct ipmi_recv { int recv_type; // Is this a command, response or an // asyncronous event. unsigned char *addr; // Address the message was from is put // here. The caller must supply the // memory. unsigned int addr_len; // The size of the address buffer. // The caller supplies the full buffer // length, this value is updated to // the actual message length when the // message is received. long msgid; // The sequence number specified in the request // if this is a response. If this is a command, // this will be the sequence number from the // command. struct ipmi_msg msg; // The data field must point to a buffer. // The data_size field must be set to the // size of the message buffer. The // caller supplies the full buffer // length, this value is updated to the // actual message length when the message // is received. }; // Get/set the default timing values for an interface. You shouldn't // generally mess with these. struct ipmi_timing_parms { int retries; unsigned int retry_time_ms; }; // The magic IOCTL value for this interface. #define IPMI_IOC_MAGIC 'i' // Send a message to the interfaces. error values are: // - EFAULT - an address supplied was invalid. // - EINVAL - The address supplied was not valid, or the command // was not allowed. // - EMSGSIZE - The message to was too large. // - ENOMEM - Buffers could not be allocated for the command. #define IPMICTL_SEND_COMMAND _IOR(IPMI_IOC_MAGIC, 13, \ struct ipmi_req) // Like RECEIVE_MSG, but if the message won't fit in the buffer, it // will truncate the contents instead of leaving the data in the // buffer. #define IPMICTL_RECEIVE_MSG_TRUNC _IOWR(IPMI_IOC_MAGIC, 11, \ struct ipmi_recv) // Set whether this interface receives events. Note that the first // user registered for events will get all pending events for the // interface. error values: // - EFAULT - an address supplied was invalid. #define IPMICTL_SET_GETS_EVENTS_CMD _IOR(IPMI_IOC_MAGIC, 16, int) #define IPMICTL_SET_TIMING_PARMS_CMD _IOR(IPMI_IOC_MAGIC, 22, \ struct ipmi_timing_parms) cIpmiConSmi::cIpmiConSmi( unsigned int timeout, int log_level, int if_num ) : cIpmiCon( timeout, log_level ), m_if_num( if_num ) { } cIpmiConSmi::~cIpmiConSmi() { if ( IsOpen() ) Close(); } int cIpmiConSmi::OpenSmiFd( int if_num ) { int fd; char devname[30]; snprintf( devname, sizeof(devname), "/dev/ipmidev/%d", if_num ); fd = open( devname, O_RDWR ); if ( fd >= 0 ) return fd; snprintf( devname, sizeof(devname), "/dev/ipmi/%d", if_num ); fd = open( devname, O_RDWR ); if ( fd >= 0 ) return fd; snprintf( devname, sizeof(devname), "/dev/ipmi%d", if_num ); fd = open( devname, O_RDWR ); return fd; } int cIpmiConSmi::IfGetMaxSeq() { return dMaxSeq; } int cIpmiConSmi::IfOpen() { int fd = OpenSmiFd( m_if_num ); if ( fd < 0 ) return fd; struct ipmi_timing_parms parms; int rv; parms.retries = 0; parms.retry_time_ms = 1000; /* Some sensors take longer than 1 sec, use driver default. ARCress */ // rv = ioctl( fd, IPMICTL_SET_TIMING_PARMS_CMD, &parms ); if ( rv == -1 ) stdlog << "Warning: Could not set timing parms !\n"; // we want async events int val = 1; rv = ioctl( fd, IPMICTL_SET_GETS_EVENTS_CMD, &val ); if ( rv == -1 ) stdlog << "Warning: Could not set gets events !\n"; return fd; } void cIpmiConSmi::IfClose() { } SaErrorT cIpmiConSmi::IfSendCmd( cIpmiRequest *r ) { cIpmiAddr send_addr = r->m_send_addr; ipmi_addr addr; unsigned int addr_len = 0; addr.addr_type = (int)send_addr.m_type; // convert addr switch( send_addr.m_type ) { case eIpmiAddrTypeSystemInterface: { ipmi_system_interface_addr *si = (ipmi_system_interface_addr *)&addr; si->channel = send_addr.m_channel; si->lun = send_addr.m_lun; addr_len = sizeof( ipmi_system_interface_addr ); } break; case eIpmiAddrTypeIpmb: case eIpmiAddrTypeIpmbBroadcast: { ipmi_ipmb_addr *ipmb = (ipmi_ipmb_addr *)&addr; ipmb->channel = send_addr.m_channel; ipmb->slave_addr = send_addr.m_slave_addr; ipmb->lun = send_addr.m_lun; addr_len = sizeof( ipmi_ipmb_addr ); } break; default: return SA_ERR_HPI_INVALID_PARAMS; } struct ipmi_req req; req.addr = (unsigned char *)&addr; req.addr_len = addr_len; req.msg.netfn = r->m_msg.m_netfn; req.msg.cmd = r->m_msg.m_cmd; req.msg.data_len = r->m_msg.m_data_len; req.msg.data = r->m_msg.m_data; req.msgid = r->m_seq; int rv = ioctl( m_fd, IPMICTL_SEND_COMMAND, &req ); if ( rv ) return SA_ERR_HPI_INVALID_REQUEST; return SA_OK; } void cIpmiConSmi::IfReadResponse() { unsigned char data[dIpmiMaxMsgLength]; ipmi_addr addr; ipmi_recv recv; recv.msg.data = data; recv.msg.data_len = dIpmiMaxMsgLength; recv.addr = (unsigned char *)&addr; recv.addr_len = sizeof( ipmi_addr ); int rv = ioctl( m_fd, IPMICTL_RECEIVE_MSG_TRUNC, &recv ); if ( rv == -1 ) { if ( errno == EMSGSIZE ) // The message was truncated, handle it as such. data[0] = eIpmiCcRequestedDataLengthExceeded; else return; } // convert addr cIpmiAddr rsp_addr; rsp_addr.m_type = (tIpmiAddrType)addr.addr_type; switch( rsp_addr.m_type ) { case eIpmiAddrTypeSystemInterface: { ipmi_system_interface_addr *si = (ipmi_system_interface_addr *)&addr; rsp_addr.m_channel = si->channel; rsp_addr.m_lun = si->lun; } break; case eIpmiAddrTypeIpmb: case eIpmiAddrTypeIpmbBroadcast: { ipmi_ipmb_addr *ipmb = (ipmi_ipmb_addr *)&addr; rsp_addr.m_channel = ipmb->channel; rsp_addr.m_slave_addr = ipmb->slave_addr; rsp_addr.m_lun = ipmb->lun; } break; default: return; } // convert msg cIpmiMsg rsp; rsp.m_netfn = (tIpmiNetfn)recv.msg.netfn; rsp.m_cmd = (tIpmiCmd)recv.msg.cmd; rsp.m_data_len = recv.msg.data_len; if ( rsp.m_data_len ) memcpy( rsp.m_data, recv.msg.data, rsp.m_data_len ); int seq = (int)recv.msgid; switch( recv.recv_type ) { case IPMI_RESPONSE_RECV_TYPE: HandleResponse( seq, rsp_addr, rsp ); break; case IPMI_ASYNC_EVENT_RECV_TYPE: HandleEvent( rsp_addr, rsp ); break; case IPMI_CMD_RECV_TYPE: // incoming command stdlog << "SMI: incoming ipmi command " << IpmiCmdToString( rsp.m_netfn, rsp.m_cmd ) << ".\n"; break; default: break; } } openhpi-3.6.1/plugins/ipmidirect/ipmi_sensor_hotswap.cpp0000644000175100017510000002227112575647277022617 0ustar mohanmohan/* * ipmi_sensor_hotswap.cpp * * Copyright (c) 2004 by FORCE Computers * Copyright (c) 2005 by ESO Technologies. * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #include "ipmi_sensor_hotswap.h" #include "ipmi_domain.h" #include #include #include #include #include #include #include cIpmiSensorHotswap::cIpmiSensorHotswap( cIpmiMc *mc ) : cIpmiSensorDiscrete( mc ) { } cIpmiSensorHotswap::~cIpmiSensorHotswap() { } bool cIpmiSensorHotswap::GetDataFromSdr( cIpmiMc *mc, cIpmiSdr *sdr ) { if ( !cIpmiSensorDiscrete::GetDataFromSdr( mc, sdr ) ) return false; return true; } bool cIpmiSensorHotswap::CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ) { if ( cIpmiSensorDiscrete::CreateRdr( resource, rdr ) == false ) return false; cIpmiResource *res = Resource(); if( !res ) return false; if (EntityPath() == res->EntityPath()) { // update resource capabilities resource.ResourceCapabilities |= SAHPI_CAPABILITY_MANAGED_HOTSWAP; resource.HotSwapCapabilities |= SAHPI_HS_CAPABILITY_INDICATOR_SUPPORTED; } return true; } SaHpiHsStateT cIpmiSensorHotswap::ConvertIpmiToHpiHotswapState( tIpmiFruState h ) { switch( h ) { case eIpmiFruStateNotInstalled: return SAHPI_HS_STATE_NOT_PRESENT; case eIpmiFruStateInactive: return SAHPI_HS_STATE_INACTIVE; case eIpmiFruStateActivationRequest: return SAHPI_HS_STATE_INSERTION_PENDING; case eIpmiFruStateActivationInProgress: return SAHPI_HS_STATE_INSERTION_PENDING; case eIpmiFruStateActive: return SAHPI_HS_STATE_ACTIVE; case eIpmiFruStateDeactivationRequest: return SAHPI_HS_STATE_EXTRACTION_PENDING; case eIpmiFruStateDeactivationInProgress: return SAHPI_HS_STATE_EXTRACTION_PENDING; case eIpmiFruStateCommunicationLost: default: return SAHPI_HS_STATE_NOT_PRESENT; } } void cIpmiSensorHotswap::HandleEvent( cIpmiEvent *event ) { cIpmiResource *res = Resource(); if( !res ) { stdlog << "cIpmiSensorHotswap::HandleEvent: No resource !\n"; return; } tIpmiFruState state = (tIpmiFruState)(event->m_data[10] & 0x07); tIpmiFruState previous_state = (tIpmiFruState)(event->m_data[11] & 0x07); switch (state) { case eIpmiFruStateActivationInProgress: if (previous_state == eIpmiFruStateActivationRequest) { stdlog << "cIpmiSensorHotswap::HandleEvent: M2->M3 ignore\n"; res->PreviousPrevFruState() = previous_state; return; } break; case eIpmiFruStateDeactivationInProgress: if (previous_state == eIpmiFruStateDeactivationRequest) { stdlog << "cIpmiSensorHotswap::HandleEvent: M5->M6 ignore\n"; res->PreviousPrevFruState() = previous_state; return; } if (previous_state == eIpmiFruStateActivationInProgress) { stdlog << "cIpmiSensorHotswap::HandleEvent: M3->M6 ignore\n"; res->PreviousPrevFruState() = previous_state; return; } break; default: break; } oh_event *e = (oh_event *)g_malloc0( sizeof( struct oh_event ) ); SaHpiRptEntryT *rptentry = oh_get_resource_by_id( res->Domain()->GetHandler()->rptcache, res->m_resource_id ); if ( rptentry ) e->resource = *rptentry; else e->resource.ResourceCapabilities = 0; // hpi event SaHpiEventT &h = e->event; h.Source = res->m_resource_id; h.EventType = SAHPI_ET_HOTSWAP; // Default severity h.Severity = SAHPI_INFORMATIONAL; // Hot swap events must be dated here otherwise // hot swap policy won't work properly ! oh_gettimeofday(&h.Timestamp); SaHpiHotSwapEventT &he = h.EventDataUnion.HotSwapEvent; he.HotSwapState = ConvertIpmiToHpiHotswapState( state ); he.PreviousHotSwapState = ConvertIpmiToHpiHotswapState( previous_state ); switch (state) { case eIpmiFruStateNotInstalled: if (previous_state == eIpmiFruStateCommunicationLost) { he.PreviousHotSwapState = ConvertIpmiToHpiHotswapState( res->PreviousPrevFruState() ); } else if (previous_state != eIpmiFruStateInactive) { // get severity from plugin cache if ( rptentry ) h.Severity = rptentry->ResourceSeverity; } break; case eIpmiFruStateCommunicationLost: h.EventType = SAHPI_ET_RESOURCE; h.EventDataUnion.ResourceEvent.ResourceEventType = SAHPI_RESE_RESOURCE_FAILURE; stdlog << "cIpmiSensorHotswap::HandleEvent SAHPI_RESE_RESOURCE_FAILURE Event resource " << res->m_resource_id << "\n"; if ( rptentry ) { rptentry->ResourceFailed = SAHPI_TRUE; oh_add_resource(res->Domain()->GetHandler()->rptcache, rptentry, res, 1); h.Severity = rptentry->ResourceSeverity; } break; case eIpmiFruStateInactive: // M3->M6->M1 special case if ((previous_state == eIpmiFruStateDeactivationInProgress) && (res->PreviousPrevFruState() == eIpmiFruStateActivationInProgress)) { he.PreviousHotSwapState = SAHPI_HS_STATE_INSERTION_PENDING; if ( rptentry ) { h.Severity = rptentry->ResourceSeverity; } } default: if (previous_state == eIpmiFruStateCommunicationLost) { h.EventType = SAHPI_ET_RESOURCE; h.EventDataUnion.ResourceEvent.ResourceEventType = SAHPI_RESE_RESOURCE_RESTORED; stdlog << "cIpmiSensorHotswap::HandleEvent SAHPI_RESE_RESOURCE_RESTORED Event resource " << res->m_resource_id << "\n"; if ( rptentry ) { rptentry->ResourceFailed = SAHPI_FALSE; oh_add_resource(res->Domain()->GetHandler()->rptcache, rptentry, res, 1); h.Severity = rptentry->ResourceSeverity; } } break; } res->PreviousPrevFruState() = previous_state; if (h.EventType == SAHPI_ET_HOTSWAP) stdlog << "cIpmiSensorHotswap::HandleEvent SAHPI_ET_HOTSWAP Event resource " << res->m_resource_id << "\n"; m_mc->Domain()->AddHpiEvent( e ); if (h.EventType != SAHPI_ET_HOTSWAP) return; oh_event *oem_e = (oh_event *)g_malloc0( sizeof( struct oh_event ) ); if ( rptentry ) oem_e->resource = *rptentry; else oem_e->resource.ResourceCapabilities = 0; // hpi event SaHpiEventT &oem_h = oem_e->event; oem_h.Source = h.Source; oem_h.Timestamp = h.Timestamp; oem_h.EventType = SAHPI_ET_OEM; oem_h.Severity = SAHPI_INFORMATIONAL; SaHpiOemEventT &oem_he = oem_h.EventDataUnion.OemEvent; oem_he.MId = ATCAHPI_PICMG_MID; oem_he.OemEventData.DataType = SAHPI_TL_TYPE_TEXT; oem_he.OemEventData.Language = SAHPI_LANG_UNDEF; oem_he.OemEventData.DataLength = 3; oem_he.OemEventData.Data[0] = he.HotSwapState; oem_he.OemEventData.Data[1] = he.PreviousHotSwapState; switch ((event->m_data[11] >> 4) & 0x0F) { case 0x0: case 0x1: oem_he.OemEventData.Data[2] = 0; break; case 0x3: oem_he.OemEventData.Data[2] = 1; break; case 0x2: oem_he.OemEventData.Data[2] = 2; break; case 0x7: oem_he.OemEventData.Data[2] = 3; break; case 0x9: oem_he.OemEventData.Data[2] = 4; break; case 0x6: oem_he.OemEventData.Data[2] = 5; break; case 0x8: oem_he.OemEventData.Data[2] = 6; break; case 0xF: default: oem_he.OemEventData.Data[2] = 7; break; } stdlog << "cIpmiSensorHotswap::HandleEvent SAHPI_ET_OEM Event resource " << res->m_resource_id << "\n"; m_mc->Domain()->AddHpiEvent( oem_e ); } SaErrorT cIpmiSensorHotswap::GetPicmgState( tIpmiFruState &state ) { // read hotswap state cIpmiMsg rsp; // Default value just in case state = eIpmiFruStateCommunicationLost; SaErrorT rv = GetSensorData( rsp ); if ( rv != SA_OK ) { stdlog << "cannot get hotswap state !\n"; return rv; } // Reading should be 0 according to PICMG 3.0 specification // However if it's not this is not a fatal error so just flag it if ( rsp.m_data[1] != 0 ) { stdlog << "WARNING: hotswap sensor reading not 0 : " << rsp.m_data[1] << " !\n"; } unsigned int value = rsp.m_data[3]; for( int i = 0; i < 8; i++ ) if ( value & ( 1 << i ) ) { state = (tIpmiFruState)i; return SA_OK; } stdlog << "WRONG Hot Swap State " << value << "\n"; return SA_ERR_HPI_INVALID_DATA; } SaErrorT cIpmiSensorHotswap::GetHpiState( SaHpiHsStateT &state ) { tIpmiFruState fs; SaErrorT rv = GetPicmgState( fs ); if ( rv != SA_OK ) return rv; state = ConvertIpmiToHpiHotswapState( fs ); return SA_OK; } openhpi-3.6.1/plugins/ipmidirect/ipmi_mc_vendor_sun.h0000644000175100017510000000156412575647277022051 0ustar mohanmohan/* * Copyright (c) 2009 by Sun Microsystems, Inc. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Chris Rinaldo */ #ifndef dIpmiMcVendorSun_h #define dIpmiMcVendorSun_h #include "ipmi_control.h" #include "ipmi_mc.h" #include "ipmi_mc_vendor.h" class cIpmiMcVendorSunBmc : public cIpmiMcVendor { public: cIpmiMcVendorSunBmc(unsigned int product_id); virtual ~cIpmiMcVendorSunBmc(); virtual bool InitMc(cIpmiMc *mc, const cIpmiMsg &devid); bool CreateControls(cIpmiDomain *domain, cIpmiMc *mc, cIpmiSdrs *sdrs); }; #endif openhpi-3.6.1/plugins/ipmidirect/ipmi_sensor_threshold.h0000644000175100017510000002720212575647277022572 0ustar mohanmohan/* * ipmi_sensor_threshold.h * * Copyright (c) 2004 by FORCE Computers * Copyright (c) 2005 by ESO Technologies. * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #ifndef dIpmiSensorThreshold_h #define dIpmiSensorThreshold_h #ifndef dIpmiSensor_h #include "ipmi_sensor.h" #endif #ifndef dIpmiSensorFactors_h #include "ipmi_sensor_factors.h" #endif enum tIpmiHysteresisSupport { eIpmiHysteresisSupportNone = 0, eIpmiHysteresisSupportReadable = 1, eIpmiHysteresisSupportSettable = 2, eIpmiHysteresisSupportFixed = 3 }; const char *IpmiHysteresisSupportToString( tIpmiHysteresisSupport val ); enum tIpmiThresholdAccessSuport { eIpmiThresholdAccessSupportNone = 0, eIpmiThresholdAccessSupportReadable = 1, eIpmiThresholdAccessSupportSettable = 2, eIpmiThresholdAccessSupportFixed = 3 }; const char *IpmiThresholdAccessSupportToString( tIpmiThresholdAccessSuport val ); // event mask bits for threshold sensors #define dIpmiEventLowerNonCriticalLow 0x0001 #define dIpmiEventLowerNonCriticalHigh 0x0002 #define dIpmiEventLowerCriticalLow 0x0004 #define dIpmiEventLowerCriticalHigh 0x0008 #define dIpmiEventLowerNonRecoverableLow 0x0010 #define dIpmiEventLowerNonRecoverableHigh 0x0020 #define dIpmiEventUpperNonCriticalLow 0x0040 #define dIpmiEventUpperNonCriticalHigh 0x0080 #define dIpmiEventUpperCriticalLow 0x0100 #define dIpmiEventUpperCriticalHigh 0x0200 #define dIpmiEventUpperNonRecoverableLow 0x0400 #define dIpmiEventUpperNonRecoverableHigh 0x0800 #define dIpmiEventMask 0x0fff void IpmiThresholdEventMaskToString( unsigned short em, char *str ); enum tIpmiUnitType { eIpmiUnitTypeUnspecified = 0, eIpmiUnitTypeDegreesC = 1, eIpmiUnitTypeDegreesF = 2, eIpmiUnitTypeDegreesK = 3, eIpmiUnitTypeVolts = 4, eIpmiUnitTypeAmps = 5, eIpmiUnitTypeWatts = 6, eIpmiUnitTypeJoules = 7, eIpmiUnitTypeCoulombs = 8, eIpmiUnitTypeVa = 9, eIpmiUnitTypeNits = 10, eIpmiUnitTypeLumens = 11, eIpmiUnitTypeLux = 12, eIpmiUnitTypeCandela = 13, eIpmiUnitTypeKpa = 14, eIpmiUnitTypePsi = 15, eIpmiUnitTypeNewtons = 16, eIpmiUnitTypeCfm = 17, eIpmiUnitTypeRpm = 18, eIpmiUnitTypeHz = 19, eIpmiUnitTypeUseconds = 20, eIpmiUnitTypeMseconds = 21, eIpmiUnitTypeSeconds = 22, eIpmiUnitTypeMinute = 23, eIpmiUnitTypeHour = 24, eIpmiUnitTypeDay = 25, eIpmiUnitTypeWeek = 26, eIpmiUnitTypeMil = 27, eIpmiUnitTypeInches = 28, eIpmiUnitTypeFeet = 29, eIpmiUnitTypeCubicInchs = 30, eIpmiUnitTypeCubicFeet = 31, eIpmiUnitTypeMillimeters = 32, eIpmiUnitTypeCentimeters = 33, eIpmiUnitTypeMeters = 34, eIpmiUnitTypeCubicCentimeters = 35, eIpmiUnitTypeCubicMeters = 36, eIpmiUnitTypeLiters = 37, eIpmiUnitTypeFlOz = 38, eIpmiUnitTypeRadians = 39, eIpmiUnitTypeSeradians = 40, eIpmiUnitTypeRevolutions = 41, eIpmiUnitTypeCycles = 42, eIpmiUnitTypeGravities = 43, eIpmiUnitTypeOunces = 44, eIpmiUnitTypePounds = 45, eIpmiUnitTypeFootPounds = 46, eIpmiUnitTypeOunceInches = 47, eIpmiUnitTypeGauss = 48, eIpmiUnitTypeGilberts = 49, eIpmiUnitTypeHenries = 50, eIpmiUnitTypeMhenries = 51, eIpmiUnitTypeFarads = 52, eIpmiUnitTypeUfarads = 53, eIpmiUnitTypeOhms = 54, eIpmiUnitTypeSiemens = 55, eIpmiUnitTypeMoles = 56, eIpmiUnitTypeBecquerels = 57, eIpmiUnitTypePpm = 58, eIpmiUnitTypeReserved1 = 59, eIpmiUnitTypeDecibels = 60, eIpmiUnitTypeDbA = 61, eIpmiUnitTypeDbC = 62, eIpmiUnitTypeGrays = 63, eIpmiUnitTypeSieverts = 64, eIpmiUnitTypeColorTempDegK = 65, eIpmiUnitTypeBits = 66, eIpmiUnitTypeKBits = 67, eIpmiUnitTypeMBits = 68, eIpmiUnitTypeGBits = 69, eIpmiUnitTypeBytes = 70, eIpmiUnitTypeKBytes = 71, eIpmiUnitTypeMBytes = 72, eIpmiUnitTypeGBytes = 73, eIpmiUnitTypeWords = 74, eIpmiUnitTypeDWords = 75, eIpmiUnitTypeQWords = 76, eIpmiUnitTypeLines = 77, eIpmiUnitTypeHits = 78, eIpmiUnitTypeMisses = 79, eIpmiUnitTypeRetries = 80, eIpmiUnitTypeResets = 81, eIpmiUnitTypeOverruns = 82, eIpmiUnitTypeUnderruns = 83, eIpmiUnitTypeCollisions = 84, eIpmiUnitTypePackets = 85, eIpmiUnitTypeMessages = 86, eIpmiUnitTypeCharacters = 87, eIpmiUnitTypeErrors = 88, eIpmiUnitTypeCorrectableErrors = 89, eIpmiUnitTypeUncorrectableErrors = 90 }; const char *IpmiUnitTypeToString( tIpmiUnitType val ); enum tIpmiRateUnit { eIpmRateUnitNone = 0, eIpmRateUnitPerUS = 1, eIpmRateUnitPerMs = 2, eIpmRateUnitPerS = 3, eIpmRateUnitPerMinute = 4, eIpmRateUnitPerHour = 5, eIpmRateUnitDay = 6 }; const char *IpmiRateUnitToString( tIpmiRateUnit unit ); enum tIpmiModifierUnit { eIpmiModifierUnitNone = 0, eIpmiModifierUnitBasicDivModifier = 1, eIpmiModifierUnitBasicMulModifier = 2 }; const char *IpmiModifierUnitToString( tIpmiModifierUnit unit ); struct tIpmiThresholds { /* Pay no attention to the implementation here. */ struct { unsigned int m_status; /* Is this threshold enabled? */ double m_val; } m_vals[6]; }; class cIpmiSensorThreshold : public cIpmiSensor { protected: bool m_sensor_init_thresholds; bool m_sensor_init_hysteresis; tIpmiHysteresisSupport m_hysteresis_support; tIpmiThresholdAccessSuport m_threshold_access; unsigned int m_threshold_readable; unsigned int m_threshold_settable; tIpmiRateUnit m_rate_unit; tIpmiModifierUnit m_modifier_unit_use; bool m_percentage; tIpmiUnitType m_base_unit; tIpmiUnitType m_modifier_unit; bool m_normal_min_specified; bool m_normal_max_specified; bool m_nominal_reading_specified; bool m_swap_thresholds; unsigned char m_nominal_reading; unsigned char m_normal_max; unsigned char m_normal_min; unsigned char m_sensor_max; unsigned char m_sensor_min; unsigned char m_upper_non_recoverable_threshold; unsigned char m_upper_critical_threshold; unsigned char m_upper_non_critical_threshold; unsigned char m_lower_non_recoverable_threshold; unsigned char m_lower_critical_threshold; unsigned char m_lower_non_critical_threshold; unsigned char m_positive_going_threshold_hysteresis; unsigned char m_negative_going_threshold_hysteresis; unsigned char m_current_positive_hysteresis; unsigned char m_current_negative_hysteresis; public: cIpmiSensorThreshold( cIpmiMc *mc ); virtual ~cIpmiSensorThreshold(); virtual void HandleNew( cIpmiDomain *domain ); tIpmiHysteresisSupport HysteresisSupport() const { return m_hysteresis_support; } tIpmiThresholdAccessSuport ThresholdAccess() const { return m_threshold_access; } tIpmiUnitType BaseUnit() const { return m_base_unit; } tIpmiUnitType ModifierUnit() const { return m_modifier_unit; } tIpmiModifierUnit ModifierUnitUse() const { return m_modifier_unit_use; } bool Percentage() const { return m_percentage; } unsigned char SensorMax() const { return m_sensor_max; } unsigned char SensorMin() const { return m_sensor_min; } bool NominalReadingSpecified() const { return m_nominal_reading_specified; } unsigned char NominalReading() const { return m_nominal_reading; } bool NormalMaxSpecified() const { return m_normal_max_specified; } unsigned char NormalMax() const { return m_normal_max; } bool NormalMinSpecified() const { return m_normal_min_specified; } unsigned char NormalMin() const { return m_normal_min; } bool SwapThresholds() const { return m_swap_thresholds; } bool IsThresholdReadable( tIpmiThresh event ); bool IsThresholdSettable( tIpmiThresh event ); // create an hpi event from ipmi event virtual SaErrorT CreateEvent( cIpmiEvent *event, SaHpiEventT &h ); virtual void Dump( cIpmiLog &dump ) const; bool Cmp( const cIpmiSensor &s2 ) const; protected: cIpmiSensorFactors *m_sensor_factors; virtual cIpmiSensorFactors *CreateSensorFactors( cIpmiMc *mc, cIpmiSdr *sdr ); // create HPI event mask unsigned short GetEventMask(unsigned int ipmi_event_mask); // convert to HPI interpreted values void ConvertToInterpreted( unsigned int v, SaHpiSensorReadingT &r ); void ConvertToInterpreted( unsigned int v, SaHpiSensorReadingT &r, bool is_hysteresis ); SaErrorT ConvertFromInterpreted( const SaHpiSensorReadingT r, unsigned char &v ); SaErrorT ConvertFromInterpreted( const SaHpiSensorReadingT r, unsigned char &v, bool is_hysteresis); SaErrorT ConvertThreshold( const SaHpiSensorReadingT &r, tIpmiThresh event, unsigned char &data, unsigned char &mask ); public: cIpmiSensorFactors *GetFactors() { return m_sensor_factors; } // read sensor parameter from Full Sensor Record virtual bool GetDataFromSdr( cIpmiMc *mc, cIpmiSdr *sdr ); // create an RDR sensor record virtual bool CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ); // get sensor data SaErrorT GetSensorReading( SaHpiSensorReadingT &data, SaHpiEventStateT &state ); SaErrorT GetThresholdsAndHysteresis( SaHpiSensorThresholdsT &thres ); protected: // helper functions for GetThresholdsAndHysteresis SaErrorT GetThresholds( SaHpiSensorThresholdsT &thres ); SaErrorT GetDefaultThresholds( SaHpiSensorThresholdsT &thres ); SaErrorT GetHysteresis( SaHpiSensorThresholdsT &thres ); public: SaErrorT SetThresholdsAndHysteresis( const SaHpiSensorThresholdsT &thres ); protected: // helper functions for SetThresholdsAndHysteresis SaErrorT SetThresholds( const SaHpiSensorThresholdsT &thres ); SaErrorT SetHysteresis( const SaHpiSensorThresholdsT &thres ); public: virtual SaErrorT GetEventMasksHw( SaHpiEventStateT &AssertEventMask, SaHpiEventStateT &DeassertEventMask ); virtual SaErrorT SetEventMasksHw( const SaHpiEventStateT &AssertEventMask, const SaHpiEventStateT &DeassertEventMask ); }; #endif openhpi-3.6.1/plugins/ipmidirect/ipmi_sensor_threshold.cpp0000644000175100017510000011277612575647277023140 0ustar mohanmohan/* * ipmi_sensor_threshold.cpp * * Copyright (c) 2004 by FORCE Computers * Copyright (c) 2005 by ESO Technologies. * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #include "ipmi_sensor_threshold.h" #include "ipmi_log.h" #include "ipmi_domain.h" #include #include #include #include #include static const char *hysteresis_support_types[] = { "None", "Readable", "Settable", "Fixed", }; const char * IpmiHysteresisSupportToString( tIpmiHysteresisSupport val ) { if ( val > eIpmiHysteresisSupportFixed ) return "Invalid"; return hysteresis_support_types[val]; } static const char *threshold_access_support_types[] = { "None", "Readable", "Settable", "Fixed", }; const char * IpmiThresholdAccessSupportToString( tIpmiThresholdAccessSuport val ) { if ( val > eIpmiThresholdAccessSupportFixed ) return "Invalid"; return threshold_access_support_types[val]; } static void AddOrStr( char *str, const char *s ) { if ( *str ) strcat( str, " | " ); strcat( str, s ); } void IpmiThresholdEventMaskToString( unsigned short em, char *str ) { *str = 0; if ( em & dIpmiEventLowerNonCriticalLow ) AddOrStr( str, "LowerNonCriticalLow" ); if ( em & dIpmiEventLowerNonCriticalHigh ) AddOrStr( str, "LowerNonCriticalHigh" ); if ( em & dIpmiEventLowerCriticalLow ) AddOrStr( str, "LowerCriticalLow" ); if ( em & dIpmiEventLowerCriticalHigh ) AddOrStr( str, "LowerCriticalHigh" ); if ( em & dIpmiEventLowerNonRecoverableLow ) AddOrStr( str, "LowerNonRecoverableLow" ); if ( em & dIpmiEventLowerNonRecoverableHigh ) AddOrStr( str, "LowerNonRecoverableHigh" ); if ( em & dIpmiEventUpperNonCriticalLow ) AddOrStr( str, "UpperNonCriticalLow" ); if ( em & dIpmiEventUpperCriticalHigh ) AddOrStr( str, "UpperCriticalHigh" ); if ( em & dIpmiEventUpperNonRecoverableLow ) AddOrStr( str, "UpperNonRecoverableLow" ); if ( em & dIpmiEventUpperNonRecoverableHigh ) AddOrStr( str, "UpperNonRecoverableHigh" ); } static const char *rate_unit[] = { "None", "Us" "Ms" "Second", "Minute", "Hour", "Day" }; #define dNumRateUnit (sizeof(rate_unit)/sizeof(char *)) const char * IpmiRateUnitToString( tIpmiRateUnit val ) { if ( val > (int)dNumRateUnit ) return "Invalid"; return rate_unit[val]; } const char *modifier_unit_map[] = { "None", "BasicDivModifier", "BasicMulModifier" }; #define dNumModifierUnit (sizeof(modifier_unit_map)/sizeof(char *)) const char * IpmiModifierUnitToString( tIpmiModifierUnit unit ) { if ( unit > (int)dNumModifierUnit ) return "Invalid"; return modifier_unit_map[unit]; } static const char *unit_types[] = { "Unspecified", "C", "F", "K", "Volts", "Amps", "Watts", "Joules", "Coulombs", "VA", "Nits", "Lumens", "Lux", "Candela", "Kpa", "Psi", "Newtons", "Cfm", "Rpm", "Hz", "Useconds", "Mseconds", "Seconds", "Minute", "Hour", "Day", "Week", "Mil", "Inches", "Feet", "CubicInchs", "CubicFeet", "Millimeters", "Centimeters", "Meters", "CubicCentimeters" "cubic meters", "Liters", "FluidOunces", "Radians", "Seradians", "Revolutions", "Cycles", "Gravities", "Ounces", "Pounds", "FootPounds", "OunceInches", "Gauss", "Gilberts", "Henries", "Mhenries", "Farads", "Ufarads", "Ohms", "Siemens", "Moles", "Becquerels", "Ppm", "Unspecified", "Decibels", "Dba", "Dbc", "Grays", "Sieverts", "ColorTempDegK", "Bits", "Kbits", "Mbits", "Gbits", "Bytes", "Kbytes", "Mbytes", "Gbytes", "Words", "Dwords", "Qwords", "Lines", "Hits", "Misses", "Retries", "Resets", "Overruns", "Underruns", "Collisions", "Packets", "Messages", "Characters", "Errors", "CorrectableErrors", "UncorrectableErrors" }; #define dNumUnitTypes (sizeof(unit_types)/sizeof(char *)) const char * IpmiUnitTypeToString( tIpmiUnitType val ) { if ( val > (int)dNumUnitTypes ) return "invalid"; return unit_types[val]; } cIpmiSensorThreshold::cIpmiSensorThreshold( cIpmiMc *mc ) : cIpmiSensor( mc ), m_sensor_init_thresholds( false ), m_sensor_init_hysteresis( false ), m_hysteresis_support( eIpmiHysteresisSupportNone ), m_threshold_access( eIpmiThresholdAccessSupportNone ), m_threshold_readable( 0 ), m_threshold_settable( 0 ), m_rate_unit( eIpmRateUnitNone ), m_modifier_unit_use( eIpmiModifierUnitNone ), m_percentage( false ), m_base_unit( eIpmiUnitTypeUnspecified ), m_modifier_unit( eIpmiUnitTypeUnspecified ), m_normal_min_specified( false ), m_normal_max_specified( false ), m_nominal_reading_specified( false ), m_nominal_reading( 0 ), m_normal_max( 0 ), m_normal_min( 0 ), m_sensor_max( 0 ), m_sensor_min( 0 ), m_upper_non_recoverable_threshold( 0 ), m_upper_critical_threshold( 0 ), m_upper_non_critical_threshold( 0 ), m_lower_non_recoverable_threshold( 0 ), m_lower_critical_threshold( 0 ), m_lower_non_critical_threshold( 0 ), m_positive_going_threshold_hysteresis( 0 ), m_negative_going_threshold_hysteresis( 0 ), m_sensor_factors( 0 ) { } cIpmiSensorThreshold::~cIpmiSensorThreshold() { if ( m_sensor_factors ) delete m_sensor_factors; } bool cIpmiSensorThreshold::GetDataFromSdr( cIpmiMc *mc, cIpmiSdr *sdr ) { if ( !cIpmiSensor::GetDataFromSdr( mc, sdr ) ) return false; m_sensor_init_thresholds = (sdr->m_data[10] >> 4) & 1; m_sensor_init_hysteresis = (sdr->m_data[10] >> 3) & 1; m_hysteresis_support = (tIpmiHysteresisSupport)((sdr->m_data[11] >> 4) & 3); m_threshold_access = (tIpmiThresholdAccessSuport)((sdr->m_data[11] >> 2) & 3); // assertion unsigned int val = IpmiGetUint16( sdr->m_data + 14 ); m_assertion_event_mask = val & dIpmiEventMask; m_current_hpi_assert_mask = GetEventMask( m_assertion_event_mask ); m_hpi_assert_mask = m_current_hpi_assert_mask; m_reading_mask = (val >> 12) & 7; // deassertion val = IpmiGetUint16( sdr->m_data + 16 ); m_deassertion_event_mask = val & dIpmiEventMask; m_current_hpi_deassert_mask = GetEventMask( m_deassertion_event_mask ); m_hpi_deassert_mask = m_current_hpi_deassert_mask; m_reading_mask |= ((val >> 12) & 7 ) << 3; val = IpmiGetUint16( sdr->m_data + 18 ); m_threshold_readable = val & 0x3f; m_threshold_settable = (val >> 8) & 0x3f; m_rate_unit = (tIpmiRateUnit)((sdr->m_data[20] >> 3) & 7); m_modifier_unit_use = (tIpmiModifierUnit)((sdr->m_data[20] >> 1) & 3); m_percentage = sdr->m_data[20] & 1; m_base_unit = (tIpmiUnitType)sdr->m_data[21]; m_modifier_unit = (tIpmiUnitType)sdr->m_data[22]; m_sensor_factors = CreateSensorFactors( mc, sdr ); if ( !m_sensor_factors ) return false; m_normal_min_specified = (sdr->m_data[30] >> 2) & 1; m_normal_max_specified = (sdr->m_data[30] >> 1) & 1; m_nominal_reading_specified = sdr->m_data[30] & 1; m_nominal_reading = sdr->m_data[31]; m_normal_max = sdr->m_data[32]; m_normal_min = sdr->m_data[33]; m_sensor_max = sdr->m_data[34]; m_sensor_min = sdr->m_data[35]; m_upper_non_recoverable_threshold = sdr->m_data[36]; m_upper_critical_threshold = sdr->m_data[37]; m_upper_non_critical_threshold = sdr->m_data[38]; m_lower_non_recoverable_threshold = sdr->m_data[39]; m_lower_critical_threshold = sdr->m_data[40]; m_lower_non_critical_threshold = sdr->m_data[41]; m_positive_going_threshold_hysteresis = sdr->m_data[42]; m_current_positive_hysteresis = m_positive_going_threshold_hysteresis; m_negative_going_threshold_hysteresis = sdr->m_data[43]; m_current_negative_hysteresis = m_negative_going_threshold_hysteresis; double d1, d2; m_sensor_factors->ConvertFromRaw( 1, d1, false ); m_sensor_factors->ConvertFromRaw( 2, d2, false ); if (d2 < d1) m_swap_thresholds = true; else m_swap_thresholds = false; return true; } cIpmiSensorFactors * cIpmiSensorThreshold::CreateSensorFactors( cIpmiMc *mc, cIpmiSdr *sdr ) { cIpmiSensorFactors *f= new cIpmiSensorFactors; if ( !f->GetDataFromSdr( sdr ) ) { delete f; return 0; } return f; } void cIpmiSensorThreshold::HandleNew( cIpmiDomain *domain ) { m_rate_unit_string = IpmiRateUnitToString( m_rate_unit ); m_base_unit_string = IpmiUnitTypeToString( m_base_unit ); m_modifier_unit_string = IpmiUnitTypeToString( m_modifier_unit ); cIpmiSensor::HandleNew( domain ); } bool cIpmiSensorThreshold::Cmp( const cIpmiSensor &s2 ) const { if ( cIpmiSensor::Cmp( s2 ) == false ) return false; const cIpmiSensorThreshold *t = dynamic_cast( &s2 ); if ( !t ) return false; if ( m_sensor_init_thresholds != t->m_sensor_init_thresholds ) return false; if ( m_sensor_init_hysteresis != t->m_sensor_init_hysteresis ) return false; if ( m_hysteresis_support != t->m_hysteresis_support ) return false; if ( m_threshold_access != t->m_threshold_access ) return false; if ( m_assertion_event_mask != t->m_assertion_event_mask ) return false; if ( m_deassertion_event_mask != t->m_deassertion_event_mask ) return false; if ( m_reading_mask != t->m_reading_mask ) return false; if ( m_threshold_readable != t->m_threshold_readable ) return false; if ( m_threshold_settable != t->m_threshold_settable ) return false; if ( m_rate_unit != t->m_rate_unit ) return false; if ( m_modifier_unit_use != t->m_modifier_unit_use ) return false; if ( m_percentage != t->m_percentage ) return false; if ( m_base_unit != t->m_base_unit ) return false; if ( m_modifier_unit != t->m_modifier_unit ) return false; bool sf1 = m_sensor_factors ? true : false; bool sf2 = t->m_sensor_factors ? true : false; if ( sf1 != sf2 ) return false; if ( m_sensor_factors ) if ( m_sensor_factors->Cmp( *t->m_sensor_factors ) == false ) return false; if ( m_normal_min_specified != t->m_normal_min_specified ) return false; if ( m_normal_max_specified != t->m_normal_max_specified ) return false; if ( m_nominal_reading_specified != t->m_nominal_reading_specified ) return false; if ( m_nominal_reading != t->m_nominal_reading ) return false; if ( m_normal_max != t->m_normal_max ) return false; if ( m_normal_min != t->m_normal_min ) return false; if ( m_sensor_max != t->m_sensor_max ) return false; if ( m_sensor_min != t->m_sensor_min ) return false; if ( m_upper_non_recoverable_threshold != t->m_upper_non_recoverable_threshold ) return false; if ( m_upper_critical_threshold != t->m_upper_critical_threshold ) return false; if ( m_upper_non_critical_threshold != t->m_upper_non_critical_threshold ) return false; if ( m_lower_non_recoverable_threshold != t->m_lower_non_recoverable_threshold ) return false; if ( m_lower_critical_threshold != t->m_lower_critical_threshold ) return false; if ( m_lower_non_critical_threshold != t->m_lower_non_critical_threshold ) return false; if ( m_positive_going_threshold_hysteresis != t->m_positive_going_threshold_hysteresis ) return false; if ( m_negative_going_threshold_hysteresis != t->m_negative_going_threshold_hysteresis ) return false; return true; } bool cIpmiSensorThreshold::IsThresholdReadable( tIpmiThresh event ) { return m_threshold_readable & ( 1 << event ); } bool cIpmiSensorThreshold::IsThresholdSettable( tIpmiThresh event ) { return m_threshold_settable & ( 1 << event ); } static void SwapEventState( SaHpiEventStateT &event_state ) { switch (event_state) { case SAHPI_ES_LOWER_MINOR: event_state = SAHPI_ES_UPPER_MINOR; break; case SAHPI_ES_LOWER_MAJOR: event_state = SAHPI_ES_UPPER_MAJOR; break; case SAHPI_ES_LOWER_CRIT: event_state = SAHPI_ES_UPPER_CRIT; break; case SAHPI_ES_UPPER_MINOR: event_state = SAHPI_ES_LOWER_MINOR; break; case SAHPI_ES_UPPER_MAJOR: event_state = SAHPI_ES_LOWER_MAJOR; break; case SAHPI_ES_UPPER_CRIT: event_state = SAHPI_ES_LOWER_CRIT; break; } } SaErrorT cIpmiSensorThreshold::CreateEvent( cIpmiEvent *event, SaHpiEventT &h ) { SaErrorT rv = cIpmiSensor::CreateEvent( event, h ); if ( rv != SA_OK ) return rv; // sensor event SaHpiSensorEventT &se = h.EventDataUnion.SensorEvent; se.Assertion = (SaHpiBoolT)!(event->m_data[9] & 0x80); tIpmiThresh threshold = (tIpmiThresh)((event->m_data[10] >> 1) & 0x07); switch( threshold ) { case eIpmiLowerNonCritical: se.EventState = SAHPI_ES_LOWER_MINOR; h.Severity = SAHPI_MINOR; break; case eIpmiLowerCritical: se.EventState = SAHPI_ES_LOWER_MAJOR; h.Severity = SAHPI_MAJOR; break; case eIpmiLowerNonRecoverable: se.EventState = SAHPI_ES_LOWER_CRIT; h.Severity = SAHPI_CRITICAL; break; case eIpmiUpperNonCritical: se.EventState = SAHPI_ES_UPPER_MINOR; h.Severity = SAHPI_MINOR; break; case eIpmiUpperCritical: se.EventState = SAHPI_ES_UPPER_MAJOR; h.Severity = SAHPI_MAJOR; break; case eIpmiUpperNonRecoverable: se.EventState = SAHPI_ES_UPPER_CRIT; h.Severity = SAHPI_CRITICAL; break; default: stdlog << "Invalid threshold giving !\n"; se.EventState = SAHPI_ES_UNSPECIFIED; } if ( SwapThresholds() == true ) { SwapEventState( se.EventState ); } SaHpiSensorOptionalDataT optional_data = 0; // byte 2 tIpmiEventType type = (tIpmiEventType)(event->m_data[10] >> 6); if ( type == eIpmiEventData1 ) { ConvertToInterpreted( event->m_data[11], se.TriggerReading ); optional_data |= SAHPI_SOD_TRIGGER_READING; } else if ( type == eIpmiEventData2 ) { se.Oem = (SaHpiUint32T)event->m_data[11]; optional_data |= SAHPI_SOD_OEM; } else if ( type == eIpmiEventData3 ) { se.SensorSpecific = (SaHpiUint32T)event->m_data[11]; optional_data |= SAHPI_SOD_SENSOR_SPECIFIC; } // byte 3 type = (tIpmiEventType)((event->m_data[10] & 0x30) >> 4); if ( type == eIpmiEventData1 ) { ConvertToInterpreted( event->m_data[12], se.TriggerThreshold ); optional_data |= SAHPI_SOD_TRIGGER_THRESHOLD; } else if ( type == eIpmiEventData2 ) { se.Oem |= (SaHpiUint32T)((event->m_data[12] << 8) & 0xff00); optional_data |= SAHPI_SOD_OEM; } else if ( type == eIpmiEventData3 ) { se.SensorSpecific |= (SaHpiUint32T)((event->m_data[12] << 8) & 0xff00); optional_data |= SAHPI_SOD_SENSOR_SPECIFIC; } se.OptionalDataPresent = optional_data; return SA_OK; } void cIpmiSensorThreshold::Dump( cIpmiLog &dump ) const { cIpmiSensor::Dump( dump ); dump << "\tthreshold_access " << IpmiThresholdAccessSupportToString( m_threshold_access ) << ", hysteresis_support " << IpmiHysteresisSupportToString( m_hysteresis_support ) << " \n"; } unsigned short cIpmiSensorThreshold::GetEventMask(unsigned int ipmi_event_mask) { // convert ipmi event mask to hpi event mask unsigned short amask = ipmi_event_mask; unsigned short mask = 0; for( int i = 0; i < 12; i++ ) if ( amask & (1 <ConvertToRaw( cIpmiSensorFactors::eRoundNormal, (double)r.Value.SensorFloat64, raw, is_hysteresis, SwapThresholds() ) ) return SA_ERR_HPI_INVALID_DATA; v = (unsigned char)raw; return SA_OK; } void cIpmiSensorThreshold::ConvertToInterpreted( unsigned int v, SaHpiSensorReadingT &r ) { ConvertToInterpreted( v, r, false ); } void cIpmiSensorThreshold::ConvertToInterpreted( unsigned int v, SaHpiSensorReadingT &r, bool is_hysteresis) { memset( &r, 0, sizeof( SaHpiSensorReadingT ) ); double d; r.IsSupported = SAHPI_FALSE; if ( m_sensor_factors->ConvertFromRaw( v, d, is_hysteresis ) ) { r.IsSupported = SAHPI_TRUE; r.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; r.Value.SensorFloat64 = (SaHpiFloat64T)d; } } void static SwapThresholdsMask( SaHpiSensorThdMaskT &threshold_mask ) { SaHpiSensorThdMaskT temp_mask; temp_mask = threshold_mask; threshold_mask = 0; if (temp_mask & SAHPI_STM_LOW_MINOR) threshold_mask |= SAHPI_STM_UP_MINOR; if (temp_mask & SAHPI_STM_LOW_MAJOR) threshold_mask |= SAHPI_STM_UP_MAJOR; if (temp_mask & SAHPI_STM_LOW_CRIT) threshold_mask |= SAHPI_STM_UP_CRIT; if (temp_mask & SAHPI_STM_UP_MINOR) threshold_mask |= SAHPI_STM_LOW_MINOR; if (temp_mask & SAHPI_STM_UP_MAJOR) threshold_mask |= SAHPI_STM_LOW_MAJOR; if (temp_mask & SAHPI_STM_UP_CRIT) threshold_mask |= SAHPI_STM_LOW_CRIT; if (temp_mask & SAHPI_STM_UP_HYSTERESIS) threshold_mask |= SAHPI_STM_LOW_HYSTERESIS; if (temp_mask & SAHPI_STM_LOW_HYSTERESIS) threshold_mask |= SAHPI_STM_UP_HYSTERESIS; } bool cIpmiSensorThreshold::CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ) { if ( cIpmiSensor::CreateRdr( resource, rdr ) == false ) return false; SaHpiSensorRecT &rec = rdr.RdrTypeUnion.SensorRec; // data format rec.DataFormat.IsSupported = SAHPI_TRUE; rec.DataFormat.ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64; rec.DataFormat.BaseUnits = (SaHpiSensorUnitsT)BaseUnit(); rec.DataFormat.ModifierUnits = (SaHpiSensorUnitsT)ModifierUnit(); rec.DataFormat.ModifierUse = (SaHpiSensorModUnitUseT)ModifierUnitUse(); rec.DataFormat.Percentage = (SaHpiBoolT)Percentage(); rec.DataFormat.AccuracyFactor = (SaHpiFloat64T)GetFactors()->AccuracyFactor(); rec.DataFormat.Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN; if ( SwapThresholds() == true ) { ConvertToInterpreted( SensorMax(), rec.DataFormat.Range.Min ); ConvertToInterpreted( SensorMin(), rec.DataFormat.Range.Max ); } else { ConvertToInterpreted( SensorMax(), rec.DataFormat.Range.Max ); ConvertToInterpreted( SensorMin(), rec.DataFormat.Range.Min ); } if ( NominalReadingSpecified() ) { rec.DataFormat.Range.Flags |= SAHPI_SRF_NOMINAL; ConvertToInterpreted( NominalReading(), rec.DataFormat.Range.Nominal ); } if ( NormalMaxSpecified() ) { if ( SwapThresholds() == true ) { rec.DataFormat.Range.Flags |= SAHPI_SRF_NORMAL_MIN; ConvertToInterpreted( NormalMax(), rec.DataFormat.Range.NormalMin ); } else { rec.DataFormat.Range.Flags |= SAHPI_SRF_NORMAL_MAX; ConvertToInterpreted( NormalMax(), rec.DataFormat.Range.NormalMax ); } } if ( NormalMinSpecified() ) { if ( SwapThresholds() == true ) { rec.DataFormat.Range.Flags |= SAHPI_SRF_NORMAL_MAX; ConvertToInterpreted( NormalMin(), rec.DataFormat.Range.NormalMax ); } else { rec.DataFormat.Range.Flags |= SAHPI_SRF_NORMAL_MIN; ConvertToInterpreted( NormalMin(), rec.DataFormat.Range.NormalMin ); } } // thresholds unsigned int acc = ThresholdAccess(); if ( acc >= eIpmiThresholdAccessSupportReadable ) { rec.ThresholdDefn.IsAccessible = SAHPI_TRUE; SaHpiSensorThdMaskT temp = 0; int val = IsThresholdReadable( eIpmiLowerNonCritical ); if ( val ) temp |= SAHPI_STM_LOW_MINOR; val = IsThresholdReadable( eIpmiLowerCritical ); if ( val ) temp |= SAHPI_STM_LOW_MAJOR; val = IsThresholdReadable( eIpmiLowerNonRecoverable ); if ( val ) temp |= SAHPI_STM_LOW_CRIT; val = IsThresholdReadable( eIpmiUpperNonCritical ); if ( val ) temp |= SAHPI_STM_UP_MINOR; val = IsThresholdReadable( eIpmiUpperCritical ); if ( val ) temp |= SAHPI_STM_UP_MAJOR; val = IsThresholdReadable( eIpmiUpperNonRecoverable ); if ( val ) temp |= SAHPI_STM_UP_CRIT; if ( HysteresisSupport() == eIpmiHysteresisSupportReadable || HysteresisSupport() == eIpmiHysteresisSupportSettable ) temp |= SAHPI_STM_UP_HYSTERESIS | SAHPI_STM_LOW_HYSTERESIS; if ( SwapThresholds() == true ) { SwapThresholdsMask( temp ); } rec.ThresholdDefn.ReadThold = temp; } if ( acc == eIpmiThresholdAccessSupportSettable ) { SaHpiSensorThdMaskT temp = 0; int val = IsThresholdSettable( eIpmiLowerNonCritical ); if ( val ) temp |= SAHPI_STM_LOW_MINOR; val = IsThresholdSettable( eIpmiLowerCritical ); if ( val ) temp |= SAHPI_STM_LOW_MAJOR; val = IsThresholdSettable( eIpmiLowerNonRecoverable ); if ( val ) temp |= SAHPI_STM_LOW_CRIT; val = IsThresholdSettable( eIpmiUpperNonCritical ); if ( val ) temp |= SAHPI_STM_UP_MINOR; val = IsThresholdSettable( eIpmiUpperCritical ); if ( val ) temp |= SAHPI_STM_UP_MAJOR; val = IsThresholdSettable( eIpmiUpperNonRecoverable ); if ( val ) temp |= SAHPI_STM_UP_CRIT; if ( HysteresisSupport() == eIpmiHysteresisSupportSettable ) temp |= SAHPI_STM_UP_HYSTERESIS | SAHPI_STM_LOW_HYSTERESIS; if ( SwapThresholds() == true ) { SwapThresholdsMask( temp ); } rec.ThresholdDefn.WriteThold = temp; } if ( SwapThresholds() == true ) { SwapEventState(rec.Events); SwapEventState(m_current_hpi_assert_mask); SwapEventState(m_current_hpi_deassert_mask); SwapEventState(m_hpi_assert_mask); SwapEventState(m_hpi_deassert_mask); } rec.ThresholdDefn.Nonlinear = GetFactors()->IsNonLinear(); return true; } SaErrorT cIpmiSensorThreshold::GetSensorReading( SaHpiSensorReadingT &data, SaHpiEventStateT &state ) { if ( m_enabled == SAHPI_FALSE ) return SA_ERR_HPI_INVALID_REQUEST; cIpmiMsg rsp; SaErrorT rv = GetSensorData( rsp ); if ( rv != SA_OK ) return rv; if ( &data != NULL ) ConvertToInterpreted( rsp.m_data[1], data ); if ( &state != NULL ) { state = rsp.m_data[3] & 0x3f; if ( SwapThresholds() == true ) { SwapEventState( state ); } } return SA_OK; } SaErrorT cIpmiSensorThreshold::GetDefaultThresholds( SaHpiSensorThresholdsT &thres ) { if ( IsThresholdReadable( eIpmiLowerNonRecoverable ) ) ConvertToInterpreted( m_lower_non_recoverable_threshold, thres.LowCritical ); if ( IsThresholdReadable( eIpmiLowerCritical ) ) ConvertToInterpreted( m_lower_critical_threshold, thres.LowMajor ); if ( IsThresholdReadable( eIpmiLowerNonCritical ) ) ConvertToInterpreted( m_lower_non_critical_threshold, thres.LowMinor ); if ( IsThresholdReadable( eIpmiUpperNonRecoverable ) ) ConvertToInterpreted( m_upper_non_recoverable_threshold, thres.UpCritical ); if ( IsThresholdReadable( eIpmiUpperCritical ) ) ConvertToInterpreted( m_upper_critical_threshold, thres.UpMajor ); if ( IsThresholdReadable( eIpmiUpperNonCritical ) ) ConvertToInterpreted( m_upper_non_critical_threshold, thres.UpMinor ); return SA_OK; } SaErrorT cIpmiSensorThreshold::GetThresholds( SaHpiSensorThresholdsT &thres ) { cIpmiResource *res = Resource(); stdlog << "read thresholds for sensor " << EntityPath() << " num " << m_num << " " << IdString() << ".\n"; if ( m_threshold_access == eIpmiThresholdAccessSupportFixed ) // Thresholds are fixed, pull them from the SDR. return GetDefaultThresholds( thres ); cIpmiMsg msg( eIpmiNetfnSensorEvent, eIpmiCmdGetSensorThreshold ); cIpmiMsg rsp; msg.m_data_len = 1; msg.m_data[0] = m_num; SaErrorT rv = res->SendCommandReadLock( this, msg, rsp, m_lun ); if ( rv != SA_OK ) { stdlog << "error getting thresholds: " << rv << " !\n"; return rv; } if ( rsp.m_data[0] ) { stdlog << "IPMI error getting thresholds: " << rsp.m_data[0] << " !\n"; return SA_ERR_HPI_INVALID_DATA; } if ( rsp.m_data[1] & (1 << eIpmiLowerNonRecoverable) ) ConvertToInterpreted( rsp.m_data[4], thres.LowCritical ); if ( rsp.m_data[1] & (1 << eIpmiLowerCritical ) ) ConvertToInterpreted( rsp.m_data[3], thres.LowMajor ); if ( rsp.m_data[1] & (1 << eIpmiLowerNonCritical ) ) ConvertToInterpreted( rsp.m_data[2], thres.LowMinor ); if ( rsp.m_data[1] & (1 << eIpmiUpperNonRecoverable ) ) ConvertToInterpreted( rsp.m_data[7], thres.UpCritical ); if ( rsp.m_data[1] & (1 << eIpmiUpperCritical ) ) ConvertToInterpreted( rsp.m_data[6], thres.UpMajor ); if ( rsp.m_data[1] & (1 << eIpmiUpperNonCritical ) ) ConvertToInterpreted( rsp.m_data[5], thres.UpMinor ); return SA_OK; } SaErrorT cIpmiSensorThreshold::GetHysteresis( SaHpiSensorThresholdsT &thres ) { cIpmiResource *res = Resource(); stdlog << "read hysteresis for sensor " << EntityPath() << " num " << m_num << " " << IdString() << ".\n"; if ( m_hysteresis_support != eIpmiHysteresisSupportReadable && m_hysteresis_support != eIpmiHysteresisSupportSettable) return SA_OK; cIpmiMsg msg( eIpmiNetfnSensorEvent, eIpmiCmdGetSensorHysteresis ); cIpmiMsg rsp; msg.m_data_len = 2; msg.m_data[0] = m_num; msg.m_data[1] = 0xff; SaErrorT rv = res->SendCommandReadLock( this, msg, rsp, m_lun ); if ( rv ) { stdlog << "Error sending hysteresis get command: " << rv << " !\n"; return rv; } if ( rsp.m_data[0] || rsp.m_data_len < 3 ) { stdlog << "IPMI error getting hysteresis: " << rsp.m_data[0] << "!\n"; return SA_ERR_HPI_INVALID_CMD; } m_current_positive_hysteresis = rsp.m_data[1]; m_current_negative_hysteresis = rsp.m_data[2]; ConvertToInterpreted( rsp.m_data[1], thres.PosThdHysteresis, true ); ConvertToInterpreted( rsp.m_data[2], thres.NegThdHysteresis, true ); return SA_OK; } void static SwapThresholdsReading( SaHpiSensorThresholdsT &thres ) { SaHpiSensorThresholdsT tmp_tres; memcpy( &tmp_tres, &thres, sizeof( SaHpiSensorThresholdsT )); memcpy( &thres.LowCritical, &tmp_tres.UpCritical, sizeof( SaHpiSensorReadingT ) ); memcpy( &thres.LowMajor, &tmp_tres.UpMajor, sizeof( SaHpiSensorReadingT ) ); memcpy( &thres.LowMinor, &tmp_tres.UpMinor, sizeof( SaHpiSensorReadingT ) ); memcpy( &thres.UpCritical, &tmp_tres.LowCritical, sizeof( SaHpiSensorReadingT ) ); memcpy( &thres.UpMajor, &tmp_tres.LowMajor, sizeof( SaHpiSensorReadingT ) ); memcpy( &thres.UpMinor, &tmp_tres.LowMinor, sizeof( SaHpiSensorReadingT ) ); memcpy( &thres.PosThdHysteresis, &tmp_tres.NegThdHysteresis, sizeof( SaHpiSensorReadingT ) ); memcpy( &thres.NegThdHysteresis, &tmp_tres.PosThdHysteresis, sizeof( SaHpiSensorReadingT ) ); } SaErrorT cIpmiSensorThreshold::GetThresholdsAndHysteresis( SaHpiSensorThresholdsT &thres ) { SaErrorT rv; memset( &thres, 0, sizeof( SaHpiSensorThresholdsT ) ); bool found = false; if ( ThresholdAccess() == eIpmiThresholdAccessSupportNone ) stdlog << "sensor doesn't support threshold read !\n"; else { rv = GetThresholds( thres ); if ( rv != SA_OK ) return rv; found = true; } if ( HysteresisSupport() == eIpmiHysteresisSupportReadable || HysteresisSupport() == eIpmiHysteresisSupportSettable ) { rv = GetHysteresis( thres ); if ( rv != SA_OK ) return rv; found = true; } else stdlog << "sensor doesn't support hysteresis read !\n"; if ( !found ) return SA_ERR_HPI_INVALID_CMD; if ( SwapThresholds() == true ) { SwapThresholdsReading( thres ); } return SA_OK; } SaErrorT cIpmiSensorThreshold::ConvertThreshold( const SaHpiSensorReadingT &r, tIpmiThresh event, unsigned char &data, unsigned char &mask ) { // convert the interpreted data SaErrorT rv = ConvertFromInterpreted( r, data ); if ( rv != SA_OK ) return rv; if ( r.IsSupported == SAHPI_TRUE ) mask |= (1 << event); return SA_OK; } SaErrorT cIpmiSensorThreshold::SetThresholds( const SaHpiSensorThresholdsT &thres ) { stdlog << "write thresholds for sensor " << EntityPath() << " num " << m_num << " " << IdString() << ".\n"; cIpmiMsg msg( eIpmiNetfnSensorEvent, eIpmiCmdSetSensorThreshold ); memset( msg.m_data, 0, dIpmiMaxMsgLength ); msg.m_data_len = 8; msg.m_data[0] = m_num; msg.m_data[1] = 0; SaErrorT rv; rv = ConvertThreshold( thres.LowMinor, eIpmiLowerNonCritical, msg.m_data[2], msg.m_data[1] ); if ( rv != SA_OK ) return rv; rv = ConvertThreshold( thres.LowMajor, eIpmiLowerCritical, msg.m_data[3], msg.m_data[1] ); if ( rv != SA_OK ) return rv; rv = ConvertThreshold( thres.LowCritical, eIpmiLowerNonRecoverable, msg.m_data[4], msg.m_data[1] ); if ( rv != SA_OK ) return rv; rv = ConvertThreshold( thres.UpMinor, eIpmiUpperNonCritical, msg.m_data[5], msg.m_data[1] ); if ( rv != SA_OK ) return rv; rv = ConvertThreshold( thres.UpMajor, eIpmiUpperCritical, msg.m_data[6], msg.m_data[1] ); if ( rv != SA_OK ) return rv; rv = ConvertThreshold( thres.UpCritical, eIpmiUpperNonRecoverable, msg.m_data[7], msg.m_data[1] ); if ( rv != SA_OK ) return rv; // nothing to do if ( msg.m_data[1] == 0 ) return SA_OK; // settable ? if ( m_threshold_access != eIpmiThresholdAccessSupportSettable ) return SA_ERR_HPI_INVALID_CMD; if ( (m_threshold_settable | msg.m_data[1]) != m_threshold_settable ) return SA_ERR_HPI_INVALID_CMD; // set thresholds cIpmiMsg rsp; rv = Resource()->SendCommandReadLock( this, msg, rsp, m_lun ); if ( rv != SA_OK ) { stdlog << "Error sending thresholds set command: " << rv << " !\n"; return rv; } if ( rsp.m_data[0] ) { stdlog << "IPMI error setting thresholds: " << rsp.m_data[0] << " !\n"; return SA_ERR_HPI_INVALID_CMD; } return SA_OK; } SaErrorT cIpmiSensorThreshold::SetHysteresis( const SaHpiSensorThresholdsT &thres ) { SaErrorT rv; // nothing to do if ( (thres.PosThdHysteresis.IsSupported == SAHPI_FALSE) && (thres.NegThdHysteresis.IsSupported == SAHPI_FALSE) ) return SA_OK; if ( m_hysteresis_support != eIpmiHysteresisSupportSettable ) return SA_ERR_HPI_INVALID_CMD; cIpmiMsg msg( eIpmiNetfnSensorEvent, eIpmiCmdSetSensorHysteresis ); cIpmiMsg rsp; msg.m_data_len = 4; msg.m_data[0] = m_num; msg.m_data[1] = 0xff; if (thres.PosThdHysteresis.IsSupported == SAHPI_FALSE) { msg.m_data[2] = m_current_positive_hysteresis; } else { rv = ConvertFromInterpreted( thres.PosThdHysteresis, msg.m_data[2], true ); if ( rv != SA_OK ) return rv; m_current_positive_hysteresis = msg.m_data[2]; } if (thres.NegThdHysteresis.IsSupported == SAHPI_FALSE) { msg.m_data[3] = m_current_negative_hysteresis; } else { rv = ConvertFromInterpreted( thres.NegThdHysteresis, msg.m_data[3], true ); if ( rv != SA_OK ) return rv; m_current_negative_hysteresis = msg.m_data[3]; } rv = Resource()->SendCommandReadLock( this, msg, rsp, m_lun ); if ( rv != SA_OK ) { stdlog << "Error sending hysteresis set command: " << rv << " !\n"; return rv; } if ( rsp.m_data[0] ) { stdlog << "IPMI error setting hysteresis: " << rsp.m_data[0] << " !\n"; return SA_ERR_HPI_INVALID_CMD; } return SA_OK; } SaErrorT cIpmiSensorThreshold::SetThresholdsAndHysteresis( const SaHpiSensorThresholdsT &thres ) { SaErrorT rv; SaHpiSensorThresholdsT tmp_tres; memcpy( &tmp_tres, &thres, sizeof( SaHpiSensorThresholdsT ) ); if ( SwapThresholds() == true ) { SwapThresholdsReading( tmp_tres ); } if ( ThresholdAccess() == eIpmiThresholdAccessSupportSettable ) { rv = SetThresholds( tmp_tres ); if ( rv != SA_OK ) return rv; } else stdlog << "sensor doesn't support threshold set !\n"; if ( HysteresisSupport() == eIpmiHysteresisSupportSettable ) { rv = SetHysteresis( tmp_tres ); if ( rv != SA_OK ) return rv; } else stdlog << "sensor doesn't support hysteresis set !\n"; return SA_OK; } SaErrorT cIpmiSensorThreshold::GetEventMasksHw( SaHpiEventStateT &AssertEventMask, SaHpiEventStateT &DeassertEventMask ) { AssertEventMask = 0; DeassertEventMask = 0; cIpmiMsg rsp; SaErrorT rv = cIpmiSensor::GetEventMasksHw( rsp ); if ( rv != SA_OK ) return rv; unsigned int amask = IpmiGetUint16( rsp.m_data + 2 ); unsigned int dmask = IpmiGetUint16( rsp.m_data + 4 ); for( int i = 0; i < 6; i++ ) { unsigned int b1 = 1 << (2*i); unsigned int b2 = 1 << (2*i + 1); if ( (amask & b1) || (amask & b2) ) AssertEventMask |= (1 << i); if ( (dmask & b1) || (dmask & b2) ) DeassertEventMask |= (1 << i); } if ( SwapThresholds() == true ) { SwapEventState( AssertEventMask ); SwapEventState( DeassertEventMask ); } return SA_OK; } SaErrorT cIpmiSensorThreshold::SetEventMasksHw( const SaHpiEventStateT &AssertEventMask, const SaHpiEventStateT &DeassertEventMask ) { // create de/assertion event mask unsigned int amask = 0; unsigned int dmask = 0; SaHpiEventStateT assert_mask = AssertEventMask; SaHpiEventStateT deassert_mask = DeassertEventMask; if ( SwapThresholds() == true ) { SwapEventState( assert_mask ); SwapEventState( deassert_mask ); } for( int i = 0; i < 6; i++ ) { unsigned int b1 = 1 << (2*i); unsigned int b2 = 1 << (2*i + 1); unsigned int b = b1 | b2; // this is 3 << (2*i) if ( assert_mask & ( 1 << i ) ) { if ( (m_assertion_event_mask & b) == 0 ) { // this event is not allowed stdlog << "SetEventEnables: assertion event " << IpmiThresToString( (tIpmiThresh)i ) << " not allowed !\n"; return SA_ERR_HPI_INVALID_DATA; } amask |= (m_assertion_event_mask & b); } if ( deassert_mask & ( 1 << i ) ) { if ( (m_deassertion_event_mask & b) == 0 ) { // this event is not allowed stdlog << "SetEventEnables: deassertion event " << IpmiThresToString( (tIpmiThresh)i ) << " not allowed !\n"; return SA_ERR_HPI_INVALID_DATA; } dmask |= (m_deassertion_event_mask & b); } } cIpmiMsg msg; SaErrorT rv = SA_OK; if (( amask != 0 ) || ( dmask != 0 )) { IpmiSetUint16( msg.m_data + 2, amask ); IpmiSetUint16( msg.m_data + 4, dmask ); rv = cIpmiSensor::SetEventMasksHw( msg, true ); } if ( rv != SA_OK ) return rv; amask = ( amask ^ m_assertion_event_mask ) & m_assertion_event_mask; dmask = ( dmask ^ m_deassertion_event_mask ) & m_deassertion_event_mask; if (( amask != 0 ) || ( dmask != 0 )) { IpmiSetUint16( msg.m_data + 2, amask ); IpmiSetUint16( msg.m_data + 4, dmask ); rv = cIpmiSensor::SetEventMasksHw( msg, false ); } return rv; } openhpi-3.6.1/plugins/Makefile.am0000644000175100017510000000355212575647277015723 0ustar mohanmohan# # Copyright (c) 2003, Intel Corporation # All rights reserved. # # Redistribution and use in source and binary forms, with or # without modification, are permitted provided that the following # conditions are met: # # Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the distribution. # # Neither the name of Intel Corporation nor the names # of its contributors may be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, # OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # MAINTAINERCLEANFILES = Makefile.in SUBDIRS = @IPMI@ @WATCHDOG@ @SYSFS@ @SNMP_BC@ @IPMIDIRECT@ @DYNAMIC_SIMULATOR@ @SIMULATOR@ \ @RTAS@ @ILO2_RIBCL@ @OA_SOAP@ @SLAVE@ @TEST_AGENT@ DIST_SUBDIRS = ipmi \ watchdog \ sysfs \ snmp_bc \ ipmidirect \ dynamic_simulator \ simulator \ rtas \ ilo2_ribcl \ oa_soap \ slave \ test_agent openhpi-3.6.1/plugins/sysfs/0000755000175100017510000000000012605014555015006 5ustar mohanmohanopenhpi-3.6.1/plugins/sysfs/sysfs2hpi.c0000644000175100017510000007733612575647277017147 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Rusty Lynch * Julie Fleischer * Tariq Shureih * Racing Guo */ #include #include #include #include #include #include #include #define SYSFS2HPI_ERROR -700 #define SCRATCHSIZE 60 int g_num_resources=0; /* total # resources */ SaHpiEntityPathT g_epbase; /* root entity path (from config) */ struct sysfsitems { GSList *resources; struct sysfs_bus *bus; int initialized; }; struct sensor { int num; char name[SYSFS_NAME_LEN]; struct sysfs_attribute *max; struct sysfs_attribute *min; struct sysfs_attribute *value; struct sysfs_attribute *div; SaHpiBoolT evt_enable; }; struct resource { SaHpiEntityPathT path; char name[SYSFS_NAME_LEN]; GSList *sensors; }; static inline void reading_int64_set(SaHpiSensorReadingT *reading, int value) { reading->IsSupported = SAHPI_TRUE; reading->Type = SAHPI_SENSOR_READING_TYPE_INT64; reading->Value.SensorInt64 = value; } /** * *sysfs2hpi_open: * @handler_config: pointer to config file * * This function creates an instance for the sysfs plugin * and returns a handler to the instance. * The two input parameters name and addr for the * mechanism's name and address, respectively, are N/A * for a sysfs plugin. **/ static void *sysfs2hpi_open(GHashTable *handler_config, unsigned int hid, oh_evt_queue *eventq) { struct oh_handler_state *hnd; struct sysfsitems *sys; char *er; if (!handler_config) { err("empty handler_config"); return NULL; } /* set up entity root in g_epbase */ er = (char *)g_hash_table_lookup(handler_config,"entity_root"); if (!er) { err("no entity root present"); return NULL; } oh_encode_entitypath(er, &g_epbase); hnd = malloc(sizeof(*hnd)); if (!hnd) { err("unable to allocate main handler"); return NULL; } memset(hnd, '\0', sizeof(*hnd)); /* assign config to handler_config and initialize rptcache */ hnd->config = handler_config; hnd->hid = hid; hnd->eventq = eventq; hnd->rptcache = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(hnd->rptcache); sys = malloc(sizeof(*sys)); if (!sys) { err("unable to allocate sysfsitems structure"); return NULL; } memset(sys, '\0', sizeof(*sys)); hnd->data = (void *) sys; return hnd; } /** * sysfs2hpi_close: * @hnd: pointer to instance * * Close the instance for the sysfs plugin. * Note: There is currently no way to test this code * as it is not called by the framework. **/ static void sysfs2hpi_close(void *hnd) { GSList *tmp; struct resource *r; struct sysfsitems *sys; struct oh_handler_state *inst = (struct oh_handler_state *)hnd; if (!inst) { err("no instance to delete"); return; } sys = inst->data; sysfs_close_bus(sys->bus); /* Free resources and their sensors */ if (g_slist_length(sys->resources) != 0) { g_slist_for_each(tmp, sys->resources) { r = (struct resource *)tmp->data; g_slist_free(r->sensors); g_slist_free(sys->resources); } } /* Free main instance */ free(inst); } /** * sysfs2hpi_get_event: * @hnd: pointer to handler instance * * This function gets a sysfs event from the sysfs event table * in instance.events. * * Return value: 0 if times out, > 0 is event is returned. **/ static int sysfs2hpi_get_event(void *hnd) { return 0; } /** * sysfs2hpi_setup_rdr: * @type: Sensor type * @str: string holding sensor name * @num_sensors: sensor number * @d: pointer to struct sysfs_device for this sensor * @r: pointer to struct resource for this sensor * @inst: pointer to instance * * Helper function to sysfs2hpi_assign_rdrs(). * Set up the RDR for either current, fan, voltage, * or temperature. * * Return value: 0 for success | Error code. **/ static int sysfs2hpi_setup_rdr(SaHpiSensorTypeT type, const char* str, int num_sensors, struct sysfs_device* d, struct resource* r, struct oh_handler_state* inst, struct oh_event *e) { struct sensor *s; unsigned char strinput[SYSFS_NAME_LEN]; int puid; SaHpiSensorDataFormatT *frmt; SaHpiRdrT *tmprdr; if ((type != SAHPI_TEMPERATURE) && (type != SAHPI_VOLTAGE) && (type != SAHPI_CURRENT) && (type != SAHPI_FAN)) { return SA_ERR_HPI_INVALID_PARAMS; } s = (struct sensor*)malloc(sizeof(*s)); if (!s) { err("unable to allocate sensor"); return SA_ERR_HPI_OUT_OF_SPACE; } memset(s,'\0',sizeof(*s)); s->num = num_sensors; switch(type) { case SAHPI_TEMPERATURE: snprintf(s->name, SYSFS_NAME_LEN, "%i:Temp Sensor",s->num); snprintf((char*)strinput, SYSFS_NAME_LEN, "temp_input%s", str); s->value = sysfs_get_device_attr(d, (char*)strinput); snprintf((char*)strinput, SYSFS_NAME_LEN, "temp_max%s", str); s->max = sysfs_get_device_attr(d, (char*)strinput); snprintf((char*)strinput, SYSFS_NAME_LEN, "temp_min%s", str); s->min = sysfs_get_device_attr(d, (char*)strinput); s->div = NULL; break; case SAHPI_VOLTAGE: snprintf(s->name, SYSFS_NAME_LEN, "%i:Voltage Sensor",s->num); snprintf((char*)strinput, SYSFS_NAME_LEN, "in_input%s", str); s->value = sysfs_get_device_attr(d, (char*)strinput); snprintf((char*)strinput, SYSFS_NAME_LEN, "in_max%s", str); s->max = sysfs_get_device_attr(d, (char*)strinput); snprintf((char*)strinput, SYSFS_NAME_LEN, "in_min%s", str); s->min = sysfs_get_device_attr(d, (char*)strinput); s->div = NULL; break; case SAHPI_CURRENT: snprintf(s->name, SYSFS_NAME_LEN, "%i:Current Sensor",s->num); snprintf((char*)strinput, SYSFS_NAME_LEN, "curr_input%s", str); s->value = sysfs_get_device_attr(d, (char*)strinput); snprintf((char*)strinput, SYSFS_NAME_LEN, "curr_max%s", str); s->max = sysfs_get_device_attr(d, (char*)strinput); snprintf((char*)strinput, SYSFS_NAME_LEN, "curr_min%s", str); s->min = sysfs_get_device_attr(d, (char*)strinput); s->div = NULL; break; case SAHPI_FAN: snprintf(s->name, SYSFS_NAME_LEN, "%i:Fan Sensor",s->num); snprintf((char*)strinput, SYSFS_NAME_LEN, "fan_input%s", str); s->value = sysfs_get_device_attr(d, (char*)strinput); snprintf((char*)strinput, SYSFS_NAME_LEN, "fan_max%s", str); s->max = sysfs_get_device_attr(d, (char*)strinput); snprintf((char*)strinput, SYSFS_NAME_LEN, "fan_min%s", str); s->min = sysfs_get_device_attr(d, (char*)strinput); snprintf((char*)strinput, SYSFS_NAME_LEN, "fan_div%s", str); s->div = sysfs_get_device_attr(d, (char*)strinput); break; default: /* should never be executed */ return SA_ERR_HPI_INVALID_PARAMS; } if (!s->value && !s->max && !s->min) { /* RDR doesn't exist */ free(s); return SYSFS2HPI_ERROR; } r->sensors = g_slist_append(r->sensors, s); tmprdr = (SaHpiRdrT *)malloc(sizeof(SaHpiRdrT)); if (!tmprdr) return SA_ERR_HPI_OUT_OF_SPACE; tmprdr->RecordId = num_sensors; tmprdr->RdrType = SAHPI_SENSOR_RDR; tmprdr->Entity.Entry[0].EntityType = SAHPI_ENT_SYS_MGMNT_SOFTWARE; tmprdr->Entity.Entry[0].EntityLocation = g_num_resources; tmprdr->Entity.Entry[1].EntityType = SAHPI_ENT_OTHER_SYSTEM_BOARD; tmprdr->Entity.Entry[1].EntityLocation = 0; /* 0 b/c only 1 board */ oh_concat_ep( &tmprdr->Entity, &g_epbase); tmprdr->RdrTypeUnion.SensorRec.Num = num_sensors; tmprdr->RdrTypeUnion.SensorRec.Type = type; /* Ignoring .Category, .EventCtrl, and .Events b/c sysfs has no events */ frmt = &tmprdr->RdrTypeUnion.SensorRec.DataFormat; frmt->IsSupported = SAHPI_TRUE; frmt->ReadingType = SAHPI_SENSOR_READING_TYPE_INT64; switch(type) { case SAHPI_TEMPERATURE: /* Interpreted temperature is in degrees Celcius */ frmt->BaseUnits = SAHPI_SU_DEGREES_C; break; case SAHPI_VOLTAGE: /* Interpreted voltage is in Volts */ frmt->BaseUnits = SAHPI_SU_VOLTS; break; case SAHPI_CURRENT: /* Interpreted current is in Amps */ frmt->BaseUnits = SAHPI_SU_AMPS; break; case SAHPI_FAN: /* Interpreted fan is in RPMs */ frmt->BaseUnits = SAHPI_SU_RPM; break; default: /* should never be executed */ return SA_ERR_HPI_INVALID_PARAMS; } frmt->ModifierUnits = 0; frmt->ModifierUse = 0; frmt->Percentage = 0; /* Fix Me : I don't know range*/ //frmt->Range = 0; frmt->AccuracyFactor = 0; #if 0 e->u.rdr_event.rdr.RdrTypeUnion.SensorRec.Ignore = FALSE; e->u.rdr_event.rdr.RdrTypeUnion.SensorRec.DataFormat.ReadingFormats = SAHPI_SRF_RAW | SAHPI_SRF_INTERPRETED; e->u.rdr_event.rdr.RdrTypeUnion.SensorRec.DataFormat.IsNumeric = TRUE; switch(type) { case SAHPI_TEMPERATURE: /* Interpreted temperature is in degrees Celcius */ e->u.rdr_event.rdr.RdrTypeUnion.SensorRec.DataFormat.BaseUnits = SAHPI_SU_DEGREES_C; break; case SAHPI_VOLTAGE: /* Interpreted voltage is in Volts */ e->u.rdr_event.rdr.RdrTypeUnion.SensorRec.DataFormat.BaseUnits = SAHPI_SU_VOLTS; break; case SAHPI_CURRENT: /* Interpreted current is in Amps */ e->u.rdr_event.rdr.RdrTypeUnion.SensorRec.DataFormat.BaseUnits = SAHPI_SU_AMPS; break; case SAHPI_FAN: /* Interpreted fan is in RPMs */ e->u.rdr_event.rdr.RdrTypeUnion.SensorRec.DataFormat.BaseUnits = SAHPI_SU_RPM; break; default: /* should never be executed */ return SA_ERR_HPI_INVALID_PARAMS; } e->u.rdr_event.rdr.RdrTypeUnion.SensorRec.ThresholdDefn.IsThreshold = SAHPI_TRUE; e->u.rdr_event.rdr.RdrTypeUnion.SensorRec.ThresholdDefn.TholdCapabilities = SAHPI_STC_RAW|SAHPI_STC_INTERPRETED; e->u.rdr_event.rdr.RdrTypeUnion.SensorRec.ThresholdDefn.ReadThold = SAHPI_STM_LOW_CRIT | SAHPI_STM_UP_CRIT; e->u.rdr_event.rdr.RdrTypeUnion.SensorRec.ThresholdDefn.WriteThold = SAHPI_STM_LOW_CRIT | SAHPI_STM_UP_CRIT; e->u.rdr_event.rdr.RdrTypeUnion.SensorRec.ThresholdDefn.FixedThold = 0; e->u.rdr_event.rdr.IdString.DataType = SAHPI_TL_TYPE_ASCII6; e->u.rdr_event.rdr.IdString.Language = SAHPI_LANG_ENGLISH; e->u.rdr_event.rdr.IdString.DataLength = strlen(s->name); strcpy(e->u.rdr_event.rdr.IdString.Data, s->name); #endif puid = oh_uid_lookup(&tmprdr->Entity); if (puid < 0) { err("could not find correct parent"); return SA_ERR_HPI_ERROR; } if (oh_add_rdr(inst->rptcache, puid, tmprdr, (void *)s, 0)) { err("unable to add RDR to RPT"); return SA_ERR_HPI_ERROR; } e->rdrs = g_slist_append(e->rdrs, tmprdr); /* Append RDR to event */ return 0; } /** * sysfs2hpi_assign_rdrs: * @d: pointer to sysfs_device structure * @r: pointer to resource structure * @inst: pointer to instance * * Helper function for sysfs2hpi_assign_resource(). * Assigns RDR values. * Currently, there are the following possible RDRs: * - current * - fan * - voltage * - temp * The fields: alarms, beep, eeprom, pwm, vid, and vrm * are not used at this time. * * Return value: **/ static int sysfs2hpi_assign_rdrs(struct sysfs_device* d, struct resource* r, struct oh_handler_state* inst, struct oh_event *e) { int num_sensors = 0; char str[2]; int i; /* Max # fan, voltage, temp, current entries is set by sysfs. Hard-coded here. Voltage starts at 0. All others start at 1. Current has no max. */ const int fanmax = 3; const int voltagemax = 8; const int tempmax = 3; /* Set up current RDR */ i=0; while(i != -1) { i++; snprintf(str, sizeof(str), "%d", i); if (sysfs2hpi_setup_rdr(SAHPI_CURRENT, str, ++num_sensors, d, r, inst, e) != 0) { i=-1; /* keep going until we get an error returned */ num_sensors--; } } /* Set up fan RDR */ for (i=1;i<=fanmax;i++) { snprintf(str, sizeof(str), "%d", i); if (sysfs2hpi_setup_rdr(SAHPI_FAN, str, ++num_sensors, d, r, inst, e) != 0) { num_sensors--; } } /* Set up voltage RDR */ for (i=0;i<=voltagemax;i++) { snprintf(str, sizeof(str), "%d", i); if (sysfs2hpi_setup_rdr(SAHPI_VOLTAGE, str, ++num_sensors, d, r, inst, e) != 0) { num_sensors--; } } /* Set up temp RDR */ for (i=1;i<=tempmax;i++) { snprintf(str, sizeof(str), "%d", i); if (sysfs2hpi_setup_rdr(SAHPI_TEMPERATURE, str, ++num_sensors, d, r, inst, e) != 0) { num_sensors--; } } return 0; } /** * sysfs2hpi_assign_resource: * @d: pointer to sysfs_device structure * @inst: pointer to instance * * Helper function for sysfs2hpi_discover_resources(). * This function fills in the resource structure and * places the event for the resource on the internal * event queue. * Currently, all resources for sysfs are critical * as there is no way to differentiate priority * between devices. [No data available to tell * location of device -- i2c bus # doesn't; sysfs * data is all for one device and also doesn't tell * location.] * * Return value: 0 for success | Error code **/ static int sysfs2hpi_assign_resource(struct sysfs_device* d, struct oh_handler_state* inst) { struct oh_event *e; struct resource *r; struct sysfsitems *sys; r = (struct resource *)malloc(sizeof(*r)); if (!r) { err("unable to allocate resource"); return SA_ERR_HPI_OUT_OF_SPACE; } memset(r,'\0',sizeof(*r)); r->path.Entry[0].EntityType = SAHPI_ENT_SYS_MGMNT_SOFTWARE; r->path.Entry[0].EntityLocation = g_num_resources; r->path.Entry[1].EntityType = SAHPI_ENT_OTHER_SYSTEM_BOARD; r->path.Entry[1].EntityLocation = 0; /* 0 b/c only 1 board */ //snprintf(r->name, "%s_%s", d->name, d->bus_id); strncpy(r->name,d->name,SYSFS_NAME_LEN); sys = inst->data; sys->resources = g_slist_append(sys->resources, r); e = (struct oh_event *)malloc(sizeof(*e)); if (!e) { err("unable to allocate event"); return SA_ERR_HPI_OUT_OF_SPACE; } memset(e, '\0', sizeof(struct oh_event)); e->hid = inst->hid; oh_concat_ep( &(r->path), &g_epbase); e->resource.ResourceId = oh_uid_from_entity_path(&(r->path)); e->resource.EntryId = e->resource.ResourceId; /* EntryId = ResourceId */ /* Note: .res_event.entry.ResourceInfo currently unassigned */ memcpy(&(e->resource.ResourceEntity),&(r->path),sizeof(SaHpiEntityPathT)); e->resource.ResourceCapabilities = SAHPI_CAPABILITY_RESOURCE|SAHPI_CAPABILITY_RDR|SAHPI_CAPABILITY_SENSOR; e->resource.ResourceSeverity = SAHPI_CRITICAL; /* sysfs data always critical */ e->resource.ResourceTag.DataType = SAHPI_TL_TYPE_ASCII6; e->resource.ResourceTag.Language = SAHPI_LANG_ENGLISH; e->resource.ResourceTag.DataLength = strlen(r->name); strcpy((char*)e->resource.ResourceTag.Data, r->name); e->event.Source = e->resource.ResourceId; e->event.Timestamp = SAHPI_TIME_UNSPECIFIED; e->event.Severity = e->resource.ResourceSeverity; e->event.EventType = SAHPI_ET_RESOURCE; e->event.EventDataUnion.ResourceEvent.ResourceEventType = SAHPI_RESE_RESOURCE_ADDED; /* add resource */ if (0 != oh_add_resource(inst->rptcache, &(e->resource), NULL, 0)) { err("unable to add resource to RPT"); return SA_ERR_HPI_ERROR; } /* Assign RDRs to this resource */ sysfs2hpi_assign_rdrs(d, r, inst, e); /* add event */ oh_evt_queue_push(inst->eventq, e); return 0; } /** * sysfs2hpi_discover_resources: * @hnd: void pointer to handler * * Discover the resources in sysfs. * Currently, we are only discovering devices on * the i2c bus. Each device is a resource. All * data underneath is part of the RDR. * * Return value: 0 for success | Error code **/ static int sysfs2hpi_discover_resources(void *hnd) { struct sysfs_device *d = NULL; struct oh_handler_state *inst = (struct oh_handler_state *)hnd; struct sysfsitems *sys; if (!hnd) { err("null handle"); return SA_ERR_HPI_INVALID_PARAMS; } /* * This plug-in is written for hardwired i2c sensors, * and therefore doesn't really need to do any discovery * after the initial discovery */ sys = inst->data; if (sys->initialized) return 0; sys->bus = sysfs_open_bus("i2c"); if (!sys->bus) { err("unable to open i2c bus"); return SA_ERR_HPI_NOT_PRESENT; /* better error checking would ensure a better return val */ } if (!(sys->bus->devices)) { err("no i2c devices found"); sysfs_close_bus(sys->bus); sys->initialized++; return 0; } /* * One resource per device under /sys/bus/i2c/devices */ oh_uid_initialize(); dlist_for_each_data(sys->bus->devices, d, struct sysfs_device) { int ret = 0; ret = sysfs2hpi_assign_resource(d, inst); g_num_resources++; if (0 != ret) { return ret; } } /* end dlist_for_each_data */ sys->initialized++; return 0; } /** * sysfs2hpi_get_sensor_reading: * @hnd: void pointer to handler * @id: ResourceId for resource with data * @num: Sensor number for sensor with data * @data: pointer to SaHpiSensorReading data type * * Get the data for the RDR sensor passed to this function. * This function rereads the data from the machine in case it * has changed. * Note: libsysfs documentation states that current, voltage, * and temperature raw readings need to be divided by 1000 to * get interpreted values. fan readings need to be divided * by fan_div. We are assuming that if there is not a div * parameter, this is not a fan sensor (This assumption is * not fully robust.). * * Return value: 0 for success | Error code **/ /** * Change: * all readings get interpreted values **/ static int sysfs2hpi_get_sensor_reading(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiSensorReadingT *reading, SaHpiEventStateT *state) { struct sensor *s; struct sysfs_attribute *sysattr = NULL; struct oh_handler_state *inst = (struct oh_handler_state *)hnd; SaHpiRdrT *tmprdr; if (!hnd) { err("null handle"); return SA_ERR_HPI_INVALID_PARAMS; } /* sequential search of rdr list for current RDR */ tmprdr = oh_get_rdr_next(inst->rptcache, id, 0); while ((tmprdr->RdrTypeUnion.SensorRec.Num != num) && (tmprdr)) { tmprdr = oh_get_rdr_next(inst->rptcache, id, tmprdr->RecordId); } if (tmprdr->RdrTypeUnion.SensorRec.Num != num) { /* didn't find sensor */ err("could not find sensor"); return SA_ERR_HPI_INVALID_DATA; } /* get sensor data */ s = (struct sensor *) oh_get_rdr_data(inst->rptcache, id, tmprdr->RecordId); if (!s) { err("could not get sensor data"); return SA_ERR_HPI_INVALID_DATA; } if (!s->value) { err("input data for sensor not available"); return SA_ERR_HPI_INVALID_DATA; } *state = 0x0000; sysattr = sysfs_open_attribute(s->value->path); if (!sysattr) { err("failed opening attribute at %s", s->value->path); return SA_ERR_HPI_INVALID_DATA; } if (sysfs_read_attribute(sysattr)) { err("error attempting to read value of %s",s->name); sysfs_close_attribute(sysattr); return SA_ERR_HPI_INVALID_DATA; } reading_int64_set(reading, atoi(sysattr->value)); sysfs_close_attribute(sysattr); return 0; } /** * sysfs2hpi_get_sensor_thresholds: * @hnd: void pointer to handler * @id: ResourceId for resource with data * @num: Sensor number for sensor with data * @thres: pointer to SaHpiSensorThresholdsT data type * * Get the thresholds for the RDR sensor passed to this function. * This function rereads the data from the machine in case it * has changed. * Note: libsysfs documentation states that current, voltage, * and temperature raw readings need to be divided by 1000 to * get interpreted values. fan readings need to be divided * by fan_div. We are assuming that if there is not a div * parameter, this is not a fan sensor (This assumption is * not fully robust.). * * Return value: 0 for success | Error code **/ static int sysfs2hpi_get_sensor_thresholds(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiSensorThresholdsT *thres) { struct sensor *s; struct sysfs_attribute *sysattr = NULL; struct oh_handler_state *inst = (struct oh_handler_state *)hnd; SaHpiRdrT *tmprdr; if (!hnd) { err("null handle"); return SA_ERR_HPI_INVALID_PARAMS; } /* sequential search of rdr list for current RDR */ tmprdr = oh_get_rdr_next(inst->rptcache, id, 0); while ((tmprdr->RdrTypeUnion.SensorRec.Num != num) && (tmprdr)) { tmprdr = oh_get_rdr_next(inst->rptcache, id, tmprdr->RecordId); } if (tmprdr->RdrTypeUnion.SensorRec.Num != num) { /* didn't find sensor */ err("could not find sensor"); return SA_ERR_HPI_INVALID_DATA; } /* get sensor data */ s = (struct sensor *) oh_get_rdr_data(inst->rptcache, id, tmprdr->RecordId); if (!s) { err("could not get sensor thresholds"); return SA_ERR_HPI_INVALID_DATA; } /* * sysfs only defines a min and a max * setting these to LowCritical and UpCritical, respectively * The min value for temperature can technically be a hysteresis value, * but this currently is not part of the hysteresis fields. * Setting ValuesPresent for all other items to 0. */ /* get min values */ sysattr = sysfs_open_attribute(s->min->path); if (!sysattr) { err("failed opening attribute at %s", s->min->path); return SA_ERR_HPI_INVALID_DATA; } if (sysfs_read_attribute(sysattr)) { err("error attempting to read value of %s",s->name); sysfs_close_attribute(sysattr); return SA_ERR_HPI_INVALID_DATA; } reading_int64_set(&thres->LowCritical, atoi(sysattr->value)); sysfs_close_attribute(sysattr); sysattr = NULL; sysattr = sysfs_open_attribute(s->max->path); if (!sysattr) { err("failed opening attribute at %s", s->max->path); return SA_ERR_HPI_INVALID_DATA; } if (sysfs_read_attribute(sysattr)) { err("error attempting to read value of %s",s->name); sysfs_close_attribute(sysattr); return SA_ERR_HPI_INVALID_DATA; } reading_int64_set(&thres->UpCritical, atoi(sysattr->value)); sysfs_close_attribute(sysattr); thres->LowMajor.IsSupported = SAHPI_FALSE; thres->LowMinor.IsSupported = SAHPI_FALSE; thres->UpMajor.IsSupported = SAHPI_FALSE; thres->UpMinor.IsSupported = SAHPI_FALSE; thres->PosThdHysteresis.IsSupported = SAHPI_FALSE; thres->NegThdHysteresis.IsSupported = SAHPI_FALSE; #if 0 thres->LowCritical.Raw = atoi(tmp); thres->LowCritical.ValuesPresent = SAHPI_SRF_RAW; thres->LowCritical.EventStatus.SensorStatus = s->enables.SensorStatus; thres->LowCritical.EventStatus.EventStatus = s->enables.AssertEvents; thres->LowCritical.Interpreted.Type = SAHPI_SENSOR_INTERPRETED_TYPE_UINT32; if (!s->div) { /* assume not a fan sensor */ thres->LowCritical.Interpreted.Value.SensorUint32 = (SaHpiUint32T) thres->LowCritical.Raw/1000; } else { /* fan sensor */ if (sysfs_read_attribute_value(s->div->path,tmp,SCRATCHSIZE)) { err("error attempting to read value of %s",s->name); return SA_ERR_HPI_INVALID_DATA; } thres->LowCritical.Interpreted.Value.SensorUint32 = (SaHpiUint32T) thres->LowCritical.Raw/atoi(tmp); } if (sysfs_read_attribute_value(s->max->path,tmp,SCRATCHSIZE)) { err("error attempting to read value of %s",s->name); return SA_ERR_HPI_INVALID_DATA; } /* get max values */ thres->UpCritical.Raw = atoi(tmp); thres->UpCritical.ValuesPresent = SAHPI_SRF_RAW; thres->UpCritical.EventStatus.SensorStatus = s->enables.SensorStatus; thres->UpCritical.EventStatus.EventStatus = s->enables.AssertEvents; thres->UpCritical.Interpreted.Type = SAHPI_SENSOR_INTERPRETED_TYPE_UINT32; if (!s->div) { /* assume not a fan sensor */ thres->UpCritical.Interpreted.Value.SensorUint32 = (SaHpiUint32T) thres->UpCritical.Raw/1000; } else { /* fan sensor */ if (sysfs_read_attribute_value(s->div->path,tmp,SCRATCHSIZE)) { err("error attempting to read value of %s",s->name); return SA_ERR_HPI_INVALID_DATA; } thres->UpCritical.Interpreted.Value.SensorUint32 = (SaHpiUint32T) thres->UpCritical.Raw/atoi(tmp); } thres->LowMajor.ValuesPresent = 0; thres->LowMinor.ValuesPresent = 0; thres->UpMajor.ValuesPresent = 0; thres->UpMinor.ValuesPresent = 0; thres->PosThdHysteresis.ValuesPresent = 0; thres->NegThdHysteresis.ValuesPresent = 0; #endif return 0; } /** * sysfs2hpi_set_reading: * @rdr - current RDR * @attr - sysfs attribute to be set * @div - sysfs attribute for div, if needed * @reading - sensor reading to set * * Helper function to sysfs2hpi_set_sensor_thresholds. * Set an individual reading of a sensor. * * Return value: 0 for success | Error code **/ static int sysfs2hpi_set_sensor_reading(SaHpiRdrT *rdr, struct sysfs_attribute *attr, SaHpiSensorReadingT reading) { char tmp[SCRATCHSIZE]; if (reading.Type == SAHPI_SENSOR_READING_TYPE_INT64) { snprintf(tmp, SCRATCHSIZE, "%lld", reading.Value.SensorInt64); if (sysfs_write_attribute(attr,tmp,SCRATCHSIZE)) { err("error attempting to write value"); return SA_ERR_HPI_INVALID_DATA; } return 0; } err("No values were set"); return SA_ERR_HPI_INVALID_REQUEST; } /** * sysfs2hpi_set_sensor_thresholds: * @hnd: void pointer to handler * @id: ResourceId for resource with data * @num: Sensor number for sensor with data * @thres: pointer to SaHpiSensorThresholdsT data type * * Functions to set a given sensor's thresholds values * * Return value: 0 for success | Error code **/ static int sysfs2hpi_set_sensor_thresholds(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, const SaHpiSensorThresholdsT *thres) { struct sensor *s; struct oh_handler_state *inst = (struct oh_handler_state *)hnd; SaHpiRdrT *tmprdr; int ret = 0; if (!hnd) { err("null handle"); return SA_ERR_HPI_INVALID_PARAMS; } /* sequential search of rdr list for current RDR */ tmprdr = oh_get_rdr_next(inst->rptcache, id, 0); while ((tmprdr->RdrTypeUnion.SensorRec.Num != num) && (tmprdr)) { tmprdr = oh_get_rdr_next(inst->rptcache, id, tmprdr->RecordId); } if (tmprdr->RdrTypeUnion.SensorRec.Num != num) { /* didn't find sensor */ err("could not find sensor"); return SA_ERR_HPI_INVALID_DATA; } /* get sensor data */ s = (struct sensor *) oh_get_rdr_data(inst->rptcache, id, tmprdr->RecordId); if (!s) { err("could not get sensor data for thresholds"); return SA_ERR_HPI_INVALID_DATA; } /* * sysfs only defines a min and a max, which have been mapped * to LowCritical and UpCritical, respectively, so all other input * will be ignored */ if ((SAHPI_TRUE != thres->LowCritical.IsSupported) && (SAHPI_TRUE != thres->UpCritical.IsSupported)) { /* if no LowCritical or UpCritical values are sent, return error */ err("No LowCritical or UpCritical values were sent"); return SA_ERR_HPI_INVALID_PARAMS; } /* set min value */ if (SAHPI_TRUE == thres->LowCritical.IsSupported) { ret = sysfs2hpi_set_sensor_reading(tmprdr, s->min, thres->LowCritical); } /* set max values */ if (SAHPI_TRUE == thres->UpCritical.IsSupported) { ret = sysfs2hpi_set_sensor_reading(tmprdr, s->max, thres->UpCritical); } return ret; } /** * sysfs2hpi_get_sensor_event_enables: * @hnd: void pointer to handler * @id: ResourceId for resource with data * @num: Sensor number for sensor with data * @enables: pointer to SaHpiSensorEvtEnablesT data type * * Get the enables field from the RDR passed to this function. * * Return value: 0 for success | Error code **/ static int sysfs2hpi_get_sensor_event_enables(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiBoolT *enable) { struct sensor *s; struct oh_handler_state *inst = (struct oh_handler_state *)hnd; SaHpiRdrT *tmprdr; if (!hnd) { err("null handle"); return SA_ERR_HPI_INVALID_PARAMS; } /* sequential search of rdr list for current RDR */ tmprdr = oh_get_rdr_next(inst->rptcache, id, 0); while ((tmprdr->RdrTypeUnion.SensorRec.Num != num) && (tmprdr)) { tmprdr = oh_get_rdr_next(inst->rptcache, id, tmprdr->RecordId); } if (tmprdr->RdrTypeUnion.SensorRec.Num != num) { /* didn't find sensor */ err("could not find sensor"); return SA_ERR_HPI_INVALID_DATA; } /* get sensor data */ s = (struct sensor *) oh_get_rdr_data(inst->rptcache, id, tmprdr->RecordId); if (!s) { err("could not get sensor data for event enables"); return SA_ERR_HPI_INVALID_DATA; } *enable = s->evt_enable; return 0; } /** * sysfs2hpi_set_sensor_event_enables: * @hnd: void pointer to handler * @id: ResourceId for resource with data * @num: Sensor number for sensor with data * @enables: pointer to SaHpiSensorEvtEnablesT data type * * Set the enables field on the RDR passed to this function. * * Return value: 0 for success | Error code **/ static int sysfs2hpi_set_sensor_event_enables(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiBoolT enable) { struct sensor *s; struct oh_handler_state *inst = (struct oh_handler_state *)hnd; SaHpiRdrT *tmprdr; if (!hnd) { err("null handle"); return SA_ERR_HPI_INVALID_PARAMS; } /* sequential search of rdr list for current RDR */ tmprdr = oh_get_rdr_next(inst->rptcache, id, 0); while ((tmprdr->RdrTypeUnion.SensorRec.Num != num) && (tmprdr)) { tmprdr = oh_get_rdr_next(inst->rptcache, id, tmprdr->RecordId); } if (tmprdr->RdrTypeUnion.SensorRec.Num != num) { /* didn't find sensor */ err("could not find sensor"); return SA_ERR_HPI_INVALID_DATA; } /* get sensor data */ s = (struct sensor *) oh_get_rdr_data(inst->rptcache, id, tmprdr->RecordId); if (!s) { err("could not get sensor data for event enables"); return SA_ERR_HPI_INVALID_DATA; } s->evt_enable = enable; return 0; } void * oh_open (GHashTable *, unsigned int, oh_evt_queue *) __attribute__ ((weak, alias("sysfs2hpi_open"))); void * oh_close (void *) __attribute__ ((weak, alias("sysfs2hpi_close"))); void * oh_get_event (void *) __attribute__ ((weak, alias("sysfs2hpi_get_event"))); void * oh_discover_resources (void *) __attribute__ ((weak, alias("sysfs2hpi_discover_resources"))); void * oh_get_sensor_reading (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiSensorReadingT *, SaHpiEventStateT *) __attribute__ ((weak, alias("sysfs2hpi_get_sensor_reading"))); void * oh_get_sensor_thresholds (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiSensorThresholdsT *) __attribute__ ((weak, alias("sysfs2hpi_get_sensor_thresholds"))); void * oh_set_sensor_thresholds (void *, SaHpiResourceIdT, SaHpiSensorNumT, const SaHpiSensorThresholdsT *) __attribute__ ((weak, alias("sysfs2hpi_set_sensor_thresholds"))); void * oh_get_sensor_event_enables (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT *) __attribute__ ((weak, alias("sysfs2hpi_get_sensor_event_enables"))); void * oh_set_sensor_event_enables (void *, SaHpiResourceIdT id, SaHpiSensorNumT, SaHpiBoolT *) __attribute__ ((weak, alias("sysfs2hpi_set_sensor_event_enables"))); openhpi-3.6.1/plugins/sysfs/Makefile.am0000644000175100017510000000355412575647277017074 0ustar mohanmohan# # Copyright (c) 2003, Intel Corporation # All rights reserved. # # Redistribution and use in source and binary forms, with or # without modification, are permitted provided that the following # conditions are met: # # Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the distribution. # # Neither the name of Intel Corporation nor the names # of its contributors may be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, # OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # MAINTAINERCLEANFILES = Makefile.in AM_CPPFLAGS = -DG_LOG_DOMAIN=\"sysfs\" AM_CPPFLAGS += @OPENHPI_INCLUDES@ -I/usr/include/sysfs pkglib_LTLIBRARIES = libsysfs2hpi.la libsysfs2hpi_la_SOURCES = sysfs2hpi.c libsysfs2hpi_la_LIBADD = -lsysfs $(top_builddir)/utils/libopenhpiutils.la libsysfs2hpi_la_LDFLAGS = -module -version-info @HPI_LIB_VERSION@ openhpi-3.6.1/plugins/sysfs/README0000644000175100017510000000152312575647277015712 0ustar mohanmohan################################################################################ In order to use this plugin, you must have a machine with libsysfs version 0.3.0* installed (found in sysutils 0.3.0). Follow the instructions to install. To install this code: make make install (as root) Can be verified using program examples/list_resources and examples/set_resources ----------------------- Developer note: - If you'd like to test for an imaginary system with more entities, you can point to an imaginary sysfs file system: * create a mounts file (like /proc/mounts) that has only one entry pointing to your imaginary sysfs file system * change include/libsysfs.h to point to your mounts file (SYSFS_PROC_MNTS) * in lib/ run "make" and "make install" * libsysfs should now be looking at your imaginary file system for sysfs entries openhpi-3.6.1/plugins/rtas/0000755000175100017510000000000012605014556014611 5ustar mohanmohanopenhpi-3.6.1/plugins/rtas/rtas_watchdog.c0000644000175100017510000000335712575647277017640 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Daniel de Araujo */ #include SaErrorT rtas_get_watchdog_info(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num, SaHpiWatchdogT *wdt) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_set_watchdog_info(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num, SaHpiWatchdogT *wdt) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_reset_watchdog(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num) { return SA_ERR_HPI_INTERNAL_ERROR; } void * oh_get_watchdog_info (void *, SaHpiResourceIdT, SaHpiWatchdogNumT, SaHpiWatchdogT *) __attribute__ ((weak, alias("rtas_get_watchdog_info"))); void * oh_set_watchdog_info (void *, SaHpiResourceIdT, SaHpiWatchdogNumT, SaHpiWatchdogT *) __attribute__ ((weak, alias("rtas_set_watchdog_info"))); void * oh_reset_watchdog (void *, SaHpiResourceIdT, SaHpiWatchdogNumT) __attribute__ ((weak, alias("rtas_reset_watchdog"))); openhpi-3.6.1/plugins/rtas/rtas_sensor.c0000644000175100017510000004026012575647277017343 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Daniel de Araujo * Renier Morales * */ #include #include #include #include #include #include #include #include #include #include #include /** * rtas_get_sensor_reading: * @hnd: Handler data pointer. * @rid: Resource ID. * @sid: Sensor ID. * @data: Location to store sensor's value (may be NULL). * @state: Location to store sensor's state (may be NULL). * * Retrieves a sensor's value and/or state. Both @data and @state * may be NULL, in which case this function can be used to test for * sensor presence. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_SENSOR. * SA_ERR_HPI_INVALID_REQUEST - Sensor is disabled. * SA_ERR_HPI_NOT_PRESENT - Sensor doesn't exist. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT rtas_get_sensor_reading(void *handler, SaHpiResourceIdT resourceid, SaHpiSensorNumT sensornum, SaHpiSensorReadingT *reading, SaHpiEventStateT *e_state) { SaHpiSensorReadingT sensor_reading; SaHpiEventStateT sensor_state; struct SensorInfo *sensor_info; SaHpiInt32T state = 0, val; char err_buf[150]; size_t sizebuf = sizeof(err_buf); if (!handler) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } struct oh_handler_state *handler_state = (struct oh_handler_state *)handler; //do some locking here...... /* Check if resource exists and has sensor capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(handler_state->rptcache, resourceid); if (!rpt) { //unlock it return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { //unlock it return(SA_ERR_HPI_CAPABILITY); } /* Check if sensor exists and is enabled */ SaHpiRdrT *rdr = oh_get_rdr_by_type(handler_state->rptcache, resourceid, SAHPI_SENSOR_RDR, sensornum); if (rdr == NULL) { //unlock it return(SA_ERR_HPI_NOT_PRESENT); } sensor_info = (struct SensorInfo *)oh_get_rdr_data(handler_state->rptcache, resourceid, rdr->RecordId); if (sensor_info == NULL) { //unlock it err("No sensor data. Sensor=%s", rdr->IdString.Data); return(SA_ERR_HPI_INTERNAL_ERROR); } memset(&sensor_reading, 0, sizeof(SaHpiSensorReadingT)); sensor_state = SAHPI_ES_UNSPECIFIED; dbg("Sensor Reading: Resource=%s; RDR=%s", rpt->ResourceTag.Data, rdr->IdString.Data); /************************************************************ * Get sensor's reading. * Need to go through this logic, since user may request just * the event state for a readable sensor. Need to translate * sensor reading to event in this case. ************************************************************/ if (rdr->RdrTypeUnion.SensorRec.DataFormat.IsSupported == SAHPI_TRUE) { state = rtas_get_sensor(sensor_info->token, sensor_info->index, &val); if (state < 0) { decode_rtas_error(state, err_buf, sizebuf, sensor_info->token, sensor_info->index); err("Cannot determine sensor's reading. Error=%s", err_buf); //unlock it /* NEED TO MAP RTAS ERRORS TO HPI ERRORS */ return(state); } else { /* if the return code is 990x. we must sleep for 10^x milliseconds before * trying to query the rtas sensor again */ if ((state & TOKEN_MASK) == 9900) { sleep((exp10(state & TIME_MASK))); state = rtas_get_sensor(sensor_info->token, sensor_info->index, &val); if (state < 0) { decode_rtas_error(state, err_buf, sizebuf, sensor_info->token, sensor_info->index); err("Cannot determine sensor's reading. Error=%s", err_buf); //unlock it /* NEED TO MAP RTAS ERRORS TO HPI ERRORS */ return(state); } } sensor_reading.IsSupported = SAHPI_TRUE; sensor_reading.Type = rdr->RdrTypeUnion.SensorRec.DataFormat.ReadingType; switch (sensor_reading.Type) { case SAHPI_SENSOR_READING_TYPE_INT64: sensor_reading.Value.SensorInt64 = val; break; case SAHPI_SENSOR_READING_TYPE_UINT64: sensor_reading.Value.SensorUint64 = (SaHpiUint32T)val; break; case SAHPI_SENSOR_READING_TYPE_FLOAT64: sensor_reading.Value.SensorFloat64 = (SaHpiFloat64T)val; break; case SAHPI_SENSOR_READING_TYPE_BUFFER: memcpy(sensor_reading.Value.SensorBuffer, &val, sizeof(val)); break; default: break; } sensor_info->current_val = val; } } else { sensor_reading.IsSupported = SAHPI_FALSE; } /****************************************************************** * We already grabbed the the sensor's state in rtas_get_sensor. * We now need to translate it into an event state and write it * to the stored location. ******************************************************************/ /* If we couldn't get read the data, just assign the state to the one found during discovery */ if (sensor_reading.IsSupported == SAHPI_FALSE) { *e_state = sensor_info->current_state; } else { switch ((rtasSensorState)state) { case SENSOR_OK: sensor_state = SAHPI_ES_UNSPECIFIED; sensor_info->current_state = SAHPI_ES_UNSPECIFIED; break; case SENSOR_CRITICAL_LOW: sensor_state = SAHPI_ES_LOWER_CRIT; sensor_info->current_state = SAHPI_ES_LOWER_CRIT; break; case SENSOR_WARNING_LOW: sensor_state = SAHPI_ES_LOWER_MINOR; sensor_info->current_state = SAHPI_ES_LOWER_MINOR; break; case SENSOR_NORMAL: sensor_state = SAHPI_ES_OK; sensor_info->current_state = SAHPI_ES_OK; break; case SENSOR_WARNING_HIGH: sensor_state = SAHPI_ES_UPPER_MINOR; sensor_info->current_state = SAHPI_ES_UPPER_MINOR; break; case SENSOR_CRITICAL_HIGH: sensor_state = SAHPI_ES_UPPER_CRIT; sensor_info->current_state = SAHPI_ES_UPPER_CRIT; break; default: sensor_state = SAHPI_ES_UNSPECIFIED; sensor_info->current_state = SAHPI_ES_UNSPECIFIED; break; } } /* sinfo->cur_state = working_state; */ if (reading) memcpy(reading, &sensor_reading, sizeof(SaHpiSensorReadingT)); if (e_state) memcpy(e_state, &sensor_state, sizeof(SaHpiEventStateT)); //unlock it return(SA_OK); } /** * snmp_bc_get_sensor_thresholds: * @handler: Handler data pointer. * @resourceid: Resource ID. * @sensornum: Sensor Number. * @threshold: Location to store sensor's threshold values. * * Retreives sensor's threshold values, if defined. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_SENSOR. * SA_ERR_HPI_INVALID_CMD - Sensor is not threshold type, has accessible or readable thresholds. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. * SA_ERR_HPI_NOT_PRESENT - Sensor doesn't exist. **/ SaErrorT rtas_get_sensor_thresholds(void *handler, SaHpiResourceIdT resourceid, SaHpiSensorNumT sensornum, SaHpiSensorThresholdsT *thresholds) { struct SensorInfo *sinfo; struct oh_handler_state *handler_state = (struct oh_handler_state *)handler; if (!handler || !thresholds) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } //do locking stuff here /* Check if resource exists and has sensor capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(handler_state->rptcache, resourceid); if (!rpt) { //unlock it return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { //unlock it return(SA_ERR_HPI_CAPABILITY); } /* Check if sensor exits and has readable thresholds */ SaHpiRdrT *rdr = oh_get_rdr_by_type(handler_state->rptcache, resourceid, SAHPI_SENSOR_RDR, sensornum); if (rdr == NULL){ //unlock it return(SA_ERR_HPI_NOT_PRESENT); } sinfo = (struct SensorInfo *)oh_get_rdr_data(handler_state->rptcache, resourceid, rdr->RecordId); if (sinfo == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); //unlock it return(SA_ERR_HPI_INTERNAL_ERROR); } /* Since the RTAS library doesn't support reading of thresholds, return the * appropriate return code */ //unlock it return SA_ERR_HPI_INVALID_CMD; } /** * snmp_bc_set_sensor_thresholds: * @handler: Handler data pointer. * @resourceid: Resource ID. * @sensornum: Sensor ID. * @thresholds: Location of sensor's settable threshold values. * * Sets sensor's threshold values. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_SENSOR. * SA_ERR_HPI_INVALID_CMD - Non-writable thresholds or invalid thresholds. * SA_ERR_HPI_INVALID_DATA - Threshold values out of order; negative hysteresis * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. * SA_ERR_HPI_NOT_PRESENT - Sensor doesn't exist. **/ SaErrorT rtas_set_sensor_thresholds(void *handler, SaHpiResourceIdT resourceid, SaHpiSensorNumT sensornum, const SaHpiSensorThresholdsT *thresholds) { struct oh_handler_state *handler_state = (struct oh_handler_state *)handler; struct SensorInfo *sinfo; if (!handler || !thresholds) { err("Invalid parameter"); return(SA_ERR_HPI_INVALID_PARAMS); } //do locking stuff here /* Check if resource exists and has sensor capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(handler_state->rptcache, resourceid); if (!rpt) { //unlock it return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { //unlock it return(SA_ERR_HPI_CAPABILITY); } /* Check if sensor exists and has writable thresholds */ SaHpiRdrT *rdr = oh_get_rdr_by_type(handler_state->rptcache, resourceid, SAHPI_SENSOR_RDR, sensornum); if (rdr == NULL) { //unlock it return(SA_ERR_HPI_NOT_PRESENT); } sinfo = (struct SensorInfo *)oh_get_rdr_data(handler_state->rptcache, resourceid, rdr->RecordId); if (sinfo == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); //unlock it return(SA_ERR_HPI_INTERNAL_ERROR); } /* Since the RTAS library doesn't support setting of thresholds, return the * appropriate return code */ return(SA_ERR_HPI_INVALID_CMD); } SaErrorT rtas_get_sensor_enable(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiBoolT *enable) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_set_sensor_enable(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiBoolT enable) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_get_sensor_event_enables(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiBoolT *enables) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_set_sensor_event_enables(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, const SaHpiBoolT enables) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_get_sensor_event_masks(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiEventStateT *AssertEventMask, SaHpiEventStateT *DeassertEventMask) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_set_sensor_event_masks(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiSensorEventMaskActionT act, SaHpiEventStateT AssertEventMask, SaHpiEventStateT DeassertEventMask) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_get_sensor_event_enabled(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT sensornum, SaHpiBoolT *enable) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_set_sensor_event_enabled(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT sensornum, SaHpiBoolT *enable) { return SA_ERR_HPI_INTERNAL_ERROR; } /** * rtas_get_sensor_location_code * * @token - the sensor type. * @index - index of the sensor. * @buffer - buffer to store the location code of the sensor. * * @return - TBD */ int rtas_get_sensor_location_code(int token, int index, char *buffer) { int filehandle, i, len; char filename[45], temp[4096], *pos; if (buffer == NULL) return 0; buffer[0] = '\0'; snprintf(filename, MAX_SENSOR_LOCATION_STRING_SIZE, "%s%04d", RTAS_SENSOR_LOCATION, token); filehandle = open(filename, O_RDONLY); if (filehandle < 0) return 0; if ((len = read(filehandle, temp, 4096)) < 0) return 0; pos = temp; for (i=0; i= temp + len) { close(filehandle); return 0; } } strncpy(buffer, pos, MAX_SENSOR_LOCATION_STRING_SIZE); close(filehandle); return 1; } void * oh_get_sensor_reading (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiSensorReadingT *, SaHpiEventStateT *) __attribute__ ((weak, alias("rtas_get_sensor_reading"))); void * oh_get_sensor_thresholds (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiSensorThresholdsT *) __attribute__ ((weak, alias("rtas_get_sensor_thresholds"))); void * oh_set_sensor_thresholds (void *, SaHpiResourceIdT, SaHpiSensorNumT, const SaHpiSensorThresholdsT *) __attribute__ ((weak, alias("rtas_set_sensor_thresholds"))); void * oh_get_sensor_enable (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT *) __attribute__ ((weak, alias("rtas_get_sensor_enable"))); void * oh_set_sensor_enable (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT) __attribute__ ((weak, alias("rtas_set_sensor_enable"))); void * oh_get_sensor_event_enables (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT *) __attribute__ ((weak, alias("rtas_get_sensor_event_enabled"))); void * oh_set_sensor_event_enables (void *, SaHpiResourceIdT id, SaHpiSensorNumT, SaHpiBoolT *) __attribute__ ((weak, alias("rtas_set_sensor_event_enabled"))); void * oh_get_sensor_event_masks (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiEventStateT *, SaHpiEventStateT *) __attribute__ ((weak, alias("rtas_get_sensor_event_masks"))); void * oh_set_sensor_event_masks (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiSensorEventMaskActionT, SaHpiEventStateT, SaHpiEventStateT) __attribute__ ((weak, alias("rtas_set_sensor_event_masks"))); openhpi-3.6.1/plugins/rtas/rtas_resource.c0000644000175100017510000000554112575647277017664 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Daniel de Araujo */ #include #include #include SaErrorT rtas_set_resource_tag(void *hnd, SaHpiResourceIdT id, SaHpiTextBufferT *tag) { struct oh_handler_state *h = hnd; SaHpiRptEntryT *rptentry = NULL; SaErrorT error = SA_OK; struct oh_event *e = NULL; if (!hnd) return SA_ERR_HPI_INTERNAL_ERROR; rptentry = oh_get_resource_by_id(h->rptcache, id); if (!rptentry) return SA_ERR_HPI_NOT_PRESENT; error = oh_append_textbuffer(&rptentry->ResourceTag, (char *)tag->Data); if (error) return error; e = (struct oh_event *)g_malloc0(sizeof(struct oh_event)); e->hid = h->hid; e->event.EventType = SAHPI_ET_RESOURCE; e->event.Source = rptentry->ResourceId; e->event.Severity = rptentry->ResourceSeverity; e->event.Timestamp = SAHPI_TIME_UNSPECIFIED; e->event.EventDataUnion.ResourceEvent.ResourceEventType = SAHPI_RESE_RESOURCE_ADDED; e->resource = *rptentry; oh_evt_queue_push(h->eventq, e); return SA_OK; } SaErrorT rtas_set_resource_severity(void *hnd, SaHpiResourceIdT id, SaHpiSeverityT sev) { struct oh_handler_state *h = hnd; SaHpiRptEntryT *rptentry = NULL; struct oh_event *e = NULL; if (!hnd) return SA_ERR_HPI_INTERNAL_ERROR; rptentry = oh_get_resource_by_id(h->rptcache, id); if (!rptentry) return SA_ERR_HPI_NOT_PRESENT; rptentry->ResourceSeverity = sev; e = (struct oh_event *)g_malloc0(sizeof(struct oh_event)); e->event.EventType = SAHPI_ET_RESOURCE; e->event.Source = rptentry->ResourceId; e->event.Severity = rptentry->ResourceSeverity; e->event.Timestamp = SAHPI_TIME_UNSPECIFIED; e->event.EventDataUnion.ResourceEvent.ResourceEventType = SAHPI_RESE_RESOURCE_ADDED; e->resource = *rptentry; oh_evt_queue_push(h->eventq, e); return SA_OK; } void * oh_set_resource_tag (void *, SaHpiResourceIdT, SaHpiTextBufferT *) __attribute__ ((weak, alias("rtas_set_resource_tag"))); void * oh_set_resource_severity (void *, SaHpiResourceIdT, SaHpiSeverityT) __attribute__ ((weak, alias("rtas_set_resource_severity"))); openhpi-3.6.1/plugins/rtas/rtas_event.h0000644000175100017510000000127412575647277017162 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Daniel de Araujo */ #ifndef RTAS_EVENT_H #define RTAS_EVENT_H #include #include #include #include SaErrorT rtas_get_event(void *hnd); #endif openhpi-3.6.1/plugins/rtas/rtas_event.c0000644000175100017510000000147012575647277017153 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Daniel de Araujo */ #include SaErrorT rtas_get_event(void *hnd) { if (!hnd) { err("Invalid parameter"); return(SA_ERR_HPI_INVALID_PARAMS); } return SA_OK; } void * oh_get_event (void *) __attribute__ ((weak, alias("rtas_get_event"))); openhpi-3.6.1/plugins/rtas/rtas_eventlog.c0000644000175100017510000000747512575647277017670 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Daniel de Araujo */ #include SaErrorT rtas_get_el_info(void *hnd, SaHpiResourceIdT id, SaHpiEventLogInfoT *info) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_set_el_time(void *hnd, SaHpiResourceIdT id, SaHpiTimeT time) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_add_el_entry(void *hnd, SaHpiResourceIdT id, const SaHpiEventT *Event) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_get_el_entry(void *hnd, SaHpiResourceIdT id, SaHpiEventLogEntryIdT current, SaHpiEventLogEntryIdT *prev, SaHpiEventLogEntryIdT *next, SaHpiEventLogEntryT *entry, SaHpiRdrT *rdr, SaHpiRptEntryT *rptentry) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_clear_el(void *hnd, SaHpiResourceIdT id) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_set_el_state(void *hnd, SaHpiResourceIdT id, SaHpiBoolT e) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_reset_el_overflow(void *hnd, SaHpiResourceIdT id) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_get_sel_info (void *hnd, SaHpiResourceIdT id, SaHpiEventLogInfoT *evtlog) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_set_sel_time (void *hnd, SaHpiResourceIdT id, const SaHpiEventT *evt) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_add_sel_entry (void *hnd, SaHpiResourceIdT id, const SaHpiEventT *evt) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_get_sel_entry (void *hnd, SaHpiResourceIdT id, SaHpiEventLogEntryIdT current, SaHpiEventLogEntryIdT *prev, SaHpiEventLogEntryIdT *next, SaHpiEventLogEntryT *entry, SaHpiRdrT *rdr, SaHpiRptEntryT *rdtentry) { return SA_ERR_HPI_INTERNAL_ERROR; } void * oh_get_el_info (void *, SaHpiResourceIdT, SaHpiEventLogInfoT *) __attribute__ ((weak, alias("rtas_get_sel_info"))); void * oh_set_el_time (void *, SaHpiResourceIdT, const SaHpiEventT *) __attribute__ ((weak, alias("rtas_set_sel_time"))); void * oh_add_el_entry (void *, SaHpiResourceIdT, const SaHpiEventT *) __attribute__ ((weak, alias("rtas_add_sel_entry"))); void * oh_get_el_entry (void *, SaHpiResourceIdT, SaHpiEventLogEntryIdT, SaHpiEventLogEntryIdT *, SaHpiEventLogEntryIdT *, SaHpiEventLogEntryT *, SaHpiRdrT *, SaHpiRptEntryT *) __attribute__ ((weak, alias("rtas_get_sel_entry"))); void * oh_clear_el (void *, SaHpiResourceIdT) __attribute__ ((weak, alias("rtas_clear_el"))); void * oh_set_el_state (void *, SaHpiResourceIdT) __attribute__ ((weak, alias("rtas_set_el_state"))); void * oh_reset_el_overflow (void *, SaHpiResourceIdT) __attribute__ ((weak, alias("rtas_reset_el_overflow"))); openhpi-3.6.1/plugins/rtas/rtas_utils.h0000644000175100017510000000144612575647277017202 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Daniel de Araujo */ #ifndef RTAS_UTILS_H #define RTAS_UTILS_H #include #include #include #include #include #include void decode_rtas_error (int error, char *buf, size_t size, int token, int index); #endif /* RTAS_UTILS_H */ openhpi-3.6.1/plugins/rtas/rtas_sensor.h0000644000175100017510000001031112575647277017342 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Daniel de Araujo */ #ifndef RTAS_SENSOR_H #define RTAS_SENSOR_H #include #include #include #include #include #include #define RTAS_SENSORS_PATH "/proc/device-tree/rtas/rtas-sensors" #define RTAS_SENSOR_LOCATION "/proc/device-tree/rtas/ibm,sensor-" #define MAX_SENSOR_LOCATION_STRING_SIZE 24 #define MILLISECONDS_PER_MINUTE 1000 #define TOKEN_MASK 0xFFFFFFF0 #define TIME_MASK ~TOKEN_MASK typedef enum rtasSensorStateEnum { SENSOR_OK = 0, SENSOR_CRITICAL_LOW = 9, SENSOR_WARNING_LOW = 10, SENSOR_NORMAL = 11, SENSOR_WARNING_HIGH = 12, SENSOR_CRITICAL_HIGH = 13 }rtasSensorState; struct SensorInfo { SaHpiUint32T token; SaHpiUint32T index; SaHpiBoolT enabled; SaHpiEventStateT current_state; SaHpiUint32T current_val; char sensor_location[MAX_SENSOR_LOCATION_STRING_SIZE]; }; /* Function Protos */ SaErrorT rtas_get_sensor_reading(void *handler, SaHpiResourceIdT resourceid, SaHpiSensorNumT sensornum, SaHpiSensorReadingT *reading, SaHpiEventStateT *e_state); SaErrorT rtas_get_sensor_thresholds(void *handler, SaHpiResourceIdT resourceid, SaHpiSensorNumT sensornum, SaHpiSensorThresholdsT *thresholds); SaErrorT rtas_set_sensor_thresholds(void *handler, SaHpiResourceIdT resourceid, SaHpiSensorNumT sensornum, const SaHpiSensorThresholdsT *thresholds); SaErrorT rtas_get_sensor_enable(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiBoolT *enable); SaErrorT rtas_set_sensor_enable(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiBoolT enable); SaErrorT rtas_get_sensor_event_enables(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiBoolT *enables); SaErrorT rtas_set_sensor_event_enables(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, const SaHpiBoolT enables); SaErrorT rtas_get_sensor_event_masks(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiEventStateT *AssertEventMask, SaHpiEventStateT *DeassertEventMask); SaErrorT rtas_set_sensor_event_masks(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiSensorEventMaskActionT act, SaHpiEventStateT AssertEventMask, SaHpiEventStateT DeassertEventMask); SaErrorT rtas_get_sensor_event_enabled(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT sensornum, SaHpiBoolT *enable); SaErrorT rtas_set_sensor_event_enabled(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT sensornum, SaHpiBoolT *enable); int rtas_get_sensor_location_code(int token, int index, char *buffer); #endif openhpi-3.6.1/plugins/rtas/rtas_power.c0000644000175100017510000000310112575647277017157 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005,2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Daniel de Araujo */ #include #include SaErrorT rtas_get_power_state(void *hnd, SaHpiResourceIdT id, SaHpiPowerStateT *state) { *state = SAHPI_POWER_ON; return SA_OK; } SaErrorT rtas_set_power_state(void *hnd, SaHpiResourceIdT id, SaHpiPowerStateT state) { int setlevel, rc; if (state == SAHPI_POWER_OFF) { rc = rtas_set_power_level(0, 0, &setlevel); if (rc > -1 && setlevel == 0) return SA_OK; else if (rc > -1 && setlevel != 0) return SA_ERR_HPI_BUSY; else return SA_ERR_HPI_INTERNAL_ERROR; } else { return SA_ERR_HPI_INTERNAL_ERROR; } } void * oh_get_power_state (void *, SaHpiResourceIdT, SaHpiPowerStateT *) __attribute__ ((weak, alias("rtas_get_power_state"))); void * oh_set_power_state (void *, SaHpiResourceIdT, SaHpiPowerStateT) __attribute__ ((weak, alias("rtas_set_power_state"))); openhpi-3.6.1/plugins/rtas/Makefile.am0000644000175100017510000000250512575647277016671 0ustar mohanmohan# -*- linux-c -*- # # (C) Copyright IBM Corp. 2005 # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # # Author(s): # Renier Morales # MAINTAINERCLEANFILES = Makefile.in AM_CPPFLAGS = -DG_LOG_DOMAIN=\"rtas\" AM_CPPFLAGS += @OPENHPI_INCLUDES@ pkglib_LTLIBRARIES = librtas2hpi.la librtas2hpi_la_SOURCES = rtas.h rtas.c \ rtas_annunciator.h rtas_annunciator.c \ rtas_discover.h rtas_discover.c \ rtas_control.h rtas_control.c \ rtas_event.h rtas_event.c \ rtas_eventlog.h rtas_eventlog.c \ rtas_hotswap.h rtas_hotswap.c \ rtas_indicator.h rtas_indicator.c \ rtas_inventory.h rtas_inventory.c \ rtas_power.h rtas_power.c \ rtas_reset.h rtas_reset.c \ rtas_resource.h rtas_resource.c \ rtas_sensor.h rtas_sensor.c \ rtas_utils.h rtas_utils.c \ rtas_watchdog.h rtas_watchdog.c librtas2hpi_la_LIBADD = -lrtas -lrtasevent $(top_builddir)/utils/libopenhpiutils.la librtas2hpi_la_LDFLAGS = -module -version-info @HPI_LIB_VERSION@ openhpi-3.6.1/plugins/rtas/rtas_discover.h0000644000175100017510000000377312575647277017665 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Daniel de Araujo */ #ifndef RTAS_DISCOVER_H #define RTAS_DISCOVER_H #include #include #include #include #include #include #include #define LSVPD_CMD "/sbin/lsvpd" /* Enums */ typedef enum rtasSensorTokenEnum { RTAS_SECURITY_SENSOR = 1, RTAS_RESERVED_SENSOR_2, RTAS_THERMAL_SENSOR, RTAS_RESERVED_SENSOR_4, RTAS_RESERVED_SENSOR_5, RTAS_RESERVED_SENSOR_6, RTAS_RESERVED_SENSOR_7, RTAS_RESERVED_SENSOR_8, RTAS_POWER_STATE_SENSOR, RTAS_RESERVED_SENSOR_10, RTAS_RESERVED_SENSOR_11, RTAS_SURVEILLANCE_SENSOR = 9000, RTAS_FAN_SENSOR, RTAS_VOLTAGE_SENSOR, RTAS_CONNECTOR_SENSOR, RTAS_POWER_SUPPLY_SENSOR, RTAS_GIQ_SENSOR, RTAS_SYSTEM_ATTENTION_SENSOR, RTAS_IDENTIFY_INDICATOR_SENSOR, RTAS_RESERVED_SENSOR_9008, RTAS_COMPONENT_RESET_STATE_SENSOR, RTAS_OEM_SPECIFIC_SENSOR_START, RTAS_OEM_SPECIFIC_SENSOR_END = 9999 } rtasSensorToken; /* Function Protos */ SaErrorT rtas_discover_resources(void *hnd); SaErrorT rtas_discover_sensors(struct oh_handler_state *handle, struct oh_event *res_oh_event); SaErrorT rtas_discover_inventory(struct oh_handler_state *handle, struct oh_event *res_oh_event); void populate_rtas_sensor_rec_info(int token, SaHpiSensorRecT *sensor_info); #endif /* RTAS_DISCOVER_H */ openhpi-3.6.1/plugins/rtas/rtas_resource.h0000644000175100017510000000167012575647277017670 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Daniel de Araujo */ #ifndef RTAS_RESOURCE_H #define RTAS_RESOURCE_H #include #include SaErrorT rtas_set_resource_tag(void *hnd, SaHpiResourceIdT id, SaHpiTextBufferT *tag); SaErrorT rtas_set_resource_severity(void *hnd, SaHpiResourceIdT id, SaHpiSeverityT sev); #endif openhpi-3.6.1/plugins/rtas/rtas_inventory.h0000644000175100017510000000557212575647277020103 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Daniel de Araujo */ #ifndef RTAS_INVENTORY_H #define RTAS_INVENTORY_H #include #include struct oh_rtas_idr_area { SaHpiIdrAreaHeaderT hpi_idr_area; GSList *fields; }; struct oh_rtas_idr { SaHpiIdrInfoT hpi_idr; GSList *areas; }; SaHpiIdrFieldTypeT rtas_get_idr_field_type(char *type); SaHpiIdrAreaTypeT rtas_get_idr_area_type(char *type); SaErrorT rtas_get_idr_info(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrInfoT *idrinfo); SaErrorT rtas_get_idr_area_header(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrAreaTypeT areatype, SaHpiEntryIdT areaid, SaHpiEntryIdT *nextareaid, SaHpiIdrAreaHeaderT *header); SaErrorT rtas_add_idr_area(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrAreaTypeT areatype, SaHpiEntryIdT *areaid); SaErrorT rtas_del_idr_area(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiEntryIdT areaid); SaErrorT rtas_get_idr_field(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiEntryIdT areaid, SaHpiIdrFieldTypeT fieldtype, SaHpiEntryIdT fieldid, SaHpiEntryIdT *nextfieldid, SaHpiIdrFieldT *field); SaErrorT rtas_add_idr_field(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrFieldT *field); SaErrorT rtas_set_idr_field(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrFieldT *field); SaErrorT rtas_del_idr_field(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiEntryIdT areaid, SaHpiEntryIdT fieldid); #endif openhpi-3.6.1/plugins/rtas/rtas_reset.c0000644000175100017510000000226612575647277017160 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005,2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Daniel de Araujo */ #include SaErrorT rtas_get_reset_state(void *hnd, SaHpiResourceIdT id, SaHpiResetActionT *act) { return SA_ERR_HPI_CAPABILITY; } SaErrorT rtas_set_reset_state(void *hnd, SaHpiResourceIdT id, SaHpiResetActionT act) { return SA_ERR_HPI_CAPABILITY; } void * oh_get_reset_state (void *, SaHpiResourceIdT, SaHpiResetActionT *) __attribute__ ((weak, alias("rtas_get_reset_state"))); void * oh_set_reset_state (void *, SaHpiResourceIdT, SaHpiResetActionT) __attribute__ ((weak, alias("rtas_set_reset_state"))); openhpi-3.6.1/plugins/rtas/rtas.h0000644000175100017510000000136412575647277015761 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales */ #ifndef RTAS_H #define RTAS_H #include #include #include #include #include void *rtas_open(GHashTable *handler_config, unsigned int hid, oh_evt_queue *eventq); void rtas_close(void *hnd); #endif /* _OH_RTAS_H */ openhpi-3.6.1/plugins/rtas/rtas_reset.h0000644000175100017510000000164112575647277017161 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Daniel de Araujo */ #ifndef RTAS_RESET_H #define RTAS_RESET_H #include #include SaErrorT rtas_get_reset_state(void *hnd, SaHpiResourceIdT id, SaHpiResetActionT *act); SaErrorT rtas_set_reset_state(void *hnd, SaHpiResourceIdT id, SaHpiResetActionT act); #endif openhpi-3.6.1/plugins/rtas/rtas_hotswap.c0000644000175100017510000000307212575647277017517 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Daniel de Araujo */ #include SaErrorT rtas_get_hotswap_state(void *hnd, SaHpiResourceIdT id, SaHpiHsStateT *state) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_set_hotswap_state(void *hnd, SaHpiResourceIdT id, SaHpiHsStateT state) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_request_hotswap_action(void *hnd, SaHpiResourceIdT id, SaHpiHsActionT act) { return SA_ERR_HPI_INTERNAL_ERROR; } void * oh_get_hotswap_state (void *, SaHpiResourceIdT, SaHpiHsStateT *) __attribute__ ((weak, alias("rtas_get_hotswap_state"))); void * oh_set_hotswap_state (void *, SaHpiResourceIdT, SaHpiHsStateT) __attribute__ ((weak, alias("rtas_set_hotswap_state"))); void * oh_request_hotswap_action (void *, SaHpiResourceIdT, SaHpiHsActionT) __attribute__ ((weak, alias("rtas_request_hotswap_action"))); openhpi-3.6.1/plugins/rtas/rtas_indicator.h0000644000175100017510000000172112575647277020012 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Daniel de Araujo */ #ifndef RTAS_INDICATOR_H #define RTAS_INDICATOR_H #include #include SaErrorT rtas_get_indicator_state(void *hnd, SaHpiResourceIdT id, SaHpiHsIndicatorStateT *state); SaErrorT rtas_set_indicator_state(void *hnd, SaHpiResourceIdT id, SaHpiHsIndicatorStateT state); #endif openhpi-3.6.1/plugins/rtas/rtas_inventory.c0000644000175100017510000002651112575647277020072 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005,2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Daniel de Araujo */ #include #include #include #include #include #define MAX_FIELDS 35 static struct { char *type; SaHpiIdrFieldTypeT hpi_type; } field_map[] = { { .type = "PN", .hpi_type = SAHPI_IDR_FIELDTYPE_PART_NUMBER }, { .type = "FN", .hpi_type = SAHPI_IDR_FIELDTYPE_PART_NUMBER }, { .type = "EC", .hpi_type = SAHPI_IDR_FIELDTYPE_CUSTOM }, { .type = "MN", .hpi_type = SAHPI_IDR_FIELDTYPE_MANUFACTURER }, { .type = "MF", .hpi_type = SAHPI_IDR_FIELDTYPE_MANUFACTURER }, { .type = "SN", .hpi_type = SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER }, { .type = "LI", .hpi_type = SAHPI_IDR_FIELDTYPE_CUSTOM }, { .type = "RL", .hpi_type = SAHPI_IDR_FIELDTYPE_CUSTOM }, { .type = "RM", .hpi_type = SAHPI_IDR_FIELDTYPE_CUSTOM }, { .type = "NA", .hpi_type = SAHPI_IDR_FIELDTYPE_CUSTOM }, { .type = "DD", .hpi_type = SAHPI_IDR_FIELDTYPE_CUSTOM }, { .type = "DG", .hpi_type = SAHPI_IDR_FIELDTYPE_CUSTOM }, { .type = "LL", .hpi_type = SAHPI_IDR_FIELDTYPE_CUSTOM }, { .type = "VI", .hpi_type = SAHPI_IDR_FIELDTYPE_MANUFACTURER }, { .type = "FU", .hpi_type = SAHPI_IDR_FIELDTYPE_CUSTOM }, { .type = "SI", .hpi_type = SAHPI_IDR_FIELDTYPE_MANUFACTURER }, { .type = "VK", .hpi_type = SAHPI_IDR_FIELDTYPE_PRODUCT_VERSION }, { .type = "TM", .hpi_type = SAHPI_IDR_FIELDTYPE_PART_NUMBER}, { .type = "YL", .hpi_type = SAHPI_IDR_FIELDTYPE_CUSTOM }, { .type = "BR", .hpi_type = SAHPI_IDR_FIELDTYPE_ASSET_TAG }, { .type = "CI", .hpi_type = SAHPI_IDR_FIELDTYPE_CUSTOM }, { .type = "RD", .hpi_type = SAHPI_IDR_FIELDTYPE_CUSTOM }, { .type = "PA", .hpi_type = SAHPI_IDR_FIELDTYPE_CUSTOM }, { .type = "NN", .hpi_type = SAHPI_IDR_FIELDTYPE_ASSET_TAG }, { .type = "DS", .hpi_type = SAHPI_IDR_FIELDTYPE_PRODUCT_NAME }, { .type = "AX", .hpi_type = SAHPI_IDR_FIELDTYPE_CUSTOM }, { .type = "CC", .hpi_type = SAHPI_IDR_FIELDTYPE_CUSTOM }, { .type = "CD", .hpi_type = SAHPI_IDR_FIELDTYPE_CUSTOM }, { .type = "CL", .hpi_type = SAHPI_IDR_FIELDTYPE_CUSTOM }, { .type = "MP", .hpi_type = SAHPI_IDR_FIELDTYPE_CUSTOM }, { .type = "SE", .hpi_type = SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER }, { .type = "SZ", .hpi_type = SAHPI_IDR_FIELDTYPE_CUSTOM }, { .type = "PI", .hpi_type = SAHPI_IDR_FIELDTYPE_PRODUCT_NAME }, { .type = "VC", .hpi_type = SAHPI_IDR_FIELDTYPE_PRODUCT_VERSION }, { .type = "OS", .hpi_type = SAHPI_IDR_FIELDTYPE_CUSTOM }, }; SaHpiIdrFieldTypeT rtas_get_idr_field_type(char *type) { int i; SaHpiIdrFieldTypeT hpi_type = SAHPI_IDR_FIELDTYPE_UNSPECIFIED; if (!type) return hpi_type-1; for (i = 0; i < MAX_FIELDS; i++) { if (strcasecmp(type, field_map[i].type) == 0) { hpi_type = field_map[i].hpi_type; break; } } return hpi_type; } SaHpiIdrAreaTypeT rtas_get_idr_area_type(char *type) { SaHpiIdrAreaTypeT area_type = SAHPI_IDR_FIELDTYPE_UNSPECIFIED; if (strcasecmp(type, "VC") == 0) { area_type = SAHPI_IDR_AREATYPE_PRODUCT_INFO; } else if (strcasecmp(type, "DS") == 0) { area_type = SAHPI_IDR_AREATYPE_BOARD_INFO; } return area_type; } SaErrorT rtas_get_idr_info(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrInfoT *idrinfo) { struct oh_rtas_idr *idr_info = NULL; SaHpiRdrT *rdr = NULL; struct oh_handler_state *h = hnd; if (!hnd) return SA_ERR_HPI_INTERNAL_ERROR; rdr = oh_get_rdr_by_type(h->rptcache, rid, SAHPI_INVENTORY_RDR, idrid); if (!rdr) return SA_ERR_HPI_NOT_PRESENT; idr_info = oh_get_rdr_data(h->rptcache, rid, rdr->RecordId); if (!idr_info) return SA_ERR_HPI_INTERNAL_ERROR; *idrinfo = idr_info->hpi_idr; return SA_OK; } SaErrorT rtas_get_idr_area_header(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrAreaTypeT areatype, SaHpiEntryIdT areaid, SaHpiEntryIdT *nextareaid, SaHpiIdrAreaHeaderT *header) { struct oh_rtas_idr *idr_info = NULL; SaHpiRdrT *rdr = NULL; struct oh_handler_state *h = hnd; GSList *node = NULL; if (!hnd) return SA_ERR_HPI_INTERNAL_ERROR; rdr = oh_get_rdr_by_type(h->rptcache, rid, SAHPI_INVENTORY_RDR, idrid); if (!rdr) { err("RDR not found. %u->inventory->%u", rid, idrid); return SA_ERR_HPI_NOT_PRESENT; } idr_info = oh_get_rdr_data(h->rptcache, rid, rdr->RecordId); if (!idr_info) { err("IDR data not found! %u->%u", rid, rdr->RecordId); return SA_ERR_HPI_INTERNAL_ERROR; } for (node = idr_info->areas; node; node = node->next) { struct oh_rtas_idr_area *area = node->data; if ((areatype != SAHPI_IDR_AREATYPE_UNSPECIFIED && (areaid == SAHPI_FIRST_ENTRY || areaid == area->hpi_idr_area.AreaId) && areatype == area->hpi_idr_area.Type) || (areaid == SAHPI_FIRST_ENTRY || areaid == area->hpi_idr_area.AreaId)) { *header = area->hpi_idr_area; if (node->next) { struct oh_rtas_idr_area *narea = node->next->data; *nextareaid = narea->hpi_idr_area.AreaId; } else { *nextareaid = SAHPI_LAST_ENTRY; } return SA_OK; } } return SA_ERR_HPI_NOT_PRESENT; } SaErrorT rtas_add_idr_area(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrAreaTypeT areatype, SaHpiEntryIdT *areaid) { return SA_ERR_HPI_READ_ONLY; } SaErrorT rtas_del_idr_area(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiEntryIdT areaid) { return SA_ERR_HPI_READ_ONLY; } SaErrorT rtas_get_idr_field(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiEntryIdT areaid, SaHpiIdrFieldTypeT fieldtype, SaHpiEntryIdT fieldid, SaHpiEntryIdT *nextfieldid, SaHpiIdrFieldT *field) { struct oh_rtas_idr *idr_info = NULL; SaHpiRdrT *rdr = NULL; struct oh_handler_state *h = hnd; GSList *node = NULL; if (!hnd) return SA_ERR_HPI_INTERNAL_ERROR; rdr = oh_get_rdr_by_type(h->rptcache, rid, SAHPI_INVENTORY_RDR, idrid); if (!rdr) return SA_ERR_HPI_NOT_PRESENT; idr_info = oh_get_rdr_data(h->rptcache, rid, rdr->RecordId); if (!idr_info) return SA_ERR_HPI_INTERNAL_ERROR; for (node = idr_info->areas; node; node = node->next) { struct oh_rtas_idr_area *area = node->data; if (areaid == area->hpi_idr_area.AreaId || areaid == SAHPI_FIRST_ENTRY) { GSList *node2 = NULL; for (node2 = area->fields; node2; node2 = node2->next) { SaHpiIdrFieldT *tfield = node2->data; if ((fieldtype != SAHPI_IDR_FIELDTYPE_UNSPECIFIED && (fieldid == SAHPI_FIRST_ENTRY || fieldid == tfield->FieldId) && fieldtype == tfield->Type) || (fieldid == SAHPI_FIRST_ENTRY || fieldid == tfield->FieldId)) { *field = *tfield; if (node2->next) { SaHpiIdrFieldT *nfield = node2->next->data; *nextfieldid = nfield->FieldId; } else { *nextfieldid = SAHPI_LAST_ENTRY; } return SA_OK; } } } } return SA_ERR_HPI_NOT_PRESENT; } SaErrorT rtas_add_idr_field(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrFieldT *field) { return SA_ERR_HPI_READ_ONLY; } SaErrorT rtas_set_idr_field(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrFieldT *field) { return SA_ERR_HPI_READ_ONLY; } SaErrorT rtas_del_idr_field(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiEntryIdT areaid, SaHpiEntryIdT fieldid) { return SA_ERR_HPI_READ_ONLY; } void * oh_get_idr_info (void *hnd, SaHpiResourceIdT, SaHpiIdrIdT,SaHpiIdrInfoT) __attribute__ ((weak, alias("rtas_get_idr_info"))); void * oh_get_idr_area_header (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrAreaTypeT, SaHpiEntryIdT, SaHpiEntryIdT, SaHpiIdrAreaHeaderT) __attribute__ ((weak, alias("rtas_get_idr_area_header"))); void * oh_add_idr_area (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrAreaTypeT, SaHpiEntryIdT) __attribute__ ((weak, alias("rtas_add_idr_area"))); void * oh_del_idr_area (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT) __attribute__ ((weak, alias("rtas_del_idr_area"))); void * oh_get_idr_field (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT, SaHpiIdrFieldTypeT, SaHpiEntryIdT, SaHpiEntryIdT, SaHpiIdrFieldT) __attribute__ ((weak, alias("rtas_get_idr_field"))); void * oh_add_idr_field (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrFieldT) __attribute__ ((weak, alias("rtas_add_idr_field"))); void * oh_set_idr_field (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrFieldT) __attribute__ ((weak, alias("rtas_set_idr_field"))); void * oh_del_idr_field (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT, SaHpiEntryIdT) __attribute__ ((weak, alias("rtas_del_idr_field"))); openhpi-3.6.1/plugins/rtas/rtas_control.c0000644000175100017510000000355512575647277017520 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Daniel de Araujo */ #include SaErrorT rtas_get_control_state(void *hnd, SaHpiResourceIdT id, SaHpiCtrlNumT num, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_set_control_state(void *hnd, SaHpiResourceIdT id, SaHpiCtrlNumT num, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_control_parm(void *hnd, SaHpiResourceIdT id, SaHpiParmActionT act) { return SA_ERR_HPI_INTERNAL_ERROR; } void * oh_get_control_state (void *, SaHpiResourceIdT, SaHpiCtrlNumT, SaHpiCtrlModeT *, SaHpiCtrlStateT *) __attribute__ ((weak, alias("rtas_get_control_state"))); void * oh_set_control_state (void *, SaHpiResourceIdT,SaHpiCtrlNumT, SaHpiCtrlModeT, SaHpiCtrlStateT *) __attribute__ ((weak, alias("rtas_set_control_state"))); void * oh_control_parm (void *, SaHpiResourceIdT, SaHpiParmActionT) __attribute__ ((weak, alias("rtas_control_parm"))); openhpi-3.6.1/plugins/rtas/rtas_discover.c0000644000175100017510000010054012575647277017646 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005,2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Daniel de Araujo */ #include #include #include #include #include #include #include #include #include #include #include SaErrorT rtas_discover_resources(void *hnd) { SaErrorT error = SA_OK; struct oh_handler_state *h = (struct oh_handler_state *)hnd; static int did_discovery = 0; char *entity_root = NULL; SaHpiEntityPathT root_ep; SaHpiRptEntryT lone_res; if (did_discovery) { return SA_OK; } if (!hnd) { err("Null handle!"); return SA_ERR_HPI_INVALID_PARAMS; } entity_root = (char *)g_hash_table_lookup(h->config, "entity_root"); if (entity_root == NULL) { err("Could not aquire entity_root parameter."); return SA_ERR_HPI_INTERNAL_ERROR; } error = oh_encode_entitypath(entity_root, &root_ep); if (error) { err("Could not convert entity path to string. Error=%s.", oh_lookup_error(error)); return SA_ERR_HPI_INTERNAL_ERROR; } // Discover lone resource lone_res.ResourceEntity = root_ep; lone_res.ResourceCapabilities = SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_SENSOR | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_POWER; lone_res.ResourceSeverity = SAHPI_MAJOR; oh_init_textbuffer(&lone_res.ResourceTag); oh_append_textbuffer(&lone_res.ResourceTag, entity_root); lone_res.ResourceId = oh_uid_from_entity_path(&lone_res.ResourceEntity); error = oh_add_resource(h->rptcache, &lone_res, NULL, FREE_RPT_DATA); if (!error) { struct oh_event *e = (struct oh_event *)g_malloc0(sizeof(struct oh_event)); e->hid = h->hid; e->event.EventType = SAHPI_ET_RESOURCE; e->resource = lone_res; e->event.Source = lone_res.ResourceId; e->event.Severity = lone_res.ResourceSeverity; e->event.Timestamp = SAHPI_TIME_UNSPECIFIED; e->event.EventDataUnion.ResourceEvent.ResourceEventType = SAHPI_RESE_RESOURCE_ADDED; // Discover sensors error = rtas_discover_sensors(h, e); // Discover Inventory error = rtas_discover_inventory(h, e); oh_evt_queue_push(h->eventq, e); } else { err("Error adding resource. %s", oh_lookup_error(error)); return error; } if (!error) did_discovery = 1; return error; } /** * rtas_discover_sensors: * @h: Pointer to handler's data. * @e: Pointer to resource's event structure. * * Discovers resource's available sensors and its events. * * Return values: * Adds sensor RDRs to internal Infra-structure queues - normal case * SA_ERR_HPI_OUT_OF_SPACE - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - incoming parameters are NULL. **/ SaErrorT rtas_discover_sensors(struct oh_handler_state *h, struct oh_event *e) { FILE *file = NULL; struct sensor_pair { SaHpiUint32T token; SaHpiUint32T max_index; } chunk; int sensor_num = 0; //char err_buf[SAHPI_MAX_TEXT_BUFFER_LENGTH]; SaHpiUint32T token, max_index, index = 0; SaHpiInt32T val, state; struct SensorInfo *sensor_info; if (!h || !e) { return SA_ERR_HPI_INVALID_PARAMS; } /* open the binary file and read the indexes */ file = fopen(RTAS_SENSORS_PATH, "r"); if (!file) { err("Error reading RTAS sensor file %s.", RTAS_SENSORS_PATH); return SA_ERR_HPI_INTERNAL_ERROR; } /* The rtas-sensors file is layed out in the following fashion : * * 32-bit-integer-token 32-bit-integer-index ... * * As a result, we read the first 32-bit chunk to establish * the type of sensor is in the system. We then read the next * 32-bit chunk to determine how many sensors exist of type * token. This process repeats until we've reached EOL. * Note, sensor indices are not necessarily contiguous. */ while (fread(&chunk, sizeof(struct sensor_pair), 1, file) == 1) { token = chunk.token; max_index = chunk.max_index; /* Make sure we didn't get bogus tokens */ if ( token != RTAS_RESERVED_SENSOR_2 && token != RTAS_RESERVED_SENSOR_4 && token != RTAS_RESERVED_SENSOR_5 && token != RTAS_RESERVED_SENSOR_6 && token != RTAS_RESERVED_SENSOR_7 && token != RTAS_RESERVED_SENSOR_8 && token != RTAS_RESERVED_SENSOR_10 && token != RTAS_RESERVED_SENSOR_11 && token != RTAS_RESERVED_SENSOR_9008 ) { /* Now that we have the token and the index, we can * grab the specific data about the sensor and build the RDR. */ for (index = 0; index <= max_index; index++) { /* We cannot assume that there are sensors in each index leading up * up the maxIndex. We must determine whether the sensor actually * exists. We do this by calling rtas_get_sensor. Note: A return * value of "-3" means the sensor does not exist. */ state = rtas_get_sensor(token, index, &val); if (state != -3) { SaHpiRdrT *rdr = (SaHpiRdrT *)g_malloc0(sizeof(SaHpiRdrT)); sensor_info = (struct SensorInfo*)g_malloc0(sizeof(struct SensorInfo)); if (!rdr || !sensor_info) { err("Out of memory."); return SA_ERR_HPI_OUT_OF_SPACE; } rdr->RdrType = SAHPI_SENSOR_RDR; rdr->Entity = e->resource.ResourceEntity; /* Do entity path business */ //rtas_modify_sensor_ep(); //needs more research /* For now, assume sensor number represents a count. If we decide later to * create an RPT for each sensor type (and fill in the RDRs that consist of * the sensor type), then the num will need to be reset. */ rdr->RdrTypeUnion.SensorRec.Num = sensor_num++; populate_rtas_sensor_rec_info(token, &(rdr->RdrTypeUnion.SensorRec)); rdr->RdrTypeUnion.SensorRec.Category = SAHPI_EC_THRESHOLD | SAHPI_EC_SEVERITY; rdr->RdrTypeUnion.SensorRec.EventCtrl = SAHPI_SEC_READ_ONLY; rdr->RdrTypeUnion.SensorRec.Events = SAHPI_ES_OK | SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_MINOR |SAHPI_ES_UPPER_CRIT; rdr->RdrTypeUnion.SensorRec.ThresholdDefn.IsAccessible = SAHPI_FALSE; sensor_info->token = token; sensor_info->index = index; sensor_info->enabled = SAHPI_TRUE; if ( (token == RTAS_SECURITY_SENSOR) || (token == RTAS_SURVEILLANCE_SENSOR) ) { if (val == 0) { sensor_info->enabled = SAHPI_FALSE; } } sensor_info->current_val = val; switch ((rtasSensorState)state) { case SENSOR_OK: sensor_info->current_state = SAHPI_ES_UNSPECIFIED; break; case SENSOR_CRITICAL_LOW: sensor_info->current_state = SAHPI_ES_LOWER_CRIT; break; case SENSOR_WARNING_LOW: sensor_info->current_state = SAHPI_ES_LOWER_MINOR; break; case SENSOR_NORMAL: sensor_info->current_state = SAHPI_ES_OK; break; case SENSOR_WARNING_HIGH: sensor_info->current_state = SAHPI_ES_UPPER_MINOR; break; case SENSOR_CRITICAL_HIGH: sensor_info->current_state = SAHPI_ES_UPPER_CRIT; break; default: sensor_info->current_state = SAHPI_ES_UNSPECIFIED; break; } rtas_get_sensor_location_code(token, index, sensor_info->sensor_location); oh_add_rdr(h->rptcache, e->resource.ResourceId, rdr, sensor_info, 0); e->rdrs = g_slist_append(e->rdrs, rdr); } } } } fclose(file); return SA_OK; } /** * populate_rtas_sensor_info * * @data - pointer to the location of the SaHpiSensorRecT. * @token - the sensor type. * * @return - writes the specific sensor info based on the type * of sensor. */ void populate_rtas_sensor_rec_info(int token, SaHpiSensorRecT *sensor_info) { if (!sensor_info) return; sensor_info->DataFormat.IsSupported = SAHPI_TRUE; switch ((rtasSensorToken)token) { case RTAS_SECURITY_SENSOR: sensor_info->EnableCtrl = SAHPI_FALSE; sensor_info->Type = SAHPI_PHYSICAL_SECURITY; sensor_info->DataFormat.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.BaseUnits = SAHPI_SU_CHARACTERS; sensor_info->DataFormat.ModifierUnits = SAHPI_SU_UNSPECIFIED; sensor_info->DataFormat.ModifierUse = SAHPI_SMUU_NONE; sensor_info->DataFormat.Percentage = SAHPI_FALSE; sensor_info->DataFormat.Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN; sensor_info->DataFormat.Range.Max.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.Range.Max.Type = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.Range.Max.Value.SensorUint64 = 3; sensor_info->DataFormat.Range.Min.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.Range.Min.Type = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.Range.Min.Value.SensorUint64 = 0; break; case RTAS_THERMAL_SENSOR: sensor_info->EnableCtrl = SAHPI_FALSE; sensor_info->Type = SAHPI_TEMPERATURE; sensor_info->DataFormat.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.ReadingType = SAHPI_SENSOR_READING_TYPE_INT64; sensor_info->DataFormat.BaseUnits = SAHPI_SU_DEGREES_C; sensor_info->DataFormat.ModifierUnits = SAHPI_SU_UNSPECIFIED; sensor_info->DataFormat.ModifierUse = SAHPI_SMUU_NONE; sensor_info->DataFormat.Percentage = SAHPI_FALSE; sensor_info->DataFormat.Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN; sensor_info->DataFormat.Range.Max.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.Range.Max.Type = SAHPI_SENSOR_READING_TYPE_INT64; sensor_info->DataFormat.Range.Min.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.Range.Min.Type = SAHPI_SENSOR_READING_TYPE_INT64; break; case RTAS_POWER_STATE_SENSOR: sensor_info->EnableCtrl = SAHPI_FALSE; sensor_info->Type = SAHPI_SYSTEM_ACPI_POWER_STATE; sensor_info->DataFormat.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.BaseUnits = SAHPI_SU_CHARACTERS; sensor_info->DataFormat.ModifierUnits = SAHPI_SU_UNSPECIFIED; sensor_info->DataFormat.ModifierUse = SAHPI_SMUU_NONE; sensor_info->DataFormat.Percentage = SAHPI_FALSE; sensor_info->DataFormat.Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN; sensor_info->DataFormat.Range.Max.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.Range.Max.Type = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.Range.Max.Value.SensorUint64 = 7; sensor_info->DataFormat.Range.Min.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.Range.Min.Type = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.Range.Min.Value.SensorUint64 = 0; break; case RTAS_SURVEILLANCE_SENSOR: sensor_info->EnableCtrl = SAHPI_FALSE; sensor_info->Type = SAHPI_MANAGEMENT_SUBSYSTEM_HEALTH; sensor_info->DataFormat.ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.BaseUnits = SAHPI_SU_MINUTE; sensor_info->DataFormat.ModifierUnits = SAHPI_SU_UNSPECIFIED; sensor_info->DataFormat.ModifierUse = SAHPI_SMUU_NONE; sensor_info->DataFormat.Percentage = SAHPI_FALSE; sensor_info->DataFormat.Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN; sensor_info->DataFormat.Range.Max.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.Range.Max.Type = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.Range.Max.Value.SensorUint64 = 255; sensor_info->DataFormat.Range.Min.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.Range.Min.Type = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.Range.Min.Value.SensorUint64 = 0; break; case RTAS_FAN_SENSOR: sensor_info->EnableCtrl = SAHPI_FALSE; sensor_info->Type = SAHPI_FAN; sensor_info->DataFormat.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.BaseUnits = SAHPI_SU_RPM; sensor_info->DataFormat.ModifierUnits = SAHPI_SU_UNSPECIFIED; sensor_info->DataFormat.ModifierUse = SAHPI_SMUU_NONE; sensor_info->DataFormat.Percentage = SAHPI_FALSE; sensor_info->DataFormat.Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN; sensor_info->DataFormat.Range.Max.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.Range.Max.Type = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.Range.Min.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.Range.Min.Type = SAHPI_SENSOR_READING_TYPE_UINT64; break; case RTAS_VOLTAGE_SENSOR: sensor_info->EnableCtrl = SAHPI_FALSE; sensor_info->Type = SAHPI_VOLTAGE; sensor_info->DataFormat.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.ReadingType = SAHPI_SENSOR_READING_TYPE_INT64; sensor_info->DataFormat.BaseUnits = SAHPI_SU_VOLTS; sensor_info->DataFormat.ModifierUnits = SAHPI_SU_UNSPECIFIED; sensor_info->DataFormat.ModifierUse = SAHPI_SMUU_NONE; sensor_info->DataFormat.Percentage = SAHPI_FALSE; sensor_info->DataFormat.Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN; sensor_info->DataFormat.Range.Max.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.Range.Max.Type = SAHPI_SENSOR_READING_TYPE_INT64; sensor_info->DataFormat.Range.Min.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.Range.Min.Type = SAHPI_SENSOR_READING_TYPE_INT64; break; case RTAS_CONNECTOR_SENSOR: sensor_info->EnableCtrl = SAHPI_FALSE; sensor_info->Type = SAHPI_SLOT_CONNECTOR; sensor_info->DataFormat.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.BaseUnits = SAHPI_SU_UNSPECIFIED; sensor_info->DataFormat.ModifierUnits = SAHPI_SU_UNSPECIFIED; sensor_info->DataFormat.ModifierUse = SAHPI_SMUU_NONE; sensor_info->DataFormat.Percentage = SAHPI_FALSE; sensor_info->DataFormat.Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN; sensor_info->DataFormat.Range.Max.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.Range.Max.Type = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.Range.Max.Value.SensorUint64 = 4; sensor_info->DataFormat.Range.Min.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.Range.Min.Type = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.Range.Min.Value.SensorUint64 = 0; break; case RTAS_POWER_SUPPLY_SENSOR: sensor_info->EnableCtrl = SAHPI_FALSE; sensor_info->Type = SAHPI_POWER_SUPPLY; sensor_info->DataFormat.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.BaseUnits = SAHPI_SU_UNSPECIFIED; sensor_info->DataFormat.ModifierUnits = SAHPI_SU_UNSPECIFIED; sensor_info->DataFormat.ModifierUse = SAHPI_SMUU_NONE; sensor_info->DataFormat.Percentage = SAHPI_FALSE; sensor_info->DataFormat.Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN; sensor_info->DataFormat.Range.Max.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.Range.Max.Type = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.Range.Max.Value.SensorUint64 = 3; sensor_info->DataFormat.Range.Min.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.Range.Min.Type = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.Range.Min.Value.SensorUint64 = 0; break; case RTAS_GIQ_SENSOR: sensor_info->EnableCtrl = SAHPI_TRUE; sensor_info->Type = SAHPI_CRITICAL_INTERRUPT; sensor_info->DataFormat.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.BaseUnits = SAHPI_SU_UNSPECIFIED; sensor_info->DataFormat.ModifierUnits = SAHPI_SU_UNSPECIFIED; sensor_info->DataFormat.ModifierUse = SAHPI_SMUU_NONE; sensor_info->DataFormat.Percentage = SAHPI_FALSE; sensor_info->DataFormat.Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN; sensor_info->DataFormat.Range.Max.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.Range.Max.Type = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.Range.Max.Value.SensorUint64 = 1; sensor_info->DataFormat.Range.Min.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.Range.Min.Type = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.Range.Min.Value.SensorUint64 = 0; break; case RTAS_SYSTEM_ATTENTION_SENSOR: sensor_info->EnableCtrl = SAHPI_FALSE; sensor_info->Type = SAHPI_PLATFORM_ALERT; sensor_info->DataFormat.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.BaseUnits = SAHPI_SU_UNSPECIFIED; sensor_info->DataFormat.ModifierUnits = SAHPI_SU_UNSPECIFIED; sensor_info->DataFormat.ModifierUse = SAHPI_SMUU_NONE; sensor_info->DataFormat.Percentage = SAHPI_FALSE; sensor_info->DataFormat.Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN; sensor_info->DataFormat.Range.Max.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.Range.Max.Type = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.Range.Max.Value.SensorUint64 = 1; sensor_info->DataFormat.Range.Min.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.Range.Min.Type = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.Range.Min.Value.SensorUint64 = 0; break; case RTAS_IDENTIFY_INDICATOR_SENSOR: sensor_info->EnableCtrl = SAHPI_FALSE; sensor_info->Type = SAHPI_OTHER_FRU; sensor_info->DataFormat.ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.BaseUnits = SAHPI_SU_UNSPECIFIED; sensor_info->DataFormat.ModifierUnits = SAHPI_SU_UNSPECIFIED; sensor_info->DataFormat.ModifierUse = SAHPI_SMUU_NONE; sensor_info->DataFormat.Percentage = SAHPI_FALSE; sensor_info->DataFormat.Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN; sensor_info->DataFormat.Range.Max.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.Range.Max.Type = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.Range.Max.Value.SensorUint64 = 1; sensor_info->DataFormat.Range.Min.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.Range.Min.Type = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.Range.Min.Value.SensorUint64 = 0; break; case RTAS_COMPONENT_RESET_STATE_SENSOR: sensor_info->EnableCtrl = SAHPI_FALSE; sensor_info->Type = SAHPI_OPERATIONAL; sensor_info->DataFormat.ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.BaseUnits = SAHPI_SU_UNSPECIFIED; sensor_info->DataFormat.ModifierUnits = SAHPI_SU_UNSPECIFIED; sensor_info->DataFormat.ModifierUse = SAHPI_SMUU_NONE; sensor_info->DataFormat.Percentage = SAHPI_FALSE; sensor_info->DataFormat.Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN; sensor_info->DataFormat.Range.Max.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.Range.Max.Type = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.Range.Max.Value.SensorUint64 = 2; sensor_info->DataFormat.Range.Min.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.Range.Min.Type = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.Range.Min.Value.SensorUint64 = 0; break; default: sensor_info->EnableCtrl = SAHPI_FALSE; sensor_info->Type = SAHPI_OEM_SENSOR; sensor_info->DataFormat.ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.BaseUnits = SAHPI_SU_UNSPECIFIED; sensor_info->DataFormat.ModifierUnits = SAHPI_SU_UNSPECIFIED; sensor_info->DataFormat.ModifierUse = SAHPI_SMUU_NONE; sensor_info->DataFormat.Percentage = SAHPI_FALSE; sensor_info->DataFormat.Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN; sensor_info->DataFormat.Range.Max.IsSupported = SAHPI_FALSE; sensor_info->DataFormat.Range.Min.IsSupported = SAHPI_FALSE; break; } } /** * rtas_discover_inventory: * @h: Pointer to handler's data. * @e: Pointer to resource's event structure. * * Discovers resource's available inventory fields. * * Return values: * Adds inventory RDRs to internal Infra-structure queues - normal case * SA_ERR_HPI_OUT_OF_SPACE - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - incoming parameters are NULL. **/ SaErrorT rtas_discover_inventory(struct oh_handler_state *h, struct oh_event *e) { const int MAXLINE = 64; char line[MAXLINE]; FILE *file = NULL; SaHpiInventoryRecT irec; struct oh_rtas_idr oh_idr; struct oh_rtas_idr_area *oh_area = NULL; if (!h || !e) { return SA_ERR_HPI_INVALID_PARAMS; } /* Prepare Inventory Data Record headers */ irec.IdrId = oh_idr.hpi_idr.IdrId = SAHPI_DEFAULT_INVENTORY_ID; irec.Persistent = SAHPI_FALSE; irec.Oem = 0; oh_idr.hpi_idr.ReadOnly = SAHPI_TRUE; /* open the binary file and read the indexes */ file = popen(LSVPD_CMD, "r"); if (!file) { err("Error finding rtas inventory command %s", LSVPD_CMD); return SA_ERR_HPI_INTERNAL_ERROR; } /* Loop through output. Create area(s) with fields (more than one area based on blocks) */ while (fgets(line, MAXLINE, file) != NULL) { /* Parse two columns of output. First one tells the field type, */ /* second, one tells the data.*/ /* Write switch statement on it to create new area and/or field */ char type[3]; if (strlen(line) < 5) { /* Check line. 5 chars long at least. */ err("Bad line from " LSVPD_CMD); pclose(file); return SA_ERR_HPI_INTERNAL_ERROR; } strncpy(type, (line+1), sizeof(char)*2); type[2] = '\0'; if (strncmp(type, "VC", sizeof(char)*2) == 0 || strncmp(type, "DS", sizeof(char)*2) == 0) { /* Create new area */ oh_area = g_new0(struct oh_rtas_idr_area, 1); oh_area->hpi_idr_area.AreaId = ++oh_idr.hpi_idr.NumAreas; oh_area->hpi_idr_area.ReadOnly = SAHPI_TRUE; oh_area->hpi_idr_area.Type = rtas_get_idr_area_type(type); oh_idr.areas = g_slist_append(oh_idr.areas, oh_area); } if (oh_area) { /* Create field */ SaHpiIdrFieldT *field = g_new0(SaHpiIdrFieldT, 1); field->AreaId = oh_area->hpi_idr_area.AreaId; field->FieldId = ++oh_area->hpi_idr_area.NumFields; field->Type = rtas_get_idr_field_type(type); field->ReadOnly = SAHPI_TRUE; oh_init_textbuffer(&field->Field); oh_append_textbuffer(&field->Field, line+4); oh_area->fields = g_slist_append(oh_area->fields, field); } else { err("Bad Error creating field. There is no area yet."); pclose(file); return SA_ERR_HPI_INTERNAL_ERROR; } } pclose(file); /* Publish IDR headers: */ /* Memdup idr_info, add as data to idr_rec (add idr_rec to rptcache). Create rdr event. */ SaHpiRdrT *rdr = (SaHpiRdrT *)g_malloc0(sizeof(SaHpiRdrT)); rdr->RdrType = SAHPI_INVENTORY_RDR; rdr->Entity = e->resource.ResourceEntity; oh_init_textbuffer(&rdr->IdString); oh_append_textbuffer(&rdr->IdString, LSVPD_CMD); rdr->RdrTypeUnion.InventoryRec = irec; oh_add_rdr(h->rptcache, e->resource.ResourceId, rdr, g_memdup(&oh_idr, sizeof(struct oh_rtas_idr)), 0); e->rdrs = g_slist_append(e->rdrs, rdr); return SA_OK; } void * oh_discover_resources (void *) __attribute__ ((weak, alias("rtas_discover_resources"))); openhpi-3.6.1/plugins/rtas/rtas_hotswap.h0000644000175100017510000000214312575647277017522 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Daniel de Araujo */ #ifndef RTAS_HOTSWAP_H #define RTAS_HOTSWAP_H #include #include SaErrorT rtas_get_hotswap_state(void *hnd, SaHpiResourceIdT id, SaHpiHsStateT *state); SaErrorT rtas_set_hotswap_state(void *hnd, SaHpiResourceIdT id, SaHpiHsStateT state); SaErrorT rtas_request_hotswap_action(void *hnd, SaHpiResourceIdT id, SaHpiHsActionT act); #endif openhpi-3.6.1/plugins/rtas/rtas_power.h0000644000175100017510000000164412575647277017176 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Daniel de Araujo */ #ifndef RTAS_POWER_H #define RTAS_POWER_H #include #include SaErrorT rtas_get_power_state(void *hnd, SaHpiResourceIdT id, SaHpiPowerStateT *state); SaErrorT rtas_set_power_state(void *hnd, SaHpiResourceIdT id, SaHpiPowerStateT state); #endif openhpi-3.6.1/plugins/rtas/rtas_watchdog.h0000644000175100017510000000230112575647277017631 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Daniel de Araujo */ #ifndef RTAS_WATCHDOG_H #define RTAS_WATCHDOG_H #include #include SaErrorT rtas_get_watchdog_info(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num, SaHpiWatchdogT *wdt); SaErrorT rtas_set_watchdog_info(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num, SaHpiWatchdogT *wdt); SaErrorT rtas_reset_watchdog(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num); #endif openhpi-3.6.1/plugins/rtas/rtas_eventlog.h0000644000175100017510000000474012575647277017665 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Daniel de Araujo */ #ifndef RTAS_EVENTLOG_H #define RTAS_EVENTLOG_H #include #include SaErrorT rtas_get_el_info(void *hnd, SaHpiResourceIdT id, SaHpiEventLogInfoT *info); SaErrorT rtas_set_el_time(void *hnd, SaHpiResourceIdT id, SaHpiTimeT time); SaErrorT rtas_add_el_entry(void *hnd, SaHpiResourceIdT id, const SaHpiEventT *Event); SaErrorT rtas_get_el_entry(void *hnd, SaHpiResourceIdT id, SaHpiEventLogEntryIdT current, SaHpiEventLogEntryIdT *prev, SaHpiEventLogEntryIdT *next, SaHpiEventLogEntryT *entry, SaHpiRdrT *rdr, SaHpiRptEntryT *rptentry); SaErrorT rtas_clear_el(void *hnd, SaHpiResourceIdT id); SaErrorT rtas_set_el_state(void *hnd, SaHpiResourceIdT id, SaHpiBoolT e); SaErrorT rtas_reset_el_overflow(void *hnd, SaHpiResourceIdT id); SaErrorT rtas_get_sel_info (void *hnd, SaHpiResourceIdT id, SaHpiEventLogInfoT *evtlog); SaErrorT rtas_set_sel_time (void *hnd, SaHpiResourceIdT id, const SaHpiEventT *evt); SaErrorT rtas_add_sel_entry (void *hnd, SaHpiResourceIdT id, const SaHpiEventT *evt); SaErrorT rtas_get_sel_entry (void *hnd, SaHpiResourceIdT id, SaHpiEventLogEntryIdT current, SaHpiEventLogEntryIdT *prev, SaHpiEventLogEntryIdT *next, SaHpiEventLogEntryT *entry, SaHpiRdrT *rdr, SaHpiRptEntryT *rdtentry); #endif openhpi-3.6.1/plugins/rtas/rtas_annunciator.h0000644000175100017510000000443112575647277020360 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Daniel de Araujo */ #ifndef RTAS_ANNUNCIATOR_H #define RTAS_ANNUNCIATOR_H #include #include SaErrorT rtas_get_next_announce(void *hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiSeverityT sev, SaHpiBoolT unack, SaHpiAnnouncementT *a); SaErrorT rtas_get_announce(void *hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiEntryIdT aid, SaHpiAnnouncementT *a); SaErrorT rtas_ack_announce(void *hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiEntryIdT aid, SaHpiSeverityT sev); SaErrorT rtas_add_announce(void *hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiAnnouncementT *a); SaErrorT rtas_del_announce(void *hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiEntryIdT aid, SaHpiSeverityT sev); SaErrorT rtas_get_annunc_mode(void *hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiAnnunciatorModeT *mode); SaErrorT rtas_set_annunc_mode(void *hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiAnnunciatorModeT mode); #endif openhpi-3.6.1/plugins/rtas/rtas_utils.c0000644000175100017510000000372312575647277017175 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Daniel de Araujo */ #include /** * librtas_error * @brief check for a librtas specific return code * * @param error librtas return code * @param buf buffer to write librtas error message to * @param size size of "buffer" */ void decode_rtas_error (int error, char *buf, size_t size, int token, int index) { switch (error) { case -1: snprintf(buf, size, "Hardware error retrieving a sensor: token %04d, " "index %d\n", token, index); break; case -3: snprintf(buf, size,"The sensor at token %04d, index %d is not " "implemented.\n", token, index); break; case RTAS_KERNEL_INT: snprintf(buf, size, "No kernel interface to firmware"); break; case RTAS_KERNEL_IMP: snprintf(buf, size, "No kernel implementation of function"); break; case RTAS_PERM: snprintf(buf, size, "Non-root caller"); break; case RTAS_NO_MEM: snprintf(buf, size, "Out of heap memory"); break; case RTAS_NO_LOWMEM: snprintf(buf, size, "Kernel out of low memory"); break; case RTAS_FREE_ERR: snprintf(buf, size, "Attempt to free nonexistant RMO buffer"); break; case RTAS_TIMEOUT: snprintf(buf, size, "RTAS delay exceeded specified timeout"); break; case RTAS_IO_ASSERT: snprintf(buf, size, "Unexpected I/O error"); break; case RTAS_UNKNOWN_OP: snprintf(buf, size, "No firmware implementation of function"); break; default: snprintf(buf, size, "Unknown librtas error %d", error); } } openhpi-3.6.1/plugins/rtas/rtas_indicator.c0000644000175100017510000000251012575647277020002 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Daniel de Araujo */ #include SaErrorT rtas_get_indicator_state(void *hnd, SaHpiResourceIdT id, SaHpiHsIndicatorStateT *state) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_set_indicator_state(void *hnd, SaHpiResourceIdT id, SaHpiHsIndicatorStateT state) { return SA_ERR_HPI_INTERNAL_ERROR; } void * oh_get_indicator_state (void *, SaHpiResourceIdT, SaHpiHsIndicatorStateT *) __attribute__ ((weak, alias("rtas_get_indicator_state"))); void * oh_set_indicator_state (void *, SaHpiResourceIdT, SaHpiHsIndicatorStateT) __attribute__ ((weak, alias("rtas_set_indicator_state"))); openhpi-3.6.1/plugins/rtas/rtas.c0000644000175100017510000000340112575647277015746 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales */ #include void *rtas_open(GHashTable *handler_config, unsigned int hid, oh_evt_queue *eventq) { struct oh_handler_state *h = NULL; char *entity_root = NULL; if (!handler_config) { err("No configuration passed."); return NULL; } else if (!hid) { err("Bad handler id passed."); return NULL; } else if (!eventq) { err("No event queue was passed."); return NULL; } entity_root = (char *)g_hash_table_lookup(handler_config, "entity_root"); if (!entity_root) { err("Cannot find \"entity_root\" configuration parameter."); return NULL; } h = (struct oh_handler_state *)g_malloc0(sizeof(struct oh_handler_state)); h->config = handler_config; h->rptcache = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(h->rptcache); h->elcache = oh_el_create(0); h->elcache->gentimestamp = FALSE; h->hid = hid; h->eventq = eventq; return h; } void rtas_close(void *hnd) { return; } /* Function ABI aliases */ void * oh_open (GHashTable *, unsigned int, oh_evt_queue *) __attribute__ ((weak, alias("rtas_open"))); void * oh_close (void *) __attribute__ ((weak, alias("rtas_close"))); openhpi-3.6.1/plugins/rtas/rtas_control.h0000644000175100017510000000245612575647277017524 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Daniel de Araujo */ #ifndef RTAS_CONTROL_H #define RTAS_CONTROL_H #include #include SaErrorT rtas_get_control_state(void *hnd, SaHpiResourceIdT id, SaHpiCtrlNumT num, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state); SaErrorT rtas_set_control_state(void *hnd, SaHpiResourceIdT id, SaHpiCtrlNumT num, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state); SaErrorT rtas_control_parm(void *hnd, SaHpiResourceIdT id, SaHpiParmActionT act); #endif openhpi-3.6.1/plugins/rtas/rtas_annunciator.c0000644000175100017510000000751612575647277020362 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Daniel de Araujo */ #include SaErrorT rtas_get_next_announce(void *hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiSeverityT sev, SaHpiBoolT unack, SaHpiAnnouncementT *a) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_get_announce(void *hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiEntryIdT aid, SaHpiAnnouncementT *a) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_ack_announce(void *hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiEntryIdT aid, SaHpiSeverityT sev) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_add_announce(void *hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiAnnouncementT *a) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_del_announce(void *hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiEntryIdT aid, SaHpiSeverityT sev) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_get_annunc_mode(void *hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiAnnunciatorModeT *mode) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_set_annunc_mode(void *hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiAnnunciatorModeT mode) { return SA_ERR_HPI_INTERNAL_ERROR; } void * oh_get_next_announce (void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiSeverityT, SaHpiBoolT, SaHpiAnnouncementT) __attribute__ ((weak, alias("rtas_get_next_announce"))); void * oh_get_announce (void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiEntryIdT, SaHpiAnnouncementT *) __attribute__ ((weak, alias("rtas_get_announce"))); void * oh_ack_announce (void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiEntryIdT, SaHpiSeverityT) __attribute__ ((weak, alias("rtas_ack_announce"))); void * oh_add_announce (void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiAnnouncementT *) __attribute__ ((weak, alias("rtas_add_announce"))); void * oh_del_announce (void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiEntryIdT, SaHpiSeverityT) __attribute__ ((weak, alias("rtas_del_announce"))); void * oh_get_annunc_mode (void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiAnnunciatorModeT *) __attribute__ ((weak, alias("rtas_get_annunc_mode"))); void * oh_set_annunc_mode (void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiAnnunciatorModeT) __attribute__ ((weak, alias("rtas_set_annunc_mode"))); openhpi-3.6.1/plugins/ipmi/0000755000175100017510000000000012605014560014571 5ustar mohanmohanopenhpi-3.6.1/plugins/ipmi/ipmi_mc_event.c0000644000175100017510000001125412575647300017570 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Louis Zhuang */ #include "ipmi.h" #include #include static void trace_ipmi_mc(char *str, ipmi_mc_t *mc) { if (!getenv("OHOI_TRACE_MC") && !IHOI_TRACE_ALL) { return; } fprintf(stderr, "*** MC (%d, %d): %s. sel support = %d\n", ipmi_mc_get_channel(mc), ipmi_mc_get_address(mc), str, ipmi_mc_sel_device_support(mc)); } static void mc_add(ipmi_mc_t *mc, struct oh_handler_state *handler) { trace_ipmi_mc("ADDED and ACTIVE", mc); } static void mc_remove(ipmi_mc_t *mc, struct oh_handler_state *handler) { struct ohoi_handler *ipmi_handler = handler->data; ipmi_mcid_t mcid; SaHpiRptEntryT *rpt; trace_ipmi_mc("REMOVED (not present)", mc); if (!IS_ATCA(ipmi_handler->d_type)) { return; } g_static_rec_mutex_lock(&ipmi_handler->ohoih_lock); mcid = ipmi_mc_convert_to_id(mc); ohoi_atca_delete_fru_rdrs(handler, mcid); rpt = ohoi_get_resource_by_mcid(handler->rptcache, &mcid); if (rpt == NULL) { trace_ipmi_mc("COULDN'T FIND RPT", mc); err("couldn't find out resource"); } else { rpt->ResourceCapabilities &= ~SAHPI_CAPABILITY_EVENT_LOG; } g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); } static void mc_active(ipmi_mc_t *mc, int active, void *cb_data) { struct oh_handler_state *handler = cb_data; // struct ohoi_handler *ipmi_handler = handler->data; if (active) { mc_add(mc, handler); } else { mc_remove(mc, handler); } } static void process_sel_support(ipmi_mc_t *mc, struct oh_handler_state *handler) { struct ohoi_resource_info *res_info; struct ohoi_handler *ipmi_handler = handler->data; ipmi_mcid_t mcid; SaHpiRptEntryT *rpt; mcid = ipmi_mc_convert_to_id(mc); rpt = ohoi_get_resource_by_mcid(handler->rptcache, &mcid); if (rpt == NULL) { trace_ipmi_mc("COULDN'T FIND RPT", mc); err("couldn't find out resource"); return; } res_info = oh_get_resource_data(handler->rptcache, rpt->ResourceId); if (ipmi_mc_sel_device_support(mc)) { rpt->ResourceCapabilities |= SAHPI_CAPABILITY_EVENT_LOG; entity_rpt_set_updated(res_info, ipmi_handler); } } static void mc_processed(ipmi_mc_t *mc, void *cb_data) { struct oh_handler_state *handler = cb_data; struct ohoi_handler *ipmi_handler = handler->data; g_static_rec_mutex_lock(&ipmi_handler->ohoih_lock); if (ipmi_mc_is_active(mc)) { process_sel_support(mc, handler); } else { trace_ipmi_mc("NOT ACTIVE IN PROCESSED", mc); } if (!ipmi_handler->fully_up) { // do nothing. we''ll process everything when // domain is fully up g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); trace_ipmi_mc("PROCESSED, domain not fully up", mc); return; } trace_ipmi_mc("PROCESSED, handle this event", mc); if (IS_ATCA(ipmi_handler->d_type)) { ohoi_atca_create_fru_rdrs(handler); } g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); } void ohoi_mc_event(enum ipmi_update_e op, ipmi_domain_t *domain, ipmi_mc_t *mc, void *cb_data) { struct oh_handler_state *handler = cb_data; struct ohoi_handler *ipmi_handler = handler->data; int rv; if ((ipmi_mc_get_channel(mc) == 0) && (ipmi_mc_get_address(mc) == 32) && ipmi_handler->d_type == IPMI_DOMAIN_TYPE_ATCA) { ipmi_handler->virt_mcid = ipmi_mc_convert_to_id(mc); } g_static_rec_mutex_lock(&ipmi_handler->ohoih_lock); switch (op) { case IPMI_ADDED: /* if we get an MC but inactive, register a call to add it once it goes active */ rv = ipmi_mc_add_active_handler(mc, mc_active, handler); rv = ipmi_mc_set_sdrs_first_read_handler(mc, mc_processed, handler); if(!ipmi_mc_is_active(mc)) { trace_ipmi_mc("ADDED but inactive...we ignore", mc); break; } else { mc_add(mc, handler); break; } case IPMI_DELETED: trace_ipmi_mc("DELETED, but nothing done", mc); break; case IPMI_CHANGED: if(!ipmi_mc_is_active(mc)) { trace_ipmi("CHANGED and is inactive: (%d %x)\n", ipmi_mc_get_address(mc), ipmi_mc_get_channel(mc)); } else { mc_add(mc, handler); } break; } g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); } openhpi-3.6.1/plugins/ipmi/ekeyfru.h0000644000175100017510000000157612575647300016437 0ustar mohanmohan /* -*- linux-c -*- * * Copyright (c) 2006 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Vadim Revyakin */ #ifndef _EKEYFRU_H_ #define _EKEYFRU_H_ #define CHANNEL_NUM(bytes) ((bytes)[0] & 0x3F) #define LINK_GROUPING_ID(bytes) ((bytes)[3]) #define LINK_TYPE_EXTENSION(bytes) ((bytes[2] & 0xf0) >> 4) #define LINK_TYPE(bytes) (((bytes[2] & 0x0f) << 4) | (((bytes)[1] & 0xf0) >> 4)) #define INTERFACE_TYPE(bytes) (((bytes)[0] & 0xc0) >> 6) #define PORTS(bytes) ((bytes)[1] & 0x0f) #define DEBUG_EKEY 0 #endif openhpi-3.6.1/plugins/ipmi/atca_fru_rdrs.c0000644000175100017510000015623212575647300017576 0ustar mohanmohan /* -*- linux-c -*- * * Copyright (c) 2005 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Vadim Revyakin */ #include "ipmi.h" #include "ekeyfru.h" #include #define uchar unsigned char int ipmicmd_send(ipmi_domain_t *domain, uchar netfn, uchar cmd, uchar lun, uchar chan, uchar *pdata, uchar sdata, ipmi_addr_response_handler_t handler, void *handler_data); int ipmicmd_mc_send(ipmi_mc_t *mc, uchar netfn, uchar cmd, uchar lun, uchar *pdata, uchar sdata, ipmi_mc_response_handler_t handler, void *handler_data); /* * IPMB-0 Sensor */ struct atca_ipmb0_link_num_s { int l_num; int s_num; ipmi_sensor_t *sensor; int done; SaErrorT rv; }; static int get_ipmb0_sensor_num_done( ipmi_domain_t *domain, ipmi_msgi_t *rspi) { struct atca_ipmb0_link_num_s *info = rspi->data1; ipmi_msg_t *msg = &rspi->msg; int rv = msg->data[0]; dbg("get ipmb link info(%d) for sensor 0x%x: %02x %02x %02x %02x", msg->data_len, info->s_num, msg->data[0], msg->data[1], msg->data[2], msg->data[3]); if (domain == NULL) { info->rv = SA_ERR_HPI_INVALID_PARAMS; info->done = 1; return IPMI_MSG_ITEM_NOT_USED; } if (rv == 0xc1) { info->rv = SA_ERR_HPI_INVALID_CMD; } else if (rv == 0xc3) { info->rv = SA_ERR_HPI_NO_RESPONSE; } else if (rv != 0) { info->rv = SA_ERR_HPI_INVALID_PARAMS; } else { info->l_num = msg->data[2]; } info->done = 1; return IPMI_MSG_ITEM_NOT_USED; }; static void get_ipmb0_sensor_num_cb( ipmi_domain_t *domain, void *cb_data) { struct atca_ipmb0_link_num_s *info = cb_data; unsigned char data[16]; int rv; ipmi_sensor_id_t sid = ipmi_sensor_convert_to_id(info->sensor); info->s_num = sid.sensor_num; data[0] = 0; // PICMB Identifier; data[1] = 0x01; // next byte contains sensor number data[2] = sid.sensor_num; rv = ipmicmd_send(domain, 0x2c, 0x18, sid.lun, sid.mcid.channel, data, 3, get_ipmb0_sensor_num_done, cb_data); if (rv != 0) { err("ipmicmd_send = 0x%x", rv); OHOI_MAP_ERROR(info->rv, rv); return; } else { dbg("get ipmb link info send(0x%x 0x%x): %02x %02x %02x", sid.lun, sid.mcid.channel, data[0], data[1], data[2]); } return; } static int get_ipmb0_sensor_num(struct oh_handler_state *handler, ipmi_sensor_t *sensor, SaHpiSensorNumT *snump) { struct ohoi_handler *ipmi_handler = handler->data; struct atca_ipmb0_link_num_s info; ipmi_entity_t *entity = ipmi_sensor_get_entity(sensor); int rv; if (ipmi_handler->d_type != IPMI_DOMAIN_TYPE_ATCA) { return 1; } if (ipmi_entity_get_entity_id(entity) != 0xf0) { // it is not shelf manager *snump = ATCAHPI_SENSOR_NUM_IPMB0; return 0; } info.done = 0; info.sensor = sensor; info.rv = SA_OK; rv = ipmi_domain_pointer_cb(ipmi_handler->domain_id, get_ipmb0_sensor_num_cb, &info); if (rv != 0) { err("ipmi_domain_pointer_cb = 0x%x", rv); return 1; } rv = ohoi_loop(&info.done, ipmi_handler); if (rv != SA_OK) { err("ohoi_loop = 0x%x", rv); return 1; } if (info.rv != SA_OK) { err("info.rv = 0x%x", info.rv); return 1; } *snump = ATCAHPI_SENSOR_NUM_IPMB0 + info.l_num; return 0; } static SaHpiEventStateT ipmb0_sensor_events_to_hpi(SaHpiEventStateT ev) { SaHpiEventStateT newev = 0; if (ev & 0x01) { newev |= SAHPI_ES_NON_REDUNDANT_INSUFFICIENT_RESOURCES; } if ((ev & 0x02) || (ev & 0x04)) { newev |= SAHPI_ES_NON_REDUNDANT_SUFFICIENT_RESOURCES; } if (ev & 0x08) { newev |= SAHPI_ES_FULLY_REDUNDANT; } return newev; } static SaHpiEventStateT ipmb0_sensor_events_to_ipmi(SaHpiEventStateT ev) { SaHpiEventStateT newev = 0; if (ev & SAHPI_ES_NON_REDUNDANT_INSUFFICIENT_RESOURCES) { newev |= 0x01; } if (ev & SAHPI_ES_NON_REDUNDANT_SUFFICIENT_RESOURCES) { newev |= 0x06; } if (ev & SAHPI_ES_FULLY_REDUNDANT) { newev |= 0x08; } return newev; } static SaErrorT get_ipmb0_sensor_reading( struct oh_handler_state *handler, struct ohoi_sensor_info *sinfo, SaHpiSensorReadingT * reading, SaHpiEventStateT * ev_state) { SaHpiEventStateT tmp_state; SaErrorT rv; rv = orig_get_sensor_reading(handler, sinfo, reading, &tmp_state); if (rv != SA_OK) { return rv; } *ev_state = ipmb0_sensor_events_to_hpi(tmp_state); return SA_OK; } static SaErrorT get_ipmb0_sensor_event_enable( struct oh_handler_state *handler, struct ohoi_sensor_info *sinfo, SaHpiBoolT *enable, SaHpiEventStateT *assert, SaHpiEventStateT *deassert) { SaHpiEventStateT tmp_assert; SaHpiEventStateT tmp_deassert; SaErrorT rv; rv = orig_get_sensor_event_enable(handler, sinfo, enable, &tmp_assert, &tmp_deassert); if (rv != SA_OK) { return rv; } *assert = ipmb0_sensor_events_to_hpi(tmp_assert); *deassert = ipmb0_sensor_events_to_hpi(tmp_deassert); return SA_OK; } static SaErrorT set_ipmb0_sensor_event_enable( struct oh_handler_state *handler, struct ohoi_sensor_info *sinfo, SaHpiBoolT enable, SaHpiEventStateT assert, SaHpiEventStateT deassert, unsigned int a_supported, unsigned int d_supported) { return orig_set_sensor_event_enable(handler, sinfo, enable, ipmb0_sensor_events_to_ipmi(assert), ipmb0_sensor_events_to_ipmi(deassert), a_supported, d_supported); } void adjust_sensor_to_atcahpi_spec(struct oh_handler_state *handler, SaHpiRptEntryT *rpt, SaHpiRdrT *rdr, struct ohoi_sensor_info *sensor_info, ipmi_sensor_t *sensor) { struct ohoi_handler *ipmi_handler = handler->data; SaHpiSensorRecT *rec = &rdr->RdrTypeUnion.SensorRec; if (!IS_ATCA(ipmi_handler->d_type)) { return; } if (ipmi_sensor_get_sensor_type(sensor) == 0xf0) { // ATCA hot swap sensor rec->Type = SAHPI_OEM_SENSOR; rec->Category = SAHPI_EC_GENERIC; return; } if (ipmi_sensor_get_sensor_type(sensor) != 0xf1) { // not IPMB-0 sensor return; } if (get_ipmb0_sensor_num(handler, sensor, &rec->Num) != 0) { err("Couldn't get IPMB-0 sensor link. #%d for resource %d", rec->Num, rpt->ResourceId); return; } rec->Type = SAHPI_OEM_SENSOR; rec->Category = SAHPI_EC_REDUNDANCY; rec->Events = SAHPI_ES_FULLY_REDUNDANT | SAHPI_ES_NON_REDUNDANT_SUFFICIENT_RESOURCES | SAHPI_ES_NON_REDUNDANT_INSUFFICIENT_RESOURCES; sensor_info->ohoii.get_sensor_event_enable = get_ipmb0_sensor_event_enable; sensor_info->ohoii.set_sensor_event_enable = set_ipmb0_sensor_event_enable; sensor_info->ohoii.get_sensor_reading = get_ipmb0_sensor_reading; } /* * IPMB-0 State Control */ struct set_ipmb0_state_control_s { unsigned char a; unsigned char b; unsigned char chan; int done; SaErrorT rv; }; static void _set_ipmb0_state_control_cb( ipmi_mc_t *mc, ipmi_msg_t *msg, void *rsp_data) { struct set_ipmb0_state_control_s *info = rsp_data; int rv = msg->data[0]; dbg("set IPMB state response(%d): %02x\n", msg->data_len, rv); if (mc == NULL) { info->rv = SA_ERR_HPI_ENTITY_NOT_PRESENT; info->done = 1; return; } if (rv == 0xc1) { info->rv = SA_ERR_HPI_INVALID_CMD; } else if (rv == 0xc3) { info->rv = SA_ERR_HPI_NO_RESPONSE; } else if (rv != 0) { info->rv = SA_ERR_HPI_INVALID_PARAMS; } info->done = 1; return; }; static void set_ipmb0_state_control_cb( ipmi_mc_t *mc, void *cb_data) { struct set_ipmb0_state_control_s *info = cb_data; unsigned char data[16]; int rv; data[0] = 0; data[1] = info->a; data[2] = info->b; dbg("set IPMB state to MC (%d, %d) : %02x %02x %02x", ipmi_mc_get_channel(mc), ipmi_mc_get_address(mc), data[0], data[1], data[2]); rv = ipmicmd_mc_send(mc, 0x2c, 0x09, 0, data, 3, _set_ipmb0_state_control_cb, cb_data); if (rv != 0) { err("ipmicmd_send = 0x%x", rv); OHOI_MAP_ERROR(info->rv, rv); info->done =1; return; } return; } static SaErrorT set_ipmb0_state_control_state( struct oh_handler_state *hnd, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state) { struct set_ipmb0_state_control_s info; struct ohoi_handler *ipmi_handler = (struct ohoi_handler *)hnd->data; SaErrorT rv; struct ohoi_resource_info *res_info; unsigned int link_num; unsigned char on; if (state && state->Type != SAHPI_CTRL_TYPE_ANALOG) { err("wrong state Type : %d", state->Type); return SA_ERR_HPI_INVALID_DATA; } res_info = oh_get_resource_data(hnd->rptcache, c->info.atcamap_ctrl_info.val); if (res_info == NULL) { err("No res_info"); return SA_ERR_HPI_INTERNAL_ERROR; } if (!(res_info->type & OHOI_RESOURCE_MC)) { err("resource not MC"); return SA_ERR_HPI_INTERNAL_ERROR; } link_num = state ? state->StateUnion.Analog : 0; if (link_num > rdr->RdrTypeUnion.CtrlRec.TypeUnion.Analog.Max) { err("Wrong analog value: %d > %d", link_num, rdr->RdrTypeUnion.CtrlRec.TypeUnion.Analog.Max); return SA_ERR_HPI_INVALID_DATA; } on = (mode == SAHPI_CTRL_MODE_AUTO) ? 1 : 0; if (rdr->RdrTypeUnion.CtrlRec.Num == ATCAHPI_CTRL_NUM_IPMB_A_STATE) { info.b = 0xFF; info.a = (link_num << 1) | on; } else if (rdr->RdrTypeUnion.CtrlRec.Num == ATCAHPI_CTRL_NUM_IPMB_B_STATE) { info.a = 0xFF; info.b = (link_num << 1) | on; } else { err("Not IPMB state control: 0x%x", rdr->RdrTypeUnion.CtrlRec.Num); return SA_ERR_HPI_INTERNAL_ERROR; } info.done = 0; info.rv = SA_OK; rv = ipmi_mc_pointer_cb(res_info->u.entity.mc_id, set_ipmb0_state_control_cb, &info); if (rv != 0) { err("ipmi_mc_pointer_cb = 0x%x", rv); return SA_ERR_HPI_INVALID_CMD; } rv = ohoi_loop(&info.done, ipmi_handler); if (rv != SA_OK) { err("ohoi_loop = 0x%x", rv); return rv; } if (info.rv != SA_OK) { err("info.rv = 0x%x", info.rv); return rv; } return SA_OK; } static SaHpiRdrT *create_ipmb0_state_control( struct ohoi_handler *ipmi_handler, SaHpiRptEntryT *rpt, struct ohoi_control_info **ctrl_info, int bus_A, SaHpiCtrlStateAnalogT max_link ) { SaHpiRdrT *rdr; struct ohoi_control_info *c_info; rdr = malloc(sizeof (*rdr)); if (rdr == NULL) { err("Out of memory"); return NULL; } c_info = malloc(sizeof (*c_info)); if (rdr == NULL) { err("Out of memory"); free(rdr); return NULL; } memset(rdr, 0, sizeof (*rdr)); memset(c_info, 0, sizeof (*c_info)); rdr->RdrType = SAHPI_CTRL_RDR; rdr->IsFru = SAHPI_FALSE; rdr->Entity = rpt->ResourceEntity; rdr->RdrTypeUnion.CtrlRec.Num = bus_A ? ATCAHPI_CTRL_NUM_IPMB_A_STATE : ATCAHPI_CTRL_NUM_IPMB_B_STATE; rdr->RdrTypeUnion.CtrlRec.OutputType = SAHPI_CTRL_GENERIC; rdr->RdrTypeUnion.CtrlRec.Type = SAHPI_CTRL_TYPE_ANALOG; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Analog.Min = 0x00; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Analog.Max = max_link; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Analog.Default = 0x00; rdr->RdrTypeUnion.CtrlRec.DefaultMode.ReadOnly = SAHPI_FALSE; rdr->RdrTypeUnion.CtrlRec.DefaultMode.Mode = SAHPI_CTRL_MODE_AUTO; rdr->RdrTypeUnion.CtrlRec.WriteOnly = SAHPI_TRUE; oh_init_textbuffer(&rdr->IdString); if (bus_A) { oh_append_textbuffer(&rdr->IdString, "IPMB-A State Control"); } else { oh_append_textbuffer(&rdr->IdString, "IPMB-B State Control"); } c_info->ohoii.get_control_state = NULL; c_info->ohoii.set_control_state = set_ipmb0_state_control_state; c_info->mode = SAHPI_CTRL_MODE_AUTO; c_info->info.atcamap_ctrl_info.val = rpt->ResourceId; *ctrl_info = c_info; return rdr; } void ohoi_create_ipmb0_controls(struct oh_handler_state *handler, ipmi_entity_t *entity, unsigned int max) { ipmi_entity_id_t entity_id = ipmi_entity_convert_to_id(entity); SaHpiRptEntryT *rpt; struct ohoi_resource_info *res_info; SaHpiRdrT *rdr; struct ohoi_control_info *ctrl_info; rpt = ohoi_get_resource_by_entityid(handler->rptcache, &entity_id); if (rpt == NULL) { err("couldn't find out resource"); return; } res_info = oh_get_resource_data(handler->rptcache, rpt->ResourceId); if (res_info == NULL) { err("couldn't find out res_info"); return; } //printf(" ################ create ipmb0_controls for Resource %d; num links = %d\n", rpt->ResourceId, max); rdr = create_ipmb0_state_control(handler->data, rpt, &ctrl_info, 1, max); if (rdr != NULL && (oh_add_rdr(handler->rptcache, rpt->ResourceId, rdr, ctrl_info, 1) != SA_OK)) { err("couldn't add control rdr"); free(rdr); free(ctrl_info); } else { rpt->ResourceCapabilities |= SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_RDR; } rdr = create_ipmb0_state_control(handler->data, rpt, &ctrl_info, 0, max); if (rdr != NULL && (oh_add_rdr(handler->rptcache, rpt->ResourceId, rdr, ctrl_info, 1) != SA_OK)) { err("couldn't add control rdr"); free(rdr); free(ctrl_info); } else { rpt->ResourceCapabilities |= SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_RDR; res_info->type |= OHOI_MC_IPMB0_CONTROL_CREATED; } } /* * FRU Management Controller Reset Control */ static SaErrorT get_fru_mc_reset_control_state( struct oh_handler_state *hnd, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state) { return SA_ERR_HPI_INVALID_CMD; } struct mc_reset_info { int done; SaErrorT rv; SaHpiCtrlStateAnalogT val; }; static void reset_mc_done (ipmi_mc_t *mc, int err, void *cb_data) { struct mc_reset_info *info = cb_data; info->done = 1; if (err) { err("reset_mc_done err = %d", err); info->rv = SA_ERR_HPI_INVALID_REQUEST; } } static void set_mc_reset_state(ipmi_mc_t *mc, void *cb_data) { struct mc_reset_info *info = cb_data; int rv; int act; if (info->val == 1) { act = IPMI_MC_RESET_COLD; } else if (info->val == 2) { act = IPMI_MC_RESET_WARM; } else { info->rv = SA_ERR_HPI_INVALID_CMD; info->done = 1; return; } rv = ipmi_mc_reset(mc, act, reset_mc_done, cb_data); if (rv) { err("ipmi_mc_reset returned err = %d", rv); info->rv = SA_ERR_HPI_INVALID_REQUEST; info->done = 1; } } static SaErrorT set_fru_mc_reset_control_state( struct oh_handler_state *hnd, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state) { struct mc_reset_info info; struct ohoi_handler *ipmi_handler = (struct ohoi_handler *)hnd->data; SaErrorT rv; struct ohoi_resource_info *res_info; SaHpiCtrlStateAnalogT val; if (mode == SAHPI_CTRL_MODE_AUTO) { return SA_ERR_HPI_READ_ONLY; } if (state->Type != SAHPI_CTRL_TYPE_ANALOG) { err("wrong state Type : %d", state->Type); return SA_ERR_HPI_INVALID_DATA; } res_info = oh_get_resource_data(hnd->rptcache, c->info.atcamap_ctrl_info.val); if (res_info == NULL) { err("No res_info"); return SA_ERR_HPI_INTERNAL_ERROR; } if (!(res_info->type & OHOI_RESOURCE_MC)) { err("resource not MC"); return SA_ERR_HPI_INTERNAL_ERROR; } val = state->StateUnion.Analog; if ((val != 1) && (val != 2)) { err("wrong state value %d", val); return SA_ERR_HPI_INVALID_DATA; } info.done = 0; info.rv = SA_OK; info.val = val; rv = ipmi_mc_pointer_cb(res_info->u.entity.mc_id, set_mc_reset_state, &info); if (rv != 0) { err("ipmi_mc_pointer_cb = 0x%x", rv); return SA_ERR_HPI_INVALID_CMD; } rv = ohoi_loop(&info.done, ipmi_handler); if (rv != SA_OK) { err("ohoi_loop = 0x%x", rv); return rv; } if (info.rv != SA_OK) { err("info.rv = 0x%x", info.rv); return rv; } return SA_OK; } static SaHpiRdrT *create_fru_mc_reset_control( struct ohoi_handler *ipmi_handler, SaHpiRptEntryT *rpt, struct ohoi_control_info **ctrl_info ) { SaHpiRdrT *rdr; struct ohoi_control_info *c_info; rdr = malloc(sizeof (*rdr)); if (rdr == NULL) { err("Out of memory"); return NULL; } c_info = malloc(sizeof (*c_info)); if (rdr == NULL) { err("Out of memory"); free(rdr); return NULL; } memset(rdr, 0, sizeof (*rdr)); memset(c_info, 0, sizeof (*c_info)); rdr->RdrType = SAHPI_CTRL_RDR; rdr->IsFru = SAHPI_FALSE; rdr->Entity = rpt->ResourceEntity; rdr->RdrTypeUnion.CtrlRec.Num = ATCAHPI_CTRL_NUM_FRU_IPMC_RESET; rdr->RdrTypeUnion.CtrlRec.OutputType = SAHPI_CTRL_GENERIC; rdr->RdrTypeUnion.CtrlRec.Type = SAHPI_CTRL_TYPE_ANALOG; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Analog.Min = 0x01; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Analog.Max = 0x02; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Analog.Default = 0x01; rdr->RdrTypeUnion.CtrlRec.DefaultMode.ReadOnly = SAHPI_TRUE; rdr->RdrTypeUnion.CtrlRec.DefaultMode.Mode = SAHPI_CTRL_MODE_MANUAL; rdr->RdrTypeUnion.CtrlRec.WriteOnly = SAHPI_TRUE; oh_init_textbuffer(&rdr->IdString); oh_append_textbuffer(&rdr->IdString, "FRU Management Controller Reset Control"); c_info->ohoii.get_control_state = get_fru_mc_reset_control_state; c_info->ohoii.set_control_state = set_fru_mc_reset_control_state; c_info->mode = SAHPI_CTRL_MODE_MANUAL; c_info->info.atcamap_ctrl_info.val = rpt->ResourceId; *ctrl_info = c_info; return rdr; } void ohoi_create_fru_mc_reset_control(struct oh_handler_state *handler, SaHpiResourceIdT rid) { // struct ohoi_handler *ipmi_handler = handler->data; SaHpiRptEntryT *rpt; struct ohoi_resource_info *res_info; SaHpiRdrT *rdr; struct ohoi_control_info *c_info; int rv; rpt = oh_get_resource_by_id(handler->rptcache, rid); if (rpt == NULL) { err("No rpt = %d", rid); return; } res_info = oh_get_resource_data(handler->rptcache, rpt->ResourceId); if (res_info == NULL) { err("No res_info for rpt = %d", rid); return; } rdr = create_fru_mc_reset_control(handler->data, rpt, &c_info); if (rdr == NULL) { err("could not create fan control"); return; } rv = oh_add_rdr(handler->rptcache,rpt->ResourceId, rdr, c_info, 1); if (rv != SA_OK) { err("couldn't add control rdr"); free(rdr); free(c_info); return; } rpt->ResourceCapabilities |= SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_RDR; res_info->type |= OHOI_MC_RESET_CONTROL_CREATED; } /* * FAN Control */ static SaErrorT get_fan_control_state( struct oh_handler_state *hnd, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state); static SaErrorT set_fan_control_state( struct oh_handler_state *hnd, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state); struct fan_control_s { unsigned char min; unsigned char max; unsigned char normal; unsigned char local; unsigned char device_id; SaErrorT rv; int done; }; static void get_fan_speed_properties_done( ipmi_mc_t *mc, ipmi_msg_t *msg, void *rsp_data) { struct fan_control_s *info = rsp_data; dbg("get fan speed properties response(%d): %02x %02x %02x " "%02x %02x %02x\n", msg->data_len, msg->data[0], msg->data[1], msg->data[2], msg->data[3], msg->data[4], msg->data[5]); if (mc == NULL) { info->rv = SA_ERR_HPI_INVALID_PARAMS; info->done = 1; return; } if (msg->data[0] != 0) { info->rv = SA_ERR_HPI_INVALID_PARAMS; } else { info->min = msg->data[2]; info->max = msg->data[3]; info->normal = msg->data[4]; } info->done = 1; }; static void get_fan_speed_properties(ipmi_mc_t *mc, void *cb_data) { struct fan_control_s *info = cb_data; unsigned char data[16]; int rv; info->device_id = 0; data[0] = 0; data[1] = (unsigned char)info->device_id; dbg("get fan properties (%d, %d) : %02x %02x", ipmi_mc_get_channel(mc), ipmi_mc_get_address(mc), data[0], data[1]); rv = ipmicmd_mc_send(mc, 0x2c, 0x14, 0, data, 2, get_fan_speed_properties_done, cb_data); if (rv != 0) { err("ipmicmd_send = 0x%x", rv); info->rv = rv; info->done = 1; return; } return; } static SaHpiRdrT *create_fan_control( struct oh_handler_state *handler, SaHpiRptEntryT *rpt, struct ohoi_control_info **ctrl_info ) { SaHpiRdrT *rdr; struct ohoi_control_info *c_info; struct ohoi_resource_info *res_info; // struct ohoi_handler *ipmi_handler = handler->data; struct fan_control_s info; int rv; res_info = oh_get_resource_data(handler->rptcache, rpt->ResourceId); if (res_info == NULL) { err("res_info == NULL ?"); return NULL; } if (!(res_info->type & OHOI_RESOURCE_MC)) { err("only intelligent fru supported now"); return NULL; } // determine max, min, default values info.rv = SA_OK; info.done = 0; rv = ipmi_mc_pointer_cb(res_info->u.entity.mc_id, get_fan_speed_properties, &info); if (rv != 0) { err("ipmi_pointer_entity_cb = %d", rv); return NULL; } rv = ohoi_loop(&info.done, handler->data); if (rv != SA_OK) { err("ohoi_loop = %d", rv); return NULL; } if (info.rv != 0) { err("info.rv = %d", info.rv); return NULL; } rdr = malloc(sizeof (*rdr)); if (rdr == NULL) { err("Out of memory"); return NULL; } c_info = malloc(sizeof (*c_info)); if (rdr == NULL) { err("Out of memory"); free(rdr); return NULL; } memset(rdr, 0, sizeof (*rdr)); memset(c_info, 0, sizeof (*c_info)); rdr->RdrType = SAHPI_CTRL_RDR; rdr->IsFru = SAHPI_FALSE; rdr->Entity = rpt->ResourceEntity; rdr->RdrTypeUnion.CtrlRec.Num = ATCAHPI_CTRL_NUM_FAN_SPEED; rdr->RdrTypeUnion.CtrlRec.OutputType = SAHPI_CTRL_FAN_SPEED; rdr->RdrTypeUnion.CtrlRec.Type = SAHPI_CTRL_TYPE_ANALOG; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Analog.Min = info.min; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Analog.Max = info.max; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Analog.Default = info.normal; rdr->RdrTypeUnion.CtrlRec.DefaultMode.ReadOnly = SAHPI_TRUE; rdr->RdrTypeUnion.CtrlRec.DefaultMode.Mode = SAHPI_CTRL_MODE_AUTO; rdr->RdrTypeUnion.CtrlRec.WriteOnly = SAHPI_FALSE; oh_init_textbuffer(&rdr->IdString); oh_append_textbuffer(&rdr->IdString, "Fan Control"); c_info->ohoii.get_control_state = get_fan_control_state; c_info->ohoii.set_control_state = set_fan_control_state; c_info->mode = SAHPI_CTRL_MODE_AUTO; c_info->info.atcamap_ctrl_info.val = rpt->ResourceId; *ctrl_info = c_info; return rdr; } void ohoi_create_fan_control(struct oh_handler_state *handler, SaHpiResourceIdT rid) { // struct ohoi_handler *ipmi_handler = handler->data; SaHpiRptEntryT *rpt; SaHpiRdrT *rdr; struct ohoi_control_info *c_info; int rv; rpt = oh_get_resource_by_id(handler->rptcache, rid); if (rpt == NULL) { err("No rpt = %d", rid); return; } rdr = create_fan_control(handler, rpt, &c_info); if (rdr == NULL) { err("could not create fan control"); return; } rv = oh_add_rdr(handler->rptcache,rpt->ResourceId, rdr, c_info, 1); if (rv != SA_OK) { err("couldn't add control rdr"); free(rdr); free(c_info); return; } rpt->ResourceCapabilities |= SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_RDR; } static void get_fan_control_state_done( ipmi_mc_t *mc, ipmi_msg_t *msg, void *rsp_data) { struct fan_control_s *info = rsp_data; dbg("get fan level response(%d): %02x %02x %02x %02x\n", msg->data_len, msg->data[0], msg->data[1], msg->data[2], msg->data[3]); if (mc == NULL) { info->rv = SA_ERR_HPI_INVALID_PARAMS; info->done = 1; return; } if (msg->data[0] != 0) { info->rv = SA_ERR_HPI_INVALID_PARAMS; } else { info->local = msg->data[3]; info->normal = msg->data[2]; } info->done = 1; }; static void get_fan_control_state_cb(ipmi_mc_t *mc, void *cb_data) { struct fan_control_s *info = cb_data; unsigned char data[16]; int rv; info->device_id = 0; data[0] = 0; data[1] = (unsigned char)info->device_id; dbg("get fan level (%d, %d) : %02x %02x", ipmi_mc_get_channel(mc), ipmi_mc_get_address(mc), data[0], data[1]); rv = ipmicmd_mc_send(mc, 0x2c, 0x16, 0, data, 2, get_fan_control_state_done, cb_data); if (rv != 0) { err("ipmicmd_send = 0x%x", rv); info->rv = rv; info->done = 1; return; } return; } static SaErrorT get_fan_control_state( struct oh_handler_state *handler, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state) { // struct ohoi_handler *ipmi_handler = handler->data; struct ohoi_resource_info *res_info; struct fan_control_s info; int rv; if (state == NULL) { goto no_state; } res_info = oh_get_resource_data(handler->rptcache, c->info.atcamap_ctrl_info.val); if (res_info == NULL) { err("res_info == NULL ?"); return SA_ERR_HPI_INVALID_RESOURCE; } if (!(res_info->type & OHOI_RESOURCE_MC)) { err("only intelligent fru supported now"); return SA_ERR_HPI_UNSUPPORTED_API; } info.rv = SA_OK; info.done = 0; rv = ipmi_mc_pointer_cb(res_info->u.entity.mc_id, get_fan_control_state_cb, &info); if (rv != 0) { err("ipmi_pointer_entity_cb = %d", rv); return SA_ERR_HPI_ENTITY_NOT_PRESENT; } rv = ohoi_loop(&info.done, handler->data); if (rv != SA_OK) { err("ohoi_loop = %d", rv); return SA_ERR_HPI_ENTITY_NOT_PRESENT; } if (info.rv != 0) { err("info.rv = %d", info.rv); return SA_ERR_HPI_ENTITY_NOT_PRESENT; } state->Type = SAHPI_CTRL_TYPE_ANALOG; state->StateUnion.Analog = info.normal; no_state : if (mode) { *mode = c->mode; } return SA_OK; } static SaErrorT set_fan_control_state( struct oh_handler_state *hnd, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state) { if (mode == SAHPI_CTRL_MODE_AUTO) { return SA_OK; } return SA_ERR_HPI_READ_ONLY; } /* * Ekeying Link State Sensor */ static SaErrorT get_ekeying_link_state_sensor_event_enable( struct oh_handler_state *hnd, struct ohoi_sensor_info *sinfo, SaHpiBoolT *enable, SaHpiEventStateT *assert, SaHpiEventStateT *deassert) { *assert = 0; *deassert = 0; *enable = 0; return SA_OK; } typedef struct { unsigned char channel; SaHpiUint8T *buffer; SaHpiEventStateT state; int done; SaErrorT rv; } ekey_sen_reading_info_t; static void get_ekeying_link_state_sensor_reading_done( ipmi_mc_t *mc, ipmi_msg_t *msg, void *rsp_data) { ekey_sen_reading_info_t *info = rsp_data; int rv = msg->data[0]; unsigned char *data = msg->data; SaHpiUint8T *buffer = info->buffer; unsigned char link_enabled = 0; unsigned char *buf; unsigned char chn; unsigned char ip; unsigned char chns[4] = {0, 0, 0, 0}; unsigned char order[4] = {0, 0, 0, 0}; dbg("get IPMB state response(%d): %02x\n", msg->data_len, rv); //printf("get IPMB state response: %02x %02x %02x %02x %02x %02x %02x\n", //data[0], data[1], data[2], data[3], data[4], data[05], data[6]); if (mc == NULL) { info->rv = SA_ERR_HPI_ENTITY_NOT_PRESENT; info->done = 1; return; } if (rv == 0xc1) { info->rv = SA_ERR_HPI_INVALID_CMD; } else if (rv == 0xc3) { info->rv = SA_ERR_HPI_NO_RESPONSE; } else if (rv != 0) { info->rv = SA_ERR_HPI_INVALID_PARAMS; } if (rv != 0) { info->done = 1; return; } if (msg->data_len < 7) { info->rv = SA_ERR_HPI_NO_RESPONSE; goto out; } memset(buffer, 0, SAHPI_SENSOR_BUFFER_LENGTH); // first link ip = 2; // index to ports for first channel buf = data + 2; chn = CHANNEL_NUM(buf); if (chn == 0 || chn > 16) { err("wrong channel %d for Link 1", chn); info->rv = SA_ERR_HPI_NO_RESPONSE; goto out; } if (chn <= 8) { buffer[0] = 1 << (chn - 1); } else { buffer[1] = 1 << (chn - 9); } order[0] = ip; buffer[5] = LINK_GROUPING_ID(buf); buffer[4] = LINK_TYPE_EXTENSION(buf); buffer[3] = LINK_TYPE(buf); buffer[2] = INTERFACE_TYPE(buf); link_enabled = data[6]; if (msg->data_len < 12) { goto out; } // second link ip = 7; // index to ports for second channel buf = data + 7; chn = CHANNEL_NUM(buf); if (chn == 0 || chn > 16) { err("wrong channel %d for Link 2", chn); info->rv = SA_ERR_HPI_NO_RESPONSE; goto out; } if (chn > chns[0]) { chns[1] = chn; order[1] = ip; } else { chns[1] = chns[0]; order[1] = order[0]; chns[0] = chn; order[0] = ip; } if (chn <= 8) { buffer[0] |= 1 << (chn - 1); } else { buffer[1] |= 1 << (chn - 9); } link_enabled |= data[11]; if (msg->data_len < 17) { goto out; } // third link ip = 12; // index to ports for third channel buf = data + 12; chn = CHANNEL_NUM(buf); if (chn == 0 || chn > 16) { err("wrong channel %d for Link 2", chn); info->rv = SA_ERR_HPI_NO_RESPONSE; goto out; } if (chn > chns[1]) { chns[2] = chn; order[2] = ip; } else { chns[2] = chns[1]; order[2] = order[1]; if (chn > chns[0]) { chns[1] = chn; order[1] = ip; } else { chns[1] = chns[0]; order[1] = order[0]; chns[0] = chn; order[0] = ip; } } if (chn <= 8) { buffer[0] |= 1 << (chn - 1); } else { buffer[1] |= 1 << (chn - 9); } link_enabled |= data[16]; if (msg->data_len < 22) { goto out; } // forth link ip = 17; // index to ports for forth cahannel buf = data + 17; chn = CHANNEL_NUM(buf); if (chn == 0 || chn > 16) { err("wrong channel %d for Link 2", chn); info->rv = SA_ERR_HPI_NO_RESPONSE; goto out; } if (chn > chns[2]) { chns[3] = chn; order[3] = ip; } else { chns[3] = chns[2]; order[3] = order[2]; if (chn > chns[1]) { chns[2] = chn; order[2] = ip; } else { chns[2] = chns[1]; order[2] = order[1]; if (chn > chns[0]) { chns[1] = chn; order[1] = ip; } else { chns[1] = chns[0]; order[1] = order[0]; chns[0] = chn; order[0] = ip; } } } if (chn <= 8) { buffer[0] |= 1 << (chn - 1); } else { buffer[1] |= 1 << (chn - 9); } link_enabled |= data[21]; // It will be fine to check all links have the same // gpouping_id, link_type, link_type_extension, interface_type // and enable bit. XXXX out: if (info->rv == 0) { // now fill in port map fields if (order[0] > 0) { buffer[6] = PORTS(data + order[0]); } if (order[1] > 0) { buffer[6] |= (PORTS(data + order[1]) << 4); } if (order[2] > 0) { buffer[7] = PORTS(data + order[2]); } if (order[3] > 0) { buffer[7] |= (PORTS(data + order[3]) << 4); } info->state = link_enabled ? SAHPI_ES_ENABLED : SAHPI_ES_DISABLED; } #if DEBUG_EKEY printf("E-KEY READING: port map = %02x%02x%02x%02x%02x%02x%02x%02x\n" " Link Grouping Id %02x; Link Type Extension %02x; " "Link Type %02x; Intrface Type %02x; Channel Map %02x%02x\n", buffer[13], buffer[12], buffer[11], buffer[10], buffer[ 9], buffer[ 8], buffer[ 7], buffer[ 6], buffer[ 5], buffer[ 4], buffer[ 3], buffer[ 2], buffer[ 1], buffer[ 0]); #endif info->done = 1; }; static void get_ekeying_link_state_sensor_reading_cb(ipmi_mc_t *mc, void *cb_data) { ekey_sen_reading_info_t *info = cb_data; unsigned char data[16]; int rv; data[0] = 0; data[1] = info->channel; dbg("Get Port State to MC (%d, %d) : %02x %02x", ipmi_mc_get_channel(mc), ipmi_mc_get_address(mc), data[0], data[1]); rv = ipmicmd_mc_send(mc, 0x2c, 0x0f, 0, data, 2, get_ekeying_link_state_sensor_reading_done, cb_data); if (rv != 0) { err("ipmicmd_send = 0x%x", rv); OHOI_MAP_ERROR(info->rv, rv); info->done = 1; return; } return; } static SaErrorT get_ekeying_link_state_sensor_reading( struct oh_handler_state *handler, struct ohoi_sensor_info *sensor_info, SaHpiSensorReadingT *reading, SaHpiEventStateT *ev_state) { SaHpiRptEntryT *rpt; struct ohoi_resource_info *res_info; SaHpiRdrT *rdr; ekey_sen_reading_info_t info; int rv; SaHpiUint8T *buf; int i; rpt = oh_get_resource_by_id(handler->rptcache, sensor_info->info.atcamap_sensor_info.val); if (rpt == NULL) { err("no rpt for resource Id %d", sensor_info->info.atcamap_sensor_info.val); return SA_ERR_HPI_ENTITY_NOT_PRESENT; } rdr = ohoi_get_rdr_by_data(handler->rptcache, rpt->ResourceId, SAHPI_SENSOR_RDR, sensor_info); if (rdr == NULL) { err("no rdr for sensor. Rpt %d, sen_info = %p", rpt->ResourceId, sensor_info); return SA_ERR_HPI_ENTITY_NOT_PRESENT; } res_info = oh_get_resource_data(handler->rptcache, rpt->ResourceId); if (res_info == NULL) { err("no res_info"); return SA_ERR_HPI_ENTITY_NOT_PRESENT; } if (!(res_info->type & OHOI_RESOURCE_MC)) { err("resource %d not MC", rpt->ResourceId); return SA_ERR_HPI_ENTITY_NOT_PRESENT; } buf = rdr->RdrTypeUnion.SensorRec.DataFormat.Range. Nominal.Value.SensorBuffer; // calculate the least channel number for (i = 0; i < 8; i++) { if (buf[0] & (1 << i)) { break; } } if (i == 8) { for (i = 0; i < 16; i++) { if (buf[1] & (1 << (i - 8))) { break; } } } if (i == 16) { err("No channels for link"); return SA_ERR_HPI_ERROR; } info.channel = (i + 1) | (buf[2] << 6); info.buffer = reading->Value.SensorBuffer; info.state = 0; info.done = 0; info.rv = SA_OK; rv = ipmi_mc_pointer_cb(res_info->u.entity.mc_id, get_ekeying_link_state_sensor_reading_cb, &info); if (rv != 0) { err("ipmi_mc_pointer_cb = 0x%x", rv); return SA_ERR_HPI_INVALID_CMD; } rv = ohoi_loop(&info.done, handler->data); if (rv != SA_OK) { err("ohoi_loop = 0x%x", rv); return rv; } if (info.rv != SA_OK) { err("info.rv = 0x%x", info.rv); return rv; } if (reading) { memcpy(reading->Value.SensorBuffer + 14, rdr->RdrTypeUnion.SensorRec.DataFormat.Range. Nominal.Value.SensorBuffer + 14, 16); reading->Type = SAHPI_SENSOR_READING_TYPE_BUFFER; reading->IsSupported = SAHPI_TRUE; } if (ev_state) { *ev_state = info.state; } return SA_OK; } void ohoi_create_ekeying_link_state_sensor( struct oh_handler_state *handler, ipmi_entity_t *entity, unsigned int s_num, unsigned char *guid, unsigned char link_grouping_id, unsigned char link_type, unsigned char link_type_extension, unsigned char interface_type, unsigned char *channels) { //printf("Create EKEYING sensor %d for %d. (%d,%d,%d,%d). chan: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n", s_num, ipmi_entity_get_device_address(entity), //link_grouping_id, link_type, link_type_extension, interface_type, //channels[0], channels[1], channels[2], channels[3], channels[4], channels[5], channels[6], channels[7], //channels[8], channels[9], channels[10], channels[11], channels[12], channels[13], channels[14], channels[15]); SaHpiRptEntryT *rpt; struct ohoi_resource_info *res_info; ipmi_entity_id_t entity_id = ipmi_entity_convert_to_id(entity); SaHpiRdrT *rdr; struct ohoi_sensor_info *s_info; SaHpiUint8T *buffer; rpt = ohoi_get_resource_by_entityid(handler->rptcache, &entity_id); if (rpt == NULL) { err("Couldn't find out resource by entity %d.%.d.%d.%d %s", ipmi_entity_get_entity_id(entity), ipmi_entity_get_entity_instance(entity), ipmi_entity_get_device_channel(entity), ipmi_entity_get_device_address(entity), ipmi_entity_get_entity_id_string(entity)); return; } res_info = oh_get_resource_data(handler->rptcache, rpt->ResourceId); if (res_info == NULL) { err("No res_info for resource id = %d", rpt->ResourceId); return; } rdr = malloc(sizeof (*rdr)); if (rdr == NULL) { err("Out of memory"); return; } s_info = malloc(sizeof (*s_info)); if (rdr == NULL) { err("Out of memory"); free(rdr); return; } memset(rdr, 0, sizeof (*rdr)); memset(s_info, 0, sizeof (*s_info)); rdr->RdrType = SAHPI_SENSOR_RDR; rdr->IsFru = SAHPI_FALSE; rdr->Entity = rpt->ResourceEntity; rdr->RdrTypeUnion.SensorRec.Num = OHOI_FIRST_EKEYING_SENSOR_NUM + s_num; rdr->RdrTypeUnion.SensorRec.Type = SAHPI_RESERVED1; rdr->RdrTypeUnion.SensorRec.Category = SAHPI_EC_ENABLE; rdr->RdrTypeUnion.SensorRec.EnableCtrl = SAHPI_FALSE; rdr->RdrTypeUnion.SensorRec.EventCtrl = SAHPI_SEC_PER_EVENT; rdr->RdrTypeUnion.SensorRec.Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED; rdr->RdrTypeUnion.SensorRec.ThresholdDefn.IsAccessible = SAHPI_FALSE; rdr->RdrTypeUnion.SensorRec.DataFormat.IsSupported = SAHPI_TRUE; rdr->RdrTypeUnion.SensorRec.DataFormat.ReadingType = SAHPI_SENSOR_READING_TYPE_BUFFER; rdr->RdrTypeUnion.SensorRec.DataFormat.BaseUnits = SAHPI_SU_UNSPECIFIED; rdr->RdrTypeUnion.SensorRec.DataFormat.ModifierUnits = SAHPI_SU_UNSPECIFIED; rdr->RdrTypeUnion.SensorRec.DataFormat.ModifierUse = SAHPI_SMUU_NONE; rdr->RdrTypeUnion.SensorRec.DataFormat.Percentage = SAHPI_FALSE; rdr->RdrTypeUnion.SensorRec.DataFormat.Range.Flags = SAHPI_SRF_NOMINAL; buffer = rdr->RdrTypeUnion.SensorRec.DataFormat.Range. Nominal.Value.SensorBuffer; int i, chn = 0, first_channel = 0; for (i = 0; i < 15; i++) { if (channels[i] == 0) { continue; } if (chn % 2) { buffer[6 + chn / 2] |= (channels[i] << 4); } else { buffer[6 + chn / 2] = channels[i] & 0x0f; } if (i >= 8) { buffer[1] |= 1 << (i - 8); } else { buffer[0] |= 1 << i; } chn++; if (first_channel == 0) { first_channel = i + 1; } } if (first_channel == 0) { err("No channels for sensor"); free(rdr); free(s_info); return; } buffer[2] = interface_type; buffer[3] = link_type; buffer[4] = link_type_extension; buffer[5] = link_grouping_id; if (guid) { memcpy(&buffer[14], guid, 16); } oh_init_textbuffer(&rdr->IdString); char name[256], *nm; nm = name; strncpy(name, "E-Keying Link State: ", 256); snprintf(name, 256, "E-Keying Link State: %d Intrface, Link Type %d," " Link Type Ext %d Channel %d", interface_type, link_type, link_type_extension, first_channel); oh_append_textbuffer(&rdr->IdString, name); s_info->support_assert = 0; s_info->support_deassert = 0; s_info->assert = 0; s_info->deassert = 0; s_info->sen_enabled = SAHPI_TRUE; s_info->enable = SAHPI_FALSE; s_info->info.atcamap_sensor_info.data = rpt; s_info->info.atcamap_sensor_info.val = rpt->ResourceId; // ((interface_type & 3) << 6) | (first_channel & 0x3f); s_info->type = OHOI_SENSOR_ATCA_MAPPED; s_info->ohoii.get_sensor_event_enable = get_ekeying_link_state_sensor_event_enable; s_info->ohoii.set_sensor_event_enable = NULL; s_info->ohoii.get_sensor_reading = get_ekeying_link_state_sensor_reading; s_info->ohoii.get_sensor_thresholds = NULL; s_info->ohoii.set_sensor_thresholds = NULL; if (oh_add_rdr(handler->rptcache, rpt->ResourceId, rdr, s_info, 1) != SA_OK) { err("could not add e-keying link state sensor to rpt id = %d", rpt->ResourceId); free(rdr); free(s_info); return; } rpt->ResourceCapabilities |= SAHPI_CAPABILITY_SENSOR | SAHPI_CAPABILITY_RDR; return; } /* * RPT iterator. It is called after all scannings done. * Create nessesary RDRs are not created yet */ static int ipmb0_state_control_rdr_iterator( struct oh_handler_state *handler, SaHpiRptEntryT *rpt, SaHpiRdrT *rdr, void *cb_data) { int *max = cb_data; int num; if (rdr->RdrType != SAHPI_SENSOR_RDR) { return 0; } num = (int)rdr->RdrTypeUnion.SensorRec.Num; if ((num < ATCAHPI_SENSOR_NUM_IPMB0) || (num > ATCAHPI_SENSOR_NUM_IPMB0 + 0x5F)) { // not IPMB-0 sensor return 0; } if (num > *max + ATCAHPI_SENSOR_NUM_IPMB0) { *max = num - ATCAHPI_SENSOR_NUM_IPMB0; } return 0; } /*--------------------- FRU Reset and Diagnostic Control --------------------*/ struct reset_ctrl_state_s { SaHpiInt32T state; }; static void _set_atca_reset_diagnostic_control_state_cb( ipmi_mc_t *mc, ipmi_msg_t *msg, void *rsp_data) { atca_common_info_t *info = rsp_data; int rv = msg->data[0]; if (mc == NULL) { info->rv = SA_ERR_HPI_ENTITY_NOT_PRESENT; info->done = 1; return; } if (rv == 0xc1) { info->rv = SA_ERR_HPI_INVALID_CMD; } else if (rv == 0xc3) { info->rv = SA_ERR_HPI_NO_RESPONSE; } else if (rv == 0xcc) { info->rv = SA_ERR_HPI_INVALID_REQUEST; } else if (rv != 0) { info->rv = SA_ERR_HPI_INVALID_PARAMS; } info->done = 1; return; }; static void set_atca_reset_diagnostic_control_state_cb(ipmi_mc_t *mc, void *cb_data) { atca_common_info_t *info = cb_data; struct reset_ctrl_state_s *ctrl_state = info->info; unsigned char data[25]; int rv; memset(data, 0, 25); data[0] = IPMI_PICMG_GRP_EXT; data[1] = info->devid; data[2] = ctrl_state->state; rv = ipmicmd_mc_send(mc, IPMI_GROUP_EXTENSION_NETFN, IPMI_PICMG_CMD_FRU_CONTROL, 0, data, 3, _set_atca_reset_diagnostic_control_state_cb, cb_data); if (rv != 0) { err("ipmicmd_send = 0x%x\n", rv); OHOI_MAP_ERROR(info->rv, rv); return; } return; } static SaErrorT set_atca_reset_diagnostic_control_state( struct oh_handler_state *hnd, struct ohoi_control_info *c_info, SaHpiRdrT *rdr, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state) { struct ohoi_handler *ipmi_handler = (struct ohoi_handler *) hnd->data; SaHpiRptEntryT *rpt; struct ohoi_resource_info *res_info, *slot_info; atca_common_info_t info; struct reset_ctrl_state_s ctrl_state; int rv; if (state == NULL) { return SA_ERR_HPI_INVALID_DATA; } if (state->Type != SAHPI_CTRL_TYPE_ANALOG) { return SA_ERR_HPI_INVALID_DATA; } rpt = oh_get_resource_by_id(hnd->rptcache, c_info->info.atcamap_ctrl_info.rid); if (rpt == NULL) { return SA_ERR_HPI_INTERNAL_ERROR; } res_info = oh_get_resource_data(hnd->rptcache, c_info->info.atcamap_ctrl_info.rid); if (res_info == NULL) { return SA_ERR_HPI_INTERNAL_ERROR; } slot_info = oh_get_resource_data(hnd->rptcache, ohoi_get_parent_id(rpt)); if (slot_info == NULL) { return SA_ERR_HPI_INTERNAL_ERROR; } info.done = 0; info.rv = SA_OK; info.addr = slot_info->u.slot.addr; info.devid = slot_info->u.slot.devid; ctrl_state.state = state->StateUnion.Analog + 1; info.info = &ctrl_state; rv = ipmi_mc_pointer_cb(res_info->u.entity.mc_id, set_atca_reset_diagnostic_control_state_cb, &info); if (rv != 0) { err("ipmi_domain_pointer_cb = 0x%x", rv); return SA_ERR_HPI_INTERNAL_ERROR; } rv = ohoi_loop(&info.done, ipmi_handler); if (rv != SA_OK) { err("ohoi_loop = 0x%x", rv); return SA_ERR_HPI_INTERNAL_ERROR; } return info.rv; } static SaHpiRdrT *atca_create_reset_diagnostic_control( struct oh_handler_state *handler, struct ohoi_control_info **c_info) { SaHpiRdrT *rdr; struct ohoi_control_info *l_c_info; rdr = malloc(sizeof (SaHpiRdrT)); if (rdr == NULL) { err("Out of memory"); return NULL; } l_c_info = malloc(sizeof (struct ohoi_control_info)); if (l_c_info == NULL) { err("Out of memory"); free(rdr); return NULL; } memset(rdr, 0, sizeof (SaHpiRdrT)); memset(l_c_info, 0, sizeof (struct ohoi_control_info)); rdr->RdrType = SAHPI_CTRL_RDR; rdr->IsFru = SAHPI_FALSE; rdr->RdrTypeUnion.CtrlRec.Num = ATCAHPI_CTRL_NUM_FRU_CONTROL; rdr->RdrTypeUnion.CtrlRec.OutputType = SAHPI_CTRL_GENERIC; rdr->RdrTypeUnion.CtrlRec.Type = SAHPI_CTRL_TYPE_ANALOG; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Analog.Min = 1; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Analog.Max = 2; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Analog.Default = 1; rdr->RdrTypeUnion.CtrlRec.DefaultMode.Mode = SAHPI_CTRL_MODE_MANUAL; rdr->RdrTypeUnion.CtrlRec.DefaultMode.ReadOnly = SAHPI_TRUE; rdr->RdrTypeUnion.CtrlRec.WriteOnly = SAHPI_TRUE; oh_init_textbuffer(&rdr->IdString); oh_append_textbuffer(&rdr->IdString, "FRU Reboot and Diagnostic Control"); l_c_info->ohoii.get_control_state = NULL; l_c_info->ohoii.set_control_state = set_atca_reset_diagnostic_control_state; l_c_info->mode = SAHPI_CTRL_MODE_MANUAL; l_c_info->type = OHOI_CTRL_ATCA_MAPPED; *c_info = l_c_info; return rdr; } /*------------------------- Desired Power Control ----------------------------*/ struct desired_pwr_ctrl_s { SaHpiInt32T des_pwr; }; static void _get_atca_desired_power_control_state_cb( ipmi_mc_t *mc, ipmi_msg_t *msg, void *rsp_data) { atca_common_info_t *info = rsp_data; int rv = msg->data[0]; struct desired_pwr_ctrl_s *des_pwr = (struct desired_pwr_ctrl_s *)info->info; if (mc == NULL) { info->rv = SA_ERR_HPI_ENTITY_NOT_PRESENT; info->done = 1; return; } if (rv == 0xc1) { info->rv = SA_ERR_HPI_INVALID_CMD; } else if (rv == 0xc3) { info->rv = SA_ERR_HPI_NO_RESPONSE; } else if (rv != 0) { info->rv = SA_ERR_HPI_INVALID_PARAMS; } else { des_pwr->des_pwr = (SaHpiFloat64T) (msg->data[msg->data_len - 1] * msg->data[4]); } info->done = 1; return; }; static void get_atca_desired_power_control_state_cb(ipmi_mc_t *mc, void *cb_data) { atca_common_info_t *info = cb_data; unsigned char data[25]; int rv; memset(data, 0, 25); data[0] = IPMI_PICMG_GRP_EXT; data[1] = info->devid; data[2] = 1; /* Desired steady state draw levels */ rv = ipmicmd_mc_send(mc, IPMI_GROUP_EXTENSION_NETFN, IPMI_PICMG_CMD_GET_POWER_LEVEL, 0, data, 3, _get_atca_desired_power_control_state_cb, cb_data); if (rv != 0) { err("ipmicmd_send = 0x%x\n", rv); OHOI_MAP_ERROR(info->rv, rv); return; } return; } static SaErrorT get_atca_desired_power_control_state( struct oh_handler_state *hnd, struct ohoi_control_info *c_info, SaHpiRdrT * rdr, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state) { struct ohoi_handler *ipmi_handler = (struct ohoi_handler *) hnd->data; SaHpiRptEntryT *rpt; struct ohoi_resource_info *res_info, *slot_info; atca_common_info_t info; struct desired_pwr_ctrl_s des_pwr; int rv; rpt = oh_get_resource_by_id(hnd->rptcache, c_info->info.atcamap_ctrl_info.rid); if (rpt == NULL) { return SA_ERR_HPI_INTERNAL_ERROR; } res_info = oh_get_resource_data(hnd->rptcache, c_info->info.atcamap_ctrl_info.rid); if (res_info == NULL) { return SA_ERR_HPI_INTERNAL_ERROR; } slot_info = oh_get_resource_data(hnd->rptcache, ohoi_get_parent_id(rpt)); if (slot_info == NULL) { return SA_ERR_HPI_INTERNAL_ERROR; } info.done = 0; info.rv = 0; info.addr = slot_info->u.slot.addr; info.devid = slot_info->u.slot.devid; info.info = &des_pwr; rv = ipmi_mc_pointer_cb(res_info->u.entity.mc_id, get_atca_desired_power_control_state_cb, &info); if (rv != 0) { err("ipmi_domain_pointer_cb = 0x%x", rv); return SA_ERR_HPI_INTERNAL_ERROR; } rv = ohoi_loop(&info.done, ipmi_handler); if (rv != SA_OK) { err("ohoi_loop = 0x%x", rv); return SA_ERR_HPI_INTERNAL_ERROR; } if (info.rv != SA_OK) { err("info.rv = 0x%x\n", info.rv); return info.rv; } if (mode) { *mode = c_info->mode = SAHPI_CTRL_MODE_AUTO; } if (state == NULL) { return SA_OK; } state->Type = SAHPI_CTRL_TYPE_ANALOG; state->StateUnion.Analog = des_pwr.des_pwr; return SA_OK; } static SaErrorT set_atca_desired_power_control_state( struct oh_handler_state *hnd, struct ohoi_control_info *c_info, SaHpiRdrT *rdr, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state) { return SA_ERR_HPI_READ_ONLY; } static SaHpiRdrT *atca_create_desired_pwr_control( struct oh_handler_state *handler, struct ohoi_control_info **c_info) { SaHpiRdrT *rdr; struct ohoi_control_info *l_c_info; rdr = malloc(sizeof (SaHpiRdrT)); if (rdr == NULL) { err("Out of memory"); return NULL; } l_c_info = malloc(sizeof (struct ohoi_control_info)); if (l_c_info == NULL) { err("Out of memory"); free(rdr); return NULL; } memset(rdr, 0, sizeof (SaHpiRdrT)); memset(l_c_info, 0, sizeof (struct ohoi_control_info)); rdr->RdrType = SAHPI_CTRL_RDR; rdr->IsFru = SAHPI_FALSE; rdr->RdrTypeUnion.CtrlRec.Num = ATCAHPI_CTRL_NUM_DESIRED_PWR; rdr->RdrTypeUnion.CtrlRec.OutputType = SAHPI_CTRL_GENERIC; rdr->RdrTypeUnion.CtrlRec.Type = SAHPI_CTRL_TYPE_ANALOG; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Analog.Min = 0; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Analog.Max = 400; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Analog.Default = 0; rdr->RdrTypeUnion.CtrlRec.DefaultMode.Mode = SAHPI_CTRL_MODE_AUTO; rdr->RdrTypeUnion.CtrlRec.DefaultMode.ReadOnly = SAHPI_TRUE; rdr->RdrTypeUnion.CtrlRec.WriteOnly = SAHPI_FALSE; oh_init_textbuffer(&rdr->IdString); oh_append_textbuffer(&rdr->IdString, "FRU Desired Power"); l_c_info->ohoii.get_control_state = get_atca_desired_power_control_state; l_c_info->ohoii.set_control_state = set_atca_desired_power_control_state; l_c_info->mode = SAHPI_CTRL_MODE_AUTO; l_c_info->type = OHOI_CTRL_ATCA_MAPPED; *c_info = l_c_info; return rdr; } /*---------------------------------------------------------------------------*/ static int fru_rdrs_rpt_iterator( struct oh_handler_state *handler, SaHpiRptEntryT *rpt, struct ohoi_resource_info *res_info, void *cb_data) { int max = -1; SaHpiRdrT *rdr; struct ohoi_control_info *ctrl_info; if (!(res_info->type & OHOI_RESOURCE_MC) || (res_info->type & OHOI_MC_RESET_CONTROL_CREATED)) { goto no_reset_control; } // Create FRU Management Controller Reset Control rdr = create_fru_mc_reset_control(handler->data, rpt, &ctrl_info); if (rdr != NULL && (oh_add_rdr(handler->rptcache, rpt->ResourceId, rdr, ctrl_info, 1) != SA_OK)) { err("couldn't add control rdr"); free(rdr); free(ctrl_info); } else { rpt->ResourceCapabilities |= SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_RDR; res_info->type |= OHOI_MC_RESET_CONTROL_CREATED; } no_reset_control: if (res_info->type & OHOI_MC_IPMB0_CONTROL_CREATED) { goto no_ipmb0_controls; } // calculate the number of IPMB links ohoi_iterate_rpt_rdrs(handler, rpt, ipmb0_state_control_rdr_iterator, &max); if (max < 0) { err("No ipmb0 sensors for resource %d", rpt->ResourceId); res_info->type |= OHOI_MC_IPMB0_CONTROL_CREATED; goto no_ipmb0_controls; } rdr = create_ipmb0_state_control(handler->data, rpt, &ctrl_info, 1, max); if (rdr != NULL && (oh_add_rdr(handler->rptcache, rpt->ResourceId, rdr, ctrl_info, 1) != SA_OK)) { err("couldn't add control rdr"); free(rdr); free(ctrl_info); } else { rpt->ResourceCapabilities |= SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_RDR; } rdr = create_ipmb0_state_control(handler->data, rpt, &ctrl_info, 0, max); if (rdr != NULL && (oh_add_rdr(handler->rptcache, rpt->ResourceId, rdr, ctrl_info, 1) != SA_OK)) { err("couldn't add control rdr"); free(rdr); free(ctrl_info); } else { rpt->ResourceCapabilities |= SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_RDR; res_info->type |= OHOI_MC_RESET_CONTROL_CREATED; } no_ipmb0_controls: if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP)) { goto no_fru_control; } rdr = atca_create_desired_pwr_control(handler, &ctrl_info); if (rdr) { if (oh_add_rdr(handler->rptcache, rpt->ResourceId, rdr, ctrl_info, 1) != SA_OK) { err("couldn't add control rdr"); free(rdr); free(ctrl_info); } else { rpt->ResourceCapabilities |= SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_RDR; ctrl_info->info.atcamap_ctrl_info.rid = rpt->ResourceId; } } rdr = atca_create_reset_diagnostic_control(handler, &ctrl_info); if (rdr) { if (oh_add_rdr(handler->rptcache, rpt->ResourceId, rdr, ctrl_info, 1) != SA_OK) { err("couldn't add control rdr"); free(rdr); free(ctrl_info); } else { rpt->ResourceCapabilities |= SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_RDR; ctrl_info->info.atcamap_ctrl_info.rid = rpt->ResourceId; } } no_fru_control: return 0; } void ohoi_atca_create_fru_rdrs(struct oh_handler_state *handler) { ohoi_iterate_rptcache(handler, fru_rdrs_rpt_iterator, NULL); } void ohoi_atca_delete_fru_rdrs(struct oh_handler_state *handler, ipmi_mcid_t mcid) { SaHpiRptEntryT *rpt; struct ohoi_resource_info *res_info; SaHpiRdrT *rdr; SaHpiSensorNumT num; rpt = ohoi_get_resource_by_mcid(handler->rptcache, &mcid); if (rpt == NULL) { err("Can't delete mc rdrs. rpt == NULL"); return; } res_info = oh_get_resource_data(handler->rptcache, rpt->ResourceId); if (res_info == NULL) { err("res_info == NULL"); return; } // Delete FRU Management Controller Reset Control if (!(res_info->type & OHOI_MC_RESET_CONTROL_CREATED)) { goto no_reset_control; } rdr = oh_get_rdr_by_type(handler->rptcache, rpt->ResourceId, SAHPI_CTRL_RDR, ATCAHPI_CTRL_NUM_FRU_IPMC_RESET); if (rdr) { oh_remove_rdr(handler->rptcache, rpt->ResourceId, rdr->RecordId); } else { err("No rdr for FRU Management Controller Reset Control"); } res_info ->type &= ~OHOI_MC_RESET_CONTROL_CREATED; no_reset_control: if (!(res_info->type & OHOI_MC_IPMB0_CONTROL_CREATED)) { goto no_ipmb0_controls; } rdr = oh_get_rdr_by_type(handler->rptcache, rpt->ResourceId, SAHPI_CTRL_RDR, ATCAHPI_CTRL_NUM_IPMB_A_STATE); if (rdr) { oh_remove_rdr(handler->rptcache, rpt->ResourceId, rdr->RecordId); } else { err("No rdr for ATCAHPI_CTRL_NUM_IPMB_A_STATE"); } rdr = oh_get_rdr_by_type(handler->rptcache, rpt->ResourceId, SAHPI_CTRL_RDR, ATCAHPI_CTRL_NUM_IPMB_B_STATE); if (rdr) { oh_remove_rdr(handler->rptcache, rpt->ResourceId, rdr->RecordId); } else { err("No rdr for ATCAHPI_CTRL_NUM_IPMB_B_STATE"); } for (num = ATCAHPI_SENSOR_NUM_IPMB0; num < ATCAHPI_SENSOR_NUM_IPMB0 + 0x5F; num++) { rdr = oh_get_rdr_by_type(handler->rptcache, rpt->ResourceId, SAHPI_SENSOR_RDR, num); if (rdr) { oh_remove_rdr(handler->rptcache, rpt->ResourceId, rdr->RecordId); } } res_info ->type &= ~OHOI_MC_IPMB0_CONTROL_CREATED; no_ipmb0_controls: if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP)) { goto no_fru_control; } rdr = oh_get_rdr_by_type(handler->rptcache, rpt->ResourceId, SAHPI_CTRL_RDR, ATCAHPI_CTRL_NUM_DESIRED_PWR); if (rdr) { oh_remove_rdr(handler->rptcache, rpt->ResourceId, rdr->RecordId); } else { err("No rdr for ATCAHPI_CTRL_NUM_DESIRED_PWR"); } rdr = oh_get_rdr_by_type(handler->rptcache, rpt->ResourceId, SAHPI_CTRL_RDR, ATCAHPI_CTRL_NUM_FRU_CONTROL); if (rdr) { oh_remove_rdr(handler->rptcache, rpt->ResourceId, rdr->RecordId); } else { err("No rdr for ATCAHPI_CTRL_NUM_FRU_CONTROL"); } no_fru_control: if (!ohoi_rpt_has_sensors(handler, rpt->ResourceId)) { rpt->ResourceCapabilities &= ~SAHPI_CAPABILITY_SENSOR; } if (!ohoi_rpt_has_controls(handler, rpt->ResourceId)) { rpt->ResourceCapabilities &= ~SAHPI_CAPABILITY_CONTROL; } if ((oh_get_rdr_next(handler->rptcache, rpt->ResourceId, SAHPI_FIRST_ENTRY) == NULL) && (res_info->fru == NULL)) { // no more rdrs for rpt rpt->ResourceCapabilities &= ~SAHPI_CAPABILITY_RDR; } entity_rpt_set_updated(res_info, handler->data); } openhpi-3.6.1/plugins/ipmi/ipmi.h0000644000175100017510000006477112575647300015731 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Louis Zhuang * Kevin Gao * Rusty Lynch * Racing Guo */ #ifndef _INC_IPMI_H_ #define _INC_IPMI_H_ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define IPMI_DATA_WAIT 10 #define OEM_ALARM_BASE 0x10 #define IPMI_EVENT_DATA_MAX_LEN 13 #define MAX_ES_STATE 15 /* max number of possible event state - 1 */ typedef struct ohoi_atca_pwonseq_dsk_s { unsigned char body[5]; SaHpiResourceIdT slotid; } ohoi_atca_pwonseq_dsk_t; typedef struct ohoi_atca_pwonseq_rec_s { unsigned char head[7]; unsigned char updated; unsigned int rec_num; } ohoi_atca_pwonseq_rec_t; struct ohoi_handler { GStaticRecMutex ohoih_lock; int SDRs_read_done; int bus_scan_done; int SELs_read_done; int mc_count; /* to keep track of num of mcs to wait on sdrs */ int sel_clear_done; /* we need to wait for mc_sel_reread for clear to succeed */ int FRU_done; /* we have to track FRUs */ ipmi_domain_id_t domain_id; /* OpenIPMI connection and os_handler */ os_handler_t *os_hnd; ipmi_con_t *cons[2]; unsigned int num_cons; selector_t *ohoi_sel; char *entity_root; int connected; int islan; int fully_up; time_t fullup_timeout; int updated; unsigned int openipmi_scan_time; int real_write_fru; SaHpiDomainIdT did; enum ipmi_domain_type d_type; char domain_name[24]; /* ATCA part */ int shmc_num; int shmc_present_num; ipmi_mcid_t virt_mcid; SaHpiResourceIdT atca_shelf_id; SaHpiResourceIdT atca_vshm_id; int shelf_fru_corrupted; int atca_pwonseq_updated; GSList *atca_pwonseq_recs; GSList *atca_pwonseq_desk; }; #define IS_ATCA(type) ((type) == IPMI_DOMAIN_TYPE_ATCA) struct ohoi_inventory_info; typedef struct ohoi_slotid_s { unsigned char addr; unsigned char devid; ipmi_entity_id_t entity_id; } ohoi_slotid_t; typedef struct ohoi_entity_s { ipmi_mcid_t mc_id; ipmi_entity_id_t entity_id; } ohoi_entity_t;; #define OHOI_RESOURCE_ENTITY 0x01 #define OHOI_RESOURCE_SLOT 0x02 #define OHOI_RESOURCE_MC 0x04 #define OHOI_FAN_CONTROL_CREATED 0x10 #define OHOI_MC_RESET_CONTROL_CREATED 0x20 #define OHOI_MC_IPMB0_CONTROL_CREATED 0x40 struct ohoi_resource_info { unsigned char presence; /* entity presence from OpenIPMI to determine to push RPT to domain RPTable or not */ unsigned char updated; /* refcount of resource add/update from rptcache to domain RPT */ unsigned char deleted; /* entity must be deleled after event of removing RPT has been sent to domain */ unsigned char hs_mark; /* to handle properly M3->M6->M1 ATCA transition */ SaHpiTimeoutT hs_inspen_time; /* time of last insertion pending state */ SaHpiUint8T sensor_count; SaHpiUint8T ctrl_count; unsigned int type; union { ohoi_entity_t entity; ohoi_slotid_t slot; } u; int max_ipmb0_link; ipmi_control_id_t reset_ctrl; ipmi_control_id_t power_ctrl; SaHpiCtrlNumT hotswapind; struct ohoi_inventory_info *fru; }; typedef struct atca_common_info { int done; SaErrorT rv; unsigned char data[255]; unsigned int len; unsigned char addr; unsigned char devid; void *info; } atca_common_info_t; /* Sensor info */ #define OHOI_THS_LMINH 0x0001 #define OHOI_THS_LMINL 0x0002 #define OHOI_THS_LMAJH 0x0004 #define OHOI_THS_LMAJL 0x0008 #define OHOI_THS_LCRTH 0x0010 #define OHOI_THS_LCRTL 0x0020 #define OHOI_THS_UMINH 0x0040 #define OHOI_THS_UMINL 0x0080 #define OHOI_THS_UMAJH 0x0100 #define OHOI_THS_UMAJL 0x0200 #define OHOI_THS_UCRTH 0x0400 #define OHOI_THS_UCRTL 0x0800 typedef enum { OHOI_SENSOR_ORIGINAL = 1, OHOI_SENSOR_ATCA_MAPPED } ohoi_sensor_type_t; typedef struct ohoi_original_sensor_info { ipmi_sensor_id_t sensor_id; } ohoi_original_sensor_info_t; typedef struct ohoi_atcamap_sensor_info { void *data; int val; SaHpiResourceIdT rid; } ohoi_atcamap_sensor_info_t; typedef union { ohoi_original_sensor_info_t orig_sensor_info; ohoi_atcamap_sensor_info_t atcamap_sensor_info; } ohoi_sensor_info_union_t; struct ohoi_sensor_info; typedef struct ohoi_sensor_interfaces { SaErrorT (*get_sensor_event_enable)(struct oh_handler_state *hnd, struct ohoi_sensor_info *sinfo, SaHpiBoolT *enable, SaHpiEventStateT *assert, SaHpiEventStateT *deassert); SaErrorT (*set_sensor_event_enable)(struct oh_handler_state *hnd, struct ohoi_sensor_info *sinfo, SaHpiBoolT enable, SaHpiEventStateT assert, SaHpiEventStateT deassert, unsigned int a_supported, unsigned int d_supported); SaErrorT (*get_sensor_reading)(struct oh_handler_state *hnd, struct ohoi_sensor_info *sensor_info, SaHpiSensorReadingT *reading, SaHpiEventStateT *ev_state); SaErrorT (*get_sensor_thresholds)(struct oh_handler_state *hnd, struct ohoi_sensor_info *sinfo, SaHpiSensorThresholdsT *thres); SaErrorT (*set_sensor_thresholds)(struct oh_handler_state *hnd, struct ohoi_sensor_info *sinfo, const SaHpiSensorThresholdsT *thres); } ohoi_sensor_interfaces_t; struct ohoi_sensor_info { ohoi_sensor_type_t type; ohoi_sensor_info_union_t info; int sen_enabled; SaHpiBoolT enable; SaHpiEventStateT assert; SaHpiEventStateT deassert; unsigned int support_assert; unsigned int support_deassert; ohoi_sensor_interfaces_t ohoii; }; /* Control info*/ typedef enum { OHOI_CTRL_ORIGINAL = 1, OHOI_CTRL_ATCA_MAPPED } ohoi_control_type_t; typedef struct ohoi_original_ctrl_info { ipmi_control_id_t ctrl_id; } ohoi_original_ctrl_info_t; typedef struct ohoi_atcamap_ctrl_info { void *data; int val; SaHpiResourceIdT rid; } ohoi_atcamap_ctrl_info_t; typedef union { ohoi_original_ctrl_info_t orig_ctrl_info; ohoi_atcamap_ctrl_info_t atcamap_ctrl_info; } ohoi_control_info_union_t; struct ohoi_control_info; typedef struct ohoi_ctrl_interfaces { SaErrorT (*get_control_state)(struct oh_handler_state *hnd, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state); SaErrorT (*set_control_state)(struct oh_handler_state *hnd, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state); } ohoi_ctrl_interfaces_t; struct ohoi_control_info { ohoi_control_type_t type; ohoi_control_info_union_t info; SaHpiCtrlModeT mode; ohoi_ctrl_interfaces_t ohoii; }; /* Inventory info*/ struct ohoi_inventory_info { SaHpiUint32T update_count; // zero if area doesn't exist. If area exists // lang for board and product info, 1 for the rest unsigned char iu, ci, bi, pi, oem; unsigned int ci_fld_msk; unsigned int ci_custom_num; unsigned int bi_fld_msk; unsigned int bi_custom_num; unsigned int pi_fld_msk; unsigned int pi_custom_num; unsigned int oem_fields_num; GSList *oem_areas; GMutex *mutex; }; #define OHOI_AREA_EMPTY_ID 0 #define OHOI_AREA_FIRST_ID 1 #define OHOI_INTERNAL_USE_AREA_ID 1 #define OHOI_CHASSIS_INFO_AREA_ID 2 #define OHOI_BOARD_INFO_AREA_ID 3 #define OHOI_PRODUCT_INFO_AREA_ID 4 #define FIRST_OEM_AREA_NUM 5 #define OHOI_FIELD_EMPTY_ID 0 #define OHOI_FIELD_FIRST_ID 1 SaHpiTextTypeT convert_to_hpi_data_type(enum ipmi_str_type_e type); /* implemented in ipmi_event.c */ void ohoi_setup_done(ipmi_domain_t *domain, void *user_data); /* implemented in ipmi_close.c */ void ohoi_close_connection(ipmi_domain_id_t domain_id, void *user_data); /* implemented in ipmi_sensor.c */ SaErrorT orig_get_sensor_reading(struct oh_handler_state *handler, struct ohoi_sensor_info *sinfo, SaHpiSensorReadingT * reading, SaHpiEventStateT * ev_state); SaErrorT ohoi_get_sensor_reading(void *hnd, struct ohoi_sensor_info *sinfo, SaHpiSensorReadingT * reading, SaHpiEventStateT * ev_state); SaErrorT orig_get_sensor_thresholds(struct oh_handler_state *handler, struct ohoi_sensor_info *sinfo, SaHpiSensorThresholdsT *thres); SaErrorT ohoi_get_sensor_thresholds(void *hnd, struct ohoi_sensor_info *sinfo, SaHpiSensorThresholdsT *thres); SaErrorT orig_set_sensor_thresholds(struct oh_handler_state *handler, struct ohoi_sensor_info *sinfo, const SaHpiSensorThresholdsT *thres); SaErrorT ohoi_set_sensor_thresholds(void *hnd, struct ohoi_sensor_info *sinfo, const SaHpiSensorThresholdsT *thres); int ohoi_set_sensor_enable(ipmi_sensor_id_t sensor_id, SaHpiBoolT enable, void *cb_data); SaErrorT orig_get_sensor_event_enable(struct oh_handler_state *handler, struct ohoi_sensor_info *sinfo, SaHpiBoolT *enable, SaHpiEventStateT *assert, SaHpiEventStateT *deassert); SaErrorT ohoi_get_sensor_event_enable(void *hnd, struct ohoi_sensor_info *sinfo, SaHpiBoolT *enable, SaHpiEventStateT *assert, SaHpiEventStateT *deassert); SaErrorT orig_set_sensor_event_enable(struct oh_handler_state *handler, struct ohoi_sensor_info *sinfo, SaHpiBoolT enable, SaHpiEventStateT assert, SaHpiEventStateT deassert, unsigned int a_supported, unsigned int d_supported); SaErrorT ohoi_set_sensor_event_enable(void *hnd, struct ohoi_sensor_info *sinfo, SaHpiBoolT enable, SaHpiEventStateT assert, SaHpiEventStateT deassert, unsigned int a_supported, unsigned int d_supported); void ohoi_get_sel_time(ipmi_mcid_t mc_id, SaHpiTimeT *time, void *cb_data); void ohoi_set_sel_time(ipmi_mcid_t mc_id, const struct timeval *time, void *cb_data); void ohoi_get_sel_updatetime(ipmi_mcid_t mc_id, SaHpiTimeT *time); void ohoi_get_sel_size(ipmi_mcid_t mc_id, int *size); void ohoi_get_sel_count(ipmi_mcid_t mc_id, int *count); void ohoi_get_sel_overflow(ipmi_mcid_t mc_id, char *overflow); void ohoi_get_sel_support_del(ipmi_mcid_t mc_id, char *support_del); SaErrorT ohoi_clear_sel(ipmi_mcid_t mc_id, void *cb_data); SaErrorT ohoi_set_sel_state(struct ohoi_handler *ipmi_handler, ipmi_mcid_t mc_id, int enable); SaErrorT ohoi_get_sel_state(struct ohoi_handler *ipmi_handler, ipmi_mcid_t mc_id, int *enable); void ohoi_get_sel_first_entry(ipmi_mcid_t mc_id, ipmi_event_t **event); void ohoi_get_sel_last_entry(ipmi_mcid_t mc_id, ipmi_event_t **event); void ohoi_get_sel_next_recid(ipmi_mcid_t mc_id, ipmi_event_t *event, unsigned int *record_id); void ohoi_get_sel_prev_recid(ipmi_mcid_t mc_id, ipmi_event_t *event, unsigned int *record_id); void ohoi_get_sel_by_recid(ipmi_mcid_t mc_id, SaHpiEventLogEntryIdT entry_id, ipmi_event_t **event); /* This is used to help plug-in to find resource in rptcache by entity_id and mc_id*/ SaHpiResourceIdT ohoi_get_parent_id(SaHpiRptEntryT *child); SaHpiRptEntryT *ohoi_get_resource_by_entityid(RPTable *table, const ipmi_entity_id_t *entity_id); SaHpiRptEntryT *ohoi_get_resource_by_mcid(RPTable *table, const ipmi_mcid_t *mc_id); /* This is used to help plug-in to find rdr in rptcache by data*/ SaHpiRdrT *ohoi_get_rdr_by_data(RPTable *table, SaHpiResourceIdT rid, SaHpiRdrTypeT type, void *data); /* This is used for OpenIPMI to notice sensor change */ void ohoi_sensor_event(enum ipmi_update_e op, ipmi_entity_t *ent, ipmi_sensor_t *sensor, void *cb_data); /* * This is used to help saHpiEventLogEntryGet() * to convert sensor ipmi event to hpi event */ int ohoi_sensor_ipmi_event_to_hpi_event( struct ohoi_handler *ipmi_handler, ipmi_sensor_id_t sid, ipmi_event_t *event, struct oh_event **e, ipmi_entity_id_t *eid); /* This is used for OpenIPMI to notice control change */ void ohoi_control_event(enum ipmi_update_e op, ipmi_entity_t *ent, ipmi_control_t *control, void *cb_data); /* This is used for OpenIPMI to notice mc change */ void ohoi_mc_event(enum ipmi_update_e op, ipmi_domain_t *domain, ipmi_mc_t *mc, void *cb_data); /* This is used for OpenIPMI to noice inventroy change */ void ohoi_inventory_event(enum ipmi_update_e op, ipmi_entity_t *entity, void *cb_data); /* This is used for OpenIPMI to notice entity change */ void ohoi_entity_event(enum ipmi_update_e op, ipmi_domain_t *domain, ipmi_entity_t *entity, void *cb_data); int ohoi_loop(int *done_flag, struct ohoi_handler *ipmi_handler); typedef int (*loop_indicator_cb)(const void *cb_data); int ohoi_loop_until(loop_indicator_cb indicator, const void *cb_data, int timeout, struct ohoi_handler *ipmi_handler); SaErrorT ohoi_get_rdr_data(const struct oh_handler_state *handler, SaHpiResourceIdT id, SaHpiRdrTypeT type, SaHpiSensorNumT num, void **pdata); int ohoi_delete_orig_sensor_rdr(struct oh_handler_state *handler, SaHpiRptEntryT *rpt, ipmi_sensor_id_t *mysid); int ohoi_delete_orig_control_rdr(struct oh_handler_state *handler, SaHpiRptEntryT *rpt, ipmi_control_id_t *mycid); typedef int (*rpt_loop_handler_cb)( struct oh_handler_state *handler, SaHpiRptEntryT *rpt, struct ohoi_resource_info *res_info, void *cb_data); void ohoi_iterate_rptcache(struct oh_handler_state *handler, rpt_loop_handler_cb func, void *cb_data); typedef int (*rdr_loop_handler_cb)( struct oh_handler_state *handler, SaHpiRptEntryT *rpt, SaHpiRdrT *rdr, void *cb_data); void ohoi_iterate_rpt_rdrs(struct oh_handler_state *handler, SaHpiRptEntryT *rpt, rdr_loop_handler_cb func, void *cb_data); int ohoi_rpt_has_controls(struct oh_handler_state *handler, SaHpiResourceIdT rid); int ohoi_rpt_has_sensors(struct oh_handler_state *handler, SaHpiResourceIdT rid); SaErrorT ohoi_get_idr_info(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrInfoT *idrinfo); SaErrorT ohoi_get_idr_area_header(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrAreaTypeT areatype, SaHpiEntryIdT areaid, SaHpiEntryIdT *nextareaid, SaHpiIdrAreaHeaderT *header); SaErrorT ohoi_add_idr_area(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrAreaTypeT areatype, SaHpiEntryIdT *areaid); SaErrorT ohoi_del_idr_area(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiEntryIdT areaid); SaErrorT ohoi_get_idr_field(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiEntryIdT areaid, SaHpiIdrFieldTypeT fieldtype, SaHpiEntryIdT fieldid, SaHpiEntryIdT *nextfieldid, SaHpiIdrFieldT *field); SaErrorT ohoi_add_idr_field(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrFieldT *field ); SaErrorT ohoi_set_idr_field(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrFieldT *field ); SaErrorT ohoi_del_idr_field(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiEntryIdT areaid, SaHpiEntryIdT fieldid); void ohoi_delete_rpt_fru(struct ohoi_resource_info *res_info); int ohoi_hot_swap_cb(ipmi_entity_t *ent, enum ipmi_hot_swap_states last_state, enum ipmi_hot_swap_states curr_state, void *cb_data, ipmi_event_t *event); SaErrorT ohoi_get_hotswap_state(void *hnd, SaHpiResourceIdT id, SaHpiHsStateT *state); SaErrorT ohoi_set_hotswap_state(void *hnd, SaHpiResourceIdT id, SaHpiHsStateT state); SaErrorT ohoi_request_hotswap_action(void *hnd, SaHpiResourceIdT id, SaHpiHsActionT act); SaErrorT ohoi_get_indicator_state(void *hnd, SaHpiResourceIdT id, SaHpiHsIndicatorStateT *state); SaErrorT ohoi_hotswap_policy_cancel(void *hnd, SaHpiResourceIdT rid, SaHpiTimeoutT ins_timeout); SaErrorT ohoi_set_indicator_state(void *hnd, SaHpiResourceIdT id, SaHpiHsIndicatorStateT state); SaErrorT ohoi_set_power_state(void *hnd, SaHpiResourceIdT id, SaHpiPowerStateT state); SaErrorT ohoi_get_power_state(void *hnd, SaHpiResourceIdT id, SaHpiPowerStateT *state); SaErrorT ohoi_set_reset_state(void *hnd, SaHpiResourceIdT id, SaHpiResetActionT act); SaErrorT ohoi_get_reset_state(void *hnd, SaHpiResourceIdT id, SaHpiResetActionT *act); SaErrorT orig_get_control_state(struct oh_handler_state *handler, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state); SaErrorT orig_set_control_state(struct oh_handler_state *handler, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state); SaErrorT ohoi_get_control_state(void *hnd, SaHpiResourceIdT id, SaHpiCtrlNumT num, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state); SaErrorT ohoi_set_control_state(void *hnd, SaHpiResourceIdT id, SaHpiCtrlNumT num, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state); void ipmi_connection_handler(ipmi_domain_t *domain, int err, unsigned int conn_num, unsigned int port_num, int still_connected, void *cb_data); struct ohoi_fru_write_s { SaErrorT rv; int done; }; SaErrorT ohoi_fru_write(struct ohoi_handler *ipmi_handler, ipmi_entity_id_t entid); /* ATCA-HPI mapping functions */ void ohoi_atca_create_fru_rdrs(struct oh_handler_state *handler); void ohoi_atca_delete_fru_rdrs(struct oh_handler_state *handler, ipmi_mcid_t mcid); SaHpiUint8T ohoi_atca_led_to_hpi_color(int ipmi_color); int ohoi_atca_led_to_ipmi_color(SaHpiUint8T c); void adjust_sensor_to_atcahpi_spec(struct oh_handler_state *handler, SaHpiRptEntryT *rpt, SaHpiRdrT *rdr, struct ohoi_sensor_info *sensor_info, ipmi_sensor_t *sensor); void ohoi_atca_create_shelf_virtual_rdrs(struct oh_handler_state *hnd); void create_atca_virt_shmgr_rdrs(struct oh_handler_state *hnd); void ohoi_send_vshmgr_redundancy_sensor_event( struct oh_handler_state *handler, int become_present); /* ATCA Fan Control */ void ohoi_create_fan_control(struct oh_handler_state *handler, SaHpiResourceIdT rid); /* ATCA IPMB-0 Control */ void ohoi_create_ipmb0_controls(struct oh_handler_state *handler, ipmi_entity_t *entity, unsigned int max_link); /* ATCA FRU MC Reset Control */ void ohoi_create_fru_mc_reset_control(struct oh_handler_state *handler, SaHpiResourceIdT rid); /* ATCA Ekeying Link State Sensor */ #define OHOI_FIRST_EKEYING_SENSOR_NUM 0x400 void ohoi_create_ekeying_link_state_sensor( struct oh_handler_state *handler, ipmi_entity_t *entity, unsigned int s_num, unsigned char *guid, unsigned char link_grouping_id, unsigned char link_type, unsigned char link_type_extension, unsigned char interface_type, unsigned char *channels); /* ATCA inventory functions */ unsigned int ohoi_create_atca_oem_idr_areas( struct oh_handler_state *handler, ipmi_entity_t *entity, struct ohoi_resource_info *res_info, struct ohoi_inventory_info *i_info, unsigned int r_num); SaHpiUint32T ohoi_atca_oem_area_fields_num(struct ohoi_inventory_info *fru, SaHpiEntryIdT areaid); SaErrorT ohoi_atca_oem_area_field(struct oh_handler_state *handler, struct ohoi_resource_info *ohoi_res_info, SaHpiEntryIdT *nextfieldid, SaHpiIdrFieldT *field); /* ATCA slot state specific functions */ void atca_slot_state_sensor_event_send(struct oh_handler_state *handler, SaHpiRptEntryT *dev_entry, int present); void atca_create_slot_rdrs(struct oh_handler_state *handler, SaHpiResourceIdT rid); /* misc macros for debug */ #define dump_entity_id(s, x) \ do { \ err("%s domain id: %p, entity id: %x, entity instance: %x, channel: %x, address: %x, seq: %lx", \ s, \ (x).domain_id.domain, \ (x).entity_id, \ (x).entity_instance, \ (x).channel, \ (x).address, \ (x).seq); \ } while(0) /* dump rpttable to make debug easy if you don't like it, feel free to delete it. IMO, it is a good idea to place dump_rpttable in rpt_utils.c */ static inline void dump_rpttable(RPTable *table) { SaHpiRptEntryT *rpt; rpt = oh_get_resource_next(table, SAHPI_FIRST_ENTRY); printf("\n"); while (rpt) { printf("Resource Id:%d", rpt->ResourceId); struct ohoi_resource_info *res_info = oh_get_resource_data(table, rpt->ResourceId); if (res_info->type & OHOI_RESOURCE_ENTITY) { ipmi_entity_id_t e = res_info->u.entity.entity_id; printf("; entity id: %x, entity instance: %x, channel: %x, address: %x, seq: %lx", e.entity_id, e.entity_instance, e.channel, e.address, e.seq); } printf("\n"); #if 0 SaHpiRdrT *rdr; rdr = oh_get_rdr_next(table, rpt->ResourceId, SAHPI_FIRST_ENTRY); while (rdr) { unsigned char *data; int i; data = oh_get_rdr_data(table, rpt->ResourceId, rdr->RecordId); /*FIXME:: causes issue on IA64 */ /* commenting out for now until fixed */ //printf("(Rdr id:%d type:%d) data pointer:%u\n", //rdr->RecordId, //rdr->RdrType, //(unsigned)(void *)data); //if (data) // for (i = 0; i < 30; i++) // printf("%u ", data[i]); //printf("\n"); rdr = oh_get_rdr_next(table, rpt->ResourceId, rdr->RecordId); } // printf("\n"); #endif rpt = oh_get_resource_next(table, rpt->ResourceId); } } #endif /* called when a resource is removed (swapped?) */ int entity_presence(ipmi_entity_t *entity, int present, void *cb_data, ipmi_event_t *event); int ipmi_discover_resources(void *hnd); void entity_rpt_set_updated(struct ohoi_resource_info *res_info, struct ohoi_handler *hnd); void entity_rpt_set_presence(struct ohoi_resource_info *res_info, struct ohoi_handler *hnd, int presence); void ohoi_remove_entity(struct oh_handler_state *handler, SaHpiResourceIdT res_id); #define OHOI_MAP_ERROR(to, err) \ do {\ if (err == (IPMI_IPMI_ERR_TOP | IPMI_INVALID_CMD_CC)) {\ to = SA_ERR_HPI_INVALID_CMD;\ } else if (err == (IPMI_IPMI_ERR_TOP | IPMI_NODE_BUSY_CC)) {\ to = SA_ERR_HPI_BUSY;\ } else if (err == (IPMI_IPMI_ERR_TOP | IPMI_TIMEOUT_CC)) {\ to = SA_ERR_HPI_NO_RESPONSE;\ } else if (err == (IPMI_IPMI_ERR_TOP | IPMI_COMMAND_INVALID_FOR_LUN_CC)) {\ to = SA_ERR_HPI_INVALID_CMD;\ } else if (err == (IPMI_IPMI_ERR_TOP | IPMI_CANNOT_EXEC_DUPLICATE_REQUEST_CC)) {\ to = SA_ERR_HPI_BUSY;\ } else {\ to = SA_ERR_HPI_INTERNAL_ERROR;\ }\ } while (0) /* * The following traces are available : * OHOI_TRACE_ALL - trace all the following traces and trace_ipmi(). Must be "YES". * OHOI_TRACE_SENSOR - traces sensors add/change/delete and for events in SEL * OHOI_TRACE_ENTITY - traces entities add/change/delete * OHOI_TRACE_MC - traces MCs add/change/delete/active/inactive * OHOI_TRACE_DISCOVERY - prints all existing resources (present and not present) * after discovery * * the values of these variables are ignored */ #define IHOI_TRACE_ALL (getenv("OHOI_TRACE_ALL") &&\ !strcmp("YES",getenv("OHOI_TRACE_ALL"))) #define trace_ipmi(format, ...) \ do { \ if (IHOI_TRACE_ALL) { \ fprintf(stderr, " %s:%d:%s: ", __FILE__, __LINE__, __func__); \ fprintf(stderr, format "\n", ## __VA_ARGS__); \ } \ } while(0) #define trace_ipmi_sensors(action, sid) \ do { \ if (getenv("OHOI_TRACE_SENSOR") || IHOI_TRACE_ALL) { \ fprintf(stderr, " *** SENSOR %s. sensor_id = {{%p, %d, %d, %ld}, %d, %d}\n", action,\ sid.mcid.domain_id.domain, sid.mcid.mc_num, sid.mcid.channel, sid.mcid.seq,\ sid.lun, sid.sensor_num);\ } \ } while(0) extern FILE *trace_msg_file; // File to trace all IPMI messages openhpi-3.6.1/plugins/ipmi/ipmi_controls.c0000644000175100017510000007634112575647300017643 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Tariq Shureih * Louis Zhuang */ #include "ipmi.h" static unsigned char oem_alarm_state = 0xff; struct ohoi_ctrl_info { int done; SaErrorT err; SaHpiRdrT * rdr; struct oh_handler_state *handler; SaHpiCtrlModeT mode; SaHpiCtrlStateT *state; }; /* struct for getting power state */ struct ohoi_power_info { int done; SaErrorT err; SaHpiPowerStateT *state; }; /* struct for getting reset state */ struct ohoi_reset_info { int done; SaErrorT err; SaHpiResetActionT *state; }; static void __get_control_state(ipmi_control_t *control, int err, int *val, void *cb_data) { struct ohoi_ctrl_info *info = cb_data; if (err || !val) { err("__get_control_state: err = %d; val = %p", err, val); info->err = SA_ERR_HPI_INTERNAL_ERROR; info->done = 1; return; } if (info->state->Type != SAHPI_CTRL_TYPE_OEM) { err("IPMI plug-in only support OEM control now"); info->err = SA_ERR_HPI_INTERNAL_ERROR; info->done = 1; return; } if (err || !val) { err("__get_control_state: err = %d; val = %p", err, val); info->err = SA_ERR_HPI_INTERNAL_ERROR; info->done = 1; return; } info->state->StateUnion.Oem.BodyLength = ipmi_control_get_num_vals(control); memcpy(&info->state->StateUnion.Oem.Body[0], val, info->state->StateUnion.Oem.BodyLength); info->done = 1; } static void __get_control_leds_state(ipmi_control_t *control, int err, ipmi_light_setting_t *settings, void *cb_data) { struct ohoi_ctrl_info *info = cb_data; int len, res ,val; if (err) { err("__get_control_leds_state: err = %d", err); info->err = SA_ERR_HPI_INTERNAL_ERROR; info->done = 1; return; } if (info->state->Type != SAHPI_CTRL_TYPE_OEM) { err("IPMI plug-in only support OEM control now"); info->err = SA_ERR_HPI_INTERNAL_ERROR; info->done = 1; return; } if (settings == (ipmi_light_setting_t *)NULL) { err("__get_control_leds_state: settings = NULL"); info->err = SA_ERR_HPI_INTERNAL_ERROR; info->done = 1; return; } len = ipmi_control_get_num_vals(control); info->state->StateUnion.Oem.BodyLength = len; res = ipmi_light_setting_get_color(settings, 0, &val); info->state->StateUnion.Oem.Body[0] = val; info->done = 1; } static void _get_control_state(ipmi_control_t *control, void *cb_data) { if (ipmi_control_light_set_with_setting(control)) ipmi_control_get_light(control, __get_control_leds_state, cb_data); else ipmi_control_get_val(control, __get_control_state, cb_data); } /* * ATCA LEDs */ static void __get_atca_led(ipmi_control_t *control, int err, ipmi_light_setting_t *st, void *cb_data) { struct ohoi_ctrl_info *info = cb_data; SaHpiCtrlStateT *state = info->state; int lc; int on_time, off_time; int color; ipmi_light_setting_in_local_control(st, 0, &lc); info->mode = lc ? SAHPI_CTRL_MODE_AUTO : SAHPI_CTRL_MODE_MANUAL; if (state == NULL) { info->done = 1; return; } if (!ipmi_light_setting_get_on_time(st, 0, &on_time) && !ipmi_light_setting_get_off_time(st, 0, &off_time)) { if (off_time > 10) { state->StateUnion.Oem.Body[0] = off_time / 10; } else { state->StateUnion.Oem.Body[0] = off_time ? 1 : 0; } if (on_time > 10) { state->StateUnion.Oem.Body[1] = on_time / 10; } else { state->StateUnion.Oem.Body[1] = on_time ? 1 : 0; } } else { err("couldn't get on/off times"); info->err = SA_ERR_HPI_INVALID_DATA; info->done = 1; } if (ipmi_light_setting_get_color(st, 0, &color) == 0) { state->StateUnion.Oem.Body[2] = ohoi_atca_led_to_hpi_color(color); state->StateUnion.Oem.Body[3] = state->StateUnion.Oem.Body[2]; } else { err("couldn't get color"); info->err = SA_ERR_HPI_INVALID_DATA; info->done = 1; } state->StateUnion.Oem.Body[4] = 0; state->StateUnion.Oem.Body[5] = 0; state->StateUnion.Oem.MId = ATCAHPI_PICMG_MID; state->StateUnion.Oem.BodyLength = 6; state->Type = SAHPI_CTRL_TYPE_OEM; info->done = 1; } static void _get_atca_led(ipmi_control_t *control, void *cb_data) { struct ohoi_ctrl_info *info = cb_data; int rv; rv = ipmi_control_get_light(control, __get_atca_led, info); if (rv) { err("ipmi_control_get_light. rv = %d", rv); info->err = SA_ERR_HPI_INVALID_DATA; info->done = 1; } } SaErrorT orig_get_control_state(struct oh_handler_state *handler, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state) { struct ohoi_handler *ipmi_handler = (struct ohoi_handler *)handler->data; struct ohoi_ctrl_info info; SaErrorT rv; ipmi_control_id_t ctrl; SaHpiUint8T val, mask, idx, i; SaHpiCtrlStateT localstate; SaHpiCtrlModeT localmode; ctrl = c->info.orig_ctrl_info.ctrl_id; if (state == NULL) { state = &localstate; } if (mode == NULL) { mode = &localmode; } if ((rdr->RdrTypeUnion.CtrlRec.Type == SAHPI_CTRL_TYPE_OEM) && (rdr->RdrTypeUnion.CtrlRec.OutputType == SAHPI_CTRL_LED) && (rdr->RdrTypeUnion.CtrlRec.TypeUnion.Oem.MId == ATCAHPI_PICMG_MID)) { /* This is ATCA led */ info.done = 0; info.err = SA_OK; info.rdr = rdr; info.handler = handler; info.mode = 0; info.state = state; rv = ipmi_control_pointer_cb(ctrl, _get_atca_led, &info); if (rv) { err("ipmi_control_pointer_cb. rv = %d", rv); return SA_ERR_HPI_INVALID_DATA; } rv = ohoi_loop(&info.done, handler->data); if (rv != SA_OK) { err("ohoi_loop. rv = %d", rv); return rv; } if (info.err != SA_OK) { err("info.err = %d", info.err); return info.err; } *mode = info.mode; c->mode = info.mode; return SA_OK; } *mode = c->mode; memset(state, 0, sizeof(*state)); info.done = 0; info.state = state; info.err = SA_OK; info.state->Type = SAHPI_CTRL_TYPE_OEM; rv = ipmi_control_pointer_cb(ctrl, _get_control_state, &info); if (rv) { err("Unable to retrieve control state"); return SA_ERR_HPI_ERROR; } rv = ohoi_loop(&info.done, ipmi_handler); if (rv != SA_OK) { return rv; } if (info.err != SA_OK) { return info.err; } val = info.state->StateUnion.Oem.Body[0]; if ((rdr->RdrTypeUnion.CtrlRec.Type == SAHPI_CTRL_TYPE_DIGITAL) && (rdr->RdrTypeUnion.CtrlRec.OutputType == SAHPI_CTRL_LED) && (rdr->RdrTypeUnion.CtrlRec.Oem >= OEM_ALARM_BASE)) { oem_alarm_state = val; /* This is a front panel alarm LED. */ state->Type = SAHPI_CTRL_TYPE_DIGITAL; mask = 0x01; idx = rdr->RdrTypeUnion.CtrlRec.Oem - OEM_ALARM_BASE; /* bits 0 - 3 = Pwr, Crit, Maj, Min */ for (i = 0; i < idx; i++) mask = mask << 1; if ((val & mask) == 0) state->StateUnion.Digital = SAHPI_CTRL_STATE_ON; else state->StateUnion.Digital = SAHPI_CTRL_STATE_OFF; } return SA_OK; } SaErrorT ohoi_get_control_state(void *hnd, SaHpiResourceIdT id, SaHpiCtrlNumT num, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state) { struct oh_handler_state *handler = (struct oh_handler_state *)hnd; SaErrorT rv; struct ohoi_control_info *ctrl_info; SaHpiRdrT *rdr; rdr = oh_get_rdr_by_type(handler->rptcache, id, SAHPI_CTRL_RDR, num); if (!rdr) return SA_ERR_HPI_INVALID_RESOURCE; rv = ohoi_get_rdr_data(hnd, id, SAHPI_CTRL_RDR, num, (void *)&ctrl_info); if (rv!=SA_OK) return rv; if (ctrl_info->ohoii.get_control_state == NULL) { return SA_ERR_HPI_INVALID_CMD; } return ctrl_info->ohoii.get_control_state(handler, ctrl_info, rdr, mode, state); } static void __set_control_state(ipmi_control_t *control, int err, void *cb_data) { struct ohoi_ctrl_info *info = cb_data; if (err) { err("__set_control_state: err = %d", err); info->err = SA_ERR_HPI_INTERNAL_ERROR; } info->done = 1; } static void _set_control_state(ipmi_control_t *control, void *cb_data) { struct ohoi_ctrl_info *info = cb_data; if (info->state->StateUnion.Oem.BodyLength != ipmi_control_get_num_vals(control)) { err("control number is not equal to supplied data"); info->done = -1; info->err = SA_ERR_HPI_INVALID_PARAMS; return; } if (ipmi_control_light_set_with_setting(control)) { ipmi_light_setting_t *setting; setting = ipmi_alloc_light_settings(1); ipmi_light_setting_set_local_control(setting, 0, 1); ipmi_light_setting_set_color(setting, 0, info->state->StateUnion.Oem.Body[0]); ipmi_control_set_light(control, setting, __set_control_state, cb_data); ipmi_free_light_settings(setting); } else { ipmi_control_set_val(control, /* compile error */ // (int *)&info->state->StateUnion.Oem.Body[0], (int *)(void *)&info->state->StateUnion.Oem.Body[0], __set_control_state, info); } } static SaErrorT set_front_panrl_alarm_led(void *hnd, struct ohoi_control_info *c, SaHpiRdrT * rdr, ipmi_control_id_t ctrl, SaHpiUint8T idx, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state) { struct oh_handler_state *handler = (struct oh_handler_state *)hnd; struct ohoi_handler *ipmi_handler = (struct ohoi_handler *)handler->data; struct ohoi_ctrl_info info; SaErrorT rv; SaHpiUint8T val, mask; SaHpiCtrlStateT my_state; /* just get the current control states */ rv = orig_get_control_state(hnd, c, rdr, NULL, &my_state); if (rv != SA_OK) { return SA_ERR_HPI_NOT_PRESENT; } if (my_state.Type != state->Type) { return SA_ERR_HPI_INVALID_DATA; } val = oem_alarm_state; val |= 0xf0; /* h.o. nibble always write 1 */ state->Type = SAHPI_CTRL_TYPE_OEM; state->StateUnion.Oem.BodyLength = 1; state->StateUnion.Oem.Body[0] = val; mask = 0x01; /* bits 0 - 3 = Pwr, Crit, Maj, Min */ mask = 1 << idx; // for (i = 0; i < idx; i++) mask = mask << 1; info.done = 0; info.state = state; info.err = SA_OK; switch (state->StateUnion.Digital) { case SAHPI_CTRL_STATE_ON : if (!(val & mask)) { /* already turned on */ return SA_OK; } state->StateUnion.Oem.Body[0] = val & ~mask; break; case SAHPI_CTRL_STATE_OFF : if (val & mask) { /* already turned off */ return SA_OK; } state->StateUnion.Oem.Body[0] = val |mask; break; case SAHPI_CTRL_STATE_PULSE_ON : if (!(val & mask)) { /* already turned on */ return SA_ERR_HPI_INVALID_REQUEST; } /* turn it on */ state->StateUnion.Oem.Body[0] = val & ~mask; rv = ipmi_control_pointer_cb(ctrl, _set_control_state, &info); if (rv) { err("Unable to set control state"); return SA_ERR_HPI_ERROR; } rv = ohoi_loop(&info.done, ipmi_handler); if (info.err != SA_OK) { err("Unable to set control state"); return info.err; } if (rv != SA_OK) { err("Unable to set control state"); return rv; } /* then turn it off. IPMI is slow, it provides us delay */ state->StateUnion.Oem.Body[0] = val | mask; break; case SAHPI_CTRL_STATE_PULSE_OFF : if (val & mask) { /* already turned off */ return SA_ERR_HPI_INVALID_REQUEST; } /* turn it off */ state->StateUnion.Oem.Body[0] = val | mask; rv = ipmi_control_pointer_cb(ctrl, _set_control_state, &info); if (rv) { err("Unable to set control state"); return SA_ERR_HPI_ERROR; } rv = ohoi_loop(&info.done, ipmi_handler); if (info.err != SA_OK) { err("Unable to set control state"); return info.err; } if (rv != SA_OK) { err("Unable to set control state"); return rv; } /* then turn it on. IPMI is slow, it provides us delay */ state->StateUnion.Oem.Body[0] = val | mask; break; default : return SA_ERR_HPI_INVALID_PARAMS; } rv = ipmi_control_pointer_cb(ctrl, _set_control_state, &info); if (rv) { err("Unable to set control state"); return SA_ERR_HPI_ERROR; } rv = ohoi_loop(&info.done, ipmi_handler); if (info.err != SA_OK) { err("Unable to set control state"); return info.err; } if (rv != SA_OK) { err("Unable to set control state"); return rv; } return SA_OK; } /* * ATCA LED controls */ static void __set_atca_led(ipmi_control_t *control, int err, ipmi_light_setting_t *st, void *cb_data) { struct ohoi_ctrl_info *info = cb_data; SaHpiUint8T *body; int lc = 0; int color = 0; int rv; ipmi_light_setting_in_local_control(st, 0, &lc); if (info->mode == SAHPI_CTRL_MODE_AUTO) { /* set MODE only */ ipmi_light_setting_set_local_control(st, 0, 1); } else { body = &info->state->StateUnion.Oem.Body[0]; color = ohoi_atca_led_to_ipmi_color(body[2]); ipmi_light_setting_set_local_control(st, 0, 0); rv = ipmi_light_setting_set_color(st, 0, color); if (rv) { err("ipmi_light_setting_set_color. rv = %d", rv); } rv = ipmi_light_setting_set_off_time(st, 0, body[0] * 10); if (rv) { err("ipmi_light_setting_set_off_time. rv = %d", rv); } rv = ipmi_light_setting_set_on_time(st, 0, body[1] * 10); if (rv) { err("ipmi_light_setting_set_on_time. rv = %d", rv); } } rv = ipmi_control_set_light(control, st, __set_control_state, info); if (rv) { err("ipmi_control_set_light = %d", rv); info->err = SA_ERR_HPI_INVALID_DATA; info->done = 1; return; } } static void _set_atca_led(ipmi_control_t *control, void *cb_data) { struct ohoi_ctrl_info *info = cb_data; int rv; rv = ipmi_control_get_light(control, __set_atca_led, info); if (rv) { err("ipmi_control_get_light. rv = %d", rv); info->err = SA_ERR_HPI_INVALID_DATA; info->done = 1; } } /** * is_supported_color * @hpi_color: HPI Color to test if supported * @rdr: RDR object containing control record for LED. * * Check if hpi_color is supported by the LED associated with rdr. * * Return value: 0 if color is supported, 1 otherwise. **/ static int is_supported_color(AtcaHpiLedColorT hpi_color, SaHpiRdrT *rdr) { AtcaHpiColorCapabilitiesT supported_colors = rdr->RdrTypeUnion.CtrlRec.TypeUnion.Oem.ConfigData[0]; switch(hpi_color) { case ATCAHPI_LED_COLOR_BLUE: return ((supported_colors & ATCAHPI_LED_BLUE) != 0); case ATCAHPI_LED_COLOR_RED: return ((supported_colors & ATCAHPI_LED_RED) != 0); case ATCAHPI_LED_COLOR_GREEN: return ((supported_colors & ATCAHPI_LED_GREEN) != 0); case ATCAHPI_LED_COLOR_AMBER: return ((supported_colors & ATCAHPI_LED_AMBER) != 0); case ATCAHPI_LED_COLOR_ORANGE: return ((supported_colors & ATCAHPI_LED_ORANGE) != 0); case ATCAHPI_LED_COLOR_WHITE: return ((supported_colors & ATCAHPI_LED_WHITE) != 0); case ATCAHPI_LED_COLOR_NO_CHANGE: return 1; case ATCAHPI_LED_COLOR_USE_DEFAULT: return 1; case ATCAHPI_LED_COLOR_RESERVED: return 0; } return 0; } SaErrorT orig_set_control_state(struct oh_handler_state *handler, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state) { struct ohoi_handler *ipmi_handler = (struct ohoi_handler *)handler->data; struct ohoi_ctrl_info info; SaErrorT rv; ipmi_control_id_t ctrl; ctrl = c->info.orig_ctrl_info.ctrl_id; if ((rdr->RdrTypeUnion.CtrlRec.Type == SAHPI_CTRL_TYPE_OEM) && (rdr->RdrTypeUnion.CtrlRec.OutputType == SAHPI_CTRL_LED) && (rdr->RdrTypeUnion.CtrlRec.TypeUnion.Oem.MId == ATCAHPI_PICMG_MID)) { /* This is ATCA led */ if (state != NULL) { if (state->StateUnion.Oem.MId != ATCAHPI_PICMG_MID) { err("state->StateUnion.Mid isn't ATCAHPI_PICMG_MID"); return SA_ERR_HPI_INVALID_DATA; } if (state->StateUnion.Oem.BodyLength != 6) { err("state->StateUnion.Oem.BodyLength(%d) != 6", state->StateUnion.Oem.BodyLength); return SA_ERR_HPI_INVALID_DATA; } SaHpiUint8T *body = &state->StateUnion.Oem.Body[0]; if ((body[2] == 0) || ((body[2] & (body[2] - 1)) != 0)) { /* exactly one color must be set */ return SA_ERR_HPI_INVALID_DATA; } if (!is_supported_color(body[2], rdr)) { /* LED doesn't support this color */ return SA_ERR_HPI_INVALID_DATA; } } info.done = 0; info.err = 0; info.rdr = rdr; info.handler = handler; info.mode = mode; info.state = state; rv = ipmi_control_pointer_cb(ctrl, _set_atca_led, &info); if (rv) { err("ipmi_control_pointer_cb. rv = %d", rv); return SA_ERR_HPI_INVALID_DATA; } rv = ohoi_loop(&info.done, handler->data); if (rv != SA_OK) { err("ohoi_loop. rv = %d", rv); return rv; } if (info.err != SA_OK) { err("info.err = %d", info.err); return info.err; } c->mode = mode; return SA_OK; } if (mode == SAHPI_CTRL_MODE_AUTO) { c->mode = mode; return SA_OK; } if ((rdr->RdrTypeUnion.CtrlRec.Type == SAHPI_CTRL_TYPE_DIGITAL) && (rdr->RdrTypeUnion.CtrlRec.OutputType == SAHPI_CTRL_LED) && (rdr->RdrTypeUnion.CtrlRec.Oem >= OEM_ALARM_BASE)) { /* This is a front panel alarm LED. */ rv = set_front_panrl_alarm_led(handler, c, rdr, ctrl, rdr->RdrTypeUnion.CtrlRec.Oem - OEM_ALARM_BASE, mode, state); if (rv == SA_OK) { c->mode = mode; } return rv; } info.done = 0; info.state = state; info.err = SA_OK; if (info.state->Type != SAHPI_CTRL_TYPE_OEM) { err("IPMI only support OEM control"); return SA_ERR_HPI_INVALID_CMD; } rv = ipmi_control_pointer_cb(ctrl, _set_control_state, &info); if (rv) { err("Unable to set control state"); return SA_ERR_HPI_ERROR; } rv = ohoi_loop(&info.done, ipmi_handler); if (rv != SA_OK) { return rv; } if (info.err != SA_OK) { return info.err; } c->mode = mode; return SA_OK; } /* interface function */ SaErrorT ohoi_set_control_state(void *hnd, SaHpiResourceIdT id, SaHpiCtrlNumT num, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state) { struct oh_handler_state *handler = (struct oh_handler_state *)hnd; struct ohoi_control_info *ctrl_info; SaErrorT rv; SaHpiRdrT *rdr; rdr = oh_get_rdr_by_type(handler->rptcache, id, SAHPI_CTRL_RDR, num); if (!rdr) return SA_ERR_HPI_INVALID_RESOURCE; rv = ohoi_get_rdr_data(hnd, id, SAHPI_CTRL_RDR, num, (void *)&ctrl_info); if (rv != SA_OK) return rv; if (rdr->RdrTypeUnion.CtrlRec.DefaultMode.ReadOnly && rdr->RdrTypeUnion.CtrlRec.DefaultMode.Mode != mode) { err("Attempt to change mode of RO sensor mode"); return SA_ERR_HPI_READ_ONLY; } if (ctrl_info->ohoii.set_control_state == NULL) { return SA_ERR_HPI_UNSUPPORTED_API; } rv = ctrl_info->ohoii.set_control_state(handler, ctrl_info, rdr, mode, state); return rv; } static void reset_resource_done (ipmi_control_t *ipmi_control, int err, void *cb_data) { struct ohoi_reset_info *info = cb_data; info->done = 1; if (err) { err("reset_resource_done: err = %d", err); info->err = SA_ERR_HPI_INTERNAL_ERROR; } } static void set_resource_reset_state(ipmi_control_t *control, void *cb_data) { struct ohoi_reset_info *info = cb_data; int val = 1; int rv; /* Just cold reset the entity*/ rv = ipmi_control_set_val(control, &val, reset_resource_done, cb_data); if (rv) { err("ipmi_control_set_val returned err = %d", rv); info->err = SA_ERR_HPI_INTERNAL_ERROR; info->done = 1; } } static void reset_mc_done (ipmi_mc_t *mc, int err, void *cb_data) { struct ohoi_reset_info *info = cb_data; info->done = 1; if (err) { err("reset_mc_done err = %d", err); info->err = SA_ERR_HPI_INTERNAL_ERROR; } } static void set_mc_reset_state(ipmi_mc_t *mc, void *cb_data) { struct ohoi_reset_info *info = cb_data; int rv; int act; if (*info->state == SAHPI_COLD_RESET) { act = IPMI_MC_RESET_COLD; } else if (*info->state == SAHPI_WARM_RESET) { act = IPMI_MC_RESET_WARM; } else { info->err = SA_ERR_HPI_INVALID_CMD; info->done = 1; return; } rv = ipmi_mc_reset(mc, act, reset_mc_done, cb_data); if (rv) { err("ipmi_mc_reset returned err = %d", rv); info->err = SA_ERR_HPI_INTERNAL_ERROR; info->done = 1; } } SaErrorT ohoi_set_reset_state(void *hnd, SaHpiResourceIdT id, SaHpiResetActionT act) { struct oh_handler_state *handler = (struct oh_handler_state *)hnd; struct ohoi_handler *ipmi_handler = (struct ohoi_handler *)handler->data; struct ohoi_reset_info info; struct ohoi_resource_info *ohoi_res_info; int rv; info.done = 0; info.err = 0; if ((act == SAHPI_COLD_RESET) || (act == SAHPI_WARM_RESET)) { dbg("ResetAction requested: %d", act); info.state = &act; } else { err("Currently we only support cold and warm reset"); return SA_ERR_HPI_INVALID_CMD; } ohoi_res_info = oh_get_resource_data(handler->rptcache, id); if (!(ohoi_res_info->type & OHOI_RESOURCE_ENTITY)) { rv = ipmi_control_pointer_cb(ohoi_res_info->reset_ctrl, set_resource_reset_state, &info); } else { rv = ipmi_mc_pointer_cb(ohoi_res_info->u.entity.mc_id, set_mc_reset_state, &info); } if (rv) { err("Not support reset in the entity or mc"); return SA_ERR_HPI_CAPABILITY; } /* wait until reset_done is called to exit this function */ rv = ohoi_loop(&info.done, ipmi_handler); if ((rv == SA_OK) && (info.err == 0)) { return SA_OK; } else if (info.err) { return info.err; } else { return rv; } } static void power_done (ipmi_control_t *ipmi_control, int err, void *cb_data) { struct ohoi_power_info *power_info = cb_data; power_info->done = 1; if (err) { err("power_done: err = %d", err); power_info->err = SA_ERR_HPI_INTERNAL_ERROR; } } static void set_power_state_on(ipmi_control_t *control, void *cb_data) { struct ohoi_power_info *power_info = cb_data; int rv; rv = ipmi_control_set_val(control, (int *)power_info->state, power_done, cb_data); if (rv) { err("Failed to set control val (power on). rv = %d", rv); OHOI_MAP_ERROR(power_info->err, rv); power_info->done = 1; } else power_info->err = SA_OK; } static void set_power_state_off(ipmi_control_t *control, void *cb_data) { struct ohoi_power_info *power_info = cb_data; int rv; rv = ipmi_control_set_val(control, (int *)power_info->state, power_done, cb_data); if (rv) { err("Failed to set control val (power off). rv = %d", rv); OHOI_MAP_ERROR(power_info->err, rv); power_info->done = 1; } else power_info->err = SA_OK; } SaErrorT ohoi_set_power_state(void *hnd, SaHpiResourceIdT id, SaHpiPowerStateT state) { struct ohoi_resource_info *ohoi_res_info; struct oh_handler_state *handler = (struct oh_handler_state *)hnd; struct ohoi_handler *ipmi_handler = (struct ohoi_handler *)handler->data; struct ohoi_power_info power_info; int rv; power_info.done = 0; power_info.state = &state; ohoi_res_info = oh_get_resource_data(handler->rptcache, id); if (!(ohoi_res_info->type & OHOI_RESOURCE_ENTITY)) { err("Not support power in MC"); return SA_ERR_HPI_INVALID_CMD; } switch (state) { case SAHPI_POWER_ON: rv = ipmi_control_pointer_cb(ohoi_res_info->power_ctrl, set_power_state_on, &power_info); if (rv) { err("set_power_state_on failed"); return SA_ERR_HPI_INTERNAL_ERROR; } break; case SAHPI_POWER_OFF: rv = ipmi_control_pointer_cb(ohoi_res_info->power_ctrl, set_power_state_off, &power_info); if (rv) { err("set_power_state_off failed"); return SA_ERR_HPI_INTERNAL_ERROR; } break; case SAHPI_POWER_CYCLE: dbg("CYCLE power"); SaHpiPowerStateT cy_state = 0; cy_state = SAHPI_POWER_OFF; power_info.state = &cy_state; rv = ipmi_control_pointer_cb(ohoi_res_info->power_ctrl, set_power_state_off, &power_info); if (rv) { err("set_power_state_off failed"); return SA_ERR_HPI_INTERNAL_ERROR; } rv = ohoi_loop(&power_info.done, ipmi_handler); if (rv != SA_OK) { err("ohopi_loop = 0x%x", rv); return rv; } dbg("CYCLE Stage 1: OK"); if ((power_info.done) && (power_info.err == SA_OK)) { dbg("CYCLE: done = %d , err = %d", power_info.done, power_info.err); cy_state = SAHPI_POWER_ON; power_info.state = &cy_state; power_info.done = 0; rv = ipmi_control_pointer_cb(ohoi_res_info->power_ctrl, set_power_state_on, &power_info); if (rv) { err("set_power_state_on failed"); return SA_ERR_HPI_INTERNAL_ERROR; } } break; default: err("Invalid power state requested"); return SA_ERR_HPI_INVALID_PARAMS; } rv = ohoi_loop(&power_info.done, ipmi_handler); if (rv != SA_OK) { return rv; } return power_info.err; } static void get_power_control_val (ipmi_control_t *control, int err, int *val, void *cb_data) { struct ohoi_power_info *info = cb_data; if (err || !val) { err("get_power_control_val: err = %d; val = %p", err, val); info->err = SA_ERR_HPI_INTERNAL_ERROR; info->done = 1; return; } if (*val == 0) { err("Power Control Value: %d", *val); *info->state = SAHPI_POWER_OFF; info->err = SA_OK; } else if (*val == 1) { err("Power Control Value: %d", *val); *info->state = SAHPI_POWER_ON; info->err = SA_OK; } else { err("invalid power state"); info->err = SA_ERR_HPI_INTERNAL_ERROR; } info->done = 1; } static void get_power_state (ipmi_control_t *ipmi_control, void *cb_data) { struct ohoi_power_info *power_state = cb_data; int rv; rv = ipmi_control_get_val(ipmi_control, get_power_control_val, cb_data); if(rv) { err("[power]control_get_val failed. rv = %d", rv); power_state->err = SA_ERR_HPI_INTERNAL_ERROR; power_state->done = 1; } } SaErrorT ohoi_get_power_state (void *hnd, SaHpiResourceIdT id, SaHpiPowerStateT *state) { struct oh_handler_state *handler = (struct oh_handler_state *)hnd; struct ohoi_handler *ipmi_handler = (struct ohoi_handler *)handler->data; struct ohoi_resource_info *ohoi_res_info; struct ohoi_power_info power_state; int rv; power_state.done = 0; power_state.err = SA_OK; power_state.state = state; ohoi_res_info = oh_get_resource_data(handler->rptcache, id); if (!(ohoi_res_info->type & OHOI_RESOURCE_ENTITY)) { err("MC does not support power!"); return SA_ERR_HPI_CAPABILITY; } rv = ipmi_control_pointer_cb(ohoi_res_info->power_ctrl, get_power_state, &power_state); if (rv) { err("get_power_state failed"); return SA_ERR_HPI_INTERNAL_ERROR; } dbg("waiting for OIPMI to return"); rv = ohoi_loop(&power_state.done, ipmi_handler); if (rv != SA_OK) { return rv; } return power_state.err; } static void get_reset_control_val (ipmi_control_t *control, int err, int *val, void *cb_data) { struct ohoi_reset_info *info = cb_data; if (err || !val) { err("get_reset_control_val: err = %d; val = %p", err, val); info->err = SA_ERR_HPI_INTERNAL_ERROR; info->done = 1; return; } if (*val == 0) { err("Reset Control Value: %d", *val); *info->state = SAHPI_RESET_DEASSERT; info->err = SA_OK; } else if (*val == 1) { err("Power Control Value: %d", *val); *info->state = SAHPI_RESET_ASSERT; info->err = SA_OK; } else { /* Note: IPMI platfroms don't hold reset state * so we'll always return SAHPI_RESET_DEASSER * this code is here just in case ;-) */ err("System does not support holding ResetState"); *info->state = SAHPI_RESET_DEASSERT; info->err = SA_OK; } info->done = 1; } static void get_reset_state(ipmi_control_t *control, void *cb_data) { struct ohoi_reset_info *reset_info = cb_data; int rv; rv = ipmi_control_get_val(control, get_reset_control_val, cb_data); if (rv) { //err("[reset] control_get_val failed. IPMI error = %i", rv); err("This IPMI system has a pulse reset, state is always DEASSERT"); /* OpenIPMI will return an error for this call since pulse resets do not support get_state we will return UNSUPPORTED_API */ *reset_info->state = SAHPI_RESET_DEASSERT; reset_info->err = SA_OK; reset_info->done = 1; } } SaErrorT ohoi_get_reset_state(void *hnd, SaHpiResourceIdT id, SaHpiResetActionT *act) { struct oh_handler_state *handler = (struct oh_handler_state *)hnd; struct ohoi_handler *ipmi_handler = (struct ohoi_handler *)handler->data; struct ohoi_resource_info *ohoi_res_info; struct ohoi_reset_info reset_state; int rv; reset_state.done = 0; reset_state.err = 0; reset_state.state = act; ohoi_res_info = oh_get_resource_data(handler->rptcache, id); if (!(ohoi_res_info->type & OHOI_RESOURCE_ENTITY)) { err("Not support power in MC"); return SA_ERR_HPI_CAPABILITY; } rv = ipmi_control_pointer_cb(ohoi_res_info->reset_ctrl, get_reset_state, &reset_state); if(rv) { err("[reset_state] control pointer callback failed. rv = %d", rv); return SA_ERR_HPI_INVALID_CMD; } rv = ohoi_loop(&reset_state.done, ipmi_handler); if (rv != SA_OK) { return rv; } return reset_state.err; } void * oh_get_control_state (void *, SaHpiResourceIdT, SaHpiCtrlNumT, SaHpiCtrlModeT *, SaHpiCtrlStateT *) __attribute__ ((weak, alias("ohoi_get_control_state"))); void * oh_set_control_state (void *, SaHpiResourceIdT,SaHpiCtrlNumT, SaHpiCtrlModeT, SaHpiCtrlStateT *) __attribute__ ((weak, alias("ohoi_set_control_state"))); void * oh_get_power_state (void *, SaHpiResourceIdT, SaHpiPowerStateT *) __attribute__ ((weak, alias("ohoi_get_power_state"))); void * oh_set_power_state (void *, SaHpiResourceIdT, SaHpiPowerStateT) __attribute__ ((weak, alias("ohoi_set_power_state"))); void * oh_get_reset_state (void *, SaHpiResourceIdT, SaHpiResetActionT *) __attribute__ ((weak, alias("ohoi_get_reset_state"))); void * oh_set_reset_state (void *, SaHpiResourceIdT, SaHpiResetActionT) __attribute__ ((weak, alias("ohoi_set_reset_state"))); openhpi-3.6.1/plugins/ipmi/ipmi_sensor_event.c0000644000175100017510000010314712575647300020505 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Louis Zhuang */ #include "ipmi.h" #include #include enum ohoi_event_type { EVENT_DATA_0 = 0, EVENT_DATA_1, EVENT_DATA_2, EVENT_DATA_3 }; /* IPMI does not define the decrete sensor event state */ enum ohoi_discrete_e { IPMI_TRANS_IDLE = 0, IPMI_TRANS_ACTIVE, IPMI_TRANS_BUSY }; static void set_discrete_sensor_misc_event(ipmi_event_t *event, SaHpiSensorEventT *e) { enum ohoi_event_type type; char data[IPMI_EVENT_DATA_MAX_LEN]; int dt_len; SaHpiSensorOptionalDataT od = 0; dt_len = ipmi_event_get_data(event, (unsigned char *)data, 0, IPMI_EVENT_DATA_MAX_LEN); if (dt_len != 13) { err("Wrong size of ipmi event data = %i", dt_len); return; } e->EventState = (1 << (data[10] & 0x0f)); type = data[10] >> 6; if (type == EVENT_DATA_1) { if ((data[11] & 0x0f) != 0x0f) { od |= SAHPI_SOD_PREVIOUS_STATE; e->PreviousState = (1 << (data[11] & 0x0f)); } } else if (type == EVENT_DATA_2) { od |= SAHPI_SOD_OEM; } else if (type == EVENT_DATA_3) { od |= SAHPI_SOD_SENSOR_SPECIFIC; } type = (data[10] & 0x30) >> 4; if (type == EVENT_DATA_2) { od |= SAHPI_SOD_OEM; } else if (type == EVENT_DATA_3) { od |= SAHPI_SOD_SENSOR_SPECIFIC; } if (e->SensorType == IPMI_SENSOR_TYPE_OS_CRITICAL_STOP) { // implementation feature od |= SAHPI_SOD_SENSOR_SPECIFIC; e->SensorSpecific = (data[12] << 16) | (data[11] << 8) | data[9]; } else { e->SensorSpecific = (data[12] << 16) | (data[11] << 8) | data[10]; } e->Oem = (data[12] << 16) | (data[11] << 8) | data[10]; e->OptionalDataPresent = od; } static void set_event_sensor_num(ipmi_sensor_t *sensor, struct oh_event *e, struct oh_handler_state *handler) { ipmi_entity_id_t entity_id; ipmi_sensor_id_t sensor_id; SaHpiRptEntryT *rpt_entry; SaHpiRdrT *rdr; entity_id = ipmi_entity_convert_to_id(ipmi_sensor_get_entity(sensor)); sensor_id = ipmi_sensor_convert_to_id(sensor); rpt_entry = ohoi_get_resource_by_entityid(handler->rptcache, &entity_id); if (!rpt_entry) { dump_entity_id("Sensor without RPT Entry?!", entity_id); return; } e->event.Source = rpt_entry->ResourceId; rdr = ohoi_get_rdr_by_data(handler->rptcache, rpt_entry->ResourceId, SAHPI_SENSOR_RDR, &sensor_id); if (!rdr) { err("No rdr for sensor %d in resource:%d\n", sensor_id.sensor_num, rpt_entry->ResourceId); return; } e->event.EventDataUnion.SensorEvent.SensorNum = rdr->RdrTypeUnion.SensorRec.Num; } /* * sensor_discrete_map_event * @dir: assertion or disassertion * @offset: not used now * @severity: severity of event * @prev_severity: previous state of sensor event * @event: ipmi event * * Helper function to map ipmi event from discrete sensor to oh_event. * It is used to implement saHpiEventLogEntryGet() and saHpiEventGet(). * * Returns: oh_event to which ipmi event is mapped */ static struct oh_event *sensor_discrete_map_event( struct ohoi_handler *ipmi_handler, enum ipmi_event_dir_e dir, int offset, int severity, int prev_severity, ipmi_event_t *event) { struct oh_event *e; unsigned char data[IPMI_EVENT_DATA_MAX_LEN]; unsigned int dt_len; dt_len = ipmi_event_get_data(event, data, 0, IPMI_EVENT_DATA_MAX_LEN); if (dt_len != 13) { err("Wrong size of ipmi event data = %i", dt_len); return NULL; } e = malloc(sizeof(*e)); if (!e) { err("Out of space"); return NULL; } memset(e, 0, sizeof(*e)); e->event.Source = 0; /* Do not find EventType in IPMI */ e->event.EventType = SAHPI_ET_SENSOR; e->event.Timestamp = ipmi_event_get_timestamp(event); e->event.Severity = (SaHpiSeverityT)severity; e->event.EventDataUnion.SensorEvent.SensorNum = 0; e->event.EventDataUnion.SensorEvent.SensorType = data[7]; if ((data[9] & 0x7f) == 0x6f) { /* sensor specific event */ e->event.EventDataUnion.SensorEvent.EventCategory = SAHPI_EC_SENSOR_SPECIFIC; } else if ((data[9] & 0x7f) >= 0x70) { e->event.EventDataUnion.SensorEvent.EventCategory = SAHPI_EC_GENERIC; } else { e->event.EventDataUnion.SensorEvent.EventCategory = data[9] & 0x7f; } if (data[7] >= 0xc0) { e->event.EventDataUnion.SensorEvent.SensorType = SAHPI_OEM_SENSOR; } e->event.EventDataUnion.SensorEvent.Assertion = !(dir); set_discrete_sensor_misc_event(event, &e->event.EventDataUnion.SensorEvent); if (!IS_ATCA(ipmi_handler->d_type) || ( data[7] != 0xf1)) { return e; } // ATCA IPMB-0 link sensor. Special mapping e->event.EventDataUnion.SensorEvent.EventCategory = SAHPI_EC_REDUNDANCY; switch (data[10] & 0x0f) { // IPMI event state case 0x00: // IPMB_A disable, IPMB-B disable e->event.EventDataUnion.SensorEvent.EventState = SAHPI_ES_NON_REDUNDANT_INSUFFICIENT_RESOURCES; e->event.Severity = SAHPI_CRITICAL; break; case 0x01: // IPMB_A enable, IPMB-B disable case 0x02: // IPMB_A disable, IPMB-B enable e->event.EventDataUnion.SensorEvent.EventState = SAHPI_ES_NON_REDUNDANT_SUFFICIENT_RESOURCES; e->event.Severity = SAHPI_MAJOR; break; case 0x03: // IPMB_A enable, IPMB-B enable e->event.EventDataUnion.SensorEvent.EventState = SAHPI_ES_FULLY_REDUNDANT; e->event.Severity = SAHPI_OK; break; default: err("wrong IPMIB-0 Status Change Event State = 0x%x", data[10] & 0x0f); break; } if (!(e->event.EventDataUnion.SensorEvent.OptionalDataPresent & SAHPI_SOD_PREVIOUS_STATE)) { // no previous state return e; } switch (data[11] & 0x0f) { // previous IPMI event state case 0x00: // IPMB_A disable, IPMB-B disable e->event.EventDataUnion.SensorEvent.PreviousState = SAHPI_ES_NON_REDUNDANT_INSUFFICIENT_RESOURCES; break; case 0x01: // IPMB_A enable, IPMB-B disable case 0x02: // IPMB_A disable, IPMB-B enable e->event.EventDataUnion.SensorEvent.PreviousState = SAHPI_ES_NON_REDUNDANT_SUFFICIENT_RESOURCES; break; case 0x03: // IPMB_A enable, IPMB-B enable e->event.EventDataUnion.SensorEvent.PreviousState = SAHPI_ES_FULLY_REDUNDANT; break; default: err("wrong IPMIB-0 Status Change Previous Event State = 0x%x", data[11] & 0x0f); break; } return e; } static int sensor_discrete_event(ipmi_sensor_t *sensor, enum ipmi_event_dir_e dir, int offset, int severity, int prev_severity, void * cb_data, ipmi_event_t *event) { struct oh_event *e; struct oh_handler_state *handler = cb_data; struct ohoi_handler *ipmi_handler = handler->data; ipmi_sensor_id_t sid = ipmi_sensor_convert_to_id(sensor); trace_ipmi_sensors("EVENT", sid); if ((ipmi_handler->d_type == IPMI_DOMAIN_TYPE_ATCA) && (ipmi_sensor_get_sensor_type(sensor) == 0xF0)) { // hot swap sensor. We don't report its event. // hotswap event will be reported via entity hotswap // handeler instead of. return IPMI_EVENT_NOT_HANDLED; } e = sensor_discrete_map_event(ipmi_handler, dir, offset, severity, prev_severity, event); if (e == NULL) { return IPMI_EVENT_HANDLED; } set_event_sensor_num(sensor, e, handler); e->hid = handler->hid; oh_evt_queue_push(handler->eventq, e); return IPMI_EVENT_HANDLED; } static void set_thresholed_sensor_event_state(enum ipmi_thresh_e threshold, enum ipmi_event_dir_e dir, enum ipmi_event_value_dir_e high_low, SaHpiSensorEventT *event, SaHpiSeverityT *severity) { if ((dir == IPMI_ASSERTION && high_low == IPMI_GOING_HIGH) || (dir == IPMI_DEASSERTION && high_low == IPMI_GOING_LOW)) event->Assertion = SAHPI_TRUE; else if ((dir == IPMI_ASSERTION && high_low == IPMI_GOING_LOW) || (dir == IPMI_DEASSERTION && high_low == IPMI_GOING_HIGH)) event->Assertion = SAHPI_FALSE; switch (threshold) { case IPMI_LOWER_NON_CRITICAL: event->EventState = SAHPI_ES_LOWER_MINOR; *severity = SAHPI_MINOR; break; case IPMI_LOWER_CRITICAL: event->EventState = SAHPI_ES_LOWER_MAJOR; *severity = SAHPI_MAJOR; break; case IPMI_LOWER_NON_RECOVERABLE: event->EventState = SAHPI_ES_LOWER_CRIT; *severity = SAHPI_CRITICAL; break; case IPMI_UPPER_NON_CRITICAL: event->EventState = SAHPI_ES_UPPER_MINOR; *severity = SAHPI_MINOR; break; case IPMI_UPPER_CRITICAL: event->EventState = SAHPI_ES_UPPER_MAJOR; *severity = SAHPI_MAJOR; break; case IPMI_UPPER_NON_RECOVERABLE: event->EventState = SAHPI_ES_UPPER_CRIT; *severity = SAHPI_CRITICAL; break; default: err("Invalid threshold giving"); event->EventState = SAHPI_ES_UNSPECIFIED; } } static void set_thresholds_sensor_misc_event(ipmi_event_t *event, SaHpiSensorEventT *e) { unsigned int type; SaHpiSensorOptionalDataT od = 0; unsigned char data[IPMI_EVENT_DATA_MAX_LEN]; unsigned int dt_len; dt_len = ipmi_event_get_data(event, data, 0, IPMI_EVENT_DATA_MAX_LEN); if (dt_len != 13) { err("Wrong size of ipmi event data = %i", dt_len); return; } type = data[10] >> 6; if (type == EVENT_DATA_1) { od |= SAHPI_SOD_TRIGGER_READING; e->TriggerReading.IsSupported = SAHPI_TRUE; e->TriggerReading.Type = SAHPI_SENSOR_READING_TYPE_UINT64; e->TriggerReading.Value.SensorUint64 = data[11]; } else if (type == EVENT_DATA_2) { od |= SAHPI_SOD_OEM; } else if (type == EVENT_DATA_3) { od |= SAHPI_SOD_SENSOR_SPECIFIC; } type = (data[10] & 0x30) >> 4; if (type == EVENT_DATA_1) { od |= SAHPI_SOD_TRIGGER_THRESHOLD; e->TriggerThreshold.IsSupported = SAHPI_TRUE; e->TriggerThreshold.Type = SAHPI_SENSOR_READING_TYPE_UINT64; e->TriggerThreshold.Value.SensorUint64 = data[12]; } else if (type == EVENT_DATA_2) { od |= SAHPI_SOD_OEM; } else if (type == EVENT_DATA_3) { od |= SAHPI_SOD_SENSOR_SPECIFIC; } if (e->SensorType == IPMI_SENSOR_TYPE_OS_CRITICAL_STOP) { od |= SAHPI_SOD_SENSOR_SPECIFIC; e->SensorSpecific = (data[12] << 16) | (data[11] << 8) | data[9]; } else { e->SensorSpecific = (data[12] << 16) | (data[11] << 8) | data[10]; } e->Oem = (data[12] << 16) | (data[11] << 8) | data[10]; e->OptionalDataPresent = od; } /* * sensor_threshold_map_event * @dir: assertion or disassertion - pass to set_thresholed_sensor_event_state * @threshhold: to pass to set_thresholed_sensor_event_state * @high_low: to pass to set_thresholed_sensor_event_state * @value_present: not used now * @raw_value: not used now * value: not used now * @event: ipmi event * * Helper function to map ipmi event from threshold sensor to oh_event. * It is used to implement saHpiEventLogEntryGet() and saHpiEventGet(). * * Returns: oh_event to which ipmi event is mapped */ static struct oh_event *sensor_threshold_map_event( enum ipmi_event_dir_e dir, enum ipmi_thresh_e threshold, enum ipmi_event_value_dir_e high_low, enum ipmi_value_present_e value_present, unsigned int raw_value, double value, ipmi_event_t *event) { struct oh_event *e; SaHpiSeverityT severity = SAHPI_CRITICAL; unsigned char data[IPMI_EVENT_DATA_MAX_LEN]; unsigned int dt_len; dt_len = ipmi_event_get_data(event, data, 0, IPMI_EVENT_DATA_MAX_LEN); if (dt_len != 13) { err("Wrong size of ipmi event data = %i", dt_len); return NULL; } e = malloc(sizeof(*e)); if (!e) { err("Out of space"); return NULL; } memset(e, 0, sizeof(*e)); e->event.Source = 0; e->event.EventType = SAHPI_ET_SENSOR; e->event.Timestamp = ipmi_event_get_timestamp(event); // sensor num should be assigned later in calling functions e->event.EventDataUnion.SensorEvent.SensorNum = 0; if (data[7] >= 0xc0) { e->event.EventDataUnion.SensorEvent.SensorType = SAHPI_OEM_SENSOR; } else { e->event.EventDataUnion.SensorEvent.SensorType = data[7]; } e->event.EventDataUnion.SensorEvent.EventCategory = data[9] & 0x7f; set_thresholed_sensor_event_state(threshold, dir, high_low, &e->event.EventDataUnion.SensorEvent, &severity); e->event.Severity = severity; set_thresholds_sensor_misc_event (event, &e->event.EventDataUnion.SensorEvent); return e; } static int sensor_threshold_event(ipmi_sensor_t *sensor, enum ipmi_event_dir_e dir, enum ipmi_thresh_e threshold, enum ipmi_event_value_dir_e high_low, enum ipmi_value_present_e value_present, unsigned int raw_value, double value, void *cb_data, ipmi_event_t *event) { struct oh_event *e = NULL; struct oh_handler_state *handler = cb_data; e = sensor_threshold_map_event(dir, threshold, high_low, value_present, raw_value, value, event); if (e == NULL) { return IPMI_EVENT_HANDLED; } set_event_sensor_num(sensor, e, handler); e->hid = handler->hid; oh_evt_queue_push(handler->eventq, e); return IPMI_EVENT_HANDLED; } static void add_sensor_event_thresholds(ipmi_sensor_t *sensor, SaHpiSensorRecT *rec) { int val; SaHpiSensorThdMaskT temp; unsigned int access; if (rec->Category != SAHPI_EC_THRESHOLD) { rec->ThresholdDefn.IsAccessible = SAHPI_FALSE; return; } access = ipmi_sensor_get_threshold_access(sensor); if (access == IPMI_THRESHOLD_ACCESS_SUPPORT_NONE) { rec->ThresholdDefn.IsAccessible = SAHPI_FALSE; return; } if (access >= IPMI_THRESHOLD_ACCESS_SUPPORT_READABLE) { rec->ThresholdDefn.IsAccessible = SAHPI_TRUE; temp = 0; ipmi_sensor_threshold_readable(sensor, IPMI_LOWER_NON_CRITICAL, &val); if (val) temp |= SAHPI_STM_LOW_MINOR; ipmi_sensor_threshold_readable(sensor, IPMI_LOWER_CRITICAL, &val); if (val) temp |= SAHPI_STM_LOW_MAJOR; ipmi_sensor_threshold_readable(sensor, IPMI_LOWER_NON_RECOVERABLE, &val); if (val) temp |= SAHPI_STM_LOW_CRIT; ipmi_sensor_threshold_readable(sensor, IPMI_UPPER_NON_CRITICAL, &val); if (val) temp |= SAHPI_STM_UP_MINOR; ipmi_sensor_threshold_readable(sensor, IPMI_UPPER_CRITICAL, &val); if (val) temp |= SAHPI_STM_UP_MAJOR; ipmi_sensor_threshold_readable(sensor, IPMI_UPPER_NON_RECOVERABLE, &val); if (val) temp |= SAHPI_STM_UP_CRIT; val = ipmi_sensor_get_hysteresis_support(sensor); if (val == IPMI_HYSTERESIS_SUPPORT_READABLE || val == IPMI_HYSTERESIS_SUPPORT_SETTABLE) temp |= SAHPI_STM_UP_HYSTERESIS | SAHPI_STM_LOW_HYSTERESIS; rec->ThresholdDefn.ReadThold = temp; } if (access == IPMI_THRESHOLD_ACCESS_SUPPORT_SETTABLE) { temp = 0; ipmi_sensor_threshold_settable(sensor, IPMI_LOWER_NON_CRITICAL, &val); if (val) temp |= SAHPI_STM_LOW_MINOR; ipmi_sensor_threshold_settable(sensor, IPMI_LOWER_CRITICAL, &val); if (val) temp |= SAHPI_STM_LOW_MAJOR; ipmi_sensor_threshold_settable(sensor, IPMI_LOWER_NON_RECOVERABLE, &val); if (val) temp |= SAHPI_STM_LOW_CRIT; ipmi_sensor_threshold_settable(sensor, IPMI_UPPER_NON_CRITICAL, &val); if (val) temp |= SAHPI_STM_UP_MINOR; ipmi_sensor_threshold_settable(sensor, IPMI_UPPER_CRITICAL, &val); if (val) temp |= SAHPI_STM_UP_MAJOR; ipmi_sensor_threshold_settable(sensor, IPMI_UPPER_NON_RECOVERABLE, &val); if (val) temp |= SAHPI_STM_UP_CRIT; val = ipmi_sensor_get_hysteresis_support(sensor); if (val == IPMI_HYSTERESIS_SUPPORT_SETTABLE) temp |= SAHPI_STM_UP_HYSTERESIS | SAHPI_STM_LOW_HYSTERESIS; rec->ThresholdDefn.WriteThold = temp; } } static void add_sensor_event_data_format(ipmi_sensor_t *sensor, SaHpiSensorRecT *rec) { #define FILL_READING(reading, val) \ do { \ (reading).IsSupported = SAHPI_TRUE; \ (reading).Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; \ (reading).Value.SensorFloat64 = (SaHpiFloat64T)val; \ } while (0) int rv; double accur = 0; double fval = 0; if (ipmi_sensor_get_event_reading_type(sensor) != IPMI_EVENT_READING_TYPE_THRESHOLD) { rec->DataFormat.IsSupported = SAHPI_FALSE; return; } rec->DataFormat.IsSupported = SAHPI_TRUE; rec->DataFormat.ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64; rec->DataFormat.BaseUnits = (SaHpiSensorUnitsT) ipmi_sensor_get_base_unit(sensor); rec->DataFormat.ModifierUnits = (SaHpiSensorUnitsT) ipmi_sensor_get_modifier_unit(sensor); rec->DataFormat.ModifierUse = (SaHpiSensorModUnitUseT) ipmi_sensor_get_modifier_unit_use(sensor); ipmi_sensor_get_accuracy(sensor, 0, &accur); rec->DataFormat.AccuracyFactor = (SaHpiFloat64T)accur; rec->DataFormat.Percentage = (SaHpiBoolT) ipmi_sensor_get_percentage(sensor); rec->DataFormat.Range.Flags = 0; rv = ipmi_sensor_get_sensor_max(sensor, &fval); if (!rv) { FILL_READING(rec->DataFormat.Range.Max, fval); rec->DataFormat.Range.Flags |= SAHPI_SRF_MAX; } rv = ipmi_sensor_get_sensor_min(sensor, &fval); if (!rv) { FILL_READING(rec->DataFormat.Range.Min, fval); rec->DataFormat.Range.Flags |= SAHPI_SRF_MIN; } if (ipmi_sensor_get_nominal_reading_specified(sensor)) { rv = ipmi_sensor_get_nominal_reading(sensor, &fval); if (!rv) { FILL_READING(rec->DataFormat.Range.Nominal, fval); rec->DataFormat.Range.Flags |= SAHPI_SRF_NOMINAL; } } if (ipmi_sensor_get_normal_max_specified(sensor)) { rv = ipmi_sensor_get_normal_max(sensor, &fval); if (!rv) { FILL_READING(rec->DataFormat.Range.NormalMax, fval); rec->DataFormat.Range.Flags |= SAHPI_SRF_NORMAL_MAX; } } if (ipmi_sensor_get_normal_min_specified(sensor)) { rv = ipmi_sensor_get_normal_min(sensor, &fval); if (!rv) { FILL_READING(rec->DataFormat.Range.NormalMin, fval); rec->DataFormat.Range.Flags |= SAHPI_SRF_NORMAL_MIN; } } } static SaHpiEventCategoryT ohoi_sensor_get_event_reading_type(ipmi_sensor_t *sensor) { SaHpiEventCategoryT hpi_category; unsigned int ipmi_category; ipmi_category = ipmi_sensor_get_event_reading_type(sensor); switch (ipmi_category) { case IPMI_EVENT_READING_TYPE_DISCRETE_ACPI_POWER: case IPMI_EVENT_READING_TYPE_SENSOR_SPECIFIC: hpi_category = SAHPI_EC_GENERIC; break; default: hpi_category = ipmi_category; break; } return hpi_category; } static void add_sensor_states(ipmi_sensor_t *sensor, struct ohoi_sensor_info *sensor_info) { int i; int val; int rv; sensor_info->support_assert = 0; sensor_info->support_deassert = 0; if(ipmi_sensor_get_event_reading_type(sensor) != IPMI_EVENT_READING_TYPE_THRESHOLD) { for (i = 0; i < 15; i++) { rv = ipmi_sensor_discrete_event_supported(sensor, i, IPMI_ASSERTION, &val); if ((rv == 0) && val) { sensor_info->support_assert |= (1 << i); } rv = ipmi_sensor_discrete_event_supported(sensor, i, IPMI_DEASSERTION, &val); if ((rv == 0) && val) { sensor_info->support_deassert |= (1 << i); } } return; } // threshold sensor rv = ipmi_sensor_threshold_event_supported(sensor, IPMI_LOWER_NON_CRITICAL, IPMI_GOING_LOW, IPMI_ASSERTION, &val); if ((rv == 0) && (val != 0)) { sensor_info->support_assert |= OHOI_THS_LMINL; } rv = ipmi_sensor_threshold_event_supported(sensor, IPMI_LOWER_NON_CRITICAL, IPMI_GOING_HIGH, IPMI_ASSERTION, &val); if ((rv == 0) && (val != 0)) { sensor_info->support_assert |= OHOI_THS_LMINH; } rv = ipmi_sensor_threshold_event_supported(sensor, IPMI_LOWER_NON_CRITICAL, IPMI_GOING_LOW, IPMI_DEASSERTION, &val); if ((rv == 0) && (val != 0)) { sensor_info->support_deassert |= OHOI_THS_LMINL; } rv = ipmi_sensor_threshold_event_supported(sensor, IPMI_LOWER_NON_CRITICAL, IPMI_GOING_HIGH, IPMI_DEASSERTION, &val); if ((rv == 0) && (val != 0)) { sensor_info->support_deassert |= OHOI_THS_LMINH; } rv = ipmi_sensor_threshold_event_supported(sensor, IPMI_LOWER_CRITICAL, IPMI_GOING_LOW, IPMI_ASSERTION, &val); if ((rv == 0) && (val != 0)) { sensor_info->support_assert |= OHOI_THS_LMAJL; } rv = ipmi_sensor_threshold_event_supported(sensor, IPMI_LOWER_CRITICAL, IPMI_GOING_HIGH, IPMI_ASSERTION, &val); if ((rv == 0) && (val != 0)) { sensor_info->support_assert |= OHOI_THS_LMAJH; } rv = ipmi_sensor_threshold_event_supported(sensor, IPMI_LOWER_CRITICAL, IPMI_GOING_LOW, IPMI_DEASSERTION, &val); if ((rv == 0) && (val != 0)) { sensor_info->support_deassert |= OHOI_THS_LMAJL; } rv = ipmi_sensor_threshold_event_supported(sensor, IPMI_LOWER_CRITICAL, IPMI_GOING_HIGH, IPMI_DEASSERTION, &val); if ((rv == 0) && (val != 0)) { sensor_info->support_deassert |= OHOI_THS_LMAJH; } rv = ipmi_sensor_threshold_event_supported(sensor, IPMI_LOWER_NON_RECOVERABLE, IPMI_GOING_LOW, IPMI_ASSERTION, &val); if ((rv == 0) && (val != 0)) { sensor_info->support_assert |= OHOI_THS_LCRTL; } rv = ipmi_sensor_threshold_event_supported(sensor, IPMI_LOWER_NON_RECOVERABLE, IPMI_GOING_HIGH, IPMI_ASSERTION, &val); if ((rv == 0) && (val != 0)) { sensor_info->support_assert |= OHOI_THS_LCRTH; } rv = ipmi_sensor_threshold_event_supported(sensor, IPMI_LOWER_NON_RECOVERABLE, IPMI_GOING_LOW, IPMI_DEASSERTION, &val); if ((rv == 0) && (val != 0)) { sensor_info->support_deassert |= OHOI_THS_LCRTL; } rv = ipmi_sensor_threshold_event_supported(sensor, IPMI_LOWER_NON_RECOVERABLE, IPMI_GOING_HIGH, IPMI_DEASSERTION, &val); if ((rv == 0) && (val != 0)) { sensor_info->support_deassert |= OHOI_THS_LCRTH; } rv = ipmi_sensor_threshold_event_supported(sensor, IPMI_UPPER_NON_CRITICAL, IPMI_GOING_LOW, IPMI_ASSERTION, &val); if ((rv == 0) && (val != 0)) { sensor_info->support_assert |= OHOI_THS_UMINL; } rv = ipmi_sensor_threshold_event_supported(sensor, IPMI_UPPER_NON_CRITICAL, IPMI_GOING_HIGH, IPMI_ASSERTION, &val); if ((rv == 0) && (val != 0)) { sensor_info->support_assert |= OHOI_THS_UMINH; } rv = ipmi_sensor_threshold_event_supported(sensor, IPMI_UPPER_NON_CRITICAL, IPMI_GOING_LOW, IPMI_DEASSERTION, &val); if ((rv == 0) && (val != 0)) { sensor_info->support_deassert |= OHOI_THS_UMINL; } rv = ipmi_sensor_threshold_event_supported(sensor, IPMI_UPPER_NON_CRITICAL, IPMI_GOING_HIGH, IPMI_DEASSERTION, &val); if ((rv == 0) && (val != 0)) { sensor_info->support_deassert |= OHOI_THS_UMINH; } rv = ipmi_sensor_threshold_event_supported(sensor, IPMI_UPPER_CRITICAL, IPMI_GOING_LOW, IPMI_ASSERTION, &val); if ((rv == 0) && (val != 0)) { sensor_info->support_assert |= OHOI_THS_UMAJL; } rv = ipmi_sensor_threshold_event_supported(sensor, IPMI_UPPER_CRITICAL, IPMI_GOING_HIGH, IPMI_ASSERTION, &val); if ((rv == 0) && (val != 0)) { sensor_info->support_assert |= OHOI_THS_UMAJH; } rv = ipmi_sensor_threshold_event_supported(sensor, IPMI_UPPER_CRITICAL, IPMI_GOING_LOW, IPMI_DEASSERTION, &val); if ((rv == 0) && (val != 0)) { sensor_info->support_deassert |= OHOI_THS_UMAJL; } rv = ipmi_sensor_threshold_event_supported(sensor, IPMI_UPPER_CRITICAL, IPMI_GOING_HIGH, IPMI_DEASSERTION, &val); if ((rv == 0) && (val != 0)) { sensor_info->support_deassert |= OHOI_THS_UMAJH; } rv = ipmi_sensor_threshold_event_supported(sensor, IPMI_UPPER_NON_RECOVERABLE, IPMI_GOING_LOW, IPMI_ASSERTION, &val); if ((rv == 0) && (val != 0)) { sensor_info->support_assert |= OHOI_THS_UCRTL; } rv = ipmi_sensor_threshold_event_supported(sensor, IPMI_UPPER_NON_RECOVERABLE, IPMI_GOING_HIGH, IPMI_ASSERTION, &val); if ((rv == 0) && (val != 0)) { sensor_info->support_assert |= OHOI_THS_UCRTH; } rv = ipmi_sensor_threshold_event_supported(sensor, IPMI_UPPER_NON_RECOVERABLE, IPMI_GOING_LOW, IPMI_DEASSERTION, &val); if ((rv == 0) && (val != 0)) { sensor_info->support_deassert |= OHOI_THS_UCRTL; } rv = ipmi_sensor_threshold_event_supported(sensor, IPMI_UPPER_NON_RECOVERABLE, IPMI_GOING_HIGH, IPMI_DEASSERTION, &val); if ((rv == 0) && (val != 0)) { sensor_info->support_deassert |= OHOI_THS_UCRTH; } } static SaHpiEventStateT convert_to_hpi_event_state( ipmi_sensor_t *sensor, struct ohoi_sensor_info *sensor_info) { unsigned int ast = sensor_info->support_assert; unsigned int dst = sensor_info->support_deassert; SaHpiEventStateT hst = 0; if(ipmi_sensor_get_event_reading_type(sensor) != IPMI_EVENT_READING_TYPE_THRESHOLD) { return (SaHpiEventStateT)((ast | dst) & 0x7fff); } if ((ast | dst) & (OHOI_THS_LMINL | OHOI_THS_LMINH)) { hst |= SAHPI_ES_LOWER_MINOR; } if ((ast | dst) & (OHOI_THS_LMAJL | OHOI_THS_LMAJH)) { hst |= SAHPI_ES_LOWER_MAJOR; } if ((ast | dst) & (OHOI_THS_LCRTL | OHOI_THS_LCRTH)) { hst |= SAHPI_ES_LOWER_CRIT; } if ((ast | dst) & (OHOI_THS_UMINL | OHOI_THS_UMINH)) { hst |= SAHPI_ES_UPPER_MINOR; } if ((ast | dst) & (OHOI_THS_UMAJL | OHOI_THS_UMAJH)) { hst |= SAHPI_ES_UPPER_MAJOR; } if ((ast | dst) & (OHOI_THS_UCRTL | OHOI_THS_UCRTH)) { hst |= SAHPI_ES_UPPER_CRIT; } return hst; } static void add_sensor_event_sensor_rec(struct oh_handler_state *handler, ipmi_sensor_t *sensor, SaHpiSensorRecT *rec) { rec->Type = (SaHpiSensorTypeT)ipmi_sensor_get_sensor_type(sensor); if (rec->Type >= 0xc0) { rec->Type = SAHPI_OEM_SENSOR; } rec->Category = ohoi_sensor_get_event_reading_type(sensor); rec->EventCtrl = (SaHpiSensorEventCtrlT)ipmi_sensor_get_event_support(sensor); add_sensor_event_data_format(sensor, rec); add_sensor_event_thresholds(sensor, rec); rec->Oem = ipmi_sensor_get_oem1(sensor); } static void add_sensor_event_rdr(struct oh_handler_state *handler, ipmi_sensor_t *sensor, SaHpiRdrT *rdr, SaHpiEntityPathT parent_ep, SaHpiResourceIdT res_id) { char name[SAHPI_MAX_TEXT_BUFFER_LENGTH]; SaHpiTextTypeT data_type; int name_len; memset(name, '\0', SAHPI_MAX_TEXT_BUFFER_LENGTH); rdr->RecordId = 0; rdr->RdrType = SAHPI_SENSOR_RDR; rdr->Entity = parent_ep; add_sensor_event_sensor_rec(handler, sensor, &rdr->RdrTypeUnion.SensorRec); ipmi_sensor_get_id(sensor, name, SAHPI_MAX_TEXT_BUFFER_LENGTH); data_type = convert_to_hpi_data_type(ipmi_sensor_get_id_type(sensor)); name_len = ipmi_sensor_get_id_length(sensor); if (name_len >= SAHPI_MAX_TEXT_BUFFER_LENGTH) name_len = SAHPI_MAX_TEXT_BUFFER_LENGTH - 1; rdr->IdString.DataType = data_type; rdr->IdString.Language = SAHPI_LANG_ENGLISH; rdr->IdString.DataLength = name_len; switch ( ipmi_sensor_get_event_support(sensor) ) { case IPMI_EVENT_SUPPORT_PER_STATE: rdr->RdrTypeUnion.SensorRec.EventCtrl = SAHPI_SEC_PER_EVENT; rdr->RdrTypeUnion.SensorRec.EnableCtrl = SAHPI_TRUE; break; case IPMI_EVENT_SUPPORT_ENTIRE_SENSOR: rdr->RdrTypeUnion.SensorRec.EventCtrl = SAHPI_SEC_READ_ONLY_MASKS; rdr->RdrTypeUnion.SensorRec.EnableCtrl = SAHPI_TRUE; break; case IPMI_EVENT_SUPPORT_GLOBAL_ENABLE: case IPMI_EVENT_SUPPORT_NONE: rdr->RdrTypeUnion.SensorRec.EventCtrl = SAHPI_SEC_READ_ONLY; break; } memset(rdr->IdString.Data, 0, SAHPI_MAX_TEXT_BUFFER_LENGTH); memcpy(rdr->IdString.Data, name, name_len); } static void add_sensor_event(ipmi_entity_t *ent, ipmi_sensor_t *sensor, struct oh_handler_state *handler, SaHpiRptEntryT *rpt) { struct ohoi_sensor_info *sensor_info; SaHpiRdrT rdr; int lun, num; int rv; sensor_info = malloc(sizeof(*sensor_info)); if (!sensor_info) { err("Out of memory for sensor info"); return; } sensor_info->type = OHOI_SENSOR_ORIGINAL; sensor_info->ohoii.get_sensor_event_enable = orig_get_sensor_event_enable; sensor_info->ohoii.set_sensor_event_enable = orig_set_sensor_event_enable; sensor_info->ohoii.get_sensor_reading = orig_get_sensor_reading; sensor_info->ohoii.get_sensor_thresholds = orig_get_sensor_thresholds; sensor_info->ohoii.set_sensor_thresholds = orig_set_sensor_thresholds; sensor_info->info.orig_sensor_info.sensor_id = ipmi_sensor_convert_to_id(sensor); sensor_info->sen_enabled = SAHPI_TRUE; sensor_info->enable = SAHPI_TRUE; add_sensor_states(sensor, sensor_info); memset(&rdr, 0, sizeof(rdr)); rdr.RdrTypeUnion.SensorRec.Events = convert_to_hpi_event_state(sensor, sensor_info); rv = ipmi_sensor_get_num(sensor, &lun, &num); if(rv) { err("Error getting sensor number"); rdr.RdrTypeUnion.SensorRec.Num = SA_ERR_HPI_INVALID_DATA; } else { rdr.RdrTypeUnion.SensorRec.Num = num; } add_sensor_event_rdr(handler, sensor, &rdr, rpt->ResourceEntity, rpt->ResourceId); adjust_sensor_to_atcahpi_spec(handler, rpt, &rdr, sensor_info, sensor); rv = oh_add_rdr(handler->rptcache, rpt->ResourceId, &rdr, sensor_info, 1); if (rv != SA_OK) { free(sensor_info); err("Failed to add sensor rdr"); } } void ohoi_sensor_event(enum ipmi_update_e op, ipmi_entity_t *ent, ipmi_sensor_t *sensor, void *cb_data) { char name[33]; int rv; ipmi_sensor_id_t sid = ipmi_sensor_convert_to_id(sensor); struct oh_handler_state *handler = cb_data; struct ohoi_handler *ipmi_handler = handler->data; struct ohoi_resource_info *res_info; ipmi_entity_id_t entity_id; SaHpiRptEntryT *rpt_entry; g_static_rec_mutex_lock(&ipmi_handler->ohoih_lock); ipmi_sensor_get_id(sensor, name, 32); entity_id = ipmi_entity_convert_to_id(ent); rpt_entry = ohoi_get_resource_by_entityid(handler->rptcache, &entity_id); if (!rpt_entry) { dump_entity_id("Sensor without RPT Entry?!", entity_id); g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); return; } res_info = oh_get_resource_data(handler->rptcache, rpt_entry->ResourceId); switch (op) { case IPMI_ADDED: trace_ipmi_sensors("ADD", sid); rpt_entry->ResourceCapabilities |= SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_SENSOR; /* fill in the sensor data, add it to ipmi_event_list * and finally to the rpt-cache */ add_sensor_event(ent, sensor, handler, rpt_entry); trace_ipmi("Sensor Added"); if (ipmi_sensor_get_event_reading_type(sensor) == IPMI_EVENT_READING_TYPE_THRESHOLD) { rv = ipmi_sensor_add_threshold_event_handler( sensor, sensor_threshold_event, handler); } else { if (IS_ATCA(ipmi_handler->d_type) && (ipmi_sensor_get_sensor_type(sensor) == 0xF0)) { break; } rv = ipmi_sensor_add_discrete_event_handler( sensor, sensor_discrete_event, handler); } if (rv) err("Unable to reg sensor event handler: %#x\n", rv); break; case IPMI_CHANGED: trace_ipmi_sensors("CHANGED", sid); add_sensor_event(ent, sensor, handler, rpt_entry); dbg("Sensor Changed"); break; case IPMI_DELETED: trace_ipmi_sensors("DELELE", sid); if (ohoi_delete_orig_sensor_rdr(handler, rpt_entry, &sid)) { // no more sensors for rpt rpt_entry->ResourceCapabilities &= ~SAHPI_CAPABILITY_SENSOR; } if ((oh_get_rdr_next(handler->rptcache, rpt_entry->ResourceId, SAHPI_FIRST_ENTRY) == NULL) && (res_info->fru == NULL)) { // no more rdrs for rpt rpt_entry->ResourceCapabilities &= ~SAHPI_CAPABILITY_RDR; } /* We don't do anything, if the entity is gone infrastructre deletes the RDRs automatically */ break; } trace_ipmi("Set updated for resource %d . Sensor", rpt_entry->ResourceId); entity_rpt_set_updated(res_info, ipmi_handler); g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); } /* * get_sensor_by_sensor_id_handler * * This is just callback to get ipmi_sensor_t from ipmi_sensor_id_t * and auxiliary structure to do it */ static void get_sensor_by_sensor_id_handler(ipmi_sensor_t *sensor, void *cb_data) { ipmi_entity_id_t *entity_id = cb_data; if (sensor == NULL) { ipmi_entity_id_set_invalid(entity_id); } *entity_id = ipmi_entity_convert_to_id( ipmi_sensor_get_entity(sensor)); } int ohoi_sensor_ipmi_event_to_hpi_event( struct ohoi_handler *ipmi_handler, ipmi_sensor_id_t sid, ipmi_event_t *event, struct oh_event **e, ipmi_entity_id_t *entity_id ) { // sens_info_t info; enum ipmi_event_dir_e dir; struct oh_event * ev = NULL; unsigned char data[IPMI_EVENT_DATA_MAX_LEN]; unsigned int dt_len; int rv; dt_len = ipmi_event_get_data(event, data, 0, IPMI_EVENT_DATA_MAX_LEN); if (dt_len != 13) { err("Wrong size of ipmi event data = %i", dt_len); return 0; } rv = ipmi_sensor_pointer_cb(sid, get_sensor_by_sensor_id_handler, entity_id); if (rv) { err("no sensor for sensor_id rv = 0x%x", rv); } dir = data[9] >> 7; if ((data[9] & 0x7f) == IPMI_EVENT_READING_TYPE_THRESHOLD) { enum ipmi_thresh_e threshold; enum ipmi_event_value_dir_e high_low; enum ipmi_value_present_e value_present; unsigned int raw_value; double value; threshold = (data[10] >> 1) & 0x07; high_low = data[10] & 1; raw_value = data[11]; value = 0.0; value_present = IPMI_NO_VALUES_PRESENT; ev = sensor_threshold_map_event(dir, threshold, high_low, value_present, raw_value, value, event); } else { int offset; int severity = 0; int prev_severity = 0; offset = data[10] & 0x0f; if ((data[10] >> 6) == 2) { severity = data[11] >> 4; prev_severity = data[11] & 0xf; if (severity == 0xf) { severity = -1; } if (prev_severity == 0xf) { prev_severity = -1; } } ev = sensor_discrete_map_event(ipmi_handler,dir, offset, severity, prev_severity, event); } if (ev == NULL) { return 1; } if (ev->event.EventDataUnion.SensorEvent.SensorNum == 0) { ev->event.EventDataUnion.SensorEvent.SensorNum = data[8]; } *e = ev; return 0; } openhpi-3.6.1/plugins/ipmi/Makefile.am0000644000175100017510000000514412575647300016643 0ustar mohanmohan# # Copyright (c) 2003, Intel Corporation # All rights reserved. # # Redistribution and use in source and binary forms, with or # without modification, are permitted provided that the following # conditions are met: # # Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the distribution. # # Neither the name of Intel Corporation nor the names # of its contributors may be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, # OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # MAINTAINERCLEANFILES = Makefile.in AM_CPPFLAGS = -DG_LOG_DOMAIN=\"ipmi\" EXTRA_DIST = ipmi.sym ekeyfru.h SUBDIRS = t AM_CPPFLAGS += @OPENHPI_INCLUDES@ AM_CFLAGS = @OPENIPMI_CFLAGS@ pkglib_LTLIBRARIES = libipmi.la libipmi_la_SOURCES = ipmi.c \ ipmi_close.c \ ipmi_connection.c \ ipmi_event.c \ ipmi_entity_event.c \ ipmi_mc_event.c \ ipmi_inventory_event.c\ ipmi_sensor_event.c \ ipmi_control_event.c \ ipmi_entity.c \ ipmi_sensor.c \ ipmi_sel.c \ ipmi_inventory.c \ ipmi_controls.c \ ipmi_util.c \ ipmi_drv.c \ hotswap.c \ sync.c \ posix_vlog.c \ atca_shelf_rdrs.c \ atca_slot_rdrs.c \ atca_vshm_rdrs.c \ atca_fru_rdrs.c \ atca_shelf_fru.c \ ipmi.h libipmi_la_LIBADD = $(top_builddir)/utils/libopenhpiutils.la -lncurses -lOpenIPMI -lOpenIPMIposix @OPENIPMI_LIBS@ #libipmi_la_LDFLAGS = -module -version-info @HPI_LIB_VERSION@ -export-symbols $(srcdir)/ipmi.sym libipmi_la_LDFLAGS = -module -version-info @HPI_LIB_VERSION@ -export-dymanic $(srcdir)/ipmi.sym openhpi-3.6.1/plugins/ipmi/ipmi_drv.c0000644000175100017510000002160412575647300016563 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * These routines access the OpenIPMI driver directly, rather * than using OpenIPMI library calls. * * Authors: * Andy Cress * Changes: * 12/01/04 ARCress - created from ipmiutil/ipmimv.c */ #include "ipmi.h" #include #include #include #include #ifdef SCO_UW #include #endif #include #include #include #include #define uchar unsigned char #define IPMI_MAX_ADDR_SIZE 32 #define IPMI_BMC_CHANNEL 0xf #define IPMI_IOC_MAGIC 'i' #ifdef TV_PORT /* use this to define timeval if it is a portability issue */ struct timeval { long int tv_sec; /* (time_t) seconds */ long int tv_usec; /* (suseconds_t) microseconds */ }; #endif struct ipmi_req { unsigned char *addr; /* Address to send the message to. */ unsigned int addr_len; long msgid; /* The sequence number for the message. */ struct ipmi_msg msg; }; struct ipmi_recv { int recv_type; /* Is this a command, response, etc. */ unsigned char *addr; /* Address the message was from */ int addr_len; /* The size of the address buffer. */ long msgid; /* The sequence number from the request */ struct ipmi_msg msg; /* The data field must point to a buffer. */ }; #define IPMICTL_RECEIVE_MSG _IOWR(IPMI_IOC_MAGIC, 12, struct ipmi_recv) #define IPMICTL_RECEIVE_MSG_TRUNC _IOWR(IPMI_IOC_MAGIC, 11, struct ipmi_recv) #define IPMICTL_SEND_COMMAND _IOR(IPMI_IOC_MAGIC, 13, struct ipmi_req) #define IPMICTL_SET_GETS_EVENTS_CMD _IOR(IPMI_IOC_MAGIC, 16, int) #if 0 FILE *fperr = NULL; /* if NULL, no messages */ static int ipmi_timeout_mv = 10; /* 10 seconds, was 5 sec */ static int ipmi_fd = -1; static int curr_seq = 0; #endif //int ipmi_open_mv(void); //int ipmi_close_mv(void); int ipmicmd_mv(struct ohoi_handler *ipmi_handler, uchar cmd, uchar netfn, uchar lun, uchar *pdata, uchar sdata, uchar *presp, int sresp, int *rlen); int ipmicmd_send(ipmi_domain_t *domain, uchar netfn, uchar cmd, uchar lun, uchar chan, uchar *pdata, uchar sdata, ipmi_addr_response_handler_t handler, void *handler_data); int ipmicmd_mc_send(ipmi_mc_t *mc, uchar netfn, uchar cmd, uchar lun, uchar *pdata, uchar sdata, ipmi_mc_response_handler_t handler, void *handler_data); #if 0 int ipmi_open_mv(void) { if (ipmi_fd != -1) return(0); ipmi_fd = open("/dev/ipmi/0", O_RDWR); if (ipmi_fd == -1) ipmi_fd = open("/dev/ipmi0", O_RDWR); if (ipmi_fd == -1) ipmi_fd = open("/dev/ipmidev0", O_RDWR); if (ipmi_fd == -1) ipmi_fd = open("/dev/ipmidev/0", O_RDWR); if (ipmi_fd == -1) return(-1); return(0); } int ipmi_close_mv(void) { int rc = 0; if (ipmi_fd != -1) { rc = close(ipmi_fd); ipmi_fd = -1; } return(rc); } int ipmicmd_mv(uchar cmd, uchar netfn, uchar lun, uchar *pdata, uchar sdata, uchar *presp, int sresp, int *rlen) { fd_set readfds; struct timeval tv; struct ipmi_recv rsp; struct ipmi_addr addr; struct ipmi_req req; struct ipmi_system_interface_addr bmc_addr; int i; int rv; rv = ipmi_open_mv(); if (rv != 0) return(rv); i = 1; rv = ioctl(ipmi_fd, IPMICTL_SET_GETS_EVENTS_CMD, &i); if (rv) { return(errno); } FD_ZERO(&readfds); // FD_SET(0, &readfds); /* dont watch stdin */ FD_SET(ipmi_fd, &readfds); /* only watch ipmi_fd for input */ /* Send the IPMI command */ bmc_addr.addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE; bmc_addr.channel = IPMI_BMC_CHANNEL; bmc_addr.lun = lun; // BMC_LUN = 0 req.addr = (unsigned char *) &bmc_addr; req.addr_len = sizeof(bmc_addr); req.msg.cmd = cmd; req.msg.netfn = netfn; req.msgid = curr_seq; req.msg.data = pdata; req.msg.data_len = sdata; rv = ioctl(ipmi_fd, IPMICTL_SEND_COMMAND, &req); curr_seq++; if (rv == -1) { rv = errno; } if (rv == 0) { tv.tv_sec=ipmi_timeout_mv; tv.tv_usec=0; rv = select(ipmi_fd+1, &readfds, NULL, NULL, &tv); /* expect select rv = 1 here */ if (rv <= 0) { /* no data within 5 seconds */ if (fperr != NULL) fprintf(fperr,"drv select timeout, fd = %d, isset = %d, rv = %d, errno = %d\n", ipmi_fd,FD_ISSET(ipmi_fd, &readfds),rv,errno); if (rv == 0) rv = -3; else rv = errno; } else { /* receive the IPMI response */ rsp.addr = (unsigned char *) &addr; rsp.addr_len = sizeof(addr); rsp.msg.data = presp; rsp.msg.data_len = sresp; rv = ioctl(ipmi_fd, IPMICTL_RECEIVE_MSG_TRUNC, &rsp); if (rv == -1) { if ((errno == EMSGSIZE) && (rsp.msg.data_len == sresp)) rv = 0; /* errno 90 is ok */ else { rv = errno; if (fperr != NULL) fprintf(fperr,"drv rcv_trunc errno = %d, len = %d\n", errno, rsp.msg.data_len); } } else rv = 0; *rlen = rsp.msg.data_len; } } /* ipmi_close_mv(); * rely on the app calling ipmi_close */ return(rv); } #endif int ipmicmd_send(ipmi_domain_t *domain, uchar netfn, uchar cmd, uchar lun, uchar chan, uchar *pdata, uchar sdata, ipmi_addr_response_handler_t handler, void *handler_data) { struct ipmi_system_interface_addr si; struct ipmi_msg msg; /* Send the IPMI command */ si.addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE; si.channel = chan; si.lun = lun; // BMC_LUN = 0 msg.netfn = netfn; msg.cmd = cmd; msg.data = pdata; msg.data_len = sdata; return ipmi_send_command_addr(domain, (ipmi_addr_t *) &si, sizeof(si), &msg, handler, handler_data, NULL); } int ipmicmd_mc_send(ipmi_mc_t *mc, uchar netfn, uchar cmd, uchar lun, uchar *pdata, uchar sdata, ipmi_mc_response_handler_t handler, void *handler_data) { struct ipmi_msg msg; msg.netfn = netfn; msg.cmd = cmd; msg.data = pdata; msg.data_len = sdata; return ipmi_mc_send_command(mc, lun, &msg, handler, handler_data); } typedef struct { uchar cmd; uchar netfn; uchar lun; uchar *pdata; uchar sdata; uchar *presp; int sresp; int *rlen; SaErrorT rv; int done; } ipmicmd_mv_arg_t; static int ipmicmd_mv_handler( ipmi_domain_t *domain, ipmi_msgi_t *rspi) { ipmicmd_mv_arg_t *info = rspi->data1; ipmi_msg_t *msg = &rspi->msg; if (domain == NULL) { err("domain == NULL"); info->rv = SA_ERR_HPI_INVALID_PARAMS; info->done = 1; return IPMI_MSG_ITEM_NOT_USED; } if (info->sresp < msg->data_len) { err("info->sresp(%d) < msg->data_len(%d)", info->sresp, msg->data_len); info->done = 1; info->rv = SA_ERR_HPI_OUT_OF_SPACE; return IPMI_MSG_ITEM_NOT_USED; } memcpy(info->presp, msg->data, msg->data_len); *info->rlen = msg->data_len; info->done = 1; return IPMI_MSG_ITEM_NOT_USED; } static void ipmicmd_mv_cb(ipmi_domain_t *domain, void *cb_data) { ipmicmd_mv_arg_t *info = cb_data; int rv; rv = ipmicmd_send(domain, info->netfn, info->cmd, info->lun, 0, info->pdata, info->sdata, ipmicmd_mv_handler, cb_data); if (rv != 0) { err("ipmicmd_send = %d", rv); OHOI_MAP_ERROR(info->rv, rv); info->done = 1; } } int ipmicmd_mv(struct ohoi_handler *ipmi_handler, uchar cmd, uchar netfn, uchar lun, uchar *pdata, uchar sdata, uchar *presp, int sresp, int *rlen) { ipmicmd_mv_arg_t info; int rv; info.cmd = cmd; info.netfn = netfn; info.lun = lun; info.pdata = pdata; info.sdata = sdata; info.presp = presp; info.sresp = sresp; info.rlen = rlen; info.rv = 0; info.done = 0; rv = ipmi_domain_pointer_cb(ipmi_handler->domain_id, ipmicmd_mv_cb, &info); if (rv != 0) { err("ipmi_domain_pointer_cb = %d", rv); return SA_ERR_HPI_BUSY; } rv = ohoi_loop(&info.done, ipmi_handler); if (rv != SA_OK) { err("ohoi_loop = %d", rv); return rv; } return info.rv; } #ifdef TEST int main(int argc, char *argv[]) { fd_set readfds; struct timeval tv; char data[40]; int i, j; int err; int rlen; err = ipmicmd_mv(0x01, 0x06, 0, NULL, 0, data, sizeof(data), &rlen); printf("ipmicmd_mv ret=%d, cc=%02x\n",err,(uchar)data[0]); printf(" ** Return Code: %2.2X\n", data[0]); printf(" ** Data[%d]: ",rlen); for (i=1; i < rlen; i++) printf("%2.2X ", (uchar)data[i]); printf("\n"); printf("\n"); ipmi_close_mv(); return 0; } #endif openhpi-3.6.1/plugins/ipmi/atca_slot_rdrs.c0000644000175100017510000006736512575647300017773 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (c) 2005 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Denis Sadykov */ #include "ipmi.h" #define uchar unsigned char int ipmicmd_mc_send(ipmi_mc_t *mc, uchar netfn, uchar cmd, uchar lun, uchar *pdata, uchar sdata, ipmi_mc_response_handler_t handler, void *handler_data); static void atca_shelf_record_get(ipmi_entity_t *entity, unsigned char record_type, unsigned int *record_ver, unsigned int *record_num, unsigned char **record, unsigned int *record_len) { ipmi_fru_t *fru; unsigned char data[256]; unsigned int num; unsigned int len; unsigned char ver, type; unsigned int r_num; int rv; fru = ipmi_entity_get_fru(entity); r_num = ipmi_fru_get_num_multi_records(fru); *record = NULL; for (num = 0; num < r_num; num++) { len = 256; rv = ipmi_fru_get_multi_record_data(fru, num, data, &len); if (rv != 0) { continue; } rv = ipmi_fru_get_multi_record_type(fru, num, &type); if (rv) { continue; } if (type != 0xc0) { continue; } rv = ipmi_fru_get_multi_record_format_version(fru, num, &ver); if (rv) { continue; } if ((ver & 0x0f) != 0x2) { continue; } if (len < 5) { continue; } if ((data[0] | (data[1] << 8) | (data[2] << 16)) != ATCAHPI_PICMG_MID) { continue; } if (data[3] != record_type) { continue; } *record = malloc(len); memcpy(*record, data, len); *record_len = len; *record_ver = ver; *record_num = num; break; } } static void get_atca_fru_pwr_desc_cb(ipmi_entity_t *entity, void *cb_data) { atca_common_info_t *info = cb_data; unsigned char *data; unsigned int len, offset, ver, num_rec; unsigned int i; info->len = offset = 0; atca_shelf_record_get(entity, 0x12, &ver, &num_rec, &data, &len); if (data == NULL) { info->done = 1; return; } for (i = 0; i < data[6]; i++) { if (data[7 + i*5] << 1 == info->addr) { memcpy(info->data + offset, data + 7 + i*5, 5); offset += 5; } } free(data); info->len = offset; info->done = 1; } /*--------------- Slot State Sensor --------------------------------------*/ static SaErrorT atca_slot_state_sensor_event_enable_get( struct oh_handler_state *hnd, struct ohoi_sensor_info *sinfo, SaHpiBoolT *enable, SaHpiEventStateT *assert, SaHpiEventStateT *deassert) { *assert = sinfo->assert; *deassert = 0; *enable = sinfo->info.atcamap_sensor_info.val; return SA_OK; } static SaErrorT atca_slot_state_sensor_event_enable_set( struct oh_handler_state *hnd, struct ohoi_sensor_info *sinfo, SaHpiBoolT enable, SaHpiEventStateT assert, SaHpiEventStateT deassert, unsigned int a_supported, unsigned int d_supported) { if (deassert != 0) { return SA_ERR_HPI_INVALID_DATA; } if ((assert & ~(SAHPI_ES_PRESENT | SAHPI_ES_ABSENT))) { return SA_ERR_HPI_INVALID_DATA; } sinfo->enable = enable; sinfo->assert = assert; sinfo->info.atcamap_sensor_info.val = enable; return SA_OK; } static SaHpiRptEntryT *atca_get_slot_state(struct oh_handler_state *handler, struct ohoi_resource_info *slot_info) { SaHpiRptEntryT *rpt; struct ohoi_resource_info *ent_info; if (handler == NULL || slot_info == NULL) { return NULL; } rpt = ohoi_get_resource_by_entityid(handler->rptcache, &slot_info->u.slot.entity_id); if (!rpt) { return NULL; } ent_info = (struct ohoi_resource_info *) oh_get_resource_data(handler->rptcache, rpt->ResourceId); if (ent_info->presence == 0) { return NULL; } else { return rpt; } } static SaErrorT atca_get_slot_state_reading(struct oh_handler_state *handler, struct ohoi_sensor_info *sensor_info, SaHpiSensorReadingT *reading, SaHpiEventStateT *ev_state) { struct ohoi_resource_info *res_info; SaHpiRptEntryT *rpt; reading->IsSupported = TRUE; reading->Type = SAHPI_SENSOR_READING_TYPE_UINT64; res_info = (struct ohoi_resource_info *) oh_get_resource_data(handler->rptcache, sensor_info->info.atcamap_sensor_info.rid); rpt = atca_get_slot_state(handler, res_info); if (rpt) { reading->Value.SensorUint64 = rpt->ResourceId; } else { reading->Value.SensorUint64 = SAHPI_UNSPECIFIED_RESOURCE_ID; } if (ev_state) { if (reading->Value.SensorUint64 == SAHPI_UNSPECIFIED_RESOURCE_ID) { *ev_state = SAHPI_ES_ABSENT; } else { *ev_state = SAHPI_ES_PRESENT; } } return SA_OK; } void atca_slot_state_sensor_event_send(struct oh_handler_state *handler, SaHpiRptEntryT *dev_entry, int present) { SaHpiResourceIdT rid; struct oh_event *e; SaHpiSensorEventT *sen_evt; SaHpiRdrT *rdr; struct ohoi_sensor_info *sensor_info; if (!dev_entry) { return; } rid = ohoi_get_parent_id(dev_entry); if (rid == 0) { return; } rdr = oh_get_rdr_by_type(handler->rptcache, rid, SAHPI_SENSOR_RDR, ATCAHPI_SENSOR_NUM_SLOT_STATE); if (!rdr) { return; } sensor_info = (struct ohoi_sensor_info *) oh_get_rdr_data(handler->rptcache, rid, rdr->RecordId); if (!sensor_info) { return; } if (sensor_info->sen_enabled == SAHPI_FALSE || sensor_info->info.atcamap_sensor_info.val == SAHPI_FALSE) { return; } if (present && !(sensor_info->assert & SAHPI_ES_PRESENT)) { return; } if (!present && !(sensor_info->assert & SAHPI_ES_ABSENT)) { return; } e = malloc(sizeof(*e)); if (!e) { return; } memset(e, 0, sizeof(*e)); e->resource = *dev_entry; e->rdrs = g_slist_append(e->rdrs, g_memdup(rdr, sizeof(SaHpiRdrT))); e->event.Source = rid; e->event.EventType = SAHPI_ET_SENSOR; e->event.Severity = SAHPI_INFORMATIONAL; oh_gettimeofday(&e->event.Timestamp); sen_evt = &(e->event.EventDataUnion.SensorEvent); sen_evt->SensorNum = ATCAHPI_SENSOR_NUM_SLOT_STATE; sen_evt->SensorType = SAHPI_OEM_SENSOR; sen_evt->EventCategory = SAHPI_EC_PRESENCE; sen_evt->Assertion = SAHPI_TRUE; sen_evt->EventState = present ? SAHPI_ES_PRESENT : SAHPI_ES_ABSENT; sen_evt->OptionalDataPresent = SAHPI_SOD_PREVIOUS_STATE | SAHPI_SOD_CURRENT_STATE; sen_evt->CurrentState = present ? SAHPI_ES_PRESENT : SAHPI_ES_ABSENT; sen_evt->PreviousState = present ? SAHPI_ES_ABSENT : SAHPI_ES_PRESENT; e->hid = handler->hid; oh_evt_queue_push(handler->eventq, e); } static SaHpiRdrT *atca_create_slot_state_sensor( struct ohoi_handler *ipmi_handler, struct ohoi_sensor_info **s_info) { SaHpiRdrT *rdr; struct ohoi_sensor_info *l_s_info; rdr = malloc(sizeof (SaHpiRdrT)); if (rdr == NULL) { err("Out of memory"); return NULL; } l_s_info = malloc(sizeof (struct ohoi_sensor_info)); if (l_s_info == NULL) { err("Out of memory"); free(rdr); return NULL; } memset(rdr, 0, sizeof (SaHpiRdrT)); memset(l_s_info, 0, sizeof (struct ohoi_sensor_info)); rdr->RdrType = SAHPI_SENSOR_RDR; rdr->IsFru = SAHPI_FALSE; rdr->RdrTypeUnion.SensorRec.Num = ATCAHPI_SENSOR_NUM_SLOT_STATE; rdr->RdrTypeUnion.SensorRec.Type = SAHPI_ENTITY_PRESENCE; rdr->RdrTypeUnion.SensorRec.Category = SAHPI_EC_PRESENCE; rdr->RdrTypeUnion.SensorRec.EnableCtrl = SAHPI_TRUE; rdr->RdrTypeUnion.SensorRec.EventCtrl = SAHPI_SEC_PER_EVENT; rdr->RdrTypeUnion.SensorRec.Events = SAHPI_ES_PRESENT | SAHPI_ES_ABSENT; rdr->RdrTypeUnion.SensorRec.DataFormat.IsSupported = SAHPI_TRUE; rdr->RdrTypeUnion.SensorRec.DataFormat.ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64; rdr->RdrTypeUnion.SensorRec.DataFormat.BaseUnits = SAHPI_SU_UNSPECIFIED; rdr->RdrTypeUnion.SensorRec.DataFormat.ModifierUnits = SAHPI_SU_UNSPECIFIED; rdr->RdrTypeUnion.SensorRec.DataFormat.ModifierUse = SAHPI_SMUU_NONE; rdr->RdrTypeUnion.SensorRec.DataFormat.Percentage = SAHPI_FALSE; rdr->RdrTypeUnion.SensorRec.DataFormat.Range.Flags = 0x0; rdr->RdrTypeUnion.SensorRec.DataFormat.AccuracyFactor = 0.00; rdr->RdrTypeUnion.SensorRec.ThresholdDefn.IsAccessible = SAHPI_FALSE; oh_init_textbuffer(&rdr->IdString); oh_append_textbuffer(&rdr->IdString, "Slot State Sensor"); l_s_info->ohoii.get_sensor_event_enable = atca_slot_state_sensor_event_enable_get; l_s_info->ohoii.set_sensor_event_enable = atca_slot_state_sensor_event_enable_set; l_s_info->ohoii.get_sensor_reading = atca_get_slot_state_reading; l_s_info->ohoii.get_sensor_thresholds = NULL; l_s_info->ohoii.set_sensor_thresholds = NULL; l_s_info->support_assert = SAHPI_ES_PRESENT | SAHPI_ES_ABSENT; l_s_info->support_deassert = 0; l_s_info->assert = SAHPI_ES_PRESENT | SAHPI_ES_ABSENT; l_s_info->deassert = 0; l_s_info->sen_enabled = SAHPI_TRUE; l_s_info->enable = SAHPI_TRUE; l_s_info->info.atcamap_sensor_info.data = NULL; l_s_info->info.atcamap_sensor_info.val = SAHPI_FALSE; l_s_info->type = OHOI_SENSOR_ATCA_MAPPED; *s_info = l_s_info; return rdr; } /* ---------------- FRU activation control ------------------------------ */ struct fru_act_ctrl_state_s { SaHpiCtrlModeT mode; SaHpiInt32T state; }; static SaErrorT get_atca_fru_activation_control_state( struct oh_handler_state *hnd, struct ohoi_control_info *c_info, SaHpiRdrT * rdr, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state) { struct ohoi_handler *ipmi_handler = (struct ohoi_handler *) hnd->data; struct ohoi_resource_info *shelf_info, *slot_info; atca_common_info_t info; int rv; shelf_info = (struct ohoi_resource_info *) oh_get_resource_data(hnd->rptcache, ipmi_handler->atca_shelf_id); if (shelf_info == NULL) { return SA_ERR_HPI_INTERNAL_ERROR; } slot_info = (struct ohoi_resource_info *) oh_get_resource_data(hnd->rptcache, c_info->info.atcamap_ctrl_info.rid); if (slot_info == NULL) { return SA_ERR_HPI_INTERNAL_ERROR; } info.done = 0; info.rv = 0; info.addr = slot_info->u.slot.addr; info.devid = slot_info->u.slot.devid; rv = ipmi_entity_pointer_cb(shelf_info->u.entity.entity_id, get_atca_fru_pwr_desc_cb, &info); if (rv) { return SA_ERR_HPI_INTERNAL_ERROR; } rv = ohoi_loop(&info.done, ipmi_handler); if (rv != SA_OK) { return rv; } if (info.len == 0) { return SA_ERR_HPI_INTERNAL_ERROR; } if (mode) { if (info.data[4] >> 6) { *mode = c_info->mode = SAHPI_CTRL_MODE_AUTO; } else { *mode = c_info->mode = SAHPI_CTRL_MODE_MANUAL; } } if (state == NULL) { return SA_OK; } state->Type = SAHPI_CTRL_TYPE_ANALOG; state->StateUnion.Analog = (info.data[4] & 0x3F); return SA_OK; } static void set_atca_fru_activation_control_state_cb(ipmi_entity_t *entity, void *cb_data) { atca_common_info_t *info = cb_data; unsigned char *data; unsigned int len, offset, ver, num_rec; unsigned int i; int rv; struct fru_act_ctrl_state_s *ctrl_state = info->info; info->len = offset = 0; atca_shelf_record_get(entity, 0x12, &ver, &num_rec, &data, &len); if (data == NULL) { info->rv = SA_ERR_HPI_INTERNAL_ERROR; info->done = 1; return; } for (i = 0; i < data[6]; i++) { if (data[7 + i*5] << 1 == info->addr) { if (ctrl_state->mode) { data[11 + i*5] = ctrl_state->state | (!ctrl_state->mode << 6); } else { data[11 + i*5] |= (!ctrl_state->mode << 6); } } } rv = ipmi_fru_set_multi_record(ipmi_entity_get_fru(entity), num_rec, 0xC0, ver, data, len); free(data); if (rv != 0) { info->rv = SA_ERR_HPI_INTERNAL_ERROR; } info->done = 1; } static SaErrorT set_atca_fru_activation_control_state( struct oh_handler_state *hnd, struct ohoi_control_info *c_info, SaHpiRdrT *rdr, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state) { struct ohoi_handler *ipmi_handler = (struct ohoi_handler *) hnd->data; struct ohoi_resource_info *shelf_info, *slot_info; atca_common_info_t info; struct fru_act_ctrl_state_s ctrl_state; int rv; if (state == NULL) { return SA_ERR_HPI_INVALID_DATA; } if (state->Type != SAHPI_CTRL_TYPE_ANALOG) { return SA_ERR_HPI_INVALID_DATA; } shelf_info = (struct ohoi_resource_info *) oh_get_resource_data(hnd->rptcache, ipmi_handler->atca_shelf_id); if (shelf_info == NULL) { return SA_ERR_HPI_INTERNAL_ERROR; } slot_info = (struct ohoi_resource_info *) oh_get_resource_data(hnd->rptcache, c_info->info.atcamap_ctrl_info.rid); if (slot_info == NULL) { return SA_ERR_HPI_INTERNAL_ERROR; } info.done = 0; info.rv = 0; info.addr = slot_info->u.slot.addr; info.devid = slot_info->u.slot.devid; ctrl_state.mode = mode; ctrl_state.state = state->StateUnion.Analog; info.info = &ctrl_state; rv = ipmi_entity_pointer_cb(shelf_info->u.entity.entity_id, set_atca_fru_activation_control_state_cb, &info); if (rv) { return SA_ERR_HPI_INTERNAL_ERROR; } rv = ohoi_loop(&info.done, ipmi_handler); if (rv != SA_OK) { return rv; } return info.rv; } static SaHpiRdrT *atca_create_fru_activation_control( struct oh_handler_state *handler, SaHpiRptEntryT *slot, struct ohoi_control_info **c_info) { SaHpiRdrT *rdr; struct ohoi_control_info *l_c_info; rdr = malloc(sizeof (SaHpiRdrT)); if (rdr == NULL) { err("Out of memory"); return NULL; } l_c_info = malloc(sizeof (struct ohoi_control_info)); if (l_c_info == NULL) { err("Out of memory"); free(rdr); return NULL; } memset(rdr, 0, sizeof (SaHpiRdrT)); memset(l_c_info, 0, sizeof (struct ohoi_control_info)); rdr->RdrType = SAHPI_CTRL_RDR; rdr->IsFru = SAHPI_FALSE; rdr->RdrTypeUnion.CtrlRec.Num = ATCAHPI_CTRL_NUM_FRU_ACTIVATION; rdr->RdrTypeUnion.CtrlRec.OutputType = SAHPI_CTRL_GENERIC; rdr->RdrTypeUnion.CtrlRec.Type = SAHPI_CTRL_TYPE_ANALOG; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Analog.Min = 0; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Analog.Max = 0x3f; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Analog.Default = 0; rdr->RdrTypeUnion.CtrlRec.DefaultMode.Mode = SAHPI_CTRL_MODE_AUTO; rdr->RdrTypeUnion.CtrlRec.DefaultMode.ReadOnly = SAHPI_FALSE; rdr->RdrTypeUnion.CtrlRec.WriteOnly = SAHPI_FALSE; oh_init_textbuffer(&rdr->IdString); oh_append_textbuffer(&rdr->IdString, "FRU activation control"); l_c_info->ohoii.get_control_state = get_atca_fru_activation_control_state; l_c_info->ohoii.set_control_state = set_atca_fru_activation_control_state; l_c_info->mode = SAHPI_CTRL_MODE_AUTO; l_c_info->type = OHOI_CTRL_ATCA_MAPPED; *c_info = l_c_info; return rdr; } /*----------------------- Assigned Power Sensor -----------------------------*/ struct assigned_pwr_sensor_s { SaHpiFloat64T ass_pwr; }; static void _atca_get_assigned_pwr_cb(ipmi_mc_t *mc, ipmi_msg_t *msg, void *rsp_data) { atca_common_info_t *info = rsp_data; int rv = msg->data[0]; struct assigned_pwr_sensor_s *ass_pwr = (struct assigned_pwr_sensor_s *)info->info; if (mc == NULL) { info->rv = SA_ERR_HPI_ENTITY_NOT_PRESENT; info->done = 1; return; } if (rv == 0xc1) { info->rv = SA_ERR_HPI_INVALID_CMD; } else if (rv == 0xc3) { info->rv = SA_ERR_HPI_NO_RESPONSE; } else if (rv != 0) { info->rv = SA_ERR_HPI_INVALID_PARAMS; } else { ass_pwr->ass_pwr = (SaHpiFloat64T) (msg->data[msg->data_len - 1] * (msg->data[4] / 10)); } info->done = 1; return; }; static void atca_get_assigned_pwr_cb(ipmi_mc_t *mc, void *cb_data) { atca_common_info_t *info = cb_data; unsigned char data[25]; int rv; memset(data, 0, 25); data[0] = IPMI_PICMG_GRP_EXT; data[1] = info->devid; data[2] = 0; rv = ipmicmd_mc_send(mc, IPMI_GROUP_EXTENSION_NETFN, IPMI_PICMG_CMD_GET_POWER_LEVEL, 0, data, 3, _atca_get_assigned_pwr_cb, cb_data); if (rv != 0) { err("ipmicmd_send = 0x%x\n", rv); OHOI_MAP_ERROR(info->rv, rv); return; } return; } static SaErrorT atca_get_assigned_pwr_reading(struct oh_handler_state *handler, struct ohoi_sensor_info *s_info, SaHpiSensorReadingT *reading, SaHpiEventStateT *ev_state) { struct ohoi_handler *ipmi_handler = (struct ohoi_handler *)handler->data; struct ohoi_resource_info *slot_info, *ent_info; atca_common_info_t info; struct assigned_pwr_sensor_s ass_pwr; SaHpiRptEntryT *rpt; SaErrorT rv; reading->IsSupported = FALSE; if (ev_state) { *ev_state = 0; } slot_info = (struct ohoi_resource_info *) oh_get_resource_data(handler->rptcache, s_info->info.atcamap_sensor_info.rid); rpt = atca_get_slot_state(handler, slot_info); if (!rpt) { reading->Value.SensorFloat64 = 0; } else { ent_info = (struct ohoi_resource_info *) oh_get_resource_data(handler->rptcache, rpt->ResourceId); info.done = 0; info.rv = SA_OK; info.addr = slot_info->u.slot.addr; info.devid = slot_info->u.slot.devid; info.info = &ass_pwr; rv = ipmi_mc_pointer_cb(ent_info->u.entity.mc_id, atca_get_assigned_pwr_cb, &info); if (rv != 0) { err("ipmi_domain_pointer_cb = 0x%x", rv); return SA_ERR_HPI_INTERNAL_ERROR; } rv = ohoi_loop(&info.done, ipmi_handler); if (rv != SA_OK) { err("ohoi_loop = 0x%x", rv); return SA_ERR_HPI_INTERNAL_ERROR; } if (info.rv != SA_OK) { err("info.rv = 0x%x\n", info.rv); return info.rv; } reading->Value.SensorFloat64 = ass_pwr.ass_pwr; } reading->IsSupported = TRUE; reading->Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; return SA_OK; } static SaErrorT atca_assigned_pwr_sensor_event_enable_get( struct oh_handler_state *hnd, struct ohoi_sensor_info *sinfo, SaHpiBoolT *enable, SaHpiEventStateT *assert, SaHpiEventStateT *deassert) { *assert = sinfo->assert; *deassert = sinfo->deassert; *enable = sinfo->info.atcamap_sensor_info.val; return SA_OK; } static SaErrorT atca_get_assigned_pwr_thresholds(struct oh_handler_state *hnd, struct ohoi_sensor_info *sinfo, SaHpiSensorThresholdsT *thres) { memset(thres, 0, sizeof (SaHpiSensorThresholdsT)); thres->LowCritical.IsSupported = SAHPI_TRUE; thres->LowCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; thres->LowCritical.Value.SensorFloat64 = 0; thres->UpCritical.IsSupported = SAHPI_TRUE; thres->UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; thres->UpCritical.Value.SensorFloat64 = 400; return SA_OK; } static SaHpiRdrT *atca_create_assigned_pwr_sensor( struct ohoi_handler *ipmi_handler, struct ohoi_sensor_info **s_info) { SaHpiRdrT *rdr; struct ohoi_sensor_info *l_s_info; rdr = malloc(sizeof (SaHpiRdrT)); if (rdr == NULL) { err("Out of memory"); return NULL; } l_s_info = malloc(sizeof (struct ohoi_sensor_info)); if (l_s_info == NULL) { err("Out of memory"); free(rdr); return NULL; } memset(rdr, 0, sizeof (SaHpiRdrT)); memset(l_s_info, 0, sizeof (struct ohoi_sensor_info)); rdr->RdrType = SAHPI_SENSOR_RDR; rdr->IsFru = SAHPI_FALSE; rdr->RdrTypeUnion.SensorRec.Num = ATCAHPI_SENSOR_NUM_ASSIGNED_PWR; rdr->RdrTypeUnion.SensorRec.Type = SAHPI_OTHER_UNITS_BASED_SENSOR; rdr->RdrTypeUnion.SensorRec.Category = SAHPI_EC_THRESHOLD; rdr->RdrTypeUnion.SensorRec.EnableCtrl = SAHPI_TRUE; rdr->RdrTypeUnion.SensorRec.EventCtrl = SAHPI_SEC_READ_ONLY; rdr->RdrTypeUnion.SensorRec.Events = 0; rdr->RdrTypeUnion.SensorRec.DataFormat.IsSupported = SAHPI_TRUE; rdr->RdrTypeUnion.SensorRec.DataFormat.ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64; rdr->RdrTypeUnion.SensorRec.DataFormat.BaseUnits = SAHPI_SU_WATTS; rdr->RdrTypeUnion.SensorRec.DataFormat.ModifierUnits = SAHPI_SU_UNSPECIFIED; rdr->RdrTypeUnion.SensorRec.DataFormat.ModifierUse = SAHPI_SMUU_NONE; rdr->RdrTypeUnion.SensorRec.DataFormat.Percentage = SAHPI_FALSE; rdr->RdrTypeUnion.SensorRec.DataFormat.Range.Flags = SAHPI_SRF_MIN | SAHPI_SRF_MAX; rdr->RdrTypeUnion.SensorRec.DataFormat.Range.Max.IsSupported = SAHPI_TRUE; rdr->RdrTypeUnion.SensorRec.DataFormat.Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; rdr->RdrTypeUnion.SensorRec.DataFormat.Range.Max.Value.SensorFloat64 = 400; rdr->RdrTypeUnion.SensorRec.DataFormat.Range.Min.IsSupported = SAHPI_TRUE; rdr->RdrTypeUnion.SensorRec.DataFormat.Range.Min.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; rdr->RdrTypeUnion.SensorRec.DataFormat.Range.Min.Value.SensorFloat64 = 0; rdr->RdrTypeUnion.SensorRec.DataFormat.AccuracyFactor = 0.1; rdr->RdrTypeUnion.SensorRec.ThresholdDefn.IsAccessible = SAHPI_TRUE; rdr->RdrTypeUnion.SensorRec.ThresholdDefn.ReadThold = SAHPI_STM_LOW_CRIT | SAHPI_STM_UP_CRIT; rdr->RdrTypeUnion.SensorRec.ThresholdDefn.WriteThold = 0; rdr->RdrTypeUnion.SensorRec.ThresholdDefn.Nonlinear = SAHPI_FALSE; oh_init_textbuffer(&rdr->IdString); oh_append_textbuffer(&rdr->IdString, "Assigned Power Sensor"); l_s_info->ohoii.get_sensor_event_enable = atca_assigned_pwr_sensor_event_enable_get; l_s_info->ohoii.set_sensor_event_enable = NULL; l_s_info->ohoii.get_sensor_reading = atca_get_assigned_pwr_reading; l_s_info->ohoii.get_sensor_thresholds = atca_get_assigned_pwr_thresholds; l_s_info->ohoii.set_sensor_thresholds = NULL; l_s_info->support_assert = 0; l_s_info->support_deassert = 0; l_s_info->assert = 0; l_s_info->deassert = 0; l_s_info->sen_enabled = SAHPI_TRUE; l_s_info->enable = SAHPI_TRUE; l_s_info->info.atcamap_sensor_info.data = NULL; l_s_info->info.atcamap_sensor_info.val = SAHPI_FALSE; l_s_info->type = OHOI_SENSOR_ATCA_MAPPED; *s_info = l_s_info; return rdr; } /*-------------- Maximum Power Capability Sensor ----------------------------*/ static SaErrorT atca_get_max_pwr_capability_event_enable( struct oh_handler_state *hnd, struct ohoi_sensor_info *sinfo, SaHpiBoolT *enable, SaHpiEventStateT *assert, SaHpiEventStateT *deassert) { *assert = 0; *deassert = 0; *enable = SAHPI_FALSE; return SA_OK; } static SaErrorT atca_get_max_pwr_capability_reading( struct oh_handler_state *hnd, struct ohoi_sensor_info *s_info, SaHpiSensorReadingT *reading, SaHpiEventStateT *ev_state) { struct ohoi_handler *ipmi_handler = (struct ohoi_handler *) hnd->data; struct ohoi_resource_info *shelf_info, *slot_info; atca_common_info_t info; int rv; reading->IsSupported = FALSE; if (ev_state) { *ev_state = 0; } shelf_info = (struct ohoi_resource_info *) oh_get_resource_data(hnd->rptcache, ipmi_handler->atca_shelf_id); if (shelf_info == NULL) { return SA_ERR_HPI_INTERNAL_ERROR; } slot_info = (struct ohoi_resource_info *) oh_get_resource_data(hnd->rptcache, s_info->info.atcamap_sensor_info.rid); if (slot_info == NULL) { return SA_ERR_HPI_INTERNAL_ERROR; } info.done = 0; info.rv = 0; info.addr = slot_info->u.slot.addr; info.devid = slot_info->u.slot.devid; rv = ipmi_entity_pointer_cb(shelf_info->u.entity.entity_id, get_atca_fru_pwr_desc_cb, &info); if (rv) { return SA_ERR_HPI_INTERNAL_ERROR; } rv = ohoi_loop(&info.done, ipmi_handler); if (rv != SA_OK) { return rv; } if (info.len == 0) { return SA_ERR_HPI_INTERNAL_ERROR; } memcpy(&reading->Value.SensorUint64, info.data + 2, 2); reading->IsSupported = TRUE; reading->Type = SAHPI_SENSOR_READING_TYPE_UINT64; return SA_OK; } static SaHpiRdrT *atca_create_max_pwr_capability_sensor( struct ohoi_handler *ipmi_handler, struct ohoi_sensor_info **s_info) { SaHpiRdrT *rdr; struct ohoi_sensor_info *l_s_info; rdr = malloc(sizeof (SaHpiRdrT)); if (rdr == NULL) { err("Out of memory"); return NULL; } l_s_info = malloc(sizeof (struct ohoi_sensor_info)); if (l_s_info == NULL) { err("Out of memory"); free(rdr); return NULL; } memset(rdr, 0, sizeof (SaHpiRdrT)); memset(l_s_info, 0, sizeof (struct ohoi_sensor_info)); rdr->RdrType = SAHPI_SENSOR_RDR; rdr->IsFru = SAHPI_FALSE; rdr->RdrTypeUnion.SensorRec.Num = ATCAHPI_SENSOR_NUM_MAX_PWR; rdr->RdrTypeUnion.SensorRec.Type = SAHPI_OTHER_UNITS_BASED_SENSOR; rdr->RdrTypeUnion.SensorRec.Category = SAHPI_EC_THRESHOLD; rdr->RdrTypeUnion.SensorRec.EnableCtrl = SAHPI_TRUE; rdr->RdrTypeUnion.SensorRec.EventCtrl = SAHPI_SEC_READ_ONLY; rdr->RdrTypeUnion.SensorRec.Events = 0; rdr->RdrTypeUnion.SensorRec.DataFormat.IsSupported = SAHPI_TRUE; rdr->RdrTypeUnion.SensorRec.DataFormat.ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64; rdr->RdrTypeUnion.SensorRec.DataFormat.BaseUnits = SAHPI_SU_WATTS; rdr->RdrTypeUnion.SensorRec.DataFormat.ModifierUnits = SAHPI_SU_UNSPECIFIED; rdr->RdrTypeUnion.SensorRec.DataFormat.ModifierUse = SAHPI_SMUU_NONE; rdr->RdrTypeUnion.SensorRec.DataFormat.Percentage = SAHPI_FALSE; rdr->RdrTypeUnion.SensorRec.DataFormat.Range.Flags = SAHPI_SRF_MIN | SAHPI_SRF_MAX; rdr->RdrTypeUnion.SensorRec.DataFormat.Range.Max.IsSupported = SAHPI_TRUE; rdr->RdrTypeUnion.SensorRec.DataFormat.Range.Max.Type = SAHPI_SENSOR_READING_TYPE_UINT64; rdr->RdrTypeUnion.SensorRec.DataFormat.Range.Max.Value.SensorUint64 = 800; rdr->RdrTypeUnion.SensorRec.DataFormat.Range.Min.IsSupported = SAHPI_TRUE; rdr->RdrTypeUnion.SensorRec.DataFormat.Range.Min.Type = SAHPI_SENSOR_READING_TYPE_UINT64; rdr->RdrTypeUnion.SensorRec.DataFormat.Range.Min.Value.SensorUint64 = 0; rdr->RdrTypeUnion.SensorRec.DataFormat.AccuracyFactor = 1; rdr->RdrTypeUnion.SensorRec.ThresholdDefn.IsAccessible = SAHPI_FALSE; oh_init_textbuffer(&rdr->IdString); oh_append_textbuffer(&rdr->IdString, "Maximum Power Capability Sensor"); l_s_info->ohoii.get_sensor_event_enable = atca_get_max_pwr_capability_event_enable; l_s_info->ohoii.set_sensor_event_enable = NULL; l_s_info->ohoii.get_sensor_reading = atca_get_max_pwr_capability_reading; l_s_info->ohoii.get_sensor_thresholds =NULL; l_s_info->ohoii.set_sensor_thresholds = NULL; l_s_info->support_assert = 0; l_s_info->support_deassert = 0; l_s_info->assert = 0; l_s_info->deassert = 0; l_s_info->sen_enabled = SAHPI_TRUE; l_s_info->enable = SAHPI_TRUE; l_s_info->info.atcamap_sensor_info.data = NULL; l_s_info->info.atcamap_sensor_info.val = SAHPI_FALSE; l_s_info->type = OHOI_SENSOR_ATCA_MAPPED; *s_info = l_s_info; return rdr; } /*---------------------------------------------------------------------------*/ void atca_create_slot_rdrs(struct oh_handler_state *handler, SaHpiResourceIdT rid) { struct ohoi_handler *ipmi_handler = (struct ohoi_handler *) handler->data; struct ohoi_sensor_info *s_info; struct ohoi_control_info *c_info; SaHpiRdrT *rdr; SaHpiRptEntryT *rpt; rpt = oh_get_resource_by_id(handler->rptcache, rid); if (rpt == NULL) { err("No rpt for atca chassis?"); return; } rdr = atca_create_slot_state_sensor(ipmi_handler, &s_info); if (rdr) { if (oh_add_rdr(handler->rptcache, rid, rdr, s_info, 1) != SA_OK) { err("couldn't add sensor rdr"); free(s_info); } else { rpt->ResourceCapabilities |= SAHPI_CAPABILITY_SENSOR | SAHPI_CAPABILITY_RDR; s_info->info.atcamap_sensor_info.rid = rid; } } rdr = atca_create_fru_activation_control(handler, rpt, &c_info); if (rdr) { if (oh_add_rdr(handler->rptcache, rid, rdr, c_info, 1) != SA_OK) { err("couldn't add control rdr"); free(c_info); } else { rpt->ResourceCapabilities |= SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_RDR; c_info->info.atcamap_ctrl_info.rid = rid; } } rdr = atca_create_assigned_pwr_sensor(ipmi_handler, &s_info); if (rdr) { if (oh_add_rdr(handler->rptcache, rid, rdr, s_info, 1) != SA_OK) { err("couldn't add sensor rdr"); free(s_info); } else { rpt->ResourceCapabilities |= SAHPI_CAPABILITY_SENSOR | SAHPI_CAPABILITY_RDR; s_info->info.atcamap_sensor_info.rid = rid; } } rdr = atca_create_max_pwr_capability_sensor(ipmi_handler, &s_info); if (rdr) { if (oh_add_rdr(handler->rptcache, rid, rdr, s_info, 1) != SA_OK) { err("couldn't add sensor rdr"); free(s_info); } else { rpt->ResourceCapabilities |= SAHPI_CAPABILITY_SENSOR | SAHPI_CAPABILITY_RDR; s_info->info.atcamap_sensor_info.rid = rid; } } } openhpi-3.6.1/plugins/ipmi/ipmi_sel.c0000644000175100017510000003025312575647300016553 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Louis Zhuang */ #include "ipmi.h" #include /* * internally used structure for SEL time data **/ struct get_sel_time_cb_data { SaHpiTimeT time; int flag; }; struct ohoi_set_sel_state_cb_data { int enable; int done; }; struct ohoi_get_sel_state_cb_data { int enable; int done; }; /* * SEL num. of entries callback function **/ static void get_sel_count(ipmi_mc_t *mc, void *cb_data) { int *count = cb_data; *count = ipmi_mc_sel_entries_used(mc); } /** * ohoi_get_sel_count: Get IPMI number of SEL entries * @mc_id: management controller id used for OpenIPMI callback * @count: number of entries returned * * This function is called by ipmi.c * This function registers a callback with OpenIPMI's * ipmi_mc_pointer_cb, get's the MC associated with the ID * and calls our function back with the MC and fills in * the number of SEL entries returned to caller. * **/ void ohoi_get_sel_count(ipmi_mcid_t mc_id, int *count) { int rv; *count = -1; rv = ipmi_mc_pointer_cb(mc_id, get_sel_count, count); if (rv<0) err("Unable to convert MC id to a pointer"); } static void get_sel_size(ipmi_mc_t *mc, void *cb_data) { int *size = cb_data; *size = ipmi_mc_sel_get_free_bytes(mc); } void ohoi_get_sel_size(ipmi_mcid_t mc_id, int *size) { int rv; *size = -1; rv = ipmi_mc_pointer_cb(mc_id, get_sel_size, size); if (rv<0) err("Unable to convert MC id to a pointer"); } /** * get_sel_time_cb: callback registered by get_sel_time * @mc: management controller pointer * @err: int error * @time: time returned from OpenIPMI * @cb_data: user requested data * * **/ static void get_sel_time_cb(ipmi_mc_t *mc, int err, unsigned long time, void *cb_data) { struct get_sel_time_cb_data *data = cb_data; data->flag = 1; data->time = time; } /** * get_sel_time: get IPMI SEL time * @mc: management controller id used for OpenIPMI callback * @cb_data: user passed in data * * **/ static void get_sel_time(ipmi_mc_t *mc, void *cb_data) { ipmi_mc_get_current_sel_time(mc, get_sel_time_cb, cb_data); } void ohoi_get_sel_time(ipmi_mcid_t mc_id, SaHpiTimeT *time, void *cb_data) { struct ohoi_handler *ipmi_handler = cb_data; struct get_sel_time_cb_data data; int rv; memset(&data, 0, sizeof(data)); rv = ipmi_mc_pointer_cb(mc_id, get_sel_time, &data); if (rv) { err("Unable to convert domain id to a pointer"); return; } rv = ohoi_loop(&data.flag, ipmi_handler); if (rv) err("Unable to get sel time: Timeout!"); *time = (SaHpiTimeT)data.time*1000000000; } static void get_sel_update_timestamp(ipmi_mc_t *mc, void *cb_data) { SaHpiTimeT *time = cb_data; *time = (SaHpiTimeT)ipmi_mc_sel_get_last_addition_timestamp(mc)*1000000000; } void ohoi_get_sel_updatetime(ipmi_mcid_t mc_id, SaHpiTimeT *time) { int rv; rv = ipmi_mc_pointer_cb(mc_id, get_sel_update_timestamp, time); if (rv) err("Unable to convert domain id to a pointer"); } static void get_sel_overflow(ipmi_mc_t *mc, void *cb_data) { char *overflow = cb_data; *overflow = ipmi_mc_sel_get_overflow(mc); } void ohoi_get_sel_overflow(ipmi_mcid_t mc_id, char *overflow) { int rv; rv = ipmi_mc_pointer_cb(mc_id, get_sel_overflow, overflow); if (rv<0) err("Unable to convert domain id to a pointer"); } static void get_sel_support_del(ipmi_mc_t *mc, void *cb_data) { char *support_del = cb_data; *support_del = ipmi_mc_sel_get_supports_delete_sel(mc); } void ohoi_get_sel_support_del(ipmi_mcid_t mc_id, char *support_del) { int rv; rv = ipmi_mc_pointer_cb(mc_id, get_sel_support_del, support_del); if (rv<0) err("Unable to convert domain id to a pointer"); } static void set_sel_time_done(ipmi_mc_t *mc, int err, void *cb_data) { int *flag = cb_data; *flag = 1; dbg("set_sel_time called, err: %d", err); } struct set_sel_time_cb_data { int flag; struct timeval time; }; static void set_sel_time(ipmi_mc_t *mc, void *cb_data) { struct set_sel_time_cb_data *data = cb_data; int rv; rv = ipmi_mc_set_current_sel_time(mc, &data->time, set_sel_time_done, &data->flag); if (rv) err("Failed to set MC time"); } void ohoi_set_sel_time(ipmi_mcid_t mc_id, const struct timeval *time, void *cb_data) { struct ohoi_handler *ipmi_handler = cb_data; struct set_sel_time_cb_data data; int rv; data.flag = 0; data.time = *time; rv = ipmi_mc_pointer_cb(mc_id, set_sel_time, &data); if (rv) { err("Unable to convert MC id to a pointer"); return; } rv = ohoi_loop(&data.flag, ipmi_handler); if (rv) err("Unable to set SEL time: Timeout!"); return; } struct clear_sel_cb { SaErrorT err; struct ohoi_handler *ipmi_handler; }; static void mc_clear_sel_done(ipmi_mc_t *mc, int err, void *cb_data) { int *flag = cb_data; *flag = 1; dbg("MC sel clear done"); return; } static void clear_sel(ipmi_mc_t *mc, void *cb_data) { struct clear_sel_cb *info = cb_data; int rv; int done = 0; #if 0 ipmi_event_t *event, *event2; event = ipmi_mc_first_event(mc); while (event) { event2 = event; event = ipmi_mc_next_event(mc, event); rv = ipmi_mc_del_event(mc, event2, NULL, NULL); if (rv != 0) { err("ipmi_mc_del_event = 0x%x", rv); info->err = SA_ERR_HPI_INVALID_CMD; return; } ipmi_event_free(event2); } /* we're done, now force an sel_reread so delete takes effect */ rv = ipmi_mc_reread_sel(mc, mc_clear_sel_done, &done); if (rv) { err("ipmi_mc_reread_sel failed"); info->err = SA_ERR_HPI_INVALID_CMD; return; } #endif rv = ipmi_mc_sel_clear(mc, NULL, mc_clear_sel_done, &done); if (rv) { err("ipmi_mc_reread_sel failed"); info->err = SA_ERR_HPI_INVALID_CMD; return; } info->err = ohoi_loop(&done, info->ipmi_handler); } SaErrorT ohoi_clear_sel(ipmi_mcid_t mc_id, void *cb_data) { char support_del = 0; int rv; struct clear_sel_cb info; info.ipmi_handler = cb_data; ohoi_get_sel_support_del(mc_id, &support_del); if (!support_del) { err("MC SEL doesn't support del"); // return SA_ERR_HPI_INVALID_CMD; } info.err = 0; rv = ipmi_mc_pointer_cb(mc_id, clear_sel, &info); if (rv) { err("Unable to convert mcid to pointer: %d", rv); return SA_ERR_HPI_INVALID_CMD; } info.ipmi_handler->sel_clear_done = 1; // atavism return info.err; } static void get_sel_first_entry(ipmi_mc_t *mc, void *cb_data) { ipmi_event_t **event = cb_data; *event = ipmi_mc_first_event(mc); } void ohoi_get_sel_first_entry(ipmi_mcid_t mc_id, ipmi_event_t **event) { int rv; rv = ipmi_mc_pointer_cb(mc_id, get_sel_first_entry, event); if (rv) err("Unable to convert mcid to pointer"); } static void get_sel_last_entry(ipmi_mc_t *mc, void *cb_data) { ipmi_event_t **event = cb_data; *event = ipmi_mc_last_event(mc); } void ohoi_get_sel_last_entry(ipmi_mcid_t mc_id, ipmi_event_t **event) { int rv; rv = ipmi_mc_pointer_cb(mc_id, get_sel_last_entry, event); if (rv) err("Unable to convert mcid to pointer"); } static void get_sel_next_entry(ipmi_mc_t *mc, void *cb_data) { ipmi_event_t **event = cb_data; *event = ipmi_mc_next_event(mc, *event); } void ohoi_get_sel_next_recid(ipmi_mcid_t mc_id, ipmi_event_t *event, unsigned int *record_id) { int rv; ipmi_event_t *te; te = event; rv = ipmi_mc_pointer_cb(mc_id, get_sel_next_entry, &te); if (rv) { err("unable to convert mcid to pointer"); *record_id = SAHPI_NO_MORE_ENTRIES; return; } if (te) *record_id = ipmi_event_get_record_id(te); else *record_id = SAHPI_NO_MORE_ENTRIES; } static void get_sel_prev_entry(ipmi_mc_t *mc, void *cb_data) { ipmi_event_t **event = cb_data; *event = ipmi_mc_prev_event(mc, *event); } void ohoi_get_sel_prev_recid(ipmi_mcid_t mc_id, ipmi_event_t *event, unsigned int *record_id) { int rv; ipmi_event_t *te; te = event; rv = ipmi_mc_pointer_cb(mc_id, get_sel_prev_entry, &te); if (rv) { err("unable to convert mcid to pointer"); *record_id = SAHPI_NO_MORE_ENTRIES; return; } if (te) *record_id = ipmi_event_get_record_id(te); else *record_id = SAHPI_NO_MORE_ENTRIES; } struct ohoi_get_event_by_recid_cb_data { unsigned int record_id; ipmi_event_t *event; }; static void get_sel_by_recid(ipmi_mc_t *mc, void *cb_data) { struct ohoi_get_event_by_recid_cb_data *data = cb_data; data->event = ipmi_mc_event_by_recid(mc, data->record_id); } void ohoi_get_sel_by_recid(ipmi_mcid_t mc_id, SaHpiEventLogEntryIdT entry_id, ipmi_event_t **event) { int rv; struct ohoi_get_event_by_recid_cb_data data; data.record_id = entry_id; data.event = NULL; rv = ipmi_mc_pointer_cb(mc_id, get_sel_by_recid, &data); if(rv) { err("failed to convert mc_id to pointer"); *event = NULL; return; } *event = data.event; } static void set_sel_state_done(ipmi_mc_t *mc, int err, void *cb_data) { int *done = cb_data; if (err == IPMI_IPMI_ERR_VAL(IPMI_INVALID_CMD_CC)) { err("looks like mc doesn't support state changing"); *done = -2; } else if (err) { err("err = %d", err); *done = -1; } else { *done = 1; } } static void set_sel_state(ipmi_mc_t *mc, void *cb_data) { struct ohoi_set_sel_state_cb_data *data = cb_data; int rv; rv = ipmi_mc_set_event_log_enable(mc, data->enable, set_sel_state_done , &data->done); if(rv) { if (rv == ENOSYS) { err("looks like mc doesn't support state changing"); data->done = -2; } else { data->done = -1; } err("failed set_sel_state = %x", rv); } } SaErrorT ohoi_set_sel_state(struct ohoi_handler *ipmi_handler, ipmi_mcid_t mc_id, int enable) { int rv; struct ohoi_set_sel_state_cb_data data; data.done = 0; data.enable = enable; rv = ipmi_mc_pointer_cb(mc_id, set_sel_state, &data); if (rv) { err("failed to convert mc_id to pointer = %d", rv); return SA_ERR_HPI_INTERNAL_ERROR; } rv = ohoi_loop(&data.done, ipmi_handler); if (data.done == -2) { rv = SA_ERR_HPI_ERROR; } else if (data.done < 0) { err("data.done = %d", data.done); rv = SA_ERR_HPI_INTERNAL_ERROR; } if(rv) { err("failed to set sel state to %d = %d", enable, rv); } return rv; } static void get_sel_state_done(ipmi_mc_t *mc, int err, int enable, void *cb_data) { struct ohoi_get_sel_state_cb_data *data = cb_data; data->done = (err == 0) ? 1 : -1; data->enable = enable; } static void get_sel_state(ipmi_mc_t *mc, void *cb_data) { struct ohoi_get_sel_state_cb_data *data = cb_data; int rv; rv = ipmi_mc_get_event_log_enable(mc, get_sel_state_done , data); if(rv) { if (rv == ENOSYS) { // ipmb doesn't support event generator data->done = -2; } else { data->done = -1; } err("failed get_sel_state = %d", rv); } } SaErrorT ohoi_get_sel_state(struct ohoi_handler *ipmi_handler, ipmi_mcid_t mc_id, int *enable) { int rv; struct ohoi_get_sel_state_cb_data data; data.done = 0; rv = ipmi_mc_pointer_cb(mc_id, get_sel_state, &data); if (rv) { err("failed to convert mc_id to pointer = %d", rv); return SA_ERR_HPI_INTERNAL_ERROR; } rv = ohoi_loop(&data.done, ipmi_handler); if (data.done == -2) { rv = SA_ERR_HPI_ERROR; } else if (data.done < 0) { rv = SA_ERR_HPI_INTERNAL_ERROR; } if(rv) { err("failed to get sel state = %d", rv); } else { *enable = data.enable; } return rv; } openhpi-3.6.1/plugins/ipmi/sync.c0000644000175100017510000000240512575647300015724 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Louis Zhuang */ #include "ipmi.h" SaErrorT ohoi_loop_until(loop_indicator_cb indicator, const void *cb_data, int to, struct ohoi_handler *ipmi_handler) { struct timeval tv1, tv2, tv3; /* Wait 5 seconds for result */ gettimeofday(&tv1, NULL); tv1.tv_sec += to; while (1) { if (indicator(cb_data)) { return SA_OK; } memset(&tv3, 0, sizeof(tv3)); gettimeofday(&tv2, NULL); if (tv2.tv_sec>tv1.tv_sec) { break; } sel_select(ipmi_handler->ohoi_sel, NULL, 0, NULL, &tv3); } return SA_ERR_HPI_NO_RESPONSE; } static int simple_indicator(const void *cb_data) { return (*(const int *)cb_data); } SaErrorT ohoi_loop(int *done, struct ohoi_handler *ipmi_handler) { return (ohoi_loop_until(simple_indicator, done, IPMI_DATA_WAIT, ipmi_handler)); } openhpi-3.6.1/plugins/ipmi/ipmi_close.c0000644000175100017510000000262412575647300017076 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Tariq Shureih */ #include "ipmi.h" static void close_done(void *cb_data) { struct ohoi_handler *ipmi_handler = cb_data; trace_ipmi("close_done"); ipmi_handler->fully_up = 0; } static void close_connection(ipmi_domain_t *domain, void *user_data) { int rv, *flag = user_data; trace_ipmi("close flag:%d", *flag); rv = ipmi_domain_close(domain, close_done, user_data); if (rv) { err("ipmi_close_connection failed!"); *flag = 1; } } void ohoi_close_connection(ipmi_domain_id_t domain_id, void *user_data) { struct oh_handler_state *handler = (struct oh_handler_state *)user_data; struct ohoi_handler *ipmi_handler = (struct ohoi_handler *)handler->data; int rv; trace_ipmi("ohoi_close_connection"); rv = ipmi_domain_pointer_cb(domain_id, close_connection, ipmi_handler); if (rv) { err("ipmi_domain_pointer_cb failed!"); return; } while (ipmi_handler->fully_up != 0) { sel_select(ipmi_handler->ohoi_sel, NULL, 0, NULL, NULL); } } openhpi-3.6.1/plugins/ipmi/atca_shelf_rdrs.c0000644000175100017510000015635712575647300020113 0ustar mohanmohan /* -*- linux-c -*- * * Copyright (c) 2005 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Vadim Revyakin */ #include "ipmi.h" #include #define uchar unsigned char int ipmicmd_send(ipmi_domain_t *domain, uchar netfn, uchar cmd, uchar lun, uchar chan, uchar *pdata, uchar sdata, ipmi_addr_response_handler_t handler, void *handler_data); static void init_power_on_sequence_data_cb(ipmi_entity_t *entity, void *cb_data) { struct ohoi_handler *ipmi_handler = cb_data; ipmi_fru_t *fru = ipmi_entity_get_fru(entity); unsigned int num, r_num; unsigned int len; int broken = 0; unsigned char data[256]; unsigned char type, ver; ohoi_atca_pwonseq_rec_t *recp = NULL; ohoi_atca_pwonseq_dsk_t *dscp = NULL; int i; int rv; g_slist_foreach(ipmi_handler->atca_pwonseq_recs, (GFunc)g_free, NULL); g_slist_free(ipmi_handler->atca_pwonseq_recs); g_slist_foreach(ipmi_handler->atca_pwonseq_desk, (GFunc)g_free, NULL); g_slist_free(ipmi_handler->atca_pwonseq_desk); ipmi_handler->atca_pwonseq_recs = NULL; ipmi_handler->atca_pwonseq_desk = NULL; ipmi_handler->atca_pwonseq_updated = 0; r_num = ipmi_entity_get_num_multi_records(entity); for (num = 0; num < r_num; num++) { len = 256; rv = ipmi_fru_get_multi_record_data(fru, num, data, &len); if (rv != 0) { err("ipmi_fru_get_multi_record_data(" "fru, %d, data, 0x%x) = 0x%x", num, len, rv); broken = 1; break; } rv = ipmi_fru_get_multi_record_type(fru, num, &type); if (rv) { err("ipmi_entity_get_multi_record_type = %d", rv); broken = 1; break; } if (type != 0xc0) { // record type. Must be OEM err("Record type = 0x%x", data[0]); continue; } rv = ipmi_fru_get_multi_record_format_version(fru, num, &ver); if (rv) { err("ipmi_entity_get_multi_record_format_version = %d", rv); broken = 1; break; } if ((ver & 0x0f) != 0x2) { // must be 2 for PICMG 3.0 ATCA vD1.0 continue; } if (len < 5) { continue; } if ((data[0] | (data[1] << 8) | (data[2] << 16)) != ATCAHPI_PICMG_MID) { err("MId = 0x%x", data[0] | (data[1] << 8) | (data[2] << 16)); continue; } if (data[3] != 0x12) { continue; } if (len < 7) { err("Record #%d too short(%d)", num, len); broken = 1; break; } if (len < 7 + data[6] * 5) { err("Record #%d length(0x%x) mismatches with expected(0x%x)", num, len, 7 + data[6] * 5); broken = 1; break; } recp = malloc(sizeof (ohoi_atca_pwonseq_rec_t)); if (recp) { memcpy(&recp->head, data, 7); recp->updated = 0; recp->rec_num = num; ipmi_handler->atca_pwonseq_recs = g_slist_append(ipmi_handler->atca_pwonseq_recs, recp); } else { err("Out of memory"); broken = 1; break; } for (i = 0; i < data[6]; i++) { dscp = malloc(sizeof (ohoi_atca_pwonseq_dsk_t)); if (dscp) { memcpy(&dscp->body, &data[7 + 5 * i], 5); dscp->slotid = 0; ipmi_handler->atca_pwonseq_desk = g_slist_append( ipmi_handler->atca_pwonseq_desk, dscp); } else { err("Out of memory"); broken = 1; break; } } } if (broken) { // XXX delete all alloced memory } } /* * Chassis status control */ struct atca_chassis_status_control_s { SaHpiCtrlStateOemT *state; int done; SaErrorT rv; }; SaErrorT get_atca_chassis_status_control_state( struct oh_handler_state *hnd, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state); SaErrorT set_atca_chassis_status_control_state( struct oh_handler_state *hnd, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state); static int get_atca_chassis_status_control_states_cb( ipmi_domain_t *domain, ipmi_msgi_t *rspi) { struct atca_chassis_status_control_s *info = rspi->data1; ipmi_msg_t *msg = &rspi->msg; int rv = msg->data[0]; dbg("get chassis response(%d): %02x %02x %02x %02x %02x\n", msg->data_len, msg->data[0], msg->data[1], msg->data[2], msg->data[3], msg->data[4]); if (domain == NULL) { info->rv = SA_ERR_HPI_INVALID_PARAMS; info->done = 1; return IPMI_MSG_ITEM_NOT_USED; } if (rv == 0xc1) { info->rv = SA_ERR_HPI_INVALID_CMD; } else if (rv == 0xc3) { info->rv = SA_ERR_HPI_NO_RESPONSE; } else if (rv != 0) { info->rv = SA_ERR_HPI_INVALID_PARAMS; } else { info->state->Body[0] = msg->data[1]; info->state->Body[1] = msg->data[2]; info->state->Body[2] = msg->data[3]; if (msg->data_len > 3) { info->state->Body[3] = msg->data[4]; } else { info->state->Body[3] = 0; } info->state->BodyLength = 4; info->state->MId = ATCAHPI_PICMG_MID; } info->done = 1; return IPMI_MSG_ITEM_NOT_USED; }; static void get_atca_chassis_status_control_states( ipmi_domain_t *domain, void *cb_data) { struct atca_chassis_status_control_s *info = cb_data; unsigned char data[16]; int rv; memset(data, 0, 16); rv = ipmicmd_send(domain, 0x00, 0x01, 0, IPMI_BMC_CHANNEL, data, 0, get_atca_chassis_status_control_states_cb, cb_data); if (rv != 0) { err("ipmicmd_send = 0x%x", rv); OHOI_MAP_ERROR(info->rv, rv); return; } return; } static SaHpiRdrT *create_atca_chassis_status_control( struct ohoi_handler *ipmi_handler, SaHpiRptEntryT *rpt, struct ohoi_control_info **ctrl_info ) { SaHpiRdrT *rdr; struct ohoi_control_info *c_info; SaHpiCtrlStateOemT states; SaErrorT rv; struct atca_chassis_status_control_s info; info.state = &states; info.done = 0; info.rv = SA_OK; rv = ipmi_domain_pointer_cb(ipmi_handler->domain_id, get_atca_chassis_status_control_states, &info); if (rv != 0) { err("ipmi_domain_pointer_cb = 0x%x", rv); return NULL; } rv = ohoi_loop(&info.done, ipmi_handler); if (rv != SA_OK) { err("ohoi_loop = 0x%x", rv); return NULL; } if (info.rv != SA_OK) { err("info.rv = 0x%x", info.rv); return NULL; } rdr = malloc(sizeof (*rdr)); if (rdr == NULL) { err("Out of memory"); return NULL; } c_info = malloc(sizeof (*c_info)); if (rdr == NULL) { err("Out of memory"); free(rdr); return NULL; } memset(rdr, 0, sizeof (*rdr)); memset(c_info, 0, sizeof (*c_info)); rdr->RdrType = SAHPI_CTRL_RDR; rdr->IsFru = SAHPI_FALSE; rdr->Entity = rpt->ResourceEntity; rdr->RdrTypeUnion.CtrlRec.Num = ATCAHPI_CTRL_NUM_SHELF_STATUS; rdr->RdrTypeUnion.CtrlRec.OutputType = SAHPI_CTRL_GENERIC; rdr->RdrTypeUnion.CtrlRec.Type = SAHPI_CTRL_TYPE_OEM; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Oem.Default.MId = ATCAHPI_PICMG_MID; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Oem.Default.BodyLength = 4; rdr->RdrTypeUnion.CtrlRec.DefaultMode.Mode = SAHPI_CTRL_MODE_AUTO; rdr->RdrTypeUnion.CtrlRec.DefaultMode.ReadOnly = SAHPI_TRUE; rdr->RdrTypeUnion.CtrlRec.WriteOnly = SAHPI_FALSE; rdr->RdrTypeUnion.CtrlRec.Oem = ATCAHPI_PICMG_CT_CHASSIS_STATUS; oh_init_textbuffer(&rdr->IdString); oh_append_textbuffer(&rdr->IdString, "Chassis Status"); rdr->RdrTypeUnion.CtrlRec.TypeUnion.Oem.Default.Body[0] = states.Body[0]; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Oem.Default.Body[1] = states.Body[1]; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Oem.Default.Body[2] = states.Body[2]; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Oem.Default.Body[3] = states.Body[3]; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Oem.Default.MId = ATCAHPI_PICMG_MID; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Oem.MId = ATCAHPI_PICMG_MID; c_info->ohoii.get_control_state = get_atca_chassis_status_control_state; c_info->ohoii.set_control_state = set_atca_chassis_status_control_state; c_info->mode = SAHPI_CTRL_MODE_AUTO; *ctrl_info = c_info; return rdr; } SaErrorT get_atca_chassis_status_control_state( struct oh_handler_state *hnd, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state) { struct atca_chassis_status_control_s info; struct ohoi_handler *ipmi_handler = (struct ohoi_handler *)hnd->data; SaErrorT rv; if (state == NULL) { goto no_state; } info.state = &state->StateUnion.Oem; info.done = 0; info.rv = SA_OK; rv = ipmi_domain_pointer_cb(ipmi_handler->domain_id, get_atca_chassis_status_control_states, &info); if (rv != 0) { err("ipmi_domain_pointer_cb = 0x%x", rv); return SA_ERR_HPI_INVALID_CMD; } rv = ohoi_loop(&info.done, ipmi_handler); if (rv != SA_OK) { err("ohoi_loop = 0x%x", rv); return rv; } if (info.rv != SA_OK) { err("info.rv = 0x%x", info.rv); return rv; } state->Type = SAHPI_CTRL_TYPE_OEM; no_state: if (mode) { *mode = SAHPI_CTRL_MODE_AUTO; } return SA_OK; } SaErrorT set_atca_chassis_status_control_state( struct oh_handler_state *hnd, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state) { return SA_ERR_HPI_READ_ONLY; } /* * Shelf Address control */ struct atca_shelf_address_control_s { SaHpiCtrlStateTextT *text; SaHpiTextTypeT type; int done; SaErrorT rv; }; static int set_shelf_address_control_msg_data(SaHpiTextTypeT type, SaHpiTextBufferT *text, unsigned char *data) { int i, j, shift; if (type == text->DataType) { memcpy(data + 2, &text->Data, text->DataLength); data[1] = (type << 6); switch (type) { case SAHPI_TL_TYPE_UNICODE: data[1] |= ((text->DataLength & 0x1f) >> 1); break; case SAHPI_TL_TYPE_BCDPLUS: data[1] |= ((text->DataLength * 2) & 0x1f); break; case SAHPI_TL_TYPE_ASCII6: data[1] |= (((text->DataLength * 8 + 5) / 6) & 0x1f); break; case SAHPI_TL_TYPE_TEXT: case SAHPI_TL_TYPE_BINARY: data[1] |= (text->DataLength & 0x1f); break; } return 0; } if ((type != SAHPI_TL_TYPE_ASCII6) || (text->DataType != SAHPI_TL_TYPE_TEXT)) { err("Datatype dismaych : %d & %d", type, text->DataType); return 1; } for (i = 0; i < text->DataLength; i++) { if ((text->Data[i] < 0x20) || (text->Data[i] > 0x5F)) { err("cannot convert TEXT to ASCII6"); return 1; } } shift = 0; j = 0; for (i = 0; i < text->DataLength; i++) { unsigned char a = text->Data[i] - 0x20; switch (shift) { case 0: data[j] |= (a << 2); shift = 6; break; case 2: data[j] |= a; j++; shift = 0; break; case 4: data[j] |= (a >> 2); j++; data[j] = (a & 0x03) << 6; shift = 2; break; case 6: data[j] |= ((a & 0x30) >> 6); j++; data[j] = (a & 0x0f) << 4; shift = 4; } } data[1] = (unsigned char)((SAHPI_TL_TYPE_ASCII6 << 6) | (text->DataLength & 0x0f)); return 0; } static int set_atca_shelf_address_control_states_cb( ipmi_domain_t *domain, ipmi_msgi_t *rspi) { struct atca_shelf_address_control_s *info = rspi->data1; ipmi_msg_t *msg = &rspi->msg; int rv = msg->data[0]; dbg("set shelf address response(%d): %02x %02x\n", msg->data_len, msg->data[0], msg->data[1]); if (domain == NULL) { info->rv = SA_ERR_HPI_INVALID_PARAMS; info->done = 1; return IPMI_MSG_ITEM_NOT_USED; } if (rv == 0xc1) { info->rv = SA_ERR_HPI_INVALID_CMD; } else if (rv == 0xc3) { info->rv = SA_ERR_HPI_NO_RESPONSE; } else if (rv != 0) { info->rv = SA_ERR_HPI_INVALID_PARAMS; } info->done = 1; return IPMI_MSG_ITEM_NOT_USED; }; static void set_atca_shelf_address_control_states( ipmi_domain_t *domain, void *cb_data) { struct atca_shelf_address_control_s *info = cb_data; unsigned char data[32]; int rv; memset(data, 0, 32); if (set_shelf_address_control_msg_data(info->type, &info->text->Text, data)) { info->rv = SA_ERR_HPI_INVALID_DATA; info->done = 1; return; } dbg("set addr control: 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x", data[0], data[1], data[2], data[3], data[4], data[5]); rv = ipmicmd_send(domain, 0x2c, 0x03, 0, IPMI_BMC_CHANNEL, data, 32, set_atca_shelf_address_control_states_cb, cb_data); if (rv != 0) { err("ipmicmd_send = 0x%x", rv); OHOI_MAP_ERROR(info->rv, rv); info->done = 1; return; } return; } static SaErrorT set_atca_shelf_address_control_state( struct oh_handler_state *hnd, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state) { struct atca_shelf_address_control_s info; struct ohoi_handler *ipmi_handler = (struct ohoi_handler *)hnd->data; SaErrorT rv; SaHpiCtrlStateTextT *text; if (mode == SAHPI_CTRL_MODE_AUTO) { // || (state == NULL)) { // c->mode = mode; return SA_ERR_HPI_READ_ONLY; } if (state->Type != SAHPI_CTRL_TYPE_TEXT) { err("state->Type != SAHPI_CTRL_TYPE_TEXT"); return SA_ERR_HPI_INVALID_DATA; } text = &state->StateUnion.Text; if ((text->Line != 1) && (text->Line != SAHPI_TLN_ALL_LINES)) { err("text->Line != 1 or SAHPI_TLN_ALL_LINES"); return SA_ERR_HPI_INVALID_DATA; } info.text = text; info.done = 0; info.type = rdr->RdrTypeUnion.CtrlRec.TypeUnion.Text.DataType; info.rv = SA_OK; rv = ipmi_domain_pointer_cb(ipmi_handler->domain_id, set_atca_shelf_address_control_states, &info); if (rv != 0) { err("ipmi_domain_pointer_cb = 0x%x", rv); return SA_ERR_HPI_INVALID_CMD; } rv = ohoi_loop(&info.done, ipmi_handler); if (rv != SA_OK) { err("ohoi_loop = 0x%x", rv); return rv; } if (info.rv != SA_OK) { err("info.rv = 0x%x", info.rv); return info.rv; } // c->mode = mode; state->Type = SAHPI_CTRL_TYPE_TEXT; return SA_OK; } static int get_atca_shelf_address_control_states_cb( ipmi_domain_t *domain, ipmi_msgi_t *rspi) { struct atca_shelf_address_control_s *info = rspi->data1; ipmi_msg_t *msg = &rspi->msg; int rv = msg->data[0]; int len; int i; dbg("get shelf address response(%d): %02x %02x %02x %02x %02x\n", msg->data_len, msg->data[0], msg->data[1], msg->data[2], msg->data[3], msg->data[4]); if (domain == NULL) { info->rv = SA_ERR_HPI_INVALID_PARAMS; info->done = 1; return IPMI_MSG_ITEM_NOT_USED; } if (rv == 0xc1) { info->rv = SA_ERR_HPI_INVALID_CMD; } else if (rv == 0xc3) { info->rv = SA_ERR_HPI_NO_RESPONSE; } else if (rv != 0) { info->rv = SA_ERR_HPI_INVALID_PARAMS; } if (rv != 0) { info->done = 1; return IPMI_MSG_ITEM_NOT_USED; } info->text->Line = 1; info->text->Text.DataType = (msg->data[2] & 0xc0) >> 6; len = (msg->data[2] & 0x0f); memset(&info->text->Text.Data, 0, SAHPI_MAX_TEXT_BUFFER_LENGTH); switch (info->text->Text.DataType) { case SAHPI_TL_TYPE_UNICODE: len = len * 2; memcpy(&info->text->Text.Data, msg->data + 3, len); break; case SAHPI_TL_TYPE_BCDPLUS: len = (len + 1) / 2; memcpy(&info->text->Text.Data, msg->data + 3, len); break; case SAHPI_TL_TYPE_ASCII6: for (i = 0; i < len; i++) { int b, off; SaHpiUint8T a = 0; b = (6 * i) / 8; off = (6 * i) % 8; switch (off) { case 0: a = (msg->data[3 + b] & 0xFC) >> 2; break; case 2: a = (msg->data[3 + b] & 0x3F); break; break; case 4: a = ((msg->data[3 + b] & 0x0F) << 2) | ((msg->data[3 + b + 1] & 0xC0) >> 6); break; case 6: a = ((msg->data[3 + b] & 0x03) << 4) | ((msg->data[3 + b + 1] & 0xF0) >> 4); } info->text->Text.Data[i] = a + 0x20; } break; case SAHPI_TL_TYPE_TEXT: info->text->Text.Language = SAHPI_LANG_ENGLISH; case SAHPI_TL_TYPE_BINARY: memcpy(&info->text->Text.Data, msg->data + 3, len); break; } info->text->Text.DataLength = len; info->done = 1; return IPMI_MSG_ITEM_NOT_USED; }; static void get_atca_shelf_address_control_states( ipmi_domain_t *domain, void *cb_data) { struct atca_shelf_address_control_s *info = cb_data; unsigned char data[32]; int rv; memset(data, 0, 32); rv = ipmicmd_send(domain, 0x2c, 0x02, 0, IPMI_BMC_CHANNEL, data, 1, get_atca_shelf_address_control_states_cb, cb_data); if (rv != 0) { err("ipmicmd_send = 0x%x", rv); OHOI_MAP_ERROR(info->rv, rv); return; } return; } static SaErrorT get_atca_shelf_address_control_state( struct oh_handler_state *hnd, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state) { struct atca_shelf_address_control_s info; struct ohoi_handler *ipmi_handler = (struct ohoi_handler *)hnd->data; SaErrorT rv; if (state == NULL) { goto no_state; } #if 0 if (state->Type != SAHPI_CTRL_TYPE_TEXT) { err("state->Type != SAHPI_CTRL_TYPE_TEXT"); return SA_ERR_HPI_INVALID_DATA; } #endif if ((state->StateUnion.Text.Line != 1) && (state->StateUnion.Text.Line != SAHPI_TLN_ALL_LINES)) { err("text->Line != 1 or SAHPI_TLN_ALL_LINES"); return SA_ERR_HPI_INVALID_DATA; } info.text = &state->StateUnion.Text; info.done = 0; info.rv = SA_OK; rv = ipmi_domain_pointer_cb(ipmi_handler->domain_id, get_atca_shelf_address_control_states, &info); if (rv != 0) { err("ipmi_domain_pointer_cb = 0x%x", rv); return SA_ERR_HPI_INVALID_CMD; } rv = ohoi_loop(&info.done, ipmi_handler); if (rv != SA_OK) { err("ohoi_loop = 0x%x", rv); return rv; } if (info.rv != SA_OK) { err("info.rv = 0x%x", info.rv); return rv; } state->Type = SAHPI_CTRL_TYPE_TEXT; no_state: if (mode) { *mode = c->mode; } return SA_OK; } static SaHpiRdrT *create_atca_shelf_address_control( struct ohoi_handler *ipmi_handler, SaHpiRptEntryT *rpt, struct ohoi_control_info **ctrl_info) { SaHpiRdrT *rdr; struct ohoi_control_info *c_info; SaHpiCtrlStateTextT text; SaErrorT rv; struct atca_shelf_address_control_s info; info.text = &text; info.done = 0; info.rv = SA_OK; rv = ipmi_domain_pointer_cb(ipmi_handler->domain_id, get_atca_shelf_address_control_states, &info); if (rv != 0) { err("ipmi_domain_pointer_cb = 0x%x", rv); return NULL; } rv = ohoi_loop(&info.done, ipmi_handler); if (rv != SA_OK) { err("ohoi_loop = 0x%x", rv); return NULL; } if (info.rv != SA_OK) { err("info.rv = 0x%x", info.rv); return NULL; } rdr = malloc(sizeof (*rdr)); if (rdr == NULL) { err("Out of memory"); return NULL; } c_info = malloc(sizeof (*c_info)); if (rdr == NULL) { err("Out of memory"); free(rdr); return NULL; } memset(rdr, 0, sizeof (*rdr)); memset(c_info, 0, sizeof (*c_info)); rdr->RdrType = SAHPI_CTRL_RDR; rdr->IsFru = SAHPI_FALSE; rdr->Entity = rpt->ResourceEntity; rdr->RdrTypeUnion.CtrlRec.Num = ATCAHPI_CTRL_NUM_SHELF_ADDRESS; rdr->RdrTypeUnion.CtrlRec.OutputType = SAHPI_CTRL_GENERIC; rdr->RdrTypeUnion.CtrlRec.Type = SAHPI_CTRL_TYPE_TEXT; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Text.MaxChars = 25; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Text.MaxLines = 1; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Text.Language = text.Text.Language; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Text.DataType = text.Text.DataType; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Text.Default.Line = 1; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Text.Default.Text.DataType = text.Text.DataType; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Text.Default.Text.DataLength = text.Text.DataLength; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Text.Default.Text.Language = text.Text.Language; memcpy(&rdr->RdrTypeUnion.CtrlRec.TypeUnion.Text.Default.Text.Data, &text.Text.Data, text.Text.DataLength); rdr->RdrTypeUnion.CtrlRec.DefaultMode.Mode = SAHPI_CTRL_MODE_MANUAL; rdr->RdrTypeUnion.CtrlRec.DefaultMode.ReadOnly = SAHPI_TRUE; rdr->RdrTypeUnion.CtrlRec.WriteOnly = SAHPI_FALSE; oh_init_textbuffer(&rdr->IdString); oh_append_textbuffer(&rdr->IdString, "Shelf Address"); c_info->ohoii.get_control_state = get_atca_shelf_address_control_state; c_info->ohoii.set_control_state = set_atca_shelf_address_control_state; c_info->mode = SAHPI_CTRL_MODE_MANUAL; *ctrl_info = c_info; return rdr; } /* * Shelf IP Address Control */ static SaErrorT get_atca_shelf_ip_address_control_state( struct oh_handler_state *hnd, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state); static SaErrorT set_atca_shelf_ip_address_control_state( struct oh_handler_state *hnd, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state); static SaHpiRdrT *create_atca_shelf_ip_address_control( struct oh_handler_state *handler, SaHpiRptEntryT *rpt, struct ohoi_control_info **ctrl_info) { // struct ohoi_handler *ipmi_handler = handler->data; SaHpiRdrT *rdr; struct ohoi_control_info *c_info; rdr = malloc(sizeof (*rdr)); if (rdr == NULL) { err("Out of memory"); return NULL; } c_info = malloc(sizeof (*c_info)); if (rdr == NULL) { err("Out of memory"); free(rdr); return NULL; } memset(rdr, 0, sizeof (*rdr)); memset(c_info, 0, sizeof (*c_info)); rdr->RdrType = SAHPI_CTRL_RDR; rdr->IsFru = SAHPI_FALSE; rdr->Entity = rpt->ResourceEntity; rdr->RdrTypeUnion.CtrlRec.Num = ATCAHPI_CTRL_NUM_SHELF_IP_ADDRESS; rdr->RdrTypeUnion.CtrlRec.OutputType = SAHPI_CTRL_GENERIC; rdr->RdrTypeUnion.CtrlRec.Type = SAHPI_CTRL_TYPE_TEXT; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Text.MaxChars = 4; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Text.MaxLines = 3; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Text.Language = SAHPI_LANG_UNDEF; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Text.DataType = SAHPI_TL_TYPE_BINARY; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Text.Default.Line = SAHPI_TLN_ALL_LINES; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Text.Default.Text.DataType = SAHPI_TL_TYPE_BINARY; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Text.Default.Text.DataLength = 12; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Text.Default.Text.Language = SAHPI_LANG_UNDEF; memset(&rdr->RdrTypeUnion.CtrlRec.TypeUnion.Text.Default.Text.Data, 0, SAHPI_MAX_TEXT_BUFFER_LENGTH); rdr->RdrTypeUnion.CtrlRec.DefaultMode.Mode = SAHPI_CTRL_MODE_MANUAL; rdr->RdrTypeUnion.CtrlRec.DefaultMode.ReadOnly = SAHPI_TRUE; rdr->RdrTypeUnion.CtrlRec.WriteOnly = SAHPI_FALSE; oh_init_textbuffer(&rdr->IdString); oh_append_textbuffer(&rdr->IdString, "Shelf IP Address"); c_info->info.atcamap_ctrl_info.data = NULL; c_info->type = OHOI_CTRL_ATCA_MAPPED; c_info->mode = SAHPI_CTRL_MODE_MANUAL; c_info->ohoii.get_control_state = get_atca_shelf_ip_address_control_state; c_info->ohoii.set_control_state = set_atca_shelf_ip_address_control_state; *ctrl_info = c_info; return rdr; } static SaErrorT get_shelf_ip_address_record(ipmi_entity_t *ent, unsigned char *buf, unsigned int *len, unsigned char *ver, unsigned int *num) { unsigned char type, vr; unsigned int i, num_rec; unsigned int orig_len = *len; int rv; num_rec = ipmi_entity_get_num_multi_records(ent); for (i = 0; i < num_rec; i++) { *len = orig_len; rv = ipmi_entity_get_multi_record_data(ent, i, buf, len); if (rv != 0) { err("ipmi_entity_get_multi_record_data(%d) = 0x%x", i, rv); return SA_ERR_HPI_INVALID_DATA; } if (*len < 17) { continue; } rv = ipmi_entity_get_multi_record_type(ent, i, &type); if (rv) { err("ipmi_entity_get_multi_record_type = %d", rv); continue; } if (type != 0xc0) { // record type. Must be OEM continue; } rv = ipmi_entity_get_multi_record_format_version(ent, i, &vr); if (rv) { err("ipmi_entity_get_multi_record_format_version = %d", rv); continue; } if ((vr & 0x0f) != 0x2) { // must be 2 for PICMG 3.0 ATCA vD1.0 continue; } // checksums are checked by OpenIPMI if ((buf[0] | (buf[1] << 8) | (buf[2] << 16)) != ATCAHPI_PICMG_MID) { continue; } if (buf[3] != 0x13) { continue; } if (buf[4] != 0x01) { continue; } break; } if (i == num_rec) { err("No record for shelf IP address"); return SA_ERR_HPI_INTERNAL_ERROR; } *num = i; *ver = vr; return SA_OK; } struct atca_shelf_ip_address_control_state { struct oh_handler_state *hnd; SaErrorT rv; SaHpiCtrlStateTextT *text; int done; }; static void get_atca_shelf_ip_address_control_state_cb(ipmi_entity_t *ent, void *cb_data) { struct atca_shelf_ip_address_control_state *info = cb_data; unsigned char buf[256]; unsigned int len = 256; unsigned int num_rec; unsigned char ver; info->rv = get_shelf_ip_address_record(ent, buf, &len, &ver, &num_rec); if (info->rv != SA_OK) { return; } info->text->Text.DataType = SAHPI_TL_TYPE_BINARY; info->text->Text.Language = SAHPI_LANG_UNDEF; switch (info->text->Line) { case 1: // Shelf Manager IP Address info->text->Text.DataLength = 4; memcpy(info->text->Text.Data, buf + 5, 4); break; case 2: // Default Gateway IP Address info->text->Text.DataLength = 4; memcpy(info->text->Text.Data, buf + 9, 4); break; case 3: // Subnet Mask info->text->Text.DataLength = 4; memcpy(info->text->Text.Data, buf + 13, 4); break; case SAHPI_TLN_ALL_LINES: // all info->text->Text.DataLength = 12; memcpy(info->text->Text.Data, buf + 5, 12); break; default : err("wrong text->Line = %d", info->text->Line); info->rv = SA_ERR_HPI_INVALID_DATA; break; } } SaErrorT get_atca_shelf_ip_address_control_state( struct oh_handler_state *handler, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state) { struct ohoi_resource_info *res_info; struct ohoi_handler *ohoi_handler = handler->data; int rv; struct atca_shelf_ip_address_control_state info; if (state == NULL) { goto no_state; } #if 0 if (state->Type != SAHPI_CTRL_TYPE_TEXT) { err("wrong state type %d", state->Type); return SA_ERR_HPI_INVALID_DATA; } #endif res_info = oh_get_resource_data(handler->rptcache, ohoi_handler->atca_shelf_id); if (res_info == NULL) { err("No shelf resource info?"); return SA_ERR_HPI_INTERNAL_ERROR; } if (res_info->fru == NULL) { err("Shelf does not have IDR"); return SA_ERR_HPI_INVALID_DATA; } info.rv = SA_OK; info.text = &state->StateUnion.Text; g_mutex_lock(res_info->fru->mutex); rv = ipmi_entity_pointer_cb(res_info->u.entity.entity_id, get_atca_shelf_ip_address_control_state_cb, &info); if (rv != 0) { err("ipmi_entity_pointer_cb = 0x%x", rv); g_mutex_unlock(res_info->fru->mutex); return SA_ERR_HPI_INTERNAL_ERROR; } g_mutex_unlock(res_info->fru->mutex); if (info.rv != SA_OK) { return info.rv; } no_state: if (mode) { *mode = c->mode; } return SA_OK; } static void set_atca_shelf_ip_address_control_state_cb(ipmi_entity_t *ent, void *cb_data) { struct atca_shelf_ip_address_control_state *info = cb_data; unsigned char buf[256]; unsigned int len = 256; unsigned int num_rec; unsigned char ver; SaErrorT rv; ipmi_fru_t *fru = ipmi_entity_get_fru(ent); // struct ohoi_handler *ohoi_handler = info->hnd->data; info->rv = get_shelf_ip_address_record(ent, buf, &len, &ver, &num_rec); if (info->rv != SA_OK) { info->done = 1; return; } switch (info->text->Line) { case 1: // Shelf Manager IP Address memcpy(buf + 5, info->text->Text.Data, 4); break; case 2: // Default Gateway IP Address memcpy(buf + 9, info->text->Text.Data, 4); break; case 3: // Subnet Mask memcpy(buf + 13, info->text->Text.Data, 4); break; case SAHPI_TLN_ALL_LINES: // all memcpy(buf + 5, info->text->Text.Data, 12); break; default : err("wrong text->Line = %d", info->text->Line); info->rv = SA_ERR_HPI_INVALID_DATA; info->done = 1; return; } rv = ipmi_fru_set_multi_record(fru, num_rec, 0xC0, ver, buf, len); if (rv != 0) { err("ipmi_fru_set_multi_record(fru, %d, 0xC0, 0x%x, buf, 0x%x", num_rec, ver, len); info->rv = SA_ERR_HPI_INTERNAL_ERROR; } info->done = 1; } SaErrorT set_atca_shelf_ip_address_control_state( struct oh_handler_state *handler, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state) { struct ohoi_resource_info *res_info; struct ohoi_handler *ohoi_handler = handler->data; SaHpiCtrlStateTextT *text; SaHpiCtrlRecTextT *ctrl; int rv; struct atca_shelf_ip_address_control_state info; if (mode == SAHPI_CTRL_MODE_AUTO) { // c->mode = mode; return SA_ERR_HPI_READ_ONLY; } if (state->Type != SAHPI_CTRL_TYPE_TEXT) { err("wrong state type %d", state->Type); return SA_ERR_HPI_INVALID_DATA; } res_info = oh_get_resource_data(handler->rptcache, ohoi_handler->atca_shelf_id); if (res_info == NULL) { err("No shelf resource info?"); return SA_ERR_HPI_INTERNAL_ERROR; } if (res_info->fru == NULL) { err("Shelf does not have IDR"); return SA_ERR_HPI_INVALID_DATA; } ctrl = &rdr->RdrTypeUnion.CtrlRec.TypeUnion.Text; text = &state->StateUnion.Text; if (text->Text.DataType != SAHPI_TL_TYPE_BINARY) { err("wrong DataType = %d", text->Text.DataType); return SA_ERR_HPI_INVALID_DATA; } if (text->Line == SAHPI_TLN_ALL_LINES) { if (text->Text.DataLength != 12) { err("wrong DataLength = %d", text->Text.DataLength); return SA_ERR_HPI_INVALID_DATA; } } else if (text->Line > ctrl->MaxLines) { err("wrong text->Line = %d", text->Line); return SA_ERR_HPI_INVALID_DATA; } else if (text->Text.DataLength != 4) { err("wrong DataLength = %d", text->Text.DataLength); return SA_ERR_HPI_INVALID_DATA; } info.hnd = handler; info.text = text; info.done = 0; info.rv = SA_OK; g_mutex_lock(res_info->fru->mutex); rv = ipmi_entity_pointer_cb(res_info->u.entity.entity_id, set_atca_shelf_ip_address_control_state_cb, &info); if (rv != 0) { err("ipmi_entity_pointer_cb = 0x%x", rv); g_mutex_unlock(res_info->fru->mutex); return SA_ERR_HPI_INTERNAL_ERROR; } rv = ohoi_loop(&info.done, ohoi_handler); g_mutex_unlock(res_info->fru->mutex); if (rv != SA_OK) { return rv; } if (info.rv != SA_OK) { return info.rv; } rv = ohoi_fru_write(ohoi_handler, res_info->u.entity.entity_id); // if (rv == SA_OK) { // c->mode = mode; // } return rv; } /* * FRU Power On Sequence Commit Status Sensor */ static void send_pwronseq_commit_status_sensor_event( struct oh_handler_state *handler, int updated) { struct ohoi_handler *ipmi_handler = handler->data; SaErrorT rv; struct ohoi_sensor_info *s_info = NULL; struct oh_event *e; SaHpiSensorEventT *sen_evt; rv = ohoi_get_rdr_data(handler, ipmi_handler->atca_shelf_id, SAHPI_SENSOR_RDR, ATCAHPI_SENSOR_NUM_PWRONSEQ_COMMIT_STATUS, (void *)&s_info); if (rv != SA_OK) { err("could not get sensor info"); return; } if (s_info == NULL) { err("could not get sensor info"); return; } if (s_info->sen_enabled == SAHPI_FALSE) { err("sensor disabled"); return; } if (!s_info->info.atcamap_sensor_info.val) { // sensor event disable err("sensor event disabled"); return; } if (updated && !(s_info->assert & SAHPI_ES_STATE_01)) { err("SAHPI_ES_STATE_01 disabled"); return; } if (!updated && !(s_info->assert & SAHPI_ES_STATE_00)) { err("SAHPI_ES_STATE_00 disabled"); return; } e = malloc(sizeof(*e)); if (!e) { err("Out of space"); return; } SaHpiRdrT *rdr = oh_get_rdr_by_type(handler->rptcache, ipmi_handler->atca_shelf_id, SAHPI_SENSOR_RDR, ATCAHPI_SENSOR_NUM_PWRONSEQ_COMMIT_STATUS); memset(e, 0, sizeof(*e)); e->event.Source = ipmi_handler->atca_shelf_id; e->event.EventType = SAHPI_ET_SENSOR; e->event.Severity = SAHPI_INFORMATIONAL; oh_gettimeofday(&e->event.Timestamp); sen_evt = &(e->event.EventDataUnion.SensorEvent); sen_evt->SensorNum = ATCAHPI_SENSOR_NUM_PWRONSEQ_COMMIT_STATUS; sen_evt->SensorType = SAHPI_OEM_SENSOR; sen_evt->EventCategory = SAHPI_EC_SENSOR_SPECIFIC; sen_evt->Assertion = SAHPI_TRUE; sen_evt->EventState = updated ? SAHPI_ES_STATE_01 : SAHPI_ES_STATE_00; sen_evt->OptionalDataPresent = SAHPI_SOD_PREVIOUS_STATE | SAHPI_SOD_CURRENT_STATE; sen_evt->CurrentState = updated ? SAHPI_ES_STATE_01 : SAHPI_ES_STATE_00; sen_evt->PreviousState = updated ? SAHPI_ES_STATE_00 : SAHPI_ES_STATE_01; if (rdr) e->rdrs = g_slist_append(e->rdrs, g_memdup(rdr, sizeof(SaHpiRdrT))); e->hid = handler->hid; oh_evt_queue_push(handler->eventq, e); } static SaErrorT get_pwronseq_commit_status_sensor_event_enable( struct oh_handler_state *hnd, struct ohoi_sensor_info *sinfo, SaHpiBoolT *enable, SaHpiEventStateT *assert, SaHpiEventStateT *deassert) { *assert = sinfo->assert; *deassert = 0; *enable = sinfo->info.atcamap_sensor_info.val; return SA_OK; } static SaErrorT set_pwronseq_commit_status_sensor_event_enable( struct oh_handler_state *hnd, struct ohoi_sensor_info *sinfo, SaHpiBoolT enable, SaHpiEventStateT assert, SaHpiEventStateT deassert, unsigned int a_supported, unsigned int d_supported) { if (deassert != 0) { err("deassert(0x%x) != 0", deassert); return SA_ERR_HPI_INVALID_DATA; } if ((assert & ~(SAHPI_ES_STATE_00 | SAHPI_ES_STATE_01))) { err("assert(0x%x)", assert); return SA_ERR_HPI_INVALID_DATA; } sinfo->assert = assert; sinfo->info.atcamap_sensor_info.val = enable; return SA_OK; } static SaErrorT get_pwronseq_commit_status_sensor_reading( struct oh_handler_state *hnd, struct ohoi_sensor_info *sensor_info, SaHpiSensorReadingT *reading, SaHpiEventStateT *ev_state) { struct ohoi_handler *ipmi_handler = hnd->data; if (reading != NULL) { reading->IsSupported = SAHPI_FALSE; } if (ev_state) { if (ipmi_handler->atca_pwonseq_updated) { *ev_state = SAHPI_ES_STATE_01; } else { *ev_state = SAHPI_ES_STATE_00; } } return SA_OK; } static SaErrorT get_pwronseq_commit_status_sensor_thresholds( struct oh_handler_state *hnd, struct ohoi_sensor_info *sinfo, SaHpiSensorThresholdsT *thres) { return SA_ERR_HPI_INVALID_CMD; } static SaErrorT set_pwronseq_commit_status_sensor_thresholds( struct oh_handler_state *hnd, struct ohoi_sensor_info *sinfo, const SaHpiSensorThresholdsT *thres) { return SA_ERR_HPI_INVALID_CMD; } static SaHpiRdrT *create_fru_power_on_sequence_commit_status_sensor( struct oh_handler_state *handler, SaHpiRptEntryT *rpt, struct ohoi_sensor_info **sensor_info) { // struct ohoi_handler *ipmi_handler = handler->data; SaHpiRdrT *rdr; struct ohoi_sensor_info *s_info; rdr = malloc(sizeof (*rdr)); if (rdr == NULL) { err("Out of memory"); return NULL; } s_info = malloc(sizeof (*s_info)); if (rdr == NULL) { err("Out of memory"); free(rdr); return NULL; } memset(rdr, 0, sizeof (*rdr)); memset(s_info, 0, sizeof (*s_info)); rdr->RdrType = SAHPI_SENSOR_RDR; rdr->IsFru = SAHPI_FALSE; rdr->Entity = rpt->ResourceEntity; rdr->RdrTypeUnion.SensorRec.Num = ATCAHPI_SENSOR_NUM_PWRONSEQ_COMMIT_STATUS; rdr->RdrTypeUnion.SensorRec.Type = SAHPI_OEM_SENSOR; rdr->RdrTypeUnion.SensorRec.Category = SAHPI_EC_SENSOR_SPECIFIC; rdr->RdrTypeUnion.SensorRec.EnableCtrl = SAHPI_TRUE; rdr->RdrTypeUnion.SensorRec.EventCtrl = SAHPI_SEC_PER_EVENT; rdr->RdrTypeUnion.SensorRec.Events = SAHPI_ES_STATE_00 | SAHPI_ES_STATE_01; rdr->RdrTypeUnion.SensorRec.DataFormat.IsSupported = SAHPI_FALSE; rdr->RdrTypeUnion.SensorRec.ThresholdDefn.IsAccessible = SAHPI_FALSE; oh_init_textbuffer(&rdr->IdString); oh_append_textbuffer(&rdr->IdString, "FRU Power On Sequence Commit Status"); s_info->support_assert = SAHPI_ES_STATE_00 | SAHPI_ES_STATE_01; s_info->support_deassert = 0; s_info->assert = SAHPI_ES_STATE_00 | SAHPI_ES_STATE_01; s_info->deassert = 0; s_info->sen_enabled = SAHPI_TRUE; s_info->enable = SAHPI_TRUE; s_info->info.atcamap_sensor_info.data = NULL; s_info->info.atcamap_sensor_info.val = SAHPI_TRUE; s_info->type = OHOI_SENSOR_ATCA_MAPPED; s_info->ohoii.get_sensor_event_enable = get_pwronseq_commit_status_sensor_event_enable; s_info->ohoii.set_sensor_event_enable = set_pwronseq_commit_status_sensor_event_enable; s_info->ohoii.get_sensor_reading = get_pwronseq_commit_status_sensor_reading; s_info->ohoii.get_sensor_thresholds = get_pwronseq_commit_status_sensor_thresholds; s_info->ohoii.set_sensor_thresholds = set_pwronseq_commit_status_sensor_thresholds; *sensor_info = s_info; return rdr; } /* * FRU Power On Sequence Controls */ static SaErrorT get_atca_fru_pwronseq_control_state( struct oh_handler_state *hnd, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state); static SaErrorT set_atca_fru_pwronseq_control_state( struct oh_handler_state *hnd, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state); static SaHpiRdrT *create_fru_power_on_sequence_control( struct oh_handler_state *handler, SaHpiRptEntryT *rpt, struct ohoi_control_info **ctrl_info, int num, SaHpiResourceIdT slotid) { // struct ohoi_handler *ipmi_handler = handler->data; SaHpiRdrT *rdr; struct ohoi_control_info *c_info; unsigned char buf[32]; rdr = malloc(sizeof (*rdr)); if (rdr == NULL) { err("Out of memory"); return NULL; } c_info = malloc(sizeof (*c_info)); if (rdr == NULL) { err("Out of memory"); free(rdr); return NULL; } memset(rdr, 0, sizeof (*rdr)); memset(c_info, 0, sizeof (*c_info)); rdr->RdrType = SAHPI_CTRL_RDR; rdr->IsFru = SAHPI_FALSE; rdr->Entity = rpt->ResourceEntity; rdr->RdrTypeUnion.CtrlRec.Num = ATCAHPI_CTRL_NUM_FRU_POWER_ON_SEQUENCE + num; rdr->RdrTypeUnion.CtrlRec.OutputType = SAHPI_CTRL_GENERIC; rdr->RdrTypeUnion.CtrlRec.Type = SAHPI_CTRL_TYPE_DISCRETE; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Discrete.Default = slotid; rdr->RdrTypeUnion.CtrlRec.DefaultMode.Mode = SAHPI_CTRL_MODE_MANUAL; rdr->RdrTypeUnion.CtrlRec.DefaultMode.ReadOnly = SAHPI_TRUE; rdr->RdrTypeUnion.CtrlRec.WriteOnly = SAHPI_FALSE; oh_init_textbuffer(&rdr->IdString); snprintf((char *)buf, 32, "FRU Power On Sequence #%d", num); oh_append_textbuffer(&rdr->IdString, (void *)buf); c_info->info.atcamap_ctrl_info.data = NULL; c_info->type = OHOI_CTRL_ATCA_MAPPED; c_info->mode = SAHPI_CTRL_MODE_MANUAL; c_info->ohoii.get_control_state = get_atca_fru_pwronseq_control_state; c_info->ohoii.set_control_state = set_atca_fru_pwronseq_control_state; *ctrl_info = c_info; return rdr; } static SaErrorT get_atca_fru_pwronseq_control_state( struct oh_handler_state *hnd, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state) { struct ohoi_handler *ipmi_handler = hnd->data; ohoi_atca_pwonseq_dsk_t *dsk; GSList *node; int num = rdr->RdrTypeUnion.CtrlRec.Num - ATCAHPI_CTRL_NUM_FRU_POWER_ON_SEQUENCE; if (state == NULL) { goto no_state; } if ((num < 0) || (num >= g_slist_length( ipmi_handler->atca_pwonseq_desk))) { err("wrong dsk number %d", num); return SA_ERR_HPI_INTERNAL_ERROR; } state->Type = SAHPI_CTRL_TYPE_DISCRETE; g_static_rec_mutex_lock(&ipmi_handler->ohoih_lock); node = g_slist_nth(ipmi_handler->atca_pwonseq_desk, num); if (node == NULL) { g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); err("No pw on descriptor #%d", num); return SA_ERR_HPI_INTERNAL_ERROR; } dsk = (ohoi_atca_pwonseq_dsk_t *)node->data; state->StateUnion.Discrete = dsk->slotid; g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); no_state : if (mode) { *mode = c->mode; } return SA_OK; } static SaErrorT set_atca_fru_pwronseq_control_state( struct oh_handler_state *handler, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state) { struct ohoi_resource_info *res_info; struct ohoi_handler *ipmi_handler = handler->data; SaHpiResourceIdT slotid; SaHpiCtrlRecT *ctrl; // GSList *node; ohoi_atca_pwonseq_dsk_t *dscp = NULL; ohoi_atca_pwonseq_rec_t *recp = NULL; int oldid; int newid; int minid, maxid; int beg, len; int i; if (mode == SAHPI_CTRL_MODE_AUTO) { c->mode = mode; return SA_OK; } if (state->Type != SAHPI_CTRL_TYPE_DISCRETE) { err("wrong state type %d", state->Type); return SA_ERR_HPI_INVALID_DATA; } slotid = state->StateUnion.Discrete; g_static_rec_mutex_lock(&ipmi_handler->ohoih_lock); res_info = oh_get_resource_data(handler->rptcache, ipmi_handler->atca_shelf_id); if (res_info == NULL) { err("No shelf resource info?"); g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); return SA_ERR_HPI_INTERNAL_ERROR; } if (res_info->fru == NULL) { g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); err("Shelf does not have IDR"); return SA_ERR_HPI_INVALID_DATA; } ctrl = &rdr->RdrTypeUnion.CtrlRec; // find out descriptor with required slotid oldid = 0; for (oldid = 0; oldid < g_slist_length( ipmi_handler->atca_pwonseq_desk); oldid++) { dscp = (ohoi_atca_pwonseq_dsk_t *)g_slist_nth_data( ipmi_handler->atca_pwonseq_desk, oldid); if (dscp == NULL) { break; } if (dscp->slotid == slotid) { break; } } if (dscp == NULL) { g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); err("No descriptor for slotid %d", slotid); return SA_ERR_HPI_INVALID_PARAMS; } newid = ctrl->Num - ATCAHPI_CTRL_NUM_FRU_POWER_ON_SEQUENCE; c->mode = mode; if (newid == oldid) { // nothing to do g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); return SA_OK; } // Rearrange descriptor ipmi_handler->atca_pwonseq_desk = g_slist_remove( ipmi_handler->atca_pwonseq_desk, dscp); ipmi_handler->atca_pwonseq_desk = g_slist_insert( ipmi_handler->atca_pwonseq_desk, dscp, newid); // Which records are affected and mark them as updated oldid--; maxid = (newid > oldid) ? newid : oldid; minid = (newid < oldid) ? newid : oldid; beg = 0; len = 0; for (i = 0; i < g_slist_length(ipmi_handler->atca_pwonseq_recs); i++) { recp = g_slist_nth_data(ipmi_handler->atca_pwonseq_recs, i); if (recp == NULL) { break; } beg += len; len = recp->head[6]; if ((beg <= maxid) && (beg + len >= minid)) { recp->updated = 1; } } if (ipmi_handler->atca_pwonseq_updated) { // was updated before. nothing to do more g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); return SA_OK; } ipmi_handler->atca_pwonseq_updated = 1; send_pwronseq_commit_status_sensor_event(handler, 1); return SA_OK; } /* * FRU Power On Sequence Commit Control */ static SaErrorT get_atca_fru_pwronseq_commit_control_state( struct oh_handler_state *hnd, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state); static SaErrorT set_atca_fru_pwronseq_commit_control_state( struct oh_handler_state *hnd, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state); static SaHpiRdrT *create_fru_power_on_sequence_commit_control( struct oh_handler_state *handler, SaHpiRptEntryT *rpt, struct ohoi_control_info **ctrl_info) { // struct ohoi_handler *ipmi_handler = handler->data; SaHpiRdrT *rdr; struct ohoi_control_info *c_info; rdr = malloc(sizeof (*rdr)); if (rdr == NULL) { err("Out of memory"); return NULL; } c_info = malloc(sizeof (*c_info)); if (rdr == NULL) { err("Out of memory"); free(rdr); return NULL; } memset(rdr, 0, sizeof (*rdr)); memset(c_info, 0, sizeof (*c_info)); rdr->RdrType = SAHPI_CTRL_RDR; rdr->IsFru = SAHPI_FALSE; rdr->Entity = rpt->ResourceEntity; rdr->RdrTypeUnion.CtrlRec.Num = ATCAHPI_CTRL_NUM_FRU_POWER_ON_SEQUENCE_COMMIT; rdr->RdrTypeUnion.CtrlRec.OutputType = SAHPI_CTRL_GENERIC; rdr->RdrTypeUnion.CtrlRec.Type = SAHPI_CTRL_TYPE_DIGITAL; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Digital.Default = SAHPI_CTRL_STATE_OFF; rdr->RdrTypeUnion.CtrlRec.DefaultMode.Mode = SAHPI_CTRL_MODE_MANUAL; rdr->RdrTypeUnion.CtrlRec.DefaultMode.ReadOnly = SAHPI_TRUE; rdr->RdrTypeUnion.CtrlRec.WriteOnly = SAHPI_FALSE; oh_init_textbuffer(&rdr->IdString); oh_append_textbuffer(&rdr->IdString, "FRU Power On Sequence Commit"); c_info->info.atcamap_ctrl_info.data = NULL; c_info->type = OHOI_CTRL_ATCA_MAPPED; c_info->mode = SAHPI_CTRL_MODE_MANUAL; c_info->ohoii.get_control_state = get_atca_fru_pwronseq_commit_control_state; c_info->ohoii.set_control_state = set_atca_fru_pwronseq_commit_control_state; *ctrl_info = c_info; return rdr; } static SaErrorT get_atca_fru_pwronseq_commit_control_state( struct oh_handler_state *hnd, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state) { if (state) { state->Type = SAHPI_CTRL_TYPE_DIGITAL; state->StateUnion.Digital = SAHPI_CTRL_STATE_OFF; } if (mode) { *mode = c->mode; } return SA_OK; } struct fru_pwronseq_commit_control_s { struct ohoi_handler *ipmi_handler; unsigned char *buf; unsigned int len; unsigned int num; SaErrorT rv; }; static void write_power_on_sequence_data_cb(ipmi_entity_t *ent, void *cb_data) { struct fru_pwronseq_commit_control_s *info = cb_data; ipmi_fru_t *fru = ipmi_entity_get_fru(ent); int rv; rv = ipmi_fru_set_multi_record(fru, info->num, 0xC0, 0x0, info->buf, info->len); if (rv != 0) { err("ipmi_fru_set_multi_record(fru, %d, 0xC0, 0x0, buf, %d)" " = %d", info->num, info->len, rv); info->rv = SA_ERR_HPI_INTERNAL_ERROR; } } static SaErrorT set_atca_fru_pwronseq_commit_control_state( struct oh_handler_state *hnd, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state) { SaHpiCtrlStateDiscreteT value; struct ohoi_handler *ipmi_handler = hnd->data; struct ohoi_resource_info *res_info; // GSList *dnode, *rnode; ohoi_atca_pwonseq_rec_t *recp; ohoi_atca_pwonseq_dsk_t *dscp; int i, j, di; unsigned int num; unsigned char buf[256]; unsigned int len; struct fru_pwronseq_commit_control_s info; if (mode == SAHPI_CTRL_MODE_AUTO) { return SA_ERR_HPI_READ_ONLY; } value = state->StateUnion.Digital; if (value != SAHPI_CTRL_STATE_PULSE_ON) { err("wrong discrete value %d", value); return SA_ERR_HPI_INVALID_REQUEST; } g_static_rec_mutex_lock(&ipmi_handler->ohoih_lock); if (!ipmi_handler->atca_pwonseq_updated) { g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); return SA_OK; } res_info = oh_get_resource_data(hnd->rptcache, ipmi_handler->atca_shelf_id); if ((value == SAHPI_CTRL_STATE_PULSE_OFF) || (value == SAHPI_CTRL_STATE_OFF)) { ipmi_entity_pointer_cb(res_info->u.entity.entity_id, init_power_on_sequence_data_cb, ipmi_handler); send_pwronseq_commit_status_sensor_event(hnd, 0); g_static_rec_mutex_lock(&ipmi_handler->ohoih_lock); return SA_OK; } // SAHPI_CTRL_STATE_PULSE_ON operation // at first check the correctness of the lists num = 0; for (i = 0; ; i++) { recp = (ohoi_atca_pwonseq_rec_t *)g_slist_nth_data( ipmi_handler->atca_pwonseq_recs, i); if (recp == NULL) { if (i != 0) break; else continue; } num += recp->head[6]; } if (num != g_slist_length(ipmi_handler->atca_pwonseq_desk)) { err("list length dismatched: %d != %d", num, g_slist_length(ipmi_handler->atca_pwonseq_desk)); g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); return SA_ERR_HPI_INTERNAL_ERROR; } di = 0; for (i = 0; ; i++) { recp = (ohoi_atca_pwonseq_rec_t *)g_slist_nth_data( ipmi_handler->atca_pwonseq_recs, i); if (recp == NULL) { if (i != 0) break; else continue; } if (!recp->updated) { continue; } memcpy(buf, recp->head, 7); len = 7; for (j = 0; j < recp->head[6]; j++) { dscp = (ohoi_atca_pwonseq_dsk_t *)g_slist_nth_data( ipmi_handler->atca_pwonseq_desk, di); if (dscp == NULL) { err("No descrintor %d for record %d", j, i); g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); return SA_ERR_HPI_INTERNAL_ERROR; } memcpy(buf + len, dscp->body, 5); len += 5; di++; } #if 0 printf("RECORD: 0x%02x%02x%02x%02x%02x%02x%02x\n", buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]); for (j = 0; j < recp->head[6]; j++) printf("%02x%02x%02x%02x%02x\n", buf[7 + 5 * j + 0], buf[7 + 5 * j + 1], buf[7 + 5 * j + 2], buf[7 + 5 * j + 3], buf[7 + 5 * j + 4]); #endif info.ipmi_handler = ipmi_handler; info.buf = buf; info.len = len; info.num = recp->rec_num; info.rv = SA_OK; g_mutex_lock(res_info->fru->mutex); ipmi_entity_pointer_cb(res_info->u.entity.entity_id, write_power_on_sequence_data_cb, &info); g_mutex_unlock(res_info->fru->mutex); if (info.rv != SA_OK) { ipmi_handler->shelf_fru_corrupted = 1; g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); return info.rv; } recp->updated = 0; } ipmi_handler->atca_pwonseq_updated = 0; // XXX Call real write fru send_pwronseq_commit_status_sensor_event(hnd, 0); g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); return SA_OK; } /* * Creating Virtual Shelf RDRs after domain fully up */ struct create_pwonseq { unsigned char addr; unsigned char devid; }; static int assign_slotid_to_pwonseq( struct oh_handler_state *handler, SaHpiRptEntryT *rpt, struct ohoi_resource_info *res_info, void *cb_data) { ohoi_atca_pwonseq_dsk_t *dsk = cb_data; if (!(res_info->type & OHOI_RESOURCE_SLOT)) { return 0; } if ((dsk->body[0] << 1) != res_info->u.slot.addr) { return 0; } if (dsk->body[1] == res_info->u.slot.devid) { dsk->slotid = rpt->ResourceId; return 1; } if (dsk->body[1] == 0xFE) { dsk->slotid = rpt->ResourceId; return 1; } return 0; } void ohoi_atca_create_shelf_virtual_rdrs(struct oh_handler_state *hnd) { struct ohoi_handler *ipmi_handler = hnd->data; ohoi_atca_pwonseq_dsk_t *dsk; // GSList *node; int i; SaHpiRptEntryT *rpt; SaHpiRdrT *rdr; struct ohoi_control_info *c_info; struct ohoi_sensor_info *s_info; int num_controls = 0; int num_sensors = 0; struct ohoi_resource_info *res_info; g_static_rec_mutex_lock(&ipmi_handler->ohoih_lock); rpt = oh_get_resource_by_id(hnd->rptcache, ipmi_handler->atca_shelf_id); if (rpt == NULL) { err("No rpt for atca chassis?"); return; } res_info = oh_get_resource_data(hnd->rptcache, ipmi_handler->atca_shelf_id); // init data for Power On Sequence RDRs ipmi_entity_pointer_cb(res_info->u.entity.entity_id, init_power_on_sequence_data_cb, ipmi_handler); // Create Shelf Address control rdr = create_atca_shelf_address_control(ipmi_handler, rpt, &c_info); if (rdr != NULL && (oh_add_rdr(hnd->rptcache, ipmi_handler->atca_shelf_id, rdr, c_info, 1) != SA_OK)) { err("couldn't add control rdr"); free(rdr); free(c_info); } else { num_controls++; } // Create Shelf IP Address control rdr = create_atca_shelf_ip_address_control(hnd, rpt, &c_info); if (rdr != NULL && (oh_add_rdr(hnd->rptcache, ipmi_handler->atca_shelf_id, rdr, c_info, 1) != SA_OK)) { err("couldn't add control rdr"); free(rdr); free(c_info); } else { num_controls++; } // Create Chassis Status control rdr = create_atca_chassis_status_control(ipmi_handler, rpt, &c_info); if (rdr != NULL && (oh_add_rdr(hnd->rptcache, ipmi_handler->atca_shelf_id, rdr, c_info, 1) != SA_OK)) { err("couldn't add control rdr"); free(rdr); free(c_info); } else { num_controls++; } // Create Power On Sequence Commit control rdr = create_fru_power_on_sequence_commit_control(hnd, rpt, &c_info); if (rdr != NULL && (oh_add_rdr(hnd->rptcache, ipmi_handler->atca_shelf_id, rdr, c_info, 1) != SA_OK)) { err("couldn't add control rdr"); free(rdr); free(c_info); } else { num_controls++; } // assign Resource slot Ids for FRU activation descriptors // and create FRU Power ON Sequence controls i = 0; for (i = 0; i < g_slist_length(ipmi_handler->atca_pwonseq_desk); i++) { dsk = (ohoi_atca_pwonseq_dsk_t *)g_slist_nth_data( ipmi_handler->atca_pwonseq_desk, i); if (dsk == NULL) { err("no descriptor"); continue; } ohoi_iterate_rptcache(hnd, assign_slotid_to_pwonseq, dsk); rdr = create_fru_power_on_sequence_control(hnd, rpt, &c_info, i, dsk->slotid); if (rdr != NULL && (oh_add_rdr(hnd->rptcache, ipmi_handler->atca_shelf_id, rdr, c_info, 1) != SA_OK)) { err("couldn't add control rdr"); free(rdr); free(c_info); } else { num_controls++; } } // Create Power On Sequence Commit Status sensor rdr = create_fru_power_on_sequence_commit_status_sensor(hnd, rpt, &s_info); if (rdr != NULL && (oh_add_rdr(hnd->rptcache, ipmi_handler->atca_shelf_id, rdr, s_info, 1) != SA_OK)) { err("couldn't add control rdr"); free(rdr); free(s_info); } else { num_sensors++; } if (num_controls) { rpt->ResourceCapabilities |= SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_RDR; } if (num_sensors) { rpt->ResourceCapabilities |= SAHPI_CAPABILITY_SENSOR | SAHPI_CAPABILITY_RDR; } if (!num_sensors && !num_controls) { g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); return; } entity_rpt_set_updated(res_info, ipmi_handler); g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); } openhpi-3.6.1/plugins/ipmi/ipmi_sensor.c0000644000175100017510000010725612575647300017311 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Louis Zhuang * Kevin Gao * Rusty Lynch * Racing Guo */ #include "ipmi.h" #define OHOI_TIMEOUT 10 /* 10 seconds, was 5 seconds */ struct ipmi_event_state_s { unsigned int status; /* Pay no attention to the implementation. */ unsigned int __assertion_events; unsigned int __deassertion_events; }; /* * Use for getting sensor reading */ struct ohoi_sensor_reading { SaHpiSensorReadingT reading; SaHpiEventStateT ev_state; int done; int rvalue; }; /* * Use for getting/setting sensor threadholds */ struct ohoi_sensor_thresholds { SaHpiSensorThresholdsT sensor_thres; ipmi_thresholds_t *thrhlds; int thres_done; int hyster_done; int rvalue; }; /* * Use for sensor event enable and sensor event masks */ struct ohoi_sensor_event_enable_masks { SaHpiBoolT enable; SaHpiEventStateT assert; SaHpiEventStateT deassert; unsigned int a_support; unsigned int d_support; ipmi_event_state_t *states; int done; int rvalue; }; static int ignore_sensor(ipmi_sensor_t *sensor) { ipmi_entity_t *ent; if (ipmi_sensor_get_ignore_if_no_entity(sensor)) { err("ignore if no entity"); return 0; } ent = ipmi_sensor_get_entity(sensor); if (ent == NULL) { err("ipmi_sensor_get_entity = NULL"); return 1; } if (!ipmi_entity_is_present(ent)) { err("!ipmi_entity_is_present. (%d,%d,%d,%d) %s", ipmi_entity_get_entity_id(ent), ipmi_entity_get_entity_instance(ent), ipmi_entity_get_device_channel(ent), ipmi_entity_get_device_address(ent), ipmi_entity_get_entity_id_string(ent)); return 0; } return 0; } /* GET SENSOR READING */ static SaHpiEventStateT retrieve_states(ipmi_states_t *states) { SaHpiEventStateT st = 0; int i; // fortunatly as discrete as threshold sensors IPMI states // is mapped 1:1 to HPI states for (i = 0; i < 15; i++) { if (ipmi_is_state_set(states, i)) { st |= (1 << i); } } return st; } static void sensor_read_states(ipmi_sensor_t *sensor, int err, ipmi_states_t *states, void *cb_data) { struct ohoi_sensor_reading *p = cb_data; p->done = 1; if (err) { err("sensor reading state error"); p->rvalue = SA_ERR_HPI_INTERNAL_ERROR; return; } p->reading.IsSupported = SAHPI_FALSE; p->ev_state = retrieve_states(states); } static void sensor_reading(ipmi_sensor_t *sensor, int err, enum ipmi_value_present_e value_present, unsigned int raw_val, double val, ipmi_states_t *states, void *cb_data) { struct ohoi_sensor_reading *p = cb_data; p->done = 1; if (err) { OHOI_MAP_ERROR(p->rvalue, err); err("sensor reading error"); p->rvalue = SA_ERR_HPI_INTERNAL_ERROR; return; } p->reading.IsSupported = SAHPI_FALSE; if (value_present == IPMI_BOTH_VALUES_PRESENT) { p->reading.IsSupported = SAHPI_TRUE; p->reading.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; p->reading.Value.SensorFloat64 = val; } else if(value_present == IPMI_RAW_VALUE_PRESENT) { p->reading.IsSupported = SAHPI_TRUE; p->reading.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; p->reading.Value.SensorFloat64 = raw_val; } else { err("value present = 0x%x", value_present); } // always returns 1 in 7th bit. Ignore extra 1 p->ev_state = retrieve_states(states) & (SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT); } static void get_sensor_reading(ipmi_sensor_t *sensor, void *cb_data) { struct ohoi_sensor_reading *reading_data; int rv; reading_data = cb_data; if (ignore_sensor(sensor)) { reading_data->done = 1; reading_data->rvalue = SA_ERR_HPI_NOT_PRESENT; err("Sensor is not present, ignored"); return; } if (ipmi_sensor_get_event_reading_type(sensor) == IPMI_EVENT_READING_TYPE_THRESHOLD) { rv = ipmi_sensor_get_reading(sensor, sensor_reading, reading_data); if (rv) { reading_data->done = 1; reading_data->rvalue = SA_ERR_HPI_INVALID_REQUEST; err("Unable to get sensor reading: 0x%x", rv); } return; } rv = ipmi_sensor_get_states(sensor, sensor_read_states, reading_data); if (rv) { reading_data->done = 1; reading_data->rvalue = SA_ERR_HPI_INVALID_REQUEST; err("Unable to get sensor reading states: 0x%x", rv); } } SaErrorT orig_get_sensor_reading(struct oh_handler_state *handler, struct ohoi_sensor_info *sensor_info, SaHpiSensorReadingT *reading, SaHpiEventStateT *ev_state) { struct ohoi_handler *ipmi_handler = (struct ohoi_handler *)(handler->data); struct ohoi_sensor_reading reading_data; int rv; ipmi_sensor_id_t sensor_id; sensor_id = sensor_info->info.orig_sensor_info.sensor_id; memset(&reading_data, 0, sizeof(reading_data)); rv = ipmi_sensor_pointer_cb(sensor_id, get_sensor_reading, &reading_data); if (rv) { err("Unable to convert sensor_id to pointer"); return SA_ERR_HPI_INVALID_CMD; } rv = ohoi_loop(&reading_data.done, ipmi_handler); if (rv) return rv; if (reading_data.rvalue) return reading_data.rvalue; *reading = reading_data.reading; *ev_state = reading_data.ev_state & 0x7fff; return SA_OK; } SaErrorT ohoi_get_sensor_reading(void *hnd, struct ohoi_sensor_info *sensor_info, SaHpiSensorReadingT *reading, SaHpiEventStateT *ev_state) { struct oh_handler_state *handler = (struct oh_handler_state *)hnd; if (sensor_info->ohoii.get_sensor_reading == NULL) { return SA_ERR_HPI_INVALID_CMD; } return sensor_info->ohoii.get_sensor_reading(handler, sensor_info, reading, ev_state); } /* GET SENSOR THRESHOLDS */ static void thres_get(ipmi_sensor_t *sensor, ipmi_thresholds_t *th, unsigned int event, SaHpiSensorReadingT *thres) { int val; ipmi_sensor_threshold_readable(sensor, event, &val); if (!val) { thres->IsSupported = SAHPI_FALSE; return; } if (0 == ipmi_threshold_get(th, event, &thres->Value.SensorFloat64)) { thres->IsSupported = SAHPI_TRUE; thres->Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; }else { thres->IsSupported = SAHPI_FALSE; } } static void thresholds_read(ipmi_sensor_t *sensor, int err, ipmi_thresholds_t *th, void *cb_data) { struct ohoi_sensor_thresholds *p = cb_data; if (err) { OHOI_MAP_ERROR(p->rvalue, err); p->thres_done = 1; err("sensor thresholds reading error"); return; } thres_get(sensor, th, IPMI_LOWER_NON_CRITICAL, &p->sensor_thres.LowMinor); thres_get(sensor, th, IPMI_LOWER_CRITICAL, &p->sensor_thres.LowMajor); thres_get(sensor, th, IPMI_LOWER_NON_RECOVERABLE, &p->sensor_thres.LowCritical); thres_get(sensor, th, IPMI_UPPER_NON_CRITICAL, &p->sensor_thres.UpMinor); thres_get(sensor, th, IPMI_UPPER_CRITICAL, &p->sensor_thres.UpMajor); thres_get(sensor, th, IPMI_UPPER_NON_RECOVERABLE, &p->sensor_thres.UpCritical); p->thres_done = 1; } static SaErrorT get_thresholds(ipmi_sensor_t *sensor, struct ohoi_sensor_thresholds *thres_data) { int rv; rv = ipmi_sensor_get_thresholds(sensor, thresholds_read, thres_data); if (rv) err("Unable to get sensor thresholds: 0x%x\n", rv); return (rv? SA_ERR_HPI_INVALID_CMD : SA_OK); } static void hysteresis_read(ipmi_sensor_t *sensor, int err, unsigned int positive_hysteresis, unsigned int negative_hysteresis, void *cb_data) { struct ohoi_sensor_thresholds *p = cb_data; if (err) { p->rvalue = SA_ERR_HPI_INTERNAL_ERROR; p->hyster_done = 1; err("sensor hysteresis reading error"); return; } p->sensor_thres.PosThdHysteresis.IsSupported = SAHPI_TRUE; p->sensor_thres.PosThdHysteresis.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; p->sensor_thres.PosThdHysteresis.Value.SensorFloat64 = positive_hysteresis; p->sensor_thres.NegThdHysteresis.IsSupported = SAHPI_TRUE; p->sensor_thres.NegThdHysteresis.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; p->sensor_thres.NegThdHysteresis.Value.SensorFloat64 = negative_hysteresis; p->hyster_done = 1; } static SaErrorT get_hysteresis(ipmi_sensor_t *sensor, struct ohoi_sensor_thresholds *thres_data) { int rv; rv = ipmi_sensor_get_hysteresis(sensor, hysteresis_read, thres_data); if (rv) err("Unable to get sensor hysteresis: 0x%x\n", rv); return (rv? SA_ERR_HPI_INVALID_CMD : SA_OK); } static void get_sensor_thresholds(ipmi_sensor_t *sensor, void *cb_data) { struct ohoi_sensor_thresholds *thres_data; int rv; thres_data = cb_data; if (ignore_sensor(sensor)) { thres_data->hyster_done = 1; thres_data->thres_done = 1; thres_data->rvalue = SA_ERR_HPI_NOT_PRESENT; err("ENTITY_NOT_PRESENT"); return; } if (ipmi_sensor_get_event_reading_type(sensor) != IPMI_EVENT_READING_TYPE_THRESHOLD) { err("Not threshold sensor!"); thres_data->hyster_done = 1; thres_data->thres_done = 1; thres_data->rvalue = SA_ERR_HPI_INVALID_CMD; return; } if (ipmi_sensor_get_threshold_access(sensor) == IPMI_THRESHOLD_ACCESS_SUPPORT_NONE) { err("sensor doesn't support threshold read"); err("Unable to get sensor thresholds"); thres_data->hyster_done = 1; thres_data->thres_done = 1; thres_data->rvalue = SA_ERR_HPI_INVALID_CMD; return; } rv = get_thresholds(sensor, thres_data); if (rv != SA_OK) { err("Unable to get sensor thresholds"); thres_data->hyster_done = 1; thres_data->thres_done = 1; thres_data->rvalue = rv; return; } rv = ipmi_sensor_get_hysteresis_support(sensor); if (rv != IPMI_HYSTERESIS_SUPPORT_READABLE && rv != IPMI_HYSTERESIS_SUPPORT_SETTABLE) { // thres_data->thres_done = 1; thres_data->hyster_done = 1; thres_data->sensor_thres.PosThdHysteresis.IsSupported = SAHPI_FALSE; thres_data->sensor_thres.NegThdHysteresis.IsSupported = SAHPI_FALSE; return; } rv = get_hysteresis(sensor, thres_data); if (rv != SA_OK) { err("failed to get hysteresis"); thres_data->hyster_done = 1; // thres_data->thres_done = 1; thres_data->rvalue = SA_ERR_HPI_INTERNAL_ERROR; return; } return; } static int is_get_sensor_thresholds_done(const void *cb_data) { const struct ohoi_sensor_thresholds *thres_data; thres_data = cb_data; /* Can we check the validity of this pointer here to avoid SegFault? */ return (thres_data->thres_done && thres_data->hyster_done); } SaErrorT orig_get_sensor_thresholds(struct oh_handler_state *handler, struct ohoi_sensor_info *sensor_info, SaHpiSensorThresholdsT *thres) { struct ohoi_handler *ipmi_handler = (struct ohoi_handler *)(handler->data); struct ohoi_sensor_thresholds thres_data; int rv; ipmi_sensor_id_t sensor_id; sensor_id = sensor_info->info.orig_sensor_info.sensor_id; memset(&thres_data, 0, sizeof(thres_data)); rv = ipmi_sensor_pointer_cb(sensor_id, get_sensor_thresholds, &thres_data); if (rv) { err("Unable to convert sensor id into pointer"); return SA_ERR_HPI_INVALID_CMD; } rv = ohoi_loop_until(is_get_sensor_thresholds_done, &thres_data, OHOI_TIMEOUT, ipmi_handler); if (rv) return rv; if (thres_data.rvalue) return thres_data.rvalue; if (thres) *thres = thres_data.sensor_thres; return SA_OK; } SaErrorT ohoi_get_sensor_thresholds(void *hnd, struct ohoi_sensor_info *sensor_info, SaHpiSensorThresholdsT *thres) { struct oh_handler_state *handler = (struct oh_handler_state *)hnd; if (sensor_info->ohoii.get_sensor_thresholds == NULL) { return SA_ERR_HPI_INVALID_CMD; } return sensor_info->ohoii.get_sensor_thresholds(handler, sensor_info, thres); } /* SET SENSOR THRESHOLDS */ static void thres_set_data(ipmi_sensor_t *sensor, int err, void *cb_data) { struct ohoi_sensor_thresholds *info = cb_data; if (err) { err("err = 0x%x", err); if (info->rvalue == SA_OK) { OHOI_MAP_ERROR(info->rvalue, err); } } info->thres_done = 1; } static void hys_set_data(ipmi_sensor_t *sensor, int err, void *cb_data) { struct ohoi_sensor_thresholds *info = cb_data; if (err) { err("err = 0x%x", err); if (info->rvalue == SA_OK) { OHOI_MAP_ERROR(info->rvalue, err); } } info->hyster_done = 1; } static SaErrorT thres_cpy(ipmi_sensor_t *sensor, const SaHpiSensorReadingT reading, unsigned int event, ipmi_thresholds_t *info) { int val; int rv; if (!reading.IsSupported) { return SA_OK; } if ((rv = ipmi_sensor_threshold_settable(sensor, event, &val))) { err("ipmi_sensor_threshold_settable error = %d", rv); return SA_ERR_HPI_INVALID_CMD; } if (!val) { err("ipmi threshold 0x%x isn't settable", event); return SA_ERR_HPI_INVALID_DATA; } switch (reading.Type) { /*Fix Me* case...*/ case SAHPI_SENSOR_READING_TYPE_INT64: case SAHPI_SENSOR_READING_TYPE_UINT64: case SAHPI_SENSOR_READING_TYPE_BUFFER: break; case SAHPI_SENSOR_READING_TYPE_FLOAT64: if(ipmi_threshold_set(info, sensor, event, reading.Value.SensorFloat64)) { return SA_OK; } break; } return SA_OK; } static SaErrorT init_thresholeds_info( ipmi_sensor_t *sensor, const SaHpiSensorThresholdsT *thres, ipmi_thresholds_t *info) { SaErrorT rv; if (ipmi_thresholds_init(info)) { return SA_ERR_HPI_INTERNAL_ERROR; } rv = thres_cpy(sensor, thres->LowMinor, IPMI_LOWER_NON_CRITICAL, info); if (rv != SA_OK) return rv; rv = thres_cpy(sensor, thres->LowMajor, IPMI_LOWER_CRITICAL, info); if (rv != SA_OK) return rv; rv = thres_cpy(sensor, thres->LowCritical, IPMI_LOWER_NON_RECOVERABLE, info); if (rv != SA_OK) return rv; rv = thres_cpy(sensor, thres->UpMinor, IPMI_UPPER_NON_CRITICAL, info); if (rv != SA_OK) return rv; rv = thres_cpy(sensor, thres->UpMajor, IPMI_UPPER_CRITICAL, info); if (rv != SA_OK) return rv; rv = thres_cpy(sensor, thres->UpCritical, IPMI_UPPER_NON_RECOVERABLE, info); if (rv != SA_OK) return rv; return SA_OK; } static SaErrorT set_thresholds(ipmi_sensor_t *sensor, struct ohoi_sensor_thresholds *thres_data) { ipmi_thresholds_t *info = thres_data->thrhlds; int rv; rv = init_thresholeds_info(sensor, &thres_data->sensor_thres, info); if (rv != SA_OK) { err("Unable to init sensor thresholds: 0x%x\n", rv); return rv; } rv = ipmi_sensor_set_thresholds(sensor, info, thres_set_data, thres_data); if (rv) { err("Unable to set sensor thresholds: 0x%x\n", rv); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } static SaErrorT set_hysteresis(ipmi_sensor_t *sensor, struct ohoi_sensor_thresholds *thres_data) { int rv; unsigned int pos = 0, neg = 0; SaHpiSensorReadingT pos_reading = thres_data->sensor_thres.PosThdHysteresis; SaHpiSensorReadingT neg_reading = thres_data->sensor_thres.NegThdHysteresis; switch (pos_reading.Type) { case SAHPI_SENSOR_READING_TYPE_INT64: pos = pos_reading.Value.SensorInt64; break; case SAHPI_SENSOR_READING_TYPE_UINT64: pos = pos_reading.Value.SensorUint64; break; case SAHPI_SENSOR_READING_TYPE_FLOAT64: pos = pos_reading.Value.SensorFloat64; break; case SAHPI_SENSOR_READING_TYPE_BUFFER: err("ipmi sensor doesn't support this type of reading"); return SA_ERR_HPI_INVALID_DATA; } switch (neg_reading.Type) { case SAHPI_SENSOR_READING_TYPE_INT64: neg = neg_reading.Value.SensorInt64; break; case SAHPI_SENSOR_READING_TYPE_UINT64: neg = neg_reading.Value.SensorUint64; break; case SAHPI_SENSOR_READING_TYPE_FLOAT64: neg = neg_reading.Value.SensorFloat64; break; case SAHPI_SENSOR_READING_TYPE_BUFFER: err("ipmi sensor doesn't support this type of reading"); return SA_ERR_HPI_INVALID_DATA; } rv = ipmi_sensor_set_hysteresis(sensor, pos, neg, hys_set_data, thres_data); if (rv) { err("Unable to set sensor hysteresis: 0x%x\n", rv); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } static void set_sensor_thresholds(ipmi_sensor_t *sensor, void *cb_data) { struct ohoi_sensor_thresholds *thres_data; SaErrorT rv; thres_data = cb_data; if (ignore_sensor(sensor)) { err("sensor is ignored"); thres_data->hyster_done = 1; thres_data->thres_done = 1; thres_data->rvalue = SA_ERR_HPI_NOT_PRESENT; return; } if (ipmi_sensor_get_event_reading_type(sensor) != IPMI_EVENT_READING_TYPE_THRESHOLD) { err("Not threshold sensor!"); thres_data->hyster_done = 1; thres_data->thres_done = 1; thres_data->rvalue = SA_ERR_HPI_INVALID_CMD; return; } if ((ipmi_sensor_get_threshold_access(sensor) != IPMI_THRESHOLD_ACCESS_SUPPORT_SETTABLE) || (ipmi_sensor_get_hysteresis_support(sensor) != IPMI_HYSTERESIS_SUPPORT_SETTABLE)) { err("sensor doesn't support threshold or histeresis set"); thres_data->hyster_done = 1; thres_data->thres_done = 1; thres_data->rvalue = SA_ERR_HPI_INVALID_CMD; return; } rv = set_thresholds(sensor, thres_data); if (rv != SA_OK) { err("Unable to set thresholds"); thres_data->hyster_done = 1; thres_data->thres_done = 1; thres_data->rvalue = rv; return; } rv = set_hysteresis(sensor, thres_data); if (rv != SA_OK) { thres_data->hyster_done = 1; thres_data->thres_done = 1; thres_data->rvalue = rv; err("Unable to set hysteresis"); return; } return; } SaErrorT orig_set_sensor_thresholds(struct oh_handler_state *handler, struct ohoi_sensor_info *sensor_info, const SaHpiSensorThresholdsT *thres) { struct ohoi_handler *ipmi_handler = (struct ohoi_handler *)(handler->data); struct ohoi_sensor_thresholds thres_data; int rv; ipmi_sensor_id_t sensor_id; sensor_id = sensor_info->info.orig_sensor_info.sensor_id; memset(&thres_data, 0, sizeof(thres_data)); thres_data.thrhlds = malloc(ipmi_thresholds_size()); if (thres_data.thrhlds == NULL) { err("could not alloc memory"); return SA_ERR_HPI_OUT_OF_MEMORY; } thres_data.sensor_thres = *thres; rv = ipmi_sensor_pointer_cb(sensor_id, set_sensor_thresholds, &thres_data); if (rv) { err("Unable to convert sensor_id to pointer"); free(thres_data.thrhlds); return SA_ERR_HPI_INVALID_CMD; } rv = ohoi_loop_until(is_get_sensor_thresholds_done, &thres_data, OHOI_TIMEOUT, ipmi_handler); free(thres_data.thrhlds); if (rv != SA_OK) { return rv; } if (thres_data.rvalue) { return thres_data.rvalue; } return SA_OK; } SaErrorT ohoi_set_sensor_thresholds(void *hnd, struct ohoi_sensor_info *sensor_info, const SaHpiSensorThresholdsT *thres) { struct oh_handler_state *handler = (struct oh_handler_state *)hnd; if (sensor_info->ohoii.set_sensor_thresholds == NULL) { return SA_ERR_HPI_INVALID_CMD; } return sensor_info->ohoii.set_sensor_thresholds(handler, sensor_info, thres); } /* SENSOR ENABLE */ static void set_sensor_enable(ipmi_sensor_t *sensor, void *cb_data) { // SaHpiBoolT *enable = cb_data; // ipmi_sensor_set_ignore_if_no_entity(sensor, *enable); return; } int ohoi_set_sensor_enable(ipmi_sensor_id_t sensor_id, SaHpiBoolT enable, void *cb_data) { SaErrorT rv; rv = ipmi_sensor_pointer_cb(sensor_id, set_sensor_enable, &enable); if (rv) { err("Unable to convert sensor_id to pointer"); return SA_ERR_HPI_INVALID_CMD; } return SA_OK; } /* SENSOR EVENT ENABLE MASK */ static void convert_to_ohoi_event_states(ipmi_sensor_t *sensor, ipmi_event_state_t *state, SaHpiEventStateT *assert, SaHpiEventStateT *deassert) { int i; *assert = 0; *deassert = 0; if(ipmi_sensor_get_event_reading_type(sensor) != IPMI_EVENT_READING_TYPE_THRESHOLD) { for (i = 0; i < 15; i++) { if (ipmi_is_discrete_event_set(state, i, IPMI_ASSERTION)) { *assert |= (1 << i); } if (ipmi_is_discrete_event_set(state, i, IPMI_DEASSERTION)) { *deassert |= (1 << i); } } return; } // threshold sensor if (ipmi_is_threshold_event_set(state, IPMI_LOWER_NON_CRITICAL, IPMI_GOING_LOW, IPMI_ASSERTION)) { *assert |= SAHPI_ES_LOWER_MINOR; } if (ipmi_is_threshold_event_set(state, IPMI_LOWER_NON_CRITICAL, IPMI_GOING_HIGH, IPMI_ASSERTION)) { *deassert |= SAHPI_ES_LOWER_MINOR; } if (ipmi_is_threshold_event_set(state, IPMI_LOWER_NON_CRITICAL, IPMI_GOING_LOW, IPMI_DEASSERTION)) { *deassert |= SAHPI_ES_LOWER_MINOR; } if (ipmi_is_threshold_event_set(state, IPMI_LOWER_NON_CRITICAL, IPMI_GOING_HIGH, IPMI_DEASSERTION)) { *assert |= SAHPI_ES_LOWER_MINOR; } if (ipmi_is_threshold_event_set(state, IPMI_LOWER_CRITICAL, IPMI_GOING_LOW, IPMI_ASSERTION)) { *assert |= SAHPI_ES_LOWER_MAJOR; } if (ipmi_is_threshold_event_set(state, IPMI_LOWER_CRITICAL, IPMI_GOING_HIGH, IPMI_ASSERTION)) { *deassert |= SAHPI_ES_LOWER_MAJOR; } if (ipmi_is_threshold_event_set(state, IPMI_LOWER_CRITICAL, IPMI_GOING_LOW, IPMI_DEASSERTION)) { *deassert |= SAHPI_ES_LOWER_MAJOR; } if (ipmi_is_threshold_event_set(state, IPMI_LOWER_CRITICAL, IPMI_GOING_HIGH, IPMI_DEASSERTION)) { *assert |= SAHPI_ES_LOWER_MAJOR; } if (ipmi_is_threshold_event_set(state, IPMI_LOWER_NON_RECOVERABLE, IPMI_GOING_LOW, IPMI_ASSERTION)) { *assert |= SAHPI_ES_LOWER_CRIT; } if (ipmi_is_threshold_event_set(state, IPMI_LOWER_NON_RECOVERABLE, IPMI_GOING_HIGH, IPMI_ASSERTION)) { *deassert |= SAHPI_ES_LOWER_CRIT; } if (ipmi_is_threshold_event_set(state, IPMI_LOWER_NON_RECOVERABLE, IPMI_GOING_LOW, IPMI_DEASSERTION)) { *deassert |= SAHPI_ES_LOWER_CRIT; } if (ipmi_is_threshold_event_set(state, IPMI_LOWER_NON_RECOVERABLE, IPMI_GOING_HIGH, IPMI_DEASSERTION)) { *assert |= SAHPI_ES_LOWER_CRIT; } if (ipmi_is_threshold_event_set(state, IPMI_UPPER_NON_CRITICAL, IPMI_GOING_LOW, IPMI_ASSERTION)) { *deassert |= SAHPI_ES_UPPER_MINOR; } if (ipmi_is_threshold_event_set(state, IPMI_UPPER_NON_CRITICAL, IPMI_GOING_HIGH, IPMI_ASSERTION)) { *assert |= SAHPI_ES_UPPER_MINOR; } if (ipmi_is_threshold_event_set(state, IPMI_UPPER_NON_CRITICAL, IPMI_GOING_LOW, IPMI_DEASSERTION)) { *assert |= SAHPI_ES_UPPER_MINOR; } if (ipmi_is_threshold_event_set(state, IPMI_UPPER_NON_CRITICAL, IPMI_GOING_HIGH, IPMI_DEASSERTION)) { *deassert |= SAHPI_ES_UPPER_MINOR; } if (ipmi_is_threshold_event_set(state, IPMI_UPPER_CRITICAL, IPMI_GOING_LOW, IPMI_ASSERTION)) { *deassert |= SAHPI_ES_UPPER_MAJOR; } if (ipmi_is_threshold_event_set(state, IPMI_UPPER_CRITICAL, IPMI_GOING_HIGH, IPMI_ASSERTION)) { *assert |= SAHPI_ES_UPPER_MAJOR; } if (ipmi_is_threshold_event_set(state, IPMI_UPPER_CRITICAL, IPMI_GOING_LOW, IPMI_DEASSERTION)) { *assert |= SAHPI_ES_UPPER_MAJOR; } if (ipmi_is_threshold_event_set(state, IPMI_UPPER_CRITICAL, IPMI_GOING_HIGH, IPMI_DEASSERTION)) { *deassert |= SAHPI_ES_UPPER_MAJOR; } if (ipmi_is_threshold_event_set(state, IPMI_UPPER_NON_RECOVERABLE, IPMI_GOING_LOW, IPMI_ASSERTION)) { *deassert |= SAHPI_ES_UPPER_CRIT; } if (ipmi_is_threshold_event_set(state, IPMI_UPPER_NON_RECOVERABLE, IPMI_GOING_HIGH, IPMI_ASSERTION)) { *assert |= SAHPI_ES_UPPER_CRIT; } if (ipmi_is_threshold_event_set(state, IPMI_UPPER_NON_RECOVERABLE, IPMI_GOING_LOW, IPMI_DEASSERTION)) { *assert |= SAHPI_ES_UPPER_CRIT; } if (ipmi_is_threshold_event_set(state, IPMI_UPPER_NON_RECOVERABLE, IPMI_GOING_HIGH, IPMI_DEASSERTION)) { *deassert |= SAHPI_ES_UPPER_CRIT; } } static void event_enable_masks_read(ipmi_sensor_t *sensor, int err, ipmi_event_state_t *state, void *cb_data) { struct ohoi_sensor_event_enable_masks *p = cb_data; int rv; p->done = 1; if (err) { err("Sensor event enable reading error 0x%x", err); OHOI_MAP_ERROR(p->rvalue, err); return; } p->enable = SAHPI_FALSE; rv = ipmi_event_state_get_events_enabled(state); if (rv) p->enable = SAHPI_TRUE; convert_to_ohoi_event_states(sensor, state, &p->assert, &p->deassert); } static void get_sensor_event_enable_masks(ipmi_sensor_t *sensor, void *cb_data) { struct ohoi_sensor_event_enable_masks *enable_data; int rv; enable_data = cb_data; if (ignore_sensor(sensor)) { err("sensor is ignored"); enable_data->done = 1; enable_data->rvalue = SA_ERR_HPI_NOT_PRESENT; return; } if ((ipmi_sensor_get_event_support(sensor) == IPMI_EVENT_SUPPORT_PER_STATE)|| (ipmi_sensor_get_event_support(sensor) == IPMI_EVENT_SUPPORT_ENTIRE_SENSOR)){ rv = ipmi_sensor_get_event_enables(sensor, event_enable_masks_read, enable_data); if (rv) { err("Unable to sensor event enable: 0x%x\n", rv); enable_data->rvalue = SA_ERR_HPI_INTERNAL_ERROR; return; } } else { err("Sensor do not support event"); enable_data->assert = 0; enable_data->deassert = 0; enable_data->enable = SAHPI_FALSE; enable_data->rvalue = SA_OK; enable_data->done = 1; } } static int insert_events_to_ipmi_event_state( ipmi_sensor_t *sensor, ipmi_event_state_t *state, SaHpiEventStateT a_mask, SaHpiEventStateT d_mask, unsigned int a_sup, unsigned int d_sup) { int i; if (ipmi_sensor_get_event_support(sensor) != IPMI_EVENT_SUPPORT_PER_STATE) { return 0; } if (ipmi_sensor_get_event_reading_type(sensor) != IPMI_EVENT_READING_TYPE_THRESHOLD) { // discrete sensor. map states 1:1 if ((a_mask &~a_sup) || (d_mask & ~d_sup)) { return 1; } for (i = 0; i < 15; i++) { if (a_mask & (1 << i)) { ipmi_discrete_event_set(state, i, IPMI_ASSERTION); } if (d_mask & (1 << i)) { ipmi_discrete_event_set(state, i, IPMI_DEASSERTION); } } return 0; } // threhold sensor; // set assertion mask if (a_mask & SAHPI_ES_LOWER_MINOR) { if (a_sup & OHOI_THS_LMINL) { ipmi_threshold_event_set(state, IPMI_LOWER_NON_CRITICAL, IPMI_GOING_LOW, IPMI_ASSERTION); } else if (d_sup & OHOI_THS_LMINH) { ipmi_threshold_event_set(state, IPMI_LOWER_NON_CRITICAL, IPMI_GOING_HIGH, IPMI_DEASSERTION); } else { return 1; } } if (a_mask & SAHPI_ES_LOWER_MAJOR) { if (a_sup & OHOI_THS_LMAJL) { ipmi_threshold_event_set(state, IPMI_LOWER_CRITICAL, IPMI_GOING_LOW, IPMI_ASSERTION); } else if (d_sup & OHOI_THS_LMAJH) { ipmi_threshold_event_set(state, IPMI_LOWER_CRITICAL, IPMI_GOING_HIGH, IPMI_DEASSERTION); } else { return 1; } } if (a_mask & SAHPI_ES_LOWER_CRIT) { if (a_sup & OHOI_THS_LCRTL) { ipmi_threshold_event_set(state, IPMI_LOWER_NON_RECOVERABLE, IPMI_GOING_LOW, IPMI_ASSERTION); } else if (d_sup & OHOI_THS_LCRTH) { ipmi_threshold_event_set(state, IPMI_LOWER_NON_RECOVERABLE, IPMI_GOING_HIGH, IPMI_DEASSERTION); } else { return 1; } } if (a_mask & SAHPI_ES_UPPER_MINOR) { if (a_sup & OHOI_THS_UMINH) { ipmi_threshold_event_set(state, IPMI_UPPER_NON_CRITICAL, IPMI_GOING_HIGH, IPMI_ASSERTION); } else if (d_sup & OHOI_THS_UMINL) { ipmi_threshold_event_set(state, IPMI_UPPER_NON_CRITICAL, IPMI_GOING_LOW, IPMI_DEASSERTION); } else { return 1; } } if (a_mask & SAHPI_ES_UPPER_MAJOR) { if (a_sup & OHOI_THS_UMAJH) { ipmi_threshold_event_set(state, IPMI_UPPER_CRITICAL, IPMI_GOING_HIGH, IPMI_ASSERTION); } else if (d_sup & OHOI_THS_UMAJL) { ipmi_threshold_event_set(state, IPMI_UPPER_CRITICAL, IPMI_GOING_LOW, IPMI_DEASSERTION); } else { return 1; } } if (a_mask & SAHPI_ES_UPPER_CRIT) { if (a_sup & OHOI_THS_UCRTH) { ipmi_threshold_event_set(state, IPMI_UPPER_NON_RECOVERABLE, IPMI_GOING_HIGH, IPMI_ASSERTION); } else if (d_sup & OHOI_THS_UCRTL) { ipmi_threshold_event_set(state, IPMI_GOING_LOW, IPMI_UPPER_NON_RECOVERABLE, IPMI_DEASSERTION); } else { return 1; } } // set deassertion mask if (d_mask & SAHPI_ES_LOWER_MINOR) { if (d_sup & OHOI_THS_LMINL) { ipmi_threshold_event_set(state, IPMI_LOWER_NON_CRITICAL, IPMI_GOING_LOW, IPMI_DEASSERTION); } else if (a_sup & OHOI_THS_LMINH) { ipmi_threshold_event_set(state, IPMI_LOWER_NON_CRITICAL, IPMI_GOING_HIGH, IPMI_ASSERTION); } else { return 1; } } if (d_mask & SAHPI_ES_LOWER_MAJOR) { if (d_sup & OHOI_THS_LMAJL) { ipmi_threshold_event_set(state, IPMI_LOWER_CRITICAL, IPMI_GOING_LOW, IPMI_DEASSERTION); } else if (a_sup & OHOI_THS_LMAJH) { ipmi_threshold_event_set(state, IPMI_GOING_HIGH, IPMI_LOWER_CRITICAL, IPMI_ASSERTION); } else { return 1; } } if (d_mask & SAHPI_ES_LOWER_CRIT) { if (d_sup & OHOI_THS_LCRTL) { ipmi_threshold_event_set(state, IPMI_LOWER_NON_RECOVERABLE, IPMI_GOING_LOW, IPMI_DEASSERTION); } else if (a_sup & OHOI_THS_LCRTH) { ipmi_threshold_event_set(state, IPMI_LOWER_NON_RECOVERABLE, IPMI_GOING_HIGH, IPMI_ASSERTION); } else { return 1; } } if (d_mask & SAHPI_ES_UPPER_MINOR) { if (d_sup & OHOI_THS_UMINH) { ipmi_threshold_event_set(state, IPMI_UPPER_NON_CRITICAL, IPMI_GOING_HIGH, IPMI_DEASSERTION); } else if (a_sup & OHOI_THS_UMINL) { ipmi_threshold_event_set(state, IPMI_UPPER_NON_CRITICAL, IPMI_GOING_LOW, IPMI_ASSERTION); } else { return 1; } } if (d_mask & SAHPI_ES_UPPER_MAJOR) { if (d_sup & OHOI_THS_UMAJH) { ipmi_threshold_event_set(state, IPMI_UPPER_CRITICAL, IPMI_GOING_HIGH, IPMI_DEASSERTION); } else if (a_sup & OHOI_THS_UMAJL) { ipmi_threshold_event_set(state, IPMI_GOING_LOW, IPMI_UPPER_CRITICAL, IPMI_ASSERTION); } else { return 1; } } if (d_mask & SAHPI_ES_UPPER_CRIT) { if (d_sup & OHOI_THS_UCRTH) { ipmi_threshold_event_set(state, IPMI_UPPER_NON_RECOVERABLE, IPMI_GOING_HIGH, IPMI_DEASSERTION); } else if (a_sup & OHOI_THS_UCRTL) { ipmi_threshold_event_set(state, IPMI_UPPER_NON_RECOVERABLE, IPMI_GOING_LOW, IPMI_ASSERTION); } else { return 1; } } return 0; } static void mask_set_data(ipmi_sensor_t *sensor, int err, void *cb_data) { struct ohoi_sensor_event_enable_masks *info = cb_data; if (err) { err("err = 0x%x", err); info->rvalue = SA_ERR_HPI_INVALID_CMD; } info->done = 1; } static void set_sensor_event_enable_masks(ipmi_sensor_t *sensor, void *cb_data) { struct ohoi_sensor_event_enable_masks *enable_data = cb_data; int rv; ipmi_event_state_t *info = enable_data->states; if (ignore_sensor(sensor)) { err("sensor is ignored"); enable_data->done = 1; enable_data->rvalue = SA_ERR_HPI_NOT_PRESENT; return; } ipmi_event_state_init(info); ipmi_event_state_set_events_enabled(info, (enable_data->enable == SAHPI_TRUE) ? 1 : 0); if (insert_events_to_ipmi_event_state(sensor, info, enable_data->assert, enable_data->deassert, enable_data->a_support, enable_data->d_support)) { err("Attempt to set not supported event 0x%x/0x%x", enable_data->assert, enable_data->deassert); enable_data->done = 1; enable_data->rvalue = SA_ERR_HPI_INVALID_DATA; return; } rv = ipmi_sensor_set_event_enables(sensor, info, mask_set_data, enable_data); if (rv) { err("Unable to sensor event enable = %d", rv); enable_data->done = 1; if (rv == EINVAL) { // invalid event in mask for this sensor */ enable_data->rvalue = SA_ERR_HPI_INVALID_DATA; } else { enable_data->rvalue = SA_ERR_HPI_INTERNAL_ERROR; } } } SaErrorT orig_get_sensor_event_enable(struct oh_handler_state *handler, struct ohoi_sensor_info *sensor_info, SaHpiBoolT *enable, SaHpiEventStateT *assert, SaHpiEventStateT *deassert) { SaErrorT rv; struct ohoi_handler *ipmi_handler = (struct ohoi_handler *)(handler->data); struct ohoi_sensor_event_enable_masks enable_data; ipmi_sensor_id_t sensor_id; sensor_id = sensor_info->info.orig_sensor_info.sensor_id; memset(&enable_data, 0, sizeof(enable_data)); rv = ipmi_sensor_pointer_cb(sensor_id, get_sensor_event_enable_masks, &enable_data); if (rv) { err("Unable to convert sensor_id to pointer"); return SA_ERR_HPI_INVALID_CMD; } rv = ohoi_loop(&enable_data.done, ipmi_handler); if (rv) return rv; if (enable_data.rvalue) return enable_data.rvalue; *enable = enable_data.enable; *assert = enable_data.assert & 0x7fff; *deassert = enable_data.deassert & 0x7fff; return SA_OK; } SaErrorT ohoi_get_sensor_event_enable(void *hnd, struct ohoi_sensor_info *sensor_info, SaHpiBoolT *enable, SaHpiEventStateT *assert, SaHpiEventStateT *deassert) { struct oh_handler_state *handler = (struct oh_handler_state *)hnd; if (sensor_info->ohoii.get_sensor_event_enable == NULL) { return SA_ERR_HPI_INVALID_CMD; } return sensor_info->ohoii.get_sensor_event_enable(handler, sensor_info, enable, assert, deassert); } SaErrorT orig_set_sensor_event_enable(struct oh_handler_state *handler, struct ohoi_sensor_info *sensor_info, SaHpiBoolT enable, SaHpiEventStateT assert, SaHpiEventStateT deassert, unsigned int a_supported, unsigned int d_supported) { int rv; struct ohoi_handler *ipmi_handler = (struct ohoi_handler *)(handler->data); struct ohoi_sensor_event_enable_masks enable_data; ipmi_sensor_id_t sensor_id; sensor_id = sensor_info->info.orig_sensor_info.sensor_id; memset(&enable_data, 0, sizeof(enable_data)); enable_data.states = malloc(ipmi_event_state_size()); if (enable_data.states == NULL) { err("out of memory"); return SA_ERR_HPI_OUT_OF_MEMORY; } enable_data.enable = enable; enable_data.assert = assert; enable_data.deassert = deassert; enable_data.a_support = a_supported; enable_data.d_support = d_supported; rv = ipmi_sensor_pointer_cb(sensor_id, set_sensor_event_enable_masks, &enable_data); if (rv) { err("Unable to convert sensor_id to pointer"); free(enable_data.states); return SA_ERR_HPI_INVALID_CMD; } rv = ohoi_loop(&enable_data.done, ipmi_handler); free(enable_data.states); if (rv) { return rv; } if (enable_data.rvalue) return enable_data.rvalue; return SA_OK; } SaErrorT ohoi_set_sensor_event_enable(void *hnd, struct ohoi_sensor_info *sensor_info, SaHpiBoolT enable, SaHpiEventStateT assert, SaHpiEventStateT deassert, unsigned int a_supported, unsigned int d_supported) { struct oh_handler_state *handler = (struct oh_handler_state *)hnd; if (sensor_info->ohoii.set_sensor_event_enable == NULL) { return SA_ERR_HPI_INVALID_CMD; } return sensor_info->ohoii.set_sensor_event_enable(handler, sensor_info, enable, assert, deassert, a_supported, d_supported); } openhpi-3.6.1/plugins/ipmi/atca_shelf_fru.c0000644000175100017510000010555512575647300017727 0ustar mohanmohan /* -*- linux-c -*- * * Copyright (c) 2005 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Vadim Revyakin */ #include "ipmi.h" #include "ekeyfru.h" #include #include typedef struct atca_oem_field_info { SaHpiEntryIdT field; unsigned int rec_num; unsigned int pad_len; unsigned int off; unsigned int len; } atca_oem_field_info_t; typedef struct atca_oem_area_info { SaHpiEntryIdT area; unsigned int record; int field_num; atca_oem_field_info_t *fields; } atca_oem_area_info_t; typedef struct ohoi_atca_pw_on_seq_s { unsigned char head[7]; unsigned char updated; int dsk_num; } ohoi_atca_pw_on_seq_t; /* Structures to create E-Keying sensors */ typedef unsigned char GUID_t[16]; typedef struct { unsigned char link_grouping_id; unsigned char link_type; unsigned char link_type_extension; unsigned char interface_type; unsigned char channels[16]; } ekey_descriptor_t; typedef struct { GUID_t guids[15]; int guid_number; GSList *descriptors; } ekey_sensors_info_t; static SaHpiEntryIdT init_ftrst_fields(atca_oem_field_info_t *fields, unsigned char *data) { // Manufacture Id fields[0].field = OHOI_FIELD_FIRST_ID; fields[0].off = 0; fields[0].len = 3; // Record Id fields[1].field = OHOI_FIELD_FIRST_ID + 1; fields[1].off = 3; fields[1].len = 1; // Format version fields[2].field = OHOI_FIELD_FIRST_ID + 2; fields[2].off = 4; fields[2].len = 1; return OHOI_FIELD_FIRST_ID + 3; } static atca_oem_area_info_t *create_address_table_oem_area( unsigned char *data, unsigned int length) { atca_oem_field_info_t *fields; atca_oem_area_info_t *area; unsigned int len, off; SaHpiEntryIdT cur_field; unsigned int i; if (length < 27 + data[26] * 3) { err("Record length(0x%x) mismatches with expected(0x%x)", length, 27 + data[26] * 3); return NULL; } len = 6 + data[26]; fields = malloc(sizeof (atca_oem_field_info_t) * len); if (fields == NULL) { err("Out of memory"); return NULL; } memset(fields, 0, sizeof (atca_oem_field_info_t) * len); cur_field = init_ftrst_fields(fields, data); // Type/Length of Address fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = 5; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 1; cur_field++; // Shelf Address fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = 6; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 6; cur_field++; // Entries Count fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = 26; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 1; cur_field++; off = 27; for (i = 0; i < data[26]; i++) { // Address Mapping Tables fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = off + 3 * i; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 3; cur_field++; } area = malloc(sizeof (atca_oem_area_info_t)); if (area == NULL) { err("Out of memory"); free(fields); return NULL; } area->field_num = cur_field - OHOI_FIELD_FIRST_ID; area->fields = fields; return area; } static atca_oem_area_info_t *create_shm_ip_connection_oem_area( unsigned char *data, unsigned int length) { atca_oem_field_info_t *fields; atca_oem_area_info_t *area; int len; SaHpiEntryIdT cur_field; len = 6; fields = malloc(sizeof (atca_oem_field_info_t) * len); if (fields == NULL) { err("Out of memory"); return NULL; } memset(fields, 0,sizeof (atca_oem_field_info_t) * len); cur_field = init_ftrst_fields(fields, data); // Shelf Manager IP Address fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = 5; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 4; fields[cur_field - OHOI_FIELD_FIRST_ID].pad_len = 12; cur_field++; // Default Gateway Address fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = 9; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 4; fields[cur_field - OHOI_FIELD_FIRST_ID].pad_len = 12; cur_field++; // Subnet Mask fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = 13; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 4; fields[cur_field - OHOI_FIELD_FIRST_ID].pad_len = 12; cur_field++; area = malloc(sizeof (atca_oem_area_info_t)); if (area == NULL) { err("Out of memory"); free(fields); return NULL; } area->field_num = cur_field - OHOI_FIELD_FIRST_ID; area->fields = fields; return area; } static void handle_ekey_dsk(ekey_sensors_info_t *eks_info, unsigned char *bytes) { int ch_num = CHANNEL_NUM(bytes); unsigned char link_grouping_id = LINK_GROUPING_ID(bytes); unsigned char link_type_extension = LINK_TYPE_EXTENSION(bytes); unsigned char link_type = LINK_TYPE(bytes); unsigned char interface_type = INTERFACE_TYPE(bytes); unsigned char ports = PORTS(bytes); ekey_descriptor_t *dsk = NULL; GSList *node; #if DEBUG_EKEY printf("EKEY %02X%02X%02X%02X ", bytes[0], bytes[1], bytes[2], bytes[3]); #endif if (ch_num == 0 || ch_num >= 16) { err("channel number too big = %d", ch_num); #if DEBUG_EKEY printf("channel number too big = %d\n", ch_num); #endif return; } for (node = eks_info->descriptors; node; node = g_slist_next(node)) { dsk = g_slist_nth_data(node, 0); if (link_grouping_id == 0) { break; } if (dsk->link_grouping_id != link_grouping_id) { continue; } if (dsk->link_type_extension != link_type_extension) { continue; } if (dsk->link_type != link_type) { continue; } if (dsk->interface_type != interface_type) { continue; } dsk->channels[ch_num - 1] |= ports; #if DEBUG_EKEY printf("FOUND: (%d,%d,%d,%d) add ports 0x%x to channel %d\n", link_grouping_id, link_type, link_type_extension, interface_type, dsk->channels[ch_num], ch_num); #endif return; } dsk = malloc(sizeof (ekey_descriptor_t)); if (dsk == NULL) { err("No Memory"); return; } memset(dsk, 0, sizeof (ekey_descriptor_t)); dsk->link_grouping_id = link_grouping_id; dsk->link_type_extension = link_type_extension; dsk->link_type = link_type; dsk->interface_type = interface_type; dsk->channels[ch_num - 1] = ports; #if DEBUG_EKEY printf("NEW: (%d,%d,%d,%d) ports 0x%x to channel %d\n", link_grouping_id, link_type, link_type_extension, interface_type, dsk->channels[ch_num - 1], ch_num); #endif eks_info->descriptors = g_slist_append(eks_info->descriptors, dsk); } static atca_oem_area_info_t *create_board_p2p_connectivity_oem_area( unsigned char *data, unsigned int length, ekey_sensors_info_t *eks_info) { atca_oem_field_info_t *fields; atca_oem_area_info_t *area; int len; int num_desk; int i; int off; SaHpiEntryIdT cur_field; if (length < 6 + data[5] * 16) { err("Record length(0x%x) mismatches with expected(0x%x)", length, 6 + data[5] * 16); return NULL; } if ((length - (6 + data[5] * 16)) % 4) { err("The rest of record is not divisible by 4: %d - (%d)", length, 6 + data[5] * 16); return NULL; } num_desk = (length - (6 + data[5] * 16)) / 4; len = 4 + data[5] + num_desk + 1; fields = malloc(sizeof (atca_oem_field_info_t) * len); if (fields == NULL) { err("Out of memory"); return NULL; } memset(fields, 0,sizeof (atca_oem_field_info_t) * len); cur_field = init_ftrst_fields(fields, data); // OEM GUID count fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = 5; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 1; cur_field++; for (i = 0; i < data[5]; i++) { // OEM GUIDs fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = 6 + 16 * i; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 16; cur_field++; if (eks_info->guid_number < 15) { memcpy(eks_info->guids[eks_info->guid_number], &data[6 + 16 * i], 16); eks_info->guid_number++; } else { err("Too many GUIDS"); } } #if 0 // Number of link descriptors (virtual field) fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = num_desk; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 0; cur_field++; #endif off = 6 + 16 * data[5]; for (i = 0; i < num_desk; i++) { // Link Descriptors fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = off + 4 * i; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 4; cur_field++; handle_ekey_dsk(eks_info, &data[off + 4 * i]); } area = malloc(sizeof (atca_oem_area_info_t)); if (area == NULL) { err("Out of memory"); free(fields); return NULL; } area->field_num = cur_field - OHOI_FIELD_FIRST_ID; area->fields = fields; return area; } static atca_oem_area_info_t *create_p2p_connectivity_oem_area( unsigned char *data, int desk_num, unsigned int length) { atca_oem_field_info_t *fields; atca_oem_area_info_t *area; int len; SaHpiEntryIdT cur_field; int off = 5; int i; for (i = 0; i < desk_num; i++) { if (off + 3 + data[off + 2] * 3 >= length) { err("dismatch datalen(0x%x) and record struct(0x%x)" " desk_num = %d", length, off + 3 + data[off + 2] * 3, desk_num); return NULL; } off = off + 3 + data[off + 2] * 3; } //printf(" **** create_p2p_connectivity_oem_area: %d: off = 0x%x, num = 0x%x\n", // feed_num, off, data[off + 2]); len = 6 + data[off + 2]; fields = malloc(sizeof (atca_oem_field_info_t) * len); if (fields == NULL) { err("Out of memory"); return NULL; } memset(fields, 0,sizeof (atca_oem_field_info_t) * len); cur_field = init_ftrst_fields(fields, data); // Point-to-Point Channel Type fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = off; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 1; cur_field++; // Slot Address fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = off + 1; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 1; cur_field++; // Channel Count fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = off + 2; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 1; cur_field++; for (i = 0; i < data[off + 2]; i++) { fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = off +3 + 3 * i; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 3; cur_field++; } area = malloc(sizeof (atca_oem_area_info_t)); if (area == NULL) { err("Out of memory"); free(fields); return NULL; } area->field_num = cur_field - OHOI_FIELD_FIRST_ID; area->fields = fields; return area; } static atca_oem_area_info_t *create_power_distribution_oem_area( unsigned char *data, int feed_num, unsigned int length) { atca_oem_field_info_t *fields; atca_oem_area_info_t *area; int len; SaHpiEntryIdT cur_field; int off = 6; int i; for (i = 0; i < feed_num; i++) { if (off + 6 + data[off + 5] * 2 >= length) { err("dismatch datalen(0x%x) and record struct(" "0x%x + 6 + 0x%x * 2)" " feed_num = %d", length, off, data[off + 5], feed_num); return NULL; } off += 6 + data[off + 5] * 2; } //printf(" **** create_power_distribution_oem_area: %d: off = 0x%x, num = 0x%x\n", //feed_num, off, data[off + 5]); len = 7 + data[off + 5]; fields = malloc(sizeof (atca_oem_field_info_t) * len); if (fields == NULL) { err("Out of memory"); return NULL; } memset(fields, 0,sizeof (atca_oem_field_info_t) * len); cur_field = init_ftrst_fields(fields, data); // Maximum External Available Current fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = off; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 2; cur_field++; // Maximum Internal Current fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = off + 2; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 2; cur_field++; // Maximum Expected Operating Voltage fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = off + 4; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 1; cur_field++; // FRU to Feed Mapping Entries Count fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = off + 5; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 1; cur_field++; for (i = 0; i < data[off + 5]; i++) { fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = off + 6 + i * 2; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 2; cur_field++; } area = malloc(sizeof (atca_oem_area_info_t)); if (area == NULL) { err("Out of memory"); free(fields); return NULL; } area->field_num = cur_field - OHOI_FIELD_FIRST_ID; area->fields = fields; return area; } static atca_oem_area_info_t *create_activation_and_pm_oem_area( unsigned char *data, unsigned int length) { atca_oem_field_info_t *fields; atca_oem_area_info_t *area; unsigned int len, off; unsigned int i; SaHpiEntryIdT cur_field; if (length < 7 + data[6] * 5) { err("Record length(0x%x) mismatches with expected(0x%x)", length, 7 + data[6] * 5); return NULL; } len = 5 + data[6]; fields = malloc(sizeof (atca_oem_field_info_t) * len); if (fields == NULL) { err("Out of memory"); return NULL; } memset(fields, 0,sizeof (atca_oem_field_info_t) * len); cur_field = init_ftrst_fields(fields, data); // Allowance For FRU Activation Readiness fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = 5; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 1; cur_field++; // Descripror Count fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = 6; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 1; cur_field++; off = 7; for (i = 0; i < data[6]; i++) { // Address Mapping Tables fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = off + 5 * i; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 5; cur_field++; } area = malloc(sizeof (atca_oem_area_info_t)); if (area == NULL) { err("Out of memory"); free(fields); return NULL; } area->field_num = cur_field - OHOI_FIELD_FIRST_ID; area->fields = fields; return area; } static atca_oem_area_info_t *create_radial_ipmb0_link_oem_area( unsigned char *data, unsigned int length, unsigned int *max_link) { atca_oem_field_info_t *fields; atca_oem_area_info_t *area; unsigned int len, off; unsigned int i; SaHpiEntryIdT cur_field; if (length < 11 + data[10] * 2) { err("Record length(0x%x) mismatches with expected(0x%x)", length, 11 + data[10] * 2); return NULL; } len = 6 + data[10]; fields = malloc(sizeof (atca_oem_field_info_t) * len); if (fields == NULL) { err("Out of memory"); return NULL; } memset(fields, 0,sizeof (atca_oem_field_info_t) * len); cur_field = init_ftrst_fields(fields, data); // IPMB-0 Connector Definer fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = 5; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 3; cur_field++; // IPMB-0 Connector Version ID fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = 8; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 2; cur_field++; // Address Entry Count fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = 10; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 1; cur_field++; off = 11; for (i = 0; i < data[10]; i++) { // IPMIB-0 Link Mapping Entries fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = off + 2 * i; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 2; cur_field++; if (data[off + 2 * i + 1] > *max_link) { // calculating maximum link number for IPMB controls *max_link = data[off + 2 * i + 1]; } } area = malloc(sizeof (atca_oem_area_info_t)); if (area == NULL) { err("Out of memory"); free(fields); return NULL; } area->field_num = cur_field - OHOI_FIELD_FIRST_ID; area->fields = fields; return area; } static atca_oem_area_info_t *create_amc_carrier_information_table_oem_area( unsigned char *data, unsigned int length) { atca_oem_field_info_t *fields; atca_oem_area_info_t *area; int len; SaHpiEntryIdT cur_field; int off; int i; if (length < 7 + data[6]) { err("Record length(0x%x) mismatches with expected(0x%x)", length, 7 + data[6]); return NULL; } len = 5 + data[6]; fields = malloc(sizeof (atca_oem_field_info_t) * len); if (fields == NULL) { err("Out of memory"); return NULL; } memset(fields, 0,sizeof (atca_oem_field_info_t) * len); cur_field = init_ftrst_fields(fields, data); // AMC.0 Extension Version fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = 5; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 1; cur_field++; // Carrier Site Number Count fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = 6; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 1; cur_field++; off = 7; for (i = 0; i < data[6]; i++) { // Carrier Site Number fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = off + i; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 1; cur_field++; } area = malloc(sizeof (atca_oem_area_info_t)); if (area == NULL) { err("Out of memory"); free(fields); return NULL; } area->field_num = cur_field - OHOI_FIELD_FIRST_ID; area->fields = fields; return area; } static atca_oem_area_info_t *create_carrier_activ_and_curmngmt_oem_area( unsigned char *data, unsigned int length) { atca_oem_field_info_t *fields; atca_oem_area_info_t *area; int len; SaHpiEntryIdT cur_field; int off; int i; if (length < 9 + data[8] * 3) { err("Record length(0x%x) mismatches with expected(0x%x)", length, 9 + data[9]); return NULL; } len = 6 + data[8]; fields = malloc(sizeof (atca_oem_field_info_t) * len); if (fields == NULL) { err("Out of memory"); return NULL; } memset(fields, 0,sizeof (atca_oem_field_info_t) * len); cur_field = init_ftrst_fields(fields, data); // Maximum Internal Current fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = 5; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 2; cur_field++; // Allowance For Module Activation Readiness fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = 7; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 1; cur_field++; // Module Activation and Power Descriptor Count fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = 8; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 1; cur_field++; off = 9; for (i = 0; i < data[8]; i++) { // Carrier Activation and Power Descriptors fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = off + i * 3; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 3; cur_field++; } area = malloc(sizeof (atca_oem_area_info_t)); if (area == NULL) { err("Out of memory"); free(fields); return NULL; } area->field_num = cur_field - OHOI_FIELD_FIRST_ID; area->fields = fields; return area; } static atca_oem_area_info_t *create_carrier_p2p_connectivity_oem_area( unsigned char *data, unsigned int length) { atca_oem_field_info_t *fields; atca_oem_area_info_t *area; int len; SaHpiEntryIdT cur_field; int off; int i; if (length < 7 + data[6] * 3) { err("Record length(0x%x) mismatches with expected(0x%x)", length, 7 + data[6]); return NULL; } len = 5 + data[6]; fields = malloc(sizeof (atca_oem_field_info_t) * len); if (fields == NULL) { err("Out of memory"); return NULL; } memset(fields, 0,sizeof (atca_oem_field_info_t) * len); cur_field = init_ftrst_fields(fields, data); // Resource ID fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = 5; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 1; cur_field++; // Point-to-Point Port Count fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = 6; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 1; cur_field++; off = 7; for (i = 0; i < data[6]; i++) { // Carrier Activation and Power Descriptors fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = off + i * 3; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 3; cur_field++; } area = malloc(sizeof (atca_oem_area_info_t)); if (area == NULL) { err("Out of memory"); free(fields); return NULL; } area->field_num = cur_field - OHOI_FIELD_FIRST_ID; area->fields = fields; return area; } unsigned int ohoi_create_atca_oem_idr_areas( struct oh_handler_state *handler, ipmi_entity_t *entity, struct ohoi_resource_info *res_info, struct ohoi_inventory_info *i_info, unsigned int r_num) { // struct ohoi_handler *ipmi_handler = handler->data; ipmi_fru_t *fru = ipmi_entity_get_fru(entity); atca_oem_area_info_t *area; atca_oem_field_info_t *fields; unsigned char data[256]; int rv; unsigned int num; unsigned int len; unsigned int area_num = 0; unsigned int is_atca_field = 0; GSList *areas = NULL; int i; unsigned char ver, type; unsigned int max_link = 0; ekey_sensors_info_t eks_info; memset(&eks_info, 0, sizeof (eks_info)); for (num = 0; num < r_num; num++) { len = 256; rv = ipmi_fru_get_multi_record_data(fru, num, data, &len); if (rv != 0) { err("ipmi_fru_get_multi_record_data(" "fru, %d, data, 0x%x) = 0x%x", num, len, rv); continue; } rv = ipmi_fru_get_multi_record_type(fru, num, &type); if (rv) { err("ipmi_entity_get_multi_record_type(%d) = %d", num, rv); continue; } if (type != 0xc0) { // record type. Must be OEM err("Record #%d type = 0x%x", num, data[0]); goto orig_record; } rv = ipmi_fru_get_multi_record_format_version(fru, num, &ver); if (rv) { err("ipmi_entity_get_multi_record_format_version" "(%d) = %d", num, rv); continue; } if ((ver & 0x0f) != 0x2) { // must be 2 for PICMG 3.0 ATCA vD1.0 err("Record #%d format version = 0x%x", num, data[1] & 0x0f); goto orig_record; } if (len < 5) { err("Record #%d too short(%d)", num, len); goto orig_record; } if ((data[0] | (data[1] << 8) | (data[2] << 16)) != ATCAHPI_PICMG_MID) { err("Record #%d. MId = 0x%x", num, data[0] | (data[1] << 8) | (data[2] << 16)); goto orig_record; } switch (data[3]) { case 0x10 : // Address Table Record if (len < 27) { err("Record #%d too short. len = 0x%x", num, len); goto orig_record; } if (data[4] != 0) { err("wrong RecFormVersion record #%d = %d", num, data[4]); goto orig_record; } area = create_address_table_oem_area(data, len); if (area == NULL) { goto orig_record; } break; case 0x13 : // Shelf Manager IP Connection Record if (len < 17) { err("Record #%d too short. len = 0x%x", num, len); goto orig_record; } if (data[4] != 1) { err("wrong RecFormVersion record #%d = %d", num, data[4]); goto orig_record; } area = create_shm_ip_connection_oem_area(data, len); break; case 0x04 : // Backplane Point-to-Point Connectivity Record if (len < 8) { err("Record #%d too short. len = 0x%x", num, len); goto orig_record; } if (data[4] != 0) { err("wrong RecFormVersion record #%d = %d", num, data[4]); goto orig_record; } for (i = 0; ; i++) { area = create_p2p_connectivity_oem_area( data, i, len); if (area != NULL) { area->record = num; area->area = FIRST_OEM_AREA_NUM + area_num; areas = g_slist_append(areas, area); area_num++; is_atca_field++; } else { if (i == 0) { goto orig_record; } break; } } continue; case 0x11 : // Shelf Power Distribution Record if (len < 10) { err("Record #%d too short. len = 0x%x", num, len); goto orig_record; } if (data[4] != 0) { err("wrong RecFormVersion record #%d = %d", num, data[4]); goto orig_record; } for (i = 0; i < data[5]; i++) { area = create_power_distribution_oem_area( data, i, len); if (area != NULL) { area->record = num; area->area = FIRST_OEM_AREA_NUM + area_num; areas = g_slist_append(areas, area); area_num++; is_atca_field++; } } area = NULL; continue; case 0x12 : // Shelf Activation and Power Management Record if (len < 7) { err("Record #%d too short. len = 0x%x", num, len); goto orig_record; } if (data[4] != 0) { err("wrong RecFormVersion record #%d = %d", num, data[4]); goto orig_record; } area = create_activation_and_pm_oem_area(data, len); break; case 0x14 : // Board Point-to-Point Connectivity Record if (len < 6) { err("Record #%d too short. len = 0x%x", num, len); goto orig_record; } if (data[4] != 0) { err("wrong RecFormVersion record #%d = %d", num, data[4]); goto orig_record; } area = create_board_p2p_connectivity_oem_area(data, len, &eks_info); break; case 0x15 : // Radial IPMB-0 Link Mapping Record if (len < 11) { err("Record #%d too short. len = 0x%x", num, len); goto orig_record; } if (data[4] != 0) { err("wrong RecFormVersion record #%d = %d", num, data[4]); goto orig_record; } area = create_radial_ipmb0_link_oem_area( data, len, &max_link); if (area == NULL) { goto orig_record; } break; case 0x1a : // Carrier Information Table if (len < 7) { err("Record #%d too short. len = 0x%x", num, len); goto orig_record; } if (data[4] != 0) { err("wrong RecFormVersion record #%d = %d", num, data[4]); goto orig_record; } area = create_amc_carrier_information_table_oem_area( data, len); if (area == NULL) { goto orig_record; } break; case 0x17 : // Carrier Activation and Current Management Record if (len < 9) { err("Record #%d too short. len = 0x%x", num, len); goto orig_record; } if (data[4] != 0) { err("wrong RecFormVersion record #%d = %d", num, data[4]); goto orig_record; } area = create_carrier_activ_and_curmngmt_oem_area( data, len); if (area == NULL) { goto orig_record; } break; case 0x18 : // Carrier Point-to-Point Connectivity Record if (len < 9) { err("Record #%d too short. len = 0x%x", num, len); goto orig_record; } if (data[4] != 0) { err("wrong RecFormVersion record #%d = %d", num, data[4]); goto orig_record; } area = create_carrier_p2p_connectivity_oem_area( data, len); if (area == NULL) { goto orig_record; } break; default : err("Unknown record #%d Id = 0x%x", num, data[3]); area = NULL; goto orig_record; } if (area == NULL) { continue; } area->record = num; area->area = FIRST_OEM_AREA_NUM + area_num; area_num++; is_atca_field++; areas = g_slist_append(areas, area); continue; orig_record: // We met not ATCA specific record. Put it into special area fields = malloc(sizeof (atca_oem_field_info_t)); if (fields == NULL) { err("Out of memory"); continue; } memset(fields, 0, sizeof (atca_oem_field_info_t)); area = malloc(sizeof (atca_oem_area_info_t)); if (area == NULL) { err("Out of memory"); free(fields); continue; } fields->field = OHOI_FIELD_FIRST_ID; fields->off = 0; fields->len = len; area->record = num; area->field_num = 1; area->area = FIRST_OEM_AREA_NUM + area_num; area_num++; area->fields = fields; areas = g_slist_append(areas, area); } #if 0 res_info->max_ipmb0_link = max_link; if (ipmi_entity_get_type(entity) == IPMI_ENTITY_MC) { ohoi_create_ipmb0_controls(handler, entity, max_link); } #endif if (!is_atca_field) { return 1; } #if 0 { GSList *node; atca_oem_area_info_t *ar; for (node = areas; node; node = node->next) { ar = node->data; printf(" ******* area %d; num_fields %d\n", ar->area, ar->field_num); } } #endif // create Ekeying link state sensors GSList *node; unsigned int s_num = 0; ekey_descriptor_t *dsk; for (node = eks_info.descriptors; node; node = g_slist_next(node)) { dsk = g_slist_nth_data(node, 0); if (dsk->link_type <0xf0) { ohoi_create_ekeying_link_state_sensor(handler, entity, s_num, NULL, dsk->link_grouping_id, dsk->link_type, dsk->link_type_extension, dsk->interface_type, dsk->channels); } else { ohoi_create_ekeying_link_state_sensor(handler, entity, s_num, eks_info.guids[dsk->link_type - 0xf0], dsk->link_grouping_id, dsk->link_type, dsk->link_type_extension, dsk->interface_type, dsk->channels); } s_num++; } g_slist_foreach(eks_info.descriptors, (GFunc)g_free, NULL); g_slist_free(eks_info.descriptors); i_info->oem_areas = areas; return area_num; } extern void ohoi_delete_oem_area(gpointer arg, gpointer u_data); void ohoi_delete_oem_area(gpointer arg, gpointer u_data) { atca_oem_area_info_t *area = arg; if (area && area->fields) free(area->fields); if (area) free(area); } SaHpiUint32T ohoi_atca_oem_area_fields_num(struct ohoi_inventory_info *fru, SaHpiEntryIdT areaid) { GSList *node; atca_oem_area_info_t *area; for (node = fru->oem_areas; node; node = node->next) { area = node->data; if (area->area == areaid) { return area->field_num; } } return 0; } struct atca_oem_area_field_s { atca_oem_field_info_t *fld; SaHpiIdrFieldT *field; SaHpiEntryIdT fid; int raw_field; SaErrorT rv; int done; }; static void ohoi_atca_oem_area_field_cb(ipmi_entity_t *ent, void *cb_data) { struct atca_oem_area_field_s *info = cb_data; int rv; unsigned int len; unsigned char type, ver; unsigned char buf[SAHPI_MAX_TEXT_BUFFER_LENGTH]; unsigned int shift = info->fld->pad_len; rv = ipmi_entity_get_multi_record_data_len(ent, info->fid, &len); if (rv) { err("ipmi_entity_get_multi_record_data_len = %d", rv); info->rv = SA_ERR_HPI_NOT_PRESENT; info->done = 1; return; } if (len < info->fld->off + info->fld->len) { err("real record too short. %d < %d + %d", len, info->fld->off, info->fld->len); info->rv = SA_ERR_HPI_NOT_PRESENT; info->done = 1; return; } if (info->raw_field) { rv = ipmi_entity_get_multi_record_type(ent, info->fid, &type); if (rv) { err("ipmi_entity_get_multi_record_type = %d", rv); info->rv = SA_ERR_HPI_NOT_PRESENT; info->done = 1; return; } rv = ipmi_entity_get_multi_record_format_version(ent, info->fid, &ver); if (rv) { err("ipmi_entity_get_multi_record_type = %d", rv); info->rv = SA_ERR_HPI_NOT_PRESENT; info->done = 1; return; } shift = 2; } /* rv = ipmi_entity_get_multi_record_type(ent, f_id, &type); if (rv) { err("ipmi_entity_get_multi_record_type = %d", rv); oif->rv = SA_ERR_HPI_NOT_PRESENT; return; } rv = ipmi_entity_get_multi_record_format_version(ent, f_id, &ver); if (rv) { err("ipmi_entity_get_multi_record_format_version = %d", rv); oif->rv = SA_ERR_HPI_NOT_PRESENT; return; } if (len > SAHPI_MAX_TEXT_BUFFER_LENGTH - 2) { len = SAHPI_MAX_TEXT_BUFFER_LENGTH - 2; } */ rv = ipmi_entity_get_multi_record_data(ent, info->fid, buf, &len); if (rv) { err("ipmi_entity_get_multi_record_data = %d", rv); info->rv = SA_ERR_HPI_NOT_PRESENT; info->done = 1; return; } oh_init_textbuffer(&info->field->Field); if (info->raw_field) { info->field->Field.Data[0] = type; info->field->Field.Data[1] = ver; } memcpy(info->field->Field.Data + shift, &buf[info->fld->off], info->fld->len); info->field->Field.Language = SAHPI_LANG_UNDEF; info->field->Field.DataType = SAHPI_TL_TYPE_BINARY; info->field->Field.DataLength = info->fld->len + shift; info->done = 1; } SaErrorT ohoi_atca_oem_area_field(struct oh_handler_state *handler, struct ohoi_resource_info *ohoi_res_info, SaHpiEntryIdT *nextfieldid, SaHpiIdrFieldT *field) { struct ohoi_inventory_info *fru = ohoi_res_info->fru; GSList *node = fru->oem_areas; atca_oem_area_info_t *area = NULL; atca_oem_field_info_t *fields; struct atca_oem_area_field_s info; int rv; int i; for (node = fru->oem_areas; node; node = g_slist_next(node)) { area = g_slist_nth_data(node, 0); if (area->area == field->AreaId) { break; } } if (area == NULL) { err("Area %d not present", field->AreaId); return SA_ERR_HPI_NOT_PRESENT; } fields = area->fields; for (i = 0; i < area->field_num; i++) { if (fields[i].field == field->FieldId) { break; } } if (i == area->field_num) { err("Field %d for OEM Area %d not present", field->FieldId, field->AreaId); return SA_ERR_HPI_NOT_PRESENT; } fields += i; if (fields->len == 0) { // this is the virtual field. Compose it oh_init_textbuffer(&field->Field); field->Field.Data[0] = fields->off; field->Field.Language = SAHPI_LANG_UNDEF; field->Field.DataType = SAHPI_TL_TYPE_BINARY; field->Field.DataLength = 1; goto virt_field; } info.fld = fields; info.field = field; info.rv = SA_OK; info.fid = area->record; info.done = 1; info.raw_field = (area->field_num == 1); rv = ipmi_entity_pointer_cb(ohoi_res_info->u.entity.entity_id, ohoi_atca_oem_area_field_cb, &info); if (rv) { err("ipmi_entity_pointer_cb = 0x%x", rv); return SA_ERR_HPI_INTERNAL_ERROR; } rv = ohoi_loop(&info.done, handler->data); if (rv != SA_OK) { err("ohoi_loop = %d", rv); return rv; } if (info.rv != SA_OK) { err("info.rv = %d", info.rv); return info.rv; } virt_field: field->ReadOnly = SAHPI_TRUE; field->Type = SAHPI_IDR_FIELDTYPE_CUSTOM; if (i == area->field_num - 1) { *nextfieldid = SAHPI_LAST_ENTRY; } else { *nextfieldid = fields[1].field; } return SA_OK; } openhpi-3.6.1/plugins/ipmi/ipmi.sym0000644000175100017510000000005412575647300016272 0ustar mohanmohanipmi_get_interface get_interface posix_vlog openhpi-3.6.1/plugins/ipmi/ipmi_util.c0000644000175100017510000002532212575647300016746 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Louis Zhuang */ #include "ipmi.h" #include #include static inline int domain_id_is_equal(const ipmi_domain_id_t id1, const ipmi_domain_id_t id2) { return (id1.domain == id2.domain); } static inline int entity_id_is_equal(const ipmi_entity_id_t id1, const ipmi_entity_id_t id2) { return (domain_id_is_equal(id1.domain_id, id2.domain_id) && (id1.entity_id == id2.entity_id) && (id1.entity_instance == id2.entity_instance) && (id1.channel == id2.channel) && (id1.address == id2.address) && (id1.seq == id2.seq)); } static inline int mc_id_is_equal(const ipmi_mcid_t id1, const ipmi_mcid_t id2) { //printf("compare MC: (%d,%d,%ld) and (%d,%d,%ld)\n", id1.mc_num, id1.channel, id1.seq, id2.mc_num, id2.channel, id2.seq); return (domain_id_is_equal(id1.domain_id, id2.domain_id) && (id1.mc_num == id2.mc_num) && (id1.channel== id2.channel) && (id1.seq == id2.seq)); } static inline int ohoi_resource_info_is_equal( const struct ohoi_resource_info info1, const struct ohoi_resource_info info2) { /* We don't compare rdr_count */ if (info1.type & OHOI_RESOURCE_MC) { if (!(info2.type & OHOI_RESOURCE_MC)) { return 0; } return mc_id_is_equal(info1.u.entity.mc_id, info2.u.entity.mc_id); } if (info1.type & OHOI_RESOURCE_ENTITY) { return (entity_id_is_equal(info1.u.entity.entity_id, info2.u.entity.entity_id)); } else if (info1.type & OHOI_RESOURCE_SLOT) { return (entity_id_is_equal(info1.u.slot.entity_id, info2.u.slot.entity_id)); } else { err("UNKNOWN OHOI RESOURCE TYPE!"); return 0; } } SaHpiResourceIdT ohoi_get_parent_id(SaHpiRptEntryT *child) { SaHpiEntityPathT ep; int i; if (child == NULL) return 0; for (i = 1; i < SAHPI_MAX_ENTITY_PATH; i ++) { ep.Entry[i - 1].EntityLocation = child->ResourceEntity.Entry[i].EntityLocation; ep.Entry[i - 1].EntityType = child->ResourceEntity.Entry[i].EntityType; if (child->ResourceEntity.Entry[i].EntityType == SAHPI_ENT_ROOT) { break; } } return oh_uid_lookup(&ep); } /*XXX algorithm here is so ulgy! */ SaHpiRptEntryT *ohoi_get_resource_by_entityid(RPTable *table, const ipmi_entity_id_t *entity_id) { struct ohoi_resource_info res_info1; SaHpiRptEntryT *rpt_entry; res_info1.type = OHOI_RESOURCE_ENTITY; res_info1.u.entity.entity_id = *entity_id; rpt_entry = oh_get_resource_next(table, SAHPI_FIRST_ENTRY); while (rpt_entry) { struct ohoi_resource_info *ohoi_res_info; ohoi_res_info = oh_get_resource_data(table, rpt_entry->ResourceId); if (ohoi_resource_info_is_equal(res_info1, *ohoi_res_info)) { return rpt_entry; } rpt_entry = oh_get_resource_next(table, rpt_entry->ResourceId); } err("Not found resource by entity_id"); return NULL; } /*XXX algorithm here is so ulgy! */ SaHpiRptEntryT *ohoi_get_resource_by_mcid(RPTable *table, const ipmi_mcid_t *mc_id) { struct ohoi_resource_info res_info1; SaHpiRptEntryT *rpt_entry; res_info1.type = OHOI_RESOURCE_MC; res_info1.u.entity.mc_id = *mc_id; rpt_entry = oh_get_resource_next(table, SAHPI_FIRST_ENTRY); while (rpt_entry) { struct ohoi_resource_info *ohoi_res_info; ohoi_res_info = oh_get_resource_data(table, rpt_entry->ResourceId); if (ohoi_resource_info_is_equal(res_info1, *ohoi_res_info)) { return rpt_entry; } rpt_entry = oh_get_resource_next(table, rpt_entry->ResourceId); } err("Not found resource by mc_id"); return NULL; } SaErrorT ohoi_get_rdr_data(const struct oh_handler_state *handler, SaHpiResourceIdT id, SaHpiRdrTypeT type, SaHpiSensorNumT num, void **pdata) { SaHpiRdrT * rdr; rdr = oh_get_rdr_by_type(handler->rptcache, id, type, num); if (!rdr) { err("no rdr for Resource %d. type = %d, num = %d", id, type, num); /*XXX No err code for invalid rdr?*/ return SA_ERR_HPI_INVALID_RESOURCE; } *pdata = oh_get_rdr_data(handler->rptcache, id, rdr->RecordId); return SA_OK; } SaHpiRdrT *ohoi_get_rdr_by_data(RPTable *table, SaHpiResourceIdT rid, SaHpiRdrTypeT type, void *data) { SaHpiRdrT *rdr; struct ohoi_sensor_info *s_info; if (!data) { err("data == NULL"); return NULL; } if (type != SAHPI_SENSOR_RDR) { err("type != SAHPI_SENSOR_RDR"); return NULL; } rdr = oh_get_rdr_next(table, rid, SAHPI_FIRST_ENTRY); while (rdr) { ipmi_sensor_id_t *sidp; if (rdr->RdrType != SAHPI_SENSOR_RDR) { goto next_rdr; } s_info = oh_get_rdr_data(table, rid, rdr->RecordId); if (!s_info) { err("s_info == NULL"); goto next_rdr; } if (s_info->type == OHOI_SENSOR_ATCA_MAPPED) { if ((struct ohoi_sensor_info *)data == s_info) { return rdr; } goto next_rdr; } sidp = &s_info->info.orig_sensor_info.sensor_id; if (!ipmi_cmp_sensor_id(*(ipmi_sensor_id_t *)data, *sidp)) { return rdr; } next_rdr: rdr = oh_get_rdr_next(table, rid, rdr->RecordId); } return NULL; } void ohoi_iterate_rptcache(struct oh_handler_state *handler, rpt_loop_handler_cb func, void *cb_data) { RPTable *table = handler->rptcache; struct ohoi_resource_info *res_info; SaHpiRptEntryT *rpt_entry; rpt_entry = oh_get_resource_next(table, SAHPI_FIRST_ENTRY); while (rpt_entry) { res_info = oh_get_resource_data(table, rpt_entry->ResourceId); if (func(handler, rpt_entry, res_info, cb_data)) { return; } rpt_entry = oh_get_resource_next(table, rpt_entry->ResourceId); } } void ohoi_iterate_rpt_rdrs(struct oh_handler_state *handler, SaHpiRptEntryT *rpt, rdr_loop_handler_cb func, void *cb_data) { SaHpiRdrT *rdr; RPTable *table = handler->rptcache; rdr = oh_get_rdr_next(table, rpt->ResourceId, SAHPI_FIRST_ENTRY); while (rdr) { if (func(handler, rpt, rdr, cb_data)) { break; } rdr = oh_get_rdr_next(table, rpt->ResourceId, rdr->RecordId); } return; } int ohoi_delete_orig_sensor_rdr(struct oh_handler_state *handler, SaHpiRptEntryT *rpt, ipmi_sensor_id_t *mysid) { SaHpiRdrT *rdr; SaHpiRdrT *rdr_todelete = NULL; RPTable *table = handler->rptcache; ipmi_sensor_id_t *sid; struct ohoi_sensor_info *s_info; int more_sensors = 0; rdr = oh_get_rdr_next(table, rpt->ResourceId, SAHPI_FIRST_ENTRY); while (rdr) { if (rdr_todelete && more_sensors) { break; } if (rdr->RdrType != SAHPI_SENSOR_RDR) { goto next_rdr; } s_info = oh_get_rdr_data(table, rpt->ResourceId, rdr->RecordId); if (!s_info) { err("s_info == NULL"); goto next_rdr; } if (rdr_todelete) { more_sensors = 1; break; } if (s_info->type == OHOI_SENSOR_ATCA_MAPPED) { more_sensors = 1; goto next_rdr; } sid = &s_info->info.orig_sensor_info.sensor_id; if (!ipmi_cmp_sensor_id(*mysid, *sid)) { rdr_todelete = rdr; goto next_rdr; } next_rdr: rdr = oh_get_rdr_next(table, rpt->ResourceId, rdr->RecordId); } if (rdr_todelete) { oh_remove_rdr(table, rpt->ResourceId, rdr_todelete->RecordId); } else { err("Sensor %d for rpt %d not deleted", mysid->sensor_num, rpt->ResourceId); } return !more_sensors; } int ohoi_delete_orig_control_rdr(struct oh_handler_state *handler, SaHpiRptEntryT *rpt, ipmi_control_id_t *mycid) { SaHpiRdrT *rdr; SaHpiRdrT *rdr_todelete = NULL; RPTable *table = handler->rptcache; ipmi_control_id_t *cid; struct ohoi_control_info *c_info; int more_controls = 0; rdr = oh_get_rdr_next(table, rpt->ResourceId, SAHPI_FIRST_ENTRY); while (rdr) { if (rdr->RdrType != SAHPI_CTRL_RDR) { goto next_rdr; } c_info = oh_get_rdr_data(table, rpt->ResourceId, rdr->RecordId); if (!c_info) { err("c_info == NULL"); goto next_rdr; } if (c_info->type == OHOI_CTRL_ATCA_MAPPED) { more_controls = 1; goto next_rdr; } cid = &c_info->info.orig_ctrl_info.ctrl_id; if (!ipmi_cmp_control_id(*mycid, *cid)) { rdr_todelete = rdr; goto next_rdr; } more_controls = 1; next_rdr: rdr = oh_get_rdr_next(table, rpt->ResourceId, rdr->RecordId); if (rdr_todelete) { oh_remove_rdr(table, rpt->ResourceId, rdr_todelete->RecordId); rdr_todelete = NULL; } // can be more than one control with the same cid. don't break } return !more_controls; } int ohoi_rpt_has_sensors(struct oh_handler_state *handler, SaHpiResourceIdT rid) { SaHpiRdrT *rdr; RPTable *table = handler->rptcache; rdr = oh_get_rdr_next(table, rid, SAHPI_FIRST_ENTRY); while (rdr) { if (rdr->RdrType == SAHPI_SENSOR_RDR) { return 1; } rdr = oh_get_rdr_next(table, rid, rdr->RecordId); } return 0; } int ohoi_rpt_has_controls(struct oh_handler_state *handler, SaHpiResourceIdT rid) { SaHpiRdrT *rdr; RPTable *table = handler->rptcache; rdr = oh_get_rdr_next(table, rid, SAHPI_FIRST_ENTRY); while (rdr) { if (rdr->RdrType == SAHPI_CTRL_RDR) { return 1; } rdr = oh_get_rdr_next(table, rid, rdr->RecordId); } return 0; } openhpi-3.6.1/plugins/ipmi/t/0000755000175100017510000000000012605014560015034 5ustar mohanmohanopenhpi-3.6.1/plugins/ipmi/t/Makefile.am0000644000175100017510000000375112575647300017110 0ustar mohanmohan# # Copyright (c) 2003, Intel Corporation # All rights reserved. # # Redistribution and use in source and binary forms, with or # without modification, are permitted provided that the following # conditions are met: # # Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the distribution. # # Neither the name of Intel Corporation nor the names # of its contributors may be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, # OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # MAINTAINERCLEANFILES = Makefile.in AM_CPPFLAGS = -DG_LOG_DOMAIN=\"t\" noinst_PROGRAMS = ipmi_thres_test AM_CPPFLAGS += @OPENHPI_INCLUDES@ #noinst_PROGRAMS = set_thres ipmi_thres_test_SOURCES = ipmi_thres_test.c ipmi_thres_test_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpidaemon.la #set_thres_SOURCES = set_thres.c #set_thres_LDADD = $(top_builddir)/baselib/libopenhpi.la openhpi-3.6.1/plugins/ipmi/t/ipmi_thres_test.c0000644000175100017510000003114312575647300020416 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (c) 2003, 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * ipmi_thres_test.c * * Authors: * Bill Barkely * Andy Cress * Changes: * 02/26/04 ARCress - added general search for any Fan sensor. * 03/17/04 ARCress - changed to Temp sensor (always has Lower Major) * 11/03/2004 kouzmich porting to HPI B * * Copied from clients/hpithres.c and modified * * 11/18/2004 kouzmich modified as ipmi test */ #include #include #include #include #include #include #include typedef enum { PASS = 0, // test passed FAIL, // test failed UNTESTED // error before testing } TestStatus_T; int fdebug = 0; char progver[] = "1.1"; SaErrorT rv; TestStatus_T status = FAIL; char *rdrtypes[5] = { "None ", "Control ", "Sensor ", "Invent ", "Watchdog"}; #define HPI_NSEC_PER_SEC 1000000000LL #define NSU 32 char *units[NSU] = { "units", "deg C", "deg F", "deg K", "volts", "amps", "watts", "joules", "coulombs", "va", "nits", "lumen", "lux", "candela", "kpa", "psi", "newton", "cfm", "rpm", "Hz", "us", "ms", "sec", "min", "hours", "days", "weeks", "mil", "in", "ft", "mm", "cm" }; static void print_value(SaHpiSensorReadingT *item, char *mes) { char *val; if (item->IsSupported != SAHPI_TRUE) return; switch (item->Type) { case SAHPI_SENSOR_READING_TYPE_INT64: printf("%s %lld\n", mes, item->Value.SensorInt64); return; case SAHPI_SENSOR_READING_TYPE_UINT64: printf("%s %llu\n", mes, item->Value.SensorUint64); return; case SAHPI_SENSOR_READING_TYPE_FLOAT64: printf("%s %10.3f\n", mes, item->Value.SensorFloat64); return; case SAHPI_SENSOR_READING_TYPE_BUFFER: val = (char *)(item->Value.SensorBuffer); if (val != NULL) printf("%s %s\n", mes, val); return; } } static void Set_value(SaHpiSensorReadingT *item, SaHpiSensorReadingUnionT value) { switch (item->Type) { case SAHPI_SENSOR_READING_TYPE_INT64: item->Value.SensorInt64 = value.SensorInt64; break; case SAHPI_SENSOR_READING_TYPE_UINT64: item->Value.SensorUint64 = value.SensorUint64; break; case SAHPI_SENSOR_READING_TYPE_FLOAT64: item->Value.SensorFloat64 = value.SensorFloat64; break; case SAHPI_SENSOR_READING_TYPE_BUFFER: printf("Set_value: Buffer type is not supported\n"); break; } } static void Mul_value(SaHpiSensorReadingT *item, SaHpiFloat64T value) { switch (item->Type) { case SAHPI_SENSOR_READING_TYPE_INT64: item->Value.SensorInt64 = (SaHpiInt64T)((SaHpiFloat64T)(item->Value.SensorInt64) * value); break; case SAHPI_SENSOR_READING_TYPE_UINT64: item->Value.SensorUint64 = (SaHpiUint64T)((SaHpiFloat64T)(item->Value.SensorUint64) * value); break; case SAHPI_SENSOR_READING_TYPE_FLOAT64: item->Value.SensorFloat64 *= value; break; case SAHPI_SENSOR_READING_TYPE_BUFFER: printf("Mul_value: Buffer type is not supported\n"); break; } } static void Sum_value(SaHpiSensorReadingT *item, SaHpiFloat64T value) { switch (item->Type) { case SAHPI_SENSOR_READING_TYPE_INT64: item->Value.SensorInt64 = (SaHpiInt64T)((SaHpiFloat64T)(item->Value.SensorInt64) + value); break; case SAHPI_SENSOR_READING_TYPE_UINT64: item->Value.SensorUint64 = (SaHpiUint64T)((SaHpiFloat64T)(item->Value.SensorUint64) + value); break; case SAHPI_SENSOR_READING_TYPE_FLOAT64: item->Value.SensorFloat64 += value; break; case SAHPI_SENSOR_READING_TYPE_BUFFER: printf("Sum_value: Buffer type is not supported\n"); break; } } static void ShowThresh(SaHpiSensorThresholdsT *sensbuff) { printf(" Supported Thresholds:\n"); print_value(&(sensbuff->LowCritical), " Lower Critical Threshold:"); print_value(&(sensbuff->LowMajor), " Lower Major Threshold:"); print_value(&(sensbuff->LowMinor), " Lower Minor Threshold:"); print_value(&(sensbuff->UpCritical), " Upper Critical Threshold:"); print_value(&(sensbuff->UpMajor), " Upper Major Threshold:"); print_value(&(sensbuff->UpMinor), " Upper Minor Threshold:"); print_value(&(sensbuff->PosThdHysteresis), " Positive Threshold Hysteresis:"); print_value(&(sensbuff->NegThdHysteresis), " Negative Threshold Hysteresis:"); printf("\n"); } static TestStatus_T DoEvent( SaHpiSessionIdT sessionid, SaHpiResourceIdT resourceid, SaHpiSensorRecT *sensorrec ) { SaHpiSensorNumT sensornum; SaHpiSensorReadingT reading; SaHpiSensorReadingT item; SaHpiSensorThresholdsT senstbuff1; SaHpiSensorThresholdsT senstbuff2; SaHpiSensorThresholdsT senstbuff3; SaHpiTimeoutT timeout = (SaHpiInt64T)(10 * HPI_NSEC_PER_SEC); /* 10 seconds */ SaHpiEventT event; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; char *unit; TestStatus_T stat = PASS; int i; sensornum = sensorrec->Num; /* Get current sensor reading */ rv = saHpiSensorReadingGet(sessionid, resourceid, sensornum, &reading, NULL); if (rv != SA_OK) { printf("saHpiSensorReadingGet: %s\n", oh_lookup_error(rv)); return(FAIL); } /* Determine units of interpreted reading */ i = sensorrec->DataFormat.BaseUnits; if (i > NSU) i = 0; unit = units[i]; print_value(&reading, unit); /* Retrieve current threshold setings, twice */ /* once for backup and once for modification */ /* Get backup copy */ rv = saHpiSensorThresholdsGet(sessionid, resourceid, sensornum, &senstbuff1); if (rv != SA_OK) { printf("saHpiSensorThresholdsGet: %s\n", oh_lookup_error(rv)); return(FAIL); } /* Get modification copy */ rv = saHpiSensorThresholdsGet(sessionid, resourceid, sensornum, &senstbuff2); if (rv != SA_OK) { printf("saHpiSensorThresholdsGet: %s\n", oh_lookup_error(rv)); return(FAIL); } /* Display current thresholds */ printf(" Current thresholds:\n"); ShowThresh(&senstbuff2); senstbuff2.LowMajor.IsSupported = 1; /* Set new threshold to current reading + 10% */ switch (senstbuff2.LowMajor.Type) { case SAHPI_SENSOR_READING_TYPE_INT64: senstbuff2.LowMajor.Value.SensorInt64 = reading.Value.SensorInt64 * 1.10; break; case SAHPI_SENSOR_READING_TYPE_UINT64: senstbuff2.LowMajor.Value.SensorFloat64 = reading.Value.SensorUint64 * 1.10; break; case SAHPI_SENSOR_READING_TYPE_FLOAT64: senstbuff2.LowMajor.Value.SensorFloat64 = reading.Value.SensorFloat64 * 1.10; break; case SAHPI_SENSOR_READING_TYPE_BUFFER: printf("Buffer type is not supported\n"); break; }; item = reading; Mul_value(&item, (SaHpiFloat64T)1.10); Set_value(&(senstbuff2.LowMajor), item.Value); /* In this case, LowMinor > LowMajor */ senstbuff2.LowMinor.IsSupported = 1; switch (senstbuff2.LowMinor.Type) { case SAHPI_SENSOR_READING_TYPE_INT64: senstbuff2.LowMinor.Value.SensorInt64 = reading.Value.SensorInt64 * (SaHpiInt64T)1.10 + 10; break; case SAHPI_SENSOR_READING_TYPE_UINT64: senstbuff2.LowMinor.Value.SensorFloat64 = reading.Value.SensorUint64 * (SaHpiUint64T)1.10 + 10; break; case SAHPI_SENSOR_READING_TYPE_FLOAT64: senstbuff2.LowMinor.Value.SensorFloat64 = reading.Value.SensorFloat64 * (SaHpiFloat64T)1.10 + 10; break; case SAHPI_SENSOR_READING_TYPE_BUFFER: printf("Buffer type is not supported\n"); break; }; item = reading; Mul_value(&item, (SaHpiFloat64T)1.10); Sum_value(&item, (SaHpiFloat64T)10); Set_value(&(senstbuff2.LowMinor), item.Value); printf(" New\n"); ShowThresh(&senstbuff2); /* Subscribe to New Events, only */ printf("Subscribe to events\n"); rv = saHpiSubscribe(sessionid); if (rv != SA_OK) { printf("saHpiSubscribe: %s\n", oh_lookup_error(rv)); return(UNTESTED); } /* Set new thresholds */ printf("Set new thresholds\n"); rv = saHpiSensorThresholdsSet(sessionid, resourceid, sensornum, &senstbuff2); if (rv != SA_OK) { printf("saHpiSensorThresholdsSet: %s\n", oh_lookup_error(rv)); printf("Unsubscribe\n"); saHpiUnsubscribe(sessionid); return(FAIL); } /* Go wait on event to occur */ printf("Go and get the event\n"); for (;;) { rv = saHpiEventGet(sessionid, timeout, &event, &rdr, &rptentry, NULL); if (rv != SA_OK) { if (rv != SA_ERR_HPI_TIMEOUT) { printf("Error during EventGet\n"); stat = FAIL; }; break; } if (event.EventType == SAHPI_ET_SENSOR) { printf("Sensor # = %2d Severity = %2x\n", event.EventDataUnion.SensorEvent.SensorNum, event.Severity ); if (event.EventDataUnion.SensorEvent.SensorNum == sensornum) { printf("Got it\n"); break; } } } if (stat != FAIL) { saHpiSensorThresholdsGet(sessionid, resourceid, sensornum, &senstbuff3); printf(" Current thresholds:\n"); ShowThresh(&senstbuff3); if (memcmp(&senstbuff3, &senstbuff2, sizeof(SaHpiSensorThresholdsT)) != 0) { printf("Invalid current threshold!\n"); stat = FAIL; } } /* Reset to the original thresholds */ printf("Reset thresholds\n"); rv = saHpiSensorThresholdsSet(sessionid, resourceid, sensornum, &senstbuff1); if (rv != SA_OK) { printf("saHpiSensorThresholdsSet: %s\n", oh_lookup_error(rv)); } else { /* Re-read threshold values */ rv = saHpiSensorThresholdsGet(sessionid, resourceid, sensornum, &senstbuff2); if (rv != SA_OK) { printf("saHpiSensorThresholdsGet: %s\n", oh_lookup_error(rv)); } else { /* Display reset thresholds */ printf(" Reset thresholds:\n"); ShowThresh(&senstbuff2); } } printf("Unsubscribe\n"); saHpiUnsubscribe(sessionid); return (stat); } /*end DoEvent*/ static TestStatus_T test(int argc, char **argv) { int c; SaHpiSessionIdT sessionid; SaHpiDomainInfoT domainInfo; SaHpiRptEntryT rptentry; SaHpiEntryIdT rptentryid; SaHpiEntryIdT nextrptentryid; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiResourceIdT resourceid; SaHpiRdrT rdr; TestStatus_T result = PASS; printf("%s ver %s\n", argv[0], progver); while ( (c = getopt( argc, argv,"x?")) != EOF ) switch(c) { case 'x': fdebug = 1; break; default: printf("Usage: %s [-x]\n", argv[0]); printf(" -x Display debug messages\n"); return (UNTESTED); } rv = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID ,&sessionid, NULL); if (rv != SA_OK) { printf("saHpiSessionOpen: %s\n", oh_lookup_error(rv)); return (UNTESTED); } rv = saHpiDiscover(sessionid); if (fdebug) printf("saHpiDiscover: %s\n", oh_lookup_error(rv)); rv = saHpiDomainInfoGet(sessionid,&domainInfo); if (fdebug) printf("saHpiDomainInfoGet: %s\n", oh_lookup_error(rv)); if (fdebug) printf("DomainInfo: UpdateCount = %x, UpdateTime = %lx\n", domainInfo.RptUpdateCount, (unsigned long)domainInfo.RptUpdateTimestamp); /* walk the RPT list */ rptentryid = SAHPI_FIRST_ENTRY; while ((result == PASS) && (rptentryid != SAHPI_LAST_ENTRY)) { rv = saHpiRptEntryGet(sessionid, rptentryid, &nextrptentryid, &rptentry); if (rv != SA_OK) break; /* walk the RDR list for this RPT entry */ entryid = SAHPI_FIRST_ENTRY; rptentry.ResourceTag.Data[rptentry.ResourceTag.DataLength] = 0; resourceid = rptentry.ResourceId; if (fdebug) printf("rptentry[%d] resourceid=%d\n", rptentryid,resourceid); printf("Resource Tag: %s\n", rptentry.ResourceTag.Data); while ((result == PASS) && (entryid != SAHPI_LAST_ENTRY)) { rv = saHpiRdrGet(sessionid, resourceid, entryid, &nextentryid, &rdr); if (fdebug) printf("saHpiRdrGet[%d]: %s\n", entryid, oh_lookup_error(rv)); if (rv != SA_OK) { printf( "saHpiRdrGet: Returned HPI Error: %s\n", oh_lookup_error(rv)); break; }; if (rdr.RdrType == SAHPI_SENSOR_RDR) { /*type 2 includes sensor and control records*/ rdr.IdString.Data[rdr.IdString.DataLength] = 0; printf("%02d %s\t", rdr.RecordId, rdr.IdString.Data); result = DoEvent(sessionid, resourceid, &rdr.RdrTypeUnion.SensorRec); if (result != PASS) { printf("Returned Error from DoEvent\n"); break; } } entryid = nextentryid; } /*while rdr loop */ rptentryid = nextrptentryid; } /*while rpt loop*/ saHpiSessionClose(sessionid); return(result); } int main(int argc, char **argv) { status = test(argc, argv); switch (status) { case PASS: printf(" Test PASSED\n"); break; case FAIL: printf(" Test FAILED\n"); break; case UNTESTED: printf(" Test UNTESTED (error before testing)\n"); break; default: printf(" UNKNOWN ERROR!\n"); } return (status == PASS ? 0 : 1); } /* end ipmi_thres_test.c */ openhpi-3.6.1/plugins/ipmi/ipmi_control_event.c0000644000175100017510000005044412575647300020655 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Tariq Shureih * Louis Zhuang */ #include "ipmi.h" #include #include //static void add_control_event_data_format(ipmi_control_t *control, //SaHpiCtrlRecT *rec) //{ //} static void trace_ipmi_control(char *str, ipmi_control_t *control, SaHpiRptEntryT *rpt) { if (!getenv("OHOI_TRACE_CONTROL") && !IHOI_TRACE_ALL) { return; } char strtype[24]; char name[24]; ipmi_control_get_id(control, name, 24); switch (ipmi_control_get_type(control)) { case IPMI_CONTROL_ONE_SHOT_RESET: strncpy(strtype,"reset", 24); break; case IPMI_CONTROL_POWER: strncpy(strtype,"power", 24); break; case IPMI_CONTROL_ALARM: strncpy(strtype,"alarm", 24); break; case IPMI_CONTROL_IDENTIFIER: strncpy(strtype,"address", 24); break; case IPMI_CONTROL_LIGHT: strncpy(strtype,"LED", 24); break; default: snprintf(strtype, 24, "unknown(%d)", ipmi_control_get_type(control)); break; } fprintf(stderr, " *** CONTROL %s. type %s (%s). RPT %d(%s)\n", str, strtype, name, rpt->ResourceId, rpt->ResourceTag.Data); } SaHpiUint8T ohoi_atca_led_to_hpi_color(int ipmi_color) { switch (ipmi_color) { case IPMI_CONTROL_COLOR_WHITE: return ATCAHPI_LED_COLOR_WHITE; case IPMI_CONTROL_COLOR_RED: return ATCAHPI_LED_COLOR_RED; case IPMI_CONTROL_COLOR_GREEN: return ATCAHPI_LED_COLOR_GREEN; case IPMI_CONTROL_COLOR_BLUE: return ATCAHPI_LED_COLOR_BLUE; case IPMI_CONTROL_COLOR_YELLOW: return ATCAHPI_LED_COLOR_AMBER; case IPMI_CONTROL_COLOR_ORANGE: return ATCAHPI_LED_COLOR_ORANGE; default: err("strange color %d, return WHITE", ipmi_color); return ATCAHPI_LED_COLOR_WHITE; } } int ohoi_atca_led_to_ipmi_color(SaHpiUint8T c) { switch (c) { case ATCAHPI_LED_COLOR_WHITE: return IPMI_CONTROL_COLOR_WHITE; case ATCAHPI_LED_COLOR_ORANGE: return IPMI_CONTROL_COLOR_ORANGE; case ATCAHPI_LED_COLOR_AMBER: return IPMI_CONTROL_COLOR_YELLOW; case ATCAHPI_LED_COLOR_GREEN: return IPMI_CONTROL_COLOR_GREEN; case ATCAHPI_LED_COLOR_RED: return IPMI_CONTROL_COLOR_RED; case ATCAHPI_LED_COLOR_BLUE: return IPMI_CONTROL_COLOR_BLUE; default: return 0; } } static SaHpiCtrlOutputTypeT _control_type_from_ipmi_to_hpi( ipmi_control_t *control) { switch (ipmi_control_get_type(control)) { case IPMI_CONTROL_ALARM: return SAHPI_CTRL_FRONT_PANEL_LOCKOUT; case IPMI_CONTROL_DISPLAY: return SAHPI_CTRL_LCD_DISPLAY; case IPMI_CONTROL_LIGHT: return SAHPI_CTRL_LED; case IPMI_CONTROL_FAN_SPEED: return SAHPI_CTRL_FAN_SPEED; case IPMI_CONTROL_IDENTIFIER: case IPMI_CONTROL_RELAY: default: return SAHPI_CTRL_OEM; } } static void set_idstring(ipmi_control_t *control, SaHpiRdrT *rdr) { char name[SAHPI_MAX_TEXT_BUFFER_LENGTH]; SaHpiTextTypeT data_type; int name_len; memset(name, '\0' ,SAHPI_MAX_TEXT_BUFFER_LENGTH); ipmi_control_get_id(control, name, SAHPI_MAX_TEXT_BUFFER_LENGTH); name_len = ipmi_control_get_id_length(control); if (name_len >= SAHPI_MAX_TEXT_BUFFER_LENGTH) name_len = SAHPI_MAX_TEXT_BUFFER_LENGTH - 1; data_type = convert_to_hpi_data_type(ipmi_control_get_id_type(control)); rdr->IdString.DataType = data_type; rdr->IdString.Language = SAHPI_LANG_ENGLISH; rdr->IdString.DataLength = name_len; memset(rdr->IdString.Data, 0, SAHPI_MAX_TEXT_BUFFER_LENGTH); memcpy(rdr->IdString.Data, name, name_len); } static int add_control_event(ipmi_entity_t *ent, ipmi_control_t *control, struct oh_handler_state *handler, SaHpiEntityPathT parent_ep, SaHpiResourceIdT rid) { struct ohoi_resource_info *info; struct ohoi_control_info *ctrl_info; SaHpiRdrT rdr; ctrl_info = malloc(sizeof(struct ohoi_control_info)); if (!ctrl_info) { err("Out of memory"); return 1; } memset(&rdr, 0, sizeof(rdr)); ctrl_info->type = OHOI_CTRL_ORIGINAL; ctrl_info->info.orig_ctrl_info.ctrl_id = ipmi_control_convert_to_id(control); ctrl_info->mode = SAHPI_CTRL_MODE_AUTO; ctrl_info->ohoii.get_control_state = orig_get_control_state; ctrl_info->ohoii.set_control_state = orig_set_control_state; rdr.RecordId = 0; rdr.Entity = parent_ep; rdr.RdrTypeUnion.CtrlRec.OutputType = _control_type_from_ipmi_to_hpi(control); rdr.RdrTypeUnion.CtrlRec.Type = SAHPI_CTRL_TYPE_OEM; set_idstring(control, &rdr); info = oh_get_resource_data(handler->rptcache, rid); if (!info) { free(ctrl_info); err("No info in resource(%d)\n", rid); return 1; } rdr.RdrTypeUnion.CtrlRec.Num = ++info->ctrl_count; rid = oh_uid_lookup(&rdr.Entity); if (oh_add_rdr(handler->rptcache, rid, &rdr, ctrl_info, 1) != SA_OK) { err("couldn't add control rdr"); free(ctrl_info); return 1; } return 0; } static void set_possible_colors(ipmi_control_t *control, unsigned char *clrs) { unsigned char c = 0; int num = 0; if (ipmi_control_light_is_color_supported(control, IPMI_CONTROL_COLOR_WHITE)) { c |= ATCAHPI_LED_WHITE; num++; } if (ipmi_control_light_is_color_supported(control, IPMI_CONTROL_COLOR_RED)) { c |= ATCAHPI_LED_RED; num++; } if (ipmi_control_light_is_color_supported(control, IPMI_CONTROL_COLOR_GREEN)) { c |= ATCAHPI_LED_GREEN; num++; } if (ipmi_control_light_is_color_supported(control, IPMI_CONTROL_COLOR_BLUE)) { c |= ATCAHPI_LED_BLUE; num++; } if (ipmi_control_light_is_color_supported(control, IPMI_CONTROL_COLOR_YELLOW)) { c |= ATCAHPI_LED_AMBER; num++; } if (ipmi_control_light_is_color_supported(control, IPMI_CONTROL_COLOR_ORANGE)) { c |= ATCAHPI_LED_ORANGE; num++; } *clrs = c; } typedef struct { SaHpiCtrlRecOemT *oem; SaHpiCtrlDefaultModeT *dm; int err; int done; } ohoi_led_info_t; static void set_led_oem_cb(ipmi_control_t *control, int err, ipmi_light_setting_t *st, void *cb_data) { ohoi_led_info_t *info = cb_data; SaHpiCtrlRecOemT *oem = info->oem; SaHpiCtrlDefaultModeT *dm = info->dm; int lc = 0; int color; int on_time, off_time; if (err) { info->err = err; info->done = 1; err("led_default_mode_settings_cb = %d", err); return; } oem->Default.MId = ATCAHPI_PICMG_MID; oem->MId = ATCAHPI_PICMG_MID; // set possible colors set_possible_colors(control, &oem->ConfigData[0]); //set default auto color if (ipmi_light_setting_get_color(st, 0, &color) == 0) { oem->ConfigData[1] = ohoi_atca_led_to_hpi_color(color); } else { oem->ConfigData[1] = 0; } //set default manual color if (ipmi_light_setting_get_color(st, 0, &color) == 0) { oem->ConfigData[2] = ohoi_atca_led_to_hpi_color(color); } else { oem->ConfigData[2] = 0; } if (!ipmi_light_setting_get_on_time(st, 0, &on_time) && !ipmi_light_setting_get_off_time(st, 0, &off_time)) { oem->ConfigData[3] = ATCAHPI_LED_BR_SUPPORTED; if (off_time > 10) { oem->Default.Body[0] = off_time / 10; } else { oem->Default.Body[0] = off_time ? 1 : 0; } if (on_time > 10) { oem->Default.Body[1] = on_time / 10; } else { oem->Default.Body[1] = on_time ? 1 : 0; } } else { oem->ConfigData[3] = ATCAHPI_LED_BR_NOT_SUPPORTED; } oem->Default.Body[2] = oem->ConfigData[1]; oem->Default.Body[3] = oem->ConfigData[2]; oem->Default.Body[4] = SAHPI_FALSE; oem->Default.BodyLength = 6; if (!ipmi_control_light_has_local_control(control)) { dm->Mode = SAHPI_CTRL_MODE_AUTO; dm->ReadOnly = SAHPI_TRUE; } else { ipmi_light_setting_in_local_control(st, 0, &lc); dm->Mode = lc ? SAHPI_CTRL_MODE_AUTO : SAHPI_CTRL_MODE_MANUAL; dm->ReadOnly = SAHPI_FALSE; } info->done = 1; } static int add_led_control_event(ipmi_entity_t *ent, ipmi_control_t *control, struct oh_handler_state *handler, SaHpiRptEntryT *rpt) { SaHpiEntityPathT parent_ep = rpt->ResourceEntity; SaHpiResourceIdT rid = rpt->ResourceId; struct ohoi_resource_info *info; struct ohoi_control_info *ctrl_info; SaHpiRdrT rdr; int rv; ctrl_info = malloc(sizeof(struct ohoi_control_info)); if (!ctrl_info) { err("Out of memory"); return 1; } memset(&rdr, 0, sizeof(rdr)); ctrl_info->type = OHOI_CTRL_ORIGINAL; ctrl_info->info.orig_ctrl_info.ctrl_id = ipmi_control_convert_to_id(control); ctrl_info->ohoii.get_control_state = orig_get_control_state; ctrl_info->ohoii.set_control_state = orig_set_control_state; rdr.RecordId = 0; rdr.RdrType = SAHPI_CTRL_RDR; rdr.Entity = parent_ep; rdr.RdrTypeUnion.CtrlRec.OutputType = SAHPI_CTRL_LED; rdr.RdrTypeUnion.CtrlRec.Type = SAHPI_CTRL_TYPE_OEM; rdr.RdrTypeUnion.CtrlRec.DefaultMode.Mode = SAHPI_CTRL_MODE_AUTO; rdr.RdrTypeUnion.CtrlRec.DefaultMode.ReadOnly = SAHPI_TRUE; set_idstring(control, &rdr); if (ipmi_control_light_set_with_setting(control)) { ohoi_led_info_t info; info.done = 0; info.err = 0; info.oem = &rdr.RdrTypeUnion.CtrlRec.TypeUnion.Oem; info.dm = &rdr.RdrTypeUnion.CtrlRec.DefaultMode; rv = ipmi_control_get_light(control, set_led_oem_cb, &info); if (rv) { err("ipmi_control_get_light = 0x%x", rv); } else { ohoi_loop(&info.done, handler->data); } } else { err("ipmi_control_light_set_with_setting == 0"); } ctrl_info->mode = rdr.RdrTypeUnion.CtrlRec.DefaultMode.Mode; rdr.RdrTypeUnion.CtrlRec.Oem = ATCAHPI_PICMG_CT_ATCA_LED; info = oh_get_resource_data(handler->rptcache, rid); if (!info) { free(ctrl_info); err("No info in resource(%d)\n", rid); return 1; } if (strcasecmp((char *)rdr.IdString.Data, "blue led") == 0) { rdr.RdrTypeUnion.CtrlRec.Num = ATCAHPI_CTRL_NUM_BLUE_LED; } else if (strcasecmp((char *)rdr.IdString.Data, "led 1") == 0) { rdr.RdrTypeUnion.CtrlRec.Num = ATCAHPI_CTRL_NUM_LED1; } else if (strcasecmp((char *)rdr.IdString.Data, "led 2") == 0) { rdr.RdrTypeUnion.CtrlRec.Num = ATCAHPI_CTRL_NUM_LED2; } else if (strcasecmp((char *)rdr.IdString.Data, "led 3") == 0) { rdr.RdrTypeUnion.CtrlRec.Num = ATCAHPI_CTRL_NUM_LED3; } else if (strcasestr((char *)rdr.IdString.Data, "application-specific led ") == (char *)rdr.IdString.Data) { char *appnum = (char *)&rdr.IdString.Data[strlen("application-specific led ")]; if (strlen(appnum) <= 3) { rdr.RdrTypeUnion.CtrlRec.Num = ATCAHPI_CTRL_NUM_APP_LED + strtoul(appnum, NULL, 0); } else { err("Invalid data in LED Control\n"); return 1; } } else { err("Invalid data in LED Control\n"); return 1; } rid = oh_uid_lookup(&rdr.Entity); rv = oh_add_rdr(handler->rptcache, rid, &rdr, ctrl_info, 1); if (rv != SA_OK) { err("couldn't add control rdr. rv = %d", rv); free(ctrl_info); return 1; } #if 0 /* May be it's hot swap indicator? */ if (strcmp(rdr->IdString.Data, "blue led")) { return; } if (rpt->HotSwapCapabilities & SAHPI_HS_CAPABILITY_INDICATOR_SUPPORTED) { // already set? err("Resource %d. hot swap indicator already set 0x%x !?", rid, rpt->HotSwapCapabilities); } trace_ipmi("Attach hot swap indicator into entity %d(%s)", rpt->ResourceId, rpt->ResourceTag.Data); info->hotswapind = e->u.rdr_event.rdr.RdrTypeUnion.CtrlRec.Num; rpt->HotSwapCapabilities |= SAHPI_HS_CAPABILITY_INDICATOR_SUPPORTED; #endif return 0; } /* * add_alarm_rdr */ static void add_alarm_rdr(char *name, int num, SaHpiResourceIdT rptid, SaHpiEntityPathT parent_ent, SaHpiCtrlDefaultModeT *def_mode, SaHpiBoolT wo, ipmi_control_id_t *control_id, struct oh_handler_state *handler) { SaHpiRdrT rdr_temp; SaHpiRdrT *rdr; int name_len; struct ohoi_control_info *ctrl_info; struct ohoi_resource_info *info; info = oh_get_resource_data(handler->rptcache, rptid); if (!info) { err("No info in resource(%d)\n", rptid); return; } ctrl_info = malloc(sizeof(struct ohoi_control_info)); if (!ctrl_info) { err("Out of memory"); return; } ctrl_info->type = OHOI_CTRL_ORIGINAL; ctrl_info->info.orig_ctrl_info.ctrl_id = *control_id; ctrl_info->mode = SAHPI_CTRL_MODE_AUTO; ctrl_info->ohoii.get_control_state = orig_get_control_state; ctrl_info->ohoii.set_control_state = orig_set_control_state; rdr = &rdr_temp; rdr->RecordId = 0; rdr->RdrType = SAHPI_CTRL_RDR; rdr->Entity = parent_ent; name_len = strlen(name); if (name_len >= SAHPI_MAX_TEXT_BUFFER_LENGTH) name_len = SAHPI_MAX_TEXT_BUFFER_LENGTH - 1; rdr->IdString.DataType = SAHPI_TL_TYPE_TEXT; rdr->IdString.Language = SAHPI_LANG_ENGLISH; rdr->IdString.DataLength = strlen(name); memset(rdr->IdString.Data, 0, SAHPI_MAX_TEXT_BUFFER_LENGTH); memcpy(rdr->IdString.Data, name, strlen(name)); rdr->RdrTypeUnion.CtrlRec.Num = ++info->ctrl_count; rdr->RdrTypeUnion.CtrlRec.Type = SAHPI_CTRL_TYPE_DIGITAL; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Digital.Default = SAHPI_CTRL_STATE_OFF; rdr->RdrTypeUnion.CtrlRec.OutputType = SAHPI_CTRL_LED; rdr->RdrTypeUnion.CtrlRec.Oem = OEM_ALARM_BASE + num; /* FIXME: OpenIPMI does not provide a reading */ rdr->RdrTypeUnion.CtrlRec.WriteOnly = wo; rdr->RdrTypeUnion.CtrlRec.DefaultMode.Mode = def_mode->Mode; rdr->RdrTypeUnion.CtrlRec.DefaultMode.ReadOnly = def_mode->ReadOnly; if(oh_add_rdr(handler->rptcache, rptid, rdr, ctrl_info, 1)) { err("couldn't add alarm control"); free(ctrl_info); return; } trace_ipmi("add_alarm_rdr: %s\n",name); } /* * add_alarm_rdrs */ static int add_alarm_rdrs( struct oh_handler_state *handler, SaHpiRptEntryT *rpt, ipmi_control_t *control) { SaHpiResourceIdT rid; SaHpiEntityPathT ent; SaHpiCtrlDefaultModeT default_mode; SaHpiBoolT wo; static ipmi_control_id_t alarm_control_id; /*save this */ static int alarms_done = 0; if (alarms_done) return 0; /* only do alarms the first time */ rid = rpt->ResourceId; ent = rpt->ResourceEntity; alarm_control_id = ipmi_control_convert_to_id(control); wo = (ipmi_control_is_readable(control) == 0); default_mode.ReadOnly = (ipmi_control_is_settable(control) != 0); default_mode.Mode = SAHPI_CTRL_MODE_AUTO; rpt->ResourceCapabilities |= SAHPI_CAPABILITY_RDR; rpt->ResourceCapabilities |= SAHPI_CAPABILITY_CONTROL; add_alarm_rdr("Power Alarm LED", 0, rid, ent, &default_mode, wo, &alarm_control_id, handler); add_alarm_rdr("Critical Alarm LED", 1, rid, ent, &default_mode, wo, &alarm_control_id, handler); add_alarm_rdr("Major Alarm LED", 2, rid, ent, &default_mode, wo, &alarm_control_id, handler); add_alarm_rdr("Minor Alarm LED", 3, rid, ent, &default_mode, wo, &alarm_control_id, handler); alarms_done = 1; return 0; } #if 0 static void address_control(ipmi_control_t *control, int err, unsigned char *val, int length, void *cb_data) { int i; int *location = cb_data; if (control == NULL) { err("Invalid control?"); return; } for (i=0; idata; rv = ipmi_control_identifier_get_val(control, address_control, &location); if(rv) { err("Error getting identifier control val"); return -1; } ohoi_loop(&location, ipmi_handler); //rpt->ResourceEntity.Entry[0].EntityLocation = //ipmi_entity_get_entity_instance(entity) - 96 ; //rpt->ResourceEntity.Entry[1].EntityLocation = location; //rpt.ResourceId = //oh_uid_from_entity_path(&rpt.ResourceEntity); //dbg("Control New ResourceId: %d", rpt.ResourceId); //rv = oh_add_resource(handler->rptcache, *rpt, NULL, 1); //if (rv) { //err("oh_add_resource failed for %d = %s\n", rpt->ResourceId, oh_lookup_error(rv)); //} return 0; } #endif void ohoi_control_event(enum ipmi_update_e op, ipmi_entity_t *ent, ipmi_control_t *control, void *cb_data) { struct oh_handler_state *handler = cb_data; struct ohoi_handler *ipmi_handler = handler->data; struct ohoi_resource_info *ohoi_res_info; int ctrl_type = ipmi_control_get_type(control); ipmi_control_id_t cid = ipmi_control_convert_to_id(control); ipmi_entity_id_t entity_id; SaHpiRptEntryT *rpt_entry; char str[24]; int rv; entity_id = ipmi_entity_convert_to_id(ent); rpt_entry = ohoi_get_resource_by_entityid(handler->rptcache, &entity_id); if (!rpt_entry) { dump_entity_id("Control with RPT Entry?!", entity_id); return; } g_static_rec_mutex_lock(&ipmi_handler->ohoih_lock); ohoi_res_info = oh_get_resource_data(handler->rptcache, rpt_entry->ResourceId); if (op == IPMI_ADDED) { trace_ipmi_control("ADD", control, rpt_entry); /* attach power and reset to chassis entity since IPMI provides them as such */ switch (ctrl_type) { case IPMI_CONTROL_ONE_SHOT_RESET: ohoi_res_info->reset_ctrl = cid; rpt_entry->ResourceCapabilities |= SAHPI_CAPABILITY_RESET; break; case IPMI_CONTROL_POWER: if ((ipmi_handler->d_type == IPMI_DOMAIN_TYPE_ATCA) && (ipmi_entity_get_entity_id(ent) == SAHPI_ENT_SYSTEM_CHASSIS)) { // never power off ATCA chassis break; } ohoi_res_info->power_ctrl = cid; rpt_entry->ResourceCapabilities |= SAHPI_CAPABILITY_POWER; break; case IPMI_CONTROL_ALARM: rv = add_alarm_rdrs(handler,rpt_entry,control); if (rv) { err("add_alarms_rdrs failed"); break; } rpt_entry->ResourceCapabilities |= SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_RDR; break; case IPMI_CONTROL_IDENTIFIER: #if 0 rv = address_control_get(control,handler, ent, rpt_entry); if (rv) { err("address_control_get failed"); break; } rpt_entry->ResourceCapabilities |= SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_RDR; #endif break; case IPMI_CONTROL_LIGHT: ipmi_control_get_id(control, str, 24); if (add_led_control_event(ent, control, handler, rpt_entry)) { break; } rpt_entry->ResourceCapabilities |= SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_RDR; break; default: if (SA_OK != add_control_event(ent, control, handler, rpt_entry->ResourceEntity, rpt_entry->ResourceId)) { break; } rpt_entry->ResourceCapabilities |= SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_RDR; break; } } else if (op == IPMI_DELETED) { trace_ipmi_control("DELETE", control, rpt_entry); switch (ctrl_type) { case IPMI_CONTROL_ONE_SHOT_RESET: ipmi_control_id_set_invalid( &ohoi_res_info->reset_ctrl); rpt_entry->ResourceCapabilities &= ~SAHPI_CAPABILITY_RESET; break; case IPMI_CONTROL_POWER: ipmi_control_id_set_invalid( &ohoi_res_info->power_ctrl); rpt_entry->ResourceCapabilities &= ~SAHPI_CAPABILITY_POWER; break; default: if (ohoi_delete_orig_control_rdr(handler, rpt_entry, &cid)) { // no more controlss for rpt rpt_entry->ResourceCapabilities &= ~SAHPI_CAPABILITY_CONTROL; ohoi_res_info->ctrl_count = 0; } break; } if ((oh_get_rdr_next(handler->rptcache, rpt_entry->ResourceId, SAHPI_FIRST_ENTRY) == NULL) && (ohoi_res_info->fru == NULL)) { // no more rdrs for rpt rpt_entry->ResourceCapabilities &= ~SAHPI_CAPABILITY_RDR; } } trace_ipmi("Set updated for res_info %p(%d). Control", ohoi_res_info, rpt_entry->ResourceId); entity_rpt_set_updated(ohoi_res_info, ipmi_handler); g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); } openhpi-3.6.1/plugins/ipmi/ipmi_inventory_event.c0000644000175100017510000002041712575647300021227 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Louis Zhuang * Racing Guo */ #include "ipmi.h" #include #include static void trace_ipmi_fru(char *str, ipmi_entity_t *entity) { if (!getenv("OHOI_TRACE_FRU") && !IHOI_TRACE_ALL) { return; } fprintf(stderr, "*** FRU %s: for (%d,%d,%d,%d) %s\n", str, ipmi_entity_get_entity_id(entity), ipmi_entity_get_entity_instance(entity), ipmi_entity_get_device_channel(entity), ipmi_entity_get_device_address(entity), ipmi_entity_get_entity_id_string(entity)); } static void init_inventory_info( struct oh_handler_state *handler, struct ohoi_resource_info *res_info, ipmi_entity_t *ent) { struct ohoi_handler *ipmi_handler = handler->data; ipmi_fru_t *fru = ipmi_entity_get_fru(ent); struct ohoi_inventory_info *i_info; unsigned int len; unsigned char uch; time_t tm; unsigned int i; if (fru == NULL) { err("ipmi_entity_get_fru returned NULL"); return; } i_info = malloc(sizeof(*i_info)); if (!i_info) { err("Out of memory"); return; } memset(i_info, 0, sizeof(*i_info)); i_info->mutex = g_mutex_new(); if (ipmi_fru_area_get_length( fru, IPMI_FRU_FTR_INTERNAL_USE_AREA, &len) == 0) { i_info->iu = 255; } if (ipmi_fru_area_get_length( fru, IPMI_FRU_FTR_CHASSIS_INFO_AREA, &len) == 0) { i_info->ci = 255; if (ipmi_fru_get_chassis_info_type(fru, &uch) == 0) { i_info->ci_fld_msk |= (1 << SAHPI_IDR_FIELDTYPE_CHASSIS_TYPE); } if (ipmi_fru_get_chassis_info_part_number_len(fru, &len) == 0) { i_info->ci_fld_msk |= (1 << SAHPI_IDR_FIELDTYPE_PART_NUMBER); } if (ipmi_fru_get_chassis_info_serial_number_len(fru, &len) == 0) { i_info->ci_fld_msk |= (1 << SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER); } for (i = 0; ;i++) { if (ipmi_fru_get_chassis_info_custom_len(fru, i, &len) != 0) { break; } i_info->ci_fld_msk |= (1 << SAHPI_IDR_FIELDTYPE_CUSTOM); i_info->ci_custom_num++; } } if (ipmi_fru_get_board_info_lang_code(fru, &i_info->bi) == 0) { if (i_info->bi == 0) { i_info->bi = SAHPI_LANG_ENGLISH; } if (ipmi_fru_get_board_info_board_manufacturer_len(fru, &len) == 0) { i_info->bi_fld_msk |= (1 << SAHPI_IDR_FIELDTYPE_MANUFACTURER); } if (ipmi_fru_get_board_info_mfg_time(fru, &tm) == 0) { i_info->bi_fld_msk |= (1 << SAHPI_IDR_FIELDTYPE_MFG_DATETIME); } if (ipmi_fru_get_board_info_board_product_name_len(fru, &len) == 0) { i_info->bi_fld_msk |= (1 << SAHPI_IDR_FIELDTYPE_PRODUCT_NAME); } if (ipmi_fru_get_board_info_board_serial_number_len(fru, &len) == 0) { i_info->bi_fld_msk |= (1 << SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER); } if (ipmi_fru_get_board_info_board_part_number_len(fru, &len) == 0) { i_info->bi_fld_msk |= (1 << SAHPI_IDR_FIELDTYPE_PART_NUMBER); } if (ipmi_fru_get_board_info_fru_file_id_len(fru, &len) == 0) { i_info->bi_fld_msk |= (1 << SAHPI_IDR_FIELDTYPE_FILE_ID); } for (i = 0; ;i++) { if (ipmi_fru_get_board_info_custom_len(fru, i, &len) != 0) { break; } i_info->bi_fld_msk |= (1 << SAHPI_IDR_FIELDTYPE_CUSTOM); i_info->bi_custom_num++; } } if (ipmi_fru_get_product_info_lang_code(fru, &i_info->pi) == 0) { if (i_info->pi == 0) { i_info->pi = SAHPI_LANG_ENGLISH; } if (ipmi_fru_get_product_info_manufacturer_name_len(fru, &len) == 0) { i_info->pi_fld_msk |= (1 << SAHPI_IDR_FIELDTYPE_MANUFACTURER); } if (ipmi_fru_get_product_info_product_name_len(fru, &len) == 0) { i_info->pi_fld_msk |= (1 << SAHPI_IDR_FIELDTYPE_PRODUCT_NAME); } if (ipmi_fru_get_product_info_product_part_model_number_len(fru, &len) == 0) { i_info->pi_fld_msk |= (1 << SAHPI_IDR_FIELDTYPE_PART_NUMBER); } if (ipmi_fru_get_product_info_product_version_len(fru, &len) == 0) { i_info->pi_fld_msk |= (1 << SAHPI_IDR_FIELDTYPE_PRODUCT_VERSION); } if (ipmi_fru_get_product_info_product_serial_number_len(fru, &len) == 0) { i_info->pi_fld_msk |= (1 << SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER); } if (ipmi_fru_get_product_info_asset_tag_len(fru, &len) == 0) { i_info->pi_fld_msk |= (1 << SAHPI_IDR_FIELDTYPE_ASSET_TAG); } if (ipmi_fru_get_product_info_fru_file_id_len(fru, &len) == 0) { i_info->pi_fld_msk |= (1 << SAHPI_IDR_FIELDTYPE_FILE_ID); } for (i = 0; ;i++) { if (ipmi_fru_get_product_info_custom_len(fru, i, &len) != 0) { break; } i_info->pi_fld_msk |= (1 << SAHPI_IDR_FIELDTYPE_CUSTOM); i_info->pi_custom_num++; } } if (ipmi_fru_area_get_length( fru, IPMI_FRU_FTR_MULTI_RECORD_AREA, &len) == 0) { unsigned int r_num = ipmi_fru_get_num_multi_records(fru); i_info->oem = 1; i_info->oem_fields_num = r_num; if (ipmi_handler->d_type == IPMI_DOMAIN_TYPE_ATCA) { i_info->oem = ohoi_create_atca_oem_idr_areas(handler, ent, res_info, i_info, r_num); } } res_info->fru = i_info; } static void add_inventory_event(struct ohoi_resource_info *res_info, ipmi_entity_t *ent, struct oh_handler_state *handler, SaHpiRptEntryT *rpt_entry) { SaHpiResourceIdT rid = rpt_entry->ResourceId; SaHpiRdrT rdr; int rv; init_inventory_info(handler, res_info, ent); if (res_info->fru == NULL) { err("Out of memory"); return; } memset(&rdr, 0, sizeof(rdr)); rdr.RecordId = 0; rdr.RdrType = SAHPI_INVENTORY_RDR; rdr.Entity = rpt_entry->ResourceEntity; rdr.IsFru = SAHPI_TRUE; /* One Fru has only one inventory, so IdrId always is 0 */ rdr.RdrTypeUnion.InventoryRec.IdrId = 0; rdr.RdrTypeUnion.InventoryRec.Persistent = SAHPI_TRUE; rdr.RdrTypeUnion.InventoryRec.Oem = 0; oh_init_textbuffer(&rdr.IdString); oh_append_textbuffer(&rdr.IdString, "FRU Inventory data"); rid = oh_uid_lookup(&rdr.Entity); rv = oh_add_rdr(handler->rptcache, rid, &rdr, NULL, 0); if (rv == SA_OK) { rpt_entry->ResourceCapabilities |= SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_RDR; } else { free(res_info->fru); res_info->fru = NULL; err("couldn't add inventory. rv = %d", rv); } } extern void ohoi_delete_oem_area(gpointer arg, gpointer u_data); void ohoi_delete_rpt_fru(struct ohoi_resource_info *res_info) { struct ohoi_inventory_info *i_info; if (res_info->fru == NULL) { return; } i_info = res_info->fru; if (i_info->oem_areas) { g_slist_foreach(i_info->oem_areas, ohoi_delete_oem_area, NULL); g_slist_free(i_info->oem_areas); } free(i_info); res_info->fru = NULL; } /* Per IPMI spec., one FRU per entity */ void ohoi_inventory_event(enum ipmi_update_e op, ipmi_entity_t *entity, void *cb_data) { struct oh_handler_state *handler = cb_data; struct ohoi_resource_info *res_info; ipmi_entity_id_t entity_id; SaHpiRptEntryT *rpt_entry; entity_id = ipmi_entity_convert_to_id(entity); rpt_entry = ohoi_get_resource_by_entityid( handler->rptcache, &entity_id); if (!rpt_entry) { trace_ipmi_fru("NO RPT ENTRY", entity); dump_entity_id("FRU without RPT entry?!", entity_id); return; } res_info = oh_get_resource_data(handler->rptcache, rpt_entry->ResourceId); if (op == IPMI_ADDED) { trace_ipmi_fru("ADDED", entity); add_inventory_event(res_info, entity, handler, rpt_entry); } else if (op == IPMI_DELETED) { trace_ipmi_fru("DELETED", entity); ohoi_delete_rpt_fru(res_info); rpt_entry->ResourceCapabilities &= ~SAHPI_CAPABILITY_INVENTORY_DATA; if (oh_get_rdr_next(handler->rptcache, rpt_entry->ResourceId, SAHPI_FIRST_ENTRY) == NULL) { rpt_entry->ResourceCapabilities &= ~SAHPI_CAPABILITY_RDR; } } trace_ipmi("Set updated for res_info %p(%d). Inventory", res_info, rpt_entry->ResourceId); entity_rpt_set_updated(res_info, handler->data);; } openhpi-3.6.1/plugins/ipmi/ipmi.c0000644000175100017510000020713312575647300015713 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Louis Zhuang * Kevin Gao * Rusty Lynch * Tariq Shureih * Racing Guo * Andy Cress (watchdog) */ #include "ipmi.h" #include #include /* Watchdog definitions */ #define WATCHDOG_RESET 0x22 #define WATCHDOG_SET 0x24 #define WATCHDOG_GET 0x25 #define NETFN_APP 0x06 #define IPMI_WD_RESOLUTION 100 #define IPMI_WD_PRETIMER_RESOLUTION 1000 #define uchar unsigned char extern int __ipmi_debug_malloc; //extern int ipmi_close_mv(void); extern int ipmicmd_mv(struct ohoi_handler *ipmi_handler, uchar cmd, uchar netfn, uchar lun, uchar *pdata, uchar sdata, uchar *presp, int sresp, int *rlen); FILE *trace_msg_file = NULL; /** * This is data structure reference by rsel_id.ptr */ struct ohoi_sel_entry { ipmi_mc_t *mc; unsigned int recid; }; /* global reference count of instances */ static int ipmi_refcount = 0; static void ipmi_domain_fully_up(ipmi_domain_t *domain, void *user_data) { struct oh_handler_state *handler = user_data; struct ohoi_handler *ipmi_handler = handler->data; if (getenv("OHOI_TRACE_DOMAINUP")) { printf(" **** DOMAIN FULLY UP *****\n"); } g_static_rec_mutex_lock(&ipmi_handler->ohoih_lock); ipmi_handler->fully_up = 1; ipmi_handler->d_type = ipmi_domain_get_type(domain); if (!IS_ATCA(ipmi_handler->d_type)) { g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); return; } ohoi_atca_create_shelf_virtual_rdrs(handler); ohoi_atca_create_fru_rdrs(handler); g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); } /* ABI Interface functions */ /** * *ipmi_open: open (initiate) instance of the ipmi plug-in * @handler_config: pointer to openhpi config file * * This function initiates an instance of the ipmi plug-in * and opens a new connection to OpenIPMI. * Depending on what the config file defines, the connection * could be SMI (local) or LAN. * **/ static void *ipmi_open(GHashTable *handler_config, unsigned int hid, oh_evt_queue *eventq) { struct oh_handler_state *handler = NULL; struct ohoi_handler *ipmi_handler = NULL; char domain_name[24]; char *domain_tag = NULL; const char *name; const char *addr; const char *timeout; const char *scan_time; const char *real_write_fru; int rv = 0; char *trace_file_name; /* SaHpiTextBufferT buf = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, };*/ trace_ipmi("ipmi_open"); if (!handler_config) { err("No config file provided.....ooops!"); return(NULL); } else if (!hid) { err("Bad handler id passed."); return NULL; } else if (!eventq) { err("No event queue was passed."); return NULL; } name = g_hash_table_lookup(handler_config, "name"); addr = g_hash_table_lookup(handler_config, "addr"); timeout = g_hash_table_lookup(handler_config, "TimeOut"); scan_time = g_hash_table_lookup(handler_config, "OpenIPMIscanTime"); real_write_fru = g_hash_table_lookup(handler_config, "RealWriteFru"); domain_tag = g_hash_table_lookup(handler_config, "DomainTag"); handler = (struct oh_handler_state *)malloc(sizeof( struct oh_handler_state)); if (handler == NULL) { err("Out of memory"); return NULL; } memset(handler, 0, sizeof(struct oh_handler_state)); ipmi_handler = (struct ohoi_handler *)malloc(sizeof( struct ohoi_handler)); if (ipmi_handler == NULL) { err("Out of memory"); free(handler); return NULL; } memset(ipmi_handler, 0, sizeof(struct ohoi_handler)); handler->rptcache = (RPTable *)malloc(sizeof(RPTable)); if (handler->rptcache == NULL) { err("Out of memory"); free(handler); free(ipmi_handler); return NULL; } memset(handler->rptcache, 0, sizeof(RPTable)); handler->data = ipmi_handler; handler->config = handler_config; handler->hid = hid; handler->eventq = eventq; g_static_rec_mutex_init(&(ipmi_handler->ohoih_lock)); snprintf(domain_name, 24, "%s %s", name, addr); /* Discovery routine depends on these flags */ ipmi_handler->SDRs_read_done = 0; /* Domain (main) SDR flag, 1 when done */ ipmi_handler->SELs_read_done = 0; /* SEL flag, 1 when done */ ipmi_handler->mc_count = 0; /* MC level SDRs, 0 when done */ ipmi_handler->FRU_done = 0; /* MC level SDRs, 0 when done */ ipmi_handler->bus_scan_done = 0; ipmi_handler->fullup_timeout = 60; ipmi_handler->openipmi_scan_time = 0; ipmi_handler->real_write_fru = 0; /** This code has been commented due to the multi domain changes ** in the infrastructure. (Renier Morales 11/21/06) multi_domains = g_hash_table_lookup(handler_config, "MultipleDomains"); if (multi_domains != (char *)NULL) { if (domain_tag != NULL) { oh_append_textbuffer(&buf, domain_tag); } else { oh_append_textbuffer(&buf, "IPMI Domain"); } ipmi_handler->did = oh_request_new_domain_aitimeout(hid, &buf, SAHPI_DOMAIN_CAP_AUTOINSERT_READ_ONLY, SAHPI_TIMEOUT_BLOCK, 0, 0); } else ipmi_handler->did = oh_get_default_domain_id(); */ if (timeout != NULL) { ipmi_handler->fullup_timeout = (time_t)strtol(timeout, (char **)NULL, 10); } if (scan_time != NULL) { ipmi_handler->openipmi_scan_time = (time_t)strtol(scan_time, (char **)NULL, 10); } if (real_write_fru && !strcasecmp(real_write_fru, "yes")) { ipmi_handler->real_write_fru = 1; } else { ipmi_handler->real_write_fru = 0; } ipmi_handler->fully_up = 0; ipmi_handler->entity_root = g_hash_table_lookup(handler_config, "entity_root"); if ( !name || !addr || !ipmi_handler->entity_root) { err("Problem getting correct required parameters! \ check config file"); goto free_and_out; } else trace_ipmi("name: %s, addr: %s, entity_root: %s, timeout: %d", name, addr, ipmi_handler->entity_root, (int)ipmi_handler->fullup_timeout); /* OS handler allocated first. */ ipmi_handler->os_hnd = ipmi_posix_get_os_handler(); sel_alloc_selector(ipmi_handler->os_hnd, &ipmi_handler->ohoi_sel); ipmi_posix_os_handler_set_sel(ipmi_handler->os_hnd, ipmi_handler->ohoi_sel); trace_file_name = getenv("OHOI_TRACE_FILE"); if (trace_file_name != NULL) { trace_msg_file = fopen(trace_file_name, "w+"); if (trace_msg_file) { if (getenv("OHOI_TRACE_MSG")) { DEBUG_MSG_ENABLE(); DEBUG_MSG_ERR_ENABLE(); } //if (getenv("OHOI_DBG_MEM")) { // __ipmi_debug_malloc = 1; // DEBUG_MALLOC_ENABLE(); //} } } ipmi_init(ipmi_handler->os_hnd); if (strcmp(name, "general") == 0) { #if 0 char *tok; char *pptr; char *val; char **argv = NULL; int vals_len = 0; int argc = 0; int curr_arg = 0; ipmi_args_t *iargs[2]; int curr_iarg = 0; int i, j; tok = g_hash_table_lookup(handler_config, "addr"); if (tok == NULL) { err("no ""addr"" token in config file"); goto free_and_out; } val = strtok_r(tok, " \t\n", &pptr); while (val) { if (argc == vals_len) { vals_len += 10; char **nv = malloc(sizeof(char *) * vals_len); if (!nv) { err("Out of memory"); if (argv) free(argv); goto free_and_out; } if (argv) free(argv); argv = nv; } argv[argc] = val; argc++; val = strtok_r(NULL, " \t\n", &pptr); } if (!argv) { err("""addr"" token in config file was empty"); goto free_and_out; } while (curr_arg < argc) { if (curr_iarg == 2) break; rv = ipmi_parse_args2(&curr_arg, argc, argv, &iargs[curr_iarg]); if (rv) { err("Cannot parse connection arguments"); free(argv); goto free_and_out; } curr_iarg++; } free(argv); for (i=0; ios_hnd, ipmi_handler->ohoi_sel, &ipmi_handler->cons[i]); if (rv) { err("Cannot setup connection"); for (j=0; jnum_cons = curr_iarg; ipmi_handler->islan = strcmp(ipmi_handler->cons[0]->con_type, "smi") != 0; #else err("Unsupported IPMI connection method: %s",name); goto free_and_out; #endif } else if (strcmp(name, "smi") == 0) { int tmp = strtol(addr, (char **)NULL, 10); rv = ipmi_smi_setup_con(tmp,ipmi_handler->os_hnd, ipmi_handler->ohoi_sel, &ipmi_handler->cons[0]); if (rv) { err("Cannot setup connection"); goto free_and_out; } ipmi_handler->num_cons = 1; ipmi_handler->islan = 0; } else if (strcmp(name, "lan") == 0) { static struct in_addr lan_addr; static int lan_port; static int auth; static int priv; char *tok; char user[32], passwd[32]; /* Address */ tok = g_hash_table_lookup(handler_config, "addr"); if (tok == NULL) { err("no ""addr"" token in config file"); goto free_and_out; } trace_ipmi("IPMI LAN Address: %s", tok); struct hostent *ent = gethostbyname(tok); if (!ent) { err("Unable to resolve IPMI LAN address"); goto free_and_out; } memcpy(&lan_addr, ent->h_addr_list[0], ent->h_length); /* Port */ tok = g_hash_table_lookup(handler_config, "port"); if (tok == NULL) { err("no ""port"" token in config file. set 623"); lan_port = 623; } else { lan_port = atoi(tok); } trace_ipmi("IPMI LAN Port: %i", lan_port); /* Authentication type */ tok = g_hash_table_lookup(handler_config, "auth_type"); if (tok == NULL) { err("no ""auth_type"" token in config file. set ""none"""); auth = IPMI_AUTHTYPE_NONE; } else if (strcmp(tok, "none") == 0) { auth = IPMI_AUTHTYPE_NONE; } else if (strcmp(tok, "straight") == 0) { auth = IPMI_AUTHTYPE_STRAIGHT; } else if (strcmp(tok, "md2") == 0) { auth = IPMI_AUTHTYPE_MD2; } else if (strcmp(tok, "md5") == 0) { auth = IPMI_AUTHTYPE_MD5; } else { err("Invalid IPMI LAN authenication method: %s", tok); goto free_and_out; } trace_ipmi("IPMI LAN Authority: %s(%i)", tok, auth); /* Priviledge */ tok = g_hash_table_lookup(handler_config, "auth_level"); if (tok == NULL) { err("no ""auth_level"" token in config file." " set ""admin"""); priv = IPMI_PRIVILEGE_ADMIN; } else if (strcmp(tok, "callback") == 0) { priv = IPMI_PRIVILEGE_CALLBACK; } else if (strcmp(tok, "user") == 0) { priv = IPMI_PRIVILEGE_USER; } else if (strcmp(tok, "operator") == 0) { priv = IPMI_PRIVILEGE_OPERATOR; } else if (strcmp(tok, "admin") == 0) { priv = IPMI_PRIVILEGE_ADMIN; } else if (strcmp(tok, "oem") == 0) { priv = IPMI_PRIVILEGE_OEM; } else { err("Invalid IPMI LAN authenication method: %s", tok); goto free_and_out; } trace_ipmi("IPMI LAN Priviledge: %s(%i)", tok, priv); /* User Name */ tok = g_hash_table_lookup(handler_config, "username"); if (tok == NULL) { err("no ""username"" token in config file"); strncpy(user, "", 32); } else { strncpy(user, tok, 32); } trace_ipmi("IPMI LAN User: %s", user); /* Password */ tok = g_hash_table_lookup(handler_config, "password"); if (tok == NULL) { err("no ""password"" token in config file"); strncpy(passwd, "", 32); } else { strncpy(passwd, tok, 32); free(tok); } trace_ipmi("IPMI LAN Password: %s", passwd); rv = ipmi_lan_setup_con(&lan_addr, &lan_port, 1, auth, priv, user, strlen(user), passwd, strlen(passwd), ipmi_handler->os_hnd, ipmi_handler->ohoi_sel, &ipmi_handler->cons[0]); if (rv) { err("ipmi_lan_setup_con rv = %d", rv); goto free_and_out; } ipmi_handler->num_cons = 1; ipmi_handler->islan = 1; } else { err("Unsupported IPMI connection method: %s",name); goto free_and_out; } ipmi_handler->connected = -1; rv = ipmi_open_domain(domain_name, ipmi_handler->cons, ipmi_handler->num_cons, ipmi_connection_handler, handler, ipmi_domain_fully_up, handler, NULL, 0, &ipmi_handler->domain_id); if (rv) { fprintf(stderr, "ipmi_open_domain: %s\n", strerror(rv)); goto free_and_out; } ipmi_refcount++; return handler; free_and_out: g_free(handler->rptcache); g_free(handler); g_free(ipmi_handler); return NULL; } /** * ipmi_close: close this instance of ipmi plug-in * @hnd: pointer to handler * This functions closes connection with OpenIPMI and frees * all allocated events and sensors * **/ static void ipmi_close(void *hnd) { struct oh_handler_state *handler = (struct oh_handler_state *) hnd; struct ohoi_handler *ipmi_handler = (struct ohoi_handler *)handler->data; if (ipmi_handler->connected) { trace_ipmi("close connection"); ohoi_close_connection(ipmi_handler->domain_id, handler); } // ipmi_close_mv(); ipmi_refcount--; trace_ipmi("ipmi_refcount :%d", ipmi_refcount); if(ipmi_refcount == 0) { /* last connection and in case other instances didn't close correctly we clean up all connections */ trace_ipmi("Last connection :%d closing", ipmi_refcount); ipmi_shutdown(); } oh_flush_rpt(handler->rptcache); free(handler->rptcache); free(ipmi_handler); free(handler); } /** * ipmi_get_event: get events populated earlier by OpenIPMI * @hnd: pointer to handler * * Return value: 1 or 0 **/ static int ipmi_get_event(void *hnd) { struct oh_handler_state *handler = hnd; struct ohoi_handler *ipmi_handler = (struct ohoi_handler *)handler->data; int sel_select_done = 0; for (;;) { if (sel_select_done) { break; } while (1 == sel_select(ipmi_handler->ohoi_sel, NULL, 0, NULL, NULL)); sel_select_done = 1; }; return 0; } static void trace_ipmi_resources(SaHpiRptEntryT *rpt_entry, struct ohoi_resource_info *res_info) { oh_big_textbuffer bigbuf; if (!getenv("OHOI_TRACE_DISCOVERY") && !IHOI_TRACE_ALL) { return; } unsigned char str[32]; if (res_info->type & OHOI_RESOURCE_ENTITY) { ipmi_entity_id_t *e = &res_info->u.entity.entity_id; snprintf((char *)str, 32, "(%d,%d,%d,%d)", e->entity_id, e->entity_instance, e->channel, e->address); } else { str[0] = 0; } oh_decode_entitypath(&(rpt_entry->ResourceEntity), &bigbuf); fprintf(stderr, "%s %d %s presence: %d; updated:%d %s\n", rpt_entry->ResourceTag.Data, rpt_entry->ResourceId, str, res_info->presence, res_info->updated, bigbuf.Data ); } /** * ipmi_discover_resources: discover resources in system * @hnd: pointer to handler * * This function is both sepcific to OpenIPMI and conforms to openhpi * plug-in interface in waiting until OpenIPMI discovery is done, * then retieving entries from the rptcach of the oh_handler_state and * populating the eventq for the infrastructure to fetch. * * Return value: -1 for failure or 0 for success **/ int ipmi_discover_resources(void *hnd) { int rv = 1; struct oh_handler_state *handler = (struct oh_handler_state *)hnd; struct ohoi_handler *ipmi_handler = (struct ohoi_handler *)handler->data; struct oh_event *event; SaHpiRptEntryT *rpt_entry; SaHpiRdrT *rdr_entry; time_t tm0, tm; int was_connected = 0; struct ohoi_resource_info *res_info; dbg("ipmi discover_resources"); // Look for IPMI events until we get the ipmi_domain_fully_up callback time(&tm0); while (ipmi_handler->fully_up == 0) { if (!ipmi_handler->connected) { fprintf(stderr, "IPMI connection is down\n"); return SA_ERR_HPI_NO_RESPONSE; } if ((ipmi_handler->connected == 1) && !was_connected) { // set new time stamp. IPMI is alive was_connected = 1; time(&tm0); } rv = sel_select(ipmi_handler->ohoi_sel, NULL, 0 , NULL, NULL); if (rv < 0) { // error while fetching sel break; } time(&tm); if ((tm - tm0) > ipmi_handler->fullup_timeout) { err("timeout on waiting for discovery. " "SDR_read_done = %d;" "scan_done = %d; mc_count = %d", ipmi_handler->SDRs_read_done, ipmi_handler->bus_scan_done, ipmi_handler->mc_count); return SA_ERR_HPI_NO_RESPONSE; } } // while (! ipmi_handler->fully_up) // BJS: Why are we doing this some more? while(rv == 1) { rv = sel_select(ipmi_handler->ohoi_sel, NULL, 0 , NULL, NULL); } if (rv != 0) { err("failed to scan SEL. error = %d", rv); return SA_ERR_HPI_INTERNAL_ERROR; } g_static_rec_mutex_lock(&ipmi_handler->ohoih_lock); if (!ipmi_handler->updated) { g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); return 0; } ipmi_handler->updated = 0; // BJS: Loop over all rpt_entries (doing what?) rpt_entry = oh_get_resource_next(handler->rptcache, SAHPI_FIRST_ENTRY); while (rpt_entry) { res_info = oh_get_resource_data(handler->rptcache, rpt_entry->ResourceId); trace_ipmi_resources(rpt_entry, res_info); // If this rpt has already been processed, skip it if (res_info->updated == 0) { rpt_entry = oh_get_resource_next(handler->rptcache, rpt_entry->ResourceId); continue; } // If this rpt has been deleted, skip it if (res_info->deleted) { // We have already sent the event rpt_entry = oh_get_resource_next(handler->rptcache, rpt_entry->ResourceId); continue; } event = malloc(sizeof(*event)); if (event == NULL) { err("Out of memory"); g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); return SA_ERR_HPI_OUT_OF_MEMORY; } memset(event, 0, sizeof(*event)); if (res_info->presence == 1) { /* Add all RDRs of this RPTe */ rdr_entry = oh_get_rdr_next(handler->rptcache, rpt_entry->ResourceId, SAHPI_FIRST_ENTRY); while (rdr_entry) { event->rdrs = g_slist_append(event->rdrs, g_memdup(rdr_entry, sizeof(SaHpiRdrT))); rdr_entry = oh_get_rdr_next(handler->rptcache, rpt_entry->ResourceId, rdr_entry->RecordId); } } SaHpiEventUnionT *u = &event->event.EventDataUnion; if (rpt_entry->ResourceCapabilities & SAHPI_CAPABILITY_FRU) { event->event.EventType = SAHPI_ET_HOTSWAP; if (res_info->presence) { u->HotSwapEvent.HotSwapState = SAHPI_HS_STATE_ACTIVE; u->HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_ACTIVE; } else { u->HotSwapEvent.HotSwapState = SAHPI_HS_STATE_NOT_PRESENT; u->HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_ACTIVE; } } else { event->event.EventType = SAHPI_ET_RESOURCE; if (res_info->presence) { u->ResourceEvent.ResourceEventType = SAHPI_RESE_RESOURCE_ADDED; } else { u->ResourceEvent.ResourceEventType = SAHPI_RESE_RESOURCE_FAILURE; } } event->event.Source = rpt_entry->ResourceId; oh_gettimeofday(&event->event.Timestamp); event->event.Severity = rpt_entry->ResourceSeverity; event->resource = *rpt_entry; event->hid = handler->hid; oh_evt_queue_push(handler->eventq, event); // We're now done with this rpt res_info->updated = 0; rpt_entry = oh_get_resource_next(handler->rptcache, rpt_entry->ResourceId); } // while (rpt_entry) g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); return 0; } /** * ipmi_get_el_info: get ipmi SEL info * @hnd: pointer to handler * @id: resource id * @info: output -- pointer to info structure passed from infra. * * This function retrieves the SEL information from * the BMC or an SEL capable MC in an IPMI domain * * * Return value: 0 **/ static SaErrorT ipmi_get_el_info(void *hnd, SaHpiResourceIdT id, SaHpiEventLogInfoT *info) { unsigned int count; unsigned int size; SaErrorT rv; char del_support; struct oh_handler_state *handler = (struct oh_handler_state *)hnd; struct ohoi_handler *ipmi_handler = (struct ohoi_handler *)handler->data; const struct ohoi_resource_info *ohoi_res_info; while (0 == ipmi_handler->fully_up) { rv = sel_select(ipmi_handler->ohoi_sel, NULL, 0 , NULL, NULL); if (rv<0) { err("error on waiting for SEL"); return SA_ERR_HPI_INTERNAL_ERROR; } } ohoi_res_info = oh_get_resource_data(handler->rptcache, id); if (!(ohoi_res_info->type & OHOI_RESOURCE_MC)) { err("BUG: try to get sel in unsupported resource"); return SA_ERR_HPI_INVALID_CMD; } ohoi_get_sel_count(ohoi_res_info->u.entity.mc_id, (int *)(&count)); info->Entries = count; ohoi_get_sel_size(ohoi_res_info->u.entity.mc_id, (int *)(&size)); info->Size = size / 16; ohoi_get_sel_updatetime(ohoi_res_info->u.entity.mc_id, &info->UpdateTimestamp); ohoi_get_sel_time(ohoi_res_info->u.entity.mc_id, &info->CurrentTime, ipmi_handler); ohoi_get_sel_overflow(ohoi_res_info->u.entity.mc_id, (char *)(&info->OverflowFlag)); info->OverflowAction = SAHPI_EL_OVERFLOW_DROP; ohoi_get_sel_support_del(ohoi_res_info->u.entity.mc_id, &del_support); rv = ohoi_get_sel_state(ipmi_handler, ohoi_res_info->u.entity.mc_id, /* compile error */ // (int *)&info->Enabled); (int *)(void *)&info->Enabled); if (rv != SA_OK) { err("couldn't get sel state rv = %d", rv); return rv; } info->UserEventMaxSize = 0; return SA_OK; } /** * ipmi_set_el_time: set ipmi event log time * @hnd: pointer to handler * @id: resource id of resource holding sel * @time: pointer to time structure * * This functions set the clocl in the event log. * * * Return value: 0 for success, -1 for error **/ static int ipmi_set_el_time(void *hnd, SaHpiResourceIdT id, SaHpiTimeT time) { struct oh_handler_state *handler = (struct oh_handler_state *)hnd; struct ohoi_handler *ipmi_handler = (struct ohoi_handler *)handler->data; struct ohoi_resource_info *ohoi_res_info; struct timeval tv; dbg("sel_set_time called"); ohoi_res_info = oh_get_resource_data(handler->rptcache, id); if (!(ohoi_res_info->type & OHOI_RESOURCE_MC)) { err("BUG: try to get sel in unsupported resource"); return SA_ERR_HPI_INVALID_CMD; } tv.tv_sec = time/1000000000; tv.tv_usec= (time%1000000000)/1000; ohoi_set_sel_time(ohoi_res_info->u.entity.mc_id, &tv, ipmi_handler); return 0; } /** * ipmi_set_sel_state: set ipmi sel state (enabled) * @hnd: pointer to handler * @id: resource id of resource with SEL capability * @enable: int value for enable * * * * Return value: SA_OK for success, SA_ERR_HPI_.... for error **/ static SaErrorT ipmi_set_sel_state(void *hnd, SaHpiResourceIdT id, SaHpiBoolT enable) { struct ohoi_resource_info *ohoi_res_info; struct oh_handler_state *handler = (struct oh_handler_state *)hnd; struct ohoi_handler *ipmi_handler = (struct ohoi_handler *)handler->data; ohoi_res_info = oh_get_resource_data(handler->rptcache, id); if (!(ohoi_res_info->type & OHOI_RESOURCE_MC)) { err("BUG: try to set sel state in unsupported resource"); return SA_ERR_HPI_CAPABILITY; } return ohoi_set_sel_state(ipmi_handler, ohoi_res_info->u.entity.mc_id, enable); } typedef struct { ipmi_sensor_id_t *sid; ipmi_event_t *event; } get_event_sid_t; static void _get_event_sid(ipmi_mc_t *mc, void *cb_data) { get_event_sid_t *info = cb_data; *info->sid = ipmi_event_get_generating_sensor_id( ipmi_mc_get_domain(mc), mc, info->event); } /** * ipmi_get_el_entry: get IPMI SEL entry * @hnd: pointer to handler instance * @id: resourde id with SEL capability * @current: SaHpiEntryIdT of entry to retrieve * @prev: previous entry in log relative to current * @next: next entry in log * @entry: [out]SaHpiEventLogEntryT entry requested * * This function will get event(s) from SEL capable IPMI device * one at a time by the record id starting with HPI's * SAHPI_OLDEST_ENTRY or SAHPI_NEWEST_ENTRY. * * Return value: SA_OK for success -1 for failure **/ static int ipmi_get_el_entry(void *hnd, SaHpiResourceIdT id, SaHpiEventLogEntryIdT current, SaHpiEventLogEntryIdT *prev, SaHpiEventLogEntryIdT *next, SaHpiEventLogEntryT *entry, SaHpiRdrT *rdr, SaHpiRptEntryT *rptentry) { struct ohoi_resource_info *ohoi_res_info; struct oh_handler_state *handler = (struct oh_handler_state *)hnd; ipmi_event_t *event; SaHpiRptEntryT *myrpt; SaHpiRdrT *myrdr; SaHpiEventTypeT event_type; struct oh_event *e; char Data[IPMI_EVENT_DATA_MAX_LEN]; int data_len; ipmi_sensor_id_t sid; ipmi_entity_id_t et; get_event_sid_t info; ohoi_res_info = oh_get_resource_data(handler->rptcache, id); if (!(ohoi_res_info->type & OHOI_RESOURCE_MC)) { err("BUG: try to get sel in unsupported resource"); return SA_ERR_HPI_INVALID_CMD; } if (rdr) rdr->RdrType = SAHPI_NO_RECORD; if (rptentry) { rptentry->ResourceCapabilities = 0; rptentry->ResourceId = SAHPI_UNSPECIFIED_RESOURCE_ID; } switch (current) { case SAHPI_OLDEST_ENTRY: ohoi_get_sel_first_entry( ohoi_res_info->u.entity.mc_id, &event); if (!event) return SA_ERR_HPI_NOT_PRESENT; ohoi_get_sel_next_recid(ohoi_res_info->u.entity.mc_id, event, next); *prev = SAHPI_NO_MORE_ENTRIES; break; case SAHPI_NEWEST_ENTRY: ohoi_get_sel_last_entry(ohoi_res_info->u.entity.mc_id, &event); if (!event) return SA_ERR_HPI_NOT_PRESENT; *next = SAHPI_NO_MORE_ENTRIES; ohoi_get_sel_prev_recid(ohoi_res_info->u.entity.mc_id, event, prev); break; case SAHPI_NO_MORE_ENTRIES: err("SEL is empty!"); if (!event) return SA_ERR_HPI_INVALID_PARAMS; default: /* get the entry requested by id */ ohoi_get_sel_by_recid(ohoi_res_info->u.entity.mc_id, current, &event); if (!event) return SA_ERR_HPI_NOT_PRESENT; ohoi_get_sel_next_recid(ohoi_res_info->u.entity.mc_id, event, next); ohoi_get_sel_prev_recid(ohoi_res_info->u.entity.mc_id, event, prev); break; } entry->EntryId = ipmi_event_get_record_id(event); event_type = ipmi_event_get_type(event); data_len = ipmi_event_get_data(event, (unsigned char *)Data, 0, IPMI_EVENT_DATA_MAX_LEN); if (event_type == 0x02) { // sensor event if (rptentry) { rptentry->ResourceCapabilities = 0; } if (rdr) { rdr->RdrType = SAHPI_NO_RECORD; } info.sid = &sid; info.event = event; ipmi_mc_pointer_cb(ohoi_res_info->u.entity.mc_id, _get_event_sid, &info); trace_ipmi_sensors("LOOK FOR", sid); if (ohoi_sensor_ipmi_event_to_hpi_event(handler->data, sid, event, &e, &et)) { //we will handle sensor event as user event goto no_sensor_event; } myrpt = ohoi_get_resource_by_entityid(handler->rptcache, &et); if (myrpt == NULL) { goto no_rpt; } myrdr = ohoi_get_rdr_by_data(handler->rptcache, myrpt->ResourceId, SAHPI_SENSOR_RDR, &sid); e->event.Source = myrpt->ResourceId; if (rptentry) { memcpy(rptentry, myrpt, sizeof (*myrpt)); } if (myrdr) { e->event.EventDataUnion.SensorEvent.SensorNum = myrdr->RdrTypeUnion.SensorRec.Num; if (rdr) { memcpy(rdr, myrdr, sizeof (*myrdr)); } } no_rpt: memcpy(&entry->Event, &e->event, sizeof (SaHpiEventT)); oh_event_free(e, FALSE); entry->Event.EventType = SAHPI_ET_SENSOR; entry->Timestamp = ipmi_event_get_timestamp(event); return SA_OK; } no_sensor_event: entry->Event.Source = SAHPI_UNSPECIFIED_RESOURCE_ID; if (data_len != 13) { err("Strange data len in ipmi event: %d instead of 13\n", data_len); return SA_ERR_HPI_ERROR; } if ((event_type >= 0xC0) && (event_type <= 0xDF)) { // OEM timestamp event type entry->Timestamp = ipmi_event_get_timestamp(event); entry->Event.EventType = SAHPI_ET_OEM; entry->Event.Timestamp = entry->Timestamp; entry->Event.EventDataUnion.OemEvent.MId = Data[4] | (Data[5] << 8) | (Data[6] << 16); entry->Event.Severity = SAHPI_DEBUG; // FIX ME entry->Event.EventDataUnion.OemEvent. OemEventData.DataLength = 6; memcpy(entry->Event.EventDataUnion.OemEvent. OemEventData.Data, Data + 7, data_len); entry->Event.EventDataUnion.OemEvent.OemEventData. DataType = SAHPI_TL_TYPE_BINARY; entry->Event.EventDataUnion.OemEvent.OemEventData. Language = SAHPI_LANG_UNDEF; return SA_OK; }; entry->Event.Source = SAHPI_UNSPECIFIED_RESOURCE_ID; entry->Event.EventType = SAHPI_ET_USER; oh_gettimeofday(&entry->Event.Timestamp); // entry->Event.Timestamp = SAHPI_TIME_UNSPECIFIED; entry->Event.Severity = SAHPI_DEBUG; // FIX ME entry->Event.EventDataUnion.UserEvent.UserEventData.DataType = SAHPI_TL_TYPE_BINARY; entry->Event.EventDataUnion.UserEvent.UserEventData.Language = SAHPI_LANG_UNDEF; entry->Event.EventDataUnion.UserEvent.UserEventData.DataLength = ipmi_event_get_data_len(event); memcpy(entry->Event.EventDataUnion.UserEvent.UserEventData.Data, Data, data_len); return SA_OK; } static SaErrorT ipmi_clear_el(void *hnd, SaHpiResourceIdT id) { struct ohoi_resource_info *ohoi_res_info; struct oh_handler_state *handler = (struct oh_handler_state *)hnd; struct ohoi_handler *ipmi_handler = (struct ohoi_handler *)handler->data; int rv; int i; ohoi_res_info = oh_get_resource_data(handler->rptcache, id); if (!(ohoi_res_info->type & OHOI_RESOURCE_MC)) { err("BUG: try to get sel in unsupported resource"); return SA_ERR_HPI_INVALID_CMD; } ipmi_handler->sel_clear_done = 0; rv = ohoi_clear_sel(ohoi_res_info->u.entity.mc_id, ipmi_handler); if (rv != SA_OK) { err("Error in attempting to clear sel"); return rv; } for (i =0; i < 6; i++) { /* long wait - 1 min */ rv = ohoi_loop(&ipmi_handler->sel_clear_done, ipmi_handler); if (rv == SA_OK) { break; } } return rv; } #define SENSOR_CHECK(handler, sensor_info, id, num) \ do { \ SaErrorT rv; \ SaHpiRdrT *rdr; \ \ rdr = oh_get_rdr_by_type(handler->rptcache, id, \ SAHPI_SENSOR_RDR, num); \ if (!rdr) { \ err("no rdr"); \ return SA_ERR_HPI_NOT_PRESENT; \ } \ \ rv = ohoi_get_rdr_data(handler, id, SAHPI_SENSOR_RDR, num, \ (void *)&sensor_info); \ if (rv != SA_OK) \ return rv; \ \ if (!sensor_info) \ return SA_ERR_HPI_NOT_PRESENT; \ \ } while (0) #define CHECK_SENSOR_SEN_ENABLE(sensor_info) \ do { \ if (sensor_info->sen_enabled == SAHPI_FALSE) \ return SA_ERR_HPI_INVALID_REQUEST; \ } while (0) static int ipmi_get_sensor_event_enable(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiBoolT *enable) { SaErrorT rv; struct oh_handler_state *handler = (struct oh_handler_state *)hnd; struct ohoi_sensor_info *sensor_info; SaHpiBoolT t_enable; SaHpiEventStateT t_assert; SaHpiEventStateT t_deassert; SENSOR_CHECK(handler, sensor_info, id, num); if (!enable) return SA_ERR_HPI_INVALID_PARAMS; rv = ohoi_get_sensor_event_enable(hnd, sensor_info, &t_enable, &t_assert, &t_deassert); if (rv) return rv; if (sensor_info->sen_enabled) { sensor_info->enable = t_enable; sensor_info->assert = t_assert; sensor_info->deassert = t_deassert; } *enable = t_enable; return SA_OK; } static int ipmi_set_sensor_event_enable(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, const SaHpiBoolT enable) { SaErrorT rv; struct oh_handler_state *handler = (struct oh_handler_state *)hnd; struct ohoi_sensor_info *sensor_info; struct oh_event *e; SaHpiRdrT *rdr = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiSensorEnableChangeEventT *sen_evt; SENSOR_CHECK(handler, sensor_info, id, num); rv = ohoi_set_sensor_event_enable(hnd, sensor_info, enable, sensor_info->assert, sensor_info->deassert, sensor_info->support_assert, sensor_info->support_deassert); if (rv) return rv; if (sensor_info->enable == enable) return(SA_OK); sensor_info->enable = enable; // sensor_info->saved_enable = enable; e = malloc(sizeof(*e)); if (!e) { err("Out of space"); return IPMI_EVENT_NOT_HANDLED; } memset(e, 0, sizeof(*e)); rpte = oh_get_resource_by_id(handler->rptcache, id); if (rpte) { e->resource = *rpte; } rdr = oh_get_rdr_by_type(handler->rptcache, id, SAHPI_SENSOR_RDR, num); if (!rdr) { err("no rdr"); return SA_ERR_HPI_NOT_PRESENT; } e->event.Source = id; e->event.EventType = SAHPI_ET_SENSOR_ENABLE_CHANGE; e->event.Severity = SAHPI_INFORMATIONAL; oh_gettimeofday(&e->event.Timestamp); e->rdrs = g_slist_append(e->rdrs, g_memdup(rdr, sizeof(SaHpiRdrT))); // e->u.hpi_event.event.Timestamp = SAHPI_TIME_UNSPECIFIED; sen_evt = &(e->event.EventDataUnion.SensorEnableChangeEvent); sen_evt->SensorNum = num; sen_evt->SensorType = rdr->RdrTypeUnion.SensorRec.Type; sen_evt->EventCategory = rdr->RdrTypeUnion.SensorRec.Category; sen_evt->SensorEnable = sensor_info->enable; sen_evt->SensorEventEnable = sensor_info->enable; sen_evt->AssertEventMask = sensor_info->assert; sen_evt->DeassertEventMask = sensor_info->deassert; e->hid = handler->hid; oh_evt_queue_push(handler->eventq, e); return SA_OK; } /** * ipmi_get_sensor_reading: get sensor reading, type, category and other info. * @hnd: pointer to handler instance * @id: ResourceId -- parent of this sensor * @num: sensor number * @data: struct returned with data about the sensor. * * * * Return value: 0 for success or negative for error **/ static int ipmi_get_sensor_reading(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiSensorReadingT *reading, SaHpiEventStateT *ev_state) { SaErrorT rv; struct oh_handler_state *handler = (struct oh_handler_state *)hnd; struct ohoi_sensor_info *sensor_info; SaHpiSensorReadingT tmp_reading; SaHpiEventStateT tmp_state; SENSOR_CHECK(handler, sensor_info, id, num); CHECK_SENSOR_SEN_ENABLE(sensor_info); rv = ohoi_get_sensor_reading(hnd, sensor_info, &tmp_reading, &tmp_state); if (rv) return rv; if (reading) *reading = tmp_reading; if (ev_state) *ev_state = tmp_state; return SA_OK; } /** * ipmi_get_sensor_thresholds: for hysteresis sensors, get thresholds. * @hnd: handler instance * @id: ResourceId parent of this sensor * @num: sensor number * @thres: struct returned with data about sensor thresholds. * * * * Return value: 0 for success or negative for error **/ static int ipmi_get_sensor_thresholds(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiSensorThresholdsT *thres) { struct oh_handler_state *handler = (struct oh_handler_state *)hnd; struct ohoi_sensor_info *sensor_info; SENSOR_CHECK(handler, sensor_info, id, num); // CHECK_SENSOR_ENABLE(sensor_info); if (!thres) return SA_ERR_HPI_INVALID_PARAMS; memset(thres, 0, sizeof(*thres)); return ohoi_get_sensor_thresholds(hnd, sensor_info, thres); } static int ipmi_set_sensor_thresholds(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, const SaHpiSensorThresholdsT *thres) { struct oh_handler_state *handler = (struct oh_handler_state *)hnd; struct ohoi_sensor_info *sensor_info; SENSOR_CHECK(handler, sensor_info, id, num); // CHECK_SENSOR_ENABLE(sensor_info); if (!thres) return SA_ERR_HPI_INVALID_PARAMS; return ohoi_set_sensor_thresholds(hnd, sensor_info, thres); } static int ipmi_get_sensor_enable(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiBoolT *enable) { struct oh_handler_state *handler = (struct oh_handler_state *)hnd; struct ohoi_sensor_info *sensor_info; SENSOR_CHECK(handler, sensor_info, id, num); if (!enable) return SA_ERR_HPI_INVALID_PARAMS; *enable = sensor_info->sen_enabled; return SA_OK; } static int ipmi_set_sensor_enable(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiBoolT enable) { struct oh_handler_state *handler = (struct oh_handler_state *)hnd; struct ohoi_sensor_info *sensor_info; SaErrorT rv; SENSOR_CHECK(handler, sensor_info, id, num); if (sensor_info->sen_enabled == enable) { return SA_OK; } if (enable == SAHPI_FALSE) { // sensor_info->saved_enable = sensor_info->enable; if (sensor_info->enable == SAHPI_FALSE) { sensor_info->sen_enabled = SAHPI_FALSE; return SA_OK; } // Disable events rv = ohoi_set_sensor_event_enable(hnd, sensor_info, SAHPI_FALSE, sensor_info->assert, sensor_info->deassert, sensor_info->support_assert, sensor_info->support_deassert); if (rv == SA_OK) { sensor_info->sen_enabled = SAHPI_FALSE; }; return rv; } // enable == SAHPI_TRUE if (sensor_info->enable == SAHPI_FALSE) { sensor_info->sen_enabled = SAHPI_TRUE; return SA_OK; } // Restore events rv = ohoi_set_sensor_event_enable(hnd, sensor_info, SAHPI_TRUE, sensor_info->assert, sensor_info->deassert, sensor_info->support_assert, sensor_info->support_deassert); if (rv != SA_OK) { err("ipmi_set_sensor_event_enable = %d", rv); sensor_info->enable = SAHPI_FALSE; } sensor_info->sen_enabled = SAHPI_TRUE; return rv; } static int ipmi_get_sensor_event_masks(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiEventStateT *assert, SaHpiEventStateT *deassert) { SaErrorT rv; struct oh_handler_state *handler = (struct oh_handler_state *)hnd; struct ohoi_sensor_info *sensor_info; SaHpiBoolT t_enable; SaHpiEventStateT t_assert; SaHpiEventStateT t_deassert; SENSOR_CHECK(handler, sensor_info, id, num); if (!assert || !deassert) return SA_ERR_HPI_INVALID_PARAMS; rv = ohoi_get_sensor_event_enable(hnd, sensor_info, &t_enable, &t_assert, &t_deassert); if (rv) return rv; if (sensor_info->sen_enabled) { sensor_info->enable = t_enable; sensor_info->assert = t_assert; sensor_info->deassert = t_deassert; } *assert = t_assert; *deassert = t_deassert; return SA_OK; } static int ipmi_set_sensor_event_masks(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiSensorEventMaskActionT act, SaHpiEventStateT assert, SaHpiEventStateT deassert) { SaErrorT rv; struct oh_handler_state *handler = (struct oh_handler_state *)hnd; struct ohoi_sensor_info *sensor_info; SaHpiEventStateT t_assert; SaHpiEventStateT t_deassert; struct oh_event *e; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaHpiSensorEnableChangeEventT *sen_evt; SENSOR_CHECK(handler, sensor_info, id, num); if (act == SAHPI_SENS_ADD_EVENTS_TO_MASKS) { t_assert = assert | sensor_info->assert; t_deassert = deassert | sensor_info->deassert; } else if (act == SAHPI_SENS_REMOVE_EVENTS_FROM_MASKS) { t_assert = (assert ^ 0xffff) & sensor_info->assert; t_deassert = (deassert ^ 0xffff) & sensor_info->deassert; } else return SA_ERR_HPI_INVALID_PARAMS; rv = ohoi_set_sensor_event_enable(hnd, sensor_info, sensor_info->enable, t_assert, t_deassert, sensor_info->support_assert, sensor_info->support_deassert); if (rv) return rv; if ((sensor_info->assert == t_assert) && (sensor_info->deassert == t_deassert)) return (SA_OK); sensor_info->assert = t_assert; sensor_info->deassert = t_deassert; e = malloc(sizeof(*e)); if (!e) { err("Out of space"); return IPMI_EVENT_NOT_HANDLED; } memset(e, 0, sizeof(*e)); rpte = oh_get_resource_by_id(handler->rptcache, id); if (rpte) { e->resource = *rpte; } rdr = oh_get_rdr_by_type(handler->rptcache, id, SAHPI_SENSOR_RDR, num); if (!rdr) { err("no rdr"); return SA_ERR_HPI_NOT_PRESENT; } e->event.Source = id; e->event.EventType = SAHPI_ET_SENSOR_ENABLE_CHANGE; e->event.Severity = SAHPI_INFORMATIONAL; oh_gettimeofday(&e->event.Timestamp); e->rdrs = g_slist_append(e->rdrs, g_memdup(rdr, sizeof(SaHpiRdrT))); // e->u.hpi_event.event.Timestamp = SAHPI_TIME_UNSPECIFIED; sen_evt = &(e->event.EventDataUnion.SensorEnableChangeEvent); sen_evt->SensorNum = num; sen_evt->SensorType = rdr->RdrTypeUnion.SensorRec.Type; sen_evt->EventCategory = rdr->RdrTypeUnion.SensorRec.Category; sen_evt->SensorEnable = sensor_info->enable; sen_evt->SensorEventEnable = sensor_info->enable; sen_evt->AssertEventMask = sensor_info->assert; sen_evt->DeassertEventMask = sensor_info->deassert; e->hid = handler->hid; oh_evt_queue_push(handler->eventq, e); return SA_OK; } /* * WATCHDOG FUNCTIONS */ static int ipmi_get_watchdog_info(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num, SaHpiWatchdogT *watchdog) { struct oh_handler_state *handler = (struct oh_handler_state *)hnd; struct ohoi_handler *ipmi_handler =(struct ohoi_handler *)handler->data; unsigned char reqdata[16]; unsigned char response[16]; int rlen; int rv; /* * OpenIPMI library doesn't have watchdog calls, so talk * directly to the driver (via ipmi_drv.c). * Currently support only default watchdog num, and only local. */ if (ipmi_handler->islan) return(SA_ERR_HPI_UNSUPPORTED_API); if (num != SAHPI_DEFAULT_WATCHDOG_NUM) { err("num = %d", num); return SA_ERR_HPI_INVALID_PARAMS; } rlen = sizeof(response); memset(reqdata, 0, 16); memset(response, 0, 16); rv = ipmicmd_mv(ipmi_handler, WATCHDOG_GET, NETFN_APP, 0, reqdata, 0, response, rlen, &rlen); if (rv != 0) return(rv); dbg("wdog_get: %02x %02x %02x %02x %02x %02x %02x %02x %02x\n", response[0], response[1], response[2], response[3], response[4], response[5], response[6], response[7], response[8]); rv = response[0]; /*completion code*/ if (rv != 0) { rv |= IPMI_IPMI_ERR_TOP; OHOI_MAP_ERROR(rv, rv); return(rv); } /* Translate IPMI response to HPI format */ memset(watchdog, 0, sizeof(SaHpiWatchdogT)); if (response[1] & 0x80) watchdog->Log = SAHPI_FALSE; else watchdog->Log = SAHPI_TRUE; if (response[1] & 0x40) watchdog->Running = SAHPI_TRUE; else watchdog->Running = SAHPI_FALSE; switch(response[1] & 0x07) { case 0x01: watchdog->TimerUse = SAHPI_WTU_BIOS_FRB2; break; case 0x02: watchdog->TimerUse = SAHPI_WTU_BIOS_POST; break; case 0x03: watchdog->TimerUse = SAHPI_WTU_OS_LOAD; break; case 0x04: watchdog->TimerUse = SAHPI_WTU_SMS_OS; break; case 0x05: watchdog->TimerUse = SAHPI_WTU_OEM; break; default: watchdog->TimerUse = SAHPI_WTU_UNSPECIFIED; break; } switch (response[2] & 0x70) { case 0x00: watchdog->PretimerInterrupt = SAHPI_WPI_NONE; break; case 0x10: watchdog->PretimerInterrupt = SAHPI_WPI_SMI; break; case 0x20: watchdog->PretimerInterrupt = SAHPI_WPI_NMI; break; case 0x30: watchdog->PretimerInterrupt = SAHPI_WPI_MESSAGE_INTERRUPT; break; default : watchdog->PretimerInterrupt = SAHPI_WPI_NONE; // watchdog->PretimerInterrupt = SAHPI_WPI_OEM; break; } switch (response[2] & 0x07) { case 0x00: watchdog->TimerAction = SAHPI_WA_NO_ACTION; break; case 0x01: watchdog->TimerAction = SAHPI_WA_RESET; break; case 0x02: watchdog->TimerAction = SAHPI_WA_POWER_DOWN; break; case 0x03: watchdog->TimerAction = SAHPI_WA_POWER_CYCLE; break; default: watchdog->TimerAction = SAHPI_WA_NO_ACTION; break; } watchdog->PreTimeoutInterval = response[3] * IPMI_WD_PRETIMER_RESOLUTION; watchdog->TimerUseExpFlags = 0; if (response[4] & 0x02) watchdog->TimerUseExpFlags |= SAHPI_WATCHDOG_EXP_BIOS_FRB2; if (response[4] & 0x04) watchdog->TimerUseExpFlags |= SAHPI_WATCHDOG_EXP_BIOS_POST; if (response[4] & 0x08) watchdog->TimerUseExpFlags |= SAHPI_WATCHDOG_EXP_OS_LOAD; if (response[4] & 0x10) watchdog->TimerUseExpFlags |= SAHPI_WATCHDOG_EXP_SMS_OS; if (response[4] & 0x20) watchdog->TimerUseExpFlags |= SAHPI_WATCHDOG_EXP_OEM; watchdog->InitialCount = (response[5] + (response[6] * 256)) * IPMI_WD_RESOLUTION; watchdog->PresentCount = (response[7] + (response[8] * 256)) * IPMI_WD_RESOLUTION; return SA_OK; } static int ipmi_set_watchdog_info(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num, SaHpiWatchdogT *watchdog) { struct oh_handler_state *handler = (struct oh_handler_state *)hnd; struct ohoi_handler *ipmi_handler =(struct ohoi_handler *)handler->data; unsigned char reqdata[16]; unsigned char response[16]; int rlen; int tv; int rv; if (ipmi_handler->islan) return(SA_ERR_HPI_UNSUPPORTED_API); if (num != SAHPI_DEFAULT_WATCHDOG_NUM) { err("watchdog num = %d", num); return SA_ERR_HPI_INVALID_PARAMS; } /* translate HPI values to IPMI */ switch (watchdog->TimerUse) { case SAHPI_WTU_BIOS_FRB2: reqdata[0] = 0x01; break; case SAHPI_WTU_BIOS_POST: reqdata[0] = 0x02; break; case SAHPI_WTU_OS_LOAD: reqdata[0] = 0x03; break; case SAHPI_WTU_SMS_OS: reqdata[0] = 0x04; break; case SAHPI_WTU_OEM: reqdata[0] = 0x05; break; case SAHPI_WTU_NONE: default: reqdata[0] = 0x00; } if (watchdog->Log == SAHPI_FALSE) reqdata[0] |= 0x80;; if (watchdog->Running == SAHPI_TRUE) reqdata[0] |= 0x40;; switch (watchdog->TimerAction) { case SAHPI_WA_RESET: reqdata[1] = 0x01; break; case SAHPI_WA_POWER_DOWN: reqdata[1] = 0x02; break; case SAHPI_WA_POWER_CYCLE: reqdata[1] = 0x03; break; case SAHPI_WA_NO_ACTION: default: reqdata[1] = 0x00; } switch (watchdog->PretimerInterrupt) { case SAHPI_WPI_SMI: reqdata[1] |= 0x10; break; case SAHPI_WPI_NMI: reqdata[1] |= 0x20; break; case SAHPI_WPI_MESSAGE_INTERRUPT: reqdata[1] |= 0x30; break; case SAHPI_WPI_OEM: /* Undefined, so treat it like SAHPI_WPI_NONE */ case SAHPI_WPI_NONE: default: break; } tv = watchdog->PreTimeoutInterval / IPMI_WD_PRETIMER_RESOLUTION; reqdata[2] = tv & 0x00ff; reqdata[3] = 0; if (watchdog->TimerUseExpFlags & SAHPI_WATCHDOG_EXP_BIOS_FRB2) reqdata[3] |= 0x02; if (watchdog->TimerUseExpFlags & SAHPI_WATCHDOG_EXP_BIOS_POST) reqdata[3] |= 0x04; if (watchdog->TimerUseExpFlags & SAHPI_WATCHDOG_EXP_OS_LOAD) reqdata[3] |= 0x08; if (watchdog->TimerUseExpFlags & SAHPI_WATCHDOG_EXP_SMS_OS) reqdata[3] |= 0x10; if (watchdog->TimerUseExpFlags & SAHPI_WATCHDOG_EXP_OEM) reqdata[3] |= 0x20; if ((watchdog->InitialCount < IPMI_WD_RESOLUTION) && (watchdog->InitialCount != 0)) tv = IPMI_WD_RESOLUTION; else tv = watchdog->InitialCount / IPMI_WD_RESOLUTION; reqdata[4] = tv & 0x00ff; // tv % 256; reqdata[5] = tv / 256; // (tv & 0xff00) >> 8; dbg("wdog_set: %02x %02x %02x %02x %02x %02x\n", reqdata[0], reqdata[1], reqdata[2], reqdata[3], reqdata[4], reqdata[5]); rlen = sizeof(response); rv = ipmicmd_mv(ipmi_handler, WATCHDOG_SET, NETFN_APP, 0, reqdata, 6, response, rlen, &rlen); if (rv != 0) return(rv); rv = response[0]; /*completion code*/ if (rv != 0) { err("wdog_set response: %02x", rv); OHOI_MAP_ERROR(rv, rv); } else { rv = SA_OK; } return rv; } static int ipmi_reset_watchdog(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num) { struct oh_handler_state *handler = (struct oh_handler_state *)hnd; struct ohoi_handler *ipmi_handler =(struct ohoi_handler *)handler->data; unsigned char response[16]; int rlen; int rv; if (ipmi_handler->islan) return(SA_ERR_HPI_UNSUPPORTED_API); if (num != SAHPI_DEFAULT_WATCHDOG_NUM) { err("watchdog num = %d", num); return SA_ERR_HPI_INVALID_PARAMS; } rlen = sizeof(response); rv = ipmicmd_mv(ipmi_handler, WATCHDOG_RESET, NETFN_APP, 0, NULL, 0, response, rlen, &rlen); if (rv != 0) return(rv); rv = response[0]; /*completion code*/ if (rv != 0) { err("wdog_set response: %02x", rv); OHOI_MAP_ERROR(rv, rv); } else { rv = SA_OK; } return rv; } static void ohoi_set_resource_tag(ipmi_entity_t *entity, void *cb_data) { // SaHpiTextBufferT *tag = cb_data; // ipmi_entity_set_entity_id_string(entity, (char *)tag); err("New resource Tag set"); } static SaErrorT ipmi_set_res_tag (void *hnd, SaHpiResourceIdT id, SaHpiTextBufferT *tag) { struct oh_handler_state *handler = (struct oh_handler_state *)hnd; SaHpiRptEntryT *rpt_entry; struct ohoi_resource_info *res_info; int rv; res_info = oh_get_resource_data(handler->rptcache, id); if (!res_info) err("No private resource info for resource %d", id); rpt_entry = oh_get_resource_by_id(handler->rptcache, id); if (!rpt_entry) { err("No rpt for resource %d?", id); return SA_ERR_HPI_NOT_PRESENT; } /* do it in openIPMI's memory first for subsequest updates */ /* can only be an Entity in the ohoi_resource_info struct */ if (res_info->type & OHOI_RESOURCE_ENTITY) { dbg("Setting new Tag: %s for resource: %d", (char *) tag->Data, id); rv = ipmi_entity_pointer_cb(res_info->u.entity.entity_id, ohoi_set_resource_tag, tag->Data); if (rv) err("Error retrieving entity pointer for resource %d", rpt_entry->ResourceId); } rpt_entry->ResourceTag.DataType = tag->DataType; rpt_entry->ResourceTag.Language = tag->Language; rpt_entry->ResourceTag.DataLength = tag->DataLength; /* change it in our memory as well */ memcpy(&rpt_entry->ResourceTag.Data, tag->Data, sizeof(tag->Data)); oh_add_resource(handler->rptcache, rpt_entry, res_info, 1); entity_rpt_set_updated(res_info, handler->data); return SA_OK; } static SaErrorT ipmi_set_res_sev(void *hnd, SaHpiResourceIdT res_id, SaHpiSeverityT severity) { struct oh_handler_state *handler = (struct oh_handler_state *)hnd; struct ohoi_handler *ipmi_handler = handler->data; struct ohoi_resource_info *res_info; SaHpiRptEntryT *rpt_entry; res_info = oh_get_resource_data(handler->rptcache, res_id); if (res_info == NULL) { err("Failed to retrieve RPT private data"); return SA_ERR_HPI_NOT_PRESENT; } rpt_entry = oh_get_resource_by_id(handler->rptcache, res_id); if (!rpt_entry) { err("Can't find RPT for resource id: %d", res_id); return SA_ERR_HPI_NOT_PRESENT; } dbg("Current Severity: %d\n", rpt_entry->ResourceSeverity); dbg("To be set New Severity: %d\n", severity); memcpy(&rpt_entry->ResourceSeverity, &severity, sizeof(severity)); oh_add_resource(handler->rptcache, rpt_entry, res_info, 1); dbg("New Severity: %d\n", rpt_entry->ResourceSeverity); entity_rpt_set_updated(res_info, ipmi_handler); return SA_OK; } void * oh_open (GHashTable *, unsigned int, oh_evt_queue *) __attribute__ ((weak, alias("ipmi_open"))); void * oh_close (void *) __attribute__ ((weak, alias("ipmi_close"))); void * oh_get_event (void *) __attribute__ ((weak, alias("ipmi_get_event"))); void * oh_discover_resources (void *) __attribute__ ((weak, alias("ipmi_discover_resources"))); void * oh_set_resource_tag (void *, SaHpiResourceIdT, SaHpiTextBufferT *) __attribute__ ((weak, alias("ipmi_set_res_tag"))); void * oh_set_resource_severity (void *, SaHpiResourceIdT, SaHpiSeverityT) __attribute__ ((weak, alias("ipmi_set_res_sev"))); void * oh_get_el_info (void *, SaHpiResourceIdT, SaHpiEventLogInfoT *) __attribute__ ((weak, alias("ipmi_get_el_info"))); void * oh_set_el_time (void *, SaHpiResourceIdT, const SaHpiEventT *) __attribute__ ((weak, alias("ipmi_set_el_time"))); void * oh_get_el_entry (void *, SaHpiResourceIdT, const SaHpiEventT *) __attribute__ ((weak, alias("ipmi_get_el_entry"))); void * oh_set_el_state (void *, SaHpiResourceIdT , SaHpiBoolT ) __attribute__ ((weak, alias("ipmi_set_sel_state"))); void * oh_clear_el (void *, SaHpiResourceIdT) __attribute__ ((weak, alias("ipmi_clear_el"))); void * oh_get_sensor_reading (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiSensorReadingT *, SaHpiEventStateT *) __attribute__ ((weak, alias("ipmi_get_sensor_reading"))); void * oh_get_sensor_thresholds (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiSensorThresholdsT *) __attribute__ ((weak, alias("ipmi_get_sensor_thresholds"))); void * oh_set_sensor_thresholds (void *, SaHpiResourceIdT, SaHpiSensorNumT, const SaHpiSensorThresholdsT *) __attribute__ ((weak, alias("ipmi_set_sensor_thresholds"))); void * oh_get_sensor_enable (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT *) __attribute__ ((weak, alias("ipmi_get_sensor_enable"))); void * oh_set_sensor_enable (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT) __attribute__ ((weak, alias("ipmi_set_sensor_enable"))); void * oh_get_sensor_event_enables (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT *) __attribute__ ((weak, alias("ipmi_get_sensor_event_enable"))); void * oh_set_sensor_event_enables (void *, SaHpiResourceIdT id, SaHpiSensorNumT, SaHpiBoolT *) __attribute__ ((weak, alias("ipmi_set_sensor_event_enable"))); void * oh_get_sensor_event_masks (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiEventStateT *, SaHpiEventStateT *) __attribute__ ((weak, alias("ipmi_get_sensor_event_masks"))); void * oh_set_sensor_event_masks (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiSensorEventMaskActionT, SaHpiEventStateT, SaHpiEventStateT) __attribute__ ((weak, alias("ipmi_set_sensor_event_masks"))); void * oh_get_watchdog_info (void *, SaHpiResourceIdT, SaHpiWatchdogNumT, SaHpiWatchdogT *) __attribute__ ((weak, alias("ipmi_get_watchdog_info"))); void * oh_set_watchdog_info (void *, SaHpiResourceIdT, SaHpiWatchdogNumT, SaHpiWatchdogT *) __attribute__ ((weak, alias("ipmi_set_watchdog_info"))); void * oh_reset_watchdog (void *, SaHpiResourceIdT , SaHpiWatchdogNumT ) __attribute__ ((weak, alias("ipmi_reset_watchdog"))); SaErrorT (*reset_watchdog)(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num); openhpi-3.6.1/plugins/ipmi/ipmi_event.c0000644000175100017510000000462712575647300017117 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Louis Zhuang * Kevin Gao * Rusty Lynch * Tariq Shureih */ #include "ipmi.h" #include #include static void SDRs_read_done(ipmi_domain_t *domain, int err, void *cb_data) { int *flag = cb_data; *flag = 1; dbg("SDRs read done"); return; } static void SELs_read_done(ipmi_domain_t *domain, int err, void *cb_data) { int *flag = cb_data; *flag = 1; dbg("SELs read done"); return; } static void bus_scan_done(ipmi_domain_t *domain, int err, void *cb_data) { struct ohoi_handler *ipmi_handler = (struct ohoi_handler *) cb_data; int rv; int *flag = &ipmi_handler->bus_scan_done; *flag = 1; dbg("bus scan done"); /* we have MCs now, get SEL */ rv = ipmi_domain_reread_sels(domain, SELs_read_done, &ipmi_handler->SELs_read_done); if (rv) err("ipmi_domain_reread_sels returned error: %d\n", rv); return; } void ohoi_setup_done(ipmi_domain_t *domain, void *user_data) { struct oh_handler_state *handler = user_data; struct ohoi_handler *ipmi_handler = handler->data; int rv; rv = ipmi_domain_enable_events(domain); if (rv) { err("ipmi_domain_enable_events return error %d", rv); } rv = ipmi_domain_add_entity_update_handler(domain, ohoi_entity_event, handler); if (rv) err("ipmi_bmc_iterate_entities return error"); rv = ipmi_domain_set_main_SDRs_read_handler(domain, SDRs_read_done, &ipmi_handler->SDRs_read_done); if (rv) err("ipmi_domain_set_main_SDRs_read_handler return error: %d\n", rv); rv = ipmi_domain_set_bus_scan_handler(domain, bus_scan_done, ipmi_handler); if (rv) err("ipmi_domain_set_bus_scan_handler return error: %d\n", rv); rv = ipmi_domain_add_mc_updated_handler(domain, ohoi_mc_event, handler); if (rv) err("ipmi_domain_register_mc_update_handler return error: %d\n", rv); } openhpi-3.6.1/plugins/ipmi/hotswap.c0000644000175100017510000005664612575647300016455 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Louis Zhuang * Racing Guo */ #include "ipmi.h" #include #include static SaHpiHsStateT _ipmi_to_hpi_state_conv(enum ipmi_hot_swap_states ipmi_state) { SaHpiHsStateT state = 0; switch (ipmi_state) { case IPMI_HOT_SWAP_NOT_PRESENT: case IPMI_HOT_SWAP_OUT_OF_CON: state = SAHPI_HS_STATE_NOT_PRESENT; break; case IPMI_HOT_SWAP_INACTIVE: state = SAHPI_HS_STATE_INACTIVE; break; case IPMI_HOT_SWAP_ACTIVATION_REQUESTED: case IPMI_HOT_SWAP_ACTIVATION_IN_PROGRESS: state = SAHPI_HS_STATE_INSERTION_PENDING; break; case IPMI_HOT_SWAP_ACTIVE: state = SAHPI_HS_STATE_ACTIVE; break; case IPMI_HOT_SWAP_DEACTIVATION_REQUESTED: case IPMI_HOT_SWAP_DEACTIVATION_IN_PROGRESS: state = SAHPI_HS_STATE_EXTRACTION_PENDING; break; #if 0 case IPMI_HOT_SWAP_OUT_OF_CON: state = SAHPI_HS_STATE_ACTIVE_UNHEALTHY; break; #endif default: err("Unknown state: %d", ipmi_state); } return state; } static enum ipmi_hot_swap_states _hpi_to_ipmi_state_conv(SaHpiHsStateT hpi_state) { enum ipmi_hot_swap_states state = 0; switch (hpi_state) { case SAHPI_HS_STATE_NOT_PRESENT: state = IPMI_HOT_SWAP_NOT_PRESENT; break; case SAHPI_HS_STATE_INACTIVE: state = IPMI_HOT_SWAP_INACTIVE; break; case SAHPI_HS_STATE_INSERTION_PENDING: state = IPMI_HOT_SWAP_ACTIVATION_IN_PROGRESS; break; case SAHPI_HS_STATE_ACTIVE: state = IPMI_HOT_SWAP_ACTIVE; break; case SAHPI_HS_STATE_EXTRACTION_PENDING: state = IPMI_HOT_SWAP_DEACTIVATION_IN_PROGRESS; break; default: err("Unknown state: %d", hpi_state); } return state; } static SaHpiSeverityT get_severity(enum ipmi_hot_swap_states prev, enum ipmi_hot_swap_states curr, SaHpiRptEntryT *rpt, struct ohoi_resource_info *res_info) { unsigned char hs_mark = 0; if (res_info) { hs_mark = res_info->hs_mark; res_info->hs_mark = 0; } if ((prev == IPMI_HOT_SWAP_ACTIVATION_IN_PROGRESS) && (curr == IPMI_HOT_SWAP_INACTIVE)) { return rpt->ResourceSeverity; } if ((prev != IPMI_HOT_SWAP_INACTIVE) && (curr == IPMI_HOT_SWAP_NOT_PRESENT)) { return rpt->ResourceSeverity; } if (hs_mark && (prev == IPMI_HOT_SWAP_DEACTIVATION_IN_PROGRESS) && (curr == IPMI_HOT_SWAP_INACTIVE)) { return rpt->ResourceSeverity; } return SAHPI_INFORMATIONAL; } static unsigned char _ipmi_to_hpi_cause_of_change_conv(unsigned char cause) { switch (cause) { case 0x00: return 0; case 0x03: return 1; case 0x02: return 2; case 0x07: return 3; case 0x09: return 4; case 0x06: return 5; case 0x08: return 6; case 0x0f: default: return 7; } } int ohoi_hot_swap_cb(ipmi_entity_t *ent, enum ipmi_hot_swap_states last_state, enum ipmi_hot_swap_states curr_state, void *cb_data, ipmi_event_t *event) { struct oh_handler_state *handler = (struct oh_handler_state*)cb_data; struct ohoi_handler *ipmi_handler = (struct ohoi_handler *)handler->data; ipmi_entity_id_t entity_id; SaHpiRptEntryT *rpt_entry; struct ohoi_resource_info *res_info; struct oh_event *e; #if 0 if (event) { unsigned char data[IPMI_EVENT_DATA_MAX_LEN]; unsigned int dt_len, i; printf("event body : "); dt_len = ipmi_event_get_data(event, data, 0, IPMI_EVENT_DATA_MAX_LEN); for (i =0; i < dt_len; i++) printf(" 0x%02x", data[i]); printf("\n"); } #endif if (getenv("OHOI_TRACE_HOTSWAP") || IHOI_TRACE_ALL) { printf(" *** Hotswap HANDLER for entity %d,%d,%d,%d " "(%s). states 0x%x -> 0x%x. entity = %p\n", ipmi_entity_get_entity_id(ent), ipmi_entity_get_entity_instance(ent), ipmi_entity_get_device_channel(ent), ipmi_entity_get_device_address(ent), ipmi_entity_get_entity_id_string(ent), last_state, curr_state, ent); } trace_ipmi("HotSwap Handler called"); entity_id = ipmi_entity_convert_to_id(ent); rpt_entry = ohoi_get_resource_by_entityid(handler->rptcache, &entity_id); if (!rpt_entry) { err(" No rpt\n"); return IPMI_EVENT_HANDLED; } res_info = oh_get_resource_data(handler->rptcache, rpt_entry->ResourceId); if ((last_state == IPMI_HOT_SWAP_ACTIVATION_IN_PROGRESS) && (curr_state == IPMI_HOT_SWAP_DEACTIVATION_IN_PROGRESS)) { if (res_info) { res_info->hs_mark = 1; } return IPMI_EVENT_HANDLED; } e = malloc(sizeof(*e)); if (!e) { err("Out of space"); return IPMI_EVENT_HANDLED; } memset(e, 0, sizeof(*e)); e->event.Source = rpt_entry->ResourceId; if ((curr_state == IPMI_HOT_SWAP_OUT_OF_CON) && (last_state != IPMI_HOT_SWAP_NOT_PRESENT)) { // special case. connection to entity lost rpt_entry->ResourceFailed = SAHPI_TRUE; e->event.EventType = SAHPI_ET_RESOURCE; e->event.Severity = rpt_entry->ResourceSeverity; oh_gettimeofday(&e->event.Timestamp); e->event.Source = rpt_entry->ResourceId; e->event.EventDataUnion.ResourceEvent. ResourceEventType = SAHPI_RESE_RESOURCE_FAILURE; e->resource = *rpt_entry; e->hid = handler->hid; oh_evt_queue_push(handler->eventq, e); if (!IS_ATCA(ipmi_handler->d_type)) { return IPMI_EVENT_HANDLED; } if (ipmi_entity_get_entity_id(ent) == 0xf0) { // Shelf Manager. Handle ShM Redundancy Sensor if (ipmi_handler->fully_up) { ipmi_handler->shmc_present_num--; ohoi_send_vshmgr_redundancy_sensor_event( handler, 0); } } return IPMI_EVENT_HANDLED; } if ((curr_state != IPMI_HOT_SWAP_OUT_OF_CON) && rpt_entry->ResourceFailed) { // special case rpt_entry->ResourceFailed = SAHPI_FALSE; if (curr_state != IPMI_HOT_SWAP_NOT_PRESENT) { // connection to entity restored e->event.EventType = SAHPI_ET_RESOURCE; e->event.Severity = rpt_entry->ResourceSeverity; oh_gettimeofday(&e->event.Timestamp); e->event.Source = rpt_entry->ResourceId; e->event.EventDataUnion.ResourceEvent. ResourceEventType = SAHPI_RESE_RESOURCE_RESTORED; e->resource = *rpt_entry; e->hid = handler->hid; oh_evt_queue_push(handler->eventq, e); if (!IS_ATCA(ipmi_handler->d_type)) { return IPMI_EVENT_HANDLED; } if (ipmi_entity_get_entity_id(ent) == 0xf0) { // Shelf Manager. Handle ShM Redundancy Sensor if (ipmi_handler->fully_up) { ipmi_handler->shmc_present_num++; ohoi_send_vshmgr_redundancy_sensor_event( handler, 1); } } return IPMI_EVENT_HANDLED; } // XXX here must be handled M7->M0 transition } e->event.Source = rpt_entry->ResourceId; e->event.EventType = SAHPI_ET_HOTSWAP; e->event.Severity = get_severity(last_state, curr_state, rpt_entry, res_info); if (event != NULL) { e->event.Timestamp = (SaHpiTimeT)ipmi_event_get_timestamp(event); } else { e->event.Timestamp = SAHPI_TIME_UNSPECIFIED; } if (e->event.Timestamp == SAHPI_TIME_UNSPECIFIED) { oh_gettimeofday(&e->event.Timestamp); } e->event.EventDataUnion.HotSwapEvent.HotSwapState = _ipmi_to_hpi_state_conv(curr_state); e->event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = _ipmi_to_hpi_state_conv(last_state); e->resource = *rpt_entry; if (e->event.EventDataUnion.HotSwapEvent.PreviousHotSwapState == e->event.EventDataUnion.HotSwapEvent.HotSwapState) { free(e); return IPMI_EVENT_HANDLED; } if (e->event.EventDataUnion.HotSwapEvent.HotSwapState == SAHPI_HS_STATE_INSERTION_PENDING) { res_info->hs_inspen_time = e->event.Timestamp; } else { res_info->hs_inspen_time = SAHPI_TIME_UNSPECIFIED; } if (e->event.EventDataUnion.HotSwapEvent.HotSwapState == SAHPI_HS_STATE_NOT_PRESENT) { trace_ipmi("HS_STATE NOT PRESENT, removing RPT"); e->hid = handler->hid; oh_evt_queue_push(handler->eventq, e); }else if (e->event.EventDataUnion.HotSwapEvent.HotSwapState == SAHPI_HS_STATE_ACTIVE) { trace_ipmi("HS_STATE ACTIVE"); e->hid = handler->hid; oh_evt_queue_push(handler->eventq, e); }else { e->hid = handler->hid; oh_evt_queue_push(handler->eventq, e); } // oh_wake_event_thread(0); if (!IS_ATCA(ipmi_handler->d_type) || !event) { return IPMI_EVENT_HANDLED; } unsigned char data[IPMI_EVENT_DATA_MAX_LEN]; unsigned int dt_len; dt_len = ipmi_event_get_data(event, data, 0, IPMI_EVENT_DATA_MAX_LEN); if (dt_len < 12) { err("event data len (%d) too short", dt_len); return IPMI_EVENT_HANDLED; } e = malloc(sizeof(*e)); if (!e) { err("Out of space"); return IPMI_EVENT_HANDLED; } memset(e, 0, sizeof(*e)); e->resource = *rpt_entry; e->event.Source = rpt_entry->ResourceId; e->event.Timestamp = (SaHpiTimeT)ipmi_event_get_timestamp(event); e->event.Severity = SAHPI_INFORMATIONAL; e->event.EventType = SAHPI_ET_OEM; e->event.EventDataUnion.OemEvent.MId = ATCAHPI_PICMG_MID; e->event.EventDataUnion.OemEvent.OemEventData.DataType = SAHPI_TL_TYPE_TEXT; e->event.EventDataUnion.OemEvent.OemEventData.Language = SAHPI_LANG_UNDEF; e->event.EventDataUnion.OemEvent.OemEventData.DataLength = 3; e->event.EventDataUnion.OemEvent.OemEventData.Data[0] = _ipmi_to_hpi_state_conv(curr_state); e->event.EventDataUnion.OemEvent.OemEventData.Data[1] = _ipmi_to_hpi_state_conv(last_state); e->event.EventDataUnion.OemEvent.OemEventData.Data[2] = _ipmi_to_hpi_cause_of_change_conv(data[11] >> 4); e->hid = handler->hid; oh_evt_queue_push(handler->eventq, e); return IPMI_EVENT_HANDLED; } /* GET HOTSWAP STATE */ typedef struct { int done; SaErrorT err; enum ipmi_hot_swap_states ipmi_state; } get_hs_state_t; static void _get_hotswap_state(ipmi_entity_t *ent, int err, enum ipmi_hot_swap_states state, void *cb_data) { get_hs_state_t *info = cb_data; if (err) { err("_get_hotswap_state. err = 0x%x", err); err = SA_ERR_HPI_INVALID_CMD; } else { info->ipmi_state = state; } info->done = 1; } SaErrorT ohoi_get_hotswap_state(void *hnd, SaHpiResourceIdT id, SaHpiHsStateT *state) { struct oh_handler_state *handler; const struct ohoi_resource_info *ohoi_res_info; get_hs_state_t info; int rv; handler = (struct oh_handler_state *)hnd; ohoi_res_info = oh_get_resource_data(handler->rptcache, id); if (!(ohoi_res_info->type & OHOI_RESOURCE_ENTITY)) { err("BUG: try to get sel in unsupported resource"); return SA_ERR_HPI_INVALID_CMD; } info.done = 0; info.err = SA_OK; rv = ipmi_entity_id_get_hot_swap_state(ohoi_res_info->u.entity.entity_id, _get_hotswap_state, &info); if (rv) { err("Unable to get hotswap state: %d", rv); return SA_ERR_HPI_INVALID_CMD; } rv = ohoi_loop(&info.done, handler->data); if (rv) { err("ohoi_loop returned %d", rv); return rv; } if (info.err != SA_OK) { err("info.err = %d", info.err); return info.err; } *state = _ipmi_to_hpi_state_conv(info.ipmi_state); return SA_OK; } /* SET HOTSWAP STATE */ struct hs_done_s { int done; int err; }; static void _hotswap_done(ipmi_entity_t *ent, int err, void *cb_data) { struct hs_done_s *info = cb_data; if (err) { err("err = 0x%x", err); } info->err = err; info->done = 1; } SaErrorT ohoi_set_hotswap_state(void *hnd, SaHpiResourceIdT id, SaHpiHsStateT state) { struct oh_handler_state *handler = (struct oh_handler_state *)hnd; struct ohoi_handler *ipmi_handler = handler->data; const struct ohoi_resource_info *ohoi_res_info; struct hs_done_s info; SaErrorT rv; ohoi_res_info = oh_get_resource_data(handler->rptcache, id); if (!(ohoi_res_info->type & OHOI_RESOURCE_ENTITY)) { err("BUG: try to get sel in unsupported resource"); return SA_ERR_HPI_INVALID_CMD; } info.done = 0; info.err = 0; switch (_hpi_to_ipmi_state_conv(state)) { case IPMI_HOT_SWAP_ACTIVE: ipmi_entity_id_activate(ohoi_res_info->u.entity.entity_id, _hotswap_done, &info); break; case IPMI_HOT_SWAP_INACTIVE: ipmi_entity_id_deactivate(ohoi_res_info->u.entity.entity_id, _hotswap_done, &info); break; default: err("Unable set hotswap state: %d", state); return SA_ERR_HPI_INVALID_CMD; } rv = ohoi_loop(&info.done, ipmi_handler); if (rv != SA_OK) { return rv; } if (info.err) { return SA_ERR_HPI_INVALID_CMD; } return SA_OK; } /* REQUEST HOTSWAP ACTION */ static void activation_request(ipmi_entity_t *ent, void *cb_data) { int rv; struct hs_done_s *info = cb_data; rv = ipmi_entity_set_activation_requested(ent, _hotswap_done, cb_data); if (rv == ENOSYS) { err("ipmi_entity_set_activation_requested = ENOSYS. " "Use ipmi_entity_activate"); rv = ipmi_entity_activate(ent, _hotswap_done, cb_data); } if (rv) { err("ipmi_entity_set_activation_requested = 0x%x", rv); info->done = 1; info->err = -1; } } static void deactivation_request(ipmi_entity_t *ent, void *cb_data) { int rv; struct hs_done_s *info = cb_data; rv = ipmi_entity_deactivate(ent, _hotswap_done, cb_data); if (rv) { err("ipmi_entity_set_activation_requested = 0x%x", rv); info->done = 1; info->err = -1; } } SaErrorT ohoi_request_hotswap_action(void *hnd, SaHpiResourceIdT id, SaHpiHsActionT act) { struct oh_handler_state *handler; const struct ohoi_resource_info *ohoi_res_info; struct hs_done_s info; SaErrorT rv; handler = (struct oh_handler_state *)hnd; struct ohoi_handler *ipmi_handler = handler->data; ohoi_res_info = oh_get_resource_data(handler->rptcache, id); if (!(ohoi_res_info->type & OHOI_RESOURCE_ENTITY)) { err("BUG: try to get sel in unsupported resource"); return SA_ERR_HPI_INVALID_CMD; } info.done = 0; info.err = 0; switch (act) { case SAHPI_HS_ACTION_INSERTION: rv = ipmi_entity_pointer_cb(ohoi_res_info->u.entity.entity_id, activation_request, &info); if (rv) { err("ipmi_entity_pointer_cb = 0x%x", rv); return SA_ERR_HPI_INVALID_PARAMS; } break; case SAHPI_HS_ACTION_EXTRACTION: rv = ipmi_entity_pointer_cb(ohoi_res_info->u.entity.entity_id, deactivation_request, &info); if (rv) { err("ipmi_entity_pointer_cb = 0x%x", rv); return SA_ERR_HPI_INVALID_PARAMS; } break; //return SA_ERR_HPI_UNSUPPORTED_API; default : return SA_ERR_HPI_INVALID_PARAMS; } rv = ohoi_loop(&info.done, ipmi_handler); if (rv != SA_OK) { return rv; } if (info.err) { return SA_ERR_HPI_INVALID_REQUEST; } return SA_OK; } #if 0 SaErrorT ohoi_get_indicator_state(void *hnd, SaHpiResourceIdT id, SaHpiHsIndicatorStateT *state) { struct oh_handler_state *handler; const struct ohoi_resource_info *ohoi_res_info; SaHpiCtrlStateT c_state; SaErrorT rv; handler = (struct oh_handler_state *)hnd; ohoi_res_info = oh_get_resource_data(handler->rptcache, id); if (!(ohoi_res_info->type & OHOI_RESOURCE_ENTITY)) { err("BUG: try to get HS in unsupported resource"); return SA_ERR_HPI_INVALID_CMD; } rv = ohoi_get_control_state(hnd, id, ohoi_res_info->hotswapind, NULL, &c_state); if (rv != SA_OK) { return rv; } if (c_state.StateUnion.Oem.Body[1] == 0) { *state = SAHPI_HS_INDICATOR_OFF; } else { *state = SAHPI_HS_INDICATOR_ON; } return SA_OK; } SaErrorT ohoi_set_indicator_state(void *hnd, SaHpiResourceIdT id, SaHpiHsIndicatorStateT state) { struct oh_handler_state *handler; const struct ohoi_resource_info *ohoi_res_info; SaErrorT rv; SaHpiCtrlStateT c_state; SaHpiCtrlModeT mode; handler = (struct oh_handler_state *)hnd; ohoi_res_info = oh_get_resource_data(handler->rptcache, id); if (!(ohoi_res_info->type & OHOI_RESOURCE_ENTITY)) { err("BUG: try to set HS in unsupported resource"); return SA_ERR_HPI_INVALID_CMD; } rv = ohoi_get_control_state(hnd, id, ohoi_res_info->hotswapind, &mode, &c_state); if (rv != SA_OK) { return rv; } if (state == SAHPI_HS_INDICATOR_OFF) { c_state.StateUnion.Oem.Body[0] = 1; c_state.StateUnion.Oem.Body[1] = 0; } else if (state == SAHPI_HS_INDICATOR_ON) { c_state.StateUnion.Oem.Body[0] = 0; c_state.StateUnion.Oem.Body[1] = 1; } else { return SA_ERR_HPI_INVALID_PARAMS; } rv = ohoi_set_control_state(hnd, id, ohoi_res_info->hotswapind, SAHPI_CTRL_MODE_MANUAL, &c_state); if ((rv == SA_OK) && (mode == SAHPI_CTRL_MODE_AUTO)) { ohoi_set_control_state(hnd, id, ohoi_res_info->hotswapind, SAHPI_CTRL_MODE_AUTO, NULL); } return rv; } #endif struct ohoi_indicator_state { int done; int val; int err; }; static void _get_indicator_state(ipmi_entity_t *ent, int err, int val, void *cb_data) { struct ohoi_indicator_state *state; state = cb_data; if (state->err) { err("err = 0x%x", err); } state->err = err; state->done = 1; state->val = val; } SaErrorT ohoi_set_indicator_state(void *hnd, SaHpiResourceIdT id, SaHpiHsIndicatorStateT state) { struct oh_handler_state *handler; const struct ohoi_resource_info *ohoi_res_info; struct hs_done_s info; SaErrorT rv; handler = (struct oh_handler_state *)hnd; struct ohoi_handler *ipmi_handler = handler->data; ohoi_res_info = oh_get_resource_data(handler->rptcache, id); if (!(ohoi_res_info->type & OHOI_RESOURCE_ENTITY)) { err("BUG: try to get sel in unsupported resource"); return SA_ERR_HPI_INVALID_CMD; } info.done = 0; info.err = 0; ipmi_entity_id_set_hot_swap_indicator(ohoi_res_info->u.entity.entity_id, state, _hotswap_done, &info); rv = ohoi_loop(&info.done,ipmi_handler); if (rv != SA_OK) { return rv; } if (info.err) { return SA_ERR_HPI_INVALID_CMD; } return SA_OK; } SaErrorT ohoi_get_indicator_state(void *hnd, SaHpiResourceIdT id, SaHpiHsIndicatorStateT *state) { struct oh_handler_state *handler; const struct ohoi_resource_info *ohoi_res_info; struct ohoi_indicator_state ipmi_state; SaErrorT rv; handler = (struct oh_handler_state *)hnd; struct ohoi_handler *ipmi_handler = handler->data; ohoi_res_info = oh_get_resource_data(handler->rptcache, id); if (!(ohoi_res_info->type & OHOI_RESOURCE_ENTITY)) { err("BUG: try to get HS in unsupported resource"); return SA_ERR_HPI_INVALID_CMD; } ipmi_state.done = 0; rv = ipmi_entity_id_get_hot_swap_indicator( ohoi_res_info->u.entity.entity_id, _get_indicator_state, &ipmi_state); if(rv) { return SA_ERR_HPI_INTERNAL_ERROR; } rv = ohoi_loop(&ipmi_state.done, ipmi_handler); if (rv != SA_OK) { return rv; } *state = ipmi_state.val; return SA_OK;; } SaErrorT ohoi_hotswap_policy_cancel(void *hnd, SaHpiResourceIdT rid, SaHpiTimeoutT ins_timeout) { struct oh_handler_state *handler = hnd; struct ohoi_handler *ipmi_handler = handler->data; struct ohoi_resource_info *res_info; struct ohoi_control_info *ctrl_info; SaHpiRptEntryT *rpt; SaHpiResourceIdT prid; SaHpiTimeoutT curtime; SaErrorT rv; if (!IS_ATCA(ipmi_handler->d_type)) { return SA_OK; } rpt = oh_get_resource_by_id(handler->rptcache, rid); if (rpt == NULL) { err("No rpt for id = %d", rid); return SA_ERR_HPI_INTERNAL_ERROR; } // get parent (slot) rpt prid = ohoi_get_parent_id(rpt); rv = ohoi_get_rdr_data(hnd, prid, SAHPI_CTRL_RDR, ATCAHPI_CTRL_NUM_FRU_ACTIVATION, (void *)&ctrl_info); if (rv != SA_OK) { err("NO FRU Activation Control"); return SA_ERR_HPI_INVALID_REQUEST; } if (ctrl_info->mode == SAHPI_CTRL_MODE_AUTO) { err("mode == AUTO"); return SA_ERR_HPI_INVALID_REQUEST; } res_info = oh_get_resource_data(handler->rptcache, rid); if (res_info == NULL) { err("no res_info"); return SA_ERR_HPI_INTERNAL_ERROR; } if (ins_timeout == SAHPI_TIMEOUT_BLOCK) { return SA_OK; } if (res_info->hs_inspen_time == SAHPI_TIME_UNSPECIFIED) { // time of last insertion pending state unknown err("time of last insertion pending state unknown"); return SA_ERR_HPI_INVALID_REQUEST; } if (ins_timeout == SAHPI_TIMEOUT_IMMEDIATE) { err("ins_timeout == SAHPI_TIMEOUT_IMMEDIATE"); return SA_ERR_HPI_INVALID_REQUEST; } oh_gettimeofday(&curtime); if (res_info->hs_inspen_time + ins_timeout > curtime) { err("time expired"); return SA_ERR_HPI_INVALID_REQUEST; } return SA_OK; } void * oh_get_hotswap_state (void *, SaHpiResourceIdT, SaHpiHsStateT *) __attribute__ ((weak, alias("ohoi_get_hotswap_state"))); void * oh_set_hotswap_state (void *, SaHpiResourceIdT, SaHpiHsStateT) __attribute__ ((weak, alias("ohoi_set_hotswap_state"))); void * oh_request_hotswap_action (void *, SaHpiResourceIdT, SaHpiHsActionT) __attribute__ ((weak, alias("ohoi_request_hotswap_action"))); void * oh_get_indicator_state (void *, SaHpiResourceIdT, SaHpiHsIndicatorStateT *) __attribute__ ((weak, alias("ohoi_get_indicator_state"))); void * oh_set_indicator_state (void *, SaHpiResourceIdT, SaHpiHsIndicatorStateT) __attribute__ ((weak, alias("ohoi_set_indicator_state"))); void * oh_hotswap_policy_cancel (void *, SaHpiResourceIdT, SaHpiTimeoutT) __attribute__ ((weak, alias("ohoi_hotswap_policy_cancel"))); openhpi-3.6.1/plugins/ipmi/ipmi_connection.c0000644000175100017510000000537612575647300020137 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Louis Zhuang * Kevin Gao * Rusty Lynch * Tariq Shureih * Racing Guo * Andy Cress (watchdog) */ #include "ipmi.h" static int init_domain_handlers(ipmi_domain_t *domain, void *user_data) { struct oh_handler_state *handler = user_data; char dmn_name[IPMI_DOMAIN_NAME_LEN]; int rv; int ret = 0; rv = ipmi_domain_enable_events(domain); if (rv) { fprintf(stderr, "ipmi_domain_enable_events return error %d\n", rv); if (ret == 0) { ret = rv; } } rv = ipmi_domain_add_entity_update_handler(domain, ohoi_entity_event, handler); if (rv) { fprintf(stderr, "ipmi_domain_add_entity_update_handler error %d\n", rv); if (ret == 0) { ret = rv; } } rv = ipmi_domain_add_mc_updated_handler(domain, ohoi_mc_event, handler); if (rv) { fprintf(stderr, "ipmi_domain_add_mc_updated_handler return error: %d\n", rv); if (ret == 0) { ret = rv; } } if (ret) { ipmi_domain_get_name(domain, dmn_name, IPMI_DOMAIN_NAME_LEN); fprintf(stderr, "Could not initialize ipmi domain %s\n", dmn_name); } return ret; } void ipmi_connection_handler (ipmi_domain_t *domain, int err, unsigned int conn_num, unsigned int port_num, int still_connected, void *cb_data) { struct oh_handler_state *handler = cb_data; struct ohoi_handler *ipmi_handler = handler->data; int rv; trace_ipmi("connection handler called. Error code: 0x%x", err); ipmi_handler->d_type = ipmi_domain_get_type(domain); if (err) { err("Failed to connect to IPMI domain. err = 0x%x", err); ipmi_handler->connected = 0; } else { err("IPMI domain Connection success"); ipmi_handler->connected = 1; } if (!still_connected) { err("All IPMI connections down\n"); ipmi_handler->connected = 0; } if (ipmi_handler->connected == 0) { return; } rv = init_domain_handlers(domain, cb_data); if (rv) { /* we can do something better */ err("Couldn't init_domain_handlers. rv = 0x%x", rv); ipmi_handler->connected = 0; } if (ipmi_handler->connected && ipmi_handler->openipmi_scan_time) { ipmi_domain_set_sel_rescan_time(domain, ipmi_handler->openipmi_scan_time); } } openhpi-3.6.1/plugins/ipmi/ipmi_entity.c0000644000175100017510000000104312575647300017277 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Louis Zhuang */ #include "ipmi.h" #include #include openhpi-3.6.1/plugins/ipmi/ipmi_inventory.c0000644000175100017510000021536212575647300020033 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Louis Zhuang * Racing Guo * Vadim Revyakin */ #include "ipmi.h" #include #include static int prnt_fru = 1; #define OHOI_IDR_DEFAULT_ID 0 #define OHOI_CHECK_RPT_CAP_IDR() \ do{ \ SaHpiRptEntryT *rpt_entry; \ rpt_entry = oh_get_resource_by_id(handler->rptcache, rid); \ if (!rpt_entry) { \ err("Resource %d No rptentry", rid); \ return SA_ERR_HPI_INVALID_PARAMS; \ } \ if (!(rpt_entry->ResourceCapabilities & \ SAHPI_CAPABILITY_INVENTORY_DATA)) { \ err("Resource %d no inventory capability", rid); \ return SA_ERR_HPI_INVALID_PARAMS; \ } \ if (idrid != OHOI_IDR_DEFAULT_ID) { \ err("error id"); \ return SA_ERR_HPI_NOT_PRESENT; \ } \ }while(0) struct ohoi_field_data { SaHpiIdrFieldTypeT fieldtype; SaHpiLanguageT lang; int (*get_len)(ipmi_entity_t *, unsigned int*); int (*get_data)(ipmi_entity_t *, char*, unsigned int*); int (*get_type)(ipmi_fru_t *fru, enum ipmi_str_type_e *type); }; static int _ipmi_entity_get_chassis_info_type_len(ipmi_entity_t *ent, unsigned int *length) { *length = 1; return 0; } static int _ipmi_entity_get_chassis_info_type(ipmi_entity_t *ent, char *str, unsigned int *strlen) { unsigned char tp; int r; r = ipmi_entity_get_chassis_info_type(ent, &tp); if (r) { return r; } str[0] = (char)tp; *strlen = 1; return 0; } static int _ipmi_fru_get_chassis_info_type_type(ipmi_fru_t *fru, enum ipmi_str_type_e *type) { *type = IPMI_BINARY_STR; return 0; } static struct ohoi_field_data chassis_fields[] = { { SAHPI_IDR_FIELDTYPE_CHASSIS_TYPE, SAHPI_LANG_UNDEF, _ipmi_entity_get_chassis_info_type_len, _ipmi_entity_get_chassis_info_type, _ipmi_fru_get_chassis_info_type_type, }, { SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER, SAHPI_LANG_ENGLISH, ipmi_entity_get_chassis_info_serial_number_len, ipmi_entity_get_chassis_info_serial_number, ipmi_fru_get_chassis_info_serial_number_type, }, { SAHPI_IDR_FIELDTYPE_PART_NUMBER, SAHPI_LANG_UNDEF, ipmi_entity_get_chassis_info_part_number_len, ipmi_entity_get_chassis_info_part_number, ipmi_fru_get_chassis_info_part_number_type, }, }; static int _ipmi_fru_get_board_info_mfg_time_len(ipmi_entity_t *entity, unsigned int *length) { *length = sizeof (time_t); return 0; } static int _ipmi_fru_get_board_info_mfg_time(ipmi_entity_t *entity, char *str, unsigned int *strlen) { time_t tm; int res; res = ipmi_entity_get_board_info_mfg_time(entity, &tm); if (res) { return res; } memcpy(str, &tm, sizeof (tm)); *strlen = sizeof (tm); return 0; } static int _ipmi_fru_get_board_info_mfg_time_type(ipmi_fru_t *fru, enum ipmi_str_type_e *type) { *type = IPMI_FRU_DATA_BINARY; return 0; } static struct ohoi_field_data board_fields[] = { { SAHPI_IDR_FIELDTYPE_MFG_DATETIME, SAHPI_LANG_UNDEF, _ipmi_fru_get_board_info_mfg_time_len, _ipmi_fru_get_board_info_mfg_time, _ipmi_fru_get_board_info_mfg_time_type, }, { SAHPI_IDR_FIELDTYPE_MANUFACTURER, SAHPI_LANG_UNDEF, ipmi_entity_get_board_info_board_manufacturer_len, ipmi_entity_get_board_info_board_manufacturer, ipmi_fru_get_board_info_board_manufacturer_type }, { SAHPI_IDR_FIELDTYPE_PRODUCT_NAME, SAHPI_LANG_UNDEF, ipmi_entity_get_board_info_board_product_name_len, ipmi_entity_get_board_info_board_product_name, ipmi_fru_get_board_info_board_product_name_type, }, { SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER, SAHPI_LANG_ENGLISH, ipmi_entity_get_board_info_board_serial_number_len, ipmi_entity_get_board_info_board_serial_number, ipmi_fru_get_board_info_board_serial_number_type }, { SAHPI_IDR_FIELDTYPE_PART_NUMBER, SAHPI_LANG_UNDEF, ipmi_entity_get_board_info_board_part_number_len, ipmi_entity_get_board_info_board_part_number, ipmi_fru_get_board_info_board_part_number_type }, { SAHPI_IDR_FIELDTYPE_FILE_ID, SAHPI_LANG_ENGLISH, ipmi_entity_get_board_info_fru_file_id_len, ipmi_entity_get_board_info_fru_file_id, ipmi_fru_get_board_info_fru_file_id_type }, }; static struct ohoi_field_data product_fields[] = { { SAHPI_IDR_FIELDTYPE_MANUFACTURER, SAHPI_LANG_UNDEF, ipmi_entity_get_product_info_manufacturer_name_len, ipmi_entity_get_product_info_manufacturer_name, ipmi_fru_get_product_info_manufacturer_name_type, }, { SAHPI_IDR_FIELDTYPE_PRODUCT_NAME, SAHPI_LANG_UNDEF, ipmi_entity_get_product_info_product_name_len, ipmi_entity_get_product_info_product_name, ipmi_fru_get_product_info_product_name_type, }, { SAHPI_IDR_FIELDTYPE_PART_NUMBER, SAHPI_LANG_UNDEF, ipmi_entity_get_product_info_product_part_model_number_len, ipmi_entity_get_product_info_product_part_model_number, ipmi_fru_get_product_info_product_part_model_number_type, }, { SAHPI_IDR_FIELDTYPE_PRODUCT_VERSION, SAHPI_LANG_UNDEF, ipmi_entity_get_product_info_product_version_len, ipmi_entity_get_product_info_product_version, ipmi_fru_get_product_info_product_version_type, }, { SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER, SAHPI_LANG_ENGLISH, ipmi_entity_get_product_info_product_serial_number_len, ipmi_entity_get_product_info_product_serial_number, ipmi_fru_get_product_info_product_serial_number_type, }, { SAHPI_IDR_FIELDTYPE_FILE_ID, SAHPI_LANG_UNDEF, ipmi_entity_get_product_info_fru_file_id_len, ipmi_entity_get_product_info_fru_file_id, ipmi_fru_get_product_info_fru_file_id_type, }, { SAHPI_IDR_FIELDTYPE_ASSET_TAG, SAHPI_LANG_UNDEF, ipmi_entity_get_product_info_asset_tag_len, ipmi_entity_get_product_info_asset_tag, ipmi_fru_get_product_info_asset_tag_type, }, }; static int _ipmi_entity_get_internal_use_data(ipmi_entity_t *entity, char *data, unsigned int *max_len) { return ipmi_entity_get_internal_use_data(entity, (void *)data, max_len); } static int _ipmi_fru_get_multi_record_type(ipmi_fru_t *fru, enum ipmi_str_type_e *type) { return ipmi_fru_get_multi_record_type(fru, 0, (void *)type); } static struct ohoi_field_data internal_fields[] = { { SAHPI_IDR_FIELDTYPE_CUSTOM, SAHPI_LANG_UNDEF, ipmi_entity_get_internal_use_length, _ipmi_entity_get_internal_use_data, _ipmi_fru_get_multi_record_type }, { SAHPI_IDR_FIELDTYPE_CUSTOM, SAHPI_LANG_UNDEF, NULL, NULL, NULL, } }; static struct ohoi_area_data { int field_num; SaHpiIdrAreaTypeT areatype; unsigned int empty_len; SaHpiBoolT read_only; struct ohoi_field_data *fields; } areas [] = { { sizeof(internal_fields)/sizeof(internal_fields[0]), SAHPI_IDR_AREATYPE_INTERNAL_USE, 8, SAHPI_TRUE, internal_fields }, { sizeof(chassis_fields)/sizeof(chassis_fields[0]), SAHPI_IDR_AREATYPE_CHASSIS_INFO, 8, SAHPI_FALSE, chassis_fields }, { sizeof(board_fields)/sizeof(board_fields[0]), SAHPI_IDR_AREATYPE_BOARD_INFO, 16, SAHPI_FALSE, board_fields }, { sizeof(product_fields)/sizeof(product_fields[0]), SAHPI_IDR_AREATYPE_PRODUCT_INFO, 16, SAHPI_FALSE, product_fields }, { 0, SAHPI_IDR_AREATYPE_OEM, 0, SAHPI_TRUE, NULL } }; #define OHOI_AREA_LAST_ID(fru) (FIRST_OEM_AREA_NUM + (fru)->oem - 1) #define OHOI_FIELD_NUM(area) ((area)->field_num) #define OHOI_FIELD_LAST_ID(area) ((area)->field_num) struct ohoi_area_layout { unsigned int off; unsigned int len; unsigned int used_len; }; struct ohoi_fru_layout { unsigned int len; unsigned int free_len; struct ohoi_area_layout areas[IPMI_FRU_FTR_NUMBER]; }; static SaHpiEntryIdT get_first_areaid_by_type(SaHpiIdrAreaTypeT areatype) { SaHpiEntryIdT id; for (id = 0; id < FIRST_OEM_AREA_NUM; id++) { if (areas[id].areatype == areatype) { return id + 1; } } return 0; } static SaHpiIdrAreaTypeT get_areatype_by_id(SaHpiEntryIdT id, struct ohoi_inventory_info *fru) { if (id < OHOI_AREA_FIRST_ID) { return OHOI_AREA_EMPTY_ID; } if (id <= FIRST_OEM_AREA_NUM) { return areas[id - 1].areatype; } if (id > OHOI_AREA_LAST_ID(fru)) { return OHOI_AREA_EMPTY_ID; } return SAHPI_IDR_AREATYPE_OEM; } static unsigned int get_ipmi_areatype(SaHpiIdrAreaTypeT areatype) { switch (areatype) { case SAHPI_IDR_AREATYPE_BOARD_INFO: return IPMI_FRU_FTR_BOARD_INFO_AREA; case SAHPI_IDR_AREATYPE_PRODUCT_INFO: return IPMI_FRU_FTR_PRODUCT_INFO_AREA; case SAHPI_IDR_AREATYPE_CHASSIS_INFO: return IPMI_FRU_FTR_CHASSIS_INFO_AREA; case SAHPI_IDR_AREATYPE_INTERNAL_USE: return IPMI_FRU_FTR_INTERNAL_USE_AREA; case SAHPI_IDR_AREATYPE_OEM: return IPMI_FRU_FTR_MULTI_RECORD_AREA; default: return IPMI_FRU_FTR_NUMBER; } } static SaHpiEntryIdT get_fieldid_by_type(struct ohoi_inventory_info *fru, SaHpiEntryIdT areaid, SaHpiIdrFieldTypeT type) { struct ohoi_area_data *area; SaHpiEntryIdT i; SaHpiEntryIdT mid, cn; if (areaid < OHOI_AREA_FIRST_ID) { err("Invalid areaid 0x%x", areaid); return 0; } if (fru->oem_areas && (areaid >= FIRST_OEM_AREA_NUM) && (areaid < OHOI_AREA_LAST_ID(fru)) && (type == SAHPI_IDR_FIELDTYPE_CUSTOM)) { return 1; } if (areaid > FIRST_OEM_AREA_NUM) { err("Invalid areaid 0x%x", areaid); return 0; } area = &areas[areaid - 1]; if (type == SAHPI_IDR_FIELDTYPE_CUSTOM) { mid = OHOI_FIELD_NUM(area); switch (area->areatype) { case SAHPI_IDR_AREATYPE_CHASSIS_INFO : cn = fru->ci_custom_num; break; case SAHPI_IDR_AREATYPE_BOARD_INFO : cn = fru->bi_custom_num; break; case SAHPI_IDR_AREATYPE_PRODUCT_INFO : cn = fru->pi_custom_num; break; default : return 0; } return mid + cn + 1; } for (i = 0; i < OHOI_FIELD_NUM(area); i++) { if (area->fields[i].fieldtype == type) { return i + 1; } } err("No area field type %d in areatype 0x%x", type, area->areatype); return 0; } static int get_fru_layout(ipmi_fru_t *fru, struct ohoi_fru_layout *layout) { unsigned int len, used_len; unsigned int offset; unsigned int common_len = 0; int rv; SaHpiEntryIdT id; layout->free_len = 0; layout->len = ipmi_fru_get_data_length(fru); rv = ipmi_fru_area_get_length(fru, IPMI_FRU_FTR_INTERNAL_USE_AREA, &len); rv |= ipmi_fru_area_get_offset(fru, IPMI_FRU_FTR_INTERNAL_USE_AREA, &offset); rv |= ipmi_fru_area_get_used_length(fru, IPMI_FRU_FTR_INTERNAL_USE_AREA, &used_len); if (rv != 0) { offset = 0; len = 0; used_len = 0; } id = get_ipmi_areatype(SAHPI_IDR_AREATYPE_INTERNAL_USE); layout->areas[id].off = offset; layout->areas[id].len = len; layout->areas[id].used_len = used_len; common_len += len; rv = ipmi_fru_area_get_length(fru, IPMI_FRU_FTR_CHASSIS_INFO_AREA, &len); rv |= ipmi_fru_area_get_offset(fru, IPMI_FRU_FTR_CHASSIS_INFO_AREA, &offset); rv |= ipmi_fru_area_get_used_length(fru, IPMI_FRU_FTR_CHASSIS_INFO_AREA, &used_len); if (rv != 0) { offset = 0; len = 0; used_len = 0; } id = get_ipmi_areatype(SAHPI_IDR_AREATYPE_CHASSIS_INFO); layout->areas[id].off = offset; layout->areas[id].len = len; layout->areas[id].used_len = used_len; common_len += len; rv = ipmi_fru_area_get_length(fru, IPMI_FRU_FTR_BOARD_INFO_AREA, &len); rv |= ipmi_fru_area_get_offset(fru, IPMI_FRU_FTR_BOARD_INFO_AREA, &offset); rv |= ipmi_fru_area_get_used_length(fru, IPMI_FRU_FTR_BOARD_INFO_AREA, &used_len); if (rv != 0) { offset = 0; len = 0; used_len = 0; } id = get_ipmi_areatype(SAHPI_IDR_AREATYPE_BOARD_INFO); layout->areas[id].off = offset; layout->areas[id].len = len; layout->areas[id].used_len = used_len; common_len += len; rv = ipmi_fru_area_get_length(fru, IPMI_FRU_FTR_PRODUCT_INFO_AREA, &len); rv |= ipmi_fru_area_get_offset(fru, IPMI_FRU_FTR_PRODUCT_INFO_AREA, &offset); rv |= ipmi_fru_area_get_used_length(fru, IPMI_FRU_FTR_PRODUCT_INFO_AREA, &used_len); if (rv != 0) { offset = 0; len = 0; used_len = 0; } id = get_ipmi_areatype(SAHPI_IDR_AREATYPE_PRODUCT_INFO); layout->areas[id].off = offset; layout->areas[id].len = len; layout->areas[id].used_len = used_len; common_len += len; rv = ipmi_fru_area_get_length(fru, IPMI_FRU_FTR_MULTI_RECORD_AREA, &len); rv |= ipmi_fru_area_get_offset(fru, IPMI_FRU_FTR_MULTI_RECORD_AREA, &offset); rv |= ipmi_fru_area_get_used_length(fru, IPMI_FRU_FTR_MULTI_RECORD_AREA, &used_len); if (rv != 0) { offset = 0; len = 0; used_len = 0; } id = get_ipmi_areatype(SAHPI_IDR_AREATYPE_OEM); layout->areas[id].off = offset; layout->areas[id].len = len; layout->areas[id].used_len = used_len; common_len += len; layout->free_len = layout->len - common_len; return 0; } static void print_fru_layout(char *head, struct ohoi_fru_layout *l) { struct ohoi_area_layout *al; if (!prnt_fru) { return; } if (head != NULL) { printf("***** %s\n", head); } printf(" FRU length = %i, free_len = %i\n", l->len, l->free_len); al = &l->areas[IPMI_FRU_FTR_INTERNAL_USE_AREA]; printf(" Internal Use Area: off = %i; len = %i" "; used len = %i\n", al->off, al->len, al->used_len); al = &l->areas[IPMI_FRU_FTR_CHASSIS_INFO_AREA]; printf(" Chassis Info Area: off = %i; len = %i" "; used len = %i\n", al->off, al->len, al->used_len); al = &l->areas[IPMI_FRU_FTR_BOARD_INFO_AREA]; printf(" Board Info Area: off = %i; len = %i" "; used len = %i\n", al->off, al->len, al->used_len); al = &l->areas[IPMI_FRU_FTR_PRODUCT_INFO_AREA]; printf(" Product Info Area: off = %i; len = %i" "; used len = %i\n", al->off, al->len, al->used_len); al = &l->areas[IPMI_FRU_FTR_MULTI_RECORD_AREA]; printf(" Multi Record Area: off = %i; len = %i" "; used len = %i\n", al->off, al->len, al->used_len); } #if 0 //see below static void dbg_print_fru_cb(ipmi_entity_t *ent, void *cb_data) { char *head = cb_data; struct ohoi_fru_layout layout; get_fru_layout(ipmi_entity_get_fru(ent), &layout); print_fru_layout(head, &layout); } #endif static void dbg_print_fru(char *head, ipmi_entity_id_t e_id) { #if 0 // OpenIPMI segfaults. need to be investigated if (!getenv("OHOI_TRACE_FRU") && !IHOI_TRACE_ALL) { return; } ipmi_entity_pointer_cb(e_id, dbg_print_fru_cb, head); #endif return; } static unsigned char get_areatype_presence(struct ohoi_inventory_info *i_info, SaHpiIdrAreaTypeT areatype) { switch (areatype) { case SAHPI_IDR_AREATYPE_BOARD_INFO: return i_info->bi; case SAHPI_IDR_AREATYPE_PRODUCT_INFO: return i_info->pi; case SAHPI_IDR_AREATYPE_CHASSIS_INFO: return i_info->ci; case SAHPI_IDR_AREATYPE_OEM: return i_info->oem; case SAHPI_IDR_AREATYPE_INTERNAL_USE: return i_info->iu; default: err("wrong area type 0x%x", areatype); return (unsigned char)0; } } static unsigned char get_area_presence(struct ohoi_inventory_info *i_info, SaHpiEntryIdT areaid) { switch (areaid) { case OHOI_BOARD_INFO_AREA_ID: return i_info->bi; case OHOI_PRODUCT_INFO_AREA_ID: return i_info->pi; case OHOI_CHASSIS_INFO_AREA_ID: return i_info->ci; case OHOI_INTERNAL_USE_AREA_ID: return i_info->iu; default: if (areaid < OHOI_AREA_FIRST_ID) { err("wrong area id 0x%x", areaid); return 0; } if (areaid > OHOI_AREA_LAST_ID(i_info)) { err("wrong area id 0x%x", areaid); return (unsigned char)0; } return 1; } } static void set_area_presence(struct ohoi_inventory_info *i_info, SaHpiIdrAreaTypeT areatype) { switch (areatype) { case SAHPI_IDR_AREATYPE_BOARD_INFO: i_info->bi = SAHPI_LANG_ENGLISH; i_info->bi_fld_msk = 0; return; case SAHPI_IDR_AREATYPE_PRODUCT_INFO: i_info->pi = SAHPI_LANG_ENGLISH; i_info->pi_fld_msk = 0; return; case SAHPI_IDR_AREATYPE_CHASSIS_INFO: i_info->ci = 1; i_info->ci_fld_msk = 0; return; case SAHPI_IDR_AREATYPE_OEM: i_info->oem = 1; return; default: return; } } static void set_field_presence(struct ohoi_inventory_info *i_info, SaHpiIdrAreaTypeT areatype, SaHpiIdrFieldTypeT fieldtype) { switch (areatype) { case SAHPI_IDR_AREATYPE_BOARD_INFO: i_info->bi = SAHPI_LANG_ENGLISH; i_info->bi_fld_msk |= (1 << fieldtype); return; case SAHPI_IDR_AREATYPE_PRODUCT_INFO: i_info->pi = SAHPI_LANG_ENGLISH; i_info->pi_fld_msk |= (1 << fieldtype); return; case SAHPI_IDR_AREATYPE_CHASSIS_INFO: i_info->ci_fld_msk |= (1 << fieldtype); return; case SAHPI_IDR_AREATYPE_OEM: i_info->oem = 1; return; default: return; } } static int field_present(struct ohoi_inventory_info *fru, SaHpiEntryIdT areaid, SaHpiEntryIdT fieldid) { SaHpiUint32T nf = 0; unsigned int msk; unsigned int cust_num; struct ohoi_area_data *area; if (fieldid < OHOI_FIELD_FIRST_ID) { return 0; } switch (areaid) { case OHOI_BOARD_INFO_AREA_ID: msk = fru->bi_fld_msk; cust_num = fru->bi_custom_num; break; case OHOI_PRODUCT_INFO_AREA_ID: msk = fru->pi_fld_msk; cust_num = fru->pi_custom_num; break; case OHOI_CHASSIS_INFO_AREA_ID: msk = fru->ci_fld_msk; cust_num = fru->ci_custom_num; break; case SAHPI_IDR_AREATYPE_INTERNAL_USE: return fru->iu; default: if (areaid < OHOI_AREA_FIRST_ID) { err("wrong area id 0x%x", areaid); return 0; } if (areaid > OHOI_AREA_LAST_ID(fru)) { err("wrong area id 0x%x", areaid); return 0; } if (fru->oem_areas) { nf = fru->oem_fields_num; } else { nf = ohoi_atca_oem_area_fields_num(fru, areaid); } return (fieldid <= nf); } area = &areas[areaid - 1]; if (fieldid <= OHOI_FIELD_NUM(area)) { return ((1 << (area->fields[fieldid - 1].fieldtype)) & msk); //return (msk & (1 << (fieldid -1))); } return (fieldid <= cust_num + OHOI_FIELD_NUM(area)); } static void unset_area_presence(struct ohoi_inventory_info *i_info, SaHpiIdrAreaTypeT areatype) { switch (areatype) { case SAHPI_IDR_AREATYPE_BOARD_INFO: i_info->bi = 0; i_info->bi_fld_msk = 0; i_info->bi_custom_num = 0; return; case SAHPI_IDR_AREATYPE_PRODUCT_INFO: i_info->pi = 0; i_info->pi_fld_msk = 0; i_info->pi_custom_num = 0; return; case SAHPI_IDR_AREATYPE_OEM: i_info->oem = 0; i_info->oem_fields_num = 0; return; case SAHPI_IDR_AREATYPE_CHASSIS_INFO: i_info->ci = 0; i_info->ci_fld_msk = 0; i_info->ci_custom_num = 0; return; default: return; } } static int get_first_area(struct ohoi_resource_info *ohoi_res_info, SaHpiIdrAreaTypeT areatype) { int i; for (i = OHOI_AREA_FIRST_ID; i < FIRST_OEM_AREA_NUM; i++) { if ((areatype != SAHPI_IDR_AREATYPE_UNSPECIFIED) && (areas[i - 1].areatype != areatype)) { continue; } if (get_area_presence(ohoi_res_info->fru, i)) { return i; } } return OHOI_AREA_EMPTY_ID; } static int get_first_field(struct ohoi_area_data *area, struct ohoi_inventory_info *fru) { int i; unsigned int *msk; switch (area->areatype) { case SAHPI_IDR_AREATYPE_INTERNAL_USE: return 1; case SAHPI_IDR_AREATYPE_CHASSIS_INFO: msk = &fru->ci_fld_msk; break; case SAHPI_IDR_AREATYPE_BOARD_INFO: msk = &fru->bi_fld_msk; break; case SAHPI_IDR_AREATYPE_PRODUCT_INFO: msk = &fru->pi_fld_msk; break; default: return OHOI_FIELD_EMPTY_ID; } for (i = 0; i < OHOI_FIELD_NUM(area); i++) { if ((1 << area->fields[i].fieldtype) & *msk) { return (i + 1); } } return OHOI_FIELD_EMPTY_ID; } static int get_first_typed_field(struct ohoi_area_data *area, SaHpiIdrFieldTypeT fieldtype, struct ohoi_inventory_info *fru) { int i; unsigned int *msk; switch (area->areatype) { case SAHPI_IDR_AREATYPE_INTERNAL_USE: return 1; case SAHPI_IDR_AREATYPE_CHASSIS_INFO: msk = &fru->ci_fld_msk; break; case SAHPI_IDR_AREATYPE_BOARD_INFO: msk = &fru->bi_fld_msk; break; case SAHPI_IDR_AREATYPE_PRODUCT_INFO: msk = &fru->pi_fld_msk; break; default: return OHOI_FIELD_EMPTY_ID; } if (!((1 << fieldtype) & *msk)) { return OHOI_FIELD_EMPTY_ID; } for (i = 0; i < OHOI_FIELD_NUM(area); i++) { if (area->fields[i].fieldtype == fieldtype) { return (i + 1); } } return OHOI_FIELD_EMPTY_ID; } SaHpiTextTypeT convert_to_hpi_data_type(enum ipmi_str_type_e type) { switch (type) { case IPMI_ASCII_STR: return SAHPI_TL_TYPE_TEXT; case IPMI_UNICODE_STR: return SAHPI_TL_TYPE_UNICODE; case IPMI_BINARY_STR: return SAHPI_TL_TYPE_BINARY; } return SAHPI_TL_TYPE_BINARY; } static SaErrorT get_str_type(SaHpiTextBufferT *tb, SaHpiLanguageT lang, enum ipmi_str_type_e *type) { switch (tb->DataType) { case SAHPI_TL_TYPE_BINARY: *type = IPMI_BINARY_STR; return SA_OK; case SAHPI_TL_TYPE_TEXT: case SAHPI_TL_TYPE_ASCII6: case SAHPI_TL_TYPE_BCDPLUS: *type = IPMI_ASCII_STR; break; case SAHPI_TL_TYPE_UNICODE: *type = IPMI_UNICODE_STR; break; default: err("unknown DataType %d", tb->DataType); return SA_ERR_HPI_INVALID_DATA; } if (lang && (tb->Language != lang)) { err("unexpected language %d. expected %d", tb->Language, lang); return SA_ERR_HPI_INVALID_DATA; } return SA_OK; } static SaHpiLanguageT get_language(struct ohoi_inventory_info *i_info, SaHpiIdrAreaTypeT areatype) { switch (areatype) { case SAHPI_IDR_AREATYPE_BOARD_INFO: return i_info->bi; case SAHPI_IDR_AREATYPE_PRODUCT_INFO: return i_info->pi; default: return SAHPI_LANG_UNDEF; } } struct ohoi_get_field { struct ohoi_field_data *data; SaHpiIdrFieldT *field; int done; SaErrorT rv; }; static void get_field(ipmi_entity_t *ent, void *cb_data) { int rv; unsigned int len; enum ipmi_str_type_e type; ipmi_fru_t *fru; int (*get_len)(ipmi_entity_t *, unsigned int*); int (*get_data)(ipmi_entity_t *, char*, unsigned int*); struct ohoi_get_field *gf = cb_data; struct ohoi_field_data *data = gf->data; SaHpiIdrFieldT *field = gf->field; get_len = data->get_len; get_data = data->get_data; field->Type = data->fieldtype; field->ReadOnly = SAHPI_FALSE; fru = ipmi_entity_get_fru(ent); if (fru == NULL) { err("Bug: entity without fru"); gf->rv = SA_ERR_HPI_INTERNAL_ERROR; gf->done = 1; return; } rv = data->get_type(fru, &type); if (rv) { err("Could not get data type = %d. set SAHPI_TL_TYPE_BINARY", rv); field->Field.DataType = SAHPI_TL_TYPE_BINARY; } else { field->Field.DataType = convert_to_hpi_data_type(type); } field->Field.Language = SAHPI_LANG_ENGLISH; field->Field.DataLength = 0; rv = get_len(ent, &len); if (rv) { err("Error on get_len: %d", rv); gf->rv = SA_ERR_HPI_NOT_PRESENT; gf->done = 1; return; } len++; /* if ASCII string (yes), add one for NULL char. */ if (len > SAHPI_MAX_TEXT_BUFFER_LENGTH) len = SAHPI_MAX_TEXT_BUFFER_LENGTH; rv = get_data(ent, (void *)&field->Field.Data[0], &len); if (!rv) { field->Field.DataLength = len; } else { err("Error on get_data: %d", rv); gf->rv = SA_ERR_HPI_INTERNAL_ERROR; } gf->done = 1; } struct oem_idr_field { SaHpiIdrFieldT *field; SaErrorT rv; int done; }; static void get_oem_idr_field_cb(ipmi_entity_t *ent, void *cbdata) { struct oem_idr_field *oif = cbdata; int rv; unsigned int len; unsigned char ver, type; unsigned int f_id = oif->field->FieldId - 1; rv = ipmi_entity_get_multi_record_data_len(ent, f_id, &len); if (rv) { err("ipmi_entity_get_multi_record_data_len = %d", rv); oif->rv = SA_ERR_HPI_NOT_PRESENT; oif->done = 1; return; } rv = ipmi_entity_get_multi_record_type(ent, f_id, &type); if (rv) { err("ipmi_entity_get_multi_record_type = %d", rv); oif->rv = SA_ERR_HPI_NOT_PRESENT; oif->done = 1; return; } rv = ipmi_entity_get_multi_record_format_version(ent, f_id, &ver); if (rv) { err("ipmi_entity_get_multi_record_format_version = %d", rv); oif->rv = SA_ERR_HPI_NOT_PRESENT; oif->done = 1; return; } if (len > SAHPI_MAX_TEXT_BUFFER_LENGTH - 2) { len = SAHPI_MAX_TEXT_BUFFER_LENGTH - 2; } rv = ipmi_entity_get_multi_record_data(ent, f_id, &oif->field->Field.Data[2], &len); if (rv) { err("ipmi_entity_get_multi_record_data = %d", rv); oif->rv = SA_ERR_HPI_NOT_PRESENT; oif->done = 1; return; } oif->field->Field.Data[0] = type; oif->field->Field.Data[1] = ver; oif->field->Field.DataLength = len + 2; oif->field->Field.DataType = SAHPI_TL_TYPE_BINARY; oif->rv = SA_OK; oif->done = 1; } static SaErrorT get_oem_idr_field(struct oh_handler_state *handler, struct ohoi_resource_info *ohoi_res_info, SaHpiEntryIdT *nextfieldid, SaHpiIdrFieldT *field) { struct ohoi_inventory_info *i_info = ohoi_res_info->fru; struct oem_idr_field oif; SaHpiEntryIdT fieldid = field->FieldId; int rv; if (fieldid < OHOI_FIELD_FIRST_ID) { err("fieldid(%d) < 1", fieldid); return SA_ERR_HPI_NOT_PRESENT; } if (i_info->oem_areas) { // atca oem area mapping. special case return ohoi_atca_oem_area_field(handler, ohoi_res_info, nextfieldid, field); } if (fieldid > i_info->oem_fields_num) { err("fieldid(%d) > i_info->oem_fields_num(%d)", fieldid, i_info->oem_fields_num); return SA_ERR_HPI_NOT_PRESENT; } field->Type = SAHPI_IDR_FIELDTYPE_UNSPECIFIED; oif.done = 0; oif.rv = SA_OK; oif.field = field; rv = ipmi_entity_pointer_cb(ohoi_res_info->u.entity.entity_id, get_oem_idr_field_cb, &oif); if (rv) { err("ipmi_entity_pointer_cb returned %d", rv); oif.rv = SA_ERR_HPI_INTERNAL_ERROR; } else { oif.rv = ohoi_loop(&oif.done, handler->data); } if (oif.rv != SA_OK) { err("get_oem_idr_field. rv = %d", oif.rv); } else if (fieldid < i_info->oem_fields_num) { *nextfieldid = fieldid + 1; } else { *nextfieldid = SAHPI_LAST_ENTRY; } return oif.rv; } struct ohoi_custom_field { int (*get_len)(ipmi_fru_t *, unsigned int, unsigned int*); int (*get_data)(ipmi_fru_t *, unsigned int, char*, unsigned int*); SaHpiIdrFieldT *field; unsigned int num; SaErrorT rv; int done; }; static void get_custom_field_cb(ipmi_entity_t *ent, void *cbdata) { struct ohoi_custom_field *cf = cbdata; ipmi_fru_t *fru; SaHpiIdrFieldT *field = cf->field; unsigned int len; int rv; cf->done = 1; fru = ipmi_entity_get_fru(ent); if (fru == NULL) { err("Bug: entity without fru"); cf->rv = SA_ERR_HPI_INTERNAL_ERROR; return; } field->Field.DataType = SAHPI_TL_TYPE_BINARY; field->Field.Language = SAHPI_LANG_ENGLISH; field->Field.DataLength = 0; rv = cf->get_len(fru, cf->num, &len); if (rv) { err("Error on get_len: %d", rv); cf->rv = SA_ERR_HPI_NOT_PRESENT; return; } dbg("custom field %d len = %d", cf->num, len); if (len > SAHPI_MAX_TEXT_BUFFER_LENGTH) len = SAHPI_MAX_TEXT_BUFFER_LENGTH; rv = cf->get_data(fru, cf->num, (void *)&field->Field.Data[0], &len); if (!rv) { dbg("custom field len = %d", len); field->Field.DataLength = len; } else { err("Error on get_data: %d", rv); cf->rv = SA_ERR_HPI_INTERNAL_ERROR; } } static SaErrorT get_custom_field(struct oh_handler_state *handler, struct ohoi_resource_info *ohoi_res_info, SaHpiEntryIdT lastid, SaHpiEntryIdT fieldid, SaHpiEntryIdT *nextfieldid, SaHpiIdrFieldT *field) { unsigned int num; struct ohoi_custom_field cf; int rv; switch(get_areatype_by_id(field->AreaId, ohoi_res_info->fru)) { case SAHPI_IDR_AREATYPE_CHASSIS_INFO: cf.get_len = ipmi_fru_get_chassis_info_custom_len; cf.get_data = ipmi_fru_get_chassis_info_custom; num = ohoi_res_info->fru->ci_custom_num; break; case SAHPI_IDR_AREATYPE_BOARD_INFO: cf.get_len = ipmi_fru_get_board_info_custom_len; cf.get_data = ipmi_fru_get_board_info_custom; num = ohoi_res_info->fru->bi_custom_num; break; case SAHPI_IDR_AREATYPE_PRODUCT_INFO: cf.get_len =ipmi_fru_get_product_info_custom_len; cf.get_data =ipmi_fru_get_product_info_custom; //get_type = ipmi_fru_get_product_info_custom_type num = ohoi_res_info->fru->pi_custom_num; break; default: err("bug: area %d; wrong areatype %x", field->AreaId, get_areatype_by_id( field->AreaId, ohoi_res_info->fru)); return SA_ERR_HPI_NOT_PRESENT; } if (fieldid - lastid > num) { err("fieldid(%d) - lastid(%d) > num(%d)", fieldid, lastid, num); return SA_ERR_HPI_NOT_PRESENT; } cf.done = 0; cf.rv = SA_OK; cf.num = fieldid - lastid - 1; cf.field = field; rv = ipmi_entity_pointer_cb(ohoi_res_info->u.entity.entity_id, get_custom_field_cb, &cf); if (rv) { err("ipmi_entity_pointer_cb returned %d", rv); cf.rv = SA_ERR_HPI_INTERNAL_ERROR; } else { cf.rv = ohoi_loop(&cf.done, handler->data); } if (cf.rv != SA_OK) { err("error after get_custom_field_cb cf.rv =%d", cf.rv); return cf.rv; } field->Field.DataType = SAHPI_TL_TYPE_TEXT; // FIXME field->Field.Language = SAHPI_LANG_ENGLISH; // FIXME if (fieldid - lastid < num) { *nextfieldid = fieldid + 1; } else { *nextfieldid = SAHPI_LAST_ENTRY; } return SA_OK; } SaErrorT ohoi_get_idr_info(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrInfoT *idrinfo) { struct oh_handler_state *handler = hnd; struct ohoi_resource_info *ohoi_res_info; struct ohoi_inventory_info *fru; SaHpiUint32T na = 0; OHOI_CHECK_RPT_CAP_IDR(); ohoi_res_info = oh_get_resource_data(handler->rptcache, rid); if (ohoi_res_info->fru == NULL) { err("bug: resource without fru?"); return SA_ERR_HPI_CAPABILITY; } if (idrid != OHOI_IDR_DEFAULT_ID) { err("drid(%d) != OHOI_IDR_DEFAULT_ID", idrid); return SA_ERR_HPI_NOT_PRESENT; } fru = ohoi_res_info->fru; dbg_print_fru("get idr info", ohoi_res_info->u.entity.entity_id); g_mutex_lock(fru->mutex); idrinfo->IdrId = OHOI_IDR_DEFAULT_ID; idrinfo->UpdateCount = fru->update_count; idrinfo->ReadOnly = SAHPI_FALSE; if (fru->iu) { na++; } if (fru->ci) { na++; } if (fru->bi) { na++; } if (fru->pi) { na++; } if (fru->oem) { na++; } idrinfo->NumAreas = na; g_mutex_unlock(fru->mutex); return SA_OK; } static SaHpiUint32T get_num_fields(struct ohoi_inventory_info *fru, SaHpiEntryIdT areaid) { SaHpiUint32T nf = 0; unsigned int msk; unsigned int cust_num; int i; if (areaid < OHOI_AREA_FIRST_ID || areaid > OHOI_AREA_LAST_ID(fru)) { err("wrong areaid %d, last area id %d", areaid, OHOI_AREA_LAST_ID(fru)); return 0; } switch (areaid) { case OHOI_BOARD_INFO_AREA_ID: msk = fru->bi_fld_msk; cust_num = fru->bi_custom_num; break; case OHOI_PRODUCT_INFO_AREA_ID: msk = fru->pi_fld_msk; cust_num = fru->pi_custom_num; break; case OHOI_CHASSIS_INFO_AREA_ID: msk = fru->ci_fld_msk; cust_num = fru->ci_custom_num; break; case SAHPI_IDR_AREATYPE_INTERNAL_USE: return 1; default: if (fru->oem_areas == NULL) { return fru->oem_fields_num; } return ohoi_atca_oem_area_fields_num(fru, areaid); } msk &= ~(1 << SAHPI_IDR_FIELDTYPE_CUSTOM); for (i = 0; i < sizeof (msk) * 8; i++) { if (msk & 1) { nf++; } msk = (msk >> 1); } nf += cust_num; return nf; } SaErrorT ohoi_get_idr_area_header(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrAreaTypeT areatype, SaHpiEntryIdT areaid, SaHpiEntryIdT *nextareaid, SaHpiIdrAreaHeaderT *header) { struct oh_handler_state *handler = hnd; struct ohoi_resource_info *ohoi_res_info; SaHpiEntryIdT tmp_id; struct ohoi_inventory_info *fru; OHOI_CHECK_RPT_CAP_IDR(); ohoi_res_info = oh_get_resource_data(handler->rptcache, rid); if (ohoi_res_info->fru == NULL) { err("bug: resource without fru?"); return SA_ERR_HPI_CAPABILITY; } fru = ohoi_res_info->fru; g_mutex_lock(fru->mutex); if ((areatype == SAHPI_IDR_AREATYPE_UNSPECIFIED) && (areaid == SAHPI_FIRST_ENTRY)) { for (tmp_id = OHOI_AREA_FIRST_ID; tmp_id <= OHOI_AREA_LAST_ID(fru); tmp_id++) { if (get_area_presence(fru, tmp_id)) { break; } } if (tmp_id > FIRST_OEM_AREA_NUM) { err("tmp_id > OHOI_AREA_LAST_ID"); g_mutex_unlock(fru->mutex); return SA_ERR_HPI_NOT_PRESENT; } areaid = tmp_id; } else if ((areatype != SAHPI_IDR_AREATYPE_UNSPECIFIED) && (areaid == SAHPI_FIRST_ENTRY)) { areaid = get_first_area(ohoi_res_info, areatype); if (areaid == OHOI_AREA_EMPTY_ID) { err("areaid == OHOI_AREA_EMPTY_ID"); g_mutex_unlock(fru->mutex); return SA_ERR_HPI_NOT_PRESENT; } } else if ((areatype == SAHPI_IDR_AREATYPE_UNSPECIFIED) && (areaid != SAHPI_FIRST_ENTRY)) { if (!get_area_presence(fru, areaid)) { err("area %d not present", areaid); g_mutex_unlock(fru->mutex); return SA_ERR_HPI_NOT_PRESENT; } } else if ((areatype != SAHPI_IDR_AREATYPE_UNSPECIFIED) && (areaid != SAHPI_FIRST_ENTRY)) { if (get_areatype_by_id(areaid, fru) != areatype) { err("area %d not present or type(0x%x) dismatch", areaid, areatype); g_mutex_unlock(fru->mutex); return SA_ERR_HPI_NOT_PRESENT; } } if (areatype != SAHPI_IDR_AREATYPE_UNSPECIFIED) { if (areatype == SAHPI_IDR_AREATYPE_OEM) { if (areaid < OHOI_AREA_LAST_ID(fru)) { *nextareaid = areaid + 1; } else { *nextareaid = SAHPI_LAST_ENTRY; } } else { *nextareaid = SAHPI_LAST_ENTRY; } } else { for (tmp_id = areaid + 1; tmp_id <= OHOI_AREA_LAST_ID(fru); tmp_id++) { if (get_area_presence(fru, tmp_id)) { break; } } if (tmp_id > OHOI_AREA_LAST_ID(fru)) { *nextareaid = SAHPI_LAST_ENTRY; } else { *nextareaid = tmp_id; } } header->AreaId = areaid; header->Type = get_areatype_by_id(areaid, fru); if (fru->oem_areas && areaid >= FIRST_OEM_AREA_NUM) { header->ReadOnly = SAHPI_TRUE; } else { header->ReadOnly = (header->Type == SAHPI_IDR_AREATYPE_INTERNAL_USE) ? SAHPI_TRUE : SAHPI_FALSE; } header->NumFields = get_num_fields(fru, areaid); g_mutex_unlock (fru->mutex); return SA_OK; } static int try_to_alloc_room_for_area(ipmi_fru_t *fru, SaHpiIdrAreaTypeT areatype, unsigned int *off) { struct ohoi_fru_layout layout; unsigned int len; unsigned int ipmi_atype; unsigned int i; unsigned int beg = 8; // common header length unsigned int end; struct ohoi_area_layout *al; int r; len = areas[get_first_areaid_by_type(areatype) - 1].empty_len; if (get_fru_layout(fru, &layout)) { err("could not get fru layout"); return 1; } print_fru_layout("Initial layout", &layout); if (len > layout.free_len) { al = &layout.areas[IPMI_FRU_FTR_MULTI_RECORD_AREA]; if (al->off != 0 && (len <= layout.free_len + al->len - ((al->used_len +7)&~7))) { err("Decrease len of OEM_AREA from %d to %d", al->len, (al->used_len +7)&~7); /* r = ipmi_fru_area_set_length(fru, IPMI_FRU_FTR_MULTI_RECORD_AREA, (al->used_len +7)&~7); if (r != 0) { err("ipmi_fru_area_set_length() returned %d", r); return 1; } */ layout.free_len += al->len - ((al->used_len +7)&~7); al->len = (al->used_len +7)&~7; print_fru_layout("After truncate OEM AREA layout", &layout); } } if (len > layout.free_len) { err("len(%d) < layout->free_len(%d)", len, layout.free_len); return 1; } ipmi_atype = get_ipmi_areatype(areatype); for (i = 0; i < ipmi_atype; i++) { // try to up previous areas al = &layout.areas[i]; if (al->off == 0) { continue; } if (beg < al->off) { r = ipmi_fru_area_set_offset(fru, i, beg); if (r != 0) { err("ipmi_fru_area_set_offset for area %d = %d", i, r); return 1; } al->off = beg; } beg = al->off + al->len; } end =layout.len - 8; if ((ipmi_atype + 1) == IPMI_FRU_FTR_NUMBER) { if (beg + len <= end) { *off = beg; print_fru_layout("After moving above areas layout", &layout); return 0; } else { err("STRANGE. There is still not enough room."); return 1; } } for (i = IPMI_FRU_FTR_NUMBER - 1; i > ipmi_atype; i--) { al = &layout.areas[i]; if (al->off == 0) { continue; } if (al->off + al->len < end) { r = ipmi_fru_area_set_offset(fru, i, end - al->len); if (r != 0) { err("ipmi_fru_area_set_offset to %d for area %d = %d", end - al->len, i, r); return 1; } } al->off = end - al->len; end = al->off; } print_fru_layout("Result Layout", &layout); if (beg + len > end) { err("STRANGE. There is still not enough room."); return 1; } *off = beg; return 0; } /************** ADD AREA ************/ struct ohoi_add_area { struct ohoi_resource_info *res_info; struct oh_handler_state *handler; SaHpiIdrAreaTypeT areatype; int done; SaErrorT rv; }; static void add_idr_area_cb(ipmi_entity_t *ent, void *cb_data) { struct ohoi_add_area *ar_add = cb_data; ipmi_fru_t *fru; unsigned int off; int r; fru = ipmi_entity_get_fru(ent); if (try_to_alloc_room_for_area(fru, ar_add->areatype, &off)) { ar_add->rv = SA_ERR_HPI_OUT_OF_SPACE; ar_add->done = 1; return; } r = ipmi_fru_add_area(fru, get_ipmi_areatype(ar_add->areatype), off, areas[get_first_areaid_by_type(ar_add->areatype) - 1].empty_len); if (r) { err("ipmi_fru_add_area(fru, 0x%x, 0x%x, 0x%x) return %d", get_ipmi_areatype(ar_add->areatype), off, areas[get_first_areaid_by_type(ar_add->areatype) - 1].empty_len, r); ar_add->rv = SA_ERR_HPI_INTERNAL_ERROR; } ar_add->done = 1; } SaErrorT ohoi_add_idr_area(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrAreaTypeT areatype, SaHpiEntryIdT *areaid) { struct oh_handler_state *handler = hnd; struct ohoi_resource_info *ohoi_res_info; struct ohoi_inventory_info *fru; int rv; SaErrorT ret; struct ohoi_add_area ar_add; OHOI_CHECK_RPT_CAP_IDR(); ohoi_res_info = oh_get_resource_data(handler->rptcache, rid); if (ohoi_res_info->fru == NULL) { err("bug: resource without fru?"); return SA_ERR_HPI_CAPABILITY; } fru = ohoi_res_info->fru; g_mutex_lock(fru->mutex); if (get_areatype_presence(fru, areatype)) { g_mutex_unlock(fru->mutex); err("area 0x%x already present", areatype); return SA_ERR_HPI_INVALID_DATA; } ar_add.res_info = ohoi_res_info; ar_add.handler = handler; ar_add.areatype = areatype; ar_add.done = 0; ar_add.rv = SA_OK; rv = ipmi_entity_pointer_cb(ohoi_res_info->u.entity.entity_id, add_idr_area_cb, &ar_add); if (rv) { err("ipmi_entity_pointer_cb returned %d", rv); g_mutex_unlock (fru->mutex); return SA_ERR_HPI_INTERNAL_ERROR; } ret = ohoi_loop(&ar_add.done, handler->data); if (ret != SA_OK) { err("ohoi_loop = %d", ret); g_mutex_unlock(fru->mutex); return ret; } if (ar_add.rv != SA_OK) { err("callback failed. ar_add.rv = %d", ar_add.rv); g_mutex_unlock(fru->mutex); return ar_add.rv; } ret = ohoi_fru_write(handler->data, ohoi_res_info->u.entity.entity_id); if (ret == SA_OK) { set_area_presence(fru, areatype); ohoi_res_info->fru->update_count++; *areaid = get_first_areaid_by_type(areatype); } g_mutex_unlock (fru->mutex); return ret; } /************** DELETE AREA ******************/ struct ohoi_del_area { SaHpiIdrAreaTypeT areatype; struct oh_handler_state *handler; int done; SaErrorT rv; }; static void del_idr_area_cb(ipmi_entity_t *ent, void *cb_data) { struct ohoi_del_area *ar_del = cb_data; ipmi_fru_t *fru; int r; fru = ipmi_entity_get_fru(ent); ar_del->done = 1; r = ipmi_fru_delete_area(fru, get_ipmi_areatype(ar_del->areatype)); if (r) { err("ipmi_fru_del_area return %d", r); ar_del->rv = SA_ERR_HPI_INTERNAL_ERROR; return; } ar_del->done = 1; } SaErrorT ohoi_del_idr_area(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiEntryIdT areaid) { struct oh_handler_state *handler = hnd; struct ohoi_resource_info *ohoi_res_info; struct ohoi_inventory_info *fru; int rv; SaErrorT ret; struct ohoi_del_area ar_del; SaHpiIdrAreaTypeT areatype; OHOI_CHECK_RPT_CAP_IDR(); ohoi_res_info = oh_get_resource_data(handler->rptcache, rid); if (ohoi_res_info->fru == NULL) { err("bug: resource without fru?"); return SA_ERR_HPI_CAPABILITY; } fru = ohoi_res_info->fru; g_mutex_lock(fru->mutex); if (areaid == SAHPI_FIRST_ENTRY) { areaid = get_first_area(ohoi_res_info, SAHPI_IDR_AREATYPE_UNSPECIFIED); } if (!get_area_presence(fru, areaid)) { g_mutex_unlock(fru->mutex); return SA_ERR_HPI_NOT_PRESENT; } areatype = get_areatype_by_id(areaid, fru); if (areatype == OHOI_AREA_EMPTY_ID) { err("areatype == OHOI_AREA_EMPTY_ID"); g_mutex_unlock(fru->mutex); return SA_ERR_HPI_INVALID_PARAMS; } if (areatype == SAHPI_IDR_AREATYPE_INTERNAL_USE) { g_mutex_unlock(fru->mutex); return SA_ERR_HPI_READ_ONLY; } if ((areatype == SAHPI_IDR_AREATYPE_OEM) && fru->oem_areas) { g_mutex_unlock(fru->mutex); return SA_ERR_HPI_READ_ONLY; } ar_del.areatype = areatype; ar_del.handler = handler; ar_del.done = 0; ar_del.rv = SA_OK; rv = ipmi_entity_pointer_cb(ohoi_res_info->u.entity.entity_id, del_idr_area_cb, &ar_del); if (rv) { err("ipmi_entity_pointer_cb returned %d", rv); g_mutex_unlock (fru->mutex); ar_del.rv = SA_ERR_HPI_INTERNAL_ERROR; } ret = ohoi_loop(&ar_del.done, handler->data); if (ret != SA_OK) { err("ohoi_loop = %d", ret); g_mutex_unlock(fru->mutex); return ret; } if (ar_del.rv != SA_OK) { err("ohoi_del_idr_field failed. rv = %d", ar_del.rv); g_mutex_unlock(fru->mutex); return ar_del.rv; } ret = ohoi_fru_write(handler->data, ohoi_res_info->u.entity.entity_id); if (ret == SA_OK) { unset_area_presence(fru, areatype); ohoi_res_info->fru->update_count++; } g_mutex_unlock (fru->mutex); return ret; } /**************** GET FIELD ****************/ static SaHpiEntryIdT get_nextfield(struct ohoi_inventory_info *i_info, struct ohoi_area_data *area_data, SaHpiEntryIdT fieldid) { unsigned int msk; unsigned int num; SaHpiEntryIdT i; switch (area_data->areatype) { case SAHPI_IDR_AREATYPE_INTERNAL_USE: return SAHPI_LAST_ENTRY; case SAHPI_IDR_AREATYPE_CHASSIS_INFO: msk = i_info->ci_fld_msk; num = i_info->ci_custom_num; break; case SAHPI_IDR_AREATYPE_BOARD_INFO: msk = i_info->bi_fld_msk; num = i_info->bi_custom_num; break; case SAHPI_IDR_AREATYPE_PRODUCT_INFO: msk = i_info->pi_fld_msk; num = i_info->pi_custom_num; break; case SAHPI_IDR_AREATYPE_OEM: msk = 0; num = 0; break; default: err("bug: wrong areatype %x", area_data->areatype); return SA_ERR_HPI_INTERNAL_ERROR; } dbg("area = %x; fieldid = %d; msk = %x; num = %x", area_data->areatype, fieldid, msk, num); for (i = 1; fieldid + i <= OHOI_FIELD_LAST_ID(area_data); i++) { if ((1 << (area_data->fields[fieldid + i - 1].fieldtype)) & msk) { err("return %d for not custom field %d, type %d", fieldid + i, fieldid, area_data->fields[fieldid + i - 1].fieldtype); return fieldid + i; } } if (((1 << SAHPI_IDR_FIELDTYPE_CUSTOM) & msk) && (fieldid < OHOI_FIELD_LAST_ID(area_data) + num)) { err("return %d for custom field", fieldid + 1); return fieldid + 1; } err("return SAHPI_LAST_ENTRY"); return SAHPI_LAST_ENTRY; } SaErrorT ohoi_get_idr_field(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiEntryIdT areaid, SaHpiIdrFieldTypeT fieldtype, SaHpiEntryIdT fieldid, SaHpiEntryIdT *nextfieldid, SaHpiIdrFieldT *field) { struct oh_handler_state *handler = hnd; struct ohoi_resource_info *ohoi_res_info; ipmi_entity_id_t ent_id; struct ohoi_field_data *field_data; struct ohoi_area_data *area_data; struct ohoi_get_field gf; struct ohoi_inventory_info *fru; int rv; SaErrorT ret; OHOI_CHECK_RPT_CAP_IDR(); if ((fieldid != SAHPI_FIRST_ENTRY) && (fieldid < OHOI_FIELD_FIRST_ID)) { err("fieldid(%d) < 1", fieldid); return SA_ERR_HPI_NOT_PRESENT; } ohoi_res_info = oh_get_resource_data(handler->rptcache, rid); if (!(ohoi_res_info->type & OHOI_RESOURCE_ENTITY)) { err("Bug: try to get fru in unsupported resource"); return SA_ERR_HPI_INVALID_CMD; } fru = ohoi_res_info->fru; if (fru == NULL) { err("bug: resource without fru?"); return SA_ERR_HPI_CAPABILITY; } ent_id = ohoi_res_info->u.entity.entity_id; if (areaid == SAHPI_FIRST_ENTRY) { areaid = get_first_area(ohoi_res_info, SAHPI_IDR_AREATYPE_UNSPECIFIED); if (areaid == OHOI_AREA_EMPTY_ID) { err("idr without areas?"); return SA_ERR_HPI_NOT_PRESENT; } } if (areaid > OHOI_AREA_LAST_ID(fru)) { err("areaid(%d) > OHOI_AREA_LAST_ID", areaid); return SA_ERR_HPI_NOT_PRESENT; } g_mutex_lock(fru->mutex); if (areaid >= FIRST_OEM_AREA_NUM) { // oem area is handled by special alghorithm if (fieldtype != SAHPI_IDR_FIELDTYPE_UNSPECIFIED && fieldtype != SAHPI_IDR_FIELDTYPE_CUSTOM) { err("fieldtype != UNSPECIFIED or CUSTOM"); g_mutex_unlock(fru->mutex); return SA_ERR_HPI_NOT_PRESENT; } if (fieldid ==SAHPI_FIRST_ENTRY) { fieldid = OHOI_FIELD_FIRST_ID; } field->FieldId = fieldid; field->AreaId = areaid; ret = get_oem_idr_field(handler, ohoi_res_info, nextfieldid, field); g_mutex_unlock(fru->mutex); if (ret != SA_OK) { err("get_oem_idr_field = %d", ret); } return ret; } area_data = &areas[areaid - 1]; field->AreaId = areaid; if ((fieldtype == SAHPI_IDR_FIELDTYPE_UNSPECIFIED) && (fieldid == SAHPI_FIRST_ENTRY)) { fieldid = get_first_field(area_data, fru); if (fieldid == OHOI_FIELD_EMPTY_ID) { err("fieldid == OHOI_FIELD_EMPTY_ID"); g_mutex_unlock(fru->mutex); return SA_ERR_HPI_NOT_PRESENT; } } else if ((fieldtype != SAHPI_IDR_FIELDTYPE_UNSPECIFIED) && (fieldid == SAHPI_FIRST_ENTRY)) { fieldid = get_first_typed_field(area_data, fieldtype, fru); if (fieldid == OHOI_FIELD_EMPTY_ID) { err("fieldid == OHOI_FIELD_EMPTY_ID"); g_mutex_unlock(fru->mutex); return SA_ERR_HPI_NOT_PRESENT; } } else if ((fieldtype == SAHPI_IDR_FIELDTYPE_UNSPECIFIED) && (fieldid != SAHPI_FIRST_ENTRY)) { if (!field_present(fru, areaid, fieldid)) { g_mutex_unlock(fru->mutex); err("field %d of area %d not present", fieldid, areaid); return SA_ERR_HPI_NOT_PRESENT; } if (fieldid > OHOI_FIELD_LAST_ID(area_data)) { err("area %x; fieldid(%u) >= " "OHOI_FIELD_LAST_ID(area_data)(%u)", area_data->areatype, fieldid, OHOI_FIELD_LAST_ID(area_data)); field->FieldId = fieldid; field->Type = SAHPI_IDR_FIELDTYPE_CUSTOM; field->ReadOnly = SAHPI_FALSE; //area_data->read_only; ret = get_custom_field(handler, ohoi_res_info, OHOI_FIELD_LAST_ID(area_data), fieldid, nextfieldid, field); g_mutex_unlock(fru->mutex); if (ret != SA_OK) { err("get_custom_field = %d", ret); } return ret; } } else if ((fieldtype != SAHPI_IDR_FIELDTYPE_UNSPECIFIED) && (fieldid != SAHPI_FIRST_ENTRY)) { if (fieldid > OHOI_FIELD_LAST_ID(area_data)) { if (fieldtype != SAHPI_IDR_FIELDTYPE_CUSTOM) { err("fieldtype(%d) != SAHPI_IDR_FIELDTYPE_CUSTOM", fieldtype); g_mutex_unlock(fru->mutex); return SA_ERR_HPI_NOT_PRESENT; } ret = get_custom_field(handler, ohoi_res_info, fieldid - OHOI_FIELD_LAST_ID(area_data), fieldid, nextfieldid, field); g_mutex_unlock(fru->mutex); return ret; } if (area_data->fields[fieldid - 1].fieldtype != fieldtype) { err("area_data->fields[fieldid - 1].fieldtype != fieldtype(%d != %d)", area_data->fields[fieldid - 1].fieldtype, fieldtype); g_mutex_unlock(fru->mutex); return SA_ERR_HPI_NOT_PRESENT; } } field_data = &area_data->fields[fieldid - 1]; if (area_data->areatype == SAHPI_IDR_AREATYPE_OEM) { if (fieldid < ohoi_res_info->fru->oem_fields_num - 1) { *nextfieldid = fieldid + 1; } else { *nextfieldid = SAHPI_LAST_ENTRY; } } else if ((fieldtype !=SAHPI_IDR_FIELDTYPE_UNSPECIFIED) && (fieldtype != SAHPI_IDR_FIELDTYPE_CUSTOM)) { *nextfieldid = SAHPI_LAST_ENTRY; } else { *nextfieldid = get_nextfield(ohoi_res_info->fru, area_data, fieldid); } field->FieldId = fieldid; field->Type = field_data->fieldtype; gf.field = field; gf.data = field_data; gf.rv = SA_OK; gf.done = 0; rv = ipmi_entity_pointer_cb(ent_id, get_field, &gf); if (rv) { g_mutex_unlock(fru->mutex); err("ipmi_entity_pointer_cb = %d", rv); return SA_ERR_HPI_INTERNAL_ERROR; } if (gf.rv != SA_OK) { err("get_field failed for rpt %d AreaId = %u, fildId = %u, type = %u", rid, areaid, fieldid, field_data->fieldtype); } else { gf.rv = ohoi_loop(&gf.done, handler->data); } if (gf.rv != SA_OK) { err("ohoi_loop = %d", gf.rv); g_mutex_unlock(fru->mutex); return gf.rv; } field->ReadOnly = SAHPI_FALSE; //area_data->read_only; if (field_data->lang == SAHPI_LANG_UNDEF) { field->Field.Language = get_language(ohoi_res_info->fru, area_data->areatype); } else { field->Field.Language = field_data->lang; } g_mutex_unlock (fru->mutex); return SA_OK; } /************* MODIFYING (ADD, SET, DELETE) FIELD **************/ static SaErrorT modify_inventory(SaHpiIdrFieldT *field, ipmi_entity_t *ent, struct ohoi_resource_info *res_info); struct ohoi_mod_field { SaHpiIdrFieldT *field; struct ohoi_resource_info *res_info; struct oh_handler_state *hnd; SaErrorT rv; int done; }; struct ohoi_del_field { SaHpiEntryIdT fieldid; SaHpiEntryIdT areaid; struct ohoi_resource_info *res_info; struct oh_handler_state *hnd; SaErrorT rv; int done; }; static void modify_inventoty_field_cb(ipmi_entity_t *ent, void *cbdata) { struct ohoi_mod_field *mf = cbdata; mf->rv = modify_inventory(mf->field, ent, mf->res_info); if (mf->rv != SA_OK) { err("modify_inventory failed. return %d", mf->rv); } mf->done = 1; } /************* SET FIELD *************/ SaErrorT ohoi_set_idr_field(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrFieldT *field) { struct oh_handler_state *handler = hnd; struct ohoi_resource_info *ohoi_res_info; struct ohoi_inventory_info *fru; struct ohoi_mod_field mf; struct ohoi_area_data *area; int rv; SaErrorT ret; OHOI_CHECK_RPT_CAP_IDR(); ohoi_res_info = oh_get_resource_data(handler->rptcache, rid); if (!(ohoi_res_info->type & OHOI_RESOURCE_ENTITY)) { err("Bug: try to get fru in unsupported resource"); return SA_ERR_HPI_INVALID_CMD; } fru = ohoi_res_info->fru; if (fru == NULL) { err("bug: resource without fru?"); return SA_ERR_HPI_CAPABILITY; } if (field->AreaId < OHOI_AREA_FIRST_ID){ err("wrong AreaId %d", field->AreaId); return SA_ERR_HPI_NOT_PRESENT; } if (field->AreaId > OHOI_AREA_LAST_ID(fru)){ err("wrong AreaId %d", field->AreaId); return SA_ERR_HPI_NOT_PRESENT; } if (fru->oem_areas && field->AreaId >= FIRST_OEM_AREA_NUM) { return SA_ERR_HPI_READ_ONLY; } area = &areas[field->AreaId - 1]; if (field->FieldId > OHOI_FIELD_LAST_ID(area)) { if (field->Type != SAHPI_IDR_FIELDTYPE_CUSTOM) { err("implementation restriction doesn't permit " "to change field type"); // return SA_ERR_HPI_INVALID_DATA; field->Type = SAHPI_IDR_FIELDTYPE_CUSTOM; } } else if (area->fields[field->FieldId - 1].fieldtype != field->Type) { err("implementation restriction doesn't permit " "to change field type 0x%x -> 0x%x", area->fields[field->FieldId - 1].fieldtype, field->Type); return SA_ERR_HPI_INVALID_DATA; } mf.field = field; mf.res_info = ohoi_res_info; mf.hnd = hnd; mf.rv = SA_OK; mf.done = 0; g_mutex_lock(fru->mutex); rv = ipmi_entity_pointer_cb(ohoi_res_info->u.entity.entity_id, modify_inventoty_field_cb, &mf); if (rv) { err("ipmi_entity_pointer_cb returned %d", rv); g_mutex_unlock (fru->mutex); mf.rv = SA_ERR_HPI_INTERNAL_ERROR; } else { ret = ohoi_loop(&mf.done, handler->data); if (ret != SA_OK) { mf.rv = ret; } } if (mf.rv != SA_OK) { err("ohoi_set_idr_field failed. rv = %d", mf.rv); g_mutex_unlock (fru->mutex); return mf.rv; } ret = ohoi_fru_write(handler->data, ohoi_res_info->u.entity.entity_id); if (ret != SA_OK) { err("Couldn't write up updated field %d of area %d", field->FieldId, field->AreaId); g_mutex_unlock (fru->mutex); return ret; } switch (get_areatype_by_id(field->AreaId, fru)) { case SAHPI_IDR_AREATYPE_CHASSIS_INFO : fru->ci_fld_msk |= (1 << field->Type); break; case SAHPI_IDR_AREATYPE_BOARD_INFO : fru->bi_fld_msk |= (1 << field->Type); break; case SAHPI_IDR_AREATYPE_PRODUCT_INFO : fru->pi_fld_msk |= (1 << field->Type); break; default : err("area 0x%x doesn't permit fields modification", get_areatype_by_id(field->AreaId, fru)); break; } fru->update_count++; g_mutex_unlock (fru->mutex); return SA_OK; } /****** ADD FIELD ******/ SaErrorT ohoi_add_idr_field(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrFieldT *field) { SaHpiEntryIdT fid; struct oh_handler_state *handler = hnd; struct ohoi_resource_info *ohoi_res_info; struct ohoi_inventory_info *fru; SaHpiIdrAreaTypeT a_type; SaErrorT rv; ohoi_res_info = oh_get_resource_data(handler->rptcache, rid); if (!(ohoi_res_info->type & OHOI_RESOURCE_ENTITY)) { err("Bug: try to get fru in unsupported resource"); return SA_ERR_HPI_INVALID_CMD; } fru = ohoi_res_info->fru; if (fru == NULL) { err("bug: resource without fru?"); return SA_ERR_HPI_CAPABILITY; } if (field->AreaId < OHOI_AREA_FIRST_ID) { err("wrong AreaId %d", field->AreaId); return SA_ERR_HPI_NOT_PRESENT; } if (field->AreaId > OHOI_AREA_LAST_ID(fru)) { err("wrong AreaId %d", field->AreaId); return SA_ERR_HPI_NOT_PRESENT; } a_type = get_areatype_by_id(field->AreaId, fru); field->FieldId = 0; fid = get_fieldid_by_type(fru, field->AreaId, field->Type); if (fid == 0) { err("invalid field type %d", field->Type); return SA_ERR_HPI_INVALID_PARAMS; } field->FieldId = fid; rv = ohoi_set_idr_field(hnd, rid, idrid, field); if (rv != SA_OK) { return rv; } if (field->Type == SAHPI_IDR_FIELDTYPE_CUSTOM) { switch (a_type) { case SAHPI_IDR_AREATYPE_CHASSIS_INFO : fru->ci_custom_num++; break; case SAHPI_IDR_AREATYPE_BOARD_INFO : fru->bi_custom_num++; break; case SAHPI_IDR_AREATYPE_PRODUCT_INFO : fru->pi_custom_num++; break; default : err("area 0x%x doesn't permit custom fields", a_type); break; } } else { set_field_presence(fru, a_type, field->Type); } return rv; } /************ DELETE FIELD ************/ static void delete_inventoty_field_cb(ipmi_entity_t *ent, void *cbdata) { struct ohoi_del_field *df = cbdata; SaHpiIdrFieldT field; field.FieldId = df->fieldid; field.AreaId = df->areaid; // field.Type = areas[df->areaid - 1].fields[df->fieldid - 1].fieldtype; field.Field.DataLength = 0; field.Field.DataType = SAHPI_TL_TYPE_BINARY; if (field.FieldId <= OHOI_FIELD_LAST_ID(&areas[df->areaid - 1])) { field.Type = areas[df->areaid - 1]. fields[df->fieldid - 1].fieldtype; } else { field.Type = SAHPI_IDR_FIELDTYPE_CUSTOM; } df->rv = modify_inventory(&field, ent, df->res_info); df->done = 1; if (df->rv != SA_OK) { err("modify_inventory failed. return %d", df->rv); } df->done = 1; } SaErrorT ohoi_del_idr_field(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiEntryIdT areaid, SaHpiEntryIdT fieldid) { struct oh_handler_state *handler = hnd; struct ohoi_resource_info *ohoi_res_info; struct ohoi_inventory_info *fru; struct ohoi_del_field df; int rv; SaErrorT ret; OHOI_CHECK_RPT_CAP_IDR(); ohoi_res_info = oh_get_resource_data(handler->rptcache, rid); if (!(ohoi_res_info->type & OHOI_RESOURCE_ENTITY)) { err("Bug: try to get fru in unsupported resource"); return SA_ERR_HPI_INVALID_CMD; } fru = ohoi_res_info->fru; if (fru == NULL) { err("bug: resource without fru?"); return SA_ERR_HPI_CAPABILITY; } if (areaid < OHOI_AREA_FIRST_ID) { err("areaid < 1"); return SA_ERR_HPI_NOT_PRESENT; } if (areaid > OHOI_AREA_LAST_ID(fru)) { err("areaid(%d) > OHOI_AREA_LAST_ID(%d) || areaid < 1", areaid, OHOI_AREA_LAST_ID(fru)); return SA_ERR_HPI_NOT_PRESENT; } if (fru->oem_areas && (areaid >= FIRST_OEM_AREA_NUM)) { return SA_ERR_HPI_READ_ONLY; } if (!get_area_presence(fru, areaid)) { return SA_ERR_HPI_NOT_PRESENT; } if (!field_present(fru, areaid, fieldid)) { return SA_ERR_HPI_NOT_PRESENT; } df.fieldid = fieldid; df.areaid = areaid; df.res_info = ohoi_res_info; df.hnd = hnd; df.rv = SA_OK; df.done = 0; g_mutex_lock(fru->mutex); rv = ipmi_entity_pointer_cb(ohoi_res_info->u.entity.entity_id, delete_inventoty_field_cb, &df); if (rv) { err("ipmi_entity_pointer_cb returned %d", rv); g_mutex_unlock(fru->mutex); return SA_ERR_HPI_INTERNAL_ERROR; } ret = ohoi_loop(&df.done, handler->data); if (ret != SA_OK) { g_mutex_unlock(fru->mutex); return ret; } if (df.rv != SA_OK) { err("ohoi_del_idr_field failed. rv = %d", df.rv); g_mutex_unlock(fru->mutex); return df.rv; } ret = ohoi_fru_write(handler->data, ohoi_res_info->u.entity.entity_id); if (ret == SA_OK) { ohoi_res_info->fru->update_count++; } g_mutex_unlock(fru->mutex); return ret; } static int try_to_change_area_size(ipmi_fru_t *fru, unsigned int delta, unsigned int my_a_type) { unsigned int fru_len; unsigned int sum_len = 0; unsigned int len; unsigned int my_len = 0; unsigned int i; unsigned int off; int rv; dbg("enter: delta = %u, area = %u", delta, my_a_type); // calculate sum of all area sizes for (i = 0; i < IPMI_FRU_FTR_NUMBER; i++) { rv = ipmi_fru_area_get_length(fru, i, &len); if (rv == 0) { sum_len += len; if (i == my_a_type) { my_len = len; } } } fru_len = ipmi_fru_get_data_length(fru); // must be multiple 8 delta = ((delta + 7) >> 3) << 3; dbg("fru_len = %u; sum_len = %u; new_delta = %u", fru_len, sum_len, delta); if (sum_len + delta > fru_len) { err("not enough space. Do nothing"); return 1; } for (i = IPMI_FRU_FTR_NUMBER - 1; i != my_a_type; i--) { // move all below areas down to free space rv = ipmi_fru_area_get_offset(fru, i, &off); if (rv) { dbg("no area %u in fru. coontinue", i); continue; } dbg("offset of area %u is changing from %u to %u", i, off, off + delta); rv = ipmi_fru_area_set_offset(fru, i, off + delta); if (rv) { err("could not chang offset"); return 1; } } rv = ipmi_fru_area_set_length(fru, my_a_type, my_len + delta); dbg("change size of area %d from %u to %u. res = %d", my_a_type, my_len, my_len + delta, rv); return rv; } static SaErrorT modify_custom_field(SaHpiIdrFieldT *field, ipmi_entity_t *ent, struct ohoi_resource_info *ohoi_res_info) { SaHpiEntryIdT areaid = field->AreaId; SaHpiEntryIdT fieldid = field->FieldId; SaHpiTextBufferT *tb = &field->Field; SaHpiIdrAreaTypeT a_type; enum ipmi_str_type_e type; unsigned char lang = 0; unsigned int ipmi_a_type = IPMI_FRU_FTR_NUMBER; unsigned int cn; SaErrorT ret = SA_OK; int rv; ipmi_fru_t *fru; struct ohoi_area_data *area_data; int (* set_func)(ipmi_fru_t *fru, unsigned int num, enum ipmi_str_type_e type, char *str, unsigned int len) = NULL; int (* len_func)(ipmi_fru_t *fru, unsigned int num, unsigned int *length) = NULL; fru = ipmi_entity_get_fru(ent); if (fru == NULL) { err("Bug: resource without fru"); return SA_ERR_HPI_INTERNAL_ERROR; } area_data = &areas[areaid - 1]; a_type = area_data->areatype; switch (a_type) { case SAHPI_IDR_AREATYPE_CHASSIS_INFO : ipmi_a_type = IPMI_FRU_FTR_CHASSIS_INFO_AREA; len_func = ipmi_fru_get_chassis_info_custom_len; set_func = ipmi_fru_set_chassis_info_custom; cn = fieldid - OHOI_FIELD_LAST_ID(area_data) - 1; break; case SAHPI_IDR_AREATYPE_BOARD_INFO : ipmi_a_type = IPMI_FRU_FTR_BOARD_INFO_AREA; len_func = ipmi_fru_get_board_info_custom_len; set_func = ipmi_fru_set_board_info_custom; cn = fieldid - OHOI_FIELD_LAST_ID(area_data) - 1; break; case SAHPI_IDR_AREATYPE_PRODUCT_INFO : ipmi_a_type = IPMI_FRU_FTR_PRODUCT_INFO_AREA; len_func = ipmi_fru_get_product_info_custom_len; set_func = ipmi_fru_set_product_info_custom; cn = fieldid - OHOI_FIELD_LAST_ID(area_data) - 1; break; default : err("area 0x%x doesn't permit custom fields", a_type); return SA_ERR_HPI_INVALID_DATA; } if (set_func != NULL) { ret = get_str_type(tb, lang, &type); if (ret != SA_OK) { err("Unknown lang type"); goto out; } rv = set_func(fru, cn, type, (char *)tb->Data, (unsigned int)tb->DataLength); dbg("custom field %d len set = %d; rv = %d", cn, tb->DataLength, rv); if (rv == ENOSPC) { // try to increase the room for area moving other areas int r; unsigned int f_len; //print_fru_layout(fru); r = len_func(fru, cn, &f_len); dbg("rv = %d; f_len = %u; new_len = %u", rv, f_len, tb->DataLength); if ((r == 0) && (f_len < (unsigned int)tb->DataLength) && (try_to_change_area_size(fru, (unsigned int)tb->DataLength - f_len, ipmi_a_type) == 0)) { //print_fru_layout(fru); rv = set_func(fru, cn, type, (char *)tb->Data, (unsigned int)tb->DataLength); dbg("custom field %d len set = %d", cn, tb->DataLength); } } if (rv) { err("Could not set FRU field %d of area %d. rv = %d\n", fieldid, areaid, rv); if (rv == ENOSPC) { ret = SA_ERR_HPI_OUT_OF_SPACE; } else { err("set_func for %x/SAHPI_IDR_FIELDTYPE_CUSTOM" " returned error = %d", a_type, rv); ret = SA_ERR_HPI_INVALID_DATA; } } } out: return ret; } static SaErrorT modify_inventory(SaHpiIdrFieldT *field, ipmi_entity_t *ent, struct ohoi_resource_info *ohoi_res_info) { struct ohoi_inventory_info *i_info = ohoi_res_info->fru; SaHpiEntryIdT areaid = field->AreaId; SaHpiEntryIdT fieldid = field->FieldId; SaHpiTextBufferT *tb = &field->Field; SaHpiIdrFieldTypeT f_type; SaHpiIdrAreaTypeT a_type; struct ohoi_area_data *area_data; enum ipmi_str_type_e type; unsigned char lang = 0; unsigned int ipmi_a_type = IPMI_FRU_FTR_NUMBER; SaErrorT ret = SA_OK; ipmi_fru_t *fru; int rv = 0; int (* set_func)(ipmi_fru_t *fru, enum ipmi_str_type_e type, char *str, unsigned int len) = NULL; int (* len_func)(ipmi_fru_t *fru, unsigned int *length) = NULL; if (areaid < 1) { err("areaid(%d) < 1", areaid); return SA_ERR_HPI_NOT_PRESENT; } if (areaid > OHOI_AREA_LAST_ID(i_info)) { err("areaid(%d) >= (%d)", areaid, FIRST_OEM_AREA_NUM + i_info->oem); return SA_ERR_HPI_NOT_PRESENT; } if (i_info->oem_areas && areaid >= FIRST_OEM_AREA_NUM) { return SA_ERR_HPI_READ_ONLY; } area_data = &areas[areaid - 1]; a_type = area_data->areatype; if (fieldid > OHOI_FIELD_LAST_ID(area_data)) { if (field->Type == SAHPI_IDR_FIELDTYPE_CUSTOM) { return modify_custom_field(field, ent, ohoi_res_info); } err("fieldid(%d) >= OHOI_FIELD_LAST_ID(area_data)(%d)", fieldid, OHOI_FIELD_LAST_ID(area_data)); return SA_ERR_HPI_NOT_PRESENT; } f_type = area_data->fields[fieldid - 1].fieldtype; dbg("modify_inventory: area = 0x%x; fieldtype = %i", a_type, f_type); if (i_info == NULL) { err("Bug: ohoi_res_info->fru == NULL"); return SA_ERR_HPI_CAPABILITY; } fru = ipmi_entity_get_fru(ent); if (fru == NULL) { err("Bug: resource without fru"); return SA_ERR_HPI_INTERNAL_ERROR; } switch (a_type) { case SAHPI_IDR_AREATYPE_INTERNAL_USE: return SA_ERR_HPI_READ_ONLY; case SAHPI_IDR_AREATYPE_CHASSIS_INFO: if (i_info->ci == 0) { err("CHASSIS_INFO area not present"); ret = SA_ERR_HPI_NOT_PRESENT; goto out; } ipmi_a_type = IPMI_FRU_FTR_CHASSIS_INFO_AREA; switch (f_type) { case SAHPI_IDR_FIELDTYPE_CHASSIS_TYPE: if ((tb->DataType != SAHPI_TL_TYPE_BINARY) || ((tb->DataLength != 1) && (tb->DataLength != 0))) { err("CHASSIS_TYPE: DataType = %d; " "DataLength = %d", tb->DataType, tb->DataLength); return SA_ERR_HPI_INVALID_DATA; } rv = ipmi_fru_set_chassis_info_type(fru, *(unsigned char *)tb->Data); break; case SAHPI_IDR_FIELDTYPE_PART_NUMBER: lang = 0; set_func = ipmi_fru_set_chassis_info_part_number; len_func = ipmi_fru_get_chassis_info_part_number_len; break; case SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER: lang = SAHPI_LANG_ENGLISH; set_func = ipmi_fru_set_chassis_info_serial_number; len_func = ipmi_fru_get_chassis_info_serial_number_len; break; default: err("CHASSIS_INFO: field %d not present", fieldid); ret = SA_ERR_HPI_NOT_PRESENT; goto out; } break; case SAHPI_IDR_AREATYPE_BOARD_INFO: if (i_info->bi == 0) { err("BOARD_INFO area not present"); return SA_ERR_HPI_NOT_PRESENT; } ipmi_a_type = IPMI_FRU_FTR_BOARD_INFO_AREA; lang = i_info->bi; switch (f_type) { case SAHPI_IDR_FIELDTYPE_MFG_DATETIME: if ((tb->DataType != SAHPI_TL_TYPE_BINARY) || ((tb->DataLength != sizeof(time_t)) && (tb->DataLength != 0))) { err("BOARD_INFO/MFG_DATETIME: DataType = %d; " "DataLength = %d", tb->DataType, tb->DataLength); return SA_ERR_HPI_INVALID_DATA; } if (tb->DataLength == 0) { rv = ipmi_fru_set_board_info_mfg_time(fru, 0); } else { rv = ipmi_fru_set_board_info_mfg_time(fru, *(time_t *)tb->Data); } break; case SAHPI_IDR_FIELDTYPE_MANUFACTURER: set_func = ipmi_fru_set_board_info_board_manufacturer; len_func = ipmi_fru_get_board_info_board_manufacturer_len; break; case SAHPI_IDR_FIELDTYPE_PRODUCT_NAME: set_func = ipmi_fru_set_board_info_board_product_name; len_func = ipmi_fru_get_board_info_board_product_name_len; break; case SAHPI_IDR_FIELDTYPE_PART_NUMBER: set_func = ipmi_fru_set_board_info_board_part_number; len_func = ipmi_fru_get_board_info_board_part_number_len; break; case SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER: lang = SAHPI_LANG_ENGLISH; set_func = ipmi_fru_set_board_info_board_serial_number; len_func = ipmi_fru_get_board_info_board_serial_number_len; break; case SAHPI_IDR_FIELDTYPE_FILE_ID: lang = SAHPI_LANG_ENGLISH; set_func = ipmi_fru_set_board_info_fru_file_id; len_func = ipmi_fru_get_board_info_fru_file_id_len; break; default: err("BOARD_INFO: field %d not present", fieldid); ret = SA_ERR_HPI_NOT_PRESENT; goto out; } break; case SAHPI_IDR_AREATYPE_PRODUCT_INFO: if (i_info->pi == 0) { err("PRODUCT_INFO area not present"); return SA_ERR_HPI_NOT_PRESENT; } ipmi_a_type = IPMI_FRU_FTR_PRODUCT_INFO_AREA; lang = i_info->pi; switch (f_type) { case SAHPI_IDR_FIELDTYPE_MANUFACTURER: set_func = ipmi_fru_set_product_info_manufacturer_name; len_func = ipmi_fru_get_product_info_manufacturer_name_len; break; case SAHPI_IDR_FIELDTYPE_PRODUCT_NAME: set_func = ipmi_fru_set_product_info_product_name; len_func = ipmi_fru_get_product_info_product_name_len; break; case SAHPI_IDR_FIELDTYPE_PART_NUMBER: set_func = ipmi_fru_set_product_info_product_part_model_number; len_func = ipmi_fru_get_product_info_product_part_model_number_len; break; case SAHPI_IDR_FIELDTYPE_PRODUCT_VERSION: set_func = ipmi_fru_set_product_info_product_version; len_func = ipmi_fru_get_product_info_product_version_len; break; case SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER: lang = SAHPI_LANG_ENGLISH; set_func = ipmi_fru_set_product_info_product_serial_number; len_func = ipmi_fru_get_product_info_product_serial_number_len; break; case SAHPI_IDR_FIELDTYPE_ASSET_TAG: set_func = ipmi_fru_set_product_info_asset_tag; len_func = ipmi_fru_get_product_info_asset_tag_len; break; case SAHPI_IDR_FIELDTYPE_FILE_ID: set_func = ipmi_fru_set_product_info_fru_file_id; len_func = ipmi_fru_get_product_info_fru_file_id_len; break; default: err("PRODUCT_INFO: field %d not present", fieldid); ret = SA_ERR_HPI_NOT_PRESENT; goto out; } break; case SAHPI_IDR_AREATYPE_OEM : return SA_ERR_HPI_UNSUPPORTED_API; default: err("Unknown area type = 0x%x", a_type); ret = SA_ERR_HPI_INVALID_PARAMS; goto out; } if (set_func != NULL) { ret = get_str_type(tb, lang, &type); if (ret != SA_OK) { goto out; } rv = set_func(fru, type, (char *)tb->Data, (unsigned int)tb->DataLength); if (rv == ENOSPC) { // try to increase the room for area moving other areas int r; unsigned int f_len; //print_fru_layout(fru); r = len_func(fru, &f_len); dbg("rv = %d; f_len = %u; new_len = %u", rv, f_len, tb->DataLength); if ((r == 0) && (f_len < (unsigned int)tb->DataLength) && (try_to_change_area_size(fru, (unsigned int)tb->DataLength - f_len, ipmi_a_type) == 0)) { //print_fru_layout(fru); rv = set_func(fru, type, (char *)tb->Data, (unsigned int)tb->DataLength); } } if (rv) { err("Could not set FRU field %d of area %d. rv = %d\n", fieldid, areaid, rv); if (rv == ENOSPC) { ret = SA_ERR_HPI_OUT_OF_SPACE; } else { err("set_func for %x/%d returned error = %d", a_type, f_type, rv); ret = SA_ERR_HPI_INVALID_DATA; } } } out: return ret; } static void ipmi_fru_write_done_cb(ipmi_domain_t *domain, ipmi_fru_t *fru, int err, void *cb_data) { struct ohoi_fru_write_s *info = cb_data; if (err) { err("err = %d", err); OHOI_MAP_ERROR(info->rv, err); } info->done = 1; } static void ipmi_fru_write_cb(ipmi_entity_t *entity, void *cb_data) { int rv; struct ohoi_fru_write_s *info = cb_data; rv = ipmi_fru_write(ipmi_entity_get_fru(entity), ipmi_fru_write_done_cb, cb_data); if (rv != 0) { err("ipmi_fru_write = 0x%x", rv); info->rv = SA_ERR_HPI_INTERNAL_ERROR; info->done = 1; } } SaErrorT ohoi_fru_write(struct ohoi_handler *ipmi_handler, ipmi_entity_id_t entid) { struct ohoi_fru_write_s info; SaErrorT rv; if (!ipmi_handler->real_write_fru) { err("No real FRU write. Real FRU write isn't set"); return SA_OK; } info.done = 0; info.rv = 0; rv = ipmi_entity_pointer_cb(entid, ipmi_fru_write_cb, &info); if (rv) { err("ipmi_entity_pointer_cb = %d", rv); return SA_ERR_HPI_INTERNAL_ERROR; } rv = ohoi_loop(&info.done, ipmi_handler); if (rv != SA_OK) { return rv; } return info.rv; } void * oh_get_idr_info (void *hnd, SaHpiResourceIdT, SaHpiIdrIdT,SaHpiIdrInfoT) __attribute__ ((weak, alias("ohoi_get_idr_info"))); void * oh_get_idr_area_header (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrAreaTypeT, SaHpiEntryIdT, SaHpiEntryIdT, SaHpiIdrAreaHeaderT) __attribute__ ((weak, alias("ohoi_get_idr_area_header"))); void * oh_add_idr_area (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrAreaTypeT, SaHpiEntryIdT) __attribute__ ((weak, alias("ohoi_add_idr_area"))); void * oh_del_idr_area (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT) __attribute__ ((weak, alias("ohoi_del_idr_area"))); void * oh_get_idr_field (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT, SaHpiIdrFieldTypeT, SaHpiEntryIdT, SaHpiEntryIdT, SaHpiIdrFieldT) __attribute__ ((weak, alias("ohoi_get_idr_field"))); void * oh_add_idr_field (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrFieldT) __attribute__ ((weak, alias("ohoi_add_idr_field"))); void * oh_set_idr_field (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrFieldT) __attribute__ ((weak, alias("ohoi_set_idr_field"))); void * oh_del_idr_field (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT, SaHpiEntryIdT) __attribute__ ((weak, alias("ohoi_del_idr_field"))); openhpi-3.6.1/plugins/ipmi/atca_vshm_rdrs.c0000644000175100017510000002153412575647300017753 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (c) 2005 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Vadim Revyakin */ #include "ipmi.h" #include // Virtual Shelf Manager Redundancy Sensor void ohoi_send_vshmgr_redundancy_sensor_event( struct oh_handler_state *handler, int become_present) { struct ohoi_handler *ipmi_handler = handler->data; SaErrorT rv; struct ohoi_sensor_info *s_info = NULL; struct oh_event *e; SaHpiSensorEventT *sen_evt; int num; SaHpiEventStateT cur; SaHpiEventStateT prev; rv = ohoi_get_rdr_data(handler, ipmi_handler->atca_vshm_id, SAHPI_SENSOR_RDR, ATCAHPI_SENSOR_NUM_SHMGR_REDUNDANCY, (void *)&s_info); if (rv != SA_OK) { err("could not get sensor info"); return; } if (s_info == NULL) { err("could not get sensor info"); return; } if (s_info->sen_enabled == SAHPI_FALSE) { err("sensor disabled"); return; } if (!s_info->info.atcamap_sensor_info.val) { // sensor event disable err("sensor event disabled"); return; } num = ipmi_handler->shmc_present_num; if (num == 1) { if (!(s_info->assert & SAHPI_ES_NON_REDUNDANT_SUFFICIENT_RESOURCES)) { err("SAHPI_ES_NON_REDUNDANT_SUFFICIENT" "_RESOURCES disabled"); return; } cur = SAHPI_ES_NON_REDUNDANT_SUFFICIENT_RESOURCES; prev = SAHPI_ES_FULLY_REDUNDANT; } else if (num == 0) { if (!(s_info->assert & SAHPI_ES_NON_REDUNDANT_INSUFFICIENT_RESOURCES)) { err("SAHPI_ES_NON_REDUNDANT_INSUFFICIENT" "_RESOURCES disabled"); return; } cur = SAHPI_ES_NON_REDUNDANT_INSUFFICIENT_RESOURCES; prev = SAHPI_ES_NON_REDUNDANT_SUFFICIENT_RESOURCES; } else if (num >= 2) { if (!become_present) { err("redunduncy not changed"); return; } if (!(s_info->assert & SAHPI_ES_FULLY_REDUNDANT)) { err("SAHPI_ES_FULLY_REDUNDANT disabled"); return; } cur = SAHPI_ES_FULLY_REDUNDANT; prev = SAHPI_ES_NON_REDUNDANT_SUFFICIENT_RESOURCES; } else { err("Internal error. Negative " "ipmi_handler->shmc_present_num = %d", num); return; } e = malloc(sizeof(*e)); if (!e) { err("Out of space"); return; } memset(e, 0, sizeof(*e)); e->event.Source = ipmi_handler->atca_vshm_id; e->event.EventType = SAHPI_ET_SENSOR; e->event.Severity = SAHPI_MAJOR; oh_gettimeofday(&e->event.Timestamp); sen_evt = &(e->event.EventDataUnion.SensorEvent); sen_evt->SensorNum = ATCAHPI_SENSOR_NUM_SHMGR_REDUNDANCY; sen_evt->SensorType = SAHPI_OPERATIONAL; sen_evt->EventCategory = SAHPI_EC_REDUNDANCY; sen_evt->Assertion = SAHPI_TRUE; sen_evt->EventState = cur; sen_evt->OptionalDataPresent = SAHPI_SOD_PREVIOUS_STATE | SAHPI_SOD_CURRENT_STATE; sen_evt->CurrentState = cur; sen_evt->PreviousState = prev; SaHpiRdrT *rdr = oh_get_rdr_by_type(handler->rptcache, ipmi_handler->atca_vshm_id, SAHPI_SENSOR_RDR, ATCAHPI_SENSOR_NUM_SHMGR_REDUNDANCY); if (rdr) e->rdrs = g_slist_append(e->rdrs, g_memdup(rdr, sizeof(SaHpiRdrT))); e->hid = handler->hid; oh_evt_queue_push(handler->eventq, e); } static SaErrorT get_vshmgr_redundancy_sensor_event_enable( struct oh_handler_state *hnd, struct ohoi_sensor_info *sinfo, SaHpiBoolT *enable, SaHpiEventStateT *assert, SaHpiEventStateT *deassert) { *assert = sinfo->assert; *deassert = 0; *enable = sinfo->info.atcamap_sensor_info.val; return SA_OK; } static SaErrorT set_vshmgr_redundancy_sensor_event_enable( struct oh_handler_state *hnd, struct ohoi_sensor_info *sinfo, SaHpiBoolT enable, SaHpiEventStateT assert, SaHpiEventStateT deassert, unsigned int a_supported, unsigned int d_supported) { if (deassert != 0) { err("deassert(0x%x) != 0", deassert); return SA_ERR_HPI_INVALID_DATA; } if ((assert & ~(SAHPI_ES_FULLY_REDUNDANT | SAHPI_ES_NON_REDUNDANT_SUFFICIENT_RESOURCES | SAHPI_ES_NON_REDUNDANT_INSUFFICIENT_RESOURCES))) { err("assert(0x%x)", assert); return SA_ERR_HPI_INVALID_DATA; } sinfo->assert = assert; sinfo->info.atcamap_sensor_info.val = enable; return SA_OK; } static SaErrorT get_vshmgr_redundancy_sensor_reading( struct oh_handler_state *hnd, struct ohoi_sensor_info *sensor_info, SaHpiSensorReadingT *reading, SaHpiEventStateT *ev_state) { struct ohoi_handler *ipmi_handler = hnd->data; int num = ipmi_handler->shmc_present_num; if (reading != NULL) { reading->IsSupported = SAHPI_FALSE; } if (ev_state) { if (num == 0) { *ev_state = SAHPI_ES_NON_REDUNDANT_INSUFFICIENT_RESOURCES; } else if (num == 1) { *ev_state = SAHPI_ES_NON_REDUNDANT_SUFFICIENT_RESOURCES; } else { *ev_state = SAHPI_ES_FULLY_REDUNDANT; } } return SA_OK; } static SaErrorT get_vshmgr_redundancy_sensor_thresholds( struct oh_handler_state *hnd, struct ohoi_sensor_info *sinfo, SaHpiSensorThresholdsT *thres) { return SA_ERR_HPI_INVALID_CMD; } static SaErrorT set_vshmgr_redundancy_sensor_thresholds( struct oh_handler_state *hnd, struct ohoi_sensor_info *sinfo, const SaHpiSensorThresholdsT *thres) { return SA_ERR_HPI_INVALID_CMD; } static SaHpiRdrT *create_vshmgr_redundancy_sensor( struct oh_handler_state *handler, SaHpiRptEntryT *rpt, struct ohoi_sensor_info **sensor_info) { // struct ohoi_handler *ipmi_handler = handler->data; SaHpiRdrT *rdr; struct ohoi_sensor_info *s_info; SaHpiEventStateT events; rdr = malloc(sizeof (*rdr)); if (rdr == NULL) { err("Out of memory"); return NULL; } s_info = malloc(sizeof (*s_info)); if (rdr == NULL) { err("Out of memory"); free(rdr); return NULL; } memset(rdr, 0, sizeof (*rdr)); memset(s_info, 0, sizeof (*s_info)); events = SAHPI_ES_FULLY_REDUNDANT | SAHPI_ES_NON_REDUNDANT_SUFFICIENT_RESOURCES | SAHPI_ES_NON_REDUNDANT_INSUFFICIENT_RESOURCES; rdr->RdrType = SAHPI_SENSOR_RDR; rdr->IsFru = SAHPI_FALSE; rdr->Entity = rpt->ResourceEntity; rdr->RdrTypeUnion.SensorRec.Num = ATCAHPI_SENSOR_NUM_SHMGR_REDUNDANCY; rdr->RdrTypeUnion.SensorRec.Type = SAHPI_OPERATIONAL; rdr->RdrTypeUnion.SensorRec.Category = SAHPI_EC_REDUNDANCY; rdr->RdrTypeUnion.SensorRec.EnableCtrl = SAHPI_TRUE; rdr->RdrTypeUnion.SensorRec.EventCtrl = SAHPI_SEC_PER_EVENT; rdr->RdrTypeUnion.SensorRec.Events = events; rdr->RdrTypeUnion.SensorRec.DataFormat.IsSupported = SAHPI_FALSE; rdr->RdrTypeUnion.SensorRec.ThresholdDefn.IsAccessible = SAHPI_FALSE; oh_init_textbuffer(&rdr->IdString); oh_append_textbuffer(&rdr->IdString, "Shelf Manager Redundancy Sensor"); s_info->support_assert = events; s_info->support_deassert = 0; s_info->assert = events; s_info->deassert = 0; s_info->sen_enabled = SAHPI_TRUE; s_info->enable = SAHPI_TRUE; s_info->info.atcamap_sensor_info.data = NULL; s_info->info.atcamap_sensor_info.val = SAHPI_TRUE; s_info->type = OHOI_SENSOR_ATCA_MAPPED; s_info->ohoii.get_sensor_event_enable = get_vshmgr_redundancy_sensor_event_enable; s_info->ohoii.set_sensor_event_enable = set_vshmgr_redundancy_sensor_event_enable; s_info->ohoii.get_sensor_reading = get_vshmgr_redundancy_sensor_reading; s_info->ohoii.get_sensor_thresholds = get_vshmgr_redundancy_sensor_thresholds; s_info->ohoii.set_sensor_thresholds = set_vshmgr_redundancy_sensor_thresholds; *sensor_info = s_info; return rdr; } void create_atca_virt_shmgr_rdrs(struct oh_handler_state *hnd) { struct ohoi_handler *ipmi_handler = hnd->data; SaHpiRptEntryT *rpt; SaHpiRdrT *rdr; // struct ohoi_control_info *c_info; struct ohoi_sensor_info *s_info; // int num_controls = 0; // int num_sensors = 0; struct ohoi_resource_info *res_info; g_static_rec_mutex_lock(&ipmi_handler->ohoih_lock); rpt = oh_get_resource_by_id(hnd->rptcache, ipmi_handler->atca_vshm_id); if (rpt == NULL) { err("No rpt for atca chassis?"); return; } res_info = oh_get_resource_data(hnd->rptcache, ipmi_handler->atca_vshm_id); // Create Power On Sequence Commit Status sensor rdr = create_vshmgr_redundancy_sensor(hnd, rpt, &s_info); if (rdr != NULL) { if (oh_add_rdr(hnd->rptcache, ipmi_handler->atca_vshm_id, rdr, s_info, 1) != SA_OK) { err("couldn't add control rdr"); free(rdr); free(s_info); } } else { rpt->ResourceCapabilities |= SAHPI_CAPABILITY_SENSOR | SAHPI_CAPABILITY_RDR; } g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); } openhpi-3.6.1/plugins/ipmi/ipmi_entity_event.c0000644000175100017510000006443312575647300020514 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Louis Zhuang */ #include "ipmi.h" #include #include static void trace_ipmi_entity(char *str, int inst, ipmi_entity_t *entity) { if (!getenv("OHOI_TRACE_ENTITY") && !IHOI_TRACE_ALL) { return; } char *type; char logical[24]; logical[0] = 0; switch (ipmi_entity_get_type(entity)) { case IPMI_ENTITY_UNKNOWN: type = "UNKNOWN"; break; case IPMI_ENTITY_MC: type = "MC"; break; case IPMI_ENTITY_FRU: type = "FRU"; if (ipmi_entity_get_is_logical_fru(entity)) { snprintf(logical, 24, " Logical (%d) ", ipmi_entity_get_fru_device_id(entity)); } else { snprintf(logical, 24, " NonLogic(%d) ", ipmi_entity_get_fru_device_id(entity)); } break; case IPMI_ENTITY_GENERIC: type = "GENERIC"; break; case IPMI_ENTITY_EAR: type = "EAR"; break; case IPMI_ENTITY_DREAR: type = "DREAR"; break; default : type = "INVALID"; break; } fprintf(stderr, "*** Entity %s %s %s: %d (%d.%d.%d.%d) (%s) entity = %p\n", type, logical, str, inst, ipmi_entity_get_entity_id(entity), ipmi_entity_get_entity_instance(entity), ipmi_entity_get_device_channel(entity), ipmi_entity_get_device_address(entity), ipmi_entity_get_entity_id_string(entity), entity); } void entity_rpt_set_updated(struct ohoi_resource_info *res_info, struct ohoi_handler *ipmi_handler) { g_static_rec_mutex_lock(&ipmi_handler->ohoih_lock); if (!res_info->presence) { g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); return; } res_info->updated = 1; ipmi_handler->updated = 1; g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); } void entity_rpt_set_presence(struct ohoi_resource_info *res_info, struct ohoi_handler *ipmi_handler, int present) { g_static_rec_mutex_lock(&ipmi_handler->ohoih_lock); trace_ipmi("res_info %p: old presence %d, new presence %d", res_info, res_info->presence, present); if (present == res_info->presence) { g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); return; } res_info->presence = present; res_info->updated = 1; ipmi_handler->updated = 1; g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); } int entity_presence(ipmi_entity_t *entity, int present, void *cb_data, ipmi_event_t *event) { struct oh_handler_state *handler = (struct oh_handler_state *)cb_data; struct ohoi_handler *ipmi_handler = handler->data; SaHpiRptEntryT *rpt; SaHpiResourceIdT rid; ipmi_entity_id_t ent_id; struct ohoi_resource_info *res_info; ent_id = ipmi_entity_convert_to_id(entity); g_static_rec_mutex_lock(&ipmi_handler->ohoih_lock); rpt = ohoi_get_resource_by_entityid(handler->rptcache, &ent_id); if (!rpt) { trace_ipmi_entity("SET PRESENCE. NO RPT", present, entity); err("No rpt"); g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); return SA_ERR_HPI_NOT_PRESENT; } rid = rpt->ResourceId; if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_FRU) && !present) { // This is a workaround trace_ipmi_entity("PRESENCE HANDLER CALLED FOR NOT FRU ENTITY", present, entity); g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); return SA_ERR_HPI_NOT_PRESENT; } res_info = oh_get_resource_data(handler->rptcache, rid); if (res_info->presence == present) { g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); return SA_OK; } trace_ipmi_entity(present ? "PRESENT" : "NOT PRESENT", present, entity); if (present && res_info->deleted) { // became not present and present again. res_info->deleted = 0; rpt->ResourceFailed = SAHPI_FALSE; } if (IS_ATCA(ipmi_handler->d_type)) { switch (ipmi_entity_get_entity_id(entity)) { case 0xa0: // Blade atca_slot_state_sensor_event_send(handler, rpt, present); break; case 0xf0: // Shelf Manager if ((ipmi_entity_get_device_channel(entity) == 0) && (ipmi_entity_get_device_address(entity) == 32)) { // Virtual ShM. Do nothing. It cannot be. break; } if (present) { ipmi_handler->shmc_present_num++; } else { if (rpt->ResourceFailed) { // it's already marked break; } ipmi_handler->shmc_present_num--; } if (ipmi_handler->fully_up) { ohoi_send_vshmgr_redundancy_sensor_event( handler, present); } break; case 0x1e: // Fan Tray if (present) { ohoi_create_fan_control(handler, rpt->ResourceId); } break; default: break; } } entity_rpt_set_presence(res_info, handler->data, present); if (!present) { res_info->deleted = 1; // send event to infrastructure but don't // touch our local structures while struct oh_event *e = malloc(sizeof(*e)); if (e != NULL) { SaHpiEventUnionT *u = &e->event.EventDataUnion; memset(e, 0, sizeof(*e)); e->resource = *rpt; e->event.Source = rpt->ResourceId; e->event.Severity = rpt->ResourceSeverity; oh_gettimeofday(&e->event.Timestamp); if (rpt->ResourceCapabilities & SAHPI_CAPABILITY_FRU) { e->event.EventType = SAHPI_ET_HOTSWAP; u->HotSwapEvent.HotSwapState = SAHPI_HS_STATE_NOT_PRESENT; u->HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_ACTIVE; } else { e->event.EventType = SAHPI_ET_RESOURCE; u->ResourceEvent.ResourceEventType = SAHPI_RESE_RESOURCE_FAILURE; } e->hid = handler->hid; oh_evt_queue_push(handler->eventq, e); } else { err("Out of memory"); } #if 0 while (SA_OK == oh_remove_rdr(handler->rptcache, rid, SAHPI_FIRST_ENTRY)); ohoi_delete_rpt_fru(res_info); res_info->type = OHOI_RESOURCE_ENTITY; // XXX free inventory area memory #endif } g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); return SA_OK; } static void append_parent_epath(SaHpiRptEntryT *entry, SaHpiRptEntryT *parent) { const SaHpiEntityPathT *ep = &(parent->ResourceEntity); oh_concat_ep(&entry->ResourceEntity, ep); } static void init_rpt(SaHpiRptEntryT *entry) { int i; entry->ResourceInfo.ResourceRev = 0; entry->ResourceInfo.SpecificVer = 0; entry->ResourceInfo.DeviceSupport = 0; entry->ResourceInfo.ManufacturerId = 0; entry->ResourceInfo.ProductId = 0; entry->ResourceInfo.FirmwareMajorRev = 0; entry->ResourceInfo.FirmwareMinorRev = 0; entry->ResourceInfo.AuxFirmwareRev = 0; entry->EntryId = 0; entry->ResourceCapabilities = SAHPI_CAPABILITY_RESOURCE; entry->HotSwapCapabilities = 0; for (i=0;i<15;i++) { entry->ResourceInfo.Guid[i] = 0; } entry->ResourceSeverity = SAHPI_MAJOR; /* Default Value -- not related to IPMI */ entry->ResourceFailed = SAHPI_FALSE; oh_init_textbuffer(&entry->ResourceTag); } #if 0 static void _get_is_sel(ipmi_mc_t *mc, void *cb_data) { int *is_selp = cb_data; *is_selp = ipmi_mc_sel_device_support(mc); printf("~~~~~~ MC (%d,%d). sel_support = %d\n", ipmi_mc_get_channel(mc), ipmi_mc_get_address(mc), *is_selp); } #endif static void update_resource_capabilities(ipmi_entity_t *entity, SaHpiRptEntryT *entry, struct ohoi_resource_info *res_info) { if (ipmi_entity_supports_managed_hot_swap(entity)) { trace_ipmi("Entity is hot swapable"); entry->ResourceCapabilities |= SAHPI_CAPABILITY_MANAGED_HOTSWAP; /* if entity supports managed hot swap * check if it has indicator */ /* we need only return value from function */ if (!ipmi_entity_get_hot_swap_indicator(entity, NULL, NULL)) { trace_ipmi("setting SAHPI_HS_CAPABILITY_INDICATOR_SUPPORTED"); entry->HotSwapCapabilities |= SAHPI_HS_CAPABILITY_INDICATOR_SUPPORTED; } } else { entry->ResourceCapabilities &= ~SAHPI_CAPABILITY_MANAGED_HOTSWAP; entry->HotSwapCapabilities &= ~SAHPI_HS_CAPABILITY_INDICATOR_SUPPORTED; } /* OpenIPMI used ipmi_entity_hot_swappable to indicate it's FRU * do not use ipmi_entity_get_is_fru() * it's used only for checking if entity has FRU data */ if ((ipmi_entity_get_entity_id(entity) != 0xf0) || (ipmi_entity_get_device_channel(entity) != 0) || (ipmi_entity_get_device_address(entity) != 32)) { // this is not virtual shelf manager if(ipmi_entity_hot_swappable(entity)) { trace_ipmi("Entity supports simplified hotswap"); entry->ResourceCapabilities |= SAHPI_CAPABILITY_FRU; } else { entry->ResourceCapabilities &= ~SAHPI_CAPABILITY_FRU; } } ipmi_mcid_t mc_id; if (ipmi_entity_get_mc_id(entity, &mc_id) == 0) { res_info->u.entity.mc_id = mc_id; res_info->type |= OHOI_RESOURCE_MC; } else { res_info->type &= ~OHOI_RESOURCE_MC; } } struct add_parent_ep_s { struct oh_handler_state *handler; SaHpiRptEntryT *entry; }; static void add_parent_ep(ipmi_entity_t *ent, ipmi_entity_t *parent, void *cb_data) { struct add_parent_ep_s *info = cb_data; ipmi_entity_id_t parent_id = ipmi_entity_convert_to_id(parent); SaHpiRptEntryT *pr_rpt; pr_rpt = ohoi_get_resource_by_entityid(info->handler->rptcache, &parent_id); if (pr_rpt == NULL) { err(" Couldn't find out res-info for parent: %d.%d.%d.%d %s", ipmi_entity_get_entity_id(parent), ipmi_entity_get_entity_instance(parent), ipmi_entity_get_device_channel(parent), ipmi_entity_get_device_address(parent), ipmi_entity_get_entity_id_string(parent)); trace_ipmi_entity("CAN NOT FIND OUT PARENT. NO RES_INFO", 0, parent); return; } append_parent_epath(info->entry, pr_rpt); return; } static void get_entity_event(ipmi_entity_t *entity, struct ohoi_resource_info *ohoi_res_info, SaHpiRptEntryT *entry, void *cb_data) { SaHpiEntityPathT entity_ep; struct oh_handler_state *handler = cb_data; struct ohoi_handler *ipmi_handler = handler->data; // int rv; const char *str; int entity_id = ipmi_entity_get_entity_id(entity); int entity_instance = ipmi_entity_get_entity_instance(entity); SaHpiEntityPathT ep; unsigned char slot_n_str[8]; int no_slot = 1; unsigned int slot_val = 0; init_rpt(entry); entry->ResourceEntity.Entry[0].EntityType = entity_id; if(entity_instance >= 96) { entry->ResourceEntity.Entry[0].EntityLocation = entity_instance- 96; } else { entry->ResourceEntity.Entry[0].EntityLocation = entity_instance; } entry->ResourceEntity.Entry[1].EntityType = SAHPI_ENT_ROOT; entry->ResourceEntity.Entry[1].EntityLocation = 0; update_resource_capabilities(entity, entry, ohoi_res_info); if (entry->ResourceEntity.Entry[0].EntityType == SAHPI_ENT_SYSTEM_BOARD) { /* This is the BMC entry, so we need to add watchdog. */ if (!ipmi_handler->islan) { // no watchdog commands over lan entry->ResourceCapabilities |= SAHPI_CAPABILITY_WATCHDOG; } } if (ipmi_handler->d_type != IPMI_DOMAIN_TYPE_ATCA) { goto no_atca; } if (entry->ResourceEntity.Entry[0].EntityType == SAHPI_ENT_SYSTEM_CHASSIS) { entry->ResourceEntity.Entry[0].EntityType = SAHPI_ENT_ROOT; entry->ResourceEntity.Entry[0].EntityLocation = 0; oh_append_textbuffer(&entry->ResourceTag, "Shelf"); } /* Since OpenIPMI does not hand us a more descriptive tag which is an SDR issue in the chassis really, we'll over-ride it here until things change */ /* * If entity has a slot try to get it's number */ no_slot = ipmi_entity_get_physical_slot_num(entity, &slot_val); trace_ipmi_entity(" SLOT presence for Entity", no_slot ? 0 : 1, entity); if (no_slot) { /* will use device address */ goto end_of_slot; } { // create Resource for phisical blade slot if it hasn't already been created SaHpiEntityPathT rootep; SaHpiRptEntryT *rpt; struct ohoi_resource_info *s_r_info; char *name; switch (entity_id) { case 0xa0: // Blade ep.Entry[0].EntityType = SAHPI_ENT_PHYSICAL_SLOT; name = "Blade Slot "; break; case 0xf0: // Shelf Manager ep.Entry[0].EntityType = ATCAHPI_ENT_SHELF_MANAGER_SLOT; name = "Shelf Manager Slot "; break; case 0xf1: // Filtration Unit ep.Entry[0].EntityType = ATCAHPI_ENT_FAN_FILTER_TRAY_SLOT; name = "Fan Filter Tray Slot "; break; case 0x0a: // PEM ep.Entry[0].EntityType = ATCAHPI_ENT_POWER_ENTRY_MODULE_SLOT; name = "PEM Slot "; break; case 0xf2: // Shelf FRU ep.Entry[0].EntityType = ATCAHPI_ENT_SHELF_FRU_DEVICE_SLOT; name = "Shelf FRU Device Slot "; break; case 0x1e: // Fan Tray ep.Entry[0].EntityType = ATCAHPI_ENT_FAN_TRAY_SLOT; name = "Fan Tray Slot "; break; case 0xc0: // RTM ep.Entry[0].EntityType = ATCAHPI_ENT_RTM_SLOT; name = "RTM Slot "; break; default: no_slot = 1; goto end_of_slot; } ep.Entry[0].EntityLocation = slot_val; ep.Entry[1].EntityType = SAHPI_ENT_ROOT; ep.Entry[1].EntityLocation = 0; oh_encode_entitypath(ipmi_handler->entity_root, &rootep); oh_concat_ep(&ep, &rootep); rpt = oh_get_resource_by_ep(handler->rptcache, &ep); if (rpt == NULL) { // create rpt for slot SaHpiRptEntryT srpt; int i; init_rpt(&srpt); for (i = 0; i < SAHPI_MAX_ENTITY_PATH; i ++) { srpt.ResourceEntity.Entry[i].EntityLocation = ep.Entry[i].EntityLocation; srpt.ResourceEntity.Entry[i].EntityType = ep.Entry[i].EntityType; if (ep.Entry[i].EntityType == SAHPI_ENT_ROOT) { break; } } oh_append_textbuffer(&srpt.ResourceTag, name); snprintf((char *)slot_n_str, 8, "%d", slot_val); oh_append_textbuffer(&srpt.ResourceTag, (char *)slot_n_str); srpt.ResourceId = oh_uid_from_entity_path(&srpt.ResourceEntity); s_r_info = malloc(sizeof(*ohoi_res_info)); if (s_r_info == NULL) { err("Out of Memory"); goto end_of_slot; } memset(s_r_info, 0, sizeof(*ohoi_res_info)); s_r_info->type = OHOI_RESOURCE_SLOT; s_r_info->u.slot.devid = ipmi_entity_get_fru_device_id(entity); s_r_info->u.slot.addr = ipmi_entity_get_device_address(entity); s_r_info->u.slot.entity_id = ipmi_entity_convert_to_id(entity); if (oh_add_resource(handler->rptcache, &srpt, s_r_info, 1)) { err("couldn't add resource for slot %d", ep.Entry[0].EntityLocation); trace_ipmi_entity("COULD NOT CREATE SLOT for ", 0, entity); no_slot = 1; g_free(s_r_info); goto end_of_slot; } trace_ipmi_entity("CREATE SLOT for ", 0, entity); if (ipmi_entity_get_entity_id(entity) == 0xf0) { // this is not virtual shelf manager ipmi_handler->shmc_num++; } entity_rpt_set_presence(s_r_info, ipmi_handler, 1); rpt = oh_get_resource_by_ep(handler->rptcache, &ep); atca_create_slot_rdrs(handler, srpt.ResourceId); } else { s_r_info = oh_get_resource_data(handler->rptcache, rpt->ResourceId); if (s_r_info && (s_r_info->type & OHOI_RESOURCE_SLOT)) { s_r_info->u.slot.devid = ipmi_entity_get_fru_device_id(entity); s_r_info->u.slot.addr = ipmi_entity_get_device_address(entity); s_r_info->u.slot.entity_id = ipmi_entity_convert_to_id(entity); } else { err("Internal error. s_r_info == %p", s_r_info); } } } end_of_slot: if ((entity_id == 0xa0) && (entity_instance >= 96)) { // ATCA Board if ((ipmi_entity_get_device_address(entity) == 130) || (ipmi_entity_get_device_address(entity) == 132)) { oh_append_textbuffer(&entry->ResourceTag, "Switch "); entry->ResourceEntity.Entry[0].EntityType = SAHPI_ENT_SWITCH_BLADE; } else if (entity_instance == 102) { /* this is here for Force-made Storage blades * until we have access to latest hardware * DO NOT CHANGE */ oh_append_textbuffer(&entry->ResourceTag, "Storage/Disk Blade "); entry->ResourceEntity.Entry[0].EntityType = SAHPI_ENT_DISK_BLADE; } else { oh_append_textbuffer(&entry->ResourceTag, "Blade "); entry->ResourceEntity.Entry[0].EntityType = SAHPI_ENT_SBC_BLADE; } } if ((entity_id == 0x0a) && (entity_instance >= 96)) { // Power Unit oh_append_textbuffer(&entry->ResourceTag, "PEM "); } if ((entity_id == 0xf0) && (entity_instance >= 96)) { // Shelf Manager if ((ipmi_entity_get_device_channel(entity) != 0) || (ipmi_entity_get_device_address(entity) != 32)) { oh_append_textbuffer(&entry->ResourceTag, "Shelf Manager "); } else { oh_append_textbuffer(&entry->ResourceTag, "Virtual Shelf Manager"); no_slot = 1; // XXXX Temporary. Until SDRs fixed ohoi_res_info->type |= OHOI_RESOURCE_MC; ohoi_res_info->u.entity.mc_id = ipmi_handler->virt_mcid; // entry->ResourceCapabilities |= SAHPI_CAPABILITY_EVENT_LOG; } entry->ResourceEntity.Entry[0].EntityType = SAHPI_ENT_SHELF_MANAGER; } if ((entity_id == 0xf2) && (entity_instance >= 96)) { // Shelf FRU oh_append_textbuffer(&entry->ResourceTag, "Shelf FRU Device "); entry->ResourceEntity.Entry[0].EntityType = ATCAHPI_ENT_SHELF_FRU_DEVICE; } if ((entity_id == 0xf1) && (entity_instance >= 96)) { // Filtration Unit oh_append_textbuffer(&entry->ResourceTag, "Fan Filter Tray "); entry->ResourceEntity.Entry[0].EntityType = ATCAHPI_ENT_FILTRATION_UNIT; } if ((entity_id == 0x1e) && (entity_instance >= 96)) { // Fan Tray oh_append_textbuffer(&entry->ResourceTag, "Fan Tray "); } if ((entity_id == 0xc0) && (entity_instance >= 96)) { // Fan Tray oh_append_textbuffer(&entry->ResourceTag, "RTM "); } /* End AdvancedTCA Fix-ups */ if (!no_slot) { oh_append_textbuffer(&entry->ResourceTag, (char *)slot_n_str); } no_atca: if (entry->ResourceTag.DataLength == 0) { str = ipmi_entity_get_entity_id_string(entity); oh_append_textbuffer(&entry->ResourceTag, str); } if (!no_slot) { oh_concat_ep(&entry->ResourceEntity, &ep); } else if (ipmi_entity_get_is_child(entity)) { struct add_parent_ep_s info; info.handler = handler; info.entry = entry; ipmi_entity_iterate_parents(entity, add_parent_ep, &info); } else { oh_encode_entitypath(ipmi_handler->entity_root, &entity_ep); oh_concat_ep(&entry->ResourceEntity, &entity_ep); } entry->ResourceId = oh_uid_from_entity_path(&entry->ResourceEntity); } static void add_entity_event(ipmi_domain_t *domain, ipmi_entity_t *entity, struct oh_handler_state *handler) { struct ohoi_handler *ipmi_handler = handler->data; struct ohoi_resource_info *ohoi_res_info; SaHpiRptEntryT entry; int rv; int inst; inst = ipmi_entity_get_entity_instance(entity); if (inst >= 96) { inst -= 96; } memset(&entry, 0, sizeof (entry)); ohoi_res_info = malloc(sizeof(*ohoi_res_info)); if (!ohoi_res_info) { err("Out of memory"); trace_ipmi_entity("CAN NOT ADD ENTITY. OUT OF MEMORY", inst, entity); return; } memset(ohoi_res_info, 0, sizeof (*ohoi_res_info)); ohoi_res_info->max_ipmb0_link = -1; ohoi_res_info->type = OHOI_RESOURCE_ENTITY; ohoi_res_info->u.entity.entity_id= ipmi_entity_convert_to_id(entity); get_entity_event(entity, ohoi_res_info, &entry, handler); rv = oh_add_resource(handler->rptcache, &entry, ohoi_res_info, 1); if (rv) { err("oh_add_resource failed for %d = %s\n", entry.ResourceId, oh_lookup_error(rv)); trace_ipmi_entity("CAN NOT ADD ENTITY. ADD RESOURCE FAILED", inst, entity); return; } if (!IS_ATCA(ipmi_domain_get_type(domain))) { return; } if (entry.ResourceEntity.Entry[0].EntityType == SAHPI_ENT_SYSTEM_CHASSIS) { ipmi_handler->atca_shelf_id = entry.ResourceId; } if (ipmi_entity_get_type(entity) == IPMI_ENTITY_MC) { ohoi_create_fru_mc_reset_control(handler, entry.ResourceId); } switch (ipmi_entity_get_entity_id(entity)) { case 0xf0: // Shelf Manager if (ipmi_entity_get_device_address(entity) == 0x20) { // this is virtual shelf manager ipmi_handler->atca_vshm_id = entry.ResourceId; create_atca_virt_shmgr_rdrs(handler); // virtual shelf manager always present entity_rpt_set_presence(ohoi_res_info, handler->data, 1); } break; default: break; } } void ohoi_remove_entity(struct oh_handler_state *handler, SaHpiResourceIdT res_id) { struct oh_event *e = NULL; struct ohoi_resource_info *res_info = NULL; SaHpiRptEntryT *rpte = NULL; res_info = oh_get_resource_data(handler->rptcache, res_id); rpte = oh_get_resource_by_id(handler->rptcache, res_id); if (!rpte) { err("Rpt entry not found"); return; } /* Now put an event for the resource to DEL */ e = malloc(sizeof(*e)); if (e == NULL) { err("Out of memory"); return; } memset(e, 0, sizeof(*e)); if (rpte->ResourceCapabilities & SAHPI_CAPABILITY_FRU) { SaHpiHotSwapEventT *hse = &e->event.EventDataUnion.HotSwapEvent; e->event.EventType = SAHPI_ET_HOTSWAP; hse->HotSwapState = SAHPI_HS_STATE_NOT_PRESENT; hse->PreviousHotSwapState = SAHPI_HS_STATE_ACTIVE; } else { SaHpiResourceEventT *re = &e->event.EventDataUnion.ResourceEvent; e->event.EventType = SAHPI_ET_RESOURCE; re->ResourceEventType = SAHPI_RESE_RESOURCE_FAILURE; } e->resource = *rpte; e->event.Source = rpte->ResourceId; e->event.Severity = rpte->ResourceSeverity; oh_gettimeofday(&e->event.Timestamp); e->hid = handler->hid; oh_evt_queue_push(handler->eventq, e); entity_rpt_set_updated(res_info, handler->data); } static void change_entity(struct oh_handler_state *handler, ipmi_entity_t *entity) { struct ohoi_handler *ipmi_handler = handler->data; ipmi_entity_id_t entity_id = ipmi_entity_convert_to_id(entity); SaHpiRptEntryT *rpt; SaHpiResourceIdT slot_id; struct ohoi_resource_info *s_r_info; struct ohoi_resource_info *res_info; unsigned int dummy; rpt = ohoi_get_resource_by_entityid(handler->rptcache, &entity_id); if (rpt == NULL) { err("Couldn't find out resource by entity %d.%.d.%d.%d %s", ipmi_entity_get_entity_id(entity), ipmi_entity_get_entity_instance(entity), ipmi_entity_get_device_channel(entity), ipmi_entity_get_device_address(entity), ipmi_entity_get_entity_id_string(entity)); trace_ipmi_entity("CAN NOT CHANGE RESOURCE. NO RPT", 0, entity); return; } res_info = oh_get_resource_data(handler->rptcache, rpt->ResourceId); update_resource_capabilities(entity, rpt, res_info); entity_rpt_set_updated(res_info, ipmi_handler); if (ipmi_handler->d_type != IPMI_DOMAIN_TYPE_ATCA) { return; } if (ipmi_entity_get_physical_slot_num(entity, &dummy)) { // entity does not have a slot return; } #if 0 if (ipmi_entity_get_type(entity) == IPMI_ENTITY_MC) { if (!(res_info->type & OHOI_MC_RESET_CONTROL_CREATED)) { ohoi_create_fru_mc_reset_control(handler, rpt->ResourceId); } if (!(res_info->type & OHOI_MC_IPMB0_CONTROL_CREATED) && (res_info->max_ipmb0_link >= 0)) { ohoi_create_ipmb0_controls(handler, entity, (SaHpiCtrlStateAnalogT)res_info->max_ipmb0_link); } } #endif slot_id = ohoi_get_parent_id(rpt); s_r_info = oh_get_resource_data(handler->rptcache, slot_id); if (s_r_info && (s_r_info->type & OHOI_RESOURCE_SLOT)) { s_r_info->u.slot.devid = ipmi_entity_get_fru_device_id(entity); s_r_info->u.slot.addr = ipmi_entity_get_device_address(entity); } else { err("No res_info(%p) for slot %d", s_r_info, slot_id); } } static void delete_entity(struct oh_handler_state *handler, ipmi_entity_t *entity) { ipmi_entity_id_t entity_id = ipmi_entity_convert_to_id(entity); SaHpiRptEntryT *rpt; struct ohoi_resource_info *res_info; rpt = ohoi_get_resource_by_entityid(handler->rptcache, &entity_id); if (rpt == NULL) { err("couldn't find out resource"); return; } res_info = oh_get_resource_data(handler->rptcache, rpt->ResourceId); // send event to infrastructure and remove rpt entry struct oh_event *e = malloc(sizeof(*e)); if (e != NULL) { memset(e, 0, sizeof(*e)); if (rpt->ResourceCapabilities & SAHPI_CAPABILITY_FRU) { e->event.EventType = SAHPI_ET_HOTSWAP; e->event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_NOT_PRESENT; } else { e->event.EventType = SAHPI_ET_RESOURCE; e->event.EventDataUnion.ResourceEvent.ResourceEventType = SAHPI_RESE_RESOURCE_FAILURE; } e->resource = *rpt; e->event.Source = rpt->ResourceId; e->event.Severity = rpt->ResourceSeverity; oh_gettimeofday(&e->event.Timestamp); e->hid = handler->hid; oh_evt_queue_push(handler->eventq, e); } else { err("Out of memory"); } while (SA_OK == oh_remove_rdr(handler->rptcache, rpt->ResourceId, SAHPI_FIRST_ENTRY)); if (res_info) { ohoi_delete_rpt_fru(res_info); } oh_remove_resource(handler->rptcache, rpt->ResourceId); } void ohoi_entity_event(enum ipmi_update_e op, ipmi_domain_t *domain, ipmi_entity_t *entity, void *cb_data) { struct oh_handler_state *handler = cb_data; struct ohoi_handler *ipmi_handler = handler->data; int rv; int inst=0; inst=ipmi_entity_get_entity_instance(entity); if(inst >=96) { inst = inst - 96; } g_static_rec_mutex_lock(&ipmi_handler->ohoih_lock); switch (op) { case IPMI_ADDED: add_entity_event(domain, entity, handler); trace_ipmi_entity("ADDED", inst, entity); /* entity presence overall */ rv = ipmi_entity_add_presence_handler(entity, entity_presence, handler); if (rv) err("ipmi_entity_set_presence_handler: %#x", rv); /* hotswap handler */ rv = ipmi_entity_add_hot_swap_handler(entity, ohoi_hot_swap_cb, cb_data); if(rv) err("Failed to set entity hot swap handler"); /* sensors */ rv= ipmi_entity_add_sensor_update_handler(entity, ohoi_sensor_event, handler); if (rv) { err("ipmi_entity_set_sensor_update_handler: %#x", rv); break; } /* controls */ rv = ipmi_entity_add_control_update_handler(entity, ohoi_control_event, handler); if (rv) { err("ipmi_entity_set_control_update_handler: %#x", rv); return; } /* inventory (a.k.a FRU) */ rv = ipmi_entity_add_fru_update_handler(entity, ohoi_inventory_event, handler); if (rv) { err("ipmi_entity_set_fru_update_handler: %#x", rv); break; } break; case IPMI_DELETED: delete_entity(handler, entity); trace_ipmi_entity("DELETED", inst, entity); break; case IPMI_CHANGED: change_entity(handler, entity); trace_ipmi_entity("CHANGED", inst, entity); break; default: err("Entity: Unknow change?!"); } g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); } openhpi-3.6.1/plugins/ipmi/posix_vlog.c0000644000175100017510000000326412575647300017145 0ustar mohanmohan/* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Louis Zhuang */ #include "ipmi.h" void posix_vlog(char *format, enum ipmi_log_type_e log_type, va_list ap) { int do_nl = 1; char *msg = getenv("OHOI_TRACE_MSG"); char *mem = getenv("OHOI_DBG_MEM"); int do_debug = (getenv("OPENHPI_ERROR") && !strcmp("YES", getenv("OPENHPI_ERROR"))); if ((msg || mem) && trace_msg_file) { vfprintf(trace_msg_file, format, ap); if ((log_type == IPMI_LOG_DEBUG_END) && do_nl) fprintf(trace_msg_file, "\n"); if (mem) fprintf(trace_msg_file, "\n"); fflush(trace_msg_file); } if (!do_debug) { return; } switch(log_type) { case IPMI_LOG_INFO: printf("INFO: "); do_nl = 1; break; case IPMI_LOG_WARNING: printf("WARN: "); do_nl = 1; break; case IPMI_LOG_SEVERE: printf("SEVR: "); do_nl = 1; break; case IPMI_LOG_FATAL: printf("FATL: "); do_nl = 1; break; case IPMI_LOG_ERR_INFO: printf("EINF: "); do_nl = 1; break; case IPMI_LOG_DEBUG_START: /* FALLTHROUGH */ case IPMI_LOG_DEBUG: printf("DEBG: "); break; case IPMI_LOG_DEBUG_CONT: /* FALLTHROUGH */ case IPMI_LOG_DEBUG_END: break; } vprintf(format, ap); if (do_nl) printf("\n"); } openhpi-3.6.1/plugins/watchdog/0000755000175100017510000000000012605014560015433 5ustar mohanmohanopenhpi-3.6.1/plugins/watchdog/watchdog.c0000644000175100017510000004443212575647266017433 0ustar mohanmohan/* -*- watchdog-c -*- * * Copyright (c) 2003 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Rusty Lynch * Julie Fleischer * * watchdog.c: This OpenHPI plug-in implements a simple wrapper for the * standard Linux watchdog interface. * * Note: This program is currently only written to the * functionality in drivers/char/watchdog/softdog.c, so * the functionality is limited. * Will be expanded to functionality in Documentation/ * watchdog/watchdog-api.txt eventually. Even then, * functionality is still quite limited. * Need to use IPMI watchdog for full watchdog * functionality. (This is part of the IPMI plugin.) * * Temperature/Fan RDR code has not been created as could * not find a watchdog defined in watchdog-api.txt that * implemented this functionality. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* These two IOCTL's were not added to watchdog.h in older kernels */ #define WDIOC_SETTIMEOUT _IOWR(WATCHDOG_IOCTL_BASE, 6, int) #define WDIOC_GETTIMEOUT _IOR(WATCHDOG_IOCTL_BASE, 7, int) #define MAX_PATH 256 #define DEFAULT_TIMEOUT 10; #define WD_CAPS \ SAHPI_CAPABILITY_RESOURCE|SAHPI_CAPABILITY_RDR|SAHPI_CAPABILITY_WATCHDOG SaHpiEntityPathT g_epbase; /* root entity path (from config) */ struct wdtitems { int initialized; int fd; char path[MAX_PATH]; SaHpiWatchdogT data; }; /** * *watchdog_open: * @handler_config: pointer to config file * * This function creates an instance for the watchdog plugin * and returns a handler to the instance. * addr corresponds to the location of the watchdog device **/ static void *watchdog_open(GHashTable *handler_config, unsigned int hid, oh_evt_queue *eventq) { struct oh_handler_state *hnd; struct wdtitems *wdt; char *er; if (!handler_config) { err("empty handler_config"); return NULL; } else if (!hid) { err("Bad handler id passed."); return NULL; } else if (!eventq) { err("No event queue was passed."); return NULL; } /* set up entity root in g_epbase */ er = (char *)g_hash_table_lookup(handler_config,"entity_root"); if (!er) { err("no entity root present"); return NULL; } oh_encode_entitypath(er, &g_epbase); hnd = malloc(sizeof(*hnd)); if (!hnd) { err("unable to allocate main handler"); return NULL; } memset(hnd, '\0', sizeof(*hnd)); /* assign config to handler_config and initialize rptcache */ hnd->config = handler_config; hnd->rptcache = (RPTable *)g_malloc0(sizeof(RPTable)); hnd->hid = hid; hnd->eventq = eventq; wdt = malloc(sizeof(*wdt)); if (!wdt) { err("unable to allocate wdtitems structure"); free(hnd->rptcache); free(hnd); return NULL; } memset(wdt, '\0', sizeof(*wdt)); strncpy(wdt->path, (char *)g_hash_table_lookup(handler_config, "addr"), MAX_PATH); hnd->data = (void *) wdt; return hnd; } /** * watchdog_close: * @hnd: pointer to instance * * Close the instance for the watchdog plugin. * Note: There is currently no way to test this code * as it is not called by the framework. **/ static void watchdog_close(void *hnd) { struct oh_handler_state *tmp = (struct oh_handler_state *)hnd; struct wdtitems *wdt; if (!tmp) { err("no instance to delete"); return; } wdt = tmp->data; if (wdt->data.Running) { if (write(wdt->fd, "V", 1) != 1) { err("write in watchdog failed"); } close(wdt->fd); } free(tmp->data); free(tmp->rptcache); free(tmp); return; } /** * watchdog_get_event: * @hnd: pointer to handler instance * * This function gets a watchdog event from the watchdog event table * in instance.events. * * Return value: 0 if times out, > 0 is event is returned. **/ static int watchdog_get_event(void *hnd) { struct oh_handler_state *tmp = (struct oh_handler_state *) hnd; if (!tmp) { err("no handler given"); return SA_ERR_HPI_INVALID_PARAMS; } return 0; } /** * watchdog_discover_resources: * @hnd: void pointer to handler * * Discover the resources in watchdog. * * Return value: 0 for success | Error code **/ static int watchdog_discover_resources(void *hnd) { struct oh_event *e; struct oh_handler_state *tmp = (struct oh_handler_state *)hnd; int puid, timeout = DEFAULT_TIMEOUT; struct wdtitems *wdt; if (!tmp) { err("no handler given"); return SA_ERR_HPI_INVALID_PARAMS; } wdt = tmp->data; if (!wdt->initialized) { wdt->initialized = 1; /* * Verify we really have a watchdog available that * interacts with the watchdog char device in the standard way * as described in the kernel watchdog-api.txt * documentation. * * If there are any problems with the standard watchdog * interface, consider the watchdog device undetected * and do not return an error, but just do not bubble * up and RPT and RDR entries. */ wdt->fd = open(wdt->path, O_RDWR); if (-1 == wdt->fd) { err("watchdog device is not enabled"); return 0; } /* the clock is ticking... set the default timeout */ /* before it is too late */ if ( -1 == ioctl(wdt->fd, WDIOC_SETTIMEOUT, &timeout)) { err("unable to set watchdog timeout"); if (write(wdt->fd, "V", 1) != 1) { err("write in watchdog failed"); } close(wdt->fd); return 0; } if ( -1 == ioctl(wdt->fd, WDIOC_GETTIMEOUT, &timeout)) { err("unable to read watchdog timeout"); if (write(wdt->fd, "V", 1) != 1) { err("write in watchdog failed"); } close(wdt->fd); return 0; } /* writing "V" and closing the wdt disables it */ if (-1 == write(wdt->fd, "V", 1)) { err("Unable to write to watchdog - cannot close"); return 0; } close(wdt->fd); /* Set wdt to contain watchdog timer information. * Note: Using watchdog-api.txt, pretimer interrupt * and pretimeout interval functionality is not available. * In addition, event notification of a timeout is * unavailable. */ wdt->data.Log = SAHPI_FALSE; /* don't issue event on timeout */ wdt->data.Running = SAHPI_FALSE; /* not currently running */ wdt->data.TimerUse = SAHPI_WTU_SMS_OS; wdt->data.TimerAction = SAHPI_WA_RESET; wdt->data.PretimerInterrupt = SAHPI_WPI_NONE; wdt->data.PreTimeoutInterval = 0; wdt->data.TimerUseExpFlags = 0; /* not used -- cannot set on timeout */ wdt->data.InitialCount = timeout * 1000; wdt->data.PresentCount = 0; /* * Since event notification on timeout is not available, * the only events we can send back to the OpenHPI * infrastructure are the initial RPT and RDR creation * events to populate the domain RPT table. */ /* * create RPT creation event */ e = (struct oh_event *)malloc(sizeof(*e)); if (!e) { err("unable to allocate event"); return SA_ERR_HPI_OUT_OF_SPACE; } memset(e, '\0', sizeof(struct oh_event)); e->hid = tmp->hid; e->event.EventType = SAHPI_ET_RESOURCE; /* Note: .res_event.entry.ResourceInfo currently unassigned */ e->resource.ResourceEntity.Entry[0].EntityType = SAHPI_ENT_SYSTEM_BOARD; e->resource.ResourceEntity.Entry[0].EntityLocation = 0; oh_concat_ep( &(e->resource.ResourceEntity), &g_epbase); puid = oh_uid_from_entity_path(&(e->resource.ResourceEntity)); e->resource.ResourceId = puid; e->event.Source = puid; e->resource.EntryId = puid; e->resource.ResourceCapabilities = WD_CAPS; e->resource.ResourceSeverity = SAHPI_CRITICAL; /* Note e->u.res_event.entry.DomainId as well as e->u.res_event.domainid.ptr not set */ e->resource.ResourceTag.DataType = SAHPI_TL_TYPE_ASCII6; e->resource.ResourceTag.Language = SAHPI_LANG_ENGLISH; e->resource.ResourceTag.DataLength = 12; strcpy((char *)e->resource.ResourceTag.Data, "System-Board"); e->event.Timestamp = SAHPI_TIME_UNSPECIFIED; e->event.Severity = e->resource.ResourceSeverity; e->event.EventDataUnion.ResourceEvent.ResourceEventType = SAHPI_RESE_RESOURCE_ADDED; /* add resource */ if (0 != oh_add_resource(tmp->rptcache, &(e->resource), NULL, 0)) { err("unable to add resource to RPT"); return SA_ERR_HPI_ERROR; } /* * create RDR creation event */ /* note: reusing e; okay so long as we don't do a free(e) before */ SaHpiRdrT *tmprdr = (SaHpiRdrT *)malloc(sizeof(SaHpiRdrT)); if (!tmprdr) { err("unable to allocate event"); return SA_ERR_HPI_OUT_OF_SPACE; } memset(tmprdr, '\0', sizeof(*tmprdr)); tmprdr->RecordId = 0; /* set to 0 b/c first -- and only -- RDR*/ tmprdr->RdrType = SAHPI_WATCHDOG_RDR; tmprdr->RdrTypeUnion.WatchdogRec.WatchdogNum = SAHPI_DEFAULT_WATCHDOG_NUM; /* set to default b/c only wdt */ tmprdr->RdrTypeUnion.WatchdogRec.Oem = 0; /* n/a */ tmprdr->Entity.Entry[0].EntityType = SAHPI_ENT_SYSTEM_BOARD; tmprdr->Entity.Entry[0].EntityLocation = 0; oh_concat_ep( &(tmprdr->Entity), &g_epbase); tmprdr->IdString.DataType = SAHPI_TL_TYPE_ASCII6; tmprdr->IdString.Language = SAHPI_LANG_ENGLISH; tmprdr->IdString.DataLength = 8; strcpy((char *)tmprdr->IdString.Data, "Watchdog"); /* add RDR */ if (oh_add_rdr(tmp->rptcache, puid, tmprdr, NULL, 0)) { err("unable to add RDR to RPT"); return SA_ERR_HPI_ERROR; } /* Add rdr to event */ e->rdrs = g_slist_append(e->rdrs, tmprdr); /* add event to our event queue */ oh_evt_queue_push(tmp->eventq, e); } return 0; } /** * watchdog_get_watchdog_info: * @hnd: void pointer to handler * @id: RDR for watchdog * @wdt: pointer to watchdog info sent back * * Return watchdog information. * * Return value: 0 for success | Error code **/ static int watchdog_get_watchdog_info(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num, SaHpiWatchdogT *wdt) { struct oh_handler_state *i = (struct oh_handler_state *)hnd; struct wdtitems *wdtitems; if (!i) { err("no handler given"); return SA_ERR_HPI_INVALID_PARAMS; } wdtitems = i->data; if (!wdtitems) { err("no watchdog info with this handler"); return SA_ERR_HPI_INVALID_PARAMS; } /* We only have one possible watchdog: wdtitems->data */ /* Note that software watchdog does not support all watchdog * functionality, so many items below are overwritten with default * values. */ wdtitems->data.Log = SAHPI_FALSE; /* impossible to issue events on timeout */ wdtitems->data.TimerAction = SAHPI_WA_RESET; /* only reset is supported */ wdtitems->data.PretimerInterrupt = SAHPI_WPI_NONE; /* can't do pretimer */ wdtitems->data.PreTimeoutInterval = 0; /* can't do pretimer */ /* Note: No need to ask wdt for timeout value, since this should * be set correctly already during discover and set. */ wdtitems->data.PresentCount = 0; /* can't do current count */ memcpy( wdt, &wdtitems->data, sizeof(SaHpiWatchdogT)); return 0; } /** * watchdog_set_watchdog_info: * @hnd: void pointer to handler * @id: RDR for watchdog * @wdt: pointer to watchdog info sent to fcn * * Set watchdog information in hnd->data to that sent in wdt. * Also, stop or restart the watchdog timer, depending on * the value of wdt->Running. If it is set to TRUE and wdt * is already running, it is restarted. Otherwise, it will stay * stopped. If it is set to FALSE, it will stop the timer. * * Note: Assuming that lines in the SAF HPI spec that discuss * what to do when InitialCount == 0 apply only when * wdt is already running and wdt->Running is TRUE. * * Return value: 0 for success | Error code **/ static int watchdog_set_watchdog_info(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num, SaHpiWatchdogT *wdt) { int ret = 0; struct oh_handler_state *i = (struct oh_handler_state *)hnd; struct wdtitems *wdtitems; SaHpiWatchdogT w; if (!i) { err("no handler given"); return SA_ERR_HPI_INVALID_PARAMS; } wdtitems = i->data; if (!wdtitems) { err("no watchdog info with this handler"); return SA_ERR_HPI_INVALID_PARAMS; } w = wdtitems->data; /* We only have one possible watchdog: wdtitems->data, or w */ if (SAHPI_FALSE != wdt->Log) { /* impossible to issue events on timeout */ err("Request for unsupported watchdog action"); ret = SA_ERR_HPI_INVALID_PARAMS; } w.Log = SAHPI_FALSE; w.InitialCount = wdt->InitialCount; if (SAHPI_TRUE == wdt->Running) { if (SAHPI_TRUE == w.Running) { /* restart timer */ int timeout; /* reset timeout */ timeout = wdt->InitialCount / 1000; if (0 == wdt->InitialCount) { /* timeout in 1ms ~= immediately */ timeout = 1; } if ( -1 == ioctl(wdtitems->fd, WDIOC_SETTIMEOUT, &timeout)) { err("unable to set watchdog timeout"); ret = SA_ERR_HPI_ERROR; } /* we read the timeout value after writing */ /* because some watchdog device can only be set */ /* to descrete values, so if we want to keep */ /* the InitialCount accurate then we need to */ /* ask the watchdog device what it really set */ /* the timeout too */ if ( -1 == ioctl(wdtitems->fd, WDIOC_GETTIMEOUT, &timeout)) { err("unable to read watchdog timeout"); ret = SA_ERR_HPI_ERROR; } w.InitialCount = timeout * 1000; /* pat the dog to restart the timer from the initial * countdown value */ dbg("reset the watchdog"); if (-1 == write(wdtitems->fd, "1", 1)) { err("could not reset watchdog"); ret = SA_ERR_HPI_ERROR; } } /* if w.Running == SAHPI_FALSE, wdt remains stopped */ } else { if (SAHPI_TRUE == w.Running) { /* stop the watchdog device */ warn("Watchdog timer stopped by OpenHPI"); if (-1 == write(wdtitems->fd, "V", 1)) { err("Unable to write to watchdog"); ret = SA_ERR_HPI_ERROR; } close(wdtitems->fd); w.Running = SAHPI_FALSE; } /* if w.Running == SAHPI_FALSE, wdt remains stopped */ } w.TimerUse = wdt->TimerUse; if (SAHPI_WA_RESET != wdt->TimerAction) { /* only reset is supported */ err("Request for unsupported watchdog action"); ret = SA_ERR_HPI_INVALID_PARAMS; } w.TimerAction = SAHPI_WA_RESET; if (SAHPI_WPI_NONE != wdt->PretimerInterrupt || 0 != wdt->PreTimeoutInterval) { /* we have no way of doing a pre-timeout interrupt */ err("pretimeout functionality is not available"); ret = SA_ERR_HPI_INVALID_PARAMS; } w.PretimerInterrupt = SAHPI_WPI_NONE; w.PreTimeoutInterval = 0; w.TimerUseExpFlags = wdt->TimerUseExpFlags; /* According to SaHpi.h, PresentCount should be ignored in this call */ wdtitems->data = w; return ret; } /** * watchdog_reset_watchdog: * @hnd: void pointer to handler * @id: RDR for watchdog * * Reset the watchdog timer from the initial countdown value. * * Return value: 0 for success | Error code **/ static int watchdog_reset_watchdog(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num) { struct oh_handler_state *i = (struct oh_handler_state *)hnd; struct wdtitems *wdtitems; if (!i) { err("no handler given"); return SA_ERR_HPI_INVALID_PARAMS; } wdtitems = i->data; if (!wdtitems) { err("no watchdog info with this handler"); return SA_ERR_HPI_INVALID_PARAMS; } if (wdtitems->data.Running == SAHPI_FALSE) { int timeout; warn("Watchdog timer started by OpenHPI"); /* calling reset on stopped watchdog will */ /* cause the watchdog to start */ wdtitems->fd = open(wdtitems->path, O_RDWR); if (-1 == wdtitems->fd) { err("could not open watchdog device"); return SA_ERR_HPI_ERROR; } wdtitems->data.Running = SAHPI_TRUE; timeout = wdtitems->data.InitialCount / 1000; if ( -1 == ioctl(wdtitems->fd, WDIOC_SETTIMEOUT, &timeout)) { err("unable to set watchdog timeout"); return SA_ERR_HPI_ERROR; } /* we read the timeout value after writing */ /* because some watchdog device can only be set */ /* to descrete values, so if we want to keep */ /* the InitialCount accurate then we need to */ /* ask the watchdog device what it really set */ /* the timeout too */ if ( -1 == ioctl(wdtitems->fd, WDIOC_GETTIMEOUT, &timeout)) { err("unable to read watchdog timeout"); return SA_ERR_HPI_ERROR; } wdtitems->data.InitialCount = timeout * 1000; } /* pat the dog to restart the timer from the initial * countdown value */ dbg("reset the watchdog"); if (-1 == write(wdtitems->fd, "1", 1)) { err("unable to reset the watchdog"); return SA_ERR_HPI_ERROR; } return 0; } void * oh_open (GHashTable *, unsigned int, oh_evt_queue *) __attribute__ ((weak, alias("watchdog_open"))); void * oh_close (void *) __attribute__ ((weak, alias("watchdog_close"))); void * oh_get_event (void *) __attribute__ ((weak, alias("watchdog_get_event"))); void * oh_discover_resources (void *) __attribute__ ((weak, alias("watchdog_discover_resources"))); void * oh_get_watchdog_info (void *, SaHpiResourceIdT, SaHpiWatchdogNumT, SaHpiWatchdogT *) __attribute__ ((weak, alias("watchdog_get_watchdog_info"))); void * oh_set_watchdog_info (void *, SaHpiResourceIdT, SaHpiWatchdogNumT, SaHpiWatchdogT *) __attribute__ ((weak, alias("watchdog_set_watchdog_info"))); void * oh_reset_watchdog (void *, SaHpiResourceIdT, SaHpiWatchdogNumT) __attribute__ ((weak, alias("watchdog_reset_watchdog"))); openhpi-3.6.1/plugins/watchdog/Makefile.am0000644000175100017510000000351712575647266017522 0ustar mohanmohan# # Copyright (c) 2003, Intel Corporation # All rights reserved. # # Redistribution and use in source and binary forms, with or # without modification, are permitted provided that the following # conditions are met: # # Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the distribution. # # Neither the name of Intel Corporation nor the names # of its contributors may be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, # OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # MAINTAINERCLEANFILES = Makefile.in AM_CPPFLAGS = -DG_LOG_DOMAIN=\"watchdog\" AM_CPPFLAGS += @OPENHPI_INCLUDES@ pkglib_LTLIBRARIES = libwatchdog.la libwatchdog_la_SOURCES = watchdog.c libwatchdog_la_LIBADD = $(top_builddir)/utils/libopenhpiutils.la libwatchdog_la_LDFLAGS = -module -version-info @HPI_LIB_VERSION@ openhpi-3.6.1/plugins/watchdog/README0000644000175100017510000000077112575647266016345 0ustar mohanmohan################################################################################ In order to use this plugin, you must have a machine with softdog compiled into the kernel. To insert softdog, do: insmod softdog [soft_noboot=1] *Note: The soft_noboot=1 is for testing so that the machine does not reboot. Also, create the watchdog module using: mknod /dev/watchdog c 10 130 as root. To install this code: make make install (as root) Can be verified using program examples/list_resources (as root) openhpi-3.6.1/plugins/oa_soap/0000755000175100017510000000000012605014562015256 5ustar mohanmohanopenhpi-3.6.1/plugins/oa_soap/oa_soap_enclosure_event.h0000644000175100017510000000435112575647270022351 0ustar mohanmohan/* * Copyright (C) 2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. */ #ifndef _OA_SOAP_ENCLOSURE_EVENT_H #define _OA_SOAP_ENCLOSURE_EVENT_H /* Include files */ #include "oa_soap_discover.h" #include void oa_soap_proc_enc_status(struct oh_handler_state *oh_handler, struct enclosureStatus *status); void oa_soap_proc_enc_thermal(struct oh_handler_state *oh_handler, SOAP_CON *con, struct thermalInfo *response); void oa_soap_proc_enc_network_info_changed(struct oh_handler_state *oh_handler, struct enclosureNetworkInfo *response); #endif openhpi-3.6.1/plugins/oa_soap/oa_soap_ps_event.h0000644000175100017510000000526012575647270020774 0ustar mohanmohan/* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. */ #ifndef _OA_SOAP_PS_EVENT_H #define _OA_SOAP_PS_EVENT_H /* Include files */ #include "oa_soap_re_discover.h" SaErrorT process_ps_insertion_event(struct oh_handler_state *oh_handler, SOAP_CON *con, struct eventInfo *oa_event); SaErrorT process_ps_extraction_event(struct oh_handler_state *oh_handler, struct eventInfo *oa_event); void oa_soap_proc_ps_subsys_info(struct oh_handler_state *oh_handler, struct powerSubsystemInfo *info); void oa_soap_proc_ps_status(struct oh_handler_state *oh_handler, struct powerSupplyStatus *status); SaErrorT oa_soap_proc_ps_info(struct oh_handler_state *oh_handler, SOAP_CON *con, struct eventInfo *oa_event); void oa_soap_push_power_events(struct oh_handler_state *oh_handler, struct powerSubsystemInfo *info, SaHpiResourceIdT resource_id); #endif openhpi-3.6.1/plugins/oa_soap/oa_soap_server_event.h0000644000175100017510000001066712575647270021667 0ustar mohanmohan/* * Copyright (C) 2007-2009, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. * Raghavendra M.S. * Mohan Devarajulu */ #ifndef _OA_SOAP_SERVER_EVENT_H #define _OA_SOAP_SERVER_EVENT_H /* Include files */ #include "oa_soap_re_discover.h" SaErrorT process_server_power_off_event(struct oh_handler_state *oh_handler, struct oh_event *event); SaErrorT process_server_power_on_event(struct oh_handler_state *oh_handler, SOAP_CON *con, struct oh_event *event, int bay_number); SaErrorT process_server_power_event(struct oh_handler_state *oh_handler, SOAP_CON *con, struct eventInfo *oa_event); SaErrorT oa_soap_proc_server_inserted_event(struct oh_handler_state *oh_handler, SOAP_CON *con, struct eventInfo *oa_event); SaErrorT process_server_insert_completed(struct oh_handler_state *oh_handler, SOAP_CON *con, struct eventInfo *oa_event, SaHpiInt32T loc); SaErrorT process_server_info_event(struct oh_handler_state *oh_handler, SOAP_CON *con, struct eventInfo *oa_event); SaErrorT process_server_extraction_event(struct oh_handler_state *oh_handler, struct eventInfo *oa_event); SaErrorT process_server_mp_info_event(struct oh_handler_state *oh_handler, SOAP_CON *con, struct eventInfo *oa_event); SaErrorT build_inserted_server_rpt(struct oh_handler_state *oh_handler, struct bladeInfo *response, SaHpiRptEntryT *rpt); SaHpiUint8T *oa_soap_parse_memory_sensor_reading(char *memoryErrors); void oa_soap_proc_server_status(struct oh_handler_state *oh_handler, SOAP_CON *con, struct bladeStatus *status); void oa_soap_serv_post_comp(struct oh_handler_state *oh_handler, SOAP_CON *con, SaHpiInt32T bay_number); SaErrorT oa_soap_set_thermal_sensor(struct oh_handler_state *oh_handler, SaHpiRptEntryT *rpt, struct bladeThermalInfoArrayResponse *thermal_response, SaHpiBoolT enable_flag); void oa_soap_proc_server_thermal(struct oh_handler_state *oh_handler, SOAP_CON *con, struct bladeStatus *status); #endif openhpi-3.6.1/plugins/oa_soap/oa_soap_fumi.h0000644000175100017510000001147312575647270020114 0ustar mohanmohan/* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raja Kumar Thatte */ #ifndef _OA_SOAP_FUMI_H #define _OA_SOAP_FUMI_H /* Include files */ #include #include SaErrorT oa_soap_set_fumi_source(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiTextBufferT *sourceuri); SaErrorT oa_soap_validate_fumi_source(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiFumiNumT num, SaHpiBankNumT banknum); SaErrorT oa_soap_get_fumi_source(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiFumiSourceInfoT *sourceinfo); SaErrorT oa_soap_get_fumi_target(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiFumiBankInfoT *bankinfo); SaErrorT oa_soap_start_fumi_backup(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiFumiNumT num); SaErrorT oa_soap_set_fumi_bank_order(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiUint32T position); SaErrorT oa_soap_start_fumi_bank_copy(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiFumiNumT num, SaHpiBankNumT sourcebanknum, SaHpiBankNumT targetbanknum); SaErrorT oa_soap_start_fumi_install(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiFumiNumT num, SaHpiBankNumT banknum); SaErrorT oa_soap_get_fumi_status(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiFumiUpgradeStatusT *status); SaErrorT oa_soap_start_fumi_verify(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiFumiNumT num, SaHpiBankNumT banknum); SaErrorT oa_soap_cancel_fumi_upgrade(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiFumiNumT num, SaHpiBankNumT banknum); SaErrorT oa_soap_start_fumi_rollback(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiFumiNumT num); SaErrorT oa_soap_activate_fumi(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiFumiNumT num); #endif openhpi-3.6.1/plugins/oa_soap/oa_soap_oa_event.h0000644000175100017510000000521012575647270020744 0ustar mohanmohan/* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. */ #ifndef _OA_SOAP_OA_EVENT_H #define _OA_SOAP_OA_EVENT_H /* Include files */ #include "oa_soap_re_discover.h" SaErrorT process_oa_extraction_event(struct oh_handler_state *oh_handler, struct eventInfo *oa_event); SaErrorT process_oa_failover_event(struct oh_handler_state *oh_handler, struct oa_info *oa); SaErrorT process_oa_reboot_event(struct oh_handler_state *oh_handler, struct oa_info *oa); SaErrorT process_oa_info_event(struct oh_handler_state *oh_handler, SOAP_CON *con, struct eventInfo *oa_event); void oa_soap_proc_oa_status(struct oh_handler_state *oh_handler, struct oaStatus *status); void oa_soap_proc_oa_network_info(struct oh_handler_state *oh_handler, struct oaNetworkInfo *nw_info); void oa_soap_proc_oa_inserted(struct oh_handler_state *oh_handler, struct eventInfo *oa_event); #endif openhpi-3.6.1/plugins/oa_soap/oa_soap_resources.c0000644000175100017510000112217312575647270021162 0ustar mohanmohan/* * Copyright (C) 2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. * Raghavendra M.S. * **/ #include "oa_soap_resources.h" /* Array for mapping the OA enums to HPI values. -1 is assigned if the OA is not * supporting the enum value. * * Please modify the array on adding new sensor class and/or changing the * sensor enum values defined in oa_soap_resources.h */ const SaHpiInt32T oa_soap_sen_val_map_arr[OA_SOAP_MAX_SEN_CLASS] [OA_SOAP_MAX_ENUM] = { /* OA_SOAP_OPER_CLASS. This uses the enum opStatus values as index */ { SAHPI_ES_DISABLED, /* OP_STATUS_UNKNOWN */ SAHPI_ES_DISABLED, /* OP_STATUS_OTHER */ SAHPI_ES_ENABLED, /* OP_STATUS_OK */ SAHPI_ES_ENABLED, /* OP_STATUS_DEGRADED */ -1, /* OP_STATUS_STRESSED - not supported by OA */ -1, /* OP_STATUS_PREDICTIVE_FAILURE - not supported by OA */ -1, /* OP_STATUS_ERROR - not supported by OA */ SAHPI_ES_DISABLED, /* OP_STATUS_NON_RECOVERABLE_ERROR */ -1, /* OP_STATUS_STARTING - not supported by OA */ -1, /* OP_STATUS_STOPPING - not supported by OA */ -1, /* OP_STATUS_STOPPED - not supported by OA */ -1, /* OP_STATUS_IN_SERVICE - not supported by OA */ -1, /* OP_STATUS_NO_CONTACT - not supported by OA */ -1, /* OP_STATUS_LOST_COMMUNICATION - not supported by OA */ -1, /* OP_STATUS_ABORTED - not supported by OA */ -1, /* OP_STATUS_DORMANT - not supported by OA */ -1, /* OP_STATUS_SUPPORTING_ENTITY_IN_ERROR - not supported * by OA */ -1, /* OP_STATUS_COMPLETED - not supported by OA */ -1, /* OP_STATUS_POWER_MODE - not supported by OA */ -1, /* OP_STATUS_DMTF_RESERVED - not supported by OA */ -1, /* OP_STATUS_VENDER_RESERVED - not supported by OA */ }, /* OA_SOAP_PRED_FAIL_CLASS. This uses the enum opStatus values * as index */ { SAHPI_ES_PRED_FAILURE_ASSERT, /* OP_STATUS_UNKNOWN */ SAHPI_ES_PRED_FAILURE_ASSERT, /* OP_STATUS_OTHER */ SAHPI_ES_PRED_FAILURE_DEASSERT, /* OP_STATUS_OK */ SAHPI_ES_PRED_FAILURE_ASSERT, /* OP_STATUS_DEGRADED */ -1, /* OP_STATUS_STRESSED - not supported by OA */ -1, /* OP_STATUS_PREDICTIVE_FAILURE - not supported by OA */ -1, /* OP_STATUS_ERROR - not supported by OA */ SAHPI_ES_PRED_FAILURE_ASSERT, /* OP_STATUS_NON_RECOVERABLE_ERROR */ -1, /* OP_STATUS_STARTING - not supported by OA */ -1, /* OP_STATUS_STOPPING - not supported by OA */ -1, /* OP_STATUS_STOPPED - not supported by OA */ -1, /* OP_STATUS_IN_SERVICE - not supported by OA */ -1, /* OP_STATUS_NO_CONTACT - not supported by OA */ -1, /* OP_STATUS_LOST_COMMUNICATION - not supported by OA */ -1, /* OP_STATUS_ABORTED - not supported by OA */ -1, /* OP_STATUS_DORMANT - not supported by OA */ -1, /* OP_STATUS_SUPPORTING_ENTITY_IN_ERROR - not supported * by OA */ -1, /* OP_STATUS_COMPLETED - not supported by OA */ -1, /* OP_STATUS_POWER_MODE - not supported by OA */ -1, /* OP_STATUS_DMTF_RESERVED - not supported by OA */ -1, /* OP_STATUS_VENDER_RESERVED - not supported by OA */ }, /* OA_SOAP_REDUND_CLASS. This uses the enum redundancy values * as index */ { -1, /* REDUNDANCY_NO_OP - This state is returned if the * device is not present. Ideally, this should never * get executed. */ SAHPI_ES_REDUNDANCY_LOST, /* REDUNDANCY_UNKNOWN */ SAHPI_ES_REDUNDANCY_LOST, /* NOT_REDUNDANT */ SAHPI_ES_FULLY_REDUNDANT, /* REDUNDANT */ /* dummy value to fill up array */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, /* OA_SOAP_DIAG_CLASS. This uses the enum diagnosticStatus * values as index */ { -1, /* NOT_RELEVANT - this means that sensor is not * supported. Ideally, this will never be returned. * Not supported sensors will not be modelled for * the resources in OA SOAP plugin */ SAHPI_ES_ENABLED, /* DIAGNOSTIC_CHECK_NOT_PERFORMED */ SAHPI_ES_ENABLED, /* NO_ERROR */ SAHPI_ES_DISABLED, /* ERROR */ /* dummy value to fill up array */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, /* OA_SOAP_TEMP_CLASS sensor class. set the array contents to -1, * as thermal class sensors do not utilize this mapping entry */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, /* OA_SOAP_PWR_STATUS_CLASS sensor class. set the array contents to * -1, as power status class sensors do not utilize this mapping entry */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, /* OA_SOAP_FAN_SPEED_CLASS sensor class. set the array contents to * -1, as fan speed class sensors do not utilize this mapping entry */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, /* OA_SOAP_PWR_SUBSYS_CLASS sensor class. set the array contents to * -1, as power subsystem class sensors do not utilize this mapping * entry */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, /* OA_SOAP_ENC_AGR_OPER_CLASS sensor class. This uses the enum * lcdSetupHealth values as index */ { SAHPI_ES_DISABLED, /* LCD_SETUP_HEALTH_UNKNOWN */ SAHPI_ES_ENABLED, /* LCD_SETUP_HEALTH_OK */ SAHPI_ES_ENABLED, /* LCD_SETUP_HEALTH_INFORMATIONAL */ SAHPI_ES_ENABLED, /* LCD_SETUP_HEALTH_DEGRADED */ SAHPI_ES_DISABLED, /* LCD_SETUP_HEALTH_FAILED */ /* dummy value to fill up array */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, /* OA_SOAP_ENC_AGR_PRED_FAIL_CLASS sensor class. This uses the enum * lcdSetupHealth values as index */ { SAHPI_ES_DISABLED, /* LCD_SETUP_HEALTH_UNKNOWN */ SAHPI_ES_ENABLED, /* LCD_SETUP_HEALTH_OK */ SAHPI_ES_DISABLED, /* LCD_SETUP_HEALTH_INFORMATIONAL */ SAHPI_ES_DISABLED, /* LCD_SETUP_HEALTH_DEGRADED */ SAHPI_ES_DISABLED, /* LCD_SETUP_HEALTH_FAILED */ /* dummy value to fill up array */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, /* OA_SOAP_BOOL_CLASS sensor class. This uses the enum * hpoa_boolean values as index. This class is used for OA link status. * The sensor value 'true' means sensor state is enabled. */ { SAHPI_ES_DISABLED, /* false */ SAHPI_ES_ENABLED, /* true */ /* dummy value to fill up array */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, /* OA_SOAP_BOOL_RVRS_CLASS sensor class. This uses the enum * hpoa_boolean values as index. This class is used for interconnect CPU * fault and health LED. Then sensor value 'false' means sensor state * is enabled. */ { SAHPI_ES_ENABLED, /* false */ SAHPI_ES_DISABLED, /* true */ /* dummy value to fill up array */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, /* OA_SOAP_HEALTH_OPER_CLASS sensor class. This uses the enum * oa_soap_extra_data_health values as index */ { SAHPI_ES_DISABLED, /* HEALTH_UNKNOWN */ SAHPI_ES_DISABLED, /* HEALTH_OTHER */ SAHPI_ES_ENABLED, /* HEALTH_OK */ SAHPI_ES_ENABLED, /* HEALTH_DEGRAD */ SAHPI_ES_ENABLED, /* HEALTH_STRESSED */ SAHPI_ES_ENABLED, /* HEALTH_PRED_FAIL */ SAHPI_ES_DISABLED, /* HEALTH_ERROR */ SAHPI_ES_DISABLED, /* HEALTH_NRE */ /* dummy value to fill up array */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, /* OA_SOAP_HEALTH_PRED_FAIL_CLASS sensor class. This uses the * enum oa_soap_extra_data_health values as index */ { SAHPI_ES_DISABLED, /* HEALTH_UNKNOWN */ SAHPI_ES_DISABLED, /* HEALTH_OTHER */ SAHPI_ES_ENABLED, /* HEALTH_OK */ SAHPI_ES_DISABLED, /* HEALTH_DEGRAD */ SAHPI_ES_DISABLED, /* HEALTH_STRESSED */ SAHPI_ES_DISABLED, /* HEALTH_PRED_FAIL */ SAHPI_ES_DISABLED, /* HEALTH_ERROR */ SAHPI_ES_DISABLED, /* HEALTH_NRE */ /* dummy value to fill up array */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, }; /* Array for mapping the OA enums to OA SOAP plugin sensor assert states. * -1 is assigned, if the OA is not supporting the enum value. * * Please modify the array on adding new sensor class and/or changing the * sensor enum values defined in oa_soap_resources.h */ const SaHpiInt32T oa_soap_sen_assert_map_arr[OA_SOAP_MAX_SEN_CLASS] [OA_SOAP_MAX_ENUM] = { /* OA_SOAP_OPER_CLASS. This uses the enum opStatus values * as index */ { /* uses the enum opStatus values as index */ OA_SOAP_SEN_ASSERT_TRUE, /* OP_STATUS_UNKNOWN */ OA_SOAP_SEN_ASSERT_TRUE, /* OP_STATUS_OTHER */ OA_SOAP_SEN_ASSERT_FALSE, /* OP_STATUS_OK */ OA_SOAP_SEN_ASSERT_FALSE, /* OP_STATUS_DEGRADED */ -1, /* OP_STATUS_STRESSED - not supported by OA */ -1, /* OP_STATUS_PREDICTIVE_FAILURE - not supported by OA */ -1, /* OP_STATUS_ERROR - not supported by OA */ OA_SOAP_SEN_ASSERT_TRUE, /* OP_STATUS_NON_RECOVERABLE_ERROR */ -1, /* OP_STATUS_STARTING - not supported by OA */ -1, /* OP_STATUS_STOPPING - not supported by OA */ -1, /* OP_STATUS_STOPPED - not supported by OA */ -1, /* OP_STATUS_IN_SERVICE - not supported by OA */ -1, /* OP_STATUS_NO_CONTACT - not supported by OA */ -1, /* OP_STATUS_LOST_COMMUNICATION - not supported by OA */ -1, /* OP_STATUS_ABORTED - not supported by OA */ -1, /* OP_STATUS_DORMANT - not supported by OA */ -1, /* OP_STATUS_SUPPORTING_ENTITY_IN_ERROR - not supported * by OA */ -1, /* OP_STATUS_COMPLETED - not supported by OA */ -1, /* OP_STATUS_POWER_MODE - not supported by OA */ -1, /* OP_STATUS_DMTF_RESERVED - not supported by OA */ -1, /* OP_STATUS_VENDER_RESERVED - not supported by OA */ }, /* OA_SOAP_PRED_FAIL_CLASS. This uses the enum opStatus values * as index */ { /* uses the enum opStatus values as index */ OA_SOAP_SEN_ASSERT_TRUE, /* OP_STATUS_UNKNOWN */ OA_SOAP_SEN_ASSERT_TRUE, /* OP_STATUS_OTHER */ OA_SOAP_SEN_ASSERT_FALSE, /* OP_STATUS_OK */ OA_SOAP_SEN_ASSERT_TRUE, /* OP_STATUS_DEGRADED */ -1, /* OP_STATUS_STRESSED - not supported by OA */ -1, /* OP_STATUS_PREDICTIVE_FAILURE - not supported * by OA */ -1, /* OP_STATUS_ERROR - not supported by OA */ OA_SOAP_SEN_ASSERT_TRUE, /* OP_STATUS_NON_RECOVERABLE_ERROR */ -1, /* OP_STATUS_STARTING - not supported by OA */ -1, /* OP_STATUS_STOPPING - not supported by OA */ -1, /* OP_STATUS_STOPPED - not supported by OA */ -1, /* OP_STATUS_IN_SERVICE - not supported by OA */ -1, /* OP_STATUS_NO_CONTACT - not supported by OA */ -1, /* OP_STATUS_LOST_COMMUNICATION - not supported * by OA */ -1, /* OP_STATUS_ABORTED - not supported by OA */ -1, /* OP_STATUS_DORMANT - not supported by OA */ -1, /* OP_STATUS_SUPPORTING_ENTITY_IN_ERROR - not * supported by OA */ -1, /* OP_STATUS_COMPLETED - not supported by OA */ -1, /* OP_STATUS_POWER_MODE - not supported by OA */ -1, /* OP_STATUS_DMTF_RESERVED - not supported by OA */ -1, /* OP_STATUS_VENDER_RESERVED - not supported * by OA */ }, /* OA_SOAP_REDUND_CLASS. This uses the enum redundancy values * as index */ { /* uses the enum opStatus values as index */ -1, /* REDUNDANCY_NO_OP - This state is returned if the * device is not present. Ideally, this should never * get executed. */ OA_SOAP_SEN_ASSERT_TRUE, /* REDUNDANCY_UNKNOWN */ OA_SOAP_SEN_ASSERT_TRUE, /* NOT_REDUNDANT */ OA_SOAP_SEN_ASSERT_FALSE, /* REDUNDANT */ /* dummy value to fill up array */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, /* OA_SOAP_DIAG_CLASS. This uses the enum diagnosticStatus * values as index */ { /* uses the enum opStatus values as index */ -1, /* NOT_RELEVANT - this means that sensor is not * supported. Ideally, this will never be returned. * Not supported sensors will not be modelled for * the resources in OA SOAP plugin */ OA_SOAP_SEN_ASSERT_FALSE, /* DIAGNOSTIC_CHECK_NOT_PERFORMED */ OA_SOAP_SEN_ASSERT_FALSE, /* NO_ERROR */ OA_SOAP_SEN_ASSERT_TRUE, /* ERROR */ /* dummy value to fill up array */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, /* OA_SOAP_TEMP_CLASS sensor class. set the array contents to -1, * as thermal class sensors do not utilize this mapping entry */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, /* OA_SOAP_PWR_STATUS_CLASS sensor class. set the array contents to * -1, as power status class sensors do not utilize this mapping entry */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, /* OA_SOAP_FAN_SPEED_CLASS sensor class. set the array contents to * -1, as fan speed class sensors do not utilize this mapping entry */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, /* OA_SOAP_PWR_SUBSYS_CLASS sensor class. set the array contents to * -1, as power subsystem class sensors do not utilize this mapping * entry */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, /* OA_SOAP_ENC_AGR_OPER_CLASS sensor class. This uses the enum * lcdSetupHealth values as index */ { OA_SOAP_SEN_ASSERT_TRUE, /* LCD_SETUP_HEALTH_UNKNOWN */ OA_SOAP_SEN_ASSERT_FALSE, /* LCD_SETUP_HEALTH_OK */ OA_SOAP_SEN_ASSERT_FALSE, /* LCD_SETUP_HEALTH_INFORMATIONAL */ OA_SOAP_SEN_ASSERT_FALSE, /* LCD_SETUP_HEALTH_DEGRADED */ OA_SOAP_SEN_ASSERT_TRUE, /* LCD_SETUP_HEALTH_FAILED */ /* dummy value to fill up array */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, /* OA_SOAP_ENC_AGR_PRED_FAIL_CLASS sensor class. This uses the enum * lcdSetupHealth values as index */ { OA_SOAP_SEN_ASSERT_TRUE, /* LCD_SETUP_HEALTH_UNKNOWN */ OA_SOAP_SEN_ASSERT_FALSE, /* LCD_SETUP_HEALTH_OK */ OA_SOAP_SEN_ASSERT_TRUE, /* LCD_SETUP_HEALTH_INFORMATIONAL */ OA_SOAP_SEN_ASSERT_TRUE, /* LCD_SETUP_HEALTH_DEGRADED */ OA_SOAP_SEN_ASSERT_TRUE, /* LCD_SETUP_HEALTH_FAILED */ /* dummy value to fill up array */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, /* OA_SOAP_BOOL_CLASS sensor class. This uses the enum * hpoa_boolean values as index. This class is used for OA link status. * The sensor values 'false' means sensor state is asserted. */ { OA_SOAP_SEN_ASSERT_TRUE, /* false */ OA_SOAP_SEN_ASSERT_FALSE, /* true */ /* dummy value to fill up array */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, /* OA_SOAP_BOOL_RVRS_CLASS sensor class. This uses the enum * hpoa_boolean values as index. This class is used for interconnect CPU * fault and health LED. The sensor value 'true' means sensor state * is asserted */ { OA_SOAP_SEN_ASSERT_FALSE, /* false */ OA_SOAP_SEN_ASSERT_TRUE, /* true */ /* dummy value to fill up array */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, /* OA_SOAP_HEALTH_OPER_CLASS sensor class. This uses the enum * oa_soap_extra_data_health values as index */ { OA_SOAP_SEN_ASSERT_TRUE, /* HEALTH_UNKNOWN */ OA_SOAP_SEN_ASSERT_TRUE, /* HEALTH_OTHER */ OA_SOAP_SEN_ASSERT_FALSE, /* HEALTH_OK */ OA_SOAP_SEN_ASSERT_FALSE, /* HEALTH_DEGRAD */ OA_SOAP_SEN_ASSERT_FALSE, /* HEALTH_STRESSED */ OA_SOAP_SEN_ASSERT_FALSE, /* HEALTH_PRED_FAIL */ OA_SOAP_SEN_ASSERT_TRUE, /* HEALTH_ERROR */ OA_SOAP_SEN_ASSERT_TRUE, /* HEALTH_NRE */ /* dummy value to fill up array */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, /* OA_SOAP_HEALTH_PRED_FAIL_CLASS sensor class. This uses the * enum oa_soap_extra_data_health values as index */ { OA_SOAP_SEN_ASSERT_TRUE, /* HEALTH_UNKNOWN */ OA_SOAP_SEN_ASSERT_TRUE, /* HEALTH_OTHER */ OA_SOAP_SEN_ASSERT_FALSE, /* HEALTH_OK */ OA_SOAP_SEN_ASSERT_TRUE, /* HEALTH_DEGRAD */ OA_SOAP_SEN_ASSERT_TRUE, /* HEALTH_STRESSED */ OA_SOAP_SEN_ASSERT_TRUE, /* HEALTH_PRED_FAIL */ OA_SOAP_SEN_ASSERT_TRUE, /* HEALTH_ERROR */ OA_SOAP_SEN_ASSERT_TRUE, /* HEALTH_NRE */ /* dummy value to fill up array */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, }; /* Array for creating the sensor RDRs * * Please add new entries to the array on adding a new sensor */ const struct oa_soap_sensor oa_soap_sen_arr[] = { /* operational status sensor */ { .sensor = { .Num = OA_SOAP_SEN_OPER_STATUS, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_OPER_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_CRITICAL, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_OPER_STATUS, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_CRITICAL, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_OPER_STATUS, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Operational status", }, /* predictive failure status sensor */ { .sensor = { .Num = OA_SOAP_SEN_PRED_FAIL, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_PRED_FAIL, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_PRED_FAILURE_DEASSERT | SAHPI_ES_PRED_FAILURE_ASSERT, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_PRED_FAILURE_DEASSERT, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_PRED_FAILURE_ASSERT, .deassert_mask = SAHPI_ES_PRED_FAILURE_DEASSERT, }, .sensor_class = OA_SOAP_PRED_FAIL_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_PRED_FAIL, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_PRED_FAIL, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_PRED_FAILURE_ASSERT, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_PRED_FAILURE_DEASSERT, .CurrentState = SAHPI_ES_PRED_FAILURE_ASSERT, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_PRED_FAIL, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_PRED_FAIL, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_PRED_FAILURE_DEASSERT, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_PRED_FAILURE_ASSERT, .CurrentState = SAHPI_ES_PRED_FAILURE_DEASSERT, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Predictive failure", }, /* Thermal status sensor */ { .sensor = { .Num = OA_SOAP_SEN_TEMP_STATUS, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 43, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 38, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, /* For the resource supporting events, * update the event enable to TRUE and * set the masks accordingly to the support provided by * the resource. Default values below highlight * no-event support */ .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 43, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 38, }, }, .sensor_class = OA_SOAP_TEMP_CLASS, .sen_evt = { /* Assert an event for crossing CAUTION threshold * from OK condition */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_TEMP_STATUS, .SensorType = SAHPI_TEMPERATURE, .EventCategory = SAHPI_EC_THRESHOLD, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_UPPER_MAJOR, .OptionalDataPresent = SAHPI_SOD_TRIGGER_READING | SAHPI_SOD_TRIGGER_THRESHOLD | SAHPI_SOD_PREVIOUS_STATE | SAHPI_SOD_CURRENT_STATE, .TriggerReading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Trigger reading value is * initialized to "0". * Replace this value with * current sensor reading * value retrieved from OA */ .Value.SensorFloat64 = 0, }, .TriggerThreshold = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max * value should be replaced * with Normal Max value * retrieved from OA */ .Value.SensorFloat64 = 38, }, .PreviousState = SAHPI_ES_UNSPECIFIED, .CurrentState = SAHPI_ES_UPPER_MAJOR, .Oem = 0, .SensorSpecific = 0, }, }, /* De assert an event for crossing CAUTION threshold * to OK condition */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_TEMP_STATUS, .SensorType = SAHPI_TEMPERATURE, .EventCategory = SAHPI_EC_THRESHOLD, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_UPPER_MAJOR, .OptionalDataPresent = SAHPI_SOD_TRIGGER_READING | SAHPI_SOD_TRIGGER_THRESHOLD | SAHPI_SOD_PREVIOUS_STATE | SAHPI_SOD_CURRENT_STATE, .TriggerReading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Trigger reading value is * initialized to "0". * Replace this value with * current sensor reading value * retrieved from OA */ .Value.SensorFloat64 = 0 }, .TriggerThreshold = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max * value should be replaced * with Normal Max value * retrieved from OA */ .Value.SensorFloat64 = 38 }, .PreviousState = SAHPI_ES_UPPER_MAJOR, .CurrentState = SAHPI_ES_UNSPECIFIED, .Oem = 0, .SensorSpecific = 0, }, }, /* Assert an event for crossing CRITICAL threshold * from CAUTION condition */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_CRITICAL, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_TEMP_STATUS, .SensorType = SAHPI_TEMPERATURE, .EventCategory = SAHPI_EC_THRESHOLD, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_UPPER_CRIT, .OptionalDataPresent = SAHPI_SOD_TRIGGER_READING | SAHPI_SOD_TRIGGER_THRESHOLD | SAHPI_SOD_PREVIOUS_STATE | SAHPI_SOD_CURRENT_STATE, .TriggerReading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Trigger reading value is * initialized to "0". * Replace this value with * current sensor reading value * retrieved from OA */ .Value.SensorFloat64 = 0 }, .TriggerThreshold = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value * should be replaced with * Normal Max value retrieved * from OA */ .Value.SensorFloat64 = 43 }, .PreviousState = SAHPI_ES_UPPER_MAJOR, .CurrentState = SAHPI_ES_UPPER_CRIT, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert an event for crossing CRITICAL threshold * to CAUTION condition */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_CRITICAL, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_TEMP_STATUS, .SensorType = SAHPI_TEMPERATURE, .EventCategory = SAHPI_EC_THRESHOLD, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_UPPER_CRIT, .OptionalDataPresent = SAHPI_SOD_TRIGGER_READING | SAHPI_SOD_TRIGGER_THRESHOLD | SAHPI_SOD_PREVIOUS_STATE | SAHPI_SOD_CURRENT_STATE, .TriggerReading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Trigger reading value is * initialized to "0". * Replace this value with * current sensor reading value * retrieved from OA */ .Value.SensorFloat64 = 0 }, .TriggerThreshold = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value * should be replaced with * Normal Max value retrieved * from OA */ .Value.SensorFloat64 = 43 }, .PreviousState = SAHPI_ES_UPPER_CRIT, .CurrentState = SAHPI_ES_UPPER_MAJOR, .Oem = 0, .SensorSpecific = 0, }, }, }, .comment = "Ambient Zone", }, /* Redundancy status sensor */ { .sensor = { .Num = OA_SOAP_SEN_REDUND, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_REDUNDANCY, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_FULLY_REDUNDANT | SAHPI_ES_REDUNDANCY_LOST, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_FULLY_REDUNDANT, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_REDUNDANCY_LOST, .deassert_mask = SAHPI_ES_FULLY_REDUNDANT, }, .sensor_class = OA_SOAP_REDUND_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_REDUND, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_REDUNDANCY, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_REDUNDANCY_LOST, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_FULLY_REDUNDANT, .CurrentState = SAHPI_ES_REDUNDANCY_LOST, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_REDUND, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_REDUNDANCY, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_FULLY_REDUNDANT, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_REDUNDANCY_LOST, .CurrentState = SAHPI_ES_FULLY_REDUNDANT, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Redundancy status", }, /* Fan Speed Sensor */ { .sensor = { .Num = OA_SOAP_SEN_FAN_SPEED, .Type = SAHPI_COOLING_DEVICE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_RPM, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 18000, .Range.Min.IsSupported = SAHPI_TRUE, .Range.Min.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Min value should be * replaced with Min value retrieved * from OA */ .Range.Min.Value.SensorFloat64 = 10, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_LOWER_CRIT, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 18000, .LowCritical.IsSupported = SAHPI_TRUE, .LowCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .LowCritical.Value.SensorFloat64 = 10, }, }, .sensor_class = OA_SOAP_FAN_SPEED_CLASS, .comment = "Fan speed", }, /* Power status sensor */ { .sensor = { .Num = OA_SOAP_SEN_PWR_STATUS, .Type = SAHPI_POWER_SUPPLY, .Category = SAHPI_EC_UNSPECIFIED, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_WATTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = 0, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, }, .sensor_class = OA_SOAP_PWR_STATUS_CLASS, .comment = "Power status", }, /* Diagnostic internal data error sensor */ { .sensor = { .Num = OA_SOAP_SEN_INT_DATA_ERR, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_DIAG_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_INT_DATA_ERR, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_INT_DATA_ERR, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Internal Data error", }, /* Diagnostic management processor error sensor */ { .sensor = { .Num = OA_SOAP_SEN_MP_ERR, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_DIAG_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_MP_ERR, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_MP_ERR, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Management processor error", }, /* Power Supply Subsystem Power input Sensor */ { .sensor = { .Num = OA_SOAP_SEN_IN_PWR, .Type = SAHPI_POWER_SUPPLY, .Category = SAHPI_EC_UNSPECIFIED, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_WATTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = 0, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, }, .sensor_class = OA_SOAP_PWR_SUBSYS_CLASS, .comment = "Power Input sensor", }, /* Power Supply Subsystem Power output Sensor */ { .sensor = { .Num = OA_SOAP_SEN_OUT_PWR, .Type = SAHPI_POWER_SUPPLY, .Category = SAHPI_EC_UNSPECIFIED, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_WATTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = 0, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, }, .sensor_class = OA_SOAP_PWR_SUBSYS_CLASS, .comment = "Power Output sensor", }, /* Power Supply Subsystem Power capacity Sensor */ { .sensor = { .Num = OA_SOAP_SEN_PWR_CAPACITY, .Type = SAHPI_POWER_SUPPLY, .Category = SAHPI_EC_UNSPECIFIED, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_WATTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = 0, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, }, .sensor_class = OA_SOAP_PWR_SUBSYS_CLASS, .comment = "Power Capacity sensor", }, /* Diagnostic thermal warning sensor */ { .sensor = { .Num = OA_SOAP_SEN_THERM_WARN, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_DIAG_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MINOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_THERM_WARN, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MINOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_THERM_WARN, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Thermal warning", }, /* Diagnostic thermal danger sensor */ { .sensor = { .Num = OA_SOAP_SEN_THERM_DANGER, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_DIAG_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_THERM_DANGER, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_THERM_DANGER, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Thermal danger", }, /* Diagnostic IO configuration error sensor */ { .sensor = { .Num = OA_SOAP_SEN_IO_CONFIG_ERR, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_DIAG_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_IO_CONFIG_ERR, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_IO_CONFIG_ERR, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "IO configuration error", }, /* Diagnostic device power request error sensor */ { .sensor = { .Num = OA_SOAP_SEN_DEV_PWR_REQ, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_DIAG_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_DEV_PWR_REQ, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_DEV_PWR_REQ, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Device power request error", }, /* Diagnostic insufficient cooling sensor */ { .sensor = { .Num = OA_SOAP_SEN_INSUF_COOL, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_DIAG_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_INSUF_COOL, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_INSUF_COOL, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Insufficient cooling", }, /* Diagnostic device location error sensor */ { .sensor = { .Num = OA_SOAP_SEN_DEV_LOC_ERR, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_DIAG_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_DEV_LOC_ERR, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_DEV_LOC_ERR, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Device location error", }, /* Diagnostic device failure sensor */ { .sensor = { .Num = OA_SOAP_SEN_DEV_FAIL, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_DIAG_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_DEV_FAIL, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_DEV_FAIL, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Device failure", }, /* Diagnostic device degraded sensor */ { .sensor = { .Num = OA_SOAP_SEN_DEV_DEGRAD, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_DIAG_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MINOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_DEV_DEGRAD, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MINOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_DEV_DEGRAD, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Device degraded", }, /* Diagnostic AC failure sensor */ { .sensor = { .Num = OA_SOAP_SEN_AC_FAIL, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_DIAG_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_AC_FAIL, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_AC_FAIL, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "AC failure", }, /* Diagnostic i2c buses sensor */ { .sensor = { .Num = OA_SOAP_SEN_I2C_BUS, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_DIAG_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_I2C_BUS, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_I2C_BUS, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "i2c buses", }, /* Diagnostic redundancy error sensor */ { .sensor = { .Num = OA_SOAP_SEN_REDUND_ERR, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_DIAG_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MINOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_REDUND_ERR, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MINOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_REDUND_ERR, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "redundancy error", }, /* Enclosure aggregate operational status sensor */ { .sensor = { .Num = OA_SOAP_SEN_ENC_AGR_OPER, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_ENC_AGR_OPER_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_CRITICAL, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_ENC_AGR_OPER, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_CRITICAL, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_ENC_AGR_OPER, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Enclosure aggregate operational status", }, /* Enclosure aggregate predictive failure sensor */ { .sensor = { .Num = OA_SOAP_SEN_ENC_AGR_PRED_FAIL, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_ENC_AGR_PRED_FAIL_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_ENC_AGR_PRED_FAIL, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_ENC_AGR_PRED_FAIL, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Enclosure aggregate predictive failure", }, /* OA redundancy sensor */ { .sensor = { .Num = OA_SOAP_SEN_OA_REDUND, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_BOOL_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_OA_REDUND, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_OA_REDUND, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "OA Redundancy", }, /* OA link status sensor */ { .sensor = { .Num = OA_SOAP_SEN_OA_LINK_STATUS, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_BOOL_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_CRITICAL, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_OA_LINK_STATUS, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_CRITICAL, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_OA_LINK_STATUS, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "OA link status", }, /* Interconnect CPU fault sensor */ { .sensor = { .Num = OA_SOAP_SEN_CPU_FAULT, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_BOOL_RVRS_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_CRITICAL, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_CPU_FAULT, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_CRITICAL, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_CPU_FAULT, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Interconnect CPU Fault", }, /* Interconnect health LED sensor */ { .sensor = { .Num = OA_SOAP_SEN_HEALTH_LED, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_BOOL_RVRS_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MINOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_HEALTH_LED, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MINOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_HEALTH_LED, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Interconnect health LED", }, /* Health status operational sensor */ { .sensor = { .Num = OA_SOAP_SEN_HEALTH_OPER, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_HEALTH_OPER_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_CRITICAL, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_HEALTH_OPER, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_CRITICAL, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_HEALTH_OPER, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Health status operational", }, /* Health status predictive failure sensor */ { .sensor = { .Num = OA_SOAP_SEN_HEALTH_PRED_FAIL, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_HEALTH_PRED_FAIL_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_HEALTH_PRED_FAIL, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_HEALTH_PRED_FAIL, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Health status predictive failure", }, /* DiagnosticChecksEx Device missing sensor */ { .sensor = { .Num = OA_SOAP_SEN_DEV_MISS, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_DIAG_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_DEV_MISS, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_DEV_MISS, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Device missing", }, /* DiagnosticChecksEx Device power sequence sensor */ { .sensor = { .Num = OA_SOAP_SEN_DEV_PWR_SEQ, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_DIAG_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_DEV_PWR_SEQ, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_DEV_PWR_SEQ, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Device power sequence", }, /* DiagnosticChecksEx Device bonding sensor */ { .sensor = { .Num = OA_SOAP_SEN_DEV_BOND, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_DIAG_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_DEV_BOND, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_DEV_BOND, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Device bonding", }, /* DiagnosticChecksEx network configuration sensor */ { .sensor = { .Num = OA_SOAP_SEN_NET_CONFIG, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_DIAG_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_NET_CONFIG, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_NET_CONFIG, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Network configuration", }, /* DiagnosticChecksEx firmware mismatch sensor */ { .sensor = { .Num = OA_SOAP_SEN_FW_MISMATCH, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_DIAG_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_FW_MISMATCH, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_FW_MISMATCH, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Firmwre mismatch", }, /* DiagnosticChecksEx Profile unassigned error sensor */ { .sensor = { .Num = OA_SOAP_SEN_PROF_UNASSIGN_ERR, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_DIAG_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_PROF_UNASSIGN_ERR, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_PROF_UNASSIGN_ERR, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Profile unassigned error", }, /* DiagnosticChecksEx Device not supported sensor */ { .sensor = { .Num = OA_SOAP_SEN_DEV_NOT_SUPPORT, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_DIAG_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_DEV_NOT_SUPPORT, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_DEV_NOT_SUPPORT, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Device not supported", }, /* DiagnosticChecksEx Too low power request sensor */ { .sensor = { .Num = OA_SOAP_SEN_TOO_LOW_PWR_REQ, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_DIAG_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_TOO_LOW_PWR_REQ, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_TOO_LOW_PWR_REQ, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Too low power request", }, /* DiagnosticChecksEx Call HP sensor */ { .sensor = { .Num = OA_SOAP_SEN_CALL_HP, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_DIAG_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_INFORMATIONAL, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_CALL_HP, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_INFORMATIONAL, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_CALL_HP, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Call HP", }, /* DiagnosticChecksEx Device informational sensor */ { .sensor = { .Num = OA_SOAP_SEN_DEV_INFO, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_DIAG_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_INFORMATIONAL, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_DEV_INFO, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_INFORMATIONAL, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_DEV_INFO, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Device informational", }, /* DiagnosticChecksEx Storage device missing sensor */ { .sensor = { .Num = OA_SOAP_SEN_STORAGE_DEV_MISS, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_DIAG_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_STORAGE_DEV_MISS, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_STORAGE_DEV_MISS, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Storage device missing", }, /* DiagnosticChecksEx Enclosure ID mismatch sensor */ { .sensor = { .Num = OA_SOAP_SEN_ENC_ID_MISMATCH, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_DIAG_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MINOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_ENC_ID_MISMATCH, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MINOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_ENC_ID_MISMATCH, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Enclosure ID mismatch", }, /* DiagnosticChecksEx Device mix match sensor */ { .sensor = { .Num = OA_SOAP_SEN_DEV_MIX_MATCH, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_DIAG_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MINOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_DEV_MIX_MATCH, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MINOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_DEV_MIX_MATCH, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Device mix match", }, /* DiagnosticChecksEx Power capping error sensor */ { .sensor = { .Num = OA_SOAP_SEN_GRPCAP_ERR, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_DIAG_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_GRPCAP_ERR, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_GRPCAP_ERR, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Power capping error", }, /* DiagnosticChecksEx IML recorded errors sensor */ { .sensor = { .Num = OA_SOAP_SEN_IML_ERR, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_DIAG_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_INFORMATIONAL, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_IML_ERR, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_INFORMATIONAL, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_IML_ERR, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "IML recorded errors", }, /* DiagnosticChecksEx Duplicate management IP address sensor */ { .sensor = { .Num = OA_SOAP_SEN_DUP_MGMT_IP_ADDR, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_DIAG_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_DUP_MGMT_IP_ADDR, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_DUP_MGMT_IP_ADDR, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Duplicate management IP address", }, /* System zone1 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_SYSTEM_ZONE1, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 85, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 80, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 85, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 80, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "System Zone", }, /* System zone2 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_SYSTEM_ZONE2, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 85, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 80, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 85, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 80, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "System Zone", }, /* System zone3 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_SYSTEM_ZONE3, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 85, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 80, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 85, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 80, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "System Zone", }, /* System zone4 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_SYSTEM_ZONE4, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 85, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 80, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 85, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 80, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "System Zone", }, /* System zone5 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_SYSTEM_ZONE5, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 75, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 70, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 75, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 70, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "System Zone", }, /* System zone6 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_SYSTEM_ZONE6, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 75, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 70, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 75, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 70, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "System Zone", }, /* System zone7 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_SYSTEM_ZONE7, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 75, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 70, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 75, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 70, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "System Zone", }, /* System zone8 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_SYSTEM_ZONE8, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 75, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 70, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 75, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 70, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "System Zone", }, /* CPU zone1 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_CPU_ZONE1, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 70, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 65, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 70, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 65, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "CPU Zone", }, /* CPU zone2 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_CPU_ZONE2, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 70, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 65, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 70, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 65, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "CPU Zone", }, /* CPU zone3 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_CPU_ZONE3, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 70, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 65, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 70, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 65, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "CPU Zone", }, /* CPU zone4 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_CPU_ZONE4, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 70, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 65, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 70, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 65, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "CPU Zone", }, /* Memory zone1 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_MEM_ZONE1, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 100, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 85, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 100, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 85, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "Memory Zone", }, /* Memory zone2 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_MEM_ZONE2, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 100, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 85, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 100, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 85, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "Memory Zone", }, /* Memory zone3 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_MEM_ZONE3, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 100, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 85, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 100, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 85, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "Memory Zone", }, /* Memory zone4 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_MEM_ZONE4, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 100, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 85, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 100, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 85, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "Memory Zone", }, /* Memory zone5 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_MEM_ZONE5, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 92, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 87, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 92, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 87, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "Memory Zone", }, /* Memory zone6 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_MEM_ZONE6, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 92, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 87, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 92, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 87, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "Memory Zone", }, /* Memory zone7 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_MEM_ZONE7, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 92, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 87, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 92, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 87, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "Memory Zone", }, /* Memory zone8 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_MEM_ZONE8, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 92, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 87, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 92, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 87, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "Memory Zone", }, /* Disk zone1 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_DISK_ZONE1, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 100, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 85, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 100, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 85, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "Disk Zone", }, /* Disk zone2 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_DISK_ZONE2, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 100, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 85, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 100, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 85, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "Disk Zone", }, /* Disk zone3 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_DISK_ZONE3, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 100, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 85, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 100, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 85, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "Disk Zone", }, /* Disk zone4 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_DISK_ZONE4, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 100, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 85, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 100, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 85, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "Disk Zone", }, /* CPU 1 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_CPU1_1, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 100, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 95, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 100, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 95, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "CPU 1", }, /* CPU 1 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_CPU1_2, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 100, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 95, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 100, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 95, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "CPU 1", }, /* CPU 1 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_CPU1_3, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 100, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 95, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 100, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 95, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "CPU 1", }, /* CPU 1 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_CPU1_4, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 100, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 95, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 100, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 95, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "CPU 1", }, /* CPU 2 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_CPU2_1, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 100, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 95, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 100, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 95, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "CPU 2", }, /* CPU 2 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_CPU2_2, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 100, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 95, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 100, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 95, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "CPU 2", }, /* CPU 2 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_CPU2_3, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 100, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 95, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 100, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 95, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "CPU 2", }, /* CPU 2 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_CPU2_4, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 100, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 95, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 100, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 95, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "CPU 2", }, /* CPU 3 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_CPU3_1, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 100, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 95, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 100, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 95, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "CPU 3", }, /* CPU 3 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_CPU3_2, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 100, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 95, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 100, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 95, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "CPU 3", }, /* CPU 3 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_CPU3_3, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 100, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 95, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 100, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 95, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "CPU 3", }, /* CPU 3 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_CPU3_4, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 100, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 95, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 100, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 95, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "CPU 3", }, /* CPU 4 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_CPU4_1, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 100, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 95, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 100, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 95, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "CPU 4", }, /* CPU 4 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_CPU4_2, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 100, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 95, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 100, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 95, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "CPU 4", }, /* CPU 4 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_CPU4_3, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 100, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 95, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 100, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 95, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "CPU 4", }, /* CPU 4 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_CPU4_4, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 100, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 95, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 100, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 95, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "CPU 4", }, /* Storage zone1 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_STORAGE_ZONE1, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 65, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 60, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 65, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 60, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "Storage Zone", }, /* Storage zone2 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_STORAGE_ZONE2, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 65, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 60, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 65, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 60, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "Storage Zone", }, /* Storage zone3 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_STORAGE_ZONE3, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 65, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 60, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 65, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 60, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "Storage Zone", }, /* Storage zone4 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_STORAGE_ZONE4, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 65, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 60, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 65, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 60, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "Storage Zone", }, /* I/O Board zone1 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_IO_BOARD_ZONE1, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 86, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 81, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 86, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 81, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "I/O Board Zone", }, /* I/O Board zone2 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_IO_BOARD_ZONE2, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 86, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 81, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 86, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 81, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "I/O Board Zone", }, /* I/O Board zone3 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_IO_BOARD_ZONE3, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 86, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 81, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 86, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 81, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "I/O Board Zone", }, /* I/O Board zone4 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_IO_BOARD_ZONE4, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 86, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 81, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 86, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 81, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "I/O Board Zone", }, /* I/O Board zone5 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_IO_BOARD_ZONE5, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 86, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 81, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 86, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 81, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "I/O Board Zone", }, /* I/O Board zone6 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_IO_BOARD_ZONE6, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 86, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 81, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 86, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 81, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "I/O Board Zone", }, /* I/O Board zone7 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_IO_BOARD_ZONE7, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 86, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 81, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 86, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 81, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "I/O Board Zone", }, /* I/O Board zone8 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_IO_BOARD_ZONE8, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 86, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 81, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 86, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 81, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "I/O Board Zone", }, /* Power Supply zone1 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_POWER_SUPPLY_ZONE1, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 100, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 85, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 100, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 85, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "Power Supply Zone", }, /* Power Supply zone2 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_POWER_SUPPLY_ZONE2, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 100, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 85, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 100, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 85, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "Power Supply Zone", }, /* Power Supply zone3 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_POWER_SUPPLY_ZONE3, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 100, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 85, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 100, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 85, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "Power Supply Zone", }, /* Power Supply zone4 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_POWER_SUPPLY_ZONE4, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 100, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 85, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 100, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 85, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "Power Supply Zone", }, /* Power Supply zone5 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_POWER_SUPPLY_ZONE5, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 100, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 85, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 100, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 85, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "Power Supply Zone", }, /* Power Supply zone6 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_POWER_SUPPLY_ZONE6, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 100, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 85, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 100, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 85, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "Power Supply Zone", }, /* Power Supply zone7 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_POWER_SUPPLY_ZONE7, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 100, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 85, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 100, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 85, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "Power Supply Zone", }, /* Power Supply zone8 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_POWER_SUPPLY_ZONE8, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 100, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 85, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 100, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 85, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "Power Supply Zone", }, /* Chassis Zone1 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_CHASSIS_ZONE1, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 86, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 81, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 86, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 81, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "Chassis Zone", }, /* Chassis zone2 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_CHASSIS_ZONE2, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 86, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 81, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 86, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 81, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "Chassis Zone", }, /* NULL element to end the array */ {} }; /* Global array containing the details of all control rdr structure details * * Please add new entries to the array on supporting new control in OA SOAP */ const struct oa_soap_control oa_soap_cntrl_arr[] = { /* UID status */ { .control = { .Num = OA_SOAP_UID_CNTRL, .OutputType = SAHPI_CTRL_LED, .Type = SAHPI_CTRL_TYPE_DIGITAL, .TypeUnion.Digital.Default = SAHPI_CTRL_STATE_OFF, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_MANUAL, .ReadOnly = SAHPI_TRUE, }, .WriteOnly = SAHPI_FALSE, .Oem = 0, }, .comment = "UID LED state", }, /* Power status */ { .control = { .Num = OA_SOAP_PWR_CNTRL, .OutputType = SAHPI_CTRL_POWER_STATE, .Type = SAHPI_CTRL_TYPE_DIGITAL, .TypeUnion.Digital.Default = SAHPI_CTRL_STATE_ON, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_MANUAL, .ReadOnly = SAHPI_TRUE, }, .WriteOnly = SAHPI_FALSE, .Oem = 0, }, .comment = "power state", }, /* LCD button lock */ { .control = { .Num = OA_SOAP_LCD_BUTN_LCK_CNTRL, .OutputType = SAHPI_CTRL_FRONT_PANEL_LOCKOUT, .Type = SAHPI_CTRL_TYPE_DIGITAL, .TypeUnion.Digital.Default = SAHPI_CTRL_STATE_OFF, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_MANUAL, .ReadOnly = SAHPI_TRUE, }, .WriteOnly = SAHPI_FALSE, .Oem = 0, }, .comment = "LCD button lock", }, /* Power Mode Control */ { .control = { .Num = OA_SOAP_PWR_MODE_CNTRL, .OutputType = SAHPI_CTRL_POWER_BUDGET, .Type = SAHPI_CTRL_TYPE_DISCRETE, .TypeUnion.Discrete.Default = AC_REDUNDANT, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_MANUAL, .ReadOnly = SAHPI_FALSE, }, .WriteOnly = SAHPI_FALSE, .Oem = 0, }, .comment = "power mode control", }, /* Dynamic Power Control */ { .control = { .Num = OA_SOAP_DYNAMIC_PWR_CNTRL, .OutputType = SAHPI_CTRL_POWER_BUDGET, .Type = SAHPI_CTRL_TYPE_DIGITAL, .TypeUnion.Digital.Default = SAHPI_CTRL_STATE_ON, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_MANUAL, .ReadOnly = SAHPI_FALSE, }, .WriteOnly = SAHPI_FALSE, .Oem = 0, }, .comment = "dynamic power control", }, /* Power Limit Mode Control */ { .control = { .Num = OA_SOAP_PWR_LIMIT_MODE_CNTRL, .OutputType = SAHPI_CTRL_POWER_BUDGET, .Type = SAHPI_CTRL_TYPE_DISCRETE, .TypeUnion.Discrete.Default = POWER_LIMIT_NONE, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_MANUAL, .ReadOnly = SAHPI_FALSE, }, .WriteOnly = SAHPI_FALSE, .Oem = 0, }, .comment = "power limit mode control", }, /* Static Power Limit Control */ { .control = { .Num = OA_SOAP_STATIC_PWR_LIMIT_CNTRL, .OutputType = SAHPI_CTRL_POWER_BUDGET, .Type = SAHPI_CTRL_TYPE_ANALOG, .TypeUnion.Analog.Min = 0x00, .TypeUnion.Analog.Max = 0x00, .TypeUnion.Analog.Default = 0x00, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_MANUAL, .ReadOnly = SAHPI_FALSE, }, .WriteOnly = SAHPI_FALSE, .Oem = 0, }, .comment = "static power limit control", }, /* Dynamic Power Cap Control */ { .control = { .Num = OA_SOAP_DYNAMIC_PWR_CAP_CNTRL, .OutputType = SAHPI_CTRL_POWER_BUDGET, .Type = SAHPI_CTRL_TYPE_ANALOG, .TypeUnion.Analog.Min = 0x00, .TypeUnion.Analog.Max = 0x00, .TypeUnion.Analog.Default = 0x00, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_MANUAL, .ReadOnly = SAHPI_FALSE, }, .WriteOnly = SAHPI_FALSE, .Oem = 0, }, .comment = "dynamic power cap control", }, /* Derated Circuit Cap Control */ { .control = { .Num = OA_SOAP_DERATED_CIRCUIT_CAP_CNTRL, .OutputType = SAHPI_CTRL_POWER_BUDGET, .Type = SAHPI_CTRL_TYPE_ANALOG, .TypeUnion.Analog.Min = 0x00, .TypeUnion.Analog.Max = 0x00, .TypeUnion.Analog.Default = 0x00, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_MANUAL, .ReadOnly = SAHPI_FALSE, }, .WriteOnly = SAHPI_FALSE, .Oem = 0, }, .comment = "derated circuit cap control", }, /* Rated Circuit Cap Control */ { .control = { .Num = OA_SOAP_RATED_CIRCUIT_CAP_CNTRL, .OutputType = SAHPI_CTRL_POWER_BUDGET, .Type = SAHPI_CTRL_TYPE_ANALOG, .TypeUnion.Analog.Min = 0x00, .TypeUnion.Analog.Max = 0x00, .TypeUnion.Analog.Default = 0x00, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_MANUAL, .ReadOnly = SAHPI_FALSE, }, .WriteOnly = SAHPI_FALSE, .Oem = 0, }, .comment = "rated circuit cap control", }, {} /* Terminate array with a null element */ }; /* Array for constructing the RPT entry. The EntiyLocation from 0 to proper * value except for SAHPI_ENT_ROOT * * Please add items to the array on adding a new resource */ const SaHpiRptEntryT oa_soap_rpt_arr[] = { /* OA_SOAP_ENT_ENC */ { .ResourceInfo = { .ManufacturerId = HP_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, }, }, .ResourceCapabilities = SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR | SAHPI_CAPABILITY_INVENTORY_DATA, .ResourceSeverity = SAHPI_OK, .ResourceFailed = SAHPI_FALSE, .HotSwapCapabilities = 0x0, .ResourceTag.DataType = SAHPI_TL_TYPE_TEXT, .ResourceTag.Language = SAHPI_LANG_ENGLISH, .ResourceTag.DataLength = 9, .ResourceTag.Data = "Enclosure", }, /* OA_SOAP_ENT_SERVER */ { .ResourceInfo = { .ManufacturerId = HP_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_SYSTEM_BLADE, .EntityLocation = 0, }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, }, }, .ResourceCapabilities = SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR | SAHPI_CAPABILITY_RESET | SAHPI_CAPABILITY_POWER | SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_MANAGED_HOTSWAP | SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_INVENTORY_DATA, .ResourceSeverity = SAHPI_OK, .ResourceFailed = SAHPI_FALSE, .HotSwapCapabilities = 0x0, .ResourceTag.DataType = SAHPI_TL_TYPE_TEXT, .ResourceTag.Language = SAHPI_LANG_ENGLISH, .ResourceTag.DataLength = 12, .ResourceTag.Data = "Server Blade", }, /* OA_SOAP_ENT_IO */ { .ResourceInfo = { .ManufacturerId = HP_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_IO_BLADE, .EntityLocation = 0, }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, }, }, .ResourceCapabilities = SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR | SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_INVENTORY_DATA, .ResourceSeverity = SAHPI_OK, .ResourceFailed = SAHPI_FALSE, .HotSwapCapabilities = 0x0, .ResourceTag.DataType = SAHPI_TL_TYPE_TEXT, .ResourceTag.Language = SAHPI_LANG_ENGLISH, .ResourceTag.DataLength = 8, .ResourceTag.Data = "IO Blade", }, /* OA_SOAP_ENT_STORAGE */ { .ResourceInfo = { .ManufacturerId = HP_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_DISK_BLADE, .EntityLocation = 0, }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, }, }, .ResourceCapabilities = SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR | SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_INVENTORY_DATA, .ResourceSeverity = SAHPI_OK, .ResourceFailed = SAHPI_FALSE, .HotSwapCapabilities = 0x0, .ResourceTag.DataType = SAHPI_TL_TYPE_TEXT, .ResourceTag.Language = SAHPI_LANG_ENGLISH, .ResourceTag.DataLength = 13, .ResourceTag.Data = "Storage Blade", }, /* OA_SOAP_ENT_SWITCH */ { .ResourceInfo = { /* Change the manufacture ID, if the switch is belongs * to Cisco Systems */ .ManufacturerId = HP_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_SWITCH_BLADE, .EntityLocation = 0, }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, }, }, .ResourceCapabilities = SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR | SAHPI_CAPABILITY_RESET | SAHPI_CAPABILITY_POWER | SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_MANAGED_HOTSWAP | SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_INVENTORY_DATA, .ResourceSeverity = SAHPI_OK, .ResourceFailed = SAHPI_FALSE, .HotSwapCapabilities = 0x0, .ResourceTag.DataType = SAHPI_TL_TYPE_TEXT, .ResourceTag.Language = SAHPI_LANG_ENGLISH, .ResourceTag.DataLength = 12, .ResourceTag.Data = "Switch Blade", }, /* OA_SOAP_ENT_OA */ { .ResourceInfo = { .ManufacturerId = HP_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_SYS_MGMNT_MODULE, .EntityLocation = 0, }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, }, }, .ResourceCapabilities = SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR | SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_INVENTORY_DATA, .ResourceSeverity = SAHPI_OK, .ResourceFailed = SAHPI_FALSE, .HotSwapCapabilities = 0x0, .ResourceTag.DataType = SAHPI_TL_TYPE_TEXT, .ResourceTag.Language = SAHPI_LANG_ENGLISH, .ResourceTag.DataLength = 21, .ResourceTag.Data = "Onboard Administrator", }, /* OA_SOAP_ENT_PS_SUBSYS */ { .ResourceInfo = { .ManufacturerId = HP_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_POWER_MGMNT, .EntityLocation = 1, }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, }, }, .ResourceCapabilities = SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_OK, .ResourceFailed = SAHPI_FALSE, .HotSwapCapabilities = 0x0, .ResourceTag.DataType = SAHPI_TL_TYPE_TEXT, .ResourceTag.Language = SAHPI_LANG_ENGLISH, .ResourceTag.DataLength = 15, .ResourceTag.Data = "Power subsystem", }, /* OA_SOAP_ENT_PS */ { .ResourceInfo = { .ManufacturerId = HP_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_POWER_SUPPLY, .EntityLocation = 0, }, { .EntityType = SAHPI_ENT_POWER_MGMNT, .EntityLocation = 1, }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, }, }, .ResourceCapabilities = SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR | SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_INVENTORY_DATA, .ResourceSeverity = SAHPI_OK, .ResourceFailed = SAHPI_FALSE, .HotSwapCapabilities = 0x0, .ResourceTag.DataType = SAHPI_TL_TYPE_TEXT, .ResourceTag.Language = SAHPI_LANG_ENGLISH, .ResourceTag.DataLength = 12, .ResourceTag.Data = "Power supply", }, /* OA_SOAP_ENT_THERM_SUBSYS */ { .ResourceInfo = { .ManufacturerId = HP_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_COOLING_UNIT, .EntityLocation = 1, }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, }, }, .ResourceCapabilities = SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_OK, .ResourceFailed = SAHPI_FALSE, .HotSwapCapabilities = 0x0, .ResourceTag.DataType = SAHPI_TL_TYPE_TEXT, .ResourceTag.Language = SAHPI_LANG_ENGLISH, .ResourceTag.DataLength = 17, .ResourceTag.Data = "Thermal Subsystem", }, /* OA_SOAP_ENT_FZ */ { .ResourceInfo = { .ManufacturerId = HP_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_COOLING_DEVICE, .EntityLocation = 0, }, { .EntityType = SAHPI_ENT_COOLING_UNIT, .EntityLocation = 1, }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, }, }, .ResourceCapabilities = SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR | SAHPI_CAPABILITY_INVENTORY_DATA, .ResourceSeverity = SAHPI_OK, .ResourceFailed = SAHPI_FALSE, .HotSwapCapabilities = 0x0, .ResourceTag.DataType = SAHPI_TL_TYPE_TEXT, .ResourceTag.Language = SAHPI_LANG_ENGLISH, .ResourceTag.DataLength = 8, .ResourceTag.Data = "Fan Zone", }, /* OA_SOAP_ENT_FAN */ { .ResourceInfo = { .ManufacturerId = HP_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_FAN, .EntityLocation = 0, }, { .EntityType = SAHPI_ENT_COOLING_DEVICE, .EntityLocation = 0, }, { .EntityType = SAHPI_ENT_COOLING_UNIT, .EntityLocation = 1, }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, }, }, .ResourceCapabilities = SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR | SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_INVENTORY_DATA, .ResourceSeverity = SAHPI_OK, .ResourceFailed = SAHPI_FALSE, .HotSwapCapabilities = 0x0, .ResourceTag.DataType = SAHPI_TL_TYPE_TEXT, .ResourceTag.Language = SAHPI_LANG_ENGLISH, .ResourceTag.DataLength = 3, .ResourceTag.Data = "Fan", }, /* OA_SOAP_ENT_LCD */ { .ResourceInfo = { .ManufacturerId = HP_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_DISPLAY_PANEL, .EntityLocation = 1, }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, }, }, .ResourceCapabilities = SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_OK, .ResourceFailed = SAHPI_FALSE, .HotSwapCapabilities = 0x0, .ResourceTag.DataType = SAHPI_TL_TYPE_TEXT, .ResourceTag.Language = SAHPI_LANG_ENGLISH, .ResourceTag.DataLength = 3, .ResourceTag.Data = "LCD", }, /* OA_SOAP_ENT_FAN_C3000 */ { .ResourceInfo = { .ManufacturerId = HP_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_FAN, .EntityLocation = 0, }, { .EntityType = SAHPI_ENT_COOLING_UNIT, .EntityLocation = 1, }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, }, }, .ResourceCapabilities = SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR | SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_INVENTORY_DATA, .ResourceSeverity = SAHPI_OK, .ResourceFailed = SAHPI_FALSE, .HotSwapCapabilities = 0x0, .ResourceTag.DataType = SAHPI_TL_TYPE_TEXT, .ResourceTag.Language = SAHPI_LANG_ENGLISH, .ResourceTag.DataLength = 3, .ResourceTag.Data = "Fan", }, /* NULL element to end the array */ {} }; /* Array for constructing the inventory RDR. * * Please add items to the array on adding a new resource or on adding area or * field */ const struct oa_soap_inv_rdr oa_soap_inv_arr[] = { /* OA_SOAP_ENT_ENC */ { .rdr = { .RecordId = 0, .RdrType = SAHPI_INVENTORY_RDR, .RdrTypeUnion.InventoryRec.IdrId = SAHPI_DEFAULT_INVENTORY_ID, .IdString.DataType = SAHPI_TL_TYPE_TEXT, .IdString.Language = SAHPI_LANG_ENGLISH, .IdString.DataLength = 9, .IdString.Data = "Enclosure", }, }, /* OA_SOAP_ENT_SERVER */ { .rdr = { .RecordId = 0, .RdrType = SAHPI_INVENTORY_RDR, .RdrTypeUnion.InventoryRec.IdrId = SAHPI_DEFAULT_INVENTORY_ID, .IdString.DataType = SAHPI_TL_TYPE_TEXT, .IdString.Language = SAHPI_LANG_ENGLISH, .IdString.DataLength = 12, .IdString.Data = "Server Blade", }, }, /* OA_SOAP_ENT_IO */ { .rdr = { .RecordId = 0, .RdrType = SAHPI_INVENTORY_RDR, .RdrTypeUnion.InventoryRec.IdrId = SAHPI_DEFAULT_INVENTORY_ID, .IdString.DataType = SAHPI_TL_TYPE_TEXT, .IdString.Language = SAHPI_LANG_ENGLISH, .IdString.DataLength = 8, .IdString.Data = "IO Blade", }, }, /* OA_SOAP_ENT_STORAGE */ { .rdr = { .RecordId = 0, .RdrType = SAHPI_INVENTORY_RDR, .RdrTypeUnion.InventoryRec.IdrId = SAHPI_DEFAULT_INVENTORY_ID, .IdString.DataType = SAHPI_TL_TYPE_TEXT, .IdString.Language = SAHPI_LANG_ENGLISH, .IdString.DataLength = 13, .IdString.Data = "Storage Blade", }, }, /* OA_SOAP_ENT_SWITCH */ { .rdr = { .RecordId = 0, .RdrType = SAHPI_INVENTORY_RDR, .RdrTypeUnion.InventoryRec.IdrId = SAHPI_DEFAULT_INVENTORY_ID, .IdString.DataType = SAHPI_TL_TYPE_TEXT, .IdString.Language = SAHPI_LANG_ENGLISH, .IdString.DataLength = 12, .IdString.Data = "Switch Blade", }, }, /* OA_SOAP_ENT_OA */ { .rdr = { .RecordId = 0, .RdrType = SAHPI_INVENTORY_RDR, .RdrTypeUnion.InventoryRec.IdrId = SAHPI_DEFAULT_INVENTORY_ID, .IdString.DataType = SAHPI_TL_TYPE_TEXT, .IdString.Language = SAHPI_LANG_ENGLISH, .IdString.DataLength = 21, .IdString.Data = "Onboard Administrator", }, }, /* OA_SOAP_ENT_PS_SUBSYS */ { .rdr = { .RecordId = 0, .RdrType = SAHPI_INVENTORY_RDR, .RdrTypeUnion.InventoryRec.IdrId = SAHPI_DEFAULT_INVENTORY_ID, .IdString.DataType = SAHPI_TL_TYPE_TEXT, .IdString.Language = SAHPI_LANG_ENGLISH, .IdString.DataLength = 15, .IdString.Data = "Power Subsystem", }, }, /* OA_SOAP_ENT_PS */ { .rdr = { .RecordId = 0, .RdrType = SAHPI_INVENTORY_RDR, .RdrTypeUnion.InventoryRec.IdrId = SAHPI_DEFAULT_INVENTORY_ID, .IdString.DataType = SAHPI_TL_TYPE_TEXT, .IdString.Language = SAHPI_LANG_ENGLISH, .IdString.DataLength = 12, .IdString.Data = "Power Supply", }, }, /* OA_SOAP_ENT_THERM_SUBSYS */ { .rdr = { .RecordId = 0, .RdrType = SAHPI_INVENTORY_RDR, .RdrTypeUnion.InventoryRec.IdrId = SAHPI_DEFAULT_INVENTORY_ID, .IdString.DataType = SAHPI_TL_TYPE_TEXT, .IdString.Language = SAHPI_LANG_ENGLISH, .IdString.DataLength = 17, .IdString.Data = "Thermal Subsystem", }, }, /* OA_SOAP_ENT_FZ */ { .rdr = { .RecordId = 0, .RdrType = SAHPI_INVENTORY_RDR, .RdrTypeUnion.InventoryRec.IdrId = SAHPI_DEFAULT_INVENTORY_ID, .IdString.DataType = SAHPI_TL_TYPE_TEXT, .IdString.Language = SAHPI_LANG_ENGLISH, .IdString.DataLength = 8, .IdString.Data = "Fan Zone", }, .inventory = { .inv_rec = { .IdrId = SAHPI_DEFAULT_INVENTORY_ID, .Persistent = SAHPI_FALSE, .Oem = 0, }, .info = { .idr_info = { .IdrId = SAHPI_DEFAULT_INVENTORY_ID, .UpdateCount = 1, .ReadOnly = SAHPI_FALSE, .NumAreas = 1, }, .area_list = NULL, }, }, .area_array = { { .area = { .idr_area_head = { .AreaId = 1, .Type = SAHPI_IDR_AREATYPE_OEM, .ReadOnly = SAHPI_FALSE, .NumFields = 2, }, .next_area = NULL, }, .field_array = { { /* Field for storing the device * bays for this Fan Zone */ .field = { .AreaId = 1, .FieldId = 1, .Type = OA_SOAP_INV_FZ_DEV_BAY, .ReadOnly = SAHPI_FALSE, .Field.DataType = SAHPI_TL_TYPE_TEXT, .Field.Language = SAHPI_LANG_ENGLISH, }, .next_field = NULL, }, { /* Field for storing the fan * bays for this Fan Zone */ .field = { .AreaId = 1, .FieldId = 2, .Type = OA_SOAP_INV_FZ_FAN_BAY, .ReadOnly = SAHPI_FALSE, .Field.DataType = SAHPI_TL_TYPE_TEXT, .Field.Language = SAHPI_LANG_ENGLISH, }, .next_field = NULL, }, }, }, }, }, /* OA_SOAP_ENT_FAN */ { .rdr = { .RecordId = 0, .RdrType = SAHPI_INVENTORY_RDR, .RdrTypeUnion.InventoryRec.IdrId = SAHPI_DEFAULT_INVENTORY_ID, .IdString.DataType = SAHPI_TL_TYPE_TEXT, .IdString.Language = SAHPI_LANG_ENGLISH, .IdString.DataLength = 3, .IdString.Data = "Fan", }, .inventory = { .inv_rec = { .IdrId = SAHPI_DEFAULT_INVENTORY_ID, .Persistent = SAHPI_FALSE, .Oem = 0, }, .info = { .idr_info = { .IdrId = SAHPI_DEFAULT_INVENTORY_ID, .UpdateCount = 1, .ReadOnly = SAHPI_FALSE, .NumAreas = 3, }, .area_list = NULL, }, }, .area_array = { { .area = { .idr_area_head = { .AreaId = 1, .Type = SAHPI_IDR_AREATYPE_PRODUCT_INFO, .ReadOnly = SAHPI_FALSE, .NumFields = 1, }, .next_area = NULL, }, .field_array = { { .field = { .AreaId = 1, .FieldId = 1, .Type = SAHPI_IDR_FIELDTYPE_PRODUCT_NAME, .ReadOnly = SAHPI_FALSE, .Field.DataType = SAHPI_TL_TYPE_TEXT, .Field.Language = SAHPI_LANG_ENGLISH, }, .next_field = NULL, }, }, }, { .area = { .idr_area_head = { .AreaId = 2, .Type = SAHPI_IDR_AREATYPE_BOARD_INFO, .ReadOnly = SAHPI_FALSE, .NumFields = 2, }, .next_area = NULL, }, .field_array = { { .field = { .AreaId = 2, .FieldId = 1, .Type = SAHPI_IDR_FIELDTYPE_PART_NUMBER, .ReadOnly = SAHPI_FALSE, .Field.DataType = SAHPI_TL_TYPE_TEXT, .Field.Language = SAHPI_LANG_ENGLISH, }, .next_field = NULL, }, { .field = { .AreaId = 2, .FieldId = 2, .Type = SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER, .ReadOnly = SAHPI_FALSE, .Field.DataType = SAHPI_TL_TYPE_TEXT, .Field.Language = SAHPI_LANG_ENGLISH, }, .next_field = NULL, }, }, }, { .area = { .idr_area_head = { .AreaId = 3, .Type = SAHPI_IDR_AREATYPE_OEM, .ReadOnly = SAHPI_FALSE, .NumFields = 2, }, .next_area = NULL, }, .field_array = { { /* This field indicates whether * this fan is shared or not */ .field = { .AreaId = 3, .FieldId = 1, .Type = OA_SOAP_INV_FAN_SHARED, .ReadOnly = SAHPI_FALSE, .Field.DataType = SAHPI_TL_TYPE_TEXT, .Field.Language = SAHPI_LANG_ENGLISH, }, .next_field = NULL, }, { /* Field for storing the fan * Fan Zone(s) to which this fan * belongs */ .field = { .AreaId = 3, .FieldId = 2, .Type = OA_SOAP_INV_FZ_NUM, .ReadOnly = SAHPI_FALSE, .Field.DataType = SAHPI_TL_TYPE_TEXT, .Field.Language = SAHPI_LANG_ENGLISH, }, .next_field = NULL, }, }, }, }, }, /* OA_SOAP_ENT_LCD */ { .rdr = { .RecordId = 0, .RdrType = SAHPI_INVENTORY_RDR, .RdrTypeUnion.InventoryRec.IdrId = SAHPI_DEFAULT_INVENTORY_ID, .IdString.DataType = SAHPI_TL_TYPE_TEXT, .IdString.Language = SAHPI_LANG_ENGLISH, .IdString.DataLength = 3, .IdString.Data = "LCD", }, .inventory = { .inv_rec = { .IdrId = SAHPI_DEFAULT_INVENTORY_ID, .Persistent = SAHPI_FALSE, .Oem = 0, }, .info = { .idr_info = { .IdrId = SAHPI_DEFAULT_INVENTORY_ID, .UpdateCount = 1, .ReadOnly = SAHPI_FALSE, .NumAreas = 2, }, .area_list = NULL, }, }, .area_array = { { .area = { .idr_area_head = { .AreaId = 1, .Type = SAHPI_IDR_AREATYPE_PRODUCT_INFO, .ReadOnly = SAHPI_FALSE, .NumFields = 3, }, .next_area = NULL, }, .field_array = { { .field = { .AreaId = 1, .FieldId = 1, .Type = SAHPI_IDR_FIELDTYPE_PRODUCT_NAME, .ReadOnly = SAHPI_FALSE, .Field.DataType = SAHPI_TL_TYPE_TEXT, .Field.Language = SAHPI_LANG_ENGLISH, }, .next_field = NULL, }, { .field = { .AreaId = 1, .FieldId = 2, .Type = SAHPI_IDR_FIELDTYPE_MANUFACTURER, .ReadOnly = SAHPI_FALSE, .Field.DataType = SAHPI_TL_TYPE_TEXT, .Field.Language = SAHPI_LANG_ENGLISH, }, .next_field = NULL, }, { .field = { .AreaId = 1, .FieldId = 3, .Type = SAHPI_IDR_FIELDTYPE_PRODUCT_VERSION, .ReadOnly = SAHPI_FALSE, .Field.DataType = SAHPI_TL_TYPE_TEXT, .Field.Language = SAHPI_LANG_ENGLISH, }, .next_field = NULL, }, }, }, { .area = { .idr_area_head = { .AreaId = 2, .Type = SAHPI_IDR_AREATYPE_BOARD_INFO, .ReadOnly = SAHPI_FALSE, .NumFields = 1, }, .next_area = NULL, }, .field_array = { { .field = { .AreaId = 2, .FieldId = 1, .Type = SAHPI_IDR_FIELDTYPE_PART_NUMBER, .ReadOnly = SAHPI_FALSE, .Field.DataType = SAHPI_TL_TYPE_TEXT, .Field.Language = SAHPI_LANG_ENGLISH, }, .next_field = NULL, }, }, }, }, }, /* OA_SOAP_ENT_FAN_C3000 */ { .rdr = { .RecordId = 0, .RdrType = SAHPI_INVENTORY_RDR, .RdrTypeUnion.InventoryRec.IdrId = SAHPI_DEFAULT_INVENTORY_ID, .IdString.DataType = SAHPI_TL_TYPE_TEXT, .IdString.Language = SAHPI_LANG_ENGLISH, .IdString.DataLength = 3, .IdString.Data = "Fan", }, .inventory = { .inv_rec = { .IdrId = SAHPI_DEFAULT_INVENTORY_ID, .Persistent = SAHPI_FALSE, .Oem = 0, }, .info = { .idr_info = { .IdrId = SAHPI_DEFAULT_INVENTORY_ID, .UpdateCount = 1, .ReadOnly = SAHPI_FALSE, .NumAreas = 2, }, .area_list = NULL, }, }, .area_array = { { .area = { .idr_area_head = { .AreaId = 1, .Type = SAHPI_IDR_AREATYPE_PRODUCT_INFO, .ReadOnly = SAHPI_FALSE, .NumFields = 1, }, .next_area = NULL, }, .field_array = { { .field = { .AreaId = 1, .FieldId = 1, .Type = SAHPI_IDR_FIELDTYPE_PRODUCT_NAME, .ReadOnly = SAHPI_FALSE, .Field.DataType = SAHPI_TL_TYPE_TEXT, .Field.Language = SAHPI_LANG_ENGLISH, }, .next_field = NULL, }, }, }, { .area = { .idr_area_head = { .AreaId = 2, .Type = SAHPI_IDR_AREATYPE_BOARD_INFO, .ReadOnly = SAHPI_FALSE, .NumFields = 2, }, .next_area = NULL, }, .field_array = { { .field = { .AreaId = 2, .FieldId = 1, .Type = SAHPI_IDR_FIELDTYPE_PART_NUMBER, .ReadOnly = SAHPI_FALSE, .Field.DataType = SAHPI_TL_TYPE_TEXT, .Field.Language = SAHPI_LANG_ENGLISH, }, .next_field = NULL, }, { .field = { .AreaId = 2, .FieldId = 2, .Type = SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER, .ReadOnly = SAHPI_FALSE, .Field.DataType = SAHPI_TL_TYPE_TEXT, .Field.Language = SAHPI_LANG_ENGLISH, }, .next_field = NULL, }, }, }, }, }, /* NULL element to end the array */ {} }; /* Array for mapping the fans to fan zones * * Please add entries to the array on supporting new enclosure type or on change * in the max fans number defined in oa_soap_inventory.h */ const struct oa_soap_fz_map oa_soap_fz_map_arr[][OA_SOAP_MAX_FAN] = { /* OA_SOAP_ENC_C7000 */ { /* Fan slot 1 */ { .zone = 2, .secondary_zone = 0, .shared = SAHPI_FALSE, }, /* Fan slot 2 */ { .zone = 2, .secondary_zone = 0, .shared = SAHPI_FALSE, }, /* Fan slot 3 */ { .zone = 1, .secondary_zone = 2, .shared = SAHPI_TRUE, }, /* Fan slot 4 */ { .zone = 1, .secondary_zone = 0, .shared = SAHPI_FALSE, }, /* Fan slot 5 */ { .zone = 1, .secondary_zone = 0, .shared = SAHPI_FALSE, }, /* Fan slot 6 */ { .zone = 4, .secondary_zone = 0, .shared = SAHPI_FALSE, }, /* Fan slot 7 */ { .zone = 4, .secondary_zone = 0, .shared = SAHPI_FALSE, }, /* Fan slot 8 */ { .zone = 3, .secondary_zone = 4, .shared = SAHPI_TRUE, }, /* Fan slot 9 */ { .zone = 3, .secondary_zone = 0, .shared = SAHPI_FALSE, }, /* Fan slot 10 */ { .zone = 3, .secondary_zone = 0, .shared = SAHPI_FALSE, }, }, /* OA_SOAP_ENC_C3000 */ { /* Fan slot 1 */ { .zone = 1, .secondary_zone = 0, .shared = SAHPI_FALSE, }, /* Fan slot 2 */ { .zone = 1, .secondary_zone = 0, .shared = SAHPI_FALSE, }, /* Fan slot 3 */ { .zone = 1, .secondary_zone = 0, .shared = SAHPI_FALSE, }, /* Fan slot 4 */ { .zone = 1, .secondary_zone = 0, .shared = SAHPI_FALSE, }, /* Fan slot 5 */ { .zone = 1, .secondary_zone = 0, .shared = SAHPI_FALSE, }, /* Fan slot 6 */ { .zone = 1, .secondary_zone = 0, .shared = SAHPI_FALSE, }, /* Fan slot 7 */ { .zone = -1, .secondary_zone = 0, .shared = SAHPI_FALSE, }, /* Fan slot 8 */ { .zone = -1, .secondary_zone = 0, .shared = SAHPI_FALSE, }, /* Fan slot 9 */ { .zone = -1, .secondary_zone = 0, .shared = SAHPI_FALSE, }, /* Fan slot 10 */ { .zone = -1, .secondary_zone = 0, .shared = SAHPI_FALSE, }, }, /* NULL element to end the array */ {} }; /* Array to hold the values of healthStatus field in extraData structure. * This array is indexed on enum oa_soap_extra_data_health */ const char *oa_soap_health_arr[] = { "UNKNOWN", "OTHER", "OK", "DEGRADED", "STRESSED", "PREDICTIVE_FAILURE", "ERROR", "NONRECOVERABLE_ERROR" }; /* Array to hold the supported fields of diagnosticChecksEx structure. This * array is indexed on enum oa_soap_diag_ex * * When a new field is added to diagnosticChecksEx structure, please update the * enum oa_soap_diag_ex and OA_SOAP_MAX_DIAG_EX in oa_soap_sensor.h */ const char *oa_soap_diag_ex_arr[] = { /* Missing Hardware (such as partner device) */ "deviceMissing", /* Sequencing Error (some hardware was introduced in the wrong order) */ "devicePowerSequence", /* Bonding Error (some hardware was bonded that should not) */ "deviceBonding", /* VCM personality issue */ "profileUnassignedError", /* A device failed lagacy list match and FRU "Manufactured For" * check */ "deviceNotSupported", /* Network Configuration issue. It is likely that iLO is unable to ARP * it's default gateway. */ "networkConfiguration", /* server requested too little power - hardware issue */ "tooLowPowerRequest", /* some hardware warrants a HP call by the customer */ "callHP", /* Generic informational message in syslog */ "deviceInformational", /* IOM storage is missing */ "storageDeviceMissing", /* OA Firmware out of sync */ "firmwareMismatch", /* Enclosure ID mismatch */ "enclosureIdMismatch", /* PowerDelay is in use. 'Power delay in use' is not used as sensor. * 'Power delay in use' does not indicates any failure */ "powerdelayInUse", /* Device mix-and-match alert */ "deviceMixMatch", /* Power capping alert */ "grpcapError", /* IML recorded errors */ "imlRecordedErrors", /* Duplicate Management IP address */ "duplicateMgmtIpAddress" }; /* Array containing the possible sensor description string provided by * getBladeThermalInfoArray soap call */ const char *oa_soap_thermal_sensor_string[] = { "System", "CPU Zone", "CPU 1", "CPU 2", "CPU 3", "CPU 4", "Disk", "Memory", "Ambient", "Storage", "I/O Board", "Power Supply", "Chassis" }; /* Array containing the name strings of the possible blade types * which can be accomodated in HP cClass BladeSystem chassis */ const char *oa_soap_bld_type_str[] = { "BL260C", "BL2x220C", "BL460C GEN8", "BL460C GEN9", "BL460C G8", "BL460C G7", "BL460C", "BL465C G7", "BL465C", "BL480C G1", "BL480C", "BL495C", "BL680C", "BL685C G6", "BL685C", "BL860C", "BL870C", "NB50000C", "AMC", "STORAGE", "TAPE", "SAN" }; /* Array containing static thermal sensor configuration for different type of * blade resources in the hardware portfolio supported by HP cClass BladeSystem * This static configuration for each blade type is based on the generalized * information available from BladeThermalInfo response from the blades. * TODO: If a particular version of a blade supports more sensors than the * statically modeled sensors when powered on, then those sensors cannot be * monitored. When the plug-in migrates to HPI-B.03.01 specification, then * condition can be overcome. * * Please modify the array on adding new blade type in oa_soap_resources.h */ const struct oa_soap_static_thermal_sensor_info oa_soap_static_thrm_sen_config[OA_SOAP_MAX_BLD_TYPE] [OA_SOAP_MAX_THRM_SEN] = { /* BL260c blade type */ { {OA_SOAP_SEN_BLADE_SYSTEM_ZONE1, SYSTEM_ZONE, 1}, {OA_SOAP_SEN_BLADE_CPU_ZONE1, CPU_ZONE, 1}, {OA_SOAP_SEN_BLADE_CPU1_1, CPU_1, 1}, {OA_SOAP_SEN_BLADE_CPU2_1, CPU_2, 1}, {OA_SOAP_SEN_BLADE_CPU3_1, CPU_3, 0}, {OA_SOAP_SEN_BLADE_CPU4_1, CPU_4, 0}, {OA_SOAP_SEN_BLADE_DISK_ZONE1, DISK_ZONE, 0}, {OA_SOAP_SEN_BLADE_MEM_ZONE1, MEMORY_ZONE, 1}, {OA_SOAP_SEN_TEMP_STATUS, AMBIENT_ZONE, 1} }, /* BL2x220c blade type */ { {OA_SOAP_SEN_BLADE_SYSTEM_ZONE1, SYSTEM_ZONE, 1}, {OA_SOAP_SEN_BLADE_CPU_ZONE1, CPU_ZONE, 1}, {OA_SOAP_SEN_BLADE_CPU1_1, CPU_1, 1}, {OA_SOAP_SEN_BLADE_CPU2_1, CPU_2, 1}, {OA_SOAP_SEN_BLADE_CPU3_1, CPU_3, 0}, {OA_SOAP_SEN_BLADE_CPU4_1, CPU_4, 0}, {OA_SOAP_SEN_BLADE_DISK_ZONE1, DISK_ZONE, 0}, {OA_SOAP_SEN_BLADE_MEM_ZONE1, MEMORY_ZONE, 1}, {OA_SOAP_SEN_TEMP_STATUS, AMBIENT_ZONE, 1} }, /* BL460c GEN8 blade type */ { {OA_SOAP_SEN_BLADE_SYSTEM_ZONE1, SYSTEM_ZONE, 7}, {OA_SOAP_SEN_BLADE_CPU_ZONE1, CPU_ZONE, 2}, {OA_SOAP_SEN_BLADE_CPU1_1, CPU_1, 0}, {OA_SOAP_SEN_BLADE_CPU2_1, CPU_2, 0}, {OA_SOAP_SEN_BLADE_CPU3_1, CPU_3, 0}, {OA_SOAP_SEN_BLADE_CPU4_1, CPU_4, 0}, {OA_SOAP_SEN_BLADE_DISK_ZONE1, DISK_ZONE, 1}, {OA_SOAP_SEN_BLADE_MEM_ZONE1, MEMORY_ZONE, 8}, {OA_SOAP_SEN_TEMP_STATUS, AMBIENT_ZONE, 1}, {OA_SOAP_SEN_BLADE_POWER_SUPPLY_ZONE1, POWER_SUPPLY_ZONE, 6}, {OA_SOAP_SEN_BLADE_IO_BOARD_ZONE1, IO_BOARD_ZONE, 8} }, /* BL460c Gen9 blade type */ { {OA_SOAP_SEN_BLADE_SYSTEM_ZONE1, SYSTEM_ZONE, 5}, {OA_SOAP_SEN_BLADE_CPU_ZONE1, CPU_ZONE, 2}, {OA_SOAP_SEN_BLADE_CPU1_1, CPU_1, 0}, {OA_SOAP_SEN_BLADE_CPU2_1, CPU_2, 0}, {OA_SOAP_SEN_BLADE_CPU3_1, CPU_3, 0}, {OA_SOAP_SEN_BLADE_CPU4_1, CPU_4, 0}, {OA_SOAP_SEN_BLADE_DISK_ZONE1, DISK_ZONE, 2}, {OA_SOAP_SEN_BLADE_MEM_ZONE1, MEMORY_ZONE, 6}, {OA_SOAP_SEN_TEMP_STATUS, AMBIENT_ZONE, 1}, {OA_SOAP_SEN_BLADE_IO_BOARD_ZONE1, IO_BOARD_ZONE, 8}, {OA_SOAP_SEN_BLADE_CHASSIS_ZONE1, CHASSIS_ZONE, 2} }, /* BL460c G8 blade type */ { {OA_SOAP_SEN_BLADE_SYSTEM_ZONE1, SYSTEM_ZONE, 7}, {OA_SOAP_SEN_BLADE_CPU_ZONE1, CPU_ZONE, 2}, {OA_SOAP_SEN_BLADE_CPU1_1, CPU_1, 0}, {OA_SOAP_SEN_BLADE_CPU2_1, CPU_2, 0}, {OA_SOAP_SEN_BLADE_CPU3_1, CPU_3, 0}, {OA_SOAP_SEN_BLADE_CPU4_1, CPU_4, 0}, {OA_SOAP_SEN_BLADE_DISK_ZONE1, DISK_ZONE, 1}, {OA_SOAP_SEN_BLADE_MEM_ZONE1, MEMORY_ZONE, 8}, {OA_SOAP_SEN_TEMP_STATUS, AMBIENT_ZONE, 1}, {OA_SOAP_SEN_BLADE_POWER_SUPPLY_ZONE1, POWER_SUPPLY_ZONE, 6}, {OA_SOAP_SEN_BLADE_IO_BOARD_ZONE1, IO_BOARD_ZONE, 8} }, /* BL460c G7 blade type */ { {OA_SOAP_SEN_BLADE_SYSTEM_ZONE1, SYSTEM_ZONE, 2}, {OA_SOAP_SEN_BLADE_CPU_ZONE1, CPU_ZONE, 2}, {OA_SOAP_SEN_BLADE_CPU1_1, CPU_1, 0}, {OA_SOAP_SEN_BLADE_CPU2_1, CPU_2, 0}, {OA_SOAP_SEN_BLADE_CPU3_1, CPU_3, 0}, {OA_SOAP_SEN_BLADE_CPU4_1, CPU_4, 0}, {OA_SOAP_SEN_BLADE_DISK_ZONE1, DISK_ZONE, 0}, {OA_SOAP_SEN_BLADE_MEM_ZONE1, MEMORY_ZONE, 4}, {OA_SOAP_SEN_TEMP_STATUS, AMBIENT_ZONE, 1}, {OA_SOAP_SEN_BLADE_STORAGE_ZONE1, STORAGE_ZONE, 1}, {OA_SOAP_SEN_BLADE_IO_BOARD_ZONE1, IO_BOARD_ZONE, 3} }, /* BL460c blade type */ { {OA_SOAP_SEN_BLADE_SYSTEM_ZONE1, SYSTEM_ZONE, 1}, {OA_SOAP_SEN_BLADE_CPU_ZONE1, CPU_ZONE, 2}, {OA_SOAP_SEN_BLADE_CPU1_1, CPU_1, 2}, {OA_SOAP_SEN_BLADE_CPU2_1, CPU_2, 2}, {OA_SOAP_SEN_BLADE_CPU3_1, CPU_3, 0}, {OA_SOAP_SEN_BLADE_CPU4_1, CPU_4, 0}, {OA_SOAP_SEN_BLADE_DISK_ZONE1, DISK_ZONE, 0}, {OA_SOAP_SEN_BLADE_MEM_ZONE1, MEMORY_ZONE, 1}, {OA_SOAP_SEN_TEMP_STATUS, AMBIENT_ZONE, 1} }, /* BL465c G7 blade type */ { {OA_SOAP_SEN_BLADE_SYSTEM_ZONE1, SYSTEM_ZONE, 0}, {OA_SOAP_SEN_BLADE_CPU_ZONE1, CPU_ZONE, 1}, {OA_SOAP_SEN_BLADE_CPU1_1, CPU_1, 1}, {OA_SOAP_SEN_BLADE_CPU2_1, CPU_2, 1}, {OA_SOAP_SEN_BLADE_CPU3_1, CPU_3, 0}, {OA_SOAP_SEN_BLADE_CPU4_1, CPU_4, 0}, {OA_SOAP_SEN_BLADE_DISK_ZONE1, DISK_ZONE, 0}, {OA_SOAP_SEN_BLADE_MEM_ZONE1, MEMORY_ZONE, 2}, {OA_SOAP_SEN_TEMP_STATUS, AMBIENT_ZONE, 1} }, /* BL465c blade type */ { {OA_SOAP_SEN_BLADE_SYSTEM_ZONE1, SYSTEM_ZONE, 1}, {OA_SOAP_SEN_BLADE_CPU_ZONE1, CPU_ZONE, 1}, {OA_SOAP_SEN_BLADE_CPU1_1, CPU_1, 1}, {OA_SOAP_SEN_BLADE_CPU2_1, CPU_2, 1}, {OA_SOAP_SEN_BLADE_CPU3_1, CPU_3, 0}, {OA_SOAP_SEN_BLADE_CPU4_1, CPU_4, 0}, {OA_SOAP_SEN_BLADE_DISK_ZONE1, DISK_ZONE, 0}, {OA_SOAP_SEN_BLADE_MEM_ZONE1, MEMORY_ZONE, 2}, {OA_SOAP_SEN_TEMP_STATUS, AMBIENT_ZONE, 1} }, /* BL480c G1 blade type */ { {OA_SOAP_SEN_BLADE_SYSTEM_ZONE1, SYSTEM_ZONE, 0}, {OA_SOAP_SEN_BLADE_CPU_ZONE1, CPU_ZONE, 1}, {OA_SOAP_SEN_BLADE_CPU1_1, CPU_1, 2}, {OA_SOAP_SEN_BLADE_CPU2_1, CPU_2, 2}, {OA_SOAP_SEN_BLADE_CPU3_1, CPU_3, 0}, {OA_SOAP_SEN_BLADE_CPU4_1, CPU_4, 0}, {OA_SOAP_SEN_BLADE_DISK_ZONE1, DISK_ZONE, 0}, {OA_SOAP_SEN_BLADE_MEM_ZONE1, MEMORY_ZONE, 1}, {OA_SOAP_SEN_TEMP_STATUS, AMBIENT_ZONE, 1} }, /* BL480c blade type */ { {OA_SOAP_SEN_BLADE_SYSTEM_ZONE1, SYSTEM_ZONE, 4}, {OA_SOAP_SEN_BLADE_CPU_ZONE1, CPU_ZONE, 1}, {OA_SOAP_SEN_BLADE_CPU1_1, CPU_1, 1}, {OA_SOAP_SEN_BLADE_CPU2_1, CPU_2, 1}, {OA_SOAP_SEN_BLADE_CPU3_1, CPU_3, 0}, {OA_SOAP_SEN_BLADE_CPU4_1, CPU_4, 0}, {OA_SOAP_SEN_BLADE_DISK_ZONE1, DISK_ZONE, 0}, {OA_SOAP_SEN_BLADE_MEM_ZONE1, MEMORY_ZONE, 1}, {OA_SOAP_SEN_TEMP_STATUS, AMBIENT_ZONE, 1} }, /* BL495c blade type */ { {OA_SOAP_SEN_BLADE_SYSTEM_ZONE1, SYSTEM_ZONE, 0}, {OA_SOAP_SEN_BLADE_CPU_ZONE1, CPU_ZONE, 1}, {OA_SOAP_SEN_BLADE_CPU1_1, CPU_1, 2}, {OA_SOAP_SEN_BLADE_CPU2_1, CPU_2, 2}, {OA_SOAP_SEN_BLADE_CPU3_1, CPU_3, 0}, {OA_SOAP_SEN_BLADE_CPU4_1, CPU_4, 0}, {OA_SOAP_SEN_BLADE_DISK_ZONE1, DISK_ZONE, 0}, {OA_SOAP_SEN_BLADE_MEM_ZONE1, MEMORY_ZONE, 1}, {OA_SOAP_SEN_TEMP_STATUS, AMBIENT_ZONE, 1} }, /* BL680 blade type */ { {OA_SOAP_SEN_BLADE_SYSTEM_ZONE1, SYSTEM_ZONE, 0}, {OA_SOAP_SEN_BLADE_CPU_ZONE1, CPU_ZONE, 1}, {OA_SOAP_SEN_BLADE_CPU1_1, CPU_1, 2}, {OA_SOAP_SEN_BLADE_CPU2_1, CPU_2, 2}, {OA_SOAP_SEN_BLADE_CPU3_1, CPU_3, 0}, {OA_SOAP_SEN_BLADE_CPU4_1, CPU_4, 0}, {OA_SOAP_SEN_BLADE_DISK_ZONE1, DISK_ZONE, 0}, {OA_SOAP_SEN_BLADE_MEM_ZONE1, MEMORY_ZONE, 1}, {OA_SOAP_SEN_TEMP_STATUS, AMBIENT_ZONE, 1} }, /* BL685 G6 blade type */ { {OA_SOAP_SEN_BLADE_SYSTEM_ZONE1, SYSTEM_ZONE, 3}, {OA_SOAP_SEN_BLADE_CPU_ZONE1, CPU_ZONE, 0}, {OA_SOAP_SEN_BLADE_CPU1_1, CPU_1, 1}, {OA_SOAP_SEN_BLADE_CPU2_1, CPU_2, 1}, {OA_SOAP_SEN_BLADE_CPU3_1, CPU_3, 1}, {OA_SOAP_SEN_BLADE_CPU4_1, CPU_4, 1}, {OA_SOAP_SEN_BLADE_DISK_ZONE1, DISK_ZONE, 0}, {OA_SOAP_SEN_BLADE_MEM_ZONE1, MEMORY_ZONE, 1}, {OA_SOAP_SEN_TEMP_STATUS, AMBIENT_ZONE, 1} }, /* BL685 blade type */ { {OA_SOAP_SEN_BLADE_SYSTEM_ZONE1, SYSTEM_ZONE, 2}, {OA_SOAP_SEN_BLADE_CPU_ZONE1, CPU_ZONE, 2}, {OA_SOAP_SEN_BLADE_CPU1_1, CPU_1, 1}, {OA_SOAP_SEN_BLADE_CPU2_1, CPU_2, 1}, {OA_SOAP_SEN_BLADE_CPU3_1, CPU_3, 1}, {OA_SOAP_SEN_BLADE_CPU4_1, CPU_4, 1}, {OA_SOAP_SEN_BLADE_DISK_ZONE1, DISK_ZONE, 0}, {OA_SOAP_SEN_BLADE_MEM_ZONE1, MEMORY_ZONE, 0}, {OA_SOAP_SEN_TEMP_STATUS, AMBIENT_ZONE, 1} }, /* BL860c blade type */ { {OA_SOAP_SEN_BLADE_SYSTEM_ZONE1, SYSTEM_ZONE, 4}, {OA_SOAP_SEN_BLADE_CPU_ZONE1, CPU_ZONE, 0}, {OA_SOAP_SEN_BLADE_CPU1_1, CPU_1, 1}, {OA_SOAP_SEN_BLADE_CPU2_1, CPU_2, 1}, {OA_SOAP_SEN_BLADE_CPU3_1, CPU_3, 0}, {OA_SOAP_SEN_BLADE_CPU4_1, CPU_4, 0}, {OA_SOAP_SEN_BLADE_DISK_ZONE1, DISK_ZONE, 0}, {OA_SOAP_SEN_BLADE_MEM_ZONE1, MEMORY_ZONE, 0}, {OA_SOAP_SEN_TEMP_STATUS, AMBIENT_ZONE, 1} }, /* BL870c blade type */ { {OA_SOAP_SEN_BLADE_SYSTEM_ZONE1, SYSTEM_ZONE, 4}, {OA_SOAP_SEN_BLADE_CPU_ZONE1, CPU_ZONE, 0}, {OA_SOAP_SEN_BLADE_CPU1_1, CPU_1, 1}, {OA_SOAP_SEN_BLADE_CPU2_1, CPU_2, 1}, {OA_SOAP_SEN_BLADE_CPU3_1, CPU_3, 1}, {OA_SOAP_SEN_BLADE_CPU4_1, CPU_4, 1}, {OA_SOAP_SEN_BLADE_DISK_ZONE1, DISK_ZONE, 0}, {OA_SOAP_SEN_BLADE_MEM_ZONE1, MEMORY_ZONE, 0}, {OA_SOAP_SEN_TEMP_STATUS, AMBIENT_ZONE, 1} }, /* NB50000c blade type */ { {OA_SOAP_SEN_BLADE_SYSTEM_ZONE1, SYSTEM_ZONE, 4}, {OA_SOAP_SEN_BLADE_CPU_ZONE1, CPU_ZONE, 0}, {OA_SOAP_SEN_BLADE_CPU1_1, CPU_1, 4}, {OA_SOAP_SEN_BLADE_CPU2_1, CPU_2, 4}, {OA_SOAP_SEN_BLADE_CPU3_1, CPU_3, 4}, {OA_SOAP_SEN_BLADE_CPU4_1, CPU_4, 4}, {OA_SOAP_SEN_BLADE_DISK_ZONE1, DISK_ZONE, 0}, {OA_SOAP_SEN_BLADE_MEM_ZONE1, MEMORY_ZONE, 0}, {OA_SOAP_SEN_TEMP_STATUS, AMBIENT_ZONE, 1} }, /* AMC Expansion IO blade type */ { {OA_SOAP_SEN_BLADE_SYSTEM_ZONE1, SYSTEM_ZONE, 1}, {OA_SOAP_SEN_BLADE_CPU_ZONE1, CPU_ZONE, 0}, {OA_SOAP_SEN_BLADE_CPU1_1, CPU_1, 0}, {OA_SOAP_SEN_BLADE_CPU2_1, CPU_2, 0}, {OA_SOAP_SEN_BLADE_CPU3_1, CPU_3, 0}, {OA_SOAP_SEN_BLADE_CPU4_1, CPU_4, 0}, {OA_SOAP_SEN_BLADE_DISK_ZONE1, DISK_ZONE, 0}, {OA_SOAP_SEN_BLADE_MEM_ZONE1, MEMORY_ZONE, 0}, {OA_SOAP_SEN_TEMP_STATUS, AMBIENT_ZONE, 1} }, /* Storage blade type */ { {OA_SOAP_SEN_BLADE_SYSTEM_ZONE1, SYSTEM_ZONE, 0}, {OA_SOAP_SEN_BLADE_CPU_ZONE1, CPU_ZONE, 0}, {OA_SOAP_SEN_BLADE_CPU1_1, CPU_1, 0}, {OA_SOAP_SEN_BLADE_CPU2_1, CPU_2, 0}, {OA_SOAP_SEN_BLADE_CPU3_1, CPU_3, 0}, {OA_SOAP_SEN_BLADE_CPU4_1, CPU_4, 0}, {OA_SOAP_SEN_BLADE_DISK_ZONE1, DISK_ZONE, 1}, {OA_SOAP_SEN_BLADE_MEM_ZONE1, MEMORY_ZONE, 0}, {OA_SOAP_SEN_TEMP_STATUS, AMBIENT_ZONE, 1} }, /* Tape blade type */ { {OA_SOAP_SEN_BLADE_SYSTEM_ZONE1, SYSTEM_ZONE, 0}, {OA_SOAP_SEN_BLADE_CPU_ZONE1, CPU_ZONE, 0}, {OA_SOAP_SEN_BLADE_CPU1_1, CPU_1, 0}, {OA_SOAP_SEN_BLADE_CPU2_1, CPU_2, 0}, {OA_SOAP_SEN_BLADE_CPU3_1, CPU_3, 0}, {OA_SOAP_SEN_BLADE_CPU4_1, CPU_4, 0}, {OA_SOAP_SEN_BLADE_DISK_ZONE1, DISK_ZONE, 1}, {OA_SOAP_SEN_BLADE_MEM_ZONE1, MEMORY_ZONE, 0}, {OA_SOAP_SEN_TEMP_STATUS, AMBIENT_ZONE, 1} }, /* SAN blade type */ { {OA_SOAP_SEN_BLADE_SYSTEM_ZONE1, SYSTEM_ZONE, 0}, {OA_SOAP_SEN_BLADE_CPU_ZONE1, CPU_ZONE, 0}, {OA_SOAP_SEN_BLADE_CPU1_1, CPU_1, 0}, {OA_SOAP_SEN_BLADE_CPU2_1, CPU_2, 0}, {OA_SOAP_SEN_BLADE_CPU3_1, CPU_3, 0}, {OA_SOAP_SEN_BLADE_CPU4_1, CPU_4, 0}, {OA_SOAP_SEN_BLADE_DISK_ZONE1, DISK_ZONE, 1}, {OA_SOAP_SEN_BLADE_MEM_ZONE1, MEMORY_ZONE, 0}, {OA_SOAP_SEN_TEMP_STATUS, AMBIENT_ZONE, 1} }, /* OTHER blade type */ { {OA_SOAP_SEN_BLADE_SYSTEM_ZONE1, SYSTEM_ZONE, 2}, {OA_SOAP_SEN_BLADE_CPU_ZONE1, CPU_ZONE, 2}, {OA_SOAP_SEN_BLADE_CPU1_1, CPU_1, 1}, {OA_SOAP_SEN_BLADE_CPU2_1, CPU_2, 1}, {OA_SOAP_SEN_BLADE_CPU3_1, CPU_3, 1}, {OA_SOAP_SEN_BLADE_CPU4_1, CPU_4, 1}, {OA_SOAP_SEN_BLADE_DISK_ZONE1, DISK_ZONE, 0}, {OA_SOAP_SEN_BLADE_MEM_ZONE1, MEMORY_ZONE, 1}, {OA_SOAP_SEN_TEMP_STATUS, AMBIENT_ZONE, 1} } }; /* Array containing the sensor base number of the thermal sensor types. * These base number for sensor are required during sensor read operation */ const SaHpiInt32T oa_soap_bld_thrm_sen_base_arr[] = { OA_SOAP_SEN_BLADE_SYSTEM_ZONE1, OA_SOAP_SEN_BLADE_SYSTEM_ZONE1, OA_SOAP_SEN_BLADE_SYSTEM_ZONE1, OA_SOAP_SEN_BLADE_SYSTEM_ZONE1, OA_SOAP_SEN_BLADE_SYSTEM_ZONE1, OA_SOAP_SEN_BLADE_SYSTEM_ZONE1, OA_SOAP_SEN_BLADE_SYSTEM_ZONE1, OA_SOAP_SEN_BLADE_SYSTEM_ZONE1, OA_SOAP_SEN_BLADE_CPU_ZONE1, OA_SOAP_SEN_BLADE_CPU_ZONE1, OA_SOAP_SEN_BLADE_CPU_ZONE1, OA_SOAP_SEN_BLADE_CPU_ZONE1, OA_SOAP_SEN_BLADE_MEM_ZONE1, OA_SOAP_SEN_BLADE_MEM_ZONE1, OA_SOAP_SEN_BLADE_MEM_ZONE1, OA_SOAP_SEN_BLADE_MEM_ZONE1, OA_SOAP_SEN_BLADE_MEM_ZONE1, OA_SOAP_SEN_BLADE_MEM_ZONE1, OA_SOAP_SEN_BLADE_MEM_ZONE1, OA_SOAP_SEN_BLADE_MEM_ZONE1, OA_SOAP_SEN_BLADE_DISK_ZONE1, OA_SOAP_SEN_BLADE_DISK_ZONE1, OA_SOAP_SEN_BLADE_DISK_ZONE1, OA_SOAP_SEN_BLADE_DISK_ZONE1, OA_SOAP_SEN_BLADE_CPU1_1, OA_SOAP_SEN_BLADE_CPU1_1, OA_SOAP_SEN_BLADE_CPU1_1, OA_SOAP_SEN_BLADE_CPU1_1, OA_SOAP_SEN_BLADE_CPU2_1, OA_SOAP_SEN_BLADE_CPU2_1, OA_SOAP_SEN_BLADE_CPU2_1, OA_SOAP_SEN_BLADE_CPU2_1, OA_SOAP_SEN_BLADE_CPU3_1, OA_SOAP_SEN_BLADE_CPU3_1, OA_SOAP_SEN_BLADE_CPU3_1, OA_SOAP_SEN_BLADE_CPU3_1, OA_SOAP_SEN_BLADE_CPU4_1, OA_SOAP_SEN_BLADE_CPU4_1, OA_SOAP_SEN_BLADE_CPU4_1, OA_SOAP_SEN_BLADE_CPU4_1, OA_SOAP_SEN_BLADE_STORAGE_ZONE1, OA_SOAP_SEN_BLADE_STORAGE_ZONE1, OA_SOAP_SEN_BLADE_STORAGE_ZONE1, OA_SOAP_SEN_BLADE_STORAGE_ZONE1, OA_SOAP_SEN_BLADE_IO_BOARD_ZONE1, OA_SOAP_SEN_BLADE_IO_BOARD_ZONE1, OA_SOAP_SEN_BLADE_IO_BOARD_ZONE1, OA_SOAP_SEN_BLADE_IO_BOARD_ZONE1, OA_SOAP_SEN_BLADE_IO_BOARD_ZONE1, OA_SOAP_SEN_BLADE_IO_BOARD_ZONE1, OA_SOAP_SEN_BLADE_IO_BOARD_ZONE1, OA_SOAP_SEN_BLADE_IO_BOARD_ZONE1, OA_SOAP_SEN_BLADE_POWER_SUPPLY_ZONE1, OA_SOAP_SEN_BLADE_POWER_SUPPLY_ZONE1, OA_SOAP_SEN_BLADE_POWER_SUPPLY_ZONE1, OA_SOAP_SEN_BLADE_POWER_SUPPLY_ZONE1, OA_SOAP_SEN_BLADE_POWER_SUPPLY_ZONE1, OA_SOAP_SEN_BLADE_POWER_SUPPLY_ZONE1, OA_SOAP_SEN_BLADE_POWER_SUPPLY_ZONE1, OA_SOAP_SEN_BLADE_POWER_SUPPLY_ZONE1, OA_SOAP_SEN_BLADE_CHASSIS_ZONE1, OA_SOAP_SEN_BLADE_CHASSIS_ZONE1 }; /* Array which indicates the power status of the blade in different slots */ SaHpiPowerStateT oa_soap_bay_pwr_status[OA_SOAP_C7000_MAX_BLADE] = { SAHPI_POWER_OFF, SAHPI_POWER_OFF, SAHPI_POWER_OFF, SAHPI_POWER_OFF, SAHPI_POWER_OFF, SAHPI_POWER_OFF, SAHPI_POWER_OFF, SAHPI_POWER_OFF, SAHPI_POWER_OFF, SAHPI_POWER_OFF, SAHPI_POWER_OFF, SAHPI_POWER_OFF, SAHPI_POWER_OFF, SAHPI_POWER_OFF, SAHPI_POWER_OFF, SAHPI_POWER_OFF }; openhpi-3.6.1/plugins/oa_soap/oa_soap_callsupport.h0000644000175100017510000002246612575647270021530 0ustar mohanmohan/* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Bryan Sutula * * * This file implements support functions that are used to perform SOAP * calls. See also oa_soap_callsupport.c for further details. */ #ifndef _OA_SOAP_CALLSUPPORT_H_ #define _OA_SOAP_CALLSUPPORT_H_ /* Include files */ #include #include #include /* Size limits */ /* TODO: Is there a way to check all of these, to make sure they are big * enough, but not too big? */ #define OA_SOAP_SERVER_SIZE 160 #define OA_SOAP_USER_SIZE 80 #define OA_SOAP_HEADER_SIZE (200+OA_SOAP_SERVER_SIZE) #define OA_SOAP_LOGIN_SIZE 2000 /* Careful...needs to be big enough * for failed login attempts */ #define OA_SOAP_REQ_BUFFER_SIZE 2000 #define OA_SOAP_RESP_BUFFER_SIZE 4000 /* 8000 seems to be the maximum * usable size, based on the * choices made by the SSL library */ /* These need to match up */ #define OA_SOAP_SESSIONKEY_SIZE 16 #define OA_SOAP_SESS_KEY_LABEL "0123456_hi_there" /* Macros available for callers of these routines */ /** * soap_request * @connection: OA SOAP connection provided by soap_open() * @fmt: printf-style format string, used to build the SOAP command * @...: printf-style variable arguments, used with "fmt" * * This is the main function used by most of the individual SOAP routines. * It creates the SOAP request string and uses soap_call() to do the real * work. * * Return value: 0 for successful SOAP call, various negative values for * errors. (See soap_call() for details on various error return values.) **/ #define soap_request(connection, fmt, ...) \ ( \ snprintf(connection->req_buf, OA_SOAP_REQ_BUFFER_SIZE, \ OA_XML_REQUEST fmt OA_XML_TAIL, ## __VA_ARGS__), \ soap_call(connection) \ ) /** * soap_ignore_errors * @connection: OA SOAP connection provided by soap_open() * @boolean: True if errors are not to be printed, false (0) if errors * are to be reported through the normal OpenHPI err() macro * * Generally, OpenHPI error macros are used to report any errors that * occur. Some of this error reporting can be masked, so that the user * isn't bothered by errors that may be expected. This routines enables * and disables this error reporting. * * Return value: (none) **/ #define soap_ignore_errors(connection, boolean) \ connection->ignore_errors = boolean /** * soap_timeout * @connection: OA SOAP connection provided by soap_open() * * Gives read and write access to the connection timeout value. Can be used * on either left-hand or right-hand side of an assignment. Value read from * or written to this macro should be an integer, and is interpreted as the * timeout in seconds. * * Return value: (none) **/ #define soap_timeout(connection) \ (connection->timeout) /** * soap_error_number and soap_error_string * @connection: OA SOAP connection provided by soap_open() * * Related to soap_ignore_errors() above, it is sometimes useful to retrieve * the error number or string from the most recent OA SOAP call. These macros * provide this. The number values are as documented for soap_call(), and the * error string comes from either the OA's SOAP server engine or is generated * by the OA as a result of a failed SOAP call. Note that the string is not * valid when the error is a general error (-1) or a timeout (-2). * * Return values: * soap_error_number() returns an integer number * soap_error_string() returns a string pointer * Both values are valid until the next OA SOAP call. **/ #define soap_error_number(connection) \ (connection->last_error_number) #define soap_error_string(connection) \ (connection->last_error_string) /* Error codes returned by OA on event session failure */ #define ERR_EVENT_PIPE 201 #define ERR_EVENT_DAEMON_KILLED 204 /* Define the enum strings only in the oa_soap_calls.c file */ #ifdef OA_SOAP_CALLS_FILE #define OA_SOAP_ENUM_STRING(name, ...) \ const char name##_S[] = #__VA_ARGS__; #else #define OA_SOAP_ENUM_STRING(name, ...) #endif #define OA_SOAP_CALLS_FILE /* Defines ENUM strings in this file */ #define OA_SOAP_ENUM(name, ...) \ enum name { __VA_ARGS__ }; \ OA_SOAP_ENUM_STRING(name, __VA_ARGS__) /* Data structures */ struct soap_con { SSL_CTX *ctx; BIO *bio; long timeout; /* Timeout value, or zero for none */ char server[OA_SOAP_SERVER_SIZE + 1]; char username[OA_SOAP_USER_SIZE + 1]; char password[OA_SOAP_USER_SIZE + 1]; char session_id[OA_SOAP_SESSIONKEY_SIZE + 1]; xmlDocPtr doc; /* We keep this here so that memory can * be freed during the next call */ char req_buf[OA_SOAP_REQ_BUFFER_SIZE]; int req_high_water; int ignore_errors; int last_error_number; char *last_error_string; }; typedef struct soap_con SOAP_CON; /* Function prototypes */ SOAP_CON *soap_open(char *server, char *username, char *password, long timeout); void soap_close(SOAP_CON *connection); int soap_call(SOAP_CON *connection); xmlNode *soap_find_node(xmlNode *node, char *findstring); xmlNode *soap_walk_tree(xmlNode *node, char *colonstring); xmlNode *soap_walk_doc(xmlDocPtr doc, char *colonstring); char *soap_value(xmlNode *node); char *soap_tree_value(xmlNode *node, char *colonstring); xmlNode *soap_next_node(xmlNode *node); int soap_enum(const char *enums, char *value); int soap_inv_enum(char *result, const char *enums, int value); /* Various strings that are used to communicate with the OA */ #define OA_XML_HEADER \ "POST /hpoa HTTP/1.1\n" \ "Host: %s\n" \ "Content-Type: application/soap+xml; charset=\"utf-8\"\n" \ "Content-Length: %d\n\n" #define OA_XML_VERSION \ "\n" #define OA_XML_ENVELOPE \ "\n" #define OA_XML_SECURITY \ "" \ "\n" \ "\n" \ "" OA_SOAP_SESS_KEY_LABEL "\n" \ "\n" \ "\n" \ "\n" #define OA_XML_TAIL \ "\n" \ "\n" #define OA_XML_LOGIN \ OA_XML_VERSION \ OA_XML_ENVELOPE \ "\n" \ "\n" \ "%s\n" \ "%s\n" \ "\n" \ OA_XML_TAIL #define OA_XML_REQUEST \ OA_XML_VERSION \ OA_XML_ENVELOPE \ OA_XML_SECURITY \ "\n" #endif /* _OA_SOAP_CALLSUPPORT_H_ */ openhpi-3.6.1/plugins/oa_soap/oa_soap_watchdog.c0000644000175100017510000001112712575647266020750 0ustar mohanmohan/* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra M.S. **/ #include "oa_soap_watchdog.h" /** * oa_soap_get_watchdog_info * @oh_handler: Handler data pointer * @resource_id: Resource ID * @num: Watchdog rdr number * @wdt: Watchdog structure * * Purpose: * Gets watchdog information of the resource * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current oa_soap implementation does not * support this API **/ SaErrorT oa_soap_get_watchdog_info(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiWatchdogNumT num, SaHpiWatchdogT *wdt) { err("oa_soap_get_watchdog_info not implemented"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_set_watchdog_info * @oh_handler: Handler data pointer * @resource_id: Resource ID * @num: Watchdog rdr number * @wdt: Watchdog structure * * Purpose: * Sets watchdog information of the resource * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current oa_soap implementation does not * support this API **/ SaErrorT oa_soap_set_watchdog_info(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiWatchdogNumT num, SaHpiWatchdogT *wdt) { err("oa_soap_set_watchdog_info not implemented"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_reset_watchdog * @oh_handler: Handler data pointer * @resource_id: Resource ID * @num: Watchdog rdr number * * Purpose: * Starts/Restarts the watchdog timer from initial count down * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current oa_soap implementation does not * support this API **/ SaErrorT oa_soap_reset_watchdog(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiWatchdogNumT num) { err("oa_soap_reset_watchdog not implemented"); return SA_ERR_HPI_UNSUPPORTED_API; } void * oh_get_watchdog_info (void *, SaHpiResourceIdT, SaHpiWatchdogNumT, SaHpiWatchdogT *) __attribute__ ((weak, alias("oa_soap_get_watchdog_info"))); void * oh_set_watchdog_info (void *, SaHpiResourceIdT, SaHpiWatchdogNumT, SaHpiWatchdogT *) __attribute__ ((weak, alias("oa_soap_set_watchdog_info"))); void * oh_reset_watchdog (void *, SaHpiResourceIdT, SaHpiWatchdogNumT) __attribute__ ((weak, alias("oa_soap_reset_watchdog"))); openhpi-3.6.1/plugins/oa_soap/OpenHPI_Blade_DevGuide.pdf0000644000175100017510000306505112575647270022106 0ustar mohanmohan%PDF-1.4 %âãÏÓ 50 0 obj <> stream xÚ•ÛnA †ï÷)æ‚C9Ôõxž¹Em –¦H¹«¢ ®x}<Û°Y¯—R­âM¢oN¿{¼Cy¼KÑ…â®o;týï®%¬äóµ{Õw'ç訸þKç÷ü±/.s"výmw´CÄ-„gý·‘¢9F>ná} §-¬Zx=W Ûò”ñÈh·S!”d©Kœ’¶*¼7Ú¸OŒv¹ *%ØåÎT#&{<$lï'Jg_¡ÃÞI¬B@ Ê*9(ð±þb‚êù~͈+D¶ÛL¡€Aä°S ´pΗ ’¤bó„FŒ 6˘ ùqS2R‚Äö°ïZX·p1Ňâh{ OUrÁ“!fFôù¬Å…€ñþi¢Ûƒ-6ãIuå‰ë¢ô“®¼¡•Ë Ò5Eb" zÞÂÕ žÂ³œ¦dƒzÃYÐWºÕñ]»òóþõëÞLbå)Ô‴&ç†&wòÝéÏn-ÏCfß÷BÕ Ñå•hܳö,p˵&®¦Ç<'ÎÆD »láí Å¨ÊCR+‰‚<Ÿç‘¶1´Â˜íe°¯ÙUÇç8‡UŠSÜz‰FTÈÒȳ9¾ô°´+­ØC­¼@GE%`ÊKsN)”¤iàHI(mz†¬F½·Ö r•ù8±Ñ-[n-?GÖK¹¢ä“Ù"’ºâ‚ä+ÅÊïßüïÂX6G×nt®ä¾wIj[.õåëÍž›ü¥Ð¿ãoº­û!óþ´5ªf endstream endobj 51 0 obj 571 endobj 56 0 obj <> stream xÚ•ZËn\7 ÝÏW̲EU¢¨×¶°Ç¸qO3Fà]6(š]õ÷{4ãŒÍKŽ4E›×¹E’‡ºñëí¿+¿Þþ†Ç~þ±úy»úiã×u½ý}Ö?Â:æuavL´Þ~[ýðì½/?nÿ|ý÷æ4â}\¿…%ï8’ÞõÇCÜtu%W…þô“£#J ó«À$WŠ6ïc\ôÇnoÄÛWj74Œ·®ìjÕæ=¼Å´à’q„; ޻Ȭ»£#÷ï|ïÆáõ;W{Sûc#à”]‹ ýtô…Uàà¨Æññ'ÇIƒvÔ\Åv‚IPuU§«ˆ-1¹6v q9yLNJÁqž$1¥äšÁ](ÆAŸo£}›Aã¨Oùì)\A„³^ñUGƶrÇJ.¤:‰f­Î'mÖ½^®E× ÷Ê4x®LAØ3Zžðý×(zˆ.4¯ Åú‚é¸Ä8D²—ý!Á1šrW„ìmÐEäî ã°EÐ8£Þ P‚[ ë$¨¸'%¢hR›ä|,Uî,·ì™hÜ{céYc¯&Ov&ø”ÞeëÏÏUPÛØìÁ¡ªëþe=a>ƒmÅhrÒ20Âtî©‚ñ%3+‹¨1þìÜZÍ Ú%—qè¸sÊ7»3Þڜಖ4N%†º"£í$%fA¬ÍùÚþ—jJí%Y6…bºêé¿pê嚌Ф`Óc8¡‚72 0·*ôýш+ùò­¾è“©¨——Ö íi¹€]ªÞŒÈÕPD↢^Lxqãî¥FM¨ö8öB{¡®?-çÜ£z§X GE/~­È(jôÈŒ@ÉEÃRСƒä.×'ÁR)içìì™*pOS¶éôQÊkÈN}æÇWIõ @á•„¥£ðEjÞà<ëSéíÈk;%¨w‚\ìåäŒÒÚaF±Ü)H,ÚD©|öÐ Qc ØœÁ©«9Mâ×àðr"9wÇ…¥*ÃBËc†Å€ùÍÓ „Þ1±³ïAƸÚòþ>dD®H ´•’f.v24&gÀëÉbÌqLíÝ¢ÞýéHÄ ëƒmñ“†÷:gðóQ;%Ìá‘!D´ŠáõRð¢OEœìû £òN‚ŠyÞk)wƒ+œÇ%ŸA­Ì'º³\Ž^nMF5„ÑdSž‚°g¨–+ôÄɨ™ÅPzâd¦ç>,Ex*ñŒǨ™VH™Üï?Iƒ>Ëb|¯4(£ÕØÆ Œ;OCç=÷‹*ãD»¥¯†È¼4®ÃA®[eìñ„ê½’úãQàPJó—‰bTŸ¡àêÒ&n—ñ0àtu­ÎwÉ·ÀH'£¶öyYÌU`uQé3¤d/ƒòG³­RvÅ—±Éclæñ:¥“pÕ­_ÐV½×FmXpþ.‰@9SWIcäl]³ 9B×'p\¿hÈñÀ‡Yjä›À2šÄ3$n¿Ô[€Œ˜,8Nh"æ©6 ~ˆ¨ Ã^gL çŠÃê5ËsÐʧItúýa R4`.'32·À\#e s+Ì5²`qV¶27J1S§Bh g׋=Ú’GeÉú(r Hô9Ùt¿—È|¨¢“£GF„NÜ]ªhðib%ˆ<Ûœ“3ºpq\ˆ{èâ8týB-åÏôzhÔU9Ë¡ Ò¤öR·/.ÓbG9ê¬zÐs&j^Ë'òo+‘—yy|2.ÿ+\“ÇNîwõž5ÈÐåSÕYìÓJ5su„¿^ÑÝwé_5Ž“¬ dxöθPofØ·êÅQ!;ZvöÆýWÂtŽûPcxÒ1X»fmy „5’ŠÝ³ƒÔµýc\##bûqÊ:Æ{Cå#éj+&F/kœl¢JM³Kí„ãï¤R>q=ÊÈ[«@.Ëg Ò-ž(ÎR¨1D;ÍÔ‚ÊuâˆÒCíXû%]›l‡ffìöQ^nlL¾ÿò4ñN‚äñuBÒ®ÓO4c˜µ¥OÓ»n'zŠÞÕ@cÕ•tÝàÑaY`n·óû6¼À ?@T\¿òæ¿£å\Ò6ˆs”‡D…žíʧßò,0ËÿôŠ^GWêΧ û~Ýp¹]=¬þYuì7< rô¯Uj=1ä<~ûõ÷æ¯ôûû_W»õßX÷?'ß endstream endobj 57 0 obj 1855 endobj 60 0 obj <> stream xÚí][o\·~ׯЃc7ˆAó~)Ú—B‘G¨¼kKk;z+ER }éßïÌ‘´ç›sέZ&’,¥è[Þùq†œÚck‚O‰’”c9þ×OGVü¯íË£K Ç¿¥TMñÓ/¿Üÿ’ù—xûÃÏG?RoÿÍ;úËÛ£§öØÓ/?¹cÊûØ368l:~ûëÑ®­µO¿~û÷ýßs1­UÀlbJ3.:Àlbjãf÷Ó¢ñÔH‰9{ˆq6jñbYÎEÓÐŽ?®iu…ûÄN_¹éiú‡ú—»È¹‡]T,ýMŽaŸÓs(³TjàTäe×Ñ„†À-¼äw}s½I0·këÝHG:ÒÇŸvlºßT’3M¡k°HÍǹ¹z¥­!$À~ûÈThÌði Úìé÷lú©ûm#¾`áOzmÀJ ßí3î‰8K]©l¢•øU­ì)ÂK2µ`oŽi:Ò‘~zZìØ0Fe]†ÇDHbä,Å´@’oÌË{†™ú¢‰3ï…>O*É¥4qÍ \tðH¤_ÀSJ¦4 ’s&ú «D9Ù´Ò„ìLU:èÈà®XS­¤Â©•Æ,û•ÚÕl,–;ÖÁHGú ùÖ_ð’_sê ¥ãWkBN€¹¾î@ôGfz³×á_!Û¸b˜*ÅWNzúÆå™|¿GJÍXðþX ’øÈ±=í™5›ê±g³zÓvMê’«‰J;ß÷ÌLp‚l5­¬W#m @ÊþGks\i"i®,ØÞÛLó Ër¤#ý/èÖS’¾“ï ßðGèõ{’x-ôf!úf}ñKŠÜ˜ý OöÄ&•ü–*À¯$·¦àô'É­¶aN};J4Þ—CÚQ‹)³ëwÚꢒݶ'Cg’Òá¯÷]xÞæ,¼éAÍÔˆ=²C*´y¥†Ã=–ØH¿8 Ê:è)´ØãL’ãCˆçoá,µVZôÉþ˜aÓÿôª'To¼òíÝ^˜=“g |Ç U“¬o@ý!lf½Þ(÷ [º_,®Ó‡ŠÅáŽÓ¨Ï36V€H@{~~u;®ö¾_{N$¹Ùb}ÆJé`BE˜„u‚LHbßCÈWÝßI,0ïö«ó¢?uUHБ\ǽÈbŽƒ5¬T ´ßÉÒ—"À73Rqq$>f€?ïAlE€ ž™f1'aULô @½T[œ.—F"¯ÏR4òÜHW€ ò°42¿ Ðá¹%I¸È Û%½ã±Á.êéÐÑ^j“>€ßõ§¤–(ÃrÞƒªi;jf§ô1ª½u¢_¦ù”µk-Êþf³–-ê@¤”e@¯¿îQ|Zƒãt¯„õjB¥¾, 3,4Òßódæ#°}â©»x¹E€ê¿Ú/…“{+ViVHÞ’_ÌÒ,õæÌù™dz‰º’Ò4-Y‰Ùõû Ÿ5èLÕ:RV$èµ4 ³ +~* È€­»å÷þæ+ë¼@³ ÞEìZw°]Ji+ úcòØi½A]£}2¸•Nã3RN‹ãÝ‹¶fm噋Ï8FÊ&â*ULå°ÛâJí[G{m´ËŒôñï1‘œWµùoSi‘Jïj‘`÷h…s`éÍ'HÑ÷²ªÁZŠ“zòFjÎ"rî(†¶±=cŠŒt¤Ÿuáú½£®(©+;¤®gu5’#{!×™Jj¯iÔULc9Z êŠv2i•ÈYê"!3V€92Ò‘~œ…ëö޳²p"¥ïÔ5ST×&)‰\W×cžâ)È/ (kH‰P׉‘B+kYµýT€vÒL•´$¨¯9G‹pXó^_¯ì:†5?•wd™ÅÀXÐ×¶õuV{cXéoËäY° r‰¶¬ßCcy×–”»äÛuÙó/µ ,xŒøHGúŠ‘¸Žï©#y¿p%cë( @g2¤SÁŒÀ5eÀ¼—Fû¡­”å©B1¯FÍ÷-h]î%ÓÌýÚº"ï÷- q÷ìÞ̉?þÚË“u ‘µš7û÷Ƹ“û 1òê¾Xìµç°»ð•F(Švk\¦"¯ÐDJkÔX˜#ý܈SÇ·Ä,§m+!£ØÐ‰cFIäNZésÐ( [§ QÔÓžw¤û6)þ¦Dž—­@nögêýuYi kèJSÑ´PfÎéH-²‰Ž <Ò‘~D ×[Ô¼˜˜cË æsβ!§Ô Ò¥'92ðÏÒ°'7,s+å¿ê±ÈêÅd3f§0V曕¬#¯´{%Wi/IX‹1åF:ÒMaE[wI3]™(¬†Cmb0vü“ ­ã2éaôAZ8æt&ƒp€" º”\­€É¾™z#‘J+‘ßJÆ0;ˆ€‡µ·=ÙM¶uË•¥J;¸ÈI~¥« ýÑb½ÅmOš `%Háx¾å'ùUE^¡/(6a¬Å‘Žt]¼TÖÍ7'àæbàæbàfÒ¹Y€tn àæ¬€tr.È9• ç°LIÏ–x>¬dEôì”J=çæVz‹CíE¬9Ðsô˜ÓSivîüÊ({ûˆ] |¦¢isR ¯LÝ„ÞCИ–#ég¤ÜâúM3¯2E·ðÈQsD,9ž×!DÀôÌgÝäð"A[ùÐgaZv«/9Ò¸]¤òŸ—6D>ӃƱÔ8šjo¥[QäAì­N3‡¹kËýÇÊr Xæ¥<î,Ê` ½»´É Pc•Œt¤ŸNXÅõ×±/›nfñJh´iÞV¾ùé4Ï.<+Ôêä)'1…‹ùäÈ­UÙKP‚.¥h¶@WÊ[Ê‘6 ÌnL ‘Žô1¿,ˆ.‘Ï"ò€ H›œ ÈОói$%€lE˜ %d#,9”œíê#Á˜TùÅÙ1©]Ì“d#‘RÂÇdéHõó=Ù±i³Óˆ ?¼¡–͇ÒÖšwÉð½$ÙŠEbÄCóqz@H‚ÐE©8¡‹R,ÚB°‘‚ ¼”.žìì$ABEÁðÕ•D=“‘‘² ˆðÓ¡jÀšÈKó„•ä»M¾a¯ÏøVŽÌ™~uÿP6„Ûn¹“½åáZîã),tÅŒÎå¢IkKoÝÄÍØÅ" Iž^„!Ì1Ò±sÀ©¯²N²vwÏ{Eî=þ(t™.r^£?Zê|à(‘§RVö ³û~ï(¿Å`s‘·≯7Aˆ…xAçúóœ|›  /åS¤«*"³ÍRИ•#éïwꪬǎý,›y ‰9-¼?ÔÂôbœÄlÔcƒÈâ¢@¾Ó£¥± j™¶ÒƒP76Q@ ‡8ÙÔKäVJ´!c™ÂB ë¤UÄJ"ÖnLÍ‘Žôs8rè©e›«Úzî)Tòg´ÊµzG¢$ ZÞ¿)¿‘oyäR¾•Vò%`žWò)Ë-ŠŠ3ι|›4”ÈSéöϺ-—ƒ‰AÏûgê”*d>ùÕzi–õ|¤¼ØA%Q§;]‚å}Ä®¶}@¨û]°5>Ö¥nv²wbq?áŠ×÷ª©¹.toxI9é3 ?ÕÈÅãön¦EµÐ0¯4ˆÊZXiû[¬áµuΤ‚cÏ‹¤·Þî¢ïv‘"‚¯&„ ”1˜pÏw³6ç|YˆÉÒìôŒ“êã;_KÉ:ðI¸_òšrD»|¾*@ÊÛ¤>L¡Jä™|»©Æ uŸÎ‚õj#ÛJFäN+øÞ/¹yŽŠ…x ‰O>iØ» åùlŠÅ>ÙÀ‹«Ç¡ç¼Ð¦ëŽùÞA)QÉS}QµÙÈ9/7°åÕ0E“XnQm¦Uƒ;¿þš?ëMÓf•´L]táÄçË,m»ˆn`!Á²¥Â‰oȘ[–—z¶³«k@'Ò"*ʼn7˜2IzXÜÌ‹²L¿–·üRF›‰Ø3y®c!WÀ·`›0OÅD¯Þ‹‘ȱ F:ÒÀ¢¸ÎòœÏk°½gE•¶µüî²möBˆ*”Aäeþš­Ï7 ©TÖ%;¥Ô ž³I .背ƒ2Fx†$Q•°¸7òj?òa•­¶zm~Ì9yüΆ/‰s¤ê¶ ç÷,gùZT‘‰’ŸÞx—Y(L”iE“ª&‘;©°²Ý¬eÉi‰¤) ú ƒ7gÌèb†(¥õLdýÃOí¤9& –Deüξó ˜1¡Gú%=a¤ÌÿüÐsŸ´ÀĽ’/iÑÖ¿áKj§`¡4ñÝwòŽl/‘çðü&@^Íx§’Nž0Ã9Õ1ÜD^nõeKJsðfžÃ­VDŽÙ9Ò‘þ_ßÈ÷,ÈWòUá…ôé´+yŸý|L¦ÚnÈA`¶÷ïÉ‹’&~Øí‚KÁ„ÖàÛ¯Õ‡5“ €ÜÈ#6°};yó] ‚Æ,éH?½’ª¬Ã;òòâzÂǶ†DB´0$£†!YÌˆÃøâ´“H¢K:”³)µÀ·j,–vlº FV…ãJocƒHИº#é'¤ÄئÄç£7;–˜­0¾ä˜Ãó\9sиr:Ì ÂT‹9ȉlY|[ãÄ›¨J¹wØÐŸQBИ»#é'àÂæB¿ì©“2b.f¬mšŒÝ%üµ°³N†% ïêúD8‡¸?ô'}Îøˆå¾—¶,¶ ¨gÀHò0 »´‘Þ‘Q©üNyà#š`ëz3³#œÜÌóÁ®Þ,÷JmÆ*ü^¾ÑÑ\^é•ÖL*~¹Wør:Ø„½Ò_N³5Žç‹”L ˜:³zÆÈ£@h¥Yœi%éÓU¦óÜi+@ºTu~¥‡éñÊŒD6Ò÷F²2ßÔ ¡Øé Œýh¶Ç½ÑC³œ™gü9èþL¬²°%°ì-@O$Ùçà”¥+|ôy¥¸DíäU‡Mœ<Ü= ¶bnû ¯W·£c÷öðy§NļqB¬Cнû>F2™üŽ,öýÌåšÑ$ìß>î {>„¦OaŒÎaTf ÇýÏ—L –nzÎ&$#HØ¡×ÉQh¹ä§I§ìÑîm‚2M6½§í~ AÐ<|į·HäÕ~žtk1°§²Ç¶öyò ‡cPæ—i›©Ìƒ¬½M[‚kežkK™Üi$æÍ̶A*B@ôfot.·þ¸­¦´\Kçù“ 1;F:ÒÇ"¢¬ûY¶«qíf…íjüMl'à?È 'ž5 úJe»:ü\F:Ò/ŽípÝ—‡O5Ûã—ôßOG/Níq;~ûã}–T”HÊÇéôº™h²eòã˜NgJŽÔIÈfÓCÊÍY`Ùõ˜f2›|ö˜Žc“'õŒu¥¥²ˆþв@IJ)j ¿ ûíÛ£ÍÑ?û+}²Áý/G‰ôÃâû_,ýøó-îÁÿê wßÿùhwüÊ÷?ƒo7 endstream endobj 61 0 obj 4701 endobj 105 0 obj <> stream xÚí]Mž·uÝϯЕÄ ùý±È¦äI,Tž±4ÚHƒ")Ðnú÷ËûŒ=ï9ùZ±lT! 5ñ™‡ä%y/yIÚ'ÖŸRORŽåÉÿüÇ•Uÿ×í7W!?))<ùûUŠÖüò·÷¿äþË‘üõê/ý¯ÿW~üûÕ¿¾¾úú…}âû/¹rOú·Ÿ¸'‚ Λž¼þûÕoÞYkßýö·¯ÿó£)¥èå€i“óGùñ'ùñæCt)¦8üâõ‡˜ZL‹0w‚±æÁ:ýÝ&R-çtµl4¹ã±ZÖÇ¡Ñ$ýN~„aÍ™äø/òã•üx&?¾8WMtðwyÀøh\À’¾A­÷¨»‚É+}?‚²qÕh,wt¦†  ïP ½}0»†~çd¼u¬A‚N‡¿«­·áß?oŽü>Ä{›L­ðG+ÝHMŒhø;Þa½/¦:7·›¥—;Ô€‰ÉXRÂg˜eŠ=K,á7([ÓóçÓŒõeYª)aÑ;|­Æ‘¶L¨… ìÕš‰!Í»u°¡s–þv5SIgĆ }LVy·Jú Ëe1èBˆÆ&Ï:¶ÛéÿïôÃvN}ü»\©¢0eéâ“»l(hñÑ :( 3­8À´÷Ýã¾yü×!¶×Àî %,Ðï`¹äŒK£„¤N…‹5ÊZ&õÙˆ ÄäJÿ¹èÙ’yf÷ý¨Õ„€ {T‘«³wÙ„Œójuº Ùãc§Ÿ?ßQË?Lð¬æ»>yÐPä; "ÓÜ —šæövÀdS"b†áß²‰1#‹Yß'‰@#ö9gg=C¤“)s™—Ëù>/"lÝy=Ƕ(]wÞ„§ÕLÖØˆ ‘¬SŸö´ÅHÖ9ò¡‘«‹¸“ø¡)W÷†¨ÿ敞ü‹§H:âã;ý'çr:..·->=-‹K¹û<ëOòËßÞÿ’ÖŸþ!ëOg«N9Øai§¨E§ÐÝ>è&¥ž£ÌóG—\Pò§ Ê‚RîÎèrAIƒüA(@©Ïî# oø”sñA÷ü«Q;úü]Ø^—`” k\ úB/ÅÔ4êF,Ƨ¸È.eãü ¬b ÆYüœU㥛)ЫGwÿ?4Ì¡'/“Ž*QLˆØJOÇi×ôˆE—ÄÚÄG þaD¶c]E#_Ž«G}²Qs²‚ê»íkÁ¦~˜uàÇSëþتB¹'K*4®uÓ´ /Ç5"o²ÅÊÀB’ÏX¦ûqÈvo“Wóåcë£Ü§Y‘ Ö­[•.Ò~ÙbtçÿÔ{ãrMGƒDµ¦+–†Œ:•L 0CïÿÍ9,Ï­òp|Äâ —ˆã]ä âœØC…4Ò¢'Ðð›ß£?;55D¾|äÒ?jC&¤)v/ßéN?ñ 8wg+à©”õŠ1¶TÊ– CÙRa([*Ì„-’°¥k}TÐ8«ê³öþQ¬Æý#ªmÜΙÄ2jÛ8ÖcùJ£‚ÞÇõ ó~"ùíH¿µÏŒYÓîQ³Ó~*ÖÅñÙTX7ÃeAÖÍqɺ9®Y7Ç5ëæ¸fÝ/eÝ—sTolª€|ª#jòL‡ÊØâô=";Ïæ†{>òl4Í¢ÉÞ;±„æ»CÞÐ:Šå‹3ÑWÖî{Hít§?7çx1'½{:îš>PqrëøÃâ</Š?L­ÀB¢,´CY!19(ˆ@,âÉ'7@ ¹HE >¬ÕkÐwšQšå…Þµ¬)–xX~ªç¶µE¿¢A)67‡lUÇ´‰JëŸ8fS¥²"Þê%ìèIÏko;?oª s×Îc×͈UK—|¯6Žq©9•.™ØUî±ô9˜ZÓ"Ïbu¤yGPïž «˜È·ÄzŽT ÒÒÆŽuÂÍ´;](Naý&²õQœ ÷xƒCÅ õ‚ˆ÷ˆ_»,â=8øC yO"1ï ‹1ï¾ÇÛ ŒyO @ó^+€@r޵hŠÉIÙ˜KNˆ~a.9Ù…H›ñK3Í …bê›Çn3‘/r;k‰©Ï5Î{”}âëâK±™hñK7` Ù,­›¥Ù¡U@½7-£í˜šdÉ @5ñÝg.•u¯M¢;½xדôŸÈ–‹DT|Ò¢âQTˆŠJt €‰J«þDE¢0¡¬ *ÞU@¨`}îqm-’"Q’R–$Å @CœHJ°XG.)¶®¬Ñ%%¤¶u»Ê ˜.àäœV«—4%ElŽÉ9­&8k˜ãœi½¯Ð‰©»˜h¡·£\ØãÔÄ<Ï”ŽsG4f—eÞUæ}Ïç>}òXEðu|¾§Ô©ɆŘñ5°ˆ†ueÊd„§“Ê:ô&í-V¸æ†ýäT¬œ×bP¬h³Þß“L´æ ¼™2~g$bŽø6 ƒømwsdÍLÆÝa—úǺáBÈjý"ÏnU/^š½%® jÆ/á°—0ÐÃ[dÈ;8:Vi£ÝíwºÓ_|a Ça<9Ý[Ó´Š‘ïÄhUc4­º„u(KBe°DãÜ[ÖÉ ~ }çúT$9@ÞêCY}J­1ot\}.hF˜²Ö8òNoqÄZ‰õw‡ÞéN­ù(§ÄYóôÈPì.Ÿ|a8mÕ Ê¯ 3òk45 _9ùÚjäÛTŸVƒ®õ¡×îÒjÌ””z º×S[¹†Hƒ`jÛ,šó¶, ¿¤£'íq ŽF>?6¢=GÞaðºc­½ÇÛNwú‰'¼ŒŒÏx»Ìzvv°~ {àí29EY³µ€¹V¿(Èmi±8o5û·yFÎÚןfå¬Ük†ÕZ¯ä‡fŠˆA™œ½”å„HŠp«—ÍSÁ"Œ²’Ú±®AdÙDî'«q‘§Zº Wú|ª³X0¢²ÉNÚƒìøY¹ó¢²¾¶GûN7»ÿpY ãb#ìžíjVî|e0<ï©A_>s›Tÿ6Pp=vžôŸ¼¿Èë}Ü2&Ìá+r¨?› 3{…\Sr–3üþ𩾲¥%,ö­Þ(´ ;RrW²êа„’›7¥ÅEžÝžÍÁ½0ÞbždËI ¿çÈ;}¢¿÷BÖAöÝégsg ãÉ3JeE©V&ñ‚C¡D'̱,'Ì Â&Ì Â&̳Œ'̳¬d¡¤e]0aŽ}Â܈Ñ\èÅ7“"'ÁaýéÜ9‘˜ûL²ºY›uGÉ’°Â>Â(GH kóN"!™XBCÀ/„ŠnÅ2 ”ði_ø1$PƒÎC)’…’¡µÉm§‡2?#û/"ûpÁYT ¢dâ’ì„‘½‚0²ŸeôHö³¬ŽUñ‚ÕºˆìsªÄhHöE(VáVd/'w–ß–àÁ†ßž°} àœí}u?Ý*Âö¶žëyŸæ­,Áz6¥y;K°^qXXÖ‹»&ëY웫çb›÷*_0'§‡†:‹Ó+IâôèpßLºW`ÂÙÙØ ¯ÒŠÞ-Dú¼¿à­!7ToªL¥üädj•“0×*†ÝʬRaÞ(!‘8wyAbÿ:ÍT¬ãÍãk —C3óz¸ŒkX‘ Ö‚òqþCX X;µÔe˜–‚$DêB—‚¼¬ÆMól]¹Ö—‚Öðl)(q$Y b=usÄN?£˜ï.æv[—«ë2´VÕ sn·uÍí¶®¹ÝÖ5·+Ì„Ûmý©Ün§gYåˆ%Vö"nwK>†Vÿ‡33“œ’“²´fêTP1M"hlñ¶Ä™—¹Ùe´z´ ãm¹>s¤âídrH¬³nØéçûbÏ|}qchéþF9ªA§ü­Œ¿5†ñ·Æ0þÖ˜sþÖÈ5Oëqðw¾Ä*.vwÞa•ßêXyQdj‰•É ƒ±2¤éïõ*RsXÅ[¼!ÒÍÛAbijÃ/©ÌêLlh-LÓíZGÞá+!•õñM;ý§Ÿæ“q‘NnCÕ¯dÂ÷ ÂȉL *ê]¨ˆoQdï1Àæý{z¯àä%f}¼›ò§‘ûóñ¥F>×7 8ẃçú Zí¾ -䏸R”hW,Ó½¾~Ý÷©µ]ë÷Z°àßi£4?¸5”Ev¥vÞÇ/1£ï j$¸²a2í?ºtîbP$u1È@Ù´ÓÏÎÅ ýüT;r[jG‹FŽÌ@Ï` Ü…Ïì÷ú詜OÕ [½ÿ+;tCo*Ž?—µS!{Î[ÇÞzžç>{ÊJw«Œˆy£ÏòËq, "só>×÷9p$Ü5“šgc»îôcçô8žNy9å‹ Ä«Á”xˆo÷ÝkàïuèM @@½Vê«@7'—ÄcuÉ:L°Gô¸F¾Õ[®6 èZ(Í¢iiv¶ÏÙ•®”çsv+ŽÎÔ©».Áè¾Y¬Uü’ò6²,3!Šp½¬Øâ®—[­íp{,ït§+N?'jXÎazŠéǹv¼à(+€(åÇpÁ\»6ÂE/!]å[ü»èåá¶C„‹^¼¬¾Ä°¾éEƒÎoz¡HzÓ i„= vºÓ_‹f wžÑl˜¾sž_ÂhVƒ(Í{ÁÌ:7²û^‚q? ÷½ÈUY÷½È£w¾„¸ïEÞÕ [½:b#Ú î{©4½ïE£Îï{¡Hzß ió=êvºÓO½ M¸öä­¦àÊŠ½ì[¹ ޝjPPäíSÌ­ wq2©U˜?ÜÞ[VUÝä€c«¦:üÎ}U¢@d³#JÄ¢?‡‹Ø-Úóh;cžŠ‘ƒ\ ëŸ rû,ê^s»ós[¹˜L)Xðï誷+—®z»r骷ÛÇ7wºÓŸmêNýŒüm\‘¿•`@{ÁqV ¢äoãšü†’¿kò·Óê©O+€8ù§†E®—OjB{ÞÁóDòwÂÙÓOuò¤PðXv+s[ ùgò-úT_%æJ7±ˆC°X¦xžƒÔ ±c]^dY›q»çîÔÒñvŸ‘ [M Ž#ïôIªJ‡Øf¯~þ*D¤åäñ>ßÜJ…‚OFŽÄjS!a*¤1L…4†©Æ€ #š©Pí,æùýãW "KˆÁ”)!*Ã#ß®Ì+++C¾à—nèÊPH~Þ®X«[ï¸q vrãds‰7NzÖ!÷Xßéæö¸öɳD¾Ôåò’c0r$Vƒ(·—ºæv…¡Ü^êšÛKs»@ÜÃh¾ò”Û½2+uAíÝßÙI¶S7Væ-ÄÔË©£¶Ö”ŒÍt£ƒåcÃʪóVí¸cÚ˜®¤ãÐî¼z·°¤[èóVµÛmʦÿ½“8RMÿ|g26·ìôŸO3ˆœ\A<1¼Þ’@9†«A_ˆj¬ð¸Â<…a/w¬xÄÁvùØÈYú„@7Zjub¯ÞɲSYäé›i­úJ/(E´Û–xÔÈ‘wúЬlÖÜe§;ý…ö‚›žoòËHžŒlÕ J¼ CˆWž5*Ì:†§Éì-ÍŽVÚf²Ç/±xÉfŠEc(RM¦¬å|Jíuö”háHò”(mª= vºÓ_zZ›üÅìÚr™;U#G?5ˆ²«ÂPvMµ…I&S~r\$prg1‚®õ³£rY­Ý@$1ޏI2 ³%Úœ§“Ã/é%•ØKŽÍÈæÈň…å¹O¹2†˜u¶îôN‰ÃÙ¹P¸ð½øiÜc'íìŠÌˆˆÝ÷®1ä¾w Álë¸Öx«:²èìóÀ{uù™s˜cÖ³ùƒ¤Êä°³Õ´ˆ¹=Ó+_žd÷½ŽãI9 ~£/ÒñX¦·ZlÌ5¼`KšæFÇÅÜД'w§Ö„{ít§¿Òö2cÞ“ ÙŒ\Mü»+0rôUƒÈS"rú”ˆ²§D4fò”H´àYGüDRÑk=%w¿tCïGð¤·ú¥©ü¼®2o¯A@ÄrATÏzÉS³âêä³s¼0'h˜ŒËæÝë#°5¡épåÉw?+“Ö}>NÃÃñJ,ôËq¯Âûn;Ìô…Þ\ˆ¶°‘`aqQödOCƒ_úû˜·s§í&› ±µHžZÁ/­_p¯ò ÊâãM\86À7µîôãמH*'wüT‘ºÄ$HAÎ%(Öµ)ÌD‚¼Ç:€Éé ºÖÏ]µˆ_âd…€bKKe^×ã9«†  lÑ"\‚<ùÜD‚œ_”°{Ô$(É<@Û—J­Ø3A‚ÖÈÌóà»+¡¶¸ew÷rqR¨lôÔ8Ù.™ƒIÈ×/ì“*.çë¿| 'ÕŽ––ðnÌ"ӇćÑú§%VÆMž;ýé~ ö£r¶¡q¼×Ýf¢"(r‚Wƒ˜¦(ȹ¦( Õ…™hJvà )Y¶QÜšðK\S¢žB‚¦ÈÃYÓºÊ"ÓA± t§o}8¤_W‘hJÿ\Á†˜hŠÜ¾7/b}8‡§AJT.QBÅ. D%ö¦@kU‘m|MDE^Àñ…õw§–c]q–ˆJ÷®rãŘú%‡ÏAÇ覿~üÞö§Sy^syˆÍ9h¬ALä\êƒÂLô!¥pÔù‚>È =ÄõAŽj$èñk0«ë¡A }j‹U¤>‡„ÊjäDJ]”°ËCªyp9¢}©<Ø‚=äÁ‘Þ êæ9—‡ë²»{iëØè çòÀŠq‘<`.›þvúñò€ý©œm]Ëþî\äBP„‘“ÒÄäAAÎåA©<(ÌÌ}x y(B òpì¯(ЉûP± Y|fuy5ä!‹p÷ÁË€BžÊC6«Ö8B”šä!:4—‡˜°. )~ úÐfºp\YöwìUU†;qŠãÅXëËeóÞNÿ- ìOgúÐ ñL6‚ÐwP¢ q* Ç”AAf~CŒÑmMcÐkhð§¡D Ä5¥E-—!=†˜‡¡B gëI]³¦Å«r”† ·Ð {q5@1÷“u7-H @J^!ê®B [{ ù^&càÄQàeXë@"ylšÛéGÊëNg*Pý\œqÕú Cd@!Ne@ᘠ(ÈDBŸÕ+4ÜT—*âZ¸úè5†É@ÏÐCñnuü*ã¾%©µy±“?^çT&Ñä ùŠ@8^ž–®Š(‚ÅîÁs(`1¦]©=Ôã¹>Ùô ­}~ß Ç‰ ˆ#‡†AÙÉ@aî@jÇ?¬ ó §Ü+Èãf¹þƒjÇŸ¨An+Ÿ@$GoV¢ qª ÇÔ@AfNAg…F§ !p«ÙÁwNœ‚ÅC§ÀO+yøP$ÜdöªÆ÷˜=uæÄ·S˺L­ð"V¥#°®Júü´•y5kŸÀÜi=( Žr%·õÅ¥?‘+9­ Á¬³âÉå˜>x?Bº¢eèÿD­¢\…¨qÏõ ¹ÔeE¥wZ( X~ÔÜŽåL]nÞåö¼°h'ñ5ä¾Yó}DÕ:ï`Áz“p`¾1ù„V˜áüñˆ-3æÕÇcÍiž—ïNb…º/U7È}ÅOù ô†JØ·ÇÖ 9šR"í³cŽ¥óULÓ‘dVáâ-rŸð¤Æ©ô=ˆäó×W7Wÿ}%ó÷þ³4ÿäoW©;#½ÿ ¿ØþÏ¿þ€ûàÿ ?þý_¯îŸüWÿîÿý“ôÔ endstream endobj 106 0 obj 6811 endobj 203 0 obj <> stream xÚí—MÔ0 †ïý=‚‹É—íäŠf™ Á,…EbnH°B,\øû8eê8´gÐj$·Óyâ8Žã·ãÆéÇàÆéƒ˜úùþétsµžLÃã§nô~œ>~~êGL#'Jqœn‡‡GçÜÑ~4}>#ä bî`Ñ-± ¤†d‘çÕ\.9ï2 ùFA>@’µ´Ð«jvÕ¼TxŒÐ⤡ÑÛut)AaëéPÍ[E"‚³Þ®C<—µRöÒ³qítTÍ;Eæ1Ù¼>bp$‚õƒ#ÉJ0е† `²¥tYÍ^‘Á£uw¡ è!D²•yTTrȺºWªà€ ”mš(ˆ xo‹ó8Û÷çîþÔD5/–>¢$k«0¢Ôw¯0 0Ø­¹?×ÿ9Œ½)â˜2ùÞÙ÷w×ÿãºÜoLrž»½þÔÌ~d防€;˜öôK¨' ²" Ù—…Z‘…TÅ­Áug lÒ¨B„XÈ@=U)Ù.XË —6ÖJÒ˜SÚž¥I2¨' AZ¸Íï_eÁwVÜÈv×ÑÈBo÷ § J±›Û¨‚×Éo£ Uê”´t „¼|bÈHëÛdÏKÆ\‰üD²¹š«öÙ9#rƒ4K‰3tÖ8¿ÅZc°[Š»Vc8q¿,´¨È9ÁÎaÚV#y¿!¿^Ç‘äôçÜkKwÿŸQ ¾¬,uãb÷ù_Ë­X.aü2`‘à ¿8¹½9q‹G ý=þf¸¿ŠßŸBÆ endstream endobj 204 0 obj 585 endobj 211 0 obj <> stream xÚ¥]Yo]Éq~ç¯àƒİ|¦÷y $‘’s‘¸H8ìI0'ÎCþ~ê;—"ÙõÕéså<Ìi滽TW×ÞuÝ©[bÈYþ•Kª§ûˉSÿéæì$–Óšãé¯'9¹¥†õ/¿<ÿ¥È_VþðóÉŸeˆÏÿ‹;ùçÏ'?½s§¾œ~þó‰?•±Oý)°¡-1¥ÓÏ¿žüã7çÜk|\ÿöóX¥Wƒ$|º_r¬„F“eu±ê4fT†ÎËvzÎå%5O 6ô¼÷‚ àÈ©"ÐyÊQ÷CFÅ`OùÀóƸôÂðÑ2ö‡y§AbOøÑ‚)‹ç±ÂÓI¼}2^ßðJÄzÅ·ô·ÏFÃ!Š9Ðôj´ ðy«¾yら(’8²«8|oXù ]RçV‡…üœ3a!”“ðq%õhø¥µ°C¬*gk˜F@ÄGÍö-é×aF›€ Å›—ùB^=‘òúéOøÛbV9ƒÛ¯YªØˆ|©GíYƒè>ÒQ{V1øûÆŠ_xf[šIÖ1!sO>³Øy”·â`„:¿ÆIذu¾Æloˆê\ÜÆ‡K¢w?—‚I<Œjñ¨b›_jí6ƒ=“‡[ëK>–ß²ÈÇbÈmv@¡Sļù1çSÜ•Ö2}qt>½,Á1H9ŸÂ( U¨;-íŒÎgÿ ú+’ñbŒŠ.Ö ÑûLb¸$^Ó;­ ÄŽÞžé}fqóOkxŸ0Z]Ü¡GéÂEiTEp§r –"N]óvûá®X¼ buów¶f^®VÚYfyq‰ÏÿYpžiEÔy­ïž¿2 Ed–Öþ–—jEøÓÓÀ´¿(ä@¸ƒöG«Žr2ïqô1„ÙXÁ ñ¡]¯™‘GH¨ ïK“·¤Âë¼Õj(ü®4Œ˜¼ÆÕ¿á%¶°ÇI<¬Ô½y{^BÚ¡Êêƒùn³ñ‰Œ„*yƒ5.Ÿ¾ó~ÔxYã´# SJâüèlä9å. ÏÅÝ…ü}N©ô4£{7‚Då JýդضÙ5Cnúª¢ÐÒü>È@Kl‚a 1û&WÁt£Ö¬K ~ÎY|‰dÈÌ÷Z«VϬ0Œ$̺RW‡#^uà+…QêØ-$U k­³.‘žÌ"8i-tB¾!FƒÊu…Ǽ0ÂÇb¸ùDÈg­p®•kK¼£qÌìE+ð:5'y„B¶÷ÃÚß/U‰óì™/° çfoÚp)Ä×nsn[aÐW­R[¶…uD‹(gÞ‰rÅö<æùžú“í/5ÍÉÌ Æ1Žnw£hSÎ`[#EôJz›±›O¼üÞå®óp£vÓ< û¢Ã³.­>•$”ˆ|ŸŒ ªÜ<$H¦„Q´aisNŽbì&Ç +#¨‰Øæ´rÏŸõ«Õåx<Ñ5HòOøXäŸF•+×eKšŒQ>ûmOr&ciOt®~ª!:oµroƵ9rÆ¿y2=ϵZ%du©ÌÙ/å(>qÞÙ‚Xm1ò6ãϱ££×Èà– cjP$ÀQ)P <:ª¿h¦@5ÈNj”™Õ +ª1f TƒÌ¨™)PÚÝ,ªÁÛ)Ð99S sP‡iR­zÍ(És<õ“aì¡RüÚf.ÃQn=‚Ä6 @ŸŒ@rþÏ„¼Ññ‡K’& &Ai¢|êâî5w¡x±ªy8 ¬’"Y†Ðx¶ÈrVÞ¦}&ðù{gú~6DG­ó%†5£Õçô !,¹1YŒèÂåæÓgy’MÍ8º˜!×5ch2Ë¥‘ÄŒáWFx§¶CÅî¹–43ûc´Ù:è{# -—9Í#œƒ>*s,¹q7Ç‘B=D×ÒDóE183ô»Ñ(R¤]Žáñ|å yFæ /ë«N)ÇvÔ”U7ãJœë¼²7ˆG4Ïy9žèh88Qaç ’ëÅ›f†ƒ£L³ïhû`³¼D£$ γÁã*Pg¬þ\§JÛY¼\êvXM–³ VÎ6Õ²ø²®ÏO I…Žô§Þñ ÙZ„Þqçxa(TÏdúöÛÕ±'…­¦þXE0=à.·Ï3èÕ´ÏKöÆúïi-Š´c³¯x/A„S3øRÉÉ™‡Ia ToÃüE¶•‚¾aþ1Òä­‚—=ÁHl 2› o©,­ðYŒµk¢?Ö ¿}´¹q ”æ(àÅeC%•FnT€ Ëጠ¨òì¨ÔIö¥¿Ñ†@q<»Ê³ûEìJ^âBmS˜\úk#Í«Â_Ñ Œ´™¿cªÏ’‚=ŸH*p¢7ŽúªE¡ûŠx¬É–Q×:èß p?*„ö½ÍÏ;‹o%Û—élÔN«FŸ·go9P…ÑÑÿ5¶£0Ï™?è |…"Uðsíì6ˆPz œMb;ˆ8D(2õíkÃÛ¿´ó<_G¡ï—ˆXµ}Ü(Œêr™Ç<#G³´ùÄAHåpªT´[`-ÌhŠ2éVtG…k!Š= “_!?ÙÙ„Æ‹çeÞêØx‚bšq[“4¤;ç:óæDG{3#ò±ìkJ›.ÎAØÛB‡5Ï#iEˆL9J75®hÓö–…b«øj©€¼ØÆ¹ìŒó ¢Ú÷[w©óñÖi>‡ž‹ï¿‡ð¶TjX•)ÿRôDdÞýã¨Lœ\f&é…¡vêRË3Âõ¬5Œ(þš§â˼K†ëëµa(¡¸«•bK3ÃI5Œº~ ­SÝͳVÕÅbÂôáŸ4n.© Ÿv&ú;C›Å%lo¼·ÞÏ!ÙcÙÁÖŒË;æX¡åþRÕþ SšØî¤ 8\ËŽ"ºD˜-•åÃ`†)ø³ïnùkéSß¡Xÿšðœ‚Ö0žý^ÇpCæ]ßhÕÛÂiì/ˆY›½¥Hâá.´ƒçq›§ C&—NÆŠmÑÍ×b‰ÍŠRù9±z;Ô")z¨ƒè–ãÃ1¼%80Äf+Ãk©˜Âœ0’±Ç÷£BD6LžÅBŠÌ?g:ܼFÌh4yP5˜ò¬j^ϵ•P"ÄHÚä6Ê…Q(¤¥g‚°d ×äBjàV(øõ5¦†o%€PWýZ_äPÆ;š×gQ4ÆyJYDëhŒwU1ýÛÎlb=‡x6Þ`GMˆ'ä¾Q¡+]ñë«7šŽ·(\µE ÿ•'·Ú7žÏˆìˆ…è}´ç3";É/ÝØí­.8¨‰‰{Ïz/‹6Ë6·<èR¤“iHý^ÞìñNãNÄü•G|¯ëP„´5âo&Ŷ1€È¸#ßÅ‰Ýæ™÷Œwqï~x*^H–L釷®ûܶ޶!´epÚ›'~5äapkæTg|N†ÐScÜéw=ñmáì ŠQè8%@z|¥¯A7úY7J ¦Wº&BèÁ|Ö 6¹ÑoëRió3Fà¥äh…J3„5IlýMç¢AÜ·{Æä?ž¹šAŽÇöûvý£ ‰èf…¼Ñ¯îVQ«@·ººj:âC…g{ ¢¹X tooÕ‹dìàý½–Gâ[³ÊõxÒŠUð]Ã5ˆ‰\¡/kðA*vК‰@w:½Z’z[#¨ŠqÈG¨¶°–¬jЕVWx]G §Lõ!Ì£qU¿ï®…AÍLv)<­åΉCeÿµöùª× 7:a± Uú¤ÞjQc•Îë|7«¨“Ãéq~uÀFÕ‹*)‰Ín\Â+®ãÇ+×wØ/Âr¯y~ñ¡,}çIY.#Áà¼ßÙh³„G3𔏲¾[›Ž–PFZâ|É÷C<Á"ÛÎ*4ã®Ýê·é¾Ì¯ž#Î;ꣂ”ú6¿ãIä[5âÙ02êÓP‘ÓÛ\¤Ðn‡Ò¨‰ÌQïÉÅŠÇJ`(=ÍÀéQð=§GÁm§G/ÁtzÈvzÈvz¦Ó}wzôtÛNBþNÅ@†¼ÖEšóåtH÷k¸²qÏu <žârÔhðE˜¯:4b°we¼y]ÑÁÙ ~Cº¢ð†¶ÞE»ºVCiø­ÎL£ÎìÇÏ“±9ôEoÃÑ ºt^žQÚÔÄtÏ̶Wñr²ùð\ë3 å&>ÁƬ† a1nô¹̨ŠÑ ;]ÆdðñWþXBp¨ýXÞ@póq. PùÛŒu¾Òâ¶Œ~£i‰YF ÷úAtìÌÞf‡¼yþ»:„è/šB4Èî¢Qf‡ 2;„hÙ!DƒÌ!dv¡íÍ:„hðv‡9=;„ÌA‡!sr®µém~wAêuç" FyJ•eꇢI­Œº&ãÆ›Œ(Üî«uѼÖ=ñùW]XÕ †74~Ï‹±‘³ÇRô¥¨F9³K°¡ËžÙâC‚÷ñEGà’q)Ûƒ¶7ÓcMxo0õeƒb;ö2A#vcÌg…G+Q?ZA懕bXÁÍuU¬ž@¬«P‚¥Qwº€¡󑮊ŽG:×›;”F˜õRFx’$Ìz)¯6O·¡«ð´‚7`é*Ø»~‡kùjÜÉÝ]cÅÁWM 9Ü~¦+'œAãѵ€ƒ P ȧƒ‰=;2¤’œRuÉÈç‰àÀó«)ÕðX%D&ƒJW…ƒçÜÞsÚìA ÍJFp/ì¬Lä…3.ÁVK¯îÖœtg¶œ±t°Ï¬Ï1ÌO„¥èÓøÒY½¸×}1P7=©ÕS«uN´ÕZu“m„G…ŠŽé±UÝŠ6®Æ¿Öá·dÐãlÃ?1–ÔåŘWå§Ð]ÙÛg{« "zfr?è@\ê;ò. '¯¦ 5§QmPäÖÖ>?g8…ÅJªÜ AëGr TôkÑŽ ól6<]«fôt{[ûdBþ˜­‡âÀµŒÈÕÃÓÃͼÑk­è\âÞê~ÂÉ1]Çéz?^¹Ý–ÀèEêxaÔª ÎölND#£qL_FP[.ÌG (ÑâÕsÓ㘎=€ú!¨à[å¼xÿÕî&­á ¢W›}Õ]¬V!áêžÍÑšFÎIƒ°nç$ðC«™3; Ä8ÑZw>ž!ä9×âñM€sjĨC_‹Þ‰£sšŽÂìðñøÆ‡¯db¾¢î@íÉšJ´˜ãV¿ žé£ßŠÆTvÈ&þ“qïTø6®íÓ5h¬hmíP|äŒÉ—ôÔÔï oMC-6¿²1— š˜E 'ÍÇÜ() çæÎEÑJk;œ»wD) [bjGpn*u}Êr¤°AõJKÌ%Wºyf1îÍ…Y½‚÷¯4û‚啿 %:Žøäì4|'g§áfÎNƒÎµzÆïshÐ]…R]ß ¾Pɼ…Ôä6Ý-*ñ Œ4^R 62ïÒe“bòkà–õ€VbÍkøÖÙ‰¥ŽGÕ¾ùªâÐ;†V­ãè «AÊûwkäVƒn´åäy/Æ=àç\ÄáÕHãzRTo“ó–SÞÆ¹Q'Tľ`ªè×r«Ùãúä(­lkýLÿ¢èF, =Š1_E[œhSR'uŸDüOï¼ú4”Ï„:®û¯ú—ÿùëŸþëðý³iMJ ‰·›è¨oðÏ…Ù:6¦ú-u³Ú¹v§Ñ|GƒÞk¥(ì¸7’l6úùšÒš³ï;#‰•ÜR¶/ð;»å82£10©ßjWÅoÄÔßt$9Ôp¬t¬ƒ>Wû>×ð2OA\б[X¿øË¿ÿ딣 ¬Ä⾳塡gh&䤠°ã`|«w‹CëôHð­Þ-U‡¼˜×:ñ•¼'ÛRˆV1ÒÌÙßëÒt1©™^#H”`ãÍ|ØâÑÄ€‚oÐá™"šj¸ªN÷kŒœv¤#‡©3ÞS#ƒm¹4ËÎóf¾«uwÔOr®ŒšÔ¯j¦ˆß˜ô³je ©ià›ëKw<ØãAçÛD«÷É‹–%Áó°¯´X<ý%N”ÓûàgU5dCcƒÑ€Ÿ=…ÇÌ äraøƒýPÏÑXHÕ*|'®¬¤,=ª@ÆŽDêSZâQœñwæ­‡7ùt®K¢mN¸a§”xöñ&;1[p=èFgj¢1»J “o'Ð]…œÍ Š!^sç%Î ŠÑ?è6ßÖ€.sÞ +å½Í¾çºMzÉLï/ºÕhjy~Úø)LŸxÎËIOÙõmˆó3Â3ZtÑÖ ;] bW ÒV9¢HÆ¥úd”0àY!Ïzó¤ÿn)µcÌÿlæï•Т¾ìí~ ëîí~þíïæjlö"íNÈÝæ"#W”ü’ÃÎ]Zc4†àxËH”-D?ß8”sõqΙkÛoïú¸ÒËâßTCX]WÊÚ=ÆœlŒËˆQW÷n{FÐøí㜨fveN)¨GT¯¾øÿ_UßôÈטªoKË0êw´ã!–£@FúO¨„<×5!$©GLh;vF¯“€J tG…á½è“Ñÿ•Ú™×c±ÙF/„Õ©¨‘¾ý^·‡ÀµÏé¾,-ïE6‰I}fF7*4‡B~ÑÍ×rószüÄgä9_èúð)¿U²·þüo›¢0ø±jÇK½×oCÝáÄ T7FReýšn¶üZ¨ïû[Ag…ží›uœÓ¥ØæÄˆëO†—91 F‹s®C9áªB;ÒC±û> jó¬ØQ88¥ ~¥pê¦È$L …¦©ØËP‡À›Mëóq¦QÖ‚çÙ­xCAz®Ì°et"ÑB“A*ðÓËÁœñ>š{âUà”hÙ¡SœsšvC _)…E¬ Ƶò÷¦Õ³ØM0øq5jݰüÌHå<ÖÕƒšƒ|^kŽ5ˆÚ 9‘Ûdf¯ÙooáF÷JJÇܨÌöùP~2_gî«5ßq‰kBãDü÷˜^W‘›ø—±—¸Bß~>¹>ùoÄ[N•O4äüå$˸5ŒqòÇŸq/þÓýþýŸOîOÿSÆý?¢ùW5 endstream endobj 212 0 obj 6395 endobj 216 0 obj <> stream xÚXKo7¾ï¯ØC 4m1áÌðy-l«I 8¶; | ÐE] ½äïw({WE=˜’µçΛëæí÷ÉÍÛ/²8` A>Bôiþ÷«ùéf3ý¶^_¸ý¼ýcÂY3ÎÁÏÉ{È‘çíãôÓƒsî‡WÛ?×ç‘!äl0›u¹¬ËýîÛá¾â€¨˜}7 “Áu0×u9«ËÕ!ÉAIÁÀƒe Oô»q.–øN¼ƒìóøè3Äèc]>(dtà¢UìÂj—ræ¾vnÞÈß×'Gâ¡#‹hAQ´Ùïxx¥ä:‚Œ¥ä2 —¤Ï‚œ+ôÞŠc ¿OˆcNo@Ú*žÁy4 Ë5bÞ(xðŸ8¬ø$2Ð.z@ß?ëY?ö1{ ‚'È%C¼å¾Ö˜Ñ:;‘ “uÙ¹¡$ÌÀÁ壑xƒ¬ò÷TÄe6v¶xgœG>Ï–˜Vç=)»ÚTy€rp³A´Q â!uâC3– dí¹Y=º§KS˜ rÿÐ4R²¨XgÆ,–É!ŒCE|%ûqœrˆr§8L W+zôƒDºPð”Äd}µV¹Þüöp³GXøT˜¼¾ ¦˜yJ:´¿Ô……TIoOýãªäÙª¤ IŸ8ZÃG Jà²=<(T®Qe“áNƒ¢˜ýDZù\9+¡¯‘Þ1êûCPpòÊÿ̸ FÅ@㌫ ùx²¡Ô¥ÀÞ€^–lÈ0‘Ùm“ =I¡AÚdÀ€h5Òu9HÀËÃdš×ÂÜ€²n䉭$}Î$½­$Ýü2BLxB§œ»t?¯©z©Û†˜¨ïžç´lgŒÚ@0Y¿·5†ÈC ~|òÚCˆ£=y§}xéýGb¡Óm"BHVð †2ŽJÒ£³=ïÕºh¸¸‰kú6ðÏTºÄGJ(;i.Že2ÊpÄ’ç (u5³ ¤»ý$¯ûX‚S_ðƒãð4’¾äòqP5bÑUå]•r¾þ‘}o'Éùùû´ É×Ç ïb{ùå¯évº®š}±Yòjd·â*Aˈ`tZÙíb§O¢ÃÏÏGTЄ¢iàq Â ˆ6,A#Nä²"ƒÝqùËó‰×ÂDzÒqÂ@ü hÂ5‘oûdla“ÌLit˜Ðg»X³×²5²…M&Ð@~À¶:·„%îúlìljœÜ]pì{@gL0­8!¨cÙ(Ø÷€ÎÀi q•Àï.ˆ‚  >!Ðâ*A–:6$X/2Q#N¤ƒù2ˆæ=àE&jÄU‚ R0F ÚR½„Ôù±1·£æ ¢4 õЙk-A#N$©!XÞ`<¿*jì—Þ˜C–‡(Â_ÍÅØW• ¶@;'³@6À›ÕZêî0—Ô¢Õ…(P}¥Ñe¾Ô8™"f‘kt2|ê¨A.2$¶é6ôì‡ë'œXÜÍ©Ø9Ô+éœ|ýöŒ;øIA—ýߦûùo‘û]P'„ endstream endobj 217 0 obj 1135 endobj 222 0 obj <> stream xÚ]kodÇqýÎ_A ‚b#Æu¿A€@¹äj‰%g¸äìJ ‚¢X²+g#Ã?UwÈvêîQ>˜²4çö£ºÞ]ÝmÎßýýÌœ¿û‘þ˜Å»é1…|þåÏðŸ¶WgzwöÇWæÜ†ówÿyfÏ qnÏ}:Ï!,%ùówŸÎ~÷Ñ“ÿî¿¿»DjEb>~l@eq0÷üg˾å?/¿Èi‰%Ã'/1%,1ë­¾á?7/ÁÖø%ðW Ȇ%Ä  ¯ ‹‹@ÛäÝbЦÕÅ$̇ââŽéºE·„'Ýźä€$Ø!±‘?Mf˜Ã¢0džÿ<2М_Ñÿþ¼ç)û’§Š9Ï.-)txжF€ì×ôÐüqaíâøÕ»Ä/ÂßóŸ;$¬/K2à-a‰ÞíZê“À%‡· ¸æ{jgœÌbSP;ð—\ý¤¥ìIz±¥ÝÞm›Õ.Fióu òKÉ @ ó8ccpnZ¸5K‰HàïZPQ;¾9°å· ÜgR€~¼h.©MP«Þ‰¨8›‘‚s)/Éc÷†s´>ÕtFçJY²ÂÛ¸Jó.¸æ¯€êÞPs ÕÞ÷¤2©_}hA¤èls¬'½šó¬;OöÊdcoZd\Ó=™¯ZQ(7 *>RºÆYÆýñ•U´œ©ð¿ýòéÓŸÿc•±–óTI‰whø«VÉÕÅä \4ë YȻߋï¤up»Ø¾Q´#1\5 ¾iGTãb|P+†ìeÅÞßµ ²xRWôþ0ÄÛƒÀ7:ɹ²„Œ¶Òã-y)8„k • ÄÙž°ä'ÐÜÓo_ WÓR,vq”ü‡VÀÜj$ü¢‘-SV¸åsç–R‘TBTÉ¡+8º¡0¤œ`†¿þíן¾Üþí×¾@$·XguÜ&rþ€Zö4™¤»è{4Τ ")Z‰¼êøÞ/†YEÀïøº·y…mFÒ¥ ÕJ!‡§Ä(ŠDê=ŽøãºMí%²óelVHá‘ú´cî äòæ'LY+Z«¯Ñ'‘"S…/¡ãH!ùAz“Gï U/´Í§hkíÞì ø­®P,Á"Ûaÿ®µ°qÕãsL“Ý¢¹ Ìþ‘Ž(9y6ªêbÞ«z/óˆ.!è ”ã^K¤7‰Š‡ßØÂq˜€HÁ'lè¤ðêEhá,«GÀô|hZ·°óÖ\q„a°Í·2…UB}Y—ÜdÍ]dW·LæIѬ‹y2ò÷jY€.Ñ¿ {á<®TëÓçºÔ<Á Cš ž€”‘¢írS@ë<.÷8°5G½qùöñõööíã7Û®— gÌûa-9¢dbm^Íšs5„Fïå'[‚&C|-óDT Š‹t$Z H´¥ðSΣŤUæƒÌLGø Ꙛ©±4¤‚3äšÅ¨÷Ng¿†£)8G‘\šAðmN“ÓÑ>ë´o…0KzhìFŠ|)0ÍÖ'ì @;—ºyátµGR|46·’ȃsC.c‘®6Ž×‰â-ƒBð óhÖ¤!zc5Fý¾Å°s’TÊßµ~½¥¨ €÷:Å8IRìQ Õ¼Ñ׌õî›w׸$QÈ,¶Þ·¤Âb"å@B}€¬ãú§ÉHŒür wt5;ή#ü+þcöý4­“S¾„ªÚQ`êQ OÒâ]A ®!h "RבÔê5Zâ¤ÐæA¦ëÒHדۜ& ‘TÕ„ôI'MšÖz¦’‚#T2û·­Â4K0HáØPEzi<GR•fëชAY‡Ýa 2çaRÖyPÙS Uö gÝ(> iÙõqeAÑæVÓòåO_¾|þ¥£=H \Å ´;{ì7Ư·[‰”ÅæÚ¬H {}(›kó 4-u¬’§€À&¯0ë ›9•ì˼4 3-ÑEÀ4½’C’Yõ Ìž9u¿Ð™ªª>¨>²ôî0Ô‡Žã”\ Õo±½åÀdù<§Q ®V«ïB]|ðãu÷‘hâX¨|¤˜%O8ÈÓŠ—'c"͹Æ!rŠ-ÈÃÆ±6ð…-fì s{fŸy”ð6 khµ³ÓÙµVpeñi¢F‚'F55¸ÈËÍÔHàDJ_ø^r{ºš|­Z €i‡YœˆÜGÌô›ÄÜ :”25*Ó7*y…HŠt¹ìL"_Ë?.• ›dcZ÷6ä7"ßèhµ±÷G™” {¿ϼ8m¥gž(:O–î€×r¼¯S¥Ý6·ÏyœÁ=†ÈdW¼µ€|…/ÖVídB2)Ì¢Lƒ´cÎqÒ\´KQVê;™}( }·2ßX)ºO‘\ŸpLW2Õh'­®DtV‰ «Õ—G©Ý!W£X® YfÇõQCÎæN 9›7sÂш€îpÈö~øßŸ¾¼þü×AåN Yåj5½|ÚDb¤  ­Ü/)[Rë¦PÂÙª _÷*ßrâôÈx@œ*8ên¥l^K$\ø˜äo°V•m¶ Î~æZÖÚXò"$ëœ8Y™¢LãB©%³Lñ“üFÖÀV²¡qLEãZQ*AmB íë@Çdá”R¬³A‘ß™+.í=’Ͳ2ü£TDE*|=€¿Ù¾þæO7—}¡à ;ÎûKÌÀ ä)áüF ï$H ï$H ï$èEq\§§Fú #dZdõ5š Go ‡y«û,¡YD?È ><¤¤g‚]÷¿†4bóÇå¤ÔÑ‘K”æN¨ e Á.dŽÎ>¼0^w6Qä€èý±ÌHš˜¤°¼R¤MdÕè°•IrÞŸžoÃ-C\WçÓea°qÒ# ƒ"e"¡E=š4i‰œÍÕUÓHñFÉU™¥º2é¸pY+`ZW òù#äWQ±C<ârS6[j,JÜNÖÙp)p=줮ù\§Ð6PHîé’6D#)U8Er±¹¬ƒ5A#rYª¢vä97²èn¢iGwÊÒ´uK•ÓÖnÌÑp˜ë“´-Ë'«yña[^BއaÒ Ðžás™=cW6=<…XùJ.Þù•ÈØµÑŽ ¹øæƒ<÷d˜[µ!Üv*KI¢8U#¿z¾¾Xš"~wíÏ¿ûñ—Ï¿þåóß~øõ/¿|–ùËÔ`üù‡/?üøëO_>þ¾ëoxâX²‡çI$è²³ŽœP¥Í·‡­è=®Euò›Gd’ÇD¾µD’êöüÏ}ú— óÃÐÉoPr-iKãÙ­p«c)á×ò<𳨦b…y¼ ½•x!Q“ vGÜc[3n2 êV¤WZƒ%ÆN†Häv5M†HÖ+œì«C¢ýJÙ|'{ú‹eÉž4MJHá‚p” ˜72ß[rS”Oˆƒ"· ².LZb6W8K9x— ±,6×~¥p ŸkÄÕ$rÅ’"ã‚dΆrnf('lC±câ…µ’0T7ÇF¡e/ýL‘¹7TΞ¤±DV&ê†WÉÓ\|Ä•ü®­?õjǃ«¼F)ž,Þ|à™7Àå7[y¦ÝlX¤m÷.¶Ä›ËDùü´üF9SÅj(ôZ—»~É@n¤ÑôÌU¤v¯<­Èo•Rò·j“’)‡ô~/3¸½忍Pª,H×y‡è†¼¯opXJÁËd®¤ÒH¶&sMûˆK‚Ú”væªÝl¼.õ fL8<ƒ‰3h#EÞ0ve2¸õh NóB†Í¹Úߤy¸üÌ(Ó¸Tö%©õ„œ~}`ã·mØÖŒv+.p®(â Û L(Î‰Š†ê\7‡é5µÆ®ÖŽyl=áp*Z3ÖÒå!?¾_ÂϺãô¦²$¨C²KpcÞ)« ªí2§584-TºÆ‚à×qðœKÕ%éÈŒ»ÖfÛ%¹Në-’üzmBíq›«ÔGiÓ«b+; Ûôèú2j O;Hº<…ìu¯¦‘+;DÙZdbu—±Ókyγz;¾g—=#hàæð)Þ+ßÀ)”â*€Z¿%…E¡Ê­âX8ÆHep¥¬§Ô6{q–‰ÀÙ1Íy+§æ<žµ³uMî gÍ^9éyk«Ñ7“w\Ž‚í~/³Öœ,‘  ÅðçµâOåY¥Ä¼ºÅú ãºZ×; †Dô«° Ü‰ÛMâ>è–ó—¬A·6…qrÊX"o”t6Ån"V\‡T*2 VOpñ%‹V‡xqðv¡n2+­K+Ë©æ¨0ÄP˳=.n¢ÅÂZj?ü@rR”NßËÓ˜EÑr­Eqœ¡“–È‘ Æ—ƒËˆë¸á|“üÂÎ’´ÆÑímɈ禚1 ›YmIʼnN `j˜tWù²Š|‚€G¾„ÃæSœ-!ùD'Ç—Ž68øæµ´Q1mI»·{/X€Ä­ny±l†è®M|’væ• Ýè3r•ù˜Šü/°œU¨cáó ŠJ:9/t¯ƒ×ÀšsD^“ÃuÚÈ«=l Âà•ìZÖ½&‹ M{NàAî°æb' “ –\K¥”CpÑRHDÏ…”Jt:òŽ‚2Ä6ÛÉ#;f^²ÙëÅHÃÉR,²«0/šFN($ì󃼉ËÖ ùG¾LåXôî¹ÒÕœÇhŸÁg®°Ïð î3x¾­ Å¡µeä¶;lì^%(®HQ%l!iPhÕ*gç×s†å,­ ]ÆÖ*µ<ðEaEüNÞ-°f´räìÞa›É5gq³"%›vGÝo¾ äñü8–3QÑ?P®»¦[DþSš(ÞµèežŠy$¦_Ì#‘Êñx÷i äõqowF361|šÀ]5 å*BLÁK •ò#>,f¸ÌjÀ~wÒ8ñµkôªS‡Ê‡n=ÒìR9ÙENDÁÞàøW°úÜ·ÙªÜ:«®³v¢d‡÷â8pn¬ðùbHù #˜¬íRZ­ñF¿Í‚U?Ÿ>¡w¾mK¡¬(C!©*ÜÝN9Æ%)Ëy¼¸õR aÈ àд°l²2ù­L9òM,ñC²³Ú!£ª‘sŒûý@IEÔeÌB/!ÿ.çÙ_þžZÅÖì ]·¡âƒ¼…„s&òe#žƒ_òœ õÖy& M‚Zo™D‘JÐré®_¯<÷÷GD%èN¹/7’‰ÎzÇYuÀÕw@Y%ì ÎãV¸˜ìŠDï0„ë¬äpÂJþgð Îàf  7òÂ1®–)¸õæ -U Hå’3¾HÙä1ñù‚ª,ç³\vmºzg:—CóÅs“ÿÄ|ãŸäµ²M?Š«Û¶âà)‹§øƒŸÊÑd`'Ñc×+ °ÝGóŽ¥ý‹¼-;x 6ˆÄ §ÁÇyøªb‰üZ&mm)“>ù ¨ºëÜéÁžöÛºvîD‚v§]€Î5?/y„¯Ãb!Àkéj^iêðÏzÍi¶WHïÊšª“È ¾» Ç2øä‡ÉÛ§êRŽq+o7WZRæ‘ËzúS"Úå4Ûì±)Z.lÊË|¾–W‚v¨ŠˆÞù”aîo$ƒz+÷°a¸ªÀ§·Ù»>L°ÝצÖÉrñ^9_³ ¿é\ÕÏ^©5n½Sn?$WÊçñŠxbÔˆ˜¬æâpøT&¾Ù#È1ÿÜfÞóX„}NëÉ.UÒdB¾(Ët Žª"Êþ´Ù_ÎÖgø%GAlÊîň~MEĆ1à a_W:nŽR+²±•5Ý5 CéÀ—'»Ð+y—WØCËzAiBq¾æÆX7§ERÂNàÙŠœ& Î*Ýme±V vÒ’gOA2£^9iÏkQ0•ýdHlåbÕyn£ì 'òÅn—竲ßÇæV)ûð¿U®ˆ` édz_¯óõQ—ÎYÍÛCËA˜Î£â’Ù»#ªó]I‘­,øÊ5Ž9íbQ”^°žeR¸O³{Yíx+Óö©âŽ€‚þïÑ<‹=PèXöC=ó{qäqô{>”sZÿpp’îõþDëÔßZßýEÝA;VnÜé]ЍKŠÂm¶¢ËçLÊó …À2ÙbéžKæ§‚ôñÀŸR_ÂO+˜ßôî}ð\öÞ{Œ.Ú…LÀ{|fÿÇ|·YP¸#–»w±F}ZÇ]eÛ¯ò{x>Ä›ãb2Ò­w&_ÕŠ´<”våey1>J ‰ »$²—õáóÙ1ŒW€‹?øÜpÖËk­²ò–Àà[ë€ä9>Ó>ñKE€ÙÊ«h¬ÂòßÂ.A¯áž€'ÝñR9é2¢ø©´ô~JU>àÏ{Qãž9©PãAúżc.AS×ó³hÊäÅ1~Š\íÈ©¼<-•8žÑþìò„}ƒåƒ€n¼t| ‚/,wÇQ™°\ðûÚ% R|]~F½âëÆ´^]:¿î¤èÀÒkæÓÃCùãÍT¬®Dൌ¬¬R»\PkËX¬^³¯EÈ×ÃQ`5&D4uQ8ø}ësõ‚Þà³\V꘬|-ª±uLV6챜æ]K`ï½'³FG•Ç:œÞf¯º†_›4 ¾}FNÕZø¦ç,d·VåIxÏY¨ûarš\yµ|«Õý?vI“Ø%åÈÄÅÔÞ#~ # AÍÔ˜D_´ëÑ[ZM>!¿îzpiͯÀÐä[¾†-ƒ}ŸXÀ$¨·b)öV8rÇÎ`Çß!©K¤—›ÿ!â¸n[ƒÅObµ¥ ÃíL~8®[·ÏYB”SPu­…‘@ÏØq<&@_É}ÎÊ¡Œ%;çX&ÝñØP•=y2Ö€¼?‰´/ŸºHQTWŽ(c¿Ñ¾¯‚ïk—pù(g…9ï:ýÈ£C5âØ]ç¾5~½Í!Slô½ðõÎó”þyì‡Ëç$èƒtƒùŠP º–çu97*A";ìÕ%Tn¹2K¨Ø§ðsiíCŠÀ£Æé@,á]cç5œ…cF*,€SÓÇçDzwËîw.óö…ÓiÒ‰"× Rgu6W^µc! vÌ ®g¬†¬ÀiélæóæSK!ç±¶ä¤4ßä<×—\çíÝÉ2˜êõd™c¯6û‰Ì­%Ü9¨Íž¿w¢GüÊþÝ9 Â=0v}­")¯”£ºDïu$&ØŽ3)®û²8 Ä'ùøõá Û[¶ìþFL ÚO¨ÆzÕ»™ïÁ.Є8Ë[ã`äAÙÕñ QJe(<´ºƒüó°u/]2ëùÞ3Žì‰:ÑãÁ'2æò±S¾ð¸ZŽ<öè±¥k¨¨æÇLùA*‰|Ôë*\Në&54,o¶à·$èÈ&½ÇC _Sõa_ÁåÀ©pÜÙÿm þ’Uq¹%ïŒ÷z?üî‘¡qÑïðÕdýÆŸ~>©í¦)n:¯WüöÛ~úÝ«›ÛV˜•îšæ©?~|Œ¢¬nÏ¿+æLÙç8ôÓ6Kýð»µf0¯çß=–ù`ëmcÜz]ëú­?ýÞ¡Z§—¦Qê…ÓÉ®ÏÒ‡ß/[oã].3¬ÄóïoPzŽ̦mþÓÙZ7Ù—çŸOaâ¶)jšÜìúS9üîO³Çz¯m/Ô-iÞ¿nºÛZUÖ“¡¥5>r„÷OmÖî µkÎsuÔ\ä+q\û/†þïÏO¸ÿ©>ÿóÙîü3µû—›ÂL endstream endobj 223 0 obj 6857 endobj 231 0 obj <> stream xÚ¥}]—]Çmå;Ï$‘®êû#Ë/Éên6¥Îl²»IFkeÉŠl+CK+3ÎÏìºd7 §Î¥üŽmî{ª @(€r_ÿõ‘{üú{ùã1ä,ÿ/—Tÿåô?]?}ô/¯}uáûòøõïùÇ‚xìçô¸¦xˆ)=~ý§Gÿó[çÜßýýëÿ¼ÿ÷½v¼ÁŸ+üyŽ?OïÿëKüùúÓ/xŸ.ó'îðçü¹œà 3ŽøóŠáÕj¯óøGü‰¼wñd¾ø\;¸– T&/s=aB>Ô’lêÝLÈØÍ5B^Ü/Ø=~*ÿ÷‡# ý§,ìò3¨¤xÿ³:­Ù 3a Òûzh2¸F^ãÏþü þÜjvùœ7~3!s8× ùj‰¼Ec ¯îEmÐîküùÖ÷ w3—ë!“:»—Œ§3+û!EtCBC,‡^˜èÛáúÃôò=Íff—tñ±?p>Ø>Ák;¤þ|µtˆ¹þ„‹B‰l,íŒÖC?„ 9Q*ŠTGžÓ¹¡Aî¦ßÙÔ™ t>ƒ ­„ùöÛ TË¡:þÒSžkk‡bÈ̳ Ôý!5Ïô™Aõ û˜@oìÅ&ïÝž ë‰ê!t[rXõ¦$úÇ`À†`§…§¼º Õ›DäjbŠm¨Þìâ¡4žÌ3¨J'‰Ì´‡¡}`Ñ¿™5a•)DB^Ϫöd!|V€¡z/; ¾2Hv¢Ÿq]Tu ܬÏS}`¬bÖ¶éàƒ,õNžçþlõƒ7„d¶×²_bàÎÚ[ìXlýäe™ÝŽ …êdŸòÒçÕ~h¡Ûb¾Ôð4^—¬åhˆ£¯³’—7†<»—¤‰1ÁÓ;™áQl}îa-s±ˆcÊZ5ïð(:©õdïp†'ç-2üjÅCnÁ¦‚Rå²"—×|LÁ‹ÄŸ» qLQ·Ââø’¤;%È¡ì¬CôF¨¼Ø¯7LMUœÒÎb„=5ùõÞKâ£çÎbôüžŠ³ÕêNÜ#o«.ž§\èÉ𠛘ãÉB**£ô¾Ã(ÕU2!™Qp±{H„¼šMŠ;qø4hƒQ^ôŸ““†ŸÝ/kþz÷¤‚+ó!ª¾+šF”sa »[ƒ É3ܲ»M4ãÁg‹Õ…•—q{Td1k.¶™ßÿcÃ~ Ÿ ¡›/Gƒ¶ aÄQ±|ë,¦;vB/OaÃÍõ¿Ñ´ÅyM#çSX¥Ë3ø¼³Dˆéà9oÅ>2í« ¯N¸^KE<”ŸùòËÿøñ—ï~÷þ‡/þîßùù»?fŒKvb¬ÃÉ\Wp›ë ´ÇußáºBŸ|¨ôMÌJlöøPé{†RÃçC¥®ò¤>Wä¼Üm²ý 9ˆùþ3rðãûŸÃ¿ÿåÇß}ÿ~[„}>ø‡0+=/3„fTÈ#Çf -ÄÎmiˆΖà§3·äCwÕþ€ÁÜæúVÁŸÏ |ÈgÚ ’8çâ ¾RK!ˆ²!33{ÞBÐÀ¤5{Þâ­¦ú¯ð€LLKô©ÙÓïrN<ýKüy=¹âƒÏïÙK/Fúðì|ãÜ2Æ(<ðvåòKwÈ1"|Ì{ ^yó°?ÿù‡Ÿ~ùåý—ÿñÃÿûáý19~«wYÊâèTU"µ>‰«ÐgB¾ÿñwÿý§÷awtìq'î™㌷‡ª|\¡ÿ—öÁ²œ;æì^ÀhƒÓ0£U¤´JóæçÍž‹h¸¢—Z!¤5fCÚ="ˆ‰s§í‡œJ¬Ù=0p†Z¨G_Íšˆ²¶J¨x¹x²ŽHt£uJ$Ns<%2…æo%Ð%/é2èâ×ó.",0û‘‹†xñe¸°ofM燸°ýçèãû­¤1Ês®™C?Ój(xâÛC0óùñÍ#b Ð*(›ä€—hl ‹rPq¨ãˆüG•ÕÖë÷‘¹8+Ï*êžEKaÄmòi¹7£ì¤w¦Ó ‚h¨U,ö×S¿!Sš„³­­¹Ÿd£•M½äC~JÇãíŒ~9G â!gS«€xy½-S‘-κHÅÂÑ„.¶eµ˜YóX¬h¬¶¶±þâ» #»¯ÄbjDö$Åh‰æ˜–°qÑéËA\66”½ð6…ðö~Ã~tžw¯²I‚þå[}‹çhê$SÇ‹Â<סhÌåPE´sðë±*¢UcTôA”§¯&AæÈ.4< 8ŸºÃ­“æÂlè-¢‘=~TsŽ9i6¢ZR4~öÙmu[qlË…Æ&èóù$ño÷òÿQZòlŠü¡·fLsC¨¢(.×–œŽrðêkFGÿ\ÖB…pµ¸ ë¡pÖvÆBÜ5®…*âÒ¡ž T1‰¤×µPÅÔu)S1C©[2•g+—‡µ-C³…•ÝÓ]؆«¯ËþH¡ð2ßÊáýOæ—ôç‹ÃäÅüļdG’î 5[·ë²Ñ -äŃæŸM[=DßMÍû”Mk…%ôêÔ–ºøb‰¹ö­¾> ..å·§"¼óf6Oís0­Î9MMÎi²¥ª©`ØÇ‡1«Í^ö¥>å˜4ú¹MX´ž ­N`A¶K¹BSœ-`}FŸyKtßÖÓwHv—ÆÐ9¯{Âv©¤á«+àl—ª;xè¬3Çëëñ†u“GLzØ2ÏŒâj^}ûL§Lõè—Ä ù\‘¾3Ÿ¢ÎôÕníôÙ°,Œ îZúçä8¿"8îuq=¶âpÅð„f̼±ÃøÇ5w‘ÝÓ;q×È#ÃA‘i±që½b ¬†OiˆÁ9©ØO—ͯΦ1ÖCbò\“ùŒy)×0ŸŽ­ ´S™Ô˜•&§ ºË Góå>ùÉõù?Ÿý빃ö—ÍAðŒýâ¤1WW ²`9Zà—ÚiÊ¡ø”3B:ËŒÞÈ1ÞDtÛHBÄÅ5šÉœ~‰Ô¨€3«›ŒÌ2õZ§ÙeG´|cnS$Ø) V¯A°KŸnDyEwÆNŸ½¤x䨆ž&zG1¾\/’÷º'ŒJÛ“ÏùUxF¶/° d$[ˆ±Œ~gR gpqöÉÅX:fÔ¬+²œtr0I©=5¬¥QœÔhâ/xö²q\)k’v‘ž@³Ÿ]HÑ-9øýÙÃ×Ía- ðuéSÊ@Î.©ø=™qv‰…—•g¨bS§âù.?ñm]õþS‡¯¾ÿù§ßÿø‡ÿû—´À­|lõ§ïþ÷›üIèƒXàR[h©-4hëZ- ß1\^tãÙÙ(Ð;Èã§oneôC3fü†. #OáÕ=¯Œ3·è%—3ýƺõ \ÔÈMQôRßtøYÕð/ô6ïsÖ¦RrëÈs×ðÆ•˜r/uDÔÅhs˜£°ÑcE,5* «Ü6q›}µ‡¸ÑgªZ™^Wú.žñìH%Qa‰Çœ=)$õ¢Lb9u{ñk4î­.û@œg=-ä1ïf"Ôã­¹çÛÍŠ;F^å·<²!wPcë^먧¯g¹aq׃ìË>o¨ ·ómŸH\ kº"ÙØÕ¾&lŠy¤ÚÓ nxYëF\VƒáF¢6ÎÅÆ¦™œKõÝwˆQån0àjNràü ×¶Þs)ª dŠqØÙˆy”ZõµÊÂçwlQ޹·á²žÒZ`n›;ÉB}õjø3Z¡ßèZ—ã$ñh5hÃ]òB‘€M«àïfsÍ·jYQ˜Vx1FJ¸x‰ŠE!7Ý¥¥§ñÿøø@üé—ÿúîý‡l¨SŠÍÊ_lçì&÷›©ò7‹#Ù 3­²¦ƒ÷‘0œ÷Þp{8m_9æÌne½ÃŒv{‹sÕ3™à›ç9TñdÂý×ÏçäÇëÔ]£_?Õ'!WôDW$9¨Qý¥{1zXï•™åhPôÎËþKL#ÃÐ{!LZ‹E ndÒhÐÍn!3bÍ?~;ûðbJ%Õb”^ôFë›êôB{îƒAË/áÞ b¨@|ñ§Lèê©»½/¥:²@4èRçh´äw†Ãré;«+¢r :½Ò9>ópªî Íîr8‘W­×$»T Š_Zuþt£Sš­áÎæÜºkJ?ÌÙÌ(FÅNYq!ˆ“°¦ù“à—ç7£EæÉT:M!ÚÜ*s멎%ƒ|OtØ×ô¥“Ø(oÑ^ô Uƒ»`óòŽJÂC^k‘Ød å´–ŸØpg*Éág¤êö>¯©•\Í/Œ/¦Ùí—³™cÕôŒ»_/4!†ÖëGƒÆ K;½:¥~ûIðof×i„1²?ªø!†Zü»9a€CépÅ‘¨¤XfrÕ¤r/àkTš]„åÛÎ~ÏâûJùûÙTº/´ŽÃOþý‚â]J(ÐÇ<­ßh_*×D`¾kGáKÌŒ¤¸XÁ[‚FI<¯‚òêQŸ«A/y½"t¨È1—p­ nÛhv~&ŠW!üËyŠ—/§O­S+¼¸L%•€P@¨„š’GЇ£3+P¤Aï´y ü¡3ú‰ 0•q«£Öp$;"úæ.ˆ¹«RÕHЍ­[{aÎHsi¤FiÜÉrÇäd 2êÛélLð0ÛÇ8’E5è‰N‚hÆ ƒ‰*ÂÀ|1âùrÂ)Æ7_1²4ÒõitmUÑCƒ6No±‡QjG»Š¼ŒäpIPm‘T÷¢"I¹/6¡ x¡‹Ð³ E?·±.ôݨµ ŠwõÖ²ž "¼!(ÖCØQH’GWå–G„Â"ðFÂzêùxG¢I2›Õ$®!‹¾a¥ý‡ÈÀŠ °šÑØþgÚlêt£ëNŽ}Üï.Uf–Ó·÷}mȲ(°äüÚ@䜱áSŦ#†L»ñÌÎKõ£P¥ßlÄ}’3¯ø'þмxÝÉ3òVGHŠœDw@Ø’<Åw:?¿yO k}~ì<¥}g…| zªÖâôNÕàÈ;*ý Aß~Dîc2æv¡M4"œô¹9n„àŠñ¥ ClEæÓ¹q-&-Ì,•ÙÐÎfÉ« #Wžá›²Ñ(1ïð÷ÚÉØºŒ=É4h«ÿŒìŸdPæN÷9ëÝÛ›ìk]{[ Á2N b¤«±qïôY4æ'Ž,ÕB6¨qËÎèbŸ‘k°ä‰h=œáN$7Ž£©{šgÆ¡3œÁÙ9@÷ÁÖ›4!-t›’7:Ó¿Gf!uI‹¾ dö&QÅÆL©³}N#ùgMeÑ|±÷µ¢M£’ÔïÌ\T_ŒÕfØ}vFÙŠÙ*»C3ôŵ¶ïݶº+e­sh#î·-?/m÷J™Áþä² hѰÈÃüÕïèŠ'ó¢(C«ßÞèó%zia»Ñ³ 2ò–úcÊf ÂùA z§›¶!»Eƒ®ueÛðVKĉL纡ªµ:JECÄÊíˆN"â1jÐ¥Žâ¢—=Ó¹h(ZØù’ø‰i‡Ñ!‹;ìyw|®;D/è9R÷Dÿ«‹ naBCêOCsó‰%d74£ŠVvú‡E—’gƒ^\KŽf›KQéB^SåæÖ»Ô©ÊÁ ê ªÂ3Äá´Ø;ÅÅïl„4"><Ù'ú@Œ¢AúÒI±÷”IB¦)³)B›‚­þîtõw2¶Ü5·‹Kë‚Úî’™Jm¶Š(=MkáéȆòV¦S¾ÂzN(ѳ†û‡‡$àÙ ¹ÑÇÓdÏ¥æ˜qÝhìí|àxºÎ'Wq?2ƒÌ.xêí‹;ÜÌbƒ)Э¤L°ÏJ$Ð 5g1†[]Ü!ÓcP[¯ƒ¹¸ç-òŠïtÂwƒÔ(Uó …]Ó¹¶ׂ²sšÒ†ÓÓ¨>ÔðÏìÛ%Z:·¼žý¨@÷<” £+g?uú¡„CŠÌª02å@XyvOt†uÎ@/æó§‰õK ¢Rèk GÅ,%õð5ò—8¹=ZŠÁ€·:ÊŒZÅå®%=>ØæÔ«Ø>„&otuÍ0`Ö`wº <ÇýœRvöGD7Hƒ‡¥û¹Q’ƒ¨vY÷±h2¹$.jvPQªAÏç{V7šP,—ж,Õ˜“:ÇñT}i£á ŠvúŽBMY\áN`YBïú¾£c‰’¨õ˜(Ž-ŸÃ±‡޵6Š,×iàšcå{†ÁàäT„}äm¥ïQ5¾œ=îÑ@˜¾´—œš“3wç­¶÷µV‹äºò*"…h/KƒÌ<, 2ó°4ÈÌÃZéC–™yXdæaiЙ]\‡*~d¯‰®G½ï,A,rä×K@é¢cŠ]êF6ÙXBБ‚œ˜³ÅEü^z¦£à±ñįŒC>ÊOӚ߈‚wC(Þé(¸ó\º¡ö¾­)ö±PLƒæÞî\ÞùR†çí t£=dè«ùÞ@Ìny-^Hör…É:;a-‹Ác´üŒ°ãüŒC:vµpEGîqõeà"UA¿^)ÔPÅ2HZd™Ýè.‚8ð+®Æäc90ÎS=lRîoÈÔF>ÊCfcGFo=†“Ô Á¿Ð?@Ï`V¬¢&`+Ã"—Ùg´É*º  Ù9ëáj8ЍÎx煮&섌ZÉ!ÉZƒN?)%Ùž~ÿÝw$3¡¦">D›Ït×\™-Wtü)<æVR†Ð¡g¦ÃF#ù=ƒëjEQôtë<Ï—´q2ƒ¾ýû9ö& ¢2×UsŒe~ytu;ò¡ˆÆØeeøéî×$×zä€+n‘\ëGó â‰Þ8ô¸_“[‹ºÍR™$Fu€ÃÍK%¤‘Ó†6\€×º´&^þ6ïæÝZ‹ÑêÚV¸÷Åú`Òøäx­ýJ9Þj¸Ó²‘ÀÐyE§¥°¡µÞ3}© @]eb¼Ô;ÐÈ„æ®[w õŽ9æõü"Çs£ ª’e󙾊!®å%Žô€°–—cvu9•ˆŒ[ß¼¤Ôh×Ö”LÑP̯ŒÃ{-×£-1OÎÈ%1Î3î3s£žfbj•SGÆ…[fF%ÂlVE‘åhWVÒ†Þu9î°$û|ðÍØs\½ŒÒS šo“£“Ü }`äGg$»”³£³èC`fb C3û5H,ÜëE(]¿(Z š™ƒ€»è³O‰Û#7Ÿ‰= ý”UD ›0t–ïˆBK¢\#᪮髎Aöãh¤áבӢ»; O¦ã‡ó›¡Nl@Î;lú¹dNÒ)ú5Ût†kð%ÛpÜ.%®ùвóœ.ô#¦.‹¹¼§F'°ÊÃýýr¯•­éQŽÁ“Ðx×fÁyokÁýöigkÁýNagkáXŽÈõšG#¾fQ}8´‘ˆ{ƒP’½yÎô9°¤½Õ×ð{‹@›>t¡Ó kÝç+K}ÉŸ«Ã¡[­–C08®Ê¸âÐÈK6Áq†Z~§o!¼!;×ú99tç]rtmùx‰Ì¹nÛnò-ÌŽÚ˹/ÊKŠí$½Ó±}´ Yœ½ÂK˹Æ9îìôoƒ”ãx§AOØ”†4ÊØ3&°õÞ°–_p¢9ò «! ›×â£CÌg ±€È}Ñ?,º8 ¹/¤ì{l#÷E£nõ½7r_4Hżoèi2¢~ä¾hÐ zÀ¹3Èxs AcüºÂÙ0+ÍH'¾šƒ4Ú¡]|]ýkUö$ÖÛàæF œÑñÔÏôÃ!hCÜQ] 6ÚÔâ9¯Æ¼ Ú,Tƒ·OÌ<.‰}H,ÙÑ¢trcF¾Ô)ÔÎ î•e5¤þÊÌÕ£KD[|Ê0Ÿp» þÜœA÷ ­=b”9Õ£w ouñ0z!/wÒXýƒñ>iØf°J8FÇ?ƒÁ¬æŽ¶¢ž* 8´¢†û³u^í5­u’ ‹1m]ÊÔGcà ±¯kU‡œ0ܱ/™“ºøR.¬U¬Y6$õÊ( ŽæÖcU7jKþ•º¬,²u½;f±iÐÕÖ+wP/િlzÙ8âI• %‚ Aß øÄób…ãQ¤¬…ñÆ’)h‰çȆ»až¥ê¶Œrù²³Zœ}æ/™<½ëëÏìé–ôLgO£ðÄÅââ‰7þB[94Y6EêVßyç¸,RVqÝY Ú]èú¢Ú»½uâÆÍŽF¾ÕÍÕñP§]êæ›ÝáÍ&ÇKÅI*`ä .y…©ŸÌ>¤*£Ù—†ßhZò ÜCK½`è—¢­c¨k}¡ÈSYrØÊÕb~+ áÄØû„Íä±pQã~«é†°ªt-ä=°6x£›/'CeÜrem*#áz=fÂ0žØ»½0NkÙ—)"} SÔeÂјJÑê‡t²ÔãÂi­²?æj-5 „‹Aä;#é:7D—÷ÐLb¹ÖŒÓWÎk‹•ѱ×õ±­ò*×X¼À ›WiÄHBK :í~ -£P†MóØ°ƒ"V®ó`»!ÞÁý‡þaÑ=/bb ÁÀu&Ô-=ª—pE_tÁŽ=H…Iñn|gú꺣qÏë ;˜Öáž(\ÕUEhÛ©A†¥Fo(C@žèûJƒ¨:©z¨ K ®tÊQeâ¿ÕgØÜvÈŠÈfe©s.R¸úz}¨þ­†LnÅ?á’"þ©àçFܲŽ{À¥ !9ÁÀÌáÁ,Nšc†§eÜþ—5¯FBv«âÁI?>ž¼T"±¯Î–lEÙo6fw©ÛvàÙP ºÑ™Ó¡¦õîD¯«–×óFât ¼Üx,õ‘‚gêKuŠ­Ç0ãiº‡ÐÖ5GÍÝérÝT˜cÊS:ׯ{¹wT'nH‡«´Útè(Û³_o:˜®ö ƒ4èvÕªSŽ)P{ê'[¦0\ü¤E¶(Ž­ò\/‰€ÈÔ­G7j~å‚Lš§®ÛA XŸ*KìR%Àeô@Ñ gº"²ç4èlãô2* §êÝÔãzvx#Â|>×QÖq’U e×á0'þÔ‹­þxTŒ¥pÑc/8ŒˆÓz !½R¯/W(‡~² ã Ø A~By¨™¥àBwnÇ““æÀWÚjUc«çyʨñ^Êpí‚™k:IEÞ2f8S„}´ ÐàÒRÆ¢ I¥õµ`G¤yå-å¡ß Œ-®iŒwSØ£a\]X« ä? ùãrO¤ÐMÁ¼N—ÓZtÑÌÕ5&†J’ÈÃÉÒ kÝóo€/¹8ºÖå.&9a·ÃEtz Æfßÿ¤&'ËfmjÚ.§ä-æ}ª,^s5¶ûVnF@—[þìçù/0Í­œjšÒ6Í Ä“‘è<Î|‚ éLä7fþ;¢;~«‹»“çżÓ}ádKèʰò¨XâÏ]è²=fÎå¬HæKRMÖóÈÑ ·³Åv#ðFœÐ§`—˜û7ºÎ3=7<'$`ôÆ`>å·P<”\mŠ¿¤ç-¯¥‡_Wüš#EÂ×´c&I„ Ý—×nÞ@…CI;ÒˆÃm)[ÒH’„L~ô ;q×  Zäk¸m{}h;“­¢ÿÉ>¡Š®Þ×»÷KxRÖ¦çl{ãèØ·ÜQYôÚXв"ÐèZƒ‚NxÀ›T´Ä^]h ¹×ÓBcìp^K‰›á¼.öß ç5¼+¤Ñ_è–(ý£h]û„ †¯ºh=f, èG B<š̃_â ù™Ážp3ñ*ÑgÓ•š(ýøô‡¿ú῾ÿêÃÝ<ç×tÕpºó§¤ÿêC@ç¯íG´^ß'?»w"¹»®û2dHÁ '±Ö‘M£‘wÚgêð™èZçå Ù·ÝP¸$ñ—Ô•fOãõGBéìQçža¿Õ9´èÙ³œûˆ­¦½W"ië½Jz±á׺^.ž†fBéH  j”'‡¥ÂÝRLíøD1‰Š~?Ùô¹ÖÏ× ƒ›¹ŒKýt\ß'ä ¡9ÔRœF7 ÀyaÔŒÔÑ·aý99x·\×´ÀuEM¼Ì o"jã/=Ñá“b¬h?ow´–Æ‹247Êq²ÂÆÈόƣS`cn9p™ÐŒ5ÜéPE ¼ Aœ¶‡ôæQ¿Qõ~d›æW1™7Rüµ®ÏžgüNßÄmRñ™"G´\÷ë­‘ÇSLÎÆ¸¥ÙÑ˰H)‚ìÊÓEˆ#ÔCÆÉT}Êz'¦W 4r×Ôz±û~aßsOkV^â¬[Qù‘ì¹eéxüÈy‚[Ç’ šLD`y,Q˜Å±D!÷Ž% ¾s,QhûX¢g`KÈ>–(y,YŽöñX¢GÛ>–(ä¯<–¨¯lÅZʱՆßéü q^V •âC&²¢ôoŒ×MÑìÀ{[žé ü$½4}6©S¶úh¢ßˆÛXš^y{LÝkÝŒ¯'cAÚüzCž_m¼ò.vÄ÷yÅ=-yÍU\Sc—ºYß°Æ tÃw ºÕ$èg®@µÇ‰Ç@êrbQdéñ|ã<ú•ý𠏝ÀûÍ4.ØPŠ[ýÆ&;½ð§¿Ö¸£‡ÎA†ìéèrc|nÛˆããq,(¢_Ò§ Z?M]6…ñþ£aëó‰Ü‹öÝhíq_|¨+‚Zîóf¶mO±SÜyT§Î_تúA¡­Æn)¼Q€4²¼a¢F—‰B‹ýB'$dÙΘBÉΞ0׺z(…jòk¡õ^^^y/ø­‹CÎ_?zùèÿ@ŠÿIþ¢ðæý£,z¦†ù¿8ùü€ûäš ÿÇGw’ïþÝg™ endstream endobj 232 0 obj 9390 endobj 236 0 obj <> stream xÚµ]Ûn]Ç‘}×WðÁ‰'°°Ó÷˼9CR”Í1EJ¤,E€Ì8É ìcæ·ü…SÕçÚ«jwŸcy„6éµûR]]·^»·¹xóÏgæâÍгx#ý#¦/~ü›øÓËgzóì×þÂÚ‹7}f/qa/йÈ!-)ø‹7ß?û—Ƙü‡7ÿ}øïa ¹Ì%ÿ¸âwÇèZ—˜«@ßc¬)‹‹²ÉÆ…gó’k8×\¢ñ9zݺå÷üã3þá»c^¬“C}Þ’_Lµ“!d»ø*çóI*n¡ç(õ ¼$ç&ÝÕ¸TeàŸˆ):ëï0y))Ðÿøš|±]Ãÿ¼míe1Y<ÿ{þñ°—ÿËî‘T—j¥Àn÷ݵŽ»gJ!ѬèáÛýÓb|ÞÆ%)…O÷ òvßÎí~æOÜÄÕ›g´;’ K¤}ôýæ—¸¤rñݳÌBj'߀þàêõ»ÍÃÛÿû³¿òïÙVRÁmËüK>zPûÁG(KÜ4¼û×]»žÖ4ïÚõõè™þ— ìèiÓe{lûïܦ¹xAÿÿÛ΀ÔcûáL&í'rqq%+ò}êÖÑÑf IÀ¯{ýÇè¨×W–@¢FÐí~ûÔ¢ÈÖ»}A;Ñ9ÌK1 Ú‘w£|Õ›=Þi²ÉƒÞìÿãµY‘²IKô‡‡ŸïwØ‹6YuRž¹>ì›îýâØvü¦Ñ$ŠÀôKÂâL 6Ç/e“‘”×…I¿dˆmtÔ›¢Dƒã­®u|+'œÃ’¼œð‡½á±´lQ À:Ѷ¯Ôôî¡CVê4I ö#knTζkɳ©Qfû²‘ áÔµð.,&¹ñZxÚx©Ž—“2ùbO] OÈæj£@w1¥Woÿñóýü¿ßüøÃ?«‘^hÙ±T¿ÞÊ[Jî“Ô¼ÞvQV@Éâ©2¤Í1È©Ýí™kH¸z ì²I“q¨g¥¢Ý÷Æ™ÿã¬%ʹ™¬h uJKk w•ß[èJ›˜P3¥èRòOhÁƒ+ãyF2|!È]§UK¶¾ÈÉ*F•2úRÑe@½³¬ä»¼óÓHžvm–h‘ÚòÔj­]öÖ•w"{Ûï+-±“ Ýñs±"V ßEƒb—ÞéÍ6ï^`¤Ãå¨ýÏd@›³¸$w{Kú„®&X _[ 2<™À]ïE¢4ù æ]Žþ#‚¾Æ¼‹“ õ3 ë(ØEP?î[IA˜‘¥(ÇtÈ»¥ °¸9D‘p0ÄŽpÏeÊb9ñ—"–JÇI•óa,CNªrŒczÒ®œ  ¿ï)–(Š"¾Ä|Êf+@}šI±†-i¼$>’ÁK²»Ë>óä óD¤K\¦;QÑ}®4ÙqŸBßRxµÍÞ½Sü­)éµRj”AN°a©Y>ý¾Ï£,¹Y]m”¬‹à˜ýx#Êž«²ŽŸÌLÛñwŸóøÓ·?~óÕ_¾ÿvlÛȆZSO±m€œÙ6€ÏlÀUÛݶèµtE™Vc2@‚Ë-#ƒ nE ñ}¢H;K’(D.U€±Ú”£léV›2~’¶‘ —Qà4ÛèåØ4ÛHq\–}ƒmŒ¯=’,'¦ÊÑi¶‘Â/û|‰Ôp4Z¨OEƒÀ6’)6²»Þ6ÆJc˜ÈkYåÔ}â)úåŠÂÁ4š%§· ¦1’õ–#<Õ4ڥ؉ÞsÂâsÖÕF³fQÔ¶7\¯V–qn Óøê/?ýôÏ~üϱe$ô¤‚'XF@Î,#Àg–àŸ`í *Cè£t>¥Ù«÷‡ É’A“ͽëA\w)±ŸÛ$0rh?m®“)J ‚”Ãs´ŸÁË÷§£•¢2EXPôè÷»ÝúÑdÙîµ@Oh÷l(3¥4I‚†Ê}„ýüßÞ¼|ºúæîó±j[³$ZœT3ÕøLµžz­%¡²¼°ÍDyr”_ö'i¿Cÿ¯=#OŠØÎÈá1v0rˆ½þÖ¼„,[zŽ^;qP ß»l®‹G}²kúÛÎ'eï7²ì&×ãI±=ƒhe«‰è#PLä°úR_%è˕胼n r]_ëåcOª*C]Ë9É qè>ÒFìR|™»¦%$9ÌG<øqAîTåôƒUÑæ88ï³ Á8ÚÄgÐ!'#‡pHÌïðŒÇ§²ºòªå:¾~óùW—z·5]§Q 6”ŽX#ELØ2vøîðR$³åB~Ù,b"æðüö‡çÉ-º²å}~áç×XX‘\—vb°ÂxÐ0¸â€ÀÜ„¶[aÐÿ6" ÿÑÄÙ²÷]ZG)R-¢¹ç"¶Ì 0Y Wlµ¦åêA{êMªå°¸æIS3qA ¯QªKª€ ~ä´Á£•#ïy%!’czèIZôs {± h H;íD쇃“*eS[—h&"s.“ÈüxL!«¢Ïá˪®ÊÙ:Œ)9DÐ6·«…šz¬…”œe}5»rcgm²Ùéw §³Éöº#Â&x$ÇFUÀ¾Ö< £Šº¬xΦª¢ o±•!ô-9Ч£Ü;½kamqʆVR2Zã0Ñ«|;CÐׇp±?¢ ÃKÙ\ÉÉPÆ›ËXóÛY}^Y˜‘ÚF±·ÂHòY{R Ì­8ÎÑÖDžïS‚P+s¦vt5ö2”³•|ºZS”}èžë]ªâ3ÈŠVvAÐ׊Z3éµRžðµv̤pL̤¥Å(Cè[¢ ’XôˆKs×—1nð¸ÉX/ž‘;Á…ºX/§Þ[ØH¡v’CXÙ œ†X'gu¥ØÃÒdˆ¼Vʈäa}ÈW+1­£´â@„ßcJê”%ê#_ s•“Ñêu©¥óCQò1…§œIˆRSø:År.ÊîvaéifÛ;©s ¤Øž9ç¹Ï¢»„-™#ðw{…8dn7À»lÕไÔ\AÈÅ™ ÇÚ‡\|ˆÁ{@}ÈåøÕ Ð Æ–‘í€^‰ˆ2Éé]#¡ßG9ðuý÷ÈÙ¯IŽíNÄSî1-d, ÷jckšÀÄÞ&‘ …8–Y3\nÖ…÷5Êq‹9ÉRø÷Ù]r¦®[²‰úàvDréYØQä\Z} … @¾Ô6Bá… òþ‡¥lŠS @N·šåð¥8ñ`¿×Èü;#A˜ÞP*Áa+  S*_ Ho(ÅŒrÞ7˜ñ¦ßj™¢R¿Õʆ*.f§nµÆ˜X¹Óxر,Øù7+?Qàk}˂Ӥ\½ÝËZ8W5lÖ'ð€ÑͲͧ•-7„«ñ8ia“—«½M÷–Ћ2)Zÿ샀´$SõNÇÇG“Bl}Ü“ Ècõ´ÿ¸(‚ Ë>ü‚Z!…_Yšµ°¨Oë%Ö}•úÙO;1ÙÃê: Þ|ßWƒÚïÚmŽâ«neäÝŽÒ’l½Ï¬Ó"ëxœ˜“¾N‚³Í…ã¡>‡HÙœbÍú–"ûÜ4i©ÅJcS˜þ&‹2EŠQ‘;–„µd¿²O$—°VÝUéNŠ$“â+ ¥| zŒ«eOO$|%Óp" Þ}ð¶– =â;›ƒæ]R¨^'}Q aBštæãB# ¹ §ÅÊÆ¡ªXÛ9)‚~AoÉÇÚ¯²’Ãl‰°ÀyÛûʰ)Çî3ô“&É‘]î§ýßðôÆž/%æ£ûèÇbb'f­ñ¾âåB¯f;$¶šˆ™¡¸˜i.€Q*rü’eÒ|«—»¬ç—Œ¢Á—öò`N°Ád¼Åçžð<†OGÓ›`f猘ÏzL]b ªxƒIú(TH–VLàV"¢˜À²\è7N\—ÇùY)½2Í!DwâB3ƒ›Ë£…æ×e£œËÕÔFf±áʬ_!­Ú'¡râ-Õ`ƒ:7% –’"¡ ÏÅW½Ëgk²/¹UÁs½©¥$¸z7p0\DŠ'N‹#ü :ýôpä/DsŽÎŸ_ ]h½èê@üë u¥=+ïJ}ï¹Öš>†s­×„›A¤íx㉡X˯ëfJGÈ•ÊàE‹mŸü;V++9B~­W¸lÉ7ZºI#…‘Xá©A ‹š|E`Þ÷ FBV…')–\»)QôÚçus›`àd'¶z1`zûbêfW÷˜wXÚa’˰/Æ=9v‚b¹W-ÙÇxyJwãÑ! nžx®¨5õ­@öAëÚ1‚ ££ð¬xzÄZ¥AÊ6bž»Y@ÞœŽ²Gâ"GùVIÇâÆxÒ1Úð5 朎µý¸˜½B€‚ùvKìÅ|Û˜á÷¯ÈÄàCÝbtÐb,i9[l‰ü\‹Z€`ãX‹ø€²V;Ö¢V¢ y¬Eü"rUTM9‘äâ%‹çhQãé*Ó–zÄ/xeEÞ½·&3SâxB-õK^Ó‚ž’H14gˆûTy›€ßÿ–ÝÂ&m~+•êJ×U.\º4×U~íÊÙ‰®rȇfC]õgsŠ®2­1›St5û0q¢«_1÷]å4’/ß.m À>¹St•™1µœ§«£sŠ®n*œ]å×¥CLˆ‰FNè²gÆPVN±óü4¿U„HY7hwK(FfZ8ˆü:dÍã©GZ‰NH_Dо¬·ÒjŸ9 ÐK %™‚‹ +%–¤à"È>›¢3”ŸU5€'Ü^òW{ίR&ð”0ó€§_ˆ3NNÔß{S#ˆ–ö sÐIUæ ñ‚Æ[9àÊÔ¡*ÊÝ|AN–ê}éßf€ G¼^Ï zÂh´˜,@ŒmGq¦'u]®Ü4’|ãÀa+ ‡*“Ä‚ö®ŸÂ>§b/Ñ("0{µyÑToð%ï¤nlÏ?lÀW\”]ýÒ{ÇHYhUébï ¹*'׃’m<.Ýôó:¼¢ä¹üF9'[#!òe|/‘Ø…½»Éíp@ì£#Úį·4LÖä3,<ÑÖ[¥1YºÔOlÙòÙÂÁsœ«ìOQ‚]ç4W{ÚöÈd&15ž×d&!{>⵩œ!{|ByÙí"èó>>óFP_ MK»"è—Î[ÙÒ#¦||Ï‚’\-g&9 ä•X9/û|”1Ù'pk’iWò›¢¬¤(ƒn ™Ô8“V ±äÈÅ«\áCÐ/¢æâewn¥tÛnù)cÕá;­˜ 6T¾P“]ÕPu¸Íû( ø=Š"pûˆÈ“¹ø Ê}DÎ}D”Ê}DÊ}DÆ}DŒÊ}DÊ}³p»Æ}ÊbÇ}ƒ¶ÜÇ¡,vÜG­sÕ ¨ÜG1º1÷q<Î-÷Q¬ÇVÞ _Ž%hë2á>æÅé]<`á0&¹ ï±pèêD_™ùX²éŒù˜’TÍUæ£6)Á{ä‚,‚€!ÂGÜ+ ¬ó¹@ˆpA|Ô:^%>¶KÓUë§ó9áBø |™Ùäñ(ùâ% üôE´ÇæEGªÌ%ªš¤ÕÚclÐã–¿½=1˾~²¸|‡"sD¤ð™MåõM´GŠRêdlµ´×Ï5ú± WÈ:Çs.xBeE"HcE"FcE"FcEŽûÚ²"ÇmY‘:•‰Ï©¬H©¬HÉc8Ò„,GÚswêæºh­²ir9´Ë*™ü&€·xPìQjüÒŽñùV*C=e8miïhiŸì³Åо(Íoj5ÈU¾¾«(ëG[\9qRØ}Åo¯AÔ ³«)2Wœœw®•ñ2¯2(–KȈV9-¡”Ðù|þòE[©ÔñòõƒL.!ɲ‘Ù†KHÚB™–œö%¾FÞŠ7ÒιÜ&2¤<ñá7Àƒ‘šžø Y²" 8ìòk‚ {í´kÜRÞrôïlIŽI¡Šò{âA®ÜorêÃâHÎê ·O¨dQ­³E9¡‹"\å‹"èdÂ(>¨2F¤RF¤rFU)­’F½ÊE JEÐ:oT¬BEÌ„9zâ¢ï¨£ÃEßqGt2yœ°G®ÒGÕ ®óG¾N =[µw R|P¥½ãž8·-‰ѧ°HÏžäŽFŠNx¤ªÊ¨DRU¿Ob’rFÞmÆU*)"×¹¤ˆ\'“"rÂ&Eø:‘ŸT S#”"He”ªB\§”"\å”"H%•"He•"H¥•Ž»k¼Òqg[b)‚þ?˜¥òêA>±Î,E¤Ê,EÊ,EÊ,EÐ:³‘sf©˜Š’Ò’C6I ³´V9dXŠ-9:ÄÊ, ­J¤ôbäIßÓ˜%øÏôŒ²XsÔ·K'Es sÔ-¦¤±–ðÜ)¹±–8&¸Ù2Ö澤NÐ~5Ð(ú4fŽ2Ã(ž 'œÇ– ô€¯¾×<žP»óÚ;m•ƒ`ŽV)ç樲Û$sTbFÄÑrš&òegq¢ˆÌåÛßæŠÈqN.îElß:S¤ýß.¬Ù‘¯ÄL®Ž×¹£5Å‘ ÌŠ¨‡¬Ð[†=ž ß]›ÃXöÍÄô2kôĹ´…@%ó¯®qÅõuq=-_ëdzŠvÜ ™"k4•­r=¤r=EKçp=ñáu®'"×¹žˆT¹žR¹žR¹žúu\Ole•ë‰@•ë)Īq=t×SÈfÄõD°Êõ”‚Ô¹žˆS¹žú\Ï¡w\O± 5®§ØG¿ßULë;ÃbÀ:×Q®'ÂU®§èo àOÓLF¹ªf#ü™zf$ž#Òþ•Á •À •¿ •¾ •½ ˜uò&Uî&`Tê&`tææ°¡-q0*os(¥-m0*k0*i0ÎæHWv”Í‘®ì›#]Ù6GRØñ5Gº²£kNueÇÖéÊŽ¬9ZâWs¨+;ªæ°¡-Ss¤+;¢æPJ[žæHWv4ÍÑŠìXš€™4Q +Í‘Jm)š#Ú14‡ãß4G²Úñ3Gµ£gN5jÇÎà)äÌÑwÜLMwÎùš3 éÅþk»?|wøC +“7_8ü²ýš@ãþuÏoÿðÝñÒþùý/£¯ ¸öÙùÇ÷‘ßÀÖz‡TÛ×l£|?€?½ÄÐ+uEœŸ$R¦‘Ä@’È1nŠï6ª$®|-¬b=æ-–±ù¼ 0â>kæôæ•pAŒçß6ì6abwÕy²ÑVô©pWù~f¹øpM˜i'éc WÄr~Xã¦rµ]®2¾´íüíì{…™Zù°4—ƒ?«c¢µò›ÚçÕpM¤Ýå:m½Þ¾eÛ[i³T1!¥”ÆßúªBDxIf«ùÃ|å5Üä•Ýö€–š?c§MŠ|´1¬n Š%¡øÛ?8aüÜAˆ¢Å÷Hc‰QLAé?´š†:Àç ^ê PCÃ’m·ÓʲãÁ÷a&g‡¢g^h])\ÎTiLEUÉIúLŠ­°ÇYБϱ…Ó%§ÝûœØN0w©žCÕ’xƒÜ¾z0Ʀä²ÚaâûÔ¾éÀ×zÁƒ³Î¢ñ&íBr'F(¿Ð²Ü|ÀDÅÑžÌ{äµð+Ø!ÒZlƒZû® º$[|¡f4Iï-~œm5n÷’†ïuóÅïy(v?%ˆ½DN ó¡OœuV{•ˆ£@"Šžçt6UF"õÁ´£wÔ±¢òfëpÁ™‘Œ® 3)mï7Ï_Ò”"|…ßCMIŒG½«š?³À®Bl¢ñëüö@ ã‘VÓ8®€‘“$¥¹S.¨¬-QÐ6²b`)ú7a<Ä@–“·êg›^’u«‡…´QbÔPMz”¨Ü?ûŸÁO?¹HOÉØõ¿˜–VlpGê »çÿþìíÅ?¨Ýÿp¼ , endstream endobj 237 0 obj 6685 endobj 241 0 obj <> stream xÚZËrc·Ýó+¸pœ¸ìÂ÷" y¨—‡£EIGUZ¸Êv¥2I9ÿ~.%òv7î¥fjj ‘:h4îÓìrûçÂ.·¿ ±ÆSŒøSÈËÿý¦¾Úœ/~Ü.Þù¥sËí¯ ·bé–µ,sH&¿Ü~^üíÉZûôÝwÛíÎ’)Ù+Ôº5?µæ­¹g}È™dƒêsÁ@Þ*Zð“¥ÀqÕR°ï[ã0&ãjUÈ¿´æº5«Öœ³>9Ÿéˆ¦…L¦¬@‰ƒŠq¡cÍ'†ªÞ¤âê¡5ÃÈ­¹÷!WÐG[ólg-O LÕ8{Võò'ëñ©£þÐÞã1|Ê&h3o0'c‰ú3Ö®C~këü‚P-¦­ì÷c· jWjLï’‰NÉ<Å™ä’ýÌ@Þé-c×u— j®¯/2PŒ¦¤ŽÅ+3d’ô6ý¥ðřرò—n—çøÿÛât»øcVBÈ&-ù¼ÿ®µøøG‹Y.‡Àå#þÐÖ= ¿5Ì»K·\ýwq‹_Û0HǶ–‘Áco84R1Þ'‰ËcH®†¨HˆÖuŒ«Õäà$înhX pq'¸Þo´ŸÆf¦%Cv°#}wpøSvÁÙ­˜s®¢œC6Ò¦¤— ôñw¦µ ÞØ ‡ôZU¥4;Á˜MŒ³óK0½§Y!-ÀiêÛ å |ÝIp摟ä+)&$¹0§û¸Êc ‚V°r–OÖù¾£ÒmQvË/XÆ¥@&éC7J_‚)IœvxJ-ŒIœð÷=y”R™s=ªÁø ]ê’k²òñ!Á~ÐaÖõ†ÔÃûˆT&ç!é…g«VZ>qüG-§ )-\Ìxµ™]““æjR.sŽïKì„ÆH|Å@Yné1"Xg²õÊ;i›ß2¨4Èñ®•·B¸§Ù°(˜\gw~ððí4ƒ‡;¨éi ­Ú&š…Žª”7ÁB¶¦¦8«_±Æ&¹Ì\Jñ&м¦ü¼5ÁU=Í&€œâñ$-"O`aCM0£U¤ Å뜓GpàDqNñˆ¢Â)O™ˆH¸ôd.48×è\¸8›&:¹.òË!<ÓŠïäAVÁI]xòö`¼X}é$ïÁŒIà:ù¥W+£æ´JŠKK®5.c—4+ AÌfi¦»=-=ãIõvsg\–1+%¹ìš8¤ŽâЈe–ci‹ÍmÉn¢kT4Æ$À= Š¥~–ï;ĽŽáîö`f(ì°(3‚Êçáw0‘°ü÷"Fp{RwÈÃg¬sÅÇÖñå×ß¿¶>cÁi>¿~h^·ï×ý¢ÁG_ Íż“}øð*=Ñ@òwÒ“75Ž…é/vðÑîeü¡ÿë‡&ýu¼©Õ±çRJX¸[´†c§“¯EC‰üóa2æ• ÈA[*+v<ª;G‹›:@âöZnÇ÷¬{ÃŒkT#yÄǸ Ôemçæ ÁB.rc+Ô¼‚?ÈR´Zm£ÙƒDøõV€ƒ¢IV»?HlÌLMÿI¦É˜µ%ç±ñQ¿”yWr tµ#¸ãJð ¬Õ[]‰È!‡_zw'¶R`Kp­Ëݧ»íéÇç÷'ww—w»n–w|qÔE{˜m‘¥*PßÃ!ÿÖJ£o®9®@rç"0NTFG@uNJÁ‰R¤ylrµ¯#g~°~ù0•zÜ.õø‘õ‚É_–ëùãùÇ«íóÇëÕýútzÁ}Ú´ŸèéÞ§ô)ªó-*«Îçòþ 5êÃ1ßHžÛ(Œ³?ö8dÄaEÖEy':?jes;~% \©úÅ¡zƒ›HàF]74:Í1÷ò²¡:5ó×3"~o€B¨3‹o8^Y]G^˜u‡v^cSoß×'«i_wÐñÑFTÈÄ#­Ó(Uîå)göZÒ'É|c~8B’vîÈpT@_´N“HÓ…'ù¸;:^]Þ}8fμk΂zK‚¸GÚŒ• ´‘æ´¶*н:üÎZÒj(. ؼB…ÉP¡&¿sÚËëc‡] y4¦ABl‡›€íä¨@»(þÏ=ß^í£Ëƒª9] &Õ¤dˆ ^A¹µÞ·²Š Ò’¾Â– Q-#¾Í–#°æƒp>Dú¶szÒèº^Èkg_½}™½Q¥HyÜ‘¨*Э:ðZÒWØ»Š¹]ø|¼Ü¾¿8fò~°£V Û¹x/ò–¨%ìBÒù˜ªÄÜËøIUaδQÁä#*-¼Ý7³„Õ—î<¦­i-¨LúsŽ:4ñ•›)™àª­;†pȰ¤{æµÒGH)Õ‡‡+¤¬@É‚jѣϚu°§ŽÆ³öu­þ¹×|}½¾¼:¾¿ºÜNÚwÜ¡sÒƒš%*̇®/ÒÒ:ΨA7æ‡eÉix–LpP" <嘂²Ò+8¢!JK¨þ€BNÇDµJ®*ßæ‰@J²‰º5 G:ÊlóŽÀRaް:}¸|?½ÕÆ]zO‘àè9+ÔJ¸´E…ü»$m1jˆJíðPanGQÛ.aȦâ6[ØÝ!cgʧMÓ&k'e÷ÔâìäjÚN#ÜŒê`§i¼½u¹¹~<ÝÊ  ]d%S³ÕbF+Ð¥ö5)±gZ6‚}Èj.·e-)ì%¾ä ¬ÀläÕ 8¹€ˆŒ‡º3ÀÊ$yXC^©uô¨'ÔYAvã÷ƒ¬TM¦óF4Ày¼’Õy#Ûñ‚ÄM½Íº±t5TÛb¸ßoÆ@K3„Á»,GßöÐjßÊEÞ/ñw"~wxÂ1<þĈv*.@üAF»4 JÉGŽñàÀp¥ÁëÛ­À°»‚ŠqIÅÀ`% ¦œX÷•O{´RÕJtžù BQŽó†ÀVÉù$GÊž‘¿Ji—°iÖVaÍ×ù±b+•%‚?7AqRšTç¡ 8)Eµ4—2Þ ç¿³zµçÃCÍ'ׇ=÷‹p×]Æðrý{;<ÚµËÏhs®HkhW¤ìƒ.Gw¸ÑW úÚÿ÷Åãò?û“³ü endstream endobj 242 0 obj 2663 endobj 247 0 obj <> stream xÚ­]ÙŽGr}çWôC›²4D1÷Eм š‹,RSlö, À™a°_üûQ·–›'¢2‹­Á`®ºŠ'÷Ì8'—Ê07Ÿþÿ…¹ùôŸôóŽþÿ·øôâõ[scíͧ¿¾°7†þgoйÉ!M)ø›O_^üë“1&ûé¿öSòÿ¼¿ÆÕ:Ùèðwüã¯ÖÆÉY/o[P @OÆþïËì\²ÿÌ?w Ò—)&‰üÜ€‚›Š/#Pª•åmêÄÆHÉɘîeySš|uz>6ÈL ”ÜñÏùç¡—2y›ù¬iÊÎÊ&©;S&Sdt÷ Èú©Ø*@-ˆK,{Öÿ|Øj©©tGÍ”0z—tTýÞËÖN (Ù)Û¯ —òd¢Œ©©j—ÍTªý©EªêHçŸ÷b¸ú\¦\õ~ØVc‰Sòv\ÕNÙÊ6q× ` µ¸¬[‘l°Žy˜l°T-{ß6(秨§;}”O¦ÑŸHœþÝ(Vgö]§1HæGÀr ÙN5ɬ~lA™ì“ÌàŸµ\É»¨Ù¢Ø…P³jÒl±¯‘ÑTªhÙ³Ý~æqý¡ ãòý€ˆ" >SÈGŸÉ\ªœkE@Šâ)€(Š!‘áõøª"'+0-{2óIFôc *“eA –[É2’îgÉÚLCÚòäÜTK ³tIAà͵ ÒŽ”v”qÞ· 2%ÖLZ„af}R«Œóé©Õ&4fdÿºê½X-¯›p1l½t†:zè7 +”j¿3£w®ÎYt¸$;…T¶¬7Œ•­3ddæûª …„|Ÿœ4«îbÛÕÖ7Y$Se5µÆ^RCËÅ<ö”ºü¥Õy²Iæ©¥TG ¨ŒEïS‚49‰J½ïƒ!ûlûµáõ>¦·.ˆUŒ¥ß³´aµÉÁ ¿e}{XbgŠÞòîyà^‡U^ä69~±å}Xc'ÊÛòÎmXíE“w~±å}Xb¶îy$Ê ¼y±å}XcO~Ï;?´aµMÞùÅ–÷ýaåÚ–w2ÂmVå ÉÑ‹=ïÛÃ{¤Yˆ]óÎþ:¬ú¢IޤӒÜ~}Xc—†ø²>4åV_´ÉÑ »æ}Xc'ͲÕ;?4åV_´ÉÑ‹­Þ÷‡%öd®úL²ÐEä }†_lõ¾?¬±ûº×;?4åV_´Éù²×ûþ°ÆžÊ^ïüД[}Ñ&—Ê^ïûÃ;M3ö¼ÏkŒWA•ç6ç%MkÌËŸK¼Ù\YÜl®Œ,<€ÅÍf·¸Ûßg³«áoê5å»@uëM¢Dó¦¯ ,šéÍ‹ "d;Ëʼ¾ªfš3˘¾"BâG jTŠŒIÎ@ç%+€íV©8oŠ,¡ºµBJ& Þg³ŸqÛ&Y™Óäh–ddqqšÜjº,ˆÕ‹”puÄ(MŠ$RçͲ&?o]罘æZÒíÆÉºjÕOõ•ˆ5WÉYÝšs†”–•åÚÕïýé£$Sÿó{—k¼Fî‹@þ€;)¼ˆ „ã«ÐÜAyžs/üÃÜ·^~Û.:PnR?oídbx¾.A¯põ¢f?ˆ‰¨³CÜ.!ceñŸö=ÏT­L\î zRóò`_ÐÇÊ«´ˆ†• šˆV¥Ý¢üe›#Á*Bšœ—¥|àŸÿ@« ¦üÄ!ÙT¥Z[UiúÈVT«ªvØÎ1²Ù?ãªr2~²¼“O7'›¾dë‰æ´Þ©È£m^²<—ë¶ç6Þcœ÷ËOŒw@êã@úxÐsÆ{/m¼÷AËx>Þ»1­ã@‡ãq£ñøÎxä`¼Zï:?Þ! ï[¤Ù°;שwA¥­K™V‘‘6æÖøw­ãM ™E³UEÖcŸgÉVtüóM»€½´2 ÿ¼¾ôÜÌ.YSô6šD›dZ5 ÝbW(9ë«tÆL½+É„ÛÍ}’¹¥Êv¯`ý”½Œ]§èƒnho6õt§lêQFöàV„Ò 8%iˆn[ÕœÌÆ»­|ûÙ–’OHœòV1†~”ŽyÞ!@ä²uÇ O2GpªˆÄ¦bðp{·7£çE7³<Œ”¢ÜŠ…¿jµƒj6\:«T©› éÌ ç0W/¹ú …¹¤3W7¦•¹tÈ\ˆ1à;ÌÈsZg.g.Øa.›&s® Rï‚Ò» €Ô.8OŸ_·;¸‰tnÁo%!>)²Ôud¹DÏ! ,Ä7>˜F"ÖWYÅG¤CF#(ùiI'ÊŒÀŒ;F©óÔ9§7à Êdûý·º)iÞÚ£0q>µ€˜?ÁæTRò›Sa"›ÓOÌZ3%G㣠Ë0‰5ŸxˆT‡ ‚Ôa‚ gXên:«¥€.–Aª¥îÇ´XjYjXjÄ[jDö-5¢UK Ó–[êȋؿi»`¡òIä«¶wÑPÈA€f«4õÌo!M™E8i}ÙN;'SëK©Åà% »õdSdºcóë©{'§Të|¦Ð xk~Ÿ—™77/ž;»j»Ãˆìo)rd7Ù$cϧÛóì/(ý¯ÁdjqÏ\áÿ&-±åÃÁ}ÞÆ¦rRŠ R·±Òm,€žcc{él6¶Zl,€tÛiµ±:´±ˆÙXÀwl, 6кÐy ;66f9!{µÍ»,#Ã✭˜F½d ²5ަ‘‰kQЊ|îÑy™ë±i¤nâlL£ó .„÷¤0½Ìô¸•¸u²Œ]7Д·bÙŠëD1&/q1|6lj÷ÿK{È÷~ë¾Úm´J×m×! Ùïq›¯8™™a+ÚLƒ²–Arž¬2á«*7YYgíy%Þÿ6Ò¬¾–ʵØÐÓÎX¢1÷›ZÀyÞ÷ðýò;ŸçmÇnÿõch3¾œÜ}@¤ÎZÒY @Ïa­^:kõA kHg­nL+kèµ7b-ÀwX Ö´ÎZ:ÏZ°ÃZT/ãÉiäVä÷Êô ÌÇ)™ñ¼Èl²´w¹Ã%œBCVæXY±|V&K8ábF%z/›Èò+ßõ¹…?Ùr«4†²½Ç/g‚Ð~!˜)ßõÍŸ—ì~×—ˆ¸S&qWY7Gb`þ˜3â$² ¡/@'öFˆ;¢Riª@Ë# {Š—À&¯¼f¯ØTü¶+&iëñÛ.W%F¶$BŠUÎ^KZLJ¯J¿$›=àïîÎM¤©S€tJÐs(©—ÎFI}ÐBIÒ)©ÓJI:¤$Ä( ðJ䀒­S€ÎS<¦¤@£a<—gJBä1%!R¥$¦$ xLIˆÔ)I ( qÇ”„H•’¤R‚TJBÐ1%!ò %õ ³P‚”Ôs¡$¦$Qi*%Á©Í¿—)Xiž?H*ñS©Òð>nY½ßñðGJÒôµó^K,’¤UûˆÇj‘©wé)ð‡KJŽUÛPÌɽDªô„ •žô z꦳ÒÓt¡'©ôÔi¡'Ñ“À è ñÇô„È>=!Z¥'¦' Ø¡§Tå¤ý%î¥ðçYˆtÛÏëÍZÏünëFe{÷ ‰Áf+bÌØú™Ù@²a= ¸4ˆÌ]Vô“B dóCÈ\áKV‚~Ñ-’—½V„Ë{"|â}™Ï7øy°s²éÚOyù¼hTªï ¯;)Æ ¢*ŽTG q,ð(Ø{7A6|ûQ9É™utß~L­^dL]úr"–…ÇÍrú8h\&l&lC9žõ[1œ24ÅÌIb~9b:íVÂe¿âãÉYšÛ7í2®™ï*v¬ê{’à# ¾Î)§AT?˜$Øžq aÞóìšKK¶ŒïØÕ¦¼hOî­!Rç\éœ  çpn/sû …s¤sn7¦•stȹˆq.à;œ ÈçZç\ç\Øá\¾¼ÂŸâ\@þ8bÔ9@‡œÛlå\u8:çhĹïp. uÎιX}:çv£Z9@:çHç\¬7•s¤s.€Nq.6mŸs·‘â”3™úH䉑%)£VDƒ'uê¸SªnI¼Tyê:VƒŠGAR²ð-^|“™œu'K¢Ÿ/K@äïñ›¾EA­µåÛ½ÌÙ½r¸‡/D‘e½ÇKk,s €ºýÈXŠX6³ºô øæ[øòŒoA¬ÀùÌ¥dßã™Ë%–¹ùj¹o>àLüôÕ7œÖ–©–0ß1H\}!º}sö€&"ucNÐDÐsŽ9q@sZŽ9q@³Ó*p̹š78æìMDŽ9q@AçŽ9{@“Cœ[T@äo8£*pt$pú‘-AÇ‘ªÀAÐ@à üXà R8Rލ>Uàô£Z‚Tƒ UàˆzÓ‚Tƒ 3G4í9ÃÕàÎ@>Sà`4ºÀAÔ)#¢>8§ D DªAªÀAбÀHMà èŒÀÁ0#›²4²m]ºùC' óŽžm‰¼Î_Î#R´$ ¢ŒÒåÏqÌ¢lC>àÉ7y#òh‹F(o"ü¿y¢f ¶ìåV u‰O’ØÃ0Ø­÷$D*jU¤š<«H•JÅo[•OÆ;¼Ü dMÞ8¯ÿWÿhs)§–Ò©*M©JAÏPšÝtV¥9]”&‚T¥ÙiQš:Rš7Pšˆ?Všˆì+MD«JA§•&ìAöûpj‘ÿ¥ 1êJ@‡J³Ùª4ÔQš€Ô•&€FJॠH]iHWšX}ºÒìFµ*MéJ@ºÒÄzS•&€t¥  SJ›ö¤Ò¤àÂXÈ€vä åât¹¨Ž\äH.\— Òå€Nɣˡ\†_“ :” Ý\˼̖]/(a¾R-˜³7à RW ÒÕ€ž£zélj¡ZÔ€tµÐiU &žZ—¸‘Z|G-r ­«Ÿ·.…Õ‚«AN™±#Z%v&v Ø!vêb@'v@êÄ ¯ v©;`FÄðCbœNìÒ‰@:±H'véÄ ±R'véÄŽ•ª{?ª…ؤ{·¶VbNìÒ‰@§ˆÛêܺ‚ÓÎSêCúÐ:ô:Æò5ˆEs¹„‘Êóí zûd™t‚ëåuBç¬ÉkÕØU\d‹¤DŠôé! j°ôô^,&/@Â'{þD2€gjxåþG²S: R¾\ßé©kŸF‘̲2è%‹¯br_{”‘ð‚ž-’AŒE#DÄ]z^±`YM õr(ˆyÐÆ¬g£‘uîV#ãÝɵ#Dê@ºÄÐs$f/MböA‹Ä.1»1­Ó»SkG7’˜€ïHL@$& u‰  óÓŸÝnwìÆðÔ¥sˆT/CP’´™*YW/pá¯KGºÅõõÙN臭{$Tk%üv«Ù'…Ù5¸R.ìwhÀ}£ß›<ëVY¥¿y…ô³Sf‘‰–8¢™J‘uÖòm ³«sÝœ ¡ÆbÇÞÿËVYö{±§eEöŠX–h¼6ƒý¿iÓÙQ²4¾/·žÏgPÙ!8åc%ìDG;² üø;¡ËlEŒÖŒ^8AëI"9|Äc¶”]ÄÜá'SF‰¨çˆ™½ïÕ$#~+cgA”eü(ZÒ¼<þ#:èuÆ ÐG¼Ë{K¾©‹V§CìùÆp^fMÛôiýô†ÙE1†{~z“,‘ä²Ð4“±ý¬\nÅ= àµ8šyò”§›KêȶH‰¡ç !Êw¤¤iÒÀÏRAÍÞÆœ@î}¾N¿ˆ}„? ·*­=â²aqU€¤SÙZ¤ÉçòJѵ Ë²¨ ^æ«­²¼ÑJâJ…i°È–PÜb²¿½ìuä:¸¶ÅêmÖ"ÉòÈâ¾iÇ…Ÿ‚>ìviwpÖö~šÛ$ׯqØŒ§~;ÒhÕÈNÕ:ìŽT=¥ôÛÅÍÞ(r¿«°ÖÎ^f\qÁͧ8¼Ls|Ã#{*v²RNÕk ìqÒç~ òF~Pú#ÜQ’æëGº ÆÎDØ© ‚~A×^޵·xWoQº³îƒ›Ú­Z£¢¶H|§ÕÁ¾¬Sh +ãÏñÔ0èä¾ð}÷ƒNîÙÙfô_>ÇÃg*Æv…QVÅ¿U=b3¨ þĉoÙGâ„›×k5»Ýz»Ž³Kì~š=WP¼ä$$¾AF·S?¶¯íE ²…)w‚~Â|sÕ~†íhìì>½Ëó‘W9zZÚÖÍkx¾xÐæÕXµ™UÚžæ¹>jøßêAÛ²×úŽÆaÚˆé{ÐF´êAAkÉу6âTÚ"ÅCÚˆxÐFø±mD¾Üêé×¶ÆÌ[5çåGQ9O»ƒk^%ÿ²ü͇íNZå3c¯ŸÍüï—°—¿7®õr Ù—åï|NynÒáÅ”²Ä»ý½ÄËw¡oæ‡&¤ú¢É3¿Ø2½?¬±û0¿ø²>$šXìaµ¦IÎóÌ.±okì$tò–w’µÕ^G&_¸¶ž,»JNkìÛÃÐÉ-/¾3¡ðÙÀZzªˆô¸ã9 _á±Nb€‰¸,Å—##HŽ$¾ƒŽgl1ô±[Dû°E¤êÃAª[¥ÍŽ}Øö+kña«Ä4#H¦ž“|€TM `ÐÈ#û§F5Ô¬ß ÍÕøì+mŸVaªéàÀòZ5|€QíÆÓ3{Ø?V¯×V£7¬Õæ)mÕ5y€/bí9ŒûÜ2€²o”†9úöÔÎaÝžxá•/RQ€ùn¯Èo¶Vÿt¤Î§ ¼ñ˜(oÎ&¡[]¾V0ßã)ïHÓ{,z‚ÛÊJÒ.YI4äæqÄP¥"ÆážQˆNäýê8.îñÇÉ£ÜÑ¿;êdSL%ïöÄDý*ÈêfßoÝÖªdï‡uÇw°ðIb€½Ä1Ç›Xw½¹ µ\ÉI ‚S—ÞP^ü Ds7 ÍÛ0@4gý„V_ý”VWÀû[ÌA gç€Tù0>t‡OyħZaT>E Æ§ƒ4W>ØWò©Va*ŸpÀ§€Vù0*Ÿb<=>Åþ1àÓ^wZùtX;+Ÿ*mÕåSÀ«|:hÿÍ«¨ÆÖŽÅ4UvȨ”ãÈŽñ·,9ªAÐŽõªpõÛÛBT·½áxR°zí ÇS‚Õio“cŸ½-x|¼$Ý̧ٜ8í¸÷ªËÙLŠË¦Þý‹ÿåÝÚ›/ô›«ãí#þÆÖµfÞ8ºà®^5Ð5üß_<ÞüÅûŽÈ¬ endstream endobj 248 0 obj 6829 endobj 253 0 obj <> stream xÚ­]Ù’\Çq}ÇWÌLP‹/j_Ö©Ù Bœ}†„%P´¤Â”ú1ûÿœ§zº{*3oUÅP¨9Ý8·–¬Ü*++¯92‹w1Òb ùèÇ¿¼0ì§ë³µÅTŸãÑ÷›/u‰G_ÄX–ìä× ôÉyqøÞ}üû»ß¶ï%-e×nÉ‹uOŸ”?làÝi×øîËcëɦöü÷Û/ݸÔºî’ݵç·_¶­û°{ò‘=+ýØñÃnìû/ÛÖ£o?|¿ýÒ?«ýûÁïÆ¾û²m=»ýzâKÿ¬öCO*úÁîÆ¾ûòØz6v?v|醪þÐu‡vcßÙ¶îÌ~ìÙÙ'Ïõ_L?ælë²ktû7Ú´Gøñþæ ÇçødusLOÚé¿°UÍDê]/Û¿Ñ‹9ºý>þ$DL—ºÏo_¼>õGÖÝbˆ„ ±¡Ñ–œÊÑí÷/>ýÆ“qû_»·Æ-!KÐ1>NðqÑÁm^b®~Þ\"™•m~c\ß7q|®Qàb ´ø>Ëñqß!£¥æ‚@^ãã+|ÜupÒ,‘V†ÃOå|ŠYJ”ãüdG¨›ždoÝv=±.Îí~ø¸û!ì$·=žÊ®9:£ÿÿeËÙµ£KÌK ô1[$þØŽèWøðýØËâªÈ_w ì‰h{L!"x’¬èȰ¸$€+œè*%J¸äDoÍb¼æOâDÂRSm8q¯ ì4¶6,AAžö 2ô¦È3m\‰ä Á» öÂµéAÁÓËÿKßðY¯&,ñ©$y¯!R\’©”:P¦Å Szç@VRò~'Ý.»gj\Œ+cîµÄeUiXá^S6Â~ û:»ÜØ÷õ©é…·1•ÉK.OÄ®çrQ’H¾\b9¶º!•ÚÄeGFîO{å–Jê˜CS/øäo” @Eê‰jHá$ÿDvïÉW1± ()ÒÜãÈS5^ŸÑ«^EÐܽ2÷äÜâÊݺLÆWvÛÖÊâ£næ´ûÞ?7ŠM¥[? ¢°wùïøø\N²`Õäø_v êH’äàû!Vrá•¥}¹%‡F–@j8W+™æ 1:¼+ õ;f²@† oN¬H>}QW¯ý÷ò‘áwâ‘ÒH‹g§\±/²‡OÞìg{é©‹OVÀ_ö3’Ϙè—{’¾Úñ¯„ªð¤ƒ²—3nŽÍ•â n¼'ÇÚKпõ ÚÁ’µS†Ñ…VBÒh[ ‘ ç¹<q¨'i´œÀž’½èå³sóV2„) œ¢Tƒi»IhJ¢ä|/\ CPæ4 ´GóUvûI/‹4]#§ëö*L¸J{¶¤?óš{Kª²¼êQºZ}èA$²A6wÎý®˜¤"¼ã›6ò1HnàtÅ*5ËÕîã\zup#mô è¨W{q­•|ðV™ m«\À‡wr,·­¤€S*cΰþ°Ô!=…Hòk‘½)D}¯H؃ªTIÆŸ:;#Ÿ…AuŸ…f> ƒ|]õY´é> Gª>ˬۭÏ©³bœ} ç9Ô15¡ÆsÕ‰£3 ¸Pwrª_¨¢œlMm º\‘bqg­N›¯øV)<é1…¶S’Ò,*CËæ$c±]O$ñÏiÖœ¹ ½¦In1ôÄök´¹´r.U‰ öà]ƒêÉ@3‰dð‘D2èªDj3Ò%’#U‰œu»•HN™Dލ¹•H˜ý(‰!lõóQ¦¼q!9½û}J ¡E½ÛïÁ×BB·2Té=0Tf1aQ~Íý˜:†y׫´89UÅ5Ô—lèŽ; )'}i{…â©K…r'<Øë•Áßs‡#UI)¦Q œ‚4EÊ))’½F!×<¡R []9p]¡4¹9L¡0¨®Ph¦P|¤PtU¡h3Ò Gª eÖíV¡0ÜsÃÝô°CΠ®‡%HKð–Ô})‹±²Ûõpíµ•µèÃÆö"5­ÅWì\mÕœêXîŒÀ&Eí7½Ò! F b[œT ÌÕz°ÐøÙ¾v'• ªK%ͤ’ÁGRÉ «R©ÍH—JŽT¥rÖíV*î¹R©ÑM—J†œI%ƒëRÉ@ºTò–†RÉ™e&•#æÚIå”Hœ(Ÿ’ºj«ABÚLˆŠuÞ¢.ë ¥È:µ«Ÿz;£y;£y;£z;¤z;´îípäÍîã‚;+‘$–Ã{—f«©"9¡úªj*šh*h*]ÓTêŒTM%š¦švû¨©8J¥›ª©8r¢©8\ÕT¤j*ÑÒHS f™hª!sm5ÕœH! Wh¾j!ä¥:9ñ>¼KκóVïv-¼›ËLÔŸ4Žzµ Sö[ ëÚ‰ ‡ßì/{ÕB4µrrlSãi¿’²@y®{‚2ÐcÝÿ±Ñ,5ÉÙ7uXæÎwmxzÀ‰õpØ^Ê@¦I8l²øSH!R'c$ao’nn¿0u‰A"ßîÈó»ÍÌ7¹'mn<¥*âa”RU£À¬Dø ýRDø2¨Ä@"ãªD9®cÙ1GL~Òùä:ˆÖz¶!ÿB™æùvn6øäɬÉîzž©»"Çý;%[+·“ŽT8¿–¥@DGôw´š.Z´wXNeˆ72C Ë¥ÌXÉ»ò‘^öþ “6hÍ Tƒ†üb7âî%¤\`—‘?Œg¸¡Ø1߸j—W¨´WŽo{7¡jüx*Ç1°MRNvížóc\r Ç<ìÃæ¼‰ƒ®{™P…Ñïz¿!.FaãÝè.ú€d]Š•Ëì+ø 1IYœ&Êà`5Èç?Uµ’¯zÃ\ Ý†ä{ž¡ úCŸ|+7æ´à‘Ö-×ù’§Id+ÇtÚû žuezZNZ MåŠìVšóÝbFìé¡òu*xT®QïÁ°Jœ­’xN»«uÉ #wÜMÄy<ÇÈÔ°H*±Ø¢Kn7¸èàSË~;‡!Ò²§ätê¸(’6ŒÊ»E‚!'/m=õ˜\Šlæ|íìÜ,*’ÁÙ’Væ—Δ„F2ðŸr›÷+Ý)Ä©+$•Ïi—>¸MÏÝ[Þ²ÙÏŠ>œåÆ)%—y–t0¤ø=dŠ“Dèç øžS¿7Îä5+}*&‰ëI6§˜\‡­“*®T‘ÔS¬gHí”v<8T¥è¬Ñ#S&×K6Çl{mÙ êèöiÁç"áÕÕ¼XŸ ̲3A'•\vŒ^/'Ø[[ÒÑɹõÖÖ#‘K`.vÌ6Ó~¨VÇó¯´~Ù®`¿±'?}r3è îÇTRߟ³×Jr?j |ܵ;ÞÀ¦Ox®¥2má8ˆe˜–óÌAï¸C /ó=oeKwüv‡/V€EœH™òŠ«¾eŸ²cÚZ‚11HùÅ")v¡è5C¾HEk ‹Ž´îv®qó¸!I‡}o–C¼YQ˜´r¾æñ¢¸@›##iÓk"ZÞ¬¬œ¢z’!ßoBjlZ¼ÂœWrC†•ó’6,ªZüâͬSr°‚cžr´ŸL ÷y ‰ž‰À=ï'áɹ² ݃2Z'Ý‘¼§'Ý‘cždˆé&Ããž›2Î{žµJN›.W‚SÈP.´çp™k‰HhÎõäõúhÇT ÈÜ2‰@,Õ€šÂ¾*›¢óñJ&!B¥V™¶tNÈ][¢ÆÖ{ìwxÉ.Á–±&äOÙ³¼Vrh')‚=ˆ¼EÒ¿Pv-¤÷m®:´¡Ý¤ Ê´7í?cbÉNÅ=ÇIJ'>áÇÓ‰œb&Ö“£,û¾â©1YR,6EäÙû$;›R þ¼*âî¤ìórwMèLËáÒ.FZ*‹«€¸f¨Ú­l/à쎒!§^!÷ü‘kò¦•¥V7&¢kw¹ídLæ"îùÖ¡ÎÖ —9³2¦wܸ"èÈAçܸFã&Ͼ¥÷Ü\ð“ìdܘÁ]õíÎèœÁÛEJcÇ}zì帤§æ-íz«D®™$OsÉr.EÜ5õø»H>{Å­fðqLdXMëÃd´WÑV¢7“9[§ˆìÉ_ªy"ž¼\m%$•qWÄ+Ì$7QÁ➡ӕŽL/@ 1T)9+WpÇÃ+jteµC&öc9%ŒŠé8×oš†ŠûÄ$p.Ñ*&AL(ZÓÎÖ9²÷~#19­ÅB@´7&þýöÉ6M¦àiïâ˜vÍ€ÒFnUSáÀ4@+0ÐÄ5̱¼AÛ²eðF?7@²gŒUÀ·'Ö¯O-÷°iñýhû÷?^øÓrüáÛ?þÏÇ¿ÿþ¯þ°àãè7G7Ÿ_¾yÿÛÛë·ïq|òþ÷Ÿ}y÷ÙÛåŸua8û$úp€ ÞÈòP |G†|%zpmd“¿Ó=M\Í.EÎK¹÷@’ÍÁ€½GF«`÷Æ@×܉©AvÙ{dd°œ R<22X)æqŸræ’ˆ>’Û–eŸ}Ä’„½bWÀÖƒÊ]Õ©Êü¥ÜÂÂÙ{äÚœôIAq^Jßæi¸¹ýìöäýåÝÛ›“÷_nï–÷M„%½>þ½"ÿWƒ#ÅÛàCîãíŸ4±… ÀŽ˜<ÉééF–¨99Wm.s×t+q…?IÐ5O«²˜õöÙä–NÃAý‰¡ÅùÔ¤7›7KÁ@ïøÚ¢ 震‚ÒÝ÷Ÿp¸ÃAŸð«!8¡BèêÚÂ#AŠÃC:»ø0é3ä*rŒâUfœëÈÖּʊ»péU6¶Ï’~¯ÄY+A¯Ÿ\³î¨º ð1¼Î ÕÝ"2#¢‡˜S!:bÕNˆiã|Ñy·-f¨½ï)xvÂÏ8Iuf2×HŽ- = g ¶wryûÃLVå˜äιyi^.ïÊÖ9’²~"—‘ô¨Ë³!¢.ÂÕûo+dÕéU²3–ö£úE ÷È( ÄÓá6­œ?µË>J›w<­©)=:çŽG@Œ„îyMÔsà ÞŸÈ(m–H)W…"TANV)WEÜi³ì¸¿ÈY¾Ý“žV“õ¾YfÓ£bH‘ÔdÌʺ±‰Y*<© [½+‰¹å®ê õŽy¥+¤bsäDftcFn§ >ê”^+VÃæ¨kÈü¸Ñ/"¿šx0KF=Û×îâ'´%Ê=ðÚà&|í}Ùlè˜'Me/I½'ËåJ媄„e¥õ}³ÞänrZÆ#.-§eȸNÚÚbö†Žœ0kÜ¡ª éSÉËuúbÅH‘XØ(—¿' é@Yûw<]ºO5J2ƒÈO.cÅZµ8f ìûsœ,G åðÊšI›×ŒqHºÀ*6ÏÒƒ+9†¸ÒTeÃ+úÜ"$+Û½ãñW†”AR6A€”dx¼\ÆÔC§î¼iW¡†CÄî'˵[ñA‚ƒQÂ{+NŠ2Á ð ñ : spâƒÀËLeÌ:Α²xý\KhµTÆ£Çmä$—cí4é•Õ›j¼kÁ9¶«)lÐÊi:oû.ñÊŽêÇóG’*[Óo0!+Dí÷Ž×'qÖW5­ä¬¯ûºÛø|p<)5q8èlÅ´¸Ünµ¨¾:|;óô|<(Jì{ËG¦*JÐK~~^üH!ót|[².Qg’LÅ«´üCIw¤‘%w7Ÿçÿúck"£2Øíõ‚ý[Hd}†ˆ+aˆÀˆgÝc±}×ÝÂÄñ8ÎTú O7Œ{|l'nJûÿô~ä]zÎ~•=¡îWFÛ¯¦V(„#ïDejkhmƒ™h²UÂÙ6^V%;>çï5iª”ØcAJª¤ã5ßÔ¢ëx²ˆ:Õ:rgb ¯yß”4n ·ì2vM|Š<».d¹žÊÍalФ½²‹õ±Ý1.l®”‰¥”»X¼e@Y€µ],‚·ÞŽ—±~TðÓæï€@1åú1^QÇ<‚P"îJ«,wÁ7ÅAá`t,í¾Ý¸S×ʘ Æ«ä£ßxÆ tªd²…vãD¥íʽ´”Tfý ì|ó’•åÕ/¦¡<\Cé°mØ„‘H¹™†K@N6wÊ‹›á Ù\+£ITä]¿™†;ΊŒþVÉ ü³N¯ØÊû¼ˆñÚŽü5·8¨ÙÁAÇüd* $Ã@£z?¨åå#§ƒ˜.`ÏÓâŠ)– /ËJv0„+~½,;Ùû™îL;”áO¹–œ'©°RËû°ƒ€¿x…¨ê„Zùü™¯ùf«h ó4§„m‰F€•7þñ-(ü™{¯´V2â9ÏTnñÊ麶ÊqÌ%PáÈà ‘­m !¯*A y ßò',‰í\´nLc\'C%²9KâÕ\íôh8WZ×aÎ5Ú¤ÉèIæqIÕ÷ëçˆ8‡Øâo>üð·¿þˆ»K'?üñ?>~ÀM¦Ý­¥Û뻓Ñ9âÓ†~& =æžuŽÈŸX·€©Z@R- `ù#‡X@þŒj9hÝ®áJ1ƒžìI¡¥Û @|ßãhÃÅA÷("Áع2&7ΑÏ=çÁàP­8Œ§’ÎVáû %÷ضÜP|Q¡>Ù<™DSY4ÅŽ&êS™¬¸1„üáÊán7ŠyŽG©-rôS; åa ³£·ßýøáoßýõãŸ?|ûÃòðãþýÃ-¾®Rdžu-ý\†o^"ž}†!eO¨uÄ8H­#ÆAj1RëˆqZGŒƒ.{»¶¼Fõ.rÄõ§Ïy\1H ‹švDÃAü5”9H»|“›#>î“üHÊåøÂ5ŽWÏ5çF.ñ…rPˆëþY • 'œÝêÆ‹ÝŠ{9%èYA#‡¸ôô¸åó˜‹à=ã=`Õke‹••SRwnÿNH\$ —YŒ8õP—WIzD®¿õc1ÆØ”òdt Û:7cÚÂ,1§ñÊâ¨Ñy7Y€æ”įâ@‘* r"¬i”]ÞË=©ì’UB¶¨ S&M!^TÇÜ/’&´‚I6 Õ/yzŽs²»ŸÃ`´7¢Øç ö„n0H7 ¤ Ò éƒži0´§UƒÁ€ºÁ` Ý`0ÐÀ` ûÜ ÞçºÁ­ÞÎ`0ÐÀ`0ä>¢yÊ34½B›‹]rŸ°-¹ºß.mjJòg5ë@jNYÏw<==Ù1ïµwÕ¤4æ=ܵô®èÜs½Vn±½¼?"_wéh¿!qgB©gI™š.Ǹ—ŠKy#5†|æ”§vdØé¢ X}/ vð¾áªàþz a¼*ÁãâG™’» çá*T¡nÂU­Lãlü Å›'\…ºTVQÞÓ{·¨PU}|;"íÑ¥<%V$­n‚ßû„4¼8Ö¨_¿•¸Y ¥åt y±Y.$ —¯çAG¾×¹ AHÜçªV¶tÇ ´M;M×Ñâí&‹ùšØ¶ÇõwÖ‡q/ÏÊÆ¾ávÐÙåHK¸övŠ(žéÕ>éQ_jº:íÔ­Øñê (c‹\ŒVǵ»¶v¼:0_&Jâi%R«à)¦ÐïwðÒË0]3dZxeÉä$PXUAÞñÛYáCå>m›’F8%‰²ª+vÊ/oU…&o•“8ÓÊ ›k9æ«•ú¡¶RDó¥ó¤“m¯BŠxçÃlå`F«¯:­µÊ@±½[c¸~(dk>`ýp,§PHK¡ÜTÿÒ¯z !°|0¦iÚy–ÉÄC×U 4e#×çjIQ17<˜lRðyû'j˱—¤YÔ·vp…â´cæÀé=kl‹OòûCC[â!bºÛ¢Î^˜4…}/M˜ƒø»×|’ QÙ1z ºäû»äôz«Ðêäô´—û 6 Ms°ò®¾D‚êfô€ëL¶s Â=y…hß|ªïqPÚµ˜Ô1Šºѽ^]wñl)ã…ÁÉ®’p| (\½‚¼×ƒÚä¢\ÄS¯ÕÃ^„ƒØ[K+rÌA+I3¨¶Ñ„„Áih´Üb ãíy¿QåÏK·aSå:îÏwΈ$f+|¥d%§®aÈ7Èö'L ±†hš–i)¶hw‹{¹sjÎe7Æþ„±Á ­õ€±’œ¾åÁ$ïu¹¾äï§HŠdoCº"5®e÷è¯×FÁiŸè¥î‘¡¢I[Íàí~áç;âå9|½û‡Äop'oE;ý™œµ- [Œ­¥vQD´´÷UZ÷nóºùÒ˜-™ªmoèR‰a&DbèŸJ#ÖŒJ">0B¼@V5Œ´f7÷&cE„ç]Öù鵪Ãr­çN{1ü+žIa°áüÉE¤[qÐ/嫲Ln•u†lê-ãÒSÞ)C†t<ŠÕÜ'­9É%x[*P Û„ŠÄé¶Ú¦ß5¬TRux‰½dW=/[ÆÐBòÇeGÖà˜u¼ºÖÒÂy0Ë`§‰×u 5  m“É@¬¼±Û„H)Œ0P‘c<çNI[7Ø#³Ä〯Nc_8°j¹‚ýs‰‡> stream xÚ¥]Ko$·¾ëWè ïÚñº—ïÇÁ‡lö!Ûv¥}ÙØA`H.ùû)öL÷ ¿*>Ɔá±4þš,‹U‹ì’ºþð¿+uýáô¡k¼§ÿøàâõe_=¼¹zñáêùk{­õõ‡_®ô5!®õuR×Ñ…%8{ýá÷«/•Rñ«ÿ:ý·¸˜æeùxU>Þž£s^|Ì }{ŽÑ*-Æó&•ÕNÇ%fÏp_—[!­[tt ùÅ*ß.î›êïKzé‹Ô•a PƒÂ¢åãy¬PQ/Á†úT>>¯=—wÕ3™°ž«óõ9È(½8ëuUþû¤k½D®Ò“Ž>Uhãexÿ5Èš%ja:×Ï{.¯K‹`"«ÐÇÅF#kìÇòñ±‚¯ ØžI´*,6ìpÏh•Y”f<0 ¬ö‹qÜ|ùxºÿ´6þêí~øñŸW¿”_#­²½é¨òR='|‘ iúæÐðᇭY—·fm>~;Ï¿ ‡á¬O.ͪë7ôﯛÊçîÉE”l€,ѤxRé¹Þù(,ÝžV~ù¸Û§÷ûêécš”}öpØ­ìýþÁ§Ü«Hz ìéÏ•]d²ÌÄå{ü²Fù%ûÈP?UÂ*EÂy¨÷»+YMìµ(kJxØ»0qÑÉŒ±äPŒë b­§Õ{‚Tp—[|9ÀŸìStrß7V-]¥y7«ÎÇil¦È¡½U~ð6|@\(~)®ŸÈ¼Qqs¢´'T ¡ê=DÞ,8/’yInbDšT»Þ×À»=Üß²§ËîJE&­™‹‚•÷\‡À’h­/y4µÔqàÊ^õüüµO ¬ìÙ$ Þ‡ÌA3`’VøÁ 4Ô °F=ÝÈÔÇi»8оV>^pHU‹K™Ë°âEi“_<L×N‰j"CAZ·ødÔyÑŽ÷¼:‹gõhˆ"&ÍÛûŠC‰#š…®×è\A£uÃûT:ŠŠ~b>4šO€çeØñ‰÷Aãó†Ë  ´$Z-zg®bc]ݲK;´Iݘ ÛòèbçÒPO«µ®h¯,ûA_³µ¤ÄÛ¿A ãU–…H }olÇhjP¦–ƒ¬¶|¾:ªQ›ÉÐf¹Ñ¦=5|Òˆfjß…©½!'‰±‘Vuì«^gÄé†êë!÷È'=cj©þ?EeN̰&xšV ×ñ] "lùÂa™"¸X÷54´•ä«ë3æ’‚ Ó·¨ì ==Ô ¸xÁÑÝ3éîTgÖâ¢øâúµC9Ãgù#äÝLæ˜w;~[kƒ¶Z÷ÍAr™›`­Wci/ÄGqÚÒýXSpZ£‘;‹O_³g,\ÛD;“"i¦hΓ[®KÛi¾«xúUMÙ ¼ÀP«x^!i‰¹¢)@†»G¨ÈS¤ž;<àCž"‰+ "c< ½·K¢mBoöëó‘Þ:ñ¤Å¡J4P ÂG*a24Uâc¬Æ CŠ«é èY "kUšr/Ò*b&´º1œ®¡m|lÎÐv>6ih;|‡ ÍŸ±> M$A=mì lN•!vÞ¤×kÖCVƒÇÞ½ãK³¦]Ô"±$”Ñôl—Q×Éñ´žõˆú.R ÐÌß$¥wø[·Í¿Im^Ê߆“¦ƒ#Êã[“Öâw–âzîÏLáwÂì1zg²ã ‰ôÎÞ£w¨ÚF®QÑÆœû‚È߬åËîøï¤eî£eÛ¼—IŒ¼ЫT`>¥Í‚†[ì…ˆm Üp> Ç žŒL@Õ& ˆì£­Ôs'Ú|m%q_ðæ‰ÞpúÚqšb–oª¸§XÚ—"êFH‚Ø%’ ò9&­¢Ðiq_ðl¢%ŠL†ÈÄý5A qq1¥¤Êä(`J)FŽiDH<Ë;3Þº ÓÐÈ´>4-”a`ZŸ3-gL PÓ¤lZMëMKs9js(ç°)qPË(:ZÏ¥S‚}Ws¤ “®f£ ³®f£ ˆoSP4q‹ÒzŽaæ"˜ƒ÷´A·žÆÒZËÄ<ºžfã”]Ýn„vR·GB+«Vì$lZîÖš„¶ëÛ6BÛõC¡EЀЊ3#ZÔHhE¥· m¿Í#¡Û¼Ðví[û°8þˆ—ãaëfB©&…';¥E±<¡¥ø"¸=Ýæ¨™YqZÜÕ¼®A…¶ñ5#±Uµ$týTƒÜ æû4…öYˆÖ/÷ +oåÛN…gçóVâ¢Ä['¸( :\=.ŠP‘0H=wÀ‡„AW û.«ÙdBç“a.Nœþ#h „TÂdh«¤øîQ2 Ab2 AR2 1óɰ¾¡mLdÎÐv&2ih;|›‰LÚ– š¾{ÚØ¹Ãœ66î *Cê%nsY "w`j¸‚Dwõ/sÐÌ$¥w¸C·Í;Hm^ÈD­è=ÝÄ·µº\]‹¦?1:ÑÂË¡?1º©(kúäÛðh‚ÇpÎrÌ}ëέÛ7@×j6jͳ!è¥p— XÃKИ¼è|…Èg­ÆPäQSeôrZO.»í9Šsv‚£ ªÍQÙá( *d©çN@ø0 KâÊÙšiŽÐ 8ŠN*ÐH%ªeh«„Æ;æ(’9 €DŽ˜yŽÒ7´#G™4´£ÌÚÆQßá(cCÛ9ÊÈÐDšÐÓÆÆQ&µqä(²2ÄÎAâGÕ sTƒÈQ$s8Ф‘£ †DŽ"*½ÍQúm9ŠØæ¥†YJŸˆha¾ê=³ä̛ʭÔ±œèd?Cc 7,Ì| žâ +aeÜBÜ ÜKT™ òxå41wÀT¢ãqç5? Ôšl, ´Ö~qžoœÇ }9eúc>r›üG@T›# ²ÃT ˆbÏ퀈ðQ@Å¢n–# tž#”ˆ2VI¸è>6‡* jV%Î9‚DŽ€ ‰# fž#ô íÈ& m㳆¶qÄ·9„¡mahhR˜îjcã“Ú8rYbç q›#Èj9SƒÄ$r 8‚¨‘# †DŽ *½Íúm9‚Øæ…‡)r>_G@Tn%BòúbÑ ÑDþÖ8†ú ³”òÒ·‘§ë) T˜D&# „Hd1™@Ìké8¤;A›Ì€9½ú‘ÝÇQ|:O¯üÞ²×þ7*afî#ªC%Ìôý`㦹è~0‡qÓÌÞ¶zú~0B/ jâ~0‚F*Q—Ýf24UbÒÄý`‰TA•@ÌTÂLÜž4´J˜Ëî#¾C%ôôýà¡¡‰ÑÜLÜžÔÆF%Ììý`”¸C%ôôý`¦‘Jè‰ûÁQ ={?5$S sÑýà~›•0þ~0Ó7Ö©yɆãÓÞüÓ™“ ÙÃeÖ „…Óuˆ÷s†7{äµW´ ‹ÎÜÿ×U šn_:$@¤tH€é ÛÎ1j›0s©Qí¨ÈNÔfP)D‰=·CÂG!JWQ>ÍFm„ÎGíâ4Ç*q]EøP%ÎͪÄ䉨 9j›<ŽÚ&ÿÁ¨Ý7´cÔž4´-jÏÚµߎÚ†¶Eí¡¡I³«-jOjãµeeˆûÙK²ĨÍÔ Em‰QAƒ¨-ê_ŒÚ¨!1j‹JoGí~›Ç¨-¶9ˆÚ¥Ê‘¶çÕöaÀ€y*@°J!ùüžRZ ùaz¢¬ R¾Íd./(±Ön‹Ü,Ö×ûEÛ­ Ò”Àëe[«Ê) áOÚµ#FÈ4 DÊ4 FÊ4 ¦}lH-¼Ðm—œ¸…~J„z ìý bå†Ïê‡ÕÙ ¢ÜLX$•øÁ»íå-.à)ù1WòX’N»c·Cݶý‹ßN_x í[Õ¹ý—c¸òÖZyc{~ûâ·Ó$ïúÅ ß~)Ï·*TêRW’èA5‹oçÀg5•õGeÐ?Ð?4ðòyñÕ‹ç¦ÜÍ!«X+¤8ñÅóZÌòn»Q™‹PÍ©€<(ý ü"Çé-C¾iÜþ‰e>9ü%^äVäôtÚ<ܱ†¢†ÉNñ™ïjÍ"o·.ç¨òúÖ ‚>¢û²Q3P%ËŠµ\$^ŠÂXZ™ vWÓâDþTŽt´cRÜÀîk:`ˆxªJË´ÜGз5pKÔ~ ÑRŸÅ9.“PöÒ“`©o›¦ìèRš°Í’++…GºSi•'•åYâ—á¬)U¡8ø¯!Ò}%$‡ÅÍ£ñVçZš0ñŽë žˆ™çóqwV½ÂƒC°Dæ’ª'úý_oß}÷óû?¿|õæáÕ«÷?ÿMv&®¼¬¸‘ûÑó]ö¥1’]·Ú/búÕ~-VûE¹c#UûE\»Ú/"gªýöE=VûEXí—G¬ö‹¨™j¿øŒXí—«³]í±ƒj¿Lf©Ú/ë¿_íWA¬ö+j¬]í·;¡[µ_ñKÂe“”ëû©vdxJ0¢FÍS²|—9\*œ–ÃÀ¦ÊžÛ 2¶Ë '»Äµzieg}ÆÂØïìé÷µ•g·Ÿ7ŽG.soX{µ&ÓNüŽ}q„W_œàþËÖz(©Ay½KÃYŸÛÐ(ÊÚëŽ"æ%®®Z¦ŸLâÚ¯Ïuh''¬6…4g]Ü´áµ,÷”¶ìt2×4£³/½ÝSSÜMˆ/„ýb>PI5¶3…y>ºOÇ!:tÙDIµHù.j†{‚‘'Þs]©(“òL½Ë+õ‡Êf @àžmwÆÔ¼J/Ùs¹UM«ˆÑÆÔ´‡ÚS˜|ð~À ¨rô÷zÛI»m«û–Uî‘ÏÍïãnOµN<í¡-×.ðHÚæÃ{>Åu´É¡­ÄÆtHGô¬¤Ü3‚ˆ ÏìŒÍ+)/Á¤•Ð5dÛ7G<Â×7“ò:’f~3“³s‰'üÀÙ™Et-…+Ç‹¶?hç8žV¡]¡¸ÛhqÙõ5éÑ¡¥º MŠ‹1|âxÉ2ÚX &Ù_ÄïÛ¼^ø^Ë?†‰è­ÙÕ\ð>½$ oC8½(ûÁjC´Ml“LSv;žn8Ó$â“cÈXU¥Â}Ñ:¨,¯ãfÞ ´HuÑ:àZ……J>°”9Bü³Óa䥢 ­=ÙsF7xUtu(, e{Ò•ƒ¥ÄAÏðHÆ;-ë¦o:Ä%„ÖEËI¹vWCb^ø‘@|Ž íZÿ 0“´¼¤H¼Ñø4ß[(Ú¥z„Y ðN1AÀ¦2`Ö@ÉM¹ÓÍ:n®l9à§=0j¬±·Úv%£á7%Ýá+ŽÞ‹=ÃßG(±˜ˆ¯û²ãÉdwäÛ ­$€µË‰‘­F6Ô?·è¥Æ4÷yá/ÅXÒº<—')¦šïðìžØl"žZ3õáÀ5Ѱ¬sƒ šìR-TZË%ÏL?Ú>ȸOòáCRd ‹Ž¹yFà×w"+ÈK¸¸¾s]C^í›"vBPþv •µ rvç¯ú`9\Çù 9/ùnmP”²Z{Ö¥_ò³#&¯B­ #vâˆC¹"Âú?ÝøüãNåØ}0n¢UÑ ÆMþ¾üQ®¹q›u?&ŒÛÔÛR]n‚8&„)…/RBøaŸ^–±F`½Ûv%CEeß±°õÐ"ñåcSKÎ)ËàV»ü8ÀÜà&ZY¦¾ôË D9=”€ŸØ„˂Ƶ˜ -wµ(ê—Ö˜Ã53eT<OÜ_ýg½ñ;}ÆlJúžl©ü¹Çó_Ôš¸?àξª Ûóÿ¼ú|ýoj÷ÿ_ÑË endstream endobj 262 0 obj 4887 endobj 268 0 obj <> stream xÚ­][Þ¸‘}ï_Ñžñ$™•Å»´@ÖëK'12vÛãv ä!@,Ò l^ò÷·J’uÉ,‚ôXú‹dñˆux5ß~ù×Í|ûå/ðgžœ þ¢O·ÿü›¸uÿþæõ—›WïÜ­1·_þzcnqkn×å6ù8Eïn¿<Ýüð8ÏsúÕ—ÿο›ÙN>IÐüóÿüDà&M!­~G@6N6H›³sçÂ”Ö p–€¼Ÿ ô‚€‚ŸÒè{üs>áŸüó3I¸Ì“±I$¼—5_Í´z#ÿ¼ÌÿúŠiÞ~¹¿Ç´Nцۧí2Jáö7ŠjŒSnðúÎ2áõfkÿçßoþŠ—i^Šé4¯I§ÜX˜i¸³ÞÿqšuiZÒiÖ­uvµë;q¯Î–òø7šoßÃÿÿv²s­É郙 7Ù0Ù%eŸFüó ÿ|ÎîEÛyp˜YœH½µòþyOà«›#3[)lÚU€¶Çá§\¬»ÜÔgB·†i‰F$|)ž?GÈBûw´LøTjÅø–Ëò –ÀÀ³P¥™©]{ {é.ã¦`$uqð¯Qú´ûܹ‰Q$”Ï]΂•ƒtλiô-çþ¹\’„òO²–‰‚ 1‚ ÇG‚Jnr&Ôgá5»¬Ó‚ýÞ³½fæ)®~Àk9‹V½,<.uªe×4­ÎTË$@˜_P-Ì f¨Zs€G^MnÜ9lÝÉlfó Êf Ĩu lÆ™ÉGY}CAËäœþ\¤ šZy²6¿z7ëi\ã4»ª#%Ot€ÂEz~ƒí^í´,VÀÄ?¯³óR}¯ò$Û0§):#ì*c&ëef/((B'+°áñ‡œ½Ý®µÿ¥8Ü´áºnb ž›ü»‰ÙÑÝÄ˦º‰[ÒÜd´Â<çúoOÚBêo1N$U¯´žœ#_•r½Ôú0ާ ü´¦`)- ˆ$»~-Z!,¡MV­`Ö8På³KäHªp»Ë=Íœ$Š9úŽMì(gaÓeËt•…Xg$^R:ÆiÞÏòä2#"Õ…µÝºÆ@Ã97LQØei÷ƒÆƒæO^€(È‚%I™7 rÊÈ2n=õØÈM¶Åh§‚]sØÆAa‡«Ã6‚a›×†m§Û8H¶qPÌü“Ú&E-²”÷ÊØTHe†¼±YV<Æ?ÖÓ€ƒWΔë4gäy§à÷ÁOþ7~jè^á¸,²Z…^nùœ¦óÃ"É Í³O7Ø|ÙžsKm/‰ù|ã°È³ÃX¢'¸±“8”©=ãçTÙ߯c<34^ßðŠx'Ø™ÖTÆ÷«ÃÉ -ר'¼¢–¡”Ëlú¸>ì‘œŽ²¢ÀÅjBÅ”r[ìÀ’Ÿ½9ÆÊå"ó%Û>ù’Í„!ׇÁ˜:ƒÊBÉ„¥:X“´!×$“ðG)x5X’ƒ5ÙâI›êFªìW?û£+Ë NP˜“íÔ©n˜*ƒêgæ/ÝT§)*&w–(ׄEÙde äp©ÑÂÓ~'Ss¥ºÔ8±ÕÏáÈî°´_œT*¶"s;Sèõa°æZ±™-Ô™°T;•ŠÑ)ôšdrBæ/¯K²S©X<¸RßH•ýüsÈÜ]Yu‚L¥bïàJ}ÃTäŸCéô¤›ê4™J•É*ò:j“Ù@³9{%¼ð„+åRãÀV?û#»-ñy‘©”mŸDÈæ¦ë#?µl3[¨3a©*e£SÈ5ÉäøÌ_^ –ä R¶xr¥º‘*ûùgŸ¹»² ê…JÙÞɕꆩ2È?ûÒ+J7Õi •ŠÉ*Ê5¡V6™ Ôy ¢ß,<$‚U7–ülr¯”/2•²í“ÙÜÁr}$\Ë6+ FôJ9Ÿ ÙèÁrM2)Sz%’KrP)[<¹RÝH•ýêgSz%’A P)Û;¹RÝ0UÕφôJ$:M¡R1¹SE¹&ÔÊ&+†ôJ«+Z /h+7–üœµR¹ÈTʶO"dsSÈõap-Û¬,­TòÙ¸L!×$“(Z‰æÀ’TÊO®T7Re¿ú¹h%šA P)Û;¹RÝ0UÕÏD+Ñ<ê4…JÅäNåšP+›¬ ­ä­-Z 'žH«n5Nlõ³-Z©\œT*¶"s;Sèõa°æZ±™-X©•J>È…btg ½&™œ[i%šK²S©X<¸RßH•ýü³­´Í N©Tì\©o˜*ƒü³¥Z‰æQ§ÉTªLnT‘×–P«˜Ì,ÕJ>Ø¢•ð‚D°êRãÀV?›¢•ÊE¦R¶}!›;˜B®üײÍlÁH­TòÙ¸L!×$“`*­Ds`I*e‹'Wª©²Ÿ6•V¢Ô •²½“+Õ Se6T+Ñ<ê4…JÅäNåšP+›Ì ÕJ~1E+á‰`Õ ¤Æ%?g­T.2•²í“ÙÜÁr}$\Ë6+ B+•|6.d£SÈ5ɤŠV¢9°$•²Å“+ÕTÙ¯~.Z‰fP'(TÊöN®T7L•Aõ3ÑJ4:M¡R1¹SE¹&ÔÊ&+D+\à={%¼ ¬ºÔ8±ä笕ÊÅI¥bû B1·3…^k®›•¡•J>È…btg ½&™@ÑJ4–d§R±xp¥¾‘*ûÕÏE+Ñ ê™JÅÞÁ•ú†©2¨~&Z‰æQ§ÉTªLnTÑ®kj“•¢•BôE+…ÈFûÕ ¤FôŒiYõ–¨V*¶O"D:ׇ֧Aµz¹[ðR+•|6.D:Ö§×$“à+­Ds`I*E6Ú¯o¤Ê~þÙWZ‰fP'(TŠl´_ß0UùgOµÍ£NS¨é`_^{J­z)ó@¬¾h%¼ ¬ºÔX=cZVý[bÇ´R±}a¥c}z}äG¸V w Nj¥’ÏÆ…•Žõé5Éä¸J+ÑX’ƒJ+í×7Re?ÿì*­D3¨*­l´_ß0UùgGµÍ£NS¨´ÒÁ¾vM¨U"e¸¨iý±ÒúcKâÁ“êÐqÕO¸OéÜ ™/N í6Æ/fvvÐë=ŸêÇÓVN]¯Rì´)ÆvVÐëlüüñ´µ'­-Wð.ÅÒÁ‡úF:ìæŸNS{ÊÚð Î4)vÔ7Ìa8ÿtšÊ‰kÛ'>Ó£2µ5¿r]ýû4•×¶±aƒ›ònÙàKÈ+7â `·';òEfÇi–Z:ÛVÞ8¬ ÉöN† h¢'iõlhyãÈæàJ¶ºq…äAS;‹±|™`=V¬‰uéÄúðÀBX,é¬Þˆ…Ã1‹Þ™Ö+JSûbzµ3ß+–æ|ż[g"PÌALŠ ™Î ‘˜œ˜%#õÎÔ˜µ˜>C¸Î˜RLg Œ+…¶ï 6Ä8w`À!D_G…ŠЀê !Q„*îÈWÚ1N¨¥þ> º?£»g„íJØ1BWí»; ø.–t1·»ÀÌ77 ¬/Ó5¾îº#_óXv¤K?Ýå(¾:°EWº«|…l`‘‚Nw'¯ùÂÉÀÜ5?ìÎiòùô)M:­ÔêâÓ¬3]t¶¡;Âgß&@è ´;0æ“2ãb:fiŽø8½3t¢ ·'»ù(®¿)‘îëî^c»$¶¯Ñ=DÝ=M|?ÝÀ®&ºµ¤»Õ…o³ØìBwtw@ðÝ7{ èBtwaœoÊX§ë“ÝõR¾V?°bJ—­ºËh| w`!®ftWWøÊÞÀú äîNºóŸiw:÷Ù‹åë³±tJ¬;Eǧ‡&éèLJs6‡Ïvæs舻7üçóJýmÒbïjg3-ß³=°Vìiìl²û{öYŠÍnÝwbãçÀ<± ª³-KìØ™%¶Çtö눭b[vľ‰ÎF±‡h`/‡XPï¬ð‹Í%‹üb¥µ³ô+v ¬þŠ%¸Îš XŽXk3Å"±N9°^$&í;«bk`!AÌú6¦žÅªFgöY̶ç)Å,øÀ[|ƒ}gÓ?¿ddÏ?ßxÝÙ .ÞCÙ Îwävv ‹ ê#»„ùVÍÎöQ±sydû(ßÃ×ÙW(¶´Žì+ä›»:ÎÄ^Ç‘ g|×Og'’Ø7²‰oélQ»£F¶¨ð}½ bÛÌÈÞ¾€ÜYÔû)FµùÊbgµS,´¬vò%ªÆR™X}í-•ñ•ŒöºŠXµë©ìñ^­Çf²å­GòŠ8tßÎd »üé{üó!¿‚ù{šzžæÙÝFø¯©RÛÂ2Í(ŠYêzúÈ, ÷øEøÉâ[¼ õ' 9íV½žåÄò‚©wxÀOiZ/¥úmKæ#kï¼ÙÚ³Y7çã4ÛNÝ\˜'»4ëF1Áwmeµ¾/o5çÔ¿¿(;žÓŒ,<=0$ÎZ [î³i™üb܇g¸YVškb§´ø^9×4£J;ØÄ=«:f¸¡êÌ<*«3~ É³ÊOÃX¹ t"j¹è{à ¥–*‡™ ÆŠ²°úa&m d–ž]Áº0Ù«.ZO1 Xä]I\¤­«?<Â.x9ñƒåïí´à[î¼ ôâ[ájYŒž†?¶x€¬i‘›ê{q,ƒ_àQT*·§B¡òVg”¬Å¹ g¯×jìô¼nA9.ã­à4ròº ^k…Q•0 þ&À¬GI«Ls"›Ï­x©õ–-ÏX Ã3¡€4IÞ=°Ñð„çùÉ~ò?KëŸÄI&s” ú‰†/$¿ìøY'Q)Óoù2!HÐ=xJÒWŸdéÑ£­f6x¸|lÿ -A`óVZû™Ÿ Oª},çR€î6¦C ·N3ÆbçÀHH©G£ßèa1À[¥ãùzŠˆmƨÒ&¬@$z˜¯“ϳ±þRxï†T†G z+Jžü²ÞdÔõ‰€iúDÍõZŸpxOŸ¨E}]õgT ø)§—é»ÖM[u“¶ìU—zÕeðnuy2ž7lË=Ü8õ>ÿ¡S+µ\á“Á»áS+êki>DˆÒ|¨‚xr·:B Y.]‹§So®e¨28[<]Óä+ “„,¬ š8€aÿìdaà>Øzf^XªÀAØl ÄDDÚ;+ºˆ.¸zžø$¼ ,è3ŠzŒbð.£x:Œbð>£ð\Ü>£ªÁ(†ÔÅ *£^pF…m»AlÐ\€#'º¢AšÁež4áÖêZ²ÊëZ²ÊìZ²Êdøk•ÉhíÄ"ʲà‰ä‚‹+„ 3л8\¹H±Ý»œº±åÚ,ZÇ\›E«êZ-sVÀ†h}ÙµhmuhY´¶úž,Z¨'Zµ†‘¢•9G­šÃ¯EkËd­šÉçˆÖ­MJ É~­qµÉúZ[ðs²ZoÒŒUÕ)‹T@ƒ(™zWV™©â„f Òð; òSp²£P©]¦ÅHs¢’ÔN)ÊÆ½§Fב|Û±Çô&¯¦—oˆP/E³Mn5‹€ŠÓ¯ ¦¨Š“£®'G^(NÓôšëµ>àðž>P‹Ú›ŸRËÔŸòKêOÇqP¯º Þ­./Ck~J׿§Úµ:æ§ÔZÌO5)r*‡AŠœÊa”"§ràøKåÀkÙ˜Ÿê:D‰¶M_œ¡~Ðg¨×}¡eÎ |êu/¨¡^xA õ¤†zõ9¸õªûE¨çÎQC½êðËPß4y†zÕä3B½h+µÜš ^ó Ï§žæYvQK.ÉKÉÛ„ ®z/$ù(-aðä¤w‹ø–gƒÞçÐùIJ€ˆ[Id8|3.Q_˜ Õ˜ y09L Z®ÂàÝ¢µ0µ2õ&D¡îüõªËàÝêò24&7®Ìf­Î€©Õj(`¶(’æErÀ¤H˜ 0Y-[³ç-fµ|‘æ˜/rÀT}¡eΠܘªô€É½ LÒ¦ö4¦æ~0™sôÀ£9ü:`¶L怩™|NÀÔœQ¾F$wü\’‰¾Ó3î]:í1GðÊE7öš­_56~â‹‹“~|àŸMÂÏrØ÷¢|`ľí©ºZˆA²‘è—òëvòÉÓ>š¦èdˆz#ܦ>qb†!&Ùï°ÚšÉ+A‚®M™¸í—iZÚD…[v‰pTCT0䕨à05Êj¹6¢,ƒw£¬VÔ®¨ÐÊÔv˜t` ^u¼[]^†¦¨àÆUQѬÕ)*´Z ‰ŠE²¨£HƒÉ¢‚á¯E«eKTô¢Åõ–/²¨óEª/´ÌY¢Bõ‚.*¸TQÁ@º¨Ðžƒ†¨ÐÜ/EsŽ.*4‡_‹Š–É,*4“Ϭvl#n3¬³¬g:f}“_§¹ã›(ggEêÊ´3n•ÈOüc±6Jg=ˆÒ²Š^L×+LÛÞy§ì´µ{cpúÞ‰Ý7Ñv@¸ûWöç÷bóé,»ÇŸùæÓu±Ï…âÛÄaéØïºeé”,@w2»¶¥M:˜y`ËG5¤C^ISc©–k#–2x7–jEíJ­L]é:½?ýÂAêrx¯º¢ -é ŒkÒ¡]«C:¨µ’-Šdé0F‘,)’¥Ã_J^ˆtè:D‹Þ-_dé0æ‹,T_(™ó_KÝ ªt^Ф©ÒA}®¥ƒê~)˜sté 9üZ:´Lfé ™|†tൣãá1-:¥™híܤôFëÅ*þöýggu¿þÈ',`”/bŸ;á¥xÇKúÞñáu”†è2» Û—Â9蟕H^>[šôX·­7í€jtDA’¡¿"Qß϶]m èn1+òuÐ9ò"  ˜á–g½BÁáÝ·˜ç¯È«eêt<º[]êU—Á»Õåehtn\ èÍZ]«ÕH@oRä èƒ9ú(E΀Îñ×Õ²Ð{ÑbjËg@ôÅÐu_h™³7ºê= s/¨ô€®=€®¹_tî5 «¿ èM“g@WM>' ³Úé]4“ÐhÕ» ;ã9(kÇ&Œz§d$÷-ùt^­ÞLbÙŸ»K ý¤…~ŽQC?©¡ŸƒÞ©oȶÛé,8•ÓM~ï{(6ËI8ûöúƒØ[ÀQÐÌÈÞSc¡–k#ó¼Á­VÔnè×ÊÔý~àÝêU×?ïÝQ†fèçÆÕÐ߬ÕúµZ …þErè£HýƒÉ¡Ÿá¯C?«e+ô÷¢Eß–/rèóEýª/´ÌY¡_õ‚ú¹ÔÐÏ@zèמƒFè×Ü/C?sŽú5‡_‡þ–Éú5“Ï ýþú"Z\´ðjsÝÐÒ/nà¯5FlEzö>9ܾJ~Ór[qTþ©+íª®´sºÒÞ´´…XkVÚ9ªbò*Är˜s´\1‡Á»1G+j7Äjeê‡Xc&¨W]ïV——¡b¹q5Ä6ku†X­VC!¶E‘bÇ(’Cì ErˆeøëËjÙ ±=‡hQ®å‹bÇ|‘C¬ê -sVàFˆU½ ‡Xî5Ä2bµç b5÷ËËœ£‡XÍá×!¶e2‡XÍäsB,oíX¹Ïfe¬¸1f8m;ÙzMc1(J>lÏoD`l† s< ‚£>(qÞNNãÈ<0.^šû/:õ ÝE”â²~c†”Ãi抙Çý5É®a«ãWzXÔƒXÔ·2t¼ãSôÖË&û×vuKçu­8òB ˜Õ\¯ƒ#‡÷‚£ZÔžPËÔÕØvg8¨W]ïV——¡¥„qM ´kuhµV#Z I‘S RäÔ£9µÇ_j^ˆè:D ÇM_œZ`ЧÐ}¡eÎ |­t/¨Z@xAÓ¤jõ9¸Öªû…àÎQµ€êðK-Ð4yjÕdG üÛ<Í&Þ~ù ­«§œs÷Zƒ‰9÷ ÛªLº¥"0œ]lº‹CŸp¯[”¥]$ÇÇÉþ„âæj±”†~†a3ñå,ƒš:/ÎAÚ„>Ǩú¤NèsÐõZ>GåM3­‹$ŸØê¨†o\á[Y^Ïw1®’†âÜìy‘MõÀ5™QZ^_c°ÌûÛ 8ª!zòJôp˜ª´\*€Á»*@+jWôheê‹xÝùêU—Á»ÕåehŠn\=ÍZ¢G«ÕèiQ$‹ž1ŠdÑ3H‘,zþZô°Z¶DOÏ!šîhù"‹ž1_dÑ£úBËœ¸!zT/袇{A= ¤‹í9hˆÍýRô0çè¢Gsøµèi™Ì¢G3ùŒ ÑVj¹5¼Î ,ïQ´Á×ê{ExÃÄ)Aû”ôÇ’ ßnlðóÓ"ÂC¶ËqÚˆ²P;PåDÏYñª*v Y‹ÿ8»pxþ·ûþ5ǼüúE}ê·Ç7R–¹+hpíÔoZNl;¯²´àAôík1Óœ@¾¿˜"[ð]S §oÂâ1Aú³¬~†±p(XYšßÑç´¨´{O1iûæÑ/Ù॒ Ú› xw²Hò[6Dx|eÁ>Pк}Á‡ƒîxðÎ Ð'ç]²1uhŠÛ1aô[>“ â2J/^&Qz‡Ÿ}pK››DZË2ÀM½"tPí¦6‚XõV’/†;-o%<òU¹Ù´ì¨”$éqÑuº˜¶S9ü+Šž[ÙªOÖ!¸%€ § ýù?î>þîÏŸþó›·ïïß¾ýüçÿÔ;“0ûíDXžt?f¼K×;ÓÙÝýÕ7! š' z“¿õ¡!­.>£_kç ³+­´ÉE çÄP1 ƒ¬À¼à‡ÿ Ä ¤œ©!ty#â=öd¹.¾¤¶õØ^•ÏhA·¼•Žy_mQÊòV’ɺÇzüòÖ#•§ý"m P9N+7vxu#¡}K^JÝQ¬Ã@Ëcò†cÖ“+:¡\œÖW\‰:­¯Žj 寝n˜#ÿ-ýyÑû,"êÒÙ-Ûl"Î=ï›…vÛ’êEê}ÞÆ®èR™;Žs]·oFqÔ‡lô'aÙ(ƒ#ÒÐx`V&™ý#íæ¡ß6«@}ÎÙåÚC_¨kœÀ¼“ŠG.µ+²M¹Û©ž:ï•Æù|ý‰¹Ì†=’[.&hÄ Ñár´;3ÈÊ}Þ‰Ö(ó\ò¼E™wfcœëH"ዼÎæFðÛ¤Ðëpüãl(MðlÔEÖoÎÆMù¢;B•ÌàÅà‡–¥õïÕ¯{ ¿‚rÝÆZ½JxHÆvZ?>ëåÍ–ôÆnõ[Òãç¥ÂXK®WGro¼’›8îSº˜AÙÑ–pS¡Shø#<»8à܆°º!7”) ¶{$ü$·éÜËù´ÂÐ.]?­ä$æ…òĦ)­«@&ºR´äGá»+Šœ·•†Äs†1wuZ»Û¾l)«òc™ {nQ7f0sßqf¬K 6V‡Žeq>¦_/Üã°ÜéŠc0d‰èö[ÙVŸ«Ïži‚À± ÝUZ$†D7%®IæEÄ$ ­wí¼p‚׸v^ë¼M¼qÌwYT/§ðwYð .ž³Å}²2ƒ—tcÏyãa—Þ3ÂöÕ Ž+[”ßó^/Ñ?Jþ­‘ÒÿAÆZzÍ\ ¿ê#7xâÀ¾5ëõ+@ã3Ì>}¹øÈ1os›‰áUZGËÑÕ<-À– Ø)z ç*á&?bõîqCÛ1Û½¶ŒÀ:Æ øÓsLZ@ +¨ ú¿óâÿ“_`ܱ8Ûö üˆ[ïZ~ÁscZý‚{£Y{~±xÜŽó ,jŽÁÍ Þ\ù¥ ösòÚÐGúy^´xè}‡]8};ì²ÉÀ0a”]ø ñ¥Ï.»úi‰ÚÓ™4/:ü&§eý³Ã×3eë<ð\4ª¯?Èù7ç¡#—/fƒÝætšMÖ-ÛÂÃÜñÛU2÷g>A·¡_±Oûrc3/xбßoæ7 98¦.7Õï×ý=h8üjƒµ‚¥wËvrWϲ‡‚K\ÄJX+X)c¥Çyhé³®?DLk…?dˆ ½dX ò;i8ûäµîȨcsÑáêöuå+¯Ê6 x.MR`¿Å¡'sÆóttàåÝö½8†¡óÞ/û úÊ?甼(äÅàÖµÀ1w|Ó‡ÇÅqŠùH¹êLäõŽ~ n´b›í6~øžR‚«h‰ŸDÿ‹§ÌoÔZŽ=›R’`(/üI2ßXcÓWa;§·WÀct9âž>~[>e˜oÊ[jØ£Š¦‘›Üðƒe×rZåò0¶AiœPÆhÍèæc–øÓÍÿnë¤Oð7­çOWŒôbÞfNw\u‹@Ïô¿y¸ý°ûΚ è endstream endobj 269 0 obj 8494 endobj 276 0 obj <> stream xÚµ]Mæ6r¾÷¯èƒã±w ø%J äbÌz½Ž‘¸Çc7˜[€ÝE°o€ä’¿R"‹õ%’=@ÓóRzø*•ªJU”´>øß§õùä?ëâlé¿°ùøü?›ÞÿééÛOo¿sÏÆ<øë“yNˆgó¼¯ÏÑoËæÝó‡ÇÓWŸÖu_øÏ¶ß/>îó.ÿùcþóo}Kˆ‡@1fÝ$å§Õz‚3v1~ ³fÙb¸í8ÿù…À]\Ì!Gÿ y»x#C²…°» ä?’Aý‰ô‰Ûb‘’ÜEî_æ?ïóŸ—ü磘‘5é¼+ìïŹ²Ö.Ö8 ùÏøõkîóÇOIQ6ç–=†çÇÕÏÿx2>¦“‰P­m—³yv*¿ÿþôWœíX¹¬=Píˆöj"6FæÅèGnµÚýº6kÝP˜È('-íñ87T:×6] "¾Z••’‰1ü‘[m¾>mŽ­áíÕ*4dŒÌ‰±Üjœ!xò«^­ÂAØ0ØÅ´a³ÐY´\Ä-c sízmÈìY5Òqç Úp+Ùk9޳{m =þªg@Yu­mp+v¯H¯ÉÐ:£j]£WGÿ¬›äŠ4Õ¸S#c²‘Øû—}6¬FQ|f}ÓÝrºç ÅN»t»¢±´ÓI…ãÐN3ÐÈ1øgÛ"Æ£Û">7Õq¦[;=·¬F]S³™t×›|oM Çô×Ôp´º¦†ƒäš·˜œ*“¸À5pË®áÎ ðÇ3¿“ÿü+]4“€tW¬Ö‹\³Å%Xy\ßP+“ÄÃxbf&].›<øÞ"›îb7}©Zc倯9 ¯+9 Ÿó€A ï×à„Äû¸~XZG¢‰„ßîh«#Z£Õ€.ÚRïiL¥p6¸µŸ¿€‰S+(o©– šÃË uÊå7pÑ‘®:„‡9çßdŠ.ZÊ7Tîò»q³±®|¾öü›°çt/oÇÊ^@LJ+éäÚ#g“1YaÑÚ¦ývZüï¸C²•=KDd²I[å¨P£ºC<¦GýMJ€tC¨`´?–|ûÙ;¢%¤CÓA ¬:Ø6¸µñÃÞˆªžd¨b¡jc#,ÚH6 c€ý•ȸSÓK ­zI6 Q`?ŒRð(¤SÓO -úIÚR÷G(oY9íTô(‹®(m¬´@xuŽtͶƥ®õ"ë ´ã‚«ãëVê>gßM”³+5g;‹Å¬u1×ú/Õ:;ao=œë<ó²]Ø/íidµNMÙQŸ‡`¼Îºl_#ÍA#\šCGÀ}‚±œreÃ5Æ¥7±è ‚ôyHÎK5d;.¸µAa0¨'øÆW‰ d‰„ßœ±FB5J*ìãÈ3rÓÒ·vÂAOX;®~ÝKAXß¡ÿfkhMy00cM…Š.:n㇞^XÆ‘½ÇŒ½×ÑàÒ^dRONÂð´Efß‹'¨]ù:ÖØÉЋ`Œ¸Ó›¨ªŸC'8ŒýŒÂzÜ7Ñû®°¾¯‹·Í ë‰ÒIÐDaýôµ¬›VZOlrVZߟnÕYÜ–ÖÓŒèÂJëî|H‚ƒ´ÒzBÆ(¬´•cž¨¬ïgMU«¬Ç³¦Ê‘¢²¾ š¨¬ŸÓÏ9ÔÖ×åˆÄ ëWAƒ£ôÂú«åU ëcyÕÂ:Gj…uŽÑ ëuWXõAÕÂúø ja#§ 믟Û:+ðZXsS ëêŬÖÕ‹N+¬Ÿ¦3Ám³w©B»xwÐmªðX’ð×§ “‹w^ðˆTáîå`,U˜,àe‹Ó.³îýÂE2}Û¦Ëì­b@®W·àXµn!¤¯Õ-8è¶nÑ=µn1>Ör™3œZ·PÉnë}ÊR·P)gêBà7u‹|Çc6ûªºç¾­[tÏz­[̪Q­[t¯ûZ·à µnÁA÷u Žäu‹+ôÝh(§Ú#Ù#ÿl{Äxt{Äç¦Ú#ÎôÿQº)sGÿq`Žé—.8Z-]pZºØUœP¼*‘ãnŸNÃûMÀÙóÀIþʵ‚·ë`ÈþÁqqé„ôŴ犌rô&Rر¬VδW¸±kî†ÜÖ„ÅåëQ;ù²Àc]VVþ†;Ÿ¸ÉéZê.’ðÇ«djómµµ}™ÚÝ,~5Uy‘w\éR\£Â{å†#Ýž®R³îk;>éApWV4ýÞV—Héè“Cm[Ð0çž«×õûLe5ä#7òm6ÐØ°Z›¼;Ж†YÅgj¦A¹AxËé Ò¼†¹˜[Û¬b¤3_B:¿2ÄTK”k Þ`‹v›2ØÙ¹6ª5h Þ?ì6Í^x Ü”¨Q^:BÛeL¬eð ¬×¥DˆôÔÚ¦ƒ€Íu|ÚåR¢ÆX´oðˆvÃgo<îJÔø²¢ÈVS©F]1{>õéîÂœÜ þ o°€%»!Úi P"à®:tUKІˆøÑnƒ-÷iJ”EGH»-NÄ B 6ΩôÒÒ¦ƒÀ€%b#Ð.E‰€±j Úà?ÚmÀÑp‡¦DÀw*Šh!•2Ô•ÄDçóÕåñWxƒ,Ù 1QkT%jÜE]Ѽ!"~´›ÄDt Ü”¨Q^:BÛ…kYãD "&jãd-@¤§ŽÐ6-&b#Ð.—5Æ¢%xƒGühw‹‰è¸(QãËŠ"[M¥êJb¢4d‹‰Ü©¿Â,`Ñî­ÅD­JÜUŽHýÞ?ìÞhLDÇÀ}š‘x+Ú.¤DË€6µqN-8"ñV´M)€ ÅDlÚ¥(Ñ©¿Â<â‡ÝЉè¸CS"à;…µ6¬R@]7ùœÃ­–(7ˆ¿Â,`Ñnßb¢Ö€»wà®·ï!P…7DÄ»=‰è¸O»•x+Ú.cb-kœÀàeLÔÆ9oééuOOÚtð(&b#Ð.å¦>ê¯ðøa·G1wh·öÀwÞÁ‹VS©F]=‰òW_"ä÷ iHiXÀ ]Þ!¿Au€±žù“¨êEiDÄ » ôC̸GS˜“¬èü>©*wÝY¨ #¢f}Šš\t—ÀoJ]vª«æ¥Šrœ\õÌ—†G¬°«Òž-†7•8™ÎSŽ~UΫU8 âÌÉwãÛËÅ‚ p*xÃ×El—.„üd_Y][~VMh”„&ŸJÖ¨œE*QQÌ‹ñJUΣlWöK*[QLÎz<$åuJe†8u¢rf• üþ|ùܲFe.zԹ؇¨1øAyòÙgJzµ.–¢ü$ÞæqEÖmäéä‰D ÈÉ rD"19‘'·ìƒ‚È[M¤ÄÝàS¤5&î2EÀ?¸w½7!"ħâ¦h"Fá |1óDÃLßɉ€jàé˜ÕêZMâk‡%‘ƒ$Æy©e"/.2”ƒ´©ÈÕO¤MEkU©Ü‰¬šÈo ’."Ó7‘t·¿ƒ{r‘š¸'wGƒ[6‘'˜¸eÁó ¢·‘=¼ú ¸Ç„€Ì—wƒ ˆŽ ¤"3¬±"äLˆdë‡^·š) Tî0½Ì‹3Ùe’çæyÆ{&õH’@ÃÄO‡Îä¥H†`˜µà¹²™¤¹}ÞÒòDÊÌ-¾Ý ñ{ìÑ­Še‘5¾!V¾iEr\!¥…ø‰)­V«g¬f;Q?£¥Œqi…ô&Š+4Ï=λ³jÏDæ&AÇIYV ˜HËÒ Ù8cÇòÄ9;š>§sXq"¡CnƇ –_äðÝè¾¥%†ë?D]~°D€/E™X$ ª¶ƒ²Xµ0QCE½A}Qµ'JŒ¢æ3(?‰šçDJ”Õ Q›(PˆŒñ y-*&ùk‘Pä6EB}"½ÉSUýL™È¶²e,áÑM·„Ýð!¯#žïüÀ/† tU­Y޼œ¾oK aÕä¹ð¶p7ý3ô-.S{½™•÷&‹ŸÝ±ŸGÎæF_8—X­¨¿PP^º}è‡ÙžEù•>ˆ•Ε"¿ÞÊHïóc^ree¤ ãcs~›ó~tlÊÀ\ð_¶õçÐù‡›©oÛ²23 öÓ¶¾Jt6Æëù¿¡èì¾/!Ȧ u¼SŠŽMòȇ² ”ö°UxÕᘼøvêpÌîÔÙÊê5ÓZ×Ùi£O‹‚öÅ+ ª=a•ÞŒÔRý «lX²ù;Š˜ñ Ëqà®\H—%áÈ’ü„Ý=!a×ó oOH0;•Ÿä›œƒx.¦Nv³ä]z»|wžÉïîô¹)“ͯ„sɦh·ÅúR,YÏÏï~—t_Kh~jÊ{edñ|MµL½“”-â+N’ ñU'Émù ’^à¿”'©L–V„y…=ÅÛôóõ{xxå­|>m[ûb±)¶Ì/&›K^ôŸ_L¦‹EŒ¬ã§ö4Ÿ öÉêç;Pãk+5ã n ÷ÍësØoäœm5?4úp[bKW™..íy¹¸n@™#;{CÙž—Ûš,Œò@\ ûfŠùáöC^‘âÁ¿}‰›#GfîFâô™™°Øm“êÌü“ Ù,Fêíåñ¨ã2‹Ù¥ùü‘?>ì½[­›œÖ ÿðb Ò|änÊœþ™?‹¥Ùý÷—œ“˜ýîúçxË*µè_Oº®¼bëa®¥kT`~j¯e ÒÈÞÃôÕ!©rÍÎØã‘n±ÊQ´ðô7Z$R­­¡E8Ï7 /Lò"ÙÊoÇr$ïÀ·ÓßΣAà¯i(²žŸNà(ù8o0éžý0¹ÝG-©F-ÚÀ¨…Á‡Q‹6[5jq)¾ÃbúJ [ÖåȲbÐ/à¶»'pëéº „Fað¡@øn’ïOð ÿ*ÇaœÑjÝ–cÛhßîÈe)šj‰dzZaל–AØ5©ev1ü}Ø5Ö²ëõZ&ž КZª ÄÈlªVò%ÿ°&§àCçwˆã§ üR+@‘Çi!JÐ7ú½]ò¯{ 4Á¿ñ“Œ§iÒ¾Óº”5NÓ(_§ ÏU~¹kç\ÝÇqG0ý’ã¸ü ûî©ÍqÜ0q&5ŽËï<âHÇq¹ÞdJ’+ Ò_Š÷¼8åºhþG).ó=Æ+)_ôhewƒãË®Hï#‹]|ûÍ0waJŠ`÷M^¿òŒêõ ¨Q¤ÁQ÷‘GÞG©9Vuà{ÇÊá#ǪÎV~ÿÂû¤´VÒäåî\²‹n‰·ökþpÛ&P_HÇœ¼oF ßò7írÌMö[ø«r#fû—ÚŒ³˜-}›GºyʧŽèù !Ùí(A7Æç÷R¯rä¨I<¿}o¨X 4R,*ŸÃ@±|J±¼ŸQ,†ê(CªŠÅ0ªb}Áë\‡Åz²÷ŤÈ4Hú[mÈ/Œ±•à­kej¤9iej¤9kej¤Éñ·‘&×n'ê3û.@BW”·cm.93aeòÛ.½bÞòð±+׸Nʵ®º\ÅÈlj÷«4f·k×¢ÕÀµk|jàÊAƒÀU=%"på’QWUÚ·kŸ²®*å+×®B›t;÷Y ËXÖÏ(tŠI–h ½Kq8™ ZO~ßêÖüR.Èxè; Ú–à¤Ð‚Òd¤¤£oMÊ_|Üä±|/ÞÜ ð3vKN\€ÞA}¾½$õþ⦜ëNáŒ;Óë0ÃÅQ¸“!;q'Gªá6p'<`ðax ÍVuò&ÐDà}†‹C§3\ù³¢c0ÐH >ŸÃ@쾑£T3\¤f¸8HÍpqÐt†««ewÌiÄ“ZqÃßÇc-«®¡– wÝ s‚€@A„™Mµ(¨Ç¯ üøÕ@ô@F‚&x(0Éè‚&íû@¡KYò5‚&ŒöbNyÃjb~‹ªïŸ“×Èí{ÿ|˜}OR9tË’h‡ š&¾°¼Íyúð#{èá¥ã5´°É+…×Ð4³òrWCó¹ÊÑoäK¥^i§ŒËæ¤k{Ç%¦^k<ÒÊ_ÖäHŠIni•˜÷ìSŸ¹ìØåɱˆÝbçNºÆ"u‹pä},"šëU¾w½>r½êlU×›Ÿ6Ú¦bŽE¬·a ‘@|(>‡[Ø¥‹0‹0‹0Ðt,ÒÕ²‹LjYEfµ¬Æ"‹LhYE†ZÆ#‚® j,2)ˆ‹è‚#³©ÞÇ"úñ«±ˆ8~-á 5á A,¢ ^Ä"\2j,¢Jû6éS–XD¥|E,ÂŽ-…êD|䕾­÷¬sþž¯eY½RîÝãuºò…^Ànr2ùdÙaê/Õì\¾ûRŠó—÷cp¶$øZÅÔ™¼üê‹@« _ø  c·7ƒÉÊî¾$[·ïƒ™å¯Q®®ÏtÆë1±Ê‡£:qCvâŽTݬ6pÇÍ2øÐÍj³ÕܬIaíä*Ž;òÂP 4‡"æp+¸ŽWùpwpwpÐ|ÜÑÓ2ˆ;æ´ âŽI-ƒ¸ƒáo㎠-«qÇPË„÷ï âŽ9A@Ü¡ ‚̧zwèǯÆâøµ¸ƒƒÔ¸ƒƒq‡*xw0Éèq‡&íû¸£KYãòq‡( 9Vàû-s䥸‡.¡ ºËCRörÈíÂ^ÔörÌO·Keø1=Rpåq¾SVý¬‹óRÅ^æWÓŒÄpÔ½SæÈ{§,ªÒîø ú m¶ªÊ«šç’:ï”ó#BC0ÐH >ŸÃ­@’·Œ£déN™t§Ì@ÓN¹«eÕ)OjYuʳZV2Çß;å±–Si™p=AT§<)ˆê”uAˆ‘ÙT;NY=~Ý)óãW2éN™FNY¼pÊ\2ªSV¥}ë”û”Å)«”¯qÊ\b}§L“ç‡Kênu øœ›rRwytŠæ[ÿÌšæ˜Áƒ7þ†¯1pŠ7i©% ’¿ƒëûSÍþùpë7¹l€ïóáÆ5rmÔ{OÄÐ#G¤ÍTóC»]0°ÛÏ[/ŒøP 3CDÁ'p'ŠàÆKFuÈ £úc†™vÇ=½ªÞxN¯ª3žÔ«ê‹üÖõªzâ‘^qwØAõÃs"¨nXv·“«Ô#W}0?rÍ3Œêwûš•»XÀD¢º_MÈ·Þ·KXœ¯Fø ß{+†ë›tRùi÷C=©ææmùžÙ{Ãûün&Ó¯iÁÎ,ò«‹?£‚ðhïÅ Á¤ ó"¾%ž¿Ö¤=a‹ò[qÉÿp³”Ïæ¯“‹éÝ=5ã’V¶0yqà*_˜lÕëM[ °Ûáú€Ý—ôX\NS/þ~6ûJf^Þ~f1Ê™ò™Á—§ÿÎ_}~¤¿1 èOù»Ïé”’Æz¾_é¡MZûÿýéãó%Þÿ'ü}' endstream endobj 277 0 obj 7164 endobj 280 0 obj <> stream xÚ•]]å¶‘}ï_ÑöLâx’öqàŒÈÝñLÌ[€u°H/°yÙ¿¿ä•HV*‘l¾Ó”‹déˆuT¤î]—›³!¤Bôëã¿{XàÐó÷ûö÷›±áñåüÛ­áñ_&ý•þhåu)À³°Ý¶û™\«üýχÿ¢È—\¸YbÆ®ž™µGá0{/S¬l—@_rÙu! ‰©åR.öXKÙ8¯ð’ʦYóÆQã¹H—r±‡eû¼ÎK*ûf0ÜŒmÖï…b ›Ê¦ ú%˜_B\Dá´‰Y#Ùhº¨Æ®÷z/¥-!9.TÁ²ÓG;gå£PøÑlŸiæN†ÐØ'§+‹Ö­SÉÒLláeÖJTfÊF ÖAšfô` /³F Ô@ På M³xò†°Ä>9]ˆê¡Z¡’‡Ø‹‹RjdjÆHÕf=_ú-Ük¿”ÂÆXÒdRœXvÚ•9¦*‰ªíÂj®°„Ä>9]g·bÀ± §µQ(PMžaeÖJÔ¹N6µNU£'GX™5Ò…¹Z€*'‰ªÅÂrÀûäta­‡h…F¢f/.J‰Pª#U‰¬w÷Ú/GÁ—;ÿ` 9HQ°ä´;;-E65Û'š¹“%ô@ öëi×&ÂÃmƒÖ©$j&Žð2k¥\› e#Pë Q3zp„—Y#à*s ´U5‹'KèKì×Ó®²ÖC´B%±Qr„RÍX­J­§KïÛdN.°xE$R,9mšÚi…B¢fûä@3w²„Ä~=mÚDx0 }Z'šÉƒ#¼ÌZ)ÓfCÙÔ:HÔŒáeÖH˜Ê\-@•ƒDÍâÉzÀûõ´©¬õЭPIDìÅE)5J5cµªášÈÅ¥i¢\`ñŠȤ8±ìtÕD­PITmTs…%ä@ öÉi¦‰x´N#Q5yr„•Y+ À4oj$ªFOް2k¤š&â-@•“DÕba 9`‰}rºi"Þ­ÐHÔìÅE)JUc¤*ÓDÞlMå‹Wä@"EÁ²ÓUµB!Q³}r ™;YBbŸœfšˆ·AëT5“Gx™µÒLñF ÖA¢fôà/³F i"ÞT9HÔ,ž,¡,±ON7MÄ *‰ˆ½¸(¥F©fŒTešÈ¯±i"¿®<^‘™'–œŽMµB%Qµ]8°®<^Ñد§#×D¼ Z§‘h]Y´âeÖJD®‰x#Pë$Ѻ²hÅˬ‘ˆDñ ÊI¢uåñаÄ~=‰&â Ð DÍ^& ”"¥T5V«F®‰‚ Må‹Wä@"EÁ’Ó¾i¢V($j¶O4s'Kè@ì×Óžk"Þ­SIÔLáeÖJx®‰x#Pë Q3zp„—Y#à‰&â-@•ƒDÍâÉzÀûõ´'šˆ7@+T{qQJRÍX­ê¹& »kš(X¼"2)N,;]5Q+TUÛ…»ãñŠÄ>9Í4oƒÖi$Ú‹V¼ÌZi¦‰x#Pë$ÑîX´âeÖH4MÄ[€*'‰vÇã=`‰}rºi"Þ­ÐHÔìÅE)JUc¤*ÓD1˜¦‰rÅ+r g…O,;]5Q+Ôdtµ]²ÑÁðxEbŸœfšˆ·Aë´Ìt0,Zñ2k¥˜&â@­3C ‹V¼Ìi€¦‰x PåÌQÃã=`‰}rºi"Þ­Ð2ÕÍ^\”R£T3Fª2M´.{ÓD«É^­©ÅDˆ‚k'Ó2 Õ¿ }šÕóêS';Z1Ëåd±VêRë´F%N1w°‚–˜ýót1W*SóPç L1xð–˜ùót1w¯ImC…ƒ,ÅÚÉ…V´Är9Y¬Ý+RÓ^iRm%"°¿›Ý³D§~-óÿþíüãXûZƒ'” ±"yÚ@¸û Jù;_¦ÛºKcb!c°°‚+tk+"Í=H»‹µž‰Ô»È‚²²b)`"3+’dƒ¤ÈO$îDeӉĉ¼ŽxÄ<ò‹<ÓÄc¿x<Š4ÄÄS¡èƒñ”:ñÐ ôÛ@OЇ˜ M)Âû@n;!90ô’@èTŠŽ.Ö“ÒÙ€8pV®´‹¥ÐÁú,®øO,ÏŠ…²ÁêX2žX½ë(ƒÅ±¢8±¸#ÒìƒÜ¿XpšÈý‹,ì 5,Ö#&RÃ"I7ÈŠtõDæPäp‰%‘ÍœH,‰GüAÞA$»&òâ pðX*r!¥âaðÔ"•'žZPPöÕ­xŽÊÛRttó-ù›z€LSÝ=;|3ÅpƒìšØÞÁÚ‡‹ÿ¸ådbퟯÂW†q?ÂÄÂ0_¢.âbõĪ!_¿®)áJæÄ’Oîp™kb½g~‡Ùh\™HFó´à0U‰ ò‰L%Ï óX˜=Hcñ„Â0É©µ‰{=cÖeø@|ÿÛÁ†A~@)“騻Åo½nƒ‡{Áø¶œá6!Üœ6±QˆïÙî!ÁK»Hø‚þpƒnk™ØbÀW{‡«Ï¸çabý™/—&qA|bq’¯ ×­pµtbåŠ/" 5p)mbYƒg˜‡o\g™Èyóôã0ŠIø‰„(K\h˜ŸæÐî;ØbÌ(e2õ·ãvÍÁÎQÜ¡<³w7ó öŠÍ¬3[ q¯×`Û™Øë8³ó · v%‰­p3“p§È`ÓŠØ)5³o7 ö4ˆ43Ûpy°ä-öY̬zã2ä`ET,ÃÏ,Šâ*Õ`ÁL¬Òά™á"Æ`=E,âÍ,©@¼Ÿ‰+<ãlüYtôeZ2|Ö‚…#qþñÿòÇ?Þ|x÷Á=óø1'ë—ôŸyÌyvokÜ?¾<üî˲,ëï?þw=oÒ-àW ú.ü1üÌàf½…uðÈÆ4*ióËb=Ã9s3›Š‹ ç“–Ìn\¼·œ?~eðš÷QÀÿÆ@ÑܼÒGÅ\zpNÿ ä×wçT_}Ïêì‰È~í»É.ifX•Ñ›•ÃÖÛbeOßæŸòǧüñgVÇæ:alÛ¥ÛksúÕòÁßv#ÐßrÌz?‰ Ë@)¿¿Ê§vÏ,°ŸîûÍ/¦C•û¨>Ñ:Κ۲J'< *¸4)ºE2+Ôëªõw,ÜŠ.Q.¬êEqùß÷FY{i_vI‘'ÚÒt#{ÿ¹Òƒ£Óô·xéÅ¿V}öé~«þñãþ¡ô’Wñ˜p:˾î XYñ˜¢¾OÿÿV&¨:%˜„NóEpks'íp0ûm÷N€~h,i#Í?òÚy¶L^$5cï_ꇼÖ!)šÅEQû3ùtr•øò;Êü²^ þÆAáf·]æS½ Œ¸>uÑez@Ù}"¡±²…ìÇòll.lã±¹hGcÓÇ¿©üs­üãE×7 »&¾|asE{¯pM“úêìŒë–„rÀlîu)ˆ/NºŽwÒ™<”(P‘Qwu¯ŽÉóéÔplÒæÚpL½‘~©jA‰Ÿy:~M¿’˜ëWâ±Þ/.2âÍ+ ½3é.3RÃQvö‡c:_äÄÓdg7ré~Ï瞬ó£@}•?Þ1¤Ýnf7•Éä˜q'ïv½á?äÇàn»ùMÚü6¼Wºà³Û£ÞÛ÷Zg·ôu“¼J>y`ϾèWU¼k5ßjm¬vÂ!9àC‡`.’5òY›D– o9()±¸  {¿%€zNÁ]–å©ÿ,KràU,s‰ qõÿF8µtvÌ2ÃË0Lta7{‹Û´#²D]Ý•#DËÐU«ØKq$!ôñlzۥѯxð ·`­ñà•žhÃ*AßÖ>rǧ)usNwü;Œbèöè`¶%‰žM÷ö{qqò“Ø>0i—¤£ì…I×ìV‰kuï7Œî-$År™øèÜ-S @{í„ãƒÛnI\ øÖG‘÷õ/ uº {¤ñ¹Ñ'|LéÑÔxIe®KŒ¹Eiˆ?›Ì¹U€~ÂÜÃêå}öAI@¤§ÀUF(î¼üì%虃RdVbÝß¹pð©cqàŸs¿r>Z /Ià€fEyÅïZê#ºÔG9×ýUñ–O6åÊUY–(Ê|ô]jÌÅLô«Hél²wr·`$èU[p¦oé.ÖÒ#+{ÐÅ :b ±†HU›h w´ À‡ÚDë­ªMìÏ{×b  ób-=ÔŒ ‘C>töáÊ!!M:JU¬!HkRÅ‚æÅZeU¬Í±¬ŠµI–U±øk±6fYk#– ÉÔsDksލbMu„hºÚkêøu±†ãWÅ€t± ‘XÓ/ÅxFkš·¯ÅZÏdkšÉ׈5ÍŠ¡joÕš÷ÔÏe€:-*BÐÈ!:ûpéo®«ª¨.*¤‹ M‹Š.ËŠ¨˜dY³,+¢ñ—¢b‚eET Y†¡½ëˆ"*&QD…îÑ2tõZTèãWE…¿&*¤Š  D…êx!*Ð3ª¨P½})*º&‹¨PM¾BTàèÔ ¼LJA-ĵÇ{0UIò†ÜX50‚â˜Õ ‚´ bÔ ‚Ô ‚®3<ˆäÎqé¶ ry®6Ûr"ïGÈ+õrDϸÍ$‹8= «·%ä}’PXå´ô+ºÙ/B&/w™¾¥»rIA& Ó!ˆê(@v” "Õ@­5Ü Ôj­·j 6–g:Ê ÓÊÅç=#‡ hà„"úpå¿96JU¹ HU.R• ‚æ•KeU¹Ì±¬*—I–Uåøkå2fYU.#– ýÐsDU.sލÊEu„hºÚQ.êøuå‚ãW• €tå ‘rÑ/• xFW.𷝕KÏdU.šÉ×(®\ÄeÒ” €šrá!Ƥ':«û•o)\â-IIt‚.e¤JÀèR@º”PGÊtrΚø Éð]MPü\ó@°vIªÁö‡~b3 ¢®"¯@ªñOk¸ÿ>ŒZoÕø—gì¹TBçÛ' ‘C>töáÒ!)œ7³ HÒ€¦A—eEL²¬‚Y–A€øKA0Á²"†,ðÜuD“Ž(‚@w„hºz-ôñ«‚@Œ_R‚‚@u¼èU¨Þ¾]“E¨&_!ptª —Ij‚à-¾aâ>°i—tûÉúo$?R^v«_¦·(Ð]ªt@&£J©ÒAŠtÈï^§ÒqµÍÓaH·”b³m³ÿA¼–q—KœØZ¨ŽtXâäÖ T#¥Öp'R|)µÞj‘Ò¥ÛwrkB§¥C~dè ‚ð‘CD.ãxk‚Té€ U: h^:ôXV¥Ã˪t˜dY•€£ôYóþJ:¬é™`†e"€÷Q¥Ãœ#ªtP-cW¯¥ƒ~—©ÒAŒ_“R¥‚ÒAu¼”à]:hÞ¾–=“U:h&_!ptªt—I‘jÒaQ²þfŒ$uÄ[þ¾‰èVÁzXª£ëéz@שD.<“°Þ|°²M¹ç3¿_¶Èa~lŠp~بk9€Èk9 jôÓîD?€£ŸÖ[5ú¹uvSBçå@ ¢c‡h䀂}¸tHº9‡›"¤Ëér@Ór Ë²"&YVäÀ,ËŠ@üe&a‚e%“0d™Ê=G90éˆ"tGˆ–¡«9 Ž_—8~UH—n}ͦÕñB gT9 zûRtM9 š|pëxS„¼LšP“_ãk1{ŽIŒúøcTÃ=‚´p5Ü#H ÷º÷ˆüZye¿¿ȧ™÷çí¶Oì@Ôu8Gäu8H-z© _G/„¢—Ú[-zÙuŸÝ)€Ðépn£Ÿp€FøÐ!؇K‡„e¼SAj8GÎ4λ,+á|’e%œÏ²¬„sÄ_†ó –•p>dÕ®#J8ŸtD çº#DËÐÕëp®_ çbüZ8GÎ4çªãE8GϨá\õöe8ïš,á\5ùŠpŽ£Sù¼LJ8GÐà-W„Ã[®Q{Ë5n#o¹¢OÔð -ü#F ÿRÃ?‚®Ã?"Õ·\¤¾åŠ õ-×¾η\$ÞrÅKñ-×=Jþ–ëä´¨¿åšE!"ŸtçÞ…3;"Õ>€ìgÆÔ†;qàÃ8¯õVóv™ÝÐyá³Ä ‡h䀂}¸rHºÖãR…‚TრyáÓcY>s,«Âg’eUøþZøŒYV…ψeB~ôQ…Ïœ#ªðQ!Z†®v„:~]øàøUá ]øØå5;"TÇKážÑ…æíkáÓ3Y…fò5ÂFg4a’T0Ò¹Wï.·¤˜t˜ö)_çH³Ýne߈ ã5Šh9¾€‘Ÿ1ÄæW#ÄÅAîT” gü^Ð}]H|©×æ%èÏbx0~õÍOÁ»öæò¨èI¾Gk’¬1ò&ü }¢œ~~¼Ø˜é|]²‹Wï¤ø4 :?Qþ 3/m>¡´I|žØ±¨kiƒÈki#Z$W¾ŽäErµ·j$vvÇB§¥M¾fc‡h䀂}¸tHzœîØ@.m¤KMK›.ËŠ´™dY‘6³,+Òñ—Òf‚eEÚ Y†£ëˆ"m&Q¤îÑ2tõZÚèãW¥¿&m¤J ¤êx!mÐ3ª´Q½})mº&‹´QM¾BÚàèx a]oÎIßü²Œüu¹êU'߃± [“¿Ößö/­MÉd¦ÆÞËLiþÙ>EÌ ­^‚@cå/6ôMsáèµZ¼$N}éÓzyñžQ¢Y#oÑ?‰ïúZ%¨½r—}ÿ‘n·5S<ë' qCµxÉ»Búß;]߯#±F^êOŠ–Jä_dÃ?ÖÖåNTã×[4îb:—b²N—tÐzÛ â×'\ƒ×--ÔÙwÙeüÄÎDud ;²ËøñFµáŽÊøPeh½UUÆâgwÆ tZvmûØ€¸Ð#o`®œ‘ço”LŒ*¸£ê-ÀÌË­»ªÜšcW•[“ìªr ð×rkÌ®*·F좧çˆ*·æQå–êÑ2tµ#·Ôñër ǯÊ-érkñ¯Ù£:^Ê-ðŒ.·4o_Ë­žÉ*·4“¯‘[‹—IYBCP[B3Jï·#DãõÒ’Õ”[$|“ÄrIwÌz¨<¦œ{i~ôûÞ§Õ]¹?Þ³ƒ mÑ1ꢂÔE;]/Ú!Ò(¹sÛ7I6ñhè¨ã÷-x÷–[ˆÒ¥ä÷/„ø’^¤é–MN¦ŸÅüì’ÊR»ùtgå¿%}ÚŠSbmþž¶œˆã@üÝáöü6ë=ÕÇëEü9}þ{ ÞgÑ.@ü76‚¹?b†ÿrHŠE[^¸äÞé87‡˜_øïy$%E[ì»ûüš*Š-v‰SŸfÍeWâg!øý¶Þî?ßÝsDþ‰‰uÉó‚ð'ÿ ˜%ùs]_…%Þ ¥×VH±hGÄ3WàùŽÄ dò6¿Moƒ¸4Ê:r¾ÒÃs·_‰S»[•ëÃ6*„D£]FgÏŸêyzøß‡Œ}IŸùkÿõö4yX^Xî?ËsàÈ!-õÿùðùñ’ÝÿáD÷È endstream endobj 281 0 obj 6009 endobj 284 0 obj <> stream xÚ­]Ù®Þ8r¾?Oq.<öLǹ‹ q¼NŒt{=s$7y±äýREI$k‘¨4ú÷¡ô±H‹UÅâ"so&ïb„b óýýùΰGŸÞÞesï“™’‹÷kÂNs¼ÿëå.í*rKÅe¿1×öç_îþ15¹ŽŒ‹‰uqîÈ–ÔF«/éöÈGLºÞ»‰%K1;åýÁF°/‰3ü#<ðµ%â¤Ä·AVV¡O³ý%5‚añ„)a õ’ÚIÓ’t~ÄáK Ž'vº%µêË@¢Ð§Áæ&˜È½\ô\Å’×~Þ¤£%vùh´7ùhä6éÌýîµß‹ß ´2ú-£ÏS…¨‘\e„¦7¢½”5šáµrP :¢EFhšRÍ'b%Ð,«5Š›”ôBG¿{Ý|"Z@Ÿ¡ Q£‡‚"SM¤±.+ñ‰f³4Ÿh¶fêd¤%]ŵ—ð`WBõï]|Õ­÷wR›t´äÜQÞ_îÔö¼=õ>GœÜ*}j#×KU%·gîɳ<«ÈT‚Eú%¿¾ÞÉ•œ„6Ͱ ËNm“…– åýe%{Ò=¼ŠÉN ü]éî©^Íо¼Çÿ`²¾þ±NÑç:‘‰i'Ôýú¢ŸvESÿFâæRLà|/&\ƒ $\˜ w|0=sÒ Sá­ ¼G1e¹àA c>p.„G{ÁÁº~`{„ÃsÁþp­p®„5ª¨=é—ŽO}j-@<ز£Cbþ>*ð(Õ…˜‚˜Ý ¦œ"ÎqaÊ)œÿÁŒDLƒ/ÌH„o8pXÅ,é‚Ã*\‡?#œè þ 75çvOxXC÷'«Pt—JTf™¾t$á aˆŠ@¯¨H¨`¾àA³+Ñ 2ÎmyDåÊÔ–L2†>ݾ2ï!èÐ+æs±+Nq﵌<(î¦=(ü»Já%”t/¥§¡kSÇ8i$ýB“Æ›Æñ/u½£Áˆqp„…ä.„GèLu·:ŸÞ‰°ÁpŠ·'«Lt—òT„Ùls}ùoüù×»—_î^¼ñ÷ÖÞÁ ÌÉ`ꇓ·NCÊ÷_ï~ûÃ3ÿîË¿·÷a s˜Wøó~îÑË2Åyèw=Æš m’$ÎBïg—εA&1\*%ãÏW÷P|Hþ+?¥Ž 9ð¸ìò7…7•UoI*fÁçlÊnJ³Òz;SØ2'kú >àÏ7üùç>3˜'i; Ã-{½ó?Šf9Ÿ¦Å ôsŠYÊKr$†å&žº¥ÀóÔe;cOD¥´ê[ŸÇ?™Y2á“oÓ䔬Xû#Vê/Þ86=ˆ\œÕNñøï›R()/æÉ,RD>Pò“Ò…U<(zŽ“ ’‹ß+ƒÞnu*Cõõ—»yélæ#†ˆ ÝÒaW²+<ôÁJsÿþÿ󮞖ž)›çÒýÜØÙW8;-Á л&%­¥øó‡>w!½fºœ©¶÷sý‘}0Ê'‘ûpsÉE³ºýø-©Ê— õ+Á<0/z3?Ö%‚ Š^áß™°‡€W–£»ã¶ù`Æmó!ŒÚ¦Ìÿ´vøCÍü‡ƒª'(í(#ñãÑÉÜÄ:J}öîë\ÎSŒ²ÁT÷.*'YÇ*¹`S’@}–æ$Æ›šcQŸ^jŽÍ^mŽ­é—ê,Hû™ýmÕ2æjµ¬Õ«EAy Š€Aú…º Pp²RJWmn¤ÞJ ŽÙ®ç~GN#’@=ÁŸ Μ»Ê‘Io«ÂH®o‚_ô‚ÿ<Õ"f YÒ|Ž?/uæ‘íI¯íK­²LMÏ&ÙK8° ¯ôIu ^´œÏ´2@˜Ç a C|È^‡C†Ä™´ò­lË Ðs G ¬7ÑfÃøH%º9ßÊÔUŸJjþ¤ÌC%n‘2Ÿ`Š ^7Ç?•LÝ*;–2ðȯI·§Œp)L)_fz¨³?b„(™UÕIz uzû#/:/Y¶Ÿ‚æ)‚›ÍAÌvÈÏô¼Ö‘2&„ƒ•ã_p#Æ9Cf69ðy²Îí—¢sp"¶øÉ n”; éÝNªD_•zŸqÌ‚+?§¨w¨«…Pf@¥ ¹ìÄôp‘¼ý}¥IÅüÌŒ¦ 5OTLþ| "g`Æž³‘Ò”9V>‰©Æ²4±”?Æ­<åÔ(äY‘ª¡^Âñ|è1hµU=—Ù$ìØ…bÐë.” Â@#†0ø!¼G ‰¨üÀ…â Õ…â Õ…â ë.Ô™”Uêš”UꢔUŠá]¨±”Uj$e‘9cDu¡®1¢ºP*#Dɬª'.”Ú~Ý…âíW](Ò](¹P㥠Å8£»P·]¨S’» ¥‘¼Å…b­{ÚšX^êB‘eŸ’÷Ëä™yU#Î?S+g'Ÿ¥†VTX±˜ õ½U+ÆQÇVŒ#­˜@jJ[-øXisøHi«µU•ölh¼äØŠqèe+®Þ†0Ј! >d¯Ã!C‚%­Ô­éVŒt+Æ@—­Ø©”íV좔íV쪔íVŒã­Ø)Û­ØPʸ-9eÄnÅ.2b·b:#DɬªÇVLo¿jÅDû5+ÆAªã S/¬çŒjÅTnZ±s’›SIÞ`ÅxëhEâ²JÉ[mÂÕé ÷z¤íJ“3ƒ®Ä•fk$¹ŸZK^бïPÿ„ È_iN³¨¥5r‰Ø- ~ó9ŸœS\ÌÌþ|H‚ç,-Ôs –Eêˆ4I`¾²ô¬è©WuŠN£mœ’¬ý3p˜õK 9Yì¯|iÃFé§|àA ?ËF¾Ef9€ áØðYj×"L°¤);9¾ tA+Q?]w·êÄÝbÈw‹#UïB+øÄ»`ð¡w¡ÕVõ.¬£±•w‹A/»[Ðc†pЀ!>bˆ¨ÃCBö¤•ª»ÅAª»ÅAª»ÅA×Ý­3)«îÖ5)«îÖE)«îû[c)«îÖHÊ„Ósƈên]cDu·TFˆ’YUOÜ-µýº»ÅÛ¯º[ ¤»[ 4r·4ÆKw‹qFw·4n»[§$wwK#y‹»ÅZ÷S]À áûÕ…äÝS¥Ìm[Wä–ÕÖ³å E"©+ÊA¶™,€¶rÒʽãKY鎯|fš¥ÅxÊc¥|E °”A6~Ý@Å] <Í€Ö<ûƒñó•ù¥ I1`jŒÄ|b| ΞÓAÿ"¤pa_Gûyì_¤jNµ‚OÌ)ƒÍ©V[Õœâ‘Ðká½î_øåChÄ2„×á!.Œ÷upî_0î_0ÐeÿâTÊvÿ⢔íþÅU)Ûý Ž?ô/.HÙî_ ¥Œ[ùSFìþÅEFìþ…ÎQ2«ê±¡·_õ/Dû5ÿ‚ƒTÿ‚ƒþ…Êxá_pΨþ…ÊíCÿâœäæ_¨$oð/Tfºqâ0¨a‡–eòAŽ ìb¬TÑïôí㸫aÉþ•›ö9J#õ¶mç R%R³Ø©YlŽÑ,ö)²Tc¥ôfݤ { 8êĬ›tq¯@ªVL+øÄŠ1øÐŠiµÕ¬X9w-lÀ¡—ͺ5d Âá#†ˆ:2$¥ñ^RÍ:©fƒ®›õ3)«fýš”U³~QʪY7éÚ^ƒ R¶›õ¡” ãzƈjÖ¯1¢šu•¼d^Õc³®·_5ë¢ýšYç Õ¬sÐÀ¬«Œ—fqF7ë·Íú)Éݬk$o0ë¼u4ôž,Lx%(ÓB ­XÐEÊëO„]aƒ‡`®„éz ¨Û°Èþhõx"Wo@Ë-iÐJçód”0áÂ0V—£nß™1Orô®›+èJˆR„âM;áCݱ²|MBei;Éx¸ƒT娸EYi™ÕQô‘¯¢¸$+óÀ·vÚEvÎs •èuÞ죊y™,t Ǽ­?_yTɧÄábhQK $6€úÅë k×G½þ²^ m·ƒÓ,r¿»4m{àÚ}x-±Ý’Í™R²-ÿþà¯í ‚ò À÷æ?:Oí=˜h›éA(ÇV¶ŠVfÀ¹)¥ÆÇðßÊøŽgðu_¨…¹¾E¦´ A©Æ<´šì¬3‹¬= ƒôOÚé²ÉD/oÆìŒý)á4ª˜ ÐÌô½ŽÙ‚°3¦œyäyÞS,˜O|áÚ+ü¡ùðÀïlˆš`çÁhÉ*­‡â¸¾‹¬ÑŽÏΆ$@ôœ3øF rô‘ž²vÅwá ÊÐr0AöÔßs§i¶qÀQèó SXQ'å”6ø€>ŸË¦ÃIdÎdÓƒÚ²Ážw¥7LÔ¢÷Ò+±Ð;èy'áÔ©Æ%scÏìË=R<ÚQÖïÔëÝÔ>ƒãîyña¸ uÇÏ#?~žæ)ÚÑŸÿáÝ/ïÿôùëŸ^½~ûéõëÏúG]™<·a¤€ú±×5º®Kaˆe.èR¼¬K™^Ü5)#·RúcíjaLÆ´ˆLTáE#ð’ƒ4jZOos8-æU‹‰t µx(f §¶œµœdÁ´v¸ã8)Ç¢q‘ýó‰_41{{ÞXg—ÉÍö¼ö¼0ô(DWHr ¬spçítÏëÈžý&¦Ã]Ivow‰Õ†¡œ`:oñœAdQ q?d‹ Îáañ`%9j¡gµð‰kKïµ÷Ö­ªê¬¿ðeÒjOµ­»P¨d«È-½kÀ³–p£KÑŠ ~µy ôšÝQ"©£œç[ çSð:õW4 eaTø9œ$ÄxAFJìnYλ?ày8'eä# ¼‰´þª¾Ã›'r˜oçg€‘²;$x9•S„ƒÞ¦d¦hÆð;0ž– ˜‰í²–÷4v M˃!…acc2މI.8No$c˜?òà{åÂãI͓ۤ—rÛ‡‹ëŠP*¼¬b°3næW1Ù¬QötxFõ¹À¹vÎ~qMoe]Z&ËoÃ0’3N+0Ši‡!»Y(3àÎr:ïog¬ÚfÅ [(ÓÉÚ13œ'#û†Ú$'ke‘r`: cXIîß•«Ëã‡*k´-L†6´<´²à•‘wÊDŒ*æ¨KúWMM)˜þSL²ã~¥ °ìQ6áµ²v²ŠD¬½¡•Ì‹ì™vËÓÅ‹¹»™É¢ éÿ¡¶æ‡Êè|Bmå6OÖ8,•«Çé¤"«ÛuNÔV.Sðö\ëùœ×Ø•¦wþ—®Æ8Píª&óµ¾ÑÂ,s󬩓yû7R£7—-ÎJYAŸ±ÔœÑ”ÅÛ#Åõ7L¹\ve¢rv Çœ_ÈÑêu€¤]’Óp3¿=Ž;¹0Jªâ6@¼tH´C½ 0Ù˜Ñm€ÉÙ—²+Ç-dëåu€ÞÈªŽ®t Ç´ëq Rí|í:@ÐÿYV™.^à aAÖWܘa¶y Wq%mYÒ9Wq o+U”Á2p›œȉ7;(tt“Þúé%\¹±Ì—¼du_½ËÓ¢ÔQ»p Ÿ£“1ƒy\`múV¬ðîAÜ¢å%ÿžØƒë14ê8?=1åA ÔñA ½×ÄN};ëwê0  a{ù`…wÜV~É¿'F7ú­,˹epÛ­~Æ…°$r?Xt4ZY éο¸2µá¨•æÏr–‡K¸1ˆ<3å¹ãÅÓ9ÎWÉϵøolEŠ#ŸÈ½?Ø"{'Cj¬‘ŸÏ›7¼,à°ž7\Z0lá êo»$W&ê†k‘E® «T0“[9ÀŸÅncÀ\÷R´%bºd—Ä€OÃ3>© ¡l húÅÊ‚¸EΖkr9ÎTâ¶ÖJ-nÇ2ଊQ(´,É·¦æî6"Á×°àòU¶bïHÆ`Ø‘ ¤w$w$j¹µ®À”…±ÍR`bŒlí%zê\ô;Þß?K²O)(—mM¢‘Ô%zyÞ `~’¥Í\ 0ö!xO@É–K“8ÈÐXx¨§$¼"ÈsË1 ôX2ÐY.<än˜ŠŸë´‡íYĹ­„¿ç×ãZE¶ièÉàÖ²vôÂ[ ("kĨūqqQâT8ö1 ¤šÏù/œÛpIÈY€h¼:Ù²ºÇAïùµ°Y¡ô«ˆÞ¢1Ð+ÅÖCÿÈÊÓ©+n2Ä9Íiåsš L*9ˆ® ‚®Ãµcbaà}(‹³U%<åÀ‚áŒ&Úÿ Ij–bI ;Ħ1ÔAÎHÑp|¢g?.w0ØY/6ñ©¸³²cŸr%½,6q«…›[„l×ÙB"ϼˆ­²²„÷|Fn1 §Uã{­ËƒVƒrâÆë+Ö¸B˜1&Ä@ŸäŽ"\Ä8Cò“¢ŠÃÙî>žÙ69Ãc‘!I¦:²Á+ô½–þ¹%EåYëf~v)Ì’£l/Çð’QŸ•#bøIÛ›ù…ÇaÝ%~mœµ #‡Ë°M.®7áŽÛT6ÅÞÞ& l_kS9¸¨ÈÀåo†Þ^7ã/Ê'Rg²ìÒ„œ$¯µ4nrŠ8|2tÕ™0”qa[_Yö©ÜÒÃ0G7᎘,(¶;zÚjol ”ü.$üÔn*À>­ÈEx#ÈÐ^¸XŒ_QgdØ ôn]žT6A®Z’5•oC—.Ù¤òòW( äyèÚ[¡ÚÌúrŠža~Ïî†{©ÜËäÊG–qæ§+ðÃs¼%4ÒlË—Þ8冤¢mî?éšdcžsU“£¨÷O˜ð®“Óö•‹Œ÷ÔªµÎúÁâqÞ%«¤”높æŸÄFN'èõO,ÚœËu=š,D:6- LKIåzÕ0C(7 3„rÑ0C¨÷ 3ŒzÍð™bÃøyLB<Ä'Du”»EðüÇlOë½)6Ò^/«Šaº–¡o×µ!QY«Ãhº–AT]ËÉhº–î"N÷&A¸“ã`$à—¼D­kˆ¯¿Ü}¼ûÏr–é~çÅabÁÃ^4aÊcÅutÏÿ—»‡ûÿºÿ+…ÚT endstream endobj 285 0 obj 7152 endobj 293 0 obj <> stream xÚ]Q¯Þ¶‘}÷¯ðC§éîgI¤H©À¾nâ¦;vœ.üV`[,ö.°û²IIrÎŒ8¼AÑSΣ#Î9ä7½œnY×ôŸ5øøòÿñb‚K¾±o/Ã:?²¾|: Ë#®/ÿëżºGºÈÊ+ÉÖrR•JGÍóŸÿ|ñ üt”c£l ž)ÏåVy)Ÿ¹©¬ŸË?åV¿›”c£ý,Ú¸¥¬»•}Ê%ÖR·{V8o’æráT×:Tsù§ãB£Üû€Åت§ —zn-[€*OéB¬ WÇÌ•bQ_ʧ:0ÖjߦV{*m­>¥Ìô§²»ú›R6`§ý¨~ 1ÎIE[\I²ÞN– ôï Ǫù‚cQw¡±-¶ÚËí¢±Ôn-ð:È¢òÂc-ÆF¹Yô•º­þ¶’Ô%L6ÿ.ݰ¤ªTdªyÊ¢ðÄd[Š­úë6ØýôC•4Eß (‘òZ^ ^øs}™ÿ—¶óçpWßh Uû·ç6ÎgzB§ü;›˜†FQk¼CÈXÆÁwÄ¥èöÇÜÚ`åE»0«MëUÁq~àU)Ejæ%ÏÊ‹vaÃá-迎Kì×ñ*Ré¦xap ðš/}²Þø«TÛ·ƒÃí¼4† >æC@¡ˆå¶õFbƒ„5\¡9s¼:þM]/¢ì‚Rn¼3½üøùÏß_¼ùøâõwîå<¿ü˜G²4ª¤!,?YiØ^~|zñÍ—išâï?þ'ÝŸ§åá£z›ÿü)ÿù+OP\ã.Äß1¡%$oH_¦Å397?–}UäÜÄä|znrÿ’ÿ¼Ï>mÈ>±Ša~ì³lÈwùϪýžÕÙüÃïJŠL2Á8n²ùŸ[¡eš{ˆBèw‡kÉÓß³:Ëò˜}ßÇ‹K>™e3¿æ]û,|²¬éáHåÄ£^Âö˜V)¹æ?¯è_¿ä:¯¿[w鹦˜æ”g;»úZ{.¿^º“=7¯ ò‰ýüQŠ'$*hý•è÷W›\þéã‹=6¯ÛSŠåíËw”ü| 5§(Ïwñûôÿ”7qoâý~¼Ú©E«‹Ô”@íù™þ|Íǘ DíŠ{ ¿§—zÒ;—I*zKÀ¬^ú…ùt?£Ô{% ê§ä¡YZø3JCÙv½¿R[>k-HanjªLÜxâc!¡ÒY³OƒD’ï8&ÑDóUsiÜŠ»ì›|×\ú&òA:uáBÉŸ«ú•¬ÿ\‹¢ñлÈ\ Ò£_¾p©í¸‹R?ËÁ)ïÆsýµl[Š#þº ôú´Ä4ðš}Zâz˜²û4¯á·ôiNoîXŸæ-¤H!MÌôP¢˜¬„ºiþ [æA€êÁG3ˆé}“î>Þ㟸Ñé±L‹þ¾½þnR‡Í_ù­6Ùœ¾½¼Û…ÐWùÏòÇÓùá7©ó oÈq‘BÜëãSqµ*=²h¶ „"ÊAVÈ|Åd‚{„襢ÎßP«—£üûó¯2^b'òѱÙ\ò t—¾ÆÁ¥^×–½’¯-Js‘˜:œ|8øÖnkBßJÉm}̇-áÛîë9 ÜÂ)§{lyòRSöF€dŽ{‰¡2=÷m¹QéHï&;Ÿb«ßåC|Å>Úñ½ÇêÒМ¨›[÷þ“ç4º;7 –Ãtï›§„‚DŠPè3ŽKû._ž·R2QËü5‚’ï´?llìÒ_|²†#ÿ ÃQ&f«@HŽ@FŽP‘61blÊKýv Î?¦ÙøvE!ãÛÅÕoWÒ¾]ß97‹o× Rûv‹¨h}»®«“=T¿]7'›ß®ócZf!d~»æ÷­çäãã5Êvjì{ñÙ±¬ËcMŸ‡XG~,-a}DÚ‡kþäÛ^ú-}ƒ\¼éß~>f3Ã1Ó”c¼ id™¯)^ú÷1±Z%Ÿr!_R³¤çÓ®›§ÚR.Ú˜™c®“Ux:Êr·ìXŒúR.ÑÜ1—Çê<½pnjîžùÄí­ö½Q…¦ÎiÂVï¾2¿ø}gª×iªª©ÞAo#ú” LoÆ .¥¾ÑÃ,\+GÛY>`±Õ'Àbk‘°ÕçuÞŒ‰Ã\È dÖ [óðYá¸Ù<ªªªÔlUó [ûè¡õ×í¢ðªÜêç5N\Tu'.¶ U÷u³h;j2Õ{«÷Ä©ºp±µP Õå&©¾*·Ú› „Ž­Å/ |£§Tkõ¦g›# ¹ÀFŽöB$Ùæv¨ãG-˜TÝ×Ó®ê2X©Ü®8ªú¨vÃHµq>ðªôÄ/ÇÖHÍP‚V Ò‰™F牋ö³Pn•gíJ£ý|øUß…Žz!C¡ Û¡,ÒUmÂO£Òk¥Š§ªŒª>ÊÌ>µŸJ!0”4"ɲÛsjj@Dº HÝ’¶Tn7#}MíGœjãÂ)½0Âʱ5RæfØáV Ò¢ªóBIsY¨·g|ÀÀδ_ }%táhnÏíÄm´u*ˆªJ¯•H‘²¦êÌF¢ôEh$JÚ ‘dÙmO#D¤»À€Ô(iKåvƒ1Ò×Ôöb$"Hé…VŽ­‘*àÛ‘ˆYJˆªÎ %Íf¡Þöu$âv¦ýÂé+(¡  È@sÛ³‘ˆÙhëTU•^+5"eMUߎDËä+áYÒ×5‹Wí…H²Ím_IO-UÝ ªºŒV:oûcUÕö’ûT'ªÒ#¼[#EÀ3Ä­@¥DÎ%íf¡Üö ;Ó~b ê»PR/d@TtÛs2Äm´uDJ/K¾TUFU=çDKúê"N” ,^µ"É6·]åDµ@ "ݤî@I[*·Œ‘>ªí$'ª6. Ò #¬[#EÀ1NÄ­@¥ DUç…’æ³Pn»†i¿0@ú JèÂ2@·çDÜF[§‚¨ªôZ©)£ªŽs¢%¸Ê‰rÅ«öB$Yv›8Q-ˆHw©;PÒ–Êíc¤¯©-8Qµqa€”^a娩-'âV Ò¢ªóBIsY¨·+';Ó~a€ô”Ð…d ¹Í8·ÑÖ© ª*½Vj EÊšªŒ¹ÉÕ‘(JÚ ‘d›ÛK‰j¡€¨ê¾`PÕe”°R¹]G¢ªj/r$ª6N T¥'Fx9¶FŠÀÂF"n* jtž(i/0 åöÒŒD``gÚO T}Jê… ˆj€n/|$â6Ú:¢F¥×Ju$ªÊ¨êÂG"ç–:å‰Ú ‘dÙm‰j@Dº HÝ’¶Tn7#}Mm1UHé…VŽ­‘*ÐŽDÜ Tº@Tu^(i.0 õv‰ÀÀδ_ }%táhn³‘ˆÛhëTU•^+5"eMU>…¹~¹#)­EIs!’,»M_gµ@ "ݤî@I[*·Œ‘¾¦¶ø:«6. Ò #¬[#U ý:ãV Ò¢ªóBIsY¨·ëר™ö ¤¯ „.€ ÍmöuÆm´u*ˆªJ¯•H‘²¦*û:sûT¿ÎÜ>C¼j.D’mnOõë¬D¤»À€Ô(iKçí©Åé£Ú“ü:«6. Ò #¬[#E`b_gÜ Tº@Tu^(i.0 åöÔ|i¿0@ú JèÂ2@·'þuÆm´u*ˆªJ/KS )RFU'þuæ—©YêJ¾ÖÕ\ˆ$[oÏ{³âEZò"Ýe͋ԋ^m©Ü®«úJmfêÐÊ)½–¾X9¶F.Òz)`V ÒµúUu^Ë_ÍfáºM*ÚÜÀδ_k`¤¯,‚Ñ…cYŠ ”ÛÕÀ¥€ÙhëÔõ°ªÒk¥fIŒ”•ªL{~ô~¯œ(X¼j/D’e·‰Õˆtº%m©Ün0FúšÚ‚UHé…VŽ­‘*Ðr"n*] ª:/”4˜…z»r"0°3íH_A ]8AšÛŒqm ¢ªÒk¥R¤¬©Ê8‘[åD¹ÀâU{!’,»íëÚûœ¨ê.0 uJÚR¹Ý`,nœqP‡@DJ/Œ°rlT–q+PéQÕy¡¤¹À,ÔÛ•i¿0@ú Jè¹@¾ÆâÆ9·ÑÖ© ª*½Vj 7Ή¸öôèW*'Z¬°¶"É6·CåDµP@Tu_0¨ê2JXé¼Ý¬…6ú¨vœ¨Ú81P•žáåØ)q"n* jtž(i/0 åvh8Ø™öUß…’z!¢ Ûs"n£­C jTzY ¤ª2ª8'ZC¨œ(X¼j/D’mn¯•Õˆt„v…••Êíca圈€:¢À×Wy9¶FŠÀÊ8·•.Xam/0 åöÚp"0°3í¬°Ö  ÈÝ^9'â6Ú:D¡]d•¥Ra圈kÏ~€öP4¸Ò\ˆ‡\sk-›‰¶¦@à9t–GOjd´¥ë6Ý*z¨f«¸‘'À² ¬‹òr³h+•[íM… (U×…„æi.·Šª³&S¼“Öëù’ž‚ºp<ìC1Ý"Å¥r«»ÈW`TU^)Ñ¿Šª¶ò£R­ƒ±„úXDi}´ ‹¿¶œK¡à‚ÔrMדU.\Ú3:ª¶ \=¯ò$u^X¹p9QRµž(áVx'Eé.K룅QU˜±ê÷V7S•5–.ÅVÅ'V¸î¦Êjó«(]ºÏBÑsÁE>ØÛ¤QLøë&b⪙x(RÄŒ|5LHY DF6“H¡Èhù%F²‹È°HxéF.„HÀȇ«ÓÆR¹ÈÏX.‹—ÆJªX¾XMk[ÆB›XÝXlKÆ:ŒXüX‹3ãÆ4½X˜ª§Æ,®X:˜ÉójÆ$Ÿ˜Y˜èÓ.Ƙx˜_åÆ˜—˜&mƤ˜¶øŠœÞøÀ_µ‚v8¨øà1x¨ }*#èðÀ~ÈCï&ųñ˜±läQ³ìü¡jÌf5rlyV÷P‚-¦: ˜<åw(ûóàŒì<ž:”š‡IRFêOÊÛ #¯‡g’ %õ`z…‘ôÁÓŒ†2>píÝÈà9(Cé¸0k,ó…¡µb\µ3ÖùêõÐB".é M|ish• çûU¾î5´“ÁÆ5_šŸÆ™Bcþ’ϘM^â4’1¹Å§S‡f¶pî¡3 ÂçÙÌ)ü^íDó¹{ÿ\»õÉØƒ{ùì=Xl{Œ¹a6„ì×a['Ì͸…hd3Ë«73ýqÉH¦?Kº6ÓÀqóÁH8ËÈ5s„13}$G˜¥kš ¤˜¶<’@ÊrùÌìBÌiÉ.d‰^fê&<ޤž±, 3/ ³áFò’XŠˆ™´‚©R#I+,ÀÌhÀ<š‘Œ¶¸l.wc’ÅÈr7[y4×Bq~d-”-K™ e¸<;²PÆÖ,ÌU\»YEaÞÝiw\Ô±¦ÝÙô¨5[‹ æ¶mÜqÛßù ÛÇÍÍ¿bG¦µEö!lûõ¬ „¸ku`¡ØÎeí/ÃM[ÌÄnkûîyØ$6ƒX»SpKÔÀ±WÀÚ¼€;fö/ˆTr+·7T ¤·‹Lc+õóí²ŸE"ª•‹éØɱ"OÑJœÄlÝÜI‘ÆfåÕa2ç@jÈr²Ò®0×o óJ$ÁXY9˜ 6˜#r$¬¤ ÌÈÛKèÖš>&’ ,ë‹•ØÞr0æ+ÂbåÎXAÄ•iûP8¢{(žlbJ'çà#Çà>rcW»8JadW;n366=‹ö#›žqª±'VlÄÙ‹›-“bŸîÈ–IÜÃfì¨Û8GvÔá'cÕØå7²á wÀûqÄ&°‘ý8¸AÂØ®!öl×Àüy#›_l!ÉæÇôj#Ù[ì0IöÆì[#X$ äcr¦‘**ò“GRE1wÏÈ$é«#™„˜Úe$š‰ìÆ‘D3Ìêä*‰Ä7+W ÓJúé-"mÊ:ÁzÜË0ç—h©gªµ¯­ù¬E/…ÞÕ£âê1Ýùϼvª9åayæéØ«›“ ¢6½‰†}ù†½<–|°!Hý å£rw½õ<¿_ð0Õ|È!Öéwçý’` íÈÞçq-?Ønß\é´}s~~,[·oü<ê­%ñ¯ëùšTû‡›¶oá1IÇÀÍùÄúõYÞ˧ÈîÛ2à½eóm’}'Ä&A«ûòؼô‡r–tœžÕy;Ïj·»3ïÛc]ewÆ‘~V»æm´]y^Ik?S3t H•3¤™ŽA6V?C:,ë–ÆÂO+å£×œb÷.7åeÊÙº p$ ›Ôuwl ñÑ­B¼ž U>>s ² â`Ø£¥1:èÐÌíÏÕ{!dK—Ìfœ„ö¥˜“ÞúZœìó JÏC¬¹¨ŸëîËâààk@ì>¡<æÓpŸË‡çnãOÈ%’ÏÈEù¯åº ÝŠÔŽUѾ&xí«þ¼þ@gï¾–‡kŸ#i×3KHxÜ3KL1ÿÖ3šq­§_êäB{HQPê+£Ó•’_ñ:}¸Ì^oÃvãíO‰š¹óƒƒ{ rÔ „Oð¸ïY‚÷ zP~2s²ã*~¹K£†Ò¦Ã¥×U }àBùgr¤¯ÞËÖgös>e}’¯í_¤¦9áa‘Ú>áÜË.…~ª?=Ã=âË< p{Š"Qqßfn«ô£òÔ_ùIÿ.S î_ Á8rŽ‘ „ÜÒ4äcÌáÜp”ä\“Øü6ÉïùQþ2 BJþ.Á:§ÎìU 7ÜÅTî¢Yíp7¹‹ÖÔ7ÍxÆ¥_ëìô6ý®÷#Gw}~–VwAÈê.ˆ›ÝÅ6ü+ÎròLå\d;~¨ß«œ´”Ö«¾Ã.>Òƒ‘§1ˆy„‘'¿'OÐKAÎûǾÛ!céù‚èÒ˜/ˆ.©¾ÐŒCƒ©2lôDn¼À9RÜéÓIz)÷ˆqBÙÖ¶,ú{°H÷ç ²9Ýý¯kçèlKsø=Ûê©$¶¥©|Û2ŸÕ¼-É·Ïêžíël<ÄÆÖ°6ÿØÚ&ßùyï2w@ÇÞÌxÌiÔŠBZü•SBI Ñ?"¥RbÞdT»ò ¿¿¡ÓlõøüÉRr…î¨F )[/å/89º.>ÁÔd Õa yÇPL ŸšÕNøq3|jM}#Õ§Q>D©~m‚>G2»4œÝ¹ÖOóéZúJçü‚e¾ ’¯¹Pú "4T!‰ç†Œlì7è—Gfl,çiÄË „€D¬ç`…B7ÑŇ<Ç'-Gôv^y0…B¢PÜB”hCQ(n"ÊçyeQ(u(”T…"*¢¾BD­S5º 9 ¡;¬Û#HQ#n½¡…XæØÐB,sph!– ò÷,`íÄúÊ&å×ù2ƒÜçÑÅ¥ÌÇÐ] oì¹–Hë˜k‰´ª®ÕŒC;¤UŒe÷¤µ7 ií=DZAÈ"­Úƒ‘¤œ£“VÍá÷¤µ§’H«¦ò9¤µë9&åî7Á:¯D-~ÖKb.q1`}P3èªS°’Ñ ‘ZëùGü)R·JÅü§ÒÒÍÕÉBa¤ËöØf©îoœ’¦Ñ$ȇ+g府dÎùJQ¾@oi…½þ†³`Ù»âíwH7}üE¥›(uO7Qò†n 1•hV;äÄMr 5ÕšœRÛdNNe’eÎÅ¡Õ]7»‹mèMN åÚäT¿W×ä”Ú«‘É©.D m„H¡ £)´åoiö²39e:D µ]_”8?è‹çu_hÆ¡Á÷q^÷‚ç…´8BjœW߃û8¯º_ÄytŽçU‡ßÆù®ÊçU•ÏˆóØ»¯•É©¼F%a¸ÝFøä7vL^-ºRN\§=F±ÿhs`Táù^ü¹“ŽýŒ?Z¼{©N,j­A¾AÊ¢–úNÎGåZWðñ¾.ÎIþ‘G·Y™Gžð<ëOIQØåë?ç´É‡õ“~¢¢éW¢'Ÿép¡Czˆt€T‡t€äé@15 kV;QÄÍ(¬5Õ$Z›lÒ‘O)3» BVwAÜì.¶¡K:P¹J:º½*¤CëÕéèA„HÇDˆt B„HÈß“èetXÑâ~ÏD:Æ|A¤Cõ…fÜ!ªtÒ^PIé¤C{:¤Cs¿$àth¿'=•D:4•Ï!л?(éUÛü˜]qÄž§Båc­¹rozïñ"5éÔ$uêB:u!:€P‡:€äuèwf–Ï ]⃠5­ÿ¯4òŒÿÓ*µß=¡ƒ$cvJ JuHÞS#¢fµAÜŒˆZSM µÉ$nö$ ÝEq«»¢ = ”k ß«‹¨½"=ˆƒ€Aˆù[€½ìÓ!Z îù‚À˜/ˆ¨¾PŒcƒï €î•/h…T ¾÷@u¿$àh¿'=•D4•:À&cÇÞ3fŠÚòuÏË!xãyLþ±l›ñRê’wÔÅÔXªYíÄR7c©ÖT“:hm²©ƒÛì鲺 âfw± ]ê€ÊUêÐíU¡Z¯†¨C"DÆ BÔa"D@þž:@/{ÔÁrˆ½{¾ ê0æ ¢ª/4ãÐàuP½ Sô‚J@H§Ú{Сšû%uçèÔAsø=uè©$ê ©|u@5«Ä&Ò÷G¾{fyLëÍ8´Ê9IŽöÚÎZ”¹ßY‹’êÎZúé~« vä\_")Qöö­b9¡ÛK ½7ûqyã‹ýURÐ ’w¡ÅÔX£YíÄ7cÖT3´jm²Cë4°Ù…¬îNÏÛl!ÚÐ ­¨\ ­Ý^•Ъõj(´ö B¡u "Z!B¡äïC+ô²Z-‡hÑ­ç ­c¾ ÐªúB3 î„VÕ zhE/¨¡„ôЪ½Ъ¹_†VpŽZ5‡ß‡ÖžJ ­šÊç„VôX?´òƒiŽ9áE÷ÐaîÛ›‡zÄ1h¹eA¦eAR² t{~…{l³´þJ|˘Pg%” ‰5 ÄÞ÷Ûšcì²OËé(ucQò&Æ 1-è¨V[AGmªcÕ6™1vÙ&ûk…¬î‚¸Ù]lC/Æ åZŒí÷ꊱj¯Fbl"%ÆB¤ÄØQˆ”‹ò·1{Ù‰±¦C”0×õE‰±ƒ¾(1V÷…f|cu/¨1VxA‹±(¤ÆXõ=¸±ªûEŒEç¨1VuømŒíª,1VUùŒ{þט.ö]¾óÍ1{ù×ûYTúvhv]ÅÜ"¤@÷׸ª¾(­†…ßåáf9øÑòÏx¸‚›%tÅ1_k¯î7;èò1Þ«lâÝ9>¡Ýy£Gù@K/u¾ÎË›ìÇØQT]`G!u½«é ë4ð)Rš’w4ÅÔ¸«YíÄ]7ã®ÖT“fhm²i†ŸìOy²º âfw± ]šÊUšÑíU¡Z¯†hF"D3Æ B4c"D3@þžf@/{4Ãrˆé{¾ š1æ ¢ª/4ãÐàÍP½ Ó ô‚J3@H§Ú{Сšû%Íçè4Csø=Íè©$š¡©|Í€ÞñÏÕ˜O·wÊcÂÍ„Êh´ëǬ䭄.ȧðG~,–r:벸ǾJÐx8Á'¯Ä±¡^¢ù†Ì ñÝýóúXÓMú'Ž`BÚzýyâJ:œdpA }À\¿y•BÿŽû¢†|¢Tʨ&NÇG²â´LP^ÎcSÁGt©rÄûUñÖyXJþ‚‡4ÌQŸÑ¥ó|3}ÂãXã&[÷ )`¢6BHPÀÕÍ}MÙÊtÕžÓ©ÙÉ;²…b*ûЬv؈›ìCkªI¶´6Ùd+½íöœYÝq³»Ø†.ÙBå*Ùêöª-­WCd«"[c!²5"[ O¶ —=²e9Dã;=_Ùó‘-Õšqhp‡l©^ÐÉzA%[ ¤“-í=è-Íý’lst²¥9üžlõTÙÒT>‡lAït²%“F¶@h¿=¸!ÅI·è~…£™Ü±å%ÅÑLè]Ê®@FgW ¤³+ê°«n@Í\ ŒBÊ>i)¤(úÝÎ=£ÍÞž€R÷%oºÓ"œjõ>¡¸áÔ¦Z]m“ÐóFcs²…¬î‚¸Ù]lC/  åZ@ï÷ê èj¯Fz"% B¤ôQˆ”€Žò·{Ù è¦C”˜ÚõE 胾(]÷…f|Ðu/¨]xA è(¤tõ=¸èªûE@Gç¨]uøm@ïª,]UùŒ€Ž½Sº|LJ@G¡ýnÏdþÂÝйLó#ÎûßJ|Ìùg™ý1‰3Ð]jèG!-ô£ŒúQH ý(ôzÀbÿ9•†ƒPý5»OâoEgýÕÃóJúƒØ^€RÐÜÈö!¦ÆÂð¬ŸÄ@q3÷üíj›ìПk›Ý!«» nvÛÐ ý¨\ ýÝ^•Яõj(ô÷ B¡ "ú!B¡äïC?ô²ú-‡hÑ·ç ýc¾ Ð¯úB3 î„~Õ zèG/¨¡„ôЯ½Я¹_†~pŽú5‡ß‡þžJ ýšJ#ôÿëô˜÷òãßy Ÿ‚L^y^È‚òW0+ýÈG2ʱ,Þü²È¼=äÜ$À–-}K€q¡üûÚ>èxå ÌË 1êøš˜''Òô0 B*¿_€Î/@è~j%geÚNã„žØ ª_qËF>G%›ßNÆ}ž»| âw[§MB°Z2'ò!ßíÊãÜ@®Ju(s#¹"BLåšÕpîyŸÿZSMÊ£µÉ¦<‹˜Ü!«» nvÛÐ¥<¨\¥<Ý^Ê£õjˆòô B”g "Dy!B”äï)ô²Gy,‡h¬£ç ¢vƒ´»µfZ4EkÉR‚·go‚Îä H[= ~è½ßÆM¼ ááR †*ßò>¤nŠG1ñ…Ø–›¨W<Ú™š±§1íÝþå…˜Ù µ«J-À㯔å‡9q”û™2$ÅžÛIã»›ó§óÚÒ&!¦K4—Ÿî •ï÷AõlOùŒ‡O&Ú ‰œ¿ÐO\þ\ýý¤æ1±<Ê|O>áï~-‰g®½ß%]RsòïØúþ—½¶#ã'w$ûNéïÂbu<·osÁߦšüüaëcƒ8¯¿kí¢ 2_¾`´>¶Dp!Þ™u~D/ù#ú–÷_p™wøÃÙ>§»s™Ÿøo¬§p„-ö«/>Î-§5CǦeÛí}Þo¾‹'ñWq¸»Oñc‰kßû”â!’ ¹®œ+'î¡ë«Ì§ÝÞ·µæ³÷Qâ'Û‰\Ì¢S2•{]–×Å£Q>òR¨ÛúíJ˜Ú$¦Òóa›×™Y{ŒîûÓÇï_üÏ‹,û”þÆPþëÅš>ÓÅ Súç?/¹æ-õÿùâóËÿNzÿ÷ßv] endstream endobj 294 0 obj 9812 endobj 297 0 obj <> stream xÚ¥][ÏÞ¶‘¾ÿ~…/Ò¦A³²x% ¹Øl»­$Žk§€\Ø‹¼ ìÞìßßJ<ÌA$¿E¿˜ÒÃ!9Î<¤4|×ëâlðŸ°ùøâÿñ´²Kï^?íë‹Í›ÅØðâqìÿþõÉø}‰¡-™K+ü+ÕÁüóé? è%¬[DXG çÍ,²\X‰|˰t¡‘åŒáÅØŠ.VÞJgð\°°¸=¸[É©´ò6’ØøÀÑ…ß ëwÛˆ=K+ie¶¨–ˆÌ`#/dgi%¢Q >½}]¶òø¡°Çöù7Ž‚%·]º}U> ÅŠìl E\2†¶”oo¶½írÛùvm€Õ)VQ„^fAʱm¤\éo…Uº¬£Ê¼Ì£¹ÛêmwõÁòš ÕNмl(ÍÛ4ÐÜv¹}©ª¶Nµ›"2Y‡(m¶-¹Ü¸”>®GªŒ(ð/ÕFjñ(¸zs=N{½„ØÖ|ªÔ˲(´ŽæßéV‘œnfQ¹b+šÕȆ“žVÑ–b+þº^u[ù¬Êi2EÞiµ[Ù×Í,-U$¢x1–,ë²…Z´è|³ˆ¾ê¶ÒÛÅL²84òï":—lc!ôY¾ÀÿA:ÿq†|c2aË‚šù¶à–ìhÊ¿Qø:çú‘Iø—³ãÁqÂßqCìÏá}‡S"ÝÑ„è¶t6 .\ÕgÂ,w§MÂý”Ãfs©?³i™˜×W©h ÃÛ ¼Ôhg@ˆ_FÆXfMë FN‰G¾±W—¡g(¹ ”[ítÙŽJ£(ÉH×DœäþlàXyØ:×\¬:@tSژʨŸ³7Zž3ȉ8Ï}s?Bæ1 ¹X”ÐM‰™ X§7ÿøçïOß¼zù{aÌ‹÷AÀ§Cè@çïA±ÛþâýãéŸÖu_¼ÿ¯zß/>îó-þy…¾oÑDZ„xô›cÖÆ$E~Z­'8ãçç ÁY»ìû&p_âŸñÏÇÔüóWRÑ»åˆVTüÿ¼+µ$u¶m ÁɦРæº;Ùý´»eµF€~—4[ýº­cW¿˜Ã÷•l (%Ê~n¥³ilHç—àƒ¨óNhÎú¸DÅ*þù¼ü+Iùe&gcXV òÁWõOÚÛÁ®6©Kòhì·ÊÇ™žþ[w+}¢³~O!æÚƒ…Àr` jÏ‚»ÜW9fbl\A1~ÔÏ‹/õñ“ 0Á>k8f;–èf†c r‡ ‡cÊDú¡ÄEov÷¼n­ël·.ïCÁNýë¾(©.p.…þ¨<®(½×GÕWØé·û&nÛ»iqn[4k¿Ó™–´AÄãøäÁ¿Ñ:ËF©Xƒ9yØm¬ÅÅwuaaÕsÌë #·ºÐg¶ŠHXˆ¹x£…@Ãʺ¿K-PP’jˆÆðý»µú<°Bý0Ôe?®ªÿ%B\9–ŽÅ»®ðoÄó1þ7 «EgoDº*·±-ñ¸R¿Ùèþ(MÊln1n›QD´‹1ò±Æ"ùÝ ,&]03ö°KÅü‘܇y¾IÛ®Ìùû§þÂëLælí–>òè»z9_*‘û™®iazÙã|ÔÚ¬RP‰ %+,·•ˆP{ø–ü…|8ï(&‚³’"¬zçK” )«2 †ê0 †¼c¦†V­ÕNheðahÕº:dZŸÆL"DJCÕá2Ðh¸ >.ïC—Ipá*“èª0 mTSL¢k"™IÌ™Ha“&R˜Ãß3 6Ê“)D æ=]&1§‹Â$T]h³w˜„ªIp-¨L‚t&¡Íƒ“ÐÔ/™SŽÎ$4…ß3‰®ÈÌ$4‘Ïalt=&1VDfü1P&ÁH„Y¶Uv$4“½Nº/èjXÂôŽd­[é0_ò`Í”©R†™§(½)Y( é…F…ÁEaZq‚yë3Lë,%«=i!ƒÓÍwÜÜuÒÛkèŸþýÍúå§¿þòí«×ï^½úé—ÿЉ‡8°­ÒHÀý˜y®úÒp€zVß}“Ï1ý7ù­¾Éç íM¾ß¬‚s–¿É?ÙèÄ›|d:ˆŠ£7ù۶ɪoò »/Þä`zß%=Œ@RÆAï#Q{'_Z`öpåœ5‹?”gÁ^ bd}Ô^ðŸÜ"8|‰·˜†(Nx½tÒdæP ó[l¤Cá ´ TzzØYz)déû–ÞpŸÒaaF8rá„7üÕ~ªŸ £7þ6õ¦O„éá÷g¾–OŸ;X/j×)òšºl ëA6F)ªƒ™zÀ€£Þ¡ßKɸý⬨¹ã†K²ùOµ§ï<8ê§Ò<_]pägruaau!po$ZÁ?ºØ†YÑÒì`¸7ꣿ†úµØBðàjº¯MÚþä º£·Ó.ÈŠ-$ÖÈ6÷²µËÒ˜nÁJñ°QTLÊ_•í+Ë&ô9 ÿi5ÔHü¹ÀqknJÿ˜ÝFàTJ‡ØÆçéð¨Žtg;ôóp±»óÃAxë.ž¤/ÍàIz MÞÌ}äo_|¢»LF>„¸£=”y°ñÏW3h,gäg åËÆýãFúŽ3ï=ì÷Q'Û ÊûEóV~àÛ(!m¢ÿ«þp]—…Óß8àhu〃î6$Î9mã ; 2BÈà ú:ŹäLE÷Õìëd›7ßl>½§áðºØ{%Ý,4ì0[làvÂ&Qèbðî…pB¨¹ÍØYãu”•i@’(‡z¿yàÊ‹…T0×â_Ì’nä»òÎ!_€•í¹ÇÊ¥pæ÷‘*t!42­=ðuysÁ­M ©T$Šöι¶û¸ob[y˜e .´ƒ¸ÊE&m2%Q‘T&}vÛÁÚØÚÆY.Ry›©Rç‘ʤ/.ÄVU©T[`-¦D§ØjÊG¦©`v*¿\( E*móÚÌÁÞ«-AáÜwJ¶Ô–Rë6ߎu§ZC*²/C*³!Õ nmÄ—ÛYh®ß6ÒV©¦T$fS"Ú1@ZD´­ÐZÕœªØËœÈÒNd±Ei‡ÔªUÄzq!¶*+·K+üB1ªÒF6ª"2›ŒvU‘Zd´Í`ˆL«ñË®°°Ã!%¬œ±õvÙÚ¬…Æ®ªìÓ.ªÀËpš nmÄ7·«O ¬‘¶J±«*ñ2z¡C(n‘^¨vUÛ¹Œ¢{š ½@Ú©€jÐQ´Cj»ªb½¸[•5·«9‹VÚ:Å®ªÈËjÔ ÄЪÔFÙÚö!$§]-®±”Rå ›o‡øj¡µ«"û²‹"0N½àÖF|¹šØX#m•jWEb6r¡C„ûè…Æ®J;Ù(ªØËlÈÒN„&þEÑ©UíªˆõâBlUVn‡&ŠVÚ:Õ®ŠÈl5òB`†V¤ÆA½‡8íª¼²È–!/øš „48›V)´¦UÄ ‰É.X) φUD^†Ešh«<˜¸ËDÙ7±È¶³Q‘h­‡”zƒ(û&¡Ù¤h+¤ÖCHMÆÀJ¹…lNµ~¡˜S‘OåeK‘råB™mI{à÷$šs™¹¢¬~Š]ñ¨6³”ëMÅYîß—Fý)Ë }0ï¨ÿŸXi²7` bé3AAEà°ÁŠ'舃È$ÒDh>aà¤D´œ[—qZ<$ìbµ8GØ9M8±”˜#pñåK°)âë4Ò'Bœ’O!§…¦~tämb?@¬ÃËC±?1±<œ|°TKÖ‰¥‚àgÚ(–/´QÄí—Tvx8Etð›>CÕßUǘ§à ÉÃ)Püf–½©9y8Åj’ÞxmúÕ t*ˆ®±oðõwôÅŽ§ÀÖ}”7ÇS¸ãXŒ¢N÷x ³-{”í(G<¬ÇxhÆM ¿þïMi—iý9gSà' Þ ü;4÷,Åá»'<3a¬8»g&pdä‰?«“šcD÷wl¥LaÒ<}ƈ øò¤lð)QC׃h™uUI&õð°:þÀ›Þ]ŽŸgœb:Ež#¢Õ­_K&Åo®ø—Zbʱü«› ·4…ëù¤fˆLß ÞˆœÎ'=»>|b˜QŠé¿7OìfxÒâjúÅìaÙí?`|!ïœç'¦4m _Ý}³ËéÑ?å£ÕS8¨ÊG«§ xUÛïùÛn€×Çù’çA» ¸¥ L¬‘2)Ãã>6Q¸U*]Üjv*]Üjv*enÅñwÜŠ«Ê­8èÜJ *·âHÁ­ºjÍÜjR­™[ͪ_ûSjM=íè‹22\ÛÌú»í‹Å‰rë_~O©ÎBù¾R¨–Ê¢TÕÞ²¨¾È‹E©"ŸÇ¢fum¶ˆ'ßOêz—æØ–Ô¬–c*ß©‡,Õ#œ~”¿#8¤ÕÒ·‰JðÒöÇ8FÛã˜Áþ‡xf¬¥'ä¤#m{¾e7‘ oÅy)˜ ­p 9S TòB¶)£W);%TÚϳ690( ç@l÷äõ}$&´mÁ¾°‡Kg…Û×ä b Ý|bŽÑò‰9fOÌáj>ñnœówùİ*•]­“gÞàjîïø¾ŽLXS:WI& ÛŸVRʱÍc¯·rHïøé §i§£‚ÛÊi(¡ËdæG âìLLJ™™©¼/èÇ ’µ ùBž|ܬ@Òtz tñjÒÈ^Aõƒªïåò×5›ü”áÂG9 »³¹ÅUàð?ñC¹ð-½ãçÀïâñ1Œ;¬> xDcgìNbþ_šF N§(«G-Ђó‘#’ôÀâYNJû^š¿Ãø.€ôÝÜâ®÷ò_ȷ΂u™nÎ8ÇôsÆ9ZÍç »œq‰s^˸/xÒ8î'¨ùQäƒÃúš#¿¦ 0Ë(Aï”ãéL:›³¯“¸‚‡–âº_n±G¿ë]ø+ÿ¡¹ ¥Tùh*Uài+´L¨{õ`g-°*§±4Oki/­üzÛ^=°¼¦B1™*m†”òíb5­ôZ»6ÀêdéB/Ëi/Ħ‰æ¶-à´UŠU‰§håÖ†ªÈF@mŸ>®úŽlHø©nk'¤Œ]¾Ðà¯ö.Qg¡5¤"?YBxÙ )“2ÀËÝY ¬ÊeHUâe)Í…£•Ÿoûb¹–7ÐT¨†Tä%KiKçmßÚY•žk· °:ÅŠÐl)Í…Ø4QnûÆåñFÚ*ÕŠÄËPDÙSÃ*"‹€¶ |ú‡O¹Ð.ZŽ¡ +ÀÕÐU ­!ùÉŠÀËNH™4®Ä¯µÀª\†T%^–Ò\8Zùù¶+QÌòš ÕŠ¼d)m)ßnì¬JϵŒdµËŠÐl)Í…Ø4Qn»&¢ñFÚ*ÕŠÄËP”21¬"²p4´áéå6{$k=¥ÊWB Zh1ÛeIµÐXRm@ȼ,A¹àJ¸1¤´&Ú «òP„"cf¥"ÿ´¦*­‰5ÐTx0a—!(\5­ôÓšh¬ÎCJESà%W"ÍFGpÚm¢­ò`âNC‘åÜ@.gy—!©ÏZg¼”” I#ß4‰«aðä´m"~R/6ôª<žO8VjÙÃÙÆýxY@ˆÛH²UÊ “$}H08µ¡ÄÓ#ç<3±‡Ìþ¡7âÁp¸€üvĶÙZn‚o æ3âa|0AÅDP…hÎ '¢´p•#ÇÍiÃÄ’“/«²üZ™p‚8`­t­4EY9sÐJ¢§¸ 'ƒGÙÕpi.Jƒµß%˜X» =`õb99Aë»>±Ò˜`|"ðˆ€ ¡ãŒi pfMôÞdLû”1ÍA³ÓkúùÛԜ˘Æ_ÆÄŒi^›¦÷^êa}ãŸ’ÇÆwo EóŠñLÞýЇy›2í–÷>Y~Ê4ž/ÛÑR¦íh`8Câh`ö ;0š‡;⛀?'e:à/>ȾÓdd›~ò9ªÃlô»P]z•°Ê1G~´oÜý¨ŸÛùËL¥¤5ál½¦¯w|·ß¨ºô*Giߨºô*Gjߨ^Þš#¹óÁ×ÎjÃÊ—uûžÎ”çðû¯%ñçÔ6½·÷ùÓ&}u¬ö©Ÿ|8®Ë11FÌàÃó>ÜåI…¹tþSû:–‡ë¯kCm6~?œµÿø™à¬àoÚàg‚¯}}iÅø´üiüZ4ncU(¿«<¿ÊÏOëÏŸ'Ö¡5Î:¬¤£8pQàÇt-Þ:~(´ÀŽÏF©U‰œµúPÒQÀ—päªú_*!‰ë‡~õ4qSu®|H¹#Ý"Áà9ªÈÙ)¯®Ÿ˜ wžØÝç àWÓ,ø3 ÎØþÆŸiÀóó…$‘E/´!Œ÷½Ì.½r?‹š£Õ,jêgQs´šEÍA÷YÔýñž_‰rŒö•(Ç ¾åð|Y‚†Ó.,nCuCvGªáSk¸>|>µÞj ¯î|Ü ÞOx½†é %Ö,ãu]v " ¥|‹ßHmF YB fo ÌD"õº/{p²·àzÀŒAÑ[ž¼á£c g[ã©t›= ý[eËQÓ¸†Å@#Ãbð¡añ> ‹Á§ üÔ„a1TǰR5,†™È¥Æï“ÑC³šWºQº³‹îWÀ£`q]“ù椋É|sÒžÉð7|“Ùµã=Åóà ©\Xºz3ã_ðŸìÖ÷/™AöôZèëœ^ }Uõª5Î:Ø¡¯Â™ÝÓמG+ôµç| }e }ÕŒJ_™~túªéüž¾vEfúª‰|&}í·I©ï¿É¸Ói{ÇŒq›Ó~^׸ñi°ÁÞfSsà ›šÃÕljºÏ¦æH5›Zt‘µKL®ljšÎ¦æßpây8ºPQy'ÝÓN¼g¨q­Õ{jÀÐ#f õô›a¦´·ó]Xå¯î¸ÁîȲä>âèÛd`»+Ðw)ÔgGp†ŽÔÍ0u3ôHݼw þ9cèÆú6{Ú¦âbè»äi &íÍr§mÊÇfJ½|\‚€&Õ6‘šœ6šœ6™F1¸Î¢˜iª$ª35J3|•B1 Æ zúÌjNŸ™?Mê 0ar¨Ï«£“žÄú´3çIðtšµçIX²ôšN`询Á¥R$M«· ©+ð"HšÀçñ£IcÎã´Ž!À³ŽiIÒ ò[s¤y,ç)Ò¬ËÚÞƒh[_ 2ØùbhúÊ_¨/æ@ßd‚¾zÿôãÓÿ`vÕ‹ü°Úüõ)0%,-¬éë‚×\"Ð\ÿŸO_ü7Èý|ó¨W endstream endobj 298 0 obj 7579 endobj 304 0 obj <> stream xÚ]K³Þ6rÝß_q²lÏ(ñRÎÆe[ªWÙ’õ°SÚ¥jf*57UÉ&? 4мYèÓ‡ËÃC » 4@~ûã‡ÿ}Ø?üGþØ7£Ëÿ9oÃãÿüýéý›‡ï?<¼þÉ<*õøáoê1#ÕcŠÁúÍ[óøáéá›/û¾‡o?ü'W»Þlà ÊÇåãWas!1ø[Ò~ÓŽs~Ùµ«ÿ„·zSÎpü·¶Ý¹¦ïÒëÍxü7Œ‰›pÉ÷œ,f ;µhqL›æl¯8[ [ˆ¼Œ }’’`䃮||Fðì“Ü–©³÷¢à˜/eüf…:¾û¾}*çüøá!G˜Oû¦´{|: *{ÿñŸ94]¨Ññ *Œù¶h·ƒ/¿—ßàƒßrÆå¾0zvög¸¡ß xØ·¤÷„&Ø-í¡~Î_8q¶¥M–0(ûÄ/ÿ£Rî:Cý—ÿ„G}Áì¤Ô¾in¦ƒî<¸äË„yCr„lIéEC”ÙóØg/R¯ÚåXØ}6A?C#û—ûÍÈ@G£¿?BGˆÚT\Pº|W„ J¼Çx£ÊG‚¿}ùöû üõÈk•É·‡f¼_¾Á¨|õ2T¿ÈWnÌæ² a•Å ¸¥âFú5û´¶Oþù§Ö¦ ¹µç”ÕÚ"åó¬o\«Ô–ë+«+kÚͪÄÏÁ ´Eˉ¿c7"²ÓÛås/Ø{J³ÜLfú ³ÛãµÌtùV£ |kï1·Â3ÐÐ¥1™Y´…™‰os½íQI8{¶ùìûG9ª‹1i]A~½¹oª®7m·ìÂJY”zÁ”ØJ¥÷·”²–Tjm¤Ü©«d.qÔHzwÇPAñoX Š!†¼žÔ)›¶6M*ß‹TVÁÍÜ‹¾Á pN9Î/EY˜§R(_ÚùåŽ#E× ¡ˆÈ '>Å¡Vƺ‘µV(’+sŒút^«Hqh|-þÂ9ÀžJa¬šSzÃ¥0Ô´—Ñ )†>å²é4ތՊ—é%êtSïù^:Ý^¾†ÁïCÙW:¦ë„¾·hœÕÿÀS•0G[„¡r…Æ_#øj( rçŽBÀÂ?ž|5$†r·Ëp ²w<ÄpÁС׽mñÇLƒÎ8c¤³Q •I±†¢ÁÜÅÉþhÏ(Þ‘P ¾A†#®¥PÚWˆÆÖœ|´€‚ëœpÌmcp ¼è„Yó=f8æ¶1,ftB‹ƒ¬ù½+À·1ððQõ7|C}Û1·¡0Ðâj(œTÕѸàpPT¦ó,7¦¦LV´OõK»G“‡²?PÉ)øÞ¢àä«®ŽêiTv•Žè™P¹ÇÁÉ] \Õרܸá˜éwÇCWõ÷Pn¶€#¦Genhà9ýСչ3Ð!1s ø3:Óép¡<L‹:ƒy‹C³iš¡|#оÁÆc5 Ž/ ­9µR4ŸE×9ûÑ!€{8Tªæñ¡80÷£C03÷`¨TÍãP¬Ð ¡¼´‡B¥©ÞJa¨/h1¸B#ª®æEË- €5ûÐiâ§öuìÿ‡²¯8t¬éøÞ"¡qVwOõ5*;`ŽŽú±g@8_õ8*wþáè¨ÿxðUÏån—áØ¨{ÇCh×é}T ½îýè¨9:ã Îv†€T&EЈ»89EÐ6¥!RSü2%˜ö"¤±5'§4D@êj8áXõÃÈ‹NèÁ‘ÒàûÔ5?0ñ8ꇑÐÃ"¥Áï©É~à…#qÔ#ïï‘R÷wT?ð¶cqÔ#->¡†ÂIU Ee:ÏBK[Î…3ò4" e †#}a ¾·(8ùª+£z•]e…céÄÜñÀU}ÊŽy¤wÇCWõ÷Pn¶€#éÄÜÐÀsúC«s;æ‘~@Äþ …Ît:\(ßõâ-ôCù>F}ƒÇj@_ [sj¥h>Š®sö£C8/÷p¨TÍãCq`îG‡`fîÁP©šÇ¡8X¡Bxh…JS½=”ÂP_8:Ðbp „FT]Í‹—[kÉ *×ôƒÏU££Ç?øŠÚºÖ{œÚ -oui§ªÇpÀ‡!ŒWϰè”Õõøýp¸QÁxñNYÃ`üC·l„púx…~„J§;×CoC;Üøàüñèœ3hÂ3.„?¸ ãyúÈ_OSA«i=žÍ&‰$©°š'q?›[Щê|‚Aåâµ\E“›¹^E¢ãZïP©¼’=lÜšŽ¡Dv-GQÖ±ÍûX6 ¯×uhz~¾X@Ö–Ök$Í;Ï6Ó…‹Uº™¦g)L”ô^å/Qj– £IÔu2Œ¦3æÉ’”[çVÈ´x>;§‰žÕôœNµfS>”$XÍ÷lŸÍè¤s=y`šo¡CÉ4æ† eÂ`¥V˜4^¯’Òe®ù’Y«]¯¸‘E“ùÊ ]þ[-ÝÐ4ül1- ­VPRw–U¦ËëÄ2M ÎS”$Á½ÎP’$Ó<ÓEÓ¥«TM[Ì’'(á¶Êœ IðlNÓ7ë‰8›7-fr$%pcÇäõJï³Éåjß]-ž-[“]«Uk²ú8[ÿ¤‹çóPº’u½˜†`ç+ihUäzM†.ä­–eh6}–Ö' C«¬>ÉÎÎòÃtqaž ¦™¾ëd#JPÏ3(kt³¢‰ÎUÚŠ¥¦™’:[æ9Øìs>fi—åq3Å|[Þ ´ÜÔ1,ÐÏ÷½%‹=ãBïl±yÜ£°Xh†EÃÙš%Yç^®ZŽ‹Lóå.¼nº\ì.æk'dÍm±v2&ÀgIøqíf‘€‡dê,—KòÿËl.ʲ-²~8£¼Nù¡ Ì*/D3«'w\½5Þ”×}Ïã¸1Òé}óeã3½…Mšo`ò±ÿò/èìz­ŽýÈÏ{6È内ìzögüÌ@bu#gäûO—½õõåÃ$¹™ï`ï4Ú\jmy´"°sfR­7› ü:“Qö˜{L›f\ˆUÓŒ+†N›†ŸžR›u¼U/ÁáýÙ¬¿ÈU·»ÞÌ®xåñs”^ œ¯l×Fß0žNû¶;Þæ€A&ûÜ®ª™{¦½lŽ'¨ßøjÁ¯ÓÍÉ)w`÷šS†3¡9 î£_aã÷[¾·YpÅ´^*Þ¬—ÒI®Þ/î7«¹™XúïÏö¼²ò³f­o)O«ÁÅB–ûKË€Qz’+1˜§}IyZ–‚Ž'”þ|<ÿ„{ˆ<Ò^ÇWý(|}§¶¸{^‡Okê’Þ,mÂÏ=åÁZ†ôBMU¾¢aHR?›]éèè^ᆸ|ÓDN÷-‡–n YáÊüy‹³Kœ9È”GYî;¨Ç.:š…]^â>²°s¸Æ•îOþ‰Ùëlm:ifÈ:`£:äÁ‡ß *ð’ŸsôÜ´îø9ŸI£l>þ¥ÞóÝdæ”zO›Ñ”ý)JßïÅŒVêÍo1úŒ×ü–%TòA—Ž£¹¸-…›óeH[H]öòd^`(áQ•=!]žtvBH÷ç¬ûóãeð8f ÃøQž<ÚóÃfÊãWä9¦«Çƒäèå€C…‰- _ 8¬ò€“Å«ò·‚œ 8)84p(ÝdÀaW¾p¦jÎMµ箃ڀCñ—ÎÒEÆëm¿å¢c&°t‘ åI×.2Ñf»ßrQyÃ~ÏEuܘ¹¨}7]ÔÆ>ÙEµI%1™w[Ìiú¼¬öÜÐÿÚÛì.×Ï}ßn¢ìvìÌ’°j^[£ü¿Ñ_cPÊ!É0ß±‰ØOPEŸ\¨SÊ6 Š”ÏPgR98Œó²«ÜUåæ5æ@ÇÛhx4½À Ü:^ÅcŠøq¿ùĽäéM­eèˆ-Ü8ï1&åŠaþç~ÓaÈãÇÙBD|¤Ï(ûàç÷{y@ÙåƒôƒòA^¥žàø=¥ly7üéR\”õhMÜv¯ØÃÔ—âÂÚ‰šsùÖ3¥ùõ‚ݤNÇ-•Û ý…¡0QƒHWh_j©ª\ƒd¿%¦G‰Q۱ч@ú~³a09.Pº·¥)he _š‚ÖA6EÑÓW“%«]¾ñ ½¢YO­"yjÎò:% Z›³J’Yl|º[ ŸnÆÈ'‚¿”Oëè2~?» Ut Jaf P)÷,*E´„pmR]Í·v„ 8zñcô¦6À ´íZ3ËÁîƒ^A±ñó(iŒ‘ÿšäÄ6²‘ì}­@f” @$Êç(¥¯TÈ×¾ºjBÚ’S ‡(sžS×–·ÌE~H:$mR·}Tì_J’¾¼À já‹d»Š‡ %h¢Ê›Jø=ÒùŸéû·°Ú1YhNùxñ‹WÊÒ´À‰õг9y[°^qEúMšò;}S’ ¼ß«/¥L^u‡Íwž”Iºƒ¢®uE^è“[ñª×ƒ-…¯[±ªßsú<“ó‚¥Ü0ø‰Ã´ iFòÎ3}&è(ꬋ¬QŠ!_ÓסqH$ÞtWFµÝðÊ~Cm`r—Î*‹@Aï[¥ ìÛàŒ.F›Êkfù•³víÖE@«ˆ"ðeDÑ:,"ŠÀ×UÞ<»Ž(‚šDAJE bD½ å²l¤gzj½;º ƒòÒ0θ’›ö,MuÞìYšê¼Û³4ÕIñWª“µ¡küÑDbQ"½5OK­ºÑ·˜˜ý ôB¯¹œ¶‰Ø›†m"V6¬pmR½kËû±K;íÌšˆö;MÄRÐBÄŠna"–ÚF±¢½/E씲‰X‘ò"vÔGíÿÔG6íVPë"mVA]$'mª¶PÄM{¨oû(šË2Žÿ„AöØ~BA‚0Í¢**N÷}gðܹoé;ù´ yè;ùr—9Õð¶IØx‚ÍTF2£çuhŠS‡ÉZ!(N‚š(N‚¼Rœ&êéª}@àK} U•ò*+¯b¦‹Bïeºì.öy;]ì3wºØ[;]LŒ×ÛZ¦‹‚ÄL‰™. º›éšÆhŽ{±šãflæ øKÍ±Ž®–éZF—0PÏ,"áž%@$ˆ–®Mª; ¢ d‘@m Š’E­D‚d|.ˆmd‘ ÙûZ$Ì(A$H”Ï ’1¤’ø3ÑjóœgÊ#j:0ÐÏT‡ËÝÿ“°á'mVO_SâïCÞçÕb^îÍ]à-zOÕÊ3ôŽX¼-YŠHêš>R3ÛƒÞÓÝRV«9S“,…p™E¡¨‰d!È+ÉBaâ8-]u2Nørœ–ªÊÇé}¿»_ˆBïI»²¥)(ha _™‚ÕA4…j½_ˆ‚DÉBA¢d¡ Û’e[ YîÅH–›±’…à/%Ë:º@²¬¢K 3K€d¹g ,¢%„k“êN$‹hY²Pˆ’…€dÉB@+É"ŸKbY²Hö¾–,3J,ås$ i,Y˜›$ÉB@ér&÷kFËv}EÓ,Y0$[„¡F5 ‰†`d C@²†! ‰†™Ãe¯±u<Öë)nÏrAÏ›]•Àñ#^ËäE]+мP &ÒU'Ã/‡?©ª|ø³ZX•…ÞTÙrkSÐʾ4­ƒl e®ç  HVjöðZSÊ<Óœçè:­¦nÆVSwc«)Š¿R7¢«)etñÑxj‰¦nZ¢)ÙµIu¯•€lQ 0HJ€‚D%@A % Ÿ)jQ ˆö¾TSʦDÊg(Ú:Q p7 J€‚ÒÕzLYéO ÎòpSP<òÿÄã#w“{Ò²›ØóÆÔ\¢f  I3PŒ¨(HÔ t­æ•/¿à©yÅúkW>Ò7gèÀ«Ø_ÐÃK»ê•ì}u­(òB70˜4XŠW½,)|5XŠUeƒ¥Šöî> ½§òýsô2/MAë ›Â¹õ> u‰º‚îê†il5Ýp3¶šn¸7Pü•n¸]M7,£‹ÝSK4ÝpÓM7È–®íÍ}² DÝÀl é u-tƒh|¦¨mDÝ ÚûR7L)›n)Ÿ¡hëDÝÀÝ$è êºarû¦ll†òî> stream xÚ¥]K¯7rÞëWÜ…la¥Ý|“N²ÃzxFeK–<³sd6ùû)²›zt“á£KöÇ*²ªH~dóðìûf´sðó6<üã¯Ïv’õËëgqpÉl^»‡Ç#a·àþþL¹ÿÒ±!kJoùïRêøóoÏþsjÓƒmw–vƒàš>äj²lŒ~,é±’F$=§Gé5}Hĺ²|Œ,i$?Ñôh”#uHÚŠì4ÚR¨¦þ É0Ö¼eœâ6 Á?BÆ ÍY‡ªÝÒUzË8$eY8Ù;Õã$'â(cFlXôØ„3\z¢L—}LwF Îpƒ†`jpF®ç .öŒœ1ê¦U$P=¸T ¡Alb£½†Ç¦UƒkI£ÍÎ`ê"hÂé0¶¥L­7)uUz˜ÂªK­ºˆ†°§" ÄUPû6„MOƆë!CŸ!Õþ®Õ¥žáPEá2&Ý »>®òjéQ>.Ób©Š<eLŽêã*±–5à2-ŠšÈD’£uêÃ*¯–EòÓh¡ÓûUÜc*Œõ?7ñ‰ˆ”9"§ <£‚&›ü!C× Áî}ÈÿÁ|vüqÌbÁÙ!Šœá„%jœÙê¸ÔþÎZö¥ùó~¶c#Ñdl¤“îÂðHãó¾§°ÁzÚ]jÒ¤MuCêPÀ2Îâ+³6G§#¢2ÌÎ…ÿ’?~EÀá CºüñUû«ÿö•&ÎÒ»Ûv§“(“ÿ}U”Žú´ÊáFD-ÖÚmf ô)¼åpã7§¸—kz}Vªøéå‡g! AúôÄã>_3lí…G;²éýá5üÿ×Åi´‹= 3¡u¬µÛ!L’a 7- ^÷ææ?Œ¥«å·}(ì[»ß·îtö ѳҟ†]±º}þF¸Mg_ÔŸ0Lg’ÜÌŸ›WQôZè™óÑ2wobšÀõðÖShÂmÓŒqmÖ4ñ²ß7 ÁñZÇ[õesø§VúU‡ÑÏH~ùŒúƒ5B½Ú´Ñ ÆÓACçmäà¡U3îÛžÅÚ»KºIu5—è`þ„lG•—#µžÔ¶kÍ@lÒÚ½huDÆ×IoÆÙøßÒÙ‹ÚFc@<Ú Ùû{桘‰Èó¾iºÜ!²š·þi‡Ú¨¼@C- íü · ¶Ã¡§À °Øb¨Ô꣄†ÀzÏrõA¶Þ3Œ«ˆ<Æ€ûº=1$é}³FŽX†h‘vr„í£-#÷2%eygB|(o,ð˜BÜž9æ-YË»ù+ο€ŽXa²Wly§4Äfäq÷‰Ð&j§cÝ‚*§7ç¹{†e ¦VaK|À`¤jÜGŸØ"?ñ ËHaæË"`J“ê†&äM¢0‘HZo¸O¹TUÎ t$ ­kšD ‹4IÙSÐÌ>5­ƒh —·£Ì„&QH“(H¤I´L“îb«Ñ¤µØj4i1¶M"øKš4®F“fÑ%P•;K4š´f‰F“DKºIuoh’h™&Qˆ4‰€dšD@3š$ŸÓ$b™&Iö¾¦I·"+M’DNhª7i!Gçú‡¹‰’£LÔ¹Ñζ-)óϸ ö±‚@0jâc•ÊÎ •Nø ʉíD6C0›!‘ÍŒÈfæ†ÍäŽAi³Nß«T:oÓðºÿƒ"LÜ{ßöûýv“ºÂ+ Šeç•‚þxÐÍ•—é/?”Ãd±¾Éwùmªnï®&ê‰ó<‰ƒ¡*À^þÌèåm&ðá,ß¹üÕûà}›SÓLÔopw¨(0ô~úy7î4üw˜þƒ†çý®òŠoPª4=¿Ù ÐúdÙ«\WSÁ4¨aùÀª€Ý´oÊqÐyLºü"Å0äë‹ ÙŸþwè·¶;ù– Ö{^üVæG ºÆåâ÷<@TŒ`Ÿ_éÌÅ@˜Ck}lN³ÆŠ/‚‚· I¦m x‚YÞ7šÏ¹¾{yEH˼Þ9ún ÌŸ€ŽeÞÿþÍ»ÿòþ׿üòîßä¸2B†”:#QÕ4zs—qaSüÕ%—Þ9.¿ðÝ­¶ÉmÉsŒµ°f‰0ªPäUÔj_Þ¯Q8ŽZèXÑ3Ì]Ð*rSbe~Ä +SÍ@x 4I æ!¯L5¬V  ò[‚)ë^]„Pêôïx–#nì mÒ÷ÏýÖ9Ë@žv\§¹:•7µvR†Ñ$cCý‘ž<ˆìªd<ÖD!”*gïNl}¼l»%†úwÙ‡ò.𬘱 êr«ˆǃÅS¬öwz?Wµ,ㄟMPñÔ_$ÕÄØ„&žI¬5dMEˈƒ¬èº³ÑÀ›tÜû—z I¸â¾¹¯Ôy“€Â½g)¢¨i'þÆñ=;ceöãœmþÇØ'ž€Ê»˜:ÓLRú“ÌÿM[fW'Ç|¾§l»ÔÛ&ó'.6YV&`ö‰«ÿŒQy³F1T_×|$;7ùœ™)A_áFzÃI{žAL¸oFyG£ô¤ ¨¥ ö¢â•3lŒ›|Üä512à _¢‚‚´¸Q®¸´ØvÉúûI¼ «+ø¼íá]AðÒm³bØŒ™´*ïš•F)î’YjÔ‹¶/C¢…±À® áô,qƒ¹ñ×]Ž‚žs§i]–´ð[åØ,üÅŹñV\Ðç]‘î˜_Mòúû+¹à$A싾 þÔšæ¨ Ò¾ Q‘"¯ &‹|#ÈyŽÙí½³¡$cîõTg;Àñ%v¶Ù¼Õ 1(ˆKÂo§4¬u *„\~O‰4!`‘O1;ž<,¨ÕãϾm›üÀg ï·èxMûyåaЉ†È ñ·)ük¯¿·HµnÅáˆiËï+™?ÆÂÊJn¶;ê÷²› Hv3Én& ÙÍ$º™`d7Pu3¥z Þ3ôs>@¿1š#ÿ6ykšƒ~Á üZX1ÐÏ-¢J0ýùÎsÚÝteÁ)‘.^½ÕÙñV¤ @%/Daìéoˆ½LÚþBÂïð¾ÁCœôü´F~G4µM¬q+²ZC9³F‰i¡sïº ö§l{8÷¬a`‚ ß<—'P10 Š`Ê×B(í„:¿ ªÐ–˜‡©Ù0xóV¾ášø $¤Ä…½$ï7£æÂÓNyÑãÓÞ”ê^PfÙ8}¢,ÛîúÞLù”S^ÇQÐ;º]Ÿc‘‚'ŽÙÃéùQÞƒ…ŽñÖ5îr³´Á eGÞ·ža^¶µÛ.ÍGº(\Ú/MÚJ8t“cQÚíä¶&eŠÍk½|OŠ!± L€žW󇶖ü‰G†KåE#|ñÞ&øòÕ# Ço0¢*+ "o0`’£€È àšŽûé ~ïßLqIä LéBTðΛ0^ù—ôµÄn¸JòZ"KEˆü]–²Ÿg¢òžþ½÷óÛIeg¶‚Ñ2 V‡OA^%Þ}u0›ÒZFâDc™‘ºÆÿ÷ʼn±îv0ÈoN(æþÕ E‹ïN(H|yâ­„óìàë®w)Ê¢–‚p—2¶lPîRÖ@— ¼ü-Ìš;0\Šìûd/ÅïO)ÇëIvj <,3)ê#ÞH{G;°Üì×ïST>‚mϽäœð)ïæ)xÎp =¦U:÷ó{¢ÜÄ€ <–t%æád„AAM©$©+÷ øÇœÂ5ÎT3àŒ8ȯ)•¸¶c÷5ÒM‰çQ, °ôÁ˜=¥×U¤#ÓC K·QáT}|H2TâêÊ—Ìq™Ç’1ªpš˜gÈ8´ *‰jÏ÷9ž³ŒÇšHvŒ!”ágñ#1Q“_ƒ¨‰¬A4d„AÃð¸‡-ÊhÔtÔ@j"k qÐ1b®+襻R¦UZCFÊÀQÖäv]´£œ‘ÔሩœÐ!ôÁ®¡Ñp¾åê‰S]þ]ä4cF4´ÇUh0jË´˜ê"Ï 3â £=®"›€QÇX¦ÅÔ òš!c°ëð¸Šlä‹3*ºÈ4(U:ŽÇMA-=* ejLu¡gĈ‡––QåV£žÜŽr¬³Æ$ ”á…gñ#1ÄT“_C¢‰¬A3d„AÃð¸‡1Êh1ÕtÔh"kÐ qÐ1<®p³ZL55$ºÈ3hzÆ`Wô¸rt _Ô¨h"KÐŒ©úx¹® —î H™SMh)Y“ÛEt=¹™Ë©sîË ã‡© g¸†°ÔðçÜ×CL5ù5$šÈ4CF4´ÇUh0jËô˜j"kÐ qÐÑW‘MÀ¨c,Ócª‹<ƒ¦g vW‘MÒ|Q£¢‰,A3¦êãCÇñ¸)¨¥G¤L‹©&´FŒ”qhiUn1êÉkµü&מãTníq&à œáz„~H¨'zLuùgHt‘gÐŒaÐÐW¡MÀ¨e,Óbª‹<ƒf̈ƒŽö¸Šl:îgH " 2»C;íÈgTt‘9hPªJ8t›‚ZzT@ÊÔ˜êBψ2ª–!ã[E|f+TcÊÄÁNHàRÆ÷s[=1„TO%–` ©*½†SXà iË<y% HªJ¯Ô„Õ@BÒÇ2T²•ÌØC¨ «!„¥#ÓcyÕû<£ê(!Ôœ!„2\jžQÕ´Œ*øŒ!ÁÏ7ëy¶´š.÷Ø&ÃÒ’Ñíé€-D—–Œ‚Mi![œ,QC6-O©#¬Kt ÕÓ郑˜¥)„õáé˜Â&¶…ݶȞ,üÙnÓŸ-º& A¶±°d$|²0`‹Ó……#e¢È+ D‘MÒâÀÈëq`ã÷d6adfe_n¬L6{Ø.ãÊf]hOÿljeñO^“Å ÛXY R">Y°êÊ″ Yd –²Hgî `vaG—í§Í6øèþòÂÛ_™møÐMÇ… ¶ÞžmÐM¨… ¶þš-é¦Ä‚ññÙ.RŒ°Í$]´,mäÓ ÔÉÆ.~µ°´«K·Ó&Û|xŸyin®L6}ð®ãÒŽ]jO¶ðÔÒúŸ.¼& B¼#±´¤´|²^ÀëÓ骱|y ýó{’:Û|ß@>Ø@@‹wªž”ÝÔPxñNU¥ËÙqZ_yÝÈý'ù°p>á@PøâѤʪb3¯îTÝS¹S•–¹½SøL¾S•–¾O¡Ô¬aÊ-4L¥YÃð©9³%ÇÛô”U½Ýâ.TžïØŸd¸|@#ßô97œv±ÜôI‘ø>ŸðÛY%½ß\ò %ܧjó÷ržÒ åuùþ¼A*˜rA,E.ߨú¤j7ª.Të¼Q•UKºQ•‚®oTe*ߨz ,ºœƒJø xüJfý¥qÂ0˜§I¾øŠ‚®.¾Úm¹øŠÂ//¾‚îœ/¾buà÷4åšæ[EhƒðYè|¥‡µ é…šº-).“Öèˆg /ùZå®›ÈÅ}Í¡ÚA³‚f~ŒX©‰{”{Š{ŒÑOrÉ×°‘$\£•k:wÄùš{ʘì’|óyþ†×m óŽÄtDb:"1‘™ÉL箳—ïí{Í@ŸèîŠçUº¸›µü©å½÷ã%§0jS*j÷òµ÷eN±{óNA€Wœ‚ÀdNA@3NAàSNAë rŠüý÷dV8E^s Š9]s &îšSpÍ2§¸uOåkîiœbÑ=S¼Ì)Üsrй{*§¸wÏÉ)æî©œbÁ=•S,¸§Ì½wîiœbÍ=S\ºGæ.r ‚™r æ"Sˆ9EŠœ‚‚DNAA§¸³Gã’K®9Å­ÈÊ)$‘Oâ·fªœ‚‚§ø²«ÆœBQqû=§W¤»=.t(ÓuR¼—zOºÞݽτHb"± ‘ØÈì‚€è¹ frQ¦gó¹Çȯ ˜÷\¼¢|&ß'NáoÅŸ\³Bñé– ˆîzÌ:7c(FÚŒ¡˜ëÍŠ”6c(fº“s8šuâ”\QíW·ÎZhxÞHQüJÀüƒuù§)ÒËüŠÁ$~%j½æW>ãWbU9¿rÀ&v{û`[ùæ(tá'Ѳ‚|¿ÕÔ43OMAë ›"ÿÒ€"MI凨(è=[˜aŽ‚<5g¾ê˜‚Ì©Ô$²Nj¸Y•®FV¥†A "K›µÈbLåÎ •-Z¡20Ù L3©ªðËr6ÿ²X¸h¿£ªóôÃÚA¡ü`ú#ôù(0]ý²\€ ÆÙðß $…ØF¤W¢½/éսȓ^‰"ŸF¯¦þÊ—<¹k]mÜä+bÕ½ST€¢×÷î-$-ò> mÜXà_‰!éÆ ³ìÅAV˜§]`h²±bnC@}?ä-½<ñ1 Ïü Ȇ03ÿÜäþDÛsÛ^˜Áë}"-åÕÁ\mêìΞwÊøèóCþšE¾Ëóâò³<åØ+ÐËÏ~~ö?åwÕá3·ç€¡ £Ä^÷¸! Akù¿=ûôðß ÷ÿË™ endstream endobj 311 0 obj 6468 endobj 315 0 obj <> stream xÚ]]ÏÞ6r½÷¯ðEÖÙݺ2¿DŠEnj$¶³1à8vb'0°º‹"oö¦¿¤$~Ì™‘È7X¬óR:RÃáÌáP⣞ªÅšuMÿY½ Oÿ÷O\úéõ“¸=]£]¼YŸ>·„õéïOô—t‘”׊me³äÒ^óøóŸOþÀ{9tÂŒsPîE¥Cm&Ëî±¹Dº™H¶Æw’Ò!«o%Ë푹DåÆ@åvŠ+¥CV߯.—¨8•ˆ\#)7‹Üzá jüÃ~¡¾:ªŒZ.òë…C&4—›H-úU7ûÈ…­7za­h°á4’VhfÒäŸfÒDžvÒ_è[ènÛÚr¡Lkã4˜&ò´˜þ‚ïÚènÛÒúXÅxZ§ñt"ëé/l}í¶-]Ú cqR™-‰”ÊíjJ}­vkêsjBOs/ƒjr›ˆÖNzŽ â.b·© ÕÒL_\+²ÝVû~/b µ¦&ù4†"î4–Vìe—›E^©ÛËïkT;*âN3iEßI/7‹´R·—ÞרTÅÒŠ[/ý¼Y¤•ºD:Ñù9úE\6îïR¹™U}VìECb5EàiX¬ò» ¦ اù)~Q+¬®³ Õw¢hÁAC«]Š7ªçVÔT¼E6æ†^í”cDûÍæ¬'&L)Ú¸è¾R6Ò…SÀ8Z3_:ðïÈ&Ü;εûyÏÎpâ—bUÂŽîJŽ*ÜÐóÀX0ˆOÈ€fÂxŒ{ïÅæØ}Ū„Ý•Vª#p¦cÅÂÙ(¾››¯èú>þÐ —bSBFw¥:¢!a†b,pBM§øøîûXBùÊD$9KUÞ_ÀR§õôãÿåþãÉËO^¼²Oµ~ú1—äåSTÉÚv~ ~{úñáÉŸ¿(¥Â_>þW½¯•Y\à oó?ßåÞ¸Ë"ƒ¿! }^p™_”Y ΚÅz'á<Á9½D¥ÎRPXT4 ô­fÙ6ÞýßÈ'SYÆüÏÏÜ¢‚eHŸÿù\5ø ©ý’ºÁúK2*ã¶2Ô/ùŸOµ7?’:Ií~ãj_ó?_׿öÞ¼xeÀPL" Qxê/JÛüßWL™ÆoÉt¸2ßPR‘Ñüq÷gxËáÛº8ÃMâs}ä×g§\®öÝÇ'É_´ÉòèøärÁÕåÚ^ÁõÌ]=}þÿ2ƒb¯—5M\?)wµ¡)µïõªÂ¢£e 7u&½n›ÿù­}´ ý¢ºÊ͈>Ô~b&¸Zµ˜Í³ÚŸzË“úöåÏ‘Â}p õ+%Oe£ü˜ïë¨sw&,™cbO+Ò:‰{ØÀÛáOoM<˜µvü`ֆуxrïûTø³:Üm†þí¢ã[rDÒ¨P/à¶G)ÎøD0¬™Pœ ±ò't2ªdSnÔÉÍ-kô õÇŸ0y z`¦HG½(átE?V,8ra(nû¥·IEkEEkýáõô-óñÚ¥†=ïì›Ã©+ÑwùäòÌÖß_¨ûY/ñ õUþçAêäœfH/ù†ǧH,¶ú/,º;c’Âù£<Ïÿ¼ÚOÓ~S^îêK.>‘¸øõ\èKöŒ[ŠS—ªuÊ%JéjÈç©í¢5—÷‚‚u` :º?Ý×ôéÌâ•åý3êÀÃ;K@‰%ؼoØÓÞr"G |}[W¦ï*U›]×öa ëÓ²»_…^0M@Ý0M@^1M„‰¼@jõ†|È ¤®žf^ƒê ón„aµ¿‘¹A²’„èf†õÍ0øV§5E§Õ‡É–ð¯*œ1í& ‘Â>T8öATÙš³«ó*Cø@eo*{FÙ'jÍ;óM}DjÉý+³1¸¡¤9­—I‡bÓ˾ ¯Wù;Q¹›@•RÍM J©&'P¥T€¿ T`¤2¥º™'#J%M™R’Sª;¥VJ5§ÔJ©&•šS7sJÝ{:éWŒ·ð+f³¿B&‰UvŸ$ÿF  ðT2y’4{MžnEò$‰|yšÔ´[RƬ¦µéNKvÉB˜i4çsMt½®¬à=§6Î-:r«¥A-„*ÝÙ6>…>QPXbt Ô¬ŸiJ. »ç¶¼çíæ^‚È» Éënå ŒuÝrl.~oÖöêW+œï­..®«½ï‹ñ¬yþ™ë]íݭɘW½Ñt&µÍób‘¡YÖe×S édz§ÿ¥'ÎÃ}¶kU§µ½ÎM‡ôØIÿÝ®œ+YFÚO½¦‰®"ïÝzÛ½rМ˻¨Õ2d3Lj'[ž*þ-Á[’ÉõÙÌþ-lt«ó=ÝtÓ‹æréF™ ‹ôC3òÖ%;Ò DÃÀ¹­uß\š¤‚éüFÃÝSûzCAÛâGÝÎÑpåæ÷\Ü TG~`S9oFAñtt’OV‚*h”ÍþÅûÇÌ'8.‰§ý­ÎñÏÝ«ß&Gó…«DzWþˆ_”Fr–¼™½· ›L'¯ ï»åÔ’¦ö½YX—&iô}%ÛÙ„!§èÑ\U†vrž¢¾>ÉÆacrØj»7óöˆ¿7—Ö¬ƒGu9=°ú ÓpÙYØÁÌtÆ-λ{ÍåSã·¡i¸4êʹ{Óp6E8ðO.9 /ŒÀot “,V…¾’ǰ~`ûÎç=þÁÌuA‹Î—îk§HƒàúeŠàR¤po˜dÌÄÜÕŸÖTιíƒH‘ŒFŠÖ Üûjü¢âÀˆV›wŸïkM“]©{ÏoŽz?VÙtÖDÖTãÏÉ…ìUDƒ¯N®:û}¨úzŶL#Có­m~G10$°ÑÌY3?e¤iѪ7.Š“|ÓqIÂþp2ñh¸ZèËH!©eÕ ¯¥ˆ¯­¬óUžùØ÷Mâ¾Î‡óã÷ÿðóß?ýûÇdg¶Äü<ïPb~zžEïr Ù†NCŸXyØì…ÙÇC÷€!ÊJ M„”aˆÕ'‚‘}>@Ȧeqvt!ONÂXÞ’ç+•B\äÒ¾ÃUÌNô N¬D!ë´ ÊY¤[Q‰X¬Ñ08&y`eîU¥“ŸÉ ú'—Ûøã=ãoÝÙûÞßÂÎl@ïq^m†Kú$Ì“ü­´ÎD€Þ±ã •'<’AèõyÎUi§“³vöþýL ÞÏD¸ø~&‚®ÞÏpAz?qâû™ßÏDø~&{ÆË÷39ó~&{hñýLDͼŸ‰užÕ7‡Þ˶œs…Zq­üĆ?'è¢á,½zf;Ò¬«Á©Dó÷ù%£µ+Æ; ÛžÑØ“û_ûW õ ûvÐ)ÁXò÷ñ6÷)°”Iøý~ØËM”UJ¡\ʇ4ÚÌþÚ:Á?¤²m²‚í5`sä©rsáC›Ø…6äC.ôZp)8u-”ò)·5±¿@NÀ{¹‰]Wß·r«äR>ÄÑvÎŒUÞÕTÅrÁ„Î ú ±bÛí´Ü %Ö Å$šìÓ&š¸l¤Tn+SoWy¥6iêûhB ¡åÐ7rªÔSi*–Òɸð' q§?G+ô/÷N£æ8©ÃAB³Ï‰Oå214HrÑìêT† “ ƒÔ͹Må=pé9XÓLÌÔj$ƒe]ŸO­‘¦È3]µM1gJfn‰åñ3¼ bà}L& o¸iBÛÃT;ݽ™I´“dç0ýйÿ™ô+I “r˜žIÊ‘ÄÈ0Uƒy™T Y.ð˜=šYÀ“EÔpY‡9…™e]G¸ÄW™Ô¿çi#Æ«ÑÛ}íÑ}Æ‰Í –“íàîÔÄ&ËÕŽ2Ǹk1‘”àBœýÛþŠ­üp>ºÒp}ã-û’?ÿG?æËØM2÷‰×Ü⢦t–StxäïØÞã ~ÿ| QÂáejøHù-ÔgIofqž?ÒüùeïœÑ³ËâaÜ5{ËÙs0Ë‘W†”0+ž3Y†Ã¯˜¿(K?ˆ_iÈà/ÊXé¿Â™MÉÒ“0 ÿV_œ|Ù¾Á”¿ò-vÛgNXS„ ~uê@ȱ“ïj8ûbÝ#”à? <ÊûŠ’?ž4rE½æoë¡W€ô ð^Õú½øè$€^=ÕkâÊÁ³:ÿô"Ÿ$xÿäR¬æ]€#[ÂâÖ¾¹Ëü!ß#ÆჱDøÅX»¢ø¿æ=«Ã°)‘€ôÃÍüšvfJ¢±?¿Ò¯­ì•¾4Õ½”ZOñ'l=ä•¡ä}vZ÷Wé<Õ4«g•‚Ä Ç_ãWÊNx¬çäSTÜŽÒÐûççb”X…³1£ÖÂ݃þÝàä¯Vò‰æ¢=‡M$ëŒv 21k.D^8‰ü9BŒö.r±Ç‚TøX1ë@F8¨Â.v>k3¯ö†Ôu;MòÑU_úåH"±‚¡ÐGt>µ‡aÞ ?Ù„åt õ×VUè¿&®ãòÑìèú25½>6Ñ.>Ñ2]Ÿä¼ÂÛÉ0Ïð¬Íü© ŒýÔ5¹tå:/.BPŠ›1¬N  m?7›=*ý(Ö¦¸$°3ÓÎÚ:ŽöIÚÏg•êÏMÞ©?§ãs£}lá7Ú_að‘öãE•Kå1ë0åoŽw”ïöã³™$IùçG¢Â­0n3áU´})¼"P ¯Ìn¥ðŠ ™ðŠZÃ+‚¦ÂëíÈá{,†Wæ0¼zŇ诙HXt÷³9¯ß×UO ^Ž?·ƒRª(ê2¬Þ‹<ê(ÒŠ!¾5ÙMŠ|ú†/ŽÃqD¿èRTõÏ®B»Iô—›ÑMh·.GœŠÀÌš¤ó&p¾oK}~Ä¥Uû׳XçkžObˆ‘b$€‘ ègi c¶ù5 ‚¿D °|QmI± œzi¥ÂUVÏ\<7>ý¸þ þÀã‚„p¹Uöz‘)A´‘žv½rAìôtçò­ |¡á çœM}7Û6?*~ü¨ „Ç J¸•|dÔå2ŸZ“FwÀY£ù4 D^:àg-0`²'Л:×l€2›Ìf$O1b30Yd6 96ƒÓPb3Ðc™ÍHL HLˆžû&Y :Nž,¸œÊj${¸f5·" «‘D’7Ñ„= àÝ$×>ìÇ_˾—§6·oF"\H5Ä´Zt\ð¹ a}ÿ9Ç‚îf`a!€Y`D™…èg<ÈÃnœ/ð8¥?ÙÛÆ×„£75Ó²”ß@w½®7›Îi çÒ„›Îtuâ¥çu~ÄÓ’cþ.@ŸYZ8‡?Ñ£¿B~¿Â0Ý„Îu10Ðw¼÷Ñí£ƒÈßp ÄXÞ±·uÏîù—ÒÖ¼Y¡¹túë`&f¦e¥¿¯¿OÇ‚¹ýŒ¬C!sq iAˆ ï%³p+¡þŸäc?39Ê¿#…ðwü¼:ŸÖ&2$=¯.ä¯2 tq>[~'"ZËà?°MÖ(<Ö®Éðgá< _é0¦UFf1R7/¦E>_Hm¼¯¿Ðcâ²ÃSPþ‘‹í^RÆ$m‘ÿŒXËtðò§ÅÈ@¿âžÏnÜz‹‡ îÞ@¯/ÞŒÉçLf“øwÔ Ôƒa ºÎ;æù(uaÙù3œUÊR1[Ã4CÂÌ÷ËêÜúÏxè [Íý€äC ôMÎD®ër4\O‘Ñ'ÌPd¬sI‘(Rd‰A3ç‰H‘4E‘±’D‘E%id·Që u¯“áÈvý¹Ô­B ­½¤µ÷"OZ+Š”“u¨@8ÞÑï§íßjY§°ÂêWü\G7’“"³`wY¾„K n7œÜXEt3ÃɱNxÜ.‡x¨û-{*‡º‹„DøœaЇCk@™‡Hæášâá0Od 9•D.)IæáCuVŽª’yøB+—½æá·" —D^ðpP ¸iŽ ëMsD>nÓkßÐi½y¾‹iô9’ ººÙHGèÌF:ÖáTžY¤Â€©ð]T/T02L…D·vQZßÇPmóöƤêé×"CFÐ CÆ:"CFÈ$2d‰ A× ‘"CFÐ4CÆŠ"C•>`ÈXGdÈ’rvO~>Sðk†ŒH‘!#hÀ~ÍyÉ(2d±›†ŒuD†ÌK ùVRf=8Î3¬ë\²ЬA"ëAÐ ëÁgY‚¦XV’X¨$‘õŒÕYXS•ÈznZXØè%ë¹y²Q¤ÌzP_³Ÿ¾ó|¿_žuQůðû5ò¹¤Ÿ9}ƺêìõ¡zÍ?ðèhÅçÙ"—ô S¥fã’6Þfz—ÍAzGÖ¾>}ñ4ݯ1O©7ú7HãB°÷mÿ}F»Éí~¹ –/¡÷îÃà?Ãîn•o…Þ%SWÜ”^!ÙË¿zŽ Ïod§Ì>_MÀèò Å<0ˆŒÞy½ÉŠRΊHΊHΊh”¸œÐEVP£¬Ào²"€”³"RërVän@jV@rVõY‘b+Ö_;WçÖý÷ŸD- Ÿ%§ }[gÄ;fÍy‰³#€:ßUø¤ø^§æºÙÄÉx?Þ3¹˜¿EââÀtbb'Ù¹ .ñ®¡n!€¡"oÙàG>.ކæ¾d×LÞéeÕ óVp~ y8ù#2}Ç ¿Iß_!è[ñ$è9ò ú§x·’){t>­ÀœF É¿~'àêû¾Ôü7+?Žð³†ù3¯«ˆ/Fòlßò»ðJöœ÷§$ÿºeö5#%œ†“¢¢í‹!hjÕuäU?€äU?€äU?€äU?€nVý€”Wýš_õCEyÕ/)}´ê‡:òª@Òª?ú™Íƒ²èôõš€â’0ƒ? ¯ü¼\ïN\îK]¬ö¡Š¸ØG±ÒZÿNξԇÁõô€!½¿ò ‹9Ó2…>•Û‡œðEŒŠË¦¸y{¾xìi¿ðTòyH:°!Ù{û§úz‡p˜2ŠÊŸÌUE6‚[̇ë†õ^1/Í Ó犩Ÿý­®V•hM¼okM‹ÄˆˆŸøƒì¡>‹ù"³²¡y%̽3æÛ~%›Ò«Ƈªa?´AFþŒúû'ÿó$cÒ¿!šüûJÑ-‰‚ÚOŠ>pÝ%-õÿùäÓÓÿNrÿ)¯ü endstream endobj 316 0 obj 7658 endobj 319 0 obj <> stream xÚ][ݸ‘~÷¯è¯'¯Ìû%È“Ñc÷$Øn»»íY¿H‚E¼ÀîËþý­Ò9¢T‘ìEëè/ÅbÕWEŠ27fñ.FøOL!ßüÏ?^öÓýûÅÜäè–xóãE fÉîzù¯ýÒÃÅ ÃüóÅßñ"Ù°?ÿ:\¬_@ë?ñsóåñÏß^¼ýòâÍ;cíÍ—¿¿°7Ц{ƒåû¼Øào¾üxñ»ïÆ‹Üï¿ügÕ´Dç0ãŸïë?¿ñ ³>qé1üúùæaUZ[‹(Î㟇c½ÖûÅz+¿RP\ È”ƒî (Ø¥æ$@´ºPãeÞ(ÚåÞ¯.ÙÅ z¤ ¸„$ÛtG@JRdOÛ”ýR¢ÒðUXøçþù y¦†¥†¨?óWÑgÝr•ƒFAyqÞ÷eãœ_L‘ý€§ÅYYû««-#ÖÏW³X9lßóÚߊiœ]\’Êü'üÛ3oðÏë¦E¯IÉ/I|nO'/f1 šbÀI)¨—Tíâ»IKÿà­}yuDF36&E––”­_¢w}ж.)ÙþH£C3ä V¢FdëâbÐ ±ž1ÈlJÈA±òOXøŸW'N,1`*$òåÞŽ&˜·í_/¥} …Y=— º$î;EE08E ¨³÷ã+@_ ´=G úHA`pNtK§˜¼Ô#•¥ZÙ=j ºWYÒ/”—ldI¿JƒŒÎºÒo˜·e vÐ.¸ü¨ ðÈ@掻‚Õ2tkjŒ”­ôf1‚?M'Èö¯Í¿þ…šh·e*|£ öYkÁ_E/Ñt{Ek~¡ ÖÖõ59x³8'Gç‚€@/…ªûºÃR¬T|ê `6æRû…þŧ¨ËæIpn`à⥽£¬…"êKQm•LKo¤ì~£¾Å- E}­¦,ÆF!Zè]–£ð†‚À ¯ÏÝÒˆÎÈZn;½h%È$'°ÿ>˰Åx`‹QÀiaêâQ ˆF$àv‘vö1@|ƒlÜÝJzyôæ‹,îW1ùm€H9CþF/ಗ·2JŒ¸,mUãǫПD¤²¥4¦+cx¢cQPÌy Šb®ƒƒhA«ŽF!&‚Î{](C«é‚[\µâéo<6²gUœXM Žœò u£hC¬”Â/”—b\dÀb‚ï°ý‘qÀâk=Ñ %ŒCÈŸ$‘ñHï­¬~—ÿGa@}ò­tþõ‰~½ÉAž‚@B5÷%äÁ¼çèúÌ×*&õÕÒÀ„äú²öZ¸ @¯¸Ïvе¹¥ ¤+ ô™¸+—ý©mÝgÃ{êlýÅ·ÏiDˆf)ÊhüDA&dèË0$à u 0…4{-Í]ãåíŒAÆ`n¾zÃÐîĪ[mê&ÁøÄœû:­E—øõÔC&òÓÖ pà|8†èLEéùLÝ!È& e,¬@ÈD…ºJYL¢$Ù¾Hý"2g§—I=Yð` £@*¾ô.ûÚžM )ŠôäÐÚìP|G1y‰ Æt2²¦» ~ÐBP¾\b|Œ‰‰¹?À8\®'}¥.÷$ë¤ÞÃ!% zg?µ?'¹VÞ)-vÔÕá`Ë!|I]Ý%êâ Ú#˜%Œæxœ0‘è$ò#u…£~Ž¡¾èeV@·J$[— hÿ@cªÊôt‰¡5 gyJ²V×Ò:Ô©B¹Š™Sµ 8¹¯8>ÁM'{òWI Àާ,Uì/'¥búnT;„¼ÞZU>ˆ[m é>ë€-½K,zÎkªÿÜzöèéê&ÔõoT–rVÅYPñUUžyäIÍÄFcR3ÄÚ×hŒ)£bR¥Ð" ÍÈâ>£Î²ÄAl…f•”ÿ(˜àÎðޤ)J‹\·ÐG¿€YõÎéHXù ¶ äw…9 eâ6Bäg“@}•'âZ¬@î+f¨¯ƒÎ”¢Ãåbè|µØÈ>I s0-•Ʋº´T#ú–¯½Ù,ö¹ýù ì’ ÀÜ”!—$ÄÅV[9 Yc½8'¢Ìêl¦åíJ³%+Ö—s€úY/¥¥ú©OÂEV/žór-÷{·®¢)r¢‚ó¨è2uT(»þÔÁÔªóA€’H{ ˆUöðgê¦@…ª¬ò‘G‰.†ÁðÅ-!”AQ0¶Ù÷uÊcÖÅŒd… ÞŠÔ?RxYR„;@ÐÙî ±ÓÐ’×W¶¡ð©¯l˜ÙÅ$OWÙ„þ>ľCFÇdûʆ«Š&IÙ¼¡ ÌYxÝ{äN1sk½|¦·âŽ"™þb;®p"ýg@êD¡ç¨ ó¤æb ’8†¼ç¹Xg¼}àž6 ™b NmÁ4ƒG–…¹¦‡ï¤ èO‚ÞÅ%ð~Avÿ½²[ùfÈÇ“0³à& ÙGŵÌ%[¤Ë“«ŠÄ¾ðAVK•-¤»OƪR>ÔéO“M§~ }F“Ã@tó‰‡X§JPw÷ „ûÅËgúÛO I?1#Ö€/•þ”ÀµKÜÍ2ž$¡?,F4á½9á‘SV«‹Šz Ÿãå0ßr»FG ÔcC>ðlëabPæ/Í0ùŒC)aÌS¢ÒºqŸŠ“Ý¡.¾ý V×¹,`Xª©³–"€ÂƒéékN*3¿?uB.b ¢—tS:ˆyY•IF]¥Ô—0Ò“-ÿÆ}©SºwÇ7èø2m8 jåŒ|Ç@K”cõUYà´ Nµ?±ú8èGtv1Š÷ùDA@ª‚œÛ"ó‹¡Á™q^±†ã C]¹ò]†ØöŠZ/0l±4\Ü=p½º$zCAq]â žqÇ ­!ÊgzÆãYÔöˆHg'˜Î˜…`¸³t6p£‚•ÁÏÂ0VD½³";¥€o¥vDW®~øÈp±²a÷ba°›”†±ˆâ7 ò4)>ñ S^Q6Éo0àÍ¡30Ýí/ øl¥¤>+n IèOt³5•þñ$åBŽxà6©H}£ûrÀÄPô¾Ÿ¤ðpA3)Ï<òÍ t–îÁʸ=÷ ‹GsíÒ ³%_’D]±U·®U«säÌútƒÚæ”Aëxêh¤ÊЭC¸}KÑÊ'îÎM<™ ÒÇF´ãrJ¼»‘rî;ÌüZE’4ú͘çK}} MÜ0dMu4;Wú.!à’¶¢&Ýà‚¼âJ¿¯Ñ0î¹ßDt³@­&4(GĬC+ ¬5—¤0ƒö6@àæ ˆ3Š=C— £?aš¶˜÷”í¼ç‰áÕß0Ý`Ô¾ +a ;¾†’,é¿Q5ˆ®u»îZà [!¯4˜>óýDkìÄ@˜‡/‹â žøî(ÜßÕ>ÜŠÊ@iÐù—=„@&êÓçoTŽÑö YÈå²ó¢[cñëæ)úÆW–cxÖT¦'\CH©?ü]˜ t² ¨r<ÑD!–.:+“ìçÞŸyI—í óÀ–¨k 4˜TaFDÖ¸Ý T—ˆ _Á¬{†L'Yð\x†»©R•ü¬ì1 gdc~ã;©jŒtÇ—“µ}ÁcÀ¼Ñ Àh¿êIßÏ6CÀí•g¹³®6÷;ë¾"e÷k«ý_‚®iÔm0Ckz‡ Pæ!"Ãì–‰»Ã1g ÊaÀ<¬ëHt¶ÓÝ}ÍD‡î•!üz²ñj |U´(óUìÎ E*à'îÖ×  '|?È(¢ýÆ÷J—”ž¥€>áboê+ ¦è»ó³BZé:¨,õN@Šç+ß³¬LÏG±Î\®§ï¥Ã—rü™ïwN¹ lhÀEãfu4@°©Õ¬n½Àh_-l½À½X5Is²¯qþ[³¼Êþ¬ë›j]ÿ‚~Ì™ó—å 3Ì{JR?é«Q¸F»nÓ`O+ëÇëÙV •½ÁØ+[$¶V9ÜtË@<‚ö˜Áa ÃO>X÷L1œ¢ 1ÉýŽ6áV)”w<’NN)Ž¿™SQ|”á4î‡Ì²8ÌÜNõÁ¾l VvÛËê*{æŽ'«k¬ýáÀEc㤘áG”<*)˜KßS‡£áñ m¹¦¿J¸š1}2YîøNåTd ϶+]ÈrõÕw YŸGã|:3Z³”|zÕ+¹?'|†Ø(ؾnàößXsDq8) Dý%!îĆœm‰w””gyŠÙ+Õ7þ©r +f˜bå>V\ëµ^výJb&¥ö×b•¶ê&ƒÅ}HÂNŒË=s¦fÛÁh ºun`p³SP4fË虩#†Ö£wÜñèŸnbÅ4g9u»®Ìs K©/1¡ïâ¦E©ŠÈ&NôBd•ͺo‘cä¾E°ÿøjždôð'/;ÉCɺîÂæ¨(ap`jì r?ò$`Œd:ÛbïÏ¡Œæ–-v—æç6ÑØ’vY2-ƒƒFE¾`mAi$Λ‹æ½‡ÿÿƒlóvY6ƒ­(Ï)ìqš…;]!É0…»BÂ÷¢pÏ⬔†/7¥„ùÛX4)YUJø®£“å*Ñ@Øädן8A)J¯nõÝëÈMªUÊVÁžÙÔh/UE^íJµ·=y,ãþÍáE"zrøÁ6,¹m7k´_45jeoŠÐŠ[õäxµÝ>hY+ïð´åÖh¯ãª ­ÐUOŽW´Ší¶=X#Z{¤©Ñ^æutȤŽ`ÖˆUCÚÕ¨•øíH qxÚrk´×Z»ç’W¥jÅíOÚ£5ò®îÖ/ˆž° {¸]vk´_lj´—}U„½8ÔrµÝÞ­Ñ^^{ºHk´×qÑ„½PÔrE«¸Ü.ÄÑØ#›ʼŒýÔ± ±F¬òPS£½ÔÀ¯hGˆöt‘Öh¯#´:wU‘W»5Ú‹Ûž,ÔáReãFë+¸DO?؆=Üv;7Ú/šµ²7EhÅ­zr¼ºÜvn´—מv’íu\5¡ºêÉñŠVq¹í7¢5°Gšíe^G‡ü@êØŽp#V yhW£VjàW´# D{ÚIn´×qU†Vèª*ìʸÑ^\h­%Ü(à±Ú›5 bŽ?؆=Ü6»5Ú/65Ú˾*Â^ê ¹ÚnïZ¶—מ6Òíu\4a/õ„\Ñ*.· ±F´öȦF‡2/£C ulC¬«†<ÔÔh/5ð+Ú‘@¢=m¤5Úë­ÎÝþÈ«]©öâ¶' µF¡ÔááFÇlÃ’ÛíMZÙ›"´âV=9^m·ZV*åF´öLS£Vèª'Ç+ZÅvûÈh 쑦F{™×Ñ!?:vÀ‘±jÈC»µR¿¢ d O n´×Z;’W¥*•p#Z<¦ mÙsG¸ƒñ¨E‡kÛ‡»å¢@—lʳ—xþV *Çñârós_KjϪ2{É—Qoe¡J/hÁ—»¥)Ë^.ƒnвu?¹&%o÷KS‘CáÜÔ£ØmthnϪ{ÉáZÓµ,wvQ r)h{¦TO$Ø,J u÷ÿ2%51àùLW%ØþÝô ·—² $½È*ÓŠÙ”àX,{â-oMz‘$¦vU„cÙ쬸‹¸È¿3¥.­´«"ÂÉ#?HqÛpÒ‹| ,{ÉWU8ÍžøAË[üð¯|`*­˜«.ðìdE n©è‰œ ÈÏ ’E"G9‘0Áû “ XÙÙ ÂL‘ݘ5íÄ "ôˆC'TMTAìEæ C¼KDZ &5vpÜfõ&w²S‹"<3=È•Óeš©D9OZÒ¨4u?•Cåù¬A†fu§Òk<Õ1H¾Ð„ßTæ…GÁƒ¸œæ‚¦‚r B6š&˜Š×8w°yANQù#áê>TÌ0>æÀûT‚ðιEA¶03X.¢+•s‹E,g?XI «Wsë,;H2Ó…¹3Ëô ò4ç=—}dI AjЦCçS,?0ÈZÐLÙ\΂…Žƒ€–&QæÂÙCäщ~h\=ÿP&ÛçÔ$›Z‹“ãS¾X?µb*V¯Æ+j|)wjIM,oŒ—\øZßÔš‹Èsò|1h*)/¤ã¤-_-˜ÊÚŠ Ú8«ÇÓÉSi=‘b§}x¾q*ïC"ö~΀'¢f< Æ£,‹1µ•„/ìöÝ 7ð5ßÁt±Ýpý™/V'ƒˆì†K“|¥h°pD\7\µâ‹ƒ5 ¢ºá‚Ï/ÒÝAÄtÃ\7O=2¡ADtÃ4è1›ÕI¥Ïri,5ÒOÏÍm[¯_ý­ÇíŸë ï€÷q=©NýJ¾ïnqS=ݵ ï{ï@^kpaÝuÞÛy¯¨îJO?ñse¾ÿŽù€§jqÔ7~l©vôÓþá(úº B›Å3½]˜_­Í²Ù°J[ð(I“dV¼lk¨àx§,?fO0æÈ¤´±ñÉZhð°z%ß«ÃOÏ×"‹û½„âÙ¡5(5Ë7&®±;FëqTÓc„̨–ù1£ l– õJŽÑ¥±ƒä`²Õ™ABÃlÓhðÈ…l' O\Ľ'ɇºžÆ31H›Qï ’óþ9ƒ„/’R9o¦ç•ã÷)8Èñ@2þ´÷:êÝv ?^Uô÷üƒÅx&¿µ%¬¯¾sÐñ©§,0®‰ ÐÑ—[ÀüÀœUEößpAbØ-2…f˜^äþí´ ÕŠ!Åvw%d=~l/éCu2HèM“g~à=ž{ËA/黂výì(is~Ò~WÌsîO™°<;HIq@üKIŠœŸ~ì²€Üq\màÞ¿ß `EŽÌcU±~;ÏüJ›ePÈÙõ¨„øIÄ#•øþ{Ê  ¤œê¥rT§]_ÃæÈtF"P#j½ç$‚ÃG$Bm¬F"Rbá…Â"Ì’PR ú²¹òæÌa_ª@’;ÄÁàCqð6œ‰cýôvÖ?ë‰á©áôZ|©b}¢½F•‚‹ƒ&Dz¥]»r IÛ8ЬŠmˆãÏ9ЄŽá±TnBÇ4oß“ÅF5&e±Q ]Zå¬ÁNyGÚ®' èRˆ´v»~HHn–³ Ì7Ã&8èuk£å‡›´æšøßwÌ„£ÒUà§4¢_ä•F¨E>‡F Ç AÂOÆêŒLà‰Ë¶? ˜…^Ygoh-žB^ä,ÐÈD€x­ äÚ°ǃíâÍ—¿GÍ%¬g0ê%7ÉÑœà ’tr‚$f峑ð{~âDP@‡Sz.¯º³^iýçôƒaTúÁ0#úÁà*ý°……U*ý`¨ý`ÈsúÁª¿Õêíø[ú[­±oeñxæs–Åǃ÷;óÔ¦bJÅ‹9_‹þ„¡^JìÆZ¤§W¿È kê[ù!p<¹ÇxÙX*4.Æš7–žÛŽ?Í7¢ýâ ‡Ö£9dÍYÊE0Ô*h‡´J´¡¯U»4ÕçJdðVÓªÖ1 ¨¦Ux€ŽÈ7ü³ö¢jÕK®/øÑ_þ$Uä'FvëTž )àYãs]³‘Ï9ÓÈç¤iä“áÏÉ'Sm/–O0YÃ@Âþ(º€ßç©vÆÂ€dkN} ³ÑÉžh—m㲪hµÊY;\Vسs.Û3jËöìOã² 4â²ÚÀH.Ë„£sYMàç\¶[äÆeµ"ŸÃe{j½¦ÄüÿK­×ÌX˜Qk›Ö¹Z)ù ðÀ.I=½Û——9ûôQò!zb¨IëI­¤³ÓbeqßøyD9ɾÜñ¾vI xšåä¹¥'YU?'ZIß)¬sý2á0éÅQ笓#OY§ªü@«·Ã|È´Æ*Ü—3ò\Ò‹CÇü~n#áO2ïì×ÃjÕâ€×+²1¯Ïú7ÜQ]¨¤sXd)ÉyÍG O•eòåCƒ¦³^}»IۈǬŽmăãO‰ÇŒ’]³^C%SœuWS˜”ÅÆtYh•³Ÿ3] *SRИ©LA'çLA¿` \8*SP~ÊúE^™‚Zä3˜‚* ÛÒJrÂãi™Py<ðS“¸ÌÙ›2H¥ê~Ëk‘ùRU?ñÍ%^ŸØjXUÜÍyWHr²<°¼XP&KO›Ïúük¹ rÉóÝ¡i!HqË¿w‚ Ò§ûZ©[ó›úÀÉN±Äòuuýöt·¤“Ø4‘ ã¨'aÈsNÂ*'Ñêípr­±šÏf ­=N¢-§Ïq’Þ®ŒÆI&·7]9ÉpSÆ¥¬ô#NÂQNÂá*'ejœ„ƒæ9IWÇ6N2§c“LêXã$ ÎI&”lã$#%ÓhAO“ÌÉ¢qUZå|'Ê9'Q¥ s.•“ðmˆ*'ÑæI‡“hâ—œ„ Gç$šÀÏ9I·È“hE>‡“°ÞQþ.ÛÜä0QTÀ­0T[#¨°p7p9Q’WSt„uYõç CY†_’ô]ßøÇV]˜_ÉA΢wZ:‚÷ö ÿ&[–~ßJ;[΋iªå=ϪX+0ŸXºŸ'‡Ðçqäm0sÏö<gûå\ùŠËnbãGóŽ<å+¨ñµÞs¾Âá#¾¢6Vóç˜(œË¡pèìÆ!ò„8h$Šƒ·áLà݆‡8HÝ8ÄAêÆ!š¦+}»Ò•IÛèʬŠmt…ãOéÊŒŽ]éÊPÇÆÐ•ÅFW&e±Ñ]Zå¬ÁçtE—‚JW„4ºÂA*]á ]QÅ/è ŽJWTŸÒ•~‘Wº¢ù ºÂ{§Ò9L ]á z¶ !ÀñN—ëkžc±Vj _†á2Ðø Ç(ü…C4þÂ1á•¿‘jË)4½œÂÔ–S¾È2L]pT‡ 0ä9à@Õ÷iõv|ƒ}ŸÖXÍ÷™0›ºàÐY*`ñsÜ#qpÐ@>‡hÉ8ðóA§ÁÍF8H¥¤Rš§]Û¨ÀœŠ5*0©b 0ü9˜Ð± ŒtLóÆ=Y4*0'‹FTYh•³w¨€* p)¨T€t*À@#* ‰_R& h?§Ý"7* ù*Àz§S1L` z²“`> stream xÚ¥]Y¯7r~ׯ¸¶4έæÎFžF°%yFˆ­õJó 3|$/ùûa±›K-Ýäñ@ðñ%ûcY,V—f¯ëb´séÎÛð𿲒¬÷¯ŸlñÁmfñÚ=Üö„]‚{øí‰²þèÒ[E–”^àï\jÿóOþoZtGF[‹ûÃB¶fìäz.@šào9£#n´F L¼fì / OŠÜrFO?=Ð$8é"á— ·œî…l7ƒ¸5ã ¸yRâ–3:òÎFš(´÷ÔNŠðÊ©½SMM {=é3¶ŠEM8´¥%о4Ú‡¾4r 0(UWéèu¥R¦hM# jƒR˜Eylj (R¤èMGs—(Î@<ÀÔZ06¨PÕžFÔ¥pCÊcS«( R¦hP# zÂSM‡¹V²‘OÖ-ÎjÔºtZÒ’[ŵ‡kîÛß Ý+P£z¨@!úÑýUÊùa!U ö¤I‰¢:… hF÷7&žbG¹ž6)P”¦ÒÛ{¢O"êÇãBñ(Œ "U] EІîo\ùü°Ò> öÄI‰¢(… ¨ú»R.)Ýt÷æüKÎjÿcwQÁÙNiœ/tº¿lOß™¥›ú7_§|âµc6f`ð¨#°yT¯Ç³ÀÃAQ’f[TcÐ¥v,ã(>㊩™nLm2¢®Ç6v"#ûHU xŸASt†±îŸƒâš9‡ƒÍÁµqÂþoÆ6í©Úüï3hª—Î bžiì-I`6å-©YšXêÄ'ŒlI6Yìx”ÖRF'¯QXG=íÀñ£ sÊé3}í-p2á+,‰¥"Éäqª“Îúðñÿàç?ž¼üøäÅ+ó ÔÃGð#ɲ'.Àú%øøðñöäßÖu ?|ü¯ú\­z±ƒ~„ŸŸàçWaqacð7¤}j§ùmÕáŒ^ÌæœYΪe3†á …$!Ë@ïÈéeÓŠþŠ@>©JÚ?Ÿ2ØE­Ž!=ü|Ÿõ‰Q¯ëâ¯ì·oµ-N™|®Í;øùŒÊµ¨È«ôžUlºU¼—ü<«eê/^i¢W:¤ÑƒÐwÊÀÿ_1Ù똴båb}‡@[êj«è~Þ2¸YÍ¢—ã—*¡×G¥,ûéã“-tƒíá|GÚÖéZ@É}À½Nÿý½ ·­—ŠÝ|»i8šHû:»5õ bzS‡ÝëÖXøùs_ºpP~Y»Â’Æñ.w:¹ñèYéG$ÓÄ7áÛP-’þ†`ê+¹Äe“ú®ö*R_«S‡¦0”–¹Ryk×dX9ÞþèJ݃ÛftuzÐ6c’c‹—mCð¤VzåÍzZûü±–þóIÝö¬NñÊc“‘¬ ÐÂK‹áí²E=!>ÜWÞè€AÉF;ªg4K´ž¡>pgâô]ÍQ~[‚™iŽŠÉ‹:ÞUÇÒ¯Õ ¶U÷ÕKÅÙze2B„%zn²"ýŠ=ñšôN3ä›Ý¨¯¢õòÉèéØõÜØAãê;øy ݶX«Ò c.ÛÄÖÛ&óý# ’g[´á4ŸÃÏKÁ¢¥QoV/Wö¥P×äÍB/$ÞMv‹Ih®ñ÷Y\­ä3EÐâ  ‘8|(Z‡3q¸€Úø ×U/ÞzŽA)$W‘H«“J%;JA"ÝMÿ¥ŠåßÌ´Š™tlq^ÅŒ‹KŠþ)—éQÙ±Ž«'tLp—²ÐNÝ# íã…,$æ¤Âš“tI“Í’¥à0÷¿Áê+•vLIÁ‚f â½â5=¯uT8\Mv5Yü/¨£ÂÑš »’À_²þ©Ì4/IÆ4¿Ò'$M£Ûéë®\oÒºg´Ú¡›°WÖ X+Új%”Pû}Œ³þ’¢“A4+‡G®X*ÍÎŒO3-«)Ö=—ä¯Õ \:í…gÔ¥+ËÇ…RÅ='ôc\Š^½¥³ø`ùà~%Lå“Á¼½âSk˜¤G®lLDPûÔW£¹H»© ®£[6ÞñŸh;ÖÈÍ®Ùgf´O$…Y˜OóÆ>¬:‰”ê"R"ÈóH‰ÅÐ@â{ø04*+…i€àÙÖy¤D Ó‘’²â  ‘8|(Z‡q¸¤}ÅH‰‚ÄH‰‚ÄH‰‚æ#¥+«‘ÒœŠÕHiRÅj¤Dðç‘ÒXÇj¤4Ò1)X¹’E”ædQ#%QsRá‹HI”‚)Q)ˆ‘É‘"%Iü)Â~îØ¦¹fga9›aþŠf’±± ôƒRP:ª¶wKp\ýp€TÒÎí‘ú\¡ëÖÀ¼zž|¯âl?Së—ÄÛnWÏ]NèE§ ©/óáOo~ýùo>ýíñO?~Ç€IQ¦'åŽQ£æ-‘l,¨½Þ½¦ Áî5…‹»×$í^ë4iã8£èÄ8u$»×)Bö¼fl÷:xÏ@l÷ZƒnÓ6 »×fÙNm^[ÇëÊ7¯ Æç|Ï7õʦxE¾b+’Frûb³ø†›NÛ)—¶ÁS¨ ü¨5ΧȄ×QÚ,?jšvÂ^ë~¬ôTõÎgìð.cíÜeMw«¶%Tê b,〣ŒF½& uÑD¡ž¬.värßc€Ë‹Dbl³˜4u—e\ àËZYÅÇ¡…#\"£Ùè Ò½†8ûœ2.[¥‡—UÃSGQÌS69Mí5:Üô²…àg94Jµ~]|ØÎC˜4Ù` <טKPÐOÕ±°)\ a6mœ9:f7ÖýW¢º+þäéò.â‰÷µpœJ—lR7ÃÛYÙ—:ÛŒeUšÎ{I6F” LÄŒ>•N›‹¹%u'oS d^ß/Lخڄt²æ’ß¾”&ÌÖ¢1³ÒÔÖåƒ`#iêº*Q:ÆJÒLÃqI†Ík&NzÛ’Ì®|^Ì…þ–G¸p 1 4å)»sššË #“¬èj¹¸52&M<—)7G&IÂù{?X¯Ù¤~úg'h6Ío.­LÐ(h0A£pq‚FA’uS0(Îh6A+HpxU}ãÄx÷Á®O~_D¾Çg?Ñ¥•XZð=SŠ07Å+s>1Þç ü¶'¯çÃr®ÏkÅ–”;&&¹dIä—l:ð R°–Öhi˜‰Ò ב/éB³Ë¯© ·œFõ… ’;{ªP¤üò k/œ”ÂU†`¦C߆šQˆb–û;¨ ¼$á;’ÖÄÒˆEͨ,(Ïü–.vK¶£ ˱¨e5£°©…*ãÛ³‰6i`eÝ1,DxÆŽGû$r'PRÇ Ô®æXNÎ [4d××.#©LÁvayïPÙ–(*Ûh*ÛÈ*‹3\Ç¡ ÑJ¢ç‚KUµmdµí3bÇ¥>.D+žK_¦ªnG2«.N‡¾-PhV ˆ .µ+o#º+/N#&P™äâ=RdרFñÐ!£°è2ÖcYÂôbÝb­±­ÿXJªZÔ üq±€-QÕ©Æ´%`éB½¨R%XT qÀ¥nŒjV’*ŠU‚E‡¾ÌÒ;zŸgT»UŠE‰0 \êÆé%à…Ñ¡H(âBŠÜ8Ñ¢)émòî<¥0È/ÑrfèŸS:Ÿüb”Ú^ÐËzóÛÂÖæniùµJaßdÂgÁöyYh/¨¤¨½x/M¯ ¦+ïÀûYxm³Ããý@e“è4µí¢i݃«mí¢6VZ×^ð޳YŒr2< æ,mî3l[Ö|þ›©5@ÑúŽŒ:7çJÙÀ‚ÆUMô)˜3ÖYô…Z8˜+’æ¦ÀqsE’FîļÏ!héÓ¶UÉšEzo’&'¶jË@±ê¨:© öëÇ®IØr(b>¨©¦!“߀—[ŒØ·¤\wpƒášË…Ž_ÒÑɵ¯Ü’±7jVkF ¸Ä7ñ=uÊóN}Gé} +ÅEÑqa½ç‡k]êx^ù×ì¾&h§‹¾†€F¾†À·¯!td_Cë&úJIò5ÿì~Ä­qtà‚ûI.î'Q´Ÿd½pư7ᄆ¼ þÖÀ‰ÉûI›ó yyÙL®5¯‚pÙÀw ðzœo%Áehåä™Ýê"—Îs¬–6X®.ÉG´ÔeI8’¨;26à»D~Xȶ´3ŒM^yBn9ÝÏó-”Öø‘pFâ”Qú ToX4(mé#á ã“—ôö$¯ôt¢Åtc'#á c’éÆN6:Dבú—t!ÝÒÎ0VÇ;¼á±–Cƒ(k•Y3ú S±ÝcßÖØ[¢(H£}hH#*‚RåqÓ F¯–î2EOÑCQú ݱ¨}§˜”I_¤êK£x(LŸa;õ±oêÉÒ—©ºÓ‘Ü•§Ïè%Uû¦§ØKêУFÒцuHµ:6…FÏ´àØw¼•„C Óe˜ŠEë`KT}ª´‹FTrYaúTyÜ©[¥×•^©Ùi<}¨D‹ÂtºcÑ=n†2é‹4}ª‹Ât¶cÑ=®¶7¤/Óô©‘<¦Ëè%Õ=®FPà{I]¨$mX—¬±i4Ð Aª‡š!z…é3LÅ¢ÇõDK}j´hä@aPªÃv,ºÇº·O˜G_¦êSGrW˜>£—T÷X÷ö‰ðˆ½¤]h$mX—¬cÓhèÞ>µ¶@È(UÏÌd…é3LÅv»Óý-Qô©Ñ>4¢‘…A©ýñÚ©[£WK÷ H™¢Oè¡0}†îXÔÇ…h)ß3é‹T}j…é3lÇ¢>.$+žG_¦êSGrW˜>£—T}\HVˆGì%uèB#éhÃ\«(R°ŽM¡A^é0vmñ¬ð×.d©O&Í·òºEKTeª„1­¢X! KP3 t‚6˜4²E‹™I# Ú 6‘™HÐ@n\²ÉÍLpI½ý ö`ïpMŽ­‹Œ–kÈÚàÄj ›*fðtibϦO£Y]U˜˜Õ±zéÓ™æD¤ÏB¯Q8HgÃ_1ï:,¶{=¿ oÂfM^äá5±»_¬vùò`ÏJ?’7•YÅÈEiI:X†úJ_‚u°U&µñìÎpcØP¢e.ï ÏŸƒà|„×Ê4 ÞA6ÌÀù¿ë†á÷µÂ²9Þ¦{. ‡KB`ç˜Vþ½;L»»d/ÓÁ…ácÙéòÛÙèËvpaø ž›ËoÀR”têÊßÕœ|àÊL5'Ù|¸0œ"ç\ÝU¯ãÂðq½à+±^x÷Ò/Vs1 ‡­À%y^Ù“ÃVÉ®è-âWáÉ=˜*_CQÒ=˜p§bH/} p;)7™«°é®AÚŽÁO¯}Ìx¹ª/YMÓ@𽀄;0ádFR] _ؘ¤yåX4EAë ‹"_«Oî¿T&_‘GAÏ©Ð*2§âÜv÷_ Z੽¿C³Lš÷Ý£YpÎ^ʧxáòK :Ö,_Æ™Ñ,Á/\ B{“o¾œ„Žk¾lB„ÄœTX¸ù2¨|ó¥,üzTùæK&ú¸ù’‚ˆÃZóÍ—tró%¼7_ŠâA=ަ=Â;QàÒ;¸tãšd¾RŸœ½ùRP.ÞWðzóOûêìVïk85è|_´t-ÜèyE;åªó)×!=õæL°'IräŽ{+v°Z2<-Ô{K¯Óü$91÷Ép’ïÚk¬A×-N˜ ÀGzÍç¶Y:¹ÈŽ#FÏåg:s«ÿÎoiªA]DyaP˜èV%®n•À‡nUª*w«p©=¹% jšf¦ ä:ØjEk\¾åŽýŽ»ex : _°ã’Ê1P$ÕáíSIAˆN@Ól$Í[(ê;úªÍn äiWÂŒ“ήvJ¢QŠs¬•pµÞPßh¤o>Ô7Z±?TÄy‰úFAwè-z®o)ê õM¥Èž* Üåâ9ÈSu ÞqЙ’À²aðÀ"¾+›TcÓ9›TcÓI›TcS‚?‰M¯lÔôwÚ$xïbÎ&™|õêÀ&•hóJ®5Ô“k uE¹JÌI/B]‚¼ u©|ÄP—€äP—€F¡®Ô1<Ô%‘C]Iàç¡îÉêJ$ï u¯Ô:¿óûÔ–—æÔZ+=VëБ¦aU î¾ãšÚ>žù–Þ7n'üо?â ·B /‘(Nî+=w<ï\d[øÒŠ ÞTwX]ËûDoÕ…ûË.ë*ÜÑë‡Kau¨RäI Ê`Rà r=(|8ˆUåŽõ¸`}b)ŒBç–”¢Ðá.QèpŸ(hdQ(¼`&Æ´$.…Q¸FAsKa—šUÂIÍ*áÆ¬f•pƒâåpcB³ÊRØP³})ˆL ¢Ä² $æ¤Âçñ,1>`Râ ã Ä¢øY|@…#Æ¢ÀOãƒK’%>IÞˆÂPø®ágôBuåí ?V·„ý—®o›,à—dµ],jã;öåYÃåHÖ€ÀGrro؇;<0Ÿèë{VUgKX&¿îLÑÏø•|ä _Ö€—I WÙØÄÇ¢,/¨Æ'úõ»rÐ{úU«Õ5%D6‹§ bB@çažD!%y^‰å¹ã%è‘ß•ªÉÜn4d‘è4!ȹøÃoc!øí!øí.!Ð ˆBpËi#Fîj™ì<f.î¸Ò¥vÌéR‰:&u©.Çc]*!ÇH—§%‚p̉ Ä¢Τ²çцØ~1Ø í—b ‚C ‚D’ÔY A¤"Æ’œOÃŒ+‚%ÊÞd†=£_³ƒñË:ƒ<|gŽ`¶Óµ‰59C-Êó9@’Û¦@¶2Aš/~+Ž`¤Oňø¥8‚?G0ç߉»t«p“…u¬ÿÇ« nMž__68ßCòM¿ºB¤ï—†Å¨@ßWö?Ê÷¨ƒ÷0ÊÒrž.¹çÝ=Œ!ß,±qÑ–Øñ»`Y%ñ‰Bg–èÅàJ;¸*ÃP̯ô: å¯WøÂ<•?ÕK¶ê|ÒS\ÁGYOüÂbC⃻Äw­ i4h&OGô°ùKYÁMðA·+^ð!â"Þãà6¬‰`¸N; 'âY×ð‘åà«Ë°bzU¯¤S몄þÁbH*£¤n4ëqÅ»'ÿ“¿ÿwK¿aÓðŽ\l¨qbÍÇuw\—… ¥ü?ž<>üw¢ûÿ¬¸ð endstream endobj 326 0 obj 6686 endobj 332 0 obj <> stream xÚ¥][s7r~ׯЃl¯7Ü1î—G»H‰´Y–HФä¨ÊåxÛ)ËÞØ©¤ò¿’ÿ—nÌ™ »UjkiÍ9ß4€F£ohਧj²Æ{ø.>ýã§'Š|tûâIRO½õ“þé‡ù!Lþé¯O´w|¶=ú·<¹ÉàCyéôüký€OøÕBÇØTÿ{þj!»~p¢Ö4ƒ¤ÉÊq«mÝg«]E|~:£-!ñþŸê~ÛäÒ)Ô¤ËÓ‰TÓN¡[a?àSM×…PÓu!Vtç§…nÝÒ­±ð©¦ëÛî¯ éõƒÁ¦)¤Ž³šm%ðL-Õ~Å6_ëU>Ö‡U@VÚ‹€¬äŠˆÔOË׫Tôª·5“µ“˜¬DA©>pUÕ×zím¤~e—âI`ªBÝÄöµ^zÀR¿³‰ÎJržêƒXµQ}­—.ð6êw61ZIz:°êƒV”Vª ]ËSðºÐø°<¤Z`êüŠm¾žÛ;½IÄF¦yZ¾ÞÄm£W½½5@ÞYäi#z˜úW5Q}½):ÚHýÊ*OÅY`êBÝÄöõªîø@êwVyÚHž¦þ VmT_¯z·Q¿³ÊÓFÒÓU4¶Q­hlÍ€D• "OQ«Únm~Åm_‹jZÿ½HÒFõ$ )”êßå«•rùr!µ¼X“&o,2´<‰Èöè*âË— ½Ó«5ùú…UzVj³pl¡&~úr¡¶¼ÛP¯ÞXåf!w‹í1VÔ—/Wê§wkêõ«Ä,ä|;¿õ®Ÿ•àòz3­OñàÿÌÿ˜½ž²°I­öÁ‘–|™ŒYx–c+ê¿ÕõŽ˜5˜Vâ¤0®L¿ ”-3ö.ÿþd긗G›+.ÕOsìƒÓëIjïNHíÔò?¨þ¥Ö#:d‘ˆŠèë«ÖBÐV§§•à ¼þ€>UÜï{ÚÔøfÄé?âšQ3°ÖÌ[:à¼2çaäÐP‡ú€CC­ÍÀòQkhú–Ç͈®ž<™…Ö£8æI|Mpï™o5pùXÈqÀå£&¹ï!0'tè",+› ºz í,‡e¶Ý¯ÿ ÿüøä«×O¾xnŸjýô5:`ÁÁc@Sïफ़¾þðä/ï”Rñó×ÿ¶}ï&Ü㟠üó²Fç<ù˜ú²Æh…•“|§Œop \ÐÎÚgì”3§÷E J“ŠœØ§øç³éÜ”ÁM¢ÈP‚nðÏCó°=Þ…[üsß #Ì´0(_ú±þ«Pÿâ¹!“eTœ´8¢-þ÷yi³nÎ]oØ7-(N°|èÿ\s8ZÈüÍÊ §N9|íâõó&¤Š·ÙHíò[–âü‚«ƒ"õôüÿ§EˆsÍAˆ (7†Ö]væÔYº\EùÅ6Vüóuû6Æ`aRÕ›añÝú‡Ï¶Ë u6°·kM™uìÝ_¨$C½mA¾ÌòoÖùläÖi?¡óNßéɺ³¨qy;|ôVÇÑÀ@<Ç3~4°b•=oùÓu®×·¿ÞéxTSRšwþ]³@>Q7ï@íM9™¼3ô„âƒnt³‰ Éúã”\`¨;®™Q+Äpt›o Gƒ7á=Ž^—ѫՠ\²·“ý¸n)u´[ZËÝjAir†s¹ÈÒ«i¡áÀåærÖæŠk­‹Ö¤jæ>oº"¡ž1óæøIY3dÖ¨£Ú& Òê?áÛêä¶gð3üóoßÁšO*È]ýŠõ'Ö âó㔞t ZúûIaÕöæg¬h°‚€F¬ ð!+hdVøØŒ¯Jö“–Ψ‰0:1P ìÌ*2Ðv‚¾ïKz#Ç%Ë‚£ñ1’eh~X¨ÿ)g'öt,YÖäc’%˜….#ŒóS¶‡a‚³±Ç©qÒaÃIz°âv ¾mt‹Kœ -æ*"öÊLÉpÐÙÚdžý&«IîÙÿ5\”9¦uÐ! ÍIføWl~tR0?’)MÖì´ÝJ¶Øt•~“ѵÁHpó²fÓÔ¢Ò$èʼv¢¥™PUäÍ”'p[ê¯\>”™T6ò4}Fì8åVû=,7ÇżñQP#s;×8Œè®Š®I _€Ï¹O.‚‹¡ßq­#jÞ­Íɼ§~xe ¾E"sEƒ®mFìx ÕñrÏ[ 0ÑDJ­vL$M¤ÔUn"!Êo£}o@z ©ŽYA@#Vø´"+<¦bìÀ[  Ñ[  Ñ[  ƒÞBW²oá˜d­ÞÂAÉZ½‚ßñÆ’µz #É’ v«·pŒ«· 2Bjœt¸ã-ˆ\½ÊÑ[ Ù[  ‘· ±Ÿ{ „9²· 1|ß[è’\¼‰äÇx ²n‚Ëx­S„ á|ùëšlüjgÒ5ˆÝ¡9O|ð3ªÄæÏ»¦ ƒ¿d™K­¬ˆ|X3÷4Y :ˆÁ/i?{b‰þGp óõŽ¿ÇzÍà›Ñ?gÉ)­AM “Áº©S+K; ¥&úž2Ò3Ó‚¶TØuÛCК¡o©»“ 'y³Ò}Iǣ⾠M¸ÙE0djrv ³ âM;f0•!1øõ¨<,Ý8Ì¿PÔ¾GE‘;ƒIn„Øê¾Aá#7Bì*w#¢jTû…ó¨¼÷XA@#Vø´2+ÐZŽò/${T${TtÌ£êKÖÉ£:(Y‹GuT²Šâeê€d-ÕP²§¦ËˆÅ£:Ȉţ’!5N:¼ïQÉ\=*ÆÉ£¢ Ñ£¢ G%²ŸyT”9¢G%2|×£ê“+Ok_<¸²£ÚŠé×¾P´XûBAR틉Î:Zû’´g8Rû‚6'&×¾ÄhòŒèb¿ð-Q|°F 爼q¯Á:eËáÒn2 ƒæÜy×j<Ñ I•6¯±äÙy;—L;ïÖòN,7kŸ£/Èêa)ç*¯¶µ¦+ëLcEÉAï¼ðl«o¯¤¡Ó)õtªòÆƪÇõcô'dýírH`ýwÝßÝÒã…Ò©Sü±}:±)¶„±!TtKoáß©înóý^¿…Ö¯u—ê¥é•Ü©_ÂsÍô•`y¹!*BåÓ91P–ðºôÙC칊ÅöPõy&ÌhÍbÏ…ôò︲+Ê´%‘kf¥/TîGÂÑ2n4‰DFÇÓØ³Ël*P£Ú1cóÜp˜œ6Yßeî‘öö£¼‡c’™@Rtk" ¸tNE†º^i¾d„-x˜¡ïÄ_†Ì›׆f´¦f¨»µùââPä3îâ€kÀ™4ßµÖ ®ýah˜ê¬Í`˜ÆrÑí C¬ÇY$!Æâ¯Š®º©À”RP°¹4Kfo1° œZZ­s\ý~™é SôÅÂz%D欵¶ ¯Ö—ôÚn+«a]ä-5 «ÍqòÛ‰g|›\q¥€·Ëy.8¡Ïy›qkÌà¼C)2ÇXŸwúí€7Vh­Mç8ˆE2íÄÜÉöÙ¡'†Š].¿çˆøi…iC<8[…„8ôÔ…çòaÚŠáyeaõ£Þ]Yâ>Ã@Ïøò«äÁ‘§Èj­¬£Pk¦HÞ¶ 4>!¼Æ¬Å4CË¢Ýéu¹ï²Ðb²ÃÊí m€P¨•Î?¸ý $o¡ÇóZÞO¨H ®Iˆ/<§õŒ ¦)ˆ1‹‘£H1ð$>Ä@)D†¬ r+‰`eœgpF¢Áv ô8ózv 7i èèX,²¤À:‡‹bZ“º)éÌ@/„ q.¬§È«á&êj ªö3³ èÍêF<ÒèÜ*ÞÅwJ·&ØZ°‚žáŠÛóPV¬¦ Œ|oS+b=çæ,Ä:£ÃÂ;C²_0ßNX |ʼŸ­Ë§l‰Ìß×"æËöl…\æðïZýˆeȆڣ4lÒƒÞ:Ö‰áÛ„ÅO‘Ø4\öÈ;¶³/0X?è"h «¬,¢V“ƒ±…õÊ@ÂÆEv%¬‡Ý4˜Rz·cÓ¬Áhš¡MþÀ—Òd·:/ á=lëßÀ‚bZ¿9ö=„²e#¬+wmÃ×'E«vâàXJœÔw¸£!I2, –Îp^¼eÚYs­åx´–sïmM©ÙR™¢!— ëíÕ >—`hÀ%M•Pš,èIÎ’OÚøŒ»Ë¸ ‹Éæn?ðþ 9[“Ž¡T q@ Gå ×›PvR»Löh?ïù+Šá5ÖÈ•D â½µ ³Hó§$¿éÑ—$Ø—Â6ŸíA>Ðm¾2Æ.HcY¡æýÛ)ZC›Z©$› ZÖ Íï”'y˜6ÍÕk,ääýFöžuw_àý‹¶¦ÜœB1ßÑ:˜ ¹MSòÝQtØçá=¤À[P=¬îO1FRYàì-¤”ã#$H!TåM> 2V ú†a2ºÀgo„íÔ%|¶¶â‚»69/¤í4Øu73k@ÊàïX[ñÚ3Ô.NV é¹U,Lá,nkBœ Šˆ—g…Ãý„'rº;[ N§ÙZøÎVƒ³±Ô8RøYk&Á¥Ñ\¯ZP˜„åqOwްÐvv\ÈS¹¯ JÎÑ VË$¨¶w¸ÍYñm›·DÏM²­gÑ€J¡/1^¹²«-jOb²îj%Õƒ3[óÝvÑBb¸V‹Ù÷ô10LcðRœæBÐ<ÆÌá‹Ñ½§Û€|IͤfƒÁ)N>%Èmƒx7𦹣ŒÖ1c(KgÂEj`ÐmæìÌ#X˜áÀÁ{;]“`¼ŸÄ‚›–c_~ x…}Ç!¿ øéQsrÔ¾áÕULxÞÑÀ„žídñBèŽV5 ï!òéÞѪ==a\g´‚)Φ+f“îÏŠÅ KØ+Áîaj›¡¿£a¥¶\Ût$¬ì oxçNäø–f£Ñ’~øçòæ÷*™ì,~Csy=‚áwt+Ña#À†eXh*`Ú\ØQT­ó°Tø±Œn?ï+û9„¡˜sr^oS£˜]ežÊy ‡É <’q¶ÎÒÕÛK>h†6¢¬/)nм¥º÷˜(¨ÍHâ©9“¨ÝÁ]ŠÈ"ìD ±C>ЫmœL †JÚñ޽ÜIÔâc뼅 fðlp ŒM(èŠî¥K E e à(䩿ñ µUέN–æ^‹f$ùÜ—K‹Ë/qroäÔIÙ2Qîì5-ñÉöÅÉû1ƒ?N§ 8H~ÄÔƒ?Q°¦HÁ1ô®o °š$šÔ×=N˜À[༙²ÓC[à0­Œ„s’-p #ÑwÛ‚þ Š’…È®®-p0˜ îÚ—±Í°bíZs±Yç#ä pÚ˜¾Š÷X¡‘“,X×ü U.eÝe[ e‚bnhµ0³ÐIÌàÖX sI · ¸;¬19Cju¿ëlŽãMÞÓ ´½1ý¾c~«…(è‘:$hYƒÖxdû–ÊXQ.ˆƒ~ÁŠ ÙÊmrÅŒU(>ŽÆZ²$nл”ô‘y*;¢¹?O¦=êÔŸ( McêwË`ÞËr¦½¥¥«˜FìS*:ÒöÅ#WçC_,0rui°8ðüM ƒÕ^ˆúÔŽËþü@¸ –ý©<`8ÞÑÈ…åš0Ìg—)’^× Ž‰Ð1aÏTNP£Yììh±<:ï´IŠd!p†ð‘±§pg­˜áIlŠéŸÄ¦hñ$6¡1®¯Mÿ¹ÙB|÷"j˜’ñìáD3ÞÊ€+„÷F±¢L’9û~Iã´Ì5nZз¥Ú ð£fȶvBÛÉó!VǪ ãVïÃü0—²þúÄÃzGË?˜áÕzÊ)Ïi·‡Óé\Œ]lX¨ctª‰ñfxõ:µ_Þ_†ÇF}*•sEÿÅÐÖ]Ê…v&0øóäËA º§E}Nº^=¾ígn™&Nœú‘›Ôé;û7©S¤ Æ‹" çÜ™|(sá3È"2P>p‰1t`ˆ%1­@éqg£\e…jÀ…èωå Â8ŒgÐQ$ðçô¬®‰¼õ7B:³üúÞ³¼(&—züÁòJ<ìÍL‹!ia¬m\‹ûº£>áÏH$>Âc?ÉaƒœæL$®/•RtKë!j=èlÄÊþãSœŠ÷îk+ƒ2΂侥7‚% TzÓç°|Ý„þô9<õJAäGA"x zÐî1û|`y8¬’ê΂ØÀô'ÁrÆó˜}B˜£ô¡/x‘†V×Ît:Ü”F@j‘Òœ¨" ;ù肃 3ëöšwÔ‹Aߌ"[P.¹rq5½h#m,,NÜlM‚ò#1{†5hûlñå:ÉÁÄ+Z² q\Ûa̾'WžBù“añT±&µ±4©I)G½{ÿÛŸ¿ÿqûþ‡¿ÿòÛO/ÞÿÇR–ºk¦ð0¢Õ¦o¦(H4S40S¾c¦`ùˆ„wÌÎÍ'¹c¥@ñP$7SÑ÷ùSÌ”²|ÀÔLÅ,0‘™)e: ¹§;˜sé÷âÓäyïʆó7ôúqyKki4Ç€` кÑÔ%ÍGpìW°î,sh••“Á®?*¡—ʹßYWü{T\ñ@wd‡›Übj„Óš\›KaPw²±Ò'eÓE´5& Ñ‚\9áÙo+bµ;°ÔñWCLBœ Pb*' ú”xr±Àl±:¬{ÐFáñ³.Ï𨣶¼o;«osæ4¹ÁÅÜ ¬ºkZ‚›$áM‹iHªØÔ|i4Ó€q¿a z(ÞÍLA·t›,ó. æ%érÚ"…zI¼¡9ðv{ö¶f^eo_ÿüÇû?þý׿ÿyÈäÓÌ€pÊ-¼%›É (ÃÜÒC-(=2ŽiNI8\_n´áȽólà“E›üžÖÒûÓë¢U8Uš„mÆ”Ÿz¤H¡LÓâ}K hè/óá­ÜôŒÑ°¼sOÜ’í7ÐËç­‰ç8‚×òD|Ä9A6§Âªñ$ªõ²Ü>R¨!Œ¤H~Ã:žøÀ+‚)²­ý•…7%0r­áÓâ”Úµ³¡œgBÞšGS"ü®Àb¼†ÛfLi%lVðŽOŒ†ÒfÎᛪ2Hï(¼bñôÊÝ—ß_ÜÞ~ùêêûûoïî_½zyûúâüû/_]‰úÈæTn«I `ÕCQÞQ€xKN  * WBfÀ½"H¼:ko-Þ] ‘3ÅóÆ(  ïíò xAË00ËAAä„-®O‚Ú)jM].8¢ð½¢FÐP†÷óŒy÷š•ixŒwzLÆt˜ |Ä{Eø#Äš¥­j,÷rPk”pwIÇAï²+w$SP[Õ˧XC:i½åSaëåóßÿxÈsДë$ë4 Ö \ ÖÓ¬ú%Âr°î¼gp¬c½ÉÑzŽ|ì,ZÇß.ƒ0ZÇëªÙˆ[P(§wØ`i´žV·»“¸Ñã OXî¯üY(‡^„Þ“tx1 —ºsƒŽ¡ÈÅñ8o°)%:¹Sxdñ¬† Þaa«ÉƒYÈxG3oxçwX\É#ê~ÃNÏ×`PÐõ…œ #·ô8Þ¹Ò ,ý2Ö]Zí<ñ!‰L=k¾¾ÞRW& ³ÒBmÝM•w³Rä=-í™÷Ž'{Ñ­ê±öã¹$ jµaùAË@’‘ÁÜ&çsÁˆ„R‹M‘]× ’‡Ê5¸øí‡ùµvþ¦JÞôõûnBòdúÛ,JiŠaN‚æŒpß’wY~#&\,ošß û½Ë±DÌ8ý¸ÅD€lö=øsÏ.Ï‹¾Û)ôÍmÈb§Î©W€¿D€{voû }–¡ÍlôwŽ°Ê‘`vl ¦!<ïâ=ë8Å+zÚü.ÿ1~ƒÈ§ËtþÓA!+?ÀeÙ¤ ÆO{Æ¥ñ-÷rwæÝiS‘Î|kæçȤÇQ‡§¼ba¢'r,ú΢»e»¬Ç³ÁÁ¸.ë1#’¸( ìXhO°Íú±9Ä[208ì² K£¸»ym!&ep-æý•çÀÖ‚«rG)qçÚº¾rñÊ—½iÇ}ëÀ•¿1÷•ž3V\UÈ›ÖBÇwö¬ku+®3E­¬øÚ&žq§|@Üm#À=«‚wqôõPpã”`.én3ð˜@îiúŠyK]k\¿©œ¦ìM·­rlbt.F׿”_ Sl×BäË+ t-yo¿£gE1 îº\³ûƒsr†’áIµh§¨˜l/QÌ·S  Ÿzz‡4rFK‹'í8×nN.œu§{ÆHZoù×m#UV÷êÛ‡/¯¯Î¿¿{ýåë‹æ¶1ÑÄ2ïØ»,Ì×ô¶¸{ZŽ÷é´Kš‚ÅSq-d/¡”ðª€LÀ7{©SüÎDÀW´ºóH-ä–Þ’ ^Hg»Ê%iÒ`©\cÞ‚è֒ʱǴrC²ñدYDÝž'éÏ"f|R²Ý>û\X´ó¨å2Ǧœ:ÆÑ‰æ8ièš—dõæãOÉav7z:“ÿCs»XÑBžÑòE•)Gïönd xG’0‘ü·ðæÛžé`ÿ™{°Rnýú_êuÙDç t–]»y¾:¾—ô7‚•ÎìM¥ßusx!…Ú‘öáônÔ[9,èím%áq¼Òìþ žƃ]eõ©ÐÿæÉ¿£(=ý#įO|ùÅÉöA•ÒúW}Ô@—÷~òøô7 ûŽÅl¤ endstream endobj 333 0 obj 7784 endobj 339 0 obj <> stream xÚ¥]Û²å¶q}Ÿ¯8Ù*Ë®¨ò“J3’%òŒæbUÍ‹ãRì$:Jb¹’ÿÊàÆ¥ol죔ˣÝ‹‹d£Ñh Ð<˜Í»ËâÒÃ_ÿüÌ?½þòÙ‘v6ŸâÃãMˆ[|øñYŒyKŽ‹7(øƒß\•ÏKÛï¿<û—*'g&orv^Eƒ9“=¶Ô8ÇïÊiêÿÊ{Ü~Üž>Űåq—¸,Ü`à~Þ¥ÿ®w1oþ§þó'¦.YƒŸ¿yöéKÿ`íÛúˆQž­’†}K{~xóøì׌1éã7ÿ6Ê­q[HôEýçEýç[·i‹é`ð¯ÈíEÿœóƒq{û¯Gøà6=ßà¯ê?¯ê?ïÐ5»ßr©dzÍëúÏ[„LU§»ô4¦þ7"pö[püÑϧøv(æýøÛ—ðjgã¶{~«çõôÊÎåmO–!?A o·È_ñÔç/©iç-IëÖ×ÿ¾<Õƒø‹µ‰]ð cŠÝ^7§¾áðd¶ÃògþÃTX{¦P/{ñæÙQ ê!•g·®¶XîçÜøÃãÁ¶Æy»`ˆ·–òeùÿŸ{ 8ZÒ¾™JëÞ·èÓx¢_'Bvå³3eð—Tç=½Å ´YèTÚwX‡¯™"­±ìJµ=ØâL¼c×íÁŪ†äFjƒ)ªçªûäf€æBÑ&m)O4j_.›­Ø}…A±T.gz?,‰(:nÆ:çJòf߬9dâ`ÏáK‡j$ð—¶P½,ñçô¥9‰¿;…Ò)x]A¾´-c a3«å=åòL\ÕXm±öiñL±˜»‰÷ÔÂŧG¾ÉGâ÷•²ŠÉÙVLn*ý{ ¥µ+¦â”ò±P{ñ 9/´~ä- ‹îJ#¼Û©Ï/ÐúÍ[®ù£Ï¼.mDZ¨òPl5Ià}Ñ,¿ñì"ÿ€à!3:7ŽvËžÛÿ×6»0 o=ˆj@aÛaü½¡<ý惿?9Bæâ2ó®](}MôyaÅ»Y¡! £‹%ŠÛ³ÕU«÷ˋ֭M“7ãX"b³^ ±xG“¼^ ±ôHyåbqŒÙ9Ý0b鱌ÀtQŸ½ËÚKWí®ÔæJ¥×ª¤ ïFoÌbƒ8ç7ìa]ñfw‰»¬â‹­S>½uÛQF‰=fPþt¬ß+ª®ïJX][„½¸«ŽÎ3Ô9ãŒü=_ò§+ýZöüÆ%ž··À$âÀä ¥€Aüüǯþó_¿ûá§Ÿÿã¯/þû‡Ÿþöâ§?þó?|ùÃß>üúÃÇjh³§ŒÌjÇQ‹ÝL‰÷(ˆ…6ûî轈W:])Ä*&oÑqâwÔDjp«>¢·û¶Gþ²BG^÷ÁpÄŽs<@A¤î«QúÅc•¦m‹»¡ ï©mÔÆ¢ÕH™á^<Öq 9Ü—¼ßW·ÛK³Ì‡¬Î/p4ã¶¼sÅ_ôã>—PXÕøQŒ2ì‹÷(.Ë 5~Õ›o»¬ß8Ø2@ËŽ¾¦‘Ë&l*Ý„B£»·µŸo΋À…޼ d­ÐªqGK·““n5hIBSx…·­Zq(ñsò‹æÎøÙÞÑŠCAì&-*!—šrnQ %> ž£ÎÛÙ…YǶß[•±ØÐ!X8‰UR1^ß}x,Ñoqƒ ÎûðX\×áùKƒA¹^B…ñ ¤ÞÑìùºw…&;Ë@¤£©Ì1îcJ”z”™‚ð,Qq!$i^¢ã”RèÂKo|ìü¾jµ'wáßÝÓ…‡c=;AAâì-f'(üzvB$¾ž pܧ¸¸Åƒ¿Ñ;ÚI›Ã.@Þ¦ ëÆû“9þ²oiO^€ü=1(nnçÊøbè¿{éÂ8å—ü S,GÎÛgƒ¿ S>¹…bJKË{ZÒ&¼òW´¯>j§¤*¯kD­)/”Aƒ Ü4^ÐnÜ:®‰oº2>»ÔØïù„D8~ûwõŸÂýpé“ÿžvÖÕKˆ¦ðíœ]f­_Ô\ØKp”yãÀQ±,¿s…ãn­82ŸUR Nã~oû¹Dô†¿‚£›È~¥Åâ“ÐÈqgjJe9žl(¡ÝÙçiºe V‹ 3{¼Ã7Æ2<‡ÁZ-D_ªÊíz-ĺ²`‚©Î¦¨[ÆèR £»c²á(þÚ1ô;¾°ÀAqJíGÓÁжŸq4> ¤ØP³ìÖöÎÿ‚–×¹jËk×·¶¤I6ÊNb7é l´»N‘aF„yŽ« Î 9›µ ) ÆQ2h0NÜ0¡ÆÐìdHvð’i>ƒoâ†ñ4†f!Cš|£dÎà›¸a6áfLrHœ&3(KÛrÇf/övónHL±!aißÂ0~Ûé¼ÕS³$ObPÚŒÓajv4É2!ψHÄS†¦ˆ«i”ñÚcû{<$¦Seylq¿¡mœ§t–n?P,wóu˜v‚§i ¢Lˆ3 Θx\ ¹3àΘ»[Ñ”Cc%yÚ1eîèi^§ÛÑ”mã%yxPôÃÆNÞn*§[Ò”;ï(ÉÃ{2ÞŽž&6xš!q y8OFÝ*ðHØ=ó™•4„e ¹‡&‚êÌ0÷JjB˜¼£$!÷x|ÖßIÔ«¨ v²Ž’„Ü`ðY{'Q¯ &ÖQ’{¬>ëîFÔê »‡Æ4.LÐ=8»÷à§þÝ SlHXÚƒŸñ¸ˆÎ[Ûú`jŽÉ“”ŽàQCø0²I– yF䓃«Ið3ø3æo6ä0ØA ~ûă\Ͳ€l7(ƒÁâžøavƒ«Ù'7(ƒÁâžøa|“ëfb’LDüH•ê#UV–‚õ¤:sF̽ʆ&ï,uéQEvÖ^¦WÖíde =ªÂÎÚë¡Ñôj"`e þ<ª¼ÎÚÕßiZípÑaÔœ‡®#†æ8b€‘Ó)ƒ²¹yÚÁÍÓÛœFgénÊt”ùY Ú ž¦5ˆ2!΀8câq­§‘EãΘ»[ДCc%Eˆ¹£§yužnCS¶w”xY ÞŽžÖyºM¹óŽ" ÄÛÑÓÄO3".CÁ£ÈQW;É~LèÔßÀÒ2šçl@PÚ íü­¬3žö’=ê~2œè”³´›Ù EÈifÙ#–áŒç¤Í€v^‰-l0gÄÜ-)ÏùÏÁ;Ë€‰ ^&–=ò`yÎ…ÖY l°è4°ì‘ËsFt°Î2`^ƒ@§yušf@\tXÆ5ˆ‹aÔõÉfXõ'~˜bCÂÒüŒßÀ¾:oµ“ÁÔ,É“”ŽàQCø0²I– yF䓃«Ið3ø3æoöä0ØA ~ûă\ͪ€l7(ƒÁâžøavƒ«Ù'7(ƒÁâžøa|“ëf^’LDüHJn|p@­MJ,Ýtq¨»³vD]¡M°“u”X8º¬>5}uU6°Ž G7À§ŽoDMƒX°XÛÁÂÑ $®3ÙÖ¼šîGb:ePfFˆ2~ÃÆ}rží3ái$wÒQffˆ‚h'x6ë„§ÿ‘<ˆ3&×¢4»M94æQbPˆ‚˜;zšW @¶w”¢ ÞŽž–ðÂ;ï(1(DA¼=M,áÕA†‚A!Фä «ˆë†7,*Cžó ÃÆÎÝvàa#íàeÈsdØØ¹»Ò!úÑÍßõù"ŠL«Øz§þtNƒ±v37šÖMPŽ27V} )BÞ©1eH›1mF´ã:G¦u'sÌÝŽš&ï(q0ð¼>M,z`EM°“u”8ø@VŸ=°¡&ÖQâ`àY|š×¨™p˜Ù™Æ…L¹ÙÍf‡›ï”É%7ß.õž¼]KÙáæ;eÛxG‰ÅÍòvôÔnv¸ùN¹óŽ‹›/äíè©ßÁÓ´Èe(XÜ|!uMÔ²3Ó¤þžJ)v (m™^–¤› Æ3ÓË¢„(ÊYÚð$EÈ™íeQÚ !m´óJœôeqîI§ê‰_vfŸ ÞY6MlòèÌÿ²(eŠv²Î²i`“@g.˜E‰(S¬³lš×dЙfQŠ :,OãbÊõhÖ¬¾)‡9KÜšïgvºõ+pʶñöw æ‹x;zj׬Â)wÞ^âÔ|oGOýžž`Çd ¸5_D}æef£y´ó {¢&”Ï|Á¼¡òÜÎ;lD–Î ö[Òf§™›ð€~”wÊÛåðè Ä93½EÆ·ÈäƒÝ%ã»dr—‘Ý9ÿæ=Fé¸Gî.éžpä|Î?Øy‡QÚ ÇõðàÚ G.èü¸Ã(í„ãzxp H„=G”ý!oT¶p°ƒoR,åfªé¦q³4þ‡< 5ííøÚóÒ.@C=‰W³2&g`¤ƒî4RD>áœ*Ë2ȘdÝ81{ì„í4*"lÀœæŽ$<§! d L’n†ˆµã Ïiúd/$ëCt2׬Ógè® àüÀjÜ€#‡Uƒ.ë@»|µç¡!Õb# Hs¿Î®‡;`– ö$ÑYϹÆùýw$]ãœV=¯–¦/skIF£–V‰Ò{—i•8Õ%ðM**Cï£æü‘ì*=Ñ‹ÞíŽ\/˜ëƒ2ˆ&;•¡‡[$‘d-ã„Þm™t×øµšörG¦YÕÕ˜IºÃKÌd}I[ä¢kÝËu.´kázËÝ*³Ú5AsÕ¯³åÉ® =Ye(_§GÓ\ýU†4ÍAÕraIŽö*–$]jYŸ4#WOû¤©v×É~(íTÏô£)eZjÍ6\¥¶¡ªëü-š]·JᢹC×ÙK$…LO^"9#ZÒ ÍŸÒ³Vh²ÄuºÊšÑs5Ðùõê*ìú°2x>Üâ¤2p”ÔÕ V䌴Å!Väl í˜"|€Öò"|4Œv< =+iq> 9 äúDt>Îâ8|R…vZ=eq\9@; ر<n¿ÞžObXîÐ'¢¯we“›²áVØë­¸tOør7.Ùà¨íµ$û—[-ñî>m‡!Ýñ¹ØbHös]o*C[;ÊÈ~%mëÝÕ¶Ü:÷ê\·–Û…È•ë]2d»Òb“ Þœ m ût;$HFþõ¶´Cc±'fb_g‚Ó- Ëdp’~|M’Ñ)Ð4QTO^¥™Øwä®Ò¼@%?‘eÒ®>ó]cïq Öá/š¿£_ˆIÎ1ä;ù ãâæ½gð÷ä·±ø´vúíš=y¢Ç=×k~k6cÓÛ?ÁO³ûã‡ëLJ\L …â¯1‡‰ N¦ß/ö!3ø.~ŸØç}q÷úE?ä»c•›´yÃkˆŸëÇLGÞÎŽ6P‡õKöÑÅ!íõ+=‚2ßÒoXœÇLß©LSOÁ—N2øå=^c^üð^p¼²Èw[Šé§¨×Sý¸‹ñVÖþë¡1rJ~1áîë×óÒëaÛ®HJAjW¿úì­:øQê·›Óv;^ñ»ñÏká|óÚú7h|}Øu«§ÌÇú nVÂ)óõ£d†¿±Ïÿûqâ>ocõkâsáÃùëÇ¥vn¶ý#ó·{–Ÿå5>É?lÑÅKFö9¤ÓµÖ¯&ìœØWëg3Žƒ³ä)9ßGŒ/¤Ó8†üƒÒæ¬ðxØ‹–O¸ç'ãÆgõ)þfObø_±OñÔO hçsy›hÇ ãü‚ õwç“ÝtÈž¡y&rÝ h©×ÙÓþKná¥[üNpÁÞº?íU{k$‡? Q?¿’ågýœSÆ´íyAY,ݤ J?yöÎ?Jîâù!¬qŸ“?‰ž|bÈq¼x‹ú1áêÈEø³{ ÃJƒ¥ çøËÅV¯H™Îƈ¿‹6†Ü™“¢F>åqú‡úi_èL>¦ßÝÙÝÎP¼ÝÕïêØÃ2ä~áFLq#)»’ÝeZ¹ª¡}`Ó…~îqä:Iç7èT Ôà%UOEõŽÝHØ‚I¿à1«‰„#s‹”º ¼èB(̰¶p~S;päoGË´²(Ôãj²e ’(‚·í·€ú™×â"٥Ϲ-Ú:8ÚòS Úϯ˜‹ªó9{¿úq¸+ßQû4³sÐN¿¡›öÈAÀÉá7?¿¥Ná‰[±ª{w~]õéÞÛbÛwé¾~EÊ­tïK—螪ûö†D b;¥ ò]›úœêiê§ EEC³!Ý]‘õs£»u‹šôRM*ñ…Jñňñ‚X»—ñ‚NÙâ‘òiñUü±™œè›®ŸÂ:ËÍ€Ù´Mv ¥o¡ÈOi7Oß¶tó‘ùð‚¬»yŠºîæ)ò¢›§0ÅÕ¤æê TvõôW/iAvõ)»zZ»ú˜Ñ¸X¾Pq6õ»‘ÕÙÔs: sTgC@ØÙTã ü¡.{êœ,¿³Ômhõ8º§×ãè6–õ8º ­G·ñ”zlo¨©¿võƒpºúk'¼Ç»Õï«Ñy]û§?æ¾i ¼ŠéLiè©5téÞžÚy4ž!1¨ÔE®ö@@t`'<óùõä{¹Õ¹ôÐdP_z)A;r[¿'ï…'ǨRÙü)?̽h«TFé>æÐÒ š#\èL˜i @-r ïAGìe÷5ÎÐo$&ß>5ÆóCŠôÑ;çw|+¼£;PG+|@Ñç-V—Jïé|kýP<áÙÝP:£Ìï‰+äÍXzÉß²DOõ+ùjü#|§¶~‹3†ÅËÜ4S\ý¾EËA¯Øœ©«_¡÷ H>göí0G‘‰ÕödG–ÕâbASäÿbý¿z0Ì×t^û…1·Ò°jÏL@‚¹Õ®×^ÚGÛq™^ñj ¡´‚Àß FbEä;y­ÇÕPÖÙÅsî·) ú`l’ÂnÒ å-F *e1H”O1f’æ5†°Ñ'ˆõ¥èåtÑFîWØ bÊ^~6ƒhìÎlQpÃ; %œ½ghAPÊЂ ¯†¦D©E*tÞ‡)Õä§$aÇQb0Ïõƒ_¥NÍqõ|$Ž9Lí¼™ºhñh‡P3WÓâk{‡Ã_†€öóÃÌò}µ@Ëû:¥}oMVWè¾II¼ ` ìzBš"Å iöxÒ„4cZLH‹¯"ÇÃ)ÇÃD«IP-oW]ªª‚b}Îëhf·~Ÿnvêût³[¼ÏµÙ‘ ³«Ãïcéì(êÚÙQä…³£°kë¤HÑ:)H´NÆ´°NŠ¿¶NŠ­“iúÞѽP­ÝñÐÍõ‡n&¸zh^ouv¡~Â\­7_ó®¼^m-fÌ ™ò;š r{•¤ <|Í5² DnK‰3}Oõäââv%æôÑ/nW"9+<Ó‹Çž92_^äÈëDQÌ#Pþ’‚± îø@à` çÒäô1ã¥É«ŽŠ/:* »Ž{(R‰{(4^„ þp[¼ˆj:Ôôbýù€„àE¾Ž'üwâ,© 5âŽ-—ñ9ꎂs ´Ó7¶Ö2ÐÑç¾Efy,¯â'4u†Ößñ²œÜÿ²†j §‹ªÉgIPæ¬!ÉÇH,OõP¨´HD1âO4¡Ë!ŸNÙ†|"åÓ†|÷VŠeÐî­”:ðb¶d›ÃõŽL€È±A)±A^Å"¦8 ‚Ô{­í~óµí‹.…½^x–|›V‡ßf…¥F{å!ȯ1¯±TÓÜÍúšçäìÚkm•5uw„ÍWGk•eYoìv8®Ú†P»µ ÄÌÞãj0£‡m¹„‰ažS#VIBZ“TËRI|K’›‚UwäÒ“-h¼HÃ=ßÍkQ èpÙ U‡«S6‡+R>ÍẬ-c[Ÿ‹Êw†š ásyªÆîûf¼çôWÓ&ÕEÓ×ù`¼a¶š ž}–l•`¸­j$ÝV5’ÓV5’n«I³U¦ÛªJãEšK[%@ÙVé u[U)»­J”O´ÕÝè$Öì ô™škZÆ õ rM¢¦3¿;™).—98“0Sì¶C²™bª°ÒØP¨F…w …(ðb(DaבE*‘…ŠÙ$&S˜ÍÓÚ2´g]º¿Ï×Ñz*=m·­3+_GQ×¾Ž"/|…]7ŠTš{—k_'¾Ð¦O¯}‰¾Ž)JòuO̳NKÄóÃÆX*Ic©$gh$mŒ¥’4­k4mŒ¥Óx‘æjŒE¢»`7TÝ…NÙÜ…HùDwQ3üÄÀìs>äŠ~s_ó™èMèÃoÂöÎY×€DË#nyI·<ä´<¤[žFÒ,O£é–§Òx‘æÒò|Zg{±ê–§RvË“(ŸhynçûI39&+]wa}äéÎMkâã.áxŸgÒr¾”b¸•j$ÝJ5’ÓJ5’n¥I³R¦[©JãEšK+5iN±êVªRv+•(Ÿf¥GºÎÖêSPó™±ðœ_œÂ–‹á‘‹ñø6×Ch2ÅðÔ6[Ôbd‡²‰÷ #{£ß±–C”Æ[NØÜ–¸ÚrÒû^Ó]Û^“°ëuöWrŒG®GH#’¶ðÒÆG)ÿ¢ñ0¹L=ý^¸26Jë‰éŽ ‰é)ûÓÛÓÿ{7âžù<íoÈ€È ÆÏpKÝ·lJñ|\giJl;!ë{ìË–‹ÇÉrñ¸3WޝN8øLŪ™ÑçT6ú¿h\&oó?®':Æ.ÿCÛ*Ö6ù?õëÆ¶=×ô¹M¸_øæôCqèÁïˆS ‹Çñ‘BxRϽ:ÒÁ¸ø™cõµc¼5„´ ç¶*'aë;¶í[êÞ#{]|ŠV=Ð-²›²ÆPÆç¤#…ݦc_¼yöêÙ=«ØÇòo:ΓóŽÒôn‡uÞpàOÚ¯ÿ˳÷?ÞÿÀé¹Ò endstream endobj 340 0 obj 8976 endobj 343 0 obj <> stream xÚ¥]QÏå¶q}ß_±'vœ»‡C^}2;Z»»üV  Šn楿’¾Kræ Eν‹ ŸWÔpFW¤G£3Ãåýr£À¼ÿ‡SÌïÿþ×w 4ýôûûò>¥ÛøýçÇ¿)óûÿ~·®tc}˜¹ˆ¶c¾ÝÏóG×ò�ûOÿ¼Ǧ,¬Ë-°>º‡Eš:Ô«ŸÏÃ,f0µ¬ €½SÖú³ÖOÌpœšöó êÎF·þ|¨+1(Í1RÓ|UÊÌ¡Wˆ~>”^^´^^„Þó ¨RF½Bôóq õÆ|qüPý8. •©v§ïñlªwúÎõf2§"ÜNÆ[ªã*ËÝ®Úw»j{ÜmqLM{9Y´•ÎR»èPïyÕö¸çâXh/'‹¶ÒYjêoÚÞî¬9®êq*Öý©]÷æTžþãà.}œ¹JK*Ð4ý4… Ð Ò€(Á„îRa@èÌh$ƒ‘ F„ ‚9*ìd°ó˜ˆ²! +âtÃ#cEö©Sµ©|LGÙ@†8]1Iÿ´2_›Çœk*“R6HâtE'kCö©ÓV¨|›—݆ ¡‚•5ó”ζ6({ƒ¾ë¢!Uyuz•èÑê TåžV•宋6ÄéUbˆ¶!û´A©*Ë] Ò†8½J$Ñ6dŸ6(Måã–÷°7­BǪ%®Í8¤?¡3Wé&°4¢H@©úO@¨ ^¨i  ,Ó"˜Ð] 4d0’ÁHU±˜EOØÉ`§LNÑ„•zz¸f¬È>mîV•erŠ6êé¥ašþiuîVeêU•erŠi£ž^¦Y²O›»MåcföÔÒØ´VAáM»"kZ஋†TåÛé½A¹#­¡JµQîiUYîºh a£œ®*‹eCöiƒRU–».¤rºª, ” Ù§ JSù¸å¦¡™i ÊAÑfÈwá¡ìÊCQÇ™«´hJ=€RõŸ€P¼P Ò€Š2¡»4@i:3É`$ƒ¡Â,†ÍN;erІ$¬ˆÓÚCQVdŸ6w«Ê29E â´öP” Ù§Íݪ²LNÑ mˆÓÚCQ6dŸ6w›ÊÇÌì5èÕ±j:Ì l<”½AßuѪ¼:­=”ÚP¥Ú(÷´ª,w]4°!NkEÙ}Ú T•宋iCœÖв!û´Ai*·¼× a¿j:”‡Vð8¤‡¢3Wé& bí@JÓBSøÀ Ý TŠ6¡»T@:3É`$ƒ‘ªÂ¾– ;ì<&§lHÂJ=ÍÚCÑVdŸ:w›ÊÇä” $lÔÓ¬=mCö©s·©|LNÙ mÔÓ¬=mCö©sW¨|›™Ýµ:6­UGgP‚% Z"R•§!`Òê „LšÊr×IMšzÂ&Ú†ìÓ… r"¤z‚'Ú†ìÓ… ^Òi€JÓZu@ %°ˆ¡ÒCÑÇ™«´¨J;€Â2†Ò¼`Ci„@óP´ Ý¥ C E7(#Œ¸ ;ì”ÉÉ2†Ò¬ˆÓÊCÑVdŸ6wb(²„ qZy(Ú†ìÓæ.C E6Hâ´òP´ Ù§Í]†I·A­ŽM«ÐaÝÆ€ncPnc@·1 ÛŒÛÐm è6å6tºÁ¸ÝÆ€ncPnc@·1 ÛŒÛÐm è%vô  Û¨Í(Pý Ç uœ¹JK7H{ônÞôxJUXðB5HB øDLè. PšÎŒF2É`D¨v2ØÉ`§LNå]ô®z×Áx×½ë€ÞuPÞu@ï: wŒwлè]å]ô®z×Áx×½ë€Ît·A»,è]÷…Ðm$tI¹„n#¡ÛHÆm$t ÝFRn#¡ÛHè6’q ÝFB·‘”ÛHè6ºdÜFB·‘ÐKì6(—…ÐmÔfv ê¬ÞhôñqÙÕ*Åáy¨J(MÿMá/tƒ4PbÅ´&t— (BgF#Œd0RU(;ìd°S&§ò® ½kBwMè]zפ¼kBïšÐ»&ã]zׄÞ5)ïšÐ»&ô®ÉxׄÞ5¡3ÝiïšÐ»î º„n#)·‘Ðm$tɸ„n#¡ÛHÊm$t ÝF2n#¡ÛHè6’r ÝFB·‘ŒÛHè6z‰Ýû„n£6s @ÍC9¤‡¢3Wi)P=”v ¥ê?¡*,x¡¤!Ð<mBwi€Òtf4’ÁH#B…Y 3|¡ljËäÌò e³"N+E[‘}ÚÜÍð…R6°!N+EÛ}ÚÜÍð…R6Hâ´òP´ Ù§ÍÝ $» zuÌð…²;(|z;ô]ßä§·"/Nç·ÖPeƒOoMe¹ë›üôÖlÔÓðéMÛ}Ú lðéM6Hõ4|zÓ6dŸ6(|ië6hØßàÓ›6³£@\¶æ¡ÄuQŠ>Þ¥ŠtX¶æ¡´(MÿMá/tƒ4PªÒ³¿2¡»T@:3É`$ƒ‘¢BÛÉ`'ƒÇä” IX)§øB©­È>uî6•É)HØ(§øB©mÈ>uî6•É)¤rz/”Ú†ìSç®Pù63mÃ_(›Ö¢£7(b(Gƒ¾ëAÆPм:­<”ÖP%@ ¥©,w=ÈJ³!N+EÛ}Ú ˆ¡ÈiCœVж!û´A 2é6(ØoZ…å¡Ä(b(ÇôPôqæ*-ª‡Ò$ DCi ^DCi„@óP´ Ý¥J„ŠnPF2*p1v2Ø)“3ÊJ³"N+E[‘}ÚÜC‘ $lˆÓÊCÑ6dŸ6w#ÄPdƒ´!N+EÛ}ÚÜ2é6¨Õ±i:Ì  ù8"û8*úqLC‰ b(Ѱ#Ò#ò£""Ç1”˜ † #9"%9"'9*RrLC‰ b(Ѱ“#Ò“#ò‘» öÄP´™î"†ï:†¢Ë¾ëJ¼‹J¼wb(Mÿ wˆ¡èi  ÈŠ6¡»4@¹C E7(#ŒTöu=";"Ÿ;*BwDFwDJw4œîˆ¤îˆ¬î¨hÝy݉ÝÑ0»#R»#r»£"wGdwG¤wGÃïŽHðŽÈèî4@ %"É»7(ŒôeFú2+ú2#}™‘¾Ì†¾ÌH_f¤/³¢/3Ò—éËlèËŒôeFú2+ú2#}™‘¾Ì†¾ÌH_fd+wì3Ò—µ™8ˆ CÑÇ™«´¨ ‡N ¥é?¡)|à…n„@óP´ Ý¥ŠÐ™ÑH#Œ¸2²¼YÞ¬XÞŒ,oF–7–7#Ë›‘åÍŠåÍÈòfdy³ay3²¼YÞ¬XÞŒ,oF–7–7#Ë›‘ÔÝmP«##Ë»;(H_f¤/³¢/3Ò—éËlèËŒôeFú2+ú2#}™‘¾Ì†¾ÌH_f¤/³¢/3Ò—éËlèËŒôeF¶r·AÁ>#}Y›9P€E …“Ž¡èãã²YÇP˜E …¹CiúO@HCÑ Ò@`CÑ&t—( b(ºAÉ`¤¨`ûºÎÈòfdy³by3²¼YÞlXÞŒ,oF–7+–7#Ë›‘å͆åÍÈòfdy³by3²¼YÞlXÞŒ,oFR·m@–7#Ë»;(ÈCaä¡°â¡0òPy(lx(Œ<F + #…‘‡Â†‡ÂÈCaä¡°â¡0òPy(lx(Œ<FÚI·AÃ>òPy(,y( <F …%…{<V<F …‘‡ÂЇÂ #…‘‡ÂÀCaä¡0òP¸Cy`ä¡0òPXñPy(Œ<6<F #……‘‡ÂÈCaÃCaä¡0òPXñPy(Œ<6<F #í¤Û WGä¡ô%!%!%)JBJBJ2<”„<”„<”¤x( y( y(ÉðPòPòP’â¡$ä¡$ä¡$ÃCIÈCIH;é6è,oä¡$ä¡$ÉCIÀCIÈCIÀCI’‡’z<”¤x( y( x( y(IñPR‡‡’‡’‡’€‡’‡’‡’:”‡„<”„<”¤x( y( y(ÉðPòPòP’â¡$ä¡$ä¡$ÃCIÈCIÈCIЇ’‡’‡’ %!%!í¤Ó1”„<”î  %!%)JBJBJ2<”„<”„<”¤x( y( y(ÉðPòPòP’â¡$ä¡$ä¡$ÃCIÈCIH;é6¤ ÊCIÈCI’‡’€‡’‡’€‡’$%õx(IñPòPðPòP’⡤%!%!%%!%!%u( y( y(IñPòPòP’á¡$ä¡$ä¡$ÅCIÈCIÈCI†‡’‡’‡’%!%!%JBJBÚI·A¯ŽÈCé òPòP’â¡$ä¡$ä¡$ÃCIÈCIÈCIЇ’‡’‡’ %!%!%)JBJBJ2<”„<”„´“nƒ†}ä¡$ä¡dÉCÉçZÐBí8(ÇqÁ’úo%Y1PвNÈC©ºœ.úήR¹îPA¤êËZ}õY«/½•… ²²ð˜ˆí0 ýådÕŸ­~Ù£ÎÑ¢î1Û! íådÑVúJí²GEÝcòµC©½œ,ÚJ_©]ö¨ó²ª{›sxˆü’ª°tWsçýñ¿¿ÿõñ·‚]™…÷Û×téðq2Ÿñm†–VW©°aM/]gZ.Ê‹9 éjÓò!XÀÈQAD§ïOë `EGIÏ;M0ÆŽcà7Í8ÄœgGÒ¡Îø™¦ a¤# I§Ls0+Ê‘– 9ÁS’2¦I8xÊš$8e-"oÚA\Ô¬¡) ‰”&“¦Ly ȬrPôwÅé‡N¤Z8¾uê Ó/øíÕññCG§¡Pü㈆êPÄ46‚ÑYGxD¿›L_–0\ãx_R~ËÌ··©uþ›6}ýº¡süèì©'‰Uá¦Åê°Ä¥¯\ÖŠš–°2Uô|U¬°„Ì´²)®å+nƒ•%¦/LÍ_Í L8ŸæÁ›R¾TxÌC¦Çš }_†,¦§M³æLâ®/q³V¦É4&ŸÏ—Oƒdö)ÇÞ¤ùøhöÈqRo ûßǾEêÛ”‘gHÁ>R2b¦DÃôquðCùôû½¡ù>áã÷³ég=Ã,ð}Ùðú4Úo>8úþm›Íw_ÞÊgAœô ‡u‘|È«ãÐkËè¸l2ÖçUµk0õ:.l «Î ¾‚QW½WS*T#mfLƒ^¨g%LMYÇy¹I4ì*7i*êZˆM­iÐÁ¬‚¢©*7¯v‡†]ÕîL¡4]Š­©5 Úñ˜p3E­æÅ¶Ð°«Ø–©Ó¤+A5;¦aµÏ ~”©©3¯õƒ†]µ~L™]ˆ¦©5 lŸŸAùSÒc^j »J˜*ºFK6C/8³ê¦¢À¼ÒvU:0Iò: ¿©5 za›%æy¢5v%Z›]ÜÔš½„Îr‡M>å<Ï »òı󄩯?Ù!Àì†áØ!À—Ÿ¼7»8 Þ›"à“Â䦿£0¹©i=©³mŠ¥;êl›ÚÓzȦö·£²)¥;)ïkj4;Êûš’§“2¬¦ä°£ «©à9©*jJÃ:ªŠšJ‹“ê¦Ò©£ú£)8)fh*R:Ššo“¢s¦À¢£èœ©W6©¡f á9j¨™ºR“ZW¦®›£Ö•)“4)Ýdêo9J7™r6“;¦œ”£ÄŽ©Î2©cÊþ8*Ƙ*“Ê¦Š£²‡) 1)Taª8 U˜äýIAS<ÃQPÀä¢OòãM‘G~¼Éžä1›œ}G³I¤åšÜjGZ®IUœ¤OšTaGú¤É¼›dš”NG6 Éšdm™ EGÖ–Iø™$!™L2G’I̘$‹˜Ä(G²ˆÉ3˜ä>˜GîƒáƒO8ê&ÃÁQ7ôæ åÚðæ”k䨎ù²†>%Ì–ÃúöuJ‹#Öoo@ßn$ŠûT·ÌÄÝL§[fš '›âžŽ=Íöx“-û̾‹Ž-ûÌ6f“­ÕÌ6‚Ž­ÕÌ®\“ÂÌvoŽÂÌîI“ÌîeŽÌf@“ ŠÌ.SŽ ŠÌ¦-“d̦IŽdÌ$“}QÌæ6Ž}QÌ^“ý+Ì^-Žý+ÌÖ“íÌžŽíL‰úIÙ|³E„£l¾©¸>©oJù;ªÀ›ÊØ“jݦ2½£Z·)ô<)>m*ˆ;ŠO›‚¼“"Á¦ ¶£H°©/;©yk ;jÞš: “Ú¤¦¯£6©)k9)µiê¥:Jmšòƒ“’ˆ¦ü§£$¢©¦7©ðgÊ4:*ü™ªg“Jl¦ê £›)â5),fªÃ9 ‹™bK“P¦Ø™£”©4©gdŠR9ê™/“º3¦Æ’£îŒ)Y2)£bjá8ʨ˜Ò“r¦´‹£Ü…©”0©Þ`Jp8ª7˜ŒöI–½©(áȲ7 Ú“¤q“ùïH7‰´“ä^“ÈîHî5y¡“\U“pìÈUÅ¿qº¡Éžæ–ÃúöuJ‹£ _Î û±fÂb©Ž¤³äe9È÷X“Rœ´/g¢CÕ.K\š}ÙG»ÃƒŒ»|6‡ÇMÅ'{› ë={ãæÏ“=©Íþëž=©q/ãÉËfŸlÏ˸çìd+\³í³g+\ÜBu²³«Ùž×³³+nu9ÙÓì6ëÙwnœl(ivõl(‰;ìM6þ3›\z6þà ã&ûØ™Í=ûØáÆ^“ýÆÌÞzžýÆpŸªÉöYf4ÏöY¸ŸÐd›#³¥—g›#Üg²kÙzɳknc2Ù]Åì$äÙ]wå˜lbv|ñl‚»'L6u0˜x6uÀÍ&{˜&<{`ÑöI-y³o‚§–<Ö Ÿ”F7õí=¥Ñ±Vô¤„µ)×î)a¥'™MYmOEf,Q;©œkªD{*çbÅÕI!XSÍ×S+cN všâ´ž‚XèqRÒõÔŸÄ‚|“:¦&¦§N Ö—›”½3µ =eï°ؤ<™)Åç)O†e­&Õ¶LÉ4Oµ-,?4©Šd*€yª"a5I‘S©ÉSäÊ£Œ«µ˜²Cór- ¼œÒâ^ΠxÌ[•Oÿwüùwß}z÷ñûÝí]ß:Џ,ûÿÖ÷GÙ•˜n9Ýßúüîw¿.Ë’¿þô_í|¼Å|72ÿtüùãñç_¤ô¶Ý8oFúORf]îûo²*]BRr+ÝÖ{W.*¹Ðòq“@.–??~V}b¼Ñ–MŸŸŽ?V’¼?žd•+™´? q5B¿Ô;õK½}÷û-ÇþÍ=/ú)}&7¦|ñC•dØgÛ[ò-”nÜQ÷'sŽ×ínß?Ÿ?MIîÀç`ÇìW%Å]÷BßJ2íc Omا,­Ñ1¶‡ëÎÑÞ_'¥èx¦òø^Ò’÷;ú÷òÇ:Îëüø}€gˆnû“Û™é+ÿýþ¼|e/Þoûc`z¨›Gg9¥ÜŸ–ö^SŠ·-Ù‡÷ßëùáqQçã÷ÇOïò&HÖŸÏŠN Õxë œƒåýûÿÿZÀi“÷…—ô>³”r½šf¼y_QsFòçþdæ°¯àDF\ÍãÓò¾h.B i£Ë-e2BøÈ}þ°Ü–5\zÇh˜žt‘~z6RÑBqŸ7l„ĬSâiw¡â݈[üˆy¿G÷4±~_wdŒ}ëÖ’Û;B?âoK¶’oø±È{H¼±¯ê|UöWÂØ¹™ ÄoPã»™Ç{ggzþ|5 *æä³Î t#‹MûÝÝ_Ïìåh¡}êgS8®”ÖþÝÿ©Þ±Ÿ5žíS¥c}þóÖÞÏÓs;¬;,ä8¹ê}U_h ‡EþG xnëOü·ú§³ì¨ÄdŸú_´K’nÛ=ô4vG;Þí´êx‘÷§Äþâµ^ÿ¿V§Ë>cwê_–rÏöç0§ô,aU^ܱÜûò“våv‰À— ?~¿XDOûªîM8Xƒë~›¼w`2Z}˹LhàÛÁ:F#ù‡ãO0ædAÑßê•rÕId„¾ÕBûÉõn„’õ¶-Ù«ÜoŽ?ß~´¹†7Á~o‚+bDÊékÏÄ?vè@çb5ü©ge‚våãm÷þµ~gUîžFºOTî>È’/TRÓ+îÞÙØ»ôûþœ¸¿o¹Î¾ï̽\™w8FLJjñ¡l3ÊðtÏ·uéŠ%tjR¾ë'õk-qr¬Ôy•õ#º;yÛj$ÓÅ3 bƒg$GÏ(þ;ùçkÍ?Èó|A?ÙïÖ ô-®ãù€¼QZ(ÝâO_æ9¦¼ÙyÙT¼T HŽ Dû€ B}@¡> ‚{À¡ßPŸ7±öLŒuôS *LP{×z ¨C•P{*ŸÔ¸éõ³NŸSÅWúÒò-ÆÍô Õ¯_›)s|©>Q :}Smä6¨‹Sáu­X6Oèî\.sÔ©ê‚äê‚ØàAÉуŒ¿e€º½äy¡_uA¨ºx£º¨ûôežcº¿ øÜX¼B] HŽ Dû¨ B}Ô¡>ê‚{À¡ßuŸ7±öLŒPwôS tLu{×zºC•u{*ŸDÝu½^‰`ú¶’Òwj yŸ‰Fh«×AúÚÃm]ƒÿ‡ ½ßÕ£®Ã1¯ gD¨ÆùÓj^;b´˜Çz!ƒ R¨É+¨±ÁÓ’£§˪{?ÈóäB¿>TƒPªñFu¡úéË<Æ”ïÑç £àT£Øõ`¡ä`°P´ Õ(Ô…jêB5 yû  úkÏ·?õw(Ó…êîµ^BõX媻*ŸƒjÎÑ:È«¾þt y5’pÕ»ƒ“¬Ð½¹Í‡›Ã(™N¡þù(l¦†Eá@[GŒVóĦäp˜Qê…Qò…Qlð`ƒäèÁÆßrÂÝäy(¡_…Q¨‹ÂæFõPøùË<Ç4:ã¾(x…ÂÑ÷EÉÑ`EGÜ…ú(q_rxtÇ}_0±öLŒP8Îã¾(ÓGáøLÜw¬² püâ¸/Sš;Ì(Ôu˜Q¨9Ìõµïó–¬áP¿qÎbf~\@±£`Ûà‰£ÔŠƒ+bŒbƒ§;¸#Ææ·  8¼1Æ~}(Žˆ±¹Q](¯DŒQó9Ä‹+bŒbƒÁZÜcíCñ∣PŠ—×"ÆØoÅËkcì7‚âe1F™>/ÏDŒÇ* /_1ŽÛv½<(F¡.£Pƒb pgúÓ=ù6Ø·Û=e#iÜäeW]1"|Žãæ‰+£Ô56£ä6£Øõ㎒ƒÇÝü–klîþ Ç£ŠýºØŒB]l67ª‡ÍÏ_æ9¦ÙWFÁ lF±¥½H#;âÆ(ÔÅ^êb/ ¹4»ãÆ/˜X{&Ø;ü©À²#nܽÖKì«|`oW哨›qcêcoºŠk‘vÛLg¼ßbJFê3±,Ó{ Fòƒ±|·“»ƒÒD¡#FÑ<Ñì )£Ô¥ÙRF1߃Ïîq÷‚=-;BÆ(ÔGav„ŒŸ¿ÌsÌÈ2FÁ+&oÈ%GK&9BÆ(ÔGir„ŒQÈ=àä¿`b홡4ÍCÆ(ÓGiz&dw~N.½ÈÉ%'—<œ\òpré%N.y9¹äã䢨WF_ä¯8ÉoµÐ>§i‡—§×¾’ú¶¶së{Å—<_òP|éEŠ/ù)¾ô"Å—ü_rP|ÉCñ¥§(¾ä¡øÒ—S|ɰw«xsU?àûû}#ÓóÍÑ –Ü›÷úpaÑ ³åé":/!ôÄL"¹xºäæé’§‹bD‘^+"€PPÓ ü´_z‘öKÚ/yh¿ä¡ýÒK´ßà¥ýí7¸i¿ÁOû ÚoðÐ~ƒ‡ö^¤ý?í7¼Hû ~ÚopÐ~ƒ‡öž¢ýí7|9í7åÖߨà[#wJ·-¯¦tÐ/¯h6ËŽ™Ð{{Ðaã£aZ$†ƒ¥cðcëÜû^.^pQ‹ƒ›Z|Ôâà¦?µ8ø©ÅáEjqðP‹ƒ‡Z<Ôâðµ8ÀÛÂ5ÒƒàÒ»'ƒ?q2ŒÞ *ÒÞ *ÒÞ *Ò¿ø¢æï’éŸ7±öLŒ~ôS Lé{×zôC•é{*ŸDzZ”cÓ¿tú€)sjGµÍôÁXõNܤs«{t½÷>ÀöÞrú‹ïjϬ;6øógÃü­µì‹/Æaôþ^vôþ^vôR[öéË<ÇßS.¯Öý<¯QÁóž| £wœŠ×£Ë«x=zÇ©xýâ«X˜¿íU¼~ÞÄÚ31ÂëÑO- 2}Ðë]ë5^U¼î©|¯×æK µKÿ¨ƒ¹·‹ßt½¤`ôdôÞùÃÓÁ™õ¤$Mö+ä=ÜV#‡ß Í\ëÄo–س~+ºêÝUbí½LuW ”¼X%PìxÖÑ;wêÑ4žuþ®]õÅ×ùuu(‹Îð”Eg½Š—EçùË<§¼ \.:(x±è Ø`ìGï3uìñòºcšfc?zÝ*‹ÎðòÊ¢³Ž^·Ê¢³¾øV¸Î_<ˢ󂉵gb°è jAné#wïZ/±ÊÇ¢ÓUùä¢Ãl%B^õùÄ€ä}Ô’·lä?à/ÈKè+ÕùŠœnÌV]†åÃÌš~øßŠÙ¬Ä3ûËG/ù³¿|` ë„€ØBF9ÂB0%º !¨i!óÜàº|¼˜~¼Ž²¤ëò1ºuù¥×åãéË<§¤F^/ xµ|ô2Rg_æ×Q:hÅóQ:hÅóQ:hÅó³V×yblÅóçM¬=#<ýÔŠ ÓÇóÞµ^ãùPeÁóžÊ'ñ|½+|û}?Qæ~OFÔ>ñ+¥7$[qÒïFcs·³¯K™Ù:b6q]6SßËí£2f³^<™Ë \µuž·[aòÅÔàu”Á\ar”Á\ar”Ö[aòéË<Æls†Î7W䤮×ÇQ–eYñÒz«#ê™,Ž›#¿9Bð›#ÿb–êæŽ¿o¯…ß7wô}›ß7Gì}{&ô¾9"ïÛÞï:0>€àû2aAàs&íwgY±_Ÿ9³MÃóa VÊ&#fOp>{cóÙšÏ^]v貃C—Ÿ£ÐewÿÅ<åìñgG„?;üO_"á[ZÃåì:ö‡‹›•zsþøéÝïþ÷Ý!úyÿ›·plý²´0u°œ[¾¼É‰&%ZúÿíÝ/ïÿg×ûÿg³.k endstream endobj 344 0 obj 9157 endobj 347 0 obj <> stream xÚ¥]M¯å6rÝ÷¯x =öxn‹â‡¨IVŒíʼn;=ãè]€Ì HÈlò÷Cé‰dÕ©Y÷†o?RÅ*‰¤‹%òpyY~±üSØ^þþ×w d}üñÝšó#¾„ðÈ[|ùr&Ë!>Ü_þûß<¤Cn‰t^9J®±§ÿöî?©ô—#q TU!-LuH®«¾iv½DôË‘`zãÊõÆ•è½iF½DôË‘àzSTÓMuK§U˜:´ïù¥TÁQøËõ·? :ïJ°ä«h»ì/3GÉú÷¡•‹)éµëZ׳QXš¨®—«¾³,UÎ俜ɪˠ>sõ™«¯Å™…Ì-dnáê$ºþz±éÏR?)к`ÓvuA’v]{½è{ogOS;bÓ~uĦíêˆ$M´×‹¾wx¡hݱk{ínJšuϦ°–—•¿¯üåß=¯_’U¸_\ÉûOÓµò›ö«þš¶«~IÚuíõâÚ!à,¼ 4íWý5mWý’4Ñ^/®„vR U~×öZ¹"½r,h kù•ÃsîÌøR™Oo±IS_1¡'(týÇ›Ý^ï=Ï ˆ€oÈÀMð" ˆÎŒF2É`„¨ðÐG‰ v®ŽH3±B.{ŠÜ -ÓºjWyuGšáˆ rÙS¬à6h™Öa»Ê«SÒ jƒ\ö1¸ Z¦u[¢òµ_ªi… OqCm¿œy½QJ¯u’š<»ì(zôŒÖ(ÍF­Ó¦²Ö:ÉpĹì(†p´Lo”¦²Ö:É 6ÈeG‘„Û ez£t•W•k Û»V¢Ã1@ {w0Žõ0xz‹Mº äîdô”¦ÿ„¦°âË š@&®7Á‹t@é:3É`$ƒ‘¦"‹AØÉ`§vN’ˆ•v9s·ƒ[¡ezßm*kç$ŽØh—3w>¸ Z¦÷ݦ²vN’Am´Ë™» Ü-ÓûnWyõL-ƒ ]kÓ¡4 úAÇÚÑ jƒ\f ·AËô¾ÛU^=SËà¹i%:D£leËÐ($#4yv™7JËhÒlÔ:Ý24 ÉpĹ̅٠ez£l…dPä2ofƒ–éÒU^U®eðFiZ‰Oc(~ß.غ /Xz‹Mš ¸Cé (Mÿ MaÅ –A ×b(Ü/Òeß/X3’ÁQá`ºNìd°S;'ÉÄ ¹ÌCf…–é}wß s’ GlË|0d6h™Þw÷ :'É 6Èe>2´Lï»]åÕ3µ >6­D6Jp‰»G«ušš<¹¹ÛØ3Ú"‘f£®q‰×:ÍpÄF»¹ÛÈmÐ2}ňK¼ÖiµÑ.Gî6r´L_=ÒU^ËC´ ¾ ÄEî6r3‚=(<ŸÑðôqÛ>0æH· lO@éú@è /¼àÔ@$(ËMð" PˆÎŒF2É`¤©"þGìd°S;§gK›|àc%±’+´Lï»—8y¶ÆÉ>Vv•MXìäqµ“ÇåNž­wò•]eS >y\ùäq©“ÌÀÅO>ðéºÚ(q‡FI 4 ÉMž¬FÛ¡QZFk”f£ÖiZ QH†#6Ú²´…Ù ez£¤…dPm‰ÚÂlÐ2½QºÊ«ÊEF7Ó3x£03 4?èJ0¼`é-6i*Ц:&ˆ¡¨‚ncB·11·1¡Û˜ÐmLÂmLè6&tsº ÝÆ$ÜÆ„ncB·11·1¡Û˜ÐmLÂmLè6&ôÕ Þ(è6r3m@óƒŽDqy»I»Ò›ûs].éúŸýMÉšæ“AàRVÙH’ª®—«¾³(UÎ töª/sõÔg®¾–f2XÈÌBåhÉ@ô׋M–úi‰Î>p©«ü-éˆöz±j«e©vZ¢³\ê*¿@KRíõbÕVËRí´Dg¨ê.rH¢×ÜÖâ¬ï¼ÿýý¯×<{W$K¶˜ˆ.ž€âÏÖxí¡õïÃÊbbA©ß)Ùº‡ ±bLØ9®/¢ÁJÐÁ÷ÕO7úUˆa«?ßg;Ýø‹Ô†½¿|ãÝt' îE6lä;q¦[ƒps¢aw_š?Ý+€»• ÛøZÝéâaܾ`X?ÌïMWâzfÂB¾šgº¼8VñÏûÓõ¸âɰä€ï›~€Ä%†oüÀô‹~5|”àÁiˆ?’¢”ª‰ñ…ØœÚ Œš˜Í)§ÝêfD:gd]‚ÀhN¬„†MÄJ‚“‡³þtµ"ƒÑ3® ÁŸ2çuAÃ&^A ÂIGúîlÌW`FU"èæ´hØD+! 8çAW+2¸Ë1cJ»Çç»ÚѰiW»ØÍ·\÷½i˜®Íl£¶Ø¼:ßT‹†M›jÅ~L¾ã³«Q²~ö‰Š½só=}hØ´§OlãÎ:øc¸j³mjbëÎ|K6m)»Qø~—®Vdp—p¶KFì˜ïh@æ b1<_nßÕŠŒMr» é‹…ËóÕhØ´ Z¬Åå«}»‘á$Ì`°X79_ω†Më9ÅR@¾Ø°«  –(Še[óådhØ´œL¬DâkúGaÌ—}¶BJ¬™¯fAæÕ,b!_jÑÕŠŒU¾?ƒâ£õüc:6}Lßaù—Þ®Vd$ùþ ¾ã§´é§=4kø¶×¦!;kž^µ 2ÕòÛ#_øºyö§ÔåHˆ=äæFõ)7·à/žp*#S¸RY°ñN‚ͳ!X°¦N˜\k±ÉU€NˆI»¬˜T5N$Yª@RpNø©¥QpÄMxëG£·NPžMhØ—ž†MPSMè²5œ.K0-MØŸ…—ýI0âLXz#•¥G¼LHgstFqLÈAŽDðJL¸.a‰ëBìÿŸpþ 'ØÎ>Ùb/x [ìŶãÉVh±íß°Zì¢ììÛ³ ;{ÅnÇÉL±ÛذSlÞ›l(»B  Å&«ÉÆ/±ÉѰñKìšìc›Ñ û˜ÄÞŽÉ~±·Ê°ßDlU˜lŸ{` Û'Ä’òÉ2w±¥Ã°Ì]¬ž¬ÚKï «¶ÅJÖÉêZ±’ܰºV,Ìœ,+~ ‹EquÝx¥ŸX¾:]êצ;i šò|. §G^ááAÃsŒðÜ­é9Fx:Îð ¡EÜöZtA=¡¯TíújÁ|4aDì_F$A¦3!ø,M‚Az2!b¤C"Áá1áä0^Áµ0á\'þA0¡3œ:±Å{²í\P,¶‹Ë“]Ôb+¼aµØY:Ùí*vvv»Š’“Í›b®aó¦ØÐ6Ùd'6”6Ù‰ýY“=cbãŸaÏnµoû»Ø¦û~ÚT`'mAS ŸjÀ.¤ù)¸pŒèðPS<Šw~¨)œ“9<µÏWŸÚ‰GNNXÄ3D-,âÁ|“óÅ¡–óñµÉ¹nâ C˹nxØä˜2qÖœå˜2<·irœ”8:ÍrœC49Iqe9 ‹™œb#Nl²œbƒ§ŸLe'ëXeÁS*&‡gˆƒb,‡gà¡ “³ Ä–³ ÂÙ/Χ°pö#×û„‚^œ#`¡ GNî U¸ Å·P…#Åô„ùZЗ[˜¯‘ xÂP,ظ- ÅÈl;!ܬÉÂ]d £ ` 1*jNx>Y«…ç‰'|Œ‚{ÔÂLj<~zAÁi¡D¾µ œ <´ÐÀ!}Ø„ÕLPÓYXÍæiÂ>%˜Ö,ìSÈZ4!SŒX2%d—™Þ‚' é ’¥L8\…ÃI-&\‚WÆÂµ êÁÿa¡Ž€M÷cAf1'XaªqJû'˜A¦Ë˧ÿ;~þã݇OïÞÿà‹#üòé XÊÅ“ÏÅ»O-å—O_Þýöó²,Û·Ÿþ«]wËú(Ð'„þéøùãñóÏL¼øpqÛ…øOLhM婤ÎÏËš˜œ/ŸU¹ÀäByêsŽÃåÒiùøùùøù +“ Xì›(óñøù3“ÜŠÇç¥r&“K“'„~iUõK»vëR ½vÏ›þ‘I[Òvó L²t e•ü;*SШ¨ûIÔÁZÀvÏòùþt>—,]9®²Í>3©t, ¼Ñ÷3“ÌeJÖ§ÚÖ—>ë]0´­/#p ²>ÿ–IoÕ6®K¿ÆRC«^—?·pÞçûVx }t¸(µ¶8üûÃyûÌ^©òˆ¬òüvì™Þôn)ëÚçõ±'ùòþ[{¯›:_¿?~zWü•?_N¦ŽGWF¨ˆ÷Z P\^~,ÿÿµÂÓNë%OXÐ"ú­ÝÍW¢½£÷åý_…ä_ôÎC™éx/ÄY?>-Wi!‰ ”tóB_ù£Ìï—ÇⶃkéäƒñNÒ±vR¬×…â Ä% !Òë˜x.c[ÈB\âG8fƒ9M¬ïÅ—ñA·Î«|)®À"[HâGtëcÙ¤ä+~,´ý&kçëÖ_ù{^Fù T&ùW¨1Væ’KÒ;Ö ¢í'OósKí†U6ÖOêJ×ßâ¸üq§Þéµÿ±ÕÇÐ"ëëóÇóÚãñ¾½–ùÁ¶…ñ]¯eT_ü>j9œ^ðÞ¶Gü×öóQãöb'Éš»$á¡T÷ÐӈŃʲ[)žF*ó¨E>±k÷ÿ/Íë’ï˜[œ~_ÜA+oâ–d·->•ãŽÜ1dý^>ro®xk¼Õøþ‡E‚z*Áš»ðvüDêåv!˜5¤”ú–s¤àPYð:HÉß?«0€ Š~ÃKÿ( &„¾çBñ±º,„Úû"ÍÝoŽŸ÷¯-îáJ°Ü« C˜H[z‹ ¯™øGåz½>(³ro¾ÌôCÖïõƒTËœ0OT7dÙnTú®—ÔÞ™©ÝzB7¢âw²&\ñ/r;Qô´öžß{xä‣äÖ4«·P}úžËì¥Ì™P(’ömüù[œí»E¿ÝÚ¿2Ý $ß#‰®‰3¼2ý)ã¨&çÑKåføò-—8BIHÉJ/Wî|Ì,±RA HŽŸEye *¸íæ,¨å@¤ÔÖ^ ô=: Û^XQYBiÁí ·y¶i™WÒR÷ÃÞ  6h,5ˆêÃéÃéÙʆçMxÍÄh=j2чí^Ê: h*Ÿ‚gNâ7ÚBr˜8º,íí>‰»G@´8oX†×Äv’nN„pÆ#À¹TWÜ5¹ ^ä£ZòœAjÎ yÎ 6xßArô¾ã³ ÀY{ Ë» åtp!œ±¢Tp~ú6Ï6…‰Ð=8ƒà8ƒØ ±@rÔX ªƒ3éà<Šö4p!sƒC¹8?oÂk&Fàã³ ÀW{ Ë»åtð!|±¢Tð}ú6Ï6-¯ªÉSFÁ;ð±Ac䨱@T_ÒÁ„tð!sƒC¹ø>oÂk&Fà;zÔŠ` £ƒ¯v¯÷à;TYÁWSù$øúE~ÝApM|à ˆnÍÐ×üæÜc_w!ÞÑõó·2®‘•6¾@ŒCbï³&·‰—v]-^ðºZ½`¼b¼Û 9z·ñY@¬=彄r:ƒÄXQ*?}›g›.Æx2 Þñb'£ä¨±C<…t ^ ñd27øbŽ'¿Á„×LŒ€x™Ç“QFâå™xòXeâåWǓáâo[üà6ìa[Eɤ÷S—Ëãg)Î{–~µ‡M«j~'ÀxñS¯xušœ_ðÅ Ù?F©{0FÉ0F±û÷%ï·x–{0VÈðnb9ŒQHcQQ?›g›&cüoÀÅ•ÌñcUÁ…T0F!ŒQÈÜàÉ?~ƒ ¯™€ñðQ+¢%CüX½×[0«¼ÀXUù$GŒUX PäÏçË “„ÐÚ±ýCëé|ÝÕ¹ßs%9˜o¥7ù]ÁšôðHåâDh„] ñ¡¦tÁt€*}'ïþª@p¿?ôJ²®'»·:”슜wv‚%ºRƒ¡$˜¢Û(6@§`Žn‹g %ámÑm,§%ÁÝ¥%á-Ñí³û¡ï†ó$,Ø'aa4CjCÉh†Ô†’á ©%oœÈÃ\±%Ï›ðš‰ÑP2zÔ ' £%Ú½Þ%C•u(ÑT>9”8wï¨Õè6 ©ÑmêÑm'`{£`™í¦NÊHq|;Dñ,¿ýØ1$A&¿Ž` $_š29x¬a—·)†ì²ÊJ•ÝEίJp6¢Ú”Npbzƒ8æHB°G‚aŠ^‡‡7FÂ(Xц‡Q°¢ Ã`Ež¾Í£M=ÌOn‡¼¼yZèíÓB?š³ÕáÁæluxðÃ9Û5<ø7N-½aöz o0á5ƒáaø¨Æ¢Œ:<¨÷z;<ŒU^êò¹áád-½E>ŸÑI¡µý|‹®“{ø}•e¸PAèà…Ðno¾Š‰ QñÏ…,~‰ÊÈ–¶Ç¶8QR,~}R û»U‘ób¹Ç)„Šÿ^›Eªø’7øïÍÁ o^xCTàÂÿÆÀƒÅG*þûQ|¤â¿ÆG.üþ6Ï6µ~õ¶ï¯(ö=ùxÅ›¬tàœ…üÚ:¼Ò̇~ü–†?—(d¾ï_Ñø–ÎXº¾â²ÃžÆò Ø[¾{Ë7`ÿÆoÀÞþ Ø¿ñ°·ö†oÀÞò Ø?õ Ø[¾û_ÿ {Î×½û´ŸmC’Ølø$ë”*Ø,V‘{œéØ RlÉ;l±éë®Îl¯ûâîGùúºƒÌìuñ›×]L,ïÇ­R-¯êh‚ÛÆ¬`u|ÀÆRLJ§oóèWk^mŸ…Qðf|@±Y‡AùY‡Y·õþ#ÝÕaPfÒaP\ï0x£êø ž^PHPÈÚé°Ü`|xƒ ¯™ŒÃG½@Vôm|Pïõv|«¼ÆUåsãö5„…Bj …zëîriÄ K®8 ‰ ~êFSEN̲›ù”º…PòfB±)¨€üTJ/Û&£ÊÌ@Äo@ëó~R+ÕPN…Dk£h,mzþ6Ï~µÛ,ïF!»ŸR¢ä`J‰¢úBúBúBæ‡r£ày^31FZadô@»×û`¨²ŽšÊ'G7\{µ?‚߅ІßÃ×%!Ù]Œ=f!ùF¹r”ê¾ë£=‡+ïøt$C!u$C!˦],£nÚ v|1Е·Ïïšœ˜n­‡ì| ©Á@’wˆ p $G¸…Ï2d´²`”ÓÒ¬(uyú66uy±})GÁ›AÅîšè…ÔA…ÔA…ÔA…¬ ŠåƒÈLxÍÄ`>jE0Qõ^o‘±ÊkQU>7ˆ®¼‹h§ p.'¬`ÉonMDX¸ÊãÐ…$ïÖ̦2¼lBzÃoÞKÛú’YÑã”iÊÁy¦È‰]¼Ç 8ÿR÷è’7èb6@À{½Ggõ†-/3”SÑ…Tt¡¡óó·y¶™O¶@ Þ¡3ˆÙ éè B::ƒŽÎ>½­A}²yÞ`Âk&Fè‡Ò9ËpG”_e£;É–AúkÅèhM>¶hÅ»­´è­ª˜§M!TÈÃyþšióRõ5ÁÁkf˜^pøÆ çhZ\Áp4+®X8œ_Pøô-¾R~é‰Ñ=õ•Ägß3¢›~#î™O¤Ñ¾ŽfnÌ@é Lo› æZjìm4ÎÌéæ$ÎÀéž¡€tH÷«ik”®µðõ2#pÅ6Ò<ÎáBŒïœ i/O|^É­œ“Øó.¾<‚O(ø½x "Š|%uíñ±o»Ð%e8h_ÙØ9çx,g¸— ²vŽSû#¡öÏSQ<.?h lå1„Qi‰þ ƒ˜¯g`üüîß²_Êﶯǩ{é"+O,çi¯r$‹‰Öò{÷ËËÿ½ÿ-’(o endstream endobj 348 0 obj 8810 endobj 351 0 obj <> stream xÚ¥]ϯ57‘Ý¿¿â-€$£pÓn»ín‰Ù !a É e7Aˆ7lø÷ÇîÛ¶«NU»|!ŸÝåsúv×ñr¹YÞ—‡_·-ÿÏCzÿçOo T}÷ÍÛ¾¼ÇýáÖíýãú·OÛûßßœóÓVM{9=öóziZÿý×·¿€ýG.‡¶ºå±n¼L°¯b…CªÏZ|œÅD$Nðø‰ã'Žï· ʱ£Ÿ…†61þ(v§!¬ 9ß‘ÏB…b4—˜~”ÃÝŽ»-÷,T(FRp‰éG)pÜnÊôU®€Œª gÇqÎÏÂJ\lƒrÚšu7p¸^>Ø Ä ;~ñÂx¹!¯ Í ‚>ÛS Þ¤y"ÁLH’€$Iƒ`< xð\.I+"ai—KRXh›æ›òrNZá G»\!å mšŸvÈËQiåh—+d ´MóYùtJ¥¢ÑôŠXïBÒ‡ËÏ5Öγ˜k²rÚš55ðµÿìê» ÿô½X]“UPbP{ð¼I÷ÝŽ™$Iá¡3%< xªs’ŠHXÈåÞ Ú¦ûnƒ¬ÎI*<á —[—ÎZóÝÆQ]¯AVç$”ƒ\n»ä mºïvÈË3µŠ¸BEëë%Mq¸ã8+>j¹&+§­YS×úÝV ¾ÛðOßk€Õ5Y% ®÷»Œ‚7é¾Û1’$ I@B ö»'OuNR ¹ìX¿ËXh›î» ²:'©ð„ƒ\v¬ße´M÷ÝY“TPrÙ±~—qÐ6Ýw;äå™Z›>tT‚áh¿»fú6i-êš¼œ¶fÝ Ö>oí⻿ø^¼\“WP‚f°¶®?oÒ|—`&$I@’€¤A¬bKxð\ÎI+"ai—WÒý Ú¦ùn‡¼œ“VxÂÑ.¯½ëç?­únç¸\¯C^ÎI+(G»¼ö®_rÐ6Íw äÓ3Õ 6‰è¨ cåóÝu}¾»î‰»&+—Û¾¬»AìóÝ^ ¾ÛðOßk€Õ5Y%h‘Ìw9oÒ}·c&$I@’€¤AD1ß%< xªs’ŠHXÚåÈ络…¶é¾Û «s’ O8ÚåÈ络ƒ¶é¾Û «s’ ÊÑ.G>ßå´M÷Ýyy¦¬ˆ|ÑQFäó]ï—>ß-êš¼œ¶fM Ú|·ˆïvüâ{ðrM^A ˆAŸïr Þ¤ù.ÁLH’€$ Àù.áIÀs9'­ˆ„…\fó]ÎBÛ4ßí—sÒ O8Èe6ßå´MóÝy9'­ ä2›ïrÚ¦ù.|z¦ZÁ&•`°ù®O¡ÏwK¹&+§­YSƒ6ßíê» ÿô½X]“UPbÐ络‚7é¾Û1’$ I@B p¾KxðTç$‘°Ël¾ËYh›î» ²:'©ð„ƒ\fó]ÎAÛtßmÕ9Iå —Ù|—sÐ6Ýw;äå™Z›DtT‚Áæ»Á‘ m)P×äå´5ën@â´½@|·ãß뀗kò JÐ ™ïr Þ¤ù.ÁLH’€$IƒA[“€çrNZ K»œø|—³Ð6Íw;ä圴ÂŽv9ñù.ç mšïvÈË9iåh—ŸïrÚ¦ù.|z¦ZÁ&µa@|7Dß ‘Çwy¹ÜväñÝRnóÝ^ ¾i|·V׌<¾Û šïr Þ¤ûn„ø.¯`$ H„Œïž<Õ9#ïv–v⻜…¶é¾!¾K+<áh—!¾Ë9h›î»â»´‚r´Ëßå´M÷Ýá\¥â»µa@|w[H|·¨kòrÚš55hóÝ^ ¾Ûñ‹ïuÀË5y% }¾Ë)x“æ»3!I’$组'Ï圴"r™Íw9 mÓ|·C^ÎI+<á —Ù|—sÐ6Íw;ä圴‚rËl¾Ë9h›æ»òé™j›DtT‚Áæ»[ ñÝR`® ¾[­©A›ïöõÝ@ã»°ºfàñÝN@ ú|—Sð&ÝwÄwy#I@B p¾KxðTç 4¾ÛYÈe6ßå,´M÷Ýñ]Zá ¹Ì滜ƒ¶é¾ ¾K+(¹Ì滜ƒ¶é¾ œ«V°IDG%l¾»$¾[ Ì5ˆïVën@⻽@}÷ ñÝX]óàñÝNÐ h|—Sð&Ýwˆïò F’€¤AÈø.áIÀSó ñÝÎÒ.C|—³Ð6ÝwˆïÒ O8ÚeˆïrÚ¦ûîñ]ZA9ÚeˆïrÚ¦ûîá\µ‚M":jÀønô$¾=ïòrIÉð<¾[Êm¾Û 4©ÆÓøn¬i5žÇw;A3 ñ]NÁ›ôÌñ]^ÁH4ß%< xjЧñÝÎÒ.C|—³Ð6=ׯC|—VxÂÑ.C|—sÐ6=ïÆC|—VPŽv⻜ƒ¶é98¹JÄw;jÃP^ .B".B"[„D\„D\„D±‰¸‰¸‰lqqÅ"$â"$â"$²EHÄEHÄEH‹ˆ‹ˆk¥!!!q'A÷R`ýÅA÷jM Ú"¤X– ºwÀ–§Çƒî€ôE§àMHªÝy#I@B ¼È؃ {‡m9{4èÞYÈe¶á,´ IÞƒ ;­ð„ƒ\f‹ÎAÛD>ºÓ ÊA.³Eç mHRÄØÕ 6³ë¨ƒ-BÒrôÁ0ÎP“–²Eµl—s¹ŽƒíßÄk;rñº v¹$-Rèz¹âM)8oÐüµá%Ÿ>qøÚš1$`HŒárÄ^Œ¿^løIâÓÍG+Ü傽è z½XÑj[ŠN[4ï¬p—óõ"E¯+ZmKÑi‹æ— îésX콂v§ÜwÞËþùÓõgtÚñÑüø:/`ÚNG|zhýwaY¦R¯‡9Ò<ÕÔÌ}…tí‰ìWžh&(b6îDŽ"ÏÚ2ÓÈ0gr"“ŒçÖ˜É>˜Ù6‘ïÃ3 Ì” Ì?šÈÊàûÔæÆ9f‰LìóÝDs{÷ò'v8ùž¹ …;®ûP<2onà¾ØÄnŸš]ܽ˜ˆéò(—vÃóDäÇ"ÌàF'â#|Åh.a1^3±ŠåSHsN‹«ê‰i-ó­ÉN²Í Èùoo™W(å«ñÌÙ<`žZÀã6sç0“ÛL0Ç)ærÌ1ëÖL©ïsùÀ˜!i&nŠ4å¹ÜMÌf3“ìDJé\žf™ Q"ýo.' ³DÌ䑪5—¿‚;úf¢H«™Ë5ÀÝWsSX¤@Ìí ãN™¹'¶«çöðpWÃÜl[‹sû-6ãbh.6ŽÑB3ˆ)BösqL "˜± ^ oÀ ÐZŠ˜ËÌ¢ô*zî¼¼jtØyçÅìslIv¬clâh}ä(iÃŽuäHð‡$mØ±Ž‡ˆ”y;•?iÃŽ•Ê/Ò›í´ë¤ ;VÚµHEµSd“6ìX)²"mÐNgLÚ°c¥3Š/;õ,iÃŽ•z&Òqì4¡¤ ;VšH°S:’6ìX)b›ÛÞ~OÚ°cm¿‹-I{«4iÃŽµU*¶ìm­¤ ;Ö¶–Øá{.GTx©ŸÁNˆ^ÛQu$žŠªcÒ ˆ&mxGDkÑs_ãåU« ÃÛðÔ½8¨lžÆóÿg§ÅyR㌫8Ï=qÆUœû3Î"Šs·gÅù,ã̘89qfLœ£1Îöˆslg{Äyã †8o4qC䥹òâ\ÈD®¼È6ršEþþDN³Èó4rOEžõDî©ÈÇ3rE>ìDŽ È›2r¹DÞâD.—Èo1rnD~ÙDÎÈC0r#DÐDn„ØV7¶úE¾ÆÄV¿Øþ4¶dEúÁÄ–,îa÷ÓÄ&±¹¡V‹žú-m|ì‚í=óÃ-âûÆ77ð2ŸÜŸ!0> >2ñiq\Ü8Â.>×0q„]ë5Ž‹cõGÅñKãH¨8þ?§V¾h*Ÿ¥_R~B«þ,¿mpÞçW_¯ Aïý#+WñtçËÿ~}Þ>ã û#Ë@´`ÏŸ©¶IwKù¬} #Jñþwû!ß\7uÊï7ŸÞÒA¶>Îl_Þ]Ù)ž]ì³A+>»§oòªÓAŸË¶Ä÷T¼Ô§v7?ï{s[Öÿ*,¿×y[Ó#?paÎüødvñ±ƒÈIó˜¼0BÉ—6¿\‹K¥®­C?Œ;]ØÊÎLVæF!ûÍ&Œˆ×1ó²¢»0—ýGHùíÑ`ßóèìƒÎþ'n™'4‹|C²ÿGx,IZ>û…>C¿ÂìÍ_¿Oë#(Œ¶gW3÷0ý‘ßjÔNs‚Öç¤3šyÙ7å§Vù²8Øž]?mã÷´–;õNúßµ'ö=ïϲ«(ìöÏsÚÏã¾½æåBJÁ¸ë<ª/þ½Ùó_9¢ ÛöÿØþ(cAî•6/UÿŸ’ćò¸‡3 Ÿ'P»t+e¦òêc‘¿ØµûÿC›tIí^¿-6=Ë:LQéz–Õ±Y\výF¾ãS¹l±n·€_}½È=æQ7/t»ñ¼ç-Kiuöû_ñ.83‡–QéMƒü²ý$~aË)O;Ñ~-¶òg9ïGàïÙ7ˆ}Âî|Ù„Í— ØñŽ:w¿yŠ€æò”NP<ÏÏ OîáÒÍCýù‰Ú[~&»+l&ùå)²xÀØ%'ŸjäFñ–ôoÜæéWyx£ÊMç ã“û†ûÀ™òÚcž„ ,ÙýE¼,0ýŒÏÀ¶‡+OŒ¾äFùá”' F_øQž$M¿ph§øT{bŠÿ…Ó(~¥ «?'AßzõÉh³ò%bx¸°ë÷úk ™g°q7 óÜvI7¾ã’§wVj·ž—˜ÛO”Õí~H£ó,üÞòV<Úü_Øæ‡ƒ0ZšvÔ{ þÞ5ÛGÑõÛü™ü}ayE›Ïð•¸m0 ·]VÌ(घy'z“pÌŒR`5¥Àòn”³A§–£NË`„Ð~ÐL‡íôŒô”:B¼|›ç;ÍÝmÅ_º+ñKa#ÇùHØlóŒ@|Œ&ÈõÔG0ëf4`œ #{»Ký`¨w²H8îd‡µ“Õ _ìdË3ñs¡T·nyÅ%-•>Ë—ýŽCX>oAù©[^)Ç$ìŲkïNA¤±ÈTؤξÜ=€íà’ùOþÛݹBF£µO’ÕØkésá݈>7?«5(f~E}nÙcÙ‚CÑ'Ú}A.}AŠ>‡ —>‡ O}a.}Žaœ s§O4Tõ)‡úC^úT!_Óç–6&ßë-ïõ‰––>Ñ^Õ'iúD›)}n{†º>ÁHÑ'ΉðÝhs"·*fÞ }z¾Uõ 6RŸ#ªÏÈ©ÏHÕçäÒç¦êsãT˜[}‚¡®O¯¬úïõ9„¬úÔ _ÔçYÿ=Ð'Xô –¦>Á^×'©ú›)}:Çž¡®O0RôQŸðn}ºU3óõ¾<Òô‰6BŸCKŸC¢Ï!È¥Ï!ÈSŸC˜KŸc§ÂÜé U} ¡>Ç—>UÈ×ôö•õß÷úDË{}¢¥¥O´Wõ‰Fš>ÑfFŸõª>ÑHÑg}â»ÉÂ[pü\4³UŒŸV­ª>qe+ô9©úœúT}Ž@.}Ž`ª>‡0N…¹Õ'êúÔb÷úBV}j/êÓï“ëO´è,M}‚½®O0Rõ 6Sú„ ®OŒ}‚ø¼x7Â$=Ü¢™­rü\6sý‰6RŸ#ªÏÈ©ÏHÕçäÒç¦êsãT˜[}‚¡®O$ësYõ©A¾¦Ol“ëO´¼×'ZZúD{UŸh¤émfôéa¨ê}:Ô'¼EŸ{JŠ_É}úèÌõ'Ú}A.}AŠ>‡ —>‡ O}a.}Žaœ s§O4Tõ)‡úC^úT!_ÔgÖÈÜú-úKSŸ`¯ëŒT}‚Í”>a¨ë£RŸ+èß2¿]7Ä•ì©O·›ëO´‘úT}Ž@N}Ž@ª>G —>G0UŸC§ÂÜêÓMlb ±>ÝÄ&¶ ù¢>—4¹þDË>ÁÒÔ'Øëú#UŸ`3£Ï€ª>ÑHѧG}ºÝ\ú]1ã+Ù¢Ï5ÙûŸh#ô9¹ô9)ú‚\ú‚<õ9„¹ô9†q*Ì>ÑPÕ§ ês yéS…|MŸkœÝÿDË{}¢%Ñ癉ëñ Åœh´ßÞq˜Ø°D£‰ K|˜Ú€—Óì”·7,ÑF ÊÛ–CSPÞÞ°‚\‚òö†åÆ©0·‚ò–‚p,(?±a©B¾(¨uvÃ-‚Zo7,‚‚F÷‚Z&vÑhb‡¦"(·ÍLd]¹ÝÞaD!¨!È%¨!HÔäÔä)¨!Ì%¨1ŒSaî…†ª ÜþÊãò” ùš \šÝaDË{A¡å” °Ñ­ \œØD£‰-A|˜ÚµÍL¤Ô¸`o ¢T°·‡ § ‚½%8¹ì-Á1ŒSan&¶áXPabKP…|QP~vK-‚ò·[‚AA£{A¹‰=<4šØÃÇ©PÊ»Ör`{ ï0vð{ï0öï{ûî0wï{óî0÷îŽÉ­»cbçîxeãî˜Ø·;þßÛvûì®Ý>»i·ßîÙ-Q†4±‰–«K¢ÃÜB;ŽM± ÜïòäñÝz# ùþ–]±ò×âoßþQþ€Þ?òßt¬åñå<(-,çÑá§©b¦µý_ß~xÿߌûô4ʸ endstream endobj 352 0 obj 5686 endobj 355 0 obj <> stream xÚ­]M¯ì6rÝ¿_qN2A&mI$%j‘‘±½øåeœo y2›üýˆj’uê£Yl 0|}IÏéÖ­#•È*zùXaKéúOÚãññçß>-¢ëóOŸÎü‘ÂcÝÒÇ·ú{8ÒÇ}ZÃúH¼y¤fJíí‘ïñ2µýþ§Oÿ!ì¿]íÀ¶-?¶ÄÛ€]› NRx6ãÛÝ<0 ‚Ì 2#|7~æø™ã‡#ˆv$ô»Ñ±³Âão¥Á>i܆÷•ïFƒb4L¿•ÃMÇMàÞÅH .˜~+ Ž»§í ]Û QôËqòvOþVß7ò?ÖLè.ØÑª B{%tìÎξMsÄŽ^±£UG„6 Ó`wx…º;ÚÓÝŒ6sÏHó‰àò¥u]o€o­‘ÁéxûHÝ B»+Rü’ð‹s`u=Þ`Ðt° >¥»'`fI’I$Ä-x²à©ŽˆX`˜„¡XpNwU‚¬îˆ+pÀp¿Qó¯Öü•8ªÏduJì@î·lÍsºÛäÓ/ÍæÉ„ ï¦k\nŒ§ïÆØI´ËÇ®Öd°T µË{*áß¾×›k²$èKWË&(øò]ÂÌ’$ ’,H:ãÉ‚' žæœÐ¥/ Å‚sÈw;dsNèX£/t—ç_­ûnçh®×!›sBrôá…îõšçïdõLݱgî¨iŠÃ …¢¥{Þ>R·îûIÑ(5Ðw;þí{°¹&ë@‚fÐAïùŒ‚O!ß%Ì,I² É‚¤Apž,x²àiÎ XÚ0±dƒçïvÈæœÐ±Gî €qàòÝÙœ:£ wÈÀ8pù.AVÏ´:¸3wÔ†ÁhŠÃ'…±¥ÁBÖ>R·FƒÊR}·ãß¾×›k²$ h9ŸB¾K˜Y’dA’ @ȸx²àiÎ X`˜·œçïvÈæœÐ± ³—sàòÝÙœ:†Y Ë9pù.AVÏ´:¸3wTÀ`ñnùcõx·40$àí#uk4èñ.5Àw ¿øV×äHïr >¥û.`fI’I$!ã]àÉ‚§:'vD`aïrœÓ}— «sbÇ 0Ìâ]ÎsºïduNì@fñ.çÀ9Ýwòé™fsfB ïn,”sÍC, 4k4è÷]j ï¸ˆ@€Í5¾Œ@`@÷]NÁ§ïb-w0’,HBÞw' žæœ.) ³û.gÁ9仇XWÀŽ8`˜Ýw9Î!ß=Äêv  ³û.çÀ9仇XS0;Ø}—PƒÝwúS¼[èš¼}¤nM‰â]j€ï~ñ=¬®É; $ˆw9ŸÒ}0³$É‚$ ’‘T¼ …|÷\…k²F’I‡XT¼ ,Öw9Î!ßÝÅú.v G뻜çïîb9×ì`A¡v ±¾{,°¾{¬Ëƒ[—E³ìÃW»Ýrûïൄ\¼®U—Ä&B·á†wOEp>¡ûkÇË> øÌáÛlÆCf Õ©¿ vü¬ñqF÷ÑW]š+ ·Á†Öæ":ÎèÞÙàªóQÑÛ`Cksgt¿ìpOŸ“ÍE¬ÛvÀ6ùÎGùçÏ¿Õ_ž• G‚w²#í€Å"b>Òý×xzhû½°,S5Ãâ–.‹" 7sgûºéÇ"‡~"™§dº9¢2!z"M”'ι™|2mu"™§7¹ùV2¹p"åŠ'¡¸Y12l"1†§ ¸¹ 2Qg"}oèº;Ì2bb“™o»¹û€rÓ{b+oޏ»5rkrbÆ/a»kêribY/4º+Ÿr™bñ“/¹ëSr1vb‰Š¿´»«rÉlb!¿Z¹ïzracâuÀnD._?'‚r±x¡“|Epçû÷ îz¼Ãh×É3%u¢LÉ)š’%~3uS²ÊÄ-~‘…\så/² À­SPU9s¥ 2yÛÍ)Wsiå2ÑÖÍÿUÙîs)À2)ÒÍÕT™Éséš2ÍÍ«SY¤s©u2ÙÈÍRsiP21ÄÍWQÙYs)+rßÍ-P™4sérÃÕÝVYs[ÁrsÌݳS;ÔsÛvr#ÃÝ_Q»‰s[,rÑÙ] W;?sËárÐ]·T«ôsK—r1Ç]cR+ªsËLâMÜ[Pk_3‹µø=”·7« ãšqY‡ë•gã:. V”~ag6 ^]§ªuókð²õõjðT]’_/•­¨W/¥jHüÚ–l=@½Ú•ïï×!dëêÕ!¨Ül?g<[P/g\åÑúù½Ùz€zù½*çÑÏÅÌÖÔËÅTùi~Þ\¶ ^ÞœÊ%òsœ²õõrœTÞ‡Ÿ’­¨—¢öèýÜl=@½ÜµŸêïófëêíóª½/O.[PoONíSøû'Ùz€zû'r©Ù]úÎÖt¼öÝšßCy{³:à:<E41<óBžÏâžy¡ÎpÎ*'pLU Ê·’ru|ÂDI¹*³uJU™ûDé¯*‡tJ4U9òD‰¦*[sJéTÙèD)*/rJžTyßDÉ“*qJSTÖDiŠJ×wJT¹ÌD J«vR½UYÃDª·JuRrUúùDJ®JStR'UšðDê¤J'sRÜT:çDŠ›JûqR‘TÚÝD*’JÏpRFTzÔDʈÚFw¶öUËÄÖ¾Ü ï˪dwc¶5Þ±ø“Ql»'wÉ3†Ç1ÉãÃÜã˜Ôa5Î:òp¨‰ósÔ™"Î9'êLŸ‰sNÔÙÎyê앉ó(T¾sn€:#câÜUKíÔw«³ &ê»UÍ«S‡«jÎ'êpUm¢S/©jƒ'ê%U ™Sצj8'êÚT­S¤jí&êTM†S'¢j¢&êDTϯjW&òùU޳“w­j &ò®U.ª“«rÁ'òcUΠ“Ǩrv'òUn—“o¦r+'òÍdšÎ8eHeÀ¹9C­ð~ˆ­…?øD“´¤8›oxR <ßÒ?)PŸæœê&Ï-œ9ÔMžrå¾¥š›9|KžFä’¤›9$Ižãf£nš9ÌFžîá:¢Ø™9tDžÂà¡B™9BVË;EüêÀŠ™"~YÕì[«ƒfŠ­eõ©S« ÀgŠbe• S¼¨ ugŠe5—Sd¦ *gŠÌdÕS ¤ ßfŠdu„S´¡ ”fŠ6d»“\¯ If’ëe¶±“­þg’ Eúè8›U¥eû鬛xðÝÖAÜþt<ø–/ÿ[~üû§¾|úþÇpÝô?¾”$×åúgý(i©q{þøòíÓï¾.Ërüõ—ÿìãë²=â¡þ¾üøCùñÌ|=é8•ùÏÌhÛ¯o¥1¿.ÛÎìÂ%„lÚEfw=´Žr™„Ý~3—¿”dsöËqÎCÍù\~ü ³<ÒcœÙäK`qUF¿öKõkÿ,ìclË5!ÚW÷þÐ?1ë²¼/¾(³¼\"$}IþÅøHÜÏêlW´sfýýþáþjÜòrå´é¿ÙWfµ—Eüx¿0Ë|Å,q{ëo.Ÿ kœøÛ–§cŠú |ý³*ª:Æ×2léºB›}-épÎïÜ„ CZi1®Ú²†òßïÏø®›È%5ƒ]¼p”ܼÃvK}­Ãrž»ï¿ö/òSýP·üþðåÓyÀÖË·;çßjGìÇTß">Ž–Ÿ®k·§¯K*ßðº[¤pôOóú{§.ýoÊò¶3§˜!eÎüøf¾Â˜ vnp=ÝŽ Œ¤äËœ¿]Ëz”{p›wýŸÓŽìZÊŠy]¼‚¹´$e^ÇÌóõä‰Y™ëûG<¯k”w‡½„Ä!Úìü’/Wش迾¤u{,‡¶|Þ?¼†áÐWç/»¿r_QW4.¦0 Ï[ÍäÅ\òcÙm§³œ ßÑÎ;VL úž{]ݸé?ÖÏüVw¹þ‘ƧP>iXí«ÿ¹_1~½lƒÁî½`}=îÛÛ+Gêízª/áý9ôã´æ Ýö¯øÏýÇgãw^<»4IâøÜÃH#]TÖneDûõ޳èo¼öÏÿO=êÒ[—Õþ\<@»”xìÚm¯˜jå\ydû³|æÑÜElé%â÷?.ú¦¾_‚-,¿Ÿ—烲ùŽßxø å2 9º O=a¶³¼·80Á„)?6Ã¥!·‰×‹ÓuŸW„åÇ:zM×+hv ¯'ùr¼€ „û{ÿè?Xýz ñåÇ÷üó‡ëÖ§-o²¿â½¼¾Êòùî´P{yù‘®ç(~«¿ã6çýðF[ÿ–_›Ã')Hy¹¾^÷anSÞƒa·ŽìWΤhiFØhÍŒ@šfF ·fF M3#ª™LÓÌ&˜0/5# mÍH±f†M3䛚¹¥f„å@3Âò]Í”ÄåàiFšÙ•fÄåÒšIu †_¸5³œì¾`jFØhÍŒ@šfF ·fF M3#ª™LÓÌ&˜0/5# mÍH±f†M3ä{šIW½M=g¤åkÍHË75“®¿óá=g¤‘¡™CiF\.K3gˆ†fͤÀ–f¤Ò̤jfR43©š‚<53„©šÃæ•f¤¡©E8Ô̲jÆ„|S3—Ÿ§©çŒ´hFX¾«™¸²oekFiÍ„EjF^.+6ÛVËnÛ•f¶Í}Ÿ‘6Z3#¦™È­™HÓ̤jfÓ43„ &ÌKÍC[3’p¬™!dÓŒù¦fÖuò}FZ4#,ßÔL¯¦f¤‘¡™UiF\.K3ñˆ†fÍÄ#»ï3ÒFifR53)š‚TÍ AžšÂTÍŒa‚ óJ3ÒÐÔŒ"jf Y5cB¾§™²º=÷>#-_kFZ¾«ñ:akF¾ïiÍlR3òrYšY÷ò[”fBtßg¤Ö̤ifrkfÒ43©šÁ4Í a‚ óR3ÂÐÖŒ$kfÙ4cA¾©™-N¾ÏHËf„廚¯¶fäûžÖLPš—Ë\7[7×®h&œ«û>#m”f† U3C¢™!HÕÌä©™!LÕÌ&˜0¯4# MÍ(¡fÆU3&ä{š y™|Ÿ‘–¯5#-A3ܾxE¹2Âþ÷Üè¢_‚2º¿Üãåׯ$¦î¤‘±Ž¥îä%·Öް[v›Ò]ô÷x¤Ö]ô÷x† ·î¢¿Ç3©º‹þÏ&˜0/u'öxáXwqbÇ„|SwavGZt^îñغö¶î„‘£»mbŸHÍìÉKn®EÄݲSûD%'À{¯’6Zw‹¿O4¹u·øûDCª»Åß'Ãæ¥î–‰}"E8ÖÝ2±OdB¾§»íœÝ'’–¯u'-=ÝI{SwÒh¬»í˜Øk’F3{Mò’[º[Œ¿öe§öšJ‰÷n&m”î† UwC¢»!HÕÝä©»!LÕÝ&˜0¯t' MÝ)¡îÆUw&䛺‹³{MÒr »ør¯ÉÖ°·u'ŒÝ…‰ý*i4³_%/¹^7IsK†Î‹ØV¿JÚhÝ­þ~ÕäÖÝêïW AªîV¿j L˜—º['ö«áXwëÄ~• ù¦î–Ùý*i9ÐÝòr¿êN/ ²:àŒ«š”ÛVŸk½nÉ+`É »a§SV‘eÉ@Ú( Aª † EC*ƒ!ÈSC˜*ƒ1L0a^É@š2X­”´—2CV˜ïÉ`=öÉÇ´|-i9%9É”zû‘WÀ|äݰÓÙ åÊ{o?ÒFË`Òd0¹e0i2TŒ`š †0Á„y)ahË@Že0„l2° ß”Áõv<÷ö#-2–s2“L¨—yL„hØé„„µ”ŠyOa£e0i2Ü24Œ@ª F0MC˜`¼”0´e Ç2B6XoÊ`=&ߤå@ÂrNb’)õn ¯€%ƒ¸Zv:Çà<ÝWa¢D0‚¨A Œ ªFOŒ@ªÿA‚òÊû…éü’mèûCÀêúà{žŸóäÛ@Γ/ÂpÊíÅœæõiø* ¾¼åô9ÃLåì)Ï^ÆóD³—ï<‘îìg;O$;û¹Î³©Î3™Îo%:Ïä9ÿ?¤9Og9O'9¿ø‹9¦ÏÕ1nØ¿Fܯñ=—ðǾnÝìoÔ'yyİKÃßs›ë};I“ï4Öy}ë{©€céÒä%>⡟‰¼î5>–¥!,r™Ÿ,¯¹ Û#©¯Ë‹mãù¸žÑÒFÅ“åà¤c7ÌZø/Ÿþ§üßË>¾]?s+•ßçåœo,wÅ÷Óº˜i›ÿ§O¿~ü÷…ûÜŠX endstream endobj 356 0 obj 5916 endobj 359 0 obj <> stream xÚ•]ÍÎì¸qÝß§øv<1’IUÒ"›A<ãE€d&×36pw2F Þäõ#©É⩟.²aä›K²xN·ºŽT¤ª˜écz¤%çó?y[éão¿~šT×O?|Ú§‰òÇ×òïmÉÿýižÓ#Ë&åjŠíùN}þû¯ŸþSÙ=Ûk[æé±dÙln΋GuÁ‹_ï&! )’$ßOŸ$~ÊYµ·†^óâP]Ø`üõjˆOº®‹@^×ÔKc^ Í… ¦_¯†ÀÍ“ÄÍà–Æ¼’ L¿^ ‰»Ò‹væö¼ª ýtœyžïޝµÑ\,«6e¶nÓc§âƒ­NØð//l€Å e°A}ÎG 9…=0I“"!E‚‡)žâ’ر 3 9,8‡}³AçÄŽ<\!9pûiƒ,ŽŠÈÁÃ’ç°ÏäÓ)ÝŽy•1ær¸¼ÞOß=/²pMѾ>v±nkÑMÚô ´á߾ǀÕ5E°ÁÊwðUQÈ)Íw&iR$¤HBðâ!ÅS:6`áánç†ç4ßeÈêœÐ‘€ƒ‡×vK—_}—9ªë1duNè@^ÛÍÝràœæ» ²x¦í`šÖÁ÷zKs9ܱß_kC¸¦hSfk4H|ßåú.ã߾ǀÕ5E€Aj÷]A!§4ßm˜¤IH‘"ˆ¤ï»‡OuNèØ€†“¸ï œÓ|—!«sBGNâ¾+8pNó]†¬Î ÈÃIÜwÎi¾Û ‹gz"|h¨€‘𾻜ߙƒÖ«®)Û”Ù 8nm ð݆ù^,®); f¾ïJ 9…}0I“"!E:ˆR<Å9±cžñ¾+Ypûnƒ,Ή 8`xÆû®äÀ9ì» ²8'v  Ïxß•8‡} Ÿžévˆ ¢¡†ˆw—}kñîÕ®)Ú”Ùºäï¶ú.ã߾ǀÕ5E°A†xWRÈ)Íw&iR$¤H"›xxHñT焎 Xx8ËxW²àœæ» Y:pðp–ñ®äÀ9Íw²:'t gïJœÓ|·AÏô:DÑP#Ëx7-G‹wSš„kÊöiU­Ùàls¼Ûà» ÿò½X\Sv A5`Ð{¾ SØw“4 )R$Bòâ!ÅSœ;6`©Ã…œÃ¾Û ‹sbGŽ:Ì@pàöÝYœ;£3d8‡} Ÿži;Mëñ®¤¹ŽR‹w¯†pMѦÌÖhÀñnk ï2þí{ X]St ´xWRÈ)Íw&iR$¤HBÇ»ÀCЧ:'tlÀÃ"Þ•,8§ù.CV焎0,â]Ésšï2duNè@ñ®äÀ9ÍwdñL¯C 0D¼»Î°I{5Ð5e›2[£Ç»­¾Ûð/ßk€Å5e€A‹w%…œÂ¾ ˜¤IH‘"ï)žâœØ± ‹xW²àöÝYœ;pÀ°ˆw%ÎaßmÅ9±9`XÄ»’ç°ïäÓ3ÝD4TÀñîºní¾{5ð¾+Û”Ù ø¾Û軌ûV×Hí¾+)䔿» “4 )R$¡ï»ÀCЧ:'tlÀÃâ¾+YpNó]†¬Î  8`XÜw%Îi¾ËÕ9¡9`XÜw%Îi¾Û ‹gzÒ™×MÞw%Íåp”[¼»’\ŠÉöõ±)Kç>Ûï¶ú.ãß¾Gj)&;€ 2Ä»’BNi¾Kj)&; )†È&ÞR<Õ9¡cÎ2Þ•,8§ù.©Åv$ààá,ã]Ésšï’ZŒarðp–ñ®äÀ9ÍwI­ÄœŽ¬œ™Q#Ëx7O¹í3\ d›2[7ƒµí3´ønÿ|¯×”HÀ+ì3H 9…}0I“"!E«ÙgR<Å9±c^å>ƒdÁ9ì» ²8'v$ààáUî3HœÃ¾Û ‹sbrðð*÷$Îaßȧgº™*c¬rŸ!§µÅ»WCÙ¦ÌÖhÀñnk ï2þí{i•!ì@0hñ®¤Sšï¦U†²C"ï)žêœÐ± ‹xW²àœæ»i•Av$à€aïJœÓ|7­2(Àä€aïJœÓ|·AÏô:¤33*`ˆx7o°Ïp50$mÊlï¶úî†û °ºæ&÷´xWRÈ)Íw7µÏ ; )€Ðñ.ðâ©Î¹á>CcaïJœÓ|wSû Ø‘€†E¼+9pNóÝMí3`rÀ°ˆw%Îi¾»©m·C:ó¦ö$ÍåpÇÒâÝ|$ˆöõ±‹u3XZ¼Û軌ûV×HÀ Ä»’BNi¾Û0I“"!E‹‰w‡OuNèØ€…‡ïJœÓ|—!«sBG^d¼+9pNó]†¬Î ÈÁËŒw%Îi¾Û ‹gÚŽE9ó±ÈxWÒ\ ˆËÒâÝ«!lSfëf0·x·50™‘ñïlÆE½ò•HÀ3Ä»’BNi‹zå+; )†˜M¼ <¤xjj#tlÀÂóŒw% Îi9Ž‹zé‹ 8xx–ñ®äÀ9-ßqQ/}±9xx–ñ®äÀ9-÷qQo|ÝáÌ •1fïny†$ܳ!²pE›2[£AËÃåú.ã߾ǀÕ5E€A‹w%…œÒ|·a’&!EBŠ LRnã!ÅS:6`aïJœÓ|—!«sBGñ®äÀ9Íw²:'t  ‹xWràœæ» ²x¦×!9Ï2Þ•4—ÃíS‹w¯†²M™­Ñ€ãÝÖ@ßeüÛ÷öI†² À Å»’BNi¾»O2$‚„ @èxxHñT焎 X`XÄ»’ç4ßÝ'`Gñ®äÀ9Íw÷IØ0,â]Ésšï6Èâ™^‡tfF ïÒù t;CuLlÕ’‡Ïv½åò¿Ákòåu¬¸$6ºW¼{*‚Ë ì¯ŒGž§›“ÊS`À:]øÎÇõ¿¿ýZþñ¬Ï!Ì1§óò5,ÙPÀ”oG|zhý÷Å2 U…%<²¢[š¡ª‰Š3dºz7^‹ ¤Ðˤân–³NéHt–©ŸÝ\Tx=Ž*ôºƒ:=v iP¦Quóºtã@j—LvéfßèT³™’Ð͑РAiòÅq÷M¶NÛx™-_ïuß7ê—ë¯åK˜î[!ý tàÅÜ*ïîÝëUÛ÷rC³»Ãª_' l²Êm§î>˜ÞôØ “›ÝÝ ½57°a!—pÝ5¥Þ@XVÊ@»ùëeî@ð/"£^ˆ¦—"Ý0íþw:ä’N»L)PÕ5~ÝÒC]3;V|¨Ë±ºUb¦&r¬PL—Ît+zLýÚXQ.sèV_˜Z£± ’ÞÍ”7u!cÉò:}¸›ÕlrøÇ›uªg7Õä[%¡ê´¼n¶ ÉKÔ)TÝÌ.“Ç8–Ü¥Ó]ºY8&çl,G§&t3&L~ÐXÒ„~Ü}»mr9Æ^pëW~Ý7‘æ½ûØËHýz¦ûÖȼ#{q¤·Ò»;üæ}ÖØ&¿ÞöìîÆšwc²z‹ª»sfö‰Ç6ÏÔþBo»Ãìèly”&?Œ‹½h/^>®ãóL±|¿ˆŸœÇu¯†ßÔ5÷ë­É{\÷ê­M j¿6–¼Çu¯6ÖÔ öëÉ{\÷êMmW¿æŒ¼Çu¯æÌÔáôëƒÈ{\÷êƒLÍD¿–ƒ¼Çu¯–Ãä·÷óîÉ{\÷òîM.r?Gš¼Çu/GÚäöóYÉ{\÷òYMŽ_?÷¼Çu/÷ÐäcõóÄÈ{\÷òÄLîL?§‡¼Çu/§Çä9ôó/È{\÷ò/Ì;éþ»rò×½wåæýaÿ½&yëÞ{Mó®§ÿмÇuï”Þ®ï¾> ïq¿?¨Íö4&õ¸&ý¸&ó¸P2§ÎtNÂч9 „céXbç8°ÄâÐ9X¢2p°„)¶ï`»8ÀEw µÍ¡…Ú¦xµSPkŠÇ jM‘a§ðÑù>šb°Nš)Æ(P3E;B"S47PHdŠ+:¦¸i àÃ$ÁwóMÊ@b¾IVî$P›bj“TÚIt5I݉®&ù¯“h’oM’V'qÌ$I$Ž™dšN‚IfHð1ID “t4ˆ¡ß\ÇoÑMjH÷5zmò3ô¶†V–Ï`õR¿{š 9t­sœ>Õpà8s6Vç¼.s6ÝÀy]æ £Î¹Jæ ±s•ÌY3óoÌYOçߘ3A:甘3yÎ)1g7tΓ0g§ œ'ajì;uÿ挋ºS Ý©Ï6g Ôg›šÕN­©¨£5µ…zGSÛ;PïhjÀ:ui¦s .ÍÔêtê‡L­Ü@ý©©èÔy˜š¦:“ûÞÉÇ7µ'ùø&G¹“7mjò¦M.i'¿Õärä·šœ¿N¢É¹ÈCÔé[q*™ÉŒìæ’Õ&?Cokh-ò«2ÛúëêG;ç ê~GŽAÕçBvŽ«4G³ŽW©Ïïë+hŽÐ9VPŸ³Ö9þÍu8rü›>«sL—9’nä˜.}nQç8%stØÈqJú|™Î±7戧‘coô9 ãIÌQ<#Ç“èó:ÇH˜#SFŽ‘Ðuõrs´ÅH¹¿®î”e›#Fʲuj§|֔ДÏêzÂN™£)é)sÔu_r4Sz9Rަës:eC¦Dn¤lH×QtÊ;L)ÓHy‡Îwï¤á›’“‘4|•ÀçS›Â€~Bõ¤±·5´Ô#V¥w?3?ÿßõç?>}÷ùÓ·ß_ÃÏWšõtþoþ¸£OµÒ¶|þúé›/Ó4Ñßþ¯6¾>VÚÍ?_þpýùW´>ŽG¦ÃXÿmæi?¿“…ü2-›°›O‡Ú]»UØNA×ERvÛÍ|ýùñú󳘳ž2>ÈÌùéúó'a™ÏÛe²àÂæÒô:£_øJýŸE~Œ}Ðê_ÜûCÿ€Ö÷Kû^|QayŠ3e{Iþ"¶Gvàþh®Á’òãØí÷û—û« Ëõ¼+äÅþf_„U¾^€¼ÀûQXnçl]Þúm—ÓeÓ¼ü¶ËA¼Ú+ðå´J—¦(¾–i¢ó -þµü‘=àþœß~¿( ¦”§rOŸÓõßïï/øÖýqÊÀÌ/Ý以½Öi[ÇfÅûgþ"?”uËïŸ?ѯ­¾Þ5ònT:Öz_NX1xž>~8ÿï×zs:ðºäiû ËKñ§ùù½óœOý/Æògß™órFT)sáÇ7ó¼=&0Ø$éùL dŒ´ä¯9ÿ8=¦™®;p}ÆG†_:Ýš¯7~d¬þ"ÖÓo²1¯æÛ¹ÄXwcnï+×hß:ìûù L«Ïþ'iy<Òd!{ÿXõ1‘µ|Þ?&¼†)ÆìïØ_¢å±:Såç­fìb¦ãüU7ßé<'à{ÝyÒjZ²÷¦óꮋý±$عØ"Êñï´\Ÿ4ÍþÕÿ‰¯ØÏò~vºŠÃÞÿz³÷õ¤o/ç „hí|êó©>¥#ú9ì¿ä +ÝòWüwþã< λRNVõ¿Èd{8—;Œ4Îð~Ý­[9‘Æz.6&ûgþüÿÆA—ÕØžü%³S‡´9·ži™Ew=vÿƒü$C¹ÓbÉ/¿ý~²wôí|ê.;ÀÊûêµ<26¿7‰µ²æ>ÈuûAÒ¶uAžba–;ØïÀÌ.ÌõgqÜOJ›å\Þ7yCxýùΆ®çÃzÛ;çc|¢©á>•Îý;ï£ïçâ·×ŸoåçÏç}ÏZÞd¿“Î+{ËçGøŽŸI‡óǪëI{qÛÌsõr䘾_¦$.ÔÍßo=;f·Îg1Þf\(+‚¤Š ¹ETD ELA3»0/E  }hÂX!dù¦NÄ»e eˆ@Yމ@MrE@ZêœØyfɈ íB„®”AREÜ"ˆ@ª""‚¦Š „™]˜—"P†¾4a,‚²ŠÀƒ|SË.n’”e e9&5©Š`C¬Zêx"8²g¶L‡Œ²<(+‚¤Š ¹ETD ELA3»0/E  }hÂX!dùžòqˆ›äkhË×"ЖC"Г\d-uô-þ ‡î7ÔÆl1O‚|ºEoM mŒB"‚äARD‚> stream xÚ•]Y&·u}ï_Ѳl#ãw²ŒäE™Mñ8ã5²1/A H Ü^dFþ½Éª"y·äA=MÖá¹µÜ{ŠËeµzT›5Þç|pññÇï©zÿêaO:ùMÿøt–ÿÓƒ¶zó¸} — GÃòËÿC¡O¹Ât"cRù•!o-;j£PcðÓQŽ,òDÈS'‡†îD¸æ¶Ñ’²ÌgÉ…âžJ ¡ ±º ëYrˆ¿pBÔS)!No0§7ó,9Ä^8!ê©”0gðr¹ÑÖ ‡læìåf‡êc¥bw2\޾¡!À€«õYÎÖù‹³uÂËÛp4ö:CLà&Íég¢F1’ˆ@ì$b';— ¬€Ã¶³Û4wì”—? l€Ã¶ž¾´êžÝÆåžòòOXm€Ã¶ž·Û4w”§;ŠÁ [Ï‚›)ÍQñT È5Q9ú††€3B®Ögúnã?|¯V×DÐTM6ÄnÒ}·s&j$#‰ÀN"v±ST8`îJͬÀ6ÝweuNP¡ p¸i6¾´æ»ÍFu½FYT@àpSpn¶é¾Û)/Ï”*l$MÔ¹™ìpV‡þn/蚸}Cw€¿¢çh] Àw;ñ½Nx¹&®€À7é7ÄnÒ|p&j$#‰iÈN"v±s9'¬pÀJ;ìü3+°MóÝNy9'¬ÐÀF;ì»ôãK«¾Ûm\®×)/ç„ÐF;ì»ôs°Mó]@yz¦X: µq@3Åáü~Tœ¾›orMT.§}¡ —CÕÝ^€¾Ûøßk„Õ5Q4PôhLà&Ýw;g¢F1’ˆ‘Jí$b';Õ9A…Vêán% V`›î»²:'¨ÐÀF=Ü(+²Ûtßm”Õ9A´Q7ÊJ€lÀ6Ýw;å噬¢›éê.6“Î)Ûû»¥]—£ohhýÝ^¾Ûù‹ïuÂË5q4½¿‹Mà&Íwg¢F1’ˆ@Aû»ÀN"v.ç„X‡Q[mšïvÊË9a…6ÀaÔßÅ6`›æ»òrNXm€Ã¨¿‹mÀ6Íwåé™bêDtVÀú»ÎÅÞß-䚨}CC@ëïöôÝÆø^#¬®‰* èý]l7é¾Û95’ˆ‘DŒ Úßv±ST8`Fý]l¶é¾Û(«s‚ l€Ã¨¿‹mÀ6ÝweuNPm€Ã¨¿‹mÀ6Ýw;åå™RêDtVÀú»n×½¿[ È5Q9ú†îÕû»½}·ñ¾×«k¢ h èïb¸I÷ÝΙ¨‘DŒ$b¤Q(Ößv±ST8`¥V¸¿‹­À6ÝweuNP¡vXáþ.¶Ûtßm”Õ9A´Ñ+ÜßÅ6`›î»òòL©u":kãP¸¿ë­ëý]o=rM\޾¡;Àõþn/ßíüÅ÷:á嚸hú»ØnÒ|p&j$#‰iŽõwDì\Î +°Ò;ÜßÅV`›æ»òrNX¡vØáþ.¶Û4ßí”—s h£v¸¿‹mÀ6Íwåé™B…ÈÎÚ8îïúæwK¹f$ó» ­¿Û Ðw#œßí„Õ5#žßí ÷w± ܤûn$ó»¸IÄ  ý]`';Õ9#œßíVÀaÔßÅV`›î»‘Ìï l€Ã¨¿‹mÀ6Ýw#™ß…Ð8Œú»ØlÓ}7’é\±u":+à@ýÝ`Àün)@×ÄåèZ·€ïvþâ{ðrM\ @ïïb¸Ió]À™¨‘DŒ$bPÐþ.°“ˆË9a…VÀaÔßÅV`›æ»òrNX¡ põw± ئùn§¼œV@à0êïb°Mó]@yz¦X:p þn`~·k2¿[Ñæw{ún€ó»°ºfÀó»Ý@Àù]l7é¾Èü.®@F1Ò(øü.°“ˆêœÎïv+í0™ßÅV`›î»Ìï l´Ãd~Û€mºï2¿ + v˜Ìïb°M÷Ý@¦sŠԉ謃ÌïFæw£V[wLXʈŠl‡s¹Jnûxmg.^WÉ.—„EH]W¾£)$Ç š¿6¾„é¡O˜¾¶F±…Ë{Ñþz°ñ'Î[4­t— ö¢ìõ`e«m!;lѼ³Ò]Î׋½¬lµ-d‡-š_6ºÓçhQ‘yÛFX›#ßy,ÿýøýõË™=“E.sôÇÓ8=´þ^¬¨¥¬œq NQ˜æLLž…¬ ¼Ž<]ئY kÛxµoºüH×ÚV ñšÌt‘ˆ®ˆ.¬á™óéT>]·Z˜ÍÇó›Ó Wºº°0çŠg¡¦Óbtxaf ÏL'/èLÝÂüÑM‡˜t>ea”‰ûÝÓõ.ŒpïhÚ]£c“…zÍÞ«´ÿ8}·¿Ûß!\!”¯ÆK™}4cjšÈE ×R¹hrË4ç†e˜­¥ÝÐD„i~ËZK‘ ‹ÆÓµl–¹±¶œMø¦ëŽl•}mé‘.ÆL׈؊èÚ28ŸÎç³Õ«µ)}:É9{e+ kÓ¯tBj:OÆf…צÊèäÁtNƒÍà­MkÐÞtüÉf[Ö† ¤—>4°qñÊÀá*6u¼ð¨l¤ ¨Ÿ“ìe– :ÏQM‚~ÎRTYÚÞ<0Iú9K'd)VóÔ¯$éç,õ‹¥ÃÌÓt’¤Ÿ³4–º0O©H’~ÎR*Ø2ó|ù;Iú9[þfK‚ó¥Ê$éçl©’-ßÌ—•’¤Ÿ³e%6Õ>_H’~Ζشè|º6Iú9›®eSXó©µ$éçljÎBLgE’¤Ÿãi‘Zìò˜ˆ~&ªŸ‰éçx—ËrŸdÞÓ½" ‰÷,y’ Í6,$H³¤ÑI"+KÚ^HdeÉ}“„C–\»pÈ’°&‰a, r!1Œ%ËLxX²ÚBKj˜$Z°¤¢…D ¶øI´g›JVíiæñ$!š%ÿ¯$DÓ ÑIâ*KÒ^I\¥™|“C–L»’`H3®&‰`,éq%ŒfÆLvXrÚJÂÍ`˜$V°$¢•Ä ²$=^!g©ó%rC´ð@ƒÑB²`®]øGùñß_~xøâ¥}ÔúñCY8Wù?ýX–º]ØbHž~ñI)ùáÿÚq­Ìæ"=/?^”o\ÇÍÇÁ_#)JÊ9?)Îæ@H"Î!œËW]nÁ…Ãrùñ®üøµ ÙqöÈÚ¼/?~ÑoÁrr„I9Àœf íV}lç‚NèÜÀÉw÷8éW]¦C¼q¡™]Âz~Kþ€@Îm^ {ÍîñvÛ¿¾7Ç¥adveoø3û„P¡ÌþÜà{‡ImÁ™»ž­Í>kµ[x¶åí迟~P%ªâø^Zãó2ò½|×<à8Ï/^…ÖëÍ+á®)mË¿/ÓGö²ˆä0`-Ðͳ±,éFÙ-ù½¶Él{àÁûm»W×Iá÷âÃÃÁœÝÓ‘Gƒõèªpõýs6pðu¤_åÿ¿¯ò´ÃûâËfµð6¶³ùŒ=ooóh؆üFvfïüf­epäLJåÜQ0 ¿Ý¢e ò¥Í¯Ô¦t,\[»À/ ; eº32ò:—;s^y^‡à¹ k]bp®nÏ÷(…‰õ=÷û¬“­ã[®r·Iñ'ÄõÃk³©È‘§~(xmäwçóæ¯8Îs¯Ë 7“€ì)5‹7S¥MÙé$'hжi¤™åš›ï®3üa½ÆR—]?úñs²åL­–ïþûvǰ†f¬¬Ï/ÏJ—‡}Ûä¾bŒn|Ö&¿Õ•ÝGƒ¿N¯·í¿n?Þ ï¸=Û < q—ÄmÂíö4|îA%îVBO#ä1ŽâW¬Ûùÿ®õºxŒi¥åó´‰1p·Í}*;rå]äsy{s¹aüMÆ/^*.ê!¿L´XÏËûa>Ãò8!qqNRdHb“›’œñ<¤1{·Lh¬HS~Á)c\8egË/yïÕç!hšPæ7¹Š7(mç=ƒ½ú—Ò©ç·P?+?¾Àço³ôqäaìçøÔËðmgÈóŽSzv\K+þ ÷ÛKX³æøÒóÞý.Ÿ?N鿥æ÷3¼[ÿ†1ûñR¢ ÓîÞ§+¬¢NCÆà!‘*cV+áíæ„Ü¹G!.Å"ÁðX‘ÔX‘±8"©±8"¹bqDScqHcEš›±H€r,RƒãXRÖX”(ïŒÅiðe7ˆE‚Ä"AÞ‹¤¹‹ÒÙLb±$hÙY,‹šÅ"y R,*%œf±¨v¤1b, ÅIÅÉ‹#’‹#’+G45‡4V¤¹‹(Ç"58ŽÅ!eE‰ò¾Xô¹Ão–Þ‹y;)òÎX¤ÍÅXÏf‹>óÇÙ{‘‚„X4,Écà±ès·V‚Š>àq€ŠÃBqHr…⤄âä Å!ÉŠCš+Ç4V¤¹Š(†"38 Å1åŠ"塘ÃÇ/½)rŠyo(’ær(Jg3 E§ÑÝ’C‘€„P´4éc^‹F gY,3.R ÅIÅÉ‹#’‹#’+G45‡4V¤¹‹(Ç"58ŽÅ!eE‰òÎXÔzq¸H‘ƒX$H‹ØCöÿ=2<¾Ö¶½Ü>úugö·.ΑñY ÑçÃ$~š^mÊY†$ ìœI3¾•>_‹1 ô¯íþ`}ÈQSô¹>»¢Ä5$}°ÚLqE\LÓ!,Å0}’\ú0$)ú0$¹ôaHrêÃæÒ‡1inéŠúÀ õaLyéƒHyŸ>”…’µ!,EÞÖŠœéÅ‹ú@AKú@ÆŒ¢>Ì@RÖ’õ€fú@§3¸>xªÔ5¸†ä¾ŽÎÖ™NX7^S ׉IՉɡ#’ª#’K'F4U'†4V¤¹©(ë58Ö‰!eÕ ‰òN0nqxM‘ È©N¼¬´¤d@+êÁ t‚ e Y'h¦tª…ëD`:A\ã¦Np¾./>Ø)_Ñ»ëéÜÅ0’\:2$):2$¹tdHrêÈæÒ‘1inéŠ: udLyéˆHyŸŽØ¤ç(ò¶ŽPäLG(^Ô ZÑ)/—ŽPÌm¡HQG(HÔ šè… :©ŽP׸¥#ŽéH QÂy¦#n¾ N1\GÜ||Hr舛/ƒI.qóeð1inêˆ[XgÇ:â–ÁEÊ;uÄ®.ƒSä@Gl¸k^ƒâe! %!ƒvQGf #)ëÉ:B@31÷/ÍS׸©#Çt$E˜Ž¨ù>ÅpQó%ü!É¡#j¾„?$¹tDÍ—ðÇ4V¤¹©#ja ŸëˆZXÂ)ïÓ³¯.áSäm¡È™ŽP¼¨#´¢#† î%¡˜Û:B‘¢ŽP¨#4Ñ _I+ ®qSG8ŽéÈ.„7í)9³ùŠa:2$¹tdHRtdHréÈäÔ‘!Í¥#c+ÒÜÒ u„êȘòÒ‘òNq«é9зß5?Bñ²ŽÐ’ŽA½¨#3Ђ”u„€d! ™ŽØûS"¨kÜÒÇuÄ0žQhôÛs+Œtm5ÃÍ7¯x³%ͯ ï4ñi‹Ú0Ðè&W2½Á °Ç/ä¿5ÙŒæÏoñIeóçì™ì>Ÿ=?±·m+Ù\và14Þl«s<«4¾kFÇÍ%Ë@_áÅåK´3|‹_gi Šsò}ª¥³VöQ$Þä›u>*î'<èLÐ[ˆqrÅ!nIùNg_Uœ6æèø³Á;ÛR¶­¼Lûœ?œ2Ü5þšmë.ûó\àÖ?c/kòçöŒoßËýänNNÆ÷ñ9ŸRÅï®›ð£o(øå 4ù…‹_`  Ið×çk¸’úÆù>oßÉñ¬³'ÅÏö=‹WO×ëÀ/’Ä£oEc¦ÐÖ<ÞŒ-ßÓà§÷ ƒì,¿øoê&ù²ì¸¥|»¯?,œß¶lŽ/¯3Ãʶ—óOk¯?‰]¿þËNÎ=ÔžœmxüîûŸmk¿_|ZÝܧó÷öe”³¡Pá6\¶ý¯öÂl“¿1ù,vw8º¦Ý¿ŸßødFù´EA‰_;6;®e ¬ú.äî°g 7­òo“~G;Å´åÜß³€ÝTÒð=c[¤žŸwÒc<È/õ™¸ù¶Þì”{IÚ Þ Å«ÓNqÇöïoñM4Y)l´Æ/úÜÑ M^ñY-M ün æøòÁ¡ž_ì&RÜ ú…“ǃC>X’âñ2í2É®||Ä€ Ÿøᥞ/˜ã3úu—ØõⷨɽžüÝ[›õÌ'v­ÏÛÞr|å{X–]ÆyÏað·JŠ<Ø8>³Ò±S óŸã·ÀïTßhkì—ÿ¯×ýßÿËŸúñ/úðÿýîÕw?åáî/‡aÜö.éž¾TC¾†P2žòg*Êylù Íû"¥ÃìÌ.Òòîš ûñ‘‚Æ‚s¸ç—Áç˜{ÁfgWM0î˜àÞ™T¾Ÿ¢ÙµÒ.´ ì~|¤³o†ßaá‹9*‡ðn‡­.ë½òã"Ê¡,Ÿ/Kì!½¥A«ãù†mÑ]È^³Íñs˜Çczì´%î­ßE2aìPþx#ü]{«ñ1µM¹‹Ã«Ù^&9íøç€öièŠe°Û°)N—µvæpÿÁG»Eøó8e/1÷pl0¿eõ¾Ò•Ï›éwe^Q=ÜùÜgS îÊçPö±‡»rP=Ü•9YÃyØ{ØÅl{ÅoñŒò°–»ùk&gå3‹!ìØqÙÅÎ ç3|,|¬¼JÜ9G$N—WIù\Á°WI(Œðœ2¿^’ ðrÈ]²äíKqV%w5) vÌÏÇÊçH&\Â1á@€ï雦̚ žˆ*³°žñàû‘}A•`rRS:Ïì!I³:ûÑ-=)«Â¶+vâXßÔž_~xl_±ûM^CYÍcZ|Ô6{5ì"¹ºÙ<œå«Ìˆ?*•mÇ7—®µºŒÍþùÓ‘¾x—_•â¤õУK*}™¢%˜¡º,T·¯êVä=”Õ OÎG9®Lòå;N€Ï0&K¥§>â-_§ÛuAÌÅ¿ ¨Üæ"c lëué±: ¼1Œõ&‹€c´ø“w¶¼](ë.÷³Š¢ KðËC,Ã-Ø‹ïþVæŸòϸ›2#³»2#ƒ ꘋ9q  Akû>>þ9óþù´—v endstream endobj 364 0 obj 6207 endobj 368 0 obj <> stream xÚµ]Ûn]Éq}×WðA±<ˆ°Ý÷‹ßÆàP☈DR%EÀÀÈÈ—`ì$A¾,¿—ª}DêôZµ{ÙðÃpFšÅ¾TU×­«k»³7ÿóĽù7ùá–r–å’êÙÏ ¿ºyñä7ožüêÂùtöæ÷Oü™ ÎüY,g5¥¥•xöæÏO~ùÑ9÷\\óæßA©,±2ðý1&‡%‡H˜—¦/5x s•º8_ sŒ©n =æfÀ´Å˜»cL KOA=-¡æÙ1Ä»¸´D˜sZ¸÷yñÆŒç(Ô%7ååfƒÞúã–¨ás]ºãm¼ÕW¼N¡p eNa/$h ±çÂ_ ²¸RæÂã{”éxÇo´ ¶?ìæÎj(KI_uà}ZrM„8Ѱµæ;ýñŠèÚR[%øG AL›8wöBþùѲ-µ%yÞÈ &MmÔ2!ߎ ¶øìç,ñµ.­ñÂ^= ò8f“³”˜'÷(Y¹æ²õ¾Æ\c‚9NÆWøj€·T^ÛéÄúâM, Â|çôrÉ.j Ð80?¹<'ZHu_ÖBN‹gÌ݈‘ ƒF-JYZ¨¶¬±¢ ¢v\¯sY Ý/-†åuUÙLU[ÏF—hnCÏÆŸvˆ…ûÆÎ‡UÆ(…="Æä…g{C ÷培Åìç¼} ™±±'ަ⋩çÛ8gOõGª3ËûsRÉù%$ûT^Ó ’òÄàø½þø-Q"EqXz·Oñ@Ø$'Æ bªBRê²îÝãb/FϬˆ ööbeª_j©sQKJýÎ4½fšŠbm5ZFÌŒØ).é¯.¢a¶]šíTaοØåÁ€wQìÐd¶Cæ!ÙlËÔþœÈO—]"ŽÝjÅ7ò£%ùª*½¸‡G¾Œ¶Lüpï~Ã΂œIQW¼Ÿ£½•³c¬ñÙ—ƒnxjET&œG[–³½/V¬Áwq`yÌ Å¢+Ÿ@† îPŒi‡ AŽeˆ<=«¥ d …Åäù£¢n îFAß½y"§ ‰+¢Wþ|øƒ"?=ɲ\±ßÆ_àGáW÷§Ãï?üáO~¯QšÐ'äÃèúqÕú³‚¿üE•suùá?ÆíMÔÂçq«s_~gøÃìè/êaÊuŒÏÿ­c>8ÃkðÏú±®P& ñŠDA¬Ú š/Ic‰b ¿A¢ Z'x,~IÝèêQtïÿxC§¾ñŠY5ˆmSóŠÀ÷˜Š‹Ž˜-Űú¦„6ô‚W:1ôBð d›ø_ôÂè»'‘ÑF¿ÂgÈ縺 D§‡Pσ"®~¬Ú&Ês@äWèþÑþÞ¡Jˆº€³­ ý$¥•50{¡J€+Vá£K-{$Ð³Ñ WÆXâHõ£\'Gqѹ¥ô1AhÈSž?žˆWDŸè›ÈEáßAWY#…*.F؉¼´À¤»!mE Zå9¯FY,n(öŽGÚˆÄ$c †,FĤþ0‚„lÆÄW_dk€‹/¹Ÿ*…QâKÀ¾gÏRX.D äû$G¹§ùLÞ-Ý`ߘŒi§›@£¯-êÉ·½éB^jËsiI}5èÑo–Ø;:æ×;#½™øp_ð겺Ë<ñƒ‡ý«‹<êÁ6Îÿß¿{ùŸºüñçË¿üþ?^|úëÇ_~üfª>ÅòµwÔ'€Lõ ˜=õ ð‰ú´ž¨O€Ûê@¶úœ’æA}èé*Kï ‚LƒÐ/&2ëB® ÿµjË~c¸ ›ÈO™¯3ª#%!‚Œá4ý Î Ñ †N-FÛyo—#H6ƒ}crEü×ÔâÎŽ[W‹§™²æ§™vãÂEVó ÛGÎ\ BÌǼ⼗%L5µ¯rÔy¸qÎ dëÁæÇ¨Ë$~•Nؔʬ8G…Œ“4ªcq «K{ *#Uæ¼™? ¹ïM mvͦÈý˜?ɦ2` ŸšX±ÄGc°ðiµÁÍf?[øìêš~žRùAÝËI(€ç†–ŽKžàœ_ÒÈIÓ ˆë,Š+½s‡ãŠDþµÑï€>… q$€F}^åª:PF¥¯itMÍîÁÌî·?úÝËO¿ûñÓϧ_ß'Æ#Q‰@/ŒæRƒ§ÈðsÎó ƒyPE #ù¤ ÙŠo„„ì|“ ¿èmfÎ ÚòWÕwt¼Dˆ4Òzc…  õ+î×*Éê7Š*Ô´GŒÞûu›ˆ£ûŸêRk&äsŒ&zááž¡qõ‘wÇ@B\ÏR8ù#ì±Èûã»ÂîÄ7%9ví ;À'Ân!maäDØùa”cñ"›'ÐV˜æ>r\'^3ùÚ Â.«ë<ñ–° wrêö:/IKeä_Cõ¨EÅQÚÅî»| g¢^öS8«»¡í,QŒÆÞ£¬aØÜ ¹}X­$É„¹ÁûªÊ+ÚºV1X³ 3'×–Û©NAüµ^Nàp u½E˜’O#ãXâ Ö w ù|¥õÖAÏ((μ…<‚ÄmŠÌש>;‚>ûÍÿ^îê´,El¿Cuš¨sa«Ð(8é•Ô«·DÈ{ ¯U‰Íç”ø,7ž“Âï.Ô¤é¶ÂoÑ_»cŠ'V;SdCpCKÉ<& nèâùWÏH ´³A>ûg{‘6Dš)ˆëÅó=…yvÒ°ÎØÆjØætƒÙÉæya¯G½–|*ƒ£Vb¤2g°êߘ۩ Ž-‰Ñ+'08ŠëØbš38v¿8C Íä$œôÏQw¿sȓȊ«¼…Q3‰I®™ÏÒL3c5Óù§Ÿ>ýõÓ®b*q)â}LÓz²ÒzˆÙIë!|;­g¼ÖC8ß…æ—Ô9VKµ,ä‰;[×k¸Â#Óõ$»êu»°·OU†•÷ /Ä=޼°1¤©‡Gm­ÿ0¸´Y1U%ÎðsAÑ·.ÆS%ùtð«w%y±8nçHjYTÍíAY+š Õ2ªUÕ?‡{†.zl;š,iIm*óÃÄ`:k‹öáVŸÛ§b 7ô¨¡0ృ?Äš'2­‹pÕz ÓDÿôžçLËZ)o(>fZViisž‰–=Íy–ƒ}†Fg?Ô¥{žnj °h Oʳ;-pû’ÒodÕ½Ðíì¡XÏ@°ø;'oú¾1o©¤¿3h3Õ×0ÐV6K(æ ø]v_ÂÎ&4OŽF{¸¦Îp˜§ÊG‚dVWš7ɬ.ê(“YõpìõŒ^Ò5²Y*IƤçX—˜ ÌRÍV™ZW˜§ÚcF !5Y¹,Aê !ƒ% Šq‡AE‹1çÞÆPvhÕô9¾·qUÒ5~ öA4~ûË<¥À#¨ç iÊF‹ŒCÿœ ƒŠÏ𢴦âS4“Í ÐÖÄœL«Ëeé­ì¬®h~÷9F4E¶ÀÛœjñ#ì Åo÷S6Zø¦Õ÷Ó›R™7¥Ú¾)E¤yS:ŸóóM)‚Ì›Ršn~S:óóM)‚vnJ¾}SJH㦔H³ySŠH¶gkYr`ä{ÌU S¦<ÑÇÉñH×xݪÁ§" A±Hùo%ÓâβÂgØ]LBž…˜³6@Œõ¶:®wńĻ™V`ÐjZ߇OebM1C¼¹•dŸÑxWÛ*Óu´húÖÍûâk‘}òs.jüÕ A/*¼>Ò˜STmHqÓª•Ul«qQ¡…Seÿ+jrä½N­žøÞÐ £]ß!¦:—M5>1Ïžâm†u¨¶¬ž°Ø"и:añŽ ÑhIì2VJûÄž½cì`ôÆ‹øS¾˜4¾Eú¸š_K^ï«Ãú@XÅ;Gà >ÚiEÏ9`~û(­•òßc£žxu|;*® c®ï=ÇwâQ޾¸ ‡ž6Ârqìôö¸UŽÙþ'%­É ›}Ôª„´À¦‚À_»ÖÇf<šÑÿ)H æ!/FP^_͘‹ÛâNÖÇ'~ç~F~-Ì<ÏH~‰S»¸×sP“Ù+4N'çGŸ h£eHpZAÄpö=‚Ï ÆÛü š !¹eˆ½»¶H^²O·¾¶¸Q kÌ©ë]‚nð1DK<Ý=:–Ú›Ak¯„wXS;ËãíFw§±¬Ÿ ƒÞõ%KG/ЯIõ}îê_J<Ü•áêµ%ÜJ×Je¬ `ÂYÿ'‰Öè•Å^aA‡¨—´3Ö­¹r‚$ë%Z1Vûx¢Þ=>Ö£ælŠ%•òÆbþ`ŸoõçUk'´Jn_§&í‚öc5è-úYL€Í˜OÇ%êó'Â0?¼æÃz%äC$0¨ºü {†i’A††KemŠÈRÒÆœ#OÄŠU¼PÖú ˆ° «µT˜7±¥«%PѲ4¦¡«µr˜Ùg¨ê*’ÍHKUkWÒlôuÕ°éÎ5 ^‹hà°Ú»)ç4:1äàžSÛÌ]#Z(J¸HÈhA_RÇXæb£;Þ¨[ÔÆÑ'°V«ã}áÑŒ`Ák“É·,Ä´Ô T\ãê\1h5zk¼Ä‚/r‹q,!89´ÓÞä(V0›o§ ¾®¬î±Ö®Ô6WµúvPßgî+[ÍtºæçR¤o%˜™+ Pœ¡“Ç`!‡µ±ÞôXi.ªç¸³¦µ¿¢ßY“*9CkQ° ½LR°Œ,è›®M!Ô®È:+`Ø:i}œn€[ÆÉg ìÁ¯Ðàyñ/deËÄ#‹™7uxcNJ"ò8¶iÒv^‰i3Ú&½Xt¼‡-Û¤·öá†m>ƒ3F<áaÉ•lœ|o¹ŸQ(8-ïïóm«At™ ¹H¨kcðïcƒ’[„ø¹93·/©I¬s¹Q³— Jorð¢ç½|ÀÎÖÄ_JèÓχßýÇ…ZxÓǦã%T[ý³vþ¸ƒƒU_•7ߌúhíìAJ›0™Fáë±.³ÕŒ¸ TZ¾LgÓ‚Öóü‘MWöÜ~í*[Lº€[í×J3šx-úa 8ÕÚŽ!n¼FûÂ8¬ýI¿üÚȈ&ñ¼Ææòúýdz¤ÌÁç¯?eg5v“ßw˜:ȵ"ðÝÆ^º_JÏó½tn?ÝËZ¾V"bÄ,G£ôÌ­­»Çÿ’_M»á©.?oÕEÈK4èz”³eæ4UoŒÈVNއD€³úÀН\½¹gøt„DÅ¢öxn\géSŒùž×¤BEÌ´K@¢OïsC)Aâ×=Ýž‰Fäå•`4ØVà%jªº2e¾è,vaº¼µµý>;µ«WŽ4–ñ “mËÖ·°Þƒ:ày÷•˜õ[ÒŠµGLÁK+—út®µµû}±=<…6™ur´õðÔÁ`K 4]jó½i‰{MSaÕ§ÝÓaˆö°ÑØÎ:g…èËáäêT«iÛ„žNÔj)ŠYe‰¼Ã‡ úƒÙ×+} |šZÓ· -Åýs Áœ¶«Þõ²‰Éh|¹Bé]‚Mo|H .*?`ÑK4_Dq¯ˆÂcýZÖ~Í•ò"P-]Üâ’¦†TñIM½¸„PC/µj'ôµíf«åëºË/èmW{ù;}íU;†­òÏÑ&‚øë!ÚS— À×Û׿ ˆùßNë²ZÄœ[,Ò¯N!ð%´ ×ÖˆÙw¤}Ysæ*( M\yCIq}ZKçtš7­Ö\[mýÙlÉÒ|*"¯ñÓOšDÐ=†Æ9ÏÈK8¨¢Ò˜Æ ôx$ä–S]%@¨~gGíðÈu¾#-OŽ,Å~õÇoÖG=‹ç¼và>>e0F%%ú%øB8¸Ð¹®a+‚6=dQj•á–‹¬MKxvËI®kV‘–—\׫&DZn²–—ìí]ïV{'Ðè)k¼žxu7˜¡Ê•§gYœG‚X¾²R.rÓYÖoM´¹,¨'¬åíó®’ Ì«!^+gyÌumŽMo¹Ì¢*s8`CÊæ™oO±ÔK¿… ‚¯žµçÏtºè•,ñIŽZêiðk=g}–ȇ›]ç´zéÓ ê—p|™K¯Þ®ädMˆÎs\ŒÝm:ÏŸ#’¯QlúÒ¨ô8æµà(ûùáÖ’¯êꩊM;n‹©>Aö“D,¹úÄA;ÝälÅö†¯Ü×Î 6}ÑÖ–%ˆ½eŸ×ron|ë×bbÒG|(«iCÒ]è0Ëh›\{ð˜cºÌ€Ùó™¾ç4Áÿq^³ú[êÒ=~Ú€Ž6‚o€X Ÿ$òGLZø* AÌè4÷µC-bÎ!?§—Uˆ¹…Ì´¶\CLøò¢ óiú<áwXDï2l£Ã˜~ØU ÕNÕ]ŸVd£Þƒ&%Þ G[¿‚ þ'ÿiÔ0ÆwdC\½püÅ‚N–Á¬4¦<Ôè1ÅC·Iq²ß†. µ:A¯1Û¯I]pcæÝ}6ˆ¿ý8 çyÚWüm®ÖèhNµt¢åç }«Õ™¹ÃßÌk³H„ޝúů}geO©­˜’.1(ŽWöÎÌŽêwù  ¶~¤mÊxý€‚^Ó"ˆ«);K18ë§WöD[_èÇuE§M5“1óíÆ{Úõ Ã_]Áâú­Óé¶5éZ é¼Ç–ýÍ%›8V¡N² ƒô;·úåD>ÇïܦÖ窼 ½»=bv=#M°o½—‹y½°G¸ûŠ ÕÁÊÝ¦Õ úVúÜpÊ)m#h W°`` ¸^}m-D”ª¼~ÎŒDœ*_Óçfü¨ÏéWøûCúDõŽùµ_¿•±:>E¶ IÓé™ _+hkm¥a˜íZªÓe…ˆ¼Ççjú^A½½îEÐü2½¦tŽ–T?á [´¤.2hÊ|QnÅØì«}'„A Œ¢b„l#õ–æNs¯„ÜwžÄ%õ˜á U%8ó¤vHU Þ"ô²A÷X ¬—s‚Rà"rH˜ÑyÒF ‰—tÁ;ïÎtžñ:bÙwÒOû9-‚+kc€9ÈëçÒ˜³FŽ+ˆÞ)¼¶­—6o,…ðìã; vµ‡Ož›H»sw‰ñÑÖbàjHÌsL_ÕÆÓ°G‘*[}­ªÔ. Íg{í7TÛê\Úµíœ5=̆$}A%Ö_=Tã7<»1Ý-ÞÒƼž¨Jýð›v.¡£1‚4t‰¹¨5Ðè}hðÔæÒ«Ms´%Á‰2©Ke¼¦­ž'~ºõœÏ4½ýʈ!–÷س¹Æšd×µ¡ü”&z™«½ÍHFì+.µd®¥M½Vu×ð‹Hï C·’Òa66Bä/°HWó(8ëúó_Ç6×_>ïEôí+Ž1:@M«>y1×ôžÄù¯'žfÒ‚j²â­%²¼ˆõfÇ:Ljµ#ÝšýŽbþ¶$ºËÇ}yPMßËÃ%¶µ«Æ*ÎH2òB;Ój‰Þê<š#²ö×¾ª=ÚôºÁ§©óR?`0©_ØBÐKüÆ•¶MAÐøÆ¾è·ßYxÙSÐ[߃½…[RÚjV´åò#6fsˆ3<ÚÇÙ{ÞMï¢äÄd~‹ÏJ¢!1ô¬$jæ·f PõaNf}Vâêœ_I›9Õ0—d}U¢=§ÊF_•dCÜa½q˜¯Io {Ý=úªDV#nËhjq­A#7¯©€Ê|¸ÇT€5\Áv¥Ñ8Ù0,E1ÞøCÌŽ'l`/l¡"T kù0àŒëv±ãÚ䀯m»Gño‰ï°Ö9æKez …Ý`ÖÛÑ’î1 ×À°jñúžÊEnÄ â ®}ß}‡iÔˆM—§]óh“Ö+OýÜ=u‰ž~J~J1M}•ùº5ºÓ×l¸îx(ÈÊZ'c€×«ŸÊ„&©õ£ÊÓ•i31¦:¥¨Y&Þb#E½™ŸJ»Ë‹vBŒ‘\/amÀ #pÿuPUë×ýZm²â+Sß c}òBèËt]‡ú‰ù¡Ö¯xvžÐ0£ú&GrÚ0ñxÂqQéÐú0/ØÑÏÆ6âå÷ÆÇàÚÚ}õ«šÉ©¬j ²Vë,Fj[Ÿ8$?Õ9Ú6ݬŒ˜²õ?`e²–_áþðµ«ç™n©ÑŽ#.~ü%ö‡Íl¥Þ£/‘Â\ɨ+áv –t°°pÞ(© Ä­£J cµb­)Ù#èHs¿úŒZÏõwož\?ù/M¼ŸýY~jKÝŸždí‚Æ?8ùÏ?~ÆýÕ}øý?>¹?û‹Œûÿ›³uÙ endstream endobj 369 0 obj 7272 endobj 373 0 obj <> stream xÚ¥\YoÇ~ç¯Ø%°aeÔÝU}=*áiÓ¦xK A;Alù áüüTÍ’KÖ±= Âã%÷›>ê®êj…ÕÅ;auña‚”3ý/¬«_¿7:;ØùûÅ΋}XŸºø×N\bW½­*–© ¬.~Üùâ&„póå—ÿÙbHS«`PÇüøš¯ùq)ÞIq*Í;‡aJÍ|R–¸>µd`§üxÅÝͯó§¯Å­LˆÅ.‡‘)D¢Z7ȯøqÆkOaê ¼HÍ^²½ À©;Ò¼™sÌaÂf¹$¨OµÛŸÙ×4…}Úœ02¬è¿ïwö.v~y,6%ä W~ÜüŸôë/,“¬fÁŒ©Niý5¤©ÌŸóâ(­v?íœÒÏgÈ.’ËnÆUnqŠø@O|VÇЦšôkFKY†©¼Ö¢œ¡iL‘˜2ÕÖ5FHAÄ<•dæÚ˜œHœÌÎ…ŒÄÄTŸ:k°ÚØa*v›Bfhë‘i®|Õ¦£g…øÆNëÔnæH â”{U¸¿ÌËÜpÛÙY‰¤0I½&ySHLƒ†ÜÜ ) JIÌ•„UM))µO)ë½Êõ62Q!^I^‘(¡^ʾ6d©v½£fø«€F¶y ybäŽm]í>%œ Ž!d"h^ÍNDàŒRÑk:ß<„‚¦¦Ö´˜]JN¥ƒfŒ]_ÍSèÝÃY±M,À¢ØÙÉj¤â¹€ jÓR!ý0D®¨§;–.x#Ä¢#ဉŒöHY€ü±C$AòÿU³d×âÈ—ecCä‚È“cD>ÃÎc ð!gMBŒì|3;¿–o(A„<å¦USyD²´MsaWB:N=‘0ñ8ÓÅ#Ë­ÎþNª¹@° zÖ# )4Í0AÇLF?Ç:RÇL,ÉÆ8 MÌ‘¸QâH22IûÒDÄSÈu¤9µ)¶:œˆt¢!Œ&bæ¸lóíÞ¢W"Ull’Äk7!J ¤HÌfšCïS8p, '=ÙTLKÂFÕØçHdßMDªÄ¼¸ÓÍãÐ8¬ØòÚšvЙQA¬€ŒkI€²&ȉhä÷ªG[é<9³—ëMæ³k)Q—S\¤RÊ…evöšBN Jv¬@ôDÄ D[¢˜; Ñ ©Ë˜3då do›V€8ÝkI§£!›…8]{­ (úÇâÿxc¯¾–1`°ÄT:PBf¶‚Û€ªqФgÞâfXú8àPp¹râ…Êxˆ¢\¨PПÒÂ@”¡æÚhWÉÏDô·¹E]cïäÈì^w­ £è=†2^'W)Xª™òiÉt,AÈ]Ø?%¨­+"ž´È¸qÖ]+'`wJAM y$ƒ£é *i{²ïžZÅ‘¯ÝßÍÍݺPz‡º“=6Ù(æ)ˆÂµã˜¡@.óXî€L'. '†lg›©÷b?k+ÎfL)öùËÃWGï.޾Ý;¹¼xwôí·{»G//öÖ{΂íZ†µ{HJ‹cªÌ8Éî[|³Q+™Â&’€nᯤYûÈ–”Óˆ’Ö@í:–²M…³ˆ­ïê¨70·üÕg”ÎN¢ÂÉ28žmÁ.®I‹B¶ì’dm޼F«t`UÒÂfE!Ou)C7 9Éê\×פÕ—|Ø¢ä:9Ì—eØ\É!ÛÍ©ø¶’T‹² L"_ºe´æÃàî·54åXÈÒåRǯÎ2Õ/ö“¶ §ž-©¶D åñ&¼f\X0™£»¿âcºbÍcƒÜæƒÒ¡¨r [8”V Ye®i¶ÏŒ§=RÁcM)ßÏ5Žw…‘ìƒOGËJä³b°‹ºY{ù q/e™µOdœ­ª˜,ó]â²È0¤P·%XØZ‰$xiÌ0¬”¡;’Diª£íªhKamÆ?Ã1vZÝ‘XUn%çâØ>er4µn!úµv}u¼3Î( -˜Í wA”– Õgê]ÛsRö~ã}S¸þøûs{ çôVU¢³>Ôƒ(½+$ ôÛ= Fh#¹ƒ„Ý¼í„ ìj2H•^Ĺ.¢A'DÔŽÅ€ÔyiKSoÉßש®ëò¹®Fªâ/³ØüL-hÛ ^âCR;ñ3Z´h™(ke$ͤÙX¦3d¹b¶ÃÉÒ4¹"®oyÅ5¬PÛEr'Ŷ[¼ÔÑB*VˆžËhp_W²">iÇ\ЪK;îk4Ü1Ÿ¤&G;UEšRž6¦¹&–Ë´HDBí 뢀“+Žãu…‰‘/u Â‡ãéH:0/˜TªÃŸsÿ` 7ÀØ 5pƒÈ›@¢/í¢‘Melj€ˆ3›45ÐÈM€]üCê)-FÍÕ‰9¥HÝ ¤a\¨©´µc.L-ÜtÌæ©^^HåqŸŽ8 v;~ÂÉ °…Uès¿$ ]{´‹Q]307gh”œ˜¢.UjЮö@i®éÁYê3û`7ÇN=ŠQ¨cÆr› Žá”-5ÑÛ%¼1Ù£³-9')3'ÈCéH”p”l§{«;a¸‹IƒTíŠbæjù!‰Å_–d@[»eü‰¿Ñ9cÄñâ Ü9«ZÆ>õ:;@0Î4±”±l)f«hçú@ýRf›R'Gº®µmpôÅi°)s»ÙPp€rþr¼°ÒçÃwN§ðÈ1]_:¤Ëëd¼1 ¾’¥™´QôÌâC‘A áС—-ðÉNï8jKc,i.q¹YkMó МòÇhÛ¸{˜¸†öIïZ^ЩLz×›åÖ‰Á”ZO—C£Ü =Á:roNÎå ûÌÀ]±ðTKÃþ»ÀSü·Bÿœä”AœÃI`B RÍ }NJ¨èv>l× ™QZÝØå–ÅdˆTlI‡ ÃLÁ•Îé¦,¢5XX]ñ‡+:Á,¬í ôV7ÉV° ÚÕMýÁ™î\—Ÿ«Ã Q£8Õjß9Ñ5æ`'ÿ¼ˆÓ½Á¥­Ùe'¢PO¹¡ßqoc˜éïbKuca•¸î·5«” Ê}ÇóFŸÀfd¼SŒTtùƒOW5èúAœ~ºNýÕ;Ûnƒ.ÍÃxÜx3ú ôV¢à0ù BŠÞíhò2RP­d9—Ar#á´ó._™;è!/\IóŸ) }tÜ_òÐ*æÁG— 4fû5Üsz3iûÄ#wLi„(^¨$è)…˜èŸí.”2t X‹)3L>)Ù½Jm§p[]©0£“é:_ÏvsÛ»?ñWN™®LH™ŠØt¨9ÃÓf-mßšµhɶ«Ï³3ݹ¾—ɒ황§9-ížÛ£An évâcçví—öÑ( L–"r$Š¡ã˜ý©Ãë‚ ¥Î ©VnO6™¼QÀÄç’C~35[*_­ýäÏñ°Å1'äàùBÐý¸òŠ“n@ˆ)ˆ7~{øó¿?ÝžÿñþçóÛ÷·>ÞÞ|±öÖz%V´fçt$†â~nŠ×ÈçDÉRËt©¹Û)àÔ C]pÍÝNwíÇÜç ÎꜳVò]"˯P¾áû…qý‡Â¸þCa\ÿ¡0®ÿ®§rƒrј#›Ö’áëâ7p"Ð %¶8NjÒ8h†ö¾™ q#¹ø@ãGRhüߌ’Çw#\qVï=3g€hÆÞ× %–èÎ/}KÀÙ(àÓ ›+ŽoáFêhh©|KZ_BSË“˜<ô)Œã\`}&:R¹Ù£ûƒ9Î¥äõ Ã' ÷Ü]ÊPõ ñq«á«u.ÐÛœ­+ ã\ˆ)Øã̹C2³“ìîÊ”sYé<îë›ù)òì!6ÏöIç’q>Vé\ ·Ávíõ RÞÁµsÙ{}q¶þx/ã]4Ûò)nc³F’žÿh¶0! |.1$lYClJƒ=Ï1Œ˶{’JsË´ÛÅII7Â(à–{™™¯® VþKší^ë u|[IaôÉ|©® ƒ9ÍÜ»Ø9kâaõ#=ùÚåw2FÒZñK ?ÜáýI@ïßÿaçzõû€Ÿr endstream endobj 374 0 obj 3949 endobj 381 0 obj <> stream xÚµ]ÛrGŽ}×WðAë±=šrÞ/1û¢R"mÙï–V …V3£ Kš•éõîoí.PM6¨ìf8·MòTV&82‘Ùnïü×nïü-}<¥ÿþà/ç¾yâö¼ß;ÿÛ¿çè¿×Ü^Me*)îxðå+ç\ýêüŸwOSÏ ònâzŸZJ øGþˆ›@ïË”{UÈãcþØç§ê >Å)µ ,Ô§à4èÕ+Êiн(Ô¥µ©Ô¦@WTü²·ìy)S÷ ó\`j› ;þfm$ë ÛkÔëR1¸<9¯§wþ©@7õ¨åz"AôÇªÇ [Šaj.Åb›ZŒ¶Þí dvS­zœ/$(OÅõñ,…’¦êtïåëjšRò[ÄÊsµRœÍïä'Þ©wUËöm"£óSôº‹Ï$(MΘ*ñÎèÃTr±íUÌWäI [Ì F»¹"AmŠM[þK¢?¦–Ƴs˜ªñº3*aJ†Ù}3›Õü¿ø§‹= 'k³²N4!Îàˆ'kbJ>O!Ö±¤@“\t?.$(M^7ôÊ/`‘ÌÖ`•*Ayjj’O©NÑ Ù5¶HWÇÆ–r™¢a‘GÔ'×Ãq’©Á†²O¥M¹n!€T#q\2„ꥼ P¿ðJÊìOnòìj%§› §ãúéŸßþëýá§ë³_ßüëèã¾ûæúÓç³ë7×ïž¾»&Mýjt«¶Ð‡N*غhp­}+µÝÖ&ƒ–ëŽ}:[õiÐ¥LÎbæ?èÒC dBÔò‘âT5)#< òØ.*  ˜^¦ª›®Ó‘8¼A áùN¯P2† ƒ¯U7u!A}ò1+Œ!Èàkׯ›µîGÝf¤(«jøì¯¿yâaÆ|Ê+BÝ€Ÿ=~}pzúúðùÑë‹Î.ž??>=?ØýøùѪ §´ˆÈÚ°8‰gÒÅɓ͊ØïðŽ8¥œ)ìãÈžù'£—®@0‘b5¯@ ç0yOÖýÍ“€"Œ}ÊM=÷PF§uâc8òm³¿ÅH‘žÓB9]ω>….®Å-ïLW R*yÊœªÝE­¯’¿Rp`(-ÒàýDâË4x2úÆB d=a,R^k-¶HWá¬áCк=>éQ¶P[ßUp¡Ô©”bëâ–<_ŽŒ±;ÙLÝb3R6—‚Ýú¥Œ()©2lb_‰"•9Æ:C¥ Dkx^IZ†ŒÝ”ÀìIþÀáÀ~îdD&gèÏ¿KP¥€3+zýØ)âòÛxá.Òó|Æ1!¥Ù;ä±^&Òïh°ÖþûË`ŽœWÙöâäH?ô ÈÀŠâ›œuK¢Q$nŒs_%‡‰Ò«ô8¤WålÂGü“*E^=µ,ÑäG-ÛçëÞÝÅõwÿ÷­N8ÆÖÚ£S¤L‰Í§Žæ‘Ü^éNü]dGt!z…‘±K¤Ä¿) øKú£‚œIH§ì:+ŽÏضPRÇgž"¸ ß«)§0u¯_~ˆNБìÇ#ÍhI·t‰k/®èŽIP›W¯tŠþ³×¨@Çë § m!Œ'ÔÓŒvßõV ó*Êfÿ’3ý'r»Ÿÿ®~uú”ÜGÑYF©œK¶u»«æVË: ÀW<±™<ÿôÓû·ÿû×7ß¾ûé6ü7<YfoM½WkV   SF†ÈG¸2Ò‰›¤#^ôÈÆ‹_ªE«9 "]AhžŠ&ŽrfDI¿ÉÝÝ”t™”}{‘3¹96AÐBðÏË#9kø]L¨3€Hv⽜ àè‡ËÇÏŽö_Ÿœ\œÿVµÌq"å¾Zn<1«å黟?ýòùí»Ço¯ßÿ÷fNj…Q”d²nÀ[ ¥¬e^LD¤TJr,•µ@Z)95Æ‹_b–¬æ¤zófP PJOjÂJ ¨KÔï\tSRƒ‚ŸºÆ¨0.Wý¶%¥¤PŽÓC„•2‡=n<óû)eäõßp¥ÜxB(åÑÇ7;¨å-WÂ{\ H›+4àJ@Ú\‰Í™\  ®”Í•2¹06WhW|'®Üxæ÷SK_ˆû}Ôrã‰Y-ÿrýéèãÏï>_Ÿ¿ÿðîÓ/×O‡zÉÙ=«¼ØÐË^æUUD>’ÚFfE¡—œî/~‰f°š“—§’0ô2’èY/u©6-ŠnJ*Q"åÕÐË:Ū߶¨—}òYÇzYÉ3y9gY%Ͼ?8¾8}ôý÷ûGÏ~£RæN¥i»+åæ¶Rží¢”øâe¥D¤©”ZVJDšJ©š³”A¶R"ÊTJYJ‰S)´E)¾‹Rn>³A–§÷_ÿðìÅoÕH^¸tñ>¹ñÄZ#þçú3ùîx’s6Ö x³VÉÈ묒€|„‹lžu@–JÖ9žEäKÔ¶f5‡Û¶Da©d<«$ ¤J&ÊŽ‹n T’ôVc¤JR¬×«~Û’J–ÕÎÂÇ*I¡¨—óñ;ñd¡  ÞG)ïXÐɳtR¾w ’hk¤Ä Rm}„ÆLu”˜m” [%ÆÔE ±UQb¶i¢D龜wüVj4ê»r¢ü·/–wåš"f…Tª¥‚ƒõª×!nÄÕVýÊ…‚û¢äY XÝ´‘»eHr5#üÌØö¤!7Ê…9ò‹.«½ÒÖóLb(‘îj FáZqsÆ ÀK\Œ¡ '‚KÄ\Q:^/aËePS{…Ë5‡±¸¸²/¨=’ude ^õ^î’›ðr`d ×Ç å|Ÿ‹G=¤-E+—¶ØÓ*T”À'º_¤)öqψ,‚S: ›œwÉž\S³óLûݼÜ?k+SÏu8Ë¡‡ye`Øû^É(T;/qÊç1Yp¸œ‚šå3\\òÅ5a®:Óõ— RjãvØ[8Õçé ÂÔ¢–¡v+<Åš®Ì89ô4¤.OãíWÀ|»þã ]Hyla\ÀÖ¼¶0¥|‘LZÏÑ,l#‚Nj°YçïùX¬¬÷}¸­ú` OÖÔEÞ±QC}"÷&‰Ã]7Müxáý$o.Z°ìS¶Íu®îÐQöÞšå&j#æèjÔº:#u–nxD÷ ÷?W-ºÞÈþƒ‡ï™-%X¹ÿUƒÚý§‹+XÅš'çÕÿ¸.˸ÂúpÞ`´*÷$2ÀÈ=¹\W~ÝŠÜF­CëÁ~‰N;9ÕÚ ¬§)>*É®5厊ÎДúB¾rû«ÚÔzÝûéAæ¥O’—õ›Õ›¿áêEÆÌMÜþðã_$®¿}ÿ ›³Ä RßxÁÝ7/ÈžŒ<ܼ SþàÓfsÖoVlþ&Ýtbnâö~8ñ÷ú¦E0МqUYL “–H\ŽÃb@½æOA;Ú˜6d‚ÊàEW.tKè[ÞÎÕ;=ÙoÄ—)8ã]!D>S]Ìä¼5Nr>ïiÍ4 ¨£Œ®®ÚpÔ¸×àYÿ¤ÖØø¬‚´]®¶¶Íqd7Ãþw$eÞLˆ®ŽæØ87Bò6:úPy6;>q€È»ú®S¬4-&q8¤qmU´;| u°NëØéB9)×W6ÝS*s1k+Zb^; <{.屘H³^ #[%Ô`Û‘2­Z ÙZšJ»C±±“§!*8€*xS 3d\1ƒp©ð$|2`º’…]Æ ÉáPÄÁIœ·ž°…(û¿†g²l=ÐC˜§^«B¾ÐH’uˆºÍgR.õƒäsh lœQť䀿)¨…©¼L~ãáGëRÁÕÚæŠ>¬+*=å³”ŠzN ð\»#A™+:» „?ÔÕD`±ç…J£Iõº å®´5ËÔ„+¸ýx\±P ýh\ëúL¹ôØÝTŒ®:âÕ¹œÄËl¥‹3ùµ\!àEDݯTÅ/E¡j˜v¿QQÓâ6ªVG™”˜äí•ɨ´C€ú|rÂI‘êÉ+Ì!Ä™/b.@t¡kÌ­Ž×J›Bž¬?ô±Hzlã‘°HˆÝî'nŠI{ÍêAwÔ#/IR¼‹`™2rú^at„Íc µ(¤xdúí ôÝM'“\ ¹ñs¼`Ö‚B>·çX)Gò8FH $—)h2|¬ GòÜ|nA?‹2\u|bœÍ#Uóú½EºÚ4'äãaò!±¤eÙ‘ ûÖaKœóÝd_D ^KÕȾˆcŠ~¥L¿8Eën¡¹Y½îç£gJ1ŒCxnê]£šzæ-¯}‚ŠÔrSÐ+ã¨(91&lô•è@ÿâ".å¦ ô…\òª~‘rï3§U nxûÛ€ÛSqX )ÉAÛÅR"—ôÕñÄJQa‘[ã°@Þ&=íKqX 몡/ŒSÅaëxà·ÆŠËc:ñ%›óÿCÞ¶X¬çƒ#~‹Åz>8bhÒ)î®%§õãĨ÷¾q!ÍÛ&Êdp¹ 3Aû-!Ÿ/A.ÌŽ¹l°ˆkò65ÂÕ‹;;J7èuŸLñ»d‚øŒ™ šYξœ "R§<‘¨™Œ@÷s!U+Ë'·NêU>t˜óÜR§¢­›¤™r“Ùr•€%©:Ê[uG f¿5„OƒúJÞ”’$|Ho4ùÆ‹‹Zº†1Ì+ zÚNñZ˜jÓ¤¤X‡„Ëi£ÂȆ dI7ÕIÜö¶JáxР—(lôû%à“î¸É}ÑZè9QŒV»B^"£ñV‚®pˆY7¤/áa¶îòÐ$4ŠêË} ð;ÙÔAëlªG:(­a2ЊþJŽ ¤è¯¯@ÿ­âÃ8Ì»oùϵût€ß‰ÿà›ÿ¬Ž øàþ$0T"îS˜?ãmZ|ᔆ^óÏ\btç$}®‡"ÈH²Éw¶F¢YÚh“kÍúÂî_'˜Ó@ÌÝÕ¼ IÅG»¤û2³Ôÿ© ²…xRkÙAxf­éI“\žÚÔ½ȈËjfâ23q™™8‚ÌLAf&>î…»ÑÐ4Íg·¼ÁÇ)ï7!~ÞÀgLÞ0;²Ì_æ {„jKÐmbpÕ(¨@aî%Ì7ĨcðcS  •ý“›«bÏß*ƒÅ‡È`³¼˜ 2ÎǨǾÄk&CÓÝþ³´´8ŤgT/×ešûm2 |i…ï;È4ðu)´daa¯§ùÆ=v›B¹ü&—<°‹¯o.{{«m‰—›îcK€ßÉ–àÛ–¬Ž l à[2Ghm¯#rÛöúp\·Ûëƒq·×ñÁmÛëË3i:PÕüÈ"xÑnöœÃô 'ëõ[ÓÍFÆ÷P6ÝÜ#´ÙdˆhàkjúZ™¾A¦¯EékdúÚqŸnV½d®·2ÞËÍ~'j€glj°:2 €¨‘Ö†‚–7¤T?­ ) 6¤ºÕe&\˜7i^i 5)äâ>Vnó¥‚ÃÙ %Ìwã fkÁݵUa¨î’»s|áÛH?¿6Õ™Äs/OøÔž±ÕÙêÈ@>PgDšê  :c?MuÐHº\Ð¥Ä8,èBô   ¡;t™óµ\Ð…p³  AfA‚– ºit! ºl½„j¬R4p{ÁŽ_Ý4„õQ!Äåúò^­…¹‚ò©Þ“œÂ8øðbdi¸ÐíìÛÇ»¸Ê¨èÞïP9F’IúAK2>J>‚3¾±7…yhµÅ×#sá/‚% úùH¨é{!yèù›Ã׆՚ˆƒû )h2{ŠõU¾jÐK¼@™ËtˆG‰ç  @({g8ʱ˜±t<[c9"ŸÉE8Ï»ñ\lÀ~[i‚ÌÒ0™¥a2KôX†ÀåÒ0Dš¥aãaÞ”†!È, ·tS† ³4 A‹¥a´KÃÌæÌÒ0¥‹¥aˆ4KÃxË£ìV†ÐåÒ0Õ¨Y†ý[Þ(T#oš"²7 •þí²Qˆ™•Z®|@¤Yù€ A«4n—í?|hyû‘ËÛCR¹ÝþCÐÉ=/ÎHò,Ñ|¢4¶»« ¿ :ÕÞ.&ªÐ˜µ4Í‹==( ñ¡ÑÖ·6{¶:ŸÕEôþ‚”Éð}áÃÁpy{0@'òVãöʾäÑL!dó¦}¼'çæ«¦6™ïÊyþæó‡¿~úxýùÓè†ÚæoÇÁ‰E ó˜Ã Û0ž@]ž÷CeÒ¤ü%b½¼É; ©•™¼ó¡ðaí¦@—úxrŸ”+*ä]èWËóE%EÁ/ðz5Ó¸‹| eÕC5®+n¾w”ñ ^  ñ-\Ò)­«†$Áq42t=o°1J:Yuå©?Þ+/}Ëë¸ÊÖûô3Í_eÏÛñš¾½Yùq¶Äæëâ»6ýEB|›rJi¾´cÙ˜7Iœ1ùøõ?ɰ­CüúgˆácÉæÓØ¬æ¯ÿIqKŸj%Ïå·ô©­¾ K ¿H¨¯òX]Íïò7ÑÞ=Ù ³5ñôûQZÆ„!ò®ïó aºÀïÞàA‡›ø®_·p×Ón7zwbÐn^EgVÃZ1)ã0àGxyOËúíp3Ÿ¯÷EÐÂuñ|I_Bƒp¸Ç™/ÞøƒÍ‹ãõ…c¤8=­¿iiù~&óL-…DDÅŇŋ=hZæÍMDEsyÅɃÿâðkï}Ö>_çÐùXüÁÍ÷8¬p¿ÐÛçÿñàjï#µûÿMý¨‡ endstream endobj 382 0 obj 5332 endobj 386 0 obj <> stream xÚ­]ÛŽ]·‘}×WèÁ™qå˜÷KÞ2‘ZÝŽ`µZêÓRÀžd“¹$ä÷§Ôj®ªÍ}‚(޵Î&Y,Ö…u¡{úîïOÜÓw”?Ü!†œårIõé_ÿ¤þÕÍË'ÿòîÉ7î©OOßýëÿTOýÓœžÖ”­Ä§ïþòäëïsßüòÝ¿þûvè)*Ì þxŽ?^>F·zµ+´{@¿yø§oñÇåãûØ¥xõëkÌåP¼F¾™@%º« t{úRþû§Aüc‚ôö´ù|Ú ˆwþÐZR  Šø>éožI’’9¨©B» g5S¤¥CÌUî&PÆiYngPKâEÈæhÿx¶pÈQóöìÒˆôÚ`ÅQ¬Ò`ȯyU]$HŽkú$Eów[$hÃ(ÉQ©Aõa”¢œ€ªG7›$†QÑdцœ—^4¿}r^ÎUÐÅÐ"¼?|Ÿûµü+—NwlŸM¦ŸŠèŸ~û·?\þ÷¿Ýüø·ÿúß¿þñGùßzûÓ~úñå?}ÿõ÷¿¨5–˜_‡,®,ODÓ+жÉЛ„|6ƒò¡‹Ä Å÷1ê/Í\Ó¡w¯@fXS²V £v3Š¥±¾køîâ–¢ÐóÙñ²czlc–ðý’ß!|¿ÞwÈ#¾_Íš†³×í²H>Íet¶ÄÝóa='ÀP×SWôкf¥ù,áZ²–/ ƒ´væ³øVeg¸ØEöíQ q¦ôÄ 9$®ˆ‹{tÈSaæK±/‡™E ù:¡zQ"á\V•™£áß*%‰ˆGD!?Ì· Êfµî°aºAÂÐÆ&ÌÉx‰ÆvgP?”°¦æ©©Ÿqd³˜KÕë-¿Ð“ËÙkÿjBÔõXMŒÝì×[ƒ¿‹;d½ìK0ya>ërB½ú–!ʽ^EgYp¿©xfKÇ:<BGvˆ³[/ÂWÌêõÌÍ×\8¯Pt²+ë³oY(Æ%‹¾jƒ6[®)g2>„i\NNpÉknÎC݆%‡‰7pIöâ¡ô¸ÏaY,f$µí²X†ª­Ý ®ÿÙž ˆÚ¶d·³d÷ü“9:éaõy…¡Pž}1)ÐNÊu„PÖ_* ‚žåtpA΋OªÐ×õÃתç;§pAv‹A±œoK+Ǫ@³ž‹H¢Êkò fsW ·—s£†ö¤Àx9Ý>þÍÕwÇß¾ºz.:ýÍí‹·Ê<Öp:Y4Ø+}½0<òl¯â÷æ+rÐ~¡e¡˜Rb?*äë‡ÀŸœ¦ Å£øIÅø™Nýƒ9lm÷õ,mÃÌëíN¹‰Õ×ÛÄù¡®Ï¤m1æD Xb«”¼æÓÔ`ÓF{œ;Õ“ßYâˆRS¦£Œe¾7¤·HæPÖÉÁ”¨åZ‘7?ÕœÜËY€Ëús³:Hâ¬æºCÖfpPµóp|ö#âΠ9Ž.ì…¬‘u'c˜@GÎèØ Íyñ°=–O ÷F€ßÉÄŠB^‰Áé >ªB~Vv°8Ó`9úÍ+#V/î~Ó_×qfÈ\×õ7ï99ʧ¼¦7r£šóë‡B²#ïЧñÏ5ˆ¢¹¢ å`«µÎ :rÖôÖpUE F¤Å: Æåì.˜Z_Ó!áv¡èÙÙ»u¾í,áâ¢AV’îV÷f_ÂÐ ºaQgéP!6CA¨‹Ð`eé´CwztÊÒ‰‡â×kÍ® ­Ù nŠe½›¨ *ÆPŽŽ(ýRÖ[ž£Ví’ü9ã3Î$Ü`—4ì$dƒÏ.ÉÙeͶbû:ÿ™:±¡Þ~Nã´Ä™ <²eMˆK]»B>ãlAH JÔÛÑ{ÚJÔ;P|@·uÄzszŠ7lS¸¨Wl%êœ23ùÜÌÖ‰8l„¼ä|rzÏYª—¦¿täøO·qIå!Õc^q|±Ÿh+ëF´{ðz ÷,Ú£¦Úq?Õ©ÒpO>Çc¯_ß½¸ùáõw‘XD£À¼~§­u±XÅ3S #‹Œ0_ÒH³Á'´8!\ †ªUÝq55Фª©› 4û7­z׳ß2k`ÛF¯àFHÖ—CêšÊX:ˆY§©<ƒÊ¨|^®i|¾ôõ¦Fd憺3LÂì×»å/SÜÙ8+¹›3nÙÉúk†YÙFFÞsÉö°+ ´E‚üm†G6 »ÛY0²knëÙ%a ‹-)C0œ,¯Õv"°9Í*F+Žƒ±¡Fù¥œ{²¨;S”ÓìòƒÃš+-¬9.Õ*.RÚÙ€–Æ}ù>Ç¥G é>ËÁ=ÙÜtÅ9×H&2‘wœS¢uyd{,„ ^V‡)à‹Í¸hƒùÅ ®èF„‰A÷q(8…¢«Q±$½þÒ-‡w‡´'³°¯aÔ¨1n#ULŒ}¡ZQð#×f׈:¤7M4ã.Ê¡|¯®‰¼¬£uk½_ù'vÐY]É#1>~IZ×ãŸLvÄÅņ!‘ÒH颱ب#§‹A–!ÑG‹‘†!!F²ºyäûF8 ºãûFäu1ˆ ‰:Rjô†+‘Ù¥†Û0$|©] 7 ‰Gn#?°ä.Ee¾Bv×rHFz×rSã¸d®;Ã!™ýz—FæZÜÙä#ÅËäŒ[v>¼þšaH´<’¼9¢$åÅ ­4/q0æÅp2$ú‚-<þ2·õìzGl©ÊºêµÜNøÈõb2$F¬7t+_7#÷2Ÿ{"Py…|‹õLk×øë5‹áŸúãÁT¨uoûàÎa<ô…iõ ÆËÈ$5öß0'°¿µØÈ;Î;‹myäÄ3“Ôæ„½®†s‚@¶9A Ûœ mNÈ6'´iNN›Ä°$”!•%ì‘%Q…CôÜ,K¢œn7Wô€%ᛵÒ/2$âP€ýKì„Ç?yl'üîÃï^½Ø°2*žÆ•=H4* dUö„Ñ5Œ‘†¥ÐÒª1r¶Z=D¡Æ$º@‰*{„“}P YÊ@œL ·a)ˆjGbà K¾B×TþÀ¡Häø(*«Ên±Öë@,R,…妢òimë᜔ýz—"zYĽ ½,‚Í·œ~n|ͰzÒ‰‘³.v¸€Ô,´e)x1×’&]ä;¤ .<|ûÜvf7j<Ãz€ÊÎED¤,dªë ݲJ© ÿœì0÷›@Öt֓Б·ìü¨W_R¡c®Jk÷RÖÄÉ^í‚I#©\Ž˜ïë#†’én{CT 錗°‘¦9›À-¢ o‘ÃMéÈ™‰¡$šµ?šö¨@F>¡xtPÈŒ4ò ѯ­ë_—bŠ­h"ïtÿ  ä‘;»åmäÎLÌ]S‘Z–ʲ¡òVT ëNÓæž³Åáí.w}O»÷kÁ}¾8í ÄGŽ=ëÍ fïSK† ¸ÙíznÊ]OÆ–Z™ABÙ¾C1Ûj ÖJ¿Ì†JU(–¿È†zô“/µ¡æÑ6l(-l(B.l(BÚ6lŠ@¶ E Û†âávl(‚/l(BÚ6SÙ´¡–ëødC­6õÁ†Z÷ɆZíÒƒ µÜ€O6”Ŧ EÀ… EHÛ†"О EpÛ†Z-øÁ†ZÎî“ µÚ„jµ6¶l(‚aq‡qrÞasw¦ØêÈ\/vÜŽ…5Ç¡íM-i½H¨i=žÁqY¼ÞVü,—‘SÑ“ÍMWbJÅBÞqÊ nÝMäQYbhÉÐÒêŽ%£ãpUÈȽ3[ð tÃ奺ç[Èq¨Þò¸JbUø‘`Ê uÍÒPûÑnà ¨Ibø‘Ã,h‰Æ Õ^1lY¥&}ôÉ\%dŽk½?·¦"¢Ê%»÷x‰£©c^Ûé4U´DVàkEA±zRÒ_åÖޥф\ᾞk üRúÀõ)WºäÒ\Ý1h>0ÑŸ”îŒèF}ðî*S•ŒŒÛp=}­'Í¿& ôbÉ;T 5û°C•>*r—D .œ+š(|]ˆ"}3ƒª0œîFµ—EQ7gæ¶SÏ“WU¾MÈqMÄÒ²ÁÑûõ5ˆì=>ÐV} c¶ëk.%.¹*&z=ø Ø¯LùŠB?SÝÓ‹îñ÷+źM¯º0ë ü H¡F3º¥ç¡àùe¯„Ñ&PG¾m‚WÈUã’¦åál¡ëFUÈWœÏÖRÞSï WO%?j8m*ô4§˜|u¶©€J oPìȽ°‘ܦȪž¯*zy–‚ª£³¯¹KGîªhƒ´óªñìmíSëÏ$êÐÕßRÕ{o\¨1`ûÎÀ¯ù Wj(£Û¡{¬>7¬=,I8ª ®øŠs•‘Æ +Ö¾Õ9áHù²Þ hâϱ3ýˆÅEŸvôQL 3ß‹¡™r¬ d )noJA!/91*c— ]á˜è?}ÙBÙùR ã–Aô¶N=d\œŒÇ%½MŒ7æ£Xú³Ûpeƒh³6A™£×D{õ _>+ö—ÚÉB4ÚmLúŽkÐaIRh­ªùð5ÇÏXÉ zG«¡¬Žbg2{¯·ùŽ“kg0ièŒÔ3öeŒ¢nô ÚèbûÑ8LÚÀ1w·5wG9Lh¶´ÜŠ˜ rô˜*y˜óhÓ݆£Á[ªâ½–sÅb]x u)–*œ-§J!ʰIÑE<¡w@0“5Õ>p´âw¾?ÊW|Œ°#z嚌|TާÁòláNwD ¸ÊÍìôÕ¬xãx:ŠA…Ÿ_×¥ËáZýÅÕpFÉ*:‚üLI5|Ʋq¶nÙ'tI/ñfC•*NCYŸìñ¬Ÿ!¿”eúšƒJ1JÜù*TÂYÏ”C6¾ùÆlŠ'Ý–7¶Í¯õ­Þ“ûñk7.·ÞýqRUй›î JmºÂãYNÑ`Ýw»áù'ä«„×ÌâΘhçY‚ÍÎnÀãÚIIß''7¬ÇD†oÝSØ<Å´ó%”Çý¥7\fSàª[d=rƒï‘DÈ­l·Æ[ ¿0TpcM?}+>:iz¿æÈˆk¤¼säcF%—_€Ñì•38WÔ%Ôs*:^cŠo•Ç ŸÜŸ2ž—GCìÑÃãLé>†L»æˆ¯3èiâJç°f@q]F…×’ñâQkþìeà‰÷²Ã`#%(ï0X¯™í0ØÉ“Þa0R dI XãZ”@Ÿl··fakêz©ªV v8òKÙ¾“c;DôÈãß¼ã´õ€m!Ð{ãò: ã´sQ”>¬GBÎ.2:§F=ðß[W8;Ú*è-öÀ[™Å¨Ëˆ^Á72‹»-UOæ7£aœÕ²Fˆ7êyÞr zGÌ‹@Ï74$²G¢†ß«6•}½1è@ e»Óm<¾ã0s­Äîžð(L§ ò5G``±1JE`ð~-ƒˆ‰OÅ™ Rt5fÐ?Q£þÒ'±0Ûçâ=À[ÏM½‹Y6šùÃjF ©ú¦¶K‘ûT4‘µëŠœ÷šõ3ûÿ !š‘Æ}𝣠#)щ}m½Ø€¶3]ÏN=0íƒ_Sm‘·Î ÃmBo¨ª7{Ëm’=k0ÓÊmª¸Ê;S¬§$aE6#[ì”_ÏH+J\Fñ’x«]_:]œ<(Ç¥èûŠc·)é)ŽÝ†´3Z>õ Úge´Ïký¾0] l^ôùb_ê/DÍP¿2ºÜÕCšCî¹Ã?âË3ƒV É838€jÛùª ‰¦r¥kl)Hg‹«“}:—ÉÒhs¨YƒtYKãíÎ}qƒ ÀËzÁÐ"T¾þÑé®çvîùÏ"¢ªÁu·J§µ¾>ÿrÌ ‹>ÿÐl±l[=£ƒ4È­ô'o™@[bÑz@†oEDÁ`YÏs«×–QàgìàŽX®ØÁE×CQxP¡ÚЇ:È; ¿g÷5!fH VŒ9•õì &Û š¢bI¡)¦¹#h&»‡9ÎÜk¤?¥ªá¯Ì·ÅQÚ¨–msüϽåwùËÚí•n kã ³%Ýѧ¬yo3ã‘S™Ç5¢5:ݺ‰fÌóR5Ÿ¨zůç kÝð2äéï«7?ï¬ ÐÚx}Ä$ÀknQ„ܽµè€—Ø›!;X“fc 7ÜLÏ1É™Ha*E¬ƒ=hâ²fŒU°šÉ{Cn~ͯÜ4§§ü]»b¬‹BW~”zªmáF®.¬I=´[ÒÒöN?ê1Øgõ[®ñiÆ¡zm8knô¢ZÒÚ¯”²¦<:<’¬Æä*Ÿœõ—>gè5Ø·LåcUÕ©µõö=ïxºh$½LÀg¼§¨d™!FÚ¾¸á}dîÌßÒ¹Xx·ª/Ã&I§Ìü¸e’ˆr€íMè[~¹(«åRÓÝv*½š1Bë2#ãq ‡ÿâÝ“7Oþgtrÿ‹ü gä?žäáÀÌÿÇÉ?þù#îÑ¿š Ÿ~ÿç'wOÿS¾ûÖw£’ endstream endobj 387 0 obj 8743 endobj 390 0 obj <> stream xÚ­]is”É‘þίèˆeíµ—}©ûØolHBÌ`tsØL2hfp€ÀòØÿ~󩆖*3ßz¥;ÂÍÌðtYygVµYÿrϬŽßÒ‡™¼‹‘þˆ)äÕÅOâ?>¾÷Ç÷M«ãïÙ!VvåÓ*?ùVÇïý×kcŒÃÇ>vÿpü· 2åÉù Ðøøo|ø›è¦\äØnb¬ñStN. Ù4¥ìè~òަ‹”:P°“³aaº&ŸäH÷Åm.S4U {PI“q’{øx‰ïðñÚ8ƒ?Ÿ6ŠÞÀ¹2+¾ÿ°Ãx¢c‘ 6ÚþæŸ^t߉Eà·ªá;hŽ´yL‡¨ø©*ÌÔØãùM¤§SO)è³7øãîãŠ\ìÔB˜ª“ Ž”>úÉ•…}ød§\åHî@™^íÂttô5JÐI‘JÈ,‘Ï7LÒ b°uÒÐÀ˜ÕcúÿOkA·7½˜UvqJÁo¾‘oŽZˆ‚Q@¾³×:š•Ÿô‚í¦ä²ö 2å˜hoóÑÃi×ÉÈvc]V'~ºá­ïz@Ò™ƒÞ«…4eÈCnu ”¦³¾#eÌœ&k‹€¿èˆ›h™ ¤,erÎ. ©ädÝ`usªÂú©T¹­9uØx½Î“¹*@RY¸'W>·TŽŒ”Í’Ϥ^%ímJ\X'”Z³­n2Ažb¯ ™ïoÁhž¤ÂI¿]à] Ý,ѽµk[<â].ŒÜäÆìµ")‡øØéõ1 «²®§½>6SPæÜlêS¼"}»Ò¤®+ÆŽÏÕÓ¹7sdë¿ï”²ÉS”èº 3IîjÆõ DÓè‹./Ò÷ &S ;ß+dKIüÎ …¼G'Gê|¯P­ª˜SÊSO iÏ Gz^0eÖu £E§jý_|\[ÉÛøËw’´¡©BnæÅhÿcšh~øœõ%‹È¿š{cH.€ÄHαÎ6gŒgÇB`£@Ïð%ßÇF~ Lœ³÷f¸ÏŽéýõ§œÅT½»N|•vÊ—üÀH ŸKlÍQáƒåÀ£»ùâÑ41dƒ<Þ¨·ÝÞQ|@œÄÐϹk‹Àô³²EМªLQ‹ ù n¨R´Z–Þ¹)Ô¨ÒêH:ÌÄ6‹©O¸•ª~¼<ï ™H±¼i©(ŒK±éêÉm(ÕëƒmÎL± äø Æ–¢âÉ™òN°ÂnøéÆ,½â7äêû!ãG4ú¿~Ý`Ô«R!xŸqHö@v?F± f~ÂDºcö;L$G- ÌN©Íãçû*p¿ëmaoO°CÀ‘•8&9ÑÉ” Å¡Œ Qi“rb§ÑÄ©– ®¾“žh½  ¥£ˆð&×=E¹Êˆ=†ÔEÖ®Íã­sJº„V#O즑\0ìÒ6FÑmcÌU g£Ÿ XŸÁÖ±*ë`ö1OZŒ/~9b&’J¹f"ýš÷G³9¨sЉÅlŠ‘¤ˆrÎwµ’ž$WÎ7g&É-’`ÌL’k¯,ŒÙÉ8Y#‰ÑÊj[“ƒ˜¥$†«rš©$¤s:Å4[InOKdƲ®5òh‰ÈŠy»@6ïi¤*ùl—›J(âC&ŠHÌ ·âÉý)Öéß¹–]rž]ŠÈd?ܱL3 ƒfJ쮾|zr~yvñ嫦úEQ)Í™0f…@òì½×c´¬@;³^¬jûŸ_.Nߎ–Õ4]rñ—BÂýKrÈSZ¶‹}ñeŸÿök…®Þ'‚™l•ÈkÝÿëÕ>¹ ñFLv µÏ¾¡ª}†ÑÕ>R’9PûÞŸUûD¨$ÐLëÂHÓúdtœ÷>Ïä5Î@‰gò” 0­On€“$Ö´~гyW­'ãå|³ZßÓä>{µ_LË ‹“êAä-+|rÈcŸâ$‹0µO+Ê-hjŸ eÎ:É4µOn›Ÿð]P˜ƒ)ýLÁ·éõðYðaozâߨ0ðkc³HŸ)2ùû>>JSñ’Øfæ&ÙIö™ìm°™˜Â øÃ>:²“I’ö‡×QW»´{ÉC¦_ÇÖ†Å{‡¿À—‘+ÚWB¨é<æÕˆ‚çFCF;•[ntt²pµÃèý}·NJøíJŸ‚URwÐùýT•ßC¿öêÖ›©À±ì1÷yE¸&Ï1¬jLÂ[Å\}Ù‰”_¶b.YJi¶,Ûá)6‡È—Q¡·%´ð (uÈíM bs¯xu Åu†Ù&ÉUŽ9é- zµ RšAŒÓ<žãÞ ™) Fy¹¡èI_m"!¨n¸ÔÐ<žÞÖxDìbœ-^ŒÊ6sÌþFü¥ÏÿE¢mP™b¿·…ÈýuÃ=I§œ†§î™B'ñ„G-%ˆ½’6̺Éä,a¾O…!jôÊ`=ŠÎ H1bñ 9r»›Ô]¿ÓH>ºƒÓÑMBåa|S€7 û^Œù{=ã 9N’Ô3ñYwr¸Å) DÅ;ýtÆwÚ¨Woç‰9¦êým×A^AHbй:U%‡-XõL¤g KWŠXɃ>?Ft(u¨écË.Û±¦‡å±~^Ë›L¡ ¾”} È>e¹ËW¼o+Æ1%ж•¢Š&‚œT½*šRÇÕ¢àÏ9%_ýºÚ¤ÐXQòd2ɉU‰ó½.¾(äØ:Þ^¦µŒÎzÝÛ¡’ 1O&Œy ½&ÍðT_wAo€òJ@Š,R÷(oJìSujgÈIm8nÈHÑR‡ÓWXà>‰sIðZˆ©AðÙ:)P})¯Ù&š÷@IC‘!´ðø{àYHJÑ T ÁÜx0$ AŠs­ÒÖ}z½É¢¯ 3ÚåÏ"UæÄ¿ê£I©gó÷fÍ® l°ÞdÁ'IsÂj-OÑc”ЄnËH}qÈÖõ¨}t‚¼ŸÆCÊ'ÒÈáNå]þÿí5›oaiiŸ8yò«9ò€ë6Ø%š pl$»A{æpÇÓ6†Ž’ƒú#»–Ûá Åc/ÈF;){`‘\É z=bÈ&Ÿƒz…dâä‚ÜGï’qC㣘NvÛ’îr)Ïìƒk°RÜÂÄð,É1ã á¾Wn{¼ðâc’?×Û1\&æIiaH‚KJs'ÍÃIë©Ú™³D¾äÕ k¬¾“—«ìÉqAžgï„@1ZSÇ;GV*RXÚÌÏx“VÉq̳¨*‡*çì37¨å¦¨Ûe~qC›Q$¢HL_š”ŽØ+Jd.…>Œ*çžIFÒxÞÄ1­CË|ر4 M„lßp3¢ºìýÂtÞÑš$Y¶D³˜²¦mÞ-–ëŒÜžBˆhK”ÿÀ#—jó˜B"uT5Áì@D.Fá”Âà†¼v߇z? i¥FÚáMÒÙÏX¥žðŠ-øª@ÐÒ_ÆôˆÓ†¥ºÓI}s+Ókœáœ ²d‚<¶Ç@½Q¶4Ÿ ´¯tGÐpI_ñJEbFaÏ(¾š’—ÓÉ]DÔ;äVû&B¥Ê­öHü¾¼@´lלÍ@}n^:Øz8¥$è9o=Ë./LG¾7^€úQiw9Ý6oPkÌ̉©+ ”‡R’ÿЃ") +W7wg)“ ‡1íbÌAN| B0·pè.^Qh÷„wTø*×4çéd}â‰,mþ(n59EL÷x=*)}̳@>Ø:ýx•ë¡èÔÏ~¬ ¼C¶§Ž¥Æ·ÊÃï!{| íàÉW”Ã¥T[|9ž“L^0QgÎkŸa›{$µ,‘ºÐŽ•q¼u½(âv_­tøÛ2!Z×KÉã”ZõV•|C¢í˜Úðp‘k<CEleZ ­ä¸¤êÿ[n¢EÆØå‹"Ô))Šq&;ÐÌjL2>Þš¹ØJç€;Iü;ÿŽèŸ|ÀlÂ]¢ö ég5{ç“!çbvWZ ‡³þL¾j ÖRÈ–È%&þ$ˆ8žŽœÏËðé”'Èý„(3äûíl\ûëlé’á>nU–ÏRŒ¨0('ЃHܬ$é–L4À æ…ÑB\[Rò ÉL i{ƒE‚d¬Óé!ó€γ•c²[U¸ë.Oê@±„¹Õ9’[ÂD‘Ѥèºhv\›t—·¶4Òˆ/½'œÂX Z{w° #10òLOxnýÌ)°\¦YÛÀÛ‰¼/ p *ÂðæôØ-„’u&ž1¾ëžC·p¼ˆ³µ“s<„V$ƒ•òp£4ßB¶Iš_‡‡(ÄÀ=!hò¾•$ð¾RŒ ëŒ)Cöå¸RÖ±ç¢pGZ{Gn+ñ,Š/’¾ODÅ--°r$•¨?»kUZírHµfÞp©ãF‹\2¸– ™@bÝÔµƒÁ@‰Ç²ËNËVålÊ[7$E"ïh³HÿÉe+‹º*k¿ŽžÎ„q~ýRÿâÖL$‰«/^Âà—~8™43E1“B$‘†©Jñ¶Œƒ÷Xëø$]Å¥y;fœfl3ìO´~<zIÐm³Ì9xW‚Øì7rNëËSH6s»Àã긲QöêN¥ã’+;è㟸.70P¯­mwâ@es»Ü ¿Ü<[Ùv6›ýN¯Ó"òÊ·E*o‰)zk¦TÊmY&—M†Œ…æ@[Õª›òŒÏçH„õAV6YDbíy]ˆ$HÚC„´c„3ÄÀ™ç[ÜÀ@Šm@ºÀ®Ð]*´»¡ÏÞ‹”=¿àw›jVƈ0\ÃÕá9/G⺦á 6Ž“"’ÍOãçÁK£ÆIÊíðG"¬²Å~ 9äp¯xþÑ*§µË/U¹RÆ,‡¾t £RPFç˜u‚=熪ùe£sÂåÜ–î.>Ööí+õR †3QçÜÞ‚¢Ù®È‰çž†£8*"‘„© c9Àû֦Ѽ2!‡ÔÂ,䃶Ut€Í鵎m‹è^[fß.lÌȘL¸¼MUâ˜%næ„pq#Ô1­[ñÓ݆PÜ´®.êtPVuùVŒU¨ëN‰Ñ‘„XHûØñ‘ fŠqÿÐÙ2¨ÃéÈ€¶²f| ÐH©!"ªr×½Ns5¢ÊÀQ½mK¾U8Hu§`!¼Âc¢ŸGRhˆV™šÇ Dó<2žbünžYžÆÚzØ…ép·IÙ¢1¼’#¹ûŽÞóL3ÔÚš»¢D"SëXÔ‚ó$ÙꥌÖîÊø²_1@ð}¾­œ ŒÁ{C*•Nx,S󂔆ìÈ(ÈÅöI-2ÁNÌSÞ2‚wp‡J-#F£!o‰K‡QQžKc&ÆÃzEÔ?X„»~fî°x¸å…›ÉfI/Â2êšÉÂð0Ò™‚'¢SÈÞhøD.G ñ¨žóV€ä{ƒì Y4 C“Ö´àžá"ÁÐ! íÈ7‘ÄSš^š¢£Í½°ÚîŽzߴǵâ’2…¼ÃˆîN¯ìŸ:¸d³Àˆa’2R¦ÐVAI9›aÈW¼{´˜4>âö¦¬ñ:½¿ëº{Nò€XKa»;Õt•àñ0\ÝËÍ-Æ1GúÐì[Š‘£¯ýެäYú/ühcõ5Ÿ»ÁÎ{ëç®9Dî§Å€Q<6vW²Dru…¢4ð".™pÐËÌl+m졵Õñïœp Tªõj ×ÖÜñKžîÁå ñHxT¤¨ j¦â%R« À;®9çLSì‚çO9œeajë³â ^£í¥÷ʸ0[kg–l¢¼Ëƒ‡Ñ”áîè"pW8=PÛƒttȳ-Õä1‹¡1 5Ð!¡ÐsU«<–]~Ï4),¦tŒ¡áØå…ÕGâ1xJÃÕCŠj³5‰ùer:ù n«È]þŽ6 |‰áÚɧ´i¬4Ú›ÖÕë’Án´%R]˜²='©¿§¤ÖN1Î=ñCÂf=õ@F>ãÞöyÀÛëc> íý–ê¤E¢Wzyí&Ž ’kÉæ!Ÿá’mUÌë'€;aoazPlwŠ‹üökT„îÏ.ùœ†×MÑ-«j¦],höî9¯Æ+" »Š¢ä ÄñyÃð»"™VFxð5Yî‚6X¥n©Hà—'8Rɽá‡,‚œV¼‹hbÐ Dk›uÝG§»Ÿßï}:ý<ýK¢öÖÃ@*Ü ä¥rÉs,:û½œy f'gýHäoŠ&r1hÕ*iL¾v…)¹1ÿ¡ì€Ç¶8¨_XÆ3Ðr$fbŠkjf<™Ôa†:#Ô0…•ÝœaˆøeŽž{)ȇv}”ÈG­½“'›a ,š£†?„Ä!ßÏÝw²­pÃáìçBëá §ú“8Ö–µbðý Û*ÄVÀõ ±¹Ø~kÉ9»ÈS³´m4‘x»0Rvë°y¸¦Û‹øã‘ …B‡ƒ 픂3ž}‚Níÿ˜äÀ‡¼g Nõhí­¨/’ì&~ A y¼‰ËUbçC»tÊr ê.ü’À¯~!õœFd£(ö÷Øì3‡\“[ÆK_²ðæWD¼¤\]"Ý…­ùLOø£y¸ìÎA3¦}ý~@+% œ“—Û<àöħ"@/ÄõŸ W¸5(U¹PÚ¯XˆçÙPwõD4=G/@‡ü=[$Ég~ÑHžqøŸù%Umâ/¸Ýüi0pOe…„vW%­KÿñþÇówg?®Þ¼9z´»ÿdïÑÑÞ£ý7<_­‹ß¾Að÷çgKߦÉ=¾ñð«£³óËO«gWÿzvq¹ºº<{·z¾Ú{´Â·WŸ?\ýDÿÊÇÀ“Ç_ÇXý‘ÿ%~yhó—«½óÕé»wïÏZŸý²ºlÓ=X}ùùlõã§>ý‚¿ywúåtuùåâêí—«‹³ËÕÇÓ­.Îþ~õþâluõ™þöý§ó‰Oƒªíõ4ûÎN/¿¢ÏV§oß~ºÀ¤þ%¾gðúäæ{vZ=Û¬kõöÃéå%ö¿Þ÷ÃO§o.Ir¿ýùf [ ò1Û}\é¦ÕŸNÿyÛ1iß®.Þž]Êaáh^뻥žýãìüËŠ†>»øB´Ã®ï¾n4Ó^Oºu+|<ýüçuzqA'ôþœ×ÞÀÙ Gÿ[Üò[>D´Sº"ö+:¿ú¸úÇé‡+¹’_1r{×3¥iõøÃ§¿ž~ø6Ùoo]œ§oBö•¢ßþIæìMiúU4EËÅõ…ït@V>YTûÛc«»)*U,æÎ\‡G®üo\šr6C<äÛŽÙh̽ÏgM#aÑ´À«Ëok—ß nÃcß´óÞ£7M/m?{³·¿}øæèøÑñÉ-ûõÚYX3 )äã×X™’Éàê&åzAûgïÞ¿ýòþ¤RO?¼' :¿ TÍ Ú?ÜÞz³óèÉÓÕ`=܉BAÚ\/çøç³‹D›‹³Ó¦ög×bü†™´µoÿi™8ŽZý†½h-‡gï®Îßž¿ý×ì2Šßp¶ "Èɳ­ÁĆú +ÑvNÏW—ŸÏȨÎÍO![Ì¿óèÙ›£ýííÑïØÞ`O¿œ],žFðCNÝq FßüÛÊÚ>È#ÀBßpÄûÎed°D­Ÿß>¾wpïïh1Y}¤Oôì~¸+Bœþ_ ýãÏ_q7þSýöýŸï½XÓ¸ÿôQÝ endstream endobj 391 0 obj 6498 endobj 394 0 obj <> stream xÚ•˜[oâF†ïù–ڋݽpæäÓ¥ X%6Á¦QÕH–câ.ج›æßw ìf˜ÄŸSE1 fž¿H‹ŸGH‹3q™‰ÿÝèk<º™bÍÑâíkHü‰¶f1[wˆ©Å‡Ñ§›/š_4¼*Ò½¶I›TãUUVZÍ‹Z<|¹ùÿsõQêèèòÑß6|›\ Ý$ ÝeyAâq2qc7ñV+M{ø¥ócŠí!~ø¬¡2ÕªÄÑñ+ÐmZ¤;~àE£«2ãu‡2À…\·Ë3Q/’¥DŽN_‘–å3ßÞûñðX¿Ô ?hÇÓÛyql›^4ÓqtNY²¼‡Ðlµ íèÆÑʶÙ,G7¶pÀ9jEÓÑ­Âeé1Íòæ¥ÏptÀhÉØ]ºc?þ«1U«2GÖ?~âÕAØÿœVE^ìúaÕçÞê6¹wW0]jQŠdó²lÒbÇûm7 m?£LÜ`æ»0S«b$+ï‡ZVÛ|×Vi“—ÅÀ4‚5“qLý|4l”²†ƒdÙ'üGžñ‹?ÿÞòº3l:>ñþ<‰´òãjU ÉžûEÝn·y–w‡VV–ûΤ.rûA´žŠ9 ÖV-j ÙíËtíËì#Kh0 ÞÍÔ"Ã')FjUŠeÅ/HÛ4ß·ïg!T¼c™º>07«%1–ý¾€lø®J7|ÓO‚0(vG2ñf+w°¥(s°¬µ;œfcPcw<4T­haYáœdÚc[óºÁݱdœ|]GS+XÖuÅ7m!ξìeÀTÆhêÊ›¬ƒÉ€¨†Z”YT¯ÈöeÝ-IºÛU|—6\+ü|Š3ºnÒ¦&‹P`/'îl•„KàŒÆjRb˜È¿Çx¬ø&ÏšüÇð&cˆ€jÿd\Šù¼ØÕªæ'êYðWÐÐçö¯eî#£6ƒ‰{Yc`}ÕÜD-"û~…$ÎëoC+JMê/ž/üà$ŠÝ¸Û}\jd¢yÇÅ·àY£—k±Ší¾?ÂQFÁ­ *ˆ¥[/b`¦Ô„D)•wÂÑO÷Í“¶ð&ýH„‚êÏ=wÏ“®D?“š”(¦²ùó3ÆeÉ®öe¢ ìªó~ìÅRCq¨ìù5Öÿ؊Ħ ðºìD5A‹ÊÚ_n{‡¼®¡´KL ÊÞÝõný:ìÕÈD úN69G¹º‹rEÌcƒÙ¤Kq”â°—eïd“Dz؀sCØ`6ùBgQCÁL¶;àÍsY}Sx/b Ù_²7@¤¦%ì0Yìi^D‡tç6ÙÓ[ l3Páé}gÌ­燚”°Å®ÊªÜæ{®µE*Þ"¸ÁQ› î!Wá4Ynù³ìMˆ °ÁÞº(›SÃ[V *13}Â8‰ÖËe¸Šû¡ÔH…©qÕQ–¥ˆÿÏJÇÔKE ¸± CÑÜ¿öK}Tj¶ÂØý§û½6_ös 4zì.‰ø|?€œã62/¶¥è·n¶1Ø?úÁ4`Þü¸dÈJGMY¥»®ùÐÉl ÏQ®Ü™'Ð}Tö›ÞQ¶ù5ù“×Mß߀6wAÒŸHÛ¿é”n¦èú7Kf[ˆƒN719}ËBèw‚9ç£\ýºÌåÑrtÌÔÁwÝeÖ]WƒE/Š-Cý÷õ[뀈³u„°:æA±Õ÷Il™o‡ÑÓ^÷âÑÝèû¨{WË!Ú~d8Ý)yý‰§O—qÒ[WC~þit¯¢îžÃö endstream endobj 395 0 obj 1351 endobj 398 0 obj <> stream xÚ•˜]oÚH†ïý+FÚ›¶ÎÌ93¶ç’𢭻ÝmÉòÂ$a7@ÖÐÏ__—†Äæ ƒPAö«GòÃ9¯ÍYù5⬜¶oçíßmtZF'¯Ó¬¼‰ãíK°Œ³Tf±†„•‹èÅÉ+64_æSÃóolQo¦wlm–ëUÃ^¼,ÿí‡:æçý137ó¥a—ƒª¸LªbtQ Gª|üw•ʳ7Œ]¿(ê7ób›vñyQ^¿dü‡ÚŽ‹gœÉê«iØ´~x˜/o™iš…$:ÑùÕä¬ý8ººb4Ï?v(×1>óŒó·¬1ÓU33³ß8k’'Ñ:–ž6ëÌÔNÌt¬:×êóÃý|ZoÚËU/ë[³0Ë OX=›5fíKuœø.ÝûI•Ÿçe5žTƒáðŠœÙɉŽÓgÀÂ4_ÚËwz_Ï +¾¯7fÁ~¬–F8˜”Ž3ÓéÛÁpT‹r”WŸ./F‚¦2v¶Ô]Å)*pPIî•| hª;y×tŠ TÀ½¢ïQ!I…Üμë;E%Tœ{uߣ’4•°²•æ]ñ)*µO¥2îu}JÑT`g§<ÄöÄA•ðãlOh*´³±=uPIqœí)M%íl!¶g*ÇÙžÑTÊ΂´ýlòžVŠ‹ÕÛ€“ +XjAz¾ãqŒ)™‰Éw<ôŒÂÔNiøŽÇ1 d"ôÞñx¦Sf+Aº½ãqŒ&)!@ìg.i;´:7‹UóRHX\vh()€Tºƒä²ˆC€ÕùÁM‡v‡B ¤Õ$‡H˜A€Øùá5g7)L»ƒäp p;?¼ãìî„ H·;HއôÎ/8»8!bˆÞއ€GèíÙnvkB!z;¶r3¶æä5ï?cĤNq"`›~Í9¿æÐûQµ·’gŽ£¶{TFï¢ÿ£_‡.Ú÷T»”þ5 úÿðöãÝãq¯z‡îο‹þbË6÷'_£° endstream endobj 399 0 obj 986 endobj 402 0 obj <> stream xÚ˜]oâF†ïù#µ»QeæÛžK¾6•`68жdyÁÉÒ‚ÍhšþúޗIJgœ!Jâ4>óhxÞã1EO=Œ¢¥>\ê¿ÇÞ0êõ?¤PôÐ#ëý"@>_w»Í³­µ1Î’0ï&7ñâv>Ÿ~}£½I¸ãbŒYÓÐ"4t8F™C Z„ö.'á^Œf E‹ÐÐèf¹hÚ›„»4ª˜5-BC¿£sˆG‹ÐÞó$Ü¿QŸY#Ò"4´=*™CJZ„öÖ'áNŽ æžC÷£œ¿')ö(ណ2îžC¤”¿')îî(áîI1ôBŠù{’ÒÑá>¼2]ŽòìPä”·ßÒbŽût…Ö™ž•“¢Ýæø¨_Â">¯dF(ÌP²Z­³G”¥Ohy*ùÛë JŠ"y.‹êßS½~žÄû<Ù½þ‹tŸ‹eº÷à6†H^y¯§ÚêJEúã¸.RtÜ­’Ã:Ï¿»ysvx+$XTréÙ§£1‡> stream xÚ•\mSGþίتK|‰/·ÞyݪËÌK Á€A¶ãU”²­+ˆû¸_=+íJÓÝ3³$9À3=ý6ý<³®ŠÑ·­ª]ÁË/ðßç­×£­Wû¢pÅèÓ–(*øWMUÔº)´Åèv뇿]O>Mg“âdûòüdûôòôÃÙåÑá›ÃÑ囓ݽËãÑÙQQ\üp>>¸›î<,nŽoG?EQý·ªÌ£ÿ–•+«•åW/‹ó‡ñÃôª8›,Š£éíô¡Ø™Ïó›âå+¼TºRDœ:mw6|˸e±máJ¹vk÷i6¾íýÚß%¼ª\©"^í~<Þ~³rk¾Î8U#Ó¶q¥Y;5ú2)>Íonæß¦³Ï…,®–.ÝãŤ˜ÏnžŠñ×ñôfüçͤ˜ÎÀ‰bº¸ýæJ¼¶µ+íÚô×Éâ~:Ÿª¬ªb<».¾L?™,Ê"ÿ5m\Ùl¤r²?L®‹éâêÑ—7•L«]´ïv÷ζG{»—;‡g;ï|…û„ÆòÙëÕfï=Ã/UE[/æUÔ-‡‹ªï pëà´¸ª+¨Ã²ùÞ̯'÷ŒGUUjäÑŽ_Ö6ÛñÉñåÙÞî»ãÝíãl+Ðj㪾³èêí`±Ä‹›ªïºøüÝééÑÇM ¯·Õfƒ x—C µ1éõÖË“±ïùLã¥ZôÅ-]N._JúãÅÝa‡èI›¥Þy¼˜ßÂaý:™=ÌOÅöb2nÏß§éäæú¾x¼‡]žeßkÅÝÍãgø[­Dß ÅËâdVŒ¯¯ýŒ˜M¾m{ãóÅÒöOŧñ¬øß¹ßÝyôb1~ò›MgȾv¢ï°¿tâÕ||y?ßu^.&÷óÇÅÕä¾¼“OÅbò×ãfÏãÝ5Ìøù¬ÄVÑ·­´®EY¯3µÎþám/žîü,\¿…÷ýfãõäëôjRü9~b:G[Ñ7>Á‡Çï/÷ÿ€óþòõöÇ¢?¹‡×‹ÃëîÜŠ w”6¢oÆ.úœGüÓ’´'òoû8énZ­dß´+ÿ®Ýþ¸†o9ÿ¤ì ’õœ;?؆cõ-äæaÈø·ßµëìñöO˜ÔÃJ’‰ˆ2xüîMÔ»vJ1pÉøÃX]‹Ïä[g¿€b‚-í¦dR¶Pµ)Öíö0¾ÛtO×P܆`Îû—ƒMt­ÊZPô[ÿò‹9ÚD;S ¡ úß›Q5e%æ{ù'¢’›¢°O I¨LSJ­øø€N Ûæ#òSZŠÙõ/ïBguéŒ%È£T—¶¦æ‚D ¡J騥!È–•vtq ¤.eM@gT‚Š€ClgèvüËo4`¼ŠIF˜1£JÃäÿ´OðI‡3õó}ªËÚ¨L‚Uªš¦å-5çéd&Εºqé`%œsçê´÷4•ðg(Ûm”ÍÔ#ˆSJø! ²§ù=@*8iL_®z±4¶¬].bL¦6é6–VAÄLíÔPÙ¦±éRH¨¬khùß 'APÐrHµ­Oú_ÁÁÕ¹¾‚SY¬ÓiQppu•³$=¯Öé8”„^—M:ÁJùÓØA0–-ÿE%+ÿç‹ ´`˜v?i;5@B›¨Ê¤{^ù6鞃–ZÚ[oÜW0L¤Ó°0sì4(Ѻiø†8àÙNKtçø²î¤öË_ƒ…ÆÀÔËÌd¯û¬Òéúë¦E­‡ÎdÝX˜@nÀpÑÎB;4éžñòÝ2´ñ[{ЇdSÍ15,=-ðQýN|5Ê”•Õüqjmªmâ9‡ôT~\!L0`rhk &Æ‚‚n™íXÏ´žqÐ:8ŠX)+†>ˆñj„@¨À]?}2EþÀ]ÖO#™bAkµ§|ÉŒ… ³õðP¾ÔìÆ‘£%´/! &Nº)-Ýw7T&=) h]¼°dµ,«øÐ¨¨h<ÿ0n2òDµû1Ä 8ê+£€Ã ü+imºÔ(L1ÝJ )JÆ­PïHh‚Æò™ ½ ˜!ŽÀÃ(ždC{&¢*%0‹³uÆO(°Ôtã,PÓÑTU‚{ Rt&ÉÀ\B¨L°P|kTÚ{ àR ê=•J˜R1Ó "•™Ü½ÃÚÂÕ&}(•`M0‘ èÓ1½·ÊOL£„—#üé45J#¸|꺡¦XiÔ·3™f¤TW:—)œk@A§1º‚³¨lbTExFƒ0Ô®ÉX÷Â^<çɃbnæ•K²W›t„Ù]G†8Ìøj#ô¦'i¨IˆÄ†¼¤KåGÁ©*¤&¸iøKD* i««š€~ _ƒ’Ô}zaÖþ¼Ñ=cf«—'Ámo¹ð‚ òUÃkÎZgè$« [Žßáw49èðRž‰é^"@¸MM£ß ǹWhž|Y‹Rù§:µ‚l)TÍu =ùòÖÞx}üAËÖŠ:ðžÜ9%mŒïÑÑï„02œæ›©µ¾7Ú‚Ó'ÿ Ú·Ë/d©Lq³e` ûK ó%<üŽ€¯W¶üÿ~Ùú´Õì ïÊ´ò·„eôë%xÃ0¤¦ÝÛ[îþß›ÞüU᛿Úq¹ºeÖÈ¿ ûï}–>ìïC.½xMÓŸŒ#^•)14táÅ!Ê´Ï1êc8½AnIA@ëÓФ†ád•#ðÔ‰öÏÓUM·ˆœh%–z(œ®®E:8%áÀVvhp^8Åþ"¬a»úW~¢(ÿö‹m¨óáé‡1*|V%\Ƚd㳈µb#hjj<[`däm*¸œÑpΙ筲†{VHÂú«ß€ˆ„ç”i ÑOùÓž—)i5êy^Á‰ð“q€[B€f¤‡A„ f(²í§Sü¼¶ÌQô ÿÞ?p ‰ž$úÐðšÊW¾ó/ÿð/*H5À$ÿä_^Së^ZMàíüz>MZ9k€p7…tZ‚ ϽöœXQK/ý‹Yâ™UÎ?1”d•í{ÁÎ×Tn•³Ë±60·Ô®¨¹E.KP MC} Éí½EÁ5¤5ÜÃü›‘lžó.9™bðMÓÛùSM]‚œ&æ~¤Håß0âÚ€4LÏÉ2QX3ø(º¨’ƒË¤ LHG»à-Sç- ¬î1Œyw‘ÆmIÿòŠä¦§˜Tn¤ÿ¸šÜÂN±kb-ÌîÎź¬dÅš·ˆTÞ„ìwbGí’¨Bay'šHÂ{C1Êä–º‚Ë“¼­TÎ&(^­"6ÕÚð:#‚¤½w>—öˆŸà‚«˜„áû™u:õþ±¡Ð"’zü®¤ª5mpÌà8-ÁÏágŽ@NÉÝL€ö ¢wÈaPƒæÇ r™¯,uëmHý²¬ åGô6zÝ>Ä ŸÃk¼¥AAgøYµaé-}òÒÑ1Þ¼v@ œv@ðœv@ð„vðjsÚa"Ú¡j´*§R¹íµÃÀÜvÚ!šÛˆvÀ>ĵ .¡¸4ðÚ!]ŒN; T\;`s í@vŽk‡d™:í0¬L½vX¦^; |B; À†i®bƒ´C*7½v–›^;°¹awçbÍj¶ò¼v@P^;pNdµŠ‘×\ÞÚ!i³ÓœÍçjqû¬ïUxm‡{ª§dœ@ÒHþSRÕ‘ªpÄÞNŽ…ÚB”…Û:J‘M¶‰ø“ bcËF’}Z/º‡´k˜Ôyj¼ ðq D÷èÓ‚ZQL 9<¡1'÷¿ã.¬# Sü¤1t·ŸñçkIAH»ˆ²fÚ<®]|…mN»`PF»`xF»`x\»xÑ,2Úcxí‚Qô ^•Ñ.ÉÜvÚehnWÚ%ž[^»¢Ú×.lXí’)ÆJ»`TT»sqíBwŽj—t™VÚe`™:í2´LvÁø¸vÁ Ò.lņh—dn:í207vásÃîÎÅšÓ.|åYí‚¡¬vaÈi#«]ؼŵKÚæJ»°6Ÿ©]pÄqíBÕ.|U^÷½®ð§µý‡*ؑĻ\‹ lVk`ЭÁžËÀWpµfæCC>w稵Ÿñ¯KAgøYˆ©i/¼í߉ÁAôÜiTþ!åˆÁsDà ¢×2ûc"DP‰­Ê}*·=ÑÌmGôÑÜFˆû'z\‚è¹4ðDŸ.FGô'zl.Aôdç8Ñ'ËÔý°2õD?°L=Ñ#|‚èQ`Èž«Ø ¢Oå¦'úa¹é‰žÍ »;k–èÙÊóD <ÑsNd‰ÅÈ=—·Ñ'mvDÏÙ|.Ñ£ˆD'z¶*9¢çF’g²õib¸™;J,7cÞa¹¢< ó6Ï£”ãQÏñ(‚'xÈ$Ë£áQ„È£hUŽGS¹íyt`n;æ6£؇8¢à<Ê¥çÑt1:E¨8bs %;Çy4Y¦ŽG‡•©çÑeêyá<ŠÆ£\Åñh*7=ËMÏ£lnØÝ¹X³<ÊVžçQåy”s"Ë£(FžG¹¼%x4i³ãQÎæsyEœàQœÀ8²UÉñ(7’€ÉL’G¹£Äò(æ–GÈïÎQ“3yE˜ ‹"t†D:ΡÎR(‚ð Š@Ã-Êðg*§}ÌéŠ=£9åÉ;åNWœ:¹°Ì™®ÁŠ8(Ê›ØXœ6ɶQÖLgEšÃŠÓqæÀât”‰àqÆD1 "L®NCø2••Ž.‡e¥cK6+ÜÖ\˜9®dËÍR%B²LÉy#JË“\Ââ4™´¸bIÎâ3IçHœ¹(E²ÅÈ0$7xü¯Ž¥’;8?bJáèaðo­u¤cmž­};"t†­ÈŽÆdÙAxvD aìˆeØ1•ÓŽætÅŽÑœòìhí@vDqÅÙ‘KËŽé¬Ø¢ìˆÅÙ‘leÇdqVì8¬8;,NÇŽÖdGÓ väê4„SYéØqXV:vd³ÂmÍ…™cG¶Ü,;"$ËŽœ9vDá±ìÈ%,ÎŽI‹+vä,>“Q°qvÄ™‹²#[Œ ;rƒ(ªN±#wp8vĔ±#Âø­Ã¿ UûÅþoÙôj#(³ú•Ù·[ùßl/náÕÿm7[Æé²–áUû«ªKÜÆ·h·þËÖ‡bvÿ/6¯2 endstream endobj 407 0 obj 3913 endobj 410 0 obj <> stream xÚ­][³Ç ~?¿â<`°2ôý’2/6ئ0¾„·TÅ®”ªä%?ê™ÙíOêËYSËÙ=_«Õ’ZRk[ƒºU‹5ÞÓ?>¸xûß_n|ôöÅMN·A¹ÅFûûöÆ/þö·ïÓuÞoàËOìbÊëèÓÏ¿Þü³¼FIG£/†á;déïOdŸ Y}[þÐj¶¶5Dï–tLäÃ%!x·/?±ç‰öŸËDêöýÿÊË?˜ÜdQ>{óäk{«õíûÂ%!ˆ½BÔ…%†tûþ÷›Ï?*¥âïÿuü^+³¸ÈAÏËËWååu×qñ13øË diÓü¨L¨pÖ,6gU…szÉÆR~©"}W¼!™kÎ~yù¾B³èÀç|s§–K2K&Í!<ÔïÊˇË1†L¹¨Ǽ]™ápCÒÊò ?–—wÇË[¶ãÃ<Ÿë‡ƒ¿<ºÅ;¾ú¯*PR‹DôñcÊ‹ †¡¾®@Ù-ÚFÉbTù÷á%Ø’Üœçó¾>TSÉÍ’ÉF˨AÆ/ÎpÃø¬&\ ÉÖg'ÓJýÉ×¶£õyÉÙ Õv•ʪ¾j–¢ Íg¹«@¤ ãê}ÅáY“¹-ýx¶†S® ûêýM¦mm^´)NÎÓ2Lñ]§O~;B{us¤ÛãíæÑ^Ðß_vO•/%ã’%ó¦%óðd ;Oᯋy~¹_,A6&îÕ1°R·Sy ‰üøy…ÒvÉä½õS J‹)– ó¦ÿ¡‚“Ï e¼ç(œ/Á‰OÑpÖú%‡8XœuÅdtqÖ‘ñ©0»8K!-Çàk®£¿••%wQL’1_;òÎÆ›{IÑDÚzÉ5¤X{#µ$ÍEÑe™FŒæ´$Ç—óŽͨ­Ò½–¤S\¦V¤‰ ˜„>vý›#Þ ±Péû±E[bõ¸c¾L^¼ç»A×iB ßÌ—¹Ô›: ‰ƒ°7g¬GQ€HK«ö^J‹*jЃòòçòbkä)\^ž1ê^‡’¾1øêÀžÕ|lÌr«æù¨‘8ÀW+±VqJ*/~ÃóQ^SNG…caEÛ•­v›_›“­³µtìÈê(µM‰óÀ…{â—˜-:C d1Xtô>û‘2l\´ã3¯óq½O«àä¾àHJrM”Ì€Ì*zj*‘"øé-`=Á”™V“ ä"3·‚‡LM;·¸°x0âòžé†á®ƒLyyÂdsĘžlLKvÓ&lhçÔ2aivq­›&•H>$Ýм¯“]\æôÔ Jït™H  ÖhjPÜ InÜOjâVÙM£è)›=˜Ë²g—Ö: æ¢æå`P9˜KLŒ‚9®Q æ¢ÜÚÁ¼Ksæ"ÍA0ÿ …ŸhJáœ-Ö.‡õRŸa¢º"kÉ ý<;”z¡_)$ç%ELj´B²ªV¥¸­*^XÐÅŽ,C¾¢­_' 'öSÞ ºìQŽìJ{†ª3rE)qPÍyÊÌ øïòDüÐ(þ|ÿÞ‰ÿ6ã?`ñP“ñFâW¶{üŸ“íÿ›²mÄä¡ÿaqø/‰AŽÿ}eìñPíøä:ñŸÍÜŽÿ=5ñNMGüŸTÓÿ߉ÿ°°¹ø/il*þ÷dsÄÿ9Ùñ_”8»´Öaü5/Ç€Êñ_bã?…ÐèÅ ‹…D€N®-ã’µ%]š94;‰€Þ Y]ôN¦V[Ìú}2gîÞ!eQJ c[K‰¸bëe'µXoè¯& KÕPÔ²ÖÊþ¯¶°â²õ€[£#íh¾Ok±jò¹13З¬‡œ¶œæ|ÖJ©å«ÜRª€©ÓŠ5H0ÌÏuâÈõ2ÌK,u¤Ì }÷!B rìúó&ãÊœÁ»êŽ»¿êÓàþ*‘DÌwB¬Ü•q ù ¦sr>½Åt®ì-½>^j8Å¢ 8‹?c™KšøÕ!ŸoëÛ©nQ‘/¦¾†CÀ |µ#¢D~A?àaD¹Tè—Zû|³Y+ÅýÙ²§Ü³ô¼>åhZçé«C /ë ¥¸ÆôV¶©OÜàÞñb–òJ±º1årdÈ ôSíܶ;†LñÜòžhÜÞ%Å;aSœév1ÎŒÞÐ/KÂŽ ïñ®o¹‹ 7õý¿Wõm^:»8ߟÝõ ö~‡wx•ÏJ”íjAÇw˜šÙh¹™Ê®…ìpqa ›’¿åØ“ÍëúÚ/ùS?Øá¶Ü:·ƒné¨å37}~oÏ–[‚#«våtÝ_ªSäx¬;:¢iÁ|`gbGîVY-ïÊwœ?Gü ‚«9,Ñ* ¼žóåÞ_+ßp¤üõ Ó\4ë­Ò®å¹¤—œCßg8úeòœ1Þ]IÙôÀ»8JG­p_Nà.pî¬O³ŠòðÐ×¼/·C½éxîçgßv9°¤Ñv⥪(@X ‰”%…)­où|uœ¢s6ýe H;ȽE†yç,Í0Â)ÕÓ[Š;Ó$6yòOà  €.6!Hl*–ÇpVcP y°WZ\,± ÒÃØ—€Ÿ³×d4ƒ€|æ÷€Š·—¦˜ëR|²NP¹+†pÞ$ÈHèRÜ>; d±Î <ù;´ «IG9HvfY‘%£´‚}ô[|ÈÚM­½ìµrâªû{ì¢Ê€@gP ¥­4iͧ=iò÷í^¿8uéƒ ~þ€26§õÖ3x~sjzôëí÷uo"%¡Ä„BMÝ›RÚ9Q?¿Ù©ÓI¥ô=lÔiÏmsïcùüâwš¿¿¶Q0Öäã|éŸÉéž .Qô* Œ®t.î40Ð75Èoy€Ÿ·ø¹Wéøìëº/ì²Ì•JÆ ÄºN#§¡ùR„6Z´NWЬÔîÃ×Þô1ækoú`|IMj7} RnúðJ­çKo—Klƒ2ÕΠ“4%š¨Qe+Ž0¦ÍLû35hªl¬Š)óaƒ_´IlŠˆõãh9³°9ÑË)­•ÌúRÌ60d`6×›¯$ošóô†E¦’véħ{U¢^œõ Är%,ñ®¶Vµ3Tç‹Ö¯õS±KQÞs»å#—ÿ2n7÷â¶Ü„¹#N4w ̽Oódî"Í{•­£ð«¼Lí~á„_ÜÞƒ=“×[ĉÛA Òx²œÅ8¼+è(+R4‚És¢ŠÜå¨|ÿ8]<7å…rU}À«†Îr›Èxg‰}¯^jgzƒ$y>]½¡,¥n†ƒ FK¦j¹:*Œ^ÜP€“7€FªKsßPÍë7”DMÞP(˜ó†zȿԌd †K3É;À–ÆÜb„(€Á8”Aÿ޽€FÊèÒÜ•!Ѽ^5Y€œS )À•á™;rfJ¦|ÉÂ,ƒ}]#ØÃS¼Õì½Åîcb »#ãE›:§àdÛÐÈöº4wÛ“h^o{5ÙöP0S¶ƒÒ.úó-‡ÖÞ¶qboh$ß.Í]¾Íëå+Q“å È9ù Q¾|»‚V:Ûõ'nW¾eä­EGÊ©­8Yõ©¾KsW½DózÕKÔdÕ£`¦TƒvÕûñÖRibkh$ß.Í]¾Íëå+Q“å È9ù Q¾|kV:[ õ'n­Á–Ù·VyÌÊLùq¢ê4P}ŸæIõ"Í«U/RUÏsŸn.›Ý’Râ+œ8¡á˜v#"›\¹Ø‚ÅF.D‰\¹Ò>`Ù¨¡bah¡€“-@# íÒÜ-T¢y½…JÔd EÁ *ˆ+’*ˆ™¯X0yÎì‡G§Š…T±@X±@X±@X±@X±@X±@X±@PgCy3çò'o(6T—澡$š×o(‰š¼¡P03Ñ*«Qèv´gô¥h?Ré¡z²¨™ê/âdÕh¤ú.Í]õÍëU/Q“U‚™R= 'Ò«êaTGõH_T=W©œè‘ï±¢ê'«@#Õwih^¯z‰š¬zÌ”êaЮúÐW=Œê¨鋪ç* ’ê‹„Ý„ê'ªAÕ÷ižT/Ò¼Zõ"5QõL03ªÇA»êcWõ8ª­zF_R½ Ò(ª>¦©X8Yõñ^•“>Í]õñSVNDj²êc³rRã£Z²I ÿ¸™õš‚zÏà²y{5“ÒDJŒcfžÁ…cÄgp!H|‚Ú™¦ n²ãœl}Y_—æn}Íë­O¢&[ æšâ[áŒåÀ˜vq‘ÍâÅâ[°X\@”X\@P\@HÇBËågü#àd ÐÈB»4w •h~ÚÛ?8…xû‡ñ!Ýþa”š·Énÿtç;ÝþALûö"ÅÛ?oÿ H¼ýƒ ñö‚ÄÛ?oÿ0žÚæn,:d}ê-õÖ^öN†#Àðíc ¦áÇõÎuŸ&y7oŒLóþ®Ùúõÿ/©=‡øg+ˆèìš-{Ĺﯥì°ŸÝQÌŸ#ÉŸÝáTéÚçŒX¬¿ 2}Rc"aø”Gw¸µÌÅu?ýèŽ.çGw Fztb¤Gw F|t‚ÄGw ¨ýèDÝÁ쮎¾4Ió…ÔN#lM«}©‘MÇm¡ã4Hy&‹œ#4Š‘]š{Œ”h^ŸÅIÔä,sv½óµÓýµàm–¹éµ˜—/þÈOpê3Ù!Œé·˜ÇäØˆQ‹y.–c ÅÜm.@·š7‚ ÉÜÑ–áÓÕMæØ·Qú(J»4愼']«°¸¸v•ƒQu¯þ-¦1†¬—˜æù¹¥¼–Y¼æða÷œy}ˆü€OòtÂÒjçZš)gáUƒãHk–Á¿zºÓú)DÖ ÓtPñŠƒ^b«TPaV¨ÆÆ…R†¾lJºtLì(šF¾X¡ÃÓœžÛFÝuÈ[ J«ûíûmƒ´ "\lDÔ6¨‹E1\ýqi q°ŽÒ°D¹;‚X× “º)Ó ØiŒ” !|Ô4h3g¸Ó4Xþg-qŠ©¦A§ød¦AÕÌz —o,Í—ˆê· –È$Ø´ ê%™ á”Ð2¸õ!ŠltZµ²¥ŸÚÿ4åb9žÚÿ(Uµdçæ>þÁ¯>(8þm'¶½95èéõ›¡z9ÅKbüƒ ~ñ=Í¿ŽßßÌ6蕘WÒÂëôp´Ø ‡ ±AA¨A‰Í4è±¥4ô®YÉÜîÃ×Þ 7ækoÐc|I zj7è!²ß §•]]À¨D‡8ñø Áñ£Oótüi~ÚN!–èR‰ŽQj–èÉJtÝùN%:Ä´KtˆKtKtKtKtKtKtŒ§æi›¤&¬`¢±f`ë]Š'S—(^}Жˆ‰çlÉàžÀÅkn€‘n¹dþ’ râàÝcçtÅ … ÝpŒxÁ 0âý6Àˆ×Û#ÞnŒx¹ 0âÝ6À´7OS¡`âæÌ`ót)ž6DñêÍ#7Šd抌ô}áÚgžeXi_†@N¤»€{¾#¶|f¢ã+N¹j€5?ï㪻¶ÏOèª%b¦Ï–«îõ|Vcæ.P ^ß`M]nì*²<ö¹ÜÔ °6rºS¶\ ¨1ïäÿâµ<Ë–¯ZjôÝQ°«’_÷S¾z¬Ñ¯1y­I¦ª;ûÒmU¾ª1ìê§T¥|ÓÁ`átr½»ùO©ÑÁRÝÆ¼!sqæõµž7ÜÅGtÿëÍ·ÿ&ºÿ§DE endstream endobj 411 0 obj 4920 endobj 414 0 obj <> stream xÚ­]M·½ï¯˜ƒó4¿É¬‹aIvlÀÚ"ù [€Ø¬É%?äôÇ _½&{Û A³Ó­Çb±ªÈf½â¶ôE+gC(?Bôéòß_4Üzzûõ%&«r —Ïó…¿üö¼VÉâÅ »»aÔõúÚlùþëÃ?ëu²¥§Uf²æÖ .fØí†™6™Û÷*Ó\êŸ2†ùˬy þ¦y ñNN{á[ÍSp·^Öïµ}yÿ¿úña*n½oÞ?|õÆ]Œ¹¼¯*DÑ­ õQ¥˜/ï??üù“Ö:ýåý¿nÿî•OY`¾­¯ëÇO÷èiR!MýÝ=Æè¬l"?iœñÊ8GpÎ68ëTLýQ›•^€~h@®Œ•(ö]ýø{ƒôNMFßm–iŒb¢/~´7áõãCÓ&Gå&©ðÓU·ºÚ*ñ.~®Û>žÄp¬+ÖѲ³›‚oxˆÊJ'¿n0Ñ*+-ôéS*óÐh)éõã«%&?ÚœTʞńip“SÙF†Óõç›{°ÓIMÙq5~Ú|ÚØÀÙI™y¤õÆÂ,sÅÂÚ3½»êsuLÓA°eâÊ[P™JÓÄ÷£„Ç2=ôÊÏ7?/JùÚìõû‡T\’+cµuá Þ¨ÈËß¶åǼ2Î ¶Ëy™z[þþ².?Ó½]¼sÊ”Õ)Ù¨B‰ßU#³©õn[hä4ô1•ÅɉÖ!}y¸ ú¾%ëú /o³s³ë·Û½7›ZídôYå0 a½ùncÁÖ%‡"'kQÕ›|ÒdÙ=K-£Ë#ÈÙjcT ƒ6-¨,4VšùjÒwíZ\:ŽÒËüÒFÙ*SѺ.éþ‘â©ggÅò’}Q?¾¹Z ±”G2˼0yG¦» ¾*}sç7·Õ°]|‚Ò:pij® ðÜÇUü¯*´«JRÁJkæÅ¤ak‹ö­Ñ¤ø©na¢”ÞÆUqrÌ¡¡™·‹ãcž”íàVÇ#Ž:AÇ÷e.ާ2O;žJ£Ž†¹9^ß®õvóU#$E•s–#ÜôüÔf1åñ4CÐÈÚ]™«µ™ÌóÖfÒ¸µyÎÚ8Bi퓤Ŧ{ *à;ñ¸4eÆ‘ ký¼8‹àú„‹½62X_µó’§e ju²eƒ& Û ¥?4÷‰!(;È}ÓÏ}Ms±Ü§ì­ιÖ2^i¢¢H~r´$’Ÿ\ö›B}’üxåŒìs7û %5èQò“µT¸“üx‡’Ÿldgä'Nrô"û‰ÄD2ý & T/ýÉÅô‘†Å‚w$½)t†w³—Þ”í—.! æ’”™ãË’²²~Š-gAnÕ^{íÂjÜ.B&– ¿q<%zÖ…ÜH ¯Í*ûv±Ê.ÉÏ*Ú§¥ßµ¥¼QÁw—aéúÚ:<3ˉ®Òöd–ƒ­i–ƒ šå èwe9(ìH–#†²›åœ3YvÏRkÍrÆj­YŽP‹e9ÚÏrÙÏr¢)+j´Ã,q|û Ñö«+sÝ~1™ƒíW‚ý‘ãz8_§s]¤6©þ”Ê~Ñ‚¢rÑII"qר1äzݕ͋‘½£M±¡ììÇä”wA€Ä^C“>¶±jËÚéèc *ëÑIìäB ±“ I†ð£Ð~ öbxÛ`O,ØצÁ©à¤°Û"÷W¡€M®l7³hó#>z+@ß·Om£¦,{o¼²ÙLF‚žZÐTCQ€ÞQ‹”]Ôpú#h0ýû2—éOežÎ¾¨4š}!ò.ûj×`”õRϯqyÐ5þÔJŠºî<“ƹ^NJû,í9Ȭ}™7¾lE-¨øÁHµžh”¤Ð„¢¤+s&ó|”0i;'Ër0>*®+5îWlŒ¼‹CÅ•àdgâJÉ^\W±‘,®”Þjp¶,ºa\ØeÙ'¸³eÆq5:gËtŽ<ÚçâK]ç#Y׋ø·*…¼NÛq­åFœKó—¥0⃾?æŠNÍ~ïë5âZ·•’rc)æ\¿¬2ãt;Y듾/¦àå½»± ã*gù~´ÔâK$ÝÑŸWjÁÖ´Ô‚ ZjAйRKpÊGÙc·ÔRÏVNY…0V•ÍÈI“e÷,µÖRËX­µÔ"Ôb¥í—ZÙ/µøznÓu”­ž\»sŠZåèhw7VþŽdæúpÚ‘ùB¥–Py’ º€RKPÎKe¿@lJR¬´ÔE[;ÄJK··¹Ò‚ýJ "i¥A´Ò‚ ZiA­´ ˆVZD+-B§]–«ÒÆÁuÎЭ±8ëÅzWæëLæ‰Ìc*›pË¥µ™‡/ #p?å,»“Z ÄF»,Wq“þè€Ýê =Xv4rEWæê &ó¼+˜4î @s4껇?>}‡ÞÛ% DL0¢A”nD¥4¦ݤ-ˆ£q‡ AÜõe.qGežŽ;*Æ0Ì‘¸ÃFcºq³oÖãy ‘}»2Wû2™çíˤqûò˜}¡µ/NVtÊîdÞc“•L>±¢éâ6ÇŽ;@#Çwe®Žg2Ï;žIãŽGÃr<4:Dçb£}Ç£têxéPJç:ï%ˆãŽÐÈñ]™«ã™ÌóŽgÒ¸ãÑ0Ï¢s³Q~ r„c:›ìҹܥsHé\1\Jç"ŠÒ¹"t.B^„Îuu;aúGåÓ§sMé\UÚn=ëŒGáMp}5+];à Hе“7R=~~’}vŽÂ[|x>I;tm´¼‡cGá³ì«ÃÖ¦$G/‘£ð“Ôûž­…ßðÍ%<|$á18 ¬›;9σufcMÊë‘rSÞó¢äFVÍeº)¿],ü©-6ù¼|iŰ÷æ&õv±HuFoÇë]=WsO»’º9^ïôt;º»8ÊÌÚ)7…Ðç1³Øš2³¢Ì,‚~3‹ÂŽ0³b(»Ìì9“e÷,µVfv¬ÖÊÌ µ3‹ }f‘}f¶–£½±ÃâèÆ AƒU_æ²±¢2_–™Å.(3+ô ̬´ËÌ"™Ùno33‹}f‘”™EefD™YQfA”™Eef…N»Ìl ÓÉØ!-ƒ8ëÅzWæëLæé$‚J£I„0Ì‘ìué@1üq†MvM¡K4Dé@Q:Ac:Ð3û#q8wÅ]WæwLæù¸cÒxÜ¡aÅ4êÇÿ`EÀ:s` ÐÈ]™«+˜Ìó®`Ò¸+yÌШï þ¸"€ÞÛ_0&è §!Ÿ®ÆÛŽÇ€F1Ò•¹Æ“y>F˜4#h˜C1޳÷¶øm<4²oWæj_&ó¼}™4n_@³/4:ÄÞ£Sö'zN,9a(‰k*»u`b!Ž:AÇ÷e.ާ2O;žJ£Ž†9C⊎·XØd—ÄEà.‰‹@JâŠáRQ”ÄE!qò"$®©Q8õÏä"¦Oâ"𒏳—¦ÌD[cAâ¼0Ÿ³ýaTóEH^W‰R¡=}×£N¹Ëñºâ`/ຯ/£7¢Í.Ç[fŸ“]%yË¢eg»$¯¿ûGøk\ÛÊD’îkIÞ8©¢¥@õHÞú‹$*Ú·àT‚“Ù|çDnTÚ®Å.œ”5žÇú—xÚNºw{­W®9çZïØí¯Û÷…ª5ÁÞúšòœ±MKyÃ6G}ë³H¾~³´õ]*e"ºéÌ S‰ÌlDk`iã•PGÐ÷øè­‡ôt’¥-+s’=öYÚ r V ai£ŠÎ4YvÏRkeiÇj­,­P‹±´Úgi¹ÇÒúyGduÿ…Œ«g;§PžKV€övNe_Qß]Ô—™ë+owd¾K[ZïDÀÒNj RY`iÕÁ’M[¢ÖDš¶ÛÝLÓ"dŸ¦E$¥iDiZQšA”¦E¥iDiZ¡¡i—`/ÏåîK(×`v‚½+s v&óùi‚óõ¿Td ea$ãÝ}ãByºú(%s¡äFñEÇS tà• S,Ï'í9äßfßæ4^ÇrzÎ2Ö•¸86¿È[eg¿æá;e·æÝWÊR¯œ:0Ô§€9îR4äø%Ý›_¢!b›¼D1ì%ˆa/Ñ@ }‰‚èK4D_¢ ú í¯Ž1ââH'ÀèÌ`u%.ˆI<;˜,:Ð"}Ö¬8Å +îו¸ÒY ýà"VËË#fàƒ®ÄÅLâY0YÔ<äh3ð}¼ì€×8Ç™E }Ù@²Š“—W¸3 rb>áÆ,”„0û¥CWÙà+‹HÎë¥%]~|øO%¬JR«/i>¶4ùëur1ÿ錻»Õ@×ö¿>|¼ü»Èý?—îùF endstream endobj 415 0 obj 3684 endobj 418 0 obj <> stream xÚ­\[¯· ~?¿â<8½­¢ûH^ _’Æ@ìcÇvZ¿h‚")оôݙ]}äHs6FÑõ™É'ޤ¤DŠ3öÞšàS¢RŽåþ¿?ßY¸õðò®Õû³ %Ýÿvº(&Ýÿz—R5Å;åú¾¾“ŒçKëóß¿Üý“¯‹·Ñ ¾4Ã+ b‹k¦œÅn³XwÏÿ£Ñœþ8¡¤hêö ”¯ÁÕ x}'\´þͲ÷ïþÇ??‰yÓ§òé»»/_„{çîßq/ AÝc¡4e%×ûw¿Ýý铵¶üùÝ¿¶ÿî¬7±HÐ3þyÎ?ßwpGt”&àßt Ÿ‰)ó“õý³ƒ3¾% ;\´¦?QŸ] ï:Pr&KAßðÏ0;c‹D¾Þ榟–êL­QÀßoÒß,—×m<ͼoN´yX:#ᤡ6ÈGdþùÈ?o·Ÿ1Oj¬|؇­ƒ/;xñÆÕ"àÏ{P5ÎJЧOªC½¨/øçËÝÁ]·6˜œ­¡‡5uÎ gùߨGc£Ó{ñýFj7 ‰‹º®ùƒ¥šb²&¥?.,ýY˜é+i£|À›Tˆ¹Ttæ^IxMä¤~¼}îÔbbÏßÝ5v°%4ã<û¯”šñì–Îw~½Ü‰îì#OM¶Ë“³zIÿÿyuBízfbJäÕ¨ù…ÊÖ'·uìõæm¤)ÆFŠ_hýЃ¢ilúö”¬5žÍ@¹è6³Ï¶{/¶nõöX2yùÄ<2ùLe[À¡ˆAMáÆ)sÖ=ª_ÎÑRü~9ß éƒìWï׳‰^NÍ2§¯{§Mβ³g³½%^«Ø3ØbJ-»ëÅF à|ï—-|^€žðÏÓeÆzê¹±‰Ì`iàvGf¸^:}áóéÅvÒ-;ÂþØûRe¼§G,Òÿ°ô w‘8—“Y×Ýڊ嘵 ZIùÎ9Ã[!¿W'kr SFWæs%Wt€yÄ©Ì#hÂüPæÊ¼*óVæUa*ób^Ž0VæÓylµÏ¼¯1¯0šTæ‹=dóˆÓ™ÐŒù‘ÌyMæÍÌkÂtæq^1Væó˜yh5`å«ÌKF³ÊéUMKâ ¥ßÒxÚȾ>éAÕ¸ªH›“°(mÈŒ*7|ž#Šœš×b]qŽaÍùª×C·¬P;›ƒ½é••6Ûäô¡‘ãPúô5&ãS’ LƧ"çêèý¦í…ÿõ»û¨MÛ—zP¢Å:ÐÅËýMt€b'å¾G9 з=ˆ“{òá½Ãsœè’ >/L´§Xhq*µÆòö÷'95©M-ï8‚D{½¡Ìà,YiÔeÞeŠk‚. " ²›ò*Êè)X­þU)ôåÓ{AÍ›åL£W{*¬†<‹IUN•ßfåSçä­Jpl>€DªÀ<÷Jþ=€4ÆO=¨™ÆãÈ¢¢ç½¿qä%¢ìÒ74ºÜtc¸^°«bø½ç û‰í¹Ðh“ §àâ¹H˜ €f8’¹ &óvÔ¤éÈ™\7@é G Χ4À" p[¤H«Ý‘-àô-€f[²‘ÌmK¦É¼Iª/º4¡^ð$ÕˆÄ ;yÀVû¹(!_ËEÍ(]©çÆ#»qÄ©Ô#hBýPæJ½*ófêUi*õbbŽPŽ=`«}ê…|z…Ò¤R_ò!«GœN=€fÔdnÔk2o§^“¦Ss¡Þβ¥ XàΆ¨Óhc妬:× ¯åzï¹lH!pŠßÅx?a>Àº$P"zªU‚Dô$Y½ì@~GžVþï#—{ÖÛÊ¿Dc¥ú+RýåèÆ´x"!²[##ç5Ýz9%IDÓNNü¶ [VÈGtkM‹Ïûµ¦ÅE¿´´8‚öÓ∑Ïs¾+“»±33€ëwcGr¦A»»1²^7‘Ü©Y•ù™Òâ´²¤TÄ# Ò.ËÎ>Á@º4/%‰Ýr\´VλȋŸw΋#f?/ŽH5/Ž 5/Ž 5/Ž 5/Ž 5/Ž 5/.ú¤äÅOêȵÙPyñ“º#.áºÛ²ÀŒÓâ¶çE´yÙl[œA^œVæÌx»(0x¸í’œ‘ݬøybØf†~€1 ü€+q,“ýŸK©2•evŽº°>(+󹟓+¤`Eà¿B7á%rrÙ´(»x 'ç99S“âg~iÜvÏrÔÝhiAÈŠ£RiYqaŠZV|h/kVAjVAjV\5ÌŠ#HÍŠmoÍŠ#hœ?D[ǹhf€#™›j2o6@M˜n€€œ àUŒn€z„âtKŠŸW¨Pp…R7dˆS7dšlȆ2× ™*ó&=ˆ!êÒ„"TeÀãÌh \ñ€mŽåıÕ~bTÈ×£3F7æ]=´GœÎ¼«ÙŠenÌ»ÏåæÝP•bÚK‰c«ó(_e^2šTæ­=fó€Ó™ÐŒù‘ÌyMæíÌkÒtæqbŽ0mŽUãc«ó(_e^2š5æ}u‡lq*óš0?”¹2¯Ê¼™yUšÊ¼˜˜Ìc›cÕøØjŸy!_c^a´¨ÌçpÈæ§3 ó#™óšÌۙפéÌãÄ<êŒB‚@q¶ás0l³†ÈÝs0ªç`bÀê9¢Ôs0)ç`yÓåÅ —§P%¹Á› lw€ùN™¸bjŒù­° Ú#èÓP‹-èûí"­b²•]ü»øÖòàW—„N~—7¤Þ‡9›,Ÿû¬Ãš>ïèù6–~‘œƒ>ôWÊ!˜5É+Ý”H®{’r_ŠðAY-mL£çs;ºδ,§üã6 n6}ÌÆíEª›Ï–üœ”ÞŸÛ‘!/û¹s ÉQÖ{Lä*Ü÷Ž¢~®Ú@vÄAÏTä«ÖRrãÁG:Ûܸ÷œ6¬© fù™`&DZ²T‰åðç#¾‘—šäðêlµ_há˜q -’ ‡} 9+Ç.Ïfyá£÷¼5¼qï¶¹Ã)¾±?h#VÂqµŽ¾Î§$~ñ¥™Žœ€Ên¬§‘Üâüq‘_Õ’ ;P"í›™ELÔ'Å,úÇ‘[­Š>‡Ãf)½'>{9ÒT´©g6Yš–ìu=îhÕãüäŠÄÇÌMQ§ówN>ˆJ‹D;eùé4+ñir›hAâSø:ÑÞðç$ÜÎUœ%7Ê3  ÌæÖHdjÛ)€vÖ7Þb%æa(“LÆ9iû.“ª'¿ ãmbÈ·J¥ ¿@!ç¦_Ö -ëNûÇDƒU¨èÏñJ¥ÍïŒ ^Ç¢¤âcâ.ù¸ž2©â˜Þ…9¸~3`³:õ;û OË»ìÛõ‡x.ØJKšíÿÝï¬ýò¶ŒwÆ\û… IíÂÕÚ/­®¨#àRø?JÉäŸ3/V€ì·ç©˜ƒ>¤}k$jl¯ )H¾8Îßþ u‘¢@nø¸sbö ä©È!H-CZ ‡ µ@Aj‚Ô9Ñ'¥@î¬íd#툶N×vÍ´}$sÓvMæã%(ôÍ$E•oçoT¼[‡ÂÇIöó+´†¬Ì¶(OåO•"è@! …Û™"1¡“S\ÚÔÍ]€fäŽdnäj2o'W“¦“ È)¹€×ÉN.€A.Nè#®¡¾ëò„¢kuyRëò¤Öå!H­ËCZ—‡ µ.Aj]‚îÒùcîpºEhfQ#™›Ei2o·(MšnQ81ã÷X‰f/g³ê©Žþý‡6ûgý¢+ÚY?‚¾–ùI zÀý@*räo¶ý³¬;i^‹‡v¥í€'oräí€oŸÓ·£^¼í:ñ}•ƒ6Ç ¡Ñ¾¡tM‰&D®|—tÈÑLå0¾GW¾5‰7ó­ SùÆ)9Â7´9V_gNs§!‰LßéXÔ™éQ1g:r¦òí[¦òSr„ohs¬ ¾‰Qæö-‰Ìý‡ 0‹Á{Á,p9×é1o÷Nùü¢"úÍv.úª?~ô&pQIþG¡'÷˜/ð,±ÑGQý–‚q%KX°çŒä›»ÿðÌýoô˯Ôýz—oÝú »äO¸«[tmÿË݇û“Üÿ€+#Ÿ endstream endobj 419 0 obj 4104 endobj 422 0 obj <> stream xÚ­ZYoG~ß_±)jú>$x±Œ1ÁJlãØDñ[¤€"ˆ”¼äï§j®:ffm"ÄìtûëêêªêºvíÞšàS‚”cÙÿóigÙÔÍÛ]µû\ƒ %í¿öƒhÒþË.EkŠkʸÏg¼ñ8Ñ­Þ?ïþÀqñö@ºx7[ÆG–‘…ÿ¦ d§w$ëöøNÓ¿ôg()š:m”òœõÀùL8l4¾ãFvû/>~rÓEyz»{yöÎío‘K@{H4fSrÝß~ݽx°Ö–ïoÿ<ü=šXªÀœáã >~ž£[3©4¾˜cœ­ IòÁú2~¼Æ¥ ðÏ%åMnI ßQP3-ýD»á㞬ÉÖÔà×%år2ÙezO@Å™, ]àã¬ÎØ"‘W¯DðÞ:Skð^,˜_bEXnœ*À+á¿ØxdÞ§wâ¸ÜýX'Ïóšf÷W ¢<ùbš€\O‡<®þQ‹Ÿ YûVñÃ1ëÅG«Å‰¢ÇÁÖNÃK%LƒS®¼ „É­L g*P ö¥öcìRGŽ\(M°.†|5‚£ÉŠ,—J Òò^ßb»4DlK¬^*MÄÈ"OKpêQ‘½!˜†tW u2Ýág´Þ)½wãD»çoÓÏhu9ûšú,,„%‹«æMŠY^ ,^(¨Dýج¸Âš1ÊŒ3žNØ!Ýí(Œƒ¡c“C=‡wÚ+Ñg(ùþm"? Fò© ´S’îa¡2SÈ( {wËÇÁ±)yŽxãýSr¾ZKÉ9FMÉ9è›RrN옔\œd1%šÄ0>‚­1%ßfkLÉ[ZJÎAË)9G®§ä`Ì&g¿™1œž™1ÐVf¶JsÌÌ4š™Ya©SÐùɪ’Ø¢PP2!JfOhJnM+’HœÑz2s‹[Û Òt r%bŠO Q /)¬Ad!6K¶®©©z¨¤ÆhgÔUx969Häx©8É“ÒæÅn{Y׳‹ÁT+Aï%9¸®È«C/7}«®%%ç)Þ4å:f *¦n ¸@”†?rÐÙä?xs¦)ê;µŒƒTßã,Nw ´å,ViŽÎB£ùô2N£¦—q\0/–ˆ „Ñ-ZyÔÕVCÅ6Ë‚mßú Éß—áÀÛYµï娵y µ/Øû—¡ ÉêŒ& Ê|‰2¦4Á؆6Àø:Ò-³_¤’gkè€ü'?™Þk,ÀâìIÛô1…*V+'@Jg¡ Ð; P¹ U0bë¸6Ë£(  ÙÊÓDVãØ; ÛlÁ–ÖYà åÎG®u`s(¨æ_ ÊbaРñb4- ø#»E¼c´ 4ÿ¯Î-àƒø…ÿö¢%Éì ÷„ £§¤´R’·V·ë[ ²ÜZàHµµÀAjkƒÔÖ©­R[ ¤¶O‹­…UE­Zn-p¤ÚZPµ´ÜZXµ‹±µ°.ࡵÀA­WZ `rÈc¼ÃéÞ‚¶¼Å*ÍÑ[h4ßZ€Ü/cüBKò¶ØYÈÖÄ,)¿âÎÄcÀ@Œj9 Ð1…l<^e.ÏíÎ_ò|úª‹õ?ñÊÞF)zÏm6ÍIÐ “ÍKãSî9þ¦Ô)Bá˜S$§Üs¨FRŠ`%¨ÔJÐÒ=Ojá å: áNš ûõ*$ë³tÍ!ñsMJúŽÔo]Smñ§""f‘¨¾†Ôýz÷7Öû Û}i“Ý1Ù%Û%º=n6E ãúÏ»ûý_@÷?WB„Ê endstream endobj 423 0 obj 2195 endobj 4 0 obj <> endobj 377 0 obj <> /Length 425 0 R >> stream x^í[¬]Õ•¦wÆ9˜ã ¾r±ËÆ®9Ä”c'†œÇuBè´MâJ\ÔILR œ@w0!)¥ÀR“­ %J”¨ˆÚQ«„D©¥ˆ–J/(¯¾újÙž^ýõ²U¬¼x˜§dÔýâŽÞ|óÍwÞy§ ÌË/¿LË!ø·ý•>´b¨Q– ªCp)…|ê©§¤àuzl–E ¶ Ž Ž«NpŸ1ó—2”lpüš:qâÄPRE¤>!JVŠTaÓc=V$UC2Šït´V€ƒ/¼ðÂP&ת<´ CBdÖƒ )¯€õÖT)…„¥ê·NøÐM•Xp.ÛGÀ_»–G‚#„™+³:Á_éÓW)M)Q³1àˆYZÆ› ãnŠ y ëF•3½„8’dö\ߪGŒç±àH¨£æÕŒØ¤¾£tï1ó«îTѯÅnçPÃÿ—{o1Wލ>@R~Ôy¡ØÐòù—õGŒ’LSãàˆú çy½øP8LFb2†÷âׯmi’Š#Öø(5•dŽ U$÷G*kEÅŠËâî‰i L‰êIÞ8 =dØè„¹ r¬JXÑÜÝ‚ŒÙ †Qw¨vʨµÐ® *£ÜÊeÐf¦¼¡‰‚#k*c·Cgàq↟¡ÄzC⇚´Êd82A2 1Å’)F¶îˆ`z e¤Æ­k•äoHå àÆ´H&qý;ÔªCÁ kÂe´HÉ‘Œ×’§l°Ž#á rµb1çÙÔΔ5tY¥ÄÒSz%ºÔ¾ˆ™fÔbç<IèJ•†âeBÊÍV Å›3C²  Ä†‰¦Ù†/F‰lغVËcâH˜$R;GèaYhhkeîÂÌ&ÃÁÍ!Ïô™qëLëLŽª+ȦkY¾.ø…ê^géFÈ·¼ú…Œµ!8ŽT„Š—Å¥K¤ô¡6Ø¿š¤VS_Eò&`ugS‡Yul0™yi¨³k”®·Å…BšÕræ_zQËV@YÖrT+ÿÉŒ—Å(1³Ñô;N\C1KˆX_r2–l>—`™%Ó)4hz7 §ÌDBㆡá(`5- e¡fi-3FÓS-k_#²£ßˆ,V$Ç‘ŠpP¹Z1Ž˜Øòo¢ #© Yµl­AѸôÛÜ›‹˜é" :ÔȘyV:µiŽ˜öÛâ«Aéz†Ã·KÓ¦Y 8`Ú¢d³ÆÄZ£¢‚5ó5BV‡X`lC¡45Ð Úä‹ep$Sx”ž„¸B†M“£yC!KC†RÖZV‘G*BÅŠõq$ ›MÅ¥î¡ÒS̼•ü¯!ôŒí41EÏû#òŒB8ãndü jò„ô Å‘<Ù!?GisXf|1düÆjá¸Á“°%M  y)#\64\G†Æ7Œ·ºÐB›ø/Uªr!¯†öÞ\V‘G*ÂAåj5q„êaÌlz™Éð/ںǙC§}¹ßy[µ|ô2#aê—–-zåØ˜';³«j¨å„ÌG21Ȩ,¦bfQýü ÈE¶gF¥,™BŇÆ5ÓÝø8b% ›ÆÇ‘ì–U$ǑʀP±b}åê¾–åtmsfˆèñ¨e?ƒƒ ÊX²@ó8¢A…Á|ÆÉükó›QêAö¨´â¨I5sßì'tjÌ4¨eý Ž2{gfcŽÁ…3Æ™ÐÝÈqf28’Ý(=Éÿj6ldŒŠkÂ-¼!Ne€/ìBಬ"9ŽT„ƒÊÕšÅ3)½¥mn1u¸˜1 læ(`Q´Ÿß‚eJïr4(˹X/†,V2PÊpÛ”Û<”QnÂ(¾eî›MÊ-²xÄb6¦<ÂÐÝñÖTiŒ†°¡?hˆcjçÓIŠ8©¹- Äãù¨tx8ê|§ WÓ4ÍXûRƒ‰<c*’ãHe@¨X±YˆL®A±éºk±.Âda~ ¦s*iêš…‡e¤gyF™·Ü~sj4oaCä)žŸ3YH5Šø+-ƒáÃÐF2Œ ©2Œ0H ï„kJ!ÙxÅRƒ-“Ô²bÊŒÚTå}®üò]„ÜÎ,uKI$´X‘G*ÂAåj£ž+Ë?¥ž¦¹\]gAЦ Ȥ¨n»¤P‹Q‰LÕÃò´ m™ˆÃ2ŒË#Rž2Ô¢ÙF¡Ådì&£æ^6Šoùûjä1Þ<ñrRøoóÒ´gˆT’Ož±Ô¢£ŒPòr¤X8Rªà‰l 9ôóÅbÊŒ:ÓiFs4:­ÙÀóܶ<ñP ÒB"ùsz•Á+:šá@qJµ™>¼•ˆñùšÃñªýä€ãHäru‰\@NÞY8ŽD®Ž#‘ ÈÉ;Ë’ ÚGã숓Ž#qÊÅ©r¤ÄÇ‘”¤å´:âä€ãHœrqªœ)qÀq$%i9­Î89à8§\œ*ç@JpIIZN«s N8ŽÄ)§Ê9GR’–ÓꈓŽ#qÊÅ©r¤ÄÇ‘”¤å´:âä€ãHœrqªœ)qÀq$%i9­Î89à8§\œ*ç@JpIIZN«s N8ŽÄ)§Ê9GR’–ÓꈓŽ#qÊÅ©r¤ÄÇ‘”¤å´:âä€ãHœrqªœ)qÀq$%i9­Î89à8§\œ*ç@JpIIZN«s N8ŽÄ)§Ê9GR’–ÓꈓŽ#qÊÅ©r¤ÄÇ‘”¤å´:âä€ãHœrqªœ)qÀq$%i9­Î89à8§\’¡êÌ™3 þ™nœ>}Úq$‹“Пýìg‹‹‹/ûgZ9pòäÉ¥¥%Ç‘8Í3ªÀÔ(rЦ9 piš¯SÖžãÈ” <;\Ç‘)W€f†ï8Ò “mÅq$YÑÅD¸ãHLÒ˜-Ž#`zÿºtéŸLKÈq¤»¼ðp¤‹#¯¿þúSO=õì³ÏrÑt_}õÕzé¾ Ç‘îyÞÃSÄ€cÿþýWüé3 ø·U4D襗Pâ8ÒC«î~H)âÈáÇŽ7ß|SìbçÂö¸÷Î;ï<öØcüm¯‹Iµì82)Î÷ªßqÔÀªC1Ýps|—$ãYPq”¯Qp¿à§ñ)™¸29ŽL\} Q9vìØ(îã­ð±_A FÿrÿĉüKÂ5?ñ—¦,DTR?ñ¡$¿úkîU¡AëKëÓv¨Õ”ò9Ž4ÅÉ©n'EÁÚeÞØ9©ÖÌä‡1Nˆ#ʪpD ´cDSüªpÉ~¢$qS˜¡ŒaUhA¨# sM”!#Z%s‰V4)–"ŽÈ)0?ByV0Ÿeq$ãªXž…û†û)ƒ#¡7dÑMˆ/4E]ƒ•˜Âq$fé$C[¢8büÅ\q ähÈ/(Æ‘Œ«’ÉÎZÝЋ¡ÍGpFBoHX#ÔP8cŠeò8ª…ãH„BI¤äp¿#oœÄ–|mG±b"[{æ_> ‘¸~ÌKŠV3G¢MJ„%‡#JŽäí³ŽX V2ËÄ5&ÈСk[~)Ì1¬¤Æ¿Tì8’’¹FKkr8"‹åó /W±dåMdÀÊwXä]j©¡ âš/B?HýZºDk7aò%Np‰S.‰Q•"Ž`« ‚’ö±%[B KUÈ¿(À‘0£Áu¸îº*¡?¢½*‚$]˜ÈíŽ.¬µ˜uÂq$fé$C[Š8"æbÛ¸8CsØ0¿Ê0A‰ “œ|а°~åff›Yø/ÍREëÇIs‡ûü¿'"ÊG’±Õ˜ MGês5¼Ôo0ÅGR”Zt4;ŽD'’n ré–ß=ímšqdèrOåòt¾‘Æ¥ Ïõ…½È¿Ð‡_CçÂJÚ#y:*M ê¶Ð ˇÇ,Òµvîí%µp‰Di“‘:ޱgvuÊ¡·ÑûövY2†óä‹l›_ulbø0  ó‡øIäQ…Çmô¼7õ轆Bªºø±Å½ó{õݾe;†7ô³eý+¶°wŠÏ?ÿük¯½6Á±e¢ƒ %á ©á‰Š8¢`$4~óGh<ó-ÚÔªó¨ü¿†ñTøFk&¨6Þuu¼ûî»LΧN:v×1àkÙºzëµ³×. Ž Ž, –ô=>8þíÁ·õå_~µ<`ÅŽŽòÓüEóÛ.ÚFSósó‡o= ²ÐÅÛo¿]Ê’5Ãà e™úȡȜÆ:Š\†ÂîmSk”Ô f:–QoÛSã:V^Ö}CRÖÃʇá•ãHIQ{ñ‰rà7Þxæ™gð8Î[qÞÜìÜÍ+n¾mpp`èÐÈÅ݃»ïܲÐÅÌù3À €…¿Óöе#ÿá¾^ßž«¨¼©yÆþ¹V’)¦;#Uç_ÛB¢XF¿†ûJìÇÌkÃÃò!1”C$Õj›]eÛ÷G¨Uc ^µ;8ŽtÇë‰÷„Y;`¢VÀ\ëÛ|{-|sðÍCƒC„Z$e'»Ð3q©%A€ãHbªK$I‡¿ò fI쀉¶gÿ·LR–…ž#‡t¹¸S—ÝÓWßq¤ÿ2'“zåeW.®\lÜÈ;kðöso¿üâËÙÃÒi¥9BÇ‘4å6ÕrCȤN8s° s¹Í;ϽóÐ_Š€ýSM‚ãHOÄO¦`׺]iíUm žxº…{"È4‡á8’¦ÜrTóà {Þ›²Ì´Ú!”›Û>×A¦9 Ç‘4åöçT“ àé»:ÎÈéOŸþÝ¿ÿŽïÏ~^ D¾·ù{Ï<®*¿ýÉoiᇻ~Xª…F ³ÕÕwÍOP•G&Èü廯6NŸ>½ìÑ>HqÏÌž:yæ¹?žHŒßί¿ñëßÿÇï´ûGªˆ0$ûwüvê—<{„ʽǗg¨—h‡Ž#íðµ¡V9Ç”£:W®\yäÈ‘@᨞²¯løÀHæbüvTË€Od" ÁÚ4¤q›q©È¸nª Gì3 P8”°ÎîÕß<ñ†ƒK"\øÕ}¿Ê@ Q¿ânà­Xà#g„òTWþr“0‡/|ÃvtGAÈ¥ (lp|üZ’ce—uܺ‘Úöâ8µÐ382 P0¡:ÉÁÁsGŸ `Þ¡¡ê¦\]P’ö¯U ãýj ÄX1|ýÊ_]d§ pºŠŸŸ6)mîŽüò—¿<÷ÜsG½W¥÷ñPŽ?~Þ9çU³=jaêÎX€cöO¨¢_uGp ØÇàXQn5Ä JZ¶E? €t ­H4µFGR“Øzy/oÙWj³hGÞnµ[Ä–cµUDP®Ñ‚º¯Fòûâq[¨"” ¿Ú†Ö­€V…Ó6¯ÝÜýæÇ÷Gz6 xå±×:Ö˜n]^ È;F»—¨ãˆãH÷Z×zÃÁaéÂA5ÊÙÏéMÝ;#ˆÓqÄq¤u«î¾žúåp°_Ù[ Æ©Å.^N]™Ô)­Ž#Ž#Ý›y=r„:©×Ù#?ŽõÆSfßÚ}?~úÇ]pvX=Û¬T‡žg­Ã½ëN”LD½ãˆû#1B@S4M”¸èÀw¾ñ¦8V­ÇÇ‘jš“L­~C òÐýM\Ž#Ž#WÂÖ øÅ¿þbûÚíwîŽ'QŸÞ4ÊkÏ'î‰HxŽ#Ž#­›q °Ïu~nþ–÷ßÒÌëâÊEÞ|þÊ+¯ÄÀ[hàaë………Hˆ™,žg,ÿ»èý»~7uÇDnȃ_yp"ûDF ÉqÄý‘. 8ž>ä˜ð Y?¸è²¶Ã°]5*7ÄÄê8â8wG Îçö-ÛÙ>¿4Xê ªõÅQߺÕëØó•â8’WYkº3ãHzâIœ½ó{9…°ìs}Õà B-rÀç‰tÿo)¹?âþH)…éaal€G„9màæ7Gòjqb.^CC„,‰÷lr¬ô¶mÛz¨å‡äþHyžõ¨y“S§NñRË5«ÖDÜ1¸ãäàd¢NNrÛ·j§½sñ.«x–c–•³ãˆû#Ë*Étà?¦”÷ž¹`†w\. ÎÔØRR–Ô) º xá ɱo)¾2ÂqÄqdº`¢Ôhy(O²bÞ8›L&áÀàÆ_Á[aë  X8ù‘¦R§$hè‚à%Îê˜ìrqSU¼ØÙÝVø _?ñuŒoÅd'†~ R¬ÀAE‘¥©¤#£ Ž#Ž#u9@(. ý¤¤TcpY­bÏjyžµgõátÊDZÛq¤SµóÎzÆÇÇ‘ž©´gpq™€Úy—=ã€ãˆãHÏTÚ‡3°Ÿuz’ÊüõüȔϻì GÜé2û@&ÆÇÇ‘‰)ŸwÜ8Ž8ŽôF™} rà°ÝºáÅÜÜ\§tÄÔ™çGb’†Ó’x}ßPቡÈo…Æÿ#£ö8§uÿ¡‡Z\\L‹f§69ìܹ3%O?ýtiHþˆ#àsXó„0ToÎ õ³D¨7|k7ÏŒGe*NÌP &„µê’³¹¦2kÝc ÀwÙWΚÌgv6’‘MGð*IP‘2't/Œ¦z$ŽÝúÅ}\²zîËW78E84ËDƒ€Š6~)«“,÷`>¦T‡]©âÃÈ€àU’Ë,Ë»8ËŸ"< )Â×wêètãuÉ& ”P3¾žcD˜*+^z8ÂSL ȆO]sd|æK2E°¾³ãè•é4ŽdÝtfÇ¢€:2M¢.P¼ëÿë|…„]J8‚]ÝZúám}EPÛ¶?¼ˆú’…­ ú^¥à† o¬›ö&ŠÎ.½gÿì5ëË&M’Á‘O4>ÇÒÀ‘«_¿îc;ÙJ\™¹“ªHìºúêõ<@1¾P½dMÜüÓ )Ýå˜úºJhËßîÁ3ƉGð-Iÿ\öÕþG§²Ç¯æŠÝÿTb~¨iHÓ\}þ‘7þçkz™O-‹/¸ckwogÓZÔ8ÂJÛÅÞJú§ìø{Y~ë]{ð˦ÙÂ;û®»¯¾ôî}½ÔŸjƒb‹ÓÚn\v;B¼8rç™;×íÝÊ0ª¿—µðËv|þÊÌi:»D¦Üój5gÓ%7l*NÒEŠ#à¤× P/»ÿã[ïÞß* ÜðÒWÕ>Y ú²Ûëô/¾ñW%mÀÜÞïxó‘VrÏ|Q¼ íT«b*ת¶løÈÖ‚\IŒ8BxåÇþÇǧÖì›8;[ *¯.«ÙaùàNFå2ª2J!¯yö‹Öeh§m;$~Óí×ä_öe~t8ª5 N›áGØ8~6uìx캊k>ÙøÙ­_Ý—ŠHxò8(£›Ð1hš2þˆUç×íÜj}q/F-ÏZÅ`5áý±fÙìW³öÖ×Ö8›£Îá£pD*¸Cå‘*Jm …JEI)˜ „"µÑ}iT¦XèЋ”_´*Q¦Žh]\8Bnõ«.njÉ-Ä øM¸–¡k¤£¤2„üJy§¦‰ŸŸ„JúWŠb“ŒªsG,×zH×t$1ç'¥RèI›lQë«mw6.¶½³cµç3…Íž¥¦¦H ©œ‚D^(§*^‰ G išCaU1€ ¤nÒšÒ1¡÷-2Pl¾ºÍõ5 C£›¸p„­" ®òfpÄ<@*\–‘™y Bz¡¸ÄÉ¿ˆM"}–p"2‘*X¼ƒ®;2’êÜ–Õæ?³3;L½#Îõ©™‰³i¡ëkyV)ƒtÌB’Pôy¥B¨…ÚG¤´!€D ‚2qi»´Ú´]p#õ±¦²ò Nþq¾ˆp„'—yè°¬-”_GÌá´EÂÎÏ0ÈL|ÃÑ¡8"é…›F¤Ž—ýi„1æŽÃÔ ¾ úQ¹P òÚ(ïÃ<‚ŒëšW*…'¨Ê(±.FáˆÚ´È ÓÛF4p¨KŽà¥7{À²8j§¹lü‡…ÂË1qÄÜÉ[“ƒ`¥)f4Ÿϼ ›†6Q¹‘ kZ²(ïd~„n…4GK¼8;` ×£pD.°Ída|Ô”r„B&7 Ž!qØ 3Úm†ã™¸F#H±[°"LáŽ.„)CqD1Qf’±ÀU93…E-áa Áà4Ø|ãcd{çªÖW¹|\£ü¨‚I?L“)+G”-£TúIQvˆ>–Ô3Òä'åÌÏR–‘Vۤ؎lºóƒûžü³'ÑcÁÈ‚¸úB [€‰’(£V¥¬U ‰¹ü c®u?S2Übdù3Eí„1°ªÓ—Ý4z¬ßp¯òØ1†qž€hÜSo°‘ ©!bËŒèBZ‡ys-çBwé’R­è¤6¡R)§Š3·Â5£QÒ1š µKÿ ÅL3e2[Jýò¡M,8Òˆ‡Yн)Ì‘Nœ—ºUwO?‡$r¾YoԠ˰׆Ù+Y,8ÂÛšZîí’¡1ô…1`ÝÛaê=r~%GÏÅ Ái \ŠGXqGRäf 4c ˜DêVÝ=ýî×ÑÞLª5 „Ü/dÕÕ4×õ iÕ0¨ÙÍJÓ¦Ž#u_ΛÆ8ŽTÃ÷Gêh2/] OˆÂ Ȫ3ªi®Ë³!²­Á l²z¨ykhLT°m'ðÒÒ5ˆGÎ&J¹±O¯k¶s:-ÁVywsæÚ=—äìžSo{Œ7ÿt ¬PU/­3»,ŽìxôS—ܺ½ø8ñHqá-¶}zi3ή)ßðe% ˆ0g.þïO¶mQSÛþY_ø–M8eåÛly÷‰Êñ·ò¼…'²íŽË¾“ ^A•¯>~ýÖ»šy·^³šHklÒÃÁýžZ#ïfàÀ4|néi¯‰hNåNɉ‡3&‘¨q*wÿÓ‡p5û1?T'I¬ÎÞ°ÉÙn äl²ÿšõ¼»ŽÈ’® Œ²:SXÍ"vQÚuv~S³‹ÁiɘÍ?ÞåoóíDÔ Ï°Õ• ¹é’R ¿ýáE`´Ôß àBe·ûJ0§RìèAᳱ̇· ÝAØ¥QMm_LÈU±1àp2{sM¢g m>º‡9“%}E¦{P¨Ü#¹Ž×&à½Ô©Ìd8 —_Àá%9€áT{¾bò8¢!±àV¨[“*ððo ýåã{<Ò NwÙ᯸g&ã¨WmÂÒ=r:›?¿ 䚯^׆ÃÛ‘ê0Ÿ›P1Q„Û6:šVnXðo7âUvi9Þ×P0h–ò†YB¢ÔÉ®ïg$q€6\]r:{Níiõ¨š^ሠ¡b¢•Y‚õð‰ •pï— „NK‚›w< d JeòGâ¨ßæ¥}LimïW¶¯è ì  œ‘ÄÚj&PÇäj?q$<ëá*˜±g<8Þž«‚ÓÁÎ%$ŠO„ëÁQ4„£8J­NcÊÛ‹uÉ$ŽúacLi蚲ୠ8 (!ß qqŠênýòM,¸ Õ´Œ†^ÑØÑýCXýÇ‘ÐI¿Ø3Ú³.ß—:â°H0|Çœ7€!«ÎH§ƒKpŸ¨X´KKð¾šåÈ‚·‚nà, „|qìDhP…ú Ž&NQÝ<4Ï‚K÷¨ÑÛM0#|,ø;v ËäFûWé‚Aü‘wÞy"!žëö\Ç‘*BФNˆ#è jî€&‘P›4blf—8Çm†q\ä‰o–lÇ‘fùÙikÉë4sf´ŠÞ)§jw6GÀhc/Ó¾¸Í‡Âòù‹S`ã3†ÿbÞö¯\}(fU(@„"ÀʇQC;¥®EaT © [®Í’?kÀq¤Y~vÚÚ²8‚ã’X²Ñ*é–¹¸hpþäÿµ’:…êÈ5Õ5ã US‚sìMn6&a ¢ f€mÈDcÎ5@ó(Äæy€p[!¸Ú?¸o#å_y‹Â#îSRÆ8)d¡AÊÀɼC4´SÚQãŠeÄÅ8-)¨ãHKŒí¢ÙeqD³œôOÉ…æ(YµEä¢s Žô/šgÕe'ÊpÓ&RÝ×$œO`K*ÌOhsg©Š~’áÅ %£¥GdùÐ,böÆ(±Žq‰üetº©!ë_å>a¸.±‹ÃV%taB­*èTýz\Ó¶òrË¥¥¥AÛÝ´Ý~G°|ûÈn¥…RÖÐÎ-ä‘©‹Tó®õ¯æ1»o³™ðEª/5Ñ )ŒšlåàȨì'áQܾ۫a¥èÔ¸Ì3Ô°ö díÜŸíßð¾à5)ó"3R é/èÔq¤² KUì'Žha/üØLˆÍXˆS`A¨¬ 2óÉå`ËrB2€(°WfÍÈ #c!†Y¥ÙYáb˜Ëÿj8b~²P8)Ït†&ÈiÐÐ6ïåiÔ:Žt£ýÄ‘ R„¬ ]å<Ž˜NËÓFAë_ùù ¡Êˆ…#¬)ÔÑ­bÉç³C†+Ä0N†°âÒ¨ÙdœN5äxëù‘:Ú5áºËæGŒ>ó¢íNhäRkí\2µ «XTŸp)Û2¦?ҮבV1ŽÀÀÌHÀNÉCy%¤BÐçÚ3%Pâ86”!' ÁD*÷ï˜BO$,œÞçJG"Æ2äDŽ#ìËbKIÇî½€Øzd§ «Ýed›XYǑĒ9ް“‚EÐØLz"ô`f­Še­tÇ‘„%3Ž°Ê»kÝ®©M‹äÑŠ}wláMXÛGrèá{°bSPNëàAûR“ÿoòÛßýûïø[ªVÙÂ?_ø¹U9óܾe[¨\ž§™IK*QŸÅý‘Ø °=Ñú#³Ì ©eí aðü-[qÌò?ÜõCP#lÿ÷ÿñ{¾cV¯_Œ#8]e¨€Á—'Ÿ|r~~~aa¡„DSÔq$Q”'$Z9ñÀ‰ƒ+–5¼¶qä×ßøu§~´ûG|ËÒY¹rC,®É»*jVÈòÜÑçTÑú §ÔH‹×o ß}‘¹ÆÇTŒÖ7 ‚[Ôª(›viQ,l”`»D)ë…#P©´+ð!Æq07„k<‹Ðæ) àEˆCuþÅ• åõ“Å2†#jßp ˜j„]Ë7¦TNâpbÓÊÁÊþá  ]‹ZeÓŽ#-Šærà`S8b±Œ¼…!öáˆ~ʳ†:–gUÔ#lÒµÌGˆ8e‡É®¼m›·Á¢C‡ E“Dó#-êSÄM÷GæææöîÝ‹æEõÁ3çÝTe lT\cídSÏ„6rU†Â)ÆóAäà˜ob‘nªS>Õ´œÿÆQ’j%Þ< 8ŽDŒYÒz‚#d"F½Åv‚÷ÿáþáCç¨U‘¿`™Wa‡ ;ƒ#€!—¤G¬®ÂÛWb’wì[a€T qÄ´2ÇÇ‘„8Ð"©§OŸÞ½zw3šgêÈ)PÂ"“1°°Kg,‹#‚Œ0ÛBû`n §@¥:›åÈp8þ(î(L-ÊÆ›n”=ñGåIc‘oã%­âˆ­àâ’X¬a©“L¼cˆ.»dÖkŒZ«Ò¯d­-q­4J…/oçãEŸñÚš(GÚe?/Ä«pV@f_|fÓº~UD©P!ˆvyhg‡~bñÅð…û¶$¬¥H'¿/^{R2Ù\ÅDZúëø€Båk—ûÞzWpi—ÓL¹L¼ã[×ô”œ9&Ñ'hÚÕ˜4[wiWn¼"·[M:Œ9R\äñÅvYï­wÈǑ֙]mkü˜™h1°Õ_0ÞºæuØãHëÌ~úOäÂ$jðmÍG`kë|÷:ä€ãHÌf3Ý÷6 %<éË©NS¸s¼ =›\Ž#]ðžmr—Ì^âG¢Ig>üµ‡»`º÷Ñ!G:bö¿ýÏ»aí ÍÎíɵöwçýÝ'ö}"‰v‘çntOA’,å82±ýàŸÀùFSòªp^Üsý×{83=ë°KÇ‘™tÅQi¼Š7¹$áPT#’„ÈÎټ̫“Q²{uéÙÞS4¯ƒê«c‚«Hy5úÄøëwÈÇ‘™=¬«þ9&î†LX¥&ѽãÈ$¸>Ì1áuY©? ‚pÀö-ÛÝ ™¼VuKãH·üÝoÞã5«Ö𮹠G–TKa4U‹]ÿ7ï8ÒéJ–ÆsêÔ)¦ß¼ŠqÀq¤?ʰ¸¸8;;[xŸ¹¯¼ôG&1Ç‘Ip½…>‰JV®\Iæ•vÊ6ï8R–c^>ÃÇ‘ž¨‚DøTmGz¢“†ãÈäxßhÏ5‘ ¡ãH£¢˜ÆÆGú u j%eCÇ‘>(ÁDÇà82Qö7Ô¹5ÕBÇ‘†ä0½Í8ŽôAöÔT mGú ƒãÈDÙßDç™ ¦Bhã8Ò„¦º Ç‘äÅŸ j*„6Ž#É+Á¤à82i Ôî?ÔTmGj aÚpI[†5eCÇ‘´• êG"BC$T~¾Æq¤! Lo3Ž#ý‘½ãHd™ÚHGR“ØhzGú#ËÔFâ8’šÄGú#±þŒÄq¤o²¬0ÏT`šW 9à8Ò}ð¸¦?²Lm$Ž#©IÌãšþH¬?#qé›,+ŒÇãš Ló*×ôS<®é§\S•û#Õ¥ôúë¯ïß¿Ÿ¿Õ›(SóÕW_-.ÞŽ;vŒ‘†ŸÃ‡?õÔSeÈ÷²}æ€ãHuébØì@_Ö¼«wÔ”%O GèúŠ+®x,ø€#Œ}Y’»7?GªË¨K‘/0AÉ÷Ž?”ø{öª+Pj:ŽTfˆ#ï¼ó³5mñ“cº ŒØG÷Ÿ}öÙ°Kþå&?8q‚Fôu±Ò^xA÷¹ÆG`eòt·× E1 _£Ö:U2 y4ã€Êgþµ†rƒ*´ ï ­R]¨^³G*±í•Bá;Ç„À A ÿ¾ù曲®uPm›üÄM«"˜à_‡ 'NHÆbé!!ˆB(‡lqÖÆÂ05|~Ò¨~È »Ÿa`&¦SŒ·£X]¨^³G*±mŽ`؆šä>È @æÄ}ì!†T…ŸðGŒ¸‰Ç5µð…¢ÖÀÂ|%¡ª<¯ÌXdù–T’/F1 ç¹!0£ ° V X]¨^³G*±mŽ„9WMÎf!h&¢ÑDMûÈÆÌ,CÊ¢ÂùáB•È Ç"O*?Ú†f ›O$‡%忨VˆP£X]¨^³G*±­ ŽPÖÍê‚.0HÅ/á'N ]*ùaf$? mòÀ1Gò@V´kº¶ê ¬.T¯Y‰Ž#•ØVGÔéÌ@©þe‚ -*¤#c{Ð’‡ÝežU© KZD–'lL±'tUŒ?°Žkº£˜S ¬.T¯Y‰Ž#•ØVGPwK:R¬‡Ò„šZÃPÈŒ$~QÈ Í"2㦅ucâˆ\6e¦õÉ ‹˜#4QVª×¬ÄÇ‘Jl+ƒ#‡¢ = ù&Ø?i-C¹Õ<ŽÈ„¸Ϻ¯Æ¥´…ü†Ã‹V^ câˆù\j!ãï5†ÅÀêBõš•8à8R‰m¨î‹Ïï‘Çl…v‚(‰`n¹:@Èm†Š¡ c}Q¦`~{q DfÈ6â!IÐa‚eFŒÎÌXòÿ†-72pÔ7äL« ÕkVâ€ãH%¶EY©=‰r¸NTDp‰H5Iq©É@¯^™Ž#•Y]EÇ‘èD259ŽôGÔŽ#ý‘ej#qIMb£éué,S‰ãHjséÄú3Ç‘¾É²Âxü|Ö Ló*!Gú£¥âš—^zéÑ?}fggï¿ÿ~ýwêÔ©þpÄGÒGºâtûý”Ŷ‡æ?GŽiŸRï¡opéDKáȻヒ’ǑӧO÷‡#>’®8à8Ò§Ûï§Ž@ÎÒÒRGV®\ ¾´O©÷Ð78ŽôG¢eq„IG<¨é6t;Ç‘nùÝfoeq$ÚxPÓ¦|úܶãH¤[G2¡5ýQ…ÎGâ8Ò9Ë[ë°Ž„¡5­I¦ÿ ;ŽôGÆp$ m<¨é*t>Ç‘ÎYÞZ‡€Â[o½U¶y­ÚxPS–o^>ä€ãÈ´ëƒBj¦]êßq¤ÿÒ¯­Ðƃšô%9É8ŽL’û‘ô}Ï=÷øö³Hd‘(Ž#‰ ®I²ß~ûí&›ó¶¦Ž#ý—ùo¼ÁËÂÏ+¯¼Òÿaû;ä€ãH‡Ìn§+ÖhÀž÷?v×±½ó{õ¹`Æö¼o˜Ù07;~wÎî wÄÏÏÍ«ÖâÇ9:àùçŸíµ×Ú!Ö[í'G“+1¨ñä“O¿÷¸ðbͪ5`ÄÍ+n¾mpÛÒ€Uܳߓƒ“ß|{Ìï݃»UëÈàÈÂ`aþ¢ùmmhæ¶Ï¾õ0ÈšΙ3g㔓Û!G:dv®p¾~âëÛ·lŸ9ÔØþþÅÁbY¼V¬Ø=ƒ{îܲ\;{íÖÕ[Á,`…•ϧÔd?«:ŽÄ+WÖP1>wÇçÖ­^‡ƒp`pàøàxY,h°<>°²{õn°laï>™—xÙç”uÈÇ‘™=^WÌöH…TÅÌÊBŒCƒC''„ƒFš::8ŠODæ GÉ£žñdÛÛRŽ#‰–Œé‰NlšÝ´gf©Šo¾ÙˆÍ·Ú.ŽQ ‰›ˆ¸é¤tÈÇ‘™=º+â—«7\q°TŠ´UŒ(Õ8ÊÙ%¡ís¾56 •ê–Ç‘nùë*ÉKâ—$bp!5KeËú-Ï<óŒï‘°nuؽãH‡Ìþó®@nI ’¼,5óÇ_øÁûVíÛ¼vó÷ŸøþÄøëwÈÇ‘™ý§®È¤Þ÷¥û@nã…Ê’¾éý7éøöÙ (Y·]:ŽtËï÷ÞûÅ¿þâò‹/¿uÅ­•í3­ŠD:lŸ=røˆï:éZÕ:ìÏq¤;f“/X:²tãš#\Çm›n?÷öë¶_çŽIwÚÖmOŽ#ñ›W^våá ·m±Ñ¶Ï ñÕë¯~âñ':â¸wÓ!Gº`6)Õ¹s“ݾ° õÑÕÅ)ë‚éÞG‡piÙ/¾ðâ®u»ÝÒúà”ú«C¾*ܺæuØãH»Ì&«zÝÚëz°1¤Y@¹óÜ;?±ï%í*_‡­;Ž´ÈlÒŠdD†b^‰8-*_·M;Ž´Åo¶º_µåª)\šßs!Wâi×¶ô¯ÛvGÚâ7‡Œq>ÐøF5%y$ÇŸîkK;l×q¤f÷ÑïÞòþ[¦JšôÛ6móDI+ZØa£Ž#Í3›­"Û×n÷´È˜€òés?ý…Ï¡y1x‹rÀq¤yfs§‡ŒiE^ p|‰Ÿ„Ô¼"vØ¢ãHÃÌfËà9:”âOñàbÃ’ðæ:ä€ãHÃÌæ0‘¡çü|áç¿þƯu߯Bã_nòS)«ËVãá·~›5I*U3œ*¼ä¼aáysU9à8R•s#êq¨úЭ«¹j„þ»ÿwøi«{îès¿ÿß-i‡DQøG»4NË”aÔ ¶€Ž’D†7×Gšä4K˜,d›:ædÆÇ,B‹q„_å’üæ‰ßpMù°¯À¢  ÑS€#d”È+# 6æpTýüü¼/înÊ8Ž4Éço=ò­[V _î ]s@†â~‡" ïmþžY&7…#˜âã3g,V‡¨qúÓ§5°îú!…©%¦Ù0¶R_üÍ4H-ARþ'5’Ǩ¢. ;C?÷…#´&zò_œ8\¹a|Ø›GšÔÝzm9ŽÔãßŸ×æ¬fŽY-ðG•0"ƒ#fojUþ…P ì'åq„8"ÄšâûÛŸü6¼©Þ­/ G”[1?Íø3Ò‚Z3W(¬¨vô)p‘x-Nþ¬£<|8Ž4©² µå8Ò#ÿÐ ï^àØôÁàeogž;“ÇÙfŒ¹šÿ‚yã€`Ÿ†,ùªáˆü¦},cˆ@IÚçˆ Êã_¨qî!P˜ûô¶Ã¿ÔÜh 6 C0ÚXø‰Nõ/3™æWvm/Ö*€Ã¢›ÌûÏýßIqàäÉ“K¼ÙµIcšâ¶8·yÔ‘«2uþb¨2*ì-ôGBc–u ;4“É0ž^,*136»•‡’ñ&°ó}€‰ `ÉÇ s4j$Äó•2.Ò²ù±=ò€J9;;¾Ì<MŠdÁ?Ñp€÷8Ž4~ãàˆ¦âH>6 ±cQƒ|ñh-L¯dÌØÀBåùª€P ïКâQh½X1¥Eô¯eR+àûnØ}J‚×’ŠçGšÑÚæZqi†—£6˜Út¦ tsTŽCþ88RzŠ#Ê¿„_s@¸PDcQˆ#™ZÊûÖÇ‘0®ÉÈc( 8Ž4£µÍµâ8Ò /Ýuì¶ÁmÅùýjë)æØŠŒùJa(Ñ,ŽXÆÄ€C+,"ŒkKˆ(±šÁ2‡Öe,tª#D.ËŠ!Ç‘eÙÕqåå×1A‰vGˆÈÛäÆÁËtŽ„©J°#³²£ô§Ò%ùTeÞ—ÉÐOO„‰[eL¶ÐC%e-GcBC&a<¦?BEÁbþK^‰¨p|¹(–”¿–—l•Ž#Ͱ—eK/Gáˆâû•ù\S}xSÑ„¥!Â[–ºîK-[:É Ž2ÛÀlV)ûUg ˨Yþ ²¾t?Ì„$Y_£ˆdß »ošƒ·2!8Ž4ÆøFŽ/ÂÃ,©Ù*^ɨ}\CÁkœ›£ú‚€‚í§?ê´¸AÞ•åo·iL 'ÔãHcŒÇßž¿h~ö2ÆÞ¹Çë;“74!8Ž4Éø-ë·pÌ—ÃÄøyÁß&eàmM‚Ž#Mrýé<ý‘ ?2¾MyIwFšT¾‰¶å8Ò0û 6¤M9jd†ÏÉ#¼$,³ý¬aaxs]qÀq¤aN³$yÉì%~Dë² ypæàÃ_{¸aî{sâ€ãHóŒçMz7®¹qYCšæ¼—cϵ{ü°øæ•oB-:Ž´Âø‡îhqvqš‘¢`줢¯ØzEþ €V$ávÂÇ‘¶ØÌ ±?³ê3%ðšÁ¹s~F|[j7¡vGÚbêàÅ~{+ã|íìµøe¾:Ó…ªM¨Ç‘ŽÏTÌ®{/Ú;UŽÉíçÞ~éºK_z饎¸ìÝLˆŽ#2þ§?þ)Ž ïÇî·Â莎Í9|Äߕש†M¨3Ç‘®cò…ÏIG½§"uˆAxEÞö-ÛýÔ²®ukrý9ŽL†÷¬}òÊ›5«Öð¢ì¡oóLM8ÙŒTâïÙœŒVM®WÇ‘Éñþ½÷ðùïûÒ}›f7Ýôþ›’Λð‚t<,žQôTÈ$õir};ŽLŽ÷ê™HçûO|Ýêu„l²HÈa_þ§½s\¾ï.›¼&MŽÇ‘Éñ>×3á‡3rÎ+€Â íCÜ¡ª8 œÛ„?å[Ë"Ò¡ ‘â82!Æî÷@a†?oÅyÆë," yØÿ²oÕ>¼NBädfw@¢SÉä829ÞÑ3gòfB&ÿ…ÁK<£ÞþÙF4ÄÊ ØA¿¼R/‰ý/Ï<óŒ{cÈmêŠ8ޤ!r&ÿG}”%r™¼5ê¬S0;‡…þ4•R!ÙHÑ&Qg¸Ó +/`ýòvßÒž†¢LˆJÇ‘ 1¾^·8ìÎÀ H©èMÚ?à¢/ˆ /‘qdpÄîpa%¹À× :É@Š6‰ªüEõä3uµGú#rŒpчDЇÈ€XüØ¢ÝáÂJrá¾F”`B#ù¢â… endstream endobj 425 0 obj 19598 endobj 376 0 obj <> stream xÚíMhW¶Ç žlù£#µ%dËùPóì¸hmF¶ÛF3i„P¬ `!›Ø‰°Â#b;(ÁØZ8~‚ÄA$Ì ð< …!A« Å´1ñRx6"k´ÈÂËyÿø¼9œÜê*µúûãÿç"ª«nݺuïïžsî­R÷¿ÿMQEQEQEQ5¨Û·o1êííÅ=úôéÓÞºÿ~ñê044„KŒöôœ‹Å]‡]YYAɶÑð1ü”RJîZ„ªʧ€!ûB‚Â/“´¿?~,{,º—@e {zÅ>xðÀ}Ž=z”±Åp-´U%°'w-šžžÖýÚ•¢|j‹öɾŒ¡•´Ç/„=Zs2¿þúëírFP­²'§„°'£ÙÐVÒhh=i±œë_<öl•˜J`OJ@Uq-~$CsŠ’­á•îxöìYHMü‚ ‘Ì[öí²'ÕÎXÏ-Ù“ ÖžÒh9÷¦V)¼7·Ìà°‡m½G5p»AØ„W@kÂ^ÆBØ»g{ÁnãDEù(1õÑÈ©´w´qgþ !‘(TËǵ ž­¤TÃFzÅÑ'yäv2Ƈˆj58töHÅœ*9î[£që’œ«ݵlhNV~lÐ޵„ ²eªm—£úQ “eó行ì1§µQ¦ã[ý'jãKë9%Ø=Ò#Z‚?ƒâç@¢ícó‡x4­ÒíßË9õÑKÛj(Ù°‡:[H$„vF®”£-é„1ŽuU'.¹ã+­£tZÏÁÃÏž”&ƒ —–dÃb£ •”A Ñ2m5¹ASWÿ° aω½u†‘RˆeÑ£ÄÚàÙ“j딊 Áî¿+-V µ´¿Óª:ÛÒç:F@oÍZf)D:ÝFø2Ö´§0ÐÈf'¤Â¶¶Œ²ço Á¨GmL%ÅŠ9ʈßþˉ:”´¨³6¸¢ +ýÔ[}*^À¶§`Äž"l¬=%|š#•·©ùí¸ÖX%Üîõþ^{NÍC°ß2Ö6â§2ö–ítÍ èúƒCô²tDFö¬‹ *Á¹#mIYå>rØÓªZÓ‘¨y´§¬CTão»ÏQ¶²\*ñÏÚ‚ØÓþ Ù°çì´èÛ´ð‰d6ñ^P d´ÀÙ/( 0ŽWE_;®A  í)äA›ëm:n%#{áÓL{×z;8ì9·ïï-+ 7{ä÷ gOVýÆÄÖ§Øì‰µÍ¥ ½ãÄoAëÛ%cOÖT‘Ç™zkàáo%é *Ò^“Ô£Éä lù\×;Æ*ã]ëÝù;4öÐ[²gòmŸ‚Z^¯ë ŸphsfÏBžÑhKsé8²¤¡SBVZ²œç:qKÆ`&œ=tä8)­³"¤P`ühÙHÉYøÒ^¶­‘˜Œwm§*ÎtVK¬KUß'ë*þ 8 5þ†›ÍÚ²ÌéGƵmÞ²§õ× ŽC…~t…ölY²§M*+Bh½YgŠf ZW´íƒTKå"¥TÝ«Òáïz5~ö°G`m g…­½¿Ò¶Öð¢|ìôÏnl[-DVg—–Æ ãŸ²9‘UÙ³ñŒ3›p AGØ•œ-Ÿd¿¾—ñ¢>Û Q·K1!å„,­Ø=þÕ g iÙ³­äpƒ¬½^ÔaÏš Œ8µp[ˆùÚ`ÏYdó·§,ùfÿ.D‰úÑŸÁÙã®úðÝyÿCbŸ×‡ÿÛz—@c65t¥WŽ…—èt•#n× §e9Å °Ñ³zEœ‚~”j ÉÖ0êEgáwí\T{ÇZu[xÆÖ¡Íâ/D‹´[ÃÒ¼Ž’ýã<ªON)²GöÈÙ«s•æ-¬ZMZOa(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢J££¹¹¹™™™……ÝóäÉ6•Ö××———ÁÕPÿP<·ß·Æ5õ6ö¦¼TO¤G÷t6wÚÌÉDrìݱÙÙY`¹¹¹É†¥üZ]]!à´€™¶H[W´ \ {ÃW¼+ŸzŸæ–.y—¼“ 'e¤1ÙAùM4??¼Ùìu«çÏŸ/..޶6µŽ!à´äLÚ–éºwå÷y}Ç÷Þ±ŽØäø$°g_Ô?…ÙI%S;vv7uŸõÎN{ÓÅã-$Mz“i/ ìa100ØA5)t.‚7˜ Þ…²ðd100!',µä[aè:öw só ÞJ“!&,0ËüÖª¦–7®Ý8Ør†nÊ›ªpêl‚Yþmâ‹ÃV³«ÎÖ]ýðjËÞ–¾]}å çòO°Ò°Õ°ØËËËìÓjY09úêÑô®ôMïf•Rg,vW´kdh„+„•oî0sIJ¨³éío¿ö‡×h+ÜÜÕuš<ÐV >ûø³š4wAë0¢©ñ©¾æ¾š§ÎÀ×[_ÿîÑwìúòêÜà¹þ—úëçt²áäìì,!)’ÒjIYHÞ—$uÆ‘3{Fê†5¤z9M…b/å¥fffI‘”ˆ'.{— 5Ëð“` ‘uâ"Üâàâ–ì)Øjè¬=„s/ÒT—ìU©dª ÿZ+±–csà|íŒCP±3Y ÿ”=±Š~ö첡Î&ÔÉÊY2á- ŠŒ÷ŠªÉñßþ—?ÿnüý®¼YÛ¨Rºt ,NÙÏžšMg§”omlç¹|²VT---%šyö‘<C]Î! ‡d"üÀ{ÚåÝ–S t2À;c§ÖO×ýÈçu¾È®_h)žÐ¶háÚøçǦo$}:MBªh‰¯fÜœñ(ªžn‹´ x•ÿxÊ›:±÷Äè‰&666Ø}5 õõõ±wÇÚ›Ú{"=0ƒ•!¦‰æDÇþŽ{wïÑÃÖž`I`#»"èè2þˆ¤þ”dŸ×‡ˆ®µ©Cƒ/ÖÉt­?ž›öÒ—¼Kˆ²JãU/xz{å't?šþˆ]=OŠ'Ç'“‰ddw$Ò‘£/ åèOÛ{ž¯šJ¦æææøÓá”-ÌMh|yÿË ^Cã5þö“ŽÿI HâFpÇ­{­Í,¤ê™™øzþ#•¥8xÚÚÚVŒfŒ7‚+8nÝhmf¶!•ÛÊŒ÷m—"ÌhæççÙ†Tnºr劲‡íír›J¥Ø†T>W„m²G•ÞáæàvÉU‡›ƒÛ%{TAnn—ìQ…r¸Ûu»d*”ÃÝ®Û%{Tnzòä‰.‹¹eÿÔ•ìQù ìåæµÉEö(²GQd"{Eö(²GQd"{Ù#{Ù£ÈÙ«1Ý¿hh¨4×úõ…ÊÅn³÷÷{ðà(—nß¾}äÈ‘\èéÓ§¸ÐãÇËÅ®ün?\nzzšÔ6{ ]^öp³ÎN˜¾ÒÜ>Îz.øÙ³gèqIضÞY\ …ÝmìÁ~X•GÙü(PÌ ¶‘GŒ ¶+‡=ì±#"è^ Ñ‚´É Õú&Ý c¤¡ôN¥œ ëž ‹Ö{² ¡)d b탺*=E<©ø2¡K›TÚ_ Ñ£•ÆjžÍ½È]È!¹©¡rZ|Ê]KCi‚.lÛÀ¹hÒð‹Ö{¸wzØP›€<–£%ÑVbú¤ ìGN9$¢“‹Jð¹ƒJöè}…Ü‹†’#ðè}ɵ·Œ2Ö][‚ rÑ:´{NI«JO!ƒã_ÄH>6²­­ýUiì©y·½r/ŽÍôÔêÌ\´@¸¶­¶åEÉž´ªØ:|Ú‚ÓŸ¤_*= ŒØ(õƒá÷’={ŽÇ´ 6Vbæ-/JöZðQÂ5AKdΞ?*¹—üížÐ.ëUC.JöЪh(4  •el7”5&•Ïžü[œÖ?ä^²dÏÎ\dêai”e Áß’þ‹’=÷?|´S™ õ°Û6&wØÓ½¢æ¹b÷¼—,Ù›&% JŽ]•œ¸„5t!­yÙgjþçkvñJ$i» …mÞí{!§£a^Jöp/±×åŽ{qÎõÔV†X?)Á™±‚XÿÌ ‹R%ß% ÈEöÈEö(²Gö(²G‘=²G•˜½ÙÙYù…—‹/vvvê¾ðG^¨ÜØËþçDGFFòü²\вìÁpe™yqqÑÞv›ƒ¢r`ïùóç»víÊçÇ(*7ö2º]:\*7½õÖ[ÛbÏq»t¸TÎ’‰jöù·K‡K•Œ=ÇíÒáR¥dOÝ..UböÔíÒáR%fOÝ..Uzöàvép©²°·;55ÅÖ£JÏžàÇÖ£òÑ“òï_]]]ù½ÖÖÖØ\TþHËË˰xCýCÉD)O؇£‡ãѸM‡šéÑ ;å,¤±wÇfggçÆÆ– !MH]Ñ®”—ö†/y—.{—?õ>Í2ÝônÊYHÞÀɆ“€sßž}Â$hœ››Ù¿EÕ’a6::<Ù±¤m‹±í&a4ö6ö‚ÆHc$Ö›Ÿ„gÔ¼Ö××çççSÉLPwS÷Yïìuïzñ`Û2Mz“i/ ÞÚÔŠ€áÀIJíyÕOn|ÅÛ"mÇ÷¿à](#oÓ´7€á€A‘>Æ¡G®v!¬BW«ži8sÅ»RiÈeL#ÞHËÞ–‰&`¨Ù‰U'ø/:„Uèʪ@Îö7ôÃPcÄ€°Z&÷îÞëØßÿU-†.°{€°eÄÖηx“ ÄxÄ,ÄùÆÛã|ƒº«Ç‡£‡ Ø–S£¯å‹X…]@F“ÖórJö)½+}õëd¦PBc¢IÉU– ‚¯¾DíMí\ÊË>]ö.'â ’“¿&>˜èoè'QÛJÍ|Þ‘§677[ö¶d4z?|üÒ—¯©{îDîÈÎìû§dÜÿýÄ÷R”¦¯»¿®4À‚*//?§O§ÉO>ZZZJ4'26ï/ÿúÖ®éà=ØŸeߨŸÿùsÆCØï¯LP沤ÊËr_dW„Þ|4:I„r–çyAm $©9ò³‡^SDåÐâà¢Ú •¿ÃÙ“ÓqQë÷kÙ`@JÓÚZ{t–Ü rZï/·¹eåòdueßž}áì¡ï$3Ì‚ÃöÈ!™)ˆßÄQØB/ËGõíÒãà '"ÁrZÌ´÷Q&ò€g¹–Ôù-º8WNÄu‘pH‡@ÈYr/r l+ùÙT^ÿÅ#™H’¢Ü´¾¾Þi g•8 ËžtÐlçfï9BÉâå\k`… ½–Z-›YH¶W 9ËoÃ~)!›x± "RTTö` Ô(ÙþòûMÛeÙ°‡¢Ä똯Pßɯmõ`…-ä,Ëanì]ñ®ÄcqR”ócÜ ;·dÏ BØ;cýf8{AK…Aìé¼X“ëpT!”:„œ•?{ô¹y ì=M³ìY/©;ÕëôPºO&¼…eOöèLAfµ23ņĄºjíØÞŒgåÏÞYïìèð(ÊY©d*è«{ötf¡;ÕÙ‰›sæ˜Â€ø;ÿ’ÈvÙÓkáB8*Û6°”y,kŒrV8{á•—ÔéYXX B9knn®·±7öÄ¥:;Ñ/êéð×®{X2ýËrV{NiB‹ÌaufáTÌï…œ…ýÎ%äÖ¤ªá•—„P™_%”ÖÖÖ5ÊÿA@Pa?ú±€OPZе0‚…œ~SA•Ÿô&c1ò“§Ò§ÓUú]ReL'öž¸w÷áÉS+++ñhœ8më›$¶ä‹Q"ž(ê7!ÓèQ!Q_¬%ÆW—ùÒrYtkæÖ™½gˆÖ–ÿ¥‹AÊ“,¸Nõœº¸ó" I§šNݽs—¨\›››ÇâÇjã›l‹‘vŒ¿?NNФõõõ?¾üÇÚûJÛüÓùçáHH±ç‰Î­ŸMïìyçÍ“orQ¥4ÖΗ«.’úšûÎ ž#¥ŒýñDYÁuïzW´ë³?#¥×կƣñioºÁ»ä]z¥õþäAyŸ¸½ö‡×êêë¾aîþôÒŸ’‰$é ü¯üÌA=L@F¼˜»¯¾øŠý^9Z]]Çâ=‘žZ%Ôa|¥O§iî*S ò~øC¥9?&ðÚ"m ŽßlVA`*™:Ôt(èû4ªåU¨¾]}íMícïŽñ äª[…Ý·g_Cu= ¹ì]Fðp°åàk7èa«W軉&:öwÀ žl8Y±Ñ |+": ‡Á’ˆ'<ð9E-™ÁÙÙYDƒèÜã{ŽWÈ{øòkõ‰æDdW£¡«mK8??ŽÞÙ°³»©;åýöo˜¥ü"ñKÞ%ð†ëbÞÚÚÔŠÀ`ii‰V®®„î^\\œ™™ÁÄ$Öó<0œFoÃÞ0ÊìŠvÁïã*ÉD¼áºœ·Rv‘С1Ò‰G㚀&xmµ`’z{mfï…¼ õ¡Ìååe¾QLe¯ÍÍÍ£#xmµ`¢¹¹9›™­—›þÆw5 endstream endobj 426 0 obj 6001 endobj 427 0 obj <> stream xÚíÉ‚£0 Dëÿºæ0݉µ˜ ‰¬T¦[dÙ/€$IÒ׉ÿõ³õòÜùÎä }.ÀÄ!·FLùÁ`ÓÔ|¿“ÉYîú Ë\Ê iŽOÁR§1bØŠ  †ïáUÍ‚µÀÙ٨ĴtÃ\Lúõ±ïßGt|oÔòý"iÍ}ØøèGµ†H=¿ç¶\?·éר¾– uÔè"*ÔS?¢¿a¡´ÚÇÂRj†ó‚ì]yÿ>Æh endstream endobj 428 0 obj 1127 endobj 244 0 obj <> /Length 429 0 R >> stream x^ì|UGÓÆƒ»»»»[àîîî’HˆÜ)Pêîîîî-¥--¥x½ÅÝòýÏ}`z¾‹¼i œó —s÷îY™gfvvOŠÄÄÄïò(àQÀ£€GÉ œwyð(àQÀ£€GäG€ä×%¯G< xð(àQÀñPzTð(àQÀ£€GÉ’Â%Ëaõ:åQÀ£€Gž çñ€G< $S x6\2X¯[< x¸î)à!ÜuÏ< xð(L)p5"ܾ}û öÑ£GEó#GŽðyòäI><¨ÄX⯿þj££g÷ïßo9¹'åĉÇŽ³ÒÜ%»‹=ë(ó,é<®>¬¯j’¥¨5[ÍPuÖ‘³n…(_wîÜyÖœH™\4X-5Ž?®^(E_¡ª»_ÊiO‰¤öˆ:.²Xž½{÷’~q] ‘j†®={ö\t—“êA?Öµfˆ]ÅH\çg‰Ûx› *ß zZEüñ‡ò¿-ÿ¬ù)Ù8z5Iõy®Ë~…‘ÜŒgS€D›kÿ³‘êµ>ýþçS˜At“èࢅª‚–kðUU{×UN«áÄIb2ñ“î5C¸çI°þõ×_"ñîÝ»ucœ‡¸1¡¼k×.+ÁæŒkkœÎœ<‡²Ìˆræ$åP©;](\"Û¦ÊYk¡ŠË+òά…òz!7Å$—ÿüóO>Õ`šD¿~þùgåäq–!d÷£Œd]>¿˜;-]`|‰…üÏZ®P5[œ­ ,Ô&QÄŒ’æn ¿,-ñ+–Ý:‡ÚcjÍe©Q…H ¡|Þùûů6G¤9éqäq{–¾˜*pfSM2\¼ŒÝç»Uj÷¤– ¡©º9O#/o“¼Ò.…W™…¤^‰ÛÄL~Æ„ulª™bhh'ÓÍd:ÙŒƒÍȳZÎCGØZ…Hþò)¥X—ßdS; Õ4ÎuÙb†ÿý÷ßzÖ|)C«g"ôÔo6R¾ºO/ °OBk¿J˜J·«© Ÿ±*.œ(Í-ýhxétøoJtv³–qˆ»ƒn;øÒfJ±gZÏ6—‘©h³¸‚κ1àÀÏ'Ÿ|‚:’3gÎ&MšÐf·€»Ÿ˜<ºÖ;Œ^yýM’G`!·ÃÐCöqãÆU¨PÁTKqÈØ Jc,`oò‹¥ˆHFKú+Å~r…Ÿ'Z!ÃFĈTÎóxíÜSFníM›6ÑÂçŸ^-—çæz/lÍX=‚¶1114æÒ{ä.AÚ³Yo âªU«–¦ùm·ÝæÙp——æW¨´«álžÀî0SÁ‚ýV€2f̸`Á„ >†ˆfÎÊ•+S§N tI¯”·¾D.좰´¸qO-&ÉùáMF ^ÊæÍ››±Á <.5V¦˜ß²Ÿ;ô¬CHï€g¼"üj 6ÿséî¹Á=Kyjûöí@WõêÕ¹G™ÀJC< ùèÈ“O>™2eJË#wîÜŒ-p6hÐ`ðàÁ gžyF° 5¾Þy碹VY.¼ygÍI¥("x)ÃÂÂ.±¨ÿìq †‚% ªûõë‡ó€6(ÅÆ÷ò‚\©R¥"""(_”—,†íѺ¬û—Ý=P»víeË–Áó«V­‚ÜÀsšÓ ³Ï~øá„Œ>F¢óó¿ô'ãL&uýúõ/×@CCFçÖ[o• çÞ•o#HT¯/W¥^9WŽWï Áj±±±•+WÖº—yÍ|FkƒÉðà …µ–~ï½÷¦I“†Ð ÉeR0ÉY'ù°6€LÒ7n܈Xà$Ö•ßHl·D¶ÊÁE s+ò£G¨‘¨z*B– ãA›¢J±òÝ›ó {pô¡«4Óñå§U] ãŽ{4 ±I¨ZÜk!4Þ²‰€jÌÌ—^zI_AVA$2$zX¡„¼·ÜrK† ð#Y v3àGšŠ©ç®äkÓ¦Ÿ¢  ÇÒÝQ£üäÑtÇò¨ÁÐ SØl8µ–OÑÓL!ºYè¾Z]îvªƒÒÇe.µ­1¶Eåè’ÔS±j€ÖÜF§™­æ§Õøº¹Hµk¼„vzÊ–l­Fã Óոɍ¤€&k„²KÒÅ{ .d eû-«…*Ù„â6³ô«R ›­æZ ¹ýmÉJþXã|£«ÇÕ ¹d¸A‘J•*ÕsÏ=g?Ydä¹£<ôå'¨%´ŸfÔ©SG_yÄ| ~“Î8Aí4 h‚¯¤K˜ÐN,`f´ùl!w‹´.z ç–nTæÞ½¦RÈ›·fà B:µŸÄhBŠõH$µ nÓœ^—Wm²¾Öo®:„JvÌž=›Y Èi5ˆ+GŽ|jy[´ã櫯¾jÔ¨î Æ–-[øó‘ „±† ÆtBm$oéO<ñ÷Ÿ}öf%¥[·nøåXÒ }Û¶m8ß0ûHÇÆjÖ¬YÕªUÅa¸+‘þX‡ÔþꫯªRd1mÃkúÔSO)'Ïbnr›WjŒ<ø Z0àur éS;9û÷ïϯÔKuëÖ­C¸àð$…©%  8³*Æ èNLÚZ ¦ ™3g.T¨¢ßd.„Å—Û¸qcR40ˆµ¨i!ÑØj¬#By~2æ¦ñÔE›‘J<Þ¾}{ý‘™oÁÁÁxùj~0nh4°;Ðt^2°VJÈÙÑPBaÁü„B"¤àéL¿0С•„ ª Ýá'ä~TÕŽ³T4:t(_7lØÀ=ÎgÁ†øDö:½æsÀ€…®§Ê”)ƒéONÉe¸…<»ôWæ;Cɸ“Ⱥ—¸ËVŒî»ï>úˆ·œñ¢ï½{÷F…Òò-œ£Ö¢I@@Š…V†©S§RšvQQQ*R²dÉ®]»’‡Dõ:S¦L(j'ÎvTÒiºÌCGèµ™G=ô>yê‚øh3cÇŽ%'Ì@«Þ}÷]†·³H ²ƳL¾ÒZ>µåË—3¡4/!‰oÊ×ĤƒzÊß|óÍÜCLzGŠœxä|ùå—‹)BH>|¸).b>UŠ):CÃz,Í´¢…ŽÁå'20§¤Œ2L¥eË–zö`"3štžR—Tñ!Ÿï¼óùÉI™;v„ p5ƒ‹ë˜iŽsžÞñ ô!3lŒ'†œ\%J” ƒ<¨^›^Åb?UÓ*¦*^J‘K|‚R¨Ì-xS8óˆgÃO*ú¯x;P—”.]ºˆ!éÂ?þH6C`xªÃ }à.Š’¯…~ÀFGkIM¹Ä%p•ü®«áŒÄŒ³iâ¤DÔ2äÑÑÑ *6“8ƒkäÈ‘¸(MÅ–Ìâ+?1«ù„ŸPôd‚ˆð1œÖFù\à\Èr9±ùXŸG¾€ ù%|I¡R„;+t¢-˜*øýľT‡5CN Wâ’yB!’àÌ.&0ígýÑO°ùæ›o2'™~01ÒÐ2zŠÔÑfú®Ö’N!ˆlÊ&»\n— ÍF kö’Ÿ  m¤L„¿þúë"25J–i†«Íèæh€þaÑPdÝŽgiŒ ¤XÌ4RFîb“û %—öãö¤Zûé iXá#qÊ”)5bÄä#"‰7oÞ,³ˆ@HwÏ=÷p<å©yóæ}úé§ÜðùØc!},xºƒˆ1„Ã×$„CÒIó¼ñ÷Ø=ÜÛr¬T+ s_y 5½@ôpÏÀ!’ÀQ”šŠê s_’‹êÙ³'7ª‘X;îIAc€†È#àÏn¿ýv2HjÓ`ÆÑ ú “^’ÞS©T"X4dì ´BK`,Aa’d¥äPÔýŒµ£‡¾ËP±bE´:ÈÅ×1cÆðÉÔ 1ZØž6m‰0÷´Ÿy!NP­Pô<-þ1È_fé8]¨”†Œ0-ó¦bÝ ž…åfÚ~ýõ× ÎÃ?Lâ!CxpòäÉ_&&’Öb6èL¢·qϸÐ0€Ñ$Љ§¨OºƒSè5TB“@€¶… “؉5u >4²mÛ¶ø‰ röÞ}÷Ý=ò‹ãaŽo¼‘f œÄܦ|Œ<¦S ¡ Gš™ðB …„„0m˜{¨iÒÐ(((1Ѝei%1)åöV!ay–3-“™¢?øàõ8„tŒF¿ñŠ ¼E4±ªP*rÁ±4½Gyà1ÉÝa"+‘ -Þ #ŠAªØOîE_/°ÓÈâ¾¹êŽÆ1¯äFCø2{9c58©„À‚U€ùÝ+:îMâüCàò`\&_a}ØB¢ð®»îâF"Rü!=Ùûº9 ›†é„ª+¿%â^Ÿˆ ÈPÍœZÌgM-”>]3Ÿù€Ýƒà`¢â‚ÀÃ#Öò5ê¹TT]rÅ ùâ«äæÁ$'F5"¨ ùb1l6¢À°¡¯î%(¾"wÐ…©]­ÕLxpaqc¾2&?h©ÔÖÈ€îIó(åMÓ .Q ù…œÂr¥ 87NàA›)4G™©‹bqá¢ç©dÚt\'ÆI/Õ¡7ho´GóÚ«”ÃýlmRÝt¼ÚÌè OÈÜ¢èH)„ÁhƒÎÄgÔ,èÔ"Mh›tGMKæ2½fDÔ…ÌP£\8î‹<’<n„R8à˜“{†^È'Œ†Ä€B[·ËøZc˜8dÀÕO¢íʪ|·GG)Þu5"œ ¼kÚ–%j÷_aæ¤ÒA>á"÷ð.sC:‘I7Œ!æŒçá@“ gê0Nò#ÊæùAÅC'";’tDŒ*ÕL£"ª@Z Yä@×ÓWt=ª@‰Æïaú>éøëPQ?áN™ÃªеràWª yx¥À'¾bj½Gݧ™ŸLo5À@™:OŠ&-µ0Ãå]”Ž©O@!øEU©€ ц¼C¦ 4y $R^æBŸÞzë-=‚-E“jh¶,r¥XÃäž~RZ\@ÃPVðÒ ;¨ÍÝbÍÕ6|ƒ0²€_QS¬SÈ8É;ÀƒÂˆEÙ*Õ{l%ÊIó€iÇæS•¡`ˆ]ZÈ‚‡ZÈ#3«&Ö5(CÃÌ SSÕ69÷3;Ñ ,:²È„?Ö%H1fÀb´\'KÎb a ızª‹~IÞá©S“è "R«_nü  *¦e_©í¥‘ÉE yœaâbŠa²€µÌé¸ PžŒÍad—†‰¶ÉGEÀ„\ÀN@{ ôQkE*MO)#KÇÅð˜h…ªBV&@¥X ¼ÄÈ£ ü ¦(è†(àžf@dõ]ZÂt~S™4CS›Ÿ˜Œ©z!jh»F¡<Œ©–HÕ`;ŸŒ{|³¨M´ •¢ÂLx•’-@`ãvÌJéQÔ·~’<¡ J¡Ç `ϼPËi¦'fÑ"…h¨_!#]¶¯Jô.7®F„c>0lð‰ü5ÆÕÂâ.‡9˜H,ó^ÚÀ»­uéDê0Š3ŠY÷ñÇ£`"£¹xXlG CcB Á|ˆu¸Ÿ)Ê4P(3â õ ?!婟»V€Xž'(­™6³BC¥x8áZÍ ¦¥d4ýÂ.䫜¨ÒrŒL˜˜dÒ²@B§ÀWd%òW N¨ºä•¹gºÊ†Ã³é§ ,ZNKX~ 3B"ä÷ØLH¤³Haw¬±!ž0ÂxEGF5–Ö)oÛ‡~È&b1§9f)~zaÊSPO¦¤f©\Ü s!¦ð†OÍdEšˆª\@]&¿°Ô/™ù ©`h„FÈ_´ZÆ‹‘ÅçLKˆg#¦0}DàYHJ›¡ÖÐxÉq,`š‡ùE"Dƒª £Ž³öVœ~ÜKIýGNQãÈ=E/@8J`Ü1°H„'µ*ùÅ á *•Àæ8…P<+jÀrÚûEí”)ß”šŸ)x^nmâkø‰î gávª†æŒAúóàÙßtPA4Úã–tHRÒe‰Âf0³ŒN¾â#¥ƒ°¿ÒY†’5QÜøPƒÝœŒ žCî±èŒåªà@~2ãéÖŠœÒ€Ê†ƒp7Rq j§/ÊÎ#‡°èŒ#‰†PÏÖ9ü@Ša6ÏVÉê–{VïXÉæÆ–âdŸÁÌ@ݤäÔ.#(‰Ÿ” ˆ ;!Xdòb™Ù²±uÊ‚°¨ÂN!àA2ˆžé`šó,‚…D˜–¦×Ìkz-Ð2ý”BhP¦x/4|ÎÌ"b ïªð‰¶!–‰,PÄi¸K;-ðG}w+Ðï‚W#™¶Žœ‚uh¥&ªÒ…~Eáå†Y'6âÓrJZ¡ÇÁOòøáa@LÀ|r 8¸Ÿ°ÏP‘ȃ‹Ì X•†R‰Ä$'ó __™ä5VÑð,´Dþ1.VŒúÅ…9¢Vñ #" é…†’Q•“µÜÍz ¿R8Ê,?Q/sR‘„:ú–Ó}„²í¼FŽÈÀ…³bˆÌ›S]®~ xwõÑ%µÐf£0`×®]{÷¯Ž‡±Þ¤A£M[‹<úêœäÙ Ó¢<¨{O¯ºúGÚC¸«Œ.©…øîô¼[úËi™ .:… GGè‘ê’A×¼.\mЬÁnS)ÙÌ£«Ô—±=Â]Fb^¥EáWÑœD÷äó’¸Û3Ý®RÎKFÍ’¦È§˜9õçŸ&£þ%Û®x—l‡Ö:†CO!É,cÏž=2àèW2Àìäψ×xYî5ˆºâÙpWÿzwõÑ%µÐÖá6oÞLA|ü&ê%Ut³¦h• ê’ÇcÒQÔ«ùœ@²ßp„0Pª’Sdrr{á’ëÈþÓ¯¿ÿþ[_p­äË—¯yóæÉ¦Ïˆ-Z4  [·ntʳä’ÍÈ^m‘sò矖vؾ}û9r$3§ÈÕFóËÒžd‹pgU¯$ÝŒ¢¡Ä©Š§ß¹s§²Ù62Ú­ÄÉ0’=¤ŠvïÞ-ÑL Ý<¤ØB‘*l*ŠÌÊON?ׇµVKÜVV )j?…¸#˜IT6žµ åÌ–-[Û¶mÕ#Ud»|Ü~2r(‚QuYOmž[ dQe—ú«U@{Ö]ˆ;óÞÓ˜áÇgÏž}ûöí/=ˆ7Ií§.Zb„Õ¯nšóÖíç4JÚž n’‡Õ{„ugƒ2Œ `£¬qûYNÑJ¤Ö§1À™†5êA¬pe“#´….M3³üd³Ñ1æ´ŠwkƒEfe£ bÍe£SzD“×&µ~U,®ÄøV™A8OPÉ6sU…µÁ=U9Õ#wNã7•SŸ*ÍVþÜ Ï64—Ø)*ÙŒv O?ùC6wT—Í/ÍXB7&Hõ«„À¼×"Ù"œx”Q·)JŠdŸ¨ÿË/¿´lÙ2cÆŒX)S¦äSW–,YR¥J•&Mô5 ×ܹsk×®­ Ø@;vì NFŽºZ´hÁ³dÀªˆ‰‰á)Åf)_çÏŸ_¬X12äÊ•«C‡_ýµ•`b¼k(e7j‰¦ _øï¯¿þ2ö2vÔ{ô ÇäTu’)n»‡¯ÆäwO$æ¤ô VÝhçæcÝS 0å@“Pó‡ÒM~Pj¿À› *”+WŽÎJîP {w„˜ù•.˜4¤%´JµûÍRzm€‡ºãééÆ]ÆÆfÐð×_ˆˆÐ<Ê!ŸÌ1¹æËš5kŒcßxãÖ­[“È«\¹ò£>ÊO&ã®eË–éÁÌ™33Fµk|u½òÊ+5jÔ –L™2qóøãèº!Öò«|Ã3îݳò̽¡¦ŠõUê¬52((¡aU“¸Kƒy Ýýj¡1çwrúMLã[*²Æ«a4É4€‹ØçjsmÃ=ßÏ%è‘¡—[‰WKܺ…ýªéénçÎîË’-Ù"Ü™+·¹% -÷Vhx0Ãÿ0cÆ YÌ^²d rôèÑäg€›5kÆÔÚ´i“„&ƒÏj7þæ›oHɘœ Ǩ%ÑÑÑLÚ… ’øã?¶jÕ RjÕ67‹ð~¥ Ê q̳6glJüíBwßõ«0†Ò¦MÛ©S'Ýë)•/Ô1Y <¨-º‘âÖìø•†¹ekRIJŸÆôÐ\÷Òj/E4™«W¯^­Z5uÁo~Zð›nL ¨›~“S¤09¢Ì/¼ðBfÍš%âHÆ©®ëê‚VÇ-=Ýh!^‘E@Yß~û-Óï±qì³Ï>ËèÒ¥‹¨7nÜ8pqñâÅfpÀ)R䡇¢ÀÏ>û¬V­Z(…ʯŸyæŠíÝ»·rèС|½ñÆ•Ç=Ç•ÚÍMÂWÔA¦ºÃ¯ÆØbW›¤K.‹uÝSN£_Ì_Uj*TÉ~¨At.¹1ô,Q~Ê'_©‹¾ºg®Å„ä$µê¢=0ÛTíá2™sVù£<î‰@¯iÌ™òV9Ï´ØÄNVÝ•¾I¶'‰oÄ…pŒéz¤èÞíá+½D‰yóæå^œ÷å—_2-gΜɽ©ü¥J•¤³9ß¿D¡t+ÍÃ[o½•§|ðAUñÑG¡ÞFEEY{H/_¾|ñâÅÅOšuæppÏ(µ_†š1·zç–ézœÍÃ`ýuóÐÛ¹sg?®âMo·’îöÊH»ƒD7˺ÍHd&¯;<„z/…×)xc,LQ¬w’­¦<Ò R¬æ®4 Kfk3sýúõ âäÉ“­@ÃE?&ã¯î.C[†ÏR •¸W2NDÐ3ÜtíÚêAC¹ï`˜Â… cÀñO‰@;æ…œo”æ=üðÃ|Ë}þùçøE°k™P¹sçF•tûÀ©(EŠ?ýô“ÆZÍ ³ßìÀgc-4wœ1ŒÛ/G7ý|ìzЭÃáI:µÕ_n¬v"ˆHäÇ<¿ýö›Û_¢*ÜÍpOF7ÍÝSF® òt[ºΓš¤²áÔÁ§Q’·ü>ä”êÎF9n &¯ˆ#0†ÿ},X²E8hm ÄŒ2yíæ3I[ > çœ9s˜–«V­2ÖGIdR‰«B=ta ¡“2Šßÿ=ÄÅÅ –Œ/5U,*'ù%|MžÞrË-<øúë¯kzè'åw›~“M PN1´{^Ù½ŒK•öûï¿«ñ|i‚úé.ß-ßÉàg©À f¦î™R¬á.å›ÿ„§ ÛÔ$‘ÅæH!ÑFæ‹°T >ª†º©6HG•Üú#Ô°Z¤&‹tr¹½@F+\jÜÕ«W«›ÿñúuêj¸1©ê–Ý~ÒJŽÖ"»øáx{ðàÁbH·råJÓùÔ#Š"¾—D¼&|åÙ’%KV¬XQÍUÚˆ#È£G-ZÄýÛo¿-¶¾nذDLmøa ~T•ï6CCH—p‹Úü‡È䂌¸éׯ_Μ9mjØSªB|.Tpk«LÃõˆlMÎj*¸×ÆüØOÊ«[Ui~ ®Äó_öˆÛ½omãÆOþ¸«0mR7[ÖŒ «Úo‚ÿ—S)Ù"œ qãSâ ;‰6T6NL<xØÉ &ƒ“0z|hHÀ³¸(mfâÏ,X°àwß}g ÝrÁ5 [±$?h7lØ0›´b_&°42üæ2O˜SBàÄ%¸$¨kú¨0]5cå 1Æò›$|eñ ]»vÊ J `Ì;AâY \?Ð:¥QÏVÂô,Í£@Ѳ·mnËÅÙF”€S«R¥JR'Ýf¥(ãÆQ£‰¨Ä³~Ö‰2˜äY$)ä°PÉtÿL™â.6YÞD©wæl€z&ÍÝ”‡ì|E·c‚Èç¦løö)ó+p#b²’Ú¦M¸Ï$Ü~ûíªE\Ä(Ü|óͤ¿ûî»Ì— °ÀOÆŠâº*Uª4lØÐ«ñ$£¬¶[D˜ºã–¼ZâÒ¤o[”Ь&=¢Í,i+]ËTaÆ_ÝB߯G´ßíTf7*œiAò«9$T©Ê'Ý–áíÆZ{!7î•iåÔ÷3å„•ß2¡´uß Aƒ14kÉE`ð…ôâžzõÕWÍŸÈW<}útîáC˜Ê|Œ6_Ü«bnR›ƒ'¦¥Œrº¸2Gh xâÞ²eËr£ås›èÄô‹hõW]fVRE`` _5#T#LŽ„íéA4¯½öš-«ïª«cÇŽ#7ÝtSúôé ¦TQ8S•ŸMš4aRC œ.]ºx€tصnݺ¬;RìMH‰f#ºã þ¿1¸8™¨ˆò5Oñ^PÂYåé Ë—/ÏŸ??™iÂîPå¨j¶Që)‡UU”’'žxÂå6jÿU;/.s²E8È!Ý!iÚ´)"µ1¾Âv÷Þ{ïwÜa@"¿¶ìEt¥òˆšï¿ÿ>C:2<†OÒn¯U«Vå‘ÊscÆ2 åÉd ±`ÓŸ6Ìz`Æ¢~ÚÈ©^ }¢Q˜HM|e´$66V`ŒFLá0–¬:íYŠxä‘GÈÌüdÕélÀÌšÿ”)SÈF«ÈÖ³gOUtÛm·Qí4óËòÊPîYf “<`>S…Ö6¨A@~ ‚{ˆ%JÕZ³dmŒÎRÎ^òÆXÆL23—(ŸüÒ75mÑ † fÍš&7¡ ¢ ¥Á’LD4ФîÝ»‹Èà4 ¨«R$¿’2iÒ$¾nܸ‘YJx÷”ùá‡R`dd¤Hç6ŽmÈ’ý{-<<œ± V¯Á -±`VF™J1BÞ1.J‡ë©©S§2Ì1í'Ÿ|âö}É\#z <à «Ì×­¹ÀH………‘‡øíLžOÖ¼i-™ßyçóÓÐ )µîÔ3SfÐ~Xä+ùÑ).˜QŽà¦FùêÔ©CL/ /¾BŒ0³˜_ÜKÁ•*€ §%©E ôSLùI "@ ³Rc £‚¯X±~^»v-AåUÛ$X¡4J’îçÆ¸pæÄqYÔS¶ßœKþP&7tÎ!”ª`Ž‹G{¸Œ&ÛxzKðÝÒ¥K¥!iÄ/Îasá}ñË™œNsT€ô/¿ü² ÂüRäM_“;ÚHpÃ"z=\ã*§™ç¬I2o¥yÁ^æ‰æ¼!@¸O?ý”BÄ‹jƒ1²/5ƒÖÚú†•y~2c” lá(KôtêÍ7ßdZ z™D{RÁÓü$ùn’ h& ê!?]èkÈ 7Û! ‚ì!À$i]-QHW;! Ö0ݤwÜ¿÷Þ{˜;+&#¿Âç^&¶(PU¤¤\‹î!ÐSÂQQ‰ 4Ïž=Ó±ŒPž!©Ç4CJJ–qmݺUá|úUíGdÐGì<Æ yG_0 $˜¨š3ùG¿a–’S«;Ê ’¯ŸK]f,äEDÄkèÝ ¢¨¡ "«ˆÌzʆ†Pˆ“”0# œ@~„&tææƒ>pã¥t%:ás ÈÜh*Ÿ<((çB8˜®Àl!àÎ;ï$3|K×T)*¬á4AÎØaˈ3™†¶«D³@œ@_`cõB] cÈ6räHê#™¤BMÒj¯¢d®ÐÓ&)Þæ¿ÒeÊç)/ÕA>au«QõNœ8‘u[ÕFXn¨‹–èR:)Pk§ºƒ ȤÀ(4ÿð¹äóÑAfhGŠEÇ¥ÁAˆô€Œ`³»=IrŸlÎÔ¦¦½¹­Ee7³â;‚ d³aƒÏp¼ð8“DO¹½”VÌf&ÚCëŽ`TfÉÊuëÖ±D'eÍ·mO ŽAE—¹/Xc‚ÉÌôžiú±A98HAj£î¹%sCÐÕ£G<ÜùÜjŒH±`9èŽÅFiq&˜;‚ Ö¤dø¡€šFº5c-Ú‘û%T@^@:y)OšÌV •¼Ð¥Æ`R´î.#Èym¶«Iîe¾’Gã¨O23í1‚ù*ÁHÂËOÒQ“"ýs­T?±z'Ç#ƒX¡×HRPJøŠVäþÕ ÙÝòdoÊV&¾ä¤0W¡(`†86týúõuDœi$Üð,&‚eÓ\@v#a'FPÀ“S…dº"DØ6*d¥%xÿàOq‘FS~¼â»ïŠb^ÈMââ…±qM“ßR8î³ 1;ðÒ¦\JÉê[š“‚@z™Ø kAÑà„”4¡/4àî»ïæW¼Üç4U»Ýu·ô‘ Ú vò‰ÒÀ Q 5‡Í<¢µª(B¢‘_mf]PÄ1{‹¯@òÅž¥v‚Ül °z1¯Á]7„ó4„°øO˜ÐMÒSr“ŸHÑ:{<vè4• ÿ} ³‘1Éoàyd:,GKäü—…-î²æÉ[¨E#qˆÚâ^Ã]A9rcŒ¡‘È{)sŸÕk=+`¬A> iCâ dN©vñŒj‡Îi‡hú¸/&V ÊíLSÝD‡£djämWwó§ZE6xÃÜ'Zݰ‹ÆËôDÈ=jÖ'õÒTéODÐȆ5(ÍR¼ãAÐ _¡¸ÅûòUb‘I…kEº’Xͦ(ã‡~gƒ­2aAÖÏÏ3k¯W¯^:šü†šJ–I¡X<~¨`HO+™tD3—yJ•SUpÃOÌL;gØŽi£-q+þ´„F¢ˆ‘`S¶ˆŠR¡™`Ìa±>¦™M ª z F åW€ ©$*i †%h‚*j>Fº£}NLWr")˜ö,3.Á?~%ÞR-Ñ´D¬ÀÜ1&nÉž3ϘõBó‘JØ 5ª§¸• ‰Ä‡ýôÓ¢*r<‚ ·îi7#ؽ‡Éf&cê^Q`ÚãÉ”“„ ¤´ÑD'@&bCKµDÓóœÙÇ4ÏS]´Ò‚¹D«³Ü‹U.î´kƵ{c”‡>H1$¾ÆŽ ñUa;5á ÖêÄM¯A ô´#u´4Àä"ƒy/`?\&°"Õ±,Ä:+Ú§›z¨ª j–ñÌ3×LлźÚÓ"»‰›Ð\cáK3X£å«"9奤 4žéÀd×Ìe9ç*0‹L|¥I¬„ÉKãeꩃ 7³€¥5Íe|˜üÊWîé/-$™{A¯è\.ZEgñ–ó”O¡nOUÊI\d ¿bo\€%ÁØHcN1¹› ŸûxL[5”."š¨"=~.ùCk¥b|Ãê/;¦”€ZLc˜Œ¬#*Â<ɯd‹pš3[ŒŽˆ+öb¸Ñ,eø%f‘{Ž™¨5ã†QDuÕ–).V•5[ÄXÊÈéà2€¦r¯ó“ÛL!²? ¤‡ÂššHfš¥^•‰å‡G¦¨^´B; šÇ™Qæ ýÈ[ à+’-L¥:Ú¬©ÈSÌaƒpÀy¢E2üæX™bYšÀôfr"†˜Š éŠ|A¦§àOp´S|,À`-Úœ"2 Â+â`5’A—ò®9&Iʧ&Dðsê¢[¸aFScš´3ש‚©¥Æð¸”œEÍÐÖM­dŒNÑHÌùÐ=å¶B@8` ëפ$Ÿ½ÿYÌck R3¦’ÚT ^ˆ>Æ]¦Áð¸,$¸†áqÄ7¼ ˜ÛMåÀ`Ta;å@vç‘"…Ί„…9i®±%ƒ¨vºUFîaâJÄ~|¢¡ÊÐäb ³ƒ%@}¥"|øÒØäÛg}]Aºph"€[Ú3Cùš¿&LÀ)¢–cßÈ«¡ð$ƒf1쇎K¢ŒyÇÄä0•_Ý!Çz;y$¸áN¦ãÚG÷Á•ú«À]¤p¹êâa+Írr}pººå‰~=ü2 =s™– =S¦ ü uG.(@§®†ù’l*»M1` €Û£(†0ÏÆ^ξJ»§¤°\an^×õϪ@ÍO>uf¦´ŠíT‹[ù¢ñnya‘în*én“E?Á²òƨmV—вCÔA7;šL‡P–®lT¡ýÎP°lÿIxwÕËï®×”V÷Ò ›,©ÛÂOö«ºlI7ÅÜÕiä°2⻇Æí7v÷ñº5ãDc`£é‚Æišq6mŽ éc3t+ÄÔ˜ÇfÛƒ-{Å]ˆ•f%È¿ªÚÝÏÒ0ØCùݬ®Ý0é†~UKT%›Ü°Õ ݨRe–[Å*òstóÕ䌞¥LkªÁî9bÚ˜{T]FÛ[±ÜØ Õn“‘¯’4ÕO”Kþœ9:6gi¤Ú&5Ý=io’3Â%-e½Ú= xð(àQ i)à!\ÒÒ߫ݣ€G®<„»R”õÊõ(àQÀ£€G¤¥€‡pIK¯v< x¸RðîJQÖ+×£€G’–Â%-ý½Ú= xð(àQàJQÀC¸+EY¯\< xHZ x—´ô÷j÷(àQÀ£€G+Eá®e½r= xð(àQ i)à!\ÒÒ߫ݣ€G®<„»R”õÊõ(àQÀ£€G¤¥€‡pIK¯v< x¸RðîJQÖ+×£€G’–Â%-ý½Ú= xð(àQàJQÀC¸+EY¯\< xHZ x—´ô÷j÷(àQÀ£€G+E¤D8½oÐ^÷Ç»õì ¢¤ó~?½sR/ÓÓëþìÒkEõU/ôS6{'¡~ÕûúìÞzC¼žr¿«Ðýö?•C«ì]…*ß^nܸ9r¼õÖ[ö,ʲўj™5k–ŸÁjj[w¾Œ¤ðŠò( Àù;wît3ç™”Û?ݳ€Yo‚âj£'ýB¼ØôanšBiº¸ îòúŠ®6:\Þö$ÂÑ d¢Œ0$uáÂ…k×®ÍÃŒq•*UŠ-*H3D‘IˆO•*U¡B…¸Ÿ9s&÷ˆ]÷À#Ç3gÎ,JQ¦á¼î†ÌªU«,X TNXJÎ@¡EŸ>}(Ùðà<ÞHY™—w`èµ[!…EŠI‘"MJ—.]ÅŠ©Î4;Aó!kÖ¬ÀMçòäÉ£ÎÚ oÙ²%oܸ‘wáº7C¹wïÞd{ôÑG)Ç­dgµÒÔò3ý[žyá„M2„3ÜÂàà>{öì•*UŠ0Ø•+Wƌнœf„Á£ü°ÁÊ7Ï?ÿ¼u˜œHXÉw=.ŠQ„^J´µ"!“|¡4C Dá¡®]»"Ê?øà®ÇK”(A"ûÞeG8U*ÈÒ€^)S¦¤v.šA eøÚàs6cÆŒ¤™{û‰Ç¡Lß¾}yöÛo¿5rQ¾$‚¼»çræ@Cy;¡íôéÓ)$,,Ì&ÀF{@_jaÝó…ó¢—Ó£À…P@*”8ö¬óNSÃ])Ê©§~ùåûõ*A8f“QË"ŠH°Zk%Ü.„D^£@’!œt *7Y²dá$CùÄ æ¹Q¢ §`ÅŠãkhh(÷æ›orò™ùŽçfù?ÝKMü*ÐâBûs/Sk2´mÛDÁYG“ly³’QÝn!Ðe\„S«Ô f¡×B/¿K½=q«BZÂM† ”Ó‚tÚ·o8½óÎ;JwÏ"5ž.÷Š=5$Sø')dÍš5¢˜>5j$àw{„Îlª—âQà)£‚^p¸Ú×TbéAƒáÉxã7PUug!%ØÌºÄ&]–ÇÏj–‘X¿~ýR¥J½öÚkîZüÂÄ.K’k!I†pnÉ k‚%Mš4¥äFÀ#—&Mn>üðC’HO,*–òçÏO"‚ž”ŋˠ §M›¦’&C®\¹úõëǯ¥µ´;2I©U«Ö»ï¾K ¶ bº1[êÖ­ 6€"¬Ì‘jÊK9cÆ >)íî»ï9r$– GkyÊtB¸ËkÆ3~Z… g n×® Ób$?q1ÛY}”{V7’¦ÏvëÖ ¯ì€h?$¥øõ“O>É™3':Ÿ””V­ZÉx¥ƒS§NÅäk¯^½øŒŒŒŒ…À?‹P#88_1?1:2¹’ë„ñúu5PF…ýບ5k.\¸Ðš$œ‡?ôÐCvšZwW”Š£&9ßÚ*»­ŽwéÒmõÕW_uGØ] Cp­´!)ÎqJÁ¯¬0 ´„LHjPÇeÄðþŽŽŽV:‰ÈY·#óE?iŒ=ú‘GAþÊËÇ'& xÀ¯èzØ©S'Ò…ªîã?fÕʼ‚¤Ð’o¼ÑZ‚åF ËŽp´Ê ™R4DQ“ðâ r´6 ˜‰2dP˜\ܘA†%P”~ÀÅbk@£ˆÏ³PÀk֬Ϣ,X°@9Ej ‹‹ã^#E:h‡ßèÕ!f·{eîZ™^;¯ B¬‹-µ÷j%BŒg.³ÞÜK~Uœ€ávèûI‹p£FB›”ÞÉÜW³;wîL¥£[×’¶× «¨I‰p'øx?LøJž"4_|ñEnð€1Þëׯó´8ÇO°5jëpdxï½÷>ûì3q<ÏÞyçB©W^yåý÷ßç†õ§=zpÃêcŠqà 7 ëÈk —£ ^½zü  æÎ ÐbØaåð+ÐB¢-b_ÑÁv#(´‚û…"\DªGÌmHG ‰  @O"wHdC1²C(ÌH„›‘É“7o^hÈtâ׎;òìœ9s ÃÀ;tè@"§³Ðç™gžá×)S¦ˆQQQÜ ;“ˆ@u¯¿þzõêÕi›íL8s=ÿŠÊ+üº¢€–“Q¿øð*+î7ß|³(`>vÓm“Rx¤|ùòø´èn|-T+ƒte·¿Ýv”úÅvé«V$ÍÜZ©Ÿ†lnåO‹ î 5¦³ ü6'$å37i-âˆòÕBk˜jÔ¢­Ö‹îí¼¢€zjF…Šº"V’ á4ØÚÈ ))Š3¥K—&–ò±Çƒ•‘ËŒå÷߯Å9‚ãñj‘‰¸vxâË/¿ÉÅ’þ÷ÝwgW‘Ò´iÓI“&qÃdàS9#""¨‚{*•»ò›o¾á‘Ö­[ó+Ëo@x  yÌa! ã×ÿ€3l¦ÑwÑŠžÒH›Bø iÉSO=¹è,îGØšúNfu“ù¹Æ®²>A:ѪÀ6.G~’ÉËD¢¿xxÚ´ióè D·2.?ü0ùQ €L’ f"¥‘8yòdù裠èHȉ-mj¦y—GËKäûý÷ß ïQòðáÃa]t,…ÚKúËÍþé§Ÿ2—ádXš¯p2JNM.@NaSð?"Ya–¡·‚8x(SåÃùL ¼ h‡dæBAœ7os“ºÐÎåP¡Uk×®E 1Pø“\­Z5æã®»îâ)R˜wLÚ‰^Ί‰Ü!K—.5 rI-à”";dÈ²Ñ @"‡êÔ©ƒ;‡MA„/0q½"ÜXhxöÙgêWLL v!Ú-÷¬É4`»NöØ%ÂAh[Ê‚Ö0M54wä¯$5‚[ìƒò)–B“mâĉ$²VG¢˜[±|ü*#oëÖ­p\‚ñÁS°…[q#l3‘Až:Rô §Ú<¡@ÚF"ϲêKÛO}ygÁ¬4O¼H½4Ry€y&˜<–¢ „êÇöcqÒqóf#Y'çË/¿Ì$$ú‘ÉÏ#ÕAA=Ô…y§€”uëÖic—*¢dq̘1 Ú’%KÐ¥7|õÕW~‹ô¹úw×^éóÊ¿BÐ grõïßßôįÌ\f+Kérñ‰uùdEÙ²eÜcÌ-shõ¬%ÖžÍM$¨É.9íõ•G´µ´{÷î|Z”Ä¢rœ [¤L3„Š(Õñ -aêI˜(<›O©˜<òÀõè þùcåܺçž{Z´hA!‚..n^zé¥Õ«WsÏ”µ(þõ×_ÓMˆ@iÀ­ÊÔ–-C^¡1ºªŠMJ„¡EYQÜH8"1e‚`Ià?œð˜Lj¨…3Ðe`D~EÚ’òöÛosïö¶[¬<ª £Ž¹C†[o½FD*S¦ ~r bÉýH]Í›7‡5áH–£h⻤\¹r4  dûüà~§3@(-Išð£…bq´N…œ‡6“‡…FUYÈ€J ÇË*E‡@{…ÑXÉŒÒÊôÀÂâ6_¡‚KjCd¹vÑ W®\É º$µHUD.à´dšÉ€ó½®ªžüƒ“®ÓJ3Ð…~†ƒGòZÎF"ªÈðùçŸ3ñ™ò„Gñ³^ʼʯLy~‚Ï¥9L îDÁ?þˆÇl]´$ÁO 4àA¼ˆ|]¾|9÷ƒf-ƒrX =˜É‚懧ýÁd6‘7`˜’-ZÄ”$hŽºnºé&~ÀT>$ !xÓ Ò}à.²ý”œ±4xĈÌq&/Ù ò娸Á°êX!…lÈRº€(Ðê ¨;:ý:™§I†p¦AH)sÇ%ڜԺŽìK´ú3uÆ[BîµÕß-¯¹GdŸu½G9݈Yc_íHSU„@YqèD+ÍîÉ'Ÿ´cOi ØH'²†©„+zùmB?œý>§cOܦ­EOù%Z7Í®²]ön=N¤Æ!B–3' û%GŒæ ‚ÕEº¾ª:/–òŠrÅu^8(×`ðà*‡÷Îi‚Šôgþ²áU^JМP$+d–ÜV¬X¡Æ=ËÕ¢0D{ á†ÙÇ ì3€„…pòà~$!*H Œ'íÕuÀNš„` $êÂ-)thi3s %’`.9KZEÁÜ{ï½”`gPÈ¥¤íL\˜qµyóæ† R2Q Ñv„ð°¤BrXê£I¤Súuy·ð^l™dç'‰W¥0~’Å’’nECTìq ’™~f–(´©a7g£6ǨR?»Í¯ ÿ™ÿÍ Hî6[ºÁš«–®ŽÈ«bÝ@ršIç&”v‘»¬ ´ÜÆ«á–B„,X™ò¥PÂezuN$¯UÿÄc¶Œä'Il{€_{`Z·#ÄÕ¸ZSC³À­[¨—ñ¹[&˜úkÓGùn¿ˆ»dµJzªîmí:Ð\v«ªzD³Ìo¦kj[guè¼­·‘Ù½  2­ïÿ™4ûÏxãÌŠ’ áà·5Ÿ‰'ldž~µq5†6Ž” b帇Y"[½uËewÿÝ2]†ˆ·XMBÜÐWåsè«8F÷—]lEMí1r¹oü¬XSÌuy.zš' 3cÑÝ/÷,éÜ€gvg;ó=s<¥ö_^ÃîÌY*µ×¯Í4ÒR¤´Z³Ý„<~npë¬:.AyŒ¤*𨳢ž¾úõWÕéÓÔ½ŸÈ6A¦ÒÎ7{÷×'4ñÅŠZ€àF‘¢,.¸O“¿>éc½N2„S ˜Ì&-³Òô+3ß-29M~“Î&Y$ÈüöBZŒU§D’|îöÚ3bßq|.hä°ýÝ6…ß~ûí80q#¨UÈ;óÑÉ6ºì’È´-œ¨~0&ä£^ë/}7MÃÔO×3éGO¾ŠÄU31ð‡˜–D"²ðưH®(MuÜn  ™iƒºxœ ý µý¼f_F%À ÆfÐ[S©ÚîÍ~5Õ¢ ð ¶Úi†©—rÄ«*ÐÏ.h·`ÑA%˜B­-ÖI]p¡ sñ•Z¼—íÙôônü( i(V„«qQâ% FÙL÷òól]WdL2„3óHÃcšiïw.8)&4Ýo$¬1Gœ‰W³ÊÝr–0w¤0»âLÜó §YʵM±~±—´ÁGij[“œœëA-& %°”í\‹‚ÍL&­Á :3FÔ$ !· 8ÉñsÑÓšì§w© Ù*úãÙ'‘Ã9­ªÝí7ÖÌaEE/wN†U«#jƒèàŽ¹hÊèAóó0 hÜîVJ##ŒMñô‘JÕ6BÉi±vV¾é@x’)A#Å Æ79‡ fl/Z¹W/‘\ÞãÉŒöª·ÇË}uVâK>°dÖý ïN’!sXžC.BZ%S´oCžCf;VØØAœ«ÎeF„q:}Ó{sØÞÈÉR:Y‡ýœ#…°@e&ú–™Ù˜‚Ý&!‚Å\#jG;å;‚38 Ž{ WÀpé¤ 'Q§RøKÐ<â^6éÅ1œo™æ¿p¢_HN Ñ)vtÓú°MG‡¹àk…z¬)ÒSG®–ëõÄFsO016 Ÿç¢'ñÖ2eà P3ˆüXcœ˜§ã` 8y8 ™3 ?§EP)Åò,tÓæð°¢t|3}é@#Ž†Ñæ93G./ÂQ²¢·i ì9ÔÂ~©áŸ3ׯüŒ0[˜D2[ÍÔ·†¤!“CXÈGùÚIÂ=;®h¼g.òÀœx`'a$?¹cRT ?i_0sd†U¦‚Ü+Â6^žë‡î$¸ÑŒ˜{óE]?9kO“ áx'³µmZ ˆK½çŒtä8ö–ÎÑ@Ðó•M*È ŽÞ!'‡¿!mq£i«‡½^‡¶„OzA /„SŸrEéb÷ ûHÀW^~ÆW°D r:\Ž’9û€óudöéÈD6O‘¤Ùt ŸÚ#7×™ñRx‹ ªô`Óy zÑ]DÇ·|Õt,"1#~úé'úES‰¬Ñ;ÊÏEOhk12¼1ÇJI)MaØñ†;šO¤fÁ‰cmõºŸTͱÎGk;*{}ظ#9nëd—B÷³r{r\“l8P†a Ù¥¤Ã!ÔƒÚÎÏiF2ÁÁlœ‡Ld 3ú ùem<§"Šâ}K¯Ž%”¦’ÙÎw™k¼iEѹõh˜ÅtKf| M¡«A%ëM"Gc”ùʹ½Ð=O`zÔ£IlL#Õåë9Ràr1L2+VGós ä܆3# ’þgw’ áh™ÞhŠÜa`…HO6ùs\$0ÃI3ÌvÄ^Ô‚8F ͱ`½ƒ¢Yuˆ*äâX»ý1-¬N7€(¢„sqH?üðCêT)råÌ>gv¯£™Ø„óxÒ¼ðÂKä$Ö–œÑ±1µêÔN™:gu“¨#ãh*§½q£ÍžÚk‰ÓXê2FRpáhs|ƒœ7FEXN¸%9O".Í$b*É æ!d=è}´w•sÇÏEO·E…?º8©ÒA£ã'ñòñ’ž÷ß{‡Ï.]:%Ì™" >>_o»íÙgsçÏ#qöÜ9L!Þ½G]ø3õæIŦ"µ¹‡8îe'·Öù?Yó”p·ÿF_ä‘ü9ÃzÑüï¿÷êß; U@ŠT)ccãå$ëÍ öÒAT(öÀ c  2À`:lWH ÿ°{WgàêY~E½à $¾êôw(ÔYû¡¿¢r¸ìð'P)m@rñ8þ©^©P\P¡H´ø1”PÏ‹¥< «(èB>/Ï®µln³÷üb‚_v¯ÉµF$§½I†pD š,¾5I%;ÛãDA è…¸kž{î9Ä„N“ÃQ)Ï¥W›ò ‡~¨b ‰G`[ù@ð‘¡_ÿGN$þ¸qS¶ŒéòeÏ8NTêt¡Óê5nœ6]ægŸy‰93iÂdd÷ÌØ˜: ¤LõÂK/R*?µ€B8{3*mqm©é"üÝ€¢_l½±ç÷€:œ`=¥jYQ¼€C§C@-òIc ÝÇzØDœsÑÓj¡v&džÀÊ9|䨡c'4 Ä[÷Ù©S4o¸pùb:7âÜ~ë]ÓgjÙºU¼{)æÍ?|ôˆÞH‰ª et„Ä=¯ÚÑ4;kxÅÿœ0H0–¿|oÁ¢Ù¸§¸S»NžøóÏí'N<üão›«×æ4NcZõCí<¤3vaÚ #ž3p‡Ê L…þ«Óåñ¬"/Ø‚m˜ eðáž…€ ¯/¼Ú.¢£Q¿¤Ðð,N]º¬£Ã¡'ŠEÉéyÓ4!"Äi¼$‚p:¨žA¤N‹gÔêÍH„h0’N)¤¡üOÂþ÷ÜÎj‹,õÔ­.‹[,jLôä“GNÑ8ýwxÿcGŽòõèá#‰ÇO?zÌ~ÒÍÉãÿlOT±*Y «Ö$³„dÑeCzhFk %L¬mî­Ÿê‘Zh¸¢erìo‹ÒRO­:[BÓzJ0â'LÜ[]Õ7€Ñk˜éÙo¬ÝÆî1yÜн;\ν¬®–_„|ûï9ͯÆ$C8Ú ~þùçñe!D8( ª±yLl®B$…N áHxÓ÷ .Ab¬è<Ž«J¿Â%z™?ùI%±•)3g¸¥É’9n¬ðI£§‡MH•&`Þ’!Z¤É™-ª€4™ÒfÌž#×¼E #cbâ —Öº@8$‚9¨&YÞ¥¼M‹7Æs0.ppb)êSøryå)=nX±5½Ó Ç!‘ø’Ä28ƒœÒô8TÏCO˜^Q œÑ' Ì‘Ç9œ3uÇ–Í?|ãEŒŽ¾ý»¼úö멯ošérgË›* e·î=?ûêËiÒB,'Y?˜›€¢S[QËÔÖä÷Ûò?¹Ÿgè­ïL0Âù$"‡¿cGŽÝ»ûè]Mš×Þ¾gÇŸ‡w6Jæ«/Öb¹Ò¼•‹^~SÀ-·ÜBÛ`|‰4XÇéê([™‚‰ÀVdy †!o$‰¬ÚÚ;Ætð<Àt­;z7 %óLˆ^ÂWxu·90†ÝÆ¢/#’g±#±tÉîòît4 Ù°áŒB† rör‹d¸Œ¾ÿIó+—Á=G$O%1á Ú‚zbÁ_µT¬VaÎZûwï9yôØ‘c»þüK7'@»cÇù•û{ö:‰'Ní÷Т”é V „Uì`?k‰™Î4U˨jƒ"‰,JH¿ê'CPÝë7Ïdª/zÊ/Û _éŠÖ¶ÚÏ4Ë(Go!p»² DItÃ’ ·&© áºûX k’mÓ²¯{\¡’“ áØPŒÈ–݆ÜÊ(qÄnhÝk€}‹z4Â:’‹¦ Àh8±ü8 ñA9Àž ò‹à~ÍM$ð)Æz^ãÆMS¦H›* u¯ŽO]µlr=*f&!rzLê€4éÒìÝ?E@J"8¨`JH0&5"+ñ±Gi,Ÿð0HáärkÞ¹¬±óžæžz¤xÖ&H¿XGá?­'éE6·Ýva8d bP´H-mÊÙH9¬Éé@g¥§ûÝz—:ÄϛؖÔAÍ?ïýo?ÿ$]Ê€¶mšïÞ»kùŠ•yrÈš.Û°>CrgÍY¯N}ªX¶byöœ9 Œe‚Pè§Ób”ËšD:K Ggn㻆FÔ!~ùñÿm8RŽî?œxìDãZ5ß_ª€\ùs§ Hݨj½};÷êe~à+J€YÛä"Ÿ³t ;Z Î H¸´¼Š‘ó(Å`; ;%R³…hÓˆcÙ­,#›°ª—’ó|ÍE©’A2|¡ªÑÄAŠ1%m—ýűӅö¿Ï#ö>ÒÔ^ûBÇuŠž>n„’ïÿ¼Äf}ðaº4i;3‹}ÖÛßàÓXöÜi#ϱê|%XQÈn+ŠÆ0§1§^£Á z6Ü«G,ºXÜtSƒ)‹\4ÞN³L}7Ø |.MVŽûø.÷Ñ([0±oà“ž¢Ría…UT© ‹OÃ3ƒ^mÐäÓ´¶ J¶³‡7nd,X‰PÉL^)ÐÜ_‹î„$C8éÆF¦t@tS1,:ÈüŠ^¹¥ÝÏqOÔµ4#T3;ÌÂt"§4²ÃÃGì;”x"ñèAÚà;Ò‰±ïèñ½Ge(8iÒ }o'p3Ú˜Õn,(ß=.ðÞ¦´ò›§Â&߆_ºæ·Âìvƒ¸ßÎJßÏEO*bÆj½š{™¼G=µÌu<ñðÞý‰'!Ä)ú¾ç×]qŽùÐEBĵOŽ{9CL{å†ÂÍþà§‹sŒ#ä œ÷™q>/¥Ï[é¦ýG¹~=z¤Ë¥¤JÒ_¼ôí•[±ˆÄ¡Ù€mhB2˜ð¦ò+Á5Ü#€p6*?º‘Îp!Cxµ¢F0-8‡~C"æ²0 ű‰ ÐxÑG‚Q©‡º3‚nØ ‡#ÌÚñÍqºÜ£ (:üƒVx¡uD=æ/Žz휣=èO”Fð*NQøÙmÄ\ G]…Ùı | ÔYq„Œ¡]ÑG(Ì‚Í8sÜ9£}ÚØ€½þêkè¦];wq&é1[¸PíðÁC|•Ó„‰{9“§9ÅÈÍ:·[vÃzÕ°m{¥Í¶uD´UÛ •H!:|€{9a‰2H^¡J2îÜ(¶ÑZ“6š˜<«88y¬,´Ã™(—Úaâ>R@_U#9—Èô$”I,ªJÕ<ÒIÄÁF9nar-ÂÝI2„AÝj‘vÔÚÀ—Ø~8#±¼îXp?±{–2ÿÁÄ5쇬<‘x`ÿQLJq2qç_>ÁíØ 'œ›ƒÀ“¿þþý§üòîVéÞO¿¾ìê¶àO±^·?Dmа¾–¢™`SË=댞zÐÌG§FèÆí>*Œ‡>Ç9þÀÃ{ÝsÐ*@ŸCCGEHD1t&!ãhµ»Ñ—0ÿäElô!Ü GÑÀ9Á%>xã:t2q—xòHâþ¸§8ßß©Ÿ}YNo’˜³Ãú$žlæóUÚ10‡*@Z`CŸõã(÷Ñ” -ꨳnP× ŠÏm-ĆOŒd¡Þæï¢m²•’<¼”ê5+âš‹$ÅÍ ØìVgíDóŠæÎÒÚÉÄ/?ÿ"UŠ”AM›íõù$õ·ï>¾ÚjÜ)äûÿ–¹ÃzÍ“aΪ`C-TkÕ6ÝÛð™-¥ÁuZåRµ-Q[BÅ„nÇ QH¨5~OÙ‹-©‘{ñ÷TªMMnW¥±ú@#A8Ӄݘ*Xu÷ÔŒ< Ô”7¦²ådj„Úà=‹: Ç®«›ºŸMÚû$C80™iýâlñºËí%°˜ p€òKR Œ½"8Ayàäž_÷G¹ó>/†ÏöJ<êC8ž8äTAlÓ×ÄÇšÔâæ-RÜÞ‰‹TWT½ß³67„v•`HØiÔÆî碧仛’ކl{Á´Ä£Çúì;î#ÆaÀðÓ±“Gv‚€ŽàÓS¡ÏîÝÎj3“Y­‚2V²M~‘è_Qæx≉Çàu!œÏ™ëSSœ<áƒ6ÆÑiŸÇ@8ØÖáý–âϬZmó£$öëp\Z_$œ’°É)ñ˜¤ƒžµAwœ9 Ü5ªUH YîÑÜÏ<²D>¥E¥k"3äµ ©}Öf›S‡_ÅùHuJ_9qá2¤KߥSgaÛÁý6mB¸Ý;wÉŒ³é£’5Ë4”¦á™S„us™šäö£˜ËÎtÉøMnySìüæ—0’w–âš6~8“tY¿’™2Y‡b„Žk •µE8d œ´ÖÇ*ÙÖóÔ;ã.37mÚ¤œ¢ ¢d\—fv“èº&øÍ™dg/IÁ'ëFÖ,÷âç™á ²f`™8nýÚÔ+÷bé?:5¸u4ñàî£Hw8ñçc‰;}ŸÉ‚nxâèc>Q.‡Ø $üᣧŽp7Ã-ƒ.‹<’ äÒªƒÙmbJQÃ$£ÝÚ½ŸÁø<ôt‰A´SRÞgÃØumùïÄÄ­‡q¯@ŸC{ö9ô9æ³í€ ïD"”>PIsCsÛ¼"~Z­ZòoTÃjÛ„s|§Çö ©`ÛÖý‰ëwg@Oì¡M>eå´S¥ô”ºuCb~•µ¸~‚s—¤K.J»LfÉ‘àðÎi@rKºFŸ~K8~zŒ9ÁÉ3ßÝž¢kK¸øµV½#.ŒmXÆ8{µë†Ý;Äñ²|‹åt!ÞʳÙTRX„pÞbL“N<³6oh§`©·€²tÍ‹F­RÆWkÕ¼˜”1R$‘Þ©­7±±GûFàU‘ø‰Dà}é¯bô˧ÉÅÒ)2úRn#Æ…’Z’çD¦'Û"q?%@™”lÊ <€×š¢(56¢^”Šs[/º#eìo¾ùŸ_YéçWb‘p•ã§µtÿ¹vOâ?Ô³Ü똂žtöNW¹ßuD- ÀéM“ä{×$ÈE:´b ,O±Ì¯¶c˜ž¢Þ©b 4 uüQ`òè'ªc‡ æAd°ž‰ì%b‹­\rÑ_0^uA§žzJéŠ)Ó–c*ô mÇ‚ò¬/ò,¨LºÃWÅ MROÕ`¸_¨a{C)ä¢E\2a’!\ÒôÙçD$q2±Fð¬6Ñ«ç?ñö'ë·| aíüÉýæÈQ¬—޵rý\£> }ÞÛŸXú‚æ3–ÏzèÕ7?û6éèƒ#Ôç=½zêC8°ö°ãOML$Ø£Aø¢¦³WM~ð©‡^˵wýŒÙ5ÓS€Džilø!îʃ·¹ì|ÅF*‚¡ý‹ì)Bþ‚pÚkˆ·ÈÆæB ×ûè±QtÎ1Äc#» â“@YD6ÇÍ`óaî ôIˆ°å“xN !4š@ —%cÏa«)¼Pà!µ ˆ¥|Z"ê+Ι`fšðˆ-”ðëO<Á¯¼Ú†ò9 °…ò9ÆAh$$–eÆñ€4-'N]öþêds²±±‡ ´J9uÆ…¬1~Eo Q‡`¼Ò;‰±óø ø;i'

bi™IskŠºñ¡göÙp‰DFd0:%‘-0ÓE9@‚Œ*©*\Ó ™Î> ×~GvÙ-x#¹PÉ£øx€DªÖQvÚ`Šp'¼1X XÊçÉ6'\ÙdÓþ€DÐZ ‡ƒZÇ–Q¤ÐqDÀ>ñÇ á+¥%ì¡¢ s$b¿’€[í€ÝFí<ŽíH§I£:ƒIä®™|÷ÝwsPé¸|ùĤãSxÆJžvË“:ß•ºDdZBkuþ€¨ª ðêä®ó´êúC¸Ä¸¨‡>ùZþ™7”_]lÀôg>ú %§ýÎßéØôS‡0õý¸æÆø_5OžÉ÷< }Š†Þ·ûä_ÿ$éèã ‘$žD±-§ŽeÀ}¸~pN.Û°'gز¬ÓçŽ »çνŽWÓ»®^ `ÃvPBç^\¤3‰´›QÎJ’l8`I!?§¶¦JÙ¾c‡ ä(†n=º?üè#ÜtïÙÃç9¹gß^Çßp‚H²S!–”I¸&c&RV'!€ òd¨xÿ¸Ñ¤\!ð€÷’D ˆ6€OÜ ‡äpVÄÛ ´ÍQ;±Æ°Ö¤Ýk ˜h*_Ý$ƒŽ&°cuuô¶JÓÉ®\Ø”:hÞíŒe·®6¿²Z†Ñ žgñˆêt\÷[GðÖb·Q,tà'zGch<=’%ʱY`gÅéâ†eEw ÃÕË[çhÙu‡p,íÀµß–jê’ü·Õ¿qË!-)í9¸çÂù"MpZr¢ã¯/™Éº#ô©/ xIÖðÛÅß:štô9pŒÊqgh|·‹?|—D—TŽº=`üŠLQ·›÷‘Bκ©w]¥pÎÜòEÖØî7 ¨6´D'Ô§XÉ.A:;gǤJ9pð ̬4NFµû]{vÛý‘cG}Üâ\ò.j—¡PÊöÕðÕog˜ÝU+È‚rNmËóáº7}Ó`UÄZEÒ*ê[µ“¨NQšm¤s›zrÞºC¢ÎK ¥ñû‰§¸ „Ô0wH³;@]MÒ@¨©j­uïWÇÍ~õ;zâ*å³ÿ߬ëá^X¿1wÄ’´sîO=åÖþ÷|ÂÁºÇÿ>âüù¶^c謅ã¢Üw½!'ˆ½øýOYCçDßž&ø¶6Ë^üÕ§³&}@8&ª³‘‘Ý >„cx±¿1»7žH¬qgöé÷e˜vkù˜5Ȇ#'ÿj×Äô»~é>%ÎV³üÎñÛxƒÌN0#‘êU·)B§… ÆþÞµÓ Ž>ÈÍSŸoÜìÞ»£Ld´íǰðc£¼Iå–ì,­)Æ^4Ê=È'XضÓÉÙ:—CÏ…HÉzPÜ¡Ñ?>A(¦ˆ_©TÁ'醈n+Í]¯cq=ªËNÐ=+ËQ ÍPÕԹ܇ˆ’~í:*¯?„;y<êö{ÒN™vîÃoMød¿£.:š×ßq'®Äg68žOtˆ×ëˆ;yâØìûɾ(Íœ‡2L»/ô•N¤|’ÑçÂ1IYZѶ…Swâè£m(9aUÎÐÒOº¹ýšçwò+û;Lo¿~ÐãÚé©Þ¨Ý&Ùm£…ƒŸ +ÓŠÌ„NØ+Z´jé³çÙ+rÄ·sõ¤¾êoÿáCû$pL_ݼàÆY-î &Á$¢è™ûñyÄ 5Ãcúb÷²Ø*@_­4ò¸7_ >UÅš`¯™”ÁtævéÌ8³ ~{uxöL «ãzÜâZi°»§VŽíËT#9ëäÚa´Zš ÎÙÿk¾TÎXåHC4¤3'ý8¯#ѱÍú-XzÚ¼TsîÌ2eÕGœ”“ÎT{8Ê!Œ/¬Âùc·±ƒu×:Â"Žï.çʈ8>´8ý'BùÌ׋oJ±( æ¦ìS×<°UÖ,>+H·ê}ú^-¤^ßÚ(+p>η£›ã*ö063ï{!ÏØåÙ§Ý[0ôÎÈ×1xG"®¯Ø×kEèØvl2Ô,*[ÜòëRÞ`ÀAßyûdN‘+oé3ï¾GÞú~\zðØß²9ç7p Žs´Ã?Û´ÍrpÈ!Ê%ÍÍSƒ@íî7rh¥å±àI÷Î?uÇ}ä•~ílƒ¯ÓÞÓ&Ÿuk… „OîsÂÜNµYg•QŽó“s‹{EßxrÏq^ÉàŠÀ9É9´§^Ú gé¾jnU‹µÜ}0µÂrj絎pˆ3!øþàºÄcûíM<ÆiO{íqÎUd‰’#ìf›³xSx\BʸũVŠ˜Ë~a‡»œ];?ß™§u?Ä«ïŒkø:M6IøˆÃŽhÂ6|…ðyø8§:Òë#œÅÅ!øCw°5'dQ@Ôüts—” Žæ«CG¶\&úÁ|—›K ?À´Ö'­8ŒÄw:69ØiÎ!*4•å¶cGY*©½$WÜíiÃÖ»àÓƒlNß,q—½+yRÀyC޳‡/ŸãªŒº)÷¸¹E&Ín0-–¯ÇœcæÀŽT÷í-qXÈ÷õú¹|*Àž?™Îub'RÐQÛL<ñ-笞~MsÈÙUºŸ3_}ÑÉÉúJÇ 9èåüù÷žÄc;rÇàc‰låâØ’#ªxÁ~igbŽÉËâ¥Oˆo»` ®-g2d·HÒ 4ñaƒƒš×ô ñY±>ìÇÉ ވe·Ÿsþ‡Eœ ÎÇA{õïÄ\Á+–¤Š‰j5w¡Chrés¼ù"XOÙß§Î9Ô™šÎ *‹sxØ„k‡ÏMscÆè[*›¿éÀIüËÙ©ï]É”¾SÜ0.x}â—&ŸvKÆÈ»2‡ÞÐçÞ§ÑxŽ9« ,+ø&°ÃèeÉÀóoÆÒ'ÁN²{ôº CŒ÷¶ÿÜiάÐgŸ]ýÁçÛþpˆã³îx³ Gš{÷oÈ›4y%þdƒùt}˜š¥µýÎ.*ÂïN86çì­ûïgÌykK®àe)ãfˆ yÊY¼9Î)õ€œ á()™ œÛýçë¢èçï;ŽmëÀÉá„¢ùä䉿O&ÎcKŽÉK2.¸! 4úHyêí£W€>~ÎIÏæA5Ÿ*‚Êw üi/%ï„8™øìö]ù&ǧŒ\=æÎVÑwlç`öIFسá’f"þµÂ‡`¿î|÷Ç–䈽/kð’ßýìLäÄ]Çœàg³áäâ¾ÖWþ]· ùúüÇŸ»ø+V¾ýv¾AJNœ4#öÓïÿ<~×|+|×´ú~A”¹Öm¸Ó†—Ïì3c‚³sе•·S[Úvž<†Ï­ß-/ ÁÓÏZ’aúŒ¶þì„™ø¬O!œOÔŸF8ŸõsM[ñ‚Ÿaj;`Y-ší?1§›ã¸zÜô|Î)K³-X•bJð½›¶írœWŠ>ÿOQÚGïSk„j*‚ 0Á‹yô$C<÷OóM—.úÖôÁ«ÃYK;µ™Ã]oí‚fyrÉzaÃ9k扉ãn|<ë„Å™#nɲø•Δ'„sVN­5\Ç9±¾…v(†‰Ûö&¹íÎòQQÙG­$8½â”ŒN g¾î 3  +]»OöH{K®%Ð'ç´ÈNœ¦[¸4úø¡Ú?SKšÄŸ9µÓY0'Ö“Wú%&ö¾é|Ó—d¿+`ØÜg·$² Š#¡å×ä>c“±0úŸ]ó1í ”WLõ¦3百*]ðÒZq·}%¯dâ¾#¾ƒ÷E×au¼Ù}.úëåò­SÛsl§Èãç`ÖlfY=tFΑfÄ´[rÓ/¬KòÂ)ü—Gû,’ÿ¹»Éáàf‰@ŸÇ4àÿƒÂÓ^¹cGN"ù˜ï>Z&ta–‰ósFΫ6)€÷—Œ<™N$¡OûsKðdàâªi±K>ÊÓ‘ÔV9váPA¸‰‰eƒ䚺4sX|ÍE+84Ä÷>42¡ð]úœáüœ•ÿÿ+ï¡¥9Ã9ÖÌkÎ\˜+|QŽ˜[³ŒYH;Ù…ËY‹uÞKî]É“RwàÉÏö'–Ÿ_0îæLÁ‹‡ÜórÜw~,¯–8 þ:·Áy{/Q¸×?øÖ)Hgø!ßÝ™˜eBhúˆèÜñá/ì(ô:Îâ8ñb°äîîµp†¾eÓÓ"Ðgmœ ‡”\dî€óŠ–jÖ|ùEþIñy×å™6gäÓ¯WéD9£j-Ê 2áO»ç®}aa¾J!œÎxÄCáìpnw(ì3gûö‡"âóL[šurÌàGŸ‡>¾½£ñ´pÉô‘:5p*Ü÷f>·—øÿ™›4;ÏXhÄÅ ¢:'š|²÷xɘÌ! 9"n¨5÷>ÚÉZªƒÕZ¯ó®dJ1ªØšÏ6™ŸcúÒ+–|ø£³ZìL^Bœý"§V(XgâäŽäø:Ùs /d¯cÈ:G&n?”óâ§9"æfŸ·,ËÔ˜ûwt¦³,ÇÂ;|Ð9Ô"™k×<ÂÉvj¹F²ûÔé…>ߣïeG÷9o„Áöäã¹&Æ›usá© «¾ÙBгÁÄ™7§6ÌúfA ×øð›9äL ‰7ȱ­ÈG«?8NˆÏÇ¢x$ï„Ø|‘+òOŽMx÷Ëè》‡Nãx€OÑ¿¦jÂ?猜àÍg=Ÿùç[OpнÜÎÞ&gq|ëãü°½Ä´¸ Sbr…/èsï+?*€ÒÉ|ÈC¸1×ZVG9ᨪã}5ðìÔccËÅ®|â§¿Oüy‚( 6 9Fž/Ü‚i®×Ë…ÖzÈÙùÄÆšD–Ù!TûÅ÷eˆ˜ŸsJÜÇÎê»ï hÄÆ¹D”G4ÃdNŸká»»ùt–“ÇŽìbÇ8+1mSÝsБ|¾?$#Š^ë8 ”„l¡ +„Íûàã·$ßQÇíÛ~’‡DðEHð«m&ùüòìêäVÝdæ;Kp¾ÀSÄ‚Ï+ ~?r¤oü¼¢Óçeº LpÂk‡>8ï‡õ‰ËAŸs#œ#‰Žß,W(öšoõÔZ¨£Œ¯o:¦ÚŽ£‰“ïy²ÄÌÙ¹#ç˜6kùwÛ "„nÿÞ}>k/™ÏØ«ÇþËöÀ£‡âÕpÎMéÇÆˆXV&lk Îlgè;3Y.wŸÆÂ]_6½oG/a§^Çfßr¡‹R…Ïϳ¤ÃÍOB(gQ_Œç‰£w=„û/ø_×C#þ÷‚H5Ÿopú_{w2ÈŽNÝv;¢|÷‘ÄGÖŸž)$:ë´ùµÂæ3Þ¸;´yê6ŒO‚[X¥/Y6Å5|i‡,ï½sYU>vèðþ}œñpÂÙ)àl ÞX»€á![ÉÚ…GeŽÉ>}aµàÙ›¯}ÌŒüǽìØp¾}‡8”œP¹ãÎ$teà\Aßìs¢†?vðÈñœVÄIMàn÷E·e8#WdBîqÁ/<æÛ*Àäöõõ²k˜Û®|Óa óû{N–š±8ýÄ„’Ñ7 ¼óIßèû¸È÷ê$42@Ι×0Ï)Ï•oÙÕQƒs¢!2K|zËÑâáKÒE.É6wúó_8¾\D¢ðßñÚ€ÿPëÚqÿ“ð×¼ Gôð/{ws’ŽîÙëÈ«%¥Szœï ‰ýóDâK›w9.ÛÌyâV Xö ãýó¾Ä¿ÙÎ¥éAœÞ)µè–Ží<ò'1fGï9¸Û·Ûì”·rßQD.¨ñõß+}ÆèÓyÖ-h ¿8M',í2Ðç|‡£_¨OóÞ¹ÇÙÀÀÀü±ÓYQ@ïð£æèã»:§Ò6={H|ñyËKL[GÀØqV´­@¦Ÿw%O À°åò÷×åž—5lI©i‹nüâ'R¿Ž£ÒQ|+M>ëÍ÷õzºN8gA‡ƒÎdšôðÛy#–fŽ^–mò¬§6p Îáf>Çé\';ê?–¼¯kád£°dªð „ÜÆ?CXcžãÊ@Ùÿõ³#dgbâvP½öA‘à©"geŸ}óû›ô*¸SJÞi„“`u&Å©‰qm‹Kß)”¸n#|Û`Ø{d׉“Šœ„D[Ž'þt"q+‹[‰‰7½óUùñ32FÎÉ:cî¬'>„>û|Á–¾eNßîpÇÑyIôñG8©Ù²áNžØ»›£/^gg“OMá=n›O0¦¤ü~4ñÕß ŒŒÏº ÌâŽ+ofdÿð…À“yÍŸA“¼¥Í¥öù Ó¿ëÉl!‹s͸±äø„W?ø·A{Ðw4ÏýŽ·ÒaVß•×Ýu™£,C Ø&&Ö™uc晋3G/)µü'í¢ðíðùo à:qÂñÿ's]ó·kÿnWÜ·w7'ùì>zóØÌ,~äðþGœ3š½+¹RÏZZ,º%sȲœÓV7œ¾rý1 ÖŠ}‹ñ\ÚSrR§°^oNÊSž§cÎÒuâöc‰¹Ãf§Š]>rN;Ÿd¡ú”õv’iÍv8ßš·ö'ëëÚF¸SCãsGð¾ÿܺïOm83º~ìœêañ-âVN}âƒ5¼Î¢ëâ»&D¤XxC®ØEh‚D¡óoqÈY½;å…Knç@Šo5Ë·ýú<ýÙº^‘³êŒžT/$ª^ļZ3öðå›~K|+1±bÜÍé'ŧœ³ úðTǸBÕÃçã,n]úøGšœZ*q\LGŽ8N”]‡ŽJ@;¿Øö÷ÄÙË›Žž^}òœJQËJDÅöyè±Ç6ìçÚ¯|+í˜UfÞ•=|ÙËûKÁ‡©Ê"ãõç•JÖÂéŒÎa—|pèdõè%©'-ɼrÒ½o2úûÁî¨HL`g-Þ9mUAf¾ ßëë:ÂyEÇŸÿaWºðø€„i#âæ}ú½³ÃjÄq(CÀñ¡ƒN´åu¡\ã焟ÚãÅ-þ8êùò[%‚§å7µÄô¹eÃ^”Ê’‚±·„.J»ôŽ€Y +¬¾Û‘ྠìõCìîwv8á|Ω§4!ç¿k^¿Ám³“Xg¢ÿ¹ë(žIöJßùù†“fR"lv¾©s²ÏÍ1}yѹw§ ^’wáÝ‘³Ë¬¸}“ã©wès€×pñÎã¬s]úœᨌ¹‰]¾cãù{kãouÇÌÈ5&>gìªÔqÙ§Ç”ß0ì¶ì#Öä‰}6 üî ÷¼{ÔYAôm„;|êh¯k~Ì®/qü¯z‹êsã§k‹‡&¤ Y™cêê{Ö?;nÿÎÄ_ö:~x¼9›J‰‰ìS}®¯Ëy“¢oOÅÌGÞ˜°paºÈØgÚ‚$øFN²¡bÿžÄƒLï,È_ë”×>Â)ÂÀ%CX…çmä#Ïž0£ÌÌÅù'ÏË:q~¾¸;ÆÏ˜sOÀ¬›æ­Nµ¸uô­SæÞ¿êÉw>ùy'j Ê|Ìg¯ˆoRœŠ÷»¦'ˆãˆpN0s 2Âm;x€s’C«†&“#xnæð¥™¢o ˜´0ÛâÇÂWÌ¿9uÔ’VQ·ŽO¸ç¶?yëÇ_m0âOôqDÉéqÿ–<¢êiR¸›ó‡Úyè˜`°#¼žÝº»@È<‚ÁÂc²Ç-.1uyÑËó…?–&ìÑŒ ÏŒ^ÒtÖ=âVÎüùW7lÆ.ßå{œBTèÿÛZîßP…]Ûë¬ÿ–øÊ/â_à§×…jg{à<…üóžÂÓWjï‘Óçøê&î|Ï£Ù&ÇåŽXS:lÍû¿'þvG¹Ý Â9ûZdÃá¡dûP²°áþ™,n"žK6ù^ùFÇñç·™ÚjŠù‹ó̈&Ë·ñÆ{O‚pl Ç}u6¥_-ÿŸÃþ53üN3‘ûÿEÄÅñø?O]c§7Þê ŠÎ YX%(H1TؾÞHdÖÞ,»½ÚÔ„#f–H¸+ÍÌ›Â×Ì}0`æ­óî H¸+}Ä­ùÃo*¾²äÄ95ƒçôœscì}Ͻ¸n³ÐΑãG>É[&EGïðåÓnNIŠÓ)úÕ¨Ìî‹_õZB{É¡RÎÌyþ‡þ½ªú¬O9ͧ¬Jø|•|cú˜°cnz0ÿ€‰¥¦/Ë~CŠ7Ìy þÞ€˜;î ˆ¾#ýŒÛóGÜVhêò‚câ+OJh¹,êÞçžÿz & ï½ hÊxF½j1·ï²—Cºû~šÿAq¶4¼€¾÷Ù¹"æ§ Ž.8ïÖÔcç§Ÿ|cæ§ {$EØ#iBïËzGþikò/Ê<»ðÌe æ­šùÀcO~øáÆÝ{˜Ã¾ÌÓZü?óÆ©ÑÙ ¨¿“Îû¦Ï:^î¹eü5 úÕ=¸Æ—:A/öy5@oÈ´†íܹóÍ·Þyë½÷?øðÓ>ùôÃ>{ï£ßÿà}~øégŸ}¾ö£Ï>çWî¿ùö‡[¶¯ÿqÓ¯îäóÛ6üþÇÎÍ[¶mÛþóŽŸå“¿íÛ·oݺ•7wsq³cÛöm7ý¼yë¯[·ïØÂüÛºmÇö­?ïøá§?mÝÂߦ-›·mÛö믿þ¼}ÇÆ6m߸qÛ÷Û7ýøû¦mmýýílÞþËz²ýºmë/[vlÙüç¶íýòÇÆ·¬Û¸õ“Ç›Þùx–¨e¹Ç'N]ì°âA¶»Øö×öoÙøõ¦ 7nú}ËÏmÙA}Û6nù}ÇoÔ²eË–M¾k#õmØðÓO?ÑlÌçÏ?ÿLcÈÀ'‰¼ÉZ}áR>yDyÜýݱcÇo¿ýÆ+¹ùÉéûŽd ?‰Ü“Èç/¿üB"S,)|¥pnôˆÊ'›ª³KœfC«_~Þ´m«Ó€?ýòÓ¨óç–¿oqè yÂ7o¢Êùñ‡ ?oÞüÓºµ?ýö׋{8¬kNš+ &Ü8à–;wð•CoûákÆ`ÇŸ6îØµaë¯Û~ÛôÓÖu[·ob€(ÆlÛ²uÛ¦ÍÛ7oájüaý÷¿ÿêtÒýúûo?nÞ´…Œ¿þòË¿ÿòƒìÔNÛbnÝf"¦®M›·nÿõ7§Ôí;øÜ°ió6}öÕZxï>|çÝß~ÿƒ÷Þÿ˜ûwßûè>~ûýÞýð“>ûòý?ùò«o¾ørí¾ýwîrbÐ.TÇúÿSæšA8a›ûŸ§Þþà„áùÞpæ{T@8}÷ÍáÄ3—]˜~l|а±wÌy0`Õóˆï€Ù÷L_0v^Šñóó†,-;uq©óª »é·~ÜÁddoÎzìe½üß•—ƒÚmæODîÜö³V–ž27çTö„® ¿ öî€ÅOÌy$`î#1w„¬L9ey7VˆXUmÊüJB‚W?øÚ÷;~?á œHtÈYð8ßu‰¥><‘ÈÛ¿ÊÅ,K;:*óŒUé"nÍÿpª¨SG>”"ìÞ”!w¤Ÿv[Æé7¥_‘nÚâüa Õ† Y¶â…¯Öþrì¤Âe;¹o¯ï¬“S³ÄцÀ6_”éEž­~®~{n½ç²2ѦJ¥Pc¸ùã¯?ß~çäÈûöÁ'ŸóùÞGŸêþãÏ¿úðÓ/øŠ|!åÓ/¿^ûí÷ßmøéÇ-;~ùs×÷7oØ´õ—?þÞ´íg ȧN!ÁŒûe˶Ÿ7nÞüÛܸ)¹eË?m\·þ»o¾_ÿÓö­;~û‰àvÃò›7ýòã¦ßÿ²iã?nùkã/¿oþmóŽ_7ü²cýŽŸ¶ýNe›~ÙøÓ`ÝæŸ¿Ú¼ãµ‡2G.È·ªbø’q7<Ä&Wá_|óÕOlÿá·­`Àñë¦í¿ý¸í×7ïøqÍÛ€¿þúëÏ?ÿ¤Ñl§µÛɮƠ̊‚:ƒ=¹.ôü¡Â) ãÎ}ÿý÷¤Kôó`#e‚¯*VÇO‚–ó Ü÷›Í€þøåWàNýüÃOà÷Ÿ?ÿJ ÏnÜô“¥;~~Û¶mï¯Û?ÝðÓüu¿eš¾Šù›gÒœ›?ø” °Ñfûöõ~Ú±yÛïعþ‡Ÿ7íønöÏ7mݰy«Ó_ZåTõÓ&à1Þ²aão”¹i³ºÆoëÜ@c6úîùôqÒUAÇÓÿ@õ¶­p¨úãæm|þðÓþP›à+XNÌÆ7ö÷Ñçk?ùrÝçk¿êÈóÅ×ß:Zïicþ‚XÿE85[8g¯“w&¯ïŒìG?Ì8:«ãæ:î¨ÿN¬=}!fJÁY·ó"±€É‹"×Dß”j檬q·”Yt_…„[‹Œ‹«’0êÆ?ÝsEŠ?¡ñ¾—_;Þ|ö£ë:Óä’ìЯ´M/¶?ë%_T޾ª„3¯sYrî­UÖ†3ªv6ÂûYן#÷úØ©&®ML¬49¾lä ycn˜~CúEDÝusÀÔei#VOñ¨ÕyFEaÃõYxç‡;·tÔòÆé·§Òƒ#ê¸ß¥ÁB#‘Áíßw.úœ5· ¾J,òV1+ŠMŒÉ:? d~@ôê€ÈU³îJW¶˜Û²‡Þ}Ô¬|#¢«‡.éIt— BøÔŽ“ÌA-šµjÙ´…óTó&M[6mݨi›Àfmš5mØ"¨9-lÜ´ U7oÔ¤a£ FºµkS«m§2Sçf¸1[ä-¹ÆÅ½ñÇß?øsèˆî;6kÞªc‹Öýš5éÙ´i‡–m6kY«YP#õÑiV“¦”ÓÊ7pT×µs—íÚ3‚7îÒ­k`³¦­Úµmݾê4¬…C(ÈB;É ð»ÈÓ©s÷–m;´íØ%¨UÛFM›7j SuíÙ®ãϘ¥L›:}&_áÀ„y xäñÝ{öñ6×äoÃ{–kO•o7Œï_D"X»âØôw¡aåbWçŠXž:lqÞùw¥™_bÖÊBœd3`råøð§ß~k÷I wˆoÇOØù‘ý‰¼Üqéöí¿¦¯Ók]ÿŸ>À9ôyyObÎ~“ NŸmÚbè² ýÔùEâVŽX”ihX™É±SŸ|û}NN<û:îÇA~¶Çr%B°ÿ±”%¥„ _忦£omæ¯ý‰ëö&Í\P<rDÿø8xЈQ#ÇOœÀßaC»÷éÑwxŸA#ú:hìÀ¡£úÖØ á£Ó{Ø€¡£†Œ<`DÿAÆŒì;ll‰¡æ.Mž%î†Rc?ß—¸“9z,qåÒÆŒÕoø ¾# :lÈ ¡#úáoøÀÁ´aĈ4oذaÜðI;‡ 2räHîi9÷  …ÜèžOÒù•îγúªGø•ŠR±ÊC™<È×Q£FÑßîÝ»ó+?©^~íï»ø:zôhòséWJÓW«]<¥ r‘¹oï>úô¥Gc†á(`À@•Ư´pðÀA£‡?z …4ì3 dèÜ,ÓW¤¼¨dØB&ïÁÄ£ã'9’6Œ6µdèì¬ãffQ5j~‰1Sj‡ÅÌyãC~•ìÆ«é³K¸äÖc[\±ûо?lÛ¿ÛéĽpJºTûs…g]ï9Sâ¹-¼óËÃS+öŠªÐþ§cF¶ò‚ÄÄÄ»ø¥^A Âæ S)r^‘ÑSêΘ=÷ÏØ'G°JŠ>¾§¾Â© }œÃÒÎvÉZ•%'*éë¹lS#Ëÿƒg3Gâ®­8?üë@Ù SKÆÎ˜–5~n¶ðèJÑó'<üÜ[?Õœm>ÇwýÇz;½ÿtL‰ÏoçB8ç§=O“ÎüI½Ðe|(ü–)(óN.‚=.º9e¸½”FvüQˆ MÖ›ndÃMž: YƒdY²bÕòUk.]A" 3kfÜì©áSBÃK”)Ÿ.SÖÌY²¥KŸ1 eŠ”©Óø®T©R¥H‘"ÀwåÌž#cú ©S¦J“*5)RpŸÞw¥L™ÒÉ‘" uÚ4©Ò¥M‘&u@êýeL“2kÊ´Ò¤ Hë|dpþHéü˜& EÊ”ReÈS4]›®yâ—¤ Udd8û }«ñ‰y²å¢îTéS¤ H:mÖ Y²¥Í”–Û”©2eɬVQ5 H—.7\©O_§šÄã®.Ÿ¯zŒz=KIɘ1#‰d#ûL™2)EO¥MKëJ•9C† V‚Å'Ѹ¡(]ª…‹Dçr>ušLéÒó—!MZúU©"W®\§J£ÁS§Í”)K@º é«Ô*Ÿ=ò†"q·~ôM¦ðW?®ƒ˜¾šiaöTÙÓdâk é#”6]†téÝCIÒ¤KËÏ)S§â3cæL|=Õq]tÚW÷M*†˜âÓfèÝ0GÁH¨P¦Lå+¼†IÓ’šE Èß‚%ËI'Ï]÷=xøû€Øµ”Ü×Ḽ¸ð§ïÙ³øîÝ»wîÞÅš§³òùÛ¯ýõÇž¿ÿÚ·k''ðB‘Ç;âˆfç´ŽÏÖ—:¡QìâJ“§O¼÷g·lç ŒMœèqÒqfîBë?zlïÁ{÷îÞ·óƒ»~?~àoŽsÎÿ:ypßÞ¶ ¶ú.nøº×wáv#ÑF 7\jä™™ø.nx–ÆÓ nΕÿ\éªBÑÅ×sÕ{ðð!¡æ›C‡=èü>xˆ$âüãXâæ£‰¼\íÎu›rwÔù†; 7üæ;\ÿ#ûjùûzÏþûÿzäØïûîÞ€6ïþë÷½ÿ~dï_‰G ÑÇØ£~ù]Hy*ÀZHO‘Eû|Ý?ëÅãü*ªªïyÿÞ-¼:°ï$A@Omý¹È¨‘5çÏ+5³Å­·Íúü«}:ÊœÆûçž]¿í:¼—×%ø¢iýãï½þµg‡÷:´÷àñƒ‡™(Ç ÄáƒØèŽžúóQæ|—ˆl½³.@ Öuè#k$|–¤ìÚµ‹Ðƒ¿ÿþ›IZ/¥Ò°V ÂÅÄ& MÇ͞LJ?|’ÛüÅËP®A;tgÀ 1„Bíä™=?nβq_¨XÉTé2æÈ™;{Ž\yóÈ_ PAß•?þ¼¾+_¾|ÅŠË“+78W´p‘**Ö¨RµvõõjÕÆ«Ö¨^ýšÕk”+W®`áBÙråÌž;WÞÂù³Èž§`®b ”Ê_¸Tþ¢EòÎS¨@Î"ù²Ì™>cš ©RåË™7W¾â9‹¤«Ù¨Â”ˆÌá â—¾óiÆ}÷¾ÄŸÖmÌ’:]Ųe ÊO‹Š*V¥\¥Õë4¨U¯vÝ:µë׫Z½Zùòå‹/N;sæÌ™9sæ¬Y³‚ | Γ'ŸÜs“-[6¤<¸Wxª°ï*T¨ò“HI'…«dÉ’5jÔ§®fÍšò¾Ö­[—{~Ê‘#eòTÑ¢E)„g)D%ð,7Y|Wîܹ)PMââ×SWÞ|9²d-”'_ɢŊ.’Ï×(Š­\µ nŪU«Ö«S·Aº%Š-U¬xöÜù²æÌÔ®pèì4¼+tñòo~Ýr"ñî‡îÎ_0KÑ¢y³gË—&EÎé Ì^(žÌ… gÍŸ;G¡|ù ,T¤PaµÆäÌ+O¾¼¹òäÎ7Oé²e*V¬Hu¸OëÕ«× ^ýúuëÕªQ“q¤ Pªòˆ¨qæ•:M”œa£ÆÂfËVÞˆ|îÂ%Ü`â=° Æãž”¨ø9Ó"c`EмÿáÇ®Ž)ŠøC¦|ýõ×ß~ûíǼnݺµë¾^»~ý—ß®ûú¾­[ûùgŸøáÚO?ýþ›o¿ÿ~ÃÛ|üî×ß¾þí·¿ñþü§_ì7ù=_~óâß¿¼î«>û䯿úlÆ×~õÞG®]ûåÚÏ?Y÷Å'ë¿ü쇯?[ÿÕ'_}üö'ï¾úÞ›/þÙ'ß|ó 5~ùå—_|ñ…SËÚµ}ô÷¤pO{¸¾úê+¾~þù礟õâ'2_?ýôSÚÿÉ'Ÿ|öÙg¤œõ:W9ÊLQv)åì•~ùÅ'_Ñ™/>wÚþôùú3çoíç_|öÙë¾ÿñÏ¿zí›ïýlŠÞ'Gœ7c±úüiÉퟃÍNY·Xɾ“þO>yh×á}®žÓKùÞ{ïA(öÁ@CúKÇÝ-÷»‡D„Dg,×­sèùñ'¿òæ¶o7:1W_­{oÛŽ¯¼Ö1*fùÛï?½iû󶼸ný+Ÿ}ñá—k¿]ÿ͆õpÁ—CÔ¯Ö­ýú»¯×~·níwß~õÍWŸ~ÉZöºÏ¿üú þç|¶öSþ¾\{vú3¦4^¤†tj›o¼ ß ãùõ×0Æz>aþ¸ù⋯>úèn~ÿýOl×Ëe]t9Š:¶‹Ðl8”e!Ÿ pnRH؆ AñGºDÏô¨8$â,\¼T¶\yË•¯È_¡Â@X±"EŠHôs ²gÏÎ}ÕÊUXÈiԂŰþÝz×£}§ž»ê×äpÇcÙ¤yPñ²¥³_Åó(š„+] HéBÅ‹-Q°xѼ% å)œ'cætØ}¹³åÉ]¸\êâ•37ëT>,>kX\®ÐØeŸl€E ~ó¹×J,RºXá&MYl׬U§æíq|†Mž:zì˜Ý: 1Z·nÝX4xÊ–- sÑlZ+\ᆎ€C VÀØHçâŒJq•(Q‰Ïz+g`7x 'OžÜ»wï=zà¦ëÚµ+νvíÚsdV9ª×ªæ†Z@\.U©.ªÓ‚…Jä/T²@á2ÅJT®X©~ýúÎêW›Ö­Û¶ ‹‰Š†ž8''׳k7þj6Í[§aéÁãrÇfŸ¶ pè¼7Ž9±åc&Ž.Zu®ü™Š”Ì[¼XÁÜeJå+Z o±B…7êr”èQ¨`"…såË[®RÅÒÇvmÚ²æÝ¡M[¤Ž´_ÿî]»‘X£Zu:è«hþtÁúãÊ›¯7pèÔ&¸ˆOy#a6x T“£RGÊÂe+a9P&„ï¼÷çü•ëÁ†CÅn#hõ¥—^zá…î¿ÿþ§Ÿ~úɧŸzþÕWŸ|þùGžxüž{î¹aé’YQQñ3"æÇÆEOŸ>oÎÜ9 FÌž;!:vLl|ôÍ·M˜3w|äôØ…³£ç&L6-2<&&*>:rvlTôŒi1áaÑÓ¦ò73Üù‹ Oˆ›9{öì9sæÄÄÄDGGÏš5+666<<<...>>ž¯\ÜðëÌ™3#""ø<ëÅSdKHHà“rÈÅS¤Ÿõ"ÏY/ê%?ÚÅWÏZidÔ̈ØXþ"¶GÇEÍŒŸ93!Òù›·p>1s¡Ïä¸Y,_aﲩ÷-  Ý9ê¼ÎùÃôqœ·¼¬Á9 ’ÏÃΟíC<›F¶.X°Ò-\¸pÆŒ¢Û¼yóD±3/(£®ñÙ”3Ú‘ÇÑ‘3"âfÏ™138vVèÜ…!³NŽ3/2~AtãÂs1 ³c¢ã¦…MŸùô£>þꫯFwŸiR_~kŸ„wiâø‚|ê³ä.üiñ_a418‰ƒ¬aí$wþBx)‹-^ `ábÅK:ÅNâq TªR¹k÷n ܹó¦O™4lÔÒØÙ¯<úTBXÄ„!#öèD Ÿ2-¬ÿˆ¡m»u,R®Xá…°°ã¥‹–,U¢dÑÒÅ •)ìåÌ•5sÚô9²æÉ[ºZ֚ͲwÀK FÎÍ=aÚ3¿€]q~‡OiV¯~çv­c¢g.˜37!}˜ŒO<ñR`ciв‰'Ripp0à‡y²RµP,åP&E(²áWRt Éìä/R´BÑ’e ­^±r¯=áÕ¹ L˜4‘À–W^xñ‘û9`ð ž}Æ9jØp¦Éˆ°†Ã'Ö‰˜›uBTñøŠLˆå4¾ß'–Êògá *‘-C¾b9KU(\¶Dá¼¥Kæ-S¼Hé¢Å±¤BE *V´xéR¥Ë—#2hòÔù ÌŠ‹Žˆ ;á­ç_7xø€î½X ?12|zÄ´ð1£FwîܹQãÀ¢Åyò„Çâôýq áFŒSa™á¥kñ ûá<€µ°çà= ”¹‹–MJͺ÷ÁG®a–f žs§XX†kH"Bª(¶?üðÃ3Ï<óÀÜ{ï½wÜqÇó/¾pów>ôÄ·ÞyÇ­·ß¶léâ £F ìÙ}ÜÁΚÇ8ù^ù†¤Ù}ôo²öJ8‘â¾Q¾â°M-ÎŽ:ßûáØ6zz±Jm³9nXøe’0azöì9vìØqãÆ¡µ‘"¶f¥–{­B³.mKÓZÈåY Âj0J%€™ 5mÊ!?+ƬT«já†Z&L˜ Çµ0®rðèq†2rü¨“‡öåߤ¡]Œè9`üÃè3¨Gïá={ï=hÈÀÞ=û 2|ÜȱC Ü·ÿ¸£øœ<~B›ÍÇŽ5nÜ–é‡2vÒ¸>û²`Þ¯_?-õ3 ´„ÚI†4‰}Ò~zÁˆN1räè±cÇOŸqã7=ðÀCü=øàÃ| ðn¿ýN@ /iÑÍÂ>Õ ¦û¬7ÀŒ>ú(Êõêի׬Y³ü†<öÈ¢ËVß|ÓíwÞ1gö¬Æõê…M?¢__d- ·ó—§Ï›Òx-¶by}ü4˜m¤ìDa wöYÄHwÞ¨³æÎo!þÑК{‰rA‹‚¯øTŒ–‚Íž…ã¹!ÔŠ{w1+x„ž Þø•{>y–¯<®l*J±[’ÂLZ¾2Óh?ñɼ¼q£À(²ý† êÙ¿ïàáÃú è?nìè¡ä2xÕ¯ßx¢z÷>¨ÿàA|ïü7jÄ`Æàþ}Æ/F”ó–¸!ƒ‡™6 Ÿé ¨4bähär_ vB¿FŒ`EJä‚õi!=«€jý – h*_Õ#A JÀS °¦ña 9K};}ãÁØh/·ëê{Ëï q^rpâSa°io÷ç¤J_4&g¨³@K÷‡j7hÀh3tÐÈq£ø¤Œ‚¢Úø„¼j¡"ÄøÊ½Bé4v /Ñs!$$„»ï¾n»íŽ›nºåŽ;îºõÖÛzè¨ûøãO}¸’d0w~„CvÈG$Q‚*-„æÉ?‰ Bô€pŽwÉ·… @‘ây ÁtÃ?™%köÒeÊÉÁ*jРfî½÷߇:_¼d Í£BÇwë3¾×À•³n˜—06dÁÔÈøÉaw¬\EDGÍZ4BXHd\TL\4[ ‚5fA(O¾Ü•ëVÍ]4OÁ"¹sfÍ”. Uþü%S¨P«e®q3ò†Ï.3èöÅWüoí}åé瀦ê•+€p=;tN˜±`ÒÌY£§®‰›?mô„Eô GΜ9[x°Åe­sà³~ÀÐì*ù YU"‚µ(YQ2Lexqq³jÕª‡~o!«P:uÂŒS(#Ü»lÙ2X>—m‡ÉȬ80æÏŸA ŸW®\ -bA:ü¢À6_)Ì““lx8[4möØÝ÷Ï  ¬[— ,JG7hXôøàÈVL[;wVx$‡›ªÇò{òMŒçØ—ü“£o\»™(„U7ß^Ó°(>ä‚E‹”Ìš>gÞ ¹*Åxc51'þá"¹ó•/]„ Œ¸ç¡ZuhW­VMö ôíÙkÊȱ3ÆLš>|Üœ a1#'Í ™?-bõÂ¥³ µ4„£³q³â©PƒYde½°dñʔŌc„<|”˜ 6Cm‚µÄo€Ú€gçÀ[‚£ñÓµp]Íêš[ pìbw ×믿ÎOXx,õ öØ2‰ã &{óÍ7ïºë®›o½å®ûî}ûÃwo¼¼[=eòÄú5k¶oÞ¬~Õ*ÎÉ=û÷Õ¯[—z5«µiѬG—ŽÕ+WjÛ²E»V-[·lÕ¦UküËüqÓ²eë¶í:°u£U»ŽìÛhÛ©[ûî½ÚtéÞ©{/t#0Œ-„K`3êØa´mŽUe¾¢Ä‘Ž‡Û§<7°>÷,Ìò+¶b‘2ÜÎv泋êÔ©C:nn&élIqvµkÇO|U]|%7|âܧp~eRpË>”,@É|EI¤I|e šl$¶i×–MHM[µjߺmÛÖ={tëÔ¦M÷öm»µiÝ«];þ‚êÕmذ}«æGîcO!NÈZÕª6 ä³Q½ºýzõ$F™N::;›Ú´ëÜ¥[“ælojÓ¡k†M[°µ¥IÓ *™0I™P€‘ÒN8œ9ÌRm™âžÒ/zeè7ô—öÓTHJ×è2étŠöÓYóÚïyˆWÙݯx*`ÃÙâ3Âu`›ïyN—?H| ìä(+¾mŽ‹õ—mLsç¦nZåË•)W®Lzµ+T*_¹j¥rÊ"7èR—ZµjaCð•DÇáV©Ë-úÊOô…¤~½ÀÚµê÷ë;hÑÂe7­¹má‚¥8EWÞ°fù²U(Z æ/¹qõ-ï¿÷1Nv$Ä áœ_˜‰üBg"œR´Î$BÜNIN$Q©r §,S¶<Ε*]Ñ,ÇR­¿Y󠋆O íдÅÈ.½G¶ë>¦M÷æ,ŸÙÔ¦í‹gÈ1+tƫϿˆû+4*bùÍ7.[½26>îÆ«{uë^¨@Á²åËä+‘¿X¹Â%JÌ=KæTéËW¬›ºXõlíæš:›ÓmÊN}ö ÂŽÐpž~ò¹IcÆtéÜ~ò”ñ ³âz¶ë4¨U÷Q-zŒkÑýÙnïR§IïÖíŠ(s67ß|3E °ÁsÎ'ŒGËYCÂ…H¸Ó±Ã¸Ã ܃mŠ(‘ø©^½:¬W00ÎPzÀB­œÁ'K—.…Å·ƒ÷ˆ$À•Jåçž BNÜ’ävR#%%P¼ÇE „¡U*UŽ ›0|T·N'M˜È_Ƕí«×Ž9!aÄä=‡ŽiÝ­NÁRM«Öž—0{Å-k¦®º±õ’»sNž—ebLɰ¸Ž8ç’÷ìÞ§|Ñb%Šcz—([®RÜ… g˱V¤p¾B…óV*Së„£ã°tèÒyÚ̈Æ-‚zõé/5e@û®Í*ÔÛ¾ç’qÓ&uêÛ³q«²y êÖë®Õ7߸ü|˜\‹–,ž¿xѬ¹sXûd³#À†·¹\©ÒE 2¤EA¸!#F‹åà+m@‹2ÞÃi©õ`ÇO>k®Ü4{žáxo̵KÉ ´epÀCòÙgŸeÔ‘}Š–”tbÞ¢†£ _åã?Ž:Ã0ÔmToá²EËV,]°`Þ€þ} °,7o åNìcOÛ±gzø©‡xâþž~øÁ%óæ5mРsû¬‘ò‡!Õ©SDk—.ÝÀ;¤v»N][µïÔ¬U;° „kÕ©k›Ž]ª×¨ãª%„‡«O>ù$1k4 ÒMŸ6# %©ù21Hä'à‡üÈnæ‚þî»ïfÕpùòå/¾ø"S°D•Y G+MûI)\¤Llôef2£ðý÷ß§4Ô¨|P¸H TuìÊíеcÛNíÚ¶oÃvÕöô¬C{ ëßµ[ïŽÕ¨Ù°fõ6Mšê}Qü½òÜs¯½ôb¯n]A8hÕ±}‡Æ¡U‡ŽQú¡ÚwîÖµW_væ²s³}‡Nô—Åvü<Ò|E+ðé7ÞÀ¥LüÁB Ð;>uH&úÐfnÈFEtDDMvòÈñ‚y åÌ’;Áã)R§Ï’=k.Ü69³dÉ– Yæl9ÓeÊ)k\¹rçÊ‘%gÖìyr–.]'|„«\=0UÉÚLÉ1cQöÈ…å&Ìxû÷}»|ŠÍ¬¸„ž]»FÔš¨ÂÊ5ËUéߤãèÆ]Æ7êôñ-Li×sl—^m›6³á`™„[²d h„ÉÅâsJ‘–Ìq:ÈÂ)v†scjë7Éœàm¡ ýP& S›Œ_QŒ`iü“·Ür “_1"Y4FúÙ°á˜Î‚I¿P5ÏÒ*З€z5j ë;øjÚŒÔ.-Ûv l®ÐoÌØí&uíU»iÇMÙzØ}ØÀÎÓ#*L_š?rMÞióš,\CÄø®ã‰š·)•¯@ñbE /V®|åBŠËY BâKòÖC?Ë)^¹|…h–®X¾×€~, Z©®lÁ¢]Q]Tïñ½Fö®Ò¨oãÖ+Vïß¡ë¤á£Ç ÒµoZ»ô†@ݨ1£‘x)Ñ-NáR¦Á†Ó†n1•Nƒ÷¸‰ådÃ%„“Ò.ì3.·]D Í·l-³~ýúiÓ¦aÀAVÂÛXÝ]ÿÃw Í}üÉGbãfNž4}!Å Â*wöF?ñé;ï?ùðÃï½ñÖ›/¿¼xî|ÂjÙ±°@;uiÚŒ-ü-؆ڵg¯Öí;téÕ«3°”ôÄ_Çn=±¼°ÜQåh$-ùî»ïzè!,HBì`_€X‚Aƒ|ç0·±ÕdŽà¸ÀkA$8°D Ÿd`¹4&‰”yê©§Ð%ae€ 7+§xV& ÷L*@BÆ" Ä$ÄÄïFB„矞00 Q!ePòl«6-»õÀôBùk‰¹Ú¿e¯žÝ@ʾý÷êݬ^C¬^N 8u¶ç‰Ä»n»ýùgŸc:5jаgwǺrŽxh…•ëd€#¢Aã&ºuoÞ ˜JÑ$ZN0iYÑ>E(ôB h‘‡^£ÀÒ6„ _IÓN=NEà:÷4ë¥8Œ¹ñ¹ ¥f[T@Êlyòä(œ?CÎl™rd+Yº¨–1ujà­|éRòç%0»T™’ΟiÒ¦(S®dƒ†urçÍ‘'O®}ÃŽÀˆ2åJó+àGb•*•rårV\h¦MNT AHa k„Ð4kdÚ·£×ç+œ&u†Œ²5k53TÞæÎYÈg¬y|F̈ž?÷Ã>uÂt’î:?ÂI}–/môÒž\!œX:Q—³ç³G:÷DšäÌ[ŽHÂËùsÄbåÊ ¼§ÍÝð ºe£&¬ºMé9hd“HÆûÃçÎì0`T£vÁ]ú/ Ù£M‡êU«q¾IÔÖZæ°r¹bÙ Ë–,]¸xXU¨LÁâå •.]0Gæôlk+Zºf@‰Ú…GLO;mAÆ jLŒBóý™Eã‰cG=fxéªejÖnФáÀ}F†Æt5¥~§5ƒC¦vÑGE§Å‹7„íżÀœzä‘G€74Ë›nº >dX*¬´ÁØs`›g˜hŒ¾ìT Ddö‘™tL:p_7ˆÇ’ljÌ› #Ú<Ã,Æž#h€ên½õVœ–ˆ(Æ¥Ñ¥È °)$•O„mÚ¸Iôôˆ½û"¸‚7á°˜È Á³GOï4`õЩ㪷˜T·]\ï‘ Âœ8³ÖýzéÒ•;óFÞ’/tþ„gßä,ò·ü2uÄø µ±«œ |æÌÃjj©óÌEŒOáüùÊ—,]³j5ZN€IçžÝÃ"g4lÒË2¨~#Þ–L9­ËÀˆvý÷»hÀ„Éû…5}ôDVÑzwïÁbÄM·Ü¼lå «o½yùª•ѱ1pzPá¼ùëÔ¨)/%ëpÚ|)ÆÃ% h^ á¤l‚F•Öál·6K!r0€{`ø$ÌÄv×bƱº¼1Ø+¡F° –Aò„j‡„NžÒ¥k‡aC”?o>\ÀŽoëDâ[¯¾yÛš[_{ñÕ§{Š}@ëâo`ý@Á`9òä-R¢dçî=Z´iã¬uÇö-ðZvìЭWÏNݺMÄ'üŠÓß)MYqœ>Æ{Ê6l€Ñ¾LmvÑ4` *2àf˜‘-  ŽÁÇ$AžÞwß}·ÝvÇEw`tݵ†‹åÒDããFÀÉì¢dá1ÍÌ"|ýì[ ¸”&qEÌ=.­Zc‚ ÇëÔ«Ù¶}«ŽÚv"à¬U‹^=»³FÒ©]{ü½»õ ¬×¨VÕšM4>ÉÞjVtyóõ7>|ÿƒ~}ú‚¸¨«7ê5ºtlß±]ç®zõéÉIK½{÷ä$#ÜžØ]TJó€sŒ!Ö0˜öб ŠsOˆ64¡ýäAËi?MáBqRäS¥w2èø:œLlZ»aãšõKstêêukW­W³XùR¥+•nX¥rùâ…òתR¥UP3l5B¹6mT´x¡"Å –.[¢Výš­Ú4¯X­BÞüy8„…õ¹ÆM9/ª^¾lrÊß A=ŒmöqÑ,tÆÌÈØ?úÜA¸$sRžÚñm3È"MðRJ|°"W$ Ÿn„3O&‡Z‹„c«@æì¹˜;lÀïU¶\ø‰ x°¦{Ãÿ¬Ä°`xŸê7éß°Õ ZA}ËןT¿ýÄzí&7íÒ¡ïè=DÆŽ1²NƒúÍ›…L g9óæ5·Ü°|®³ÌÊS,7W¦ ¶{.G¾2éª4+11!`Ú‚L‘Kú.¹µúßvaŽ“>`ïÀvMûÔ¾kÇŽ-Úv¯4¦V»õ»GvjÚmRóŽ„chq× ÐèÓÏ÷¬å£"ã·Ä!ÄB2#ÎfÊ0Üè4¨;Ü+r’‚7R(Ñ~àí`ö‘"§…vÂ¡é‚ \dF;Ûþ ¥(œe<–è²8*Yd!ÐEg)D±-NP ÞÂÓ!”<È=ÅrÈÖ[`ýhœÃ nÙ q»ºƒ¶žÚ´ë”ê­¢tß~H|÷᣻ôéÛ¿_ïI£š„…s yÆ©«³Mˆ»mÓ ÜË/½qc‚iÃÇÖ¨V3Ñ¢¹ó;b!Öl¥ ÈW8o±²ÅÐ+–.[¤@AäRמ=X¶ïÒ«CƒØ­WÛZ G4ïÔ³|½iMºEvR¾Ñ𠎣»õ 6†—!½ûµnÞ‚Ž³Ì¿rÍkn¿„[²l)Æ1ç~•(T„H™½zãKÑ`a‚8J«ÏˆðÀ6H­5W”±;iÌS¨`±ÙóæÎU °QÐÄ !3¦G‡‡‡N15dzÄŒ˜à)Ó¦L øèÃÏ—”]}G,%Ê2¢DQòǽ‚¶µ…@Î"©ØNìÉœxØŸÄ×< çÈ“% »âà[8&WxDC|· jÞ°jMB(ǵí1­]ߨö#ƒzÎî44¤I—Y}GnÖ¾o›NÛ¶;q*K£¦Í 8vÖm·Ü:kvüŒØéÇô+P"g¤nެ™SfL—µhþ ^å×L[˜5vÅÒ7¿rÞúvÒY„ëѽkÇníCf©Z:°U³öA­5êÓfðì¦"«· ¯ÑzJãvsÂ"ai&#£) ‹Ù‡ócÖ0@-€ÁÃÉCÊ€3cŽÃÌn4TE¦p‘Ÿ§0ôáXÊÔA—°±¶Ü1É #ÁÛ|¢ÒáÅ|dÊ#C(UÌSfNm)“½+¢·‚7y⤩Á!XK¬ÀíÖozçkµ^ÑnXlÎÁ•[¬65vl0+îÍõ¬4jtþé«Ó†¬.¾è͉¿œH|àîo›³diD\çŽ]JW®ÊújhÁì9Êb Ë_¼bIæ/6\Þœ¹˜q‡éЭKËömC§‡ØÒ‰31«Ô‰ê;rB£!uÛϨÝaq·QS;÷Ÿ1l\ìÄ©;uïÔ²ÍÀ¾ý ,R”ˆæùK¯ºÉ‰þã¢ÍuªÕÈŸ›óñR²bÁcb*íTÂÁ{l!Ð=ÜMd“ƒï¸ç~…À]{ëpRóMÀû&€% # GÅ•èä—8¾ØoË)×ÄAÌȆ$üvÈ÷ÈÈãÇ8q¹˜L0íà!<¢fÍÚ4€=© Ög•‚C_is‰X ˺uvhߥi“õê6jÒ¸¹È…ç$Ú!)D(X¸n½Š•+T©V¹\ùRÍ[4ážfMåË›3_®ì…òå®YµRÃú pï±j@áß#„ÓÀA ¢"¡‚>r¼(,äç€@à\‹^Z>dÝ 5YKqÎП8‰†µÖÒ:th׳w7ÚP¥jù† jwíÐf`Ïn=:´ëÚ¡mÏžÝë5jXºJŦm[uîÑ¥m§6=ûß=Yƒ¬Ý NÖ\ÙØÁ;Vú è‹»µG¯îr)wîØ‰]´=zàwjܧO? Ž I)´Jv3-Ô +ÍÃ@¯òå-„ —=[ž:µŒ=qzøLª…Nš8u[¾ÆOœL ^J^µL”nR]牥DYF” 8³æÏŸŽ <á´ ‡Ë/¥ÜJù eÀ¼”ÅK”ªX© <¯¥)T.„2 ãKïØiì aӆިfxÍæ‘M{„×ëR³ÍÜ.ÃûUo²8$’qí[³¼yïþýÐ24 ¼óŽ{W®¸qõòUóçÏ9wF@bóæÍÁzi¶€ô tQ2ry@ðœ‘K^Ù±w/ÇóIŒšÕ¢i“¸YÑͺ¶î4¸çà1ÃGr’e³nSêw™Z¹õÂfýbêv mÂ^­ àÉSˆÞìÑ­;²˜Q†™V8Q`‰î}8“U1ð†6ÛëM™€è p³- fÆÂcfé† ‚Oø„ Káä—E7dÓ™ D‡­\¹’±ä@VJ F DùÓ®sùr@Dž‚Ù458t̘q=:wï×µ×Ð^Æõ0´^«ˆfÝfTo½´Eÿ°j-cÚ ˜ÒuH÷}ûÍŠ*1abîðe9Ão¬·àÎUÿíXâýwÞ»,jÖœi38®³rÚÙòçK•.}άÙXÊÉ[(ç ”.YÊ9z¦Zuº"UJvâ³ Ž-ù "1œÃ;ô˜Ð¦VxL‹>1õ»N«×‘ÅÔNu›Lì7„m]Xëißíí;w*[±ñ±,ÈásgÏa7:«øî \ª´CGŽ‘—R*”œáB5xeK‡›À» Èé(/ØïÚF8M~<èPèYe~.¡ðÃÜO ËäIS‘#!ÁÓ&M A¸8€1aRpðT"-8'Wî¼%J–æ;¾/g’އ3„¿ö»0Œ)9k.cj‚ R§åð!bØØDfL»Ã¬ð% CË•'çñ“'8mÔèñƒ‡Œœ49tÆŒ¸AƒFåË_„ÝRrÄ^:N¦á·xó(îäâÁŠ+s&8«}ì"R£_ÿÇÞ¤y‹‘£Æ3¶ß ¡4 ݇Þ4Ò§Ïœ)C¦Œ™³fáпŒ™²r,zP‹Úµë‚jÓÊ•ª7jØ´AýƵj7€©8í _kï>ý8wrðþˆbosŽó H™%kÎÌYrrª_¥ŠÕEб~ý†•+WŠ?ܨ`sïÞ}6 ;[´hÅ)›…C«†xG™™¤À¢b†CR(BѤšÕkÕ¯Û€¿ÆA„]€ÎE‹gý‹õ: lÚ4 †’50渧1à8#ʼn@ÐÖ­O4hÄ9 „æ”,YºZµ´ÈñÙî'[·lÃÒ©âP°Yå0¤1l€ÅÝÊ'ÇŸóSó­8MªK×î(³Û¾cÎ}èÔ¥sµÕ³çÌ!f SÔË'õêÕ‡Ú!B×.=;±âÚ£/_‰Ÿa+Ë´´5‚Í ÖnÞ¢O©‘c EÇe M(8mþ”çÞc'Ü»ßüˆÃ|Qü,þBCCj4¬—»xÑzAÍ +W,[ŽH4x¤ž[ºƒ™“çÍŸnÇÕ6aòàN=êä+1¼n«™Í{aÃá¨daµs½¦åóéÐ¬åø±ã8`¥B•Ê,ëðŠJXuÃJ¶‡¯\¶£Å‚ùÂîq<Ûœi‚fƒÁf"WÜ•r$€vÎ~ðˆèðHq&(ÂHyMz)!‰Hå .¼[¼Q‰¯~‡ ùAÝúõ?løaâxsÊä0ÜD“'…rãûÚ±C×¼rçB¸q“&Ž7ŠÉ”i¡,­Á4ÎikyòeÏî„ä±²‚P#–ŠPx¤3¢0@Ø!àa„r0räÊÂA艓BÆOމ™»hÑê~ýF”/_‡2eÎŽle/%KïØð¨¢E|Aò¬0õB³bѽG/œå¼…¤Nƒ@4šq“‚GŒUµvÍ<òçÌ›'S¶¬YrdÏ–='Ûi}Û°î:·i›¬K³¦-;°ÔС[``ËnÝû¤J¾r•lJ6|ä¤)“9ù›kötcž¢_#‰²çÈ“=GÌnÚ¤e­šõ ‹hÛ¦cëVí[µ$?ˆðQ€#˜‰Ä6bCøD¦cÆ1ëàN´KÞ¡+ƒY³f/UªLº´™ 2…6j‚tëڛςŠÕ¬Q·Dñ2)S¤mÙ¢­VE-Ú)Œ@d`Ÿ¡gÈ)[¶˜MŒ‚Cœvì—pÈÎЂµŠèD-]|ìqœ_?ŠâWòÉ´\ä+ª )ü Éö`ŒÏZ”,†,Çæ‰‘ø•a%²UEñàÚ©cwö€m´k×–UÏö´”íÙ³·eå±dòûVæœc9Ý6Œ?TsT®Él œÀ'÷Ÿè ®•«á¢Xçð¹€ÌE©C¼i"„“—òÔ’Éœ…Ó#c,\ Âå/P¤|…*lYfÖà @ýbIÚÔNä*ë.óæã _4zÀ•¨GÛŽí+Ö‰n? ¬b‹u»ÏªÛ5¡í@B+yK޳o¤k™ðx—®\¢NÓº¥KWž=sñŠˆe·Ì_59|W¼tÖøRæÌ]¿kæ Ñ£yUïÂÞw<ÎQ&¬Vlÿ~cË: 9ݲxÁš6 lÅ›{Zt j=´a›ð¦ÝÃk¶‹¬Ý1¡y_â#º5lÎ cˆ‰¨^¹J׎°80¶'©ÄiοáÆ«†)CŒ;P„Eá|‚@€JÞYÎ Â,^`;„qcÆrr%€ô¥p•*T¬V¥*ŸÜsŠNQ¬–9XPGí#ñëèlOª8a/& µƒ7UjÔ H•ºt¹Ê]·Õm`c&]‹6]j7˜Ù¹×ô-ç·î9¡rãˆýG4ìß¹û¤Œ}‡§™Q0jAîÑa÷üô'[d欺õλî[0-xRxxXÓV-œ}jÕªå.\!Y¾dÙRìú(Qœ·ó6iŒ÷’ð~§^šA×kЮaÓ>­:–¬>½Y*-#uá–ª4º×âPP°Þš·mÍ1(:udg@ðÄI³¢bfÇ҇Mƒø¥Š/1kŽC†ƒp°ð¦=*†p°™Þ3×9/ˆŽäô¶Ûw {)‘;ì݆¥$ƒÜÅúÁ‚3¿_¿qÜØIèÎ|â?n Ÿ€œ!%„Ã…âl>z`  ç¸ ™>­qP³*UqÖÂhà¯V­:˜#z›HFþ0kPð%y™ÀøÁË”+›3÷)#„=fâôé,.ìÛw(ÞŽÚuÖ®Ó Q`“:õêbõìÝC‡DF’vëÆŽì ö‡Ã×#mÏ€øˆ†ŒÂ*ZXXí†õ«Ô¨ŽŸƒbkÖ­JÑH,?Šul‹vùç:wêÁJp£À âü9Ï´ZõÚÀÛð£ÆMÏ óÌeOw­Úu«VÃåP»îתµ6b{R›J«ƒmÒ½[o„¸xz"ú „I„=†˜ÊÄÖĺæ¹/‚¦4‡êaùéÓe)1z|xЫ{·> DñbeØÂ96\‹¶fÃAI“¤¢‡íógVE”Ð*TÜðIèèÃÙpˆ.Ǻòåä“A jΡ‘B6Ž÷‘‡ÐnŠưÿ(M`F~O¼Ä#àƒKºÀ’9JC£ Ê@¶à%ÄáWòÏB^MÎïì’õA8PmÒ¤)à¨fÇWî¯f„Ó™îön›_¤É?; f/à|%{'Ä»p‘¹ó1ëØ0¾ó7Š`úpÎ2’ž#Œ™Wºà|«Y»V³â•”o0»anq³þa :u¬\¯~åêøëÊT(›×Àä-š«ÿ°~ÊWÐ}ļ°y‹b ›0tà„¾5k–Eb¤È™¿ÕÀŒÁ±é¢åš:÷†µÛ8Êäèñc¾öVÇÆÍ³§Nß,°q­õ*Ô¬†ÿ¹n¹ÊËÖV±ñ¼ýçõ›^·cd›¾mª×/_¬d÷v9bƒè*4p…à©ReJs6çòa‹„†Le¿yŽlÙS¥H‰¯£ ìÁÍH'ñCà0t#œæÌì,”)KH'& % Ö|6±o|ò¨V±|G¡8‡Ð'Œ§(›G9ýZé`~.-jP ìÅÄ|äªT­j@ÚÔå*Wk[¿yÍ¢ztîY»RÕÞõ©RwN‹.óZtŸ\£ÅÔ >MŠ–ªÖ®xXl¶˜9Å¢T˜–ð¥ï­ 5š´ŒŽŽ½aÁ„™Ó¦vìÞ„KŸ;w6¢­ò¨Xº<úaCí:uDçÇ#Š;$onŽ[Îíl7jß¡~ÍÚí5kX¬ü¸¦B©®?Öy@`™*µKU7tØO@l÷¾½‘]xMІuëÝ{ûQ3ð Ìœ>-‡ »R§ÏÄK—ðF‚[†p¶_ö“#ALH"MäÒ y·€ÁÛÅ©‹Iùöö·!wZB u0ÿ¹ü“¤Ÿ á0ãøðp!vóä.3W!ÜÑc'8þnJèTάb}=fö¬º ð+ûðOÊ›‡´B2W4$ ¢_‡(ħçïeJÂMšxkÓ¡³D,N›9srØTö à¢ÄÙI!ÿGÞ}€Ùq]w‚#@DΩsN@'tF#5ÐÈ9çØÈ9D A€$H‚9I¢•©dK²,Û’mÙ²ä4;í±=ʉÄþêê-F2µ;ö~+kù¾úª«ëÕ»uëÖ½çòQRDƒ ”ÐRV׌š3{D™7wQJ’K|jj§MŸ“F8壶nß²aãú}öN™6Ù|U·D+t§Iá‘Nw4ÔÎÍ)‚Ióç-¶×š§³!îPaÖ@²eŸNµÅïkÓ¦MLhÄ;zE*A¬ž+@´‚pÄÁéÓfϘ>6´Ošn“ìnäˆN†t§.ýÉ@RE7²BEi匌‘)˜Â%è’%¹ Âá ¢Ç.0ŒúìßB r¶DVc93Ô°¾Ev’˜ôé3ýV³p3p~ ់ýVSDI8=ª¶Éà,\°tÁü%ôÀzÞ€\ gB8£ä”.•†~‰6ŽÐ&ƒ—{hÜf„Kç¥ ú¢ .áiÑáè-O݇.=ÇOãÇ︳«q&jÓuƒ:Ñ6D%ù¹y´^Ü Ñ²ËÙ%3—SÉŠÒæ+“W.i»·zÚÞ¦¼++r cç´©rá/^4¯hd~UCe}íèü!%Ï\yaˆm÷nÜ´ý¤1õ}{ôét[¿¬…[º:wûÑûl9þ‘ø±Ìàôé'.ËÊ™_Lá™WR4iÖô¤’@^1nYî¨GfulÊnàjxföšI#ë p-5u+t®`ÙKê9®>ò°cŠ¢!ǵ•Uܰ;ßq'Õ¤ ãƒ7¡™ ¿Êp3‰èìÄã?¿`ûÖmÇ8¨?ací£“$±Å>d8ûÚêg@È£>JE¶sË”ò‹¦áвÖ,§•Y™Hd@V”×2~|ciÕÒI³*‹ÊÇÔÔ·VÜ¿`Í¡Ú »JšÏµ/ß?eíè }‹Çf>{ۮý7˜õð‹xãÆŸ|ïFßaÙ¹Ùy—älݳ[$«§|Ë uí-ê{xiÀà Žwø~hJì¦5òñ»dV½efËìÕZUÓÌ‚šCn˜¹«º}{ûü 嵓F5‹¢c;`aá‚N,'SÕ*îóÜõ§vnÝõ÷ìÚçÆuº½óœ‹M-ö¶˜céì91Ç¢’öˆ»‹Þ£25«(”úôtO÷>cZÛŠ ËCFIÁ’кÅ:±äË$n‚1bVá¨VQÆ*Kšûײ;ïd.Öü°?ÁH­éÏäö3¦Ïm›0eÈàÌÕƒƒp˜ñ½¯T ǵàS;øâf5ì Âp ‰ÈÁ'· !ô-èŠv`’ ¼#WÚ³œ¹ì‘ä`•G0ÂØ·DC v¿õ6µ2á„ ±’8¨åE‹–€7ò+‡S`*GŽ2ÂK—¬´gòÔ öÝÈe .XµžÑ#L}*ÍÅÐ@8¨Ò8ÄíÞþ3#œhÈø6ÿÈ øs2\ZK™¸½>3ÂÝÙùnðFE‰ÿÃX`Ûéâ¨æUáVGÇe:ñS|Í—4OÜ>zƾ“ÎÖÍæú± QQ5'3AÆÐŠ.x%mSÇÞÖå–ù3ôî<àïþøÆMÛvݽzÓ²EÓ§öéÖ·Ó]ƒ3×ìérâ­GÏŒ8xñkßO2ƒ÷Ç?œÚ6 ‚®˜»!0§´hñºU@kךŽ1C nͰš'foÚ_5ùÀ„„KL\žW¨vOs}Cx~Y­85Ï^|ù%i Uû¤”“ìÑÚ£tõ‰D6 cÔ fžF8°¹Kœ¤$º]¼ uàå.^âdOb#·‘Ø€l³¯®$gÖãôV4-„£Ûr°„ÞÞh˜R‰=,„@mà€Pö/ø±ýÞƒeµU"¯'jžÐвmùªÅ5Í»'«m?Q7õ`óüUs'YZ·tÏíkwõ¸÷üÐ͇Î}öþòÆüÎ7ªëGK]-eÛÚ5›7¬W¶t`V&µg—ž½y äzwªÀ'ƯJŸñ(žWÉ!ø* ¼¦¨¬cú‚Y…µ‚=`ì¨iß0fzIß¡kf/Ò»_‚…ÍM‡]Û±¡K×»DZõ¸»Ûª%ËN½7Ô¶’¾¢*.Í[´4Ššši¡¥ l M¸óáT™h/S:LSô©ç^$¨üZj)Cb­L†H'îJ§ZþEœ{+ncÇ6ºÊõ먊v0¢ôí30d¸HôB9¹jÝÚ-;¶_»þÄÏ>-'MCc3Y$•ý#QdÙ$Ò5QOÂó¨?"è˜k¸¯ø[’á~òúOô“oݶC™ÈÇŸxúC~ ÂM•ÜkÊ PÈXÌ„[éŠì·!^hÓ]8ŒPZ@8Ž!M­cFß!ÿÎö›vì¸ü¨`•s‚ðêšÅc3&I¶ZÇ6·´ H×rC} 8![@&ZJSSóعóu¹ëÉV¢Òîî½»víÙùá~Èž½WbÀ¶‰ícÇM;N Ü’ßȵ¤[ú7í â)å¤ì.r^FxáDeD‚Z”=œHS¥»…ñ M¿«Ë=,‚žÄJ2\lÙY<3C†£w§pYнÂ*ê`! ®š"§PIN+Éf”°p¼v"”Ñ çãéã /½xA®ô1"þ¡¶¾‚X¡„”:Ò>Ô˜¨0ËY˜ã4r‹Õojþ¼%åeUàM.bƒ¢·æ²h“g ¥á â2é´õœ|ÑëåÈ~S€K#Ü¿ƒåüë'oåi¢Æw¸´¥“R½•§‰z&îÜ}Ép´”L¼>¥ÔÉ[h Õ&Oj§”kŸÐ&EFâ`)-ÀضŠ^C:ê&¨œ|_Óü‹ã—îl˜Ö4¼pÕüŦ–Xñ­cê'e6eÊœöÙwuêvúä¥ Ûwnسiæü©ëæ-Ø{x§%ý6ìítôômGN¯zú8Öû?üóoΙ1³²¨tÞÔd£–‰ã‹kFšö“ê[Æ-ZœUýðôõÊ'>4míʲ– %Õ•5d¸}úŠ-3¥EyS–Xèö?úÈ–m[—,ZL¿ªu{ºC8³4¼ŽMZ¯È…€•Žó€ 0ä9ÎoðúãO<ÿìsöŒ‹j§‘ÛਃpþÕÉ(«ê œIå¼­;·ÀüÁ9 FP¬õÁ34ê×,Þ¸Z’ä#;vUeæ·jÊïÕIUÓ†²Æó-³OÕÍØR9eCûša¹-£wÞwÇÆƒ÷?V¼óÔ«ùÏjýþXðîwtÙ±víî 6%Is×ÏÉ'ÀÝÕ½„K"ƒ³ÂXÍpjUwO<ŸkªYâûõê­4DÅÀÌ-ms¶6LÙ_7[,®.«hDFÞòy -ÂCßÁ.…W»u½[îì>÷ô¸võa:[`oedeçKB”¶ÃEú·´† pÔ’!à ¾L#œË®?óO“$ÈÔiLƒ›·o“çð ¥mŽbð­ w‘ázõëËÍ„K¤lX2‘È$§)ˆ¢` •cë˜ ³ç,¸åÖ;™ë8¤‘á¶ïÜÖ±iÝ—ïŽm¾&e)‡ ó˜Ú"ÉM?¹¾®…ÈE‘ˆˆ/_¶}§'ü7Ž4²ÄZ„XÝHO®ÂÑ’àÁwt] KË–®ÒÃÝü¼Hœ1œ/Öí´©ÞcÈLV” Z2µŠ(h*¥öI|I`µl´!¬2à4ZŒ!<ûÁÂyNœ<£Z$Ÿ9þ–ÞŸ{‰®ñ¾ôl}E{ ç´é]G™qÜŒ_iÙ5ä-=!.\°¬¬´Ò°x(„Ó``­+á= ‡xò®%ZJt ¶4¹ipæŒ-ìp¿ÂÏ[!.BnÓI)ñËŽYûÃå$Lt¡&Jœ¹Ï]Äyó4pøñâ’ Â7„¢1È\ûôêÍÍ„0§ œjœ”º 9³fÌÔ½÷¸Â‘»ÇϽԾr{Nó¶ÂÖûæ¬[Õ6#oh†úh·jÃõŸ»`:¤i®lèÛ¥ÿŠ5[VnÙ²|óêKç­™½8sxéÕm½wétôDç#§®}ùOÁÛß}÷O¼ðìâù jËFŒ­2>†Š²÷°A ô–óG4o®œp±mùÂî'šçi_¼bÂt¶+‘[U¡áIíiZM®ËT”xD®"níÊUTމcHE`#N¹˜ 6¸_D¸ÈlBD“}ø¥^|ï»ßóâó/¬_»Œi°¹Û ‹=Ô‡srõÑ‘°ø˜ZZHd¦òr· ¡ÐLcc'Ž«o]Ù\³aÙòÑ¥#Úë›Z ÊV×ÝQ;áHÙ¸]ù­{G/:¶ùtfíôÒ­§ú½|çÖ{kvùÍÿöæŸ ãrs ûªæÍÛ²råZ™âW¬–w­°l$ÈÉÈÉ¥ŠpSsànFKá%z}¤ðö)“y x¹²ô–õ>«¤î융Ë3kŒž½iü¬‹W·”U-œ1›NU’£Ö¶ñÞ -%æ@lOÏ®Ý.¿@†K\̧¯E‡díRžâf.fZá¢ÜnRéûDR^ ­*‡pd¸_K-¥ÅžùΦ”Zoð« ]Ù¿ùA¤’‚“ô§À¬C*ºu›ˆn’ œmÝZþÛ)ÐÈpÔtò•Ä ¬ß´‘ N€¯êŸÔø<Îq§Dæˆ Èåd˜v8™ç\¤–w-e¯>½£5bÓ®Ý{!cTÃÍßÝ­»z¸xùwïÙƒ’÷<[Z‰h²¢Qœ’¨èå#ÃÕ!Ç´F¸^¼ïìêŽõe%Ô‡ _JjOØÉn·xÉ2ñÅkVo'À’>­Ž¦¢mò¬ÙóYù£èxÛ³oçúŽ5;vme6’PøžÝõŠË¨ºÝ{ôadj=èáÈ(@Ý'A˜‘–á‚ z#°àEp±°éORŸ[©*EàQlÒR²ÃiDƒŽ› ‘ùJÚrç‘Àˆ5ìp0C:YÂÓ^k<3ABIêÒ£ r€ÜŠà"&ù2ΕÆ{!:æ1W‚+2QÌ•4Š®ñ¾œD=Œ—H÷+?÷ºS•ÞðŠ©1CT â—,^I†[¹b­öÖh)¡&úÔ¨¡#•6„N{š¤ιãÏ!Üç?ÿ…ÿœ'â¤á£C)T&¼"©Räñ²ƒ³ç`=¹pÿƒŽö»¡q4ÞÂy}†á&ÀÉ,•ù®mÛ±í QÔ¹L2›Zw/\%wâ¡Úig›æ³¦k¬¨<­¶oL,å´ö6†¿Ö1KÖ.œºðÌÅ+«¶oŸ·ZXÍ¢ESçg4ô™¾²ÿ‘û:?Ýýðñÿå?›2/ì;vDu¥æäEL²Í™1kÙ"F¦IM­cgìkžy¬~Ö™æy'[æ‘<„HÂõËVʲ¸qÝz³1q¤Z¸wˆþJ1µc×N°Ä×_^;B ÷–H˜ÀãÝÇÖDî®›òEÖ’HŽ|úä©w¾ü޼ÿÕw¼ô²zi° R¹@8FJg£ËrÂÌIoÜLp~‚¬…ž°¸W„œ‹5’çÅ »õ†-“Ïœ±d–BWãGÖÚ°¹­¤rפ¹÷ŽŸóàè…Zo5»½yÞ¸÷ÝtoöýÏußvzùÕ—TyTxaÊì…žKú{wï\µ`>ÅÅ’EKIT-ãîéÕ7Éë4dð ]Ý(N:D·¤ÄÕì9<Øàé™iƒˆ¶ãêš¶,X¾~ìtÚæ3“—ó¨\Ý2YÄ÷Œ–ñ÷;éE³™8Ÿ«Ò¬Ÿ“­åSÐxJ•É{ŒË·LoÎSª"˜§ôLK#\¸òÚGõh»'Ÿ}!vùßÇ1þÊìpfT”Ê™¦hbª4Ê[SDŠ/å×¾úuÚHD?r›äÈp)‘nòÊá"î;ßý>Ž-`@q‡CÇï•&ÉB™r¥KoI*¡p «&Ž~ábѤÑB1}5²ªfá @Š(iÑÏÞw†rcÁ"²ÇêK…ô&4øQÓ57]»fãâE+€á©®¾Y¤9ð#“·Öñã6mS·}ùÚ•÷=paË®¢º8OC_ž$«CX¼ts žEKäù]B\¶:\Ñ‹.Yºò¶Û烙Á ó¢\³nåÆÍë•û\²l¡è;ÙXÄ$Í%ÐÍ[¤Ü #%-%E8]H*: '¨ïhÕ°¨I¶ž™3Ó¯ÏÀ9ª€œ`„ ûÈpòÂ~¯\±¼¹Âåê±há¼Fï‹ ÕgÐætZJ:M‰P“ºŒ?QÀ>üG@„0@(%Óß`*CI½—3¸B†ƒ[®xNº Àh ªÅeNB/¯Ø•¤®èü#£'…s–­p½÷ ðÈ«®ª÷8’»ñ~î¦Ú„Ðd¸H0Æ:‚8R愎®Ò†Iˆn´‡v‰it}Çç>÷›¿B.½”nVŠX\ñ—ߢ¥¼YG•¨. o‘r"WRQ*3 9› ž-6†@o½Ø'É£êrä 7ç^¢·Ñß61HÆÌÚÑ+«Ç‰K;Q?ëð¨éÛ,=I*Ô„ð¨Ø´~Cnæ°s—NíØ¹qý‚å[Wn:ûÀCH¬Øm4w\ã¤;ú [¿¿û¡sxð[½¼š ÉÍ"9±eŒÜª¤ŸÆ¶±ù•å”üª„Ï.o83}Õ–ÂÑ÷µ.<3~ñ¢¢z­$ÉtSŽ0´” ‹7£"TÀô¹øÀ%ªhªEäX©z6±}xº¨eCghu„Þ5Ѭ¦P-‚áÌ@˜Ï—œ9uú©ëO>÷̳•páfb( Ž1rÄ#f*£$߇4æƒ7M _JZJ~ŒGAâè!%¡–«XEŸIã¬]’Q’µq媚¼Â…ã&—ô°oæ’ #ÇÜ×0÷PÅ´µµ³—/Þ™1w}¿'|ÀÎó×>ÿDz ¾ëCŸ^²|Í¡ƒûçM›|lïîE3¦aë¤èãð|w·^8Ñ$Z ¸hààØwä ¾9=g5'¿J. üüÛ\=ª¹°böȦcfhžu¼}©ð}+6Tf°nê°„Ë,èɰyž}ëÆMNHœÔöÄbþv0õŽ»º‰"¥…z<´âÁc9ä‹9™«œ:wâìJ…°³ÃÑÆýºÖø"ܺµoŠqp ˜ò6Ú·…/e XÂjx#®q%ô"G²“iÄõo…¼•F8g¼>ÿ’ØaÀ2ÎÇûu_Ïç¼Ö¼_¶:8mˆ`¶ ÈUUŽÒ¬ö!¸ÂnûD.Œ@8ö§_k„ƒUa„K{µ¡#4H‘2r— :aAqÎ_|ˆ)Ž–R©J¾”Žì‹Úc5x¢Ê—8xà ù/ï•K—QR9F÷™ ÏšÛœS*Ûò½£çŠN;9fÁºÊq³ëƬ[±J¨ÀÈšjÑiuÕU»nŸ2}ƒÇÏ®lz䉧g/_>yætšüêºñwæêÝq°Ç±Kw<=íÙw&Ž×¯ßøô—¾XÓÒ¸lÑb µ}ýF3ªuÊÄþÙÃEeqÄ;¼xCåxØö`û*‰TÎ.ØP> £®¢RgÊ‹KdÙ %ùí¦Oc"´Ï¿øy%ªh)õIï!Z€cT8î£û`ÆÛð¸@¸ˆZsÉàß°ÃIªùÈÕ‡}øn™PùÍFbi˜PGãg¬lr©;£ ΉïÝF˜ýÈp´$i)c¾É³zàÔáÂÊâõ+W¿§OÇœÅÕƒ²G/Ú;vÖñêé§llY4wÑö!Ë·õ;x¾÷þ«}×ÿä_~ûÛ?½ñò{?"Áî’Åó§·Û¹I-àe’Í«zU^Rywמòò "}…ðJñ4ª¾Î‘)gL›Nwê_–˜ kå‚Å˧̚˜?²£iÊ©ÉË6ÕLÜÔ6[´@kEÍêEKIœk6¬’•Áì‚aØ2×._Iš5aHy'Ðlßzç]k;6C,Q˜f_˜Ü"làf„ Í$™1?×òíˆp Ф°-‘áˆti„1-o^ho =x³©]töâÊzžŠwߨw&°¢8zTÝDe•D@Q@ZJ¡,2’hŠ·pñ‚Í[;.\<÷®÷¼4ᜬœáÝ{ÞÝ¥kç½zÞÙ%Élà \Kó„õë¶.]²jÕÊõ )vø}¶˜âÀ[’}Õ2 ·tÍÒcgNð¥,­ѵû=tÙáNÙ½‡°œÞ‘¥ ¿–СÙs\llhÔ> ò¹ØD\º| ²¿iˆÕë–?ýÜ+×,Õ¥{zt“•â 9HT”Ü)[~^±A3Pä!S–~[N¼„o–á$¤P!ˆqÔôµÞXæñ¬ôŠ(;d oIý¡ötÜ)áÂÓ$-ѽ’=pàrHI¢ñ‚Æ«p†Æ^XD¨0‚ƘhG™â \ä4p^È‘À`8W!-Á!ç d8'½>ÿrH }cá¼_òüÓ ÖüJ#kVwÐý®^µÞ9P­üo‰hQK–G@¤ ý7.lo¿v2\$O §5Ç“;*0N&ÁI Tž»¸gÿQ«n÷óm-î¬ÆÅ\T"~pï>š@”v‹û;Åàü¦ ˫Ǟn[r~ÂR8wnÁÁ Ypm˜=^yaqkSãìÅ3Z'´jöå)›'®š4¯cÐÆ=ýO>Øcç%».ÿù“ZÁó-gh\²x^mUé©ãÇ6׫K0µmrQn‰ ÕÄm`Xû‹n¥Ò§¹©¾Lš!ñmôL\l0SZ—4¶Ÿ»FÒ5·qÂ,kç,-à)\ÙÐÚâbѼKT²U¯c<“º-Æ‹‡ãK¹nã–°˜riwÊP='™¨(Ï$Þ(®ÄrÉi‚’s6 ãßñùõÓR²·¡Gˆ5M ]e œx82\¯žý „÷#• '3}ñ¦Ûxpíܵħ‡B ±Û»w?rÆfƒ>B;}Dpqñ³S­½NEI%¸M^¾`朩míc—­X `ŽÜ{”Ï1ý§‚µÛ¦B¸ ë·-_¶õÝ$Ì{B;•£˜R<³/_³‚¯ÌâU‹wÜ5{áÜ™óçÒ¦Êvª“ìsëÖsBßJ͸’…©t$ÁB÷‰_ŽCNö¹N·Þ¯~Þ‚Ù»ölß³Ǽ…³¦Î˜4wA"Ïé~Ž={÷½÷8…@òIÁR’Z“2îép‘#T")•`bŠÃZÊö‰¡‹}–ZÆOÖRjMˆ½a§8Õ+Þö¿ˆpßûÞhA @Òš`‡ñÅQƒ {At±&p›wlØAm´ºß΋Åcøåæ@hp>6 è«@8ïÎku’¸æIAfá"•I@ ùÕ4‚OÂ7¬]ÓÆ]ÕMýÖMµIýÈ^âc%3–ð¾EÑÒ2\Ü4•1—~-´”{ö ¨M|µÑ” 4`ìÌù‹é]Qs Œ%®‘µk÷¾Ã"¾1Þ½e¥’è?¬8‡õlXudk O Î#Ä ÿ¢˜r^,7eÓ˜g§¬xbÑvYð77M=¼vËø–V–añpd ÇW·TÍ]4[›eÓÜsG2¥}jsÛ”®¥µƒ–l¼cÛ‰îG/Útì3ÿzãŸ~bþäà±Ã¬>"¸—Μ+ð@¨õ]}{*ÖÚÞVÁ™6§\…—‡ætÜ?uÕé)ËÍ”õuF[s+wJJQj8²/@É}öT8ä)ä4éݳ×·Ýo"ór¸~àÿHraƒp‘O2d¸⊊™»tCb1(ä6¨ƒ‡pa„sAŸ˜K”ŸÌoÜŒ9æä´é¾‘9Ý|³*M%e²ÙóûÈ–5oÒ¬¢~™óFOY=eÞÁ9«Ïµ-¿¾dßöZç­°ó`Ï“—úï¼¼ê©Ïüó_ÿÆ·èÔÝZwðð…ªZ›ëÛ8vø Ì»ï¼§ûÝÊ lWXVDKinƒdŽ!üûéä¥iΠcd 똵˚'훺øè¤Å­ÛwzåAôª¼¼Â]ï"sKÙ¬ðé}ûE|¿ë…—à¾ÇSChŠ)™—/_ÅÆê¨k¡‘1nËŽÝ!±9NÊŸž9Û"®€î|üÞ†‡Á„ƒsa‡£@K#Á–·2¬_·çÀ~éÑ/^¹ÌÜÅSQh—/r‰08d§‹DôWȲ…àZÆ0 bD%¿DÑÿôÏÿHE)…ÅÅï»tùÜ–íë›F× 60)Hvë-ÂAhG™¾&¶MÝß×2~ì]÷tëÖ³G§ÛoãcF€ãµBP“²¤¼¬œ£¿ÔhÄA¶4…Èe_¼£ó’U-X4—‰j÷¾í S<|íòªµËT¹£³˜ï[ù‰‰C¿ãÎ.²j‰‡ƒ‘ü_¨:ÙáÐbOÊè%ãé·„ÒGM¦Kæ%¹ y°0â(Ðýð%áËjüÉpžN¯dã`9lhÖm·v;\ +o ûÖ€ìDp”Š2ª"¿¨=Y=‰È?C‘tµï+?OY»|á\“ÒGWa³…I dz.áâH\ }#„ ó®Ÿh6b×¼Ù$éÔ´¦-nÊq)á“ð~«}m¦òk'ãù—áäV-Ž) +` u%ާ‰¥V ?”û.>èØùËWãlB 'H†k®6æ Ã8E.±qœ“ÃBøðêå+Ø¥D•!”# KšóË/®ÙyaÆš§–l×Cëö´–T"‚»öíÅû«’:{ú47{Ѭ²ìü#›÷Ξ8mÔÈšiãÛËêZ:•UÙ~èöýçï>p©rûýõÆ}ãoÿðŸ›Æ43oXºòøÎ}Í•µœ*ædÜ3tÀ‚•ËF–”µV>¾éÐ…YkÏO_}mõžÃ³WŽ)­b‡£moªN'yøòóYÍÙ×)¹©+¡(KùÙ9…˜u¡¦é¤3D:8JQíÃ9óÍ’”ùÅ2ä¤&'íÐ~Cdz~îÊËÇV6]ÜzäÁ9[ž^sl÷âVmxøøí‡NØ|é‘ßúF¸~èc,;önQ[üðÔ7UÍš=•éÈÒÊÌAYõÕýzÂô³¥¢zÓÔùo?zqÁÆ“3V¼­bTCQÅùã§ŒƒdLs/¬¨ª${ØÙÓgœ¾÷¸jsJ.ØyùÅòRnÞ¾Ë첿tÙÄ3µ WL6H&ÇSÌF'OÝw1ìp¡ÆäK)!ð¯e^Ê·§ Ž BY½jx³!RþE¡xy@¸°Ã… 7cÎlžó-·ûà~†.Áüì(råÜrËm6äÉ'rwñ@!+ VAã¨.a€P6 2œîé³&oßµ¼-Y>oXæ€;ºh£Ó]wwr2&/]¶jÒÄ­-í›6î\½j#IN¸ÿ~‘mìpÖxS Gò{ ·mïÖ³—ήڰFN0)N@# Îuº•ÔÆdU–јJÂÙÏ™½PLÛ,89o.Õ¨ð»qZ§Noß²½c×ÞmÒÄÏ™?£¨$_ IßJ+ ä8Ý®(*$§•ˆôŒžŠÈŒŸ¥¹á€½-eT9ðmÄö²»À9zHg´a_0©Ô”<5ˆ>¿ˆpä0v8–Kˆ5Î’¦çA#6#UG¡<K‘O<ˆ¥q Ì ™›Nœ#½¯Tùô‘.Ëæ'Ž#!ü>€Sˆk„Â4¹….…ØçÍz"`ZšÇyœH‡‡Ð öµ™ºcòm†«kIß,Ù*¡&u£_„㉲DLRºL×ý^ÁM_¼|õÒCûÖþòÃ×?9MÔ²ë‘GŸÀËKÉ7•)N”aïQVÎúB¢’Á}ç­·9ÃÇéT®CIè/®ßýĪ=ϯ9puá–‡;öO¯oíX»N=á1[ÖwT–—µÍnkjkž.бÅQÝCP*Ÿf+÷#E%y7 Ë=Ýz :$CJ ¯åX¡†ý7î;ßùÞ¡CG>õ©OQTZÀIÌ\éýúÉi"N#”ÀhEx‹gà©A!>…àåÊÀ×x5ú‘i„f…ì½/¿ Ì#¢ÁHð2¥Ÿ@¸È9ÝÝæÑµJNmòD:o¥á|ëŽÜÞ|p†ÈþßD¸à~]îÞc§"¾{Û®½’£rcsŒúÐU>xõÑ+>ŽúØ;F6lÞ¶~ã¶•k:¤H7<#GÀ€8 gï 0} ¼í!Ü€~ýÅ 0»&éüÇ´ŸXÒñÞ=çÞ·ýô»wœ¾Ŷ%mÓ(›ÙØášêFA¸†¶¦më:fio¯ii«in*­Í«n¼sÖÜ»»ãôµ{._ÿôßþð ÷ú#Ï?”™—ÁÌS:,ûžNÆVÕIšGK¹bÛÆì²"„µr`ÖCö~êÜãïÝwþú–#;ö@¸Ü!ÃK²ó¤\‘—’Ì$÷1Ê‹3ácRVQN˜ƒ@ȱhåîÝîÔl˜âHoæmbÿ¬,ÆH¢[5åÃÂ-%ôbv¢§5G€ù@…X©D‹»z À‹rZÿLPêvªÄãü‡6=:LìÔô)³ïéÜ«Ûí=Ú&-‘]Ñ\7ú©‹>»åäK;.œÜ~jê¶½ŽÝ{Çñs#=õG?¸ñÏ?¾¡“K—/ž?dYÇÂúñÕåµE%åô%ù¥9Csû÷ÐónYºúâ3r‹òHl“¸©%-jÀO­ïÀtè°Í#kvÎ_ñôÞSïØs楽g.mÙïµNo7¨gÜ0ƒN„`΄åëV­.Í/$¦Ãx1•=ûª€*â{Ó¶ö¶Uë:L<ÓìÑ'žzè‘Ǹò?Þ(±kNnÛ½ßqWŽ–’ ÷kñýG8Z2ðf#Æ GvÇ6O}8U¿ÿCo‹ÄMxbè:|ì^h7fìøTüe#0T.*ˆ#—Eª3H™H›Õ¶˜Îq|ÛÏd¸o÷;d¸½º1¿y Œ Ϫ­¯¬¬á‰RÚÔÒH -¬[jfZÁ1­“¶lÞ-•Š`†E —ÓOH¾œD)Ìž¥˜xNa.å@˸ыW,Úä€`††–Ñ P]Vù½ä@Є‰Z‰]EväCX¿a3ú¢pÏ‚…ËÆŸù¤ñî|× Mõ™Ù}û÷jŸ:aû®ÍR]ꛤõuĻں]RÀsñ$Šc#É­Z˜ „“{|©PhüÓåFã°™?xéŒ9 /I9ƒÖC\¬¹LÐpŠ'çæ-;Âj%0NpžŒ ""x÷H† ÒZÊcÇN¨‡Içɨ€àIQQ5uU#«gNORP’“¶lÝqôžK¯l²q†3ŽÉaÒ5ÛwìêØ¸Y-1fHÑi„#iA8û$TnîüÍRgA¸í;C!9~ì„ÁýÝP8áõ3§ÌX0ïM„ÓšM™1Sù@jä ^ÖmÆÙ­á´ åä8a%ÿr„ —Î_ -% BP:¶lgAn¸q‡ì=üØõÇŸzÖþ±'ŸAwXæ$[‚püÎŒPˆnBGz‘Ðy9¹t’ˆ8Ï] APv®Iðƒvzþ´™E½_Ú°çÕ×޿ïü+»Ï¾ëØ¥ü^ë¥;ol”!gbÎôsóG×·.HfT}iͤ‘cŠ««s+úWõ^·ù–Ç»œ¼ÖwןùÖ Ii~xãõµ;W>HÍ—–ÊÚw÷¸kü¸1wt¿« º¬mÆä‰ã$ç¨|hëÁw¸ïù]'Ÿßwîäª-#3ó ²rjq”ƒ±¨Ø«dà ‰u„m´yd2BâNôô,X1¹"MTÚÂ(v8ú|àáci€¨Prð4!¯Øô?!Â…P“H”ävQ£yBñnçöüï5âŽÔžd8šI¬€;¹¨ ä¢>Ñ]î¹»{aVa]ù¨½Ò1.Ÿ¿ª¡²yÉüe:óî÷¿ëàCGöÜ_·ñЭõ¸ÿêÌKïRxá÷ÿäoÔ¶nåÄTÌ“÷® Tâ®gŸ{~÷©œyøäÚmåƒ2uí!ZgÃ]eb{›%5Â0dþ”­¡®±´X1güÀCÛn\¶ª¬´Øµáç"” ãE€ucô¥„ظi‹ø£d‚ö’ª  À¨6úÖeÕ5¬×4Šxãø ÏÖÂEËwìÜWרº®cëÆ-;9ƒÎY¸tBûT ²“ÁëD¬FVkÞ‚l"A°TVµg¶Y'kÖ®'³ò[ÁVJ÷l†mܺ̈́“?lÓ¶íIêËÆf"JB…SlÒü™³ÙŠ!:’`÷-dlIyÓtªi¬¿ãî»Ôà6wß¡ƒÌBÔ._ZZSYÛÔ +OØálF Nœ>{æu9_4’d6étk怡³¦Ìhjhfã*nóžÝí*Ï™-¹°$]1‹þôǯ'¾”S&KFÃavý–M+Ö­A=%©á»%î ~Ü¥å-,dã®íɶ]†—¹Ü—çLž–E†ûÑ7~|C­¹S¦+ÌÈÿQ }øÖù«–íÀ°ÿÞ|[m£2ÂSc¨!œkh,¥_êÙwGeª~¦by1ìÀ€øùI /Ê›2w–5ÒPQÅêvmÿÉO_{ñ÷=ú›O¼óÜúf.ÄÇI×Û8yšҚ勛žËßxpõÃÏüáÿø~R5à7¾ö'ÿðÂïÿ—{¶ë´ëô={˜ýôkb½!Üï}íw ”˜I’qˆ=åC_^=bpÖ`z˪Nž0®¥qúè±;ý¹«Ÿxìåß|ò}ϸ\]Tf[Š`S¸oø¤E…{ ±á4©„ìI–HZ<ÛâÖšØ;Ž‘ÍPy^ ¤™”{Ìê ®A ¸ÃðÛduãÛâã·©ñùcN+d8wÑ+JQ:I·ós'}`’U\-×RCkÞ Aù¥ÃÇL=aæTDiù¬Å¯=öÒg/>þìñG–¼ž¹ïñN'Ÿb°üíÿö/7~òcÌ>æ[H«îQr&xSF⬄ßÄnûTuÃnxM€$ÍûЃ(YõD'Šc„£¼M*!‹‚¯kR(‡áíO>õÅ'ùèõÏì¹wú¸)ïé£&QiN~Ö!5#Ë÷íÝ1Þ¬þzKhinà„ò¸i–Wgå« ߥÛ=à o ÛV¯ç$´JVÞ‡yô]ï}ß;ßóÞ§ž{þÀP"Gë6nR¸eûž¸.¢6‹œ÷vA8K÷Ïþì/þüÏþŠlD¯(nIáJ9c-_†4m&9É’%Ôƒ_»)¦—ðÁ5­±QpÎ8cK;¶î ,ãØ¥hÛ¸øÐŒiüW'2\*®ŽÀÀe‘†ÂY ¦¸ŒbZƒg^|dãå€`¯Ma+ŽM)zîÜ9ü;W8þÙsÑ ÚG`¢m“UYqŽ0ÏIT$¡5«ÖÏ™5Á¼ÅRî|T¬\ •-[¾ZÚ?Ä… ›ZIMð)3fÓãy"–Ð$Žå Ð¥Ò%ËiçÎÄ€$v⺠“3šò“–Ͻn¨6®KðøÿrëH!ÜãWù/þÖÉ{Q¿°²HE–ÔŽêÙ#3?—½'’‰ÿàî½{PŠ$'ôŠå#GÕ4´4Ko…pñTÎÉg;í½Òýà%£tãû?P]Ò `‚S!êyf,!„‹¢w¦I ¼aÃõë¯6¬Å|Ôöcʱ „÷àqEÊ‹Ê^7{á»~òƒ×žýÐãÏ_¿ÿ‘«÷]^;릚Â×­æÀW]U¡1 D¢‰þƒ‡UTÕæ—Tä–fçõê×#»{?‹ŒLÎëÜácÇ_|ç»^yßû!Üs/½ Þî=)üæ+¿nÓ¶5„ÙN—ÀV‡’¼-|)QÍ/}éË¿ýåߣ֫(¯â"xøÐñãÇÎÐö‘{¸"Q(`†#ó ŽHŒˆcð–XR¥"¤éÖ+1~Ún¿­‹ðþËVm°zÙš¥ –mcîÙ¶{׎½2úËÙÌs.ˆÔ‘#Gp‚ <3/Ehšäx#+•½¹N;¶ídÎaÈ‘ ƒÿf¹²Yê ,åöð#ר+Ic$9ŽE¥½zô½«s7Á˜\§ˆ¡žbÑâåð•ÑšÎÁ¦ÍÛ/YADUá™åJ¥ ë#+‘¸kQé’"3:[H$”Ä©Ñ8ïÝwÀ>)¾m‡Z;ìX°-•µ«M„ÙÍ2ܱÃêÉaË¢k°ÆŒ†NàÕUr ’Ãø¹$2Ж-r•Še«VZ˜\³dZI#\’¨ºcƒ¼ÆC$7"„@ê«FÕŽ¨ž=mVu¥(܆Ý{ö©%´º£cʬYÓçÎU¾ˆU’âÔcR™úðctG&Ì%ËŒå2âšQ,šË֬⩼jÃ:‚T+,/žG÷«{:f@˜ïr´†C<åËÎR²zå*#†Ð%yc seU#€j®Øs±M„6Ï5€Š2É?9I„F=+c ß$9¨F†óº#»æþý=ƲhH vøÀ‡~%Àö+Ã>rœ—š¸Œ˜¼po O÷žW?ôÑO|úÝïÿàG>þ©—_yï#?Y”À›¯ØTr KxT78ÇòŠb†K½0U¨‘Í–ÄÉ¢iôºùK;uáãϼóÓÏ¿ûמ}éòµí+×Ѽ%U¾§µWOS4uzÉÆã·^èqè»\¼{שþ»ÎÛõP¯Mz~ìÎ=;öØCñ?ÿ‹,í7nü·ü§}ü£§/>PÕÒ: +gXAa6‘17[.V*ú™SÛ3˜Ü:æÏ¿ã•kO½ûá§?þÌ{ÞýÅÕK—÷ìÙ°rA銤bEG·}l–7ˆb@8hæ|”6r¸ƒ?q@l¥¡)ñÁ\šÒ¾r’‹_çÍ÷rà¦fšI哆I—¹ühÜ ‘öàOTúÖ·°ÿ%Uè²²ÅQŒ(Ì?±©i"Ke%×¹c§ÿþG¾ðއžºöÜ{‡¯Ü×yû}½N?³ôÃ_ù—7þøw~Wî4÷ŠöÁªF /ˆ¥Œu8uؽܬf‘‡Sœ]­>?ñì1Ľ Ê À-hú„Ië,ýÌ{>ø¥÷ìýOpòì¹³îöÅ—^ýðGÞóêlïx÷{ªÝ©úùÉQmݵoÇÞƒQã;¼QÞ.géþýßÿ-¥,û²?òðãûè§¾ù'ßúÖ_ü-‡o1 Î Æâì‡ b)o?úÑO¾øÅ/"gäDnŽA š2sNmCs}s«¤‘¤¥ƒûŒ‘gkùº‹WîØ¼ÂíÞ¹8á()ëM‹¨õ#/¸Bn°â€ ‡nÐd2ׯ8ÙOž4eúÔ»·íÚÆz¶kïŠe+yUêgV:h÷c_çTÂ' œ³ñd"±ä/F”§@ãJöm¢ÜË‘¡‘g ÃM)ôÒ‡‹/]f9⣅¤V”.á4ÍrJTJ3m EÄ †‰Ÿá–íIðßÔÆ_?*É¡…ÉkKÇÆUË–ïß½‡‘<±/v¾S"vÀvëwÐ`(©…Qð¢;yC ÄuÂ03›  Ò2(rÌŸ¢J=§ˆˆ^½:ßzç >fMÙ 6z}SR[xú®Ý3æÌ=×zc®‡‰þÆ(ŒbŠHµPQèeùa¾Û&·“Þà.pø84;m÷3EŠK?ª¬ò.X6Ôüà˜k¸Å±Í·RÄrúâ\çY4…!4ðírFåhŸ¥À É%‰ÍjkèZ5NN¥ùa¥‡p¼“Øá€4Ï‹O|âS¿÷{_ûæ7ÿì•WÞ£ç¼sÉp&LºÜùÿ÷h÷V2œòO“ÄQ ªñÕæ¢ÍWÛ1`røÈkÔ•$9›3ï~õÃÏà·ßûês/½“ »k÷^˜tñ3T”ôí(rR4•é#PêÙ½µEsæm_ÛqxËÎóî}âÜ¥÷\nÓòÕÇ÷’Ök˜¼reE•ó£×7Þ÷bѪ“Vì|òá.çŸétøÚíûžè~/¸Ó¾‡;m9wöñÕ¯|üá/ý«?øÉÿ¡¢dª€ÎŸþýÿxí7ëêSÏ´OŸ¥ª]3rÄò… ÷lÜ*= ½w>þôÙý÷žØwD¦Ê 2SdÛú«¿ú+Y»Â!úQC RpáÙáè $e‡rºNà-Í'”–u€ÍŠcl¦Ì°ÖLNËß½hP"—i@‹:ÏïyÏ{üDkQU•à›¤û*+ÓDt Â…–2)h‘Yœ•ÏeàÞyeÙí³§9||×Òï¸òÜÅ {ñ½ÎÞ¶çì­ë_ùÆÿø—ŸÜøì‡_ŒñÏÿüÏ’§‡Š5bìÜ3S³Ø_Æ?+1ÁÔƒr3³Lu>“!Ôr­äÎmžWÖÖÐ^YA;6m‘ ëê¹û½Çç®\{øüƒk¯Ø¼zCÖÀ!9Æ ìÝû‹ŸûO½ö‘ÜœŒÒ²Bf?<ƒ '#ªkX +ªªϸ­sV7“è¥w½òÂ;Þùò+ïþè'>ùá×>äÞÿ¡“äqœ<'©ÀÇN-€©ŠxMvbn½IœªÚÿÏsšÈ‘¡¶Àï|åkð@½Í~à£üÀÇNŸ:ÿäõçì?ºwÏA±Ì"šyŽÉiÎCK‰~EÞE0@ƒGŒ˜(ƒî¬¹\68’ùfNŸ³wǾªòê«7®YºfÇÆĸÝÛöP6Ô5'ñp)ש(\Gj+Xˆ¢M0Ò!ÀCô€:•‚Ñî9Ógïݾ{kÇ8§bÅœYsÁÉÂù‹’zß)™‰#Ÿv8å¿&¥_ÏIå¶Å+À´vÆÁÎí`fìv\ÍÎý;·ì"eΞ©¶°åyœøÝÎBÒ0±ÞtÌc%£KXW–!îˆ\ HÛ¾u‡ŽMœ0I'áÀŒŽ¥I0ñåúµÇøR 2ã“u>|O¥ `ÌÖÃãÞC‡wmÙ¶lÁ"š_˘øÈ5 ÞŒpPá̹³-­£eqål‚=¤ëÏÊn’3oæÜꊪ溦Žõ‰.—w1¡èÎqâ¦ñÆ ‘Lue#…kh5²Š‹9ä(,‰¥Hü¶GÈeQÌ™Q¶C¾|-U£ê‹+¸pù ¨COQTô¿ ¨c¹º5²¿—”ËC_“_µØ¹|ÕTŒ¬«¬–êЯ–Íž//þˆ¼¢)c'T1cH^QXD" -%jƒèÙãúÉpàròþÏï`†|ð¡¿ú«¿a……|j Ä üU}Þ áä4p(HÄÛ Kbƒv\×('9g3ÅaœIož î™®\»N{IŒ84CŽÁÄRa.LG@.òƒ:’bÊ/Qxuqn¾·6Ûb7qTùÈ cÆòk0æ.\0~Ú䊆ږ‰Sû™Ù8øæ£Ý_ìtðr§OßvúÝ¿Ði×µN;.w=ût·cW†»<`ë‘’½'KÖí¸ï•=ó¡O|õoþ©î[÷ßýÑëÿßÿ¶¿Ò¯G©¤ÈŽòÏœAÖš'Ù/ÜÂ1 "#úÖbŠcº£a¡É¤–´šäüÄ(¹£{QºÀ›€7zK¡¥tMâ¬84³zDÅÀA½òK³óJ  \5´´eĘºÉs‡-^ÑíðÉ—ïÛqü·pãÛß¿qxûnnbn´oîöíÛÂ9H>äy@1„"Ë‹: Ίs(ËÎÏë7d´&„9:!uD:ªU4¥u¼ûÒœB¥Æ‹³r妙‰ÚÌž½v劉ãZ!\QanFÆ0¹–À$i~xvÖÈšÚC†vºåVúÉÇŸzú‰§Ÿ±=öäSöO>û œ=úI²Ý¹û%¸ßŒr/sÒžO¯•û¶Èi‚RüÖoýö×ÿðO˜~ª«ê®=zý÷¿öÇ÷»„ò¥- &ZÄ·Ì˸lå:ƒ² ôÄD¹‡Ha÷Þ}îìÖÍ '¾nÐoàŽÍÛÛÇM\«Äó¬ù«Á̼Ek–­âYÞXÛ°kÇîˆúŒÒð•'¡‚°˜M—Hm•ødÜr‹bÁsÄÜMž¾qåºEspÇž?kž¦¦M™¾~í†E ’RŸIfÅ…Ju7’áïʶIðX‚îyÑ%ÎN·ßz\ܾi[]Õ¨Õ¼–¯^½tåÒù‹ò8–„@;8á@¥¥ODžY3Ñ%맦ŠHóî{<Îây‹:Ölؾqë¤qe·Ý´n#*ÐÜØòfŠ¬Ôˆ=|åêý›¿=w欈ü–YÂÈaÐ&‰‘l$Ï]'0pÚ,Ž’J€ ‚‘Ã+̪Îx?}ê¿ý÷¿’C!e’§—-\:½}ÚÖ ››jÆ4Ž^¹d…^-˜=lë8éšl|àë’HO.þ %#FåèÜ5³gŸªÜ‚¢ÁÃæLl¯¯Q’“9xpîðáyY™‚’&·Od6¯1²6«PPÔˆ!Ùõ…åÜùšGÕ÷ëÓWU &ÝF²ø†gçöT5<¯vh^cné¸ÊºŠœ‚œ¾ƒly}ÖVÓ8º¼:£{ßYùbй¤çedɈÁ ¬ÊY¥4š÷G†ÓáO~òÓ|Ø~ã7>û_þËøôü“`ïWX@ç—T@¥“”0a{ëñp¾²ìE®ªÌ(Çÿ²©ÈOAtãM@ŒCâ þÀ Ü(L‘UÔkUb¨só¸0:pðoþê¯I6¬;gï;÷¥¯ü¶C%#+˜ë’ØðÁ™ŽCÚf Û~ø®ƒ—:í»Úiÿ<Õé¾W:{ê–sŒL÷wÚqßm;/ 8òXÎÞûG­Þ5{Óž¹;Ÿyõµÿöí>põqùò³2²½#¼ !BzÉûÏ_øÒ—¾$?_ãèV‘ÿøÇ?ð°ŸDL)T¡°¹·INÂ5ÓAYyÂÈ 4À’ ¼ x …"¿ ³\8ׄ¹Ž<äâÇ{ŒäD»@{ÿ /PQZ¶pŒt%!„à•#ƒ³3މЇóƒm>!Ã…àŸÌáY¢Ñ‡ í?tX¿ì‚œ¡ƒ‡µŒÔ;ûƒö·žxªÓñv}ê±à:þ?n©¨“Ô—}SfÍ9R­»¦ƒú°l™™Ãﺫ³$aîEß>ŒK,>eðïKgôJÞ ìl~iq÷¾½…ç9–9O²ýë?ý‘“ÇOR½íóŸúW^|È Ð?'cxÿÞ½h) r²s†YJol+,.À*D‡Ø2¿ÝwQ“DEI!yô„t”çBi Ø œ“!ÆA8©)M¶˜~po‹hýW¾ò»úÍoÑ×9ÚŧŸzáÊC×vï: 0îâý—¹SŠ‡ë‘ˆàýh°Q´ÿþßÿñĉ‘S,¡×8‹ í“GŽ%€ P^*|²éÀ®}ù%s&Ë_7vòè cå~7it}óˆârþãV,†.H$DdÜ–´”šÅ.a -ìÈÙÁµÁo'4´ÎmŸ1º¶qb˸±M­ãšÇÈê½vÅšImí ¤1 Š{ã`)¶Œ€.Ë´^ˆ&@4‰: ç,e%’é˜^µªP]¯,aÄ&ø tu‰„hça1’¡qùRj L––êIÃÈÚ MÉ^›€ÜcŽnh½‰J-U3V­¯$úlCÁF&™a¥kéÜÙ²§*”B"IUW×HÊ™Ü2¶½y [tõˆ‘ÊK ©Ñ+ý!0·oÿ{bÌøåóF‘™šŠRUÞÚ£kw¾”úc„Û['L=Þ3ÖTT«‰cÛZšFs)c#“Á¬–ñOž:ÿâý½üà#/^º:LÛLãYSwåÔÙOyÇõ§ùü‰½çO™Ñ0²Z^(L4þ‰¿µ·FúŒ1dý‡ºúÈ#×d‘¦ ædô©OýÆNNe2S\Hr(´‹,Ji`ƒg¾ >²Â…sаL'l£«$É•÷A÷´:Œ@¤¿ÊÉuŒ2Zq\~8 ±ÔNš>U:ʬ¼\!ªÊÌáƒú·–æ@"º`…0w½vËÉç:ºÓéç;}ì¶Ot>öX—½Wú}º÷žÇ¬?³ôÂ/î+¯~é¦-_? «8#·xà€a%ùÅù™¹Ò€Ñ¶U¦_±õcÇŒŸ6•R!н¡éá“••Õød $ý–ÌY<¿ ˜‘ ÄhÞu@Nø}ø„r2¼ùÉ@ŽC’KiÿWR˜öÄ5«×ÞÒ‹LÊðISdGDœl ¥ß2m¸†,¥c„*ûp3IëEß”Œ“ô1}+Ê‹‡ @rÕW1¬,¯°¾i߉>v:qìŽ#ÇÏ~ò÷”ÎûÊçÿ ³ÏÐÒ‚nP×ÉÅ sró2kjGÊhR’߯/"N*»!¼$Ã1ÂætÀCÑLÒ!Îäì%²a =ø±cÇŒÙä íF£M‘VÔ‹öóaƒ–“ ËJ Ý¢¼¢ØHç ¦´ô®á8wé¡+s/?ÄÁÄy{çÁÞ™óî»ô„39ÍFÌ–©øvA8ìpT@MÛ¥RµiæìÜÁ"t„§ Øc<#Ã!@ ÈH¶Ÿôè{®=ýþ‡®¿zñ±có×Î)kØ2}á¹-{_ºpõùÓ¼çÇ.n;°iò¼IÅÕ{¬zÿÃO½ó¡Ç_~è±k§/,Ÿ6GSðR¥Z„–GÂäÙLR9¦¥:ÛqðàaQqŽÉpºÿ+¹·’áxš€4è}{ðÁ1ñ¡4GBŒê]¦’M‹àöÊl\xÞܲ³¼/çq$PP¼ï·(/Ÿ_M".—ÅEÕU#‡  ‰IŠÃ3YRU]ž“—IäiÂI†%f6Éé/^:q†”†…ºrο{d8ñpæx³œ&o‹¬]èÅW¿úûŸû칇°WñœrÓ­˜:{ɤéãªë³ aüÈ2L²g*ÊÝx]ø¯}>Š”“x[ŠéûÜ ÒŽG•WyÀŽ%«O™½iÉêm+ÖW”WWH³FŠå’“è…òÓ¥ãÚغïäªM6ï¾ËžŽÉ³—›<±¼úúé WwÙ°eײիgÌY;wÁ¨‚âõ3æ]Þ´ÿôâŽ# ×Zº~eû¬Ùc& ˜}ã{?|ã;?˜Ø8úè–]÷nØ./Û÷oŸ0gz^•Ê »ç­8¶jóÅ-ûïëØ}dÉú¥ms*›wÏYNÎÛ·dí±uÛö¯ìX0¶}lEM¼Ã½’ÒðôÞ øîÈr Û._¾òÀ—Ïž½«*ïžÏ~öó¿* \Ü÷—#\4’A¸PKFž@.pœàßÅËlNônqùHYñ~ Â7pÁa'Áƒ”QGV§Ü²â¬â‚Ì¢|1'¨'O„Ä¢ 0¿$7³bðÀ’ý²‡ô.(í?fÖÐU;{ï;ÓõȹÎûNôÛºpï™[yÏo¾ïëÿzôú§;g¶ ¬ÓuxQçA9ƒ Fä•×dç•*|H“˜š‚¢œìŒ¼UR‡äå/, /KE¼% Õð(IåL·m#Š) r\\’SRšx]0‡¡õ–6¼:7áýq3ÂÈÎ… 2‚’ !„ÄŒŒÐdþâ¿èö' +T#é"?‡p‰Ž2+“¿hÊ×pÆP¨›ã1‹{–´ Ü|ô–ý§n=}¶ÿÑ#ð/?Ð`ùì•Eà *ËÄ•W¤g°y.AíEÅÙÕ5eÃ3Qð÷îÝ3¨ žbDh)„“u4…pÞšw$§—aŒ5{|aŽó •fbdÍ/`À.-,¢ìñ*³2‡<0A¸’ü¬ì¡¥eœ(³ /·¶c#<l í+WœaH»ÿÁË¢âL‚s÷?ø6E8ìð׿þÇd¸HûK')Y1Nþeɱü áøhð¥$Ãáb‚}¾ÿþûQjð†òÒ+Ò™Ð2wéÞ-4o(²Œ>»7meA>¶í]O<óÅ~ò³øè'ßóCÛvñDؼr-&Åt ª!RŠÞœÃ瘼pâÀesgή|Ç£Oê½þì^{ד/¬^°ŒÆ±¢qñàrrøðQÚÈ@8‘d¹xrÓ€– 0v½³s¯»ï¡ý[1wáî ›?ý¾}áCÿü>öÁg^Ú°p™ì±ðUd„Û±cçGIΜMœ{0hPö/xyæÐñ½ò½úø+xæò5¼gÃ6òecM=-eÀUlDððU±°9z;«Ppgçn]îbmîÝùîm+Ö~èÙ—磟þä‹ïyïcÏÐ Ù™1~RÁð,×à'BKùÝÿ7¿Xa™¯1¤úb´µ#Suïž}Øÿ”[WnxùÚÓ/^½þÚ‹ï}áÊ*`1'iÓg2\ªèûñeUG–­Ù;é¶YóWŽ›Ôœ]0:·¨9·p§\RÓfî&9-^:oìø¹ Ë Ï\=eÖþù«öÎXºwîŠís—MÕÒ\Z)½Sä4¡SÝ(@}âôUm3 ÙööùËÚ–nï˜6_ÆÞ³—nŸµdÕ˜©3*¦•ÕÍ®lÞ·põÚöÙ‡WmÚ¶`Å´:9Þ«ZGÖöëÙ׃pÞ dT­#Ã9x¼|X¹É°Ì%"èåö¯äóVw„2èìù@¸àâ8»P ÅA£8Øê°ù ÷ÎÈɧ¥”Ó$e¾ù_d¸7…›ŒLð&MF’œ£° 7µ1¹‘äÌs*™¤œç”ŸC°ëW‘;´¦¢¸¢&¯ zPióÀñ³†nØš}ähïõm—zò«üü~oÝ‘Ó=‡åß}Ïàþónë1¤çð‚¡ä¾¼ÒÃrÉ> Ø$¸Âj–D/¤´rqCórYÌžÛ"î-$­°ŽQ¦‘ÞP|>1à-70PNö;hC¢ ¿ð ʹpåO`›Ó`yIÞ á¬Ʋ@oé2l±E€ùÍ÷¦).…prR½ægg”ågæ†äUtÕ>`û™;ÞßùЉ–+« ûíüvñðâÒì²’Bb"†²5¦dÓ!„¾Ââa…Åe¹™»Þ}G¯^=Ð.‚\¢M ppÁÀ7÷ôÉÞRê_ÞfâiY(1?¥âÅ¡ÈjSálòt–ØçåRçTWç甚¾õÎδ”!±Á0±Þ`î½dO-IW)ZÚ½ r©ùöà·— ‡XüÁ|ý¾þͨÅLŒ[¶tµ¬6v8'e9!Þu¿§7%’—áø÷ó 7z<'é†P*¡©IToûdùaïݽ¿<;|M'žÄöÌ…§.^Ùº|Mu^ñêKHâi„“)°mj ÎQW) É(ìs;¶lÑ:qáøi×N]|äôÅkgxôÜ3ÇMSÛ´bþ¾'ìLü*!>K.J —„žŒiÕž‡‰ÃžSm“fNœÌcÚ˜ «f/xôÌý—èÈ©§î{pî¸vi¨[n±H$"ÆQEê ÷˜>úæŽ!z¥5®.e¹E+$Y¾î¡“çŸèñû¼zò‚·‡·ì¦S…„ª7¯×ßÞLÚ*^!©J1CX5åÒ¥” ¢M?q`·žË¦Î¾|øäÃGÏÜ¿óÐó÷_Ó2¡&·xvÛ伡¬tÔ¶* X®TögÃz¦îŽHÛBBnä¥Ô+2ܦek¯_¸òà¡S×NÞ/q›Ö2a|c¢8S˜4ò£Ïhj½´çÀ3g/¼xÿƒ?µyÞÂ9£ÇLYõà‘{/:òÔ±ÊÇ×Ï_0{ì¸Ò¡Ã·MzìèÙ'ï½Oꦋ{Î×ÎQ¥×îzó½øgþ“?sý¾ž8uÿµ#g6´Ï—W±|âŒK×^× O>ºfËê‰3ÇäWœÜ°ã‘C§.ì8xõÈé {0N”þ¬t$K>x3ÇØá x£“d³ÅAè-¿øÅßúÏ©¥„pü°#/WÀ[Èm?‡piC„³¹LpR>ý‰qp ¼©1–ÒR†Jíçd$>Q”!‡”l ¾ ¼o–U 1Š—cFAQ‚¢a#j+ŠFUdWUW·6Ï]\¥ÚÆš%yKtÐ_ÙŽNwvî“ѳ_¼¡ò‡J6|pV‘­ÿþê¼€› âLä8îE¥pîÚRèÜ›\FæàÚQ+VÍŸ4ytqiVIYvï>w‡V¤Ba \ZWy³ÄØ–†´¤ÔÀÏêÆ½•–2¢ÅñÜøQ?ÄrU œ‹;¦­qqGÕrr ©ay§”çùgø€’ÊžæõÚ~¾Ï±Ç{l?Úñž÷+¼ð‡_ýü¡yåù#s³” O’ñ2†pEÃ[Z«V¬šÛ>E€ÍàìÜ$?Q·n]-mŒZ á’U)kW Ü›l HKÔ¯ xÛûØk3F/.m´”6©ÑXëèQE´Ïš5qÉ’#+â°ƒú‹å À%$kïf]å™þm„£3€p¦_LË·—–Rm¾”R~3Éò£ª€ Ÿ©BqIòeyôi)Óž&HÌÃ?çƒøryWMûîÝïV­[7©Ð÷í/̈ÜÂIõ-Û–­Ù·nóª™ó·.^¹pâ´I£š÷nÜJ „óµR2¿óêêH”àCf²'î,˜3wí¼¥‹ÛfœÝuxË’5¶c;öS~NQe{γæµIÖÖ~ï½Ç-w²¥l#,ðôÝ¢ÍÌ+bmS{mÓäúÑBÇgNhSS_<$“ %‘t.i¿ºAÆ©&,é¬Ú¼S¢¹¼Ê3V–¦ípŽ; ÏI‘Ž Ž®’r’w¥cžDþðGùFý'ÌK){£ù,(HÉþM-e"ç·K‰0'8IÖ.ñp´”¼%ûŸåà„ •]Ho8§Øü_ÜÕ«UQynYSnACIÿ¢¦Ü‘;7t<ñÜ»8^>sl¯ÂìÛúôéÒÀ-=ï¹gxßîCºæftØýV¸ÊðfCúµMªÈÍÏ‘A8•W23'/;9W’FIiq"ÐÄá"ú-‘á ²¥Ä¬]·ì•÷œEs ²²ÊsTæÚ«ª¦×œU}w^é·ïÚ°u‡ßù'ßúo|÷ê#¤f.Îk•©çÅ_ð1ɨ­+Ûw`óÇ?ùÞ£Çv’ä øm·wêÜå6<š « •É/P<ÑÄÏp3"xò8tÌ'”¯Zbk4ÜIPøLØŠ°•–$x——Ÿ²ßedO›<î‰Ç.>÷Ì•9³¤N†ƒpQ†NÂñ4qðVZJ“Í” „3ëÞF'xößøæ_üù_ó4¡¥„sK¯TÂÉÚEuIŒƒp|)1^áKIŒ{â‰'ÌÂÿ‚Ð#GTVϾI¶SÅ|ï¸åV•5$»†p‹ÛgœÞ}ð¥+=zê<ωjZ•Æž5ºÙDК€³ÂiJƒÆL¥ÐÐR’‘ûî»MGnôSÇ-?íÉs—Ÿ8ûàÓ®>óÀ£s'LeØ[4}.Ž¡˜¶+—¯’ḺH|,Ž˜Û’z"´”p«óm·w½ýÎwÞµváÒi-ãÖÌœÏÍÀtýÄ…÷=üÔ‚ñ“'ŒÃˆïÓ9Mh±©@y@œ£ÉjÙè…zÏÝÝ(!GÔNn`ãŽ'ï{èþýÇ_ºüøÕ{ÏA¸½k·°B¸©“§)¤‚—X%¾!ÒcÓ…¾ºU§^õìÜU’ºwuß¼pùû®=óáÇŸêØyÓG®Í)š?qjþŒ.·ÞáxšhG’Á9KÍ^8¿qtK ~ë­wwîBáÉü‰mäJÃwfûòõ¯<òô;.=öÁÇ^xùâµ9Mmã*ꦙ$ÜB–èÒ¨ÚêÆÚª\•õo¨©lÓR_S)^û„±eEùúôÌÍVYV<¦¹!?kxuEiMEEöÐá$NÞꂾEÈIÿ¯ÿü/<.¦› AnàԲⰞ¼Ê°.då´·ŽãNRYP‚½¨)*ˬIF[ãhYøxægfó¥îv8G†‹2å¸HSÉ‘’$'ràW¢œLßô­´”‚káB ¨É[Ùá•ÑÏN6¦Û»Ü-#%;\ä_¾á’ø­0ƒ¡vÙ©¹l…4’ÔSeE‚íE­%®(‰Þ-‘ð ‹Ê ‹K +‡-+=°sÕóï|àÈ…£ÆUxͽîL²ü¨}×°¾ûÝ™5ô®œ~] ‡ÏÄÏ=Kã 1rà°ò‡zy¹RÝK»•[Ì%"§ $Ëû+ËËI’r½)B&·$Ùås,äWRX”µvý’_¾~ä^‘ R´gôêÓEÞ7ð&-Æ…‹ãÍb\àY"Üü‚º2¤··B8áˆTó;Ù—-´›.ð&rRg ÏQ|ÑÜ+—2sð=õuWo¼ïzÏuÔn¹OÒοýîßM›;¾¤¸"'³¤´DbèpRC«jŠ·ï\û¾WŸ?xxkFVŸ¼‚¡´”·ß‘ä^€¤Ü)=™ÛÅ{Œòx Â¥|vâõ9KÈykõò `Rl( ¯(ñùÒOø+ˆ‡«(-˜5}Âã×îî™Ëóç++Ï0¨/-%.‰8¯öéý^}¼½Âà 1.=?ßF'GÉ×¾ö¿÷»@? Þ‚!ÀÙ˜âäè§·$É›æKiZ`>Â÷â‹/’"cE’G®¡^¢ U¿©“„-óžØ¼zšê@oÉä™g÷o’é=÷ÀÃç/S^½gÝ&.Cpèýú˜tjÂDfªisfq§Þ»™LJ‘õ+WoX¾Š/þĺæ-‹V­"·xÉäÙçw9¼bó‰u;Ú{b∆–â*]厬Æúw~ô£ïüèåUeõ-4š¥¹ÃJFUŽQ6¢hTCUùHNÅ¥…Í­õMÍJg6p ý©d¤â°Ô`Ô¿ªú(¢¦±òÇ?UÞ¯XÝKéÇä–­kjÓÊDÔÜ6®ª©^ŽJ>¦·ÄáS1­¼‚$6¼|„ƒÑMJ @G>¥©ä¼½8›H5ÌðÏ`[lp±ÌA¸~ô59 ÉûUáÜ/A8&ÂàØì;x+;\b„»˜¸œá†dP6ÜÞúQ§¡rrß$ÃA8/šßä2||X¨ÉÏk«È-´•åX áRrFéÁ…ù9L`e½jZûOZX4nJvEQ¯¼;îÌêtϰ®Ão½¥W§Þý» è]–98¿{·ì}’àÅCEC2Hܹj‹å5eùÇJ¾ŸÁ)¼ñŽ.Í(,Ï)á$¯ãÏ$9·L4wv.yùÛZª-™Ù:VþŽ!E%Ãz÷½+òƒ‡Ž$—Ö¦…ª´>6œMÂÁäfEå[é'ã|„6]-nAD¤K‡Ä…â7Ž€¥¬cÆðÜ¡CÒ7èž1£ÅÚû䀵WÖ_xåWÿ櫹#‡‰VÌÍ®àØƒú%[›†ÑL6µŒX°¸}\[ÍÀÁÝíÕ¹ ½ï­ަ=7Úæ!ÿ Âñ·I<6S<Ÿ×ÞÞ܃ºDó[’­÷M…¥ì\¼5¸¼Ì’ÂŒ)íͳg*M>(3«Ï !ýoïrWÈp°±Ã…Õíß´Ã MÁQ½¥ ¥äiBVãWá`#œz7 rNB8å§Ùá0&&?DôùrèôÂF’äßVàpÌ Þ_ÆBñ,+VïÛoTIÅ©ӹd÷é¿iÉÊÑ#ª†ÞÓ{ÓŠ5¸˜4ÂÑy2z‘á Š¦bŽjÊtLÒ˜fdH™3oÒŒéÍ掛ÒTVÝ:²nÖø)µE#Іçrý§¥”‘ wýúSÌ’w$ÅêêëpJ½ôéÞó>NýûõA9X–ÏYäX[ʪêòJó˶/^%p“a¦2·Ü*f.­¥œ>W°ûô©³¦ñ½PÙgÁü¹’`1°qÇàKIKY‘]Ô^×Z›UÜT0bvs[uf‘Ó%îb*B¦Ì+Í«iªnÛPßZ7mîÔ)³'—U–äç€:ÈW×\;nÒ%Œ«êFædJÂ;vÒøšÆQIPá˜fPW9ªªwÿ~?½ñ:…§ztÂÎ(’0qZ»l–ÅUå•Í£æ ›:ofay±ª†„k†QÀ»œ–U}ö/lújò ë*âvïÑKH%iW6m‘û65‰" ›Êì*Ø}òS¿ñïÎ3ôÿ (þ’ÌËplq€ 0ÎéÒÈ—¾ ÎO œ¼”·ÜÑ…~2ĸŸC¸Äh”1\5T!Ãq´IQ”™c/ËIR4,¥¢L†E،ڊ²Ê²¢ÌÜüžCKnÏqGqùÝU…}Ç ÏÞ©kNÝ︥÷=ƒ3»öí—կ߰»ºfôè?xh1!C˜ùp†¥Œ¡YCú ìr†%Ç4—[(ò¤$³°<·´´ ±Ã…).p(NVKZʜܡ\þ2³ñ4áˆÑížÄq,ršXõp(|Ò.'éÏ;'7KuiûÜÏíXà´ì€ö%RȆ¼˜ú„KÇ!ùCòÜçÒ/¶¬0'£oNfç‰í.ôÝõXÁŽë¾ç+JŸâËË(ÈåR|6IŽÌªWÂàÈ©@Ž1Œx:<³ONž ýþ»ÜÊ—r"ë†?IØ„›Ž2#‘Þ ïð ûm´óÈ%PšT Æqd¥!ÿñ4©U%Ô¢0oh¾—4øž$ï}æ0î늄–2d¸€7^”ÒRœœSî'Ið%„‹yøë­¥Œe¼{÷î?ÿó?Œ!söV_þÉŸüéïí˜Üáà„£¢äfb#ÕQTNßÞ§÷¼‰wœ’º^õÕW‘é0›qPi º÷èšX3Ó¦ˆ=ݶusÖ°Á­M_ƒúõ­Q&IIeyÉ”‰m³¦MMa³²Ô‚Ñ lQŠ^ËnË5×Ã"mIKÔ‹¨YÃADIE^f®pôzdé±Þ:ápúïÿh)Àɼ‚\¹¨zö¾‡ûrF&tS}°o¿¾½W-[ÚP[SY.D§°ÏÞ² Ðó(lJíÆ«…fC ±Ox 2BÎS­Y:fÁØST"МåÔç2#ðEÌ2 ÞÂOI©ôWÒà’N`2þ© RòÊáI4tøU’wW,[Žâ+©¬–ºÂMceME~ÑèúF¦)üi*î¼ã¶¦¦&/ÕbEŒoÃY´¶´6Ι;cÞüY‹—Ìß°!IdœèñV¬ö„¾E"fáÞò›TBç’ ùVä7ᑘ å¯WVU_]RVÈÊR3ªrôªæ2±Xu 5&ŽXªÆz%‰®ª¼>ÉtYëJ—•–—Ø«">eÚ¤aCßH•@ml®S½|D‰6[Ç6‹°w #A¦"È#ªJ«kG SÕšrŽ„‡A¼k9VXÝp$#*ûr×=Ý…ø••/[%ÕŒÄ5+-[î`%«Î*UŒWÚâ7>ó£×“¸À_2½ÿ8Èý’úp°Š á™Íšâ 9ƒÔ èÔoh¥Ûzï»ÜÿнW}íþ»¢'<~ï!]¥æ<Þ8IÜì.Hœ3‚îêzZ—•Í•DÕ§î=zУ$˜êŽînïvÞˆOÜ4 ô‡€¾Á"Ámᇒx]¦F/ìv?ç^NF@½¡Ao< ìk<ÅÑa&ð‚ôÌr|˘ Åe)ôf”ÿJ²B›IøÀÕk@.ÍiÉ$—NÙõï[Jþãké?ÒÂÿ.Â}í«_ÿˆp|/âW¾òy§lDœQÚÛ'"…MÍu+V.Y»nåºõ«ÚÛ·_Ïæ–z¤ º¡±vÁÂ9œ‰]6yò$œ¦÷ÒK/!y! †Ë"$ˆœåFèu%O`áёȗÿ¦âŽq22_](ߨ°£¥D1‰ƒK–.ÝÚ :RÌéì9ŠÆÍ[µZ®G‰Å*ä477RrÚ$¢E>e2ý¡è7¹‚8¿8`‡Ó+R5‘6*+“˜6Ζ\Q¼0¾PcjD·MG/ô̓à(µ†FûHfŸÊG^ ;µÉx R§D¥+kÕí­ c‹|¨«·‰SGr??¡uÌØfãÙ:†DT=~Âhcî¦J.ð6¤‘VFä{drax‹,ÆÂÞ Žœý1¯ð›ÂT1%ªOµŽiêØ¸vÏÞ»÷¨ ¾Ú@mNª–nØ´yýÎ][á¨3={u<¤¿ë¥oðCéa¼ÜïÿàÛÿò¯ÿè|žww»l„½ú­I-‰M«V/Þ´YkÆ‚Uj 8¹|Åbɺ“Ì´©eáI÷ŠJäÙëÒ½{¯Ô`^¶fÒ©KV­Z´b…ýŠuëü»xåJûæ3T¾ÿ NÄ7Ê‚¾³HÓeï )-.’ÒUtT×1ä¶_Ž/%©,À ¶¡)þ•éf„ ue˜Ë<Ž­Ç6ŽÀêéާp|QqiR>¾¡ÁÂ?™™&R°P|˜„>x)s&ª©9ðoðU~å¤÷ kŒn§‚¸¬Aßbæ´¦™ÆFqBå£FYh#èFä"±<ý‹[0aœ¯#mžùi apNŠC%e|ÆM0Ç|¥M3ÓÇãØ¬Ö œœƒP‹“濽ãÐd8v`eEz<ç­Žp4‹ó.K¿µ@¹â ¶5òù¸&n·ómèHR¬v{hJ(ßF•g4åÀž‹œdxó'L›?yú”™í£&µ–Œ›0¨}^î‘+N\Ï>þä˜S×ÿûõ_ÿë¨q£&Í™0‰å¤®‘µØj6’.évŒ¶“Ñ[ÍFL‘3n£]ÕÏàƒ=]ô3¥ÀH>Þ]|å­yƒ^®OFp¼åHƒîzÄLðÕè1­ê©¤£Z¶É|3ë"Ûd \HrGOœ6 CÈc¦ãl’v€‚pršà—ÿÝ:ÿ_îçŽkIáè*Å0ÎIÉOKIsÎÖŠ8ã¾ùÍo’Há"ÃÖùóçØgmx/lÉ|Ž–/_J»€üY6h è+ #>‘õˆ:‚`N¾¡Dü­àÄ,AÖ}#tÌTÀÁasúØ(A¯) üË= Gófáñ/—Ò ÂYDšª®±oÿγçN<üȃd”±ãZ’€•{ºXˆubÏ˱|ð_ù×7¾òû¿_ÝV7~ö¸IãZåš1%)ì죟€Ï î®}-‡'þîú‰ëLM}"EF–à¢ÛÓ‘­Ð1D ŽÁ'TGAc£ú¹“rÒâ¨Ô 4L'Ó ªÑà¨Ì±›Î$ôoD§Dú~{Ép¢¾ú{H†Shæ­Ž/e œ ,×â?üÃ??‚-ò:Ñë'žxìÊ•ËÛ¶mñ¦pWB·U”!Ì‘ÈsæÌŽ1$ÒIô¸eË&Ê·tÄ÷k¯½ábºxÁO?ý4©œÄ´ð•Q`ŒrR ™’lr[˜Ø¸HÅ!ªm’ œâJŽWM‰/4™-\gßñΞyö:…ŽHó ëÝ z§€“øEÐшg± h L ~ðƒJÄ÷g†‘ÉÿÄ'>!ŸºcÚÉ¢iÂÑ£ê¡cS™ÏgRÛ°¬L´x°iÚŒukå{rsTƒ×¯_Ç;Þ¡©X¨øo<¸‘´wR›tŒ¤1‹Pz¤Lzp¯ëÿ„¶1K—-|îù§>öÚ‡Î_8¢¬.A–ñß(¥"î¤#g¡«$  xež&A>RéþØ< ε‰Vkœ#j/X0ïàÁý„Ü9dÕ`˜ álÞ£3)Êøº“¾x-¬^½’8hÌܳwßNúÏcÇ“êH„{÷î^¿~-ŽCîTxlý”/û×áh)¡—´&6Ü4rƒô @¡DBeBts2ì%=úDø¶@›ó‘'0¬#éÏÏáÄMß¼yx³•=Ð%1áfÿýï'ø(’žE7¡Z‚mßýÞ¿R€Ëò³íÍ[üÙŸýYýð‡ vþßš@J±«q&°-T÷±:nêÛ›?Â¥á0®¼téÒ§?ýi ó½ï}ïûßÿ~~>üû¾÷½ÏÁÇ>ö1e™?ó™Ï|ä#ùèG?jÿòË/;é‚w¾óö~ë'þð‡üà«øÔG_û×>ñêûÞÿ¡Oæê‡?=ÿá熟¼ÒeÛé¼íÞùÇÿôO?¾ñ‰ßüü«_~íC_üÈÙ÷ ÎtâèÑ£r91Ò_»v}!‘¥FÆ"‡:9 ËI ÙèCdö¾õ¯}Hf8]?tàdü‹n8«‡v\¥ô­ót´”Xa LE†åLÛØb^Â…8d8I½í|¥…ÌËQûà½.âá ’@8.”i1.d8µá"ÎOþþïÿž7 ú›./€x=ôЃ÷Ýw¿"± µe¦~êÔÉ‘nœnŠ“Ä@CB2@àh “õòÆæ®÷ Q´föïßÿÈ#À9 çíz£jA!СŸDú)')^èßd‚FÄ™šØáä0T¬Ü€0ÅÁ;}æø¹ûN]{ì*ÑÂÛˆ¾a‡ƒ"¦”¥Ô _é‚púq­¨÷öŒ€GÎ|PG¦&k0 }#Ë‘.*ùbÄLJ)´Ž©áJäÔà+aé… ®\¹" ú×ϤCoc=[ŠïÔ1NL¤‘OÉpˆ×O¾÷½ïàÚ&Že\¼ïüé'Ÿzìð‘ý®CFQIÀ5V`”à}’!ò˜†+¨HÊÐõî»ïâ÷ç p92ý$xƒF„­E‹ØTÄó jÌé ")ËÂÝÖ©õèÛßþWV†TéG)‹i¡)H)# fØ›;o&;(äó¬:OŒ…ʧ˜’0„û®¥ü÷ÙÆßŠæþo+îÐáĪ/ϲâpèH”ˆCe¢ÚBƒ¡>aqàkluØç‚T¶-Yº|×î½,KÀ”3[솱DÿæÇ·\‘Ÿ}öÙ«W¯:ö+:v ógŸ}þÂ…‹¼‹%ö|ì±'´pþüy×X¤Ô-¬ôøV–¢ƒqÒ0>þøãžÚSáõí£>êØ@áY}ø‘Î?øè3ïÜýø‹-§®ô9t¾ÿáKëî çï{èó/=ÚqlûÚ¥‹ed9êŒvhw*°D b‡æABתÿ8]âÙ=HX^j§0ø¡ÿqTIî·”CSÂ0¥Ê0…sSZWÅxUk:tì”èÌÈá2ýZf^ŽåúÿÜÓäçN5¸4±Æñ®0ázõìwsN“¿üË¿Œ´¿F_™w|øða0@°óæ°ØsB)ÍWQ$T‚ËœFÓ#x%೟ý¬©Q¼`¿¢ŸäÊÁ»ÄkŽ8k7B¯±D|’éµgºJ€G¦DÁgÍšäžWÈIRKJ^¶ÚNžº—ˆÃÆjMÁ —É¢ÀUÓ>Ü/M,€”"¸£pyVK¸™˜yú|^H~ÎEÊL`Ï}ƒlˆËf쌕¯AË,ŽÝ%áÉ1­Ã‰Æsa¡`’4yùr ä¨ICMOÉ©{€ÑÇR*:F†ýPx¦>¯³4ŠDn |CØ·< ÁQG.ÕŸ±Jj• ÏésaxÌ$§ÉO^ÿîw¿ʼnÂ=,bÝäë§wGÂóÊœØôÆ^Y$˜ðUX"õÇ«‰Y‡Ö¤ëãu[·D:fcÎ,UÆ+ˆjŸö•xm&À6gMž°1$•P½»[wîò¢VÊÔµrõò«Dد^³Î¿bì?õéÏDaâ_Õç—h)$Ô…úèf„ êcKÔ˜÷?xéJâŠBEyõÚö‰ròõÞ579˜_W†[³b‘ áÞBÁd-¯)²;àͶfíz"ÝÚu}ÛìµOü»×äÿ+b_yLVáJ­µšÍ„ÅÄ·¡ü çRW:Ä5»bL ½3X+ËÍøXS8ÇÌêÒZ,Ù°lÑêãFϬ³¤`Ý‘AûîëuäìÀ-û_ûæc–ôRf-_иxÊè“—Ï›?c´²Æ+¢,s$PZžŒ8•ÛuìIÁ¶!5ž1`ÏúÄWP߀®¤W }ÁˆŒˆ´,Æ6FÆe!‡¹ÎcF…eú6yL0ûˆK uwzáøRƬKbT.?œ <ðPøž<ñôs¡3øw¯¦_'„û£?úÆï|åk¤·¹sRKFaÀ9–¹4Â…§ · Sîßø$¤ÕXªàÅâã…A5óA'— âVcëÐÁÅ̈é áPÀ°¾ºRS˜D • ΉG£a <  Gm‚|#å+¨e>ýéÏ ›°Á<0u(Ã鱩ȺtIô×Ñ _¹€HD¡7vL›ú®*'h-ÖO^û~ËÏ…ý#|Ÿw ±°˜£?.XIj$÷M¢¯[ÇÊ;mNŠ=7i_Á’ЩiÄzvÖ¸A5:OšXGŒ³$ppn„ßÄf ‡«ÈÊÌkiûsGl dÂeïÛ·çС,^[·n–uzëV†ËÞQôÄÈ€X gC`^”^ „ 73ìÉ—î«{ZöÖB¥£ŽÁ¼—Î/I¶èTv{£á|8ø*J@8Р_¡D^“„ZÈ(é–"Þox”¹EÜ9@;$¬’`B~}Ñ߀~rÑâ¥6PðHróæ/\µzí‡>üQZÊÄ€ð+úü›÷­¿úË4Â}3ÂEü@œ 0KˆŽà$Dç꣮ äFf’ÚQõá\€,F&ÿ¢q‘Î*«ƒ•tœV;@ ¼·º2?1£Àã(§Yªc¸¥è¶¨aa©Bh’Zš¹Ãm*\øwê´I‚ËÍ+ºJÀaŽy_X:ï‹u€jC‰«+/KÔò/”Õ+¡|óñ+½ÒùÈ!©'T ½¸8rS¥PÄeñ˜- |ûUp“1àhBð^iu_h;CAêÙ€Bg@ ¢Â\hSCß&€âŠ’AyCòGT—´*ŸV°ý¾‡ì¾çxáÞ£*æð}‘®oÖÀAU…ƒKrʤ2¼¥¡1ž%T ¡Cv£à? ”g‰¢éä™q»Tbå$™óœ ~ÅWѦáÒÉÀoTÑOê2Xn(ÐXüGHl@ÆÒRš6!¢k³+/,s´”q&™o[„#dÂA22œ¬]!ÀENž&d;H ó2Ž,$’¯ýë^$ºï5„  {Âבþu#Óª\Ô&ÒÒì¹ %‹„”ã=agÂcЧžËt‰àèl¸‡/†K•–lÚ¡Í>„m²{Á<ºÁü“úÀ±"Ī<ˆb2‘<]DV ºášöIÓÀ9éMé»ùóC8L!:á̧áÂeRWèßÈ7í£'BŽ&·O—ðFjD~jBauU1l¨oijl5niÉdM¯pK1•"+–:`0£hìѬÔy?C¸Û6¥e¸¨qeº{.Ç Ü? £Í®xž×« ÷(ZJÀÒ§aô ^+± DOÇ~K m°¦´ìL¼D£°Š`òàx|å…º˜Z ‚úA4¼JÃË÷f›9#‘#ÝeÔ+-‡îÚ›Ö²—E8ðXæq‹€ÿÀ4Ø„hÔŸÒÔ¾)Îþs7ÛáÒwO#²’&4 °ÿÂõyíz„žÆ¼@8¹œl–Ši- £aã ?g1¬6›Tö¬Ätjz ˜Q7”¨C“!õ†Ä ’N‰ì8¨ÜZòúôí×C¥›aÃÊûö"Ã=·X¶Q¿ @"„­Ú[•# I£ÖÊò- d7‰¤K¨ëÁ1ä*óU”'kœ ¯Bk3<Ch c¬ÜXqž.†ãe:Yeþ›íy1‘x(~~‘Ìù4.ÆÉä¹ÊŠ3‹3 ªFæ—Ž¿5sìàÍç{î»Ôsë‘U/¾ç_DÂ}ë¯ûê—UžWÒT=Ln4Šúì5»µx¬·©±ÍÑxxÀR<¯¸Pã܆Æ"Ö¾ã°ä7oáF™þE|4?I7Šèx¡.󀴔ǎŸ6‘Ì·H_áL$ÿ¦ÑÎÔ¢*¿y¾ ÁL1S¡o#Î*¥¥üÝßù}>“Ž ·xQR"néù­ÔH´”­£ÇËKIù±bUÿîïþ.B‚Ñ›” o?«æ$4¥•ƒ*¹½ %ž=2‡°òz@—24~½ˆuØ™IágeƘñ¡ÝBñ5«qÄ}DpÑS·@ ÑMø„"£ƒÈŸuhc»"Z®a]ûY¬I+>Ô¡ìĶ)‰„Šþ‚%{¿‚^NOxL È Ž0jëEòh¸}"ße¥#!œÁ™7w"îX›5Õõ®^Ôöì ˆÖ)j <š§6bÚŒnGe¡5B¡»GªOf-Ã¥‡Š,k\~[r,„ {â®Ø:Ü5>!4'Y7û÷—Þ ,si@Œ¶ ãæy±Î 2òpFÏÐ ï ºÆ`¢\Þ£óþ5Ôñ¾¼÷tøAŒ¿_Y˜ï´ƒãñ­i„Ì áB¶V^Ân›a18ðæC@/ õµ=Å«|¤cW=1ÃQ.Çæ‰báxŠzÅ|Öå÷s±b7#\›€1ÇÒ–&@qÄH¸7­T)œ¼Ãƒ¦ªºV†²Ü2[¼ÙÈZBV=òzøXwH¤¤Ü¤rY¤§‚‘àJÉ^b™ËyÌÊJÛ䣑•FÅAƒûʯاo÷ú†ÊAƒ{ •ADˆÐF·ý³ifþZ¼V³‹ çÀfÁZžA zã„„Ø\]CÊiyDÈsÁ–æT•:!Êø-RXAp´ƒŸ¦`Œ\VápaíD}¬@*åq?gŒ†kÜÚM›_ä‹rtÉ5½ºËhÒK¾¬âñýšWe~ªï½u[»ëêï~ýüäWßó®Ì‚ŒžCúÜѳ«ò[}{öPCÂ-¦MÞ1:J{°ä$D@x",»ÀÅ!ÑÔ#DÞûÀû#áBhŒt£!æÂiž&´”áÊt3ÂÅÄ 6Ë܃p驈 bš½NNµdíBñ!Ü‚ùpN¡¸Uìpˆµ89ò;œ„=D³ QûÍßüMº5DÙ'{„"µÔ_ ⚈¶"‹¶@8hd*§£X ³Us³w‰¾{ë¦i¤ atÍœ¡“ Í5 ’Kß"‚¯¾úA²EÊõ¿‘"Z˜=ä ’BQ&´/Š Ë€÷”É3=æ˜Ö6¢õ&Y*âáôGæe?¼ &œ•¬)°¤)ÝÖ7C†#º”"߯MƒD7)$$‚‘N¢nT“kÀ›ÊÜH 5œµL§>#lÓž&èšo©1Á`ÈÏ+Ñ·‚üÒ7ޏ›Òα·EÒ‡‡˜~ê?€!7““Ð#£ÄäfÎ¥*r¹Á4†~ΖŽuÈrd8oÐÅ!ð¹À†RÁì >D·x#. Çã0mêì¶ S”aš3›0·Ò'QZ2B7  VÀ¹8<‚ )àžÇ át^'£&<¶×¦ CLòøá” ÷³¨âÿïE¸7³¼ÞŒpTµñ—ß ËÈdHLÀcI3×"ÑIÂh§rš¸Þ¿¡k ïm„ã ª-Ü'èrÈý–0 jY[Ñz¤ÐÉpå€p‰©¦sNž¸±½ût6|ÐÀA}%Q$½õîsOÿ2€öÌ/PDf@Aafÿ=d\s™ë“B¦y|*Œ »#¬ÁÓ ¹”ÅEåx)‹ÝÝÃñ-NûL†¦1”«¡Y Jíbÿz¨OÃI?CÇ"š3.s“I¾éa4«9ñŽ5kª3]»ÌyXåIÞâ2¶ŒÈhg¯ÈH¤Pð•ý$Ò`öÐ÷ž>wõÉÈè_:¾dÙÉŸìqà‘¾kö|îÛ?3¸|ùüÜòœ;zu–ÓØIÔ9 oO94} L ‰SŸu,ò4Y•Î8ö8!O»>ÐÚ5þ ŸÒÁ£ZP8^:ö·L—9ï'1˜!ÄG¨îf;œI/f}Ø€9=…HÕ¥¹4Ì“¸ˆ4ÂQÕ†ø2ØfpãdØ ¯%é·`† áR$)'AP{Ë.ð+¯˜FC;iâ4•vfΘÞfLŸ[9r©®*qj©÷aÊ(ËûTä~=†˜?£¥Ô 6:rðàaÛ‘#÷îÞ½wÿþƒLûöŸüä§ p¿Âptb‘4º:óçßú‹@8Xû€±G2I ˜B¾4_!7L#A\æ d8qÒÐ_Ì¥B/rnæèÍÉ ‘>!:„‹ÜR˜©Rû¥"G°‚/#+ËxK²À¥òâgÈf7dhÿ²òü♽—”ªë–]V® ÃX‰=Nò€©n!¸%jy{A8W¤ Ô9`ÆMášÞ"‘ûœÄêŽB9áiŽ‚‘.çê¿ÕOá„Iìƒî‡6PIÓô„Ê1¼êFèú’* ……!8FYøýbIý ½n¨.æBm}9%c¿ªiÅëï¿}ÓåN[Î×ÜûÐßܸñ/?þ>΂ª¼9ƒjFVÖ”R~f+·çWñ¼ÄÈkAð,ZWÉQgh&àœÃÒÃgÂbéCí …‘ W”HBm¬\ãz—iǘ„xê"ɵGˆ—¢€ ß]3 ü“)8÷VZJ 7#­øÛÂÓÅ-ð'ßøóc÷ž:|èØñc§Ý{úÜÙ‹'ŽŸ=}꼓6пß_^¿R&'kƒ‚:›OV#*‰¦SÍøxÚȼÉ7ü(Ò/¡Kî…E<œàM†äaíÞLÓðå ûT:œ6NyÒ+Ûß@8mE‘Ñ\´õå—ßIϦ'Hm@/@r`E ú¬¨§þ0¿P¼mÚì-›wΟÇÓd¶ž§4rcùRBýá(  Ù+HI$à±ÀôĘT”W¯^µ¡ºª^UôéÓ”ÇYÜP?ÚFö­Ui¦– 7žÔÞl)‡Ï¶ÐËã7#=AXœPÊÃ&~Ì+W곋u¯¨°|ÜXÃõ¿ \ˆƒ‰7yªŸö !7{A|)Œ‡…".³O$ª†¿AÚÍ„ ˜7ô‡Œ+Ä,¡NÞ ¡‘d´§Œõ6É÷6¸ë ²bBwSBF(øÂ³©Þ¯>“eqÎL2«¼¬fÊdóƒã)4Ky‹é½P<õ‚Ä]ˆâWc¼˜xMIáðIŒ›ûÉ“§Oœ8%lùøqñµ§>zìØ î²©ú_ôvó-o–áߌpAwÒ~á‚ÅWÈœ&áHÉáÛ™@8é]ÈpH[ºÂ~ ÐÁˆ+EÇÓðS‘Èõè ™îæè Ž~RjƯìœáD48ɲ%"UWÙÜRÛ¯÷ìÕV{à«}øG¸I…áCµ˜Zœ¡pxG/#Õ³GR¨–0®Ñ¥È†ŒFCûXÝáK©‘p+sePóàí ¸[ø×'î-áÂ)ÃA¼lWÂíCáI}\¨ìŒHƒõÄù(³à¾2J пÎkAûÉÃæ ¾K=îÚYt?ðÌ]{îxå³ßâað­?0èîa%C{ éÝ8¢zTñH.Y…Yê… â9ì^0)¤-œ€¬ßPPy(3Ç){yòÑH ‹3Z ±ÏX^'u5‚+¼G?42úï'ÕŒ ·öUÿx6…~;"š›Æ9B›IYN‚µ „ ÷ËáÀ[L¹ßbúuò¥üÃ?ü#ÕsHo[6ïØ´qÛZéà7nW8³sÇ^òJ䥤¥4$ÔDäÐRÒ•‘RÔ¿”ÝHÁŽÛoK’šÛúõD¦ AGN+BàèC…Óǯ®Kˉ ã&i3î¾;Òu›Ó©P¹±Õ5£Øö8Ô‘á¦MçrÙ8}9`¢rbÈýŒ™³Ÿ~úYék#xÀÇl0cLŽ[nI2w[G¢C20} }¼Ò(;Ьx§?#€/rké€E¾”)¦¬7%ý¡±ÊÌÈãzª0zdž­€­©q ðV7ª¹uô›v8’\ÊRÕŽ"hÍÌœ­6A8ß²cm§[£ìd02kŒ¡Ò7 A"à ÀIrðk¯}‚o˯ßRЇtáNœL4BaW³ZóèO…vh#oF¸‡JÐ7?DGЮ ‚Ü(ç4~#Ú%5 ¿è  ƒLÓmø×œDÁA£‰;vì l™WáO;yˆ$aéŒÄÙ N¾·mÛ7Êk=b¤TË#ø˜¨p+w¨@¡ä*Ì«T`ì¤cŠ=R#M¨ó0SÌ‹hð{„¡2±|t›èñ[ñmXàÂ4å“(@fR ?‘ðŠ4 oÿ†Äò–´^ò…ïh€œ›šù¡ó·”Ü7±üªÙºeÓÉ“ÇaLAQaRÄ;+“ºFj”jJûäÌáɨº;>ÒeófOÉ‘á}îÆ^kOw?ôt¯=?óõTRà™w¾[<¼¬aDkÛØó‡N\8x‚¼;ª¦VéêÊ*%áËV’ ,^¸¹_ºx™:¥£“„Y@n2sw¡â]")jdí$á¦K&"¤OY•Fz:{Ü€G#ϵ4³QÍ56´ úÏð¥$Ѩ4ÅÕºytKum ëWKM-ͧLîÒõ® í“”H]¼|Ùªuk§Íš °É£d5@>3>i’*Ø Õ¨4ß þ­¬ª¯®Q2rÍòµ…ù%@qÕêõ*k,[µ¶mò´Ñã”™›Èi¥~TÓ’ùK#ï $X/n/SÉjĬ0ÇÚð˜á øêM¡}Ò@,Ž^—è #ŠÃÚ —»>…jÕ¦P*Âr5]®—NÛièHðh´ùªÃëS±9¬<äÆÁ0âFÆQœM)í+©ÝÁK/½#¥Ùþ•aÜ¿©¥d‡ ŠFŽ +igîàµC›ó\&ðöùw¼› ç Z’v1 nšmŽ 3Ô<}j"ècè!‡ò* †%ÚI`;•ªÞ™$v~ÈàÐRšc³ç/Úø^ÜÁEÂÝ,ÃkÅÍÄñsÀÚÀd{[h)é|ùô§>Ç;À†=ŸÜÎnfû$ž³HfÎ`á#â+¤EÄX*Wdb‡ 7bPIñb½Ý¤9ÀƒÌ5«;bÓ8ü#0™÷¸3ÞÀ¢SÃS‘Dˆc'1{B ᣆ£êëZÆŽYÛj¯\¹vhíqÛZSâÃÜ… ƶM€p=y½¶¡’Š4ÕPWÏRµsó9H ¡<~ì¸5«V+Oºrùеj˜¯\5wö' ppî.„Ȳ(“q`¾…mºœb <,ýdMuƒ=¨#º1›ÑL¦nü¸ö4Â¥1ÚŠK©{Êá™B·ÜvëmwÜÎY˳ÜuO7EÉ×oÚ¸yû¶yKA8ì'^Uª^¥΂DŽ6"oD òŽ‘`²çÝ=†¶~Õ†ª‘µàdѲ•’ŒÊ¹æ¶N˜¤>Kë˜ nñ¼%© ò7š[½ØF™ì€ôF>ÃÊÐRÂ6˜dC×Èdpû–híá$ƒp83Áü!1S!ç Ù ÂM˜ˆ§Áëh9Žª:lD“ž™µ<Uîæ†Ý3†ÎF±tûhÜ"‘ deð{â‰'I±x¬_Äýr„K[ú ò•[È»RVø~ì“(άy W­ëÿ7çÛßù;\Ræ[­ï7Kè%i@£\|¾j±p) U˜3;œx"(¤94kà€¤8‘×[¨ “Šœ¦Jô%f²Ä46°´Kù¤ðÈíEû°õõí3P˜Ð=ÝzõìÑïÎ;îî×wpŸÞïêÒ}È`EJ“buaUŠ¢kQ».zÿ¦Dέ¨— ÉÐà¹8lráâ“Ù³›Ø!4Ÿ‘{Ú¿¾µcdà_`FdIœAzÜ“=Xo»zâî}{ö6°gÿ¾‡1£ùÛ0ßš¾=Œ^ÿ¤2èÀ¡ýŠ+zlÛÓõ앞‡.ÙñÐ7þ¤¸B¾ºöï=ÀŸòžAÙ=úeï•Sпg¯»ÝÈésXuê%!¼[õ0”O¡°1¿ù}…VÖ'†(F)Æ$^¨ãxÑaÚŒÁ4,ž4œ‰4H<-«h¦Ïžg¥k6ÝìiÎ&p~o/„ÃìcÿÄǃc ES`G8h”F¸¨ñ! -åsÏ=+ â‚mÏÉ.èÒ™÷ã›ZJ¢ÈD.YzÕ‰F°')Òu(–bЩ(7îã”WIüo¿~lTáRï#‚u õcÇëØ´qõÚ5ë6¬gõšØ>i|›üT“OP7|Îì+_%‘’¯©SIoå¥eݻݣ·M‰ouuÇŒn…j•#F®Z±RéphçYÜ=N¨…l‹¤,Ž©dÿ#b§jv1VØÛÍ›¶Sây4IíI;G}çyá„ñ„¿i„¹¬W’‚ë0´P䉛›„«38G†#½o1öbô<„Ó+ìáÍg¸øÝDî†(³Îl9²b„Šç¥%Ë-Ãæ©‹½º£cåúõÜ=ظ‰“ÆŒßPרz \kË8BUDƒ8Ð[òºð óÀ¦ôhüN ÷` ¼Ùó4f¬epæC$Nƒ„€Ã§•c]Yo[7o›;{ÞÞÝûÄK(¡©zͪ øŠ"oLhŸ5æuœä÷ÃÚ÷uAxr†  kü뎎 ÷+TQ¦=Ñþb´„K»´¡ -\NHÂåÄ1%íê#ÙÄK¯¼Oâ®u·0Å9I°ûÎw¿ŠÊ´ Ö](9|Ò¥d~±0327êRº²Ú›©†"†R—#‚PŵŸE¬«Y“h«øC¿5!ÞüWIÅ+RÏ÷æ'Ñö?ü¨—¤Íùg$ãÁ¬nç8zû¨µâB‹ò1[¢Ü]úßøI:SLü%u<—Æ}å_%>ÿùÏêSŸ’¥ÝG&[ÿŠYú¾ðÅ/~ñK_øâï}á·~çó_üÊ—û7¿ø…ÏùK¿ýµßûÄo|úK_þ­/á‹¿û›_ú½ÏÉ·_þü¾ø›_pÁg¿øå/}õOO¾ëµ®;Žt:x_Ÿ}—^ú/?UOào¿ñ·¿ý•/~áw?÷‘ßøø'>ùé¯}þw~ûÓŸ;vrÿ¬>Ûvl>}ú44¦MU,½Èä…Ò•NA7œñ-î32ÿEv¤$‹`Ês-]y 2jFQ‘°‰8N’!¥ÚÅë"Eà)Àô³Ã±ûzÍ[´”¢û¹—Þ ºÌ%f¦Ýl‡ 97[ø^¾½ÎÄûÄ'>õ©O~½¶%gcŠãˆX#|D±DeÑ·?ë@LS™î¢ÄBLkçMá¸Èkç½ £×±a º‰‹'8üV‘:‹¢†ÅDgHä–‘wXkVt&±ˆ—LjЦd8ÇG’iŽ D˜ã qòô)êœac‡›0n|mµ"Çõuµ£šyÔ7¨O·nÍZ–9ÜÜæ›:ÖoX´`ᤶ¤^¢Ç1Ì9å{hõÇ3ÚC_E>@.²Ï`ØÆŽ­ÎyÀíÛvBÂ…wbád¢3n,¬Š‘#z÷íCK[ÏÞ½ Üï„»öìö€À#‰ di3ôïzeö§ +n1¼L!.2¢ý¸ÒðsƒÒ>)"ºn㦠[·Ú! Þn›N( ÁÕþU}Þ áΞ» OÄ¡¥ Âña‹D'¯}úsB”(“©˜\à|ÄÃÙ'Ißÿ­ˆ?'Ãu>#À#jªÅ˜@DçðýŸ°þ†:7óÿW ãuá^CúlIxø“„Èÿäû?øvêLòUêš7 ËÝÌXÜqhôsÎ¥?×ÿt±Ó_|k?çPÏãzµºÄ§*ˆÃ| \N|ÇárXñ¯=òèõG§~cñäUW¹~ÍÂe×yª^yäÉ+WŸºúð“W~ü×_}ðñë§eþ…gºî9y׉{n?õ‰ïÜøÑ7ÞõäKW.»výÒ\zâÉÇ_|ü™«.­êXÙ'£Ïî2äR|Â) ÃŠaöâAQª@8‘*“ù&²c§3g¦¾D²®H!††PÎG€+#Ïu:<²L 6.†y‘3âƒ)·TÏ‘µËDÂ-Y±:L¹P ód¦™uáåD¤óoh¸™Âø½ìp©à¶OÿƧ?^s‡FD7ðfãIž&è5-%ž ÙäæÌ¦S”¢ˆäoçÁ—ò¶[9Á'ZJˆè·»HÛ¶mÝeOž#Ã!XáÙ3XÖàD†7Ž6#<Äh®9.z—È7Å`R>´±lÞºe}LJœ2B†³OüJ&¶Q÷Ý{ü-%xK4-³fó.!Îô¸§;îg€Ò æÁ6ç6ul$Æ-œ¿Âá¼Ü%âÒ¸™0"Jä݈”+´¦ Ñ%±DþáRîéÈ:ÃÂ¥³vd ƒÕ"å>ÏL¨“@Ú¦Û´¬ ÎÓíܽkÇ®¨¿q ™Eúc–¿4ÂÅú§Ñ+ˆKt —”:hö„¶I{÷¨®«¯¨ª†pë6o^»iuY§LUS.A¸‹˜—} 4)M·a˜fE¯‰RÚ“<‘=ðö­÷á^àM(¹ ’ÑK§AVÃ8=FºN6W¾AÞ¾¦€¨©åbÓ5ÄP™ØBigv±ÑRF®QÑu‘“%²|ñmÁæ"&?~=E¬U÷–2ܹû.¢#hG Yú üMBiž&öîåw¿­íØÌîú3ÏS7íØ¹»ëÝ÷ð*ºýŽÎá4Ÿ¦†f‚9`Ó©ô#¹~¢£9Ò„A1Cz0ùJvqTòƒAó:R¥Ý’‹#C±à±Tü˜TJ* £zŽäËŠÅ76×ÔÌG—çž*NE¤N¼Ì¯’à‘¸o¤êãD–©ˆˆHíp²°·ÃðgŽx†ˆr ß±´ þ8\3Â_&üÓn1Áx;†(KÀÒó+ŽT iIDYâêÆÚŠZ–fIapx£[)H’ÔÐÔZSßZ];¶®~\CãèFå‡ê+GOè_?£xËÙgí|ø¾¢“ÿéÿô¯?ÜÐ\W‘ßÜ2¢´2¿¶¾RìÊò²1SÆ•ÕhŸžÔQè€aŒp…ðyñÔJÏ#ÐÛzŒønÇ]~%iï‡ðVPî¶WÚ‡‡jÚ¹42#òÕ§oÿ~êÙi¼p!Üác'Ÿ|ö…HÐ2\j¦VZ7.>È9éšÐ%XCo‹h¤‚/åg?ó4ˆÏø¿ …æbÌ\ìh)ùDT¥CíNÔˆÔ‘M Í…ùE™\¥2²íeóW©¦´¸lͪµ ç/âžmËv{¥Í|5oÎ|Í™¸¡¾€(‘žƒÇ3µ'ÝûfÎe9§4‡ÜŬ²€±Nò@D”=²û•߆C?m§yï9XºxImC˜ù̇Ç{Êâ%Þx5—/_IU䘌5ÍL*ÕhÍkµjÕ;U@G¦©Ó&:¼wÖ쩪 ŒŸ0zì8«gTUuEËèe„Å’©4À3%ü'#— Šáç^ŸEçÓ^Žág˜öZ–‚ Ã'0ÂÝÂÁ2íléd=\:ášÆÂÅÈ}à_º¦hHH‘áO9©ÆÚæúêFS®¾¡¥¸¼Bí»sçïó [×®ë`•[º|ÛêµLj7t`‘oÛ;nïå¬Þ²ãÔ=GÏoûìWÿêÆßû½?Y<±}ż)ÖΙ=âŠÕ ÏŸ##Á¼•‹&¶rgCB¢ò.Ðã©ÛÁSÇ#8Öm6¹Œ»ùã1ÃÅÔ8øqó«p³ŒZBŽc4Â5‰ H¹ÔFÂO·¿ÊÄË&•Ó$t —®€põd8*©HCálp©ÄK1øæiðƒ¾À+Ê „%ˆ¬)>yÒ”ñc'Ìœ>‹ >lcb┯pô¢‹ïضsûÖsfÍ­Qeq…_l´q[>¹i³¥jnÐÛYºn䎇íüŽ]çºï;õØßü„{çKïW1bêèÚ¹Ó[ê›J&´7Žר°ù´…sG45Còñ0ÕƒdüDˆ¤áýè)<‘ 0e.ˆØöð0üÀ0`N­-¢„s©“!‰ÚËÈÏI&ÿHcæ2¯ÒÃ"Ú§ID¡Ì_¼Œ–ò…w¼È@/çÍ4A)¡0OfæÛáÐ ÷ÉO|Œ¡e\"D7pŽHdzŽW„C€å9å>oC –ÙéÕÖÕÖ4´ó]nAk;ÝÚ¯ON £jêÖ­Y Pÿ];vC7²¢Âas¼Ñ ‘’&€Éˆ ð1¡½Ú0/Y Þ=³¤QvR x3·p©L€Î[c¨`¨L<¦Zg .ŽòE„Àí·Þvk§[è*o»åVn‡Ìoöà ÈA2Üô© Xzw´„ÂiJƒnjª™^¡g×ËÛbN’{Õ7YWʃÛC8>cÚ̉&yFj“êÊh—öèÓ¯¯èœÜü¼Ââ¢ÎwuIŒp©àq]Æ}zõ¦VÝ·k·mãºõðØÇZ‚Ö¦;í„ù–]¬£dº›ýú“¤GIÅÜÝ£»0A19ù;÷î!5î9°Ÿ W„6ÁQŨÆ€Þ~øÓŸP3Â3ÊUºD¯˜_%xc(%rѾB&Dn|)$ŸàÀ”rÌ+’]V—~ðƒE™uºÇØÄ•‡ áÂGSì|ú–’¼a#ðáû— ’è¨oÔ ºñ[ x‹8”-©üIÝ2òVx+ñX‰,_FYI)ï 'xÏî=„ €:Ñ„= Ù|E³Eúf^„½‡ §©@8èHs@æ ‹{¡Q‚9|)E|ÛÈpWæ‡Çå×á• ;?‡pÈŠ3p.ø%GEIQ‰‚£tá†`ú…p㥇æ#ŸñqÆ:Š”„:­¸ Of±d8f3øè²P‹¥”~ò+*#3r¦d]âá²²‡Ýdd–ë$#spi™`ï<à'ÒY¾æ¨Ðé˜#If`ŒåˆJËhÜÝ#X;LqA÷QêHÄ¥…@ÇÈYìYbM¹ÀW€0²MÔü °ã¦>¡äLÃdÜ4É'’™“=4?7«8/·¸©yÌàá>÷:p@UqI]ňò¼ÂìaY9¹…= î™Ó©°:c×÷oy°ëöSc}ŠîÏþå_+ŠJ‹ŠFæågôšÑ}hN¯Ìüù%¹9¥%ƒ•ÐÉHŠxdËM'Á›[C©¨'¡Wô°æs w¼²À¿ˆþŽä&Ñÿ8ð8?‹²Oh‹ ÂÁaç‹ÚCá™b’90|„W° Â9~*p +8ª´ Jò@¸P-`¼|û6B¸Ï~ö󴔜#¸Nàëåæˆq)¨[…ÞñJˆx8ùpÐßùÎ÷>ŒøâZ¼ÔÅ µOh›Ö>yÅ’¥K,œ>y YDêÒÍ:Í›¿‡þmÓæc‡ ãõ5µôÍl"QPm:«¡ÐëHP >±`(8 ½¢ÀµûöïݽgÏ®ÝÌlî8kÆLŠGJH¸Å…\áE'Nh£·ÑOÎWŠ`Î\û%‹;hŸ8Iþ?ç]ZJǾÒNønD´c†›RZz:@âŒií1}ô-z•€bëÏÕ8ªnûæ-žîÀž½Ë/ñàógÏi®#FNŸdíJeÉz#1¼-ZØ8º…ŒR1 úN}î¼ýHܧGÏå ïçjB Zß±lÁ"çÖ:`B“áô!­"‹(=«áºtí,LC·Ææ:¥Ã‡Hb´cûÖeKÏœA2›.dóè&~Â7ûÆ `ØøîÞµŸÐæ¼T¬Èl°äd„úæHö¼CIo`Ξ4-@óCVˆÄZìpÜ,©·mÝ-iýdx™].`Ããà2²x •¤GšùRà 5&Hs;b\„(D}8v8_‘áÀêNO“À6tÇ¡q€”poC†ÒKNn7Ëpq=-¥”]à–kâ½£` •µ^xd„™*bP!깄‹îÞõˆc¢Y+b'lR\ª¨™”¤ SV*§q"$3ÚHY+œÌ& ë@5Ç’5§RGå©®An w|žWÀ§ b±Dö¬¨,j®:–£È‘ZÖ¯,êð6tÒ"Šp®ðšñUCþuÒ±½g »@`¡g±â …ž;oU†ëßÐ÷„i*'+7{Xî°Y];w Ì;c8d×ó>½»».{èpðòg -ªè[T>lÊâ^›.ö:òlÖñ+>÷[î¥|ð®N·åôé_JÍ”‘Ówh^ï!9}g Ìú>,S¾ÐÈ]bäÃÁ;@.­7¶BC,&\ÃL¥pà“×Džú *©ñLªë:g„Å'Qq±wà‡Á¾„¶6±Õefð¥ü%‚exZKùØSÏ….T pœwoŽNùÿ­ w3‘ØxÁÁ68—:X‹ü¥«çDm2œÕ&hØÌàœc‰¡† x{§[î¼õ¶®wvîß»ÏÜ™³€ÙÖ›P|{r p²®º¢HiN8ÓÃ!LSD )²u¤œàocgJÖIu ]"KÕ²ÄÖmôx †Á66QnÈd„3¶7Hæ_ XTPØ»g¯ÎwÜù²wpzœ×½øefË3¬`µÌZЮ–wµZ1333K[²-333CâØá”Ò†“¶iÒ¦tÛÞ6m“´ÇN¢ÿwÞc¿w¯»÷¶ÍÓþç3ÍÎûÌ3ÏÌcÖt>rù¹Ö¬VÄvëúõ¬X¼c§OžTW+ëX!„ãøbZH&éè¶­»àWì]ƒ·ÐRîÚ¹,ñÇ ´¼CÉmÐË Ìlùýãx"ЊÕß##Ʊö ܦەþ!½éȉqt¤iÔ•ÄÖTÓΣÆ.øª!\díB@³¹Á/@Ž&=4ƒ‹h-¶uD8N’A Õ¥5¼QØÞÞ‹p;vî–Í„„‘‰€z,^n¨èÆC—åxä¿ "‹'Q,Ðg¢¥™€èû‰c3f§h»gyÀ„3eQYHÙó/8[fåu`[ÙÈ"B…ŸG¨·0¤¶R¢6Eé"Ò‹D­œÐR^¸F˜Üì8=ªùDÁ"â'€‘NÙê»PfT‡¢Ñúú¢óÄÓO?Hlï$&ŽÔ!‰…o`F÷Ëzè=èÒ‹/?÷¼ .ºäÂŒÌÁ#+J:_vQ¯n]»]&I¯ž}ž{yÏÎYzê3~A¯·_¾ïÞËWí¾ý›ßú{Éßï¹=£w¿A—÷Ô½ïp9³o—^,íÄÅg\tñ¥ò–‘ÓÜÈñ´Ýµ/׋ˆÚ iiÌHܯ‡Ñ1–𸉧Â\<®ø5Ô˜é6Ôˆ6‘¢,„]GBí™úRúáä4‰à“9 w”áÌÀà¨áBs`á½B¸Ð¢ÿ·C8ZJñpIÞ÷œB'›pÀS ?ò ÇG["NøÓ'%¹ûõêÍt+¡dúä)!ß øàÍVNqcÚŠòò @8ȰáÚ\óõƒdG²è‘^oK9çž›°•U´y ‰\äØ&mkƒ4ˆ%A áŽK\â ©NZžÒ¡ râää1±…jô“zÓ­Æ‘£ –6Ú±H(À{%jŸ&4 ›¼Á0ª§Z”zþì9öǶ´´“_Ó÷‹Ÿýœ l¬ìS&3l èÞ¾sÁÖ‚F xÞgÍà£8gþÒYóÖ/Y1­}¹hT¾,¼Q‡Å—/ FÈï†0lA"ÅíæÍ¯’¢¼Ü‹Íž4yÉì9cjëfŒŸÀáµ¹¾®¨0Ÿ]9*G ÉÒ%C†ƒpd;i¸ýʇÎÑU:¸e˶;vÉ}̹Œ‰û6"4-<åJ†a@.ìp7l“À,ìpNª—@8®°>™ Çs‡¸LXO¥ûK-Æñ“Þ \˜³ùÙéXþ—òÉp|)ƒ§Žm@„ãBb°:L‡$p¢¿£ýÎ]{zõîKäh B2 su ’ô.¤7€¯· ªDX¨1QÏDM2oú3ñöT#…Ph S~—‡ ÜTV•IPÉ…ÄAÛìlIÑ1Õ‰ «Á8ÊÑZrZ´^20/ËEu… ‰ Ù »Q$f„Uö½ÎȪ°jxI^üTIÐÁ†CŠ Q5|î£j($="¾þ£€@ZÝ—6q½m¢Ë/Øgu@¿ìÜÊØ 6ºwÐ`I#e`7ï¬ü‹ûëUXuQnYβí=vÞ~Á–nØû»o¾õÏ‚gZêaÛˆ¾ÃŠG”–edì>¨s¯!]zìÊ¢/ãk¯I×µuQšô*©1‡=Å{q§~ |rkIÉTu¡0=’Eâ±PÞêPËx&á«5 ‡;‘ô2ŒvQøRò4W¦VG„ãÖd.Ge+@ðU‰:ᾇ8›Ä´üï…páKÉÓ„¥¡nòÃ6¾pL)(SM œµÐ5´Ç ö.#äÀeõšÊ*T¾¾f4lCñ³† Ÿ)cH]½ƒ¶t˜¤œ¼¬l`Þ„ÎÂbNB*÷Íø¼‰,‘ÀÆ" „IÄ/Fýh‡š‘6’ŠÒ–†#€+†sˆ%¥„&ŽÀ?m€ŸöN$ØYÌ›O12­ûcîˆ WÐ\æÏÈJ` &âÐC—B ª%[°0wDVí¨j«´upÒ¸ñ´”\­;Êpô“McÇðf,()NÊ~} —ÖÂܼ†Ñµ|+ÛšÛëš*òŠª JŠFä`@, À‡•Ç=¨È3᱇áÛw5l1í=dÖ°¡ Ó“Ç´UäÔ””–åä6ªn“•²¶¶¬Èû]˜ÊdñÅÈ]âGÍ[ö6 'l,q< „( áÂÝØPo‚ZÊ´/¥®(*Y×"`ÂA2§ÌBD”c’t5C1Á•0ãfcp%p#ñ 5A  Ñd† §Cœ+²üE<܇á@úÛ0ʼn@t!ûÁ\G°í{ÎO»vï…pP€›~wÝÿ0S\šñúo¤¥ìèK ¨”α®æf¸vsx"“ŠßRm&±Eyͨ¿ GÒâ(A?™Dzó~<ólôºW—níÍ­ý{ö./*a´Î<¤$¯ ('O&µøäñè½E]¥¨í ìŒÙårBÈK0ªÕX|H ‹ØDà 5I9™#F*`_EH‡Ít’• ~$'hzé…ÑLòŸLKov¤ìò%€4ZM½qE!ðÁ*_E’ß+ö@p4ƒÉP-² ¤Õ’±S–,hù#²gNžš=t¸[Ë0˜¹{À¨²ò cÆV¬¨*ÙÖØ|š”cýÅi¹¡yíW®),-¡³òŸ¤ªíÕ­ûœ3»^Ò¹03»2¿8k@FVÿÁ•…%}á áèè#¥…'fœô{¶Ü"Ö^=»Îž>eè þyÆ´ÕŽÎ:¤,++)ì]\T’5¢qTey }Þ›?ýÑ[o¾A <“p9iò*ò¢ [ÐξÀ8l;|BÚd+å!BŠrâÊOÙ1„|¼W ]"¥%I ~+®BɉyTd;&œT­ð$/_øÇFÖ®¨-`ŽqTÑ’WK ×Ri†'L…p²v¥Ùÿ+“Áf㈇û¥ÇÎÅOi„£> N´U „Ü °¦ý$ñ[t$Ôø\#ýᛃ) 1 •·œiH ª÷y} -±_z¤çwA¸oàÕÈÍ’RYÃ9Z4Þ’8@ŒœžÃ J éKWL€wAï+á²Â].ï)ÛøÐ!Yªý }¿ˆ@xX„ãÒ&mXÃy$D=¤9DÌÐO&¡µ}ú@²Ð»ZÂçÂYèIød:èÖ1CB•gÚˈ¢‰tYÖÄeÈБ…ÅË.¦Sq_]ºu†pB¶ë«+G”Ÿ½dÔèùe}Kj:6y^öÚýÝwÝvùöëv½þ9UO_û¯[¹xÞäÙÃûæŒ\’Ÿ_54oDqmþìå“gÎ_QPœ—‘Ý¿W¢fôœÃ¯ÄŽ{O;÷ÇCK‰/…dZQ>Ÿo»}¦P9¤Õ¶Z:b.´ dø°Ø—²²}Ï“.ÎÔú¥—@Ú; á˜âbúé¿Â¥e8¾”‘€ŠÀúuœÅ7aÃC‹Å‰IŽJÒŽÂ[]cjI¢Hõ%èoH„Žzöè§VÔða9ªç¤”ŸI=îE\7\ùAã¡”sEG‚Rh´ _‰ˆ° †ª¿À3ìcü䔀ÚøgÈZVwšöÌLœ îÑåòAâÍû÷ïÙUòXµ Ìè+ª¯OÏ.¹#2 ¢Ü@Üòsò*G,Û8tëáž»oì²áÈóOŒp;öíª(̧¢,É,Øsxæðüî}{vpYÁH>;‰ÏwVŸ9‰e¯á…{jx „œŠã¤ ²ÕR3‹{ =¤%¶v¡Úõ¸8ë‚$x§»ÙàZâ!$vÙAÕ”7£Þ‹pÐ+8*[‰rB`úÝýÀ#p~ÿÑüÄ'>EK ápë„¶°ñÛ¼yÓð¶eó2œO%è,© õ‡ISÔ¡àI-ñל ÇOš:fÜòsuî¾júÜgï¸ÿSO¾ðñÇžýØÃOm[¸¢:3ZóØ}’·25ò“Ffþ‘QÛ¢s?-Ÿ·°>»xuûôÏ=òÜo=ñâ§yö£>±tҌ摣ÀçÔñéHQ̤Niiɬys¥ðP g‡U®¬$ews `ƒ²-åÕ‹'ÍØº`ùk=õåW>ù¹Ç_øíÇ^X=eNÓ¨ÑxC2’¡Ÿð.‰ÁX ÑÈìž$ÿnË).ÎiŸtdÓŽÏ=ñâï>ýÊËw>ôØõ··”TÂ*ð zi,Ó!'"¾¥„–¯‹€Ï`w%<ºtíßÛ79ÐåŒó¬ÞôÜ-÷~òþ'?zÛƒŸ~äÙ9mkŠGŽkl‘1”HêîxûÅÏ­‘¨Ì89Y/ï|™U8 yý¨š¼ÁCö®Ùôè ·~ì¾Ç_¹óßzò¥9mueM2{–”Í;û'*sŸ>=ª¸|TNÙОƒÊFÌ*nÝÚ\¥lSqfAÁ°¼†—å†ÊoªiêÝ¥wmYMÙð¼ì¾ƒÈ—¥Yyî®¶rÔÀ½OÿøÍÓ?=Ó£íˆÂÑ™ÕÃòj³…e5”TÌ™8ux¿þCGÈ™4¬ÏgMkßHK[Xê¹ ¡dWfb¯É&dää*}ÙדÖÂETk8gRoÂ92"²{ÿýþ¸°ƒ†º8-:¢>„ »H莀YBVî(RHe‰ŸxrÓR>þÌ j ¨áǯÒñ‡J<œœ&ݺ÷¼<‰ LYA‘KHuX,A+#ŠÆb?bŠ‘?,]Äb;*EäR~Â¥¡žºE(ÃK% ÈNªeYzJqÊÁÄ64Š‘ú\¾S€wÁ¹Ð ð.8Ÿ—J2HëD3„>¢ž.0‘¦<`,]ý'î"¢¡ãñŽáí1µ¡Ê‹ÂÙŽà5µÑ? ¡Ë9ªè'Œâ,ˆýûõìzé…½z+‹sñ¹ ¢®ìÒùœ•ݽ۰ó/tYŸ3:÷ë4¤èÒU[»ì¿²÷ŽcÖíúòéÓK)Ò4~Xï!ýÎï6P¡ .S™´WÏ.j]tí|nÏ Ï.<ä2í!¸ÛP™„iÀ­Ev’D·žŠãŽê6vâϸ ƒÚF·"lÜc(ãQhjɤpNª+?é§ê¡½ã ¯3h ;Ü=ošÚí_þå_"C•/3eOêFW¯3v|¨cjÆd—.«÷ô‰›:rí}‡®¾ïصs[Æ·Ž¬žÔ4 Ž®…¥•K:æ®Þ»öSİÏa~G Ô¯?_©!=ûŽ­¬]2~ÚꉳîÜwü®½ÇoܼïñÃ×-iD.d`3Ÿ°ÀáW&·P>„&0¦fêÛêÆÍ„^qÑÄéVn|èØuºº}בûŽžj)ª˜Ñ:ŽŒX'0Â¥ryšøP•õQUTù—JQ·K.¸°ÛE—BÄ]eO¬Ùvïþ·m½âÚ »'j(Ï)0ªÌƒ/>÷|zÔ„¼¹Ó§ ‚‚Þä˜&øöìޣ˥©:õ–9d(¹¹tDîÚY NnÙsýöwì=vjãîI#k'Œªo¯m¤È•x$J«M®shõŽ›öß¼ïäá5;Ñ^V_=¢äð†Ý'w>±óбíW,š4gþø™yý3g¶L8¾y×±M;nݽsíÆÉ-c›«k‘’$%ý§'—×\»ýæ­§¶î[:a:ŸÑiõÍÛ—,;ºyû¡u›­[,\ÝX94gþØIû×m¹rÇŽ^½cíæñMm £øôé• œßÿõ.¸Ø¦N^Êkn¸eÉŠÕÜ&?Ùw„Ó,Ep‘~´áaä'GœhlŽØwÐbÀ26Ûi&œxüøqçZ$;¶€K]á\mô¦ÅޏOËÞ½»÷íݱuãº+¶í:±ÿØ»:|å‘k®Þ{hÿÉÃûný‡ßË$=´ýÐuNœÚðä¶m^³iëšCWî?p`Ƕu«¯Þ½û–cÇݧÔÏÊ ¶AëÚ1‰÷ŒÄŽJöd`q#Fë¾Ü©}·éÄuÄOn*òW8¨­'gii?ÞŽE'Þx¼\KR©gÑÂ÷C¸Pt´ÃÂñ¥d‡‹yáìüwG8bŽ«wZ†Ã©¤ípf?ŽéOŒggt’PCÏ .º©e„Þwà„Ú¦¾^¶dâôí‹V‚å“fà  Ø›?ajïî ›Œ°O”šÏ‚Ó$Eé0Ê*#£Ù¨â²ö¢ª9UÍ'VmÝ>géæ™‹ö¯Ø0¥¶¹½º¾¶´bÚ„I<Á-ÅÌœì’Êòs.ºàÌóÏ=ë‚óÎeë5$¥/ºø² /îzþÅ5ù%«fÔ¶^±|ÃÞE«·N_xbå–qÅ£l^3¡¥‚CV‹@Le$\ŽZ˜ôX †gF—Mœq`éºÝs—_±xíµÛö7•O3®0;—ÁLÂì§O‚IwûXéEÔLãDOµx`ÏÞÕç-RC?†´eÚ‚-“uØPPV’™C©;¬ß@ž– X&Á_@8Æ<%¡ùtÂö°uã¦{ÐÞ‚üG"\9~Ʋ±S®ÙÚ>²¦¾p$N1"ÍßÔÉ›oÍmšðÌÕw¼tÃ}/^ïcÇnZ3væâú  «ï;têÉkï´>tòæms–¯™4wÔàÜÕçªdãË/¿üÈ#H~ÿðÃ;îÈ3Ï<ã$;/¼ð‚z /¾ø¢ý8ËÖUœbÿ¡‡xå•—ž~æq~cÜqwíÚqèÐQ,F 2+,Q›29©aT^Mžæ1„ôП³Š!Q†CV„ÙDŒ—?#ß^dŠ ØÇ( ;K笨àA_‚­  ²’¡‚*ÆùÊ+¯¸#;nÇbÇ“‰'ðüsϼôÜó¯¾ð±<ÿñÇžøÈ£/}üµoüá7ÿå{Ÿþú_ÿ­Ï<ûôsO?÷ꩇ_<ðÒçzl¼âòlÛ~ü÷?ÿ§§Oÿþß}÷±g?òâ3/½þüËÏ=öÈ+¯¾ðÌÇžyás¯ÜûÊ#¿öìËŸú膭ëÉ]pËKwÝu—g›iP({ Ýpv<wäÞ;цÏZ<œ+ÔÌÁt¹œ¨•¥sâÚ>Û°•D¤]8”býÅóÿŸ \h)CQv¸ð¢4-í$ìrŠ8ýûŒÚ¿I9M~© á„4ñó2%Õ;\:Z€‡¶ h)MY¥¥”ù*|&©[ÇLlk§^[4mVF×^SÆÜpðøõûÜuÕõÖ¹ã&7–V¶n ¥ „ÇHÓ=ê(FKȤ÷¾Ξ[3¢`~Cû݇¯¾ÿä ÷œ¸î–Ã'¦·´sLl]/ÝoI“©”­ÊZms#×|+o Åt’eÜøIJA¶c0›Ò8FyÄÛŸ¼÷ÊënÛüöýǧնÐà™Côoë²~q:*ÐRJ8"Ãpä$c`Ыéù:mZ¸üÉ[îþìS/}â¡§?ýÄ •Ù,|[Ú† ¬)Q]ýô­7MG!’Z˜ê†Z#¼i0¸±öÅY¹;W­ñ¾Gž¸ù.½=zÃísÇL¨È-¬)}|ý19ð§ÇVÞ»ëØ k÷\µlóÛ,®i[Ý ÈDÙ„˜ŸHO®[B„?£Ñ:m"ÄHølQ¢æ¶þœ¶yÓéE^u2aÎà ØÇC°ã¾ûÝÅSO<ûÔ#/<üÐ w=üʭϾöÔ×þø+§ñç§O«ÝmýÎ[§?úçßÝüäë—/ÙÞgË«×=û÷÷W§O?÷»ðÂË{â¡Ç^|ü‰žxô™çŸ¸ç©{o~ê®[ž¹ïÁמyäcϯ߳5cÄðû|ÀCvõO~ò“ÊÔ8q"Š·E{yÀ¶¯Þ~$ÎŽØíû´ùëÇMŸ7ªeJQõ¢ê1»f.YÝ:}Û´ÅÛg.9ªujeKcAU¿òqô¸ä’ÎH'Jðö‡páÛ9Ì2„ ådl!®A82Ü©o]¸tyN{v8Õsο€0æe—w5Ù ¢–N¸Ôð½ ê©eä(ð  (YØÌ^œ¢f©‹VúZ#qd êìû’…¹°0Öìi&8§J•œ¢™%åÒ’É_„/ˆ 첸‰=àêè[@…ã‹k_Úý=| ããMGyû5ü$Óñaá:a›| ï¤m4ÿ¾tžt›ü;H6•<[Û9j 3ðµ›@КÖçhH>àPKÆ’ÖUÚ!Š™Ücš8RŽ)U—SÜ^1šY.gÐPá H‰ô%KV,O’@ªDyú4z¢T\¿žü‡ ‘*}*Áç? ã™BÌÊèÙw`·^­Õu¼9à±þY×ø©ªKÏ :UÝ©Zç¡ØîÃ#²ÏÁQu‚¸qRoæ –Û?ÃCãÞÉê ÂÑ‚‰S§¨nIl­uýžý7í;|÷ñ“÷Ÿ¼nÝŒÙó[ÆÕæäÝ~èÊÛŽ»~ïÁk÷î_9eæÜ1cszõ›×:'ö®Ú¾ïàæ"+qeLª¥`¹Òì?dŠ%P'އ¥=¥@‹䦖ÊVÎ¥IóEoàœÙpÂOŽÇ¬ 5‰Ùâ'.]ºXô÷É«Ž)C}ðà’Á#$0_{›L4 “?Š-Ì.ì,h}¸>†3[5ß¡ðuD»ÃU$ð Y"6@Í­ÏqÂ¥u¢ç 3¿™c¦„3Ódý6ÃïéÞ‡ƒp¡ŸLËpÿ­µ”ŽS¥€_'ª ±ˆEõ§¶€)HÖrÄÆOdš‡!jKK)²›ûþÜé39 "¬ƒû€|=ÝæÊïÍ™Þ\䥌hPL›Í>tòôiFó³Ó?¯U1µ}LeQÁÈüœ¢¬Ì¢¬á£G–6Ž®ª«YUVTQR8¶µatåÈ–ÆÑûöš¦ liUkVɘ’ª‰uÍDgJ†®/tR}KUNaÉЬÖQµU5Ì)JMΚ6=Ô³W}EåØºz*å¶šzb½6yƒ2+òJÚêšKó‹Õ®¬¯n³»#·ß,„»úšÄæÄ6­ ¯¶ŽGƒD3ùÈ“Ïò4Q[Ú9âñpƒ3†Ê(ò3ŠæW"«aP|s;ô.R#ZLd‘NÅtÅBùpTÁŸ1Å™º÷ÝwŸ/È‘p6Ãá–#¨°-” þôÿ˜1-ǯûîÈ;rïÎW¿ðí”öò/|úïþéçôíßýóï~ésðôC^±wÏÄIíÊÍž5mÒ¸ö¹Ó§kIòÙR$_u\K8˜€^7åÓ1ž ÒaÀ‘”Ä­E‹»³¸}•~JÇÒ…ƒ¨ƒSèD?…O&*á×Ðvs ’ÈHñÁ‡Ùc2Æ™x¡Q ÃuÔRþÿž&‰ ÷^„[Ã'/åUW]e¶AŽHç5¦&= 0îŽJP„ŠÔ\‚©%ñV(š½¡D½PYAsÈbç=ùP"Ñ"?"žÏ ˜8o×6 ݧ P€6ÕK…¤Ø5;ðRØ8„ƒ[Èßý˜ pÈpp:¡ˆN’K‘´ƒ3ä11*yL„šEf M¨LÍ]ÌcáÄjvì'íWÉe”ÁO5CÆ. ó NðBúÝ]Qy‡—åkW«SC`rLn"Ð ‚Q¸<º3:]xñET‹Œj2U=å®TÊ\9FM%&ÀÝùεÇn «ˆˆït ¼Þ@cRv\µ¹‹/ÊÌËQ(‡#±f׌&JŠ#¤&/ú0ä¼)3¦ÿäçoýôô[¥#‹JË 2†ô·-.Ékl" —Y[Ç4(žÒ³W—œüLiæë›jºuï\[^ÖV8²¢ÏÐ’~Cë‹Ë¤ë“°þó·’h?'°lxNö€ ±"d r²™ÞGdSjeÑ´)µ^ZX@²dìÄXÿzwë¥^n?^QUXT–S€tþF¸êl)ˆá^øÈk™µíä¬[ð«ó¥:ý}5¾œ˜•ßøYâ®ü÷ÿüWÚ7²¼#XUVܯg7ù!C¯ë½D%mC'K~s†”¦`~r›1‹!¹j:Ë=¢‡®2Þx$¯!Dºg]T³Þ}û¼™H° ™Tï‡pÚD´À›o%)jÿ“=M"’&(;T:°†ÃEЯÿøÇñ+Uˆ8o«§R8~?ã'g¥÷£Ãø“ÏÏŸýÙŸEìNlßoñ#;œ¼”âáäØñÁpái¹çID\$Û=yò¤Äw…û‚KŠˆŒ”!¬@)ßgè©'O‚|«ÞÂU]…—C2X’"»Q¹k.³>tœªÓB:é˜Ic¨+ß[UQõŒÑºèÜA|kdmæïdrH¸!Þ%à$z³ Ãê^[úæ;7p‹šAGq€¥– H'Ñ%2­¨ÍÁøœU—ð’%¥“Ç´‹]Û²r-[—³ê››2 óFÖV¯ßº9)ÆöFbùŠ\É.D­äÑE¤³?çΟØx¢ð†€ò2ݪÖ͘,MŠ–îˆ ÆçÛËõ*-FåDƒ×•Û±/ÒŽúQ63¦@UmºÃ¤o{Hâät£™!‘á ‹óFUTlè° ÍZPH$ ê²²‡ÖŒ®€Ee¥•U¥C2ú7T”7Ž((í6°.«¨:¯xtY… mB&~ú“7(*h©ÀðÒ G×*5oMu•¾¾Ê¼Üìâü< Ã`ÑΉ¥+Ê%§HQˆ –feç 4‡’bÐ%®äKÅ "îÛVF’„ˆoÓïæó¯ú§÷‹‡»æTbó@\Âm$„9T†/¥mˆwއ37¹í‰g_t3$ƒôÖTñkØŒ#È ÝŒðˆVA*òÓGðu„¬ F"õlu‰/AxQÕ(Õ¦Œ ©D(oviIEì ÅØê*’’h‘¦øKMqÊ: CTØœÜNœeÌ0#b¨MTÛS Þ°)0ãW°›o'É<0¿ï°Òý‡õ>bHQiåå}3Ïì_œ9cÓ°-ל³þD§½7w:zo§=·uÚsg§ƒtÚ{Ïùïè´éxçm'†ì9•¹n_Õ–+ö>úÜ«ßúÓ?ú×ÜÿÑÆ-šÙ?oHßÌþ½÷è7°^Z¼ ÎÀý@ Ï0B%›˜ùS/%d5*žO 2p+ð>î4ÞQõ;Zæ´Ô•…è7Ö¸4Ô¹4ÚT4­ÌË¡*Pã[Ö.SHä%…Azš™ur¢FÌ\¢ºLÙáì‡=›õ«ò¥K]?úÑâk¤wJï°ùŠÐ}KœóÀÛ¿þë¿Úùá ç4X–þ¼ÿã'kW ê„®$9M„yRM„Îáp1àÁãö² Ý …$ƒ/yó5)ç6a¼økÔ¶¬|dNA¾ÄvÜܳòr3†ãQ«Ð¬zH¹~àœsM àau¢ï5©Ó–*®V:²Ìª[ 7;òdañØ´pðàAíUñ&Z‘ù’D_©IZ'}V”;½ ˆ6¨8z³ošùUˆ‚« g¡ð PÓñX¢BÕÛj¢BC).¯EÎã‚Äóé瑟™¤é”5¿s¯s.½ì¬Ý»÷ƒK.ÑÐmâúŒ½wœàîN;oétõSŽ>ÜiËm?Üißmg¾ýò÷vÛýåkö \½­tãÎÊÕkËfÏX]Þ+ohŸì]t»¬×%=z_ÚµÛŘ€›=lG0ÈŽÛŒ:Pn„Ó˜¿k?…åÅ¥òˆâ ĉ¶ö«ÏQu›aX îÈa„|yƤ)ï×7ΚF8¼„ÃE…# Ì{?„ W”_ \…¨®à\G-ÈY"üïËßþ­0üäB¼‹?-.ˆ®cþ…wuåÏ÷“á¤]&É)FŒ‹œ&áKùã'ã¡Ù':x¦ ƒÇå—\zÙÅ—Xùõ‘x|–+o z³šú:Y[ƶ¡³¢žIáibÌd/ßm„‘á|~„-[ªy;¡šŸ4e²œ)Vò q½nmƒdCAS Î<8zø}c”Ì¾è‚ )y¾Øê“F;œVTuz”M2i57’ª|êFÎVA€3É¢ž“#8/–2Ï G–ŽŸ:ÙÄ!HªÂã|k¤7° Ó¦j«W¬YÍûñ-‚Î/;\Ǥ_äË$sæ™g¢Aê—JåµtõʹË/]·zÆâùãfN¾`®¢vs/¤ U5]ãxwû?þ¦ó%—&‰@ÏL©:C|N­‚îç-Z(XbÙ*Ù³×èsÁ²%þœ³`¾ð;šO$åUÒËÏ>*'w¢Ö¹ùµY9MâœFd[K ªž5²ÿ ±E¥õ#rê3³Û ŠKûô¯ÍÈ—SZÖ}PÍÜÑy%Â$˜-=Ì„ÓúùiŽ?µ…e•#ò“Ì)%•ƒ† Z=,gdÿÁS ýÐì…Mí£‡d·å——öÎhÊ*žYÓR5$¯µ¤:§ç >lå™Ô”ÅÝ:'I)E HÍ%H òuÈýFÈp§®M¬úˆ òZG¢2¯BFÔ!ºÉ tñÅ&uPËȯA¯·+pº„ȮÏÃiGŠQ€GS ýÊ·@ßP»9Ã9ý'¡$rSÅmâvBL1#q_»!ýhaäöÁ¡ ¢’û2ùéT<få ïqùE=ϸ´Ç]ºŸÝ³ë…ÌáyYåçuq~ÞØa+¯ìºó¶N›¯ïtüáNGì´ù†Nûîî´û¶3öÞtÑÞ›.ßqU¿-G²6ï8kñ™ùEggdtºô⮃zÍʸìr&ÇóõïÖ£ëÅ9ÙIUÒÐ’‹|]1ÚXv8ńĢXlCíCh‹#!Õ9Å‚ï·jÛ8Ågòkè0Ý/nÂ3«œ&!ÃA8NLN"æh“v=&` |LÂåWñýÿÈçíETJøpÜœ³ýÆ7¾A€p/#ö"ÝøþÏÿIPûüç?ξôÒKŽÿà?øö·¿í‰ˆzù§ú§tK˜!0þOÿôOÛþ}™—C† _JÈ+Ž«Ü~ûíg„‚ÆžwÖÙi¥#B¾$<åרˆ#Ôn¬Sèñhd,V"sZ³€j Èpþ4k«Ò;zÅP-šß®% ¼$9«lA¨s a‹pCz¸ñúøS(&¨LeÈ<ó,k’ùŒ3"”ģР- oxŽ`£Â/XÒRJÁ€Ä@¸ää÷, §÷Àþõ­ÍP\å)ã&Zà÷¨ @Òù˜&1ž&ËW¯JVJÕ ƒ™MX³ ¹½¨„À=G­nZLc€´pÕò¹Js¯_½híÊÅkV.Y»jÀÐ ÏwùÊo¿ß_œv=°>†?€\¸x‘|.¾-;¶/”žR?Ë—ÈÉ3§¯\¿Lò½$)†ÏN2ž7~ZÒgÀ¤¢‘í¹EmÙí9…-ÃsÆçÛ™RP6.«`FIeÛðܱÃrgUŒËÌŸ’WÖžYTÓ„(º1å5ÜXØ2}‡ÉÞü٠sŠ*†å4æ—M¬ª/œÙ˜[Ü:¢pbnIóàœi…UmCògU· )lÏ,iÝ–UZÕoD[AUÅàœ²AY#3ò€Üå«U–ÄÃA8.”€Í6.¶¡¥¼ãŽ»"3ê¯ky?-eáä)u<$†–ÒN¨Œ:"_JÇÁ^ \×n=è*Í=´ $@ÛÈ Á=’ãùP@´/¤™ð …JhÃâ ¸a¾òêÙ4•ÔÀñÐg¦Ð…$—Õ£gi‹Å ÈÙ#x€œ8èÓãÛ|þ>#B¶:ìÈ4pz£NψÈ8V]7”‡öµBýˆÜGê) <lˆ„U¾qŸ'FúB©€aÇ81ÁÕͺ©°†:D'ÆŸ3dð°žC²{å **È(ÍÍÂ6È,ïWØÖ£yi¯ÕWvÞuK§m×uÅÝO<Ôyÿí=÷ÝÞ{÷ƒv]ßgÕ¾sÆÌ>cdÓ…ÅU—æÕ5f%‰=Gdgf 5°afFnæý“rE¡¥ô$)ÿ™Ü…«§SvE’IŠŸ¤Hi‰™<"*äþ Ê AÄdaóuvJx éÍ cr$S÷RâàÂ|墑¬Ò©Hoçxýµ×QNÂŒ~}úrB±ŽÀ¦2 úðô¦ÿ(Ag‰Ò¦:I´&!«zðä]Z>™rB«™2ç¿{a!+*+7i¢qåà:‘ îè:U Üi]K„S¼G|^*¡I➉)H‘$§p–±*0ÄéòqÝ„Oó/šµ`ÑmÊüÙ‹×­š¿jÙÂ5+€\¿ŒA.d¸”gÇÏ8¦ò‘!/Z>£ª’s U°V=\ż%‹Û²õkVmÞ0uöL+dçSã¢Éx~üÓc®Y»å=vÍÇOÝ·ïÈ#O²ÿø“¯z`ç¡ûw|⊓í;þøÏž¸é‰“7K¼yhËN#r³Y¾ÿÏßcÓãfró¡+ïsò–‡Ÿzøør¦Ü°çè¸òºªáE8ð.—ÈC˜Èp´”‘Lʶ…$gKâæ{ñ¡E¸k¯KüÖ׿Ô4Atü‘þ ñ.p+Ö¬‡pÂõéÛŸö\3YG#½²¯#²P†Ê‘ψ_D%Öƒ Æ—‚’†”.ì0 ²Íi©YxåE¬±€4—І¦«ñ-]"yŽ®RáÈnÆRIÁIvìn½©sH :4ýÂÉCþÓ`á°ùÃ3>´ô®¥€©F|z*çôÈâïvè{BÖÑUHØØr¤¢"»qqÖÀÌ^C2{õéuq¿.——åì3¸ä’¬ÚSÖdî¼¶ïžk»n»²çÆ#]î¹åª“×\X1ñœüº‹rGõ)Ý/»ä²î}ûtï-S¿‹;gvë5¦¢²+x÷žü‘WôÌCN!UG†Ìð{4ȹ"~ RÆkŠaG6N¿ºG$ÈzôÀ 8ÝA½EýoM3äÈé^·Ýf¸™$Âw áÌ¢¶@ ÉÌÓ)æ^ \ð[2Ÿ9?§õ+ô¥Lk sÄ2ZJâŠJy ÷\äLä¼}ùÙüð¦ñg?ûYíE×6üÕ_ý•6òñØ^ œÌfd¸°ÞÅöý–÷ÓR&z®Õå #Ƶ4úppç7Þöm® ÍMy»$—§œwœZ¹ê›¿ø¹59ü‹_¼ñ㟹ÿ…Ù_¼Çˆ”<†N?@ ü˜@¶¡¾ÇE æˆý‚pI ïÆF-ýdV‘fh±o¿õ6ž Ó¦$B’œ#VPÖtj’è9J¶ÚJbKæ‹hY?‘Û-·Ü"È`|]oŸüNr“·Ñq\;—Ðrý¨×XS«T-÷Qb%On#£›Ïšð§ÿÅÞð‹ÒœgÖ’/©UBWŠAJIÒX’šhÃzÚEî—s–.š½lÑÌ¥ g-[4oåR96ù̈~K^å›oýë÷¾ïN=Ð5ñy ¥/ÁWäŠT£+×®!ÃM™;kÆÂyä9ayK–%y …" êÓïôO.]2ïÿ³^ºúÊUŽ­Xw`þ²cËÖžX¾îÈ¢•Ç­:±tíÕK×]µdí‰E«Í_qdîŠK6\´vï²uëæ/á<íN™ ;Ü~(îŠ5›¬Þrpù†#Ë7î¿òäš-W.]jÕ¦£óV^»jëÁ9ËO­ÜrdáÚ+WlÞ?Õú)sw/Y·gÅÆÃ›wWå•–ç–0¬{ÂÇ÷""pjPL Žèö›‚p×]ŸXõQÔÄ6 •Á,§î¡Çž rážzþe9M œˆï I¢ œ<ªC‡%ŽÈ0ïLKRV2¼-pñ>¿šºHm˜âർˆaºFpÑD“YTvÍw„˜:h†¤bV0™ç;ÑO3gN_¾|i–dØY ÂUcH'(ËÚEK‰Eº6x”äÄh â*»Ä %%iéБ8ƒ­ô'ÉùØcX!¹Ó€p?Áã@‚è'0Ìí‡sf(ôâkõí»‹Ä£gÿúºõ 7à3[ ÊÎï_’›1µmÌ’Ek'.ÜзyúÅ­3‡¯Ý3tݞ û—ßüpÓâ­…ÓzeWôÎ.m?cÃö½ ‡ñ„Ú«Ïèü‚¢Õ¹›—¯V”¸ ;q=jÁÆ–¿S1¡ø Ýi(f¡~° _›ªCcK<ŠÐFji_ئ§DK{P¶n\›H±-p œ™#-„3©"í²#féd²ñ=1߬ Î=ò +&ä¯Ê—"ÃÞ„D]}õÕvØánºé&ð[ß’4ÚÌEÜ–f¡À$¢ÑRÂö4Â}ç;ß!ç™Ç!ÒE·ö!æáÈppLq †©|Œ[ªÿä*Õ5 Î¥ì'?ú1ñÔu¥|ö: ¤sbl7¼w%m¸“`lÃÉ\…¶CnƒCr3ª!@G'ØŽ8B" jOÒøñɤʈwÎM/NÑ:jÆJGGÊ _o ø‰W½#¾Ô°.JmEÚ0K¤Ô‹:É2¦•S¨Õg¦vŽ–’y0OU%‡I%áÜJàလê9 Q€ Ýô-D$jˆÀ…cä¹5š~LN ×¾ÝPÛ¦Ö‰ƒ MÏá^‹XÆÑLJé–_ ök_ï(ŽJE R66ÒU‚b‰A®PÙÁêß"x9ܵ¡$ÌiAÄýŃ^ÇO¡lôS8s†ý) laÄÒ> ÚÑ•D´xÍš[سtLÑ„²²ÚžCû_6䲞C/>´{Yþp1¯#rË.Ï-ïRÕ”=wIß±S.È)ÍYÛÕegª -Ü숬¡EùYCû÷Þ¿—Š‘CûõÅ[5º¶ ªú²Œ¡=<‘¤äPâ☈Œ©Â7D·PÇ€íB?¾0QN X ‰3°-ž@ 0s;Î ·Í<Û¸ÍèPãÀBšªO²ÿÀasÌtJ#\dÏ „Ã]™{0ÏŸÁoA8kðXDN“_I´@àPÚ+ä{ßû„“r-ŽÈŸáHé¾› (<-AãþäOþDƒ×^{ÍX2œLtiÿ)§>_ÊtÔápWrL(€)×8غu;ƒ‰}вvõºûöoÝœäÒ–S›kƒ<{ª mÙº=•k|Ûþ½û¶nزe݆½[vn߸yßžý©¬ç+NªéŒÓÔ3ë7q[íôŽ»ô–*¶v׎Ý[7oÙ¹eGB[W®Ý´acÙ°nãÍ7Þ4gÖ\åÖ¸$pƒLU]IFE l«·ÛwÇæ¯wÝÛ¶Û×Ï®­;·oݶq͆åK—¹: ÔÉÓbSù¼3¦Ro6žT:ðí\x¶mÛ±uÛŽm»v/]¹*ɾqÓª¥+·mØ´gÇÎÛw¸åm»v&¾«V*ÿö“ýaê?ýYÕ”Å4IÖ• ¥T'PtJÚÊ¥ËæÍ™ á/Y¶hÙòéÂç.X¸z•"Üó–/œ9¬ÓgR3&SB¨ÆOß$§Z듾4Uü+ÍBò¸\Î_¸`éÊV ÇÞ§Q¹Ç+öîÛ²z]‚¸oÞ¸lÕá]»w®Û´sýÙÔöoÞJý¸kõ:IInÚºsÅ:[Y(·/Y±oõÆ£wÈ }|ãÎ#[víÙ¸uÅ’¥»v$ „ò KVܸýàÚ-Òa\±Q‰TË-‡6o³Þ²ýÀ†ÍûÖo’Ðr×úÍ;7l>°k϶«oã߱}öÂ…ý(•ÙŸKY!p€-m“ãôaF¸ëoH¬ú`¶!Ìý›·rí2\0Ý!ÃÅŠ´…€ðEÊ0ØDÄz‡Òï99‚&1©½z…ä$54~9x¡¨íÍ‚ »„Ù˜ê¼Ïå].¡¥ lógªb\~ UÿI´”¸l.xs܉`UŸ![„ýXæÐU¢Ýáa#di¥eh&#¡p”ΊŠ"aÏ#€8W Œq0L€ øedguÉïuö@…á†ôÏÔkX·˜2z÷îÆ®Ë%ý_:,ç¼!™]r úåvéÙW¼JÿnÝ{\~iFÿÞCÕØk°Äq=.>°wfÆ€ÁýûôìÝãò¾}:*{æd_Ü¥Kai§Ö@W®"ršß`xñ´cÌ–@â€ÆÐOjà/—„=‡üõ¶IK¸óD¡"?í?pV™`ó/ ÂÁ-sÉA‡êˆprè@8…—öùE` z¨ë®»oŸì€4 Ì`iç¨æœ ¿ò•¯ð¡’_5Nÿû¿ÿ{–IÙÄÓ¬k@XHŠ g½þú'^ýèÇ%TUã›ÐöN<ÜæÕ«Ö“Ü%îâi"ŽÇ-·¡¾¥zT#T¶ˆŽ?E©Õ×5“"ìsäÀå¡S:”cc¿XÑ‘2µVU——U敬®ªÑfâÄÉY#òdÖVŒç® Ž^I^×ÊÑzæñΠ[¢’™T[UµE#K+e†³¥7ÐÞµlñû¶Üœ¥½-ÑF5W#tœ¾³¦ZöÒ‘¶zÐOb$®i°­,¯N„ ÒJÛì¬|žÌ|*“¤éåRÄ6Úº žcFX\4ÒØÜ‘«k#ppc]“6Éh+¸¼W kv©„µëÕ»#‚¤cÃk&íD“ò¥<ÿüså9ë¼jÅê¥K—+i²dñŠU«×/YºrÒäé Èü€-^. øÒÎ]QùÑÞvÄjè-gÂ?3ú}&º£6`†”K–.Ÿ7ን«×oØ4uÚ H,gîì™sæÏ]“~ôýŽilUĵ²´‚êR‘RÛ†šzQnÜ÷%yUV™ÄTÏ^^T&;š²®¹C†ó¢TiVÄ=³"¡6qýýÅéG%#­+¯âS*É‹B JŸOŸ8Yè¯6g©êÎ|èŠDgáöUÐ\’º—LmljA:QHzÏ?ª{ÓRb€l“Š-«Ö47·zMd8*„ÕÙ~Õ2Û»ûÿ?”ᇠ„i$ÀÏAÔçÑ'Ÿ ;-¥ê9öyâiÇÓjþw…¯F$â`‰ŠÁq$}ÜÊ Þ5â= ®:Øß`—ãFÞ Ãýù¿þð{o¾…È$ìÏÏ~Ž O·ME$¥¶ÿ«ÛX r|ö¼ƒ4ý‰a§[ÆíÄ‘Ž~éX:t¸#Í|ïµ’žC_ÄðóÓÿú“ ÷|ãçF•b夯¢–¼~þ‹§öUˆG¥”d1[¾÷ýQk §øècOÜpãÍ÷Þ÷Àƒ=òÐÃÚyø‘Çn¼éZ“‡‡pfZêBKù«ÊÚ{âåýó?ÿ³0¶Åí…w¥ÚÿÞïý^ú)8ÝáyŸ~Äïzèï}Žîc¯~±†p"¾SA›˜ßpOÖ®ñã&'Y».ëNP'xà¼s‘׳%8¸èÂÎ~…(À Ñ`ŒÈëßO Zæ°¡Y‘À?YíPÔ)¬Ù®ûèäœÛùÒ®_zI—$õåå=œ¢ DÐ?£_ßA†ä,8+Iˆ'PVþÐ!#¬vb>m¶Œ±éÇŽÑ•‹:—÷—uå  ÌŸ®sÜà iÁü%T²ŒŽŽœÞÅnÐ-»hß> ª±ãy¹E:tÑaC³SÅŽUÎq.ÌðPˆÂ<ܨ@ZÊôüŽJ@¶‘µÈrÞyœŒÎÄ“‰§N™9o.Oÿ¥“'M_´pùVe¾×o¥(^±|ÁŸ{Î…3gÌ (£'ž‰Áï4í«–Jãy!^æÌÙóç/–ÄY’±°=kÖÒ0äõÿå_Ç%Kz'b¨}bQü/~íøÅÅ~:AAÄ´˜Æ>Kß-–32®EàNdM¤¿l9X´¨â™P8S”%õh››YPÒ‘³)¿wÚ—Ò°äöo"«÷"\ü7î'o$å#:.̤%ISÀ4t¥ hGíNêµ&ݧ›±NQyQ- ¦è'o¾L6á¶ÈëÏðƒïyãïFhŒâÒ ¾õ–É€wÝBGôÕU2ƒÜ§&v2½caìxzü`ÜÝc?®˜ÆèÁñ4;Cý`¤ ¨{g}Ëxã§?üù/ôöæôýŸý,CP×w>äI¦½<‡Žq­4ŠÇ—ò¿¿ØÿõWGÈLwîÜw 8.,ÅwÿñŸäV®Z³wß'ž|úÔµ×ß|Ëmà ¶Ýwÿƒ<úx„{ø‡-åÿ#„3>€o¬ñ°@”ð²p÷wK¨ƒ#„0[ñRø‡s(»=ñÑÄóø5q¯­Õ›g¤ÃxˆôGÄ ý,þîïþîýžlÂ7¡° ÂYÕ‡“Óö¹Gå‰AwÜ~Ïõ×Ý|ݵ7ÝzË;¶ï!‘ÄÍM™<ƒ`Ç÷rÚÔYÖÖ–v€áO=øÕŸö¥Žš4qÚìYóí“aêc>µmë.½=óô •5 ­Îõ+ûŸÆ¶NDúµŽèjâ“3ýéWG®‚R'®¼æ–›ï€wÞqïüy‹ÔÌ¥! ,:ŒÁ(¸sÄÚÔ8†¥O7i¸ÿ‘›oº}û¶ÝÇŽž4ªki¬Ýj¯Î¶ÕÝéÊON§FäÊ…™ŽòY‡p1Gm™ôb¡uò). ðbg̘EAê¹Í™½À£†s¢ãæÌ^8kæüÙ³,]²¾ÂZDZ}4¤RêknB"¶”—~Hiº‚ ¢EáÜ´iHçû“$¤ì¥ƒDRÖ¬ˆhL}~ÁÅ¿íˆÄ½7=OLsí±ÓQèHìÌ=¨Fµ³Ã¡.T4”6i³ŠÊ0Lgeb›½Ô/ÞÁ°=¤TOÌ!}Å7ƒHm¸™„$÷$Ã…–ŒÅ‚Æÿ8çàÈp´OלºŽeý©Ô¢.ŒmÔÇy× ”Á û‰CõÇ>ö1Nθd‹ú;bŠ—Qð…ÊÇñW_}U›(®UÖ>ò‘ØW†æÅŸäÑ^zùÙŠÊRF€ëo¸æÙçžTRÇñ»ï¾³¹¹Ñ¼ô˜Ü"ЧBeY‰Z9‘$:¼47–p©§?³¢RŒƒZF>‡H Œû‰üdv¨FmMPNPʙᾦz1QêÃE‘ ¤ Ü;‹?•ø±ýèG?Ê|ãiØq³ÚpeëQXÒµåœûë¿þk!o×}þÎï(øð¿ù¹‡|ìÆn‘ø 9W3éfLŸ£7ý@)ÛØ ôr¡sξÄB8jÛ‡züó¿÷ÅO|ü3~uË~5¸H Õ&ŒŸ ‡Ü—ëº5C’™A¢‡yóHýŸk:]²7ë-À·c´‰™"¶Ï<—Bå~¬íèÓxHQœD;ÅAûÑü¸b’-ºS'æ„(3d߇§£Lýùg‘'wNÒ1NØæ¬Ð©"aDÏв†ÿt¸ °Ãyè$„ûM”áBÖ‘Ø „ ´ È¿‰pž¶:x‚H ù$»ÈÂKä Ž%²VŽm¹D%Iò&OfÆóŽü¤1ÉQË6|#·aôŒª"2Š~«]) iQ±xsF…";‘£Rµo8"žM(Œgý‡£DØ–¼Í°EÎ0 ÂçÂò®„úÁôDÊ•t‘蔚]&I$e6ΈGõíhYŠ"ÁÅ~Ü‹[vïn9BÎ_Ô8µ‰˜¿H'àaêtìd+ÐÆ‰Ô—HO4Î2¿úI³xVáAO)íin8Ž„Ý.ìyáVêíG˜¢…\XéöìÝÿ–÷ôé¹óìÛÅãOµôÜøŸ|óÏžîå{î~àÑGžt]êÍè!´ gy^æðÜæ¦±N!ÕÒ GU®µ¡qôØöf8'þ-^J¤Q™ÒI1Ò*‡ƒŒÁû“ĉ!pƒá{iq§áW¬@ §P÷Ï*øc±Î5v\.B Ãçø•'CK¹hñÒ#G3¶¼êšPN¶|ø±ÇŸ „sÂ=ôèS=þôcO=k†sï¯Ê—Ö% ¥Ã:*ŽÓ˜öBKkx;f° ’Ç€(85ó'òèŠÍŽÙ¼ÒÙq§#Â#ph+ G¤Cd‘~0ÃäFä„!ÈG2ƒ1]0)°Mq "Â*'"ýðºèâl!{…Õ 2ùI%qˆE–¢Z´ãaäÓOù h\.Ô›]ÙvüÄŸEC6F®ÝB\ÈQéiM°jŒ$„B+`-Ú[‰¡ô^¨Cé-õF€c{»äâËõm­2 Oš8Ý´„¾†AZ‚mcÇŽƒ+Á*úºâ-Û¢#>‰D™8k–ü)´”€ÍJX9|ø¨ñ¸dõ<)'©(­cZÇ6碆9¯é]Âé‘ ÐWŠWµïÒÒã% Ï)Ó€ý„ è£â£½t5 €IN:\u˜ 8ÂÅ(ÙLŠâ€Í–ÂÎ áÌoHLd”ˆò>¿5"þɂ䡤Ð.ô-á/î³Dk|¨Úkì`8žE›ð Þà´A†–Ò-„~ò7BK—³ØÁ2Âaœ¡Ýÿ ©â—ÏHîÐãyb{ˆ i™#d—HóáyŠ'À¡ã ëž{îâŽøèc?öôÃO<óÿáP½t @lBŒ{¯A2jiœPWFûwXû·]}D+{úi‡á:º÷¼ä Üë¯}*d8·bùÚ%‹V%nÈ.œ#î$9MºõFè‰JÈññcW‘œnºñ6F¸+!H±N+ ÷ð†† Rè?9NCŠG½¡×7ǧ0›Ýpý-d¯}{ªc¥jôNqº- ˆ:¨ûñì´ºØ3ÇõÌg0GœØ¹c¯«"õï,§Ø1 ê‡Hj$¡ ÍQå8„ÖníàGÝ襤… ÐRFcꤦºa\{"’áÜ,‡Ox{€­`(Ü Ó¡7¶¼a‚2¿S˜®Â¿piÄ&HÌŽè §„à À'7–Þ½¸-¥ƒ˜ŽènúÀ!§ }Ø»w7nFÿÆiVåQ"GÄä¡ÂA|c„(!ÛàÐAã‰Â¡¦(”Ÿ¡†5¯"ðÙM…HdÀ qï†mìQ0R!åD*2í£Š?};å~ÃnúAÇ8‹t0 †0&ÂÄFV]îQÐUŠ‚çXìg£+íC¬øòYè*"ƃXAÆbY< ÷BjD;ÄEý”ì´Ô,ò'…`âZ(Z=“`h4súUWŸJËp®8D-yëmwÜu÷½pD:çˆ?­=öø#?áú¹P¡ÿ e8C´J; Þ¤oÒðÕ". Nid^ÚI7’¡¤ëà2ÂÔPúÞTÎïE8Õs êá¨Ë¨(Ù`Û¢…ËÈ &… %jËÙ„¸¢´DýÉLD°$¤.khó˜ÙPrì‹ÜÃ@Â'? v8hªC’Sh‰S!~éjB@ÂQž-R €!„'’àÙ¨ˆh JŸZ:ý‚ó/[iñËx¬Q*ˆG¥•H ¢ô¬uæ Æàüˆƒ8ûªäç•8ËÀÜ—k©ÒÁ‰m¸âÓbú»T”ôçž›¸ø$ äAÁN. .á²³ ~ÉÅ]<+=•!¥_PÄÜQQ&9Mmg²èŠæÒÄ "5£JñH' 9Hl”°ŠÆ’ÜFhƒ^äN ö:€°8á4ÓÞ`:dK0 @=}r,Þh ÚÞBº/ |“áS ÕÝÈŽíû¤é‘2 ì9¡As=úRã4Ú C‰n!ÌýFÈpÿY7<3 ÈEF«°Ö vÁ죉Aß“FÉs H ˆcw-Qۈ׎¼wA:Ó,ñÌ#:Í%øþ¨•Òê““›Ùµ[çž½ºª&ZÊ»5—¤*IÕà’3`†~Ò¹ÁÌsÚ%B>‹(®À°XÂ\gɫ⠒Ÿë6„S\nÞˆ‘åEìp$«°ç%!A#G{gœ®ÁmFkzÛÆ‹‹ŸBëêqãaoäF-ð§Ù߈™‹0G§§³W»e<ŠŸ´ç‘'Z@¾7BÛ=÷ÞOho° Âñ®|Â)ºûÿá~©ªðß<HÍÒy¼ìBù¸]ýõaÃKÛí>X€ÓòÓŸþ,Oº8¤ŸÞ–Â.+Ôpa‡ƒpIžá9Ä&X Eƒýû]yüjx€Fpv/â"üNÚƒ4"—}X]§~Ps(ý¹ˆ_ºQÎÕCZí©[°§%0ÓÕ¢ñÐFkÀd8°„O ùÏÀŒy÷®ý| !ëlUg_ +;aEKbøFŽ 'O½Îô C£šù•î1\l lÏîžâÔ0¢“ÄMä¬óKŠ+ %êM$!ð$Pd #"BïË ¢ý—0ÅBuiÁhkÆ. L €Ñ'qÍmå'é°µeœœ î ÂáÈ©éâ*ðIW Tà %ŒÞhGi)}€L-ü9Éj‰o§dµpâ ± .*ŸÃ9 LÒ›![uØžQÙ·C„vXÈ„ÅU•;õ'ܲ A.rJÙÆÁhR|±.IO‹îÔ9®Ÿ.ÚÞ¸Àà ÈpR™x8n*àzÉ]¤ãá>°âá¿ù%ý‡Ä·–þãåþéwþLN“´Š %¹ ³L¶£ Gí0õ'UO~üÆÛîR[àðñ“O?ÿÒSϽÁI"ߥ¬ðÄDÄáCX¹ k¨s˜d‚n2F¼…ë‡> Û.‚/£¶@zýw|IÖüÿ”…³eÇ2§ï¹ˆ1pP–HB-¹Â§qÝ´ôö^Ó]Ç1í¼öÚÇyŽÐ³¡òä¡ð4‰`¸$yå:œ–ÒJxdš$'ôVð)4:| Qd² <§„,Ô}$RiüÈ[l]p–ب8EË𜌠ˆ‘û¤6Uʹ_~âKârš€°Ñs0/ØÃÂëÒÀÜ—1@û°Ð–™P?®¢# ÉÒÄðÂéö¯:y­Û ç”p¼´ºÁéÓæŒÈÌ36=ju*8›™èønaOáB©ÎfÁ ùŠcH¸‡ªÁ,[ºš%#„Ãs„ çŠé·æ«ôMšè: }Ž^$TDt¤ìP tYí@ЋфaT$)”öÉpÔªÄ;ÊRß] 8q–Ÿ`O“xw ¥,¨ò´g>{-ä4ŽP9;¾O€á|êQL ‰ô=#‘v™)'d8¨'°Ð •ÄO·Ý&Tô?åÃúwvò~Ç—ÖF>ñÌó`,P-* eéˆp>õÜ©oñ­ª_!j…âHÙÅÇŠ† ‡Lƒj#m` ]†LÞ5Æ~Ô¨ w ÔÖ~d9AÓ‰I–Ï”²®½®P|Ú‰¤r›ž#Q2—þ#¦Òò^ïÊøê”Èub‰èË`0ß[a®ãÇ^°Ã}ô#¯‡7|Š|Ï™8a’ nò:K£ÈÅ‘#¥Èk ¤Á‹ýŒÜCIÈE³héOx`xè$9¢¨õàM´‡[º _y êÄüAG§“­0€Á§áüàÍgŒÓ5l,gÀ‰mªKA©Éa¶0ÉÜ&Ä2°¸G½¹;ÎCHÁ¼LÈIWG_©§wÕùRovØáábTe 9)X¶·‹±¥ÞBT sIE½¤”9ãY+àŠëê È¥œE§ EPxnHÆñô p1-ÃLUŠ®ü_/ÿi2 â ù.È4€ù•Aîþá8 Gúæ$Oû^¦ |À|æ3Ÿûô§~+\EhÛê[ËGV¶ÂC„øÂ¡C0¼¡dHB`)RV ; !4`0£¥DŽiÕ` TƒUà!¢ªC]ÉÚJIE0Z<†.+]‰³æØÒôC¨¾”¡ðDëžA\€g„Û Ä%é9ÄJ£.f€TJµØqTÐιˆ\)„s®ý‡`i<òü6*]ñ7xnœ†Ó`Â:¨Ï²ÒªœìBwä"ê<%äLå‹át ÎZéÇN‘ˆ •­Ø›²¥f$ V¨!ý§[Þ{ûX"¯(‹‰C‡dÁ]®+Ó”=°ŽN\Ž2nCpÅAƒ•.P-liaic»Iò“¬pEáz”:`Õ¯" į ‘D݈#zcëqzˆ†4®wÈ—n%¤Ä'ú(á_”uŽ˜!mç· |‘Ì]‹Xu¢bxFDx,x#uÀ9€4Iú¤V Ðõ'4ªçÜsÏ}ÿ×ßâê ï‡p7Þt[8ª!èHá".d¸æüyÍõ7½òÚ'_yõÂ¥+$€ðCh¤‘ÊQ¯=¿0­‚CÖQa4~ Ä¡ôC¬ B‰£GòÌ·°t}wÄYÁphàG2=!…˜®ëðt§ƒ¤œÌÒà ¾ªÄ "&õï¤ÀA“+—kãB2ŠÝ ì!ú„Õ~ˆ Fè*i{Rˆ,Æ*V[wAôÔÅHÐñâîâ®Ã™ÞOŽûÓ ÷]7D?0À¥aa¸i„¾1üJòcÜ{4Ž"éa¡„"ž•sîÐun*2ÂQj†ØJgËöÖØT+Z€–Ò3q0€9Lz` ·6<ܪÇޣ޸Bn YÍŽ …*Õ‚ ¯Ë¸M;ÚDѸÍýªûQ‘'LŒî1´ÓÞB*=Br[€“}!ñºñ7gO>õŒ G¤£«ô'„{ìÉçÂÓÄ,µåõ«Šø|ná˜n)iÉL•lÎ5×\=wÌõ’ÎŽóÞŒ;DÃÓŸüä§Å5ó¶Hò.JÌ8ª¾´¤’J`ä1‹/°GÂ*òU”ÿo·ßvw„D€ZñÝ,j@1m & 0Ä5v8Ðåôа„ªSžAßOH3¦ O·Â3¢ë ¦Õ€!¨– rpËÈcT¸{ïy_e‚:©_#*@‡‘ÅE#Žà­á“‘;]H£[É\ˆq>ð¨‚çȫ⺩ ,ãlbHŽkïHJ’ áh)#4§#ÂÅt7eÉ^Â×A+‚ÎÖ>*n|æ q“!œÄ`x‹ˆp‰È­õ÷ÿ]ª<Ò›N|-ñmè/%rÌüj$‘Ðâ„®’dI}J"®9ˆ}¯j– o¨l°Â9§A%ó!&ÐŽX Z@†C"G_ÛD/Â…ÒgÌÐ ˜çO`¦=¦­uÐ,Õ ¹Ñ°Ô¼Y<+Çä ÞØ x Å)9ù°#Þwßÿ‘/è?~îû!ÜÍ·Üv¤ór±½ºáí—’xGbK#NÂÜ€=G®÷aÃG¨€J6" Óè;17‚QlÉʨž 72çD<Ø R²ž6*ÉÆ#çÖ*ä63Àsö´½oPËpdp¡`S§MäRQRZ@^áo’sÙk¿³Î:CØ€i–Î KXxs@Ùp•´ëƒ ògº\Ë…üiá'L!û!¬„ûLøF†»|œ‚”S}‡c‹; ßBwL•¹§Ã(°àÉpß—ÝÓpDW>Šðf¢X£õLQÍp`æ­±ùIÌ"F‘%ç§…9Í-õ+W-]°pNÙÈBÏ„˜ É ” 95ž@*¤Œ…ÏŸ>¿=«0†ˆCçÏ*œf #¢òµŒ˜œøÕ%Ò:×Uà¥KCµÀÄÑ縖@82< „ƒmÎ%>þ„h9MLHS&5spT¿~ŽÌ¢bjúû ›l&b9=‚ßýÝßõ'yî]&·´>󃳣ò¥”L„ÄC­gK:áFžô‚ÌÈFBÄŠ _JÈ-þ˜ãÐA( ‰e‘³Ñ(Â9ˆ`dXάáXOû*D'†–’¥ È g½s:¦D4}º(\ÎMG³…TÂÓÄ%üJK©7îͪÉ-u‰(u¥CxFþ gÝFÌxx‹è–á"½1_}ÕunÄ€41«Þ&Oš‘—[ì¾tå$¢ê¸ (2,â uÚçí`]aR¤$ˆ…‡ o"RNvÔO 7e£ðÓÖñ‚ÊÝ Áû•Wg:½0‹~¸Pê“¢2ú}&ˆà…V@òY уvF!ÞI$ŸÑ:|Ì]øù“¨H`›ƒ@ކ< ³i)E‰(B“’x“&¹A¼6꡹+"ˆ}¨¨ óÑ:èDæË¤œ„Ž~Õ#~"LD [6ŽŠäÓÖ'TKù¬%*\ò%‚ঠòÎ;ïþ5º™„Úßö½ž&ù@8¢>¤9å¸Âë¶…SÖ®>ò-%Ž×IØá‚âde甤·eZx‹ ¬áˆO ½VÚmGŽ'ÈkháœÒ%ršè MÔ,b³B( Ê"m$çÉþzÑUÂ6¹<¸œ ÏRùÃ9Î,tniÅcøºh„»…¾Ô[Ñ$¤–Žž“0ÒØ4‹–!¥…1ÔtÑ>XÂÚäŽÀOj8•„>П!Q92œa8%²[±\:èÞCy—“žU8˜¶Æ1ÈÐX¦¤ˆÐ$Âd#=Š!CØ‚3âfÚ©5|>Cwž>öCõBœÖ¦ÆK ©×`BÅï7TŽñÎÒ›«Ä ÝffÆûUŸa^=xè„ãÄÓÂIÍv¸€4ÂÙÒ[Šø¾ÿ¡Çï~ ‰×4MB³48ª_?½‹ë„m2­;v uó"o¼ñFGþæoþ&Ä»hûãê:~ïec?ûÙß’é*âÆHuµ(~B^õÀƒO<„#E&eB êH«øRZ_ÊHAB ²r|G”¡NXªH?0ŒxçHŒC‹HV°K€¥|’œ;"7 M`D Р¸‡ˆ\` è–,¨ge ”“ºÈ^dÇÈ' #ÅŒ‡¤½‘ØÀ°(< Ì Rš~4Ö«èÄ XBS7.’ÝÝ…/%ÿLŠ\Qküb PÈ^l`D T˜ª0$ä>ýäéâ‚ñŒ6¤¢02é3Rtº4#(“0%kD¾yà~%ÃEæeºÊ¤NBM PÁ‰‡÷š˜¥¬e3ðˆ@>Ñ‚&ujø¼UÚB IÅ 2p$NBvƯsÁ™­~xí ᤈK›Ð[XõV”¨…XW‹*9ñXØg;Ä8$5)ÁZ_o'©´xqÈpT—¦’”]¬z&¤FØFKiÇ ÞA;d¸ÈýëZÞán¹õN&¾› ¼ñU‹$Ëi-eXøƒ}>tì„u±Ÿ-[A¼ë®{œH0Üç ……C °®¾Yµš©ÓfYÁ±‰ˆ©7ýÛO®kjùÊóÁ“Œñºënànî\û¶d”p׌’:~N´ã\*ÊHª Gþ|êÀíܹûäÉ«!… c³ê‡ÿ眹‹JJ+UºÉË/^±rí´éÒü,©USRZ±fíúÚº†šÑuÒ $:RÊ”ÈD¨8´ÉŸ‚Õ xþ|×/²´¸_CÞ`ØÀÈ[FeH‘Ù{&å$ÃS‘p¾1Ýú"/%¤'«1‚zzž*ÀKªU'&Ì$`ä(@èNi†´tG.'°Ú{áŠi_KoÄ»ðê=7q~²ûs ¥ç4òñÎh!"Ìc:1’ÐÍze2‚Ø@¬_aXxN× ´ âE¤Dˆƒ`4:HÎÐbå“çª+ ù2\cì•÷øüó/z¿Æ"¨€pá„}ËwÇ6¢¼ `#¨’1òï½â°ˆïn½sæÜ›·ï¢Ét<æISs«YDPöôðIQ8£c¨õèÖñ§¶”ÀxGðO81Ͱ÷A·Y_/Ùºµ¡©^@w[ûI&ñÎâà3yâ¤q²Q©ZÔÐØÞÊÁxl{{›,ã'´InBA—d«›Ÿ2i²²Ã“Ú'¶µŽMrŒimÓ¬Ü/9sCó좶 ´^¥ë:¡“qĨ,†­±ŸB¸÷§Ÿ,ÚÑb ·ÛpÁ~ìà8`?lÀvL›¸\x0…•×â¾L0—Õƒ ãWœ\*–fge?²ÙŽ»2uâ”8=TëÚk÷B ƒ\xšø‰C/x»õ®û¢2jáä‡N†ëTô–ÐNq,ð7¿ùÍ´ò$­“Œ¤'œ”;ü•¯|í‹_øj$¯JÕpI. ÷Ny% 1ÜÙ‘€DŸÌûÀ EnøpC”]»öðç&UжiƒÈâ<8âR¿;—Ï^D\!Xh®™‡%'@8—|€÷A y^ \'öîÝðàAD-%ø'©(æ¼§L>š¤U^=wÁÒi3ç-X¸lÂÄiåÕŠšA‘™³æè–(ƒtÊç²aún¸NÀg0¤? …u‡”`„h=i’ø¥HÔÉGY¼*Ê“T,ðä °(²9´d ê¿zÏž]òÔ’Rz ù’Ðïó/¸dA0¯xÜÄi¹¥ —¬œ>kþ@;v|yU-㊲Êj:¨Ÿâ³~~ZA”³Ï9/­¢Äö¦“¨âàhöa^Ê”%¡—/h¾O‘ßGèé1¸\úzãµbe"y’N0°QsΰŠÜìvÜœ0!w”&W—JÂÒ–ÊC]ç{¿”®uõ-s•_´\Eº¹ó晳æc#» —®" /[•«šÒªuCF´Ë—-_½pѲÖ1ãh’¦§[ï¡™í$Éq“'M˜ºrù\ø‡‹¼fLJFôBðŸX@Ð6Nª·ã'TùóU§\ÔäsJªìRó";2Rš-1m<½y2ØŽ^x)ì‘¿®å|)¡TäYŽŠÞH‰(·@¯€·°‚h#BàÕO|æèÉS¸µƒG¯ÔøÅ|ì‡?R¶æçsi“Ä¿UðåíÇÐÑÅ:eÂÐI÷†ì?=ý#ûož–ãIMÅÒ~öÖ›o$…ÔX=H?ûù›ßÿAR\-õP5øá åÛõáo„Ô®*‡?IF¦ôÚOO¿ùÏo|ïÍŸ½]’ÆPcfÆ“I)¥KÖ9ø.+I¤Ï o¸wŽñS,+ÑÄ‘0Ätt)p×éL e`þÞ.â"~‡­ãIYA£Oµ @Z(0£‚}|¯¿B¸¯ÇSN_=rqÄàÓ±Èé íc`éf!¥¤‹`Ç)ïNœÑÌézUï›î~ü¦:m íØ³h…n@lå3/¼lšÙš‡¡7÷ÀÛmwßž½¦JÎ5Â¥Õ’ìpHÞoÿöo{|QçÐ3ú7½ãùzò_ýê×!Áù³M!ÜÂD©˜Â$Œ9ü€[¨Ģ΂Xd#¯ý$>éé§ŸE¦ø¾§ ;$y:¬\ÌýŠL#ðø8)D Ái(2º‘<¥¢9Š_¾öÚkÕ¼›v?Q;„{=I…®¹¥mOÏ¥â .³…sDºæ–±„t‡µ°mÇŽm‹—Ìß·×=÷ÞÁ\¬Ü-È;•B“ùJ(ÎIdÁü¥VX>aütQ FNÚH {Ó†={ÕòÞ¨ŒÈ¸ñcxÓÕø•ñŒúô̳ÎËÌ.(­¬á’[T6U­Òe«¬j*ŒªkbÂ;ç×ùKV¤ˆCB% ‹JÂM^ ƒ¼?)ô0ælø^Ÿ[@úà #8A €µhºñºE=B‹È¯AØó™i’Z¬Åt­“Ä0•oܰÍÝ'„| `£v¦Vå@4cú\/¥kh3ÁÒÅKV®Y»ÉN™8÷9 Ó6ì­^³qÙò5Ô ¡†mŸ´dùše+×iß6v¢´¥£k{vë;,#«­e|û˜‰Ú§,_²zþœwÓÍ·£2˜e%Š  #¨LÄÀ…/¥-n¹óÞ«¯¿yÛ®½¼Nè6_ûäg‚ÖÄš6¨eü`œK×?Ó2(/Ð1ï Ü;« Iêyþ4A¸(j ô~ü£Óo&÷‹þ(™ 0 $ô )æïŸ¾¡<}ª`¨Î’ÊqêÅýâ?þ—ïþä»o$=¿Ígă”Íq¨çÕÑ'.<àÒ9 í€û[-tرpkú”8ø¿ç;ÏÎ]¼ùÓ_Xæ.±ãcí°/^ÇQï€M{–±Ø"S.írï}Ü>€oBüwõÛó4¢œiH—éødÒ°š>˜œõÓ7~òÆÏ°Îßû×›B·î0ñ¬&¦ÊëˆpáåtσZÃ6éRM……§Iúe¿k'žµ@ï˜4ŸùÌgèšÓÅÁC¼{çµ}Ï÷¥/~ ª!ý© ÷ Â%ÎCm“Â+4Qá熒’càÕrC˜;v,Q-¦DDHVÊ« #áÇ1Šp2ë „cq%]¡à’æ!v(øW\¡œ•ý÷¡O‡L¶”Î*V×6¶”U^°xÅ ²æâeã'O«¬Mæà,«†uxå­Y³jÛ¶-d†C‡®Ø½{'Ÿ(úmÖc‚`JéŸx¢C2·É/œK¿uj*+’ü™ÔƒçœsÅ/ݹmÉÒsæÎ¸ÿ»'M'¹g(=¸}ª×‹/¹¼¹mܨچÅËW喨ǽtåûuM­£šW®Ý@†YUãø;Ň“"tápž÷®A=‚Ä;HÏN/éÞ#÷9Mô"˜Fl¯ãé¯ ÂèD}ú D:Ú`1ahSIZ^"»#û%¤À:Ï”lá²›šÛñ‰ÏþóŸúÔ§”Äú¥‹b_þò—¿õ­oýÕ_ý׳o|ãû·«$òçïw¾ú•/}åË_üâÿàk_ûÚ—¿ú•?ÀÆ~ýk_øÒï÷?ÿÕ¯}ã+_ùÊýÑ7ÿìÛúµ¯|õ_ûúW¿ðµo~ýÿìO¿õ­oÿÑ'?óê]wßüЃ÷|ù~ÿï¾ó×ÿøÿðŸúƒ×_þø–M[-YØ0¶vòì ­m‰2Í8MBj³Ñ—kÇ˾²óÓk8›ç‘ïѰLå-¦´%öŒºôxúÄ$…CE¢_}~¥ ÄóÉ`7UÀ‹mÞw­ž‚ögú—*„üá7þDé;ßþÖŸÿé·ÿ"½þÃ?üã?ýÓ÷¾þõ?Œõk_ûÆŸüÉ·­ú§ßùÖ·ø§ç/ÿò¯ÿê¯þÇŸÿù_~ç;aÿüÿá¨|þçþíoÛV1ê?ù“?qä;ßùÎÿñ{øžµÒtJÍýþïÿ¾#ž0[’?UôŒd˜‹[C댜vÂCó #Úǃr0Ü•i,=ÕHôlë9ÄíÇsC¸º:|ÜìúØ'>m.™<€ Û„Ç¢·ÃL-0G{òYÑñ§™÷aô4yÎu´Òù¨ƒ^Çâ¶ïÇ>¤ûpÞî—¿ôut?Lq)É&A»ðJT`)4HЋê {¢X\غXªÒ4àɉ Ù{"ç!A(l*h˜Sôcë8•¦ŸÂ›Ë»ä§ äøïòlV}Â+‘×'^êò«`Fu}óŠÕ€jK6ocÚÆ éŸ4yªö&<èë×+ ½ìøñ£ Ž~[µÅT²Ù¤Þ´K³3q ¡€eM¤R#‹¹©Sf‘rÈvÐ=U)f´éµ`Á<¥ ×­_µqÓZB!wjýð} ƒJhYTj´_æ8Ñíœ&ü¥µ”Qï*<*™Ž}ù¤U_©ùOä 1•Ý;€Ç øªƒ‰£¾pJœÎ¤ül-"ÿXIÝ $+#ý$¼áÈG¨b`c‡‹Z}™#r[ǰ‘¯Ý¸ÅNృÀŒ–Õ-xÈn Ô ÉÌnŸ8eÅšõ{ö—¯Xázôì›1$3 vœ8²ÒO†{އÓ>nÂÒe+˜I!™¤8°mdE9¨Zaެ]¿Î?I›&Ê]5ÛF8¢¿yˆÙ2>ö±×?œÇÓÅm/¼ò* ‚”XŸ{é#g?”E±Ê<ÿÊǸSÒ,Y!œcY¹äÒ˘oå4 ßz¤Í¬’öž÷.&¶OÆ„1CàA˜Æ´´¶Ô7OÁNœ:iÂäé©Zæm?vpüä)“¦MoŸ8©elû¸I“'L™,ƒÍÂ9 ¦ŽŸ¬²ÔôiçÍŸ>aRóø -Ë–.œ9eƪūæÏX0}ÒÌæÆŒÙ”éãÆŽob©‚1a[ ¥BÄAÖòÃùÓOv®c`€ˆo´ÏÖ»W¾6‘2Ú|pÖ. „ûêWþ0U]:ñT¤kJk)±ÏÈ 7¶”{”HR>ÇC¼h3€îÈíÙ³Ú™.xpþ\<&Î;ïºJ"¹-ÜÓMðF棷t.¿8JNðÆåÛHÕ­õcr¾R u'ªÍ³ˆ‘ }‡a®¦¡‘eÜB|§ÎœSß`"#Mž’dÇ0íL,“Éâ3€A8Æ*0Bþ”øÊ ›g&rÌŸÎA8J¼ðXÑÆ·ªZ4·|Å⃇öÍž3Ïô9ç(ÃvAX¼ºvëUQYáÀ$ƒ06‚ÝúÍÛBÂÃi„ó #–^ÂßÒ”µ58_‹'àÃ/ Ï¥ÀÄA8†7$ ô?pÎÍú"ƒŸÑFÚ:þ;Œ³ ðf ãĈ$8›ˆ&L©1Ë5@† Ìæö úÈ-_—UÕ̆pc˜Õ&³Í9¸|Íúü’‘«7lš•;nÒT·vÝ&>5ð ÎÕÔ7uéÑ{@Æ0f¹1ã&ŽŸ0%¬t«×lHÉpã0%£jª!™*°á¢ôOØäD¶|8Ž áj/}ô5„±u$e‰„IaŠs„# ¶:Ž„fië¶çžwâpd8/ÅD"q<¦bñˆï]Ð>špR0µb:­[³~|Ë„3/™»tÁìEK,_2ټًÈ7Œ¬„õYóæs«³`åŠ}W9|âøáý‡Žì¿bßÎm{v•M«Ö,œ1sâ´éàT:uΔIÓW,[¹háüå˘3f¶´$²—_iYÌÞt©B6ªß]øPÔÂ$>Lôݽø¾|õ@É"ž6ûáuÂ$âÄ 8Gˆ*Êj«DÍsêÔ)· MÝ)ðS"‡°«gÌ&•Ÿ6]ƒ:'gD,²×šðQx9j/û3ÑdÌž»oßöÆ’ÂE%P-ª&%±`©}³ÎêN]%´ënuSnñͲ³lÙ²§[m`˜6ZãÖÜE`[Üoø¤0XDø¼§‡aEî<:”*<“ažÓ¤‹ÆKG=Ï<‰²8À|{ýSŸ¥ ¶@î½g^Y¦ê„ ëCñý.NRJô®£j˜ÈŒ5èXU'm}?m'„K„ô¯þQø:zý.åo’(ÃÀ¢ ´ŒPä3+èÂþò¨(xà!\W@Â1ÎÊ´dŠp'‰¸c å¾Ì'çûðz©@œd54Úû»òÊ+éZMï82÷D)"®L;Mälã` ä&L™^]SÛÒÚF†ƒp&‘TV„ЗpçwúŠ"n&R‘ÀLkn h3P ‡õãQ_×âÆ¡;ŸŽH&¤”ײ±í-ìpê‰zUÿ—üÊ—= „K'Å)ÅZokHó-EëýÉ;Ôæ&M›GøÂÄ… ‹Çâk7éÍl¿‡¢ù$ˆáÂÜGgší#`À¼·Ã³Ì÷ì rR³ÞUV ,x{ –e„€-e†ÛºpÙJi·ç,\’Š}Ÿ¥ž.(-·3,;ÏÓ]ëÖoæ–2qÒ48×ðP·LªÓ@aÞ(Ú—”?ž =c ½ãÈs”“„6Â܆MÑ€è ©­àÇÐR¢2hPhäßùp";\Èpxê@8táÞaÿØ <£ÍDtyqкmûΞ½úŒÄ $1'ÅæFºƒ½û¥‹f/¿ü2»5¦­¤ °5cv]UÓôñsæM[8 ×7uÁÜióa3&Ï76IäÆtÍÍhÒŒi³—,Üz`Ïêë½òÁ»ï}ðž;Ù·vïž±'·Ì@TgLŸ<Æ~e™3sŽšU³¦Nl¬ÕÜÔàK!f¹Ü;dh%:…'”ÏÙ€}˦n(-D옴¾ÍÈñøì‡ÿ$¨ö¡M3“ß¡þpðGëY¢ž†Î]eÇŽ1²Y#û„mDµ‚4…5pQ9YãÚ†¦ñˆZÄvDšÂ6Ì쬨ŸHbgHÞBªc’ÍĽ@2ƒ!e*6K”•Ï]Î'Å¡ Þͺ/§hì'LDZ XyŽéYFŠ·Ÿ]§Nœˆª—G—³(œlÉp[¶î {›iªʃÈZJ³‘„—F8*ñá:"\Ú.ù~èðÇÿÓ²v}À5ÞU= ´XæÁ3Ï<“vzoµ¹wu÷õ¯ýq îfÞÜÄ£2éRÙ.МNZ†ƒ^ÜÁ‰hÐ °áƒŽ9F,ãÉÒFJƒáfIµÌ&bz¦;\’Ð]E|D>!69Dß1òPF{£ÁÀb‘Ì?2ŠþnÚ¶“0±zýLh똱°½‡îzűaÕ–-ÛÌKƒçCý¹cÇ.s×ÕÃ%/*0Á9ß)¸w"¸M…¬öç3½lù¢;ïºuÊT(2iµú+V¹/™Sœ¸~Ã&¾ÖJWŒªÍ‚²lùÊЗÖÕ7­my…z’íé “ðŸ´Øñqv¨zÓ 93Å}Øà†÷…˜Í(ÅISŒs7»ô;Ž3H·é#"¾Ý`èŠ=íP GзÕ#òš¼Ð$YIv. Õ"Ñ5kÖoݪ kÅèÑ|ŠZ0™S¦,]½ÚA·Z8räº-[2óò&Næ’¼uëi¯^³ntCcמ½x—j?qúty#ÖlÚÄAeÓ¶ítÒfíšÑuµÌ0“™„r’Õ­¢ªrãæMŽ@>éJeü7Î ¥¹1‘|ìŸûÜo§#ßÿŸåü”øÊ~iÄwÈpi„ .$6ûAkbu\æåK¢Â8‡<­]·Ã­ÌËùE^=jqñècêµüòååb Úo‹I^Q6zrûÌÙS)gÌâ9?qæ4ÌËØñ“‰,“&Μ1ž-M-©¦±-2+‹6º²¦´°`dIþÄñõóçOž5gâÄéímò—O¢og˜6eúì©ÓWr£'§y·€¦›ºð5-ÆÙµÆ'$>pË]HJ—c6Ú¡êdzxDÔTý ê>•ÛÆ§ˆGi¹PŸ¦ºË)~‰ñPà Lª¦*›Gb#.¾<‡ã[r‘À6½B¾ôj hçê .ð= 4äê|–Äa¨Däý‰`[³†Ä`l¥”|‰pAeôʼ%šÍ”Þ/ÌØü„ª.úÕ+#í97ýñ`{qîÈ pºË‡æÙ)W€D„¯îäU×~üÓŸ Ƀp&UX _á‚… äLk);ºàü;¾‹_9Â…WnÔõNƒ ¨wGÒâÝD|C¸o|ã çÉȶ—ð>sæ…}D=ÃSƒ‡PB8©@Î3 LV*JsB`…¬ L$9 L”€=8g~C¸Í›·Fù+ºJlZ0,fâNÿ@ÞòîC~ÙL®lmW× „%N^ƒ¦æ:¸yóg‘丙„ž3´”I ‚òJ0¶ióÖÒ²rØ䬴s"á¶lÝ^YU]PX̦býä RÜi"& \«‘¡.°ÒGÅ\7‰Ñ \ÒµŒYÝÐ (˜~Ë‘.6’&D¢¼TƇ oÄ»àìŠ Ä¾}rsáHÞpž„3nüÖ®cÜX¶jµB& —.“|»SÁÞ†- Â,‡p#ró ÖÆõ›8lX·‘ëž›\Q"AìÏ ø¬Y«7nL\0·n „SšÂA²ŽG-I˜Û´esª‚÷Üô™3“–á°M˜¤¨ŠðÛ¿ý»N„c‡CnÞ…pޤ¹f`ìspÙO¿ð ŠC³át›ª|õèÙÛ¼2£ð^=ªdÐÄpUxï‚äqg0I|)ÿ„`#³âa„ÁLevjŸÌÀ6­}ÂÄæ– MÍÓmmÛÜ0cŠ2­eÉÊ¥£jëJ˪F–%•ÜkªË§Möµ6µŒª¬-[¿uã˜Éj8EÏš‹ašØÖ>®¡~Ö„ñcš#®ËldˆT1½}×ú‰|cV²K*[72ývÁ 3•½Ö8hÞÚ‚v¬d#_´­ùO¡G6ânÍ -€!GƒMŽÎ#òßFºZÞUö£X‡X#k`$EJ rS¦]yåIPèCT‹&òĆ&ªÇ~x|„oˆOü¸)¯)]¼ S¡~¡ž5*7îõ=z©U#~12’l7å+ŽB‘ÞÓçL 7R“L†tŇ©v ÈÓcĈºPQ†Õ-Ѥ¼œÈpi;»/Ó,&dh)?™—ÿoјy¦ü|ùÒáÐî]v¸·åú¹ ÈQFãw˜¥¦ãEœ—Ì)tG8kõ£YKP€j° a„ = Lluhn\¿†§‰÷ê¥F¶Vo‘ø(3çÖÛoË-,"g§‚Š'®ߨ0±©ÂzƘÖÉ-Mò kmÛÖ êš«jÊëZ«›ÇQV×7Ö••åÕÖ–M›Ñ^ÛPYÝ2ººµ±º¥utc ɘ†¦ÉÍ­j=4²]75¡àzïÇOÚ2tòlÏ &¡-ºšäjS>¨¨µëå1I’ŒO¹Ðl0‹¸O_ O4*Ê(ÿë¸0Ãüàœ…5“³4IñÕéèí£äVzõg˜¥Q J&IàR•=’l ®{ã7Œ«cÙÝ‹O^ã0 D2L÷…JDí771øáúhÎ{&¶žƒ/=KTˆbiÎ\ solÃÜÍ«´.™/}”ÚóíC”yùÿV†ƒpBd`CX Ûþ—ÄÆÍAgg+o=ãR+¢w¬\?üh@—Ybšz;B¼ÓáÞ<ãµt¢YBŤ׊÷×éˆçDrß$Û›)"è Aåä;¶Ô•‰£¹Ø©É•´Y­øÌ¦³æÍåÎÀ'TÔq„:*ݤjâÀªÅò:Ê\¬X´–‘š2Ô§ áOdÒòñMRvÑÓ¹ Ê;YÄ· FÄ8Ž” ‹(«‘Ê•³KJ)GeJÓ2š>‰Ãvt “ìè…Â@‡¢ØK ËA˜âÂPzZR1iìDܨ% òi„ó«ÙŸŽ bF?̬¹ XÚ}} LÙ©2â‰z$ÜÍß;ê7‹v%Œ ç'¦òùsçÒµ«×$T²=%¡ -*(ä¨&6báÜy›—¯¾bÓök6,š9gçÖmÀI•¼Ìœl&þ9 æ#©›·nf›7nªU ÿ7®]çô-6®[³Öþ¨ÊªÍë73¿¼mÔ»›·L7~ÕŠ•²FæË…/RÍ‘Þ`ùlSîö;îÁ “á^ùØÇÉBwÔá‚é´Cn¬p!Ø… ÇG7iø½¯Ì4³o'½8X^´ƒhŸN µvrbeEÞÈ¢’š²Ššò‘•Å奕¥ù£Ë‹jËKG•QGÒ$UVgUÔdŽjÈn›;vJÙÌÅÙc§©ª+oh¡I®«®,/Î/Y4rTyiMUéèšÒêÑ¥¿•Êw^›ÊËe~-FKÇ?ýjœq )F9o^ŽŽœ~ÅÛpë<дò0”ŠÖÄT–8LòÝànÝ~d&#÷è'°ÁÇùÀ¨"i€Ïß¹âð¸.įØSyä+]1½FÌœ_=Q¦ @vëÐáÃ3\ ƒF«Aœ²Ú L’ „$[AK®hx¡g´>¬_hQ|ß Å3ˆ{äȡںQ3fNY¸h.-¥‰*âkm¦Ÿ•yIIåR‘eSh#5"WìÄk"~Å÷Ú|§1°>Z¨ÐéEÚF"lLtz'§·@JÛ4O—þø#@GˆB!îKWn0ðP]ùHâOÆ *À6u⤕ËWL›4ytuÍÊ¥Ëðõhƴ鳦M·Íž¹fÕ꼬ì Ícf¶Œ[¡âzëø¶šú• ij&•6” ‡%MÉÓ¦L•B-gXæ´ “6®^[•³”§µ|•óTHÕ¶b7‡¢œ<–·YS¦9>º¢JÛÂܼݤÁM’ÍÊéaŒÒšÉß-%„cK£‚pd¶ ›€±ØyÒ^ü­Q´éˆpI¨@Ê5h|Þšm$¯‰Å>‡mAûl½\ôÑq³œ e.*/)RYv¤Ç™WT˜SZ”[VœWRœnûyhIEßÒÊž• }›'Ÿ±$oñ†²5»ò殺(·,·¶¹´bTI^A‚…eŨ*(¨¬*¨¬°#õAEa~yA^iIR‹ÇØ:.A‘cñ«ÿKD³ÀçÌÐúâ:ÚÉ ]^T.Œ<À(…—ý`Ú" ͇æW?E)c§ÛàHrd8W À‹«ÊJ(dE.rk@lC¯¢fSpöãÏ”ñ¥:²4¢'fËwd,/¾ū >C³6Í¢p?íh9ˆe±ÓÕâ¹ÅOÉ£K-ÑÌmäiá̱0¿…¿‰?Þüé Ÿ¨"ƒ£Jæv*…pÁ{E<Üo@Ä÷{qŽÜÆßƒØB€è˜Eæ—ââûÙáÒ´÷MKßòRR, ª°ë©ÂDºÇnˆÚ”×4`БáROà$‘áÌ'£1úiwßdŠ*c– ÙvüÉašÓ×ê k–­^N†ãëÇkÞüÅ&´¼vÍ&mRÊÁÌS$¡ªReð6ùøräKD7 LÏŒTÂÃ×­[#•+¢o`Ô›\QÀFÊý©]Ò/ZJ)h­ê@ÒDzûDõÑ€‹œl¨LJFV%’œ_iÇ֭ѵ&‘¡#58I.¼ÝBö¢·´¸SháC ßQ°ñO1âáÈg®•F¸Ø"ñ¼%À˺&¨ APoŒaáíxôq99YÙeEÅùÙ9y™Yб¶Ö7Úfç–U–”Ùæ1gÆL¿6VT×fµWU Ë-ž;¹elƒ)qÉ¥x'ŽE¦~ÔgÓ躬AC¦´›5qÊ€î½Fææd +Ë-ÈèÝÏÁƪšìÁC«KF:RUTê§ã'Õ•W¹\¯½Å.òb#$ÃÂaž~Sd¸;î¼Âa¨?òÚ'‚Є‡d¸JïLwìÓYã§ŽÇ ˆ~ÛóôX¢¸v¤g{/È!š^7Ì‹›à¢’â²RQÅð(¨dMd‰â¢¼â²¼Q£3FÕõ¬nêÚ8±ëä½o°îàÍÇr¶±tóÔý'û—Õ–VÔ—ä–´T¶WY6²¤¼¢¸ªš ŠˆîÊQ„:ÈWU™È‘éxžÞ,¡“´¤ÕªA÷JªnI?¾ +µ!@ŠmŸí‹ÏÓÖ>e»OL'0ÌÇ®‰QGÐÇ¢gN>&&AxÓF¦p Hcœ Kr¢<óLœ§É˜ñm䇥«–Íš?[muBÁ›Ü3fΕØ ÆN›:[êE‡­BÜzî9’I&*J«ÚoVwd¦QJ)*b20`„æ="kª™Ý‰¡¡º|ÕêeœM œ*Tʈĭ)Ä£YÊ­f4¢7ƒX2qŸèf®ûMô´ñ,Šh@µfl³0³™Ðî×·¡‹'e} òòC‡–="‹ÀçÄŠ‚âáäÕ“šÛJ³òJFäfRœ™cg|CK{]S^ÆðòÜB­#úFCG—”FyYÉXT®ˆz ê˜{¿)wç]÷ñ1Á;ËNdÅ–Þ2lþaÿ¦;Žå?1þ§P°#Âá:¢Ó,„€Ž²QZi‚‚ÎCÍL•Ö9À½%ûMuÙȪŠQyÕõY mƒZ&÷š4¿×¢½7î±ûÚËöÜxéÎS}¶ë»tË'~pzxã䊺ö¦šæq5M­5 Õ‰ÃÇ7ºµ‰U«©‘çFx¸ âáj9Jì„åé=K‚dáýa3 Œ¥Ö4ñì·ú5Hð)±Ï%Þ˜®bꢦ®m(ðõï{ñ­ùõm;1í3™v˜d™{[íùNœ@ºˆ1• #`ÆNrш[@ÓRÕ¦ZÃ’mqÑ)Øx>.Ÿ‹â¶á0â A-„6T"©Á‘ÈŽKÜEx£„«Ž«„ÃN `(l‚]kœ áŽ;i"™Qp§"ÒJh ͤ<â<ÂDä•£Ý(>0@»wû /âñÛÐÖ0uÖ4ßXkûØz_Xc3O“ÉSfXÅf;SXÒaÑ>cÛ&·’UÔµK¯K.îrþy—t¾´›š2ʼ™Öl–˜CfŽÌ^#Ë‹ƒ‡Ã–vwg^¦ØÆqU£FN›Î‘bûò¼+£xBªjÝ™>¤‡èFŽ1##–3ÌÅ&·­[óñ§ã4"ž!+ Wštå÷èCõSš'õ©xDU”¡J#~%•ˆr¦ñ‡¨gËìj$àOH\^¤Šï-¾"l<®‚´ê휲r&µŽêÓnl!“‘«@0³ïø”ÖvBX]Y%$ËèÙ·©¬jnýØucç5´/h›ÔR6ª¦xd_9n†¼]OYõ•ñmɉ€­¹²¦xxvEnáøúæquMZÆŽn°–çŒÌÎoª¨ž=~òô¶ñSZÆú©$3§,+¯ûÅË ;È™W‘ï;j ü¦ Ü]wßO?™F¸€±Ð[¦­A}íáâ§ï¸ü°Ãåäæ3’…Ž+ËæRÚö“›Âg1I"6Ü|@ßaÿ«ê«FWR´ËÙ,MöÈQõeµcŠÛ&çNš7lΪ+võÚzü²ý7ŸwèŽNïê´÷æ‹·_ÕgíOüøôü§j[§M3u|u‹(qü2šZFKé0vLÃxy¶[Æ´)ìŠ ]¢lÇ'l aûeKâ¾ï#e#WûÐjÇŸ 4.Vf%…eˆµÚI¼üÇ%ÓˆƒÅôæ=÷|j‘„SÊG‰7¿Zþàþ+/?äýá·"ÿä·þä;éU.JÇ¥¦L¯Ñì›ü§_úÒWþâ/þJþIÉ'%›ÄåË?)nJRÊo~ó[üÇbkÿÛßþ3«Î .çB®þúë¯ò“Ÿ”íS"Ê_|ñ¦›n°!ƒè#<«€S ×VaàÌ+)(˜_ëÓŽHƒˆOïD ›­ñ ó,öÓ€h2Ð]³ÃÂ1ØLR0OpúINÔ8’€ÜOxFKI¶ 4]Éâƒs“¿Ÿ–2©Ð6O¦Ä$Ã2óèJÉTg#= i ‚ˆÊk2,„Öáºuó¶²ÂÒ±McŠs Ë J¬µU£Gá%ó‹ œ‰/>`¾ ,Xð ŒÆ^¡÷jr{µ#igÙ²%-ÍTê%ôë¹#2¹0ðMÀõ×ÖÔ!…ØCJÈăáò¼ü’‰“¦«­ÃJ]-³qŒ¤\d;ŸlM ­³H“§gf /+(Ê‘=ª¬<{èÐúQ5õMî‹p·˜ÁL­¢¢ðnM¶ÁEæ:Ÿ˜)+)¥ÄÜ@My¥®†Ê‘1”¢oõÊU*oo›¶ÃõéÕ»{×n|&MwKÇJÐýÂó/ Y\x ŒüÔXŸšpìpi-e¸E–‹Þ¢¸¥£ì$¤É„:ÃGpó®,,)ÎÍ×auEeÝèZÒ€‡,ß±¥(/Þ¤ißvÏ“wÜ÷ü}&Vòù⮜ŠK4:Q Žó—¬] ä#ùÈg?ûÙçž{îé§Ÿ–²ë¡‡zíµ×^~ù#¯¼ü±~äõ½ú‰×>öIÛW_}Íú±½nýW?úqk4xýµO%eŸ?õ™'žxê•W>ªºƒŸøÄ§äõŽöv>êðÇ`Ù'¬¯½öq&w u‡Œ$מ}öùk®¹ö÷~ï÷ÿðÿX{ ž{îNž÷Ýw]-‹7J×bp[ÄŒGr²01Fl€ýHt™½95y!{¿øWN^ÇŽ_eætD¸˜céƒæ^G„û¯-$•FìtHÜ/5¿¥ba°6$ÉÜ8ÝRñÑà¹`¢Ÿ8‘O˜Äɼ‘Ò8¼‘á:þ¾ø;Plj\%¶ ³R‘“çžÛ·g¯Í«ÖŽè7¨rxî̆¶éu­ã*kO™ÙTYƒKpG(¤’ÇŸ—fÇ»ôŽÍ鈃IU>÷ŒT‚â…sg£ÆÏÊY5}öøªÑãkê–Μ3pHшN ógñ8Ÿee#:"G)郫jú röùuöù©²ãgŸ{Æy}.ë5}씦òºÑù3[&´—ׯ¨_6qVñà¬úQµ®6ðÅ\öMDBA(ôìØ±(7j²F&‘‘Iˆl¹ÛÉî;hõŒy“«Ç–U/Ÿ2Ë-/3tUb-À¾©†G¢^<=¨_Ï$cÐ`=ô®={÷º¬Ëå½ûöáqÃϵ¹jôD†çÖåO®k)Í/diÓ Îçl¥ÅAS\a”9-§£ÊÌ1dp¬÷…G Ïk/­®Q8:«°–oAN¢„ÌÊ! iÒ´©Bo!º÷àUwì=vbÍ6ÛÕíÓÖ·7 /¼eç¡¶î?µq÷u›÷.mž¸bÌ”ºŒÜ fß¾óð©ÕÛoÚ²_û²F”îq—¼CšGŽWÓpݾÃG7î¸jÓîk7íÙ9sÉ´ÒÚ5c§ï™³ü¦íW¸ÊUwZ¹iͤ٭…f/:¶e×ÞUNî:pÃá+§«3ÔØÚùÜ ÎN„Pï¾çO|æ·PœHÜí¬ŒpáàH ;ILÒK¯>üÄsO¿ðQm_x9ñÀtpÏÞýr ãœŸŽ”T <›xoYC-™6̤…¹ðîKûæ…¿Ÿfõµu%YEõù 5¥{—Nì1cs¯½7ž½íšWÜ}é–›/ÞpSמ¹ÿÞNÛnétüñN;oë´õÚ¾»oÌ\sô«?>WÒÞ<²½½°vbiÍÄQ5¢ ꪫšFU4TUòÃgER9õ3R8»§k—V²…û{Ê(&Ö/jRŸ7‹ŒD²cl1Æ~zõg„WG€,µ¨0ÕB}K :ê‘Êf’„¾ÙIÅÛ% ±é$8€$mzÄ TÕ%žœ©<±„¢5öÕ?”®¡0 GÿTWØyÛ÷$¼Q¬ì‹â&Àv„+„Ïø9 qÀ–Ì6¬-J‡3¦†ô–ZE¨fé.ñCÙ›ÖX¦Ì%‰cZܵ›B”袇ȼâàQߨЄ¯¢·cQ•ÃùQUe"ÏÙJ/ KœfÁiºáfÖ¬{ÔÀ­ÿs„C/ÔŒ ¶{IÜ1P2îËeµsÇÞˆÇDhP"ZÊAËÃB¤dø;yÓ̰°Š².1žÑé¬sÎFÁ‡¼~ÉŠÁ—õX;mÞó·Üû…g_ýìã/|âÉç·¯^_U:rÓ†\{÷êoŠHê&ú ^Ƭò}¢é]tÉÞè»t½t᜙³›[WO˜ú‰ŸøÔ£OêÉç^üéã§Ž©®›5~òéÒÇðl}à —UßÒ&:µyìøy…»öP­T$øygžéy—ö½¼÷B5{ÇÍØ¾xÝ«>û…?õûÏ~üÓ¿¸aö'üÌ@,dº£BDeB€•†"QÀÞB}Êû£¡®­[´ìÚ½‡>r÷#¯ßÿ„õ‘kom*©Ü¾fCS]òÁ0bþô-–¸7ßú雤½™S§-Y°0²Ì©†>Smºe’Ηï‰oé̹ÞtÇË÷<òÚ}äÇ…Ö‚UŸŸkù¼í¤óE-%Ÿî$a±K2‘Ï›+£üÊy‹êóKO¬ßñ¹‡žýâ3¯~ùåOèjR}KIv^yÙÈ$EÖT HaQÕãÊj®^»cûôEK'¬?kJqͼêÖ9UÍ»g/;´xÕ¯Pj~͘Æ!ùË›&˜³bûäù®Ù=wùÔʆæÂòþ^V8pÉo¨ú#¶o™µxË´;g,^Ñ0aìðâeuã¶O[¸wÎrl¾Rέk›Qݼ¨mòÕ›ÖÌœ¿jæü•³æ— ÏpL€äû˜oVáÞ‘.®cÜ0â~h«çð4APŽ}È.Kç•W_‹ DdRDÚvD¸g_’câUÁŸüÌï@¸§ž{þªk®æÆDÏÒ…¤†- Ie©iš$¸£é+öÿ7+NkKUãhYºZj&TÖήZ}lðÞ[:í¾®ÓÑ{:­½ú¬­wœ¹úÆ‹vÞÛiï}=Ôißý •ÞÔ2”¶qãzåÙíÛ=¥¶~AsÛÃWßp߉kï¿úúû®»ûß2ªvÉle[çˉ2žºöú‚’ÒÖqk›Züöö™sçÉ0"ö|û¦m+/_0}ÎBˆ0vòúÙKzõÍÏßõ M |÷åÃhW¬tâ"Ó›ÆÞwâzüâ]Ùn·lüÈÑÕÃòî8|ÕG®¶Þràøî%kæ4¶7å•Ío÷ÄÉ›ïÚ{\·×m?°¨}ŠÛìwI"ÃÕ—SdÝ}õ ]{ËC'o|èØuW,\3wTËŒŠ†“v>qím]s ææÚmûgÕ·ÁÅí“ï8q-]èó<úÄ÷1ȱÌqiQçE–p0 '^óÍ ÄT!ÖÈ-@ôÃ&ùê~]Ëûå¥|ð¡Ç”é’ƒ{ÏC¶ò÷«@„Åîˆpu!Ã=÷òkîéç>òÒG^×RRbL~ažà«Ò‘|¸–$¦¸T””„o»Ø…ê2íw—6¼… eÛ–7ŒîW•߯¦T§É[¯Èßzøì5»:í8Òéè­¾gà©g/ßwÿ;ïî´ãösŽ>Öií}ôÌ£÷vÚ|¼Ë†c«ûäK_þ›òêI åÍj[S­uUµuUD#&Œß¨¹D&©xÞ/Ò’G0©!‹¤%¡Ða†­ÎÁ0 ‡á0d²–,a|ŠýÈ:é¼ÌáèqÑ-õ+5€A»R˜hÐÛ.¤Uùb¶ñë6Û'%Q³ .'Î$¶aü¶ ÓuúÏ€œ8™MÂvpö !€† JûŠ<¦r²(uR+ퟛЋ€:·žh)Ñ0ñÏ4·“•gAƒèï$ÿKš}±“Ž—g“1í$YcÆ)wuËw‡.Ôã¸ÞÌ1;Ô ¦Üîý§Ïž·~ËåšMË›n»úIMùßÈœ&ÿ>„ûÂ|?âÅ–IOÇ/QŠúð(‰œ:˜³'²´1}ÝrËmá€ä{à´”ŒC´‹7M uÜòy  ›PYw|ÝvJªM³SL-œ6‹{ºh_ðÖ§÷çª~àÀÁTlJâ, WXžzêɽþÛž½º®Y¾dzCÓÌú¦+7íØ»bíîknÚ*0‹fo¦òW“§ŒkMvõ5×J¢¨iyu­àñk½û`Û`à¹ìÒËôê7bàÐí“ÇŒj˜TÛºwå¦]K×íX¸ú؆]“ª›Û›p…%€i±Š4Ÿbˆ•a9#ž Ú‚R5œ{+*—Ìœ»xÒŒ£ë·ïZ°rß’µÇ6í¬-,[¿leUJo¤¨ÙÛ÷‹Ó½»÷o}{÷‰º÷ìqÁ%ƒ%]×錹§^±nËöE+uµ{źñ­mGÏ$òR"p‚@<*~O›ÄiTiµ§úÓg•dŒX9~ã5v[»mÿšM „„šDž€·é³g%^þ5õ-ŸÕ6ê¯À=rtAéØQuÎiŸ´FbÒ±§5m¯®/šÅ¨¶}î²íÓH䫦Îo¼+{^ÔyXŸ£ K« JVÏY¸hâtêèeã§O)¯«–ÏVO›»tÂôõcVN™=«¹½©¨¼±¸büèÆuó—´×6N3nÅœέÌ+0ÐÞ6ì%¢¶1ÈE¬='?ìE¢æò¯ky?„»ÿGNžº~æÜD·ƒG¯Üºs:×Ýtë».Ì$èŽDïL#à7<;‡òãü Ï“<Õ}:.(å0K“‘hn­˜ŒQ$ °„;®Ž„þœ’—vA³Äösî™.;ëÜÜÁE“'Í_ÔsÁ²ûŽö»áÎN;ž³åäYëNž·õú3¶ÝÔiçÍÝßiû_ùx§C·Ÿuõ]l;ž±ñÈÇÿþg.ìÛ¥ÛàóϺà¢óÎ?‡±à¬Nçœwîç]xþçŸÝéì³ÎHŒ` ápÛ°ýðïM/þŒP™`Îâ##¹?£‡ô j¦“ß OSÔ,,Ùv¢ç81•N_±gxÉEÎètÆ™ÎöðRûV:!ô;.ß‘î2iô¯·8É¢g·K$®Œ§.¦È“vÅЫNjˆ¤êé2 gžÕéÜóäÔ•ÕÁ™òÙ&=ë“CuêÙWÜÑÛ–Ä;Ü -%Jñå/«ýûÇ„ëì¬|1+ö¹óŽ{eÐÇ9òø§B æµ çaa ´Ã}hÆ87 _R•ûâK/¹ðâ‹æÃ3Åãñç¶Œ¿ÿä ÏßñÀ}WÝÀaùœ9¹‚‘!çF=0ʪN€[Ťà\bz¹®]/ïÒå2_88èÖý²å‹æ¯½tâ䇯»ù©Ûï~òÎ{î½îÆc'ðè›,Õ‰°mþMºþ†› …]¬#«Få<ä²Túps{`ïþ¹CF,™9Jó¸ÅSfßwí­ÏÜñàã7ÝýÈõw,?Ç>Îäà “Õ¨5ì`âðMì¢,}lQkÔGB®JB;óòMŸÍã™Ûï#½Yo¾âxu^ñ†å«jkû?„{+q IrSjgOŸ±x¡4T‰ÖEá´y”ÂË–&üé¤ÉhuëÍGNÞõú¹éàqÎ/…á|á´äÚQwˆéMŽÞÏÌùó ´g^8xøŠ‰3oÞ}ø†W0Œ=píÍ<ò·QºbÙáfΞŕT0œKpá&ÃÝÆ–l][9JÀ@¯.Ý6p°èlñm|&'4¶6äÒî…ý‡ŒÊ-*‘Ë÷²÷e]…´Ô5ˆÆjðŠÞ³_ÛÈêÖâJksiUM~Ié°lÛÊìúäÆòQð¬hx6pÍì7¨"¯húØ õ«r ‰˜Ó§&9Nq<8rHFD|Ih»ýö;=¹Žæ3Ÿûua[\÷ýNõê ”h„T DJOGJÞÏ—Rq¸—?ö ’ç_~%cø°s.<·gï½út†ñW^[àƒ¿óÿs;œj[_üâ—}çŽÈ{Å#_ÿÚ7ÕzW1Y‰Ð7:k´†œNz#ƒKPò裋¶±:H•LG²kÇN˜ˆ>2lQå­X¶üøÁÜA&qŸ[µñÊ-»9ݾgÞÔTdIÐqvSœK<óÌsž"m&4šOOMK¹y³q%Y6Lž2~ïÎmÍåå•W¬Ûthó¶c;vRO§®I@±ì[\7i·€¥4Á*Ÿ©µ-]ºr2#ˬ¸ïŽ«–®\2oÑüi³'6=nêU{ݺwçŠ ‡Öï+¸|t^ꃤPzQšEGš"ÊjXeº*îW“—“K+HGGöºzÇþ;]³sÙÔͲ|)$ ¥•Š’Ñù¼s’"^>EµTÃfióɼà¬sVÌ]xã‘7^qì¦Çn8xä°Ã3_&..´”éê9¾®àû°¤ç\p¾H €”Ùw áéöWR?|ê–Û¯<…ÈÏÍ“œ¨E…Γ'©8¦uVkY0,‘GÆÌ£;~,ÏÄ)]Åæªò‹9×€7G8Î :Lð8æ†mÕAè5¹¹­NÚ©œ>/âí@ ÿÒ¡’ð;<àÔ’BX¤9põúè' †gÑ÷N™”äÇ¡- ½Ñ M1»XÝx©}úÓŸ}ä‘ÇÄcqxÃ0|=MøRâ¦1ȶlW¼=qõ/‡‹h$ îG_{á¾”/gåg÷Ïè—•3¼ßÀ^}ú÷˜ÑwxæàÌùü*½'U^Å5¡?ŠTØ…ìŽd[ìX`¡7R˜ÍËWçkï¾çïOŸþóÓ§_ùîû«ïϺã™Ü}7¹ö`§=×tÚwªÓΫ.>ñàWÜÞéÐ ŽÞpÆÞ«ºn=²üñWŸýæÿì‘_•SQ74·`XVö5FdfÈÉž—?8'kÀð!LÏŒ¸n o,‘K=tÐèH/gkØ%̱¸C}×í¸Á¸Ç$2);[{—Ðy$jq$®e±ˆRªIq.ëÚ­ó¥/¸èâ³{ôì¹¹¹¡´´¡ddÞà!eY9íõ wMi9{Õ„±ímB»¦N¿ãŽ»ÌV× ¿ BåFdg]zYg2å%]Ì¿óE÷¼¼«TN$@ƶE:Þ²ºÂчO‡¬¯ÌxXIh=V1”!¡‘ *!-‹ÇÔñiÛ(Ë2FÔæóé(–ńاÁ¢%‹Sl²^Þù²sÏ>ç‚óÞÎ! ÛBy’(<+«.=ÿ±µl‹ o((›9f8bÍž—¾óÏÝòG]Ô;##§xXvþðì¼Y9Y™¹9Csreç 1lÐÐ Ái`ëH…MQ„8$ÐàÑÎ-üÐÄJÓô4lw¼Ç$Ï^ ðÜTȬÚˆZÒ"Q \¿~Dr!côeç_p–ÏáÒÎç Ö§K·  ê>tXÿ€œÜ¼2Å$IÓKú‘ÆN]â]ËÅeþuã­vp]47Ür{:)å¿ïcú‘á°ÃôGß$±ñ£•õÁýÒ¿~èà±|ÿGä1n&4“(lƒF„9dHü€ðÇ^ÊR‚ך֣KW ð$sÇ¥— ߨ­°°Ü!Ãé¦X_ÄTeöê/ŸâÈ*áðDD~!ß2\ªŸÄxä"Z .¡ágtRËJé'EÄ«1ýÏlU’’æÏžÃSiì˜v”ñþû$îM’ ¢m2ó:uKÐ÷¼³ÎfT#±¹ºV¶Ñ rmä6µµ½2¿‘“4&±:uŠŒ¬G@’­y™²ˆ¼mí°C "tÒãU•ÌÌm«=¢gÿe³æé™*6H(!Pým„{ëg0•/-.‰„L2²Šs»‰íãHalQ@—1¬rD¾ hqu¾jr¤§áÒÐ7(:„3B2V:]“6C²ÊÎÏ“a’Ðo)©,ÏȪÎ)âÊQ^TâÙbÕIáÞɺž”r(óåÊRÂ0†ë$¥IùH|$oi>M¹.Ù&5Ã(xòX ÛÒÚÞ¦â9oˆ²Ëºu:"“êQþe¾««FÍ›3`õ0²ºj΢ùÅE›·o“2Ê娠Ý;ŸOž¨­M²|5ÖÖàJ ’ò¦™ ®Lx&L8¤n¸‰$÷½ïýÀô£3ÃôëA¶w®ú~§>eHCP°ÒôEøè4½©«CN“§9y¿ yà+ÿÌ'úg ¸øò sò3«kGnؼjú¬‰•Eä!CB¸¬ìa¶i‰-v BbKKoAms -¸¼oÝ œÌn½vï!mÍ%ç_Úóòþ‹—í|øµ¯þÁ[§{¬Ü×eçÉKw_]|ÛSƒ7_3lÇ gn>zþÞS—o?–µëdéÆ+ûÒŸÏßythqÍÀC}¼ÙèuÞˆá9™#²Z3‡M*¦¨ÿÛúÒÐï…˰ÓücÅ0…H¶#Ø5ÿ?öÞº²ôºó½Å*IUbfffffffff(©TU*©TÌ\]ÕTn·ÝiÛÛ“¼ 8v’y“8ÎÌ'“Œc;v·¬÷ûînk:‰=ëÅ3kÅíö]g]8ø}û¿÷“TÚÜ“ø\Û`ž˜8²-¦ª˜YbÖhÍ){À>Y¡ ±1§LÍ @¸5æ–ǃ=Ü=íªk‹††» 3¹“nîNÀ–ñžM,‡Þ³y_LºŸZobN9ƒmÔHÞ\—Bco0“¦fÇ”ÃO!Ü1'óðHŸŽ®ú–Özj!±'НmÒ!R. ìÆncÍÂQè}Enï%p.(.œº·V–Ç L@8\¿R@çíw¾&CîãzZ¢*’OÁ9t¯»ž¥.%°GN CôS\yYfâÿ–’/ƒpDšHº%yg7Ï?|ðääúºcKŸh lc‘®ßd z`“@8RvpÄFÇ?âîì¢äWvGX òll)à„'†%ÈÍ‹ÃÁþ ä,ÏŽz EÆ”c"7ŒaF Ô(ÏKÙØP“˜ŸáîçO¢ Oj—“lj=óÌøR•“HëŠx©ÚÇá0#@cà3ìH|N˜#Š §¸ÑêHgb8ÁBNãÖ­[´ÙåLÀdÔš3@w'qÍßÙÂaÞþ¤[0Ù8$Åž ',¥pöÀ§ì òô÷oÀ!7[¢]€IRëtTUÃt…EE‚Cd)ý Q,‘Ìg)Š¢ãeCÊCK&È*qzvöBc²+ÇÕ™ZZ8"çü|¨ìË¡AYšzÀ0ƒÙ ðòsÃb³Š¡„3Ós³¹2Z¦Šþ“æÊ€ññ5±ÿí†î†ŠÔ†q7JÛ0%!±ÏŸ¿ˆëWªœ¼ýö—•Uü‹©ÿ7°ñç!Ü¥Ë×÷ J®D”ˆ ÷¯îùWhAðÊ›oÁÙÃ嘱^p˜iEþƒgnAa––幸Úúù£ÎÙ —)‘ÊK4ºPj"ˆEîóâNd¨‹ƒ£­l‡½•±…‘µ9%ÖlŒ¬ÍM\5ÆžE6ֽ͓K®Ãk¿õßþpw÷Á·¾›}é»Ñuÿ©3}‹aÍcí'.¿ñÿüg{ïp[¿ÀhgG'w´7oG'?Ožü'm=òPÚ=‚:ÊÔ05E.K]ð@ m<Ù¢¢^BWrÎŒ F—®lˆrÞdƒðw`ÛÄpCGv«¬7Sc3܃憺z‡@8Ss½€ w¨‡3gWþßÿü]M°A‘!`%õ£÷´™2„ûûÌžYó¦q{l8¢œÝp›q9êeEô˜¾ ܾ`ªž‹›%ÝR7N/þÇßùzGg ˜ÅsÃ†Ó’ŽŽr½‰óŠËŒ ©}Ål!Ž7pÈl‰ˆ$>ç&%9À(Gœm` òÒ ¸âø9âWã’½©KÓö4aÄãñ ‰Ç.!É WSrx4 ×YÛˆSMÕ‰N§¦D ¶ËÇ÷ÁG¸]¼î*·YKÆáŒ ¿cGu wÄII kÜ(p‚#b®1²Q÷Ê£°Ã½Ì<öƒ‚¬Ür˜ª÷31BpPgDOF'ÀLJ#Ê=GGÄØ‚–TÑ¡™Y°…ZZ÷Á>¬[®»³µ¹g*}ݰÃh)ÐÒÔ\UQ9Ð×_Y^ÑܨıHQ'£ë\G_ ÆÌÆÊ?4XúamïÓè0ñ fѰÑ[ûºû&GËj;‡úÉðïë©kjléh'¸› WEXLLìÛÏãp´w¨,¯ؤÆ)z»ÈÈna˜nä{0êP¶ Ç9{|ÿoî_Ô¥-á>÷…7Ýœô u=¼]°áfæÇ–§pçÀ}A©AQRÁøI+G¤¤ðiBý1&o„®D2»º»™;YØ[;bmibmhtªì žÛq\ukŸýØý»ÝÝ¿øh÷[»»oþ`÷ä¯xf+¶f yâä—~çÛ.>á!ñ––ŽÎ.ž¡aQÎ.n®^4ƒ”/Nû{N|EÀ¯!ÀŠrwF—Ȥ¬îvÂêÁ3ÞÛÄJã´91qØfÍøçÒØ'8' ©â!û¤‰#h*4‹ ë°4á€S}/GÊ.µwÖmž]ËÈLïÀ @d¯ 7VÀL©›¾¾ŸT„Õb°6œ³“‡ €§!FÆR«çÃa…ÕqWw›¸„жŽÚ­íS$* ¾8–XrÒ/‚“×Z¨–>ÄAx¢ëu{·ô“ªÜUA8 ?‘íØqãGt‰ÚÝ«ž#~¸OÖ¨Æ$1î3pbÃÁR’GöbgGïÌôâòÒÚÆÉM¤ ~ñ·±H­R„þ9Rè°ç0•à”0º0¡¦FÆVæHÉÄV°F¯ru.­¬P¶¼©5æ©mhmdJÐï˜X˜ç9:¹›„uHœË«¯¾LJ6LJŽ­­­’§‰îƒtèð>Ú&ÄGÛY™ÛYYZ˜›²616$Ì áŽÑ Í¡+[åvØ5ËñÙ€jm;;ÛgΜbƒòêÄ;ÁyÒÞÁÞÖÏ×ÛâÞÌ”š&Çííl0ÑÀ3L~øÌ3ÏàŠƒýã|¤P:¡•?&‹@Rpïa¸xúú€y¤@uRnkéðþL9â>œtùQ‡ÝõÑ.ü¤Ð°{=ŸÀ0 Ò5A(ýòrqã^Q¨ö›‰‘-õ©ÁB@ØÕ×(ÉÆ‚»Èî•´§BiHÉÍÂZ²4:vœ ~,flA½±)™¨0Š¡!ðü è"¿†%zIkcÓÜÔ4ÝsÚššéè¶²°Û99:Fü'V/UWV!qâ0àbì0È€4{€3.)*’å¦xˆFI£“õ­Íí½#Sy%E+ëk¤·•wvw¡£‚\ââ1^1j)½ÛRæ$$K‰8”éÉ¿ŒÀ­­sTE"cÂN3ý?øá¿cÂÀ¿Õ†ûyU»Ð©Ÿª,ÝW^}ãs´x227tvup÷rvõpŒŽ ',"(ØqŒ|Äl“ˆãA¤¤2üö¸;±fÄÀpf,y¸»X8™Y»ÚXÙ[7³9dçu4¥À´}ÔeñœÅàbíí—¾½»û_>ܽñÊ—¾þ?øÎG»ÿí£ÝØÝýí?ù»‹¿þ;ÒÞ=ææàGnï@{,CWo8_?K[\°ò6‚ A¸½àC¡+%&©$0÷îz®Ðâ¢@±áx±ÁÀ6v+æ”ØX\»tZØãñäèMÊžQaáˆ4áŽêî73?Ž;ÓÃÓÑÓË)8ÄÏÍÝŠ’DCʮء4'ªÙ?¼orΟ¼/Ø„hÁÆؤ — œ•€Ô¨‘ñ1´p=ýÃæFXÞĶ„GðÑNðùqDN\"„8[!`)ä‹N‘qÁਬV–=V¢(+ ýû±áˆ1ge©«g 9xNÚçî5ï–•R@*’÷¥ óg׆CnRQí¿ÿ‡Zë­‰ÖØ]ýÝ]ýl¨~Öe•(ÑlÂi„ŸüÁ| oœ$}3—–ϞʦS¯í¿"ÃàMMèPCe´ +3Œ$ðØÌÊ2žÔÒ´Tl8Jˆ©GfÑ×9 ÈõÑ¡¼³‹Æ¤«‹KwoÞjª«?¿µ=64 øÝ¸r“Ž`cS¨Í=]Ö4¤eš…GG±MÞ:¡.¬­ìlkê{ûûÀ¹ÙÅ…™¥ ”ÎÞž7ã­ž¾ÞñÉ ÊÑr!ªqëþÄþzƒ]KÒh‡ 'ÕÜ…'¸ 5…¾{öÿá´²Ó=n´²~Š!$½rö ŸþáþÙô†ó!NjšrÔ öŒ4U’ÊIèÔHœÿÈ4kd ÚÔÞ†D„Ãâ^YZ]ž¿~ñòÄØ8ÝÂ`-b[»; 2ÆÀ‚$¨9B ¨çîë]ÕPçîáCf ä'»Â«Ç®$~ТV÷©S'Ïž=SYI7T_{kzm§¦'ѯ†Rv´$LLN "&ÒÉÔ!‰ˆùÚo~˜—ÄxJ%§Ò«z{kóÊå‹Οëéé‚ö¤“u"ÿô ð¥ôAEUyp(áaÔ( Á‡Éàâ8 ê…Ó”U|QPðþÙ³g©ñ ‘ÁpÇç”[\Èe£AÛOÂßU4|’jäЯmná¢âæÈ„S6ÜûâlVU½“ˆ•Ÿf¦7&v>BJ'w¶¶Ñ}”ã2Ó@2Æ4¸Ëžå±½ûî»L*©èÊž`)ñj¨üVÝ#:& )ÉDyÐ_´º¨´,—r@ª'Qnaop Œ"fçO/oü^8À¨¥ÂšþxïèƒZ_[GŽŸÖTU³ 3Y˜_{  ]©|!^°-aâ‡# …øo:12ÁWå"Ò~DZ$-©~pÔ”´=ÂçÚÔÒŒóƒ˜ë‚ Åýælïà…¬C[Û€¯`|mu¬€Xo 9Â&Q§„gƒ¤*ur©iBàÉ/ŽQÿg¿üîgö qéÕÏ¿õÂKªŸV)q4quw!lËÕé5G,»Ø.`{¶ŽìÎITñïŠ-¥ lj\,wg;•Áfgãéàˆ6yÄÞ]™b<½rpåŒfdÞuã"ÊÂÝݽÿö†NV¾¡ôâðððñëèzü«ýßÿñÝ÷>‚‰?®o ‹CkV¨ ¯?ï@_¦€Ð‰bôìq•à–Ö¸!¸QŸ $#ÙÁÖcÒèG E\nŒD¬Ë6kÜàºÔç_v(t¥ÀÏÞë§9‚p•*³ £ KsM¡ãŒ¢âÏ6„¿ÅŒÑØ!‡ã€4¶ âɤˆ¥€+ÇåÜöÀ„ã¾Eœ&àı§¸Ù{8É¥ã iÅÇ9¢—ƒvˆò/n>-L’þAZžÊ„ao\¾T +´²º!Ba$âÂ,9'ÿ†@wåÊN†9Æl8%òá Oq!(Úð¨ND\Œ3±0ÑŠuÄö²6Wɱjú¹»¥æecN*³ós¾ÿ°”  Œ‚|Ú¨¾ÞØ€F‚<‰Ááþà,Ä-Gêœ-Ú¹Íá8+±áäTP(½ƒ7Ég`‡”šÌ+/‰NS ݈<„ž8ä@n…ÒíèÏá?d¾ž^P£Úʇªšû¡”+—,!'Ò•‘Ë—î\¬•pqwƘólóC¦+Jì+§ K c’í9~HzA^>õ©3ÒÒñVB¢ß`ãBI²9 ¡4@;í¸|:EïºÃx`D± TIõ?L74-i£ÃÙÿgõúë+Â}²êÿê÷òç^zý‹¯~þmªvQ5—rá¶ŠïîBl]7ÐýÑÆ¸¥Z#C&pÏ¹É !””ÃÙÉšòxl ýH1 D¸˜GvŽ‚p(Dubif¯ç¬›[}|ñ´fnãÈìfÏW¾I{­îî¶÷´zzÚF†ºXÛi9m\ä˜-ÑñI +kTÃBùè¤#<‡îíïIÏͤ3É$ Á9 ‹øD臲¨$o BàŒF5ß÷›0„Èn~Έ’ÖÚtØn©ÉŒcê1éç|!*ékŸ 9‘h~¢‰Í&ñ]Œ9Ì&X[4(¨B¢ö9Aî$GQ°G½~¢Í°ÕpûQä Ÿenz¦…‰)‘5 /ç Ö"U‰…AIBEŠQ 'äv›¤ÃUÂ(  á„ûþ÷ÿéÿ©~Ñßÿ[ŽÈl‘8H¢=уéFcJS>ûÂkÔ¨tv÷2µ´ÒFŒ«0r2¥}2”ÿS’3˜kÔJÅ…‰ÄßØØ¸{÷.Œ4i-¨,€ÀÄQ|5ÝhÉ3#2‚þ²Z€ékãfmêlâŸ`×8ttúÔ¾ùm›¹K_ü>Ãi÷ûßú«‡(“`G[wOŠqP²s¨·wxplffiyõ¥ŸÞ¿}ûÚ•«Ï>û¸ª¾º¼¦‚if+¨#|©s"‘…´DKº7#a#!QÂ:"¾âvÁ7#âíÍ®¸º………ÙÙY.«£= øýäÉ“‹/¢B©Y–ž.ñ̬Õ5º~œ'‡ºLä®}˜EX )‡„±'¾|É=ÀÑFd‰¿xîQ(0 ¤qiăë;I‹\-QðF’…P x€ðÈÉ¢Ò¬ìMMàFmõt t'¾Žôm±êáá²bˆu@ç€vŽr8rm–67·(ÉKLÃû‘«RÍÃs”rmÈåÿJ¥gê‰%§œâ‡Ûˆ"¨ë²ÂI\%F›´¸zóŽ$Æí±âŸÅXJjšàTçÊrWÕcÉÑe­©±4rëA5ä4Ê5ÎXJÚf ÂÑÎTU[MÍ "‘rhëPç´´¨³¿— ;­Î¨ó0Tª‹n^>´Ke}=ó˜ ŒÌ¢³Å1FŒ*‰P×– ¸æ¯½Ó’Âc" ܈R)./STórÁ T0öKÆ›¯¾ó5./'?>6!4$¨¼¬(>.ÆßÏ‹]abìÅÄP+²’Ì“–¶f:2Rò”–ªª´wYô©Øpˆ‰=„“²°Œ-N‰c6uX<š*8£‰P1r 8TUÀóóB##Š8PjRpd8·gÃ)Šòˆ*Ö§’ü4û -!*¡+©ÈŒ96à#`SF[½Û…y Ü3¬ùÓ™L2‘&86$8m¯^ŸŠ¥<|𘹠a Lì$Z°`#¢ª UK@ð'(Î./.!v15=ÍËÏ×ÜÚ]`hXPX¨­‹3Ù}¸Ó¨ÍDå§üâ7/Oü I‰eˆ*#Sê3`(cºQ¢Pep»¨ºš^ÞH4[Ä>QPàå‹qæhãžQ/)"$42$‚2(ÔWÀ39nlxÜ 1&¤ô÷òƒÂa\I ½xÂÉÂû²Áø¡k×/ŠMÿw~÷oE8²‘DâHDjûékÏ<ÿʳO_òü«”¦Ä†36·–Ï Æœ„Tà§AiÞ´Aô¯¯¯Ÿ¿xa{çÜÌÔ4xCl×…Óg‡{ûyÐÆñ”êMKåI¡„ñC'wo{´šUyÙº™Z¸ëGå: ­i†×lÏÜ ›½B¡“Ýww_=u-ÖÀ8ËÝ9ÈÁ&ØÇ-2,°±©fzajjafaeùÜùÒÄM õ\<³yöäI:sªrĪüʨR°´4©@šrY608Ä›…—œ¬= ždx°!P‡ºF :B— ãÂÛMg5° 8ÅŒ»qão2øáTRfVGdƒßŠÛl/#[ð+ ìᘠœ„xð-áEÑ 0àÈ&B›§RàôôôÒÊ2·„#„x «g~lòÎÅ«ÐQÌ ¬I €Õ*ÐâçBTªô8Gu Œ9 GMWdà‡øÕ0ã@V-5MBmÔäqEoœ>µqê =Uf§çp??¸}¿¥®©¬ H%2¥gHkIRQÉ(E㑜H欘q( œžÁDZ”¢<±½lŒ.6¤k<%»øWðï3iò³: Ò‡¢IµùFa«ª—T9Ѧ1æðxÑèÊ« X’Ìh‚â0ËÅ?„Àµ±³-.)³wp‘üˆlx|ú¤¥gûøV×4D„ì†ËúÆ7¾Ad•ýðbÂ`—Ào0L¥fûd|§¥g…áWÊ¥¯e¼ Š˜üì„k+Ð'SëòK_ú?iÐ+91ré v0ë÷€}‚ˆZ:.­¤”“ÉÌË/$‰¹¨¸”KÀdbðCB]vvvØ'ð¦Jò§¤ˆvŒçI*«Rw5!1• !Mžª.4’."\&¶YUu-¸Îe )HâÉG?5'ÆÕ‰F iÁùã8„”È•n9ÙÙYù¸BÑ I'Å“²±÷½RU¯ !¾höéÁÞü¸3LÂÂü¢’¢Rª„HVwÌÁÑY%D„Gªæ¢ÕuÌÏè˜8î@~AIAa1w€ûÀí°Ù¦_wJj&¿JMËâW®n^ˆ¡";Ð…w–;O?Î\e9¹ Ó-ŒÇʯ’¸aÙ9%ÕdÒS8­¬¼’ èYX‚¹Š£åŠøû!„„q째PÑË1Qñ”‹c°áÖ¶ )c:Ahs4-n kiVòå/}U:îý{½~Â]¹z“†pˆ6DF¾ìI‘;¢hcÆ±æ £0cŽ`´I ؃>z1‘ymŒš&’Ç)ã=LxW,'^—.]¿WVV8.HÀëì™Í›×o<óðѳŸp¦&&óáa´D7üJñ.¨GûÜ(r+µ%$ISû8ßœIÊ!˜e /± ''æ23²‡"JÜÒÉé©•3#³SÄ@]Ü:GQÙ/?|ñ…­«¯Ü|ðàêM,<”i"Ãa#Tý.7”‰†~)nBÂD9$GÔZÆÅ466%`äSTª·š wjgjlüÊ…‹ßø½ßç ¢ €FÑÒÒÒúÊê‹?¸xÁêlíÌIN#ð ADˆ29¦~k¼<ð=d×@®Zªol¨ohB¶Àüò ô'ɹ’@ÂLxSl8?õÑ˯Ó"N¶ùT2¾?ùpHŠŸp5ÿá9òä¾õ­oA!' nÐÒÜtÁEDX˜†tFô#ÑRHmÄ7@ä1 ƃ¯ýÞïý'5Eû“PC04Âæ`·”¾‚4=@Ò¢ à_. Îa\òeúA8~‹áÅ,b|3²¥‡¡PíJ4§e`!‘䀴EÈBÆrVÙYìÔu¾ÆÄ€—€BÕ’*bh  ˆìŠö¢tÅâ4¢£TçC¹.KÙ QðcmpÎÜNr´‹œÃ]B~™ZwUYñI¸Qù–ƒ+"̇SÊÍ)ÊÏ£r‰½KDx ÜËýGøHŽŽ[';5%Ž!ÂÞMà– ÖÒzJ*‹r‹ XÀQÂy¸WØåê 4’ÍWØ–S±•Å›D™””VòfeUø‡”$*¹RéîÈGYQjòÚÙœÑü<£mXRZfíJŠËܼýR³rs‹J¥F(=iY@A/oÿܼ" RrǸ‡ôñÃÓN+¥p@Ú§á`„ÄÏ/I‚pbÃI>øÂÑÝ~’þ•dÄ¡CXXÚb÷ªØq'²£l­m迱²´Œ¹öüã'¯¿ü R¾nýô)F’‘r£o^øùË÷hWtyí n]oGÓ`OÛ`/ÄojLbXpt™Ÿ7yq¶VN®/ã‘UÝ•+Ç·½§Ïÿ9,û[_óõ UÁÍÙÑMˆr²XŠ×¯_GúŸ:¹Aà¥e{[ï^¼zb|†ÖN`ê“k÷Ï\ É{gsëÚÚšxÑ¥U/"¦ÛŒIÖR5XÊCQ2þ ÌSa&á!ŬyñŹ:,¹ .pЕ×D“ê +®‚§Ê+àð¹ }zjàB¨¹‚*€ë“À™`‡“¾÷àâ¹ë—¯œ;wŽ7©œ€À^ž˜ù­×¿øâ…›oß~¸¦ek~Õ꘡gH˜3Û[8;ð¨àRO*¾R‘‰}H飼“ ~+ÛSgÏ1Ø„9xÕJ:Ëc¨ ¤©á÷ôÕÇ 6-[Χ$ƒSþ³ÒõßdÃa0~ó7St7^’ˆŠ©ÄàÆŸ,Åëz²=D¢¡#"ߤcS`Šd;æ3¸ˆIô•¯|ò‘-UÄÌ Q%óµ`0 ¬cc±á@8`€]!d‘æ^|qÊÑQ'ñ£EKì„qƬƒèWÀ*'·È­(¯9²2óI¡öð¨ KÉùàî–¾ŽXo쓽¡ RÓKˆSHEÚ ùúa‹ÐÆ^º/´ì QŽ_á²– 6^Ò ç%=´Ž§º)æ¸ Çu‘³A¤§”–šmgëL¥P3S+>År’ý€sXih©ìÔäþ°+¦Ä)„[ꀭ†J.‡À¥A!:±Q;ðrqÐĤ4°).©Þ2³òx‡ô<àÁ¼òŠXÇä” ò|% œ{¥5yóQ 81A8J]ðC° „cÁ’Ãz ÊÊ/JÉÌÉÎ/*,­(*«Ä¼cÏ¡˜ƒ…Êt–½q]\8!÷‡«MVù_Ç;Ÿ–ò2M´]•ÏØÊh·”t%¡’ŸùìS¢(_xñ‚¹“âéÁ{…‘±²±~áY÷øÁCeš3=±ÞVWWBºˆ[Æ)౉cD•·ðO“¸B˜Mm\>Ö öhG* L@;j½bú%•M$Wy!í´©*xc2ž8q‚y „ãÞ£X§alcI1=<,´=9Û7ù›—½½uûs·æ{†hЈw“H^ŽS"  ¦ q8‰þà2% P0U¥@xyfåå‚‚ÜwnÝž›¸sí‘“—μ0#»!¿”þÃo\¾÷úÅ;t¡¶-‰;ã(„dçÐʰ'\ïµêPfiahnjíâhëèb`bN,¥Øp¢B±0ÞxGpŽFÞªzŽö ÷?ï™çx_Ô, zAQþá~K ñ½ùæ›ØpÜ}F$•DÖ2|µ&N$0K‰%6X‚ðb Âyzøp°1õüü7~ã7 @J™$¸yÀLv"Åë£s‚I‚pLà%&”ŠáŒ£Õ=ÊÁðøÏ¤˜${ â‘s•¨¸vRB„ÁÃç"ˆ’’œ |‚ÌXƒÙÅÀ%À~ø—I]JéžÌ¥]L öƒÉÜ" ±ÐDI-AÝ_!"Þÿ}A& n^œ$ÉNÀ6XM.75pnþ§Ò’ªÔ”,Ž:x8Ʊá@8@eIà‡üœýp‹$&M›¦ê »! ¡=p[8ÎxÃtã¬ø„ãMÒúxºÊÊ«Ál5JOCTr°”p•àœ¹ùÂRr˜\ª?rnB@¨sÁ1þ0Ñ€7ŒutBrXt6y> XÉA¢b9;ÄvdÿÜ7=;„¥Ä™Çµ ÂósXùÂZŽª]RЖ…Š·±ç€º=„pA}¼<ûTuú~é5JÁùM3¤1“‚'H”y¥×¯^C8Þ¿{È Â“|Ý= :e|×?éxazåÅç_;qñ7¯=žoé¥k’™‰™£m}s“¥±ÙQ½æêв¢|o73wÿ£i…VÃËGúÖœf/gÌ]ý+m’Àµ;—\½I3wÏÊ(YÚ9w‰æP¸ÄþÄ‹ …ÑMÅý”£Ò 6´=³sõ•+w¡FžØÎ Šòsõ`f1È!âòÌܼƒ§h:m25š¢ULTU ›dð3¡8¨†ï LE¡äà yÂDkoog`ƒjœ†éFí28I‰pñÓ‚pô@v Sp~ PØYÛl3ÉÂEþņ#ÒŠ’²]XÉ”ŠÞ “ê¤I—?=9…3 GY0Zt±ÐÙ{%*$,?.e©¥kãéìæÓÅí¹ºÎXåò2 Å¡ûÓݱoz<).º0¯ü­¯EûØ‘Á•ã#[¶]ëW?ÿ‡ïîîþࣦäÇ…ÆúùùuwM¬­\:±z D9þŒ0kSsjÑÑíÇÛË×î[¸³xúΩÏ Ê‚bÈI¦ k( À ƒ'IJa HP%cu–/ ­Âö3/ 1ñºáó6". æÿBÍIi7"5,9 þ%5…ª=P”¼Ãû40«xGÁ•¶¯©¶|—J!;’#"dqï‘_~ƒvx.ð®ñÃGS~ ˉÙn}en륩3ÏÌœšnìªÎ/ƈ„ÅŠ e™hH<¼!b§J¥fޏÊÔ–®gAéÝÕ“ëããJSÙ8±†ÖÒÐH3 *<°M«,Ú­´ç”>ZÜüÊν{ã'VÛ+Òs+r j+«}øáÃC5ö#ÄÈ% öõÇÇ9L³iüp4áˆ4Ãö"MÄË+n`¶¡"à£ñò;WnÞ¥cÿ2&¥ Üg¥Ç÷¿‰¥ÄG¤ E á•öi e¼S \<žÔÚàÁóMœRPˆ¨¥âSÁtƒtwóAraF0ôÁ³Ï}îsh:ØF’|Va91¤Ï'3ªŠKÁä)Ùº?¦  Çþ1¿8hÓ„“˜Il8†»àÔ¢¾þq „ƒœØqÃéi91Ñ úb‚IåeºˆQf4‹é†“ƒéÇ®ÐÔ$–’ý`ÄP͈“ “0?¢º9%à ¯!pÈ™øòÞ{”@R/î*žê^hb"zŸ¶Å”÷þ—;Ãù`»T”×âŠäè®Â‹ ÂQNZ(JÖà+s *FIî•¶–5’è€wL2=p ‚pÚ~|’õÁAh”€d­m]@˜aA9‚yÍ-¼éRßЂ ‡§ «‹{%±! –„ã',ÂFÒù¯›µè’Iá€½Ššz3 $cŽ}²!j ؆¦‚uΆ ÖýçÇ>EwáâUQ–ņc½ÇOJ¡÷=~RdÐÝOî?zŽPAl8A8ž‰É57·pbeuuyeóôj—Óz£$ 9äPšéÐHýDëÀýÁ¥FׯuL^èŸñ¶qDâA-'së??(~[‹Ž®qŸ³Ñ“:³çMÆvüzOÿÍF»o½óš…›¾k€}bVêìü&·²|òñ£gf˜Mä­H»å1#ÚÖŦÜ;yîòÄòµñåk£K N>!ž*_›9‹ž*%¦€:È拤'óŽx|Ê\fÌK!cüvÀ/‚ ¡¤쟨ȢM2s• œ~ié U~@\à cŽ ì"P0Ý ¼a™íiQ» Œ‰³M|rðvõÖ½=„ƒ¢|÷½÷µÍ+‘ׯl¤ ! °”Ć@02xÞ eF$±–à©BÙáñÄ9†<ÅŒCx!­‘èì ú;fš µ¢0æy*Õ,'Ë‘¤šºQÀP‹(Ä”£ïƒpìPÁð¤@pc oLIáKA8ˆ /v"9›(¤ wN‰!¨««Ï‚”ǾÁ†#Ù –À"\l‡~{Á¬cÌ7^¼Éæ„Ù{Ãüˆ¡¸2µªИ¤œ…:A\Ì8A8¾Ov'E¶dø“`0ê*´'¸ŽÏO²›%„ã|è^„ GxgfF65Èòÿpû Âië ËõªT<*¤aþrQ’•ï3§5g¢ÂñcâÀon8ö%EçÀ\P°”SPQYÛÒÚ‰Qåí-IS‚JøÛÿ\PpxSs;T$)X]í=àÇ6:î|„ {ÂAQ6´´³ö MJÏBÀ˜ðÊ«ëÈð Ø€OŽƒò¹iÜ:ž#`‰þ+€pØg`¡%²¬A•†bA ÐUù•ë,l+úÚm:ƒã‡CQ01µd<óÔ†H&ïü¹âþ)™Fâ<ýóp Q¢²¥²¶:%g»{âVÛäÃŽÙ{]³«Õ ¹Å„P’¶ÏH8ªÙOx_UY®ÑñʦaÏÒ>ãÙ ûg/è¶­öß}û'ÔøÞ»'7§\ƒ-ŽÑbrzchpùâ…k}=½Hgt"£+—ú¥ÖªûU[yÍTkÏBkßõéz¦.õN—ǦeX¨¤p$Ì8s0Œ™K›Ê]ù©‰ƒzŠ(`Ö0£‘þ|™u4?à Ç,¥ÄaâKjT‚ê0°€®¶–V¬X@–Ð%7»èyÏÃÍ„>¼¶­µ¬{έnÒpþªîòMýÆÙ·ÿz÷½Ü…œ22ÑÚH΋£xìàèâÌÜ™ù¹`ƒ¡*0ÎA8"MÈ£]}1¤÷¤åmÏ®Ö÷¬T´Ÿ®ééË(ö¦ G”î6ŒjîÈT.ñ2°F)”²ÁGÌ,8Cl8B7™³¼Lj³WUéæûÇÛ1±t´ n;%R)qG¾3>9ð“®sBTB$*ÒR›r.õ01ª˜¼Ó_8Ž=Vü8ü˜ãP©|™”¤‰™)V}¦Š‚b× šï4ŒÝªÚ®è^ièI Ѝ¯¬&ÿÚÆØ¬¡¼ ?—EÉÏÙ!wIêLŠÿOKŽŽ´!ÖŸ:ãóËK•g··°;‡úú©QG¯æøÈh7ʼ¢é޾ÂàØÎøÜ»½óת8bsRniJVci%Ú ·”ú Ì~#3S0’lt J’"È7±²pð¤ãNPT\b{wßùËצæ×Nmž<³Å0[:q’B'TdƼ۾pYl;„òôÕgžI‚-yó×~8Éøþ~8ŒŽÑ‰ gˆàe(kû×d ýÍ iŽ:ƒ¸ïðaX`š€˜&Øp˜(Y n óU(b¢ÐLŒuÉÑV!ðZ‚ŒDßÇaF; AÀ o VŠÖ ©äçÌ.ØN„ã|سê £[öF å±c f%‘&`òš½Á ÿ‚|aô3QA&Ø 1W„v‰: ¯ÂóSÔCm¤þaJÛpÃCãHg¤?òÙ–üL„ä„0ÁÞ…ö¥Ê!ö`¥áâèé몮j(È/¥þ57ê_#®8XJàV2"dG(’ª&˜6ÿôe;[Z†JY5O~&‘ô ö`® ÂX°”P—|u ÚsvÜ(mÍÒ¬p€«×ØÄï?ÙC8@ÎË?(!5£ª¾‰œ¬:@®º¾)(,’]ñMŒEà“›Ï®0 Z!Þ…ãWáD ±l¿tfû<‡°·Ó[;›ç.P-„ÞVÖNožÝ¹ÃØpŒgôœÜKK+„' ‘Âø¢ðAn¨«Oø>ÖÛ²K–ÊZ/Uô^/ë»RÕ?–V–“E8"b^q¢¨¼²¬~p8 ¸Ý¹eéØôe³åÛi§~ã»* î•Û× 4ž&¥Õ…=ÝÝýSãÓ'ÚZ»`í$pŒ§€¨™ÓŽHÌš©nÛlZ.n¾Ð0Ô•Q˜¤¢çÁ'!” 3,ÁãŬáM9æšD6JJ“sƒÀ!°á€ 8&—”ªbW(…¢P2טƒä-‰YIUD<暘`ÉÁIJÅp¶%À#O¬+Á9UÜÎŽÐevˆ–É\Æ÷†Íé±s^ ¬RàY™Xе9E=%ói•êÇ7Rjv*z:’òA8âwWº%£[P–‰‡õÆ%ÃÜj©ášÊJ÷mö ÂÁRŽMMžÞ:[^Y¡Êbh˱R[ÇG úœÄÔOÿÞüÊÚÀ„¥ÌšgÛçÖs;Ò‹8`wo 4(âÔζ°œ4¥ê^œ›–ƒ©J“a‚?-ìÌ,qÅ¡VÒæx»tí&cŒmòÀ96øWNØò'/¾"'þà_#ÜÏE8(Aæ!Ñ (‚Ò‡xe$1LQå¤#Ü1ãŒG¤*j)‡í8±FŽ (æ¡0 Ø `‰tAûc|CÊ3¾ R A\MhXA‚{º€If#t , ÂqtvÛ ª±+æィTRÉM["ÏÜÈÈ9‚ XBŠeYYQ–ü{ˆ£C¡àEg×’lj1¤æx°–0>üýB6âæÁoD6·…CTŠ íÙp ÓË¥•ódÍJ.6°Dó°_. Ý¢ª’¤ˆ ü|ì?0°gÃq,]© ‹paÏ&ö#ùìà9¢(«Æš£`ì~á€=l8üp Åeà!1ã–ÄÆÌh†ÚÑÙËGâ‡çðÃñìrÖœ'P™A¯ñ}U¥°¤ª®±¾¹`KLˬilñ knïbg€\hd »‚í$%®­½›ûÆMƒzESÁx?ܧچ;á ²HÈI<²”/Bolƒv(ÝÃãSC£SÝ‹K'6NõiÙÌ0 2 ‡dÇ4! ŸSUY¹ƒmjb½%§òESJÞPrñFfýÉÄÊÕÄŠ•¦¾âš%1øQ)µÜßÕWTS[Ð;ìU7â6¼m2yéhÇÊé¯üéß3†>ÚÍOб0Ó õhj¬¥!_CG÷àäLu =¦jÅñŒ\îˆcÚÖwWÔÕ$fõf–.–¶,å7¬å5fØxWfQQÈ—!ͼÀê‚dL2à‘þŒm¤?vðR‚7ð’£®ðâË •Ž¥A³LPG"å9962J¾7d’Ù‰ °±¡ª¡úù Ô!ôy“RæØ=Òy£ 4…Û`ž" ˜È€ææéÓ§99oBª‘—'f–Ò!R²Šý£;¼âï׌ìd7ow´%ä6da7C–9ÜBZ¸:R’ø-‚ *ßR ± ­‰’ˆg‘–%Åd‹C*kJɺÆÚ:,NHì¹Ô¨¸ŠÔ캄¬ÑÌŠé¤Ò‹‹ÉÝY¥m¥ÕIaQ„°b9€p}#C=ý 2VlX@ÐÈÀ pN‰il; G»#zÇé×?<†­ÖÖÕÛÑÓÏ÷xîâT(Ö@Ú•ð *å…—=§t/†å^,å¯3¾† ¨@Çá"f@crpØ%ŒHF9ä†tædšÁ^B-ÂR"O»Ènl8A87Fn!&ß'ßF^~Îô@EbPa<1:‘ÚZã½0ZÄÐÓy @8"Á6I¶QÄA »ÈÀ•:­}°Jª•£“24ÁZ@›FrØ »b„@8è>ö€Sšq)‘&ìAÆ6§ÊuIëˆ>@š O„À]JSú$ÂqþÂR"XÀNŒ?mj6sök–±Q©÷Cô¿¾ž!‰Ü×vækƒ¢„¨A £ÿ$±'zÇàä<¥±ä]I *GÇ÷‰®¯o€ûÂáï¼Ycá K)K ärà ´!Aÿ„–`ÃBüÛÕÝìÜÏ69@æÿrŒ-  ÀA/H'ÕÅ©¼œÂâ„U…DE(51:±*$±Ç/ùDLéVZýXxFjоON¢åT){*Ï™s—2»\ Ô*’;è"((w£½³ƒb`\ l3§ÝÊyb˜4„W?\¤µëTAÝz~Ó\DW™æêM¶ uD€äzgæçR#´8¿èí‹ ˆºKIsiXJZçi;"ó ²„œ1† Ũ䨯'¹pŸU#Sz±áÈøþ5Âý „®ð‡ã³e@ó8A8ž7ã†Ñƒµ„ÌÅ«ÌÃlK©°”{ÈÁJI"à‡µ,pØp¬IA8p‹Q ’Á.ŠXBeމ@´HÜW`âž C±á,kª²{6§4@+I~Œl©¡ÎPæ„9müËab@@ ÁQ"ÝŤ]'| J06¥ôòVñÀ Âq?áŽÕ#ˆ?œ .~8¸Sb)áˆC $[€?ÑF»(÷›°ì„#…œ†éa‡°”j’uta@s‹xŸD8èÌ5ÐKÌ5‚MHƒÃñ‹\aÕpàŸDšÂñì€ñ€bÌá<ƒX£I|J %†¿cØHú®kn#Ò¤µ³‡w˜{áÑqŽo²OuDm{&œ‹÷ðÓnÃÛ¹„ìì7€ „“Äè#°ô8B:8Kºû‡Pº{Fë›ÚGÁ{ªv‘zõ&gFGDZ²@,’ò EI xƒí‚UçãèZ‘4]=ž*¾r<0³#0ÅíˆQMa)p2⟓[T50m[Ðh=¼f4tʹo³åÒë”Z&êéô•-}ócô…r÷/O/ª+­*©+œ¤E"‰Þˆ~ ‹P!ŸæEØIäŒ4ìàV›Þ—ZÜ›»šS?•¾;y ñABK`J˜tLIÑAÀ+H1?¤¿L@¾˜DH~$Få~$k `²Â1õØk憋ªvõÚ¥ ÉÄbHç@81àXƒp˜xËÀZÌ)i®Æ±˜@ЉŒ¶Šb ‰ s0Í­-4º£ =]¥8óä ˆŽ”‚¹„Ò3É5'¢J†C2#Òœ Ì0§pE°^¨D ¤P¹ìWéhƒº)Õ¥‘<¨Â0±ôfþq\’Ó¹pë]™Ú’Õ†‡tà‡K9Nún »øI†Oµ¡(ôf‹Âêb!–„ãd¸´æ¦ˆJšO’Šð¯ŽhI¤€$ù‰tàJ ˜D÷E« ÒßAçœ6·Nn‘  „Ìð‡ ˜áu#’xà 3‹÷{z$¨K¶á1ñ€Êê'"M$\F)¯ÆÀ3–À°Èôœüú–v6˜x˜qÀhDL<Çb?ì³³«…€›¶sDpæ¯@¤ §*Gh3j(ØmüËBØ$‚F’ÁA8`¢î±O’HÑNClV¦1»‚ŸÄÆØ8±Ñ‘I„> ¾‡pœ ßÜC8 ¤ÄöŠ’mŠRBT2{"M0bÆÇ¦ ]¡uðF¼ åˆþpßûÞ 6¹ubÝv¼¦£S'…x<à›¿—E€a÷I„ÌŸ‡Hžñ&ØX€ï÷Œ`Ø‘ ÍGRÙD< 0Ædc Žˆ¦ IS{ùp½(˜À(í4Ù-ßdŸÀ'j Ö*ÉpðÕÚ ŸŸznûÜE°MªP"AnÝ{( h‡dá#¶‰4Áw‚ÏxÆÞ&&g7™Y,p•°pc4"ñ+9>` º!bZ!û²â“Û2Ššƒ“ç# OD-EÕ¹F4&ç¾c)&!³&6%'§wÁxCvÛpn'~äâw¾»ûÞû»oÿ‡w’=Ò¢Ü]ƒâ<â;ò[JRs2CÊÛs]=Tž™±¡‚;08ˆ¶ìÀ† s‰è*¯íÌ,éJțˬžˆÊ ÊœI¯L Ž„ý“Šä{j¥”å$±Ò˜Î‚7(—bWñ> À $Ó\¼nl3ˤó†€ÐŽ÷òÓ—ž<óšxÏ$ººÀÃtØ“œ•Ù–™)E)9.G”â Çá8(òDôWÀËŒ\zXz†Ðí „ÛhêôŠïwŽ]/œO(íJ̯Ë.$Ä#*.–&SÄFJ!uÉF,H±i)ïŽ=‡Èbr/}ì¤ÓŸ }NõÈ¡ÃÜ[®‘ä:X‘þ‘[_š ì4†´ª¦Äœú¼’Œ˜ˆhnÕL8Cüp(ÙÕdàˆ%òHõÓqs¡.epx”»·ƒ˜\ä›B  \£ÀHÑ8ÆöÇP”ª]w)‚aOñú5ÂýìXJi‡ ÇâYò\¥X8Ç)ùpÒðì!§—B¸®´'¸+ vÈ}…pÖ”ù9ù¹ÇR’f ©Çôô™<ô™Ã–’¯Áñàfãnwtb"ôQK5Â))¥·ŽòÃU×ÕUÖÒHÐ ÛC8BKˆ"!MSrhpŒ“ÁnFŸà4à–•õÜÞ‰†' ®C‡R0ª™ÍäϵÀÊtõµw÷TB@æ[xt Oœs@ŽÓ—:Ž=С}ýƒì9α°)éXû+i²‡p¸=öÃ)BÖí^ñeÉRâæ´wÑ”¦ñ|fód *úÅ2;;Ô&‚!M •••áäâXTVJ˽²¨´žˆ¼3I KÁÓQE¸ÇÂ<Ó“¡°Ù3ê!·‘o¢Æöö÷õµôvT—Çd¤d—¹øÓ㻩™~(®Vɉi »Øph X¢Ä64Pooío¬iÊJÎêlê /Ì)êëé'Ь£­“y œq\ßý”.t¥Å%t¤CYÀŠå)cG2ÃC¸µ®ŽnÞçyqVØ”Ì$ MwgÏÐÀ`fzw,'=;&*Žå À“ª+Xí¬UD6>HÒøxçË_~G »ü{½~^8€ŠøI)k"a&l£J£SÀ&ý—_ùÜ›ôî’Ëù¥µó—®?~òÂsÏ¿„§Ê—Ç&«Ìe¢/bÀÁÈ!"ÃC⣣ò³3\\Ò‹óM,¬S=¢úÃKÖ‚*ÏDׯ—õU›fägÐ>¬²¸Øü˜aIÇ MïÒ±©óÖ ç­»¦_ûÓ¿áþöoþÞÆÚÒÙ×uŸþaÍþýá'Ó 09=35©·§°§Öö6=}J¨@ýËG«z’Ž·„¶¸…Ì¥VÌÅfLF”xEä‘¶Áœ%" |B 3òA,ÞáYó ±o$ú½}—53Z’±‰ƒ? ‘ŒF2”-Š úú‘ÚÌB!ÊÃ’ÿCe/4W$ c¥ˆÈ}Ré3‘êãhO³ :cÒѤFúÑý´MÎÌÊÁ… €3465pñ²ÓÕÐ6$Ø‚˜"fµ:§ÐiŸþ|VM‡{ìDxîéÒŽ\ÏÐ̰bôÁ›ì¤TS½ã*ý¼­ ë ÂI«LIA&ð¯ÔÓª˜ª# „SAæÅ%¤3ê#Mñ‚åÇ— Œ,NÉLò,÷>SÖ9–;S˜ëŽYL±ÊÐÀ nnB¢`êšUUÞæ?/"P˜æØñ×vöñ$[@³ïàÌÂ2ƒ G/8‡­Æ0cùâ—Þ‘†;—®2& wë¾–Ò^@XÊÏDå埇pe;`Iì!œH!R ˜7^¨Ê—’ššžÇ`Å|¡ùgx4Ý´«! úºº ·%S•€ÉþÑáüêrs§„Âl[GÕW‰Yí õ$©ä3vˆ(¹Þü Þ°ê‘OÇÑéÉáÑ‘~Lƒ¾~TN^ DYMUxBld|,ô:&?-3)2†êœ¾YI’£ý1:è‚ÿhiÅŽ/›:ÚJ++T3ß„€y‹ZÊ$”Zy’Ê‹OóTúNbBzQž[_[OߟŸè#úª– œí,D\ É?øHaGѪçÁŸà$ E/uùY(Àƒ¯›tuŽPŒ8þ D? ,þHN›Øj&·EÔ-@ÕÕÔЈÞÙ¤‘ŠbaefŽùKÏ壎‰xp6 Œ w –7×§•ä×Uº#CüTDVKEM¸O@vf"Ì!f¶<­ª3QvÁvd[ÏHÿh\xÜÔðT°OpuY;TÈÔÝ &á­Q³÷¸¬b‚w׿¡À,ñž#Îv¶ h6¸”z»{¸|D…56¸F¶¹LvCáA†Í'£Ÿh¦OÂmm_'²K0Ãh“î”ÒOG NyGî?¦Íáž}î©äÃá‚ö –QF±]ƒcljª Ó¹µ±ÉÑÖ&-16)9ÎÖdz²¦±9¹b ¸ädPÍœOÑ@biQ|*m†ƒbB4$õª¾¶Á&*Å|üŒfü¬éà‰‚swÿÜîîÕ«×±rÜ\ÒþÈ!¤$ ÅÀð éÓÇâ¡E‹…ª!ÃQŒœ|=Q±É‘™3±E“™þÍ&•¥ÙzW婤7‰¹`†ÂâlÃ’CI•’u¨YÀcX0ÞoJM>$‰ÌDŽ€j’Ѐj4ÿáˆê@ü^TIÆ‹j%Ù_RKÙ`€:3™œâëìâå`ïîdçälmd¡§9¢1w´ ‹‰Þ¨A… ÄzdXŒŸÍ¡ä¬ˆ°`?ZÒpÚp†誋ˬr ?_Ú5WRçÕš’_š”AEJJ$—eååш#3 (¤™àœ€8h€Xé‡'T6+×+•ßüÌ‹ƒš}A!Ô¢DoP…¤ƒ‚ rµwÌŠN¨ŒK¯Nªw‹ä–nä4RÁ‹Ìúøàp{k\3P£ i)Ô_æf’¶Á©R¯="Zz Ð:‡š&cS³ *0&홄Œ.Ñ¢ˆ¨NR%z¿ø Á&Ò×—0ðöÝüþg׆3náTé÷êZL(JÌ8¬.$¾(2€.ÐÄèX{KëÃÕÓ¥R€™•%Vdl`¨4¿p¤o`bd”4‘ªr¯° ÜÊR'7U˜•ßbûCXÃ`€" }^Ìt"^Xo˜MÌ 50,-?+ ¦©®ž$Z}#"á'IŒJNHÊHÃpa¶d&§’ª‰¾Ãôcî1µ„ódÍÞ8m¾FÈ"ôzcsMfh5#×"ÙøÌáӑżɋŸ´Ì(ðIªˆ1U‚c"Cb£¨>‡ºÝÕÒÖÛÒŽ»‰:~œ¼6ep3ss~ü¶·ÀG?Á”„Â6åuèÈaJ¾î;tPsð€žÁqo?ýãÇÖŒ~üÒýÝ=x›ÑaÙ3"ºE „{ÿ½;ØÙ Ç›{ \%ÿ ¤0ï°êâ"¢°)±ž çÈ-.D3À’ó `ÂEåy…$±Bж*Ÿû@s{ë¨èØÖ6jQª°úÿa¥E‡OMxûWWRÇ¢—F‘}ýPL¨íÌpüêÈnŒ.J ÑØâÃÇ3‹ŸçˆIGÄj/OÛN3ÄèèøŸòÂWçƒrR¼‡pŒ±O)Â!S¤ Ô·ÀC¿ó$¢~ÒáBœÛµ›÷nÝ}tûΚƒSÛš|8’GaõÉÀdŠü÷À‡ƒ£*8 ££Í38ˆ2ªÑ~Ã!Å÷ò‡çýòó Âc<¨ å0:<’˜šý’Ð?i1±©?}Þ }zû?þéßh› ÀŸû{z:ÙYÓ—PÏÈÀÐÊœ0' tPô?¦mfjƒG‰Ô`—æ¾.ˆÊx¯À¶°´“YõóáùC>)ó)bXè`N¡ÊÈIKéaà `HyàIo)!í¿¦Àb¦0¼±S9±Û||ÉOð÷ôf­ZcOM!P¦$RÖ84’&mÒ‡§Á²µ°ÁQ‘kfmbjo¢9HÏW'ÔhÕ'+9+&<®½©ÃÈðxRr¬OKP˜ÇÈ@/°ÊÞ BÂÝ|ò«:ƒR'#òVÊ—³jë£Ó}‚ÝíiRŠã3Ê? ä*SŒy®ŽYÀo9 až-Ìkf +‘_$?yäÀAŸ·«»Vó¨cÃ-Ñ7'Èѱ¬ÊëÍcc'2j³½BüC}]¡‚°wñÑ÷Ƥ†µ4· åœÂÍØÖÅK©òáö$Œ‹±ÄxÀC¯bt‘!À†`Z§/ 1)Jɰd!Ez|¦YJÉ;†¹Â†£Þ®*ý^U_DXÞ&tp©¶ 0j‘›p¶æ–ÚJ$Дûé¶ÎèGÚwõæ§d4–UaâPd-> 2,·¬—)x­øÃ†SZ6÷Sê®îez±?gL¡ƒ„xpë¡檤œ::'Šy<ØLq)I,Ð,`j>àâ°ð87l `I £À’ëêE?%L‹5BÛÎMª»JJ€°”Ì(ðF |U,¥¾*/ÉÎÅ Û þ²ž0¶æòꞆ–¼T:3¦—–ÂÑ@{á óU I!è±Ó3á‡ÒSS,\: ¡ÉÕ¥åu„Ý—VT–€âÌ ¦=xÆÙï!£&V1´… sâöÓ©¯GU‘¼Ää$ä…^V=5éù4=;‹^Sèì„ ×ÔÕbÆ!¶ðÌÕ·¶ML@OÄ&&u¹…E¸Êzû€Ça(Ǥ„dÈÉÐà0ÕØÓY‹pì&Ïñ˜Áq:fðÚeå|OAA \žÛ\: `—‰ÅLE&OŒó&‰³=ƒ]áùçÂR‚pl‹ ‡Rõia)ÇÆ§Á0TiñóÌÆ"ÅM$ÌáÂ;¤å"’.]½uýÖý;w²ñM›YBd!*‰‰ç$Ç™ìFÜ7ÔÔ¦§Á †ÅÃÁ‡Ä”$†žŒ¨8^2—WìàÄ㦽”[p´kFž[K¿ÉðIûåkî#ëï¼»ûw»»¿óGß¶³±§gaafacMñ'’Ã"„뮪«¥·*ªUˆ_ÄôC|v:éÐÑÉ~¡%.!‹ e§Sj¦Cs‡Â³K}¢²ã“™àÌ_)&ÂÔ œ’)¤¡#бÃÏ¿˜8`Ú*ï@x`ÇŠÌ5 ÕR¿ë xƒw!¨”>AlƒØy¢!s/`Âq, + „ã¢ðµ²¶÷ô ÅØÆÜÐÚèˆ‘Ž£‡#d Ur3ò#c*‹ªÊ Kü²²S}}Ü逬"ø)\™›‡ñ”æä7[8œ=–ט†.ÄÞ-5&ë^ d°áKC8pþ€ËD† â2Yㇿ1à¸FÎ ÂPUAIÉÜ[ .sW™wDEr¥e¹e¡æŽU~±¾‰çrZ ~Ë‚âè6—ĬG·ö"1%˜]!PA}Bdqé‘ñMM“cæ”o·ÆG]J 5©}*U¿ùW 3Æ<Ö 9¥ric)¥«þ9>"î3‘÷óXÊŸ‡pèרù8™Å—$ üÌŠ%®,ž¤D¼\(ò çæŠ„Š’3Šè sÈÃø¡ü ‡N¤ˆ¯òr6¤. ÎjÖb?ñ&ˆ!Î6â›±œÀP»¨$3— Z8}· ˆ0ÈFUÖ¡´Œ´JÔIEKJJCjC Æ’°4ü ¤ÐƆGÒߤDŸ¢ù„;¢„cí!œòðÅÓ»€¾3ê%\¥Ä}©ý¸X,TH?Ž•ÙPXVœ”Qš–’íÙpŠ¥DWúð#©D®ª Oãâ¼·0c)«wD§§TN}²KR³`E°´¸{06x˜ì;@1‹= Ù‡^ÌÞÀoj“"C~¨‡7Û uˆ·_œqY|L›+,lP„ c˜ýêú:ЈR %˜èuÀy|ØpT\nhiÍÎ/(.)S7D,e;èI@,ž3ÕØ}d˜ü²|@¸ÎÞPóè1}Jíü @†É˜ñè‰Oã_˜®–ŽvâžyÓm`h8„Á ù ‡€§!¯¨0,‚G\ÂihQ{à}ZŽä êŸ-¥–Y“* vø‡_µšUiæûé-@%šÉD@këûs·q¾2a}é%†“A‹¡sKVWîæ×_´–^¿U¸ž=“Ù—œÓ“]áâ[XX[?µjZXi;8m6´f7rªáÞë¶»û?ww'f—= Ѱµ#ÜÐÝÝÕÎÉÑÑÝF„ƒ=‹Š gî„FF Ð!cðüñ¤*šë=ƒücãêÒóû¢sÆÃrfBr Ô&ãŠòÝB¨/Å<Åv§ bSÞñL¶Å!'À‹3—ˆJ0‰ŠÐZP4®N™n–Úª^.n@N\¨tM€“)ÞÕUð’ýK7^ÉÇieïêàéçæ`î`}ÔD×ÝßÅÉ•tl‚S<“ãR³“óÂ{Z{¼üÉ¡·UŒ¹¥ Kü^õ9Eä³¥ÏeŸN¨ZN©l‰Îœnë öò%%3Ž 6"  ^%·`›óˆÈÅ/(>¤Ç‚s–<üpˆ¨`IÛÇ£†À߯i¬¢i¶°a%³vÔ?}=«¾+­ˆš&. . L ˜d¼rÈ ¸|@4C`€p ö·³»ˆV °c£  ΀7{Rå„¡xöüåÓÛŸ±$à™²^ÿø½üðGïýš¥üØ·ÇR"†´ hšxÆ8‡$£3 ÚkCui‚!÷ô à®ÃÉÒ&Κþ¡hIQžþÔ)U¾%$ ?d>°²UT€r` £ÌCd‡Hp†ŽtSdb Ða*ѪÊÏÙ=Æ7ˆ]ÊE¦þ6  „KÍÎÄïURQÎ~˜¥ôRRE¿ÌLQ0UÃ*;{|W¸¬èèÈXKèßèëäF¯Š0/?úIRx–z˜ŒKà àä¦Ì^T6©è*Ô?çébŠ¡Re%¦9{¤ºëKÞ¨§­#&Nà4„#’œƒ‡±Þð /tCÔ:Ã#º`6Y2‰a ´JµwE-ðrt¡®9õÝA8 Yî½½ËÍQ)Þ?å(!<ëëjökô €v/{ç0gÏ4ÿðWßX?{—P•bèáŽY‰Ï²¸²5°¸¼‚ËRšÛPV­¤,!1¹ªº– K.)YØO  Ö6œ—o~nSÕ›'%]j±A±áÀxBY‘†pÅÊ’£ÂP}=¼ ßÁzÃ#KGl1ÞDû¡‘1ÙÑi^HC D¡+#Âm  @ņƒ3ø!±¾ôÆ#T˜51ܤÀ³¨$-Îé±ÀGd öF¶bŠ’åæ­{7nÞ¥¦‰¡©¶^©;6–”5 *°rP +*«›*ëò#’JÝÂ&¢sÏfTÍEe.e&çTø†7¤– ¯fôϹL,ž·?eß>ÿàÛÿð—»»ñOzx¨úŠ˜ŠfføöLÍ,]ÝÌ­mˆÍ#þLk ÑTÀ¶*:^£s+VNƒ„ÄÆ¬¢Ø¼™èÂ…ˆl¸©Ä’æØ,üpØp‰Ò`jNšÎóp™àÌlæ³FzEñÀàÇûJy‰…ÔáÒTú¶›;vŒ ´OÃÁŒ'ÇžJLN»M;8m& tÓ–FÔÖ±wó³sõuòò±´·> ³ÏÍÓÁØDÏÓÃEåÌ9y䤸»UÕ–ä–Ø[ÚÒTVó(|è»%‰éx§¢ Î¥5ÌfãŠkŽLÏ ©,.e”.ÍÍ£d s0¶ ‡æ4P¾b‘NÒ»JÊ=sl "@t‚0™Œ`´7'ÄN55ØÂ#pØ´vV¦åDÙ¸-”4Fd÷ºÇ½Y•Z’œIÁÎn–j&<Dq|TW QmñµÛ:;RÓ„@J‚M(ÿ˜iP‘€ÙòÚ†ô±bMÁç Eº3&‹Ê«KèJQßÄ $»}kÏ€ûÅ·>5Ýsþ­‘&Äèã*@½BOaX3ò¤b ‘Íxƒ”›jŸ 5¤S´›©EíÓÒs«RsFuù%X< Ö˜”óØaL ƇÁ ¨­Ó¡ð˜9*æ*8,14²&·¨6« :-—}&G°7øFåEËHOUP‡u‚ö‡—_g¢â'µe?87âÄð¡)›&6QÌÊꬂšìBrW9R€[ΟÑ)L©Tg“ùi-•ÍÆ‰qɨœ`ONBJ¼_HaLrYb‰±iá1±!áÄŽ`‰þÅY K Â)Û4?O|~XT•— 74}nz¦á¡£Àá[%ñiõ©yÉY©aÑžvN°p¶²ÕÑìßC8@N*(åÕ´øÈÍÈËaWR„?]16Ž`[aX|ydrcZ>»Å¡J`ð‰¿,ª­Ì­(!Yµ,Á»€;\DUgƒÀtÔg¶‘kün¤©¦:-!‰ª p¿88ÑyQ3É 'pF a—ÒÜ@N’R~x˜ÏŠU<[B"ïcy3É«kÙðwóäSÌS>"¬€A‚mMÍx0õ“Gc ¤ü´ØpTõÏD Pi"3· -+AÃ6kÞDܰF¸€pÈ£Û÷žaÙc)q\KëZ²õIg$V¾½£­é†xÅ)M{©ÜüÚ‚òs#sW9vûFÍ'eõD´ûGœ®ì˜¨î÷ ÉŠî[6œÓ,åÏË@×&é Ý„RQ:ŸA1£m±ÇÄFˆ†=ÑYQ÷èÜ•/>xþÍϽñèy aûCi¢[a«"Äåc‰­=H;SÁ†Ô„$ƒb¯o>RûùüÝ'Ÿ»û¸2#/1, Öwެ‘á9Ι sÔÞê;–•âÓF“*/,Ž  $tWǦ_¾©ööèùç.÷Ô6©¸8F*v§ÁÔ‚KáèÚ¢ÆêÅd–ª+3“ŠïÞN® .ƒõ‹^xíæÃ·žyñÞ¹ËIx,(dpCT’ð.YHÚXJ,cSŒQ+k’y©4H¦ ûÁM?×;ÌE½óøå߸÷Ü7åÆ$AYRíÂÚ„£ 5s%–’ŽËÄÄ‚þlv¦Ö–8TŽ™Ñ2ÊÔÒ™~•k½co^}ðöÍÇ_¹ûüÛ^¨Ë-w=á±Ñùô «,µsw]س»C^rz¨—æu:ݺƒÃ)àëaë˜ïbiË¿Å9*¤é?帇ØÁæVD…Ac[»XÛ¸zò¸ s·°ÅPœ•kmd eÊ%„yû˜P‘™‡ºì≦âlnÍ›˜Ñ¤[áí€É©ªøt#ÉìHä x†šÌ‚Ý&–Ú4 ï`Æñ…ža8%‰4¹{ï])¡è耊`c±Fú ±áª¦0ñô¡2ÐhèXÛXPAñ‹‘”¢Éä‚éäœÑ¸”…ô¼vÿ¨¶à”ò袘œV¿þÕã+4£+îË«/õ¯µeNi¦¡¥¡‡=ƒMÿˆuP‰Þ„܃-‡Êóõ÷röt¥Æ Zð%Y9ÙÅdgÔ×âí­kM-Å;5>–=_P•Z”ž­“µ/fî^p"Oì Hµ¤!î•ëZ_LBúƒHmlÕzÍË_4 =B Á` Ôy:»"Íùˆù¶¡Ša¨±Öàkä‡fÿµòqßÜ]|ݼ°Ïœ­¬Ýí,éYjomäè`migåèéíêäààî—DôœÊà @àç—3—'Ú{'‹zý’·RêV#‹ûR)Q†®‰n»@ö:"EÚ1r™QlSi—ÃõŠ–îËI óÄ]…†ÊRÆ\Pð0^€èXúæÐ«¡½®‘ÞhäíåTM%—‘¢°”^Ý’œGïäðh†#‘&Øpd! ±ã p¥ú39ø8,ìlˆ49fdJ¤ …(qîbÆaÀs´Î‘ñ†Ñ†¾%CQpe•ù%˜q”üÃìû§¾ûÞ?øÕg)±0þðÿø[ßüO{ùpDQRPƒ0“†úVJ‡ÀOD΢ yTVf‚ ËqŒz%ùpÊñë¤HÕ'É ÂßÝGELkQbúÅÅõgÏ_ñòí3S Ã4ЉO&å”ñÁ…Ö`? ãž±çCf2ÈpAã#|Cõ•HH»szçÆ‰Ík+§ïŸ¹Ð”_šŸœ©ÂÙ€žá ˜opbÊA…ëÚË“3aœÑ@§1a/åÙù}õ-WOž}tþêÕÕÓ@&¦‘2`6ŠZ!xƼbCæ×Èt‚‘Ø{èŒ5£À23o¨¾õî©Çç®>{ñÆ¥§1+9[¾Oœ,¿d idb¬{üŒâ»¨"r¨Öª<Ò/ˆœÓÙ®öscç…­«Ïl^Ê‹M¦xiob¡à0:à.ûzÿÌAf¸fÿ>µ< 9°ïÀÑ#XÐì Ç×…;ÛÔýʹ/¹òèÄö½õm ™eæ(v%+£°¦¢ ¦ÂÙÓ=Â7üûc&¾6N¤š†8{bÑzZØa’ò/±^î¾,¨6º†©!QÔy™Úx[¥q#<(apàˆ‹… =C<|è°e«gäflIûé@g¾“›ÄùûÚ9›ì׉põŽõ È ‰&>ÍÇÜ./2ÁA×(Î;£Ä„bbÀ%E¥äÀáâ…™$˜‘YÊÃ’£Ž(o¢ZaÏ}éK_ÙË|ÿwI‰ûðCåX•õÞë;ÿåÏA8 »M€ $ƒä¶Ñšy“ºJ¨Òl“¥K\À…Ë7nÜ~@VÁ­Û÷iûE+"Ä4D¥¹¹%MÇ0#8–£ÁSE”\^9ÓŸ=Jäè´î˜¤ÅⲩÔ쟈¶ÈÜÁúñøÊ!ïÑM YÞËšGÿówÿâƒÝ?úËÿáî㯠5˜ræV¦Çõu ,-l­¬m‚üí<¼\‚œÝÝg€šÃFW]Ó’Iï™S¼Bp&µ÷†¤¥•2ÀhÖCþ3…¡Ž(`¢2Ƙ°2…±ØÄA…e5"°$•*%Èž«ÃÊÇ ‡‡Õ¶ÙZZaÃÁ°aokƒÂŒcJÇp~+Á& /1V|¤<XMVÎn–Ζvîæ¶ÇõŒtöèXØš[¸»wv2òò± 3óðr )AH0¹°öÎNô`ûAî ùpCyUí> ›iuÓÁÙ³ñ%ÉŒd¼ìT/“l(‚ªIKnR‹ó‘0Q©×%½ÐA;.ý•Xr^v,0¦9 ǽ…,A¥ÁÝ Z³KjÃSúâòfKIÅ#])ß]Oøj7’GLR¹Llö >v-®ø¸Z+gé-013ß ¼áúŹ;21éž 7¼±fÔ±ä—+‡y}cðà ¶}¦®¤¸R uõÔU"ÝœCèçFª‘K8Ï0¿0áyÌâæääéCݺ֒ª©æîáš\ÓKƒãbVŠ D¿JÖ^„ ’@š nfœ”$_`)Dä?ÑÓìk.(ãÒNôŒžî›XêÌåîC¶&æG´Y5ªN*eœ?üHÚK² œôO:XL1V¼kP‚8ÞšÒ ÎöMnv­µ ^_O‰‚ãÅÉ]Ê.)Ì«,å4˜ÕÖ/]½ûÊõûè…•¥qiøÞ¼÷ì—ž}™å™ ×ú«[ ËA¬¶ÂŠW®Ü}óÖ3_¸óäáÙKpΪ¦Ž`‘^þ<t…×n?b‡_¼ûì@i]ITrqBÚ|ßÈ—_xõó÷Ÿýò“—¹®î‚Êܠ赞Ñ7n<|óöã§Wî`ÜãÀõˆ{5/3f’”gé~ª‘öþiA¸?ûóïЙYüm¬!$çD¡fá_Ö|48:Tºxå&Á&**àþ34±°¤ÇŽ^¢áý) JŒ „0qRâ@8 EVW ÔQ\ÓŸ]>”QÒ›Þ›–ýÖÅ+“9Å5ÑéUy™õŽ™MæÝË:«74Ãë ýåûª™ÀêÖy [;[k{+s­Ò[ÇÝÁ]÷¾ƒ³â)œ],í,\¼ÜˆWbT£2p¸æW”fåc¾Œ5w¤—ŽÄn•wõFeÓF§1§¸škÌÈ@ÖKÛ & SY/m¯¥1Ò_ZÄoÌhÙþØ5Nè¿«•>–@ã½Μ¸*’ްçxÐQ¼zÒÙxcø,s"JÇ‘ÓäÄýÆK‚EILâÚø9:2ÏB\þHh\Œà%ŽB%+ò‹`#q´¥ §—]lçFËW†'qÆ#ë¸:<e%Drqùø ùá{6v¶ØpfXûÎÆæVøá¤Þ©€éq 34Y,l@Qf”‹Îšî3ÁR"±áþuMmºw#†fnJ))Ä‚¢ Âis˜Êð ñì %Àùƒ‡MM6CùÎ…Ñ¢­ßíSç@‘k'ÎÜß¾Ô^Q —EISZ;!“p~‡%G‚tSdCÅŒWª`wÅgiýŽPf¶.aëÜÚØÆð:fä¡òùÀœ${–“Ž8F0n?¸™àְဥ¡æŽ›gvØÛ¥•'®c©Pù ~’yÈ´‘ÀI† )¬4uãŹñ’mvˆ]UšÙYUÏ)½týÞõµÍ­ùUØTDãR¥$%)5_ËRêèqY°´`,YÐ ŽÕu¶µ'Îå¨f_Ou#åÝõíû'Ï]œ_£f°Ëçdc‡ûÓc;2{ezµ#£8'0ª>«¼ßžYÆæ>=8µÜÚߘ˜S™Òž^tmúĉޡë‹;3+íE•IáL윪hb½‰­Æ"ÅM~Ùl8)4ú/l8.bV«2cºQâmÚ ¡2³ð/Š3ú5ÿ"•/Øp yâ mö@8++\q,lodÂïÕã“pÙÌ’Ṵ̈[$#‡Úf¹Ô&¤¾}ûAmDBSél…&Ž!ž £6c›ûFÏo?úýÿJÍüÂ"Œ-Lè3cnl€çåââ¢s@×ÃÕ‡Œ2kkKOWrÈlœì§è[ø}ñ¤ªÀ抎 žgåF­çë=3݉ùµIÙŒ1b°¥¤·2]²¡y± ¶1D%ú‰/ «Ø[¬±rÀ*.PúšuÌb<»L6po#ÍMŒTmv.Å-…>Õ`V ÄŠâ#dÖÂÌÒËÁÃÞØÖò˜™£…-ñ“0“úN®¢´¢ãMò‹ÍK*½›Z#Z;Žxyy¸³²€E$Zª¶¹bÁP³¯#&{6­òJÃp¥WT^Hlo“ª`B83xUÐ68(‡Þ8 ÌPèV"ã°ySú r]ÊÜt¡3 P„1§ ¯˜[€ÜH5³\aáZ’ÃÇÏ1¹”ÿ죟`J–7 ±”ª.¥6uº>¾.îX¯Eåìdcxzkl~mh’Xì6d § Âq™{•ÀiÀ±Œƒ‘J·8m¢æÞQüó~Nn-ùegGçÀÖ¸ ñ,ãà#ê¹ç¹OXvWiÕɾÑɺÖÅŽ¾ñº–ò¸”šäÌܰ˜É¦ŽÕ¾‘ÁšÆ…î–ü’ªÔ¬HÏʤŒÑùõŽáõ®‘©†Îò„ L4ë£Öz†™Qñ°Ó}óc5­›SÍuÉ9pȸ`ëZºKjÚú‰nKã)ÆNUµÞY<Ý_XŠƒ§,9ÎM…²)do¨Pp’ÛÞÆ/K)·WP[ˆJ±á¨œ„à@Ü tp`¨± wˆÕf›JÉÆÝ>åê»ôø&–28$‚v²Ø<ØpØUs}œ.ÀÓŠ€*ƒÏ3<6’ò%´?- KZlëªm9929×ÜSžZ˜[XPØàÖ7k7»c6{ݺïôï÷'ìî~ùk¿uÔà˜¹™¿‡©‰»³"O'¯Ã]7GÈ=@ÇÝËÙÚÁ?섃1*%<81'ƒÊDxaËÂ×j»çK›c3{«HÙ$þBúŠ€m(©ÔÖ{˜>cÈ!$ýbå0þ%s@^| ÀÕâVÀ»¥æ#¡†€W`Æ«øõAMâÑ8 3N*BíPqâùçŸ'‰H¦$j™¹6Ü2ÀÞÙGÏÒQcé ñ =”mÞØã44ë22ï3:çÝÒmŸläãkïåãæî P‘=» mµ >•:­ai›õýøäÊS²pÛ£æ¢à†ãQ¾uã&/޾‡dl€y"ýXƒv˜qK-'G/U"9ÀŒ š[X`À–(V/qXŒy"Ôh 1[Þ²Þ20TÞ—‚\*Î/àæºº¾IxÿyUÀÅÅN‰¯Ÿ²”Ô4¡±À^,¥$YB<?"öÚk†¢dËÁœ9wqýÌ6Ù›ÀÙP”¸â~õî_ÄRb±m$ñ”•VÓØ~–’ $õaC“däñ¼Q[DÚªto­Ø¦Ê ãXŠòHô ¡x+)  ñý”Àêg\‚p8“éº$å%/û“/è{éŒîC,fÞœC„æçDƳgH<ŒzbIÍKO¡7:®‹½3ÁY–¨nYÍ>êñ×—¤b%R2pá€cƒÙÅt…“ášÂŒ“>UüTz°ý‹î=”5 ÇàL¼­h`H{'Bó ,§#££Ð•‚ôÁG¬ucoG˜ <ЬƒzÙ;à]~ˆ%ù`*ºMÒz1-4šýà™`n ¸/Ü1Éøþ?~wˆR!®vH×(K¾†„‚áÄwãîÇ &»ÐÅ`¦Á ã8Áà¦öC´‡ÏÚÀx6ÕÜynz±>+?Ù/¸&=§¯º~y`d¬­sed¼žÈãÄ”(o¿Î²ª•®á±ê°j¼©XÂñfc`BtI-fKnáÊèÔòÀX_eÃD];œÉžAÜØÎÚÆéžÁ Kë ÝC¼ŸécçQžˆP&f¶£{n…Q.œ³Œ4úÅ«ièO@6à WÜ/› ÷óêRÒ{#™p¤%pþ¥©·Äs³"E‰&¨³‹+ ܹ W/\¼zùÊ â¨iB¶€B 5 ‡*|ÅNήNÁÞÖNÖ~öNñA‘Îþ±>a©¡ñ Å5~6¾ºnþ™Es§(e¢ÛrbúÍ?ù«Ôx!…ÑÈÜÐÌÆÈÙÓÞšª"Šä2Ô3>¬9jmfkeAéHl67‚ìÇÔΠT± W{kKWG¨6J{Ĺø?YšXŸ’ ¥ÌØcvÀÞK¬rKÿä¼$ oXrHj™æL+æ²(‹òRãÖÞ¡–C×j„ÝF’1ñDd€â×gç2n¥áGä·T9A·Fþ ^óG1·µ5tv7òò3ò <è䥱óÒÄ·X¬˜Nœ1˜Ü4›>ë4}ƪ®;²sXÇÍÏÅ?ÔÖÚ,-_/BÀ K°¢šâ²b2RÝ©-ÂéQ%YY¢Vvã=”BŸ0+9I M—£K,¥ty“ŽùH˜ U(‰æwMì ˜­*°8Âc:ƒÃ%3‰ÈêÉò ‹¶ugÊàí÷öç>0£I$¥{nŽÅ]‚¹µ³²fƒ=càS0ZßБ†RŨ#Ø„®Lt`t¡Q Â1êo‚phT¥¼yï#“w°ä@¸wß{ÿ³‚pßüæî±”{ÎኣaŠ›×KU!‚„P0‰{á`Ã+F9Ø@üU¦@,~‰lià-QQ%xR+–¶þÒꂇÍpNØ™R¸ôÄŒ®òrÇRÅ$†5º³ þ ›o\€£äÔ `€0™TœÆ­-”J¡AhªZyUûC‰†’Þðé¤c«^‚‘1üd"˜‹‡}ú»xàà*À3Ʊ¶‹w•Ԣ䷼8Oåßûé‹Ý2ø°ÒÈL÷ äº8+õ5D:Pp„¹Ç§l(1ó>ìâ.WA °±°¡²µ/f2ëQÍ‚JÈÔ&Öƒl6â!‰§—v!Rµ —ÎEÑæ{çâ5eÆ]»Å—(}DGC„HpŽY¦èäšç0nH•vòs±t°#îÜÞÃÝÜÉÕÒµ£®óÆ…Ûu=éùUÑm=Û— †¦÷·ŒNß~á?Eù_¾óçž4uñr6¶>fëjeëdMQ+ñŽéè8ncjkcnMO3óã.˜ŽÎö¨_tOµçA8:«2>ænŽ"Èâ [—dWÿkÛO¯Ýe¦à† ÿòåËÔô˜¶¼°`‡â0cCJ0ÂA8´CôW%¬µoò±á¸LrN°á‰G·gâ)ÈN!7ŽTP“tòÍÍMv3 ÙC¥J¬7é• òq,iAwÌÂò¸_€ÆËWãæs ,Ѻ¬ÍkhÝaê¼Þè¹C³×4Ãç4c笮ØwÍל½{È)ÀØÖ=Ð'J–Çä–A'¢F Õš÷ù›p3“£r@iªb¢ £¹Ùc¨I4:ªÍ;8ptÐNb)ÑÅyGY¨övø]]ÀHº”Ìe®> ŽÑ7˜¶$AŠÎ56C}ãÎãÆô‚pfÖòøô¹Í³H$QŸ…`iåÑÛ,¬¨WÉí’Hl8sŽAÅB¥¢(-pJ: ’ñÆxcM_TÀQ o ON]ÊÏKI¥vî¾ñGK žÕ×µot)áè‚M·))ÎMÛO•ö¦Q·i“(ÁôŒf”‚MŽëê‘…†FÅÀĘG h”‡Nô]uA ü˜B¬¼\ñÖ21CÄã!è€ `©"]¹y‡f"»RÍ}| jÏŒM$´âÜÀ фˠ!Pp|zŠ’PõÇKW_Rø«Ô¶®.§Gùc@ްI"š¨f’GW­Ü¤4„,$€ÊTd^ÁºH©L®m‹—Ä¼ì½Ø-“1•jéëY RRŽ$;!^·Ÿ V¬B¸wßá`iT9J-E)ߊZ¤&™þ1T<‚›¹Q¹‰©ÄÓgG%PÓAÒ9”á>øñû¬)¯€U··Þ€=a7SlýÀÒØ4ÄÓ7;&‘€œŽ$±íìŠ;Lî ôHgC³—SrHx4µ'||býýÃh3]žà_˜žèO—ɘð¨Ð œŒT ÃtrÚÂb€^òêUfzD4Þ 3¥­«ò۴Ɖ‰Ãvô¶w&»ŸÀ¾L0Áxk`xHÂë@H'f%Ì ™‘p¢`\R«E[^w:E)î7 8\q¿l'´ä'YJ¶A¸šÚF´f4è¹¥U¸JÄ òEjJ5Ö|ÊÂ;È>¤·Òˆ¤ï¡áql8(JŽ÷˜´®F}A¨áÅ±Ä äbeãlL«k;WoG/Ú¿d¦G„$e¦—¦U4÷ö»Ì̯̚êöÏl¾F’Àww/loYY›òmCK={w+k'+ÎÞÖÉÜÈòFÇÑÒÅÁÚÞ‰7ìÌœ\m@8d±«½¡©…‘ ¶‚“Ÿ—K°Ÿ‰­'cuXßßÔí¤·®™§¾ñšC1O±Øø:.Oi‚¬—R#Ž!¥¶@8iî!À ]C9\ø~!AÁÈ •ÁâäLñ?HKˆ  þ½™æÆŒmv…ÁÄ`æ¸à Ûl0å­½½™·‡Ò2lkÛÜz&œ×lÆÏÌÞÜ?O³ðH3sO3yÃ`î–ÓàÙò^‰ÇL]MôM©GA‡k7'B©ÃçïìNÀ0ip$Ú’£©ê.¹:3ÁIÚñ´RÅÍUN‰$.@ä×(öè^ï½XJx¥(¨ëµw¥ø&ˆCEî*j.Ÿ)³E¹kÒ(‚'#åЭ1õ”sÝÚJ9GPt´¾In×^,%%»@83†ŒQ Î …ñ¾´vН1JqÅ18Ñ–?[G§u2EhôUWßR[×ÜÔÜAÒÝUJ˪9ˆJàD(ÒœLúà -.iÚà‡²û¨HÕÚó u)%ðŒp ò?g„`LŒa‹ È@î£1+0ÔNŸ>MÑ^ñíñ²¡"3T,eb"âI$–‰Üm >boèbiY™”ôe²y¬{øˆJ×f{£<ÊÞP²(Lóvi€åD&á'tÇ ‘­z|ëõ¡ÎYœÞL*Í!º³A¼jsÚI!׾س‹·KTb”»§ 1’éIñ±¡Áíõµl¸:ÚeeÓäÂ92:,¿0ŽòÇ?ü§ÝÞ'm’Dä/ðý @߀@Üúhíîa¡t<àô°;©'”‘˜—’ŒmʦŒž…¹)Њ\¢ÒßË/„R°!LÔÞ ?_¦!9Dž~^\‚«£ƒò5RS=*6'- >ŸB‚p5åmµ ^ŽN!þ>)ñ1>î.–&†ÞnÎÁ~Á~ÞI±QvVæVfÆ$(øå’"œ‘žlgbjkhEx/øÄÓ«œ7¤·!›P8È™£¼Æ((¼é<Œö`¢£È‘û L†8º“ÒÊòL‘jé  ‹E¿¤£à•ð“lP“õ/' W¹‡v ReY‚(A¾ðâ Q–Ü¥MÓ œ¯íœ¿rùÊÍSgI‰Ã†#Ôl'b ¡ˆ‡¢D¨±­2 ­ÍmíqV©Ò'â› daƒó¡€2žB &žšt11Q¤ëQfŒô@ssSøN ‰éqsW_KgW=3 =O_ËÊf“®qËÑ%³ñ5ƒÉÓúÓ÷_Õ \ÕL?Ѭ½®™{V3qðçT@ßšuxŽ¥½¯­…=ú7×Àéehäø Ì¬P ñ­¨D¦°jÏ*ÆÕÒÆBß”RJç"’â-¢ 5€'Ès43·dj0AèU¬“ZŸ¢’wp‹Ò¡û İ#Ь­ªÎÅÔÊÇÖ‰$QÊa˪2æf<”@òsEQ’ÛamÇ&‘±¦ÖÖÔ¥á0Ü9:7ÉcÈsÂ3ê€1¶ùrsçÒòúiüp|D|¯Ô4!éûWÙ'×FtÞ7¿õGßøƒ?"Ê ='dmCkUmSCs}:°gy/:8G—NiÚYV^yõêUŽÀBXDt,w^0Œ'ô2$£„QÁòe°‰ ‘’"ÕT° ¼6<„T6ÂUTÜŠ h…bËб!ØØš0g'W{[5}q–©VjQ1ÄrNLLyyùÐÆÓ‚Œaó(²E¯ t—΄ÁУ†_ÛsC­Qœ]Ý k@ºck KHœé¬iM‹NÄ@t t·t±õupôvpó$#G9lì¼\lœ-lôíM\Ý-í-m³›ëP¼<65Â?Ü«º¹ìýݾ·ûÃ÷?ú~d¨OtˆW\¨O|¸O|¤oL”odt@XLPxR”oT0jhgîê«sì°¹¹¾¯§ƒ›•«¥uˆ—±.Ö^|Rä?!2NÅ­„ú…&D&¦Å§ÅEÆÆÅF§f$…úED…ùfggP€ÕjkcÁÌPéÙcmcnjjäèßPO-”*G'[_÷ ÈÀਠïO?O*0D„øxºÐU$8ÀÛÝÅ>!>ŠÝºy»XØš…F)ÒWuƒËÉ‚F·uó÷1¶³Â‹Hƒ:Ï BCW¢Ç SSN`L•Xó Âë Œ 5Þ'(ÒÅ›–cXu¨)0EÔöE¢ÑÁZrŽgŠ7´ƒ®Þr¯?Ü3ñï’ § ŒÕû“6ï|û;F¸ÚöÅ+HBÚ)§ÏlCBž:½°Ñeyeõä…óWà$7NnÒ.õâ…k›gv.]¼våò ˜²Ó˜YDÈêèèj[õªê/àÁ ÌŽ›˜0Tê2$ê"Ãò˜¾FßÀ­sÆtüœfê’ÑØæ¿»ûá»o}á7@&ºÊSK‹^ «–òh¢À Ú}Ñ¥9<Šêm†Þ¦=ä!òjX”g¼pC]½c*óæÀ‘£ŽèÒ×Õ9¦ÃßÃê$Ä<8ö ŠöaLj’ʶtRçT_F­–©èŠãÇ%1ŽÓЖ.ÚÇÂõ¢4Sc…§¯w”c#–ƒªpÐcø=cµ62Ô78®‹n©£OïcÎQžÆÀLcåh™Ü2lÚ³qdòšfîœæäEÍÄÊ‘µ«‡/L>stüé¾ÉW4#÷÷¯<«é[ó›9Ù¼ºÉä* ½ºGuõsÃi=rD—Û¢«£§sø(º:¢€åÀN’sãB@8iZÉ%@5‘’ÀóbMÍ”ýû¹."ê=N6=;çêè²Â—ùÔ7Amèér1D°fRsxTÃ9éë=´o?Ad(ÒÜR*îÛ¾­Çr:#cv{ü˜1©úÔàXèÌL/P•!Ĉ‚ À­»¼²Îxƒ®$ü2cîôöù¹åk§·0ãð£r‘Q€Ž…äÿÏø$ÂýÞ7 žÕ4¶VÖ5•U×SÇL"žÑOY¸ëP¢S^QuéÒ%H²¼Ô4Š«O“SˆX¡6Ê>#CŸðÈÉþ©öÒÆÂ„,²_£³£ ’ó“’3)4ž›’^”[LXiF&½#ã2só Ó ¨ü‘Ÿ’G,~Znq&¥ B"ƒ<<ª«>Øý€…±¤s@£¿ß±ýýÝ*]ëð¨±)žáþ±± ™iTäEûú9¹@›d$Ä9ØZ9ªI͈%qüÝ÷~°ûá®áQ£#ÖÇÃ@=¬wpŸ]½Ã‰IT¡õ‰Š‹OˆÒèHEwÉȨP_˜Ø¶kë*«ªË`¿’Râ¡iÓ3’’“bsÒ“Ëò²ó’£üªòsY R“ëK‹óÒ’£Iv° ð%㉛¨ªÌdeb4뢊’€þ¡î^|ÔqCn1‰>øÏ‹"a¸6'"=ü^½Iñ”úârÈÉ¢ØuUÉÙ”»%„_ú’(‰pTOhIpN’á0æþ5ÂÁ«ÿr"ܹKW‘,² A£Yƒgˆ6¶·.кé4%¤…úÒ≑áÉÁ±ñ±éɉY¼Ý´\gÐÒ-Þ¤œ2‰˜#Ì)T f •Ù “‹ª ªóÊ‹¢²âé…”E¥êŠ„ìôœúÊÀŠZÇî‹™Ûš¾Ò›"&$`Þ¹}“=` Ž(Eyx±[æ#³Œ90TèàSÞ!<),¹:qð),= ø”èã aH¾DŽ–Î©Æ+¯í4¢f=ã—LvH$É?Ìk")ª.µN8´ôõ–ª@ü‹«›'‹Ãüå(ªì­6õ–àíÆ†6|%T¾mm#–›Â¦Å¥E¹•e…uµ•eõÍME5µ E%ÙÍíy݃q ñ­}ƒ+6#—÷\Ñ,_Ñœ½ªYßÒŒŸÐôœ2›x`<öÒñÙ74“5«5c}%«•=¥µ(Pª2d8ÝzU¼nm=ÕÆkx”¨©-«¢M% \YšµçŒúE—•*Ö¨bmmñ‹‡{Ò×;Ä…äç•p-¨h|™ûÀ—Ùàžðsnkî•]¹ó¼Ï­æ_nwžï ñsç¹cˆ-n‹(yˆ2Ò|òr‹x%—F!ùÄWççN ³fhŒNöÐ5ktaq•,üsÐ p(^èT'7ÏrŒLt¯_#œB¸òš†Òª:Žì IØs@.L~üð}ìn;K="ÀUI"ÂÀØ2µ2¶±³$#4#ƒfߤñe²Ðq/559!!Žw(­Ë¿‘‘áO®¬,÷÷öp21 ¶wŒróˆprurOvó޶sö=fdleína—êá›äêíàêgléàR‘˜înd`í„e†)FxŽ“¹5¡:¡ž¾^–ö+‰uö‰µ÷Ìñ‹6u 9fgçIpZ •æÀîá‹aGHm€¥c¢{@˜k¼G@¨‹éÿpÅú<)tU §dbÓè +yßbÃII_Úß(‚;—¯áQÖÛÖ, ùs›gÎcH"”î…ù•Å…Õ¹ÙåÅ…Ú%Öëkp›§ÏžÝ^]]›ŸŸÇ?·w¯ÍÓg·Nnm®mx¼vz}cçÜäòÒÆÎÖÚÅö•¥šíKVCëÖKw¶o\ý¯ïÿãîîßÿí_Ý»{›®+W®°ß­­-6˜³¬¯_¿ÎÆÎÎÅ$Ïž=K”?áČӱ½½Í;÷ïß',ž/¬¯o\¼xùÊ•k—.]¹xá*‹Xœ—/Ý`ãÌ™³è¦üêÚµk>äW÷îÝcãÑ£Gœù­[·îܹÃNNž<ù /ð&Ç%¾Ÿï|æ™GÏ=ûäÅGŸ}üÌóO¿x÷ÎÃÛ·o_½zùþ½;Ï>yøêÓçYž}ôðüÎöõ›7ÞøÒWÞøÚ×~þ­ë¯½yéµ·N<óRÂÀœwßIùkº#kš¡9ÍØ¼ÙÅ{æ'︬;üðèÌSÍÄ]ÍÂ탛wôfO…Ì¿ûøîK¯¾úíg_xøèñçÞxó™ÇÏÞ½÷àÍ/¼õÚëo¼þ¹ÏËÂ^zùÕç_xÊ×8ùg8ÍG¸œW^y…õãÇϲܿÿðí·¿üê+opæœöóϽôÆçÞâZž}–_<Ï÷Ÿ}öYÖwïÞ媹½Ü"ÖÜa:˜s7¸KÜ >•/œ;wŽ[ʽâýë×o"иE´®½sûÁëwÎï\†X;qz{ë"= ÍéäúÞ?µq`[?y†.NÓ3 47fŠ ·ÅP`ëîqqãüx}aHZYR^XxŒwh¸w@HDPLvXf^XNJPF„w|tpRfrnQVynjAfbí9²“ Òãs£ÉÙÉ% -!§³¹lSNÿw³R«³Rk²“+²“J³‹2â ÒârSârRòËŠ“ãÙÎÊIÍ͈M¦Í‰ä™é9á1\.õ&éHÎHÄ|÷Ýwa)3’rŠs+W4;Ì)úWR¹¨¤þ@ÜaÖXì1š©Š2ˆ íW®Z£/¢HbÓ WÔ^š|výì“Õ3·§—oO,ÞŸY}0{âÞäòãù“¬YΜx4»vwbéñâÆå‘…KãK/n_;34‰fÔÐNÇ`Ë ŠÂ\Ûž»02©oæùåí»ÃËOWvîÍŸº½túæÊ™í©¥ó‹k—O^^=uŽ­nž_¸±têÒì ²hï@®râ$^IMH“®¬9 ;Ö¿äÿÂm8?$† „ƒ/áÀ9 Û‰Õ‘á‰ÿw7Úx¸ûÐøÈÓÃ7(0Œ¼/Z©£ÃA KŽ3ŠÙ¤õýCé33>ÛØÖéB#w7§ûŒœÀÑÞ³¹+k¾¹«ê˜üîïý6 pñI3 ù-8ðÈ™°sss„AJM&,“ÿªª{(£È_¬˜|Î ‚Ä×'‡/íÖüC9ÿk×n šgff¤— 2vË©Jp?ÿ2üÙ‘ñ&—Ã9ˆdÀãÎ6G¤øßÖÖ9æ/ÍÍC‚#ÂB£Èrf ÷òôÃû€5óìã'wïÜêéh á3<ñÌzŸÀ¿ÏˆX—È8¯äŒ‰ 7N=ýüÓ?û‡‰W¾JF`ÀÆÝ©ÕË›šž•ý£—Ü8»º9\ӓ埔““]T“_’‘žœŸœPš•T•š^—šQɳ³Ró³9@bFjBn•¬RR“bK sxÇÑÆ,ØÏ£»­a÷'T^~ï½wœž•”Ç™“–ž­hà&%)-)^~žš›™P^˜šž“šŸ’ž’[”H1'{Í! ž°ï~OñOßÿîR“²)½•–œ—œD3€t‹aû¸ÜXìWô ®H[W3–[Æâ‰p¶Ú.ê±ÈfÖ±ý‡2—+š® L]˜:ÛÚ¦¹w§sørßÄåÞñëƒÓ—»FÏ6ö\j¾ÐÜ¿ÓØ»Ó:pc|e¡¾ëtÏøÖÐ Ýöái±Ð¦úCElÚ¥±Å ƒ³§›®ôάWvžk=Õ:tqlñdßøÎäùpççOP“Œt:rƧkÛÏNŸžöH†£|31J niy*,%‹xãöNé+_ùMmÊõ¿ÛëçæÃÕÔÃRJ8HÂö™mýH&ѵ H†PÂbƒË28ŽFAE1ØäÐÁ£¬%PtGžB„ìµ³PôˆR4ø‰ì ­›‡¨7rð¸¡f?‘úzi…ÆÝ“ºÓg Ç7—Þü&¾ûþ‡Ož{T[[-eð„VQ¡?mÜ×WÆæ ¼¿×ÍC|f| bÃŽ±Äùð\Ôr@GNõð!½#‡õ°8±)¹'¹nÊYhh(GÁá$N8,fÛªMÔO³]å Z·œáÌÌœ©©9æ;—Ç»Áþ÷+Ú.ï?zpï> eL =ðúʉxPgßa]Í#=Üúæ¿ü`÷´-þÇîî7þi÷Ä—~×{í¼fhéÈê•#KWMîêŽ]69óD³tY3wV³°­™ØJ¿ò‚ÆÀ‚Ø3ãÇ©ªùàñ“ÇÏ¿±£|oÚ§ Då<€{òÈêê*°$'ÏõªÒ}:ºlâ‡ã›ô4ÀÆå¶¨ç¤}ÒÑ~I½øïüùóèCü‘8hx_îÃÞá}lwyZ/¬¢ ~z2ìö ¨×íáî«<õt ŽêàC=¸ŸD_u܃¤k--¯MMÏ7¶v€du¬Omí`ÃÑޤoBQœ{÷+Kùÿdžç±7¶¸=¹Ý„ 56µ`e+Ÿý_²²T§¥Ÿ¶ÃV(zh_ÒüB+d•õÀ¿ló¤ù|{$܈ÂZ×oßZ=¹Nü6ð†Å%©ª›‹ç@ ŽÊ 'ð&Ø& eÂÑú!-A¸ùùET*¾I·³Œœ\lFàË6؆lã›»ÙÆí¥ÒGdR¼W¨¿‘­% 5V§—ÇÛ‡*“ÊjKZƒÒ ÊëB[zÂz Z‚Óë}óÊš}óŠýóó|²s½³³üssCŠŠ‚ ýs³=ÓSY,Bƒ}³ÒZg¿ýã2ýþ–]»»ÿM»¦_Áܳ»ûßµÓ’ ¾ÀÂüäYxÿ¯>RÊøßýøÃüðC­¨äúßýíÿà/Dh*ŽAUS¬˜F”°£Á7W'·‹K˜ÂÁ~ÞÁ§ÃÂæÂ‘(æÌ¡Âàè†èäΔœîŒ|µdv¤ç5%g6ħµ$fð~[\úxny_rnoRNOR^srÀÖž[ÖYçàxÌÄòžù!=úqùZØSˆ²:6 ª‚mb^GR~^eWNYkV1%¾H0ªË,ÀýÖ’UÜžYÜWPÕœš_’CV:ª­ ²ï ÖŠx±ÂqE8K¤ÐÉ/-¡BÁIÒ1&`&pG°”x˜`#ÑÁwÎ]ÂmCqsÚw`Ø‘¥S[ÓHÍ ñ ¡¥Ñ`]U¿+-•`L™zòwº*š;kkr*Ÿ»òüäØbuC[eKGJ[ÀÌiã©3ÇW.[Mžyë/þ‰`¤ÿôgvþâL®/~Ž'Œ{ØRXíxœ:;yþa Èá*cÍ;’!ƒ©AÂø÷ôéS~400ÄxímÝ,DİîìèC΂p¨¹HmüL4ãfüŠŸÓ13œÃa#BÓQ™<6útshöŒÇ½¯¯\äÅžüò«±cc þàÀhß0ËÐàø@ÿèüÂ*I_xóíž{ñüÙ 4˜ŸŸ\_^ëlïQÞ¦Õ“S3ýC_ýã?ùê7¿õÁîGßS‡š_çvÛ¾g¼uW3³e6sAS7®?vJgiG³z^³qmÿòíÐí'Õ ë]ÃC‹''ççßþêW¿ø•¯œÞÚ™˜œšžœš!fmblrr|j– ô YxóÏcør»XCÿÒ¤txx´§§[´²r‚è¡×^ý|ScÛèÈäôÔtô-ƒ‡‡Ç´/.–œ 8hIˆbž.In8ï³CvÅíâñâŽq¸“¼Oóahy¸úþþAt#î9»}pÿqsS 9†EsuœúYEYÙù`73»ØÜÞ˜á‡Sù—›Û“;—á~mÃ}i‚ ‡7?S—r±À>ªÀ±U¤¢BD q9)]äùþA"*¡;TTê˜[[KF$ÁÄ’æ)k zŽMŒÓC~’1éT«*/•Vɯ¤l«ô‚úi ?§‰B®DÙ³Œw‚$YƒRÔ«åS”_²e!ˆÂtv÷ I¢“›;Ù,˜ù,^|ßת„–‹ô ð…âMx j"û‡WÖW7w´ Y¢ãý\|í |­’rLÊk-ûFgýûfýz¦]†§ìÇm&ΘŒœ6:e6¶i5±m9¾e=¾e3qÖjìŒÕØ)ó¡µã]óú³Ž3Ûvc§­&Ï>¥?ºÉb0vÖpô¬áði“¡S¦ƒ'¬ÇNZ®9LŸ1^>Ð9­3´ª;µi9²70ýW?ÙýÞî.©»ïýä'ï½ÿc)öÞ÷?ŒŽH¦ R€=Ç“üƒQ €¡€ZçAË‹µ€öP‚-a#2"– xŒÄ„TÖpbÆú†ÄîG8{P‘+‚Rxž>áÞ¾!^„·ôÍ¿Q^¾!Ž®iÜ+‡` û@+’ÐÉ‘ôð&˜é]ƒýX¢v“¢K½j'ëîCªeYü,ÂmÝ¢½Èc%‘–j/xï(°Bç ǯ`*8D8{áœ#}Pº¹Šfhh A§â´Ž7 å9¸‡pØvï¼óÕ_N2sç¢xò… "’› nå„;»ª!pÂAQâ2‰ŽŠ'Ï‚ÂPLö´Ý¦’Ê„#¸Ɇ'¥ëü¬U™GK'][7SGSÇ‹+×+rë\]Í<ýƤÚÎli7ŽLœN¿ú䯴EPß~ûm¼cˆK†7£Ti`>±æc(óþÂÂRWWÓÉÊGL"Ž%¥y1£q5¡ñM~Κ2|®.žª,ð« 3m LE(;N]Ò7áEy1Í¡ÚØ ÀÆ%HbDœJ{Ðoä;°pøù8 Ž}Ò„£`£¸‘ÄçäýÊËo@Ê…oxXZ~Þ Ÿ{ýùW^¡Ç½; jt³òöõò GÁËÛÍË×ÝÛ_5ò»wç.4 Å* Èn¯ˆ ð°h1,%WaanË,CÂHp¸¼œÁ!‡NtIs;îk D—ÊDЕø\qâðĵ¢ê’^+^H<<íÖVö™¹…^wÚ$'G7 sÆ•¥F¤³‹GCc+á”ÝýCŒ@ÚÅ Â8…Š…1w^4°_ûáT¤‰„SbÀm8áÚ»û°ˆ¢ìéíg-u­Ð ÑÝ$„„á* 1Bƒ“`-ÞD+äÑJô/ÞáStF^øY¨€ö'a]”’Bå]ø2!F|™÷Qv$ÖˆïKj‚5%wttª¯o€5’†ÓÓ³'OžâMô¯…E-|Ñ…K—¯Þº}‡ðÓ§/¿öÊëŸ{ùõ¯åko¿õ¥/¾ù.îË—¯nmïð­í OmŸ}øì£›7®mnœ<±²úøÑs·nÎn\­Ø¼¼~æøÌü‘Ñ)Û9çÑE“©‰yýéó‡F.½¨?}ýØôõCÃç;6yÅ`抦wãèð–ÁäEËÅ›z#Û‡ûOëŒnëL_Ô™¹¤3sEgæšÎÔÕ£WtÇÏëíNž×t,Ù<¶tíðò-ÍÊ=ÍâýƒÓW<Ú'0æ0ì°äT§–Ÿìþð»ßÛ¥ÔໃÝãÓã«õõÝ••ÍùEåðŸ1ØgIéÀxæˆC#ìŠÔFìÖ¢è±A âµ¥¹ƒX¾ÒⲆšÚöÆÆÔîzJ‡ð€*p{567twwÖÕñpª žëok¯)*n©¨êjlª­®iik­ol îM•ò«*oìj'œj2Äv ‡þNÍköÔÕÖÞR]×WÛÜ_ÓDã…þ†ÖÖÊZŠ©St»¯º‘jŠTª¤ô…³'zéÛGAáæÎööŽ.ò,Ñ|±[XxÊh¯@Ú§áà9à‚ˆÆ&ØDo×ÖOH‰¸9»užXž a“¸âæç–‰)‡h:°_‘~Â/±+…! œ#:¥ý¯¼`uôîç‡5÷é_ßz&?¡’OcheVÖ¤;qV3uÁfõêÉßû†ÊO~ôƒÓ0ŒKËí]ì š ªM˜.BU±’ ça›„‰,$$l¡ö ¿à …ÇÔ@vï±dð`Pˆrªœ6íC˜kĘ0ù™Ð¡Â¹ ÃÆ9CŠm#— k>’$W-{hiiñ Ý'T‡`}ä°> ”ª……ÃÃÏÞ¸~·¾ªÑ@–òŽºz¤K=H®:™#:º#ãtp…–p´0õ]¹ü´þÎLÇ·öOl.ž½ô—ß{çÃÝK¿û‡ñ ',†¦,fÏšO]ué߬š^á htŽ ‚pϼôG†fŸb&U¡?Z¸ßGöÒÙøÈþÃÛg·@ O^¦Ü¹¥h*Dßp>¤ …(·t/Çî xǬ“[±—§KÊïH˜·]ØiÞÜ»ùø§¡=ù ÀyúÔÆO¡nù?—ƒ:©iY“SssóËøá3ŒOðŒa Èá„ûLGšüþ·þXȨ¦³Cm#9lÔ!£´í?šÚ:A8jI†+!T•N÷Z¯AË 4’ÐaáXøW‹LUò¦Àžló&­oé …L$猘ýæÆ&ÖÔ”*+)EJ²QUÛ¦˜ÔFW¼pÊ|ïí$C b³ðÆÇáE¦aöÑOá ¦gææ–N»LŸ’+7n]½ùÌ݇¯¾ðò;o}ùåçž>yðø>5¹/\:³¹;±¾¹I|ÚÊúÚêâ©ÕÕÍM¢;Ï^¿8súzÝÕv3+: 'öÏ9M­ÛôMY/.ŒMY÷-¸ ®»¬YµÎxžôX·k›ó9íܽè1pÂkpÍ­w™Å£Õs`Å£Ñm`ÖgbÕ¶kʺcÆsô´}×¢sׂßàŠ{×´{ÏŒ×øÉãmìùòþ‘sš‘ËÆ ·¢§N•L.µÎ­/œèêîë:157Ý3¼1·>Ø9Ö×5Ñß?]]ÝšWʰÆ# ÂoY™y9Ù Ų4)RÓØÐ ÂAk@…±Á;•ÕôŠªm®/¯­Ì.É/o¨NÉÏ,©¯,ª-/¨,)¤WRUYrFJ}KëEEå•ee5U$3¤åçªNûœŠ’òæú‚úªêöfÚñÐXµ ²Œ~’ H¸sMqYe^=VÈ©¯(*©.-/ÍÊë <§ˆ…ŽÚ¡EØñÔ°ççÄgæ¢Ä`‘ó”6È1)MÉ£óöòáÈøwóÂýü|8‚%RP*BN‚m«'6vÎ_^Y^‡Š$þH„:‡ºÅ¥ÕÄ|«ÇQ^Ö+|û‰ëŒm™Vh(yL¢¢Ò¼êæ¼ê–âÆÖ¾é‰33½+ý=‹)]ãn#‹‡f/h&ÏKù{»»?ØýèÛôÏŸÞ¸/ps ãîIN!* ÿJðÄ#ˆB`61É Úà̈́ä„ôá—³³óð‡Â÷ö Â"²@'ötB‹Ý¸q Ã[ñ ʯ × UÑh…‡doÏ=÷î+>å_Ö˜•– p‘O™³wîÜä˜Î{,„¼CÇõöÀXÂíÍ­¬œ¾{çñ3^¼|îúÂôRgS×Üøü`×àäÐ$te?}öú‡f¦¦‰9<µ±>5>059>1·Y7sѽç”éÈÖ¾•ØÏÿÑîîüèC ;ôÅ—ÿúïó¶nGL] h[j[ܘ™šcÊŸÝ|üòKO^yoÜèäR…«›A%™^в”/<÷<šŒ"Á5-9´áü‘<ÏDšpò°¸£#S*|`ˆ¯a±q 6×ÖÖ’$’àR¬ál¹-ܾÃÝãÅûDTò>¤¥¶ãJ=v6zžb—ÛºQL'Æg._ºÞ×;ÜÒÜÉDF[%@—‘Eɧ2êðÈ~_޼LªV²Æ·vú, Äž08òD H©mUò«Û[à“~¸=„#¢DN–úf2îi0Q øyÑ+‰ÔÞ ¤äTÜc8á´A ɪlS|¼4Åæ%9pò/<«ò/ÚßáÖY™T§rUaIAV LS‰Q}uCÃhHš¸îÄ±Ç R²°Kœá’î& ÛÚy…ùE%ùÅjÉ+*Ë-ª,(m*¯í¨mhí.2r*Ë«(©™Y‰éé ™ù•U¹@hNnE^.…<H)È*K.h í1ìÓŒÎ9Ÿ»ñºÅîî~~w÷·vwÿxw÷ϵËw(¨]Ø–½eテŽE~"ïÿWíoñÉáœSópw÷µÝ]çÕÛÇ.]´­éó/mˆ(¨JÉ/ÍHÎ,HL«LÉ.ˆN©Ê(ÉŠËÊ$ì%1' ÊÏ/,4$­Ÿ5ü$ôT K\lœdJrï°f;*2Ž÷Y󵏸D¯àŸðÀ è°Øˆ¤ì4Ö8ÅÈkKÏÉÈ.Èa€¯¯„Ã&EÆEÅ%ÇW–SÛš„Дܬ¨ä„È”„ø¬4ÖÑiIAÑ4vPŸ’œFdK¦ JNAƒÑÆv&óH(EOºCÐj‡Âíô… ^”Õ8c2R"S}TÜ_0ODô$2â +÷KK)‡ ·—§ÜogwlSÁ&;—É„ *ÏœÞ&.1!-)‘"6é<6ތꑑ1.yoi£‡âHdÌÈŠ‰I N˺q²°ö1“ÞYÍÄöñÅk­Ï}…áôÞî#w/_:·vjcõ$nfæ Sƒ=3YxG¦AŒŒø³¹½øh™hK²WIn{ýõ×¹á0Æ;¼S³RS29O´¨ÌŒ<üˆ¤ÐOö‚TïÃ4aC¼Øf޳@GñäéK$Ú*Ûè¾â¤gçä oh6ì…ˆDmÀrà¿„Ü»òúϽþÏ=ûÊÌäRj|fMimIn)KnZnEaE5¼py5=7^}ùø<úY¥•©õQKf ^Ëw¬GÏ´¿òÎÚUTÿßÿ´û!‘ZL·wþfwõÑ— [ºë:Úã2ÒñƽóÿŸGÏ??8:VÓЈÏ )/EÕ.//*£‘( O_xÄâ*$ø€käÆræÜOnTO÷yÒGS›¯V¢ÍkÊ—A¦¸õÚk¯á‡ƒ×å·ì]ñ¨/¶¹íÈI¾ŒY,ñ ¼Ïx@H337!>Hƒ ¤bz•AK’¨ú—ÌÔF¯e¾S¸±© jvn ôÛðÃ±Æ K‰GoŽñùYG8Éø®ªo&[€*ÔØv’ñMÃ&òÂ,­l(C( ¤b“ñ¨à÷L7ÈFá$å#¡y`bØ}üÃ’R:}&¥S×ìÂÔL*(Ò‰†¥0;—dfœ|ŸiX¡2,«%¹UWâ'Ù%k .g**©r¬7‚Lèk[]PVšAZ@vEfAMv1ëܸTOJ;¹çfä`(’°V×dUTæ’ŒUXTKPhqñœÅe9…­Aµž#kdž–œ'NãÄþ«íF×t§v u'8³Ú16ß3µÜ=¹Äv×ôÇK÷ìZçôZËØRãð|ÓÈBÃÐ\mßXóàPÓÀ@mÿpUïHQËPU×dysnY}z^IveMZ]Ó}´K¨·e÷²ÁÈy‹Ñó!ë1M½1EµÉYE”oÍ+£mJCRN]ZqefIqvEB\&—\ŠqV^Å'¡ö,rg˜‡’´+á'_£¦quU~qÖ8¿¡~fZBR-mã“©ˆV’™K%3UÏ,=ƒ}xp´”—ðPÈ"dCÙi¥¥#OûºÓ‘uÍà)‡¥k¯þíû¿»ûí¿ýާ§íÅÓ§Î.¯ÑH˘ñ[EýÉ!dF•¬Ò–ÞPe8´tåÁ½â#ÔÔÀ>Cáà}òJa2÷ö ,%AƒäÃ!ޱ6 Ô„{Üã9÷â6‰¥ž÷XJù‚r¼(‚„ŸOQ©?½Ú"œ’5Þ¦û÷?¸ÿ¤±®ýèa½C4Gj¨½©w@÷ÐQnËØÐ0^vž‘戱Æ!ÐxÃaxÛª÷TÐĹohy~¢Hî]¿ø£ø[¬•ïýp÷¿ÿP1ÿÿãGæ•—iŽŽŒ¼õàß!î>R]/©¢„Ÿ¤åÕ!ÍÁs[ÛDpÚ\¯TÍU‘–Zb™/ÃR’¢¸FE'ªˆPa)%ê’ ]²Á~)…§Ý»c²ÁýÇäå}ˆbí¯þWT'»åÎØÙ:-/­QîéMçGöRžÅ»¡söŽÂ: k(ÊÕ3’ñMt%J¡DB}m8Éï&Æx«oéÀ†Ãt꓆èd|sÓ 3!i-G%)q b‰x”ò!’À†Xo|GòáÄŒCáû”wªÎ* )6þ˜ñ–®‘ÆöÞš¦®ê"ëèFHäQðÈSö@¼ YqÀûF£A:‹fŠjƒ4D‡»MÂ%ÌRÅI¦gGù‡Öä–Œ¶ôŒ5uÕµ7uÔwt–Ö&dø;¸{Ø»$ÅŠŸ—L§ÓÌŒ„œœ˜ì¼¸ ZȤ—¤¥eª¤ð”¼¤¼Ì¬:çÌ:ïþó%û¶™ÏøîndTNkßøÊÚiB `½ úšš]š]X›œ[™Z<9½tz|áäÐÔjÿøRÿärÏØBÇàDïðp[OOûÀhsïx^y[s×TSË@eYíÿÇÞYVqtmø¶Hqwww B  w'$ÄÝ]ˆCpw Ip)uwÜÝÝÝîÿÌž°ÍG[jô¯n‡ídïÞݽ3;óα÷À ~Ô51Áò ÑXÉ!¸¨{r1—øÚ|jöPß¼[ëÖÝGÚœèk3,xð8—~£ëßc@ÃzÍË•­JðMçözvíÑÉ’P %àÒøšÓ©’~•¸¬$ZE£…Þ«„–ôƒ"ËèÑ(@È]XUÿlDPþŒ¶—9ŽFxw 5:™µƒÚ•?¶k·>]»³ïÙ± ¥‡eç.æím»#w% ÂÖº70 );{Äq";ÈIÛÚÒÂ*ÒvæJºom;¥¿ýNjuï 0|Ø£¦65k5¯!ÀLä6ñ4áFŽÍâæ¯p*«dBrhdŒLqÌ5¸™€p8Uúù¡JBõÍ åãÀ¢»£¥•Vºv‚:TŠÆ×ãïˆV çdŒ.£¿XéÓMhzéMëaƒíƒÆ{‡7²_d˜{9¿”üÎS,’V5ïóW/<Ì&1*bZt\ˆ¨¦KþtîK-(…â)b= Þ –¡Ü‹›¢l$0 [/ò#é Õ7 p¾ÞÍ ‚^8‰¹ÌÆ*‡Œ‹ZN¥Î–¹¬nñ­@§Çe…ñ„= §èè4#ýH á¨Ou—ö³CSÛA ‡R³ñ‚ùD’¯ ŠäzXÙØwh3tÄ 1#‡Œ¶íÕoíàñ£ÆM‰Œòðñ·é`1É·ª½o߸“BK ±Ÿ¿%é§FbûœÆ׿×ôˆÈ ‡Ïà®uû¾²hïܿߢsgWoï·ß{ÅšÔÐȨcÆ¢À'JØã(C!¢Ìz…Ì“h¿,§ ‡:ˆ …<&tAø˜@¬ŒÊI;Ól&xš-(µ<Ü}µâCA¶Ã +²··/¬pšàaN c6-ôZQÑá¾~ž^.1KæOìž\dbX1çIJö‘QîÇÈ„£ü° #€×93¦§$$%'¦pYÌ~p^ Ò@Y # æœys·—ÎNîøj…„„a. ÁÙK#àH$$Y ñ|I‰)R¦&+Š“E‹–À–‚Çž¯ |°Kˆà üI¸šLŽsÚaW–ÎŒ‹KÀÿ Î>Gâš\\8S ð˜GðÔikV¥¦¥®[0irҬȈø¥‹×NKš;ÎÒ…ó–OKš9-yƬ³7®ß0kþÒà™«6|Ò,e~N÷€|ö~M<â>=õ”6ùà“ow¼û"é˼·&ueʬÍé[vï>|éòõ‹W¯elÜ´:-B“U«SqI›;oÁÚ´Œ5©i+W­ëdé²èQ—/_¹bŪ-[¶ADñ‹øÕHcø¯aŒ„ók"HÌóCk™7w±j®¤©ÞhI¤aБ:n&þ&ÐgÁF+D0ÁGÈÁû"o…ö¡ãèMhMˆ§œž2ÇÝ͇ ¯{Ö((v“Ypƒppšài«Hì¯"*Ê ð¨Ð¨X˜—EªÃµ‚¨¸ Âá‚ó2v¸¬‡¢1„#rg01æeˆ¯úƽž¦$—A&cÞD>c>EPãOIíÆG"±IÀó¬Øê4ÙBi#í¬¬ OJŸµ*zÚª))Kc¦†8¸5ªXZúª¥Ê‘ Ž$ê:Ú † &Âf”)&ÀŒ:Ç¥¨©à3·èˆªˆæ ®«¦ÌHŸ½4,iiDòò¨i@…EfuKVªV²BÃÚõjd8‹nVÍÚw0±ìnÒªƒeÖ›4ƒ"«¹…‰¹Y{ÓÖ%:ÚVšì[&pJm—P˜vÛØ¢J}R0øzû}üÉg[¶îøð“/7lݱíýOÓ7¿»,}ë’Œm‹Ò·Ï^½eê² ÉK6$/Û·p]èÌU!³V¹',tK\é–j=!r }L½fÝê50Ãï™Læµ›5b½‰m¯n@laß©%|’ëÛùnÜ®IÛî=;ô^·.8.Ã'òíèiiI ÃㆎoZ¯iÅòUjT«©Ò÷4oÞ!ÓJs´©K¥´1§-Ìø± ØÆA¼ˆünÛÎLB챆’–¶I»‘­»¬ðŠÚ>ý˜9ï%,X’¸4,¡GKó&5êÀš “Ç!ÌÜ´5]þ³E8PƒÀdëæ&¨Éøƒbi®9ÒE;–—˜T9Í$‚íÚ¸™k£S(k¦L‡ñÄcì$x™IMBP-j+d8–®p’XkœTXÿ•¿ÔAhXñÈJ9HËÙÂ1ã!ª11O1[áù®¸fôKQ7á•Gá7˜‹±DkÚ¼|Pg7(”§aþ3bJöµ.=Ù½œïŒ"“âêNŠÜùȈ…iÇgåÌ—«Q“†Ñ‘|%" iqåÙQgáú(j@ -G{‰Ûòœh)‹.Á3àˆfŒûqŒ7?àÄà"ºà…+æ÷ÚTTˆ\ñ 7"Ð×IÐ7J…‹pöäÒ˜P¾qޮɒ O b¸µ8Ròx… Ñ’ ŠÙJË/Y´˜ oìOòÍ——Ÿ“;_B'sg3x›sÄ£ÒÏÇ¿As3Cþª…» 7Lr4ø—ô ë?mùü‘ÍÌ:/]½Ú€2ï C‰œ9U€4qÝ9Þ‚Gk¨äIöÍ@^²t94~Š\>‹n0ScIÆ”œ¹`Pcñ(êÄ FÕEÂM+ šZ|)UŸ*OKÕ ’:ŽiP´”ȸ„Æ‹ò™M:Z.KüvMŽà›ª%¦¡{. ˜¯ßÊG'MKÝ:hüù s 3cîKë‘€ -%ë*Þ7\ßyûp‘ám š+©s‚£Eª“ˆï)¡–DzE%ZJ|¼q6Á2I£äͧôõ¼pÛÐO€–d£'˜ƒx¨³Iv B=TZN-¬#|ÊiüI,"ƧÚyÍpˆà=Ñ-ÆÑËiàÈV5ëCÔ[©xi(牵bx*Gª¤ UTâc8¼Ù« ȈÁ3AE¿•#Û –±B’P*ªQ©Z?ó®ÞƒÇ§¸ÏpMœìG™ê˜äؽ‰Yâ¤ô(ÂñCê4mRºzÕÜÅJ”!®tͺ…ËÕ.Z¢x¥"…«–„©l“–oXX•ðô7xûpp½Èšð¡þ¢IXÿÞ¹óäܹ—®Þ;vêê¹+¿¾ç赯\ú|ßÅ÷vžÝòʼn ŸXÿùÉ5ïY°moÊú>svLˆ^?1f‹õ¤Ù6¦æ+aZ¼d£¦Z“ü3_ñbgŸ+-e-ψü®±ÙG6w ËSÇÄ´]/(wi¥…v^óÇ8-µ÷„p$ÙÕwTïMk7®Y¥V½šuÉhƒ©ºz5ò”+[®dé2ÅÙ—+_ŠB…”$P0×oP›?I2ÀŸTH§X 4ÉTŠvS¥dÙÎõ[ iÑ!i”Ëü‰¾Kƒ8¿5Õ=4o¤\ ˜ †e°n#ÑÒä%KÓ!¤ô( iA7oV´d ôd´$Íc©reáÌäzŸ‹Eݪy÷þ#“í½§Ñï¾s\‚’œ|]ŒìؤeÅbd,Ãb‘ „Ó=f%Ü•*£¿  ¼±RFG„ù€€ÀPO/?d)Ü‘¥€7Ä5¦' Þ‹‡€œ sˆŽ®"«…F¹•r¼e(Q"¥üyrøÏŒ.0Ä:‡ƒS¹à\fLœ¹SDa ‘y ¤c‚§ÄÆcö+^¬ŒXûÀ¤Ü¹ p;ì7üY¨`q¢ªÉþ˜Û•ö§†*ה̶d@ìà1˜Áy*EñªŽhF8¦Û$;¶ì@çPx*e… iaÖÙ½\q› ù¢" ÑÁù\Ü<óø¡ñí¥ï–.]5qþüUËå(’—GTa €gN+äM¢ß6oÞúñÇŸB„„‚*áÞÄÒ—ƒÄ$X Uó*¼bÕJÜo@‘ö ÞäÉ…Ó;ßÒ>BUC»eíDÖýHoxš “dÐ頚Ț¦Å'v>UÉ–‹+-Ra±l™JyrsÓÌ ÝŽ›/aÛ~ƒ„ÓdìD{[^~¼¨(É-@€|@h$˜ò!®àëûïB¸]»• GÀ GÞœ¡#ÆŽ=:B€*yãòkq3àìŽmD,ŠyYï-=ê…7€y~Òßl±¬J” ¡ ¤Mki6`üÔ‰žñc]cƹ„ušÐ£_§†&&5êU(R¢z¹Š,üÉ3G …e”ÙÃÛ\i/Byþ‡h‡™?{î^¦º÷î3Æ5f¤3%z´KøhçÍ*å-V"w!“ÆÍ!¥„C®P™Ò†\y oä©áM•Jû5äÊÅ å«^ÛP¶z l!Q%B1•¡¿/R¬°Í€>,”`¸¿pùÎéó·ö½|öÊ“'n¾ðxÿ¹§»O?ùìÈýw÷ÜܾëæÖï®g|vaé»§¦o9ë4íÓÞkønèå¸|¨û²",kÖ²¬PªF¾·ò³¬d~Èh,>Ɔ²þÓkŽñ0­T¿™e“Î1#&'ÓV¶£¦ ;rRøxÇ]mêU¯W¹\•Êå*‘˜¦c32æäΓCMPZbUÕfTà8zÓP±RYX 1škhÇÅ æ2äRÄÖŒH‹š41ê5"ÂzÔ´¡N1ý'D ±‹çlÙÔ”Z*\¸ZeÌi䘭Y¿.ó¤dëû7 È~Ó@2-Üò+¬ZO‘]çÌ$%2Šç+ضa3ÈMÜúí?Ü1q¤sâ8·¨1Nö=´¯Û´RáÙ´ñ ˜I”7J`Ì3› P÷×—á"µäÝÀ›_P(+e° „SÜ”VÖä_D§OŠA>R.'¡´Pß Æ.†J*<’:ÿ€ ˜Ø)1SâPQñ“â“ꆖqÎ4ÓäØ"¡‘oÙGUuH|ûðý+Œ—?ˆ˜ƒÎœ¤<ÅÇM5s>äÎ1Ñ ñÓ"#b9B² †…FCÝ‹20*2nö¬aèÖ“¦ÇÀ~îüyøI¢C9¹`Á"ȧNM!Ø Å&{ÎDK‰k(¼”ð B¸8%$GؘÆ5âæiÔ—.]ŽÔq0â —Z°h!¿Ää¤ 6!3¡ßƒÑ˜sR¦Ï\¶tÕòk02-\´lñ¢Ī.Y<ÁÂÙ+W¯@m¸võºÔ¥é‹g¯Øºñù V.KݘºnËâe«—.Z¹bñJxOf,K Jý¤iðLƒ‹{ÎÐÀò+?[ÿÉêÕë—mÚ8uõÒ™kÐ9.wëö5éiĤoظpÑ)×®M‡Z…ýªUkÖoØ”‘±>=c}Z:!E«Ö¦aŸ[²jÕâå+8²jÍjX˜!aæWs2‰¢&{ž%èWS׬cϯÖ8¦qÒLåš'µRQr2¢--ƧDÍ#+ÓÚ˜è8¢‘bÏ¡%éq­2‹ÆçS‚šˆ3AF\²xEDxÌÌóèGv›—ŒZï\ôáž¾¸ïfE8øXxƒ#¢A8àÍðË‚p‘†êï-y Òî¡C‡4›ŸÙ`ˆØ³gߞ݀7콌CrŸ>†B*T2 rD¢vPY0±¡[ ú }#FTlobWƒÎKyŒã¬Yø Ä 'ô£Õû°ý('”VmG¶îÖwT°ÍˆÄ1ÎÞ½†yõ““e¦õJU®]®jÓ: Ûµ6G'iÚªMæ-ê7&Lk¹D#*‘ Ü “2ìi›JÈÛ°!§á˜)”Cw[¿~£CŒ ï§JH¿±üÙ©V³*ùK”/Tž‚6­Ûµ³ìÜ¢•¤ ­š·1m‚â׺&-šàÿQ¿I½F;•ï>¢Ä¸àœ^‰å‚Ž©¶|‚IiÔˆÑîÞ~WoÝ»pýþ¹w¿|ê–ñÐå§û.Ý0nüúü§Çž¦~!%}çÜÍ’S¿[þÁÕ¹;Å®»7(ð£~;l\SûMž_´RûršÖªTêájµj²ƒ/e%G¿¢þS ¸D7r -ÖÒ²Kï;÷ê;6Ñft°EïØ>#Â÷6¾wGëšÕê–+]©FåZm¶Äaž~=­Žv uR P‡YcŒU¹ƒÍÌZ£ÕmfÚ¼j£Ú Û4‡S·ií:½[¶í]·Eˆõ°äv=†E÷>pœ‡í°>­-j”+_¬háJU*â–‚{$.¦P§@N‹ÅKu)ÓÀ#ŠÅ”:ŠeRF …ñºQƒ†dñƆ×Óܲ{s3(»ûae?ÊÙ§×°ÀÁãGw´îܨeÙ|…qZC‚Ì6$9 ÷ÆüÈi´£)h/wìxWKÏös¯õöùOñR¢ÉÿlÖÎbÿPËçˆh7/_^Ž£q£Ê*:$"Dóò÷  §„{ED‹\3Ž‚€™âŸ2=9vvhH²Kò¢ ~a9½BK¸Dw žså‰ñéSã·‡÷O™“>eÊ´©s¦X±s“â½·ðpa*„CþLˆŸ*v5·| ÷ ® –À» )e:)Ç($·›;oQfTäócº›5sƒŸÎ#À¢eì¡–ž1s6ùÉÀ­•«ÖΚ=—O¡êç–-ÎK,\:o‘0Îb¿`ÉrR¿¾´_¼dÅÂ¥+Øså+—,]µxQêÊūצ/]¿iñæ­ 7¯_¶yéÚK¶lž·v5ºÇíë6oX™‘Õì­v™»±PÀ,Ãxïòž!áï~ÞÅ+wßÙüNzÆFÒ¬Þ¾eQzúÆm;2ÖmBØÚ¸q3蕚±.mý²€p€.ÙoÙ»Övê*¥@ßÞ”±y3Œ'ë7oÙ¸uÛºM[.]¶q¹Rùlõšt€yMj¡ )2Ò7RøSÒ ¬Z¹ÿHA>±Ÿ3C\¼«€´Ù³æc†ä`F#´0æ7Z˜?9N‘NTK„iôE…êÆ`hNd&^¸ðÚå}ÃÀÆËà Æ[†gG¨°çÝ£üP†á0Qý-ãážl eØP˜æÆÃ§—áŠ)†7³8L —€ 'Ä]è!ùSyˆÔ©# À<æYpŽOUªnÖ}˜FïÚ±Ï$óîöz»÷:°uGóê —¯Q±HéºUjâÍO$à­JÍ:°RÁ¦Ãõáâ²\Pø¹©È]„GêÍBkð'MA£Ñถ¯¼0ÕªW·z“ºõLÃeÖ°z ®GÍ&öm¬M»vèaÑÛ¥“ÏÀQæµ4¬TµB©ReË–fÁzŒ„xI(šdáÂõÕkÕbÁAïS§¯9ˆs N˜$yÇ8‡ n™d†›l3âÊIí{¹víï`ÙǽïpX›[ר_ s „ÞÐOêÁp›àÜ_áP‰öKÎQÀªÑãí\<¼QQ|ߢÂBC£ÃÃb"£Â)p$†ÇDZâÆù q«ñ-VåœS‚ýB¦DOóŸ=œ½ìí”…_¬\÷þâÕþ£í»6kmѨE­ò•kW­‰Ãù rçGK M2öÊEØÐŽB,„:›¶ßÕ¨IQaÁg¡³U¬«÷¦éó·O_øî´…_-Hýjqƶ™Kà®^¬Lùb¥«@jW»A­Úõó,#а1`ÐE¿î q¨ÜK×­o¨`Ruâ”ìΉ¹ìýÙ¾ÿèfñ‚EÆMfY~êÒ•ÝGNî=~á˃gNÜ4î½ô„C-ùîþ‡oï{#V…&î_œ¾kƲ]óV혹xåÔÙ.“\L[™ÃÝWµRM“zͬÌ;’#XtÂÒúFË€7ØAi4é¥.F¯¨âŽÔYh)ÍjÕg5°!:eïò ŸÏ\þÁÔ…ïÏ\òÎüå=Zš5­V³zÅŠ5ªWE(GøF€ÆæJ³ëªi¹ Á•ƒT0$pçAªqâcnÊfR¯ž&!œ?]¾nÇÌ¥ïÏ^ñÞœ[g/ ¶s±25¯P´$QG"Ãox[è‡0'Gå/-ÃÙ”ˆ‰=_—áÐ 1ép…?>ÜL=ðMÀ‚SœÆOpuœhïþ4 Êóü(8D¤‰hCÚY£VMJóÒÔ´’pIK/P†øŽé¡´¦k8AµªVäë48E:ˆÂ×9.iyTnh`Xæ‘è5\ÙSÛhUš‘WŽï!‚r€úîï*Ã=Ega4BsøðaEg¨¥CØûÑÏEK©#Á(À› Cë%„ç`ÐÀ=ɉA ˆÿ$‚È'ÉqðBŒÃ§N*Zê–VœÌ©bûõßÝfYXÜâÐ)3¼ƒç…DÏŠp<ªMÝÆµÊUÂ×°Nƒ–Dx@º¨òÈ Ç²×ᚪ͌ÀBI8ÂÝù“MBÀ]ž„´oVmÛ¹7# l^`ä<ïÐ…>á³=Bbì=,¶(–+_™b¥ `&‘Í ÁÃ;uî;@S $?ô£EgB‘Ú£élŽ W¡Óðê“â úÍ©:Ud¸æ ›NcûÀ±sv>±ïÄÅ/œEEùõɇŸx²m×å·íTüš} ©£—íõœúQÄŠ£áé—ÜWœîä½ÞÒcMûÉsºNJÌ_¹UÙ*Mê×j€–žhWâiRyrP1Ÿ©ù\¦´ NÌÕ²½¹íˆ¡ƒÆ’k&5 j™‹ï7¿%!ÑÉ¡#‡ŒjаiÙr•«T®Ñ¦iË>]{B#½@›¨€ ­µiþ$øF2ùI’öh›·5mŒ¹™Iƒ†}ÚwѹGä8Çyž$Š ¡­èš9A‘][´ª^ºlåR¥ëÕª‰¾Q¾‹0‡˜È•³v=Ç„.ïÂ=/1©X¸¶æÈ—„““ãÛkì¤ÙQs|#Ç.‹Ÿí4|l›ÆÍ ç/@€­Žpàæ7I2Ô ¼ýÅ®Mt’YN™@^èˆX\™0 ¥jL8©ÂÂPN†FGû…„H…Ù–IjôŠbô×RLš8^16 :¡ïç¶Žþì½KùM)í5`Z*A(šv~± …gtÊ”ˆ©x„ÇÄ…O óŽ?ÆARÈT+ ôL‘L”̧̒Կ?;å\ޝ>Y¡UꟄäi)³ð>g‡4Ž3¡¤‚XKˆ»(à™€ó;ðFâM¦{ qanþ‚%Èmh&© Ʊׅ64“RPHRô uä9)ؽ._:ÅÒ¹+—/Z¾:uñÚu‹Òҧ¼dýÚÙk– ­]™ºfIÚªô·£Önê–0»kLÕ)ËËÙ‡¦]xŒŠrÿ™« -_…¤µfõ²5kVoÜ´$-c5)OÓ7lݲÙÈ?8µ0Â4"% ß  EV%($(84$4<04ŒäÄÌÍœ·0mÃfD· [¶#Ã!É¡¢LHœFðžÞt€IT2[œøñ'âOq,b/ŸJÌò™Êïªâü”$‡Zq ]0R5¬“;>·ìÛd/ÐÈËÀ¢j.´ÙÈm)+* Û*JXŽ#rüŸƒp¨(A2Ÿo¿…©.Û^p{÷îß»çàK7rÄ8@„#ÌPd¸Â…ñÖ}(Â΄‘KèÏרp•Ä‘½%â‚h/ùgKÔe(µÄå’ '3ñݱI‹Þ-ÛôicÞÍÄÔ¼^£N-LûvìR¿j5ØëkU«Þ ^Cüþ[µ6«V«vñ²eK”)[©Je¤aÝæjèßåŽä"O¹ OU³z ʺ£¥mÇNýÚu°51ïÓ¬M“¶6mÚwnѦhžüeJ•­#~s“v–ËW¨„q-eE²*–.Y®xJ•j‘Ó RéZ­ÚäjÔµäÐÀ7ã‹xDWûøÙÝ*å*A äãtâÂåÝGNï:véý'¿=yÿãCw?9fLÿêvÄ’oÓ¥l8ç6í3û)-Ø¿þjÜ»½3.µ÷^gî¶Ülò¬ÎIªµ)[­i­u+–-W¾r•™RÌ;¥€kBÑNòK++RH’`‹vÛ»v¶êÖµ{—N]!OP©(!I àÔ’Ð#ôîM7áJ²&}ý \LÖoáÖ¦­Gâ··³èHSÛ%Í›ÉÁ¦Õ ä§­„íŒxyØb:P „C9IA9‰ ΢|Ê9|…¦N,Ú\'KëLjIíRçeÃI8¾ysÐU %uö"Æ!º¡¥„£þÏA8‘ሬ|ûí·ÂÁKÏD†ËŠp*yÕ€¡‚pd9aÏ"]×RŠbJÜ…Åa’‰©ö%~tÑr&kÿ¾½¬{ÂOÙ¬¹-ü={v&¦J-óû6kÐÊ®reÊbq#£›EÇNEJ¨D…9óäÍ–CycŠžMBv¸…¨=y-|Dq–³A T´haäFÓæMZ5jؾY³.M[2}wmfÚì 4QP§nS“–mÚYà#úVŽ\yßÈ ä8¸¢®äÇä+˜«vk3CÑzõ\¦a‡+ä† ÷Ìø @®|N½ýBž»úÍSß¾üîwg¾=ûô«³ÆÝ×+>¾99þ=¯YßF§žûéĸ¯¢×\ Yuyê§FßÍ·Ûùnjé¼¼ù„ãòV5+[Ó„DÏ9qM~3>ßGŒÆª“C ¹&ñœZÙ5ØP½Q•ν·íÔ¶©i¯¦Öõt«[¯»I‹>à0´àù9²5¨Wß¼u›âE‹IÆÅ¬úCislf`®Z”s ʯ~i6Å<ߤvní{š·ïÖºm/3 [lf–­ë6c; Qµ‹—¨S­š©IKÖ4ØÞ„u)k›K`Óч'äAK‰ÞWóçÌ“//ß…ttä€Á][™íÞgŒ•m,‡¹†°9å‡ù_T'IP!F' ÂI¢8áÞyç=Þê?‘|ù§kvJdRDprTxRܬäÙý»õ·4ïU)y”°1“8f©K…=ÞBœ@Ú¸ *”]Èpø› ÃaŠ£‚N…ë›Y4n¢’nŒEÆöd_â $¯©­’N5‘Ò¤©I[ó¤(C¶@zÃ[TÃF…G’•,6¶ÕKW®‘‚Yë‡F8Ž/Y¹fѪ5‹Ö¤.ÕV¥­]™–ºZÁÛ²ôå+7®\¶zIúÒ•›VmZ—þñÔô{ÌZQØ9¸ºJéqA³ö_ñuï…{«×m[¼p¹D¶mÙŽcHÚ†-©·¬ßþNúÆ-X× ÊÀÇ/«V½úµëã(Ðû>érÐëHÞeÖ'9«èæ-Ú´oߥgOÜW®Åî¶•gfŸš‹Ê¦ö:›·c3Õ›—–Lè¡ÙU²o-ƒª!ð Ǥ1loHoR@;Ü#YpÀËW$—·¤¸¢©¥ÎžkJtú‹¥I¯Þ¶ˆÎp ¿$NR€ï˜è'y÷þ'â¡*ÄÏ Â1&_a‡ã‘át„3z"ð&‡¢Ì„ÃÇDÅÃ,L&3,úF1}I®™Ý$q-b+}I,ØCJúZ< ÌÚ´‚ù§c;³.ÚuhÛºm+“æ°ˆjPŸŒ» K—-E®¸NV]A¸ÂÅKàùNH '×'(RdI¹+ÏÀ]dSé?JíÒ£k·]zöèjÛ£Û++„¹îfíHæMptîÜoU©Aº*—5omÞŽø‡<¹òæ{“hïUžü9‘á ùª×šœˆ.ÇDoîîƒë9 Ù&utñÝuâò»N~zèòö?;ù|ÇÁgï7fì2F­9´âtìÆÛak®OÙðpÖ{Æ€Õ·œ–]»ð¬©Ûf—´¦ãæ´›˜«bÛ²5Z5¨gýüŠWP!\0Ùã {&Vt3T¨U¼]׆¬XWŽék;¶G·æ½ÍÍúv'‹z;bÔÊV®Hž(–ݬº E±z AøùìÙôäˈÑ,d"L4û¥2×åÎE¸±¡yãF=ºvéˆJMf«Ö,Úû÷èÙ¥­y¯N«ðV¨HÊUÀGK‰Ü,鉹‚örY àÅÚÇ­é n­…p)+ÁT¹ ä)X¬Pk³V8½¶iiÒºIÓP²µm׳c'ó¶m:wïBÈz¡²¬c2NQ%ißYIŽ‚ ÷—E¸žÖ6•`›D ˆ× u™ƒ00õHHxPh”HTpT¼oP|¸œ@\"ˆæhwY䡯 1,é «WªV­Jõª5–©cQ¾÷¸‚á‘ÙÂÃK{„»­þš®çw)13¼|b§D„N š=sêÂ9‹†öÜÕÒŠ9‘¼næMB’){Ž02u2o2ÿ2½vïѽž&ø› loÈpÈa JÓf-¹‚$‡£È×ÞpB¦4jܼUksd¸‡¢½Ä‘µ$2Þ’”8h.\šUhËêrò£È·tU꼫(*$`Ù*&3Ü8¦.^˜¶hášyƒd,X–¾dÝÒÕº/ØR;bfNÇâãý;F|óÌxð‘ñí¯÷NÊ–õ›×®Ñ)é›Ò6oá6o»ï€þTê7mŠu€ü‘ä bÉ‹a¾fõZP(°Ç›­~ƒF|Ü`ö‚ƒ„ÃÙ.}ÃæÕië@¸´ô 4ŽYÛöØ 0­-k±¨YKµ¥N݆´!pÈ2.¿ˆQ¿kÅ\rèz®²nà:²’àRÔç´œ|uè, “>EŒÃ­ „C“ŒV™7Š bï¯ ÇKøOF83b-‰G;œ€Ü+œ*÷í;°oï¡_ˆp"Ãak!Z€©“)Ï=œèÄ•‘:Þz¸Ø¡“°ñ±dŠ^Q0Ö­«%%€gÊ^_J³–p&[thÛ¡c{-­iÍŠ•+Ô¨S: TˆÄ  ¨$O&ÙÈ+ÈÕ$MWÿIöY})ML[˜X˜šwµ°ìdaÖ¦¥…© ¦6«væ-LÚ´6Í7WÞä:µ ]E A‚ÇúµêµjÔ’0sÞ(V«-5jZ¿~Í:U›wîZØ´—ÇsºîKI8¹Ýxg]ÛñÝÉ\Ïøò\ú×דÖ _}`Râ'Ž3vKøfHÔ¶AŸô ùbpäN+¯Ì]>èø]ãI›Úºmo5i¹ùØéo•o_®Zëúu[V,S©lÅ*Øá@¸*“Hm•×5¶¢G´¡±Yýáš÷X¿¹I«æM:·lÚÓ¬…E‹F=ºX¶·4¯Ý°n¥Õ@80§Ñ梄”¡5h%q=ÅG7ÑnZÚIµ)¿JÆqÍê­[µ¬Vµ2´^:Y"õÂxÒѲ}[3èþÛ÷²²êdÖOËje”)-%=Î¥¸×çâ\„~§[Å–E·ÓïR¯nmÂ7 Ø¨^§F…j•,­:Ñ¿VV]ºwélݵ«EëÖT Vi×Õ²bƒš…+”d#2œŽpàúI„9·¿)Â!Àaxö°Ã¡>ÎÇ?Ä; ,(2Á'0<2&7ñ± ¶Q®&ù€ÉÞ[­f Nª×oY¡eïrC] Á_¿J¡ëŽÜzòÔxëă‘¶ÃaJIŽKšœí‘7uPÏÝ;÷`6d–”I`“Y’i”=ŸoÈhÒ˜1Ñk‘Á•ù-%i3™=A&8åiܰ)s.E&\AMà­^ýÆuë5¨ ­ºY8Ë Ž%•àœLâˆtØá^²À‰áM¬qºND:lo V®]´2mùò4œ—¯^³$uÅ‚uK®[D¸é«6-M]»tÓœµŸ Ÿ‘QÌ?9—{LmçèõŸ“¦ãøCã²õÛ´¶o}'cMúºô7lK[·5mðÆ~óÖwß%%!ÇäU±jµJÕÈSŠ]¢JÕÊL ¤%­‡ôL@TÓf-6jÂA{Dn |\ñ¥D¾ÜñþG<áÚuS×®ce€äJûoä Š´ ®Jø‘}mYÐ>¬ð¢]²t%mK›ÐJ¬ð•EöE†£yIg*xF¯q)=•qÃ*¿1E6c˜Ã†f%ÁB„ž„C˜ã5›œÈp_Ê𧉀ÙÙ³g™ÎÕîÜQü5¯ð4á¾ûv–gLqX2‘á&N˜Á_ôüÒÊû³6“>êì½»¥ýû&6µw\_¯{xѽ*V³¨S£yžùáN?x ÂÕr )á˜Ç5š4ߥǺV:¡BG«V={tëÕ½~­*ã†öímÕ¾‡UÖÌ]¥*”ƒí¥I³Æ ¶.!’Ð})EÞ¥ÁA#¬qâwª;[Š~R$-rÃÒÜ¢µ sú“1®{WP0ënVØ#Ë)Š®¥ DTŒ£"©‹<­_“ÆG5-jjÑ£T–såL™'‡i{³ö],a„nܨicôµQ&¦®›¶mYˤQAU­áMÔ’ØáÄÁ7B•kÜáîB]I`Üöí;PQ>yò§ĽBKÉ"ôÒ¥7‘ç8"äI¸‚v€s?äáñÞþ!á±!‘Øâ@8Üxå-ÛY 1ÏV(W‘‰²b¥êý›¾tóôuõ½“ ^þ†ààaId!¢ù•o;q åéT($“"§FFÍJЉÖwˆeûÎ ™0n0ibì!Hµ¾cÈm̘ä˜4±ú`oÃGn„”Ys™7gÌ™?uÆl|FPÁ!y´0iͬ͜˥¸&JÌH|ŠG ó;I[Pöc«³A20„¸c-TN¹™ À‰ÆßàMw6´ËêZ¢Ç ˆH·xÅšE«ÓA8’íX®b®®]>wÝbnmƲe ç¦-"Èzcʆ¯ÌCæær‹/ä“\e„ç®ûF|L¶}µoíæw€ŸÛßY¿vÝúŒMéiSS7®ÍزqÛ;k×oJß´aðÈáà*d8ØDГ.}mÆÔ¤i#†Tœ·hM[ƒpý‡%5F@hDƦ­ÈpbŠCQ‰ ‡ý$¯Ë[@þ ë×mÆúHk€p,h%¤4¸‘£ÆÑ>¸`í£DÛ¹ ±\bÑD†£³ÈP¸Pq°Å;Bë°Ò‘‘G×O¢XV á†RñÝd}‹'«eŒ¸œð≖R|LxÉ +$;—ŸÌÁQÅñQú»ÆÃñòß»w²jÜ)oÞD6xÕ†R„ûö›Ýt ñp¨%‰?ÎkŸ+`ONìp,´ñ4ÁIo=tŠ4/o^<ȉ`C…å{øÌ¹€ñ#@oÉžÓØƒŽdÂjܲq‡–‡Ï¹g¼?Ö~lëö­{õïU±FEà­Xéâ˜ã˜m1÷Bû”;oænî°q;*\GB¯¨-Z 6nÄG̹<n½Û4oß²i«&Ì0_þI¿Þ=;Z´íÔÑ¢¹I³"¥ˆ(_¡f•¦*Uš²`Λ¿xÞ¢e‹—,T¼`µ+HXÞoUmnb¨Ø²ÛôÜ)yÅ—²PžlG8øÄ|røÆšŽ¬øðXú× á¢S÷-߸òhКÓ~«Î:Í?ê·ê²óüSc“÷ÛÏ<31åêØÄ«V^ßšÛmë`—Þ~ø¬ õ”¯ÜÖ¤y¾Xó‹ Wt¸Ã[öAeÂæ–pŸRÑ)¸¾£o…6 ¬ºµébùôÙ½…ó¦u0oѶm‹®VA¸²ø‘T©ÌêšcÜ=øùl´°Þ 4M‡<ÂÑ>´{ 4‚ë”ÂÀ{ÁüHZ (”ñ#Ç>yþôÜÅóÑñ"ruïÖµzåJÅ ¨X¶ ޏÅ"7K³q/úšN¡BG#¯£)¥£å`Ù2ð´•,U¦$­¯x!“öÊ{³y«¤»tñüõkWÈ*c´E÷N Ü[Å`uQ‹ A8Ô•âiÔ|o¿ýK¸Wª$^ý¾ÿÞO±ŽV[@03 .òø¹ýá‚C"±Ä„¡¨ …ÒÓÌ´UjÕÑ+TGQ¯qÅjuê46­Ó®§‰]x%·øl¹ý‚c¿=zkûcc¸S Ë8»ØÈ°ä„x-°ÃEÏLBÛ9´ßPÖDXƒ '±ë09â*‚ÃÓ%nL©à®(Ø ÆŒH‡Ž`8Ä8Ü)ᘠQ²Éu˜vż„³“;!º! ‚£‚ž–™c„6&ñ߉p‹Wp Üò© W¯™—¶rnÆÒŀݢµ+—e¬Ý¸lý‡“f§UuŽ*è;#¿c̘© þ‰;Ï×ðùš ›aR&v{íš´õé›3Ö¢«Üœ‘±}ÓÖ÷^ ÜP_дe* ç¯…õS³&Íñ1±îÑ«UËÖ8ÙÃkfŽ©ß!0C^Œ '§E{oÁÓxÃY…$.j´ðÆ 1‹Ež8`?ÍB²ç4id8€%M¤âß,ïw2À!#´rôÉup`!€¸±ˆ +B–ñn} Ṭ‡ô±j­¸¢‘Ë‚p¤‹ùÛ#ãì   â`ùSÛþýw~·Wd8A¸qc'!À Â!ÑO–‚~’9ZH|Ñ%€=8Š+Ò= ÅB‰þ¯q²cˆC9êJ%´iÉtØpè'ñ„uïžm»˜›v4¾pÆü• ZY¶®oÒ [ŸnML› G)_¥\㦘aûõë‹Ë9Qòq¨"ݺq/ñY—d\ÇBg>’»S±Ð®IÛ&Í[5:lÀ²ÅóÚ›™vjOjÐML,Q°x…Ò \ÛæÌ³„ÿ¥cëV–&;tQ¡èèZ·5é3f\žã‰‡Ëç=³„OÌžÇ@83“Ö#‡Mïúá,pV|lÎæ=1«>÷žó¾Ç¬ÆÇmwóõ ÍV®«l6÷öYßÑaeÿ€÷:M|ÛjòÇÞo;*­™Í´öJTìRºDã–õ[7¯£4þ ÌËÕKúO}Ã!²´wr)‡j½ë™ÔÐÆ¦m¯´­éÎ.vffÍ[š4A©ˆJwЊ•ª4iÚG0’tHªXš…dF´{LÂsƒ®¡Ñ8AOcÔ£»•ʤޯ¯"h¶hKNRr’õ{eÚê¨0••ƒíÛÁ~[²D1âáP ð]"=XÙÐÂú]DuÉÆ …®mn áI›Ö&:¶³èbÑÜÜÄvÄ«¾Ý;Xu01m659~ÁüÙV];¢kµìÙ©i;“e‹¢‡9U‚„ŽRN’S‹ ‰/埸ýB„cZ«›Äè‡'2\Pød¸Ðˆ¸Ð(Öéa‘ÑádD%µ/ÁŒÆ-ZUªÝ¨V“Öu[Z”kÓ­üpï²î |"Ëz‡~öÄxù‰ñäÁ ŒrÂ…&j–3=™Xà!GôêiÃlˆáM|ÄÇ4ŠÜÆÔÉtɼ)ÉWIõ2xÈVýdÿAt„O‘<051óŠÆ „ã‚8;0q3ƒ3qã¥Bá´±ãì À@Â~ °tUúMK¹tEÚ‚Õ©˜,H[±4mùêe‹ÓI°nëÌ­µ L,2!°”ÿœ’öÑß ëÛׇϬڸuõú+Ö¬†§$-»™B¸´Ô- ÜÆ-ï‚p›×3¼‡MïmÚ lÅ•Â%ôúÉžaÞV´”,âA8Ü)Û¶ï0ÆÎŽ5?aë·lÇüF„CLáÀ-t¹âZž¢þ´FðmÕÖ²K7âÌ;t‚×—(ºIŽ.€ˆ°ènE®å}À„I×ÐM`Ò6ÄŠ„õÎ),AD™L…^ã  Iœ ¢•²Êp‚p\JBV@8D7V-ü)Î&‚pÔyA¸'èBž*xx•ë§GšáO„âlrúôi&5yŒWÓw:td÷®ýÄ[¤mÈp€ŠJ´”âlB)Q¢”¦‚Ê yS'Ð%îy(¦X×£‘ÆUq*Á&„$‡Ä ~º$â%ÚªN=:švhÙ£O›A}zô% 7iJ;˜¶mY£nõ2åJ"U0½2—(^4WηpÌõ×ç¦ÜƒÊä=®\ÜLÄí¥xÉb–ÈlÝÚ‘¨IãzãG ëܾ­µUgëžV Õ-T²P¥Uê4ª§ì@íÚ/X8_¶œ³çÉÿVn¥¥„žòÍ7‰ÂÆÿ£I +™‡® k¨ÈpÄÒ 8f„ǖϾ·ûLÚGã—¿2w‹{r†kÒ†!þ â6Z5*42ÐgY7ûY]ÆÍî4riçÑ©Ýí2¬&¬le3Åjpdù*íkU5mX¥^áêG]zª|)«8ñMÊë3½¤÷ôcük8†´vj9r´ù Û†æÍ-­Ú‘»®y+¤+,›XÈË•¯ˆ–ŸDwÈO45- šCi+þ¤ w ç ¨K+q )œæÙr¼Ù´yÒy#Q!7ƒm}úÛÚ»½¥‹ŒZµ0QT¨Q£šdþc)#Â4WQs§ÎGê1²¿™'§b¦Ì™+Û¹÷eÓ¶-Úw·ìnÓ,Óýûõ2À€0°oG+˺-,S µ&Œá`"‡ô&ºJöù‹#Ü‚j¢¥Ô½Ná˜Y0tQGŒÓÎÇjfÅWBr()§DF&ÂqD‡ ØW6«Ñ´u“=jšv¬ÙsxU§˜ %&‡ ˜·öÐs• .)>Åyœ»Ã$.>!.§ˆØL£Ö5¦Z &M¼%™Ehé ÉOtœ×‘6ÚØuð»áÝp6AW Îp¨(Q ñ‚!X ¢;ä"ˆnLâ@ ³<ç°ÇÈ„/v‰‡á„Ö-¥RZþ-%ŠJ‚À6œ›·&mÞÚµ‹Ö®!¸mÝr7}í¯Õëjz‡‘¶¤K’EÄ2¸ë÷Û>üliZzê¦õx_BH²~=Z›Ö¥mK_»}]úöÍ›ßÅ~¶nˆ¡ãFZtîX§Q#ìp€œäÞBtáãÚ´2S9&»“q­§yKÖù„ä-Â!ÀqBð7á0­ÑD´p Øš·¢}À~ÚFÀ.Ý­Û¶ïØ¬eëŽ]»CüK\6K|yh ¢#Øãt8A…L“¢”¦‘ÅÇ•«‰S ùý¿)`žš“ÇÙýáP‰K`êqŽ7U GDŒ#·^"ÏýíNÇ3˜¿×­[÷³X{ðàa7VÀLG8@NËœzp¢¥„0 ‰ ødÞcØP‚±G÷%áhè'‰ŽbÊccæÕ£¦ðï'ŽŠ/¢¥ÄBÖÙÚ2aFìŒySn$dïÖ«k3“F5já¾W¼a£ºh‘3ÐΟ¯Ha–(Ù¸7E'Æõ‘ˆ»B-ÆqîÎqôcLµüIšCû5hV§§uç~6Ýã#B{wídѦ¥UWKdˆ¢eŠ–©\¦JMåaѹ“eÍ ‰,«Vºb%Ü‹,Vºñ}UÊ•+R¼@ã ÕÛÖvLÊÊÚU¾dYr02ÖÕ?r‚[ÐX× ö}FÕjݽpÖEj™¯Û¡HË|ÕÚ–lØ­XíNù*·-ÓÐ*Oó*ÍF•¨3$oU›üÕz¯Ý³F³Þ U«]±NÛ+ÂÚXæe®²chÏi9ã.lÜ…M:— =KH¨¢Š“+^”/U*WºJÕ å*—-\¶h+ ¡•µµVíj+—.Z³|I{³V;µïÙ«©øpEyCÓR ‰Ėáþú2¦,ÑIÊ#Ú Âq£Ÿ ©ÀðÐ(ªøÑ‘,2<"*,46*ŸXdbBµj5iÖµß0·ˆÄÉaI¦½†µïUÊmJa×øãC7»ýÍGÆÁC†¹Lžäá<)6:$.!&6).&>!>izTÜÔ¡£&ôµ’!R€aB_‚A™e1ŘyPÛ0ib–#‚˜áp¡Ná 'nLܤ'%–™ˆæA‡!ÿax8hxƆböZÈMP-F8áp¬ø ‡ƒ 8]åìÔŒ9k×-[±veúú¥ëV¬X7eÝF›YsJûñŠ,9:ÌÛ½Gû¶zõèaÕѤeSS_ý†uºtî͇TNy 9óåÌE,F¢¥ÌÛᛆ*ÍZ*·‚yN‰‡áòæÈmÓµ÷ø‘#áþsvšLH²)*ÖA'W/¿’å*uïmëìáƒâòf-M1˜šmÙ­·§‡>«5mÙÔ8l ëÔ¨\$o«eÉדóMVd¸"Ãý³Ož^"rC!×y†Ú=rös®1Ñ»ÙDÇNvœ' ?/mÛ«oÝdÏ©Z¹BMÓ–í¬{ö%O•ðsJÜ·(uEuŒ/¥FJl"¦\•ë¢VÞ0 |ØÐÁýúôf% ƒ!b62ªËÊ5«)_²FÃ:}úÚ˜9Åc3+õ%uDgâèn!¥äòeŠ)œ/WÉo•Ã`bѲ‹ug›~ÖCödÛÛÛÑaÌ Ý--¬:··îÙµXñBšh6ñ+ÌÈž7 QT‚vüɧ丿5þ+æ°ˆµƒ)L˜Ý9ÐŽéFŽ©£°§#þ‚p$w¦ÍÂü£"C­ºu2rh·¾6¦­ê˜Y6èÔ§¦eŸý'´t*à›XÜ+%aÍîç×n}ÂÂ]ƒ<]œ|<'k7%.)9)v*)"ã§ŸàØ[£É_a6Z àMÄ8êȬ\I2Ž‹?O´ZJ 7w«2º™ÄE¼@EIÈd6ç8‡ùOÑO"ÆAÜåêæ…'…HoYNaÞ¯ÑRj·z%Ö8Œp«ÖÏJÝ0oÍæUË·¬_²uÃÂËS·œ7¯l€w6?Ï\®þ.«¿-áÔ…¤yƒÐ?}ÛºåV¯Ü”ºvëú•ë2RÓ7#½­O{GŽ$8¶o3y2\§îÝMÍÚšÀ-‡rÁ²SŸ^6xQ²·êÒE*Ê>6¶¶ÁÚ5vÒ$_J,pJz[eó"¾Ú(CØ¢eXO ¨ÄZ†t‹XÖ¥G/+ë>}8Œ|-vŽnžÎÞÙÌš¿ˆ Øœ…KfÌ]@È?BmH ƒjÂ>Ã5ÁK$oV!:Nü!`ÿ"Tª0MáÀ68A8Þ·¬Ç+G·òúñ6ºyû;¹{óNòòlo„Ó9ºÈ-pñâE$ª#G˜<r;|øè‡Ì…MçFC¹ÁBOM4ÙM°#%›D|Ã*„LÆj]ô`è…ÀI´…¨(Q‚¡Bä ¦8 oè9‚j‘=Z,Öû6}­»ZYö±éÑ«w·Þ}ºx¨%Û[˜Õ¯W«\©âM6èiÕu m_ÂyJ)\¦DñR%”BLnÇu„…’à²âQɧ¢¨ä¾ØúÙöîÓ»{¿Þ=ÐOZwì0¢__B¿ûÛô²hoV¼dtU«W!ö‹w§v¥Ê¥ -]¬l©’åˆM.Ö³`nW¼lÉöƒ†j¶-;*¨„ïŒJ~S`F¾ûü"æ`›ÞŽãÇ`ÿ€“RGËvñ$9‰±íß—Ÿ?~üØ`r~ûmß¶©YÓµªWêÐÞ,<&bæ¢ù¬»UmXwÖò Óü}œ[Ô«Ú¾qírsƒ Ÿ*æåªn ù½fœRŠ ¨lÑ·Â`§žaõÆÙ™9¹¶< 5ǧ¦kç¡}m¡7«\‘XžzmZwèѽþ`4-@S€7´¼Þ H](*E¥,-V¨HáÅ -W²TåJä«mݦmoë>S`²°´4ÂÒfP§A#{Œ›ÔܺW¹æ W)G>ü#(u¹ õRJ”RJc4ÄeK—Ã>_¤R#³/V„eJéâ0Ò)U¦x©ò%­z[!Ì1oô²î6À¦×Èý­;wØ·7r)eË”ÐbriXà@5Þ:ggW©Úñ'8÷á‡ÿîØ L) v¦ êtOáÐS‰ ¦ÈÅÀ  b_tD0.²£'ŽíÔËÚvô¸Ã&tdo1½³ob‰ÑîÅ›?D¨=xø<Ùæ@ÆÔMKÒV¦n[¿áÝí¸œ€pø˜rØá@82ælضi¼ÃÄ(6 îÕ·ÿƒhtãC6døpšhÄh8!5òe— ö8tЧL¶9®¼(qWÙ´¨ë;` êYEÄ3`èàÆÑ2\jÈHxyF3rì¼KÆLrfÁ1ŽeDdœKtÂäÈøàYËü„$/Jž»rÆüå`çÀ¡Ã!G¤€p´3ââ2íŒèF k6O…,N` ýV½áÀ6VZp@FV^Hô伓ž¾~ rl\ÂßX†»{;´Ú${ÎG}?~\w9¯_Çîc|ôèûƒ’ˆ*KOOo?¿77´Òê&öÂ…ÁìÉÕpÏCa…† ¨ƒF?Ñ=þè†ò &J-Îä¾…bMÚ€ýllzóRàÍH3Þ¬#†µhAB& ½¬Ý«§uÛ~CÁæ„ÓßåF|å6l—B”TºKíâDÇiÜ‘­?_F³®”œêÝ4€‚ø½%ÊøÐ£Û5b$¶}Lî½úï5p„Í€Á6¶}mú@‹ÓÏzØÈNœ+°oìTÜ.°¶{È  ŸÜêÕ¿s¿¾]'DÂ#è8ÙŽ òÝ»ÏÕkTƇigËæõ¼¿ãÃÞÁc°v­jòçfAÙÅÆºµU{_7ë!¶¸_U­RÉ¢µ™)ÉéÚvF@Ük4–s Éí•78¡¸wt•q®Ý†Žï2p„™`y;—úcÚñïdKæõAãõ6mX£A£†•ª×6okik3€ŸN dÝh6Z .M'*ÎÇ¡C êßw MïAý{ ÖcF‚‘¶}‡ îÕo`/ÛþƒÇuäÐd„Oý‰áõB«Œ˜Tвí[µ*víÑ}˜m¿}é +›Öý‡õã ø¬ªtn}ì;x ûAýmy’¾ýú÷Äê¶¿-ÊéÞ|£5†=nAŠçP^º¨ôm=Z¶lÁÊG¼–<==I‹Á«èååÅ+ÇŸ~~~...ì©“êÕ ÷'n?îKyì†ß@X’ìÝ]ɧrº„¯ sŽÌÎ>|¸ §ÉEtXå:²½tw¾¥ob”’°e~Z;x±Ž1ë”Òƒ÷ÒÅv(+q[›¾èë@¸®ƒF¶aßpœOÍI!ÆùUãŒuêÝ¡G·¶#†5l(gâFˆY©\Ùj•*â÷CÕ9ŽçÓ°AáJ2iÚr}²ÊY˜[SªjÅú¦Í+Õ«U¥V­âÅJ[¶íbaÝqWEˆŽ–rŒS>ÏÀ·<üKyÔ5E÷ÖK8xÖ˜0¥þ@¿¶½†Œ%‚½Wûz•Š4lÜ L•ê8³<`ñ }AãÐÒ&B€Ð,O{Ò’Ê„9°ÿ°Þ ÕeàèN$†í;´«­¥M¿£'·° ªèTÔqzi# õ¶y£Vuröê=x€ ²°í`ë~Ãlp‚µÄígÛ«¿žƒûõHŦ7îî= Hgù¢?¡w'Bú—åÀE…e“D‹»ºº’$cóõõ%Ü% M;{^E޼ûÏ^¡uÿãõí§Ÿ0ŒY}@2æ<êL@`žL7pà{ \PhLD@tLè”è˜XòkGøzxxØy¸Ø¹{;yF{yÍà³ w‚Á1°GXúWxIÎ<0º†D»„»{I†0HаäÄ©qq *ÍéÔ± ÓBpyðÈ0fFæÄœDƒƒ"¨Ô›"†GRBC¢HNÖo2ƒoÓSæÌ›»˜}Dø…ËWädòƒ«ŒváS@ÄЈ)ði„GÅEDÇS g‰š’8sÎB ° ÈÍ_´<³Àlò¿ð¤I`[¶:m99Eפ¯H]¿fÝ; –mX‘¶uÁªÕóÖ.NÛ´lÃâÙø/NMÇfþ&ƒ÷ÌÍšˆl4þ}5‚\Lˆ«µê`U¡d…ÚUjW-WµAÍ5*Ö¨Y©fµòÕš7hÞ¨v#“F&劗+_¢|ÙÂ¥«¯T»l­r%+Ô¨Y¯l¥ªÐt™¶l[»r=³ÆæÝÛõ53íuj4Öµó«”PÂ-¨œ«_]ØdPè÷`êê^ß?ª…ïܦ#C,ûŽ&‡•M·¶5+ͤHÉ2E —À<ŽbD_ÖÒlüvqb£Ùó{÷±kÝ{LoÛ#­†·kßnòds·É-½]+8º”ôŠÊá5Ãà<+ŸÇüŠ^3KõŸ˜³V“&&fä<„eÝÕ•*˜ÐÊB0¨ÿ°!ýF é7b¸9pð€A¶dh†æ¥×¤ã4Áº?ýÈžîãaÄ9ŽÂŦ˜W~¼~¼„ÑÑÑÊ@Å@ŽŽ&» o#/'ÔŸþù/£?äÄŸB8ô]~„!‚ ”Z²GQ‰6‰ :L”Eì•ñ_£]Vl&ÁQaÑ‘Qê×Å„‡D††E“ 5hJR`Â;ÿ9휓ÊÍ \ý‘Žß]¸ƒÇà‹7ý"ãfÌ_1JP8M¢îxÅkGD[Šä/%3¸d:•§dô&y)…Š^Ÿš¬ò€Ki='ªžœO9“l/RfÎ`ÒW¹§%W'êG)’@€"‰OᣢHfp*’(ïAl{É0 çÈšUO2“é,Y½hIÆ’`6™º`άe³V­]°rÞ¬eË×x.\_Å-Ö`+tq‰ña;Ÿ‘ÿÕøñŽmiiiŽýRA°Û´mÇæíï(ßõ›È}ßë!¨ù´|Ü”t¢®]}%Eþ”B}]Æ&JÖ¯Û¢ÂÆS7.[™Ž¸ è.KÏX‘‘¹ ÞÞ¼}sÆFè¡—/[³|U˜Ää-_·aÙ† Ò?\üÞȸզÞÓJ9gŸì÷–甼ÞÓŠ8άæ0Ýnæ¶)‹×Ï^4{Þ¼¤ 2³¨“?–<¨ºF/ô=¨²¡&L¶eI|ªe„Q ˆ Ðht„ U^6Nã8jIÖ‹¼$¨F˜#™íu˜ømãäÏD8ž8ëÓ£«äOÜOnܸ±fÍ–ÏØñgΜ¹lÙ2ÎÆQQÂ~2}útt)))ì§NÅex:{Nã8‡ '‰41ðàEN ’'LQ9idNÔt#lÐÒOÖÿ”oñ'4Ÿ0"#  bß"¸˜éO²Ðétˆ’ŽOù"˜Íuä"\ð‘øHRs}CbÂLd8XQ$›H Z˜6lÖy˼yÓ-[`odÚ¶¼iǪ6ëÙG•\rDÐn£‘RάWU³î&½‡5³Tµm×üµšVjÝ©TÓ¶%›˜•ma!•Ûm`Z¼Qk*Ŷ*ZÛ¤t ÓU[P©ØºSþ†-sÖj\©MçbuMk˜t-YÛ¼Z›~9¡¥,;1(Û8_80‹Mp)×»¿™…e«¶æe»Y—2¡Êø°Zƒ½*40ƒk¬IXbKù@Ð7¾üDð(&=m£ä·ëÍBóò{ÙK…ãÍ-Ú7lÚ¶q«F­,«YZ—í3°äðaÅ&Ž*àb—ÓÇÇkð›kðZø¦÷’^óÊŽð/Ù®OÙª Z6%еe³æZ˜6jÞºqó–áÿÄܤYk“ffZ¡Ù[67iÒ´%·SÙÆ%Sþäô'”çáE"’!.*àʃ¤¤¤iÓ¦%&&ÊHEþdÿÙgŸñ>¿"Ôo®¿ü[?ñÉŠt”b~.Ja3Á"y½±‚`¥Ã|"ÙL¨È þAþhLÂý"ÉVæ€5Ë5(Ú1z¦•[L•1Å<ã OŠÞô!ð†R)fÆ‚I.\/,€ çüðàŒyÌ_lÁáÌqÊ;¯}’“‘±L èzÁõ\ " )…«±WäaZ…Âq˜’HE/úÉTH† åCˆ¦ÀiãŒIJN‰Šy•Uam\³0¤§HÚœ(úŸú¼'ââR¢#S“çGϘQKì´È„ĨèȘ°i‹ÆÌ[WÈ.¬Hð¼^ÉÎ[¿…ˆrÿñ“‘aÌÝrñ— —žHVb>…Å:GÁ{ãyêrj³&æùíRø“ƒˆ¶èo‘㨘1+vÚôØää„Ädº 62.>šÔÛ‰1 )S¦Ï K™ë•4Ý>~Ƹą#cVö\ÜÌeFy‡ø|.QÙ½c ‰9ÃæätK)é”Ü{ʇ¸™ÑAÓ’ÃÆiü¬EZ›pI)ô Ÿr„Žã ÁyIÞ1ኇ&öüÉ«¥’WhÇ%“_Pp``02ºðX\²ddæÿ= ÷'#¨NG©Ó.ó{˜€:t’7nüàƒ8§çÏŸ?zô(éæÍ›ì-Y²„¼7£«åȬY³|ZD$!$Äô%Ò˜j?ºéÂKx‘Éä_d¯¯îå Ja¨I{hÕXàSGzã4êt _¤‚Ê™’Þ A”ZÔ1Y›p!•^d–1T0›ß²ht°Ëø]Û¶mÛºu+ÌÔóçÏgÆ„ù…}r2‹ÜéI±É)³ÇDÎMˆž>5>2%ÅuæüÁ³WïW5rQ‘€ÙoŒ*09¢Nð´2NÁÅBÊûÅp,æ^Ò#ª”gt®ñÞR)ëËÁBŽÁ|ZÎ7®b@be¿„ “«8F—p.ãUÒ7&¯“_'ÿ¢ŽÅíjø$µ /à—ÓkªÁv¶”4CÐÔÚ¡ñV¾A.>~è/†„„wŒiäoâå”èêìªÝd¨(úcÞTÀ/œÁ àOV0HHÒM´${–vi[:S³íÀQÝOh=©Þ8·J$Õt÷+êïŸ78ô°XCÈTCÈbCØCȪ\>óK8Å4ïÓuà¸Ñ#ÇÑ_˜Öê;d8vzD:gðÀÃÁ0t÷lKAnÿ¡@Ï“ˆà.Áò0¢M•· Q†—·nÅŠ‹/ædmNŠôà7ß|#®ÂÖöS‡K=á½HrÖ6ý¨tîÖgñnÖ}`µ`•Φÿ >êÚ£Á¿¸’s²•mo+›žÝ{÷€‹ ¯u÷A½z±î×£sïvÝYŒóhîUÕ'®¢ÿôš®1žÇGºÝþÃÆŒ;±_8ª‡ `â±Þ§7–c œÄËLéf݋ԾâzGÁmA/ÂÀ§ý¸ø¤°Ç`ÍÞº§ úç¬ß•¯àr"…WH/ªß_#6ù`ñ3$‚‚=ΖüIËd-˜¤èõ#ÊRÐwH¿Xz‡wÜÇjxÏ~ƒÈˆÖ£‡íˆö£<+;D{vO¨â•ð…ÑxÙh$È´/† ÿaÁMqàÐìñ×§` Ž3!?ë;>ŠüL~¸^”×É‘Y8~éݧ^¶Ö}ôëç0뾤ߠÍ{6föû^»v·íÐk@û~C[VwÀ°šžå‚JOŒ)>>¡ÈÄigæõŸ™;b¶Á/Á4Íà‘DìGc·È–CÇ¶îØª‡UkŒÓ’ÂE)E´þÒ» Ï E¢Ú¡ay…h+^-Þ·î½l¨ðÊñ¾A¡Âž7sÞ´NV=HÒ‚m«˜üX€¯fù‹j)u#Üu¬˜Å÷„½œ&NÀÜÉ“'Á<æ‘Õ«WËž?ÓÓÓÁbÆcÔ¨QLCh™d2RY¼4-“T8ø£[VmaÖº(-áä‹T¸¸(¯äSô“Ê-BóOáO>bN$ºËÑÑ‘äÇ`ÔDµó'°Èក©FŽ 5:.‚9sæ09®]»–ß²}ûv¬’0ú,\¸D7ËBŒUXBĔĤÀ¤0?<°â§ØOO0wYI·ÐìnQÿ©ùb|rù'\ >‰ÙÃç¼âsDÌ5ø&e ›mðŒS{ï„7BfòÑ›¡³øŠ!`眢ˆ¨+4/›G§eœefð’'rVî éרlÞ)oøÍ1ÌUÅ{º!pz©É¾}üC'û`F áÔÅ'´ª½#‡{ßĉãœGMeç2Ö¦/óP/’7ŽÓ¡ƒ¢ÎáxÅê&N74éÈ‘#ÙËÂBÔ†}‡Ž²šàÚf’C‡°*NÅÝ¢òxEæô‹2Æ"R Á”…†¨U†¥¯i<ãšøD[·1bC‹(¸~ý{Üoà¦C[:_£}Ia*8ßè¼[D¥,8'/Œh,©Ë³QçÙ€^y‘¨ …°(ÒÖ¯_ÏžMiŸÖ¬IÕ6Ö%ûöíûp –E8´ ¸Ó0•(ÜêeчðYP€4ŽK…ƒ-Û˜wèl5pð0ÈvðÀ^ÃX·µi±Íà~6ÃûÃëo3ºï·æãÜŠ:yåœì´Oû ¨Ç‰øY¿í=›~ƒ=¬{÷è õÐþ pp¤bI¡¬8c©¿áéžuâþÙºd9fb¥7™d1ãªÎŸ €00æž„U kÓŸ˜IˆÌ«BùçØƒñY‹@`óÃÂjit¿ñû ·Ô£ûhkÛþݱÂ÷íV½¿Ke¿YeB”tˆ<7 «ÁþK×àáE#y, ˆ-=z÷¥S0”‚<€Z…ô¢Á3¡Z`›ŸÏïï|ý÷~ßhü¢Ãl é=p°Íࡨ%‹-ÞVû ²µÆkkHŸ£»g9r|Û±vÝJú…½å—Ãcú[nór¹-Îé¾Ðà9Ãà™hatO5x%õO©2)ÀÜÎyÀèÁöhð>úíôF¦³ÂpÖ¾ ay†AÃFêü:› Ø&ï?™Ÿ)oŸ’k“…¯Øã1Ì3¯"½0Ž~ÏPúÓd8:k®0 <ÓÑN>aŽŠ`ÚË'N Ò1ï#ß°g*á˜Y¨ h,‘~ôk±èHœµRþÔÆ9²é'ɤ|Wÿ:G¸&ׯD˜ãˆ˜Üd¥Ï§ÌŒ x†ô†† 'bœÁ/†ƒsÀD€£Ê.@Ù”“ŸÃà!Ãñ»âãã9Ú¤¨Ð˜Ø˜DìöAþqA^¡>¾1¡öSãǯ\]`âä7ý ÞQ†dƒWÔñ¹Âg¼0Ýà;ƒò†ÿ,ƒG²Áof¶À9êˆwŠ*>Ó .ñÀ•\a ó‡.zËez>·¼ñ×xž` Ÿ_RŽ™Ù|’sûN/4ÿ-o¾>÷Ͱ¥ÈO9|SªÙûLž:Ë) ßùaNnCB¦Ôq jê1Ü1ÊÅ9x$îΓGvïѹW÷®æf*•³ÊJ ×pgÅ ÞƒFÛ°Drü㈬ZtµÆƒ¦¼CT ǸB®É¹=¦f÷™ö†Š!p†ßå?SmÐ\ƒÿtƒw\.ïÈ*Áu{ôïÑwQVˆ6}z°íeÓ«[_¢Â{ô„Ù¡[O&wB•¡oîÖËŠBßJKS‘w€þ•À|Ab=rœ?A>ºÎb!ÂÛ¸eËX¼‡¼„¼–;vìøä“OP§³ û«i)A¸‘£Há×è0‚¢' O€a£F>bÔ¡Ãq]˜JeÀÀÁÁ áëo¾;{úÌÉs§\9yðêÉSOž?wò™ӗOœ»ºï•÷\5º®{·RòÔ·Â*9GÌúì<&¡£¼ÂP=uùâ•W®^>áòÙ³OŸ>úå칓”SçOž¾pêÌųgΞ?›¥œ;wAÊ… —~´?~òôé³gΜ;uêÌÉ“§ÙKåüù‹zÑ/’õ:/^–réÒŠ|—ëèwW×<ÍÏ='…zÖÂsþ°œ;sñÆ©›çO]Øyiÿþ‡ŽÛwæüµO/Ç®ø"›}L>÷äòcýS_¢Mç¿Ù³‹'=áÒ–sç/ž=wr'¼|•rñÒêüù]TxT’ŸÏ“ËAšHÿ]Ô¹òÉsO\¸tüüÅc§Ï;ušŸÀC^8yáØþãgŽ]¸råÞ©+w×±ËyÚl g÷ʎΆÀ CX¼!x®!xEöàô·‚Öæ XœÃo¶!`†Á/Åà•R"pn¸¨ì:zœî»x^uþ<òHÒŒò¨Y{?Oœ<}ôØ Œ&=xè¿èØñ“kRÓx YÜ«>løHVQêìYA"0‡³²d.EA‚÷{ÆÑŸ†pâ)â'?@é®Å&' 'Ú0üC¥Iã„rMÛÈHÀÁK—.áŠrù2¯¯Úä#¼Täñ@ã•+Wø“Š|úÃ+p¦l|ÊŸì©s 6¾Ë€–+È-¸>×äIx$*?wî{NãO‰?‘8ñŽa²C¹ŠŒ¾1ÑèW¶ùSÎ¥“(·ã:dâv¨gùˆÓÔ•Žœ:yììŧ/?zñȾÓGö>u軋§×Ÿ<ÞÀŵ¦OÞ…Ý˸Gås*å9¥œWRþ‰!å=“ŠLŽ,å[Ü9¦FÐìBöáeÜâ©WðJ.á2¥’Ï4>EËWdBhÅISÊOŒ®å7³¢wR>û¢Ñ%¼c ;…³ªäSÖ!¼‚cLiǘ"ö‘%=’KO níè·a÷¾çÎ;sæÄ¥+<ß-af¥Q.«Þ9xääÝoOžÜ}æÐûΜ<òÝ7;Ož8ËO AØh™—6æ~/ BÓñÂпÐzÊ8ÆwI*è‘’Ë{V6$Hloþ‘s ¡ ! þ3Aß ™–; ¡ød¿Œƒg_¼uñÖýË×oܼqíöµK×.ž½~éüõ«×®^»qéú-UnܸtãÊå—®^¿týºêw:Nßä  èePŠ ½@ŸRá8ýBðòFQ‘Îb/§ñVüãÁï×mþ” 7zÌ8& ÷qÀLÍ)C‡l@]¯Þ6ýúò4B…Môê3%ŽðÓó§Ïœ8{rß•ãû¯?}õÔ¥‹g.;{ùøÅ»Çï\<ñø‹sO¬¦-2øù|ýë»Eí¼id<_¹ÂÀ¹yêÄI&éã‡\¿x‘ È]+Ïž·Ïä}!iÒ“‡Æ§÷Ï8ð„™…ÈA∠@ðŠÇ6R¤òKöŒFÖ›*\ó8n“*üÉEÐAIáýâœO(+­óàáS¼ Â?þªŽ½OøÂw°Ç@ñÅþÞÃƧ÷àYyú? ó#?=«Osí=sÙoÍ;5&•Prrt¥ðEoùÌ0-4-2D­4xM7„Ì7¢}MÉé7=»GRyÏ„¨-Ÿñ<Üô¾°‘?b|öøé<ã/’¦dÿTýÉÓh1Jÿ¦-³U¤m~®¨†!ñÙMããëÆ‡Ô«÷X5ÍF6©ûƯËLöÎbðñ²_õö¥çªmÿ纜¬Ê3ãs­¨ÏUáħÆÇOU寵ýl›d=Aý4Þ§ûnïÒ>´ïžÏ–½Å&'æ$†yf¿~å±zÙ?¹C3>~®^Â_U~Uëpe¦ˆÌ&Öêjã!_eFÄ Çôoî> Ù°¥‹{e¿À·\ öaù£×ü–<•N\opš¢,˜-‚fܧ–v›Ú>`6ßB:ÿµýõ«~쯽ø/iœ,ÂIÒpÝÚÏBà—¬©³WÐõ¨Èš‚7rÁŸÏà4®_ÒÄþ’ïJ·Éô.”;ò,a¶ÎœG@ @îÉ}µ¦Þ>õŠë¯9cO&ð_õ–iS’¨ B5T)O›³2OcÀPxPNxþø 7gßúžÃ‚œ}dðxÚ§JIsÿÕ' %½&¿šúÕ@ëožì;e:µÄÿ>Ó cÂóNÉ0xÍ7„,38'ŸGb£ðÙ__{ªýÂ'ÏŸ¨QK»üò‹Ë™¿j“¡/pÆ>óë2Z¢zf¼óT-…UŽ:Íãzú'ß ›±²1ºÑ‘†IÉÙü5>„ëòÞ=T÷¢Ÿp~0·RûLýùεk&®þm&„~A%ø$bÆ;üþä¨ÍºþÐ[˜z׈\øŒ¥ñI£qÇÍ'>ïî©è5;ç¤ÃøäÒQ ø-Êç3ï-ïù9ƒW¼Wåñ_UË1üó›‘2UpG¦ez„yF[>ë§Í­ÿF„û%oÝ÷ç¼è²»ÆÇ·”Œ‚`¬!Üã£ÇJUÐÂ+>ï$Ï!Á âh!_Ú¬ªÖ™+ ¬—9gÓ”LœûuÏóÎþUS쯾þ3ãCÆÝ“{Ï¡®6–º’o”wQÏ„Â!î[¿8§-Uƒ<ÓšîWÈÏœËD8éÁ½gÆO—Ÿ/jO˰â¡.ž~ºéГñéû ¹Í,µÜà“3,Ùàš=n†!r¦Á1âÉSš…/I|çè‰;/fž_ÝPÚþ±G‹¾ä®ý³.§bœ~ˆaÕU“ùS=¦W ‡¯_ñH:Fò+¸T¦p©ÍÑ"Q©M½Ë,!k`£ÉIk°Þ2§3 Ô;­MH Ü/ÛËâZSâeÎA/–Û¢R2±»Ÿ1p@8†úáO?}þϱnaqÆ…¬;ŒjˈvæžñÖã­ç á²./„ÈF“ QdÝyd¼vÇxÏ9£ñÛgÆW•œç6™²¥œ×¢*>ós‹Ì嘘7‘¹Ì`?£äX¿èmŸ0ù²RŒäC—nÎmç[.(±¦kèÆ³·U¶õ ^ž?cìþ¿üÞÿÕÚd éY€0B¥7ÕèÀlq“¡‹šå–êÍ­w…]’ ÍyÃ-"_dvÏ€l>!0ä¹®±Eí"zǬà+ß«•þðž{=7ø'#œŽX¯–½tz0ÎÓà̰ 7&›ÒϺ®ê^3ò-2õ@€ÜzEêF8]#Š ˆ CæWôq«-Ο=0>¾g|x×xÿ¶ñ>“Ñ=ããšN_Í ¸üì^GPuæ‹»(ðÊ¢ß×u ò9xˆˆ§]ýþ³ç÷™é¯®;!<éÓ‹J†{Îø¹ñÀx¦L—¯XèmBß©yzÿ‰ñêƒgد>1Þ½ðä1FÁøOΖUeâÔ\=]F-y¯uÈÌÊÎQEݳû.)´´–w|À­oÝ}¤Á4÷HC85ÇP2ñ—¢ŒCÿm?Ñ‚p,y”¢@!b=²lÀ ;hFjAÇÀâ~áµ½ƒ6\¼Î,yç.’ŠZi:aÕ°ª·5å¹ì3¥8u·šî?ºíÿX„ãÝG?Ák¦téžWóOÈçRÊ;hÈŒ,³xùùÍXøÑ ¼}ôŠJĵÆíæ/Ú™•î:gÐt«¢äàCì„·Åš×¶}ù]c ¦Ê®Oê‹©óëFr ¨1³rجҎµ'uOûÖßjû'#¡ûá8½„=Y{J>på‡i겑Ó^q4&g=B¤&³^ígíyBW&›†¬¼žh<(™æ ÞÔÂê®ñÙmãì%h“nß5bö25ò‚s?[˜™t«›‚7Qnhê{µZÍâ©ñ½¢_!È3L]Ö±4¼´Ìüì»JcCÆ/ù„:gÞ6Þ¹g¼¡ù¼jû’È«d8Iè)¯=‚eí>ºG(7kŒªç>³çÌ®S–4ß¿õ0êOúL[\ÕsjQ»¨Òã¼* ›øÙ§¬0Œ1=ƒph7áÔ°§yhÊ÷Š ‹~M€zçrj‘ÂÏ_Ü6Vw -WÈ3È&i.K å…òU¶ˆþJ¸×WT/¡L–þñË‹?áø¥Œ7”Vã®ñÁ3£ÝÚÏ ¸G¼áæYÚÓcé7»”p§ÁÉý'JˆSðÆ:áã¤Å_hJ´ª,84-N¦ ãÉã»÷ïܺýࡦp¾§”ËûŒÆRÁ¥"çäõ‰¯2õýçÊ(°õôí±ó×Õr Í9pR‘±îõÝCW:ýÛ)ÿ$\ü'#œh…dúYŽ PGUB¶ñ×AEÇH/¢ àm‚®â•éòÂS.¥{©» ›å·ß~+JÈW<×!ŽÛ''s‘kW/+ÁL• §ˆ&ŒVhš ¤ ¬ïWs™!]5ôSƃ6´MÓäe^šiN†8³d]Œ3€=V#˜óUV绨=Þ»r·ìø`‹Ðe§n+Ï—›ÆÛwA8¾ùÓ÷ãJ]4œç¯©o=}vûÉc”$[î‹Ù‡dXÔ%ÌaÇG»Ïi ÷öþ áéŸ4v ­6Á58cûiÔ“ü Õ:4Yí‡ëåOÌáö'ù_q[A8mùÂòDG8Ô]᛾*aï_84>¿‹ßœ/ÓþÚkƒ¾.SË-k Ùë%‹ ÷?ݯx¤_{ê‰p´É}ã µp»gDcÃ[¾$uO¹q¥ƒã‹ù{»¾¿•uÞý»÷xïhÄ$»’9œþ`„Óµ¿ß«…e­ªYë)¸Æ€¾êÉž=|ô- ©B*ÆFçOH0GäwôÛõXÅঠös-Xè;3;¿ýŸ–òÿ—ÙMÉ4À Ñê!q/ ²”È^úqAÑFê†7XE@,É`'b$w6×I#\QR•=¬Ê„rëÎ#‚v!{QŸêêJùShä»0“ý/âJ\v*uñê9•¢ßxýæÌ†yn|pïJ}ÑßúŸ¯|oüÿÑÅïË-¯AB ™ÝXÂ3ŠÔ¨hâUË%nÝÁ{ ¡«ÆÇÊÑœq…ÎPÃÈ_¸q®R´"20äžß{l¬œÇ-¾œ{ÊÈØ4”–7O.Ï=0^}ÌpTaGÊN Ñ ™~}™¿"Sž} ›5¿ö_ø,ÿÒÓ2E\ÕJ¨Œ±ï*1dÇþ[5 jvŒ):ñý-W™8ïªö…ߛܲ¾Dÿ-¨/a©È(“¥¼œÔÿŒÊ‡Yzœ7•1®ÕoÝP#Q½¾/Ȳõy@·G¼d˜á¯ÝmÕ Ü©ûDߪC'Ôuqkêåþñ)¯ýmoXö=P~(L.7ß¾ûüþ}•5󩨰öýY¸_ÓnfÚº- ÔiúìÁc¼¾€Z<´¨çjaÍÞ½dT¼ÁÝ©Hxˆõìjásdå&¦~ŠjUZ"µpù{mÿXN#Aä½ f QŽñg¦óÞ ¶0ŽèW`¨ˆ-œ)o¼ñ˜|Ä×ÙC8ÉõÅûŸHñR!+äôR‡Ÿ—8 zø¹¼%YŸGŽR2>áÈØ¼y39€ÐUÊGr;‰‰ÖA÷‡q~à¨î—ø³N1¿ûe¥YÄuSIx¨?Ä1o¿°¶{ìüo.á’@ÓàŒ¢Žöÿ52“Zÿj¢€B­§ÆÈ¯öñ‰Ì99º‚]ìҭǘµð¯¹m¼rÏxMiAEàû±~w§f½€¦Ïzªˆ áðfR½é4kSùIIEa»ððZpåøµÚ§ÿäð¬nÌuð”ÈAž?«³®|Ê8‚7‡±™Š£E1|ôO%^HìalrÁ¬ƒŽ&1aÁíGÆýWùÌ]fÜxìhçs¨,òh»7îh Íg/_x  T„n7«>釶ÿßÚ‡Ø#Ä’®!œ®±ÔdëÏñÛRE F†ÊÖÆcOŒVc˜ìeð÷)è½øøqbŠ1A;åE†š ôGÊ ¿õg¿â{ÿp„ã5"… Y¿Y(ÁnÌÛ •' P8øÕW_Ñ.pZr –H^_’¹ÀøÉϵ.ÇÉ¥{$_9tèÌÎAÓˆ$‡ˆF*;!’3 b'¢ ¥Yuƒgh`¡$&üOÐFs¯¼yóV©R…u ÉlÙ²ÁÂ,'ÊwÉMPS/^œ?IDÀÃðœÎü o#«Q‡ÐRÿxl“÷á´ã „{Æ<èœöA]¸ÈÍè)ž.¿ᘜP‹)ùð¶t–Ésóy„æ± mé3ûØ5僟P„Æ[·_ËÒÿ!Ükž&`-@S ;Ê޹ɤˆ²“KºÄ™F'~§ÜV êÐV9ê ƒì"Œ2°3ÞÇŽKÂdZB1iÛKÒG#b€]O>Õ ¢_ÉzDÿH´c ú†!{LèTÖlঋ.\œ²iÃŽ3'Œ8rBJÚä¡"Ô$à'—î^½{?SÏÇŒÄM_÷8ý_„©Zljá_}5äUÌç<ÊÛçMý}sûû·LJ8Êó¾ˆ9âáź¯ )A¸¿_tÍ?áäå"a/1/:ØÆÛ/€Äfooh1ÈYÃë …?çƒ|d£B&[ÎáS}èðvN¿Ò›Œ62ÒñÆëëDXƒ0F.”<ƒ!\‹"Ïq_øšáðåF¨"¼wß}—ã'û·Þz ®·„cüã ‚”ì¡´'Ç&Îá"¤‡È8«j…ñóêh„×4 Âin/ʈ7‡òÝ`äÄ}~¸¶sôäy[Xôj¡i¸u°Ìÿµv/b˜[Õˆüàô2.Eý§àiâ‘ö…Ò@•õX< ïß{xK Ä–Â×ôëþõ—QJFe³D2À—òÎÓ'h?¦{¢â¤ð2Î ¥ìBâ>ÛƒÓ¹ëD<ó`qú“V¬í ¿Fç!„±,Ú•2@&Æ£ž~±Ï™$‚Ð{š^2ðѵ0Nå49 f{#gBXò«Oo?T†ƒo;ûKZ\Šj ‘kŸÈ5Ù§h`lu—°M'™/”|§\÷˜Mž<|òTy©=DÿÛ^c ¨9šð7˜©î<0Þ¿õô91^–—†ÈÛ>¢û”#´Éƒ¨‚Yÿoÿ+.ÅjrÕªU “÷ߟ¯a2§N‚IH´‚:JÉ`aÉäÀŸXD-Éq±é’u‰ºÌ-|šÍðæ¼ÄÙJ“®¡ÊñÛ·.(O¥´¥n^F¸E0Ô”} eŸ}½ët?8¬ èo€ 'œ /N~ð·R²#4 p3(« pÇþÄcc‹À†‘Á¥üjø„}pGQ4hÚ~eìÇ®áM£OÒ9Eÿf*Jý.Ãñ’ ™·ŠŸJŠQQ6R?~<²¼g‰djà…#ë4 Ç·Ú´iCšy•‘öD d…Èú‹3Éò€’¬B4̪åçÈz Fòu0½"_'“u |ÂW…‹€mäúáÙá8‡„,2rÿ@8|L8ˆür ’Z$Ø”ƒœIb<êD8ðéwß}'ó„®ë¶Ã_1Iü–SÅö¥ '5µ1j”HÇ`Ê8÷ Ú¸€î±Ì‰Ê&ñ³5Ь_¹ÆW3¬r€ÜùÔh‘’Ã5-¥Uìì#š4¨û5¨3ÔÝ?|ÄÜò÷„¿¥áÿ¾C«Òeï?~r 7æîî ؇ …]À¸둤Ñ|]~ô\nàú¶?i#o0ÃÛ>f‰¤ª  K@}!ËàÛ9Iš’““ÑŽ0IøÇÀ”o×®¶ *7f$ X’å‘#\ð‹/¾ ›’¬t³Þˆpd¥µtÁ²æ¦mZv¶|ç7W?˜»|äúù³çpt›0pX‰<fÄ'²D®yQ#!Æq5Ñ|¾VS|âßÓƒiÒ› œÒ”>òLi›ýĽWï:]db8Y~ ÚŽ]¹Tᙢñí‹vÍ»íÿƒƒæu¿<ÿX„“%šd2^)¤1Åxã9Žà˜QA<"¾¤©€¹¾0ÂÉq fœ,jC4“ D+ rü‰âèÂëD†n“‚â¨)›ä€È“'hK] ¦hBHóÆd8 õcDDDPH¢«D )·ãˆ`˜,0:I'ºà™d cxð£ä+d§Ó_Œ¬XûR–ƒ×ýòp=ÍížW?“·B”õŠeöÃ{Æã›Œó;®©°Rª÷ë|)n¡U1“vž(ì–Ó':£oÜ_ßP]«é.e óŠh™Z¨þ?óßzIA85%ÞB`fôyggv§Ø\>ÓªzD¬Ù^ÅA¯9Œ{4/Z¥ÐûS6† ã”áÀXf¼ð'cTØÈe$bÉÆ8Ç<À èTôΜ &v‘á­5kÖ¤baaÁXÓM¨X0ÕË¥dËŸ;Ï‚øiçöΓ=gž|y ÜüÊÃ78 ­Pª îÔÀ[.Ã|BØO‡Ž–|‹gÖ¯7ÑïÌó¿M­“íië<ÑÛ‹£Nu•F„áÉï_Ý‘`ZÅB¤X[$büˆ½U î¿æÿûê@½%qTwPX}rÏØ hzn¿¹½“Ì#SŽŠk‰f³aÍóÑù'Ækšñçl]ãááÁ3¨°(dµJ]ìÖh‘ÀHl‹Õœƒ2NY³úûû3ïXªò)*>mذ!Ÿb>gÒ`ô‘©øã?æ©nùô믿·BÃÉÈ ®¥¥¥òŠ¿óù‡†ÜÙçD‚…|Ú¿·Íƒë·6f¨¥ê»~ðÙW_ŠNÂôà¥Ws$ýšÖTË=SFgò¿LS®ï?`x°âDíÿõÕ'u'øær)à7µ[üJ¦E€ìé D½ûŸ^ xˆ`½S$5‚p2ÆÕðý5OþGûE¸W4˜DèŽÂ?©‹>Yß6©ófó‚âµ(Y¯6né/îKÅAõc×Gé¾úpN§£|ÅùY-çð•Õä YÛA>«÷»_+A8¢”!L[ïãÁ¯rsÔîUŒ÷7wìd"ñ5?=Dô†å ùEêGqúcãÛÆ’®!¹‚âsy„^÷Nf¼=±oO+ó¬º=ëÓÿîwwéÿ\àÙXN•Ÿäô¿3+è™?hNnLj©ß:Œ\G³ƒpHÎJHÇ©õŠæ‰þçlx]!¡,!s¦è9X#JX*rÔ’ ™:fŒˆ¬A÷ï߀OwïÞÍqÖ¾lü1ÒSù”%rV†>ú½JrLÔ;›ÖfkÓWßzxë³]_râg&ž¾p&Ç[ÙY³2è:hÈžmEFú×»w¿‘íM–¼Ò@ºÊçõµ—(42.äááž² NV)ŒmXǃÓ>¨2ηp@²a¨Ó²cw¯ˆÁá–Ò7ãÂÂáx©õæ÷—i x}ûÿp¥#©År/E¥àî/Þö¼Ðy¢ñ`CnC_ñiüä²b‡Ã"(]þŠ{âýÌiˆneË–%ª? ùÂ÷˜Ø^§ê_‹oËLw  G%7@W…‹]Kû°†ã|?¼ ³‘¸ä½XTþØ{-^ÝY?QG´ùsú{ûò:æ Œ)î–¸óè mnи]4õ¶tî«E†ÿ'ýÆyCfLE/€‹ààÕÛòzÅ&GVöŽûèÆCåÈçL‰ù…†p×4îÑ?acÈ`Ï!ì 8ÇÚÑÔÔ«ËSy&Þ|Ä5Ô6`¡Ø¨ Ïñ]±ÈxG[ÃɘðÅÁ·ø z9œ/Ú¶üùó&%ÆîüîËÿ,œDJ”(QµjUÖ‘ vNdœ‰Bb^ÿZ¥Îº—i)hGð:}¦È œwÞy..>_±ñÑXªv|ðv ³@Úœ¥ Š•/åìwöÚeP-46šVÚþÑûoæÍ•ºiã§_3×[ÓfÅ6^x±/¼¦-á¾W* ÂiD”ø™p§c˜K¾9^h€SU¯¸¢Ž~¾}§|Ie9I,•œä&ð¦8ewøÞ÷Ÿ–ò5õÑQ‚eUâr:g œÄ¬HUy¢×§.ÿþêºÄ¬où«¡¨øõ'‘Ÿ5žæ‡ÂœÜLB\_ÿOÐŽ…¡Òç">A³qE?j»™M—î9¦0 1à•”]ºzV§Ccl°éøãÊv1½£s9zymø€ÉF3êi.(/ð,Ó (_;CÁÿ¶ÿŽ;(„»úð!xóÑœ ûÅ—²óZ~ø‹¥ú’}ÿ˜ˆ9È=XßüÉ2´>"™Du¡[åå >ður>Æ»,.yýtø‘“Ù„NH¿ˆ>-ðÓÏ]ÆúøìÁ³GwIýìÞãûw)[×5þ¯5Ì,˜¾A&·*ôz™+0îÂM4åoï/ÕßR¦í@ÆÅÓgOp‰ÕÂõ¾}j´™¾ªàX¿J¾‰u½Ã·ßPy•U¿Ýgɨøµ(…¿Šã?L5{¨~þÏ—ò·÷Ìÿë7ySuÙˆš·\G^ý—ÒsëOÆGœ¦‹€?%cýÔñWØÕ\¹˜Ê{/óS2"É ¢€´DíˆÔÈÝ…Hè„™S¿¾`ák9Ͳ†¦Ji9² œò»[þ7ç«}ß#ÜÏõ³Þ™IÀäòÏ ÛÅ ˆ/åì½ã,Ê5Ú`D×<»”Ð&nÍÂü·T£ü\›ü©Ÿ+ãÌÕçω°1]YØ=¡€Cp‡àØØkžâ{þ²WÍþª‚:F’îÏz`ÆBV¾¬Y—âí,‹BF‡è êd(ÉG: fu"ãÎÔU gÎUV¯.²&¾zõº¸Ò8WoßÔOÛä‹YAT¹¯§Ñįä…ߣÜ:Óá„{ô”ÉÀ\rðb-÷èb^‰ùíƒÆ-N…Š)3öF@#1ÈpÚ÷D'¢Áœ&¯Ëõþ´þýmMô¯³Ãe%ûy•_òÙå½.Òßp‚>Zäd¡¹ûÑí·uß’[È#½ú"úpý%'Ë¥²¢ší~ós¾üEÍÉ !7áß…øS6Ã&hõG&ùÏúj¯†p¸¡¼ÊÍD.«#œÌ2ï<¯ë>;×äiÅ|c,“f¨µ¦CPäcP ÃIÀñe R‹TýÛ À×ÖÌ…T›2ë/½jÌ3iJÙ€yEÇúz¯LãùuYÔ+ßYì§Tˆ ".\›^ÿ”íGÕbqÐ㸕V@›8˜u¼eéV/š¦Õç²209_'"Ñç ~+D´·<¸u[[•jއÒ$MTÂí³§7îÜV€‡÷{F€p@kÔŸáµäá´;hDy0Ëæ¢DÆQkÌ‚ô2Îáo¹ÇçsZ}蔞d·{¬béˆû¸l|6 —ZÀºÆÝõ½ÖäOéâßvÓÂI3‰èÆ^ä꺈ð£ŽrPV|¼ô?…p¿Ö>§L=Eª<ÞOÉ||Ä“oqŽ@—<³ˆn¢€ÕEI}ÜŠÅñub›4¥– î‡‡Z'pÅu'øÌûî f9ÓÒŽþÜKª«(åÄ…ï~QbR²Áizqߘ¨¯v©}¨æã¥M²wžoÜR`ó/ýÍ–˜?×"òçô™ ƒ³Yû‰Á!¡„çÌF ;ަåµÔšš‚úɃû* D¹šü¹+ ,p"œñeM"ï¼¼ZbA—FE-ÉpFç¡‹´|”ÅëKÃDF™ð?pLþTúrQïA¢©“Íž|ß×I?LV§LrË›×oH\ÙÓ;÷Ÿ*M¡Úd -õ×6*ExÌ‚pÚ*P{2ù Fã{g¯5óˆ(ícpŽ6»Ž`MϬ1?pÓøð*!"° A¥²°jÆoÕ»Øßjû×!œ ‚n¸Ú¹s' D¡AAB¸7nÄDÃèÆŸ;vÄÇD*„TãNÉž3åè²~tã+?º…ó£\*ÂFæU.N€*þ#ì9þ£7íׯ/uéÒ…ÓúöíËcKpb?‡–.ȆkòáÃê5fÓGÔëTTj2œ–YƒÑEL·Zõñ'2œïòmÕ'ºÍÞwDE 0:t¯ è´Á˜9Q*ï/¡;Ñv·©Œ$7ŒÆÑ ³ËyÏÌæ”TÙ'æc¼XøŒËkž{"Ã!ÀpZq-GÝ÷ó³Ï‹Eþÿv‡Ö#™™r39á™qï}c!ß8CÐô|“#û$,V³»–hFæ÷»Ï°Ü0mk]„ø³«˜ŸÂßr†>¢u¥¢ˆ\rœ7?«'ë?õV>~,¥8aÂ1¤#|Ê¢S¿ìW½j&yü”VP²«à ”¢Ù“6fý…üÇÑÒê=&Ï€fÎÒ‰.¹Åk Ýyá6©<3Í£â $ŠJ‘6jËg&wËåé¿ó¸rñŸT±¨_P‡<¹©ˆÇ4 ƒPs’.«åû·ôПôÂÑÙ)CÍ;ý±‹‹’@,',åFŒ5f̸±cÇ>rÈèJFðoØ0j/—¡Cg-ú ‚.ª ÒØ‚F[[ ©·^úôéÕ»·u¯^=­­{HéÙŒéºtî žv°´„5³…a9fmÚ´255iÑ×å&M›6nÒ¤Q“¦ 5jа!^·^½:uêÔ¢TªT}µjÕJ—.]¾|y¸˜ÉûŠ4\´îÈÛ%Ñ/9åÿþO-3Ç‚6²µè4f·åé¥ì&$>„ÒRŸ¸ks¦à"tŽÃÌ%š² eí#Ìô,}YNp÷am'r^‘|ã†.^·KÔ?<Ò51Ž!‡W Þ /«‹HN¬?i†ýýÍøÿr¥‰Êœƒi+=ÐBãž'Ý3©<?Ó‚.4Ÿø?ß=X0"Þàï_ÀÃ3áÓo¿¼v(+µºW@¨ºþoÄê$ŠAˆ oâ»Eƒ’uå÷’I˜O³ÒTŠâG~ºÊâô@£2ЊJ÷;ÝX_‹-Z9Œˆ–9P4!ööÓ',uk;„•tžZÄ9®’£ßçÏ”ö%³û”˘•ßåN‹dø½ô{ú?âÂÿ6„SjŒ*’GY¨{x¸Ô‰ Dvo„§Aƒ† ü 0)hð Ø•Gòoøð¡¯.YñoÈA”Áƒ¡4@ ŽÒ·/–*à\V„ëÖ­+lëÚµs—.$ÏASðÖ¶m3³ÖÀ[«V< Tb™W¿AmJ½úµêÔ­Q»vÍZµjÔ¬Y½Fj•+W¬Zµ2ÀƆc4™Íñ†¦·æmÛ¶‰ƒŒh`^ûk$€ð4T3jé«©ïA8÷ÕiÜãŽÀ93»¶(²4ê.–µZ:MVÚœ«ä?5eûÖä¹ÇO ¢œ·ûtÉqaåüµq\³1¥©ÿÉÛ¿áxQ?Qéš°Ä!Ãp„¼ ½!d¡Ó=­ñˆq”Ñ£Æ5ußnœ .²ñ)ƒ„ Ý ¾¡*dC«‰ÚP”¢ºDXdy m'šFÀL [;pí°µnm ¶!½™˜4Ï*À5hPOD·ºuk Âo¶råʑćp*%K–,Z´(b bèþ¬Ëo{ÓE[¥!œª¨ð‘Ò‡8¯\SÝÇ}êñÚ«µöÙ= Æ4á´œYNË€PÆrú»ÇƦN®Uœ*;yvœ’²_órÊ2mj©þ`º}p¼ý‡p?Ó…?“?ì¾b纃§8½ä£'?¯À2ZJ l#FŒ W87~üDPmèÐás}mtïŽUl8²Ý7¾¢‰wÃQbò)_ÏŠy{x‚v 1•ÁhŽANp!@Ñ [š&½YjšIspŽÁƒŠ’MãããZ4oÞQ]%›h)ÑLЇ܆rxÛgáØ3‘á^r€~½ï«Žp™qßš  Ÿ>«ª«Ó¼3§HÚ2ÿÂeÊpÊU-¥¦òW¤ÌÏqHÓpŠÅæ'—o6?±žýäF®Þ~[Þc¹ˆUC T¾¬&4€pš_iÍ´°Öÿ´”¯êÝŸÉöàQ\Äu©üaÊ ŠCì†ÝÅÇ…•œVÈÃkáùóÇ™0M—š5%D˜¢š\ýû;i)EÇH7„ÄU \ç:‘P–lÞ¼™±­$&Â^‹>t,([øúÌ™3%Þ k@êK¶¯w¬ý‚«½ z¡c”5 ãqãÙë5&“º6¶¢S¼í¬ŒcÚA¥ùÿGoÿR„çEò i#û£Ä‘½{ÛhRZ5këÞ¤Yƒj]ºX!¬uí*B›• š¥e§:¶oèÖÁÜÜÂÌ̼U«6`[‹-MÈ%Õ¢%×´ióÆ›6lظ~ý†€œìëÔnP«VpÑ­reeuC!‰S‰h)A8„ÚY˜ú^òÂo´6·iž&/´z®˜—Op¨>Ñîã§Ïÿ…À¸6h2œcÈlZÚɇÏoÜ?4zE%ºÍ/îÜŽ^·¡xQ;¨™Ä5Ýd¦'§iÆp‹øá~¾_&ØÓgxš(_%§A&·÷\¾ Á%ƒçäî¸ås:Bñ:‘çOl­š ¥¦“Ö´ÓÒAŸMüJ ëbYI=<<\b0³I2´” ,`ÁþtI:FIƒEZ²ÃlI:ŽG÷·ü”¯n^ è24󛯹ÅÊð.KÌžkûN-ê”TÁ5¹SÐô#š€þÂÓòïÓg¿þIÿ¥÷@ñÔ¨wÁÞÞN¼í•?ÉС#GŽÆV7mZ·ëÒ¹»eÇ®–@Ñö;YuìÔEßëçÈÎïzYviß¡£EûNí-ÍÛY¶³èÐ΂?©t¤ÎJ[óRÌÚ¶ocfѺM;ÓVm[ššñ§‘ƒ”V­Í)/ލƒüi "ššµ4mÍ‹/™'oþâ%J±Ï'_á"ÅråVI°¨Yƒù~ýKòÊo¼@8æ¾L/,\ËÈÍqûIÝQ[yú`BSìô2˜^Œ@þ¯{VªŽ@5‰ GfaijOî=V‰’Y`Ÿ|þ”¨†âÕOnc Óì=ŒÛG•­xCÉù?'1 ÿm?Ù?“?ìñ#»2ó‡~h3kÕ[nQÅ#ÔqˆüìòsÆŒÖqï>¾ª‰ §Re*»þ>¾¬zÜ7Öq”%4Ø»ï¾Ë`$ª~ìp0¾¢¥¤Bª9N€<5&±7äÐA¼áP°|Ô¹du`ûÑ€Úÿ·RÆÃH³½iÜ­yßaiâ÷Éþ‚“ãËø-(6><öí¯ÐOÞTñÀ?C.ñÿñÌð=þu§)'Ÿè7qâxA8ìjš¿žÃlll¿ì§§Ìž¿`ɫ˂…K³–%KWR/YAY´xùÂEËäSþäøÒe«–-_-…ºü¹|Åš+×®X™ºrU{©¯Z¾z %cMjFêÚõkÓ(ÒÒ7®I]GIMÝ(¦¥oHÏØH ¯ß ÀV´X‰·rå!çbþ…9!U_f¾æ×IK[Ï‹¶JIhZÌoÕmgƒß?3ããÚ©*þ-SK)â\¦ G¸Ï9MÝø (d¸ÇŠÁ™ï^¾‹eHÛ°wL"F*ï¿ÿ>'ð)£ šf²sÙŽ¬(-ù¢0©6ÈâŠùšÇÚ/¹\„SRµ†pw1c›Ä.ÊáX1tYÉ1AûŸf‰ñøûô×/i€žó/E8e×LqNN“ñ4£ ‡Õ v¸Nº,\°ô䉳gÎ^¢œ>sñ‡åø‰³'O?áê…‹×ø”Ó¨œ8yîÒå—¯Ü}Y=À™+™û3W8çܹk§O_=qâ±cçŽ?ÕOœ<»{Ïú š¼ñfN²w¼™Äßo¾ñfv RÉ*#ð5«+5ØBÂwëÙ#ñó`T!~Íßy þ8‡ˆõocËQL[ØØ2½¼ŒOqdNPD šeíÞ}q7×B›'8a3>Å‹A)3Ÿ(êíNJ€[¼dÞÙ ßîûxÃ!S#Ò¦W¼Ü5‹PVfQqæ7nJùÍ’d»ÕÛD\àØËiº×€;(ê,q–“uºî5ÇAÝIU_ {!§)Ú‹iYŸJzç=ýÄ1]n$Ÿê’ÁO¥þ¦ŸÙ º™&–ÔrãÙ3h¥Tw¦Š8fË—•íüó„$&ù¼}î9Q‡J‡¬,ïÞ6^G2á\¬qG„ûM ø×þ’¦ýÇìÆ*æ\$ï<7Þ½e|²ê豊¾Ó bÊøÎ™˜ñ)Ä]j¥©eŒûǯÿC¸G¸Î».Z¸ „S`ó¢¼r §c $hÇñ%KWíÛdç®ýG^¾"õ˯vrä³Ï¿ùö»½œ¿uÛ»ï¼ûѦÍo/[¶véÒÔùó—xvã®'²zÕ¤BÁrÀLÐ%«îˆÀ^çHw D ›žh%tK¼ÿßN†ûkƒÕoz:mÈ¢OŽ>ºG@Îág¦Ì+âSØkVçØ5—jdb¢2ùá~S;ÿ…¿¤D7‰xI†Ã‡)N—át„®Ž¼püÔEʉӗ('Ï\–"GΜ¿F9uö …Ê…Ë·ví=âàä9cö¢i3æ/[™>n¢ÓüE+ݽÃ"ãSf.à´¨)ÉþA‘“½<¼ƒ"c¦Ú;zÍž»’ýÚô·“Sæ9vi÷¾ãgÎÝ:}îú©37Nž¹züäÕ£'.rüðÑ‹ûÁ¶göì;½{ïÉ]{Npæžý'ö8¾sÏÁº š²åT`‘=‡á7 ÙþŸd8§2#á¬RQ¢1ó ¬:ļn*ã Ç‘×TñCã*FÑ<7:MvFä$W2I¹sä;f]ƒ78uYy{)lƒˆS“ÞpS£z{Ūåo¾•íÔùÓ×ïÜ /ïÜ»«„MšÄ†GEÇ6¯=D ýÎòŠêÖ\AXz9-+nQ‡í9˜¬•‚I`Õ%`X£t’‹ðŽèˆÈ¥tŽ(ýÉ[« î+˜¼qü%5ž?+/þëM™÷²–ê¦g0X?eúáÖœ¹[a\@%Ï)oMt™üöGÔúD¸PÝSÜó*G’"ÎвŽÉ|ªµÅvÐ×Ý]¿êz/ìÜJåÏëýôïè–‹7ª;øwM(î–h•²‡X¥Ö ïj'ý§¥üU-ü—?ùgŽ08¤ ö™wê<šÀ£'ÎSçt„ÓÑîô¹«{ ‹=§íÜsxæœÅщñI3“Sæ†FÄÍš»dJ| N>¦ÏZ“ÈMŸµ84<)*fú’eë"¢¦…„%R>ý|ï…K÷Ž¿,vððyAµ½ûOïÝæÀ!þ<·ïÀYêì9ΧŸá¦ áÞ|KC8ö á(¸–RÉYÊa+“ÛBÓq}|ëAõqv¦n~¤†Si²pHx„!5"¾ JÀzxÿ…ããÇNÞ¸À º¾a¸{ÿÎÃÇ™ž®Êò£Åqߺvõêx|}ÕšÕœFâÆfV mDÝxž•`B¢î¥p =¦Nï’•iž¯è)ÁäMæ´Ï?ÿP$XŠ?Æ^²¸èØÆGúݳâ™NÜ‚^òúã‰Ul9TäOAS9Gç×~ ƒKÉn?™?Œå?w=qOeȾxS§ÈrÞS*ºø¤_º¦=“æ;©t` K’9dú¯Šü¬¶útùºà¾Äch´ t#‘ÅJÀÛ;+;ÇTõŸYhŒßÒÓ×NhnÏJð&•÷÷wÇÿÿåáÙF†ËŠp‹-G ©!ÜEʱ“—ŽŸº|âô„*ŠTNEzÞ®KáÈ¥«÷Î^¸yãöPçÈñ ìÏ]Dª;¶sÏÑë·s2'p)Rç²;w?züÊ¥+Ï_¼÷åׇ(ÇNaê‰cš¸vŠB…²wÿ9Êž}gµº‚=@nßÁS?@8oÿ§å5E¿¦Tlš¯?F¸ä¿ªãè6aÉÅ}¡yX>…#M1š`xa6Ól~^Þ úõ›7Ì;´ïÝß–¯Þ¼Ñà|ØZ4kþÁ;ï>¼ÿ€Y>&vJŽ·rvëÑ=>! È9}òLP@pÞÜùîܺËLÛ¼EËf­ZòÝ–­L ÿpqq!p̘1€Ä¹sç¾úê«Fñ­iÓ¦AA .°„œ¸ÄÆÆæÎ{ýúõGŽ!Ü è| àäå7áhGô§Í›7O_¡ºà:S¦L!Z‘ Æ¢ûÁ¬ûá‡rAê\ ¤ÄGâ+`Ø_|Q¸paRºÃöëááÁ9„ó‰ξ<̲eËÄ VÔ×3TdÿÊüaiv•'‡T™Mþ°¾SgŸ%$†•ä„{xWd¶ï;ýé4¿£ÿ¶?¯´å—Êñðé”Ý16ôž[Æezyç¸f~SŽ“²ûyîk4Й¾^ÞãþñwþÏ—i‡ᘕt„#d „ÇÈ%Ø&ð–átT«Îœ¿ÁŸr—ßìr8‚ ñÐÑs|úÝî#9é6û¯¾=¼É™h/_}zg  wüäµÃG/½óÞ× —ŽmœÀŸœsàÐŽû.Pöí¿¸ïÀy­(1Ž‚ÖmÐ\Ép†š —‰podûƒ=M( !<…Jºa"|f<öÄ8tÚ¬ÎqŸïäøóÌh)ÌkøD^U9¨ðTдŽ7.]q²wáÉÞx+G¡Ò%Þûü“S—/tîÑ­déRΛ;OÎì99š9{–’Jµ’/_ìoæ8yäļs²Þ$s1wnܼE=“¦Ü¿ióf:žßsçÎE…È¥ræÌ z ¤aŸ|ò XªÕÍßPðé§Ÿâ.'YÈ@‚´ ÃtÇ¥fÍšÅDæÃÅŽ»pŽDræòåˉ–?å‚l˜R#n#¸çÁMC$@èääħ„^±¨’3…VãÔ©SüÉMyZ¼ÒEþËš æwÍ /´X\DGÔ@×TÕŒÜ êô]§òŽò(0#Ϥ€”¿T4ËÏà$5Ž” ¹#4=³\BúWIoâÆòÈý®.z _F 7–öhî{o ›RÌy^±1!;>;e|J÷ÑÙ8]iZýÿìp¯¡½ÿR—øIÊ’—nÉâ ÚÈ㧯H9èö¢;uù4¨vþ†¡rêÜuÞ}h?°yÛç{öŸÛµ±ì•ÝûÎRgO}ÿ¡‹_Úèò‹r‘#|}ß¡³”ïö­Ó°¹!Øöá²+ûÃNÓŠÜ0>ÕtmJ­øé…ë-œÜêyx¯¿vïÓŸÐc(ò”Þ¸÷ð†rXG‰AüÙ³QÆæÈ–ÝÙÕÅíÍYË– •ÛyøußÀ .ûÞ;ïæÊ•gúì9mÚY˜[v–h„ ãísgÏsh÷¡9I³rÞ¼wSÝÙÔṲ̈ƒ9þœ-Z™‚ ÚÁƒ©Ì˜1~ *H] Å·ß~ Ô%%%!9áT‰lÇw'Ð…§'N@uFØ>v²uëÖ:ì‰í±ˆˆÒ]BX&Ã焈™’’‚膱­^½z°²ùûûó´š\h䚤."X˜»#Ÿ‘3q‹7oÞ‚ D4>JLLäüÏ>ûŒ:×Ï,6B.þ:IEŸ¨aÐ xÊÌöLÓˆÞxnØàW;fÞžÛÊ¡õ¹JîùðÖ³[pÀ›–œðG¨øXªk*µÿîÏïH½®VšOèÉ'ž‡-ø$ÏÄEÝV4õŸùÑÝGžÝBB–ÍKy5ÿã·ÿd¸LNNøºäáá4’k¢™ÌZéÒPHŠÆ’:…ƒ(!/_»‹Ø‡Ú-åÞ'‘äÐFò)òg"ɉ`wï¡ñ«ï«ßíC;ýî;7nùtÝÆ>ûòÐWßáö8¿{ßù{9 îüÞ÷¼´g?Ç/j…#ç÷8LîÚw< Âiv8$ ¥¥|ó@¸ÿñ5Wûϰ,©ÁòÌxéž1õÈ™Š#Fõœ6¹Ri·23 Í Y4ª5?Zd¸G÷îÚOÂíÝ¿/oáÂõZ4?}õÊæ÷ßãá ,Œ„ aþÁ!&­Ût³îEì󳧇—Ï\Ž ÊiÈÎJ ÉĬu§Þ=” gÒΔhü³ X !¶I€'oÞ¼D xzzQÈXXÎÐOrQƒˆP€‘¼œ "{db‡Ê]NÛ˜ha¾ Ž+ šI(lø"ÑLrP¾…b“'AÂkÓ¦ ·ã#4¨ï½÷ÁÞKˆ1·hEŒãh%Kø|_2 ¾¶ÉH$¹L&E­Œ£8'¨•Š1ýä…:~‘…½"³9Ç Jý=ó3´’Z‡»ÏU>¬8JÜ{I†ËD¸ÿd¸×ÖK¿íBÑArOuÓÊý×J‰*ì¾¼Ól»;°ÉAtÿÁ¹Ç*Û”ñò5•|ü¿ý‡pßk)Q¡ª„‹Râáˆ8}êÂõë÷:E~ü;v|ôé§ßnÛöÁ’%k6nÜqòäEþ¤¾sçAb×¶oÿpÏž#{öâLâÖ­ÛÆGï½÷Ù_ìÚ²å½Ý»ãâÿÙg»nÝz’šºyéÒŒ³–¥m|ÃÛŸ¯ÎxwË;_MµÊ'(q󎯿ø'Io{ö¢–¼DÙ·ÿ2eï%Àí=|‘²çй}‡Îí=xfïÁS{áNy´A“æâcòfölèýˆˆÞ~­§É‹4˜Yœt@Ó*"ˆCªæ6rßøàŽäw¾õLÑßµ›RÑÁaÞ¾ÝûîiCH…ig.úÕ”?…J]¤’?7N7ž'DºZ¸xÑ[yóxùùråú °Úg É´©4™ofÏ—“˜úa'ŽL]½æ­9ù¡HN›1göãçÏÐR’ ¹(*$¬¨ 1}‰  Õ@Záð¡Å}¿þúk¶C‡QA\ã W^ê,½¢™œ?>ˆ™¡`•z¤h«!'·nÝs#ÁÂãÆƒwkÆ9 ‘·N­ ´ŠðE‰»æk'¢A3ùGè<-ßr"Eɨק°‰ºmß^Ðß/‡OpUŸ”ù{o*AR‹Ò—CKZûâÝÐuž™.”šè¿íOlMOüô&´3ÊÍdâòK»ÆçvŒªêÿþåûWÐçNúˆçwïJK×.ÿ‰üÇßú?„{áôˆo áÎrûöýêËÝ ¬X¹"}ÞÜ¥Ôw¼ýQ`@ÄüyË’“fͳ$1aF씩ik7ÅÅNKJœ>=eNtT|bB {o¯€ÈˆxJXèö>^¡K¥nX·#48Öa’—·WÄð±®#'zt³a;Ô®gß1ý‡:¬XûÎ×»OïÞw‘"ðöᮀpJŒ;txÛ}ð,ð¶çÀIU„S±Þo^ Ä&ˆC¿Î÷j„°û_„»k| È)‰½ÿòc·ÊÙ¹5 }ÿÖõ+jædâ¼ûì©b4ÚfÁxrë– ˆc'šâ©Ÿ'NðG íîîÎDÙÄš5k8Àùè9ÇRV1 —¶\~#È!^ˆÄï“UHüïùˆãTãP ò§V†éØx ‘ŽOÁ?ì^('©ã9òÍ7ß ØDäÒñÐÅI¤H‘"œIþYNÃx&ø„N)#¨:EìãRû÷ïçÊŸød±h#Å´†*UðÊl@—puu%G¦GASîÅ•_—ŽFÇŠ¨E•«¢/² ݵ÷™±Š—{Ž¿<ÁáÍ<“Yõ«‡øoû»´ïàM•o‘ñ¶íø£zÞS ¹Fv ±˜2ýaŠWAGd¸ûšØ¿äî?„û„“x8¸»áð49súÂù3—/ž»Êþú•ÛW/ݼpöʵ˷ì=ÂA˜¨î;zéüµ›×î>püÎÍœÀi7®Þ9sò¹ӗN?wôÐÉKço\¹xëÊÅ;”ƒûNž>qùо3_¾ÿã÷¿}ïݯ?ûæØÁ7>ýæØ—»N}ôÅ¡u[>ûjשýG¯*…¤îW‚k‰’á”rr÷AÊÙ]DÅ8 ¼íÞb÷#¯ ᲎å¬Â›)~P´5û}¥Å"1÷=Å•<$qY¥1ÎãV¬A˦-ÿY3"Àij--ZN‹çÖ>ÐÂÔØÄw#«Ï½|¤s‹deÏ á#Ý:¥Ÿ–@#þ”/ž?¯òÓ±¡ÌÔ/•5†ZZÓó>g}<6¤L¾®Ç|ðÁ€è+W–sø!/ÙÌZÁ]•Nþ1.6ªÎ&6¶—þÔ!kSè{™­öûÿ'‚—&€c ½­Åk«#וÂòcgKyyæ‹ +â›þ*Ê¥æ÷·é_æ ô#öT­5Ã>Ø[ÐÞ¿ˆwTQ{¿”='U”·êzFñ;JÕœù×_æÙÿ ùá^F8Ø»á°Ã…¬ëÄy`lç7{9}hÿ1*¡Pß·û`åì©‹œ¶ÏaÀöì<ðÝ×{¾þb'ç=túÔñ ß|¹ï«ÏùøôGïõá»_oÛôÑžïŽ}ðÞ7Ûßùö«Ýg·¾·kÛû;A¸·?Øæí:€›‰*Êm2Óg’0¸ ™Æ9 áD†S*J¥¥<öÚNpL&î,›è¦¾ÿ0³ÆzüàÑý;ZÜ»g™Ú›¹G¬:t-Ó9ÆÍA§˜û4¾óx Ç„!ÌéÇ9˜5Z¦{às²™é•m&Wã»z0µ\S€D BD"* \V+—ÄÕéüXrM Óæ²:.JhW¤*à«|K—ß™úÕ²FæeÅf®ÃÕô¯Ÿ<‰Š7“ÄDÂæôÇ~mƒŸŸ.ÞøÑ©ŒµšW¤zzu†î7weA_ƒ›[Ï€ƒø+üo—½¶ÇøïBP h –£—nCîªÙ‹²Mö*âYÝ9x׋pU¨?S±,5Õ²æ_ Äý‡pÿƒpø˜ÀmBfA¸sg/:pôô±3·®Þ>uôôÉ#§>ÿè‹3ÇÏîùvï—Ÿ|µó«]÷nÞ¿rþê¾ûo_»Ã9|zâð©Ëç®Þ»ùà&2ßù›7/ߥܾzÿüÉ«Ÿøí±çN¹thÏ©w|ùÕ'{>þpçÃמ¸ýö‡ûÒ7¾íÝ]”??¸s?Ü9Ê‹x€³„ ¨¹CÊ£R³Ã§ì?|ŸLUŽdÚá~¯–R·¬ü_{çgUuï{Kònn^ž‰¦ÜäÆSLr“gbro41Æ$MÔ$s¯÷ZbÃ Šˆ "Øh‚ Ò‘^¤H/Ò§÷3½†"C‡aÞwíßðwå }Î fïÏf³fïµ×Þg­µÿ¿õïI ¨lœ)418X;Gìà„–ÏÝ}ò|ïk“~zoûŽÅ§ Ä I ƒ#z95Ý}à—ï ´«Œ3ž /hñúŒÅ¡r»c-pŒãhÀ¦Æ±µ1?nkÇø<=‘F”î’ò¤I“P¹!º4\ŒBeµ¦“Ü¥¦ìY¼Ã!£Mr—ÞÊ·ÛäÞXI)ÝXÒ¾aàˆDƒ×=8æàŸ•¹»áË¿xF§§ÿ©k›F¼#ãØP³ÖB`ÔRÍpkÍ7JK>ÓõÉs»õøl×Þ=æ­sÒfâϰ“º=HìV82r>Ý5§!ÂáÆXY±1+5;’‘›šö|Ïú½Ð`ßAÀÛÒË(xc䛯½ÅÞ½ËÓC½†À±ÿ‹^î3hÈÀ׆ÿ}Ä€—ö}îåa¯¼9tàë»?Ñë»;ÞWÇ/í÷ü«+­äV­H_²,󃥙ïÍKœ½ qÉÊìå«#k Ò#$+Ò](“ƨ%™9%Ä. ls—‘[™•[‘•[–Wž_ηh4—CŠÕ¸»<ܬ"ƒ=-Öþùý²ÚË;¿ð£ÿéO-Þ‡ÂHªY±kÆÕÇf&|& ¯×év"Ø4X•SšÄR r£ÿtÞPÍú<u„Ùjáá¸ø-öbú±úu&ÆŒ5äEPÿíp â’ìh ‘“03D¬HºÎH¼ Û«Ÿî5äsO<3¶ Â ÅG0ß1{xØP+ô_ÂÆ††kßz팎>ßçÅóêœÉvKT‚›gÌb÷O ‡Oûñ î<¾±¢Äœ’¼¦ðpB¸²ÂÒ|Ù6}´hÞÂõ«Ö-[¸tëÆ-)’gLž>ö¼ÑÃG5nè !o¿><5!å½i³ÞŸ9wê;3'6°Ï«ƒú™0zÊè·&°{eÄß|©× >½_yö©¾ÉksVe&®ÏËȪ]°,k¹‹SfÍÛ0oQ²ÓÌl6„sÀ¼åv 6N–&âá@8·çÅá4ï“w;xcdbS6í %7_ YMƒo•[zCÃÕ/¹üÉîî7!ˆ3è ‚—ÉP„ ¤œ|~»wï…³± ý|óÓWsÆÆ Q lP˜«ÙôsÂ!ãT†g3¸ÝÀÌ—. i0Н’1‹ÞÁg ;©—·Ì¢_<´——©¤B…Y®òV ËtxQð8fy¼èé`õXQÂÀmqˆ k”ïvóS݇}ò©A>ölšæ¡ ]:õp;ez nûž5e•ÿ¯÷SŸéòàWºw»ªÏ+\›>ÀÀ6ø.1Q&ÊP£ì)óëNàEC„;,Â7©ª²¶¼¨,;- œ+É/ƹ8'=»nó6Êœ/Èɯ.«ÚTU 悹™‘ªÒêÚÊÍŹåE‘²ÕËÖoX•\’W‘°:mÙ‚Õ©"k–'g$å¯^–´tþÚ f°åo^³®pê{kæ-N_¹¾àƒ%i,I]µ! ƒ x¸ÒƒðVœÁ=Å8§‡ ¼àêb-¥”\òÎÁÛî «¿Fäb…„Ýںטü½ èË=ü½ns.§ð]A"oä.,-]ž÷Á‹c‡M4g—*>EE(?DSÚ8)ÖДm‡ü$$¨ômñ}Q 4ާÊ6ÔcDÿ"Ÿ»/5ÖÍòÝÐ‚Å–Ô X/Jà©·òó è‚v<ŽQúÅø¶q‹Üv;öšèÉÿ[³nE®•[÷åžÃÏxrȧº ì<ëC:èa/dºá ·S§4ä}´ý¥5Ëÿ£ÿó—tê4£ ŠwÆ^ Û~—ˆ*X~‚pB\zO3~êüÆãyÓ¶‹p¤ea䑇ðI"dañÁB‡*îæ›ÿrõÕ¿‘-eAN! 6tosÞ»xþ’íå¨ÛƒÖ­¼¨¢nóö-5[³ÓrrÒ# ç."ìæªÍ¨ß’×¥—Ô xKOŒ$­ÍøpIBÒÚ¬”õ9Ù©EIk²?˜µ¢0» n F%+3æ/HÞØááæ-JY¼"g¸Ã \afnqVn¥œáÈe•`fB¨ôp¹¥?üñOñ3o\\ù¸¼¤ySØ‹F×7˜5ǽi§LÚ)âËædÇîúû24\;dèù»§ë»8! F¾¨€0kF‰4<žÉy¤º††sâ£àE…í§‚‰þÄ–Ù-þÃHx‹ã'@ “»îº‹¹†pfrTµ( ¢‰%-*t¬~r Úq¦¯nTðð Í›‹a²»vOý~Ö(ÿ=ke»=?û¨ : ˜[¶Ï¹2Óû¿ÔéÃíTé ¼4B‰bl’´} c(·€àtkS§†s6´ÔF8@ù$‚Ê?ÿùC¸ÊòšHv>z¸žëƒÊmø›#EΘöÇiSf¾;õ½‘oy¥ÿà^=Ÿ;bÜÔI3gNžýÎØ©3'ÏòÊ[Ïv{±wÏ~]:>Óñ¡n]{¶[—ç»w~þ¹ž×.OMZYµ$iÞû«-M[¸"sÑʬ…+2.K_¶:k]rAJ®ÜÎT’8–ÿÀÃågçUeäâ×èçà-RŠ”26ç>€FxÓT ø.Ø Ënû¾í{€7LKê÷¡€?° ý͸?|ò©_¸bû¾JYë¹ &)Î+Ü9âÄá ™ HŒ)䨤³ Dô!Çç·é2EÑPO N¾zflBÙ„¨&N”ŽÐ¼L‚ª{ãgs\5aw¹º;«ön¥s¾ÐåÙO>=ðŸðó>c³1æ>\ w"\ü àÑÞDb“ÀÎ {Í®²ù)ƒóF ¾g·Üá08i´v>Z›§øõáNl\S„«ªÜ”‘Á`ü¸ÉÌ]?¸ß‹C{õðà}]ztïûÊ€·Fœ–™Zš“Y™¸.w労5 Ek“KÖ¥”®M.‚{Ã.9³ ûG„+AD))¥ÏÃ9Ì)qÆ&ùÅ1C¸ð pô\ñù,¶íúˆE9ž9ò!ÍÍ)¿ô®‡¾}÷ýïäa²å|Ü!8Iù=ûÌØŠDšŠ}ø¡,s|_â'I —ÄxÁÏ™‹x;n1 Txñûiq¨)¢Ýî›>‚…4¢°añF qZ¹c^²m]CýÎ-ö Yñáÿ~àÑÿÛwèW:÷–X ¬A‰|±}߯Æ\ñöKÂ÷9d”¹õ$eqoB8±kú5DÈÖ“èãÈËQRJâRrÈ'£x¸²ÒjBvmªÝN’KŽ›6íÈÌÈÏÎ.*/«ÍË+«¬Ø\Q±¹¸¨Šð]5ÕÕÖnOMÎMMÍ[0åäɳ׭É(/ÿ(/R™–V˜Ÿ[]R¼%7§2aC$;£"+³"’UUX¼Ç€”ìªÔœê”œ Üà€7D”ØI¾nÆÃp¥¾¥ îÞòøFJC΄”Päð e[ šFVyÀÅA@V]‹dØ“µ5uéÝÿ'÷v|tø˜R’QÕ7¦Yi )w”vÔÅáü *"P²ÒÙ‹ $d LH.)+ †‘\"!Î /¼À%FdŒñäç GÖàò]{ÿAì×mÙÝmüôoþåΆŒìr^8. Ô—ãt7‘*±e`ji8S|3»GÔcb¡(›†A¤¬¸\DOxH ;2Q&¢ñ¥—^JøËÙ—:^~ùåúS9qÀ3"erÜ€šãŒb‰i#ó!¸ÐÕQ̈Ñå§ù–ŠÎœ„B+ñ@ûB4°mv¸ ¼‰UÕ—-¿±ß€®f0¸NÌ\笂PÇtÐâ¡Nëw‹æ$-ðh+çd’F¦^ÁGÊî&€[µ†ÙsN·ùpXŽ4•€؆±ÉŸþts£®¬š¬oIbrÞÀWßž2mþÔ™ ÞŸ»bâÔ¹ã'Ìš=oÅì9˧½»píú¬qg-Z²þ‰§ž¿¯Ã»özþÅW'L™3ãÝECþ>fÈkcFŒ™>ð•·9ŽŸ0gÂäù¯;èÕÑ/¼4ìù—†9¬"iv©Û3K]‡G8ç Ÿg[Nk|—.EË=Ií±¼r߉û(¶×;Í ð!&ä”÷/üóí×?×oF¤_QÙ}7MJ ¦äûÑrRžp1%–B5YáÛ$4hxC”d$n$H–šJFϲžr ™äÕW_}ÕUWÁ™qr̘1ŸûÜçHÃöÃþtDmFJ9j’•h“°t°n$Ç!B&Q»8çwº~ؾè—po°‰t¾ÿþû Ð èšõJü~7Œ…K$àF³~מ};\¦uŽÙëñ'{ßyÿc×þþÖ?ýçÝ·ÝñàÍ·Ýûç[ï¾ôß}íïÿú—ÿîpÛíüç\õë[þzû£]žê÷ʰq)‘Ò”H1ÇÔܲôÜrö´HûAoÆh&Y9ì4!pÞ’RÂç!¢Äã;§ $&z8ÈTMÁy Κ Øj$…|!øN½0{ñ÷¼ì±§ßÎ.ÀpËL>¡íÎÏ{ãþÚrøæF I-wLÎ}”>‡$þ [âiõêÕ ("¨ñÂ… %<äÒßþö7d‰€Ð×¾ö52‘JO†?qÁ9@“\:9Ž“¤HU"Rêüô§?½òÊ+ñ1ð$TÊÎScK¿!º$t²ÞJ/#‡ø¢bâö7ì$UŸ„V ¶Cud€k´@©Þµ òç*.±¶øê‘Óîm‚L0Î IªÂŒqQ`X²Ï©É±@A_îtÎ,W·ÈwZo!Â5"Ü­·bEy„B +¶VÔìÈ̯xòË6§æ”æ—nÉʯNH+ü ʶrÌ+Ù¼6)wÑŠ¤U YİüpmúÚäÈÚ„ì•ë3fÍ]qßÃOmHÎsŒWZaVþÆe+‰‹RB¸5‰‘ä¬âĬ‚„Ìü¤ì”ìÁÂ9—8„“„ìŠ4"ÜÁÔ9Î雓Ùy•‘‚ÊÜ¢ŠƒwŽ“´Ùsz ´›;×¹wèÚ‹+¶<ÙÉW‹Ë-÷´óg£ÚÍWM’FÎoEõ £V¥üøoö@·iµ ³Yäj-¾Ã¤ÅAv»ƒ=0êraÎ[á\Vƒnsæ·xñb²ÞÅýaþ•ïÔäŠøÃxS²ØÂ[ÒHàê{ßû'/¹äþ$eN’ˆ™'ÉHùK8<@‘j0p0s(óÌÁ%@H2Γ¹[žvÌç/れ°ÔØæ\¼«nÌÀî†éIŽà»Y“ÔJוF'Î0:.º1Ž_­TG7` Æm„ëªßé¾é À&C(¨Þ©dC.ŽGó^M¶ðû°uÇÒ„cÇŽ`b€|xCè$îÆÿøÛß^;qÂԢ⊊ê­d宬©ê*7n/*Û”Wº±jËžŒ¼ŠÚºúüŠ-•‘’MëÓ VnÈr¬UÁþ‹Ó3‰ú_‘?SÒ Só9&§¦¦¥d§e”ÀÇbP <Ó.x3³óðj”ñïÕr ·dänLË©ÆÞ2R´dÍ-¬Áœ’\ä?úÉågœý —.È¡Cr8ç׾ݼ¹³øÕÄ…dÞïÜçìFdB Ÿ¥x%'ÜÙP·Ë­ð¶7ÔmjØ»›`Ê| H®R7:ÿgò¼ñIo°kf/üñ~ó`÷Q ’+÷»{œÄC AÀ÷®¥µ–“‰Œ94wiãä`ÚR ¥0$‘I$ù»Á3x2¬E8÷ýïŽßT»þúë‘aÒ ¸‘:>û쳜I^j2„??’pÖ`ÎHJFSΓ=œ4§JÛÍŸâ’aN3¦Kó¦iLnñ½ýmAYÉ “Üîå@>ˆ}°mÁH1Iøמ ŒƒÎrÅ ff2aZ“1ªa¹†Ë‹«iëŠÆ© f˪ÖÖ‚_ˆ}:…˜ôf\6bK(ºÝ:œ7ųû£:òèÔï®ß³Ó}ÊŒ±û·ïu™QÙq‚äŸÛ|åîX‚ ð ›ÛÇbH¥q·Ñ§ÌSZS¶Ñæx¸(„{ôч¡_ t œ,Mþð‡ýëß‚päøÎÏ/'gwIyíÛ£&Lœ6kCJVZ¤dźT Þ2 «¤EKÏ«ÜJ®íÂäÔv M»þÛØÓ¼¹ð r°qì4è£y’^ºÇåVÐ+3w3 G†œÂM‘¢Z6ŽìááÎúd»3ÈŒ •wÙ½…psç5"œ#^û‚õºç@r”wïÜ·ÁSÝ™ïÙ»­¢Šoù ™ÿqÿcWEXôÁ›Dö6ô{á5Oöøå#_ž±`3KÀ@ÖuR6ûH,2gäG´-?NJT¦l¬H0§´(Ž’8€- Êæ¾-Úq¸Ç¢ãúÂýÜjÍÞÍÏ*Ðʽdéå|ððË"g¼ª~‹êó«%ªmúæ-Óˆ~öãœ5Í¡¦|:¨²úÖwöÐKØÊ}u*>Îæ˜2`è'нô¹Áž?Uç©£ÀÜIÚQÃÇ7r¨ã¯áG­,ØîaH ÜÍ7ß Âá-Â]ý®ºêj®´¬7€•«“çÌ_>èÕ·úzýÉîÏwìÜó™Þ/?ýÜËCÞ¤•ÕìÜ^Èž‘_óáú¬„”ü„¤¼ ‰¹Ú)cB™”ÂÛ÷Æžž‰¹?<pÎÀ„]Ú5v¥SA!(Á¶Ì¼ª`¯ÍÊßιcn à‘‚j¸ÌÃ!\»³ÚÍžÿ>rÈFÁVrˆ Â÷RD92px«ß³uBLxŸÔ =­ûv§g/~ Gÿe9ˆ"×mm¸ЈËìtuç.ƒ?X,A•O"Âù+Á¦«B~¯><.™Ÿ1Ê3Ø8}ÆÔQÔcL%9o”£c RÔ vž²Ñh{ò•F´ZùäI/hîçFbÌí] %f ï€(ÍÝÚÑË Ï íÔ¤/—Ô—»ä_¨qÑÊC1¬9oyŽÔ”ê˜%*Ï Ù¸£Î[Oø+*Y®ÒtµÑܶÏĦ®EýÖ©æ7Øô5Œ §q5rŒñÁù.äK£î¨?0VÚ±8œ|R;<–â0püã»)åï~wý•W^5á)å·lÙ• £–S2÷ƒKW&,X²fñò¤Žo™:qú=‚L W&-Y¾*1wMb^bJ¨¶nCΚuY«×f®]Ÿ½>!Ô ç´'§Âع=%Í -1žÔîãJ>×IçªI;¶!«ÌÌ«‘¢U\€p&¥ü®ÝYgΚ?×ÙX±Lˆ¥ -r 8”}V%rsCRUßPr aÙ®†?¾ýÞgìuþã¾òäà¯ÞÛ{DdûϽþïžøÉýMÎÎDS KçlŽOªªê/Wµõu`Š©OÅò ^vÙe˜èã´«¨Ù.¾øbÕô¥=–7Î_„*\²Ø?à¤mþ£cõ­o;ËÈÿ9-ªÄ+V€~*>5(pâGq šE0Þ\Tèg]UÛGË÷ÝwjNÿFNZœOÎÊŠàÚðù‰&Ž÷g¶Íú¾‚`NjŒÔ±–þ—²Ù=ù®jÜ ŠÍ:ò ÃOµÐ9äX0üOãXd›1Ó¶ŽpÄ¥ä›Û@¸?» FîÖk¯½î¿ø¥®ºº®¨dsMínÜÑJË?â—®”WÂ`dùšÌÀM»š¦«6DRÒK“RŠÖ'ä­^›½j —½v}8ÎhߘϞTи'&;ÐÈž”Z¬ÝN&§•ÐfjF~A‚oÇÆEòk³"ÕŽÿK/â•ò"\û³>ÑL ôpΘâ 'Ι5oS²Énи ‘'ö–¹…’,È Ìuo#r÷ž÷`ÿO=1ä“O¿uÎÓo¶ëÐ狇ü¨çð‹îxâÖo.ÝVG&8Öük7ŸôØä Ðå3pQ‘þ ðøf Ëâçô½yåOûhŲÀsø¦6åK`ßž*ás¥ý“ÖøÁÐæ¼óΓ¡ V Øâ!Tæåy=[°ÛbÁsÏ=SýLˆ£˜n4\ׯk Éöè£âM¯ìÔµÑQ_Y¦$Ê´€þ•i-*Ôg )Ýé×K'3”6-éÀ(Á†búØo÷ËÔDÇÌÜÀ–X¸zTîÙÖ<—x­¿ýío™éОh 2Ù,*zÔ‚©E‡¦"ôM<Çúdáþô§?Ýt‡›¯¹æw<\YMII-×%e[p+.ÿhëö†‚â­îã| ÂmH-!žäè‰ó»¥¤•€^ ÚšuprÎÅ`k r‚ºu\ùóÙ7$Øn€ç#œ¹HÓÀåmÄs @¸BøË¼Â ñpÂ5ÚRæ‚g¶;óÜÙsÊ|عocSç…qI×^¬‚!EZ[SÿôÌ5ç?2ðSOnßsl»NCÎè5îüÓ?Õñ•Ëú½óØûkÖb3‘-v!ørf['KLiß*jÓ “’„N`hTjkß§¤šM¿=ûD-¬—šõÑ ìä^6Jµ8T¦§§C¿ðˆàmq‹º/hµ>¤ €Ò°>:t(·-Ózߤˆeeðð§4²… ’‘ˆøWÍÞ•“Q u ¨¼æ‹C[”ä3-}k&&ÞàÁƒYhAC܃¥K—Ú/Ò¹ê<ñvíZ¼\æÌ™ÃˆÒç¹—ô™À²k¸d\ƒÎë[nPÚÂAÇDì…p?ü vÀ wÓM7acÈÁÃIGÈ."˜y+1!÷éî}{ö8fÜ»3ß[6vüìaoLìÓÿÍ·G½ûBŸ7Ëo½ÿ¶»›8}qJzyrJibRñ†„Bö„Ä¢¤ä±3:éΧ”Øž”Zª=9 Ž­’==«Š=#»š=3§†î]‡&s‚­€pÅÅÕ—D8ùlöðgžyƹsç,nÔ½í¯?°Çùb×€H×ñA«­Ì††É›÷Ü6ñý éý‰'^ý§'¶ëüÆÿô^»{ú´ï6¼Ýÿ<óýÞÃW54dõ‹÷ï$]˜„ÛX"Ù<[”(_Ìß<R”NŽ“PÑSóȶ3FŽ}¹¢5e2=™«D)38¶E ÜÔ¾õdt{æüùó±óœ/ûÉÏÚŸu’IáÚµowî¼÷˱Aä=ÎS ÷€í õpcÀÉKûeD¾Õ륳ïét~ÏAçõ~³ÝCýÚuyퟞF—¿Ÿ÷Ì[_ï=ü ÷>=¥b;ö&yds±Ê^œ N" E|ùŒ}6f°. Š²1IçÅÄØ Ô—pª5Ýë[—ØÂÙÿJu£¯KwÔϯå*ðtⶈäi>àAÁÏcÙΟ: êà/»C…–ÿ”q„  ¤˜Êx¾,†Œ‚x<. _ðm@£qò‚ÇtK­é)ˆ.©©(h´/gćzˆPgr½€ð1”ͦFC-×K§tËšÉ6aÖéXBª2YmЫ”ù¾MŠ~¯Áy”jFà–(ÍôzÆLQ0,Âù¨f#ú:$Váq,zZ³ÛÛ™·@`rR¥ «Q'š¼ùæßýîwðp€!»ØÉñ]]µ¹ºr[YÉ–‚‚BM––n©¨ØVZ¾­¸tkZFY**·Ôâ@œX¶Á½¥fT$&cB‚Ùd);âJŽY8kWiÏÌ®äOÂQÚž©æ<'µSæLNn +UÈÏò6ª>…®`S$¯:;R™©ÈÉ­ÌË«À¥¡ °ìßÿãçN,éþqî9gA±Î=ûœ# ’É5;ëºÌžõƒîÏžÿHçÏu~ö¼®/þóã½ÏïúòO½ò:õ;¯c¿ » úfç>ßz ÛƒßBýæ²â¸ÔÞõ 0rèóäGnqÙ¢_=öGìk¤¶aÝs:nìÐô( ÓìÙ³©òñ#PÔWD;ƒ‡ƒÀá“Ê"”››‹ /Nâ5ˆ›@ô©§žbÎvà 7°^ 9‰s!+X7ÐŽOŒÇ!üä<|$eD&pAï€7ñÊGUmÆe7Ÿœ—Ò:À—«Oœ8‘õÊWÎ3"tµ„çpÞZmHßFçÃÐk•3zôhŽðpsçÎe%Ä„¡ÂsÏ=ÇI"õhE"àÄü=4(E˜V„“œ'F+l:s€[_Úq²gÏžð ÿöoÿÆs¹„}0£Ð¶R«Ôùüç?Ï­Ök!Â9„“„ƒûýïoÀ„=j;|;ŠÀdÒñ$æ$%f&%¦'%¦e¤e_ùó_ „;«½K›óɳ ¹Ü…û‘#/Ý„ÈË{?¶“øË$”r9£\d¯F®²„ô ð„ƒ倃7\ÅCqÒ±l­YÓpÈÕ±±° OMM½K*R¥6kÇì÷|ŽÐª5õvmÍnQШ¯Ø‰zO Ü(2ô8–yâ{°XˆHu¦ù®¨[ÐɆˆ¾œÐbúXL55b‹¢ VQÁǦgù£ÏXëqþˆÕU+[µ5„c‰êœ¢NðÆ†”îg?»‚˜&ÇÈÈÈJIJeOJH^»zÝÒ¥ËçÏ_0kÖû3g¾·`áÒ…‹–-^²bѲ•K–®\¸tÅÂEËç/\¶hñòÅË?\ºìÃù‹–Ι»`ÞÂ%kÖ&¤‚iÅåEe•û*«Ú:R.,*ËË/¦œ•·zÍn¤Aç°˜öW¬\³|ÅêÙïÏŸ8iÚøw&Oš<}ò”™S¦Ìš:uö´is§OŸ3cúìéÓfM2sò¤éK/ûñ¥?Âx„s²ÉöNV‰6„;döœƒ‚I’G±–ÞMVî= Û?Ú¿9Èv #(Ùƒð^³~ßþ.$ GôÇ}ûk÷ïCzòpÇBNJeyõéŽo\.Bc~î†+òç’lRd¨âĨ"jª Í_öÑ÷‘7)QUïÞ½­O|”5Îï¤ôØ)÷PÓo¾7wT\:FÄV<ÆÁkÈÔùM}怷(÷pU‹Z¤ÙÔâŒïªÇq'í)¾ ¥û¼Í!œ:Ôœ±„†‡áPŠ"åÄ#:RÔà¤C×$šXŽl“&MB`Z íÔ©ÓµOaŸ2mò”i:Nš4…#8cæ{”§Ïx7--c÷ž}›7oÝV·cذ×GŒÝ¿ÿËÏözŽekuõÆÚÚÍìçøñæÌ™ÇÜESÓ¦ÍàÈ>cÆ»#GŽ~üñ'Hzpûíw’ýàÁþÛ]÷ý×ý÷£vêÚµÛK/õ¥2Rø_ýêW& wr‰@‡\ý¸2 ’… è `œøÿ Õdò-ˆà̦Ø0¡¥IK¢'Ö~yö`Kùúë¯#°BƒÇiÑ_}ñ¸®<ÚÔ®6Q… >êešã="ÜÃ8-½l¤ ƒ%Âþö! d±Â:ˆø{` ë_ü(±)ÂÝ/ jùçü;3èGœdƒR#],Ž8r K‰?i‡3¸ÊÒ,ÈÄy@ o¡=zPæp«“„gh“Çqž[¸<ã•9‰-“˜B6šýö·¿mðáX§‡<\<ЩÖ“x: íÏ|æ3ÌXû°`bJC­˜0ˆ ˜ºÈ䜋ø)„WbÖ[º—°[?øÁ¨±0ä‡À4æ M±ÂcÊá$'÷pVr‚I¬Ø rS¨HQzD+´þ(Äö‰ÊêÀ¦µˆ1ߌ‹X%õ§ ½ ZˆôêՋΗ£7ÕÐÑ )Zþæ=bF%¸3âæ(]šn7œó-’ì¹M}E }>ωbõó!ñQN ?Û:ÂO“p’ O Ž 'A;6>K¾p˜t¾v…œá«Äg,¡ QP8ZD*CÐÒ³Î#¥»p¹•€ˆ«”A#<%©@Hjr†´@6©Éy6ê3‚Kz.pðU8v=ˆ8ñÿú¯ÿÊIÁ›ÞÇr!ÂÀWqÚÜb¦P"±k¶ ç¦,¼8Ϻ^>RÚ(Þ8Ì.þ5iÑÛ ±lb3‘CpRžUšíÌ@dï`eÄ!B8Ž6ÿ¿üå/+AO˜Cà¨3 6H½dþæ‰(èòÀì†TÇOö†4ˆqÌÌÌT;B¿ÿ™ ÆÒ17tIGD\ßúÖ·tÕ8xYfçkõôVÒÆ±1÷¢ZO7K(ý:pÑ|û8#öS¹µ¯Y¡Í!\”ä„cA ¶ÁÀq„uƒŸç`ãpW$Ѓ´_ŠáÆ—¯Íh Â&´Ó¦Ðé?;iCiȬùWò§‚¿©YŸt†» %T°K¡Ÿj‡v¤‡ÓŸzŸPwb߯©~—‘ ̘0È!ô£$ø¢äೌ¯2A.¦OŸNY=ĈOƒÛ‰gÁIܪ”s‡ù†è^‹B­Ü˜3ýË#¢gF|Kˆ—šÂb‹e¾²Ö!“oê¨pªwx ½?XÂU8ý†&‚å+Êä`ÁAŒ.$ϊʦðÙ›—p‹ânã$§i¬<0@Á!×7)Ya¸õæ`–i ©³…pÉpÞœÞx.úZ d6¬$óË;;9ºqž%  ƒ.ZD<° vÑEÉpOO‘p’úz=6Måõ(³B<6ICsb „çNº7@N‘f(sd¤WŽàߪ…„F‚·¦›Ÿ‹DœŸÉ!r;P$Ä2|Ò`+¸GJuI™šUÖF zñ…†mºÊ£C„k!ºÿÍúæ@ H¦1¤DðÆzY¾ÀÀF(LQI ÝÄD I¬ú¡Y"šÈÀ@h·(òè¥t©|/\…’¸’ă(CŽóPRÊ+V¬ ¬¼2·\ʨâ ,"e‹-T¹¬”%ÄBÎ C”á$Z´ šyÅüDDMSò»ÑÔd†Ôrž Š’R MÚ·y«UñO­þ<‰oËPJäËšÉ$ý¹`Á̽šŸÖ’“oèì—¼»víÊI†–Zz8þD£Lb±“zi¹Ã–‹Å ›D‘Jˆ)Ü×¾ö5š–¤{:$ØL!.°bJÒDûÜï å*ï£O*sÁOg‚I\©i¡c=ÄŸœÄ^œSû”U‡£X½æt~›C¸(Vl?Žå3C™>ˆT‰Ô…†ˆRfÉ$ǽEqi>8Ü-~a’@ñëÛ톸v¯.u~_¾æÛà6gÎ…÷ƶäcK›Ò¾h™,áË)ŽKlØ} ®‰/ÊÂ<“ &"‚øÉH\©¤nF¨%0ÒV*â ¦XQAj!pȬh ¦K`™¤Þh”NNÂ.b3)Wlû0n[3…C¬E躴´4->X¹*'£€ÈW Óñ€”]âÔÆ…á`)Ž‹:& ¢€ðY*4Mh :…AÁ Š 4ÎpC5»¸¸ÅQ˜¯ÁXsÊrpä5øÖ:š?läiR¹¡‰Ê³Xúð>LÝ¥ôrZi!P5ù¤oÕrbcÔæNÝ$[U,`ÑðøØ+ƒjŒ%2Ø8x;6®J ™¡¥ë Z8òfð%·ôï:¸Ú¥¨§ø<\sìnOl†…wµBH±¯5õŽB¥q×Ú<Ê ßlêü L´&Šf´Æ÷ à’Y1˜¥ë|?½ç›"®H[+tÎ)ýÈ Š@8œ”X4àq„”’oxÃõˆ«~#G”a×X©H$éT Ä:ÒÞ´¨3Z·0pk®B}êà1 †Ê|"O‚ÿŸ´WeØ/JäÞ°tÒ®¡ÜEÄ*T¦Ú·‡Ò¬R"ÓB•Hk˜D áã 6½ª“5P›C8}„æ2Â`|õ«_EÜÌ`H&)œÃIõP‡¢Ä26ƒº£¡U³®Æ|^Í/3£6æ·ÜãÄÃ1½øÕ!M9¥é]Ó—7ª„°n3¯)jJDeÃíG]º¢b+Fñú)°E-•¢4jö§b€éO™Þù~§ÙX´ÐÏa W’° O!þ„¯¢ŒF¾õ7~t2h‡$6Ë î|øduÆ­–Ȥ쵕0p˜ iÕŽØÄzm9ã×C•=™2†Cá e<©»x,䑯åþËç&^–# +̆E:ÀÌ#@kmjJÀÉPJ˜‰ šÆ«úþ”Ì™0¦ÉqL-]@ßÑÅäëCJÉ(jC2I”à ³¢ï~÷»ˆt„Ò12ñí$ýrS¤9ò™Ã!V³2¸Y0É»!¯· î8æÊ)RÕ¸+“I*ر™oIu3¾ ·|r5=¤Â…Bq Ò MÖ²µ «º]ÑèÙ,Ú…u¤nTe?'Ü)ÒÓ'á5£‚‰|‰)‡ñ¢ÿ틦Àf ¡ÑŽ XéÕµà À@hp¹…š6¸H­pÏ­šæ¸­F´¨ÒƒxÍ%ÓûúK(±†zgŽ6Qõ¸(ažß„w³¸*'ÜõmއSOé{fд_rÉ%JV ߦµ NŽXšÈÆä¤lâÀšn‡ÃK¡lÓ«¼!(œ¡pÈM5›n¨p¹ñ 6%7PŽ:œùWå:ÂCn²‹a6‹ EôJ¤16–r,Ïù¥šj¢D!wÂL¼Ý([m9ùªÔZ4‚£â•À~‰*ùï/º 2û}fÒMÙÔ-"ˆ~Œ(¡q‚¦¹´©eDÙÎð *c+Á]\å)á<<ÆéD_á;›Î–#þpþXiêØ8 G œ|ýqÔmë#Š.ù¡™ ücüÙð$‘6[YMÞÇX=ÞÊ„&&õ§¢lš¥özüfN’6‡p¦EÐpbÞJÔ"¡xÔcöÆ;$Œž’¸Êaˆ¡-\?±QІ¬ Ê'À%œpô¡2v½lÀ'·ÓöKDI¦Y'¤2ÒQ¢9³ñÁ«€í,† Bb’D‚EÌüÙˆïŒ=•B?cï‹ã@‹_'( šòçMÁëˆ#'`‰/È ùÓ|bòñó›9cŽñ› «µDh¬Ñ„0ß0àÆ¬Ž‚tÜxõ\¹±5Jìô‘Š[A|z<¸)0ñ G¤báv|Ý0A€5ê¶ÑvzœDÀ]ÌUµ _ˆk”LÒ™ºrñÆÇŽ»Ðç±1 ‘+0ó9b,Çw¡Ê´Ì<ÄÝ gxIa¡‰™–\ØøÉ…™ ?*¾æH«Zb8Z§MV,,dǯFtzS=]Š: ƺY/q„Ã6ÒV0>—f//ô²K–œ“Œšõ×Çv£(‰OUÌ–Dõ%J5á †|úÓO¨Ë]öò±’3µ9„Óð˜ #õšR*l ð#"FøVç ¨0¨ãÛV²¾C¾m5Á3廡 ãdÏž=¡4ŧŽa Oô/ðŒœç‚v¼€Pœ£ „ãõàÛn»Wä(ƒs PGA,&G6´Ê×]w, œ(G¨^ˆp­C†Zú)¾xÇç“àÝñub5‡4}T ì± 6Â;ˆ‹‚\_ð@Â)JuˆÜ5 N“(¤I¼‹àQ¸¢0%ÀrNð†2 ]éüpà ‹}æ³h.³›u ¼ŒUHrÎ;ðàçÄ4,Ýä¼eÓcºòsÔ B/òh6T‰mÛ˜T’’{‹Þ`ˆ\-Y2É$„ê1RBã‚‘&'&²ÖâùŒ÷¢Y³²™l|9˜§Õ²qçzº/ßÖs}SI³R³Æê§©YœAš™nªr”_Êñ~hmጕfí)¨PVR6 GL8'>ÄòÙ8` ôðÄÉu|ùƒ¦À—ÌyqoÂ9œŽÂ91ˆQŽl€áPy4›P Î’Méx@_!ï©‚ä¥l˜6äŸðmlB8à îMâÖáŽ÷“ˆÛú²&`êÚAæÀ&-ïL$\sƒ2³$#’eX%PŠš˜Sr’ÉI;T£2|øAðS” 89É‘ °ÖVt(|xA> èR™Lt ±’üÉD¥À—¢:>!¢ 8‰ÞD™„ó &k8ÔuˆÎ˜Ã’ª)¸"OAüN–¹ wxSBc¬\¹J'-`3©ÄíÈùŤ.e\äÅ1vìXz ®ÝLLT,f¡,ŽáÅ_úM§RƒÁ¸s "Æ”Önˆú ¤Jœgµq W|D±OAÓÁ„ɯCXÅ›à÷F5è!ćTN—)–é¬f”•3¬¼yVB 5Ñ¡0”ˆ[™'L0*HÀŸˆøY:·3m?qIÈ×LÊ6p|]` } “–(1ÔØcáø’A#æᙥ$UŽS89Ä/’U‚mª·ç#œ@lƒ“£)ñpQ=EYßpþgmË‘9jIæ`ã 9mÐ&ØÆ$Ï B8T†…¤ê£l)ËC„;EéZÔkûŽA@” ê˜TòÎ3¤˜¨Ø=²ØâO4p€˜¡%K– ·„=BIË,•0¦@~n‡hRâÂ\¤¾/À%>ÓcOàW< ÌäÒ™Š‘-¼‘çÝNGYz/„B¸¨ HilŠÂ̸°¬± M Ú.ÊF³t8hT`eËdÑHA0)hFÙ¬C&[~Px^€5Ó˜1cð'fv1ŽXpIÄÝŠâÍ&1ȪhdøäqdÊñD3=®Ó-má|S ºþI ("J<À±,URo_)_¾²{ú±áÉÏâTù¸IÌ-%3T“ÆQx£&™¤mʉÊÓ9Ï›€pÔa)Ä+qÌSU0X¢T–E°qœ1ÖM<À&» pr¡î„¿Š¸½ÑWõÃI£f¡v”ã iå!1F¤ hðI¢,H#YÃHaW%øá$ ä£@¤…˜ö (Â1( k|¨¤ :EÔJ&9Õ€(ÞAàS™oʄϠYÅ?ÔFvCŽŠêåû‚^C£}f—Ð2TM ,Gf¾0’KÜÎB¾9-âv@åÅè mT&‘ Ì¢¾J ^ðpô'ª Á+`.)’2®* DL̺â‰Õ†d Z †Z  O†Câ …œ0a`†A“iÝ$‚&Ã-Àj"úÔãØ8NÂk2= Dʬ Âf5æ ŠH —;ͦê#3§><¿Ž ê[Q6G'×FN]½u`‰”§Ûôp‚I°\Œ Ø /SUVŽo ‡{92Q¾ÀÆàˆÅ Þ´QæžN™q¤>(Å;@¸EðÆøñt4p0mJ,.Õoˆå'¯Ä º' ÚQY¦,3P„<ܱ‘S¥Ž™–A”)dŠ –½ŸƒØGȧ°ô,Þ!ˆÄ$†!ØÀò–j,¥!‘D‘‡li1NAø6äZT8<¢RÞ zbUN ¬¢ˆ±$NtJ‘áðD !vÐ>~ÊLÆÒP>Qa>=Ò€áÖBSH>à Çèð0l–Ëe2ë'È™÷i¥;U†8ê=%že¬&ÄÊ…Ÿ±¶µZp„,h€¸HÁº òà¦Wi^»$LfÚÀ7sÁ] %þ„³pÛZ£€p¬@;qrÀ!/ 8[l˜|3RÂÈ7Þxƒ1¢5ô©P3®‚µ¬¶0’ɽ‚T‚jZÉ;‹¥ëa6?Í™¤™l\E8Ö‰ú$¥”ù"è‚ ‘M Ä@2]`¤¨Æh0Tc&IEÇU–E ‘lÉ9XòÑ‚[Ô¤Y6šõK2ׄ· e¥›Èt|B6éáx7iàx´”…ð—¼-0o¤~c†~Âi*³VbA$¯ƒáNQÒõÚæ-?!»*¢ãë*ÌžÛ7ì–öÎŒÈu;4ËБ«¬ËìÅÕ¸´_ª©²yDÙkƒe¾VÒÒÙ‹™V*œTS¾íŸÿ«U“M¿jm3Ÿ}ÈrA ã×Y¨o…úÈ/¸à’`ºÁy¤š ‡¬N8¡‹ Uðh Ñ"ÄŠe Tˆ•< h9ø+!Žæ‰I))+¡ë!= ¼ÿ`æHS€±’d• ‹**ƒÄÊÜr£â­ˆÑgÕŽé¬"ŠÑ>KxJÅѵÀoMŽ÷snsçÛÊóÑ6t´D‚âœ8ÊDö€rŒ<¤Ëå'ÙX™‚s  ‹bù HªÉI0 ¥82iŒAä^ð ”â´|ÊöÙ&B'š‚‚gB,RR¦n¤YÞ™w jdx8𠄃Ïã)@& (w!7`ö„ÞÇû=Äy}ß®ÌÉìÓ¢fõ[d±fÜOSG(kGX"¼Qœ-áŠG{ºt?œ1`Sýi®Nf&. ë×W˪©fy¢~˜'<Ö-TóíHã|€Zâõ´ª<™ À€™S§¤¦¦r‰Å±öCJ‹ùÃ0^òý h2ì5Õ4r$[)´ Q'è‚ÆŽ:JáÍU¼—¡)s 1ç!YŠxH™~5Œ>„”Fàùdd$¯8*CÙx©÷ TJ…Áô©‹Þ'"êäv©ŠÙ,œfsÌ)Û©ï„sÌÐÁ#(*È܃)xÈÖQ c ƒÅUP‡©ƒŽ ˜Qƒ—ÉÆI&'À›*³,¢&í€|2`äv*ƒšæ“€Ôê–ðp¼ Ó”gq °j&0òŸ£) à" Hæ l%wqäïÌs¹„¡/ ¢kçx#R‡ôki‰Ï2l3ì°Z®|ŸHà?HÔ`²jÑ Ð‡‡­¿âiч6§ñá8¤ƒUÂàŒ°Ùà$„ØXõpR|À†½‰\€:89p (â^àJnmðaiA6&R¤pò´ãFZC§(Õ¸7XFn‘ï9•R^CÚ@ ¨sQ‡H¶©×‰ß Ë4ÞP¹C„kÎÞö@ö@”Ý ‚eP‡O¾^)ÏÂbE6½qîª"Üǧð"€Ø¢$ Š` tAŠ(饸74ù”ÅÀm›0†?Ñ«E*Ò5Á*‰@%¥äAœÔ½È»áº8¢³…Õƒ9Û8R_ð|´F›"ì“Õ–áçp:$@(Ä¡¥_¾ Ò‡ÉÎ'ö¬ækËZîµC„kD8!™°¦ & f „åD±¸àäÆ$³¥˜^œ„ÈI9ÀH)‹YšP«hSŽäÜ˳Ä2;Qó¢äY šâx‹(ÿ¤ÿ€Kiû8Ò2õqÀT Ñ6bIÞŠi‡m7¢s$é!µÜǶöÀÉê?çŸÞÁÕÒo¥gv¨Êšé‘ÝÒ¯"\#Âò €uÞ@,±eÀX†¬2°ÎQ'a›À†Ê2Œð¤‡Ïh¼Ã@26aíËyœ#†ÚâA8ЄۤÏ'ƒL0LŽÞ4Âá{ C‰¡š6 &ÁBœNÐ?c­ ?‡õÜ›l)C„kéO(l?ì“Õ²¤íühX-ú22gU>{PTDï}ãm> /Properties <> /ColorSpace <> >>/Length 430 0 R >> stream xÚ•SA’1 üŠ>0Š$Û’}%KqÚŦ€Ëf)*ðZÊ&;p£’[mYjµ4§§ûïË××_tz> }x:ý$%ÁOI%x­¹–-ö Î_„ö+ k‹|›Õ{]÷W:}Âñ÷k]¿dˆÅs6ÚÔY5¨9mxðßsÃ£Û –©Ô¯y3]g™ÞÒµwéà°F/ð˜<|Î1[3ö夯Q;‹4Z¬«R÷†|ÀÓÝ=ïáÐö†ôDº ;B`YZ€sÌáÜ{o8²Ä_È õÍúè¹#ðs,C 5á2€ ÜÐQ[IæX7…ZÒË×d¡:eCwR¥6º ڲ߄ /ùýƨ;"61”Ty)N]e³'ý!l°Å»¬ð±‘Áqj³b!øEµE}¾+´a<ʽÛaëß>äløªªr^jp"²ZÙmÌš¬û³?F.-©LsZÍåNßèóaÈWC-*žå[ôìgÂDkØfÕˆè(Ó ð7 !È; å˜<>>ã‹û†´& endstream endobj 430 0 obj 411 endobj 431 0 obj <> endobj 432 0 obj <<>> endobj 433 0 obj [/ICCBased 434 0 R ] endobj 434 0 obj <>stream hÞœ–wTTׇϽwz¡Í0Òz“.0€ô. QfÊà Mlˆ¨@DE €£¡H¬ˆb!(¨`HPb0Ѝ¨dFÖJ|yyïåå÷ǽßÚgïs÷Ù{Ÿµ.$O./– ™'àz8ÓW…Gбýx€¦0Y驾AîÁ@$/7zºÈ ü‹Þ Hü¾eèéO§ƒÿOÒ¬T¾È_ÄælN:KÄù"NʤŠí3"¦Æ$ŠF‰™/JPÄrbŽ[䥟}ÙQÌìd[ÄâœSÙÉl1÷ˆx{†#bÄGÄ\N¦ˆo‹X3I˜Ìñ[ql2‡™Š$¶ 8¬x›ˆ˜Ätñrp¤¸/8æ p²âC¹¤¤fó¹qñº.KnjmÍ {r2“8¡?“•Èä³é.)É©L^6‹gþ,qmé¢"[šZ[Zš™~Q¨ÿºø7%îí"½ øÜ3ˆÖ÷‡í¯üRê`ÌŠj³ë[Ì~:¶ wÿ›æ!$E}k¿ñÅyhây‰RmŒ333¸–‘¸ ¿ë:ü }ñ=#ñv¿—‡îʉe “tqÝX)I)B>==•ÉâÐ ÿ<Äÿ8ð¯óXȉåð9€¢yPÜõßûæƒâ›¦:±8÷Ÿýû®p‰ø‘ÎûçLg ù‹kâk Ѐ$È t!0VÀ87°ø`ֈɀ2A.Ø @Øö‚JPêA#h'@8 .€Ëà:¸ î€`Œƒç`¼óa!2Dä!UH 2€Ì d¹A>P ECqB¹Ð¨*…*¡Z¨ú:]€®BÐ=hš‚~…ÞÃL‚©°2¬ Ã Ø ö†ƒá5pœçÀùðN¸®ƒÁíðø:|ŸÃ³@ˆ QC â‚ø!H,ÂG6 …H9R‡´ ]H/r A¦‘w( Š‚¢£ Q¶(OTŠ…JCm@£*QGQí¨Ô-Ô(jõ MF+¡ Ð6h/ô*t:]€.G7 ÛЗÐwÐãè7 ††ÑÁXa<1á˜Ì:L1æ¦s3€ÃÌb±Xy¬Öë‡ebØì~ì1ì9ì vûGÄ©âÌp‡+Ç5áÎâq¸y¼^ oƒ÷óñÙø|=¾ ?ŽŸ'Htv„`Ba3¡‚ÐB¸DxHxE$Õ‰ÖÄ"—¸‰XAàPð4Ð407°7ˆÔô&Ø9¸$øAˆnˆ0¤;T242´1t.Ì5¬4ld•ñªõ«®‡+„sÃ;#°¡ ³«ÝVï]=iY9´FgMÖš«kÖ&­=%ÅŒ:Ž‹nŠþÀôcÖ1gc¼bªcfX.¬}¬çlGv{ŠcÇ)åLÄÚÅ–ÆNÆÙÅ퉛Šwˆ/Ÿæºp+¹/<jæý$.$…%µ&ã’£“Oñdx‰¼ž•”¬”TƒÔ‚Ô‘4›´½i3|o~C:”¾&½S@ýLõ u…[…£öUo3C3OfIgñ²ú²õ³wdOä¸ç|½µŽµ®;W-wsîèz§õµ  1º7jlÌß8¾ÉcÓÑ͉̈́›È3É+Í{½%lKW¾rþ¦ü±­[› $ øÃÛl·ÕlGmçnïßa¾cÿŽO…ìÂkE&EåEŠYÅ×¾2ýªâ«…±;ûK,KîÂìâíÚí°ûh©tiNéØß=íeô²Â²×{£ö^-_V^³°O¸o¤Â§¢s¿æþ]û?TÆWÞ©r®j­VªÞQ=w€}`ð ãÁ–嚢š÷‡¸‡îÖzÔ¶×iוÆÎ8ü´>´¾÷kÆ× E ðŽŒ <ÚÓhÕØØ¤ÔTÒ 7 ›§ŽE»ùë7-†-µ­´Ö¢ãà¸ðø³o£¿:á}¢û$ãdËwZßU·QÚ Û¡öìö™ŽøŽ‘ÎðÎS+NuwÙvµ}oôý‘Ój§«ÎÈž)9K8›vá\ιÙó©ç§/Ä]ëŽê~pqÕÅÛ==ý—¼/]¹ì~ùb¯Sï¹+vWN_µ¹zêãZÇuËëí}}m?XüÐÖoÙß~ÃêFçMë›]ËÎ: ^¸åzëòm¯Û×לּ302tw8rxä.ûî佤{/ïgÜŸ°é!úaá#©Gå•×ý¨÷cëˆåÈ™Q×Ѿ'AOŒ±Æžÿ”þÓ‡ñü§ä§åª“f“§§Ü§n>[ýlüyêóù邟¥®~¡ûâ»_é›Y53þ’ÿrá×âWò¯Ž¼^öº{Ööñ›ä7ós…oåß}Çx×û>ìýÄ|æ쇊z»>yz¸¼°ð›÷„óû endstream endobj 214 0 obj <> endobj 435 0 obj <> endobj 436 0 obj <> endobj 438 0 obj <> stream xÚ|ºp&]·6ÛvîØ¶mÛ3ÑÛv2áÄv&¶mÛ¶mM8ùç}Î{Þï?ç«úª«V÷B¯¾öµVuõÞ½)H”ÕDLí’öv. ,ŒÌ¼1{W'K €™™‘™™‘‚BÌ häbio'näähM"®æVN '/3/3 €…‡‡ûo ¦‚«³‘ùß6N73â¿2‹[:M\ì<™þ;»µ½»÷T3K;S³¿SW“†¥£+PFüßQÿÓft°³3s°€Ž ‡‰€é_P÷tþãcù—ÝÈÎÔ×ÛÁÞ`fdã ôµ4þ=½Ü€'W ¯÷ÿßó?5D€©¥‰ Àhni‡øOz;3{ óÙÿèß>7 “ó_jÔÿ¦‹ð—,S{;O€)Ð ‘IÑÞÅÒ ³wðt²4·pP›Ðüå‹›‡þ_¬1ÿ#Yþ‘¬ÿH¶$ç?’ëÉ ø§B5Og ­3@ÆÎÄÞÉÁÞéo5L€ê¿2;TÎ@'·¿ÖÿBÒÕÆFÑÈöÿþÙZÚxþ?C´€ÿ_hjéjû¿½–Î’–@SeK—¿ùÁÿe–q1²±4±3·˜ÿˤag t²±´*Û;[þ«­ ¬¬ìÿ˧naibmtvü­ó¿\@;Óÿ ùoUþüŸ&úÇ,ñ—SK;s€šËß&0r2ýá·²‘å¿{…ùÿ¤ùGgù?º‚‘‹“¥@ùoEYþþ=þûÊðßHÿÝŽÿÕŠÿ¹UTÔÞÛóï˜Øyœl<nf6ßÿÜÄÕÉ hçòO#ýÕëf–)=€&pÌÊBÆqÝ­<¶Ÿ† Èe⻸. ?3TuevãEÅÚ{Ý]¬“CñÔ o”‰ßÊ¥ Í›je;Ë$ôæˆh7S7µÒ œFEaœ.g«Ô-‚ñQ&™æÛ¹fŒ"—UíB}o±ƒ³¿ÉE嚸>¤þÀ3é'–j@Pß–4R¾*¶¥ˆµóGø¨·@Hóñ # ÒQÚ Ø¢³¢ÓUñh`Š °é¦½Ì“.ÇÃÚŽzžïÚ¨ÝyS—ϲ öJg?’l¶ÈóPá2æÒv6h30.Ð.[ýý»’YŽ˜ù—B±ÙЫ¨³2$F©uç9(&KXá +Ûs,/¦üv±0Äsþã¤ÅIÄ ¬1Ç}×%‡f¤«žgi±þ8/Òïžó|–beY×oŸÑ횺•Õ±¬¸ÇÔñ) WWþX(9ùÖ¥Þu”—ˆ…ó±D“'ƒ;î/Â߱˨ß镤/‡-6›^ÖÓçQtÌmŸ›“pÔ°¶"SqzÀÛf€¹Ž–å£lòþJtNqWÅuõ§S{Ý=’ ÈJ^Ê·t\|#Üî&²\IQ)mV¬_•õöt›e5Y£+!´Xäyñ¤Béx‘8Â#?õr4˜ÙD,Pr"Úƒ¢›Ì¥6Ö ¥04^, 6®¿Ü[±5ldñƒ3gèçJ´tÒBce©sh±¦¸Hê¿D$Å~/ú–wðH”Œßì¶Íp“ê¸è£WdÄü¢7CDà&ÙÂ-g4 Ãæóù#;×ü¢-”ŸÃ¤-ûµ"¦KúÚ×@׺ÐK­÷gÀ$>v‰hU&Õ7òƒ~¨é¬VˆÂ>ú÷º,;šH7ŽPŸÓ£|%6óàÂx?cO¢+}Ä…cé"Ü¡žxê(Ñ´LPñ®eƒñV›Û¥aÞoÙZˆ´”ó¬“gŽáÁxV Š‘ä7´GȬæÈú,±×1Ä–°=zºáN1˜a¼%´ëæ%&Xèæ±èKÔq”«¦Ò ÒÊgc¬Ü$Ýž{Ÿ”³FbR¼fÏÊß_;Cfï·¶¶…Q#KÃ)âá†|¦1»Ì›fÌÚóÓv‰J5 ƶ•çà4^Øv‚ äËð¢Úͱ­ŒâÄíF-óŸRÁ§ð9Ë™„ð…#Æ”T*ýV~C°X¦Âvf€ÕÄ,&‡-\žbΞÙøù´ÌÔ¤íi³Xßð®É“C›×LT¿ûñq§¥V§Ëí7VÍc¿û3GŠ þ£çy{s]:±éÕ-ÝÌEü»Œ«D¡tú 8­&s®LSmüƒ2aõ)7yä­Z9â$YÜ´—-Âva‚³°îˆÞO±sy®ž@ŽŽû6—ÙDT.aÆmAyáØOìRá½äœŒ}m¯h¨Ê 9\lù4|ØüÜ ©^‰%;¿¯¨HF yÏ?à‘q¯È|®f£XÃÌwO¾'÷û=aŽÓÕìé¶Bìî{Q;Ã’"ŽÞXJYߤ‡{Q”ÊÛ¾‹Ë@A†j¥)n¶¤!~Íl­çì k•Éxu¸´æ€Iõ»•¿–]Z"²ô}& RËÑ .â¶Î׸™]çlœôx¬ºu—(Å¿½ôÖ¼s!Ì% ü1§9¡H;Ú’bƒÜô¹´Å¯“•⩯oñà‘íØ”¬FÛœy»–Ñ›ôÇPjë·–­3& Ä‹“tÿ9!œX%]`’ÅBD‘0“€¨ÂArâìð"js»õÓNŽ1MèqqºÎIþ.÷–¶ÔÄq_¬æ˜Â‰â˜óí~ÃMœÿzg¦‚—Ã’X- gçÒµµà­:‘J¢¾têF·Ñ’¶‚5ƘšîÒçßyëkêó‹úØ yjˆh/ -°OIšÉ⎪’á}è(Ÿ;‘¶ê‡Õ_*V™7´ÞÅ&ÅWÄqëKÖmÌ™æ"—cRÐêë„ÃÆ±7Ü\„C=ºD ¬§ö°Î›Ÿ#}BVcÌŽ@pÑæ‚ÝÿXz"P ìÊŽÀ:ÊLphìÛsVºÑ|ôæàæ}T6Ô¾9c• Cý_@cºÒ ÀïxòlÈ.¹}®xá9öFÁA3¢°õyŒÕ¿]!î¡;4PFF3¼$^±;Föü:™ô s{ø#y}§ŠE~éwCÿªï`õ¢êgcËð“­GÚ¨£c’€ŒÇê4™\ÂòGFvìΈ‡.>¼_JRаöÅBÌ× NÖrá|pý´OG…讑øƒsjõc•œ-§1Òiã-îni=AöÒÞyè) z‘§ñƒ6‘¡º“^w8‚• ‡„O™LØF*Ö\ßÝØöÕÞ:$ËMÓOÅí+ ý‰lôÉÊÜêœ y+;Ýf΂0|(«\-‡¥æg—Å’kcºoY4AGÔXן¤jÞIvÏa4R3…±QŸ ’¿@Sû@$zÌÄ:;æî\±Äp’³®æç†§óu9J9.[ ¦ÝÂÞÍiYPŸÀŒd¥Ϙ•CÖ!Ÿtˆ´¸Ä,e›Á¶7%n[˜ [ž^ ÚM¸Ùþx•´w#QÄ­~".šŒMMoÙÕc%Št•çZþàî>ÝAýàüSªè·"ÙnoVø¸¸ØØ ò7m,FÄ ”ý 1úüëÑ×¾è0ÞEBÖ¢Áç «±5šP£ÐùÄé8s øÌ/(‡< Šë÷ÈlI²În¾ØnjOK ß‹§\³7Éãó©B¬ËMÚçÖz˜}ñ¨8bÉC)ÿôÑkìsÍ>þ Ã£‚ÌD€£öZ Ô[£ùñ`vdÙRQ–Eâ~ZÓø<ÒØÜó’[’[$Ê}r!™ýÆîa•o¾vèøñóÏ:oPïÐxý2𑉘9L·3>—?×\Mt*<Û.kï¢ ,ãK65À»ÖáÂ9µ¡XD3#,»wKFŠEG:IöîI­™­~>\-MºsnA»oû³¼î¡«á`»_¿ñpÖ§® ÷Ѻ¥OÇ&HµmѼ§ü>|ƒ\ Ø|©¹\7¦œ ÌP(¿†,µžaà,Ò…vO»ˆ(¸ ÒKÄ3¥i ÃO𥉽öûæäp*Ðî½z¤¥ï~·ÀwIرNPJ³bóÚ—Í5¹àžj2ÜCnç3Þ1Æ"ZÊFoWý>…o#‘Ðga AB¯­L‚àŽ7¨7xL˜žòmW ”|{ûIþ0ThÜP‰ÙYñ3¸ÊƒSo*–™”ߺ‘½àWT­'µI&Ì»´ãöC‘ŽW b[wÞyzUW.v{{ƒÞá ¥B¦”'Y“Ž­{ÈV“7>Ð÷—éµCÌݦ #\ur®Û=2’äPYâÂüH•?9ò[©î¸DM;à¤*7˜y»FMõ_•{ 'ý§i1¿®ΞÍáÆ â`³ƦÍ{; ïD\m×âI6ŽÆ#ä”uݧÛ<¸FûvècSÆÝ{^ì‚­ª†)²#ÖÿÇ@mkOÐâa6¹/ÕFå·'ÖÎC/8Óƒ6þÝy&„‚‰•<òþª§”&̱^Ôt”·eØ{ôRnØõǤ¥º£?Ô'7žÒœ£6€= y®W,hŽWܰ²Öë†×ú.Ÿ“i8&mÄúË¡w¾[Wº¤ËœÇ%œZËÇç+º¸‘EKI͑Ӿj~G†aEx$ª«×¾ª}"ØJ’ÂA÷BëK …òŠ"~B¨Ì§èØÑCGsí±òa—8–ã%s‡ävtâ—ôFËGfŒ[ûÂEŒİc~Q¬ù±£¤,Ùu—e›"{ÊøÞJ¹tò ©Bá΋­gí¿¶ÓJéŽî==&«¶v¨§ž£a †­‡_8kT~¿>G(è3>áò™š ÊTTàOE!C“8e£¿Ò{ Å,ÚÔ}׬ú¸õ­@ [EqÄ%”á¼ dRm‰C¦q†¡"Çö\ Tqú—:^‹z.&Ñž”0›SÔòþ&³ñt9iòãµÿïwyV?¯¿¿ äÄ¿‚‹uà^P¾•®Dó°ˆ,ÁèIO6F.¥8§)¼+̆]ùËó4KYúåê´¢·€#뙾ˆ:oà݉Òw³{  ]+Ç–Ò·"a©rV' šåoeë?ÿ@–O1½ÆM µcÕ—Àõ”œoz5ƒo„û±4›«ò«ß¹o¯FÅÖ´`¤&ÖHº„3‡eÉE(ƒ5\/®í@î}íx;GÏm Ò£“ŸÕìî|a©· «h¯ëVEG ” ¨anÃÃ=+]ãàŠ;óMœÛÕGóú$§wQsÜÈl†/Ÿ,Í©°”íÝ'¿K2’ëFgšïÉ/¶ÄWU±‘H4gß‘ëƒi´û)’Ö´ìiW@ŸÄ¯ûòάÙ86õ²€Kû‘×)c²l¬ª·íÿL™TëaEžA6“÷⪣Ö8wO‡ƒœ…Q[þg<,¾g8±[.Õ¸‡e.£)×lº\’›••o«¬8¶ u¿Ycíàp-ôOÉÅ»™©jg/=Å·gZü«æ~€3E4Wù §‘2OŠÀÞ$ZÿÏxOŽW‡tð\ã­B¦ÓbüŸÓËÎav¤«‡oÑeeø£ÏX¥s.ȃèÇ9‘Eýürßoì/ZØu×(_ñ+Fû›87#µQTX=F*M’1¢²¦ ×ô¸åm~€ày,©ßI­&`a5ÛÌÇÖgK÷.T¨$_ïŒ=ÉùΈ^WywH³}!ê 'zÒP¿†™¢ò×ù·Æc¨Ã .ùjǧ}‘ëÆìzsaGįpá€GSèÚc«Y=™½î“þ’Š"Az¯;%»ÇcÒ‘ðàê4û¡¬F$žÛ5Clš) Œ-»À#×ll_—çsÖý«Ž¢K´Ô¸]@P¬;hH>e6âûïâªD[&‰—{{¤Ë6:¦Ë÷{œ¬6Â×/­ö¬t³À-,ùOíÄÀ2+ʤ¥N"Z"Xa{× êÖg×Ðjl+Oç¹ ú°Á13œ®ir©@ä}K‘Ñx&,ÉM5Í\êèH¿ u Š¢»çw²K†jÞ}£Ìv+%Ð9¨óÎæ×yX Çð ×xÎ[]¤°cßlØ:Ÿá$$NJ\÷mÕÇw4` Ý„§M ˆ uO˜¢,†à.uÝöÈfâIË,PQÑN°ú?šŒ;fÞ³N¿q­’sƒÀ7•j;ÿ /"„÷âå%¬xOC“ ìÃ3ú.&÷Éc”æÊ…Ý,ŒxõRX£[‹Uýý«¶²îÝ…B>èh“a•–%F^lE*jׄ£òHbåeÛ¤/¨8©†½¥È4*Î&Ô(­EàâAž<™kÎF³ƒ©Kî‹zñwÌZáÈ6GÆK{¡uò+ß™¡P=y¤¹tàôâ¶hW«-…0eR~·¡Çº­´e:…åYõÆjŠþáäbVµE.´=ÒdÈòÒÝ­E\'Cãæ÷(ǯóÜ!ô!cžÛÞ‹,ú¡È˜v*Zîk]†Ù‡yƒ¬¡Ú7RõÓÔÀ’~]ýÄŠjÅ›ÒF¸n‡“¨Œ˜‚2³„2ý*'·á\AÇ£’ŒÜ"6°£p 5¬Ä+|âŽïž3žŸ==å_^ #<Öfˆ0zßà{®ÏH.hõ¤?|Ñï–rOiAúÕ|JÿšIõñ*ì5Üœ(I·üèœeYð†ArDùœÇpÙvŤA »1¤Û#å#ò«×¸~Yk*ßTv‹9Òa²WÄfl.ÄWQ ¬ŸE°^𒦯­Î,hA­±Ìœå™`¿Ê¯‡ (û¤Á± ‹‘êfù=Ê´¶›H½ÌMJvc*)³ðŠzIh]Hˆb{ôï¹ÜøQr ;-(ø,¦ò9DNklÔ¯¦Ið¨å ð`ÔZ"šIê,‰¤° Söhœ¦€-ÔTõJ~ŠîŽLîŠP6MŽ#ÂküsZt·b6Ä—C?ÛMO«LÁ@ìÜ“©µÁ¸'ŽIÀÄ`eøAè°âºU³9à¤4¼©åC£>Ž'ùÕpÜ•ß8}ø®Ÿˆ‰"È™ÀÉöÉ”|‘†ì‘Ö3pÌP ÅBœyœ„Ìÿ[È Õ³¿·Ñ»õ©OtL …È™çhÄ=±'œîôcC*s!á]¦’‹ÜÁ°‹>>ˆ¬âu3ŒÓ}eãrÓ…ì ¢»BÑïUŠšDô>Tm§“Gd X‡ôìY9á²ê[^Ë .ÀßDŸDF?å.|A±°'–ýŒW êËKB#„¿®´$< ^å*×)uèi¢˜[S9§^+!ÖZº3U¯ƒ»ð« Kˆag-/‡:гoÎL+œÉd”ç-áŽNB#l@£ÆÔÍK„ÎìØ| ˜G*È! 1_ârˆZË…Å[|)%—¬d}9\Áiä•×&xâh6§ÌŒïš®©+Þ¼«^'T¦VL½ÑÁ7!®vŒ´'‹¦Ë¬û¿›Ë×ÜU-cý}Ó¢šâ—Ķ*y"zÆtrO˜œã̹%´Õ’0*–¨^›[&І P¬ZÔÚÜÚõ0œš¼™hë)¡y¿Èúl® _MÊêªZùÛèmÆž ¸KÖoMøÃmëi<ódDµdh}[VŸÂ”NAÓ.3$S”ßÖ6¸{hµjV¿Cnß´ˆ!ª9ÄÊ’r¦øÓúˆ=’èdØR¶{B¬»ß(aÃJgá¡ßžlÁ8®d´lÏäOÚxrôcA˜¸`×ãòeÔZ;:Á†ä]2WÑ÷P¿ CºÎƒD«‰Ü¨ùžßG·+ aÚzʃ“æŠZ…ò6ýÝڳçiBY~ b÷ß¹ÇV)4/'V,LˆºO*˃ñ†èàÚ5¤#³³Y¾ç$ChM £u åO-S±ÑnöÚ¤ f ÉíÈz=òt²’h/Ý¿V­Ëè[–æÎˆy1{è4Çjœ^ÌF@–ù¯Bž_îõŠœö‰÷“ëbH¸ÛöŠI:Bœí.ÖØ‚Õh*ìF“ùÔ3 `O /§%T¿Wy¡NWߌ§P¿lÌ~“- ”Nåf‚.à­ö ªÏÂÁH*Þ%–w«1¬?8ö÷…ö‘giB ˸PlýÜÉÿI®¿Æ0^h ¬Ï†5rB¢—ÕäúÚÐPcð¹Oá' õPƃiO±ú‹†j­ CžÙòö@ÍÈöŠýrS’«¼ÝŽË¢*ôª$xåÒ+Ö+&êÜp„l$ÝåÌYP¿#)‰~¬¹D®ù}[D«Õ˜gx¨ûçŽÍmgX v»EY`m*”Œ¦†(XˆÅà× ¶ÄâëÚ²¹…Zc½êpdwã,E4DV¾ÐœÄ]TLNRVü^€.«êqé&„P‘@¤W^ÚǹqÚæ&xY+ e­©·ºñ‹IÞ’8'’ øJß=ƒ«{¡xeîK³þY¥Ž¬ü†Ù¾¯5°Ô¥șn#ð4ù uÊÖ¶=kð§[¡NéuŒ…} Óü ˜§7·=½ÕŽâ8 µl~–àcaÃ…Ž¾Ê(…ê(¦ÇËa‘WúšÙA± +ð‡\PÀ áÊVÇÕ±ž)ý/apÿM—Šc -> `Ç}BìHòwù( îTY «û  ³1»‹ÂñŠÌFve8m–¼y°xrêçà#Núihªs¦v+‡ÙwhýaQMAvtƒ†BÂ¥|Ä£Š7é—Gﳉ1ãÃ=ùÚ•ŠàÙ¨ÔõS¯¥êF‘Ý.qÂûéÿ¬´@ßsm™—ê!<…Ú ݪ; ð« %®“zt4$˜WXÀºm5Æc-³GeFMeþͧ„/q^Ÿ &¤‚ßh„ï^ÿ4b6{u#z OÃ[)†"&¦¼ ÍÃ"  Aߦ}Ú“@ß?Ô+žÄøuñsá'›í!üísªQåÓŸÌÛðó{çY!RkÐ0V^¦³È"%ÉÔ³ö2в/oˆb;Þgê±fÁË÷H¥¸5¸Á“ÛÔÁMÀÕCºïOK,ꈼl3ìïI0žs}óÌ3”ÕaW`˜·î&øÌÂ,³ðòö’Ήd0ù+§uF 9³iš€b-ïn)ù° «ŠJÛ?©–©™œ\<‹Ë˜%’íËc$ƒœKQŠkæËÛ+_àØÒ|F$¸É3au¿ ëX…[TUvUt~~mØG–Ø®ë±,‚oïá=ˆ|@x=ÏÖ¬ÀÎ JnÁ¡EJí ¤B; y:îç÷úúB0ÐüæVÄç2¥Ž—Ôkj¯/´ ÷DÔ{îÀ-JD55J–VöƒÙsÈX .ÐÜ}Ðåî‘oâ®`Ø ª•…¶~ŠEPÜÒGÞ+i<°¬ ý.\˜m#sëxr%pÅþùfzô‚¬ s sùU^%îÚmc¦=Ê>ŒZ/ípæR=Èš[¾•Ô€eš¸¬¡]oK‹Þ_vðÐ…„vqÃ*[§ÓÚÏPxâªö:8éòÔ§X´Iþ½ž$W] û0v°-2Š>Š%”†š“\>ÉèLú}Sœ ñ²ãp×ÍÆ^l†$4m=–)ú<:=®'Ѽrñg?ÆìÅX; ÙØ‡Nôd«-HbÈMrbÿÔзö@{µ =)ã`©(## \ "¥Î„ŽS¤s…X)9&—ÂËÐå¬ÿˆ¤yiŽ\ðR/RkRõ³ò%TpP¢Uúq¯Ÿwâö–¸Væe”kNž ÿc#ûÖíÏl]ŸEƒ_R_ >`dàïN‡YÉÆþ+öæÉJÛF £käù¤+p~#[Ï—‚FþÝež™dM¸ž¼}gQL)ÔßL¿—΀IGÚß.Ø"÷ܤßn,~Ó¨ ò €wz˘Ä2;1­ÄW0˜Mnm¡(Ü.V½™À§‘e Ž) %€[CIf&´§èpÒj¸Ô¯ô›Äá&‹cYò†³â+-èÌ9(M3ß•mü˜üÙ;—Ç­Ãã5>Äëã¼uSqd¾îg¢ÀÃ’]”„£¢^ôÊÿ¼š8¾WrèeE°ã^^Oµr:CâË^Ísm‡‚.ªîÃ%0FCAwŠ“¸~Æ#]“ê'·´"Sž’é˜:8—“*Z:órWn I•ÄÍe1PÀY¾'Ë$*Tå 9Û®8¹‘âMÉ•±qÆà7ë0x»MÈË+RìÚתºbƒïbÍȶNHÞžéÆb¹,ÐÁ7E‚_H5ti«|{R0¦[KC—ì/È™ ;Ýë’€wð ÏÑʵoXÖÅw¨`eíœÇNq¸É%P—d[]âZZYsäg±‘)-¸eN-”¨‹ËPF7 2ÁÊgÉ‹ $Xå2×âÒ;±a' z‹‘aÓ‰#à¶ý§Ž“ƒ¨gŒÙÀîj/r+÷ð7èïS¡&© T[ùè‡0pd@^1båãáJuJݧN[ã…ÛÇv“nm “ 4I¯Q¼Ä`…|ׇ‹\ q vek•žÃ7XDPuíb=.õ&r¯R½Î½= è¸é4Bfü$‘vCVñâcBw²¯=Ú:UOÅÂO§~zî»>dtëŒ"ßUªHñm<¯œ •NæC blšÑ™Ú ­/¤*ÒeAC}»&,7I!Ÿé¨ûö¥ŒõÙì¤ HöÚsM,¨áEÅM3:pÁ¤½2 ê¼àЂ½û}¿… I¡ïg9¿BžId¥æ2õ*õ´«³¥³·–gTãÏU¸JÍÇZ•_`‡ç«}©Éøþ¼z[•¯UF½Ãyãøä”-#J‘!B0ÀxLñ¿ùÃär ÚÝ=ÄÀ9kG|m¤çfZûÒ<‰TH¥ˆ®­ï^4x…*­ S™d#`B’¦µbBí¤< ÓLð ß­Üñ èÔÎ%GW°1ùäá7N‘SÓP<ßgmèž@Üz‰Ò[b!jÕÇðIæV yÑWËÆ*™æ0­ÛÐÛÆnÛñJ?æÉG½+‚tu–™á6†ÐPCSÖmrùª¡åA./·"=>w4áýnþ÷o¿T„0I‹ØßšM“•©•ÙM‡Í-v:8ñŠ¡uv âvÒ¤ª¬ô»$¦¡J…ýe^uq‚Nìa×az‹ŽP!šž·}°Ú.üÐþÄ×ÜzøY§KÑŠ‘ád†[ÈùГTÜ!IÎÊ'cã£äâÙãÝQ¾bæ«´¥H,…:ö.W²=ݱŸ:"ìl··zç¥763").ƾß3Ü8@Gšôh&>˜FSÞÐ+Œ}Ñ"‡¶°„»Ø§£d™$Êdé¿´·!2bEõshŒÎ¼[-yMÖ÷MS w ™ÿtº\ÐEÚkÕ»%Q¬E´JÖ‹øܘ/õV‹Ò²cð¡Ø ôæJu"ŒL±óûó ¿»‚ìZÊüRFšbøñú³UùèË¡ŒÌ\èliFc‘³”ETš»'þ,õÑg Y¬TÙçÞ‰VôkN ­*âo‘Œú<î”*غcÞQŒ £é´/²©¡ü#ÛþuTcô¶ì®pÈŒTû˜*eµš{“ê^vGËuÂÎÜwwLéxŒyÔwœo!^«NååRŬ:ºî£ÈquN¤œÆ­`1s¢Ëp—eò›M¥ßò„¦¨›'úa!]ê(ç"ó…øä$ø¹Ÿßm5«çMå; ¦¢k2ñÙt»…$ý·,é2=B pA)5ÇÍrÉZ‘Uiéb°`¶˜GTø;ÔÚu˜5Ì ZÚ9uLó]™MØÊoš+Oº[h!ç˜.(÷/áÎa¿µ{ŸÿÏ¥A´ ïŒåa ÝŽCÿßss÷ Ã™jBÆ´Hª”<}ÃóP0{ÒÊŠ|(Óq0•¸è³[ÖE¾¯™qAÞr—`á2+†¨U•lbzpá°z`çÕ=löÑ1¯skWÂêt°“Gö¬½Ï?x-x±w&!ADÂòÜã£êQðãi—ç_wž„¨x‘Ì8µúÑk°Ñ*Ùí{RM¥$N0´oÐ,úRÕÑÍ Ìœ[ `ÍêÔOLäªA|ž¹ÍX¢beˆí0 > Ú Ï=²á˱æh×—}à‹C)D Ĥߑf¡Ì€P 9%îµòiÝ^H)PlzÝ)”‡–Ò—€=õ¨K‘Û‹AŸaU;ݶ(蜮¡¡<Ý' $Ä%ò–›H¦#Ì>æÚ¹ÑÍ)!l$ÕÔmP¶²ÞÓѪÙCʹ¦-‚/î|Ù]øõi¦­±ŒÞ.¹¾Xµ¤"<ñ!˜%ˆ¯¯ï&d±v¢ðØ£,ÔªNbCûëÖmS‰Ó¼ƒ.£e·—Áj$|7è|i–y) `ƒ¥ç»-‹Y5ú^_ÑìËò)±J„²éª¤{Šæ’j=¨Ch‘î‘+'y¦HßAá¾þf0’u&ìB…žéœÖG¤ ü^(3^‰§ÐÎ-±Øï{"ßL‚+²“0êCؘ-ÇÒÖïžËŠ“ l¿A}D ÞÈŽ †ëby³2Ål&2ÒáµCò•Ê3B;ýø2oÂæGÉW»p$>Dâ´%<¸ñc¢‚ºµë­ ‘Q4è@Èì ׂœk 94$Ém/##×jxWL{­q€Ÿ o³´ýùxÕêRj‘)Øä1ëÁ̽y šw¡›÷#ùªäc‹Vå7snxw’áåL=Tý:E7¢wd}`Rè“à$wNÀ1A¸j6ç…÷Æ!}N&×ÝiòÞߢ‰·6{è0ªÌýˆM!ÕöŽÞ ¢ØOLI¸¡ú®ÍñuX[G&&~¡fo¥»(¤U’y°UjãZ?k°W:®ò¶x£Î×7LxS¸˜ùuR‘gIÎÞÎvå¹9¸ºÉ­RÖyÑã»bk™{QÏ×ËÍIéZœ•NœjÞ‹—È-¬ôrR`åt.±9?‹ö8Æy³½ÂëøŠ'IPØ[LºÐkT6¤ƒûAœ¢IsKy¥.–!'[ÆÁ D”lì`5yZhÑx܇a” •„ÂÕ¯‚-ÂyåEÊWsì­cBBÏÌ-&ã_+[¾=&üXó¤uÒãÎåϪ)Ë04М3”3Y˜t&‘l_•>á S¢7Œ£•úûèP˜òqÚÌö™K‡ý´é¤mÖ»ìŠ!}TIØ¿Éu¨TÁœ3Öˆ/ï""fÚ–Y¡çõh$ ºqc8qɼ<ð'“)ýÙ/ÒÄ÷ËÛ@-¿ÃÃiPuvCIäÿ(h&>Q¤TØ£¼`ü!‰LŸdx÷¨ÏQ ®GÈ´mÿKGM58¯v¹«R%Øð·HBEÚƒ”MUîG=õËQ-bJPîa+DM›“Ö//k.΋Ow:·X’ʬ¶~y‹d’‹#;ú™ÿ#Ð6ªQ¥}jÃÝ`ÿ%ë)‰C[¶åÓ«W6òõ¾‰ÕhÐÊ%- 9áš9¶…ÁEš¶Í0c_FÆB-ð ÄíÑkéÚÎã“9ƒ%æv¬±¨Kè§tLPþA—b›Þ¢:Q¤#u« Ü‹ÑÈí7K¯¦É:1©Jü†eíV•+k?í½ÓB׆­Žä#müˆ ™§‡ó‰r„Þ "Íh…T ´ee­­+à$ ±‚f>5Q³ŠýÏ>™vU H•ˆY 7$U":&×éó½=‡dÝ`“iö‘À³Z@¤¦W·YD[Šô¼×7üõðRWþ¡žêNÖôVu%Z>óÓ¯©Nù‰™P0=ÞâhÝ×UIe5iK)™þ9R¹Deñ¾tNÎÖ¦ÙèØ ÌLoYËi¼KOT†Ö1èh-dèØ‘Û¨ïf„T/ Y>M›?á;V¸NÞ/ÇlÐÏÕBÖV^¥¾}>»§‹sÒ>³¸D…[? Z½½VÔâµÒ2i)D8u<äo?êÈÍyE6JërH`dY¿ÓÍF³,=fÞl¡R 1a)’p˜@‹gÏ|p#±d©Cþ™+Œ‘(¤!#V‡N¹V<¥y)…¯?RâÈÂâEV¬q=±=ÀøúàS°€Úc¤;0^ªs+õ ~…G²=„'鵈5XL‘å´Êâ›+ïœ):è&KÎ1ß²—|TbʸÉZ•$ó(þѬ8Ø»# ".Ó,/$?îÖ‚È™ÃQ ú\^@@M`s–h[H2ØxI7øèÕÍ]ek.);±l§íõ}€—¸ò1Ää7¼Å“ÍPv° ÓŽ­¸Š–`R0“@$»­xƒT#R‹Û×í΃Ÿîd-šÌ6ôGÙ€‹»ªÀLÊᪿB5HWÞjÔèÈÍŽ²h’–úoS¸Ò~«ÇGÖ²&:(OØ;8´Hæ•/Èóy«ƒµ·u¿ôf0Røj&?º½q³ ®é¤ù*aç,E̪¥ÿ³œ\ï*¹íh=ò’®÷}(­å×9iG¿¹uáá‚/ñ¾— ¢§Žfäat´]0ƨ0g÷¤ órB³*k@¥Çø’›UM÷°/_µ¸îp¡ÅOÿÆTÜ@U0Ô‘3èDÉ0½²Îi¬žúD Ò¿%‡-†›Ÿ„üèjgu5&ÔþVm?/âøÂÒ Žk<å!r~amg›.ØÐ2ŠûhPº_娫²ŽÈy'+—@²2ƒâ¹ñ€@Âà¥ý¹†ùàÀ–kŒ$6§«Þ•Áµ,õ?ëKrì½rƒ7*HÀ0ññ8Gɱ)ZcªöFÉÝÀÓY•Ehg§ä5Ü?¹—Í‹v_”TyˆfXë¹Èƒý'‚…c#J»~úwQ¼Ê}+¹~m†ÅØiUFHOyìVÌR5%¨Àç™®ý9RGÖ Üw_©ÓÃ_ª ]1P²Ù¯ ,UÔšôæ³fÙ|ÄÊê`)‰ô†Ü‘ç´É¨icFá†D….6¬–ž¯³™Z¾[ç¦âÏ`ÍkâüØ;»gÏv›M–'gØ’c\÷À¿æ%Ÿ z\k4»×®`ò%f`±X;¼yóAw•/LOù™‹4É9&Vdoíæ€…øjO„Ó›u€rV>ùÔè ?==—%4ú¹á?Cšî£®ýV²ƒb8O²%*0€³ÿññÛ_A¢yp#­ä—œ¬ÅæÀ\ˆý6)dY 9%…wzÜ+R\’CVåÞûRõÁ<ȹ¨'¦YÌ7ÆSîû_;‡û ?¦%â.Y½çÁ PÄtÀ8H‡›U¶â&ÔÂuÂÂ8#i‹äï‹(‚g4мpɆ£A&ýVR^+@òôÑCHT€VKs`¦•›ö.YÈrÏWÕÛ<à–yUÍò_/Øà¾Sò.hÑNXÑ9mò÷©h‚«¸ü¨VÖé‹mÝJ}U¹*@V­`n|ÆŽk»ï†2?7dgWn†ápóRr²ƒ²"ur¼ò7Îæœã3 /w¶°éº4\/C …ë04éeö9”£Âºâ’UÕÃú’tÁÅœ‡®«CÞë–=ÐÒ5O¤&§¦Zú§Îcé“:«n3_úBÏCcP(¡ç/žÜÃô&T—b¡=:tû|#a6u¥Ü7œJîFìÀ¸ûq6Œ+øðXcÿ-&¤¿™›û9ŒÅ`㞯8f<‡ÏRÌL©ï§§ØÃé5çu÷͵ÝDiŒ¡.oÌi9£±À¢4Ž-F€QgŠ6_ ±öШuW][ øˆ©$bYL.ÜÝgÄ}zfãV¦6#%‘ÙÞVW‹nxD ÅRʬ}“Vjã‰÷‡À!2Rœm.•ý{‰6e@žfÓruM ÕóͬlÂó³×¬€¬Ö%½´ë Då=aý%Æ–ãB@ÄmV2¦_§©¤b±á("ÂÖtæ ¼×õ7Ðâ:{$_)Hñ]AæìšŸ9Â{¦dSîû¹R”qwÈwVG£}ìÕuo«m‡«8‹øìBÐ`^k‹§@"† ¬£E”¦{gßÄ‹úî)P}`áÃÏðznBºµ7#üÔ‰9y×¹øczˆé™Ÿ¸3”òo–\M‹:²p9ü oþ÷?:”‹S“PV•!W wˆNzZˆCü …  O:AlÂ8IÀú'l0±öY’=nºVû°DZ8QÈ\ïÓÿˆfF®hì/Xßçjr mêÈôÙ š˜Œs¥Q…¹cn¨ºžsµï¹9ž*%9ÿ,ÁBŽÜjòþ™Ø¸Ð²³\›ŒÂ’§•(}f;ÊP Åóñ—7­l|‹jNYÏW&ÛPû©hÞ]ua ÅÛξ|]‘4ml½“,-¤4 X±`èyÄ”)65¤• )tÏzuk|R›yo}1'2=ŒÔÇ*ìVÂñÕÓKŽ_w««Þ°PÈ-£lÛÿAôì;þ²Œ¨QÖa¦+K§ÞÏžËTÆ£Ë5¥Þ)™8iY ~^ÌÏl}“BëõR¿÷¦ ¦ýë—ørJ¤ÒZ'›©¡t÷#=ôÒ@“’á²^È€ûzŽøÖ™1=ã™ »ºOaË–R *ّГ b%î’¤¤GÝY¼cÒúyéP¥0âjbJ|PiiØjˆŽ ûi‡uªŒ{PEB7ðO |÷Tƒke›hô7 :‡9œ›¤èÔÒ*=Õ2 £¶÷´núq}a÷PÿÚÜ!&E:jsv-Ü`ʰ^LÄEM nÝ4Äô(.K”™ô“»£‰i¸Hxìlu}C"ìÃÄétNŠKáÆÉÊéÕ}î vò šº§ûkì¹v ùwrÆš6ø»9ð—ÒdÍUÚ;çtŽ! –Mf’êZÁ‰zÊœ$Q­ ¯:.Žõ¾‡]¸ÎBYˆ“æÐ>w‹ÿlÕÞ¸ŸÊü·{Hq©uFõúõRilâK߀Þkæÿ2| /þñúç^i¶Ò£—ñëºV¦z¿ ç˜Bä…œ4T¹€'žÏØÉ-p¿"DÕ¹ïÎÚ¿²:Ö'\õÃ%˜¤º½wü‹Òï¸>«ºX'3Ò®–x^öá¼­>Äp€ë<¬ÚxuþâýÏ.ä”óáKÈ›ñn-yH‰ÙÙndâ>Š©1Ác¡Z)<÷¦·QQwVcMXQYw¦XöŒßƒµ6ú#ýp‡å‹0 Z}ë5ß¿’‚vi—4ÊVßPQžuå:õ©;R1ÞQŽk=.Ø×úÒR7Qaeú±S‰úÞ}cí>Åßï¢ŽŠ„¹maî ™ˆî8Ê’8L{·”V¶s3I©N5¹AùÜåé6åF)OU’ËÕï刳@ýÂH²¦NUFï=ýqÅëÇ[-fˆYÆyEÜY{ëËzWv“¢7ÀóJ(ŸVh6ûM"‡§F´^Õ=šXX¡·?$ÇfÕ _¦ Žj7­·¾1˜$Û³­=Eƒò‚ûÆ ‡™è!?ÛڗɘxÂÙû | ;ï.÷‡–ÇË4þ˜T}ùvÚ#–°j2FÆn’³ˆƒËiâñ6±>:ÑtL½S呿¨siXwG%ÆVÊ©ƒÇu&ÿïŒAå Ž—k r™‰Õ<*ãê_ë_§ÄòÑ,ÇÁ³‡&Èp‰3:ÜHÅóæuÒµ˜2±¨ÙòÓfç“ȃœÞüñÎËÃA+ã °1=XáSPûsä >ÅA°%K©­—¿ýA‚ÊQ bÁ®J¬ƒã“Hwo“ÅAí”2Ë6Ò«/!Z)AŽäŒÕw¬ÀÊj™I‡%F¼[~¢"¬óéÿ,^b„È+ÿyúóü~ÍŽóã;mƒŒ^ëÑ÷4Œö ²Q 3Q E$QêúÈ5X7÷Çè%-ô+ÖIÈ‹c c"%§D’µ¨¥úÎ$¤lñt„€—gSãq8zÛH [$×´\ésÝ.iܲ¡Œ³teœ×sXŽ4ÊüU¸ŠFi+ÝLÁŒì!?ëÀñOÊ‘þ¾>£¹+Tx›°0KÎ.vÉ«´à’y溲–îÍÒ°Îɘax…¶âÒ¡£J¿¹ÎãÙ­Éõ@X q<uR¸á¤©b¥RŽ4·ØEɺ°ïD¹².ÒH±#»:.y*9­‘“¼¿M·@ Úàc-=1<›o— W³&”ÀJä\Ù3Ô]RgB0`D+‡6¸9øÕˆ±°¾0O¬óYæ‰;~£@Ül•½†ÀdX.æÑæ­/õþ‹ž Ñn’ œp޾ã8ÂhɃ Ïгgÿl=TËõÌOž^?FD½–rbã7¶ã*ÑvŠý1R2îé$ÊuûÉ6߯où¤Q‚]P%ªIhë55UyÎ?°2á°ù8 “@¶Zª*k)‰ƒ[ŸŒ¸Î"TnÉI÷–z`5d'þ:´ jJ@…}j¥‰æoPñÝ‹%)¡'¬‰$Õ,ˆXŸ7zsëkùšMº¯(n„Òr–I¼tÔg%µV3+Åó£ŠÑ% +¸‰êGt”ñ€¬ÔSBo¼`g£$Ê÷0x—áÑ[¦¤{ýßý´ýyŒ”D_zÞ#þL9c{]1€ˆv§ÙHªOõ²Jo¦‰‹Ÿq!yЙõ¯C\;…û©ú¡® *ã†)Èq  Üë;(sñ¼&S4lHŠ…ú5Í’;„/G<’{¯Œ‹Ýgžôש¼jâl~IeæeëÛþÉÐ)ÌûÁ½µ×Õ°´È@Izt>ïܸzCR̽ ?&½¨»œ§î….²Ø«Ëlx¾+gÖ¨| ½Ñ¹ŒV #?î7ë’É$ˆø¼TŠ7M&&Ž¯ëªÆF(Bºm"gãBô³õßeWpœ ^þMö÷šªNN:ŒÊJ ž;q2ÏÅU'ìddÕ7òh>aü({P©ü¶çg×Ê€ì2fßMjW®ñR›0/èÏq"òÙŽ+É ²Ø@-;´Ò‰ÜŸŸƒ]Ûºêr¨*Ë V ÛÇž¢.ìTñ$âC¦m;ƒäk«ñ[|1¤Òg¾NúéÐK£å_Ï¥FO P µ‡eÙ½6’*Oÿ_ûæÙ ‡ÃhqQ£÷ÞÖêÑWôÕKôˆž,%Xìê²Dï½Ñ£ á/zYÝêuõNBt÷?sç~‚ûî™ç|€ß»3sÎÌ9á2µÎ•òÆí¸÷*^®‰_qàt÷|Ãjt‚“ ãm¥£;ÿw(mw~j§“Ëuôéã§ïÔÆ¢·¶©1£(Ü»7ƒñ¶¶,«LÃV5cgV’‹}Ô1Á±z ÀÉ¿—_\ë6/ó”ý”ì-â©#½Zvc¥þš¾èÔtµ³ Œbr‰FãqÀß$'|·_PÇûzŒØ”’Íœ’COR¤V:1õyß™§u2;îß× {À4íÙ#-Ù«Rˆ®¶Jq€%íÛÖ¨±\tàñ¤Ð9€KêžMÿ4ždܽ_öNý ‹-Y žyÞˆã¾ú^ª~|\ûy_6döôŽ^4’ƒU"!ˆÙB˰æÞRÇœÝ*aù²—úèrå HÿÇ×¶ï+|ˆ—·qŠr–Âh¾?Ôh&á>êQœ¡r™Á›+Ùkp€§êš®7—“˜Èùbüž¤}sˆOûÎF1ãØ1Ý®8Ž Š·Ã‘) ¦€RD'¹ÐD p´jVªÝ¥oVîýz³ÃP3yQ füûÍ£%µ¯õëÖnì[ù­çY‹Š`J†00Fê;ÊÎ'8\; wÃtÆØs>wõŒ6*Œ/z(hÊR •ZÄ<ƒÚ÷ÈqÛ‰Ék¼°Crc‹©­;î'èev5Ñ4`xkÿвáYá®Ép/ð?Áƒ<#»œƒy–°ê¿W'I§“â~M1¬;³~wœÀòü?¦Ž(šµ£\¢°Yú¶0K„›®Uy„hõ¤aJ¡sÌèŒUA ÕÜwÞ~+•#"öÁV”~6·éŸwumÕao¦œ1j¯¤ùH¯0óÝsÐÖw¬öü³v}D(Á%7³½£*íP³f¥Â¼­x ”%†”ߪ¬æKÄŽ5ªÿå¶5ÞfYVzœËÜ|ìß—bQñQœ_áOÈl×ä_›ÌšÌ]zuö¿b%$— ÉþvïÌy²°Ð©º Å— 3¶™4*Ü{UCt­$S™™šÿ0y…½i–£úÒ×ãÏ.’Ýa•+=)¶bŒZï9lNˆçê¾êɼû@=ßZÅïlX™]/ibØ]Ê¢B$t?1Q9·¯*­m_È¡¯qÝ öe:A'ãVIy«®-9{]DPïàW¬7?Eƒ~LÈ-„ß…&G•„Ä¿ï`V°8ôè‰ Lšé  6"*èDû½3Rg€*¶“c]µ±Feœp³)¿:Ó'3)Õô¢‡9°1îtçOîÝ›6àf}<îùS\ ÿƒÎtýÄÀ†¤/OÐ]‚!¾Hªm,øQJp^ÐI Éap&%Ɖ™?CHÙBûTy hvz®^§Á@‹[6· ¦¾u½¦ʉzäï{øZ‚§·P±VøiÉo ±+åŠXçLê ðÍæ©PécÀ¼ÇŠÎÑËÊŽEÝ»ë3ÄzþJq]V62[܇—K™zËfhVÇ€)¤Ò.k3Šz=¯õ &“tvwV•ÅU?û9ÛÖ;‰h)ª(ÑSǦ7óCÛ>œA›Ú—™¤’¥Ã·Ï"ëI-A’|øF2þãU€–Áð¶Àô¥Ó¬#®G{¯áŽÜ¦#o-Žˆ4†J>Š“nÆ@dÖü÷8«ÉJ#àsO;\—}UAºnJ×…6uYŸ½šö‚ßW]Âò…#d»Œ¬„òáƒæp5‰šm[õ³Þ;V™””üî þåün³Ei„d~¶M n‘uz­¾q=^zÞ$¢àñÍ“,ˆÁÜí-ÆÉk×hgª65 R·5Ðç,Ô¼6`oA6‹Ql•m=æ|ÊÀzi¡J=§ÙêíŒjB¡ª3¥¸¿K0FB! ‚óøÞB.npîh¬~­ÂwŸþµ&Yê8>3ü­Av¿@@ßÿ~B–„þèT…YÜæd ý6^UJÌ A¾H\bS;´ô ŸïŸ¶œÚ÷Ø”³üÀø,¢Á#Õ6ç3þø2WF¤ŽÁQ½k^Z·/:ùÁü†V{G7Ü]L<½â6æWòôT@ò;ÑÙÌôkË´ŒÔ‰ß£¬<ÜÏ-}}¾ß_ëƒkä!;–½°›ßÞ?wX]wàIžø¥¿WÉ"eª’Ú|`&m~C3r¶î¼°X S‚Þ–w«–Ój¡V” ßè¿s‰¯Ók^ÀL’CéêÖmîFã˜(‰Š™6NøyµzeûêÑizGA­(°AëPmývYoÑŒÙØâ¹û³·¨è¥+×PG«Xab!;_Ó>(îˆ\ó½\¦n©‹a| Êw¹Ð”úu¨¼ã¬žý·ÎcŸäç7‹ŠâçÓ‹Â×^óÔýeÍ/•sTwü#Ù”7;ëXH$%\}ÜÅ ÉŸ]·(xþá©ÈZ¸Å»Dš“ûÓ%kÊÀ|Qf…I:ÈÊg4Zâ¯óÎC‘AÝ OŠÐ-½úZŠW·”ɟȶîª8:1ŒŽš«aÜ[%8”í¸/Í­ã:Ì(¾Ç]ÜeS|½/ù@ãki2ÑÉqZ꜋ø^ïÈD^PsÅùuÜ7C#Pˆïk°CLk™ÆÓ°Ì¨k|ÓÙD¡aÔÑ©ìN»¥šG<¿ðm;ä6ñø4üUµÜáNlis.Öæœëø»KX¿D婱pÕ—‹šð?í*×¹|Tyéš2uݸc08h|ÍÀÛ-Ëöþ+Jt1ia7 ßy¹pFîÛþs^<ê»ßlsÞáj Z×.üôË!5>2à{KÝÅùB>í{a–n䦳.u0ß ~%m©ñ£Uç/°Ô‚¼ ½œ“n¤wˆë½.•Ê=qû9æx™êŠ}]-(kîy8«$Ò ¡Ðá›í§”wlÕ>ÂàÄíÃŽ…üpÿ·”}0¸tÙ®T’Ð5º5[nìÒX9î’š§UÉGŽØRç÷Øg1›–\³Û˜¥Š]þ‚I^^š‹š:…ißÄ1ûKˆ …ÊË6ܾF›JÄÈ5p/9$5±šg[æqw߀$ƒïÝ“\ó×S~?–ET†9«§È 2GíõKN0iíBº áìÎ!Â^K‘ü`1]ùVý”råUGÚB¤R#–.È]r9ǘz—÷äóϧxx9Ð[ÌŽœ†´@Émð„¢ô}j­Þ¶(¬Ð:2Eˆˆ@»ý&ÁÃáÄâ>듾5ÓU´«iÑIϹ éÀѦ·ûÑãïtÝ+?ã}ÒûJ¨u†c»Ußyû§+óm¡a&ïŸ “â¿Ã[Ø^½¥c»~þþƒpËêW|C×]‰º ´°yžß gŠDL†CÚy¥\Sª}©®@»J"ª‡%Ës²ç Õ™‚$H ´¼”[0ý‚¯IN$ì·î…¾f)7ÍGÇõ¨ÇMNÄCZ圸#ÏÍfò†ñnU[Œ”ö³ˆ‹ Ÿ,„˜XIù²ùánMÔ}gYLÁFåôѾøÓ{H»†MÿeŒï˼ª¼ wí&ÍjÕ}¬ÅZÎ0ou}ã±¾yfRjPeSˆ|ÂQ½i­WÏ –è;Yÿ+êÞ£>°œ“¸¹aƒçm“$Ýï&ž£´nÚ}\´ýŸ·‹J¦-0CÜF‰M Öª»r”/4¢Ÿ7ð—‹[_)R—1œ”[Ó)uyõ<šN–ÑÈ9¥ÉÙ\°ÀÙØägH´Ks{¶N•‰ÈÐÑÃÊ)7ü9<œžEÜ‚wl_/Ô¶2"d‚_dõL.¾æ¥dZž9F/¨ÛÂ5+ ’ª.²b^FÇ‘7Ý{ž­ƒ*ûÐ`¯‘geÿš§i´c±¦Â§‡`+•„¾0âSÅ2i¶"™f´‘··ÈiöÐuýC£°›M>û“†”€·-ȳ=)±S‹Þذךмš.\é†7b÷óÓÙ񫎣 ¿Ø6ºÖÐÇ—dæ8ÌØEèùêñf}@IöÑ]ce‘QÿœÙ߯(X#¨{++x£6–N)?*µz„±¸ó‚“êC1ĦåVž§ÎK0A¬Š´C}LÛ[ZÑÿ§ˆÿ ø¼…ÙÛzx¹»Úz¸ÿ1gÞ endstream endobj 439 0 obj 20021 endobj 440 0 obj 918 endobj 441 0 obj 19279 endobj 442 0 obj 531 endobj 437 0 obj <> stream xÚ]ÔÏŠÚPð}žâvQ˜.¬Ñûý™ËPm‡±}€˜ÜØ@MBŒ ß¾992….f<’ÄóãÈõã‡×Ãâ¹êŽi?çá-]ºëP¦Åî[ÑgËÝþ˾mư|ºòÆP7m5Üï ÇtjÚlµUSŽ÷wóÿò|øp»Œé¼oë.ÛlÂòmºx‡[x˜?eËC•†¦=…‡_»Ãôþpíû?éœÚ1äÙvªTO4Y¾ç–ÏÕ×®\L·þ»ðóÖ§°žß¯h(»*]ú¢LCÑžR¶Éómؼ¼l³ÔVÿ]óû#Ǻü] Ùf[ó|z™rdŽÈÌÈOÌOÈs\2—Ès…œ˜rÍ\O9²+¢+®˜WÈkæ52 †(Ì‚¬ÌŠl̆ìÌŽLs„9ÒaŽ´EØ„½‚^a¯ WØ+èö z…½‚^a¯ WØ+èö z…½‚^92‘¹•`+¡Gf·l%ÜJ°•r+ÅVJ³Â¬4+ÌJ³Â¬4+ÌJ³Â¬4+ÌJ³Â¬4+ÌJ³Â¬ü~߯ңð ƒÑ`0 ƒÑ`0 ƒÑ`0 ƒÑ`0 ƒq7ÃnÆÝ »w3ìfÜͰ›Ñip:wsìæ4;ÌN³Ãì4;ÌN³Ãì4;ÌN³Ãì4;ÌN³Ãì4;ÌÎݦºûéÂñÃÃûq.¯Ã0ôù×c>Ë8ÅM›Þ`ú®ÇSóß_G'P endstream endobj 443 0 obj 536 endobj 226 0 obj <> endobj 444 0 obj <> endobj 445 0 obj <> endobj 447 0 obj <> stream xÚíºctfÝÒ6ÛvîØ¶“ŽmwlÛ¶mÛ¶Nwб­Ž:N¾ÞÏ»ßï;û=çßùwÆYkŒZ«®ªY³æU5æš?‰’*ƒˆ™ƒ PÂÁÞ•…‘™ êàæltføæ`k`ffgdffF¤ u»Z9Ø‹»yš@3€ˆ›€•ÀÂÉËÁÂËÆ`áááþë¨!ïæblñׇ•…›ÀÆÃÂÂ…ø¯ðbVÎ@SWg/¦ÿ˜ÂÆÞÁÃÞç?1s+{3ó¿CfnŽ&u{+'7 ´Ø¿]ÿ³ºØÙ™9Ø@'ÐÓÔÀô¯ÉÔ¼ÿØXþ…Û›ùù8:8Ìm]€~VæÀ¿¢‹±;àêìôóù¿ZþSCda˜Y™ºL€Vöˆÿ„—¶7w°0ÿþ¯„þms:»ü% @ýoâhi3s°·õ˜Í™\­LjQG/g+ KWµ)Í_æ¸yèÿÅó?’åÉöäüGrý#¹ÿ”  êåâ ´sHÛ›:8;:8ÿ­ˆ# bk PùWL€ ÐèìþýŸóK¸ÙÚ*Ûý“Á?|þÅ÷ÿÍËØÎÊÖë?üþ§‹&ð¿²ÿnå"aå 4S²rý[±û_°´«±­•©ˆ½…-Àü_º½ÐÙÖʨäàbõ¯î0°²²ÿ›š¥•©=ÐÅÀÁú hoö?þ[’ÒýÏ6úÇ&þ—%3+{ €ªëß60v6ûßÀ?f%c«w óÿ‰õÎòtycWg+O€.óßš²üuü{ÿ÷›>à¿ÓýwCþW3þï¡ß¾9xú0psÿ];€“‡ ÀÍÂâ÷雺9;í]ÿ饿kûoÝÜê/Q@ 'ÐN_¿LìJGÌÖ˜Ɖn«#B$âŽ^;ñ?lä@Ìñì0&$a€œóÁy7G*¬GÏ0FuW¦ 4Í¢S×ý#* gù!˜ãaNùaD–šz'-Ø®å(^jN‘èÄû¸õŽÒ11”žÛˆYkó"dºj§³ä{ÁVâøh0Œ‰°ÛwP+Çû('mSô0.ŸŸdAùèe1Û}-é .+±H,.:¦XÊ‹ÌRýÂ8ýókÈkeÔ`u$ÜÈQ¸Â°lÔè-îØÆÏöÊÞUÇÏEŠð)L|ÖØþ{óêØPÁÞQOXÌ»P=b\çíæ¿æ¤¬C,Y–À‘UÄ·ò¨²Íâ©NIûÃ(z½vÁhÂà„oÁã7Þ‘‚`mÒOBë=Ѓ°<Žbxu×\ïo«½ëÑ+tÞÈtpÂÞ§8a7¹ÜÈ"Bb̲™E)Ôrx‹U>ܨr¼8ïBE'ض‚=Lhö-íV¾çƒfStë3$§°(çY†b×t„4 œ9”j!ÒŽLKâQ‘„ ÌÆHHä—HgÏXMU$ܱ~[uõ²M$;à¾7Y×›;ÈbLÈǽ\RÒ‹Ñ!·TI(WÔÕpÏWz6ăŽYœí î¾7î[ýÞ´öÒGºæÊHmÞ„j ç¬N{º¿öìwg¨ÑÊ11ªjÀ_™|lDË?4øq¼… .´vpå#ù¦ˆâ‰%](áÐDýÝ{!BwåÏ9믊CÒn_k£Í´Œ<ãÏ·›"§Î6ïq¯Fè=ý×Çí‹Æ 0?³-HëEÏ(rq5u}ëÛp /./”Hç©NŒEcW,YïÁQ›–¢aQëÂÿâz ,(ã°]éöâè‰ð1å»éezgäŠf|{N´{L×ÕE–_®t'lºÇ¥;Q£Ð|à_ßÎKú-vDd±ˆA‰Ø­¡q›‘"QZÆx‘8XÐbm÷3+…ôízÁ—z©–— Šyì½Ä‹Rñç÷ ºRj“u]?Ó<ãܯM°:ä°€P£ýçüÓßP•æ4Oíh=ÑÛîò¢øGs°N&Á ‹µÀ0r4!h©b²A;§J²Í{éVž""ޏ”ýá=vvÑv«JÆøN¤´ 6VLŒa¯\U“.°®Ù¿%;½]ÍKsOøZñ Ã×J æÛoH«ïëøÉ©GzÃd™ˆæQHÖ¿cFñÓõ˜…DhC9¥ê­GHQmç8dÎOg3Šr€Àû|­ð}¤ãy°ŠÁÙî“ß²6$æVRZÔ(„ñ¾qïñ¥w&&'ß*oóÃûˆ¾Ð£¾€·êœµFåQªæÞ , xô"?fh)Äe.]L7ëm©\'Œ/‘.jU=vÅÍ׎ϟ™”P¨Ðÿw~Ý5’´gÔHÅgÉÉFW#©;œ½SëãNèÏš 2%YÀœßì‚I~×ÓŽ‚ yyеÜO(Eãp§Ä ¬uj86¯ŠfJîJ%ï,u­úÚã‚ss¯æw¿Oáx\cÄý•ðHÌ?“× c¼Ä÷XÖ½§ÃC:ÿiÄÎ ,s¢à|Ä»g÷«…ù¤í»úgÉç ÏkòË-sÛ£Cu¾c§©œÂ¤É×èñÙ/Ü»›Ì^¾•´§Ô¸{–É=3o†Žigx?ºDÑè”Ããž±!A,ZLü» ÿÁ}­ǰÇ}/ -—¾ì… ÆzO‹JÇ…DZûfGfúsˉ¤þWÔ ý¬XQ·üê³nÛ늬߹ì‚Q„'s/†NÒιÚÝÎ/ë©lL;GõOé8g× DAÙWGQÝS&oõ“ þܪ3æ`yøò)_PÎ:ãÇi¦=‹öaõ©cð u=©h4DÆ–!5¼/v´â@"‹T„èÒ;›?'­‡%Ðàê ¬_¥§ýäŠÍSÒ0Ÿ¾Y— Vß«wEþ¶í¨¹?f›`Oë"›?Sg´$[-s ×4…Íèb¯¹Õ`÷W1±$b¬K“ô gZ·Ú!Ÿ|N…Å«ƒ¨Õ¥Ì¼/މsØ#2.QjÛy=Øã¬ù•ÍÓÙJ.T褷>>æê5ö’-esnô5ƒ›ÖÉRmní¡zrG~¿´ ûÓ!× Î…ý7$[ ~†oávGȸ )ÝþGæ_…õÅhªH…fÐzÅ8.Òõ>¶æ 5°¯R¹çÔVõ˜¯{||"vŠÇ ±î3"ds#â‚?0÷ðÅ#<¬.)Þl)*³B– @£0…ÄL omôeãÀ@‹?,E«NÁëMsà]püu»3P´äûã%V®èÄ Å¶AòvåøSµ²ô·æî¦N†K/JkƒÄ…êeãh×vñ’Â.N;ô’ð$¿©@h4fcû馤ª(ß:aȯ}€ßŽxq) { ïQI¿®Ï¦pFäš39Ò³ Ö¼ü!N£}³N¤`¿±²¤` œj9uÙï•`t`ü´nȺ´DÀ¤ ”ÜÙ6„µŽ7BH,¡ Œì­IiÌõ³HÚ>¨h› ¹mð’¢ã¸8DúÝÉ9Åý¼w-dÈ2çsUêq·¾$â¬v{úBà?1£.Ó‚Ði»L¬¿Ž–ó©ü(YO!úÝ âý0Ëud¡ ø¶u/¢EÔh1×{ðCI&xè½j‰3WÃl³¿¬~ª±ÄqLq ‹!Êïô‡íùNÞ{›¯?}’eóY`˜µF=¦•KÒ Ú:ñRÇ“¿G}.nÊZ_ó×§:®È¨ˆ:³“Ëk OØ&6+4D•vaòdÿŸ)ý‰Ü©(* >á Xðr¼¦ 6q–ºMm*§SãÕ̆WPzo-¡ª,|²RO uæ¾k•·êÄïtäÏ”~2ƒ ãØþ¡ëÇ4 Ì/Ò•óMÎo¹ˆžh.,ùU¾!ZRdï}¡d­Ð¨¯dw)F#xz©xù,`e'­W‰š31ÐÆX€ë"rÎ ÿë¶Ëá´ŠüŽ:»nK¢**ÇfÃÆ£_:NÈ!iæÈ&+öë¶§ßîKõÎNŒ§_ðödÃÐ9,ÂOB®hüœë5ÞncÀ£6¾Òù\Y‰!!°êÔýkª1‡Éläé—\ÕðsUô‚£êT;ê3Ì;zy~Nº3ø”³,ÞuŒ•‘ÂFÐsãõW™fÁL4*2²Ó¼ÖýÂÍÍô!Æò ©ùØ»õoðë‹õâšÑo(3àSÏ'‰ÇlóÌÑóÙ˜¢èk¹š›ßOQƒJ<#ü×/€?‰“™¬:Ø&ÎgmàÍ"<ÌiØöÇqްNÉ›ÆÍ)xâhÑØ¯ñ‰/l^‡mp²°µÑ¾*XÝjexðLY¨æ¬‹Œ·“ÓöÁ}š;,¸?p Xëï‘=mË>Ø™Moõ¹‹À\ñ)ºµæ"Öyÿ¼:Ÿ‡Âü±ÐʲŠoÁüÑ­Ïï/Ã`„n>è`ö„lLlË{»H9 ôž(‘á’Â2›ƒ¯¡™¬Ojõ:•ž¢ïÉX…ö½þÙNWº!¦É¥ÊŠŠ·<ü¼ÚƒN!;öç+ýueÊ4FTß4AÈc\c¶#·kŒž´¹GuÍlØ÷³ bDaqc6Píó÷äœõSõ99ÄxI ¿•u<ðZ5øC£ƒ¿SÄø»3ûMdfþÖt옲}© oNœ˜oðšµ]&¦:ÞŽîžc8pPOššR^¹è®ìÄrwbqb ßúó¬2sͪѼÜá _™Þbj£¡û]„»gDáy®Ò•xÀˆ¡Áܲ†? NúA¥áÚ±«HEÑ.]‰¥–|¹ýI>¦“H!Âäƒ2¤MLW˜\öC ©MlõÕÂï5ñ ýìvSiê4üar]yõßÉä ]šÏg­od‘,Ëy¥gËsƒLˆôHz?*vç:×Ôôa.Ì ö——€IwîÖ"rèÒÓ‚ßР Úx‡^´|™oÌ=‰ ‚|áÌìªËO\âbÇ­èïBÊG%Ì[âC?`û 3ùÞ”òo»H`»!оbT"—'\L¦zjð~J‹„-/–‹\;'ÝÏVC®:ÄcD×gr–¥±\b‰ÿÌR÷# »Ï€»r…ð!äÚW¼^*5Ï|IÜ–’uî'2ÙþÉÍ|8™ûì¼uã ùN«ìË…Žî WWºÓ±H%ôazyÖ )ñd§cì=¿uÀN:qwóE?}%wHÿU´bž.¿; ›Ý·"Ò²ÏWO”Μ/LîÅMócY ê«w] ‰ÊûºcÄÊ0-^ òDýÙ[ùö“ ÓŒÂùžbAûo3l¨FAxÔçZ^¡‘ 仞ÖÚŽýâvš9M$xºøÔCñ›íxôKq.Åþ¼æ'“HVÊáÈÜ£ôpIíÛjgÚùtîÜÐň>M²œ2cUGu¶z‰ žÙ‘9bFp°²ÜwbúcޝEßZX‘-lNzôz$ך¬1wùœ¼‹ígÈ%VBËp†˜¤cì,ÙØ òðªá¦ý[1¿'æ"֯«03l³ZÁ®?Ü¡í«‰ó®÷c¼ÝGVéõãÂN #K­ãcCùp* »*2î}Òµ¬H¦zÛï/Ñ´®¤¡¢)rRö+2Ñ\F âbñ]M¥Ê ÔŽy9k÷ÅØ#§"Éq4M­êxrƒ)U¸|Û€°¸œ ³„ûmšVâ{¿ò50Ói‚bé‰Î_ÑÂc±Ñxê˜uºG¦¬è&ï-’dNÿS 9"•<›ŒÑ Ùã:q6G¯q^Bœ‹'®QÍU¨ô²ù§sU)†‘ ƒEDZöì­Ê€ßöYdå—ͱùqÌ‘XK´@ŠÒ$-žÛ„Ðéb¨‡’¥d{u®k_7µ@ž­ZPÑuBºDoï¶X$2ú7þ­¨ºbMÜz©Š: ÉÝó—ú` >¢´¦;߆Û]óËžMÌ "$ä¼®o½-ùƒô ©Þ œë‰#3Ÿè×K§åƒó:>ÔZG™T®è»»#€Aö<²ce;w@¦¢\Y¿ÉÛHç™ëühã|PÁ9è ØùÜ…qËMHïOÓákíê1øƒÛr{k[ d´d+üÌÌ2û‰üKg•´¶ú¨cüÎj A³$Œ-u~YG*-Cï¿Ú\;­™D2M?¼¢kå,B|‡Àü¨‹Pé„L‹F€ô¼þTíâaÊn˜¯Â sÙQeü†:™Y{ßXóÍÀ“Ò'‚í¡¢–JÀ1Aï@¸Bì#­Æ)]mY¶‰Km>E! ‡pÔäó9?šSe½õ ¡zÍ1«ªŸø”¨âmñ$™+`桲ƽº˜}©Cí¦ÕùÅ´|Ìœ†x0‘k¤Ñ%rhŒõÉo™dã…*ÎWckq-:D lñ/5<0½{b•D¹,Èmň“ÞÏ]¾Eº*ZkþÄšTíJVý£‡>]-Œ¥¢³+­g+»ò馨êhödußÕ£BŸøá{Õ=Õ%a²0ñëåd©c×…®-¶vªÿ«¢sG § _l§sa÷ú"4heej¢qø‡bý&•sŽlt ü‹å¾¤L¸; œy½~ò¥å!µ”ÿ>tÎÇÅ~{óü”)t¥½W5ņ±D"—ÞTÏÁ7™IËÆ y©ævP¿²(W‚p…÷ RDVtUýHŠx+åu+[2œìŸ Ÿå9ógä€7Ý ˆÖi£¶q‘‹-LA½Ì`MÖ2nýºïÿ~6ó²¯%„*[»œ(f:Ïs… /¨6ÔU$uj5Ñ߄Ů'›BÂf_ö@òçlB{¾©ÉÖ¯;ÃHßò1Û£-ŸB‚¸®VüÀõÜMàlW¿ t¸ÑF’Jꆈ/b4Îs³CÃ<¯* y0]3“ mͦ¢#XË/ÙÄy7|‡àù•nIò&‹ûFü((Î(}ã³§k¿Ãë«èg2í‡n¡ÛW&Ûo¿¼]¦ãöGF¶{Ýq°é¢e™5Tûú ùýaÙ¸¸‹ùèzÊ÷Œã¡Óî«´µ]~ÜjË $ÆRþÔ+ö²¾ƒ`äÓߣÐÐ…°ñ¸MŠŠàß ×I€¤'§0oüŸ¨J¸ñw,øëŽ ¿0«_El‹„usòi½(ãh:^ë ²Úãk‚J¼d°p‡¢EKäpÒ5݃$öèñ„ëÔ«%Üñ<ß÷Ù*ò®è;Yp.Éžíð…5Z¼µ3ócãáœE¡X²À=k| 1äŽ>àÑO+7Û1$ÈWÞÍGâ&‚]@6}~Yȃ¿Ä0ø3lÿÐ4ÈÉþá¼ iÞ°°Mã}qD„Ï©ñóøËp(Ø¥†Mô—­ü×f°»¹Üö0¼‰Ô[G…@DÃë›çxvuãñѧi ¸Ðl9ŸÝ—þ¬¶•Ggó9Îø/6/âL‡Ø%û€ †ÓæDŠºÂõ °ˆr>R¾=°Ÿêôà†2ÉÄ¿³aj‘´³ ¥à°v˜õD2Ö{Ú$­ûEƒÜÖ>Ý^ Dê¦bJ­_ê†S [ü¶ì焚ä»]±¾R9óTóQX±TB‚P<p AáUHÉžÛ¡Š3Û<_ÛÎ[`aâIèndzñîið&‰©ñOG[pJ´A¤ð ìÓbá+¹ž§(zÇ¥D½CîòŽ­Äo FîZ¤´|>æ!CpÙ¢’È5Û¾3jɵ‡¿þÙ·Ë¥e¦RôZ(p)G2Ëv-ůJ1ÝòcªV§u_b/úSÏÐÌRî é?JHŽb ÅûʧV|Џ»ö„Ë4>K|à}QôÑ_pÂ\Ã,¯cé#*ÿ;Ž^—#è×í]×›§È(üøž£2³ÀF|¬ ¾pÜs*é¾\µÇY¯qǦ™)¡­æa£î˜íŸu>vhQ 6z¤œö«…ñýíHFõLóýÝkÑÅôKŒˆ…Òã:ט¹¿`ØÃ;Û¼ò…gj!•è™4ŒK0p¹ýXÂh¨9IÀuøM)û¾è¼å¥Qöâ ò_#Ìü\\3ܦlÆEÏÙ‹Nx M…¿÷45Ûk1¢,ƒ»$TŸì7ŸÔ:)àFÔ év›ò.N"è¤yqâwÇÅ-g²¤n'UCXæõ/5lé¹ÂJù6¨Uúëv.˜êþ˜o £È/t»-+€Q»ÿf$£à´û®·¸Ôá•IÞV‹öJ³ŠzO½èɃÇ>Å _š£ÔÁ’ÛÖD{7;ø+f‰ðÏ ùxt9¥»Î'вB-eŒôq¾¦¶OžùÒ9²Ñ[¹š$`~É´ÓUye4ä¢~´¶GÒhCRìîÝ5í´ñæ…hÓ#FÍ©§R”ó½ÁBÙÒGø +9NÝσjŒp‘|ƒ#™ä”‘ %ˆàÁíÂæW£•§ßÆ’–WP—¿;œˆÅw‘Ý Ë%LäãİÃʨl´EÌ}ÑÂ͸h!"|Šw§–‹¾ò>¬”5ÂæQ**§©°ß?zXüßÚÙWxîЧŒ•VýÅj —'Þ0C7…A)Ú©”ÀOÙŽÅ€m “˜×½¦èaö Xí7*ÈšÙSǦ–d­p–O†Þ.QH6p{J욺¯Èí.¯r<¡|AæJ?Ÿ1¼8ï-¾Ø‰2‰çëÆ­ÄîPTâšC㵪dЇ#©^uÞÕžýòg¼ëi!n|ahÌ«â8\\Øä"¦iŸ¥³^'U¹?§›… ¡³Ññ.4D`‘&´ëGmŒ†ÄSmõ„ÆÅ­±[N)$NO SYwwæó‡›§ˆ3=¿3*îÎΨ¤\ Êz4Ç€ƒ¶4·ÇÀʶ”€4þ&7å#ÿ=¹cÎ&krÉþ·ï}’Ùò…W²œ2ßNØ£$ý…x÷^BIl†m)oi¿K tc 4ÞˆüÉ~÷RÄx䡆ŒOè`¾Ó>óÄL{téE§¹ßŽÑu¹º S'b“E°(Õ^ù;—ñ%‚úà RWjŸ°Ù,yL3`¤·Á3Ú¨°%Û¯¬w¡Ÿ?ŽYÄk~ˆpC…>¼߈ê(‘,&¨'Å P_THÑÖEÉÉ_ä†lûâ¯>>鱯‹£îõmù‘>£gv·Åç‹fÑZüwöDéÚ¿—Ÿzè… ܰ'lµB£ßöº0å_—”‹ Ð.ÆŸŒWø–2‹«–Ú7S•Ê*a ;ÄßIe{ðJ·Õ2êóøX–#d‰ÛJÇâ€mbWò?JAËn*4ÛÝuWU¤‘¤:ÇII†ïw¢Ú±¬×ÐÚn ž1äûÜ™)¸ÄzOÒ ѵ¬wÕ“ŸÿÂŽ2®°–Ž~Ý Â„ ÉÁ÷‰4E7õÍjZ#å¸*%˜l¦KLOKð3>{z¬nû"«R~„Ž­[q¿y.k7úØlZ5UYØ9ÿ|°ßÛÈÚdŸ%¢ó'Ù㾨¬åwitÿ,MVâ2™ôë}Ÿ %MR`Á«‚á$¶år1`aO7†½ËžM4>&ØävÖ eÌ»½”h\ÖQ¦Iï°°ÿ¨‚Ž~RɽWQ HËHßÝÔ•AÌÈÛ7:³_ÑtJêdl }Ë™ŒóÍ1¯òi°mží‘qEºÆ¾Â„£‚–ˆÊÉk—¦ÿßIy4Æî°`e ”ˆÐ¦Ú'÷¶¥È4ìi—6œíÝ´C÷G¦,FÁjðW»dÅJÓÎaÏÞô;<æ¾:j¥K­ZÈ ½°ô$,ñœÍ0†A:þÖÅϪÂ\!¼ŠNˆ*cS×Ã>ÉÀƒuvÛÒHÿñÀÚü^(šGšÊ.úôýú01Öo”š´—å~Ëš1|ºù Y께:R?æ3zû½P!ÈïùÓ? _ËÔßúÚøûè7Ù&²' c#¾öIªGù“`:娒áË>:ì]r%¥·æÆö±§÷r|ê0ÞZ’u!í2/2²-eëvºâ[FÚ6XÊÎwÅLù&BòËM«Ù|j[+#”\ñ«G…Û1Œ@„júu\`+X…Ÿ’ >ÄóÅ›ÐlÍ;Qv']­óà-ŒÃ£#¶¹\¬ö£ß9òC9M~¢ÒŒßnÐÛm$^Û›«Q3T´µá)–ê” ×,ı{½‘G†Íëþr‚®L¨£Hô˜»+°bDÓ¦,Cé¯>«¿w꣭'¬‰žÕS„Êqo+ÔM‘è^˜H”d ‹Sg[(ŽÚþ´ ˜¾ä§‡ˆÈyc5"Å¥ÆcöÌÌ19áýÐG«V|o†³ÏWá=#,7û³u$ØQ\˜—psEÐpžq„ÕÍØ±bI'õŸ îH¤<’ {¼W\+eߘ¤Ï¹5(Ž5†°Ow«G§‹ÌÉTûœ&×Èx¶%!óÛõ©`áI>.D${Ëmh…ëê–V ‰ù²ƒ¿z »¿úâÏ ^ =Sç²Uþ æ;ÑÔ³Þ6,µY2RÓÀqj·ÎÿÎÈÃɛթo¾².Cø¥ô}’O…rô§óÝSüÀ $³øˆ:pl·ÎEŧ¶dh£©JÊäÝ{{ìnÉ™BÄ­^í È•·ÙÀDâ.Øzº±QÛoðÁˆ+q7ƒŽŽ^¦“qÚ²ÉKôË-'ʺ ØOZMý~ €‹z½Îé"<7#³Zd½(i[=§Gùª;MZÍšTâYh³Ï)cj>ɾ†1#öÖ:ªx,qáO­uÒ~ÀËéGDÚ73 QªUÑÔ)ït|ec·¦x¹é3“D†U\á’b£ê£$‹ÔÝ@òÚ3 ö—mu¡Qñbéœoe¯Ó¿¿ö—RŒ#«vœÙ iòœÉÄÀÇÞšDÈ·þ[c¼±QM'tž¹‰§¢è9qDíä¨(J¡p.9u«Òqtiå%£]úÖvVkX”Ø,4´jôì¥ý“´ÚÓfÇ Â||+‚AI ©·µÖSb0FLJŽ*uΤUÖŸ¿öi ¶2\¨ñ€ B ?ˆT´îŠal·ì…EêF$ÇkU+lwüdЈ™»f+©Z<‘ºæësP°%AŸÞwð'+ ÁÔR˜ÌIªË©W¨_‡l×»R@7(¶ý?ëd>Hkb§b,µÁIÏj"æqŒÓåi©¶xFEy%Q“ah9nÑçœÞ~_œ°‚'=  ‰0BÞ‡AI†/üiQ·MÅÆ$®be(¼®§@‡S·Þ†—RÎ(µ(Œ{µÒ†¨ù8œ“TèªMŠnxŽÔñ‹þ¸á‹ßgT(ØÂ{?è·ä“ð{¡d8<; E¿%4ɾ<Ðzœ)Žj4î²êé©už’þBP:ó ²êÏñ@ñ•¥Ú«Ú(~XE®þÉÒYÉà(ϳÄ.¯»ë6ÚôÑŒŒ qB!n8ø½Ä½ÇÁÓîªknÏÀ¯sôôOHë6‰ÉiZ¹£2¢R`·è§Æ'ÚÓOBL°`<öÑÏß]tyOËwa¶éCÌrôÆ?V1S›-qvÕ¨V¿ËàódNóâ”è×Ïk ¸Òuâh}è t¦úü.â…äo”)„ø(ÙŸ·é 0ÒáF¯Ü­Q‰¼† #ðX–YõœY_XxM¥A4¦z²ê7qHgþMêS9i*8µÍÇ~äO:RT´a@¼/2‘b&ØzÏ&øm´Ÿ)§¶Oº mw‡ÇïÙŽ²Æ8…• éå—ñ ×>gzFˆÌÈ9ß±)Y\4˜éoFf çLT¾)Î~ àG85T™‡2•¹ô‹õÚ­%VMF•ç‚‹ø©1iÙS”NB¯“sÛŒ¼xú,“¸„Žiïz p·Ž—Õ8¿” <)fH®;|©MR]%¾ËDdÙµæ^¶FÁj+MÜ^3¹ÔýŽ&Tbðpö1xWjÚ`V>­7¨ðàd³½íI¡ž­ŒÏ;o¢ìO욉"\àû¼“]nrý½Šü[†Î‘$Ò¦1’½[ÓˆþsÇþèºw{ ‰ÜK$¸šorÄPôLÕ®þn˜ŒÙ éàáü݉ìgf< ×huWQä¼Hw2½êmònÛ×ÊÓ¹'Öî‰ÃŒÜ³£€xïðˆ¥wRšsdNÅ*ü^FCR_Sœr[laÕ2dÕÚ^5C–Y)LÁ»ö \F¦4œ^³@ÄOskx¹:{8Åw>5Œ¯âqµlX§Ü`rÛ€,&ÃnƵòù@DKËÀÈ%{>QSqò¹JèïÞš.2DÝAߘñoóÑ/P¬ù…GI±nwU]Äx+âQ”ß¼’%ÐÇ£·}ÉqôýhBk‹Ò†>K§ØØi v5 ¡ndõ©zÔo‡ç6nÚÀQšW<>\ʉ¸êìaü:j‰Ç×´¯¿SQ °Ä¦aI¹T—°ÀÖØ¨èñ@ôà¯Ï¬™øj@Rñ«³ 0éۄ/ £¹láR&Ùø/éö¥¸Ñ4ÆP uKBF¥Ñ,q2Õ7­‹=1“ŠUK‚òK¡J&KãgÞç)ÿƒÆï4^ÌáT>ïW~“5™€Nâûôà"ªØ˜ËùpãhÖ†*”ºŸÀMô-#fIWÚá0.ð•ʈÔâ˜Ya챫û@G78«ó²Kú<òû$w-¸¥¼¶€ðÒ2*Ú»¸{‚™·×Ž”Ö#Ï>E1âa"›ÙëUáeêê5ê3K —Xä{Þ*‹«•£‚Šñ´úÓΑàö¶{~®Zru­mŠ„«-Ø€\ðØYIÞž=Z*°$g® ÐÛatð9[Ïiß=$YÆŠS„fÏ«@EËGYhhÿ^I-ûz›2!Á*ÿ-Ík-Œ?š¯ÃŒ;3Ø•ç´Çë I7Üw®§?äMÛ¯ŸsÄ#;ý<8{ø @~É1c]@ïCóNï¥i’+ãðp·¾ñA£GÒæÅ‡ÆõU>qvQÝâ(3‰saêçÓ}¹—»uE›‘ë¡Rr›k¥8ʤÞc/—äVÙK„¡Ô=2×äÍҸغÆÌK®VwúÛ}ÿÞñ®ÜjÅ7VÎd`!a>ߦñÞÚ‘“r:ü÷ÐýC{¼@Õ9Ö&¸ Çãׯ8œŅ̃‘g„*,«ðZçÅŸø7Š·÷ªˆ%hžÀ©[ÑýK±oÜÞ*¡$†¿ÊRc¿ÕCtþH"Ù.I¥Æ}–3žƒkLÉV}ÀÜà#ªG—Zü$uQ®Æ!âɯ¡hã¦toœ)PLÀ<:Zýj \ʼnû ¿ª5^½˜rÚ§¥š‹µns²h]ĨÓÑ=>¨´!&Êÿ*¿uÁí‘ûn'Ŭ² ­¼³’ ª:Ûs¢ÀdZn1OÚ¯{^~NÜâ]¤Öh)Ì1p™ºeüc+#7×=ëkÔ§ºBÓʦɤJM«ð{UÝI8"<Ï‚·×€à´ƒÂîOÍ A…‚œô2fÎMžåÝ[ÿZþâbÌš¢aî;—ê¢å…óÛÞ#^˜°r”âÒÉlÃʧ!g¤ ÅÖ»ëݽF7èÞ·ùÚÉLVÔVl6{ÚWªKÒó †.…L¹ß#û‡‰–å)­¬6Äþý+hcý©ŠÐæ ¬‰;b1»¾å ´bt?3<°0øFf› àðg#ñ˜MÏV;”$.Ž5p'o•á^ôº••%ÍF«0˜õtÑi¥µ+‘ZT­5â·º4”†úÈ(:S¡ öýèe-æ'“ø¤ceç.1ÅK}{=‘U^éQΔ'çÞéïó£X…»]7^µÚ{C.xt®Rx“ÝÆg¶.è|”SËj ÎZß:³-.5Gÿ“¾êx^ô’ˆ‘-H*n¶+mЇ!ŒÙÆØó0çé"ŶþFȼ9ìZ rûç|:ýˆp`ÁXZK¶ãÇŸ8‘²/ŠÏföÙuB¾ëºdq‹mËUà ò}\‰ïàັ„£¢Ù/O?âXaïâqîLQ"ã‹ðSìµ%w/« /[›RÕbã¢ÆYõ”Àºe,I—bÔêÆîpEž23É¢{mU¬Œ¶òÇ«CÁiDÇå#áU“N¤½¢ÙH@ÔŠ³ˆ–€Ú0f?½¬c“ÌØ¬ ³SÙæZ8¸È£“+á;Íäéê*´c3€vfî…5ªÓ¼¶C«ýN/û™Ã\{JoÒc!\sÃ#Æõ~§^k”«KÔØ¹ê`j@ Š÷iÙÙ³u—B5+íëÇ9¬ôÔþg1¦KÊè•­l¬ËÄ•òÚQdʲ;¯„hþcHjn~ÌÔ$lÜ ã³¢_ÞcÄ¢zÆv¹g'ì÷¹{þýD¼{ ¦}s\Ù`a´"ý`݃¢×èŠÄ+âòÁioè ‚gÄRo 2Ÿ×ý¶s$ϵs "Paµ­“%)Â]Ý30ÃÈK©†®—}ß¶aë"Ç®¿7‘lQðBCdpô›+gged­Ç3“¥ëŒÙ- :*yP™ ÿ¢KªŽO~ ê™C ôOžh,ê]¢€T°©„ü¹z]¸El5Õ (‹˜Eðþ–fñt<¸5M3œ›ßÎ[ÑfeËîYF;Kë }ÊbµôÈ4 Ìµº涉R WËs©'ùÜñh ä‡HF͹—úthÕr\e*¼ÓÙ𻩺  Ï8‹ç½áÞmáññmI«…Cdç·/N ý¨ä^ŒþëƒÞ|y²õ]äeȰU©cG\ßðtæ»É“è•>F¼w¼øÁ/K<'moN!jåxÆá-Ö~PWô„Oæ§k¦ŠQ!`pá6x_n¼e_·üNH×±ˆÄOϦH´œö´-ûÔÛ2¿N*Ø!ÈÅ“þ"vH,˜–aêM”Éõ=ºÓ³\K¥G^L£—;ˆ°:ÛÝœ±£(Z*¯ìŠ_oÝóŸ\Ç.ÆYV*¹aDä„ ÄŽ|ÇPET±CHêÌÉBüÖV×"f›ø¬È_o¡Ÿ™CÜ‚[¼Vk•¡Õ ^µñußç‘'—ÛQ†~/©¥‹Ù ´HÉ‹ÇÔÏÛÃÒ/Hf."Àer`|–2sÑdÖƒˆ+Á©f·g‚e•ÏÊf¢ÎŒ]ÖÝizÀ·1s€-Çe+þœEk\üH©¡×Ò?öVvU÷ à,I¾[´h£€x7íPo‰V¾õAŠ üª°P ï‘bÎý&; ]¢½TRÆ”ôѺÿ“Ùá[ž;PqôÁ#£$¹¹!—e4^Oû|ÚÍ%ƒ¶3zTU¾ Ñï±±D´1¬Åº”Åäíö~×Î(+e¼wmEª´J¼:“:fùúe#Xò]pïÄm) ÜdE' Ñ8ü(Wãˆîï ù»>Ã\d³åÄý;­¯°NKrz?—ÀºZ¿]`Þè”d£ šmim4ŽÒÀîº-ÂsŸ|Žù£•NdàX5~ÅÜúÑ^ó Ú &Í~—¨”þ¢¥^¤ð³dÖhˆl'BíK?Õ‡M DõÍìKÎëBÓµ Ðé¸ÎçT»\ÐÀ|¶“Œ¥ßã‘k¢ón‚el=O7Š!ŽïÉä:Üݤ+ËŽêàLÀÊÊù„™Å­üݸ_Óª‰(#ÁAdèÏÔ¨Ø7 ™¸¾ñè¿¿©b `o„+ôôÚPªA©lÿÀïÑ.ÿf†ˆXÄÚäç³ÎC,ï⻾^AùcN¿óå²P±Ùr1=ÌËS«òwöµþ1âîïÅòùáÁY²åø>R‘°–ÓØbÚäAž‹ 6Ž¢â¸æËê¨+§ê…«yÕ”eÐj:°Y¬%ïh›ú5³³äÁJ+'âÆñËÜô𲑸¥šÂ“ñ)¤ÒY%.… Žý”\áÕ¿ñæÓ‚ágEž,¦ŠÓƾ8)†²"r%‹Žª#ϲ¿¦Fr^$ËØ;¯F8U©s&ˆˆ³ùž|û³¦CG7NŠ`÷ã÷Á~¥î/|_‡-X…>òšÒ¨4áG5 úã ”Öê¹®[•oR»…úç8E]Uc-Ã’<#w§ü\EŒbÔ9Já¾wºAcêà3aÄDê]E¿=*é#ýÒ* 5Lù2'ÝNáÁÁ¦XÆJ ˆ”ÅDùAjœS—Ì-Éл/ÔwVÉÏYï ´%<¡{‰Ú©]Èw¼;´*ð$…¹;Ö+GÈhš”BqU8;7ú"“MãerjPr¨‘ìÜòÑ]qæ:^ò€ÍZáá:MÑˤ[d÷ÌÜÈE%Ô¦m.Yé4ÓÈ!gïÊæ`£6‹&¹Nz Ô,kéEÂÀæƒûšP¤fxuÖ4ÕGáNïuÞ‚d`ÝvP?%µu‰;ªÅ‘÷|ç±fk=@#;sË”eÊí±’ÉLa—!G[Þ<Çèû,¥C™ÐÔón‘¯˜ßÒKœÈåóÑfëØhR„MˆâÍ’}|B’ÕæŽÏò½îENý9¤Ïˆ¤©5/‹¿nÿóœóø|Ï™¡pý ßÉôðl²ÝHÝJÂïU„5¬7&^ÑuíŠQŽÂtäºÀZO}æP^òWÌÒ,†I¡§è`hü¦“ •/¯_èh3ò# ém¨èï#ï2b%w¢Ôžu Tq ñ-ûqJÉѤ©½ LAFú”I˜ÜÖSrM© á÷r<¨0ÝaÜ3“!¹+RdÄh)ø‘§.«…'\šr¡Žå~h:l¨€k炪H± Yü:1~®5d!¦’ói í¬ƒ+÷¼ ›XNe¼E£ÅD¯1BÆO÷9Šù*Ç2›šPÒôRvÜÇl'ƒ{_ÒÜýÉ33Â2øVZ=®p}¾Tz«¬³%¢Z«Á„¯›m5˨‰Cg8‹êÝ)1¸Aªæ‚$¯ovCÐo¢lÀy+䛀‰P©Ñ(êû\‡›ØC››Jo½–¶® ÔÇf‘ªPÕ°ÎÓöªQHœ+åç ×%‘B‡)ºH„ç<©-‹2 o¡Zåh¢n=Ñ}š³ŸÐ•c0éí(M:¥¯rðˆD¥¦è§ÞÅ._\£@ u•vè“âŠÁò⢓w™Ë‘®ÝqF3KÝOƒÃÉòât–@§¦FïHò^"¹qâèò¿»òÁm©¸DÚ%QêÏò²Vx™§ú—s>‹Ñ%ë…AaëQv²c éÉš3–_DèÌõôtŽ~*Û4%Ÿ›Ïa\±÷ø®îˆÀƒî/Ðá/H¬v.†:A¨Ï«uùô’>Ð:$l²,[®æ6μ‡nÜ!"èqÖI=ÅÂëóò7ÉžAåŸÁó+²×E1–< ÆNaã©'–ß%¡è|’7™5p…X@”©dJ ¡o@þ}­zJ{^ÙÝHLJlz&€Së/0€x…â)9‚…ËšGbŒô…æoZð~DþRzŸÎûŒ¶`‡“Œ¨3eÜxùÈ.6?²MAÀ‚â•*,uÉšB+CÞ /Çr²„ŒÃ„â> stream xÚ]’MjÃ0…÷:…º(¤ ׎“H„!¤„fÑ6ÄéliœjIÈÎ"·¯FcRèžo˜?ÞøñáXg[ãZÈVÏ?Áè®AC¶{o<Ëw‡×ƒí'žƒÓ5L¼ë­ soáÒ[¶,¹éõ4gé­‡y¸¾ Û9¦ÏO±8NáÆé‹O,ÿ Bo/|ñµ«c^_½ÿìÄ VUÜ@E-Í<ßš7§³ØúW8ß<ð2åKÒ Ñ7Bc/ÀTQT\í÷kþÕÊy¤íôw˜*±µ(bˆ Ä€Üw‘×/‰c`j³ISb™8†È+â2õˆÔ#ˆ²$–È´SàNÑ·ÈšX#bƒLÚj¤M 6Iú%ê—%q‰Lz$ê‘kâ52i‹Í™]@›ð€wÛõ5„x‘tåä9ºÝ[¸ÿÞyœJÏ/T¤4 endstream endobj 452 0 obj 329 endobj 227 0 obj <> endobj 453 0 obj <> endobj 454 0 obj <> endobj 456 0 obj <> stream xÚd»cf[³-\¶ízʶ.Û¶m]¶mÛ¶mÛê²Ñ…»ß}ÏùNÜóýɈ™‘9+bαȈ”é„LìLÅìí\è˜è¹¿ì],Mèäl,]MŒŒ¬ôŒŒŒðdd¿œL ],ííD ]L¹ê¦&!Ws3;€‰›™›™ÀÄÅÅù£š¬«³¡ù?>LLŒ¬6Vv66x&&€‰¥± ÀÈÔÜÒžá? %íÌìLŒÿ7quøo››©“ó?y”ÿ•› ðOf{;O€‰©<ƒœ½‹¥±)€ò—½ƒ§“¥¹… €Ò˜êŸäœ\´ÿ¡Àø¯dúW2ÿ+Yþ•ìÿJŽ%'à߲ʞÎ.¦¶ÎI;c{'{§J3¡„llJÿ‰ì P2u6urûýß,Ä\mlä mÿåñoËÿÕ²ÿŸ£¡­¥çÿãú¿]ÔMÿo²¦&–®¶ÿÛjé,féaj¢`éblpqúg(ÿÂ’.†6–ÆBvæ6¦ºÿ´÷? ª‰©“¥©‚½³å¦ cffý_6 Kck;Sggó¿&S;“ÿMúŸùüK™á/Ä¿fÑúebigPv1´31t2ùÿ€Í †–v.*žÿ¬Ïÿ„ûWgú]ÖÐÅÉÒ ÍøÏŒ™þó?¾ŒôL\¬,œ¢t,€Ñÿ@º€ÿfÿŸô’"VVF6Öÿ #,lïáMÇþO¬\v.'#‹ïÿSŒ±«““©Ë¿köO¥ÿ­›YþÓ8SSSca¡9=m„ó¢¬)½ºXÌtW„=—pðΘì'ç8Ÿ÷•òË«<;(ö䢕„K'›¤-¨¸'ÒvQ³nг#q—:„äB/î5 íæœ,ãPÞØPõÊ„»x»ˆùD†Hk¦Òè¥gsßvªzo×ÈÄj`ÅvŸtíoŠÉ çG©:ý½™8~lEú2Aí4hΰ¬æPòž ï?LXQ<˜‰ýó)u£“!p˜À½‰Í¤æèâÅ7»Æ\ª•aå<×>/²Á¥šd1«P3&„èF9asE‚—9§Tßõ›a7þþPJ¹"&²œOgè˜ uë2¾ÝLûMÅo¡ÒPQºøh»äʲFºÓ(Ðl”,â ;ÃÏ‚iÕçå2_ÔתàMP­b­U©ãàºS:ŸÓ‰þ–»¤²À—s¦eè“bĬ ¶ûó.—$F™¹ƒÊc¦î „¦ogD!k>E¾ö^µ#bicB–ÛLŠ@EÔ!ZÍèämq„y‘@vÌÉÒš4âùÝÉY·‚xòÈ.+†TI‚¥4g|·ªLÚ¶yŸ=Ä ÌWƒàh¾y™B\ï?2L±-œøô°«UJΟ 'ôªw•×}­Ô˜ˆ’ýu¬ï!g°Zò~üStz¹b-YÄøÐ²Öœ•*KÕ[ ?‚Cå-Y‰™Iœ´ï‘2¥¿¡Ç?{.³šÒf´ƒkâp ûÊQhÙº¦±¿¡Ã‡©Ñ‚<Óƒ<³=#?Œ4òì{òî%b¹Còãþ8Û¹›¢ÌzÙ~† ÈÇ~43èKüv(+¶®ªƒµu”%EpdcÄ&¯ŒÖ±ŸÆ¤H’ = 2^n#ññYM=Up~Åæ#j˜˜2tÑEf6r"ìË£®MEJ¢×¸ÒÝÿ¢£$‡Üã'³€tfm6ðâ] ¸°"fÕa—„Á–R,á~~ç£ô–˜3~ä6©-i¶„:A€ƒ:"•it?ºó¯wuÞ>HÀjõŽêØäê8:F:uéYÞP§ ÃдæìþŽ×‡Õ-ÖR_·(ÈÜÊc)'º²Þ®šVëU·“D¢u}žS/û%3GdÜ[©^ÅÅFlà300qÕè>TJô;Æ%ûÚ+I`¤"Ì:ß¾ñÛ¡I§ñ©uÈÇàáÑÀm ûѧÁŽ ¦–«Ã®t¬x…>I–Þö«IL «Æ õé+)%Ž©øÜ|ú*Y 0·¸Í*Q\F»í®æCQl =lj ¢^d­_/>XN«ØíÜõiÖGië󵥈öÇý¦ap^ýÜ›W@SeÅ÷ß#Eù3yaSƒ˜)0êuáAÛL(Xº]ì>ƒãì€Â§fŒWpZ™3Á˜}ÝrÿÐ!?õ7ª.ò%ܪöÌó¾ý’¹S•Öë½PqÖÀ€XCÃÛåÏ'T,»eøY;ÒSõÈeéURT>N£Áb{ô\/cCÎB;h¾ò‹÷ ßbDñ§žàž5~ûð<ƒ*>êµD ?ó ý 2ÝÇÒ úš‹.u3"Wöˆ€Ù"?Åï{–nõÖoÈœš:Y—×¶C.@¨¥OÓèB½9°¼,*r^ÎôOþÔš%Ô«Œ  ÈùÏU17ž-êÒ䈱|¡ãË[Há?`@}p×-©¡êâRvëùî’Çïs1JScTV’GÛ÷>/esFqoŸA7¢?ÁóÔ³$MZ3½×¢5tìzîö×kXód~pÈÝ+{á.iV·Ã+þ8BT‚l‡ `×[êÐÔø:$FÃA¥h4xcûô?î:çÙ-‘Ùzw™Ï…7ü­ÁÍ õ|Ï—¾Ô „< ÎìjÚ«âœK i…Ò¼—5ž²ø®*uAI;ï> š…g•‘ÇŸÂϸÅV=v™·D‰|̵@,o*Y".É`b©Û~Òj.IWªÔÌÝí©cö&ž$Gd ;FVÞ,ÞÒÎ>/›×b¸É ©uºz*bn x#!.âÒ¤u‘ê!GŸ‰·qÃÈÊ*ØêÈ!4,¤¡É/Žáð÷™”–&vö ¡Ô ,sŽ#eA’èd$ç<ˆ§A™+œøDñØ“.œn.PÞkȤ„iwõ~ï ƒÌž¯’ ‰t|ì—I×G±¬‹ø™Â‡ ÞžÖ†­3I°:à–Ò5£Ý+sùK¯)wµ5-‚…å2KJz}=D-Í£µ]:‰¨‡0H/T­d¿K}Ð×Z¦î6½¯¯…ñæRMj æÎö M!Ì7¶Ú1¬Ç©›MÑÌSLØZ~µçõnÞüÚ®Çhôg˜Q]d]t¸lîÙ€±C ëÁí„’€•ê«;52§v]ì&— Gó¢Fª†‚‰7X|Ù‰Ôüyòk®—.áÐh`Žéw¯¹:orFŠ¥DÓàOÙ]Ã!(:¢êC›~Ñ– 0q1€Ÿ!Ê(ƒ/·Ez¤ÄùØ€F—²îm÷ˆ²‘ˆg–‰…™B_Òù‘Ĺ£¼C”rØj={ƒ.ŽölzpEÆÆb6cäöq®ŽNʸù5**¨ì-–}¼ÿñ»E4/ÔxŽvÓš1Î¥ñ&”>ŠG4+£ôNYZ ë·E1ø)¦þµPˆ”Ñ.ò¨ j¼óÏ Rg…Ü ùÝŠÙ¢$×’ôÄ\M<%nÉ]u¾<öêoÖG£ÞA§–f•-Û%‹8Ü, ß .›G~9ɘKñ¦­÷8³ˆÀIÒ‡¢Y­›ž<™It3ET(±9"Áû[ýoãŠî‡Ç ¬v†¥½å©· p¥-„åvDø Z¥ã›F!ÒöŸ~g…föÂá… jØ!ÜxÃoBsVm:÷÷Ä.LªÌ|W NLi1/ÞðžDݱoÚ!šÂu£²ô4•½^içmù<¼¯MçgèŸ2Kl{ð û‘ÎDôcE>EVšÇ§˜/ÃÅ]…c&%ÚW»Â?TÇÈçB‰vdým†¼äfU=„«ØUÙY礵í ÀòÄV}ë)p5-ýŽdý&P"¶¿–qcoÁƒ£‡nx­Ÿ€ëŸÛZš@%©Ç&÷Ë}9Ð¥£O×ø˜Rš±?ªþ7-hÀµ¤’èÂì:éõ!`|kÖ}§ ‡Éë±}æhÙÃSQl{ÇÚ–£-¿š’²/ýM³“1ÍàX¨)¼ô}L$ðÀ±{® ôµ%Êt¹lÀ¼Y=û¤eäÅl–#(Âá÷™m·ŒZ$t¥fþÔŸ¿ë>ÚMúŒ8IÙçHàåÛê¿ÿö–ôpÚ“öVÅTÒèã|¸‚o§³PL…žv–ü«8âž$á5ÏÜ{qû¼cûÌyTOj‹Gua FÜ&Šzé z™Ù`ÐMù0øó-URUZâx*e±FkÉîl#_’®Xõ}&I¾tŸµ‘#YØ­0Ó°ØÞM)r˜ãÄ¿å›ÂíC,V;ö+pã§¼N /§Ü4~t žô ¿Ï5Æ[²Í(a1ŒÅ¼´™§žqèü]7A¡0Qïö q¼€•õ×P~?.Ú÷Ip´ÞÔß»š§UßaÒùÀ}•"ÁÇIèYxhº2Æ9çP´ø9´É¾§˜œqÍ×b¨Î¨ßny?jï³´Ìsp” í|§Œ’©£jgÁ`KÇ´¦ÊìÅöÖT™BñŸ›L,!T››m °\þºgïfx—Mž•‘ ZÈ”1×Èâ#_þ‚c½±÷{øŸ©„êé ï©¥ñú÷< Ö°ò{ïçX5ä ýÑKî°¢:»Ò; ûq¾å;t|aagAsMF“°S'£_P@‚Ä2_8èäjr“[)_ßÈ ¸.禦µ¹¾›¤Y9àär"¯ÙÀïª*aõqÉ/¤D¾‹vžyð6oï¬ÓÐÒÝž¸ÑãåG%>ïB“I•’Y³E-ÍD˜Ÿ@¹=7!9iŒŠšM.,Q¶ûÍò‰DAÓ©od¼Afó¤R8&1Е¡†zcCN¹ u¼ãŽÌ$uœýšº:.;7ydÄgúÆ]ÀI‡ŠëÞà"O7c~+m]HÔš:DQ;ܘ ƒ›` ‹@>Û¶óYÕR8ìlå¢Õpß[» 3!Ô.=ÄË…kÊðíx`ž°‚Ö~Z9š jÈd侤æÐ«ušÐäwÂ(;eVÓe¯?°¥Õ9'^®õÙ…iŽ+lA xv‡1 "™F\Ôt>™^Q?Þo`Äb#~×¼gÛ´¥{ON!çUõÒSë/áïŠnäýí;ê¾ñ£ûœ–|i`ÛY~òK @³"Þá®ÁK á$éŠäTêê> ™5Í‚ôNßá•f‰v«Ö;]rAR«ß7ò£ê7@Áèò(jÿE}òHyÒ{¡îRIôàL¸>}ïû»Š[ìi€?+ÒLq‡f&øKÕà׃sá¡ory„mý¦w¶¾¯WAifúæiJåj¬Ô<‰ˆ22Öð@C|2hÑ(êÜæ^®ëµxÀýÈE‰~ òΑ‘âzÏ1]Æ'ø ŠõëçWz7± .|äL™sÿ/D³û¹_ýn&ŸÝæï¿à²çªLá‘®K½Né·òíoðã«:÷¿A€*…6´Ù|3¼œîŸ‘=¢{Ÿ@°½ÍÜ„ä{³²ïIŒ+0|ašñ!¸gl'g p2éÕ±§@<¬#ËVcµ+aù‹dz­\oÊ~2=쑤C¿NhÎ.Eð_~N¬Ø=µûEo%P4DV”L`A¯¥ÿ ‘@D7atœ„›ZC‹¾Ã&åØY¬E`ë´ Õ]K ®ééݤšŠ7v^ÌúM1=¦FÒϘµïF< ‚`F.émÈ9Î@û¶ŽOÊ„fϵç#š¡}ÃpˆUø·<û%éåçÓvF>×E-®#»u¦ï4énTQT:ƒëÌÎÛÛü©iì-ÊšÉÿ - šIÁfNò¤!'Åqá {žßíq2½#Y\”Á5èÏRÛ™6PLJ?õyÿª%5R©®Þ –‡ÙKúô£I:/¹¶Ý·É”Zdá½–hu6üv|ŒW¤ž$g`.„!pŪTOUmU‡°ZùÌà`¿ð·c8ÎÞÄØ”Ÿ ÑöU8ù¡"“)lÌýudó*åpE(h‡²<$DU4Q•¢ܬW<î/qð rˆÙvàOF](‹'Îg_Ûë$ýy·óHÊ—O?;šUÉZoÀyA•RáVÑ1DTA –¹¸%ÈMšÒ´Â+—:¿áßnZ8©ˆ?šã:í;h ¹±$ëyåZôÓP‰ñâ=eܸuä6c²éÔ` Áü"Bq„;sV–BÕO+llõRÚ 'i“Þˆb¡¢ÛXÝ)ëj±þ`ì)ë®zUt-ŠÞ%„–?ô:%_ C«Çc…eÿ”Î8>àƒO•Zqð¼yÓ5­™(Ža¢:T ôâAD(“ˆa£5Ù0q‚µ@¾Ñ¤Ë!ê·¹î )ST‹ˆeA¬"2£Sëõz}¨‘÷XðFˆl JÙÁŽVì…nÅ9-ž@1ÆbˆòjfÉZvþJˆö°¾ l+ŸdγúÑFÅ0ïcÇ.ç«^ЯÎÄH`‰v±÷IÎf†ûKM²g^þrŒÅ0×czçOðíÏ%¬ñ5šHPLÅ^z«dÈdVÚT?$ßêÀÌÐõŒz*]~ëêx*P|gëäíÜJûpî.‹G~T‘iŸÆch œÙþ*•.¤èÎ9/Ô„;Æ×óœË×iørÓ²|$ŽØîßyY%Û•׈W‡&W´ïzCUÊfd¶ª«¹ð={BPêÉ4޽cM’°á„D«,—mi~d@wp"Dr¨f˜/U¨¡å°ÉðR¯MŽØ":ÄýçËbVtlE“Ír Þî0¾ <×¥èQh¸*@3iïzb¢ÅhÁSa[£?ÔÛ=^=þ<Ÿ]gƒ †@iå~uNWÁÜ´-v(ÇE8Šzf7^»-º’1ã"É.|­ýGP•_gËjäÉâ÷ õÞ8‰åÍ÷w¥™³6qÓUOJÆ[mªg‹ºå ø ’ĬŒ†€X¥)¯ÏßÞã y¾ÌÁ)ïz,)Ç6y«ß­êWã#/Ò"ÎwôüÃì+èèÀVÔ2s]AîŽï`)AÈ›O"[ømÅäž± 1»›”*›V³‹=dx3­eáÆv´ ¼ê*ÕP(®Ç¬®äŸ€nH \AÔhÑ7\]:!zK ) cUA ¬ kµœµ°øs}”¨ˆBP[Äᑆ½£_[âq^ŸÊCÝà_v™˜ð/^ñ­Â‡Õˆë»=ÜÇ(ÝSÇ8L{½[AóJà7ƒÒ_d­¯” Úê+TŸê‚:*ý‡üZÑ—6´¡%âÐècí¨Õ~AÓ¯›ô9Ø.ùz§×ç¯þñ__±/"aÒ—ÀvÏ5 Â…ï45‚£ß?„ÀÂUŸ]§0›È'ì²vc-ÌÓ)ó …ýœ“5çûšNŸ—X'l$ÜÕwÙKº!"ØÌðø“6BɱÆÙÇ,•slÊhÌCtªí¢Ñâ-ËÜ3KúOè¿å\@Ѷ•î5»¼æZ…%ð£žÁ ŒîU“Dèa :x]¤2äŠè|%eâ?ñP;N–I÷L×6p#y¸ |ŠöÚä£ÀltÀìåJªçSÚàù£½ô„ô`žÿÍàYá'ã¶* +™Ù½ï§¢¶ÎZZ2Q²j65[«õì~‚ݘîŒÂí¤ Ì“4²–5½]NZ»‡Áî†O çØsŸ ߬ è[t™¹Ys8 ¦Z~–öñ¾—Ä.¿DOC±¨Øv©˜çE¤Æ{×ÃBšÉt=f?öCÖ U5äB/‹Z,¨‹<,ÄÆ*Œa"t(¢ôÀ¡°ð!pÀ‹å™\•Ñ}.ÂSÄðÑ›Cîj°™½p"'ûââHðÔYa#(rnÛörk¸æÆ¯i×P>öT5p>à`¼‹ñ.딫?´`b›LTÉ=…^V! ×yD¾OüƒI~ÌÇ%-™¤²wSÓ†7ú²ñè1ËçPÆØÝy'è;Áõ[,<*aG5hŸžL‡®­ÆÏÊ&ŸÕÔŸ%n ôä€ùÖ_/Â;Å(âñÄVua\Žª•>;Ù²·à1'Á&ïÜ‹0 º;Ù‘j $ÂL ?B ¤hí‹¿6… 'èÒõåä;T'ÑÀŠû¥ Òhˆ ä—S&¸ÓQÉÂ-.7ãÑÐ2ErØåöBµ Ízš§ž²V•¬sërÌlm ?J« ”JHÞZ‘rPî–™éåVwq« %:#î«ú\âhô¢»ú'©ë¶€:¬º­˜>úR+A?VtpjñOÿXAâÝ$Øoª!–aþÇ_°>_Y¸ÓÿmúEo ö~{ÁLŒWK }8ËÈ<[FŠ÷;] íKz½£¢¥ æYt½&1$<Õ¡J5ϺIcçdQÇã°P"ÃüÆ•ÒdÚSZˆ”$Yõã£h¯¥ó†Ó?KÂ[rîtò£š5`\¤çÑN̶[ÏÀË{¹;ÛY¡gûóÂWýCƒhˆìfÖE‚lSÝàšPP™ô(¢ ÆW9J)äÈWHþ‡À6 ÓF­ö/¾—àçß|¦c^e+âp«.5áêä7néXM.!SÙ KßÚÖ=*ä>ìë+Õê¦ [‘Âç`D:ߨ´h‡?ÕßðÙMŸWÇ£uÑÕ…ë»îé_3 öF¯k†Ñsyª7ٖͤݫ‹l{‰E¤ƒW¢'ú’éílùü­WÛB tð%“@áñ¬vö–?(Øh5D.+% Aú=UUrF½×sp›jãp¾a¬mÏÕŽaÖwÂeè§9 [&Eý“òi¹Ñ^´¡¾‚ˆ”Ãçlt@årÍöÉ{Ę«´-¹ûè6TbÑG ð«{³T‰Ñ:BwC­¡J©“Ü`•Ûô]8õãy°øÚòZßùh¸ñe;Ï84Ä›¨DiÆf7Ë’5 [` ).µÚöÛÙƒj5ÇØ¡5Ëû2–Êó@oO%AR'†Ž9ø¤àÌÄ[_QÔÛ¦#Q{‰¨lWeÑL“‚À#yŠÑWÒ é–½C ,µJed‘jC¬åPòÑž‹›®÷Ù±– ¾…3J‹ÉF„µÍHTœªFÍ0wÑÁÅmwÒõÓcÌ>ÇbÅ›©?¹šª@í^ˆ{ÅŒô"Ë‹>¾X¿Ábh4ÛÂ÷=Ã¥ó÷ÞyJCçÃ{~›ñ¥ê‡é$y¨½Îo8­>«‹áÿÙ./Å0ù豃Ÿ½¸«Ò¶]Nvp ¯Œà®÷¯J@Nuâþºž$U+(§ý¼8u¬ÏF<úØô\V/„7ý[Óz~828B~.ÅÊèòUðz×8 À–ŒSu™þþX…O4…(+œZNí‚VÅŽg´¡j@B¶<‰ˆäŒ7ÒûÀª¢Ç³*äE& Š/{þ—~ÎꟚÀ[–âóÃU60 `M›äøâRÄ©Có8ÀÚQŒÜcN KëÈSÔŠ¢ý§Ñ÷ƒÁ+ï¡ý=ýæ†: „Cϳa+¿¢GÛdt`Ü뉔çïíϱFÓ\2 #xÌnoœ±•~8Ûm hñ±ÓFáÇ÷(nf9xp“ º§¦¥R>DõÃ>×&Ùt.ʰ‘Äç“Rg4ˆ=«¥‡ äµËZ2„SÂ3MŸƒ@zù×UÙ”tð[èM°™±æ:V[ ¾*Üýu”ZF‹e)§Àê‹ÅØB &O’ÒcUÊ„ |A?’6%ÃÓͤ‰ö²ZAòs*Þ MQ k½pZ”à U<´„Ø÷2çi-+ÑêékOÝÏ0UL·´ŸhïÁM¤)MLGš@ƒMt>îQNg*\ªä&9# †ЇBÃ4/>Ä;†g¼Öùjc÷=Ü9·ÕÖvC5¸ßÉóž7hY‘Þu3o°« `A5 E½èmó57¦’P¶wrþw~ËÐêE7S‹3)½Q¢oUØtŽfOû ½é•D±œùÜŽH‰)»4tdŠY²Ô4¶>²K†£øíu˜î›Ü¬Ï UN7ÑQv×ë NHg,'>'kfj?°šÈ{©q½Ž<¿ ¸’siè‘gD3Óó&à¹ahþbòÙÀZÙ{è xÓÔ£­SMhÅÓ¬BŠ[/HUúw¿RjO¯=)mEè:~8«Â…›cÆIê„øcÚ¤BZÈää¥ëV‡(õe¶Ãbì-!^ùÒ¹W¬JíÅRdmé‚Ö‡b`?ÅÒœ`ÃØ9Ä},»”ìÔëØàïÄC‚òT°³ úõ0’*,”@â>ÿÔc nb“Óh¶;‡‚¼%Ðì;âf³Ö쾦{àÜ'äÇ®Œ]hߢ|0ŽØÆ‡wÝI}ctG󭎳o %Š1~ëxؽçš2w¿±ÀÈeê Ó_=WNò¢µÔ™é+ ›Fê+WY‰”o²ÝöFû‘Vçî8!PBD:Ç<–¨æ™f–ÑjiM;uŸ7tùéyŒ‹[³É­¥$‚¿,™}t4J®ujà ö Áo-kJ ràkmKñlÇ®•3ÈNA­€=®—Üd¾i)Ò;‰®¶Ýá}ølâÃÞT[âŸH&íÈ™éþ†¥1Tµ,ÖfG?{ä pK~–B¥m[;Ÿ`û”éâQ²QlC²W=pYˆyÑ6Däè ž"w«ñ°*õ›Pˆ×Ý» x°â††´y P6‰³žjGGýpUÐ:!Ô©ÔnÒ5?®qÔ{Ë&–¬¹Çõ…6ï¯V’ U’ÿæ‹ügS½-­‰DCzfžhŸHæjÛh¦ÍÞç2ªóåK³çm÷WEIí³~`JA…›¡Sõ½Ä>5ZOþ3†G©Ø7Õ DtÍ!Gçw‘Åä~?ShnÍq&lP$Ë/4èziqÐ÷Ä¡&×k1àR¤çqߦø Š9 ê×*P ¨ó'ˆ ‰?¢ˆÜò¤Z“É„sXÎw’ØäÑÄê+uuågVûädªé_Îèe­ï¾®'OÀÒâM`›vÃ`#ðvnÜŒžÝSíPïp„ò¯+53ÀÀÀ í‚=ʸu ®ÈF˜î­Õ4ËŽ1`×)¤” t`|iÈÙé_rr9X~g‹±d=Þ°TÛ¡î Ù^‡ü9BêÖG@*%¼ëXØ9¡ž×J 1ÇrYdY|ø  ,VZ/cIU›utO¦œlkÅÁ ¼X)öîäšö3j ®:_°¤ïƒ¾)Ù@W§…4TWn-IàáT-®8XQs—àû*ôEH!Œ åÒæV¥wåîØÂ´àÒµˆ§µö¼‹÷w5Þjœk¦¤¢9‡AM<’AB3Ä *+ ÉvK®®2>`ù÷.™£p€sZÔÙ‹· ßvÏ7Rç(;‡(2!ãyåIXŸ'ܨN ¥ùrÊU šÖšÙž>¬Ù_QYï‰zç®8Þ¼n‘Ó}ÆŒy•&¥·Ä‚C:‡Y¨ <â]ºŒž·¨i £6k:ø¤§š‰Â‘ ïï†Qû‘ÚÙ%\¸öìTuÐMyU Ì3VŒŸI['߫һÑÕ›‡²oÁÂÀ òwQ¡Ä_©#, äbàý㵜c h%Ø2éõ5B æ"JÝÃþ•VPU¶ÎP%Á£cŽÿœQ3¾ÇïÕ$±4TlKªýª¸ kË `šÀÿ [èÿq®1 š PªÞSá_H^zø`¨}°‚"Ù|àÌÜ«E³u¤deEUܯŠŠM¹éPÍÆ}{™ ]š5óƒoÿí°¨Ä$-+œÆ}ò&ŸÀe÷Å{bð_ߢw~0²L¡ûˆ¡%Xú2‚ùk ­š.}W…Ç<ƺ[•ë øËq¢°õ7"0bt´‡Dø…¼ÓÃCïÆÌ šFá"šö>*ˆD§J¾À±n$#MÞzÍv¦ŽêªXUA ÏØXEj±(]8ÉPQnNÔ…ìvÔ[áÉýjHI•…©˜x©ºRX·$T–5ˆƒ’´ \òb:zB†¯¨tsJɳ³ÅŒC¥u)Ä’]ÿæç¾gâ[¨ŽóC§ £ì€Ý}>‰Q#S*º‰ßzBŽ|0wÁš5ÉšÀ/X Ö® L&3Ëñ·Çaf—˜¥‰d~DTÅ]¹M¸}°]Okǽâ«#|‹v죷wi©}zÀ”ú½U4Æ?…µ °Ü€cÇ8ÕŒž®”—Ç«ÖÙ>Ê7°>O½C#[»®Ãv<t¯,TÄß/@œ»Õ ~Ý qˆ‘ßA•“àA’7{R¤/´kÌô?È’½u÷ϟ컹 hze×^4) §þ"“æÝVU;•qIE›šíËKð›{p wh°¢$` ›ó:.£„'&Þˆ–Áßìâ¢2韌é!©ö§sǪBÏíLO²] áÁ÷ÏÀÃÆ\­]›pߋޮgU ágO·|®¸h)uyOÕ 9«>ÑhÔÍ¡aÝ\•#ÖY.þ¾vbåû­‘n%ju>x±#Í÷Q¼ã&pûØžaŸ¡æ=Q ù¹Uç2wïus‹‚4Í,Ôh€j–°7åÚfPôöÊ„°¸è§êID²þÄz‰DbÅú¡Z O×%F:¹’ñ̦÷< ߬R¶–Ký\¤óÎ*µæF),DÚÝ=¡!9¿L’ŽˆÆx+š[” ê== -¿ ö«$Í ƒûºŠyBéâ@ÑÁÒ¾ÚSu6]χ{“-9w®KÚwŽÓJK• H¶&+»Ä&híد)c,ÿÜéÞMŽå’o'tR²T}¬Õr—ôÃm‰JÀ“zïÕíÎܤ3aæ=ü«Ö2"AGϧ))b°l ×gþðó*¢î‡1]+ù¶ú•yÕ€–ÁÜv«0Î±è ­ÛMÎl&–‡a4‚*"þ.ÆÖ¡p"¼nB“ÜïÜâ}ìF‡'õL‡Mhè¿ ¨¸»äF#ëIÕ»¸|§Zø›ªŽA•¸®€qL¨®=Ÿèå³k¤ª„/Ô¶ýŒÞ‰œ@Á¢KÞ¥-Tâ 0ŠŒÐ£â¤Ù‡EKS”™t›šŸµÚåˆT²"ÞÁ´âé˜Í´Œ¹1b[ØhXû5¤L¾z¦ð&çVŒÚ¿ÝÜ¢ŠÖ›ˆ@¦j‘à©,&Ö®ŸòèÌgœHWë¸)z½XÑ‘˜è½~ –bqMî),¨Î×2Õ¨¸9Íãeîyk¢4U¯¡ƒW@ÀÔ•?±Äò‰T %{®Ï}o·w¦>NƒÇYô>ôŒ+CÜ«tÚëª_÷€‡ßª,Èv[ˆï¯l¢wœ…5çóÜÊcÎÆ±Ñæ÷òÇ›§o2`¾†kA²§Ÿ~=¬Ô  å [cv2C[&ᄨz‰ÚGÿ†‰e†.‘ð-ÀЄtAËvÃ…šMŸÎºÈ×T=µâ"q¨ú`s:Ží ²±ÔèjÖ8—Ä\~Â)ùè/‚T_QÓa¼‚tC„Éä\gýÀñÖŽåœÈ}}‡¡P€hìÁ\†ttuwXq‘ #¸]èeÚOüÁíÔ‡ëÄC§}¶u$F“/ü3´êgv³ºü Îǃ†½jsF w;ñþKδÅ=»” ãÏ”yu¦üï1p¤o¥œ£EsÌý:â€% Xù„-lP-‚`±^¨`ÛWo¶+«> $n)’°ÛÛºìX¶>ش컯'ä”’¼'ÚÒ.t`ò|`N&jè\B†9‘ Éryg{HÃã ˆÔÛÛÐÝ€H9CN»Q£Œ&|ÂPµnêÉYùÕ êÙKT¬´ÑXwº¶¼þe}Õº“6+IK‰±Z!zQxص2÷Ó™"™ö8j=äRyÁÌ^ªgC<ÅñÅB*Á:¡Ç{à"JþƒÒõÞ³x«]¯ÖÈÙù˜$ÃÕ‡ªS@h‘¤öã,ð‹~YÁÝrŸ¶ß½û°I˜N—{@‡T)w|wOrËëÕjS\ÖÈ„Øí늆¹Ê÷Ô…5 „£€¢ËÑ:÷8¦w"Ô¾Šá@…Är¸ªžmÓx·»Qy«‰Jn½fõSÒÔaÓ¥·g’Ä®Ïô”z–Á.v`|°8¢ËøÒïg2~u¼‘FÒ_±cƒ„ÑÃN£#Útó!ç{«J{ž=6!²¡Ðõ0î>Ò¥ÞlSón«Sƒ¤b¸%rÃ7+:iÔ€E˪u[è9wë9ˆ?ôV›s‹m$ÑDu fŒH ²Xt“ôû¢@ÕÖK[|Øm^i…P! ûvvØÝÐÜ&F`àKÍÓñ†[1¯ÿí@Ëñ~Z‘æ<±ïÔËDJ­¤âpj˜œe:¢Cp."M´Žžb©+ žf[¤ÁÝnÿ×Û_ß~n_}¶”—½t—WÉîÑ=ÊìŒ#‡×K‘PÅÚ•‡™3µ¥]Z< Ð í0æC¹éÕ!FîÒp3~µÑ:—™3•õœÞ[^¾Dª„5ͦ^EŽyûU ž…TT¡‡wd½}3¢ ±KÚÎî3ysug%Á,8³n²äßGêt8XÊóÇ=úÜÙÇ‹ˆŸ LÝM‡+ÃYލÙ^Ú׿÷ú›I12ˆmþ`ºO„ž¼lÑïÍj©çªH~¡L7zë"#«–À«’6µÔG¥MƒÕ~Ùf…0¾Ÿ}Tkõ`ði:î(èÝ_«èþ`Ç¡3˜X­{Ò7¢¨ „GnÓ\¥^³Í Ÿb‰ xqg·»óÁ¿ðéÑì­F‚,¡ß0 )Çû€…Û© 'l¿2±tŠf¸ò¢géa ¿|¹h9E35±Qƒ¯ÿH”ªÔ NßTÐ ¥v­(ÆËk6‹;JûZ™f¦ä¬\¼“#DÜÇ1·Ε¯$ÊåÇITBSgðw/ÃF*ÀÇ®¡;’vrµ­ê†Ö°ªŸl;ÁØÎs+(ƒÌvOÂ~S^¹¶ö‘*q0GÓ.IÆdK˶ÒLqä–´ÐÈš“´«<ýžñqœùóÓG™gbUïC·È¦CœRͽ±7ì—_Ä6Ç®rˆ=ŒŸÕ™í» £UmóD?Þ®o¡~&öêÏIŒÛ$SËÁÇÐn*®†çÜÀßb)þ­"6ðNDìƒ3/Q¯ ÝLÁ\Œ|ø7R)-§­8¬‹O›ïðdæ¯(¸ÐÝtmfŠñãÂüÇ@Õp|+*$ Š6Hc¾e­G— §ñŸï(×'ê|¨e•(D$75Ü  À$毞 ¼«B‚6—Áj"’—C·³/ÄC³‰dá`òçZùTiîÙÉFÇVT/i™'»È닟Né­D-÷´Æ¯_i…e÷AÆŠu*ʾ#‡)IõíøRc[å1t’–˜X/5Œ¤]Ý_?êÛÀxo´yÝñÖh êÇõ:nÏ•rÀé&2XºYÐVøüUca²Þ+P˜˜-¯¿÷A|¾~S`ä»ú °‡0-©˜>­˜Ëçmþ”F¾™t$åôÙ˜NM*Q:¢*<ÇçèTWò¢bòñ|-óûI‘—>Ñ'˜§7‘+m1ˆåÌ„BZÆÎ¾ÔvS{‚zk26}X_’È%+Ÿ¿ÀõFU<}Ï00櫞f¢ð¥vPÐÒ»ò(ÿæƒÔø’ l%ÿuy%,éõ.cd¦ÕnlFîf€¤Ò°W²#(œhᨾeﮀphü´‰“ŒêÇPÛiV`ËNU¶ ΘJ†H‚±M%ÔÏ"¯X‘.¯J‘QÒñþQfþ8;W|¸C0~,Çyb’ò‹VÂþù‡+‚‰—Q=‘|¯½ [dÌÚ°ñ¸ ²¶×䨶zû„jt{ÜlBŽÏž¥p÷-ìà+hê÷Z*n¿ÆW«|28< ëÞ¦øuWìÒ+øÀF#£Ž±Î ÿ¶7íIÁ'I–Œ£œÜADÙ5UÛiµ&6O­FØ*ù-B]™•ʈ]YödUv.dj½µöïôæäy¯O1„TóœãÄ•§Ïú]€³jÌœ½ô-ùÛz޾+Eâ‰q††#¤x‡g¿çÏI »Ÿñ¶Öq0L£[(%™û¦ý2‡êcj´¶øeËñꦆ¶~¨í¨]3R”;œšë¾”1 ߈³üÔÚ »›âD‚¦ Å8•UÙó¦îòò=Ž)µØ%¹iñ¬ø LÀ#ŠŠ‚ÅN]XöQ9±‹ŒU‹YHVÆô'ùƒ~èõ ìÐN°ã©á²—’ëƒ×ÓLX¤SQ· á ,lƉ2ç® #Âzò¼aÚC…^‹ØeR^{È®þ,ßþs=k®?¼Žífèµòº-3ɦG¨Wp H–•ÝÂ%Âúªåk m‡„¤Bx™ŠÔÊã^Ü"À=}UJsDù ‡¶#ÜÞßH…ÂßÌ8 ÷ZŠ*ƒ*Áï°£ã  5maº¾TZÔèú³Ôÿ§VL³ÝvñŒá"ºeJÂ`"ëb×E:¬òÓ–¨È–4+|T»zýjd6ÃdŽOtõçÍs<1 E¨=|rý,|Ýõ$šd§m³„ÎK1`, •ª–,$H×ê1oªy:µÖ'mJL)¯_øÔ×çæÉêqŒf¿’ö0“xÍ}‚ú™ÓÔ+½Îy:ºns+ïeS®e_ʰ¾ò¬ °ˆ¢ÄdŸŸ§mr©M½u{­ãB4‰œŽó“X‚n‚Éc}¬<=YŒeslNÁKnI=·¯ì‚R½½BU­P¨P L÷­ÆÄ§T˜çþd"1ü‚Iæ!½&Ü.’Ú)Áq¯ûq´ú…@â½:Iº;»ÓXŒŸoÞ AîpÓ”ä%vS™RwìÏs«Íçiˆq‹¦{”ȃ;6ô’ì>I:Ïת@ÑÊ‘˜mŒþM{]¥Z¶Çq„źYQÃã\¸©Ê›^ k26ƒ^ïu›·_×Z¨Í˜ M±°»DB”a]ÝjÛóHê°ÚœÀö5H(ºÃœ-û÷Ö±R/8—œÖÆ„%žN\T7†äIËS;.¼ú¤ÿì·sYcRÉ,ƒ]ƒ2v¦&WâlíB¿ª ÔX¨i DbùÙ'š®ê5! úû9ò ¿ýû)µõIb`ã;‰3îÃòÁbuu¾Ôñžþ¤¹y°M[ÅÕ¾ëñ ©=‡à°iîî7¢ç.,Éâà}Œyž¥¼˜ïG®ÆCfV_0/0SoêòŸ ‘k¤=‘ J–”Þo'Ê¡øa²êäßEY2¥‹¿{5™+ âøz¼œÆ@ð v»"pÿë7„EfBÉ ›á¨´×-¤—é•AX d¥Ä\ã$>~Àí°…3,Ú-@j:N`¼-FÛ U Bañ·è×XÃÛÆç°f#03œ‰aG4‚Z«¢ ‘ÝmjrW® Ö Aû1åôWåä ™£MÌï·0{‡üŸMv† 0‘¿àŸxH¾¢› Tk «1_$Ú‰æaÒk¡@÷ˆô뀹Þiórí_¯i´_¥H+ÉõgLÁ½ZÃ:ÁÅp ÚÊuæFp£{ÉÿtÔE>?©Kx¶Ÿ… f÷ït2c´ùÙä6 Ð/´Žz—–Ef@ïß{Ç žEäƒjaã­NFSzG²w\qž“òùßÜcã×e:¹0„ÁH¬ãW¹tg ˜‹T:AÜåí°Y|2lHþøS­‡KÈlÙ@­(R{ϑųo Aïùå|¼‚'¸n!î±"ðkÉ&‰™êÅ{PâüOç'ª†ž@2ïá—&@"1hVçÜ]ìdŠV†‡£ ¥ïºßC­Ýb#«•T7úÛ‹þHÎç2†°Õ °~çÕvº:+'VÏÜù#ÌNŽ1Oûˆžä‘Ôc×@g:R¸ÆÔeÏ =FŽqØz“ D‰úâœ%¿/ÓÈeñ•:$‚—‚ò:”;éÛ_Ϊ*u[òþ‘ÜF¡®ÙÃq9l‚´SÖˆôôÚ9‡&]&Í–íª[¶mÛ¶mÛö-Û¶mÛ¶íªû–mõ×ݳŸÝÄb7BØzY-¡-&M> EHyËOüsp´ãþLÌø`/ŸH x@»3Îk»>¯2 ÛtE!ì-· cu`¾xªjñ;%C’B äз+\kœã²4ÊT4–O’â:hOâ 9>ƒ\i® «å´¬~¡4-¡‘‚>‡cEƒði95¿Ðt¸.úl‹›ß¯l\¼1;Ûùw‡nþ=lUðuX» 歀ϣڀ¼ô(Vª°o Ì´±Úy†ã3xØâ¾·¢Ç®„·ƒ¿ü dfEÉ’<þíÇ^—â » pŠmkr=tŒS\¼ÓÞ›º.÷€o3/\{[OõÄ|†îiÚÏ–Ô:°¦˜ýå0@bx›ÜlÏ‚ËôP3¼þS0„Ê(@¿_  jC ”M—Ú‡‚¦ê/ci¿J ]dSêùõô§ç«Rx–»õn‡_ Uð/Y. K}xQ6·Ô9;­.ÝsíŸàž³yЦ-þS„tKõþ{þoø¹mY-yF—-ÑR6µ?ÄAçûü¯ŠK†3¢¶!ѽ‰0YXºÜDÙr?Ûwxâ“vÅ ð§ÂYÍbF&E³áýÇÂEÇ4S«zªÆ¨LvŠð²3&R}=øÆý×è þ£7ÿ†´$룂 sÒVAÔB8ÁÁXÏzD¿q÷kleÚ](„ï€F;¥fì1 ß>ò;Áå½q°Ç*&ÙÝjbq )g°²Ÿë¦–ÆnÐr2í3á6Ú ïß+ZL"çh­­øÎ®©¥vÝÝÖºÝAvý‰–HÓ±Û¯ùs“¯§·,OñÖ‘ßñœpŠ‹ÝíuYš‡ºæ8®aÑÂÔnYƿ٩€õ¹à„Æ”ÚlÝâë>í= ©ˆ±22ª¬.úß²„¯¨ Ôòñ,Aâ5 aôza³Udæµ²}kV‰¬û¸Åù£F9ð¾0t™Å¯í¹°ŠÀ[–1 uˆ^KU|Ká2ÈCÇuÿ’AY9–î»Oø|;”‹Ã—_)ëîœÂ!zoâøðmÓ…Î)%!^oøÉb£{E_H€Ûº™ß”V¨FKùúÀI­¨Ò¨>´) É~YŸp2-©‚’ÛêˆH‡ºõ(Ãñ˜²nž¶~¾²Ø°ê]|Ö$sýTš¥¼Ú ä:c(PôöÕv¦.2’ïåN¡òmJ1‚³‘¿k7<:ŠÈñÖfx*á‹:‹à66ܾ¤—A†ò!«¤{Éî@îÝ ™Cë¼c¨9ü‡™~_ÖV²P·‰ª´‰aV´ÞÅ<öÝY½\,1D¤òÁ¢·/cTάí­êÜt¬›?¬w›Le˜;á€þApÄêÐÉõoùr=•Ì L©P93oˆæžVø¡xåG%,S;Ù’‘¹Aצf†ªzbcW×ÊÒ©CW6…bŠÛO?à;ê z&¢Ÿëô%¡Û«£j=«*¶«ä{?ú"¥.H+K¤(Dxûè¡Î;M^¹Ž4YÎhA³O)CÎïSÕ–ÑÀ^M<“3H,#él×£0ð¼Þ"ß@;:8Ýørº¨ ~QK–V•÷‰-)è(Ä׸.d'qC›µ|Üh›¾’òÔ&U{DúTÜVñ·‘|1­4¸ƒ%ꇵ¡¦7Sicx,4~r`…%&ª÷/ä`6guPv$oêcŸõð0丹J$ÛÛ°ÀbšÈöíVŒT$ÖÄ'ªgš}_±x¡ßcöº²K4Mäö b‘i† \p f45v€Q±à[L-ÉËXÆ=kþÇ.ƒÇÿA3¨•†,D®"9>è¾<Õ=x«{ÅU-l€›Žm.‹ÛÔ”äI,_•¸îíeÅ%¼7d,Ùx] Ãv-UÆaô¿ •4Ëãm˜Q/uáp–]^¤›¤ÀK±´UÉÙݾ÷dä(îµEü3]Ÿ¥ˆIdeG¥Z×ørQ!,c¬9ß½0-3S¼ÿqÂ*঩tØ2r l‚lúaŽPûÓÕh¸° 4ÏovŠü¡&R  U6½Hw~×Ùy÷¡®wÑ—³×î­Txªo¢LàâDãyêSÄT[§Ú…†ÆÒ=J(P1ÍÀ÷"JSönO6þH6$ ¡@·.[Š$sÑë o¶eÝâ ÁãøTƒx^*m,, WœøV!…ï44Xõ@>a•îªa›õ»âØ @¨OEþñ÷;u Qzhè¾»”YÎÜÁÒ 1°^FGa'Á`·÷± ¤9µ† ¦è\iTªôö®Bø„ɼF%m =>!¼{f(ŠÈ×­¼C""¹uè7ÓxÚk¨2¦>u"­fåòQ!©=ôBqàmN¤Åµïçönv¦Ø /ù%_&çAÕn3ùÿy’ÒR „@¾Ó mlC²µ3„2Up—ÏP‘á-”-„¢õ!€–éÜuˆÊA£Àg@yÑ-5¤¶ŽÞ©úYåÅǪ{etâït»a ¤òŒ·b¤‹'Ö;h;QKIÖ½ë[¬eUù$ŠCÊ‘Áî!Â_- kožª$Añ'Öê»–’ÌÝ?CŸ']OV”ÕH7{’a^máÁ@‰k¿lžífx•j3Õ¢bß&ÊQÆ«T)¤ßPÆÒ1/ Ú>Þ£ æ&©3ÛB å„ò|*ȼïoK9‚Ç@‘#3Õ/¨k#!«¶öC¶!´‘¯=+œEáÍ¿„‰3©ð“£…ÃŒl¤Y½( w+ÛŽ $ޱáç5r‚PæõwÈ·»xŒÈú"~‹$3ÞœùOòüÖ¡ç…Í(Oô+æ–F@$EäqžN|ñœÄî|þX,M(H0ò¶IOHZFÿ6®7ÖD×|JL£j0ÑY¡–ñþ$³È6÷‰…¥ß~ ª4­ò¾)y•‹Øœ¦Õ'þ9?Ù>·Î‚y¡1Í_l‹§R^Á®’Þ=HäSuA‹–ñÎlf’Y«ç}ÒäªÅí0G¥o9f¡D¦–aHïoߊŒK}u}‚˜sàcÜ5¢]bó¦hÂí£$J„j%¿ÚÙùÑmWXNT ¦x3¡•dJ¶Çó0µî±1ÑmãËø•DˆUñ>ð6°ò¥m»« 3¹ÞeSŸ¹êò ¶>rùc;m5› ñìêísk“O}ÚÿsnÍÛE‡ÞûAŒ§1Õ‡Äc1ÛbÁš\]´ÿq—6=ÔhçLͶ%AŽÎܦ7§¾ýè¨ãiúÅáˆÁmoMÛ¸qxì-ýˆveºG ¶q0‚™PE0Ë$¶ÂË}]€‹’Ù©;üÍO VQM#‰«GNUÔ9/×Ûºzr úb;b”‘§“ÑoøÃµ+x’¹ÉP›%Žo_54ñˆCDK§.½Ÿˆ#¨™ýÔ¯Jtüó4)ih¸ÉPI¶¤¨@@tç(¿NÇÄŠ´š„9fh4ÒqÆ”€)•tô¦×Âa$j*)§AnŒ° -ü¯Ã¾¬Çúé‹܆EÎCÐ$ Vþyâ,¾‘î) Æ4#A«"Iÿ¯7Þ…øÂã˜nôÈŸåW´AwYvÆ‹ ªawU {kc› 3öŸ}¢÷„¨n63Q%7´-}ˆsiŽqHúþ±Dv¶äôj‚I/™Šù‚B“€nL5ɸVÕr‹õWÆ9ŽìÞ}ªü[1ÛbS¼~ZÕOe˜‚œ½äž-R|ýt|¢m¸`Iõ5 éƒWÉȵ ‚¿ÿ7iHçZOÌ"âGƒ1è¼ñõN=äG:UgŘen:÷Ô}ô’pZm¸ì Õ)z·Và”›Qq+3€ ÁâuÊ—/iÐwXTîõ2X ÐÔ}NœžŬ¶á^š“¦[SmGØ#ÝûâÜbX#Zb_výSW¸¡)¬9•©€üyÄ^È)(j± =vu¼>H`oñ3Gt¢ñ0SZ÷y æIϬàía`FùMùºÒyáMö£K[§--.X„v¶L&c¦E§F;öÁ놼5éIJCˆâkÄj†ÛcL·¸u÷U* Öw•Ä ]ì(ð`ÄX‰Nfp©X-ªš²k¯€é‹ª§m'Ňé¿aöÞŸdjB)ºÎ`ï–jV§ÈúÑ7Æ:¢§Ð\1wuPjhrâ»Ñð0Ü;µ55ÇÁ¶W°iùèÐ ùáéÎ%iSˆRœ.Pf3±îÀ,¿qS•ÁpuÕÉÃFI†í³& Æ&B|·<šÆÇ­yGèQÓC„=³Bý­®­p­‡³¡ç-®¦0…ÄŠò…ƨã6qmSéI€^L*k—”Bžlýn7îtæKR™7/) I©Š^m,òÂ’)•»g[%ÑÖ?Š8_<íi„E+zCÓâ,’‹ävt(­¨8 Ê%ï:ðW—'n§VK6« *êÄìêGø‘Jšq¨v*´n+ÛáK„nE£ó ¢ikn˜‰‰œmƒ¯aQVÐ t-‘=?o(ß@54âLµAòò–“RþTŠs¡ç¯,&ùÍDþ¦ÛFFŠ–µñ²ºäXözoMÊ°ÖÆ,¢zöýÖHvèŽ3–Ö­ÙðÀ«ùšº”wr?Ø»üð£kLþF¤ü^BÏLéK®N8N$`Æ·öÅrá‹õR8‡:y¹ß®ç‡+’`fºCÊ’OBOQ¬eF ÑgRe.È•€qs'“¶ö„ç9É·jÔV£Ê2HYwÄ\ÞÒj‚a:ƒØ´ÁÒ0á&õö3–ëþ©¦ýyíµÖ•å­ 6¥½;èîM±/oµ÷›žE^òý;·EïøœC;“°Üþb =.î‚$¼›S¼ž„fî¯E>‘à·ÇøP³àÝ…Nó;˜—–êy†}Àþ¸é¡í>.‡mo•ëú&)¯עǧ=Ïšê¬Lo%§= *zUÞ^¹dG«Ç—æÛ„ðÛú<†]yçQmrv?lQ #ÚSþïï~ñȰ—ëd‡ä£wþ¢—G_[D×yχQUk˜@^=ærÞn&Iš®hGç_0ÍÕüyð!¢¡‡Écê‰%^„[D§OÑ#Ú‘èç‰2$Ogt_ÑçtÕ¸U¹ÜÚ£Áß0çñ–E"RZ¦f€e¦K6w¥ÁÐ6qHbƆÞ[aY^|vu÷ÌeðvÖ‰é„5žk9[ñ¡9û¿VËÖù|ûü3‚ø¿°³…³…Æð'ÊÇ^%z¢ê*ÿDc4ÙÍžP ‚J{‹Ë¿6Qä7Øîdgzºbç¦ö9¦,>9¯°Ͱf‡,M±l„晕õ d߈¡ü3}'w¶QéAÜK³äª«ßcŠûÊ-vÖœÀBÞ㻄©o³D匬/Jà?‡§öŠ} Â.ðßs‚×€˜±Ú»›ºñw›~„–Wè¤% z ×”½ùbíÑ®¢çB»ŽŒ4°S¶ðÈ~H¹åAótÅög¯y,ºæÛÓÍy´ÁC@û´nŠ+Ѝ ]æú3-œ†úDñÚæOM0 ®$#ͺßyÊ Ê·<Èß¾m ù¿)Á¾«±à<~2H· :ߎ¶¨7}Êð*óŽÁ%“aq†Ñª¡QÓ”fÝáå¶TJ8¦ù«}2Šq|#?cß;òEÕCz.ɤð-³A–÷ÝØ‘*EâwTÚ,CËÝ0v.½ÉN°àÜ-1 ‚޾0ݸ௩¼†à¹rƒ¬z)åɹôuê;ÂL'”‘U(Ê9䃡Åh LÊhd\gˆ1Åh/¸ Õ¹¤M¬Þ¹ï³¬Ñ ;'ußmÌô…¥}6„ !dùì€ Nb}æÆV1ó=ÎqçRä•ØÐ–9É‹¡úëˆb¯ecˆÏvؤhs½WŒ×Qþ) fá†¬ÜØN°‚Õåꘗ½ó?cŽ ®Ìºénm@‘ÌTEž8»¦ì ò."¦”hFõ'!DØ{— Q>±Ñ/ÆÅ Ä^ÄQ‰=zN´Û$ lÕc_½x¥ßÈvîùö îp#kìîf³R7çä iTƘãÅ©ÙKA •¢ ªRŒÉ ^Ô§@²Åo^üúpè¶3™@E QwÍåTAšj\ƒÔ¼X¶ß*®e)Ôcßù†8¥Oþ©øÍô¦7è_lÿú€Y±ž÷Ó¡•rk8TX2fŸËmm[s7¢Ñ®T‘ó…Í;ëÛ}{`ˆî9gÎÔIAêñ&Л¡e¨(ÿéàbf^¬‚=ãõu.pÏ‹ë§Î+r{B)ä6)SÕ>ÂE¦“Fëg×vÇ…J£ÌŸJ™ßÕÐjÙï;ÖQðvT‡ç_>´¡Þ ÏåM|¸ÌÚŒ s}Ì‹vÌõa8®Š.xÛD×]/ªKc‚Š$‡ÕŸæCÅ=·úŸ £gŽU7[„!èåÒ ®Óá\Dœ:Ùãi•¢üú‚+D7ÞÒw,ƒ “g¥ù¿R¶O âÂrA7Œ»y]…Fd‹ÒêØ Èmæ"piPXjáÙɯ‚|ØX~¦j¼Å­Jòò/ì]FzÅÉ[•à)þ Î"­†¿m”Öò¸—àª=Š@nQ È|‡.Õ½ÞâõXÊ{ýQÜÀÁ”Ÿ1 FÈ~/œÜ>ú‰Åëo4¸{ óõ÷ÇĹ²±Ã<þλ²ìßE|XTöŸ÷ ¢Èψ91€~l²ƒü¤T€`tOY§ËÈ$®‹šýD~Ô1[ßÅt·-Uìcíe,4áÙÇüæåïá#rÆ}¾«Và”<+_ žˆ±:g'øoÿã<•šÀ·Ÿ¸Ï¯·ÙoÔf’œ0•Ñq×øðÝ9_óî¦.9ï—Z'IÝGòð])[€®’ [K¿Tàòã§y/HØ\-–íý¼!Æß=m,Àf¯T)M“ò…MÚ™ßÊoˆa¾_¯ÁÞK@ZQj{$œjÜ.Ðf^ŽTSÝH/¹ þ|T DM ªŠÆÒ¢<°±æ ?œVa㑃d‚̱û!|rY[cLãIÇ”]ÞꌼçUÿõcRºdq¯ðùº¼ë!n“€RpàÔB¯‰Lפ#S+ýQŒ,<7ê)JS¿4E ¯p ÁœËÌ ïÅ_ý ~‰9núÚü¤_gìËQ04 ‰µT FO(?’ÐC®)·¹œ¦]fkL&U5×Ð21yµ¯W÷l!c¥äå %žˆï2Ÿ¯µÍš¶Ñ%VØO 0Ü“NþŽ'A»¾¼’wkp¼FUg«½ÄºuF³<îQÚ™Xê6Ê`¡ñÖ’Þô!ÂZòv½þ:RD4æ†t¿ýæÍãaÑçîÎ<–ò£xVNc¢¬žuêìŸÕ]‚ l kà Y&(ª§àÕ8åAŽÑµ ŽmËÒð1²¾æ;UŒˆÔ|Ÿš©°¨>SY±¶sM#{™È)C–j%I‚#¯!̤1˜rý““9¸Ÿõõ4:ÝÔ2«òµ†yš°…ô‰ùX!µAl8L)“þúE…ŽjZ)xŒÖü™#ä×!ì›(ŸÂísòŒñ}hNÑ+x[¢æè²êfÀ¢¼äÕ1ZÍýbO¨´¹ûúO;Ó@”•púY–+AÇùô2Ó#R©[Ѩÿ¹Õ®&¥$d°×HH×íH}N·ò-hb*qå2ÖÓÆ{z¤vüjþ;8Ëw kVìÝÚp9 iÅ®g=Ãö*ª€D!‹xŽýÃøžyr&R©‚ÐjýØ—Í7nGñÝaß`¹ò›öNu¬†¹—|é¤H<1±ÚßPzðq;ö›À#ºn×ùòˆ;| Åz¿yÃ3!ÃlÞùò%ÛÕžc/IJã&áN» Ø‹…±îz Ú‘vg)ª~K±—aAûŸR¾§æšÿÃÁ·TIØB®dO‰ÿCŸ¥}™™®ÒäâC×¼ŽÂ¯˜°3ÍV¥'ÃßRi±,l‹†íÉZNF*0l0=6Zªô-Ý=e,mh#_ Vò…WýÕ/¹„C? 5BÖ©S0`žô•"#M#V~l¨íÞ|™lÊ?Ú,Ó¬¾Iýª2*Ø8ìo𖻸±¼9a}-‹Îïý–€¿çÛb+®®= è3"Ò‰cÌÊ”V8‚}š„û>$š Oë1VÉIN=pbÀÍYT¹GôÔi;KeIôôI«IVGÁžuÈÖ|Ê÷M6SÇ',kü‰ \\] ¤£/‰ZUIí­ñ`ô5öÿŒVvbCC:‚§1ŸM8¡Œ”oÔ*¶€í·},¦?!Õa.­Ó ž1Gõ$ЀZIЫ¹@(ô‰½¤7BxÛAR—󺘢b.»Å Ù§öOE`¢â"xG€èÌÉçʸ¦Œþ¬XþùFç ó8Ôo/¢ ö×ÿ£ KMÔ컪Œ¡.‘ …À  T´Ëí鞨,ìr¹g|·oeúÒíXd “ý9?†eW²¯Piv8à7¤¼IU¿u#«k€8þJ5ëòv´JèÛ8éÐ\B žÂ4P="’oÚ4³gÐÉ¢O&óe–uòÂá˜íM$—iB«Q«wónIZî÷¾&tÙÎR–Ý^H?êðz*¶2ÏûgþÀƒ<[ü̆Ðg ÅÓÓl5#¨w×kõvîÔÍ£–g€OyvW†¢øŽŠ§‰ŽÁëý@t ¼€9"Æ%óîfFLµôþÝàOA©·¬,Ö5óS"7WÂ?«œ‹°žÀNåC;!_mHU0«õ»¼#iT°NV¨*jù Ê}üøÜ 5†/Ø…9i̪cŸ~²EJøÁ§½ËÈ(ÔUÔb!I@‰3˜1¤=*ð1ܲÈÛXzë=ؤ¢CrL“Tûeä¬p0tš|X´´ã­ê£ÁÄ—9J‰n°ý4S8z"·4¼uyv»ž{•TX@ÂÀ¨›öûäú7ô<-õÿh jü4–^áZ¢5¸=yZº–¨S®j¸É/³tN1“AJ¶¸w=Œ :¬‚±mÀÅe Å­"ä5…Áåú¿žN¾êô9¹|ß“¯³uªÌ¤B•KÓˆ‚Ÿ 0{Æ'‡æ`8ÈÙ±7ðèÇ MI*u ¥¸4‚Ï"¸ÊÿÄeCQIâÙ9”)Üwà™SòÄå¹ÿ¦ûÝШÂ.ïÌÒÙêáþÁ“åÒêJ¹…˜zŸä*ãô)Cý'Ôn³¹åLøà¶X#ßÈ1YóÈî}ŠÃ#¦Ðl¬ßäEN6ÚÍb†x‰«ÞZwý}³*ÆÑ¾y¢ 5›Ë  ö² ¥¹ˆAè°ô¬Å~;'ýSÜ4eæÚµu7ÚLÈÊ“Y–맯&J°OTUJ2Nm ¿œ „¡ùà U>„€ÑÛŒ&¾× @v<Õ ÿ)èW-§p]rˆ/Þækìx›6Ÿq¶…#”÷ìãs3ëw͸ߜ»a"áñva‹ùö´,Vzö»Is¾áîÎož[à4½¡.9És Üï5öoéëGƒ&Ôe™ànP÷—:‹¸” -…ƒý-‘•ÿF€¬EŒ¶k_H6V¨øµ5ÒáÂQÓ,j> <Î;li=üÉÅ\ï¹ ¦Óo15Ç®´b3ݯPÄq÷þ’™LL1SÙþ#‰ Òžgª=ÃÁ­ìv"p§Ae&‰ø+=Cà3Ñ\½[ßv(ÀpDŸï,J\%Sfý#•‰þÁ#—wÆ2æ¯`† ° 1kÞ£G­¢n‹ó…+Úüñ5Û¯sl™¬ù3|wô°Û|aŒÓ*v"øWÞ{"åךƒâæ` V„$Å÷1ªþû®Ñs%˜J `»å¥’Ï Ý¨Gì—GÌ¿‚èüäª2Z´!'Ÿ'¶\D‘ØÞT‘$$|¶idI•jJ–ºI­8J¡g2W‡üš‡Ø|JÇëV º®l}(Ãîët¾T;Ýô‰nnÏ„·Ž Õ¹½€e6h'³¬"ôW‰¶#ô¿­ø¿Hš¸üÆãI K{Îq[Š™-·ûJ(pùègRUc²"+Ü%ø‹r¾éàírZ€M¤çoàôÀo×ð§íÅxÒnõ3ÖÚ)QYû̸dŠ6è"q‡ŽOÀ7©Aœá€ëØ`éIø¦ø¯¡6ô=†ò2ïè*†¥ŠdùåÀlí¿9ô§u’vò)LAا²Ò°2©å”?ÙÁ8¼Ý¼dÞ 1làB¿w¦13‘šÔÞ™ùà«»™AK42i—¨°º‚“D¡=ÍÙ3—`UÍx#îDH~¡¡ïÁüÜž*Œ'¢  éÛX¸¨”ü5ìKœI!q«î‰`£ç¥<²|ü|"·ÄàðMÝRƒ•¤iêîˆ|˜ÚYÎââjÅK®=šª©ûãÕX·¡ £_ÆF«GúâòP½w5ÚÛ%]Fzá—´ª0@s:9Xtë75Æ^R†ÀK¶Ñ¿XÇ!#° Ðh¬KÖÌï„ÎöÐô5J?aG5œ¿ $|~ê´)ý n*n-åé= ºtÃŒËÛ. fu‡g;ƒÅö‘¡óÕŸ”¿Ùsߞɗ-.˜_âlz§Ø/øpÌ‘‡7Ó jŒ MÄH² €fÌX_™úÆ pŸbçã%ˆÉ\u–—óRê>1ZñxÏãKñoUÈC2‘¬]ÄAø%+Ü!‚ã¸6"ä,ï¦ÚŸÛkqÁUIÚNüß|éê?J]A2“¶rþÀ´"±àDrâA5c ÍH J­`º·b}üêÚ‚dõûµãkv"›"ë ÑºwoÔƒ &,ìýÕèî- ë÷B‡<i0I”ã©«*IûMÙÁ–t­…•ê Þs!ÄÎsIû«Ümy5©uH8è࣒˜t„c†ü¯ŸÄ/R˜X¿ÑÑF«žÉŒ¡k_~Cè[ŸQE'ˆV $ë/‚id¹Ù€ t²´X+é¤-ùàUu Úgþa¬;›c7!Š t¬Ú8„S[çà^†ÄÖ4RA|«ûv„ªgbB¢!¹•0«¥-¨àZa («$8l7— ºj‡üô9ï‹Éoh]¶xâà)1©¥ ð~|~¿’â†Å ÎW uÇà1=ÖA/2÷wyú}Ú‹Çup¾núì„Ç‘ü<|:ØKG-Æ‚Ôp’ÒO¥•]âT"XˆUd¤]¤Õ™ÞÎâ %K9{Ë(bÿT×õÓùçÒ´Zƒ YíülýI” Ù ê øYĨÞóÆI×6i'#ÿÝ·iõXt’ù ¤j¨x],%Þ‚ÂÚÛ$åÀ–Ž0Ù ›Î~x@ GÄ<ïcí±zÅÏÏÜ·>t¤”ù=¼MY×O‘3¡4-YÈÆB³Lò&¼åްµé'éÐØýÚÁSGžgÚû §gA]$ˆ‘ *:k7U8 Ò§»»×·î\Ò¹9ržP«;?¾V;äl âVÌ8T|âÍbØÊ^ßkÌ=zbdµ¢Ì(DšñoéÐ0E€íPn§™FPcçÑ,§Hrô@ŠŽ~Vå`jmóÛFøý”‘¦Ô™îi7MÉXÊŽ°™½95¹MZýu«y§™•Vã—´ªŠýNöªµåá ’a•ž‰ïøŠè<4¬ƒ¿%Š8¬Õ2âeÉ3κj" uòÁøÖÖ³q7µn{ÎȆ$­b^eroØÙŸÉEåQ¨›QÄ– ÷›Ãõ±š~<`!¢‹…fû>QýṖšP‰×¹J.ö \Ž|÷Êò¤ê®/ý§ÌA€Ø­É­â*LáçñšÜh’Ž/6@άF% šG”wê9<ç9ý…œèû|ý~0 '­‰7R/‚BÏo9Å)Ïs6@ǧ|}¿àb±»~§íHþ$zt9E§†Z£ÇÑ’ñlnµ¬1D±W6œÙJv½ X‡pIýežq–ÃudÇ¡¢Ã绾ÿvú²ëB~Ú6Ëô…àSð”Û׈œ2ÇQ¯üÙb‚‘“Ò[©Öa’s~¾ïoOЛ.ÃàaAU…XNpœ*Œ7øë¦\¬:J‹Ä1¿ƒÞ`P>`iŸ«ü°~ÝÙÁ¡†ÛÇšÏÛŸ¤¾d¸áC·,Y4B—Æ&§æÄGpäLUR^BiSËïàB«´]?ÿÇþ~×ói<‹yT·TïXŠ·çÖ¬îXÉÎ-K¡¯4KÂ!ÇñÊ8©ˆ+T2-m³9@zþg¨q)®?®½øêÑ?ùùûjؾ'ïVØÄ)ç—Óogäñ¸.Ľ±¬§1;]÷Ðï5l’³Ø}1+¶Õ…}»ç /˜†”3£ó -|HPC@f ¸LzÈb›-£ÕZ"ÔÒȹ†€‰êîgó‡ …z(ížä >1ÄRGý¦ºnŽf]b|eS%Vpˆø{ê9ØX3¥Äê@^ÜJUƒéÀ·/ŠY†õSt0²}šu‡<Ù¢íÂv'ú)Å[ ̾þ©©fõ«vbÉ/LG[VZ¢ô–ƒìçÜ•"í»Q±׿ïêvMâB-ûY—%í¥gW‘¬4.eMÞ ›ç xÙ^©äþ»I¡³&R‹2qұʥõþ/P\ýÏøgødHc:3RÄo˜k…7Ä×ÒöA:³'®Í›^x±ùyvlž YŠ–=pIHü7»K¥§íW3tï)!¬½:AYôª8Í« zÍ|Ÿ—l'ªKt™8üu¶’#âÝla5Jø¯ûërf0_W±ú_Õˆ^œžLJ"²³Æ1ÝÚ¹jU¦<ÆW‘Êüß|E–¿e»àr`í¢Z¶÷´!Ñ«ÍgËѸNÿ ÛP¾²s£T÷cÿè>«B‹Fë}Ø´AèœØˆñ&rFpáþ%¡ïV+ê«jb&Ï›Œ¦Ö=ìÐ GtºiÉ!®%Í©=¡%ï@þ;ŸŒiââîøcçßgA¸Ç¶Æ-Ö¨bõCƒ ¼JpìQKï~N­o1˜'•KøÐR˜Îä$rZ3rˆùtõ6нks Í\xO¨’Ùføë÷CPÛº^› Ú爦ÁVÞ§ÊÃSä%1dÇ¢âêÌÉFC¨¥û·k‚mš²˜uÑóM¾@|®Ï*ÿœ´}4ÉïùcµïÊ2Ð k'•¥œåL$ ¢¶tuê˜éðUX »OІ(®Ïðùa€wCá²µº™ØFÐ+ÃÇy/ù÷™ˆ½átk"v¿x`@Ѩþ}ßÚÚpCöÒݵ« Áº;~òôëx˜¡¼¡(®8dÂp'ìrªj)ÿؤ…•ML ©¢ƒd‚BÔ`Íc5þ³ÞXʈó<Ú*OWÙ¸Õ¿äɶ½²CÔˆPˆÎZ3ÇJ€J{¯‡\:ÆIŒP¨ Ô ‚²è©¥®yö¹ÃÆá,ñ»ÍKóaƒµ€eŸ>ŒÂL£ÆaˆÅþ ¤¡¹X!Ûëݸ›+Ž’ùÞ‘ Š_ÙÛ’éÕ£q0 ê ó QÎÓÞs¢'Ýì¦uŽ&€ M5»E–±aë¡£{XZÀ ã‰¢V¬þÑACqmÚZhÈüTêw\‡bqÞÆéc§8<Í…w1‰ý ÒŒoLe¦l„2² ¹]åÀ¤e؃ïúÈݹ7 šb׌ҡqO8ƒÄ=¡!ˆC¡¼%h"=õbÒ9Íäqüì}ý¼lÌ=5Ñ‚Ñ $˜FÕ0u¯‚¨apº|Ÿ‰š\ïõ/”&LãþH@voâ*ØE²ñ¾²d*xBZŽ_Ü­aqåJe5hR„BÛúØSöxfk+Óè ËKÖb£ÓÃ$Í\é{â€ÔDâÀÚõ?X±•ë#]ZXÆVp7"´„B¡Y“&Æ¥v™wUm­žˆ‚¾ ý“N=FÍ|NÄÝ{Ï!=@ê%ùlЇZnŽø*úɲ7Œ)W½óbÚL¥å1Ha8uƒ÷ÅéñÛjŒrM{ud&G·M„ €ý[µx5Ål^8Þ´Ìb<š9øŒ?n¾N¦®†- ÕS+ªôTËÑG}eìRd¦gçj|‘w¡€øXÒÌ«íÒ»–„;dzuø9>ó5Þ„í8 äõƒ]‚ÇêP‚`)=úò@LÏ÷Ož62¥mõú ymæx7Ùê)غÿZo®Ôñ­¾öI‚Ÿ·~OŠðJøE¬çwoX?ëaœeØLóÔÖ öñ—B—\ó$xÚ[h³(‘"h¡¼jÄ- ÆPu*ŽÍþw2«p“ ÁËçs%å»~ƒ£Õ•IKí¥û£&7kâF=7Æš@ŠÓRŸˆ ÓPd%VsèºÉ,àëÊ!Ü =ìòjEa²M ž`h_®Ž8Iìª%„HÓºmÞôC ú h×ZMb8,ƒõÛwÓU`ŽØw[',.Dc+jîܲ ñœžµeÖ¹(åx"#|£¿~Ÿµ*eˆêD!úÎíN\Õ:è½Ê¤Fh™ãiãÿ½“tc‹ÒûW²WÛ¹ë'\X* 6W.$ºmKä7y9¯Ùl2‘n \ï»›@ èv¸JYÃ{‰ŒEF8p(bËhçæ#Ú÷¯L`áØ8-Û8kËà,!<€åž^!vóãùh„tÜÕø1kÈT—´¸Ù¡Â>YrÌj£¡ ZT£MÌ=åÞ!à» ¥­‰ÝÙª£ïÑ‘±Kge§=»U7 E pŸWñۈ¹ ùÆQh|µn$â†ìÕ wùÒ«™¸ .ûx„BÛåÖ\™aµñM¨^Ù™G÷ˆV:øŒ9ŠѰ?øü+•³êò‡T¡03y@žžŠøYaNï?퀢Åy—î~~#¹©¸ÍF~ýÄúæ cV.ì/„}#êŽÕ!N Ûû ‚ÛÏÔÌ“Xw?À¬7úQݳâ5xãÆ‡WšÈ1¢©ºØ¯{×¼’׸a@ÉŽÞÃPÊZ#¤ æhZ›Íž"ÜÚ™Ô†Z ó%åH $¦ç¥Öˆ2]|(’ U4M/% Í/9ò¡5ô$Á\ݲsÕà;¨òÙµ]ºˆÒÖµžæl¶ îÜ ¶×UL‘ƒ¤fâ(6>Úÿ|”öó ÆSnp›¯Dàò þN™Z îT=®A™-ÿ$â[XD?]Ax˜ {ö(n5Xå¨@¶h¼¦á÷(«øÓʾ/]º*Vc’ÿçhž.m‚ÜN¸ÊfZV wÓȉ«#‹f5N­A+ºP9ÌÃõ6XÏ<]!Ý¿GŽ ø´d&—ò1*鎒¸bÆLµ³˜î¥’· ÚmBÀ´×>UŽÐz¦!"‚dð³øRÃŽéEޱ²cR8åè;7³½(]â¦AhÂúS÷^óXë¨(NÃHÞþº”ß+vÅשIgÌ®4U‘ýé rr!¶¶ñò€frÿ›™;t@5–Û‰8‰þ æZ’²!‹Ð…c´#½_9q#¾³2œ´ÃÅ$š4_‰{I nÑÏ #“ÉsMÁs—Ñ\&üN½šÅ2”5x¾ƒÐ[ü“Œ°ÒË–ÃFífë D°2_èZ¼>ð‘­Wîþz!„o²1:È£ ¬„Ó©ÿ2Ý­•¸—Aý ½Ž¥Zat”³˜–‡>G FFè.d«SxÒç û j$2³ ²EÌ|øŸçkVÄ Ÿ¤ÖO·!vTÃ#y£ÝëDIc…ê>’¨‘'²Ѷƒ13…oF3ûÊ®‡KæÒpó%ë-õæq'RÇQò# ¬'ÖL˜O4é®}lSõÆVï1|?ÕÕºÖÄJßË«¬Ðöþ,dª·„L?dŒ±Ù¸Úp;•+3h »XÓ|;ø^bl#Å:™ükl§;† ŒdjèQŒ,ï¡Æáð0‚Ž•4{'/n„UôÀ68 .¨Õí^ªÐîMÇnu5m)ÿÖò÷ÔN^L“© 7Æ(<{ëuÉnÔðô;ú—·×?Üj’MÜ*6~‹s†º3ßËWPNÿÒÖÇWÕFp˜,tvꇗY Îô†q°cK/P¹áb»!KÑ ›ai~Ò³~¥°‘ý&{Ò­¨ä-Ü`"™ÈËÖŠàM“8 ª*+ÃhÜ.ÄKáb@æ‰ü’OvQ~µž——ˆ3æ´0Ñvzg&û§ë?«T‡F³†Øô¢¢yxb“ˆAË©ö‡4²Ø0|›¬á„5»!ѹRØu*äˆõ™¬?ßTXº »¢k‡Ç ¡ÔeÄè‘OÓÜÐÞŒ…p—ÝÁ]éwîk—M•˜îß#±›dýtˆ )A4¥ÇëYËE»Éæ‹@Ê¡¸ŒZØM„X|T)nŒ"%ŽÎÍ¥°½¿’&¿.¾êÜ–(¤¢R sýªx’s³Q?(1ßÍêŒìS®%ÝyܳvqÇvË®2•âÇ–쪦LïŠsàÆ8ŽM¼ûÒkf*­AÍÙµ§7wÄêFñåÉê\fñ`åÁïøÔÁÑA›($²tïèMYÎ+t…8w[x‹˜^x–5Y“Œ¤3ÒˆLNVaˆYéè}Ý\ÂQ™PX’GÁ5†¬w¦ÀÇù2  pI–¿ 9›+«eVkÇ@mTÏŠm'šé~®†³Qð´dXN„ÅÚ­:v ilóÞÁCúöJ¤Ì’’ý]aZ/óM[Pì!& Iýžxäiæ|NDF•NEeÃi´Nmzÿx”Æ¡Žh°NÒê§úË_¨öÌÑÌø‰'éW¦ptøŠ5Û=`ÅÉ  ÇEc»­NxA(tÄtÚ“³ÈãƒzøÊÖfxD×ïUæ‡Åí{˜Äõ¼cT…ÏøÈ°` ¶žÏß²®ý…†žpÁA>Ö–úŠÃ“Ÿµ7Vœã Ìîs<ÿT f'+Øb0é¨mF²cßáùÞv_öPì;ŸLdþ'€ŸÌC„p!êãÿe`þ?àÿ €‰­™‘³«ƒ‘³ Ì|ŸÛN endstream endobj 457 0 obj 31862 endobj 458 0 obj 777 endobj 459 0 obj 31214 endobj 460 0 obj 531 endobj 455 0 obj <> stream xÚ]“ÁŽ›@Dï|ÅäispÀ˜îÞ•¥•£U|H²Z’€apb@ü÷™¢¬”ƒ= C=JÍÇ¯Õæ¹›°Ù}ÎÜ[¸Œ×Ù‡Íá[=%éáøå8ô‹K_çÑWaq]?´óýׄS?$Ûܵ½_îWë¿?ßW·ËÎÇ¡“²té[ܼ,óÍ=¬‰Ÿ’ôÇ܆¹NîáסŠ×Õušþ„s—%û½kC]¾×çàÒçöëè7ñÖ?oSpùz½¥ƒÛp™jæz8…¤Ì²½+_^öIÚÿöä~¤éüïzNÊ·fY\"?’ÁOä§ÈÅvå¸DÎÉ9xGÞ r²€•¬`#˜Y² fkVCnÀžìÁ-¹rwä.²ð]ï"ôx =žBO§ÐSà)ôx =žB7›ÐGà#Ìä*ûQô£ÌUä*s¹Ê\E®2W‘«ÌUä*s¹Ê~ý(Ê~ý(}>Ê~ý(ûQô£ôTxû1ôct68 ÎFgƒ³ÑÙàlt68 ÎFgƒ³ÑÙàltŽ †ð>mG|(ïãí¯ó'ýšÖÙÆT÷Cxÿà¦q©õ÷iîë­ endstream endobj 461 0 obj 458 endobj 53 0 obj <> endobj 463 0 obj <> stream xÚ]”ËjÛ@@÷úŠé¢.\K3÷ÎØ` Á¥Ô‹¶!N?@±k¨%!Û ÿ}¥9"…8häœs‡Ü^‹ç¦«âÂ}ÎÍk¼v÷¡Ž‹Ý÷²Ï–»ý—}{¾™åËÐÕ‡x3ÇsÛ óSÅÓ¹Í kšs}›)ý®/óˇÇõ/ûöØe›Y¾Ž¯·áažÒ_ü”-MÎíÉ<ýÚF>ÜûþO¼Äöfòl»5M<Ž_4ºü(/Ñ,Ÿ›o]½þ{ðö裱‰ ꮉ׾¬ãP¶§˜mòñ³5›¯ãg›Å¶ùïù*çµêXÿ.‡t¼ç¹ ÛD´‚jh ¡:Q‘C T@²Ðr‰\ T@ YÈC @+H¡5ä!  ކ‚GCÑ@e"Kƒ£Áb&˜YÌ3‹™`f1Ì,f‚™ÅL0³˜ f3ÁÌb&˜YÌd6‹P1yaòkÁÚ1yaòŽÉ “wL^™¼£Oésô)}Ž>¥Ïѧô9ú”>GŸÒçèSú}JŸ£Oésô)}Ž"¥H°V¬O§àéñ<=ž‚§ÇSðôx žOÁÓã)xz<O§àéñîÁs‚µÇZ¹Ï=(÷๥ÈS¤ÜCà”¾@ŸÒèSú}J_ Oé ô)}>¥/Чôú”¾@ŸÒèSú}J_ ÏÓ諦";ý3'ˆ“•BóÉ­Óš7Í´Š¦Eù¾Þêû0Œ›/mÓ´Û¦­vnãûÂí»~z+ýü¯Sï endstream endobj 464 0 obj 568 endobj 462 0 obj <> /FontDescriptor 465 0 R /W [ 0[600.09765625]10[289.0625 287.109 287.109]15[308.10546875 208.008 308.105 569.824 616.211 616.211 616.211 616.211 616.211 616.211 616.211 616.211 616.211 616.211 308.105]32[616.2109375]36[699.21875 567.871 716.797 678.223 534.18 478.027 819.824 713.867 238.77 313.965 610.84 375 895.996 833.984 861.816 502.93 861.816 541.992 559.082 470.215 685.059 624.023 1090.82 563.965 592.773 585.938]63[569.82421875]66[500.0]68[577.1484375 577.148 476.074 577.148 519.043 273.926 580.078 527.832 262.207 262.207 470.215 227.051 768.066 527.832 562.012 577.148 577.148 334.961 398.926 240.234 512.207 462.891 759.766 498.047 498.047 519.043 333.984 569.824 333.984]178[500.0]180[457.03125 457.031]183[289.0625] ] /BaseFont/GFEDCB+FuturaBk >> endobj 465 0 obj <> endobj 466 0 obj <> stream xÚì½ |”ÕÕ?~ϳ͚ÌL–I2Ù&{B€É:!!È€IHB ¶°Vd”%AÄHÕºáBQ´®‘%& ¥j­EL‚A)Z´•VkmS_k­õEòÌï{ï$CTìÛ÷ýü?ïçÿ~>Í8ß¹ó<÷¹çÜsÏ9÷œó<ƒŒc¦àÃ>íÒš™¹O|ÌÅá¨÷ŠÅ ,Š™ð}&¾Û¯XµiyuÈê'ð})cãÊ–7\±úãØ¿v3vI;ÎßÞ°~YƒüÂÓ“_À˜´tÕÚ%‹ŸºáxcîgLÓ°¶±éøŒ3?f¬üUÆB~¾dC“û–‡6%06c®?±bÙâ¥ϾòjÆfÖsú53gTÞ‘õÒ“ø~7ÆK\öƱŒÍ>€ó©KV/n¨Ñgýßß`Ì|ìªeë×t?vø¯Œ-½„«olPò䑌µ€Gæ^³xõ²¬õëüøþ!ø¹jÅê¦iÿ˜ÃØÓ3®ªáÉ»×÷øßöú_Æ ”‰Ì8 ]-ïÀå¡ê3ŒU475¯_ìžx•;ðÇÿò ërrtæ |•™‘IÌÎÈïG[bËõÊruÚæòY•ÅL[LFÕ))ÌÓýF.³¿ÑÿFN¸#É‘–äHZ®°órìùô†Ð¯>_¯e—å×i…fÄaGXœäR)ö7ºqíùþJqäÓŠ­[å×¥BôݬçÓWÚ(Âj|v##C*…ˆYÀ–Š‹òúÅŸ²›æÐä–™“Xgίÿ Åê?:ÆQ4fî‘6öIš´-$Cºä°‡Eiüƒ¾Úzþ¶6¬[§¯-}[’(•R%ööØzœþ½_çZDl&xyMð2Ég7+²%UµÈŠ™ößäåÐ^i¯UZHvÉá sØ¥Œ"g½Ö²…óÐn¤\ý·úÛ¥'èCŠ púðÄØ·u±"ÄÆëÐAöä—ç³2YRHVdb¢`ànGqXqŽÏ>‚eIlí•N0í£…´02Âé þù²ž}ŸeI¹/‘^£Û¥ÕÏqXJg– II…It»~­¢×BßÿYÐ>…}Ø$ÇX™f ôý¢;Çãc>òI>Ùgò™}–FÖHR£¹ÑbÝ-%9½°À›Ÿç¤ƒåy9å¹yåõ¹“rr+*ø¼üýúIe¹v|äŠy‘<‚óêóêî L«Ó¹”7´ißxßÞŽ‡ósï¾wûÕëîr<ö‡çºw[Ó¡o|}æøõw¶Ý·½uç¶[Öß½nÅþÞ}æ–£¢~Íí2z¸]ËGËÂnöE’É g›™)U•°/˜2j Ž¥´û|i7ôŽ«õ¥ýyaämò¶2ë¼/ñ0ä‘=ŠÇà1zÌ˵ÔB›×˜:©‹ö:ûLŽ2*7n féZc³é xŽÆ=¦Ôkì5…ðù;HMqÀjÈ‘/‡ê‘òš3mùÁ3ô™t×ÀºzÍSÞùú\‡.ƒUÂÝ쯾”؃n7Ç$FÙÌÙrL”+!ÉecÃC`áLK‚Ì)*°Cpwc&UìøÖ^‘$f–Ä’†f¶Íê*–‘évWëØÐ‚ÄBw…±©ÇÐk<æìse =a\OІô„«‡·ÈŽqe®%L©ÔO¿ûí˦ܷfÿ™Óí+~1A55HÛ>ºlôü1Q }õWý7W®½êòšÓûö¾=¡Ä™õ6ýc‡¾&¡ÿFøí+!ß­Øk-,žŠ}‰QÎh9Ò)'ÆrïíÓ ÎÈè(œxTXBÀB…4¹u éò½"¬ø".=AÈ7% É÷­±4V-6‡ÛkY-ÕJµr­R­ÖªµZ­µÊQ6%¼6¢6²6º6¦ÖU[7%~#të:é:y‹²QmQ¯Ý××!µ+mðüm!{CÛìáíq/Ñ):%’O)/©§ÔžG_Ä©ˆ—¢NEŸŠ9å:{*îTü%Y”®¦²,é‘éÑ…T`cö†Ãz£ ã¼ñUjEHUøÄ芸 ʺh¾2mR›¡Ã²ÇÚÒfos<¾'bodGTGüKt\í ï‹8Ùã<Õ=’¯”XœÈ'ªˆ¯Ã\DQ$–I~÷W;ï?õÚÎ{Oµé¿þíýÕ†û貫õ;b–f¿GéôÉý¯ýêÁÞ~ûwô×hôo6?M_-ø³#Z?àG7ùO+b/ª÷Ù$MNd.ŠÑd’˜‚íh0ùð|ÿ,€&@cÚÐ8{yY¡ÜL›åöõ±>:.›0¾­'*çî>9ߣÿóÔ4uêŽ@dº:R?¸·{¨Á—4*INŒ´eg˜²cc2Rs’F…YE[iD¥Fk”ƒÝ¾û á˹® mûpãÁ-°§åsX·~nE¹¨ƒŽÜé‰â–ãIò${R<Ùž‘žQžÑO+¥Ék3ªdôd𬖮 m mŒjLkH;Ó÷²û¥ô¾Ì>Oæ·\ýáŽnßî$w²;ÅêNs§»3JØx*–¼êxëøñ¡ãmã#Ç;ÇGÏŸ9>küˆñÙãGŽU4zŒg²¹*¤ÂQ^ÅÉo o ß”¼%eKêui-i]Ö®®Ð.ÛàæÑ•Ù•Õ5¢+»kdר£¶£ö£Ž£aGÃB‘ŽÇô¹ŽÇ¿x4Ùg;šr4õhÚÑô£½`Ñ·”KÖ*Úh Ä{]C>x䯛ž9ró¶.ÏC ëyxýúÞÔÿãÕSúŸï½nMó¹gŸýjÓ•[î¥ý[üôú›ë}tÝú‡xð˜þ5)¿¼í­Q¹‡š÷úéÁ¦C£G½ˆï–úßU6 ˆg¿óÅ9ÂL6»)1RÎŽMµÇ$ØÃlFx‰èê‰Ð|P-ßèÿ×]Äð£Z6ßXLsö / nê\¢¹ñ†Gy]Þ¸ëlôXè^Û®öø>ês {%&)[JU²Â ©D-2Ž5ÛŠØ b¼ñÔ!íQá9Œû,¡mνQ{cžˆë£µÇÐgé³½èè ëu¾ïþŽAk˜G( i‹¸òÍ×îÝyêW÷Ýwª­a§þèµ´1fÉÈ÷ôßÐè3¿¥%ñ·O?ÈzÓ×oëÆÙ’ËMIï¾Cý×B–"¶—ßö´Èb‹D€鉶²0-šïÅyÈÇÞ›ã+Œôåû¬¾_¨Ïé‹j` Ô 5È ¦sƒ¥ÁÚÒÚ`kˆlp6DE‹N6ŸÝçP~3p\43øv† ½›[^‘“[VX÷µ”¥´Èù"-õY-VbF…©dâôîóÝYZ£XZ#3.-Opx+-_¦Øù›²¶’q+“üçSo1Š‰Ýæ‹"“šÈ<¦Tƒl2hª"a³l4ól‹oêžÒóçûyz² Ò¤d˜w²–fL3Pž”#ç(yš×XÅ*¤jyª2ÁPn¼–µ 3Û mQZ”k±‰4ië W;ä6cŸÜ§¼¢vk½ØsÓGP–<ÙN ñÞêÈ)r’œBò‹~†¤¼÷ù¾–ãÏKÇ¥åÒÌÎèu}”Æ%ÓŠ+ þÙȈSžò%'ÈÙ¡Öø(—i³jrtB¤jR˜f’bÃBÉÉ’öçuücÔPä?æ^pà߉Pf¹Ç&˜…ÍcéH‰õÄyâ= Y‰ÜMV¯179ö&´&DŽ2e›=æcdL¦Ëã›î®2V¸[•Vµ5¤5´ÕÖêlêKìsG>á˜ð0¢Ô,r$½Ê¦_{øù;oºó¾V´¶R®þ9Rö‡¨èôçÍW¶vÓ¡;2ðâÍrå ×è†-½¿}[3¾ñÌÖö¨ˆßˆ=¬ÚV½þ#†ÍñÅÄ„8­vsÊö4“3MŽ1¥ºÂ%¤¸.‘ÜmØ:øØ3|îtKºÃk, +ˆØ£î6<iô*ÅÆRGad›Òaì ãË•¦))nžø%å)Q‘£ièKj‘zå,ýƒ úÃúhú -ÜN¬þ__£ÿN¿Ž)ìf²,\ZTCÇiͤ““|/L™«ïÐ?Õûõís§Àúª)ƒë{³/BN u©iXW›‹jR¤fçnŽ»<¾”ý¼¼2Ì †%qabEÃXØÐŠL–*Œ½’\"ª¨ŒçôŠOõiU† c…yÐæmŽM´ÉØ!õP¯¡Çè)/CÞ™ïfÈwù2¹™rµÞ©?»½…ÓäN}²>G—<ô=-+4‚Æ|] ôê7è›5£¾Z¬ æ%ïǼ,l¢/Üù¥I.s3©’Aæ1¿ý|w^^^`FoôËI/’p&"“oyÿùÏåÐG¤Ëù[3îÒ³8¤¹4Ml†ÏÎÒŒZšâ’ $©°#3'(è ‘îS†›a33‰Ð4žWÇkãMÊBJâi…`aõÀûÒÉ÷¥$é³»àaPµ èa,»Ögµ‡ÄÄ3{Z´q5Œ qŸtQ‹¡nw·#˜†vòˆŸ/Ý’lõ†FGm’67Dñe¯º×Ðf}¶۱;ò‰¨ãÑaé–QÖ„—›¥V¶WÙgì4?ÒÓêj ²òå *«!=uHYYQR¡V¡¯Ö÷êûõ2z–jÞ¤ò«¶ÎÐÏíÖÿ¡?N? ù#*µëñÈ›îÐ+ µ ¨ž^~ô¡+®½Q¿KÿÒï{(úG‡d­F‰õÝê “ÒŒfÍ¥0ÂFƒ y[¹zCˆ»ô|)äíK+qWš£æh9†ãRú >c˜çKq±Ô0¦‹uQ—Ôeê2wYŽÊG•£êQí¨á¨Ñ*Š$X›|`¾õäùßuvÊ OJŸ„iÆ›¥MƒüR¨WÚK.X¯õsõËáºN5< &ÿ~ÿet -›í ×Ìr 5Èñ¡.³A ‘4f–húÏcý¸RÝ€[µ ¾íÌ>Ä·µXÂVR!]§=©)"ñÒ†%^ |êžek²/I+u™¯“¬:–‘±=%nã^åσ|+/ƒ3»Þa6H²QuA›MÓ$øf^ÃÝòkd×QÅß§ÛÁ™…Y†8é5^ml0¶I½F;”TBÅÆÉT%U˜¯£ÍÒFc Nµ™‘ZK=f;8OJ!!eÊ'ååwtvJ;N ̓ϟ…œGI¯d±!Ý>9…»z<Ä-K~½ÿMíuìŽ&Öí‹2*öòT9Ge&£AUd‰ŒLã;z`CÿpH&! h¿¸•_3BÊ4]ÂÆIã¥qÊ8­ÈÀQ QLV6*M.¥&Ó>Ã>c—qŸé„1j!¹ÕLÓ$ Er¾R¨æ¨^-sMU¬\ªV*ÔrmŠ¡Ì´™šÔk1D³©ƒí–žP:ÔǵÇ}¬—úÔãÆ4!WÙDrJ¸‰´×÷ߣ«ºvϯ¤j©\‰ÿúi¥òëßkù_;”ÿÈvæ.aî6ߦ’Ær”TÍ%©°$ËF±WÈ+}>k–’¥3¹˜jHZxÁ¼¾AùÌ<–zYŸÂKë*_iˆ^“¾žÙ©tvf+/|}%ؘ¨ìÀžÅýÜCƒ9Û>‡œiJ Ôcáܤo×c}Ϻ™›’%8Sr°dˆd‰A¢Jx*jXd^-U"ß*³ø,œeQ<]/âÑ ‘®ÿVDÚÊZ‘K·Ê{”]ÆVS›¹ÕÒj Ä{ì{Â÷F´FîEr”¥£|†é¨ù¨å¨õhÈÑP$I‘GG£¦bç7{-“¥Z©R©U&9éIöÇCv!ÿý†7ûa°­~¦ÿXÿ«~VßE«È~m§>RBß§¢S4æÒ«Øm´^¿Þõ¯úBõ'õzêh½¢ îÿò!±ÿ‡³>§5M•Óì®PMvˆE¼éPpa¿ÄBFˆ…Œ`C é¾Fj‘šŒ2ÿà6„€LJ«½ÕaE(I¼Z–ïVdcgwM͉¶NýOúß'uþÂȦÔßyýÀ®½ûõwfkÆ·ÙàÚïÂÚ;X Íó%[C"Âl)!&9-Þ”Ÿf³F¤È,$ŒInMr¥ eá5ç½{(ú dm¾ÙCº‘n*(§…¤…~+•†ž|3•.&®3^ƒ×Xb- ^’\29<½X*´æÚ #•€¦Ûƒµ€T!¥T–:$¥‡,ëC¯¶5ØÃö[÷Ú[íûÂwEvÄu$ìMîµôÙ»#º#µ(-j‹¶ÅÐb\ok‰n‰iqµÄ¶ÄmHnLR¼ÝBñZÍû‚Š· 2n kåÊÑÉÃà¶èÝ1{b[ãw%ìNluïJÚ¼'å”rJ=¥2œ2¾Ò~¡–Ô—ôJré`6¸m{‹(?ü OÉŠ;’!¨{èJr¬x¡N?ðÊç•5O^½ò뛇ëáUK5ñVýK®‰ãJi•~nö[ë·N­» ŽzÇOô?­ 褒%tÒ‰]'ÆiI„RÚ\!&M¶;¡•áVE2…²(±õ\ÐËR®˜XÓêdSšy”Åã,µ;«Í“-›i£©ÅÜbáBƒcç*ih5î Š, °VXë1S¹ÏrÒ™”en6n6ñ›BA] O!QØå· 4ƒìÙw覛žn;÷šž‘ßIþAò™nåò›·è†¦ó‰Ò;šñtßÏ^S±î—ûÏÊŸCgÓØ3¾‘©)rL|ŠÝ¥™ ñi.§9Í Ç8SÓ]îÔf·§¸ù>ï–bÂY:Ÿ` ÜH†l®ÀÈ CŨYºP³t–>¤fY©5J•}½aƒ©)¹9µMyÁ~<òWOš5+zdL¶+;¶$Ì›6E[¬{ƒu]HsbcZ›½Óu,ô˜­×ÑÝó+×+iÎ uý`½6c¨.e@:"Ê ‰¤ÈŸûÙ{?ù¨`sÊ ÛÝñäÉÇþøË¦ãš“·N_÷Ã%?6ÑzèWÙvíÊÅkî¾áʇg-;ºã‰_ÏŸ¿z\ÙúÅõk•?Š=&>iÖßÀŠ|ðBéØ_°»¨Ø]x>.‚¥Iéò5‡R¡T({•¥ÁS…¡Ü8ÑÔÀX3Á:¤käëàŽ7j͆ ˆÇ®6íbíÔ!?‰€ªKíÐÚL­&>É—¤ãr¯ò’z\ë3Á•B'ääÕ Œèä‰ †æ70í«1X³±UÚ+ïÓÚ=ŽË'´—Œq\J¾I6ö 4é)zR@géÝ€ ”ç¾.ÂÀ§Ák2e«È‡nôEZŒª¤˜4곑KÃÀk0" Èb^†q„¥DòÊ…†bS©¹ØR)UªLU–ki£tµÜ ÃgšÇ ÷jíæ^^F4½dq¥ÇKÅjŽÑkªA÷K×Jë ë Œtm·ôª½Æã¾|I)&ÂXCë[_Ô·ê·ôÐûºï-¡ËŽé—HÛÖʹÒéƒÒÔDQbÊ#Âç_í³Tæ’4Õ …Ý›„Ýs(Ÿ›šÆ\”&«Ÿ!)FqÎ,“Àe°tróÀS8Ž VAµ‰†FºNÝÇ:¨Sê”;•v(O‡á;A¯(ÇÕ˜*ÚË:”nž+šx&)?¿}±úü¯déëßÉ…|g9÷À.uù.¾îYúI¥M<ïàñ…H2ãÏ;|óAŽ¡'BŠåMÔÎÚ`‘Ç%ª*RÚÖ~ýùÚ/ÆöŒçÏ÷è(ÌŸˆ±lOI üϰ'8v‡ônu£‰ð¡fQçc?ñE‡ºLrz”)Þå‰ÍµºBÄ£ñ"úÊe–@äU<˜ a…âýGA4/_`…¦V«Uƪ°r'ì±ÀèS.>´Â/vi¸/bb¤Ïù=õa{ƒ£!ª!º!¦ÁÕÛ×gïs&«ÔžRx¡ÌíŒ*Ì——?y÷]?;pÛ¶göìÉý鯗tä—äï¡O>òüCô¾¬~dÁbJþÝŠš7s»˜7¿_´@{@̻˅y»LñH?ò\žpFVg˜ÆÄ¼óò3¡aóæÅ°0^èh<—D@ó¼æªòXY‰yxaÂgª©,}ûÂ|…/’WË}ѾŸ«"î{¤"dÑÚkïͺؼôŒHžPnä>x×ö'Ÿ¹ãÖmºÞwõÁÜ={ ¬…dúýCÏyøÑ—{[§¿·xÁ#Úç·Ïœ§ö®ò&èA Û4¼ö™nrÆË1&‹…“UÔ>û»/Rûœ˜Çò¬ÙDëz¶ÞÏÚŒ­ÃÒ¨6G[DkTktkLdAèØ°‚ˆ±Ñe¡“ÃÊ"&Go áõQ ¯Ž_×È¡p„ORÞ4áþÙég(û/u?[|Wù¾S¯µOÛáÍHI¡Ø÷ÏR¼;©+sd÷žŸübT» ×ƒëûðp½ŽÍ‹òüõÚY­’Ðh±šeÆÀúqŸ#’„‹)Bâü· øo1µ8ZÂZÂ["Z"[œ-Q\»íÿL·ÿ]Ý–×Î]þk©±XþdO¨Ík`rz´%>,&Ú§CmŒŒ,2NL¿¸Øqáögo`A×—«A]4pM\Á>Æìs07ð%nIa xxœŽ"Hè6ôØz\G]GcÓÓCkY5Uó{è†ZcEhµMÜCm } vo豘îX¾ÛXsƒš$¢Ó¢¨a·³"å‰!\·©Ý&`¦½·­Ü‘}ëÄwï}[÷“ýø+ð“Å›o½ãꦟ˜1£rK ¹þø6%èçÞº=B‰Ó²(¶Ô¡1‡ANˆ1%Ú ¹#,ÆP³Æ˜Ý*EÛÏ—òL¤[8~ì¯GžÅ9GªÃ)-¼0|xéãÛÏ:n7u™:£äÁYD:ò#yž‘R˜ïØRœc„³*çØ±=ëÖ]sgB~¤f3š¯¸Kß¾ãüi9k5¾ú3ƒA¬ßÀéAŸœ‰È65ÆæJ‡þ¦˜âãéa¶¸O|LFnVxXzŒÐcwÖ ‹§ïú?ìG¾!)…E,çõ\mƒÏ3˜j͵–ZkmHmh­­Ö^ë¨ « <Õ଺ðdCm|ubURmJmjmZmzmFmæ÷¸'ç†a.»!¾!¥!µ!­!½!£!³/y\UBy²HÀ.è¹]»ðtÑ8ú^þ§¿¿ð‘sŸ}ÛÆÇü=ÚƒŸ}Ùvß´é<ùÁ7]<Öæ~äûàÂY›Ïi”B™š`÷XòL|´òZè`EDDSç3„ï­ˆ,Jwô:¤o&CE(ß7Ò„¡["¢f‚•gö|á7Ãþ¡2ÒHQÁs„ärçÎHyßž%«6oݽ;ûµ;Ú¥±·ÿðØÏõB8ï{gÍ:Ö%|ÝC˜ìÄÞØïÙ¥>‹!DÊEÐŒƒvq›[<0%n ½ýNeÙÖ 4¨ ì\,§³‘>üFì¢={/=zâÄÑ£/•Ÿ£MÖ¥‚ö@v…/DÐŽµƒº½ÿ¿Gžþù~õÕ Öø9¬±™]6X×ÎUó† Ṳ̂Xø–u¡®Ýu±[üß)i‡Sm!DŦý¬“:̽’ixÝZ~î„^µ{7=ð¢>¾ÒÚ_o¤}ú´ ÞÑXð$³ÌÃR?¼G@³zUR¥NÙ"îqÖ$/XŽ´/#lDô¦Í»w§Ü¸Æ•+ße±œú•~¹ü\û‹Ì-ÃVzü¥±ÿDä4T Mt9͉¼@ëIw…гˆŽÝ,&<=p=P›½X]ö›·e¿S™½;‹R )©mö^ã k·í¨­Ûnòh£ ##¼Tâ(Ž(H« jGUDYZpý¾:5\$tjgíÔ.µËíævK»µ=¤=´ÝÖîljniwµÇ¶ÇµÇ·§´§¶§c=ˆ´{•ë ¡'“^L}!í’ïܾh7*¤÷¶my2óöø53—οqëÖ½÷¬º;ûf×´Òò©Ó¯zäv’n|xÙeõåeã.­ðäܹøÚ;ëÔ•÷U§äß!pgtZ/žÍp(,ÑhÖr%(1Õ >±Í°ˆªƒ[ß·ïÈzœí²H i(XÆ‹Nß¿»±q÷ýrV 2¾AßÂuï.ä5·ÊÏžp Ô{ãy½77ÌÆ‹ÆZXÐ)^(÷Îÿ¯Ê½¼ØûÍ=àèƒ.Þz¡h{ЉgxCOÙNÙO9FÑ ¤ ªµò­Ït÷<½gɆ ‹Ûè¡Þzë#É=ð‡ŸÜv˃üi>þ7å=˜ƒÊVûlŠÄr)G Öh•=û‡¢4VÁ²ˆWi³Ô敼r±:‘UP¹4Qö©Íò5ê>¶WêY^lÊBG¯TNeJ³²‡í¥=R›ü";NǤ¡:¬¼G/Ò Nv²ÊÏ‘?Ø,݈Yýoª_ÊŸ0»ßçâuXf¥°\™rÌߨı˜×Ÿ×ÆëËy-– —×` •µÔTÍ*©\)SkxÕ•šÔ Z“a½±É´›µÑni—¼WÙ«¶i» {»L'XÒ«õS¼l“Ô"mÐ6÷ÒãR+˜oSÓö¡SÔg´ URÕ/1…3úûº÷Y¤ I”˜ŠÔ>Pél‘ L“n“߇œ-l™/j°Žš+3ÑBº‡·bµóÇð{ùÓm§ú.Z¤{yð1Ð/¿ þ ìˆÏ¡AÒ+ÄLªÄxrPÎý\=ý¢·H|MY”®yYk–Öi †=ìqÚ éµi†>©O>¡92Yºœ¦¤ª™†bV*SŠÕqÚXƒO¨S9¯Ï6±«iƒ´QÞ¢4ª›´M†C¼Ð^‰´‡?j`胯é–{”Õ-SÔYSÂy™U~s`ÇásúŠŸQ1%ÉÏË‘.•ïÈ‘^z•uxAÌs™Ï&%*¹Z"ÓTI–g¨²šŠ5n‡eš¼é:xSHÔaxIy°ݤÒzv­Ô¤®7´KÚ @zJ3~Ä¥–$¿p~½´hàMyæÀ.iœÈùÓ‚Ÿåz´H3²vÈ—›˜n±•Dƒ5Ân”] Q†£=Á–Àl®Ä(ÙÆ$W83H9ÞL„Ö-âÀ“âƒùu v±Mnh ‰bÑaeCÔ‰§Ç5ÏàSÄË…g‡=1WS¨}¤42d¬T2Yš²™vG&îm°«rgŸÉwGñìc$wAÒ¢›'®[7q󉦒¢šš¢±z]Ó/èðÚñwŽ_K‡~ÑtGNƒ~ÅmÍNgã­úÒu¹Âö%E7J·‹gš²ø3M~ó×ÝL"¾°ð$Mºýæ›u£QÈu*äZ!äºÛ7"6<Ái1ʉ,Ìå´%(Çœ QÆC”+Ñ&; R˜q„ëbb}KT-ŠÅZ<ôC3Q‘»ˆÙàÓ¦‡°mƒ¿¯|Þt¬6Ys¤¨)1ù1e1MZStgH§Ã(Ä(Ä6$Fþpz@ªÎ€+|[^n*å",Ùðò_}|Iƒ^ý\óíy ôЭNgómô“µ¹w4?§×4\Âs:~dzH%÷^ñÜñ°’;¹!P›\.Ÿ‘Ó´ ñ¼ò}¾( Û€¢’AN5ʤI•ÁH»1pá`ýæCYóŒ?¯qÖ¢u(Ç•ãc:K“2”48ˆBéjÖÀÖQ£¼^Y¯6Ú°}ì’÷)Oª†—X/½¤œRŽ«'µ>ƒˆ–å Rñ¦“/´‘D¿Ê8S!)10‰ƒóhûÏã{[È6BÉÒJX‰R¬i ‡â‡ï¸ƒÌfÌ«O’¯“¶È›0óm3ÜW`jÇ0±£ÒK2¶ƒ=ð’p•ÿêõ]_úé~¶ìõìÀù )¥B ðò:)æ5Ùg‘ɩ߼s¾ûÛ?éý¶uøü×¶%¬XÂ&BMr3 ÒtR׃;¬‰çÌØH·ý€”Vµô€oz½û¥¹I£F~ë«Ûnp`Ó„lr?í÷O«WbÕ¹Ô¸ršñ€’–röûNž5rò´z÷¥åeƒ£–_V†c3êÑäßpÇËËF±§¥ë}þËÏÉ‹uù²…;ÕËÎÉ?µPýÁ6yÑ9yáNyÁ9y~ôuþNy^ýNuÞ9yîN¹~§<çœ<{§<+y¡:k›<3uyFÝ%ê ]®»Dž®ËSuyJÍ6u >Ž*5“çª5Ûäšë•ÉÕéêä¹òdŸR.WUnQ«t¹r‹Ò¶É©)ÛÔÔsrêQ%óLÙ&§\¯$'¥«É ådŸ’”.»ÑϽMNœ ' •°MŽŸ ÇÅnSãÎɱÛd×99ÜÅœ“£'ÈQºìÔåH6A<'Gà#✡†§Èa²Ãž«:ÎÉö\ÙvN ‰PCu9$B¶è²ùœlÒeãNYÓeU—ûèU>'KøæAK'¨tÇdö4-½éÊþ§,ûõ1K¾Èk »Ž¯?£ÑTOGéér9U¾ñ¤¦Vh•Ú§†2ñÚ0øzË¸ÂØkÊ3­2uš“Íטï4¿eɱ\fyÏê¶ö†$„ÚC7Úì6Ÿí%{²}ŸÃìXähÃëñúãwa‹Âþ>5ü•ˆ™‘Ó"»’s¢s›³3ê’¨ýÑJôõÑçbª]Ì5Æõ€ë±Sc‰ ‹›÷a¼ÿ£ÿ¯‡âJ` «ðÚõï׿_ÿ÷_ü©þ§Én`ù“by‹^2ö`„ˆGø¯7ÌŒÿó!,”Ù˜9X g,’9Y‹f1ÌÅbY2Å„”n–O”ÂRYKg,“e±,›d£Øhæa9,—å!›)`…ÌˊೊY ËJÙ8v ý›È.ee¬©Ø$VɪX5›ÌjØ6•Õ²il:«c3ØL6‹ÍfsX=›Ëæ±ùl[ȱ°ËØbv9[–²el9»‚­`+Ù•ì*¶Š­fkØZ¹±õ¬‘5±f¶]Í6²Mì¶™]˶À{¶°ëÙVöCHçFvû»™ÝÂne·±ÛÙ6v»“ÝÅîfÛÙÙv»—íd÷±ûÙOØìAö{˜=Âe­ì1¶‹íf{Ø^ÖÆgí¬ƒícOÌždûY;À~ʲŸ±Cì)v˜aO³gسìçì9ö ö<û%;Ê^€ÿ~‘u³ÖËŽ³—X;Á^f¯°“ìWì{•½Æ^go°7Ù[ì4{›½Ã~ÃÞe¿egØ{ì}ö;K ©¤‘ýgþÈþƒ}Æþξ`_²¿²ÏÙßÈH&2“…¬l€B˜¹¿}BvrP…SE’“¢ØWM1ä¢XŠcç(ž(‘Ü”DÉìw”B©”Fé”A™ì/”E#(›FÒ(ö!û{އ?PGyHà ¨¼TÄþLcÑ–°?ÐX*¥qt Ói<ö'M ÂN5‘.¥2*§ šD•ì?©Šªi2ÕКJµ4ýž¦SÍ ™4‹f³Oiöµ¹4æ³ØyZ€$wý€.£Åt9-¡¥´ŒõÓrº‚V°i%])þ¡Õ´†ÖR­£õÔHMÔLèjÚH›èÚL×ÒºŽZèzÚJ?¤èFö(ÝD?¢›éº•n£ÛiÝAwÒ]ì>º›¶ÓÙƒ´ƒî¡{i'ÝG÷ÓOèz¢‡éz”Zé1ÚE»ií¥6zœÚ©ƒöÑÔIOÒ~ê¢ôS:H?£Cô¦#ô4=CÏÒÏé9ú=O¿Äžý£©›z¨—ŽÓKÔG'èez…NÒ¯è½J¯Ñ¯éuzƒÞ¤·è4½MïÐoè]ú-¡÷è}ú€ÎÒïè÷ô!}D éô ý‰þLýôú”þƒ>£¿Òçô7ú‚þN_Ò?è+úO:G_Óy ü0’$I–I•}HFÉ$™%‹d•B¤PÉ&Ù%‡&…KR¤ä”¢¤h)F™:«¦Æ¸|å ‹—,35­X¹F´ ˆ>WÎ4.oZ±©aŲ5Ö†eëW®]ºdÙš¦eë-KÖ®^½xñþÍ0aík×,»Ê0aõâ%ë×®Ñ&\¾~Ù†e–K—¬\¿¤yõòUË6*—.]Û¤•-YÌO—5®ZܸÂP¸J+G 僗‹‹•r\`™taã¤%Ë–®\µj±2‰Ÿ©¼pF«jZ¹jé2CÕàUbCU`xãä¡ëj8 5j/inZf¬<§Mßµ©â¬qêàaCíàµbHSíÒËW:Ö ~ú× 3C¶ÌÆÜÌ@—™C]f˜58ò,1²:kýÊ5W˜f o˜`Þ2çÂH¦9KW.[¿¬qe£6÷Šõ‹!ß¹ÃÈÌ×)ó0GÃâÁ±±xp¬%Öc —ÅÒ€,–ä¿lðªeù/ã#-”áƒÜ[®6Æ|V\8`X9Øûª!‰¯âTV¨&f\5$‡5 ® ˆgÍÄ×r±6 ñµA‰¯üô_?4Lc@âÃDÑèÒ4Ô¥9 ñæÁ‘›ooJ¼yPJW“øÕA‰o H|Ó02×$~ Ÿãʉ•ƒ$VD¸Ä[£NXÕ°b±2qYÓbuÒb˜ŒZ¶lUÓbCyCãÊUk×(ópB.ÇÉ™+ÐRªÖ¢9yqCÃb¨èêË—.–¦4KS›¥ú•ÐÅ•|piÚJ¹nÅZuÆÊ+V/–g.n6Ì %O[±R¾ïi+ÕÅ‚êåœê‚êRAuÙ Õk8U~²IP]É©^%¨® P]Ó,m\‰Å$åõ ×Èéiså&m$Û’KðÆWuíêeW,Vgåå嚯YÛ´lÕ²•øž“_´LmZ»fmcÈDÅ7³ŽhZ"¾!Ñ0qyÎN?ðeÖ°ÎæZNT4mƒÇ‡ˆ˜_Ùðñ— ¿28þÚáã7mp|+ï>4¸µjØ[ó7);ÐsÙ7æñ­ú‹—¯\™›““[l ¶Š‡Zy9ÁVn°•lå[ÁVa°å ¶‚4ò‚4ò‚4òƒ4òƒ4òƒ4òƒ4òƒ4òƒ4òƒ4òƒ4òƒ4òƒ4 ‚4 ‚4 ‚4 ‚4 ‚4 ‚4 ‚4 ‚4 ‚4 ‚4 ƒ£¯( ŽRäÀlñ’{ZaFaFáþ¼¹ù…Aî½Ák½AºÞà(Þà(Þà(EAŠ‚Ò( ŽWœGQPEAEAEAEAEAc‚4ÆiŒ Ò¤1&HcLƘ 1Ac‚4ÆiiiiiiiiÑÀ+Ø*¶.Œ2&x,ÈKñ/¹Aj¹9…Á–7غ@#È_pѮт³ôæ)åÍë×ÈÍQ—ŒÁÒaÑW,E4£ÂÙ{ z ÍkVæäLÈaÈ(ÚX'Û§ìgã”ì¡Fä ¤2e¿Z‰³{p–¿A^Ò¨ðt.Q3"JË‘íÈXî׌ò“‡´/¶S~.ðbÙüù/:ÚÉ,Ÿe·J瑹m—·"»b,^}uª•QìfÍŠlé+Ãd>­ê ÆŽGVŒëj-_Ëg;ä»»>$E°fùcðÑˆÌ Ä}¼å°›Ö6þ­ôï,Ê(òÏçß߹޾PvS¾cà´©Ù¸_5Ñ0C]JDKÿüýý?4¿ÿŸI[è•qáÀiÆL‡õúMÍ4çB…ƒÉ·6sðl“ŧ?0Nð yôÿí û߯Ўÿª"¹þ?¬0öëoÔAþð­:ˆ¢¬AŸk!M’½Ž]Oi”KETIËëÿX:.õIgäëäÛämòÝòcr‡|@~Aþ•bU"R¨Ô* ”(ÛnJø›[vÜ&w¤ÛåNp'»ÓÝ9îw™{·»3É™”œ”ž,%kɶä°äÈdWrBrvreòeÉËÒN|¦|-ùýBŸ®g­”I^â?û_ê½ þ6¨ßêwÊÛåÝò>ù§ò1…”PÅ©ä(^eº²H¹;áÆ„ÏÝ’ îŽvǹ݂zñE¨;@=&H}© N~¿ÿ÷tÏpý÷Ãýêv¼“ðv16ðîÀo€¯Î<Ž÷¡ ½?øàƒ½¼üvÓ;ñÞøÁij+>xåý+ßßôÞÎ÷v½w;cïßÂØ{Mï­{ïïyÞËùÍØÿ¢þrж6ÒéÚI‡`]L²¾£ñNö”FJevi9Þk¤¥I·H· Úë¤Û¤;¥³ïù“® ¼¿sÜýãúû hèÇÐâ;¡¿C÷°¡Ë€vï`Ÿ²ÿ€Fßý~zóèî>ö'ögÖí}:wÚÊíènXÒ˰¥— …§µð,ë×B»`aŸÀ"Þú¸‚²( ör%lî*ØÛ*X\+ln¬ŽÛ\3¬6Gc`u×Àî6Ãæ®…<»»Ž[]NÓ` #û‚rØç”ËþNyìKÊg_Q!û°ÿ$/ûšŠ˜N%ÌOc‰Q);OãØô‹h<Éä#…&D—JIƒÎh%éJ2Ó¥dbo‘…Ê(”&‘ Bd¥r²S9¨šÂ¡¥a4™"h EÒTrR-·YЦéä¢CuK3)ŽfQÍ¡xšMnšK‰TOI4’i>¥ÐJ¥…°ºE”N?  ºŒ²i)û9„ަ+h-‡å~0h·ïÆß¬=2X=ãµ³CtpXýì)hҽߨ¹ý”~6XU{Ž~+Ùè4¥wèíÁJØ»’C §3ߨ³}£2&™$»¤H¡’&©ƒ5.£&EJfúd€Í.¦´„{+)JøªnáµzàÁ3þ„ý‘}/÷ooóooóooóooó¿ãm3¨„tFªå6kшS#ô»©¦Šÿ'Ã(Ä–&Vä?,ö¿,XêX…Ô„h2 8‘§ ¤8q® qd(¢Ý?y#ýïþ~þû Ðå™?§ïÿ˜ê?,Ñq‰ÀRÿÇÀ¹ç‰k!âµ"j.ÚÙ@b_+bå4`be ÷ïFè›N'0Êÿ"0Æèò7cýmÀ8ðÀ§ücGüÕ7Bÿé¿èä?Š‚Ê€.Œl2±#æž ôú,òû_–ëç#”úoŽÿvH& 8Wð=s·³…þ}à>ýBÚp{íïzý§€‡üSOùëGüË‘'ر#[€/ ‡‡€NÿI`”ÿ,0ÚÈçŽ9~ŒƒTÃ!™dVЦŸÚ1ÇæÐŸ†ûùÏntžNGгNq ´ƒgVó00Üßä:ìÂh[NŒéÂjêÀhÿ"` 4Á…ÑÞ书-óæÂLó‘{Ú Ÿ±ç —U,ƹè„„cÁÕ`´ÿY` 8‰2Å8¯ó¼ò‰ƒ¬¾Ú0Zæè†ûßòÑâ0Ú~ üÇa´ÀhÈ9£mºü›±bœ8Ì™0ì7žk4K)×¾ta`#_ C>¯’ÊL°µTPhG^ÊÒ¡W©l„ÀQ°âT–'Ú½°TØï à;°X´K–Â'¤28Oee°ôTV.¨Tˆö$•«àRYµhO†ÜRYàaŠÀ©âH­Ài§ ¬ýgˆ1gŠö,q|ŽÀzhE*¼ß³ÀyF*[¹¥"/çóºLP¼UôìgAΩðEÀ#þ xD¼Aäÿ0ã¤AýÀG‰#9þ€¹ðWi o{ÁsdòpŒÿS`1ÆOƒL8–Â+¦A¼ÿl1ÎÑ®Ç*¤Ã—Y:¼~І#é þ…øaÎY`žÀÜs¦c|~¶z˜  ¬À¼Ò!UÞæ’L‡$O§Šv­À:Ñg¦ÀÙb„9¢Í%–Ú<:¸Íõý@>wþïC…Óá3𠵎Y³Ž8 V™ÁF‹¶G`v¨ ìsf`¾8R(Ð ºU+pŒ8[ ß•Yq Ég`v·ËÄÙJS`×™BW3Áçv þ$Üî¦Bª™Xp„À<½ð™ ø.p ¤ ŠŸKŽ…|2Añ5à8ѧ š‰õ: ¬íI+V ¬|2ÁÇ:Øx&t’÷Ÿ)ÎΣÕcF™ÐÆ3ÀyX¯LÈ™ã­è‰rÈ2 3Já{h;üIÀTì\Y˜Ë`ž@/fš…Y|,ÏY°2Že žÞkàá³°âOë°ŽY°ÞžÕÉŠ÷ëÅ‘˜{,¢Ÿ€îA¿Áó@¾wŒõv`èŽÝ—EX‘ÞçÀbÈs¤Ç‘ëöÈŸåë5<| œ‹¹Œ•w€ ±_dcü³@fÍ+qV Ô³qoW ¬WÙ¸ê÷èÁûDŽÈv3pö_8Üìðß <ä_ |J?ùä€Û/Ü7柜#|r8äèÝ¡?9ÂÊrÑÿ] ë•‹«x;z•‹ž¹–æÂ~9v€·<ôßtÀ/å¡çà(È9Oxû<\õ°òÌÃÜŸ–‹ÙåA[5à$crœ[Èü¾Î‡4òÀoߊãùÿY MÿhG¤—8¤˜àßä¶Ÿ9¾ÌÀ¼òY¦Àà3Ÿe‹öH9ˆ±ó!Þ?_)èEœœžßŽgK ‡|ð¼XŠø*«¶8I`%l9ûòï5¢O-,7k·8[ð9ÎÇÚ΃dò1;>æè°ŽV©óì' hƒ^bŽ'¬K!t,˜® 1£³À‘¸¶üó#^ѳR-Ï‹E»D Ïž ÁóëÀ ØZ!xæíØW!øäGêEÏ@!Vvðdî1­—ç@zz!çƒÀtÌÑ NŽG‚/vvÞ3O/èEléÙœ\õ‹¡!^pÅ‘ç,^põ°B`¥À:XûÂï3E›ï¹^™xÁáVM8 ´AÏ‹ ¥ã@‡ÿJ`¼ÿ`øGl"ΦC÷ŠÀ'G¾úEà·½ðçExÅà] _X„Lc)vÛ"pµX›*W¼=Y\[ƒµ(>¤|ò³³Sa•oÖ#/‚m^œ‡h³Ür®:Ä‘Ÿ!ú-‚…î>oP =Œ½ÜNÆðÜè€ÄÆ ‡ï« “1 {8E`-,b ¢;ŽÓ΀'¼Í#¥1 þp>Ö«²úhÅ«´²v¬N±ˆ–‹…ÄŠ…ƒî:`:,´ã˜'°@`ã×–"6.f>È­RºX)° Ü‹X´’Ùœ…õ-†Lx{vÉbvò·bHc6ðgˆ{‹¡c;ç°DpX"8,–K‡%‚ÃÁa‰à°DpX"8,¬žrKo%‚·Á[ Ö®Èy+ôx›sX"8,ÄZ€õâÈ1Îe‚+Îg‰à³Dð9\}t`Ex´^L‡î'§€#1‹±à‡)X$ì¦ k1œp¬X'p|f)æþ<Ð ®J1w®vèR)¨dã1ßRÌ}-0ûE)(Þ !p$¬ yÛ+®*‚ö–‚ßX~WVS êó€åà°þŠ·+V ¬7+…Lø8uþiÀâøLõþ: ×çRì€_;Í•B&ðƒÐä>àSбRhò;ØwmÐíqà,П3NìÔã`ûÏ˰cŽõÀìÈã@± X9ŒƒÆV@æ—`¦Ç£à.÷ø X ŸY&v^^áÑC´y|U&bû2ø–›€%K±k—aÖŸgœ-úÔc´2Ìè] -ËÄ®W†Xë$ðì® 3ê¶”‹ü´´žÁ”CÏ?ò}°\ìƒåù3à\ðSŽ1_.€´Ë…¥—c´ƒÀ#ØS*ÿÏ ¶\êc`žh!*¨çð;ÐØw€5Ð ä#¼]+p–ÀÙØM*DîV!üv(òö!ø“ PìC4ÆiMRš$æ;IÌw’ˆ-+qöy ‘Z¥ˆ²*ÅN] nòxµòÜ,ÈåY‰¹÷'C*ÁÛYàSÅ‘ZÓN8K —O¥ÈÝ*E¼W)dU)dU)|T%¸êÞ*úp¹UbO@ª°'&mÐÕ*ðl:à?«XÖ´ »9ÇBeÐù*¬ûÇÀJÑž Í©¶_%rä*pËÔ œ&pºÀ:xõ*ðÌÛ³Ås`MUà™3^¥ŠÍý*Æ«6Uðœ“Cà¿ Üòkˆkß‚œ«Å^ >O¹ß®r¨ÆÜß.€ªqí~àSÐj\{ŠM»íd!O?_ç`^“ÁC?p¤1×öÁj& íš,´«W= ä¹m v®³ÀI¢])°Z`8>S´çBæ5“_Ëë„5°‚§‡°{Ö`äÃÀ#8>EŒ9EŒ3EŒ0ü¼ ä=§ˆžSDÏ©‚ÿ©"zŸ ~NÇÂZ§b„àp*¸âíJÕëÄñzÑž)MµÜ©Ÿùtu*Æ?Éj…V׊¨»Vhu-ú¿äZ=MPŸ&¤7MXý4Œù)p.úOÒ›†ž'\zÓ„ô¦ éM×NÇêŽ:D»ždºX…éí3 _‹éb-¦‹1§‹1§‹™.Æœ.Æœ.ƬVV'êouói ·¯:aYu²ê„eÕ Ëª–U',«NXV°¬:aYu²ê„eÕ ËªƒF}œ#ÚõçBëÀÕ‹@¾¦u²ê„eÕÇ€OÁŽêÀá³l†àp†àm†ðo3„›!üÛ ¡±3„µÎÖ:CXë áßf`´}À§ÄµÜNg ï: ;Ú@+úÌÂø‹€vHc¨ðv<ø™…­˜ ý™ÏÃ!Rš=áírxþYÐ~Õ$q¤Rô¯‚VÌ‚Îð#“!ŸYà“S™"pª8R+pšÀéëÄ83Ę31—Y?Îm|l<X/ÎÎ…Ÿ™çGæÃºgA“€‡ É³„Ï6>óz_def Ï’fƒÿ`±¿X"°Ô_,ƒGøó9 þ°Bà$•«Ö œƒŒc朇8gf <$Fx ’™ZŸ#?±!:­6R*€ÜFêÅìêAåK`ÀâŸQ½°šzQϩnjNçcë1>í)̱ã¿ Lü\P¹\Ü×±~þ”P<$<:s˜ŠÙÍżx›ÇTs1Þæùò\YÍÅúòþ³áæŠÙÍ>|.æÅÛ‡Dÿ§`;ó@Ñ´!Ú™Z°Ðz˜€qæÖsÀ2Ñž$°TæA÷xž=̓îqœ*ŽÔ œ.°Nôœ%ڳŵõ Ëé„⽚3OHxžð13l~øøÜœÉ‚½ð@2‡Àó"ö8‰:üVvXpuXpuXpuXpuXpuXpuXpuXpuXpuXpuXpuXpuXpuXpuXpuXpuXpuXpuXpuXpuXpuXpuXpu˜Æz?V C×Gp¤GÔ™{Ï÷‹eô@¶±À’ÿ×Þõ„¸Q…ñß¼y™¤Ë6.ØUdŸ‡Ú»ÛÍî¶° ØMË—º+þÃB§É$¦I:af²ºíAdOâ!J/QŠFð ¥TAñ âEö¦ˆôàM"¥PzðЋeãï½}‰J•*¼ä ßû~ï{ߟ7o†ùû1cêGû㬟¤ŸMú_aýïtÌ›bñ¯AÒÜ¢Òüwþ1œ_DÂäMìræI®Úì\˜…¯Z,hñ¬Å.îç±%u^±8…]xÍb¼mqš÷#ï[¬ÿíûƒÅúó–Å;‘vÒg±ÃÓ™r[œû,vu>±X`ÌÙ´ØÅ‚sÅb‰¬H[œÂ¬˜´ØÃ¸xÂâ4Ίç-ÎàØŽ#ëÞkñNŒ¹»-ÎR>¿·”S‡ÃÖzT«¾”¨üâââôÜììU¨%q~sÑoø-¿ÆêHתgT1 Û­µÔh(c«(ˆƒh-(Ï,·“vä«Bý© ÚnøÑ †õ}ª„Í ‰j%5—Ï5›•j«”$Ók 3 êxÐRó³Š#8¸­P¨U-V¾J"¿4ý¨®ÂÊy'…¿o{QBŽõ°I+]G„šI8M(Ës‡ÓË´~ŒÉåeö'&õ4Bú1k‘¼Aj‘ªôSï{cãë [Ej‡ÐŸ'™ak‰Ú òßcŦ¥-ò5Öej.›ô—6%¾‰\çåZ@‹¶‰ÝÖr©cŸ‰7Y'&J‰²9®Oþ/|6MŠm‹: —iF_ÐÕÙ{œö-òy®»²spðO´ýí#ê5ÒíÄÈu"oÓŒY÷†Œø_ÌäÝzø·ó[‡ü†CÿEÃUqçHOe/ãqç"¦È7e§]ÞÀ‹ò†“'ôi’t’tš´N:O*ký¶Ã?ÆIuû·ä襾ÀJª‰ž\FϽ‚ž×aû3ôœkè‰þeùå@/ýžó.á¢÷3V¤G=ÍŸ¡Ý:N¹_a*uŽx«3óyÿ¦Ü€_â!ù±þGcwŽcÀßEtÞýÖð‚܃‚Èã1ùñ"º<~]ÐDß]ç;t½Ýèj¹|uÛNÛˆËèºyìq®#''Ñq?Ÿ7)÷$MÐ缸„ŠìI¾ŠQ¹ë2Ø~6ì>[Į́ŒÊ¨ŒÊÿ[xÎgåžuÞä]@&U”_[sÛ\œÆ†¨d\qOJž]·ñÑ1¨•uqéèï‘ԯ›ؚpÞÉœ¹“À{?~Ï#þ5/crìñ ÉÎ endstream endobj 467 0 obj 20006 endobj 468 0 obj 36124 endobj 219 0 obj <> endobj 470 0 obj <> stream xÚ]’Ëj„0†÷>Eº(LÖ[g@„aJé,zal@“ãT¨Q¢³˜·oÌ/Sh@á#çò%9÷wU¸×CCaö³MÃÅ* ¯õD‡ãÓÑt3‹>ì *šYÛm×Öй3A’2Ý©y%ÿWýš\]§™ú£i‡ (Xtr›Ól¯lã;>Ñ»Õd;sf›¯C帺ŒãõdfeÉ4µ®sy«{bÑ^¿ *t¡Ÿ×‘Xê9ƒ4Mc­ÈÖæLA»U²âÙ­2 £ÿíg1ÒšV}×Ö‡7.<ŽÓméIvžRî‰' JA[Õ „š5SÔ䨙¥ ”y1H‚2:tàp‘páp‘páÈ“Èsž8UäZžžffNÉ“ò$b% á gpÉá"à’ÃEÀ%‡‹€K±Iî,Ç ˜å;ÿˆëk-Ϲ ÛmDÔÅZ7=~"ý|,“Ѻ í8ŒK–ÿ~ÿÅE endstream endobj 471 0 obj 369 endobj 469 0 obj <> /FontDescriptor 472 0 R /W [ 0[600.09765625]11[287.109375 287.109]36[699.21875 567.871]40[534.1796875]42[819.82421875 713.867 238.77]50[861.81640625 502.93]54[559.08203125]56[685.05859375]68[577.1484375 577.148 476.074 577.148 519.043]74[580.078125]76[262.20703125]79[227.05078125 768.066 527.832 562.012]85[334.9609375 398.926 240.234 512.207 462.891]91[498.046875 498.047] ] /BaseFont/GFEDCB+FuturaBk-Italic >> endobj 472 0 obj <> endobj 473 0 obj <> stream xÚí½ |”Õµ7¼÷ó/%$sϲàòUYÿú"!Y&\¿=¸¦;XÿÖ=øŠKJë½Þ D>ŠDI¢'4F[ ËB÷IËdÛÐV¤€Vº„È/¡JY‚ Ï‹¯*"ú×N½vÊk4d²2 Ë$r¦OL>óAè>EüWŸ­‘»!˾P±ð±¼€É­Q©j“:Ne$rgÒ¿öâ+†Š C(ñ–7àÈQä(sTyê\[[I+„ åõM…A›£ÊQçkr´Òbº˜ÎÚ×:k±uaÇω âS )<\n(+_HÙ¡Þav¨·iµƒqƒñƒºAýㆣêQý˜Q³˜,¦rAŒ§fS‚UáJKüeI´Løøîçóôº’’Û«¦êužñAÙg¯„RB¹ô™‡Þ¼¡ênZýÓ…ÏvÑL¼MæUÇçug@'‰ñ¢)Þ'JjÉp¡yéÝÔ-÷S¿Ì/—aR2áÜ,ô­ gí1_x*qO‘]ô)ýS†§ž2ÊÙÆV>îºè¸ë"ãTcdTSŒÄC;jªÈö'/¢¥%Bv™%Ál’ nϯYw÷ÏóõºââÛ0C¡(ô۳ᷪŽÒ¨ñ²C ¶R× Sî=‡9!|†Ùmòb¬‘Š|0*å‚M!·KD¥TÈ*'25¦eÅìÝÈÊ©ùtÕD=1Ýï:Ä,¹WðŠ^E¹Ò«j$õb­¼QyrP‡äƒŠÇ•ÛTƒ*c!ɧZ(È<òB…GéQU’Jaš8Mš&«”W(¦áöiª¤†ÖŠ5²Zeµj=ÙH× b¿´Vv•üÅzåZÕ6a‡ø¸´]6¤Ø®Ü®£‡Å#²#òQ…6’‘)fÐLj©ì¶ç6ÝúËsâ Ë·†¶Òã¡yñ™b¡õìnæ1ˆÒ•r%ÃNòÉû‡.;=5Ù*³¸­¢;'-5%Y¦ëÄì\™dUN1A*пö[¨Í`­à*ø¢>˜pNËpC;±S»d—M¦j`(ôŸ«IËÕ¤%Ú 59k5;ÔG5âla–f­Ø¯X¯Ù!Ro׌ÉÇãÊqÕõ¨&ž©H‘!fD^FikâÙ‡„Ë’Î>¼XX’|æ³ÏåÊ­¡¼GÏîes`qäéðIùay6É cTQŸn%Æ ½6%ƒˆfmª#CŸ®³“DQ'w`F§^Ô*XX9õÅ‹§ô/~¢ÿÄÀÜ/ƒOKpËrÕv­=Îo×Ùõvƒ=Án´§ÚÓìéúÉ1sb†>CqL̰z­¦?n Ò­²ê]©ƒiƒéƒöÁ MmRiPj×èÖ‚Æõ¦`êÚ´`zÐÌR ©‡ÌCIÛÓÓFM‡Í¦@""kÉðIVE!Í´sI±”e”ÉO e‡½ºK®(Úø:Íkþ~à¯[C_…VÈ$êøàºÂJIãCw†jèJêrÔeÓúò#-¿æ¦Ð]¡ýiý†Ú^{$br5·‹¡€EÌP)ˆEF5j„,™$ TMä0‰hÐ:SÅlÁá&¤ˆz…‹Ó”u¤šV µ²FE½²AU¯Ž¿Hð)…ÿ†ux$@B@ ¨škÄ>ÙUŠ«”}ªšd›°K’ï„¢ŽÒ1ñ¨4¢U[S1Ó˜W±˜a”«?ÿɺ3¿[·ûóÝKÅô¥råß¿>9› Wž½EXO¸°Üdæ'’Õ‰…Š”&TÁÛ0•/¦Â¦1S˜%*²H‰Š¯Ÿ´ê<C|‰‹/iB|˨H×Ò âï†Ä£ôˆ0*ªØbBFaÚç»?gR1£È3ᓊ جdÒ¬€Á–¡ÍÈ`Öê4‹º4QîDZðÛSÜHOé?ñš#Öù Ë4ÙÍv‹Ýj·9í{¦—ÏÀ«õÆyã½:¯Þkð&x^“×ìµx­^›×áͬ·ºò4‡°øBöìä“rgl;qS§Ú®Þ& IÊžP?¥~B³#n„ŽJcš±ÄÇX¦>OíQg9&¬;Œê‚ú !˜4MAsдmAG0sl¥ƒÂj–R<ÎSŠAÃ` qÐ4hÞjÙj´ % ¥o·ou fŽÑ1aL$¼4žéûºG àÉâ$9çv¢°úÏþ>´+4ºF&/i'-¦×ËöʤЯþú]¨'W’Ñü¿R=Ý)ÊB»C^z5ÍJ äÐvúJèöÐ[Ù§'–¤ý‰æ‡n }™èOý÷д°õb1s–.Ž$’6K†hÊPXdVqx‡B)Ê ¢FžÄö%„î#Ñpé’³lªâ"se"šÿI¸LâÊO"IÊ/¬Mܰ]uËáUsÌõ‰ëdAÙ:ÅZKв“î„Gì€G“íŇžjlo<ú¬Ôqüí³íØ9vÚ -•+—žýðî/·„OJa£ÅTðé¬ñIiñ9É„J´(-#Ùj.J-ÉÌÈJÖâU MÎK¢†øM–H 1)¯$lOñ,!&ÞÎ_ì-ÑË&YÅÓÈ4:'!Sä%f¿½Ê3­hšoZq\…¥Ø[Z,~SwP[ W[ )™P[{CN·¶x#]¿Á¶!i›~Ȳö#u§ûú¢p8þ%ý˶Ã9/¸G}¦Zsƒg e}ö†Ü©;r’q:.Œ‹ãÒhÜ ú£†£æ±Ô‘Üñ¢1߸ïh1Ê, ;ä “Bn6YÒ©Ä”,—2®ì²4 -—•”ù¡òìBÊ’b¿ë m¼%i`î•÷ê©Øº^C—ˆ¢=ôö»?ü•ývó{ïØg¦âµwÝ&ŠÉTóüÀVÙ•«.š±¦K’â¦/¯—ÿúµ—éØŸ7_ÓÓµúî©”¤oÛÜØ±mµ1Û´óø"Lû“ðIÙ8ìÒJþH±Ä©)¶>ɬ!›F­°Zâ´(ðP)lz¾V(›«ß÷[–V»Üq~AC^¬˜¢õÅùâ}:ŸÞg(1{ÍqYæ2ѯõŠÍ2¦ú€±ZhPÏÖ4i´MÚ†¸Zs½Uu~%aãiµØ¢iu4xš£ыѕš>  ògŸa(n‡å¨L¹Ž®—m_¥Þ¤]·Á°Á²ÑŠpªÞ¡Ù­Ýf#/ÑWŽÊÇÔ/kŽi_еÚxxEhp¸˜Æ±°X`aKa”?à †þüᇠÅý»,—zäÐëË•g*C¯„Ž¿ýÛ¼ÖÓ!šUùñy »Z¥4r¥•”X›×.´6·Ú‰‹²Õ)@UpáÔž˜•ÁV¦\5M5M]‘ÉIêUø€.  cÀ0,kÀH $ÕØÎ@Vdì×|só냒×e3‚YÓÜB‰¶8y­#Z€cžñÕnÜ% ¥üÄyT8ª•m£¬¸Ú©Þ©ÙÁʉ´mYÃdësDyX5¢ÕÇŸ[¥aÓ°yØ2læ«4’ÁÖÉÎ7¢”"“cy&oç­ÓNghü¥u[‰ÛhܶÍçúöžv‹â½×Ü} õÀ†ïý’~ð»Ð»—.~Xþà™{Z;»?Ù›”àL¸öÞƒ?6eéo|xÓ¸9|R Á‡ÒÉ)$UOQÏÇIŽÔ8‡Éœšg7 HéÕ„Xí̃x1‘è`àû7à´c‘]w²;ÝKüšÃtRmPçê\úaŠ®–Öjfé_÷;×"üoB‹¶>Íc²¡q Y+ë7¬MÙ%ß•¼#e4]9)–Çâ…â|;Cɾ[kw~’$?ýAÓ§&×<Üþò—¢ÌI;þÜ|½øÀS9ù#i­×?Xà~23óƒguY®“4• ñ8"³FmÕ59Ž|]Þ¿GJÜÄAsãÜñy¦sŽÅe-'%´XòJÅ¿­8«†Î0ÔÚª3²L®ø\g•4Mj”ɾ™®^0”ô‘õtƒyƒeƒu[ü΄G“OÙ‘5FGãGL#æˈUlRlRnRmRoÒlÒnŠÛ­ñSä¦M)›R7¥mJßdß”ÑïØ 'ìL#¯Ð—¥qlIã¼ WkƵãqcñãñGŒc¦1ó˜õ¨mž1îÏ,Ç‚¨è7B‰ñ›¡Df }þõX²ùùób‰üÁ¿/;/–ˆ½ÿh:?˜ð5‚JSa§©$‹¼ÈOw¤¥ÚˆV£$i -p8lJ‡ÎlËs‘T*&k³4‚(K#ÚdIp±S»Ùùƒ×Æë |Ípx>crhq¹·Ó§®•»¬SâgÅ_8ƒùƶj‹Ûn}aƒy‡ñqÓy,aÌ8b:b6.Ži¢tb ÔPTæs•³ Ýe‚bÃζ= +-œîÏã„ÂxÓ†nN+ ÚÌ$¹Ì”É’¢5§ªêÔ™ªS>~¨ê |å¤!GãÔfÅ9ã³uÙz·1ÇäàI’“'°ÎIÎçÌpef;Ki‰P’ 54@k~#dy@PTõ Mµ¶&.WßT“6NàNV 7Ë ¸¹¼µ$HÖÒI9«<¨*ƒª e?]è× è  ý<Áê· $®Ma§hì„!uµ9Áœ ;˜ÌYõ°S;¤ÛiÝeJÚ‘¶ÒÅ&cÈMpsMn³ÓQévffÏ´Ô¦ ¥ 9u‘µ23WÍç+”Oò'VhîÑ´£Naœ×‰ÇP'ž¿Ñ½‚îhü˜n\?n8–0n7›ÚF“ÎmsãÎñ¬q×xöxθ{ëÊ[í Ý¿ÍìýÁ²ï¬Óû[1p½$ œ½]˜šèµµ·n)”-\”UjjnøÙ ¡bñЦ9sÚ››Ûo½Öæ‰Ú³d‚í$’½4­h ö¦<]6³«^ǬEnˆ—ËPýÍZN™¨ Ó˜©äjsuÌ*t5XüúxµÓì×”šk,“¾l2G¿¼¸ÐY‡w(®ÅÒˆýÚ¸=;AT ª·k†´[£ß@EŽ‹FÅ£ÚÑxËTU%i/cŠjYpõ£©uPµbûêk7KгS,¶…ó?*ÝÑÖv÷M‰…±œMº º0Lò·€ÁæÐf ¸Ðæ9ÍD—Fø™Ük“Îäš&Š ·úŸŸË±M)z¬©=o»áEÄt^DÔ¤³ 'ûB™Á7Îã:7ZÖ'ö¥¯u i¶&þÄ¡X/L{ë,›’6%GÒ³kÓ·!zìRïJÚ–©†µçm#“kl#Y±*aRžp¡á6Gè‰7~þ7QtЖÃ_ŠÛEúøõ?øÀ&ß°åCzòõÐëŸ=cÊ3¿AŸš©Orǹԙ„Õ9‰nß¹“0¾Å}ãø û†CWh+L,L*LÎ+gÙ23“2“£®£e±ÈkžèqóT:5»1[œJ§h+leE3t5E|Z“wKW…ÝUÅl2›68›œ YMYò]C‘¹GÏÙðó6<úµh˜•év˜wäŒZ_²&*¾^.?—»~žÒpÍ|O~ÎÛ+›F4¤;`‘Q›JA²Eþ½…\Æ¿·bß[œ©zñ”Ïû¯~!a^#nP>EžžRîV=¥~J3"iÔ˜<;bÍ,+6‹B¯õþ»¾Ïºæ¢Ç¦Š‡¶œ9!º·ÐCAiñ$‰ƒ•|îjËÕVÙ¤µ½ÀÙœñŸŸÍùv™ÆÔ 4(”*•ƒªGÕƒš­_ ÆYŽ’—è˜z,nÔ ɱl“ŸÅ)¢gqRF{Öo^ú±\Þ¾­].ѶËÖ&¶‹‡Î¾ÿÁ?x(½:[°Ÿý0«È|iÇ­?’"¹Öá×¥)ПŒÜÐIɦf¹L©DytAõ8åcî“I\’CVNJ¿$Ïì‚S*'Ò?r>[9‘Çf` ‹P+õK‘Çévi„ªfjÚ Ôˆ5R­¬OÜ {\Ø!ÉÆÈ²±IDz1¡ØH¥)g f'íCbœ(~töjáf.*öÖȯ!›&µB¢’’dËD8‰ý`Ò·i§|,å²”K•ŠZZ-«VÍÒÈÝ2—¦œÖRé‚%ã7lÕuµ´V}T¯¢ÄõRŸl½²Oµ^}µ¹j„›ŽIcŠˆÐ™"ÍTQ&zG¨•¿ø‡Ð/ÐWB§¥Eâ¡?O¯m¢ŸÑ£¡­ô>—KΞ’Va. r0`KX‹æ^X 9”«qН†>ƒdɲv…qZîŠ|CPWËi©¥õ ñë1JÉ SI”AÇTKÄz¹8 ÐGØ—j$ù„%O¬¡’«€ÝUAR?9BX¥|D.ÛIvÒ'ä/Q^8Ë‘Ì92çUg¶ í¡¯ö¡[ÄC§½Â ñ޳^áW„ó/:I¾]¿GȪ_º'0¯ÃþÒ‚Œ‚ü¯}´ëö=dõö§Ãá¹R²lÁYÊ1K¹GÊÊ<ùÏ.ž,ÈŸ5·Ã¾çÒšê(ÕšK«Ñ×Ò&û„nô×T§…ëáKBâb÷bÙâÓ⢅÷ÉámXZعT¶ð>qáuR矬s©ØøÄŽÓâüvŸlþi±Ý'¶µødm§ÅV¼µž[|bó¼‹dÍ!qÞEâÜ8;$6ÎÚ,kÄÛ°4«alÖfqÖuRC½KÖ°@lHõ.±næFY]Hœ¹Q¬%Ö„Äê8£Zœ/~V „Ä‹ž§†Äª)3eUÅ)3ÅògŲ艥!±$$?+úBbD/:-z 6˼§EOašÌsZ,L 6‹ù§Å¼ÜͲ<¼ K¹—»Y̽Nrç¸dîÅ¢; å¸ÄìÓçEWÖf™ë´è–²œ‹eY›Å¬ë$g¦Kæ\,:R¦Ktœ3¬>YÆfÑž¼Xf?-¦ŸÓБvZLMÙ,KÅÛ°”‚K)›Å”ë¤ä$—,y±˜’\bâiц¡¶Ó¢Õ'ZN‹fÓÅ2óiÑt±h ‰ !Ñ ,•N‹zI¦‰:“µ§EMHTß'*C¢"$ÊC¢LÚ(“¥¢ˆñâi HO‹ž¦Ko¾ƒæ]ðAòþ÷?RùoÔ|ÞIÎü÷žôûBîöŠíð3í¤çd—°§Ü‹ç›~*†””gT¿T¯Q¯ÑÜ€çÙSë‹›÷Fü÷øóOº½ºþa}H2,5¼ùíóÛç·Ïÿ3OÔÇ$ü„„¾$7’ <„d¤ F‰DBÆ&G¦ $*¢Fö£%q$žèëP“‰‰˜‰Y±$’$’LR)¥‘tb'ˆC™(w³ˆ‹d“â&¹$ä“RH<Ä‹ŠËGŠI )%~RFÊI©$SH™J."Ó\L¦dm¤†Ô’™¤ŽÔ“2‹4’Ùdi"sÉ<ÒLZH+i#íd>é H'YH‘Åäòr)é"—‘%d)é&ËÈr²‚ôËÉd%YEV“^$W’5¤ô“²–¬#W‘õd¹š\C6’kÉ&$1ד ›ÈÍä»är+¹|ÜN6“;]ï"w“{È÷Ér/ù¹Ü:ø‡äAò#Ô/?&“GÈ y”l%‘mäq2D¶“'Ȳ“ì¢"ù y’²Ÿ ÉÓägäò,9D~Nž#Ï“aò ò9L^$#d©ÐKdŒ%/“WÈ1òK2N~E^%ÇÉkäuò9AÞ$o‘ß·ÉoÉ;ä]òyŸœ¤•Q9UÿÀ•?’¿OÉßÈäKòWòùœ*©Šª©†jÉYGÂ4žêÈÇTO 4©‰š©…ZÉWÔFiM¦)ä4M¥i4ÚiußÑLê¤YÔE³iù3uÓ\šGóiùù-¤ê¥EÔG‹i -¥~ZFþ–Ó ZI>¤ShJ/"!: SJþD§Ó´šÖ KžIëÈßi=m ³h#MçÐ&:—üžÎ£Í´…¶Ò6ÚN>¡ói]@;éBòö¯EHK/¡ß¡—Ò.z]B—ÒnrŠ.£Ëé òí¡—Ó+èJºŠ®¦½4H¯¤khí§t-]G¯¢ëéz5½†n¤×ÒMô:z=½ÞHo"Лéwé-ôVzý½n¦wÐ;é]ä~z7½‡~Ÿüˆn¡÷ÒÐûèýôúCú ý}ˆþ˜>L¡ƒôQº•>F·ÑÇéÝNŸ ;èNº‹î¦?¡OÒ§èúot/ý)ÝG÷Óô }šþŒ>CŸ¥‡èÏésôy:LA_ ‡é‹t„ŽÒ#•=J_¦¯Ðcô—tœþоJMÓ×èëô z‚¾Iߢ¿¡oÓßÒwè»ô=ú>=IGOÿ@? ÒèéÇôOôßé)úgú ý ý”þUÁçô ú7ú%ýúý;=MÿAÏг4DÃp*‚(H‚L A)¨µ ´Bœ/è½`£`Ì‚E° 6!QšÓÖØ¨\Ö³¼/ص¤[Õ¿¢g5o)º'ÞWE®ô-ë_±>¸¢{µ6ؽ¦§wé’îÕýÝk4KzW­êêZÂ>).î]Þ»ºû ÅÅ«º–¬é]-¿ø²5Ýk»53–ô¬Y2°jÙÊK{ûåÕKºØå꾕]}+5‘»ä5¼WQ½¹†ß,ÕàÍÌs”3—t/íY¹²KšÉ®Ô»"¯ïïY¹´[Q%PÏ (ê#䕳&îkd"4FDhìZ2Ðß­lŒ^“ÏáŸåsøUåœh·¢)J²‰“T5-½led`sô-2¾y‚L ïÖ´L®52¤ubH[Dض(å6NYÖ¶¦gõrUÛ}E[DxÍüs”Tó—öt¯éîëé“/X¾¦ ú]0‰M'¿OêÄ]QÚ]EtEi-™´K˜.–FtÑÑwô®îˆþ»¥î¨—G¥×,ŸDc9[‡ç:=ÑÑWLh|%ã²2Â%21åÊ =¬ŽhpuD=«'4Þ•¢7¢ñÞ˜Æ×Dß"ã×Lé‹h¼o’*ú#Cú'† D4>¥<Ñø×ø@LãQ-­›¤ñu1¯h|ý$6"ßÀæØaÑeÑQá‰WvñÊàŠ.izw—lf\FVݽ²¿KQìëYÙ»Zêı[W %Õ÷¢9«+삉®ºli—0{@˜3 tôÀ{qanؼ¢WÖÒ³|U—ØÚ5 h‹ç®ègà5·¯GÖŹ^Ƹ.ç\—r®ÝQ®Wv±Ÿsía\¯à\WF¸®®êÁbp–âðëcüä‹Ä~°ˆ² ‚å¼ðQÖ»ª{y—¬Íç+*Uu­îíï^Ù݃ÏÞâ²nYïêÞ¾¸ òOj®ÞÔFÂ?(¡ÞP1}D®G§ùÐ6i°º‰1åM]´‚‰ºëýîÉô»'è÷Äè÷N¦?0™~oŒ¾– Ÿ ®­ŸôA7p>gFvŸ7WÓ×FDøw-ëé)òz‹Êb­òX«b¢åóÆZE±–/Ö*޵Jb­ÒXËkÅxøb<|1Å1Å1Å1Å1Å1Å1Å1Å1Å1Å1%1%1%1%1%1%1%1%1%1%1¥1*¥±;JcTJcøc­Ò YŠÎq+ñ(ñ(=Ç#"Ÿ¿¨¸4&½?v¯?Æ×£âQñǨ”Å$(‹i£,F¯,6²˜6Êb<Êb<Êb<Êb<Êb<Êc<Êc<Êc<Êc<Êc<Êc<Êc<Êc<Êc<Êc<*b<*b<*b<*b<*b<*b<*b<*&xàk•ÄZ稔Çúb²TLÈRãVä-µü±Ö91ùb+ˆvlÎI›¥ß'Õ ¬é¸Pä•-)ÇÒ(áÑË—"›‘!ØûK9ú«{¼Þ‹½•ÄÍxíÁk·ô$™*=ˆê`íC½°G¨–ž”ՑݤObe\º\‰Zd Ù(WFž¨R¶È‹Q—<,0òM<å &ŒÜâÇô2@ÕâIr›puÛ=âõ –*ûÙ­h È-r-*¥¯Q'=@e¿ˆ<ÉòTÔd&Ô[ëÄÅ'Å›Qq­#—Op?B½EL‘ïðJó—ýì;ºª¿«’×Ͻwg#{ÿEõwkC[ΞPT.F*ç㣕éRJéÒÿ!ÿ[‚þšßÿÇ´ÍíJ¹øì BT`?Á~­þúÉ#/ùÒ¨]¥à»ùC"§GÙß1Fýü?ûäƒüï?û [þ«³!éáÙ!¿>ïüãïHÒµsžr¼_‹÷;ÉÃ4‹Ñ2ZG»Qç_8"Œ ïˆ×Šß7‹w‹Š;Ä=â/Ä_JZÉ,y¤R©IZ$}Gº'íæ´Ïí¢]aWÙÍö${šÝawÙ½öJ{µý1ûî K†#Ãår‡Î‘à0;’iŽWP7µÂ.‡^ÿ[ „^ /d>8/„ÒrxáøáÕðÁkà™Õ^O/£sáŸSù‚zÉg´ˆüúÈ—´˜|EKÉÐòwê'ÿ e$D+I˜N¡„V‘3t*9 ;£ti€Jôb*Ћ¨ŒN§rØž‚öP%½œªé ª"oP ­¦ñt&ÕÁ;âh-ÕÒª§õÔ@¨Öš@gQMÍtµÐ&æÃÔFçÑ$ÚBi3M¦­4…¶Ñ4:Ÿ¦Òvj§ h:í ´“:èBšIQ'] ¼„ºèwh6½”æÑ¥äYšo,¤Ëi]O~?êÇïÁ§ßž¡==EcghûèÞIçhûaI?8ïìíßèO£§k‡èo=AOÒ·è›Ñ±·ƒ`¤ïœwÞvÞ ™ ô‚$Ä rA=ëR ‚YPÓß ønÍ¥KXô¬ßFŸo£Ïÿ™è­°ÒL ‡q«åì_.qò¨Y§Š”…÷+¯+9V…Ö#7U!Ïtç#'U!·Ô;‘«aÆ#6…Y6l¿´„O­á`Røe`Jø3 3ü°‚çÍ•«Âpìä÷îC.¬E>] Ô“dÅZþ7x´È¤3pÍÞ 4…®Z»Öða`bx0)<LSÂÙÀ}÷‡§†@×úh¯ZðÒC ÕÀ$PÖsè‘Ïúÿ–…+¿VrœfªÂ7§B~=4ã.àr/ÄÜõdqx'¤7b¼ïZ@Ç@lá1 ?<ÜžÜî /C¡G.:‘Ð ÷-ác@kø$Ð>ds4bŽS U#4“ˆÚCvu¡c@=æh"†ÐÓ@c8ýC8!Vh›ùU ï·r´…C'€I“C')¡SÀT~õ¦Ð6T6ºð]@}ø !|3Є1fÈÉ®Z·­áM@ÖÅŒac’x?[3¤Ý L…Ì$-ü´o1; ¨= 4‡ïáùc«¤`‡PÛLä#ÙÜ- ö20\¬ê8_±F £c@sø \P¯ØÈ¤ð" £`…A`jø TlZÜkƒ<{F¬‘ tžšÃ+€ÌÚÆåa?¡¼Uxá'I˜£ ÔvS`‰çU [ÇDPÃì÷÷ŒZ"¨ -˜Q"¨} ´ÁNAíeV3†ë€ÉáCÀh; «ù4P™“°š€ÆpÙp¨]´€fV3´…/&ÂØoï_gUh¸ÈdKÂL‹Q•ê`ŸÉ ó1é*tZ ádHõÐ~˜I’¹Î“Aç8«h¡Ÿèê  ÔR0GÐ~Ȩ¥€Ú“@ äOµE@ôœj÷“ÂW“9Ì52ü7•Y4i)÷&aÓà#_ vÞ‡¨â$*øšÜõ¨¸Ä»r’\Žðb'ññv G?|Ç ÿ],?¬àíJŽUˆ N€äNR Ow’Î¥–·gr¬ãXèä$ ¼= zs’F.ÃlŽsxOǹçqlæã[8ÍVÞnãýó9vÀ*œˆ~Ï;¡ 'Y½9Q±³y]Ê9ÞÆGîàW÷AÏNÄŠ2àÁp-"¢Ñ úè,hã0—cïñ†?!^eA3¬í‡ÌYÐÉCÀòð'À ÐÏ‚NV!*fAl|;§3Ÿ·;° YðeâBÔwuèqûü/6žú8–pd‘ÓúìjìÐ ¬Å¼\Ð*k3Mº ÉcÀ9¼Ýı™iåØÎ)Ìçm¦1dx‚ ¢CÚlpÈæž éâ.Dàl<ãù) C7Ç<Žù à•Ù¤·=½Ø¡²±Ï©Å¼§”£|³¡«A`9¿ZØ• ]1œÍgcv·«ùÕ:޳á×9ÜVs ç=@=âI¤½è„Vs ±`.GÇŽ~Dƒp|Xmç€ã'ÀJŽS Ÿp|8•©†‡æ`½Nky{&Ç:Ž ¡ŸHŰ>ž›dã[ùÕvN­3Ê5¾ìÄzå@Ï oÃHìüЃ›GH7f”Éö:Þ6„3€Nì\nÌå £3uc_« ³^ưÜÝm/°ÞØŒutÃ;X»«ãÆŠŸvðžE˜»qŠäÂö`ßá Û;rÁý  |sÁ÷e`V$Úû X}æB{ ™mçBoì*[¯\Èðpæ’ .oc¿Èý“@fÍÎè´@?¸çá.Ö®ãØ©òp×ï1‚ÏÇx†,Sɇ0Ìáèæ˜Ë1c>ÇBŽŽÅK92^ù˜Å `ô–ùNÿæC~Ö_ÍGÎäXDZãÈœì^‹h¨Õ% Ûq ¾V­~Þ*è @o…s ¨‡– 1ò0Ð…¥kz;0–Pˆ•e=%ý|d9ì§Zý8ûh!Vù°±¥«Ì°V]ˆU>œÇ±Qˆµfívh¬kÍèwÀf a{ÀEáVक़¯rž²]Õ Ÿ²]ÕÃã½rÞÌåèã臮<ÐÞR ‹ùèð`%Ǫðt`5|Ça”ë <…õ4ÂO=ð8°;Œ²½ì€~<ÐíÕÀNì¿H¸¸#| p_xp?ï?ýx!í—@½<&{yLöBB†~ðõrûñr/+Âø·z¬Wîbm'ìª#?2+-‚ÿ2ÜÙ|¿h@\òaä`ôìãÑÞ‡»^–AŸ>Ìý°’ãÌÎ \l„$>Ðd8¾àü¾.„6|еoC1ô¨ }Ô#Ó+Fr ˜Þd¾_Œ9¾ ÌÆ¼ŠIÇ\ÈYLòx;Ÿ£‡£9v1ôð*ÿÒ¬§”£yr1d~ XίVBÅy'° ùU1VíjàLŽuðåbìË¿6ò1MðÜb¬Ý•Àv.ç|h¸k·Ø ÍcvŒæ"Ø ÷ŽÒ­³ê'¨ƒ]•bŽÇ€¬K)l,è‚T¥˜ÑI`>î-…ü¬ÇÏG–A«¥ù#`oWrdÕS)d>¬…¯•BfÖn„•BNÖÓÁG.‚J±²[¡s?Ïiý¬Î0Ò=ïº0G?$9̇ ~ììl¤÷—pô#·ôójΩƀ°?¤bÈj?¤úX˱Žc3¼Æ}á÷ÀVÞf{®Ÿg&~H¸‡”ÁŽu°ó2héо˜~˜ù‘›ð«.Ø^ädÈV¿ ²¶ñ¼ ÏD¼* ËP 2¬Ân[©îÖÂ§Ê kÏâ÷6b-Êx )ƒœìjjŠ2¬òíÀdàeðÍË€È6Ë -“jïù)²ß2xè6à~Dƒ2xèìå:HRÎj; +ç.‡„oë¡“rð}8›c<¢ÙÃy[àã儵Y¦Tî¯b½* «Z<+À+¨ÇêTðl¹‚k¬‚{Pø^ tÁC+ 1†>Ž%Ë»· ¹q @oÐÒ-À:Žõ¶‚ç¢ÐÌF`Ö·:aíEØ%+È¥¨ß* vàO‘÷VÀÆLÐ;“°’KXÉ%¬äVr +¹„•\ÂJ.a%—°’KXÉ%¬„®ž2 +¹l•\¶J.[%ÖîÉV í±6“°’KX mvðžEœÎ¥\*&g%—³’Ë9R}4`EX¶^ tÁö¦@’q`>f1ò°žŽeÜoª±S ÃFŽÍ!fVaîϵª sgö§‡-UK0ó­ÂÜ{NìUàx 0—c>¼  YÛÏï*ƒõVAÞdö}¼¦ Ü;5° ñеë86plD4«‚Næð\` ïoåØn2{®Âø%pª¹*èq–<Ü«‚%¿…}WÛž ù§ ˆ9SùN=¾ÿ °;æTpßlÄŽ<‡€ÐÃTXl-pt~fzX€p¢Ç§À*ÄÌj¾ó²Ó–ýx›åWÕ<·¯Fl¹Xɱ »v5fý°…c;ÓjÕ˜ÑÛ@–[Vó]¯¹Ö1à>ø]5f4<k©áõi x–!ÔÀÎ?²}°†ïƒ5 ü)pä©Í—‹ íîé5 ¶x{J-—¿úÙ4À—k±C}ôñv²‚ZHޏ‹} ØÛ¨E=ÂÚMÛ8¶c7©åµ[-ÛµàÈÚûOjÁq Ùã5“ki&ŸïL>ß™<·¬ÃÕç€zdju<˪ã;ud¸ÈòÕ:ès#°’#Ógæ~ 8 –PÙNgsœÃ{š8Îå8cG¦Ÿ:^»Õñ|¯ŽëªŽëªŽÇ¨:H5¼az«Ã,ž„%ÔcOLê`«õY 4 ~Ö“,¬i=vs†¥«aóõX÷€u¼= –SÏ}¿ž×Èõ–õ4qœËqÇfDõzÈÌÚíœÂ|xS=dft ªÔ“Nð¯'ìÔ¦Q‚I²ò×CZvïA~ïÐsßÁ ç1 ‹Û \ ˜û[ÀEÐ@î}¸¶Ñ€{ÇÉ,¾ÛÎâò,Èó%p>æ5 2œvB³pïp¼f·®Yܺq×3@VÛ6bç: œÉÛu86óþVÞ^7‚&»—6 žîÃîÙÊ€Ñ?›ÓœÍéÌæfCž·läl>r69‡Ë?‡gïs Ï àxëP8 ¬…„s k×qlàØÌû;x»ZšÃÏrç€>£¹¶:ô‘&nÕM<ënâVÝ„ñÇ̪çrîs¹öær¯Ÿ šŸ`ü\®½¹y È´7—ko.×Þ<~ï<¬nÐÀÛeˆ$óø*̵Ol-æñµ˜ÇiÎã4çñ™ÇiÎã4çqšÍÜËšùù[3h> dþÕÌ=«™{V3÷¬fîYÍܳš¹g5sÏjæžÕÌ=«™{V3÷¬fîYͰ¨óy»ƒãXc3¤: dkÚÌ=«™{V3$|¸~Ô Ÿ!-\Â.[ o-<¾µðøÖÂ-¶…{k ÷Öî­-<¾µ€ÚNà~~/óÓV]Û°£}ÔbLè_ÔCmàÂÚ©§ ;ÚÐ ûiCäa=eÈ”Ú`'¬]ƒÈßkawÍä=u||=¬¢ 6ÃzfA?m“q™Íqïiâ8—ã<ŽÍœN §Ùй´A{¬Ÿùx|<ØÁ¯.@œiƒ³ž…ðî6Øap,¹ûx÷ñvÌë=^•©¬Jj‡ü›€á`%Ǫp#°úlÇŒ>ÖÂÛ1†Í[x+o³Ì­W íÐù1 ³®vn]íÜ7Û!Éà~h¾’< éUð°ù|Ÿšy2,žÏçñ|>¸¬å8“cÇŽÍç£â˜¹§;‘çÌǬ“û8…ýÐÌ|ðú õ‰Ùi÷‘pÙd>ÒÁg×._›9¶ð6£î5ü<§3:\ˆì}Fm?æØú¯C4¿\.ãßëh†0ûýP*4¼6sèÄì`^¬Írª˜ k³zyϬ`}ÙøvÄ„|v x _€y±ö>>~?|§õ@²Nð‚ç€×q`èt‚×!`5oÏäX.°=6†UO°=†sxOÇy›ùÈ6Þnç÷v€/ã×"XN'×p'×p'×ðB~ú±ûËB¾w/„<ï«aá ¡á#À:Þf2,äg Á‹õ·òþxèBP>Ü_Êcà§‚>þ¥@ÇTȳˆkufú4°Œ÷WC†EXÓãÀZޞɱŽcG–™,Â|_Îå8c3äY„Õg÷¶ñžvȳò°»öc.‹ Ï'd1$²opCÖN… ‹‘{ìVÃ#ÃfÄÕÅÜ~óf1?…[Ìó„Å É®ÄNz fñ°«| r`†U°ÆÛ°Æ­@¶óÞÆ+£ÛàM{€,ßÛÉWy'ŸûNøo;°’c2ð}³hgá `¢Ç>\=¬F ß- gòvo7ðöÜðÀy›yKø.`+¼fôÃúÛ‘'Ã{÷AÂ'ÐÆ>ø£°ÚØi/!û!I2ÐÖ’\ª\ª\ª\ª\ª\ª\ª\ª\ª\ª\ª\ª\ª\ª\ª\ª\ª\ª\ª\ª\ª\ª\ªäÖè äÑ ¡ð zFøÙòrø1`*‹è6Xɱ*¬ÎÐov¢º¡ükˆ9Äÿo“ÚDl‡ð‰ýNÂF]±ßK̉þR—¡ Ÿ"mö{ÜùѶˆè½8Ú–@íÚh[FläÎh[Ntd(ÚV°ì?ÚV;ù{´­'*šmˆœ:¢í¢§9ì×™’ Ÿ¢åÑ6% ôµh[ Zúa´-’éô³h["v¡$Ú–¯ÐmËIšpS´­ · [£m% ˆ¹Ñ¶ž$ˆ—GÛ¢¯‰¶ˆ]¼5g‰Û>£7¸~MÏòýö¢ŠŠŠŸ×[jŸÞÓß׿¦»k•gf×Ê®`×òÞ>{uw_ÏòÕö™kz‚…ö‹W®´ó»úìkºûº×¬í^Z8éÿ¢éZÙ³dâcoïöHO¾}fwïªîþ5=Kì¾¢¢ØøèåUË–—ô÷¬-),±·tíÅ^;ÄñGÆM¿¢à|º·Ù{úì]öþ5]K»Wu­¹Â޻쿖ÿ¿ðO¦2Á’ä%ÄUŸÁƒºvØÃÚ¾"Dö,`'›x–¢o:®÷óß©®!ݤ‹°“×™x_‰W¯å Ó‡qÕ¸ÚÇi­Æ§™ÝK0¢Ÿ.Æè•x?Ç«bwtã}-p)FÖòß  §‹s¾¹P?çÕ©¿~µÏ+К<&ŸóîÆ•UÀ~Îq ûw41·¢ Ð?ÿîUü—ºA´úñ,€\%ì£Z@-ˆ÷bhÅÕŽÿùïð—&·àµE'7óv6¹™÷oC}ÌtÈþ}Ïȃ¾Jg‘¤ ¼6Eøñ1O’Ä"ÄÙSä!)‘ŒˆûÈ|+8CRñº„|ûøöñíãÛÇ·oÿ?yëˆèݨ4”²™Ò+„„|‘wárr£°L) ™ ’J‰ðÔ\bo˜¸{æÅ³ÿêà‚Ü2Ñ•‹÷¥„<òÞ ìªóÿÍNÈÿêÿå endstream endobj 474 0 obj 15701 endobj 475 0 obj 29668 endobj 225 0 obj <> endobj 477 0 obj <> stream xÚ]”ÑŠÚ@†ïóÓ‹ÂöÂgΙYA„ÅRºm—uûq2±š„/|ûÆùd >2ñ|ÿN>~xÙ/žêþîsi^Ó¹¿Œ1-vß«¡Xîž¿ÞÌÇËÒÆíV%TC+(Aj —É•@+H! yÈAèRh y¨‚t€¡­¡ª2YÌ3‹™`f1Ì,f‚™ÅL0³˜ f3ÁÌâ"¸X\—¹¬Lˆv…ví í:ÚÚu´+´ëÈ dpX+ÖkÅÚa­X;¬k‡µbíhIiIèÅÓ‹0Á3A˜à™ LðL&x&<„'æybBKž–„–<- -yZZò´¤´äiIiÉÓ’Ò’§%¥¥@KJ†@%C ƒ’!AÉÈ ddP22(” aWë¾C·%»½Þ7^ÆqÞéüžÈ[{Û×¶K﯒¡nwåï_G£z endstream endobj 478 0 obj 493 endobj 476 0 obj <> /FontDescriptor 479 0 R /W [ 0[600.09765625]15[289.0625 330.078 289.063 539.063 578.125 578.125 578.125 578.125 578.125 578.125 578.125 578.125 578.125 578.125 289.063]35[975.09765625 675.781 553.223 601.074 645.996 487.793 462.891]43[673.828125 253.906]46[620.1171875 401.855 835.938 758.789 782.227 527.832]53[558.10546875 525.879 451.172 660.156 639.16]61[575.1953125]68[564.94140625 564.941 420.898 564.941 500.977 303.223 562.012 540.039 252.93]78[525.87890625 238.77 801.758 540.039 547.852 564.941]85[367.1875 410.156 273.926 535.156 487.793 783.203 548.828 520.02] ] /BaseFont/GFEDCB+FuturaHv >> endobj 479 0 obj <> endobj 480 0 obj <> stream xÚí½ |”ÕÙ7|ν͚Ì>“™l“=“…ɾÌIHB ÈN J„°(KHÂ.Fl­Õ¢ÕÖZK­,‹hmkQI ,æ±¢hmE\ªVêc­ErÏû?g&C\Ú¾Ï÷=ß÷þ¾ßçÜÎÎÜsîëºÎµœs]羉„B,D‡yÆäÆÙ•·•gBãp¶dYkg;q¾ÏÆw󲕛–6ÿþL;¾/ÁÏ9KÛ—­zOøÏ£„”ރ߿×ÞÑÖþþÉ}ŸR†ëéù•k·þìºûŒ ü,•µ¯éì:7ý·ïrU!Q¿Z¼¾Ë»lÛzЛú :<°¼­uÉ{ +î%¤q;ãß8{VÝwï;1ßÁCH\Žf¿6‘éïà÷ÔÅ«ZÛg¼±à9Bš´„èߺ±­cõ‹q¯½FÈ‚ „¸?[Õº±]Z.ÒÉú{W·®j3¬ÔÝOH—yV/_Õµñýµ!»Ñ®lšå/¸oâC?!ä–7ÑR&aøÂ ñe\-ÿ’Úu]ë:Z½u뽡 ¿ ‹Š§æå $ú*-ˆ™Ð`m,Uï—–Ê»ÑÖOÀ(Õ¥žje« ÿÑ3ò‰ùÌ…3òl–$KZ’%i©D.wб—ßUï×Döq‡âƒ,ZõQúõÆÚ€Ž¯$R"Hæ3GËËqýå£y³Ÿæ ãÄ Ò@ä$±„ éB:õ±¨ÙS3Ͼfþoˆ<BŽ@™¥´lA 5GÜMú„Óô´ §Ñ4!W$èáQñ8 CÂh\Hêhо§¾ùÛƒÔ7r›°æ%ãi·pƒpä)<,¸A“2aøPòÀÕ®ÆÙ×ü#ÖÃnyQðÓnªgôºƒçèYZL ÄwX':ŒD1†è}r”ѳÍ#§bÄ¢’fWR’Ó‹‹J œôì’º)mmS¦´Ý1eñ’Úº%K˜%(‰WOKzåä\ˆ&¢@Å4ú%å]¸`-·–çN§é‚O¹Ö ³¿Na åÂ>qˆ ÒZ)Ô“Md#Ý î#{…cô˜ çªÊ ’þòÀãâxeÉg+fh~ ûû‚ç¤ °¢ñôjÀ"¦;té&‡#!†ˆFE´Æpó3A>¹`¾˜°ç)R²6Ëà7¤Û|.MšÁkÓ8›ô¦€ƒë6†Kƒ#,eDZBª’еyÚÝäèsƒ}ª³/z¿y}3Ú/ú%¿ìWü¿Ö¯ó›üf¿ÅoõÛüv¿c‚8AWU]b.±ÙÆ»„©FÛ oŒšh™hkt­×ôÑ^¹WÓgè5÷Úûœ'éQù¨æ¤! #§EBJ²à°[ ¬if’’L,fRX@ÄßïìØ~×Ú®»i†úâ¥ÏÕWhö¥Ë4WÔ~D³Õ—>þ‹úïtÜ_ÕûÔú]Co¤O©Ïë£ EKd2;`Ò%'f)‘ˆT1Ÿ¹|Ô³ù/_€ª2Å©T(k$9[œ Œ«DiÔï¡…ëFÁÒÍá­âfi@ú¨%É–$f¨¯©¯o¡/ÊUBþR…¹!¶rÑš€Gp8 Z·Á”àt§à0ȔȂÕ@!“9j±–3ò_¸|ôkçô5´Z¨ÅJ^ñ¤¯Ø¨Ñoð+h­@è9¼Žbš'”ØKyŽRgž³‰LšÄ&©InRš4Mæ&K“µÉÖdor4¹ºé&¡[×­ï6t»£º£×[¼Lû,Ò#ÌAœQðHˆÑM[è¡]تݬ[ï<@÷ =81ôúCt@89ŽŠGÄà ã yÈæYG;„Mb—v½}½£Ë¹—>Œ‹öˆK{4{tûŒ{l»ì{{œcJƒÊqãñ¨¡è£–ì§Ç)ÌGéU´¸(=%Yq$Á9œ» j’¤üËÑT]:mÉ‚ùKÔ?~òá‡Á;_ØFÿCxñžÇgÍo½å†O(yóø½ê9õƒGCvA •Ã.™´1–nv[Ýž8¯Þ­ˆo‚ÏfvZÒS¢âH¼“ZR¢Ø<«øÂ&À2Ì8<ÂŽ^0^[FL™f¼öªè*k•­Ê^SCji€N—ê5 ÚF]£~RT}tMÌZa«¼UÛe]@>¨ÝcÝ?`=êHÌURìÉŽ”˜t·×=A)Ò”Eç™òÌkž-ÏžçÈ‹)pçyòbó⦓©4 ¤€\«ÔjªµídÝ$}À0-jjtStÀ0,kÀ°Otb&¹ž@l ®.¾)¾.¡)¡tÒv¡Kj7¶GµGw¹Ûàãñ{™îÍ$)9=£4^qÛ l!2ß%’_RÏoxîÚªµ·^ýÀ¾ïNùîÄÚ»„OFÎå'M*ÊÍÃóŠ@‚—x©WH×xõ^ƒ×èòFgÙ“c¼qÞø¨4gd™ø‚¹¸¹p„ÍÕíðÇ”ð%½ÁÑ7hr 8º†=C±Qöl‡×•3AWb/qÔGךkí“Ω®õö ŽÝŽ=1{⇢Ž9†œ§\Çbx؇&dõiv¶XYKiåZK»—®è¾uiÛ-4E}íüyõì Ý4‘ÎT7èüŽw©‰ž»á»·¶¯Þ~ת×Ô×hê¶Ð˜“ôäÈ/½ú ›«kãLg éD·ì¤"ˆ¤1Ÿ e\|évæ"~+G^%L•t¡˜” §’¾ç@® ް"âjÅ>*äJ¹r™F…q#½IØ(î¦{ÏÀ’Xv)5< >.¬’ìò³—ª$•å™"_G…s1?m $ç&‰‡É“¡óÄ:2ò’R•\b¤YVšJ„EHHÍCäÁ°æ‹¯\äëÈh¢†EÆ æ(>MN¼/ÁŸåõ{Ç%U …¨¢UB•X%UÉåJ•R¥©ÒVéªôU†*{•£ÊYSå®òTÅVÅUÅW%T%Vy'$U%—¤TåTåV«ò‡—)²þkq|a©³Äxšâšâ›š§zë“ÙÓäkÊjÊnÊiÊ:®i\“¿“¬£ë 1Üíîµã:ýlzëî7õÙqö»v¹{=ã÷%LëÏÜïëÏ:ÝŸ³×?l<5=l²³v ;†§]'ÓÓ‡3†3Oú†³†³·dÇ¥¡*¶Ë“Jr7yÖÅõF÷Zú<}q{Ò÷dÚØ:\ƒ™6fÐ1Þ&Ži‡Ÿ¢’ÒqHR ¤ÐZ#oºaE÷Í7¬ØœÛ:köò%³ç^Oç«ïú‰zþÞ[;n¤ò«¯SÒqã-÷СU7ݲâ†[ºEËœ¶eWÏ]±täÁ×.þ»½ì+ؽù©·Þ9ÒÑ—í{‘Ç1÷IãGn«ÎdÖyÙbzl‚Ùd´"Š-ã˜3Ï,åáór¨6ä\IšÓ¢Ó͹–,«ßéwùcün¿g‚Xn2ûÌiV4xË_öá¯sV¯õ˜éˆé„Uªžfª¶Ôzêã6Eo40õYûœû]CÑ'M/XÝCñ毫 ƒGS²<¿.ݶ´mÛ-K—wÓ”¶©o£N¼C?ÎùŽúŸ4ãüyê“|«·o_Ív“úçaµX˜®ÑÓ¨s¿§éê ^wIÑ<ŠQ&Š/GVŒ‘X•¶„²&ó`¤ ûr.;¶ ³|mEöåÊL¸w´DÙš»`#™LGåÉF"êIJÒ"§Y—è3m:¯YŒ7±¨t|âÄ„êä$oš­¬4; Yƒ˜fËŽ²%¥)î¨ü«ª1û=ƒ’Z¬.žï±¥‘GëevöÌà+ƒƒ¡\ÿç‚]ïK•Ø|œêIOòfy³½9)yé…éUÞÉF?M12¿’©ñk2µ~m¦Î¯ËÔûõ™(Î2Í~s¦ÅoÉ´ú­™6¿-Óî·g:üŽL§ß™éò»2cü1™n8H¬?ÎïOð'ú½þ¤ÌdrfŠ?%3ÕŸš™æOËL÷§gfø323ý™Ù~_UV`Â×®Õ\íÕ8ÂNtÊmÉôù}é¥YeùB^|InɤšÄ@âTÿä’êòÚ UMUëKÖ–öJ»­»m¨×<{2Œëó÷ì*ÜW¾¿bßU{{'¥¤EçúrJÒJ«ä«4yFöñ Iã}%9¹…eEU哊&7ÊJ£¦Ñ0ÍZ멚05yZZu^í„ ¹›ü›ÊwI{¢Zö[û­}¶Ý`³?©7ywÚ£™}¾½Y{²{sŒÛçß]°¿°·¬¯|ß„½WõUíìš´{ò)ËuØ:äJšÄÜ|¸y)¯ Ó3˜Ÿ§s?wºJ ÅhʶâL’—Õ—I©¥.EJ }ñ©×Ø\×õ𴫯þqŒhT_T×l¡¥÷¶þl/už±>­øñï‹¢;ý§Ï¨£ð»]m wÒæ‡hÉwgîP÷?­Îù\¨¢Gé*ú†¨9÷ýógÿpÅ_ÔÕoÏ›>kFÿž¿ÐêI¯yÚèÐ'Ò¨·.¡€§Þ­žVw.¹îÎÎ.úz Ý'¸Õžë?%Dîä¹®žl8©NöÙ®N£È’@‰NÔÌG²„Î_yùÌ6ÓLGÒhŠ˜£õ!Ù­ °”Tˆl¹J[ŠE¤^lk”d—°_ګݯëÕ‘!É3ŽdQŸv-Ó–èö‘>Ôy}bŸfŸÖÈ|É@i’ˆ¸áùçÄmêcm#—ª FºThîY3rˆÎU÷CT¾{µs%ËOµÄB¼ä™@R‚è‰6z\NÙãPēѡH DGc‰d’$gfÍ‚£l´°l£¹¨ò"+pó]¹¾J_a©²”{ª<•±eqUqÓtuú&}½§ÉÓÛW¿É²Ÿî—wj÷±ü;êQS¿i·ùK¯m¿§ßs ¶7î‘ÄþÄ!Û }Ð={,Î7ÁS‘8I7ÝSˆ[gßìîökšv[öÚuïD÷½ñ½‰ƒöa÷1#´ø„Šq´e‡•ÿÞðj#|ºmÓôé[·Ö®Ýf6¯¿‰v«¯ªoª÷ÑÉÔJÅÛÖÝ5Dÿ¸t•:cµpáÚêC GN¼õ¡¢|ñæÎ¨C{l§s˜›¼p»£œF³Ž8E³WçôŠ]‚Ç&‰âÁ UÙå ÏAå‘:ttCg´nñðp÷à‡ûæ|ÓW©§õRµarT]ÌVa£´QÛ©ÇâÝeÚlYïXïÚ³›íß)ýÊAM¯vOô=j0 ºNÇ Çx“I²±€§1"ÚFccTmL£»CêÔn5uZ»ìëbv‘>\Æ+Gkì¢CŽ!W‚3 ‘Ž8§ËÂ"•ð­ž’R©÷ªZÕÝêjús:§ûéMÏ,zE ~øÂ–#3f›BŸ t}>¯D}¼vªúþûÕ?ÏœËöDácÃ>Ö@¥í”ÝFE4%"é$!ÊÊëwh(¼Á‚”±¤IhÔ4˜šLÓÌ›éfíMæçûÅ>ÙX#ÔŒu曄NM»~£a“y¯°W< ïUöi¢¹ÜölgŠÛžˆ‡>;×ÐðÆßi…Ú¨nTÑ"ú }J”þB —T÷õêJE«v2û"Äm¼H XµnEr N½›èdI#"ûg†-¸P’òÌ…<Æ`ô·]¾$*j.}‰½AðSõõoj7÷›Û@wèêHNÀDÜZÅ-9±¼ 2õÜ[ x’]ÒÊ2$“¬¸»B}ƒ:^}IøXO„ï¬ Ñ'a™¥¸Ìþ€EpkõŠSBÈ D# ²‘ÅëN¾òr%§Ï+aTÁÒ±âK¨/\`µ«`Ç›³¹[èùýÀƒà!óaÁ‰í_`zà: ² ù¤Âå‘ÝhëÉ=«^#ˆZÙ)½ S”V<„öõPyi.æhrµ( ŠQö”é'¢>mÐL×Öéô›ézaƒf“~/Ù‡)w7¦º½º£ä8êöÍiísúÄlš¬IÃeõ¤ål®K³^ÿ饅^íýI2ˆþ„ž¥§>1ò*Ù­þpä2/¡×޼.f\~ #ž$<3r‡˜Â÷%KzæDDW…ÉÏ~!ïÂLø nûº-ÈzÅ”‘ù4—nQ´Ÿ œ®™¥täó€[/ ¢AëTDb4èuZ,¢@ D6¡Å"¬¤–dÂö¬³¤,9IÉÕdbÉÈ2 Æi‘X$Ê¥J‰&O[¬ËÓ—ØÔ1E¨ÑLÑyÒI–%úpQ.@UªG¹"”Ë…ú<}0M®ÕMÖ×lWÒØÐFsIŽÑ­”©B¾ìöJûä>Íí.}~Ñ0Uh¦‰µÒt¹NiRê4Mš©¼|ÙD6ÓuÊzÍfíÃzcŸ°Oê•û´;u ½ÆC,ß-i “lI(ã”õìÝê±ÇÔcw«g_¦k©@]´EZõùÙ[Ñ^ž/î‹øÖ<ŽZfÀ=KCE¢¢¤ãê XÅV1Žú&ÈAº[Ø«ôi†ÉI: ÇyV9©Ö k‡u–,Á/TÅšMÂzMŸÐ§9I CÃgȨ¯ä£Î†i†dýÓÙç#•æûXw¸Î ,¢×¡ó†öü%£"}yÏÿÊ"ðu›Å¿¾IØ,­Óvè×Fm²vÛº]}´Wè÷JȽÊMf/–Î=ú>ÃÞè½æ½vW¨ôŒž¦*s•%´ÇSåØL»Åni³Ü­lÒtk»u› ›¢»MÍ[-ÝŒ´½Û±‹ì¥=`Ѓ‰ur@s@Û£{†Ýmè1öDíŒî1í1ï³ì±í±÷8v;÷ºz\Ãâ°4,+!å ›†ÍÖaë°mØ>ì¨ýê­¤H¶vþïÇŽÿýïÇý–©SÕßà˜Šc2Ž'DéM§¾óæ›ê;4îMu¯ZDOÑ8N©EL¿l~Søúa#·²Ç(zÌÎhE´ð$JLöéG—ÐD:ßGó5Úý&ºE¿ÉÖGú±`öc 釙û5hùV ¾ßÐo}Ô6L†é°–~ØÀå-×”ëË åÆ*c—a‹u·p@ƒÓf›j¤ÙIßôJÂðM ·uÒRõßÕ‘lL-ó©…&Kù«;ÕÊ7¾ªGö)Ú¿’Ñ1måcrnÙa@Þå4êôV¬‹ Ëj]”“O–á…¦LŒ­òh^`Q².M_¬Tè*ô•†ñörG•c’Ž-•]ºMz¾Û©éÓ>¬Ûcës8²u>Ô1¡JÆgÏu(e†*C¹ý&Ý&óN¡GîQz5=Ú>Ìn;hßé8n¶{Æ’&ÑÐY%|zëw««¿ómz»úcõ>Œ²‡ÊÔtèRÕê6õº¶ËY³#UŠö¿{üUÙŒà9ñâ#éîxgªÙ£Qôb¼Ûƒ¥U#:œ ›9ÕëqGI ñ n[ß` ÕæåÖÈnþÑp.ÅÞy{–%5MðÉY¦,s–%-&99=U3æFL­ áØº3Óä7e%g§d¥šó=E±y±ë„MR‡fyƒk]òºÔöÔ]ò£ÊNÌn»Í}–G<S{ÓNCÒ å¸c þDÂpBR¦)=5-½\®Ô”X*Ý¡<·(ušfºgݪ¬wÜìÙ”ºOÙƒ¤ªÏýˆ§/©/y_Z_:Ö*eÈ2`=n?3w:1et;~ÌvfFxcÄéÒ„«#—Ó•@ÅKêåOú.•=“øðÂë®ÿVïáû©üÆí/Ôü2þÖÚ×¾žé<²“îÿãÅ-k^žÑ6NÃÆ–¶¿{ðBÛ’ã§Ïš°e½Ãxãf;Ö²ÛáoR0IÄ­8±”!ý ¢¤5³½5£³S(1Õr 2' kP—Iü$CöÊR$3oWÿ¨¾¤þQì”ÔÏ…ÐÖ.Z‹<ù¬Â2¾…»I§Ñ-:̧ܵ’bLŠŸ„¼;/WOk¥j¹5M?íXšÒ‡ect«ßÜo¤ÖZ¡O蕘Yøæ Ÿ]Ü&t[yÌYô‘ú fëÒm[n¹‰– óQ¶=M›h–øØåØí¸ÿ'⻑×l>¾w¹--‹ÄIy©†”L3Z©aA¨ùH²-Ì )GÎVüJ¹Š^…‰n Ô‘:Q¨k¤©Êz²YÜ$m”û0­BHqŸŸD2…d)*+EnS$ÈÕ¤ŽNÃyÙ€IýyÙŠqð­L•}ª^ý¥ª§Í´Šíß?ÃBs›´…„å•nã6¼/`–Ý×-ÊT$¢ÀˆGϰý>ý]¼|1/“…€'“C›Y夈b±Ô‰k$S*ɤYR¦\L*$etýÿ:£§®'»IŸ´[>FOJ'dM'¹IÚ$ïC2öˆtuÃ)iPÝg‹e’Eºm¤Vèýü6$R÷°œGý”{…@Òà‰|ÿ)Žü2€2Sç‰=.ÇâpeÅf=Q„jç¾QÀ³ìPÅþKû$_(¡â¹Ðñ8ÂB$¹+LùîƒÖ]N¹H(ÕW»{ĉMu=˜êzt=æKu—­Ç¾ËÑãìqõºm¡{t<‘‹Þ&w '÷äuÀ)¬wÓ/mÑѤb¶m!ó»®â$‘t_{íÖ›®»îfš¨žÏ¹cÁ°ª_wwM¤ŸnصsãÆ‡wªÛ:ë§Òœ?¤¹Ój;ÙZ°”ïSïàzYˆuyD«M'z<:²ˆO– …‡Óª®˜‚‚PÚ=¦´DädÉ㥆˜ðm.¶¢†bÆÓ{ n ÖœSs0ºcÝ;­ùÒNmš]`s‘ƒE4»-`'°1°±Ð>õ`ÝgïsõzzãXiqB8!‹'¥aÍ㑨#ÑGLÏbV>b9j-õYÂþh¨2Â…U®ÐÝ¡n¹Ké6¬5nµv'î3°ôYØúœ}®>÷*•!éyópbBdÓT##KâIC©k̽á´mÕ´i«­Âa*ŽLwlž>yUìŸ*ßúé›êRÏðYjf,îèjŸ–jZ´¡z|ç†nšññ[´Hý_¯ÝpÊUÊ!T0¿ÄF&­bõ$’äT² iB4‘”hDvŸª?ÚA“MÎ,3Í dféêzõ}v©uÞnT=¼ŠèAšm{àf=Sh­q|Ý#,ûÝ‘ýps؈_W%!´´»úH¯KbªaxJq¡…ßp9B¡i)V=©¾ÕÝ}èpÌøS¬3Pú¤(\VEáÍ=}JQ.+Ò¬…êû<GΆצLò!²T£Õ¯KÏ=):O¼Óc5ŤdÅ;2²}6jMwóÐôú¡ÊcÞañÛô_šÒ¾66¿òŠ5MHJË·å§IEÂ4Ë4kuš4&}<Y÷p,Vˆî3ï´õ¹&ìJ>=d>i?áJH6®OûâJ·;ª×Ò×ß“°+±Ç»+©'¹'¥'u ê¤Åñå(6+I‘D&м²ý9H>T/ÑÔŽkÖ´|}l7ª—.í+™¸ööGÇ.v”íŠaÞ³!/tF™µ‚ÈIæ,CŽŽ=„iÔ}¸”ãEüå £Þ•“n-±´;Æ<È!‡2Â~k¿-:M“]béU˜Ç X4¼v·„Ff]Óœñ#õíšÆY7°µÌ÷³{v3:–=xÇÈe¬açê À®E0ìWس—&’0h¢„l"±§Íün!HÕ—Í+yå$S’…/¦µ–‡-:zÒlìm±ªoÑWkMM+{‹éB­Vsl_4ºÐ“eß'Ë–sÂeäËeØP¥o‘•h u d*¦­Ñu’õB—æ8&ž!Í1½9‹úišÖ«-¡Sh½ö&ÂüàyNx^õÅí/)WíQŸbª WѹêÁ>rAÙñùèoÕ‰!ÙèmM$I‡…&nd¿/`ôÊkåYìzD!¤ë$z#… B×*ZÄR29Hµ´HPqöd-'%º³ìÙV‰ÓkanXÛa!¶nñËüá­Ð†×eþloa£6yœMN1%6Õ[[Ïd\ñ…±Ó [Åúúû½ýIýÉý©¶H ¥ðKÁ1zkv²/þY×PÌqÏñØSq§ãµ©ÞÔÒÔ¼Ô¦ÔGc\§<ÃøáD܉x#߯ºâQW\ËÁ]Ër0E«¾SZ;íõmŽPHöö¥m·%äì_¼ã{ÂŒ­-?Ù>ryôS¼¸®±~îܦ…OŸ èÌFº.­@¢ áÀÈþ‡Á”hÌÒø¢Ó­>[±¥!ª)jí˜éS®ÄÈ Í³¦!óqË0ÊPw–’¦Iα{”AùTÔ`ô Ó ósã—#Çñµ‘óÓŸFQß8|"´Ærš áûËÿ°ˆÏ`³bøc3_yöÕæ£>9Wñi|æK®5Çæ³ë"ÛÿlöÿÁNéí}_T_t¯y¯e¿­×¾Ç9u"zÐ|Ì>äxÖù¼Ë2æ‘Jm“®>šÝH¸’îí'h¸KÚ%ïQvkva–<¨?`è:€µê ù€­ÇqÀÙëêwq·k0êx4{TbØü‚eØú‚m̆§ÃÎÒ𜠿i{ûâe·~kéÝ4Y={þ-õ Ízç<õÑÏ6öülËÖ‡ì~G=I‹Þ}úÕÓ\KG.H‹ÂuÒò@œÕ¤s9Â劗#;ñ¥‚À|al©7^ªÿåÀA”¦4‰µ( þI9q«8é–E¬¸nMør9°~'+voàåÀÈ&Eèäå@ا%ŒÃBfbˆÉ¨—4Z*y©)KŸð7hÑYù$gó`-_<#ORyM^³×2%J“ËÌ”Øó6 \b1¼ÌGüT” cýžõLºÌm7; DU=õÓ‡ÕFñâK·¯Ô…ŸGž ¹ÒÈKT«Ó”–,êâlÄi3‰$ÙaÊJ׷ѧ%º‰Õ˜Ùólé)óà £O0}Q4™äZsmY^ékïê§s?NÇö㙤P7Á6!ni’&ë¦Y§Ù¦%mŽïÓ´€OŸ 'ée0éDêé4GuÂäÄÉÞM–›¬=d—¶×rÐúˆ­ßv ¶/þŒ>n¶½úB«am_ØP*»¡Äö“|}Êp¯(ª¬™{ý]_|òºû‹¾ãkÈ?iöõßúÞ+¿éz:*iÅYþIiÅßßp÷Þñå;}Iþ´âÚ¤ìžîÛßTÚOòåBøhsÀŒ4Q«W²¢£DÖˆÆðCl±¬„uóï¢á»$á$ÈÀ5òå‡üQþ¨arD>¢ †£”+i{Ö2ÿ.õüÚµ4ñ®Ñ®FýUÈž×ÞïŠág÷Œî5yØ^S¶ÕÄÖ˜¯ÝkŠë£=Ò^y̆ÒÕ~›a?í“ÃàóEÃÊE´â]4J }Q'…“ÒsÆ“QÚµ¶‡iŸðˆÜµ?úaÛ=!êONDù&ÓöØí)ñÝWßÿøEš8cvÓ,š@Ÿÿüƒ·¨ d^Úº´Uhïóˆc< ò“,’ì𾔆mL9j¹²3Uí#éb†äåÏ­”“±X*•ëI­¸¬§›…âFi/é¥û…}â^i¿2DŽ ÇÄcÒ %.U.–;å>ú¼,î>ÅRñcõ^õmõ:áÙ#âÅËVñâH·°mtïI™™Œä³€Ç E¨9[¢üž•&tÏ*Š(Qñ°€ó»VµiÄK²…41Mb“}º&Wç×¥è³å$tëb °Jm¥®JçHFWJ†&CçÕ¥¼†4c±¶Ðgˆ³?Åk†(v‹*üüt™X%–kËõõBØ$N6 ézy½vaP9ª4˜½ÑÅR¾n¼¾žÔõb­Ò¨«5®' ¡õÒy£²Q³Q»Y×¥ß`èÓŸ Çéqaz:" *ƒšãÚ“Æáè¤Ðþ–!¤'ü§LWª¾³?ÔµƒN8¼ŸÆï?ÌT&4ôBm]ÂvöæþüŒ= ÝhFÀeÐÊ‚¤S²EÂ[zé¥"ÃÛwÖò.rÝy}•Á‘©õé|†¢ÇI!Þ"ÑÊWBiå8Z*”êJ ÉÃIòœ|LÐ èŒÉb2¬PJÊ…2m:ÔÓZ±FÓ ÛEͬ•G4ýÚ>Ý)2LOA¬¤=-–‡å“ʰrJ3¬9Åî’èNé‡õ§ Æðãí¼¤3ró™@!AòöýBŸ¼[yXÛg8F†PÑž´†ýÈwcý݃õw¿®ÏpJ€Œ§µ¡\ËÀvC™ª©´JýÉk/«=ôõ^Ú:ø+ºH½‹–ªC‚BßgwäÔ6DcÍôAÇòí€E‘3.­F‘E* DÒ²§QÃR³°¹vœ˜+ù”,_SFJi±P"•( ¤šÖÂ=j¤Zyªf³ÜGö lJ}rŸÒ§a®Ë|9—¦ŠIJªf<- ”:¶rk¥µÊ.²îf)…b ”‰/ùFN«Ï½¤~‹^õâ°xñïª+¾<²Qø.9ºÓKr¼æÇ„´ú%®žï=¾ )7çK_½f÷12㱨MÞ§‚Áó¥XyÁcrÜcbšö1)-åü?úñ|nÎÔó½M­©S­YTs³æ£É¾á4Î×Tç’§„[ÁzU¬›b—ëTqŠ]¬UÅUœŽH¾Ì…²o»è»EÊÌH—3Š™)#]LŸ(¦¥n—Ó.‰iG¤Ô”…rêv1õvëDNY(¦¤ät1É=QNÚ.zñáÝ.&â#q»˜¿]N¸$&‘âãÊñÛÅø[¤¸Øt9n¡bÓEúy¶‹î‰bŒk»XsItm—D‡}¢ì¸$Ú'Š6U´ª¢EÍ&»lVE“]Œ2öÊQªhì [E½*ê´9²6GÔÜ(*ª(«¢$4ËÒý¢H&Êâ%QÀ‡Ð,R|ÐK8'’§è’Ûî¢ÙÿèE²ÿxŇþ­bò?=n ? ÏPBwÐW„âw$­ô†¼QTžÓL×Ü}åÐ^ÖÍ×}¤¿Sÿ¦Áh¨À±Òp+Ž?­ÆÇŒ—°ÚqÜij4}ÛôŠy\ø¸{ìañXn¶Ú­ÙZl°ßcÓáıÄq«3Îy³+Ùõ¿‹éŠyÚì^éÑ{~ëüæøæøæø?s!4y¨Ÿ’Óäk^B,–_½D"9«†°§sô¨ ŒÈÒ¢‰‰˜‘™[‰ 5ƒƒ8‰ …¼›xH,ªÛx’@±¨&aþI!©¨ÈÒIÉ$>’E²IÉ%㈟ä‘|‚R‰‘bRBJI)'d<©$ÈU¤ ÇD2‰L&Õ¤†Ô’)¤ŽÔ“2•4’id:i"3ÈÕd&™Ef“9d.™G擤™\CZÈBr-¹Ž,"­äz²˜,!m¨Y—‘ådfÃÉJ²Š¬&kH;YK:H'é"ëÒF²‘l"›ÉrÙJn&Ýä²ÜJ¾E¾Mn#ß!·“ï’;Èä{d;¹‹ÜM¾Oî!÷bný!¹üˆÜO~L ?!;ÈOɃägä!òsÒC&;É.²›ì!½d/ÙGúÛ¡É#äQÒO#ÿF'¿ ‡Èä0y’"#ŸOÉ’É_©–ꨙ‘ŒÐ(¤ÑÔD> fj¡Vj£vê Nê"ŸÑê¦KãÈ%Ú&‘z‘¿%“·h M¥i4fÐLòÔG³h6Í¡¹äò9‡Â>æÓZH‹h1-¡¥äCZFËiùO+ézQiÖ¦H)ù3D'ÓjZCkéZGþNëiJé4:6Ñämz5IgÑÙtK.Òyt>]@›é5ä]r™¶ m¾–^GÑVz=]L—Ð6r.¥Ëèrò]Ao 7Ò•t]M×Ðvº–vÐNÚE×ÑõtÝH7ÑÍt ½‰n¥7Ónz ÝFo¥ß¢ß&?§·ÑïÐÛéwéôNú=ºÞEï¦ß'?¦÷Ð{éÈOéé}ôGô~úcúý ÖÙŸÒéÏèCôç´‡>LwÒ]t7ÝC{é^ºöÑýô=H¡Ò~úý7ú8ý=DŸ ‡é“ô)úKú4ýý5ý }†þ–¡ÏÒçèóô( ƒô=N‡è z’ž¢§é t˜þ;}‘þ޾DÏЗé+ô,}•¾FO_§ ¤oÐsôMzž¾EߦïÐwéŸè{ô}úý3ý^ ÿA/Ò¿ÐèÒé_é'ôoôSú_ô3úwz‰~N/ÓªÒ Â5¬ ’ Š ´‚NÐ Á(D Ñ‚I0 Á*Ø»àœ‚KˆÜÒô9Ú¥+–u¶·.nÓu-_±š·4m£Ÿ«B¿t.íZ¾©}yÛjc{[ÇŠ5K·­îjë0,^³jUkëböM3qͲ5«ÛnÔL\Õº¸cÍjeâõmëÛ “¯èX¼nÕÒ•m¥ÉKÖt)Õ‹[ÙÏÕ+[;—kjBW)5ü¬¦&|q ¿XªÁ†)W(h§,n[²båÊVi û¥îÊ/J}׊•KÚ4õaõœ€¦>D^;uôºF&BcH„ÆÖÅëºÚ´áß”éü»2ÿª>­i “lâ$uMK®_ê83üê?s”Ì,~Ú0kŒp³C]fv™vN˜òNYžÓ±bõ2ÝœQúš9!á ó®PÒÍ[²¢­£­sE§²`YG+ô»` ›f~ÔŒ1jZô[CŠh ÓZ<Æ‹™.–„tÑÒ[øª¶þÛ¥¶°—…¥7,Cc³Ãò+'4+½oÕøJÆeeˆKh`Ú•£zXÒàêzVj|MXŠ5!¯‰h¼#üêß1J¦3¤ñÎ1ªè uéí².¤ñuaÊëB_Ç5¾.¢ñua-m£ñ o i|Ó6›CßÌÆ¸"ÄbE˜ÅŠ —åÉW¶/o•&µuµÊSZ2ruÛÊ®VMM{犕kVKÍøA¬Á³—£%Õ¯Asjk{{+\tÕõKZ…ië„éë„ù+à‹+qaÆ qæò5ò¬ËVµŠ³[×iæ„H‰3–¯'ã=£s…Üʹ^ϸ.ã\—p®ma®›Wöc纂q½‘s]âºz°qŒÁYŠà×Éø)óÅ.°]fÛ–‹ñÆWyͪ¶e­òœ‚‚üb]ëê5]m+ÛVà{^ai›ÜµfõšÎ¨Qòoz®Þ4†¿h¡ÞÐ1}„~?ôeΘÎú&Æ”7Máó£Lô­Wè·¥ß6JE„þš±ô×¥¿&BßȺ7ÖùbZ÷EÎôlûÂXí_êâߺtÅŠü¼¼üÒH«,Ò*mäEZù‘VA¤UiEZÅ‘VI¤áQáQáQáQáQáQáQáQáQáQáQáQáQáQáQáQáQáQáQáQáQáQáQ¡R¹¢8B¥8"AI¤U<*KþnÅÅÅWx„ä+É/,ŽH_¹¶$·$B¥$B¥$B¥4"AiD¥z¥‘q”F´QáQáQáQáQáQáQáQáQáQáQáQáQáQáQáQáQáQáQáQáQáQáQ>ÊG¤Ui]¡R9‘¥|T–ü·ü¼âH«$ÒºÂ#"_Ä‚hGltE‚È(K"ýòóäÅe°ŠÁ¼l ó|I1Ç©f]ÇͺÕ+òò&æäæ)4Yw©ô(Y.í@¦=9¦‚Ïb¡XzT®#I§Äʸ$E‹ìÌGT¢*ÚкÀGÞUv„ªˆG|ûuÆ{¨‡²T|Œ]/?‹ü·à`ìëf|ÞM¢i4Ÿ–Ò:Ú†ÚýÂ1aHø£x³x§¸]¼G|XìŸ_Œ’CòKÅR“Ô"]'Ý›p[Â_½¢WãÕy^7Á›ìM÷æy+¼ÕÞ]ÞƒIΤä¤ôd!YI6%[“Éžä„äìäºäEÉmi'>’>‚AîS\ÒC3i -§t9$„¯B‚oC‚»Å{Å]â~ñßÄç$*EKN)O*‘®–®•îIøvÂÇ^K`ó²?&ãå”HàŽH°„K@ƒÁàÛô'°Ìñ±±ÄD¬šñNÂÛCÈÈë#¿¾úud/Þ‡®ô~óÍ7÷¼ùjäÛmoÞ÷Æ7'_õæ©s7œÛôÆýoì|ã{„œû.!ot½±öëÞð¿‘÷û¿˜ÿCþí˜(ÜHo¥÷Ñûé!DÌáw ÞÉ<>BŽP-4ãs)Þ«…o ß¾+ÜŽßïw w ? ÿà%Üzå¼þÈüù7ðØ÷àÕwß¿ÜMÞoÿ ÞþC¬Q‡ÿþþ<üè?`­ýäÏäCrÞü|ð¼—ÅÕ=ˆ¬“ˆ­ãðÊá°W^B¤ýŽ{f?"îDÈËÜ?—Su!~n@ Þˆø[‰ìA ®E²\‡(d·¢Ë…›‡[ƒ7!"F2¯ÝF¯§3¥~ò Í#Ó|ò7Z@>¥…ä3ZLþ‹‘¿Óò9-%*­ A:+n%¹L'ø¥UT¤*щT WQ™NÂú¿œjè ª¥7P=Luäj Õ4šN¡&DG­¥FZCÍ´žZhµÁ[­t*²‰iÔA§S'mb1LcèÕÔCgQ7IcélGçÐ:ÆÓ¹ÔKÐDdI´™&Ók‡´ÐTºx-M§×!'YD³éò+šƒhG—!OYŠH~3ÇçÓo„÷Å }±Côñ1{cOÀ“~ô…ý´£¿ï˜ýšþA0ѳô<}¾Þåz]°6úÇ/ì¡}a×KÐ fA¢EÃûWZÁŠÌHO/h»­4‹.f³—àäs×Q>‹ `¾|3åOÈûä#ÌzßÌ>ßÌ>ßÌ>ßÌ>ÿgfŸÐSqÄý ¡ÒÕpn=¼]Cìêyd²©È_u$7ø6°4xX|X|XìNà}ê‘¿êsæç!oÕ!ÏŒ6ödª=¸è@&l@œŒA®k žàGü¹Uû ¼g.ÇrŽÈ  Ã®jFÎl€üÕȬMÈnàºh#réIÀ\g"¶àÇ@»úÐ…Ã.ã‚€‡‚çOß>ü#¨Øƒz #øÐÅGã þ˜JØùäÝfR‚Q›¡_Ë9VOÇ€•Á­À Á—€×Ÿ¶?. > ùlÁ³@&…8ƒì¹ÃHháãµ€òGÀCÁýÀ' §Rõ¢^V5`Þ³A¶—€NÈlõŸ=ÁÀ8ÈoèóQ]ƒ;€¦ hæh &mÁ ]-dˆzèT?ºxŸŒÝNÜàbMv&–cÇø »êÛÁ °œ ’;@ù4ЂÑ9@óÐ<Æ*èÇš c0^h> dšw€æÛÀ¸à³ÀxXÓ [e-ß :ŸЪt^gUFê—nxtz±Ð›tžŒð1´ÄYÐ Ïà…* t\ì_ˆ™5]¸öS`\ðy`<|5Ü@ F-²Å€ÎN =c ÉyþïXÛ ú1 v Éc@m7h˜`A7$ÉZÀÝ jïíêY #x?Ð|qƒ·¸A‡÷·c!§tvãQºaMX4­@sp-Д€6ôñ`¤è>tﺂ ÀPó€r û·  3x;0^í·!zŒ¨c9…XP:aÇX\ûé*–Û µ)tÇõI®ZÀ%Ž+Žûd(¼tB'ˆÞà÷1°`èìz`£8ÈpyPí‚K<¼µÈ,KšnÔ»ñèÿ4F~+V2ÐŽØ0":Ry§"&X;SIVpXÀ±ˆc ""±y° S¡;€$±¹8…÷©‡ÿ¤’FxB*™Æq&??›ã|Ž àu©¤™c F—Š:9 ¸O%wð>}ðùTÄìmÀ'‚Ÿ„¥AWŸ-ð™4’ §a޳s{z<Óx¼§AÚ—€å “9Ï+áKi|vKC Ï®j é˜AÇMÐQ:›«€Že+A-ýÀ©à’ŽšŸaÇx]¤zhÁ “©žáâ@w.¼:ò¼ ,…Ý3 ûµ’g`f{ X‰qe@KŸÙœ– yâ&h24/S!C&ìò °€cÇX<”ÏËùµÁ Àñü|%Ç üÚ¼ÝÌ‘šýÍ¿ )¸ h ΦbðËÀŽ%ÓúŸ«G>RÍû`ß×€MðU$gí9¼=—_5÷ŸQûÀë=à"H•…q%MàžŽÇ€©K`÷,pyÈô“Åõ“ù¿œ€Ù ‹[-‹[- V`í&ŽWsœÃq>tž…‘~lá4B‡Ùàõ1ßí1«Ñ'tX›õɘ頜 Ä3ù¦¡Јfó39ˆ”Øôp?ãç˜Ç¯ÊçíÞ¿·‹x»˜·K9¯rh#‡Û(6z8·«9÷ZÞ Ç:Dmiàç›ø™™gsœËÏ/€Ï°\ h\Œô0–ÊåËhȪƒAbÌã¸6Æ!ÒŸfq̽ÆÁâ‹8–@¶q˜ËÌÀ2Øwò„x`%¤‡õ;XÈ6ÂÇÆÁçaŒã`ý§Í˜™ÇAÏwÁs³ §±Ëtiýˆ50”ýêY`®õCžÃÀR̺~Èð °<Ø ¬@¼øásÕœZ-ÇŒÑI—™¼=¶öCÆe>ÇÁCÀfŽ-Á`_pðò?æ™ïŸÄœ“ S€lȃ¦ãÕëøùFÈœ‹0œ‹ *¾Çz²øe~ dz·-Þ¦C’|îù<ÓËç~˜Ïý02¼¿1A“¸êi`*ogðÜ(v,ÀU§,Þ x¤@Ï+xÏñü*6“X¼¹"»j*oOçØÄqÇ«9Îâ8‡ã<ŽóùU×@Â>–BØë,ÐŒe>ù³ ÀøR!ä¼ ˜ß.$Ð|!Éäý³ø™lÞÎám?oç!Þ aÙ×…üL1ÇÞ§”s,ãg*0Kb\=ÀJØ«¶~8…cÇzø!,Îh6aÆ(„Ý¿œ ÍÂâ'×À·‹#)ÀùÐg1Ú±,&A¿cù˜Š_‹1Š À,ŽÙªW ©Þ–W1t>¬à×V Åê=`-Æ^ ©.ùµ3ù™ùüZ¦ÉbXùiàœ×“ðöH’d3Q ÷–èóe`:ú—@’·‹82-•ð™¤ò|,ÇKølYµTÂçÞxøKÀDM),xhÂZÊg€Rðú>0k})ìx˜Š-ßÇYs`£Rpgíøg)=ÞåðóRÌ +Y¾ ôk9Öa®.%S9ÇFÈ\ »°öLÎ}NðQà\¬’¥ÐLp—¤™c "½³ãÛìþ‚ã!Ø·±É¨= IÊ0–—€,³)ÃXž¦":ÊxPÆWÿ2ž”ñ ¤Œ¯zeð„³žÍ„å<óAƒÜ¯:yhAV  ™rÐÜd3R9t°€cÇRÄ~94 €^9ôð °Q9ÚcX ýŒ‡$'ðçñàþk` f°JŒý )ØÌ< ^QÉscè^T‰Qï¦Bo•àÂúgqÌÁX*Á…µK íJŒÝ d+W%8.Ö@畘CX»ŽShàm&C%ôÀ~ÉÏÌ nÎæíùpÊ‹8—¾ »;ô Ôn•ðÏ—O ê+áŸç±:šÀ5.üm¯@'@ªcÀ2~¦^1Ïx5ßÎç¿6Ã: ‡‡ÈUãÇÀ\Žåˆ¾«¸GTój¨šWÒÕÐÌ{ÀRXª³A/°®Æl°XÇû/ÇjPfÈr¿jäEìªCœóºjîu5 ü.Ђ¬͇€lŽ­…sÀfŽÌj0ê À' [ FýrFZË£²£v3á!µXI¥ˆ²ZHµ 8•÷iÇZ¬M¬ÝÄqǹ˜Ÿk±±«æs:-¡Òb–´UȘ¦ð±Oácœ /›9²¼®}ÎñõÕ´ "êx¥P‡UÚ dN¤Ú ,ÇjR½=¬ .e÷÷À±4fŽ×`f¨ãc¯ç«I=¯"êÁå4Ð yêÁå×À¸Ôó̤VþXÍÔó©žÏHõ°ø{Ày®ž,ÀHëI3Ç~í"Þç›G0Þjà“h7ðŠ \.YþÐÀÇ×Àóœž÷6ð±7àZ7ð ÐlÀµvhœ];•GèT®±©×y` ÆÕÈw ¹Ÿ4r?iÄx.DŸFP3ŸFPÓ“iüÌ4~f?3ôßš‘ONçþ3ÑlVCcÓ±:0œÂ±¶˜Ž¸c환¦Ãó‡ 0–éЃÞÀìÛÄ¥mâld»læØËÎà#šÁûÌà#š>çÍÙ¸f@B=rÖójÐuYÿ«a÷}@vÕÕüª«ùUWó«frÏ™Éwf¢ÿË@ 3y0Þr/°³åLxË ÀzH;s&ûu¢x&¨1¼³âLЂ 3)‘u™õ³@yXŠ˜Åým²Y<Êfq›Åým_ Pá`eŸÃ׬9Ðó@ |1˜Ãׂ9˜1Y>š?¬ls ÿsÀ)üL,;>å6Àç`-`}9Íi§ó3Mgp¼šãLøÉ̬=›÷œÃÛó³s`GÖ^€8›;2¼ñ;^Í~=„È‹4ŸD{.ϾæBÚÀrT s¡Õ}ÀÊà`-F=—×ÅsÁ‹á\ŽLÃs¡¥×-Ðð\xé9à°æ<¶‡ 4á×y<êçaNɲçæñŒn§<°Y†3·@ÏìL#?ÓÄ{Îàx5Ç™üªY¼=‡ã\DA Ÿ½[¸F[0Ò\ào Fê# ù ¶R²Ü~!ú™¬š^È5¿2¼œ _ZÈGt-$?Ì…u®…ü¯ËÁñZÄÅ{ÀJÄïmĎྮÝÁcá>cÜ(x ÈÖåûyŸý|w¹6rËý ³Xü°ÙË!H¸ÈòÞCè¹°Ü0šíþ#??]íNáX‡¨<-=œˆ;Í0œÉÅÛ³ù¯sx{.<ÿ¯¿ñ}§C<?„ˆx Ø‚q‚´³ ’<ÁwÑ£}М LE=~’ ¬Fd†<§p¬ƒ?†<û€3+†< gò_gñölþëÞž‹|û0äyÈÖôÃ|M? y¶À¾‡ù}„Ãä0¤z’ä-A;ðĮÈg⹨ÔøÚìyéôyå ˆ”‹Àvô{7¬°…Ýõb±njÿÿRÐ&B¦p#¾±û 14=r?tzè>G¾…Ú®˜n‹˜K¯ ·%ôÙnË$†Ün+DKv„ÛÌ];Ãm-ñ’sá6»Ÿ ·-DCµá¶•訉=}%±?Íñ ·)±ÒCá¶@¢é`¸-’z&Ü–ˆUЇÛ2ÉâÂm…˜…Æp[C6 -á¶–„WÂm3±ŠÎpÛB¢ÅÌpÛŠó%™‹}ÞÉkÚ7u¬X¶¼Ë›_^^ž[—Wì´¢«³«£­u•JëÊÖöÖek:½Õm+–­öNéX³®}œwâÊ•^~U§·£­³­c}Û’q‘ÿè̶eëV¶vŒ~ok]¿)Ç;¥mͪ¶®Ž‹½ùù‘®«–.k_ÜÕ•»¾h\‘wV[»·0Ï JBêÖ_ù“®èô¶z»:Z—´­jí¸Ñ»fé¿–ò_uøG¯G†½³—LæÏm"dº¬ çòáqìÈEž‡£ç&á÷.þœYi#­df‘)ø\‰w;ÞË@§ýªñk'§µߦ ÷²=ÆáÛDô^‰Ï+¼:ù7vE>×— g-¿—½gZñ{ÎÏÄ/Ëp†qëøÊïLžõCçØŽ«€]œÏbœ+Àˆò¿†ê*þD];útáÈÅ™"¶‰_gáúv|bôÞ°J¾@]ÿUŠ^pdcbß»øyöÜÞ*.õ8·ÿ'tù—ÂWÃë1eœfèÿÚK˜A´Ân2ŸÝÒ /õÞ¯ã]~+xO»ïÚð¹:ÖÿëèiN“*yyðSiÙ" ŸœM–Šï‘-â!öÿfÀ”¶„l´ìÿs¹?ÅùR²EyŒ˜+>'w9û›Ýøm®/&âƒÄ.בµr<ûÛ(W^ÒŽ/~ÿÂo·‘4¼—Š×òÏ4I naqKÝhÏ$K…ýý9ô+&Kéd©rYÊÎKׇ®ãzù×בx!ŸØ¥:r½ø^ðS¥ãZüLò‘hòÍë›×7¯o^ß¼¾yýÿä…5 n¦÷ ÐÊS¤S„¨¡OárZXªƒF ÿõ¡ñ6Œ^=ebãDÔIÞÏÅ®Úém‹à[DÈÏÏEt‘ÿ?¼„ü/“â/ñ endstream endobj 481 0 obj 18812 endobj 482 0 obj 33088 endobj 378 0 obj <> endobj 484 0 obj <> stream xÚ]ÏjÄ Æï>ÅôPØR³öÏ)–”ÒÚ.›öŒN²ÂFebyû+[è€Âç|ŸþÆÛ›cW´ë±x¸/ᄳ[HaѼKÏxÓ¾´ÖàGrªÃƒ±š²ze{Ú¨UÚÕ”ÃÝ:œZ;8VUÀO±9Za—^¼cü“4’±#ì¾›.ênñþ‚Ú%«kÐ8Ä‹"ˇœøA¿9UDë_ãkõ"éý/ƒrg/’´#²ªŒUCõ«fhõ¿~Nõƒ:KŠn!£[<ásrçó-·MueQ QÄL£' ÁX¼þŽw~K¥õäÈt„ endstream endobj 485 0 obj 239 endobj 483 0 obj <> /FontDescriptor 486 0 R /W [ 0[535.64453125]548[354.4921875] ] /BaseFont/GFEDCB+PalatinoLinotype-Roman >> endobj 486 0 obj <> endobj 487 0 obj <> stream xÚì½\S×û8üœ‘ CQ@DE!!¬¸ „ (2ÜUˆŒ ŽQ[·­V[»[­m­5‚µØÚj[»mÕN»Ôî]ýöÛ=ä}î½'!hûý¯÷ýýŸ÷ÓŸóœ{Îyæyθ—äGÔ41Ç’kR¿µ€\ ÀÓ&—”æÎ¤cܪØê—"s~éüÔ¯w¨Âû´‰%eÙw¯›~ï?è“Ucu6A8ø„ Åúšú¥Õ_ärâ} ò ¨nªi¼dÜi€YÈóÖœ’¼‰g~©ˆÄ²þššmMªÔ%ßè^½ªÞQijŶÙ9X¬Öf­:õ±a7ÀŒ^’üÊE.-;Òëu¼Ç6ü›&‡Óuä÷ŒµsGèkòKK&õöpÀõ7¡¼”ZdÐwMÐa€-ȆV6X›æœ6ŸÇûobÚëlÍSo,| à‘6¶>ÛTb¹jú–÷!?˜>±¨°dÅÖ£;ñþ:Ãðë’¦>ŸõýàÉÚFkƒíÃ%sQŸoŽ$=QÛàZð|dðFÔÿhaIRò5î³Ñçcûr|oP5PˆÆ»añø¡0¬˜¯À…JØ‹ù‡ñCa|‰ù¯ðCák„„lO†“á˜AR1ŸFnÁü­äQÌwÒ±@è8Z ŒÖÐß0ÿ;ý(ýƒ Œ2Œ­â‰@x7ã9|æóøTÌð…˜oæÍ@¹“?„ù½|/ææ§0ÿ ó¯ó71ÿ Û¿­JBݾ‡(È‚\ȇb˜ ó  ê¡®„•°n€-p+Ü »à!h‡ÇàIxŽÃkpÎÀGðZõÚ•ĥ٘ê!YöM ¦¹0Ó10¶ÈD)q.ÞÍF)6Ä10 Fc©yPÌ¡]2}$ ÆÔ‚m. ë' I–DŸ`”ýϰå0¹âKý0Â+yZD !¡Â-BÒùA „âHŠ êa@Ö{íÝ÷Áp^ÐÞË'¢'ó)<==F‚:á(¼çà ¸¿`çô"!$œh±gudÉ'¥¤‚, KÈrrÙFv‘‡Èr˜#ÇÉ»ä rüBjépÚ‹†ÀI8MÃQ¯‘hIÆÍW¤/éGú“02€ D®d‰$ƒÉE4(#šÄX2”Ä‘a$£h$I £Èh’H’Pºž$I!© {±× pŒï̇Šû '\rÔ³ýEÁêÉ¢þ ÀÅ—à‘¢ýúË0µÔR‰*à’;¥Íaoéa,])Jßõ–Þ„¥Eɯÿ,=,ðÌÿ)ÝúÿG|Õ%øMu¯þ ^ ò¼Á*—6×CTM³­†Ö[]8óôé ’S5GùQ8rå’"èyåøä'_R7Λ릚îÍ-ÀˆWcÌ÷Bƒ X¤²†²~Ò茫ʼKÊz§Ò,G¨þ²Ö¤ë§ËZKcM²œáܘƒ|±'qV­¢-EV´ÝÞèÐ7h¥«K\E¦übŽÀjþ À¸ÿNxí]Ùk?È^ë/é™c)ÓByqáT-ì*-ž¢…•ÓóJµ8G@Wô‘9 PÔM%¬@{{cMÈÿQ ©>ø?´ìæ«ê–Â%C‘O¯ËZý}Mhu³µj­ÕÍ•Ðìhli€+›¤t¹³¥É «-NØè´7VÃk½Ë ·ÖÚ.¸[ò3ìr6T6Áƒrê®·×Xá`"8\+¥OË%/T55Öàl„Ñ*ËfrçIÒ¥;µœú‰Þ–RŸ|€œÊiœö–SÅ Ár"§¡2×`9ö ôÉ?²1¦‹q®ÀhUV õ8ߎ³ñƒòêó´ìmŠ>d®ydµ¢Ù¨Ô“û”rZ!p“À;>®`vƒb%/R°jÀC•zU®‚ýʾþË0FàN œŒí .}qVc oûñ®®:Q¸6%B¹ Wõad&¹]ƳÈ2žMî–ñ²CÆsÉ.Ï“ç£>äÑú¥jÙ =NîÔm‚ú^A…c’lm;ßû|ZìöæÕdê4 9Í!W wéŽkâp´ª—{G5™NæË=@è0Ÿ{*µ¢ÃE9CÜëŠÄ8–()YFÖàím(5à襄—v?$ì|XØÙ.¬9ÐÃK{Dë}—xi¯ v êG||°¿‡—:߃>-ý/Ió'#àª.íõZv'öE‚pÕ¯#õ¤4i" I3q’sä#i\ Çº¹Ì%Wyd>9C>DÊA8ã•+î*I±‘jRCj‰]YE…Õ #F2†Œ%ãÈxÜsd’,b"ÙÄLrˆ…ä’‰dÉ#“ÉÜL%¤‘i¤˜”2ܸH YDãe)¹’\E®&×µdYOn"7“-d+Ù€#Š€GáØ×ãîhl†±Ç¶ÂMp3lƒ[p·tŽÐ;àN¸ ÷M÷àØÜŽãu'îa:qóWÖv’ÇÈhóÇä<î‚~'ü[²Œ´â.kYI®%בUd5YC®Ç]×&¯%›Éÿ%–¤ŽÀ½é8ÜëæÀ$\üŠ ÷‹sñÙ¡ jqgÝ.XWÃr¸÷×Q‹›P2Á–¤Î „j„„µÒ.îm„³ßÉ»v¸ú’°Œ|…cG߆pÂv7îÖø£‡°}LÜØ P—5p Þ„à[ø7ü@ÞGK¾¤¡|¿oçn~?Ê;ÅþÇ7‘Ç7Ú'íž9Ž×¾8b Më…F?Èû:Ôúߨ%}a5>•ò">ó^ÊËøt>ƒÏä³øl>‡ÏåWðy|>/çV^Á+y·ñj^Ãk¹/àu¼ž7ðFîàM|!îeÜÅ[ø"¾„/æKù•üj~ _Æ[ùr¾‚¯ä×òëø*¾š¯áëøZ¾žoàùõü¾‰oæ7ò­ü&~3Úv ¿í»ßÁïäwñ»ù=¼ ­ÝÁwò]ü^~ßÍïçðùþîæûÐûy;ïàø#ŠOøcüq~˜?ÁŸäGøQþš?Ãñgùsüyþ‘¿Ä_æÇù+üU~‚Ÿä§øUøìõ&>y½Òöæ'wÁ½øD²gÊp-܃Oc{1.÷áSÈ~\@<áQŒÔC¸N>‡á |V;‚O(Oáªy žgñÉíy|^y^‚—ñîU8ëü)Œ«70ÞÂØ: ïÀ»ð¼qŸk>Ä'¼áøŸó>ǧœ/ñiïk|6þãï<>óü {ã~Äžþ~_á7øþ€?á"ta¨B #œ¨ˆšøáÓ‘? $ˆãsR<ù–üH~Æék.‹-ÿW"dú›Yóß$F^ùo%õVáZ>mßvIër?yîãÙ3àÎ?ç¶RÜ=–ãü)½ÁXBã`l!Cd|3ÑÈø.-ã $VÆ7’8ßD"ç2Ó›I$¦›H¦w-¦ˆôFãF2Ó›ˆ´ûÙ*ëïÍIo0î’rò{iWánåÃ]|:Þ¹pçÜõŽ«C® 2•ôÌy·œ “øË;‘ .ñ¢ý¥½Ú¬”IïEn#éÍöº”û ÇÑÏ¢•”ÿ‘ü*—H{õ~8Ko”bExrº<›ûËOQCqß­CßÃ÷$2 w1ÃÑþÑ2¾™Œ½1RöF‚üÆ*QöF’ì ì ½ä i]WÉ+ò›I“r‹¢ǵ€B˜¼›Ü(ãy(½½ÑáÞ?G^9$oúɹ oNz‹vƒœûÊ““ßpÉïä÷[Åò³ ÃçŠõp+Î&såçéI7ŸQ»äi&˜y OGI@âÓRSbcÔaý’1;Ì7Ÿ> oXˆÔ”4Cò€°þêØ˜až<ùxPæ”ôÌŠ)ó–Þé¸rï™]{?|tgü£g.ž{íÔÅŸ?¾kËëËš×ÔÏ4M%ï% =µ4Û\³üŠ–»,Ûý~×c÷½—7ü⯾sñeÂ_ºç‹#·^Û¾ÑQvuÁ˜rÔµ‰…¸Æ:ñI­Ÿ]¤NÛ“é»nàŠ“\3ºrÙ¸kçMk[r£n%ÍÒ­$Ðöü¦ô÷¶ ?;îñA{WþV¢ëíÕ“PTǪÕ«Y÷ë×+¯Ñekn´¹ôuaRQ@¿>ÓmÍö{Mã(m^ce¢Þ ÓKýFz*´fGCƒ­¹Òn­×–8ª]‹­Í6mQKE½ÝYkkvjÍ&]ÔÀÞÆ4]ŠÎ¨“¯Ù{ã^—žlH5¦gÿW¨°â_»‰ ØŠëA·b]±žyÝn+&7•îþ\ExGiÙ³9k,“Ç>½ìôëo¿°|õõ§ƒþ5àÎãuŒhߴȹå…g+î÷m”ªåB?¨ï?õ[7û=iw®è¬(ÐGúãÅ ¯¯Ù|äá§}ãxµ*•¾uMjñG›Þ™ööï·DžðöâÏ™?øþƒ³/í¼vÃ˦§ÆÇLšt_•þpxI·0Ôë‘Ãî–ëv¬~¢jÉ3»“[šCF–ëò?ž”q¨xò´ðåKF_õ¦~ã³¶ÛL¦¤ï®¼ò çma›i®Ü`:yØ“¯d¤äœlùå«…ÇVDd Lüð³’?‹îTÝúáósOÿ¼5£j󷥯¾ôúë'çŸçwœ¡+?X;bÿ3…÷¾²°J?nÆÐQ„´¿uN­ÿb÷±'RŸ¿ãúµ/i^*™~£¯ÂãhÅÝznˆÒe¼=SÚÜâti l®ÅŽæ:OŸ^Ö§£t#•ŠØnJ{ƒM[â²64Ùk´%¶æEöJ›¶ØápéStÉJë„‚Bm~ž);/?¯t–Öd6[ŠJ-9£´Ã+GÓµ=eÈQ˜®KÕ'ëÒEúdƒ^Üþ÷7à?Åðë‰Ú µW¸bð~uûîÀGC{Ïx·ätËÇ/F¶¿ñ“ÿœ”¹ù¢ÐÉ÷"gzåóŸÖî¿ë蚸¯¯™â\°äå…a>7ó§{fÎÛÆÿ]:sÅà—ÞôfÌ̤7÷W]—öØM˜:ùËïÆÆì~Û²è;ëW<ñ–îK{óÿѯ0ÞqY s%†Ç„Þ¹J5áµ/—ÿ~Õ›üðÐÒ?TÜ<~aì ÃÏnìg[wqÔ²iöí/…î^þãOöôÔôÛêzUXžÛqﻩ­ª˜3Í£ùjÕî«ýlío¾ðó€©oùÝpGHýÌ‹©·¼´îž³¼éΑ×Xoxê‹À…·ßÿ|uEöø›oŠI¾5fÝúߪz ýñµß0~_AH£aðDèíïš¿þ=wæuë^Ê]»9î»þåÿÿ â‡ôñº8…qÔVÃciàßZú¿¥âßOÜ—Oòºw]Ò°ÖH!½Çúí½×ož¸ùý¡óìï´VlVë_yµkí¹oç¹éË7Ô™wíݱdö7¿þQi)ì lÔß‘¶g´ÿÙ9â÷ôžV®J-l}µ´ð䣣²Ož¼¾s^×Áå'?Þv 5&/;¤þõ[ÝdúÎgN$Þ3æ‡ÖûgÞ÷vŒíÓ{–Üyø‰ÙµsF_óç#”°¿è†òßo›¿ËÞñúUM ±Q9ÚiûbÞwÑ_ó¾4÷¡Õ S{%ü´é̹G¶}±a÷”/Lò¿Ëýî†wö¼Ä>õ›®þ¼`×Ä{OÍÈ}#cúѯ<3lìè¸äWïøèHÖįN7L\ôéQÝÎà寶ž»¬í×›GêÂ~{¡ÿ·¸¿,35厵L·²×„!mŒJCÊz¯ý1³jÀÛAN8mÙ2 åÿÒênÔô>«»N—¢Oó¬î+ÉÿŸ+¡ÏÕå(Dã/^œ¸ H˜XéhHj¶59œv—£yiRq‘I’áhnJÔV,ÕÛªGIq˜_š#År†~‚nœÂ'5Ç^cw¡À¼­¹Þêtj ÚÑÚ©öÊf‡UèÖcºµÞ^euÙÚEÉú@¿D¯îGËJôýt¡ÒM¯~3¬ÎZz.G£>D×Gq…_±­ªÁÑX¥Ò –JXÿ°nöfÔÑÑ,³õÔþMýD»4•lâ’÷ž~ÛGÓ§ð›=°è9Ý™ó#~ø­óŒk»ãá9#&j–Ü]úô™‰¯<æJP¿±*F?äõ¬ÛÓçÜýkΣ™sÏì½+«<~vøŒÉÎŒEißí7jUm /–ŽÓw´Çüþ‚íÎßLÌþâø Çk2ë§Æ4¿8ù­Óg¶t~7¸×/‹?ÇA´s¥Ê¡[©ª“=3¤§:ÐJÙ`ÎUµéVÜ$ݾb#.fËC®ÚöÉ)󟵷þ;ãxãØïWn¯ü/ˆâ•—ï“£%­8!]| ®¿NÚÅwïÒ0ê·ÐíØ$€«uhˆ÷Û<ͧM€Dº’Çb±¦mÄòøZ—«É9&)é?¨¹¨dûJÖ¹b%;PZkwj+mÍ.{µ½Òê²iíràJnsJÑÛl«¶5Û+m£´ÖÆ*­ÝåÔ¶8±™Sët5Û+]õKœ- l•.­Ë1J몵i»ýáå+ÅmQ³µÒ%-L¸D¸l ¶F—v8j2"ÕtJ ô‰:²Èj¯·VÔKšôäÖm€Öêðw†Ž•´¶Œn@6ØN‹F7Û¶Øœ.gVÏvŽælêiس{Gi“SìQ+®T¦E6,˜êhitYQ«évÛâQØ›ZcŠ.ÅPVbÂvMK›í5µ.i±Òi—°ÓjMõõÚb©…''®¶ªD­ÙR\jÊ+˜a*.6”æYJ´9y%æ|SÞTKŽÖTã³æçMÍÃå01@j]W0qŒ¶t’E[VbÑæb6¯Df——›g6•Z´x[RZœg.ÍŸ¥-)Ëžl1—jK %’€é–â¼’¼‰>íó ´EÅ&sižÙ‚tÈ`ª¥ Õ–Dä•””¡<­©¬tRa1êàQ²Äc6ojQ~žÐÙ2³¨ØRR¢í¶ P`Î/Ë‘¸t— ÞS-ÅæIxë±²°X››WZ ‘çbÞ¤-2¡Žæ²|S±¶¨¬¸¨°Ä2J2#/?_[PXm‘”o‘ Ì…%–ie¨|ž)’䕿M4e ѪbmŽiªi¢¥$Q[b±Hvb¨È¶ÀH•4È3%ìL[žò?3Ì=åõŽGb½Z—&M$Œ'éFëÚF´Å¯Ž“Ø 'ŽÈgOF•Òr¤O¬l®× ð™o"y/çü÷“eoßúJéä?tß8õÆ/äøƒ×øùó…ÿšÜôË܌İOrƒ*Î~x÷hh¶¦T+{¶ì©“‡ç©;û~Ÿyç­Çê§ÍK?{÷Þ¬¦µãà«ûÇüW¢ãÁó_5´®¹ë›Ûï”Ññpý'Sž›9øÕB9}ËÅi+ÿxë›/_ýpÛ¼è'~úðý‡®œ©_ÉöêV²(!º–ÿ‚ ý/¶F=^›´­èÔEx½äÏô¾Ó;Ç·û.PÉä¯Ótr}_âö«yàî¶öK~zʯ"{T¸n®Oó }.¿-f¹ŠÀ õ.°C#8@ Å`ƒh‘K›·[>Tt»< žÅ^ît×Ò&GM³µ©v©ö’Õž¯Xž=ïžùcÆ_•}bò¦ƒåÏ®|é›ñŸ®¼˜~åK?VêÓ,í~Zߘ^wâÌ;½'ÿ’;vêüÖëU7ìXãÝß\sÌ|ÃÛ}n¾sØCƒWLï¼þÍ7ÞqjÆÖ¡Ù¢ÆVÍýzêµK¿ciYýð]ïÀÃíãz¢ÏþSsÇt$‡ûî7™œyÓmÆ!wn_INâ>ïx·[Ôú•ä ,:$õ7ºú¿ûƒÕß=öŒ™Yºpß ì~ãG0b¼5*}°¼'NÓëôéz}ŠaöeóÔµgz7g|ãúMGÞ”øÅå}º£jqÈS ¢Ÿ¹ýcÛÁ[ö?QðÐǧ6­œ2+þv½zuå_ÍÏ«þí›/žßâÿÞ‚µq᥆On.›¸ðÄU·}™™·+æ¨ÄÑ|Zð®'>=7ï™ñ·^\VôtäëËüi¿õÇüuýÛ—Ýxú÷gÃNë~3Ï?yÃ#†½^Uðë¯ šF|ìZ6jËX€¬Ð³ç üÆ›˜\uõ€È«®Žè¤ÖvÇM'-o¯—ФvG ¢‰íõˆˆª½1Ï*«‹Öœz É-Ƥ¡ “z&šzì u" ɾÆ#4©±­ñD#ˬsÔµÖ±óu]uTS—T—Y7KT™u›êŽÔ­ãu­Íƒ:ÉGíµ’œÛmˆºŽv|VP`DœÕçSÌÜòÙîÏè-Ÿîþ”vÒ¹!5·Wkeg9í1šÏV%h>Eø}U´æ‡êx«¥Øàš˜$Ù3íT[­«¦Õv¼µÕöÜW{¶–&ÕfÖÒMµ÷Ô©e™µçk»jY–-=ݶBÛ|Û=¶6›jŸÛHf©­vÕÂAÎWš#¢—"tÒ––¦I2ÅS8($aš)rN(D rJ@ƒi&Â|†µÍHÑ,·kÆòf8Ð…ÀiTǾ4Ãd M° a Áò·(³h#!”#4!pLC´:¹$˜6 Ø8ŠÀ`3¦n„óòÓL„ùÒ­ï`Ñš`S0­Cau¨ÓLÂyŽ‹ÚGŒ4vÒ¹í|˜æP×Q:ª}Ø£’)2þ}¦²ÌƒÐ=ÑÁ Ðt%íy“¥&$µ}RžœÑµOš$2f³ÈŒg]2â7:î+)‘Ëïkj‘ðûŠŠ€j?+}£•|‹|¿E¾ß#o´_“†øzûƒjoMÔ"n²·=J“ÕIö´Ï˜#k¾§M ²²EÁ˜1Fš°ZN œEàhÎRˆéI„säò6ò TÉí’Uʽ3MîåîÍnÖ´où¾ÍûØ|·ÃÝêÞäæçÜÜôܾ û¨{_¸fߪpTížö'MˆîRÐííOHô¶GŸÈÕ<ñd®&ë1r5‘«³BhÑ¢{2ëIºüÈÉ#现Ãäfr˜°¯nê8¯¹ÇÔ‡ÜûŽé;¹L[6Iw¨Vì#hWÖ#Ë9{iÉL œ@8‹Ài)é€\tB#îTĈÇ!v1‚¸©Ý/{¾ŽÌk$õü<ÉS.¹‚Á ¬Ï&©0 qÉ’1ÀxÄÓA\ŠXª· î8Gà<Äiˆ§ ŽB<•¤ÈzŒE¹8pÈ’$ãde yòIL™‚ $¥c–¦oÓa:–#l¦£° ·’ͦ@r ;âÆô1ŒécØ!Ç@EŽu´Ö€©ƒSÆœ2Æ ‰üejjÄ#–±Äˆ®CY½£4îÞxòFvËÍ ¬ƒ;£5w߈s.’5êÆ¾š?oNÒŽ#ÚqgÇQ÷¸“ãè¸à¾š›¶‚fËÖh͈·Þ šm7GIóéjŸiT2%¥ ]í«pQ»<Öhmû¢Uw B‡Ù^U%Ó|ÙŽƒ\ÉÌœ©d: r“©SEMNލÁX“j:0¶ÀF¾DW|‰.øc§Ór„óÐvL[6“/³¬%çÖ^XKÏ™âÈl±C L œ@8‹ ÑìÀèÛñ¾ãrÒîòÝ’ŠíH±)¤¯Ïï¸vº½/‘¾7Z.§'åT‡éf„67§Éí8®%#Ž‹¹å¸0æ¸4µœ5"Òwç31mE rÚ%玒5Xs¦û(ŽáÕX»Çðj4ûL÷!PTk5ª%å¼eÒ7h³Ó4!Ï÷³dó1" DÿcY&ã±UC4ºÇèt\¦gõ¦ºÏ³>/ú¼üó¦ÏUóq¼¯D!+QÈJYÀJd¶ò:—cŽÃ{Ûq–‡¬öÁ±ò*‘Ù™#OÐLéÏ«¤i¿F‡­ m¢¶'ÈïèŠßQ½,òSGË"ÉöŸÚ‹0`hdûªaØ.XAÄÛ¯ÍG&ݦ}i( äT(¨—‚BÛ¯ÅØBn­ÙšC4‹f¶Õ”›4¨PÂriiÎÄPú[0¦9B¡J‡Ðǰßa÷ë0ÍB äPû*i‰¸Ð~í$D_+è݃­Í«"¤ .+x.Fáɹätk²fã:iÒŽm_7 ÑÈöu‘ˆsp]²f=B'Þ±¡/†Ké‹‚ú¢û¢bû0½ …ë$({p *6çÂØj ª3#ð(¦ä¯|•cÚ„°¡ Ë)!ýÚwÊýB‚¥“–¿`œCƒ1L‚‘s°ê|ÜÕæã& 8ê3¹=<\Vlrû€rfЧdJ–?e…FDá :Æ RTÐ ñ ’ c;‚C%<¾#*JÆíÒÞ…šÚUÃ5Òª/¢qí*Iñ±ˆ°Í¸d.ᬉ‰Æ,ÕqX|ððøà‘ Á£‚cbû ŽÒôÑj‚ƒCBƒ‚z÷ ò Rûõ B/©Y¼F Dú-ë§9Ùœå„qUÐIF2Ù=ìëb|s0 &™ÁóƒÏ³àMDRDfDaÄüõùˆ®I†ô÷ÔÛ'kÂBöîËû÷ÐIæ¶'kB:ÉDý:ÉlD¼“ÌÊ꟬‰›¬ “¬aÆd d$kŠ û)d· %kµî˜iëc—¸³Š—ìÐ®í ²%û)Év³ÁÑÑÄÝw L)Ív÷#ˆK²Ý†„)L[ìNN˜âö/š3s?!7ÌÂR7]‹¼ÔÍ×vRD}ͳçÌì$RõªÈý*‚•î)å«®¿~VÂw•ôu¤åCf¹“¥Ìæ!³ Á÷rµ8¥ .W¦>×þáÃ,î‘«{”¥<§'‰œ:.§Ó{çsdØâmërµø)Rb9’‹:‰—«¥»6Aܶ$ȹ–nÅ\^¥-=¥:J$’xËHbÛ"Éj2Z$Árá%Ô à‘íÑmkqµ˜gJëUJÇüri‚LiÏ+”gДŽÈ!rAÇØñƤC¸©$2ݬ„¿»œŠ: ¿üަ…y~Gî$O™¢`œ&%Ün#ËÉïÀ'¼`œ‘óqÏš+H>ÎÅRJpFVÊ’2¸\޼qÁËÇMaU·cgùxQñ…K¶×éí)§ÔmNgžè®ìÙÏŠ9N¼äÞ”¼MÜáî \¥Û”8èŽOVª”¤8=}´ß_ t}qö÷¸â)îà¢9îA±xóÞ¤áMPl¶ç7Á;þàøþàøþï øþàøþàøþàøK¿” y8}Øüàq?öŠì%¿ÔÜ›ƒð®/º®B_‘²Væžu¹` ôõtØ‚<°ŒŽT5ÁöÚ¿þböÒ5¨U>z¥.boF_/CÚ;éº ½}#͇dºâñŽb»X€^˱0 ãb:9‚=p à9¤œtÑ(C1­EêЧ«ÐB34Ð7á pÂ:ƒªa–êh&Ñd)Á¸4Áû(sF–Ôë·£+ÉÓ¤ö]«ô«NríŸ e4ŠŽ„*˜B:¯½ü)Fe)ör&¤Ã#ä"|Õ5î€Ì.wY`#ö`"ì MaÍðÆõ½d/j~¾JÖ,h$Øoy1÷ ö×-$m:„Ön¥¿£÷¡¦ÓûN°¡u1¶¦Ã"èÀøéÄY£áNôéxÌÃÕdahí ‘ŸÓ•¨ó8r Æ]R'ô4éw"glQ…è!–½ªÎQ÷S¯èÚ@î!kUÿêzJ»BX{*ºî†›ù¾Eí§z‘éúc#ãùnôÕŒî\håõü–®&ÕVœÇŠPŸš®Û`z׃äÆW'Êz^†ùüGÕk<£ëÒ‹ïZ«¦Qº£² ceÎÒ™×s`.ÎYv9uØã {M9¥ÚH!\$E¸ì8”Ó ¡ â¸v’RRÖ}¢ üê9SGX Æàb2Ÿ”ÃÛ—Ÿ), “zXâ9]ÇΕ¡WÃ5Ê9“°¸`¿ïÉŽð)¹ þOw\FZq$¶âŒ¾â²ó×’uð YO6Àcd#|®œŸßÁW°N:=Q>EQ:Mq›t^¹…ÜJn#·“;¤S/ÉÝÕmd;ÙAv’]ä^rÙMî'Éé|Lò0Ž7Ù/WFÚI9@!É£¤“"‘ÇÉaòy’!GÉS83 gÈYrŽ|H>"“O”“Èȧä3ò9ù‚|I¾"_“oÈ·ä;ùôÆáLÿoòù‘üD~&¿_ÉoÒ‰ŽäOr‘tI˜Ré”Óç(ƒ(§*é<3ª¦~´õ§4ÑÞ´ ¦!4”ö¥ýhFÐ4œFÐA4W€!8Ãi lŲ.à>c®ÀœS¥“ÝL¸ÒÞKµÒùã4gÉÛh Åèì¢CiFãép:çÈ'pöWÃ6š~t «h"ÎP÷Ñ$ª£zšL 4…¦ÂϸãyB!w8Q°‡¦A H_ÜIÓi†|Nñ\½çáz( wçÚcԠ¹r|.œtŠ\6kéXˆÅm%<³bo:WÑõ°‘N ™4‹šh65Ó\ór¡/Φ‡a>ˆ«A„+iÍF'Ó)4ŸN¥´Ñi´˜–Àõ8“žÆ•ó\Þƒh)œÁuâ,®‡çhNgà::‹Î¦sè\ÜÌ£ói9µÒ ZI«¨VÓZKít­£õ´6Rm¢ i3uRm¡‹èbº„.¥WÒ«èÕôºŒ¶Òåt]I¯¥×ÑUt5]C×Òut=Ý@7Òëé tÝLo¤[èVz½™n£·Ð[émôvz½“ÞEï¦÷Ð6ºWÍt½—ÞGwÓûéôAº‡>D÷Ò‡é>ê¦ûi;í è#ô }”vÒCô1ú8=LŸ OÒ#ô(}Š>MŸ¡Çè³ô9ú<}¾H_¢/Óãôú*=AOÒSô5ú:}ƒ¾IߢoÓÓôú.}¾O? gèYzŽ~H?¢ÓOè§ô3ú9ý‚~I¿¢_Óoè·ô;zž^ ÿ¢ßÓÓèô'ú3ý…þJ£¿Ó?èŸô"íbÀäÿ?€q¦bjæÇz1ÀYëÍú°`ÂBY_ÖõgalÈÂYÄ"Ù`6„E1 Ó²hÃbÙP÷°a,ž g#ØH–ÀF±Ñ,‘%1Ó³df`),•¥±t–ÁŒl ËÆ±ñlËdYÌIJ™™å0 ËeÙ$–Ç&³),ŸMe¬±i¬˜•°RVƦ³l&›Åf³9l.»‚ÍcóY9³² Vɪ˜U³VËìl«cõ¬52kb Y3s2ka‹Øb¶„-eW²«ØÕì¶Œµ²ål[É®e×±Ul5[ÃÖ²ul=ÛÀ6²ëÙ lÛÌnd[ØVv»™mc·°[Ùmp »ÝÁî„;Ø]ìnv®ÙÛÙ¶“íb÷²ûØnv?{€=Èö°‡Ø^ö0ÛÇÜl?kgì{„d²Nvˆ=Æg‡ÙìIv„eO±§Ù3ì{–=Çžg/°ÙKìevœ½Â^e'ØIvнÆ^go°7Ù[ìmvš½ÃÞeï±÷Ùì ;ËαÙGìcö û”}Æ>g_°/ÙWìkö û–}Çγ ì_ì{öoöû‘ýÄ~f¿°_Ùoìwöû“]d¸yâ„SÎ8ç*®æ~¼÷ç<ñÞ¼æ!<”÷åýxÆð<œGðA<’æCx×p-æ1<–åq|çÃù>’'ðQ|4OäI\Çõ<™x Oåi ô5éPþ&‹¿ÍOówø»ü=þ>ÿ€Ÿágù9þ!ÿˆÌ?áŸòÏøçü þ%ÿŠÍ¿áßòïøy~ÿ‹ÏÿÍà?òŸøÏüþ+ÿÿÎÿàò‹¼K*¢¢*¦â*•J­òSõRù«Tª UoUU°*Dªê«ê§ê¯ S P T…«"TƒT‘ªÁª!ª(•F¥UE«bT±ª¡ª8Õ0U¼j¸j„j¤*A5J5Z•¨JRéTzU²Ê JQ¥ªÒTé~ v§ÓÞX£Jll©¯it46X›ë° ÙæjinT›*šm‹l¦f,²V¶¸l~¦ke³£ÑÏä¨q4ÚêüL¹<Ð\io®li¨®·- 0W9\ÖÊJ[£KSiÅÖˆšV—Ú¢ÜY®o3?‹àj\[í:}nJàÄn®A+ V… `¢—6pRw>©ÂÚ¬ÎsÙë«lêW+¹Ð®¸Ð.Kñ³ Öve |XÖ]eéAu8ÚlõÖÆ*{¥º^ ¹zß.¬÷ 93¯—B®Qé„F%L}š6Z¥ÿ¸©ÙÑTká§S;”ðsôèX‡?‡Oø5 ¤ðm¾<üÒÕN¥œ>v9}ÃÏå«»ËG÷4wIþjQüÕ¢„\‹r-=4k>l!·XÑj±U‹}Bn±7ä–*•K}BîJ%ä®ìrÉÆdfk¬ ¨±57 Ó+êKhÞd:­…–ÖÒJüWG+]´ºšUWÛêiµ –T ª Õµˆjiu¢:Z½€Ú¨ê5NµœÚTßKBÈÛéïÉØ½¹zIÜl]ªÒ¶BAµ ª£Î&QŸF].êºRºKÖ¥çú[-M8„ÍþÞ\¥7WåÍÙ¼¹jo®Æ›«õæìÞÜo®Î›«÷æ¼¹FoÎáÍ5ys ½¹foÎé͹¼¹on‘7·Ø›[âÍ-õæ®ôä¬^ãÞl›Ü÷žÛ^WÚšq²[‚Þh“±k±|ïïªÅ¡&åzU;Zš•Œ}‘ÒÆi_"·qbP6Ê9›4[Êí £ ‰³£¾ÊéZZo DîÞ#5EA©z Ž&[cnìmò—››kVtѧTÛkZP2®û2/GŠR©æê §œ*pšÀé{茋¨Ë¼t÷`Ð'«LÒ’¬š(Í×fïRÝ+G,ãªRio 2K»U¶ä,^Œýhöae¶UÙ±ýs<ËzÐ$ŸÍƒzª¼wPÊ[‡Yž³ÁZ_ •³ÁÝ’åûÞñJCY%++¢dem䬿¤’œ ñÑK.ÊÉ7}¼Ê·¡¾jÊ%Š®J^QX õ‰^§ÓË>Ö¥äè¼%ޜѓKöÖ¦&+íÉÞ:½7×]fPZét‚{š·&EÐ+C1ÅÜM*j¼ò“»©„–!]—ã­ñ¶NÓ z“Àf›¼º'{í1xË ‚ÊäÕÝÐ3xs)ÞœÐÒdò–KLgwóN÷ê&ô¶ˆ6¹Ý2¼úŒ‚Þ[—âå”"´Ì²²½T)Ý­½Ú¦xµMIõæ¼¾Lñôx7îœÇCú!)Íä-ñôA†·ÄK—Ú^‰©^‰©^?¤z5K’íõcZ7½WB7·nYÞ^L}‘ã¡4¯Ì´nß{õõD£Ñë©4/¯t¯ôták¯M8oyë<Ñ/|aöx?Ãh58½ˆJÏL+Q {ݽ¾H÷X‰K´íïô4¯ö">ŒÙ爸óZŸîµ9½[cAeòÚœáµ4ÃK™á¢ ¡§)Û[âÕ3ã§^/WY6 œ-°Yà-ç*8CÐgú AŸ!è3}† Ïô‚>[Ðg úlAŸ-è³ÍAÂ#>Jë‘^é‘^é…P½jíÍÆ^èQFÉ¢"Y0JŒ’£dÁ(Y0JÚ' í‚Þ(è‚Þ(è‚Þ(è‚Þ(èÍ¢½Y´7›ý¥Ž–5 ’rž·JµAˆ3qAnä!Î Ä„8ƒ—#ès}Ž ÏÉAäã›Ñ8E4NS„°!,EËísE{‹9¨Ì§ç‚ÅMO‹REãTÁ4U0K[S‹‡©PÂ’PØ`«ñíË4Ñ4M4MMÓë4¡oš‘&œ“&D™½IЛ½IЛ½IЛ½IÐçŠö¹¢}®Ye•‡x…4Äkä!^%q›âWJC\ªtÉCÜ. ñ:yˆ×+C¼±….±û9”®a͵µSÜz•Œ˜ Çx‹ãM8¾+ðVå<#ž•tj™¹žc½Z®ÑX/™”E±N nq¯óܧ l8EàdÓNƒ[Ðe>¢]† Ïô‚o† ÏôÙ‚>[Ðg úlC/ Wçf Ù‚0;=ÈvÙ,‘.¤¥ j½à¦ÜõBº^´Ó ¦úä^¶³Dºh˜.$ FÉ‚Q²¨OŒ’=í„àd¡e²0Ï(茂Q´3 z£ 7 ¾FAoôfÑÞ,Ú›E{³hgN÷·{gûe³Hº`“.š„¡–Aˆ5öÁÞ ÄæxèAxÅìY/sý«ìÖú¥.{l–õ¢fkeíÒ@é3uÊŸ#T…µŽæF•CNËä´EJy•£±&¨Ê᪰Õ;W:*üå÷ÑrNÞVÊ9ù¯R®w­ÃQg­p(-Ô&ù‘_­ ³‚rdQP®‚&*h’‚ò4YAS”¯ © *PP¡‚Š4MAÅ *QP©‚Ê4]A34SA³4[y[a²z_¬šj¼oVBL•=_­ô1Uù¾[ 4¹¼/W•?/+oWä¿1+/gºÿܬ¼Rs7Žî×$~&‹(´øhcî·˜/Ñ&Ð\é}¡ÓÛ\éó®&¸û¯ÖJËœî–Ê߯å<î0k•B_™X.õ€¥§,>Œ-ݶôT Èâk¶ÅÇìÀ‰>N¼Ô‰Ý,C}ÿf®™ØSHȤKÈý¥?¡+Œò|ìËó±/ïRûòzÚ—çÓÃy>öå]b_ž¯}y>ö…L¾DBè”Kíè=Å·ïó»U Í¿´m`¾OŸçûÒùK½mä¿*ùà |Œ)èæZp™F=4*ôáQèã¼ÂKWØÓy…>ò »×·Ç—6ø¾<ìÖ?ÄçëÊ0)T†I`±RÅ>Æ_fLqcJ|â­äÒx+ñaTr£_F¡¥—õMi7uˆÏwâÒUêÌ2;Ê|œ[v©sËz:·Ìǹe>sO™wîé[v¹ŸË|ã´ÌwÎðÑc†3.ÕcFO=fùÐÍò¡›u)ݬžt³}èfw;.xvÏ‘P*­JJ×ç)ËCoù¿Z°{¢EùÛ„"ÃÚÐdkvZ«Zárk½üÊ^o; ‹ØIXÄNÂ"v±“°ˆ„Eì$,b'a]ñØe]ñØe]ñØe]ñØeÏ ñ¬`Ï –l!_<*X²…|ñÈ`ÉòÅ ‹xa/ ,â„%[È{ ‹ØkXÄ^Ã"ö ±'±ˆÍ¹ElÎ-bsn1 ùb“n1 ùâÝ„Å,ä‹WñJÀbòÅžÅ"ö0±G±ˆ=µEì©-9B¾Ø[r„ü!_ìÞ-9B¾x'`ï,â€%GÈÏòÅÉ"öL–!_lb-bk›[‹ØìZ,B¾Ø–[ÄæØbòžE<á[ľÅ"ä[„|‹/v`±§³ä ù¹B¾Ø‰Zr…<±¶ä yâ5…%Wü9ʤ“I‘@HhBTBTTR’>C›5v„&±OÌøPïe0DIWBBB”¸'É×p½çÊÐj•£¼äêxqÅÄ ’nÇJ׈1#Fh<×À>x Á [… މ(-5®Hi´Ù ¥iÆÒ„WŒ·¦—&”J½×0­Ö$] †+<×Hé2"‘r•Ú †¥2/bì& 5/]VƒÕšî½$• xa“1 é†Ä£’â“Ç& ÃÒ„”„¤tüè“â ­!qhz²>q¬aÄxÛüñÆœ¸¼¸œù6C‚-¾mxBTÑ`C–~dÚˆQ#óI÷5BNƒ}JHæ__ƒÉI¼&s0‰é3ºçEþ× ¤½IX¡Þ’Á FH?Dñƒ5$JTõ都.ãþýú„ #º˜èè¾} ‰‹N”••ÐıˆA Èd!à  ÏôòN$ÿ‹WhèЭV;LŽœÁƒ£¢ñ1"!!fP|Òðø¨¸¨¨QQÒƒjŠ¥–”5,kHjÔ „øÄ±‰C0¼Æ’ÄÁÚ$­¶´tdVDDÄ@©;•€‹‰…WBÂÈðÁ1Ù¥¥ Æ,“©01ÑdJLÌJJ2a” Iñ‰ñIƒG&ÄÇ(IcÒëÇ%$”FÈžÒ%E…ŽÌˆÕj÷<8'*aH‚¤¨ry‚YÎâõ×é4Ú˜dPdò°ÈáÃcµCGh¢bc‰V3*cPDìðP]ÜÐŒ 62ÒH¢ÉÀÁÃb¢¢âФ(íˆø°°Þ £úõÓhúÄk##4qÚ!ñ±ƒ††$ÄÏ2„Gi¦H38Ý00bXÑðýâÿöê¹þîàÁY—_©ž+11ýòkØß\ñƒˆ¶Ü‘1ѹô‘”\~Ö°œ¬¸¤ÒҼȜìI Ú„¡–¼±º¤”¸|Ï•e0È,srr²<—<“tT¤ŽÌ‘¯IÒå±fäÈ’±é*,ì_X˜ç½¤ÿc-¯¸¸¸œì¡ýÐÒ¿þD]Ñó£·émñ¥¾ŸaZÏG“®Iàù 1HŸpé׸ª÷þ|Œ>8ú⮋»ç(¿Ïõýušø¡,CÈQjç)¸w­‚ƒ›åÿûB¯–ÿ·{èwâ!a7Èÿë; ¼xà lø,Çv°Œ´’Md ÙNÜäQò#频tÝB£ÏÓéŒ0ÆüY_ˆ±v%[ÆÖ³l;{•bo±wÙûì ;Ç.ðù¼’×ñ¾•ßÅwò=¼ƒ?ÎŸæ§ø[üþ1ÿ’ŸçÿŽZõ«&L3DcÑLÕÌÐÌÒÌÑ\¡¹Fs@sLóºæ=ÍyÍš‹Ú@m”6}¤Ó´c´´9Ú&í Ú]ÚûµE«¢ûEˆŽ‰=?†Æ¨c‚cúÆ Š‰ŠIˆ±ÄLŠ±ÆØbCâ¶Çí‰{)îDÜg¿«»þèêB[µÐ&ÛØFö¡?ßh¸lã!úÚxš.ÙÆëÐÆØNv’½éc#ð ¾€7óÍ|oãò‡ùAþ?‰6žæñ/øwüû¨åQmЄk´šIš"aã|ÍrÍAÍsš·4h¾×ü¤¥Úœ²âÐÆd­Q;N¶Ñ¥mÓîÖîéac‰°14&mŒ—m,©’m|PØÂF ÁPLwÑ[.žá²õâU]]­X7™ä‘œ® 2¬+Jú)8<„åïÈ¿„|µëeÈÿó{ȃI`ü»^ÿyç¥%ŸD" @ù$ø“>=j0J?Ò)ùk>üúÃ×ò!÷ÔüaЇ_ŸûíÜîs_œ}þì±³‡¥ò³"l:»Óygž~¿õýÅï«ß/}‘û¹»[+f¥lžÈÏSÀ§v®œÎF¨bë{êÍ^ÃÞÛÂoâ·c>Ì`å/ñãü8ûò5þöç9Õo¨Å/FÕê\õÃê—ÔŸ¨¿ð Aˆòã7A©õ£¤~~‹üzü²ÔOünÛo¹ßJLWÊùÕ=uò»Rþe·žüL{‘÷Ȳ|Ký¤_ÛÑpÒI.ÐQä<ÖýûHϯ#É|ùWzGÉä)ò#í‡#œƒ GµÎþ ÿª­7ô`Pèû—¿ü“Æ“‹ä ¦ãa=l€p=Ü›`3Ü[`«ü[¼mp Ü ·ÁípÜ)ýjî6Ø;`'Î#(gQû_ÈÇäCòyŸ&Ð4“"i´79EGáŒ2‰¼KI¿Á¤ãØfJý©…´tÚ‡ÜIn#w‘Ÿ Jú Çj,ÄÃ(H½ü;Ûl0g;”Â,˜ ³a.Ì!‡¡ša!8Á­°Ž„½° îƒûa7<c„w£pƒàyx^"!ð|çpÞû>&Ãð+ü¿ÁïD{(ˆÃ1À0Ø #À #a?Œ†í@„ xÒà0¤Ã8VŽ@*<cá)OÃ8ãáÈ„g! ž ¼Œ#êUÈ…ã8¶NÀDxwKñ0NÂ8¯ÃTx àM(„·`œ†bxþŸö®0ªê\ÿçœ;!$!&,a ËUIPIb‹‚"`EŒ€¾gíâdf’™Í™ !.hµ}*²Xês—bõÕµÔj­+¼×ÖVëÒ>û*EqW\Í!÷}ç¿g–,È"¯OíÜ›ûßÿžsîþóoçœ;÷ÜÌ¢µt­£Séz‘.¥ô}ZOߥ7è{ô&¢õ;ä£w)@6P m¢ m¦9ô>…h …éŠÐ‡§©•¶S;þ\ÚAmÔAóÈ¡s„ ó…E?…t],ŠèG¢„~(ŠÅAt­¦‘tD¿ /½MgÑVMOÍ+§Èãä r¢œjÕX£õº&5Ö«ŽR'©ï¨¸ºXmØãUt*ˆøúˆzL½¤>Ûýõgîê3u="òvµEuXûɳe\Þ-Ãòy»Y…¨WÞ%Ï—çÊÅò²Å¬‹Ôk"“r.¯ƒ<Ϭ}L¯|\ ñjG½Ö1w£^åxYÁ¨W/>*ÇkŸ0ëÓ«õÚD½"Q¯GÌ]‹¨W">,’›äý]Ö#~"ÿ„¾g­üTþTn“+ävÄîy‹tä­ŠdDþF¦ä*Ù&/çË'åò)y¡|ZþPþ·¼L>'/—ÏË…òùùмJ¾.¯–oÈ;åDzU®–Aù+yƒÜ Ï‘”7Ër‰\'¯/ÒyBѹB¢Ç÷|ÖQÑ…¢WîZ*u«ºEÝÎë ÿƒ×v]…¹Z­R¿ãµ„ÿ©WTOñ*Â'xa×—¯ªWÔ›¼fð5^1Øuåê}õ ¯üЂÃX^!(õú@¶úZåV¯ì§×v[cù3Xö£°í?Àº_†}o…¥:°Õ2k¿n«"«º¬íºÞ±ËÚЮk»­çì¼Ê2³Õ¬Aü¦UŸ³‚R¯F嵦Vƒ5ÞšÀ+&ßUï¨õjSz¥©õ ë(ëh^YdõVÛÔ§VÕ'³¾´ÙšdM´Ž´ZU¼ •W“ZGX‡#ê×ÈZYÇ«°‘ez½¸ôÈ©¤%6òZð"ŒÄÞçuåpWæ‹syUþ¥â2½î^,ãõ ýn+óy%¾^ƒïë×7ðêõw­ib=¯Àïiõý5âIñ ì-kÄsâoâÄ3âQñ¬¨ä¯,èo,Ô‰qèì‹ÈýˆN—‘7®eûüM|õûr1ˆ>¸}îèa†ÞõVô¬?Gßú+ô«¿ážõè[ѳ¢_}=ë«ôzÖOЫ¢O•Ðßc4€q@‘,å ‘Cå7å1âQôîgŠ?b4 ¿lð‚ºB<ÝüI] è/T<…Þû-ñF¶^«ÄúKâ}Y1ÂþèýÑ ²]Á’´U‰‡ÄŸÑ_$ëõw´Fa]½¥GlWcL¡ÿ÷ÓaO¸ãˆcy AKèÑC‚žB7QN3}Üñr*ú¹Il eyKøâ–@üÿXňï2Œì ö%ôÍ[ÂW3&ðÈ#o=BÞý˜Y÷l îGÊœ¼%èïéP½hÓ–`q-³‚c²–=Õ–€^þZH– G‹Ó–À3…bÌÊU?×0;h”Ñ'¯•½••±™OèÙÄ~òǘ3è¹ÃͪLü³Šþb•ªH[æƒ1Ò9ª«%ð%€±Š;ר‚JÏ7–ó|ã:Ì;.Ç|c©™q\«ç§ý;Ï7b¦qf×b^¢gÔgùQBÚ¾ð̪SDÀÜÍwËMâQÌçîOG¹UGÌëîÀêç˜A­Ä ê—˜C} oï0óûs¿?a¶Õ9"lÄlp-惟*ãC˜™}¡™ú˜¼%dûýü¤žªMßpFßp?I¹ŸŸ4Ô¡o¸Ÿ ‰¾á‘Lß Ÿ¡pß@ ]ûZÅ}ÃoùùÉ4m ô4¨ûú{æÉ‰~Š¢Ÿ˜ÌÒ–@kéÔœ¾áúú†7éû]ûZÏÏQüz¼HøyJH÷ ´…Ÿ© ã§(“ô“j×}ƒü#ú…³sž¢\ è/ô#š)Jh‚<6ÿL=ÿL=ÿL=ÿL=ÿL=ÿL=ÿL=ÿL=ÿL=ÿL=ÿLŸ©›9Žú7À+•þVù<ô©Np3p0ã•ÎýoËàM W8óII©qYï,Bÿ«œ‹©PlBJ¡Ø X :Ë9S5RЙ¸Â¹Jqo°Þ¹ý´ræ.pV.fx†bSÇvÀÍ¢ä³èÍ9+;k+®pÖQέó8g.´ˆáb†Wf(k|Ãå o`x£sàM W0¼YC´(¸™áp^!¶j(kÐêA¨q ®q×2ˆ–:O^Ãø2' xƒÓ¸BC´hàf†[œ%€[5µ F(ʸ÷ç퀋jšƒASãËœ³o€lƒ& 8œ¸™áçyÀ­‚æŒxÒ+ASÃE ;ÿ ¸Ò¨M_ë4^Çø2Æ—£E•¨e6࢖ €›S· ÞJÔˆZ@òž–ˆÑû/3ÜŽz‰èÐPJ:Ð\:—n†—!ý"@‹a (Ü>\ ÞÞQ~àfÀ›8÷&ν‰soâ¶ßÄm_Á¹+8wç®à{Wè{1{¬pÊu<8Ø9S|†±bHìÐP R•B|Ôq'xZàL\äŒ\ìœx•s)à5Œ/c|9ç^ï¤ou.¼ŸsÃð†¯jɤ¤búŠé{4'€àœ`.¬œ_›§ ú)¦¥="è¶„üX"‰’òµ'ÂÔ¿%˜CCÂÞT£Æ¾ì½%î`Ýý÷ðË"øW_žóIt¼lžohX„ñì[†N”éÌg:ýi(Y“?Õ¦#fž|’M3fÏ<ѦcO;a¶‘a¦¥x”MŒ[fÄMÝrzÂ;_‹.×’ æQªfXÃðÐdkS’Æ'CÑf:Z{ã`Ê´BdžÝ~ËN˜Z²3Ýš‘K†êdšŽ´þ¶°þÍ=^éžk¿eh5çyLI`Êgñ{V«Ý³ÕyEºÎ¶¿hèéûìúëìbJúËìâD÷»êâdÑÈßSO“|–þžzšÞvý&àØ½¢7Kœ J©Ü¯§wêOt]ºNô+¨ã¿a) ³¡ü¢~ÆþmÌÀì 3€:Œò†×ÎÀXü{ÔLQŒ¢çëÿF™Ð (w7I5¤×ÙçK낌ù¥*q~‡ù€” =€ô“‘îÇõ…Hÿ6òÇ!½–0BBz ®+‘~Iñ¦ç ¾ÿ6k>ê”â ¤†ó6¤7 ý¤ÇuÒë@ï¤BúH¯ÆõþH×­ðd¿Å ˆ×s*2„ûZKqNC»%dUBÞÒ¹çBŽs®?SŸÀ“„¸T—Wa&0oT°¦bœ"ö€9âbøÎ ˆ)·¥¿Œ¼Ï“Õ¯1kz 3¡¿ÁžÞ¤ôu`ÎU**ÄpQ~÷hyŠ˜6èyF·=#Ëâúô¬ E ®ëq>ׇ¢\®÷ÏÊRÆõœ«p=÷½€ë£p~×ß@úÈ^§s¾¡/¶¡½ã²2—E¸®Í‘õX\Wfd,å ¸>çY¸9ךÞ·>ñg‰¾NÓSU¨¿Êð§uU‹òz#½¡ ¿'"ÿCf7 èˆH?¿quJ{¢SÜWxˆŽ†ØŸâh!E r«5ž©G{¸Ž¥úá8ÙmÚ# í¥†ö(ÖR¬8®d¹Q¦#™]²ÿÝ𽉔ß2Æ=äL¨Zá«îtFTÝ»W4bUãxÌ™_õç}ÂÓü=©Ûœõ·ÊœS8.uLÞÅUk¿ôº‰eÛ·[åÏØó2ÎòªW1Cpí`JÕ;_ˆßûª¶î“vß·eC漇–ëÌÛIúªªí]í§+¾KÚ«²çÜ£§rŸGó.>v«ÎgqœsýøNÊÜCÚÊjËYS]â¬Ù;ÿÏÐY·ì~/èèöïQùó«+zöêái¿ËÄ–UU÷æú¡«®Æ1ÖàãóªítÜô« «³G·ºÒyϺúÊ-Ë4´OAï>ð„c§mYÔÝ·w7ÒetÌßU|`þŸîNÏ WgþW›ÓÞÇ<¹SüJË‚·)À—šs:ÿñôýÙƒí›{8Kª¿…¹ôçôan½ï¹´ùHëniŸzϤ«žÙsÌ­æ_sœŽ³rÚßžSæ¬j6~V‡³xV¯ô›«ÿÜö§óžÎÞŸ>øzŠ9žw¶I5G3g|NZûNÊŽOÓ®¾°Çü)Õ 2uÿ«¶Ãj– ãésõuðW׳aŸßª^ñyý·³À=x,9Üð6ÜКkâàÅšŽDÎ}ªW8§€þòêÛqܳÓöOA-£SvÃþOù Ö¦T?ˆã¿U?ãX:çk<6Õc¶•»(tÑçûÆ×ùxõšl?TýrOø®idû±Ü£§~îóú:gDõgÄ?XæW¿•ÓæÍ=áÿ°öO©þÇŠlûGåð7ª¨'ü§ÿQ°ÿ»ö‡FôO=ù þÏÚôŽ¿~…y¿s'é×ìÿŸjÎ#sÆÊ—v_jòS;¡qqv,¡qÆÞÍ×w›ïÔ^ÞW¹=ó™ÿ¤Ï¿™yÖwÌûOÓîû(¿}MÆÈ»ÊÓÿY=w^ý•i[Î\x·Ê/Ý7e¾6¶±<;gY^úã?°g6»;¶²'öôµ±ƒ[Ýx¿³gÂ_Z¾÷0f}Ýüß©sÝ.ì¾)ó¥›-Ú3{Ùe¾L}ûžÄìÝn¿ óHQ!¿«ÔŸ*øíüJþßï#Ȧýé:FRUÓI4ƒéšI>òS€š)LŠQœÎói>]@Òè"ZBËø-ýô.m ÷h£B KxDè% EoQ)6ŠÏÄ~3SI¬‘õÖ k–uºõ]ëû–—ÿOssÿ£Yÿ_e÷¿*§ÿk²þ_Éú?%wý¯ÈÏY·ž·ÖY/Y¯X¯YoXë­·­w­÷<§ßê%IÇóPí×ï”bWC_² ‹þä<*¨2D½ —Á(U‰½7ä£ß\ÐQÉL@äáa‰°L •ù(äÑYBEÊ2*†dn¤Hç&ê ­@ïÒF*†Œ<ÔêM¥O%AF©äôí'vˆ¤ßdT™Iê ¹)àé¡~úWý楬§ã ª€,gÑ@Èót™~—C®ß§!­—*!_ …Œý4 rn¦áõÙ¸ ÒEùeÖõ€w[¿DyHå!_ÀǬÇQþ ë)”ÎzŽ$üwÀç­ç×Yë_²^|Åzð5ë5À7¬7×[ëß¶Þ|×zð=ë=ÐÆÁÔ Xã©¡Rh¦xôS üÜh¨„ß4ÑúP¬‹õáa}@¡Ì·°Kè Ž2Zú–~-ÀÞ‹b/¤EØ{ÓbìE´{1]…½„®ÁÞ‡®Å^J×aßµUF˱—ÓõØûÒ Øû±þú³þ°þ*èfìégØ{Ñ-t¸»î~'öAtýøJì…ôKº\ÿŠî~ýœÜ½ˆ~ƒ}=€½’Ä>”Â>ŒÆ>”Á^DbJ«°Ñ°óòáô= _} »MOcߟžÁ^Ì+ËûЫØ ×è øñ›ØûÐzìÒ[ôðw±—ÁG7ÀÇá§À7a/§Í´>¿•Þ®×¥÷£mØ«é3ì£h;íÞA¬S¿^S­¿<\[ðXpUÀÏ{ÓA¢HÑ@Q,Šé`Q"J€H‰ 1ˆ Å(1 v¨Gåb“ØD‡ˆÍb3[Ī[ÅVªŠ©N|$>¢±âcñ1ŸŠO·‰mHß.¶S½èt({Å8iI PûÃa쇳?aÍ´fÒ‘ÖiÖi4ÞúŽõj`O8Êj²šèìßd˜Àþp4ü!ˆ»BV„ŽÑ±xÜŠ?ÛJ?Ïú!¨-´‚ÚRk)à•Ö•€7[wòý𖣬‡­ßƒ²ö™ ì3GŸYc­¡^ÆsÖZk»þó‚õp׋^´^îúÒËÖËÀ]zÕz¸ëW¯[¯w½ëMëM஽e½Üõ´w¬w€»þ¶ÁÚœ½ÎÚhm¾ÙÚLEÖVk+àÖˆYÁÏ?±>ÜfmÜnmì°:¨Ò£_7-FÀ‘€–Ç¢>žO`¡§ðyŠK<%€¥žRÀ2OàPÏPêç½Àsˆçª`Ÿ/`Ÿ¯`Ÿ/`Ÿ¯€ç "±&l?ÁNûð¹7ìPLÔ/Ú26ÉÅ"Mǽ² æƒ”Þæ®2¿Õ×å$žÔ¯z•hlu#Òàž±(ó“«Qv ¦²šxµšhÔ÷€Öñú}ÖÞš‡‰–©G¿ãÊô'®p.Óe'î.ÖwO,C~ îÖוLÍÍ+æÒåðj݆ՠ n&›VN$÷®IºD9_ë÷ÅìÉî¹q2òQß䉸¶‘N\3s5™L¥ï²u.Îýu¨ Óõ­ÖTÑÖI]éN,kÔõº%õ\öã»5½œ6Ñ•ÚD]‹D<ÒoæýUBå{üDqûÞ>wv·u‚Îgˆ3!=qæó&fžÕÍÏþÂì´;gdž·þ”Ç6Åb#úL=Âh‘A9G†eD.·êw¹wÜ£JîK%÷¥B—$…²²Pvà­¸C¿%=Qj3 Ž4’#4¥£2Šr??0÷xäår!È—WS/y‹¼… å]òn¤¯”+Qæyõ–ȨH>(¤bùŒ|ø³òYàkä*‘—k©|^¾@¥r|øF¹‘ö“ÊQr‡ì@IG:PØ×RêAØÈ°/ïÎ"=c߃ò±ôøú>ÓïçäžÒó|M[@ÚÒ´­uÊ;«ûlÏy:ý~E—¼•Îô½lgp÷Ÿ–g=Á™·³wÎvZË}fÄÖÏò9Nå™ëÎR`OÓ¡|Ó¡¥›yJ.‚oœáÊÒ9 %õ{Ë‹ÙO2¿RЩæ|~\üÔœ÷ê]¸}õġǷU±Ÿ×(‹W‚–ªþ¼âsˆÚm­^z]Z³jQARg©9*œYUv‰Z O/ç¸ 8.MHP¶HzY¨¡yPK) ¦þÔ µUP!jH½Që*BÍ#Q¾VlVÍ(Ó¢âȽD]BÅj)êÑ#Ú:7¦èÕÔ$9²(Ž,Škµx ãẠ¸Ö^¦ÖÜúÐ"¤U8Úø#õ#pàÖt™ºŒJÔåêr꣪…Tª©E´ŸZ¬S™ºB]AåêÇêÇÔ—yê§~¢~BýõšWÀëÔu€ËÔ2 –«åT¡®W׃ õè?¬~Ê¿W/€ò:µŽªÕ‹4H½¤^ý—ÕË4X½¢^£!êuõ:Ò׫õ€o©·©R½£6ÐPµQmDÊ&µ øfõ õ·J­*ŒÀÅù^Ķ[uo WÒ‰è"g”Ÿë~Ÿ™¦¨ä~á™T5Û€»å¾Ò8æsjšÁMS§ÜB™ îAí« ^@5jÁ{ѯ-Ëà…d[ãk­Á‹<3­­/¦ê¢É/¡hÑYïSpPQšf)]žùΉøIùÑ™Õ4å}ÿbpI½ú¾jpE#û¾mp‹Êûõ1¸‡Jú 78FÚý1x/:£ßDƒRY¿eǸ¢ß/’·õ»ßàÅÔ¯âLƒ—БIƒ÷Qý+n7x)ü¨–¸…þ‘J¯c\¯ñ(ü6ãœþ)ã½túã…Œ`¼·ÖÑ*ƒCGÃN48t4,bpèhع‡Ž†ýÖàÐѰ7  ÛapèhøÁ‡Ž†¿dpèh¸cpèhÄ@ƒCG#C‡ŽF.18t42M:íòY¤Û5ÚÇx±nËèã%œ~㥌_Îx™nËè«ï¼ïè[ïÏeîg|ÓqÛUÁéÏ2>˜ïuù¯ä2ï1>ŒË¸¼ÐxMoÆGêò5®laü@Æk¯×x!ó_s ã\W ˼ÄMÿƹ-5>:ŽŸX´S‚BÔBAJadXO 4°Ö`ã¨&“ÚÀß7kÀžMÕé6M£hè§CajL€ž†6Ml%Í¡y) ,ˆ’Qäêt“h*Õñ9ŒÝÎá$ÉWœ5¹€~.9¹œý\2„’^¾·iš¦mòsi›kÌÖçÒó"Ç Üo)àé:OS´©yšÿ8 ¦¨Û Kµ -ex˜ZãüDL×`ž5-s’4\x¹Þì].Å8·+Å|Ç@á‹ÉP׎c ×!#Á$îk ±¼¼,_Íg‘F<#ã(îpùmbž¦s 1æ0Î|ë”&”×Tt‰©à¦ \×0‡­(c*6ÍL0§I¾³žËÁ_×8㛎e=è6ǘJ+·VÓÔ-ŽpkÚYßÜ¢ꎱLmº-cyG+umð$–¼–m’%ª99ŽïŽ3ôf¨äZÜÌN7³‹kd sïÖé.}W ÚfÙ캼ÝåÍMœuÎñª]Ó99MšVé;ëpÞíή÷Õ¢þ˜‘rײw³õ$Ù¢\iáë×åZˆ«]m©æÎ>µá][oZtÍ “ùû,téj-m/­¦_ u±`ÆcÝ4›Ë¥Lû[21Õ3i½Ç°Ï1ÖëŽJB<â ±•„;Y°ÏŒÂ(Ñ‘ ÈôãtÆc )½×1§QŽ]uÌUÏ¥"Ýzì:£ñ1Fº–G† ®ÇtŠƒ®wAÎ9&v¸ÜDr¤Úœ“4³L"F¯!ã]^n{ˆ}$ëõ=(ÒX[ƃ²½–®±ùnÄ‹vOe½"w|¨ïn1–1£°¬ž³–Ü·®|t¶¦l»#l£¶±z×Ïm¶î¹Æ:½L£õŸäHâÏŒ³£B—#­wo¦entˆe<#™±IwüfçPnb¶q¥#¸#½0SmëD3bb«™&ö‰9=ݘïov¦í:êCE|L걿˜ÞIÉÏ)îR2+Ù&3ª×1Ègâ©Û–f¶È¦Ýh0±¹'¯éJ«3¥¬eíÈÏQÀË2IftÙÆžž2=¶WcþÆ]Œù'cd¶ëqM·‘ 0¼ˆbú(‡a¤s0Ó9Tjq=‡Íé 9:>ÉÄ­f»ÒÔy§w±»´?ôlciYE2”Û{´8·'J{TZî®­'˜Š;Žq#·;«s\Ofú¹(ëÈǵî¾&læ*ëWºuº_eüKSoå1^Œ#î9¦¥=]»·-+ß´ Ó–7úÎF·¬ºrôš>Hϧ\ÿ©5Z×moí‘{Ï!ææÌ•]ÎÒ°-û5§ñLŽ—ÛäŽGüY'ºùn¶=_È¿Ž‹ÅÛù?Ûõ ãëkÆÕh´¡¦¾¡Ñ†ñö´@È7-„=9Ñê›ñ&}ÁP4µ'M­³'…öûï…íD HÌ øëìÙÁ€íµ„RÞp¸ÝD}1ÀoG¼|ÊyýÞ¦pÀ޵¦Â:ÁïMyíæXÂŽ'bþV_(Úb§@av{<Ðìõ’v8ä D“ áM8 ãDªÝŽ5ï‚CÛõéÔ ùCÞD(¬qÍq4ºMíöôP4–B@šÞD»=5Ò4­ÆžÜESö¬T›Lìúûˆúq‡jëõÛÓb‘¦ÖD‹=5ˆx£íuvc,ÁÿؾM ïˆZ–àI!_"–Œ5§ìãb‰x,áÕE\ÁÍt73#¸FoÙÑX†›™–Ö°7Ñ-Ý6ö¤x"fUu+sZ ‘DUv}]ýáéÌt^íÌXN§þÜ%m/$ÒJ¦ ÍõôÇ“vOÂÝÄ[7ý„'Ï>½ñøÚiÇOŸŽRÓXFQûÛÞxs÷Ö z­V 9 ¥Bsv4ÐfÏ5 `²·ÿO2#§»-òíd(ê 0þ@2ÔµChvÃácí 7i7|±¬ –Jºž¶X"ì•´#±dÊnÓk·[µ}¥Ò&WgOѤ‚`LsbŒ9ÍQݘˆ5’I”Ñq5þ„·-jG[#D¬âôûCZÓ¸Ëô&¼>­Œ5_¸Õ€ØìÀ¼ìZ77á¶0{áP‹7ÕšÐʤ¼a`Íúv6,-ëdkf”b9†{pFS,D› ÓXÔ$Åcáv÷jj"˜SgÏŠ|!Í“v%W:ÐbÊ;GÃ|5èÕ¢ÔR:»Õ¹>¦/Ú€J#IHÅý¡d<ìm‡Ø #]bŽ·¢Œô¡2H kM¸îìMÙ=ª=€ôÃ0=@”Ýi»$míÉQ¸(šÒaFÛQ™&M¢iZ.Ц.ÈÖ±'ÌN¢ú¿’C‚°ÝöXlÄ‹PŠùC>Èš…æC< ÇZ’uÁT*~Ô˜1mmmu͈É: ')’vì:4| øˆµ$¼ñ`ûסî1Ás` aV5 »9„fú¼0ȶÔåµã¡€UŸ ´i±k%í– /êÆ)V…mo „ D][`!g¨¥i1qÝo» ÑCçv ¬.j{Û¼í5(öëxÈ¡„Â1¯® æÓÊHjI"¾Ù\¸©5e·ÇZ9#¼ÇÚÜ’XÓäõÍiÃâÆnr›]×§¨OѤ¬_Lw›‘ì”hÚ–dfÁh¼5ÿÑÎÙœˆEzÓ0ë¬9«št)SˆÄ2òRÞÔ ´-J4ë;ü]"ÿäÚn±¿&ükì)ÞyöA‡5|Dý‘‡Ö6þ0û°†nñI°­fX—n`Ÿ¢Óì´rä€4W]¸=+88‘V”æROØ1Ä7ºŠpR¤£)‡ža‡šYW‰ÀÙ­!­/ÛךLÅ"¡sPiNtÍÔÆüjµðãh7›+ÃOhvB3Ì>‘sm ·ê­­©ÖÀ†N5hÙìŒÊ À¹ìnû‚b¥ø©"LB)=Cs­pçzƉ¬è˜ü÷zò[~Ëoù-¿å·üöÿ¹É¿að–ßò[~Ëoù-¿å·ü–ßò[~Ëo]6Ïš@R]!® z<QÈ=˱4Oö–´<Òãñ(e½Lê’‰DýÒwëºi"ÙÎvÏó;”·6Ë€MâF§®÷èïîØ¤þQí; endstream endobj 488 0 obj 27937 endobj 489 0 obj 78252 endobj 239 0 obj <> endobj 490 0 obj <> endobj 491 0 obj <> endobj 493 0 obj <> stream xÚízy8”mø6)J„Šˆ2*e 3ÃX³‹ÈNviŒ1†1Ã,–,Ed²S‘";YR’d‹È–%Y²TRɾ|Ïx{_ÏôûŽïŸï¿ïø8Ž9Üçu?×}^ËsÞ÷=AC1U‚=Z“€'‹ÁÄ¡òoW{…#¨,«  :$c x $-Ñ$b!zH". Ãå¡’òR²˜œœ 0ÑLBBb€9’PY8")G…a0ˆE†Ø£1X<«um¼#ƒþƒ;PÜþµy ‰$`ˆÐŸµ…!ÀÊ<Îâ€vd•Ð'±(4DHàæMÄbœÈ!”0°¸,â,õSfûSŽú)Ýþ”lÇ„D"£]Im<Š@t#@Ä!ª8dÛ X‡„&zàßKjRp8}¤+°è?iùv¤+çýšaŽþ‡©ÚKqýÛŠ%ib½Ð†X2Ê âˆÄ‘ÐÿàÚd$‹RÅcphôèÞMÄañhC K­D ýÛfê„E¹àÑ$ñ wø›2PmÂ*½žRã€Åc p„4I$"½Y¡0B@|`,àß ‚öHJˆã dàˆ…ìq$Y©”„C$HnH :ü" ‘À!]w )ˆ¥–‰ÛA <ÅÕžZ| ~–¦> ‡'cÁÓe nh" €w0YˆÒÕê÷?TàDA9‘;S¥ ÀãH"C;‚PØôŸ¶ú¢B ˆX’‹+’ì´c‚sÃQH;ŠàêŠÜA€°\±xðémæXÂE) IyB¹Š&v ~'¯@]%Èž;v@ìDDƒf¬ â°uÒ¾lIX¯1À•„ö@ïdAÍ>M.U<LD–2Žzˆšp´+–•ã¨ù0F»S@5•c¨*ƒÞ!- v§ IÛþ¸f<†H—_ ¯ŠssÚI¾4@_ M{u'ìÎ ¯ÆgäÏ»‘°`ê2uCÐS2s-$¸Ê2óó /2km¢– Ûº‘nn I]]¤«½ëQv†_}Ð k$š"+K%»ÃUàjêÎ,ÀÕØi§sd®&X (Y€¬)rgY€é¥¿r"+Míà©€de¨lÐ#€®ˆ @×´3–¨Z©Édí‰H” šLó^ÊÁ·³GD:³Óyr’ÿͦ}_夶ß07@ô°( ¹ÓMrªô"IBÑx‚!"ÉHzçuö $M?ÉñØÓ"B:ƒªÄ4 ƒRûü¯ìÁ @Dn4Á`hz Â@ÓxØc 4ˆô¶H»Ðt °ÆÑ¶ wÝ©0 ؆õÒ„¿: £’q†Iþijp&‚š Cüé&#Á‹œ)g&Ket(8˜Ül^ Npª„“Àœª¤`Žð?}ƒ¦é1 nêñgmwÁàÛ­løàÉTy;O 6ŒªoÞPT£îd4“üGiÕFU9G`}éƒQU‹wÄâ±do prĈXðL ­(Å„9uÀ"]  íFU<'4’Š*xÀ6îâHÕ<à<@ð´'€6@Uø¶aÚ\Rõo; Ôð¯|R…pw x‚èSÕÐoi0ªR7\ÚF•EEUÿl&啪®ë†e*”nDp,¤æ›f>|ûT@=~8`Aj#'C4(ªv:`=°àÜQõ8-ýMCz{ÿÃz¢ƒG§SuÇ àâõ÷@˜h 4(xªªn§8P‘Aò£Êë¶Á è‹«4 V`ÂÇt"šL!‚ÒNÕZ€‘¨ÈT¡Õ:Ñ… :MÀ¨*kü?Q VO4PX2 ÚíaTEa‰(ú枪´ÿØhNS0ªÞ¢]ÝÈÞ$pŠ©¢‹ÅuJNónÀ©ê œ,i ?efS¨ Gpª{  ùÿ›ävÍH{ZXjÇÝ_ÄŽ³¿,ÔBaƒÏ*pªNS{âàÔ3ìöyÚîd`{¢™HUl"pa"m'‚ˆu™¨åý÷rô·º•ÎЮH¢Ëß6Éíà((ð:Rÿí Ö@¦9 麎#`¨3È@¸Ì8ø\§*üœ@Áÿö³ƒ=ŽFlàp莅FoàpØŽ$9p8|§U8\rÇD#‡&‘&²øüǾcÎß2XÏW¾!ˆ¿(,nC‡;”x,Hç\ŠW9¡|ÚU,_úSª}-ÅpÐD¾“0SíòäK1Á‹q1Xâä–dj$nìZ­¥ƒN•D7_€{«|{ùÜ‹Ý*ƒk¶ ý]ú¥o`9r1P«¯R•©Y/Oð'бÄŶٳ Sm„Ó=ÚŸ¥«íÕ–gú:edù暘œèMüÓ–(—èÈòŽ$Ë„”¬|!nøŠFEÔfìÔ¡-GëÆÌ¾ {û(±]É@\êZIŸÊ÷$=6löÄ^XîÝ?ÛßÁjP–1³Ww~•ÍíCWápI6;7¡O„5iK¸hzÂS“OöÑyy‘'[ß]—óöëzŒí„Æž}ΨÜný½‘ц+I¢9¾h‰ƒ… ¥óÀcXtv95ì/„·ZXíCÝÔó„­ ç`Ž3sŒÇ•’ŒÌ¡Ý+b"²y’¦£ xFà †‚‘§3ŠŒƒ¶Ä¼ŒŸßÊ=V)øuÙ/©ž'ü¥Häšϸg£‡Èë—WÛ„T„“§&›´ëÍžÞ :5Ç.gÛî®Ú?4S=ËZVH ••ŠÒe‹ÓTXoÿÌg£¹’"÷ó‹b€Ì„¯éïpFá´.ú ž°ä9!«¿vséA•sq3ãüJõºâJ˜‡!õ]k‚üo`,ˆ+ž£†Æç÷䌚֛ ÓûYýâ~Fë>·UpÂ帲¢¼Â±¾îG¯I˜­fŠÓ§ìû1Dé%ŸAä­Ìy}“#«b·l³nõGy6)«§]uzš“´?ƒ=êAÄ»5û  ·‚?Lz“£UþhÍ8BȱÜr–9s‹îŒ;ñÃBcž©Õ„àã|òî ½á0þµýçj_OV!µoö à/6º[²|„ÏÖ7ÃØ)¼6Î »¬Ÿ>Ñ¡›Q­ö¾”ÍöÔc²}«@†9Éï]KÓ+›žö#òì$#t؆u«•áæ§6ÕlsÎîüÞwKî}IKVkû¼Ý/-Xý€ð=8m9|}sPåVÇxFã‘b7ô€B³‰~÷¬Ä«Ë¬ƒjÄÊ…—i¼Ki»Ž× ®? 7mXšyô ÖßWôIL;æõ„å§Î«ÒaýAMáF~6¾*Çäâ/ï JÂ×x"çêü¼ï©á6?Õ¤šÊMjª—έ2爗JNdäÙu˜a¦Ò0lAÊŠ$⿵…Í×Ðü®ŽÖŠ:ý²cŸAp¢p[ï‚ä‚èå²yt®kK‚°¿ŠkÒ"«TÌN¼î+WÅ®9nø7a„3W³ùÅïçteμ¾'Â,¾.” ÛÇpë{Ö…Çr½ôŒE›„_O¤Eî¡Ûëò¯ÞãM­¶‘†¿—½—׊hГ?ðuïTÉ-ñò×á¥Ø¯Vaƒ*˜Ð§Ÿ½rÑŒÙbö.HcE–§ÂÉßÕªSÑœ¤"”mÍ_TÓí{ÝÚÏpßíº§ÓºOdW”^7-EŸ"ó`œ•^«sÝ£×´a8[½¸(ñaÑ!Ýj²÷ËíÉ ²ÌÅÐÓÙjq…Çhv»¾W¥=Þ·KPOŒ§cÖïœ2±´3\cá)o¡»cqlÔó¨¸ÀnhTbíùãxÔʜ֪y©U Í€È|c,3­tÿCí|׿íi:xú÷¦‚RzvÓñ“&ñž¦ûV-D KPf †J9¹qk'~Äu™'ÉsWýQmÑçmÔŒ´{QúÄuw!a1ø}¨_úWüñ—ëÌoi…fƒ¿ƒNç&êVéæ×@=íWÖ&ìsO<…»–|x !?2¶Ôx=(å(2ÇpÓùÃ%îhTŠ˜Š»g~ï.ŸàŠüò=Š=™ú|¯½³å-+à$øMÖü¡áçÂ3÷Õ¼Eá,™œ=}|YÉ…-Y÷= j$–™æëììZ µC®¥¾ØÇpª£$íìš^{ð€!NZÚÿ{ìM~bô°Ë‹ö!Åç rÌ›¹¾eìý¾]ïŽq.9ÙÀ}0øà¬dJZFä] òé=o‚nê*¿µýD‚lÕLë¸Ã+,­^[2àOZáS|ãF1ʵ'L¡cŽßåüu0z5òÐ9ñI+;®y‡•»ºUŸ}Ä {qHTÑVQ¨ýƉ£š¿¸NËwRä[ W$à>^¯íºs 5YGT}õs˜Ö…U½!yÎÁ•Ö¯©§æÃ¥§ŸØ¶|(©¾ºNìÃ,ôHÖ4`OïàTÒ5*ñ]Æ ü>Ûë|Îß¼ã뉊þiQ¼ühIº™Ó¬ú^-lÆïGÞùïK¬C Ž×[ÚØ7 ñz%±îËÀŽó=<™ª‘æ´rí½©ÉrÓyÊ€B–˜ßôÔ®sëØ‡è·ôÅBEŒñi8øBJ3#zØÑYG>ÔÙ)v‚J¯Ë ³x=;º‰›ìõÕ×1 ×+’ב=ÌØªT%åhæ~÷~é·†2C‡ïU]æ ¨jg\M¯¹±1Ó£"ñÁMÆÜ¢æïRÚß”¿ôé¢—Šº¢:WÆq|=ÚDMv¶ôÊ„ÜÀs ¡€U#™××Èjßz•ìòeÃð·vomÍN÷M†û"9{æx‹òºpg¸Ó›OIúZÝ-ôj9¡žÃªóôaÒ‚yífT-GðM«´óF½»j‹Œ-³k6, %3Ä÷?çbä ‡5ºqC8 e×.ì>¹ûGP®dð@ôdìƒ0n-FN‰gNÌSmšo¹’##F-=oöû7dWù›:ø$†öÖé_‰y^jv¨qè‘EMeÁ/éQå#3 ä+Z'#ÚÈø[>Gó|ú¥~ u¿˜Hdéë:qí²ŒÂê7ýÆX.¦Ï„õeÏ ¤[—?` %Ý­cö°ë…FdL³¿¨¶‘”œñ±õod´Òhݬfb†OÄi¦·¼cô³nkÚ(V Yq ‹Í[|ñì¸çqÎ5†ªeÌu^¯ošøËm—Çl³Jrï/D“!Ï¡à]3…cWì2¯3ÃgÕ½._’ýÕ4¶@ʱâsâ¢ò;9ôžŸgwÙMjä³Õ|F¸0×íkQ.ýÀÒtReþ´æ¬.Æ,²¥üùI¸cQÔ {I†•×sÞ\´ºì-S÷¹x[z$Ž»x6ÿ“!%ú¶Ònsø%wÿ2o |‹5ÎjôIbh½¦w¸Ë~hT'¦Y_Ú*¨c³ûxËó(aRÁgv¶¾]_cͦ17”£ªÏ­/Ó~ß ô~L'eÌ+ãÎÝ@WG|Ñ¡ƒÙ¿ó[/uUEd}~õôòÞS8“K—Äm’쪊_û,!}ã„Õ_x cX ?&ÞS°þYç9ÑþÒ/vÿ†X”eÚ)AIî±÷—@å-•M ÿw' tgÊdoÔ8âoÍ7IcçÊj=HY3^ÝÂîÞ¼ÒÍwÐóeÙ§>yø)q¦Ë®\éQÀWÅR÷Ö/òòb{3òpÏ£Çp¹æÃ=æ­ù£C‰·OnÍ2&ë­~†<-œº8ç¶ruÖ~ü]àëçˆ2?ã>öÇãü ÉÒDÅÔöó1’¯ö¾.x­Ú*(x÷WHq¤„©G¿ªUšLþLn5 ¢ûˆŸVÕé ?Íë{œ7®»+¼\0Mæj’R\6ºÍ)56#~ŠijßÇûÖ“Ýž»“Ê‘ˆ)T ÃüðÝ­d×›‘ýaÀ\a¤”»÷xë©È&Š4ñîšÈìÕÝ!>Ò‘ä¶ ‰2elsè''ØÜ]I&ÇjÊ2u½²úMí`r«ó¦9QMÏõ0cwËs§Gó>k¶-IþváÍq»=ûìôT<²ü«,×ÊÄñ‡xM¯î”pjŽ|Z´Æ¯°·MÍnà‹£ÓoÖœw\»Êôª·ì©Œ¸™¢pLÑÌàöׂŦZ±D¿¹Ëz¼u:GXïZcTÚu$Ít9*¼3ýN^dT‚”æîß(¨Xé{±@—î7roυ華vO4 ^÷©|ee©!*aÓ¸§kio†gì#bÊJ®¢õ.FÄ¢WòÊ¯^Íä£dh³¬Ò¯HħW.»F¶¸gÄùíŸö¼Ì™4'S¦Ú©ó6pÙ[þfÊ›®€5™YoØ¿wQrاñù¦¬è½¨Œb¡¨3'(Å‘l®oÃzë£:M5x|OÚâ ¶:ß‘n¹ßa~êrS*d&S#,éwQð¼¤ÂÕ·#çÄé}’5ö\…š³a·é£»b­Y*!(ÁN(?ŒQ®5ÇÆFd=&òH¹,s¸qpû¼ñIP·¡ùVg³}gnÈñ¬^Ô<¢miƒHͺ¯¶Å £Áûü3—E®âö¾éŽ˜C/ƒI¶:ZàÌi§yãôö#â)âù·»‹TÅÕ´#gc/2îÿ™µLª<æÖÃ2×ççµ¾á„Ñ®á åãÃê¿ùVÃCý×’ˆ|„–Ûúµ,VfûšN'Û‡|žÌ»¡ÚÑ—ˆ%ÜûÞ—k$¥øàøÒȇ£19Ò__ÊÄž ³8Ìœ„ÎŽÊÊ0eß,Ú3—Ÿ|íi†“Üs£sΊªÅ—>K³I_é.s\H½/’ú^»@ò|øF¬dÁb‡g¤‹nA?ÍïÎÓ”SBéßÔ9…éTnÍbaá/l3€¿ØwPšTåx]îñp1z`ëŒ=JAt̼¡òݶ Cí\Ÿ…Ý`)«f%WCÿ-)õD¼ƒ·Îmæ³zŸ^ŸÝUXѯ„Šk‰m:Mr0‰rŠöQ£GiØ.çÇVmbe¿×Æ ì—P£¾N¹û•÷²¼ROo†œk°ã«/±‰à\ʾ7›ózæ…às’IÍöò±îqr\Æ»Ýgº‰¼ bÐâalfÿâþ|\Ö„åC_õÚ̲`™L¦v¹é­¶+q7”¤ésŽè¡Õ"ØêÏ”%0¥·©~aºQälùÓo.÷äìAnº‹BE7ŸÝ{Wp‚Þa÷LÈËqL&ÅÀçܽ7q¤i߬«]9å÷Bg·,Ï×—ýêñ§×ÏÄWÝTΔ 'u,GXŒn*Ç߬@ðX«ˆcÌÖfò¦­Ù†ÛejÔ¦’¨™vÙÛ¾£…Yˆ>§½I£ z¸{õ7ë¬úzѽ¶°7ö±-ñrFÝ…Zy‡«BÚ„[û<> >d\x:γXõ&•¤w¦úÛ›æOñ9C}$ *n°÷d?w4"Ê>Jø(êïÿýù€­µžš¶d”­¾÷zÞò+ã\Q°÷AfÝÖ/ ›•®3»­76›ØTVù[8­§îò|?§¥‘š)¿MsoKd¹ë¬LÝA-§ôVFbA«Sú‡´)¾¤F=.Å6y±ùRí}„ÓþF¡_Ür¹úbÎ~Ñ5áÁ'mL /è¯âÊ€äFÕàf½gOÞyZîtÓv &’.?0b3<+éYuî’àÆÒëëqÙ«üz#ì[s#Šæ¶UM¨ÝX¥ù”«ô}¸ˆüf)ÄVÏ€˜¶WŸüå9W>å⿞ú9óŒ÷Zå¿£GÊB™z$DÓx;¼ÅfF[&³lyBp!ZUoFfÃtZ½»WÌf3•÷†«t|ó¼0ô]ïRÍ£Ò?6e#ä¹K"q “2­» D®Gi*̾Žï9%z Ûïj÷=»o‹]z3‚tI‚w—¯{yœöÁ«Ïs`ïÆæ=y'ÂÙGÄ’·Kr)’M§½&¦ÑJ,Þ…/[SB\×™ße¸úñY÷AÄÙžÛõ–»•t ûÍI>[nöã9tL¥•W+öŠÔ±U¨Þ]=ür³,2_?,¶DPj·li”¹Þ”éVyű´KM u‡Ž·2˜a1’TþAÀÔò{S˜(|hukzrÃéîiUÎ3:Bi)™Éø)Íùø€´¶f¥ÏQ§4Ò›&¬ dr­niÒ^÷2¤ø©w¸éÀÖRÑ«ŸéÞâçí®+[$‡ÝÑb04 {¤pûZ\¹0J þƒ+;ýÓ™+ŒŸ “we½-¸F|›žØ^8@tÜs&G,d˜ƒÏÙ24eùÁb6/Óq©4d…ñíBƒVJð þÛ˜– §‡Óþ.ð»g6—6Ó~~®@~Ž#s][» /±QìómŒåºÀn‹XéC¥×‹MfD©qŒªøÍX>p1»íþ Í\¾ÏPw ïEp:¹6ñÛÊoG¦>®GÓå‡n8l Íé'XV~ç29fªbRÖw½°Ñ–'/ÖŠÜ”f2ÎIåù`[Â^ÒÍóÔ7Ûé݈Ú¹˜ã«Ž+Âg| 78m)ºø‡ÆË‰âÚ=ÉwÅl ï>g%ê×kid0¹ÒúbͳöFíådùîT³„lý=A““³WÖU¸·ÜzŸN ºD¡ÜAB ÍÇæ‹½x†d|cú‘Óø÷çG7.™q„Z^]÷ùÞá¼öl÷õXŠÐ1¯•6ùSBPÎ!EùÔ6µêúaì\Ù…lšÍI”¯…ZowU°ˆ¬Ã„ÎÚB×&¡¸µé÷Îý¦sÒ.ßxq²ëà›¤*ƒcæmí¹q?Û§¸žÜœû_IwÜQtïÚáW׳»;guLHuêRÜõ’ñ‚Iô϶î<ùšÛ&X¨Tl®‹ˆé‘8Ï|ýV@F½ÿÄ“Œ2¥´*¿Ì÷¥›–ŸýR®“gÄËϦ…e%UÏ:ª´õWÙØ–[lŽÏô7~>+#Zñql™©dÀɶ2² yýë>­Ã§Æ$§7¾(~{Œ˜³*6èH”°bäè!y«–ïþM°ÚW/è»ÌÏÿp⥥ƒÁ¨Åü·ãvóÊBÇU4ˆä‰%yv:’OHR‰Ù؈^ÔÑñ¼½ŸÂd"–+žñå…¨îFÌV}¦Øž‰ýÐ~Þ^éÉ+?×çá˜Y>íBB|BÚR½>yiŸ [ü¨y_,+òäNŠÇ»÷ï¹_À1š¥(UñíøÅ‹…âg¬,éGÕ:ÎMœX Ã*³Â¥^Ì‹ÆV9Í}»+›ÝÅzõǬãËcÕ¬j?I(å·]—Îó IG÷²´R 1ãMfC§ž¼lIß•«Öv²´Ú®mïçfOÿ£ªÓ®lL ¼21_Nè(B7jGo2qŽKÅ;óE?Piǰct :XKîíÚObzvæ6¾¥ÕV:¸Iw@û ÛCK‰®ŒWO]¸Ë¸)¡ƒç².'DHýØLÏÌ)šZL ?[çA > stream xÚ]PÁNÄ ½óãÁd=TX¼6M65{P7‹~@ ÓJbLé¡/E²&†äñÞ›y3÷wUŒ°zzpÅů¤±j_ûÀxÛ=wÎFàòZa„Ñ:CENÖ±£cu,(¿z.fµ-çΞÕ5ðk"—HòÄÆßÉ Y7Áá³U «5„oœÑE¬iÀà˜¥,oýŒÀOæÅë*Iÿˆ- ÈŒ¿´7¸„^#õnBV Ñ@}>7 ùÇÇ0ꯞŠR )³¶üî®}Ÿ[ ½¥€yéanÞî|Ø]¹~f‘rô endstream endobj 498 0 obj 232 endobj 63 0 obj <> endobj 64 0 obj <> endobj 65 0 obj <> endobj 66 0 obj <> endobj 67 0 obj <> endobj 68 0 obj <> endobj 69 0 obj <> endobj 70 0 obj <> endobj 71 0 obj <> endobj 72 0 obj <> endobj 73 0 obj <> endobj 74 0 obj <> endobj 75 0 obj <> endobj 76 0 obj <> endobj 77 0 obj <> endobj 78 0 obj <> endobj 79 0 obj <> endobj 80 0 obj <> endobj 81 0 obj <> endobj 82 0 obj <> endobj 83 0 obj <> endobj 84 0 obj <> endobj 85 0 obj <> endobj 86 0 obj <> endobj 87 0 obj <> endobj 88 0 obj <> endobj 89 0 obj <> endobj 90 0 obj <> endobj 91 0 obj <> endobj 92 0 obj <> endobj 93 0 obj <> endobj 94 0 obj <> endobj 95 0 obj <> endobj 96 0 obj <> endobj 97 0 obj <> endobj 98 0 obj <> endobj 99 0 obj <> endobj 100 0 obj <> endobj 101 0 obj <> endobj 102 0 obj <> endobj 103 0 obj <> endobj 108 0 obj <> endobj 109 0 obj <> endobj 110 0 obj <> endobj 111 0 obj <> endobj 112 0 obj <> endobj 113 0 obj <> endobj 114 0 obj <> endobj 115 0 obj <> endobj 116 0 obj <> endobj 117 0 obj <> endobj 118 0 obj <> endobj 119 0 obj <> endobj 120 0 obj <> endobj 121 0 obj <> endobj 122 0 obj <> endobj 123 0 obj <> endobj 124 0 obj <> endobj 125 0 obj <> endobj 126 0 obj <> endobj 127 0 obj <> endobj 128 0 obj <> endobj 129 0 obj <> endobj 130 0 obj <> endobj 131 0 obj <> endobj 132 0 obj <> endobj 133 0 obj <> endobj 134 0 obj <> endobj 135 0 obj <> endobj 136 0 obj <> endobj 137 0 obj <> endobj 138 0 obj <> endobj 139 0 obj <> endobj 140 0 obj <> endobj 141 0 obj <> endobj 142 0 obj <> endobj 143 0 obj <> endobj 144 0 obj <> endobj 145 0 obj <> endobj 146 0 obj <> endobj 147 0 obj <> endobj 148 0 obj <> endobj 149 0 obj <> endobj 150 0 obj <> endobj 151 0 obj <> endobj 152 0 obj <> endobj 153 0 obj <> endobj 154 0 obj <> endobj 155 0 obj <> endobj 156 0 obj <> endobj 157 0 obj <> endobj 158 0 obj <> endobj 159 0 obj <> endobj 160 0 obj <> endobj 161 0 obj <> endobj 162 0 obj <> endobj 163 0 obj <> endobj 164 0 obj <> endobj 165 0 obj <> endobj 166 0 obj <> endobj 167 0 obj <> endobj 168 0 obj <> endobj 169 0 obj <> endobj 170 0 obj <> endobj 171 0 obj <> endobj 172 0 obj <> endobj 173 0 obj <> endobj 174 0 obj <> endobj 175 0 obj <> endobj 176 0 obj <> endobj 177 0 obj <> endobj 178 0 obj <> endobj 179 0 obj <> endobj 180 0 obj <> endobj 181 0 obj <> endobj 182 0 obj <> endobj 183 0 obj <> endobj 184 0 obj <> endobj 185 0 obj <> endobj 186 0 obj <> endobj 187 0 obj <> endobj 188 0 obj <> endobj 189 0 obj <> endobj 190 0 obj <> endobj 191 0 obj <> endobj 192 0 obj <> endobj 193 0 obj <> endobj 194 0 obj <> endobj 195 0 obj <> endobj 196 0 obj <> endobj 197 0 obj <> endobj 198 0 obj <> endobj 199 0 obj <> endobj 200 0 obj <> endobj 201 0 obj <> endobj 206 0 obj <> endobj 207 0 obj <> endobj 208 0 obj <> endobj 209 0 obj <> endobj 220 0 obj <> >> endobj 228 0 obj <> >> endobj 229 0 obj <> >> endobj 234 0 obj <> endobj 245 0 obj <> endobj 250 0 obj <> endobj 251 0 obj <> endobj 256 0 obj <> endobj 257 0 obj <> endobj 258 0 obj <> endobj 259 0 obj <> endobj 264 0 obj <> endobj 265 0 obj <> endobj 266 0 obj <> endobj 271 0 obj <> endobj 272 0 obj <> endobj 273 0 obj <> endobj 274 0 obj <> endobj 287 0 obj <> endobj 288 0 obj <> endobj 289 0 obj <> endobj 290 0 obj <> endobj 291 0 obj <> endobj 300 0 obj <> endobj 301 0 obj <> endobj 302 0 obj <> endobj 307 0 obj <> endobj 308 0 obj <> endobj 313 0 obj <> endobj 322 0 obj <> endobj 323 0 obj <> endobj 328 0 obj <> endobj 329 0 obj <> endobj 330 0 obj <> endobj 335 0 obj <> endobj 336 0 obj <> endobj 337 0 obj <> endobj 366 0 obj <> endobj 371 0 obj <> endobj 379 0 obj <> endobj 384 0 obj <> endobj 1 0 obj <> ] >> /Names 499 0 R /ViewerPreferences <> /PageMode /UseOutlines /Outlines 5 0 R /OpenAction [49 0 R /XYZ 0 792 0] /Metadata 3 0 R >> endobj 2 0 obj <> endobj 501 0 obj <> endobj 502 0 obj <> endobj 503 0 obj <> endobj 504 0 obj <> endobj 505 0 obj <> endobj 49 0 obj <> endobj 52 0 obj <> /XObject <> >> endobj 506 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 507 0 obj 40 endobj 55 0 obj <> endobj 58 0 obj <> >> endobj 508 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 509 0 obj 40 endobj 59 0 obj <> endobj 62 0 obj <> >> endobj 510 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 511 0 obj 40 endobj 104 0 obj <> endobj 107 0 obj <> >> endobj 512 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 513 0 obj 40 endobj 202 0 obj <> endobj 205 0 obj <> >> endobj 514 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 515 0 obj 40 endobj 210 0 obj <> endobj 213 0 obj <> >> endobj 516 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 517 0 obj 40 endobj 215 0 obj <> endobj 218 0 obj <> >> endobj 518 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 519 0 obj 40 endobj 221 0 obj <> endobj 224 0 obj <> >> endobj 520 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 521 0 obj 40 endobj 230 0 obj <> endobj 233 0 obj <> >> endobj 522 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 523 0 obj 40 endobj 235 0 obj <> endobj 238 0 obj <> >> endobj 524 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 525 0 obj 40 endobj 240 0 obj <> endobj 243 0 obj <> /XObject <> >> endobj 526 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 527 0 obj 40 endobj 246 0 obj <> endobj 249 0 obj <> >> endobj 528 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 529 0 obj 40 endobj 252 0 obj <> endobj 255 0 obj <> >> endobj 530 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 531 0 obj 40 endobj 260 0 obj <> endobj 263 0 obj <> >> endobj 532 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 533 0 obj 40 endobj 267 0 obj <> endobj 270 0 obj <> >> endobj 534 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 535 0 obj 40 endobj 275 0 obj <> endobj 278 0 obj <> >> endobj 536 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 537 0 obj 40 endobj 279 0 obj <> endobj 282 0 obj <> >> endobj 538 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 539 0 obj 40 endobj 283 0 obj <> endobj 286 0 obj <> >> endobj 540 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 541 0 obj 40 endobj 292 0 obj <> endobj 295 0 obj <> >> endobj 542 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 543 0 obj 40 endobj 296 0 obj <> endobj 299 0 obj <> >> endobj 544 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 545 0 obj 40 endobj 303 0 obj <> endobj 306 0 obj <> >> endobj 546 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 547 0 obj 40 endobj 309 0 obj <> endobj 312 0 obj <> >> endobj 548 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 549 0 obj 40 endobj 314 0 obj <> endobj 317 0 obj <> >> endobj 550 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 551 0 obj 40 endobj 318 0 obj <> endobj 321 0 obj <> >> endobj 552 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 553 0 obj 40 endobj 324 0 obj <> endobj 327 0 obj <> >> endobj 554 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 555 0 obj 40 endobj 331 0 obj <> endobj 334 0 obj <> >> endobj 556 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 557 0 obj 40 endobj 338 0 obj <> endobj 341 0 obj <> >> endobj 558 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 559 0 obj 40 endobj 342 0 obj <> endobj 345 0 obj <> >> endobj 560 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 561 0 obj 40 endobj 346 0 obj <> endobj 349 0 obj <> >> endobj 562 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 563 0 obj 40 endobj 350 0 obj <> endobj 353 0 obj <> >> endobj 564 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 565 0 obj 40 endobj 354 0 obj <> endobj 357 0 obj <> >> endobj 566 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 567 0 obj 40 endobj 358 0 obj <> endobj 361 0 obj <> >> endobj 568 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 569 0 obj 40 endobj 362 0 obj <> endobj 365 0 obj <> >> endobj 570 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 571 0 obj 40 endobj 367 0 obj <> endobj 370 0 obj <> >> endobj 572 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 573 0 obj 40 endobj 372 0 obj <> endobj 375 0 obj <> /XObject <> >> endobj 574 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 575 0 obj 40 endobj 380 0 obj <> endobj 383 0 obj <> >> endobj 576 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 577 0 obj 40 endobj 385 0 obj <> endobj 388 0 obj <> >> endobj 578 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 579 0 obj 40 endobj 389 0 obj <> endobj 392 0 obj <> >> endobj 580 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 581 0 obj 40 endobj 393 0 obj <> endobj 396 0 obj <> >> endobj 582 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 583 0 obj 40 endobj 397 0 obj <> endobj 400 0 obj <> >> endobj 584 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 585 0 obj 40 endobj 401 0 obj <> endobj 404 0 obj <> >> endobj 586 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 587 0 obj 40 endobj 405 0 obj <> endobj 408 0 obj <> >> endobj 588 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 589 0 obj 40 endobj 409 0 obj <> endobj 412 0 obj <> >> endobj 590 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 591 0 obj 40 endobj 413 0 obj <> endobj 416 0 obj <> >> endobj 592 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 593 0 obj 40 endobj 417 0 obj <> endobj 420 0 obj <> >> endobj 594 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 595 0 obj 40 endobj 421 0 obj <> endobj 424 0 obj <> >> endobj 596 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 597 0 obj 40 endobj 3 0 obj <> stream application/pdf HP BladeSystem c-Class to HPI Mapping Developers Guide Hewlett-Packard Company XEP 4.18 build 20100322 Unknown 2012-08-07T11:01:04Z 2012-08-07T11:01:04Z endstream endobj 5 0 obj <> endobj 29 0 obj <> endobj 36 0 obj <> endobj 35 0 obj <> endobj 34 0 obj <> endobj 33 0 obj <> endobj 32 0 obj <> endobj 31 0 obj <> endobj 30 0 obj <> endobj 45 0 obj <> endobj 44 0 obj <> endobj 43 0 obj <> endobj 42 0 obj <> endobj 41 0 obj <> endobj 38 0 obj <> endobj 40 0 obj <> endobj 39 0 obj <> endobj 37 0 obj <> endobj 17 0 obj <> endobj 19 0 obj <> endobj 28 0 obj <> endobj 27 0 obj <> endobj 26 0 obj <> endobj 25 0 obj <> endobj 24 0 obj <> endobj 23 0 obj <> endobj 22 0 obj <> endobj 21 0 obj <> endobj 20 0 obj <> endobj 18 0 obj <> endobj 16 0 obj <> endobj 15 0 obj <> endobj 14 0 obj <> endobj 13 0 obj <> endobj 46 0 obj <> endobj 47 0 obj <> endobj 48 0 obj <> endobj 8 0 obj <> endobj 12 0 obj <> endobj 11 0 obj <> endobj 10 0 obj <> endobj 9 0 obj <> endobj 7 0 obj <> endobj 6 0 obj <> endobj 499 0 obj <> endobj 500 0 obj <> endobj 690 0 obj <> endobj 691 0 obj <> endobj 692 0 obj <> endobj 693 0 obj <> endobj 694 0 obj <> endobj 695 0 obj <> endobj 669 0 obj <> endobj 635 0 obj <> endobj 640 0 obj <> endobj 630 0 obj <> endobj 627 0 obj <> endobj 677 0 obj <> endobj 688 0 obj <> endobj 634 0 obj <> endobj 617 0 obj <> endobj 611 0 obj <> endobj 601 0 obj <> endobj 629 0 obj <> endobj 600 0 obj <> endobj 626 0 obj <> endobj 645 0 obj <> endobj 654 0 obj <> endobj 647 0 obj <> endobj 633 0 obj <> endobj 625 0 obj <> endobj 670 0 obj <> endobj 665 0 obj <> endobj 628 0 obj <> endobj 641 0 obj <> endobj 673 0 obj <> endobj 599 0 obj <> endobj 639 0 obj <> endobj 624 0 obj <> endobj 609 0 obj <> endobj 615 0 obj <> endobj 614 0 obj <> endobj 603 0 obj <> endobj 608 0 obj <> endobj 606 0 obj <> endobj 655 0 obj <> endobj 652 0 obj <> endobj 610 0 obj <> endobj 598 0 obj <> endobj 683 0 obj <> endobj 679 0 obj <> endobj 667 0 obj <> endobj 661 0 obj <> endobj 657 0 obj <> endobj 648 0 obj <> endobj 674 0 obj <> endobj 662 0 obj <> endobj 650 0 obj <> endobj 656 0 obj <> endobj 616 0 obj <> endobj 604 0 obj <> endobj 682 0 obj <> endobj 637 0 obj <> endobj 668 0 obj <> endobj 653 0 obj <> endobj 684 0 obj <> endobj 659 0 obj <> endobj 643 0 obj <> endobj 680 0 obj <> endobj 660 0 obj <> endobj 686 0 obj <> endobj 649 0 obj <> endobj 613 0 obj <> endobj 671 0 obj <> endobj 689 0 obj <> endobj 678 0 obj <> endobj 620 0 obj <> endobj 646 0 obj <> endobj 664 0 obj <> endobj 651 0 obj <> endobj 642 0 obj <> endobj 619 0 obj <> endobj 676 0 obj <> endobj 623 0 obj <> endobj 675 0 obj <> endobj 644 0 obj <> endobj 618 0 obj <> endobj 622 0 obj <> endobj 687 0 obj <> endobj 621 0 obj <> endobj 681 0 obj <> endobj 636 0 obj <> endobj 602 0 obj <> endobj 605 0 obj <> endobj 672 0 obj <> endobj 638 0 obj <> endobj 685 0 obj <> endobj 612 0 obj <> endobj 666 0 obj <> endobj 663 0 obj <> endobj 631 0 obj <> endobj 658 0 obj <> endobj 632 0 obj <> endobj 607 0 obj <> endobj xref 0 696 0000000000 65535 f 0000763830 00000 n 0000764070 00000 n 0000786482 00000 n 0000266468 00000 n 0000787512 00000 n 0000792207 00000 n 0000792112 00000 n 0000791581 00000 n 0000792024 00000 n 0000791920 00000 n 0000791812 00000 n 0000791712 00000 n 0000791143 00000 n 0000791023 00000 n 0000790900 00000 n 0000790761 00000 n 0000789455 00000 n 0000790676 00000 n 0000789610 00000 n 0000790565 00000 n 0000790470 00000 n 0000790351 00000 n 0000790246 00000 n 0000790144 00000 n 0000790036 00000 n 0000789920 00000 n 0000789815 00000 n 0000789732 00000 n 0000787568 00000 n 0000788358 00000 n 0000788263 00000 n 0000788167 00000 n 0000788052 00000 n 0000787949 00000 n 0000787849 00000 n 0000787709 00000 n 0000789318 00000 n 0000788978 00000 n 0000789219 00000 n 0000789122 00000 n 0000788877 00000 n 0000788774 00000 n 0000788670 00000 n 0000788566 00000 n 0000788451 00000 n 0000791257 00000 n 0000791396 00000 n 0000791495 00000 n 0000764860 00000 n 0000000015 00000 n 0000000661 00000 n 0000765061 00000 n 0000646637 00000 n 0000569798 00000 n 0000765296 00000 n 0000000681 00000 n 0000002611 00000 n 0000765497 00000 n 0000765699 00000 n 0000002632 00000 n 0000007408 00000 n 0000766201 00000 n 0000745697 00000 n 0000745786 00000 n 0000745874 00000 n 0000745962 00000 n 0000746050 00000 n 0000746140 00000 n 0000746229 00000 n 0000746326 00000 n 0000746415 00000 n 0000746516 00000 n 0000746605 00000 n 0000746694 00000 n 0000746783 00000 n 0000746874 00000 n 0000746965 00000 n 0000747057 00000 n 0000747148 00000 n 0000747240 00000 n 0000747331 00000 n 0000747423 00000 n 0000747514 00000 n 0000747605 00000 n 0000747696 00000 n 0000747786 00000 n 0000747877 00000 n 0000747968 00000 n 0000748059 00000 n 0000748149 00000 n 0000748239 00000 n 0000748330 00000 n 0000748421 00000 n 0000748512 00000 n 0000748603 00000 n 0000748695 00000 n 0000748785 00000 n 0000748875 00000 n 0000748965 00000 n 0000749055 00000 n 0000749147 00000 n 0000749239 00000 n 0000749332 00000 n 0000766403 00000 n 0000007429 00000 n 0000014317 00000 n 0000767369 00000 n 0000749425 00000 n 0000749528 00000 n 0000749633 00000 n 0000749724 00000 n 0000749818 00000 n 0000749913 00000 n 0000750011 00000 n 0000750108 00000 n 0000750208 00000 n 0000750308 00000 n 0000750410 00000 n 0000750509 00000 n 0000750610 00000 n 0000750713 00000 n 0000750818 00000 n 0000750922 00000 n 0000751029 00000 n 0000751133 00000 n 0000751240 00000 n 0000751343 00000 n 0000751448 00000 n 0000751548 00000 n 0000751651 00000 n 0000751748 00000 n 0000751847 00000 n 0000751941 00000 n 0000752038 00000 n 0000752138 00000 n 0000752241 00000 n 0000752347 00000 n 0000752456 00000 n 0000752561 00000 n 0000752669 00000 n 0000752771 00000 n 0000752876 00000 n 0000752983 00000 n 0000753093 00000 n 0000753200 00000 n 0000753310 00000 n 0000753414 00000 n 0000753520 00000 n 0000753619 00000 n 0000753721 00000 n 0000753822 00000 n 0000753926 00000 n 0000754028 00000 n 0000754132 00000 n 0000754229 00000 n 0000754329 00000 n 0000754424 00000 n 0000754522 00000 n 0000754619 00000 n 0000754718 00000 n 0000754820 00000 n 0000754925 00000 n 0000755024 00000 n 0000755125 00000 n 0000755225 00000 n 0000755327 00000 n 0000755426 00000 n 0000755528 00000 n 0000755626 00000 n 0000755726 00000 n 0000755821 00000 n 0000755919 00000 n 0000756021 00000 n 0000756125 00000 n 0000756230 00000 n 0000756338 00000 n 0000756433 00000 n 0000756530 00000 n 0000756627 00000 n 0000756727 00000 n 0000756824 00000 n 0000756926 00000 n 0000757017 00000 n 0000757110 00000 n 0000757201 00000 n 0000757295 00000 n 0000757394 00000 n 0000757496 00000 n 0000757595 00000 n 0000757697 00000 n 0000757796 00000 n 0000757897 00000 n 0000757995 00000 n 0000758096 00000 n 0000758193 00000 n 0000758293 00000 n 0000758390 00000 n 0000758490 00000 n 0000758587 00000 n 0000758686 00000 n 0000758783 00000 n 0000767572 00000 n 0000014339 00000 n 0000015001 00000 n 0000767818 00000 n 0000758883 00000 n 0000758974 00000 n 0000759068 00000 n 0000759159 00000 n 0000768021 00000 n 0000015022 00000 n 0000021494 00000 n 0000768225 00000 n 0000573326 00000 n 0000768440 00000 n 0000021516 00000 n 0000022728 00000 n 0000768662 00000 n 0000668717 00000 n 0000759253 00000 n 0000768877 00000 n 0000022750 00000 n 0000029684 00000 n 0000769107 00000 n 0000685962 00000 n 0000595303 00000 n 0000613041 00000 n 0000759381 00000 n 0000759511 00000 n 0000769358 00000 n 0000029706 00000 n 0000039173 00000 n 0000769580 00000 n 0000759645 00000 n 0000769819 00000 n 0000039195 00000 n 0000045957 00000 n 0000770023 00000 n 0000735676 00000 n 0000770262 00000 n 0000045979 00000 n 0000048719 00000 n 0000770484 00000 n 0000294103 00000 n 0000759754 00000 n 0000770745 00000 n 0000048741 00000 n 0000055647 00000 n 0000770975 00000 n 0000759867 00000 n 0000759971 00000 n 0000771190 00000 n 0000055669 00000 n 0000064203 00000 n 0000771436 00000 n 0000760088 00000 n 0000760195 00000 n 0000760308 00000 n 0000760426 00000 n 0000771687 00000 n 0000064225 00000 n 0000069189 00000 n 0000771925 00000 n 0000760542 00000 n 0000760649 00000 n 0000760758 00000 n 0000772152 00000 n 0000069211 00000 n 0000077782 00000 n 0000772398 00000 n 0000760862 00000 n 0000760970 00000 n 0000761089 00000 n 0000761206 00000 n 0000772625 00000 n 0000077804 00000 n 0000085045 00000 n 0000772829 00000 n 0000773044 00000 n 0000085067 00000 n 0000091153 00000 n 0000773248 00000 n 0000773475 00000 n 0000091175 00000 n 0000098404 00000 n 0000773729 00000 n 0000761321 00000 n 0000761428 00000 n 0000761545 00000 n 0000761666 00000 n 0000761784 00000 n 0000773968 00000 n 0000098426 00000 n 0000108315 00000 n 0000774172 00000 n 0000774399 00000 n 0000108337 00000 n 0000115993 00000 n 0000774637 00000 n 0000761896 00000 n 0000762004 00000 n 0000762115 00000 n 0000774876 00000 n 0000116015 00000 n 0000121922 00000 n 0000775106 00000 n 0000762231 00000 n 0000762338 00000 n 0000775321 00000 n 0000121944 00000 n 0000128489 00000 n 0000775543 00000 n 0000762447 00000 n 0000775782 00000 n 0000128511 00000 n 0000136246 00000 n 0000775986 00000 n 0000776225 00000 n 0000136268 00000 n 0000144761 00000 n 0000776455 00000 n 0000762551 00000 n 0000762651 00000 n 0000776670 00000 n 0000144783 00000 n 0000151546 00000 n 0000776908 00000 n 0000762757 00000 n 0000762863 00000 n 0000762975 00000 n 0000777147 00000 n 0000151568 00000 n 0000159429 00000 n 0000777385 00000 n 0000763084 00000 n 0000763195 00000 n 0000763314 00000 n 0000777636 00000 n 0000159451 00000 n 0000168504 00000 n 0000777840 00000 n 0000778079 00000 n 0000168526 00000 n 0000177760 00000 n 0000778283 00000 n 0000778510 00000 n 0000177782 00000 n 0000186669 00000 n 0000778714 00000 n 0000778941 00000 n 0000186691 00000 n 0000192454 00000 n 0000779145 00000 n 0000779372 00000 n 0000192476 00000 n 0000198469 00000 n 0000779576 00000 n 0000779803 00000 n 0000198491 00000 n 0000204786 00000 n 0000780007 00000 n 0000780234 00000 n 0000204808 00000 n 0000211092 00000 n 0000780456 00000 n 0000763418 00000 n 0000780695 00000 n 0000211114 00000 n 0000218463 00000 n 0000780917 00000 n 0000763522 00000 n 0000781156 00000 n 0000218485 00000 n 0000222511 00000 n 0000781378 00000 n 0000286567 00000 n 0000266720 00000 n 0000706619 00000 n 0000763619 00000 n 0000781699 00000 n 0000222533 00000 n 0000227942 00000 n 0000781921 00000 n 0000763722 00000 n 0000782184 00000 n 0000227964 00000 n 0000236784 00000 n 0000782388 00000 n 0000782639 00000 n 0000236806 00000 n 0000243381 00000 n 0000782843 00000 n 0000783070 00000 n 0000243403 00000 n 0000244831 00000 n 0000783274 00000 n 0000783489 00000 n 0000244853 00000 n 0000245916 00000 n 0000783693 00000 n 0000783908 00000 n 0000245937 00000 n 0000247135 00000 n 0000784112 00000 n 0000784327 00000 n 0000247157 00000 n 0000251147 00000 n 0000784531 00000 n 0000784758 00000 n 0000251169 00000 n 0000256166 00000 n 0000784962 00000 n 0000785189 00000 n 0000256188 00000 n 0000259949 00000 n 0000785393 00000 n 0000785620 00000 n 0000259971 00000 n 0000264152 00000 n 0000785824 00000 n 0000786051 00000 n 0000264174 00000 n 0000266446 00000 n 0000786255 00000 n 0000286544 00000 n 0000292757 00000 n 0000292779 00000 n 0000294081 00000 n 0000569774 00000 n 0000570462 00000 n 0000570483 00000 n 0000570568 00000 n 0000570590 00000 n 0000570629 00000 n 0000573823 00000 n 0000574217 00000 n 0000594669 00000 n 0000574432 00000 n 0000594581 00000 n 0000594604 00000 n 0000594625 00000 n 0000594648 00000 n 0000595282 00000 n 0000595695 00000 n 0000595857 00000 n 0000612614 00000 n 0000596083 00000 n 0000612526 00000 n 0000612549 00000 n 0000612570 00000 n 0000612593 00000 n 0000613020 00000 n 0000613504 00000 n 0000613778 00000 n 0000646081 00000 n 0000614003 00000 n 0000645993 00000 n 0000646016 00000 n 0000646037 00000 n 0000646060 00000 n 0000646616 00000 n 0000647443 00000 n 0000646777 00000 n 0000647422 00000 n 0000648322 00000 n 0000648571 00000 n 0000668671 00000 n 0000668694 00000 n 0000669332 00000 n 0000668865 00000 n 0000669311 00000 n 0000669863 00000 n 0000670121 00000 n 0000685916 00000 n 0000685939 00000 n 0000686694 00000 n 0000686103 00000 n 0000686673 00000 n 0000687416 00000 n 0000687667 00000 n 0000706573 00000 n 0000706596 00000 n 0000707111 00000 n 0000706774 00000 n 0000707090 00000 n 0000707335 00000 n 0000707599 00000 n 0000735630 00000 n 0000735653 00000 n 0000735848 00000 n 0000735910 00000 n 0000745367 00000 n 0000736129 00000 n 0000745280 00000 n 0000745302 00000 n 0000745324 00000 n 0000745346 00000 n 0000745676 00000 n 0000792330 00000 n 0000792367 00000 n 0000764161 00000 n 0000764305 00000 n 0000764452 00000 n 0000764599 00000 n 0000764746 00000 n 0000765159 00000 n 0000765276 00000 n 0000765562 00000 n 0000765679 00000 n 0000766266 00000 n 0000766383 00000 n 0000767435 00000 n 0000767552 00000 n 0000767884 00000 n 0000768001 00000 n 0000768303 00000 n 0000768420 00000 n 0000768740 00000 n 0000768857 00000 n 0000769221 00000 n 0000769338 00000 n 0000769682 00000 n 0000769799 00000 n 0000770125 00000 n 0000770242 00000 n 0000770608 00000 n 0000770725 00000 n 0000771053 00000 n 0000771170 00000 n 0000771550 00000 n 0000771667 00000 n 0000772015 00000 n 0000772132 00000 n 0000772488 00000 n 0000772605 00000 n 0000772907 00000 n 0000773024 00000 n 0000773338 00000 n 0000773455 00000 n 0000773831 00000 n 0000773948 00000 n 0000774262 00000 n 0000774379 00000 n 0000774739 00000 n 0000774856 00000 n 0000775184 00000 n 0000775301 00000 n 0000775645 00000 n 0000775762 00000 n 0000776088 00000 n 0000776205 00000 n 0000776533 00000 n 0000776650 00000 n 0000777010 00000 n 0000777127 00000 n 0000777499 00000 n 0000777616 00000 n 0000777942 00000 n 0000778059 00000 n 0000778373 00000 n 0000778490 00000 n 0000778804 00000 n 0000778921 00000 n 0000779235 00000 n 0000779352 00000 n 0000779666 00000 n 0000779783 00000 n 0000780097 00000 n 0000780214 00000 n 0000780558 00000 n 0000780675 00000 n 0000781019 00000 n 0000781136 00000 n 0000781562 00000 n 0000781679 00000 n 0000782047 00000 n 0000782164 00000 n 0000782502 00000 n 0000782619 00000 n 0000782933 00000 n 0000783050 00000 n 0000783352 00000 n 0000783469 00000 n 0000783771 00000 n 0000783888 00000 n 0000784190 00000 n 0000784307 00000 n 0000784621 00000 n 0000784738 00000 n 0000785052 00000 n 0000785169 00000 n 0000785483 00000 n 0000785600 00000 n 0000785914 00000 n 0000786031 00000 n 0000786345 00000 n 0000786462 00000 n 0000796689 00000 n 0000796081 00000 n 0000795475 00000 n 0000795374 00000 n 0000798929 00000 n 0000796385 00000 n 0000797301 00000 n 0000798979 00000 n 0000796485 00000 n 0000799483 00000 n 0000796435 00000 n 0000796235 00000 n 0000796639 00000 n 0000795324 00000 n 0000799181 00000 n 0000797909 00000 n 0000796337 00000 n 0000796287 00000 n 0000797249 00000 n 0000795274 00000 n 0000798621 00000 n 0000798363 00000 n 0000798111 00000 n 0000798777 00000 n 0000798673 00000 n 0000798467 00000 n 0000796183 00000 n 0000795777 00000 n 0000795525 00000 n 0000795070 00000 n 0000795929 00000 n 0000795424 00000 n 0000795020 00000 n 0000799331 00000 n 0000799431 00000 n 0000795727 00000 n 0000795224 00000 n 0000794918 00000 n 0000798877 00000 n 0000797401 00000 n 0000799077 00000 n 0000796133 00000 n 0000794968 00000 n 0000795979 00000 n 0000798313 00000 n 0000797655 00000 n 0000798569 00000 n 0000795577 00000 n 0000798161 00000 n 0000795677 00000 n 0000796991 00000 n 0000797857 00000 n 0000797145 00000 n 0000798263 00000 n 0000796587 00000 n 0000797505 00000 n 0000795627 00000 n 0000796537 00000 n 0000797197 00000 n 0000796939 00000 n 0000799381 00000 n 0000797607 00000 n 0000797755 00000 n 0000796889 00000 n 0000797093 00000 n 0000799281 00000 n 0000798213 00000 n 0000795879 00000 n 0000799231 00000 n 0000796839 00000 n 0000797453 00000 n 0000794868 00000 n 0000795829 00000 n 0000797959 00000 n 0000799027 00000 n 0000796029 00000 n 0000797043 00000 n 0000798517 00000 n 0000798415 00000 n 0000795120 00000 n 0000798059 00000 n 0000796789 00000 n 0000797705 00000 n 0000798825 00000 n 0000797351 00000 n 0000796739 00000 n 0000797557 00000 n 0000799129 00000 n 0000797807 00000 n 0000798725 00000 n 0000795172 00000 n 0000798009 00000 n 0000792446 00000 n 0000792883 00000 n 0000793221 00000 n 0000793571 00000 n 0000793939 00000 n 0000794463 00000 n trailer <<060D3EA53100E83008103393532F05ED>] >> startxref 799534 %%EOF openhpi-3.6.1/plugins/oa_soap/oa_soap_event.c0000644000175100017510000017706312575647270020300 0ustar mohanmohan/* * Copyright (C) 2007-2009, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. * Mohan Devarajulu * * This file is having the code for handling the events which * are coming from OA. * * oa_soap_get_event() - this is not required in case of oa. it * is always "PULL" method used for * handling any type of signals from oa * * oa_soap_event_thread() - handles the oa events and pushes the * same into the framework queue * * oa_soap_error_handling() - handles the oa events based error * handling scenario. * * process_oa_out_of_access() - handles the oa, which went out of * access * * process_oa_events() - handles the oa events and calls * correct handler function for * different events **/ #include "oa_soap_event.h" #include "sahpi_wrappers.h" #include /** * oa_soap_get_event * @oh_handler: Pointer to openhpi handler structure * * Purpose: * Gets the event from the plugin event queue. * Pushes the event to infrastructure * * Detailed Description: NA * * Return values: * 1 - on pushing the event to infrastructure. * 0 - if there are no events in the plugin to push thru this function. **/ int oa_soap_get_event(void *oh_handler) { /* Since OA sends the events on any changes to resources * Using this function, OA need not to be polled for resource state * changes. This method always returns 0 * * No events for infra-structure to process */ return 0; } /** * event_thread * @oa_pointer: Pointer to the oa_info structure for this thread. * * Purpose: * Gets the event from the OA. * Processes the OA event and pushes the event to infrastructure * * Detailed Description: NA * * Return values: * (gpointer *) SA_OK - on success. * (gpointer *) SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * (gpointer *) SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ gpointer oa_soap_event_thread(gpointer oa_pointer) { SaErrorT rv = SA_OK; struct getAllEventsEx request; struct getAllEventsResponse response; struct oh_handler_state *handler = NULL; struct oa_info *oa = NULL; int ret_code = SA_ERR_HPI_INVALID_PARAMS; int retry_on_switchover = 0; struct oa_soap_handler *oa_handler = NULL; SaHpiBoolT is_plugin_initialized = SAHPI_FALSE; SaHpiBoolT is_discovery_completed = SAHPI_FALSE; SaHpiBoolT listen_for_events = SAHPI_TRUE; char *user_name, *password, *url = NULL; struct timeval time1 = {0}, time2 = {0}; char oa_fw_buf[SAHPI_MAX_TEXT_BUFFER_LENGTH]; if (oa_pointer == NULL) { err("Invalid parameter"); g_thread_exit(&ret_code); } /* Extract the oh_handler and oa_info structure from oa_pointer */ oa = (struct oa_info *)oa_pointer; handler = oa->oh_handler; oa_handler = handler->data; dbg("Threadid= %p OA SOAP event thread started for OA %s", g_thread_self(), oa->server); /* subscribe to the events here. Use the same session if the session is not expired. */ rv = create_event_session(oa); if (rv != SOAP_OK) { err("Subscribe for events failed OA %s", oa->server); } gettimeofday(&time1, NULL); /* Check whether the plugin is initialized. * If not, wait till plugin gets initialized */ while (is_plugin_initialized == SAHPI_FALSE) { OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, NULL, NULL, NULL); wrap_g_mutex_lock(oa_handler->mutex); if (oa_handler->status == PRE_DISCOVERY || oa_handler->status == DISCOVERY_COMPLETED) { wrap_g_mutex_unlock(oa_handler->mutex); is_plugin_initialized = SAHPI_TRUE; } else { wrap_g_mutex_unlock(oa_handler->mutex); dbg("Waiting for the plugin initialization " "to complete."); sleep(2); } } /* Check whether the discovery is over. * If not, wait till discovery gets completed */ while (is_discovery_completed == SAHPI_FALSE) { OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, NULL, NULL, NULL); wrap_g_mutex_lock(oa_handler->mutex); if (oa_handler->status == DISCOVERY_COMPLETED) { wrap_g_mutex_unlock(oa_handler->mutex); is_discovery_completed = SAHPI_TRUE; } else { wrap_g_mutex_unlock(oa_handler->mutex); dbg("Waiting for the discovery to complete."); sleep(2); } } /* If the OA server is NULL, do not even try to open the connection just get out */ if (!strcmp(oa->server,"")) { err("oa->server is NULL. Exiting the thread"); g_thread_exit((gpointer *)NULL); } /* The following is an workaround for an OA bug, where the IP is returned as 0.0.0.0 Just quit in that case also */ if (!strcmp(oa->server,"0.0.0.0")) { err("OA returned IP is 0.0.0.0."); g_thread_exit((gpointer *)NULL); } /* Check whether OA Status is ABSENT * If yes, wait till the OA status becomes ACTIVE or STANDBY */ wrap_g_mutex_lock(oa->mutex); if (oa->oa_status != OA_ABSENT) { wrap_g_mutex_unlock(oa->mutex); } else { wrap_g_mutex_unlock(oa->mutex); process_oa_out_of_access(handler, oa); } /* Get the user_name and password from config file */ user_name = (char *) g_hash_table_lookup(handler->config, "OA_User_Name"); password = (char *) g_hash_table_lookup(handler->config, "OA_Password"); /* Check whether the OA is accessible or not * If the OA is not accessible or OA is not present, * then SOAP_CON will be NULL, try to create the OA connection */ if (oa->event_con == NULL) { /* This call will not return until the OA connection is * established */ create_oa_connection(oa_handler, oa, user_name, password); rv = create_event_session(oa); /* Sleep for a second, let OA stabilize * TODO: Remove this workaround, when OA has the fix */ sleep(1); } /* Ideally, the soap_open should pass in 1st try. * If not, try until soap_open succeeds */ rv = asprintf(&url, "%s" PORT, oa->server); if(rv == -1){ free(url); err("Failed to allocate memory for buffer to \ hold OA credentials"); return (gpointer*) SA_ERR_HPI_OUT_OF_MEMORY; } while (oa->event_con2 == NULL) { OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, NULL, NULL, NULL); oa->event_con2 = soap_open(url, user_name, password, HPI_CALL_TIMEOUT); if (oa->event_con2 == NULL) sleep(2); } free(url); url = NULL; gettimeofday(&time2, NULL); if (time2.tv_sec-time1.tv_sec > SUBSCRIBE_TIMEOUT) { rv = create_event_session(oa); if (rv != SOAP_OK) { err("Subscribe for events failed OA %s", oa->server); } else { warn("Re-discovery took %ld secs.", (time2.tv_sec-time1.tv_sec)); warn("Events might have been lost"); } } /* Intialize the event request structure */ request.pid = oa->event_pid; request.waitTilEventHappens = HPOA_TRUE; request.lcdEvents = HPOA_FALSE; memset(oa_fw_buf,0,SAHPI_MAX_TEXT_BUFFER_LENGTH); snprintf(oa_fw_buf,SAHPI_MAX_TEXT_BUFFER_LENGTH,"%.2f",oa->fm_version); request.oaFwVersion = oa_fw_buf; /* Listen for the events from OA */ while (listen_for_events == SAHPI_TRUE) { request.pid = oa->event_pid; OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, NULL, NULL, NULL); rv = soap_getAllEventsEx(oa->event_con, &request, &response); if (rv == SOAP_OK) { retry_on_switchover = 0; /* OA returns empty event response payload for LCD * status change events. Ignore empty event response. */ if (response.eventInfoArray == NULL) { dbg("Ignoring empty event response"); } else process_oa_events(handler, oa, &response); } else { /* On switchover, the standby-turned-active OA stops * responding to SOAP calls to avoid the network loop. * This change is applicable from OA firmware version * 2.21. Re-try the getAllEvents SOAP XML call skipping * the error handling. */ /* If Enclosure IP Mode is enabled, * then make the Standby thread to sleep */ while (oa_handler->ipswap && (oa->oa_status == STANDBY)) { OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, NULL, NULL, NULL); dbg("Stand By Thread is going to Sleep for" "20 secs as Enclosure IP Mode Is enabled"); oa_soap_sleep_in_loop(oa_handler, 20); } if (oa->oa_status == STANDBY && get_oa_fw_version(handler) >= OA_2_21 && retry_on_switchover < MAX_RETRY_ON_SWITCHOVER) { oa_soap_sleep_in_loop(oa_handler, WAIT_ON_SWITCHOVER); dbg("getAllEventsEx call failed, may be due to " "OA switchover"); dbg("Re-try the getAllEventsEx SOAP call"); retry_on_switchover++; } else { /* Try to recover from the error */ dbg("OA %s may not be accessible", oa->server); oa_soap_error_handling(handler, oa); request.pid = oa->event_pid; /* Re-initialize the con */ if (oa->event_con2 != NULL) { soap_close(oa->event_con2); oa->event_con2 = NULL; } rv = asprintf(&url, "%s" PORT, oa->server); if(rv == -1){ free(url); err("Failed to allocate memory for \ buffer to hold OA credentials"); return (gpointer*) SA_ERR_HPI_OUT_OF_MEMORY; } /* Ideally, the soap_open should pass in * 1st try. If not, try until soap_open succeeds */ while (oa->event_con2 == NULL) { OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, NULL, NULL, NULL); oa->event_con2 = soap_open(url, user_name, password, HPI_CALL_TIMEOUT); if (oa->event_con2 == NULL) { if (oa->oa_status == OA_ABSENT) oa_soap_sleep_in_loop( oa_handler,60); else oa_soap_sleep_in_loop( oa_handler,5); err("soap_open for \ oa->event_con2 failed"); } } free(url); url = NULL; } /* end of else (non-switchover error handling) */ } /* end of else (SOAP call failure handling) */ } /* end of 'while(listen_for_events == SAHPI_TRUE)' loop */ free(url); return (gpointer *) SA_OK; } /** * oa_soap_error_handling * @oa_handler: Pointer to the OA SOAP handler structure * @oa: Pointer to the oa info structure * * Purpose: * Process the OA error and establishes the connection with OA * Calls the re-discovery if the OA status is ACTIVE * * Detailed Description: NA * * Return values: * NONE - void return, as it is comes out only on recovering from the * problem. **/ void oa_soap_error_handling(struct oh_handler_state *oh_handler, struct oa_info *oa) { SaErrorT rv = SA_OK; SaHpiBoolT is_oa_accessible = SAHPI_FALSE; struct oa_soap_handler *oa_handler = NULL; SaHpiInt32T error_code; char *user_name = NULL, *password = NULL; struct OaId oaId; SaHpiResourceIdT resource_id; struct timeval time1 = {0}, time2 = {0}; if (oh_handler == NULL || oa == NULL) { err("Invalid parameters"); return; } oa_handler = (struct oa_soap_handler *) oh_handler->data; rv = check_oa_status(oa_handler, oa, oa->event_con); /* If the OA is not PRESENT, then do not even try. Just get out */ if ( oa->oa_status == OA_ABSENT ) return; /* Check whether OA was present. If not, event_con will be NULL */ wrap_g_mutex_lock(oa->mutex); if (oa->event_con == NULL) { wrap_g_mutex_unlock(oa->mutex); /* Get the user_name and password from config file */ user_name = (char *) g_hash_table_lookup(oh_handler->config, "OA_User_Name"); password = (char *) g_hash_table_lookup(oh_handler->config, "OA_Password"); /* Create the OA connection */ create_oa_connection(oa_handler, oa, user_name, password); /* OA session is established. Set the error_code to SOAP_OK * to skip the processing for OA out of access */ error_code = SOAP_OK; } else { error_code = soap_error_number(oa->event_con); wrap_g_mutex_unlock(oa->mutex); } /* This loop ends when the OA is accessible */ while (is_oa_accessible == SAHPI_FALSE) { OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, NULL, NULL, NULL); /* Check whether the failure is not due to OA event session * expiry */ if (error_code != SOAP_OK || error_code != ERR_EVENT_PIPE || error_code != ERR_EVENT_DAEMON_KILLED) { /* OA may not be reachable, try to establish the * connection */ process_oa_out_of_access(oh_handler, oa); } rv = create_event_session(oa); if (rv != SA_OK) { /* Set the error code to -1 to make sure * recovery for OA out of access is recovery is done */ error_code = -1; continue; } else gettimeofday(&time1, NULL); /* Sleep for a second, let OA stabilize * TODO: Remove this workaround, when OA has the fix */ sleep(1); is_oa_accessible = SAHPI_TRUE; if (oa->oa_status == ACTIVE) { /* Always lock the oa_handler mutex and then oa_info * mutex. This is to avoid the deadlock. */ wrap_g_mutex_lock(oa_handler->mutex); wrap_g_mutex_lock(oa->mutex); /* Re-discover the resources as there is a high chances * that we might have missed some events */ OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, oa_handler->mutex, oa->mutex, NULL); rv = oa_soap_re_discover_resources(oh_handler, oa); wrap_g_mutex_unlock(oa->mutex); wrap_g_mutex_unlock(oa_handler->mutex); if (rv != SA_OK) { is_oa_accessible = SAHPI_FALSE; err("Re-discovery failed for OA %s", oa->server); /* Set the error code to -1 to make sure * recovery for OA out of access is recovery * is done */ error_code = -1; } } /* Create a fresh event session, PID expires in 5 mins. */ gettimeofday(&time2, NULL); if (time2.tv_sec-time1.tv_sec > SUBSCRIBE_TIMEOUT) { rv = create_event_session(oa); if (rv != SA_OK) { /* Set the error code to -1 to make sure * recovery for OA out of access is done */ err("create_event_session failed"); error_code = -1; continue; } else { err("Re-discovery took %ld secs.", (time2.tv_sec-time1.tv_sec)); err("Events might have been lost"); } } } err("OA %s is accessible", oa->server); /* Push the OA Link Status event*/ rv = soap_getOaId(oa->event_con, &oaId); if(rv == SA_OK) { resource_id = oa_handler->oa_soap_resources.oa. resource_id[oaId.bayNumber - 1]; /* Process the OA link status sensor */ OA_SOAP_PROCESS_SENSOR_EVENT( OA_SOAP_SEN_OA_LINK_STATUS, 1, 0, 0) } return; } /** * process_oa_out_of_access * @oa_handler: Pointer to the OA SOAP handler structure * @oa: Pointer to the oa info structure * * Purpose: * Try to establish the connection with OA * * Detailed Description: NA * * Return values: * NONE - void return, as this function only on OA is reachable **/ void process_oa_out_of_access(struct oh_handler_state *oh_handler, struct oa_info *oa) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler = NULL; GTimer *timer = NULL; gulong micro_seconds; gdouble time_elapsed = 0.0, timeout = 2.0; SaHpiBoolT is_oa_reachable = SAHPI_FALSE; SaHpiBoolT is_oa_present = SAHPI_FALSE; SaHpiBoolT oa_was_removed = SAHPI_FALSE; char *user_name = NULL, *password = NULL; if (oh_handler == NULL || oa == NULL) { err("Invalid parameters"); return; } /* Get the user_name and password from config file */ user_name = (char *) g_hash_table_lookup(oh_handler->config, "OA_User_Name"); password = (char *) g_hash_table_lookup(oh_handler->config, "OA_Password"); oa_handler = (struct oa_soap_handler *) oh_handler->data; /* Start a timer */ timer = g_timer_new(); /* This loop ends after OA is accessible */ while (is_oa_reachable == SAHPI_FALSE) { OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, NULL, NULL, timer); /* Check whether the OA is present. * If not, wait till the OA is inserted */ is_oa_present = SAHPI_FALSE; while (is_oa_present == SAHPI_FALSE) { OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, NULL, NULL, timer); wrap_g_mutex_lock(oa->mutex); if (oa->oa_status != OA_ABSENT) { wrap_g_mutex_unlock(oa->mutex); is_oa_present = SAHPI_TRUE; time_elapsed = 0.0; } else { wrap_g_mutex_unlock(oa->mutex); time_elapsed = g_timer_elapsed(timer, µ_seconds); /* Break the loop on reaching timeout value */ if (time_elapsed >= timeout) break; oa_was_removed = SAHPI_TRUE; /* OA is not present, * wait for 30 seconds and check again */ oa_soap_sleep_in_loop(oa_handler, 30); } } /* The re-establishing oa connection on timeout for the extracted * OA is done for handling the below scenario * * Say, Active OA is in slot 1 and standby OA is in slot 2. * 1. Remove the active OA (slot 1) which results in * switchover. OA in slot status is set to ABSENT. * 2. After sometime (atleast 10 mins) current Active OA (slot 2) * is extracted. At this stage, there is no OA in the * c-Class enclosure. * 3. OA in slot 1 is inserted back. * This leads to a hang situation as the event thread for slot 1 * is not aware of the OA insertion. * * But, if the OA in slot 1 is put into a different enclosure * (with the same IP, user name and password) * then OA SOAP plugin becomes unstable and may lead to crash. */ if (time_elapsed >= timeout) { if (oa->event_con == NULL) { rv = initialize_oa_con(oa, user_name, password); if (rv != SA_OK) { /* OA is not accessible. * Restart the timer */ g_timer_start(timer); /* Double the timeout value until it * reaches MAX_TIMEOUT */ if (timeout < MAX_TIMEOUT) { timeout = timeout * 2; if (timeout > MAX_TIMEOUT) timeout = MAX_TIMEOUT; } continue; } } /* Since the OA connection is re-establised, change the * state of oa_was_removed to false */ oa_was_removed = SAHPI_FALSE; } /* Check whether OA got removed and inserted back. * If yes, re-initialize the soap_con structures. * This creates soap_con structure with the * inserted OA IP address */ if (oa_was_removed == SAHPI_TRUE) { /* Cleanup the timer */ g_timer_destroy(timer); /* Create the OA connection */ create_oa_connection(oa_handler, oa, user_name, password); /* OA connection is established. Hence break the loop * and return to the calling function */ return; } else { rv = check_oa_status(oa_handler, oa, oa->event_con); if (rv == SA_OK) { is_oa_reachable = SAHPI_TRUE; } else { /* If switchover is in progress, then sleep */ /* longer */ if ((oa_handler->oa_switching == SAHPI_TRUE) || (oa->oa_status == OA_ABSENT)) oa_soap_sleep_in_loop(oa_handler, 30); else sleep(2); dbg("check_oa_status failed, oa_status is %d\n", oa->oa_status); /* OA is not accessible. Restart the timer */ g_timer_start(timer); /* Double the timeout value until it reaches * MAX_TIMEOUT */ if (time_elapsed >= timeout && timeout < MAX_TIMEOUT) { timeout = timeout * 2; if (timeout > MAX_TIMEOUT) timeout = MAX_TIMEOUT; } } } } /* Cleanup the timer */ g_timer_destroy(timer); return; } /** * process_oa_events * @oh_handler: Pointer to the openhpi handler structure * @oa: Pointer to the oa_info structure * @con: Pointer to the SOAP_CON structure * @response: Pointer to the oa event response * * Purpose: * Process the oa event and creates the hpi event structure. * * Detailed Description: NA * * Return values: * NONE - void return, as this function processes the events **/ void process_oa_events(struct oh_handler_state *oh_handler, struct oa_info *oa, struct getAllEventsResponse *response) { SaHpiInt32T loc=0; struct eventInfo event; struct oa_soap_handler *oa_handler = NULL; if (response == NULL || oa == NULL || oh_handler == NULL) { err("Invalid parameter"); return; } oa_handler = (struct oa_soap_handler *) oh_handler->data; /* Extract the events from eventInfoArray */ while (response->eventInfoArray) { OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, NULL, NULL, NULL); /* Get the event from eventInfoArray */ soap_getEventInfo(response->eventInfoArray, &event); dbg("\nThread id=%p event %d received\n", g_thread_self(), event.event); switch (event.event) { case EVENT_HEARTBEAT: dbg("HEART BEAT EVENT"); break; case EVENT_ENC_STATUS: dbg("EVENT_ENC_STATUS"); oa_soap_proc_enc_status(oh_handler, &(event.eventData.enclosureStatus)); break; case EVENT_ENC_UID: dbg("EVENT_ENC_UID -- Not processed"); break; case EVENT_ENC_SHUTDOWN: dbg("EVENT_ENC_SHUTDOWN"); oa_soap_proc_enc_status(oh_handler, &(event.eventData.enclosureStatus)); break; case EVENT_ENC_INFO: dbg("EVENT_ENC_INFO -- Not processed"); break; case EVENT_ENC_NAMES: dbg("EVENT_ENC_NAMES -- Not processed"); break; case EVENT_USER_PERMISSION: dbg("EVENT_USER_PERMISSION -- Not processed"); break; case EVENT_ADMIN_RIGHTS_CHANGED: dbg("EVENT_ADMIN_RIGHTS_CHANGED " "-- Not processed"); break; case EVENT_ENC_SHUTDOWN_PENDING: dbg("EVENT_ENC_SHUTDOWN_PENDING"); oa_soap_proc_enc_status(oh_handler, &(event.eventData.enclosureStatus)); break; case EVENT_ENC_TOPOLOGY: dbg("EVENT_ENC_TOPOLOGY -- Not processed"); break; case EVENT_FAN_STATUS: dbg("EVENT_FAN_STATUS"); oa_soap_proc_fan_status(oh_handler, &(event.eventData.fanInfo)); break; case EVENT_FAN_INSERTED: dbg("EVENT_FAN_INSERTED"); process_fan_insertion_event(oh_handler, oa->event_con2, &event); break; case EVENT_FAN_REMOVED: dbg("EVENT_FAN_REMOVED"); process_fan_extraction_event(oh_handler, &event); break; case EVENT_FAN_GROUP_STATUS: dbg("EVENT_FAN_GROUP_STATUS -- Not processed"); break; case EVENT_THERMAL_STATUS: dbg("EVENT_THERMAL_STATUS"); oa_soap_proc_enc_thermal(oh_handler, oa->event_con2, &(event.eventData.thermalInfo)); break; case EVENT_COOLING_STATUS: dbg("EVENT_COOLING_STATUS"); oa_soap_proc_therm_subsys_info(oh_handler, &(event.eventData.thermalSubsystemInfo)); break; case EVENT_FAN_ZONE_STATUS: dbg("EVENT_FAN_ZONE_STATUS"); oa_soap_proc_fz_status(oh_handler, &(event.eventData.fanZone)); break; case EVENT_PS_STATUS: dbg("EVENT_PS_STATUS"); oa_soap_proc_ps_status(oh_handler, &(event.eventData.powerSupplyStatus)); break; case EVENT_PS_INSERTED: dbg("EVENT_PS_INSERTED"); process_ps_insertion_event(oh_handler, oa->event_con2, &event); break; case EVENT_PS_REMOVED: dbg("EVENT_PS_REMOVED"); process_ps_extraction_event(oh_handler, &event); break; case EVENT_PS_REDUNDANT: dbg("EVENT_PS_REDUNDANT"); oa_soap_proc_ps_subsys_info(oh_handler, &(event.eventData.powerSubsystemInfo)); break; case EVENT_PS_OVERLOAD: dbg("EVENT_PS_OVERLOAD"); oa_soap_proc_ps_subsys_info(oh_handler, &(event.eventData.powerSubsystemInfo)); break; case EVENT_AC_FAILURE: dbg("EVENT_AC_FAILURE -- Not processed"); break; case EVENT_PS_INFO: dbg("EVENT_PS_INFO"); oa_soap_proc_ps_info(oh_handler, oa->event_con2, &event); break; case EVENT_PS_SUBSYSTEM_STATUS: dbg("EVENT_PS_SUBSYSTEM_STATUS"); oa_soap_proc_ps_subsys_info(oh_handler, &(event.eventData.powerSubsystemInfo)); break; case EVENT_SERVER_POWER_REDUCTION_STATUS: dbg("EVENT_SERVER_POWER_REDUCTION_STATUS " "-- Not processed"); break; case EVENT_INTERCONNECT_STATUS: dbg("EVENT_INTERCONNECT_STATUS"); oa_soap_proc_interconnect_status(oh_handler, &(event.eventData.interconnectTrayStatus)); break; case EVENT_INTERCONNECT_RESET: dbg("EVENT_INTERCONNECT_RESET"); process_interconnect_reset_event( oh_handler, &event); break; case EVENT_INTERCONNECT_UID: dbg("EVENT_INTERCONNECT_UID -- Not processed"); break; case EVENT_INTERCONNECT_INSERTED: dbg("EVENT_INTERCONNECT_INSERTED"); process_interconnect_insertion_event( oh_handler, oa->event_con2, &event); break; case EVENT_INTERCONNECT_REMOVED: dbg("EVENT_INTERCONNECT_REMOVED"); process_interconnect_extraction_event( oh_handler, &event); break; case EVENT_INTERCONNECT_INFO: dbg("EVENT_INTERCONNECT_INFO"); process_interconnect_info_event( oh_handler, oa->event_con2, &event); break; case EVENT_INTERCONNECT_HEALTH_LED: dbg("EVENT_INTERCONNECT_HEALTH_LED " "-- Not processed"); break; case EVENT_INTERCONNECT_THERMAL: dbg("EVENT_INTERCONNECT_THERMAL"); oa_soap_proc_interconnect_thermal(oh_handler, oa->event_con2, &(event.eventData. interconnectTrayStatus)); break; case EVENT_INTERCONNECT_CPUFAULT: dbg("EVENT_INTERCONNECT_CPUFAULT " "-- Not processed"); break; case EVENT_INTERCONNECT_POWER: dbg("EVENT_INTERCONNECT_POWER"); process_interconnect_power_event( oh_handler, &event); break; case EVENT_INTERCONNECT_PORTMAP: dbg("EVENT_INTERCONNECT_PORTMAP " "-- Not processed"); break; case EVENT_BLADE_PORTMAP: dbg("EVENT_BLADE_PORTMAP -- Not processed"); break; case EVENT_INTERCONNECT_VENDOR_BLOCK: dbg("EVENT_INTERCONNECT_VENDOR_BLOCK " "-- Not processed"); break; case EVENT_INTERCONNECT_HEALTH_STATE: dbg("EVENT_INTERCONNECT_HEALTH_STATE"); oa_soap_proc_interconnect_status(oh_handler, &(event.eventData.interconnectTrayStatus)); break; case EVENT_DEMO_MODE: dbg("EVENT_DEMO_MODE -- Not processed"); break; case EVENT_BLADE_STATUS: dbg("EVENT_BLADE_STATUS"); oa_soap_proc_server_status(oh_handler, oa->event_con2, &(event.eventData.bladeStatus)); break; case EVENT_BLADE_INSERTED: dbg("EVENT_BLADE_INSERTED"); oa_soap_proc_server_inserted_event(oh_handler, oa->event_con2, &event); break; case EVENT_BLADE_REMOVED: dbg("EVENT_BLADE_REMOVED"); process_server_extraction_event(oh_handler, &event); break; case EVENT_BLADE_POWER_STATE: dbg("EVENT_BLADE_POWER_STATE"); process_server_power_event(oh_handler, oa->event_con2, &event); break; case EVENT_BLADE_POWER_MGMT: dbg("EVENT_BLADE_POWER_MGMT -- Not processed"); break; case EVENT_BLADE_UID: dbg("EVENT_BLADE_UID -- Not processed"); break; case EVENT_BLADE_SHUTDOWN: dbg("EVENT_BLADE_SHUTDOWN"); oa_soap_proc_server_status(oh_handler, oa->event_con2, &(event.eventData.bladeStatus)); break; case EVENT_BLADE_FAULT: dbg("EVENT_BLADE_FAULT"); oa_soap_proc_server_status(oh_handler, oa->event_con2, &(event.eventData.bladeStatus)); break; case EVENT_BLADE_THERMAL: dbg("EVENT_BLADE_THERMAL"); oa_soap_proc_server_thermal(oh_handler, oa->event_con2, &(event.eventData.bladeStatus)); break; case EVENT_BLADE_INFO: dbg("EVENT_BLADE_INFO"); process_server_info_event(oh_handler, oa->event_con2, &event); break; case EVENT_BLADE_MP_INFO: dbg("EVENT_BLADE_MP_INFO"); process_server_mp_info_event(oh_handler, oa->event_con2, &event); break; case EVENT_ILO_READY: dbg("EVENT_ILO_READY -- Not processed"); break; case EVENT_LCD_BUTTON: dbg("EVENT_LCD_BUTTON -- Not processed"); break; case EVENT_KEYING_ERROR: dbg("EVENT_KEYING_ERROR -- Not processed"); break; case EVENT_ILO_HAS_IPADDRESS: dbg("EVENT_ILO_HAS_IPADDRESS -- Not processed"); break; case EVENT_POWER_INFO: dbg("EVENT_POWER_INFO -- Not processed"); break; case EVENT_LCD_STATUS: dbg("EVENT_LCD_STATUS"); oa_soap_proc_lcd_status(oh_handler, &(event.eventData.lcdStatus)); break; case EVENT_LCD_INFO: dbg("EVENT_LCD_INFO -- Not processed"); break; case EVENT_REDUNDANCY: dbg("EVENT_REDUNDANCY -- Not processed"); break; case EVENT_ILO_DEAD: dbg("EVENT_ILO_DEAD"); oa_soap_proc_server_status(oh_handler, oa->event_con2, &(event.eventData.bladeStatus)); break; case EVENT_RACK_SERVICE_STARTED: dbg("EVENT_RACK_SERVICE_STARTED " "-- Not processed"); break; case EVENT_LCD_SCREEN_REFRESH: dbg("EVENT_LCD_SCREEN_REFRESH " "-- Not processed"); break; case EVENT_ILO_ALIVE: dbg("EVENT_ILO_ALIVE"); oa_soap_proc_server_status(oh_handler, oa->event_con2, &(event.eventData.bladeStatus)); break; case EVENT_PERSONALITY_CHECK: dbg("EVENT_PERSONALITY_CHECK -- Not processed"); break; case EVENT_BLADE_POST_COMPLETE: dbg("EVENT_BLADE_POST_COMPLETE"); oa_soap_serv_post_comp(oh_handler, oa->event_con2, event.numValue); break; case EVENT_BLADE_SIGNATURE_CHANGED: dbg("EVENT_BLADE_SIGNATURE_CHANGED " "-- Not processed"); break; case EVENT_BLADE_PERSONALITY_CHANGED: dbg("EVENT_BLADE_PERSONALITY_CHANGED " "-- Not processed"); break; case EVENT_BLADE_TOO_LOW_POWER: dbg("EVENT_BLADE_TOO_LOW_POWER " "-- Not processed"); break; case EVENT_VIRTUAL_MEDIA_STATUS: dbg("EVENT_VIRTUAL_MEDIA_STATUS " "-- Not processed"); break; case EVENT_MEDIA_DRIVE_INSERTED: dbg("EVENT_MEDIA_DRIVE_INSERTED " "-- Not processed"); break; case EVENT_MEDIA_DRIVE_REMOVED: dbg("EVENT_MEDIA_DRIVE_REMOVED " "-- Not processed"); break; case EVENT_MEDIA_INSERTED: /* EVENT_OA_INFO that arrives later is */ /* processed */ dbg("EVENT_MEDIA_INSERTED -- Not processed"); break; case EVENT_MEDIA_REMOVED: dbg("EVENT_MEDIA_REMOVED -- Not processed"); break; case EVENT_OA_NAMES: dbg("EVENT_OA_NAMES -- Not processed"); break; case EVENT_OA_STATUS: dbg("EVENT_OA_STATUS"); oa_soap_proc_oa_status(oh_handler, &(event.eventData.oaStatus)); break; case EVENT_OA_UID: dbg("EVENT_OA_UID -- Not processed"); break; case EVENT_OA_INSERTED: dbg("EVENT_OA_INSERTED"); oa_soap_proc_oa_inserted(oh_handler, &event); break; case EVENT_OA_REMOVED: dbg("EVENT_OA_REMOVED"); process_oa_extraction_event(oh_handler, &event); break; case EVENT_OA_INFO: dbg("EVENT_OA_INFO"); process_oa_info_event(oh_handler, oa->event_con2, &event); break; case EVENT_OA_FAILOVER: dbg("EVENT_OA_FAILOVER"); process_oa_failover_event(oh_handler, oa); /* We have done the re-discovery as part of * FAILOVER event processing. Ignore the * events that are recived along with FAILOVER. */ return; break; case EVENT_OA_TRANSITION_COMPLETE: dbg("EVENT_OA_TRANSITION_COMPLETE " "-- Not processed"); break; case EVENT_OA_VCM: dbg("EVENT_OA_VCM -- Not processed"); break; case EVENT_NETWORK_INFO_CHANGED: dbg("EVENT_NETWORK_INFO_CHANGED"); oa_soap_proc_enc_network_info_changed(oh_handler, &(event.eventData.enclosureNetworkInfo)); break; case EVENT_SNMP_INFO_CHANGED: dbg("EVENT_SNMP_INFO_CHANGED -- Not processed"); break; case EVENT_SYSLOG_CLEARED: dbg("EVENT_SYSLOG_CLEARED -- Not processed"); break; case EVENT_SESSION_CLEARED: dbg("EVENT_SESSION_CLEARED -- Not processed"); break; case EVENT_TIME_CHANGE: dbg("EVENT_TIME_CHANGE -- Not processed"); break; case EVENT_SESSION_STARTED: dbg("EVENT_SESSION_STARTED -- Not processed"); break; case EVENT_BLADE_CONNECT: dbg("EVENT_BLADE_CONNECT -- Not processed"); break; case EVENT_BLADE_DISCONNECT: dbg("EVENT_BLADE_DISCONNECT -- Not processed"); break; case EVENT_SWITCH_CONNECT: dbg("EVENT_SWITCH_CONNECT -- Not processed"); break; case EVENT_SWITCH_DISCONNECT: dbg("EVENT_SWITCH_DISCONNECT -- Not processed"); break; case EVENT_BLADE_CLEARED: dbg("EVENT_BLADE_CLEARED -- Not processed"); break; case EVENT_SWITCH_CLEARED: dbg("EVENT_SWITCH_CLEARED -- Not processed"); break; case EVENT_ALERTMAIL_INFO_CHANGED: dbg("EVENT_ALERTMAIL_INFO_CHANGED " "-- Not processed"); break; case EVENT_LDAP_INFO_CHANGED: dbg("EVENT_LDAP_INFO_CHANGED -- Not processed"); break; case EVENT_EBIPA_INFO_CHANGED: dbg("EVENT_EBIPA_INFO_CHANGED " "-- Not processed"); break; case EVENT_HPSIM_TRUST_MODE_CHANGED: dbg("EVENT_HPSIM_TRUST_MODE_CHANGED " "-- Not processed"); break; case EVENT_HPSIM_CERTIFICATE_ADDED: dbg("EVENT_HPSIM_CERTIFICATE_ADDED " "-- Not processed"); break; case EVENT_HPSIM_CERTIFICATE_REMOVED: dbg("EVENT_HPSIM_CERTIFICATE_REMOVED " "-- Not processed"); break; case EVENT_USER_INFO_CHANGED: dbg("EVENT_USER_INFO_CHANGED -- Not processed"); break; case EVENT_BAY_CHANGED: dbg("EVENT_BAY_CHANGED -- Not processed"); break; case EVENT_GROUP_CHANGED: dbg("EVENT_GROUP_CHANGED -- Not processed"); break; case EVENT_OA_REBOOT: dbg("EVENT_OA_REBOOT"); process_oa_reboot_event(oh_handler, oa); response->eventInfoArray = NULL; break; case EVENT_OA_LOGOFF_REQUEST: dbg("EVENT_OA_LOGOFF_REQUEST -- Not processed"); break; case EVENT_USER_ADDED: dbg("EVENT_USER_ADDED -- Not processed"); break; case EVENT_USER_DELETED: dbg("EVENT_USER_DELETED -- Not processed"); break; case EVENT_USER_ENABLED: dbg("EVENT_USER_ENABLED -- Not processed"); break; case EVENT_USER_DISABLED: dbg("EVENT_USER_DISABLED -- Not processed"); break; case EVENT_GROUP_ADDED: dbg("EVENT_GROUP_ADDED -- Not processed"); break; case EVENT_GROUP_DELETED: dbg("EVENT_GROUP_DELETED -- Not processed"); break; case EVENT_LDAPGROUP_ADDED: dbg("EVENT_LDAPGROUP_ADDED -- Not processed"); break; case EVENT_LDAPGROUP_DELETED: dbg("EVENT_LDAPGROUP_DELETED -- Not processed"); break; case EVENT_LDAPGROUP_ADMIN_RIGHTS_CHANGED: dbg("EVENT_LDAPGROUP_ADMIN_RIGHTS_CHANGED " "-- Not processed"); break; case EVENT_LDAPGROUP_INFO_CHANGED: dbg("EVENT_LDAPGROUP_INFO_CHANGED " "-- Not processed"); break; case EVENT_LDAPGROUP_PERMISSION: dbg("EVENT_LDAPGROUP_PERMISSION " "-- Not processed"); break; case EVENT_LCDPIN: dbg("EVENT_LCDPIN -- Not processed"); break; case EVENT_LCD_USER_NOTES_CHANGED: dbg("EVENT_LCD_USER_NOTES_CHANGED " "-- Not processed"); break; case EVENT_LCD_BUTTONS_LOCKED: dbg("EVENT_LCD_BUTTONS_LOCKED " "-- Not processed"); break; case EVENT_LCD_SCREEN_CHAT_REQUESTED: dbg("EVENT_LCD_SCREEN_CHAT_REQUESTED " "-- Not processed"); break; case EVENT_LCD_SCREEN_CHAT_WITHDRAWN: dbg("EVENT_LCD_SCREEN_CHAT_WITHDRAWN " "-- Not processed"); break; case EVENT_LCD_SCREEN_CHAT_ANSWERED: dbg("EVENT_LCD_SCREEN_CHAT_ANSWERED " "-- Not processed"); break; case EVENT_LCD_USER_NOTES_IMAGE_CHANGED: dbg("EVENT_LCD_USER_NOTES_IMAGE_CHANGED " "-- Not processed"); break; case EVENT_ENC_WIZARD_STATUS: dbg("EVENT_ENC_WIZARD_STATUS -- Not processed"); break; case EVENT_ENC_GRP_CAP: dbg("EVENT_ENC_GRP_CAP -- Not processed"); break; case EVENT_SSHKEYS_INSTALLED: dbg("EVENT_SSHKEYS_INSTALLED -- Not processed"); break; case EVENT_SSHKEYS_CLEARED: dbg("EVENT_SSHKEYS_CLEARED -- Not processed"); break; case EVENT_LDAP_DIRECTORY_SERVER_CERTIFICATE_ADDED: dbg("EVENT_LDAP_DIRECTORY_SERVER_CERTIFICATE_" "ADDED -- Not processed"); break; case EVENT_LDAP_DIRECTORY_SERVER_CERTIFICATE_REMOVED: dbg("EVENT_LDAP_DIRECTORY_SERVER_CERTIFICATE_" "REMOVED -- Not processed"); break; case EVENT_BLADE_BOOT_CONFIG: dbg("EVENT_BLADE_BOOT_CONFIG -- Not processed"); break; case EVENT_OA_NETWORK_CONFIG_CHANGED: dbg("EVENT_OA_NETWORK_CONFIG_CHANGED"); oa_soap_proc_oa_network_info(oh_handler, &(event.eventData.oaNetworkInfo)); break; case EVENT_HPSIM_XENAME_ADDED: dbg("EVENT_HPSIM_XENAME_ADDED " "-- Not processed"); break; case EVENT_HPSIM_XENAME_REMOVED: dbg("EVENT_HPSIM_XENAME_REMOVED " "-- Not processed"); break; case EVENT_FLASH_PENDING: dbg("EVENT_FLASH_PENDING -- Not processed"); break; case EVENT_FLASH_STARTED: dbg("EVENT_FLASH_STARTED -- Not processed"); break; case EVENT_FLASH_PROGRESS: dbg("EVENT_FLASH_PROGRESS -- Not processed"); break; case EVENT_FLASH_COMPLETE: dbg("EVENT_FLASH_COMPLETE -- Not processed"); break; case EVENT_STANDBY_FLASH_STARTED: dbg("EVENT_STANDBY_FLASH_STARTED " "-- Not processed"); break; case EVENT_STANDBY_FLASH_PROGRESS: dbg("EVENT_STANDBY_FLASH_PROGRESS " "-- Not processed"); break; case EVENT_STANDBY_FLASH_COMPLETE: dbg("EVENT_STANDBY_FLASH_COMPLETE " "-- Not processed"); break; case EVENT_STANDBY_FLASH_BOOTING: dbg("EVENT_STANDBY_FLASH_BOOTING " "-- Not processed"); break; case EVENT_STANDBY_FLASH_BOOTED: dbg("EVENT_STANDBY_FLASH_BOOTED " "-- Not processed"); break; case EVENT_STANDBY_FLASH_FAILED: dbg("EVENT_STANDBY_FLASH_FAILED " "-- Not processed"); break; case EVENT_FLASHSYNC_BUILD: dbg("EVENT_FLASHSYNC_BUILD -- Not processed"); break; case EVENT_FLASHSYNC_BUILDDONE: dbg("EVENT_FLASHSYNC_BUILDDONE " "-- Not processed"); break; case EVENT_FLASHSYNC_FAILED: dbg("EVENT_FLASHSYNC_FAILED -- Not processed"); break; case EVENT_FLASHSYNC_STANDBY_BUILD: dbg("EVENT_FLASHSYNC_STANDBY_BUILD " "-- Not processed"); break; case EVENT_FLASHSYNC_STANDBY_BUILDDONE: dbg("EVENT_FLASHSYNC_STANDBY_BUILDDONE " "-- Not processed"); break; case EVENT_FLASHSYNC_STANDBY_FAILED: dbg("EVENT_FLASHSYNC_STANDBY_FAILED " "-- Not processed"); break; case EVENT_NONILO_EBIPA: dbg("EVENT_NONILO_EBIPA -- Not processed"); break; case EVENT_FACTORY_RESET: dbg("EVENT_FACTORY_RESET -- Not processed"); break; case EVENT_BLADE_INSERT_COMPLETED: dbg("EVENT_BLADE_INSERT_COMPLETED"); process_server_insert_completed(oh_handler, oa->event_con2, &event, loc); break; case EVENT_EBIPA_INFO_CHANGED_EX: dbg("EVENT_EBIPA_INFO_CHANGED_EX " "-- Not processed"); break; case EVENT_BLADE_FQDN_INFO_REFRESH: dbg("EVENT_BLADE_FQDN_INFO_REFRESH" " -- Not processed"); break; case EVENT_TRAY_FQDN_INFO_REFRESH: dbg("EVENT_TRAY_FQDN_INFO_REFRESH" " -- Not processed"); break; case EVENT_VCM_FQDN_INFO_REFRESH: dbg("EVENT_VCM_FQDN_INFO_REFRESH" " -- Not processed"); break; case EVENT_EBIPAV6_INFO_CHANGED_EX: dbg("EVENT_EBIPAV6_INFO_CHANGED_EX" " -- Not processed"); break; default: dbg("EVENT NOT REGISTERED, Event id %d", event.event); } /* Get the next event from the eventInfoArray */ response->eventInfoArray = soap_next_node(response->eventInfoArray); } return; } void * oh_get_event (void *) __attribute__ ((weak, alias("oa_soap_get_event"))); openhpi-3.6.1/plugins/oa_soap/oa_soap_discover.c0000644000175100017510000075565112575647270021002 0ustar mohanmohan/* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. * Vivek Kumar * Raghavendra M.S. * Shuah Khan * * This file implements the discovery functionality. The resources of the * HP BladeSystem c-Class are discovered. * * oa_soap_discover_resources() - Checks the plugin initialization * completion. Starts the event threads * for active and standby OAs. Starts * the discovery. * * discover_oa_soap_system() - Discovers all the resources in HP * BladeSystem c-Class * * build_enclosure_info() - Discovers the max bays for all the * resources in enclosure * * build_enclosure_rpt() - Builds the enclosure RPT entry * * build_enclosure_rdr() - Builds the enclosure RDRs * * discover_enclosure() - Discovers the enclosure along with * its capabilities * * build_server_rpt() - Builds the server RPT entry * * build_discovered_server_rpt() - Builds the server RPT entry * * build_inserted_server_rdr() - Builds the server RDRs * * build_discovered_server_rdr_arr() - Builds the server RDRs using array * info, status and pm information * * discover_server() - Discovers the server, IO, and * storage blades, and their * capabilities * * build_inserted_intr_rpt() - Builds the interconnect RPT entry * * build_discovered_intr_rpt() - Builds the discovered interconnect * RPT using supplied info without * a call to OA * * build_discovered_intr_rdr_arr() - Populate the interconnect RDR and * push it to the RPT * * build_inserted_interconnect_rdr() - Builds the interconnect RDRs * * discover_interconnect() - Discovers the interconnect blades * along with their capabilities * * oa_soap_discover_fan_rpt() - Builds the fan RPT entry * * oa_soap_discover_fan_rdr() - Builds the fan RDRs * * oa_soap_discover_fan() - Discovers the fan along with * its capabilities * * discover_power_subsystem_rpt() - Builds the power subsystem RPT entry * * discover_power_subsystem_rdr() - Builds the power subsystem RDRs * * discover_power_subsystem() - Discovers the power subsystem * along with its capabilities * * build_power_supply_rpt() - Builds the power supplies RPT entry * * build_power_supply_rdr() - Builds the power supplies RDRs * * build_discovered_ps_rdr_arr() - Create a PS RDR using supplied info * status structures,without call to oa * * discover_power_supply() - Discovers the power supplies * along with its capabilities * * discover_oa_rpt() - Builds the onboard administrator * RPT entry * * discover_oa_rdr() - Builds the onboard administrator RDRs * * discover_oa() - Discovers the onboard administrator * along with its capabilities * * oa_soap_parse_diag_ex() - Parses the diagnosticChecksEx * structure * * oa_soap_get_health_val() - Gets the healthStatus value from * extraData structure * * oa_soap_build_rpt() - Generic function to build the RPT * entry * * oa_soap_build_therm_subsys_rdr()- Builds the thermal subsystem RDR * * oa_soap_disc_therm_subsys() - Discovers the thermal subsystem * * oa_soap_build_fz_rdr() - Builds the fan zone RDR * * oa_soap_get_fz_arr() - Gets the fan zone array information * from OA * * oa_soap_disc_fz() - Discovers the fan zones * * oa_soap_build_lcd_rdr() - Builds the LCD RDR * * oa_soap_disc_lcd() - Discovers the LCD * * oa_soap_populate_event() - Populates the event structure with * default values * * oa_soap_push_disc_res() - Pushes the discovered resources * information to openhpi framework * * oa_soap_build_blade_thermal_rdr() - Builds or Enables the thermal * sensors of blade resource * * oa_soap_modify_blade_thermal_rdr- Modify thermal sensors of blade * in RPT, called by events file * oa_soap_get_ps_info_arr - Get PS info without a call to OA * * oa_soap_get_ps_sts_arr - Get PS status without a call to oa * * oa_soap_get_fan_info_arr - Get the fan info array information * * oa_soap_get_bladeinfo_arr - Get the blade infor array information * * oa_soap_get_interconct_trayinfo_arr - Get interconnect tray info array * information from oa * * oa_soap_get_interconct_traysts_arr - Get interconnect tray status * arry information from oa * * oa_soap_get_interconct_traypm_arr - Get the interconnect tray portmap * arry information from oa * * oa_soap_get_oa_info_arr - Get OA info array information from * oa * * oa_soap_get_oa_sts_arr - Get OA status array information from * oa * * oa_soap_get_bladests_arr - Get blade status array information * from oa * * oa_soap_get_portmap_arr - Get blade portmap array information * from oa * */ #include "oa_soap_discover.h" #include "oa_soap_calls.h" #include "sahpi_wrappers.h" /* Forward declaration for static functions */ static SaErrorT oa_soap_build_enc_info(struct oh_handler_state *oh_handler, struct enclosureInfo *info); static SaErrorT oa_soap_build_therm_subsys_rdr(struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id); static SaErrorT oa_soap_build_fz_rdr(struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, struct fanZone *fan_zone); static SaErrorT oa_soap_disc_therm_subsys(struct oh_handler_state *oh_handler); static SaErrorT oa_soap_disc_fz(struct oh_handler_state *oh_handler); static SaErrorT oa_soap_disc_fan(struct oh_handler_state *oh_handler); static SaErrorT oa_soap_build_lcd_rdr(struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id); static SaErrorT oa_soap_disc_lcd(struct oh_handler_state *oh_handler); static void oa_soap_push_disc_res(struct oh_handler_state *oh_handler); static SaErrorT oa_soap_server_mem_evt_discover(struct oh_handler_state *oh_handler, SaHpiRptEntryT *rpt); /** * oa_soap_discover_resources * @oh_handler: Pointer to openhpi handler * * Purpose: * Discover the resources. * This ABI is called from the OpenHPI framework for * discovering HP BladeSystem cClass resources * * Detailed Description: * - Checks the plugin initialization completion. * If the plugin initialization has failed, then it tries to do the * plugin initialization and then discovery. * - OpenHPI framework calls this ABI every 3 minutes. * If this function is called after the initial discovery, * then call is ignored and no discovery is done again. * - If the discovery is called for the 1st time (after plugin * initialazation), then, starts the event threads for active and * standby OAs. * - If the discovery is called for the 1st time (after plugin * initialazation), then, starts the discovery * * Return values: * SA_OK - on success or on shutdown_event_thread * set to TRUE or discovery already completed * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT oa_soap_discover_resources(void *oh_handler) { struct oh_handler_state *handler; struct oa_soap_handler *oa_handler = NULL; SaErrorT rv = SA_OK; GError **error = NULL; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } handler = (struct oh_handler_state *) oh_handler; oa_handler = (struct oa_soap_handler *) handler->data; /* Check whether the plugin is initialized or not * If not, initialize the plugin */ if (oa_handler == NULL) { rv = build_oa_soap_custom_handler(handler); if (rv != SA_OK) { err("Plugin initialization failed"); return SA_ERR_HPI_INTERNAL_ERROR; } } /* Check the event thread shutdown status * If TRUE, return SA_OK */ if (oa_handler->shutdown_event_thread == SAHPI_TRUE) { dbg("shutdown_event_thread set. Returning in thread %p", g_thread_self()); return SA_OK; } oa_handler->in_discovery_thread = HPOA_TRUE; /* Check the status of the plugin */ wrap_g_mutex_lock(oa_handler->mutex); switch (oa_handler->status) { case PRE_DISCOVERY: /* This is the first call for discovery */ wrap_g_mutex_unlock(oa_handler->mutex); dbg("First discovery"); break; case PLUGIN_NOT_INITIALIZED: /* The plugin has encountered a problem while * initializing, the configured OA may not be reachable. * Try to initialize the plugin again. */ wrap_g_mutex_unlock(oa_handler->mutex); rv = build_oa_soap_custom_handler(handler); if (rv != SA_OK) { err("Plugin initialization failed"); oa_handler->in_discovery_thread = HPOA_FALSE; return rv; } break; case DISCOVERY_FAIL: /* The last discovery has failed. * May be due to active OA is not reachable or * due to OA switchover during discovery. * Try to recover from the problem */ wrap_g_mutex_unlock(oa_handler->mutex); rv = check_discovery_failure(oh_handler); if (rv != SA_OK) { wrap_g_mutex_lock(oa_handler->mutex); oa_handler->status = DISCOVERY_FAIL; wrap_g_mutex_unlock(oa_handler->mutex); err("Discovery failed for OA %s", oa_handler->active_con->server); oa_handler->in_discovery_thread = HPOA_FALSE; return SA_ERR_HPI_INTERNAL_ERROR; } break; case DISCOVERY_COMPLETED: /* OpenHPI framework calls the discovery every 3 minutes * OA SOAP plugin gets the changes to resource as * part of event handling, hence re-discovery * is not required. If the discovery is already * done once, ignore and return success */ wrap_g_mutex_unlock(oa_handler->mutex); dbg("Discovery already done"); oa_handler->in_discovery_thread = HPOA_FALSE; return SA_OK; break; default: /* This code should never get executed */ wrap_g_mutex_unlock(oa_handler->mutex); err("Wrong oa_soap handler state %d detected", oa_handler->status); oa_handler->in_discovery_thread = HPOA_FALSE; return SA_ERR_HPI_INTERNAL_ERROR; } /* Create the event thread for the OA in slot 1 * If the thread_handler is not NULL, then the event threads are * already created and skip the event thread creation */ wrap_g_mutex_lock(oa_handler->mutex); if (oa_handler->oa_1->thread_handler == NULL) { oa_handler->oa_1->thread_handler = wrap_g_thread_create_new("oa_soap_event_thread_1", oa_soap_event_thread, oa_handler->oa_1, TRUE, error); if (oa_handler->oa_1->thread_handler == NULL) { wrap_g_mutex_unlock(oa_handler->mutex); err("wrap_g_thread_create_new failed"); oa_handler->in_discovery_thread = HPOA_FALSE; return SA_ERR_HPI_INTERNAL_ERROR; } } else dbg("OA %s event thread is already started", oa_handler->oa_1->server); /* Create the event thread for OA in slot 2 */ if (oa_handler->oa_2->thread_handler == NULL) { oa_handler->oa_2->thread_handler = wrap_g_thread_create_new("oa_soap_event_thread_2", oa_soap_event_thread, oa_handler->oa_2, TRUE, error); if (oa_handler->oa_2->thread_handler == NULL) { wrap_g_mutex_unlock(oa_handler->mutex); err("wrap_g_thread_create_new failed"); oa_handler->in_discovery_thread = HPOA_FALSE; return SA_ERR_HPI_INTERNAL_ERROR; } } else dbg("OA %s event thread is already started", oa_handler->oa_2->server); /* Plug-in intialization is successfully done. * Start the discovery of the cClass resources */ rv = discover_oa_soap_system(handler); if (rv != SA_OK) { oa_handler->status = DISCOVERY_FAIL; wrap_g_mutex_unlock(oa_handler->mutex); err("Discovery failed for active OA %s", oa_handler->active_con->server); /* Cleanup the RPTable which may have partially discovered * resource information. */ cleanup_plugin_rptable(handler); oa_handler->in_discovery_thread = HPOA_FALSE; return rv; } oa_handler->status = DISCOVERY_COMPLETED; wrap_g_mutex_unlock(oa_handler->mutex); dbg("Discovery completed for active OA %s", oa_handler->active_con->server); oa_handler->in_discovery_thread = HPOA_FALSE; return SA_OK; } /** * discover_oa_soap_system * @oh_handler: Pointer to openhpi handler * * Purpose: * Discover the OA SOAP resources. * Discovers all the resources of cClass system * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT discover_oa_soap_system(struct oh_handler_state *oh_handler) { SaErrorT rv = SA_OK; struct oh_handler_state *handler = NULL; struct oa_soap_handler *oa_handler = NULL; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } handler = (struct oh_handler_state *) oh_handler; oa_handler = (struct oa_soap_handler *) handler->data; /* Check the event thread shutdown status * If TRUE, return SA_OK */ if (oa_handler->shutdown_event_thread == SAHPI_TRUE) { dbg("shutdown_event_thread set. Returning in thread %p", g_thread_self()); return SA_OK; } dbg("Discovering HP BladeSystem c-Class"); dbg(" Discovering Enclosure ......................"); rv = discover_enclosure(oh_handler); if (rv != SA_OK) { err("Failed to discover Enclosure"); return rv; } if (oa_handler->shutdown_event_thread == SAHPI_TRUE) { dbg("shutdown_event_thread set. Returning in thread %p", g_thread_self()); return SA_OK; } dbg(" Discovering Blades ..................."); rv = discover_server(oh_handler); if (rv != SA_OK) { err("Failed to discover Server Blade"); return rv; } if (oa_handler->shutdown_event_thread == SAHPI_TRUE) { dbg("shutdown_event_thread set. Returning in thread %p", g_thread_self()); return SA_OK; } dbg(" Discovering InterConnect ..................."); rv = discover_interconnect(oh_handler); if (rv != SA_OK) { err("Failed to discover InterConnect"); return rv; } if (oa_handler->shutdown_event_thread == SAHPI_TRUE) { dbg("shutdown_event_thread set. Returning in thread %p", g_thread_self()); return SA_OK; } dbg(" Discovering Thermal Subsystem .............."); rv = oa_soap_disc_therm_subsys(oh_handler); if (rv != SA_OK) { err("Failed to discover Thermal Subsystem "); return rv; } if(oa_handler->enc_type != OA_SOAP_ENC_C3000){ dbg(" Discovering Fan Zone ......................."); rv = oa_soap_disc_fz(oh_handler); if (rv != SA_OK) { err("Failed to discover Fan Zone "); return rv; } } if (oa_handler->shutdown_event_thread == SAHPI_TRUE) { dbg("shutdown_event_thread set. Returning in thread %p", g_thread_self()); return SA_OK; } dbg(" Discovering Fan ............................"); rv = oa_soap_disc_fan(oh_handler); if (rv != SA_OK) { err("Failed to discover Fan "); return rv; } if (oa_handler->shutdown_event_thread == SAHPI_TRUE) { dbg("shutdown_event_thread set. Returning in thread %p", g_thread_self()); return SA_OK; } dbg(" Discovering Power Subsystem ................"); rv = discover_power_subsystem(oh_handler); if (rv != SA_OK) { err("Failed to discover Power Subsystem "); return rv; } if (oa_handler->shutdown_event_thread == SAHPI_TRUE) { dbg("shutdown_event_thread set. Returning in thread %p", g_thread_self()); return SA_OK; } dbg(" Discovering Power Supply Unit .............."); rv = discover_power_supply(oh_handler); if (rv != SA_OK) { err("Failed to discover Power Supply Unit"); return rv; } if (oa_handler->shutdown_event_thread == SAHPI_TRUE) { dbg("shutdown_event_thread set. Returning in thread %p", g_thread_self()); return SA_OK; } dbg(" Discovering OA ............................."); rv = discover_oa(oh_handler); if (rv != SA_OK) { err("Failed to discover OA"); return rv; } dbg(" Discovering LCD ............................."); rv = oa_soap_disc_lcd(oh_handler); if (rv != SA_OK) { err("Failed to discover LCD"); return rv; } oa_soap_push_disc_res(oh_handler); return SA_OK; } /** * oa_soap_build_enc_info * @oh_handler: Pointer to openhpi handler * @info: Pointer to enclosure info structure * * Purpose: * Gets the enclosure info and fills the max bays available for the * enclosure * * Detailed Description: * - Gets the maximum number bays for server blades, interconnect, * OA, fans and power supply * - Creates the resource id matrix for the server blades, interconnect, * OA, thermal subsystem, fan zones, fans, power subsystem and * power supply * - Creates the presence matrix for the server blades, interconnect, * OA, fans and power supply * - Initialize the presence matrix to ABSENT and resource id matrix to * UNSPECIFIED_ID * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ static SaErrorT oa_soap_build_enc_info(struct oh_handler_state *oh_handler, struct enclosureInfo *info) { struct oa_soap_handler *oa_handler = NULL; SaHpiInt32T i; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; if(oa_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } /* Find the enclosure type and max fan zones */ switch (info->bladeBays) { case OA_SOAP_C7000_MAX_BLADE: oa_handler->enc_type = OA_SOAP_ENC_C7000; oa_handler->oa_soap_resources.fan_zone.max_bays = OA_SOAP_C7000_MAX_FZ; break; case OA_SOAP_C3000_MAX_BLADE: oa_handler->enc_type = OA_SOAP_ENC_C3000; oa_handler->oa_soap_resources.fan_zone.max_bays = OA_SOAP_C3000_MAX_FZ; break; default: err("Invalid number (%d) of server bays detected", info->bladeBays); return SA_ERR_HPI_INTERNAL_ERROR; } oa_handler->oa_soap_resources.enclosure_rid = SAHPI_UNSPECIFIED_RESOURCE_ID; oa_handler->oa_soap_resources.power_subsystem_rid = SAHPI_UNSPECIFIED_RESOURCE_ID; oa_handler->oa_soap_resources.thermal_subsystem_rid = SAHPI_UNSPECIFIED_RESOURCE_ID; oa_handler->oa_soap_resources.lcd_rid = SAHPI_UNSPECIFIED_RESOURCE_ID; /* Create the resource presence matrix for * server, interconnect, OA, power supply and fan unit. * We need the resource presence matrix for re-discovery to sync * with current states of the resources */ /* Build resource presence matrix for servers */ oa_handler->oa_soap_resources.server.max_bays = info->bladeBays; oa_handler->oa_soap_resources.server.presence = (enum resource_presence_status *) g_malloc0((sizeof(enum resource_presence_status)) * oa_handler->oa_soap_resources.server.max_bays); if (oa_handler->oa_soap_resources.server.presence == NULL) { err("Out of memory"); return SA_ERR_HPI_OUT_OF_MEMORY; } /* allocate memory for resource_id matrix server blades */ oa_handler->oa_soap_resources.server.resource_id = (SaHpiResourceIdT *) g_malloc0((sizeof(SaHpiResourceIdT ) * oa_handler->oa_soap_resources.server.max_bays)); if (oa_handler->oa_soap_resources.server.resource_id == NULL) { err("Out of memory"); return SA_ERR_HPI_OUT_OF_MEMORY; } /* Create the placeholder for serial number * If the gets replaced during the switchover or when OA is not * reachable, we can detect this change by comparing the serial * numbers of the old and new blade. */ oa_handler->oa_soap_resources.server.serial_number = (char **) g_malloc0(sizeof(char **) * oa_handler->oa_soap_resources.server.max_bays); if (oa_handler->oa_soap_resources.server.serial_number == NULL) { err("Out of memory"); release_oa_soap_resources(oa_handler); return SA_ERR_HPI_OUT_OF_MEMORY; } for (i = 0; i < oa_handler->oa_soap_resources.server.max_bays; i++) { oa_handler->oa_soap_resources.server.presence[i] = RES_ABSENT; oa_handler->oa_soap_resources.server.resource_id[i] = SAHPI_UNSPECIFIED_RESOURCE_ID; oa_handler->oa_soap_resources.server.serial_number[i] = (char *) g_malloc0(sizeof(char *) * MAX_SERIAL_NUM_LENGTH); if (oa_handler->oa_soap_resources.server.serial_number[i] == NULL) { err("Out of memory"); release_oa_soap_resources(oa_handler); return SA_ERR_HPI_OUT_OF_MEMORY; } } /* Build resource presence matrix for interconnects */ oa_handler->oa_soap_resources.interconnect.max_bays = info->interconnectTrayBays; oa_handler->oa_soap_resources.interconnect.presence = (enum resource_presence_status *) g_malloc0((sizeof(enum resource_presence_status)) * oa_handler->oa_soap_resources.interconnect.max_bays); if (oa_handler->oa_soap_resources.interconnect.presence == NULL) { err("Out of memory"); release_oa_soap_resources(oa_handler); return SA_ERR_HPI_OUT_OF_MEMORY; } /* allocate memory for resource_id matrix interconnects */ oa_handler->oa_soap_resources.interconnect.resource_id = (SaHpiResourceIdT *) g_malloc0((sizeof(SaHpiResourceIdT ) * oa_handler->oa_soap_resources.interconnect.max_bays)); if (oa_handler->oa_soap_resources.interconnect.resource_id == NULL) { err("Out of memory"); return SA_ERR_HPI_OUT_OF_MEMORY; } oa_handler->oa_soap_resources.interconnect.serial_number = (char **) g_malloc0(sizeof(char **) * oa_handler->oa_soap_resources.interconnect.max_bays); if (oa_handler->oa_soap_resources.interconnect.serial_number == NULL) { err("Out of memory"); release_oa_soap_resources(oa_handler); return SA_ERR_HPI_OUT_OF_MEMORY; } for (i = 0; i < oa_handler->oa_soap_resources.interconnect.max_bays; i++) { oa_handler->oa_soap_resources.interconnect.presence[i] = RES_ABSENT; oa_handler->oa_soap_resources.interconnect.resource_id[i] = SAHPI_UNSPECIFIED_RESOURCE_ID; oa_handler->oa_soap_resources.interconnect.serial_number[i] = (char *) g_malloc0(sizeof(char *) * MAX_SERIAL_NUM_LENGTH); if (oa_handler->oa_soap_resources.interconnect.serial_number[i] == NULL) { err("Out of memory"); release_oa_soap_resources(oa_handler); return SA_ERR_HPI_OUT_OF_MEMORY; } } /* Build resource presence matrix for OAs */ oa_handler->oa_soap_resources.oa.max_bays = info->oaBays; oa_handler->oa_soap_resources.oa.presence = (enum resource_presence_status *) g_malloc0((sizeof(enum resource_presence_status)) * oa_handler->oa_soap_resources.oa.max_bays); if (oa_handler->oa_soap_resources.oa.presence == NULL) { err("Out of memory"); release_oa_soap_resources(oa_handler); return SA_ERR_HPI_OUT_OF_MEMORY; } oa_handler->oa_soap_resources.oa.serial_number = (char **) g_malloc0(sizeof(char **) * oa_handler->oa_soap_resources.oa.max_bays); if (oa_handler->oa_soap_resources.oa.serial_number == NULL) { err("Out of memory"); release_oa_soap_resources(oa_handler); return SA_ERR_HPI_OUT_OF_MEMORY; } /* allocate memory for OAs resource_id array */ oa_handler->oa_soap_resources.oa.resource_id = (SaHpiResourceIdT *) g_malloc0((sizeof(SaHpiResourceIdT ) * oa_handler->oa_soap_resources.oa.max_bays)); if (oa_handler->oa_soap_resources.oa.resource_id == NULL) { err("Out of memory"); return SA_ERR_HPI_OUT_OF_MEMORY; } for (i = 0; i < oa_handler->oa_soap_resources.oa.max_bays; i++) { oa_handler->oa_soap_resources.oa.presence[i] = RES_ABSENT; oa_handler->oa_soap_resources.oa.resource_id[i] = SAHPI_UNSPECIFIED_RESOURCE_ID; oa_handler->oa_soap_resources.oa.serial_number[i] = (char *) g_malloc0(sizeof(char *) * MAX_SERIAL_NUM_LENGTH); if (oa_handler->oa_soap_resources.oa.serial_number[i] == NULL) { err("Out of memory"); release_oa_soap_resources(oa_handler); return SA_ERR_HPI_OUT_OF_MEMORY; } } /* Build resource presence matrix for fan zone */ oa_handler->oa_soap_resources.fan_zone.resource_id = (SaHpiResourceIdT *) g_malloc0((sizeof(SaHpiResourceIdT ) * oa_handler->oa_soap_resources.fan_zone.max_bays)); if (oa_handler->oa_soap_resources.fan_zone.resource_id == NULL) { err("Out of memory"); release_oa_soap_resources(oa_handler); return SA_ERR_HPI_OUT_OF_MEMORY; } /* Fan zones do not have serial number. Therefore, the serial number * array is not constructed. */ for (i = 0; i < oa_handler->oa_soap_resources.fan_zone.max_bays; i++) { oa_handler->oa_soap_resources.fan_zone.resource_id[i] = SAHPI_UNSPECIFIED_RESOURCE_ID; } /* Build resource presence matrix for fans */ oa_handler->oa_soap_resources.fan.max_bays = info->fanBays; oa_handler->oa_soap_resources.fan.presence = (enum resource_presence_status *) g_malloc0((sizeof(enum resource_presence_status)) * oa_handler->oa_soap_resources.fan.max_bays); if (oa_handler->oa_soap_resources.fan.presence == NULL) { err("Out of memory"); release_oa_soap_resources(oa_handler); return SA_ERR_HPI_OUT_OF_MEMORY; } /* allocate memory for fans resource_id array */ oa_handler->oa_soap_resources.fan.resource_id = (SaHpiResourceIdT *) g_malloc0((sizeof(SaHpiResourceIdT ) * oa_handler->oa_soap_resources.fan.max_bays)); if (oa_handler->oa_soap_resources.fan.resource_id == NULL) { err("Out of memory"); return SA_ERR_HPI_OUT_OF_MEMORY; } /* Fans do not have serial number. Therefore, the serial number * array is not constructed. */ for (i = 0; i < oa_handler->oa_soap_resources.fan.max_bays; i++) { oa_handler->oa_soap_resources.fan.presence[i] = RES_ABSENT; oa_handler->oa_soap_resources.fan.resource_id[i] = SAHPI_UNSPECIFIED_RESOURCE_ID; } /* Build resource presence matrix for power supply units */ oa_handler->oa_soap_resources.ps_unit.max_bays = info->powerSupplyBays; oa_handler->oa_soap_resources.ps_unit.presence = (enum resource_presence_status *) g_malloc0((sizeof(enum resource_presence_status)) * oa_handler->oa_soap_resources.ps_unit.max_bays); if (oa_handler->oa_soap_resources.ps_unit.presence == NULL) { err("Out of memory"); release_oa_soap_resources(oa_handler); return SA_ERR_HPI_OUT_OF_MEMORY; } /* allocate memory for power supplies resource_id array */ oa_handler->oa_soap_resources.ps_unit.resource_id = (SaHpiResourceIdT *) g_malloc0((sizeof(SaHpiResourceIdT ) * oa_handler->oa_soap_resources.ps_unit.max_bays)); if (oa_handler->oa_soap_resources.ps_unit.resource_id == NULL) { err("Out of memory"); return SA_ERR_HPI_OUT_OF_MEMORY; } oa_handler->oa_soap_resources.ps_unit.serial_number = (char **) g_malloc0(sizeof(char **) * oa_handler->oa_soap_resources.ps_unit.max_bays); if (oa_handler->oa_soap_resources.ps_unit.serial_number == NULL) { err("Out of memory"); release_oa_soap_resources(oa_handler); return SA_ERR_HPI_OUT_OF_MEMORY; } for (i = 0; i < oa_handler->oa_soap_resources.ps_unit.max_bays; i++) { oa_handler->oa_soap_resources.ps_unit.presence[i] = RES_ABSENT; oa_handler->oa_soap_resources.ps_unit.resource_id[i] = SAHPI_UNSPECIFIED_RESOURCE_ID; oa_handler->oa_soap_resources.ps_unit.serial_number[i] = (char *) g_malloc0(sizeof(char *) * MAX_SERIAL_NUM_LENGTH); if (oa_handler->oa_soap_resources.ps_unit.serial_number[i] == NULL) { err("Out of memory"); release_oa_soap_resources(oa_handler); return SA_ERR_HPI_OUT_OF_MEMORY; } } dbg("server bays = %d",oa_handler->oa_soap_resources.server.max_bays); dbg("intercennet bays = %d", oa_handler->oa_soap_resources.interconnect.max_bays); dbg("OA bays = %d",oa_handler->oa_soap_resources.oa.max_bays); dbg("fan bays = %d",oa_handler->oa_soap_resources.fan.max_bays); dbg("power supply bays = %d", oa_handler->oa_soap_resources.ps_unit.max_bays); return SA_OK; } /** * build_enclosure_rpt * @oh_handler: Pointer to openhpi handler * @name: Pointer to the name of the enclosure * @resource_id: Pointer to the resource id * * Purpose: * Builds the enclosure RPT entry. * Pushes the RPT entry to plugin RPTable * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_OUT_OF_MEMORY - on malloc failure * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT build_enclosure_rpt(struct oh_handler_state *oh_handler, char *name, SaHpiResourceIdT *resource_id) { SaErrorT rv = SA_OK; SaHpiEntityPathT entity_path; struct oa_soap_handler *oa_handler; char *entity_root = NULL; SaHpiRptEntryT rpt; struct rackTopology2 response; struct encLink2 enc; if (oh_handler == NULL || name == NULL || resource_id == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; if(oa_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } /* Fetch and encode the entity path required for the rpt field */ entity_root = (char *) g_hash_table_lookup(oh_handler->config, "entity_root"); memset(&entity_path, 0, sizeof(SaHpiEntityPathT)); rv = oh_encode_entitypath(entity_root, &entity_path); if (rv != SA_OK) { err("Encoding entity path failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Populate the rpt with the details of the enclosure */ memset(&rpt, 0, sizeof(SaHpiRptEntryT)); rpt.ResourceCapabilities = SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_CONTROL ; rpt.ResourceEntity.Entry[0].EntityType = SAHPI_ENT_ROOT; rpt.ResourceEntity.Entry[0].EntityLocation = 0; rv = oh_concat_ep(&(rpt.ResourceEntity), &entity_path); if (rv != SA_OK) { err("concat of entity path failed"); return SA_ERR_HPI_INTERNAL_ERROR; } rpt.ResourceSeverity = SAHPI_OK; rpt.ResourceInfo.ManufacturerId = HP_MANUFACTURING_ID; rpt.ResourceSeverity = SAHPI_OK; rpt.ResourceFailed = SAHPI_FALSE; rpt.HotSwapCapabilities = 0x0; rpt.ResourceTag.DataType = SAHPI_TL_TYPE_TEXT; rpt.ResourceTag.Language = SAHPI_LANG_ENGLISH; oa_soap_trim_whitespace(name); rpt.ResourceTag.DataLength = strlen(name); memset(rpt.ResourceTag.Data, 0, SAHPI_MAX_TEXT_BUFFER_LENGTH); snprintf((char *) (rpt.ResourceTag.Data), strlen(name) + 1, "%s", name); rpt.ResourceId = oh_uid_from_entity_path(&(rpt.ResourceEntity)); /* getRackTopology2 soap call is supported starting with OA firmware * version 2.20 */ if (get_oa_fw_version(oh_handler) >= OA_2_20) { rv = soap_getRackTopology2(oa_handler->active_con, &response); if (rv != SOAP_OK) { err("Get rack topology2 call failed"); return SA_ERR_HPI_INTERNAL_ERROR; } soap_getEncLink2(response.enclosures, &enc); rpt.ResourceInfo.ProductId = enc.productId; } /* Add the enclosure rpt to the plugin RPTable */ rv = oh_add_resource(oh_handler->rptcache, &rpt, NULL, 0); if (rv != SA_OK) { err("Failed to Add Enclosure Resource"); return rv; } *resource_id = rpt.ResourceId; return SA_OK; } /** * build_enclosure_rdr * @oh_handler: Pointer to openhpi handler. * @con: Pointer to the soap client handler. * @response: Pointer to enclosure info response structure. * @resource_id: Resource id * * Purpose: * Populate the enclosure RDR. * Pushes the RDR entry to plugin RPTable * * Detailed Description: * - Creates the enclosure inventory RDR * - Creates the temperature, operational status, predictive failure, * internal data error, device failure error, device degraded error, * redundancy error and device not supported sensor RDR * - Creates UID control RDR * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_OUT_OF_MEMORY - on out of memory * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT build_enclosure_rdr(struct oh_handler_state *oh_handler, SOAP_CON *con, struct enclosureInfo *response, SaHpiResourceIdT resource_id) { SaErrorT rv = SA_OK; SaHpiRdrT rdr; struct oa_soap_inventory *inventory = NULL; struct oa_soap_sensor_info *sensor_info = NULL; struct enclosureStatus status_response; struct getThermalInfo thermal_request; struct thermalInfo thermal_response; SaHpiBoolT event_support = SAHPI_FALSE; SaHpiInt32T sensor_status; enum diagnosticStatus diag_ex_status[OA_SOAP_MAX_DIAG_EX]; if (oh_handler == NULL || con == NULL || response == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } /* Build inventory rdr for the enclosure */ memset(&rdr, 0, sizeof(SaHpiRdrT)); rv = build_enclosure_inv_rdr(oh_handler, response, &rdr, &inventory); if (rv != SA_OK) { err("Failed to Add enclosure inventory RDR"); return rv; } rv = oh_add_rdr(oh_handler->rptcache, resource_id, &rdr, inventory, 0); if (rv != SA_OK) { err("Failed to add rdr"); return rv; } /* Make a soap call to OA requesting for the enclosure thermal status */ thermal_request.sensorType = SENSOR_TYPE_ENC; thermal_request.bayNumber = 1; rv = soap_getThermalInfo(con, &thermal_request, &thermal_response); if (rv != SOAP_OK) { err("Get thermalInfo failed for enclosure"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Build thermal sensor rdr for the enclosure */ event_support = SAHPI_TRUE; OA_SOAP_BUILD_THRESHOLD_SENSOR_RDR(OA_SOAP_SEN_TEMP_STATUS, thermal_response) /* Make a soap call to OA requesting for the enclosure status */ rv = soap_getEnclosureStatus(con, &status_response); if (rv != SOAP_OK) { err("Get enclosure status soap call failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Build operational status sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_OPER_STATUS, status_response.operationalStatus) /* Build predictive failure sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_PRED_FAIL, status_response.operationalStatus) /* Build internal data error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_INT_DATA_ERR, status_response.diagnosticChecks. internalDataError) /* Build device failure error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_FAIL, status_response.diagnosticChecks. deviceFailure) /* Build device degraded error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_DEGRAD, status_response.diagnosticChecks. deviceDegraded) /* Build redundancy error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_REDUND_ERR, status_response.diagnosticChecks. redundancy) /* Parse the diganosticChecksEx */ oa_soap_parse_diag_ex(status_response.diagnosticChecksEx, diag_ex_status); /* Build device not supported sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_NOT_SUPPORT, diag_ex_status[DIAG_EX_DEV_NOT_SUPPORT]) /* Build UID control rdr for Enclosure */ OA_SOAP_BUILD_CONTROL_RDR(OA_SOAP_UID_CNTRL, 0, 0) return SA_OK; } /** * discover_enclosure * @oh_handler: Pointer to openhpi handler * * Purpose: * Discovers the enclosure. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT discover_enclosure(struct oh_handler_state *oh_handler) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler = NULL; struct enclosureInfo response; SaHpiResourceIdT resource_id; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; /* Make a soap call to OA requesting for the enclosure information */ rv = soap_getEnclosureInfo(oa_handler->active_con, &response); if (rv != SOAP_OK) { err("Get enclosure info failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Retrieve the enclosure information */ rv = oa_soap_build_enc_info(oh_handler, &response); if (rv != SA_OK) { err("build enclosure info failed"); return rv; } rv = build_enclosure_rpt(oh_handler, response.name, &resource_id); if (rv != SA_OK) { err("build enclosure rpt failed"); return rv; } /* Save enclosure resource id */ oa_handler->oa_soap_resources.enclosure_rid = resource_id; /* SOAP call has been made while building the rpt, so the response * structure is not valid any more. Get the information again. */ rv = soap_getEnclosureInfo(oa_handler->active_con, &response); if (rv != SOAP_OK) { err("Get enclosure info failed"); return SA_ERR_HPI_INTERNAL_ERROR; } rv = build_enclosure_rdr(oh_handler, oa_handler->active_con, &response, resource_id); if (rv != SA_OK) { err("build enclosure rdr failed"); return rv; } return SA_OK; } /** * build_oa_rpt * @oh_handler: Pointer to openhpi handler * @bay_number: Bay number of the OA * @resource_id: Pointer to the resource Id * * Purpose: * Populate the OA RPT entry. * Pushes the RPT entry to plugin RPTable * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT build_oa_rpt(struct oh_handler_state *oh_handler, SaHpiInt32T bay_number, SaHpiResourceIdT *resource_id) { SaErrorT rv = SA_OK; SaHpiEntityPathT entity_path; char *entity_root = NULL; SaHpiRptEntryT rpt; if (oh_handler == NULL || resource_id == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } entity_root = (char *) g_hash_table_lookup(oh_handler->config, "entity_root"); rv = oh_encode_entitypath(entity_root, &entity_path); if (rv != SA_OK) { err("Encoding entity path failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Populate the rpt with the details of the enclosure */ memset(&rpt, 0, sizeof(SaHpiRptEntryT)); rpt.ResourceCapabilities = SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_SENSOR | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_CONTROL ; rpt.ResourceEntity.Entry[1].EntityType = SAHPI_ENT_ROOT; rpt.ResourceEntity.Entry[1].EntityLocation = 0; rpt.ResourceEntity.Entry[0].EntityType = SAHPI_ENT_SYS_MGMNT_MODULE; rpt.ResourceEntity.Entry[0].EntityLocation = bay_number; rv = oh_concat_ep(&(rpt.ResourceEntity), &entity_path); if (rv != SA_OK) { err("concat of entity path failed"); return SA_ERR_HPI_INTERNAL_ERROR; } rpt.ResourceId = oh_uid_from_entity_path(&(rpt.ResourceEntity)); rpt.ResourceInfo.ManufacturerId = HP_MANUFACTURING_ID; rpt.ResourceSeverity = SAHPI_OK; rpt.ResourceFailed = SAHPI_FALSE; rpt.HotSwapCapabilities = 0x0; rpt.ResourceTag.DataType = SAHPI_TL_TYPE_TEXT; rpt.ResourceTag.Language = SAHPI_LANG_ENGLISH; rpt.ResourceTag.DataLength = strlen(OA_NAME); memset(rpt.ResourceTag.Data, 0, SAHPI_MAX_TEXT_BUFFER_LENGTH); snprintf((char *) (rpt.ResourceTag.Data), strlen(OA_NAME) + 1, OA_NAME); /* Add the OA rpt to the plugin RPTable */ rv = oh_add_resource(oh_handler->rptcache, &rpt, NULL, 0); if (rv != SA_OK) { err("Failed to Add OA RPT"); return rv; } *resource_id = rpt.ResourceId; return SA_OK; } /** * build_oa_rdr * @oh_handler: Pointer to openhpi handler. * @con: Pointer to the soap client handler. * @response: Pointer OA info response structure. * @resource_id: Resource id * * Purpose: * Populates the OA RDRs * Pushes the RDR entry to plugin RPTable * * Detailed Description: * - Creates the inventory RDR * - Creates the temperature, operational status, predictive failure, * internal data error, management processor error, device failure error, * device degraded error, redundancy error, device not supported and OA * link status sensor RDR * - Creates UID control RDR * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_OUT_OF_MEMORY - on malloc failure * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT build_oa_rdr(struct oh_handler_state *oh_handler, SOAP_CON *con, SaHpiInt32T bay_number, struct oaInfo *response, SaHpiResourceIdT resource_id) { SaErrorT rv = SA_OK; SaHpiRdrT rdr; struct oa_soap_inventory *inventory = NULL; struct oa_soap_sensor_info *sensor_info=NULL; struct getThermalInfo thermal_request; struct thermalInfo thermal_response; SaHpiBoolT event_support = SAHPI_FALSE; struct getOaStatus status_request; struct oaStatus status_response; struct getOaNetworkInfo nw_info_request; struct oaNetworkInfo nw_info_response; SaHpiInt32T sensor_status; enum diagnosticStatus diag_ex_status[OA_SOAP_MAX_DIAG_EX]; if (oh_handler == NULL || con == NULL || response == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } /* Build inventory rdr for OA */ memset(&rdr, 0, sizeof(SaHpiRdrT)); rv = build_oa_inv_rdr(oh_handler, response, &rdr, &inventory); if (rv != SA_OK) { err("Failed to build OA inventory RDR"); return rv; } rv = oh_add_rdr(oh_handler->rptcache, resource_id, &rdr, inventory, 0); if (rv != SA_OK) { err("Failed to add rdr"); return rv; } /* Make a soap call to OA requesting for the OA thermal status */ thermal_request.sensorType = SENSOR_TYPE_OA; thermal_request.bayNumber = bay_number; rv = soap_getThermalInfo(con, &thermal_request, &thermal_response); if (rv != SOAP_OK) { err("Get thermalInfo failed for OA"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Build thermal sensor rdr for the enclosure */ OA_SOAP_BUILD_THRESHOLD_SENSOR_RDR(OA_SOAP_SEN_TEMP_STATUS, thermal_response) /* Build UID control rdr for OA */ OA_SOAP_BUILD_CONTROL_RDR(OA_SOAP_UID_CNTRL, 0, 0) status_request.bayNumber = response->bayNumber; rv = soap_getOaStatus(con, &status_request, &status_response); if (rv != SOAP_OK) { err("Get OA status failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Build operational status sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_OPER_STATUS, status_response.operationalStatus) /* Build predictive failure sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_PRED_FAIL, status_response.operationalStatus) /* Build OA redundancy sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_OA_REDUND, status_response.oaRedundancy) /* Build internal data error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_INT_DATA_ERR, status_response.diagnosticChecks. internalDataError) /* Build management processor error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_MP_ERR, status_response.diagnosticChecks. managementProcessorError) /* Build device failure error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_FAIL, status_response.diagnosticChecks. deviceFailure) /* Build device degraded error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_DEGRAD, status_response.diagnosticChecks. deviceDegraded) /* Build redundancy error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_REDUND_ERR, status_response.diagnosticChecks. redundancy) /* Parse the diganosticChecksEx */ oa_soap_parse_diag_ex(status_response.diagnosticChecksEx, diag_ex_status); /* Build firmware mismatch sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_FW_MISMATCH, diag_ex_status[DIAG_EX_FW_MISMATCH]) /* Build device not supported sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_NOT_SUPPORT, diag_ex_status[DIAG_EX_DEV_NOT_SUPPORT]) nw_info_request.bayNumber = response->bayNumber; rv = soap_getOaNetworkInfo(con, &nw_info_request, &nw_info_response); if (rv != SOAP_OK) { err("Get OA network info SOAP call failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Build OA link status sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_OA_LINK_STATUS, nw_info_response.linkActive) return SA_OK; } /** * discover_oa * @oh_handler: Pointer to openhpi handler * * Purpose: * Discover the OA. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT discover_oa(struct oh_handler_state *oh_handler) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler = NULL; struct oaInfo info_result; struct oaStatus status_result; SaHpiInt32T i = 0, max_bays = 0; SaHpiResourceIdT resource_id; struct getOaInfoArrayResponse info_response; struct getOaStatusArrayResponse status_response; xmlDocPtr oa_info_doc = NULL; xmlDocPtr oa_sts_doc = NULL; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *)oh_handler->data; max_bays = oa_handler->oa_soap_resources.oa.max_bays; rv = oa_soap_get_oa_sts_arr(oa_handler->active_con, max_bays, &status_response, oa_sts_doc); if (rv != SA_OK) { err("Failed to get OA status array"); xmlFreeDoc( oa_sts_doc); return rv; } rv = oa_soap_get_oa_info_arr(oa_handler->active_con, max_bays, &info_response, oa_info_doc); if (rv != SA_OK) { err("Failed to get OA info array"); xmlFreeDoc( oa_info_doc); xmlFreeDoc( oa_sts_doc); return rv; } while( status_response.oaStatusArray && info_response.oaInfoArray ) { parse_oaStatus(status_response.oaStatusArray ,&status_result); parse_oaInfo(info_response.oaInfoArray ,&info_result); i++; /* Sometimes, if the OA is absent, then OA status is shown as * STANDBY in getOaStatus response. As workaround, if OA * status is STANDBY and oaRedudancy state is set to false, * Then, it is considered as ABSENT. * * But, if the OA is recently inserted, then oaRedudancy state * will be set to false. In this scenario, the OA state will * be wrongly considered as ABSENT. This is a known limitation * * TODO: Remove this workaround once the fix is available in OA * firmware */ if ((status_result.oaRole == OA_ABSENT) || (status_result.oaRole == STANDBY && status_result.oaRedundancy == HPOA_FALSE)) { /* Update the OA status as absent */ switch (i) { case 1: oa_handler->oa_1->oa_status = OA_ABSENT; break; case 2: oa_handler->oa_2->oa_status = OA_ABSENT; break; default: err("Wrong OA slot number - %d", i); xmlFreeDoc( oa_sts_doc); xmlFreeDoc( oa_info_doc); return SA_ERR_HPI_INTERNAL_ERROR; } /* If resource not present, continue checking for * next bay */ dbg("OA %d is not present", i); status_response.oaStatusArray = soap_next_node( status_response.oaStatusArray); info_response.oaInfoArray = soap_next_node( info_response.oaInfoArray); continue; } /* If the OA is not yet stable, then getOaInfo response * structure will not have proper information. Abort the * discovery and let the OA to stabilize. The discovery will be * called by the openhpi framework after 3 minutes */ if (info_result.serialNumber == NULL) { err("OA %d is not yet stabilized", i); err("Discovery is aborted"); err("Discovery will happen after 3 minutes"); xmlFreeDoc( oa_sts_doc); xmlFreeDoc( oa_info_doc); return SA_ERR_HPI_INTERNAL_ERROR; } /* Build rpt entry for OA */ rv = build_oa_rpt(oh_handler, i, &resource_id); if (rv != SA_OK) { err("Failed to build OA RPT"); xmlFreeDoc( oa_sts_doc); xmlFreeDoc( oa_info_doc); return rv; } /* Update the OA firmware version to RPT entry */ rv = update_oa_info(oh_handler, &info_result, resource_id); if (rv != SA_OK) { err("Failed to update OA RPT"); xmlFreeDoc( oa_sts_doc); xmlFreeDoc( oa_info_doc); return rv; } /* Update resource_status structure with resource_id, serial_number, and presence status */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.oa, i, info_result.serialNumber, resource_id, RES_PRESENT); /* Build RDRs for OA */ rv = build_oa_rdr(oh_handler, oa_handler->active_con, i, &info_result, resource_id); if (rv != SA_OK) { err("Failed to build OA RDR"); /* Reset resource_status structure to default values */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.oa, i, "", SAHPI_UNSPECIFIED_RESOURCE_ID, RES_ABSENT); xmlFreeDoc( oa_info_doc); xmlFreeDoc( oa_sts_doc); return rv; } status_response.oaStatusArray = soap_next_node( status_response.oaStatusArray); info_response.oaInfoArray = soap_next_node( info_response.oaInfoArray); } /* End of while loop */ xmlFreeDoc( oa_info_doc); xmlFreeDoc( oa_sts_doc); return SA_OK; } /** * build_discovered_server_rpt * @oh_handler: Pointer to openhpi handler * @response: Pointer to the bladeInfo structure * @resource_id: Pointer to the resource id * @sts_result: Pointer to the bladeStatus structure * * Purpose: * Populate the server blade RPT with aid of build_server_rpt() and add * hotswap state information to the returned rpt. * Pushes the RPT entry to plugin RPTable * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_OUT_OF_MEMORY - on malloc failure * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT build_discovered_server_rpt(struct oh_handler_state *oh_handler, struct bladeInfo *response, SaHpiResourceIdT *resource_id, struct bladeStatus *sts_result) { SaErrorT rv = SA_OK; SaHpiPowerStateT state; struct oa_soap_hotswap_state *hotswap_state = NULL; SaHpiRptEntryT rpt; if (oh_handler == NULL || response == NULL || resource_id == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } if(build_server_rpt(oh_handler, response, &rpt) != SA_OK) { err("Building Server Rpt failed during discovery"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Set power status of discovered blade resource initially as POWER ON*/ oa_soap_bay_pwr_status[response->bayNumber -1] = SAHPI_POWER_ON; /* Get the power state of the server blade to determine the * hotswap state. The hotswap state of the server will be * maintained in the private data area of the server RPT. */ if (rpt.ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP) { switch (sts_result->powered) { case (POWER_ON): state = SAHPI_POWER_ON; break; case (POWER_OFF): state = SAHPI_POWER_OFF; break; case (POWER_REBOOT): err("Wrong Power State (REBOOT) detected"); return SA_ERR_HPI_INTERNAL_ERROR; break; default: err("Unknown Power State %d detected for " "Blade at bay %d", sts_result->powered, sts_result->bayNumber); return SA_ERR_HPI_INTERNAL_ERROR; } hotswap_state = (struct oa_soap_hotswap_state *) g_malloc0(sizeof(struct oa_soap_hotswap_state)); if (hotswap_state == NULL) { err("Out of memory"); return SA_ERR_HPI_OUT_OF_MEMORY; } switch (state) { case SAHPI_POWER_ON: case SAHPI_POWER_CYCLE: hotswap_state->currentHsState = SAHPI_HS_STATE_ACTIVE; break; case SAHPI_POWER_OFF: hotswap_state->currentHsState = SAHPI_HS_STATE_INACTIVE; /* Change the power state to POWER OFF for * blade entry in oa_soap_bay_pwr_status array */ oa_soap_bay_pwr_status[response->bayNumber -1] = SAHPI_POWER_OFF; break; default: err("Unknown power state %d detected for Blade" " at bay %d", state, response->bayNumber); wrap_g_free(hotswap_state); return SA_ERR_HPI_INTERNAL_ERROR; } } /* Add the server rpt to the plugin RPTable */ rv = oh_add_resource(oh_handler->rptcache, &rpt, hotswap_state, 0); if (rv != SA_OK) { err("Failed to add Server rpt"); wrap_g_free(hotswap_state); return rv; } *resource_id = rpt.ResourceId; return SA_OK; } /** * build_server_rpt * @oh_handler: Pointer to openhpi handler * @response: Pointer to the bladeInfo structure * @rpt: Pointer to rpt to be filled * * Purpose: * This routine should be called to during discovery/re-discovery phase * and when a new blade gets inserted. It populates the server blade RPT * information common to discovered and insterted blades. The caller will * fill in the information specific to the manner in which the blade was * found. For example, the hotswap state could be different in the case * of discovered vs. inserted blades, because an inserted blade goes * through the pending state, while a discovered blade doesn't. * * Detailed Description: NA * * Return values: * SA_OK - on success * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_OUT_OF_MEMORY - on malloc failure * SA_ERR_HPI_INTERNAL_ERROR - on failure **/ SaErrorT build_server_rpt(struct oh_handler_state *oh_handler, struct bladeInfo *response, SaHpiRptEntryT *rpt) { SaErrorT rv = SA_OK; SaHpiEntityPathT entity_path; char *entity_root = NULL; if (oh_handler == NULL || response == NULL || rpt == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } entity_root = (char *) g_hash_table_lookup(oh_handler->config, "entity_root"); rv = oh_encode_entitypath(entity_root, &entity_path); if (rv != SA_OK) { err("Encoding entity path failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Populate the rpt with the details of the server */ memset(rpt, 0, sizeof(SaHpiRptEntryT)); rpt->ResourceCapabilities = SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESET | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_POWER | SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_MANAGED_HOTSWAP | SAHPI_CAPABILITY_SENSOR | SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_INVENTORY_DATA; rpt->ResourceEntity.Entry[1].EntityType = SAHPI_ENT_ROOT; rpt->ResourceEntity.Entry[1].EntityLocation = 0; switch(response->bladeType) { case BLADE_TYPE_SERVER: rpt->ResourceEntity.Entry[0].EntityType = SAHPI_ENT_SYSTEM_BLADE; break; case BLADE_TYPE_IO: rpt->ResourceEntity.Entry[0].EntityType = SAHPI_ENT_IO_BLADE; rpt->ResourceCapabilities &= ~(SAHPI_CAPABILITY_RESET | SAHPI_CAPABILITY_POWER | SAHPI_CAPABILITY_MANAGED_HOTSWAP); break; case BLADE_TYPE_STORAGE: rpt->ResourceEntity.Entry[0].EntityType = SAHPI_ENT_DISK_BLADE; rpt->ResourceCapabilities &= ~(SAHPI_CAPABILITY_RESET | SAHPI_CAPABILITY_POWER | SAHPI_CAPABILITY_MANAGED_HOTSWAP); break; default: err("Invalid blade type %d in slot %d.", response->bladeType, response->bayNumber); err("Expecting server(2)/storage(3)/IO blade(5)."); return SA_ERR_HPI_INTERNAL_ERROR; } rpt->ResourceEntity.Entry[0].EntityLocation= response->bayNumber; rv = oh_concat_ep(&rpt->ResourceEntity, &entity_path); if (rv != SA_OK) { err("internal error (oh_concat_ep call)"); return SA_ERR_HPI_INTERNAL_ERROR; } rpt->ResourceId = oh_uid_from_entity_path(&(rpt->ResourceEntity)); rpt->ResourceInfo.ManufacturerId = HP_MANUFACTURING_ID; rpt->ResourceInfo.ProductId = response->productId; rpt->ResourceSeverity = SAHPI_OK; rpt->ResourceFailed = SAHPI_FALSE; rpt->ResourceTag.DataType = SAHPI_TL_TYPE_TEXT; rpt->ResourceTag.Language = SAHPI_LANG_ENGLISH; oa_soap_trim_whitespace(response->name); rpt->ResourceTag.DataLength = strlen(response->name); memset(rpt->ResourceTag.Data, 0, SAHPI_MAX_TEXT_BUFFER_LENGTH); snprintf((char *) (rpt->ResourceTag.Data), rpt->ResourceTag.DataLength + 1, "%s", response->name); /* set default hotswap capability */ if (rpt->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP) { rpt->HotSwapCapabilities = SAHPI_HS_CAPABILITY_AUTOEXTRACT_READ_ONLY; } else { rpt->HotSwapCapabilities = 0; } return SA_OK; } /** * build_inserted_server_rdr * @oh_handler: Pointer to openhpi handler * @con: Pointer to the soap client handler. * @response: Server blade info response structure * @resource_id: Resource id * @name: Blade resource name * @build_sensor: Flag to build sensors * * Purpose: * Populate the server blade RDR. * Pushes the RDR entry to plugin RPTable * * Detailed Description: * - Creates the inventory RDR * - Creates the temperature, power, operational status, predictive * failure, internal data error, management processor error, thermal * warning, thermal danger, IO configuration error, device power request * error, insufficient cooling, device location error, device failure * error, device degraded error, device missing, device bonding, device * power sequence, network configuration, profile unassigned error, * device not supported, too low power request, call HP, storage device * missing, power capping error, IML recorded errors, duplicate * management IP address sensor RDR * - Creates UID and power control RDR * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_OUT_OF_MEMORY - on malloc failure * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT build_inserted_server_rdr(struct oh_handler_state *oh_handler, SOAP_CON *con, SaHpiInt32T bay_number, SaHpiResourceIdT resource_id, char *name, int build_sensors) { SaErrorT rv = SA_OK; SaHpiRdrT rdr; SaHpiRptEntryT *rpt = NULL; struct oa_soap_inventory *inventory = NULL; struct oa_soap_sensor_info *sensor_info = NULL; struct getBladeThermalInfoArray thermal_request; struct bladeThermalInfoArrayResponse thermal_response; struct getBladeStatus status_request; struct bladeStatus status_response; SaHpiInt32T sensor_status; enum diagnosticStatus diag_ex_status[OA_SOAP_MAX_DIAG_EX]; if (oh_handler == NULL || con == NULL) { err("Invalid parameter"); return SA_ERR_HPI_INVALID_PARAMS; } rpt = oh_get_resource_by_id (oh_handler->rptcache, resource_id); if (rpt == NULL) { err("INVALID RESOURCE"); return SA_ERR_HPI_INVALID_RESOURCE; } /* Build inventory rdr for server */ memset(&rdr, 0, sizeof(SaHpiRdrT)); rv = build_server_inv_rdr(oh_handler, con, bay_number, &rdr, &inventory); if (rv != SA_OK) { err("Failed to get server inventory RDR " "in slot %d", bay_number); return rv; } rv = oh_add_rdr(oh_handler->rptcache, resource_id, &rdr, inventory, 0); if (rv != SA_OK) { err("Failed to add rdr"); return rv; } /* Make a soap call to OA requesting for the server thermal status */ thermal_request.bayNumber = bay_number; rv = soap_getBladeThermalInfoArray(con, &thermal_request, &thermal_response); if (rv != SOAP_OK) { err("getBladeThermalInfoArray failed for blade"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Build the thermal sensors based on the blade name*/ rv = oa_soap_build_blade_thermal_rdr(oh_handler, thermal_response, rpt, name); if (rv != SA_OK) { err("Failed to build thermal rdr"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Build power sensor rdr for server */ OA_SOAP_BUILD_SENSOR_RDR(OA_SOAP_SEN_PWR_STATUS) /* Create power control RDR only for server blades. IO and Storage blades don't support power management. */ if (rpt->ResourceEntity.Entry[0].EntityType == SAHPI_ENT_SYSTEM_BLADE) { /* Build power control rdr for server */ OA_SOAP_BUILD_CONTROL_RDR(OA_SOAP_PWR_CNTRL, 0, 0) } /* Build UID control rdr for server */ OA_SOAP_BUILD_CONTROL_RDR(OA_SOAP_UID_CNTRL, 0, 0) if(build_sensors != TRUE) return SA_OK; status_request.bayNumber = bay_number; rv = soap_getBladeStatus(con, &status_request, &status_response); if (rv != SOAP_OK) { err("Get Blade %d status failed", status_request.bayNumber); return SA_ERR_HPI_INTERNAL_ERROR; } /* Build operational status sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_OPER_STATUS, status_response.operationalStatus) /* Build predictive failure sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_PRED_FAIL, status_response.operationalStatus) /* Build internal data error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_INT_DATA_ERR, status_response.diagnosticChecks. internalDataError) /* Build management processor error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_MP_ERR, status_response.diagnosticChecks. managementProcessorError) /* Build thermal waring sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_THERM_WARN, status_response.diagnosticChecks. thermalWarning) /* Build thermal danger sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_THERM_DANGER, status_response.diagnosticChecks. thermalDanger) /* Build IO configuration error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_IO_CONFIG_ERR, status_response.diagnosticChecks. ioConfigurationError) /* Build device power request error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_PWR_REQ, status_response.diagnosticChecks. devicePowerRequestError) /* Build insufficient cooling sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_INSUF_COOL, status_response.diagnosticChecks. insufficientCooling) /* Build device location error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_LOC_ERR, status_response.diagnosticChecks. deviceLocationError) /* Build device failure error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_FAIL, status_response.diagnosticChecks. deviceFailure) /* Build device degraded error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_DEGRAD, status_response.diagnosticChecks. deviceDegraded) /* Parse the diganosticChecksEx */ oa_soap_parse_diag_ex(status_response.diagnosticChecksEx, diag_ex_status); /* Build device missing sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_MISS, diag_ex_status[DIAG_EX_DEV_MISS]) /* Build device bonding sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_BOND, diag_ex_status[DIAG_EX_DEV_BOND]) /* Build device power sequence sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_PWR_SEQ, diag_ex_status[DIAG_EX_DEV_PWR_SEQ]) /* Build network configuration sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_NET_CONFIG, diag_ex_status[DIAG_EX_NET_CONFIG]) /* Build profile unassigned error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_PROF_UNASSIGN_ERR, diag_ex_status[DIAG_EX_PROF_UNASSIGN_ERR]) /* Build Device not supported sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_NOT_SUPPORT, diag_ex_status[DIAG_EX_DEV_NOT_SUPPORT]) /* Build Too low power request sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_TOO_LOW_PWR_REQ, diag_ex_status[DIAG_EX_TOO_LOW_PWR_REQ]) /* Build Call HP sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_CALL_HP, diag_ex_status[DIAG_EX_CALL_HP]) /* Build Storage device missing sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_STORAGE_DEV_MISS, diag_ex_status[DIAG_EX_STORAGE_DEV_MISS]) /* Build Power capping error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_GRPCAP_ERR, diag_ex_status[DIAG_EX_GRPCAP_ERR]) /* Build IML recorded errors sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_IML_ERR, diag_ex_status[DIAG_EX_IML_ERR]) /* Build Duplicate management IP address sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DUP_MGMT_IP_ADDR, diag_ex_status[DIAG_EX_DUP_MGMT_IP_ADDR]) return SA_OK; } /** * build_discovered_server_rdr_arr * @oh_handler: Pointer to openhpi handler * @con: Pointer to the soap client handler. * @bay_number: Pointer to the soap client handler. * @response: Server blade info response structure * @resource_id: Resource id * @name: Blade resource name * @build_sensor: Flag to build sensors * * Purpose: * Populate the server blade RDR. * Pushes the RDR entry to plugin RPTable * * Detailed Description: * - Creates the inventory RDR * - Creates the temperature, power, operational status, predictive * failure, internal data error, management processor error, thermal * warning, thermal danger, IO configuration error, device power request * error, insufficient cooling, device location error, device failure * error, device degraded error, device missing, device bonding, device * power sequence, network configuration, profile unassigned error, * device not supported, too low power request, call HP, storage device * missing, power capping error, IML recorded errors, duplicate * management IP address sensor RDR * - Creates UID and power control RDR * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_OUT_OF_MEMORY - on malloc failure * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT build_discovered_server_rdr_arr(struct oh_handler_state *oh_handler, SOAP_CON *con, SaHpiInt32T bay_number, SaHpiResourceIdT resource_id, char *name, int build_sensors, struct bladeInfo *result, struct bladeStatus *status_response, struct bladePortMap *pm_response) { SaErrorT rv = SA_OK; SaHpiRdrT rdr; SaHpiRptEntryT *rpt = NULL; struct oa_soap_inventory *inventory = NULL; struct oa_soap_sensor_info *sensor_info = NULL; struct getBladeThermalInfoArray thermal_request; struct bladeThermalInfoArrayResponse thermal_response; SaHpiInt32T sensor_status; enum diagnosticStatus diag_ex_status[OA_SOAP_MAX_DIAG_EX]; if (oh_handler == NULL || con == NULL) { err("Invalid parameter"); return SA_ERR_HPI_INVALID_PARAMS; } rpt = oh_get_resource_by_id (oh_handler->rptcache, resource_id); if (rpt == NULL) { err("INVALID RESOURCE"); return SA_ERR_HPI_INVALID_RESOURCE; } /* Build inventory rdr for server */ memset(&rdr, 0, sizeof(SaHpiRdrT)); rv = build_server_inv_rdr_arr(oh_handler, con, bay_number, &rdr, &inventory,result, pm_response); if (rv != SA_OK) { err("Failed to get server inventory RDR in slot %d", bay_number); return rv; } rv = oh_add_rdr(oh_handler->rptcache, resource_id, &rdr, inventory, 0); if (rv != SA_OK) { err("Failed to add rdr"); return rv; } /* Make a soap call to OA requesting for the server thermal status */ thermal_request.bayNumber = bay_number; rv = soap_getBladeThermalInfoArray(con, &thermal_request, &thermal_response); if (rv != SOAP_OK) { err("getBladeThermalInfoArray failed for blade"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Build the thermal sensors based on the blade name*/ rv = oa_soap_build_blade_thermal_rdr(oh_handler, thermal_response, rpt, name); if (rv != SA_OK) { err("Failed to build thermal rdr"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Build power sensor rdr for server */ OA_SOAP_BUILD_SENSOR_RDR(OA_SOAP_SEN_PWR_STATUS) /* Create power control RDR only for server blades. IO and Storage blades don't support power management. */ if (rpt->ResourceEntity.Entry[0].EntityType == SAHPI_ENT_SYSTEM_BLADE) { /* Build power control rdr for server */ OA_SOAP_BUILD_CONTROL_RDR(OA_SOAP_PWR_CNTRL, 0, 0) } /* Build UID control rdr for server */ OA_SOAP_BUILD_CONTROL_RDR(OA_SOAP_UID_CNTRL, 0, 0) if(build_sensors != TRUE) return SA_OK; /* Build operational status sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_OPER_STATUS, status_response->operationalStatus) /* Build predictive failure sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_PRED_FAIL, status_response->operationalStatus) /* Build internal data error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_INT_DATA_ERR, status_response->diagnosticChecks. internalDataError) /* Build management processor error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_MP_ERR, status_response->diagnosticChecks. managementProcessorError) /* Build thermal waring sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_THERM_WARN, status_response->diagnosticChecks. thermalWarning) /* Build thermal danger sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_THERM_DANGER, status_response->diagnosticChecks. thermalDanger) /* Build IO configuration error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_IO_CONFIG_ERR, status_response->diagnosticChecks. ioConfigurationError) /* Build device power request error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_PWR_REQ, status_response->diagnosticChecks. devicePowerRequestError) /* Build insufficient cooling sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_INSUF_COOL, status_response->diagnosticChecks. insufficientCooling) /* Build device location error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_LOC_ERR, status_response->diagnosticChecks. deviceLocationError) /* Build device failure error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_FAIL, status_response->diagnosticChecks. deviceFailure) /* Build device degraded error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_DEGRAD, status_response->diagnosticChecks. deviceDegraded) /* Parse the diganosticChecksEx */ oa_soap_parse_diag_ex(status_response->diagnosticChecksEx, diag_ex_status); /* Build device missing sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_MISS, diag_ex_status[DIAG_EX_DEV_MISS]) /* Build device bonding sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_BOND, diag_ex_status[DIAG_EX_DEV_BOND]) /* Build device power sequence sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_PWR_SEQ, diag_ex_status[DIAG_EX_DEV_PWR_SEQ]) /* Build network configuration sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_NET_CONFIG, diag_ex_status[DIAG_EX_NET_CONFIG]) /* Build profile unassigned error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_PROF_UNASSIGN_ERR, diag_ex_status[DIAG_EX_PROF_UNASSIGN_ERR]) /* Build Device not supported sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_NOT_SUPPORT, diag_ex_status[DIAG_EX_DEV_NOT_SUPPORT]) /* Build Too low power request sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_TOO_LOW_PWR_REQ, diag_ex_status[DIAG_EX_TOO_LOW_PWR_REQ]) /* Build Call HP sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_CALL_HP, diag_ex_status[DIAG_EX_CALL_HP]) /* Build Storage device missing sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_STORAGE_DEV_MISS, diag_ex_status[DIAG_EX_STORAGE_DEV_MISS]) /* Build Power capping error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_GRPCAP_ERR, diag_ex_status[DIAG_EX_GRPCAP_ERR]) /* Build IML recorded errors sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_IML_ERR, diag_ex_status[DIAG_EX_IML_ERR]) /* Build Duplicate management IP address sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DUP_MGMT_IP_ADDR, diag_ex_status[DIAG_EX_DUP_MGMT_IP_ADDR]) return SA_OK; } /** * discover_server * @oh_handler: Pointer to openhpi handler * * Purpose: * Discover the server. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT discover_server(struct oh_handler_state *oh_handler) { SaErrorT rv = SA_OK; SaHpiInt32T i = 0, max_bays = 0; struct oa_soap_handler *oa_handler = NULL; struct bladeInfo info_result; struct bladeStatus sts_result; struct bladePortMap pm_result; SaHpiResourceIdT resource_id; char blade_name[MAX_NAME_LEN]; struct getBladeInfoArrayResponse info_response; struct getBladeStsArrayResponse sts_response; struct getBladePortMapArrayResponse pm_response; xmlDocPtr bl_info_doc = NULL; xmlDocPtr bl_sts_doc = NULL; xmlDocPtr bl_pm_doc = NULL; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; max_bays = oa_handler->oa_soap_resources.server.max_bays; /* Get blade info array information*/ rv = oa_soap_get_bladeinfo_arr( oa_handler, max_bays, &info_response, bl_info_doc); if (rv != SA_OK) { err("Failed to get blade info array"); xmlFreeDoc(bl_info_doc); return rv; } rv = oa_soap_get_bladests_arr( oa_handler ,max_bays ,&sts_response, bl_sts_doc); if (rv != SA_OK) { err("Failed to get blade status array"); xmlFreeDoc(bl_sts_doc); xmlFreeDoc(bl_info_doc); return rv; } rv = oa_soap_get_portmap_arr( oa_handler ,max_bays ,&pm_response, bl_pm_doc); if (rv != SA_OK) { err("Failed to get blade portmap array"); xmlFreeDoc(bl_pm_doc); xmlFreeDoc(bl_sts_doc); xmlFreeDoc(bl_info_doc); return rv; } /* Discover the blades present in server bays */ while ( info_response.bladeInfoArray && sts_response.bladeStsArray && pm_response.portMapArray ){ parse_bladeInfo(info_response.bladeInfoArray,&info_result); parse_bladeStatus(sts_response.bladeStsArray,&sts_result); parse_bladePortMap(pm_response.portMapArray,&pm_result); if (info_result.presence != PRESENT) { /* If resource not present, continue checking for * next bay */ info_response.bladeInfoArray = soap_next_node(info_response.bladeInfoArray); sts_response.bladeStsArray = soap_next_node(sts_response.bladeStsArray); pm_response.portMapArray = soap_next_node(pm_response.portMapArray); continue; } /* Copy the blade name from response for future processing */ convert_lower_to_upper(info_result.name, strlen(info_result.name), blade_name, MAX_NAME_LEN); /* Build rpt entry for server */ i = info_result.bayNumber; rv = build_discovered_server_rpt(oh_handler, &info_result, &resource_id, &sts_result); if (rv != SA_OK) { err("Failed to get Server rpt for bay %d.",i); xmlFreeDoc(bl_info_doc); return SA_ERR_HPI_INTERNAL_ERROR; } /* Update resource_status structure with resource_id, * serial_number, and presence status */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.server, i, info_result.serialNumber, resource_id, RES_PRESENT); /* Build rdr entry for server */ rv = build_discovered_server_rdr_arr(oh_handler, oa_handler->active_con, i, resource_id, blade_name, TRUE,&info_result, &sts_result,&pm_result); if (rv != SA_OK) { err("Failed to add Server rdr"); /* Reset resource_status structure to default values */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.server, i, "", SAHPI_UNSPECIFIED_RESOURCE_ID, RES_ABSENT); xmlFreeDoc(bl_info_doc); xmlFreeDoc(bl_sts_doc); xmlFreeDoc(bl_pm_doc); return SA_ERR_HPI_INTERNAL_ERROR; } info_response.bladeInfoArray = soap_next_node( info_response.bladeInfoArray); sts_response.bladeStsArray = soap_next_node(sts_response.bladeStsArray); pm_response.portMapArray = soap_next_node(pm_response.portMapArray); } /* End of while loop */ xmlFreeDoc(bl_info_doc); xmlFreeDoc(bl_sts_doc); xmlFreeDoc(bl_pm_doc); return SA_OK; } /** * build_inserted_intr_rpt * @oh_handler: Pointer to openhpi handler * @con: Pointer to the soap client handler. * @name: Pointer to the name of the interconnect blade * @bay_number: Bay number of the interconnect blade * @resource_id: Pointer to the resource id * @insetred: flag to indicate if the switch blade is inserted. * TRUE inserted * FALSE not inserted (discovered or re-discovered) * * Purpose: * Populate the interconnect RPT. This routine gets called when a switch * blade is discovered as well as inserted. Hotswap information is * initialized differently for these two cases. * Pushes the RPT entry to plugin RPTable * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_OUT_OF_MEMORY - on malloc failure * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT build_inserted_intr_rpt(struct oh_handler_state *oh_handler, SOAP_CON *con, char *name, SaHpiInt32T bay_number, SaHpiResourceIdT *resource_id, int inserted) { SaErrorT rv = SA_OK; SaHpiEntityPathT entity_path; SaHpiPowerStateT state; char *entity_root = NULL; struct oa_soap_hotswap_state *hotswap_state = NULL; SaHpiRptEntryT rpt; char temp[MAX_NAME_LEN]; struct oa_soap_handler *oa_handler; if (oh_handler == NULL || con == NULL || name == NULL || resource_id == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; if(oa_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } entity_root = (char *) g_hash_table_lookup(oh_handler->config, "entity_root"); rv = oh_encode_entitypath(entity_root, &entity_path); if (rv != SA_OK) { err("Encoding entity path failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Populate the rpt with the details of the interconnect */ memset(&rpt, 0, sizeof(SaHpiRptEntryT)); rpt.ResourceCapabilities = SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESET | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_POWER | SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_MANAGED_HOTSWAP | SAHPI_CAPABILITY_SENSOR | SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_INVENTORY_DATA; rpt.ResourceEntity.Entry[1].EntityType = SAHPI_ENT_ROOT; rpt.ResourceEntity.Entry[1].EntityLocation = 0; rpt.ResourceEntity.Entry[0].EntityType = SAHPI_ENT_SWITCH_BLADE; rpt.ResourceEntity.Entry[0].EntityLocation = bay_number; rv = oh_concat_ep(&(rpt.ResourceEntity), &entity_path); if (rv != SA_OK) { err("concat of entity path failed"); return SA_ERR_HPI_INTERNAL_ERROR; } rpt.ResourceId = oh_uid_from_entity_path(&(rpt.ResourceEntity)); /* Check whether the interconnect blade is from Cisco Systems * TODO: Cisco interconnect blades will have name starting with "Cisco" * If this format gets changed for any reason, * then Cisco interconnect blades will have manufacture id as HP * in ManufacturerId field of rpt entry. * If the interconnect name format changes, * please change the logic accordingly. */ convert_lower_to_upper(name, strlen(name), temp, MAX_NAME_LEN); if (strstr(temp, CISCO) != NULL) rpt.ResourceInfo.ManufacturerId = CISCO_MANUFACTURING_ID; else rpt.ResourceInfo.ManufacturerId = HP_MANUFACTURING_ID; rpt.ResourceSeverity = SAHPI_OK; rpt.ResourceFailed = SAHPI_FALSE; rpt.HotSwapCapabilities = SAHPI_HS_CAPABILITY_AUTOEXTRACT_READ_ONLY; rpt.ResourceTag.DataType = SAHPI_TL_TYPE_TEXT; rpt.ResourceTag.Language = SAHPI_LANG_ENGLISH; oa_soap_trim_whitespace(name); rpt.ResourceTag.DataLength = strlen(name); memset(rpt.ResourceTag.Data, 0, SAHPI_MAX_TEXT_BUFFER_LENGTH); snprintf((char *) (rpt.ResourceTag.Data), rpt.ResourceTag.DataLength + 1, "%s", name); hotswap_state = (struct oa_soap_hotswap_state *) g_malloc0(sizeof(struct oa_soap_hotswap_state)); if (hotswap_state == NULL) { err("Out of memory"); return SA_ERR_HPI_OUT_OF_MEMORY; } /* Get the power state of the interconnect blade to determine * the hotswap state. The hotswap state of the interconnect * shall be maintained in a private data area of the * interconnect RPT. */ rv = get_interconnect_power_state(con, bay_number, &state); if (rv != SA_OK) { err("Unable to get power status for interconnect Bay %d", bay_number); return rv; } if (inserted == TRUE && state == SAHPI_POWER_ON) { hotswap_state->currentHsState = SAHPI_HS_STATE_ACTIVE; } else if (inserted == TRUE) { /* The interconnect takes nearly 3 seconds to power on after * insertion. Intialize the current hotswap state as * change is handled as part of interconnect status events. */ hotswap_state->currentHsState = SAHPI_HS_STATE_INSERTION_PENDING; } else { switch (state) { case SAHPI_POWER_ON: hotswap_state->currentHsState = SAHPI_HS_STATE_ACTIVE; break; case SAHPI_POWER_OFF: hotswap_state->currentHsState = SAHPI_HS_STATE_INACTIVE; break; case SAHPI_POWER_CYCLE: default: err("Wrong power state %d detected for " "interconnect bay %d", state, bay_number); wrap_g_free(hotswap_state); return SA_ERR_HPI_INTERNAL_ERROR; } } /* Add the interconnect rpt to the plugin RPTable */ rv = oh_add_resource(oh_handler->rptcache, &rpt, hotswap_state, 0); if (rv != SA_OK) { err("Failed to add Interconnect RPT"); wrap_g_free(hotswap_state); return rv; } *resource_id = rpt.ResourceId; return SA_OK; } /** * build_discovered_intr_rpt * @oh_handler: Pointer to openhpi handler * @name: Pointer to the name of the interconnect blade * @bay_number: Bay number of the interconnect blade * @resource_id: Pointer to the resource id * @response: pointer to response structure from tray status call * * Purpose: * Populate the (re)discovered interconnect RPT. This routine gets called * only when a switch blade is (re)discovered. * Pushes the RPT entry to plugin RPTable * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_OUT_OF_MEMORY - on malloc failure * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT build_discovered_intr_rpt(struct oh_handler_state *oh_handler, char *name, SaHpiInt32T bay_number, SaHpiResourceIdT *resource_id, struct interconnectTrayStatus *response) { SaErrorT rv = SA_OK; SaHpiEntityPathT entity_path; char *entity_root = NULL; struct oa_soap_hotswap_state *hotswap_state = NULL; SaHpiRptEntryT rpt; char temp[MAX_NAME_LEN]; struct oa_soap_handler *oa_handler; if (oh_handler == NULL || name == NULL || resource_id == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; if(oa_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } entity_root = (char *) g_hash_table_lookup(oh_handler->config, "entity_root"); rv = oh_encode_entitypath(entity_root, &entity_path); if (rv != SA_OK) { err("Encoding entity path failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Populate the rpt with the details of the interconnect */ memset(&rpt, 0, sizeof(SaHpiRptEntryT)); rpt.ResourceCapabilities = SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESET | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_POWER | SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_MANAGED_HOTSWAP | SAHPI_CAPABILITY_SENSOR | SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_INVENTORY_DATA; rpt.ResourceEntity.Entry[1].EntityType = SAHPI_ENT_ROOT; rpt.ResourceEntity.Entry[1].EntityLocation = 0; rpt.ResourceEntity.Entry[0].EntityType = SAHPI_ENT_SWITCH_BLADE; rpt.ResourceEntity.Entry[0].EntityLocation = bay_number; rv = oh_concat_ep(&(rpt.ResourceEntity), &entity_path); if (rv != SA_OK) { err("concat of entity path failed"); return SA_ERR_HPI_INTERNAL_ERROR; } rpt.ResourceId = oh_uid_from_entity_path(&(rpt.ResourceEntity)); /* Check whether the interconnect blade is from Cisco Systems * TODO: Cisco interconnect blades will have name starting with "Cisco" * If this format gets changed for any reason, * then Cisco interconnect blades will have manufacture id as HP * in ManufacturerId field of rpt entry. * If the interconnect name format changes, * please change the logic accordingly. */ convert_lower_to_upper(name, strlen(name), temp, MAX_NAME_LEN); if (strstr(temp, CISCO) != NULL) rpt.ResourceInfo.ManufacturerId = CISCO_MANUFACTURING_ID; else rpt.ResourceInfo.ManufacturerId = HP_MANUFACTURING_ID; rpt.ResourceSeverity = SAHPI_OK; rpt.ResourceFailed = SAHPI_FALSE; rpt.HotSwapCapabilities = SAHPI_HS_CAPABILITY_AUTOEXTRACT_READ_ONLY; rpt.ResourceTag.DataType = SAHPI_TL_TYPE_TEXT; rpt.ResourceTag.Language = SAHPI_LANG_ENGLISH; oa_soap_trim_whitespace(name); rpt.ResourceTag.DataLength = strlen(name); memset(rpt.ResourceTag.Data, 0, SAHPI_MAX_TEXT_BUFFER_LENGTH); snprintf((char *) (rpt.ResourceTag.Data), rpt.ResourceTag.DataLength + 1, "%s", name); hotswap_state = (struct oa_soap_hotswap_state *) g_malloc0(sizeof(struct oa_soap_hotswap_state)); if (hotswap_state == NULL) { err("Out of memory"); return SA_ERR_HPI_OUT_OF_MEMORY; } /* Get the power state of the interconnect blade to determine * the hotswap state. The hotswap state of the interconnect * shall be maintained in a private data area of the * interconnect RPT. */ switch (response->powered) { case (POWER_ON): hotswap_state->currentHsState = SAHPI_HS_STATE_ACTIVE; break; case (POWER_OFF): case (POWER_UNKNOWN): hotswap_state->currentHsState=SAHPI_HS_STATE_INACTIVE; break; case (POWER_REBOOT): err("Wrong (REBOOT) Power State detected"); wrap_g_free(hotswap_state); return SA_ERR_HPI_INTERNAL_ERROR; break; default: err("Unknown Power State %d detected for interconnect " "in bay %d", response->powered, bay_number); wrap_g_free(hotswap_state); return SA_ERR_HPI_INTERNAL_ERROR; } /* Add the interconnect rpt to the plugin RPTable */ rv = oh_add_resource(oh_handler->rptcache, &rpt, hotswap_state, 0); if (rv != SA_OK) { err("Failed to add Interconnect RPT"); wrap_g_free(hotswap_state); return rv; } *resource_id = rpt.ResourceId; return SA_OK; } /** * build_inserted_interconnect_rdr * @oh_handler: Pointer to openhpi handler * @con: Pointer to the soap client handler. * @bay_number: Interconnect bay number * @resource_id: Resource id * @build_sensors: Flag to build sensor RDR's for Interconnect tray status * * Purpose: * Populate the interconnect blade RDR. * Pushes the RDRs to plugin RPTable * * Detailed Description: * - Creates the inventory RDR * - Creates the temperature, operational status, predictive failure, * interconnect CPU fault, interconnect health LED, internal data error, * management processor error, thermal warning, thermal danger, IO * configuration error, device power request error, device failure error, * device degraded error, device not supported, device informational, * device missing, duplicate management IP address, health operational * status and health predictive failure sensor RDR * - Creates UID and power control RDR * - This funtion callers * discover_interconnect * process_interconnect_insertion_event * process_interconnect_info_event * add_interconnect * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT build_inserted_interconnect_rdr(struct oh_handler_state *oh_handler, SOAP_CON* con, SaHpiInt32T bay_number, SaHpiResourceIdT resource_id, int build_sensors) { SaErrorT rv = SA_OK; struct oa_soap_inventory *inventory = NULL; struct oa_soap_sensor_info *sensor_info = NULL; SaHpiRdrT rdr; struct getThermalInfo thermal_request; struct thermalInfo thermal_response; SaHpiBoolT event_support = SAHPI_FALSE; struct getInterconnectTrayStatus status_request; struct interconnectTrayStatus status_response; enum oa_soap_extra_data_health status; SaHpiInt32T sensor_status; enum diagnosticStatus diag_ex_status[OA_SOAP_MAX_DIAG_EX]; if (oh_handler == NULL || con == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } /* Build inventory rdr for interconnect */ memset(&rdr, 0, sizeof(SaHpiRdrT)); rv = build_interconnect_inv_rdr(oh_handler, con, bay_number, &rdr, &inventory); if (rv != SA_OK) { err("Failed to get interconnect inventory RDR"); return SA_ERR_HPI_INTERNAL_ERROR; } rv = oh_add_rdr(oh_handler->rptcache, resource_id, &rdr, inventory, 0); if (rv != SA_OK) { err("Failed to add rdr"); return rv; } /* Make a soap call to OA requesting for the interconnect * thermal status */ thermal_request.sensorType = SENSOR_TYPE_INTERCONNECT; thermal_request.bayNumber = bay_number; rv = soap_getThermalInfo(con, &thermal_request, &thermal_response); if (rv != SOAP_OK) { err("Get thermalInfo failed for interconnect"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Turn event support ON for thermal sensor. * Interconnect is the only resource for which the OA supports * thermal events */ event_support = SAHPI_TRUE; /* Build thermal sensor rdr for interconnect */ OA_SOAP_BUILD_THRESHOLD_SENSOR_RDR(OA_SOAP_SEN_TEMP_STATUS, thermal_response) /* Build power control rdr for server */ OA_SOAP_BUILD_CONTROL_RDR(OA_SOAP_PWR_CNTRL, 0, 0) /* Build UID control rdr for server */ OA_SOAP_BUILD_CONTROL_RDR(OA_SOAP_UID_CNTRL, 0, 0) if(build_sensors == TRUE){ status_request.bayNumber = bay_number; rv = soap_getInterconnectTrayStatus(con, &status_request, &status_response); if (rv != SOAP_OK) { err("Get Interconnect tray status SOAP call failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Build operational status sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_OPER_STATUS, status_response.operationalStatus) /* Build predictive failure sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_PRED_FAIL, status_response.operationalStatus) /* Build interconnect CPU fault sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_CPU_FAULT, status_response.cpuFault) /* Build interconnect health LED sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_HEALTH_LED, status_response.healthLed) /* Build internal data error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_INT_DATA_ERR, status_response.diagnosticChecks. internalDataError) /* Build management processor error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_MP_ERR, status_response.diagnosticChecks. managementProcessorError) /* Build thermal waring sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_THERM_WARN, status_response.diagnosticChecks. thermalWarning) /* Build thermal danger sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_THERM_DANGER, status_response.diagnosticChecks. thermalDanger) /* Build IO configuration error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_IO_CONFIG_ERR, status_response.diagnosticChecks. ioConfigurationError) /* Build device power request error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_PWR_REQ, status_response.diagnosticChecks. devicePowerRequestError) /* Build device failure error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_FAIL, status_response.diagnosticChecks. deviceFailure) /* Build device degraded error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_DEGRAD, status_response.diagnosticChecks. deviceDegraded) /* Parse the diganosticChecksEx structure */ oa_soap_parse_diag_ex(status_response.diagnosticChecksEx, diag_ex_status); /* Build device not supported sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_NOT_SUPPORT, diag_ex_status[DIAG_EX_DEV_NOT_SUPPORT]) /* Build Device informational sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_INFO, diag_ex_status[DIAG_EX_DEV_INFO]) /* Build Storage device missing sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_STORAGE_DEV_MISS, diag_ex_status[DIAG_EX_STORAGE_DEV_MISS]) /* Build Duplicate management IP address sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DUP_MGMT_IP_ADDR, diag_ex_status[DIAG_EX_DUP_MGMT_IP_ADDR]) /* Get the healthStatus enum from extraData structure */ oa_soap_get_health_val(status_response.extraData, &status); /* Build health status operational sensor */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_HEALTH_OPER, status) /* Build health status predictive failure sensor */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_HEALTH_PRED_FAIL, status) } return SA_OK; } /** * build_discovered_intr_rdr_arr * @oh_handler: Pointer to openhpi handler * @con: Pointer to the soap client handler. * @bay_number: Interconnect bay number * @resource_id: Resource id * @build_sensors: Flag to build sensor RDR's for Interconnect tray status * @info_response: Pointer to interconnectTrayInfo response structure * @status_response: Pointer to interconnectTrayStatus response structure * @pm_response: Pointer to interconnectTrayPortMap response structure * * Purpose: * Populate the interconnect blade RDR. * Pushes the RDRs to plugin RPTable * * Detailed Description: * - Creates the inventory RDR * - Creates the temperature, operational status, predictive failure, * interconnect CPU fault, interconnect health LED, internal data error, * management processor error, thermal warning, thermal danger, IO * configuration error, device power request error, device failure error, * device degraded error, device not supported, device informational, * device missing, duplicate management IP address, health operational * status and health predictive failure sensor RDR * - Creates UID and power control RDR * - This funtion callers * discover_interconnect * process_interconnect_insertion_event * process_interconnect_info_event * add_interconnect * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT build_discovered_intr_rdr_arr(struct oh_handler_state *oh_handler, SOAP_CON* con, SaHpiInt32T bay_number, SaHpiResourceIdT resource_id, int build_sensors, struct interconnectTrayInfo *info_response, struct interconnectTrayStatus *status_response, struct interconnectTrayPortMap *pm_response) { SaErrorT rv = SA_OK; struct oa_soap_inventory *inventory = NULL; struct oa_soap_sensor_info *sensor_info = NULL; SaHpiRdrT rdr; struct getThermalInfo thermal_request; struct thermalInfo thermal_response; SaHpiBoolT event_support = SAHPI_FALSE; enum oa_soap_extra_data_health status; SaHpiInt32T sensor_status; enum diagnosticStatus diag_ex_status[OA_SOAP_MAX_DIAG_EX]; if (oh_handler == NULL || con == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } /* Build inventory rdr for interconnect */ memset(&rdr, 0, sizeof(SaHpiRdrT)); rv = build_interconnect_inv_rdr_arr(oh_handler, bay_number, &rdr, &inventory,info_response, pm_response); if (rv != SA_OK) { err("Failed to build interconnect inventory RDR"); return SA_ERR_HPI_INTERNAL_ERROR; } rv = oh_add_rdr(oh_handler->rptcache, resource_id, &rdr, inventory, 0); if (rv != SA_OK) { err("Failed to add rdr"); return rv; } /* Make a soap call to OA requesting for the interconnect * thermal status */ thermal_request.sensorType = SENSOR_TYPE_INTERCONNECT; thermal_request.bayNumber = bay_number; rv = soap_getThermalInfo(con, &thermal_request, &thermal_response); if (rv != SOAP_OK) { err("Get thermalInfo failed for interconnect"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Turn event support ON for thermal sensor. * Interconnect is the only resource for which the OA supports * thermal events */ event_support = SAHPI_TRUE; /* Build thermal sensor rdr for interconnect */ OA_SOAP_BUILD_THRESHOLD_SENSOR_RDR(OA_SOAP_SEN_TEMP_STATUS, thermal_response) /* Build power control rdr for server */ OA_SOAP_BUILD_CONTROL_RDR(OA_SOAP_PWR_CNTRL, 0, 0) /* Build UID control rdr for server */ OA_SOAP_BUILD_CONTROL_RDR(OA_SOAP_UID_CNTRL, 0, 0) if(build_sensors == TRUE){ /* Build operational status sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_OPER_STATUS, status_response->operationalStatus) /* Build predictive failure sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_PRED_FAIL, status_response->operationalStatus) /* Build interconnect CPU fault sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_CPU_FAULT, status_response->cpuFault) /* Build interconnect health LED sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_HEALTH_LED, status_response->healthLed) /* Build internal data error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_INT_DATA_ERR, status_response->diagnosticChecks. internalDataError) /* Build management processor error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_MP_ERR, status_response->diagnosticChecks. managementProcessorError) /* Build thermal waring sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_THERM_WARN, status_response->diagnosticChecks. thermalWarning) /* Build thermal danger sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_THERM_DANGER, status_response->diagnosticChecks. thermalDanger) /* Build IO configuration error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_IO_CONFIG_ERR, status_response->diagnosticChecks. ioConfigurationError) /* Build device power request error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_PWR_REQ, status_response->diagnosticChecks. devicePowerRequestError) /* Build device failure error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_FAIL, status_response->diagnosticChecks. deviceFailure) /* Build device degraded error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_DEGRAD, status_response->diagnosticChecks. deviceDegraded) /* Parse the diganosticChecksEx structure */ oa_soap_parse_diag_ex(status_response->diagnosticChecksEx, diag_ex_status); /* Build device not supported sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_NOT_SUPPORT, diag_ex_status[DIAG_EX_DEV_NOT_SUPPORT]) /* Build Device informational sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_INFO, diag_ex_status[DIAG_EX_DEV_INFO]) /* Build Storage device missing sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_STORAGE_DEV_MISS, diag_ex_status[DIAG_EX_STORAGE_DEV_MISS]) /* Build Duplicate management IP address sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DUP_MGMT_IP_ADDR, diag_ex_status[DIAG_EX_DUP_MGMT_IP_ADDR]) /* Get the healthStatus enum from extraData structure */ oa_soap_get_health_val(status_response->extraData, &status); /* Build health status operational sensor */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_HEALTH_OPER, status) /* Build health status predictive failure sensor */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_HEALTH_PRED_FAIL, status) } return SA_OK; } /** * discover_interconnect * @oh_handler: Pointer to openhpi handler * * Purpose: * Discover the interconnect blade. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT discover_interconnect(struct oh_handler_state *oh_handler) { SaErrorT rv = SA_OK; SaHpiInt32T i = 0, max_bays = 0; struct interconnectTrayInfo info_result; struct interconnectTrayStatus status_result; struct interconnectTrayPortMap portmap; struct oa_soap_handler *oa_handler = NULL; SaHpiResourceIdT resource_id; struct interconnectTrayInfoArrayResponse info_response; struct interconnectTrayStsArrayResponse sts_response; struct interconnectTrayPmArrayResponse pm_response; xmlDocPtr intr_info_doc = NULL; xmlDocPtr intr_sts_doc = NULL; xmlDocPtr intr_pm_doc = NULL; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; max_bays = oa_handler->oa_soap_resources.interconnect.max_bays; rv = oa_soap_get_interconct_traysts_arr(oa_handler ,max_bays , &sts_response,intr_sts_doc); if (rv != SA_OK) { err("Failed to get interconnect tray status array"); xmlFreeDoc( intr_sts_doc); return rv; } rv = oa_soap_get_interconct_trayinfo_arr(oa_handler ,max_bays, &info_response,intr_info_doc); if (rv != SA_OK) { err("Failed to get interconnect tray info array"); xmlFreeDoc( intr_info_doc); xmlFreeDoc( intr_sts_doc); return rv; } rv = oa_soap_get_interconct_traypm_arr(oa_handler ,max_bays, &pm_response,intr_pm_doc); if (rv != SA_OK) { err("Failed to get interconnect tray portmap array"); xmlFreeDoc( intr_pm_doc); xmlFreeDoc( intr_info_doc); xmlFreeDoc( intr_sts_doc); return rv; } while(sts_response.interconnectTrayStsArray){ parse_interconnectTrayStatus( sts_response.interconnectTrayStsArray,&status_result); parse_interconnectTrayInfo( info_response.interconnectTrayInfoArray,&info_result); parse_interconnectTrayPortMap( pm_response.interconnectTrayPmArray,&portmap); /* If resource not present, continue checking for next bay */ if (status_result.presence != PRESENT) { sts_response.interconnectTrayStsArray = soap_next_node( sts_response.interconnectTrayStsArray); info_response.interconnectTrayInfoArray = soap_next_node( info_response.interconnectTrayInfoArray); pm_response.interconnectTrayPmArray = soap_next_node( pm_response.interconnectTrayPmArray); continue; } i = status_result.bayNumber; /* Build rpt entry for interconnect */ rv = build_discovered_intr_rpt(oh_handler, info_result.name, i, &resource_id, &status_result); if (rv != SA_OK) { err("Failed to get interconnect RPT"); xmlFreeDoc( intr_info_doc); xmlFreeDoc( intr_sts_doc); xmlFreeDoc( intr_pm_doc); return rv; } /* Update resource_status structure with resource_id, * serial_number, and presence status */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.interconnect, i, info_result.serialNumber, resource_id, RES_PRESENT); /* Build rdr entry for interconnect */ rv = build_discovered_intr_rdr_arr(oh_handler, oa_handler->active_con, i, resource_id, TRUE, &info_result, &status_result, &portmap); if (rv != SA_OK) { err("Failed to get interconnect RDR"); /* Reset resource_status structure to default values */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.interconnect, i, "", SAHPI_UNSPECIFIED_RESOURCE_ID, RES_ABSENT); xmlFreeDoc( intr_info_doc); xmlFreeDoc( intr_sts_doc); xmlFreeDoc( intr_pm_doc); return rv; } sts_response.interconnectTrayStsArray = soap_next_node( sts_response.interconnectTrayStsArray); info_response.interconnectTrayInfoArray = soap_next_node( info_response.interconnectTrayInfoArray); pm_response.interconnectTrayPmArray = soap_next_node( pm_response.interconnectTrayPmArray); } xmlFreeDoc( intr_info_doc); xmlFreeDoc( intr_sts_doc); xmlFreeDoc( intr_pm_doc); return SA_OK; } /** * build_power_subsystem_rpt * @oh_handler: Pointer to openhpi handler * @name: Pointer to the name of the Power subsystem * @resource_id: Pointer to the resource id * * Purpose: * Populate the power supply RPT. * Pushes the RPT entry to plugin RPTable * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT build_power_subsystem_rpt(struct oh_handler_state *oh_handler, char *name, SaHpiResourceIdT *resource_id) { SaErrorT rv = SA_OK; SaHpiEntityPathT entity_path; char *entity_root = NULL; SaHpiRptEntryT rpt; if (oh_handler == NULL || name == NULL || resource_id == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } /* Fetch and encode the entity path required for the rpt field */ entity_root = (char *) g_hash_table_lookup(oh_handler->config, "entity_root"); rv = oh_encode_entitypath(entity_root, &entity_path); if (rv != SA_OK) { err("Encoding entity path failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Populate the rpt with the details of the power subsystem */ memset(&rpt, 0, sizeof(SaHpiRptEntryT)); rpt.ResourceCapabilities = SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR | SAHPI_CAPABILITY_CONTROL; rpt.ResourceEntity.Entry[1].EntityType = SAHPI_ENT_ROOT; rpt.ResourceEntity.Entry[1].EntityLocation = 0; rpt.ResourceEntity.Entry[0].EntityType = SAHPI_ENT_POWER_MGMNT; rpt.ResourceEntity.Entry[0].EntityLocation = 1; rv = oh_concat_ep(&(rpt.ResourceEntity), &entity_path); if (rv != SA_OK) { err("concat of entity path failed"); return SA_ERR_HPI_INTERNAL_ERROR; } rpt.ResourceId = oh_uid_from_entity_path(&(rpt.ResourceEntity)); rpt.ResourceInfo.ManufacturerId = HP_MANUFACTURING_ID; rpt.ResourceSeverity = SAHPI_OK; rpt.ResourceFailed = SAHPI_FALSE; rpt.HotSwapCapabilities = 0x0; rpt.ResourceTag.DataType = SAHPI_TL_TYPE_TEXT; rpt.ResourceTag.Language = SAHPI_LANG_ENGLISH; oa_soap_trim_whitespace(name); rpt.ResourceTag.DataLength = strlen(name); memset(rpt.ResourceTag.Data, 0, SAHPI_MAX_TEXT_BUFFER_LENGTH); snprintf((char *) (rpt.ResourceTag.Data), rpt.ResourceTag.DataLength + 1, "%s", name); /* Add the power subsystem rpt to the plugin RPTable */ rv = oh_add_resource(oh_handler->rptcache, &rpt, NULL, 0); if (rv != SA_OK) { err("Failed to add Power Subsystem RPT"); return rv; } *resource_id = rpt.ResourceId; return SA_OK; } /** * build_power_subsystem_rdr * @oh_handler: Pointer to openhpi handler * @resource_id: Resource id * * Purpose: * Populate the power supply RDR. * Pushes the RDR entry to plugin RPTable * * Detailed Description: * - Creates the input power, output power, power status, power capacity, * operational status, predictive failure and redundancy sensor RDR * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT build_power_subsystem_rdr(struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id) { SaErrorT rv = SA_OK; SaHpiRdrT rdr; struct oa_soap_sensor_info *sensor_info = NULL; struct oa_soap_handler *oa_handler; struct powerSubsystemInfo response; SaHpiInt32T sensor_status; struct powerConfigInfo *power_config_info; struct powerCapConfig *power_cap_config; xmlNode *extra_data; struct extraDataInfo extra_data_info; if (oh_handler == NULL) { err("Invalid parameter"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; power_config_info = &(oa_handler->power_config_info); power_cap_config = &(oa_handler->power_cap_config); /* Initialize user's desired static power limit - and dynamic */ /* power cap to zero to start with */ oa_handler->desired_static_pwr_limit = 0; oa_handler->desired_dynamic_pwr_cap = 0; /* Build the input power sensor RDR */ OA_SOAP_BUILD_SENSOR_RDR(OA_SOAP_SEN_IN_PWR) /* Build the ouput power sensor RDR */ OA_SOAP_BUILD_SENSOR_RDR(OA_SOAP_SEN_OUT_PWR) /* Build the power consumed sensor RDR */ OA_SOAP_BUILD_SENSOR_RDR(OA_SOAP_SEN_PWR_STATUS) /* Build the power capacity sensor RDR */ OA_SOAP_BUILD_SENSOR_RDR(OA_SOAP_SEN_PWR_CAPACITY) /* Make a soap call to get the enclosure power config info */ rv = soap_getPowerConfigInfo(oa_handler->active_con, power_config_info, &(oa_handler->desired_static_pwr_limit)); if (rv != SOAP_OK) { err("build_power_subsystem get power config info failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Make a soap call to get the enclosure power cap config */ rv = soap_getPowerCapConfig(oa_handler->active_con, power_cap_config, &(oa_handler->desired_dynamic_pwr_cap), &(oa_handler->desired_derated_circuit_cap), &(oa_handler->desired_rated_circuit_cap)); if (rv != SOAP_OK) { err("build_power_subsystem get power cap config failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Build power mode control rdr for Enclosure */ OA_SOAP_BUILD_CONTROL_RDR(OA_SOAP_PWR_MODE_CNTRL, 0, 0) /* Build dynamic power control rdr for Enclosure */ OA_SOAP_BUILD_CONTROL_RDR(OA_SOAP_DYNAMIC_PWR_CNTRL, 0, 0); /* Build power limit mode control rdr for Enclosure */ OA_SOAP_BUILD_CONTROL_RDR(OA_SOAP_PWR_LIMIT_MODE_CNTRL, 0, 0) rv = soap_getPowerSubsystemInfo(oa_handler->active_con, &response); if (rv != SOAP_OK) { err("Get power subsystem info SOAP call failed"); return SA_ERR_HPI_INTERNAL_ERROR; } power_config_info->ACLimitLow = 0; power_config_info->ACLimitHigh = 0; extra_data = response.extraData; while (extra_data) { soap_getExtraData(extra_data, &extra_data_info); if (!(strcmp(extra_data_info.name, "ACLimitLow"))) { power_config_info->ACLimitLow = atoi(extra_data_info.value); } if (!(strcmp(extra_data_info.name, "ACLimitHigh"))) { power_config_info->ACLimitHigh = atoi(extra_data_info.value); } extra_data = soap_next_node(extra_data); } /* Build operational status sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_OPER_STATUS, response.operationalStatus) /* Build predictive failure sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_PRED_FAIL, response.operationalStatus) /* Build redundancy sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_REDUND, response.redundancy) /* Build static power limit control for Enclosure */ OA_SOAP_BUILD_CONTROL_RDR(OA_SOAP_STATIC_PWR_LIMIT_CNTRL, power_config_info->ACLimitLow, power_config_info->ACLimitHigh) /* Build dynamic power cap config control rdr for Enclosure */ OA_SOAP_BUILD_CONTROL_RDR(OA_SOAP_DYNAMIC_PWR_CAP_CNTRL, power_cap_config->enclosurePowerCapLowerBound, power_cap_config->enclosurePowerCapUpperBound); /* These controls are only available on OA firmware 3.00 and higher */ if (oa_handler->active_fm_ver >= 3.0) { /* Build derated circuit cap control rdr for Enclosure */ OA_SOAP_BUILD_CONTROL_RDR(OA_SOAP_DERATED_CIRCUIT_CAP_CNTRL, power_cap_config->deratedCircuitCapLowerBound, power_cap_config->deratedCircuitCapUpperBound); /* Build rated circuit cap control rdr for Enclosure */ OA_SOAP_BUILD_CONTROL_RDR(OA_SOAP_RATED_CIRCUIT_CAP_CNTRL, power_cap_config->ratedCircuitCapLowerBound, power_cap_config->ratedCircuitCapUpperBound); } return SA_OK; } /** * discover_power_subsystem * @oh_handler: Pointer to openhpi handler * * Purpose: * Discover the power supply. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT discover_power_subsystem(struct oh_handler_state *oh_handler) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler = NULL; char power_subsystem[] = POWER_SUBSYSTEM_NAME; SaHpiResourceIdT resource_id; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; /* Build rpt entry for power sub system */ rv = build_power_subsystem_rpt(oh_handler, power_subsystem, &resource_id); if (rv != SA_OK) { err("build power subsystem rpt failed"); return rv; } /* save power subsystem resource id */ oa_handler->oa_soap_resources.power_subsystem_rid = resource_id; /* Build rdr entry for power sub system*/ rv = build_power_subsystem_rdr(oh_handler, resource_id); if (rv != SA_OK) { err("build power subsystem RDR failed"); return rv; } return SA_OK; } /** * build_power_supply_rpt * @oh_handler: Pointer to openhpi handler * @name: Pointer to the name of the Power supply * @bay_number: Bay number of the Power supply * @resource_id: Pointer to resource id * * Purpose: * Populate the power supply unit RPT. * Pushes the RPT entry to plugin RPTable * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT build_power_supply_rpt(struct oh_handler_state *oh_handler, char *name, SaHpiInt32T bay_number, SaHpiResourceIdT *resource_id) { SaErrorT rv = SA_OK; SaHpiEntityPathT entity_path; char *entity_root = NULL; SaHpiRptEntryT rpt; if (oh_handler == NULL || name == NULL || resource_id == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } entity_root = (char *) g_hash_table_lookup(oh_handler->config, "entity_root"); rv = oh_encode_entitypath(entity_root, &entity_path); if (rv != SA_OK) { err("Encoding entity path failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Populate the rpt with the details of the power supply */ memset(&rpt, 0, sizeof(SaHpiRptEntryT)); rpt.ResourceCapabilities = SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_SENSOR | SAHPI_CAPABILITY_INVENTORY_DATA; rpt.ResourceEntity.Entry[2].EntityType = SAHPI_ENT_ROOT; rpt.ResourceEntity.Entry[2].EntityLocation = 0; rpt.ResourceEntity.Entry[1].EntityType = SAHPI_ENT_POWER_MGMNT; rpt.ResourceEntity.Entry[1].EntityLocation = 1; rpt.ResourceEntity.Entry[0].EntityType = SAHPI_ENT_POWER_SUPPLY; rpt.ResourceEntity.Entry[0].EntityLocation = bay_number; rv = oh_concat_ep(&rpt.ResourceEntity, &entity_path); if (rv != SA_OK) { err("concat of entity path failed"); return SA_ERR_HPI_INTERNAL_ERROR; } rpt.ResourceId = oh_uid_from_entity_path(&(rpt.ResourceEntity)); rpt.ResourceInfo.ManufacturerId = HP_MANUFACTURING_ID; rpt.ResourceSeverity = SAHPI_OK; rpt.ResourceFailed = SAHPI_FALSE; rpt.HotSwapCapabilities = 0x0; rpt.ResourceTag.DataType = SAHPI_TL_TYPE_TEXT; rpt.ResourceTag.Language = SAHPI_LANG_ENGLISH; oa_soap_trim_whitespace(name); rpt.ResourceTag.DataLength = strlen(name); memset(rpt.ResourceTag.Data, 0, SAHPI_MAX_TEXT_BUFFER_LENGTH); snprintf((char *) (rpt.ResourceTag.Data), rpt.ResourceTag.DataLength + 1, "%s", name); /* Add the power supply rpt to the plugin RPTable */ rv = oh_add_resource(oh_handler->rptcache, &rpt, NULL, 0); if (rv != SA_OK) { err("Failed to add power supply unit RPT"); return rv; } *resource_id = rpt.ResourceId; return SA_OK; } /** * build_power_supply_rdr * @oh_handler: Pointer to openhpi handler * @con: Pointer to the soap client handler. * @response: Power supply info response structure * @resource_id: Resource id * * Purpose: * Populate the power supply unit RDR. * Pushes the RDR entry to plugin RPTable * * Detailed Description: * - Creates the inventory RDR * - Creates the power status, operational status, predictive failure, * internal data error, device location error, device failure error, * device degraded error, AC failure, device not supported and device mix * match sensor RDR * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT build_power_supply_rdr(struct oh_handler_state *oh_handler, SOAP_CON *con, struct powerSupplyInfo *response, SaHpiResourceIdT resource_id) { SaErrorT rv = SA_OK; SaHpiRdrT rdr; struct oa_soap_inventory *inventory = NULL; struct oa_soap_sensor_info *sensor_info = NULL; struct getPowerSupplyStatus status_request; struct powerSupplyStatus status_response; SaHpiInt32T sensor_status; enum diagnosticStatus diag_ex_status[OA_SOAP_MAX_DIAG_EX]; if (oh_handler == NULL || con == NULL ) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } /* Build inventory rdr for power supply */ memset(&rdr, 0, sizeof(SaHpiRdrT)); rv = build_power_inv_rdr(oh_handler, response, &rdr, &inventory); if (rv != SA_OK) { err("Failed to get power supply unit inventory RDR"); return rv; } rv = oh_add_rdr(oh_handler->rptcache, resource_id, &rdr, inventory, 0); if (rv != SA_OK) { err("Failed to add rdr"); return rv; } /* Build power sensor rdr for power supply */ OA_SOAP_BUILD_SENSOR_RDR(OA_SOAP_SEN_PWR_STATUS) status_request.bayNumber = response->bayNumber; rv = soap_getPowerSupplyStatus(con, &status_request, &status_response); if (rv != SOAP_OK) { err("Get power supply status SOAP call failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Build operational status sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_OPER_STATUS, status_response.operationalStatus) /* Build predictive failure sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_PRED_FAIL, status_response.operationalStatus) /* Build internal data error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_INT_DATA_ERR, status_response.diagnosticChecks. internalDataError) /* Build device location error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_LOC_ERR, status_response.diagnosticChecks. deviceLocationError) /* Build device failure error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_FAIL, status_response.diagnosticChecks. deviceFailure) /* Build device degraded error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_DEGRAD, status_response.diagnosticChecks. deviceDegraded) /* Build AC failure sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_AC_FAIL, status_response.diagnosticChecks. acFailure) /* Parse the diganosticChecksEx */ oa_soap_parse_diag_ex(status_response.diagnosticChecksEx, diag_ex_status); /* Build Device not supported sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_NOT_SUPPORT, diag_ex_status[DIAG_EX_DEV_NOT_SUPPORT]) /* Build Device mix match sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_MIX_MATCH, diag_ex_status[DIAG_EX_DEV_MIX_MATCH]) return SA_OK; } /** * build_discovered_ps_rdr_arr * @oh_handler: Pointer to openhpi handler * @response: Power supply info response structure * @resource_id: Resource id * @status_response: Pointer to PS status response structure * * Purpose: * Populate the power supply unit RDR. * Pushes the RDR entry to plugin RPTable * * Detailed Description: * - Creates the inventory RDR * - Creates the power status, operational status, predictive failure, * internal data error, device location error, device failure error, * device degraded error, AC failure, device not supported and device mix * match sensor RDR * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT build_discovered_ps_rdr_arr(struct oh_handler_state *oh_handler, struct powerSupplyInfo *response, SaHpiResourceIdT resource_id, struct powerSupplyStatus *status_response) { SaErrorT rv = SA_OK; SaHpiRdrT rdr; struct oa_soap_inventory *inventory = NULL; struct oa_soap_sensor_info *sensor_info = NULL; SaHpiInt32T sensor_status; enum diagnosticStatus diag_ex_status[OA_SOAP_MAX_DIAG_EX]; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } /* Build inventory rdr for power supply */ memset(&rdr, 0, sizeof(SaHpiRdrT)); rv = build_power_inv_rdr(oh_handler, response, &rdr, &inventory); if (rv != SA_OK) { err("Failed to get power supply unit inventory RDR"); return rv; } rv = oh_add_rdr(oh_handler->rptcache, resource_id, &rdr, inventory, 0); if (rv != SA_OK) { err("Failed to add rdr"); return rv; } /* Build power sensor rdr for power supply */ OA_SOAP_BUILD_SENSOR_RDR(OA_SOAP_SEN_PWR_STATUS) /* Build operational status sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_OPER_STATUS, status_response->operationalStatus) /* Build predictive failure sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_PRED_FAIL, status_response->operationalStatus) /* Build internal data error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_INT_DATA_ERR, status_response->diagnosticChecks. internalDataError) /* Build device location error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_LOC_ERR, status_response->diagnosticChecks. deviceLocationError) /* Build device failure error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_FAIL, status_response->diagnosticChecks. deviceFailure) /* Build device degraded error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_DEGRAD, status_response->diagnosticChecks. deviceDegraded) /* Build AC failure sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_AC_FAIL, status_response->diagnosticChecks. acFailure) /* Parse the diganosticChecksEx */ oa_soap_parse_diag_ex(status_response->diagnosticChecksEx, diag_ex_status); /* Build Device not supported sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_NOT_SUPPORT, diag_ex_status[DIAG_EX_DEV_NOT_SUPPORT]) /* Build Device mix match sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_MIX_MATCH, diag_ex_status[DIAG_EX_DEV_MIX_MATCH]) return SA_OK; } /** * discover_power_supply * @oh_handler: Pointer to openhpi handler * * Purpose: * Discover the power supply. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. * SA_ERR_HPI_OUT_OF_MEMORY - on out of memory. **/ SaErrorT discover_power_supply(struct oh_handler_state *oh_handler) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler = NULL; SaHpiInt32T i = 0, max_bays = 0; struct powerSupplyInfo *result = NULL; struct powerSupplyStatus sts_res; char power_supply[] = POWER_SUPPLY_NAME; SaHpiResourceIdT resource_id; struct getPowerSupplyInfoArrayResponse info_response; struct getPowerSupplyStsArrayResponse sts_response; xmlDocPtr ps_info_doc = NULL; xmlDocPtr ps_sts_doc = NULL; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; max_bays = oa_handler->oa_soap_resources.ps_unit.max_bays; result = (struct powerSupplyInfo *)g_malloc0(sizeof(struct powerSupplyInfo)); if( result == NULL){ return SA_ERR_HPI_OUT_OF_MEMORY; } rv = oa_soap_get_ps_info_arr ( oa_handler ,max_bays ,&info_response, ps_info_doc); if( rv != SA_OK) { err("Failed to get power supply info array"); wrap_g_free(result); xmlFreeDoc( ps_info_doc); return rv; } rv = oa_soap_get_ps_sts_arr ( oa_handler ,max_bays , &sts_response, ps_sts_doc); if( rv != SA_OK) { err("Failed to get power supply status array"); wrap_g_free(result); xmlFreeDoc( ps_info_doc); xmlFreeDoc( ps_sts_doc); return rv; } while( info_response.powerSupplyInfoArray && sts_response.powerSupplyStsArray) { result->presence = PRESENCE_NO_OP; result->modelNumber[0] = '\0'; result->sparePartNumber[0] = '\0'; result->serialNumber[0] = '\0'; result->productName[0] = '\0'; parse_powerSupplyInfo( info_response.powerSupplyInfoArray,result); parse_powerSupplyStatus( sts_response.powerSupplyStsArray, &sts_res); /* If resource not present, continue checking for next bay */ if (result->presence != PRESENT){ info_response.powerSupplyInfoArray = soap_next_node(info_response.powerSupplyInfoArray); sts_response.powerSupplyStsArray = soap_next_node( sts_response.powerSupplyStsArray); continue; } /* If the power supply unit does not have the power cord * plugged in, then power supply unit will be in faulty * condition. If the power supply is reported as PRESENT by OA * then add the power supply to the RPT */ i = result->bayNumber; if (result->serialNumber[0] == '\0') { strcpy((char *)result->serialNumber, "Not_Reported"); WARN("No Serial Number reported for PSU in slot %d",i); } /* Build the rpt entry for power supply unit */ rv = build_power_supply_rpt(oh_handler, power_supply, i, &resource_id); if (rv != SA_OK) { err("build power supply unit rpt failed"); wrap_g_free(result); xmlFreeDoc( ps_info_doc); xmlFreeDoc( ps_sts_doc); return rv; } /* Update resource_status structure with resource_id, * serial_number, and presence status */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.ps_unit, i, result->serialNumber, resource_id, RES_PRESENT); /* Build the rdr entry for power supply */ rv = build_discovered_ps_rdr_arr(oh_handler, result, resource_id, &sts_res); if (rv != SA_OK) { err("build power supply unit RDR failed"); /* Reset resource_status structure to default values */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.ps_unit, i, "", SAHPI_UNSPECIFIED_RESOURCE_ID, RES_ABSENT); wrap_g_free(result); xmlFreeDoc( ps_info_doc); xmlFreeDoc( ps_sts_doc); return rv; } info_response.powerSupplyInfoArray = soap_next_node(info_response.powerSupplyInfoArray); sts_response.powerSupplyStsArray = soap_next_node(sts_response.powerSupplyStsArray); } wrap_g_free(result); xmlFreeDoc(ps_info_doc); xmlFreeDoc(ps_sts_doc); return SA_OK; } /** * oa_soap_parse_diag_ex * @diag_ex : Pointer to diganosticChecksEx structure * @diag_status_arr: Pointer to array of enum oa_soap_diag_ex * * Purpose: * Parses the diagnosticChecksEx structure and extracts the value. * * Detailed Description: * The fields of diagnosticChecksEx structure appear and disappear * depending on the resource configuration and status. If a field is not * available in the diagnosticChecksEx structure, then its value is * considered as NO_ERROR. * This function parses the diagnosticChecksEx structure and gets the value * for the avaiable fields. * * Return values: * NONE **/ void oa_soap_parse_diag_ex(xmlNode *diag_ex, enum diagnosticStatus *diag_status_arr) { struct diagnosticData diag_data; SaHpiInt32T i; if (diag_status_arr == NULL) { err("Invalid parameters"); return; } /* Initialize the value array to NO_ERROR. * The diagnosticChecksEx fields will change depending on the * configuration and status. Hence, if one of more fields are not * present, then it is considered not faulty */ for (i = 0; i < OA_SOAP_MAX_DIAG_EX; i++) { diag_status_arr[i] = NO_ERROR; } while (diag_ex) { soap_getDiagnosticChecksEx(diag_ex, &diag_data); for (i = 0; i < OA_SOAP_MAX_DIAG_EX; i++) { /* Compare the diagnosticChecksEx field name with field * names in the array. */ if (! strcmp(diag_data.name, oa_soap_diag_ex_arr[i])) { diag_status_arr[i] = diag_data.value; break; } } diag_ex = soap_next_node(diag_ex); } return; } /** * oa_soap_get_health_val * @extra_data: Pointer to extraData structure * @status : Pointer to enum oa_soap_extra_data_health * * Purpose: * Parses the healthStatus field in extraData structure and extracts the * value. * * Detailed Description: * The fields of extraData structure appear and disappear depending on the * resource configuration and status. If healthStatus field is not * available in the extraData structure, then its value is considered as OK * This function parses the extraData structure and gets the value * of the healthStatus field. * * Return values: * NONE **/ void oa_soap_get_health_val(xmlNode *extra_data, enum oa_soap_extra_data_health *status) { struct extraDataInfo extra_data_info; SaHpiInt32T i; if (status == NULL) { err("Invalid parameters"); return; } /* Initialize status to OK */ *status = HEALTH_OK; while (extra_data) { soap_getExtraData(extra_data, &extra_data_info); /* Check for the healthStatus field */ if (! (strcmp(extra_data_info.name, OA_SOAP_HEALTH_STATUS_STR))) { /* Got the healthStatus field */ for (i = 0; i < OA_SOAP_MAX_HEALTH_ENUM; i++) { if (! strcmp(extra_data_info.value, oa_soap_health_arr[i])) { /* Assign the healthStatus enum value */ *status = i; break; } } } extra_data = soap_next_node(extra_data); } return; } /** * oa_soap_build_rpt * @oh_handler : Pointer to openhpi handler * @resource_type : Type of resource * @location : Device location * @rpt : Pointer to RPT entry * * Purpose: * Generic function to build the RPT entry from the global rpt array * * Detailed Description: * - Gets the RPT entry from the global rpt array * - Assigns the entity location in the entity path * - Generates the resource id * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT oa_soap_build_rpt(struct oh_handler_state *oh_handler, SaHpiInt32T resource_type, SaHpiInt32T location, SaHpiRptEntryT *rpt) { SaErrorT rv = SA_OK; SaHpiEntityPathT entity_path; char *entity_root = NULL; if (oh_handler == NULL || rpt == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } entity_root = (char *) g_hash_table_lookup(oh_handler->config, "entity_root"); rv = oh_encode_entitypath(entity_root, &entity_path); if (rv != SA_OK) { err("Encoding entity path failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Populate the rpt with the details of the thermal subsystem */ memset(rpt, 0, sizeof(SaHpiRptEntryT)); *rpt = oa_soap_rpt_arr[resource_type]; rv = oh_concat_ep(&(rpt->ResourceEntity), &entity_path); if (rv != SA_OK) { err("concatenation of entity path failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Set the device location in RPT entry */ if (location) rpt->ResourceEntity.Entry[0].EntityLocation = location; rpt->ResourceId = oh_uid_from_entity_path(&(rpt->ResourceEntity)); return SA_OK; } /** * oa_soap_build_therm_subsys_rdr * @oh_handler: Pointer to openhpi handler * @resource_id: Resource id * * Purpose: * Populate the thermal subsystem RDR. * Pushes the RDR entry to plugin RPTable * * Detailed Description: * Creates the operational status, predictive failure and redundancy * sensor RDR * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ static SaErrorT oa_soap_build_therm_subsys_rdr(struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id) { SaErrorT rv = SA_OK; SaHpiRdrT rdr; struct thermalSubsystemInfo response; struct oa_soap_handler *oa_handler = NULL; struct oa_soap_sensor_info *sensor_info = NULL; SaHpiInt32T sensor_status; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; rv = soap_getThermalSubsystemInfo(oa_handler->active_con, &response); if (rv != SOAP_OK) { err("Get thermal subsystem info failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Build operational status sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_OPER_STATUS, response.operationalStatus) /* Build predictive failure sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_PRED_FAIL, response.operationalStatus) /* Build internal data error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_REDUND, response.redundancy) return SA_OK; } /** * oa_soap_disc_therm_subsys * @oh_handler: Pointer to openhpi handler * * Purpose: * Discover the thermal subsystem. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ static SaErrorT oa_soap_disc_therm_subsys(struct oh_handler_state *oh_handler) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler = NULL; SaHpiRptEntryT rpt; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; /* Build the rpt entry for thermal subsystem */ rv = oa_soap_build_rpt(oh_handler, OA_SOAP_ENT_THERM_SUBSYS, 0, &rpt); if (rv != SA_OK) { err("Build thermal subsystem rpt failed"); return rv; } /* Add the thermal subsystem rpt to the plugin RPTable */ rv = oh_add_resource(oh_handler->rptcache, &rpt, NULL, 0); if (rv != SA_OK) { err("Failed to add thermal subsystem RPT"); return rv; } /* Build the rdr entry for thermal subsystem */ rv = oa_soap_build_therm_subsys_rdr(oh_handler, rpt.ResourceId); if (rv != SA_OK) { err("Build thermal subsystem RDR failed"); return rv; } /* Update resource_status structure with resource_id */ oa_handler->oa_soap_resources.thermal_subsystem_rid = rpt.ResourceId; return SA_OK; } /** * oa_soap_build_fz_rdr * @oh_handler: Pointer to openhpi handler * @resource_id: Resource id * @fan_zone : Pointer to fanZone structure * * Purpose: * Populate the fan zone RDR. * Pushes the RDR entry to plugin RPTable * * Detailed Description: * Creates the operational status, predictive failure and redundancy * sensor RDR * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ static SaErrorT oa_soap_build_fz_rdr(struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, struct fanZone *fan_zone) { SaErrorT rv = SA_OK; SaHpiRdrT rdr; struct oa_soap_sensor_info *sensor_info = NULL; SaHpiInt32T sensor_status; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } /* Build the fan zone inventory rdr */ rv = oa_soap_build_fz_inv(oh_handler, resource_id, fan_zone); if (rv != SA_OK) { err("Building inventory RDR for Fan Zone failed"); return rv; } /* Build operational status sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_OPER_STATUS, fan_zone->operationalStatus) /* Build predictive failure sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_PRED_FAIL, fan_zone->operationalStatus) /* Build redundancy sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_REDUND, fan_zone->redundant) return SA_OK; } /** * oa_soap_get_fz * @oh_handler: Pointer to openhpi handler * @max_fz : Maximum fan zone supported by the enclosure * @response : Pointer to getFanZoneArrayResponse structure * * Purpose: * Gets the fan zone array information * * Detailed Description: * - Creates the request for getFanZoneArray SOAP call based on the maximum * fan zones * - Makes the getFanZoneArray SOAP call * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT oa_soap_get_fz_arr(struct oa_soap_handler *oa_handler, SaHpiInt32T max_fz, struct getFanZoneArrayResponse *response) { SaErrorT rv; struct getFanZoneArray request; struct bayArray bay_zones; SaHpiInt32T i; byte array[max_fz]; if (oa_handler == NULL || response == NULL) { err("Invalid parameter"); return SA_ERR_HPI_INVALID_PARAMS; } /* Create the bayArray for fanZoneArray request */ for (i = 1; i <= max_fz; i++) { array[i - 1] = i; } bay_zones.array = array; bay_zones.size = max_fz; request.bayArray = bay_zones; rv = soap_getFanZoneArray(oa_handler->active_con, &request, response); if (rv != SOAP_OK) { err("Get fan zone array SOAP call failed"); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } /** * oa_soap_disc_fz * @oh_handler: Pointer to openhpi handler * * Purpose: * Discover the fan zone. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ static SaErrorT oa_soap_disc_fz(struct oh_handler_state *oh_handler) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler = NULL; SaHpiRptEntryT rpt; struct fanZone fan_zone; struct getFanZoneArrayResponse response; SaHpiInt32T max_fz, zone_number; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; max_fz = oa_handler->oa_soap_resources.fan_zone.max_bays; /* Get the Fan Zone array information */ rv = oa_soap_get_fz_arr(oa_handler, max_fz, &response); if (rv != SA_OK) { err("Failed to get fan zone array"); return rv; } while (response.fanZoneArray) { soap_fanZone(response.fanZoneArray, &fan_zone); zone_number = fan_zone.zoneNumber; /* Build the rpt entry for fan zone */ rv = oa_soap_build_rpt(oh_handler, OA_SOAP_ENT_FZ, zone_number, &rpt); if (rv != SA_OK) { err("Build fan zone rpt has failed"); return rv; } /* Add the fan zone rpt to the plugin RPTable */ rv = oh_add_resource(oh_handler->rptcache, &rpt, NULL, 0); if (rv != SA_OK) { err("Failed to add fan zone RPT"); return rv; } /* Build the rdr entry for fan zone */ rv = oa_soap_build_fz_rdr(oh_handler, rpt.ResourceId, &fan_zone); if (rv != SA_OK) { err("Build fan zone RDR failed"); return rv; } /* Update resource_status structure with resource_id */ oa_handler->oa_soap_resources.fan_zone. resource_id[zone_number - 1] = rpt.ResourceId; response.fanZoneArray = soap_next_node(response.fanZoneArray); } return SA_OK; } /** * oa_soap_build_fan_rpt * @oh_handler : Pointer to openhpi handler * @bay_number : Bay number of the Fan * @resource_id : Pointer to the resource id * * Purpose: * Populate the fan RPT. * Pushes the RPT entry to plugin RPTable * * Detailed Description: * - Creates the Fan RPT entry from the global array * - Puts the primary fan zone number of this fan in entity path * - Pushes the RPT entry to plugin RPTable * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT oa_soap_build_fan_rpt(struct oh_handler_state *oh_handler, SaHpiInt32T bay_number, SaHpiResourceIdT *resource_id) { SaErrorT rv = SA_OK; SaHpiRptEntryT rpt; struct oa_soap_handler *oa_handler; if (oh_handler == NULL || resource_id == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; if(oa_handler->enc_type == OA_SOAP_ENC_C3000) rv = oa_soap_build_rpt(oh_handler, OA_SOAP_ENT_FAN_C3000, bay_number, &rpt); else rv = oa_soap_build_rpt(oh_handler, OA_SOAP_ENT_FAN, bay_number, &rpt); if (rv != SA_OK) { err("Build fan rpt has failed"); return rv; } /* Set the fan zone location in RPT entry */ rpt.ResourceEntity.Entry[1].EntityLocation = oa_soap_fz_map_arr[oa_handler->enc_type][bay_number-1].zone; /* Add the fan rpt to the plugin RPTable */ rv = oh_add_resource(oh_handler->rptcache, &rpt, NULL, 0); if (rv != SA_OK) { err("Failed to add fan RPT"); return rv; } *resource_id = rpt.ResourceId; return SA_OK; } /** * oa_soap_build_fan_rdr * @oh_handler: Pointer to openhpi handler * @con: Pointer to the soap client handler. * @response: Fan info response structure * @resource_id: Resource id * * Purpose: * - Creates the inventory RDR. * - Creates operational status, predictive failure, internal data error, * device location error, device failure error, device degraded and * device missing sensor RDR * - Pushes the RDRs to plugin RPTable * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT oa_soap_build_fan_rdr(struct oh_handler_state *oh_handler, SOAP_CON *con, struct fanInfo *response, SaHpiResourceIdT resource_id) { SaErrorT rv = SA_OK; SaHpiRdrT rdr; struct oa_soap_sensor_info *sensor_info = NULL; SaHpiInt32T sensor_status; enum diagnosticStatus diag_ex_status[OA_SOAP_MAX_DIAG_EX]; if (oh_handler == NULL || con == NULL || response == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } /* Build inventory rdr for fan */ memset(&rdr, 0, sizeof(SaHpiRdrT)); rv = oa_soap_build_fan_inv(oh_handler, resource_id, response); if (rv != SA_OK) { err("Failed to build fan inventory RDR"); return rv; } /* Build fan speed sensor rdr for fan */ OA_SOAP_BUILD_SENSOR_RDR(OA_SOAP_SEN_FAN_SPEED) /* Build power sensor rdr for fan */ OA_SOAP_BUILD_SENSOR_RDR(OA_SOAP_SEN_PWR_STATUS) /* Build operational status sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_OPER_STATUS, response->operationalStatus) /* Build predictive failure sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_PRED_FAIL, response->operationalStatus) /* Build internal data error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_INT_DATA_ERR, response->diagnosticChecks. internalDataError) /* Build device location error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_LOC_ERR, response->diagnosticChecks. deviceLocationError) /* Build device failure error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_FAIL, response->diagnosticChecks. deviceFailure) /* Build device degraded error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_DEGRAD, response->diagnosticChecks. deviceDegraded) oa_soap_parse_diag_ex(response->diagnosticChecksEx, diag_ex_status); /* Build device missing sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_MISS, diag_ex_status[DIAG_EX_DEV_MISS]) /* Build Device not supported sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_NOT_SUPPORT, diag_ex_status[DIAG_EX_DEV_NOT_SUPPORT]) /* Build Device mix match sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_MIX_MATCH, diag_ex_status[DIAG_EX_DEV_MIX_MATCH]) return SA_OK; } /** * oa_soap_disc_fan * @oh_handler: Pointer to openhpi handler * * Purpose: * Discover the fan. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ static SaErrorT oa_soap_disc_fan(struct oh_handler_state *oh_handler) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler = NULL; SaHpiInt32T i= 0,max_bays = 0; struct fanInfo result; SaHpiResourceIdT resource_id; struct getFanInfoArrayResponse response; xmlDocPtr fan_info_doc = NULL; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; max_bays = oa_handler->oa_soap_resources.fan.max_bays; rv = oa_soap_get_fan_info_arr ( oa_handler ,max_bays ,&response,fan_info_doc); if (rv != SA_OK) { err("Failed to get blade info array"); xmlFreeDoc(fan_info_doc); return rv; } while( response.fanInfoArray){ soap_fanInfo( response.fanInfoArray,&result); /* If resource not present, continue checking for next bay */ if (result.presence != PRESENT){ response.fanInfoArray = soap_next_node(response.fanInfoArray); continue; } i = result.bayNumber; rv = oa_soap_build_fan_rpt(oh_handler, i, &resource_id); if (rv != SA_OK) { err("Failed to build fan RPT"); xmlFreeDoc(fan_info_doc); return rv; } /* Update resource_status structure with resource_id, * serial_number, and presence status. Fan doesn't have a * serial number, so pass in a null string. */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.fan, i, NULL, resource_id, RES_PRESENT); rv = oa_soap_build_fan_rdr(oh_handler, oa_handler->active_con, &result, resource_id); if (rv != SA_OK) { err("Failed to build fan RDR"); /* Reset resource_status structure to default values */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.fan, i, NULL, SAHPI_UNSPECIFIED_RESOURCE_ID, RES_ABSENT); xmlFreeDoc(fan_info_doc); return rv; } response.fanInfoArray = soap_next_node(response.fanInfoArray); } xmlFreeDoc(fan_info_doc); return SA_OK; } /** * oa_soap_build_lcd_rdr * @oh_handler: Pointer to openhpi handler * @resource_id: resource id * * Purpose: * Builds the LCD RDR * * Detailed Description: * - Creates the inventory RDR * - Creates the operational status, predictive failure, internal data * error, device failure error, device degraded error, enclosure * aggregate operational status and enclosure aggregate predictive * failure sernsor RDR * - Pushes the RDR entry to plugin RPTable * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ static SaErrorT oa_soap_build_lcd_rdr(struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id) { SaErrorT rv = SA_OK; SaHpiRdrT rdr; struct oa_soap_handler *oa_handler = NULL; struct oa_soap_sensor_info *sensor_info = NULL; struct lcdStatus status; SaHpiInt32T sensor_status; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; /* Build the LCD inventory RDR */ rv = oa_soap_build_lcd_inv(oh_handler, resource_id); if (rv != SA_OK) { err("Building inventory RDR for LCD failed"); return rv; } /* Build LCD button lock control rdr */ OA_SOAP_BUILD_CONTROL_RDR(OA_SOAP_LCD_BUTN_LCK_CNTRL, 0, 0) /* Build operational status sensor rdr */ rv = soap_getLcdStatus(oa_handler->active_con, &status); if (rv != SOAP_OK) { err("Get LCD status SOAP call has failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Build operational status sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_OPER_STATUS, status.status) /* Build predictive failure sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_PRED_FAIL, status.status) /* Build internal data error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_INT_DATA_ERR, status.diagnosticChecks. internalDataError) /* Build device failure error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_FAIL, status.diagnosticChecks.deviceFailure) /* Build device degraded error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_DEGRAD, status.diagnosticChecks.deviceDegraded) /* Build enclosure aggregate operational status sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_ENC_AGR_OPER, status.lcdSetupHealth) /* Build enclosure aggregate predictive failure sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_ENC_AGR_PRED_FAIL, status.lcdSetupHealth) return SA_OK; } /** * oa_soap_disc_lcd * @oh_handler: Pointer to openhpi handler * * Purpose: * Discover the fan zone. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ static SaErrorT oa_soap_disc_lcd(struct oh_handler_state *oh_handler) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler = NULL; SaHpiRptEntryT rpt; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; /* Build the rpt entry for lcd */ rv = oa_soap_build_rpt(oh_handler, OA_SOAP_ENT_LCD, 0, &rpt); if (rv != SA_OK) { err("Build LCD rpt has failed"); return rv; } /* Add the LCD rpt to the plugin RPTable */ rv = oh_add_resource(oh_handler->rptcache, &rpt, NULL, 0); if (rv != SA_OK) { err("Failed to add LCD RPT"); return rv; } /* Build the rdr entry for LCD */ rv = oa_soap_build_lcd_rdr(oh_handler, rpt.ResourceId); if (rv != SA_OK) { err("Build LCD RDR failed"); return rv; } /* Update resource_status structure with resource_id */ oa_handler->oa_soap_resources.lcd_rid = rpt.ResourceId; return SA_OK; } /** * oa_soap_populate_event * @oh_handler: Pointer to openhpi handler * @resource_id: Resource Id * @event: Pointer to event structure * @assert_sensors: Pointer to GSList * * Purpose: * Populates the event structure with default values of the resource. * If sensor is in assert state, then pushes the asserted sensor RDR * to list. * * Detailed Description: * - Populates the event structure with default values of the resource * - If sensor is in assert state, then pushes the asserted sensor RDR to * assert sensor list. This list is used for generating the sensor assert * events * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT oa_soap_populate_event(struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, struct oh_event *event, GSList **assert_sensors) { SaHpiRptEntryT *rpt = NULL; SaHpiRdrT *rdr = NULL; struct oa_soap_sensor_info *sensor_info; SaHpiEventStateT state; SaHpiEventCategoryT evt_catg; if (oh_handler == NULL || event == NULL || assert_sensors == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); memset(event, 0, sizeof(struct oh_event)); event->event.Source = rpt->ResourceId; oh_gettimeofday(&event->event.Timestamp); event->event.Severity = rpt->ResourceSeverity; event->resource = *rpt; event->hid = oh_handler->hid; /* Get the first RDR */ rdr = oh_get_rdr_next(oh_handler->rptcache, rpt->ResourceId, SAHPI_FIRST_ENTRY); while (rdr) { /* Push the rdr to event rdrs list */ event->rdrs = g_slist_append(event->rdrs, g_memdup(rdr, sizeof(SaHpiRdrT))); /* Check whether the RDR is of type sensor */ if (rdr->RdrType == SAHPI_SENSOR_RDR) { sensor_info = (struct oa_soap_sensor_info*) oh_get_rdr_data(oh_handler->rptcache, resource_id, rdr->RecordId); /* Check whether the event is enabled or not */ if (sensor_info->event_enable == SAHPI_TRUE) { state = sensor_info->current_state; evt_catg = rdr->RdrTypeUnion.SensorRec.Category; /* Check whether the sensor current state is * asserted or not. Sensor is considered to be * in assert state, if any one of the following * 3 conditions are met: * * 1. event category = ENABLE and state = * DISABLED * 2. event category = PRED_FAIL and state = * PRED_FAILURE_ASSERT * 3. event category = THRESHOLD and state = * UPPER_MAJOR or _UPPER_CRIT */ if ( (evt_catg == SAHPI_EC_ENABLE && state == SAHPI_ES_DISABLED) || (evt_catg == SAHPI_EC_PRED_FAIL && state == SAHPI_ES_PRED_FAILURE_ASSERT) || (evt_catg == SAHPI_EC_REDUNDANCY && state == SAHPI_ES_REDUNDANCY_LOST) || (evt_catg == SAHPI_EC_THRESHOLD && (state == SAHPI_ES_UPPER_MAJOR || state == SAHPI_ES_UPPER_CRIT)) ) { /* Push the sensor rdr to assert sensor * list */ *assert_sensors = g_slist_append(*assert_sensors, g_memdup(rdr, sizeof(SaHpiRdrT))); } } } /* Get the next RDR */ rdr = oh_get_rdr_next(oh_handler->rptcache, rpt->ResourceId, rdr->RecordId); } return SA_OK; } /** * oa_soap_push_disc_res * @oh_handler: Pointer to openhpi handler * * Purpose: * Pushes the discovered resource entries to openhpi infrastructure * * Detailed Description: * - Get the rpt entry of the resources one by one. * - Creates the resource or hotswap event depending on the resource * hotswap capability * - Pushes the events to openhpi infrastructure * * Return values: * SA_OK - on success. * SA_ERR_HPI_OUT_OF_MEMORY - on out of memory * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ static void oa_soap_push_disc_res(struct oh_handler_state *oh_handler) { SaHpiRptEntryT *rpt = NULL; struct oh_event event; struct oa_soap_hotswap_state *hotswap_state = NULL; GSList *assert_sensor_list = NULL; if (oh_handler == NULL) { err("Invalid parameter"); return; } /* Get the first resource */ rpt = oh_get_resource_next(oh_handler->rptcache, SAHPI_FIRST_ENTRY); while (rpt) { /* Populate the event structure with default values and get the * asserted sensor list */ oa_soap_populate_event(oh_handler, rpt->ResourceId, &event, &assert_sensor_list); /* Check whether the resource has hotswap capability */ if (event.resource.ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP) { /* Get the hotswap state and fill the current * hotswap state */ hotswap_state = (struct oa_soap_hotswap_state *) oh_get_resource_data(oh_handler->rptcache, event.resource.ResourceId); if (hotswap_state == NULL) { err("Failed to get server hotswap state"); return; } event.event.EventType = SAHPI_ET_HOTSWAP; event.event.EventDataUnion.HotSwapEvent.HotSwapState = hotswap_state->currentHsState; event.event.EventDataUnion.HotSwapEvent. CauseOfStateChange = SAHPI_HS_CAUSE_UNKNOWN; } else if (event.resource.ResourceCapabilities & SAHPI_CAPABILITY_FRU) { /* The resource is FRU, but does not have hotswap * capability Fill the current hotswap state as ACTIVE. */ event.event.EventType = SAHPI_ET_HOTSWAP; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_ACTIVE; event.event.EventDataUnion.HotSwapEvent. CauseOfStateChange = SAHPI_HS_CAUSE_UNKNOWN; } else { /* The resource does not have FRU and hotswap * capabilities. Raise the resrouce event. */ event.event.EventType = SAHPI_ET_RESOURCE; event.event.EventDataUnion.ResourceEvent. ResourceEventType = SAHPI_RESE_RESOURCE_ADDED; } /* Push the event to OpenHPI */ oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); /* If the assert sensro list is not empty, raise the assert * sensor events */ if (assert_sensor_list != NULL) { /* Raise the assert sensor events */ oa_soap_assert_sen_evt(oh_handler, rpt, assert_sensor_list); /* Initialize the assert sensor list to NULL */ assert_sensor_list = NULL; /* Server memory error processing. This workaround ignores the return value */ oa_soap_server_mem_evt_discover(oh_handler, rpt); } /* Get the next resource */ rpt = oh_get_resource_next(oh_handler->rptcache, rpt->ResourceId); } /* End of while loop */ return; } /** * oa_soap_build_blade_thermal_rdr: * @oh_handler : Pointer to openhpi handler * @thermal_response : bladeThermalInfoArrayResponse response * structure * @rpt : Pointer to rpt structure * @name : Blade name * * Purpose: Builds the thermal sensors of blade resource * * Detailed Description: * - Parses the bladethermalInfoArray responses * - For a particular blade type, then thermal sensor rdrs are built * based on static information available in * "oa_soap_static_thermal_sensor_config" array for the blade type. * - While the sensors are being built, if the soap response is NULL then * the sensor is left in the disable state, else the response is verified * to check whether the sensor can be enabled for monitoring and is * enabled if monitoring is supported. * - The response contains thermal info for different components, zones * inside the blade. * - In addition, the bladeThermalInfo sensor of same type in response can * repeat (Like multiple system zones, cpu_zones, cpu information). * When there is such multiple instance of the bladeThermalInfo structure * in the response, sensor numbers are generated as follows: * For each sensor type, a base sensor number is defined * First occurrence of this sensor type in the response structure * is modeled with * sensor number = base sensor number * Any later occurrences of the same sensor type in response is * modeled with * sensor number = sensor number of previous instance of * the same sensor type + 1 * - Currently plugin considers maximum 4 occurrences of thermal info of * same sensor type for thermal sensor modeling(For example only 4 * system zone thermal sensors will be modeled even if the blade is able * to provide more than 4 thermal sensors of system zone type) * - Finally the bladeThermalInfo structure instance does not contain * any field identifier to unique distinguish itself into a particular * sensor type, hence the description field in the bladeThermalInfo * structure is used as the key to distinguish into particular sensor * type category. * - If this module is called during the discovery, then thermal sensors * rdr are built for sensors supported by blade * * Return values: * SA_OK - on success * SA_ERR_HPI_INTERNAL_ERROR - on failure **/ SaErrorT oa_soap_build_blade_thermal_rdr(struct oh_handler_state *oh_handler, struct bladeThermalInfoArrayResponse response, SaHpiRptEntryT *rpt, char *name) { SaErrorT rv = SA_OK; SaHpiBoolT bld_stable = SAHPI_FALSE; SaHpiInt32T i, j, sen_num, sen_count; enum oa_soap_blade_type bld_index = OTHER_BLADE_TYPE; SaHpiRdrT rdr; struct oa_soap_sensor_info *sensor_info = NULL; struct bladeThermalInfoArrayResponse temp_response; struct bladeThermalInfo bld_thrm_info; struct extraDataInfo extra_data_info; SaHpiSensorRecT *sensor = NULL; if (response.bladeThermalInfoArray != NULL) bld_stable = SAHPI_TRUE; /* Resolve the blade name to blade type enum . * If the blade name did not match any of the existing blade type * string, then it is considered OTHER_BLADE_TYPE */ for (i=0; i< OA_SOAP_MAX_BLD_TYPE -1 ; i++) { if (strstr(name, oa_soap_bld_type_str[i])) { bld_index = i; break; } } /* Fetch the thermal sensor information from static thermal sensor * meant for blade type under discovery */ for (i = 0; i < OA_SOAP_MAX_THRM_SEN; i++) { sen_count = oa_soap_static_thrm_sen_config[bld_index] [i].sensor_count; /* Do not add any sensor rdr if the sensor count is zero */ if (sen_count == 0) continue; for (j = 0; j< sen_count; j++) { memset(&rdr, 0, sizeof(SaHpiRdrT)); sen_num = oa_soap_static_thrm_sen_config[bld_index][i]. base_sen_num + j; rv = oa_soap_build_sen_rdr(oh_handler, rpt->ResourceId, &rdr, &sensor_info, sen_num); if (rv != SA_OK) { err("Failed to create rdr for sensor %x", sen_num); return rv; } /* Initialize the sensor enable state as disabled */ sensor_info->sensor_enable = SAHPI_FALSE; if (bld_stable == SAHPI_FALSE) { dbg("Blade not in stable state, leaving sensor" " in disable state"); } else { /* Call the following function to retrieve * the correct instance of bladeThermalInfo * response. */ temp_response = response; rv = oa_soap_get_bld_thrm_sen_data(sen_num, temp_response, &bld_thrm_info); if (rv != SA_OK) { err("Could not find the matching" " sensors info from blade"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Check for the "SensorPresent" value in * bladeThermalInfo structure. * If the value is true, then enable the sensor * built statically in previous step */ soap_getExtraData(bld_thrm_info.extraData, &extra_data_info); if ((extra_data_info.value != NULL) && (!(strcasecmp(extra_data_info.value, "true")))) { sensor_info->sensor_enable = SAHPI_TRUE; sensor = &(rdr.RdrTypeUnion.SensorRec); /* Updating the rdr with actual upper * critical threshold value provided by * OA */ sensor->DataFormat.Range.Max.Value. SensorFloat64 = sensor_info->threshold.UpCritical.Value. SensorFloat64 = bld_thrm_info.criticalThreshold; /* Updating the rdr with actual upper * caution threshold value provided by * OA */ sensor->DataFormat.Range.NormalMax. Value.SensorFloat64 = sensor_info->threshold.UpMajor.Value. SensorFloat64 = bld_thrm_info.cautionThreshold; } else { dbg("Sensor %s not enabled for blade", bld_thrm_info.description); } while (bld_thrm_info.extraData) { soap_getExtraData(bld_thrm_info.extraData, &extra_data_info); if (!(strcmp(extra_data_info.name, "idString"))) { oh_append_textbuffer(&(rdr.IdString), " - "); oh_append_textbuffer(&(rdr.IdString), extra_data_info.value); break; } bld_thrm_info.extraData = soap_next_node(bld_thrm_info.extraData); } } rv = oh_add_rdr(oh_handler->rptcache, rpt->ResourceId, &rdr, sensor_info, 0); if (rv != SA_OK) { err("Failed to add rdr"); return rv; } } } return SA_OK; } /** * oa_soap_modify_blade_thermal_rdr: * @oh_handler : Pointer to openhpi handler * @response : bladeThermalInfoArrayResponse response * structure * @rpt : Pointer to rpt structure * * Purpose: Modifies the thermal sensors of blade resource * * Detailed Description: * - Gets the first RDR by passing resource ID * - Checks for the Sensor Rdrs * - Checks for Blade Thermal Sensor Rdrs * - If the rdr is Blade Thermal Sensor rdr, calls the * oa_soap_get_bld_thrm_sen_data function to retrieve the correct * instance of bladeThermalInfo response * - Checks for the "SensorPresent" value in bladeThermalInfo structure. * If the value is true, then enable the sensor * - Updates the rdr with actual upper critical threshold and upper * caution threshold values provided by OA * - Checks for the "idString" string in bladeThermalInfo structure. * If the string is found, then update/replace the Blade Thermal * sensor rdr name present in rpt cache * - Constucts/sends an oh_event to update the Blade Thermal Sensor rdrs * if the sensor is updated * * Return values: * SA_OK - on success * SA_ERR_HPI_INTERNAL_ERROR - on failure **/ SaErrorT oa_soap_modify_blade_thermal_rdr(struct oh_handler_state *oh_handler, struct bladeThermalInfoArrayResponse response, SaHpiRptEntryT *rpt) { SaErrorT rv = SA_OK; SaHpiRdrT *rdr = NULL; struct bladeThermalInfo bld_thrm_info; struct extraDataInfo extra_data_info; struct oh_event event; struct oa_soap_sensor_info *sensor_info = NULL; SaHpiSensorRecT *sensor = NULL; int resource_updated = 0; SaHpiTextBufferT tmp_IdString; /* Get the first RDR */ rdr = oh_get_rdr_next(oh_handler->rptcache, rpt->ResourceId, SAHPI_FIRST_ENTRY); while(rdr) { if (rdr->RdrType == SAHPI_SENSOR_RDR) { if ((rdr->RdrTypeUnion.SensorRec.Num == OA_SOAP_SEN_TEMP_STATUS) || ((rdr->RdrTypeUnion.SensorRec.Num >= OA_SOAP_BLD_THRM_SEN_START) && (rdr->RdrTypeUnion.SensorRec.Num <= OA_SOAP_BLD_THRM_SEN_END))) { sensor_info = (struct oa_soap_sensor_info*) oh_get_rdr_data(oh_handler->rptcache, rpt->ResourceId, rdr->RecordId); /* Call the following function to retrieve * the correct instance of bladeThermalInfo * response. */ rv = oa_soap_get_bld_thrm_sen_data( rdr->RdrTypeUnion.SensorRec.Num, response, &bld_thrm_info); if (rv != SA_OK) { err("Could not find the" "matching sensor"); return SA_ERR_HPI_INTERNAL_ERROR; } while (bld_thrm_info.extraData) { /* Check for the "SensorPresent" value in * bladeThermalInfo structure. * If the value is true, then enable the sensor */ soap_getExtraData(bld_thrm_info. extraData, &extra_data_info); if (!(strcmp(extra_data_info.name, "SensorPresent")) && !(strcasecmp(extra_data_info.value, "true"))) { sensor_info->sensor_enable = SAHPI_TRUE; sensor = &(rdr->RdrTypeUnion.SensorRec); /* Updating the rdr with actual upper * critical threshold value provided by * OA */ sensor->DataFormat.Range.Max.Value. SensorFloat64 = sensor_info->threshold.UpCritical.Value. SensorFloat64 = bld_thrm_info.criticalThreshold; /* Updating the rdr with actual upper * caution threshold value provided by * OA */ sensor->DataFormat.Range.NormalMax. Value.SensorFloat64 = sensor_info->threshold.UpMajor.Value. SensorFloat64 = bld_thrm_info.cautionThreshold; } else { dbg("Sensor %s not enabled for blade", bld_thrm_info.description); } /* Check for the "idString" string in * bladeThermalInfo structure. * If the string is found, then update/replace the * Blade Thermal sensor rdr name present in cache */ if (!(strcmp(extra_data_info.name, "idString"))) { tmp_IdString = rdr->IdString; oh_init_textbuffer(&(rdr->IdString)); oh_append_textbuffer( &(rdr->IdString), bld_thrm_info.description); oh_append_textbuffer( &(rdr->IdString), " - "); oh_append_textbuffer( &(rdr->IdString), extra_data_info.value); if (strcmp((char *)tmp_IdString.Data, (char *)rdr->IdString.Data) != 0) resource_updated = 1; break; } bld_thrm_info.extraData = soap_next_node(bld_thrm_info.extraData); } /* We need to constuct/send an oh_event to update the * Blade Thermal Sensor rdrs */ if (resource_updated){ memset(&event, 0, sizeof(struct oh_event)); event.event.EventType = SAHPI_ET_RESOURCE; memcpy(&event.resource, rpt, sizeof(SaHpiRptEntryT)); event.event.Severity = SAHPI_INFORMATIONAL; event.event.Source = event.resource.ResourceId; if (oh_gettimeofday(&(event.event.Timestamp)) != SA_OK) { event.event.Timestamp = SAHPI_TIME_UNSPECIFIED; } event.event.EventDataUnion.ResourceEvent. ResourceEventType = SAHPI_RESE_RESOURCE_UPDATED; event.rdrs = g_slist_append(event.rdrs, g_memdup(rdr, sizeof(SaHpiRdrT))); event.hid = oh_handler->hid; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); resource_updated = 0; } } } /* Get the next RDR */ rdr = oh_get_rdr_next(oh_handler->rptcache, rpt->ResourceId, rdr->RecordId); } return SA_OK; } /** * oa_soap_get_ps_info_arr * @oa_handler: Pointer to openhpi handler * @max_bays : Maximum PS units supported by the enclosure * @response : Pointer to getPowerSupplyInfoArrayResponse structure * @ps_info_doc :Pointer to connection doc. * * Purpose: * Gets the PS array information * * Detailed Description: * - Creates the request for getPowerSupplyInfoArray SOAP call based * on the maximum PS units supported * - Makes the getPowerSupplyInfoArray SOAP call * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT oa_soap_get_ps_info_arr(struct oa_soap_handler *oa_handler, SaHpiInt32T max_bays, struct getPowerSupplyInfoArrayResponse *response, xmlDocPtr ps_info_doc) { SaErrorT rv = SA_OK; struct getPowerSupplyInfoArray request; struct bayArray bay_zones; SaHpiInt32T i = 0; byte array[max_bays]; if (oa_handler == NULL || response == NULL || ps_info_doc != NULL) { err("Invalid parameter"); return SA_ERR_HPI_INVALID_PARAMS; } /* Create the bayArray for PS info array request */ for (i = 1; i <= max_bays; i++) { array[i - 1] = i; } bay_zones.array = array; bay_zones.size = max_bays; request.bayArray = bay_zones; rv = soap_getPowerSupplyInfoArray(oa_handler->active_con, &request, response,ps_info_doc); if (rv != SOAP_OK) { err("Get powersupply info array SOAP call failed"); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } /** * oa_soap_get_ps_sts_arr * @oa_handler : Pointer to openhpi handler * @max_bays : Maximum PS units supported by the enclosure * @response : Pointer to getPowerSupplyStsArrayResponse structure * @ps_sts_doc : Pointer to connection doc. * * Purpose: * Gets the PS status array information * * Detailed Description: * - Creates the request for getPowerSupplyStsArray SOAP call based on the maximum * PS units supported * - Makes the getPowerSupplyStsArrayResponse SOAP call * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT oa_soap_get_ps_sts_arr(struct oa_soap_handler *oa_handler, SaHpiInt32T max_bays, struct getPowerSupplyStsArrayResponse *response, xmlDocPtr ps_sts_doc) { SaErrorT rv = SA_OK; struct getPowerSupplyStsArray request; struct bayArray bay_zones; SaHpiInt32T i = 0; byte array[max_bays]; if (oa_handler == NULL || response == NULL || ps_sts_doc != NULL) { err("Invalid parameter"); return SA_ERR_HPI_INVALID_PARAMS; } /* Create the bayArray for PS status array request */ for (i = 1; i <= max_bays; i++) { array[i - 1] = i; } bay_zones.array = array; bay_zones.size = max_bays; request.bayArray = bay_zones; rv = soap_getPowerSupplyStatusArray(oa_handler->active_con, &request, response,ps_sts_doc); if (rv != SOAP_OK) { err("Get powersupply status array SOAP call failed"); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } /** * oa_soap_get_fan_info_arr * @oa_handler: Pointer to openhpi handler * @max_bays : Maximum fan units supported by the enclosure * @response : Pointer to getFanInfoArrayResponse structure * @fan_info_doc :Pointer to connection doc. * * Purpose: * Gets the fan array information * * Detailed Description: * - Creates the request for getFanInfoArray SOAP call based on the * maximum fans * - Makes the getFanInfoArray SOAP call * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT oa_soap_get_fan_info_arr(struct oa_soap_handler *oa_handler, SaHpiInt32T max_bays, struct getFanInfoArrayResponse *response, xmlDocPtr fan_info_doc) { SaErrorT rv = SA_OK; struct getFanInfoArray request; struct bayArray bay_zones; SaHpiInt32T i = 0; byte array[max_bays]; if (oa_handler == NULL || response == NULL || fan_info_doc != NULL) { err("Invalid parameter"); return SA_ERR_HPI_INVALID_PARAMS; } /* Create the bayArray for faninfoArray request */ for (i = 1; i <= max_bays; i++) { array[i - 1] = i; } bay_zones.array = array; bay_zones.size = max_bays; request.bayArray = bay_zones; rv = soap_getFanInfoArray(oa_handler->active_con, &request, response,fan_info_doc); if (rv != SOAP_OK) { err("Get fan info array SOAP call failed"); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } /** * oa_soap_get_bladeinfo_arr * @oa_handler: Pointer to openhpi handler * @max_bays : Maximum blade servers supported by the enclosure * @response : Pointer to getBladeInfoArrayResponse structure * @bl_info_doc :Pointer to connection doc. * * Purpose: * Gets the blade array information * * Detailed Description: * - Creates the request for getBladeInfoArray SOAP call based on the * maximum blade servers * - Makes the getBladeInfoArray SOAP call * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT oa_soap_get_bladeinfo_arr(struct oa_soap_handler *oa_handler, SaHpiInt32T max_bays, struct getBladeInfoArrayResponse *response, xmlDocPtr bl_info_doc) { SaErrorT rv = SA_OK; struct getBladeInfoArray request; struct bayArray bay_zones; SaHpiInt32T i = 0; byte array[max_bays]; if (oa_handler == NULL || response == NULL || bl_info_doc != NULL ) { err("Invalid parameter"); return SA_ERR_HPI_INVALID_PARAMS; } /* Create the bayArray for bladeinfoArray request */ for (i = 1; i <= max_bays; i++) { array[i - 1] = i; } bay_zones.array = array; bay_zones.size = max_bays; request.bayArray = bay_zones; rv = soap_getBladeInfoArray(oa_handler->active_con, &request, response,bl_info_doc); if (rv != SOAP_OK) { err("Get blade info array SOAP call failed"); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } /** * oa_soap_get_interconct_trayinfo_arr * @oa_handler: Pointer to openhpi handler * @max_bays : Maximum interconnects supported by the enclosure * @response : Pointer to getInterconnectTrayInfoArrayResponse structure * @intr_info_doc :Pointer to connection doc. * * Purpose: * Gets the interconnect info array information * * Detailed Description: * - Creates the request for getInterConnectTrayInfoArray SOAP call * based on the maximum interconnects * - Makes the getInterConnectTrayInfoArray SOAP call * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT oa_soap_get_interconct_trayinfo_arr(struct oa_soap_handler *oa_handler, SaHpiInt32T max_bays, struct interconnectTrayInfoArrayResponse *response, xmlDocPtr intr_info_doc) { SaErrorT rv = SA_OK; struct getInterconnectTrayInfoArray request; struct bayArray bay_zones; SaHpiInt32T i = 0; byte array[max_bays]; if (oa_handler == NULL || response == NULL || intr_info_doc != NULL) { err("Invalid parameter"); return SA_ERR_HPI_INVALID_PARAMS; } /* Create the bayArray for interconnect tray infoarray request */ for (i = 1; i <= max_bays; i++) { array[i - 1] = i; } bay_zones.array = array; bay_zones.size = max_bays; request.bayArray = bay_zones; rv = soap_getInterconnectTrayInfoArray(oa_handler->active_con, &request, response,intr_info_doc); if (rv != SOAP_OK) { err("Get interconnect tray info array SOAP call failed"); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } /** * oa_soap_get_interconct_traysts_arr * @oa_handler : Pointer to openhpi handler * @max_bays : Maximum interconnects supported by the enclosure * @response : Pointer to getInterconnectTrayStatuaArrayResponse struct * @intr_sts_doc :Pointer to connection doc. * * Purpose: * Gets the interconnect array status * * Detailed Description: * - Creates the request for getInterConnectTrayStatusArray SOAP call * based on the maximum interconnects * - Makes the getInterConnectTrayStatusArray SOAP call * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT oa_soap_get_interconct_traysts_arr(struct oa_soap_handler *oa_handler, SaHpiInt32T max_bays, struct interconnectTrayStsArrayResponse *response, xmlDocPtr intr_sts_doc) { SaErrorT rv = SA_OK; struct interconnectTrayStsArray request; struct bayArray bay_zones; SaHpiInt32T i = 0; byte array[max_bays]; if (oa_handler == NULL || response == NULL || intr_sts_doc != NULL) { err("Invalid parameter"); return SA_ERR_HPI_INVALID_PARAMS; } /* Create the bayArray for interconnect tray status array request */ for (i = 1; i <= max_bays; i++) { array[i - 1] = i; } bay_zones.array = array; bay_zones.size = max_bays; request.bayArray = bay_zones; rv = soap_getInterconnectTrayStatusArray(oa_handler->active_con, &request, response,intr_sts_doc); if (rv != SOAP_OK) { err("Get interconnect tray status array SOAP call failed"); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } /** * oa_soap_get_interconct_traypm_arr * @oa_handler: Pointer to oa_handler for soap connection * @max_bays : Maximum Interconnects supported by the enclosure * @response : Pointer to interconnectTrayPmArrayResponse structure * @intr_pm_doc :Pointer to intr portmap doc. * * Purpose: * Gets the interconnect tray portmap information * * Detailed Description: * - Builds the array for all interconnects * - Issues an array call to get InterconnectTrayPortMapArray * - intr_pm_doc gets all the information * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT oa_soap_get_interconct_traypm_arr(struct oa_soap_handler *oa_handler, SaHpiInt32T max_bays, struct interconnectTrayPmArrayResponse *response, xmlDocPtr intr_pm_doc) { SaErrorT rv = SA_OK; struct interconnectTrayPmArray request; struct bayArray bay_zones; SaHpiInt32T i = 0; byte array[max_bays]; if (oa_handler == NULL || response == NULL || intr_pm_doc != NULL) { err("Invalid parameter"); return SA_ERR_HPI_INVALID_PARAMS; } /* Create the bayArray for interconnect tray portmap array request */ for (i = 1; i <= max_bays; i++) { array[i - 1] = i; } bay_zones.array = array; bay_zones.size = max_bays; request.bayArray = bay_zones; rv = soap_getInterconnectTrayPortMapArray(oa_handler->active_con, &request, response,intr_pm_doc); if (rv != SOAP_OK) { err("Get interconnect tray portmap array SOAP call failed"); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } /** * oa_soap_get_oa_info_arr * @con: Pointer to soap connection * @max_bays : Maximum OAs supported by the enclosure * @response : Pointer to getOaInfoArrayResponse structure * @oa_info_doc :Pointer to connection doc. * * Purpose: * Gets the OA array information * * Detailed Description: * - Creates the request for getOaInfoArray SOAP call * based on the maximum OAs supported * - Makes the getOaInfoArray SOAP call * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT oa_soap_get_oa_info_arr(SOAP_CON *con, SaHpiInt32T max_bays, struct getOaInfoArrayResponse *response, xmlDocPtr oa_info_doc) { SaErrorT rv = SA_OK; struct getOaInfoArray request; struct bayArray bay_zones; SaHpiInt32T i = 0; byte array[max_bays]; if (con == NULL || response == NULL || oa_info_doc != NULL) { err("Invalid parameter"); return SA_ERR_HPI_INVALID_PARAMS; } /* Create the bayArray for OA info array request */ for (i = 1; i <= max_bays; i++) { array[i - 1] = i; } bay_zones.array = array; bay_zones.size = max_bays; request.bayArray = bay_zones; rv = soap_getOaInfoArray(con, &request, response,oa_info_doc); if (rv != SOAP_OK) { err("Get OA info array SOAP call failed"); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } /** * oa_soap_get_oa_sts_arr * @con: Pointer to soap connection * @max_bays : Maximum OAs supported by the enclosure * @response : Pointer to getOaStatusArrayResponse structure * @oa_sts_doc :Pointer to connection doc. * * Purpose: * Gets the OA status information * * Detailed Description: * - Creates the request for getOaStatusArray SOAP call * based on the maximum OAs supported * - Makes the getOaStatusArray SOAP call * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT oa_soap_get_oa_sts_arr(SOAP_CON *con, SaHpiInt32T max_bays, struct getOaStatusArrayResponse *response, xmlDocPtr oa_sts_doc) { SaErrorT rv = SA_OK; struct getOaStatusArray request; struct bayArray bay_zones; SaHpiInt32T i = 0; byte array[max_bays]; if (con == NULL || response == NULL || oa_sts_doc != NULL) { err("Invalid parameter"); return SA_ERR_HPI_INVALID_PARAMS; } /* Create the bayArray for OA status array request */ for (i = 1; i <= max_bays; i++) { array[i - 1] = i; } bay_zones.array = array; bay_zones.size = max_bays; request.bayArray = bay_zones; rv = soap_getOaStatusArray(con, &request, response,oa_sts_doc); if (rv != SOAP_OK) { err("Get OA status array SOAP call failed"); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } /** * oa_soap_get_bladests_arr * @oa_handler: Pointer to oa_soap_handler for soap connection * @max_bays : Maximum blades supported by the enclosure * @response : Pointer to getBladeStsArrayResponse structure * @bl_sts_doc :Pointer to complete status information. * * Purpose: * Gets all the blades status information * * Detailed Description: * - Creates the request for getBladeStatusArray SOAP call * based on the maximum blades supported * - Makes the getBladeStatusArray SOAP call * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT oa_soap_get_bladests_arr(struct oa_soap_handler *oa_handler, SaHpiInt32T max_bays, struct getBladeStsArrayResponse *response, xmlDocPtr bl_sts_doc) { SaErrorT rv = SA_OK; struct getBladeStsArray request; struct bayArray bay_zones; SaHpiInt32T i = 0; byte array[max_bays]; if ( oa_handler == NULL || response == NULL || bl_sts_doc != NULL ) { err("Invalid parameter"); return SA_ERR_HPI_INVALID_PARAMS; } /* Create the bayArray for blade status array request */ for (i = 1; i <= max_bays; i++) { array[i - 1] = i; } bay_zones.array = array; bay_zones.size = max_bays; request.bayArray = bay_zones; rv = soap_getBladeStatusArray(oa_handler->active_con, &request, response,bl_sts_doc); if (rv != SOAP_OK) { err("Get blade status array SOAP call failed"); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } /** * oa_soap_get_portmap_arr * @oa_handler: Pointer to oa_soap_handler for soap connection * @max_bays : Maximum blades supported by the enclosure * @response : Pointer to getBladePortMapArrayResponse structure * @bl_pm_doc :Pointer to complete portmap information. * * Purpose: * Gets all the blades portmap information * * Detailed Description: * - Creates the request for getBladePortMapArray SOAP call * based on the maximum blades supported * - Makes the getBladePortMapArray SOAP call * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT oa_soap_get_portmap_arr(struct oa_soap_handler *oa_handler, SaHpiInt32T max_bays, struct getBladePortMapArrayResponse *response, xmlDocPtr bl_pm_doc) { SaErrorT rv = SA_OK; struct getBladePortMapArray request; struct bayArray bay_zones; SaHpiInt32T i = 0; byte array[max_bays]; if ( oa_handler == NULL || response == NULL || bl_pm_doc != NULL ) { err("Invalid parameter"); return SA_ERR_HPI_INVALID_PARAMS; } /* Create the portmap array request */ for (i = 1; i <= max_bays; i++) { array[i - 1] = i; } bay_zones.array = array; bay_zones.size = max_bays; request.bayArray = bay_zones; rv = soap_getBladePortMapArray(oa_handler->active_con, &request, response,bl_pm_doc); if (rv != SOAP_OK) { err("Get blade portmap array SOAP call failed"); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } /** * oa_soap_server_mem_evt_discover: * @oh_handler : Pointer to openhpi handler * @rpt : Pointer to rpt structure * * Purpose: Generate the memory event errors if they are present in * extra_data of the blades. * * Detailed Description: * - This is an work around for not having DIMM memory sensor * - When the DIMM has an error, extra_data field of status responses * has a field to indicate which DIMM is at fault * - Single line may have many DIMM modules, seperate them * - Process an event for each DIMM * * Return values: * SA_OK - on success * SA_ERR_HPI_INTERNAL_ERROR - on failure **/ SaErrorT oa_soap_server_mem_evt_discover(struct oh_handler_state *oh_handler, SaHpiRptEntryT *rpt) { struct oa_soap_handler *oa_handler = NULL; SaErrorT rv = SA_OK; SaHpiInt32T i = 0, j = 0, len = 0; struct getBladeStatus status_request; struct bladeStatus status_response; xmlNode *extra_data = NULL; struct extraDataInfo extra_data_info; char *mainMemoryError = NULL, *memoryError = NULL, *subStr = NULL; if (oh_handler == NULL || rpt == NULL) { return SA_ERR_HPI_INTERNAL_ERROR; } if (rpt->ResourceEntity.Entry[0].EntityType != SAHPI_ENT_SYSTEM_BLADE) { return rv; } oa_handler = (struct oa_soap_handler *) oh_handler->data; status_request.bayNumber = rpt->ResourceEntity.Entry[0].EntityLocation; i = status_request.bayNumber; rv = soap_getBladeStatus(oa_handler->active_con, &status_request, &status_response); if (rv != SOAP_OK) { err("Get Blade status failed"); return SA_ERR_HPI_INTERNAL_ERROR; } extra_data = status_response.extraData; while (extra_data) { soap_getExtraData(extra_data, &extra_data_info); if (!(strcmp(extra_data_info.name, "mainMemoryErrors"))) { err("openhpid[%d]: Blade (id=%d) at %d has " "Memory Error: %s", getpid(), rpt->ResourceId, i, extra_data_info.value); oa_handler->memErrRecFlag[i] = 1; /* This MEMORY event is created just to let the user know which memory module is generating an error */ mainMemoryError = extra_data_info.value; for(j = 0; ; j++) { subStr = strstr(mainMemoryError, ";"); if (subStr == NULL) { /* Raise the HPI sensor event */ rv = oa_soap_proc_mem_evt(oh_handler, rpt->ResourceId, OA_SOAP_SEN_MAIN_MEMORY_ERRORS, mainMemoryError, SAHPI_CRITICAL); if (rv != SA_OK) { err("processing the memory " "event for sensor %x has " "failed", OA_SOAP_SEN_MAIN_MEMORY_ERRORS); return rv; } break; } memoryError = (char *)g_malloc0 (sizeof(char) * SAHPI_SENSOR_BUFFER_LENGTH); memset(memoryError, 0, SAHPI_SENSOR_BUFFER_LENGTH); len = strlen(mainMemoryError) - strlen(subStr); strncpy(memoryError, mainMemoryError, len); memoryError[len] = '\0'; /* Raise the HPI sensor event */ rv = oa_soap_proc_mem_evt(oh_handler, rpt->ResourceId, OA_SOAP_SEN_MAIN_MEMORY_ERRORS, memoryError, SAHPI_CRITICAL); if (rv != SA_OK) { err("processing the memory " "event for sensor %x has " "failed", OA_SOAP_SEN_MAIN_MEMORY_ERRORS); wrap_g_free(memoryError); return rv; } wrap_g_free(memoryError); strcpy(mainMemoryError, subStr + 2); if (j == 99) { err("Too many memory errors, getting out"); return SA_ERR_HPI_INTERNAL_ERROR; } } break; } extra_data = soap_next_node(extra_data); } return rv; } void * oh_discover_resources (void *) __attribute__ ((weak, alias("oa_soap_discover_resources"))); openhpi-3.6.1/plugins/oa_soap/oa_soap_lcd_event.h0000644000175100017510000000361012575647270021111 0ustar mohanmohan/* * Copyright (C) 2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. */ #ifndef _OA_SOAP_LCD_EVENT_H #define _OA_SOAP_LCD_EVENT_H /* Include files */ #include "oa_soap_sensor.h" #include void oa_soap_proc_lcd_status(struct oh_handler_state *oh_handler, struct lcdStatus *status); #endif openhpi-3.6.1/plugins/oa_soap/oa_soap_oa_event.c0000644000175100017510000006046512575647266020761 0ustar mohanmohan/* * Copyright (C) 2007-2009, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. * Mohan Devarajulu * * This file has the OA related events handling * * process_oa_extraction_event() - Processes the OA extraction event * * process_oa_failover_event() - Processes the OA failover event * points the active_con filed of * oa_handler to currently active OA * Starts the re-discovery to sync up * with current status of the system * * process_oa_info_event() - Processes the OA info event * If OA info event has the updated * OA firmware version, same will be * updated to RPT and IDR entry. * If OA info event is just after OA * insertion event, then it processed. * Else, it is ignored * * oa_soap_proc_oa_status() - Porcesses the OA status event * * oa_soap_proc_oa_network_info() - Processes the OA network info event * */ #include "oa_soap_oa_event.h" #include "sahpi_wrappers.h" /** * process_oa_extraction_event * @oh_handler: Pointer to openhpi handler structure * @oa_event: Pointer to oa event response structure * * Purpose: * Gets the OA extraction event. * Removes OA information from RPT and RDR table * Creates the hot swap event * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters. * SA_ERR_HPI_INTERNAL_ERROR - on failure **/ SaErrorT process_oa_extraction_event(struct oh_handler_state *oh_handler, struct eventInfo *oa_event) { SaErrorT rv = SA_OK; SaHpiInt32T bay_number; struct oa_soap_handler *oa_handler = NULL; SaHpiResourceIdT resource_id; if (oh_handler == NULL || oa_event == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; bay_number = oa_event->eventData.oaStatus.bayNumber; resource_id = oa_handler->oa_soap_resources.oa.resource_id[bay_number - 1]; rv = oa_soap_proc_sen_evt(oh_handler, resource_id, OA_SOAP_SEN_OA_REDUND, oa_event->eventData.oaStatus.oaRedundancy, 0, 0); if (rv != SA_OK) { err("processing the sensor event for sensor %x has failed", OA_SOAP_SEN_OA_REDUND); return rv; } /* The OA is sending the wrong bay_number for the removed OA * Hence if the bay number in the oa_event is 1, * process the event for bay number 2, or vice versa * TODO: Remove this workaround when the fix is made to OA firmware */ switch (oa_event->eventData.oaStatus.bayNumber) { case 1: bay_number = 2; break; case 2: bay_number = 1; break; default: err("Wrong OA bay number %d detected", oa_event->eventData.oaStatus.bayNumber); return SA_ERR_HPI_INTERNAL_ERROR; } rv = remove_oa(oh_handler, bay_number); if (rv != SA_OK) { err("Remove OA has failed"); return rv; } return SA_OK; } /** * process_oa_failover_event * @oh_handler: Pointer to openhpi handler structure * @oa: Pointer to the OA structure * * Purpose: * Gets the OA Failover event. * Waits till the OA Transition Complete event is received from OA * Gets the OA status of the other OA and updates the other OA data * structure * * Detailed Description: * - If the OA failover event is received just after the discovery on * active OA, then the OA failoer event will be ignored * - The active_con field of oa_handler is pointed to current active OA * - Till OA_TRANSITION_COMPLETE event is received or maximum 90 seconds, * all the events are ignored * - OA needs some time to stabilize, after getting the OA failover event, * plug-in starts checking for events after 90 seconds * - Since there are high chances for missing the information of changes * in the resources, re-discovery will be done before start listening * for events. * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters. * SA_ERR_HPI_INTERNAL_ERROR - on failure **/ SaErrorT process_oa_failover_event(struct oh_handler_state *oh_handler, struct oa_info *oa) { SaErrorT rv = SA_OK; SaHpiBoolT is_transition_complete = SAHPI_FALSE; SaHpiInt32T sleep_time = 0; struct oa_soap_handler *oa_handler = NULL; struct getAllEventsEx request; struct getAllEventsResponse response; struct eventInfo event; GTimer *timer = NULL; gulong micro_seconds; gdouble time_elapsed = 0; char oa_fw_buf[SAHPI_MAX_TEXT_BUFFER_LENGTH]; if (oh_handler == NULL || oa == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } /* If the switchover happens during discovery, * then, we will get failover event on Active OA * Discovery error recovery mechanism has handled the switchover. * Hence, ignore the failover event */ if (oa->oa_status == ACTIVE) { dbg("OA failover event is received in active OA"); dbg("Ignoring the OA failover event"); return SA_OK; } err("OA switching started"); oa_handler = (struct oa_soap_handler *) oh_handler->data; oa_handler->oa_switching=SAHPI_TRUE; /* Always lock the oa_handler mutex and then oa_info mutex * This is to avoid the deadlock */ wrap_g_mutex_lock(oa_handler->mutex); wrap_g_mutex_lock(oa->mutex); /* Point the active_con to the current active OA's hpi_con */ oa_handler->active_con = oa->hpi_con; /* This OA has become ACTIVE from STANDBY */ oa->oa_status = ACTIVE; wrap_g_mutex_unlock(oa->mutex); /* Set the other OA status as STANDBY. If the other OA is extracted, * then the other OA status will be set to ABSENT during re-discovery. */ if (oa_handler->oa_1 == oa) { wrap_g_mutex_lock(oa_handler->oa_2->mutex); oa_handler->oa_2->oa_status = STANDBY; wrap_g_mutex_unlock(oa_handler->oa_2->mutex); } else { wrap_g_mutex_lock(oa_handler->oa_1->mutex); oa_handler->oa_1->oa_status = STANDBY; wrap_g_mutex_unlock(oa_handler->oa_1->mutex); } request.pid = oa->event_pid; request.waitTilEventHappens = HPOA_TRUE; request.lcdEvents = HPOA_FALSE; memset(oa_fw_buf,0,SAHPI_MAX_TEXT_BUFFER_LENGTH); snprintf(oa_fw_buf,SAHPI_MAX_TEXT_BUFFER_LENGTH,"%.2f",oa->fm_version); request.oaFwVersion = oa_fw_buf; /* Start the timer */ timer = g_timer_new(); /* Loop through till the TRANSITION_COMPLETE event is received * Or OA stabilization (90 seconds) time has reached */ while (is_transition_complete != SAHPI_TRUE && time_elapsed < OA_STABILIZE_MAX_TIME) { OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, oa_handler->mutex, NULL, timer); wrap_g_mutex_lock(oa->mutex); rv = soap_getAllEventsEx(oa->event_con, &request, &response); wrap_g_mutex_unlock(oa->mutex); if (rv != SOAP_OK) { err("Get all events failed during OA switchover" "processing for OA %s", oa->server); /* Unlock the oa_handler mutex*/ wrap_g_mutex_unlock(oa_handler->mutex); /* Cleanup the timer */ g_timer_destroy(timer); /* May be OA is out of network or * consecutive switch over has happened * Try to recover from the problem */ oa_soap_error_handling(oh_handler, oa); /* Re-discovery is done in error handling * hence return success */ return SA_OK; } /* OA returns empty event response payload for LCD status * change events. Ignore empty event response. */ if (response.eventInfoArray == NULL) { dbg("Ignoring empty event response"); time_elapsed = g_timer_elapsed(timer, µ_seconds); continue; } /* Check for transition complete event */ while (response.eventInfoArray) { OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, oa_handler->mutex, NULL, timer); soap_getEventInfo(response.eventInfoArray, &event); if (event.event == EVENT_OA_TRANSITION_COMPLETE) { is_transition_complete = SAHPI_TRUE; break; } response.eventInfoArray = soap_next_node(response.eventInfoArray); } /* Get the time (in seconds) since the timer has been started */ time_elapsed = g_timer_elapsed(timer, µ_seconds); } /* Unlock the oa_handler mutex */ wrap_g_mutex_unlock(oa_handler->mutex); /* Get the time (in seconds) since the timer has been started */ time_elapsed = g_timer_elapsed(timer, µ_seconds); g_timer_destroy(timer); /* OA requires some time to Stabilize. Wait for max 90 seconds */ sleep_time = OA_STABILIZE_MAX_TIME - time_elapsed; dbg("Sleeping for %d seconds", sleep_time); if (sleep_time > 0) { oa_soap_sleep_in_loop(oa_handler, sleep_time); } OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, NULL, NULL, NULL); /* Check the OA staus there may be change in OA state */ rv = check_oa_status(oa_handler, oa, oa->event_con); if (rv != SA_OK) { err("Check OA staus failed for OA %s", oa->server); oa_soap_error_handling(oh_handler, oa); /* Re-discovery is done in error handling hence * return success */ return SA_OK; } /* Check the OA status, if it is not ACTIVE (switchover might have * happened while waiting for OA stabilization) * Return without doing re-discovery */ wrap_g_mutex_lock(oa->mutex); if (oa->oa_status != ACTIVE) { wrap_g_mutex_unlock(oa->mutex); oa_handler->oa_switching=SAHPI_FALSE; err("OA status already changed. OA switching completed"); return SA_OK; } wrap_g_mutex_unlock(oa->mutex); wrap_g_mutex_lock(oa_handler->mutex); wrap_g_mutex_lock(oa->mutex); /* Call getAllEvents to flush the OA event queue * Any resource state change will be handled as part of the re-discovery */ rv = soap_getAllEventsEx(oa->event_con, &request, &response); /* Re-discover the resources as there is a high chances * that we might have missed some events */ OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, oa_handler->mutex, oa->mutex, NULL); rv = oa_soap_re_discover_resources(oh_handler, oa); wrap_g_mutex_unlock(oa->mutex); wrap_g_mutex_unlock(oa_handler->mutex); /* At this point assume that switchover is complete */ oa_handler->oa_switching=SAHPI_FALSE; err("OA switching completed"); if (rv != SA_OK) { err("Re-discovery failed for OA %s", oa->server); oa_soap_error_handling(oh_handler, oa); } return SA_OK; } /** * process_oa_reboot_event * @oh_handler: Pointer to openhpi handler structure * @oa: Pointer to the OA structure * * Purpose: * Gets the OA REBOOT event. * perform the rediscovery for all the resources. * * Detailed Description: * - OA needs some time to stabilize, after getting the OA REBOOT event, * plug-in starts checking for events after 90 seconds - Establish the new connection with OA. * - Since there are high chances for missing the information of changes * in the resources, re-discovery will be done before start listening * for events. * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters. **/ SaErrorT process_oa_reboot_event(struct oh_handler_state *oh_handler, struct oa_info *oa) { SaErrorT rv = SA_OK; SaHpiInt32T sleep_time = 0; dbg("\nThread id = %p \n",g_thread_self()); if (oh_handler == NULL || oa == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } sleep_time = OA_STABILIZE_MAX_TIME; dbg("Sleeping for %d seconds", sleep_time); if (sleep_time > 0) { oa_soap_sleep_in_loop(oh_handler->data, sleep_time); } /* Call the oa_soap error handling function to re establish the connection * with OA and rediscover all the resources */ oa_soap_error_handling(oh_handler, oa); return rv; } /** * process_oa_info_event * @oh_handler: Pointer to openhpi handler structure * @con: Pointer to SOAP_CON structure * @oa_event: Pointer to the OA event structure * * Purpose: * Gets the OA Info event. * Adds the newly inserted OA information into RPT and RDR table * Creates the hot swap event * * Detailed Description: * - If the OA_INFO event is recived after the OA insertion event, * then it is processed, else it is ignored * - The OA_INFO event (after the OA insertion event) indicates * the stabilization of OA. * - When OA insertion event received, OA will not be stabilized * On recieving this event, ACTIVE hot swap event will be generated * - If the OA_INFO event has the updated OA firmware * version information then the new firmware version * will be updated to RPT and IDR entry. * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters. * SA_ERR_HPI_INTERNAL_ERROR - on failure **/ SaErrorT process_oa_info_event(struct oh_handler_state *oh_handler, SOAP_CON *con, struct eventInfo *oa_event) { SaErrorT rv = SA_OK; SaHpiInt32T bay_number; struct oa_soap_handler *oa_handler = NULL; int i = 0; struct oaInfo response; SaHpiResourceIdT resource_id; if (oh_handler == NULL || con == NULL || oa_event == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; bay_number = oa_event->eventData.oaInfo.bayNumber; response = oa_event->eventData.oaInfo; if (oa_handler->oa_soap_resources.oa.presence[bay_number - 1] == RES_PRESENT) { if(oa_event->eventData.oaInfo.fwVersion != NULL) { for (i = 0; i < oa_handler->oa_soap_resources.oa.max_bays; i++) { resource_id = oa_handler->oa_soap_resources.oa. resource_id[i]; rv = update_oa_fw_version(oh_handler, &response, resource_id); if (rv != SA_OK) { err("OA Firmware Version not updated"); } } } return SA_OK; } rv = add_oa(oh_handler, con, bay_number); if (rv != SA_OK) { err("Failed to add the newly-discovered OA"); } return rv; } /** * oa_soap_proc_oa_status * @oh_handler : Pointer to openhpi handler structure * @status : Pointer to the OA status structure * * Purpose: * Processes the OA status event and generates the HPI sensor event. * * Detailed Description: * NA * * Return values: * NONE **/ void oa_soap_proc_oa_status(struct oh_handler_state *oh_handler, struct oaStatus *status) { SaErrorT rv = SA_OK; SaHpiInt32T bay_number; struct oa_soap_handler *oa_handler = NULL; SaHpiResourceIdT resource_id; enum diagnosticStatus diag_ex_status[OA_SOAP_MAX_DIAG_EX]; if (oh_handler == NULL || status == NULL) { err("Invalid parameters"); return; } oa_handler = (struct oa_soap_handler *) oh_handler->data; bay_number = status->bayNumber; resource_id = oa_handler->oa_soap_resources.oa.resource_id[bay_number - 1]; /* Process the operational status sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_OPER_STATUS, status->operationalStatus, 0, 0) /* Process the predictive failure status sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_PRED_FAIL, status->operationalStatus, 0, 0) /* Process the OA redundancy sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_OA_REDUND, status->oaRedundancy, 0, 0) /* Process the internal data error sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_INT_DATA_ERR, status->diagnosticChecks.internalDataError, 0, 0) /* Process the management processor error sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_MP_ERR, status->diagnosticChecks. managementProcessorError, 0, 0) /* Process the device failure sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_FAIL, status->diagnosticChecks.deviceFailure, 0, 0) /* Process the device degraded sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_DEGRAD, status->diagnosticChecks.deviceDegraded, 0, 0) /* Process the redundancy error sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_REDUND_ERR, status->diagnosticChecks.redundancy, 0, 0) oa_soap_parse_diag_ex(status->diagnosticChecksEx, diag_ex_status); /* Process the firmware mismatch sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_FW_MISMATCH, diag_ex_status[DIAG_EX_FW_MISMATCH], 0, 0); /* Process the device not supported sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_NOT_SUPPORT, diag_ex_status[DIAG_EX_DEV_NOT_SUPPORT], 0, 0); return; } /** * oa_soap_proc_oa_network_info * @oh_handler : Pointer to openhpi handler structure * @nw_info : Pointer to the OA network info structure * * Purpose: * Processes the OA network info event and generates the HPI sensor event. * * Detailed Description: * NA * * Return values: * NONE **/ void oa_soap_proc_oa_network_info(struct oh_handler_state *oh_handler, struct oaNetworkInfo *nw_info) { SaErrorT rv = SA_OK; SaHpiInt32T bay_number; struct oa_soap_handler *oa_handler = NULL; SaHpiResourceIdT resource_id; struct extraDataInfo extra_data_info; struct oa_info *temp = NULL; xmlNode *extra_data = NULL; if (oh_handler == NULL || nw_info == NULL) { err("Invalid parameters"); return; } oa_handler = (struct oa_soap_handler *) oh_handler->data; bay_number = nw_info->bayNumber; switch (bay_number) { case 1: temp = oa_handler->oa_1; break; case 2: temp = oa_handler->oa_2; break; } resource_id = oa_handler->oa_soap_resources.oa.resource_id[bay_number - 1]; extra_data = nw_info->extraData; while (extra_data) { soap_getExtraData(extra_data, &extra_data_info); if ((!(strcmp(extra_data_info.name, "IpSwap"))) && (extra_data_info.value != NULL)) { if(!(strcasecmp(extra_data_info.value, "true"))){ oa_handler->ipswap = HPOA_TRUE; dbg("Enclosure IP Mode is Enabled"); } else { oa_handler->ipswap = HPOA_FALSE; dbg("Enclosure IP Mode is Disabled"); } break; } extra_data = soap_next_node(extra_data); } /* Copy the server IP address to oa_info structure */ wrap_g_mutex_lock(temp->mutex); memset(temp->server, 0, MAX_URL_LEN); strncpy(temp->server, nw_info->ipAddress, strlen(nw_info->ipAddress)); wrap_g_mutex_unlock(temp->mutex); /* Process the OA link status sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_OA_LINK_STATUS, nw_info->linkActive, 0, 0) return; } /* oa_soap_proc_oa_network_info */ /** * oa_soap_proc_oa_inserted * @oh_handler : Pointer to openhpi handler structure * @oa_event : Pointer to the OA inserted event * * Purpose: * Processes the OA inserted event and generates the HPI sensor event. * * Detailed Description: * NA * * Return values: * NONE **/ void oa_soap_proc_oa_inserted(struct oh_handler_state *oh_handler, struct eventInfo *oa_event) { SaErrorT rv = SA_OK; SaHpiInt32T bay_number; struct oa_soap_handler *oa_handler = NULL; SaHpiResourceIdT resource_id; if (oh_handler == NULL || oa_event == NULL) { err("Invalid parameters"); return; } oa_handler = (struct oa_soap_handler *) oh_handler->data; bay_number = oa_event->eventData.oaStatus.bayNumber; resource_id = oa_handler->oa_soap_resources.oa.resource_id[bay_number - 1]; /* Process the operational status sensor */ rv = oa_soap_proc_sen_evt(oh_handler, resource_id, OA_SOAP_SEN_OA_REDUND, oa_event->eventData.oaStatus.oaRedundancy, 0, 0); if (rv != SA_OK) { err("processing the sensor event for sensor %x has failed", OA_SOAP_SEN_OA_REDUND); return; } return; } /* oa_soap_proc_oa_inserted */ openhpi-3.6.1/plugins/oa_soap/oa_soap_sel.c0000644000175100017510000002155312575647270017732 0ustar mohanmohan/* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra M.S. **/ #include "oa_soap_sel.h" /** * oa_soap_get_sel_info: * @oh_handler: Handler data pointer. * @resource_id: Resource ID. * @info: Sensor rdr number. * * Purpose: * Gets current number of entries in the event log. * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current oa soap implementation * does not support this API. **/ SaErrorT oa_soap_get_sel_info(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiEventLogInfoT *info) { err("Get Event Log info is not supported"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_get_sel_caps: * @oh_handler: Handler data pointer. * @resource_id: Resource ID. * @caps: Pointer to the event log capabilities data. * * Purpose: * Gets event log capabilities associated with a resource. * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current oa soap implementation * does not support this API. **/ SaErrorT oa_soap_get_sel_caps(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiEventLogCapabilitiesT *caps) { err("Get Event Log Capabilities is not supported"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_set_sel_time: * @oh_handler: Handler data pointer. * @resource_id: Resource ID. * @time: Time to be set for event log. * * Purpose: * Sets the event log's clock. * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current oa soap implementation * does not support this API. **/ SaErrorT oa_soap_set_sel_time(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiTimeT time) { err("Set Event log time is not supported"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_add_sel_entry. * @oh_handler: Handler data pointer. * @resource_id: Resource ID. * @Event: Event entry. * * Purpose: * Adds the event entries to event log. * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current oa soap implementation * does not support this API. **/ SaErrorT oa_soap_add_sel_entry(void *oh_handler, SaHpiResourceIdT resource_id, const SaHpiEventT *Event) { err("Adding entries to Event log is not supported"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_clear_sel. * @oh_handler: Handler data pointer. * @resource_id: Resource ID. * * Purpose: * Clears all entries from Event log. * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current oa soap implementation * does not support this API. **/ SaErrorT oa_soap_clear_sel(void *oh_handler, SaHpiResourceIdT resource_id) { err("Clearing entries from Event log is not supported"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_reset_sel_overflow. * @oh_handler: Handler data pointer. * @resource_id: Resource ID. * * Purpose: * Resets the overflow flag in the event log. * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current oa soap implementation * does not support this API. **/ SaErrorT oa_soap_reset_sel_overflow(void *oh_handler, SaHpiResourceIdT resource_id) { err("Reset overflow of Event log is not supported"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_get_sel_entry: * @oh_handler: Handler data pointer. * @resource_id: Resource ID. * @current: Current event's ID. * @prev: Location to store previous event's ID. * @next: Location to store next event's ID. * @entry: Location to store retrieved event. * @rdr: Rdr structure. * @rpt: Rpt entry. * * Purpose: * Gets the event log entry. * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current oa soap implementation * does not support this API. **/ SaErrorT oa_soap_get_sel_entry(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiEventLogEntryIdT current, SaHpiEventLogEntryIdT *prev, SaHpiEventLogEntryIdT *next, SaHpiEventLogEntryT *entry, SaHpiRdrT *rdr, SaHpiRptEntryT *rpt) { err("Get Event log entry is not supported"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_sel_set_state: * @oh_handler: Handler data pointer. * @id: Resource ID. * @enable: SEL state. * * Purpose: * Sets the event log state to enabled or disabled. * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current oa soap implementation * does not support this API. **/ SaErrorT oa_soap_sel_state_set(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiBoolT enable) { err("Set Event log state is not supported"); return SA_ERR_HPI_UNSUPPORTED_API; } void * oh_get_el_info (void *, SaHpiResourceIdT, SaHpiEventLogInfoT *) __attribute__ ((weak, alias("oa_soap_get_sel_info"))); void * oh_get_el_caps (void *, SaHpiResourceIdT, SaHpiEventLogCapabilitiesT *) __attribute__ ((weak, alias("oa_soap_get_sel_caps"))); void * oh_set_el_time (void *, SaHpiResourceIdT, const SaHpiEventT *) __attribute__ ((weak, alias("oa_soap_set_sel_time"))); void * oh_add_el_entry (void *, SaHpiResourceIdT, const SaHpiEventT *) __attribute__ ((weak, alias("oa_soap_add_sel_entry"))); void * oh_get_el_entry (void *, SaHpiResourceIdT, SaHpiEventLogEntryIdT, SaHpiEventLogEntryIdT *, SaHpiEventLogEntryIdT *, SaHpiEventLogEntryT *, SaHpiRdrT *, SaHpiRptEntryT *) __attribute__ ((weak, alias("oa_soap_get_sel_entry"))); void * oh_clear_el (void *, SaHpiResourceIdT) __attribute__ ((weak, alias("oa_soap_clear_sel"))); void * oh_reset_el_overflow (void *, SaHpiResourceIdT) __attribute__ ((weak, alias("oa_soap_reset_sel_overflow"))); void * oh_set_el_state(void *, SaHpiResourceIdT, SaHpiBoolT) __attribute__ ((weak, alias("oa_soap_sel_state_set"))); openhpi-3.6.1/plugins/oa_soap/oa_soap_enclosure_event.c0000644000175100017510000002172712575647270022352 0ustar mohanmohan/* * Copyright (C) 2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra M.S. * Raghavendra P.G. * * This file has the enclosure related events handling * * oa_soap_proc_enc_status() - Processes the enclosure status event * */ #include "oa_soap_enclosure_event.h" /** * oa_soap_proc_enc_status * @oh_handler: Pointer to openhpi handler structure * @con: Pointer to soap client con object * @event: Pointer to the openhpi event structure * * Purpose: * * * Detailed Description: NA * * Return values: * NONE **/ void oa_soap_proc_enc_status(struct oh_handler_state *oh_handler, struct enclosureStatus *status) { SaErrorT rv = SA_OK; SaHpiResourceIdT resource_id; struct oa_soap_handler *oa_handler; enum diagnosticStatus diag_ex_status[OA_SOAP_MAX_DIAG_EX]; if (oh_handler == NULL || status == NULL) { err("wrong parameters passed"); return; } oa_handler = (struct oa_soap_handler *) oh_handler->data; resource_id = oa_handler->oa_soap_resources.enclosure_rid; /* Process the operational status sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_OPER_STATUS, status->operationalStatus, 0, 0) /* Process the predictive failure status sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_PRED_FAIL, status->operationalStatus, 0, 0) /* Process the internal data error sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_INT_DATA_ERR, status->diagnosticChecks.internalDataError, 0, 0) /* Process the device failure sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_FAIL, status->diagnosticChecks.deviceFailure, 0, 0) /* Process the device degraded sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_DEGRAD, status->diagnosticChecks.deviceDegraded, 0, 0) /* Process the redundancy error sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_REDUND_ERR, status->diagnosticChecks.redundancy, 0, 0) oa_soap_parse_diag_ex(status->diagnosticChecksEx, diag_ex_status); /* Build device not supported sensor rdr */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_NOT_SUPPORT, diag_ex_status[DIAG_EX_DEV_NOT_SUPPORT], 0, 0) return; } /** * process_enc_thermal_event * @oh_handler: Pointer to openhpi handler structure * @con: Pointer to the SOAP_CON structure * @response: Pointer to the Enclosure thermal Info structure * * Purpose: * Processes and creates enclosure / chassis sensor thermal events * * Detailed Description: NA * * Return values: * NONE **/ void oa_soap_proc_enc_thermal(struct oh_handler_state *oh_handler, SOAP_CON *con, struct thermalInfo *response) { SaErrorT rv = SA_OK; SaHpiResourceIdT resource_id; struct oa_soap_handler *oa_handler = NULL; SaHpiFloat64T trigger_reading; SaHpiFloat64T trigger_threshold; struct getThermalInfo thermal_request; struct thermalInfo thermal_response; struct oa_soap_sensor_info *sensor_info = NULL; SaHpiRdrT *rdr = NULL; if (oh_handler == NULL || con== NULL || response == NULL) { err("Invalid parameters"); return; } oa_handler = (struct oa_soap_handler *) oh_handler->data; resource_id = oa_handler-> oa_soap_resources.enclosure_rid; rdr = oh_get_rdr_by_type(oh_handler->rptcache, resource_id, SAHPI_SENSOR_RDR, OA_SOAP_SEN_TEMP_STATUS); if (rdr) sensor_info = (struct oa_soap_sensor_info *) oh_get_rdr_data(oh_handler->rptcache, resource_id, rdr->RecordId); /* Based on the sensor status, * determine the threshold which triggered the thermal event from * Enclosure. * Event with SENSOR_STATUS_CAUTION or SENSOR_STATUS_OK is * generated only if CAUTION threshold is crossed. * Event with SENSOR_STATUS_CRITICAL is generated only when CRITICAL * threshold is crossed. * Sensor current reading and trigger threshold are required for event * generation. Sensor current reading is not provided by the event, * hence make soap call to get the reading */ thermal_request.bayNumber = 1; thermal_request.sensorType = SENSOR_TYPE_ENC; rv = soap_getThermalInfo(con, &thermal_request, &thermal_response); if (rv != SOAP_OK) { err("soap_getThermalInfo soap call returns error"); return; } trigger_reading = (SaHpiInt32T)thermal_response.temperatureC; if ((response->sensorStatus == SENSOR_STATUS_CAUTION && sensor_info->current_state != SAHPI_ES_UPPER_MAJOR) || (response->sensorStatus == SENSOR_STATUS_OK && sensor_info->current_state != SAHPI_ES_UNSPECIFIED)) { /* Trigger for this event is caution threshold */ trigger_threshold = thermal_response.cautionThreshold; } else if (response->sensorStatus == SENSOR_STATUS_CRITICAL && sensor_info->current_state != SAHPI_ES_UPPER_CRIT) { /* Trigger for this event is critical threshold */ trigger_threshold = thermal_response.criticalThreshold; } else { dbg("Ignore the event. There is no change in the sensor state"); return; } /* Process the thermal event from Enclosure and generate appropriate * HPI event */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_TEMP_STATUS, response->sensorStatus, trigger_reading,trigger_threshold) return; } /** * oa_soap_proc_enc_network_info_changed * @oh_handler: Pointer to openhpi handler structure * @response: Pointer to the Enclosure thermal Info structure * * Purpose: * Precesses and updates the ipswap(Enclosure IP Mode) Status * * Detailed Description: NA * * Retunr values: * NONE */ void oa_soap_proc_enc_network_info_changed(struct oh_handler_state *oh_handler, struct enclosureNetworkInfo *response) { struct extraDataInfo extra_data_info; xmlNode *extra_data = NULL; struct oa_soap_handler *oa_handler = NULL; if (oh_handler == NULL || response == NULL) { err("Invalid parameters"); return; } oa_handler = (struct oa_soap_handler *) oh_handler->data; extra_data = response->extraData; while (extra_data) { soap_getExtraData(extra_data, &extra_data_info); if ((!(strcmp(extra_data_info.name, "IpSwap"))) && (extra_data_info.value != NULL)) { if(!(strcasecmp(extra_data_info.value, "true"))){ oa_handler->ipswap = HPOA_TRUE; dbg("Enclosure IP Mode is Enabled"); } else { oa_handler->ipswap = HPOA_FALSE; dbg("Enclosure IP Mode is Disabled"); } break; } extra_data = soap_next_node(extra_data); } return; } openhpi-3.6.1/plugins/oa_soap/oa_soap_sensor.c0000644000175100017510000031660312575647270020463 0ustar mohanmohan/* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra M.S. * Shuah Khan * Raghavendra P.G. * * This file supports the functions related to HPI Sensor. * The file covers three general classes of function: Sensor ABI functions, * Build functions for creating sensor RDRs for resources and sensor specific * functions for generating sensor enable and thermal events * * Sensor ABI functions: * * oa_soap_get_sensor_reading() - Gets the sensor reading of resource * * oa_soap_get_sensor_thresholds() - Retreives sensor's threshold values, * if defined * * oa_soap_get_sensor_enable() - Retrieves sensor's boolean enablement * status * * oa_soap_set_sensor_enable() - Sets sensor's boolean enablement * status * * oa_soap_get_sensor_event_enable()- Retrieves sensor's boolean event * enablement status * * oa_soap_set_sensor_event_enable()- Sets sensor's boolean event * enablement status * * oa_soap_get_sensor_event_masks()- Retrieves sensor's assert and * deassert event masks * * oa_soap_set_sensor_event_masks()- Sets sensor's assert and deassert * event masks * Build functions: * update_sensor_rdr() - Returns current status of the sensor * RDR from resource * * generate_sensor_assert_thermal_event()- Builds and generates the sensor * assert thermal event * * generate_sensor_deassert_thermal_event()- Builds and generates the * sensor deassert thermal event * * check_and_deassert_event() - Checks and deasserts the pending * events on resource * * oa_soap_build_sen_rdr() - Builds the sensor * * oa_soap_map_sen_value() - Maps the OA sensor value to HPI sensor * value * * oa_soap_gen_sen_evt() - Generates the HPI sensor event * * oa_soap_gen_res_evt() - Generates the HPI resource event * * oa_soap_proc_sen_evt() - Processes the sensor event * * oa_soap_map_thresh_resp() - Maps the OA threshold sensor value to * HPI sensor states * * oa_soap_assert_sen_evt() - Generates the assert sensor event * * oa_soap_get_bld_thrm_sen_data - Retrieves the matching * bladeThermalInfo structure instance * from bladeThermalInfoArrayResponse * response */ #include "oa_soap_sensor.h" #include "oa_soap_resources.h" #include "sahpi_wrappers.h" /* Forward declarations of static functions */ static SaErrorT oa_soap_gen_sen_evt(struct oh_handler_state *oh_handler, SaHpiRptEntryT *rpt, SaHpiRdrT *rdr, SaHpiInt32T sensor_status, SaHpiFloat64T trigger_reading, SaHpiFloat64T trigger_threshold); static void oa_soap_gen_res_evt(struct oh_handler_state *oh_handler, SaHpiRptEntryT *rpt, SaHpiInt32T sensor_status); /** * oa_soap_get_sensor_reading * @oh_handler: Handler data pointer * @resource_id: Resource ID * @rdr_num: Sensor rdr number * @data: Structure for receiving sensor reading values * @state: Structure for receiving sensor event states * * Purpose: * Gets the sensor reading * * Detailed Description: * - Fetches sensor info structure from the private data area of * sensor rdr of specified rdr number * - If the sensor is enabled for reading, then current reading is * retrieved from the resource directly through soap call * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INVALID_RESOURCE - Invalid resource id specified * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_SENSOR * SA_ERR_HPI_NOT_PRESENT - RDR is not present * SA_ERR_HPI_INTERNAL_ERROR - oa_soap plugin has encountered an internal * error * SA_ERR_HPI_INVALID_REQUEST - Resource has the sensor disabled * SA_ERR_HPI_UNKNOWN - Invalid entity type. **/ SaErrorT oa_soap_get_sensor_reading(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiSensorNumT rdr_num, SaHpiSensorReadingT *data, SaHpiEventStateT *state) { SaErrorT rv = SA_OK; struct oh_handler_state *handler = NULL; struct oa_soap_handler *oa_handler = NULL; struct oa_soap_sensor_reading_data sensor_data; struct oa_soap_sensor_info *sensor_info = NULL; SaHpiRptEntryT *rpt = NULL; SaHpiRdrT *rdr = NULL; if (oh_handler == NULL || state == NULL || data == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } handler = (struct oh_handler_state *) oh_handler; oa_handler = (struct oa_soap_handler *) handler->data; rv = lock_oa_soap_handler(oa_handler); if (rv != SA_OK) { err("OA SOAP handler is locked"); return rv; } rpt = oh_get_resource_by_id(handler->rptcache, resource_id); if (rpt == NULL) { err("INVALID RESOURCE"); return SA_ERR_HPI_INVALID_RESOURCE; } if (! (rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { err("INVALID RESOURCE CAPABILITY"); return SA_ERR_HPI_CAPABILITY; } /* Retrieve sensor rdr from framework of specified rdr number */ rdr = oh_get_rdr_by_type(handler->rptcache, resource_id, SAHPI_SENSOR_RDR, rdr_num); if (rdr == NULL) { err("RDR not present"); return SA_ERR_HPI_NOT_PRESENT; } /* Retrieve sensor_info structure from the private area of rdr */ sensor_info = (struct oa_soap_sensor_info*) oh_get_rdr_data(handler->rptcache, resource_id, rdr->RecordId); if (sensor_info == NULL) { err("No data for Sensor '%s' in Resource '%s' at location %d", rdr->IdString.Data, rpt->ResourceTag.Data, rpt->ResourceEntity.Entry[0].EntityLocation); return SA_ERR_HPI_INTERNAL_ERROR; } /* Check whether sensor is enabled */ if (sensor_info->sensor_enable == SAHPI_FALSE) { warn("Sensor '%s' is not enabled for resource '%s'" " at location %d", rdr->IdString.Data, rpt->ResourceTag.Data, rpt->ResourceEntity.Entry[0].EntityLocation); return(SA_ERR_HPI_NOT_PRESENT); } /* Check whether the reading is supported or not */ if (rdr->RdrTypeUnion.SensorRec.DataFormat.IsSupported == SAHPI_FALSE) { data->IsSupported = SAHPI_FALSE; *state = sensor_info->current_state; dbg("Reading Sensor '%s' in resource '%s' at location %d is" " not supported", rdr->IdString.Data, rpt->ResourceTag.Data, rpt->ResourceEntity.Entry[0].EntityLocation); return SA_OK; } /* Fetch current reading of the sensor from the resource */ rv = update_sensor_rdr(handler, resource_id, rdr_num, rpt, &sensor_data); if (rv != SA_OK) { return rv; } /* Populate the return data with current sensor reading */ data->IsSupported = sensor_data.data.IsSupported; data->Type = sensor_data.data.Type; data->Value = sensor_data.data.Value; *state = sensor_info->current_state; return SA_OK; } /** * oa_soap_get_sensor_thresholds * @oh_handler: Handler data pointer * @resource_id: Resource ID * @rdr_num: Sensor rdr number * @threshold: Location to store sensor's threshold values * * Purpose: * Retrieves sensor's threshold values, if defined * * Detailed Description: * - Fetches sensor info structure from the private data area of * sensor rdr of specified rdr number * - Threshold details are returned if the event category of the sensor * is set to threshold type * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INVALID_RESOURCE - Invalid resource id specified * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_SENSOR * SA_ERR_HPI_NOT_PRESENT - RDR is not present * SA_ERR_HPI_INTERNAL_ERROR - oa_soap plugin has encountered an internal * error. * SA_ERR_HPI_INVALID_CMD - Sensor not of threshold type, or is not enabled * for reading **/ SaErrorT oa_soap_get_sensor_thresholds(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiSensorNumT rdr_num, SaHpiSensorThresholdsT *threshold) { struct oh_handler_state *handler = NULL; SaHpiRptEntryT *rpt = NULL; SaHpiRdrT *rdr = NULL; struct oa_soap_sensor_info *sensor_info=NULL; if (oh_handler == NULL || threshold == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } handler = (struct oh_handler_state *) oh_handler; rpt = oh_get_resource_by_id(handler->rptcache, resource_id); if (rpt == NULL) { err("INVALID RESOURCE"); return SA_ERR_HPI_INVALID_RESOURCE; } if (! (rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { err("INVALID RESOURCE CAPABILITY"); return SA_ERR_HPI_CAPABILITY; } /* Retrieve sensor rdr from framework of specified rdr number */ rdr = oh_get_rdr_by_type(handler->rptcache, resource_id, SAHPI_SENSOR_RDR, rdr_num); if (rdr == NULL) { err("RDR not present"); return SA_ERR_HPI_NOT_PRESENT; } /* Retrieve sensor_info structure from the private area of rdr */ sensor_info = (struct oa_soap_sensor_info*) oh_get_rdr_data(handler->rptcache, resource_id, rdr->RecordId); if (sensor_info == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); return SA_ERR_HPI_INTERNAL_ERROR; } /* Sensor supporting threshold shall have their event category set to * threshold type. Threshold of a sensor is fetched only if the * sensor event category value = SAHPI_EC_THRESHOLD */ if (rdr->RdrTypeUnion.SensorRec.Category != SAHPI_EC_THRESHOLD || rdr->RdrTypeUnion.SensorRec.ThresholdDefn.IsAccessible == SAHPI_FALSE || rdr->RdrTypeUnion.SensorRec.ThresholdDefn.ReadThold == 0) { err("Invalid command"); return SA_ERR_HPI_INVALID_CMD; } /* setting the return value with the threshold value from the * sensor info strucutre */ *threshold = sensor_info->threshold; return SA_OK; } /** * oa_soap_set_sensor_thresholds * @oh_handler: Handler data pointer * @resource_id: Resource ID * @rdr_num: Sensor rdr number * @threshold: Location to store sensor's threshold values * * Purpose: * Sets sensor's threshold values * * Detailed Description: * - The threshold values supported by HP BladeSystem cClass for different * resource such as thermal limits, fan speed limits are not enabled for * modifications * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - oa_soap plugin does not support this API **/ SaErrorT oa_soap_set_sensor_thresholds(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiSensorNumT rdr_num, const SaHpiSensorThresholdsT *threshold) { err("oa_soap set sensor thresholds not supported"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_get_sensor_enable * @oh_handler: Handler data pointer * @resource_id: Resource ID * @rdr_num: Sensor rdr number * @enable: Location to store sensor's enablement boolean * * Purpose: * Retrieves a sensor's boolean enablement status * * Detailed Description: * * - Fetches sensor info structure from the private data area of * sensor rdr of specified rdr number * - Sensor enable status is returned from sensor info structure * Sensor enable status determines whether the sensor is enabled for * reading is retrieved from the sensor info structure * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INVALID_RESOURCE - Invalid resource id specified * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_SENSOR * SA_ERR_HPI_NOT_PRESENT - RDR is not present * SA_ERR_HPI_INTERNAL_ERROR - oa_soap plugin has encountered an internal * error. **/ SaErrorT oa_soap_get_sensor_enable(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiSensorNumT rdr_num, SaHpiBoolT *enable) { struct oh_handler_state *handler = NULL; SaHpiRptEntryT *rpt = NULL; SaHpiRdrT *rdr = NULL; struct oa_soap_sensor_info *sensor_info=NULL; if (oh_handler == NULL || enable == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } handler = (struct oh_handler_state *) oh_handler; rpt = oh_get_resource_by_id(handler->rptcache, resource_id); if (rpt == NULL) { err("INVALID RESOURCE"); return SA_ERR_HPI_INVALID_RESOURCE; } if (! (rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { err("INVALID RESOURCE CAPABILITY"); return SA_ERR_HPI_CAPABILITY; } /* Retrieve sensor rdr from framework of specified rdr number */ rdr = oh_get_rdr_by_type(handler->rptcache, resource_id, SAHPI_SENSOR_RDR, rdr_num); if (rdr == NULL) { err("RDR not present"); return SA_ERR_HPI_NOT_PRESENT; } /* Retrieve sensor_info structure from the private area of rdr */ sensor_info = (struct oa_soap_sensor_info*) oh_get_rdr_data(handler->rptcache, resource_id, rdr->RecordId); if (sensor_info == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); return SA_ERR_HPI_INTERNAL_ERROR; } /* setting the return value with the sensor enable status * from the sensor info strucutre */ *enable = sensor_info->sensor_enable; return SA_OK; } /** * oa_soap_set_sensor_enable * @oh_handler: Handler data pointer * @resource_id: Resource ID * @rdr_num: Sensor rdr number * @enable: Location to store sensor's enablement boolean * * Purpose: * Sets a sensor's boolean enablement status * * Detailed Description: * - Fetches sensor info structure from the private data area of * sensor rdr of specified rdr number * - Sensor enable status in sensor info structure is updated * with enable parameter value if it is different. * Sensor enable status determines whether the sensor is enabled for * reading * - If there is a change in sensor enable status value, then * "Sensor enable change" event is generated to report the change to * framework * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INVALID_RESOURCE - Invalid resource id specified * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_SENSOR * SA_ERR_HPI_NOT_PRESENT - RDR is not present * SA_ERR_HPI_INTERNAL_ERROR - oa_soap plugin has encountered an internal * error * SA_ERR_HPI_INVALID_STATE - The blade is in invalid state **/ SaErrorT oa_soap_set_sensor_enable(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiSensorNumT rdr_num, SaHpiBoolT enable) { SaErrorT rv = SA_OK; struct oh_handler_state *handler = NULL; SaHpiRptEntryT *rpt = NULL; SaHpiRdrT *rdr = NULL; struct oa_soap_sensor_info *sensor_info=NULL; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } handler = (struct oh_handler_state *) oh_handler; rpt = oh_get_resource_by_id(handler->rptcache, resource_id); if (rpt == NULL) { err("INVALID RESOURCE"); return SA_ERR_HPI_INVALID_RESOURCE; } if (! (rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { err("INVALID RESOURCE CAPABILITY"); return SA_ERR_HPI_CAPABILITY; } /* Retrieve sensor rdr from framework of specified rdr number */ rdr = oh_get_rdr_by_type(handler->rptcache, resource_id, SAHPI_SENSOR_RDR, rdr_num); if (rdr == NULL) { err("RDR not present"); return SA_ERR_HPI_NOT_PRESENT; } if (rdr->RdrTypeUnion.SensorRec.EnableCtrl == SAHPI_TRUE) { /* Retrieve sensor_info structure from the private area * of rdr */ sensor_info = (struct oa_soap_sensor_info*) oh_get_rdr_data(handler->rptcache, resource_id, rdr->RecordId); if (sensor_info == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); return SA_ERR_HPI_INTERNAL_ERROR; } /* The thermal sensors of the blade resource should not be * enabled if the resource is in power off/degraded state. * TODO: Since the "EnableCtrl" field in rdr cannot be changed * after the discovery of the blade, provided below is * workaround logic until OpenHPI migrates to HPI-B.03.01 * specification */ if ((rdr->Entity.Entry[0].EntityType == SAHPI_ENT_SYSTEM_BLADE) || (rdr->Entity.Entry[0].EntityType == SAHPI_ENT_IO_BLADE) || (rdr->Entity.Entry[0].EntityType == SAHPI_ENT_DISK_BLADE)) { if ((rdr_num == OA_SOAP_SEN_TEMP_STATUS) || ((rdr_num >= OA_SOAP_BLD_THRM_SEN_START) && (rdr_num <= OA_SOAP_BLD_THRM_SEN_END))) { if (oa_soap_bay_pwr_status[ rpt->ResourceEntity.Entry[0]. EntityLocation -1] != SAHPI_POWER_ON) { err("Sensor enable operation cannot" " be performed"); return SA_ERR_HPI_INVALID_STATE; } } } if (sensor_info->sensor_enable != enable) { /* Update the sensor enable status with new value and * report the change to the framework through the * sensor enable event */ sensor_info->sensor_enable = enable; rv = generate_sensor_enable_event(oh_handler, rdr_num, rpt, rdr, sensor_info); if (rv != SA_OK) { err("Event generation failed"); return rv; } } } else { err("Sensor does not support changing the enable status"); return SA_ERR_HPI_READ_ONLY; } return SA_OK; } /** * oa_soap_get_sensor_event_enable * @oh_handler: Handler data pointer * @resource_id: Resource ID * @rdr_num: Sensor rdr number * @enable: Location to store sensor's enablement boolean * * Purpose: * Retrieves a sensor's boolean event enablement status * * Detailed Description: * - Fetches sensor info structure from the private data area of * sensor rdr of specified rdr number * - Sensor event enable status is returned from sensor info structure. * Sensor event enable status determines whether the sensor is enabled * for raising events is retrieved from sensor info structure * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INVALID_RESOURCE - Invalid resource id specified * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_SENSOR * SA_ERR_HPI_NOT_PRESENT - RDR is not present * SA_ERR_HPI_INTERNAL_ERROR - oa_soap plugin has encountered an internal * error **/ SaErrorT oa_soap_get_sensor_event_enable(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiSensorNumT rdr_num, SaHpiBoolT *enable) { struct oh_handler_state *handler = NULL; SaHpiRptEntryT *rpt = NULL; SaHpiRdrT *rdr = NULL; struct oa_soap_sensor_info *sensor_info=NULL; if (oh_handler == NULL || enable == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } handler = (struct oh_handler_state *) oh_handler; rpt = oh_get_resource_by_id(handler->rptcache, resource_id); if (rpt == NULL) { err("INVALID RESOURCE"); return SA_ERR_HPI_INVALID_RESOURCE; } if (! (rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { err("INVALID RESOURCE CAPABILITY"); return SA_ERR_HPI_CAPABILITY; } /* Retrieve sensor rdr from framework of specified rdr number */ rdr = oh_get_rdr_by_type(handler->rptcache, resource_id, SAHPI_SENSOR_RDR, rdr_num); if (rdr == NULL) { err("RDR not present"); return SA_ERR_HPI_NOT_PRESENT; } /* Retrieve sensor_info structure from the private area of rdr */ sensor_info = (struct oa_soap_sensor_info*) oh_get_rdr_data(handler->rptcache, resource_id, rdr->RecordId); if (sensor_info == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); return SA_ERR_HPI_INTERNAL_ERROR; } *enable = sensor_info->event_enable; return SA_OK; } /** * oa_soap_set_sensor_event_enable * @oh_handler: Handler data pointer * @resource_id: Resource ID * @rdr_num: Sensor rdr number * @enable: Location to store sensor's enablement boolean * * Purpose: * Sets a sensor's boolean event enablement status * * Detailed Description: * - Fetches sensor info structure from the private data area of * sensor rdr of specified rdr number * - Sensor event enable status in sensor info structure is updated * with enable parameter value if it is different * - Sensor event enable status determines whether the sensor is enabled * for raising events * - If there is a change in sensor event enable status value, then * "Sensor enable change" event is generated to report the change to * framework * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INVALID_RESOURCE - Invalid resource id specified * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_SENSOR * SA_ERR_HPI_NOT_PRESENT - RDR is not present * SA_ERR_HPI_INTERNAL_ERROR - oa_soap plugin has encountered an internal * error * SA_ERR_HPI_READ_ONLY - The data to be operated upon is read only **/ SaErrorT oa_soap_set_sensor_event_enable(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiSensorNumT rdr_num, const SaHpiBoolT enable) { SaErrorT rv = SA_OK; struct oh_handler_state *handler = NULL; SaHpiRptEntryT *rpt = NULL; SaHpiRdrT *rdr = NULL; struct oa_soap_sensor_info *sensor_info=NULL; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } handler = (struct oh_handler_state *) oh_handler; rpt = oh_get_resource_by_id(handler->rptcache, resource_id); if (rpt == NULL) { err("INVALID RESOURCE"); return SA_ERR_HPI_INVALID_RESOURCE; } if (! (rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { err("INVALID RESOURCE CAPABILITY"); return SA_ERR_HPI_CAPABILITY; } /* Retrieve sensor rdr from framework of specified rdr number */ rdr = oh_get_rdr_by_type(handler->rptcache, resource_id, SAHPI_SENSOR_RDR, rdr_num); if (rdr == NULL) { err("RDR not present"); return SA_ERR_HPI_NOT_PRESENT; } if (rdr->RdrTypeUnion.SensorRec.EventCtrl == SAHPI_SEC_READ_ONLY) { err("Sensor does not support changing the event enable status"); return SA_ERR_HPI_READ_ONLY; } /* Retrieve sensor_info structure from the private area of rdr */ sensor_info = (struct oa_soap_sensor_info*) oh_get_rdr_data(handler->rptcache, resource_id, rdr->RecordId); if (sensor_info == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); return SA_ERR_HPI_INTERNAL_ERROR; } if (sensor_info->event_enable != enable) { /* Update the sensor event enable status with new value * and report the change to the framework through the * sensor enable event */ sensor_info->event_enable = enable; rv = generate_sensor_enable_event(oh_handler, rdr_num, rpt, rdr, sensor_info); if (rv != SA_OK) { err("Event generation failed"); return rv; } } return SA_OK; } /** * oa_soap_get_sensor_event_masks * @oh_handler: Handler data pointer. * @resource_id: Resource id * @sid: Sensor rdr number * @assert: Location to store sensor's assert event mask. * @deassert: Location to store sensor's deassert event mask. * * Purpose: * Retrieves a sensor's assert and deassert event masks. * * Detailed Description: * - Fetches sensor info structure from the private data area of * sensor rdr of specified rdr number * - Sensor event mask value is returned from sensor info structure. * sensor event mask determines whether the sensor is enabled for * raising events if the threshold values are crossed. * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INVALID_RESOURCE - Invalid resource id specified * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_SENSOR * SA_ERR_HPI_NOT_PRESENT - RDR is not present * SA_ERR_HPI_INTERNAL_ERROR - oa_soap plugin has encountered an internal * error **/ SaErrorT oa_soap_get_sensor_event_masks(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiSensorNumT rdr_num, SaHpiEventStateT *assert, SaHpiEventStateT *deassert) { struct oh_handler_state *handler = NULL; SaHpiRptEntryT *rpt = NULL; SaHpiRdrT *rdr = NULL; struct oa_soap_sensor_info *sensor_info=NULL; if (oh_handler == NULL || assert == NULL || deassert == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } handler = (struct oh_handler_state *) oh_handler; rpt = oh_get_resource_by_id(handler->rptcache, resource_id); if (rpt == NULL) { err("INVALID RESOURCE"); return SA_ERR_HPI_INVALID_RESOURCE; } if (! (rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { err("INVALID RESOURCE CAPABILITY"); return SA_ERR_HPI_CAPABILITY; } /* Retrieve sensor rdr from framework of specified rdr number */ rdr = oh_get_rdr_by_type(handler->rptcache, resource_id, SAHPI_SENSOR_RDR, rdr_num); if (rdr == NULL) { err("RDR not present"); return SA_ERR_HPI_NOT_PRESENT; } /* Retrieve sensor_info structure from the private area of rdr */ sensor_info = (struct oa_soap_sensor_info*) oh_get_rdr_data(handler->rptcache, resource_id, rdr->RecordId); if (sensor_info == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); return SA_ERR_HPI_INTERNAL_ERROR; } *assert = sensor_info->assert_mask; if (rpt->ResourceCapabilities & SAHPI_CAPABILITY_EVT_DEASSERTS) { *deassert = sensor_info->assert_mask; } else { *deassert = sensor_info->deassert_mask; } return SA_OK; } /** * oa_soap_set_sensor_event_masks * @oh_handler: Handler data pointer * @resource_id: Resource id * @sid: Sensor rdr number * @assert: Location to store sensor's assert event mask * @deassert: Location to store sensor's deassert event mask * * Purpose: * Sets a sensor's assert and deassert event masks * * Detailed Description: * - Fetches sensor info structure from the private data area of * sensor rdr of specified rdr number * - Sensor event mask value in sensor info structure is updated * with assert/deassert parameter values if it is different * - Sensor event mask determines whether the sensor is enabled for * raising events if the threshold values are crossed * - If there is a change in sensor event mask values, then * "Sensor enable change" event is generated to report the change to * framework * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INVALID_RESOURCE - Invalid resource id specified * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_SENSOR * SA_ERR_HPI_NOT_PRESENT - RDR is not present * SA_ERR_HPI_INTERNAL_ERROR - oa_soap plugin has encountered an internal * error * SA_ERR_HPI_INVALID_DATA - Invalid assert/deassert mask * SA_ERR_HPI_READ_ONLY - The data to be operated upon is read only **/ SaErrorT oa_soap_set_sensor_event_masks(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiSensorNumT rdr_num, SaHpiSensorEventMaskActionT action, SaHpiEventStateT assert, SaHpiEventStateT deassert) { SaErrorT rv = SA_OK; struct oh_handler_state *handler = NULL; SaHpiRptEntryT *rpt = NULL; SaHpiRdrT *rdr = NULL; struct oa_soap_sensor_info *sensor_info=NULL; SaHpiEventStateT orig_assert_mask = 0; SaHpiEventStateT orig_deassert_mask = 0; SaHpiEventStateT check_mask; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } if ((assert == 0) && (deassert == 0)) { err("Invalid masks"); return SA_ERR_HPI_INVALID_PARAMS; } if (oh_lookup_sensoreventmaskaction(action) == NULL) { err("Invalid action"); return SA_ERR_HPI_INVALID_PARAMS; } handler = (struct oh_handler_state *) oh_handler; rpt = oh_get_resource_by_id(handler->rptcache, resource_id); if (rpt == NULL) { err("INVALID RESOURCE"); return SA_ERR_HPI_INVALID_RESOURCE; } if (! (rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { err("INVALID RESOURCE CAPABILITY"); return SA_ERR_HPI_CAPABILITY; } /* Retrieve sensor rdr from framework of specified rdr number */ rdr = oh_get_rdr_by_type(handler->rptcache, resource_id, SAHPI_SENSOR_RDR, rdr_num); if (rdr == NULL) { err("RDR not present"); return SA_ERR_HPI_NOT_PRESENT; } if (rdr->RdrTypeUnion.SensorRec.EventCtrl != SAHPI_SEC_PER_EVENT) { err("Sensor do no support setting event masks"); return SA_ERR_HPI_READ_ONLY; } /* On adding new sensors with different event category or on supporting * new masks for the existing sensors, update below swtich statement */ switch (rdr->RdrTypeUnion.SensorRec.Category) { case SAHPI_EC_THRESHOLD: check_mask = OA_SOAP_STM_VALID_MASK; break; case SAHPI_EC_PRED_FAIL: check_mask = SAHPI_ES_PRED_FAILURE_DEASSERT | SAHPI_ES_PRED_FAILURE_ASSERT; break; case SAHPI_EC_ENABLE: check_mask = SAHPI_ES_DISABLED | SAHPI_ES_ENABLED; break; case SAHPI_EC_REDUNDANCY: check_mask = SAHPI_ES_FULLY_REDUNDANT | SAHPI_ES_REDUNDANCY_LOST; break; default : err("Un-supported event category %d detected ", rdr->RdrTypeUnion.SensorRec.Category); return SA_ERR_HPI_INTERNAL_ERROR; } if (assert !=0 && (assert & ~(check_mask))) { err("Assert mask is not valid"); return SA_ERR_HPI_INVALID_DATA; } if (deassert != 0 && (deassert & ~(check_mask))) { err("Deassert mask is not valid"); return SA_ERR_HPI_INVALID_DATA; } /* Retrieve sensor_info structure from the private area of rdr */ sensor_info = (struct oa_soap_sensor_info*) oh_get_rdr_data(handler->rptcache, resource_id, rdr->RecordId); if (sensor_info == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); return SA_ERR_HPI_INTERNAL_ERROR; } orig_assert_mask = sensor_info->assert_mask; orig_deassert_mask = sensor_info->deassert_mask; /* Based on the action type, the bits in assert/deassert mask are set * or cleared */ if (action == SAHPI_SENS_ADD_EVENTS_TO_MASKS) { sensor_info->assert_mask = sensor_info->assert_mask | assert; if (rpt->ResourceCapabilities & SAHPI_CAPABILITY_EVT_DEASSERTS) { sensor_info->deassert_mask = sensor_info->assert_mask; } else { sensor_info->deassert_mask = sensor_info->deassert_mask | deassert; } } else if (assert != 0 && action == SAHPI_SENS_REMOVE_EVENTS_FROM_MASKS) { sensor_info->assert_mask = sensor_info->assert_mask & ~(assert); if (rpt->ResourceCapabilities & SAHPI_CAPABILITY_EVT_DEASSERTS) { sensor_info->deassert_mask = sensor_info->assert_mask; } else if (deassert != 0) { sensor_info->deassert_mask = sensor_info->deassert_mask & ~(deassert); } } if ((sensor_info->assert_mask != orig_assert_mask) || (! (rpt->ResourceCapabilities & SAHPI_CAPABILITY_EVT_DEASSERTS) && sensor_info->deassert_mask != orig_deassert_mask)) { /* If the assert or deassert mask has change, raise a * "sensor enable event" */ rv = generate_sensor_enable_event(oh_handler, rdr_num, rpt, rdr, sensor_info); if (rv != SA_OK) { err("Event generation failed"); return rv; } } return SA_OK; } /** * update_sensor_rdr * @oh_handler: Handler data pointer * @resource_id: Resource ID * @rdr_num: Sensor rdr number * @rpt: Pointer to rpt Structure * @sensor_data: Pointer to sensor reading data * * Purpose: * Returns current status of the sensor RDR from resource * * Detailed Description: * - Fetches current reading of the sensor from the resource * by soap call and returns reading in sensor data * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - oa_soap plugin has encountered an internal * error * SA_ERR_HPI_UNKNOWN - Invalid entity type **/ SaErrorT update_sensor_rdr(struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, SaHpiSensorNumT rdr_num, SaHpiRptEntryT *rpt, struct oa_soap_sensor_reading_data *sensor_data) { SaErrorT rv = SA_OK; struct oh_handler_state *handler = NULL; struct oa_soap_handler *oa_handler = NULL; struct getThermalInfo thermal_request; struct thermalInfo thermal_response; struct getBladeThermalInfoArray blade_thermal_request; struct bladeThermalInfoArrayResponse blade_thermal_response; struct bladeThermalInfo blade_thermal_info; struct getBladeStatus server_status_request; struct bladeStatus server_status_response; struct getFanInfo fan_request; struct fanInfo fan_response; struct getPowerSupplyInfo power_supply_request; struct powerSupplyInfo *power_supply_response = NULL; struct powerSubsystemInfo ps_response; SaHpiInt32T location = -1; if (oh_handler == NULL || rpt == NULL || sensor_data == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } handler = (struct oh_handler_state *) oh_handler; oa_handler = (struct oa_soap_handler *) handler->data; location = rpt->ResourceEntity.Entry[0].EntityLocation; thermal_request.bayNumber = server_status_request.bayNumber = fan_request.bayNumber = power_supply_request.bayNumber = blade_thermal_request.bayNumber = location; /* Getting the current reading of the sensor directly from resource * using a soap call */ switch (rpt->ResourceEntity.Entry[0].EntityType) { case (SAHPI_ENT_SYSTEM_BLADE): case (SAHPI_ENT_IO_BLADE): case (SAHPI_ENT_DISK_BLADE): if ((rdr_num == OA_SOAP_SEN_TEMP_STATUS) || ((rdr_num >= OA_SOAP_BLD_THRM_SEN_START) && (rdr_num <= OA_SOAP_BLD_THRM_SEN_END))){ /* Fetching current thermal reading of the * server blade in the specified bay number * NOTE: If the blade is in POWER OFF state or * in unstable state, the control should not * reach this place */ rv = soap_getBladeThermalInfoArray( oa_handler->active_con, &blade_thermal_request, &blade_thermal_response); if (rv != SOAP_OK) { err("Get blade's thermal info failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Traverse the soap response and fetch the * current sensor reading */ rv = oa_soap_get_bld_thrm_sen_data(rdr_num, blade_thermal_response, &blade_thermal_info); if (rv != SA_OK) { err("Could not find the matching" " sensors info from blade"); return rv; } sensor_data->data.IsSupported = SAHPI_TRUE; sensor_data->data.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; sensor_data->data.Value.SensorFloat64 = blade_thermal_info.temperatureC; } else if (rdr_num == OA_SOAP_SEN_PWR_STATUS) { /* Fetching current power status of the * server blade in the specified bay number */ rv = soap_getBladeStatus( oa_handler->active_con, &server_status_request, &server_status_response); if (rv != SOAP_OK) { return SA_ERR_HPI_INTERNAL_ERROR; } sensor_data->data.IsSupported = SAHPI_TRUE; sensor_data->data.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; sensor_data->data.Value.SensorFloat64 = server_status_response.powerConsumed; } break; case (SAHPI_ENT_SWITCH_BLADE): thermal_request.sensorType = SENSOR_TYPE_INTERCONNECT; /* Fetching current thermal reading of the switch blade * in the specified bay number */ rv = soap_getThermalInfo(oa_handler->active_con, &thermal_request, &thermal_response); if (rv != SOAP_OK) { return SA_ERR_HPI_INTERNAL_ERROR; } sensor_data->data.IsSupported = SAHPI_TRUE; sensor_data->data.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; sensor_data->data.Value.SensorFloat64 = thermal_response.temperatureC; break; case (SAHPI_ENT_SYS_MGMNT_MODULE): thermal_request.sensorType = SENSOR_TYPE_OA; /* Fetching current thermal readng of the OA * in the specified bay number */ rv = soap_getThermalInfo(oa_handler->active_con, &thermal_request, &thermal_response); if (rv != SOAP_OK) { return SA_ERR_HPI_INTERNAL_ERROR; } sensor_data->data.IsSupported = SAHPI_TRUE; sensor_data->data.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; sensor_data->data.Value.SensorFloat64 = thermal_response.temperatureC; break; case (SAHPI_ENT_SYSTEM_CHASSIS): thermal_request.sensorType = SENSOR_TYPE_ENC; /* Fetching current thermal readng of the Enclosure * in the specified bay number */ rv = soap_getThermalInfo(oa_handler->active_con, &thermal_request, &thermal_response); if (rv != SOAP_OK) { return SA_ERR_HPI_INTERNAL_ERROR; } sensor_data->data.IsSupported = SAHPI_TRUE; sensor_data->data.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; sensor_data->data.Value.SensorFloat64 = thermal_response.temperatureC; break; case (SAHPI_ENT_FAN): /* Fetching current speed and power consumption info * of fan in the specified bay number */ rv = soap_getFanInfo(oa_handler->active_con, &fan_request, &fan_response); if (rv != SOAP_OK) { return SA_ERR_HPI_INTERNAL_ERROR; } sensor_data->data.IsSupported = SAHPI_TRUE; sensor_data->data.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; if (rdr_num == OA_SOAP_SEN_FAN_SPEED) { sensor_data->data.Value.SensorFloat64 = fan_response.maxFanSpeed; } else if (rdr_num == OA_SOAP_SEN_PWR_STATUS) { sensor_data->data.Value.SensorFloat64 = fan_response.powerConsumed; } break; case (SAHPI_ENT_POWER_MGMNT): /* Fetching current power info of power subsystem */ rv = soap_getPowerSubsystemInfo(oa_handler->active_con, &ps_response); if (rv != SOAP_OK) { return SA_ERR_HPI_INTERNAL_ERROR; } sensor_data->data.IsSupported = SAHPI_TRUE; sensor_data->data.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; if (rdr_num == OA_SOAP_SEN_IN_PWR) { sensor_data->data.Value.SensorFloat64 = ps_response.inputPowerVa; } if (rdr_num == OA_SOAP_SEN_OUT_PWR) { sensor_data->data.Value.SensorFloat64 = ps_response.outputPower; } if (rdr_num == OA_SOAP_SEN_PWR_STATUS) { sensor_data->data.Value.SensorFloat64 = ps_response.powerConsumed; } if (rdr_num == OA_SOAP_SEN_PWR_CAPACITY) { sensor_data->data.Value.SensorFloat64 = ps_response.capacity; } break; case (SAHPI_ENT_POWER_SUPPLY): /* Fetching current actual power output info of * power supply in the specified bay number */ power_supply_response = (struct powerSupplyInfo *)g_malloc0 (sizeof(struct powerSupplyInfo)); if ( power_supply_response == NULL ) return SA_ERR_HPI_OUT_OF_MEMORY; power_supply_response->presence = PRESENCE_NO_OP; power_supply_response->modelNumber[0] = '\0'; power_supply_response->sparePartNumber[0] = '\0'; power_supply_response->serialNumber[0] = '\0'; power_supply_response->productName[0] = '\0'; rv = soap_getPowerSupplyInfo(oa_handler->active_con, &power_supply_request, power_supply_response); if (rv != SOAP_OK) { wrap_g_free(power_supply_response); return SA_ERR_HPI_INTERNAL_ERROR; } sensor_data->data.IsSupported = SAHPI_TRUE; sensor_data->data.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; sensor_data->data.Value.SensorFloat64 = power_supply_response->actualOutput; wrap_g_free(power_supply_response); break; default: err("Wrong resource type"); return SA_ERR_HPI_UNKNOWN; } return SA_OK; } /** * generate_sensor_enable_event * @oh_handler: Handler data pointer. * @rdr_num: Sensor rdr number. * @rpt: Pointer to rpt structure. * @rdr: Pointer to rdr structure. * @sensor_info: Pointer to sensor information structure * * Purpose: * Builds and generates the sensor enable event * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters. **/ SaErrorT generate_sensor_enable_event(void *oh_handler, SaHpiSensorNumT rdr_num, SaHpiRptEntryT *rpt, SaHpiRdrT *rdr, struct oa_soap_sensor_info *sensor_info) { struct oh_handler_state *handler = NULL; struct oh_event event; if (oh_handler == NULL || sensor_info == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } handler = (struct oh_handler_state *) oh_handler; memset(&event, 0, sizeof(struct oh_event)); event.hid = handler->hid; event.event.EventType = SAHPI_ET_SENSOR_ENABLE_CHANGE; /* TODO: map the timestamp of the OA generated event */ oh_gettimeofday(&(event.event.Timestamp)); event.event.Severity = SAHPI_INFORMATIONAL; memcpy(&event.resource, rpt, sizeof(SaHpiRptEntryT)); event.event.Source = rpt->ResourceId; event.event.EventDataUnion.SensorEnableChangeEvent.SensorNum = rdr_num; event.event.EventDataUnion.SensorEnableChangeEvent.SensorType = rdr->RdrTypeUnion.SensorRec.Type; event.event.EventDataUnion.SensorEnableChangeEvent.EventCategory = rdr->RdrTypeUnion.SensorRec.Category; event.event.EventDataUnion.SensorEnableChangeEvent.SensorEnable = sensor_info->sensor_enable; event.event.EventDataUnion.SensorEnableChangeEvent.SensorEventEnable = sensor_info->event_enable; event.event.EventDataUnion.SensorEnableChangeEvent.AssertEventMask = sensor_info->assert_mask; event.event.EventDataUnion.SensorEnableChangeEvent.DeassertEventMask = sensor_info->deassert_mask; event.rdrs = g_slist_append(event.rdrs, g_memdup(rdr, sizeof(SaHpiRdrT))); event.event.EventDataUnion.SensorEnableChangeEvent.OptionalDataPresent = SAHPI_SEOD_CURRENT_STATE; /* If the current state is SAHPI_ES_UPPER_CRIT then the current * asserted event states are SAHPI_ES_UPPER_CRIT and * SAHPI_ES_UPPER_MAJOR. */ if (rdr->RdrTypeUnion.SensorRec.Category == SAHPI_EC_THRESHOLD && sensor_info->current_state == SAHPI_ES_UPPER_CRIT) { event.event.EventDataUnion.SensorEnableChangeEvent. CurrentState = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR; } else { event.event.EventDataUnion.SensorEnableChangeEvent. CurrentState = sensor_info->current_state; } oh_evt_queue_push(handler->eventq, copy_oa_soap_event(&event)); return SA_OK; } /** * generate_sensor_assert_thermal_event * @oh_handler: Handler data pointer * @rdr_num: Sensor rdr number * @rpt: Pointer to rpt structure * @rdr: Pointer to rdr structure * @current_reading: Current reading of sensor * @event_severity: Severity of thermal event * @sensor_info: Pointer to sensor information structure * * Purpose: * Builds and generates the sensor assert thermal event * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters. * SA_ERR_HPI_INTERNAL_ERROR - oa_soap plugin has encountered an internal * error. **/ SaErrorT generate_sensor_assert_thermal_event(void *oh_handler, SaHpiSensorNumT rdr_num, SaHpiRptEntryT *rpt, SaHpiRdrT *rdr, SaHpiSensorReadingT current_reading, SaHpiSeverityT event_severity, struct oa_soap_sensor_info *sensor_info) { struct oh_handler_state *handler = NULL; struct oh_event event; if (oh_handler == NULL || sensor_info == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } handler = (struct oh_handler_state *) oh_handler; memset(&event, 0, sizeof(struct oh_event)); /* Update the event data structure with default values and current * state of the thermal reading */ event.hid = handler->hid; event.event.EventType = SAHPI_ET_SENSOR; oh_gettimeofday(&(event.event.Timestamp)); event.event.Severity = event_severity; memcpy(&event.resource, rpt, sizeof(SaHpiRptEntryT)); event.event.Source = rpt->ResourceId; event.event.EventDataUnion.SensorEvent.SensorNum = rdr_num; event.event.EventDataUnion.SensorEvent.SensorType = SAHPI_TEMPERATURE; event.event.EventDataUnion.SensorEvent.EventCategory = SAHPI_EC_THRESHOLD; event.event.EventDataUnion.SensorEvent.Assertion = SAHPI_TRUE; event.event.EventDataUnion.SensorEvent.EventState = sensor_info->current_state; if (current_reading.IsSupported == SAHPI_TRUE) { event.event.EventDataUnion.SensorEvent.OptionalDataPresent = SAHPI_SOD_TRIGGER_READING | SAHPI_SOD_TRIGGER_THRESHOLD | SAHPI_SOD_PREVIOUS_STATE | SAHPI_SOD_CURRENT_STATE; event.event.EventDataUnion.SensorEvent.TriggerReading = current_reading; } else { event.event.EventDataUnion.SensorEvent.OptionalDataPresent = SAHPI_SOD_TRIGGER_THRESHOLD | SAHPI_SOD_PREVIOUS_STATE | SAHPI_SOD_CURRENT_STATE; } switch (sensor_info->current_state) { case (SAHPI_ES_UNSPECIFIED): err("There is no event to assert"); return SA_OK; case (SAHPI_ES_UPPER_MAJOR): /* Raise an assert event if the thermal reading crosses * the major threshold and assert mask for event is * enabled */ if (! (sensor_info->assert_mask & SAHPI_STM_UP_MAJOR)) { err("Assert mask for major threshold is " "not set"); return SA_OK; } if (sensor_info->previous_state == SAHPI_ES_UNSPECIFIED) { event.event.EventDataUnion.SensorEvent. TriggerThreshold = sensor_info->threshold.UpMajor; } else { err("There is no event to assert"); return SA_OK; } break; case (SAHPI_ES_UPPER_CRIT): /* Raise an assert event if the thermal reading crosses * the critical threshold and assert mask for event is * enabled */ if (! (sensor_info->assert_mask & SAHPI_STM_UP_CRIT)) { err("Assert mask for critical threshold is " "not set"); return SA_OK; } event.event.EventDataUnion.SensorEvent. TriggerThreshold = sensor_info->threshold.UpCritical; break; default: err("Invalid current state for asserting the event"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Update the event structure with previous and current state after * a threshold has been crossed */ event.event.EventDataUnion.SensorEvent.PreviousState = sensor_info->previous_state; /* If the current state is SAHPI_ES_UPPER_CRIT the current asserted * event states are SAHPI_ES_UPPER_CRIT and SAHPI_ES_UPPER_MAJOR */ if (sensor_info->current_state == SAHPI_ES_UPPER_CRIT) { event.event.EventDataUnion.SensorEvent.CurrentState = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR; } else { event.event.EventDataUnion.SensorEvent.CurrentState = sensor_info->current_state; } event.rdrs = g_slist_append(event.rdrs, g_memdup(rdr, sizeof(SaHpiRdrT))); oh_evt_queue_push(handler->eventq, copy_oa_soap_event(&event)); return SA_OK; } /** * generate_sensor_deassert_thermal_event * @oh_handler: Handler data pointer. * @rdr_num: Sensor rdr number. * @rpt: Pointer to rpt structure. * @rdr: Pointer to rdr structure * @current_reading: Current reading of sensor * @sensor_info: Pointer to sensor information structure * * Purpose: * Builds and generates the sensor deassert thermal event * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters. * SA_ERR_HPI_INTERNAL_ERROR - oa_soap plugin has encountered an internal * error. **/ SaErrorT generate_sensor_deassert_thermal_event(void *oh_handler, SaHpiSensorNumT rdr_num, SaHpiRptEntryT *rpt, SaHpiRdrT *rdr, SaHpiSensorReadingT current_reading, SaHpiSeverityT event_severity, struct oa_soap_sensor_info *sensor_info) { struct oh_handler_state *handler = NULL; struct oh_event event; if (oh_handler == NULL || sensor_info == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } handler = (struct oh_handler_state *) oh_handler; memset(&event, 0, sizeof(struct oh_event)); /* Update the event data structure with default values and current * state of the thermal reading */ event.hid = handler->hid; event.event.EventType = SAHPI_ET_SENSOR; oh_gettimeofday(&(event.event.Timestamp)); event.event.Severity = event_severity; memcpy(&event.resource, rpt, sizeof(SaHpiRptEntryT)); event.event.Source = rpt->ResourceId; event.event.EventDataUnion.SensorEvent.SensorNum = rdr_num; event.event.EventDataUnion.SensorEvent.SensorType = SAHPI_TEMPERATURE; event.event.EventDataUnion.SensorEvent.EventCategory = SAHPI_EC_THRESHOLD; event.event.EventDataUnion.SensorEvent.Assertion = SAHPI_FALSE; event.event.EventDataUnion.SensorEvent.EventState = sensor_info->previous_state; if (current_reading.IsSupported == SAHPI_TRUE) { event.event.EventDataUnion.SensorEvent.OptionalDataPresent = SAHPI_SOD_TRIGGER_READING | SAHPI_SOD_TRIGGER_THRESHOLD | SAHPI_SOD_PREVIOUS_STATE | SAHPI_SOD_CURRENT_STATE; event.event.EventDataUnion.SensorEvent.TriggerReading = current_reading; } else { event.event.EventDataUnion.SensorEvent.OptionalDataPresent = SAHPI_SOD_TRIGGER_THRESHOLD | SAHPI_SOD_PREVIOUS_STATE | SAHPI_SOD_CURRENT_STATE; } switch (sensor_info->current_state) { case (SAHPI_ES_UNSPECIFIED): /* Raise an deassert event if the thermal reading drops * below the major threshold and deassert mask for event * is enabled */ if (! (sensor_info->deassert_mask & SAHPI_STM_UP_MAJOR)) { err("Event deassert mask for major threshold " "is not set"); return SA_OK; } if (sensor_info->previous_state == SAHPI_STM_UP_MAJOR) { event.event.EventDataUnion.SensorEvent. TriggerThreshold = sensor_info->threshold.UpMajor; } else { err("There is no event to deassert"); return SA_OK; } break; case (SAHPI_ES_UPPER_MAJOR): /* Raise an deassert event if the thermal reading drops * below the critical threshold and deassert mask for * event is enabled */ if (sensor_info->previous_state == SAHPI_ES_UPPER_CRIT) { if (! (sensor_info->deassert_mask & SAHPI_STM_UP_CRIT)) { err("Event deassert mask for critical " "threshold is not set"); return SA_OK; } event.event.EventDataUnion.SensorEvent. TriggerThreshold = sensor_info->threshold.UpCritical; } else { err("There is no event to deassert"); return SA_OK; } break; case (SAHPI_ES_UPPER_CRIT): err("There is no event to deassert"); return SA_OK; break; default: err("Invalid current state"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Update the event structure with previous and current state after * a threshold has been crossed. * If the previous state is SAHPI_ES_UPPER_CRIT the previous asserted * event states are SAHPI_ES_UPPER_CRIT and SAHPI_ES_UPPER_MAJOR */ if (sensor_info->previous_state == SAHPI_ES_UPPER_CRIT) { event.event.EventDataUnion.SensorEvent.PreviousState = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR; } else { event.event.EventDataUnion.SensorEvent.PreviousState = sensor_info->previous_state; } event.event.EventDataUnion.SensorEvent.CurrentState = sensor_info->current_state; event.rdrs = g_slist_append(event.rdrs, g_memdup(rdr, sizeof(SaHpiRdrT))); oh_evt_queue_push(handler->eventq, copy_oa_soap_event(&event)); return SA_OK; } /** * check_and_deassert_event * @oh_handler: Pointer to openhpi handler * @resource_id: Resource id * @rdr: Pointer to rdr structure * @sensor_info: Pointer to the sensor information * * Purpose: * Check and deassert the pending events on resource * * Detailed Description: * - This is the module is called to check what thermal event to deassert * based on the current state * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - oa_soap plugin has encountered an internal * error. **/ SaErrorT check_and_deassert_event(struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, SaHpiRdrT *rdr, struct oa_soap_sensor_info *sensor_info) { SaErrorT rv = SA_OK; SaHpiSeverityT event_severity; SaHpiSensorReadingT current_reading; SaHpiRptEntryT *rpt = NULL; current_reading.IsSupported = SAHPI_FALSE; rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (rpt == NULL) { err("INVALID RESOURCE"); return SA_ERR_HPI_INVALID_RESOURCE; } if (sensor_info->current_state == SAHPI_ES_UPPER_CRIT) { /* if the current state is CRITICAL, then this module would * have been called when the thermal reading would have dropped * below critical threshold. * Hence thermal event raised for crossing critical threshold * will be deasserted */ sensor_info->previous_state = SAHPI_ES_UPPER_CRIT; sensor_info->current_state = SAHPI_ES_UPPER_MAJOR; event_severity = SAHPI_CRITICAL; rv = generate_sensor_deassert_thermal_event(oh_handler, OA_SOAP_SEN_TEMP_STATUS, rpt, rdr, current_reading, event_severity, sensor_info); if (rv != SA_OK) { err("Raising critical deassert thermal event failed"); } } if (sensor_info->current_state == SAHPI_ES_UPPER_MAJOR) { /* if the current state is MAJOR, then this module would * have been called when the thermal reading would have dropped * below major threshold. * Hence thermal event raised for crossing major threshold * will be deasserted */ sensor_info->previous_state = SAHPI_ES_UPPER_MAJOR; sensor_info->current_state = SAHPI_ES_UNSPECIFIED; event_severity = SAHPI_MAJOR; rv = generate_sensor_deassert_thermal_event(oh_handler, OA_SOAP_SEN_TEMP_STATUS, rpt, rdr, current_reading, event_severity, sensor_info); if (rv != SA_OK) { err("Raising major deassert thermal event failed"); } } return SA_OK; } /** * oa_soap_build_sen_rdr * @oh_handler: Pointer to openhpi handler * @resource_id: Resource id * @rdr: Pointer to rdr structure * @sensor_info: Pointer to the sensor information * @sensor_num: Sensor number * * Purpose: * Build the sensor RDR * * Detailed Description: * - Allocates the memory for sensor info * - Copies the sensor RDR from the global sensor array * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - oa_soap plugin has encountered an internal * error. **/ SaErrorT oa_soap_build_sen_rdr(struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, SaHpiRdrT *rdr, struct oa_soap_sensor_info **sensor_info, SaHpiSensorNumT sensor_num) { SaHpiRptEntryT *rpt = NULL; if (oh_handler == NULL || rdr == NULL || sensor_info == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } /* Get the rpt entry of the resource */ rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (rpt == NULL) { err("resource RPT is NULL"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Sensor specific information is stored in this structure */ *sensor_info = g_memdup(&(oa_soap_sen_arr[sensor_num].sensor_info), sizeof(struct oa_soap_sensor_info)); if (*sensor_info == NULL) { err("oa_soap out of memory"); return SA_ERR_HPI_OUT_OF_MEMORY; } /* Populate the sensor rdr with default value */ rdr->Entity = rpt->ResourceEntity; rdr->RdrType = SAHPI_SENSOR_RDR; rdr->RdrTypeUnion.SensorRec = oa_soap_sen_arr[sensor_num].sensor; oh_init_textbuffer(&(rdr->IdString)); oh_append_textbuffer(&(rdr->IdString), oa_soap_sen_arr[sensor_num].comment); return SA_OK; } /** * oa_soap_map_sen_val * @sensor_info: Pointer to the sensor information structure * @sensor_num: Sensor number * @sensor_value: Value of the sensor * @sensor_status: Pointer to the sensor status * * Purpose: * Maps the sensor value got from SOAP call to HPI sensor state, if it is * changed * * Detailed Description: * NA * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters. * SA_ERR_HPI_INTERNAL_ERROR - One seeing the unsupported sensor value **/ SaErrorT oa_soap_map_sen_val(struct oa_soap_sensor_info *sensor_info, SaHpiSensorNumT sensor_num, SaHpiInt32T sensor_value, SaHpiInt32T *sensor_status) { SaHpiInt32T sensor_class; if (sensor_info == NULL || sensor_status == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } /* Get the sensor value */ sensor_class = oa_soap_sen_arr[sensor_num].sensor_class; /* Check whether the sensor value is supported or not */ if (oa_soap_sen_val_map_arr[sensor_class][sensor_value] == -1) { err("Not supported sensor value %d detected.", sensor_value); return SA_ERR_HPI_INTERNAL_ERROR; } /* Check whether HPI sensor value has changed or not*/ if (sensor_info->current_state != oa_soap_sen_val_map_arr[sensor_class][sensor_value]) { /* Update the current sensor state */ sensor_info->current_state = oa_soap_sen_val_map_arr[sensor_class][sensor_value]; /* Get the assert state of the sensor */ *sensor_status = oa_soap_sen_assert_map_arr[sensor_class][sensor_value]; } else { /* Sensor value has not changed */ *sensor_status = OA_SOAP_SEN_NO_CHANGE; } return SA_OK; } /** * oa_soap_gen_res_evt * @oh_handler: Pointer to openhpi handler * @rpt: Pointer to the rpt structure * @sensor_status: sensor status * * Purpose: * Generates the HPI reource event * changed * * Detailed Description: * - If the operational status sensor state is asserted, then resource * event type is set to FAILURE and ResourceFailed field is set to TRUE. * - If the operational status sensor state is deasserted, then resource * event type is set to RESTORED and ResourceFailed field is set to * FALSE. * - Pushes the modified RPT entry to plugin rptcache. * - Raises the HPI resource event. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters. * SA_ERR_HPI_INTERNAL_ERROR - One seeing the unsupported sensor value **/ static void oa_soap_gen_res_evt(struct oh_handler_state *oh_handler, SaHpiRptEntryT *rpt, SaHpiInt32T sensor_status) { SaErrorT rv; struct oh_event event; struct oa_soap_hotswap_state *hotswap_state = NULL; if (oh_handler == NULL || rpt == NULL) { err("Invalid parameters"); return; } memset(&event, 0, sizeof(struct oh_event)); if (sensor_status == OA_SOAP_SEN_ASSERT_TRUE && rpt->ResourceFailed != SAHPI_TRUE) { /* Resource failed */ event.event.EventDataUnion.ResourceEvent. ResourceEventType = SAHPI_RESE_RESOURCE_FAILURE; rpt->ResourceFailed = SAHPI_TRUE; } else if (sensor_status == OA_SOAP_SEN_ASSERT_FALSE && rpt->ResourceFailed != SAHPI_FALSE) { /* Resource restored */ event.event.EventDataUnion.ResourceEvent. ResourceEventType = SAHPI_RESE_RESOURCE_RESTORED; rpt->ResourceFailed = SAHPI_FALSE; } else { /* Do not generate resource event as there is no change */ return; } /* Update the event structure */ event.hid = oh_handler->hid; oh_gettimeofday(&(event.event.Timestamp)); event.event.Severity = SAHPI_CRITICAL; event.event.Source = rpt->ResourceId; event.event.EventType = SAHPI_ET_RESOURCE; /* Get the hotswap structure */ if (rpt->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP) { hotswap_state = (struct oa_soap_hotswap_state *) oh_get_resource_data(oh_handler->rptcache, rpt->ResourceId); } /* Update the RPT entry */ rv = oh_add_resource(oh_handler->rptcache, rpt, hotswap_state, 0); if (rv != SA_OK) { err("Adding resource failed"); return; } memcpy(&(event.resource), rpt, sizeof(SaHpiRptEntryT)); oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); } /** * oa_soap_gen_sen_evt * @oh_handler: Pointer to openhpi handler * @rpt: Pointer to the rpt structure * @rdr: Pointer to rdr structure * @sensor_status: Status of the sensor * * Purpose: * Generates the HPI sensor event * * Detailed Description: * - Obtains the sensor event structure from the global sensor array * - If the trigger reading is greater than zero, then sets the trigger * reading value in the sensor event structure. * - If the trigger threshold is greater than zero, then sets the trigger * threshold value in the sensor event structure. * - Appends the sensor RDR to the event structure * - Raises the HPI sensor event * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters. **/ static SaErrorT oa_soap_gen_sen_evt(struct oh_handler_state *oh_handler, SaHpiRptEntryT *rpt, SaHpiRdrT *rdr, SaHpiInt32T sensor_status, SaHpiFloat64T trigger_reading, SaHpiFloat64T trigger_threshold) { struct oh_event event; SaHpiSensorNumT sensor_num; if (oh_handler == NULL || rpt == NULL || rdr == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } sensor_num = rdr->RdrTypeUnion.SensorRec.Num; /* Update the event structure */ memset(&event, 0, sizeof(struct oh_event)); /* Get the event structure from gloabl array */ event.event = oa_soap_sen_arr[sensor_num].sen_evt[sensor_status]; if (trigger_reading > 0) { event.event.EventDataUnion.SensorEvent.TriggerReading.Value. SensorFloat64 = trigger_reading; } if (trigger_threshold > 0) { event.event.EventDataUnion.SensorEvent.TriggerThreshold.Value. SensorFloat64 = trigger_threshold; } memcpy(&(event.resource), rpt, sizeof(SaHpiRptEntryT)); event.event.Source = event.resource.ResourceId; event.hid = oh_handler->hid; oh_gettimeofday(&(event.event.Timestamp)); event.rdrs = g_slist_append(event.rdrs, g_memdup(rdr, sizeof(SaHpiRdrT))); /* Raise the HPI sensor event */ oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); return SA_OK; } /** * oa_soap_proc_sen_evt * @oh_handler: Pointer to openhpi handler * @resource_id: Resource Id * @sensor_num: Sensor number * @sensor_value: Sensor value * * Purpose: * Processes and raises the sensor event * * Detailed Description: * - Raises the sensor event on changes in the state of the sensors with * sensor class OPER, PRED_FAIL, REDUND, DIAG, ENC_AGR_OPER, * ENC_AGR_PRED_FAIL, BOOL, BOOL_RVRS, HEALTH_OPER, HEALTH_PRED_FAIL. * - Raises the resource failed or restored event if there is a change in * the operational status sensor state. * - Raises the sensor event on changes in the state of the sensors with * sensor class TEMP * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - oa_soap plugin has encountered an internal * error. **/ SaErrorT oa_soap_proc_sen_evt(struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, SaHpiSensorNumT sensor_num, SaHpiInt32T sensor_value, SaHpiFloat64T trigger_reading, SaHpiFloat64T trigger_threshold) { SaErrorT rv = SA_OK; SaHpiInt32T sensor_status; SaHpiInt32T sensor_class; SaHpiRptEntryT *rpt = NULL; SaHpiRdrT *rdr = NULL; struct oa_soap_sensor_info *sensor_info; SaHpiInt32T event_index = -1; if (oh_handler == NULL) { err("wrong parameters passed"); return SA_ERR_HPI_INVALID_PARAMS; } /* Get the rpt entry of the resource */ rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (rpt == NULL) { err("resource RPT is NULL"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Get the enable sensor RDR */ rdr = oh_get_rdr_by_type(oh_handler->rptcache, rpt->ResourceId, SAHPI_SENSOR_RDR, sensor_num); if (rdr == NULL) { err("RDR not present"); return SA_ERR_HPI_NOT_PRESENT; } /* Get the sensor information */ sensor_info = (struct oa_soap_sensor_info*) oh_get_rdr_data(oh_handler->rptcache, rpt->ResourceId, rdr->RecordId); if (sensor_info == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); return SA_ERR_HPI_INTERNAL_ERROR; } sensor_class = oa_soap_sen_arr[sensor_num].sensor_class; switch (sensor_class) { case OA_SOAP_OPER_CLASS: case OA_SOAP_PRED_FAIL_CLASS: case OA_SOAP_REDUND_CLASS: case OA_SOAP_DIAG_CLASS: case OA_SOAP_ENC_AGR_OPER_CLASS: case OA_SOAP_ENC_AGR_PRED_FAIL_CLASS: case OA_SOAP_BOOL_CLASS: case OA_SOAP_BOOL_RVRS_CLASS: case OA_SOAP_HEALTH_OPER_CLASS: case OA_SOAP_HEALTH_PRED_FAIL_CLASS: rv = oa_soap_map_sen_val(sensor_info, sensor_num, sensor_value, &sensor_status); if (rv != SA_OK) { err("Setting sensor value has failed"); return rv; } /* If there is no change in the sensor value, ignore the * OA event */ if (sensor_status == OA_SOAP_SEN_NO_CHANGE) return SA_OK; /* Ignore the sensor event if the sensor is disabled or * sensor event is disabled */ if (sensor_info->sensor_enable == SAHPI_FALSE || sensor_info->event_enable == SAHPI_FALSE) { dbg ("Sensor is disabled or sensor event is " "disabled"); } else { /* Generate the sensor event */ oa_soap_gen_sen_evt(oh_handler, rpt, rdr, sensor_status, 0, 0); } /* Generate resource failed/restored event based on the * operational status sensor state */ if (sensor_num == OA_SOAP_SEN_OPER_STATUS) { oa_soap_gen_res_evt(oh_handler, rpt, sensor_status); } break; case OA_SOAP_TEMP_CLASS: /* If the thermal sensor is enabled and sensor * event is enabled * Then raise the thermal sensor events, * Else, ignore the thermal event from OA */ if (sensor_info->sensor_enable == SAHPI_FALSE || sensor_info->event_enable == SAHPI_FALSE) { dbg ("Sensor or sensor event is disabled"); return SA_OK; } /* Check the current state of the sensor and determine * the index of event in event array of the sensor * required for raising the event */ switch (sensor_value) { case SENSOR_STATUS_OK: /* Sensor has changed the state from * CAUTION to OK. * Update the event structure. */ sensor_info->previous_state = SAHPI_ES_UPPER_MAJOR; sensor_info->current_state = SAHPI_ES_UNSPECIFIED; event_index = OA_SOAP_TEMP_CAUT_OK; break; case SENSOR_STATUS_CAUTION: /* Sensor has changed the state to * CAUTION from CRITICAL or OK. * Update the event structure. */ sensor_info->previous_state = sensor_info->current_state; sensor_info->current_state = SAHPI_ES_UPPER_MAJOR; if (sensor_info->previous_state == SAHPI_ES_UNSPECIFIED) { event_index = OA_SOAP_TEMP_OK_CAUT; } else { event_index = OA_SOAP_TEMP_CRIT_CAUT; } break; case SENSOR_STATUS_CRITICAL: /* Sensor has changed the state from * CAUTION to CRITICAL. * Update the event structure. */ sensor_info->previous_state = SAHPI_ES_UPPER_MAJOR; sensor_info->current_state = SAHPI_ES_UPPER_CRIT; event_index = OA_SOAP_TEMP_CAUT_CRIT; break; default: err("Event not supported for the \ specified sensor status"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Raise the event */ rv = oa_soap_gen_sen_evt(oh_handler, rpt, rdr, event_index, trigger_reading, trigger_threshold); if (rv != SA_OK) { err("Error in generating sensor event"); return rv; } break; default: err("No event support for specified class"); } return SA_OK; } /** * oa_soap_proc_mem_evt * @oh_handler: Pointer to openhpi handler * @resource_id: Resource Id * @sensor_num: Sensor number * @trigger_reading: mainMemoryErros sensor reading * @severity: Event severity * * Purpose: * Processes and raises the memory event * * Detailed Description: * - Raises the memory event when there is/are DIMM failure/s * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - oa_soap plugin has encountered an internal * error. **/ SaErrorT oa_soap_proc_mem_evt(struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, SaHpiSensorNumT sensor_num, char *trigger_reading, SaHpiSeverityT severity) { SaHpiRptEntryT *rpt = NULL; struct oh_event event; int len = 0; if (oh_handler == NULL) { err("wrong parameters passed"); return SA_ERR_HPI_INVALID_PARAMS; } /* Get the rpt entry of the resource */ rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (rpt == NULL) { err("resource RPT is NULL"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Update the event structure */ memset(&event, 0, sizeof(struct oh_event)); event.event.EventType = SAHPI_ET_SENSOR; memcpy(&(event.resource), rpt, sizeof(SaHpiRptEntryT)); event.event.Source = event.resource.ResourceId; event.hid = oh_handler->hid; event.event.EventDataUnion.SensorEvent.SensorNum = OA_SOAP_SEN_MAIN_MEMORY_ERRORS; event.event.EventDataUnion.SensorEvent.SensorType = SAHPI_MEMORY; event.event.EventDataUnion.SensorEvent.EventCategory = SAHPI_EC_PRED_FAIL; event.event.EventDataUnion.SensorEvent.OptionalDataPresent = SAHPI_SOD_TRIGGER_READING; event.event.EventDataUnion.SensorEvent.TriggerReading.Type = SAHPI_SENSOR_READING_TYPE_BUFFER; event.event.EventDataUnion.SensorEvent.TriggerReading.IsSupported = SAHPI_TRUE; oh_gettimeofday(&(event.event.Timestamp)); switch (severity) { case SAHPI_CRITICAL: event.event.EventDataUnion.SensorEvent.Assertion = SAHPI_TRUE; event.event.EventDataUnion.SensorEvent.EventState = SAHPI_ES_PRED_FAILURE_ASSERT; event.event.Severity = SAHPI_CRITICAL; break; case SAHPI_OK: event.event.EventDataUnion.SensorEvent.Assertion = SAHPI_FALSE; event.event.EventDataUnion.SensorEvent.EventState = SAHPI_ES_PRED_FAILURE_DEASSERT; event.event.Severity = SAHPI_OK; break; default: err("unknown severity"); return SA_ERR_HPI_INTERNAL_ERROR; } len = strlen(trigger_reading); if (len >= SAHPI_SENSOR_BUFFER_LENGTH) len = SAHPI_SENSOR_BUFFER_LENGTH - 1; strncpy((char *)&event.event.EventDataUnion.SensorEvent.TriggerReading. Value.SensorBuffer, trigger_reading, len); oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); return SA_OK; } /** * oa_soap_map_thresh_resp * @rdr: Pointer to the sensor rdr * @oa_soap_threshold_sensor: Structure containing the threshold reading * @sensor_info: Pointer to the sensor information structure * * Purpose: * Updates the rdr structure with the threshold values retrieved from OA * For Thermal sensors, current state in sensor_info is updated based on * current reading * * Detailed Description: * NA * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters. * SA_ERR_HPI_INTERNAL_ERROR - One seeing the unsupported sensor value **/ SaErrorT oa_soap_map_thresh_resp(SaHpiRdrT *rdr, void *response, SaHpiBoolT event_support, struct oa_soap_sensor_info *sensor_info) { SaHpiSensorRecT *sensor = NULL; SaHpiUint32T current_reading = 0; SaHpiInt32T sensor_class; struct thermalInfo *thermal_response; struct bladeThermalInfo *blade_thermal_response; struct fanInfo *fan_info; if (rdr == NULL || sensor_info == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } sensor = &(rdr->RdrTypeUnion.SensorRec); sensor_class = oa_soap_sen_arr[sensor->Num].sensor_class; switch (sensor_class) { case OA_SOAP_TEMP_CLASS: case OA_SOAP_BLADE_THERMAL_CLASS: /* Ambient Zone thermal sensor is present for most of * resource. Ambient Zone threshold info for Blade is * available from bladeThermalInfo response, where as * for other resources it is available it is available * from thermalInfo response. * Hence for Blade Ambient zone threshold info * set sensor class as OA_SOAP_BLADE_THERMAL_CLASS to * retrieve threshold values from correct response. */ if ((rdr->Entity.Entry[0].EntityType == SAHPI_ENT_SYSTEM_BLADE) || (rdr->Entity.Entry[0].EntityType == SAHPI_ENT_IO_BLADE) || (rdr->Entity.Entry[0].EntityType == SAHPI_ENT_DISK_BLADE)) { sensor_class = OA_SOAP_BLADE_THERMAL_CLASS; } if (sensor_class == OA_SOAP_TEMP_CLASS) { /* Cast the response structure to thermal info * response */ thermal_response = (struct thermalInfo *)response; /* Updating the rdr with actual upper critical * threshold value provided by OA */ sensor->DataFormat.Range.Max.Value. SensorFloat64 = sensor_info->threshold.UpCritical.Value. SensorFloat64 = thermal_response->criticalThreshold; sensor->DataFormat.Range.NormalMax.Value. SensorFloat64 = sensor_info->threshold.UpMajor.Value. SensorFloat64 = thermal_response->cautionThreshold; current_reading = (SaHpiUint32T)thermal_response->temperatureC; } else if (sensor_class == OA_SOAP_BLADE_THERMAL_CLASS) { /* Cast the response structure to blade thermal * info response */ blade_thermal_response = (struct bladeThermalInfo *)response; /* Updating the rdr with actual upper critical * threshold value provided by OA */ sensor->DataFormat.Range.Max.Value. SensorFloat64 = sensor_info->threshold.UpCritical.Value. SensorFloat64 = blade_thermal_response->criticalThreshold; sensor->DataFormat.Range.NormalMax.Value. SensorFloat64 = sensor_info->threshold.UpMajor.Value. SensorFloat64 = blade_thermal_response->cautionThreshold; current_reading = (SaHpiUint32T)blade_thermal_response-> temperatureC; } /* Update the sensor info with current reading, this * reading will be utilized sensor event assetion post * discovery. */ if ((current_reading >= sensor->DataFormat.Range.NormalMax.Value. SensorFloat64) && (current_reading < sensor->DataFormat.Range.Max.Value. SensorFloat64)) { sensor_info->current_state = SAHPI_ES_UPPER_MAJOR; } else if (current_reading > sensor->DataFormat.Range.Max.Value. SensorFloat64) { sensor_info->current_state = SAHPI_ES_UPPER_CRIT; } /* Update the sensor info with current reading, this * reading will be utilized for sensor event assertion * post discovery. */ sensor_info->sensor_reading.Value.SensorFloat64 = current_reading; if (event_support == SAHPI_TRUE) { /* Set the event support to TRUE. * By default, RDR will have event support set * to FALSE */ sensor->EventCtrl = SAHPI_SEC_PER_EVENT; sensor->Events = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR; sensor_info->event_enable = SAHPI_TRUE; /* Thermal events are supported by OA only for * crossing CAUTION threshold and CRITICAL * THRESHOLD. * Hence appropriate bit masks needs to set for * assert and deassert mask */ sensor_info->assert_mask = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR; sensor_info->deassert_mask = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR; } break; case OA_SOAP_FAN_SPEED_CLASS: /* Cast the response structure to fan info response */ fan_info = (struct fanInfo*) response; /* Updating the rdr with actual critical threshold * value provided by OA */ sensor->DataFormat.Range.Max.Value.SensorFloat64 = fan_info->maxFanSpeed; /* Updating the rdr with actual critical threshold * value provided by OA */ sensor->DataFormat.Range.Max.Value.SensorFloat64 = fan_info->lowLimitFanSpeed; /* Currently OA does not have event support for SPEED * sensor, hence ignoring the event_support flag */ break; default: err("Sensor class not supported"); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } /** * oa_soap_assert_sen_evt * @oh_handler : Pointer to openhpi handler * @rpt : Pointer to the RPT entry * @assert_sensor_list : Pointer to the assert sensor list * * Purpose: * Generates the sensor events for asserted sensors. * * Detailed Description: * - Extracts the sensor RDR from the assert sensor list * - Obtains the sensor number and sensor class. * - Gets the appropriate sensor assert event structure from the global * sensor array * - Raises the sensor assert event * - If the operational status of the resource has asserted, then raises * the resource failed event * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters. **/ SaErrorT oa_soap_assert_sen_evt(struct oh_handler_state *oh_handler, SaHpiRptEntryT *rpt, GSList *assert_sensor_list) { GSList *node = NULL; SaHpiRdrT *rdr; SaHpiSensorNumT sensor_num; SaHpiInt32T sensor_class, assert_state; struct oa_soap_sensor_info *sensor_info; SaHpiFloat64T trigger_reading, trigger_threshold; if (oh_handler == NULL || rpt == NULL || assert_sensor_list == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } for (node = assert_sensor_list; node; node = node->next) { rdr = (SaHpiRdrT *)node->data; sensor_num = rdr->RdrTypeUnion.SensorRec.Num; /* Get the sensor information */ sensor_info = (struct oa_soap_sensor_info*) oh_get_rdr_data(oh_handler->rptcache, rpt->ResourceId, rdr->RecordId); sensor_class = oa_soap_sen_arr[sensor_num].sensor_class; switch (sensor_class) { case OA_SOAP_OPER_CLASS: case OA_SOAP_PRED_FAIL_CLASS: case OA_SOAP_REDUND_CLASS: case OA_SOAP_DIAG_CLASS: case OA_SOAP_ENC_AGR_OPER_CLASS: case OA_SOAP_ENC_AGR_PRED_FAIL_CLASS: case OA_SOAP_BOOL_CLASS: case OA_SOAP_BOOL_RVRS_CLASS: case OA_SOAP_HEALTH_OPER_CLASS: case OA_SOAP_HEALTH_PRED_FAIL_CLASS: trigger_reading = 0; trigger_threshold = 0; assert_state = OA_SOAP_SEN_ASSERT_TRUE; /* If the blade type is IO_BLADE or DISK BLADE * and if predictive failure sensor is * asserted, then change the power state of * partner blade in oa_soap_bay_pwr_status * to SAHPI_POWER_OFF */ if ((rpt->ResourceEntity.Entry[0].EntityType == SAHPI_ENT_IO_BLADE) || (rpt->ResourceEntity.Entry[0].EntityType == SAHPI_ENT_DISK_BLADE)) { if (sensor_num == OA_SOAP_SEN_PRED_FAIL) { oa_soap_bay_pwr_status[rpt-> ResourceEntity.Entry[0]. EntityLocation -1] = SAHPI_POWER_OFF; } } break; case OA_SOAP_TEMP_CLASS: trigger_reading = sensor_info->sensor_reading.Value. SensorFloat64; trigger_threshold = sensor_info->threshold.UpMajor.Value. SensorFloat64; assert_state = OA_SOAP_TEMP_OK_CAUT; if (sensor_info->current_state == SAHPI_ES_UPPER_CRIT) { /* Generate OK to CAUTION thermal * event */ oa_soap_gen_sen_evt(oh_handler, rpt, rdr, assert_state, trigger_reading, trigger_threshold); /* Update the assert state and trigger * threshold values */ assert_state = OA_SOAP_TEMP_CAUT_CRIT; trigger_threshold = sensor_info->threshold.UpMajor. Value.SensorFloat64; } break; default: err("Unrecognized sensor class %d " "is detected", sensor_class); /* Release the node->data */ wrap_g_free(node->data); continue; } /* Generate the sensor event */ oa_soap_gen_sen_evt(oh_handler, rpt, rdr, assert_state, trigger_reading, trigger_threshold); /* If the operational status has failed, raise the resource * failed event */ if (sensor_num == OA_SOAP_SEN_OPER_STATUS) oa_soap_gen_res_evt(oh_handler, rpt, OA_SOAP_SEN_ASSERT_TRUE); /* Release the node->data */ wrap_g_free(node->data); } /* End of while loop */ /* Release the assert_sensor_list */ g_slist_free(assert_sensor_list); return SA_OK; } /** * oa_soap_get_bld_thrm_sen_data * @oh_handler : Pointer to openhpi handler * @response : bladeThermalInfoArrayResponse response * @bld_thrm_info : pointer to the bladeThermalInfo * * Purpose: * Retrieve the correct instance of bladeThermalInfo structure instance * from bladeThermalInfoArrayResponse response * * Detailed Description: * NA * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters. **/ SaErrorT oa_soap_get_bld_thrm_sen_data(SaHpiSensorNumT sen_num, struct bladeThermalInfoArrayResponse response, struct bladeThermalInfo *bld_thrm_info) { SaHpiInt32T sen_delta_num = 0; struct bladeThermalInfo blade_thermal_info; SaHpiInt32T index = -1, i; if (bld_thrm_info == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } /* "getBladeThermalInfoArray" response contains multiple instances * of bladeThermalInfo. It is required to map the correct instance * of the getBladeThermalInfo structure to the sensor number whose * reading is requested. * This mapping is achieved as follows: * Based on the sensor number, sensor base number and difference of the * sensor number w.r.t. sensor base number is determined(sen_delta_num). * This sen_delta_num helps determine the location of bladeThermalInfo * structure instance in the response required for sensor data. */ if (sen_num != OA_SOAP_SEN_TEMP_STATUS) { sen_delta_num = sen_num - oa_soap_bld_thrm_sen_base_arr [sen_num - OA_SOAP_BLD_THRM_SEN_START]; } /* As per discovery, mapping between the bladeThermalInfo response and * the sensor number can be be achieved based on the description string * in response and comment field in the sensor rdr. * Sometimes the comment field in sensor rdr may not have matching * substring in soap response. * Hence map the sensor rdr comment field to the standard string listed * in oa_soap_thermal_sensor_string array. as it is assumed that the * strings list in this array will match the description in response * For example: * The comment field of the system zone sensor * is "System Zone thermal status" and if the description field of * bladeThermalInfo structure is "System Zone", then it is possible to * achieve mapping between the response and sensor rdr. * But if the description field of bladeThermalInfo contains * "System Chassis", then it is difficult to achieve the mapping * between bladeThermalInfo structure instance to any particular sensor. */ for (i = 0; i */ #ifndef _OA_SOAP_SEL_H #define _OA_SOAP_SEL_H /* Include files */ #include #include SaErrorT oa_soap_get_sel_info(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiEventLogInfoT *info); SaErrorT oa_soap_get_sel_caps(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiEventLogCapabilitiesT *caps); SaErrorT oa_soap_set_sel_time(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiTimeT time); SaErrorT oa_soap_add_sel_entry(void *oh_handler, SaHpiResourceIdT resource_id, const SaHpiEventT *Event); SaErrorT oa_soap_clear_sel(void *oh_handler, SaHpiResourceIdT id); SaErrorT oa_soap_reset_sel_overflow(void *oh_handler, SaHpiResourceIdT resource_id); SaErrorT oa_soap_get_sel_entry(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiEventLogEntryIdT current, SaHpiEventLogEntryIdT *prev, SaHpiEventLogEntryIdT *next, SaHpiEventLogEntryT *entry, SaHpiRdrT *rdr, SaHpiRptEntryT *rpt); SaErrorT oa_soap_sel_state_set(void *oh_handler, SaHpiResourceIdT id, SaHpiBoolT enable); #endif openhpi-3.6.1/plugins/oa_soap/oa_soap_hotswap.h0000644000175100017510000000707012575647270020637 0ustar mohanmohan/* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. * Raja Kumar Thatte */ #ifndef _OA_SOAP_HOTSWAP_H #define _OA_SOAP_HOTSWAP_H /* Include files */ #include "oa_soap_utils.h" #include "oa_soap_power.h" SaErrorT oa_soap_get_hotswap_state(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiHsStateT *state); SaErrorT oa_soap_set_hotswap_state(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiHsStateT state); SaErrorT oa_soap_get_indicator_state(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiHsIndicatorStateT *state); SaErrorT oa_soap_set_indicator_state(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiHsIndicatorStateT state); SaErrorT oa_soap_request_hotswap_action(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiHsActionT action); SaErrorT oa_soap_hotswap_policy_cancel(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiTimeoutT timeout); SaErrorT oa_soap_get_autoinsert_timeout(void *oh_handler, SaHpiTimeoutT *timeout); SaErrorT oa_soap_set_autoinsert_timeout(void *oh_handler, SaHpiTimeoutT timeout); SaErrorT oa_soap_get_autoextract_timeout(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiTimeoutT *timeout); SaErrorT oa_soap_set_autoextract_timeout(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiTimeoutT timeout); #endif openhpi-3.6.1/plugins/oa_soap/oa_soap_control.c0000644000175100017510000022304412575647270020626 0ustar mohanmohan/* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra M.S. * Shuah Khan * Raghavendra P.G. * * This file handles all the control functionality related apis. * * oa_soap_get_control_state - Control ABI to return the control * state and mode of the resource * * oa_soap_set_control_state - Control ABI to set the control * state the resource * * oa_soap_build_control_rdr - Creates and adds the control rdr * * oa_soap_set_lcd_butn_lck_cntrl()- Sets the LCD button lock control * * oa_soap_get_lcd_butn_lck_cntrl()- Gets the LCD button lock control * * oa_soap_set_pwr_cntrl() - Sets the power control * * oa_soap_get_pwr_cntrl() - Gets the power control * * oa_soap_set_uid_cntrl() - Sets the UID control * * oa_soap_get_uid_cntrl() - Gets the UID control * * oa_soap_set_dynamic_pwr_cntrl() - Sets the dynamic pwr control * * oa_soap_get_dynamic_pwr_cntrl() - Gets the dynamic pwr control * * oa_soap_set_pwr_mode_cntrl() - Sets the pwr mode control * * oa_soap_get_pwr_mode_cntrl() - Gets the pwr mode control * * oa_soap_set_pwr_limit_mode_cntrl() - Sets pwr limit mode control * * oa_soap_get_pwr_limit_mode_cntrl() - Gets pwr limit mode control * * oa_soap_set_static_pwr_limit_cntrl() - Sets static pwr limit control * * oa_soap_get_static_pwr_limit_cntrl() - Gets static pwr limit control * * oa_soap_set_dynamic_pwr_cap_cntrl() - Sets dynamic pwr cap control * * oa_soap_get_dynamic_pwr_cap_cntrl() - Gets dynamic pwr cap control * * oa_soap_set_derated_circuit_cap_cntrl() - Sets derated circuit cap * control * * oa_soap_get_derated_circuit_cap_cntrl() - Gets derated circuit cap * control * * oa_soap_set_rated_circuit_cap_cntrl() - Sets rated circuit cap * control * * oa_soap_get_rated_circuit_cap_cntrl() - Gets the rated circuit cap * control * */ #include #include "sahpi_wrappers.h" #include "oa_soap_control.h" /* Forward declaraction for static functions */ static SaErrorT oa_soap_set_lcd_butn_lck_cntrl(struct oh_handler_state *oh_handler, SaHpiRptEntryT *rpt, SaHpiCtrlStateDigitalT control_state); static SaErrorT oa_soap_get_lcd_butn_lck_cntrl(struct oh_handler_state *oh_handler, SaHpiRptEntryT *rpt, SaHpiCtrlStateDigitalT *control_state); static SaErrorT oa_soap_set_pwr_cntrl(struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, SaHpiCtrlStateDigitalT control_state); static SaErrorT oa_soap_get_pwr_cntrl(struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, SaHpiCtrlStateDigitalT *control_state); static SaErrorT oa_soap_set_uid_cntrl(struct oh_handler_state *oh_handler, SaHpiRptEntryT *rpt, SaHpiCtrlStateDigitalT control_state); static SaErrorT oa_soap_get_uid_cntrl(struct oh_handler_state *oh_handler, SaHpiRptEntryT *rpt, SaHpiCtrlStateDigitalT *control_state); static SaErrorT oa_soap_set_dynamic_pwr_cntrl( struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, SaHpiCtrlStateDigitalT control_state); static SaErrorT oa_soap_get_dynamic_pwr_cntrl( struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, SaHpiCtrlStateDigitalT *control_state); static SaErrorT oa_soap_set_pwr_mode_cntrl( struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, SaHpiCtrlStateDiscreteT control_state); static SaErrorT oa_soap_get_pwr_mode_cntrl( struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, SaHpiCtrlStateDiscreteT *control_state); static SaErrorT oa_soap_set_pwr_limit_mode_cntrl( struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, SaHpiCtrlStateDiscreteT control_state); static SaErrorT oa_soap_get_pwr_limit_mode_cntrl( struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, SaHpiCtrlStateDiscreteT *control_state); static SaErrorT oa_soap_set_static_pwr_limit_cntrl( struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, SaHpiCtrlStateAnalogT control_state); static SaErrorT oa_soap_get_static_pwr_limit_cntrl( struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, SaHpiCtrlStateAnalogT *control_state); static SaErrorT oa_soap_set_dynamic_pwr_cap_cntrl( struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, SaHpiCtrlStateAnalogT control_state); static SaErrorT oa_soap_get_dynamic_pwr_cap_cntrl( struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, SaHpiCtrlStateAnalogT *control_state); static SaErrorT oa_soap_set_derated_circuit_cap_cntrl( struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, SaHpiCtrlStateAnalogT control_state); static SaErrorT oa_soap_get_derated_circuit_cap_cntrl( struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, SaHpiCtrlStateAnalogT *control_state); static SaErrorT oa_soap_set_rated_circuit_cap_cntrl( struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, SaHpiCtrlStateAnalogT control_state); static SaErrorT oa_soap_get_rated_circuit_cap_cntrl( struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, SaHpiCtrlStateAnalogT *control_state); /** * oa_soap_get_control_state * @oh_handler: Handler data pointer * @resource_id: Resource ID * @rdr_num: Control rdr number * @mode: Mode of the control * @state: State of the control * * Purpose: * Gets the current state and the mode of the control object * * Detailed Description: * - Gets the current state and the default mode of control object * of either server blade or interconnect * - To determine the control state, power state of the resource is * retrieved and is appropriately mapped to control state * - Plug-in does not support changing the control mode * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_CONTROL * SA_ERR_HPI_INVALID_PARAMS - On wrong parameter * SA_ERR_HPI_INVALID_RESOURCE - Resource does not exist * SA_ERR_HPI_NOT_PRESENT - Control not present * SA_ERR_HPI_INTERNAL_ERROR - Internal error encountered **/ SaErrorT oa_soap_get_control_state(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiCtrlNumT rdr_num, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state) { SaErrorT rv = SA_OK; struct oh_handler_state *handler = NULL; SaHpiRptEntryT *rpt = NULL; SaHpiRdrT *rdr = NULL; SaHpiCtrlTypeT type; SaHpiCtrlModeT ctrl_mode; SaHpiCtrlStateT ctrl_state; SaHpiCtrlRecT *ctrl = NULL; SaHpiCtrlStateDigitalT control_digital_state = 0; SaHpiCtrlStateDiscreteT control_discrete_state = 0; SaHpiCtrlStateAnalogT control_analog_state = 0; if (oh_handler == NULL || mode == NULL || state == NULL) { err("Invalid parameter."); return (SA_ERR_HPI_INVALID_PARAMS); } handler = (struct oh_handler_state *) oh_handler; rpt = oh_get_resource_by_id (handler->rptcache, resource_id); if (rpt == NULL) { err("INVALID RESOURCE"); return SA_ERR_HPI_INVALID_RESOURCE; } if (! (rpt->ResourceCapabilities & SAHPI_CAPABILITY_CONTROL)) { err("INVALID RESOURCE CAPABILITY"); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(handler->rptcache, resource_id, SAHPI_CTRL_RDR, rdr_num); if (rdr == NULL) { err("INVALID RDR NUMBER"); return (SA_ERR_HPI_NOT_PRESENT); } ctrl = &(rdr->RdrTypeUnion.CtrlRec); ctrl_mode = ctrl->DefaultMode.Mode; /* Set control mode of return parameter to Manual mode * Manual mode is the only mode supported by plug-in */ *mode = ctrl_mode; type = ctrl->Type; ctrl_state.Type = type; switch (rdr_num){ case OA_SOAP_PWR_CNTRL: rv = oa_soap_get_pwr_cntrl(handler, resource_id, &control_digital_state); if (rv != SA_OK) { err("Failed to get the power state RDR"); return rv; } break; case OA_SOAP_UID_CNTRL: rv = oa_soap_get_uid_cntrl(handler, rpt, &control_digital_state); if (rv != SA_OK) { err("Failed to get the uid status"); return rv; } break; case OA_SOAP_LCD_BUTN_LCK_CNTRL: rv = oa_soap_get_lcd_butn_lck_cntrl(handler, rpt, &control_digital_state); if (rv != SA_OK) { err("Failed to get the LCD button lock status"); return rv; } break; case OA_SOAP_DYNAMIC_PWR_CNTRL: rv = oa_soap_get_dynamic_pwr_cntrl(handler, resource_id, &control_digital_state); if (rv != SA_OK) { err("Failed to get the dynamic power state RDR"); return rv; } break; case OA_SOAP_PWR_MODE_CNTRL: rv = oa_soap_get_pwr_mode_cntrl(handler, resource_id, &control_discrete_state); if (rv != SA_OK) { err("Failed to get the power mode state RDR"); return rv; } break; case OA_SOAP_PWR_LIMIT_MODE_CNTRL: rv = oa_soap_get_pwr_limit_mode_cntrl(handler, resource_id, &control_discrete_state); if (rv != SA_OK) { err("Failed to get the power limit mode state RDR"); return rv; } break; case OA_SOAP_STATIC_PWR_LIMIT_CNTRL: rv = oa_soap_get_static_pwr_limit_cntrl(handler, resource_id, &control_analog_state); if (rv != SA_OK) { err("Failed to get the static power limit state RDR"); return rv; } break; case OA_SOAP_DYNAMIC_PWR_CAP_CNTRL: rv = oa_soap_get_dynamic_pwr_cap_cntrl(handler, resource_id, &control_analog_state); if (rv != SA_OK) { err("Failed to get the dynamic power cap state RDR"); return rv; } break; case OA_SOAP_DERATED_CIRCUIT_CAP_CNTRL: rv = oa_soap_get_derated_circuit_cap_cntrl(handler, resource_id, &control_analog_state); if (rv != SA_OK) { err("Failed to get the derated circuit cap state \ RDR"); return rv; } break; case OA_SOAP_RATED_CIRCUIT_CAP_CNTRL: rv = oa_soap_get_rated_circuit_cap_cntrl(handler, resource_id, &control_analog_state); if (rv != SA_OK) { err("Failed to get the rated circuit cap state RDR"); return rv; } break; default: err("Invalid control rdr num"); return SA_ERR_HPI_INTERNAL_ERROR; } switch (rdr_num){ case OA_SOAP_PWR_CNTRL: case OA_SOAP_UID_CNTRL: case OA_SOAP_LCD_BUTN_LCK_CNTRL: case OA_SOAP_DYNAMIC_PWR_CNTRL: ctrl_state.StateUnion.Digital = control_digital_state; break; case OA_SOAP_PWR_MODE_CNTRL: case OA_SOAP_PWR_LIMIT_MODE_CNTRL: ctrl_state.StateUnion.Discrete = control_discrete_state; break; case OA_SOAP_STATIC_PWR_LIMIT_CNTRL: case OA_SOAP_DYNAMIC_PWR_CAP_CNTRL: case OA_SOAP_DERATED_CIRCUIT_CAP_CNTRL: case OA_SOAP_RATED_CIRCUIT_CAP_CNTRL: ctrl_state.StateUnion.Analog = control_analog_state; break; } /* Return the appropriately mapped control state */ *state = ctrl_state; return rv; } /** * oa_soap_set_control_state: * @oh_handler: Handler data pointer * @resource_id: Resource ID * @rdr_num: Control rdr number * @mode: Mode of the control * @state: State of the control * * Purpose: * Sets the current state of the control object. Mode setting is not * allowed * * Detailed Description: * - Validates the state parameter and sets the control state of resource * to the specified value * - the current state and the default mode of control object * of either server blade or interconnect * - To determine the control state, power state of the resource is * retrieved and is appropriately mapped to control state * - Plug-in does not support changing the control mode * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_CONTROL * SA_ERR_HPI_INVALID_PARAMS - On wrong parameter * SA_ERR_HPI_INVALID_RESOURCE - Resource does not exist * SA_ERR_HPI_NOT_PRESENT - Control not present * SA_ERR_HPI_INTERNAL_ERROR - Internal error encountered * SA_ERR_HPI_INVALID_DATA - Invalid Control Mode/State specified * SA_ERR_HPI_UNSUPPORTED_PARAMS - Setting the control mode * to AUTO mode is not supported **/ SaErrorT oa_soap_set_control_state(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiCtrlNumT rdr_num, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state) { SaErrorT rv = SA_OK; struct oh_handler_state *handler = NULL; SaHpiRptEntryT *rpt = NULL; SaHpiRdrT *rdr = NULL; SaHpiCtrlRecT *ctrl = NULL; if (oh_handler == NULL || state == NULL) { err("Invalid parameter."); return (SA_ERR_HPI_INVALID_PARAMS); } handler = (struct oh_handler_state *) oh_handler; rpt = oh_get_resource_by_id (handler->rptcache, resource_id); if (rpt == NULL) { err("INVALID RESOURCE"); return SA_ERR_HPI_INVALID_RESOURCE; } if (! (rpt->ResourceCapabilities & SAHPI_CAPABILITY_CONTROL)) { err("INVALID RESOURCE CAPABILITY"); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type (handler->rptcache, resource_id, SAHPI_CTRL_RDR, rdr_num); if (rdr == NULL) { err("INVALID RDR NUMBER"); return (SA_ERR_HPI_NOT_PRESENT); } ctrl = &(rdr->RdrTypeUnion.CtrlRec); /* Validate the state specified in the parameter list */ rv = oh_valid_ctrl_state_mode ((ctrl), mode, state); if (rv != SA_OK) { err("Control state specified is invalid"); return (rv); } /* Auto mode is not supported */ if (mode == SAHPI_CTRL_MODE_AUTO) { err( "AUTO CONTROL MODE is not supported"); return SA_ERR_HPI_UNSUPPORTED_PARAMS; } /* Return error for Non digital type control request */ if ((state->Type != SAHPI_CTRL_TYPE_DIGITAL) && (state->Type != SAHPI_CTRL_TYPE_DISCRETE) && (state->Type != SAHPI_CTRL_TYPE_ANALOG)) { err("Control type not supported"); return SA_ERR_HPI_INTERNAL_ERROR; } /* * If control mode is MANUAL and specified state could be digital, * discrete, or analog type, then the control state is updated * with specified state value */ if (state->Type == SAHPI_CTRL_TYPE_DIGITAL) { ctrl->TypeUnion.Digital.Default = state->StateUnion.Digital; } else { if (state->Type == SAHPI_CTRL_TYPE_DISCRETE) { ctrl->TypeUnion.Discrete.Default = state->StateUnion.Discrete; } else { ctrl->TypeUnion.Analog.Default = state->StateUnion.Analog; } } switch (rdr_num) { case OA_SOAP_PWR_CNTRL: rv = oa_soap_set_pwr_cntrl(handler, resource_id, state->StateUnion.Digital); if (rv != SA_OK) { err("Set power state failed"); return rv; } break; case OA_SOAP_UID_CNTRL: rv = oa_soap_set_uid_cntrl(handler, rpt, state->StateUnion.Digital); if (rv != SA_OK) { err("Set uid state failed"); return rv; } break; case OA_SOAP_LCD_BUTN_LCK_CNTRL: rv = oa_soap_set_lcd_butn_lck_cntrl(handler, rpt, state->StateUnion.Digital); if (rv != SA_OK) { err("Failed to set the LCD button lock status"); return rv; } break; case OA_SOAP_DYNAMIC_PWR_CNTRL: rv = oa_soap_set_dynamic_pwr_cntrl(handler, resource_id, state->StateUnion.Digital); if (rv != SA_OK) { err("Failed to set the dynamic power state"); return rv; } break; case OA_SOAP_PWR_MODE_CNTRL: rv = oa_soap_set_pwr_mode_cntrl(handler, resource_id, state->StateUnion.Discrete); if (rv != SA_OK) { err("Failed to set the power mode state"); return rv; } break; case OA_SOAP_PWR_LIMIT_MODE_CNTRL: rv = oa_soap_set_pwr_limit_mode_cntrl(handler, resource_id, state->StateUnion.Discrete); if (rv != SA_OK) { err("Failed to set the power limit mode state"); return rv; } break; case OA_SOAP_STATIC_PWR_LIMIT_CNTRL: rv = oa_soap_set_static_pwr_limit_cntrl(handler, resource_id, state->StateUnion.Analog); if (rv != SA_OK) { err("Failed to set the static power limit state"); return rv; } break; case OA_SOAP_DYNAMIC_PWR_CAP_CNTRL: rv = oa_soap_set_dynamic_pwr_cap_cntrl(handler, resource_id, state->StateUnion.Analog); if (rv != SA_OK) { err("Failed to set the dynamic power cap state"); return rv; } break; case OA_SOAP_DERATED_CIRCUIT_CAP_CNTRL: rv = oa_soap_set_derated_circuit_cap_cntrl(handler, resource_id, state->StateUnion.Analog); if (rv != SA_OK) { err("Failed to set the derated circuit cap state"); return rv; } break; case OA_SOAP_RATED_CIRCUIT_CAP_CNTRL: rv = oa_soap_set_rated_circuit_cap_cntrl(handler, resource_id, state->StateUnion.Analog); if (rv != SA_OK) { err("Failed to set the rated circuit cap state"); return rv; } break; default: err("Invalid control rdr num"); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } /** * oa_soap_build_control_rdr: * @oh_handler: Handler data pointer * @rdr: Pointer to the rdr structure * @resource_id: Resource ID * @control_num: Control rdr number * @analogLimitLow: RDR lower limit for analog control * @analogLimitHigh: RDR upper limit for analog control * * Purpose: * Builds the control rdr. * * Detailed Description: * - Retrieves and populates the control rdr contents from global controls * array based in control num. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - On wrong parameter * SA_ERR_HPI_INTERNAL_ERROR - Internal error encountered **/ SaErrorT oa_soap_build_control_rdr(struct oh_handler_state *oh_handler, SaHpiRdrT *rdr, SaHpiResourceIdT resource_id, SaHpiCtrlNumT control_num, int analogLimitLow, int analogLimitHigh) { SaHpiRptEntryT *rpt = NULL; if (oh_handler == NULL || rdr == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (!rpt) { err("Could not find blade resource rpt"); return(SA_ERR_HPI_INTERNAL_ERROR); } /* Set the control rdr with default values */ rdr->Entity = rpt->ResourceEntity; rdr->RdrType = SAHPI_CTRL_RDR; rdr->RdrTypeUnion.CtrlRec = oa_soap_cntrl_arr[control_num].control; oh_init_textbuffer(&(rdr->IdString)); oh_append_textbuffer(&(rdr->IdString), oa_soap_cntrl_arr[control_num].comment); if (rdr->RdrTypeUnion.CtrlRec.Type == SAHPI_CTRL_TYPE_ANALOG) { rdr->RdrTypeUnion.CtrlRec.TypeUnion.Analog.Min = analogLimitLow; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Analog.Max = analogLimitHigh; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Analog.Default = analogLimitLow; } return SA_OK; } /** * oa_soap_get_uid_cntrl * @oh_handler: Handler data pointer * @rpt: Pointer to the rpt structure * @control_state: Pointer to digital control state * * Purpose: * Retrieves the UID status of the resource * * Detailed Description: * - Retrieves the UID status of different resources based on entity type. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - On wrong parameter * SA_ERR_HPI_INTERNAL_ERROR - Internal error encountered **/ static SaErrorT oa_soap_get_uid_cntrl(struct oh_handler_state *oh_handler, SaHpiRptEntryT *rpt, SaHpiCtrlStateDigitalT *control_state) { SaErrorT rv = SA_OK; SaHpiInt32T bay_number; struct oa_soap_handler *oa_handler = NULL; struct enclosureStatus enclosure_status_response; struct getOaStatus oa_status_request; struct oaStatus oa_status_response; struct getBladeStatus server_status_request; struct bladeStatus server_status_response; struct getInterconnectTrayStatus interconnect_status_request; struct interconnectTrayStatus interconnect_status_response; enum uidStatus uid_status; if (oh_handler == NULL || rpt == NULL || control_state == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; /* Check whether the re-discovery is started by trying to lock the * oa_handler mutex */ rv = lock_oa_soap_handler(oa_handler); if (rv != SA_OK) { err("OA SOAP handler is locked"); return rv; } bay_number = rpt->ResourceEntity.Entry[0].EntityLocation; switch (rpt->ResourceEntity.Entry[0].EntityType) { case (SAHPI_ENT_SYSTEM_CHASSIS): /* Make a soap call to get the enclosure UID status */ rv = soap_getEnclosureStatus(oa_handler->active_con, &enclosure_status_response); if (rv != SOAP_OK) { err("Get enclosure status failed"); return SA_ERR_HPI_INTERNAL_ERROR; } uid_status = enclosure_status_response.uid; break; case (SAHPI_ENT_SYS_MGMNT_MODULE): /* Make a soap call to get the OA UID status */ oa_status_request.bayNumber = bay_number; rv = soap_getOaStatus(oa_handler->active_con, &oa_status_request, &oa_status_response); if (rv != SOAP_OK) { err("Get OA status failed"); return SA_ERR_HPI_INTERNAL_ERROR; } uid_status = oa_status_response.uid; break; case (SAHPI_ENT_SYSTEM_BLADE): case (SAHPI_ENT_IO_BLADE): case (SAHPI_ENT_DISK_BLADE): /* Make a soap call to get the Blade UID status */ server_status_request.bayNumber = bay_number; rv = soap_getBladeStatus(oa_handler->active_con, &server_status_request, &server_status_response); if (rv != SOAP_OK) { err("Get Blade status failed"); return SA_ERR_HPI_INTERNAL_ERROR; } uid_status = server_status_response.uid; break; case (SAHPI_ENT_SWITCH_BLADE): /* Make a soap call to get the Interconnect * UID status */ interconnect_status_request.bayNumber = bay_number; rv = soap_getInterconnectTrayStatus( oa_handler->active_con, &interconnect_status_request, &interconnect_status_response); if (rv != SOAP_OK) { err("Get Interconnect status failed"); return SA_ERR_HPI_INTERNAL_ERROR; } uid_status = interconnect_status_response.uid; break; default: err("Invalid Resource Type"); return (SA_ERR_HPI_INTERNAL_ERROR); } switch (uid_status) { case UID_ON: *control_state = SAHPI_CTRL_STATE_ON; break; case UID_OFF: case UID_NO_OP: *control_state = SAHPI_CTRL_STATE_OFF; break; default: err("Invalid uid status"); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } /** * oa_soap_set_uid_cntrl * @oh_handler: Handler data pointer * @rpt: Pointer to the rpt structure * @control_state: Digital control state * * Purpose: * Sets the UID status of the resource * * Detailed Description: * - Sets the UID status of different resources based on entity type. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - On wrong parameter * SA_ERR_HPI_INTERNAL_ERROR - Internal error encountered **/ static SaErrorT oa_soap_set_uid_cntrl(struct oh_handler_state *oh_handler, SaHpiRptEntryT *rpt, SaHpiCtrlStateDigitalT control_state) { SaErrorT rv = SA_OK; SaHpiInt32T bay_number; struct oa_soap_handler *oa_handler = NULL; struct setEnclosureUid enclosure_uid; struct setOaUid oa_uid; struct setBladeUid blade_uid; struct setInterconnectTrayUid interconnect_uid; enum uidStatus uid_status; if (oh_handler == NULL || rpt == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; /* Check whether the re-discovery is started by trying to lock the * oa_handler mutex */ rv = lock_oa_soap_handler(oa_handler); if (rv != SA_OK) { err("OA SOAP handler is locked"); return rv; } /* Return error if the control state is PULSE_ON or PULSE_OFF */ if ((control_state == SAHPI_CTRL_STATE_PULSE_ON) || (control_state == SAHPI_CTRL_STATE_PULSE_OFF)) { err("Setting the control state to PULSE ON/OFF not supported"); return SA_ERR_HPI_INVALID_DATA; } /* Map the control state to uid status */ if (control_state == SAHPI_CTRL_STATE_ON) { uid_status = UID_CMD_ON; } else { uid_status = UID_CMD_OFF; } /* Get the bay_number of the resource */ bay_number = rpt->ResourceEntity.Entry[0].EntityLocation; switch (rpt->ResourceEntity.Entry[0].EntityType) { case (SAHPI_ENT_SYSTEM_CHASSIS): /* Make a soap call to set Enclosure UID */ enclosure_uid.uid = uid_status; rv = soap_setEnclosureUid(oa_handler->active_con, &enclosure_uid); if (rv != SOAP_OK) { err("Set enclosure UID failed"); return SA_ERR_HPI_INTERNAL_ERROR; } break; case (SAHPI_ENT_SYS_MGMNT_MODULE): /* Make a soap call to set OA UID */ oa_uid.uid = uid_status; oa_uid.bayNumber = bay_number; rv = soap_setOaUid(oa_handler->active_con, &oa_uid); if (rv != SOAP_OK) { err("Set OA UID failed"); return SA_ERR_HPI_INTERNAL_ERROR; } break; case (SAHPI_ENT_SYSTEM_BLADE): case (SAHPI_ENT_IO_BLADE): case (SAHPI_ENT_DISK_BLADE): /* Make a soap call to set Blade UID */ blade_uid.uid = uid_status; blade_uid.bayNumber = bay_number; rv = soap_setBladeUid(oa_handler->active_con, &blade_uid); if (rv != SOAP_OK) { err("Set Blade UID failed"); return SA_ERR_HPI_INTERNAL_ERROR; } break; case (SAHPI_ENT_SWITCH_BLADE): /* Make a soap call to set Interconnect UID */ interconnect_uid.uid = uid_status; interconnect_uid.bayNumber = bay_number; rv = soap_setInterconnectTrayUid(oa_handler->active_con, &interconnect_uid); if (rv != SOAP_OK) { err("Set Interconnect UID failed"); return SA_ERR_HPI_INTERNAL_ERROR; } break; default: err("Invalid Resource Type"); return (SA_ERR_HPI_INTERNAL_ERROR); } return SA_OK; } /** * oa_soap_get_pwr_cntrl: * @oh_handler: Handler data pointer * @resource_id: Resource id * @control state: Pointer to digital control state * * Purpose: * Gets the control state of power controls on resource * * Detailed Description: * - Gets the power state of resource and maps it to control state * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - On wrong parameter * SA_ERR_HPI_INTERNAL_ERROR - Internal error encountered **/ static SaErrorT oa_soap_get_pwr_cntrl(struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, SaHpiCtrlStateDigitalT *control_state) { SaErrorT rv = SA_OK; SaHpiPowerStateT power_state; if (oh_handler == NULL || control_state == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } rv = oa_soap_get_power_state(oh_handler, resource_id, &power_state); if (rv != SA_OK) { err("Failed to get the power state RDR"); return rv; } switch (power_state) { case SAHPI_POWER_ON: *control_state = SAHPI_CTRL_STATE_ON; break; case SAHPI_POWER_OFF: *control_state = SAHPI_CTRL_STATE_OFF; break; default: err("Invalid power state %d detected for " "Resource ID %d", power_state,resource_id); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } /** * oa_soap_set_pwr_cntrl: * @oh_handler: Handler data pointer * @resource_id: Resource id * @control state: Digital control state * * Purpose: * Sets the control state of power controls on resource * * Detailed Description: * - Sets the power state of resource after mapping the control state * appropriate power state * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - On wrong parameter * SA_ERR_HPI_INTERNAL_ERROR - Internal error encountered **/ static SaErrorT oa_soap_set_pwr_cntrl(struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, SaHpiCtrlStateDigitalT control_state) { SaErrorT rv = SA_OK; SaHpiPowerStateT power_state; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } /* Return error if the control state is PULSE_ON or PULSE_OFF */ if ((control_state == SAHPI_CTRL_STATE_PULSE_ON) || (control_state == SAHPI_CTRL_STATE_PULSE_OFF)) { err("Setting the control state to PULSE ON/OFF not supported"); return SA_ERR_HPI_INVALID_DATA; } if (control_state == SAHPI_CTRL_STATE_ON) { power_state = SAHPI_POWER_ON; } else { power_state = SAHPI_POWER_OFF; } rv = oa_soap_set_power_state(oh_handler, resource_id, power_state); if (rv != SA_OK) { err("Failed to set the power state of resource"); return rv; } return SA_OK; } /** * oa_soap_get_lcd_butn_lck_cntrl_state * @oh_handler: Handler data pointer * @rpt: Pointer to the rpt structure * @control_state: Pointer to digital control state * * Purpose: * Retrieves the LCD button lock state * * Detailed Description: * NA * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - On wrong parameter * SA_ERR_HPI_INTERNAL_ERROR - Internal error encountered **/ static SaErrorT oa_soap_get_lcd_butn_lck_cntrl(struct oh_handler_state *oh_handler, SaHpiRptEntryT *rpt, SaHpiCtrlStateDigitalT *control_state) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler = NULL; struct lcdStatus status; if (oh_handler == NULL || rpt == NULL || control_state == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; if (rpt->ResourceEntity.Entry[0].EntityType != SAHPI_ENT_DISPLAY_PANEL) { err("LCD button lock is supported only on LCD"); err("Requested on wrong resource type %d", rpt->ResourceEntity.Entry[0].EntityType); return SA_ERR_HPI_INVALID_PARAMS; } /* Check whether the re-discovery is started by trying to lock the * oa_handler mutex */ rv = lock_oa_soap_handler(oa_handler); if (rv != SA_OK) { err("OA SOAP handler is locked"); return rv; } /* Make a soap call to set Enclosure UID */ rv = soap_getLcdStatus(oa_handler->active_con, &status); if (rv != SOAP_OK) { err("Get LCD status SOAP call failed"); return SA_ERR_HPI_INTERNAL_ERROR; } switch (status.buttonLock) { case HPOA_TRUE: *control_state = SAHPI_CTRL_STATE_ON; break; case HPOA_FALSE: *control_state = SAHPI_CTRL_STATE_OFF; break; default: err("Invalid LCD button lock state"); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } /** * oa_soap_set_lcd_butn_lck_cntrl_state * @oh_handler: Handler data pointer * @rpt: Pointer to the rpt structure * @control_state: Digital control state * * Purpose: * Sets the LCD button lock state * * Detailed Description: * - The LCD button lock control is supported only for LCD resource * - PULSE_ON and PULSE_OFF control states are not supported. If requested * by the user, then error message is returned * - Sets the LCD button lock control to requested state * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - On wrong parameter * SA_ERR_HPI_INTERNAL_ERROR - Internal error encountered **/ static SaErrorT oa_soap_set_lcd_butn_lck_cntrl(struct oh_handler_state *oh_handler, SaHpiRptEntryT *rpt, SaHpiCtrlStateDigitalT control_state) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler = NULL; enum hpoa_boolean lcd_button_lock; if (oh_handler == NULL || rpt == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; if (rpt->ResourceEntity.Entry[0].EntityType != SAHPI_ENT_DISPLAY_PANEL) { err("LCD button lock is supported only on LCD"); err("Requested on wrong resource type %d", rpt->ResourceEntity.Entry[0].EntityType); return SA_ERR_HPI_INVALID_PARAMS; } /* Return error if the control state is PULSE_ON or PULSE_OFF */ if ((control_state == SAHPI_CTRL_STATE_PULSE_ON) || (control_state == SAHPI_CTRL_STATE_PULSE_OFF)) { err("Setting the control state to PULSE ON/OFF not supported"); return SA_ERR_HPI_INVALID_DATA; } /* Map the control state to LCD button lock state */ if (control_state == SAHPI_CTRL_STATE_ON) { lcd_button_lock = HPOA_TRUE; } else { lcd_button_lock = HPOA_FALSE; } /* Check whether the re-discovery is started by trying to lock the * oa_handler mutex */ rv = lock_oa_soap_handler(oa_handler); if (rv != SA_OK) { err("OA SOAP handler is locked"); return rv; } rv = soap_setLcdButtonLock(oa_handler->active_con, lcd_button_lock); if (rv != SOAP_OK) { err("Set LCD button lock SOAP call failed"); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } /** * oa_soap_get_dynamic_pwr_cntrl: * @oh_handler: Handler data pointer * @resource_id: Resource id * @control state: Pointer to digital control state * * Purpose: * Gets the control state of the dynamic power control on resource * * Detailed Description: * - Gets the dynamic power state of resource and maps it to control state * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - On wrong parameter * SA_ERR_HPI_INTERNAL_ERROR - Internal error encountered **/ static SaErrorT oa_soap_get_dynamic_pwr_cntrl( struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, SaHpiCtrlStateDigitalT *control_state) { SaErrorT rv = SA_OK; struct powerConfigInfo *power_config_info; struct oa_soap_handler *oa_handler = NULL; if (oh_handler == NULL || control_state == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; power_config_info = &(oa_handler->power_config_info); /* Make a soap call to get the enclosure power config info */ wrap_g_mutex_lock(oa_handler->mutex); rv = soap_getPowerConfigInfo(oa_handler->active_con, power_config_info, &(oa_handler->desired_static_pwr_limit)); wrap_g_mutex_unlock(oa_handler->mutex); if (rv != SOAP_OK) { err("Get enclosure power config info failed"); return SA_ERR_HPI_INTERNAL_ERROR; } switch (power_config_info->dynamicPowerSaverEnabled) { case HPOA_FALSE: *control_state = SAHPI_CTRL_STATE_OFF; break; case HPOA_TRUE: *control_state = SAHPI_CTRL_STATE_ON; break; default: err("Invalid dynamic power state"); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } /** * oa_soap_set_dynamic_pwr_cntrl: * @oh_handler: Handler data pointer * @resource_id: Resource id * @control state: Digital control state * * Purpose: * Sets the control state of the dynamic power control on resource * * Detailed Description: * - Sets the dynamic power state of resource after mapping the control * state appropriate dynamic power state * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - On wrong parameter * SA_ERR_HPI_INTERNAL_ERROR - Internal error encountered **/ static SaErrorT oa_soap_set_dynamic_pwr_cntrl( struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, SaHpiCtrlStateDigitalT control_state) { SaErrorT rv = SA_OK; struct powerConfigInfo *power_config_info; struct oa_soap_handler *oa_handler = NULL; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } /* Return error if the control state is PULSE_ON or PULSE_OFF */ if ((control_state == SAHPI_CTRL_STATE_PULSE_ON) || (control_state == SAHPI_CTRL_STATE_PULSE_OFF)) { err("Setting the control state to PULSE ON/OFF not supported"); return SA_ERR_HPI_INVALID_DATA; } oa_handler = (struct oa_soap_handler *) oh_handler->data; power_config_info = &(oa_handler->power_config_info); if (control_state == SAHPI_CTRL_STATE_ON) { power_config_info->dynamicPowerSaverEnabled = HPOA_TRUE; } else { power_config_info->dynamicPowerSaverEnabled = HPOA_FALSE; } /* Make a soap call to set the enclosure power config info */ rv = soap_setPowerConfigInfo(oa_handler->active_con, power_config_info); if (rv != SOAP_OK) { err("Set enclosure power config info failed"); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } /** * oa_soap_get_pwr_mode_cntrl: * @oh_handler: Handler data pointer * @resource_id: Resource id * @control state: Pointer to discrete control state * * Purpose: * Gets the control state of the power mode control on resource * * Detailed Description: * - Gets the power mode state of resource and maps it to control state * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - On wrong parameter * SA_ERR_HPI_INTERNAL_ERROR - Internal error encountered **/ static SaErrorT oa_soap_get_pwr_mode_cntrl( struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, SaHpiCtrlStateDiscreteT *control_state) { SaErrorT rv = SA_OK; struct powerConfigInfo *power_config_info; struct oa_soap_handler *oa_handler = NULL; if (oh_handler == NULL || control_state == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; power_config_info = &(oa_handler->power_config_info); /* Make a soap call to get the enclosure power config info */ wrap_g_mutex_lock(oa_handler->mutex); rv = soap_getPowerConfigInfo(oa_handler->active_con, power_config_info, &(oa_handler->desired_static_pwr_limit)); wrap_g_mutex_unlock(oa_handler->mutex); if (rv != SOAP_OK) { err("Get enclosure power config info failed"); return SA_ERR_HPI_INTERNAL_ERROR; } if ((power_config_info->redundancyMode < NON_REDUNDANT) || (power_config_info->redundancyMode > POWER_SUPPLY_REDUNDANT)) { err("Invalid power mode state"); return SA_ERR_HPI_INTERNAL_ERROR; } else { *control_state = power_config_info->redundancyMode; } return SA_OK; } /** * oa_soap_set_pwr_mode_cntrl: * @oh_handler: Handler data pointer * @resource_id: Resource id * @control state: Discrete control state * * Purpose: * Sets the control state of the power mode control on resource * * Detailed Description: * - Sets the power mode state of resource after mapping the control state * appropriate power mode state * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - On wrong parameter * SA_ERR_HPI_INTERNAL_ERROR - Internal error encountered **/ static SaErrorT oa_soap_set_pwr_mode_cntrl( struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, SaHpiCtrlStateDiscreteT control_state) { SaErrorT rv = SA_OK; struct powerConfigInfo *power_config_info; struct oa_soap_handler *oa_handler = NULL; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } /* Return error if the control state is PULSE_ON or PULSE_OFF */ if ((control_state < NON_REDUNDANT) || (control_state > POWER_SUPPLY_REDUNDANT)) { err("Cannot set the control state to %d - value out of range", control_state); return SA_ERR_HPI_INVALID_DATA; } oa_handler = (struct oa_soap_handler *) oh_handler->data; power_config_info = &(oa_handler->power_config_info); power_config_info->redundancyMode = control_state; /* Make a soap call to set the enclosure power config info */ rv = soap_setPowerConfigInfo(oa_handler->active_con, power_config_info); if (rv != SOAP_OK) { err("Set enclosure power config info failed"); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } /** * oa_soap_get_pwr_limit_mode_cntrl: * @oh_handler: Handler data pointer * @resource_id: Resource id * @control state: Pointer to discrete control state * * Purpose: * Gets the control state of the power limit mode control on resource * * Detailed Description: * - Gets the power limit mode state of resource and maps it to * control state * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - On wrong parameter * SA_ERR_HPI_INTERNAL_ERROR - Internal error encountered **/ static SaErrorT oa_soap_get_pwr_limit_mode_cntrl( struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, SaHpiCtrlStateDiscreteT *control_state) { SaErrorT rv = SA_OK; struct powerConfigInfo *power_config_info; struct powerCapConfig *power_cap_config; struct oa_soap_handler *oa_handler = NULL; if (oh_handler == NULL || control_state == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; power_config_info = &(oa_handler->power_config_info); power_cap_config = &(oa_handler->power_cap_config); /* Make a soap call to get the enclosure power config info */ wrap_g_mutex_lock(oa_handler->mutex); rv = soap_getPowerConfigInfo(oa_handler->active_con, power_config_info, &(oa_handler->desired_static_pwr_limit)); wrap_g_mutex_unlock(oa_handler->mutex); if (rv != SOAP_OK) { err("Get enclosure power config info failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Make a soap call to get the enclosure power dynamic power */ /* cap config */ wrap_g_mutex_lock(oa_handler->mutex); rv = soap_getPowerCapConfig(oa_handler->active_con, power_cap_config, &(oa_handler->desired_dynamic_pwr_cap), &(oa_handler->desired_derated_circuit_cap), &(oa_handler->desired_rated_circuit_cap)); wrap_g_mutex_unlock(oa_handler->mutex); if (rv != SOAP_OK) { err("Get enclosure dynamic power cap config failed"); return SA_ERR_HPI_INTERNAL_ERROR; } if (power_config_info->powerCeiling > 0) { *control_state = STATIC_POWER_LIMIT; } else { if (power_cap_config->powerCap > 0) { *control_state = DYNAMIC_POWER_CAP; } else { *control_state = POWER_LIMIT_NONE; } } return SA_OK; } /** * oa_soap_set_pwr_limit_mode_cntrl: * @oh_handler: Handler data pointer * @resource_id: Resource id * @control state: Discrete control state * * Purpose: * Sets the control state of the power limit mode control on resource * * Detailed Description: * - Sets the power limit mode state of resource after mapping the * control state appropriate power limit mode state * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - On wrong parameter * SA_ERR_HPI_INTERNAL_ERROR - Internal error encountered **/ static SaErrorT oa_soap_set_pwr_limit_mode_cntrl( struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, SaHpiCtrlStateDiscreteT control_state) { SaErrorT rv = SA_OK; struct powerConfigInfo *power_config_info; struct powerCapConfig *power_cap_config; struct oa_soap_handler *oa_handler = NULL; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } /* Return error if the control state is out of range */ if ((control_state < POWER_LIMIT_NONE) || (control_state > DYNAMIC_POWER_CAP)) { err("Cannot set the control state to %d - value out of range", control_state); return SA_ERR_HPI_INVALID_DATA; } oa_handler = (struct oa_soap_handler *) oh_handler->data; power_config_info = &(oa_handler->power_config_info); power_cap_config = &(oa_handler->power_cap_config); if (control_state == POWER_LIMIT_NONE) { power_config_info->powerCeiling = 0; power_cap_config->powerCap = 0; power_cap_config->deratedCircuitCap = 0; power_cap_config->ratedCircuitCap = 0; } else { if (control_state == STATIC_POWER_LIMIT) { /* Checked desired setting, if non-zero - then */ /* send it - else user error */ if (oa_handler->desired_static_pwr_limit > 0) { power_config_info->powerCeiling = oa_handler->desired_static_pwr_limit; power_cap_config->powerCap = 0; power_cap_config->deratedCircuitCap = 0; power_cap_config->ratedCircuitCap = 0; } else { err("Cannot set the control state to %d - no \ static pwr limit value has been set", control_state); return SA_ERR_HPI_INVALID_DATA; } } else { /* DYNAMIC_POWER_CAP */ /* Checked power cap, if non-zero - then send it */ /* - else user error */ if (oa_handler->desired_dynamic_pwr_cap > 0) { power_cap_config->powerCap = oa_handler->desired_dynamic_pwr_cap; power_config_info->powerCeiling = 0; } else { err("Cannot set the control state to %d - no \ dynamic pwr cap value has been set", control_state); return SA_ERR_HPI_INVALID_DATA; } if (oa_handler->active_fm_ver >= 3.0) { if (oa_handler->desired_derated_circuit_cap > 0) { power_cap_config->deratedCircuitCap = oa_handler->desired_derated_circuit_cap; } else { err("Cannot set the control state to %d - no \ derated circuit cap value has been set", control_state); return SA_ERR_HPI_INVALID_DATA; } if (oa_handler->desired_rated_circuit_cap > 0) { power_cap_config->ratedCircuitCap = oa_handler->desired_rated_circuit_cap; } else { err("Cannot set the control state to %d - no \ rated circuit cap value has been set", control_state); return SA_ERR_HPI_INVALID_DATA; } } } } /* Make soaps calls to set the enclosure power config info, and */ /* dynamic power cap config */ if (control_state == POWER_LIMIT_NONE) { /* Must turn off dynamic power cap config, and reset */ /* power config info */ rv = soap_setPowerCapConfig(oa_handler->active_con, power_cap_config); if (rv != SOAP_OK) { err("Set enclosure power cap config failed"); return SA_ERR_HPI_INTERNAL_ERROR; } rv = soap_setPowerConfigInfo(oa_handler->active_con, power_config_info); if (rv != SOAP_OK) { err("Set enclosure power config info failed"); return SA_ERR_HPI_INTERNAL_ERROR; } } else { if (control_state == STATIC_POWER_LIMIT) { /* Make a soap call to set the enclosure power */ /* config info */ rv = soap_setPowerConfigInfo(oa_handler->active_con, power_config_info); if (rv != SOAP_OK) { err("Set enclosure power config info failed"); return SA_ERR_HPI_INTERNAL_ERROR; } } else { /* DYNAMIC_POWER_CAP */ /* Make a soap call to set the enclosure power */ /* cap config */ rv = soap_setPowerCapConfig(oa_handler->active_con, power_cap_config); if (rv != SOAP_OK) { err("Set enclosure power cap config failed"); return SA_ERR_HPI_INTERNAL_ERROR; } } } return SA_OK; } /** * oa_soap_get_static_pwr_limit_cntrl: * @oh_handler: Handler data pointer * @resource_id: Resource id * @control state: Pointer to analog control state * * Purpose: * Gets the control state of the static power limit control on resource * * Detailed Description: * - Gets the static power limit state of resource and maps it to * control state * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - On wrong parameter * SA_ERR_HPI_INTERNAL_ERROR - Internal error encountered **/ static SaErrorT oa_soap_get_static_pwr_limit_cntrl( struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, SaHpiCtrlStateAnalogT *control_state) { SaErrorT rv = SA_OK; struct powerConfigInfo *power_config_info; struct oa_soap_handler *oa_handler = NULL; if (oh_handler == NULL || control_state == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; power_config_info = &(oa_handler->power_config_info); /* Make a soap call to get the enclosure power config info */ wrap_g_mutex_lock(oa_handler->mutex); rv = soap_getPowerConfigInfo(oa_handler->active_con, power_config_info, &(oa_handler->desired_static_pwr_limit)); wrap_g_mutex_unlock(oa_handler->mutex); if (rv != SOAP_OK) { err("Get enclosure power config info failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Always report the OA view of the static power limit - regardless */ /* of the user's desired setting */ *control_state = power_config_info->powerCeiling; return SA_OK; } /** * oa_soap_set_static_pwr_limit_cntrl: * @oh_handler: Handler data pointer * @resource_id: Resource id * @control state: Analog control state * * Purpose: * Sets the control state of the static power limit control on resource * * Detailed Description: * - Sets the static power limit state of resource after mapping * the control state appropriate static power limit state * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - On wrong parameter * SA_ERR_HPI_INTERNAL_ERROR - Internal error encountered **/ static SaErrorT oa_soap_set_static_pwr_limit_cntrl( struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, SaHpiCtrlStateAnalogT control_state) { SaErrorT rv = SA_OK; struct powerConfigInfo *power_config_info; struct oa_soap_handler *oa_handler = NULL; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; power_config_info = &(oa_handler->power_config_info); oa_handler->desired_static_pwr_limit = control_state; /* If user already has the static power limit turned on, */ /* then let this new value go thru */ if (power_config_info->powerCeiling != 0) { power_config_info->powerCeiling = control_state; /* Make a soap call to set the enclosure power config info */ rv = soap_setPowerConfigInfo(oa_handler->active_con, power_config_info); if (rv != SOAP_OK) { err("Set enclosure power config info failed"); return SA_ERR_HPI_INTERNAL_ERROR; } } return SA_OK; } /** * oa_soap_get_dyanmic_pwr_cap_cntrl: * @oh_handler: Handler data pointer * @resource_id: Resource id * @control state: Pointer to analog control state * * Purpose: * Gets the control state of the dynamic power cap control on resource * * Detailed Description: * - Gets the dynamic power cap state of resource and maps it to * control state * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - On wrong parameter * SA_ERR_HPI_INTERNAL_ERROR - Internal error encountered **/ static SaErrorT oa_soap_get_dynamic_pwr_cap_cntrl( struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, SaHpiCtrlStateAnalogT *control_state) { SaErrorT rv = SA_OK; struct powerCapConfig *power_cap_config; struct oa_soap_handler *oa_handler = NULL; if (oh_handler == NULL || control_state == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; power_cap_config = &(oa_handler->power_cap_config); /* Make a soap call to get the enclosure power cap config */ wrap_g_mutex_lock(oa_handler->mutex); rv = soap_getPowerCapConfig(oa_handler->active_con, power_cap_config, &(oa_handler->desired_dynamic_pwr_cap), &(oa_handler->desired_derated_circuit_cap), &(oa_handler->desired_rated_circuit_cap)); wrap_g_mutex_unlock(oa_handler->mutex); if (rv != SOAP_OK) { err("Get enclosure power cap config failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Always report the OA view of the dynamic power cap - regardless of */ /* the user's desired setting */ *control_state = power_cap_config->powerCap; return SA_OK; } /** * oa_soap_set_dynamic_pwr_cap_cntrl: * @oh_handler: Handler data pointer * @resource_id: Resource id * @control state: Analog control state * * Purpose: * Sets the control state of the dynamic power cap control on resource * * Detailed Description: * - Sets the dynamic power cap state of resource after mapping the * control state appropriate dynamic power cap state * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - On wrong parameter * SA_ERR_HPI_INTERNAL_ERROR - Internal error encountered **/ static SaErrorT oa_soap_set_dynamic_pwr_cap_cntrl( struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, SaHpiCtrlStateAnalogT control_state) { SaErrorT rv = SA_OK; struct powerCapConfig *power_cap_config; struct oa_soap_handler *oa_handler = NULL; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; power_cap_config = &(oa_handler->power_cap_config); oa_handler->desired_dynamic_pwr_cap = control_state; /* If user already has the dynamic power cap turned on, then let */ /* this new value go thru */ if (power_cap_config->powerCap != 0) { power_cap_config->powerCap = control_state; /* Make a soap call to set the enclosure power cap config */ rv = soap_setPowerCapConfig(oa_handler->active_con, power_cap_config); if (rv != SOAP_OK) { err("Set enclosure power cap config failed"); return SA_ERR_HPI_INTERNAL_ERROR; } } return SA_OK; } /** * oa_soap_get_derated_circuit_cap_cntrl: * @oh_handler: Handler data pointer * @resource_id: Resource id * @control state: Pointer to analog control state * * Purpose: * Gets the control state of the derated circuit cap control on resource * * Detailed Description: * - Gets the derated circuit cap state of resource and maps it to * control state * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - On wrong parameter * SA_ERR_HPI_INTERNAL_ERROR - Internal error encountered **/ static SaErrorT oa_soap_get_derated_circuit_cap_cntrl( struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, SaHpiCtrlStateAnalogT *control_state) { SaErrorT rv = SA_OK; struct powerCapConfig *power_cap_config; struct oa_soap_handler *oa_handler = NULL; if (oh_handler == NULL || control_state == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; power_cap_config = &(oa_handler->power_cap_config); /* Make a soap call to get the enclosure power cap config */ wrap_g_mutex_lock(oa_handler->mutex); rv = soap_getPowerCapConfig(oa_handler->active_con, power_cap_config, &(oa_handler->desired_dynamic_pwr_cap), &(oa_handler->desired_derated_circuit_cap), &(oa_handler->desired_rated_circuit_cap)); wrap_g_mutex_unlock(oa_handler->mutex); if (rv != SOAP_OK) { err("Get enclosure derated circuit cap config failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Always report the OA view of the derated circuit cap - regardless */ /* of the user's desired setting */ *control_state = power_cap_config->deratedCircuitCap; return SA_OK; } /** * oa_soap_set_derated_circuit_cap_cntrl: * @oh_handler: Handler data pointer * @resource_id: Resource id * @control state: Analog control state * * Purpose: * Sets the control state of the derated circuit cap control on resource * * Detailed Description: * - Sets the derated circuit cap state of resource after mapping the * control state appropriate derated circuit cap state * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - On wrong parameter * SA_ERR_HPI_INTERNAL_ERROR - Internal error encountered **/ static SaErrorT oa_soap_set_derated_circuit_cap_cntrl( struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, SaHpiCtrlStateAnalogT control_state) { SaErrorT rv = SA_OK; struct powerCapConfig *power_cap_config; struct oa_soap_handler *oa_handler = NULL; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; power_cap_config = &(oa_handler->power_cap_config); oa_handler->desired_derated_circuit_cap = control_state; /* If user already has the dynamic power cap turned on, then let */ /* this new value go thru */ if (power_cap_config->powerCap != 0) { /* Need to set derated cap value in the power_cap_config */ power_cap_config->deratedCircuitCap = control_state; /* Make a soap call to set the enclosure power cap config */ rv = soap_setPowerCapConfig(oa_handler->active_con, power_cap_config); if (rv != SOAP_OK) { err("Set enclosure power cap config failed"); return SA_ERR_HPI_INTERNAL_ERROR; } } return SA_OK; } /** * oa_soap_get_rated_circuit_cap_cntrl: * @oh_handler: Handler data pointer * @resource_id: Resource id * @control state: Pointer to analog control state * * Purpose: * Gets the control state of the rated circuit cap control on resource * * Detailed Description: * - Gets the rated circuit cap state of resource and maps it to * control state * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - On wrong parameter * SA_ERR_HPI_INTERNAL_ERROR - Internal error encountered **/ static SaErrorT oa_soap_get_rated_circuit_cap_cntrl( struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, SaHpiCtrlStateAnalogT *control_state) { SaErrorT rv = SA_OK; struct powerCapConfig *power_cap_config; struct oa_soap_handler *oa_handler = NULL; if (oh_handler == NULL || control_state == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; power_cap_config = &(oa_handler->power_cap_config); /* Make a soap call to get the enclosure power cap config */ wrap_g_mutex_lock(oa_handler->mutex); rv = soap_getPowerCapConfig(oa_handler->active_con, power_cap_config, &(oa_handler->desired_dynamic_pwr_cap), &(oa_handler->desired_derated_circuit_cap), &(oa_handler->desired_rated_circuit_cap)); wrap_g_mutex_unlock(oa_handler->mutex); if (rv != SOAP_OK) { err("Get enclosure rated circuit cap config failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Always report the OA view of the rated circuit cap - regardless */ /* of the user's desired setting */ *control_state = power_cap_config->ratedCircuitCap; return SA_OK; } /** * oa_soap_set_rated_circuit_cap_cntrl: * @oh_handler: Handler data pointer * @resource_id: Resource id * @control state: Analog control state * * Purpose: * Sets the control state of the rated circuit cap control on resource * * Detailed Description: * - Sets the rated circuit cap state of resource after mapping the * control state appropriate rated circuit cap state * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - On wrong parameter * SA_ERR_HPI_INTERNAL_ERROR - Internal error encountered **/ static SaErrorT oa_soap_set_rated_circuit_cap_cntrl( struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, SaHpiCtrlStateAnalogT control_state) { SaErrorT rv = SA_OK; struct powerCapConfig *power_cap_config; struct oa_soap_handler *oa_handler = NULL; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; power_cap_config = &(oa_handler->power_cap_config); oa_handler->desired_rated_circuit_cap = control_state; /* If user already has the dynamic power cap turned on, then let */ /* this new value go thru */ if (power_cap_config->powerCap != 0) { /* Need to set rated cap value in the power_cap_config */ power_cap_config->ratedCircuitCap = control_state; /* Make a soap call to set the enclosure power cap config */ rv = soap_setPowerCapConfig(oa_handler->active_con, power_cap_config); if (rv != SOAP_OK) { err("Set enclosure power cap config failed"); return SA_ERR_HPI_INTERNAL_ERROR; } } return SA_OK; } void *oh_get_control_state (void *, SaHpiResourceIdT, SaHpiCtrlNumT, SaHpiCtrlModeT *, SaHpiCtrlStateT *) __attribute__ ((weak, alias ("oa_soap_get_control_state"))); void *oh_set_control_state (void *, SaHpiResourceIdT, SaHpiCtrlNumT, SaHpiCtrlModeT, SaHpiCtrlStateT *) __attribute__ ((weak, alias ("oa_soap_set_control_state"))); openhpi-3.6.1/plugins/oa_soap/Makefile.am0000644000175100017510000001077112575647270017336 0ustar mohanmohan# Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP # All rights reserved. # # Redistribution and use in source and binary forms, with or # without modification, are permitted provided that the following # conditions are met: # # Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the distribution. # # Neither the name of the Hewlett-Packard Corporation, nor the names # of its contributors may be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, # OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. MAINTAINERCLEANFILES = Makefile.in AM_CPPFLAGS = -DG_LOG_DOMAIN=\"oa_soap\" AM_CPPFLAGS += @OPENHPI_INCLUDES@ @XML2_INCLUDE@ @OH_SSL_INCLUDES@ pkglib_LTLIBRARIES = liboa_soap.la EXTRA_DIST = \ OpenHPI_Blade_DevGuide.pdf liboa_soap_la_SOURCES = oa_soap.h \ oa_soap.c \ oa_soap_power.h \ oa_soap_power.c \ oa_soap_reset.h \ oa_soap_reset.c \ oa_soap_hotswap.h \ oa_soap_hotswap.c \ oa_soap_utils.h \ oa_soap_utils.c \ oa_soap_resources.h \ oa_soap_resources.c \ oa_soap_discover.h \ oa_soap_discover.c \ oa_soap_re_discover.h \ oa_soap_re_discover.c \ oa_soap_event.h \ oa_soap_event.c \ oa_soap_enclosure_event.h \ oa_soap_enclosure_event.c \ oa_soap_oa_event.h \ oa_soap_oa_event.c \ oa_soap_ps_event.h \ oa_soap_ps_event.c \ oa_soap_fan_event.h \ oa_soap_fan_event.c \ oa_soap_lcd_event.h \ oa_soap_lcd_event.c \ oa_soap_server_event.h \ oa_soap_server_event.c \ oa_soap_interconnect_event.h \ oa_soap_interconnect_event.c \ oa_soap_control.h \ oa_soap_control.c \ oa_soap_sensor.h \ oa_soap_sensor.c \ oa_soap_inventory.h \ oa_soap_inventory.c \ oa_soap_watchdog.h \ oa_soap_watchdog.c \ oa_soap_sel.h \ oa_soap_sel.c \ oa_soap_annunciator.h \ oa_soap_annunciator.c \ oa_soap_dimi.h \ oa_soap_dimi.c \ oa_soap_fumi.h \ oa_soap_fumi.c \ oa_soap_load_id.h \ oa_soap_load_id.c \ oa_soap_calls.h \ oa_soap_calls.c \ oa_soap_callsupport.h \ oa_soap_callsupport.c # TODO: What about -luuid in the ilo2_ribcl? liboa_soap_la_LIBADD = @SSL_LIB@ @XML2_LIB@ \ $(top_builddir)/utils/libopenhpiutils.la liboa_soap_la_LDFLAGS = -module -version-info @HPI_LIB_VERSION@ openhpi-3.6.1/plugins/oa_soap/oa_soap_inventory.c0000644000175100017510000076231312575647270021212 0ustar mohanmohan/* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra M.S. * Bhaskara Bhatt * Shuah Khan * Raghavendra P.G. * * This file supports the functions related to HPI Inventory Data repositories. * The file covers three general classes of function: IDR ABI functions, * Build functions for creating IDRs for resources and IDR utility functions to * perform different operations (such as addition, deletion, modification) of * IDR areas and IDR fields. * * Data structure usage in Inventory: * - For each resource, one IDR header structure is created and associated in * the private data area of the Inventory RDR. * - Area list is implemented using linked list datastructure. * - Each area in list will contain an area header and field list. * - Field list is also implemented using linked list datastructure. * * IDR ABI functions: * * oa_soap_get_idr_info() - Gets the Inventory Data * Repository(IDR) information * * oa_soap_get_idr_area_header() - Gets the Inventory Data * Repository(IDR) area header * information for a specific area * * oa_soap_add_idr_area() - Creates the Inventory Data * Repository(IDR) area of requested type * * oa_soap_add_idr_area_by_id() - Creates the Inventory Data * Repository(IDR) area of requested type * with specified id * * oa_soap_delete_idr_area() - Deletes the Inventory Data * Repository(IDR) area of specified id * * oa_soap_get_idr_field() - Gets Inventory Data Repository(IDR) * field from a particular IDR area * * oa_soap_add_idr_field() - Adds an IDR field to the specified * Inventory Data Repository(IDR) Area * * oa_soap_add_idr_field_by_id() - Add a field to a specified Inventory * Data Repository(IDR) Area with the * specified field id * * oa_soap_set_idr_field() - Updates the specified Inventory Data * Repository(IDR) field * * oa_soap_del_idr_field() - Deletes the Inventory Data Repository * (IDR) field with specific identifier * in IDR area * Build functions: * * build_enclosure_inv_rdr() - Creates an inventory rdr for enclosure * * build_oa_inv_rdr() - Creates an inventory rdr for OA * * build_server_inv_rdr() - Creates an inventory rdr for server * * build_server_inv_rdr_arr() - Creates an inventory rdr for server * using inv,info,portmap information * with a call to OA to get sensor info * * build_interconnect_inv_rdr() - Creates an inventory rdr for * interconnect * * build_interconnect_inv_rdr_arr()- Creates an inventory rdr for one * interconnect using inv, info and * portmap info without a call to OA * * build_fan_inv_rdr() - Creates an inventory rdr for fan * * build_power_inv_rdr() - Creates an inventory rdr for power * supply * * oa_soap_build_fan_zone_inventory_rdr() - Creates inventory rdr for Fan * Zone * * IDR Utility functions: * * add_product_area(), * add_chassis_area(), * add_board_area(), * add_internal_area() - IDR utility functions to add IDR areas * * idr_area_add() - Adds an IDR area to Inventory * repository * * idr_area_add_by_id() - Adds an IDR area to Inventory * repository with the specified area id * * fetch_idr_area_header() - Gets an Inventory Data Repository(IDR) * area header from Inventory Data * Repository(IDR) * * idr_area_delete() - Deletes an IDR area from Inventory * Data Repository(IDR) * * idr_field_add() - Adds an IDR field to an IDR area * * idr_field_add_by_id() - Adds an IDR field to an IDR area with * the specified field id * * idr_field_delete() - Deletes an IDR field from an IDR area * * idr_field_update() - Updates an IDR field of an IDR area * * fetch_idr_field() - Gets an IDR field from IDR area in * Inventory repository * * oa_soap_inv_set_field() - Sets the field during discovery * * oa_soap_add_inv_fields() - Adds the fields to area during * discovery * * oa_soap_add_inv_areas() - Adds the area to area_list during * discovery * * oa_soap_build_inventory_rdr() - Creates the inventory RDR * */ #include "oa_soap_inventory.h" #include "oa_soap_utils.h" #include "sahpi_wrappers.h" /* Array defined in oa_soap_resources.c */ extern const struct oa_soap_inv_rdr oa_soap_inv_arr[]; extern const struct oa_soap_fz_map oa_soap_fz_map_arr[][OA_SOAP_MAX_FAN]; /* Forward declarations for static functions */ static void oa_soap_inv_set_field(struct oa_soap_area *area_list, SaHpiIdrAreaTypeT area_type, SaHpiIdrFieldTypeT field_type, char *data); static void oa_soap_add_inv_fields(struct oa_soap_area *area, const struct oa_soap_field *field_list); static void oa_soap_add_inv_areas(struct oa_soap_inventory *inventory, SaHpiInt32T resource_type); static SaErrorT oa_soap_build_inv(struct oh_handler_state *oh_handler, SaHpiInt32T resource_type, SaHpiResourceIdT resource_id, struct oa_soap_inventory **inventory); /** * oa_soap_get_idr_info * @oh_handler: Handler data pointer * @resource_id: Resource ID * @idr: IDR ID * @idr_info: Structure for receiving idr information * * Purpose: * Gets the Inventory Data Repository(IDR) information * * Detailed Description: * - Fetches idr info structure from the private data area of * inventory rdr of the specified resource_id * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_INVENTORY * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INVALID_RESOURCE - Invalid resource id specified * SA_ERR_HPI_NOT_PRESENT - Requested object not present **/ SaErrorT oa_soap_get_idr_info(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiIdrIdT idr, SaHpiIdrInfoT *idr_info) { struct oh_handler_state *handler; SaHpiRptEntryT *rpt = NULL; SaHpiRdrT *rdr = NULL; struct oa_soap_inventory *inventory = NULL; if (oh_handler == NULL || idr_info == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } handler = (struct oh_handler_state *)oh_handler; rpt = oh_get_resource_by_id(handler->rptcache, resource_id); if (!rpt) { err("INVALID RESOURCE"); return SA_ERR_HPI_INVALID_RESOURCE; } if (! (rpt->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)) { err("INVALID RESOURCE CAPABILITY"); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(handler->rptcache, resource_id, SAHPI_INVENTORY_RDR, idr); if (rdr == NULL) { err("INVALID RDR NUMBER"); return SA_ERR_HPI_NOT_PRESENT; } inventory = (struct oa_soap_inventory *) oh_get_rdr_data(handler->rptcache, resource_id, rdr->RecordId); if (inventory == NULL) { err("No inventory data. idr=%s", rdr->IdString.Data); return SA_ERR_HPI_NOT_PRESENT; } memcpy(idr_info, &inventory->info.idr_info, sizeof(SaHpiIdrInfoT)); return SA_OK; } /** * oa_soap_get_idr_area_header * @oh_handler: Handler data pointer * @resource_id: Resource ID * @idr: IDR ID * @area_type: Type of the inventory data area * @area_id: Identifier of the area entry * @next_area_id: Structure for receiving the next area of the requested * type * @header: Structure for receiving idr information * * Purpose: * Gets the Inventory Data Repository(IDR) area header information * for a specific area * * Detailed Description: * - This function gets the inventory data area header information * of a particular area associated with IDR of resource_id * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_INVENTORY * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INVALID_RESOURCE - Invalid resource id specified * SA_ERR_HPI_NOT_PRESENT - Requested object not present **/ SaErrorT oa_soap_get_idr_area_header(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiIdrIdT idr, SaHpiIdrAreaTypeT area_type, SaHpiEntryIdT area_id, SaHpiEntryIdT *next_area_id, SaHpiIdrAreaHeaderT *header) { SaErrorT rv = SA_OK; struct oh_handler_state *handler; SaHpiRptEntryT *rpt = NULL; SaHpiRdrT *rdr = NULL; struct oa_soap_inventory *inventory = NULL; char *type; if (oh_handler == NULL || next_area_id == NULL || header == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } /* Check whether area_type supplied is in list of * valid area types specified by the framework */ type = oh_lookup_idrareatype(area_type); if (type == NULL) { err("Invalid area type."); return SA_ERR_HPI_INVALID_PARAMS; } if (area_id == SAHPI_LAST_ENTRY) { err("Invalid area id."); return SA_ERR_HPI_INVALID_PARAMS; } handler = (struct oh_handler_state *)oh_handler; rpt = oh_get_resource_by_id(handler->rptcache, resource_id); if (!rpt) { err("INVALID RESOURCE"); return SA_ERR_HPI_INVALID_RESOURCE; } if (! (rpt->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)) { err("INVALID RESOURCE CAPABILITY"); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(handler->rptcache, resource_id, SAHPI_INVENTORY_RDR, idr); if (rdr == NULL) { err("INVALID RDR NUMBER"); return SA_ERR_HPI_NOT_PRESENT; } inventory = (struct oa_soap_inventory *) oh_get_rdr_data(handler->rptcache, resource_id, rdr->RecordId); if (inventory == NULL) { err("No inventory data. idr=%s", rdr->IdString.Data); return SA_ERR_HPI_NOT_PRESENT; } /* Check whether the area list of the resource IDR is empty */ if (inventory->info.idr_info.NumAreas == 0) { err("IDR Area not present"); return SA_ERR_HPI_NOT_PRESENT; } /* Fetch the area header of IDR area of the specified area_id. * Next area shall contain reference to next area of * the same area type if existing, else it will be set to NULL */ rv = fetch_idr_area_header(&(inventory->info), area_id, area_type, header, next_area_id); if (rv != SA_OK) { err("IDR Area not present"); return SA_ERR_HPI_NOT_PRESENT; } return rv; } /** * oa_soap_add_idr_area * @oh_handler: Handler data pointer. * @resource_id: Resource ID. * @idr: IDR ID. * @area_type: Type of the inventory data area. * @area_id: Area id of the newly created area. * * Purpose: * Creates the Inventory Data Repository(IDR) area of requested type * * Detailed Description: * - Creates an IDR area of the specified area type and adds it to end of * area list of the resource IDR * * Return values: * SA_OK - Normal case * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_INVENTORY * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INVALID_DATA - On Invalid area type * SA_ERR_HPI_INVALID_RESOURCE - Invalid resource id specified * SA_ERR_HPI_NOT_PRESENT - Requested object not present * SA_ERR_HPI_READ_ONLY - The data to be operated upon is read only * SA_ERR_HPI_OUT_OF_SPACE - Request failed due to insufficient memory **/ SaErrorT oa_soap_add_idr_area(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiIdrIdT idr, SaHpiIdrAreaTypeT area_type, SaHpiEntryIdT *area_id) { SaErrorT rv = SA_OK; struct oh_handler_state *handler; SaHpiRptEntryT *rpt = NULL; SaHpiRdrT *rdr = NULL; struct oa_soap_area *local_area = NULL; struct oa_soap_inventory *inventory = NULL; char *type; if (oh_handler == NULL || area_id == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } /* Check whether area_type supplied is in list of * valid area types specified by the framework */ type = oh_lookup_idrareatype(area_type); if (type == NULL) { err("Invalid area_type."); return SA_ERR_HPI_INVALID_PARAMS; } /* It is not valid to create the area of UNSPECIFIED type */ if (area_type == SAHPI_IDR_AREATYPE_UNSPECIFIED) { err("Invalid area_type."); return SA_ERR_HPI_INVALID_DATA; } handler = (struct oh_handler_state *)oh_handler; rpt = oh_get_resource_by_id(handler->rptcache, resource_id); if (!rpt) { err("INVALID RESOURCE"); return SA_ERR_HPI_INVALID_RESOURCE; } if (! (rpt->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)) { err("INVALID RESOURCE CAPABILITY"); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(handler->rptcache, resource_id, SAHPI_INVENTORY_RDR, idr); if (rdr == NULL) { err("INVALID RDR NUMBER"); return SA_ERR_HPI_NOT_PRESENT; } inventory = (struct oa_soap_inventory *) oh_get_rdr_data(handler->rptcache, resource_id, rdr->RecordId); if (inventory == NULL) { err("No inventory data. idr=%s", rdr->IdString.Data); return SA_ERR_HPI_NOT_PRESENT; } /* Check whether the resource IDR is read only */ if (inventory->info.idr_info.ReadOnly == SAHPI_TRUE) { err("IDR is read only"); return SA_ERR_HPI_READ_ONLY; } /* Create and add the new area to the end of resource IDR area list */ rv = idr_area_add(&(inventory->info.area_list), area_type, &local_area); if (rv != SA_OK) { err("Addition of IDR area failed"); if (rv == SA_ERR_HPI_OUT_OF_MEMORY) { return SA_ERR_HPI_OUT_OF_SPACE; } return rv; } /* Increment area count in resource IDR */ inventory->info.idr_info.NumAreas++; /* Increment modification count of resource IDR */ inventory->info.idr_info.UpdateCount++; *area_id = local_area->idr_area_head.AreaId; return SA_OK; } /** * oa_soap_add_idr_area_by_id: * @oh_handler: Handler data pointer. * @resource_id: Resource ID. * @idr: IDR ID. * @area_type: Type of the inventory data area. * @area_id: Area id of the newly created area. * * Purpose: * Creates the Inventory Data Repository(IDR) area of requested type * * Detailed Description: * - Creates an IDR area of the specified area type and area id and adds * to area list of the resource IDR * * Return values: * SA_OK - Normal case * SA_ERR_HPI_CAPABILITY - Resource don't have SAHPI_CAPABILITY_INVENTORY * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INVALID_RESOURCE - Invalid resource id specified * SA_ERR_HPI_NOT_PRESENT - Requested object not present * SA_ERR_HPI_READ_ONLY - The data to be operated upon is read only * SA_ERR_HPI_DUPLICATE - Area ID already exists * SA_ERR_HPI_OUT_OF_SPACE - Request failed due to insufficient memory **/ SaErrorT oa_soap_add_idr_area_by_id (void *oh_handler, SaHpiResourceIdT resource_id, SaHpiIdrIdT idr, SaHpiIdrAreaTypeT area_type, SaHpiEntryIdT area_id) { SaErrorT rv = SA_OK; struct oh_handler_state *handler; SaHpiRptEntryT *rpt = NULL; SaHpiRdrT *rdr = NULL; struct oa_soap_inventory *inventory = NULL; SaHpiEntryIdT *next_area = NULL; SaHpiIdrAreaHeaderT *area_header = NULL; char *type; if (oh_handler == NULL || area_id == SAHPI_LAST_ENTRY) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } /* Check whether supplied area_type is in list of * valid area types specified by the framework */ type = oh_lookup_idrareatype(area_type); if (type == NULL) { err("Invalid area_type."); return SA_ERR_HPI_INVALID_PARAMS; } /* It is not valid to create the area of UNSPECIFIED type */ if (area_type == SAHPI_IDR_AREATYPE_UNSPECIFIED) { err("Invalid area_type."); return SA_ERR_HPI_INVALID_DATA; } handler = (struct oh_handler_state *)oh_handler; rpt = oh_get_resource_by_id(handler->rptcache, resource_id); if (!rpt) { err("INVALID RESOURCE"); return SA_ERR_HPI_INVALID_RESOURCE; } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)) { err("INVALID RESOURCE CAPABILITY"); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(handler->rptcache, resource_id, SAHPI_INVENTORY_RDR, idr); if (rdr == NULL) { err("INVALID RDR NUMBER"); return SA_ERR_HPI_NOT_PRESENT; } inventory = (struct oa_soap_inventory *) oh_get_rdr_data(handler->rptcache, resource_id, rdr->RecordId); if (inventory == NULL) { err("No inventory data. idr=%s", rdr->IdString.Data); return SA_ERR_HPI_NOT_PRESENT; } /* Check whether the resource IDR is read only */ if (inventory->info.idr_info.ReadOnly == SAHPI_TRUE) { err("IDR is read only"); return SA_ERR_HPI_READ_ONLY; } /* Check if the Area ID already exists */ rv = fetch_idr_area_header(&(inventory->info), area_id,area_type, area_header, next_area); if (rv == SA_OK) { err("AreaId already exists in the IDR"); return SA_ERR_HPI_DUPLICATE; } /* Create and add the new area to the resource IDR area list */ rv = idr_area_add_by_id(&(inventory->info.area_list), area_type, area_id); if (rv != SA_OK) { err("Addition of IDR area failed"); if (rv == SA_ERR_HPI_OUT_OF_MEMORY) { return SA_ERR_HPI_OUT_OF_SPACE; } return rv; } /* Increment area count in resource IDR */ inventory->info.idr_info.NumAreas++; /* Increment modification count of resource IDR */ inventory->info.idr_info.UpdateCount++; return SA_OK; } /** * oa_soap_del_idr_area * @oh_handler: Handler data pointer * @resource_id: Resource ID * @idr: IDR ID * @area_id: Area id of the newly created area * * Purpose: * Deletes the Inventory Data Repository(IDR) area with specific identifier * * Detailed Description: * - Check whether the IDR area of specified area id exists * - If specified IDR area does not exist, then it is deleted from * the area list else an appropriate error is returned * * Return values: * SA_OK - Normal case * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_INVENTORY * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INVALID_RESOURCE - Invalid resource id specified * SA_ERR_HPI_NOT_PRESENT - Requested object not present * SA_ERR_HPI_READ_ONLY - The data to be operated upon is read only **/ SaErrorT oa_soap_del_idr_area(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiIdrIdT idr, SaHpiEntryIdT area_id) { SaErrorT rv = SA_OK; struct oh_handler_state *handler; SaHpiRptEntryT *rpt = NULL; SaHpiRdrT *rdr = NULL; struct oa_soap_inventory *inventory = NULL; if (oh_handler == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } handler = (struct oh_handler_state *)oh_handler; if (area_id == SAHPI_LAST_ENTRY) { err("Invalid area id."); return SA_ERR_HPI_INVALID_PARAMS; } rpt = oh_get_resource_by_id(handler->rptcache, resource_id); if (!rpt) { err("INVALID RESOURCE"); return SA_ERR_HPI_INVALID_RESOURCE; } if (! (rpt->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)) { err("INVALID RESOURCE CAPABILITY"); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(handler->rptcache, resource_id, SAHPI_INVENTORY_RDR, idr); if (rdr == NULL) { err("INVALID RDR NUMBER"); return SA_ERR_HPI_NOT_PRESENT; } inventory = (struct oa_soap_inventory *) oh_get_rdr_data(handler->rptcache, resource_id, rdr->RecordId); if (inventory == NULL) { err("No inventory data. IdrId=%s", rdr->IdString.Data); return SA_ERR_HPI_NOT_PRESENT; } /* Check whether the resource IDR is read only */ if (inventory->info.idr_info.ReadOnly == SAHPI_TRUE) { err("IDR is read only"); return SA_ERR_HPI_READ_ONLY; } /* Delete the specified area if it exists, else return an error */ rv = idr_area_delete(&(inventory->info.area_list), area_id); if (rv != SA_OK) { err("IDR Area not found"); return rv; } /* Decrement area count in resource IDR */ inventory->info.idr_info.NumAreas--; /* Increment modification count of resource IDR */ inventory->info.idr_info.UpdateCount++; return SA_OK; } /** * oa_soap_get_idr_field * @oh_handler: Handler data pointer * @resource_id: Resource ID * @idr: IDR ID * @area_id: Area id * @field_type: Type of the IDR field * @field_id: Identifier of the field to be retrieved * @next_field_id: Identifier of the next field of the requested type * @field: Structure to retrieve the field contents * * Purpose: * Gets Inventory Data Repository(IDR) field from a particular IDR area * * Detailed Description: * - Check whether the IDR field of the specified field id exists * - If specified IDR field exists, then field structure is returned * * Return values: * SA_OK - Normal case * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_INVENTORY * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INVALID_RESOURCE - Invalid resource id specified * SA_ERR_HPI_NOT_PRESENT - Requested object not present * SA_ERR_HPI_READ_ONLY - The data to be operated upon is read only **/ SaErrorT oa_soap_get_idr_field(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiIdrIdT idr, SaHpiEntryIdT area_id, SaHpiIdrFieldTypeT field_type, SaHpiEntryIdT field_id, SaHpiEntryIdT *next_field_id, SaHpiIdrFieldT *field) { SaErrorT rv = SA_OK; struct oh_handler_state *handler; SaHpiRptEntryT *rpt = NULL; SaHpiRdrT *rdr = NULL; struct oa_soap_inventory *inventory = NULL; char *type; if (oh_handler == NULL || next_field_id == NULL || field == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } if ((area_id == SAHPI_LAST_ENTRY) || (field_id == SAHPI_LAST_ENTRY)) { return SA_ERR_HPI_INVALID_PARAMS; } /* Check whether field_type supplied is in list of * valid field types specified by the framework */ type = oh_lookup_idrfieldtype(field_type); if (type == NULL) { err("Invalid field type."); return SA_ERR_HPI_INVALID_PARAMS; } handler = (struct oh_handler_state *)oh_handler; rpt = oh_get_resource_by_id(handler->rptcache, resource_id); if (!rpt) { err("INVALID RESOURCE"); return SA_ERR_HPI_INVALID_RESOURCE; } if (! (rpt->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)) { err("INVALID RESOURCE CAPABILITY"); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(handler->rptcache, resource_id, SAHPI_INVENTORY_RDR, idr); if (rdr == NULL) { err("INVALID RDR NUMBER"); return SA_ERR_HPI_NOT_PRESENT; } inventory = (struct oa_soap_inventory *) oh_get_rdr_data(handler->rptcache, resource_id, rdr->RecordId); if (inventory == NULL) { err("No inventory data. idr=%s", rdr->IdString.Data); return SA_ERR_HPI_NOT_PRESENT; } /* Check whether the area list of the resource IDR is empty */ if (inventory->info.idr_info.NumAreas == 0) { err("IDR Area not present"); return SA_ERR_HPI_NOT_PRESENT; } /* Fetch the IDR field of the specified field_id. * next_field shall contain reference to next field of * the same field type if is exists, else it will be set to NULL */ rv = fetch_idr_field(&(inventory->info), area_id, field_type, field_id, next_field_id, field); if (rv != SA_OK) { err("IDR Field not present"); return rv; } return SA_OK; } /** * oa_soap_add_idr_field * @oh_handler: Handler data pointer * @resource_id: Resource ID * @idr: IDR ID * @field: structure containing the new field information * * Purpose: * Add a field to a specified Inventory Data Repository(IDR) Area * * Detailed Description: * - Creates an IDR field of the specified field type and adds to end of * field list of the specified IDR area id in resource IDR * * Return values: * SA_OK - Normal case * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_INVENTORY * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INVALID_DATA - On Invalid field type * SA_ERR_HPI_INVALID_RESOURCE - Invalid resource id specified * SA_ERR_HPI_NOT_PRESENT - Requested object not present * SA_ERR_HPI_READ_ONLY - The data to be operated upon is read only * SA_ERR_HPI_OUT_OF_SPACE - Request failed due to insufficient memory **/ SaErrorT oa_soap_add_idr_field(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiIdrIdT idr, SaHpiIdrFieldT *field) { SaErrorT rv = SA_OK; struct oh_handler_state *handler; SaHpiRptEntryT *rpt = NULL; SaHpiRdrT *rdr = NULL; struct oa_soap_inventory *inventory = NULL; struct oa_soap_area *local_area = NULL; char *type; if (oh_handler == NULL || field == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } type = oh_lookup_idrfieldtype(field->Type); if (type == NULL) { err("Invalid field type."); return SA_ERR_HPI_INVALID_PARAMS; } /* It is not valid to create the field of UNSPECIFIED type */ if (field->Type == SAHPI_IDR_FIELDTYPE_UNSPECIFIED) { err("Invalid field type."); return SA_ERR_HPI_INVALID_DATA; } handler = (struct oh_handler_state *)oh_handler; rpt = oh_get_resource_by_id(handler->rptcache, resource_id); if (!rpt) { err("INVALID RESOURCE"); return SA_ERR_HPI_INVALID_RESOURCE; } if (! (rpt->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)) { err("INVALID RESOURCE CAPABILITY"); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(handler->rptcache, resource_id, SAHPI_INVENTORY_RDR, idr); if (rdr == NULL) { err("INVALID RDR NUMBER"); return SA_ERR_HPI_NOT_PRESENT; } inventory = (struct oa_soap_inventory *) oh_get_rdr_data(handler->rptcache, resource_id, rdr->RecordId); if (inventory == NULL) { err("No inventory data. idr=%s", rdr->IdString.Data); return SA_ERR_HPI_NOT_PRESENT; } if (inventory->info.idr_info.NumAreas == 0) { err("No areas in the specified IDR"); return SA_ERR_HPI_NOT_PRESENT; } /* Start traversing the area list of resource IDR from the * head node */ local_area = inventory->info.area_list; while (local_area != NULL) { if ((field->AreaId == local_area->idr_area_head.AreaId)) { break; } local_area = local_area->next_area; } /* If the area id specified in field structure does exist, then * local_area will point to that area, else it is NULL */ if (!local_area) { return SA_ERR_HPI_NOT_PRESENT; } /* Check whether the specified IDR area is read only */ if (local_area->idr_area_head.ReadOnly == SAHPI_TRUE) { err("IDR Area is read only"); return SA_ERR_HPI_READ_ONLY; } /* Create and add the new field to end of filed list in IDR area */ rv = idr_field_add(&(local_area->field_list), field); if (rv != SA_OK) { err("IDR field add failed"); if (rv == SA_ERR_HPI_OUT_OF_MEMORY) { return SA_ERR_HPI_OUT_OF_SPACE; } return rv; } /* Increment the field count in IDR area */ local_area->idr_area_head.NumFields++; /* Increment the update cound of resource IDR */ inventory->info.idr_info.UpdateCount++; return SA_OK; } /** * oa_soap_add_idr_field_by_id: * @oh_handler: Handler data pointer * @resource_id: Resource ID * @idr: IDR ID * @field: structure containing the new field information * * Purpose: * Add a field to a specified Inventory Data Repository(IDR) * Area with the specified field id * * Detailed Description: * - Creates an IDR field of the specified field type and adds to * field list of the specified IDR area id in resource IDR * * Return values: * SA_OK - Normal case * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_INVENTORY * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INVALID_RESOURCE - Invalid resource id specified * SA_ERR_HPI_NOT_PRESENT - Requested object not present * SA_ERR_HPI_READ_ONLY - The data to be operated upon is read only * SA_ERR_HPI_OUT_OF_SPACE - Request failed due to insufficient memory **/ SaErrorT oa_soap_add_idr_field_by_id(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiIdrIdT idr_id, SaHpiIdrFieldT *field) { SaErrorT rv = SA_OK; struct oh_handler_state *handler; SaHpiRptEntryT *rpt = NULL; SaHpiRdrT *rdr = NULL; struct oa_soap_inventory *inventory = NULL; struct oa_soap_area *local_area = NULL; char *type; if (oh_handler == NULL || field == NULL || field->AreaId == SAHPI_LAST_ENTRY || field->FieldId == SAHPI_LAST_ENTRY) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } type = oh_lookup_idrfieldtype(field->Type); if (type == NULL) { err("Invalid field type."); return SA_ERR_HPI_INVALID_PARAMS; } /* It is not valid to create the field of UNSPECIFIED type */ if (field->Type == SAHPI_IDR_FIELDTYPE_UNSPECIFIED) { err("Invalid field type."); return SA_ERR_HPI_INVALID_PARAMS; } handler = (struct oh_handler_state *)oh_handler; rpt = oh_get_resource_by_id(handler->rptcache, resource_id); if (!rpt) { err("INVALID RESOURCE"); return SA_ERR_HPI_INVALID_RESOURCE; } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)) { err("INVALID RESOURCE CAPABILITY"); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(handler->rptcache, resource_id, SAHPI_INVENTORY_RDR, idr_id); if (rdr == NULL) { err("INVALID RDR NUMBER"); return SA_ERR_HPI_NOT_PRESENT; } inventory = (struct oa_soap_inventory *) oh_get_rdr_data(handler->rptcache, resource_id, rdr->RecordId); if (inventory == NULL) { err("No inventory data. idr=%s", rdr->IdString.Data); return SA_ERR_HPI_NOT_PRESENT; } if (inventory->info.idr_info.NumAreas == 0) { err("No areas in the specified IDR"); return SA_ERR_HPI_NOT_PRESENT; } /* Start traversing the area list of resource IDR from the * head node of the area linked list */ local_area = inventory->info.area_list; while (local_area != NULL) { if ((field->AreaId == local_area->idr_area_head.AreaId)) { break; } local_area = local_area->next_area; } /* If the area id specified in field structure is existing, then * local_area will point to that area, else it is NULL */ if (!local_area) { return SA_ERR_HPI_NOT_PRESENT; } /* Check whether the specified IDR area is read only */ if (local_area->idr_area_head.ReadOnly == SAHPI_TRUE) { err("IDR Area is read only"); } /* Create and add the new field to field list in IDR area */ rv = idr_field_add_by_id(&(local_area->field_list), field->AreaId, field->Type, (char *)field->Field.Data, field->FieldId); if (rv != SA_OK) { err("IDR field add failed"); if (rv == SA_ERR_HPI_OUT_OF_MEMORY) { return SA_ERR_HPI_OUT_OF_SPACE; } return rv; } /* Increment the field count in IDR area */ local_area->idr_area_head.NumFields++; /* Increment the update cound of resource IDR */ inventory->info.idr_info.UpdateCount++; return SA_OK; } /** * oa_soap_set_idr_field * @oh_handler: Handler data pointer * @resource_id: Resource ID * @idr: IDR ID * @field: Structure containing the modification field information * * Purpose: * Updates the specified Inventory Data Repository(IDR) field * * Detailed Description: * - Updates the field contents of the IDR field of specified * field id from field list of the specified IDR area id in * resource IDR * - If the specified field does not exist, then an appropriate error is * returned * * Return values: * SA_OK - Normal case * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_INVENTORY * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INVALID_RESOURCE - Invalid resource id specified * SA_ERR_HPI_NOT_PRESENT - Requested object not present * SA_ERR_HPI_READ_ONLY - The data to be operated upon is read only **/ SaErrorT oa_soap_set_idr_field(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiIdrIdT idr, SaHpiIdrFieldT *field) { SaErrorT rv = SA_OK; struct oh_handler_state *handler; SaHpiRptEntryT *rpt = NULL; SaHpiRdrT *rdr = NULL; struct oa_soap_inventory *inventory = NULL; struct oa_soap_area *local_area = NULL; char *type; if (oh_handler == NULL || field == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } /* Check whether the specified field type is in valid list * of field types */ type = oh_lookup_idrfieldtype(field->Type); if (type == NULL) { err("Invalid field type."); return SA_ERR_HPI_INVALID_PARAMS; } /* It is invalid to specify the field type as * SAHPI_IDR_FIELDTYPE_UNSPECIFIED */ if (field->Type == SAHPI_IDR_FIELDTYPE_UNSPECIFIED) { err("Invalid field type."); return SA_ERR_HPI_INVALID_PARAMS; } handler = (struct oh_handler_state *)oh_handler; rpt = oh_get_resource_by_id(handler->rptcache, resource_id); if (!rpt) { err("INVALID RESOURCE"); return SA_ERR_HPI_INVALID_RESOURCE; } if (! (rpt->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)) { err("INVALID RESOURCE CAPABILITY"); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(handler->rptcache, resource_id, SAHPI_INVENTORY_RDR, idr); if (rdr == NULL) { err("INVALID RDR NUMBER"); return SA_ERR_HPI_NOT_PRESENT; } inventory = (struct oa_soap_inventory *) oh_get_rdr_data(handler->rptcache, resource_id, rdr->RecordId); if (inventory == NULL) { err("No inventory data. idr=%s", rdr->IdString.Data); return SA_ERR_HPI_NOT_PRESENT; } if (inventory->info.idr_info.NumAreas == 0) { err("No areas in the specified IDR"); return SA_ERR_HPI_NOT_PRESENT; } /* Start traversing the area list of resource IDR from the * head node of the area linked list */ local_area = inventory->info.area_list; while (local_area != NULL) { if ((field->AreaId == local_area->idr_area_head.AreaId)) { break; } local_area = local_area->next_area; } /* If the area id specified in field structure exists, then * local_area will point to that area, else it is NULL */ if (!local_area) { err("IDR area not present"); return SA_ERR_HPI_NOT_PRESENT; } /* Update the specified field with latest data */ rv = idr_field_update(local_area->field_list, field); if (rv != SA_OK) { err("IDR field update failed"); return rv; } inventory->info.idr_info.UpdateCount++; return SA_OK; } /** * oa_soap_del_idr_field * @oh_handler: Handler data pointer * @resource_id: Resource ID * @idr: IDR ID * @area_id: Area id * @field_id: Identifier of the field to be deleted * * Purpose: * Deletes the Inventory Data Repository(IDR) field with * specific identifier from IDR area * * Detailed Description: * - Deletes an IDR field of the specified field id from field list * of the specified IDR area id in resource IDR * - If the specified field does not exist, then an appropriate error is * returned * * Return values: * SA_OK - Normal case * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_INVENTORY * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INVALID_RESOURCE - Invalid resource id specified * SA_ERR_HPI_NOT_PRESENT - Requested object not present * SA_ERR_HPI_READ_ONLY - The data to be operated upon is read only **/ SaErrorT oa_soap_del_idr_field(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiIdrIdT idr, SaHpiEntryIdT area_id, SaHpiEntryIdT field_id) { SaErrorT rv = SA_OK; struct oh_handler_state *handler; SaHpiRptEntryT *rpt = NULL; SaHpiRdrT *rdr = NULL; struct oa_soap_inventory *inventory = NULL; struct oa_soap_area *local_area = NULL; if (oh_handler == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } if ((area_id == SAHPI_LAST_ENTRY) || (field_id == SAHPI_LAST_ENTRY)) { return SA_ERR_HPI_INVALID_PARAMS; } handler = (struct oh_handler_state *)oh_handler; rpt = oh_get_resource_by_id(handler->rptcache, resource_id); if (!rpt) { err("INVALID RESOURCE"); return SA_ERR_HPI_INVALID_RESOURCE; } if (! (rpt->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)) { err("INVALID RESOURCE CAPABILITY"); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(handler->rptcache, resource_id, SAHPI_INVENTORY_RDR, idr); if (rdr == NULL) { err("INVALID RDR NUMBER"); return SA_ERR_HPI_NOT_PRESENT; } inventory = (struct oa_soap_inventory *) oh_get_rdr_data(handler->rptcache, resource_id, rdr->RecordId); if (inventory == NULL) { err("No inventory data. idr=%s", rdr->IdString.Data); return SA_ERR_HPI_NOT_PRESENT; } if (inventory->info.idr_info.NumAreas == 0) { err("No areas in the specified IDR"); return SA_ERR_HPI_NOT_PRESENT; } /* Start traversing the area list of resource IDR from the * head node of the area linked list */ local_area = inventory->info.area_list; while (local_area != NULL) { if ((area_id == local_area->idr_area_head.AreaId)) { break; } local_area = local_area->next_area; } if (!local_area) { err("IDR Area not present"); return SA_ERR_HPI_NOT_PRESENT; } /* Check whether the specified IDR area is read only */ if (local_area->idr_area_head.ReadOnly == SAHPI_TRUE) { err("IDR area is read only"); return SA_ERR_HPI_READ_ONLY; } /* Delete the specified field from the field list*/ rv = idr_field_delete(&(local_area->field_list), field_id); if (rv != SA_OK) { return rv; } /* Decrement the field count in IDR area */ local_area->idr_area_head.NumFields--; inventory->info.idr_info.UpdateCount++; return SA_OK; } /** * build_enclosure_inv_rdr * @oh_handler: Handler data pointer * @response: Pointer to get enclosure info response data structure * @rdr: Rdr Structure for inventory data * @inventory: Rdr private data structure * * Purpose: * Creates an inventory rdr for enclosure * * Detailed Description: * - Populates the enclosure inventory rdr with default values * - Inventory data repository is created and associated in the private * data area of the Inventory RDR * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - oa_soap plugin has encountered an internal * error * SA_ERR_HPI_OUT_OF_MEMORY - Request failed due to insufficient memory **/ SaErrorT build_enclosure_inv_rdr(struct oh_handler_state *oh_handler, struct enclosureInfo *response, SaHpiRdrT *rdr, struct oa_soap_inventory **inventory) { SaErrorT rv = SA_OK; SaHpiIdrFieldT hpi_field; char enclosure_inv_str[] = ENCLOSURE_INVENTORY_STRING; struct oa_soap_inventory *local_inventory = NULL; struct oa_soap_area *head_area = NULL; SaHpiInt32T add_success_flag = 0; SaHpiInt32T product_area_success_flag = 0; SaHpiInt32T area_count = 0; struct oa_soap_handler *oa_handler = NULL; SaHpiResourceIdT resource_id; SaHpiRptEntryT *rpt = NULL; char *telco_status = NULL; char *power_type = NULL; char *es = NULL; if (oh_handler == NULL || response == NULL || rdr == NULL || inventory == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; resource_id = oa_handler->oa_soap_resources.enclosure_rid; /* Get the rpt entry of the resource */ rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (rpt == NULL) { err("resource RPT is NULL"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Populating the inventory rdr with default values and resource name */ rdr->Entity = rpt->ResourceEntity; rdr->RecordId = 0; rdr->RdrType = SAHPI_INVENTORY_RDR; rdr->RdrTypeUnion.InventoryRec.IdrId = SAHPI_DEFAULT_INVENTORY_ID; rdr->IdString.DataType = SAHPI_TL_TYPE_TEXT; rdr->IdString.Language = SAHPI_LANG_ENGLISH; oa_soap_trim_whitespace(response->name); rdr->IdString.DataLength = strlen(response->name); snprintf((char *)rdr->IdString.Data, strlen(response->name) + 1, "%s", response->name); /* Create inventory IDR and populate the IDR header */ local_inventory = (struct oa_soap_inventory*) g_malloc0(sizeof(struct oa_soap_inventory)); if (!local_inventory) { err("OA SOAP out of memory"); return SA_ERR_HPI_OUT_OF_MEMORY; } local_inventory->inv_rec.IdrId = rdr->RdrTypeUnion.InventoryRec.IdrId; local_inventory->info.idr_info.IdrId = rdr->RdrTypeUnion.InventoryRec.IdrId; local_inventory->info.idr_info.UpdateCount = 1; local_inventory->info.idr_info.ReadOnly = SAHPI_FALSE; local_inventory->info.idr_info.NumAreas = 0; local_inventory->info.area_list = NULL; local_inventory->comment = (char *)g_malloc0(strlen(enclosure_inv_str) + 1); strcpy(local_inventory->comment, enclosure_inv_str); /* Create and add product area if resource name and/or manufacturer * information exist */ rv = add_product_area(&local_inventory->info.area_list, response->name, response->manufacturer, &add_success_flag); if (rv != SA_OK) { err("Add product area failed"); return rv; } /* add_success_flag will be true if product area is added, * if this is the first successful creation of IDR area, then have * area pointer stored as the head node for area list */ if (add_success_flag != SAHPI_FALSE) { product_area_success_flag = SAHPI_TRUE; (local_inventory->info.idr_info.NumAreas)++; if (area_count == 0) { head_area = local_inventory->info.area_list; } ++area_count; } /* Create and add chassis area if resource part number and/or * serial number exist */ rv = add_chassis_area(&local_inventory->info.area_list, response->partNumber, response->serialNumber, &add_success_flag); if (rv != SA_OK) { err("Add chassis area failed"); return rv; } if (add_success_flag != SAHPI_FALSE) { (local_inventory->info.idr_info.NumAreas)++; if (area_count == 0) { head_area = local_inventory->info.area_list; } ++area_count; } /* Create and add internal area if all/atleast one of required * information of resource for internal is available */ if(oa_handler->enc_type != OA_SOAP_ENC_C3000){ rv = add_internal_area(&local_inventory->info.area_list, response->interposerManufacturer, response->interposerName, response->interposerPartNumber, response->interposerSerialNumber, &add_success_flag); if (rv != SA_OK) { err("Add internal area failed"); return rv; } if (add_success_flag != SAHPI_FALSE) { (local_inventory->info.idr_info.NumAreas)++; if (area_count == 0) { head_area = local_inventory->info.area_list; } ++area_count; } } local_inventory->info.area_list = head_area; *inventory = local_inventory; /* Adding the product version in IDR product area. It is added at * the end of the field list. */ if (product_area_success_flag == SAHPI_TRUE) { /* Add the product version field if the enclosure hardware info * is available */ if (response->hwVersion != NULL) { memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_inventory->info.area_list-> idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_PRODUCT_VERSION; strcpy ((char *)hpi_field.Field.Data, response->hwVersion); rv = idr_field_add(&(local_inventory->info.area_list ->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); return rv; } /* Increment the field counter */ local_inventory->info.area_list->idr_area_head. NumFields++; } switch(response->powerType){ case 0: telco_status = "Telco_Status: UNKNOWN"; power_type = "Power_Type: NO_OP"; break; case 1: telco_status = "Telco_Status: UNKNOWN"; power_type = "Power_Type: UNKNOWN"; break; case 2: telco_status = "Telco_Status: FALSE"; power_type = "Power_Type: INTERNAL_AC"; break; case 3: telco_status = "Telco_Status: FALSE"; power_type = "Power_Type: INTERNAL_DC"; break; case 4: telco_status = "Telco_Status: TRUE"; power_type = "Power_Type: EXTERNAL_DC"; break; default : telco_status = "Telco_Status: UNKNOWN"; power_type = "Power_Type: UNKNOWN"; break; } /* Add the telco status field if the enclosure hardware info * is available */ if (telco_status != NULL) { memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_inventory->info.area_list-> idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_CUSTOM; strcpy ((char *)hpi_field.Field.Data, telco_status); rv = idr_field_add(&(local_inventory->info.area_list ->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); return rv; } /* Increment the field counter */ local_inventory->info.area_list->idr_area_head. NumFields++; } /* Add the power type field if the enclosure hardware info * is available */ if (power_type != NULL) { memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_inventory->info.area_list-> idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_CUSTOM; strcpy ((char *)hpi_field.Field.Data, power_type); rv = idr_field_add(&(local_inventory->info.area_list ->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); return rv; } /* Increment the field counter */ local_inventory->info.area_list->idr_area_head. NumFields++; } switch(response->enclosureStatus){ case 1: es = "ENCLOSURE STATUS: OTHER"; break; case 2: es = "ENCLOSURE STATUS: OK"; break; case 3: es = "ENCLOSURE STATUS: DEGRADED"; break; case 4: es = "ENCLOSURE STATUS: STRESSED"; break; case 5: es = "ENCLOSURE STATUS: PREDICTIVE_FAILURE"; break; case 6: es = "ENCLOSURE STATUS: ERROR"; break; case 7: es = "ENCLOSURE STATUS: NON_RECOVERABLE_ERROR"; break; case 8: es = "ENCLOSURE STATUS: STARTING"; break; case 9: es = "ENCLOSURE STATUS: STOPPING"; break; case 10: es = "ENCLOSURE STATUS: STOPPED"; break; case 11: es = "ENCLOSURE STATUS: IN_SERVICE"; break; case 12: es = "ENCLOSURE STATUS: NO_CONTACT"; break; case 13: es = "ENCLOSURE STATUS: LOST_COMMUNICATION"; break; case 14: es = "ENCLOSURE STATUS: ABORTED"; break; case 15: es = "ENCLOSURE STATUS: DORMANT"; break; case 16: es = "ENCLOSURE STATUS: SUPPORTING_ENTITY_IN_ERROR"; break; case 17: es = "ENCLOSURE STATUS: COMPLETED"; break; case 18: es = "ENCLOSURE STATUS: POWER_MODE"; break; case 19: es = "ENCLOSURE STATUS: DMTF_RESERVED"; break; case 20: es = "ENCLOSURE STATUS: VENDER_RESERVED"; break; default : es = "ENCLOSURE STATUS: UNKNOWN"; break; } /* Add the enclosure status field if the enclosure status info * is available */ if (es != NULL) { memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_inventory->info.area_list-> idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_CUSTOM; strcpy ((char *)hpi_field.Field.Data, es); rv = idr_field_add(&(local_inventory->info.area_list ->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); return rv; } /* Increment the field counter */ local_inventory->info.area_list->idr_area_head. NumFields++; } } return SA_OK; } /** * build_oa_inv_rdr * @oh_handler: Handler data pointer * @response: Handler data pointer * @rdr: Rdr Structure for inventory data * @inventory: Rdr private data structure * * Purpose: * Creates an inventory rdr for Onboard Administator * * Detailed Description: * - Populates the OA inventory rdr with default values * - Inventory data repository is created and associated in the private * data area of the Inventory RDR * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - oa_soap plugin has encountered an internal * error * SA_ERR_HPI_OUT_OF_MEMORY - Request failed due to insufficient memory **/ SaErrorT build_oa_inv_rdr(struct oh_handler_state *oh_handler, struct oaInfo *response, SaHpiRdrT *rdr, struct oa_soap_inventory **inventory) { SaErrorT rv = SA_OK; SaHpiIdrFieldT hpi_field; char oa_inv_str[] = OA_INVENTORY_STRING; struct oa_soap_inventory *local_inventory = NULL; struct oa_soap_area *head_area = NULL; SaHpiInt32T add_success_flag = 0; SaHpiInt32T product_area_success_flag = 0; SaHpiInt32T area_count = 0; struct oa_soap_handler *oa_handler = NULL; SaHpiResourceIdT resource_id; SaHpiRptEntryT *rpt = NULL; if (oh_handler == NULL || response == NULL || rdr == NULL || inventory == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; resource_id = oa_handler-> oa_soap_resources.oa.resource_id[response->bayNumber - 1]; /* Get the rpt entry of the resource */ rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (rpt == NULL) { err("resource RPT is NULL"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Populating the inventory rdr with default values and resource name */ rdr->Entity = rpt->ResourceEntity; rdr->RecordId = 0; rdr->RdrType = SAHPI_INVENTORY_RDR; rdr->RdrTypeUnion.InventoryRec.IdrId = SAHPI_DEFAULT_INVENTORY_ID; rdr->IdString.DataType = SAHPI_TL_TYPE_TEXT; rdr->IdString.Language = SAHPI_LANG_ENGLISH; oa_soap_trim_whitespace(response->name); rdr->IdString.DataLength = strlen(response->name); snprintf((char *)rdr->IdString.Data, strlen(response->name)+ 1,"%s", response->name ); /* Create inventory IDR and populate the IDR header */ local_inventory = (struct oa_soap_inventory*) g_malloc0(sizeof(struct oa_soap_inventory)); if (!local_inventory) { err("OA SOAP out of memory"); return SA_ERR_HPI_OUT_OF_MEMORY; } local_inventory->inv_rec.IdrId = rdr->RdrTypeUnion.InventoryRec.IdrId; local_inventory->info.idr_info.IdrId = rdr->RdrTypeUnion.InventoryRec.IdrId; local_inventory->info.idr_info.UpdateCount = 1; local_inventory->info.idr_info.ReadOnly = SAHPI_FALSE; local_inventory->info.idr_info.NumAreas = 0; local_inventory->info.area_list = NULL; local_inventory->comment = (char *)g_malloc0(strlen(oa_inv_str) + 1); strcpy(local_inventory->comment, oa_inv_str); /* Create and add product area if resource name and/or manufacturer * information exist */ rv = add_product_area(&local_inventory->info.area_list, response->name, response->manufacturer, &add_success_flag); if (rv != SA_OK) { err("Add product area failed"); return rv; } /* add_success_flag will be true if product area is added, * if this is the first successful creation of IDR area, then have * area pointer stored as the head node for area list */ if (add_success_flag != SAHPI_FALSE) { product_area_success_flag = SAHPI_TRUE; (local_inventory->info.idr_info.NumAreas)++; if (area_count == 0) { head_area = local_inventory->info.area_list; } ++area_count; } /* Create and add board area if resource part number and/or * serial number exist */ rv = add_board_area(&local_inventory->info.area_list, response->partNumber, response->serialNumber, &add_success_flag); if (rv != SA_OK) { err("Add board area failed"); return rv; } if (add_success_flag != SAHPI_FALSE) { (local_inventory->info.idr_info.NumAreas)++; if (area_count == 0) { head_area = local_inventory->info.area_list; } ++area_count; } local_inventory->info.area_list = head_area; *inventory = local_inventory; /* Adding the product version in IDR product area. It is added at * the end of the field list. */ if (product_area_success_flag == SAHPI_TRUE) { /* Add the product version field if the firmware info * is available */ if (response->fwVersion != NULL) { memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_inventory->info.area_list-> idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_PRODUCT_VERSION; strcpy ((char *)hpi_field.Field.Data, response->fwVersion); rv = idr_field_add(&(local_inventory->info.area_list ->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); return rv; } /* Increment the field counter */ local_inventory->info.area_list->idr_area_head. NumFields++; } } return SA_OK; } /** * build_server_inv_rdr * @oh_handler: Handler data pointer * @con: Pointer to the SOAP_CON * @bay_number: Bay number of the server * @rdr: Rdr Structure for inventory data * @inventory: Rdr private data structure * * Purpose: * Creates an inventory rdr for server blade * * Detailed Description: * - Populates the server inventory rdr with default values * - Inventory data repository is created and associated in the private * data area of the Inventory RDR * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - oa_soap plugin has encountered an internal * error * SA_ERR_HPI_OUT_OF_MEMORY - Request failed due to insufficient memory **/ SaErrorT build_server_inv_rdr(struct oh_handler_state *oh_handler, SOAP_CON *con, SaHpiInt32T bay_number, SaHpiRdrT *rdr, struct oa_soap_inventory **inventory) { SaErrorT rv = SA_OK; SaHpiIdrFieldT hpi_field; char server_inv_str[] = SERVER_INVENTORY_STRING; struct oa_soap_inventory *local_inventory = NULL; struct oa_soap_area *head_area = NULL; SaHpiInt32T add_success_flag = 0; SaHpiInt32T product_area_success_flag = 0; SaHpiInt32T area_count = 0; struct getBladeInfo request; struct bladeInfo response; struct getBladeMpInfo blade_mp_request; struct bladeMpInfo blade_mp_response; struct oa_soap_handler *oa_handler = NULL; SaHpiResourceIdT resource_id; SaHpiRptEntryT *rpt = NULL; SaHpiFloat64T fm_version; SaHpiInt32T major; struct bladeNicInfo nic_info; struct bladeMezzInfo mezz_info; struct bladePortMap portmap; struct bladeCpuInfo cpu_info; char *tmp = NULL; int cpu_no = 0; if (oh_handler == NULL || con == NULL || rdr == NULL || inventory == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; resource_id = oa_handler->oa_soap_resources.server.resource_id[bay_number - 1]; rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (!rpt) { err("Could not find blade resource rpt"); return(SA_ERR_HPI_INTERNAL_ERROR); } rdr->Entity = rpt->ResourceEntity; request.bayNumber = bay_number; rv = soap_getBladeInfo(con, &request, &response); if (rv != SOAP_OK) { err("Get blade info failed"); return rv; } /* Populating the inventory rdr with rpt values for the resource */ rdr->RecordId = 0; rdr->RdrType = SAHPI_INVENTORY_RDR; rdr->RdrTypeUnion.InventoryRec.IdrId = SAHPI_DEFAULT_INVENTORY_ID; rdr->IdString.DataType = SAHPI_TL_TYPE_TEXT; rdr->IdString.Language = SAHPI_LANG_ENGLISH; oa_soap_trim_whitespace(response.name); rdr->IdString.DataLength = strlen(response.name); snprintf((char *)rdr->IdString.Data, strlen(response.name) + 1,"%s", response.name ); /* Create inventory IDR and populate the IDR header */ local_inventory = (struct oa_soap_inventory*) g_malloc0(sizeof(struct oa_soap_inventory)); if (!local_inventory) { err("OA SOAP out of memory"); return SA_ERR_HPI_OUT_OF_MEMORY; } local_inventory->inv_rec.IdrId = rdr->RdrTypeUnion.InventoryRec.IdrId; local_inventory->info.idr_info.IdrId = rdr->RdrTypeUnion.InventoryRec.IdrId; local_inventory->info.idr_info.UpdateCount = 1; local_inventory->info.idr_info.ReadOnly = SAHPI_FALSE; local_inventory->info.idr_info.NumAreas = 0; local_inventory->info.area_list = NULL; local_inventory->comment = (char *)g_malloc0(strlen(server_inv_str) + 1); strcpy(local_inventory->comment, server_inv_str); /* Create and add product area if resource name and/or manufacturer * information exist */ rv = add_product_area(&local_inventory->info.area_list, response.name, response.manufacturer, &add_success_flag); if (rv != SA_OK) { err("Add product area failed"); return rv; } /* add_success_flag will be true if product area is added, * if this is the first successful creation of IDR area, then have * area pointer stored as the head node for area list */ if (add_success_flag != SAHPI_FALSE) { product_area_success_flag = SAHPI_TRUE; (local_inventory->info.idr_info.NumAreas)++; if (area_count == 0) { head_area = local_inventory->info.area_list; } ++area_count; } /* Create and add board area if resource part number and/or * serial number exist */ rv = add_board_area(&local_inventory->info.area_list, response.partNumber, response.serialNumber, &add_success_flag); if (rv != SA_OK) { err("Add board area failed"); return rv; } if (add_success_flag != SAHPI_FALSE) { (local_inventory->info.idr_info.NumAreas)++; if (area_count == 0) { head_area = local_inventory->info.area_list; } ++area_count; } local_inventory->info.area_list = head_area; *inventory = local_inventory; /* Adding the product version in IDR product area. It is added at * the end of the field list. */ if (product_area_success_flag == SAHPI_TRUE) { /* Making getBladeMpInfo soap call for getting the * product version */ blade_mp_request.bayNumber = bay_number; rv = soap_getBladeMpInfo(con, &blade_mp_request, &blade_mp_response); if (rv != SOAP_OK) { err("Get blade mp info failed"); return rv; } /* Add the product version field if the firmware info * is available */ if (blade_mp_response.fwVersion != NULL) { memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_inventory->info.area_list-> idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_PRODUCT_VERSION; strcpy ((char *)hpi_field.Field.Data, blade_mp_response.fwVersion); rv = idr_field_add(&(local_inventory->info.area_list ->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); return rv; } /* Increment the field counter */ local_inventory->info.area_list->idr_area_head. NumFields++; /* Store Firmware MajorRev & MinorRev data in rpt */ fm_version = atof(blade_mp_response.fwVersion); rpt->ResourceInfo.FirmwareMajorRev = major = (SaHpiUint8T)floor(fm_version); rpt->ResourceInfo.FirmwareMinorRev = rintf((fm_version - major) * 100); } /** MP Info **/ if (blade_mp_response.modelName != NULL) { memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_inventory->info.area_list-> idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_CUSTOM; rv = asprintf(&tmp, "MP Model name = %s", blade_mp_response.modelName); if(rv == -1){ free(tmp); err("Failed to allocate memory for buffer to \ hold MP Model name"); return SA_ERR_HPI_OUT_OF_MEMORY; } if(strlen(tmp) < SAHPI_MAX_TEXT_BUFFER_LENGTH){ strcpy ((char *)hpi_field.Field.Data, tmp); rv = idr_field_add(&(local_inventory ->info.area_list ->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); free(tmp); return rv; } /* Increment the field counter */ local_inventory->info.area_list->idr_area_head. NumFields++; }else { err("Source String length is greater than \ SAHPI_MAX_TEXT_BUFFER_LENGTH"); } free(tmp); tmp = NULL; } if (blade_mp_response.ipAddress != NULL) { memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_inventory->info.area_list-> idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_CUSTOM; rv = asprintf(&tmp, "MP IP Address = %s", blade_mp_response.ipAddress); if(rv == -1){ free(tmp); err("Failed to allocate memory for buffer to \ hold MP IP Address"); return SA_ERR_HPI_OUT_OF_MEMORY; } if(strlen(tmp) < SAHPI_MAX_TEXT_BUFFER_LENGTH){ strcpy ((char *)hpi_field.Field.Data, tmp); rv = idr_field_add(&(local_inventory ->info.area_list ->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); free(tmp); return rv; } /* Increment the field counter */ local_inventory->info.area_list->idr_area_head. NumFields++; }else { err("Source String length is greater than \ SAHPI_MAX_TEXT_BUFFER_LENGTH"); } free(tmp); tmp = NULL; } if (blade_mp_response.macAddress != NULL) { memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_inventory->info.area_list-> idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_CUSTOM; rv = asprintf(&tmp, "MP MAC Address = %s", blade_mp_response.macAddress); if(rv == -1){ free(tmp); err("Failed to allocate memory for buffer to \ hold MP MAC Address"); return SA_ERR_HPI_OUT_OF_MEMORY; } if(strlen(tmp) < SAHPI_MAX_TEXT_BUFFER_LENGTH){ strcpy ((char *)hpi_field.Field.Data, tmp); rv = idr_field_add(&(local_inventory ->info.area_list ->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); free(tmp); return rv; } /* Increment the field counter */ local_inventory->info.area_list->idr_area_head. NumFields++; }else { err("Source String length is greater than \ SAHPI_MAX_TEXT_BUFFER_LENGTH"); } free(tmp); tmp = NULL; } if (blade_mp_response.dnsName != NULL) { memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_inventory->info.area_list-> idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_CUSTOM; rv = asprintf(&tmp, "MP DNS name = %s", blade_mp_response.dnsName); if(rv == -1){ free(tmp); err("Failed to allocate memory for buffer to \ hold MP DNS name"); return SA_ERR_HPI_OUT_OF_MEMORY; } if(strlen(tmp) < SAHPI_MAX_TEXT_BUFFER_LENGTH){ strcpy ((char *)hpi_field.Field.Data, tmp); rv = idr_field_add(&(local_inventory ->info.area_list ->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); free(tmp); return rv; } /* Increment the field counter */ local_inventory->info.area_list->idr_area_head. NumFields++; }else { err("Source String length is greater than \ SAHPI_MAX_TEXT_BUFFER_LENGTH"); } free(tmp); tmp = NULL; } /* Get the Blade NIC information*/ rv = soap_getBladeInfo(con, &request, &response); if (rv != SOAP_OK) { err("Get blade info failed"); return rv; } /* Adding Custom Field for Number of NICs Installed*/ memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_inventory->info.area_list-> idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_CUSTOM; rv = asprintf(&tmp, "NICs Installed = %d", response.numberOfNics); if(rv == -1){ free(tmp); err("Failed to allocate memory for buffer to \ hold NICs Installed"); return SA_ERR_HPI_OUT_OF_MEMORY; } if(strlen(tmp) < SAHPI_MAX_TEXT_BUFFER_LENGTH){ strcpy ((char *)hpi_field.Field.Data, tmp); rv = idr_field_add(&(local_inventory ->info.area_list ->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); free(tmp); return rv; } /* Increment the field counter */ local_inventory->info.area_list->idr_area_head. NumFields++; }else { err("Source String length is greater than \ SAHPI_MAX_TEXT_BUFFER_LENGTH"); } free(tmp); tmp = NULL; while (response.nics){ soap_getBladeNicInfo(response.nics, &nic_info); /* Add the custom field if the Nic info * is available */ if (nic_info.port != NULL && nic_info.macAddress != NULL) { memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_inventory->info.area_list-> idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_CUSTOM; rv = asprintf(&tmp, "%s = %s", nic_info.port, nic_info.macAddress); if(rv == -1){ free(tmp); err("Failed to allocate memory for buffer to \ hold MAC Address and NIC Port"); return SA_ERR_HPI_OUT_OF_MEMORY; } if(strlen(tmp) < SAHPI_MAX_TEXT_BUFFER_LENGTH){ strcpy ((char *)hpi_field.Field.Data, tmp); rv = idr_field_add(&(local_inventory ->info.area_list ->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); free(tmp); return rv; } /* Increment the field counter */ local_inventory->info.area_list->idr_area_head. NumFields++; }else { err("Source String length is greater than \ SAHPI_MAX_TEXT_BUFFER_LENGTH"); } free(tmp); tmp = NULL; } response.nics = soap_next_node(response.nics); } /* Adding the custom field for the Number of CPUs installed */ if(response.numberOfCpus){ memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_inventory->info.area_list-> idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_CUSTOM; rv = asprintf(&tmp, "No. of CPUs = %d", response.numberOfCpus); if(rv == -1){ err("Failed to allocate memory for buffer to \ hold No. of CPUs"); free(tmp); return SA_ERR_HPI_OUT_OF_MEMORY; } if(strlen(tmp) < SAHPI_MAX_TEXT_BUFFER_LENGTH){ strcpy ((char *)hpi_field.Field.Data, tmp); rv = idr_field_add(&(local_inventory ->info.area_list ->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); free(tmp); return rv; } /* Increment the field counter */ local_inventory->info.area_list->idr_area_head. NumFields++; }else { err("Source String length is greater than \ SAHPI_MAX_TEXT_BUFFER_LENGTH"); } free(tmp); tmp = NULL; } while (response.cpus){ soap_getBladeCpuInfo(response.cpus, &cpu_info); if (cpu_info.cpuType != NULL && cpu_info.cpuSpeed != 0) { rv = asprintf(&tmp, "CPU %d = %s, %d MHz", ++cpu_no,cpu_info.cpuType,cpu_info.cpuSpeed); if(rv == -1){ free(tmp); err("Failed to allocate memory for buffer to \ hold CPU name and speed"); return SA_ERR_HPI_OUT_OF_MEMORY; } } else { rv = asprintf(&tmp, "CPU %d = Not present",++cpu_no); if(rv == -1){ free(tmp); err("Failed to allocate memory for buffer to \ hold Not present CPU Number"); return SA_ERR_HPI_OUT_OF_MEMORY; } } memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_inventory->info.area_list-> idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_CUSTOM; if(strlen(tmp) < SAHPI_MAX_TEXT_BUFFER_LENGTH){ strcpy ((char *)hpi_field.Field.Data, tmp); rv = idr_field_add(&(local_inventory ->info.area_list ->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); free(tmp); return rv; } /* Increment the field counter */ local_inventory->info.area_list->idr_area_head. NumFields++; }else { err("Source String length is greater than \ SAHPI_MAX_TEXT_BUFFER_LENGTH"); } free(tmp); tmp = NULL; response.cpus = soap_next_node(response.cpus); } /* Code For Memory Starts Here */ if (response.memory != 0) { memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_inventory->info.area_list-> idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_CUSTOM; rv = asprintf(&tmp, "Memory(RAM) = %d MB", response.memory); if(rv == -1){ free(tmp); err("Failed to allocate memory for buffer to \ hold Memory(RAM) size"); return SA_ERR_HPI_OUT_OF_MEMORY; } if(strlen(tmp) < SAHPI_MAX_TEXT_BUFFER_LENGTH){ strcpy ((char *)hpi_field.Field.Data, tmp); rv = idr_field_add(&(local_inventory ->info.area_list ->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); free(tmp); return rv; } /* Increment the field counter */ local_inventory->info.area_list->idr_area_head. NumFields++; }else { err("Source String length is greater than \ SAHPI_MAX_TEXT_BUFFER_LENGTH"); } free(tmp); tmp = NULL; } rv = soap_getBladePortMap(con, &request, &portmap); if (rv != SA_OK) { err("soap_getBladePortMap call failed"); return rv; } while(portmap.mezz){ soap_getBladeMezzInfo(portmap.mezz, &mezz_info); if(mezz_info.mezzNumber != NULL){ memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_inventory->info.area_list-> idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_CUSTOM; rv = asprintf(&tmp, "Mezz No. = %s", mezz_info.mezzNumber); if(rv == -1){ free(tmp); err("Failed to allocate memory for \ buffer to hold \ Mezz No."); return SA_ERR_HPI_OUT_OF_MEMORY; } if(strlen(tmp) < SAHPI_MAX_TEXT_BUFFER_LENGTH){ strcpy ((char *)hpi_field.Field.Data, tmp); rv = idr_field_add( &(local_inventory ->info.area_list ->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); free(tmp); return rv; } /* Increment the field counter */ local_inventory->info.area_list ->idr_area_head. NumFields++; }else { err("Source String length \ is greater than \ SAHPI_MAX_TEXT_ \ BUFFER_LENGTH"); } free(tmp); tmp = NULL; } /*** Add Mezz Slot Innventory fileds ***/ if(mezz_info.mezzSlots != NULL){ rv = add_mezz_slot_idr_fields( mezz_info.mezzSlots, local_inventory); if(rv != SA_OK){ err("Add mezz_slot_idr_fields failed"); return rv; } } /*** Add Mezz Device Inventory fields ***/ if(mezz_info.mezzDevices !=NULL){ rv = add_mezz_device_idr_fields( mezz_info.mezzDevices, local_inventory); if(rv != SA_OK){ err("Add mezz_devices_idr_fields \ failed"); return rv; } } portmap.mezz = soap_next_node(portmap.mezz); } } return SA_OK; } /** * build_server_inv_rdr_arr * @oh_handler: Handler data pointer * @con: Pointer to the SOAP_CON * @bay_number: Bay number of the server * @rdr: Rdr Structure for inventory data * @inventory: Rdr private data structure * @response: Pointer to bladeInfo response structure * @portmap: Pointer to bladePortMap response structure * * Purpose: * Creates an inventory rdr for server blade * * Detailed Description: * - Populates the server inventory rdr with default values * - Inventory data repository is created and associated in the private * data area of the Inventory RDR * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - oa_soap plugin has encountered an internal * error * SA_ERR_HPI_OUT_OF_MEMORY - Request failed due to insufficient memory **/ SaErrorT build_server_inv_rdr_arr(struct oh_handler_state *oh_handler, SOAP_CON *con, SaHpiInt32T bay_number, SaHpiRdrT *rdr, struct oa_soap_inventory **inventory, struct bladeInfo *response, struct bladePortMap *portmap) { SaErrorT rv = SA_OK; SaHpiIdrFieldT hpi_field; char server_inv_str[] = SERVER_INVENTORY_STRING; struct oa_soap_inventory *local_inventory = NULL; struct oa_soap_area *head_area = NULL; SaHpiInt32T add_success_flag = 0; SaHpiInt32T product_area_success_flag = 0; SaHpiInt32T area_count = 0; struct getBladeMpInfo blade_mp_request; struct bladeMpInfo blade_mp_response; struct oa_soap_handler *oa_handler = NULL; SaHpiResourceIdT resource_id; SaHpiRptEntryT *rpt = NULL; SaHpiFloat64T fm_version; SaHpiInt32T major; struct bladeNicInfo nic_info; struct bladeMezzInfo mezz_info; struct bladeCpuInfo cpu_info; char *tmp = NULL; int cpu_no = 0; if (oh_handler == NULL || con == NULL || rdr == NULL || inventory == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; resource_id = oa_handler->oa_soap_resources.server.resource_id[bay_number - 1]; rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (!rpt) { err("Could not find blade resource rpt"); return(SA_ERR_HPI_INTERNAL_ERROR); } rdr->Entity = rpt->ResourceEntity; /* Populating the inventory rdr with rpt values for the resource */ rdr->RecordId = 0; rdr->RdrType = SAHPI_INVENTORY_RDR; rdr->RdrTypeUnion.InventoryRec.IdrId = SAHPI_DEFAULT_INVENTORY_ID; rdr->IdString.DataType = SAHPI_TL_TYPE_TEXT; rdr->IdString.Language = SAHPI_LANG_ENGLISH; oa_soap_trim_whitespace(response->name); rdr->IdString.DataLength = strlen(response->name); snprintf((char *)rdr->IdString.Data, strlen(response->name) + 1,"%s", response->name ); /* Create inventory IDR and populate the IDR header */ local_inventory = (struct oa_soap_inventory*) g_malloc0(sizeof(struct oa_soap_inventory)); if (!local_inventory) { err("OA SOAP out of memory"); return SA_ERR_HPI_OUT_OF_MEMORY; } local_inventory->inv_rec.IdrId = rdr->RdrTypeUnion.InventoryRec.IdrId; local_inventory->info.idr_info.IdrId = rdr->RdrTypeUnion.InventoryRec.IdrId; local_inventory->info.idr_info.UpdateCount = 1; local_inventory->info.idr_info.ReadOnly = SAHPI_FALSE; local_inventory->info.idr_info.NumAreas = 0; local_inventory->info.area_list = NULL; local_inventory->comment = (char *)g_malloc0(strlen(server_inv_str) + 1); strcpy(local_inventory->comment, server_inv_str); /* Create and add product area if resource name and/or manufacturer * information exist */ rv = add_product_area(&local_inventory->info.area_list, response->name, response->manufacturer, &add_success_flag); if (rv != SA_OK) { err("Add product area failed"); return rv; } /* add_success_flag will be true if product area is added, * if this is the first successful creation of IDR area, then have * area pointer stored as the head node for area list */ if (add_success_flag != SAHPI_FALSE) { product_area_success_flag = SAHPI_TRUE; (local_inventory->info.idr_info.NumAreas)++; if (area_count == 0) { head_area = local_inventory->info.area_list; } ++area_count; } /* Create and add board area if resource part number and/or * serial number exist */ rv = add_board_area(&local_inventory->info.area_list, response->partNumber, response->serialNumber, &add_success_flag); if (rv != SA_OK) { err("Add board area failed"); return rv; } if (add_success_flag != SAHPI_FALSE) { (local_inventory->info.idr_info.NumAreas)++; if (area_count == 0) { head_area = local_inventory->info.area_list; } ++area_count; } local_inventory->info.area_list = head_area; *inventory = local_inventory; /* Adding the product version in IDR product area. It is added at * the end of the field list. */ if (product_area_success_flag == SAHPI_TRUE) { /* Making getBladeMpInfo soap call for getting the * product version */ blade_mp_request.bayNumber = bay_number; rv = soap_getBladeMpInfo(con, &blade_mp_request, &blade_mp_response); if (rv != SOAP_OK) { err("Get blade mp info failed"); return rv; } /* Add the product version field if the firmware info * is available */ if (blade_mp_response.fwVersion != NULL) { memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_inventory->info.area_list-> idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_PRODUCT_VERSION; strcpy ((char *)hpi_field.Field.Data, blade_mp_response.fwVersion); rv = idr_field_add(&(local_inventory->info.area_list ->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); return rv; } /* Increment the field counter */ local_inventory->info.area_list->idr_area_head. NumFields++; /* Store Firmware MajorRev & MinorRev data in rpt */ fm_version = atof(blade_mp_response.fwVersion); rpt->ResourceInfo.FirmwareMajorRev = major = (SaHpiUint8T)floor(fm_version); rpt->ResourceInfo.FirmwareMinorRev = rintf((fm_version - major) * 100); } /** MP Info **/ if (blade_mp_response.modelName != NULL) { memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_inventory->info.area_list-> idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_CUSTOM; rv = asprintf(&tmp, "MP Model name = %s", blade_mp_response.modelName); if(rv == -1){ free(tmp); err("Failed to allocate memory for buffer to \ hold MP Model name"); return SA_ERR_HPI_OUT_OF_MEMORY; } if(strlen(tmp) < SAHPI_MAX_TEXT_BUFFER_LENGTH){ strcpy ((char *)hpi_field.Field.Data, tmp); rv = idr_field_add(&(local_inventory ->info.area_list ->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); free(tmp); return rv; } /* Increment the field counter */ local_inventory->info.area_list->idr_area_head. NumFields++; }else { err("Source String length is greater than \ SAHPI_MAX_TEXT_BUFFER_LENGTH"); } free(tmp); tmp = NULL; } if (blade_mp_response.ipAddress != NULL) { memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_inventory->info.area_list-> idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_CUSTOM; rv = asprintf(&tmp, "MP IP Address = %s", blade_mp_response.ipAddress); if(rv == -1){ free(tmp); err("Failed to allocate memory for buffer to \ hold MP IP Address"); return SA_ERR_HPI_OUT_OF_MEMORY; } if(strlen(tmp) < SAHPI_MAX_TEXT_BUFFER_LENGTH){ strcpy ((char *)hpi_field.Field.Data, tmp); rv = idr_field_add(&(local_inventory ->info.area_list ->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); free(tmp); return rv; } /* Increment the field counter */ local_inventory->info.area_list->idr_area_head. NumFields++; }else { err("Source String length is greater than \ SAHPI_MAX_TEXT_BUFFER_LENGTH"); } free(tmp); tmp = NULL; } if (blade_mp_response.macAddress != NULL) { memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_inventory->info.area_list-> idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_CUSTOM; rv = asprintf(&tmp, "MP MAC Address = %s", blade_mp_response.macAddress); if(rv == -1){ free(tmp); err("Failed to allocate memory for buffer to \ hold MP MAC Address"); return SA_ERR_HPI_OUT_OF_MEMORY; } if(strlen(tmp) < SAHPI_MAX_TEXT_BUFFER_LENGTH){ strcpy ((char *)hpi_field.Field.Data, tmp); rv = idr_field_add(&(local_inventory ->info.area_list ->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); free(tmp); return rv; } /* Increment the field counter */ local_inventory->info.area_list->idr_area_head. NumFields++; }else { err("Source String length is greater than \ SAHPI_MAX_TEXT_BUFFER_LENGTH"); } free(tmp); tmp = NULL; } if (blade_mp_response.dnsName != NULL) { memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_inventory->info.area_list-> idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_CUSTOM; rv = asprintf(&tmp, "MP DNS name = %s", blade_mp_response.dnsName); if(rv == -1){ free(tmp); err("Failed to allocate memory for buffer to \ hold MP DNS name"); return SA_ERR_HPI_OUT_OF_MEMORY; } if(strlen(tmp) < SAHPI_MAX_TEXT_BUFFER_LENGTH){ strcpy ((char *)hpi_field.Field.Data, tmp); rv = idr_field_add(&(local_inventory ->info.area_list ->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); free(tmp); return rv; } /* Increment the field counter */ local_inventory->info.area_list->idr_area_head. NumFields++; }else { err("Source String length is greater than \ SAHPI_MAX_TEXT_BUFFER_LENGTH"); } free(tmp); tmp = NULL; } /* Adding Custom Field for Number of NICs Installed*/ memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_inventory->info.area_list-> idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_CUSTOM; rv = asprintf(&tmp, "NICs Installed = %d", response->numberOfNics); if(rv == -1){ free(tmp); err("Failed to allocate memory for buffer to \ hold NICs Installed"); return SA_ERR_HPI_OUT_OF_MEMORY; } if(strlen(tmp) < SAHPI_MAX_TEXT_BUFFER_LENGTH){ strcpy ((char *)hpi_field.Field.Data, tmp); rv = idr_field_add(&(local_inventory ->info.area_list ->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); free(tmp); return rv; } /* Increment the field counter */ local_inventory->info.area_list->idr_area_head. NumFields++; }else { err("Source String length is greater than \ SAHPI_MAX_TEXT_BUFFER_LENGTH"); } free(tmp); tmp = NULL; while (response->nics){ soap_getBladeNicInfo(response->nics, &nic_info); /* Add the custom field if the Nic info * is available */ if (nic_info.port != NULL && nic_info.macAddress != NULL) { memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_inventory->info.area_list-> idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_CUSTOM; rv = asprintf(&tmp, "%s = %s", nic_info.port, nic_info.macAddress); if(rv == -1){ free(tmp); err("Failed to allocate memory for buffer to \ hold MAC Address and NIC Port"); return SA_ERR_HPI_OUT_OF_MEMORY; } if(strlen(tmp) < SAHPI_MAX_TEXT_BUFFER_LENGTH){ strcpy ((char *)hpi_field.Field.Data, tmp); rv = idr_field_add(&(local_inventory ->info.area_list ->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); free(tmp); return rv; } /* Increment the field counter */ local_inventory->info.area_list->idr_area_head. NumFields++; }else { err("Source String length is greater than \ SAHPI_MAX_TEXT_BUFFER_LENGTH"); } free(tmp); tmp = NULL; } response->nics = soap_next_node(response->nics); } /* Adding the custom field for the Number of CPUs installed */ if(response->numberOfCpus){ memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_inventory->info.area_list-> idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_CUSTOM; rv = asprintf(&tmp, "No. of CPUs = %d", response->numberOfCpus); if(rv == -1){ err("Failed to allocate memory for buffer to \ hold No. of CPUs"); free(tmp); return SA_ERR_HPI_OUT_OF_MEMORY; } if(strlen(tmp) < SAHPI_MAX_TEXT_BUFFER_LENGTH){ strcpy ((char *)hpi_field.Field.Data, tmp); rv = idr_field_add(&(local_inventory ->info.area_list ->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); free(tmp); return rv; } /* Increment the field counter */ local_inventory->info.area_list->idr_area_head. NumFields++; }else { err("Source String length is greater than \ SAHPI_MAX_TEXT_BUFFER_LENGTH"); } free(tmp); tmp = NULL; } while (response->cpus){ soap_getBladeCpuInfo(response->cpus, &cpu_info); if (cpu_info.cpuType != NULL && cpu_info.cpuSpeed != 0) { rv = asprintf(&tmp, "CPU %d = %s, %d MHz", ++cpu_no,cpu_info.cpuType,cpu_info.cpuSpeed); if(rv == -1){ free(tmp); err("Failed to allocate memory for buffer to \ hold CPU name and speed"); return SA_ERR_HPI_OUT_OF_MEMORY; } } else { rv = asprintf(&tmp, "CPU %d = Not present",++cpu_no); if(rv == -1){ free(tmp); err("Failed to allocate memory for buffer to \ hold Not present CPU Number"); return SA_ERR_HPI_OUT_OF_MEMORY; } } memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_inventory->info.area_list-> idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_CUSTOM; if(strlen(tmp) < SAHPI_MAX_TEXT_BUFFER_LENGTH){ strcpy ((char *)hpi_field.Field.Data, tmp); rv = idr_field_add(&(local_inventory ->info.area_list ->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); free(tmp); return rv; } /* Increment the field counter */ local_inventory->info.area_list->idr_area_head. NumFields++; }else { err("Source String length is greater than \ SAHPI_MAX_TEXT_BUFFER_LENGTH"); } free(tmp); tmp = NULL; response->cpus = soap_next_node(response->cpus); } /* Code For Memory Starts Here */ if (response->memory != 0) { memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_inventory->info.area_list-> idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_CUSTOM; rv = asprintf(&tmp, "Memory(RAM) = %d MB", response->memory); if(rv == -1){ free(tmp); err("Failed to allocate memory for buffer to \ hold Memory(RAM) size"); return SA_ERR_HPI_OUT_OF_MEMORY; } if(strlen(tmp) < SAHPI_MAX_TEXT_BUFFER_LENGTH){ strcpy ((char *)hpi_field.Field.Data, tmp); rv = idr_field_add(&(local_inventory ->info.area_list ->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); free(tmp); return rv; } /* Increment the field counter */ local_inventory->info.area_list->idr_area_head. NumFields++; }else { err("Source String length is greater than \ SAHPI_MAX_TEXT_BUFFER_LENGTH"); } free(tmp); tmp = NULL; } while(portmap->mezz){ soap_getBladeMezzInfo(portmap->mezz, &mezz_info); if(mezz_info.mezzNumber != NULL){ memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_inventory->info.area_list-> idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_CUSTOM; rv = asprintf(&tmp, "Mezz No. = %s", mezz_info.mezzNumber); if(rv == -1){ free(tmp); err("Failed to allocate memory for \ buffer to hold \ Mezz No."); return SA_ERR_HPI_OUT_OF_MEMORY; } if(strlen(tmp) < SAHPI_MAX_TEXT_BUFFER_LENGTH){ strcpy ((char *)hpi_field.Field.Data, tmp); rv = idr_field_add( &(local_inventory ->info.area_list ->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); free(tmp); return rv; } /* Increment the field counter */ local_inventory->info.area_list ->idr_area_head. NumFields++; }else { err("Source String length \ is greater than \ SAHPI_MAX_TEXT_ \ BUFFER_LENGTH"); } free(tmp); tmp = NULL; } /*** Add Mezz Slot Innventory fileds ***/ if(mezz_info.mezzSlots != NULL){ rv = add_mezz_slot_idr_fields( mezz_info.mezzSlots, local_inventory); if(rv != SA_OK){ err("Add mezz_slot_idr_fields failed"); return rv; } } /*** Add Mezz Device Inventory fields ***/ if(mezz_info.mezzDevices !=NULL){ rv = add_mezz_device_idr_fields( mezz_info.mezzDevices, local_inventory); if(rv != SA_OK){ err("Add mezz_devices_idr_fields \ failed"); return rv; } } portmap->mezz = soap_next_node(portmap->mezz); } } return SA_OK; } /** * add_mezz_slot_idr_fields * @mezzSlots: pointer to mezz slot xmlnode * @local_inventory: Rdr private data structure * * Purpose: * This function is for adding mezzslot idr fields of server blade. * * Detailed Description: * - Populates the server mezzslot inventory rdr with default values * - Inventory data repository is created and associated in the private * data area of the Inventory RDR * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - oa_soap plugin has encountered an internal * error * SA_ERR_HPI_OUT_OF_MEMORY - Request failed due to insufficient memory **/ SaErrorT add_mezz_slot_idr_fields(xmlNode *mezzSlots, struct oa_soap_inventory *local_inventory) { SaErrorT rv = SA_OK; SaHpiIdrFieldT hpi_field; struct bladeMezzSlotInfo mezzSlot_Info; struct bladeMezzSlotPort mezzSlots_slot; char* tmp = NULL; if(mezzSlots == NULL || local_inventory == NULL){ err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } soap_getBladeMezzSlotInfo(mezzSlots, &mezzSlot_Info); switch(mezzSlot_Info.type){ case 0: tmp = "MEZZ_SLOT_TYPE_MT"; break; case 1: tmp = "MEZZ_SLOT_TYPE_ONE"; break; case 2: tmp = "MEZZ_SLOT_TYPE_TWO"; break; case 3: tmp = "MEZZ_SLOT_TYPE_FIXED"; break; default: tmp = "MEZZ_SLOT_TYPE_UNKNOWN"; break; } memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_inventory->info.area_list-> idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_CUSTOM; if(strlen(tmp) < SAHPI_MAX_TEXT_BUFFER_LENGTH){ strcpy ((char *)hpi_field.Field.Data, tmp); rv = idr_field_add(&(local_inventory ->info.area_list ->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); return rv; } /* Increment the field counter */ local_inventory->info.area_list->idr_area_head. NumFields++; }else { err("Source String length is greater than \ SAHPI_MAX_TEXT_BUFFER_LENGTH"); } while(mezzSlot_Info.slot){ soap_getBladeMezzSlotPort( mezzSlot_Info.slot, &mezzSlots_slot); if(mezzSlots_slot.slotNumber != NULL){ memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_inventory-> info.area_list-> idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_CUSTOM; rv = asprintf(&tmp, "Mezz Slot No. = %s", mezzSlots_slot.slotNumber); if(rv == -1){ err("Failed to allocate memory for \ buffer to hold Mezz Slot No."); free(tmp); return SA_ERR_HPI_OUT_OF_MEMORY; } if(strlen(tmp) < SAHPI_MAX_TEXT_BUFFER_LENGTH){ strcpy ((char *)hpi_field.Field.Data, tmp); rv = idr_field_add(&(local_inventory-> info.area_list ->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); free(tmp); return rv; } /* Increment the field counter */ local_inventory->info.area_list->idr_area_head. NumFields++; }else { err("Source Strig length is greater than \ SAHPI_MAX_TEXT_BUFFER_LENGTH"); } free(tmp); tmp = NULL; } if(mezzSlots_slot.interconnectTrayBayNumber != NULL){ memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_inventory->info.area_list-> idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_CUSTOM; rv = asprintf(&tmp, "InterconnectTrayBay No. = %s", mezzSlots_slot. interconnectTrayBayNumber); if(rv == -1){ err("Failed to allocate memory for buffer to \ hold InterconnectTrayBay No."); free(tmp); return SA_ERR_HPI_OUT_OF_MEMORY; } if(strlen(tmp) < SAHPI_MAX_TEXT_BUFFER_LENGTH){ strcpy ((char *)hpi_field.Field.Data, tmp); rv = idr_field_add(&(local_inventory-> info.area_list ->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); free(tmp); return rv; } /* Increment the field counter */ local_inventory->info.area_list->idr_area_head. NumFields++; }else { err("Source String length is greater than \ SAHPI_MAX_TEXT_BUFFER_LENGTH"); } free(tmp); tmp = NULL; } if(mezzSlots_slot.interconnectTrayPortNumber != NULL){ memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_inventory->info.area_list-> idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_CUSTOM; rv = asprintf(&tmp, "InterconnectTrayPort No. = %s", mezzSlots_slot. interconnectTrayPortNumber); if(rv == -1){ err("Failed to allocate memory for buffer to \ hold InterconnectTrayPort No."); free(tmp); return SA_ERR_HPI_OUT_OF_MEMORY; } if(strlen(tmp) < SAHPI_MAX_TEXT_BUFFER_LENGTH){ strcpy ((char *)hpi_field.Field.Data, tmp); rv = idr_field_add(&(local_inventory-> info.area_list ->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); free(tmp); return rv; } /* Increment the field counter */ local_inventory->info.area_list->idr_area_head. NumFields++; }else { err("Source String length is greater than \ SAHPI_MAX_TEXT_BUFFER_LENGTH"); } free(tmp); tmp = NULL; } mezzSlot_Info.slot = soap_next_node(mezzSlot_Info.slot); } return SA_OK; } /** This function is to add Mezz device inventory fields * @mezzDevices: Pointet to mezz devie xmlnode * @local_inventory: Rdr private data structure * * Purpose: * This function is for adding mezzdevices idr fields of server blade. * * Detailed Description: * - Populates the server mezzdevices inventory rdr with default values * - Inventory data repository is created and associated in the private * data area of the Inventory RDR * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - oa_soap plugin has encountered an internal * error * SA_ERR_HPI_OUT_OF_MEMORY - Request failed due to insufficient memory **/ SaErrorT add_mezz_device_idr_fields(xmlNode *mezzDevices, struct oa_soap_inventory *local_inventory) { SaErrorT rv = SA_OK; SaHpiIdrFieldT hpi_field; struct bladeMezzDevInfo mezzDev_Info; struct bladeMezzDevPort mezzDev_Port; char *tmp = NULL; if(mezzDevices ==NULL || local_inventory == NULL){ err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } soap_getBladeMezzDevInfo(mezzDevices, &mezzDev_Info); if(mezzDev_Info.name != NULL){ memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_inventory->info.area_list-> idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_CUSTOM; if(strlen(mezzDev_Info.name) < SAHPI_MAX_TEXT_BUFFER_LENGTH){ strcpy ((char *)hpi_field.Field.Data, mezzDev_Info.name); rv = idr_field_add(&(local_inventory->info.area_list ->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); return rv; } /* Increment the field counter */ local_inventory->info.area_list->idr_area_head. NumFields++; }else { err("Source String length is greater than \ SAHPI_MAX_TEXT_BUFFER_LENGTH"); } } switch(mezzDev_Info.type){ case 0: tmp = "MEZZ_DEV_TYPE_MT"; break; case 1: tmp = "MEZZ_DEV_TYPE_ONE"; break; case 2: tmp = "MEZZ_DEV_TYPE_TWO"; break; case 3: tmp = "MEZZ_DEV_TYPE_FIXED"; break; default: tmp = "MEZZ_DEV_TYPE_UNKNOWN"; break; } memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_inventory->info.area_list-> idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_CUSTOM; if(strlen(tmp) < SAHPI_MAX_TEXT_BUFFER_LENGTH){ strcpy ((char *)hpi_field.Field.Data, tmp); rv = idr_field_add(&(local_inventory->info.area_list ->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); return rv; } /* Increment the field counter */ local_inventory->info.area_list->idr_area_head. NumFields++; }else { err("Source String length is greater than \ SAHPI_MAX_TEXT_BUFFER_LENGTH"); } switch(mezzDev_Info.status){ case 1: tmp = "MEZZ_DEV_STATUS_OK"; break; case 2: tmp = "MEZZ_DEV_STATUS_MISMATCH"; break; default: tmp = "MEZZ_DEV_STATUS_UNKNOWN"; break; } memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_inventory->info.area_list-> idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_CUSTOM; if(strlen(tmp) < SAHPI_MAX_TEXT_BUFFER_LENGTH){ strcpy ((char *)hpi_field.Field.Data, tmp); rv = idr_field_add(&(local_inventory->info.area_list ->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); return rv; } /* Increment the field counter */ local_inventory->info.area_list->idr_area_head. NumFields++; } else { err("Source String length is greater than \ SAHPI_MAX_TEXT_BUFFER_LENGTH"); } while(mezzDev_Info.port){ soap_getBladeMezzDevPort(mezzDev_Info.port, &mezzDev_Port); if(mezzDev_Port.portNumber != NULL){ memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_inventory->info.area_list-> idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_CUSTOM; rv = asprintf(&tmp, "MezzDevPort No. = %s", mezzDev_Port.portNumber); if(rv == -1){ err("Failed to allocate memory for buffer to \ hold MezzDevPort No."); free(tmp); return SA_ERR_HPI_OUT_OF_MEMORY; } if(strlen(tmp) < SAHPI_MAX_TEXT_BUFFER_LENGTH){ strcpy ((char *)hpi_field.Field.Data, tmp); rv = idr_field_add(&(local_inventory-> info.area_list ->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); free(tmp); return rv; } /* Increment the field counter */ local_inventory->info.area_list->idr_area_head. NumFields++; }else { err("Source String length is greater than \ SAHPI_MAX_TEXT_BUFFER_LENGTH"); } free(tmp); tmp = NULL; if(mezzDev_Port.wwpn != NULL){ memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_inventory->info.area_list-> idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_CUSTOM; rv = asprintf(&tmp, "MezzDevPort wwpn = %s", mezzDev_Port.wwpn); if(rv == -1){ err("Failed to allocate memory for \ buffer to hold \ MezzDevPort wwpn"); free(tmp); return SA_ERR_HPI_OUT_OF_MEMORY; } if(strlen(tmp) < SAHPI_MAX_TEXT_BUFFER_LENGTH){ strcpy ((char *)hpi_field.Field.Data, tmp); rv = idr_field_add(&(local_inventory-> info.area_list ->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); free(tmp); return rv; } /* Increment the field counter */ local_inventory->info.area_list ->idr_area_head. NumFields++; }else { err("Source String length \ is greater than \ SAHPI_MAX_TEXT_ \ BUFFER_LENGTH"); } free(tmp); tmp = NULL; } switch(mezzDev_Port.fabric){ case 0: tmp = "FABRIC_TYPE_MT"; break; case 1: tmp = "FABRIC_TYPE_ETH"; break; case 2: tmp = "FABRIC_TYPE_FIB"; break; case 3: tmp = "FABRIC_TYPE_10GETH"; break; case 4: tmp = "FABRIC_TYPE_IFB"; break; case 5: tmp = "FABRIC_TYPE_PCI"; break; case 6: tmp = "FABRIC_TYPE_SAS"; break; case 7: tmp = "FABRIC_TYPE_MAX"; break; default: tmp = "FABRIC_TYPE_UNKNOWN"; break; } memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_inventory->info.area_list-> idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_CUSTOM; if(strlen(tmp) < SAHPI_MAX_TEXT_BUFFER_LENGTH){ strcpy ((char *)hpi_field.Field.Data, tmp); rv = idr_field_add(&(local_inventory ->info.area_list ->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); return rv; } /* Increment the field counter */ local_inventory->info.area_list->idr_area_head. NumFields++; }else { err("Source String length is greater than \ SAHPI_MAX_TEXT_BUFFER_LENGTH"); } switch(mezzDev_Port.status){ case 1: tmp = "FABRIC_STATUS_OK"; break; case 2: tmp = "FABRIC_STATUS_MISMATCH"; break; default: tmp = "FABRIC_STATUS_UNKNOWN"; break; } memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_inventory->info.area_list-> idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_CUSTOM; if(strlen(tmp) < SAHPI_MAX_TEXT_BUFFER_LENGTH){ strcpy ((char *)hpi_field.Field.Data, tmp); rv = idr_field_add(&(local_inventory ->info.area_list ->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); return rv; } /* Increment the field counter */ local_inventory->info.area_list->idr_area_head. NumFields++; }else { err("Source String length is greater than \ SAHPI_MAX_TEXT_BUFFER_LENGTH"); } } mezzDev_Info.port = soap_next_node(mezzDev_Info.port); } return SA_OK; } /** * build_inserted_server_inv_rdr * @oh_handler: Handler data pointer * @bay_number: Bay number of the inserted server * @rdr: Rdr Structure for inventory data * @inventory: Rdr private data structure * * Purpose: * Creates an basic inventory rdr without area information for server * blade when it is inserted * * Detailed Description: * - Populates the server inventory rdr with default values when server is * inserted * - When the server blade is inserted, inventory information is not * available until it stabilizes, a seperate event is sent by OA when * the server stabilizes * Hence, the inventory IDR creation is done in two stages: * Stage 1: Create the IDR header when the server is inserted and * keep area list empty. This stage1 functionality is achieved by this * module * Stage 2: When OA intimates that the server is stable, then retrieve * inventory information and create appropriate area list and attach it * to the IDR created in stage 1. This stage 2 functionality is achieved * by "build_server_inventory_area" module * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - oa_soap plugin has encountered an internal * error * SA_ERR_HPI_OUT_OF_MEMORY - Request failed due to insufficient memory **/ SaErrorT build_inserted_server_inv_rdr(struct oh_handler_state *oh_handler, SaHpiInt32T bay_number, SaHpiRdrT *rdr, struct oa_soap_inventory **inventory) { char server_inv_str[] = SERVER_INVENTORY_STRING; struct oa_soap_inventory *local_inventory = NULL; struct oa_soap_handler *oa_handler = NULL; SaHpiResourceIdT resource_id; SaHpiRptEntryT *rpt = NULL; if (oh_handler == NULL || rdr == NULL || inventory == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; resource_id = oa_handler->oa_soap_resources.server.resource_id[bay_number - 1]; rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (!rpt) { err("Could not find blade resource rpt"); return(SA_ERR_HPI_INTERNAL_ERROR); } rdr->Entity = rpt->ResourceEntity; /* Populating the inventory rdr with default values and resource name */ rdr->RecordId = 0; rdr->RdrType = SAHPI_INVENTORY_RDR; rdr->RdrTypeUnion.InventoryRec.IdrId = SAHPI_DEFAULT_INVENTORY_ID; rdr->IdString.DataType = SAHPI_TL_TYPE_TEXT; rdr->IdString.Language = SAHPI_LANG_ENGLISH; oa_soap_trim_whitespace(server_inv_str); rdr->IdString.DataLength = strlen(server_inv_str); snprintf((char *)rdr->IdString.Data, strlen(server_inv_str) + 1,"%s", server_inv_str); /* Create inventory IDR and populate the IDR header and keep * area list as empty */ local_inventory = (struct oa_soap_inventory*) g_malloc0(sizeof(struct oa_soap_inventory)); if (!local_inventory) { err("OA SOAP out of memory"); return SA_ERR_HPI_OUT_OF_MEMORY; } local_inventory->inv_rec.IdrId = rdr->RdrTypeUnion.InventoryRec.IdrId; local_inventory->info.idr_info.IdrId = rdr->RdrTypeUnion.InventoryRec.IdrId; local_inventory->info.idr_info.UpdateCount = 1; local_inventory->info.idr_info.ReadOnly = SAHPI_FALSE; local_inventory->info.idr_info.NumAreas = 0; local_inventory->info.area_list = NULL; local_inventory->comment = (char *)g_malloc0(strlen(server_inv_str) + 1); strcpy(local_inventory->comment, server_inv_str); *inventory = local_inventory; return SA_OK; } /** * build_server_inventory_area * @con: Pointer to the SOAP_CON * @response: Handler data pointer * @rdr: Rdr Structure for inventory data * @inventory: Rdr private data structure * * Purpose: * Builds the server IDR areas and attaches these area to already created * inventory rdr of server * * Detailed Description: * - Populates the server inventory rdr's IDR with available inventory * information * - When the server blade is inserted, inventory information is not * available until it stabilizes, a seperate event is sent by OA when * the server stabilizes * Hence, the inventory IDR creation is done in two stages: * Stage 1: Create the IDR header when the server is inserted and * keep area list empty, this functionality is achieved by * "build_inserted_server_inv_rdr" module * Stage 2: When OA intimates that the server is stable, then retrieve * inventory information and create appropriate area list and attach it * to the IDR created in stage 1. This stage 2 functionality is achieved * by this module * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - oa_soap plugin has encountered an internal * error * SA_ERR_HPI_OUT_OF_MEMORY - Request failed due to insufficient memory **/ SaErrorT build_server_inventory_area(SOAP_CON *con, struct bladeInfo *response, SaHpiRdrT *rdr, struct oa_soap_inventory **inventory) { SaErrorT rv = SA_OK; SaHpiIdrFieldT hpi_field; struct oa_soap_inventory *local_inventory = *inventory; struct oa_soap_area *head_area = NULL; SaHpiInt32T product_area_success_flag = 0; SaHpiInt32T add_success_flag = 0; SaHpiInt32T area_count = 0; struct getBladeMpInfo blade_mp_request; struct bladeMpInfo blade_mp_response; if (response == NULL || rdr == NULL || inventory == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } /* Create and add product area if resource name and/or manufacturer * information exist */ rv = add_product_area(&local_inventory->info.area_list, response->name, response->manufacturer, &add_success_flag); if (rv != SA_OK) { err("Add product area failed"); return rv; } /* add_success_flag will be true if product area is added, * if this is the first successful creation of IDR area, then have * area pointer stored as the head node for area list */ if (add_success_flag != SAHPI_FALSE) { product_area_success_flag = SAHPI_TRUE; (local_inventory->info.idr_info.NumAreas)++; if (area_count == 0) { head_area = local_inventory->info.area_list; } ++area_count; } /* Create and add board area if resource's part number and/or * serial number exist */ rv = add_board_area(&local_inventory->info.area_list, response->partNumber, response->serialNumber, &add_success_flag); if (rv != SA_OK) { err("Add board area failed"); return rv; } if (add_success_flag != SAHPI_FALSE) { (local_inventory->info.idr_info.NumAreas)++; if (area_count == 0) { head_area = local_inventory->info.area_list; } ++area_count; } local_inventory->info.area_list = head_area; *inventory = local_inventory; /* Adding the product version in IDR product area. It is added at * the end of the field list. */ if (product_area_success_flag == SAHPI_TRUE) { /* Making getBladeMpInfo soap call for getting the * product version */ blade_mp_request.bayNumber = response->bayNumber; rv = soap_getBladeMpInfo(con, &blade_mp_request, &blade_mp_response); if (rv != SOAP_OK) { err("Get blade mp info failed"); return rv; } /* Add the product version field if the firmware info * is available */ if (blade_mp_response.fwVersion != NULL) { memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_inventory->info.area_list-> idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_PRODUCT_VERSION; strcpy ((char *)hpi_field.Field.Data, blade_mp_response.fwVersion); rv = idr_field_add(&(local_inventory->info.area_list ->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); return rv; } /* Increment the field counter */ local_inventory->info.area_list->idr_area_head. NumFields++; } } return SA_OK; } /** * build_interconnect_inv_rdr * @oh_handler: Handler data pointer * @con: Pointer to the SOAP_CON * @bay_number: Bay number of the server * @rdr: Rdr Structure for inventory data * @inventory: Rdr private data structure * * Purpose: * Creates an inventory rdr for interconnect blade * * Detailed Description: * - Populates the interconnect inventory rdr with default values * - Inventory data repository is created and associated as part of the * private data area of the Inventory RDR * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - oa_soap plugin has encountered an internal * error * SA_ERR_HPI_OUT_OF_MEMORY - Request failed due to insufficient memory **/ SaErrorT build_interconnect_inv_rdr(struct oh_handler_state *oh_handler, SOAP_CON *con, SaHpiInt32T bay_number, SaHpiRdrT *rdr, struct oa_soap_inventory **inventory) { SaErrorT rv = SA_OK; SaHpiIdrFieldT hpi_field; char interconnect_inv_str[] = INTERCONNECT_INVENTORY_STRING; struct oa_soap_inventory *local_inventory = NULL; struct oa_soap_area *head_area = NULL; SaHpiInt32T add_success_flag = 0; SaHpiInt32T product_area_success_flag = 0; SaHpiInt32T area_count = 0; struct getInterconnectTrayInfo request; struct interconnectTrayInfo response; struct oa_soap_handler *oa_handler = NULL; SaHpiResourceIdT resource_id; SaHpiRptEntryT *rpt = NULL; xmlNode *extra_data; struct extraDataInfo extra_data_info; SaHpiFloat64T fm_version=0; SaHpiInt32T major=0; struct interconnectTrayPortMap portmap; char *tmp = NULL; if (oh_handler == NULL || con == NULL || rdr == NULL || inventory == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; resource_id = oa_handler-> oa_soap_resources.interconnect.resource_id[bay_number - 1]; /* Get the rpt entry of the resource */ rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (rpt == NULL) { err("resource RPT is NULL"); return SA_ERR_HPI_INTERNAL_ERROR; } request.bayNumber = bay_number; rv = soap_getInterconnectTrayInfo(con, &request, &response); if (rv != SOAP_OK) { err("Get Interconnect tray info failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Look out for swmFWVersion */ fm_version = 0; major = 0; extra_data = response.extraData; while (extra_data) { soap_getExtraData(extra_data, &extra_data_info); if (!(strcmp(extra_data_info.name, "swmFWVersion"))) { fm_version = atof(extra_data_info.value); major = rintf(fm_version); break; } extra_data = soap_next_node(extra_data); } /* Populating the inventory rdr with rpt values for the resource */ rdr->Entity = rpt->ResourceEntity; rdr->RecordId = 0; rdr->RdrType = SAHPI_INVENTORY_RDR; rdr->RdrTypeUnion.InventoryRec.IdrId = SAHPI_DEFAULT_INVENTORY_ID; rdr->IdString.DataType = SAHPI_TL_TYPE_TEXT; rdr->IdString.Language = SAHPI_LANG_ENGLISH; oa_soap_trim_whitespace(response.name); rdr->IdString.DataLength = strlen(response.name); snprintf((char *)rdr->IdString.Data, strlen(response.name)+ 1, "%s",response.name ); /* Create inventory IDR and populate the IDR header */ local_inventory = (struct oa_soap_inventory*) g_malloc0(sizeof(struct oa_soap_inventory)); if (!local_inventory) { err("OA SOAP out of memory"); return SA_ERR_HPI_OUT_OF_MEMORY; } local_inventory->inv_rec.IdrId = rdr->RdrTypeUnion.InventoryRec.IdrId; local_inventory->info.idr_info.IdrId = rdr->RdrTypeUnion.InventoryRec.IdrId; local_inventory->info.idr_info.UpdateCount = 1; local_inventory->info.idr_info.ReadOnly = SAHPI_FALSE; local_inventory->info.idr_info.NumAreas = 0; local_inventory->info.area_list = NULL; local_inventory->comment = (char *)g_malloc0(strlen(interconnect_inv_str) + 1); strcpy(local_inventory->comment, interconnect_inv_str); /* Create and add product area if resource name and/or manufacturer * information exist */ rv = add_product_area(&local_inventory->info.area_list, response.name, response.manufacturer, &add_success_flag); if (rv != SA_OK) { err("Add product area failed"); return rv; } /* add_success_flag will be true if product area is added, * if this is the first successful creation of IDR area, then have * area pointer stored as the head node for area list */ if (add_success_flag != SAHPI_FALSE) { product_area_success_flag = SAHPI_TRUE; (local_inventory->info.idr_info.NumAreas)++; if (area_count == 0) { head_area = local_inventory->info.area_list; } ++area_count; } /* Create and add board area if resource part number and/or * serial number exist */ rv = add_board_area(&local_inventory->info.area_list, response.partNumber, response.serialNumber, &add_success_flag); if (rv != SA_OK) { err("Add board area failed"); return rv; } if (add_success_flag != SAHPI_FALSE) { (local_inventory->info.idr_info.NumAreas)++; if (area_count == 0) { head_area = local_inventory->info.area_list; } ++area_count; } local_inventory->info.area_list = head_area; *inventory = local_inventory; /* Adding the product version in IDR product area. It is added at * the end of the field list. */ if (product_area_success_flag == SAHPI_TRUE) { /* Add the product version field if the firmware info * is available */ if (!(strcmp(extra_data_info.name, "swmFWVersion"))) { memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_inventory->info.area_list-> idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_PRODUCT_VERSION; strcpy ((char *)hpi_field.Field.Data, extra_data_info.value); rv = idr_field_add(&(local_inventory->info.area_list ->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); return rv; } /* Increment the field counter */ local_inventory->info.area_list->idr_area_head. NumFields++; /* Store Firmware Major/Minor Rev numbers to rpt */ rpt->ResourceInfo.FirmwareMajorRev = major; rpt->ResourceInfo.FirmwareMinorRev = rintf((fm_version - major) * 100); } request.bayNumber = bay_number; rv = soap_getInterconnectTrayPortMap(con, &request, &portmap); if (rv != SOAP_OK) { err("Get Interconnect tray port map failed"); return SA_ERR_HPI_INTERNAL_ERROR; } if (portmap.interconnectTrayBayNumber) { memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_inventory->info.area_list-> idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_CUSTOM; rv = asprintf(&tmp, "InterconnectTrayBay No. = %d", portmap.interconnectTrayBayNumber); if(rv == -1){ free(tmp); err("Failed to allocate memory for buffer to \ hold InterconnectTrayBay No."); return SA_ERR_HPI_OUT_OF_MEMORY; } strcpy ((char *)hpi_field.Field.Data, tmp); rv = idr_field_add(&(local_inventory->info.area_list ->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); free(tmp); return rv; } /* Increment the field counter */ local_inventory->info.area_list->idr_area_head. NumFields++; free(tmp); tmp = NULL; } if (portmap.status) { memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_inventory->info.area_list-> idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_CUSTOM; rv = asprintf(&tmp, "portMapStatus = %d",portmap.status); if(rv == -1){ free(tmp); err("Failed to allocate memory for buffer to \ hold portMapStatus"); return SA_ERR_HPI_OUT_OF_MEMORY; } strcpy ((char *)hpi_field.Field.Data, tmp); rv = idr_field_add(&(local_inventory->info.area_list ->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); free(tmp); return rv; } /* Increment the field counter */ local_inventory->info.area_list->idr_area_head. NumFields++; free(tmp); tmp = NULL; } /* Add interconnect tray size type*/ memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_inventory->info.area_list-> idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_CUSTOM; switch(portmap.sizeType){ case 0: tmp = "INTERCONNECT_TRAY_SIZE_TYPE_MT"; break; case 1: tmp = "INTERCONNECT_TRAY_SIZE_TYPE-1X1"; break; case 2: tmp = "INTERCONNECT_TRAY_SIZE_TYPE_1x1"; break; case 3: tmp = "INTERCONNECT_TRAY_SIZE_TYPE_2x1"; break; case 4: tmp = "INTERCONNECT_TRAY_SIZE_TYPE-2x1"; break; default: tmp = "Invalid Size Type"; break; } strcpy ((char *)hpi_field.Field.Data, tmp); rv = idr_field_add(&(local_inventory->info.area_list ->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); return rv; } /* Increment the field counter */ local_inventory->info.area_list->idr_area_head. NumFields++; } return SA_OK; } /** * build_interconnect_inv_rdr_arr * @oh_handler: Handler data pointer * @bay_number: Bay number of the server * @rdr: Rdr Structure for inventory data * @inventory: Rdr private data structure * @response: Pointer to trayInfo response structure * @portmap: Pointer to portmap response structure * * Purpose: * Creates an inventory rdr for interconnect blade * * Detailed Description: * - Populates the interconnect inventory rdr with default values * - Inventory data repository is created and associated as part of the * private data area of the Inventory RDR * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - oa_soap plugin has encountered an internal * error * SA_ERR_HPI_OUT_OF_MEMORY - Request failed due to insufficient memory **/ SaErrorT build_interconnect_inv_rdr_arr(struct oh_handler_state *oh_handler, SaHpiInt32T bay_number, SaHpiRdrT *rdr, struct oa_soap_inventory **inventory, struct interconnectTrayInfo *response, struct interconnectTrayPortMap *portmap) { SaErrorT rv = SA_OK; SaHpiIdrFieldT hpi_field; char interconnect_inv_str[] = INTERCONNECT_INVENTORY_STRING; struct oa_soap_inventory *local_inventory = NULL; struct oa_soap_area *head_area = NULL; SaHpiInt32T add_success_flag = 0; SaHpiInt32T product_area_success_flag = 0; SaHpiInt32T area_count = 0; struct oa_soap_handler *oa_handler = NULL; SaHpiResourceIdT resource_id; SaHpiRptEntryT *rpt = NULL; xmlNode *extra_data; struct extraDataInfo extra_data_info; SaHpiFloat64T fm_version=0; SaHpiInt32T major=0; char *tmp = NULL; if (oh_handler == NULL || rdr == NULL || inventory == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; resource_id = oa_handler-> oa_soap_resources.interconnect.resource_id[bay_number - 1]; /* Get the rpt entry of the resource */ rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (rpt == NULL) { err("resource RPT is NULL"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Look out for swmFWVersion */ fm_version = 0; major = 0; extra_data = response->extraData; while (extra_data) { soap_getExtraData(extra_data, &extra_data_info); if (!(strcmp(extra_data_info.name, "swmFWVersion"))) { fm_version = atof(extra_data_info.value); major = rintf(fm_version); break; } extra_data = soap_next_node(extra_data); } /* Populating the inventory rdr with rpt values for the resource */ rdr->Entity = rpt->ResourceEntity; rdr->RecordId = 0; rdr->RdrType = SAHPI_INVENTORY_RDR; rdr->RdrTypeUnion.InventoryRec.IdrId = SAHPI_DEFAULT_INVENTORY_ID; rdr->IdString.DataType = SAHPI_TL_TYPE_TEXT; rdr->IdString.Language = SAHPI_LANG_ENGLISH; oa_soap_trim_whitespace(response->name); rdr->IdString.DataLength = strlen(response->name); snprintf((char *)rdr->IdString.Data, strlen(response->name)+ 1, "%s",response->name ); /* Create inventory IDR and populate the IDR header */ local_inventory = (struct oa_soap_inventory*) g_malloc0(sizeof(struct oa_soap_inventory)); if (!local_inventory) { err("OA SOAP out of memory"); return SA_ERR_HPI_OUT_OF_MEMORY; } local_inventory->inv_rec.IdrId = rdr->RdrTypeUnion.InventoryRec.IdrId; local_inventory->info.idr_info.IdrId = rdr->RdrTypeUnion.InventoryRec.IdrId; local_inventory->info.idr_info.UpdateCount = 1; local_inventory->info.idr_info.ReadOnly = SAHPI_FALSE; local_inventory->info.idr_info.NumAreas = 0; local_inventory->info.area_list = NULL; local_inventory->comment = (char *)g_malloc0(strlen(interconnect_inv_str) + 1); strcpy(local_inventory->comment, interconnect_inv_str); /* Create and add product area if resource name and/or manufacturer * information exist */ rv = add_product_area(&local_inventory->info.area_list, response->name, response->manufacturer, &add_success_flag); if (rv != SA_OK) { err("Add product area failed"); return rv; } /* add_success_flag will be true if product area is added, * if this is the first successful creation of IDR area, then have * area pointer stored as the head node for area list */ if (add_success_flag != SAHPI_FALSE) { product_area_success_flag = SAHPI_TRUE; (local_inventory->info.idr_info.NumAreas)++; if (area_count == 0) { head_area = local_inventory->info.area_list; } ++area_count; } /* Create and add board area if resource part number and/or * serial number exist */ rv = add_board_area(&local_inventory->info.area_list, response->partNumber, response->serialNumber, &add_success_flag); if (rv != SA_OK) { err("Add board area failed"); return rv; } if (add_success_flag != SAHPI_FALSE) { (local_inventory->info.idr_info.NumAreas)++; if (area_count == 0) { head_area = local_inventory->info.area_list; } ++area_count; } local_inventory->info.area_list = head_area; *inventory = local_inventory; /* Adding the product version in IDR product area. It is added at * the end of the field list. */ if (product_area_success_flag == SAHPI_TRUE) { /* Add the product version field if the firmware info * is available */ if (!(strcmp(extra_data_info.name, "swmFWVersion"))) { memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_inventory->info.area_list-> idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_PRODUCT_VERSION; strcpy ((char *)hpi_field.Field.Data, extra_data_info.value); rv = idr_field_add(&(local_inventory->info.area_list ->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); return rv; } /* Increment the field counter */ local_inventory->info.area_list->idr_area_head. NumFields++; /* Store Firmware Major/Minor Rev numbers to rpt */ rpt->ResourceInfo.FirmwareMajorRev = major; rpt->ResourceInfo.FirmwareMinorRev = rintf((fm_version - major) * 100); } if (portmap->interconnectTrayBayNumber) { memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_inventory->info.area_list-> idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_CUSTOM; rv = asprintf(&tmp, "InterconnectTrayBay No. = %d", portmap->interconnectTrayBayNumber); if(rv == -1){ free(tmp); err("Failed to allocate memory for buffer to \ hold InterconnectTrayBay No."); return SA_ERR_HPI_OUT_OF_MEMORY; } strcpy ((char *)hpi_field.Field.Data, tmp); rv = idr_field_add(&(local_inventory->info.area_list ->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); free(tmp); return rv; } /* Increment the field counter */ local_inventory->info.area_list->idr_area_head. NumFields++; free(tmp); tmp = NULL; } if (portmap->status) { memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_inventory->info.area_list-> idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_CUSTOM; rv = asprintf(&tmp, "portMapStatus = %d",portmap->status); if(rv == -1){ free(tmp); err("Failed to allocate memory for buffer to \ hold portMapStatus"); return SA_ERR_HPI_OUT_OF_MEMORY; } strcpy ((char *)hpi_field.Field.Data, tmp); rv = idr_field_add(&(local_inventory->info.area_list ->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); free(tmp); return rv; } /* Increment the field counter */ local_inventory->info.area_list->idr_area_head. NumFields++; free(tmp); tmp = NULL; } /* Add interconnect tray size type*/ memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_inventory->info.area_list-> idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_CUSTOM; switch(portmap->sizeType){ case 0: tmp = "INTERCONNECT_TRAY_SIZE_TYPE_MT"; break; case 1: tmp = "INTERCONNECT_TRAY_SIZE_TYPE-1X1"; break; case 2: tmp = "INTERCONNECT_TRAY_SIZE_TYPE_1x1"; break; case 3: tmp = "INTERCONNECT_TRAY_SIZE_TYPE_2x1"; break; case 4: tmp = "INTERCONNECT_TRAY_SIZE_TYPE-2x1"; break; default: tmp = "Invalid Size Type"; break; } strcpy ((char *)hpi_field.Field.Data, tmp); rv = idr_field_add(&(local_inventory->info.area_list ->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); return rv; } /* Increment the field counter */ local_inventory->info.area_list->idr_area_head. NumFields++; } return SA_OK; } /** * build_fan_inv_rdr * @oh_handler: Handler data pointer * @response: Pointer to the fan info response * @rdr: Rdr Structure for inventory data * @inventory: Rdr private data structure * * Purpose: * Creates an inventory rdr for fan * * Detailed Description: * - Populates the fan inventory rdr with default values * - Inventory data repository is created and associated as part of the * private data area of the Inventory RDR * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - oa_soap plugin has encountered an internal * error * SA_ERR_HPI_OUT_OF_MEMORY - Request failed due to insufficient memory **/ SaErrorT build_fan_inv_rdr(struct oh_handler_state *oh_handler, struct fanInfo *response, SaHpiRdrT *rdr, struct oa_soap_inventory **inventory) { SaErrorT rv = SA_OK; char fan_inv_str[] = FAN_INVENTORY_STRING; struct oa_soap_inventory *local_inventory = NULL; struct oa_soap_area *head_area = NULL; SaHpiInt32T add_success_flag = 0; SaHpiInt32T area_count = 0; struct oa_soap_handler *oa_handler = NULL; SaHpiResourceIdT resource_id; SaHpiRptEntryT *rpt = NULL; if (oh_handler == NULL || response == NULL || rdr == NULL || inventory == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; resource_id = oa_handler-> oa_soap_resources.fan.resource_id[response->bayNumber - 1]; /* Get the rpt entry of the resource */ rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (rpt == NULL) { err("resource RPT is NULL"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Populating the inventory rdr with default values and resource name */ rdr->RdrType = SAHPI_INVENTORY_RDR; rdr->Entity = rpt->ResourceEntity; rdr->RecordId = 0; rdr->RdrTypeUnion.InventoryRec.IdrId = SAHPI_DEFAULT_INVENTORY_ID; rdr->IdString.DataType = SAHPI_TL_TYPE_TEXT; rdr->IdString.Language = SAHPI_LANG_ENGLISH; oa_soap_trim_whitespace(response->name); rdr->IdString.DataLength = strlen(response->name); snprintf((char *)rdr->IdString.Data, strlen(response->name)+ 1, "%s", response->name ); /* Create inventory IDR and populate the IDR header */ local_inventory = (struct oa_soap_inventory*) g_malloc0(sizeof(struct oa_soap_inventory)); if (!local_inventory) { return SA_ERR_HPI_OUT_OF_MEMORY; } local_inventory->inv_rec.IdrId = rdr->RdrTypeUnion.InventoryRec.IdrId; local_inventory->info.idr_info.IdrId = rdr->RdrTypeUnion.InventoryRec.IdrId; local_inventory->info.idr_info.UpdateCount = 1; local_inventory->info.idr_info.ReadOnly = SAHPI_FALSE; local_inventory->info.idr_info.NumAreas = 0; local_inventory->info.area_list = NULL; local_inventory->comment = (char *)g_malloc0(strlen(fan_inv_str) + 1); strcpy(local_inventory->comment, fan_inv_str); /* Create and add product area if resource name and/or manufacturer * information exist */ rv = add_product_area(&local_inventory->info.area_list, response->name, NULL, &add_success_flag); if (rv != SA_OK) { err("Add product area failed"); return rv; } /* add_success_flag will be true if product area is added, * if this is the first successful creation of IDR area, then have * area pointer stored as the head node for area list */ if (add_success_flag != SAHPI_FALSE) { (local_inventory->info.idr_info.NumAreas)++; if (area_count == 0) { head_area = local_inventory->info.area_list; } ++area_count; } /* Create and add board area if resource part number and/or * serial number exist */ rv = add_board_area(&local_inventory->info.area_list, response->partNumber, response->serialNumber, &add_success_flag); if (rv != SA_OK) { err("Add board area failed"); return rv; } if (add_success_flag != SAHPI_FALSE) { (local_inventory->info.idr_info.NumAreas)++; if (area_count == 0) { head_area = local_inventory->info.area_list; } ++area_count; } local_inventory->info.area_list = head_area; *inventory = local_inventory; return SA_OK; } /** * build_power_inv_rdr * @oh_handler: Handler data pointer * @response: Pointer to the power sypply info response * @rdr: Rdr Structure for inventory data * @inventory: Rdr private data structure * * Purpose: * Creates an inventory rdr for power supply * * Detailed Description: * - Populates the power supply inventory rdr with default values * - Inventory data repository is created and associated as part of the * private data area of the Inventory RDR * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - oa_soap plugin has encountered an internal * error * SA_ERR_HPI_OUT_OF_MEMORY - Request failed due to insufficient memory **/ SaErrorT build_power_inv_rdr(struct oh_handler_state *oh_handler, struct powerSupplyInfo *response, SaHpiRdrT *rdr, struct oa_soap_inventory **inventory) { SaErrorT rv = SA_OK; char *power_rdr_str = POWER_SUPPLY_RDR_STRING; char power_inv_str[] = POWER_SUPPLY_INVENTORY_STRING; struct oa_soap_inventory *local_inventory = NULL; struct oa_soap_area *head_area = NULL; SaHpiInt32T add_success_flag = 0; SaHpiInt32T area_count = 0; struct oa_soap_handler *oa_handler = NULL; SaHpiResourceIdT resource_id; SaHpiRptEntryT *rpt = NULL; xmlNode *extra_data=NULL; struct extraDataInfo extra_data_info; if (oh_handler == NULL || rdr == NULL || inventory == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; resource_id = oa_handler->oa_soap_resources.ps_unit.resource_id[response->bayNumber - 1]; /* Get the rpt entry of the resource */ rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (rpt == NULL) { err("resource RPT is NULL"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Populating the inventory rdr with default values and resource name */ rdr->Entity = rpt->ResourceEntity; rdr->RecordId = 0; rdr->RdrType = SAHPI_INVENTORY_RDR; rdr->RdrTypeUnion.InventoryRec.IdrId = SAHPI_DEFAULT_INVENTORY_ID; rdr->IdString.DataType = SAHPI_TL_TYPE_TEXT; rdr->IdString.Language = SAHPI_LANG_ENGLISH; oa_soap_trim_whitespace(power_rdr_str); rdr->IdString.DataLength = strlen(power_rdr_str); snprintf((char *)rdr->IdString.Data, strlen(power_rdr_str)+ 1, "%s", power_rdr_str); /* Create inventory IDR and populate the IDR header */ local_inventory = (struct oa_soap_inventory*) g_malloc0(sizeof(struct oa_soap_inventory)); if (!local_inventory) { err("OA SOAP out of memory"); return SA_ERR_HPI_OUT_OF_MEMORY; } local_inventory->inv_rec.IdrId = rdr->RdrTypeUnion.InventoryRec.IdrId; local_inventory->info.idr_info.IdrId = rdr->RdrTypeUnion.InventoryRec.IdrId; local_inventory->info.idr_info.UpdateCount = 1; local_inventory->info.idr_info.ReadOnly = SAHPI_FALSE; local_inventory->info.idr_info.NumAreas = 0; local_inventory->info.area_list = NULL; local_inventory->comment = (char *)g_malloc0(strlen(power_inv_str) + 1); strcpy(local_inventory->comment, power_inv_str); /* Get the Product name from the extradata */ response->productName[0] = '\0'; extra_data = response->extraData; while (extra_data) { soap_getExtraData(extra_data, &extra_data_info); if ((!(strcmp(extra_data_info.name, "productName"))) && (extra_data_info.value != NULL)) { strcpy(response->productName, extra_data_info.value); break; } extra_data = soap_next_node(extra_data); } /* Create and add product area if resource name and/or manufacturer * information exist */ rv = add_product_area(&local_inventory->info.area_list, response->productName, NULL, &add_success_flag); if (rv != SA_OK) { err("Add product area failed"); return rv; } /* add_success_flag will be true if product area is added, * if this is the first successful creation of IDR area, then have * area pointer stored as the head node for area list */ if (add_success_flag != SAHPI_FALSE) { (local_inventory->info.idr_info.NumAreas)++; if (area_count == 0) { head_area = local_inventory->info.area_list; } ++area_count; } /* Create and add board area if resource part number and/or * serial number exist */ rv = add_board_area(&local_inventory->info.area_list, response->modelNumber, response->serialNumber, &add_success_flag); if (rv != SA_OK) { err("Add board area failed"); return rv; } if (add_success_flag != SAHPI_FALSE) { (local_inventory->info.idr_info.NumAreas)++; if (area_count == 0) { head_area = local_inventory->info.area_list; } ++area_count; } local_inventory->info.area_list = head_area; *inventory = local_inventory; return SA_OK; } /** * add_product_area * @area: IDR area pointer * @name: Resource name * @manufacturer: Resource manufacturer * @success_flag: Flag for checking area creation * * Purpose: * Creates an IDR product area with required fields * * Detailed Description: * - Checks whether the name and manufacturer details are available for * the resource which has called this module * - If either or both of these information is available then IDR area * of Product info type is created and these informations are added as * individual IDR fields in the newly create product area * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_OUT_OF_MEMORY - Request failed due to insufficient memory **/ SaErrorT add_product_area(struct oa_soap_area **area, char *name, char *manufacturer, SaHpiInt32T *success_flag) { SaErrorT rv = SA_OK; SaHpiIdrFieldT hpi_field; struct oa_soap_area *local_area = NULL; struct oa_soap_field *field = NULL; struct oa_soap_field *head_field = NULL; SaHpiInt32T field_count = 0; if (area == NULL || success_flag == NULL) { err("Invalid Parameters"); return SA_ERR_HPI_INVALID_PARAMS; } /* If both name and manufacturer information is NULL * then product area is not created */ if (name == NULL && manufacturer == NULL) { err("Product Area:Required information not available"); err("Product area not created"); *success_flag = SAHPI_FALSE; return SA_OK; } /* Create area of type PRODUCT INFO */ rv = idr_area_add(area, SAHPI_IDR_AREATYPE_PRODUCT_INFO, &local_area); if (rv != SA_OK) { err("Add idr area failed"); return rv; } *success_flag = SAHPI_TRUE; /* Add the fields to the newly created product area */ field = local_area->field_list; if (name != NULL) { /* Add product name field to the IDR product area */ memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_area->idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_PRODUCT_NAME; strcpy ((char *)hpi_field.Field.Data, name); rv = idr_field_add(&(local_area->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); return rv; } ++field_count; /* if this is the first successful creation of IDR field in * the IDR area, then have field pointer stored as the head * node for field list */ if (field_count == 1) { head_field = field = local_area->field_list; } local_area->idr_area_head.NumFields++; } if (manufacturer != NULL) { /* Add manufacturer field to the IDR product area */ memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_area->idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_MANUFACTURER; strcpy ((char *)hpi_field.Field.Data, manufacturer); rv = idr_field_add(&(local_area->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); return rv; } ++field_count; if (field_count == 1) { head_field = field = local_area->field_list; } local_area->idr_area_head.NumFields++; } local_area->field_list = head_field; return SA_OK; } /** * add_chassis_area * @area: IDR area pointer * @part_number: Resource part number * @serial_number: Resource serial_number * @success_flag: Flag for checking area creation * * Purpose: * Creates an IDR chassis area with required fields * * Detailed Description: * - Checks whether the part number and serial number details are * available for the resource which has called this module * - If either or both of these information is available then IDR area * of Chassis info type is created and these informations are added as * individual IDR fields in the newly create chassis area * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_OUT_OF_MEMORY - Request failed due to insufficient memory **/ SaErrorT add_chassis_area(struct oa_soap_area **area, char *part_number, char *serial_number, SaHpiInt32T *success_flag) { SaErrorT rv = SA_OK; SaHpiIdrFieldT hpi_field; struct oa_soap_area *local_area = NULL; struct oa_soap_field *field = NULL; struct oa_soap_field *head_field = NULL; SaHpiInt32T field_count = 0; if (area == NULL || success_flag == NULL) { err("Invalid Parameters"); return SA_ERR_HPI_INVALID_PARAMS; } /* If both part number and serial number information is NULL * then chassis area is not created */ if (part_number == NULL && serial_number == NULL) { err("Chassis Area:Required information not available"); err("Chassis area not created"); *success_flag = SAHPI_FALSE; return SA_OK; } rv = idr_area_add(area, SAHPI_IDR_AREATYPE_CHASSIS_INFO, &local_area); if (rv != SA_OK) { err("Add idr area failed"); return rv; } field_count = 0; *success_flag = SAHPI_TRUE; /* Add the fields to the newly created chassis area */ field = local_area->field_list; if (part_number != NULL) { memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_area->idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_PART_NUMBER; strcpy ((char *)hpi_field.Field.Data, part_number); rv = idr_field_add(&(local_area->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); return rv; } ++field_count; if (field_count == 1) { head_field = field = local_area->field_list; } local_area->idr_area_head.NumFields++; } if (serial_number != NULL) { memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_area->idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER; strcpy ((char *)hpi_field.Field.Data, serial_number); rv = idr_field_add(&(local_area->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); return rv; } ++field_count; if (field_count == 1) { head_field = field = local_area->field_list; } local_area->idr_area_head.NumFields++; } local_area->field_list = head_field; return SA_OK; } /** * add_board_area * @area: IDR area pointer * @part_number: Resource part number * @serial_number: Resource serial_number * @success_flag: Flag for checking area creation * * Purpose: * Creates an IDR board area with required fields * * Detailed Description: * - Checks whether the part number and serial number details are * available for the resource which has called this module * - If either or both of these information is available then IDR area * of board info type is created and these informations are added as * individual IDR fields in the newly create broad area * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_OUT_OF_MEMORY - Request failed due to insufficient memory **/ SaErrorT add_board_area(struct oa_soap_area **area, char *part_number, char *serial_number, SaHpiInt32T *success_flag) { SaErrorT rv = SA_OK; SaHpiIdrFieldT hpi_field; struct oa_soap_area *local_area = NULL; struct oa_soap_field *field = NULL; struct oa_soap_field *head_field = NULL; SaHpiInt32T field_count = 0; if (area == NULL || success_flag == NULL) { err("Invalid Parameters"); return SA_ERR_HPI_INVALID_PARAMS; } /* If both part number and serial number information is NULL * then board area is not created */ if ((part_number == NULL && serial_number == NULL) && (part_number[0] == '\0' && serial_number[0] == '\0')) { err("Board Area:Required information not available"); err("Board area not created"); *success_flag = SAHPI_FALSE; return SA_OK; } rv = idr_area_add(area, SAHPI_IDR_AREATYPE_BOARD_INFO, &local_area); if (rv != SA_OK) { err("Add idr area failed"); return rv; } *success_flag = SAHPI_TRUE; field_count = 0; /* Add the fields to the newly created product area */ field = local_area->field_list; if (part_number != NULL && part_number[0] != '\0') { memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_area->idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_PART_NUMBER; strcpy ((char *)hpi_field.Field.Data, part_number); rv = idr_field_add(&(local_area->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); return rv; } ++field_count; if (field_count == 1) { head_field = field = local_area->field_list; } local_area->idr_area_head.NumFields++; } if (serial_number != NULL && serial_number[0] != '\0') { memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_area->idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER; strcpy ((char *)hpi_field.Field.Data, serial_number); rv = idr_field_add(&(local_area->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); return rv; } ++field_count; if (field_count == 1) { head_field = field = local_area->field_list; } local_area->idr_area_head.NumFields++; } local_area->field_list = head_field; return SA_OK; } /** * add_internal_area * @area: IDR area pointer * @manufacturer: Resource manufacturer * @name: Resource name * @part_number: Resource part number * @serial_number: Resource serial_number * @success_flag: Flag for checking area creation * * Purpose: * Creates an IDR internal area with required fields * * Detailed Description: * - Checks whether the required details for internal area are * available for the enclosure resource which has called this module * - If any of these information is available then IDR area * of INTERNAL USE type is created and available informations are added * as individual IDR fields in the newly create chassis area * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_OUT_OF_MEMORY - Request failed due to insufficient memory **/ SaErrorT add_internal_area(struct oa_soap_area **area, char *manufacturer, char *name, char *part_number, char *serial_number, SaHpiInt32T *success_flag) { SaErrorT rv = SA_OK; SaHpiIdrFieldT hpi_field; struct oa_soap_area *local_area = NULL; struct oa_soap_field *field = NULL; struct oa_soap_field *head_field = NULL; SaHpiInt32T field_count = 0; if (area == NULL || success_flag == NULL) { err("Invalid Parameters"); return SA_ERR_HPI_INVALID_PARAMS; } /* If none of the required inventory info is availble, then INTERNAL * area is not created */ if (manufacturer == NULL && name == NULL && part_number == NULL && serial_number == NULL) { err("Internal Area:Required information not available"); err("Internal area not created"); *success_flag = SAHPI_FALSE; return SA_OK; } /* Create IDR area of INTERNAL USE type */ rv = idr_area_add(area, (SaHpiIdrAreaTypeT)SAHPI_IDR_AREATYPE_INTERNAL_USE, &local_area); if (rv != SA_OK) { err("Add idr area failed"); return rv; } *success_flag = SAHPI_TRUE; field_count = 0; /* Add the fields to the newly created internal use area */ field = local_area->field_list; if (manufacturer != NULL) { memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_area->idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_MANUFACTURER; strcpy ((char *)hpi_field.Field.Data, manufacturer); rv = idr_field_add(&(local_area->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); return rv; } ++field_count; if (field_count == 1) { head_field = field = local_area->field_list; } local_area->idr_area_head.NumFields++; } if (name != NULL) { memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_area->idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_PRODUCT_NAME; strcpy ((char *)hpi_field.Field.Data, name); rv = idr_field_add(&(local_area->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); return rv; } ++field_count; if (field_count == 1) { head_field = field = local_area->field_list; } local_area->idr_area_head.NumFields++; } if (part_number != NULL) { memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_area->idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_PART_NUMBER; strcpy ((char *)hpi_field.Field.Data, part_number); rv = idr_field_add(&(local_area->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); return rv; } ++field_count; if (field_count == 1) { head_field = field = local_area->field_list; head_field = local_area->field_list = field; } local_area->idr_area_head.NumFields++; } if (serial_number != NULL) { memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_area->idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER; strcpy ((char *)hpi_field.Field.Data, serial_number); rv = idr_field_add(&(local_area->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); return rv; } ++field_count; if (field_count == 1) { head_field = field = local_area->field_list; } local_area->idr_area_head.NumFields++; } local_area->field_list = head_field; return SA_OK; } /** * idr_area_add * @head_area: Pointer to IDR area * @area_type: Type of IDR area * @area: Pointer to new allocated area * * Purpose: * Adds an Inventory Data Repository(IDR) area to Inventory data repository * and returns the area pointer * * Detailed Description: * - Creates an IDR area of the specified type * If the area list for the resource IDR exists, then the * newly created area will be added to end of area list * If the area list is empty then the created area will become head node * (first area) for the area list * - Area id is will start from 1 and will increment for every new area * added * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_OUT_OF_MEMORY - Request failed due to insufficient memory **/ SaErrorT idr_area_add(struct oa_soap_area **head_area, SaHpiIdrAreaTypeT area_type, struct oa_soap_area **area) { struct oa_soap_area *local_area = NULL; SaHpiEntryIdT local_area_id; if (head_area == NULL || area == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } local_area = *head_area; /* Check whether the area list is empty */ if (local_area == NULL) { local_area = (struct oa_soap_area*) g_malloc0(sizeof(struct oa_soap_area)); if (!local_area) { err("OA SOAP out of memory"); return SA_ERR_HPI_OUT_OF_MEMORY; } /* Create the area and make it as head node(first area) in * the area list */ *head_area = local_area; local_area_id = 1; } else { /* Area list is not empty, traverse to the end of the list * and add the IDR area */ while (local_area->next_area != NULL) { local_area = local_area->next_area; } local_area->next_area = (struct oa_soap_area*) g_malloc0(sizeof(struct oa_soap_area)); if (!local_area->next_area) { err("OA SOAP out of memory"); return SA_ERR_HPI_OUT_OF_MEMORY; } local_area_id = local_area->idr_area_head.AreaId + 1; local_area = local_area->next_area; } /* Initialize the area with specified area type and generated area id */ local_area->idr_area_head.AreaId = local_area_id; local_area->idr_area_head.Type = area_type; local_area->idr_area_head.ReadOnly = SAHPI_FALSE; local_area->idr_area_head.NumFields = 0; local_area->field_list = NULL; local_area->next_area = NULL; *area = local_area; return SA_OK; } /** * idr_area_add_by_id: * @head_area: Pointer to IDR area * @area_type: Type of IDR area * @area_id: area id to be added * * Purpose: * Adds an Inventory Data Repository(IDR) area to Inventory data repository * with the specified area id * * Detailed Description: * - Creates an IDR area of a specified type with specified id and adds it * to Inventory Data Repository(IDR). * If the area list is empty then the created area will become head node * (first area) for the area list. * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - Input parameters are not valid * SA_ERR_HPI_NOT_PRESENT - Requested object not present * SA_ERR_HPI_OUT_OF_MEMORY - Request failed due to insufficient memory **/ SaErrorT idr_area_add_by_id(struct oa_soap_area **head_area, SaHpiIdrAreaTypeT area_type, SaHpiEntryIdT area_id) { struct oa_soap_area *local_area = NULL; struct oa_soap_area *temp_area = NULL; if (head_area == NULL || area_id == SAHPI_LAST_ENTRY) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } temp_area = *head_area; local_area = (struct oa_soap_area*)g_malloc0( sizeof(struct oa_soap_area)); if (!local_area) { err("OA SOAP out of memory"); return SA_ERR_HPI_OUT_OF_MEMORY; } /* Initialize the area with specified area type and ID */ local_area->idr_area_head.AreaId = area_id; local_area->idr_area_head.Type = area_type; local_area->idr_area_head.ReadOnly = SAHPI_FALSE; local_area->idr_area_head.NumFields = 0; local_area->field_list = NULL; /* Check whether the area list is empty or if the new area * is to be inserted before first area */ if (*head_area == NULL || (*head_area)->idr_area_head.AreaId > area_id) { *head_area = local_area; (*head_area)->next_area = temp_area; } else { /* Traverse through the area list and insert the area * at appropriate place */ while (temp_area != NULL) { if ((temp_area->idr_area_head.AreaId < area_id) && ((temp_area->next_area == NULL) || (temp_area->next_area->idr_area_head.AreaId > area_id))) { local_area->next_area = temp_area->next_area; temp_area->next_area = local_area; break; } temp_area = temp_area->next_area; } } return SA_OK; } /** * idr_area_delete * @head_area: Pointer to IDR area * @area_id: Identifier of the area to be deleted * * Purpose: * Deletes an Inventory Data Repository(IDR) area from Inventory data * repository * * Detailed Description: * - Deleted an IDR area of a specified id if it exists in the area * list else an appropriate error will be returned * - If the specified area id exists, then all the IDR fields in IDR * area is deleted first and then the IDR area is deleted * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_NOT_PRESENT - Requested object not present **/ SaErrorT idr_area_delete(struct oa_soap_area **head_area, SaHpiEntryIdT area_id) { SaErrorT rv = SA_OK; struct oa_soap_area *local_area = NULL; struct oa_soap_area *tmp_area = NULL; struct oa_soap_area *next_area = NULL; SaHpiInt32T count = -1; if (head_area == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } local_area = *head_area; /* If area list is empty, then return error */ if (local_area == NULL) { return SA_ERR_HPI_NOT_PRESENT; } else { /* Check whether specified area id matches with first area id */ if (area_id == local_area->idr_area_head.AreaId) { /* If the specified IDR area is read only, then delete * will be failed and READ ONLY error will be returned */ if (local_area->idr_area_head.ReadOnly == SAHPI_TRUE) { return SA_ERR_HPI_READ_ONLY; } tmp_area = local_area; /* If the specified area id is found, * then traverse the IDR field list of this area and * delete the fields */ for (count = 0; count < local_area->idr_area_head.NumFields; count++) { rv = idr_field_delete(&(local_area->field_list), local_area->field_list-> field.FieldId); if (rv != SA_OK) { return rv; } } tmp_area = local_area; local_area = local_area->next_area; *head_area = local_area; wrap_g_free(tmp_area); return SA_OK; } /* Traverse the area list to find the specified IDR area */ while (local_area->next_area) { next_area = local_area->next_area; if (area_id == next_area->idr_area_head.AreaId) { if (next_area->idr_area_head.ReadOnly == SAHPI_TRUE) { return SA_ERR_HPI_READ_ONLY; } /* If the specified area id is found, then * traverse the IDR field list of this area and * delete the fields */ for (count = 0; count < next_area->idr_area_head.NumFields; count++) { rv = idr_field_delete( &(next_area->field_list), next_area->field_list-> field.FieldId); if (rv != SA_OK) { return rv; } } local_area->next_area = next_area->next_area; wrap_g_free(next_area); return SA_OK; } else { local_area = local_area->next_area; } } } return SA_ERR_HPI_NOT_PRESENT; } /** * fetch_idr_area_header * @inventory_info: Pointer to rdr private data * @area_id: Identifier of the area to be deleted * @area_type: Type of IDR area * @area_header: Structure to receive area header information * @next_area_id: Next area Id of requested type * * Purpose: * Gets an Inventory Data Repository(IDR) area header from Inventory data * repository * * Detailed Description: * - This function allows retrieval of an IDR Area Header by one of * two ways: by AreaId regardless of type or by AreaType and AreaId * - All areas within an IDR can be retrieved by setting area type as * SAHPI_IDR_AREATYPE_UNSPECIFIED, area id set to SAHPI_FIRST_ENTRY for * the first call. For each subsequent call, the area id will be set to * the value returned in the Next area id parameter, * this will work until next area id becomes SAHPI_LAST_ENTRY * - To retrieve all areas of specific type, the above step is repeated * with the specified area type * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_NOT_PRESENT - Requested object not present **/ SaErrorT fetch_idr_area_header(struct oa_soap_inventory_info *inventory_info, SaHpiEntryIdT area_id, SaHpiIdrAreaTypeT area_type, SaHpiIdrAreaHeaderT *area_header, SaHpiEntryIdT *next_area_id) { SaHpiInt32T i; struct oa_soap_area *local_area = NULL; SaHpiInt32T found = SAHPI_FALSE; SaHpiInt32T area_found = SAHPI_FALSE; if (inventory_info == NULL) { return SA_ERR_HPI_ERROR; } if ((area_header == NULL) && (next_area_id == NULL)) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } local_area = inventory_info->area_list; /* Check whether area id is set to return all areas * (of a particular type if specified) */ if (area_id == SAHPI_FIRST_ENTRY) { i = 1; /* Traversing the IDR area list to find the area and next area * of specified area type */ while ((i <= inventory_info->idr_info.NumAreas) && (local_area != NULL)) { if (area_type == SAHPI_IDR_AREATYPE_UNSPECIFIED || area_type == local_area->idr_area_head.Type) { area_found = SAHPI_TRUE; memcpy(area_header, &local_area->idr_area_head, sizeof(SaHpiIdrAreaHeaderT)); local_area = local_area->next_area; *next_area_id = SAHPI_LAST_ENTRY; while (local_area) { if (area_type == SAHPI_IDR_AREATYPE_UNSPECIFIED || area_type == local_area->idr_area_head.Type) { *next_area_id = local_area-> idr_area_head.AreaId; found = SAHPI_TRUE; break; } local_area = local_area->next_area; } break; } else { local_area = local_area->next_area; } i++; } } else { /* Traverse the area list to find area of specified id and * type */ while (local_area != NULL) { if (found == SAHPI_TRUE) { break; } /* If specified area is present then retrive area header * along with next area of same type */ if ((area_id == local_area->idr_area_head.AreaId)) { if (area_type == SAHPI_IDR_AREATYPE_UNSPECIFIED || area_type == local_area->idr_area_head.Type) { area_found = SAHPI_TRUE; memcpy(area_header, &local_area->idr_area_head, sizeof(SaHpiIdrAreaHeaderT)); *next_area_id = SAHPI_LAST_ENTRY; while (local_area->next_area != NULL) { local_area = local_area->next_area; if (area_type == SAHPI_IDR_AREATYPE_UNSPECIFIED || area_type == local_area-> idr_area_head.Type) { *next_area_id = local_area-> idr_area_head. AreaId; found = SAHPI_TRUE; break; } } break; } else { break; } } local_area = local_area->next_area; } } if (!area_found) { return SA_ERR_HPI_NOT_PRESENT; } return SA_OK; } /** * idr_field_add * @oa_field: Pointer to field structure * @area_id: Identifier of the area to be deleted * @field_type: Type of IDR field * @str: Field text content * @hpi_field: Pointer to hpi field structure * * Purpose: * Adds an Inventory Data Repository(IDR) field to Inventory data * repository Area * * Detailed Description: * - Creates an IDR field of a specified type in an IDR area * If the field list in the IDR area exists, then the * newly created field will be added to end of field list. * If the field list is empty then the created field will become head * node (first field) of the field list * - Field id is will start from 1 and will increment for every new field * added * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_NOT_PRESENT - Requested object not present * SA_ERR_HPI_OUT_OF_MEMORY - Request failed due to insufficient memory **/ SaErrorT idr_field_add(struct oa_soap_field **oa_field, SaHpiIdrFieldT *hpi_field) { SaHpiEntryIdT field_id; struct oa_soap_field *field = NULL; if (oa_field == NULL || hpi_field == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } field = *oa_field; /* Check whether the field list is empty */ if (field == NULL) { /* Create the area and make it as head node(first area) in * the area list */ field = (struct oa_soap_field*) g_malloc0(sizeof(struct oa_soap_field)); if (! (field)) { err("OA SOAP out of memory"); return SA_ERR_HPI_OUT_OF_MEMORY; } *oa_field = field; field_id = 1; } else { /* Field list is not empty, traverse to the end of the list * and add the IDR field */ while (field->next_field != NULL) { field = field->next_field; } field->next_field = (struct oa_soap_field*) g_malloc0(sizeof(struct oa_soap_field)); if (!(field->next_field)) { return SA_ERR_HPI_OUT_OF_MEMORY; } field_id = field->field.FieldId + 1; field = field->next_field; } /* Initialize the field of specified field type and generated * field id */ field->field.AreaId = hpi_field->AreaId; field->field.FieldId = field_id; field->field.Type = hpi_field->Type; field->field.ReadOnly = SAHPI_FALSE; hpi_field->ReadOnly = SAHPI_FALSE; field->field.Field.DataType = SAHPI_TL_TYPE_TEXT; field->field.Field.Language = SAHPI_LANG_ENGLISH; oa_soap_trim_whitespace((char *) hpi_field->Field.Data); field->field.Field.DataLength = strlen ((char *)hpi_field->Field.Data); snprintf((char *)field->field.Field.Data, field->field.Field.DataLength + 1, "%s", hpi_field->Field.Data); field->next_field = NULL; hpi_field->FieldId = field_id; return SA_OK; } /** * idr_field_add_by_id: * @oa_field: Pointer to field structure * @area_id: Identifier of the area to be added * @field_type: Type of IDR field * @field_data: pointer to field text content * @fied_id: field id to be added * * Purpose: * Adds an Inventory Data Repository(IDR) field with specified id to * Inventory data repository Area * * Detailed Description: * - Creates an IDR field of a specified type in an IDR area * Newly created field will be inserted at the proper position * If the field list is empty then the created field will become head * node (first field) for the field list * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - Input parameters are not valid * SA_ERR_HPI_OUT_OF_MEMORY - Request failed due to insufficient memory **/ SaErrorT idr_field_add_by_id(struct oa_soap_field **head_field, SaHpiEntryIdT area_id, SaHpiIdrFieldTypeT field_type, char *field_data, SaHpiEntryIdT field_id) { struct oa_soap_field *field = NULL; struct oa_soap_field *temp_field = NULL; if (head_field == NULL || field_data == NULL || area_id == SAHPI_LAST_ENTRY || field_id == SAHPI_LAST_ENTRY) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } temp_field = *head_field; field = (struct oa_soap_field*)g_malloc0(sizeof(struct oa_soap_field)); if (!(field)) { err("OA SOAP out of memory"); return SA_ERR_HPI_OUT_OF_MEMORY; } /* Initialize the field with specified field type and ID */ field->field.AreaId = area_id; field->field.FieldId = field_id; field->field.Type = field_type; field->field.ReadOnly = SAHPI_FALSE; field->field.Field.DataType = SAHPI_TL_TYPE_TEXT; field->field.Field.Language = SAHPI_LANG_ENGLISH; oa_soap_trim_whitespace(field_data); field->field.Field.DataLength = strlen (field_data); snprintf((char *)field->field.Field.Data, field->field.Field.DataLength + 1, "%s", field_data); /* Check whether the field list is empty or if the new field is * to be inserted before first field */ if (*head_field == NULL || (*head_field)->field.FieldId > field_id) { *head_field = field; (*head_field)->next_field = temp_field; } else { while (temp_field != NULL) { if ((temp_field->field.FieldId < field_id) && ((temp_field->next_field == NULL) || (temp_field->next_field->field.FieldId > field_id))) { field->next_field = temp_field->next_field; temp_field->next_field = field; break; } temp_field = temp_field->next_field; } } return SA_OK; } /** * idr_field_delete * @oa_field: Pointer to field structure * @field_id: Identifier of the IDR field * * Purpose: * Deletes an Inventory Data Repository(IDR) field from Inventory data * repository Area * * Detailed Description: * - Deleted an IDR field of a specified id if it exists in the area * list else an appropriate error will be returned * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_NOT_PRESENT - Requested object not present **/ SaErrorT idr_field_delete(struct oa_soap_field **oa_field, SaHpiEntryIdT field_id) { struct oa_soap_field *field = NULL, *tmp_field = NULL; if (oa_field == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } field = *oa_field; /* If field list is empty, then return an error */ if (field == NULL) { return SA_ERR_HPI_NOT_PRESENT; } else { /* Check whether specified field id matches with first field id */ if (field_id == field->field.FieldId) { tmp_field = field; /* If the specified IDR field is read only, then delete * will be failed and READ ONLY error will be returned */ if (field->field.ReadOnly == SAHPI_TRUE) { return SA_ERR_HPI_READ_ONLY; } field = field->next_field; *oa_field = field; wrap_g_free(tmp_field); return SA_OK; } /* Traverse the field list to find the specified IDR field */ while (field->next_field) { tmp_field = field->next_field; if (field_id == tmp_field->field.FieldId) { if (tmp_field->field.ReadOnly == SAHPI_TRUE) { return SA_ERR_HPI_READ_ONLY; } field->next_field = tmp_field->next_field; wrap_g_free(tmp_field); return SA_OK; } else { field = field->next_field; } } } return SA_ERR_HPI_NOT_PRESENT; } /** * idr_field_update * @oa_field: Pointer to field structure * @field: Field structure containing modification information * * Purpose: * Modifies an Inventory data repository field in Inventory data repository * Area * * Detailed Description: * - Sets an IDR field of a specified field contents if it exists * else an appropriate error will be returned * - Validation of the field content is not handled in OA SOAP plug-in * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_NOT_PRESENT - Requested object not present **/ SaErrorT idr_field_update(struct oa_soap_field *oa_field, SaHpiIdrFieldT *field) { if (oa_field == NULL) { return SA_ERR_HPI_NOT_PRESENT; } if (field == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } /* Traverse the field list to find the IDR field with specified id */ while (oa_field) { if (field->FieldId == oa_field->field.FieldId) { /* If the specified IDR field is read only, then delete * will be failed and READ ONLY error will be returned */ if (oa_field->field.ReadOnly == SAHPI_TRUE) { return SA_ERR_HPI_READ_ONLY; } /* Update the field contents with the new data */ oa_field->field.Type = field->Type; oa_field->field.Field.DataType = field->Field.DataType; oa_field->field.Field.Language = field->Field.Language; oa_field->field.Field.DataLength = field->Field.DataLength; memset (oa_field->field.Field.Data, 0, SAHPI_MAX_TEXT_BUFFER_LENGTH); snprintf((char *)oa_field->field.Field.Data, oa_field->field.Field.DataLength + 1, "%s", field->Field.Data); return SA_OK; } else { oa_field = oa_field->next_field; } } return SA_ERR_HPI_NOT_PRESENT; } /** * fetch_idr_field * @inventory_info: Pointer to rdr private data * @area_id: Identifier of the area to be deleted * @field_type: Type of IDR field * @field_id: Identifier of the IDR field * @next_field_id: Identifier of the next IDR field of the requested type * @field: Pointer to field structure * * Purpose: * Gets an Inventory Data Repository(IDR) field from Inventory data * repository area * * Detailed Description: * - This function allows retrieval of an IDR field by one of * two ways: by field id regardless of type or by field type and id * - All fields within an IDR area can be retrieved by setting area type * as SAHPI_IDR_FIELDTYPE_UNSPECIFIED, field id set to SAHPI_FIRST_ENTRY * for the first call. For each subsequent call, the field id will be set * to the value returned in the next field id parameter, * this will work until next field id becomes SAHPI_LAST_ENTRY * - To retrieve all field of specific type, the above step is repeated * with the specified field type * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_NOT_PRESENT - Requested object not present **/ SaErrorT fetch_idr_field(struct oa_soap_inventory_info *inventory_info, SaHpiEntryIdT area_id, SaHpiIdrFieldTypeT field_type, SaHpiEntryIdT field_id, SaHpiEntryIdT *next_field_id, SaHpiIdrFieldT *field) { SaHpiInt32T i; struct oa_soap_area *local_area = NULL; struct oa_soap_field *local_field = NULL; SaHpiInt32T found = SAHPI_FALSE; SaHpiInt32T fieldFound = SAHPI_FALSE; if (inventory_info == NULL) { err("IDR not present"); return SA_ERR_HPI_NOT_PRESENT; } if (field == NULL || next_field_id == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } local_area = inventory_info->area_list; while (local_area != NULL) { if ((area_id == local_area->idr_area_head.AreaId)) { break; } local_area = local_area->next_area; } if (!local_area) { return SA_ERR_HPI_NOT_PRESENT; } local_field = local_area->field_list; /* Check whether field id is set to return all fields * (of a particular type if specified) */ if (field_id == SAHPI_FIRST_ENTRY) { i = 1; while ((i <= local_area->idr_area_head.NumFields) && (local_field != NULL)) { if (found == SAHPI_TRUE) { break; } if (field_type == SAHPI_IDR_FIELDTYPE_UNSPECIFIED || field_type == local_field->field.Type) { fieldFound = SAHPI_TRUE; memcpy(field, &local_field->field, sizeof(SaHpiIdrFieldT)); *next_field_id = SAHPI_LAST_ENTRY; while (local_field->next_field != NULL) { local_field = local_field->next_field; if (field_type == SAHPI_IDR_FIELDTYPE_UNSPECIFIED || field_type == local_field->field.Type) { *next_field_id = local_field-> field.FieldId; found = SAHPI_TRUE; break; } } break; } else { local_field = local_field->next_field; } i++; } } else { while (local_field != NULL) { if (found == SAHPI_TRUE) { break; } if ((field_id == local_field->field.FieldId)) { if (field_type == SAHPI_IDR_FIELDTYPE_UNSPECIFIED || field_type == local_field->field.Type) { fieldFound = SAHPI_TRUE; memcpy(field, &local_field->field, sizeof(SaHpiIdrFieldT)); *next_field_id = SAHPI_LAST_ENTRY; while (local_field->next_field != NULL) { local_field = local_field->next_field; if (field_type == SAHPI_IDR_FIELDTYPE_UNSPECIFIED || field_type == local_field->field.Type) { *next_field_id = local_field-> field.FieldId; found = SAHPI_TRUE; break; } } break; } else { break; } } local_field = local_field->next_field; } } if (fieldFound == SAHPI_FALSE) { return SA_ERR_HPI_NOT_PRESENT; } return SA_OK; } /* * free_inventory_info * @handler: Handler data pointer * @resource_id: Resource ID * * Purpose: * To delete the Areas and Fields present in * Inventory Data Repository(IDR) * * Detailed Description: * Get the IDR and traverse through each area and deletes the area. * If any error occours while deleting appropriate error is returned * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_NOT_PRESENT - Requested object not present */ SaErrorT free_inventory_info(struct oh_handler_state *handler, SaHpiResourceIdT resource_id) { SaErrorT rv = SA_OK; struct oa_soap_inventory *inventory; SaHpiEntryIdT area_id; SaHpiRdrT *rdr = NULL; if (handler == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } /* Get the inventory RDR */ rdr = oh_get_rdr_by_type(handler->rptcache, resource_id, SAHPI_INVENTORY_RDR, SAHPI_DEFAULT_INVENTORY_ID); if (rdr == NULL) { err("Inventory RDR is not found"); return SA_ERR_HPI_NOT_PRESENT; } inventory = (struct oa_soap_inventory *) oh_get_rdr_data(handler->rptcache, resource_id, rdr->RecordId); if (inventory == NULL) { err("No inventory data. IdrId=%s", rdr->IdString.Data); return SA_ERR_HPI_NOT_PRESENT; } /*Traverse through area list and delete the area*/ while (inventory->info.area_list) { area_id = inventory->info.area_list->idr_area_head.AreaId; rv = idr_area_delete(&(inventory->info.area_list), area_id); if (rv != SA_OK) { err("IDR Area delete failed"); return rv; } } wrap_g_free(inventory->comment); return SA_OK; } /* * oa_soap_inv_set_field * @area : Pointer to the area list * @area_type : Type of the area * @field_type : Type of the field * @comment : Pointer to the data * * Purpose: * Generic function to set field data * * Detailed Description: * - Searches the field based on area type and field type. * - Assigns the field data with inventory information. * * Return values: * NONE */ static void oa_soap_inv_set_field(struct oa_soap_area *area_list, SaHpiIdrAreaTypeT area_type, SaHpiIdrFieldTypeT field_type, char *data) { struct oa_soap_area *area; struct oa_soap_field *field; if (area_list == NULL) { err("Invalid parameter"); return; } /* Data can be NULL if the device is faulty */ if (data == NULL) { dbg("Can not set the field data for the field type %d", field_type); dbg("Data passed is NULL"); return; } area = area_list; /* Traverse the areas till we get area_type */ while (area) { if (area->idr_area_head.Type == area_type) { field = area->field_list; /* Traverse the fields till we get field_type */ while (field) { if (field->field.Type == field_type) { if (field->field.Type > SAHPI_IDR_FIELDTYPE_UNSPECIFIED) { field->field.Type = SAHPI_IDR_FIELDTYPE_CUSTOM; } oa_soap_trim_whitespace(data); field->field.Field.DataLength = strlen(data); strcpy((char *) field->field.Field.Data, data); return; } field = field->next_field; } } area = area->next_area; } err("Failed to find the field type %d in area %d", field_type, area_type); return; } /* * oa_soap_add_inv_fields * @area : Pointer to the area * @field_list : Pointer to the field list in the global array * * Purpose: * Generic function add the fields to the area * * Detailed Description: * - Gets the number of fields from the area * - Allocates the memory for the field and constructs the field list * * Return values: * NONE */ static void oa_soap_add_inv_fields(struct oa_soap_area *area, const struct oa_soap_field field_array[]) { struct oa_soap_field **field; SaHpiInt32T i; if (area == NULL || field_array == NULL) { err("Invalid parameters"); return; } field = &(area->field_list); for (i = 0; i < area->idr_area_head.NumFields; i++) { *field = g_memdup(&(field_array[i].field), sizeof(struct oa_soap_field)); field = &((*field)->next_field); } return; } /* * oa_soap_add_inv_areas * @area : Pointer to the inventory structure * @resource_type : Resource type * * Purpose: * To add the areas to the area_list * * Detailed Description: * - Gets the number of areas from the IDR header * - Allocates the memory for the areas and constructs the area list * * Return values: * NONE */ static void oa_soap_add_inv_areas(struct oa_soap_inventory *inventory, SaHpiInt32T resource_type) { struct oa_soap_area **area; SaHpiInt32T i, num_areas; if (inventory == NULL) { err("Invalid parameter"); return; } /* Point to the location of the area_list pointer of inventory */ area = &(inventory->info.area_list); /* Get the number of areas supported for the resource type */ num_areas = oa_soap_inv_arr[resource_type].inventory.info.idr_info.NumAreas; for (i = 0; i < num_areas; i++) { *area = g_memdup(&(oa_soap_inv_arr[resource_type].area_array[i]. area), sizeof(struct oa_soap_area)); /* Add the fields to the newly added area */ oa_soap_add_inv_fields(*area, oa_soap_inv_arr[resource_type]. area_array[i].field_array); /* Point to the location of the next area pointer */ area = &((*area)->next_area); } return; } /* * oa_soap_build_inv * @oh_handler : Pointer to the handler * @resource_type : Resource type * @resource_id : Resource Id * @rdr : Pointer to the rdr structure * * Purpose: * Generic function to build the inventory RDR * * Detailed Description: * - Allocates the memory for inventory info * - Builds the area and field list from global inventory array * - Copies the inventory RDR information from global inventory array * - Pushes the inventory RDR to plugin rptcache * * Return values: * SA_OK - On success * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_OUT_OF_MEMORY - On memory allocatin failure * SA_ERR_HPI_NOT_PRESENT - On wrong resource id */ static SaErrorT oa_soap_build_inv(struct oh_handler_state *oh_handler, SaHpiInt32T resource_type, SaHpiResourceIdT resource_id, struct oa_soap_inventory **inventory) { SaHpiRdrT rdr; SaHpiRptEntryT *rpt; SaErrorT rv; if (oh_handler == NULL || inventory == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } /* Get the rpt entry of the resource */ rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (rpt == NULL) { err("resource RPT is NULL"); return SA_ERR_HPI_NOT_PRESENT; } /* Get the inventory from the global array */ *inventory = g_memdup(&(oa_soap_inv_arr[resource_type].inventory), sizeof(struct oa_soap_inventory)); if (*inventory == NULL) { err("Out of memory"); return SA_ERR_HPI_OUT_OF_MEMORY; } rdr = oa_soap_inv_arr[resource_type].rdr; rdr.Entity = rpt->ResourceEntity; /* Populate the areas */ oa_soap_add_inv_areas(*inventory, resource_type); rv = oh_add_rdr(oh_handler->rptcache, resource_id, &rdr, *inventory, 0); if (rv != SA_OK) { err("Failed to add rdr"); return rv; } return SA_OK; } /* * oa_soap_build_fz_inv * @oh_handler : Pointer to the handler * @resource_id : Resource Id * @fanZone : Pointer to structure fanZone * * Purpose: * Builds the inventory RDR for fan zone * * Detailed Description: * - Gets the fan inventory information * - Builds the inventory RDR * - Populates the device bays and fan bays * * Return values: * SA_OK - On success * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INERNAL_ERROR - On soap call failure */ SaErrorT oa_soap_build_fz_inv(struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, struct fanZone *fan_zone) { SaErrorT rv; struct oa_soap_inventory *inventory = NULL; char *temp, field_data[MAX_BUF_SIZE]; char temp1[MAX_BUF_SIZE] = {'\0'}; char temp2[MAX_BUF_SIZE] = {'\0'}; SaHpiInt32T len, write_size = OA_SOAP_MAX_FZ_NUM_SIZE + 3; struct fanInfo info; byte bay; if (oh_handler == NULL || fan_zone == NULL) { err("Invalid Parameters"); return SA_ERR_HPI_INVALID_PARAMS; } rv = oa_soap_build_inv(oh_handler, OA_SOAP_ENT_FZ, resource_id, &inventory); if (rv != SA_OK) { err("Building inventory RDR for Fan Zone failed"); return rv; } /* Construct the device bays field data*/ /* Set the field_data to 0. This helps the strlen (5 lines down) to get * correct string length */ memset(field_data, 0, OA_SOAP_MAX_FZ_INV_SIZE); temp = field_data; while (fan_zone->deviceBayArray) { soap_deviceBayArray(fan_zone->deviceBayArray, &bay); /* Check whether we have reached the end of field_data array */ if ((strlen(field_data) + write_size) >= OA_SOAP_MAX_FZ_INV_SIZE) { err("The field_data size smaller, it may lead to " "potential memory overflow problem"); return SA_ERR_HPI_INTERNAL_ERROR; } snprintf(temp, write_size, "%d,", bay); /* Point the temp to end of data */ temp += strlen(temp); fan_zone->deviceBayArray = soap_next_node(fan_zone->deviceBayArray); } /* Remove the last ',' from data */ len = strlen(field_data); field_data[len - 1] = '\0'; /* Adding the string "Device Bays =" in the starting of field_data */ memcpy(temp1, field_data, len); memcpy(field_data, "Device Bays = ", sizeof("Device Bays = ")); memcpy(field_data + strlen(field_data), temp1, strlen(temp1)); /* Set the device bays field data */ oa_soap_inv_set_field(inventory->info.area_list, SAHPI_IDR_AREATYPE_OEM, OA_SOAP_INV_FZ_DEV_BAY, field_data); /* Construct the fan bays field data*/ /* Set the field_data to 0. This helps the strlen (5 lines down) to get * correct string length */ memset(field_data, 0, OA_SOAP_MAX_FZ_INV_SIZE); temp = field_data; while (fan_zone->fanInfoArray) { soap_fanInfo(fan_zone->fanInfoArray, &info); /* Check whether we have reached the end of field_data array */ if ((strlen(field_data) + write_size) >= OA_SOAP_MAX_FZ_INV_SIZE) { err("The field_data size smaller, it may lead to " "potential memory overflow problem"); return SA_ERR_HPI_INTERNAL_ERROR; } snprintf(temp, write_size, "%d,", info.bayNumber); /* Point the temp to end of data */ temp += strlen(temp); fan_zone->fanInfoArray = soap_next_node(fan_zone->fanInfoArray); } /* Remove the last ',' from data */ len = strlen(field_data); field_data[len - 1] = '\0'; /* Adding the string "Fan Bays =" in the starting of field_data */ memcpy(temp2, field_data, len); memcpy(field_data, "Fan Bays = ", sizeof("Fan Bays = ")); memcpy(field_data + strlen(field_data), temp2, strlen(temp2)); /* Set the fan bays field data */ oa_soap_inv_set_field(inventory->info.area_list, SAHPI_IDR_AREATYPE_OEM, OA_SOAP_INV_FZ_FAN_BAY, field_data); return SA_OK; } /* * oa_soap_build_fan_inv * @oh_handler : Pointer to the handler * @resource_id : Resource Id * @fan_info : Pointer to fanInfo structure * * Purpose: * Builds the inventory RDR for fan * * Detailed Description: * - Gets the fan inventory information * - Builds the inventory RDR * - Populates the inventory info with product name, part number, serial * number, primary fan zone, secondary fan zone and shared status * * Return values: * SA_OK - On success * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INERNAL_ERROR - On soap call failure */ SaErrorT oa_soap_build_fan_inv(struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, struct fanInfo *fan_info) { SaErrorT rv; struct oa_soap_handler *oa_handler; struct oa_soap_inventory *inventory = NULL; char field_data[OA_SOAP_MAX_FZ_INV_SIZE]; SaHpiInt32T slot; if (oh_handler == NULL || fan_info == NULL) { err("Invalid Parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; if(oa_handler->enc_type == OA_SOAP_ENC_C3000){ rv = oa_soap_build_inv(oh_handler, OA_SOAP_ENT_FAN_C3000, resource_id, &inventory); } else { rv = oa_soap_build_inv(oh_handler, OA_SOAP_ENT_FAN, resource_id, &inventory); } if (rv != SA_OK) { err("Building inventory RDR for Fan failed"); return rv; } /* Set the product name*/ oa_soap_inv_set_field(inventory->info.area_list, SAHPI_IDR_AREATYPE_PRODUCT_INFO, SAHPI_IDR_FIELDTYPE_PRODUCT_NAME, fan_info->name); /* Set the part number */ oa_soap_inv_set_field(inventory->info.area_list, SAHPI_IDR_AREATYPE_BOARD_INFO, SAHPI_IDR_FIELDTYPE_PART_NUMBER, fan_info->partNumber); /* Set the serial number */ oa_soap_inv_set_field(inventory->info.area_list, SAHPI_IDR_AREATYPE_PRODUCT_INFO, SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER, fan_info->serialNumber); memset(field_data, 0, OA_SOAP_MAX_FZ_INV_SIZE); slot = fan_info->bayNumber; /* Construct the fan shared field data */ if (oa_soap_fz_map_arr[oa_handler->enc_type][slot-1].shared == SAHPI_TRUE) strcpy(field_data, "Shared = TRUE"); else strcpy(field_data, "Shared = FALSE"); /* Set the fan shared field * we don't want to execute this for a c3000 enclosure * we don't have any fan shared and also we don't have * area_list created for shared fan */ if(oa_handler->enc_type != OA_SOAP_ENC_C3000){ oa_soap_inv_set_field(inventory->info.area_list, SAHPI_IDR_AREATYPE_OEM, OA_SOAP_INV_FAN_SHARED, field_data); } /* Construct the fan zone number field data */ memset(field_data, 0, OA_SOAP_MAX_FZ_INV_SIZE); if (oa_soap_fz_map_arr[oa_handler->enc_type][slot-1].secondary_zone) { snprintf(field_data, 15, "Fan Zone = %d,%d", oa_soap_fz_map_arr[oa_handler->enc_type][slot-1].zone, oa_soap_fz_map_arr[oa_handler->enc_type][slot-1]. secondary_zone); } else { snprintf(field_data, 13, "Fan Zone = %d", oa_soap_fz_map_arr[oa_handler->enc_type][slot-1].zone); } /* Set the shared field * Since we don't have fan zone assigned to each fan * we don't want to assign/set a fan zone number field */ if(oa_handler->enc_type != OA_SOAP_ENC_C3000){ oa_soap_inv_set_field(inventory->info.area_list, SAHPI_IDR_AREATYPE_OEM, OA_SOAP_INV_FZ_NUM, field_data); } return SA_OK; } /* * oa_soap_build_lcd_inv * @oh_handler : Pointer to the handler * @resource_id : Resource Id * * Purpose: * Builds the inventory RDR for LCD * * Detailed Description: * - Gets the LCD inventory information * - Builds the inventory RDR * - Populates the inventory info with product name, manufacturer name, * part number and firmware version * * Return values: * SA_OK - On success * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INERNAL_ERROR - On soap call failure */ SaErrorT oa_soap_build_lcd_inv(struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id) { SaErrorT rv; struct oa_soap_handler *oa_handler; struct oa_soap_inventory *inventory = NULL; struct lcdInfo info; if (oh_handler == NULL) { err("Invalid Parameters"); return SA_ERR_HPI_INVALID_PARAMS; } rv = oa_soap_build_inv(oh_handler, OA_SOAP_ENT_LCD, resource_id, &inventory); if (rv != SA_OK) { err("Building inventory RDR for LCD failed"); return rv; } oa_handler = (struct oa_soap_handler *) oh_handler->data; /* Get the LCD info */ rv = soap_getLcdInfo(oa_handler->active_con, &info); if (rv != SOAP_OK) { err("Get LCD Info SOAP call has failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Set the product name */ oa_soap_inv_set_field(inventory->info.area_list, SAHPI_IDR_AREATYPE_PRODUCT_INFO, SAHPI_IDR_FIELDTYPE_PRODUCT_NAME, info.name); /* Set the manufacturer name */ oa_soap_inv_set_field(inventory->info.area_list, SAHPI_IDR_AREATYPE_PRODUCT_INFO, SAHPI_IDR_FIELDTYPE_MANUFACTURER, info.manufacturer); /* Set the part number */ oa_soap_inv_set_field(inventory->info.area_list, SAHPI_IDR_AREATYPE_BOARD_INFO, SAHPI_IDR_FIELDTYPE_PART_NUMBER, info.partNumber); /* Set the firmware version */ oa_soap_inv_set_field(inventory->info.area_list, SAHPI_IDR_AREATYPE_PRODUCT_INFO, SAHPI_IDR_FIELDTYPE_PRODUCT_VERSION, info.fwVersion); return SA_OK; } void * oh_get_idr_info(void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrInfoT) __attribute__ ((weak, alias("oa_soap_get_idr_info"))); void * oh_get_idr_area_header(void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrAreaTypeT, SaHpiEntryIdT, SaHpiEntryIdT, SaHpiIdrAreaHeaderT) __attribute__ ((weak, alias("oa_soap_get_idr_area_header"))); void * oh_add_idr_area(void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrAreaTypeT, SaHpiEntryIdT) __attribute__ ((weak, alias("oa_soap_add_idr_area"))); void * oh_add_idr_area_id(void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrAreaTypeT, SaHpiEntryIdT) __attribute__ ((weak, alias("oa_soap_add_idr_area_by_id"))); void * oh_del_idr_area(void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT) __attribute__ ((weak, alias("oa_soap_del_idr_area"))); void * oh_get_idr_field(void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT, SaHpiIdrFieldTypeT, SaHpiEntryIdT, SaHpiEntryIdT, SaHpiIdrFieldT) __attribute__ ((weak, alias("oa_soap_get_idr_field"))); void * oh_add_idr_field(void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrFieldT) __attribute__ ((weak, alias("oa_soap_add_idr_field"))); void * oh_add_idr_field_id(void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrFieldT) __attribute__ ((weak, alias("oa_soap_add_idr_field_by_id"))); void * oh_set_idr_field(void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrFieldT) __attribute__ ((weak, alias("oa_soap_set_idr_field"))); void * oh_del_idr_field(void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT, SaHpiEntryIdT) __attribute__ ((weak, alias("oa_soap_del_idr_field"))); openhpi-3.6.1/plugins/oa_soap/oa_soap_dimi.h0000644000175100017510000000745012575647270020076 0ustar mohanmohan/* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Anand S */ #ifndef _OA_SOAP_DIMI_H #define _OA_SOAP_DIMI_H /* Include files */ #include #include SaErrorT oa_soap_get_dimi_info( void *oh_handler, SaHpiSessionIdT session_id, SaHpiResourceIdT resource_id, SaHpiDimiNumT dimi_num, SaHpiDimiInfoT *dimi_info); SaErrorT oa_soap_get_dimi_test( void *oh_handler, SaHpiSessionIdT session_id, SaHpiResourceIdT resource_id, SaHpiDimiNumT dimi_num, SaHpiDimiTestNumT dimi_testnum, SaHpiDimiTestT *dimi_test); SaErrorT oa_soap_get_dimi_test_ready( void *oh_handler, SaHpiSessionIdT session_id, SaHpiResourceIdT resource_id, SaHpiDimiNumT dimi_num, SaHpiDimiTestNumT dimi_testnum, SaHpiDimiReadyT *dimi_test_ready); SaErrorT oa_soap_start_dimi_test( void *oh_handler, SaHpiSessionIdT session_id, SaHpiResourceIdT resource_id, SaHpiDimiNumT dimi_num, SaHpiDimiTestNumT dimi_testnum, SaHpiUint8T params, SaHpiDimiTestVariableParamsT *param_list); SaErrorT oa_soap_cancel_dimi_test( void *oh_handler, SaHpiSessionIdT session_id, SaHpiResourceIdT resource_id, SaHpiDimiNumT dimi_num, SaHpiDimiTestNumT dimi_testnum); SaErrorT oa_soap_get_dimi_test_status( void *oh_handler, SaHpiSessionIdT session_id, SaHpiResourceIdT resource_id, SaHpiDimiNumT dimi_num, SaHpiDimiTestNumT dimi_testnum, SaHpiDimiTestPercentCompletedT* complete, SaHpiDimiTestRunStatusT *status); SaErrorT oa_soap_get_dimi_test_result( void *oh_handler, SaHpiSessionIdT session_id, SaHpiResourceIdT resource_id, SaHpiDimiNumT dimi_num, SaHpiDimiTestNumT dimi_testnum, SaHpiDimiTestResultsT *test_result); #endif openhpi-3.6.1/plugins/oa_soap/oa_soap_callsupport.c0000644000175100017510000012505312575647270021517 0ustar mohanmohan/* * Copyright (C) 2007-2009, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Bryan Sutula * Mohan Devarajulu * * * This file implements support functions that are used to perform SOAP * calls. There are four general classes of functions implemented in this * file: session management, soap call requests, XML response tree parsing, * and general utility calls. (Note that some of these are implemented as * macros, in the oa_soap_callsupport.h include file.) The specific calls * are as follows: * * Session Management: * soap_open() - Opens a connection to an OA using the * SOAP/XML protocol * soap_close() - Close a connection opened with soap_open() * * Soap Call Requests: * soap_request() - Main XML/SOAP request function, used by the * individual SOAP client call functions to * communicate with the OA * * XML Response Tree Parsing: * soap_find_node() - Recursively searches an XML tree, starting * with a specified node, looking for the * specified named node * soap_walk_tree() - Beginning with the specified node, walk an * XML tree to find the destination node, * based on a pattern of named nodes * soap_walk_doc() - Same as soap_walk_tree() but begins at the * root of the XML document * soap_value() - Returns the value at this part of the XML * tree, in particular, the node's child's * content field * soap_tree_value() - A convenience combination of soap_walk_tree() * and soap_value, heavily used in response * parameter parsing * soap_next_node() - When walking a list (array) of soap call * response values, this function gets you to * the next response node * soap_enum() - Performs enum string matching, which would * otherwise require a large amount of parameter * parsing code * soap_inv_enum() - Performs the inverse of soap_enum() * * General Utility: * soap_ignore_errors() - Used when a SOAP call error is expected, and * does not necessarily indicate a problem. * soap_error_number() - Returns the last SOAP call error number; * perhaps used when soap_ignore_errors() has * disabled error reporting. * soap_error_string() - Returns the last SOAP call error string. * soap_timeout() - Reads or writes the current connection * timeout value, in seconds */ /* Include files */ #include #include #include #include #include "oa_soap_callsupport.h" #include "sahpi_wrappers.h" /* Include file check */ #ifndef LIBXML_PUSH_ENABLED #error This source file requires LIBXML_PUSH_ENABLED functionality in libxml2 #endif /* Local data types */ enum soap_error_enum { SOAP_NO_ERROR, SOAP_ERROR, SOAP_INVALID_SESSION }; /* Forward declarations of static functions */ static int soap_login(SOAP_CON *connection); static int soap_logout(SOAP_CON *connection); /** * soap_find_node * @node: pointer to an XML subtree * @s_name: string that is being searched * * Searches an XML subtree, looking for a named node. * * Return value: the XML node, if found, or NULL. **/ xmlNode *soap_find_node(xmlNode *node, char *s_name) { xmlNode *c_node; while (node != NULL){ if (!xmlStrcmp(node->name, (const xmlChar *)s_name)){ return(node); } c_node = soap_find_node(node->xmlChildrenNode, s_name); if (c_node != NULL){ return(c_node); } node = node->next; } return(NULL); } /** * soap_walk_tree * @node: pointer to an XML subtree * @colonstring: node name strings that are being searched; for example, to * search for nodes "a", then "b", then "c", pass "a:b:c" * * Searches an XML subtree, looking for a named node. Very similar to * soap_find_node() above, but uses an entirely different algorithm, both for * efficiency and to make response parsing more pedantic. * * The passed colonstring is a list of tree node names separated by ':'. At * each level of the tree, the corresponding name must match. This means that * the whole XML tree doesn't need to be searched, and that you know you've * found the right node, not one that is similarly-named but is in a different * part of the XML tree. * * Return value: the XML node, if found, or NULL. **/ xmlNode *soap_walk_tree(xmlNode *node, char *colonstring) { char *next; char *c; int len; /* Length of node name string */ if ((! node) || (! colonstring) || (! *colonstring) || (*colonstring == ':')) { return(NULL); } /* Break string at ':' */ c = strchr(colonstring, ':'); if (c) { len = c - colonstring; next = c + 1; } else { len = strlen(colonstring); next = colonstring + len; } /* Look for this in the node tree's children */ node = node->children; while (node) { if ((! xmlStrncmp(node->name, (const xmlChar *)colonstring, len)) && (xmlStrlen(node->name) == len)) { if (*next) { return(soap_walk_tree(node, next)); } else { /* Done searching */ return(node); } } node = node->next; } return(NULL); } /** * soap_walk_doc * @doc: pointer to an XML document * @colonstring: node name strings that are being searched; for example, to * search for nodes "a", then "b", then "c", pass "a:b:c" * * Same as soap_walk_tree(), but first obtains the root XML node from an XML * document. * * Note: This could be a #define, but is generally called only once for each * OA SOAP call. Having it as a function makes it easier to interpret any * compiler errors or warnings regarding parameter mismatches. * * Return value: the XML node, if found, or NULL. **/ xmlNode *soap_walk_doc(xmlDocPtr doc, char *colonstring) { /* Null doc pointer passes through without error, apparently */ return(soap_walk_tree(xmlDocGetRootElement(doc), colonstring)); } /** * soap_value * @node: pointer to an XML subtree * * Returns the value at this part of the XML tree. The value is the node's * child's content field. * * Return value: a string pointer to the XLM content field. NULL is returned * if there is any sort of problem accessing the value. **/ char *soap_value(xmlNode *node) { if ((node) && (node->children) && (node->children->content)) { return((char *)(node->children->content)); } return(NULL); } /** * soap_tree_value * @node: pointer to an XML subtree * @colonstring: node name strings that are being searched; for example, to * search for nodes "a", then "b", then "c", pass "a:b:c" * * soap_tree_value() is a heavily-used combination of soap_walk_tree() and * soap_value(), both described above. Generally used to locate specific * response parameters and obtain their values. NULL is returned if anything * goes wrong with the response, so callers must be prepared for that value. * * Return value: a string pointer to the XLM content field. NULL is returned * if there is any sort of problem accessing the value. **/ char *soap_tree_value(xmlNode *node, char *colonstring) { return(soap_value(soap_walk_tree(node, colonstring))); } /** * soap_next_node * @node: pointer to an XML subtree * * When walking a list (array) of soap call response values, it is necessary * to have a function that moves to the next response value. This is that * function. Think of it as the function used in place of "node = node->next", * for XML response trees. * * Extra work is required because the XML response tree can contain essentially * empty nodes. For example, newlines and other formatting characters occupy * XML nodes, even though they don't contain useful response content. * * Return value: If there are more values in this response array, the next * array node is returned. Otherwise, the return value is NULL. **/ xmlNode *soap_next_node(xmlNode *node) { if (! node) { return(NULL); } node = node->next; while (node) { if ((node->children) && (node->children->content)) { return(node); } node = node->next; } return(NULL); } /** * soap_enum * @enums: Combined enum value string, as generated by the OA_SOAP_ENUM() * macro. Generally, this is the type name of the enum followed * by "_S". * @value: The string that should match one of the enum value names * * Performs enum string matching, which would otherwise require a large amount * of parameter parsing code. * * The general problem is that the OA returnes a large number of enum values. * These come across as strings, and need to be matched back to enum values. * There would be a large amount of string matching code to do this job. * * Instead, during the definition of each enum, a single string is also created * containing the string values that need to be matched. A single call to * strstr() will locate the enum value in the string, and then it's position in * the combined enum string determines the enum value to be returned. * * Return value: The enum value (a non-negative integer) if a match is found. * If there is no successful match, the value -1 is returned. **/ int soap_enum(const char *enums, char *value) { char *found; const char *start = enums; int n = 0; int len; if (! value) { /* Can't proceed without a string */ err("could not find enum (NULL value) in \"%s\"", enums); return(-1); } len = strlen(value); /* We have to search repeatedly, in case the match is just a substring * of an enum value. */ while (start) { found = strstr(start, value); /* To match, a value must be found, it must either be at the * start of the string or be preceeded by a space, and must * be at the end of the string or be followed by a ',' */ if ((found) && ((found == start) || (*(found - 1) == ' ')) && ((*(found + len) == ',') || (*(found + len) == '\0'))) { /* Having found a match, count backwards to see which * enum value should be returned. */ while (--found >= enums) { if (*found == ',') n++; } return(n); } if (found) { /* We found something but it was a substring. We need * to search again, but starting further along in the * enums string. */ start = found + len; } else { start = NULL; /* We won't search any more */ } } err("could not find enum value \"%s\" in \"%s\"", value, enums); return(-1); } /** * soap_inv_enum * @result: A string buffer big enough to hold any of the enum names. * This is the ASCII string that can be sent to the OA. * @enums: Combined enum value string, as generated by the OA_SOAP_ENUM() * macro. Generally, this is the type name of the enum followed * by "_S". * @value: The enum value that is to be converted to an ASCII string * * Performs roughly the inverse of soap_enum(), for very similar reasons. * * In this case, the user provides an enum value, and we need to send an ASCII * string to the OA. Instead of a case statement, this function uses the same * combined enum value string to produce the string that needs to go to across * the wire. * * The process is to count the enum value separators (the ',') placed by the * OA_SOAP_ENUM() macro and find the right enum name string. It is necessary * to copy this string to a temporary buffer, because the string will become * an argument to sprintf(), and needs to be null-terminated. Therefore, the * caller must provide a buffer big enough for the resulting string. * * Note that there are no error checks on the buffer size, so please ensure * that "result" is big enough for any of the enum names. * * Return value: If "value" refers to a valid enum, soap_inv_enum() returns 0 * and "result" will contain the desired ASCII string. If there is no enum * string for the passed value, -1 is returned. **/ int soap_inv_enum(char *result, const char *enums, int value) { char *found; int len; if (value < 0) { /* Error check */ err("inappropriate value"); return(-1); } while (value && enums) { enums = strchr(enums, ',') + 1; value--; } if (! enums) { err("can't find enum"); return(-1); } if (*enums == ' ') enums++; found = strchr(enums, ','); if (found) len = found - enums; else len = strlen(enums); strncpy(result, enums, len); result[len] = '\0'; return(0); } /** * soap_open * @server: String containing a server and port, such as "ccc2:443" or * "192.168.1.123:443". This string is passed, unchanged, to * BIO_set_conn_hostname(), so refer to that man page for details * on what types of strings can be used. * @username: Username to be used when performing OA SOAP calls. Generally, * this needs to be configured on the OA before the OA SOAP call * library can be used. * @password: Password for the above "username" * @timeout: OA SOAP response timeout, in seconds. If zero, SOAP requests * will wait forever. * * Opens a session to an OA using the SOAP/XML protocol. The rest of the SOAP * support calls use this session to perform SOAP requests. Note that this * call performs the initial OA login, so that a caller can be assured that the * complete connection to the OA is available. * * SOAP sessions encapsulate the following functionality: * - Maintain the SSL information necessary to talk to the OA * - Keep the username and password used when performing SOAP requests * - Take care of any necessary login calls * - Implement optional timeouts while reading SOAP response values * - Manage request and response buffers needed by the OA SOAP protocol * - Perform basic error checking during SOAP requests * * Note that while thread-safe calls are used (depending on compile options), * the semantics of the SOAP support calls require that each thread maintain * it's own SOAP session. So a threaded application will need to use * soap_open() in each thread. * * Return value: The new SOAP_CON connection structure if successful, or NULL * on failure. **/ SOAP_CON *soap_open(char *server, char *username, char *password, long timeout) { SOAP_CON *connection = NULL; /* Basic pass parameter checking */ if ((server == NULL) || (*server == '\0')) { err("missing remote server"); return(NULL); } if (!strcmp(server,"0.0.0.0:443")) { err("Invalid OA IP 0.0.0.0."); return(NULL); } if ((username == NULL) || (*username == '\0')) { err("missing OA username"); return(NULL); } if ((password == NULL) || (*password == '\0')) { err("missing OA password"); return(NULL); } if (timeout < 0) { err("inappropriate timeout value"); return(NULL); } /* This will check for potential ABI mismatches between the compiled * version and the installed library. If there are mismatches, I'm * afraid the calling program will die here, but that may be better * than allowing the situation to continue. */ LIBXML_TEST_VERSION /* Get a new OA SOAP connection structure and initialize it */ connection = g_malloc0(sizeof(SOAP_CON)); /* New connection */ if (! connection) { err("out of memory"); return(NULL); } strncpy(connection->server, server, OA_SOAP_SERVER_SIZE); strncpy(connection->username, username, OA_SOAP_USER_SIZE); strncpy(connection->password, password, OA_SOAP_USER_SIZE); connection->server[OA_SOAP_SERVER_SIZE] = '\0'; connection->username[OA_SOAP_USER_SIZE] = '\0'; connection->password[OA_SOAP_USER_SIZE] = '\0'; connection->timeout = timeout; connection->session_id[0] = '\0'; connection->doc = NULL; connection->req_buf[0] = '\0'; connection->req_high_water = 0; soap_ignore_errors(connection, 0); connection->last_error_number = 0; connection->last_error_string = NULL; /* Create and initialize a new SSL_CTX structure */ if (! (connection->ctx = oh_ssl_ctx_init())) { err("oh_ssl_ctx_init() failed"); free(connection); return(NULL); } /* Login to the OA, saving session information */ if (soap_login(connection)) { err("OA login failed for server %s", connection->server); if (oh_ssl_ctx_free(connection->ctx)) { err("oh_ssl_ctx_free() failed"); } if (connection->doc) { xmlFreeDoc(connection->doc); } free(connection); return(NULL); } return(connection); /* Successful soap_open() */ } /** * soap_close * @connection: OA SOAP connection provided by soap_open() * * Closes a session previously opened with soap_open(), freeing any resources * allocated for this session. After making this call, the SOAP_CON structure * pointer can no longer be used. * * Return value: (none) **/ void soap_close(SOAP_CON *connection) { /* Error checking */ if (! connection) { err("NULL connection pointer in soap_close()"); return; } /* Log out of the current OA session */ if (connection->session_id[0] != '\0') { if (soap_logout(connection)) { err("OA logout failed"); /* Continuing to try to free remaining resources */ } } /* Free the SSL_CTX structure */ if (oh_ssl_ctx_free(connection->ctx)) { err("oh_ssl_ctx_free() failed"); } /* Free our OA SOAP connection data structure */ if (connection->doc) { xmlFreeDoc(connection->doc); } /* Buffer size debug information */ dbg("Request buffer used %d out of %d", connection->req_high_water, OA_SOAP_REQ_BUFFER_SIZE); wrap_g_free(connection); /* Note that soap_open() initialized the SSL library, but * soap_close() does nothing to clean up and free SSL objects. * This is because the SSL library may still be in use by other * SOAP connections, or even other plugins. There is probably * no way to provide workable clean-up code for SSL in this * environment, so it won't get released completely until the * application (the OpenHPI daemon) exits. */ } /** * soap_message * @connection: OA SOAP connection provided by soap_open() * @request: Request SOAP command, NULL-terminated * @doc: The address of an XML document pointer (filled in by this call) * * Used internally to communicate with the OA. Request buffer is provided by * the caller. The OA's response is parsed into an XML document, which is * then pointed to by @doc. * * This call includes creating the SOAP request header, sending it to the * server, sending the SOAP request, and reading the SOAP response. * * Return value: 0 for a successful SOAP call, -1 for a variety of errors, * and -2 for a response timeout. **/ static int soap_message(SOAP_CON *connection, char *request, xmlDocPtr *doc) { int nbytes = 0; int ret = 0; char * header=NULL; char response[OA_SOAP_RESP_BUFFER_SIZE]; xmlParserCtxtPtr parse = NULL; /* Error checking */ if (! connection) { err("NULL connection pointer in soap_message()"); return(-1); } if (! request) { err("NULL request buffer in soap_message()"); return(-1); } /* Start SSL connection */ connection->bio = oh_ssl_connect(connection->server, connection->ctx, connection->timeout); if (! connection->bio) { err("oh_ssl_connect() failed"); return(-1); } /* Develop header string */ nbytes = strlen(request); if (connection->req_high_water < nbytes) connection->req_high_water = nbytes; ret = asprintf(&header, OA_XML_HEADER, connection->server, nbytes); if(ret == -1){ free(header); err("Failed to allocate memory for buffer to \ hold OA XML header"); return(-1); } /* TODO: On that last line, I think server includes port...fix that, * though it doesn't seem to be causing any problems. */ /* Write header to server */ dbg("OA request(1):\n%s\n", header); if (oh_ssl_write(connection->bio, header, strlen(header), connection->timeout)) { (void) oh_ssl_disconnect(connection->bio, OH_SSL_BI); err("oh_ssl_write() failed"); free(header); return(-1); } free(header); /* Write request to server */ dbg("OA request(2):\n%s\n", request); if (oh_ssl_write(connection->bio, request, nbytes, connection->timeout)) { (void) oh_ssl_disconnect(connection->bio, OH_SSL_BI); err("oh_ssl_write() failed"); return(-1); } /* Read response from server using oh_ssl_read() * * Note that the response seems to come back in two pieces. The * first is the http header. The second is the XML document that * I generally want. For now, I'm throwing away the first part. * * TODO: Need to check to see if this is always the case. */ nbytes = oh_ssl_read(connection->bio, response, OA_SOAP_RESP_BUFFER_SIZE - 1, connection->timeout); if (nbytes <= 0) { (void) oh_ssl_disconnect(connection->bio, OH_SSL_UNI); if (nbytes != -2) { err("oh_ssl_read() part 1 failed"); return(-1); } return(-2); /* Timeout */ } response[nbytes] = '\0'; dbg("OA response(0):\n%s\n", response); /* OK...here's the plan: * * There's an XML parsing function that parses in chunks. We'll get * the first buffer chunk and parse it. If it's the last, we're done. * Otherwise, get more chunks and parse them until something complains. */ nbytes = oh_ssl_read(connection->bio, response, OA_SOAP_RESP_BUFFER_SIZE - 1, connection->timeout); if (nbytes <= 0) { (void) oh_ssl_disconnect(connection->bio, OH_SSL_UNI); if (nbytes != -2) { err("oh_ssl_read() first chunk failed"); return(-1); } return(-2); /* Timeout */ } response[nbytes] = '\0'; dbg("OA response(1):\n%s\n", response); parse = xmlCreatePushParserCtxt(NULL, NULL, response, nbytes, NULL); if (! parse) { (void) oh_ssl_disconnect(connection->bio, OH_SSL_BI); err("failed to create XML push parser context"); return(-1); } /* Remaining chunks */ while ((nbytes = oh_ssl_read(connection->bio, response, OA_SOAP_RESP_BUFFER_SIZE - 1, connection->timeout)) > 0) { if (nbytes < 0) { (void) oh_ssl_disconnect(connection->bio, OH_SSL_UNI); xmlFreeParserCtxt(parse); if (nbytes == -1) { err("oh_ssl_read() other chunks failed"); } return(nbytes); } else { response[nbytes] = '\0'; dbg("OA response(2):\n%s\n", response); ret = xmlParseChunk(parse, response, nbytes, 0); if (ret) { /* Parse error */ err("xmlParseChunk() failed with error %d", ret); (void) oh_ssl_disconnect(connection->bio, OH_SSL_BI); xmlFreeParserCtxt(parse); return(-1); } } } /* We're done with the SSL connection. Close it first. */ if (oh_ssl_disconnect(connection->bio, OH_SSL_BI)) { err("oh_ssl_disconnect() failed"); return(-1); } connection->bio = NULL; /* Finish up the XML parsing */ xmlParseChunk(parse, response, 0, 1); *doc = parse->myDoc; if ((! doc) || (! parse->wellFormed)) { err("failed to parse XML response from OA"); xmlFreeParserCtxt(parse); return(-1); } xmlFreeParserCtxt(parse); return(0); } /** * soap_login * @connection: OA SOAP connection provided by soap_open() * * Used internally to login to the OA. This is executed when we don't have a * valid session ID, or the OA says the session ID is (no longer) valid. * * Internal buffers are used, so that the contents of the main SOAP command * buffer is not disturbed, in case the login needs to be done during a SOAP * call. * * Note that short timeout periods may cause a timeout error, but this * condition will not be separately reported. * * Return value: 0 for a successful SOAP call, and -1 for a variety of errors. **/ static int soap_login(SOAP_CON *connection) { int ret = 0; char * buf = NULL; xmlDocPtr doc; xmlNode *login_element; xmlNode *fault; xmlNode *oa_err; char *sess_id; /* Error checking */ if (! connection) { err("NULL connection pointer in soap_login()"); return(-1); } if (connection->session_id[0] != '\0') { err("already have a session ID in soap_login()"); /* Continuing for now */ connection->session_id[0] = '\0'; /* in case of error later */ } /* Generate login request */ ret = asprintf(&buf, OA_XML_LOGIN, connection->username, connection->password); if(ret == -1){ free(buf); err("Failed to allocate memory for buffer to hold \ OA login credentials"); return -1; } /* Perform login request */ if (soap_message(connection, buf, &doc)) { err("failed to communicate with OA during login"); free(buf); return(-1); } free(buf); /* Parse looking for session ID. * * Note that we don't want to use use the connection's doc pointer * because it will complicate the soap_call() logic. */ login_element = soap_walk_doc(doc, "Body:userLogInResponse:" "HpOaSessionKeyToken:oaSessionKey"); if ((sess_id = soap_value(login_element))) { strncpy(connection->session_id, sess_id, OA_SOAP_SESSIONKEY_SIZE); connection->session_id[OA_SOAP_SESSIONKEY_SIZE] = '\0'; dbg("Opened session ID %s", connection->session_id); /* Free the XML document */ xmlFreeDoc(doc); return(0); /* Normal, successful return */ } /* Below this point, we have some sort of error. All this is * to provide diagnostics for the user. */ if ((fault = soap_walk_doc(doc, "Body:Fault"))) { if ((oa_err = soap_walk_tree(fault, "Detail:faultInfo"))) { err("login failure: %s", soap_tree_value(oa_err, "errorText")); } else { /* Assuming SOAP protocol error */ err("login failure: %s", soap_tree_value(fault, "Reason:Text")); } } else { err("failed to find session ID during OA login"); } xmlFreeDoc(doc); return(-1); } /** * soap_logout * @connection: OA SOAP connection provided by soap_open() * * Used internally to log out of the OA. This is executed only while closing * the connection. * * Note that short timeout periods may cause a timeout error, but this * condition will not be separately reported. * * Return value: 0 for a successful SOAP call, and -1 for a variety of errors. **/ static int soap_logout(SOAP_CON *connection) { /* Error checking */ if (! connection) { err("NULL connection pointer in soap_logout()"); return(-1); } if (connection->session_id[0] == '\0') { err("missing session ID in soap_logout()"); return(-1); } /* Perform logout request */ if (soap_request(connection, "\n")) { err("failed to communicate with OA during logout"); /* Clearing session ID since there was something wrong with * our current session. */ connection->session_id[0] = '\0'; return(-1); } /* Clear session ID, since we're (probably) logged out */ connection->session_id[0] = '\0'; /* Parse looking for OK response */ if (! soap_walk_doc(connection->doc, "Body:userLogOutResponse:returnCodeOk")) { err("failed to logout of the OA session"); return(-1); } return(0); } /** * soap_error_enum * @connection: OA SOAP connection provided by soap_open() * * Used internally to check for SOAP response errors. This code is a bit * messy, and so has been pulled out of soap_call() to make the overall * structure easier to follow. * * Return value: see the soap_call() description for details on error number * return values. **/ static enum soap_error_enum soap_error_check(SOAP_CON *connection) { xmlNode *fault; xmlNode *oa_err; if ((fault = soap_walk_doc(connection->doc, "Body:Fault"))) { /* This can be a generic SOAP protocol error, an invalid * session key, or an error that is generated by the OA. * Only the latter comes with OA error numbers and OA error * strings. * * Try for the invalid login error first. */ if ((oa_err = soap_walk_tree(fault, "Code:Subcode:Value"))) { if (strcmp(soap_value(oa_err), "wsse:FailedAuthentication") == 0) { /* This is an invalid session key */ connection->last_error_number = -4; connection->last_error_string = soap_tree_value(fault, "Reason:Text"); return SOAP_INVALID_SESSION; } } /* OA errors have a "Detail:faultInfo" tree structure */ if ((oa_err = soap_walk_tree(fault, "Detail:faultInfo"))) { connection->last_error_number = atoi(soap_tree_value(oa_err, "errorCode")); connection->last_error_string = soap_tree_value(oa_err, "errorText"); } else { /* Assuming SOAP protocol error */ connection->last_error_number = -3; connection->last_error_string = soap_tree_value(fault, "Reason:Text"); } if (! connection->ignore_errors) { err("OA SOAP error %d: %s", connection->last_error_number, connection->last_error_string); } return SOAP_ERROR; } else { /* Node "Body:Fault" is not found */ connection->last_error_number = 0; connection->last_error_string = NULL; return SOAP_NO_ERROR; } } /** * soap_call * @connection: OA SOAP connection provided by soap_open() * * Perform an entire OA SOAP call, including login (if necessary), sending the * request, reading the response, XML parsing, and checking for SOAP errors. * * Though this is the main public call, SOAP client functions will generally * use the soap_request() macro instead of calling this function directly. * * Functional notes: * This routine is a bit complicated because we need to auto-login if * we have a stale session_id, yet we don't want to continue to try to * login forever. We also don't know that the session_id is stale until * we try to use it. * * The overall structure of this routine is as follows: * * Locate the session key position for later use * Loop, up to two tries { * If I have a session_id { * Substitute the session key * Perform SOAP request: * Free previously-used XML memory * Perform the SOAP call * Check for error (using soap_error_check() above): * Successful call --> Return good status * Other error --> Return error information * Invalid session error --> Clear session_id and drop through * } * If I don't have a session_id { * Try to log in: * Successful call --> Update session_id * Error --> Return error information * } * } * * Return value: 0 for a successful SOAP call and negative numbers for a * variety of errors: * -1 Some general error * -2 Timeout * -3 SOAP protocol error * -4 Invalid session ID (not seen unless really we can't login) **/ int soap_call(SOAP_CON *connection) { char *session_pos; /* Position of session key */ int i; /* Overall loop variable */ int err; /* Error checking */ if (! connection) { err("NULL connection pointer in soap_call()"); return(-1); } if (! connection->req_buf[0]) { err("missing command buffer in soap_call()"); return(-1); } /* Locate the session key. * * TODO: Is there a better way? I've also considered putting a * "%s" in the request string, and using an sprintf() to place the * key at the %s, but it involves a second buffer and wastes an * extra string copy. The main problem with the current approach * is that it assumes a session key size, which could change in a * future version of the OA. */ session_pos = strstr(connection->req_buf, OA_SOAP_SESS_KEY_LABEL); if (! session_pos) { err("failed to find session key location in passed message"); return(-1); } /* Overall loop, up to two tries */ for (i = 0; i < 2; i++) { /* We only try the SOAP request if we have a session_id */ if (connection->session_id[0]) { /* First, we need to free any previously-used XML * memory */ if (connection->doc) { xmlFreeDoc(connection->doc); connection->doc = NULL; } /* Substitute the current session key */ strncpy(session_pos, connection->session_id, OA_SOAP_SESSIONKEY_SIZE); connection->session_id[OA_SOAP_SESSIONKEY_SIZE] = '\0'; /* Perform SOAP call */ err = soap_message(connection, connection->req_buf, &(connection->doc)); if (err) { if (err == -2) { return(-2); /* Timeout */ } err("failed to communicate with OA " "during soap_call()"); connection->req_buf[0] = '\0'; return(-1); } /* Test for successful call */ switch (soap_error_check(connection)) { case SOAP_NO_ERROR: connection->req_buf[0] = '\0'; return(0); case SOAP_ERROR: connection->req_buf[0] = '\0'; return(-1); case SOAP_INVALID_SESSION: connection->session_id[0] = '\0'; dbg("had an invalid session ID"); break; default: err("internal error"); return(-1); } } /* If we have a session key already */ /* If we didn't (or no longer) have a valid session key, * get one */ if (! connection->session_id[0]) { if (soap_login(connection)) { err("OA login failed in soap call"); return(-1); } } /* If we don't have a session key */ } /* Overall loop, up to two tries */ /* If we fell through, we didn't succeed with the call. The last * error information we have should already be stored in the connection * structure. */ connection->req_buf[0] = '\0'; /* For safety */ return(-1); } openhpi-3.6.1/plugins/oa_soap/oa_soap_calls.c0000644000175100017510000032014612575647266020252 0ustar mohanmohan/* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Bryan Sutula * Raghavendra PG * Raghavendra MS * Anand S */ #include #include #include #define OA_SOAP_CALLS_FILE /* Defines ENUM strings in this file */ #include "oa_soap_calls.h" #include "oa_soap_discover.h" /* Macros used in this file, to simplify common code */ #define SOAP_PARM_CHECK \ int ret; \ if ((con == NULL) || (request == NULL) || (response == NULL)) { \ err("NULL parameter"); \ return -1; \ } #define SOAP_PARM_CHECK_NRQ \ int ret; \ if ((con == NULL) || (response == NULL)) { \ err("NULL parameter"); \ return -1; \ } #define SOAP_PARM_CHECK_NRS \ if ((con == NULL) || (request == NULL)) { \ err("NULL parameter"); \ return -1; \ } #define SOAP_ARRAY_REQ \ byte *p = NULL; \ for (p = request->bayArray.array; \ p - request->bayArray.array < request->bayArray.size; \ p++) { \ snprintf(bay_array + strlen(bay_array), sizeof(BAY), BAY, *p); \ } /* Helper functions used by the main OA SOAP calls for code reuse. They are * not intended to be called by users. * * Please note that the function comment block format has not been followed * for these. The functions are very repetitive, and their parameters are * all predefined structures, well-documented in external documents. Trying * to document that here would duplicate that information, leading to future * maintainability problems. */ /* This tries to locate a string of diagnosticChecksEx notes within the * current XML response tree. If one is found, it's node is returned. If * not, returns NULL. */ static xmlNode *locate_diagnosticChecksEx(xmlNode *node) { xmlNode *diag; /* DiagnosticChecksEx node */ /* First, is there a diagnosticChecksEx node? */ diag = soap_walk_tree(node, "diagnosticChecksEx"); if (diag && diag->children) { /* Real responses have children */ diag = diag->children; if (! diag->properties) /* Skip formatting (empty) nodes */ diag = soap_next_node(diag); } else diag = NULL; /* No children */ return(diag); } /* parse_xsdBoolean - Parses xsdBoolean strings, returning an hpoa_boolean */ static enum hpoa_boolean parse_xsdBoolean(char *str) { if ((! strcmp(str, "true")) || (! strcmp(str, "1"))) return(HPOA_TRUE); return(HPOA_FALSE); } /* parse_eventPid - Parses an eventPid response structure */ static void parse_eventPid(xmlNode *node, struct eventPid *response) { response->pid = atoi(soap_tree_value(node, "pid")); } /* parse_bladeInfo - Parses a bladeInfo response structure */ void parse_bladeInfo(xmlNode *node, struct bladeInfo *response) { response->bayNumber = atoi(soap_tree_value(node, "bayNumber")); response->presence = soap_enum(presence_S, soap_tree_value(node, "presence")); response->bladeType = soap_enum(bladeType_S, soap_tree_value(node, "bladeType")); response->width = atoi(soap_tree_value(node, "width")); response->height = atoi(soap_tree_value(node, "height")); response->name = soap_tree_value(node, "name"); response->manufacturer = soap_tree_value(node, "manufacturer"); response->partNumber = soap_tree_value(node, "partNumber"); response->sparePartNumber = soap_tree_value(node, "sparePartNumber"); response->serialNumber = soap_tree_value(node, "serialNumber"); response->serverName = soap_tree_value(node, "serverName"); response->uuid = soap_tree_value(node, "uuid"); response->rbsuOsName = soap_tree_value(node, "rbsuOsName"); response->assetTag = soap_tree_value(node, "assetTag"); response->romVersion = soap_tree_value(node, "romVersion"); response->numberOfCpus = atoi(soap_tree_value(node, "numberOfCpus")); response->cpus = soap_walk_tree(node, "cpus:bladeCpuInfo"); response->memory = atoi(soap_tree_value(node, "memory")); response->numberOfNics = atoi(soap_tree_value(node, "numberOfNics")); response->nics = soap_walk_tree(node, "nics:bladeNicInfo"); response->mmHeight = atoi(soap_tree_value(node, "mmHeight")); response->mmWidth = atoi(soap_tree_value(node, "mmWidth")); response->mmDepth = atoi(soap_tree_value(node, "mmDepth")); response->deviceId = atoi(soap_tree_value(node, "deviceId")); response->productId = atoi(soap_tree_value(node, "productId")); response->extraData = soap_walk_tree(node, "extraData"); } /* parse_bladePortMap- Parses a bladePortMap response structure */ void parse_bladePortMap(xmlNode *node, struct bladePortMap *response) { response->bladeBayNumber = soap_tree_value(node, "bladeBayNumber"); response->status = soap_enum(portMapStatus_S, soap_tree_value(node, "status")); response->bladeSizeType = soap_enum(bladeSizeType_S, soap_tree_value(node, "bladeSizeType")); response->numberOfMezzes = soap_tree_value(node, "numberOfMezzes"); response->mezz = soap_walk_tree(node, "mezz"); response->extraData = soap_walk_tree(node, "extraData"); } /* parse_bladeMpInfo - Parses a bladeMpInfo response structure */ static void parse_bladeMpInfo(xmlNode *node, struct bladeMpInfo *response) { response->bayNumber = atoi(soap_tree_value(node, "bayNumber")); response->ipAddress = soap_tree_value(node, "ipAddress"); response->macAddress = soap_tree_value(node, "macAddress"); response->dnsName = soap_tree_value(node, "dnsName"); response->modelName = soap_tree_value(node, "modelName"); response->fwVersion = soap_tree_value(node, "fwVersion"); response->remoteConsoleUrl = soap_tree_value(node, "remoteConsoleUrl"); response->webUrl = soap_tree_value(node, "webUrl"); response->ircUrl = soap_tree_value(node, "ircUrl"); response->loginUrl = soap_tree_value(node, "loginUrl"); response->ircFullUrl = soap_tree_value(node, "ircFullUrl"); response->remoteSerialUrl = soap_tree_value(node, "remoteSerialUrl"); response->extraData = soap_walk_tree(node, "extraData"); } /* parse_diagnosticChecks - Parses a diagnosticChecks response structure */ static void parse_diagnosticChecks(xmlNode *node, struct diagnosticChecks *response) { response->internalDataError = soap_enum(diagnosticStatus_S, soap_tree_value(node, "internalDataError")); response->managementProcessorError = soap_enum(diagnosticStatus_S, soap_tree_value(node, "managementProcessorError")); response->thermalWarning = soap_enum(diagnosticStatus_S, soap_tree_value(node, "thermalWarning")); response->thermalDanger = soap_enum(diagnosticStatus_S, soap_tree_value(node, "thermalDanger")); response->ioConfigurationError = soap_enum(diagnosticStatus_S, soap_tree_value(node, "ioConfigurationError")); response->devicePowerRequestError = soap_enum(diagnosticStatus_S, soap_tree_value(node, "devicePowerRequestError")); response->insufficientCooling = soap_enum(diagnosticStatus_S, soap_tree_value(node, "insufficientCooling")); response->deviceLocationError = soap_enum(diagnosticStatus_S, soap_tree_value(node, "deviceLocationError")); response->deviceFailure = soap_enum(diagnosticStatus_S, soap_tree_value(node, "deviceFailure")); response->deviceDegraded = soap_enum(diagnosticStatus_S, soap_tree_value(node, "deviceDegraded")); response->acFailure = soap_enum(diagnosticStatus_S, soap_tree_value(node, "acFailure")); response->i2cBuses = soap_enum(diagnosticStatus_S, soap_tree_value(node, "i2cBuses")); response->redundancy = soap_enum(diagnosticStatus_S, soap_tree_value(node, "redundancy")); } /* parse_syslog - Parses a syslog response structure */ static void parse_syslog(xmlNode *node, struct syslog *response) { char *str; if ((str = soap_tree_value(node, "bayNumber"))) response->bayNumber = atoi(str); else response->bayNumber = -1; if ((str = soap_tree_value(node, "syslogStrlen"))) response->syslogStrlen = atoi(str); else response->syslogStrlen = -1; response->logContents = soap_tree_value(node, "logContents"); /* May be * NULL */ response->extraData = soap_walk_tree(node, "extraData"); } /* parse_rackTopology - Parses a rackTopology response structure */ static void parse_rackTopology(xmlNode *node, struct rackTopology *response) { response->ruid = soap_tree_value(node, "ruid"); /* May be NULL */ response->enclosures = soap_walk_tree(node, "enclosures:enclosure"); response->extraData = soap_walk_tree(node, "extraData"); } /* parse_rackTopology2 - Parses rackTopology2 response structure */ static void parse_rackTopology2(xmlNode *node, struct rackTopology2 *response) { response->ruid = soap_tree_value(node, "ruid"); response->enclosures = soap_walk_tree(node, "enclosures:enclosure"); response->extraData = soap_walk_tree(node, "extraData"); } /* parse_enclosureInfo - Parses a enclosureInfo response structure */ static void parse_enclosureInfo(xmlNode *node, struct enclosureInfo *response) { response->rackName = soap_tree_value(node, "rackName"); response->enclosureName = soap_tree_value(node, "enclosureName"); response->hwVersion = soap_tree_value(node, "hwVersion"); response->bladeBays = atoi(soap_tree_value(node, "bladeBays")); response->fanBays = atoi(soap_tree_value(node, "fanBays")); response->powerSupplyBays = atoi(soap_tree_value(node, "powerSupplyBays")); response->thermalSensors = atoi(soap_tree_value(node, "thermalSensors")); response->interconnectTrayBays = atoi(soap_tree_value(node, "interconnectTrayBays")); response->oaBays = atoi(soap_tree_value(node, "oaBays")); response->name = soap_tree_value(node, "name"); response->partNumber = soap_tree_value(node, "partNumber"); response->serialNumber = soap_tree_value(node, "serialNumber"); response->uuid = soap_tree_value(node, "uuid"); response->assetTag = soap_tree_value(node, "assetTag"); response->manufacturer = soap_tree_value(node, "manufacturer"); response->chassisSparePartNumber = soap_tree_value(node, "chassisSparePartNumber"); response->interposerManufacturer = soap_tree_value(node, "interposerManufacturer"); response->interposerName = soap_tree_value(node, "interposerName"); response->interposerPartNumber = soap_tree_value(node, "interposerPartNumber"); response->interposerSerialNumber = soap_tree_value(node, "interposerSerialNumber"); response->pduType = soap_tree_value(node, "pduType"); response->mmHeight = atoi(soap_tree_value(node, "mmHeight")); response->mmWidth = atoi(soap_tree_value(node, "mmWidth")); response->mmDepth = atoi(soap_tree_value(node, "mmDepth")); response->pduPartNumber = soap_tree_value(node, "pduPartNumber"); response->pduSparePartNumber = soap_tree_value(node, "pduSparePartNumber"); response->extraData = soap_walk_tree(node, "extraData"); } /* parse_powerConfigInfo - Parses a getPowerConfigInfo response structure */ static void parse_powerConfigInfo(xmlNode *node, \ struct powerConfigInfo *response) { response->powerCeiling = atoi(soap_tree_value(node, "powerCeiling")); response->redundancyMode = soap_enum(powerRedundancy_S, soap_tree_value(node, "redundancyMode")); response->dynamicPowerSaverEnabled = parse_xsdBoolean(soap_tree_value(node, "dynamicPowerSaverEnabled")); response->extraData = soap_walk_tree(node, "extraData"); } /* parse_powerCapConfig - Parses a getPowerCapConfig response structure */ static void parse_powerCapConfig(xmlNode *node, struct powerCapConfig *response) { xmlNode *bay_data; int i; xmlNode *extra_data; struct extraDataInfo extra_data_info; response->enclosureMinWattageMeasured = atoi(soap_tree_value(node, "enclosureMinWattageMeasured")); response->enclosureMaxWattageMeasured = atoi(soap_tree_value(node, "enclosureMaxWattageMeasured")); response->enclosurePowerCapLowerBound = atoi(soap_tree_value(node, "enclosurePowerCapLowerBound")); /* These limits default to above limit, unless there is extraData */ response->deratedCircuitCapLowerBound = response->enclosurePowerCapLowerBound; response->ratedCircuitCapLowerBound = response->enclosurePowerCapLowerBound; response->enclosurePowerCapUpperBound = atoi(soap_tree_value(node, "enclosurePowerCapUpperBound")); /* These limits default to above limit, unless there is extraData */ response->deratedCircuitCapUpperBound = response->enclosurePowerCapUpperBound; response->ratedCircuitCapUpperBound = response->enclosurePowerCapUpperBound; response->enclosureHighLine = parse_xsdBoolean(soap_tree_value(node, "enclosureHighLine")); response->enclosureAcPhaseType = atoi(soap_tree_value(node, "enclosureAcPhaseType")); response->enclosureEstimatedVoltage = atoi(soap_tree_value(node, "enclosureEstimatedVoltage")); response->powerCap = atoi(soap_tree_value(node, "powerCap")); response->extraData = soap_walk_tree(node, "extraData"); bay_data = soap_walk_tree(node, "optOutBayArray"); bay_data = soap_walk_tree(bay_data, "bay"); i = 0; while (bay_data) { /* Copy optOutBayArray data for later use: */ /* data is either "true" or "false" */ strncpy(response->optOutBayArray[i], soap_value(bay_data), 6); response->optOutBayArray[i][6] = '\0'; bay_data = soap_next_node(bay_data); i++; } response->deratedCircuitCap = 0; response->ratedCircuitCap = 0; extra_data = response->extraData; while (extra_data) { soap_getExtraData(extra_data, &extra_data_info); if (!(strcmp(extra_data_info.name, "deratedCircuit"))) { response->deratedCircuitCap = atoi(extra_data_info.value); } else if (!(strcmp(extra_data_info.name, "ratedCircuit"))) { response->ratedCircuitCap = atoi(extra_data_info.value); } else if (!(strcmp(extra_data_info.name, "deratedCircuitLowerBound"))) { response->deratedCircuitCapLowerBound = atoi(extra_data_info.value); } else if (!(strcmp(extra_data_info.name, "deratedCircuitUpperBound"))) { response->deratedCircuitCapUpperBound = atoi(extra_data_info.value); } else if (!(strcmp(extra_data_info.name, "ratedCircuitLowerBound"))) { response->ratedCircuitCapLowerBound = atoi(extra_data_info.value); } else if (!(strcmp(extra_data_info.name, "ratedCircuitUpperBound"))) { response->ratedCircuitCapUpperBound = atoi(extra_data_info.value); } extra_data = soap_next_node(extra_data); } } /* parse_oaStatus - Parses an oaStatus response structure */ void parse_oaStatus(xmlNode *node, struct oaStatus *response) { response->bayNumber = atoi(soap_tree_value(node, "bayNumber")); response->oaName = soap_tree_value(node, "oaName"); response->oaRole = soap_enum(oaRole_S, soap_tree_value(node, "oaRole")); response->operationalStatus = soap_enum(opStatus_S, soap_tree_value(node, "operationalStatus")); response->uid = soap_enum(uidStatus_S, soap_tree_value(node, "uid")); response->restartCause = atoi(soap_tree_value(node, "restartCause")); response->oaRedundancy = parse_xsdBoolean(soap_tree_value(node, "oaRedundancy")); parse_diagnosticChecks(soap_walk_tree(node, "diagnosticChecks"), & (response->diagnosticChecks)); response->diagnosticChecksEx = locate_diagnosticChecksEx(node); response->extraData = soap_walk_tree(node, "extraData"); } /* parse_oaInfo - Parses an oaInfo response structure */ void parse_oaInfo(xmlNode *node, struct oaInfo *response) { response->bayNumber = atoi(soap_tree_value(node, "bayNumber")); response->youAreHere = parse_xsdBoolean(soap_tree_value(node, "youAreHere")); response->name = soap_tree_value(node, "name"); response->partNumber = soap_tree_value(node, "partNumber"); response->sparePartNumber = soap_tree_value(node, "sparePartNumber"); response->serialNumber = soap_tree_value(node, "serialNumber"); response->uuid = soap_tree_value(node, "uuid"); response->assetTag = soap_tree_value(node, "assetTag"); response->manufacturer = soap_tree_value(node, "manufacturer"); response->hwVersion = soap_tree_value(node, "hwVersion"); response->fwVersion = soap_tree_value(node, "fwVersion"); response->mmHeight = atoi(soap_tree_value(node, "mmHeight")); response->mmWidth = atoi(soap_tree_value(node, "mmWidth")); response->mmDepth = atoi(soap_tree_value(node, "mmDepth")); response->extraData = soap_walk_tree(node, "extraData"); } /* parse_oaId - Parses an oaId response structure */ static void parse_oaId(xmlNode *node, struct OaId *response) { response->bayNumber = atoi(soap_tree_value(node, "oaId")); } /* parse_bladeStatus - Parses a bladeStatus response structure */ void parse_bladeStatus(xmlNode *node, struct bladeStatus *response) { response->bayNumber = atoi(soap_tree_value(node, "bayNumber")); response->presence = soap_enum(presence_S, soap_tree_value(node, "presence")); response->operationalStatus = soap_enum(opStatus_S, soap_tree_value(node, "operationalStatus")); response->thermal = soap_enum(sensorStatus_S, soap_tree_value(node, "thermal")); response->powered = soap_enum(power_S, soap_tree_value(node, "powered")); response->powerState = soap_enum(powerState_S, soap_tree_value(node, "powerState")); response->shutdown = soap_enum(shutdown_S, soap_tree_value(node, "shutdown")); response->uid = soap_enum(uidStatus_S, soap_tree_value(node, "uid")); response->powerConsumed = atoi(soap_tree_value(node, "powerConsumed")); parse_diagnosticChecks(soap_walk_tree(node, "diagnosticChecks"), & (response->diagnosticChecks)); response->diagnosticChecksEx = locate_diagnosticChecksEx(node); response->extraData = soap_walk_tree(node, "extraData"); } /* parse_interconnectTrayStatus - Parses an interconnectTrayStatus * response structure */ void parse_interconnectTrayStatus(xmlNode *node, struct interconnectTrayStatus *response) { response->bayNumber = atoi(soap_tree_value(node, "bayNumber")); response->operationalStatus = soap_enum(opStatus_S, soap_tree_value(node, "operationalStatus")); response->presence = soap_enum(presence_S, soap_tree_value(node, "presence")); response->thermal = soap_enum(sensorStatus_S, soap_tree_value(node, "thermal")); response->cpuFault = parse_xsdBoolean(soap_tree_value(node, "cpuFault")); response->healthLed = parse_xsdBoolean(soap_tree_value(node, "healthLed")); response->uid = soap_enum(uidStatus_S, soap_tree_value(node, "uid")); response->powered = soap_enum(power_S, soap_tree_value(node, "powered")); response->ports = soap_walk_tree(node, "ports:port"); parse_diagnosticChecks(soap_walk_tree(node, "diagnosticChecks"), & (response->diagnosticChecks)); response->diagnosticChecksEx = locate_diagnosticChecksEx(node); response->extraData = soap_walk_tree(node, "extraData"); } /* parse_interconnectTrayInfo - Parses an interconnectTrayInfo * response structure */ void parse_interconnectTrayInfo(xmlNode *node, struct interconnectTrayInfo *response) { response->bayNumber = atoi(soap_tree_value(node, "bayNumber")); response->interconnectTrayType = soap_enum(interconnectTrayType_S, soap_tree_value(node, "interconnectTrayType")); response->passThroughSupport = parse_xsdBoolean(soap_tree_value(node, "passThroughSupport")); response->portDisableSupport = parse_xsdBoolean(soap_tree_value(node, "portDisableSupport")); response->temperatureSensorSupport = parse_xsdBoolean(soap_tree_value(node, "temperatureSensorSupport")); response->width = atoi(soap_tree_value(node, "width")); response->manufacturer = soap_tree_value(node, "manufacturer"); response->name = soap_tree_value(node, "name"); response->partNumber = soap_tree_value(node, "partNumber"); response->serialNumber = soap_tree_value(node, "serialNumber"); response->sparePartNumber = soap_tree_value(node, "sparePartNumber"); response->rs232PortRoute = parse_xsdBoolean(soap_tree_value(node, "rs232PortRoute")); response->ethernetPortRoute = parse_xsdBoolean(soap_tree_value(node, "ethernetPortRoute")); response->userAssignedName = soap_tree_value(node, "userAssignedName"); response->inBandIpAddress = soap_tree_value(node, "inBandIpAddress"); response->urlToMgmt = soap_tree_value(node, "urlToMgmt"); response->powerOnWatts = atoi(soap_tree_value(node, "powerOnWatts")); response->powerOffWatts = atoi(soap_tree_value(node, "powerOffWatts")); response->extraData = soap_walk_tree(node, "extraData"); } /* parse_interconnectTrayPortMap- parses an interconnectTrayPortMap response * struture. */ void parse_interconnectTrayPortMap(xmlNode *portmap, struct interconnectTrayPortMap *result) { result->interconnectTrayBayNumber = atoi(soap_tree_value(portmap, "interconnectTrayBayNumber")); result->status = soap_enum(portMapStatus_S, soap_tree_value(portmap, "status")); result->sizeType = soap_enum(interconnectTraySizeType_S, soap_tree_value(portmap, "sizeType")); result->passThroughModeEnabled = soap_enum(interconnectTrayPassThroughEnabled_S, soap_tree_value(portmap, "passThroughModeEnabled")); result->slot = soap_walk_tree(portmap, "slot:interconnectTrayPortMap"); result->numberOfSlots = atoi(soap_tree_value(portmap, "numberOfSlots")); result->extraData = soap_walk_tree(portmap, "extraData"); } /* parse_powerSupplyInfo - Parses a powerSupplyInfo response structure */ void parse_powerSupplyInfo(xmlNode *node, struct powerSupplyInfo *response) { char *temp_val=NULL; int len=0; response->bayNumber = atoi(soap_tree_value(node, "bayNumber")); response->presence = soap_enum(presence_S, soap_tree_value(node, "presence")); temp_val=soap_tree_value(node, "modelNumber"); if (temp_val != NULL && (len = strlen(temp_val) < MAX_MODEL_NUM_LENGTH)) { strcpy(response->modelNumber, temp_val); } else { dbg("Internal Error: Power Supply modelNumber does not exist \ or too long"); response->modelNumber[0] = '\0'; } temp_val=soap_tree_value(node, "sparePartNumber"); if (temp_val != NULL && (len = strlen(temp_val) < MAX_PART_NUM_LENGTH)) { strcpy(response->sparePartNumber, temp_val); } else { dbg("Internal Error: Power Supply modelNumber does not exist \ or too long"); response->sparePartNumber[0] = '\0'; } temp_val=soap_tree_value(node, "serialNumber"); if (temp_val != NULL && (len = strlen(temp_val) < MAX_SERIAL_NUM_LENGTH)) { strcpy(response->serialNumber, temp_val); } else { dbg("Internal Error: Power Supply modelNumber does not exist \ or too long"); response->serialNumber[0] = '\0'; } response->capacity = atoi(soap_tree_value(node, "capacity")); response->actualOutput = atoi(soap_tree_value(node, "actualOutput")); response->extraData = soap_walk_tree(node, "extraData"); } /* parse_powerSupplyStatus - Parses a powerSupplyStatus response structure */ void parse_powerSupplyStatus(xmlNode *node, struct powerSupplyStatus *response) { response->bayNumber = atoi(soap_tree_value(node, "bayNumber")); response->presence = soap_enum(presence_S, soap_tree_value(node, "presence")); response->operationalStatus = soap_enum(opStatus_S, soap_tree_value(node, "operationalStatus")); response->inputStatus = soap_enum(opStatus_S, soap_tree_value(node, "inputStatus")); parse_diagnosticChecks(soap_walk_tree(node, "diagnosticChecks"), & (response->diagnosticChecks)); response->diagnosticChecksEx = locate_diagnosticChecksEx(node); response->extraData = soap_walk_tree(node, "extraData"); } /* parse_powerSubsystemInfo - Parses a powerSubsystemInfo response structure */ static void parse_powerSubsystemInfo(xmlNode *node, struct powerSubsystemInfo *response) { char *str; response->subsystemType = soap_enum(powerSystemType_S, soap_tree_value(node, "subsystemType")); response->operationalStatus = soap_enum(opStatus_S, soap_tree_value(node, "operationalStatus")); response->redundancy = soap_enum(redundancy_S, soap_tree_value(node, "redundancy")); response->redundancyMode = soap_enum(powerRedundancy_S, soap_tree_value(node, "redundancyMode")); response->capacity = atoi(soap_tree_value(node, "capacity")); response->redundantCapacity = atoi(soap_tree_value(node, "redundantCapacity")); response->outputPower = atoi(soap_tree_value(node, "outputPower")); response->powerConsumed = atoi(soap_tree_value(node, "powerConsumed")); response->inputPowerVa = atof(soap_tree_value(node, "inputPowerVa")); response->inputPowerCapacityVa = atof(soap_tree_value(node, "inputPowerCapacityVa")); if ((str = soap_tree_value(node, "inputPower"))) response->inputPower = atof(str); else response->inputPower = -1.0; if ((str = soap_tree_value(node, "inputPowerCapacity"))) response->inputPowerCapacity = atof(str); else response->inputPowerCapacity = -1.0; response->goodPowerSupplies = atoi(soap_tree_value(node, "goodPowerSupplies")); response->wantedPowerSupplies = atoi(soap_tree_value(node, "wantedPowerSupplies")); response->neededPowerSupplies = atoi(soap_tree_value(node, "neededPowerSupplies")); response->extraData = soap_walk_tree(node, "extraData"); } /* parse_thermalInfo - Parses a thermalInfo response structure */ static void parse_thermalInfo(xmlNode *node, struct thermalInfo *response) { response->sensorType = soap_enum(sensorType_S, soap_tree_value(node, "sensorType")); response->bayNumber = atoi(soap_tree_value(node, "bayNumber")); response->sensorStatus = soap_enum(sensorStatus_S, soap_tree_value(node, "sensorStatus")); response->operationalStatus = soap_enum(opStatus_S, soap_tree_value(node, "operationalStatus")); response->temperatureC = atoi(soap_tree_value(node, "temperatureC")); response->cautionThreshold = atoi(soap_tree_value(node, "cautionThreshold")); response->criticalThreshold = atoi(soap_tree_value(node, "criticalThreshold")); response->extraData = soap_walk_tree(node, "extraData"); } /* parse_enclosureBaysSelection - Parses an enclosureBaysSelection response * structure */ static void parse_enclosureBaysSelection(xmlNode *node, struct enclosureBaysSelection *response) { char *str; if ((str = soap_tree_value(node, "oaAccess"))) response->oaAccess = parse_xsdBoolean(str); else response->oaAccess = HPOA_FALSE; /* Default */ response->bladeBays = soap_walk_tree(node, "bladeBays:blade"); response->interconnectTrayBays = soap_walk_tree(node, "interconnectTrayBays:interconnectTray"); response->extraData = soap_walk_tree(node, "extraData"); } /* parse_userInfo - Parses a userInfo response structure */ static void parse_userInfo(xmlNode *node, struct userInfo *response) { response->username = soap_tree_value(node, "username"); response->fullname = soap_tree_value(node, "fullname"); response->contactInfo = soap_tree_value(node, "contactInfo"); response->isEnabled = parse_xsdBoolean(soap_tree_value(node, "isEnabled")); response->acl = soap_enum(userAcl_S, soap_tree_value(node, "acl")); parse_enclosureBaysSelection(soap_walk_tree(node, "bayPermissions"), &(response->bayPermissions)); response->extraData = soap_walk_tree(node, "extraData"); } /* parse_oaNetworkInfo - Parses a oaNetworkInfo response structure */ static void parse_oaNetworkInfo(xmlNode *node, struct oaNetworkInfo *response) { response->bayNumber = atoi(soap_tree_value(node, "bayNumber")); response->dhcpEnabled = parse_xsdBoolean(soap_tree_value(node, "dhcpEnabled")); response->dynDnsEnabled = parse_xsdBoolean(soap_tree_value(node, "dynDnsEnabled")); response->macAddress = soap_tree_value(node, "macAddress"); response->ipAddress = soap_tree_value(node, "ipAddress"); response->netmask = soap_tree_value(node, "netmask"); response->gateway = soap_tree_value(node, "gateway"); response->dns = soap_walk_tree(node, "dns:ipAddress"); response->elinkIpAddress = soap_tree_value(node, "elinkIpAddress"); response->linkActive = parse_xsdBoolean(soap_tree_value(node, "linkActive")); response->extraData = soap_walk_tree(node, "extraData"); } /* parse_thermalSubsystemInfo - Parses a thermalSubsystemInfo response * structure */ static void parse_thermalSubsystemInfo(xmlNode *node, struct thermalSubsystemInfo *response) { response->operationalStatus = soap_enum(opStatus_S, soap_tree_value(node, "operationalStatus")); response->redundancy = soap_enum(redundancy_S, soap_tree_value(node, "redundancy")); response->goodFans = atoi(soap_tree_value(node, "goodFans")); response->wantedFans = atoi(soap_tree_value(node, "wantedFans")); response->neededFans = atoi(soap_tree_value(node, "neededFans")); response->extraData = soap_walk_tree(node, "extraData"); } /* parse_fanZoneArray - Parses a fanZoneArray structure */ static void parse_fanZoneArray(xmlNode *node, struct getFanZoneArrayResponse *response) { response->fanZoneArray = soap_walk_tree(node, "fanZoneArray:fanZone"); } /* parse_enclosureNetworkInfo - Parses a enclosureNetworkInfo structure */ static void parse_enclosureNetworkInfo(xmlNode *node, struct enclosureNetworkInfo *response) { response->extraData = soap_walk_tree(node, "extraData"); } /* parse_enclosureStatus - Parses a enclosureStatus structure */ static void parse_enclosureStatus(xmlNode *node, struct enclosureStatus *response) { response->operationalStatus = soap_enum(opStatus_S, soap_tree_value(node, "operationalStatus")); response->uid = soap_enum(uidStatus_S, soap_tree_value(node, "uid")); response->wizardStatus = soap_enum(wizardStatus_S, soap_tree_value(node, "wizardStatus")); parse_diagnosticChecks(soap_walk_tree(node, "diagnosticChecks"), & (response->diagnosticChecks)); response->diagnosticChecksEx = locate_diagnosticChecksEx(node); response->extraData = soap_walk_tree(node, "extraData"); } /* parse_lcdInfo - Parses a lcdInfo structure */ static void parse_lcdInfo(xmlNode *node, struct lcdInfo *response) { response->name = soap_tree_value(node, "name"); response->partNumber = soap_tree_value(node, "partNumber"); response->manufacturer = soap_tree_value(node, "manufacturer"); response->fwVersion = soap_tree_value(node, "fwVersion"); response->extraData = soap_walk_tree(node, "extraData"); } /* parse_lcdStatus - Parses a lcdStatus structure */ static void parse_lcdStatus(xmlNode *node, struct lcdStatus *response) { response->status = soap_enum(opStatus_S, soap_tree_value(node, "status")); response->display = soap_enum(uidStatus_S, soap_tree_value(node, "display")); response->lcdPin = parse_xsdBoolean(soap_tree_value(node, "lcdPin")); response->buttonLock = parse_xsdBoolean(soap_tree_value(node, "buttonLock")); response->lcdSetupHealth = soap_enum(lcdSetupHealth_S, soap_tree_value(node, "lcdSetupHealth")); parse_diagnosticChecks(soap_walk_tree(node, "diagnosticChecks"), & (response->diagnosticChecks)); response->diagnosticChecksEx = locate_diagnosticChecksEx(node); response->extraData = soap_walk_tree(node, "extraData"); } /* parse_getBladeThermalInfoArray - Parses a bladeThermalInfoArrayResponse * structure */ static void parse_getBladeThermalInfoArray(xmlNode *node, struct bladeThermalInfoArrayResponse *response) { response->bladeThermalInfoArray = soap_walk_tree(node, "bladeThermalInfoArray:bladeThermalInfo"); } /* parse_getAllEvents - Parses a getAllEventsResponse structure */ static void parse_getAllEvents(xmlNode *node, struct getAllEventsResponse *response) { response->eventInfoArray = soap_walk_tree(node, "eventInfoArray:eventInfo"); } /* User-callable functions that are used to walk the lists of response * parameters. Please note that there are many structures involved, which * are derived from the SOAP/XML interface specification. Instead of trying * to document each fully in the comments, please refer to the oa_soap_calls.h * file which contains structure definitions, and to the OA SOAP interface * documentation (HP Onboard Administrator SOAP Interface Guide). */ /* soap_getExtraData - Walks list of extraData nodes, providing the name and * value for each. Used after any SOAP call that returns an extraData * xmlNode pointer. * * Outputs: * name: String containing the extra data name * value: String containing the value for this name */ void soap_getExtraData(xmlNode *extraData, struct extraDataInfo *result) { if ((extraData) && (extraData->properties) && (extraData->properties->children)) result->name = (char *)(extraData->properties->children->content); else result->name = NULL; result->value = soap_value(extraData); } /* soap_getDiagnosticChecksEx - Walks list of diagnosticChecksEx nodes, * providing the name and value for each. Used after any SOAP call * that returns a diagnosticChecksEx xmlNode pointer. * * Outputs: * name: String containing the diagnosticChecksEx node name * value: diagnosticStatus enum value */ void soap_getDiagnosticChecksEx(xmlNode *diag, struct diagnosticData *result) { if ((diag) && (diag->properties) && (diag->properties->children)) result->name = (char *)(diag->properties->children->content); else result->name = NULL; result->value = soap_enum(diagnosticStatus_S, soap_value(diag)); } /* soap_getBladeCpuInfo - Walks list of bladeCpuInfo nodes, providing details * on each CPU. Used after calling soap_getBladeInfo(). * * Outputs: * cpuType: String describing CPU * cpuSpeed: CPU speed in MHz */ void soap_getBladeCpuInfo(xmlNode *cpus, struct bladeCpuInfo *result) { result->cpuType = soap_tree_value(cpus, "cpuType"); result->cpuSpeed = atoi(soap_tree_value(cpus, "cpuSpeed")); } /* soap_getBladeNicInfo - Walks list of bladeNicInfo nodes, providing details * on each NIC. Used after calling soap_getBladeInfo(). * * Outputs: * port: String describing NIC port * macAddress: String containing the NIC's MAC address */ void soap_getBladeNicInfo(xmlNode *nics, struct bladeNicInfo *result) { result->port = soap_tree_value(nics, "port"); result->macAddress = soap_tree_value(nics, "macAddress"); } /* soap_getBladeMezzInfo - Walks list of bladeMezzInfo nodes, providing details * on each Mezz Card. * * Outputs: * mezzNumber: Mezz number * mezzSlots: Mezz slots node * mezzDevices: Mezz devices node */ void soap_getBladeMezzInfo(xmlNode *mezz, struct bladeMezzInfo *result) { result->mezzNumber = soap_tree_value(mezz, "mezzNumber"); result->mezzSlots = soap_walk_tree(mezz, "mezzSlots"); result->mezzDevices = soap_walk_tree(mezz, "mezzDevices"); result->extraData = soap_walk_tree(mezz, "extraData"); } /* soap_getBladeMezzDevInfo- Walks list of mezzDevices nodes, providing details * on each Mezz device Info. * * Outputs: * name: String containing the mezz device name * type: enum containing the mezz device type * port: XML node containg mezz device port info */ void soap_getBladeMezzDevInfo(xmlNode *mezzDevices, struct bladeMezzDevInfo *result) { result->name = soap_tree_value(mezzDevices, "name"); result->type = soap_enum(bladeMezzDevType_S, soap_tree_value(mezzDevices, "type")); result->port = soap_walk_tree(mezzDevices, "port"); result->extraData = soap_walk_tree(mezzDevices, "extraData"); } /* soap_getBladeMezzSlotInfo- Walks list of mezzSlots nodes, providing details * on each Mezz Card slot. * * Outputs: * type: enum containing the mezz slot type * slot: XML node containing the mezz slot port info */ void soap_getBladeMezzSlotInfo(xmlNode *mezzSlots, struct bladeMezzSlotInfo *result) { result->type = soap_enum(bladeMezzSlotType_S, soap_tree_value(mezzSlots, "type")); result->slot = soap_walk_tree(mezzSlots, "slot"); result->extraData = soap_walk_tree(mezzSlots, "extraData"); } /* soap_getBladeMezzSlotPort- Walks list of bladeMezzSlotPort nodes, providing * details on each slot port. * * Outputs: * slotNumber: String describing mezz slot number * interconnectTrayBayNumber: String containing interconnectTrayBayNumber * interconnectTrayPortNumber: String containing interconnectTrayPortNumber */ void soap_getBladeMezzSlotPort(xmlNode *slot, struct bladeMezzSlotPort *result) { result->slotNumber = soap_tree_value(slot, "slotNumber"); result->interconnectTrayBayNumber = soap_tree_value(slot, "interconnectTrayBayNumber"); result->interconnectTrayPortNumber = soap_tree_value(slot, "interconnectTrayPortNumber"); result->extraData = soap_walk_tree(slot, "extraData"); } /* soap_getBladeMezzDevPort- Walks list of bladeMezzDevPort nodes, providing * details on each Mezz DevPort. * * Outputs: * portNumber: String describing Mezz Device port number * wwpn: String containing wwpn * fabric: enum containing the fabric type * status: enum containing fabricStatus */ void soap_getBladeMezzDevPort(xmlNode *port, struct bladeMezzDevPort *result) { result->portNumber = soap_tree_value(port, "portNumber"); result->wwpn = soap_tree_value(port, "wwpn"); result->fabric = soap_enum(fabricType_S, soap_tree_value(port, "fabric")); result->status = soap_enum(fabricStatus_S, soap_tree_value(port, "status")); result->extraData = soap_walk_tree(port, "extraData"); } /* soap_getInterconnectTraySlotInfo- Walks list of interconnectTraySlotInfo * nodes, providing details on each InterconnectTray Slot. * * Outputs: * interconnectTraySlotNumber: InterconnectTray Slot Number * type: Enum containing interconnect tray type * port: XML node containing InterconnectTraySlot Port */ void soap_getInterconnectTraySlotInfo(xmlNode *slot, struct interconnectTraySlotInfo *result) { result->interconnectTraySlotNumber = atoi(soap_tree_value(slot, "interconnectTraySlotNumber")); result->type = soap_enum(interconnectTrayType_S, soap_tree_value(slot, "type")); result->port = soap_walk_tree(slot, "port:slot"); result->extraData = soap_walk_tree(slot, "extraData"); } /* soap_getInterconnectTrayPortInfo- Walks list of interconnectTrayPortInfo * nodes, providing details on each InterconnectTrayPort. * * Outputs: * interconnectTraySlotPortNumber: Interconnect tray slot port number * bladeBayNumber: Blade Bay Number * bladeMezzNumber: Blade Mezz Number * bladeMezzPortNumber: BladeMezzPortNumber * portStatus: Enum containing Interconnect Tray Port Status * portEnabled: Enum containing the interconnectTray Port * enabled status. * portUidStatus: Enum containing interconnect tray port * Uid status * portLinkLedStatus: Enum containing interconnect tray port link * Led Status */ void soap_getInterconnectTrayPortInfo(xmlNode *port, struct interconnectTrayPortInfo *result) { result->interconnectTraySlotPortNumber = atoi(soap_tree_value(port, "interconnectTraySlotPortNumber")); result->bladeBayNumber = atoi(soap_tree_value(port, "bladeBayNumber")); result->bladeMezzNumber = atoi(soap_tree_value(port, "bladeMezzNumber")); result->bladeMezzPortNumber = atoi(soap_tree_value(port, "bladeMezzPortNumber")); result->portStatus = soap_enum(interconnectTrayPortStatus_S, soap_tree_value(port, "portStatus")); result->portEnabled = soap_enum(interconnectTrayPortEnabled_S, soap_tree_value(port, "portEnabled")); result->portUidStatus = soap_enum(interconnectTrayPortUidStatus_S, soap_tree_value(port, "portUidStatus")); result->portLinkLedStatus = soap_enum(interconnectTrayPortLinkLedStatus_S, soap_tree_value(port, "portLinkLedStatus")); result->extraData = soap_walk_tree(port, "extraData"); } #if 0 /* TODO: Not sure the following call * will work...perhaps same problem * as extraData */ /* soap_getDiagnosticData - Gets information from diagnosticData nodes, * providing details on each diagnostic event. Used after calling * soap_getEventInfo(). * * Outputs: * item: diagnosticStatus enum * name: String containing name of diagnostic item */ void soap_getDiagnosticData(xmlNode *data, struct diagnosticData *result) { result->item = soap_enum(diagnosticStatus_S, soap_tree_value(data, "item")); result->name = soap_tree_value(data, "name"); } #endif /* soap_getBayAccess - Gets information from bayAccess nodes. * * Outputs: * bayNumber: Bay number * access: True if user can access the bay */ void soap_getBayAccess(xmlNode *bay, struct bayAccess *result) { result->bayNumber = atoi(soap_tree_value(bay, "bayNumber")); result->access = parse_xsdBoolean(soap_tree_value(bay, "access")); } /* soap_getEncLink - Gets information from encLink nodes, providing enclosure * information. * * Outputs: * enclosureNumber: Which enclosure is this? * oaName: Name assigned to the OA * uuid: UUID * rackName: Name assigned to the rack * enclosureName: Name assigned to the enclosure * url: URL * local: Local or remote */ void soap_getEncLink(xmlNode *data, struct encLink *result) { result->enclosureNumber = atoi(soap_tree_value(data, "enclosureNumber")); result->oaName = soap_tree_value(data, "oaName"); /* May be NULL */ result->uuid = soap_tree_value(data, "uuid"); /* May be NULL */ result->rackName = soap_tree_value(data, "rackName"); /* May be NULL */ result->enclosureName = soap_tree_value(data, "enclosureName"); /* May be NULL */ result->url = soap_tree_value(data, "url"); result->local = parse_xsdBoolean(soap_tree_value(data, "local")); result->extraData = soap_walk_tree(data, "extraData"); } /* soap_getEncLink2 - Gets information from encLink2 nodes, * providing enclosure information. * * Outputs: * enclosureNumber: Which enclosure is this? * productId: Product ID * mfgId: Manufacturer ID * enclosureUuid: Enclosure Universal Unique ID * encloseSerialNumber: Serial number from enclosure * enclosureName: Enclosure name * enclosureProductName: Enclosure product name including mfg name * enclosureStatus: Enclosure status * enclosureRackIpAddress: Rack IP address * enclosureUrl: URL for the enclosure * rackName: Rack name assigned by user * primaryEnclosure: Flag for identifying primary * encLinkOaArray: encLinkOa array structure */ void soap_getEncLink2(xmlNode *data, struct encLink2 *result) { result->enclosureNumber = atoi(soap_tree_value(data, "enclosureNumber")); result->productId = atoi(soap_tree_value(data, "productId")); result->mfgId = atoi(soap_tree_value(data, "mfgId")); result->enclosureUuid = soap_tree_value(data, "enclosureUuid"); result->enclosureSerialNumber = soap_tree_value(data, "enclosureSerialNumber"); result->enclosureName = soap_tree_value(data, "enclosureName"); result->enclosureProductName = soap_tree_value(data, "enclosureProductName"); result->enclosureStatus = soap_enum(opStatus_S, soap_tree_value(data, "enclosureStatus")); result->enclosureRackIpAddress = soap_tree_value(data, "enclosureRackIpAddress"); result->enclosureUrl = soap_tree_value(data, "enclosureUrl"); result->rackName = soap_tree_value(data, "rackName"); result->primaryEnclosure = parse_xsdBoolean(soap_tree_value(data, "primaryEnclosure")); result->encLinkOa = soap_walk_tree(data, "encLinkOaArray:encLinkOa"); result->extraData = soap_walk_tree(data, "extraData"); } /* soap_getEncLinkOa - Gets information from encLinkOa nodes, * providing enclosure information. * * Outputs: * activeOa: Active OA flag indicator * bayNumber: Bay number of the OA * oaName: OA name assigned by the user * ipAddress: IP address for OA ENC Link * macAddress: MAC address for OA ENC Link * fwVersion: OA firmware version */ void soap_getEncLinkOa (xmlNode *data, struct encLinkOa *result) { result->activeOa = parse_xsdBoolean(soap_tree_value(data, "activeOa")); result->bayNumber = atoi(soap_tree_value(data, "bayNumber")); result->oaName = soap_tree_value(data, "oaName"); result->ipAddress = soap_tree_value(data, "ipAddress"); result->macAddress = soap_tree_value(data, "macAddress"); result->fwVersion = soap_tree_value(data, "fwVersion"); result->extraData = soap_walk_tree(data, "extraData"); } /* soap_getPortEnabled - Gets information from portEnabled nodes * * Outputs: * portNumber: Port number * enabled: Is it enabled? */ void soap_getPortEnabled(xmlNode *data, struct portEnabled *result) { result->portNumber = atoi(soap_tree_value(data, "portNumber")); result->enabled = parse_xsdBoolean(soap_tree_value(data, "enabled")); } /* soap_getIpAddress - Gets information from ipAddress nodes * * Outputs: * result: String containing IP address */ void soap_getIpAddress(xmlNode *ips, char **result) { *result = soap_value(ips); } /* soap_fanZone - Gets information from fanZone nodes * * Outputs: * zoneNumber: Zone number * operationalStatus: Operational status of the fan zone * redundant: Redundant status of the fan zone * targetRpm: Target RPM of the fan zone * targetPwm: Target PWM of the fan zone * deviceBayArray: Device bays of the fan zone * fanInfoArray: Fan info of the fan zone */ void soap_fanZone(xmlNode *node, struct fanZone *result) { result->zoneNumber = atoi(soap_tree_value(node, "zoneNumber")); result->redundant = soap_enum(redundancy_S, soap_tree_value(node, "redundant")); result->operationalStatus = soap_enum(opStatus_S, soap_tree_value(node, "operationalStatus")); result->targetRpm = atoi(soap_tree_value(node, "targetRpm")); result->targetPwm = atoi(soap_tree_value(node, "targetPwm")); result->deviceBayArray = soap_walk_tree(node, "deviceBayArray:bay"); result->fanInfoArray = soap_walk_tree(node, "fanInfoArray:fanInfo"); result->extraData = soap_walk_tree(node, "extraData"); } /* soap_deviceBayArray - Gets information from fanZone nodes * * Outputs: * bay: bay number */ void soap_deviceBayArray(xmlNode *node, byte *bay) { *bay = atoi(soap_value(node)); } /* soap_fanInfo - Gets information from fanInfo nodes * * Outputs: * bayNumber: Bay number * presence: Presence status of the fan * name: Name of the fan * partNumber: Part number of the fan * sparePartNumber: Spare part number of the fan * serialNumber: Serial number of the fan * powerConsumed: Power consumed by the fan * fanSpeed: current fan speed * maxFanSpeed: Maximum fan speed * lowLimitFanSpeed: Low limit fan speed * operationalStatus: Operational status of the fan * diagnosticChecks: Diagnostic checks of the fan */ void soap_fanInfo(xmlNode *node, struct fanInfo *result) { result->bayNumber = atoi(soap_tree_value(node, "bayNumber")); result->presence = soap_enum(presence_S, soap_tree_value(node, "presence")); result->name = soap_tree_value(node, "name"); result->partNumber = soap_tree_value(node, "partNumber"); result->sparePartNumber = soap_tree_value(node, "sparePartNumber"); result->serialNumber = soap_tree_value(node, "serialNumber"); result->powerConsumed = atoi(soap_tree_value(node, "powerConsumed")); result->fanSpeed = atoi(soap_tree_value(node, "fanSpeed")); result->maxFanSpeed = atoi(soap_tree_value(node, "maxFanSpeed")); result->lowLimitFanSpeed = atoi(soap_tree_value(node, "lowLimitFanSpeed")); result->operationalStatus = soap_enum(opStatus_S, soap_tree_value(node, "operationalStatus")); parse_diagnosticChecks(soap_walk_tree(node, "diagnosticChecks"), & (result->diagnosticChecks)); result->diagnosticChecksEx = locate_diagnosticChecksEx(node); result->extraData = soap_walk_tree(node, "extraData"); } void soap_bladeThermalInfo(xmlNode *node, struct bladeThermalInfo * result) { result->sensorNumber = atoi(soap_tree_value(node, "sensorNumber")); result->sensorType = atoi(soap_tree_value(node, "sensorType")); result->entityId = atoi(soap_tree_value(node, "entityId")); result->entityInstance = atoi(soap_tree_value(node, "entityInstance")); result->criticalThreshold = atoi(soap_tree_value(node, "criticalThreshold")); result->cautionThreshold = atoi(soap_tree_value(node, "cautionThreshold")); result->temperatureC = atoi(soap_tree_value(node, "temperatureC")); result->oem = atoi(soap_tree_value(node, "oem")); result->description = soap_tree_value(node, "description"); result->extraData = soap_walk_tree(node, "extraData"); } /* soap_getEventInfo - Walks list of eventInfo nodes, providing details * on each event. Used after calling soap_getAllEvents(). * * Outputs: * event: indicates the type of event * eventTimeStamp: the time this event happened * queueSize: size of event queue, or -1 for not present * eventData: the event information for each type of event */ void soap_getEventInfo(xmlNode *events, struct eventInfo *result) { char *str; xmlNode *node; if((str = soap_tree_value(events, "event"))) result->event = soap_enum(eventType_S, str); else result->event = -1; if((str = soap_tree_value(events, "eventTimeStamp"))) result->eventTimeStamp = atoi(str); else result->eventTimeStamp = -1; if ((str = soap_tree_value(events, "queueSize"))) result->queueSize = atoi(str); else result->queueSize = -1; if ((str = soap_tree_value(events, "numValue"))) { result->numValue = atoi(str); } result->extraData = soap_walk_tree(events, "extraData"); /* The remainder depends on what sort of data is returned by the OA. * The current documentation says that only one of these can be * returned, and indeed, since we have a union, we can handle only * one. Therefore, we will quit and return early when we get a * match. * * As of this writing, not all events have been handled. Those that * are not handled yet are noted by comments left in the code. Please * note that because some are unimplemented, these events will drop * through and be returned as "NOPAYLOAD", an answer that is not * correct. */ if ((node = soap_walk_tree(events, "syslog"))) { result->enum_eventInfo = SYSLOG; parse_syslog(node, &(result->eventData.syslog)); return; } if ((node = soap_walk_tree(events, "rackTopology"))) { result->enum_eventInfo = RACKTOPOLOGY; parse_rackTopology(node, &(result->eventData.rackTopology)); return; } if ((node = soap_walk_tree(events, "enclosureNetworkInfo"))) { result->enum_eventInfo = ENCLOSURENETWORKINFO; parse_enclosureNetworkInfo(node, &(result->eventData.enclosureNetworkInfo)); return; } if ((node = soap_walk_tree(events, "enclosureStatus"))) { result->enum_eventInfo = ENCLOSURESTATUS; parse_enclosureStatus(node, &(result->eventData.enclosureStatus)); return; } if ((node = soap_walk_tree(events, "enclosureInfo"))) { result->enum_eventInfo = ENCLOSUREINFO; parse_enclosureInfo(node, &(result->eventData.enclosureInfo)); if ((node = soap_walk_tree(events, "powerSubsystemInfo"))) { result->eventData.enclosureInfo.powerType = soap_enum(powerSystemType_S, soap_tree_value(node, "subsystemType")); } if ((node = soap_walk_tree(events, "enclosureStatus"))) { result->eventData.enclosureInfo.enclosureStatus = soap_enum(opStatus_S, soap_tree_value(node, "operationalStatus")); } return; } if ((node = soap_walk_tree(events, "oaStatus"))) { result->enum_eventInfo = OASTATUS; parse_oaStatus(node, &(result->eventData.oaStatus)); return; } if ((node = soap_walk_tree(events, "oaInfo"))) { result->enum_eventInfo = OAINFO; parse_oaInfo(node, &(result->eventData.oaInfo)); return; } if ((node = soap_walk_tree(events, "bladeInfo"))) { result->enum_eventInfo = BLADEINFO; parse_bladeInfo(node, &(result->eventData.bladeInfo)); return; } if ((node = soap_walk_tree(events, "bladeMpInfo"))) { result->enum_eventInfo = BLADEMPINFO; parse_bladeMpInfo(node, &(result->eventData.bladeMpInfo)); return; } if ((node = soap_walk_tree(events, "bladeStatus"))) { result->enum_eventInfo = BLADESTATUS; parse_bladeStatus(node, &(result->eventData.bladeStatus)); return; } /* BLADEPORTMAP */ if ((node = soap_walk_tree(events, "bladePortMap"))) { result->enum_eventInfo = BLADEPORTMAP; parse_bladePortMap(node, &(result->eventData.bladePortMap)); return; } if ((node = soap_walk_tree(events, "fanInfo"))) { result->enum_eventInfo = FANINFO; soap_fanInfo(node, &(result->eventData.fanInfo)); return; } if ((node = soap_walk_tree(events, "interconnectTrayStatus"))) { result->enum_eventInfo = INTERCONNECTTRAYSTATUS; parse_interconnectTrayStatus(node, &(result->eventData.interconnectTrayStatus)); return; } if ((node = soap_walk_tree(events, "interconnectTrayInfo"))) { result->enum_eventInfo = INTERCONNECTTRAYINFO; parse_interconnectTrayInfo(node, &(result->eventData.interconnectTrayInfo)); return; } /* INTERCONNECTTRAYPORTMAP */ if ((node = soap_walk_tree(events, "interconnectTrayPortMap"))) { result->enum_eventInfo = INTERCONNECTTRAYPORTMAP; parse_interconnectTrayPortMap(node, &(result->eventData.interconnectTrayPortMap)); return; } if ((node = soap_walk_tree(events, "powerSupplyInfo"))) { result->enum_eventInfo = POWERSUPPLYINFO; parse_powerSupplyInfo(node, &(result->eventData.powerSupplyInfo)); return; } if ((node = soap_walk_tree(events, "powerSupplyStatus"))) { result->enum_eventInfo = POWERSUPPLYSTATUS; parse_powerSupplyStatus(node, &(result->eventData.powerSupplyStatus)); return; } if ((node = soap_walk_tree(events, "powerSubsystemInfo"))) { result->enum_eventInfo = POWERSUBSYSTEMINFO; parse_powerSubsystemInfo(node, &(result->eventData.powerSubsystemInfo)); return; } /* POWERCONFIGINFO */ if ((node = soap_walk_tree(events, "thermalInfo"))) { result->enum_eventInfo = THERMALINFO; parse_thermalInfo(node, &(result->eventData.thermalInfo)); return; } /* USERINFOARRAY */ if ((node = soap_walk_tree(events, "userInfo"))) { result->enum_eventInfo = USERINFO; parse_userInfo(node, &(result->eventData.userInfo)); return; } /* LDAPINFO */ /* LDAPGROUPINFO */ /* SNMPINFO */ /* ENCLOSURENETWORKINFO */ if ((node = soap_walk_tree(events, "oaNetworkInfo"))) { result->enum_eventInfo = OANETWORKINFO; parse_oaNetworkInfo(node, &(result->eventData.oaNetworkInfo)); return; } /* ENCLOSURETIME */ /* ALERTMAILINFO */ /* PASSWORDSETTINGS */ /* EBIPAINFO */ /* LCDCHATMESSAGE */ /* LCDUSERNOTES */ /* LCDBUTTONEVENT */ if ((node = soap_walk_tree(events, "lcdStatus"))) { result->enum_eventInfo = LCDSTATUS; parse_lcdStatus(node, &(result->eventData.lcdStatus)); return; } if ((node = soap_walk_tree(events, "lcdInfo"))) { result->enum_eventInfo = LCDINFO; parse_lcdInfo(node, &(result->eventData.lcdInfo)); return; } /* HPSIMINFO */ if ((node = soap_walk_tree(events, "thermalSubsystemInfo"))) { result->enum_eventInfo = THERMALSUBSYSTEMINFO; parse_thermalSubsystemInfo(node, &(result->eventData.thermalSubsystemInfo)); return; } /* BLADEBOOTINFO */ /* OAVCMMODE */ /* POWERREDUCTIONSTATUS */ /* VIRTUALMEDIASTATUS */ /* OAMEDIADEVICE */ if ((node = soap_walk_tree(events, "fanZone"))) { result->enum_eventInfo = FANZONE; soap_fanZone(node, &(result->eventData.fanZone)); return; } /* EBIPAINFOEX */ /* CACERTSINFO */ if ((node = soap_walk_tree (events, "rackTopology2"))) { result->enum_eventInfo = RACKTOPOLOGY2; parse_rackTopology2(node, &(result->eventData.rackTopology2)); return; } /* USERCERTIFICATEINFO */ /* SYSLOGSETTINGS */ /* POWERDELAYSETTINGS */ /* USBMEDIAFIRMWAREIMAGES */ /* CONFIGSCRIPTS */ /* NUMVALUE */ /* STRING */ if ((result->eventData.message = soap_tree_value(events, "message"))) { result->enum_eventInfo = MESSAGE; return; } result->enum_eventInfo = NOPAYLOAD; /* If we get here, we got nothing */ } /* Finally, the main body of OA SOAP call functions. These are the ones that * a user would expect to call for most things. Please refer to the associated * .h file for parameter details, and to the HP Onboard Administrator SOAP * Interface Guide for further call details. */ int soap_subscribeForEvents(SOAP_CON *con, struct eventPid *response) { SOAP_PARM_CHECK_NRQ if (! (ret = soap_request(con, SUBSCRIBE_FOR_EVENTS))) { parse_eventPid(soap_walk_doc(con->doc, "Body:eventPid"), response); } return(ret); } int soap_unSubscribeForEvents(SOAP_CON *con, const struct unSubscribeForEvents *request) { SOAP_PARM_CHECK_NRS return(soap_request(con, UN_SUBSCRIBE_FOR_EVENTS, request->pid)); } int soap_getEvent(SOAP_CON *con, const struct getEvent *request, struct eventInfo *response) { SOAP_PARM_CHECK if (! (ret = soap_request(con, GET_EVENT, request->pid, request->waitTilEventHappens, /* xsd:boolean */ request->lcdEvents))) { /* xsd:boolean */ soap_getEventInfo(soap_walk_doc(con->doc, "Body:" "getEventResponse:" "eventInfo"), response); } return(ret); } int soap_getAllEventsEx(SOAP_CON *con, const struct getAllEventsEx *request, struct getAllEventsResponse *response) { SOAP_PARM_CHECK if (! (ret = soap_request(con, GET_ALL_EVENTSEX, request->pid, request->waitTilEventHappens, /* xsd:boolean */ request->lcdEvents, /* xsd:boolean */ request->oaFwVersion))) { parse_getAllEvents(soap_walk_doc(con->doc, "Body:" "getAllEventsExResponse"), response); } return(ret); } int soap_getBladeInfo(SOAP_CON *con, const struct getBladeInfo *request, struct bladeInfo *response) { SOAP_PARM_CHECK if (! (ret = soap_request(con, GET_BLADE_INFO, request->bayNumber))) { parse_bladeInfo(soap_walk_doc(con->doc, "Body:" "getBladeInfoResponse:" "bladeInfo"), response); } return(ret); } int soap_getBladePortMap(SOAP_CON *con, const struct getBladeInfo *request, struct bladePortMap *response) { SOAP_PARM_CHECK if (! (ret = soap_request(con, GET_BLADE_PORTMAP, request->bayNumber))) { parse_bladePortMap(soap_walk_doc(con->doc, "Body:" "getBladePortMapResponse:" "bladePortMap"), response); } return(ret); } int soap_getBladeMpInfo(SOAP_CON *con, const struct getBladeMpInfo *request, struct bladeMpInfo *response) { SOAP_PARM_CHECK if (! (ret = soap_request(con, GET_BLADE_MP_INFO, request->bayNumber))) { parse_bladeMpInfo(soap_walk_doc(con->doc, "Body:" "getBladeMpInfoResponse:" "bladeMpInfo"), response); } return(ret); } int soap_getEnclosureInfo(SOAP_CON *con, struct enclosureInfo *response) { xmlNode *node=NULL; SOAP_PARM_CHECK_NRQ if (! (ret = soap_request(con, GET_POWER_SUBSYSTEM_INFO))) { node = soap_walk_doc(con->doc, "Body:" "getPowerSubsystemInfoResponse:" "powerSubsystemInfo"); response->powerType = soap_enum(powerSystemType_S, soap_tree_value(node, "subsystemType")); } if (! (ret = soap_request(con, GET_ENCLOSURE_STATUS))) { node = soap_walk_doc(con->doc, "Body:" "getEnclosureStatusResponse:" "enclosureStatus"); response->enclosureStatus = soap_enum(opStatus_S, soap_tree_value(node, "operationalStatus")); } if (! (ret = soap_request(con, GET_ENCLOSURE_INFO))) { parse_enclosureInfo(soap_walk_doc(con->doc, "Body:" "getEnclosureInfoResponse:" "enclosureInfo"), response); } return(ret); } int soap_getPowerConfigInfo(SOAP_CON *con, struct powerConfigInfo *response, uint *desired_static_pwr_limit) { SOAP_PARM_CHECK_NRQ if (! (ret = soap_request(con, GET_POWER_CONFIG_INFO))) { parse_powerConfigInfo(soap_walk_doc(con->doc, "Body:" "getPowerConfigInfoResponse:" "powerConfigInfo"), response); } /* If user's desired static power limit is 0, then update it with */ /* the OA value, otherwise preserve the user's intention for a */ /* static power limit. */ if (*desired_static_pwr_limit == 0) { *desired_static_pwr_limit = response->powerCeiling; } return(ret); } int soap_setPowerConfigInfo(SOAP_CON *con, const struct powerConfigInfo *request) { char hpoa_boolean[HPOA_BOOLEAN_LENGTH]; char powerRedundancy[POWER_REDUNDANCY_LENGTH]; SOAP_PARM_CHECK_NRS if (soap_inv_enum(hpoa_boolean, hpoa_boolean_S, request->dynamicPowerSaverEnabled)) { err("invalid dynamic power parameter"); return(-1); } if (soap_inv_enum(powerRedundancy, powerRedundancy_S, request->redundancyMode)) { err("invalid power redundancy mode parameter"); return(-1); } return(soap_request(con, SET_POWER_CONFIG_INFO, request->redundancyMode, request->powerCeiling, request->dynamicPowerSaverEnabled)); } int soap_getPowerCapConfig(SOAP_CON *con, struct powerCapConfig *response, uint *desired_dynamic_pwr_cap_limit, uint *desired_derated_circuit_cap_limit, uint *desired_rated_circuit_cap_limit) { SOAP_PARM_CHECK_NRQ if (! (ret = soap_request(con, GET_POWER_CAP_CONFIG))) { parse_powerCapConfig(soap_walk_doc(con->doc, "Body:" "getPowerCapConfigResponse:" "powerCapConfig"), response); } /* If user's desired dynamic power cap limit is 0, then update it */ /* with the OA value, otherwise preserve the user's intention for */ /* a dynamic power cap limit. */ /* Do the same for the derated and rated circuit caps. */ if (*desired_dynamic_pwr_cap_limit == 0) { *desired_dynamic_pwr_cap_limit = response->powerCap; } if (*desired_derated_circuit_cap_limit == 0) { *desired_derated_circuit_cap_limit = response->deratedCircuitCap; } if (*desired_rated_circuit_cap_limit == 0) { *desired_rated_circuit_cap_limit = response->ratedCircuitCap; } return(ret); } int soap_setPowerCapConfig(SOAP_CON *con, const struct powerCapConfig *request) { SOAP_PARM_CHECK_NRS return(soap_request(con, SET_POWER_CAP_CONFIG, request->powerCap, request->optOutBayArray[0], request->optOutBayArray[1], request->optOutBayArray[2], request->optOutBayArray[3], request->optOutBayArray[4], request->optOutBayArray[5], request->optOutBayArray[6], request->optOutBayArray[7], request->optOutBayArray[8], request->optOutBayArray[9], request->optOutBayArray[10], request->optOutBayArray[11], request->optOutBayArray[12], request->optOutBayArray[13], request->optOutBayArray[14], request->optOutBayArray[15], request->deratedCircuitCap, request->ratedCircuitCap)); } int soap_getOaStatus(SOAP_CON *con, const struct getOaStatus *request, struct oaStatus *response) { SOAP_PARM_CHECK if (! (ret = soap_request(con, GET_OA_STATUS, request->bayNumber))) { parse_oaStatus(soap_walk_doc(con->doc, "Body:" "getOaStatusResponse:" "oaStatus"), response); } return(ret); } int soap_getOaInfo(SOAP_CON *con, const struct getOaInfo *request, struct oaInfo *response) { SOAP_PARM_CHECK if (! (ret = soap_request(con, GET_OA_INFO, request->bayNumber))) { parse_oaInfo(soap_walk_doc(con->doc, "Body:" "getOaInfoResponse:" "oaInfo"), response); } return(ret); } int soap_getOaId(SOAP_CON *con, struct OaId *response) { SOAP_PARM_CHECK_NRQ if (! (ret = soap_request(con, GET_OA_ID))) { parse_oaId(soap_walk_doc(con->doc, "Body:" "getOaIdResponse:"), response); } return(ret); } int soap_getInterconnectTrayStatus(SOAP_CON *con, const struct getInterconnectTrayStatus *request, struct interconnectTrayStatus *response) { SOAP_PARM_CHECK if (! (ret = soap_request(con, GET_INTERCONNECT_TRAY_STATUS, request->bayNumber))) { parse_interconnectTrayStatus( soap_walk_doc(con->doc, "Body:" "getInterconnectTrayStatusResponse:" "interconnectTrayStatus"), response); } return(ret); } int soap_getInterconnectTrayInfo(SOAP_CON *con, const struct getInterconnectTrayInfo *request, struct interconnectTrayInfo *response) { SOAP_PARM_CHECK if (! (ret = soap_request(con, GET_INTERCONNECT_TRAY_INFO, request->bayNumber))) { parse_interconnectTrayInfo( soap_walk_doc(con->doc, "Body:" "getInterconnectTrayInfoResponse:" "interconnectTrayInfo"), response); } return(ret); } int soap_getInterconnectTrayPortMap(SOAP_CON *con, const struct getInterconnectTrayInfo *request, struct interconnectTrayPortMap *response) { SOAP_PARM_CHECK if (! (ret = soap_request(con, GET_INTERCONNECT_TRAY_PORT_MAP, request->bayNumber))) { parse_interconnectTrayPortMap( soap_walk_doc(con->doc, "Body:" "getInterconnectTrayPortMapResponse:" "interconnectTrayPortMap"), response); } return(ret); } int soap_getFanInfo(SOAP_CON *con, const struct getFanInfo *request, struct fanInfo *response) { SOAP_PARM_CHECK if (! (ret = soap_request(con, GET_FAN_INFO, request->bayNumber))) { soap_fanInfo(soap_walk_doc(con->doc, "Body:" "getFanInfoResponse:" "fanInfo"), response); } return(ret); } int soap_getPowerSubsystemInfo(SOAP_CON *con, struct powerSubsystemInfo *response) { SOAP_PARM_CHECK_NRQ if (! (ret = soap_request(con, GET_POWER_SUBSYSTEM_INFO))) { parse_powerSubsystemInfo( soap_walk_doc(con->doc, "Body:" "getPowerSubsystemInfoResponse:" "powerSubsystemInfo"), response); } return(ret); } int soap_getPowerSupplyInfo(SOAP_CON *con, const struct getPowerSupplyInfo *request, struct powerSupplyInfo *response) { SOAP_PARM_CHECK if (! (ret = soap_request(con, GET_POWER_SUPPLY_INFO, request->bayNumber))) { parse_powerSupplyInfo( soap_walk_doc(con->doc, "Body:" "getPowerSupplyInfoResponse:" "powerSupplyInfo"), response); } return(ret); } int soap_getOaNetworkInfo(SOAP_CON *con, const struct getOaNetworkInfo *request, struct oaNetworkInfo *response) { SOAP_PARM_CHECK if (! (ret = soap_request(con, GET_OA_NETWORK_INFO, request->bayNumber))) { parse_oaNetworkInfo( soap_walk_doc(con->doc, "Body:" "getOaNetworkInfoResponse:" "oaNetworkInfo"), response); } return(ret); } int soap_getBladeStatus(SOAP_CON *con, const struct getBladeStatus *request, struct bladeStatus *response) { SOAP_PARM_CHECK if (! (ret = soap_request(con, GET_BLADE_STATUS, request->bayNumber))) { parse_bladeStatus(soap_walk_doc(con->doc, "Body:" "getBladeStatusResponse:" "bladeStatus"), response); } return(ret); } int soap_setBladePower(SOAP_CON *con, const struct setBladePower *request) { char power[POWER_CONTROL_LENGTH]; SOAP_PARM_CHECK_NRS if (soap_inv_enum(power, powerControl_S, request->power)) { err("invalid power parameter"); return(-1); } return(soap_request(con, SET_BLADE_POWER, request->bayNumber, power)); } int soap_setInterconnectTrayPower(SOAP_CON *con, const struct setInterconnectTrayPower *request) { SOAP_PARM_CHECK_NRS return(soap_request(con, SET_INTERCONNECT_TRAY_POWER, request->bayNumber, request->on)); } int soap_resetInterconnectTray(SOAP_CON *con, const struct resetInterconnectTray *request) { SOAP_PARM_CHECK_NRS return(soap_request(con, RESET_INTERCONNECT_TRAY, request->bayNumber)); } int soap_getThermalInfo(SOAP_CON *con, const struct getThermalInfo *request, struct thermalInfo *response) { char sensor[SENSOR_TYPE_LENGTH]; SOAP_PARM_CHECK if (soap_inv_enum(sensor, sensorType_S, request->sensorType)) { err("invalid sensorType parameter"); return(-1); } if (! (ret = soap_request(con, GET_THERMAL_INFO, sensor, request->bayNumber))) { parse_thermalInfo(soap_walk_doc(con->doc, "Body:" "getThermalInfoResponse:" "thermalInfo"), response); } return(ret); } int soap_getUserInfo(SOAP_CON *con, const struct getUserInfo *request, struct userInfo *response) { /* On this one, are there some special rules that have to be followed * while sending usernames over XML/SOAP? I could imagine that a user * name could contain characters that need to be escaped in XML. * * TODO: This needs to be checked. */ SOAP_PARM_CHECK if (! (ret = soap_request(con, GET_USER_INFO, request->username))) { parse_userInfo(soap_walk_doc(con->doc, "Body:" "getUserInfoResponse:" "userInfo"), response); } return(ret); } int soap_getRackTopology2(SOAP_CON *con, struct rackTopology2 *response) { SOAP_PARM_CHECK_NRQ if (! (ret = soap_request(con, GET_RACK_TOPOLOGY2))) { parse_rackTopology2(soap_walk_doc(con->doc, "Body:" "getRackTopology2Response:" "rackTopology2"), response); } return(ret); } int soap_isValidSession(SOAP_CON *con) { if (con == NULL) { err("NULL parameter"); return -1; } return(soap_request(con, IS_VALID_SESSION)); } int soap_getThermalSubsystemInfo(SOAP_CON *con, struct thermalSubsystemInfo *response) { SOAP_PARM_CHECK_NRQ if (! (ret = soap_request(con, GET_THERMAL_SUBSYSTEM_INFO))) { parse_thermalSubsystemInfo(soap_walk_doc(con->doc, "Body:" "getThermalSubsystemInfoResponse:" "thermalSubsystemInfo"), response); } return(ret); } int soap_getFanZoneArray(SOAP_CON *con, const struct getFanZoneArray *request, struct getFanZoneArrayResponse *response) { /* TODO: There is messy code below. It should be encapsulated, * either in a routine or macro. Holding off doing this for now, * until we're sure how array input parameters will be used. */ char bay_array[(sizeof(BAY) + 1) * request->bayArray.size]; byte *p; SOAP_PARM_CHECK /* Generate the fan zone array necessary for this request */ bay_array[0] = 0; for (p = request->bayArray.array; p - request->bayArray.array < request->bayArray.size; p++) { snprintf(bay_array + strlen(bay_array), sizeof(BAY), BAY, *p); } if (! (ret = soap_request(con, GET_FAN_ZONE_ARRAY, bay_array))) { parse_fanZoneArray(soap_walk_doc(con->doc, "Body:" "getFanZoneArrayResponse"), response); } return(ret); } int soap_getEnclosureStatus(SOAP_CON *con, struct enclosureStatus *response) { SOAP_PARM_CHECK_NRQ if (! (ret = soap_request(con, GET_ENCLOSURE_STATUS))) { parse_enclosureStatus(soap_walk_doc(con->doc, "Body:" "getEnclosureStatusResponse:" "enclosureStatus"), response); } return(ret); } int soap_getLcdInfo(SOAP_CON *con, struct lcdInfo *response) { SOAP_PARM_CHECK_NRQ if (! (ret = soap_request(con, GET_LCD_INFO))) { parse_lcdInfo(soap_walk_doc(con->doc, "Body:" "getLcdInfoResponse:" "lcdInfo"), response); } return(ret); } int soap_getLcdStatus(SOAP_CON *con, struct lcdStatus *response) { SOAP_PARM_CHECK_NRQ if (! (ret = soap_request(con, GET_LCD_STATUS))) { parse_lcdStatus(soap_walk_doc(con->doc, "Body:" "getLcdStatusResponse:" "lcdStatus"), response); } return(ret); } int soap_getPowerSupplyStatus(SOAP_CON *con, const struct getPowerSupplyStatus *request, struct powerSupplyStatus *response) { SOAP_PARM_CHECK if (! (ret = soap_request(con, GET_POWER_SUPPLY_STATUS, request->bayNumber))) { parse_powerSupplyStatus(soap_walk_doc(con->doc, "Body:" "getPowerSupplyStatusResponse:" "powerSupplyStatus"), response); } return(ret); } int soap_setEnclosureUid(SOAP_CON *con, const struct setEnclosureUid *request) { char uid[UID_CONTROL_LENGTH]; SOAP_PARM_CHECK_NRS if (soap_inv_enum(uid, uidControl_S, request->uid)) { err("invalid UID parameter"); return(-1); } return(soap_request(con, SET_ENCLOSURE_UID, uid)); } int soap_setOaUid(SOAP_CON *con, const struct setOaUid *request) { char uid[UID_CONTROL_LENGTH]; SOAP_PARM_CHECK_NRS if (soap_inv_enum(uid, uidControl_S, request->uid)) { err("invalid UID parameter"); return(-1); } return(soap_request(con, SET_OA_UID, request->bayNumber, uid)); } int soap_setBladeUid(SOAP_CON *con, const struct setBladeUid *request) { char uid[UID_CONTROL_LENGTH]; SOAP_PARM_CHECK_NRS if (soap_inv_enum(uid, uidControl_S, request->uid)) { err("invalid UID parameter"); return(-1); } return(soap_request(con, SET_BLADE_UID, request->bayNumber, uid)); } int soap_setInterconnectTrayUid(SOAP_CON *con, const struct setInterconnectTrayUid *request) { char uid[UID_CONTROL_LENGTH]; SOAP_PARM_CHECK_NRS if (soap_inv_enum(uid, uidControl_S, request->uid)) { err("invalid UID parameter"); return(-1); } return(soap_request(con, SET_INTERCONNECT_TRAY_UID, request->bayNumber, uid)); } int soap_setLcdButtonLock(SOAP_CON *con, enum hpoa_boolean buttonLock) { return(soap_request(con, SET_LCD_BUTTON_LOCK, buttonLock)); } int soap_getBladeThermalInfoArray(SOAP_CON *con, struct getBladeThermalInfoArray *request, struct bladeThermalInfoArrayResponse *response) { SOAP_PARM_CHECK if (! (ret = soap_request(con, GET_BLADE_THERMAL_INFO_ARRAY, request->bayNumber))) { parse_getBladeThermalInfoArray(soap_walk_doc(con->doc, "Body:" "getBladeThermalInfoArrayResponse"), response); } return(ret); } int soap_getPowerSupplyInfoArray(SOAP_CON *con, const struct getPowerSupplyInfoArray *request, struct getPowerSupplyInfoArrayResponse *response, xmlDocPtr ps_info_doc) { SOAP_PARM_CHECK char bay_array[(sizeof(BAY) + 1) * request->bayArray.size]; xmlNode *tmp = NULL; /* Generate the PS info array necessary for this request */ bay_array[0] = 0; SOAP_ARRAY_REQ if (!(ret = soap_request(con, GET_POWER_SUPPLY_INFO_ARRAY, bay_array))){ if( ps_info_doc != NULL) { dbg("ps_info_doc is NOT NULL, Please check"); xmlFreeDoc( ps_info_doc); } ps_info_doc = xmlCopyDoc (con->doc,1); if( ps_info_doc == NULL) return(-1); tmp = soap_walk_doc(ps_info_doc, "Body:""getPowerSupplyInfoArrayResponse:"); response->powerSupplyInfoArray = soap_walk_tree(tmp, "powerSupplyInfoArray:powerSupplyInfo"); } return(ret); } int soap_getPowerSupplyStatusArray(SOAP_CON *con, const struct getPowerSupplyStsArray *request, struct getPowerSupplyStsArrayResponse *response, xmlDocPtr ps_sts_doc) { SOAP_PARM_CHECK char bay_array[(sizeof(BAY) + 1) * request->bayArray.size]; xmlNode *tmp = NULL; /* Generate the PS status array necessary for this request */ bay_array[0] = 0; SOAP_ARRAY_REQ if (!(ret = soap_request(con, GET_POWER_SUPPLY_STATUS_ARRAY, bay_array))){ if( ps_sts_doc != NULL) { dbg("ps_sts_doc is NOT NULL, Please check"); xmlFreeDoc(ps_sts_doc); } ps_sts_doc = xmlCopyDoc (con->doc,1); if( ps_sts_doc == NULL) return(-1); tmp = soap_walk_doc(ps_sts_doc, "Body:""getPowerSupplyStatusArrayResponse:"); response->powerSupplyStsArray = soap_walk_tree(tmp, "powerSupplyStatusArray:powerSupplyStatus"); } return(ret); } int soap_getFanInfoArray(SOAP_CON *con, const struct getFanInfoArray *request, struct getFanInfoArrayResponse *response, xmlDocPtr fan_info_doc) { SOAP_PARM_CHECK char bay_array[(sizeof(BAY) + 1) * request->bayArray.size]; xmlNode *tmp = NULL; /* Generate the fan info array necessary for this request */ bay_array[0] = 0; SOAP_ARRAY_REQ if (! (ret = soap_request(con, GET_FAN_INFO_ARRAY, bay_array))) { if( fan_info_doc != NULL) { dbg("fan_info_doc is NOT NULL, Please check"); xmlFreeDoc(fan_info_doc); } fan_info_doc = xmlCopyDoc (con->doc,1); if( fan_info_doc == NULL) return(-1); tmp = soap_walk_doc(fan_info_doc, "Body:""getFanInfoArrayResponse"); response->fanInfoArray = soap_walk_tree(tmp, "fanInfoArray:fanInfo"); } return(ret); } int soap_getBladeInfoArray(SOAP_CON *con, const struct getBladeInfoArray *request, struct getBladeInfoArrayResponse *response, xmlDocPtr bl_info_doc) { SOAP_PARM_CHECK char bay_array[(sizeof(BAY) + 1) * request->bayArray.size]; xmlNode *tmp = NULL; /* Generate the blade info array necessary for this request */ bay_array[0] = 0; SOAP_ARRAY_REQ if (! (ret = soap_request(con, GET_BLADE_INFO_ARRAY, bay_array))) { if( bl_info_doc != NULL) { dbg("bl_info_doc is NOT NULL, Please check"); xmlFreeDoc(bl_info_doc); } bl_info_doc = xmlCopyDoc (con->doc,1); if( bl_info_doc == NULL) return(-1); tmp = soap_walk_doc(bl_info_doc, "Body:""getBladeInfoArrayResponse"); response->bladeInfoArray = soap_walk_tree(tmp, "bladeInfoArray:bladeInfo"); } return(ret); } int soap_getBladeStatusArray(SOAP_CON *con, const struct getBladeStsArray *request, struct getBladeStsArrayResponse *response, xmlDocPtr bl_sts_doc) { SOAP_PARM_CHECK char bay_array[(sizeof(BAY) + 1) * request->bayArray.size]; xmlNode *tmp = NULL; /* Generate the blade status array necessary for this request */ bay_array[0] = 0; SOAP_ARRAY_REQ if (! (ret = soap_request(con, GET_BLADE_STATUS_ARRAY, bay_array))) { if( bl_sts_doc != NULL) { dbg("bl_sts_doc is NOT NULL, Please check"); xmlFreeDoc(bl_sts_doc); } bl_sts_doc = xmlCopyDoc(con->doc,1); if( bl_sts_doc == NULL) return (-1); tmp = soap_walk_doc(bl_sts_doc, "Body:""getBladeStatusArrayResponse"); response->bladeStsArray = soap_walk_tree(tmp, "bladeStatusArray:bladeStatus"); } return(ret); } int soap_getBladePortMapArray(SOAP_CON *con, const struct getBladePortMapArray *request, struct getBladePortMapArrayResponse *response, xmlDocPtr bl_pm_doc) { SOAP_PARM_CHECK char bay_array[(sizeof(BAY) + 1) * request->bayArray.size]; xmlNode *tmp = NULL; /* Generate the blade portmap array necessary for this request */ bay_array[0] = 0; SOAP_ARRAY_REQ if (! (ret = soap_request(con, GET_BLADE_PORTMAP_ARRAY, bay_array))) { if( bl_pm_doc != NULL) { dbg("bl_pm_doc is NOT NULL, Please check"); xmlFreeDoc(bl_pm_doc); } bl_pm_doc = xmlCopyDoc(con->doc,1); if( bl_pm_doc == NULL) return (-1); tmp = soap_walk_doc(bl_pm_doc, "Body:""getBladePortMapArrayResponse"); response->portMapArray = soap_walk_tree(tmp, "bladePortMapArray:bladePortMap"); } return(ret); } int soap_getInterconnectTrayInfoArray(SOAP_CON *con, const struct getInterconnectTrayInfoArray *request, struct interconnectTrayInfoArrayResponse *response, xmlDocPtr intr_info_doc) { SOAP_PARM_CHECK char bay_array[(sizeof(BAY) + 1) * request->bayArray.size]; xmlNode *tmp = NULL; /* Generate the interconnect tray info array necessary for this request */ bay_array[0] = 0; SOAP_ARRAY_REQ if (! (ret = soap_request(con, GET_INTERCONNECT_TRAY_INFO_ARRAY, bay_array))) { if( intr_info_doc != NULL) { dbg("intr_info_doc is NOT NULL, Please check"); xmlFreeDoc(intr_info_doc); } intr_info_doc = xmlCopyDoc( con->doc,1); if( intr_info_doc ==NULL) return(-1); tmp = soap_walk_doc(intr_info_doc, "Body:" "getInterconnectTrayInfoArrayResponse"); response->interconnectTrayInfoArray = soap_walk_tree(tmp, "interconnectTrayInfoArray:interconnectTrayInfo"); } return(ret); } int soap_getInterconnectTrayStatusArray(SOAP_CON *con, const struct interconnectTrayStsArray *request, struct interconnectTrayStsArrayResponse *response, xmlDocPtr intr_sts_doc) { SOAP_PARM_CHECK char bay_array[(sizeof(BAY) + 1) * request->bayArray.size]; xmlNode *tmp = NULL; /* Generate the interconnect tray status array necessary for this request */ bay_array[0] = 0; SOAP_ARRAY_REQ if (! (ret = soap_request(con,GET_INTERCONNECT_TRAY_STATUS_ARRAY, bay_array))) { if( intr_sts_doc != NULL) { dbg("intr_sts_doc is NOT NULL, Please check"); xmlFreeDoc(intr_sts_doc); } intr_sts_doc = xmlCopyDoc(con->doc,1); if( intr_sts_doc == NULL) return( -1); tmp = soap_walk_doc( intr_sts_doc, "Body:" "getInterconnectTrayStatusArrayResponse"); response->interconnectTrayStsArray = soap_walk_tree(tmp, "interconnectTrayStatusArray:interconnectTrayStatus"); } return(ret); } int soap_getInterconnectTrayPortMapArray(SOAP_CON *con, const struct interconnectTrayPmArray *request, struct interconnectTrayPmArrayResponse *response, xmlDocPtr intr_pm_doc) { SOAP_PARM_CHECK char bay_array[(sizeof(BAY) + 1) * request->bayArray.size]; xmlNode *tmp = NULL; /* Generate the interconnect tray portmap array necessary for this request */ bay_array[0] = 0; SOAP_ARRAY_REQ if (! (ret = soap_request(con,GET_INTERCONNECT_TRAY_PORTMAP_ARRAY, bay_array))) { if( intr_pm_doc != NULL) { dbg("intr_pm_doc is NOT NULL, Please check"); xmlFreeDoc(intr_pm_doc); } intr_pm_doc = xmlCopyDoc(con->doc,1); if( intr_pm_doc == NULL) return( -1); tmp = soap_walk_doc( intr_pm_doc, "Body:" "getInterconnectTrayPortMapArrayResponse"); response->interconnectTrayPmArray = soap_walk_tree(tmp, "interconnectTrayPortMapArray:interconnectTrayPortMap"); } return(ret); } int soap_getOaInfoArray(SOAP_CON *con, const struct getOaInfoArray *request, struct getOaInfoArrayResponse *response, xmlDocPtr oa_info_doc) { SOAP_PARM_CHECK char bay_array[(sizeof(BAY) + 1) * request->bayArray.size]; xmlNode *tmp = NULL; /* Generate the OA info array necessary for this request */ bay_array[0] = 0; SOAP_ARRAY_REQ if (! (ret = soap_request(con, GET_OA_INFO_ARRAY, bay_array))) { if( oa_info_doc != NULL) { dbg("oa_info_doc is NOT NULL, Please check"); xmlFreeDoc(oa_info_doc); } oa_info_doc = xmlCopyDoc(con->doc,1); if( oa_info_doc == NULL) return (-1); tmp = soap_walk_doc(oa_info_doc, "Body:""getOaInfoArrayResponse"); response->oaInfoArray = soap_walk_tree(tmp, "oaInfoArray:oaInfo"); } return(ret); } int soap_getOaStatusArray(SOAP_CON *con, const struct getOaStatusArray *request, struct getOaStatusArrayResponse *response, xmlDocPtr oa_sts_doc) { SOAP_PARM_CHECK char bay_array[(sizeof(BAY) + 1) * request->bayArray.size]; xmlNode *tmp = NULL; /* Generate the OA status array necessary for this request */ bay_array[0] = 0; SOAP_ARRAY_REQ if (! (ret = soap_request(con, GET_OA_STATUS_ARRAY, bay_array))) { if( oa_sts_doc != NULL) { dbg("oa_sts_doc is NOT NULL, Please check"); xmlFreeDoc(oa_sts_doc); } oa_sts_doc = xmlCopyDoc(con->doc,1); if( oa_sts_doc == NULL) return (-1); tmp = soap_walk_doc(oa_sts_doc, "Body:""getOaStatusArrayResponse"); response->oaStatusArray = soap_walk_tree(tmp, "oaStatusArray:oaStatus"); } return(ret); } openhpi-3.6.1/plugins/oa_soap/oa_soap_interconnect_event.h0000644000175100017510000000616212575647266023054 0ustar mohanmohan/* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. * Shuah Khan */ #ifndef _OA_SOAP_INTERCONNECT_EVENT_H #define _OA_SOAP_INTERCONNECT_EVENT_H /* Include files */ #include "oa_soap_re_discover.h" SaErrorT process_interconnect_reset_event(struct oh_handler_state *oh_handler, struct eventInfo *oa_event); SaErrorT process_interconnect_power_event(struct oh_handler_state *oh_handler, struct eventInfo *oa_event); SaErrorT process_interconnect_insertion_event(struct oh_handler_state *oh_handler, SOAP_CON *con, struct eventInfo *oa_event); SaErrorT process_interconnect_info_event(struct oh_handler_state *oh_handler, SOAP_CON *con, struct eventInfo *oa_event); SaErrorT process_interconnect_extraction_event(struct oh_handler_state *oh_handler, struct eventInfo *oa_event); void oa_soap_proc_interconnect_status(struct oh_handler_state *oh_handler, struct interconnectTrayStatus *status); void oa_soap_proc_interconnect_thermal(struct oh_handler_state *oh_handler, SOAP_CON *con, struct interconnectTrayStatus *response); #endif openhpi-3.6.1/plugins/oa_soap/oa_soap_power.h0000644000175100017510000000614612575647266020316 0ustar mohanmohan/* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. */ #ifndef _OA_SOAP_POWER_H #define _OA_SOAP_POWER_H /* Include files */ #include "oa_soap_utils.h" /* Seconds to sleep between polls when checking for powerdown */ #define OA_POWEROFF_POLL_INTERVAL 2 /* Max number of times to poll when checking for powerdown */ #define OA_MAX_POWEROFF_POLLS 100 /* Delay (in seconds) before sending a "power on" command after having sent * a "power off" command. */ #define OA_SERVER_POWER_OFF_WAIT_PERIOD 5 SaErrorT get_server_power_state(SOAP_CON *con, SaHpiInt32T bay_number, SaHpiPowerStateT *state); SaErrorT get_interconnect_power_state(SOAP_CON *con, SaHpiInt32T bay_number, SaHpiPowerStateT *state); SaErrorT set_server_power_state(SOAP_CON *con, SaHpiInt32T bay_number, SaHpiPowerStateT state); SaErrorT set_interconnect_power_state(SOAP_CON *con, SaHpiInt32T bay_number, SaHpiPowerStateT state); SaErrorT oa_soap_get_power_state(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiPowerStateT *state); SaErrorT oa_soap_set_power_state(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiPowerStateT state); #endif openhpi-3.6.1/plugins/oa_soap/oa_soap_re_discover.c0000644000175100017510000036022612575647270021456 0ustar mohanmohan/* * Copyright (C) 2007-2009, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. * Vivek Kumar * Raghavendra M.S. * Shuah Khan * Mohan Devarajulu * * This file implements the re-discovery functionality. The resources of the * HP BladeSystem c-Class are re-discovered, whenever the connection to the * active OA is broken or on OA switchover. Re-discovery is done to sync the * plugin with the current state of the resources. * * oa_soap_re_discover_resources() - Starts the re-discovery of server * blades, interconnect blades, OA, * fan and power supplies. * * re_discover_server() - Re-discovers the ProLiant server * blades * * re_discover_power_supply() - Re-discovers the power supply units * * re_discover_oa() - Re-discovers the oa's * * remove_oa() - Remove oa from RPT. * * add_oa() - Add newly re-discovered oa * * remove_server_blade() - Remove server blade from RPT * * add_server_blade() - Add new server blade to RPT * * re_discover_blade() - Re-discover server blades * * update_server_hotswap_state() - update server hotswap state in RPT * * re_discover_interconnect() - Re-discovers the interconnect blades * * update_interconnect_hotswap_state() - update hotswap state in the RPT * * remove_interconnect() - Removes the interconnect * * add_interconnect() - Adds the interconnect. * * re_discover_fan() - Re-discovers the fan * * remove_fan() - Remove the fan from RPT * * add_fan() - Add fan to the RPT * * re_discover_ps_unit() - Re-discover the PSU * * remove_ps_unit() - Removes the PSU from RPT * * add_ps_unit() - Add the PSU to RPT * * oa_soap_re_disc_oa_sen() - Re-discovers the OA sensor states * * oa_soap_re_disc_interconct_sen()- Re-discovers the interconnect sensor * states * * oa_soap_re_disc_ps_sen() - Re-discovers the power supply sensor * states * * oa_soap_re_disc_enc_sen() - Re-discovers the enclosure sensor * states * * oa_soap_re_disc_ps_subsys_sen() - Re-discovers the power subsystem * sensor states * * oa_soap_re_disc_lcd_sen() - Re-discovers the LCD sensor states * * oa_soap_re_disc_fz_sen() - Re-discovers the fan zone sensor * states * * oa_soap_re_disc_therm_subsys_sen()- Re-discovers the thermal subsystem * sensor states */ #include "oa_soap_re_discover.h" #include "oa_soap_calls.h" #include "sahpi_wrappers.h" /* Forward declarations for static functions */ static SaErrorT oa_soap_re_disc_oa_sen(struct oh_handler_state *oh_handler, SOAP_CON *con, SaHpiInt32T bay_number); static SaErrorT oa_soap_re_disc_interconct_sen(struct oh_handler_state *oh_handler, SOAP_CON *con, SaHpiInt32T bay_number); static SaErrorT oa_soap_re_disc_ps_sen(struct oh_handler_state *oh_handler, SOAP_CON *con, SaHpiInt32T bay_number, struct powerSupplyStatus *response); static SaErrorT oa_soap_re_disc_enc_sen(struct oh_handler_state *oh_handler, SOAP_CON *con); static SaErrorT oa_soap_re_disc_ps_subsys_sen(struct oh_handler_state *oh_handler, SOAP_CON *con); static SaErrorT oa_soap_re_disc_lcd_sen(struct oh_handler_state *oh_handler, SOAP_CON *con); static SaErrorT oa_soap_re_disc_fz_sen(struct oh_handler_state *oh_handler, SOAP_CON *con); static SaErrorT oa_soap_re_disc_therm_subsys_sen(struct oh_handler_state *oh_handler, SOAP_CON *con); /** * oa_soap_re_discover_resources * @oh_handler: Pointer to openhpi handler * @con: Pointer to the SOAP_CON structure * * Purpose: * Re-discover the resources. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT oa_soap_re_discover_resources(struct oh_handler_state *oh_handler, struct oa_info *oa) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler = NULL; if (oh_handler == NULL || oa == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } err("Re-discovery started"); oa_handler = (struct oa_soap_handler *) oh_handler->data; /* Re-discovery is called by locking the OA handler mutex and oa_info * mutex. Hence on getting request to shutdown, pass the locked mutexes * for unlocking */ OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, oa_handler->mutex, oa->mutex, NULL); rv = re_discover_blade(oh_handler, oa->event_con); if (rv != SA_OK) { err("Re-discovery of server blade failed"); return rv; } OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, oa_handler->mutex, oa->mutex, NULL); rv = re_discover_interconnect(oh_handler, oa->event_con); if (rv != SA_OK) { err("Re-discovery of interconnect failed"); return rv; } OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, oa_handler->mutex, oa->mutex, NULL); rv = re_discover_fan(oh_handler, oa->event_con); if (rv != SA_OK) { err("Re-discovery of fan failed"); return rv; } OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, oa_handler->mutex, oa->mutex, NULL); rv = re_discover_ps_unit(oh_handler, oa->event_con); if (rv != SA_OK) { err("Re-discovery of power supply unit failed"); return rv; } OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, oa_handler->mutex, oa->mutex, NULL); rv = re_discover_oa(oh_handler, oa->event_con); if (rv != SA_OK) { err("Re-discovery of OA failed"); return rv; } OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, oa_handler->mutex, oa->mutex, NULL); rv = oa_soap_re_disc_enc_sen(oh_handler, oa->event_con); if (rv != SA_OK) { err("Re-discovery of enclosure failed"); return rv; } OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, oa_handler->mutex, oa->mutex, NULL); rv = oa_soap_re_disc_ps_subsys_sen(oh_handler, oa->event_con); if (rv != SA_OK) { err("Re-discovery of power subsystem failed"); return rv; } OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, oa_handler->mutex, oa->mutex, NULL); rv = oa_soap_re_disc_lcd_sen(oh_handler, oa->event_con); if (rv != SA_OK) { err("Re-discovery of LCD failed"); return rv; } OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, oa_handler->mutex, oa->mutex, NULL); rv = oa_soap_re_disc_fz_sen(oh_handler, oa->event_con); if (rv != SA_OK) { err("Re-discovery of fan zone failed"); return rv; } OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, oa_handler->mutex, oa->mutex, NULL); rv = oa_soap_re_disc_therm_subsys_sen(oh_handler, oa->event_con); if (rv != SA_OK) { err("Re-discovery of thermal subsystem failed"); return rv; } err("Re-discovery completed"); return SA_OK; } /** * re_discover_oa * @oh_handler: Pointer to openhpi handler * @con: Pointer to the SOAP_CON structure * * Purpose: * Re-discover the OAs. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT re_discover_oa(struct oh_handler_state *oh_handler, SOAP_CON *con) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler; struct oaStatus status_result; struct oaInfo info_result; SaHpiInt32T i = 0, max_bays = 0; enum resource_presence_status state = RES_ABSENT; SaHpiBoolT replace_resource = SAHPI_FALSE; struct getOaInfoArrayResponse info_response; struct getOaStatusArrayResponse status_response; xmlDocPtr oa_info_doc = NULL; xmlDocPtr oa_sts_doc = NULL; if (oh_handler == NULL || con == NULL) { err("Invalid parameter"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; max_bays = oa_handler->oa_soap_resources.oa.max_bays; rv = oa_soap_get_oa_sts_arr(oa_handler->active_con ,max_bays , &status_response,oa_sts_doc); if (rv != SA_OK) { err("Failed to get OA status array"); xmlFreeDoc( oa_sts_doc); return rv; } rv = oa_soap_get_oa_info_arr(oa_handler->active_con ,max_bays , &info_response,oa_info_doc); if (rv != SA_OK) { err("Failed to get OA info array"); xmlFreeDoc( oa_info_doc); xmlFreeDoc( oa_sts_doc); return rv; } while( status_response.oaStatusArray){ parse_oaStatus(status_response.oaStatusArray ,&status_result); parse_oaInfo(info_response.oaInfoArray ,&info_result); i = status_result.bayNumber; /* Sometimes, if the OA is absent, then OA status is shown as * STANDBY in getOaStatus response. As workaround, if OA * status is STANDBY and oaRedudancy state is set to false, * Then, it is considered as ABSENT. * * But, if the OA is recently inserted, then oaRedudancy state * will be set to false. In this scenario, the OA state will * be wrongly considered as ABSENT. This is a known limitation. * * TODO: Remove this workaround once the fix is available in * OA firmware */ if ((status_result.oaRole == OA_ABSENT) || (status_result.oaRole == STANDBY && status_result.oaRedundancy == HPOA_FALSE)) { /* The OA is absent, check OA is absent in presence * matrix */ if (oa_handler->oa_soap_resources.oa.presence[i - 1] == RES_ABSENT){ status_response.oaStatusArray = soap_next_node( status_response.oaStatusArray); info_response.oaInfoArray = soap_next_node( info_response.oaInfoArray); continue; }else state = RES_ABSENT; } else { /* The OA is present, check OA is present in presence * matrix */ if (oa_handler->oa_soap_resources.oa.presence[i - 1] == RES_PRESENT) { /* Check whether OA has been replaced */ /* If serail number is different * remove and add OA */ if (strcmp(oa_handler->oa_soap_resources.oa. serial_number[i - 1], info_result.serialNumber) != 0) { replace_resource = SAHPI_TRUE; } else { /* Check the OA sensors state */ rv = oa_soap_re_disc_oa_sen( oh_handler, con, i); if (rv != SA_OK) { err("Re-discover OA sensors " " failed"); xmlFreeDoc( oa_sts_doc); xmlFreeDoc( oa_info_doc); return rv; } status_response.oaStatusArray = soap_next_node( status_response.oaStatusArray); info_response.oaInfoArray = soap_next_node( info_response.oaInfoArray); continue; } } else state = RES_PRESENT; } if (state == RES_ABSENT || replace_resource == SAHPI_TRUE) { /* The OA is present according OA presence matrix, but * OA is removed. Remove the OA resource from RPTable. */ rv = remove_oa(oh_handler, i); if (rv != SA_OK) { err("OA %d removal failed", i); xmlFreeDoc( oa_sts_doc); xmlFreeDoc( oa_info_doc); return rv; } else err("OA in slot %d is removed", i); } if (state == RES_PRESENT || replace_resource == SAHPI_TRUE) { /* The OA is absent according OA presence matrix, but * OA is present. Add the OA resource to RPTable. */ rv = add_oa(oh_handler, con, i); if (rv != SA_OK) { err("OA %d add failed", i); xmlFreeDoc( oa_sts_doc); xmlFreeDoc( oa_info_doc); return rv; } else err("OA in slot %d is added", i); replace_resource = SAHPI_FALSE; } status_response.oaStatusArray = soap_next_node( status_response.oaStatusArray); info_response.oaInfoArray = soap_next_node( info_response.oaInfoArray); } /* End of while loop */ xmlFreeDoc(oa_sts_doc); xmlFreeDoc(oa_info_doc); return SA_OK; } /** * remove_oa * @oh_handler: Pointer to openhpi handler * @bay_number: Bay number of the extracted OA * * Purpose: * Removes the OA information from the RPTable * Updates the status of the OA in OA data structure as absent * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT remove_oa(struct oh_handler_state *oh_handler, SaHpiInt32T bay_number) { SaErrorT rv = SA_OK; SaHpiRptEntryT *rpt = NULL; struct oh_event event; struct oa_soap_handler *oa_handler = NULL; SaHpiResourceIdT resource_id; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; /* Update the OA status to absent */ switch (bay_number) { case 1: wrap_g_mutex_lock(oa_handler->oa_1->mutex); oa_handler->oa_1->oa_status = OA_ABSENT; wrap_g_mutex_unlock(oa_handler->oa_1->mutex); break; case 2: wrap_g_mutex_lock(oa_handler->oa_2->mutex); oa_handler->oa_2->oa_status = OA_ABSENT; wrap_g_mutex_unlock(oa_handler->oa_2->mutex); break; default: err("Wrong OA bay number %d passed", bay_number); return SA_ERR_HPI_INVALID_PARAMS; } update_hotswap_event(oh_handler, &event); resource_id = oa_handler->oa_soap_resources.oa.resource_id[bay_number - 1]; /* Get the rpt entry of the resource */ rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (rpt == NULL) { err("resource RPT is NULL"); return SA_ERR_HPI_INTERNAL_ERROR; } memcpy(&(event.resource), rpt, sizeof(SaHpiRptEntryT)); event.event.Source = event.resource.ResourceId; event.event.Severity = event.resource.ResourceSeverity; event.event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_ACTIVE; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_NOT_PRESENT; /* This state change happened due to surprise extraction */ event.event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_SURPRISE_EXTRACTION; /* Push the hotswap event to remove the resource from OpenHPI RPTable */ oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); /* Free the inventory info from inventory RDR */ rv = free_inventory_info(oh_handler, rpt->ResourceId); if (rv != SA_OK) { err("Inventory cleanup failed for resource id %d", rpt->ResourceId); } /* Remove the resource from plugin RPTable */ rv = oh_remove_resource(oh_handler->rptcache, event.resource.ResourceId); /* Reset resource_status structure to default values */ oa_soap_update_resource_status(&oa_handler->oa_soap_resources.oa, bay_number, "", SAHPI_UNSPECIFIED_RESOURCE_ID, RES_ABSENT); return SA_OK; } /** * add_oa * @oh_handler: Pointer to openhpi handler * @con: Pointer to the SOAP_CON structure * @bay_number: Bay number of the extracted OA * * Purpose: * Re-discover the newly added OA. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT add_oa(struct oh_handler_state *oh_handler, SOAP_CON *con, SaHpiInt32T bay_number) { SaErrorT rv = SA_OK; struct getOaStatus status_request; struct oaStatus status_response; struct getOaInfo request; struct oaInfo response; struct getOaNetworkInfo network_info; struct oaNetworkInfo network_info_response; struct oa_soap_handler *oa_handler = NULL; struct oa_info *temp = NULL; SaHpiResourceIdT resource_id; struct oh_event event; GSList *asserted_sensors = NULL; SaHpiRptEntryT *rpt; if (oh_handler == NULL || con == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; /* Get the oa_info structure of the inserted OA */ switch (bay_number) { case 1: temp = oa_handler->oa_1; break; case 2: temp = oa_handler->oa_2; break; } /* If the OA is removed during the first discovery, then * oa_soap_handler will have the information of the removed OA. * But, RPTable will not have the extracted OA information. * If the OA is inserted back and becomes active for any reason, * then we may end up trying to update the same SOAP_CON structure. * * To avoid this situation, check whether the event's SOAP_CON for * the inserted OA is same as the SOAP_CON passed to this function. * If yes, skip the SOAP_CON updating. */ if (temp->event_con != con) { status_request.bayNumber = bay_number; rv = soap_getOaStatus(con, &status_request, &status_response); if (rv != SOAP_OK) { err("get OA status failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Update the OA status of the inserted OA */ wrap_g_mutex_lock(temp->mutex); temp->oa_status = status_response.oaRole; wrap_g_mutex_unlock(temp->mutex); /* Get the IP address of the newly inserted OA */ network_info.bayNumber = bay_number; rv = soap_getOaNetworkInfo(con, &network_info, &network_info_response); if (rv != SOAP_OK) { err("Get OA network info failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Copy the server IP address to oa_info structure*/ wrap_g_mutex_lock(temp->mutex); memset(temp->server, 0, MAX_URL_LEN); strncpy(temp->server, network_info_response.ipAddress, strlen(network_info_response.ipAddress)); wrap_g_mutex_unlock(temp->mutex); } request.bayNumber = bay_number; rv = soap_getOaInfo(con, &request, &response); if (rv != SOAP_OK) { err("Get OA info failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* If the OA is not yet stable, then getOaInfo response * structure will not have proper information. Abort the * re-discovery and let the OA to stabilize. The re-discovery will be * called again after some time which will allow OA to stabilize */ if (response.serialNumber == NULL) { err("OA %d is not yet stabilized", bay_number); err("Re-discovery is aborted"); err("Re-discovery will happen after sometime"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Build the rpt entry */ rv = build_oa_rpt(oh_handler, bay_number, &resource_id); if (rv != SA_OK) { err("Failed to build OA RPT"); return rv; } /* Update resource_status structure with resource_id, serial_number, * and presence status */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.oa, bay_number, response.serialNumber, resource_id, RES_PRESENT); /* Update the OA firmware version to RPT entry */ rv = update_oa_info(oh_handler, &response, resource_id); if (rv != SA_OK) { err("Failed to update OA RPT"); return rv; } /* Build the RDRs */ rv = build_oa_rdr(oh_handler, con, bay_number, &response, resource_id); if (rv != SA_OK) { err("Failed to build OA RDR"); /* Free the inventory info from inventory RDR */ rv = free_inventory_info(oh_handler, resource_id); if (rv != SA_OK) { err("Inventory cleanup failed for resource id %d", resource_id); } oh_remove_resource(oh_handler->rptcache, resource_id); /* reset resource_status structure to default values */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.oa, bay_number, "", SAHPI_UNSPECIFIED_RESOURCE_ID, RES_ABSENT); return rv; } rv = oa_soap_populate_event(oh_handler, resource_id, &event, &asserted_sensors); if (rv != SA_OK) { err("Populating event struct failed"); return rv; } event.event.EventType = SAHPI_ET_HOTSWAP; event.event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_NOT_PRESENT; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_ACTIVE; /* NOT_PRESENT to ACTIVE state change happened due to * operator action */ event.event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_OPERATOR_INIT; /* Push the hotswap event to add the resource to OpenHPI RPTable */ oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); oa_handler->oa_soap_resources.oa.presence[bay_number - 1] = RES_PRESENT; /* Raise the assert sensor events */ if (asserted_sensors) { rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); oa_soap_assert_sen_evt(oh_handler, rpt, asserted_sensors); } return SA_OK; } /* add_oa */ /** * re_discover_blade * @oh_handler: Pointer to openhpi handler * @con: Pointer to the SOAP_CON structure * * Purpose: * Re-discover the Server Blades. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT re_discover_blade(struct oh_handler_state *oh_handler, SOAP_CON *con) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler; struct bladeInfo result; struct bladeStatus sts_result; struct bladePortMap pm_result; SaHpiInt32T i = 0,max_bays = 0; enum resource_presence_status state = RES_ABSENT; SaHpiBoolT replace_resource = SAHPI_FALSE; struct getBladeInfoArrayResponse info_response; struct getBladeStsArrayResponse sts_response; struct getBladePortMapArrayResponse pm_response; xmlDocPtr bl_info_doc = NULL; xmlDocPtr bl_sts_doc = NULL; xmlDocPtr bl_pm_doc = NULL; if (oh_handler == NULL || con == NULL) { err("Invalid parameter"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; max_bays = oa_handler->oa_soap_resources.server.max_bays; /* Get blade info array information*/ rv = oa_soap_get_bladeinfo_arr( oa_handler ,max_bays ,&info_response, bl_info_doc); if (rv != SA_OK) { err("Failed to get blade info array"); xmlFreeDoc( bl_info_doc); return rv; } rv = oa_soap_get_bladests_arr( oa_handler ,max_bays ,&sts_response, bl_sts_doc); if (rv != SA_OK) { err("Failed to get blade status array"); xmlFreeDoc(bl_sts_doc); xmlFreeDoc(bl_info_doc); return rv; } rv = oa_soap_get_portmap_arr( oa_handler ,max_bays ,&pm_response, bl_pm_doc); if (rv != SA_OK) { err("Failed to get blade portmap array"); xmlFreeDoc(bl_pm_doc); xmlFreeDoc(bl_sts_doc); xmlFreeDoc(bl_info_doc); return rv; } while ( info_response.bladeInfoArray && sts_response.bladeStsArray && pm_response.portMapArray ) { parse_bladeInfo(info_response.bladeInfoArray, &result); parse_bladeStatus(sts_response.bladeStsArray,&sts_result); parse_bladePortMap(pm_response.portMapArray,&pm_result); i = result.bayNumber; state = RES_ABSENT; // Assume blade not present in enclosure replace_resource = SAHPI_FALSE; // Assume don't replace in RPT if (result.presence != PRESENT ) { /* The blade is absent. Is the blade absent in * the presence matrix? */ if (oa_handler->oa_soap_resources.server.presence[i - 1] == RES_ABSENT){ info_response.bladeInfoArray = soap_next_node( info_response.bladeInfoArray); sts_response.bladeStsArray = soap_next_node( sts_response.bladeStsArray); pm_response.portMapArray = soap_next_node( pm_response.portMapArray); continue; } else state = RES_ABSENT; } /* The server blade is present. Is the server present in * the presence matrix? */ else if (oa_handler->oa_soap_resources.server.presence[i - 1] == RES_PRESENT) { /* Perform an error check on Serial Number */ oa_soap_check_serial_number(i, result.serialNumber); /* NULL pointer Check to avoid the segfault*/ if (result.serialNumber != 0) { /* If Serial number is different, remove and * add the blade */ if (strcmp(oa_handler->oa_soap_resources.server. serial_number[i - 1], result.serialNumber) != 0) { replace_resource = SAHPI_TRUE; } else { /* Check and update the hotswap state * of the server blade */ if(result.bladeType == BLADE_TYPE_SERVER){ rv = update_server_hotswap_state( oh_handler, con, i); if (rv != SA_OK) { err("Update server hot swap" " state failed"); xmlFreeDoc( bl_info_doc); xmlFreeDoc(bl_pm_doc); xmlFreeDoc(bl_sts_doc); return rv; } } /* Check the server sensors state */ oa_soap_proc_server_status(oh_handler, con, &sts_result); info_response.bladeInfoArray = soap_next_node(info_response.bladeInfoArray); sts_response.bladeStsArray = soap_next_node( sts_response.bladeStsArray); pm_response.portMapArray = soap_next_node( pm_response.portMapArray); continue; } } else { replace_resource = SAHPI_TRUE; } } else { oa_soap_check_serial_number(i, result.serialNumber); state = RES_PRESENT; } if ((state == RES_ABSENT || replace_resource == SAHPI_TRUE) && (oa_handler->oa_soap_resources.server.presence[i - 1] == RES_PRESENT)) { /* The server blade is present according OA presence * matrix, but server is removed. Remove the server * resource from RPTable. */ rv = remove_server_blade(oh_handler, i); if (rv != SA_OK) { err("Server blade %d removal failed", i); xmlFreeDoc( bl_info_doc); xmlFreeDoc( bl_sts_doc); xmlFreeDoc( bl_pm_doc); return rv; } else err("Server in slot %d is removed", i); } if (state == RES_PRESENT || replace_resource == SAHPI_TRUE) { /* The server blade is absent according OA presence * matrix, but server is present. Add the server * resource to RPTable. */ rv = add_server_blade(oh_handler, con, &result, &sts_result, &pm_result); if (rv != SA_OK) { err("Server blade %d add failed", i); xmlFreeDoc( bl_info_doc); xmlFreeDoc( bl_sts_doc); xmlFreeDoc( bl_pm_doc); return rv; } else err("Server in slot %d is added", i); } info_response.bladeInfoArray = soap_next_node( info_response.bladeInfoArray); sts_response.bladeStsArray = soap_next_node( sts_response.bladeStsArray); pm_response.portMapArray = soap_next_node( pm_response.portMapArray); } /* End of while loop */ xmlFreeDoc(bl_info_doc); xmlFreeDoc(bl_sts_doc); xmlFreeDoc(bl_pm_doc); return SA_OK; } /** * update_server_hotswap_state * @oh_handler: Pointer to openhpi handler * @con: Pointer to soap client handler * @bay_number: Bay number of the removed blade * * Purpose: * Updates the server blade hot swap state in RPTable * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT update_server_hotswap_state(struct oh_handler_state *oh_handler, SOAP_CON *con, SaHpiInt32T bay_number) { SaErrorT rv = SA_OK; SaHpiRptEntryT *rpt = NULL; struct oa_soap_hotswap_state *hotswap_state = NULL; struct oh_event event; SaHpiPowerStateT state; SaHpiResourceIdT resource_id; struct oa_soap_handler *oa_handler; if (oh_handler == NULL || con == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; resource_id = oa_handler->oa_soap_resources.server.resource_id[bay_number - 1]; /* Get the rpt entry of the resource */ rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (rpt == NULL) { err("resource RPT is NULL"); return SA_ERR_HPI_INTERNAL_ERROR; } hotswap_state = (struct oa_soap_hotswap_state *) oh_get_resource_data(oh_handler->rptcache, rpt->ResourceId); if (hotswap_state == NULL) { err("Unable to get the resource private data"); return SA_ERR_HPI_INVALID_RESOURCE; } rv = get_server_power_state(con, bay_number, &state); if (rv != SA_OK) { err("Unable to get power state"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Check whether current hotswap state of the server is same as * in hotswap structure in rpt entry */ if ((state == SAHPI_POWER_ON && hotswap_state->currentHsState == SAHPI_HS_STATE_ACTIVE) || (state == SAHPI_POWER_OFF && hotswap_state->currentHsState == SAHPI_HS_STATE_INACTIVE)) { return SA_OK; } /* Hotswap structure in rpt entry is not reflecting the current state * Update the hotswap structure and raise hotswap event */ update_hotswap_event(oh_handler, &event); memcpy(&(event.resource), rpt, sizeof(SaHpiRptEntryT)); event.event.Source = event.resource.ResourceId; switch (state) { case SAHPI_POWER_ON: /* Server got powered on. Update the hotswap * structure. */ hotswap_state->currentHsState = SAHPI_HS_STATE_ACTIVE; event.rdrs = NULL; /* Raise the hotswap events */ event.event.EventDataUnion.HotSwapEvent. PreviousHotSwapState = SAHPI_HS_STATE_INACTIVE; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_INSERTION_PENDING; /* The cause of the state change is unknown */ event.event.EventDataUnion.HotSwapEvent. CauseOfStateChange = SAHPI_HS_CAUSE_UNKNOWN; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); event.rdrs = NULL; event.event.EventDataUnion.HotSwapEvent. PreviousHotSwapState = SAHPI_HS_STATE_INSERTION_PENDING; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_ACTIVE; /* INSERTION_PENDING to ACTIVE state change happened * due to auto policy of server blade */ event.event.EventDataUnion.HotSwapEvent. CauseOfStateChange = SAHPI_HS_CAUSE_AUTO_POLICY; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); break; case SAHPI_POWER_OFF: /* Server got powered off. Update the hotswap * structure. */ hotswap_state->currentHsState = SAHPI_HS_STATE_INACTIVE; event.rdrs = NULL; /* Raise the hotswap events */ event.event.EventDataUnion.HotSwapEvent. PreviousHotSwapState = SAHPI_HS_STATE_ACTIVE; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_EXTRACTION_PENDING; /* ACTIVE to EXTRACTION_PENDING state change happened * due power off event. The deactivation can not be * stopped. */ event.event.EventDataUnion.HotSwapEvent. CauseOfStateChange = SAHPI_HS_CAUSE_UNEXPECTED_DEACTIVATION; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); event.rdrs = NULL; event.event.EventDataUnion.HotSwapEvent. PreviousHotSwapState = SAHPI_HS_STATE_EXTRACTION_PENDING; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_INACTIVE; /* EXTRACTION_PENDING to INACTIVE state change happened * due to auto policy of server blade */ event.event.EventDataUnion.HotSwapEvent. CauseOfStateChange = SAHPI_HS_CAUSE_AUTO_POLICY; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); break; default: err("unknown power state %d detected for " "Blade in slot %d", state, bay_number); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } /** * remove_server_blade * @oh_handler: Pointer to openhpi handler * @bay_number: Bay number of the removed blade * Purpose: * Remove the Server Blade from the RPTable * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT remove_server_blade(struct oh_handler_state *oh_handler, SaHpiInt32T bay_number) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler; struct oa_soap_hotswap_state *hotswap_state; SaHpiRptEntryT *rpt = NULL; struct oh_event event; SaHpiResourceIdT resource_id; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; update_hotswap_event(oh_handler, &event); resource_id = oa_handler->oa_soap_resources.server.resource_id[bay_number - 1]; /* Get the rpt entry of the resource */ rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (rpt == NULL) { err("resource RPT is NULL"); return SA_ERR_HPI_INTERNAL_ERROR; } memcpy(&(event.resource), rpt, sizeof(SaHpiRptEntryT)); event.event.Source = event.resource.ResourceId; event.event.Severity = event.resource.ResourceSeverity; if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP)) { /* Simple hotswap */ event.event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_ACTIVE; } else { /* Managed hotswap */ hotswap_state = (struct oa_soap_hotswap_state *) oh_get_resource_data(oh_handler->rptcache, event.resource.ResourceId); if (hotswap_state == NULL) { err("Failed to get hotswap state of server blade"); event.event.EventDataUnion.HotSwapEvent. PreviousHotSwapState = SAHPI_HS_STATE_INACTIVE; } else { event.event.EventDataUnion.HotSwapEvent. PreviousHotSwapState = hotswap_state->currentHsState; } } event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_NOT_PRESENT; if (event.event.EventDataUnion.HotSwapEvent.PreviousHotSwapState == SAHPI_HS_STATE_INACTIVE) { /* INACTIVE to NOT_PRESENT state change happened due to * operator action */ event.event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_OPERATOR_INIT; } else { /* This state change happened due to a surprise extraction */ event.event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_SURPRISE_EXTRACTION; } /* Push the hotswap event to remove the resource from OpenHPI RPTable */ oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); /* Free the inventory info from inventory RDR */ rv = free_inventory_info(oh_handler, rpt->ResourceId); if (rv != SA_OK) { err("Inventory cleanup failed for resource id %d", rpt->ResourceId); } /* Remove the resource from plugin RPTable */ rv = oh_remove_resource(oh_handler->rptcache, event.resource.ResourceId); /* reset resource_status structure to default values */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.server, bay_number, "", SAHPI_UNSPECIFIED_RESOURCE_ID, RES_ABSENT); return SA_OK; } /** * add_server_blade * @oh_handler: Pointer to openhpi handler * @con: Pointer to the SOAP_CON structure * @info: Pointer to the get blade info response structure * * Purpose: * Add newly discovered server blade to the RPTable * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT add_server_blade(struct oh_handler_state *oh_handler, SOAP_CON *con, struct bladeInfo *info, struct bladeStatus *sts, struct bladePortMap *pm_res) { SaErrorT rv = SA_OK; struct oh_event event; SaHpiPowerStateT state; SaHpiInt32T bay_number; struct oa_soap_handler *oa_handler; SaHpiResourceIdT resource_id; SaHpiRptEntryT *rpt; GSList *asserted_sensors = NULL; char blade_name[MAX_NAME_LEN]; if (oh_handler == NULL || info == NULL || con == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; update_hotswap_event(oh_handler, &event); bay_number = info->bayNumber; /* Copy the blade name from response for future processing */ convert_lower_to_upper(info->name, strlen(info->name), blade_name, MAX_NAME_LEN); /* Build the server RPT entry */ rv = build_discovered_server_rpt(oh_handler, info, &resource_id, sts); if (rv != SA_OK) { err("build added server rpt failed for slot %d",bay_number); return rv; } /* Update resource_status structure with resource_id, serial_number, * and presence status */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.server, bay_number, info->serialNumber, resource_id, RES_PRESENT); /* Build the server RDR */ rv = build_discovered_server_rdr_arr(oh_handler, con, bay_number, resource_id, blade_name, TRUE, info, sts, pm_res); if (rv != SA_OK) { err("build inserted server RDR failed"); /* Free the inventory info from inventory RDR */ rv = free_inventory_info(oh_handler, resource_id); if (rv != SA_OK) { err("Inventory cleanup failed for resource id %d", resource_id); } oh_remove_resource(oh_handler->rptcache, resource_id); /* reset resource_status structure to default values */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.server, bay_number, "", SAHPI_UNSPECIFIED_RESOURCE_ID, RES_ABSENT); return rv; } rv = oa_soap_populate_event(oh_handler, resource_id, &event, &asserted_sensors); if (rv != SA_OK) { err("Populating event struct failed"); return SA_ERR_HPI_INTERNAL_ERROR; } rpt = oh_get_resource_by_id (oh_handler->rptcache, resource_id); if (rpt == NULL) { err("INVALID RESOURCE"); return SA_ERR_HPI_INVALID_RESOURCE; } /* For blades that don't support managed hotswap, send simple hotswap event */ if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP)) { event.event.EventType = SAHPI_ET_HOTSWAP; event.event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_NOT_PRESENT; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_ACTIVE; event.event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_OPERATOR_INIT; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); /* Raise the assert sensor events */ if (asserted_sensors) oa_soap_assert_sen_evt(oh_handler, rpt, asserted_sensors); return(SA_OK); } /* Raise the hotswap event for the inserted server blade */ event.event.EventType = SAHPI_ET_HOTSWAP; event.event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_NOT_PRESENT; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_INSERTION_PENDING; /* NOT_PRESENT to INSERTION_PENDING state change happened due * to operator action */ event.event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_OPERATOR_INIT; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); event.rdrs = NULL; event.event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_INSERTION_PENDING; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_ACTIVE; /* INSERTION_PENDING to ACTIVE state change happened * due to auto policy of server blade */ event.event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_AUTO_POLICY; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); switch (sts->powered) { case (POWER_ON): state = SAHPI_POWER_ON; break; case (POWER_OFF): state = SAHPI_POWER_OFF; break; case (POWER_REBOOT): err("Wrong Power State (REBOOT) detected"); return SA_ERR_HPI_INTERNAL_ERROR; break; default: err("Unknown Power State %d detected for Blade" " in slot %d", sts->powered, sts->bayNumber); return SA_ERR_HPI_INTERNAL_ERROR; } /* Check the power state of the server. If the power state is off, * may be server got powered off after inserting. Inserting the * server makes to power on automatically. Hence raise the hotswap * events for power off. */ switch (state) { case SAHPI_POWER_ON: break; case SAHPI_POWER_OFF: event.rdrs = NULL; event.event.EventDataUnion.HotSwapEvent. PreviousHotSwapState = SAHPI_HS_STATE_ACTIVE; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_EXTRACTION_PENDING; /* ACTIVE to EXTRACTION_PENDING state change happened * due power off event. The deactivation can not be * stopped. */ event.event.EventDataUnion.HotSwapEvent. CauseOfStateChange = SAHPI_HS_CAUSE_UNEXPECTED_DEACTIVATION; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); event.rdrs = NULL; event.event.EventDataUnion.HotSwapEvent. PreviousHotSwapState = SAHPI_HS_STATE_EXTRACTION_PENDING; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_INACTIVE; /* EXTRACTION_PENDING to INACTIVE state change happened * due to auto policy of server blade */ event.event.EventDataUnion.HotSwapEvent. CauseOfStateChange = SAHPI_HS_CAUSE_AUTO_POLICY; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); break; default: err("unknown Blade power state %d detected " "in slot %d", state, info->bayNumber); return SA_ERR_HPI_INTERNAL_ERROR; } /* Raise the assert sensor events */ if (asserted_sensors) oa_soap_assert_sen_evt(oh_handler, rpt, asserted_sensors); return SA_OK; } /** * re_discover_interconnect * @oh_handler: Pointer to openhpi handler * @con: Pointer to the SOAP_CON structure * * Purpose: * Re-discover the interconnects. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT re_discover_interconnect(struct oh_handler_state *oh_handler, SOAP_CON *con) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler; struct interconnectTrayStatus status_result; struct interconnectTrayInfo info_result; struct interconnectTrayPortMap portmap; SaHpiInt32T i = 0, max_bays = 0; enum resource_presence_status state = RES_ABSENT; SaHpiBoolT replace_resource = SAHPI_FALSE; struct interconnectTrayInfoArrayResponse info_res; struct interconnectTrayStsArrayResponse sts_res; struct interconnectTrayPmArrayResponse pm_res; xmlDocPtr intr_info_doc = NULL; xmlDocPtr intr_sts_doc = NULL; xmlDocPtr intr_pm_doc = NULL; if (oh_handler == NULL || con == NULL) { err("Invalid parameter"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; max_bays = oa_handler->oa_soap_resources.interconnect.max_bays; rv = oa_soap_get_interconct_traysts_arr(oa_handler, max_bays, &sts_res, intr_sts_doc); if (rv != SA_OK) { err("Failed to get interconnect tray status array"); xmlFreeDoc( intr_sts_doc); return rv; } rv = oa_soap_get_interconct_trayinfo_arr(oa_handler ,max_bays , &info_res,intr_info_doc); if (rv != SA_OK) { err("Failed to get interconnect tray info array"); xmlFreeDoc( intr_info_doc); xmlFreeDoc( intr_sts_doc); return rv; } rv = oa_soap_get_interconct_traypm_arr(oa_handler ,max_bays, &pm_res, intr_pm_doc); if (rv != SA_OK) { err("Failed to get interconnect tray portmap array"); xmlFreeDoc( intr_pm_doc); xmlFreeDoc( intr_info_doc); xmlFreeDoc( intr_sts_doc); return rv; } while(sts_res.interconnectTrayStsArray){ parse_interconnectTrayStatus( sts_res.interconnectTrayStsArray,&status_result); parse_interconnectTrayInfo( info_res.interconnectTrayInfoArray,&info_result); parse_interconnectTrayPortMap( pm_res.interconnectTrayPmArray,&portmap); state = RES_ABSENT; replace_resource = SAHPI_FALSE; i = status_result.bayNumber; if (status_result.presence != PRESENT) { /* The interconnect is absent. Is the interconnect * absent in the presence matrix? */ if (oa_handler-> oa_soap_resources.interconnect.presence[i - 1] == RES_ABSENT){ sts_res.interconnectTrayStsArray = soap_next_node( sts_res.interconnectTrayStsArray); info_res.interconnectTrayInfoArray = soap_next_node( info_res.interconnectTrayInfoArray); pm_res.interconnectTrayPmArray = soap_next_node( pm_res.interconnectTrayPmArray); continue; }else state = RES_ABSENT; } /* The interconnect is present. Is the interconnect present * in the presence matrix? */ else if (oa_handler-> oa_soap_resources.interconnect.presence[i - 1] == RES_PRESENT) { /* If serial number is different, remove and add the * interconnect */ if (strcmp(oa_handler->oa_soap_resources.interconnect. serial_number[i - 1], info_result.serialNumber) != 0) { replace_resource = SAHPI_TRUE; } else { /* Check and update the hotswap state of the * server blade */ rv = update_interconnect_hotswap_state( oh_handler, con, i); if (rv != SA_OK) { err("update interconnect hot swap" " state failed"); xmlFreeDoc( intr_pm_doc); xmlFreeDoc( intr_info_doc); xmlFreeDoc( intr_sts_doc); return rv; } /* Check the interconnect sensors state */ rv = oa_soap_re_disc_interconct_sen( oh_handler, con, i); if (rv != SA_OK) { err("Re-discover interconnect sensors " "failed"); xmlFreeDoc( intr_pm_doc); xmlFreeDoc( intr_info_doc); xmlFreeDoc( intr_sts_doc); return rv; } sts_res.interconnectTrayStsArray = soap_next_node( sts_res.interconnectTrayStsArray); info_res.interconnectTrayInfoArray = soap_next_node( info_res.interconnectTrayInfoArray); pm_res.interconnectTrayPmArray = soap_next_node( pm_res.interconnectTrayPmArray); continue; } } else state = RES_PRESENT; if (state == RES_ABSENT || replace_resource == SAHPI_TRUE) { /* The interconnect is present according OA presence * matrix, but interconnect is removed. Remove the * interconnect resource from RPTable. */ rv = remove_interconnect(oh_handler, i); if (rv != SA_OK) { err("Interconnect blade %d removal failed", i); xmlFreeDoc( intr_pm_doc); xmlFreeDoc( intr_info_doc); xmlFreeDoc( intr_sts_doc); return rv; } else err("Interconnect blade %d removed", i); } if (state == RES_PRESENT || replace_resource == SAHPI_TRUE) { /* The interconnect is absent according OA presence * matrix, but interconnect is added. Add the * interconnect resource to RPTable. */ rv = add_interconnect(oh_handler, con, i, &info_result, &status_result, &portmap); if (rv != SA_OK) { err("Interconnect blade %d add failed", i); return rv; } else err("Interconnect blade %d added", i); } sts_res.interconnectTrayStsArray = soap_next_node( sts_res.interconnectTrayStsArray); info_res.interconnectTrayInfoArray = soap_next_node( info_res.interconnectTrayInfoArray); pm_res.interconnectTrayPmArray =soap_next_node( pm_res.interconnectTrayPmArray); } xmlFreeDoc( intr_info_doc); xmlFreeDoc( intr_sts_doc); xmlFreeDoc( intr_pm_doc); return SA_OK; } /** * update_interconnect_hotswap_state * @oh_handler: Pointer to openhpi handler * @con: Pointer to the SOAP_CON structure * @bay_number: Bay number of the removed blade * * Purpose: * Updates the interconnect hot swap state in RPTable * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT update_interconnect_hotswap_state(struct oh_handler_state *oh_handler, SOAP_CON *con, SaHpiInt32T bay_number) { SaErrorT rv = SA_OK; SaHpiRptEntryT *rpt = NULL; struct oa_soap_hotswap_state *hotswap_state = NULL; struct oh_event event; SaHpiPowerStateT state; SaHpiResourceIdT resource_id; struct oa_soap_handler *oa_handler; if (oh_handler == NULL || con == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; resource_id = oa_handler-> oa_soap_resources.interconnect.resource_id[bay_number - 1]; /* Get the rpt entry of the resource */ rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (rpt == NULL) { err("resource RPT is NULL"); return SA_ERR_HPI_INTERNAL_ERROR; } hotswap_state = (struct oa_soap_hotswap_state *) oh_get_resource_data(oh_handler->rptcache, rpt->ResourceId); if (hotswap_state == NULL) { err("Unable to get the resource private data"); return SA_ERR_HPI_INVALID_RESOURCE; } rv = get_interconnect_power_state(con, bay_number, &state); if (rv != SA_OK) { err("Unable to get interconnect power status"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Check whether current hotswap state of the interconnect is same as * in hotswap structure in rpt entry */ if ((state == SAHPI_POWER_ON && hotswap_state->currentHsState == SAHPI_HS_STATE_ACTIVE) || (state == SAHPI_POWER_OFF && hotswap_state->currentHsState == SAHPI_HS_STATE_INACTIVE)) { return SA_OK; } update_hotswap_event(oh_handler, &event); memcpy(&(event.resource), rpt, sizeof(SaHpiRptEntryT)); event.event.Source = event.resource.ResourceId; switch (state) { case SAHPI_POWER_ON: /* Interconnect got powered on. Update the hotswap * structure. */ hotswap_state->currentHsState = SAHPI_HS_STATE_ACTIVE; event.rdrs = NULL; /* Raise the hotswap events */ event.event.EventDataUnion.HotSwapEvent. PreviousHotSwapState = SAHPI_HS_STATE_INACTIVE; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_INSERTION_PENDING; /* The cause of the state change is unknown */ event.event.EventDataUnion.HotSwapEvent. CauseOfStateChange = SAHPI_HS_CAUSE_UNKNOWN; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); event.rdrs = NULL; event.event.EventDataUnion.HotSwapEvent. PreviousHotSwapState = SAHPI_HS_STATE_INSERTION_PENDING; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_ACTIVE; /* INSERTION_PENDING to ACTIVE state change happened * due to auto policy of server blade */ event.event.EventDataUnion.HotSwapEvent. CauseOfStateChange = SAHPI_HS_CAUSE_AUTO_POLICY; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); break; case SAHPI_POWER_OFF: /* Interconnect got powered off. Update the hotswap * structure. */ hotswap_state->currentHsState = SAHPI_HS_STATE_INACTIVE; event.rdrs = NULL; /* Raise the hotswap events */ event.event.EventDataUnion.HotSwapEvent. PreviousHotSwapState = SAHPI_HS_STATE_ACTIVE; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_EXTRACTION_PENDING; /* ACTIVE to EXTRACTION_PENDING state change happened * due power off event. * The deactivation can not be stopped. */ event.event.EventDataUnion.HotSwapEvent. CauseOfStateChange = SAHPI_HS_CAUSE_UNEXPECTED_DEACTIVATION; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); event.rdrs = NULL; event.event.EventDataUnion.HotSwapEvent. PreviousHotSwapState = SAHPI_HS_STATE_EXTRACTION_PENDING; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_INACTIVE; /* EXTRACTION_PENDING to INACTIVE state change happened * due to auto policy of server blade */ event.event.EventDataUnion.HotSwapEvent. CauseOfStateChange = SAHPI_HS_CAUSE_AUTO_POLICY; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); break; default: err("unknown interconnect power state %d " "in bay %d ",state,bay_number); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } /** * remove_interconnect * @oh_handler: Pointer to openhpi handler * @bay_number: Bay number of the removed interconnect * * Purpose: * Removes the interconnect. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT remove_interconnect(struct oh_handler_state *oh_handler, SaHpiInt32T bay_number) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler; struct oh_event event; struct oa_soap_hotswap_state *hotswap_state; SaHpiRptEntryT *rpt = NULL; SaHpiResourceIdT resource_id; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; update_hotswap_event(oh_handler, &event); resource_id = oa_handler-> oa_soap_resources.interconnect.resource_id[bay_number - 1]; /* Get the rpt entry of the resource */ rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (rpt == NULL) { err("resource RPT is NULL"); return SA_ERR_HPI_INTERNAL_ERROR; } memcpy(&(event.resource), rpt, sizeof(SaHpiRptEntryT)); event.event.Source = event.resource.ResourceId; event.event.Severity = event.resource.ResourceSeverity; hotswap_state = (struct oa_soap_hotswap_state *) oh_get_resource_data(oh_handler->rptcache, event.resource.ResourceId); if (hotswap_state == NULL) { err("Failed to get hotswap state"); event.event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_INACTIVE; } else event.event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = hotswap_state->currentHsState; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_NOT_PRESENT; if ((hotswap_state) && (hotswap_state->currentHsState == SAHPI_HS_STATE_INACTIVE)) { /* INACTIVE to NOT_PRESENT state change happened due to * operator action */ event.event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_OPERATOR_INIT; } else { /* This state change happened due to surprise extraction */ event.event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_SURPRISE_EXTRACTION; } /* Push the hotswap event to remove the resource from OpenHPI RPTable */ oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); /* Free the inventory info from inventory RDR */ rv = free_inventory_info(oh_handler, event.resource.ResourceId); if (rv != SA_OK) { err("Inventory cleanup failed for resource id %d", rpt->ResourceId); } /* Remove the resource from plugin RPTable */ rv = oh_remove_resource(oh_handler->rptcache, event.resource.ResourceId); /* reset resource_status structure to default values */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.interconnect, bay_number, "", SAHPI_UNSPECIFIED_RESOURCE_ID, RES_ABSENT); return SA_OK; } /** * w * add_interconnect * @oh_handler: Pointer to openhpi handler * @con: Pointer to the SOAP_CON structure * @bay_number: Bay number of the removed interconnect * * Purpose: * Adds the interconnect. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT add_interconnect(struct oh_handler_state *oh_handler, SOAP_CON *con, SaHpiInt32T bay_number, struct interconnectTrayInfo *response, struct interconnectTrayStatus *sts_res, struct interconnectTrayPortMap *portmap) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler; struct oh_event event; SaHpiPowerStateT state; SaHpiResourceIdT resource_id; GSList *asserted_sensors = NULL; SaHpiRptEntryT *rpt; if (oh_handler == NULL || con == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; /* Build the rpt entry */ rv = build_discovered_intr_rpt(oh_handler, response->name, bay_number, &resource_id, sts_res); if (rv != SA_OK) { err("Failed to build interconnect inventory RPT"); return rv; } /* Update resource_status structure with resource_id, serial_number, * and presence status */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.interconnect, bay_number, response->serialNumber, resource_id, RES_PRESENT); /* Build the RDRs */ rv = build_discovered_intr_rdr_arr(oh_handler, con, bay_number, resource_id, TRUE, response, sts_res, portmap); if (rv != SA_OK) { err("Failed to build interconnect inventory RDR"); /* Free the inventory info from inventory RDR */ rv = free_inventory_info(oh_handler, resource_id); if (rv != SA_OK) { err("Inventory cleanup failed for resource id %d", resource_id); } oh_remove_resource(oh_handler->rptcache, resource_id); /* reset resource_status structure to default values */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.interconnect, bay_number, "", SAHPI_UNSPECIFIED_RESOURCE_ID, RES_ABSENT); return rv; } rv = oa_soap_populate_event(oh_handler, resource_id, &event, &asserted_sensors); if (rv != SA_OK) { err("Populating event struct failed"); return rv; } /* Raise the hotswap event for the inserted interconnect blade */ event.event.EventType = SAHPI_ET_HOTSWAP; event.event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_NOT_PRESENT; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_INSERTION_PENDING; /* NOT_PRESENT to INSERTION_PENDING state change happened due * to operator action */ event.event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_OPERATOR_INIT; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); event.rdrs = NULL; event.event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_INSERTION_PENDING; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_ACTIVE; /* INSERTION_PENDING to ACTIVE state change happened * due to auto policy of server blade */ event.event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_AUTO_POLICY; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); /* Check the power state of the interconnect. If the power state is * off, may be interconnect got powered off after inserting. * Inserting the interconnect makes to power on automatically. * Hence raise the hotswap events for power off. */ switch (sts_res->powered) { case (POWER_ON): state = SAHPI_POWER_ON; break; case (POWER_OFF): state = SAHPI_POWER_OFF; break; case (POWER_REBOOT): err("Wrong (REBOOT) Power State detected"); return SA_ERR_HPI_INTERNAL_ERROR; break; case (POWER_UNKNOWN): state = SAHPI_POWER_OFF; break; default: err("unexpected power state %d detected for " "interconnect in bay %d", sts_res->powered, sts_res->bayNumber); return SA_ERR_HPI_INTERNAL_ERROR; } switch (state) { case SAHPI_POWER_ON: break; case SAHPI_POWER_OFF: event.event.EventDataUnion.HotSwapEvent. PreviousHotSwapState = SAHPI_HS_STATE_ACTIVE; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_EXTRACTION_PENDING; /* ACTIVE to EXTRACTION_PENDING state change happened * due power off event. * The deactivation can not be stopped. */ event.event.EventDataUnion.HotSwapEvent. CauseOfStateChange = SAHPI_HS_CAUSE_UNEXPECTED_DEACTIVATION; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); event.rdrs = NULL; event.event.EventDataUnion.HotSwapEvent. PreviousHotSwapState = SAHPI_HS_STATE_EXTRACTION_PENDING; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_INACTIVE; /* EXTRACTION_PENDING to INACTIVE state change happened * due to auto policy of server blade */ event.event.EventDataUnion.HotSwapEvent. CauseOfStateChange = SAHPI_HS_CAUSE_AUTO_POLICY; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); break; default: err("unexpected power state %d detected for " "interconnect in bay %d", state, sts_res->bayNumber); return SA_ERR_HPI_INTERNAL_ERROR; } /* Raise the assert sensor events */ if (asserted_sensors) { rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); oa_soap_assert_sen_evt(oh_handler, rpt, asserted_sensors); } return SA_OK; } /** * re_discover_fan * @oh_handler: Pointer to openhpi handler * @con: Pointer to the SOAP_CON structure * * Purpose: * Re-discover the Fans. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT re_discover_fan(struct oh_handler_state *oh_handler, SOAP_CON *con) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler; struct fanInfo result; SaHpiInt32T i =0,max_bays = 0; enum resource_presence_status state = RES_ABSENT; struct getFanInfoArrayResponse response; xmlDocPtr fan_info_doc = NULL; if (oh_handler == NULL || con == NULL) { err("Invalid parameter"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; max_bays = oa_handler->oa_soap_resources.fan.max_bays; rv = oa_soap_get_fan_info_arr ( oa_handler ,max_bays ,&response,fan_info_doc); if (rv != SA_OK) { err("Failed to get fan info array"); xmlFreeDoc( fan_info_doc); return rv; } while( response.fanInfoArray){ soap_fanInfo( response.fanInfoArray,&result); i = result.bayNumber; if (result.presence != PRESENT) { /* The Fan is absent, check Fan is absent in presence * matrix */ if (oa_handler->oa_soap_resources.fan.presence[i - 1] == RES_ABSENT){ response.fanInfoArray = soap_next_node(response.fanInfoArray); continue; } else state = RES_ABSENT; } else { /* The Fan is present, check Fan is present in presence * matrix */ if (oa_handler->oa_soap_resources.fan.presence[i - 1] == RES_PRESENT) { /* Check the fan sensors state */ oa_soap_proc_fan_status(oh_handler, &result); response.fanInfoArray = soap_next_node(response.fanInfoArray); continue; } else state = RES_PRESENT; } if (state == RES_ABSENT) { /* The Fan is present according to Fan presence matrix, * but Fan is removed. Remove the Fan resource from * RPTable. */ rv = remove_fan(oh_handler, i); if (rv != SA_OK) { err("Fan %d removal failed", i); xmlFreeDoc( fan_info_doc); return rv; } else err("Fan %d removed", i); } else if (state == RES_PRESENT) { /* The Fan is absent according Fan presence matrix, * but Fan is present. Add the Fan resource from * RPTable. */ rv = add_fan(oh_handler, con, &result); if (rv != SA_OK) { err("Fan %d add failed", i); xmlFreeDoc( fan_info_doc); return rv; } else err("Fan %d added", i); } } xmlFreeDoc(fan_info_doc); return SA_OK; } /** * remove_fan * @oh_handler: Pointer to openhpi handler * @bay_number: Bay number of the fan * * Purpose: * Remove the Fan from OpenHPI infrastructure. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT remove_fan(struct oh_handler_state *oh_handler, SaHpiInt32T bay_number) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler; SaHpiRptEntryT *rpt = NULL; struct oh_event event; SaHpiResourceIdT resource_id; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; update_hotswap_event(oh_handler, &event); resource_id = oa_handler->oa_soap_resources.fan.resource_id[bay_number - 1]; /* Get the rpt entry of the resource */ rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (rpt == NULL) { err("resource RPT is NULL"); return SA_ERR_HPI_INTERNAL_ERROR; } memcpy(&(event.resource), rpt, sizeof(SaHpiRptEntryT)); event.rdrs = NULL; event.event.Source = event.resource.ResourceId; event.event.Severity = event.resource.ResourceSeverity; event.event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_ACTIVE; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_NOT_PRESENT; /* This state change happened due to surprise extraction */ event.event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_SURPRISE_EXTRACTION; /* Push the hotswap event to remove the resource from OpenHPI RPTable */ oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); /* Free the inventory info from inventory RDR */ rv = free_inventory_info(oh_handler, event.resource.ResourceId); if (rv != SA_OK) { err("Inventory cleanup failed for resource id %d", rpt->ResourceId); } /* Remove the resource from plugin RPTable */ rv = oh_remove_resource(oh_handler->rptcache, event.resource.ResourceId); /* reset resource_status structure to default values */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.fan, bay_number, NULL, SAHPI_UNSPECIFIED_RESOURCE_ID, RES_ABSENT); return SA_OK; } /** * add_fan * @oh_handler: Pointer to openhpi handler * @con: Pointer to SOAP_CON structure * @info: Pointer to the get fan info response structure * * Purpose: * Add the fan information to OpenHPI infrastructure. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT add_fan(struct oh_handler_state *oh_handler, SOAP_CON *con, struct fanInfo *info) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler = NULL; struct oh_event event; SaHpiResourceIdT resource_id; GSList *asserted_sensors = NULL; SaHpiRptEntryT *rpt; if (oh_handler == NULL || con == NULL || info == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; /* Build the rpt entry */ rv = oa_soap_build_fan_rpt(oh_handler, info->bayNumber, &resource_id); if (rv != SA_OK) { err("Failed to populate fan RPT"); return rv; } /* Update resource_status structure with resource_id, serial_number, * and presence status. Fan doesn't have serial number, so pass in * a null string. */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.fan, info->bayNumber, NULL, resource_id, RES_PRESENT); /* Build the RDRs */ rv = oa_soap_build_fan_rdr(oh_handler, con, info, resource_id); if (rv != SA_OK) { err("Failed to populate fan RDR"); /* Free the inventory info from inventory RDR */ rv = free_inventory_info(oh_handler, resource_id); if (rv != SA_OK) { err("Inventory cleanup failed for resource id %d", resource_id); } oh_remove_resource(oh_handler->rptcache, resource_id); /* reset resource_status structure to default values */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.fan, info->bayNumber, NULL, SAHPI_UNSPECIFIED_RESOURCE_ID, RES_ABSENT); return SA_ERR_HPI_INTERNAL_ERROR; } rv = oa_soap_populate_event(oh_handler, resource_id, &event, &asserted_sensors); if (rv != SA_OK) { err("Populating event struct failed"); return rv; } event.event.EventType = SAHPI_ET_HOTSWAP; event.event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_NOT_PRESENT; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_ACTIVE; /* NOT_PRESENT to ACTIVE state change happened due to operator action */ event.event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_OPERATOR_INIT; /* Push the hotswap event to add the resource to OpenHPI RPTable */ oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); /* Raise the assert sensor events */ if (asserted_sensors) { rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); oa_soap_assert_sen_evt(oh_handler, rpt, asserted_sensors); } return SA_OK; } /** * re_discover_ps_unit * @oh_handler: Pointer to openhpi handler * @con: Pointer to the SOAP_CON structure * * Purpose: * Re-discover the Power Supply Units. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. * SA_ERR_HPI_OUT_OF_MEMORY - on out of memory **/ SaErrorT re_discover_ps_unit(struct oh_handler_state *oh_handler, SOAP_CON *con) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler; struct powerSupplyInfo *info_result = NULL; struct powerSupplyStatus sts_result; SaHpiInt32T i = 0,max_bays = 0; enum resource_presence_status state = RES_ABSENT; SaHpiBoolT replace_resource = SAHPI_FALSE; struct getPowerSupplyInfoArrayResponse info_response; struct getPowerSupplyStsArrayResponse sts_res; xmlDocPtr ps_info_doc = NULL; xmlDocPtr ps_sts_doc = NULL; if (oh_handler == NULL || con == NULL) { err("Invalid parameter"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; info_result = (struct powerSupplyInfo *)g_malloc0(sizeof(struct powerSupplyInfo)); if ( info_result == NULL ) return SA_ERR_HPI_OUT_OF_MEMORY; max_bays = oa_handler->oa_soap_resources.ps_unit.max_bays; rv = oa_soap_get_ps_info_arr( oa_handler ,max_bays ,&info_response, ps_info_doc); if (rv != SA_OK) { err("Failed to get power supply info array"); xmlFreeDoc( ps_info_doc); wrap_g_free( info_result); return rv; } rv = oa_soap_get_ps_sts_arr( oa_handler ,max_bays ,&sts_res, ps_sts_doc); if (rv != SA_OK) { err("Failed to get power supply status array"); xmlFreeDoc( ps_info_doc); xmlFreeDoc( ps_sts_doc); wrap_g_free( info_result); return rv; } while(info_response.powerSupplyInfoArray && sts_res.powerSupplyStsArray) { info_result->presence = PRESENCE_NO_OP; info_result->modelNumber[0] = '\0'; info_result->sparePartNumber[0] = '\0'; info_result->serialNumber[0] = '\0'; info_result->productName[0] = '\0'; parse_powerSupplyInfo( info_response.powerSupplyInfoArray, info_result ); parse_powerSupplyStatus( sts_res.powerSupplyStsArray, &sts_result ); /* If the power supply unit does not have the power cord * plugged in, then power supply unit will be in faulty * condition. If the power supply reports itself as PRESENT * then add it to the RPT */ i = info_result->bayNumber; if (info_result->presence != PRESENT ) { /* The power supply unit is absent. Is the power * supply unit absent in the presence matrix? */ if (oa_handler-> oa_soap_resources.ps_unit.presence[i - 1] == RES_ABSENT){ info_response.powerSupplyInfoArray = soap_next_node( info_response.powerSupplyInfoArray); sts_res.powerSupplyStsArray = soap_next_node(sts_res.powerSupplyStsArray); continue; }else state = RES_ABSENT; } else { if ((info_result->serialNumber == NULL || info_result->serialNumber[0] == '\0')) { strcpy(info_result->serialNumber,"No_Report"); err("PSU in slot %d has problem, pls check",i); } /* The power supply unit is present. Is the power * supply unit present in the presence matrix? */ if (oa_handler-> oa_soap_resources.ps_unit.presence[i - 1] == RES_PRESENT) { /* If serial number is diferent, * remove and add the power supply */ if (strcmp(oa_handler->oa_soap_resources. ps_unit.serial_number[i - 1], info_result->serialNumber) != 0) { replace_resource = SAHPI_TRUE; } else { /* Check the power supply sensors * state */ rv = oa_soap_re_disc_ps_sen( oh_handler, con, i, &sts_result); if (rv != SA_OK) { err("Re-discover power supply " "sensors failed"); wrap_g_free(info_result); xmlFreeDoc( ps_info_doc); xmlFreeDoc( ps_sts_doc); return rv; } info_response.powerSupplyInfoArray = soap_next_node( info_response.powerSupplyInfoArray); sts_res.powerSupplyStsArray = soap_next_node( sts_res.powerSupplyStsArray); continue; } } else state = RES_PRESENT; } if (state == RES_ABSENT || replace_resource == SAHPI_TRUE) { /* The power supply unit is present according power * supply presence matrix, but power supply unit is * removed. Remove the power supply unit resource * from RPTable. */ rv = remove_ps_unit(oh_handler, i); if (rv != SA_OK) { err("Power Supply Unit %d removal failed", i); wrap_g_free(info_result); xmlFreeDoc( ps_info_doc); xmlFreeDoc( ps_sts_doc); return rv; } else err("Power Supply Unit %d removed", i); } if (state == RES_PRESENT || replace_resource == SAHPI_TRUE) { /* The power supply unit is absent according power * supply presence matrix, but power supply unit is * added. Add the power supply unit resource from * RPTable. */ rv = add_ps_unit_arr(oh_handler, con, info_result, &sts_result); if (rv != SA_OK) { err("Power Supply Unit %d add failed", i); wrap_g_free(info_result); xmlFreeDoc( ps_info_doc); xmlFreeDoc( ps_sts_doc); return rv; } else err("Power Supply Unit %d added", i); replace_resource = SAHPI_FALSE; } info_response.powerSupplyInfoArray = soap_next_node(info_response.powerSupplyInfoArray); sts_res.powerSupplyStsArray = soap_next_node(sts_res.powerSupplyStsArray); } /* End of while loop */ wrap_g_free(info_result); xmlFreeDoc(ps_info_doc); xmlFreeDoc( ps_sts_doc); return SA_OK; } /** * remove_ps_unit * @oh_handler: Pointer to openhpi handler * @bay_number: Bay number of the fan * * Purpose: * Remove the Power Supply Unit. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT remove_ps_unit(struct oh_handler_state *oh_handler, SaHpiInt32T bay_number) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler; SaHpiRptEntryT *rpt = NULL; struct oh_event event; SaHpiResourceIdT resource_id; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; update_hotswap_event(oh_handler, &event); resource_id = oa_handler->oa_soap_resources.ps_unit.resource_id[bay_number - 1]; /* Get the rpt entry of the resource */ rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (rpt == NULL) { err("resource RPT is NULL"); return SA_ERR_HPI_INTERNAL_ERROR; } memcpy(&(event.resource), rpt, sizeof(SaHpiRptEntryT)); event.event.Source = event.resource.ResourceId; event.event.Severity = event.resource.ResourceSeverity; event.event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_ACTIVE; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_NOT_PRESENT; /* This state change happened due to surprise extraction */ event.event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_SURPRISE_EXTRACTION; /* Push the hotswap event to remove the resource from OpenHPI RPTable */ oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); /* Free the inventory info from inventory RDR */ rv = free_inventory_info(oh_handler, event.resource.ResourceId); if (rv != SA_OK) { err("Inventory cleanup failed for resource id %d", rpt->ResourceId); } /* Remove the resource from plugin RPTable */ rv = oh_remove_resource(oh_handler->rptcache, event.resource.ResourceId); /* reset resource_status structure to default values */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.ps_unit, bay_number, "", SAHPI_UNSPECIFIED_RESOURCE_ID, RES_ABSENT); return SA_OK; } /** * add_ps_unit * @oh_handler: Pointer to openhpi handler * @con: Pointer SOAP_CON structure * @info: Pointer to the get power supply info response structure * * Purpose: * Add the Power Supply Unit information to RPTable. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT add_ps_unit(struct oh_handler_state *oh_handler, SOAP_CON *con, struct powerSupplyInfo *info) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler = NULL; char power_supply_disp[] = POWER_SUPPLY_NAME; struct oh_event event; SaHpiResourceIdT resource_id; struct getPowerSupplyInfo request; struct powerSupplyInfo *response = NULL; GSList *asserted_sensors = NULL; SaHpiRptEntryT *rpt; if (oh_handler == NULL || con == NULL || info == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; update_hotswap_event(oh_handler, &event); /* Get power supply info to obtain the serial number */ request.bayNumber = info->bayNumber; response = (struct powerSupplyInfo *)g_malloc0(sizeof(struct powerSupplyInfo)); if ( response == NULL ) return SA_ERR_HPI_OUT_OF_MEMORY; response->presence = PRESENCE_NO_OP; response->modelNumber[0] = '\0'; response->sparePartNumber[0] = '\0'; response->serialNumber[0] = '\0'; response->productName[0] = '\0'; rv = soap_getPowerSupplyInfo(con, &request, response); if (rv != SOAP_OK) { err("Get power supply info for PS %d failed", info->bayNumber); wrap_g_free(response); return SA_ERR_HPI_INTERNAL_ERROR; } /* Build the rpt entry */ rv = build_power_supply_rpt(oh_handler, power_supply_disp, info->bayNumber, &resource_id); if (rv != SA_OK) { err("build power supply rpt failed"); wrap_g_free(response); return rv; } /* Update resource_status structure with resource_id, serial_number, * and presence status */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.ps_unit, info->bayNumber, response->serialNumber, resource_id, RES_PRESENT); /* Build the RDRs */ rv = build_power_supply_rdr(oh_handler, con, response, resource_id); if (rv != SA_OK) { err("build power supply RDR failed"); /* Free the inventory info from inventory RDR */ rv = free_inventory_info(oh_handler, resource_id); if (rv != SA_OK) { err("Inventory cleanup failed for resource id %d", resource_id); } oh_remove_resource(oh_handler->rptcache, resource_id); /* reset resource_status structure to default values */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.ps_unit, info->bayNumber, "", SAHPI_UNSPECIFIED_RESOURCE_ID, RES_ABSENT); wrap_g_free(response); return SA_ERR_HPI_INTERNAL_ERROR; } rv = oa_soap_populate_event(oh_handler, resource_id, &event, &asserted_sensors); if (rv != SA_OK) { err("Populating event struct failed"); wrap_g_free(response); return rv; } event.event.EventType = SAHPI_ET_HOTSWAP; event.event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_NOT_PRESENT; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_ACTIVE; /* NOT_PRESENT to ACTIVE state change happened due to operator action */ event.event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_OPERATOR_INIT; /* Push the hotswap event to add the resource to OpenHPI RPTable */ oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); /* Raise the assert sensor events */ if (asserted_sensors) { rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); oa_soap_assert_sen_evt(oh_handler, rpt, asserted_sensors); } wrap_g_free(response); return SA_OK; } /** * add_ps_unit_arr * @oh_handler: Pointer to openhpi handler * @con: Pointer SOAP_CON structure * @info: Pointer to the get power supply info response structure * @sts_res: Pointer to get power supply info status structure * Purpose: * Add the Power Supply Unit information to RPTable. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT add_ps_unit_arr(struct oh_handler_state *oh_handler, SOAP_CON *con, struct powerSupplyInfo *info, struct powerSupplyStatus *sts_res) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler = NULL; char power_supply_disp[] = POWER_SUPPLY_NAME; struct oh_event event; SaHpiResourceIdT resource_id; GSList *asserted_sensors = NULL; SaHpiRptEntryT *rpt; if (oh_handler == NULL || con == NULL || info == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; update_hotswap_event(oh_handler, &event); /* Build the rpt entry */ rv = build_power_supply_rpt(oh_handler, power_supply_disp, info->bayNumber, &resource_id); if (rv != SA_OK) { err("build power supply rpt failed"); return rv; } /* Update resource_status structure with resource_id, serial_number, * and presence status */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.ps_unit, info->bayNumber, info->serialNumber, resource_id, RES_PRESENT); /* Build the RDRs */ rv = build_discovered_ps_rdr_arr(oh_handler, info, resource_id, sts_res); if (rv != SA_OK) { err("build power supply RDR failed"); /* Free the inventory info from inventory RDR */ rv = free_inventory_info(oh_handler, resource_id); if (rv != SA_OK) { err("Inventory cleanup failed for resource id %d", resource_id); } oh_remove_resource(oh_handler->rptcache, resource_id); /* reset resource_status structure to default values */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.ps_unit, info->bayNumber, "", SAHPI_UNSPECIFIED_RESOURCE_ID, RES_ABSENT); return SA_ERR_HPI_INTERNAL_ERROR; } rv = oa_soap_populate_event(oh_handler, resource_id, &event, &asserted_sensors); if (rv != SA_OK) { err("Populating event struct failed"); return rv; } event.event.EventType = SAHPI_ET_HOTSWAP; event.event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_NOT_PRESENT; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_ACTIVE; /* NOT_PRESENT to ACTIVE state change happened due to operator action */ event.event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_OPERATOR_INIT; /* Push the hotswap event to add the resource to OpenHPI RPTable */ oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); /* Raise the assert sensor events */ if (asserted_sensors) { rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); oa_soap_assert_sen_evt(oh_handler, rpt, asserted_sensors); } return SA_OK; } /** * oa_soap_re_disc_oa_sen * @oh_handler : Pointer to openhpi handler * @con : Pointer SOAP_CON structure * @bay_number : OA bay nubmer * * Purpose: * Re-discovers the OA sensor states * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ static SaErrorT oa_soap_re_disc_oa_sen(struct oh_handler_state *oh_handler, SOAP_CON *con, SaHpiInt32T bay_number) { SaErrorT rv = SA_OK; struct getOaStatus request; struct oaStatus response; struct oa_soap_handler *oa_handler = NULL; SaHpiResourceIdT resource_id; struct getOaNetworkInfo nw_info_request; struct oaNetworkInfo nw_info_response; if (oh_handler == NULL || con == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; resource_id = oa_handler->oa_soap_resources.oa.resource_id[bay_number - 1]; request.bayNumber = bay_number; rv = soap_getOaStatus(con, &request, &response); if (rv != SOAP_OK) { err("Get OA status SOAP call failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Check the OA sensor states */ oa_soap_proc_oa_status(oh_handler, &response); nw_info_request.bayNumber = bay_number; rv = soap_getOaNetworkInfo(con, &nw_info_request, &nw_info_response); if (rv != SOAP_OK) { err("Get OA network info SOAP call failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Process the OA link status sensor */ rv = oa_soap_proc_sen_evt(oh_handler, resource_id, OA_SOAP_SEN_OA_LINK_STATUS, (SaHpiInt32T) nw_info_response.linkActive, 0, 0 ); if (rv != SA_OK) { err("processing the sensor event for sensor %x has failed", OA_SOAP_SEN_OA_LINK_STATUS); } return SA_OK; } /** * oa_soap_re_disc_interconct_sen * @oh_handler : Pointer to openhpi handler * @con : Pointer SOAP_CON structure * @bay_number : Interconnect bay nubmer * * Purpose: * Re-discovers the interconnect sensor states * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ static SaErrorT oa_soap_re_disc_interconct_sen(struct oh_handler_state *oh_handler, SOAP_CON *con, SaHpiInt32T bay_number) { SaErrorT rv = SA_OK; struct getInterconnectTrayStatus request; struct interconnectTrayStatus response; if (oh_handler == NULL || con == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } request.bayNumber = bay_number; rv = soap_getInterconnectTrayStatus(con, &request, &response); if (rv != SOAP_OK) { err("Get interconnect tray status SOAP call failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Check the interconnect sensor states */ oa_soap_proc_interconnect_status(oh_handler, &response); /* Check the interconnect thermal sensor state */ oa_soap_proc_interconnect_thermal(oh_handler, con, &response); return SA_OK; } /** * oa_soap_re_disc_ps_sen * @oh_handler : Pointer to openhpi handler * @con : Pointer SOAP_CON structure * @bay_number : Power supply bay nubmer * * Purpose: * Re-discovers the power supply sensor states * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ static SaErrorT oa_soap_re_disc_ps_sen(struct oh_handler_state *oh_handler, SOAP_CON *con, SaHpiInt32T bay_number, struct powerSupplyStatus *response) { if (oh_handler == NULL || con == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } /* Check the power supply sensor states */ oa_soap_proc_ps_status(oh_handler,response); return SA_OK; } /** * oa_soap_re_disc_enc_sen * @oh_handler : Pointer to openhpi handler * @con : Pointer SOAP_CON structure * * Purpose: * Re-discovers the enclosure sensor states * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ static SaErrorT oa_soap_re_disc_enc_sen(struct oh_handler_state *oh_handler, SOAP_CON *con) { SaErrorT rv = SA_OK; struct enclosureStatus response; if (oh_handler == NULL || con == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } rv = soap_getEnclosureStatus(con, &response); if (rv != SOAP_OK) { err("Get enclosure status SOAP call failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Check the enclosure sensor states */ oa_soap_proc_enc_status(oh_handler, &response); return SA_OK; } /** * oa_soap_re_disc_ps_subsys_sen * @oh_handler : Pointer to openhpi handler * @con : Pointer SOAP_CON structure * * Purpose: * Re-discovers the power subsystem sensor states * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ static SaErrorT oa_soap_re_disc_ps_subsys_sen(struct oh_handler_state *oh_handler, SOAP_CON *con) { SaErrorT rv = SA_OK; struct powerSubsystemInfo response; if (oh_handler == NULL || con == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } rv = soap_getPowerSubsystemInfo(con, &response); if (rv != SOAP_OK) { err("Get power subsystem info SOAP call failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Check the power subsystem sensor states */ oa_soap_proc_ps_subsys_info(oh_handler, &response); return SA_OK; } /** * oa_soap_re_disc_lcd_sen * @oh_handler : Pointer to openhpi handler * @con : Pointer SOAP_CON structure * * Purpose: * Re-discovers the LCD sensor states * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ static SaErrorT oa_soap_re_disc_lcd_sen(struct oh_handler_state *oh_handler, SOAP_CON *con) { SaErrorT rv = SA_OK; struct lcdStatus response; if (oh_handler == NULL || con == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } rv = soap_getLcdStatus(con, &response); if (rv != SOAP_OK) { err("Get LCD status SOAP call failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Check the LCD sensor states */ oa_soap_proc_lcd_status(oh_handler, &response); return SA_OK; } /** * oa_soap_re_disc_fz_sen * @oh_handler : Pointer to openhpi handler * @con : Pointer SOAP_CON structure * * Purpose: * Re-discovers the fan_zone sensor states * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ static SaErrorT oa_soap_re_disc_fz_sen(struct oh_handler_state *oh_handler, SOAP_CON *con) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler = NULL; struct getFanZoneArrayResponse response; struct fanZone fan_zone; SaHpiInt32T max_fz; if (oh_handler == NULL || con == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; max_fz = oa_handler->oa_soap_resources.fan_zone.max_bays; /* Get the Fan Zone array information */ rv = oa_soap_get_fz_arr(oa_handler, max_fz, &response); if (rv != SOAP_OK) { err("Get fan zone array failed"); return rv; } while (response.fanZoneArray) { soap_fanZone(response.fanZoneArray, &fan_zone); /* Check the fan zone sensor states */ oa_soap_proc_fz_status(oh_handler, &fan_zone); response.fanZoneArray = soap_next_node(response.fanZoneArray); } return SA_OK; } /** * oa_soap_re_disc_therm_subsys_sen * @oh_handler : Pointer to openhpi handler * @con : Pointer SOAP_CON structure * * Purpose: * Re-discovers the thermal subsystem sensor states * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ static SaErrorT oa_soap_re_disc_therm_subsys_sen(struct oh_handler_state *oh_handler, SOAP_CON *con) { SaErrorT rv = SA_OK; struct thermalSubsystemInfo response; if (oh_handler == NULL || con == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } rv = soap_getThermalSubsystemInfo(con, &response); if (rv != SOAP_OK) { err("Get thermal subsystem info SOAP call failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Check the thermal subsystem sensor states */ oa_soap_proc_therm_subsys_info(oh_handler, &response); return SA_OK; } openhpi-3.6.1/plugins/oa_soap/oa_soap_lcd_event.c0000644000175100017510000000706412575647266021120 0ustar mohanmohan/* * Copyright (C) 2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. * * This file has the LCD related events handling * * oa_soap_proc_lcd_status() - Processes the LCD status event * */ #include "oa_soap_lcd_event.h" /** * oa_soap_proc_lcd_status * @oh_handler: Pointer to openhpi handler structure * @con: Pointer to soap client con object * @event: Pointer to the openhpi event structure * * Purpose: * Processes the LCD status event * * Detailed Description: NA * * Return values: * NONE **/ void oa_soap_proc_lcd_status(struct oh_handler_state *oh_handler, struct lcdStatus *status) { SaErrorT rv = SA_OK; SaHpiResourceIdT resource_id; struct oa_soap_handler *oa_handler; if (oh_handler == NULL || status == NULL) { err("wrong parameters passed"); return; } oa_handler = (struct oa_soap_handler *) oh_handler->data; resource_id = oa_handler->oa_soap_resources.lcd_rid; /* Process the operational status sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_OPER_STATUS, status->status, 0, 0) /* Process the predictive failure status sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_PRED_FAIL, status->status, 0, 0) /* Process the internal data error sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_INT_DATA_ERR, status->diagnosticChecks.internalDataError, 0, 0) /* Process the device failure sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_FAIL, status->diagnosticChecks.deviceFailure, 0, 0) /* Process the device degraded sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_DEGRAD, status->diagnosticChecks.deviceDegraded, 0, 0) /* Process the enclosure overall operational status sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_ENC_AGR_OPER, status->lcdSetupHealth, 0, 0) /* Process enclosure overall predictive failure sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_ENC_AGR_PRED_FAIL, status->lcdSetupHealth, 0, 0) return; } openhpi-3.6.1/plugins/oa_soap/oa_soap_sensor.h0000644000175100017510000003443712575647270020472 0ustar mohanmohan/* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra M.S. * Shuah Khan * Raghavendra P.G. */ #ifndef _OA_SOAP_SENSOR_H #define _OA_SOAP_SENSOR_H /* Include files */ #include "oa_soap_utils.h" /* OA_SOAP_STM_VALID_MASK represents masks for "up critical" * and "up major" thresholds */ #define OA_SOAP_STM_VALID_MASK (SaHpiSensorThdMaskT)0x30 #define OA_SOAP_STM_UNSPECIFED (SaHpiSensorThdMaskT)0x00 /* Sensor classes of OA SOAP plugin * * On adding a new sesor class, please update the maximum sensor class value in * oa_soap_resources.h. Accordingly, add items to sensor enum mapping and * event assert mapping arrays in oa_soap_resources.c */ #define OA_SOAP_OPER_CLASS 0 #define OA_SOAP_PRED_FAIL_CLASS 1 #define OA_SOAP_REDUND_CLASS 2 #define OA_SOAP_DIAG_CLASS 3 #define OA_SOAP_TEMP_CLASS 4 #define OA_SOAP_PWR_STATUS_CLASS 5 #define OA_SOAP_FAN_SPEED_CLASS 6 #define OA_SOAP_PWR_SUBSYS_CLASS 7 #define OA_SOAP_ENC_AGR_OPER_CLASS 8 #define OA_SOAP_ENC_AGR_PRED_FAIL_CLASS 9 #define OA_SOAP_BOOL_CLASS 10 /* For some of the sensors like CPU fault, boolean false indicates sensor * state as enabled. BOOLEAN_REVERSE_CLASS represents the sensors whose sensor * value indicates reverse meaning */ #define OA_SOAP_BOOL_RVRS_CLASS 11 #define OA_SOAP_HEALTH_OPER_CLASS 12 #define OA_SOAP_HEALTH_PRED_FAIL_CLASS 13 #define OA_SOAP_BLADE_THERMAL_CLASS 14 /* Sensor assert states of OA SOAP plugin * * On adding new sensor event assert state, please update the maximum sensor * event array size value in oa_soap_resources.h. Accordingly, add items to * sensor event array in global sensor array in oa_soap_resources.c */ #define OA_SOAP_SEN_ASSERT_TRUE 0 #define OA_SOAP_SEN_ASSERT_FALSE 1 #define OA_SOAP_SEN_NO_CHANGE 2 /* Index of different thermal events event in event array. * These index will be used during the event generation */ /* OK to CAUTION */ #define OA_SOAP_TEMP_OK_CAUT 0 /* CAUTION to OK */ #define OA_SOAP_TEMP_CAUT_OK 1 /* CAUTION to CRITICAL */ #define OA_SOAP_TEMP_CAUT_CRIT 2 /* CRITICAL to CAUTION */ #define OA_SOAP_TEMP_CRIT_CAUT 3 /* The below code reduces the code size and eases code maintenance */ #define OA_SOAP_PROCESS_SENSOR_EVENT(sensor_num, sensor_value, reading, \ threshold) \ { \ rv = oa_soap_proc_sen_evt(oh_handler, resource_id, sensor_num, \ (SaHpiInt32T) sensor_value, reading, \ threshold); \ if (rv != SA_OK) { \ err("processing the sensor event for sensor %x has failed", \ sensor_num); \ return; \ } \ } /* Maximum number of enum values for healthStatus field in extraData structure */ #define OA_SOAP_MAX_HEALTH_ENUM 8 /* healthStatus string. This is used for parsing the healthStatus field in * extraData structure */ #define OA_SOAP_HEALTH_STATUS_STR "healthStatus" /* Different values supported by helthStatus structure in extraData */ enum oa_soap_extra_data_health { /* extraData healthStatus UNKNOWN */ HEALTH_UNKNOWN, /* extraData healthStatus OTHER */ HEALTH_OTHER, /* extraData healthStatus OK */ HEALTH_OK, /* extraData healthStatus DEGRADED */ HEALTH_DEGRAD, /* extraData healthStatus STRESSED */ HEALTH_STRESSED, /* extraData healthStatus PREDICTIVE_FAILURE */ HEALTH_PRED_FAIL, /* extraData healthStatus ERROR */ HEALTH_ERROR, /* extraData healthStatus NON_RECOVERABLERROR */ HEALTH_NRE }; /* Maximum number of supported fields in diagnosticChecksEx structure * * When a new field is added to diagnosticChecksEx structure, please update the * #define and enum oa_soap_diag_ex in oa_soap_sensor.h, also update * oa_soap_diag_ex_arr in oa_soap_resources.c */ #define OA_SOAP_MAX_DIAG_EX 17 /* Possible fields supported by diagnosticChecksEx structure * * When a new field is added to diagnosticChecksEx structure, please update the * #define and enum oa_soap_diag_ex in oa_soap_sensor.h, also update * oa_soap_diag_ex_arr in oa_soap_resources.c */ enum oa_soap_diag_ex { /* diagnosticChecksEx deviceMissing */ DIAG_EX_DEV_MISS, /* diagnosticChecksEx devicePowerSequence */ DIAG_EX_DEV_PWR_SEQ, /* diagnosticChecksEx deviceBonding */ DIAG_EX_DEV_BOND, /* diagnosticChecksEx profileUnassignedError */ DIAG_EX_PROF_UNASSIGN_ERR, /* diagnosticChecksEx deviceNotSupported */ DIAG_EX_DEV_NOT_SUPPORT, /* diagnosticChecksEx networkConfiguration */ DIAG_EX_NET_CONFIG, /* diagnosticChecksEx tooLowPowerRequest */ DIAG_EX_TOO_LOW_PWR_REQ, /* diagnosticChecksEx callHP */ DIAG_EX_CALL_HP, /* diagnosticChecksEx deviceInformational */ DIAG_EX_DEV_INFO, /* diagnosticChecksEx storageDeviceMissing */ DIAG_EX_STORAGE_DEV_MISS, /* diagnosticChecksEx firmwareMismatch */ DIAG_EX_FW_MISMATCH, /* diagnosticChecksEx enclosureIdMismatch */ DIAG_EX_ENC_ID_MISMATCH, /* POWERDELAY_IN_USE is not used as sensor. 'Power delay in use' does * not indicates any failure. */ DIAG_EX_POWERDELAY_IN_USE, /* diagnosticChecksEx deviceMixMatch */ DIAG_EX_DEV_MIX_MATCH, /* diagnosticChecksEx gprcapError */ DIAG_EX_GRPCAP_ERR, /* diagnosticChecksEx imlRecordedError */ DIAG_EX_IML_ERR, /* diagnosticChecksEx duplicateManagementIpAddress */ DIAG_EX_DUP_MGMT_IP_ADDR }; /* Maximum number of possible sensor strings provided * by getBladeThermalInfoArray soap call */ #define OA_SOAP_MAX_THRM_SEN 13 /* Enum values for the sensor description strings provide by * getBladeThermalInfoArray soap call */ enum oa_soap_thermal_sen { SYSTEM_ZONE, CPU_ZONE, CPU_1, CPU_2, CPU_3, CPU_4, DISK_ZONE, MEMORY_ZONE, AMBIENT_ZONE, STORAGE_ZONE, IO_BOARD_ZONE, POWER_SUPPLY_ZONE, CHASSIS_ZONE }; /* Define the sensor number range for blade extra thermal sensors */ #define OA_SOAP_BLD_THRM_SEN_START 0x02e #define OA_SOAP_BLD_THRM_SEN_END 0x06b /* Structure required for building thermal sensor when server blade is off */ struct oa_soap_static_thermal_sensor_info { SaHpiSensorNumT base_sen_num; /* Base sensor number for sensor type */ enum oa_soap_thermal_sen sensor; /* thermal sensor type */ SaHpiInt32T sensor_count; /* Number of sensor to be created of * above thermal sensor type */ }; /* Structure containing thermal sensor information data*/ struct oa_soap_thrm_sen_data { SaHpiRdrT rdr_num; SaHpiSensorNumT sen_delta; /* Delta difference of the sensor rdr number * from the base sensor number of particular * sensor type */ }; /* Structure for sensor reading */ struct oa_soap_sensor_reading_data { SaHpiSensorReadingT data; SaHpiEventStateT event; }; /* Declaration of sensor specific information structure */ struct oa_soap_sensor_info { SaHpiEventStateT current_state; SaHpiEventStateT previous_state; SaHpiBoolT sensor_enable; SaHpiBoolT event_enable; SaHpiEventStateT assert_mask; SaHpiEventStateT deassert_mask; SaHpiSensorReadingT sensor_reading; SaHpiSensorThresholdsT threshold; }; /* Declaration of the functions related to sensor */ SaErrorT oa_soap_get_sensor_reading(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiSensorNumT num, SaHpiSensorReadingT *data, SaHpiEventStateT *state); SaErrorT oa_soap_get_sensor_thresholds(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiSensorNumT num, SaHpiSensorThresholdsT *thres); SaErrorT oa_soap_set_sensor_thresholds(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiSensorNumT num, const SaHpiSensorThresholdsT *thres); SaErrorT oa_soap_get_sensor_event_enable(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiSensorNumT num, SaHpiBoolT *enable); SaErrorT oa_soap_set_sensor_event_enable(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiSensorNumT num, const SaHpiBoolT enable); SaErrorT oa_soap_get_sensor_enable(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiSensorNumT num, SaHpiBoolT *enable); SaErrorT oa_soap_set_sensor_enable(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiSensorNumT num, SaHpiBoolT enable); SaErrorT oa_soap_get_sensor_event_masks(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiSensorNumT num, SaHpiEventStateT *assert, SaHpiEventStateT *deassert); SaErrorT oa_soap_set_sensor_event_masks(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiSensorNumT num, SaHpiSensorEventMaskActionT act, SaHpiEventStateT assert, SaHpiEventStateT deassert); SaErrorT update_sensor_rdr(struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, SaHpiSensorNumT num, SaHpiRptEntryT *rpt, struct oa_soap_sensor_reading_data *data); SaErrorT generate_sensor_enable_event(void *oh_handler, SaHpiSensorNumT rdr_num, SaHpiRptEntryT *rpt, SaHpiRdrT *rdr, struct oa_soap_sensor_info *sensor_info); SaErrorT generate_sensor_assert_thermal_event(void *oh_handler, SaHpiSensorNumT rdr_num, SaHpiRptEntryT *rpt, SaHpiRdrT *rdr, SaHpiSensorReadingT current_reading, SaHpiSeverityT event_severity, struct oa_soap_sensor_info *sensor_info); SaErrorT generate_sensor_deassert_thermal_event(void *oh_handler, SaHpiSensorNumT rdr_num, SaHpiRptEntryT *rpt, SaHpiRdrT *rdr, SaHpiSensorReadingT current_reading, SaHpiSeverityT event_severity, struct oa_soap_sensor_info *sensor_info); SaErrorT check_and_deassert_event(struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, SaHpiRdrT *rdr, struct oa_soap_sensor_info *sensor_info); SaErrorT oa_soap_build_sen_rdr(struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, SaHpiRdrT *rdr, struct oa_soap_sensor_info **sensor_info, SaHpiSensorNumT sensor_num); SaErrorT oa_soap_map_sen_val(struct oa_soap_sensor_info *sensor_info, SaHpiSensorNumT sensor_num, SaHpiInt32T sensor_value, SaHpiInt32T *sensor_status); SaErrorT oa_soap_proc_sen_evt(struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, SaHpiSensorNumT sen_num, SaHpiInt32T sensor_value, SaHpiFloat64T trigger_reading, SaHpiFloat64T trigger_threshold); SaErrorT oa_soap_proc_mem_evt(struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, SaHpiSensorNumT sen_num, char *trigger_reading, SaHpiSeverityT severity); SaErrorT oa_soap_map_thresh_resp(SaHpiRdrT *rdr, void *response, SaHpiBoolT event_support, struct oa_soap_sensor_info *sensor_info); SaErrorT oa_soap_assert_sen_evt(struct oh_handler_state *oh_handler, SaHpiRptEntryT *rpt, GSList *assert_sensor_list); SaErrorT oa_soap_get_bld_thrm_sen_data(SaHpiSensorNumT sen_num, struct bladeThermalInfoArrayResponse response, struct bladeThermalInfo *bld_thrm_info); #endif openhpi-3.6.1/plugins/oa_soap/oa_soap_watchdog.h0000644000175100017510000000461512575647270020754 0ustar mohanmohan/* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra M.S. */ #ifndef _OA_SOAP_WATCHDOG_H #define _OA_SOAP_WATCHDOG_H /* Include files */ #include #include SaErrorT oa_soap_get_watchdog_info(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiWatchdogNumT num, SaHpiWatchdogT *wdt); SaErrorT oa_soap_set_watchdog_info(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiWatchdogNumT num, SaHpiWatchdogT *wdt); SaErrorT oa_soap_reset_watchdog(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiWatchdogNumT num); #endif openhpi-3.6.1/plugins/oa_soap/oa_soap_control.h0000644000175100017510000000602212575647270020626 0ustar mohanmohan/* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra M.S. * Shuah Khan */ #ifndef _OA_SOAP_CONTROL_H #define _OA_SOAP_CONTROL_H /* Include files */ #include #include "oa_soap.h" #include "oa_soap_power.h" #include "oa_soap_resources.h" /* Tag for the control rdr */ #define SERVER_CONTROL_STRING "Server Power Control" #define INTERCONNECT_CONTROL_STRING "Interconnect Power Control" /* Declaration of the functions related to control functionality */ SaErrorT oa_soap_get_control_state(void *oh_handler, SaHpiResourceIdT rid, SaHpiCtrlNumT rdr_num, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state); SaErrorT oa_soap_set_control_state(void *oh_handler, SaHpiResourceIdT rid, SaHpiCtrlNumT rdr_num, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state); /* Set analog limits to 0 if building a non-analog control. */ SaErrorT oa_soap_build_control_rdr(struct oh_handler_state *oh_handler, SaHpiRdrT *rdr, SaHpiResourceIdT resource_id, SaHpiCtrlNumT control_num, int analogLimitLow, int analogLimitHigh); #endif openhpi-3.6.1/plugins/oa_soap/oa_soap_fan_event.c0000644000175100017510000002177312575647270021120 0ustar mohanmohan/* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. * * This file has the implementation of the thermal subsystem, fan zone and fan * event handling * * process_fan_insertion_event() - Processes the fan insertion event * * process_fan_extraction_event() - Processes the fan extraction event * * oa_soap_proc_therm_subsys_info() - Processes the thermal subsystem info * event and generates the sensor event * * oa_soap_proc_fz_status() - Processes the fan zone status event * * oa_soap_proc_fan_status() - Processes the fan status event * */ #include "oa_soap_fan_event.h" /** * process_fan_insertion_event * @oh_handler: Pointer to openhpi handler structure * @event: Pointer to the openhpi event structure * * Purpose: * Adds the newly inserted fan information into RPT and RDR table * Creates the hot swap event * * Detailed Description: NA * * Return values: * SA_OK - success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters. * SA_ERR_HPI_INTERNAL_ERROR - on failure **/ SaErrorT process_fan_insertion_event(struct oh_handler_state *oh_handler, SOAP_CON *con, struct eventInfo *oa_event) { SaErrorT rv = SA_OK; if (oh_handler == NULL || con == NULL || oa_event == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } rv = add_fan(oh_handler, con, &(oa_event->eventData.fanInfo)); if (rv != SA_OK) { err("Adding fan %d failed", oa_event->eventData.fanInfo.bayNumber); return rv; } return SA_OK; } /** * process_fan_extraction_event * @oh_handler: Pointer to openhpi handler structure * @oa_event: Pointer to oa event response structure * * Purpose: * Deletes the extracted fan information from RPT * Creates the hot swap event * * Detailed Description: NA * * Return values: * SA_OK - success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters. * SA_ERR_HPI_INTERNAL_ERROR - on failure **/ SaErrorT process_fan_extraction_event(struct oh_handler_state *oh_handler, struct eventInfo *oa_event) { SaErrorT rv = SA_OK; if (oh_handler == NULL || oa_event == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } rv = remove_fan(oh_handler, oa_event->eventData.fanInfo.bayNumber); if (rv != SA_OK) { err("Removing fan %d failed", oa_event->eventData.fanInfo.bayNumber); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } /** * oa_soap_proc_therm_subsys_info * @oh_handler : Pointer to openhpi handler structure * @info : Pointer to thermalSubsystemInfo structure * * Purpose: * Process the thermal subsystem info event * * Detailed Description: NA * * Return values: * NONE **/ void oa_soap_proc_therm_subsys_info(struct oh_handler_state *oh_handler, struct thermalSubsystemInfo *info) { SaErrorT rv = SA_OK; SaHpiResourceIdT resource_id; struct oa_soap_handler *oa_handler; if (oh_handler == NULL || info == NULL) { err("wrong parameters passed"); return; } oa_handler = (struct oa_soap_handler *) oh_handler->data; resource_id = oa_handler->oa_soap_resources.thermal_subsystem_rid; /* Process the operational status sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_OPER_STATUS, info->operationalStatus, 0, 0); /* Process the predictive failure status sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_PRED_FAIL, info->operationalStatus, 0, 0); /* Process the redundancy sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_REDUND, info->redundancy, 0, 0); return; } /** * oa_soap_proc_fz_status * @oh_handler : Pointer to openhpi handler structure * @fan_zone : Pointer to fanZone structure * * Purpose: * Process the fan zone status event * * Detailed Description: NA * * Return values: * NONE **/ void oa_soap_proc_fz_status(struct oh_handler_state *oh_handler, struct fanZone *fan_zone) { SaErrorT rv = SA_OK; SaHpiResourceIdT resource_id; struct oa_soap_handler *oa_handler; if (oh_handler == NULL || fan_zone == NULL) { err("wrong parameters passed"); return; } oa_handler = (struct oa_soap_handler *) oh_handler->data; resource_id = oa_handler->oa_soap_resources.fan_zone. resource_id[fan_zone->zoneNumber - 1]; /* Process the operational status sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_OPER_STATUS, fan_zone->operationalStatus, 0, 0); /* Process the predictive failure status sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_PRED_FAIL, fan_zone->operationalStatus, 0, 0); /* Process the redundancy sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_REDUND, fan_zone->redundant, 0, 0); return; } /** * oa_soap_proc_fan_status * @oh_handler : Pointer to openhpi handler structure * @info : Pointer to fanInfo structure * * Purpose: * Process the fan status event * * Detailed Description: NA * * Return values: * NONE **/ void oa_soap_proc_fan_status(struct oh_handler_state *oh_handler, struct fanInfo *info) { SaErrorT rv = SA_OK; SaHpiResourceIdT resource_id; struct oa_soap_handler *oa_handler; SaHpiInt32T slot; enum diagnosticStatus diag_ex_status[OA_SOAP_MAX_DIAG_EX]; if (oh_handler == NULL || info == NULL) { err("wrong parameters passed"); return; } oa_handler = (struct oa_soap_handler *) oh_handler->data; slot = info->bayNumber; resource_id = oa_handler->oa_soap_resources.fan.resource_id[slot - 1]; /* Process the operational status sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_OPER_STATUS, info->operationalStatus, 0, 0); /* Process the predictive failure status sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_PRED_FAIL, info->operationalStatus, 0, 0); /* Process the internal data error sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_INT_DATA_ERR, info->diagnosticChecks.internalDataError, 0, 0); /* Process the device location error sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_LOC_ERR, info->diagnosticChecks.deviceLocationError, 0, 0); /* Process the device failure error sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_FAIL, info->diagnosticChecks.deviceFailure, 0, 0); /* Process the device degraded error sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_DEGRAD, info->diagnosticChecks.deviceDegraded, 0, 0); oa_soap_parse_diag_ex(info->diagnosticChecksEx, diag_ex_status); /* Process device missing sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_MISS, diag_ex_status[DIAG_EX_DEV_MISS], 0, 0) /* Process device not supported sensor rdr */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_NOT_SUPPORT, diag_ex_status[DIAG_EX_DEV_NOT_SUPPORT], 0, 0) /* Process Device mix match sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_MIX_MATCH, diag_ex_status[DIAG_EX_DEV_MIX_MATCH], 0, 0) return; } openhpi-3.6.1/plugins/oa_soap/oa_soap_ps_event.c0000644000175100017510000007267612575647270021006 0ustar mohanmohan/* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. * * This file has the implementation of the power supply unit event handling * * process_ps_insertion_event() - Processes the power supply unit * insertion event * * process_ps_extraction_event() - Processes the power supply unit * extraction event * * oa_soap_proc_ps_subsys_info() - Processes the power subsystem info event * * oa_soap_proc_ps_status() - Processes the power supply status event * * oa_soap_proc_ps_info() - Processes the power supply info event */ #include "oa_soap_ps_event.h" #include "sahpi_wrappers.h" /** * process_ps_insertion_event * @oh_handler: Pointer to openhpi handler structure * @con: Pointer to SOAP_CON structure * @oa_event: Pointer to oa event response structure * * Purpose: * Adds the newly inserted power supply information into RPT and RDR table * Creates the hot swap event * * Detailed Description: NA * * Return values: * SA_OK - success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters. * SA_ERR_HPI_INTERNAL_ERROR - on failure * SA_ERR_HPI_OUT_OF_MEMORY - on out of memory. **/ SaErrorT process_ps_insertion_event(struct oh_handler_state *oh_handler, SOAP_CON *con, struct eventInfo *oa_event) { struct getPowerSupplyInfo info; struct powerSupplyInfo *response = NULL; SaErrorT rv = SA_OK; if (oh_handler == NULL || con == NULL || oa_event == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } info.bayNumber = oa_event->eventData.powerSupplyStatus.bayNumber; response = (struct powerSupplyInfo *)g_malloc0(sizeof(struct powerSupplyInfo)); if( response == NULL){ return SA_ERR_HPI_OUT_OF_MEMORY; } response->presence = PRESENCE_NO_OP; response->modelNumber[0] = '\0'; response->sparePartNumber[0] = '\0'; response->serialNumber[0] = '\0'; response->productName[0] = '\0'; rv = soap_getPowerSupplyInfo(con, &info, response); if (rv != SOAP_OK) { err("Get power supply info failed"); wrap_g_free(response); return SA_ERR_HPI_INTERNAL_ERROR; } /* If the power supply unit does not have the power cord plugged in, * then power supply unit will be in faulty condition. If the power * supply is reported as PRESENT by the OA, add the power supply in * a ResourceFailed state. */ if (response->serialNumber[0] == '\0') { err("No Serial Number for PSU at slot %d. Please check", info.bayNumber); } rv = add_ps_unit(oh_handler, con, response); if (rv != SA_OK) { err("Add power supply %d failed", response->bayNumber); wrap_g_free(response); return rv; } wrap_g_free(response); return SA_OK; } /** * process_ps_extraction_event * @oh_handler: Pointer to openhpi handler structure * @oa_event: Pointer to oa event response structure * * Purpose: * Gets the power extraction event. * Removes the extracted power supply information from RPT * Creates the hot swap event * * Detailed Description: NA * * Return values: * SA_OK - success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters. * SA_ERR_HPI_INTERNAL_ERROR - on failure **/ SaErrorT process_ps_extraction_event(struct oh_handler_state *oh_handler, struct eventInfo *oa_event) { SaErrorT rv = SA_OK; SaHpiInt32T bay_number; struct oa_soap_handler *oa_handler; if (oh_handler == NULL || oa_event == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; bay_number = oa_event->eventData.powerSupplyStatus.bayNumber; /* If the power supply unit does not have the power cord * plugged in, then power supply unit will be in faulty * condition. In this case, all the information in the * response structure is NULL. Then the faulty power supply * unit is considered as ABSENT. Ignore the extraction event. */ if (oa_handler->oa_soap_resources.ps_unit.presence[bay_number - 1] == RES_ABSENT) { err("Extracted power supply unit may be in faulty condition"); return SA_ERR_HPI_INTERNAL_ERROR; } rv = remove_ps_unit(oh_handler, bay_number); if (rv != SA_OK) { err("Remove power supply unit failed"); } return SA_OK; } /** * oa_soap_push_power_events * @oh_handler : Pointer to openhpi handler structure * @info : Pointer to power subsystem info structure * @resource_id : Power subsystem resource id * * Purpose: * Pushes changes to oa_power controls upstream to HPI domain * * Detailed Description: NA * * Return values: * NONE **/ void oa_soap_push_power_events(struct oh_handler_state *oh_handler, struct powerSubsystemInfo *info, SaHpiResourceIdT resource_id) { struct oa_soap_handler *oa_handler; SaErrorT rv = SA_OK; SaHpiRptEntryT *rpt = NULL; SaHpiRdrT *rdr = NULL; struct powerConfigInfo *power_config_info; struct powerCapConfig *power_cap_config; xmlNode *extra_data; struct extraDataInfo extra_data_info; struct oh_event event; int oldMin = 0, oldMax = 0; int oldMinDerated = 0, oldMaxDerated = 0; int oldMinRated = 0, oldMaxRated = 0; int newMin = 0, newMax = 0; oa_handler = (struct oa_soap_handler *) oh_handler->data; power_config_info = &(oa_handler->power_config_info); power_cap_config = &(oa_handler->power_cap_config); extra_data = info->extraData; while (extra_data) { soap_getExtraData(extra_data, &extra_data_info); if (!(strcmp(extra_data_info.name, "ACLimitLow"))) { newMin = atoi(extra_data_info.value); } if (!(strcmp(extra_data_info.name, "ACLimitHigh"))) { newMax = atoi(extra_data_info.value); } extra_data = soap_next_node(extra_data); } /* If we have a new ACLimitLow or a new ACLimitHigh, then we need to */ /* push an oh_event */ if ((power_config_info->ACLimitLow != newMin) || (power_config_info->ACLimitHigh != newMax)) { /* Need to re-build static power limit control for enclosure */ dbg("Static power limits have changed\n"); dbg("New static power limit low: %d\n", newMin); dbg("New static power limit high: %d\n", newMax); rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); rdr = oh_get_rdr_next(oh_handler->rptcache, rpt->ResourceId, SAHPI_FIRST_ENTRY); while (rdr) { if (rdr->RdrType == SAHPI_CTRL_RDR) { /* Test to see if this is the static power limit */ /* control rdr */ if (rdr->RdrTypeUnion.CtrlRec.Num == OA_SOAP_STATIC_PWR_LIMIT_CNTRL) { power_config_info->ACLimitLow = newMin; power_config_info->ACLimitHigh = newMax; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Analog.Min = newMin; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Analog.Max = newMax; /* We need to constuct/send an oh_event to update the */ /* HPI domain */ memset(&event, 0, sizeof(struct oh_event)); event.event.EventType = SAHPI_ET_RESOURCE; memcpy(&event.resource, rpt, sizeof(SaHpiRptEntryT)); event.event.Severity = SAHPI_INFORMATIONAL; event.event.Source = event.resource.ResourceId; if (oh_gettimeofday(&(event.event.Timestamp)) != SA_OK) { event.event.Timestamp = SAHPI_TIME_UNSPECIFIED; } event.event.EventDataUnion.ResourceEvent. ResourceEventType = SAHPI_RESE_RESOURCE_UPDATED; event.rdrs = g_slist_append(event.rdrs, g_memdup(rdr, sizeof(SaHpiRdrT))); event.hid = oh_handler->hid; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); break; } } rdr = oh_get_rdr_next(oh_handler->rptcache, rpt->ResourceId, rdr->RecordId); if (rdr == NULL) { err("Did not find static power limit control rdr"); } } } /* Since we do not get the EVENT_ENC_GRP_CAP event - which is */ /* supposed to contain new dynamic power cap limits, we will */ /* instead query for the latest powerCapConfig, and and */ /* inspect the returned data to see if the dynamic power cap */ /* limits have changed. We also inspect the derated and rated */ /* circuit caps for OA firmware 3.00 and higher. If the limits */ /* have changed, then construct oh_event and push it to the */ /* HPI domain. */ /* Save the old limit values for comparison later */ oldMin = power_cap_config->enclosurePowerCapLowerBound; oldMax = power_cap_config->enclosurePowerCapUpperBound; oldMinDerated = power_cap_config->deratedCircuitCapLowerBound; oldMaxDerated = power_cap_config->deratedCircuitCapUpperBound; oldMinRated = power_cap_config->ratedCircuitCapLowerBound; oldMaxRated = power_cap_config->ratedCircuitCapUpperBound; /* Make a soap call to get the enclosure power cap config which */ /* may contain new dynamic power cap limits */ dbg("\n Threadid=%p \n",g_thread_self()); rv = soap_getPowerCapConfig(oa_handler->active_con, power_cap_config, &(oa_handler->desired_dynamic_pwr_cap), &(oa_handler->desired_derated_circuit_cap), &(oa_handler->desired_rated_circuit_cap)); if (rv != SOAP_OK) { err("Getting the power cap config failed"); return; } newMin = power_cap_config->enclosurePowerCapLowerBound; newMax = power_cap_config->enclosurePowerCapUpperBound; /* If we have a new enclosurePowerCapLowerBound or a new */ /* enclosurePowerCapUpperBound then we need to push an oh_event. */ if ((newMin != oldMin) || (newMax != oldMax)) { /* Need to re-build dynamic power cap control for enclosure */ dbg("Dynamic power cap has changed\n"); dbg("New dynamic power cap low: %d\n", newMin); dbg("New dynamic power cap high: %d\n", newMax); rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); rdr = oh_get_rdr_next(oh_handler->rptcache, rpt->ResourceId, SAHPI_FIRST_ENTRY); while (rdr) { if (rdr->RdrType == SAHPI_CTRL_RDR) { /* Test to see if this is the dynamic power cap control */ /* rdr */ if (rdr->RdrTypeUnion.CtrlRec.Num == OA_SOAP_DYNAMIC_PWR_CAP_CNTRL) { rdr->RdrTypeUnion.CtrlRec.TypeUnion.Analog.Min = newMin; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Analog.Max = newMax; /* We need to constuct/send an oh_event to update the */ /* HPI domain */ memset(&event, 0, sizeof(struct oh_event)); event.event.EventType = SAHPI_ET_RESOURCE; memcpy(&event.resource, rpt, sizeof(SaHpiRptEntryT)); event.event.Severity = SAHPI_INFORMATIONAL; event.event.Source = event.resource.ResourceId; if (oh_gettimeofday(&(event.event.Timestamp)) != SA_OK) { event.event.Timestamp = SAHPI_TIME_UNSPECIFIED; } event.event.EventDataUnion.ResourceEvent. ResourceEventType = SAHPI_RESE_RESOURCE_UPDATED; event.rdrs = g_slist_append(event.rdrs, g_memdup(rdr, sizeof(SaHpiRdrT))); event.hid = oh_handler->hid; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); break; } } rdr = oh_get_rdr_next(oh_handler->rptcache, rpt->ResourceId, rdr->RecordId); if (rdr == NULL) { err("Did not find dynamic power cap control rdr"); } } } /* Check the OA firmware version. For OA firmware 3.00 and higher, */ /* we have to check if the limits for derated and rated circuit */ /* caps have changed. */ if (oa_handler->active_fm_ver >= 3.0) { /* Check derated circuit cap limits for changes. */ newMin = power_cap_config->deratedCircuitCapLowerBound; newMax = power_cap_config->deratedCircuitCapUpperBound; if ((newMin != oldMinDerated) || (newMax != oldMaxDerated)) { /* Need to re-build derated circuit cap control for enclosure */ dbg("Derated circuit cap has changed\n"); dbg("New derated circuit cap low: %d\n", newMin); dbg("New derated circuit cap high: %d\n", newMax); rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); rdr = oh_get_rdr_next(oh_handler->rptcache, rpt->ResourceId, SAHPI_FIRST_ENTRY); while (rdr) { if (rdr->RdrType == SAHPI_CTRL_RDR) { /* Test to see if this is the derated circuit cap */ /* control rdr */ if (rdr->RdrTypeUnion.CtrlRec.Num == OA_SOAP_DERATED_CIRCUIT_CAP_CNTRL) { rdr->RdrTypeUnion.CtrlRec.TypeUnion.Analog.Min = newMin; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Analog.Max = newMax; /* We need to constuct/send an oh_event to update */ /* the HPI domain */ memset(&event, 0, sizeof(struct oh_event)); event.event.EventType = SAHPI_ET_RESOURCE; memcpy(&event.resource, rpt, sizeof(SaHpiRptEntryT)); event.event.Severity = SAHPI_INFORMATIONAL; event.event.Source = event.resource.ResourceId; if (oh_gettimeofday(&(event.event.Timestamp)) != SA_OK) { event.event.Timestamp = SAHPI_TIME_UNSPECIFIED; } event.event.EventDataUnion.ResourceEvent. ResourceEventType = SAHPI_RESE_RESOURCE_UPDATED; event.rdrs = g_slist_append(event.rdrs, g_memdup(rdr, sizeof(SaHpiRdrT))); event.hid = oh_handler->hid; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); break; } } rdr = oh_get_rdr_next(oh_handler->rptcache, rpt->ResourceId, rdr->RecordId); if (rdr == NULL) { err("Did not find derated circuit cap control rdr"); } } } /* Check rated circuit cap limits for changes. */ newMin = power_cap_config->ratedCircuitCapLowerBound; newMax = power_cap_config->ratedCircuitCapUpperBound; if ((newMin != oldMinRated) || (newMax != oldMaxRated)) { /* Need to re-build rated circuit cap control for enclosure */ dbg("Rated circuit cap has changed\n"); dbg("New rated circuit cap low: %d\n", newMin); dbg("New rated circuit cap high: %d\n", newMax); rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); rdr = oh_get_rdr_next(oh_handler->rptcache, rpt->ResourceId, SAHPI_FIRST_ENTRY); while (rdr) { if (rdr->RdrType == SAHPI_CTRL_RDR) { /* Test to see if this is the rated circuit cap */ /* control rdr */ if (rdr->RdrTypeUnion.CtrlRec.Num == OA_SOAP_RATED_CIRCUIT_CAP_CNTRL) { rdr->RdrTypeUnion.CtrlRec.TypeUnion.Analog.Min = newMin; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Analog.Max = newMax; /* We need to constuct/send an oh_event to */ /* update the HPI domain */ memset(&event, 0, sizeof(struct oh_event)); event.event.EventType = SAHPI_ET_RESOURCE; memcpy(&event.resource, rpt, sizeof(SaHpiRptEntryT)); event.event.Severity = SAHPI_INFORMATIONAL; event.event.Source = event.resource.ResourceId; if (oh_gettimeofday(&(event.event.Timestamp)) != SA_OK) { event.event.Timestamp = SAHPI_TIME_UNSPECIFIED; } event.event.EventDataUnion.ResourceEvent. ResourceEventType = SAHPI_RESE_RESOURCE_UPDATED; event.rdrs = g_slist_append(event.rdrs, g_memdup(rdr, sizeof(SaHpiRdrT))); event.hid = oh_handler->hid; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); break; } } rdr = oh_get_rdr_next(oh_handler->rptcache, rpt->ResourceId, rdr->RecordId); if (rdr == NULL) { err("Did not find rated circuit cap control rdr"); } } } } return; } /** * oa_soap_proc_ps_subsys_info * @oh_handler : Pointer to openhpi handler structure * @info : Pointer to power subsystem info structure * * Purpose: * Processes the power subsystem info event * * Detailed Description: NA * * Return values: * NONE **/ void oa_soap_proc_ps_subsys_info(struct oh_handler_state *oh_handler, struct powerSubsystemInfo *info) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler; SaHpiResourceIdT resource_id; if (oh_handler == NULL || info == NULL) { err("Invalid parameters"); return; } oa_handler = (struct oa_soap_handler *) oh_handler->data; resource_id = oa_handler->oa_soap_resources.power_subsystem_rid; /* Process the operational status sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_OPER_STATUS, info->operationalStatus, 0, 0); /* Process the predictive failure status sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_PRED_FAIL, info->operationalStatus, 0, 0); /* Process the redundancy sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_REDUND, info->redundancy, 0, 0); /* Push power events upstream to HPI domain if needed */ oa_soap_push_power_events(oh_handler, info, resource_id); return; } /** * oa_soap_proc_ps_status * @oh_handler : Pointer to openhpi handler structure * @status : Pointer to power supply status structure * * Purpose: * Processes the power supply status event * * Detailed Description: NA * * Return values: * NONE **/ void oa_soap_proc_ps_status(struct oh_handler_state *oh_handler, struct powerSupplyStatus *status) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler; SaHpiResourceIdT resource_id; enum diagnosticStatus diag_ex_status[OA_SOAP_MAX_DIAG_EX]; if (oh_handler == NULL || status == NULL) { err("Invalid parameters"); return; } oa_handler = (struct oa_soap_handler *) oh_handler->data; resource_id = oa_handler->oa_soap_resources.ps_unit. resource_id[status->bayNumber - 1]; /* Process the operational status sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_OPER_STATUS, status->operationalStatus, 0, 0); /* Process the predictive failure status sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_PRED_FAIL, status->operationalStatus, 0, 0); /* Process the redundancy sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_INT_DATA_ERR, status->diagnosticChecks. internalDataError, 0, 0) /* Process the device location error sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_LOC_ERR, status->diagnosticChecks. deviceLocationError, 0, 0) /* Process the device failure error sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_FAIL, status->diagnosticChecks.deviceFailure, 0, 0) /* Process the device degraded error sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_DEGRAD, status->diagnosticChecks.deviceDegraded, 0, 0) /* Process the AC failure sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_AC_FAIL, status->diagnosticChecks.acFailure, 0, 0) oa_soap_parse_diag_ex(status->diagnosticChecksEx, diag_ex_status); /* Process device not supported sensor rdr */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_NOT_SUPPORT, diag_ex_status[DIAG_EX_DEV_NOT_SUPPORT], 0, 0) /* Process Device mix match sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_MIX_MATCH, diag_ex_status[DIAG_EX_DEV_MIX_MATCH], 0, 0) return; } /** * oa_soap_proc_ps_info * @oh_handler : Pointer to openhpi handler structure * @con : Pointer to the SOAP_CON structure * @oa_event : Pointer to OA event structure * * Purpose: * Processes the power supply info event * * Detailed Description: NA * * Return values: * SA_OK - success. * SA_ERR_HPI_INVALID_PARAMS - Invalid parameters * SA_ERR_HPI_OUT_OF_MEMORY - Out of memory **/ SaErrorT oa_soap_proc_ps_info(struct oh_handler_state *oh_handler, SOAP_CON *con, struct eventInfo *oa_event) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler = NULL; SaHpiInt32T bay_number, len; char *serial_number = NULL; xmlNode *extra_data; struct extraDataInfo extra_data_info; char name[MAX_PRODUCT_NAME_LENGTH+1]; SaHpiResourceIdT resource_id; if (oh_handler == NULL || oa_event == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; bay_number = oa_event->eventData.powerSupplyInfo.bayNumber; if(!oa_event->eventData.powerSupplyInfo.serialNumber){ err("Serial # of PSU at %d is NULL", bay_number); return SA_ERR_HPI_INVALID_PARAMS; } if( oa_event->eventData.powerSupplyInfo.presence != PRESENT ) { err("Serial # of PSU at %d is NOT PRESENT", bay_number); return SA_ERR_HPI_INVALID_PARAMS; } len = strlen(oa_event->eventData.powerSupplyInfo.serialNumber); serial_number = (char *)g_malloc0(sizeof(char) * len + 1); strcpy(serial_number, oa_event->eventData.powerSupplyInfo.serialNumber); serial_number[len]='\0'; if (strcmp(serial_number,"[Unknown]") == 0 ) { err("Serial # of PSU at %d is [Unknown]", bay_number); wrap_g_free(serial_number); return SA_ERR_HPI_OUT_OF_MEMORY; } name[0] = '\0'; extra_data = oa_event->eventData.powerSupplyInfo.extraData; while (extra_data) { soap_getExtraData(extra_data, &extra_data_info); if (!(strcmp(extra_data_info.name, "productName"))) { strncpy(name,extra_data_info.value,MAX_PRODUCT_NAME_LENGTH); name[MAX_PRODUCT_NAME_LENGTH] = '\0'; } extra_data = soap_next_node(extra_data); } resource_id = oa_handler-> oa_soap_resources.ps_unit.resource_id[bay_number - 1]; /* Build the inserted ps_unit RPT entry */ rv = build_power_supply_rpt(oh_handler, name, bay_number, &resource_id); if (rv != SA_OK) { err("Failed to build the ps_unit RPT for PSU at %d", bay_number); wrap_g_free(serial_number); return rv; } /* Update resource_status structure with resource_id, * serial_number, and presence status */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.ps_unit, bay_number, serial_number, resource_id, RES_PRESENT); /* The RDR already exist, but the relevant data is available only now * So just go ahead and correct it. When building the RDR the code does * take care of already existing RDR. */ rv = build_power_supply_rdr(oh_handler, con, &(oa_event->eventData.powerSupplyInfo), resource_id); wrap_g_free(serial_number); return SA_OK; } openhpi-3.6.1/plugins/oa_soap/oa_soap_utils.c0000644000175100017510000021662412575647266020321 0ustar mohanmohan/* * Copyright (C) 2007-2009, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. * Vivek Kumar * Shuah Khan * Mohan Devarajulu * * This file implements all the utility functions which will be useful of oa * soap functioning. Majority of the functions are helper functions for * different modules. * * get_oa_soap_info() - Get active and stand by oa information * including IP address * * get_oa_state() - Get the both oa states and initializes * the SOAP_CON objects * * update_hotswap_event() - Updates the Hotswap event structure * * copy_oa_soap_event() - Copies the event data from the event * received from oa into the * allocated event structure * * push_event_to_queue() - Pushes events into the infrastructure * event queue * * del_rdr_from_event() - Delete RDRs from rdrlist of the * event structure * * check_oa_status() - Check the oa status and update the oa * handler with active OA SOAP_CON * * check_oa_user_permissions() - Check the OA with user permissions * level and makes sure plug-in can * access all the resources using the * supplied user credentials in the * conf file * * check_discovery_failure() - Checks reason for discovery failure * If the failure is due to 'insufficient * priveleges' then creates the fresh * oa session * * lock_oa_soap_handler() - Tries to lock the oa_handler mutex. * If mutex is already locked earlier, * returns error * * check_config_parameters() - Checks whether all the parameters are * present in the config file * * create_event_session() - Creates a event session with OA * * create_oa_connection() - Create OA connection after closing the * earlier soap_con structures * * initialize_oa_con() - Initialize the hpi_con and event_con * * delete_all_inventory_info() - Frees the memory allocated for * inventory areas for all the resources * * cleanup_plugin_rptable() - Frees the memory allocated for * plugin RPTable * * release_oa_soap_resources() - Frees the memory allocated for * resources presence matrix and serial * number array * * get_oa_fw_version() - Gets the Active OA firmware version * * update_oa_info() - Updates the RPT entry with OA * firmware version. Updates the serial * number array with OA serial number. * * convert_lower_to_upper - Converts the lower case to upper case * * update_oa_fw_version() - Updates the RPT entry and IDR entry * with OA firmware version * * oa_soap_check_serial_number() - Check the serial_number and * give a proper message * * oa_soap_sleep_in_loop() - Sleep in 3 second intervals so that * thread could catch the signal and exit * **/ #include "oa_soap_utils.h" #include "sahpi_wrappers.h" /** * get_oa_soap_info * @oh_handler: Pointer to the openhpi handler * * Purpose: * Gets the Active/standby OA hostname/IP address from the config file * and calls the get_oa_info fucntion * * Detailed Description: * - Will take the active oa ip from configuration file and will check the * oa state. If active oa is not accessible, we would try the standby oa * - Same above operation will be repeated for the standby oa. If standby * oa is also not accessible, then return error * - Checks whether OA hostname/IP address is not empty string * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - if wrong parameters passed * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT get_oa_soap_info(struct oh_handler_state *oh_handler) { SaErrorT rv = SA_OK; SaHpiInt32T len = 0; char *server = NULL; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } /* Get the Active OA hostname/IP address and check whether it is NULL */ server = (char *) g_hash_table_lookup(oh_handler->config, "ACTIVE_OA"); /* Check whether server string is not empty */ len = strlen(server); if (len != 0) { /* Get the OA states and initialize the SOAP_CON structures */ rv = get_oa_state(oh_handler, server); if (rv == SA_OK) return SA_OK; } else { err("ACTIVE_OA is not provided by the user"); } /* May be user has supplied wrong hostname/IP address * or OA is not reachable. Ignore and try with standby OA * Get the Standby OA hostname/IP address and check whether it is NULL */ server = (char *) g_hash_table_lookup(oh_handler->config, "STANDBY_OA"); if (server == NULL) { err("STANDBY_OA entry is not present in conf file"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Check whether server string is not empty */ len = strlen(server); if (len == 0) { err("STANDBY_OA is not provided by the user"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Get the OA states and initialize the SOAP_CON structures */ rv = get_oa_state(oh_handler, server); if (rv != SA_OK) { err("Standby OA - %s may not be accessible", server); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } /** * get_oa_state * @oa_handler: Pointer to OA SOAP handler structure * @server: Pointer to hostname/IP address of the OA * * Purpose: * Gets the details of active and standby OA * * Detailed Description: * - Initializes the SOAP_CON structures * - Using the supplied user credentials from config file, soap connection * is made using soap_open api for both hpi and events receiving * - Will check the user permission on OA using check_user_permission api * - Will get the oa information. Using these info, this api will decide * which oa is active and which one is standby * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT get_oa_state(struct oh_handler_state *oh_handler, char *server) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler = NULL; struct getOaStatus status; struct oaStatus status_response; struct getOaInfo info; struct oaInfo info_response; struct getOaNetworkInfo network_info; struct oaNetworkInfo network_info_response; enum oaRole oa_role; char active_ip[MAX_URL_LEN], standby_ip[MAX_URL_LEN], *url = NULL; char active_fm[MAX_BUF_SIZE], standby_fm[MAX_BUF_SIZE]; char firmware[MAX_BUF_SIZE]; char *user_name = NULL, *password = NULL; SaHpiInt32T i, bay = 0, active_bay = 0, standby_bay = 0; SOAP_CON *hpi_con = NULL, *event_con = NULL; struct oa_info *this_oa = NULL, *other_oa = NULL; char *endptr = NULL; struct extraDataInfo extra_data_info; xmlNode *extra_data = NULL; if (oh_handler == NULL|| server == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } if (!strcmp(server,"0.0.0.0")) { err("Invalid OA IP 0.0.0.0"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; /* Create the OA URL */ rv = asprintf(&url, "%s" PORT, server); if(rv == -1){ free(url); err("Failed to allocate memory for buffer to \ hold OA credentials"); return SA_ERR_HPI_OUT_OF_MEMORY; } /* Get the user_name and password from config file */ user_name = (char *) g_hash_table_lookup(oh_handler->config, "OA_User_Name"); password = (char *) g_hash_table_lookup(oh_handler->config, "OA_Password"); /* Estabish the connection with OA */ hpi_con = soap_open(url, user_name, password, HPI_CALL_TIMEOUT); if (hpi_con == NULL) { free(url); err("hpi_con intialization for OA - %s has failed", server); return SA_ERR_HPI_INTERNAL_ERROR; } event_con = soap_open(url, user_name, password, EVENT_CALL_TIMEOUT); if (event_con == NULL) { free(url); err("event_con intialization for OA - %s has failed", server); soap_close(hpi_con); return SA_ERR_HPI_INTERNAL_ERROR; } free(url); url = NULL; /* Check whether user_name has admin rights */ rv = check_oa_user_permissions(oa_handler, hpi_con, user_name); if (rv != SA_OK) { soap_close(hpi_con); soap_close(event_con); return rv; } /* Get the 2 OAs information */ for (i = 1; i <= MAX_OA_BAYS; i++) { status.bayNumber = i; rv = soap_getOaStatus(hpi_con, &status, &status_response); if (rv != SOAP_OK) { err("Get OA status failed"); soap_close(hpi_con); soap_close(event_con); return SA_ERR_HPI_INTERNAL_ERROR; } oa_role = status_response.oaRole; /* Sometimes, if the OA is absent, then OA status is shown as * STANDBY in getOaStatus response. As workaround, if OA * status is STANDBY and oaRedudancy state is set to false, * then, it is considered as ABSENT. * * But, if the OA is recently inserted, then oaRedudancy state * will be set to false. In this scenario, the OA state will * be wrongly considered as ABSENT. This is a known limitation. * TODO: Remove this workaround once the fix is available in * OA firmware. */ if ((oa_role == OA_ABSENT) || (oa_role == STANDBY && status_response.oaRedundancy == HPOA_FALSE)) continue; info.bayNumber = i; rv = soap_getOaInfo(hpi_con, &info, &info_response); if (rv != SOAP_OK) { err("Get OA info failed"); soap_close(hpi_con); soap_close(event_con); return SA_ERR_HPI_INTERNAL_ERROR; } /* 'youAreHere' true indicates that we are talking to this OA. * This helps to find the bay number of the active and standby * OA. */ if (info_response.youAreHere == HPOA_TRUE) { bay = i; /* Find the oa_info structure for this OA (to which we * are talking to) and the other OA. */ switch (bay) { case 1: this_oa = oa_handler->oa_1; other_oa = oa_handler->oa_2; break; case 2: this_oa = oa_handler->oa_2; other_oa = oa_handler->oa_1; break; } } /* Store the firmware version. * Firmware version is not used. * We may require when we support multiple OA firmwares. */ memset(firmware, 0, MAX_BUF_SIZE); strncpy(firmware, info_response.fwVersion, strlen(info_response.fwVersion)); network_info.bayNumber = i; rv = soap_getOaNetworkInfo(hpi_con, &network_info, &network_info_response); if (rv != SOAP_OK) { err("Get OA network info failed"); soap_close(hpi_con); soap_close(event_con); return SA_ERR_HPI_INTERNAL_ERROR; } extra_data = network_info_response.extraData; while (extra_data) { soap_getExtraData(extra_data, &extra_data_info); if ((!(strcmp(extra_data_info.name, "IpSwap"))) && (extra_data_info.value != NULL)) { if(!(strcasecmp(extra_data_info.value, "true"))) { oa_handler->ipswap = HPOA_TRUE; } else { oa_handler->ipswap = HPOA_FALSE; } break; } extra_data = soap_next_node(extra_data); } /* Find the active and standby bay number, IP address * and firmware version */ switch (oa_role) { case ACTIVE: active_bay = i; memset(active_ip, 0, MAX_URL_LEN); rv = oa_soap_get_oa_ip(server, network_info_response, active_ip); if (rv != SOAP_OK) { err("Get Active OA IP failed"); soap_close(hpi_con); soap_close(event_con); return SA_ERR_HPI_INTERNAL_ERROR; } memset(active_fm, 0, MAX_BUF_SIZE); strncpy(active_fm, firmware, strlen(firmware)); /* Check that string to float conversion */ /* proceeds without error. */ errno = 0; oa_handler->active_fm_ver = strtod(firmware, &endptr); if ((errno != 0) || (firmware == endptr)) { /* Float conversion did not work */ err("could not convert OA firmware version \ %s to a floating point value\n", firmware); } break; case STANDBY: standby_bay = i; memset(standby_ip, 0, MAX_URL_LEN); rv = oa_soap_get_oa_ip(server, network_info_response, standby_ip); if (rv != SOAP_OK) { err("Get Standby OA IP failed"); soap_close(hpi_con); soap_close(event_con); return SA_ERR_HPI_INTERNAL_ERROR; } memset(standby_fm, 0, MAX_BUF_SIZE); strncpy(standby_fm, firmware, strlen(firmware)); break; default: err("wrong oa state detected for bay %d", i); soap_close(hpi_con); soap_close(event_con); return SA_ERR_HPI_INTERNAL_ERROR; } } if (active_bay != 0) { dbg("\tActive OA bay number - %d", active_bay); dbg("\tActive OA ip address - %s", active_ip); dbg("\tActive OA firmware version - %s", active_fm); } if (standby_bay != 0) { dbg("\tStandby OA bay number - %d", standby_bay); dbg("\tStandby OA ip address - %s", standby_ip); dbg("\tStandby OA firmware version - %s", standby_fm); } /* Get the status and firmware version of the OA which we are * talking to */ if (bay == active_bay) { this_oa->oa_status = ACTIVE; this_oa->fm_version = atof(active_fm); } else { /* bay == standby_bay */ this_oa->oa_status = STANDBY; this_oa->fm_version = atof(standby_fm); } /* Initialize the hpi_con and event_con structures */ this_oa->hpi_con = hpi_con; this_oa->event_con = event_con; memset(this_oa->server, 0, MAX_URL_LEN); strncpy(this_oa->server, server, strlen(server)); /* Check whether 2 OAs are present or not */ if (active_bay == 0 || standby_bay == 0) return SA_OK; memset(other_oa->server, 0, MAX_URL_LEN); /* Construct the other OA url and copy the IP address to oa_info * structure */ if (bay == standby_bay) { other_oa->oa_status = ACTIVE; other_oa->fm_version = atof(active_fm); strncpy(other_oa->server, active_ip, strlen(active_ip)); rv = asprintf(&url, "%s" PORT, active_ip); if (rv == -1){ free(url); err("Failed to allocate memory for buffer to \ hold OA credentials"); return SA_ERR_HPI_OUT_OF_MEMORY; } } else { other_oa->oa_status = STANDBY; other_oa->fm_version = atof(standby_fm); strncpy(other_oa->server, standby_ip, strlen(standby_ip)); rv = asprintf(&url, "%s" PORT, standby_ip); if(rv == -1){ free(url); err("Failed to allocate memory for buffer to \ hold OA credentials"); return SA_ERR_HPI_OUT_OF_MEMORY; } } /* Initialize the soap_con for hpi and event thread */ other_oa->hpi_con = soap_open(url, user_name, password, HPI_CALL_TIMEOUT); if (other_oa->hpi_con == NULL) { err("Initializing the hpi_con for OA %s failed", url); free(url); /* If this OA status is ACTIVE, then return error, else ignore * If standby OA is not accessible, then the recovery from * this problem will be done by the event thread. * Since we have access to Active OA, we should ignore this * for time being */ if (other_oa->oa_status == ACTIVE) { soap_close(this_oa->hpi_con); soap_close(this_oa->event_con); this_oa->hpi_con = NULL; this_oa->event_con = NULL; err("Active OA - %s may not be accessible", other_oa->server); return SA_ERR_HPI_INTERNAL_ERROR; } else return SA_OK; } other_oa->event_con = soap_open(url, user_name, password, EVENT_CALL_TIMEOUT); if (other_oa->event_con == NULL) { err("Initializing the event_con for OA %s failed", url); free(url); /* If this OA status is ACTIVE, then return error, else * ignore */ if (other_oa->oa_status != ACTIVE) { soap_close(this_oa->hpi_con); soap_close(this_oa->event_con); this_oa->hpi_con = NULL; this_oa->event_con = NULL; soap_close(other_oa->hpi_con); other_oa->hpi_con = NULL; err("Active OA - %s may not be accessible", other_oa->server); return SA_ERR_HPI_INTERNAL_ERROR; } else { soap_close(other_oa->hpi_con); other_oa->hpi_con = NULL; return SA_OK; } } free(url); return SA_OK; } /** * update_hotswap_event * @event: Pointer to openhpi event structure * @oh_handler: Pointer to the openhpi handler * * Purpose: * this api updates the event structure with hotswap details * * Detailed Description: NA * * Return values: * NONE **/ void update_hotswap_event(struct oh_handler_state *oh_handler, struct oh_event *event) { if (oh_handler == NULL || event == NULL) { err("Invalid parameters"); return; } memset(event, 0, sizeof(struct oh_event)); event->hid = oh_handler->hid; event->event.EventType = SAHPI_ET_HOTSWAP; /* TODO: map the timestamp of the OA generated event */ oh_gettimeofday(&(event->event.Timestamp)); event->event.Severity = SAHPI_CRITICAL; } /** * copy_oa_soap_event * @event: Pointer to the openhpi event structure * * Purpose: * makes a copy of the received event * * Detailed Description: * - Allocates the memory to new event structure. * - Copies the hpi event to the newly created event structure * - Returns the newly created event structure * * Return values: * Pointer to copied oh_event structure - on success * NULL - if wrong parameters passed * - if the memory allocation failed. **/ struct oh_event *copy_oa_soap_event(struct oh_event *event) { struct oh_event *e; if (event == NULL) { err("Invalid parameter"); return NULL; } e = (struct oh_event *)g_malloc0(sizeof(struct oh_event)); if (e == NULL) { err("Out of memory!"); return NULL; } memcpy(e, event, sizeof(struct oh_event)); return e; } /** * del_rdr_from_event * @event: Pointer to the openhpi event structure * * Purpose: * deletes the RDR from the event. * * Detailed Description: * - traverse the event.rdrs list and delete the RDRs one by one. * - This function will be called if the discovery fails for a resource * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - if wrong parameters passed * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT del_rdr_from_event(struct oh_event *event) { GSList *node = NULL; SaHpiRdrT *rdr = NULL; if (event == NULL) { err("Invalid parameter"); return SA_ERR_HPI_INVALID_PARAMS; } if (event->rdrs == NULL) return SA_OK; /* Traverse the RDRs list and delete the RDR */ node = event->rdrs; do { rdr = NULL; rdr = (SaHpiRdrT *)node->data; if (rdr == NULL) { err("Wrong node detected in the GSList"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Pop out the RDR from the RDRs list */ event->rdrs = g_slist_remove(event->rdrs, (gpointer)rdr); wrap_g_free(rdr); /* Get the next RDR */ node = event->rdrs; } while (node != NULL); return SA_OK; } /** * check_oa_status * @oa_handler: Pointer to the OA SOAP plug-in handler * @oa: Pointer to the OA data structure * @con: Pointer to the SOAP_CON structure * * Purpose: * checks the status of the oa * * Detailed Description: * - gets the status of the OA * - Updates the OA handler with active OA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - if wrong parameters passed * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT check_oa_status(struct oa_soap_handler *oa_handler, struct oa_info *oa, SOAP_CON *con) { SaErrorT rv = SA_OK; struct getOaStatus status; struct oaStatus status_response; if (oa_handler == NULL || oa == NULL || con == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } /* Get the bay number of the OA */ if (oa == oa_handler->oa_1) status.bayNumber = 1; else status.bayNumber = 2; wrap_g_mutex_lock(oa->mutex); rv = soap_getOaStatus(con, &status, &status_response); if (rv != SOAP_OK) { err("Get OA status call failed"); wrap_g_mutex_unlock(oa->mutex); return SA_ERR_HPI_INTERNAL_ERROR; } if (status_response.oaRole == TRANSITION) { /* OA is in transitioning state to become active. * This is a very rare scenario. * * Wait till it it becomes Active */ err("OA is in transition state"); oa_soap_sleep_in_loop(oa_handler, OA_STABILIZE_MAX_TIME); rv = soap_getOaStatus(con, &status, &status_response); if (rv != SOAP_OK) { err("Get OA status call failed"); wrap_g_mutex_unlock(oa->mutex); return SA_ERR_HPI_INTERNAL_ERROR; } /* Check OA is still in TRANSITION state * Ideally, OA should be out of TRANSITION state */ if (status_response.oaRole == TRANSITION) { err("OA is in TRANSITION for a long time"); err("Please correct the OA"); wrap_g_mutex_unlock(oa->mutex); return SA_ERR_HPI_INTERNAL_ERROR; } } /* If Enclosure IP mode is enabled then ipswap becomes true, then Active OA IP is always same. So do not change the Role */ if(!oa_handler->ipswap) { oa->oa_status = status_response.oaRole; } if (oa->oa_status == ACTIVE) { wrap_g_mutex_unlock(oa->mutex); /* Always lock the oa_handler mutex and then oa_info mutex * This is to avoid the deadlock */ wrap_g_mutex_lock(oa_handler->mutex); wrap_g_mutex_lock(oa->mutex); /* Point the active_con to Active OA's hpi_con */ if (oa_handler->active_con != oa->hpi_con) { oa_handler->active_con = oa->hpi_con; err("OA %s has become Active", oa->server); } wrap_g_mutex_unlock(oa->mutex); wrap_g_mutex_unlock(oa_handler->mutex); } else wrap_g_mutex_unlock(oa->mutex); return SA_OK; } /** * check_oa_user_permissions * @oa_handler: Pointer to the oa_handler structure * @con: Pointer to the SOAP CON * @user_name: Pointer to the user name string * * Purpose: * check oa user permissions, even for the oa administrator. * * Detailed Description: * - checks whether OA user has ADMINISTRATOR or OPERATOR * permission and can access all the resources in HP * BladeSystem c-Class * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - if wrong parameters passed * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT check_oa_user_permissions(struct oa_soap_handler *oa_handler, SOAP_CON *con, char *user_name) { SaErrorT rv = SA_OK; struct getUserInfo request; struct userInfo response; struct bayAccess bay_access; if (oa_handler == NULL || con == NULL || user_name == NULL) { err("Invalid Parameters"); return SA_ERR_HPI_INVALID_PARAMS; } memset(&request, 0, sizeof(struct getUserInfo)); request.username = user_name; rv = soap_getUserInfo(con, &request, &response); if (rv != SOAP_OK) { err("Get user info call failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Check user name is enabled or not * This should ideally never fail. * We can not have a user name which is disabled and session is created */ if (response.isEnabled != HPOA_TRUE) { err("User - %s is not enabled for OA %s", user_name, con->server); err("Please give full permissions to user - %s", user_name); oa_handler->status = PLUGIN_NOT_INITIALIZED; return SA_ERR_HPI_INTERNAL_ERROR; } /* Check for the ADMINISTRATOR or OPERATOR rights */ if ((response.acl != ADMINISTRATOR) && (response.acl != OPERATOR)) { err("User - %s is not Administrator or Operator on OA %s", user_name, con->server); err("Please give full permissions to user - %s", user_name); return SA_ERR_HPI_INTERNAL_ERROR; } /* Check the permissions for accessing OA */ if (response.bayPermissions.oaAccess != HPOA_TRUE) { err("User - %s does not have access rights to OA bay(s) " "for OA %s", user_name, con->server); err("Please give full permissions to user - %s", user_name); return SA_ERR_HPI_INTERNAL_ERROR; } /* Check the permissions for accessing server lades */ while (response.bayPermissions.bladeBays) { soap_getBayAccess(response.bayPermissions.bladeBays, &bay_access); if (bay_access.access != HPOA_TRUE) { err("User - %s does not have access rights to " "server bay(s) for OA - %s", user_name, con->server); err("Please give full permissions to user - %s", user_name); return SA_ERR_HPI_INTERNAL_ERROR; } response.bayPermissions.bladeBays = soap_next_node(response.bayPermissions.bladeBays); } /* Check the permissions for accessing interconnect */ while (response.bayPermissions.interconnectTrayBays) { soap_getBayAccess(response.bayPermissions.interconnectTrayBays, &bay_access); if (bay_access.access != HPOA_TRUE) { err("User - %s does not have access rights to " "interconnect bay(s) for OA %s", user_name, con->server); err("Please give full permissions to user - %s", user_name); return SA_ERR_HPI_INTERNAL_ERROR; } response.bayPermissions.interconnectTrayBays = soap_next_node(response.bayPermissions. interconnectTrayBays); } return SA_OK; } /** * check_discovery_failure * @oh_handler: Pointer to the openhpi handler * * Purpose: * checks the oa status after the discovery failure. * * Detailed Description: * - this api will be called only during the discovery failure. * - checks the reason for discovery failure. * - if the failure is due to 'insufficient priveleges', * then creates the fresh oa session * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - if wrong parameters passed * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT check_discovery_failure(struct oh_handler_state *oh_handler) { SaErrorT oa1_rv, oa2_rv, rv; struct oa_soap_handler *oa_handler = NULL; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; /* Initialize the return values with failure case */ oa1_rv = SA_ERR_HPI_INTERNAL_ERROR; oa2_rv = SA_ERR_HPI_INTERNAL_ERROR; /* If the hpi_con is NULL, then OA is not reachable */ rv = get_oa_soap_info(oh_handler); if (rv != SA_OK) { oa_handler->status = PLUGIN_NOT_INITIALIZED; err("Get OA SOAP info failed"); return rv; } if (oa_handler->oa_1->hpi_con != NULL) { /* Get the status of the OA in slot 1 */ oa1_rv = check_oa_status(oa_handler, oa_handler->oa_1, oa_handler->oa_1->hpi_con); if (oa1_rv != SA_OK) err("check oa_status has failed for - %s", oa_handler->oa_1->server); } if (oa_handler->oa_2->hpi_con != NULL) { /* Get the status of the OA in slot 2 */ oa2_rv = check_oa_status(oa_handler, oa_handler->oa_2, oa_handler->oa_2->hpi_con); if (oa2_rv != SA_OK) err("check oa_status has failed for OA - %s", oa_handler->oa_2->server); } /* If the OA is reachable (check_oa_status call succeeded) * and OA STATUS is ACTIVE, then return sucess, else return failure. */ if (oa1_rv == SA_OK && oa_handler->oa_1->oa_status == ACTIVE) return SA_OK; else if (oa2_rv == SA_OK && oa_handler->oa_2->oa_status == ACTIVE) return SA_OK; else return SA_ERR_HPI_INTERNAL_ERROR; } /** * lock_oa_soap_handler * @oa_handler: Pointer to the oa_handler * * Purpose: * Tries to lock the oa_handler mutex. If mutex is already locked earlier, * returns error * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on invalid parameters. * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT lock_oa_soap_handler(struct oa_soap_handler *oa_handler) { gboolean lock_state = TRUE; if (oa_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } /* Try to lock the oa_handler mutex */ lock_state = wrap_g_mutex_trylock(oa_handler->mutex); if (lock_state == FALSE) { err("OA SOAP Handler is locked."); err("No operation is allowed in this state"); err("Please try after some time"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Unlock the oa_handler mutex */ wrap_g_mutex_unlock(oa_handler->mutex); return SA_OK; } /** * check_config_parameters * @handler_config: Pointer to the config handler * * Purpose: * Checks whether all the parameters are present in the config file * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on invalid parameters. * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT check_config_parameters(GHashTable *handler_config) { char *temp = NULL; if (handler_config == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } /* Check for entity_root entry */ temp = (char *)g_hash_table_lookup(handler_config, "entity_root"); if (temp == NULL) { err("entity_root is missing in the config file."); return SA_ERR_HPI_INTERNAL_ERROR; } /* Check for OA user name entry */ temp = (char *) g_hash_table_lookup(handler_config, "OA_User_Name"); if (temp == NULL) { err("Failed to find attribute OA_User_Name in openhpi.conf "); return SA_ERR_HPI_INTERNAL_ERROR; } /* Check for OA_Password entry */ temp = (char *) g_hash_table_lookup(handler_config, "OA_Password"); if (temp == NULL) { err("Failed to find attribute OA_Password in openhpi.conf "); return SA_ERR_HPI_INTERNAL_ERROR; } /* Check for Active OA hostname/IP address entry * STANDBY_OA is an optional parameter and hence not checked */ temp = (char *) g_hash_table_lookup(handler_config, "ACTIVE_OA"); if (temp == NULL) { err("Failed to find attribute ACTIVE_OA in openhpi.conf "); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } /** * create_event_session * @oa: Pointer to the oa info structure * * Purpose: * creates the fresh event session with OA * * Detailed Descrption: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on unsupported oa events. **/ SaErrorT create_event_session(struct oa_info *oa) { SaErrorT rv = SOAP_OK; struct eventPid pid; if (oa == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } wrap_g_mutex_lock(oa->mutex); if (oa->event_con == NULL) { dbg("OA may not be accessible"); wrap_g_mutex_unlock(oa->mutex); return SA_ERR_HPI_INTERNAL_ERROR; } rv = soap_subscribeForEvents(oa->event_con, &pid); wrap_g_mutex_unlock(oa->mutex); if (rv != SOAP_OK) { err("Subscribe for events failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Store the event pid in oa_info structure */ oa->event_pid=pid.pid; return SA_OK; } /** * create_oa_connection * @oa: Pointer to the oa info structure * @user_name: Pointer the to the OA user name * @password: Pointer the to the OA password * * Purpose: * Creates the connection with the OA * This function will not return until the connection is established * * Detailed Descrption: NA * * Return values: * NONE **/ void create_oa_connection(struct oa_soap_handler *oa_handler, struct oa_info *oa, char *user_name, char *password) { SaErrorT rv = SA_OK; SaHpiBoolT is_oa_present = SAHPI_FALSE; SaHpiBoolT is_oa_accessible = SAHPI_FALSE; if (oa == NULL || user_name == NULL || password == NULL) { err("Invalid parameters"); return; } while (is_oa_accessible == SAHPI_FALSE) { OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, NULL, NULL, NULL); /* Check whether the OA is present. * If not, wait till the OA is inserted */ is_oa_present = SAHPI_FALSE; while (is_oa_present == SAHPI_FALSE) { OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, NULL, NULL, NULL); wrap_g_mutex_lock(oa->mutex); if (oa->oa_status != OA_ABSENT) { wrap_g_mutex_unlock(oa->mutex); is_oa_present = SAHPI_TRUE; } else { wrap_g_mutex_unlock(oa->mutex); /* OA is not present, * wait for 30 seconds and check again */ oa_soap_sleep_in_loop(oa_handler, 30); } } wrap_g_mutex_lock(oa->mutex); /* Close the soap_con strctures */ if (oa->hpi_con != NULL) { soap_close(oa->hpi_con); oa->hpi_con = NULL; } if (oa->event_con != NULL) { soap_close(oa->event_con); oa->event_con = NULL; } wrap_g_mutex_unlock(oa->mutex); rv = initialize_oa_con(oa, user_name, password); if ((rv != SA_OK) && (oa->oa_status != OA_ABSENT)) { /* OA may not be reachable * wait for 2 seconds and check again */ sleep(2); continue; } /* hpi_con and event_con successfully created */ is_oa_accessible = SAHPI_TRUE; } return; } /** * initialize_oa_con * @oa: Pointer to the oa info structure * @user_name: Pointer the to the OA user name * @password: Pointer the to the OA password * * Purpose: * Initializes the hpi_con and event_con * * Detailed Descrption: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure * NONE **/ SaErrorT initialize_oa_con(struct oa_info *oa, char *user_name, char *password) { SaErrorT rv = SA_OK; char *url = NULL; if (oa == NULL || user_name == NULL || password == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } if (!strcmp(oa->server,"0.0.0.0")) { err("Invalid OA IP 0.0.0.0"); return SA_ERR_HPI_INVALID_PARAMS; } wrap_g_mutex_lock(oa->mutex); rv = asprintf(&url, "%s" PORT, oa->server); if(rv == -1){ free(url); err("Failed to allocate memory for buffer to \ hold OA credentials"); wrap_g_mutex_unlock(oa->mutex); return SA_ERR_HPI_OUT_OF_MEMORY; } oa->hpi_con = soap_open(url, user_name, password, HPI_CALL_TIMEOUT); if (oa->hpi_con == NULL) { free(url); /* OA may not be reachable */ wrap_g_mutex_unlock(oa->mutex); return SA_ERR_HPI_INTERNAL_ERROR; } /* Try to create event_con connection * Ideally, this call should not fail */ oa->event_con = soap_open(url, user_name, password, EVENT_CALL_TIMEOUT); if (oa->event_con == NULL) { free(url); /* OA may not be reachable */ wrap_g_mutex_unlock(oa->mutex); soap_close(oa->hpi_con); oa->hpi_con = NULL; return SA_ERR_HPI_INTERNAL_ERROR; } wrap_g_mutex_unlock(oa->mutex); free(url); return SA_OK; } /** * delete_all_inventory_info * @oh_handler: Pointer to the plugin handler * * Purpose: * Traverses through all resources and extracts the inventory RDR * Frees up the memory allocated for inventory information * * Detailed Descrption: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters **/ SaErrorT delete_all_inventory_info(struct oh_handler_state *oh_handler) { SaErrorT rv = SA_OK; SaHpiRptEntryT *rpt = NULL; if (oh_handler == NULL) { err("Invalid parameter"); return SA_ERR_HPI_INVALID_PARAMS; } rpt = oh_get_resource_next(oh_handler->rptcache, SAHPI_FIRST_ENTRY); while (rpt) { if (rpt->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA) { /* Free the inventory info from inventory RDR */ rv = free_inventory_info(oh_handler, rpt->ResourceId); if (rv != SA_OK) err("Inventory cleanup failed for resource %d", rpt->ResourceId); } /* Get the next resource */ rpt = oh_get_resource_next(oh_handler->rptcache, rpt->ResourceId); } return SA_OK; } /** * cleanup_plugin_rptable * @oh_handler: Pointer to the plugin handler * * Purpose: * Frees up the memory allocated for RPT and RDR entries * * Detailed Descrption: NA * * Return values: * NONE **/ void cleanup_plugin_rptable(struct oh_handler_state *oh_handler) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler = NULL; if (oh_handler == NULL) { err("Invalid parameter"); return; } oa_handler = (struct oa_soap_handler *) oh_handler->data; if(oa_handler == NULL) { err("Invalid parameter"); return; } rv = delete_all_inventory_info(oh_handler); if (rv != SA_OK) { err("Deleting all inventory information failed"); } release_oa_soap_resources(oa_handler); rv = oh_flush_rpt(oh_handler->rptcache); if (rv != SA_OK) { err("Plugin RPTable flush failed"); } return; } /** * release_oa_soap_resources * @oa_handler: Pointer to oa soap handler * * Purpose: * To free the memory allocated for resource presence and serial number * for OA, interconnect, server, fan and power supply * * Detailed Description: NA * * Return values: * None **/ void release_oa_soap_resources(struct oa_soap_handler *oa_handler) { SaHpiInt32T i; /* Release memory of blade presence, resource id and blade * serial number arrays */ wrap_g_free(oa_handler->oa_soap_resources.server.presence); wrap_g_free(oa_handler->oa_soap_resources.server.resource_id); if(oa_handler->oa_soap_resources.server.serial_number != NULL) { for (i = 0; i < oa_handler->oa_soap_resources.server.max_bays; i++) { wrap_g_free(oa_handler->oa_soap_resources.server.serial_number[i]); } wrap_g_free(oa_handler->oa_soap_resources.server.serial_number); } /* Release memory of interconnect presence and serial number array */ wrap_g_free(oa_handler->oa_soap_resources.interconnect.presence); wrap_g_free(oa_handler->oa_soap_resources.interconnect.resource_id); if(oa_handler->oa_soap_resources.interconnect.serial_number != NULL) { for (i = 0; i < oa_handler->oa_soap_resources.interconnect.max_bays; i++) { wrap_g_free(oa_handler->oa_soap_resources.interconnect. serial_number[i]); } wrap_g_free(oa_handler->oa_soap_resources.interconnect.serial_number); } /* Release memory of OA presence and serial number array */ wrap_g_free(oa_handler->oa_soap_resources.oa.presence); wrap_g_free(oa_handler->oa_soap_resources.oa.resource_id); if(oa_handler->oa_soap_resources.oa.serial_number != NULL) { for (i = 0; i < oa_handler->oa_soap_resources.oa.max_bays; i++) { wrap_g_free(oa_handler->oa_soap_resources.oa. serial_number[i]); } wrap_g_free(oa_handler->oa_soap_resources.oa.serial_number); } /* Release memory of fan presence. Since fans do not have serial * numbers, a serial numbers array does not need to be released. */ wrap_g_free(oa_handler->oa_soap_resources.fan.presence); wrap_g_free(oa_handler->oa_soap_resources.fan.resource_id); /* Release memory of fan zone resource id */ wrap_g_free(oa_handler->oa_soap_resources.fan_zone.resource_id); /* Release memory of power supply presence and serial number array */ wrap_g_free(oa_handler->oa_soap_resources.ps_unit.presence); wrap_g_free(oa_handler->oa_soap_resources.ps_unit.resource_id); if(oa_handler->oa_soap_resources.ps_unit.serial_number != NULL) { for (i = 0; i < oa_handler->oa_soap_resources.ps_unit.max_bays; i++) { wrap_g_free(oa_handler->oa_soap_resources. ps_unit.serial_number[i]); } wrap_g_free(oa_handler->oa_soap_resources.ps_unit.serial_number); } } /** * get_oa_fw_version * @oh_handler: Pointer to the plugin handler * * Purpose: * Returns the OA firmware version of the active OA * * Detailed Descrption: NA * * Return values: * Active OA firmware version - on success * 0.0 - on failure **/ SaHpiFloat64T get_oa_fw_version(struct oh_handler_state *oh_handler) { struct oa_soap_handler *oa_handler; if (oh_handler == NULL) { err("Invalid parameter"); return 0.0; } oa_handler = (struct oa_soap_handler *) oh_handler->data; if (oa_handler->active_con == oa_handler->oa_1->hpi_con) return oa_handler->oa_1->fm_version; else if (oa_handler->active_con == oa_handler->oa_2->hpi_con) return oa_handler->oa_2->fm_version; else return 0.0; } /** * update_oa_info * @oh_handler: Pointer to the plugin handler * @response: Pointer to the oaInfo structure * @resource_id: Resource Id * * Purpose: * Returns the OA firmware version of the active OA * * Detailed Descrption: NA * * Return values: * SA_HPI_ERR_INAVLID_PARAMS - on invalid parametersfailure * SA_HPI_ERR_INTERNAL_ERROR - on failure * SA_OK - on success **/ SaErrorT update_oa_info(struct oh_handler_state *oh_handler, struct oaInfo *response, SaHpiResourceIdT resource_id) { SaHpiRptEntryT *rpt = NULL; SaHpiFloat64T fm_version; SaHpiInt32T major; if (oh_handler == NULL || response == NULL) { err("Invalid parameter"); return SA_ERR_HPI_INVALID_PARAMS; } rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (rpt == NULL) { err("OA rpt is not present"); return SA_ERR_HPI_INTERNAL_ERROR; } if (strlen(response->fwVersion) == 0) { err("Firmware version is null string"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Firmware version is in the format of x.yy. 'x' is the major version * 'yy' is the minor version */ fm_version = atof(response->fwVersion); rpt->ResourceInfo.FirmwareMajorRev = major = (SaHpiUint8T)floor(fm_version); rpt->ResourceInfo.FirmwareMinorRev = rintf((fm_version - major) * 100); return SA_OK; } /** * convert_lower_to_upper * @src: Pointer to the source string handler * @src_len: String length of the source string * @dest: Pointer to destination string * @dest_len: Length of the destination string * * Purpose: * Converts the lower case characters to upper case * * Detailed Descrption: NA * * Return values: * SA_HPI_ERR_INAVLID_PARAMS - on invalid parametersfailure * SA_HPI_ERR_INTERNAL_ERROR - on failure * SA_OK - on success **/ SaErrorT convert_lower_to_upper(char *src, SaHpiInt32T src_len, char *dest, SaHpiInt32T dest_len) { SaHpiInt32T i; if (src == NULL || dest == NULL) { dbg("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } if (dest_len < src_len) { err("Source string is longer than destination string"); return SA_ERR_HPI_INTERNAL_ERROR; } memset(dest, 0, dest_len); for (i = 0; i < src_len; i++) dest[i] = toupper(src[i]); return SA_OK; } /** * update_reseource_status() * @res_status pointer to resource_status_t * @index index into the resource info fields in res_status * @serial_number serial_number string to be copied into res_status * @resource_id resource id to be updated to res_status * @presence presence status * * Description: * This routine updates the resource status entry with passed in * serial_number, resource_id, and presence. This routine should be * called to set and reset the resource status fields that change * when a a resource gets added and removed. * * Return value: none **/ void oa_soap_update_resource_status(resource_status_t *res_status, SaHpiInt32T index, char *serial_number, SaHpiResourceIdT resource_id, resource_presence_status_t presence) { if (index <= 0) { err("Invalid index value %d - returning without update\n", index); return; } if ((serial_number != NULL) && (serial_number[0] != '\0')) { size_t len; len = strlen(serial_number); strncpy(res_status->serial_number[index-1], serial_number, len); res_status->serial_number[index-1][len] = '\0'; } res_status->resource_id[index-1] = resource_id; res_status->presence[index-1] = presence; return; } char * oa_soap_trim_whitespace(char *s) { int i, len = strlen(s); for (i=(len-1); i>=0; i--) { if ((s[i] == ' ') || (s[i] == '\t')) { s[i] = 0; } else break; } return(s); } /** * update_oa_fw_version * @oh_handler: Pointer to the plugin handler * @response: Pointer to the oaInfo structure * @resource_id: Resource Id * * Purpose: * Updates the RPT entry and IDR entry with OA firmware version * * Detailed Descrption: NA * * Return values: * SA_HPI_ERR_INAVLID_PARAMS - on invalid parameters * SA_HPI_ERR_INTERNAL_ERROR - on failure * SA_OK - on success **/ SaErrorT update_oa_fw_version(struct oh_handler_state *oh_handler, struct oaInfo *response, SaHpiResourceIdT resource_id) { SaErrorT rv = SA_OK; SaHpiFloat64T fm_version; SaHpiRptEntryT *rpt = NULL; SaHpiRdrT *rdr = NULL; SaHpiIdrIdT IdrId = 0; SaHpiIdrFieldT field; struct oh_event event; SaHpiInt32T major; SaHpiInt32T minor; if (oh_handler == NULL || response == NULL) { printf("Invalid parameter"); return SA_ERR_HPI_INVALID_PARAMS; } rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (rpt == NULL) { err("OA rpt is not present"); return SA_ERR_HPI_INTERNAL_ERROR; } if (strlen(response->fwVersion) == 0) { err("Firmware version is null string"); return SA_ERR_HPI_INTERNAL_ERROR; } fm_version = atof(response->fwVersion); major = (SaHpiUint8T)floor(fm_version); minor = rintf((fm_version - major) * 100); if(rpt->ResourceInfo.FirmwareMajorRev == major && rpt->ResourceInfo.FirmwareMinorRev == minor){ return rv; } if(( major == rpt->ResourceInfo.FirmwareMajorRev && minor < rpt->ResourceInfo.FirmwareMinorRev ) || major < rpt->ResourceInfo.FirmwareMajorRev ) { WARN("OA Firmware Version downgraded"); } rpt->ResourceInfo.FirmwareMajorRev = major; rpt->ResourceInfo.FirmwareMinorRev = minor; /* Get the inventory RDR */ rdr = oh_get_rdr_by_type(oh_handler->rptcache, resource_id, SAHPI_INVENTORY_RDR, SAHPI_DEFAULT_INVENTORY_ID); if (rdr == NULL) { err("Inventory RDR is not found"); return SA_ERR_HPI_INTERNAL_ERROR; } IdrId = rdr->RdrTypeUnion.InventoryRec.IdrId; memset(&field, 0, sizeof(SaHpiIdrFieldT)); field.Type = SAHPI_IDR_FIELDTYPE_PRODUCT_VERSION; field.Field.DataType = SAHPI_TL_TYPE_TEXT; field.Field.Language = SAHPI_LANG_ENGLISH; oa_soap_trim_whitespace(response->fwVersion); field.Field.DataLength = strlen(response->fwVersion); field.AreaId = 1; field.FieldId = 3; snprintf((char *)field.Field.Data, strlen(response->fwVersion)+ 1, "%s",response->fwVersion); rv = oa_soap_set_idr_field(oh_handler, resource_id, IdrId, &field); if (rv != SOAP_OK) { err("oa_soap_set_idr_field failed"); return rv; } /* Event Handling */ memset(&event, 0, sizeof(struct oh_event)); event.event.EventType = SAHPI_ET_RESOURCE; memcpy(&event.resource, rpt, sizeof(SaHpiRptEntryT)); event.event.Severity = SAHPI_INFORMATIONAL; event.event.Source = event.resource.ResourceId; if (oh_gettimeofday(&(event.event.Timestamp)) != SA_OK) { event.event.Timestamp = SAHPI_TIME_UNSPECIFIED; } event.event.EventDataUnion.ResourceEvent. ResourceEventType = SAHPI_RESE_RESOURCE_UPDATED; event.rdrs = g_slist_append(event.rdrs, g_memdup(rdr, sizeof(SaHpiRdrT))); event.hid = oh_handler->hid; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); return SA_OK; } /** * oa_soap_get_oa_ip * @server: Pointer to hostname/IP address of the OA * @network_info_response: Pointer to oaNetworkInfo response structure * @oa_ip: Pointer to Active/Standby OA IP address * * Purpose: * Gets the active/standby OA IP address * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters **/ SaErrorT oa_soap_get_oa_ip(char *server, struct oaNetworkInfo network_info_response, char *oa_ip) { int ipv6, local_ipv6; char *interface_name; struct extraDataInfo extra_data_info; xmlNode *extra_data = NULL; if (server == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } /* intialize the flags for ipv6 */ ipv6 = strstr(server, ":") == NULL ? 0 : 1; local_ipv6 = (strstr(server, "fe80")- server) == 0 ? 1 : 0; extra_data = network_info_response.extraData; while (extra_data) { soap_getExtraData(extra_data, &extra_data_info); if ((!(strcmp(extra_data_info.name, "Ipv6Address0"))) && (extra_data_info.value != NULL)) { memcpy(network_info_response.ipv6Address0, extra_data_info.value, strlen(extra_data_info.value) - strlen(strchr(extra_data_info.value, '/'))); } if ((!(strcmp(extra_data_info.name, "Ipv6Address1"))) && (extra_data_info.value != NULL)) { memcpy(network_info_response.ipv6Address1, extra_data_info.value, strlen(extra_data_info.value) - strlen(strchr(extra_data_info.value, '/'))); } if ((!(strcmp(extra_data_info.name, "Ipv6Address2"))) && (extra_data_info.value != NULL)) { memcpy(network_info_response.ipv6Address2, extra_data_info.value, strlen(extra_data_info.value) - strlen(strchr(extra_data_info.value, '/'))); } if ((!(strcmp(extra_data_info.name, "Ipv6Address3"))) && (extra_data_info.value != NULL)) { memcpy(network_info_response.ipv6Address3, extra_data_info.value, strlen(extra_data_info.value) - strlen(strchr(extra_data_info.value, '/'))); } if ((!(strcmp(extra_data_info.name, "Ipv6AddressType0"))) && (extra_data_info.value != NULL)) { network_info_response.ipv6AddressType0 = extra_data_info.value; } if ((!(strcmp(extra_data_info.name, "Ipv6AddressType1"))) && (extra_data_info.value != NULL)) { network_info_response.ipv6AddressType1 = extra_data_info.value; } if ((!(strcmp(extra_data_info.name, "Ipv6AddressType2"))) && (extra_data_info.value != NULL)) { network_info_response.ipv6AddressType2 = extra_data_info.value; } if ((!(strcmp(extra_data_info.name, "Ipv6AddressType3"))) && (extra_data_info.value != NULL)) { network_info_response.ipv6AddressType3 = extra_data_info.value; } extra_data = soap_next_node(extra_data); } if(!ipv6) { strncpy(oa_ip, network_info_response.ipAddress, strlen(network_info_response.ipAddress)); } else if(!local_ipv6) { if ((!(strcmp(network_info_response.ipv6AddressType0, "STATIC")))) { strncpy(oa_ip, network_info_response.ipv6Address0, strlen(network_info_response.ipv6Address0)); } else if ((!(strcmp(network_info_response.ipv6AddressType1, "STATIC")))) { strncpy(oa_ip, network_info_response.ipv6Address1, strlen(network_info_response.ipv6Address1)); } else if ((!(strcmp(network_info_response.ipv6AddressType2, "STATIC")))) { strncpy(oa_ip, network_info_response.ipv6Address2, strlen(network_info_response.ipv6Address2)); } else if ((!(strcmp(network_info_response.ipv6AddressType3, "STATIC")))) { strncpy(oa_ip, network_info_response.ipv6Address3, strlen(network_info_response.ipv6Address3)); } } else { if ((!(strcmp(network_info_response.ipv6AddressType0, "LINKLOCAL")))) { strncpy(oa_ip, network_info_response.ipv6Address0, strlen(network_info_response.ipv6Address0)); } else if ((!(strcmp(network_info_response.ipv6AddressType1, "LINKLOCAL")))) { strncpy(oa_ip, network_info_response.ipv6Address1, strlen(network_info_response.ipv6Address1)); } else if ((!(strcmp(network_info_response.ipv6AddressType2, "LINKLOCAL")))) { strncpy(oa_ip, network_info_response.ipv6Address2, strlen(network_info_response.ipv6Address2)); } else if ((!(strcmp(network_info_response.ipv6AddressType3, "LINKLOCAL")))) { strncpy(oa_ip, network_info_response.ipv6Address3, strlen(network_info_response.ipv6Address3)); } interface_name = strchr(server, '%'); strcat(oa_ip, interface_name); } return SA_OK; } /** * oa_soap_check_serial_number() * @slot: slot number of the blade * @serial_number: Pointer to serial_number string * * Purpose: * Just prints out a message. OA sends out information from iLO as it * becomes available. So empty, "[Unknown]" serial numbers are common * During a re-discovery after a switchover a blade with a good serial * number could be replaced with a blade with a bad serial number. So * only thing we could do is give a warning message. Nothing more. It * is users responsility to correct it using RBSU/boot utility * * Detailed Description: NA * * Return values: * Void **/ void oa_soap_check_serial_number(int slot, char *serial_number) { int j=0, len=0; if (serial_number == 0 ) { WARN("Blade(%d) serialNumber is NULL",slot); } else if ((len = strlen(serial_number)) == 0) { WARN("Blade(%d) serialNumber is empty",slot); } else if (strcmp(serial_number,"[Unknown]")) { if (len >= 9) len = 9; for (j =0; j < len; j++){ if (isalnum(serial_number[j])) continue; else { CRIT("Blade(%d) serialNumber %s is " "invalid",slot,serial_number); break; } } } else { dbg("Blade(%d) serialNumber is [Unknown]",slot); } } /** * oa_soap_sleep_in_loop() * @oa_handler: Pointer to OA SOAP handler structure * @secs: Total time to sleep in seconds * * Purpose: * OA takes a long time to switchover and there are many situations * where we need to wait for more than 3 seconds. In all thse situations * if a signal arrives, it is better to get out asap. So we check for the * shutdown_event_thread after every 3 seconds and get out if it is true * This will enable full, proper shutdown of the plugin in case of kill * * Detailed Description: NA * * Return values: * Exit or OK **/ SaErrorT oa_soap_sleep_in_loop(struct oa_soap_handler *oa_handler, int secs) { int i=3, j=0; GThread *my_id; if (oa_handler == NULL || oa_handler->oa_1 == NULL || oa_handler->oa_2 == NULL || secs <= 0 ) { err("Wrong parameters\n"); return SA_ERR_HPI_INTERNAL_ERROR; } if (secs < 4) { sleep(secs); return SA_OK; } my_id = g_thread_self(); while (j < secs) { /* Exit only from event threads, owned by plugin */ if (my_id == oa_handler->oa_1->thread_handler || my_id == oa_handler->oa_2->thread_handler ) { OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, NULL, NULL, NULL); } else { /* In case of infrastructure threads just return */ if( oa_handler->shutdown_event_thread ) return SA_OK; } if (j+i > secs) i=secs-j; if ( i > 0 ) sleep(i); j = j+i; } return SA_OK; } openhpi-3.6.1/plugins/oa_soap/oa_soap_resources.h0000644000175100017510000001064512575647270021166 0ustar mohanmohan/* * Copyright (C) 2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. * Raghavendra M.S. */ #ifndef _OA_SOAP_RESOURCES_H #define _OA_SOAP_RESOURCES_H /* Include files */ #include #include "oa_soap_sensor.h" /* Maximum sensor classes in OA SOAP * * On adding a new sensor class in oa_soap_sensor.h, please change the maximum * sensor class value. Accordingly, add new sensor class support in global * sensor enum value mapping array and global sensor event assert state mapping * array in oa_soap_resources.c */ #define OA_SOAP_MAX_SEN_CLASS 14 /* Maximum sensor enum values in OA SOAP * * If a new sensor added in include/SaHpiOaSoap.h has more enum values, then * change the maximum enum. Accordingly, add new sensor enum values to global * sensor enum value mapping array and global sensor event assert state mapping * array in oa_soap_resources.c */ #define OA_SOAP_MAX_ENUM 21 /* Maximum sensor event array size * * Increase the event array size if a new sensor supports more number of sensor * event payload. Accordingly, increase the sensor_event arry in global sensor * array in oa_soap_resources.c */ #define OA_SOAP_MAX_SEN_EVT 4 /* Structure for storing the sensor RDR and event information */ struct oa_soap_sensor { SaHpiSensorRecT sensor; struct oa_soap_sensor_info sensor_info; SaHpiInt32T sensor_class; SaHpiEventT sen_evt[OA_SOAP_MAX_SEN_EVT]; const char *comment; }; /* Structure for storing the control RDR */ struct oa_soap_control { SaHpiCtrlRecT control; const char *comment; }; #define OA_SOAP_MAX_BLD_TYPE 23 /* Enum for possible cclass blade types * Put more specific ones always first * */ enum oa_soap_blade_type { BL260C, BL2x220C, BL460CGEN8, BL460CGEN9, BL460CG8, BL460CG7, BL460C, BL465CG7, BL465C, BL480CG1, BL480C, BL495C, BL680C, BL685CG6, BL685C, BL860C, BL870C, NB50000C, AMC, STORAGE, TAPE, SAN, OTHER_BLADE_TYPE, }; extern const SaHpiInt32T oa_soap_sen_val_map_arr[OA_SOAP_MAX_SEN_CLASS] [OA_SOAP_MAX_ENUM]; extern const SaHpiInt32T oa_soap_sen_assert_map_arr[OA_SOAP_MAX_SEN_CLASS] [OA_SOAP_MAX_ENUM]; extern const struct oa_soap_sensor oa_soap_sen_arr[]; extern const struct oa_soap_control oa_soap_cntrl_arr[]; extern const SaHpiRptEntryT oa_soap_rpt_arr[]; extern const struct oa_soap_inv_rdr oa_soap_inv_arr[]; extern const struct oa_soap_fz_map oa_soap_fz_map_arr[][OA_SOAP_MAX_FAN]; extern const char *oa_soap_health_arr[]; extern const char *oa_soap_diag_ex_arr[]; extern const char *oa_soap_thermal_sensor_string[]; extern const struct oa_soap_static_thermal_sensor_info oa_soap_static_thrm_sen_config[OA_SOAP_MAX_BLD_TYPE] [OA_SOAP_MAX_THRM_SEN]; extern const char *oa_soap_bld_type_str[]; extern const SaHpiInt32T oa_soap_bld_thrm_sen_base_arr[]; extern SaHpiPowerStateT oa_soap_bay_pwr_status[OA_SOAP_C7000_MAX_BLADE]; #endif openhpi-3.6.1/plugins/oa_soap/oa_soap_reset.c0000644000175100017510000002652312575647270020273 0ustar mohanmohan/* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. * Shuah Khan * * * This file handles all the resource reset states related apis. * * oa_soap_get_reset_state() - API to return the reset state of chassis * components * * oa_soap_set_reset_state() - API to set the reset state for all the * chassis components **/ #include "oa_soap_reset.h" /** * oa_soap_get_reset_state * @oh_handler: Pointer to openhpi handler * @resource_id: Resource id * @action: Pointer to reset action * * Purpose: * gets the reset state of the chassis resource * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT oa_soap_get_reset_state(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiResetActionT *action) { SaErrorT rv = SA_OK; SaHpiPowerStateT state; if (oh_handler == NULL || action == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } /* Get the current power state of the resource */ rv = oa_soap_get_power_state(oh_handler, resource_id, &state); if (rv != SA_OK) { err("Get server power state failed"); return rv; } switch (state) { case (SAHPI_POWER_ON): *action = SAHPI_RESET_DEASSERT; break; case (SAHPI_POWER_OFF): *action = SAHPI_RESET_ASSERT; break; /* Power cycle is a momentary state * Hence, resource should never give the 'power cycle' as * its current power state */ case (SAHPI_POWER_CYCLE): err("Wrong reset state (Power cycle) detected"); return SA_ERR_HPI_INTERNAL_ERROR; break; default: err("Wrong reset state"); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } /** * oa_soap_set_reset_state * @oh_handler: Pointer to openhpi handler * @resource_id: Resource id * @action: Reset action * * Purpose: * sets the reset state of the resource in the chassis * * Detailed Description: * - Resource capability will be checked based on the resource id * - and then based on the action and type of the entity, different * interface api is used for resetting the resource component. * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INVALID_REQUEST - on request to reset a resource * which is powered off. * Or on wrong reset request * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT oa_soap_set_reset_state(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiResetActionT action) { SaErrorT rv = SA_OK; SaHpiPowerStateT tmp; SaHpiRptEntryT *rpt = NULL; SaHpiInt32T bay_number; struct setBladePower server_request; struct resetInterconnectTray interconnect_request; struct oh_handler_state *handler = NULL; struct oa_soap_handler *oa_handler = NULL; if (oh_handler == NULL) { err("invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } handler = (struct oh_handler_state *) oh_handler; oa_handler = (struct oa_soap_handler *) handler->data; rpt = oh_get_resource_by_id(handler->rptcache, resource_id); if (rpt == NULL) { err("INVALID RESOURCE"); return SA_ERR_HPI_INVALID_RESOURCE; } /* Check whether resource has reset capability */ if (! (rpt->ResourceCapabilities & SAHPI_CAPABILITY_RESET)) { err("INVALID RESOURCE CAPABILITY"); return SA_ERR_HPI_CAPABILITY; } switch (action) { case SAHPI_RESET_DEASSERT: /* RESET_DEASSERT is equivalent to power on * Call the set power state function with power on */ rv = oa_soap_set_power_state(oh_handler, resource_id, SAHPI_POWER_ON); if (rv != SA_OK) err("Set power ON failed"); return rv; break; case SAHPI_RESET_ASSERT: /* RESET_ASSERT is equivalent to power off * Call the set power state function with power off */ rv = oa_soap_set_power_state(oh_handler, resource_id, SAHPI_POWER_OFF); if (rv != SA_OK) err("Set power OFF failed"); return rv; break; case SAHPI_COLD_RESET: case SAHPI_WARM_RESET: /* Get the current power state */ rv = oa_soap_get_power_state(oh_handler, resource_id, &tmp); if (rv != SA_OK) { err("Get power state failed"); return rv; } /* Reset can not be done when resource is in power * off state */ if (tmp == SAHPI_POWER_OFF) { return SA_ERR_HPI_INVALID_REQUEST; } /* Check whether oa_handler mutex is locked or not */ rv = lock_oa_soap_handler(oa_handler); if (rv != SA_OK) { err("OA SOAP handler is locked"); return rv; } bay_number = rpt->ResourceEntity.Entry[0].EntityLocation; /* Check the resource entity type */ switch (rpt->ResourceEntity.Entry[0].EntityType) { case SAHPI_ENT_SYSTEM_BLADE: /* Resource type is server blade. * Reset the server blade */ server_request.bayNumber = bay_number; if(action == SAHPI_COLD_RESET) server_request.power = COLD_BOOT; else server_request.power = RESET; rv = soap_setBladePower( oa_handler->active_con, &server_request); if (rv != SOAP_OK) { err("Set power reset of blade" " %d failed", bay_number); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; break; case SAHPI_ENT_IO_BLADE: case SAHPI_ENT_DISK_BLADE: return(SA_ERR_HPI_UNSUPPORTED_API); case SAHPI_ENT_SWITCH_BLADE: /* Resource type is interconnect blade. * Reset the interconnect blade */ interconnect_request.bayNumber = bay_number; rv = soap_resetInterconnectTray( oa_handler->active_con, &interconnect_request); if (rv != SOAP_OK) { err("Reset interconnect reset " "failed"); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; break; default: err("Invalid Resource Type"); return SA_ERR_HPI_INTERNAL_ERROR; } break; default: err("Invalid reset state requested"); return SA_ERR_HPI_INVALID_REQUEST; } return SA_OK; } void * oh_get_reset_state (void *, SaHpiResourceIdT, SaHpiResetActionT *) __attribute__ ((weak, alias("oa_soap_get_reset_state"))); void * oh_set_reset_state (void *, SaHpiResourceIdT, SaHpiResetActionT) __attribute__ ((weak, alias("oa_soap_set_reset_state"))); openhpi-3.6.1/plugins/oa_soap/oa_soap_discover.h0000644000175100017510000003576512575647270021004 0ustar mohanmohan/* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. * Shuah Khan * Raghavendra M.S. */ #ifndef _OA_SOAP_DISCOVER_H #define _OA_SOAP_DISCOVER_H /* Include files */ #include "oa_soap_sensor.h" #include "oa_soap_control.h" #include "oa_soap_event.h" #include "oa_soap_resources.h" /* The OA does not gives the resource names for power supply, power subsystem * and OA. The names will be used for creating the tag in RPT entry */ #define POWER_SUPPLY_NAME "Power Supply Unit" #define POWER_SUBSYSTEM_NAME "Power Subsystem" #define OA_NAME "Onboard Administrator" #define MAX_NAME_LEN 64 #define CISCO "CISCO" /* Identifies the Cisco interconnects */ /* Builds the sensor rdr and gets the current value of sensor */ #define OA_SOAP_BUILD_ENABLE_SENSOR_RDR(sensor_num, sensor_value) \ { \ memset(&rdr, 0, sizeof(SaHpiRdrT)); \ rv = oa_soap_build_sen_rdr(oh_handler, resource_id, &rdr, \ &sensor_info, sensor_num); \ if (rv != SA_OK) { \ err("Failed to create sensor rdr for sensor %x", sensor_num); \ return rv; \ } \ \ rv = oa_soap_map_sen_val(sensor_info, sensor_num, \ (SaHpiInt32T) sensor_value, &sensor_status); \ if (rv != SA_OK) { \ err("Setting sensor state failed"); \ wrap_g_free(sensor_info); \ return rv; \ } \ \ rv = oh_add_rdr(oh_handler->rptcache, resource_id, \ &rdr, sensor_info, 0); \ if (rv != SA_OK) { \ err("Failed to add rdr"); \ return rv; \ } \ } /* Builds the threshold sensor rdr and puts threshold information provided by OA */ #define OA_SOAP_BUILD_THRESHOLD_SENSOR_RDR(sensor_num, response) \ { \ memset(&rdr, 0, sizeof(SaHpiRdrT)); \ rv = oa_soap_build_sen_rdr(oh_handler, resource_id, &rdr, \ &sensor_info, sensor_num); \ if (rv != SA_OK) { \ err("Failed to create sensor rdr for sensor %x", sensor_num); \ return rv; \ } \ \ /* the thresholds values updated in the rdr from the global sensor \ * array contains the dummy values, these values needs to be replaced \ * with actual threshold values provided by OA \ */ \ rv = oa_soap_map_thresh_resp(&rdr, (void *)&response, \ event_support, sensor_info); \ if (rv != SA_OK) { \ err("Updating rdr with threshold failed"); \ wrap_g_free(sensor_info); \ return rv; \ } \ \ rv = oh_add_rdr(oh_handler->rptcache, resource_id, \ &rdr, sensor_info, 0); \ if (rv != SA_OK) { \ err("Failed to add rdr"); \ return rv; \ } \ } /* Builds the sensor rdr which does not events based on sensor number */ #define OA_SOAP_BUILD_SENSOR_RDR(sensor_num) \ { \ memset(&rdr, 0, sizeof(SaHpiRdrT)); \ rv = oa_soap_build_sen_rdr(oh_handler, resource_id, &rdr, \ &sensor_info, sensor_num); \ if (rv != SA_OK) { \ err("Failed to create sensor rdr for sensor %x", sensor_num); \ return rv; \ } \ \ rv = oh_add_rdr(oh_handler->rptcache, resource_id, \ &rdr, sensor_info, 0); \ if (rv != SA_OK) { \ err("Failed to add rdr"); \ return rv; \ } \ } /* Builds the control rdr. */ /* Set analog limits to 0 if building a non-analog control. */ #define OA_SOAP_BUILD_CONTROL_RDR(control_num, analogLimitLow, \ analogLimitHigh) \ { \ memset(&rdr, 0, sizeof(SaHpiRdrT)); \ rv = oa_soap_build_control_rdr(oh_handler, &rdr, resource_id, \ control_num, analogLimitLow, \ analogLimitHigh); \ if (rv != SA_OK) { \ err("Failed to create rdr for control %x", control_num);\ return rv; \ } \ \ rv = oh_add_rdr(oh_handler->rptcache, resource_id, \ &rdr, 0, 0); \ if (rv != SA_OK) { \ err("Failed to add rdr"); \ return rv; \ } \ } /* Function prototypes */ SaErrorT oa_soap_discover_resources(void *oh_handler); SaErrorT discover_oa_soap_system(struct oh_handler_state *oh_handler); SaErrorT build_enclosure_rpt(struct oh_handler_state *oh_handler, char *name, SaHpiResourceIdT *resource_id); SaErrorT build_enclosure_rdr(struct oh_handler_state *oh_handler, SOAP_CON *con, struct enclosureInfo *response, SaHpiResourceIdT resource_id); SaErrorT discover_enclosure(struct oh_handler_state *oh_handler); SaErrorT build_oa_rpt(struct oh_handler_state *oh_handler, SaHpiInt32T bay_number, SaHpiResourceIdT *resource_id); SaErrorT build_oa_rdr(struct oh_handler_state *oh_handler, SOAP_CON *con, SaHpiInt32T bay_number, struct oaInfo *response, SaHpiResourceIdT resource_id); SaErrorT discover_oa(struct oh_handler_state *oh_handler); SaErrorT build_discovered_server_rpt(struct oh_handler_state *oh_handler, struct bladeInfo *response, SaHpiResourceIdT *resource_id, struct bladeStatus *); SaErrorT build_server_rpt(struct oh_handler_state *oh_handler, struct bladeInfo *response, SaHpiRptEntryT *rpt); SaErrorT build_inserted_server_rdr(struct oh_handler_state *oh_handler, SOAP_CON *con, SaHpiInt32T bay_number, SaHpiResourceIdT resource_id, char *name, int build_sensors); SaErrorT build_discovered_server_rdr_arr(struct oh_handler_state *oh_handler, SOAP_CON *con, SaHpiInt32T bay_number, SaHpiResourceIdT resource_id, char *name, int build_sensors, struct bladeInfo *, struct bladeStatus *, struct bladePortMap *); SaErrorT discover_server(struct oh_handler_state *oh_handler); SaErrorT build_inserted_intr_rpt(struct oh_handler_state *oh_handler, SOAP_CON *con, char *name, SaHpiInt32T bay_number, SaHpiResourceIdT *resource_id, int inserted); SaErrorT build_discovered_intr_rpt(struct oh_handler_state *oh_handler, char *name, SaHpiInt32T bay_number, SaHpiResourceIdT *resource_id, struct interconnectTrayStatus *); SaErrorT build_inserted_interconnect_rdr(struct oh_handler_state *oh_handler, SOAP_CON *con, SaHpiInt32T bay_number, SaHpiResourceIdT resource_id, int build_sensors); SaErrorT build_discovered_intr_rdr_arr(struct oh_handler_state *oh_handler, SOAP_CON *con, SaHpiInt32T bay_number, SaHpiResourceIdT resource_id, int build_sensors, struct interconnectTrayInfo *, struct interconnectTrayStatus *, struct interconnectTrayPortMap *); SaErrorT discover_interconnect(struct oh_handler_state *oh_handler); SaErrorT build_fan_rpt(struct oh_handler_state *oh_handler, char *name, SaHpiInt32T bay_number, SaHpiResourceIdT *resource_id); SaErrorT build_fan_rdr(struct oh_handler_state *oh_handler, SOAP_CON *con, struct fanInfo *response, SaHpiResourceIdT resource_id); SaErrorT discover_fan(struct oh_handler_state *oh_handler); SaErrorT build_power_subsystem_rpt(struct oh_handler_state *oh_handler, char *name, SaHpiResourceIdT *resource_id); SaErrorT build_power_subsystem_rdr(struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id); SaErrorT discover_power_subsystem(struct oh_handler_state *oh_handler); SaErrorT build_power_supply_rpt(struct oh_handler_state *oh_handler, char *name, SaHpiInt32T bay_number, SaHpiResourceIdT *resource_id); SaErrorT build_power_supply_rdr(struct oh_handler_state *oh_handler, SOAP_CON *con, struct powerSupplyInfo *response, SaHpiResourceIdT resource_id); SaErrorT build_discovered_ps_rdr_arr(struct oh_handler_state *oh_handler, struct powerSupplyInfo *response, SaHpiResourceIdT resource_id, struct powerSupplyStatus *status_response); SaErrorT discover_power_supply(struct oh_handler_state *oh_handler); void oa_soap_get_health_val(xmlNode *extra_data, enum oa_soap_extra_data_health *status); void oa_soap_parse_diag_ex(xmlNode *diag_ex, enum diagnosticStatus *diag_status_arr); SaErrorT oa_soap_build_rpt(struct oh_handler_state *oh_handler, SaHpiInt32T resourece_type, SaHpiInt32T location, SaHpiRptEntryT *rpt); SaErrorT oa_soap_get_fz_arr(struct oa_soap_handler *oa_handler, SaHpiInt32T max_fz, struct getFanZoneArrayResponse *response); SaErrorT oa_soap_build_fan_rpt(struct oh_handler_state *oh_handler, SaHpiInt32T bay_number, SaHpiResourceIdT *resource_id); SaErrorT oa_soap_build_fan_rdr(struct oh_handler_state *oh_handler, SOAP_CON *con, struct fanInfo *response, SaHpiResourceIdT resource_id); SaErrorT oa_soap_populate_event(struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, struct oh_event *event, GSList **assert_sensors); SaErrorT oa_soap_build_blade_thermal_rdr( struct oh_handler_state *oh_handler, struct bladeThermalInfoArrayResponse thermal_response, SaHpiRptEntryT *rpt, char *name); SaErrorT oa_soap_modify_blade_thermal_rdr( struct oh_handler_state *oh_handler, struct bladeThermalInfoArrayResponse thermal_response, SaHpiRptEntryT *rpt); SaErrorT oa_soap_get_ps_info_arr(struct oa_soap_handler *oa_handler, SaHpiInt32T max_bays, struct getPowerSupplyInfoArrayResponse *response, xmlDocPtr); SaErrorT oa_soap_get_ps_sts_arr(struct oa_soap_handler *oa_handler, SaHpiInt32T max_bays, struct getPowerSupplyStsArrayResponse *response, xmlDocPtr); SaErrorT oa_soap_get_fan_info_arr(struct oa_soap_handler *oa_handler, SaHpiInt32T max_bays, struct getFanInfoArrayResponse *response, xmlDocPtr); SaErrorT oa_soap_get_bladeinfo_arr(struct oa_soap_handler *oa_handler, SaHpiInt32T max_bays, struct getBladeInfoArrayResponse *response, xmlDocPtr); SaErrorT oa_soap_get_interconct_trayinfo_arr(struct oa_soap_handler *oa_handler, SaHpiInt32T max_bays, struct interconnectTrayInfoArrayResponse *response, xmlDocPtr); SaErrorT oa_soap_get_interconct_traysts_arr(struct oa_soap_handler *oa_handler, SaHpiInt32T max_bays, struct interconnectTrayStsArrayResponse *response, xmlDocPtr); SaErrorT oa_soap_get_interconct_traypm_arr(struct oa_soap_handler *oa_handler, SaHpiInt32T max_bays, struct interconnectTrayPmArrayResponse *response, xmlDocPtr); SaErrorT oa_soap_get_oa_info_arr(SOAP_CON *con, SaHpiInt32T max_bays, struct getOaInfoArrayResponse *response, xmlDocPtr); SaErrorT oa_soap_get_oa_sts_arr(SOAP_CON *con, SaHpiInt32T max_bays, struct getOaStatusArrayResponse *response, xmlDocPtr); SaErrorT oa_soap_get_bladests_arr(struct oa_soap_handler *oa_handler, SaHpiInt32T max_bays, struct getBladeStsArrayResponse *response, xmlDocPtr); SaErrorT oa_soap_get_portmap_arr(struct oa_soap_handler *oa_handler, SaHpiInt32T max_bays, struct getBladePortMapArrayResponse *response, xmlDocPtr); #endif openhpi-3.6.1/plugins/oa_soap/oa_soap_load_id.c0000644000175100017510000000637212575647270020544 0ustar mohanmohan/* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. **/ #include "oa_soap_load_id.h" /** * oa_soap_load_id_get * @oh_handler: Handler data pointer * @resource_id: Resource ID * @load_id: Load Id * * Purpose: * Retrieves the load id * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current oa_soap implementation does not * support this API **/ SaErrorT oa_soap_load_id_get(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiLoadIdT load_id) { err("oa_soap_load_id_get not implemented"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_load_id_set * @oh_handler: Handler data pointer * @resource_id: Resource ID * @load_id: Load Id * * Purpose: * Sets Load Id * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current oa_soap implementation does not * support this API **/ SaErrorT oa_soap_load_id_set(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiLoadIdT *load_id) { err("oa_soap_load_id_set not implemented"); return SA_ERR_HPI_UNSUPPORTED_API; } void * oh_load_id_get (void *, SaHpiResourceIdT, SaHpiLoadIdT) __attribute__ ((weak, alias("oa_soap_load_id_get"))); void * oh_load_id_set (void *, SaHpiResourceIdT, SaHpiLoadIdT *) __attribute__ ((weak, alias("oa_soap_load_id_set"))); openhpi-3.6.1/plugins/oa_soap/oa_soap_fumi.c0000644000175100017510000003655612575647266020125 0ustar mohanmohan/* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raja Kumar Thatte **/ #include "oa_soap_fumi.h" /** * oa_soap_set_fumi_source * @oh_handler: Handler data pointer * @resource_id: Resource ID * @num: FUMI number * @banknum: Bank number * @sourceuri: Text buffer containing URI of the source * * Purpose: * Set new source image URI information to the given bank * of the given FUMI. * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current oa_soap implementation does not * support this API **/ SaErrorT oa_soap_set_fumi_source(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiTextBufferT *sourceuri) { err("oa_soap_set_fumi_source not implemented"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_validate_fumi_source * @oh_handler: Handler data pointer * @resource_id: Resource ID * @num: FUMI number * @banknum: Bank number * * Purpose: * Validate the integrity of the source image associated with * the given bank. * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current oa_soap implementation does not * support this API **/ SaErrorT oa_soap_validate_fumi_source(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiFumiNumT num, SaHpiBankNumT banknum) { err("oa_soap_validate_fumi_source not implemented"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_get_fumi_source * @oh_handler: Handler data pointer * @resource_id: Resource ID * @num: FUMI number * @banknum: Bank number * @sourceuri: Source Image URI * * Purpose: * Get the source image URI information assigned to the given bank. * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current oa_soap implementation does not * support this API **/ SaErrorT oa_soap_get_fumi_source(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiFumiSourceInfoT *sourceinfo) { err("oa_soap_get_fumi_source not implemented"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_get_fumi_target * @oh_handler: Handler data pointer * @resource_id: Resource ID * @num: FUMI number * @banknum: Bank number * @bankinfo: Current Image details of the give bank * * Purpose: * Get current image information on the target. * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current oa_soap implementation does not * support this API **/ SaErrorT oa_soap_get_fumi_target(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiFumiBankInfoT *bankinfo) { err("oa_soap_get_fumi_target not implemented"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_start_fumi_backup * @oh_handler: Handler data pointer * @resource_id: Resource ID * @num: FUMI number * * Purpose: * Take the backup of the currently active bank image. * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current oa_soap implementation does not * support this API **/ SaErrorT oa_soap_start_fumi_backup(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiFumiNumT num) { err("oa_soap_start_fumi_backup not implemented"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_set_fumi_bank_order * @oh_handler: Handler data pointer * @resource_id: Resource ID * @num: FUMI number * @banknum: Bank number * @position: bank position in boot order * * Purpose: * Set the bank position in boot order . * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current oa_soap implementation does not * support this API **/ SaErrorT oa_soap_set_fumi_bank_order(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiUint32T position) { err("oa_soap_set_fumi_bank_order not implemented"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_start_fumi_bank_copy * @oh_handler: Handler data pointer * @resource_id: Resource ID * @num: FUMI number * @sourcebanknum: Bank number * @targetbanknum: Text buffer containing URI of the source * * Purpose: * Copy the image from source bank to target bank. * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current oa_soap implementation does not * support this API **/ SaErrorT oa_soap_start_fumi_bank_copy(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiFumiNumT num, SaHpiBankNumT sourcebanknum, SaHpiBankNumT targetbanknum) { err("oa_soap_start_fumi_bank_copy not implemented"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_start_fumi_install * @oh_handler: Handler data pointer * @resource_id: Resource ID * @num: FUMI number * @banknum: Bank number * * Purpose: * To install the image in the given bank. * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current oa_soap implementation does not * support this API **/ SaErrorT oa_soap_start_fumi_install(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiFumiNumT num, SaHpiBankNumT banknum) { err("oa_soap_start_fumi_install not implemented"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_get_fumi_status * @oh_handler: Handler data pointer * @resource_id: Resource ID * @num: FUMI number * @banknum: Bank number * @status: Image Upgrade status * * Purpose: * To know the image upgrade progress status.. * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current oa_soap implementation does not * support this API **/ SaErrorT oa_soap_get_fumi_status(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiFumiUpgradeStatusT *status) { err("oa_soap_get_fumi_status not implemented"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_start_fumi_verify * @oh_handler: Handler data pointer * @resource_id: Resource ID * @num: FUMI number * @banknum: Bank number * * Purpose: * To validate the upgraded image. * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current oa_soap implementation does not * support this API **/ SaErrorT oa_soap_start_fumi_verify(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiFumiNumT num, SaHpiBankNumT banknum) { err("oa_soap_start_fumi_verify not implemented"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_cancel_fumi_upgrade * @oh_handler: Handler data pointer * @resource_id: Resource ID * @num: FUMI number * @banknum: Bank number * * Purpose: * To stop the image upgrade process. * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current oa_soap implementation does not * support this API **/ SaErrorT oa_soap_cancel_fumi_upgrade(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiFumiNumT num, SaHpiBankNumT banknum) { err("oa_soap_cancel_fumi_upgrade not implemented"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_start_fumi_rollback * @oh_handler: Handler data pointer * @resource_id: Resource ID * @num: FUMI number * * Purpose: * To rollback the image * (Stop the image upgrade process and restore the backup image). * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current oa_soap implementation does not * support this API **/ SaErrorT oa_soap_start_fumi_rollback(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiFumiNumT num) { err("oa_soap_start_fumi_rollback not implemented"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_activate_fumi * @oh_handler: Handler data pointer * @resource_id: Resource ID * @num: FUMI number * * Purpose: * To start the newly upgraded image. * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current oa_soap implementation does not * support this API **/ SaErrorT oa_soap_activate_fumi(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiFumiNumT num) { err("oa_soap_activate_fumi not implemented"); return SA_ERR_HPI_UNSUPPORTED_API; } void * oh_set_fumi_source (void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiBankNumT, SaHpiTextBufferT *) __attribute__ ((weak, alias("oa_soap_set_fumi_source"))); void * oh_validate_fumi_source (void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiBankNumT) __attribute__ ((weak, alias("oa_soap_validate_fumi_source"))); void * oh_get_fumi_source (void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiBankNumT, SaHpiFumiSourceInfoT *) __attribute__ ((weak, alias("oa_soap_get_fumi_source"))); void * oh_get_fumi_target (void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiBankNumT, SaHpiFumiBankInfoT *) __attribute__ ((weak, alias("oa_soap_get_fumi_target"))); void * oh_start_fumi_backup (void *, SaHpiResourceIdT, SaHpiFumiNumT) __attribute__ ((weak, alias("oa_soap_start_fumi_backup"))); void * oh_set_fumi_bank_order (void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiBankNumT, SaHpiUint32T) __attribute__ ((weak, alias("oa_soap_set_fumi_bank_order"))); void * oh_start_fumi_bank_copy (void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiBankNumT, SaHpiBankNumT) __attribute__ ((weak, alias("oa_soap_start_fumi_bank_copy"))); void * oh_start_fumi_install (void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiBankNumT) __attribute__ ((weak, alias("oa_soap_start_fumi_install"))); void * oh_get_fumi_status (void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiBankNumT, SaHpiFumiUpgradeStatusT *) __attribute__ ((weak, alias("oa_soap_get_fumi_status"))); void * oh_start_fumi_verify (void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiBankNumT) __attribute__ ((weak, alias("oa_soap_start_fumi_verify"))); void * oh_cancel_fumi_upgrade (void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiBankNumT) __attribute__ ((weak, alias("oa_soap_cancel_fumi_upgrade"))); void * oh_start_fumi_rollback (void *, SaHpiResourceIdT, SaHpiFumiNumT) __attribute__ ((weak, alias("oa_soap_start_fumi_rollback"))); void * oh_activate_fumi (void *, SaHpiResourceIdT, SaHpiFumiNumT) __attribute__ ((weak, alias("oa_soap_activate_fumi"))); openhpi-3.6.1/plugins/oa_soap/oa_soap_reset.h0000644000175100017510000000417612575647270020300 0ustar mohanmohan/* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. */ #ifndef _OA_SOAP_RESET_H #define _OA_SOAP_RESET_H /* Include files */ #include "oa_soap_utils.h" #include "oa_soap_power.h" SaErrorT oa_soap_get_reset_state(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiResetActionT *action); SaErrorT oa_soap_set_reset_state(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiResetActionT action); #endif openhpi-3.6.1/plugins/oa_soap/oa_soap_event.h0000644000175100017510000000470612575647270020276 0ustar mohanmohan/* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. */ #ifndef _OA_SOAP_EVENT_H #define _OA_SOAP_EVENT_H /* Include files */ #include "oa_soap_oa_event.h" #include "oa_soap_server_event.h" #include "oa_soap_interconnect_event.h" #include "oa_soap_fan_event.h" #include "oa_soap_ps_event.h" #include "oa_soap_enclosure_event.h" #include "oa_soap_lcd_event.h" int oa_soap_get_event(void *oh_handler); gpointer oa_soap_event_thread(gpointer oa_pointer); void oa_soap_error_handling(struct oh_handler_state *oh_handler, struct oa_info *oa); void process_oa_out_of_access(struct oh_handler_state *oh_handler, struct oa_info *oa); void process_oa_events(struct oh_handler_state *oh_handler, struct oa_info *oa, struct getAllEventsResponse *oa_event); #endif openhpi-3.6.1/plugins/oa_soap/oa_soap_annunciator.c0000644000175100017510000002465712575647270021500 0ustar mohanmohan/* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra M.S. */ #include "oa_soap_annunciator.h" /** * oa_soap_get_next_announce: * @oh_handler: Pointer to openhpi handler. * @resource_id: Resource Id. * @num: Annuciator number. * @severity: Annuciator severity * @unacknowledged_only: True indicates only unacknowledged announcements * should be returned. False indicates either an * acknowledged or unacknowledged announcement may * be returned. * @announcement: Pointer to hold the returned announcement. * * Purpose: * Retrieve an announcement from the current set of announcements * held in the Annunciator. * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current OA SOAP plugin implementation * does not support this API. **/ SaErrorT oa_soap_get_next_announce(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiAnnunciatorNumT num, SaHpiSeverityT severity, SaHpiBoolT unacknowledged_only, SaHpiAnnouncementT *announcement) { err("OA SOAP get next announce not implemented"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_get_announce: * @oh_handler: Pointer to openhpi handler. * @resource_id: Resource Id. * @num: Annuciator number. * @entry: Identifier of the announcement to retrieve from the * Annunciator. * @announcement: Pointer to hold the returned announcement. * * Purpose: * Retrieve of a specific announcement from the current set of * announcements held in the Annunciator. * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current OA SOAP plugin implementation * does not support this API. **/ SaErrorT oa_soap_get_announce(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiAnnunciatorNumT num, SaHpiEntryIdT entry, SaHpiAnnouncementT *announcement) { err("OA SOAP get announce not implemented "); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_ack_announce: * @oh_handler: Pointer to openhpi handler. * @resource_id: Resource Id. * @num: Annuciator number. * @entry: Identifier of the announcement to retrieve from the * Annunciator. * @severity: Severity level of announcements to acknowledge. * * Purpose: * acknowledge a single announcement or a group of announcements by * severity. * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current OA SOAP plugin implementation * does not support this API. **/ SaErrorT oa_soap_ack_announce(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiAnnunciatorNumT num, SaHpiEntryIdT entry, SaHpiSeverityT severity) { err("OA SOAP ack announce not implemented "); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_get_annunc_mode: * @oh_handler: Pointer to openhpi handler. * @resource_id: Resource Id. * @num: Annuciator number. * @mode: Pointer to store the current operating mode of the * Annunciator. * * Purpose: * Retrieve the current operating mode of an Annunciator. * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current OA SOAP plugin implementation * does not support this API. **/ SaErrorT oa_soap_get_annunc_mode(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiAnnunciatorNumT num, SaHpiAnnunciatorModeT *mode) { err("OA SOAP get annunc mode not implemented "); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_set_annunc_mode: * @oh_handler: Pointer to openhpi handler. * @resource_id: Resource Id. * @num: Annuciator number. * @mode: Mode set for the Annunciator. * * Purpose: * Change the current operating mode of an Annunciator. * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current OA SOAP plugin implementation * does not support this API. **/ SaErrorT oa_soap_set_annunc_mode(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiAnnunciatorNumT num, SaHpiAnnunciatorModeT mode) { err("OA SOAP set annunc mode not implemented "); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_del_announce: * @oh_handler: Pointer to openhpi handler. * @resource_id: Resource Id. * @num: Annuciator number. * @entry: Entry identifier of the announcement to delete * @severity: Severity level of announcements to delete. * * Purpose: * Delete a single announcement or a group of announcements from the * current set of an Annunciator * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current OA SOAP plugin implementation * does not support this API. **/ SaErrorT oa_soap_del_announce(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiAnnunciatorNumT num, SaHpiEntryIdT entry, SaHpiSeverityT severity) { err("OA SOAP del announce not implemented "); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_add_announce: * @oh_handler: Pointer to openhpi handler. * @resource_id: Resource Id. * @num: Annuciator number. * @annoucement: Pointer to structure that contains the new announcement * to add to the set. * * Purpose: * add an announcement to the set of items held by an Annunciator * management instrument. * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current OA SOAP plugin implementation * does not support this API. **/ SaErrorT oa_soap_add_announce(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiAnnunciatorNumT num, SaHpiAnnouncementT *announcement) { err("OA SOAP add announce not implemented "); return SA_ERR_HPI_UNSUPPORTED_API; } void * oh_get_next_announce (void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiSeverityT, SaHpiBoolT, SaHpiAnnouncementT) __attribute__ ((weak, alias("oa_soap_get_next_announce"))); void * oh_get_announce (void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiEntryIdT, SaHpiAnnouncementT *) __attribute__ ((weak, alias("oa_soap_get_announce"))); void * oh_ack_announce (void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiEntryIdT, SaHpiSeverityT) __attribute__ ((weak, alias("oa_soap_ack_announce"))); void * oh_add_announce (void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiAnnouncementT *) __attribute__ ((weak, alias("oa_soap_add_announce"))); void * oh_del_announce (void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiEntryIdT, SaHpiSeverityT) __attribute__ ((weak, alias("oa_soap_del_announce"))); void * oh_get_annunc_mode (void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiAnnunciatorModeT *) __attribute__ ((weak, alias("oa_soap_get_annunc_mode"))); void * oh_set_annunc_mode (void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiAnnunciatorModeT) __attribute__ ((weak, alias("oa_soap_set_annunc_mode"))); openhpi-3.6.1/plugins/oa_soap/oa_soap_power.c0000644000175100017510000005151412575647270020303 0ustar mohanmohan/* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. * Raghavendra M.S. * Shuah Khan * * This file handles all the power related queries * * oa_soap_get_power_state() - gets the power state * * oa_soap_set_power_state() - sets the power state of the resource * * get_server_power_state() - gets the server blade resource power * state * * get_interconnect_power_state() - gets the inter connect resource power * state * * set_server_power_state() - sets the server blade resource power * state * **/ #include "oa_soap_power.h" /** * oa_soap_get_power_state * @oh_handler: Pointer to openhpi handler * @resource_id: Resource id * @state: Pointer to power state * * Purpose: * Gets the power state of the resource. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_CAPABILITY - on power capability is not set for * the given resource * SA_ERR_HPI_INVALID_RESOURCE - on not able to find the resource * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT oa_soap_get_power_state(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiPowerStateT *state) { SaErrorT rv = SA_OK; SaHpiRptEntryT *rpt; struct oa_soap_handler *oa_handler = NULL; SaHpiInt32T bay_number; struct oh_handler_state *handler; if (oh_handler == NULL || state == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } handler = (struct oh_handler_state *) oh_handler; oa_handler = (struct oa_soap_handler *) handler->data; /* Check whether the oa_handler mutex has been locked or not */ rv = lock_oa_soap_handler(oa_handler); if (rv != SA_OK) { err("OA SOAP handler is locked"); return rv; } rpt = oh_get_resource_by_id(handler->rptcache, resource_id); if (rpt == NULL) { err("INVALID RESOURCE"); return SA_ERR_HPI_INVALID_RESOURCE; } /* Check the resource has power capability */ if (! (rpt->ResourceCapabilities & SAHPI_CAPABILITY_POWER)) { err("INVALID RESOURCE CAPABILITY"); return SA_ERR_HPI_CAPABILITY; } bay_number = rpt->ResourceEntity.Entry[0].EntityLocation; /* Check resource type and query server or interconnect power state*/ switch (rpt->ResourceEntity.Entry[0].EntityType) { case (SAHPI_ENT_SYSTEM_BLADE): case (SAHPI_ENT_IO_BLADE): case (SAHPI_ENT_DISK_BLADE): rv = get_server_power_state(oa_handler->active_con, bay_number, state); break; case (SAHPI_ENT_SWITCH_BLADE): rv = get_interconnect_power_state( oa_handler->active_con, bay_number, state); break; default: err("Invalid Resource Type"); rv = SA_ERR_HPI_INTERNAL_ERROR; } return rv; } /** * oa_soap_set_power_state * @oh_handler: Pointer to openhpi handler structure * @resource_id: Resource id * @state: Power state * * Purpose: * Sets the power state of the resource * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT oa_soap_set_power_state(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiPowerStateT state) { SaErrorT rv = SA_OK; SaHpiRptEntryT *rpt = NULL; struct oa_soap_handler *oa_handler = NULL; SaHpiInt32T bay_number; struct oh_handler_state *handler = NULL; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } handler = (struct oh_handler_state *) oh_handler; oa_handler = (struct oa_soap_handler *) handler->data; /* Check whether the oa_handler mutex has been locked or not */ rv = lock_oa_soap_handler(oa_handler); if (rv != SA_OK) { err("OA SOAP handler is locked"); return rv; } rpt = oh_get_resource_by_id(handler->rptcache, resource_id); if (rpt == NULL) { err(" INVALID RESOURCE"); return SA_ERR_HPI_INVALID_RESOURCE; } /* Check the resource has power capability */ if (! (rpt->ResourceCapabilities & SAHPI_CAPABILITY_POWER)) { err(" INVALID RESOURCE CAPABILITY"); return SA_ERR_HPI_CAPABILITY; } bay_number = rpt->ResourceEntity.Entry[0].EntityLocation; /* Check resource type and set the server or interconnect power state*/ switch (rpt->ResourceEntity.Entry[0].EntityType) { case (SAHPI_ENT_SYSTEM_BLADE): rv = set_server_power_state(oa_handler->active_con, bay_number, state); break; case (SAHPI_ENT_IO_BLADE): case (SAHPI_ENT_DISK_BLADE): return(SA_ERR_HPI_UNSUPPORTED_API); case (SAHPI_ENT_SWITCH_BLADE): rv = set_interconnect_power_state( oa_handler->active_con, bay_number, state); break; default: err("Invalid Resource Type"); return SA_ERR_HPI_UNKNOWN; } return rv; } /** * get_server_power_state * @con: Pointer to the soap client handler * @bay_number: Bay number of the server balde * @state: Pointer to power state of the server blade * * Purpose: * Gets the server blade power state. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT get_server_power_state(SOAP_CON *con, SaHpiInt32T bay_number, SaHpiPowerStateT *state) { SaErrorT rv = SA_OK; struct getBladeStatus request; struct bladeStatus response; if (con == NULL || state == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } request.bayNumber = bay_number; rv = soap_getBladeStatus(con, &request, &response); if (rv != SOAP_OK) { err("Get blade status failed"); return SA_ERR_HPI_INTERNAL_ERROR; } switch (response.powered) { case (POWER_ON): *state = SAHPI_POWER_ON; break; case (POWER_OFF): *state = SAHPI_POWER_OFF; break; case (POWER_REBOOT): err("Wrong Power State (REBOOT) detected"); return SA_ERR_HPI_INTERNAL_ERROR; break; default: err("Unknown Power State %d detected for Blade in " " bay %d", response.powered, bay_number); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } /** * get_interconnect_power_state * @con: Pointer to the soap client handler * @bay_number: Bay number of the interconnect balde * @state: Pointer to power state of the interconnect blade * * Purpose: * Gets the interconnect power state. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT get_interconnect_power_state(SOAP_CON *con, SaHpiInt32T bay_number, SaHpiPowerStateT *state) { SaErrorT rv = SA_OK; struct getInterconnectTrayStatus request; struct interconnectTrayStatus response; if (con == NULL || state == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } request.bayNumber = bay_number; rv = soap_getInterconnectTrayStatus(con, &request, &response); if (rv != SOAP_OK) { err("Get interconnect tray status failed"); return SA_ERR_HPI_INTERNAL_ERROR; } switch (response.powered) { case (POWER_ON): *state = SAHPI_POWER_ON; break; case (POWER_OFF): *state = SAHPI_POWER_OFF; break; case (POWER_REBOOT): err("Wrong (REBOOT) Power State detected"); return SA_ERR_HPI_INTERNAL_ERROR; break; case (POWER_UNKNOWN): *state = SAHPI_POWER_OFF; break; default: err("Unknown Power State %d detected for interconnect" " at bay %d", response.powered, bay_number); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } /** * set_server_power_state * @con: Pointer to the soap client handler * @bay_namber: Bay number of the server blade * @state: Power state of the server blade * * Purpose: * Sets the power state of the server blade, * if the current state is not same as requested state. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT set_server_power_state(SOAP_CON *con, SaHpiInt32T bay_number, SaHpiPowerStateT state) { SaErrorT rv = SA_OK; SaHpiPowerStateT tmp; struct setBladePower blade_power; SaHpiInt32T pwroff_poll = 0; if (con == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } rv = get_server_power_state(con, bay_number, &tmp); if (rv != SA_OK) { err("get server power state failed"); return rv; } /* Check whether the current server blade power state is same * as requested by user. If yes, ignore the user request */ if (state == tmp) { err("Nothing to be done. Blade is in the requested state"); return SA_OK; } blade_power.bayNumber = bay_number; switch (state) { case (SAHPI_POWER_ON): blade_power.power = MOMENTARY_PRESS; rv = soap_setBladePower(con, &blade_power); if (rv != SOAP_OK) { err("Set blade at %d to power on failed", bay_number); return SA_ERR_HPI_INTERNAL_ERROR; } break; case (SAHPI_POWER_OFF): blade_power.power = PRESS_AND_HOLD; rv = soap_setBladePower(con, &blade_power); if (rv != SOAP_OK) { err("Set blade at %d to power off failed", bay_number); return SA_ERR_HPI_INTERNAL_ERROR; } break; case (SAHPI_POWER_CYCLE): /* Power cycle requires the server to be * power off and then power on * Check whether the current server power state is off * If yes, power on the server * Else, power off and then power on */ if (tmp != SAHPI_POWER_OFF) { blade_power.power = PRESS_AND_HOLD; rv = soap_setBladePower(con, &blade_power); if (rv != SOAP_OK) { err("Set blade power to power off " "failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Check whether the power state is OFF for * every OA_POWEROFF_POLL_INTERVAL seconds. * Server blades take a few seconds (around 4 * secs) to power off if no operating system is * running there. Otherwise, an orderly shutdown * is performed, which could take a while. */ while (pwroff_poll < OA_MAX_POWEROFF_POLLS) { rv = get_server_power_state(con, bay_number, &tmp); if (rv != SA_OK) { err("get_server_power_state failed"); return(SA_ERR_HPI_INTERNAL_ERROR); } if ( tmp == SAHPI_POWER_OFF) break; sleep(OA_POWEROFF_POLL_INTERVAL); pwroff_poll++; } if( pwroff_poll >= OA_MAX_POWEROFF_POLLS){ err("Max poweroff polls exceeded (%d)", OA_MAX_POWEROFF_POLLS); return( SA_ERR_HPI_INTERNAL_ERROR); } /* There is a race condition if a "power on" * command is sent immediately after a * "power off" command, and we may hit this * even if we have polled for the current * power state, unless we wait a bit first. */ sleep(OA_SERVER_POWER_OFF_WAIT_PERIOD); } /* end if tmp != SAHPI_POWER_OFF */ /* Now, turn the blade back on */ blade_power.power = MOMENTARY_PRESS; rv = soap_setBladePower(con, &blade_power); if (rv != SOAP_OK) { err("Set blade at %d to power on failed", bay_number); return SA_ERR_HPI_INTERNAL_ERROR; } break; default: err("Invalid power state %d detected in bay %d", state, bay_number); return SA_ERR_HPI_INVALID_PARAMS; } return SA_OK; } /** * set_interconnect_power_state * @con: Pointer to the soap client handler * @bay_namber: Bay number of the interconnect blade * @state: Power state of the interconnect blade * * Purpose: * Sets the power state of the interconnect blade, * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT set_interconnect_power_state(SOAP_CON *con, SaHpiInt32T bay_number, SaHpiPowerStateT state) { SaErrorT rv = SA_OK; SaHpiPowerStateT tmp; struct setInterconnectTrayPower interconnect_power; if (con == NULL) { err("Invalid parameter"); return SA_ERR_HPI_INVALID_PARAMS; } interconnect_power.bayNumber = bay_number; switch (state) { case (SAHPI_POWER_ON): interconnect_power.on = HPOA_TRUE; rv = soap_setInterconnectTrayPower(con, &interconnect_power); if (rv != SOAP_OK) { err("Set interconnect at bay %d to " "power on failed", bay_number); return SA_ERR_HPI_INTERNAL_ERROR; } break; case (SAHPI_POWER_OFF): interconnect_power.on = HPOA_FALSE; rv = soap_setInterconnectTrayPower(con, &interconnect_power); if (rv != SOAP_OK) { err("Set interconnect at bay %d to " "power off failed", bay_number); return SA_ERR_HPI_INTERNAL_ERROR; } break; case (SAHPI_POWER_CYCLE): /* Get the current power state of the interconnect */ rv = get_interconnect_power_state(con, bay_number, &tmp); if (rv != SA_OK ) { err("get interconnect power state failed"); return rv; } /* Power cycle requires the server to be * power off and then power on * Check whether the current server power state is off * If yes, power on the server * Else, power off and then power on */ if (tmp != SAHPI_POWER_OFF) { interconnect_power.on = HPOA_FALSE; rv = soap_setInterconnectTrayPower( con, &interconnect_power); if (rv != SOAP_OK) { err("Set interconnect at bay %d to " "power on failed", bay_number); return SA_ERR_HPI_INTERNAL_ERROR; } } interconnect_power.on = HPOA_TRUE; rv = soap_setInterconnectTrayPower(con, &interconnect_power); if (rv != SOAP_OK) { err("Set interconnect at %d to power on " "failed", bay_number); return SA_ERR_HPI_INTERNAL_ERROR; } break; default: err("Invalid power state %d detected for interconnect " "at bay %d", state, bay_number); return SA_ERR_HPI_INVALID_PARAMS; } return SA_OK; } void * oh_get_power_state (void *, SaHpiResourceIdT, SaHpiPowerStateT *) __attribute__ ((weak, alias("oa_soap_get_power_state"))); void * oh_set_power_state (void *, SaHpiResourceIdT, SaHpiPowerStateT) __attribute__ ((weak, alias("oa_soap_set_power_state"))); openhpi-3.6.1/plugins/oa_soap/oa_soap_fan_event.h0000644000175100017510000000463612575647270021124 0ustar mohanmohan/* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. */ #ifndef _OA_SOAP_FAN_EVENT_H #define _OA_SOAP_FAN_EVENT_H /* Include files */ #include "oa_soap_re_discover.h" SaErrorT process_fan_insertion_event(struct oh_handler_state *oh_handler, SOAP_CON *con, struct eventInfo *oa_event); SaErrorT process_fan_extraction_event(struct oh_handler_state *oh_handler, struct eventInfo *oa_event); void oa_soap_proc_therm_subsys_info(struct oh_handler_state *oh_handler, struct thermalSubsystemInfo *info); void oa_soap_proc_fz_status(struct oh_handler_state *oh_handler, struct fanZone *fanZone); void oa_soap_proc_fan_status(struct oh_handler_state *oh_handler, struct fanInfo *info); #endif openhpi-3.6.1/plugins/oa_soap/oa_soap_inventory.h0000644000175100017510000003276212575647270021215 0ustar mohanmohan/* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra M.S. * Shuah Khan * Raghavendra P.G. */ #ifndef _OA_SOAP_INVENTORY_H #define _OA_SOAP_INVENTORY_H /* Include files */ #include "oa_soap.h" #include /* cClass resource inventory string */ #define ENCLOSURE_INVENTORY_STRING "Enclosure Inventory" #define OA_INVENTORY_STRING "OA Inventory" #define SERVER_INVENTORY_STRING "Server Inventory" #define INTERCONNECT_INVENTORY_STRING "Interconnect Inventory" #define FAN_INVENTORY_STRING "Fan Inventory" #define POWER_SUPPLY_INVENTORY_STRING "Power Supply Inventory" #define POWER_SUPPLY_RDR_STRING "Power Supply" /* Inventory data field structure */ struct oa_soap_field { SaHpiIdrFieldT field; struct oa_soap_field *next_field; }; /* Inventory data area structure */ struct oa_soap_area { SaHpiIdrAreaHeaderT idr_area_head; struct oa_soap_field *field_list; struct oa_soap_area *next_area; }; struct oa_soap_inventory_info { SaHpiIdrInfoT idr_info; struct oa_soap_area *area_list; }; /* Inventory data respository header structure */ struct oa_soap_inventory { SaHpiInventoryRecT inv_rec; struct oa_soap_inventory_info info; char *comment; }; /* Maximum areas for a resource in OA SOAP * * If a new area is added for a resource, then change the maximum inventory * area value. Accordingly, add dummy elements into global inventory RDR array * in oa_soap_resources.c */ #define OA_SOAP_MAX_INV_AREAS 3 /* Maximum fields in an area in OA SOAP * * If a new field in an area for a resource, then change the maximum inventory * fields value. Accordingly, add dummy elements into global inventory RDR array * in oa_soap_resources.c */ #define OA_SOAP_MAX_INV_FIELDS 3 struct oa_soap_inv_area { struct oa_soap_area area; struct oa_soap_field field_array[OA_SOAP_MAX_INV_FIELDS]; }; struct oa_soap_inv_rdr { SaHpiRdrT rdr; struct oa_soap_inventory inventory; struct oa_soap_inv_area area_array[OA_SOAP_MAX_INV_AREAS]; }; /* The maximum size of the fan zone inventory field data. * In c3000, it can have the data "1,2,3,4,5,6,7,8" for device bays. * 3 bytes of char array is enough to accomodate above information. * * On supporting new enclosure type, change the below #define value as * appropriate */ #define OA_SOAP_MAX_FZ_INV_SIZE 31 /* Maximum size of fan zone number digits. In c7000, 4 fan zones are supported. * 1 digit is required to represent the fan zone number. * * On supporting new enclosure type, change the below #define value as * appropriate */ #define OA_SOAP_MAX_FZ_NUM_SIZE 1 /* Structure for mapping the Fans to Fan zones with shared status information. * This will be used to construct the inventory data field for Fan */ struct oa_soap_fz_map { SaHpiInt32T zone; SaHpiInt32T secondary_zone; SaHpiBoolT shared; }; /* Inventory function declarations */ SaErrorT oa_soap_get_idr_info(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiIdrIdT idr_id, SaHpiIdrInfoT *idr_info); SaErrorT oa_soap_get_idr_area_header(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiIdrIdT idr_id, SaHpiIdrAreaTypeT area_type, SaHpiEntryIdT area_id, SaHpiEntryIdT *next_area_id, SaHpiIdrAreaHeaderT *area_header); SaErrorT oa_soap_add_idr_area(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiIdrIdT idr_id, SaHpiIdrAreaTypeT area_type, SaHpiEntryIdT *area_id); SaErrorT oa_soap_add_idr_area_by_id(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiIdrIdT idr, SaHpiIdrAreaTypeT area_type, SaHpiEntryIdT area_id); SaErrorT oa_soap_del_idr_area(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiIdrIdT idr_id, SaHpiEntryIdT area_id); SaErrorT oa_soap_get_idr_field(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiIdrIdT idr_id, SaHpiEntryIdT area_id, SaHpiIdrFieldTypeT field_type, SaHpiEntryIdT field_id, SaHpiEntryIdT *next_field_id, SaHpiIdrFieldT *field); SaErrorT oa_soap_add_idr_field(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiIdrIdT idr_id, SaHpiIdrFieldT *field); SaErrorT oa_soap_add_idr_field_by_id(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiIdrIdT idr_id, SaHpiIdrFieldT *field); SaErrorT oa_soap_set_idr_field(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiIdrIdT idr_id, SaHpiIdrFieldT *field); SaErrorT oa_soap_del_idr_field(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiIdrIdT idr_id, SaHpiEntryIdT area_id, SaHpiEntryIdT field_id); SaErrorT build_enclosure_inv_rdr(struct oh_handler_state *oh_handler, struct enclosureInfo *response, SaHpiRdrT *rdr, struct oa_soap_inventory **pinv); SaErrorT build_oa_inv_rdr(struct oh_handler_state *oh_handler, struct oaInfo *response, SaHpiRdrT *rdr, struct oa_soap_inventory **pinv); SaErrorT build_server_inv_rdr(struct oh_handler_state *oh_handler, SOAP_CON *con, SaHpiInt32T bay_number, SaHpiRdrT *rdr, struct oa_soap_inventory **pinv); SaErrorT build_server_inv_rdr_arr(struct oh_handler_state *oh_handler, SOAP_CON *con, SaHpiInt32T bay_number, SaHpiRdrT *rdr, struct oa_soap_inventory **pinv, struct bladeInfo *, struct bladePortMap *); SaErrorT add_mezz_slot_idr_fields(xmlNode *mezzSlots, struct oa_soap_inventory *local_inventory); SaErrorT add_mezz_device_idr_fields(xmlNode *mezzDevices, struct oa_soap_inventory *local_inventory); SaErrorT build_inserted_server_inv_rdr(struct oh_handler_state *oh_handler, SaHpiInt32T bay_number, SaHpiRdrT *rdr, struct oa_soap_inventory **inventory); SaErrorT build_server_inventory(struct bladeInfo *response, SaHpiRdrT *rdr, struct oa_soap_inventory **inventory); SaErrorT build_interconnect_inv_rdr(struct oh_handler_state *oh_handler, SOAP_CON *con, SaHpiInt32T bay_number, SaHpiRdrT *rdr, struct oa_soap_inventory **pinv); SaErrorT build_interconnect_inv_rdr_arr(struct oh_handler_state *oh_handler, SaHpiInt32T bay_number, SaHpiRdrT *rdr, struct oa_soap_inventory **pinv, struct interconnectTrayInfo *, struct interconnectTrayPortMap *); SaErrorT build_fan_inv_rdr(struct oh_handler_state *oh_handler, struct fanInfo *response, SaHpiRdrT *rdr, struct oa_soap_inventory **pinv); SaErrorT build_power_inv_rdr(struct oh_handler_state *oh_handler, struct powerSupplyInfo *response, SaHpiRdrT *rdr, struct oa_soap_inventory **pinv); SaErrorT build_server_inventory_area(SOAP_CON *con, struct bladeInfo *response, SaHpiRdrT *rdr, struct oa_soap_inventory **inventory); SaErrorT add_product_area(struct oa_soap_area **parea, char *name, char *manufacturer, SaHpiInt32T *success_flag); SaErrorT add_chassis_area(struct oa_soap_area **parea, char *part_number, char *serial_number, SaHpiInt32T *success_flag); SaErrorT add_board_area(struct oa_soap_area **parea, char *part_number, char *serial_number, SaHpiInt32T *success_flag); SaErrorT add_internal_area(struct oa_soap_area **parea, char *manufacturer, char *name, char *part_number, char *serial_number, SaHpiInt32T *success_flag); SaErrorT idr_area_add(struct oa_soap_area **area_ptr, SaHpiIdrAreaTypeT area_type, struct oa_soap_area **return_area); SaErrorT idr_area_add_by_id(struct oa_soap_area **head_area, SaHpiIdrAreaTypeT area_type, SaHpiEntryIdT area_id); SaErrorT idr_area_delete(struct oa_soap_area **area_ptr, SaHpiEntryIdT area_id); SaErrorT fetch_idr_area_header(struct oa_soap_inventory_info *inv_ptr, SaHpiEntryIdT area_id, SaHpiIdrAreaTypeT area_type, SaHpiIdrAreaHeaderT *area_header, SaHpiEntryIdT *next_area_id); SaErrorT idr_field_add(struct oa_soap_field **field_ptr, SaHpiIdrFieldT *field); SaErrorT idr_field_add_by_id(struct oa_soap_field **head_field, SaHpiEntryIdT area_id, SaHpiIdrFieldTypeT field_type, char *field_data, SaHpiEntryIdT field_id); SaErrorT idr_field_delete(struct oa_soap_field **field_ptr, SaHpiEntryIdT field_id); SaErrorT idr_field_update(struct oa_soap_field *field_ptr, SaHpiIdrFieldT *field); SaErrorT fetch_idr_field(struct oa_soap_inventory_info *inv_ptr, SaHpiEntryIdT area_id, SaHpiIdrFieldTypeT field_type, SaHpiEntryIdT field_id, SaHpiEntryIdT *next_field_id, SaHpiIdrFieldT *field); SaErrorT free_inventory_info(struct oh_handler_state *handler, SaHpiResourceIdT resource_id); SaErrorT oa_soap_build_fz_inv(struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, struct fanZone *fan_zone); SaErrorT oa_soap_build_fan_inv(struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, struct fanInfo *fan_info); SaErrorT oa_soap_build_lcd_inv(struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id); #endif openhpi-3.6.1/plugins/oa_soap/oa_soap_hotswap.c0000644000175100017510000004532512575647270020637 0ustar mohanmohan/* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raja Kumar Thatte * Raghavendra P.G. * * This file handles all the hotswap related event handling * * oa_soap_get_hotswap_state() - gets the hotswap state of the * resource * * oa_soap_set_hotswap_state() - sets the hotswap state of the * resource * * oa_soap_get_indicator_state() - gets the hotswap LED indicator * state of the resource * * oa_soap_set_indicator_state() - sets the hotswap LED indicator * state of the resource * * oa_soap_request_hotswap_action() - requests the hotswap action * * oa_soap_hotswap_policy_cancel() - requests hotswap policy cancel * * oa_soap_get_autoinsert_timeout() - gets the auto insert event * Timeout period * * oa_soap_set_autoinsert_timeout() - sets the auto insert event * Timeout period * * oa_soap_get_autoextract_timeout() - gets the auto extract event * Timeout period * * oa_soap_set_autoextract_timeout() - sets the auto extract event * Timeout period **/ #include "oa_soap_hotswap.h" /** * oa_soap_get_hotswap_state * @oh_handler: Pointer to openhpi handler structure * @resource_id: Resource id * @state: Hotswap state * * Purpose: * Gets the hotswap state of the resource * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INVALID_RESOURCE - on invalid resource id * SA_ERR_HPI_CAPABILITY - on not having hotswap capability * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT oa_soap_get_hotswap_state(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiHsStateT *state) { struct oa_soap_hotswap_state *hotswap_state = NULL; struct oh_handler_state *handler = NULL; SaHpiRptEntryT *rpt = NULL; if (oh_handler == NULL || state == NULL) { err("Invalid parameters"); return(SA_ERR_HPI_INVALID_PARAMS); } handler = (struct oh_handler_state *) oh_handler; rpt = oh_get_resource_by_id(handler->rptcache, resource_id); if (rpt == NULL) { err("failed to get rpt entry"); return SA_ERR_HPI_INVALID_RESOURCE; } if (! (rpt->ResourceCapabilities & SAHPI_CAPABILITY_FRU)) { err("Resource does not have FRU capability"); return SA_ERR_HPI_CAPABILITY; } /* For FAN, PS, OA etc give the state based on ResouceFailed The standards changed to include all FRUs */ if (! (rpt->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP)) { if(!(rpt->ResourceFailed)) { *state = SAHPI_HS_STATE_ACTIVE; } else { *state = SAHPI_HS_STATE_INACTIVE; } } else { /* Get the hotswap structure of MANAGED_HOTSWAP */ hotswap_state = (struct oa_soap_hotswap_state *) oh_get_resource_data(handler->rptcache, resource_id); if (hotswap_state == NULL) { err("Unable to get the resource private data"); return SA_ERR_HPI_INVALID_RESOURCE; } *state = hotswap_state->currentHsState; } if ( *state == SAHPI_HS_STATE_NOT_PRESENT) { /* We can never have any resouce information in RPT with * NOT_PRESENT hotswap state Ideally, this code should never gets executed */ return SA_ERR_HPI_INVALID_RESOURCE; } return SA_OK; } /** * oa_soap_set_hotswap_state * @oh_handler: Pointer to openhpi handler structure * @resource_id: Resource id * @state: Hotswap state * * Purpose: * Sets the hotswap state of the resource * * Detailed Description: * Currently, the OA plug-in does not stay in the InsertionPending or * ExtractionPending states. Because of this, the ActiveSet() and * InactiveSet() will always be an invalid request, as per the HPI * specification. * * As it turns out, the current infrastructure code does not even call * this plug-in routine. However, if it's ever called, we need to be * returning the correct values. * * Return value: * SA_ERR_HPI_INVALID_REQUEST - We're not in one of the pending states **/ SaErrorT oa_soap_set_hotswap_state(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiHsStateT state) { return SA_ERR_HPI_INVALID_REQUEST; } /** * oa_soap_get_indicator_state * @oh_handler: Pointer to openhpi handler structure * @resource_id: Resource id * @state: Hotswap state * * Purpose: * Gets the hotswap LED indicator state of the resource * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INVALID_RESOURCE - on invalid resource id * SA_ERR_HPI_CAPABILITY - on not having hotswap capability * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT oa_soap_get_indicator_state(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiHsIndicatorStateT *state) { err("oa_soap_get_indicator_state not supported"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_set_indicator_state * @oh_handler: Pointer to openhpi handler structure * @resource_id: Resource id * @state: Hotswap state * * Purpose: * Sets the hotswap LED indicator state of the resource * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INVALID_RESOURCE - on invalid resource id * SA_ERR_HPI_CAPABILITY - on not having hotswap capability * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT oa_soap_set_indicator_state(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiHsIndicatorStateT state) { err("oa_soap_set_indicator_state not supported"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_request_hotswap_action * @oh_handler: Pointer to openhpi handler structure * @resource_id: Resource id * @action: Hotswap action * * Purpose: * Requests the hotswap action * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INVALID_RESOURCE - on invalid resource id * SA_ERR_HPI_CAPABILITY - on not having hotswap capability * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT oa_soap_request_hotswap_action(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiHsActionT action) { SaErrorT rv = SA_OK; struct oa_soap_hotswap_state *hotswap_state = NULL; struct oh_handler_state *handler = NULL; struct oa_soap_handler *oa_handler = NULL; SaHpiRptEntryT *rpt = NULL; char *type = NULL; if (oh_handler == NULL) { err("Invalid parameters"); return(SA_ERR_HPI_INVALID_PARAMS); } handler = (struct oh_handler_state *) oh_handler; oa_handler = (struct oa_soap_handler *) handler->data; rv = lock_oa_soap_handler(oa_handler); if (rv != SA_OK) { err("OA SOAP handler is locked"); return rv; } /* Check whether hotswap action is corrrect or not */ type = oh_lookup_hsaction(action); if (type == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } rpt = oh_get_resource_by_id(handler->rptcache, resource_id); if (rpt == NULL) { err("Failed to get rpt entry"); return SA_ERR_HPI_INVALID_RESOURCE; } /* Check whether the resource has managed hotswap capability */ if (! (rpt->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP)) { err("Resource does not have MANAGED_HOTSWAP capability"); return SA_ERR_HPI_CAPABILITY; } /* Get the hotswap structure from rpt entry */ hotswap_state = (struct oa_soap_hotswap_state *) oh_get_resource_data(handler->rptcache, resource_id); if (hotswap_state == NULL) { err("Unable to get the resource private data"); return SA_ERR_HPI_INVALID_RESOURCE; } switch (action) { case SAHPI_HS_ACTION_INSERTION: /* Check whether resource is in INACTIVE state * Setting to INSERTION state is possible * when theresource is in INACTIVE state */ if (hotswap_state->currentHsState == SAHPI_HS_STATE_INACTIVE) { rv = oa_soap_set_power_state( oh_handler, resource_id, SAHPI_POWER_ON); } else { err("Setting to INSERTION state is possible " "when theresource is in INACTIVE state."); err("The resource is not in INACTIVE state"); rv = SA_ERR_HPI_INVALID_REQUEST; } break; case SAHPI_HS_ACTION_EXTRACTION: /* Check whether resource is in ACTIVE state * Setting to EXTRACTION state is possible * when theresource is in ACTIVE state */ if (hotswap_state->currentHsState == SAHPI_HS_STATE_ACTIVE) { rv = oa_soap_set_power_state( oh_handler, resource_id, SAHPI_POWER_OFF); } else { err("Setting to EXTRACTION state is possible " "when theresource is in ACTIVE state."); err("The resource is not in ACTIVE state"); rv = SA_ERR_HPI_INVALID_REQUEST; } break; default: err("Invalid parameter"); rv = SA_ERR_HPI_INVALID_PARAMS; } return SA_OK; } /** * oa_soap_hotswap_policy_cancel * @oh_handler: Pointer to openhpi handler structure * @resource_id: Resource id * @tm: Timeout value * * Purpose: * Requests hotswap policy cancel * * Detailed Description: * Currently, the OA plug-in does not stay in the InsertionPending or * ExtractionPending states. Because of this, the policy_cancel request * will always be an invalid request, as per the HPI specification. * * As it turns out, the current infrastructure code does not even call * this plug-in routine. However, if it's ever called, we need to be * returning the correct values. * * Return value: * SA_ERR_HPI_INVALID_REQUEST - We're not in one of the pending states **/ SaErrorT oa_soap_hotswap_policy_cancel(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiTimeoutT timeout) { return SA_ERR_HPI_INVALID_REQUEST; } /** * oa_soap_get_autoinsert_timeout: * @oh_handler: Handler data pointer. * @timeout: Timeout to set. * * Purpose: * Get hotswap autoinsert timeout. * * Detailed Description: NA * * Return values: * SA_OK - on success * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT oa_soap_get_autoinsert_timeout(void *oh_handler, SaHpiTimeoutT *timeout) { dbg("oa_soap_get_autoinsert_timeout is not supported"); dbg("Default auto insert timeout is IMMEDIATE and read only"); *timeout=SAHPI_TIMEOUT_IMMEDIATE; return SA_OK; } /** * oa_soap_set_autoinsert_timeout: * @oh_handler: Handler data pointer. * @timeout: Timeout to set. * * Purpose: * Set hotswap autoinsert timeout. * * Detailed Description: NA * * Return values: * SA_OK - on success * SA_ERR_HPI_READ_ONLY - auto-insert timeout is fixed * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT oa_soap_set_autoinsert_timeout(void *oh_handler, SaHpiTimeoutT timeout) { err("oa_soap_set_autoinsert_timeout supplied is %lld",timeout); err("Default auto insert timeout is IMMEDIATE and read only"); return SA_ERR_HPI_READ_ONLY; } /** * oa_soap_get_autoextract_timeout: * @oh_handler: Handler data pointer. * @resource_id: Resource ID. * @timeout: Timeout value. * * Purpose: * Get a resource's hotswap autoextract timeout. * * Detailed Description: NA * * Return values: * SA_OK - Normal case. * SAHPI_TIMEOUT_IMMEDIATE - autonomous handling is immediate * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT oa_soap_get_autoextract_timeout(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiTimeoutT *timeout) { dbg("oa_soap_get_autoextract_timeout is not supported"); dbg("Default auto extract timeout is IMMEDIATE and read only"); *timeout=SAHPI_TIMEOUT_IMMEDIATE; return SA_OK; } /** * oa_soap_set_autoextract_timeout: * @oh_handler: Handler data pointer. * @resource_id: Resource ID. * @timeout: Timeout to set. * * Purpose: * Set a resource hotswap autoextract timeout. * * Detailed Description: NA * * Return values: * SA_OK - on success * SA_ERR_HPI_READ_ONLY - auto-insert timeout is fixed * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT oa_soap_set_autoextract_timeout(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiTimeoutT timeout) { err("oa_soap_set_autoextract_timeout is not supported"); err("Default auto extract timeout is IMMEDIATE and read only"); return SA_ERR_HPI_READ_ONLY; } void * oh_get_hotswap_state (void *, SaHpiResourceIdT, SaHpiHsStateT *) __attribute__ ((weak, alias("oa_soap_get_hotswap_state"))); void * oh_set_hotswap_state (void *, SaHpiResourceIdT, SaHpiHsStateT) __attribute__ ((weak, alias("oa_soap_set_hotswap_state"))); void * oh_request_hotswap_action (void *, SaHpiResourceIdT, SaHpiHsActionT) __attribute__ ((weak, alias("oa_soap_request_hotswap_action"))); void * oh_hotswap_policy_cancel (void *, SaHpiResourceIdT, SaHpiTimeoutT) __attribute__ ((weak, alias("oa_soap_hotswap_policy_cancel"))); void * oh_get_indicator_state (void *, SaHpiResourceIdT, SaHpiHsIndicatorStateT *) __attribute__ ((weak, alias("oa_soap_get_indicator_state"))); void * oh_set_indicator_state (void *, SaHpiResourceIdT, SaHpiHsIndicatorStateT) __attribute__ ((weak, alias("oa_soap_set_indicator_state"))); void * oh_get_autoinsert_timeout (void *, SaHpiResourceIdT, SaHpiTimeoutT) __attribute__ ((weak, alias("oa_soap_get_autoinsert_timeout"))); void * oh_set_autoinsert_timeout (void *, SaHpiTimeoutT) __attribute__ ((weak, alias("oa_soap_set_autoinsert_timeout"))); void * oh_get_autoextract_timeout (void *, SaHpiResourceIdT, SaHpiTimeoutT *) __attribute__ ((weak, alias("oa_soap_get_autoextract_timeout"))); void * oh_set_autoextract_timeout (void *, SaHpiResourceIdT, SaHpiTimeoutT) __attribute__ ((weak, alias("oa_soap_set_autoextract_timeout"))); openhpi-3.6.1/plugins/oa_soap/oa_soap_server_event.c0000644000175100017510000017241112575647270021656 0ustar mohanmohan/* * Copyright (C) 2007-2009, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. * Shuah Khan * Raghavendra M.S. * Mohan Devarajulu * * This file has the server blade related events handling * * process_server_power_off_event() - Processes the server power off event * * process_server_power_on_event() - Processes the server power on event * * process_server_power_event() - Processes the server power event * * process_server_insert_completed() - Processes the server * insert completed event * * process_server_extraction_event() - Processes the server extraction * event * * build_inserted_server_rpt() - Builds the rpt entry for inserted * server * * oa_soap_parse_memory_sensor_reading() - Get the memory error from * extra_data field * * oa_soap_proc_server_status() - Processes the server status event * * oa_soap_serv_post_comp () - Processes the blade post complete * event * * oa_soap_set_thermal_sensor () - Enables or Disables the thermal * sensors associated with blade */ #include "oa_soap_server_event.h" #include "oa_soap_discover.h" /* for build_server_rpt() prototype */ #include "sahpi_wrappers.h" /** * process_server_power_off_event * @oh_handler: Pointer to openhpi handler structure * @event: Pointer to the openhpi event structure * * Purpose: * Creates the server power off hotswap event * * Detailed Description: NA * * Return values: * SA_OK - success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters. * SA_ERR_HPI_INTERNAL_ERROR - on failure **/ SaErrorT process_server_power_off_event(struct oh_handler_state *oh_handler, struct oh_event *event) { struct oa_soap_hotswap_state *hotswap_state = NULL; if (oh_handler == NULL || event == NULL) { err("wrong parameters passed"); return SA_ERR_HPI_INVALID_PARAMS; } hotswap_state = (struct oa_soap_hotswap_state *) oh_get_resource_data(oh_handler->rptcache, event->resource.ResourceId); if (hotswap_state == NULL) { err("Failed to get server hotswap state"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Sometimes OA sends duplicate power off event * Check whether hotswap state is not in ACTIVE * If yes, then ignore power off event */ if (hotswap_state->currentHsState != SAHPI_HS_STATE_ACTIVE) { dbg("blade is not in proper state"); dbg("ignoring the power off event"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Raise the server power off hotswap event */ event->rdrs = NULL; event->event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_ACTIVE; event->event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_EXTRACTION_PENDING; /* ACTIVE to EXTRACTION_PENDING state change can not be stopped. * Hence, this is unexpected deactivation */ event->event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_UNEXPECTED_DEACTIVATION; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(event)); event->rdrs = NULL; event->event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_EXTRACTION_PENDING; event->event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_INACTIVE; /* EXTRACTION_PENDING to INACTIVE state change happens due to auto * policy of server blade */ event->event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_AUTO_POLICY; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(event)); event->resource.ResourceSeverity = SAHPI_CRITICAL; hotswap_state->currentHsState = SAHPI_HS_STATE_INACTIVE; return SA_OK; } /** * process_server_power_on_event * @oh_handler: Pointer to openhpi handler structure * @con: Pointer to SOAP_CON structure * @bay_number: Bay number of the server blade * @event: Pointer to the openhpi event structure * * Purpose: * Creates the server power on hotswap event. If the sever blade * was powered on after insertion, then the INSERTION_PENDING to * ACTIVE hot swap event is generated. * * Detailed Description: NA * * Return values: * SA_OK - success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters. * SA_ERR_HPI_INTERNAL_ERROR - on failure **/ SaErrorT process_server_power_on_event(struct oh_handler_state *oh_handler, SOAP_CON *con, struct oh_event *event, SaHpiInt32T bay_number) { SaErrorT rv = SA_OK; struct oa_soap_hotswap_state *hotswap_state = NULL; struct oa_soap_sensor_info *sensor_info=NULL; SaHpiRdrT *rdr = NULL; SaHpiIdrIdT sen_rdr_num = OA_SOAP_SEN_TEMP_STATUS; if (oh_handler == NULL || con == NULL || event == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } hotswap_state = (struct oa_soap_hotswap_state *) oh_get_resource_data(oh_handler->rptcache, event->resource.ResourceId); if (hotswap_state == NULL) { err("Failed to get hotswap state of server blade"); return SA_ERR_HPI_INTERNAL_ERROR; } event->event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = hotswap_state->currentHsState; /* Check whether blade is inserted and then powered on */ switch (hotswap_state->currentHsState) { case (SAHPI_HS_STATE_INSERTION_PENDING): hotswap_state->currentHsState = SAHPI_HS_STATE_ACTIVE; event->event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_ACTIVE; /* INSERTION_PENDING to ACTIVE state change happens due * to auto policy of server blade */ event->event.EventDataUnion.HotSwapEvent. CauseOfStateChange = SAHPI_HS_CAUSE_AUTO_POLICY; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(event)); break; case (SAHPI_HS_STATE_INACTIVE): event->resource.ResourceSeverity = SAHPI_OK; /* The previous state of the server was power off * Update the current hotswap state to ACTIVE */ hotswap_state->currentHsState = SAHPI_HS_STATE_ACTIVE; if (rv != SA_OK) { err("Failed to add hot swap state"); } rdr = oh_get_rdr_by_type(oh_handler->rptcache, event->resource.ResourceId, SAHPI_SENSOR_RDR, sen_rdr_num); if (rdr == NULL) { err("RDR not present"); return SA_ERR_HPI_NOT_PRESENT; } /* Get the thermal sensor information of the server */ sensor_info = (struct oa_soap_sensor_info*) oh_get_rdr_data(oh_handler->rptcache, event->resource.ResourceId, rdr->RecordId); if (sensor_info == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); return SA_ERR_HPI_INTERNAL_ERROR; } /* Since the server got powered off * Clear the thermal sensor states */ sensor_info->current_state = SAHPI_ES_UNSPECIFIED; sensor_info->previous_state = SAHPI_ES_UNSPECIFIED; /* Raise the server power on hotswap event */ event->rdrs = NULL; event->event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_INSERTION_PENDING; /* The cause of the state change is unknown */ event->event.EventDataUnion.HotSwapEvent. CauseOfStateChange = SAHPI_HS_CAUSE_UNKNOWN; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(event)); event->rdrs = NULL; event->event.EventDataUnion.HotSwapEvent. PreviousHotSwapState = SAHPI_HS_STATE_INSERTION_PENDING; event->event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_ACTIVE; /* INSERTION_PENDING to ACTIVE state change happens due * to Auto policy of server blade */ event->event.EventDataUnion.HotSwapEvent. CauseOfStateChange = SAHPI_HS_CAUSE_AUTO_POLICY; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(event)); break; default: err("wrong state detected"); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } /** * process_server_power_event * @oh_handler: Pointer to openhpi handler structure * @con: Pointer to SOAP_CON structure * @oa_event: Pointer to OA event structure * * Purpose: * Creates the server power hpi hotswap event * * Detailed Description: NA * * Return values: * SA_OK - success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters. * SA_ERR_HPI_INTERNAL_ERROR - on failure **/ SaErrorT process_server_power_event(struct oh_handler_state *oh_handler, SOAP_CON *con, struct eventInfo *oa_event) { SaErrorT rv = SA_OK; SaHpiRptEntryT *rpt = NULL; struct oa_soap_handler *oa_handler = NULL; SaHpiInt32T bay_number, loc=1; struct oh_event event; SaHpiResourceIdT resource_id; if (oh_handler == NULL || con == NULL || oa_event == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } update_hotswap_event(oh_handler, &event); bay_number = oa_event->eventData.bladeStatus.bayNumber; oa_handler = (struct oa_soap_handler *) oh_handler->data; resource_id = oa_handler->oa_soap_resources.server.resource_id[bay_number - 1]; /* Get the rpt entry of the resource */ rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (rpt == NULL) { /* rpt does not exist When EVENT_BLADE_POWER_STATE comes before EVENT_BLADE_INSERT_COMPLETED event. But some times (<5%) OA sends these two events out of order. EVENT_BLADE_INSERT_COMPLETED creates the rpt entry. EVENT_BLADE_POWER_STATE with POWER_ON comes only if the "Automatically power on server" is set to yes for that blade in the iLO, otherwise it does not. This workaround fixes the problem by doing opposite of what OA is doing, when it sends the events out of order. a. When the EVENT_BLADE_POWER_STATE comes when the RPT is empty for that blade, then assume that we missed the EVENT_BLADE_INSERT_COMPLETED event and execute that code. b. Avoid calling EVENT_BLADE_POWER_STATE code by knowing where it is called from and whether the POWER_ON state is set or not. POWER_ON is set in EVENT_BLADE_INSERT_COMPLETED event, if it arrives later. c. When the EVENT_BLADE_INSERT_COMPLETED eventually comes with the POWER_ON state call the EVENT_BLADE_POWER_STATE code to set the active state. d. When OA fixes their code, this workaround code will not get executed at all. */ dbg("resource RPT is NULL, starting Workaround"); rv = process_server_insert_completed(oh_handler, con, oa_event, loc); return rv; } /* For blades that do not support managed hotswap, ignore power event */ if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP)) { dbg("Ignoring the power event for blade %d", bay_number); return SA_OK; } memcpy(&(event.resource), rpt, sizeof(SaHpiRptEntryT)); event.event.Source = event.resource.ResourceId; switch (oa_event->eventData.bladeStatus.powered) { case (POWER_OFF): rv = process_server_power_off_event(oh_handler, &event); /* Walk through the rdr list of the resource and * disables thermal sensors associated with server, as it * cannot perform the sensor monitoring * For disabling the thermal sensor, * Response structure pointer is passed as NULL, since * it not utilized for disable operation. */ rv = oa_soap_set_thermal_sensor (oh_handler, rpt, NULL, SAHPI_FALSE); if (rv != SA_OK) { err("Failure in disabling thermal sensors"); oa_soap_bay_pwr_status[bay_number -1] = SAHPI_POWER_OFF; return rv; } oa_soap_bay_pwr_status[bay_number -1] = SAHPI_POWER_OFF; break; case (POWER_ON): oa_soap_bay_pwr_status[bay_number -1] = SAHPI_POWER_ON; rv = process_server_power_on_event(oh_handler, con, &event, bay_number); break; /* Currently, OA is not sending the REBOOT event*/ case (POWER_REBOOT): event.event.EventDataUnion.HotSwapEvent. PreviousHotSwapState = SAHPI_HS_STATE_INSERTION_PENDING; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_ACTIVE; /* INSERTION_PENDING to ACTIVE state change happens due * to Auto policy of server blade */ event.event.EventDataUnion.HotSwapEvent. CauseOfStateChange = SAHPI_HS_CAUSE_AUTO_POLICY; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); break; default: err("Wrong power state"); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } /** * oa_soap_proc_server_inserted_event * @oh_handler: Pointer to openhpi handler structure * @con: Pointer to SOAP_CON structure * @oa_event: Pointer to the OA event structure * * Initializes the timer when EVENT_BLADE_INSERTED is received * This event doesnot contain valid information * Blade is added when EVENT_BLADE_INSERT_COMPLETED event arrives. * **/ SaErrorT oa_soap_proc_server_inserted_event(struct oh_handler_state *oh_handler, SOAP_CON *con, struct eventInfo *oa_event) { SaHpiInt32T bay_number = 0; struct oa_soap_handler *oa_handler = NULL; time_t now = 0; if (oh_handler == NULL || con == NULL || oa_event == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; time(&now); bay_number = oa_event->eventData.bladeStatus.bayNumber; oa_handler->server_insert_timer[bay_number - 1] = now; return SA_OK; } /** * process_server_insert_completed * @oh_handler: Pointer to openhpi handler structure * @con: Pointer to SOAP_CON structure * @oa_event: Pointer to the OA event structure * @loc: Location, 0 default, 1 Workaround * * Purpose: * Creates the server insertion hpi hotswap event * * Detailed Description: * - The inserted server blade will not have all the * information with the insertion event. * Build the bare minimum inventory RDR * - Raise the NOT_PRESENT to INSERTION_PENDING hotswap event * * Return values: * SA_OK - success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters. * SA_ERR_HPI_INTERNAL_ERROR - on failure **/ SaErrorT process_server_insert_completed(struct oh_handler_state *oh_handler, SOAP_CON *con, struct eventInfo *oa_event, SaHpiInt32T loc) { SaErrorT rv = SA_OK; struct getBladeInfo info; struct bladeInfo response; struct oa_soap_handler *oa_handler = NULL; SaHpiInt32T bay_number; struct oh_event event; SaHpiRptEntryT rpt; GSList *asserted_sensors = NULL; char blade_name[MAX_NAME_LEN]; if (oh_handler == NULL || con == NULL || oa_event == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; update_hotswap_event(oh_handler, &event); bay_number = oa_event->eventData.bladeStatus.bayNumber; if ((oa_event->eventData.bladeStatus.powered == POWER_ON) && (loc == 0)) { /* Usually power ON event comes after insertion complete, but 5% of the time it comes first. So out of order events are processed out of order. The power_on event code calls this function with loc=1 to avoid recursion */ rv = process_server_power_event(oh_handler, con, oa_event); return rv; } info.bayNumber = bay_number; rv = soap_getBladeInfo(con, &info, &response); if (rv != SOAP_OK) { err("Get blade info failed"); return SA_ERR_HPI_INTERNAL_ERROR; } if (strcmp(response.name,"[Unknown]") == 0 ) { err("Server type at bay %d is unknown. Please check",bay_number); return rv; } /* Copy the blade name from response for future processing */ convert_lower_to_upper(response.name, strlen(response.name), blade_name, MAX_NAME_LEN); /* Build the server RPT entry */ rv = build_inserted_server_rpt(oh_handler, &response, &rpt); if (rv != SA_OK) { err("build inserted server rpt failed"); return rv; } time_t now = 0; time(&now); int delay = now - oa_handler->server_insert_timer[bay_number - 1]; if (delay) dbg("Took %d secs to add blade at bay %d\n",delay, bay_number); oa_handler->server_insert_timer[bay_number - 1] = 0; /* Update resource_status structure with resource_id, serial_number, * and presence status */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.server, bay_number, response.serialNumber, rpt.ResourceId, RES_PRESENT); /* Build the server RDR */ rv = build_inserted_server_rdr(oh_handler, con, bay_number, rpt.ResourceId, blade_name, TRUE); if (rv != SA_OK) { err("build inserted server RDR failed"); /* Free the inventory info from inventory RDR */ rv = free_inventory_info(oh_handler, rpt.ResourceId); if (rv != SA_OK) { err("Inventory cleanup failed for resource id %d", rpt.ResourceId); } oh_remove_resource(oh_handler->rptcache, rpt.ResourceId); /* reset resource_status structure to default values */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.server, bay_number, "", SAHPI_UNSPECIFIED_RESOURCE_ID, RES_ABSENT); return rv; } rv = oa_soap_populate_event(oh_handler, rpt.ResourceId, &event, &asserted_sensors); if (rv != SA_OK) { err("Populating event struct failed"); return SA_ERR_HPI_INTERNAL_ERROR; } event.event.EventType = SAHPI_ET_HOTSWAP; event.event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_NOT_PRESENT; /* For blades that do not support managed hotswap, current hotswap state * is ACTIVE */ if (!(rpt.ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP)) { event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_ACTIVE; } else { event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_INSERTION_PENDING; } /* NOT_PRESENT to INSERTION_PENDING/ACTIVE state change happened due * to operator action of blade insertion */ event.event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_OPERATOR_INIT; /* Raise the hotswap event for the inserted server blade */ oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); /* Raise the assert sensor events */ if (asserted_sensors) oa_soap_assert_sen_evt(oh_handler, &rpt, asserted_sensors); return SA_OK; } /** * process_server_info_event * @oh_handler: Pointer to openhpi handler structure * @con: Pointer to the SOAP_CON structure * @oa_event: Pointer to OA event structure * * Purpose: * Check if the serial number is there, if so insert. * This is bad as the query does not get the complete details * We need to make OA do the right stuff. * This is created only as an additional mechanism to get the * part/serial number of the already inserted blade server. * So not much error handling * * Detailed Description: NA * * Return values: * SA_OK - success. * SA_ERR_HPI_INVALID_PARAMS - Invalid parameters * SA_ERR_HPI_OUT_OF_MEMORY - Out of memory **/ SaErrorT process_server_info_event(struct oh_handler_state *oh_handler, SOAP_CON *con, struct eventInfo *oa_event) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler = NULL; SaHpiInt32T bay_number, len; char *serial_number = NULL; char *name = NULL; char *Name = NULL; SaHpiResourceIdT resource_id; char blade_name[MAX_NAME_LEN]; SaHpiRptEntryT *rpt = NULL; struct oh_event event; SaHpiRdrT *rdr = NULL; if (oh_handler == NULL || oa_event == NULL) { err("Invalid oh_handler and/or oa_event parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; bay_number = oa_event->eventData.bladeInfo.bayNumber; /* Null ponter check for serialNumber and partNumber * if any one of them is Null, return immediately. */ if(oa_event->eventData.bladeInfo.serialNumber == 0 || oa_event->eventData.bladeInfo.partNumber == 0) { return rv; } if (strcmp(oa_event->eventData.bladeInfo.serialNumber,"[Unknown]") == 0 ) { return rv; } if(strcmp(oa_event->eventData.bladeInfo.partNumber,"[Unknown]") == 0) { return rv; } name = oa_event->eventData.bladeInfo.name; resource_id = oa_handler-> oa_soap_resources.server.resource_id[bay_number - 1]; if (strcmp(name,"[Unknown]") == 0 ) { err("Server Blade name is Unknown...bay_number = %d\n", bay_number); return rv; } len = strlen(oa_event->eventData.bladeInfo.serialNumber); serial_number = (char *)g_malloc0(sizeof(char) * len + 1); if(serial_number == NULL){ return SA_ERR_HPI_OUT_OF_MEMORY; } strcpy(serial_number, oa_event->eventData.bladeInfo.serialNumber); serial_number[len]='\0'; /* Update resource_status structure with resource_id, * serial_number, and presence status */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.server, bay_number, serial_number, resource_id, RES_PRESENT); /* Get the rpt entry of the resource */ rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (rpt == NULL) { if (oa_handler->server_insert_timer[bay_number-1]){ wrap_g_free(serial_number); return SA_OK; } err("server RPT NULL at bay %d",bay_number); wrap_g_free(serial_number); return SA_ERR_HPI_INTERNAL_ERROR; } /* Convert Blade name lower to upper */ convert_lower_to_upper(name, strlen(name), blade_name, MAX_NAME_LEN); /* The RDR already exist, but the relevant data is available only now * So just go ahead and correct it. When building the RDR the code does * take care of already existing RDR. */ rv = build_inserted_server_rdr(oh_handler, con, bay_number, resource_id, blade_name, FALSE); if (rv != SA_OK) { err("Failed to add Server rdr"); wrap_g_free(serial_number); return rv; } Name = (char *)rpt->ResourceTag.Data; if (strcmp(Name, "[Unknown]") == 0) { oa_soap_trim_whitespace(name); rpt->ResourceTag.DataLength = strlen(name); memset(rpt->ResourceTag.Data, 0, SAHPI_MAX_TEXT_BUFFER_LENGTH); snprintf((char *) (rpt->ResourceTag.Data), rpt->ResourceTag.DataLength + 1, "%s", name); /* Add the server rpt to the plugin RPTable */ rv = oh_add_resource(oh_handler->rptcache, rpt, NULL, 0); if (rv != SA_OK) { err("Failed to add Server rpt"); wrap_g_free(serial_number); return rv; } /* Get the inventory RDR */ rdr = oh_get_rdr_by_type(oh_handler->rptcache, resource_id, SAHPI_INVENTORY_RDR, SAHPI_DEFAULT_INVENTORY_ID); if (rdr == NULL) { err("Inventory RDR is not found"); wrap_g_free(serial_number); return SA_ERR_HPI_NOT_PRESENT; } memset(&event, 0, sizeof(struct oh_event)); event.event.EventType = SAHPI_ET_RESOURCE; memcpy(&event.resource, rpt, sizeof(SaHpiRptEntryT)); event.event.Severity = SAHPI_INFORMATIONAL; event.event.Source = event.resource.ResourceId; if (oh_gettimeofday(&(event.event.Timestamp)) != SA_OK) { event.event.Timestamp = SAHPI_TIME_UNSPECIFIED; } event.event.EventDataUnion.ResourceEvent. ResourceEventType = SAHPI_RESE_RESOURCE_UPDATED; event.rdrs = g_slist_append(event.rdrs, g_memdup(rdr, sizeof(SaHpiRdrT))); event.hid = oh_handler->hid; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); } wrap_g_free(serial_number); return SA_OK; } /** * process_server_extraction_event * @oh_handler: Pointer to openhpi handler structure * @oa_event: Pointer to the OA event structure * * Purpose: * Creates the server extraction hpi hotswap event * * Detailed Description: NA * * Return values: * SA_OK - success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters. * SA_ERR_HPI_INTERNAL_ERROR - on failure **/ SaErrorT process_server_extraction_event(struct oh_handler_state *oh_handler, struct eventInfo *oa_event) { SaErrorT rv = SA_OK; if (oh_handler == NULL || oa_event == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } rv = remove_server_blade(oh_handler, oa_event->eventData.bladeStatus.bayNumber); if (rv != SA_OK) { err("Removing server blade failed"); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } /** * build_inserted_server_rpt * @oh_handler: Pointer to openhpi handler * @response: Pointer to the bladeInfo structure * @rpt: Pointer to the rpt entry * * Purpose: * Populate the server blade RPT with aid of build_server_rpt() and add * hotswap state information to the returned rpt. * Pushes the RPT entry to infrastructure. * * Detailed Description: NA * * Return values: * SA_OK - on success * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_OUT_OF_MEMORY - on malloc failure * SA_ERR_HPI_INTERNAL_ERROR - on failure **/ SaErrorT build_inserted_server_rpt(struct oh_handler_state *oh_handler, struct bladeInfo *response, SaHpiRptEntryT *rpt) { SaErrorT rv = SA_OK; struct oa_soap_hotswap_state *hotswap_state = NULL; if (oh_handler == NULL || response == NULL || rpt == NULL) { err("invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } if (build_server_rpt(oh_handler, response, rpt) != SA_OK) { err("Building Server RPT failed for an inserted blade"); return SA_ERR_HPI_INTERNAL_ERROR; } if (rpt->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP) { hotswap_state = (struct oa_soap_hotswap_state *) g_malloc0(sizeof(struct oa_soap_hotswap_state)); if (hotswap_state == NULL) { err("Out of memory"); return SA_ERR_HPI_OUT_OF_MEMORY; } /* Inserted server needs some time to stabilize. Put the * server hotswap state to INSERTION_PENDING. Once the * server stabilizes, put the hotswap state to ACTIVE * (handled in power on event). */ hotswap_state->currentHsState = SAHPI_HS_STATE_INSERTION_PENDING; } rv = oh_add_resource(oh_handler->rptcache, rpt, hotswap_state, 0); if (rv != SA_OK) { err("Failed to add Server rpt"); wrap_g_free(hotswap_state); return rv; } return SA_OK; } /** * oa_soap_parse_memory_sensor_reading * @memoryErrors : Pointer to mainMemoryErros sensor reading * * Purpose: * Parses main memory sensor reading * * Detailed Description: NA * * Return values: * Pointer - on success. * NULL - on error. **/ SaHpiUint8T *oa_soap_parse_memory_sensor_reading(char *memoryErrors) { char *subStr = NULL, *sensor_reading = NULL; int len = 0; if (memoryErrors == NULL) { err("Invalid parameters"); return NULL; } sensor_reading = (char *)g_malloc0 (sizeof(char) * SAHPI_SENSOR_BUFFER_LENGTH); memset(sensor_reading, 0, SAHPI_SENSOR_BUFFER_LENGTH); subStr = strstr(memoryErrors, ";"); if (subStr) len = strlen(memoryErrors) - strlen(subStr); else len = strlen(memoryErrors); if (len >= SAHPI_SENSOR_BUFFER_LENGTH) len = SAHPI_SENSOR_BUFFER_LENGTH - 1; strncpy(sensor_reading, memoryErrors, len); sensor_reading[len] = '\0'; return (SaHpiUint8T *)sensor_reading; } /** * oa_soap_proc_server_status * @oh_handler : Pointer to openhpi handler structure * @con : Pointer to soap con * @status : Pointer to blade status structure * * Purpose: * Processes the server status event * * Detailed Description: NA * * Return values: * NONE **/ void oa_soap_proc_server_status(struct oh_handler_state *oh_handler, SOAP_CON *con, struct bladeStatus *status) { SaErrorT rv = SA_OK; SaHpiRptEntryT *rpt = NULL; struct oa_soap_handler *oa_handler = NULL; SaHpiResourceIdT resource_id; SaHpiInt32T bay = 0; enum diagnosticStatus diag_ex_status[OA_SOAP_MAX_DIAG_EX]; struct getBladeThermalInfoArray thermal_request; struct bladeThermalInfoArrayResponse thermal_response; xmlNode *extra_data = NULL; struct extraDataInfo extra_data_info; char *mainMemoryError = NULL; SaHpiInt32T sensor_status, memErrFlag[16] = {0}; SaHpiInt32T sensor_class, sensor_value, sensor_num; if (oh_handler == NULL || con == NULL || status == NULL) { err("Invalid parameters"); return; } oa_handler = (struct oa_soap_handler *) oh_handler->data; bay = status->bayNumber; resource_id = oa_handler->oa_soap_resources.server. resource_id[bay - 1]; /* Get the rpt entry of the resource */ rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (rpt == NULL) { /* RPT is null. It may yet to be added. If the timer is on event comes early. Just return */ if ((oa_handler->server_insert_timer[bay - 1]) || (status->powered == POWER_UNKNOWN)) { return; } err("RPT of Server bay at %d is NULL",bay); return; } extra_data = status->extraData; while (extra_data) { soap_getExtraData(extra_data, &extra_data_info); if (!(strcmp(extra_data_info.name, "mainMemoryErrors"))) { err("openhpid[%d]: Blade (id=%d) at %d has Memory Error: %s", getpid(), resource_id, bay, extra_data_info.value); memErrFlag[bay] = 1; oa_handler->memErrRecFlag[bay] = 1; break; } extra_data = soap_next_node(extra_data); } if(oa_handler->memErrRecFlag[bay]) { /* This MEMORY event is created just to let the user know whether all memory modules are fine, if not, which memory module is generating an error */ if (memErrFlag[bay]) { mainMemoryError = (char *) oa_soap_parse_memory_sensor_reading(extra_data_info.value); rv = oa_soap_proc_mem_evt(oh_handler, resource_id, OA_SOAP_SEN_MAIN_MEMORY_ERRORS, mainMemoryError, SAHPI_CRITICAL); if (rv != SA_OK) { err("processing the memory event for sensor %x has" " failed", OA_SOAP_SEN_MAIN_MEMORY_ERRORS); wrap_g_free(mainMemoryError); return; } wrap_g_free(mainMemoryError); memErrFlag[bay] = 0; } else { /* Get the sensor value */ sensor_num = OA_SOAP_SEN_PRED_FAIL; sensor_class = oa_soap_sen_arr[sensor_num].sensor_class; sensor_value = status->operationalStatus; /* Check whether the sensor value is supported or not */ if (oa_soap_sen_val_map_arr[sensor_class][sensor_value] == -1) { err("Not supported sensor value %d detected.", sensor_value); return; } /* Get the assert state of the predictive failure sensor */ sensor_status = oa_soap_sen_assert_map_arr[sensor_class][sensor_value]; /* Check whether predictive failure gets de-asserted */ if (sensor_status == OA_SOAP_SEN_ASSERT_FALSE) { /* Now predictive failure is de-asserted and there are no memory module errors, so send an event with "All Memory Modules are Ok" */ mainMemoryError = "All Memory Modules are Ok"; rv = oa_soap_proc_mem_evt(oh_handler, resource_id, OA_SOAP_SEN_MAIN_MEMORY_ERRORS, mainMemoryError, SAHPI_OK); if (rv != SA_OK) { err("processing the memory event for " "sensor %x has failed", OA_SOAP_SEN_MAIN_MEMORY_ERRORS); return; } oa_handler->memErrRecFlag[bay] = 0; } } } /* Process operational status sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_OPER_STATUS, status->operationalStatus, 0, 0) /* Process predictive failure sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_PRED_FAIL, status->operationalStatus, 0, 0) /* Process internal data error sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_INT_DATA_ERR, status->diagnosticChecks.internalDataError, 0, 0) /* Process management processor error sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_MP_ERR, status->diagnosticChecks. managementProcessorError, 0, 0) /* Process thermal waring sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_THERM_WARN, status->diagnosticChecks.thermalWarning, 0, 0) /* Process thermal danger sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_THERM_DANGER, status->diagnosticChecks.thermalDanger, 0, 0) /* Process IO configuration error sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_IO_CONFIG_ERR, status->diagnosticChecks. ioConfigurationError, 0, 0) /* Process device power request error sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_PWR_REQ, status->diagnosticChecks. devicePowerRequestError, 0, 0) /* Process insufficient coolling sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_INSUF_COOL, status->diagnosticChecks. insufficientCooling, 0, 0) /* Process device location error sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_LOC_ERR, status->diagnosticChecks. deviceLocationError, 0, 0) /* Process device failure error sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_FAIL, status->diagnosticChecks.deviceFailure, 0, 0) /* Process device degraded error sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_DEGRAD, status->diagnosticChecks.deviceDegraded, 0, 0) oa_soap_parse_diag_ex(status->diagnosticChecksEx, diag_ex_status); /* Process device missing sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_MISS, diag_ex_status[DIAG_EX_DEV_MISS], 0, 0) /* Process device bonding sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_BOND, diag_ex_status[DIAG_EX_DEV_BOND], 0, 0) /* Process device power sequence sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_PWR_SEQ, diag_ex_status[DIAG_EX_DEV_PWR_SEQ], 0, 0) /* Process network configuration sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_NET_CONFIG, diag_ex_status[DIAG_EX_NET_CONFIG], 0, 0) /* Process profile unassigned error sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_PROF_UNASSIGN_ERR, diag_ex_status[DIAG_EX_PROF_UNASSIGN_ERR], 0, 0) /* Process Device not supported sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_NOT_SUPPORT, diag_ex_status[DIAG_EX_DEV_NOT_SUPPORT], 0, 0) /* Process Too low power request sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_TOO_LOW_PWR_REQ, diag_ex_status[DIAG_EX_TOO_LOW_PWR_REQ], 0, 0) /* Process Call HP sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_CALL_HP, diag_ex_status[DIAG_EX_CALL_HP], 0, 0) /* Process Storage device missing sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_STORAGE_DEV_MISS, diag_ex_status[DIAG_EX_STORAGE_DEV_MISS], 0, 0) /* Process Power capping error sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_GRPCAP_ERR, diag_ex_status[DIAG_EX_GRPCAP_ERR], 0, 0) /* Process IML recorded errors sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_IML_ERR, diag_ex_status[DIAG_EX_IML_ERR], 0, 0) /* Process Duplicate management IP address sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DUP_MGMT_IP_ADDR, diag_ex_status[DIAG_EX_DUP_MGMT_IP_ADDR], 0, 0) /* Partner blades such as IO BLADE or STORAGE BLADE raises a * blade status event when it recovers from degraded state. * The received event is checked for the power status of the blade. * If the power status is "POWER_ON", * then the sensors associated with blade is enabled based on * getBladeThermalInfoArray thermal response from the blade. */ if ((rpt->ResourceEntity.Entry[0].EntityType == SAHPI_ENT_IO_BLADE) || (rpt->ResourceEntity.Entry[0].EntityType == SAHPI_ENT_DISK_BLADE)) { /* Sometimes the DISK_BLADE does the power toggle upon the * reset of adjacent SYSTEM_BLADE. In effect to this, blade * status event is raised. Ignore the event, as the partner * blade is expected to get back to POWER ON state immediately */ if (oa_soap_bay_pwr_status[rpt->ResourceEntity.Entry[0]. EntityLocation -1] == SAHPI_POWER_ON) { dbg("Ignore the blade status event from the partner" " blade %d which is in POWER ON state", bay); return; } if (status->powered == POWER_ON) { dbg("The blade has deasserted degraded state," " enable thermal sensors"); /* Make getBladeThermalInfoArray soap call */ thermal_request.bayNumber = bay; rv = soap_getBladeThermalInfoArray(con, &thermal_request, &thermal_response); /* In addition to verifying return value from the soap * call, check whether the thermal response is NULL, * partner blade resource might have transitioned to * degraded state */ if ((rv != SA_OK) || (thermal_response.bladeThermalInfoArray == NULL)) { err("getBladeThermalInfo failed for blade or" "the blade %d is not in stable state",bay); return; } /* Walk through the rdr list of the resource and enable * only those sensor which have the "SensorPresent" * value as "true" in getBladeThermalInfoArray response. * Rest of the statically modeled sensors remain in * disabled state. */ rv = oa_soap_set_thermal_sensor(oh_handler, rpt, &thermal_response, SAHPI_TRUE); if (rv != SA_OK) { err("Failed to enable the thermal sensor"); return;; } /* Set the power status of the partner blade as * POWER ON since the partner blade has recovered from * degraded state. After this event, the partner blade * power status should never change in * oa_soap_bay_pwr_status array */ oa_soap_bay_pwr_status[rpt->ResourceEntity.Entry[0]. EntityLocation -1] = SAHPI_POWER_ON; } else if (status->powered == POWER_OFF) { dbg("thermal sensors of blade already in disable state," " no action required"); } } return; } /** * oa_soap_serv_post_comp * @oh_handler : Pointer to openhpi handler structure * @con : Pointer to soap con structure * @bay_number : Bay number of the resource * * Purpose: * Processes the blade post complete event * * Detailed Description: NA * * Return values: * NONE **/ void oa_soap_serv_post_comp(struct oh_handler_state *oh_handler, SOAP_CON *con, SaHpiInt32T bay_number) { SaErrorT rv = SA_OK; SaHpiRptEntryT *rpt = NULL; struct getBladeThermalInfoArray thermal_request; struct bladeThermalInfoArrayResponse thermal_response; struct oa_soap_handler *oa_handler = NULL; SaHpiResourceIdT resource_id = -1; if (oh_handler == NULL) { err("Invalid parameters"); return; } oa_handler = (struct oa_soap_handler *) oh_handler->data; resource_id = oa_handler->oa_soap_resources.server.resource_id[bay_number -1]; rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (rpt == NULL) { err("resource RPT is NULL"); return; } /* Make getBladeThermalInfoArray soap call */ thermal_request.bayNumber = bay_number; /* The sleep below is introduced to make sure * we have sufficient time for the sensor to * be available so that we do not miss any * temperatuer sensor. */ oa_soap_sleep_in_loop(oa_handler, 20); rv = soap_getBladeThermalInfoArray(con, &thermal_request, &thermal_response); /* In addition to verifying return value from the soap call, * Check whether the thermal response is NULL, * blade resource might have transitioned to POWER-OFF state * during the processing of this event hence resulting in * a NULL response */ if ((rv != SA_OK) || (thermal_response.bladeThermalInfoArray == NULL)) { err("getBladeThermalInfo array failed for blade or" "the blade is not in stable state"); return; } /* Modify the thermal sensors IdString and send * event to the infrastructure */ rv = oa_soap_modify_blade_thermal_rdr(oh_handler, thermal_response, rpt); if (rv != SA_OK) { err("oa_soap_modify_blade_thermal_rdr for rpt %d failed %d", resource_id,rv); return; } /* Walk through the rdr list of the resource and enable only those * sensor which have the "SensorPresent" value as "true" in * getBladeThermalInfoArray response. Rest of the statically modeled * sensors remain in disabled state. */ rv = oa_soap_set_thermal_sensor(oh_handler, rpt, &thermal_response, SAHPI_TRUE); if (rv != SA_OK) { err("Failed to enable the thermal sensor"); return; } return; } /** * oa_soap_set_thermal_sensor * @oh_handler : Pointer to openhpi handler structure * @rpt : Pointer to rpt structure * @thermal_response: Pointer to bladeThermalInfoArray response structure * @enable_flag : Sensor Enable Flag * * Purpose: * Enables or Disables the thermal sensors associated with server blade * * Detailed Description: * - For Disable request of thermal sensor, the function walks through * the rdr list of the blade resource and disables only the thermal * sensors * - Also disable the user control to enable the thermal sensor. * - For Enable request of thermal sensors, following steps are done: * 1. Make soap getBladeThermalInfoArray soap call to the * blade resource. * 2. Walk through the rdr list of the resource and enable * only those thermal sensor which have the "SensorPresent" value * as "true" in getBladeThermalInfoArray response. * * Return values: * SA_OK - success. * SA_ERR_HPI_INTERNAL_ERROR - on failure **/ SaErrorT oa_soap_set_thermal_sensor(struct oh_handler_state *oh_handler, SaHpiRptEntryT *rpt, struct bladeThermalInfoArrayResponse *thermal_response, SaHpiBoolT enable_flag) { SaErrorT rv = SA_OK; SaHpiRdrT *rdr = NULL; struct bladeThermalInfo bld_thrm_info; struct extraDataInfo extra_data; if (oh_handler == NULL || rpt == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } rdr = oh_get_rdr_next(oh_handler->rptcache, rpt->ResourceId, SAHPI_FIRST_ENTRY); while (rdr) { if (rdr->RdrType == SAHPI_SENSOR_RDR) { if ((rdr->RdrTypeUnion.SensorRec.Num == OA_SOAP_SEN_TEMP_STATUS) || ((rdr->RdrTypeUnion.SensorRec.Num >= OA_SOAP_BLD_THRM_SEN_START) && (rdr->RdrTypeUnion.SensorRec.Num <= OA_SOAP_BLD_THRM_SEN_END))) { if (enable_flag == SAHPI_TRUE) { /* Verify with of the thermal * response to enable the sensor */ if (thermal_response == NULL) { err ("Valid thermal response" " required for processing" " sensor enable operation"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Fetch the mapping bladeThermalInfo * structure instance from response for * for thermal sensor number to * whether the sensor can be enabled */ rv = oa_soap_get_bld_thrm_sen_data( rdr->RdrTypeUnion.SensorRec.Num, *thermal_response, &bld_thrm_info); if (rv != SA_OK) { err("Could not find the" " matching sensor"); return SA_ERR_HPI_INTERNAL_ERROR; } soap_getExtraData(bld_thrm_info. extraData, &extra_data); if ((extra_data.value != NULL) && (!(strcasecmp(extra_data.value, "false")))) { dbg("sensor can not be enabled"); rdr = oh_get_rdr_next( oh_handler->rptcache, rpt->ResourceId, rdr->RecordId); continue; } } rv = oa_soap_set_sensor_enable(oh_handler, rpt->ResourceId, rdr->RdrTypeUnion.SensorRec.Num, enable_flag); if (rv != SA_OK) { err("Sensor set failed"); return rv; } } } rdr = oh_get_rdr_next(oh_handler->rptcache, rpt->ResourceId, rdr->RecordId); } return SA_OK; } /** * process_server_thermal_event * @oh_handler : Pointer to openhpi handler structure * @con : Pointer to the SOAP_CON structure * @status : Pointer to blade status structure * * Purpose: * Processes and creates server / blade sensor thermal events * * Detailed Description: NA * * Return values: * NONE **/ void oa_soap_proc_server_thermal(struct oh_handler_state *oh_handler, SOAP_CON *con, struct bladeStatus *status) { SaErrorT rv = SA_OK; SaHpiResourceIdT resource_id; struct oa_soap_handler *oa_handler = NULL; SaHpiFloat64T trigger_reading; SaHpiFloat64T trigger_threshold; struct getBladeThermalInfoArray thermal_request; struct bladeThermalInfoArrayResponse thermal_response; struct bladeThermalInfo *blade_thermal_response = NULL; struct oa_soap_sensor_info *sensor_info = NULL; SaHpiRdrT *rdr = NULL; if (oh_handler == NULL || con== NULL || status == NULL) { err("Invalid parameters"); return; } oa_handler = (struct oa_soap_handler *) oh_handler->data; resource_id = oa_handler->oa_soap_resources.server. resource_id[status->bayNumber - 1]; rdr = oh_get_rdr_by_type(oh_handler->rptcache, resource_id, SAHPI_SENSOR_RDR, OA_SOAP_SEN_TEMP_STATUS); if (rdr) sensor_info = (struct oa_soap_sensor_info *) oh_get_rdr_data(oh_handler->rptcache, resource_id, rdr->RecordId); /* Based on the sensor status, * determine the threshold which triggered the thermal event from * Enclosure. * Event with SENSOR_STATUS_CAUTION or SENSOR_STATUS_OK is * generated only if CAUTION threshold is crossed. * Event with SENSOR_STATUS_CRITICAL is generated only when CRITICAL * threshold is crossed. * Sensor current reading and trigger threshold are required for event * generation. Sensor current reading is not provided by the event, * hence make soap call to get the reading */ thermal_request.bayNumber = status->bayNumber; rv = soap_getBladeThermalInfoArray(con, &thermal_request, &thermal_response); /* In addition to verifying return value from the soap call, * Check whether the thermal response is NULL, * blade resource might have transitioned to POWER-OFF state * during the processing of this event hence resulting in * a NULL response */ if ((rv != SA_OK) || (thermal_response.bladeThermalInfoArray == NULL)) { err("getBladeThermalInfo array failed for blade or" "the blade is not in stable state"); return; } blade_thermal_response = (struct bladeThermalInfo *)&thermal_response; trigger_reading = (SaHpiInt32T)blade_thermal_response->temperatureC; if ((status->thermal == SENSOR_STATUS_CAUTION && sensor_info->current_state != SAHPI_ES_UPPER_MAJOR) || (status->thermal == SENSOR_STATUS_OK && sensor_info->current_state != SAHPI_ES_UNSPECIFIED)) { /* Trigger for this event is caution threshold */ trigger_threshold = blade_thermal_response->cautionThreshold; } else if (status->thermal == SENSOR_STATUS_CRITICAL && sensor_info->current_state != SAHPI_ES_UPPER_CRIT) { /* Trigger for this event is critical threshold */ trigger_threshold = blade_thermal_response->criticalThreshold; } else { dbg("Ignore the event. There is no change in the sensor state"); return; } /* Process the thermal event from Server / Blade and generate * appropriate HPI event */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_TEMP_STATUS, status->thermal, trigger_reading,trigger_threshold) return; } /** * process_server_mp_info_event * @oh_handler: Pointer to openhpi handler structure * @con: Pointer to the SOAP_CON structure * @oa_event: Pointer to OA event structure * * Purpose: * Process the blade mp info event * * Detailed Description: NA * * Return values: * SA_OK - success. * SA_ERR_HPI_INVALID_PARAMS - Invalid parameters * SA_ERR_HPI_NOT_PRESENT - RDR is not present **/ SaErrorT process_server_mp_info_event(struct oh_handler_state *oh_handler, SOAP_CON *con, struct eventInfo *oa_event) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler = NULL; SaHpiInt32T bay_number; SaHpiResourceIdT resource_id; SaHpiRptEntryT *rpt = NULL; struct oh_event event; SaHpiRdrT *rdr = NULL; SaHpiIdrIdT IdrId = 0; SaHpiIdrFieldT field; SaHpiFloat64T fm_version; SaHpiInt32T major; SaHpiInt32T minor; char *fwVersion = NULL; if (oh_handler == NULL || oa_event == NULL || con == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; bay_number = oa_event->eventData.bladeMpInfo.bayNumber; fwVersion = oa_event->eventData.bladeMpInfo.fwVersion; resource_id = oa_handler-> oa_soap_resources.server.resource_id[bay_number - 1]; rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (rpt == NULL) { if (oa_handler->server_insert_timer[bay_number - 1]) { return SA_OK; } err("Server RPT at bay %d is NULL",bay_number); return SA_ERR_HPI_NOT_PRESENT; } /* Get the inventory RDR */ rdr = oh_get_rdr_by_type(oh_handler->rptcache, resource_id, SAHPI_INVENTORY_RDR, SAHPI_DEFAULT_INVENTORY_ID); if (rdr == NULL) { err("Inventory RDR is not found"); return SA_ERR_HPI_NOT_PRESENT; } IdrId = rdr->RdrTypeUnion.InventoryRec.IdrId; if (strcmp(fwVersion,"[Unknown]") == 0 ) { WARN("fwVersion is Unknown for server at bay %d",bay_number); return rv; } fm_version = atof(fwVersion); major = (SaHpiUint8T)floor(fm_version); minor = rintf((fm_version - major) * 100); if(rpt->ResourceInfo.FirmwareMajorRev == major && rpt->ResourceInfo.FirmwareMinorRev == minor){ return rv; } if(major < rpt->ResourceInfo.FirmwareMajorRev || minor < rpt->ResourceInfo.FirmwareMinorRev){ err("Blade Firmware for Bay %d is going to be downgraded", bay_number); } if (fwVersion != NULL) { field.Type = SAHPI_IDR_FIELDTYPE_PRODUCT_VERSION; field.Field.DataType = SAHPI_TL_TYPE_TEXT; field.Field.Language = SAHPI_LANG_ENGLISH; oa_soap_trim_whitespace(fwVersion); field.Field.DataLength = strlen (fwVersion) + 1; field.AreaId = 1; field.FieldId = 3; snprintf((char *)field.Field.Data, field.Field.DataLength, "%s", fwVersion); rv = oa_soap_set_idr_field(oh_handler, resource_id, IdrId, &field); if (rv != SOAP_OK) { err("oa_soap_set_idr_field failed"); return rv; } //Event Handling memset(&event, 0, sizeof(struct oh_event)); event.event.EventType = SAHPI_ET_RESOURCE; memcpy(&event.resource, rpt, sizeof(SaHpiRptEntryT)); event.event.Severity = SAHPI_INFORMATIONAL; event.event.Source = event.resource.ResourceId; if (oh_gettimeofday(&(event.event.Timestamp)) != SA_OK) { event.event.Timestamp = SAHPI_TIME_UNSPECIFIED; } event.event.EventDataUnion.ResourceEvent. ResourceEventType = SAHPI_RESE_RESOURCE_UPDATED; event.rdrs = g_slist_append(event.rdrs, g_memdup(rdr, sizeof(SaHpiRdrT))); event.hid = oh_handler->hid; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); } return SA_OK; } openhpi-3.6.1/plugins/oa_soap/oa_soap.h0000644000175100017510000002152112575647270017067 0ustar mohanmohan/* * Copyright (C) 2007-2009, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. * Raghavendra M.S. * Raja Kumar Thatte * Vivek Kumar * Shuah Khan * Mohan Devarajulu */ #ifndef _OA_SOAP_H #define _OA_SOAP_H /* Include files */ #include #include #include #include #include "oa_soap_calls.h" /* The resource numbers in OA SOAP. The rpt and rdr arrays are indexed based on * the entity numbers defined below. * On supporting a new resource in OA SOAP plugin, please update the rpt and rdr * arrays in oa_soap_resources.c */ /* Enclosure */ #define OA_SOAP_ENT_ENC 0 /* Server Blade */ #define OA_SOAP_ENT_SERV 1 /* IO Blade */ #define OA_SOAP_ENT_IO 2 /* Storage Blade */ #define OA_SOAP_ENT_STORAGE 3 /* Switch Blade */ #define OA_SOAP_ENT_SWITCH 4 /* Onboard Administrator */ #define OA_SOAP_ENT_OA 5 /* Power Subsystem */ #define OA_SOAP_ENT_PS_SUBSYS 6 /* Power supply */ #define OA_SOAP_ENT_PS 7 /* Thermal subsystem */ #define OA_SOAP_ENT_THERM_SUBSYS 8 /* Fan Zone */ #define OA_SOAP_ENT_FZ 9 /* Fan */ #define OA_SOAP_ENT_FAN 10 /* LCD */ #define OA_SOAP_ENT_LCD 11 /* Fan for C3000 */ #define OA_SOAP_ENT_FAN_C3000 12 /* The different enclosure types supported by OA SOAP * * If a new enclosure is added, please update the OA_SOAP_MAX_FAN. Add * entries for the new enclosure in oa_soap_fz_map_arr in * oa_soap_resources.c file. */ #define OA_SOAP_ENC_C7000 0 #define OA_SOAP_ENC_C3000 1 /* Maximum Fan Zones present in different HP BladeSystem c-Class enclosures */ #define OA_SOAP_C7000_MAX_FZ 4 #define OA_SOAP_C3000_MAX_FZ 1 /* Maximum fans supported in an enclosure * * If the max fan is changed, please update entries to * oa_soap_fz_map_arr in oa_soap_resources.c file */ #define OA_SOAP_MAX_FAN 10 /* Definitions for the different RDR instrument ids */ /* TODO: Move below definitons to SaHpiOaSoap.h file */ #define OA_SOAP_RES_INV_NUM (SaHpiIdrIdT) 0x000 #define OA_SOAP_RES_CNTRL_NUM (SaHpiCtrlNumT) 0x001 /* SOAP XML calls timeout values for event thread and hpi calls */ #define HPI_CALL_TIMEOUT 40 #define EVENT_CALL_TIMEOUT 40 /* getAllEventEx needs to be issues within 300 seconds */ #define SUBSCRIBE_TIMEOUT 295 /* Error code for SOAP XML calls */ #define SOAP_OK 0 /* SSH port */ #define PORT ":443" /* Max URL and buffer size */ #define MAX_URL_LEN 255 #define MAX_BUF_SIZE 255 /* Max OA bays in HP BladeSystem c-Class */ #define MAX_OA_BAYS 2 /* OA Error numbers */ #define ERR_INVALID_PRIVILEGE_LEVEL 8 #define ERR_STANDBY_MODE 139 /* OA firmware versions */ #define OA_2_20 2.20 #define OA_2_21 2.21 /* OA switchover re-try wait period */ #define WAIT_ON_SWITCHOVER 10 /* OA switchover max re-try */ #define MAX_RETRY_ON_SWITCHOVER 10 /* Enum for storing the status of the plugin */ enum oa_soap_plugin_status { PRE_DISCOVERY = 0, PLUGIN_NOT_INITIALIZED = 1, DISCOVERY_FAIL = 2, DISCOVERY_COMPLETED = 3 }; /* Structure for storing the OA information */ struct oa_info { enum oaRole oa_status; SaHpiInt32T event_pid; GThread *thread_handler; GMutex *mutex; char server[MAX_URL_LEN]; SOAP_CON *hpi_con; SOAP_CON *event_con; SOAP_CON *event_con2; SaHpiFloat64T fm_version; struct oh_handler_state *oh_handler; }; typedef enum resource_presence_status { RES_ABSENT = 0, RES_PRESENT= 1 } resource_presence_status_t; /* Resource presence matrix per resource type */ typedef struct resource_status { SaHpiInt32T max_bays; enum resource_presence_status *presence; char **serial_number; SaHpiResourceIdT *resource_id; } resource_status_t; /* Resource presence matrix for all FRUs in HP BladeSystem c-Class */ struct oa_soap_resource_status { SaHpiResourceIdT enclosure_rid; SaHpiResourceIdT power_subsystem_rid; SaHpiResourceIdT thermal_subsystem_rid; SaHpiResourceIdT lcd_rid; struct resource_status oa; struct resource_status server; struct resource_status interconnect; struct resource_status fan_zone; struct resource_status fan; struct resource_status ps_unit; }; /* Structure for storing the OA SOAP plugin information */ struct oa_soap_handler { enum hpoa_boolean in_discovery_thread; enum hpoa_boolean ipswap; enum oa_soap_plugin_status status; struct oa_soap_resource_status oa_soap_resources; SOAP_CON *active_con; struct oa_info *oa_1; struct oa_info *oa_2; /* Type of the enclsoure */ SaHpiInt32T enc_type; SaHpiBoolT shutdown_event_thread; SaHpiInt32T oa_switching; GMutex *mutex; /* This is local state for holding data for the */ /* enclosure power management controls. */ double active_fm_ver; struct powerConfigInfo power_config_info; struct powerCapConfig power_cap_config; uint desired_static_pwr_limit; uint desired_dynamic_pwr_cap; uint desired_derated_circuit_cap; uint desired_rated_circuit_cap; SaHpiInt32T memErrRecFlag[16]; time_t server_insert_timer[16]; }; /* Structure for storing the current hotswap state of the resource */ struct oa_soap_hotswap_state { SaHpiHsStateT currentHsState; }; /* This define is the IANA-assigned private enterprise number for * Hewlett-Packard. A complete list of IANA numbers can be found at * http://www.iana.org/assignments/enterprise-numbers */ #define HP_MANUFACTURING_ID 11 /* This define is the IANA-assigned private enterprise number for Cisco Systems. * The HP BladeSystem c-Class can have interconnect blades from Cisco Systems */ #define CISCO_MANUFACTURING_ID 9 /* Checks for the shutdown request in event thread. On shutdown request, mutexes * locked by event thread are unlocked and exits the thread. It is necessary to * unlock the mutex, else g_free_mutex crahes on locked mutex */ #define OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, hnd_mutex, oa_mutex, timer) \ { \ if (oa_handler->shutdown_event_thread == SAHPI_TRUE) { \ dbg("Shutting down the OA SOAP event thread"); \ if (oa_mutex != NULL) \ wrap_g_mutex_unlock(oa_mutex); \ if (hnd_mutex != NULL) \ wrap_g_mutex_unlock(hnd_mutex); \ if (timer != NULL) \ g_timer_destroy(timer); \ g_thread_exit(NULL); \ } \ } /* Function prototypes */ SaErrorT build_oa_soap_custom_handler(struct oh_handler_state *oh_handler); void *oa_soap_open(GHashTable *handler_config, unsigned int hid, oh_evt_queue *eventq); void oa_soap_close(void *oh_handler); SaErrorT oa_soap_set_resource_tag(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiTextBufferT *tag); SaErrorT oa_soap_set_resource_severity(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiSeverityT severity); SaErrorT oa_soap_control_parm(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiParmActionT action); #endif openhpi-3.6.1/plugins/oa_soap/oa_soap_utils.h0000644000175100017510000001155212575647270020312 0ustar mohanmohan/* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. * Vivek Kumar * Shuah Khan */ #ifndef _OA_SOAP_UTILS_H #define _OA_SOAP_UTILS_H /* Include files */ #include #include #include "oa_soap_calls.h" #include "oa_soap.h" #include "oa_soap_inventory.h" /* OA takes around 90 seconds to stabilize */ #define OA_STABILIZE_MAX_TIME 90 /* Max timeout value for checking the availability of OA */ #define MAX_TIMEOUT 300 /* Function prototypes */ SaErrorT get_oa_soap_info(struct oh_handler_state *oh_handler); SaErrorT get_oa_state(struct oh_handler_state *oh_handler, char *ip); void update_hotswap_event(struct oh_handler_state *oh_handler, struct oh_event *event); struct oh_event *copy_oa_soap_event(struct oh_event *event); SaErrorT del_rdr_from_event(struct oh_event *event); SaErrorT check_oa_status(struct oa_soap_handler *oa_handler, struct oa_info *oa, SOAP_CON *con); SaErrorT check_oa_user_permissions(struct oa_soap_handler *oa_handler, SOAP_CON *con, char *user_name); SaErrorT check_discovery_failure(struct oh_handler_state *oh_handler); SaErrorT lock_oa_soap_handler(struct oa_soap_handler *oa_handler); SaErrorT check_config_parameters(GHashTable *handler_config); SaErrorT create_event_session(struct oa_info *oa); void create_oa_connection(struct oa_soap_handler *oa_handler, struct oa_info *oa, char *user_name, char *password); SaErrorT initialize_oa_con(struct oa_info *oa, char *user_name, char *password); SaErrorT delete_all_inventory_info(struct oh_handler_state *oh_handler); void cleanup_plugin_rptable(struct oh_handler_state *oh_handler); void release_oa_soap_resources(struct oa_soap_handler * oa_handler); SaHpiFloat64T get_oa_fw_version(struct oh_handler_state *oh_handler); SaErrorT update_oa_info(struct oh_handler_state *oh_handler, struct oaInfo *response, SaHpiResourceIdT resource_id); SaErrorT convert_lower_to_upper(char *src, SaHpiInt32T src_len, char *dest, SaHpiInt32T dest_len); void oa_soap_update_resource_status(resource_status_t *res_status, SaHpiInt32T index, char *serial_number, SaHpiResourceIdT resource_id, resource_presence_status_t presence); char * oa_soap_trim_whitespace(char *s); SaErrorT update_oa_fw_version(struct oh_handler_state *oh_handler, struct oaInfo *response, SaHpiResourceIdT resource_id); SaErrorT oa_soap_get_oa_ip(char *server, struct oaNetworkInfo network_info_response, char *oa_ip); void oa_soap_check_serial_number(int slot, char *serial_number); SaErrorT oa_soap_sleep_in_loop(struct oa_soap_handler *oa_handler, int secs); #endif openhpi-3.6.1/plugins/oa_soap/oa_soap_annunciator.h0000644000175100017510000000721512575647270021474 0ustar mohanmohan/* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra M.S. */ #ifndef _OA_SOAP_ANNUNCIATOR_H #define _OA_SOAP_ANNUNCIATOR_H /* Include files */ #include #include SaErrorT oa_soap_get_next_announce(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiAnnunciatorNumT num, SaHpiSeverityT severity, SaHpiBoolT unacknowledged_only, SaHpiAnnouncementT *announcement); SaErrorT oa_soap_get_announce(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiAnnunciatorNumT num, SaHpiEntryIdT entry, SaHpiAnnouncementT *announcement); SaErrorT oa_soap_ack_announce(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiAnnunciatorNumT num, SaHpiEntryIdT entry, SaHpiSeverityT severity); SaErrorT oa_soap_get_annunc_mode(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiAnnunciatorNumT num, SaHpiAnnunciatorModeT *mode); SaErrorT oa_soap_set_annunc_mode(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiAnnunciatorNumT num, SaHpiAnnunciatorModeT mode); SaErrorT oa_soap_del_announce(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiAnnunciatorNumT num, SaHpiEntryIdT entry, SaHpiSeverityT severity); SaErrorT oa_soap_add_announce(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiAnnunciatorNumT num, SaHpiAnnouncementT *announcement); #endif openhpi-3.6.1/plugins/oa_soap/oa_soap_dimi.c0000644000175100017510000002514312575647270020070 0ustar mohanmohan/* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Anand S **/ #include "oa_soap_dimi.h" /** * oa_soap_get_dimi_info: * @oh_handler : Handler data pointer * @session_id : Session ID * @resource_id : Resource ID * @dimi_num : Dimi Number * @dimi_info : Dimi Information Holder * * Purpose: * This function gets information about the DIMI. * * Description: * NA * * Returns: * SA_ERR_HPI_UNSUPPORTED_API - current oa_soap implementation does not * support this API **/ SaErrorT oa_soap_get_dimi_info(void *oh_handler, SaHpiSessionIdT session_id, SaHpiResourceIdT resource_id, SaHpiDimiNumT dimi_num, SaHpiDimiInfoT *dimi_info) { err("oa_soap_get_dimi_info not implemented"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_get_dimi_test: * @oh_handler : Handler data pointer * @session_id : Session ID * @resource_id : Resource ID * @dimi_num : Dimi Number * @dimi_testnum : Dimi Test Number * @dimi_test : Dimi Test Information Holder * * Purpose: * This function gets information about a particular Test * Description: * NA * * Returns: * SA_ERR_HPI_UNSUPPORTED_API - current oa_soap implementation does not * support this API **/ SaErrorT oa_soap_get_dimi_test(void *oh_handler, SaHpiSessionIdT session_id, SaHpiResourceIdT resource_id, SaHpiDimiNumT dimi_num, SaHpiDimiTestNumT dimi_testnum, SaHpiDimiTestT *dimi_test) { err("oa_soap_get_dimi_info not implemented"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_get_dimi_test_ready: * @oh_handler : Handler data pointer * @session_id : Session ID * @resource_id : Resource ID * @dimi_num : Dimi Number * @dimi_testnum : Dimi Test Number * @dimi_test_ready : Dimi Test readiness Information Holder * * Purpose: * This function provides the readiness of a DIMI to run a test * Description: * NA * * Returns: * SA_ERR_HPI_UNSUPPORTED_API - current oa_soap implementation does not * support this API **/ SaErrorT oa_soap_get_dimi_test_ready(void *oh_handler, SaHpiSessionIdT session_id, SaHpiResourceIdT resource_id, SaHpiDimiNumT dimi_num, SaHpiDimiTestNumT dimi_testnum, SaHpiDimiReadyT *dimi_test_ready) { err("oa_soap_get_dimi_info not implemented"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_start_dimi_test: * @oh_handler : Handler data pointer * @session_id : Session ID * @resource_id : Resource ID * @dimi_num : Dimi Number * @dimi_testnum : Dimi Test Number * @params : Number of Parameters * @param_list : Parameters List * * Purpose: * This function starts execution of a test on DIMI. * Description: * NA * * Returns: * SA_ERR_HPI_UNSUPPORTED_API - current oa_soap implementation does not * support this API **/ SaErrorT oa_soap_start_dimi_test(void *oh_handler, SaHpiSessionIdT session_id, SaHpiResourceIdT resource_id, SaHpiDimiNumT dimi_num, SaHpiDimiTestNumT dimi_testnum, SaHpiUint8T params, SaHpiDimiTestVariableParamsT *param_list) { err("oa_soap_get_dimi_info not implemented"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_cancel_dimi_test: * @oh_handler : Handler data pointer * @session_id : Session ID * @resource_id : Resource ID * @dimi_num : Dimi Number * @dimi_testnum : Dimi Test Number * @params : Number of Parameters * @param_list : Parameters List * * Purpose: * This function starts execution of a test on DIMI. * Description: * NA * * Returns: * SA_ERR_HPI_UNSUPPORTED_API - current oa_soap implementation does not * support this API **/ SaErrorT oa_soap_cancel_dimi_test(void *oh_handler, SaHpiSessionIdT session_id, SaHpiResourceIdT resource_id, SaHpiDimiNumT dimi_num, SaHpiDimiTestNumT dimi_testnum) { err("oa_soap_get_dimi_info not implemented"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_get_dimi_test_status: * @oh_handler : Handler data pointer * @session_id : Session ID * @resource_id : Resource ID * @dimi_num : Dimi Number * @dimi_testnum : Dimi Test Number * @complete : Percentage of Test run completed * @status : Test Run Status * * Purpose: * This function returns the status of a particular DIMI test * Description: * NA * * Returns: * SA_ERR_HPI_UNSUPPORTED_API - current oa_soap implementation does not * support this API **/ SaErrorT oa_soap_get_dimi_test_status(void *oh_handler, SaHpiSessionIdT session_id, SaHpiResourceIdT resource_id, SaHpiDimiNumT dimi_num, SaHpiDimiTestNumT dimi_testnum, SaHpiDimiTestPercentCompletedT *complete, SaHpiDimiTestRunStatusT *status) { err("oa_soap_get_dimi_info not implemented"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_get_dimi_test_retult: * @oh_handler : Handler data pointer * @session_id : Session ID * @resource_id : Resource ID * @dimi_num : Dimi Number * @dimi_testnum : Dimi Test Number * @test_result : Dimi Test Result Information Holder * * Purpose: * This function retrieves the results from the last run of test in DIMI * Description: * NA * * Returns: * SA_ERR_HPI_UNSUPPORTED_API - current oa_soap implementation does not * support this API **/ SaErrorT oa_soap_get_dimi_test_result(void *oh_handler, SaHpiSessionIdT session_id, SaHpiResourceIdT resource_id, SaHpiDimiNumT dimi_num, SaHpiDimiTestNumT dimi_testnum, SaHpiDimiTestResultsT *test_result) { err("oa_soap_get_dimi_info not implemented"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * * Mapping of the ABIs with local function pointers * **/ void * oh_get_dimi_info (void*, SaHpiSessionIdT, SaHpiResourceIdT, SaHpiDimiNumT, SaHpiDimiInfoT*) __attribute__ ((weak, alias ("oa_soap_get_dimi_info"))); void * oh_get_dimi_test (void*, SaHpiSessionIdT, SaHpiResourceIdT, SaHpiDimiNumT, SaHpiDimiTestNumT, SaHpiDimiTestT*) __attribute__ ((weak, alias ("oa_soap_get_dimi_test"))); void * oh_get_dimi_test_ready (void*, SaHpiSessionIdT, SaHpiResourceIdT, SaHpiDimiNumT, SaHpiDimiTestNumT, SaHpiDimiReadyT*) __attribute__ ((weak, alias ("oa_soap_get_dimi_test_ready"))); void * oh_start_dimi_test (void*, SaHpiSessionIdT, SaHpiResourceIdT, SaHpiDimiNumT, SaHpiDimiTestNumT, SaHpiUint8T, SaHpiDimiTestVariableParamsT*) __attribute__ ((weak, alias ("oa_soap_start_dimi_test"))); void * oh_cancel_dimi_test (void*, SaHpiSessionIdT, SaHpiResourceIdT, SaHpiDimiNumT, SaHpiDimiTestNumT) __attribute__ ((weak, alias ("oa_soap_cancel_dimi_test"))); void * oh_get_dimi_test_status (void*, SaHpiSessionIdT, SaHpiResourceIdT, SaHpiDimiNumT, SaHpiDimiTestNumT, SaHpiDimiTestPercentCompletedT*, SaHpiDimiTestRunStatusT*) __attribute__ ((weak, alias ("oa_soap_get_dimi_test_status"))); void * oh_get_dimi_test_result (void*, SaHpiSessionIdT, SaHpiResourceIdT, SaHpiDimiNumT, SaHpiDimiTestNumT, SaHpiDimiTestResultsT*) __attribute__ ((weak, alias ("oa_soap_get_dimi_test_result"))); openhpi-3.6.1/plugins/oa_soap/oa_soap.c0000644000175100017510000005131112575647270017062 0ustar mohanmohan/* * Copyright (C) 2007-2009, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. * Raghavendra M.S. * Raja Kumar Thatte * Sudesh Acharya * Vivek Kumar * Mohan Devarajulu * * This file implements the entry point of the oa soap plug-in. This handles * customer handler for oa soap interface for handling the any request for soap * interface. This APIs uses soap_open and soap_close APIs from soap interface * for initiating and closing the communication with SOAP interface / oa * * build_oa_soap_custom_handler() - Builds the OA SOAP custom handler * * oa_soap_open() - Opens the oa soap interface connection * for initiating communication with OA. * * oa_soap_close() - Closes the communication with OA. * * oa_soap_set_resource_tag() - Handles setting the tags to resources * * oa_soap_set_resource_severity() - Sets the resource's severity. * * oa_soap_control_parm() - Handles the control parameter handling * for setting and reading config data * from OA **/ #include "oa_soap_discover.h" #include "sahpi_wrappers.h" #include "oa_soap.h" #include "oa_soap_utils.h" /* For maintaining the patch versions */ static char const rcsid[] __attribute__ ((used)) = "$Version: oa_soap plugin for openhpi-2.11.2, patch level 12. " "Created on May 16, 2008 $"; /** * build_oa_soap_custom_handler: * @oh_handler: Pointer to OpenHPI handler. * * Purpose: * Builds and initializes the OA SOAP custom handler. * * Detailed Description: * - If the plugin initialization fails, then this method will be called * more than once, until the plugin intialization succeeds. * - If the data field in the oh_handler is not NULL then we assume that * this call is done because of some issues with OA / switchover case * This case, we just re-assign the data into oa_handler * - In case of the data field in oh_handler is null, we are filling the * oa_handler information * - Using get_oa_info, we will get the OA information to initialize * SOAP_CON objects. * - Based on the OA info, active OA will be identified, even if user * specifies the same in the configuration file. * * Return values: * SA_OK - on sucess. * SA_ERR_HPI_INVALID_PARAMS - parameter(s) are NULL. * SA_ERR_HPI_OUT_OF_MEMORY - not enough memory to allocate. * SA_ERR_HPI_INTERNAL_ERROR - on failure **/ SaErrorT build_oa_soap_custom_handler(struct oh_handler_state *oh_handler) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler = NULL; if (oh_handler == NULL) { err("Invalid parmaters"); return SA_ERR_HPI_INVALID_PARAMS; } /* Check whether oa_soap_handler is initialized or not. * If the plugin initialization fails, then this method will be * called more than once. * * The below if statement is to avoid multiple initialization * of the oa_soap_handler. */ if (oh_handler->data == NULL) { /* Initialize the oa_soap_handler */ oa_handler = (struct oa_soap_handler *) g_malloc0(sizeof(struct oa_soap_handler)); if (oa_handler == NULL) { err("out of memory"); return SA_ERR_HPI_OUT_OF_MEMORY; } oa_handler->in_discovery_thread = HPOA_FALSE; oa_handler->status = PRE_DISCOVERY; oa_handler->active_con = NULL; oa_handler->mutex = wrap_g_mutex_new_init(); oa_handler->oa_1 = NULL; oa_handler->oa_2 = NULL; oa_handler->oa_switching=SAHPI_FALSE; oa_handler->shutdown_event_thread = SAHPI_FALSE; /* Initialize the oa_info structure */ oa_handler->oa_1 = (struct oa_info *) g_malloc0(sizeof(struct oa_info)); if (oa_handler->oa_1 == NULL) { err("Out of memory"); wrap_g_free(oa_handler); return SA_ERR_HPI_OUT_OF_MEMORY; } oa_handler->oa_2 = (struct oa_info *) g_malloc0(sizeof(struct oa_info)); if (oa_handler->oa_2 == NULL) { err("Out of memory"); wrap_g_free(oa_handler->oa_1); wrap_g_free(oa_handler); return SA_ERR_HPI_OUT_OF_MEMORY; } /* Initialize the oa_1 structure */ oa_handler->oa_1->oa_status = OA_ABSENT; oa_handler->oa_1->hpi_con = NULL; oa_handler->oa_1->event_con = NULL; oa_handler->oa_1->event_con2 = NULL; oa_handler->oa_1->thread_handler = NULL; oa_handler->oa_1->mutex = wrap_g_mutex_new_init(); memset(oa_handler->oa_1->server, 0, MAX_URL_LEN); oa_handler->oa_1->oh_handler = oh_handler; /* Initialize the oa_2 structure */ oa_handler->oa_2->oa_status = OA_ABSENT; oa_handler->oa_2->hpi_con = NULL; oa_handler->oa_2->event_con = NULL; oa_handler->oa_2->event_con2 = NULL; oa_handler->oa_2->thread_handler = NULL; oa_handler->oa_2->mutex = wrap_g_mutex_new_init(); memset(oa_handler->oa_2->server, 0, MAX_URL_LEN); oa_handler->oa_2->oh_handler = oh_handler; memset(oa_handler->memErrRecFlag, 0, sizeof( SaHpiInt32T) * 16); memset(oa_handler->server_insert_timer, 0, sizeof( time_t) * 16); /* Put the oa_handler in oh_handler */ oh_handler->data = oa_handler; } else { /* oa_soap_handler is already initialized * Get the oa_handler from oh_handler */ oa_handler = (struct oa_soap_handler *) oh_handler->data; } /* Get the OA information and intialize SOAP_CON structures */ rv = get_oa_soap_info(oh_handler); if (rv != SA_OK) { oa_handler->status = PLUGIN_NOT_INITIALIZED; err("Get OA SOAP info failed"); return rv; } /* Point the active_con to active OA's hpi_con object */ if (oa_handler->oa_1->oa_status == ACTIVE) oa_handler->active_con = oa_handler->oa_1->hpi_con; else if (oa_handler->oa_2->oa_status == ACTIVE) oa_handler->active_con = oa_handler->oa_2->hpi_con; else { /* Active OA is not accessible */ oa_handler->status = PLUGIN_NOT_INITIALIZED; err("Active OA is not reachable"); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } /** * oa_soap_open: * @handler_config: Handler data pointer. * @handler_id: Id for the handler * @eventq: Pointer to the infrstructure event queue. * * Purpose: * This function opens OA SOAP plugin handler instance. * * Detailed Description: * - This function will be the entry point for the oa soap plug-in. * - We will check all configuration parameters. We won't validate the * content of the variables. We will check whether the parameters are * assigned or not. User can assign even the empty string into the * configuration file. * - Will assign handler_config, handler id and allocate memory for the RPT * table and cache. * - "build_oa_soap_custom_handler" will be called for initializing the * customer handler address into framework. * * Return values: * Plugin handle - on success. * NULL - on error. **/ void *oa_soap_open(GHashTable *handler_config, unsigned int handler_id, oh_evt_queue *eventq) { SaErrorT rv = SA_OK; struct oh_handler_state *handler = NULL; if (handler_config == NULL || handler_id == 0 || eventq == NULL) { err("Invalid parameters"); return NULL; } /* Check whether all the parameters are provided or not */ rv = check_config_parameters(handler_config); if (rv != SA_OK) { err("config file has some missing parameters"); return NULL; } /* Initialize the handler */ handler = (struct oh_handler_state *) g_malloc0(sizeof(struct oh_handler_state)); if (handler == NULL) { err("Out of memory"); return NULL; } handler->config = handler_config; handler->hid = handler_id; handler->eventq = eventq; handler->rptcache = (RPTable *) g_malloc0(sizeof(RPTable)); if (handler->rptcache == NULL) { wrap_g_free(handler); err("Out of memory"); return NULL; } rv = oh_init_rpt(handler->rptcache); if (rv != SA_OK) { err("Initializing rptcache failed"); wrap_g_free(handler->rptcache); wrap_g_free(handler); return NULL; } handler->data = NULL; /* Build the custom handler for OA SOAP plugin */ rv = build_oa_soap_custom_handler(handler); if (rv != SA_OK) { err("Build OA SOAP custom handler failed"); /* If the failure due to out of memory, return NULL * Else, try to build the oa_soap_handler during discovery call */ if (rv == SA_ERR_HPI_OUT_OF_MEMORY) { wrap_g_free(handler->rptcache); wrap_g_free(handler); return NULL; } } return ((void *)handler); } /** * oa_soap_close: * @oh_handler: Handler data pointer. * * Purpose: * This function closes OA SOAP plugin handler instance. * * Detailed Description: * - Releases all the memory allocated by OA SOAP plugin handler * - As per current framework implementation, this api won't be called * during process shutdown as there is no graceful shutdown implemented * as part of the openhpi framework. * * Return values: * NONE **/ void oa_soap_close(void *oh_handler) { struct oh_handler_state *handler = NULL; struct oa_soap_handler *oa_handler = NULL; int i=0; if (oh_handler == NULL) { err("Invalid parameter"); return; } dbg("Shutting down the OA SOAP plugin"); handler = (struct oh_handler_state *) oh_handler; oa_handler = (struct oa_soap_handler *) handler->data; /* Check whether oa_handler is initialized or not */ if (oa_handler == NULL) return; /* Check whether the oa_1 or oa_2 is NULL * Ideally, if oa_handler is not NULL, oa_1 and oa_2 will not be NULL */ if (oa_handler->oa_1 == NULL || oa_handler->oa_2 == NULL) return; /* Set the event thread shutdown status to TRUE */ oa_handler->shutdown_event_thread = SAHPI_TRUE; /* Wait for the event threads to exit */ if (oa_handler->oa_1->thread_handler != NULL) g_thread_join(oa_handler->oa_1->thread_handler); if (oa_handler->oa_2->thread_handler != NULL) g_thread_join(oa_handler->oa_2->thread_handler); dbg("Stopped the OA SOAP event threads"); /* Now we have to make sure that discovery thread is not in oa_soap */ /* TODO: remove the hard coded values in this */ for ( i=0; i < 10; i++ ) { if (oa_handler->in_discovery_thread == HPOA_FALSE) { break; } sleep(3); } if (oa_handler->in_discovery_thread == HPOA_TRUE) { err("oa_soap_discovery is continuing even after 30 seconds"); err("Shutting down the plugin though"); } /* Cleanup the RPTable */ cleanup_plugin_rptable(handler); wrap_g_free(handler->rptcache); dbg("Cleaned the OA SOAP RPTable"); /* Release the mutexes. Check whether the mutex is unlocked or not. If * mutex is not unlocked by the event thread, then g_mutex_free will * crash */ if (oa_handler->mutex != NULL) { if (wrap_g_mutex_trylock(oa_handler->mutex) == FALSE) { err("Mutex in OA handler is not unlocked by the event" " thread"); err("Mutex in OA handler is not released"); } else { wrap_g_mutex_unlock(oa_handler->mutex); wrap_g_mutex_free_clear(oa_handler->mutex); } } if (oa_handler->oa_1->mutex != NULL) { if (wrap_g_mutex_trylock(oa_handler->oa_1->mutex) == FALSE) { err("Mutex in oa_1 is not unlocked by the event" " thread"); err("Mutex in oa_1 is not released"); } else { wrap_g_mutex_unlock(oa_handler->oa_1->mutex); wrap_g_mutex_free_clear(oa_handler->oa_1->mutex); } } if (oa_handler->oa_2->mutex != NULL) { if (wrap_g_mutex_trylock(oa_handler->oa_2->mutex) == FALSE) { err("Mutex in oa_2 is not unlocked by the event" " thread"); err("Mutex in oa_2 is not released"); } else { wrap_g_mutex_unlock(oa_handler->oa_2->mutex); wrap_g_mutex_free_clear(oa_handler->oa_2->mutex); } } dbg("Released the OA SOAP handler mutexes"); /* Cleanup the SOAP_CON */ if (oa_handler->oa_1->hpi_con != NULL) soap_close(oa_handler->oa_1->hpi_con); if (oa_handler->oa_1->event_con != NULL) soap_close(oa_handler->oa_1->event_con); if (oa_handler->oa_1->event_con2 != NULL) soap_close(oa_handler->oa_1->event_con2); if (oa_handler->oa_2->hpi_con != NULL) soap_close(oa_handler->oa_2->hpi_con); if (oa_handler->oa_2->event_con != NULL) soap_close(oa_handler->oa_2->event_con); if (oa_handler->oa_2->event_con2 != NULL) soap_close(oa_handler->oa_2->event_con2); dbg("Released the SOAP CON structures from handler"); /* Release the oa info structure */ wrap_g_free(oa_handler->oa_1); wrap_g_free(oa_handler->oa_2); dbg("Released the oa_info structures from handler"); /* Release the oa handler structure */ wrap_g_free(oa_handler); wrap_g_free(handler); dbg("Released the OA SOAP handler"); return; } /** * oa_soap_set_resource_tag: * @oh_handler: Pointer to openhpi handler. * @resource_id: Resource Id. * @tag: Pointer to new tag. * * Purpose: * Sets resource's tag. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - parameter(s) are NULL @tag is invalid. * SA_ERR_HPI_NOT_PRESENT - resource does not exist. **/ SaErrorT oa_soap_set_resource_tag(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiTextBufferT *tag) { SaErrorT rv = SA_OK; struct oh_handler_state *handler; SaHpiRptEntryT *rpt = NULL; SaHpiBoolT valid_tag = SAHPI_TRUE; if (tag == NULL || oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } /* Validate the tag */ valid_tag = oh_valid_textbuffer(tag); if (valid_tag == SAHPI_FALSE) { err("The tag is not correct format"); return SA_ERR_HPI_INVALID_PARAMS; } handler =(struct oh_handler_state *) oh_handler; rpt = oh_get_resource_by_id(handler->rptcache, resource_id); if (rpt == NULL) { err("Invalid resource id"); return SA_ERR_HPI_NOT_PRESENT; } /* Copy the tag to the resource tag */ rv = oh_copy_textbuffer(&(rpt->ResourceTag), tag); if (rv != SA_OK) { err("Copying textbuffer failed"); return rv; } return SA_OK; } /** * oa_soap_set_resource_severity: * @oh_handler: Handler data pointer. * @id: Resource Id. * @severity: Resource severity. * * Purpose: * Sets severity of the resource. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on invalid parameters. * SA_ERR_HPI_NOT_PRESENT - resource does not exist. **/ SaErrorT oa_soap_set_resource_severity(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiSeverityT severity) { struct oh_handler_state *handler; SaHpiRptEntryT *rpt = NULL; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } /* Validate the severity */ if (oh_lookup_severity(severity) == NULL) { err("Invalid parameter"); return SA_ERR_HPI_INVALID_PARAMS; } handler = (struct oh_handler_state *) oh_handler; rpt = oh_get_resource_by_id(handler->rptcache, resource_id); if (rpt == NULL) { err("Not able to find the resource. Invalid resource id"); return SA_ERR_HPI_NOT_PRESENT; } rpt->ResourceSeverity = severity; return SA_OK; } /** * oa_soap_control_parm: * @oh_handler: Pointer to openhpi handler. * @resource_id: Resource Id. * @action: Configuration action. * * Purpose: * Save and restore saved configuration parameters. * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current oa_soap implementation does not * support this API. **/ SaErrorT oa_soap_control_parm(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiParmActionT action) { err("oa_soap control parm is not supported"); return SA_ERR_HPI_UNSUPPORTED_API; } void * oh_open (GHashTable *, unsigned int, oh_evt_queue *) __attribute__ ((weak, alias("oa_soap_open"))); void * oh_close (void *) __attribute__ ((weak, alias("oa_soap_close"))); void * oh_set_resource_tag (void *, SaHpiResourceIdT, SaHpiTextBufferT *) __attribute__ ((weak, alias("oa_soap_set_resource_tag"))); void * oh_set_resource_severity (void *, SaHpiResourceIdT, SaHpiSeverityT) __attribute__ ((weak, alias("oa_soap_set_resource_severity"))); void * oh_control_parm (void *, SaHpiResourceIdT, SaHpiParmActionT) __attribute__ ((weak, alias("oa_soap_control_parm"))); openhpi-3.6.1/plugins/oa_soap/oa_soap_interconnect_event.c0000644000175100017510000010371712575647270023046 0ustar mohanmohan/* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. * Shuah Khan * Raghavendra M.S. * Mohan Devarajulu * * This file has the interconnect blade related events handling * * process_interconnect_reset_event() - Process the interconeect * reset event * * process_interconnect_power_event() - Process the interconeect * power event * * process_interconnect_insertion_event() - Process the interconeect * insertion event * * process_interconnect_info_event() - Process the interconnect * info event * * process_interconnect_extraction_event() - Process the interconeect * extraction event * * process_interconnect_status_event() - Process the interconeect * status event * * process_interconnect_thermal_event() - Process the interconeect * thermal event * */ #include "oa_soap_interconnect_event.h" #include "sahpi_wrappers.h" /** * process_interconnect_reset_event * @oh_handler: Pointer to openhpi handler structure * @oa_event: Pointer to OA event structure * * Purpose: * Creates the interconnect reset hpi hotswap event * * Detailed Description: NA * * Return values: * SA_OK - success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters. * SA_ERR_HPI_INTERNAL_ERROR - on failure **/ SaErrorT process_interconnect_reset_event(struct oh_handler_state *oh_handler, struct eventInfo *oa_event) { struct oa_soap_hotswap_state *hotswap_state = NULL; struct oh_event event; SaHpiRptEntryT *rpt = NULL; SaHpiResourceIdT resource_id; struct oa_soap_handler *oa_handler = NULL; SaHpiInt32T bay_number; if (oh_handler == NULL || oa_event == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } update_hotswap_event(oh_handler, &event); oa_handler = (struct oa_soap_handler *) oh_handler->data; bay_number = oa_event->eventData.interconnectTrayStatus.bayNumber; resource_id = oa_handler-> oa_soap_resources.interconnect.resource_id[bay_number - 1]; /* Get the rpt entry of the resource */ rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (rpt == NULL) { err("resource RPT is NULL"); return SA_ERR_HPI_INTERNAL_ERROR; } memcpy(&(event.resource), rpt, sizeof(SaHpiRptEntryT)); event.event.Source = event.resource.ResourceId; hotswap_state = (struct oa_soap_hotswap_state *) oh_get_resource_data(oh_handler->rptcache, event.resource.ResourceId); if (hotswap_state == NULL) { err("blade private info is NULL"); return SA_ERR_HPI_INTERNAL_ERROR; } hotswap_state->currentHsState = SAHPI_HS_STATE_ACTIVE; event.resource.ResourceSeverity = SAHPI_OK; /* On reset of interconnect, it has powered off and powered on * Raise 2 hoswap events for power off * ACTIVE -> EXTRACTION_PENDING and EXTRACTION_PENDING -> INACTIVE * Then, raise 2 hoswap events for power on * INACTIVE -> INSERTION_PENDING and INSERTION_PENDING -> ACTIVE */ event.rdrs = NULL; event.event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_ACTIVE; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_EXTRACTION_PENDING; /* ACTIVE to EXTRACTION_PENDING state change happened due power off * event. The deactivation can not be stopped. */ event.event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_UNEXPECTED_DEACTIVATION; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); event.rdrs = NULL; event.event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_EXTRACTION_PENDING; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_INACTIVE; /* EXTRACTION_PENDING to INACTIVE state change happened due * to Auto policy of the server blade */ event.event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_AUTO_POLICY; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); event.rdrs = NULL; event.event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_INACTIVE; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_INSERTION_PENDING; /* The cause of the state change is unknown */ event.event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_UNKNOWN; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); event.rdrs = NULL; event.event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_INSERTION_PENDING; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_ACTIVE; /* INSERTION_PENDING to ACTIVE state change happened due * to auto policy of server blade */ event.event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_AUTO_POLICY; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); return SA_OK; } /** * process_interconnect_power_event * @oh_handler: Pointer to openhpi handler structure * @oa_event: Pointer to OA event structure * * Purpose: * Creates the interconnect power hpi hotswap event * * Detailed Description: NA * * Return values: * SA_OK - success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters. * SA_ERR_HPI_INTERNAL_ERROR - on failure **/ SaErrorT process_interconnect_power_event(struct oh_handler_state *oh_handler, struct eventInfo *oa_event) { struct oa_soap_hotswap_state *hotswap_state = NULL; SaErrorT rv = SA_OK; SaHpiRptEntryT *rpt = NULL; struct oh_event event; struct oa_soap_sensor_info *sensor_info=NULL; SaHpiRdrT *rdr = NULL; SaHpiIdrIdT sen_rdr_num = OA_SOAP_SEN_TEMP_STATUS; SaHpiResourceIdT resource_id; struct oa_soap_handler *oa_handler = NULL; SaHpiInt32T bay_number; if (oh_handler == NULL || oa_event == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } update_hotswap_event(oh_handler, &event); oa_handler = (struct oa_soap_handler *) oh_handler->data; bay_number = oa_event->eventData.interconnectTrayStatus.bayNumber; resource_id = oa_handler-> oa_soap_resources.interconnect.resource_id[bay_number - 1]; /* Get the rpt entry of the server */ rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (rpt == NULL) { err("resource RPT is NULL"); return SA_ERR_HPI_INTERNAL_ERROR; } memcpy(&(event.resource), rpt, sizeof(SaHpiRptEntryT)); event.event.Source = event.resource.ResourceId; hotswap_state = (struct oa_soap_hotswap_state *) oh_get_resource_data(oh_handler->rptcache, event.resource.ResourceId); if (hotswap_state == NULL) { err("interconnect private info is NULL"); return SA_ERR_HPI_INTERNAL_ERROR; } switch (oa_event->eventData.interconnectTrayStatus.powered) { case (POWER_OFF): event.resource.ResourceSeverity = SAHPI_CRITICAL; /* Update the current hotswap state to INACTIVE */ hotswap_state->currentHsState = SAHPI_HS_STATE_INACTIVE; if (rv != SA_OK) { err("add rpt entry failed"); return rv; } /* Raise the power off hotswap event*/ event.rdrs = NULL; event.event.EventDataUnion.HotSwapEvent. PreviousHotSwapState = SAHPI_HS_STATE_ACTIVE; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_EXTRACTION_PENDING; /* ACTIVE to EXTRACTION_PENDING state change happened * due power off event. The deactivation can not be * stopped. */ event.event.EventDataUnion.HotSwapEvent. CauseOfStateChange = SAHPI_HS_CAUSE_UNEXPECTED_DEACTIVATION; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); event.rdrs = NULL; event.event.EventDataUnion.HotSwapEvent. PreviousHotSwapState = SAHPI_HS_STATE_EXTRACTION_PENDING; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_INACTIVE; /* EXTRACTION_PENDING to INACTIVE state change happens * due to auto policy of server blade */ event.event.EventDataUnion.HotSwapEvent. CauseOfStateChange = SAHPI_HS_CAUSE_AUTO_POLICY; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); break; case (POWER_ON): event.resource.ResourceSeverity = SAHPI_OK; /* Update the current hot swap state to ACTIVE */ hotswap_state->currentHsState = SAHPI_HS_STATE_ACTIVE; rdr = oh_get_rdr_by_type(oh_handler->rptcache, event.resource.ResourceId, SAHPI_SENSOR_RDR, sen_rdr_num); if (rdr == NULL) { err("RDR not present"); return SA_ERR_HPI_NOT_PRESENT; } /* Get the thermal sensor information of the server */ sensor_info = (struct oa_soap_sensor_info*) oh_get_rdr_data(oh_handler->rptcache, event.resource.ResourceId, rdr->RecordId); if (sensor_info == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); return SA_ERR_HPI_INTERNAL_ERROR; } /* Check for any thermal sensor state * and raise the deassert events */ rv = check_and_deassert_event(oh_handler, event.resource.ResourceId, rdr, sensor_info); if (rv != SA_OK) { err("Deassert of sensor events failed"); } /* Since the interconnect got powered off, there will * not be any active thermal events. Clear the thermal * sensor states */ sensor_info->current_state = SAHPI_ES_UNSPECIFIED; sensor_info->previous_state = SAHPI_ES_UNSPECIFIED; /* Raise the power on hotswap event*/ event.rdrs = NULL; event.event.EventDataUnion.HotSwapEvent. PreviousHotSwapState = SAHPI_HS_STATE_INACTIVE; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_INSERTION_PENDING; /* The cause of the state change is unknown */ event.event.EventDataUnion.HotSwapEvent. CauseOfStateChange = SAHPI_HS_CAUSE_UNKNOWN; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); event.rdrs = NULL; event.event.EventDataUnion.HotSwapEvent. PreviousHotSwapState = SAHPI_HS_STATE_INSERTION_PENDING; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_ACTIVE; /* INSERTION_PENDING to ACTIVE state change happened * to Auto policy of server blade */ event.event.EventDataUnion.HotSwapEvent. CauseOfStateChange = SAHPI_HS_CAUSE_AUTO_POLICY; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); break; default: err("Wrong power state %d", oa_event->eventData.bladeStatus.powered); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } /** * process_interconnect_insertion_event * @oh_handler: Pointer to openhpi handler structure * @con: Pointer to the SOAP_CON structure * @oa_event: Pointer to OA event structure * * Purpose: * Creates the interconnect insertion hpi hotswap event * * Detailed Description: NA * * Return values: * SA_OK - success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters. * SA_ERR_HPI_INTERNAL_ERROR - on failure **/ SaErrorT process_interconnect_insertion_event(struct oh_handler_state *oh_handler, SOAP_CON *con, struct eventInfo *oa_event) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler = NULL; struct getInterconnectTrayInfo info; struct interconnectTrayInfo response; struct oh_event event; SaHpiInt32T bay_number; SaHpiResourceIdT resource_id; GSList *asserted_sensors = NULL; SaHpiRptEntryT *rpt = NULL; struct oa_soap_hotswap_state *hotswap_state = NULL; if (oh_handler == NULL || oa_event == NULL || con == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; bay_number = oa_event->eventData.interconnectTrayStatus.bayNumber; update_hotswap_event(oh_handler, &event); info.bayNumber = bay_number; rv = soap_getInterconnectTrayInfo(con, &info, &response); if (rv != SOAP_OK) { err("Get interconnect tray info failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Build the inserted interconnect RPT entry */ rv = build_inserted_intr_rpt(oh_handler, con, response.name, bay_number, &resource_id, TRUE); if (rv != SA_OK) { err("Failed to build the interconnect RPT"); return rv; } /* Update resource_status structure with resource_id, * serial_number, and presence status */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.interconnect, bay_number, response.serialNumber, resource_id, RES_PRESENT); /* Build the inserted interconnect RDRs */ rv = build_inserted_interconnect_rdr(oh_handler, con, bay_number, resource_id, TRUE); if (rv != SA_OK) { err("Failed to build the interconnect RDR"); rv = oh_remove_resource(oh_handler->rptcache, event.resource.ResourceId); /* reset resource_status structure to default values */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.interconnect, bay_number, "", SAHPI_UNSPECIFIED_RESOURCE_ID, RES_ABSENT); return rv; } rv = oa_soap_populate_event(oh_handler, resource_id, &event, &asserted_sensors); if (rv != SA_OK) { err("Creating hotswap event failed"); return rv; } event.event.EventType = SAHPI_ET_HOTSWAP; event.event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_NOT_PRESENT; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_INSERTION_PENDING; /* NOT_PRESENT to INSERTION_PENDING state change happened due * to operator action */ event.event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_OPERATOR_INIT; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); /* Get the rpt entry of the server */ rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (rpt == NULL) { err("resource RPT is NULL"); return 0; } hotswap_state = (struct oa_soap_hotswap_state *) oh_get_resource_data(oh_handler->rptcache, resource_id); if (hotswap_state == NULL) { err("Failed to get hotswap state of server blade"); return 0; } hotswap_state->currentHsState = SAHPI_HS_STATE_ACTIVE; update_hotswap_event(oh_handler, &event); memcpy(&(event.resource), rpt, sizeof(SaHpiRptEntryT)); event.event.Source = event.resource.ResourceId; event.event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_INSERTION_PENDING; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_ACTIVE; /* INSERTION_PENDING to ACTIVE state change happened de * to Auto policy of server blade */ event.event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_AUTO_POLICY; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); /* Raise the assert sensor events */ if (asserted_sensors) { rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); oa_soap_assert_sen_evt(oh_handler, rpt, asserted_sensors); } return SA_OK; } /** * process_interconnect_info_event * @oh_handler: Pointer to openhpi handler structure * @con: Pointer to the SOAP_CON structure * @oa_event: Pointer to OA event structure * * Purpose: * Check if the serial number is there, if so insert. * This is bad as the query does not get the complete details * We need to make OA do the right stuff. * This is created only as an additional mechanism to get the * part/serial number of the already inserted interconnect. * So not much error handling * * Detailed Description: NA * * Return values: * SA_OK - success. * SA_ERR_HPI_INVALID_PARAMS - Invalid parameters * SA_ERR_HPI_OUT_OF_MEMORY - Out of memory **/ SaErrorT process_interconnect_info_event(struct oh_handler_state *oh_handler, SOAP_CON *con, struct eventInfo *oa_event) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler = NULL; SaHpiInt32T bay_number, len; char *serial_number = NULL; char *name = NULL; SaHpiResourceIdT resource_id; if (oh_handler == NULL || oa_event == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; bay_number = oa_event->eventData.interconnectTrayInfo.bayNumber; if(!oa_event->eventData.interconnectTrayInfo.serialNumber){ err("Serial Number is NULL"); return SA_ERR_HPI_INVALID_PARAMS; } len = strlen(oa_event->eventData.interconnectTrayInfo.serialNumber); serial_number = (char *)g_malloc0(sizeof(char) * len + 1); strcpy(serial_number, oa_event->eventData.interconnectTrayInfo.serialNumber); serial_number[len]='\0'; if (strcmp(serial_number,"[Unknown]") == 0 ) { wrap_g_free(serial_number); return SA_ERR_HPI_OUT_OF_MEMORY; } name = oa_event->eventData.interconnectTrayInfo.name; resource_id = oa_handler-> oa_soap_resources.interconnect.resource_id[bay_number - 1]; /* Build the inserted interconnect RPT entry */ rv = build_inserted_intr_rpt(oh_handler, con, name, bay_number, &resource_id, TRUE); if (rv != SA_OK) { err("Failed to build the interconnect RPT"); wrap_g_free(serial_number); return rv; } /* Update resource_status structure with resource_id, * serial_number, and presence status */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.interconnect, bay_number, serial_number, resource_id, RES_PRESENT); /* The RDR already exist, but the relevant data is available only now * So just go ahead and correct it. When building the RDR the code does * take care of already existing RDR. */ rv = build_inserted_interconnect_rdr(oh_handler, con, bay_number, resource_id, FALSE); wrap_g_free(serial_number); return SA_OK; } /** * process_interconnect_extraction_event * @oh_handler: Pointer to openhpi handler structure * @oa_event: Pointer to OA event structure * * Purpose: * Creates the interconnect extraction hpi hotswap event * * Detailed Description: NA * * Return values: * SA_OK - success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters. * SA_ERR_HPI_INTERNAL_ERROR - on failure **/ SaErrorT process_interconnect_extraction_event(struct oh_handler_state *oh_handler, struct eventInfo *oa_event) { SaErrorT rv = SA_OK; if (oh_handler == NULL || oa_event == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } rv = remove_interconnect(oh_handler, oa_event->eventData.interconnectTrayStatus.bayNumber); if (rv != SA_OK) { err("Encoding entity path failed"); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } /** * process_interconnect_status_event * @oh_handler: Pointer to openhpi handler structure * @oa_event: Pointer to OA event structure * * Purpose: * Creates the interconnect insertion pending to active hpi hotswap event * Processes the interconnect status event and generates the sensor event * * Detailed Description: * - The interconnect takes nearly 3 seconds to power on * The interconnect status event which follows the insertion event * indicates the power on of interconnect * - Create the interconnect insertion pending to active hpi hotswap event * - Processes the interconnect status event and generates the sensor event * * Return values: * SA_OK - success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters. * SA_ERR_HPI_INTERNAL_ERROR - on failure **/ void oa_soap_proc_interconnect_status(struct oh_handler_state *oh_handler, struct interconnectTrayStatus *status) { struct oa_soap_hotswap_state *hotswap_state; SaHpiRptEntryT *rpt = NULL; SaHpiResourceIdT resource_id; struct oa_soap_handler *oa_handler = NULL; enum oa_soap_extra_data_health health_status; SaErrorT rv; enum diagnosticStatus diag_ex_status[OA_SOAP_MAX_DIAG_EX]; if (oh_handler == NULL || status == NULL) { err("Invalid parameters"); return; } oa_handler = (struct oa_soap_handler *) oh_handler->data; resource_id = oa_handler->oa_soap_resources.interconnect. resource_id[status->bayNumber - 1]; /* Get the rpt entry of the interconnect */ rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (rpt == NULL) { err("resource RPT is NULL"); return; } hotswap_state = (struct oa_soap_hotswap_state *) oh_get_resource_data(oh_handler->rptcache, resource_id); if (hotswap_state == NULL) { err("Failed to get hotswap state of interconnect"); return; } /* Build operational status sensor rdr */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_OPER_STATUS, status->operationalStatus, 0, 0) /* Build predictive failure sensor rdr */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_PRED_FAIL, status->operationalStatus, 0, 0) /* Build interconnect CPU fault sensor rdr */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_CPU_FAULT, status->cpuFault, 0, 0) /* Build interconnect health LED sensor rdr */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_HEALTH_LED, status->healthLed, 0, 0) /* Build internal data error sensor rdr */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_INT_DATA_ERR, status->diagnosticChecks.internalDataError, 0, 0) /* Build management processor error sensor rdr */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_MP_ERR, status->diagnosticChecks. managementProcessorError, 0, 0) /* Build thermal waring sensor rdr */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_THERM_WARN, status->diagnosticChecks.thermalWarning, 0, 0) /* Build thermal danger sensor rdr */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_THERM_DANGER, status->diagnosticChecks.thermalDanger, 0, 0) /* Build IO configuration error sensor rdr */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_IO_CONFIG_ERR, status->diagnosticChecks. ioConfigurationError, 0, 0) /* Build device power request error sensor rdr */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_PWR_REQ, status->diagnosticChecks. devicePowerRequestError, 0, 0) /* Build device failure error sensor rdr */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_FAIL, status->diagnosticChecks.deviceFailure, 0, 0) /* Build device degraded error sensor rdr */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_DEGRAD, status->diagnosticChecks.deviceDegraded, 0, 0) oa_soap_parse_diag_ex(status->diagnosticChecksEx, diag_ex_status); /* Process device not supported sensor rdr */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_NOT_SUPPORT, diag_ex_status[DIAG_EX_DEV_NOT_SUPPORT], 0, 0) /* Process Device informational sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_INFO, diag_ex_status[DIAG_EX_DEV_INFO], 0, 0) /* Process Storage device missing sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_STORAGE_DEV_MISS, diag_ex_status[DIAG_EX_STORAGE_DEV_MISS], 0, 0) /* Process Duplicate management IP address sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DUP_MGMT_IP_ADDR, diag_ex_status[DIAG_EX_DUP_MGMT_IP_ADDR], 0, 0) /* Get the healthStatus enum from extraData structure */ oa_soap_get_health_val(status->extraData, &health_status); /* Build health status operational sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_HEALTH_OPER, health_status, 0, 0) /* Build health status predictive failure sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_HEALTH_PRED_FAIL, health_status, 0, 0) return; } /** * process_interconnect_thermal_event * @oh_handler: Pointer to openhpi handler structure * @oa_event: Pointer to the OA event structure * * Purpose: * Processes and creates interconnect sensor thermal events * * Detailed Description: NA * * Return values: * SA_OK - success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters. * SA_ERR_HPI_INTERNAL_ERROR - on failure **/ void oa_soap_proc_interconnect_thermal(struct oh_handler_state *oh_handler, SOAP_CON *con, struct interconnectTrayStatus *response) { SaErrorT rv = SA_OK; SaHpiResourceIdT resource_id; struct oa_soap_handler *oa_handler = NULL; SaHpiInt32T bay_number; SaHpiFloat64T trigger_reading; SaHpiFloat64T trigger_threshold; struct getThermalInfo thermal_request; struct thermalInfo thermal_response; struct oa_soap_sensor_info *sensor_info = NULL; SaHpiRdrT *rdr; if (oh_handler == NULL || con== NULL || response == NULL) { err("Invalid parameters"); return; } oa_handler = (struct oa_soap_handler *) oh_handler->data; bay_number = response->bayNumber; resource_id = oa_handler-> oa_soap_resources.interconnect.resource_id[bay_number - 1]; rdr = oh_get_rdr_by_type(oh_handler->rptcache, resource_id, SAHPI_SENSOR_RDR, OA_SOAP_SEN_TEMP_STATUS); if (rdr) sensor_info = (struct oa_soap_sensor_info *) oh_get_rdr_data(oh_handler->rptcache, resource_id, rdr->RecordId); /* The payload of the thermal event received from OA contains * sensor status. Based on the sensor status, * determine the threshold which triggered the thermal event from OA. * Event with SENSOR_STATUS_CAUTION or SENSOR_STATUS_OK is * generated only if CAUTION threshold is crossed. * Event with SENSOR_STATUS_CRITICAL is generated only when CRITICAL * threshold is crossed. * Sensor current reading and trigger threshold are required for event * generation. Sensor current reading is not provided by the event, * hence make soap call to get the reading */ thermal_request.bayNumber = bay_number; thermal_request.sensorType = SENSOR_TYPE_INTERCONNECT; rv = soap_getThermalInfo(con, &thermal_request, &thermal_response); if (rv != SOAP_OK) { err("soap_getThermalInfo soap call returns error"); return; } trigger_reading = (SaHpiInt32T)thermal_response.temperatureC; if ((response->thermal == SENSOR_STATUS_CAUTION && sensor_info->current_state != SAHPI_ES_UPPER_MAJOR) || (response->thermal == SENSOR_STATUS_OK && sensor_info->current_state != SAHPI_ES_UNSPECIFIED)) { /* Trigger for this event is caution threshold */ trigger_threshold = thermal_response.cautionThreshold; } else if (response->thermal == SENSOR_STATUS_CRITICAL && sensor_info->current_state != SAHPI_ES_UPPER_CRIT) { /* Trigger for this event is critical threshold */ trigger_threshold = thermal_response.criticalThreshold; } else { dbg("Ignore the event. There is no change in the sensor state"); return; } /* Process the thermal event from OA and generate appropriate HPI event */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_TEMP_STATUS, response->thermal, trigger_reading,trigger_threshold) return; } openhpi-3.6.1/plugins/oa_soap/oa_soap_calls.h0000644000175100017510000022344012575647266020256 0ustar mohanmohan/* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Bryan Sutula * Raghavendra PG * Raghavendra MS * Anand S */ #ifndef _OA_SOAP_CALLS_H_ #define _OA_SOAP_CALLS_H_ /* Include files */ #include "oa_soap_callsupport.h" /* Maximum length of the serial number, model number and part number */ #define MAX_SERIAL_NUM_LENGTH 32 #define MAX_PART_NUM_LENGTH 32 #define MAX_MODEL_NUM_LENGTH 32 #define MAX_PRODUCT_NAME_LENGTH 32 /* Moved these #defines from oa_soap.h - which includes this header file. */ /* Max Blade in HP BladeSystem c7000 c-Class enclosure*/ #define OA_SOAP_C7000_MAX_BLADE 16 /* Max Blade in HP BladeSystem c3000 c-Class enclosure*/ #define OA_SOAP_C3000_MAX_BLADE 8 /* Data types used to help us be more consistent with the WSDL description */ typedef unsigned char byte; /* These define the SOAP commands used to talk to the OA */ #define GET_BLADE_INFO \ "" \ "%d" \ "\n" #define GET_BLADE_PORTMAP \ "" \ "%d" \ "\n" #define SUBSCRIBE_FOR_EVENTS \ "" \ "\n" #define UN_SUBSCRIBE_FOR_EVENTS \ "" \ "%d" \ "\n" #define GET_EVENT \ "" \ "%d" \ "" \ "%d" \ "%d" \ "\n" #define GET_ALL_EVENTSEX \ "" \ "%d" \ "" \ "%d" \ "%d" \ "%s" \ "\n" #define SET_BLADE_POWER \ "" \ "%d" \ "%s" \ "\n" #define SET_INTERCONNECT_TRAY_POWER \ "" \ "%d" \ "%d" \ "\n" #define RESET_INTERCONNECT_TRAY \ "" \ "%d" \ "\n" #define GET_ENCLOSURE_INFO \ "" \ "\n" #define GET_OA_STATUS \ "" \ "%d" \ "\n" #define GET_OA_INFO \ "" \ "%d" \ "\n" #define GET_OA_ID \ "" \ "\n" #define GET_POWER_CONFIG_INFO \ "" \ "\n" #define SET_POWER_CONFIG_INFO \ "" \ "%d" \ "%d" \ "%d" \ "\n" #define GET_POWER_CAP_CONFIG \ "" \ "\n" #define SET_POWER_CAP_CONFIG \ "" \ "" \ "%d" \ "" \ "%s" \ "%s" \ "%s" \ "%s" \ "%s" \ "%s" \ "%s" \ "%s" \ "%s" \ "%s" \ "%s" \ "%s" \ "%s" \ "%s" \ "%s" \ "%s" \ "" \ "%d" \ "%d" \ "" \ "\n" #define GET_INTERCONNECT_TRAY_STATUS \ "" \ "%d" \ "\n" #define GET_INTERCONNECT_TRAY_INFO \ "" \ "%d" \ "\n" #define GET_INTERCONNECT_TRAY_PORT_MAP \ "" \ "%d" \ "\n" #define GET_FAN_INFO \ "" \ "%d" \ "\n" #define GET_POWER_SUBSYSTEM_INFO \ "" \ "\n" #define GET_POWER_SUPPLY_INFO \ "" \ "%d" \ "\n" #define GET_OA_NETWORK_INFO \ "" \ "%d" \ "\n" #define GET_BLADE_STATUS \ "" \ "%d" \ "\n" #define GET_THERMAL_INFO \ "" \ "%s" \ "%d" \ "\n" #define GET_USER_INFO \ "" \ "%s" \ "\n" #define IS_VALID_SESSION \ "" \ "\n" #define GET_RACK_TOPOLOGY2 \ "" \ "\n" #define GET_BLADE_MP_INFO \ "" \ "%d" \ "\n" #define GET_THERMAL_SUBSYSTEM_INFO \ "" \ "\n" #define GET_FAN_ZONE_ARRAY \ "" \ "%s" \ "\n" #define BAY "%d" #define GET_ENCLOSURE_STATUS \ "" \ "\n" #define GET_POWER_SUPPLY_STATUS \ "" \ "%d" \ "\n" #define GET_LCD_INFO \ "" \ "\n" #define GET_LCD_STATUS \ "" \ "\n" #define GET_BLADE_THERMAL_INFO_ARRAY \ "" \ "%d" \ "\n" #define SET_ENCLOSURE_UID \ "" \ "%s" \ "\n" #define SET_OA_UID \ "" \ "%d" \ "%s" \ "\n" #define SET_BLADE_UID \ "" \ "%d" \ "%s" \ "\n" #define SET_INTERCONNECT_TRAY_UID \ "" \ "%d" \ "%s" \ "\n" #define SET_LCD_BUTTON_LOCK \ "" \ "%d" \ "\n" #define GET_BLADE_INFO_ARRAY \ "" \ "%s" \ "\n" #define GET_INTERCONNECT_TRAY_INFO_ARRAY \ "" \ "%s" \ "\n" #define GET_INTERCONNECT_TRAY_STATUS_ARRAY \ "" \ "%s" \ "\n" #define GET_INTERCONNECT_TRAY_PORTMAP_ARRAY \ "" \ "%s" \ "\n" #define GET_POWER_SUPPLY_INFO_ARRAY \ "" \ "%s" \ "\n" #define GET_POWER_SUPPLY_STATUS_ARRAY \ "" \ "%s" \ "\n" #define GET_FAN_INFO_ARRAY \ "" \ "%s" \ "\n" #define GET_OA_INFO_ARRAY \ "" \ "%s" \ "\n" #define GET_OA_STATUS_ARRAY \ "" \ "%s" \ "\n" #define GET_BLADE_STATUS_ARRAY \ "" \ "%s" \ "\n" #define GET_BLADE_PORTMAP_ARRAY \ "" \ "%s" \ "\n" /* Enumerated types used for specific SOAP commands */ #define HPOA_BOOLEAN_LENGTH 11 /* Max length of these enums + 1 */ OA_SOAP_ENUM(hpoa_boolean, HPOA_FALSE, HPOA_TRUE) OA_SOAP_ENUM(presence, PRESENCE_NO_OP, PRESENCE_UNKNOWN, ABSENT, PRESENT, SUBSUMED) OA_SOAP_ENUM(bladeType, BLADE_TYPE_NO_OP, BLADE_TYPE_UNKNOWN, BLADE_TYPE_SERVER, BLADE_TYPE_STORAGE, BLADE_TYPE_WORKSTATION, BLADE_TYPE_IO) OA_SOAP_ENUM(power, POWER_NO_OP, POWER_UNKNOWN, POWER_ON, POWER_OFF, POWER_STAGED_OFF, POWER_REBOOT) OA_SOAP_ENUM(powerState, PS_NO_OP, PS_UNKNOWN, PS_OFF, PS_LOW, PS_AUTOMATIC, PS_MAXIMUM) OA_SOAP_ENUM(shutdown, SHUTDOWN_NO_OP, SHUTDOWN_UNKNOWN, SHUTDOWN_OK, SHUTDOWN_SHUTDOWN, SHUTDOWN_THERMAL, SHUTDOWN_FAN, SHUTDOWN_RESTART) OA_SOAP_ENUM(uidStatus, UID_NO_OP, UID_UNKNOWN, UID_ON, UID_OFF, UID_BLINK, UID_DEMONSTRATION) /* Thank-you, OA team! One of the enum names here includes a '-' character, * which is illegal in an enum name. We need to keep the enum name legal in * C, yet parse a '-' character in the ASCII representations of opStatus. * If any changes are made to these values, make sure to keep both version * the same! */ enum opStatus { OP_STATUS_UNKNOWN, OP_STATUS_OTHER, OP_STATUS_OK, OP_STATUS_DEGRADED, OP_STATUS_STRESSED, OP_STATUS_PREDICTIVE_FAILURE, OP_STATUS_ERROR, OP_STATUS_NON_RECOVERABLE_ERROR, OP_STATUS_STARTING, OP_STATUS_STOPPING, OP_STATUS_STOPPED, OP_STATUS_IN_SERVICE, OP_STATUS_NO_CONTACT, OP_STATUS_LOST_COMMUNICATION, OP_STATUS_ABORTED, OP_STATUS_DORMANT, OP_STATUS_SUPPORTING_ENTITY_IN_ERROR, OP_STATUS_COMPLETED, OP_STATUS_POWER_MODE, OP_STATUS_DMTF_RESERVED, OP_STATUS_VENDER_RESERVED}; OA_SOAP_ENUM_STRING(opStatus, OP_STATUS_UNKNOWN, OP_STATUS_OTHER, OP_STATUS_OK, OP_STATUS_DEGRADED, OP_STATUS_STRESSED, OP_STATUS_PREDICTIVE_FAILURE, OP_STATUS_ERROR, OP_STATUS_NON-RECOVERABLE_ERROR, OP_STATUS_STARTING, OP_STATUS_STOPPING, OP_STATUS_STOPPED, OP_STATUS_IN_SERVICE, OP_STATUS_NO_CONTACT, OP_STATUS_LOST_COMMUNICATION, OP_STATUS_ABORTED, OP_STATUS_DORMANT, OP_STATUS_SUPPORTING_ENTITY_IN_ERROR, OP_STATUS_COMPLETED, OP_STATUS_POWER_MODE, OP_STATUS_DMTF_RESERVED, OP_STATUS_VENDER_RESERVED) OA_SOAP_ENUM(sensorStatus, SENSOR_STATUS_NO_OP, SENSOR_STATUS_UNKNOWN, SENSOR_STATUS_OK, SENSOR_STATUS_WARM, SENSOR_STATUS_CAUTION, SENSOR_STATUS_CRITICAL) OA_SOAP_ENUM(diagnosticStatus, NOT_RELEVANT, DIAGNOSTIC_CHECK_NOT_PERFORMED, NO_ERROR, ERROR) OA_SOAP_ENUM(oaRole, OA_ABSENT, STANDBY, TRANSITION, ACTIVE) OA_SOAP_ENUM(wizardStatus, WIZARD_NOT_COMPLETED, LCD_WIZARD_COMPLETE, WIZARD_SETUP_COMPLETE) OA_SOAP_ENUM(portMapStatus, UNKNOWN, OK, MISMATCH) OA_SOAP_ENUM(bladeSizeType, BLADE_SIZE_TYPE_MT, BLADE_SIZE_TYPE_1X1, BLADE_SIZE_TYPE_1X2) OA_SOAP_ENUM(bladeMezzSlotType, MEZZ_SLOT_TYPE_MT, MEZZ_SLOT_TYPE_ONE, MEZZ_SLOT_TYPE_TWO, MEZZ_SLOT_TYPE_FIXED) OA_SOAP_ENUM(bladeMezzDevType, MEZZ_DEV_TYPE_MT, MEZZ_DEV_TYPE_ONE, MEZZ_DEV_TYPE_TWO, MEZZ_DEV_TYPE_FIXED) OA_SOAP_ENUM(bladeMezzDevStatus, MEZZ_DEV_STATUS_UNKNOWN, MEZZ_DEV_STATUS_OK, MEZZ_DEV_STATUS_MISMATCH) OA_SOAP_ENUM(fabricType, FABRIC_TYPE_MT, FABRIC_TYPE_ETH, FABRIC_TYPE_FIB, FABRIC_TYPE_10GETH, FABRIC_TYPE_IFB, FABRIC_TYPE_PCI, FABRIC_TYPE_SAS, FABRIC_TYPE_MAX) OA_SOAP_ENUM(fabricStatus, FABRIC_STATUS_UNKNOWN, FABRIC_STATUS_OK, FABRIC_STATUS_MISMATCH) OA_SOAP_ENUM(interconnectTrayType, INTERCONNECT_TRAY_TYPE_NO_CONNECTION, INTERCONNECT_TRAY_TYPE_NIC, INTERCONNECT_TRAY_TYPE_FC, INTERCONNECT_TRAY_TYPE_10GETH, INTERCONNECT_TRAY_TYPE_IB, INTERCONNECT_TRAY_TYPE_PCIE, INTERCONNECT_TRAY_TYPE_SAS, INTERCONNECT_TRAY_TYPE_MAX) enum interconnectTraySizeType { INTERCONNECT_TRAY_SIZE_TYPE_MT, INTERCONNECT_TRAY_SIZE_TYPE_0X1, INTERCONNECT_TRAY_SIZE_TYPE_1X1, INTERCONNECT_TRAY_SIZE_TYPE_2x1, INTERCONNECT_TRAY_SIZE_TYPE_3x1}; OA_SOAP_ENUM_STRING(interconnectTraySizeType, INTERCONNECT_TRAY_SIZE_TYPE_MT, INTERCONNECT_TRAY_SIZE_TYPE-1X1, INTERCONNECT_TRAY_SIZE_TYPE_1X1, INTERCONNECT_TRAY_SIZE_TYPE_2X1, INTERCONNECT_TRAY_SIZE_TYPE-2x1) OA_SOAP_ENUM(interconnectTrayPassThroughEnabled, INTERCONNECT_TRAY_PASSTHROUGH_UNKNOWN, INTERCONNECT_TRAY_PASSTHROUGH_DISABLED, INTERCONNECT_TRAY_PASSTHROUGH_ENABLED) OA_SOAP_ENUM(interconnectTrayPortStatus, INTERCONNECT_TRAY_PORT_STATUS_UNKNOWN, INTERCONNECT_TRAY_PORT_STATUS_OK, INTERCONNECT_TRAY_PORT_STATUS_MISMATCH) OA_SOAP_ENUM(interconnectTrayPortEnabled, INTERCONNECT_TRAY_PORT_ENABLED_UNKNOWN, INTERCONNECT_TRAY_PORT_DISABLED, INTERCONNECT_TRAY_PORT_ENABLED) OA_SOAP_ENUM(interconnectTrayPortUidStatus, INTERCONNECT_TRAY_UID_UNKNOWN, INTERCONNECT_TRAY_UID_OFF, INTERCONNECT_TRAY_UID_ON) OA_SOAP_ENUM(interconnectTrayPortLinkLedStatus, INTERCONNECT_TRAY_LINK_LED_UNKNOWN, INTERCONNECT_TRAY_LINK_LED_OFF, INTERCONNECT_TRAY_LINK_LED_ON) OA_SOAP_ENUM(powerSystemType, SUBSYSTEM_NO_OP, SUBSYSTEM_UNKNOWN, INTERNAL_AC, INTERNAL_DC, EXTERNAL_DC) OA_SOAP_ENUM(redundancy, REDUNDANCY_NO_OP, REDUNDANCY_UNKNOWN, NOT_REDUNDANT, REDUNDANT) #define POWER_REDUNDANCY_LENGTH 42 /* Max length of these enums + 1 */ OA_SOAP_ENUM(powerRedundancy, REDUNDANT_UNKNOWN, NON_REDUNDANT, AC_REDUNDANT, POWER_SUPPLY_REDUNDANT, AC_REDUNDANT_WITH_POWER_CEILING, POWER_SUPPLY_REDUNDANT_WITH_POWER_CEILING, NON_REDUNDANT_WITH_POWER_CEILING) #define POWER_LIMIT_MODE_LENGTH 19 /* Max length of these enums + 1 */ OA_SOAP_ENUM(powerLimitMode, POWER_LIMIT_NONE, STATIC_POWER_LIMIT, DYNAMIC_POWER_CAP) #define SENSOR_TYPE_LENGTH 25 /* Max length of these enums + 1 */ OA_SOAP_ENUM(sensorType, SENSOR_TYPE_BLADE, SENSOR_TYPE_INTERCONNECT, SENSOR_TYPE_OA, SENSOR_TYPE_ENC) OA_SOAP_ENUM(userAcl, ADMINISTRATOR, OPERATOR, USER, ANONYMOUS) OA_SOAP_ENUM(lcdButton, LCD_OK, LCD_UP, LCD_DOWN, LCD_RIGHT, LCD_LEFT, LCD_USERNOTES) OA_SOAP_ENUM(lcdButtonState, CLICKED, PRESSED, RELEASED) OA_SOAP_ENUM(lcdSetupHealth, LCD_SETUP_HEALTH_UNKNOWN, LCD_SETUP_HEALTH_OK, LCD_SETUP_HEALTH_INFORMATIONAL, LCD_SETUP_HEALTH_DEGRADED, LCD_SETUP_HEALTH_FAILED) OA_SOAP_ENUM(lcdChatMessageType, STATEMENT, QUESTION, ANSWER, QUESTION_DISMISSED) OA_SOAP_ENUM(hpSimTrustMode, HPSIM_DISABLED, TRUST_BY_NAME, TRUST_BY_CERTIFICATE, TRUST_ALL) OA_SOAP_ENUM(iplDevice, IPL_NO_OP, CD, FLOPPY, HDD, USB, PXE_NIC1, PXE_NIC2, PXE_NIC3, PXE_NIC4) OA_SOAP_ENUM(oneTimeBootDevice, ONE_TIME_BOOT_NO_CHANGE, ONE_TIME_BOOT_FLOPPY, ONE_TIME_BOOT_CD, ONE_TIME_BOOT_HARD_DRIVE, ONE_TIME_BOOT_TAPE) OA_SOAP_ENUM(oneTimeBootAgent, NORMAL_BOOT_OS, SYS_PART, QUICK_DIAGS, RBSU, PXE) OA_SOAP_ENUM(powerReductionState, SPRS_NO_OP, SPRS_UNKNOWN, SPRS_FIRED, SPRS_RESTORED) OA_SOAP_ENUM(powerReductionArmedState, SPRAS_NO_OP, SPRAS_UNKNOWN, SPRAS_DISARMED, SPRAS_ARMED) OA_SOAP_ENUM(virtualMediaSupport, VM_SUPPORT_UNKNOWN, VM_DEV_ABSENT, VM_BAY_SUBSUMED, VM_SUPPORTED, VM_NOT_SUPPORTED, VM_FIRMWARE_UPDATE_NEEDED) OA_SOAP_ENUM(virtualMediaDeviceStatus, VM_DEV_STATUS_UNKNOWN, VM_DEV_STATUS_DISCONNECTED, VM_DEV_STATUS_CONNECTED, VM_DEV_STATUS_DISCONNECTING, VM_DEV_STATUS_CONNECTING) #define POWER_CONTROL_LENGTH 16 /* Max length of these enums + 1 */ OA_SOAP_ENUM(powerControl, MOMENTARY_PRESS, PRESS_AND_HOLD, COLD_BOOT, RESET) #define UID_CONTROL_LENGTH 15 /* Max length of these enums + 1 */ OA_SOAP_ENUM(uidControl, UID_CMD_TOGGLE, UID_CMD_ON, UID_CMD_OFF, UID_CMD_BLINK) OA_SOAP_ENUM(eventType, EVENT_HEARTBEAT, EVENT_ENC_STATUS, EVENT_ENC_UID, EVENT_ENC_SHUTDOWN, EVENT_ENC_INFO, EVENT_ENC_NAMES, EVENT_USER_PERMISSION, EVENT_ADMIN_RIGHTS_CHANGED, EVENT_ENC_SHUTDOWN_PENDING, EVENT_ENC_TOPOLOGY, EVENT_FAN_STATUS, EVENT_FAN_INSERTED, EVENT_FAN_REMOVED, EVENT_FAN_GROUP_STATUS, EVENT_THERMAL_STATUS, EVENT_COOLING_STATUS, EVENT_FAN_ZONE_STATUS, EVENT_PS_STATUS, EVENT_PS_INSERTED, EVENT_PS_REMOVED, EVENT_PS_REDUNDANT, EVENT_PS_OVERLOAD, EVENT_AC_FAILURE, EVENT_PS_INFO, EVENT_PS_SUBSYSTEM_STATUS, EVENT_SERVER_POWER_REDUCTION_STATUS, EVENT_INTERCONNECT_STATUS, EVENT_INTERCONNECT_RESET, EVENT_INTERCONNECT_UID, EVENT_INTERCONNECT_INSERTED, EVENT_INTERCONNECT_REMOVED, EVENT_INTERCONNECT_INFO, EVENT_INTERCONNECT_HEALTH_LED, EVENT_INTERCONNECT_THERMAL, EVENT_INTERCONNECT_CPUFAULT, EVENT_INTERCONNECT_POWER, EVENT_INTERCONNECT_PORTMAP, EVENT_BLADE_PORTMAP, EVENT_INTERCONNECT_VENDOR_BLOCK, EVENT_INTERCONNECT_HEALTH_STATE, EVENT_DEMO_MODE, EVENT_BLADE_STATUS, EVENT_BLADE_INSERTED, EVENT_BLADE_REMOVED, EVENT_BLADE_POWER_STATE, EVENT_BLADE_POWER_MGMT, EVENT_BLADE_UID, EVENT_BLADE_SHUTDOWN, EVENT_BLADE_FAULT, EVENT_BLADE_THERMAL, EVENT_BLADE_INFO, EVENT_BLADE_MP_INFO, EVENT_ILO_READY, EVENT_LCD_BUTTON, EVENT_KEYING_ERROR, EVENT_ILO_HAS_IPADDRESS, EVENT_POWER_INFO, EVENT_LCD_STATUS, EVENT_LCD_INFO, EVENT_REDUNDANCY, EVENT_ILO_DEAD, EVENT_RACK_SERVICE_STARTED, EVENT_LCD_SCREEN_REFRESH, EVENT_ILO_ALIVE, EVENT_PERSONALITY_CHECK, EVENT_BLADE_POST_COMPLETE, EVENT_BLADE_SIGNATURE_CHANGED, EVENT_BLADE_PERSONALITY_CHANGED, EVENT_BLADE_TOO_LOW_POWER, EVENT_VIRTUAL_MEDIA_STATUS, EVENT_MEDIA_DRIVE_INSERTED, EVENT_MEDIA_DRIVE_REMOVED, EVENT_MEDIA_INSERTED, EVENT_MEDIA_REMOVED, EVENT_OA_NAMES, EVENT_OA_STATUS, EVENT_OA_UID, EVENT_OA_INSERTED, EVENT_OA_REMOVED, EVENT_OA_INFO, EVENT_OA_FAILOVER, EVENT_OA_TRANSITION_COMPLETE, EVENT_OA_VCM, EVENT_NETWORK_INFO_CHANGED, EVENT_SNMP_INFO_CHANGED, EVENT_SYSLOG_CLEARED, EVENT_SESSION_CLEARED, EVENT_TIME_CHANGE, EVENT_SESSION_STARTED, EVENT_BLADE_CONNECT, EVENT_BLADE_DISCONNECT, EVENT_SWITCH_CONNECT, EVENT_SWITCH_DISCONNECT, EVENT_BLADE_CLEARED, EVENT_SWITCH_CLEARED, EVENT_ALERTMAIL_INFO_CHANGED, EVENT_LDAP_INFO_CHANGED, EVENT_EBIPA_INFO_CHANGED, EVENT_HPSIM_TRUST_MODE_CHANGED, EVENT_HPSIM_CERTIFICATE_ADDED, EVENT_HPSIM_CERTIFICATE_REMOVED, EVENT_USER_INFO_CHANGED, EVENT_BAY_CHANGED, EVENT_GROUP_CHANGED, EVENT_OA_REBOOT, EVENT_OA_LOGOFF_REQUEST, EVENT_USER_ADDED, EVENT_USER_DELETED, EVENT_USER_ENABLED, EVENT_USER_DISABLED, EVENT_GROUP_ADDED, EVENT_GROUP_DELETED, EVENT_LDAPGROUP_ADDED, EVENT_LDAPGROUP_DELETED, EVENT_LDAPGROUP_ADMIN_RIGHTS_CHANGED, EVENT_LDAPGROUP_INFO_CHANGED, EVENT_LDAPGROUP_PERMISSION, EVENT_LCDPIN, EVENT_LCD_USER_NOTES_CHANGED, EVENT_LCD_BUTTONS_LOCKED, EVENT_LCD_SCREEN_CHAT_REQUESTED, EVENT_LCD_SCREEN_CHAT_WITHDRAWN, EVENT_LCD_SCREEN_CHAT_ANSWERED, EVENT_LCD_USER_NOTES_IMAGE_CHANGED, EVENT_ENC_WIZARD_STATUS, EVENT_SSHKEYS_INSTALLED, EVENT_SSHKEYS_CLEARED, EVENT_LDAP_DIRECTORY_SERVER_CERTIFICATE_ADDED, EVENT_LDAP_DIRECTORY_SERVER_CERTIFICATE_REMOVED, EVENT_BLADE_BOOT_CONFIG, EVENT_OA_NETWORK_CONFIG_CHANGED, EVENT_HPSIM_XENAME_ADDED, EVENT_HPSIM_XENAME_REMOVED, EVENT_FLASH_PENDING, EVENT_FLASH_STARTED, EVENT_FLASH_PROGRESS, EVENT_FLASH_COMPLETE, EVENT_STANDBY_FLASH_STARTED, EVENT_STANDBY_FLASH_PROGRESS, EVENT_STANDBY_FLASH_COMPLETE, EVENT_STANDBY_FLASH_BOOTING, EVENT_STANDBY_FLASH_BOOTED, EVENT_STANDBY_FLASH_FAILED, EVENT_FLASHSYNC_BUILD, EVENT_FLASHSYNC_BUILDDONE, EVENT_FLASHSYNC_FAILED, EVENT_FLASHSYNC_STANDBY_BUILD, EVENT_FLASHSYNC_STANDBY_BUILDDONE, EVENT_FLASHSYNC_STANDBY_FAILED, EVENT_NONILO_EBIPA, EVENT_FACTORY_RESET, EVENT_BLADE_INSERT_COMPLETED, EVENT_EBIPA_INFO_CHANGED_EX, EVENT_BLADE_ESI_CHANGED, EVENT_ENC_TOPOLOGY_2, EVENT_TFA_CA_CERT_ADDED, EVENT_TFA_CA_CERT_REMOVED, EVENT_USER_CERT_ADDED, EVENT_USER_CERT_REMOVED, EVENT_PW_SETTINGS_CHANGED, EVENT_SYSLOG_SETTINGS_CHANGED, EVENT_POWERDELAY_SETTINGS_CHANGED, EVENT_USB_OA_FW_FILES, EVENT_USB_OA_CONFIG_SCRIPTS, EVENT_MEDIA_DRIVE_INSERTED2, EVENT_MEDIA_DRIVE_REMOVED2, EVENT_MEDIA_INSERTED2, EVENT_MEDIA_REMOVED2, EVENT_ENC_GRP_CAP, EVENT_BLADE_GRP_CAP_TIMEOUT, EVENT_VLAN_INFO_CHANGED, EVENT_SESSION_TIMEOUT_CHANGED, EVENT_SBL_DOMAIN_INFO_CHANGED, EVENT_FW_MGMT_SETTINGS_CHANGED, EVENT_FW_DISCOVERY, EVENT_FW_UPDATE, EVENT_NET_SERVICE_RESTART, EVENT_PS_OVERLOAD_REPAIRED, EVENT_VCM_IPV6_URL_CHANGED, EVENT_VCM_MIN_OA_FW_VER_CHANGED, EVENT_SNMPV3_INFO_CHANGED, EVENT_OA_ERS_CONFIG_CHANGED, EVENT_OA_ERS_TEST_MANUAL, EVENT_OA_ERS_DATACOLLECTION_MANUAL, EVENT_OA_ERS_DATACOLLECTION_SUCCESS, EVENT_OA_ERS_DATACOLLECTION_FAILURE, EVENT_OA_ERS_MAINTENANCE_SET, EVENT_OA_ERS_MAINTENANCE_CLEARED, EVENT_OA_ERS_STATUS, EVENT_OA_LOGIN_BANNER_SETTINGS_CHANGED, EVENT_OA_ERS_EVENTS_CLEARED, EVENT_ERS_CA_CERT_ADDED, EVENT_ERS_CA_CERT_REMOVED, EVENT_FW_MGMT_LOG_CLEARED, EVENT_FW_MGMT_ISO_STATUS, EVENT_LANG_PACK_ADDED, EVENT_LANG_PACK_REMOVED, EVENT_TCP_TIMEOUT_CHANGED, EVENT_BLADE_FQDN_INFO_REFRESH, EVENT_TRAY_FQDN_INFO_REFRESH, EVENT_VCM_FQDN_INFO_REFRESH, EVENT_EBIPAV6_INFO_CHANGED_EX) /* This is not part of the SOAP response data from the OA, but is useful * for identifying the type of data that comes back from getAllEvents(). */ OA_SOAP_ENUM(enum_eventInfo, SYSLOG, RACKTOPOLOGY, ENCLOSURESTATUS, ENCLOSUREINFO, OASTATUS, OAINFO, BLADEINFO, BLADEMPINFO, BLADESTATUS, BLADEPORTMAP, FANINFO, INTERCONNECTTRAYSTATUS, INTERCONNECTTRAYINFO, INTERCONNECTTRAYPORTMAP, POWERSUPPLYINFO, POWERSUPPLYSTATUS, POWERSUBSYSTEMINFO, POWERCONFIGINFO, THERMALINFO, USERINFOARRAY, USERINFO, LDAPINFO, LDAPGROUPINFO, SNMPINFO, ENCLOSURENETWORKINFO, OANETWORKINFO, ENCLOSURETIME, ALERTMAILINFO, PASSWORDSETTINGS, EBIPAINFO, LCDCHATMESSAGE, LCDUSERNOTES, LCDBUTTONEVENT, LCDSTATUS, LCDINFO, HPSIMINFO, THERMALSUBSYSTEMINFO, BLADEBOOTINFO, OAVCMMODE, POWERREDUCTIONSTATUS, VIRTUALMEDIASTATUS, OAMEDIADEVICE, FANZONE, EBIPAINFOEX, CACERTSINFO, RACKTOPOLOGY2, USERCERTIFICATEINFO, SYSLOGSETTINGS, POWERDELAYSETTINGS, USBMEDIAFIRMWAREIMAGES, CONFIGSCRIPTS, NUMVALUE, STRING, MESSAGE, NOPAYLOAD, POWERCAPCONFIG) OA_SOAP_ENUM(enum_usbMode, USB_KVM_ENABLED, USB_DVD_ENABLED) OA_SOAP_ENUM(enum_networkProtocol, NET_PROTO_SNMP, NET_PROTO_SSH, NET_PROTO_TELNET, NET_PROTO_HTTP, NET_PROTO_NTP, NET_PROTO_IPSECURITY, NET_PROTO_ALERTMAIL, NET_PROTO_EBIPA_SVB, NET_PROTO_EBIPA_SWM, NET_PROTO_XMLREPLY, NET_PROTO_DYNDNS, NET_PROTO_LLF, NET_PROTO_IPSWAP) OA_SOAP_ENUM(enum_nicSpeed, NIC_SPEED_10, NIC_SPEED_100, NIC_SPEED_1000, NIC_SPEED_10000) OA_SOAP_ENUM(enum_nicDuplex, NIC_DUPLEX_HALF, NIC_DUPLEX_FULL) OA_SOAP_ENUM(enum_fileType, FIRMWARE_IMAGE, LCD_IMAGE, CONFIG_SCRIPT, SSH_KEYS_FILE, SSL_CERTIFICATE, LDAP_DIRECTORY_SERVER_CERTIFICATE, HPSIM_CERTIFICATE, FIRMWARE_INTERNAL_IMAGE, PROLIANT_MP_IMAGE) /* Structures that return information from OA SOAP calls */ struct bladeCpuInfo { char *cpuType; int cpuSpeed; }; struct bladeNicInfo { char *port; char *macAddress; }; struct extraDataInfo { char *name; char *value; }; struct bladeInfo { byte bayNumber; enum presence presence; enum bladeType bladeType; byte width; byte height; char *name; char *manufacturer; char *partNumber; char *sparePartNumber; char *serialNumber; char *serverName; char *uuid; char *rbsuOsName; char *assetTag; char *romVersion; byte numberOfCpus; xmlNode *cpus; int memory; byte numberOfNics; xmlNode *nics; short mmHeight; short mmWidth; short mmDepth; int deviceId; int productId; xmlNode *extraData; /* Items are struct extraDataInfo */ }; /* Structures that supply information to OA SOAP calls */ struct getBladeInfo { int bayNumber; }; /* Structures that supply information to OA SOAP calls */ struct getBladePortMap { int bayNumber; }; struct diagnosticChecks { enum diagnosticStatus internalDataError; enum diagnosticStatus managementProcessorError; enum diagnosticStatus thermalWarning; enum diagnosticStatus thermalDanger; enum diagnosticStatus ioConfigurationError; enum diagnosticStatus devicePowerRequestError; enum diagnosticStatus insufficientCooling; enum diagnosticStatus deviceLocationError; enum diagnosticStatus deviceFailure; enum diagnosticStatus deviceDegraded; enum diagnosticStatus acFailure; enum diagnosticStatus i2cBuses; enum diagnosticStatus redundancy; }; struct diagnosticData { enum diagnosticStatus value; char *name; }; struct bladeStatus { byte bayNumber; enum presence presence; enum opStatus operationalStatus; enum sensorStatus thermal; enum power powered; enum powerState powerState; enum shutdown shutdown; enum uidStatus uid; int powerConsumed; struct diagnosticChecks diagnosticChecks; xmlNode *diagnosticChecksEx; /* Items are struct diagnosticData */ xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct getBladeStatus { int bayNumber; }; struct syslog { byte bayNumber; int syslogStrlen; char *logContents; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct encLink { byte enclosureNumber; char *oaName; char *uuid; char *rackName; char *enclosureName; char *url; enum hpoa_boolean local; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct rackTopology { char *ruid; xmlNode *enclosures; /* Items are struct encLink */ xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct enclosureStatus { enum opStatus operationalStatus; enum uidStatus uid; enum wizardStatus wizardStatus; struct diagnosticChecks diagnosticChecks; xmlNode *diagnosticChecksEx; /* Items are struct diagnosticData */ xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct enclosureInfo { char *rackName; char *enclosureName; char *hwVersion; byte bladeBays; byte fanBays; byte powerSupplyBays; byte thermalSensors; byte interconnectTrayBays; byte oaBays; char *name; char *partNumber; char *serialNumber; char *uuid; char *assetTag; char *manufacturer; char *chassisSparePartNumber; char *interposerManufacturer; char *interposerName; char *interposerPartNumber; char *interposerSerialNumber; char *pduType; short mmHeight; short mmWidth; short mmDepth; char *pduPartNumber; char *pduSparePartNumber; xmlNode *extraData; /* Items are struct extraDataInfo */ int powerType; int enclosureStatus; }; struct oaStatus { byte bayNumber; char *oaName; enum oaRole oaRole; enum opStatus operationalStatus; enum uidStatus uid; byte restartCause; enum hpoa_boolean oaRedundancy; struct diagnosticChecks diagnosticChecks; xmlNode *diagnosticChecksEx; /* Items are struct diagnosticData */ xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct getOaStatus { int bayNumber; }; struct oaInfo { byte bayNumber; enum hpoa_boolean youAreHere; char *name; char *partNumber; char *sparePartNumber; char *serialNumber; char *uuid; char *assetTag; char *manufacturer; char *hwVersion; char *fwVersion; short mmHeight; short mmWidth; short mmDepth; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct OaId { byte bayNumber; }; struct getOaInfo { int bayNumber; }; struct getBladeMpInfo { int bayNumber; }; struct bladeMpInfo { byte bayNumber; char *ipAddress; char *macAddress; char *dnsName; char *modelName; char *fwVersion; char *remoteConsoleUrl; char *webUrl; char *ircUrl; char *loginUrl; char *ircFullUrl; char *remoteSerialUrl; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct bladeMezzSlotPort { char *slotNumber; char *interconnectTrayBayNumber; char *interconnectTrayPortNumber; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct bladeMezzSlotInfo { enum bladeMezzSlotType type; int sizeslot; xmlNode *slot; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct bladeMezzDevPort { char *portNumber; char *wwpn; enum fabricType fabric; enum fabricStatus status; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct bladeMezzDevInfo { char *name; enum bladeMezzDevType type; enum bladeMezzDevStatus status; int sizeport; xmlNode *port; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct bladeMezzInfo { char *mezzNumber; xmlNode *mezzSlots; xmlNode *mezzDevices; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct bladePortMap { char *bladeBayNumber; enum portMapStatus status; enum bladeSizeType bladeSizeType; char *numberOfMezzes; xmlNode *mezz; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct fanInfo { byte bayNumber; enum presence presence; char *name; char *partNumber; char *sparePartNumber; char *serialNumber; int powerConsumed; int fanSpeed; int maxFanSpeed; int lowLimitFanSpeed; enum opStatus operationalStatus; struct diagnosticChecks diagnosticChecks; xmlNode *diagnosticChecksEx; /* Items are struct diagnosticData */ xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct getFanInfo { int bayNumber; }; struct portEnabled { byte portNumber; enum hpoa_boolean enabled; }; struct interconnectTrayStatus { byte bayNumber; enum opStatus operationalStatus; enum presence presence; enum sensorStatus thermal; enum hpoa_boolean cpuFault; enum hpoa_boolean healthLed; enum uidStatus uid; enum power powered; xmlNode *ports; /* Items are struct portEnabled */ struct diagnosticChecks diagnosticChecks; xmlNode *diagnosticChecksEx; /* Items are struct diagnosticData */ xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct getInterconnectTrayStatus { int bayNumber; }; struct interconnectTrayInfo { byte bayNumber; enum interconnectTrayType interconnectTrayType; enum hpoa_boolean passThroughSupport; enum hpoa_boolean portDisableSupport; enum hpoa_boolean temperatureSensorSupport; byte width; char *manufacturer; char *name; char *partNumber; char *serialNumber; char *sparePartNumber; enum hpoa_boolean rs232PortRoute; enum hpoa_boolean ethernetPortRoute; char *userAssignedName; char *inBandIpAddress; char *urlToMgmt; int powerOnWatts; int powerOffWatts; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct getInterconnectTrayInfo { int bayNumber; }; struct interconnectTrayPortInfo { byte interconnectTraySlotPortNumber; byte bladeBayNumber; byte bladeMezzNumber; byte bladeMezzPortNumber; enum interconnectTrayPortStatus portStatus; enum interconnectTrayPortEnabled portEnabled; enum interconnectTrayPortUidStatus portUidStatus; enum interconnectTrayPortLinkLedStatus portLinkLedStatus; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct interconnectTraySlotInfo { byte interconnectTraySlotNumber; enum interconnectTrayType type; int sizeport; xmlNode *port; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct interconnectTrayPortMap { byte interconnectTrayBayNumber; enum portMapStatus status; enum interconnectTraySizeType sizeType; enum interconnectTrayPassThroughEnabled passThroughModeEnabled; byte numberOfSlots; int sizeslot; xmlNode *slot; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct powerSupplyInfo { byte bayNumber; enum presence presence; char modelNumber[MAX_MODEL_NUM_LENGTH]; char sparePartNumber[MAX_PART_NUM_LENGTH]; char productName[MAX_PRODUCT_NAME_LENGTH]; char serialNumber[MAX_SERIAL_NUM_LENGTH]; int capacity; int actualOutput; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct getPowerSupplyInfo { int bayNumber; }; struct getPowerSupplyStatus { int bayNumber; }; struct powerSupplyStatus { byte bayNumber; enum presence presence; enum opStatus operationalStatus; enum opStatus inputStatus; struct diagnosticChecks diagnosticChecks; xmlNode *diagnosticChecksEx; /* Items are struct diagnosticData */ xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct powerSubsystemInfo { enum powerSystemType subsystemType; enum opStatus operationalStatus; enum redundancy redundancy; enum powerRedundancy redundancyMode; int capacity; int redundantCapacity; int outputPower; int powerConsumed; float inputPowerVa; float inputPowerCapacityVa; float inputPower; float inputPowerCapacity; byte goodPowerSupplies; byte wantedPowerSupplies; byte neededPowerSupplies; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct powerConfigInfo { int powerCeiling; enum powerRedundancy redundancyMode; enum hpoa_boolean dynamicPowerSaverEnabled; xmlNode *extraData; /* Items are struct extraDataInfo */ /* These are needed as high/low limits of the analog control RDRs */ /* static power limit. */ int ACLimitLow; int ACLimitHigh; }; struct powerCapConfig { int enclosureMinWattageMeasured; int enclosureMaxWattageMeasured; int enclosurePowerCapLowerBound; int enclosurePowerCapUpperBound; enum hpoa_boolean enclosureHighLine; int enclosureAcPhaseType; int enclosureEstimatedVoltage; int powerCap; /* optOutBayArray holds true or false for each bay */ char optOutBayArray[OA_SOAP_C7000_MAX_BLADE][8]; /* Items are struct extraDataInfo */ xmlNode *extraData; /* The following are needed to hold values associated with */ /* the derated and rated circuit caps. */ int deratedCircuitCap; int ratedCircuitCap; int deratedCircuitCapLowerBound; int deratedCircuitCapUpperBound; int ratedCircuitCapLowerBound; int ratedCircuitCapUpperBound; }; struct thermalInfo { enum sensorType sensorType; byte bayNumber; enum sensorStatus sensorStatus; enum opStatus operationalStatus; byte temperatureC; byte cautionThreshold; byte criticalThreshold; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct getThermalInfo { enum sensorType sensorType; int bayNumber; }; struct bayAccess { byte bayNumber; enum hpoa_boolean access; }; struct enclosureBaysSelection { enum hpoa_boolean oaAccess; xmlNode *bladeBays; /* Items are struct bayAccess */ xmlNode *interconnectTrayBays; /* Items are struct bayAccess */ xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct userInfo { char *username; char *fullname; char *contactInfo; enum hpoa_boolean isEnabled; enum userAcl acl; struct enclosureBaysSelection bayPermissions; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct getUserInfo { char *username; }; struct x509CertificateInfo { byte certificateVersion; char *issuerOrganization; char *issuerOrganizationalUnit; char *issuerCommonName; char *subjectOrganization; char *subjectOrganizationalUnit; char *subjectCommonName; time_t validFrom; time_t validTo; char *serialNumber; int extensionCount; char *md5Fingerprint; char *sha1Fingerprint; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct certificates { int numberOfCertificates; int sizecertificate; xmlNode *certificate; /* Items are struct x509CertificateInfo */ xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct ldapInfo { enum hpoa_boolean ldapEnabled; enum hpoa_boolean localUsersEnabled; char *directoryServerAddress; short directoryServerSslPort; char *searchContext1; char *searchContext2; char *searchContext3; enum hpoa_boolean userNtAccountNameMapping; struct certificates certificates; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct ldapGroupInfo { char *ldapGroupName; char *description; enum userAcl acl; struct enclosureBaysSelection bayPermissions; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct trapInfo { char *ipAddress; char *community; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct snmpInfo { char *sysName; char *sysLocation; char *sysContact; char *roCommunity; char *rwCommunity; int numTraps; xmlNode *traps; /* Items are struct trapInfo */ xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct enclosureNetworkInfo { xmlNode *ntpServers; /* Items are char *ipAddress */ int ntpPoll; xmlNode *ipAllow; /* Items are char *ipAddress */ enum hpoa_boolean httpsEnabled; enum hpoa_boolean snmpEnabled; enum hpoa_boolean sshEnabled; enum hpoa_boolean telnetEnabled; enum hpoa_boolean ntpEnabled; enum hpoa_boolean ipSecurityEnabled; enum hpoa_boolean alertmailEnabled; enum hpoa_boolean ebipaSvbEnabled; enum hpoa_boolean ebipaSwmEnabled; enum hpoa_boolean xmlReplyEnabled; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct oaNetworkInfo { byte bayNumber; enum hpoa_boolean dhcpEnabled; enum hpoa_boolean dynDnsEnabled; char *macAddress; char *ipAddress; char ipv6Address0[255]; char ipv6Address1[255]; char ipv6Address2[255]; char ipv6Address3[255]; char *ipv6AddressType0; char *ipv6AddressType1; char *ipv6AddressType2; char *ipv6AddressType3; char *netmask; char *gateway; xmlNode *dns; /* Items are char *ipAddress */ char *elinkIpAddress; enum hpoa_boolean linkActive; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct getOaNetworkInfo { int bayNumber; }; struct enclosureTime { time_t dateTime; char *timeZone; time_t universalDateTime; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct alertmailInfo { char *server; char *receiver; char *domain; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct ebipaInfo { char *svbIpAddress; char *svbNetmask; char *svbGateway; char *svbDomain; xmlNode *svbDns; /* Items are char *ipAddress */ xmlNode *svbNtpServer; /* Items are char *ipAddress */ char *swmIpAddress; char *swmNetmask; char *swmGateway; char *swmDomain; xmlNode *swmDns; /* Items are char *ipAddress */ xmlNode *swmNtpServer; /* Items are char *ipAddress */ enum hpoa_boolean isConfiguredSvb; enum hpoa_boolean isConfiguredSwm; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct lcdChatMessage { enum lcdChatMessageType lcdChatMessageType; char *screenName; char *questionText; char *answerChoiceList; char *selectedAnswerText; char *customAnswerText; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct lcdUserNotes { char *lcdUserNotesLine1; char *lcdUserNotesLine2; char *lcdUserNotesLine3; char *lcdUserNotesLine4; char *lcdUserNotesLine5; char *lcdUserNotesLine6; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct lcdButtonEvent { enum lcdButton button; enum lcdButtonState buttonState; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct lcdStatus { enum opStatus status; enum uidStatus display; enum hpoa_boolean lcdPin; enum hpoa_boolean buttonLock; enum lcdSetupHealth lcdSetupHealth; struct diagnosticChecks diagnosticChecks; xmlNode *diagnosticChecksEx; /* Items are struct diagnosticData */ xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct lcdInfo { char *name; char *partNumber; char *manufacturer; char *fwVersion; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct hpSimInfo { enum hpSimTrustMode trustMode; struct certificates certificates; xmlNode *xeNameList; /* Items are char *xeName */ xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct thermalSubsystemInfo { enum opStatus operationalStatus; enum redundancy redundancy; byte goodFans; byte wantedFans; byte neededFans; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct bladeIpl { enum iplDevice iplDevice; byte bootPriority; }; struct bladeBootInfo { byte numberOfIpls; xmlNode *ipls; /* Items are struct bladeIpl */ byte lastIplDeviceBooted; enum oneTimeBootDevice oneTimeBootDevice; enum oneTimeBootAgent oneTimeBootAgent; enum hpoa_boolean oneTimeBypassF1F2Messages; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct oaVcmMode { enum hpoa_boolean isVcmMode; char *vcmUrl; char *vcmDomainId; char *vcmDomainName; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct powerReductionStatus { enum powerReductionState powerReductionState; enum powerReductionArmedState powerReductionArmedState; enum powerReductionState powerReductionFiredState; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct virtualMediaStatus { byte bayNumber; enum virtualMediaSupport support; enum virtualMediaDeviceStatus cdromStatus; char *cdromUrl; enum virtualMediaDeviceStatus floppyStatus; char *floppyUrl; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct fanZone { byte zoneNumber; enum redundancy redundant; enum opStatus operationalStatus; int targetRpm; int targetPwm; xmlNode *deviceBayArray; /* Items are byte bay */ xmlNode *fanInfoArray; /* Items are struct fanInfo */ xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct deviceBayArray { xmlNode *bay; /* Items are byte (bay) */ }; struct fanInfoArray{ xmlNode *fanInfo; /* Items are struct fanInfo */ }; struct ebipaBay { int bayNumber; enum hpoa_boolean enabled; char *ipAddress; }; struct ebipaInfoEx { struct ebipaInfo info; xmlNode *deviceBays; /* Items are struct ebipaBay */ xmlNode *interconnectBays; /* Items are struct ebipaBay */ }; struct eventPid { int pid; }; struct unSubscribeForEvents { int pid; }; struct syslogSettings { char *syslogServer; int syslogPort; enum hpoa_boolean remoteEnabled; }; struct encLinkOa { enum hpoa_boolean activeOa; int bayNumber; char *oaName; char *ipAddress; char *macAddress; char *fwVersion; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct encLink2 { int enclosureNumber; int productId; int mfgId; char *enclosureUuid; char *enclosureSerialNumber; char *enclosureName; char *enclosureProductName; enum opStatus enclosureStatus; char *enclosureRackIpAddress; char *enclosureUrl; char *rackName; enum hpoa_boolean primaryEnclosure; xmlNode *encLinkOa; /* Items are struct encLinkOa */ xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct rackTopology2 { char *ruid; xmlNode *enclosures; /* Items are struct encLink2 */ xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct passwordSettings { enum hpoa_boolean strictPasswordsEnabled; int minPasswordLength; }; struct oaMediaDevice { int bayNumber; int deviceIndex; int deviceType; enum presence devicePresence; enum presence mediaPresence; char *volumeLabel; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct firmwareImage { char *fileName; char *fwVersion; }; struct usbMediaFirmwareImages { xmlNode *image; /* Items are struct firmwareImage */ xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct usbMediaConfigScript { char *fileName; }; struct usbMediaConfigScripts { xmlNode *usbMediaConfigScript; /* Items are * struct usbMediaConfigScript */ xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct tfaSettings { enum hpoa_boolean enableTwoFactor; enum hpoa_boolean enableCrl; enum hpoa_boolean subjectAltName; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct userCertificateInfo { char *fingerprint; }; struct caCertsInfo { xmlNode *certificates; }; struct powerdelayBay { int bayNumber; int delay; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct powerdelaySettings { enum hpoa_boolean isPowerdelayInProgress; xmlNode *interconnects; /* Items are struct powerdelayBay */ xmlNode *servers; /* Items are struct powerdelayBay */ xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct getFanZoneArrayResponse { xmlNode *fanZoneArray; /* Items are struct fanZone */ }; struct getBladeInfoArrayResponse { xmlNode *bladeInfoArray; /* Items are struct bladeInfo */ }; struct interconnectTrayInfoArrayResponse { xmlNode *interconnectTrayInfoArray; }; struct interconnectTrayStsArrayResponse { xmlNode *interconnectTrayStsArray; }; struct interconnectTrayPmArrayResponse { xmlNode *interconnectTrayPmArray; }; struct getPowerSupplyInfoArrayResponse { xmlNode *powerSupplyInfoArray; }; struct getPowerSupplyStsArrayResponse { xmlNode *powerSupplyStsArray; }; struct getFanInfoArrayResponse { xmlNode *fanInfoArray; }; struct getOaInfoArrayResponse { xmlNode *oaInfoArray; }; struct getOaStatusArrayResponse { xmlNode *oaStatusArray; }; struct getBladePortMapArrayResponse { xmlNode *portMapArray; }; struct getBladeStsArrayResponse { xmlNode *bladeStsArray; }; struct bayArray { int size; /* Size of array */ byte *array; /* Actual array */ }; struct getFanZoneArray { struct bayArray bayArray; }; struct getBladeInfoArray { struct bayArray bayArray; }; struct getInterconnectTrayInfoArray { struct bayArray bayArray; }; struct interconnectTrayStsArray { struct bayArray bayArray; }; struct interconnectTrayPmArray { struct bayArray bayArray; }; struct getPowerSupplyInfoArray { struct bayArray bayArray; }; struct getPowerSupplyStsArray { struct bayArray bayArray; }; struct getFanInfoArray { struct bayArray bayArray; }; struct getOaInfoArray { struct bayArray bayArray; }; struct getOaStatusArray { struct bayArray bayArray; }; struct getBladePortMapArray { struct bayArray bayArray; }; struct getBladeStsArray { struct bayArray bayArray; }; struct getEvent { int pid; enum hpoa_boolean waitTilEventHappens; enum hpoa_boolean lcdEvents; }; struct getAllEventsEx { int pid; enum hpoa_boolean waitTilEventHappens; enum hpoa_boolean lcdEvents; char *oaFwVersion; }; union _hpoa__data { struct syslog syslog; struct rackTopology rackTopology; struct enclosureStatus enclosureStatus; struct enclosureInfo enclosureInfo; struct oaStatus oaStatus; struct oaInfo oaInfo; struct bladeInfo bladeInfo; struct bladeMpInfo bladeMpInfo; struct bladeStatus bladeStatus; struct bladePortMap bladePortMap; struct fanInfo fanInfo; struct interconnectTrayStatus interconnectTrayStatus; struct interconnectTrayInfo interconnectTrayInfo; struct interconnectTrayPortMap interconnectTrayPortMap; struct powerSupplyInfo powerSupplyInfo; struct powerSupplyStatus powerSupplyStatus; struct powerSubsystemInfo powerSubsystemInfo; struct powerConfigInfo powerConfigInfo; struct powerCapConfig powerCapConfig; struct thermalInfo thermalInfo; xmlNode *userInfoArray; /* Items are struct userInfo */ struct userInfo userInfo; struct ldapInfo ldapInfo; struct ldapGroupInfo ldapGroupInfo; struct snmpInfo snmpInfo; struct enclosureNetworkInfo enclosureNetworkInfo; struct oaNetworkInfo oaNetworkInfo; struct enclosureTime enclosureTime; struct alertmailInfo alertmailInfo; struct passwordSettings passwordSettings; struct ebipaInfo ebipaInfo; struct lcdChatMessage lcdChatMessage; struct lcdUserNotes lcdUserNotes; struct lcdButtonEvent lcdButtonEvent; struct lcdStatus lcdStatus; struct lcdInfo lcdInfo; struct hpSimInfo hpSimInfo; struct thermalSubsystemInfo thermalSubsystemInfo; struct bladeBootInfo bladeBootInfo; struct oaVcmMode oaVcmMode; struct powerReductionStatus powerReductionStatus; struct virtualMediaStatus virtualMediaStatus; struct oaMediaDevice oaMediaDevice; struct fanZone fanZone; struct ebipaInfoEx ebipaInfoEx; struct caCertsInfo caCertsInfo; struct rackTopology2 rackTopology2; struct userCertificateInfo userCertificateInfo; struct syslogSettings syslogSettings; struct powerdelaySettings powerdelaySettings; struct usbMediaFirmwareImages usbMediaFirmwareImages; struct usbMediaConfigScripts configScripts; int numValue; char *string; char *message; char *noPayload; }; struct eventInfo { enum eventType event; time_t eventTimeStamp; int queueSize; int numValue; union _hpoa__data eventData; enum enum_eventInfo enum_eventInfo; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct getAllEventsResponse { xmlNode *eventInfoArray; }; struct getBladeThermalInfoArray { int bayNumber; }; struct bladeThermalInfoArrayResponse { xmlNode *bladeThermalInfoArray; /* Items are struct bladeThermalInfo */ }; struct bladeThermalInfo { byte sensorNumber; byte sensorType; byte entityId; byte entityInstance; byte criticalThreshold; byte cautionThreshold; byte temperatureC; byte oem; char *description; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct setBladePower { int bayNumber; enum powerControl power; }; struct setInterconnectTrayPower { int bayNumber; enum hpoa_boolean on; }; struct resetInterconnectTray { int bayNumber; }; struct setEnclosureUid { enum uidControl uid; }; struct setOaUid { int bayNumber; enum uidControl uid; }; struct setBladeUid { int bayNumber; enum uidControl uid; }; struct setInterconnectTrayUid { int bayNumber; enum uidControl uid; }; /* Main OA SOAP Function prototypes */ int soap_subscribeForEvents(SOAP_CON *connection, struct eventPid *response); int soap_unSubscribeForEvents(SOAP_CON *connection, const struct unSubscribeForEvents *request); int soap_getEvent(SOAP_CON *connection, const struct getEvent *request, struct eventInfo *response); int soap_getAllEventsEx(SOAP_CON *connection, const struct getAllEventsEx *request, struct getAllEventsResponse *response); int soap_getBladeInfo(SOAP_CON *connection, const struct getBladeInfo *request, struct bladeInfo *response); int soap_getBladePortMap(SOAP_CON *connection, const struct getBladeInfo *request, struct bladePortMap *response); int soap_getBladeMpInfo(SOAP_CON *connection, const struct getBladeMpInfo *request, struct bladeMpInfo *response); int soap_getEnclosureInfo(SOAP_CON *connection, struct enclosureInfo *response); int soap_getPowerConfigInfo(SOAP_CON *connection, struct powerConfigInfo *response, uint *desired_static_pwr_limit); int soap_setPowerConfigInfo(SOAP_CON *connection, const struct powerConfigInfo *request); int soap_getPowerCapConfig(SOAP_CON *connection, struct powerCapConfig *response, uint *desired_dynamic_pwr_cap_limit, uint *desired_derated_circuit_cap, uint *desired_rated_circuit_cap); int soap_setPowerCapConfig(SOAP_CON *connection, const struct powerCapConfig *request); int soap_getOaStatus(SOAP_CON *connection, const struct getOaStatus *request, struct oaStatus *response); int soap_getOaInfo(SOAP_CON *connection, const struct getOaInfo *request, struct oaInfo *response); int soap_getOaId(SOAP_CON *connection, struct OaId *oaId); int soap_getInterconnectTrayStatus(SOAP_CON *connection, const struct getInterconnectTrayStatus *request, struct interconnectTrayStatus *response); int soap_getInterconnectTrayInfo(SOAP_CON *connection, const struct getInterconnectTrayInfo *request, struct interconnectTrayInfo *response); int soap_getFanInfo(SOAP_CON *connection, const struct getFanInfo *request, struct fanInfo *response); int soap_getPowerSubsystemInfo(SOAP_CON *connection, struct powerSubsystemInfo *response); int soap_getPowerSupplyInfo(SOAP_CON *connection, const struct getPowerSupplyInfo *request, struct powerSupplyInfo *response); int soap_getOaNetworkInfo(SOAP_CON *connection, const struct getOaNetworkInfo *request, struct oaNetworkInfo *response); int soap_getBladeStatus(SOAP_CON *connection, const struct getBladeStatus *request, struct bladeStatus *response); int soap_setBladePower(SOAP_CON *connection, const struct setBladePower *request); int soap_setInterconnectTrayPower(SOAP_CON *connection, const struct setInterconnectTrayPower *request); int soap_resetInterconnectTray(SOAP_CON *connection, const struct resetInterconnectTray *request); int soap_getThermalInfo(SOAP_CON *connection, const struct getThermalInfo *request, struct thermalInfo *response); int soap_getUserInfo(SOAP_CON *connection, const struct getUserInfo *request, struct userInfo *response); int soap_isValidSession(SOAP_CON *connection); int soap_getRackTopology2(SOAP_CON *con, struct rackTopology2 *response); int soap_getThermalSubsystemInfo(SOAP_CON *con, struct thermalSubsystemInfo *response); int soap_getFanZoneArray(SOAP_CON *con, const struct getFanZoneArray *request, struct getFanZoneArrayResponse *response); int soap_getEnclosureStatus(SOAP_CON *con, struct enclosureStatus *response); int soap_getLcdInfo(SOAP_CON *con, struct lcdInfo *response); int soap_getLcdStatus(SOAP_CON *con, struct lcdStatus *response); int soap_getPowerSupplyStatus(SOAP_CON *con, const struct getPowerSupplyStatus *request, struct powerSupplyStatus *response); int soap_setEnclosureUid(SOAP_CON *con, const struct setEnclosureUid *request); int soap_setOaUid(SOAP_CON *con, const struct setOaUid *request); int soap_setBladeUid(SOAP_CON *connection, const struct setBladeUid *request); int soap_setInterconnectTrayUid(SOAP_CON *con, const struct setInterconnectTrayUid *request); int soap_setLcdButtonLock(SOAP_CON *con, enum hpoa_boolean buttonLock); int soap_getBladeThermalInfoArray(SOAP_CON *con, struct getBladeThermalInfoArray *request, struct bladeThermalInfoArrayResponse *response); int soap_getInterconnectTrayPortMap(SOAP_CON *con, const struct getInterconnectTrayInfo *request, struct interconnectTrayPortMap *response); int soap_getPowerSupplyInfoArray(SOAP_CON *con, const struct getPowerSupplyInfoArray *request, struct getPowerSupplyInfoArrayResponse *response, xmlDocPtr ps_info_doc); int soap_getPowerSupplyStatusArray(SOAP_CON *con, const struct getPowerSupplyStsArray *request, struct getPowerSupplyStsArrayResponse *response, xmlDocPtr ps_sts_doc); int soap_getFanInfoArray(SOAP_CON *con, const struct getFanInfoArray *request, struct getFanInfoArrayResponse *response, xmlDocPtr fan_info_doc); int soap_getBladeInfoArray(SOAP_CON *con, const struct getBladeInfoArray *request, struct getBladeInfoArrayResponse *response, xmlDocPtr bl_info_doc); int soap_getBladeStatusArray(SOAP_CON *con, const struct getBladeStsArray *request, struct getBladeStsArrayResponse *response, xmlDocPtr bl_sts_doc); int soap_getBladePortMapArray(SOAP_CON *con, const struct getBladePortMapArray *request, struct getBladePortMapArrayResponse *response, xmlDocPtr bl_pm_doc); int soap_getInterconnectTrayInfoArray(SOAP_CON *con, const struct getInterconnectTrayInfoArray *request, struct interconnectTrayInfoArrayResponse *response, xmlDocPtr intr_info_doc); int soap_getInterconnectTrayStatusArray(SOAP_CON *con, const struct interconnectTrayStsArray *request, struct interconnectTrayStsArrayResponse *response, xmlDocPtr intr_sts_doc); int soap_getInterconnectTrayPortMapArray(SOAP_CON *con, const struct interconnectTrayPmArray *request, struct interconnectTrayPmArrayResponse *response, xmlDocPtr intr_pm_doc); int soap_getOaInfoArray(SOAP_CON *con, const struct getOaInfoArray *request, struct getOaInfoArrayResponse *response, xmlDocPtr oa_info_doc); int soap_getOaStatusArray(SOAP_CON *con, const struct getOaStatusArray *request, struct getOaStatusArrayResponse *response, xmlDocPtr oa_sts_doc); /* Function prototypes for OA SOAP helper functions */ void soap_getExtraData(xmlNode *extraData, struct extraDataInfo *result); void soap_getDiagnosticChecksEx(xmlNode *diag, struct diagnosticData *result); void soap_getBladeCpuInfo(xmlNode *cpus, struct bladeCpuInfo *result); void soap_getBladeNicInfo(xmlNode *nics, struct bladeNicInfo *result); void soap_getBladeMezzInfo(xmlNode *mezz, struct bladeMezzInfo *result); void soap_getBladeMezzDevInfo(xmlNode *mezzDevices, struct bladeMezzDevInfo *result); void soap_getBladeMezzSlotInfo(xmlNode *mezzSlots, struct bladeMezzSlotInfo *result); void soap_getBladeMezzSlotPort(xmlNode *slot, struct bladeMezzSlotPort *result); void soap_getBladeMezzDevPort(xmlNode *port, struct bladeMezzDevPort *result); void soap_getInterconnectTraySlotInfo(xmlNode *slot, struct interconnectTraySlotInfo *result); void soap_getInterconnectTrayPortInfo(xmlNode *port, struct interconnectTrayPortInfo *result); void soap_getDiagnosticData(xmlNode *data, struct diagnosticData *result); void soap_getBayAccess(xmlNode *bay, struct bayAccess *result); void soap_getEncLink(xmlNode *data, struct encLink *result); void soap_getPortEnabled(xmlNode *data, struct portEnabled *result); void soap_getIpAddress(xmlNode *ips, char **result); void soap_getEventInfo(xmlNode *events, struct eventInfo *result); void soap_getEncLinkOa(xmlNode *data, struct encLinkOa *result); void soap_getEncLink2(xmlNode *data, struct encLink2 *result); void soap_fanZone(xmlNode *fanZone, struct fanZone *result); void soap_fanInfo(xmlNode *fanZone, struct fanInfo *result); void soap_deviceBayArray(xmlNode *node, byte *bay); void soap_bladeThermalInfo(xmlNode *node, struct bladeThermalInfo *result); void parse_powerSupplyInfo(xmlNode *node,struct powerSupplyInfo *response); void parse_powerSupplyStatus(xmlNode *node, struct powerSupplyStatus *response); void parse_bladeInfo(xmlNode *node, struct bladeInfo *response); void parse_interconnectTrayInfo(xmlNode *node,struct interconnectTrayInfo *); void parse_interconnectTrayStatus(xmlNode *node, struct interconnectTrayStatus *); void parse_oaInfo(xmlNode *node, struct oaInfo *response); void parse_oaStatus(xmlNode *node, struct oaStatus *response); void parse_bladeStatus(xmlNode *node, struct bladeStatus *response); void parse_bladePortMap(xmlNode *node, struct bladePortMap *response); void parse_interconnectTrayPortMap(xmlNode *portmap, struct interconnectTrayPortMap *result); #endif /* _INC_OASOAP_CALLS_H_ */ openhpi-3.6.1/plugins/oa_soap/oa_soap_load_id.h0000644000175100017510000000412612575647270020544 0ustar mohanmohan/* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. */ #ifndef _OA_SOAP_LOAD_ID_H #define _OA_SOAP_LOAD_ID_H /* Include files */ #include #include SaErrorT oa_soap_load_id_get(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiLoadIdT load_id); SaErrorT oa_soap_load_id_set(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiLoadIdT *load_id); #endif openhpi-3.6.1/plugins/oa_soap/oa_soap_re_discover.h0000644000175100017510000001142712575647270021457 0ustar mohanmohan/* * Copyright (C) 2007-2009, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. * Mohan Devarajulu */ #ifndef _OA_SOAP_RE_DISCOVER_H #define _OA_SOAP_RE_DISCOVER_H /* Include files */ #include "oa_soap_discover.h" #include "oa_soap_server_event.h" #include "oa_soap_interconnect_event.h" #include "oa_soap_fan_event.h" #include "oa_soap_ps_event.h" #include "oa_soap_enclosure_event.h" #include "oa_soap_lcd_event.h" SaErrorT oa_soap_re_discover_resources(struct oh_handler_state *oh_handler, struct oa_info *oa); SaErrorT re_discover_oa(struct oh_handler_state *oh_handler, SOAP_CON *con); SaErrorT remove_oa(struct oh_handler_state *oh_handler, SaHpiInt32T bay_number); SaErrorT add_oa(struct oh_handler_state *oh_handler, SOAP_CON *con, SaHpiInt32T bay_number); SaErrorT re_discover_blade(struct oh_handler_state *oh_handler, SOAP_CON *con); SaErrorT update_server_hotswap_state(struct oh_handler_state *oh_handler, SOAP_CON *con, SaHpiInt32T bay_number); SaErrorT remove_server_blade(struct oh_handler_state *oh_handler, SaHpiInt32T bay_number); SaErrorT add_server_blade(struct oh_handler_state *oh_handler, SOAP_CON *con, struct bladeInfo *info, struct bladeStatus *, struct bladePortMap *); SaErrorT re_discover_interconnect(struct oh_handler_state *oh_handler, SOAP_CON *con); SaErrorT update_interconnect_hotswap_state(struct oh_handler_state *oh_handler, SOAP_CON *con, SaHpiInt32T bay_number); SaErrorT remove_interconnect(struct oh_handler_state *oh_handler, SaHpiInt32T bay_number); SaErrorT add_interconnect(struct oh_handler_state *oh_handler, SOAP_CON *con, SaHpiInt32T bay_number, struct interconnectTrayInfo *, struct interconnectTrayStatus *, struct interconnectTrayPortMap *); SaErrorT re_discover_fan(struct oh_handler_state *oh_handler, SOAP_CON *con); SaErrorT remove_fan(struct oh_handler_state *oh_handler, SaHpiInt32T bay_number); SaErrorT add_fan(struct oh_handler_state *oh_handler, SOAP_CON *con, struct fanInfo *info); SaErrorT re_discover_ps_unit(struct oh_handler_state *oh_handler, SOAP_CON *con); SaErrorT remove_ps_unit(struct oh_handler_state *oh_handler, SaHpiInt32T bay_number); SaErrorT add_ps_unit(struct oh_handler_state *oh_handler, SOAP_CON *con, struct powerSupplyInfo *info); SaErrorT add_ps_unit_arr(struct oh_handler_state *oh_handler, SOAP_CON *con, struct powerSupplyInfo *info, struct powerSupplyStatus *status); #endif openhpi-3.6.1/plugins/test_agent/0000755000175100017510000000000012605014565015775 5ustar mohanmohanopenhpi-3.6.1/plugins/test_agent/instruments.h0000644000175100017510000000523512575647277020570 0ustar mohanmohan/* -*- c++ -*- * * (C) Copyright Pigeon Point Systems. 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTINSTRUMENTSLITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #ifndef INSTRUMENTS_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 #define INSTRUMENTS_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 #include #include #include #include #include "instrument.h" #include "object.h" namespace TA { /************************************************************** * class cInstruments *************************************************************/ class cHandler; class cResource; class cControl; class cSensor; class cInventory; class cWatchdog; class cAnnunciator; class cDimi; class cFumi; class cInstruments { public: cControl * GetControl( SaHpiCtrlNumT num ) const; cSensor * GetSensor( SaHpiSensorNumT num ) const; cInventory * GetInventory( SaHpiIdrIdT num ) const; cWatchdog * GetWatchdog( SaHpiWatchdogNumT num ) const; cAnnunciator * GetAnnunciator( SaHpiAnnunciatorNumT num ) const; cDimi * GetDimi( SaHpiDimiNumT num ) const; cFumi * GetFumi( SaHpiFumiNumT num ) const; void GetAllInstruments( InstrumentList& all ) const; protected: explicit cInstruments( cHandler& handler, cResource& resource ); virtual ~cInstruments(); protected: void GetNewNames( cObject::NewNames& names ) const; void GetChildren( cObject::Children& children ) const; bool CreateInstrument( const std::string& name ); bool RemoveInstrument( const std::string& name ); private: cInstruments( const cInstruments& ); cInstruments& operator =( const cInstruments& ); private: // data cHandler& m_handler; cResource& m_resource; typedef std::map Controls; Controls m_controls; typedef std::map Sensors; Sensors m_sensors; typedef std::map Inventories; Inventories m_invs; typedef std::map Watchdogs; Watchdogs m_wdts; typedef std::map Annunciators; Annunciators m_anns; typedef std::map Dimis; Dimis m_dimis; typedef std::map Fumis; Fumis m_fumis; }; }; // namespace TA #endif // INSTRUMENTS_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 openhpi-3.6.1/plugins/test_agent/watchdog.cpp0000644000175100017510000001363212575647277020330 0ustar mohanmohan/* -*- c++ -*- * * (C) Copyright Pigeon Point Systems. 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTWATCHDOGLITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #include #include "codec.h" #include "handler.h" #include "resource.h" #include "structs.h" #include "watchdog.h" namespace TA { /************************************************************** * Helper functions *************************************************************/ static SaHpiRdrTypeUnionT MakeDefaultWatchdogRec( SaHpiWatchdogNumT num ) { SaHpiRdrTypeUnionT data; SaHpiWatchdogRecT& rec = data.WatchdogRec; rec.WatchdogNum = num; rec.Oem = 0; return data; } static SaHpiWatchdogT MakeDefaultWatchdog() { SaHpiWatchdogT wdt; wdt.Log = SAHPI_TRUE; wdt.Running = SAHPI_FALSE; wdt.TimerUse = SAHPI_WTU_OEM; wdt.TimerAction = SAHPI_WA_NO_ACTION; wdt.PretimerInterrupt = SAHPI_WPI_OEM; wdt.PreTimeoutInterval = 1000; wdt.TimerUseExpFlags = 0; wdt.InitialCount = 2000; wdt.PresentCount = 0; return wdt; } static SaHpiWatchdogExpFlagsT TimerUseToExpFlags( SaHpiWatchdogTimerUseT use ) { switch ( use ) { case SAHPI_WTU_NONE: return 0; case SAHPI_WTU_BIOS_FRB2: return SAHPI_WATCHDOG_EXP_BIOS_FRB2; case SAHPI_WTU_BIOS_POST: return SAHPI_WATCHDOG_EXP_BIOS_POST; case SAHPI_WTU_OS_LOAD: return SAHPI_WATCHDOG_EXP_OS_LOAD; case SAHPI_WTU_SMS_OS: return SAHPI_WATCHDOG_EXP_SMS_OS; case SAHPI_WTU_OEM: return SAHPI_WATCHDOG_EXP_OEM; case SAHPI_WTU_UNSPECIFIED: return 0; default: return 0; } } static SaHpiWatchdogActionEventT ActionEvent( SaHpiWatchdogActionT action ) { switch ( action ) { case SAHPI_WA_NO_ACTION: return SAHPI_WAE_NO_ACTION; case SAHPI_WA_RESET: return SAHPI_WAE_RESET; case SAHPI_WA_POWER_DOWN: return SAHPI_WAE_POWER_DOWN; case SAHPI_WA_POWER_CYCLE: return SAHPI_WAE_POWER_CYCLE; default: return SAHPI_WAE_NO_ACTION; } } /************************************************************** * class cWatchdog *************************************************************/ const std::string cWatchdog::classname( "wdt" ); cWatchdog::cWatchdog( cHandler& handler, cResource& resource, SaHpiWatchdogNumT num ) : cInstrument( handler, resource, AssembleNumberedObjectName( classname, num ), SAHPI_WATCHDOG_RDR, MakeDefaultWatchdogRec( num ) ), m_rec( GetRdr().RdrTypeUnion.WatchdogRec ), m_wdt( MakeDefaultWatchdog() ) { // empty } cWatchdog::~cWatchdog() { m_handler.CancelTimer( this ); } // HPI interface SaErrorT cWatchdog::Get( SaHpiWatchdogT& wdt ) const { wdt = m_wdt; return SA_OK; } SaErrorT cWatchdog::Set( const SaHpiWatchdogT& wdt ) { if ( wdt.PreTimeoutInterval > wdt.InitialCount ) { return SA_ERR_HPI_INVALID_DATA; } m_wdt.Log = wdt.Log; m_wdt.TimerUse = wdt.TimerUse; m_wdt.TimerAction = wdt.TimerAction; m_wdt.PretimerInterrupt = wdt.PretimerInterrupt; m_wdt.PreTimeoutInterval = wdt.PreTimeoutInterval; m_wdt.TimerUseExpFlags &= ~wdt.TimerUseExpFlags; m_wdt.InitialCount = wdt.InitialCount; if ( wdt.Running == SAHPI_FALSE ) { m_handler.CancelTimer( this ); m_wdt.Running = SAHPI_FALSE; } else { m_wdt.PresentCount = m_wdt.InitialCount; } return SA_OK; } SaErrorT cWatchdog::Reset() { if ( m_wdt.Running != SAHPI_FALSE ) { if ( m_wdt.PretimerInterrupt != SAHPI_WPI_NONE ) { if ( m_wdt.PresentCount < m_wdt.PreTimeoutInterval ) { return SA_ERR_HPI_INVALID_REQUEST; } } } m_wdt.Running = SAHPI_TRUE; m_wdt.PresentCount = m_wdt.InitialCount; if ( m_wdt.InitialCount != 0 ) { m_handler.SetTimer( this, 1000000LL ); // 1 ms tick } else { ProcessTick(); } return SA_OK; } // cObject virtual functions void cWatchdog::GetVars( cVars& vars ) { cInstrument::GetVars( vars ); Structs::GetVars( m_wdt, vars ); } // cTimerCallback virtual functions void cWatchdog::TimerEvent() { if ( m_wdt.Running == SAHPI_FALSE ) { return; } --m_wdt.PresentCount; ProcessTick(); } void cWatchdog::ProcessTick() { if ( m_wdt.PretimerInterrupt != SAHPI_WPI_NONE ) { if ( m_wdt.PresentCount == m_wdt.PreTimeoutInterval ) { // Pre-timer interrupt PostEvent( SAHPI_WAE_TIMER_INT ); } } if ( m_wdt.PresentCount == 0 ) { // Expired m_wdt.TimerUseExpFlags |= TimerUseToExpFlags( m_wdt.TimerUse ); m_wdt.Running = SAHPI_FALSE; PostEvent( ActionEvent( m_wdt.TimerAction ) ); } // Schedule next tick if ( m_wdt.Running != SAHPI_FALSE ) { m_handler.SetTimer( this, 1000000LL ); // 1 ms tick } } void cWatchdog::PostEvent( SaHpiWatchdogActionEventT ae ) { if ( m_wdt.Log == SAHPI_FALSE ) { return; } SaHpiEventUnionT data; SaHpiWatchdogEventT& we = data.WatchdogEvent; we.WatchdogNum = m_rec.WatchdogNum; we.WatchdogAction = ae; we.WatchdogPreTimerAction = m_wdt.PretimerInterrupt; we.WatchdogUse = m_wdt.TimerUse; cInstrument::PostEvent( SAHPI_ET_WATCHDOG, data, SAHPI_INFORMATIONAL ); } }; // namespace TA openhpi-3.6.1/plugins/test_agent/console.cpp0000644000175100017510000003153112575647277020170 0ustar mohanmohan/* -*- c++ -*- * * (C) Copyright Pigeon Point Systems. 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTOBJECTLITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #include #include #include #include #include #include #include #include "codec.h" #include "console.h" #include "handler.h" #include "utils.h" namespace TA { /************************************************************** * Helper data *************************************************************/ static const char sepline[] = "----------------------------------------------------\n"; static const char indent1[] = " "; static const char indent2[] = " "; /************************************************************** * Helper functions *************************************************************/ static bool IsSpace( char c ) { return isspace( c ) != 0; } static bool IsNonSpace( char c ) { return isspace( c ) == 0; } static bool IsNonCommand( const std::vector& line ) { std::vector::const_iterator iter; iter = std::find_if( line.begin(), line.end(), IsNonSpace ); return ( iter == line.end() ) || ( *iter == '#' ); } /*** * All commands can be presented in form: * name[ arg0[ = arg1]], where [] shows optional part. * This function parses input line and extracts name and args. **/ static void ParseLine( const std::vector& line, std::string& name, cConsoleCmd::Args& args ) { name.clear(); args.clear(); std::vector::const_iterator a, b, c; // name a = std::find_if( line.begin(), line.end(), IsNonSpace ); b = std::find_if( a, line.end(), IsSpace ); name.assign( a, b ); // arg0 a = std::find_if( b, line.end(), IsNonSpace ); if ( a == line.end() ) { return; } b = std::find_if( a, line.end(), IsSpace ); std::string arg0( a, b ); args.push_back( arg0 ); // = b = std::find( b, line.end(), '=' ); if ( b == line.end() ) { return; } ++b; // arg1 a = std::find_if( b, line.end(), IsNonSpace ); if ( a == line.end() ) { return; } // arg1: do not copy trailing spaces c = a; do { b = std::find_if( c, line.end(), IsSpace ); c = std::find_if( b, line.end(), IsNonSpace ); } while ( c != line.end() ); std::string arg1( a, b ); args.push_back( arg1 ); } /************************************************************** * class cConsole *************************************************************/ cConsole::cConsole( cHandler& handler, uint16_t port, cObject& root ) : cServer( port ), m_handler( handler ), m_root( root ) { // empty } cConsole::~cConsole() { // empty } bool cConsole::Init() { m_cmds.push_back( cConsoleCmd( "help", "help", "Prints this help message.", &cConsole::CmdHelp, 0 ) ); m_cmds.push_back( cConsoleCmd( "quit", "quit", "Quits from the console.", &cConsole::CmdQuit, 0 ) ); m_cmds.push_back( cConsoleCmd( "ls", "ls", "Shows current object.", &cConsole::CmdLs, 0 ) ); m_cmds.push_back( cConsoleCmd( "cd", "cd ", "Enters to the specified object.", &cConsole::CmdCd, 1 ) ); m_cmds.push_back( cConsoleCmd( "new", "new ", "Creates new child object.", &cConsole::CmdNew, 1 ) ); m_cmds.push_back( cConsoleCmd( "rm", "rm ", "Deletes the specified child object.", &cConsole::CmdRm, 1 ) ); m_cmds.push_back( cConsoleCmd( "set", "set = ", "Sets the specified variable in the current object.", &cConsole::CmdSet, 2 ) ); bool rc = cServer::Init(); if ( !rc ) { CRIT( "cannot initialize Server" ); return false; } return true; } void cConsole::Send( const char * data, size_t len ) const { cServer::Send( data, len ); } void cConsole::Send( const char * str ) const { if ( str ) { cServer::Send( str, strlen( str ) ) ; } } void cConsole::Send( const std::string& str ) const { Send( str.data(), str.length() ); } void cConsole::WelcomeUser() const { Send( sepline, sizeof(sepline) ); Send( "Welcome to Test Agent Console.\n" ); Send( "Type \"help\" for command information.\n" ); Send( sepline, sizeof(sepline) ); } void cConsole::ProcessUserLine( const std::vector& line, bool& quit ) { m_quit = false; bool rc = IsNonCommand( line ); if ( rc ) { return; } std::string name; cConsoleCmd::Args args; ParseLine( line, name, args ); if ( name.empty() ) { return; } cLocker al( &m_handler ); for ( size_t i = 0, n = m_cmds.size(); i < n; ++i ) { const cConsoleCmd& cmd = m_cmds[i]; if ( name == cmd.name ) { if ( args.size() == cmd.nargs ) { (this->*(cmd.cmd_handler))( args ); quit = m_quit; return; } else { SendERR( "Wrong number of parameters." ); return; } } } SendERR( "Unknown command." ); } void cConsole::CmdHelp( const cConsoleCmd::Args& args ) { Send( sepline, sizeof(sepline) ); Send( "Supported commands:\n" ); for ( size_t i = 0, n = m_cmds.size(); i < n; ++i ) { const cConsoleCmd& cmd = m_cmds[i]; Send( indent1 ); Send( cmd.usage ); Send( "\n" ); Send( indent2 ); Send( cmd.info ); Send( "\n" ); } Send( "\n" ); Send( "If input line begins with #, it will be ignored.\n" ); Send( "\n" ); SendOK( "Help displayed." ); } void cConsole::CmdQuit( const cConsoleCmd::Args& args ) { m_quit = true; SendOK( "Quit." ); } void cConsole::CmdLs( const cConsoleCmd::Args& args ) { cObject * current = TestAndGetCurrentObject(); if ( !current ) { return; } Send( sepline, sizeof(sepline) ); Send( "Current object: " ); SendCurrentPath(); Send( "\n" ); Send( indent1 ); Send( "Targets for cd/rm:\n" ); cObject::Children children; cObject::Children::const_iterator ci, cend; current->GetChildren( children ); for ( ci = children.begin(), cend = children.end(); ci != cend; ++ci ) { Send( indent2 ); Send( (*ci)->GetName() ); Send( "\n" ); } Send( indent1 ); Send( "Targets for new:\n" ); cObject::NewNames nnames; cObject::NewNames::const_iterator ni, nend; current->GetNewNames( nnames ); for ( ni = nnames.begin(), nend = nnames.end(); ni != nend; ++ni ) { Send( indent2 ); Send( *ni ); Send( "\n" ); } Send( indent1 ); Send( "Vars:\n" ); cVars vars; VarIter vi, vend; current->GetVars( vars ); for ( vi = vars.begin(), vend = vars.end(); vi != vend; ++vi ) { Send( indent2 ); if ( vi->wdata ) { Send( "RW " ); } else { Send( "RO " ); } Send( vi->name ); std::string data; ToTxt( *vi, data ); Send( " = " ); Send( data ); Send( "\n" ); } SendOK( "Object displayed." ); } void cConsole::CmdCd( const cConsoleCmd::Args& args ) { const std::string& name = args[0]; ObjectPath new_path; MakeNewPath( new_path, name ); cObject * obj = GetObject( new_path ); if ( !obj ) { obj = TestAndGetCurrentObject(); SendERR( "No object." ); return; } m_path = new_path; Send( sepline, sizeof(sepline) ); Send( "Current object: " ); SendCurrentPath(); Send( "\n" ); std::string nb; obj->GetNB( nb ); if ( !nb.empty() ) { Send( sepline, sizeof(sepline) ); Send( "NB!:\n\n" ); Send( nb ); } SendOK( "Object changed." ); } void cConsole::CmdNew( const cConsoleCmd::Args& args ) { cObject * current = TestAndGetCurrentObject(); if ( !current ) { return; } const std::string& name = args[0]; cObject * child = current->GetChild( name ); if ( child ) { SendERR( "Object already exists." ); return; } bool rc = current->CreateChild( name ); if ( !rc ) { SendERR( "Failed to create object." ); return; } SendOK( "Object created." ); } void cConsole::CmdRm( const cConsoleCmd::Args& args ) { cObject * current = TestAndGetCurrentObject(); if ( !current ) { return; } const std::string& name = args[0]; cObject * child = current->GetChild( name ); if ( !child ) { SendERR( "No such child object." ); return; } bool rc = current->RemoveChild( name ); if ( !rc ) { SendERR( "Failed to remove object." ); return; } SendOK( "Object removed." ); } void cConsole::CmdSet( const cConsoleCmd::Args& args ) { bool rc; cObject * current = TestAndGetCurrentObject(); if ( !current ) { return; } const std::string& var_name = args[0]; Var var; rc = current->GetVar( var_name, var ); if ( !rc ) { SendERR( "No such var." ); return; } if ( !var.wdata ) { SendERR( "Read-only var." ); return; } const std::string& data = args[1]; current->BeforeVarSet( var_name ); rc = FromTxt( data, var ); if ( !rc ) { SendERR( "Cannot decode data." ); return; } current->AfterVarSet( var_name ); SendOK( "Var set." ); } void cConsole::SendOK( const std::string& msg ) { Send( sepline, sizeof(sepline) ); Send( "OK: " ); Send( msg ); Send( "\n" ); Send( sepline, sizeof(sepline) ); } void cConsole::SendERR( const std::string& msg ) { Send( sepline, sizeof(sepline) ); Send( "ERR: " ); Send( msg ); Send( "\n" ); Send( sepline, sizeof(sepline) ); } void cConsole::SendCurrentPath() const { if ( m_path.empty() ) { Send( "/" ); } else { ObjectPath::const_iterator iter = m_path.begin(); ObjectPath::const_iterator end = m_path.end(); for ( ; iter != end; ++iter ) { Send( "/" ); Send( *iter ); } } } cObject * cConsole::GetObject( const ObjectPath& path ) const { cObject * obj = &m_root; ObjectPath::const_iterator iter = path.begin(); ObjectPath::const_iterator end = path.end(); for ( ; iter != end; ++iter ) { cObject * child = obj->GetChild( *iter ); if ( !child ) { obj = 0; break; } obj = child; } return obj; } cObject * cConsole::TestAndGetCurrentObject() { cObject * current = GetObject( m_path ); if ( current == 0 ) { SendERR( "Current object is no longer exists." ); while ( ( current == 0 ) && ( !m_path.empty() ) ) { m_path.pop_back(); current = GetObject( m_path ); } Send( "New current object: " ); SendCurrentPath(); Send( "\n" ); current = 0; } if ( current == 0 ) { SendERR( "No object." ); } return current; } void cConsole::MakeNewPath( ObjectPath& path, const std::string& path_str ) const { std::vector buf( path_str.begin(), path_str.end() ); buf.push_back( '\0' ); ObjectPath tmp; if ( buf[0] != '/' ) { tmp = m_path; } char * token = strtok( &buf[0], "/" ); while( token ) { std::string stoken( token ); if ( ( !stoken.empty() ) && ( stoken != "." ) ) { tmp.push_back( std::string( token ) ); } token = strtok( 0, "/" ); } path.clear(); while( !tmp.empty() ) { if ( tmp.front() != ".." ) { path.push_back( tmp.front() ); } else { if ( !path.empty() ) { path.pop_back(); } } tmp.pop_front(); } } }; // namespace TA openhpi-3.6.1/plugins/test_agent/timers.h0000644000175100017510000000414412575647277017476 0ustar mohanmohan/* This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTUTILSLITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #ifndef TIMERS_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 #define TIMERS_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 #include #include #include "SaHpi.h" namespace TA { /************************************************************** * class cTimerCallback *************************************************************/ class cTimerCallback { public: explicit cTimerCallback() { // empty } virtual void TimerEvent() = 0; protected: virtual ~cTimerCallback() { // empty } private: cTimerCallback( const cTimerCallback& ); cTimerCallback& operator =( const cTimerCallback& ); }; /************************************************************** * struct Timer *************************************************************/ struct Timer { cTimerCallback * callback; GTimeVal expire; }; /************************************************************** * class cTimers *************************************************************/ class cTimers { public: explicit cTimers(); ~cTimers(); bool Start(); void SetTimer( cTimerCallback * callback, SaHpiTimeoutT timeout ); void CancelTimer( const cTimerCallback * callback ); bool HasTimerSet( const cTimerCallback * callback ); private: cTimers( const cTimers& ); cTimers& operator =( const cTimers& ); static gpointer ThreadFuncAdapter( gpointer data ); void ThreadFunc(); private: //data typedef std::list Timers; GThread * m_thread; GCond * m_cond; GMutex * m_mutex; volatile bool m_stop; Timers m_timers; }; }; // namespace TA #endif // TIMERS_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 openhpi-3.6.1/plugins/test_agent/area.cpp0000644000175100017510000002444012575647277017437 0ustar mohanmohan/* -*- c++ -*- * * (C) Copyright Pigeon Point Systems. 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTAREALITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #include #include #include "area.h" #include "codec.h" #include "field.h" namespace TA { /************************************************************** * Functors for working with fields *************************************************************/ struct FieldDeleter { void operator ()( cField * field ) { delete field; } }; struct FieldIdPred { explicit FieldIdPred( SaHpiEntryIdT _id ) : id( _id ) { // empty } bool operator ()( const cField * field ) const { return ( id == SAHPI_FIRST_ENTRY ) || ( id == field->GetId() ); } SaHpiEntryIdT id; }; struct FieldIdTypePred { explicit FieldIdTypePred( SaHpiEntryIdT _id, SaHpiIdrFieldTypeT _type ) : id( _id ), type( _type ) { // empty } bool operator ()( const cField * field ) const { if ( type == field->GetType() ) { return ( id == SAHPI_FIRST_ENTRY ) || ( id == field->GetId() ); } else { return false; } } SaHpiEntryIdT id; SaHpiIdrFieldTypeT type; }; struct FieldReadOnlyPred { bool operator ()( const cField * field ) const { return field->IsReadOnly(); } }; struct ObjectCollector { explicit ObjectCollector( cObject::Children& _children ) : children( _children ) { // empty } void operator ()( cField * field ) { children.push_back( field ); } cObject::Children& children; }; struct FieldMaxId { explicit FieldMaxId() : value( 0 ) { // empty } void operator ()( const cField * field ) { value = std::max( value, field->GetId() ); } SaHpiEntryIdT value; }; /************************************************************** * class cArea *************************************************************/ const std::string cArea::classname( "area" ); cArea::cArea( volatile SaHpiUint32T& update_count, SaHpiEntryIdT id, SaHpiIdrAreaTypeT type ) : cObject( AssembleNumberedObjectName( classname, id ) ), m_id( id ), m_type( type ), m_readonly( SAHPI_FALSE ), m_update_count( update_count ) { // empty } cArea::~cArea() { FieldDeleter deleter; std::for_each( m_fields.begin(), m_fields.end(), deleter ); m_fields.clear(); } void cArea::GetHeader( SaHpiIdrAreaHeaderT& hdr ) const { hdr.AreaId = m_id; hdr.Type = m_type; hdr.ReadOnly = m_readonly; hdr.NumFields = m_fields.size(); } bool cArea::CanBeDeleted() const { if ( m_readonly != SAHPI_FALSE ) { return false; } // contains ReadOnly field? Fields::const_iterator i; i = std::find_if( m_fields.begin(), m_fields.end(), FieldReadOnlyPred() ); if ( i != m_fields.end() ) { return false; } return true; } cField * cArea::GetField( SaHpiEntryIdT fid ) const { Fields::const_iterator i; i = std::find_if( m_fields.begin(), m_fields.end(), FieldIdPred( fid ) ); if ( i == m_fields.end() ) { return 0; } return *i; } // HPI Interface SaErrorT cArea::GetField( SaHpiIdrFieldTypeT ftype, SaHpiEntryIdT fid, SaHpiEntryIdT& next_fid, SaHpiIdrFieldT& field ) const { if ( fid == SAHPI_LAST_ENTRY ) { return SA_ERR_HPI_INVALID_PARAMS; } next_fid = SAHPI_LAST_ENTRY; Fields::const_iterator i, j; if ( ftype == SAHPI_IDR_FIELDTYPE_UNSPECIFIED ) { i = std::find_if( m_fields.begin(), m_fields.end(), FieldIdPred( fid ) ); if ( i == m_fields.end() ) { return SA_ERR_HPI_NOT_PRESENT; } field.AreaId = m_id; (*i)->Get( field.FieldId, field.Type, field.ReadOnly, field.Field ); ++i; if ( i != m_fields.end() ) { next_fid = (*i)->GetId(); } } else { i = std::find_if( m_fields.begin(), m_fields.end(), FieldIdTypePred( fid, ftype ) ); if ( i == m_fields.end() ) { return SA_ERR_HPI_NOT_PRESENT; } field.AreaId = m_id; (*i)->Get( field.FieldId, field.Type, field.ReadOnly, field.Field ); ++i; if ( i != m_fields.end() ) { j = std::find_if( i, m_fields.end(), FieldIdTypePred( SAHPI_FIRST_ENTRY, ftype ) ); if ( j != m_fields.end() ) { next_fid = (*j)->GetId(); } } } return SA_OK; } SaErrorT cArea::AddField( SaHpiIdrFieldTypeT ftype, const SaHpiTextBufferT& fdata, SaHpiEntryIdT& fid ) { if ( m_readonly != SAHPI_FALSE ) { return SA_ERR_HPI_READ_ONLY; } if ( ftype == SAHPI_IDR_FIELDTYPE_UNSPECIFIED ) { return SA_ERR_HPI_INVALID_DATA; } FieldMaxId max_id = std::for_each( m_fields.begin(), m_fields.end(), FieldMaxId() ); fid = max_id.value + 1; cField * field = new cField( m_update_count, fid ); field->Set( ftype, fdata ); m_fields.push_back( field ); ++m_update_count; fid = field->GetId(); return SA_OK; } SaErrorT cArea::AddFieldById( SaHpiEntryIdT fid, SaHpiIdrFieldTypeT ftype, const SaHpiTextBufferT& fdata ) { if ( m_readonly != SAHPI_FALSE ) { return SA_ERR_HPI_READ_ONLY; } if ( ftype == SAHPI_IDR_FIELDTYPE_UNSPECIFIED ) { return SA_ERR_HPI_INVALID_DATA; } if ( fid == SAHPI_LAST_ENTRY ) { return SA_ERR_HPI_INVALID_PARAMS; } cField * field; if ( fid == SAHPI_FIRST_ENTRY ) { FieldMaxId max_id = std::for_each( m_fields.begin(), m_fields.end(), FieldMaxId() ); SaHpiEntryIdT new_fid = max_id.value + 1; field = new cField( m_update_count, new_fid ); m_fields.push_front( field ); } else { if ( GetField( fid ) ) { return SA_ERR_HPI_DUPLICATE; } field = new cField( m_update_count, fid ); m_fields.push_back( field ); } field->Set( ftype, fdata ); ++m_update_count; return SA_OK; } SaErrorT cArea::SetField( SaHpiEntryIdT fid, SaHpiIdrFieldTypeT ftype, const SaHpiTextBufferT& fdata ) { if ( ftype == SAHPI_IDR_FIELDTYPE_UNSPECIFIED ) { return SA_ERR_HPI_INVALID_DATA; } cField * field = GetField( fid ); if ( !field ) { return SA_ERR_HPI_NOT_PRESENT; } if ( field->IsReadOnly() ) { return SA_ERR_HPI_READ_ONLY; } field->Set( ftype, fdata ); return SA_OK; } SaErrorT cArea::DeleteFieldById( SaHpiEntryIdT fid ) { if ( fid == SAHPI_LAST_ENTRY ) { return SA_ERR_HPI_INVALID_PARAMS; } cField * field = GetField( fid ); if ( !field ) { return SA_ERR_HPI_NOT_PRESENT; } if ( m_readonly != SAHPI_FALSE ) { return SA_ERR_HPI_READ_ONLY; } if ( field->IsReadOnly() ) { return SA_ERR_HPI_READ_ONLY; } // NB: if we pass id to FieldIdPred // and id is SAHPI_FIRST_ENTRY // then all fields will be deleted. m_fields.remove_if( FieldIdPred( field->GetId() ) ); delete field; ++m_update_count; return SA_OK; } void cArea::GetNewNames( cObject::NewNames& names ) const { cObject::GetNewNames( names ); names.push_back( cField::classname + "-XXX" ); } bool cArea::CreateChild( const std::string& name ) { bool rc; rc = cObject::CreateChild( name ); if ( rc ) { return true; } std::string cname; SaHpiUint32T id; rc = DisassembleNumberedObjectName( name, cname, id ); if ( !rc ) { return false; } if ( id == SAHPI_FIRST_ENTRY ) { return false; } if ( id == SAHPI_LAST_ENTRY ) { return false; } if ( cname == cField::classname ) { if ( !GetField( id ) ) { m_fields.push_back( new cField( m_update_count, id ) ); ++m_update_count; return true; } } return false; } bool cArea::RemoveChild( const std::string& name ) { bool rc; rc = cObject::RemoveChild( name ); if ( rc ) { return true; } std::string cname; SaHpiUint32T id; rc = DisassembleNumberedObjectName( name, cname, id ); if ( !rc ) { return false; } if ( id == SAHPI_FIRST_ENTRY ) { return false; } if ( id == SAHPI_LAST_ENTRY ) { return false; } if ( cname == cField::classname ) { cField * field = GetField( id ); if ( field ) { // NB: if we pass id to FieldIdPred // and id is SAHPI_FIRST_ENTRY // then all fields will be deleted. m_fields.remove_if( FieldIdPred( id ) ); delete field; ++m_update_count; return true; } } return false; } void cArea::GetChildren( Children& children ) const { cObject::GetChildren( children ); ObjectCollector collector( children ); std::for_each( m_fields.begin(), m_fields.end(), collector ); } void cArea::GetVars( cVars& vars ) { cObject::GetVars( vars ); vars << "AreaId" << dtSaHpiEntryIdT << DATA( m_id ) << READONLY() << VAR_END(); vars << "AreaType" << dtSaHpiIdrAreaTypeT << DATA( m_type ) << VAR_END(); vars << "ReadOnly" << dtSaHpiBoolT << DATA( m_readonly ) << VAR_END(); } void cArea::AfterVarSet( const std::string& var_name ) { cObject::AfterVarSet( var_name ); ++m_update_count; } }; // namespace TA openhpi-3.6.1/plugins/test_agent/codec.h0000644000175100017510000000277212575647277017255 0ustar mohanmohan/* -*- c++ -*- * * (C) Copyright Pigeon Point Systems. 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTCODECLITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #ifndef CODEC_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 #define CODEC_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 #include #include namespace TA { /************************************************************** * Codec Interface *************************************************************/ struct Var; // Data Codecs void ToTxt( const Var& var, std::string& txt ); bool FromTxt( const std::string& txt, Var& var ); // Object Name Codecs std::string AssembleNumberedObjectName( const std::string& classname, SaHpiUint32T num ); bool DisassembleNumberedObjectName( const std::string& name, std::string& classname, SaHpiUint32T& num ); std::string AssembleResourceObjectName( const SaHpiEntityPathT& ep ); bool DisassembleResourceObjectName( const std::string& name, SaHpiEntityPathT& ep ); }; // namespace TA #endif // CODEC_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 openhpi-3.6.1/plugins/test_agent/resource.cpp0000644000175100017510000004565412575647277020370 0ustar mohanmohan/* -*- c++ -*- * * (C) Copyright Pigeon Point Systems. 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTRESOURCELITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #include #include #include "codec.h" #include "handler.h" #include "log.h" #include "resource.h" #include "structs.h" #include "timers.h" #include "utils.h" #include "vars.h" #include namespace TA { /************************************************************** * Helper functions *************************************************************/ static void MakeDefaultRptEntry( const SaHpiEntityPathT& ep, SaHpiRptEntryT& rpte ) { static const SaHpiGuidT guid = { 0xFB, 0x2B, 0x5D, 0xD5, 0x4E, 0x7D, 0x49, 0xF5, 0x93, 0x97, 0xC2, 0xFE, 0xC2, 0x1B, 0x40, 0x10 }; SaHpiEntityPathT ep2 = ep; SaHpiResourceIdT rid = oh_uid_from_entity_path( &ep2 ); //rpte.EntryId = SAHPI_ENTRY_UNSPECIFIED; rpte.EntryId = rid; // NB! This is OpenHPI-specific rpte.ResourceId = rid; SaHpiResourceInfoT& ri = rpte.ResourceInfo; ri.ResourceRev = 0; ri.SpecificVer = 0; ri.DeviceSupport = 0; ri.ManufacturerId = 0; ri.ProductId = 0; ri.FirmwareMajorRev = 42; ri.FirmwareMinorRev = 43; ri.AuxFirmwareRev = 44; memcpy( &ri.Guid, &guid, sizeof(guid) ); // just a trick to make unique GUID memcpy( &ri.Guid, &rid, sizeof(rid) ); rpte.ResourceEntity = ep; rpte.ResourceCapabilities = SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_MANAGED_HOTSWAP | SAHPI_CAPABILITY_POWER | SAHPI_CAPABILITY_RESET | SAHPI_CAPABILITY_RDR; rpte.HotSwapCapabilities = SAHPI_HS_CAPABILITY_INDICATOR_SUPPORTED; rpte.ResourceSeverity = SAHPI_INFORMATIONAL; rpte.ResourceFailed = SAHPI_FALSE; FormatHpiTextBuffer( rpte.ResourceTag, "res-%u", (unsigned int)(rid) ); } /************************************************************** * class cResource *************************************************************/ cResource::cResource( cHandler& handler, const SaHpiEntityPathT& ep ) : cObject( AssembleResourceObjectName( ep ), SAHPI_FALSE ), cInstruments( handler, *this ), m_handler( handler ), m_log( 0 ) { MakeDefaultRptEntry( ep, m_rpte ); m_failed = m_rpte.ResourceFailed; m_new_failed = m_rpte.ResourceFailed; m_ae_timeout = SAHPI_TIMEOUT_IMMEDIATE; m_prev_hs_state = SAHPI_HS_STATE_NOT_PRESENT; m_hs_state = SAHPI_HS_STATE_INACTIVE; m_new_hs_state = SAHPI_HS_STATE_INACTIVE; m_hs_ind_state = SAHPI_HS_INDICATOR_OFF; m_load_id.LoadNumber = SAHPI_LOAD_ID_DEFAULT; m_rst_state = SAHPI_RESET_DEASSERT; m_pwr_state = SAHPI_POWER_OFF; m_pwr_cycle_cnt = 0; } cResource::~cResource() { delete m_log; m_log = 0; m_handler.CancelTimer( this ); SetVisible( false ); } const SaHpiRptEntryT& cResource::GetRptEntry() const { return m_rpte; } SaHpiResourceIdT cResource::GetResourceId() const { return m_rpte.ResourceId; } const SaHpiEntityPathT& cResource::GetEntityPath() const { return m_rpte.ResourceEntity; } bool cResource::IsFailed() const { return m_failed != SAHPI_FALSE; } void cResource::UpdateCaps( SaHpiCapabilitiesT caps ) { m_rpte.ResourceCapabilities |= caps; } cLog * cResource::GetLog() const { return m_log; } // HPI interface SaErrorT cResource::SetTag( const SaHpiTextBufferT& tag ) { m_rpte.ResourceTag = tag; return SA_OK; } SaErrorT cResource::SetSeverity( SaHpiSeverityT sev ) { m_rpte.ResourceSeverity = sev; return SA_OK; } SaErrorT cResource::CancelHsPolicy( const SaHpiTimeoutT& timeout ) { const SaHpiCapabilitiesT caps = m_rpte.ResourceCapabilities; if ( ( caps & SAHPI_CAPABILITY_MANAGED_HOTSWAP ) == 0 ) { return SA_ERR_HPI_CAPABILITY; } switch ( m_hs_state ) { case SAHPI_HS_STATE_INSERTION_PENDING: case SAHPI_HS_STATE_EXTRACTION_PENDING: break; default: return SA_ERR_HPI_INVALID_REQUEST; } m_handler.CancelTimer( this ); return SA_OK; } SaErrorT cResource::GetAutoExtractTimeout( SaHpiTimeoutT& timeout ) const { const SaHpiCapabilitiesT caps = m_rpte.ResourceCapabilities; if ( ( caps & SAHPI_CAPABILITY_MANAGED_HOTSWAP ) == 0 ) { return SA_ERR_HPI_CAPABILITY; } timeout = m_ae_timeout; return SA_OK; } SaErrorT cResource::SetAutoExtractTimeout( const SaHpiTimeoutT& timeout ) { const SaHpiCapabilitiesT caps = m_rpte.ResourceCapabilities; const SaHpiHsCapabilitiesT hs_caps = m_rpte.HotSwapCapabilities; if ( ( caps & SAHPI_CAPABILITY_MANAGED_HOTSWAP ) == 0 ) { return SA_ERR_HPI_CAPABILITY; } if ( ( hs_caps & SAHPI_HS_CAPABILITY_AUTOEXTRACT_READ_ONLY ) != 0 ) { return SA_ERR_HPI_READ_ONLY; } m_ae_timeout = timeout; return SA_OK; } SaErrorT cResource::GetHsState( SaHpiHsStateT& state ) const { const SaHpiCapabilitiesT caps = m_rpte.ResourceCapabilities; if ( ( caps & SAHPI_CAPABILITY_FRU ) == 0 ) { return SA_ERR_HPI_CAPABILITY; } state = m_hs_state; return SA_OK; } SaErrorT cResource::SetHsState( SaHpiHsStateT state ) { const SaHpiCapabilitiesT caps = m_rpte.ResourceCapabilities; if ( ( caps & SAHPI_CAPABILITY_MANAGED_HOTSWAP ) == 0 ) { return SA_ERR_HPI_CAPABILITY; } switch ( m_hs_state ) { case SAHPI_HS_STATE_INSERTION_PENDING: case SAHPI_HS_STATE_EXTRACTION_PENDING: break; default: return SA_ERR_HPI_INVALID_REQUEST; } m_handler.CancelTimer( this ); m_new_hs_state = state; CommitChanges(); return SA_OK; } SaErrorT cResource::RequestHsAction( SaHpiHsActionT action ) { const SaHpiCapabilitiesT caps = m_rpte.ResourceCapabilities; if ( ( caps & SAHPI_CAPABILITY_MANAGED_HOTSWAP ) == 0 ) { return SA_ERR_HPI_CAPABILITY; } SaHpiTimeoutT ait, aet, t; GetTimeouts( ait, aet ); if ( m_hs_state == SAHPI_HS_STATE_INACTIVE ) { if ( action != SAHPI_HS_ACTION_INSERTION ) { return SA_ERR_HPI_INVALID_REQUEST; } m_new_hs_state = SAHPI_HS_STATE_INSERTION_PENDING; t = ait; } else if ( m_hs_state == SAHPI_HS_STATE_ACTIVE ) { if ( action != SAHPI_HS_ACTION_EXTRACTION ) { return SA_ERR_HPI_INVALID_REQUEST; } m_new_hs_state = SAHPI_HS_STATE_EXTRACTION_PENDING; t = aet; } else { return SA_ERR_HPI_INVALID_REQUEST; } CommitChanges(); m_handler.SetTimer( this, t ); return SA_OK; } SaErrorT cResource::GetHsIndicatorState( SaHpiHsIndicatorStateT& state ) const { const SaHpiCapabilitiesT caps = m_rpte.ResourceCapabilities; const SaHpiHsCapabilitiesT hs_caps = m_rpte.HotSwapCapabilities; if ( ( caps & SAHPI_CAPABILITY_MANAGED_HOTSWAP ) == 0 ) { return SA_ERR_HPI_CAPABILITY; } if ( ( hs_caps & SAHPI_HS_CAPABILITY_INDICATOR_SUPPORTED ) == 0 ) { return SA_ERR_HPI_CAPABILITY; } state = m_hs_ind_state; return SA_OK; } SaErrorT cResource::SetHsIndicatorState( const SaHpiHsIndicatorStateT& state ) { const SaHpiCapabilitiesT caps = m_rpte.ResourceCapabilities; const SaHpiHsCapabilitiesT hs_caps = m_rpte.HotSwapCapabilities; if ( ( caps & SAHPI_CAPABILITY_MANAGED_HOTSWAP ) == 0 ) { return SA_ERR_HPI_CAPABILITY; } if ( ( hs_caps & SAHPI_HS_CAPABILITY_INDICATOR_SUPPORTED ) == 0 ) { return SA_ERR_HPI_CAPABILITY; } m_hs_ind_state = state; return SA_OK; } SaErrorT cResource::GetPowerState( SaHpiPowerStateT& state ) { const SaHpiCapabilitiesT caps = m_rpte.ResourceCapabilities; if ( ( caps & SAHPI_CAPABILITY_POWER ) == 0 ) { return SA_ERR_HPI_CAPABILITY; } if ( m_pwr_cycle_cnt > 0 ) { --m_pwr_cycle_cnt; if ( m_pwr_cycle_cnt == 0 ) { if ( m_pwr_state == SAHPI_POWER_ON ) { m_pwr_state = SAHPI_POWER_OFF; } else if ( m_pwr_state == SAHPI_POWER_OFF ) { m_pwr_state = SAHPI_POWER_ON; } } } state = m_pwr_state; return SA_OK; } SaErrorT cResource::SetPowerState( const SaHpiPowerStateT& state ) { const SaHpiCapabilitiesT caps = m_rpte.ResourceCapabilities; if ( ( caps & SAHPI_CAPABILITY_POWER ) == 0 ) { return SA_ERR_HPI_CAPABILITY; } if ( state == SAHPI_POWER_CYCLE ) { if ( m_pwr_state == SAHPI_POWER_ON ) { m_pwr_state = SAHPI_POWER_OFF; } else if ( m_pwr_state == SAHPI_POWER_OFF ) { m_pwr_state = SAHPI_POWER_ON; } m_pwr_cycle_cnt = PwrCycleDuration; } else { m_pwr_state = state; m_pwr_cycle_cnt = 0; } return SA_OK; } SaErrorT cResource::ControlParm( SaHpiParmActionT action ) { const SaHpiCapabilitiesT caps = m_rpte.ResourceCapabilities; if ( ( caps & SAHPI_CAPABILITY_CONFIGURATION ) == 0 ) { return SA_ERR_HPI_CAPABILITY; } return SA_OK; } SaErrorT cResource::GetLoadId( SaHpiLoadIdT& load_id ) const { const SaHpiCapabilitiesT caps = m_rpte.ResourceCapabilities; if ( ( caps & SAHPI_CAPABILITY_LOAD_ID ) == 0 ) { return SA_ERR_HPI_CAPABILITY; } load_id = m_load_id; return SA_OK; } SaErrorT cResource::SetLoadId( const SaHpiLoadIdT& load_id ) { const SaHpiCapabilitiesT caps = m_rpte.ResourceCapabilities; if ( ( caps & SAHPI_CAPABILITY_LOAD_ID ) == 0 ) { return SA_ERR_HPI_CAPABILITY; } m_load_id = load_id; return SA_OK; } SaErrorT cResource::GetResetState( SaHpiResetActionT& action ) const { const SaHpiCapabilitiesT caps = m_rpte.ResourceCapabilities; if ( ( caps & SAHPI_CAPABILITY_RESET ) == 0 ) { return SA_ERR_HPI_CAPABILITY; } action = m_rst_state; return SA_OK; } SaErrorT cResource::SetResetState( const SaHpiResetActionT& action ) { const SaHpiCapabilitiesT caps = m_rpte.ResourceCapabilities; if ( ( caps & SAHPI_CAPABILITY_RESET ) == 0 ) { return SA_ERR_HPI_CAPABILITY; } if ( ( action == SAHPI_COLD_RESET ) || ( action == SAHPI_WARM_RESET ) ) { if ( m_rst_state == SAHPI_RESET_ASSERT ) { return SA_ERR_HPI_INVALID_REQUEST; } m_rst_state = SAHPI_RESET_DEASSERT; } else { m_rst_state = action; } return SA_OK; } // Event generation void cResource::PostEvent( SaHpiEventTypeT type, const SaHpiEventUnionT& data, SaHpiSeverityT severity, const InstrumentList& updates, const InstrumentList& removals ) const { if ( m_log ) { const cInstrument * instr = 0; if ( !updates.empty() ) { instr = updates.front(); } else if ( !removals.empty() ) { instr = removals.front(); } if ( instr ) { const SaHpiRdrT& rdr = instr->GetRdr(); m_log->AddEntry( type, data, severity, &rdr, &m_rpte ); } else { m_log->AddEntry( type, data, severity, 0, &m_rpte ); } } if ( !IsVisible() ) { return; } m_handler.PostEvent( type, data, severity, this, updates, removals ); } void cResource::PostResourceEvent( SaHpiResourceEventTypeT type ) const { SaHpiEventUnionT data; data.ResourceEvent.ResourceEventType = type; // attach all instruments InstrumentList updates; if ( type == SAHPI_RESE_RESOURCE_ADDED ) { GetAllInstruments( updates ); } SaHpiSeverityT severity; switch ( type ) { case SAHPI_RESE_RESOURCE_FAILURE: case SAHPI_RESE_RESOURCE_RESTORED: case SAHPI_RESE_RESOURCE_REMOVED: severity = m_rpte.ResourceSeverity; break; default: severity = SAHPI_INFORMATIONAL; } PostEvent( SAHPI_ET_RESOURCE, data, severity, updates ); } void cResource::PostHsEvent( SaHpiHsStateT current, SaHpiHsStateT prev ) const { SaHpiEventUnionT data; SaHpiHotSwapEventT& hse = data.HotSwapEvent; hse.HotSwapState = current; hse.PreviousHotSwapState = prev; hse.CauseOfStateChange = SAHPI_HS_CAUSE_AUTO_POLICY; // TODO // attach all instruments InstrumentList updates; if ( prev == SAHPI_HS_STATE_NOT_PRESENT ) { if ( current != SAHPI_HS_STATE_NOT_PRESENT ) { GetAllInstruments( updates ); } } // TODO severity PostEvent( SAHPI_ET_HOTSWAP, data, SAHPI_INFORMATIONAL, updates ); } // cObject virtual functions void cResource::BeforeVisibilityChange() { cObject::BeforeVisibilityChange(); if ( IsVisible() ) { // Resource disappears if ( m_rpte.ResourceCapabilities & SAHPI_CAPABILITY_FRU ) { PostHsEvent( SAHPI_HS_STATE_NOT_PRESENT, m_hs_state ); } else { PostResourceEvent( SAHPI_RESE_RESOURCE_REMOVED ); } } } void cResource::AfterVisibilityChange() { if ( IsVisible() ) { // Resource appears if ( m_rpte.ResourceCapabilities & SAHPI_CAPABILITY_FRU ) { PostHsEvent( m_hs_state, SAHPI_HS_STATE_NOT_PRESENT ); } else { PostResourceEvent( SAHPI_RESE_RESOURCE_ADDED ); } } cObject::AfterVisibilityChange(); } void cResource::GetNewNames( cObject::NewNames& names ) const { cObject::GetNewNames( names ); names.push_back( "log" ); cInstruments::GetNewNames( names ); } bool cResource::CreateChild( const std::string& name ) { bool rc; rc = cObject::CreateChild( name ); if ( rc ) { return true; } if ( name == cLog::classname ) { CreateLog(); return true; } rc = CreateInstrument( name ); if ( rc ) { return true; } return false; } bool cResource::RemoveChild( const std::string& name ) { bool rc; rc = cObject::RemoveChild( name ); if ( rc ) { return true; } if ( name == cLog::classname ) { RemoveLog(); return true; } rc = RemoveInstrument( name ); if ( rc ) { return true; } return false; } void cResource::GetChildren( Children& children ) const { cObject::GetChildren( children ); if ( m_log ) { children.push_back( m_log ); } cInstruments::GetChildren( children ); } void cResource::GetVars( cVars& vars ) { cObject::GetVars( vars ); SaHpiCapabilitiesT caps = m_rpte.ResourceCapabilities; SaHpiHsCapabilitiesT hs_caps = m_rpte.HotSwapCapabilities; bool fru = ( caps & SAHPI_CAPABILITY_FRU ); bool hs = fru && ( caps & SAHPI_CAPABILITY_MANAGED_HOTSWAP ); bool ind = hs && ( hs_caps & SAHPI_HS_CAPABILITY_INDICATOR_SUPPORTED ); bool load = ( caps & SAHPI_CAPABILITY_LOAD_ID ); bool rst = ( caps & SAHPI_CAPABILITY_RESET ); bool pwr = ( caps & SAHPI_CAPABILITY_POWER ); Structs::GetVars( m_rpte, vars ); vars << "ResourceFailed" << dtSaHpiBoolT << DATA( m_failed, m_new_failed ) << VAR_END(); vars << IF( hs ) << "AutoExtractTimeout" << dtSaHpiTimeoutT << DATA( m_ae_timeout ) << VAR_END(); vars << IF( fru ) << "PreviousHotSwapState" << dtSaHpiHsStateT << DATA( m_prev_hs_state ) << READONLY() << VAR_END(); vars << IF( fru ) << "HotSwapState" << dtSaHpiHsStateT << DATA( m_hs_state, m_new_hs_state ) << VAR_END(); vars << IF( ind ) << "HotSwapIndicatorState" << dtSaHpiHsIndicatorStateT << DATA( m_hs_ind_state ) << VAR_END(); if ( load ) { Structs::GetVars( m_load_id, vars ); } vars << IF( rst ) << "ResetState" << dtSaHpiResetActionT << DATA( m_rst_state ) << VAR_END(); vars << IF( pwr ) << "PowerState" << dtSaHpiPowerStateT << DATA( m_pwr_state ) << VAR_END(); } void cResource::BeforeVarSet( const std::string& var_name ) { cObject::BeforeVarSet( var_name ); m_new_failed = m_failed; m_new_hs_state = m_hs_state; } void cResource::AfterVarSet( const std::string& var_name ) { cObject::AfterVarSet( var_name ); if ( var_name.find( "RptEntry." ) == 0 ) { // RPT Entry was changed PostResourceEvent( SAHPI_RESE_RESOURCE_UPDATED ); } if ( var_name == "PowerState" ) { m_pwr_cycle_cnt = 0; } CommitChanges(); } void cResource::CreateLog() { if ( m_log == 0 ) { m_log = new cLog(); m_rpte.ResourceCapabilities |= cLog::RequiredResourceCap(); PostResourceEvent( SAHPI_RESE_RESOURCE_UPDATED ); } } void cResource::RemoveLog() { if ( m_log ) { delete m_log; m_log = 0; m_rpte.ResourceCapabilities &= ~cLog::RequiredResourceCap(); PostResourceEvent( SAHPI_RESE_RESOURCE_UPDATED ); } } void cResource::TimerEvent() { if ( m_hs_state == SAHPI_HS_STATE_INSERTION_PENDING ) { m_new_hs_state = SAHPI_HS_STATE_ACTIVE; } else if ( m_hs_state == SAHPI_HS_STATE_EXTRACTION_PENDING ) { m_new_hs_state = SAHPI_HS_STATE_INACTIVE; } CommitChanges(); } void cResource::GetTimeouts( SaHpiTimeoutT& ai_timeout, SaHpiTimeoutT& ae_timeout ) const { SaHpiHsCapabilitiesT hs_caps = m_rpte.HotSwapCapabilities; if ( hs_caps & SAHPI_HS_CAPABILITY_AUTOINSERT_IMMEDIATE ) { ai_timeout = SAHPI_TIMEOUT_IMMEDIATE; } else { ai_timeout = m_handler.GetAutoInsertTimeout(); } ae_timeout = m_ae_timeout; } void cResource::CommitChanges() { if ( m_failed != m_new_failed ) { m_failed = m_new_failed; m_rpte.ResourceFailed = m_failed; PostResourceEvent( ( m_failed == SAHPI_FALSE ) ? SAHPI_RESE_RESOURCE_RESTORED : SAHPI_RESE_RESOURCE_FAILURE ); } if ( m_hs_state != m_new_hs_state ) { m_prev_hs_state = m_hs_state; m_hs_state = m_new_hs_state; PostHsEvent( m_hs_state, m_prev_hs_state ); } SaHpiTimeoutT ait, aet, t; if ( m_hs_state == SAHPI_HS_STATE_INSERTION_PENDING ) { GetTimeouts( t, aet ); m_handler.SetTimer( this, t ); } else if ( m_hs_state == SAHPI_HS_STATE_EXTRACTION_PENDING ) { GetTimeouts( ait, t ); m_handler.SetTimer( this, t ); } } }; // namespace TA openhpi-3.6.1/plugins/test_agent/announcement.h0000644000175100017510000000367012575647277020670 0ustar mohanmohan/* -*- c++ -*- * * (C) Copyright Pigeon Point Systems. 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTANNOUNCEMENTLITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #ifndef ANNOUNCEMENT_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 #define ANNOUNCEMENT_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 #include #include #include "object.h" namespace TA { /************************************************************** * class cAnnouncement *************************************************************/ class cAnnouncement : public cObject { public: static const std::string classname; explicit cAnnouncement( SaHpiEntryIdT id ); explicit cAnnouncement( SaHpiEntryIdT id, const SaHpiAnnouncementT& user_data ); virtual ~cAnnouncement(); public: SaHpiEntryIdT GetId() const { return m_data.EntryId; } const SaHpiTimeT& GetTimestamp() const { return m_data.Timestamp; } SaHpiSeverityT GetSeverity() const { return m_data.Severity; } bool IsAcknowledged() const { return ( m_data.Acknowledged != SAHPI_FALSE ); } void Acknowledge() { m_data.Acknowledged = SAHPI_TRUE; } const SaHpiAnnouncementT& GetData() const { return m_data; } protected: // cObject virtual functions virtual void GetVars( cVars& vars ); private: cAnnouncement( const cAnnouncement& ); cAnnouncement& operator =( const cAnnouncement& ); private: // data SaHpiAnnouncementT m_data; }; }; // namespace TA #endif // ANNOUNCEMENT_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 openhpi-3.6.1/plugins/test_agent/server.cpp0000644000175100017510000001410212575647277020027 0ustar mohanmohan/* -*- c++ -*- * * (C) Copyright Pigeon Point Systems. 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #include #ifdef _WIN32 #include #include #include #else #include #include #include #include #include #include #include #endif #include #include #include #include #include #include #include "server.h" namespace TA { /************************************************************** * Helpers *************************************************************/ static void CloseSocket( SockFdT sock ) { if ( sock != InvalidSockFd ) { int cc; #ifdef _WIN32 cc = shutdown( sock, SD_BOTH ); cc = closesocket( sock ); #else cc = shutdown( sock, SHUT_RDWR ); cc = close( sock ); #endif if ( cc != 0 ) { CRIT( "cannot close socket." ); } } } static SockFdT CreateServerSocket( uint16_t port ) { SockFdT s = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); if ( s == InvalidSockFd ) { CRIT( "cannot create server ocket." ); return InvalidSockFd; } int cc; int v = 1; #ifdef _WIN32 cc = setsockopt( s, SOL_SOCKET, SO_REUSEADDR, (const char *)&v, sizeof(v) ); #else cc = setsockopt( s, SOL_SOCKET, SO_REUSEADDR, &v, sizeof(v) ); #endif if ( cc != 0 ) { CRIT( "failed to set SO_REUSEADDR option." ); CloseSocket( s ); return InvalidSockFd; } struct sockaddr_in sa; memset( &sa, 0, sizeof(sa) ); sa.sin_family = AF_INET; sa.sin_port = htons( port ); sa.sin_addr.s_addr = htonl( INADDR_ANY ); cc = bind( s, reinterpret_cast(&sa), sizeof(sa) ); if ( cc != 0 ) { CRIT( "bind failed." ); CloseSocket( s ); return InvalidSockFd; } cc = listen( s, 1 /* TODO */ ); if ( cc != 0 ) { CRIT( "listen failed." ); CloseSocket( s ); return InvalidSockFd; } return s; } enum eWaitCc { eWaitSuccess, eWaitTimeout, eWaitError, }; static eWaitCc WaitOnSocket( SockFdT s ) { fd_set fds; struct timeval tv; FD_ZERO( &fds ); FD_SET( s, &fds ); tv.tv_sec = 3; // TODO tv.tv_usec = 0; #ifdef _WIN32 int cc = select( 0, &fds, 0, 0, &tv ); #else int cc = select( s + 1, &fds, 0, 0, &tv ); #endif if ( cc == 0 ) { // timeout return eWaitTimeout; } else if ( cc != 1 ) { CRIT( "select failed" ); return eWaitError; } else if ( FD_ISSET( s, &fds ) == 0 ) { CRIT( "unexpected select behaviour" ); return eWaitError; } return eWaitSuccess; } /************************************************************** * class cServer *************************************************************/ cServer::cServer( unsigned short port ) : m_port( port ), m_initialized( false ), m_stop( false ), m_thread( 0 ), m_csock( InvalidSockFd ) { g_static_mutex_init( &m_csock_lock ); } cServer::~cServer() { if ( m_thread ) { m_stop = true; g_thread_join( m_thread ); } g_static_mutex_free( &m_csock_lock ); } bool cServer::Init() { if ( m_initialized ) { return true; } if ( g_thread_supported() == FALSE ) { g_thread_init( 0 ); } m_thread = g_thread_create( cServer::ThreadProcAdapter, this, TRUE, 0 ); if ( m_thread == 0 ) { CRIT( "cannot start thread" ); return false; } m_initialized = true; return true; } void cServer::Send( const char * data, size_t len ) const { g_static_mutex_lock( &m_csock_lock ); if ( ( data != 0 ) && ( m_csock != InvalidSockFd ) ) { send( m_csock, data, len, 0 ); } g_static_mutex_unlock( &m_csock_lock ); } gpointer cServer::ThreadProcAdapter( gpointer data ) { cServer * me = reinterpret_cast(data); me->ThreadProc(); return 0; } void cServer::SetClientSocket( SockFdT csock ) { g_static_mutex_lock( &m_csock_lock ); m_csock = csock; g_static_mutex_unlock( &m_csock_lock ); } void cServer::ThreadProc() { SockFdT ssock = CreateServerSocket( m_port ); if ( ssock == InvalidSockFd ) { CRIT( "cannot create server socket." ); return; } while ( !m_stop ) { eWaitCc wcc; wcc = WaitOnSocket( ssock ); if ( wcc == eWaitTimeout ) { continue; } else if ( wcc == eWaitError ) { break; } SockFdT csock = accept( ssock, 0, 0 ); if ( csock == InvalidSockFd ) { CRIT( "accept failed." ); break; } SetClientSocket( csock ); WelcomeUser(); std::vector line; while ( !m_stop ) { wcc = WaitOnSocket( csock ); if ( wcc == eWaitTimeout ) { continue; } else if ( wcc == eWaitError ) { break; } char buf[4096]; int cc = recv( csock, &buf[0], sizeof(buf), 0 ); if ( cc <= 0 ) { break; } size_t got = cc; bool quit = false; for ( size_t i = 0; ( i < got ) && ( !quit ); ++i ) { if ( buf[i] == '\n' ) { ProcessUserLine( line, quit ); line.clear(); } else { line.push_back( buf[i] ); } } if ( quit ) { break; } } SetClientSocket( InvalidSockFd ); CloseSocket( csock ); } CloseSocket( ssock ); } }; // namespace TA openhpi-3.6.1/plugins/test_agent/vars.h0000644000175100017510000001343212575647277017146 0ustar mohanmohan/* -*- c++ -*- * * (C) Copyright Pigeon Point Systems. 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTVARLITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #ifndef VARS_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 #define VARS_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 #include #include namespace TA { /************************************************************** * Data Types *************************************************************/ enum eDataType { dtInvalid, dtSaHpiUint8T, dtSaHpiUint16T, dtSaHpiUint32T, dtSaHpiUint64T, dtSaHpiInt8T, dtSaHpiInt16T, dtSaHpiInt32T, dtSaHpiInt64T, dtSaHpiFloat64T, dtSaHpiBoolT, dtSaHpiManufacturerIdT, dtSaHpiDomainIdT, dtSaHpiResourceIdT, dtSaHpiEntryIdT, dtSaHpiTimeT, dtSaHpiTimeoutT, dtSaHpiLanguageT, dtSaHpiTextTypeT, dtSaHpiTextBufferT, dtSaHpiInstrumentIdT, dtSaHpiEntityPathT, dtSaHpiEventCategoryT, dtSaHpiEventStateT, dtSaHpiEventStateTThreshold, dtSaHpiSensorNumT, dtSaHpiSensorTypeT, dtSaHpiSensorReadingTypeT, dtSaHpiSensorRangeFlagsT, dtSaHpiSensorUnitsT, dtSaHpiSensorModUnitUseT, dtSaHpiSensorThdMaskT, dtSaHpiSensorEventCtrlT, dtSaHpiCtrlNumT, dtSaHpiCtrlTypeT, dtSaHpiCtrlStateDigitalT, dtSaHpiCtrlStateDiscreteT, dtSaHpiCtrlStateAnalogT, dtSaHpiTxtLineNumT, dtSaHpiCtrlModeT, dtSaHpiCtrlOutputTypeT, dtSaHpiIdrIdT, dtSaHpiIdrAreaTypeT, dtSaHpiIdrFieldTypeT, dtSaHpiWatchdogNumT, dtSaHpiWatchdogActionT, dtSaHpiWatchdogActionEventT, dtSaHpiWatchdogPretimerInterruptT, dtSaHpiWatchdogTimerUseT, dtSaHpiWatchdogExpFlagsT, dtSaHpiDimiNumT, dtSaHpiDimiTestServiceImpactT, dtSaHpiDimiTestRunStatusT, dtSaHpiDimiTestErrCodeT, dtSaHpiDimiTestParamTypeT, dtSaHpiDimiTestCapabilityT, dtSaHpiDimiTestNumT, dtSaHpiDimiTestPercentCompletedT, dtSaHpiDimiReadyT, dtSaHpiFumiNumT, dtSaHpiBankNumT, dtSaHpiFumiSpecInfoTypeT, dtSaHpiFumiSafDefinedSpecIdT, dtSaHpiFumiServiceImpactT, dtSaHpiFumiSourceStatusT, dtSaHpiFumiBankStateT, dtSaHpiFumiUpgradeStatusT, dtSaHpiFumiLogicalBankStateFlagsT, dtSaHpiFumiProtocolT, dtSaHpiFumiCapabilityT, dtSaHpiHsIndicatorStateT, dtSaHpiHsStateT, dtSaHpiHsCauseOfStateChangeT, dtSaHpiSeverityT, dtSaHpiResourceEventTypeT, dtSaHpiDomainEventTypeT, dtSaHpiSensorOptionalDataT, dtSaHpiSensorEnableOptDataT, dtSaHpiSwEventTypeT, dtSaHpiEventTypeT, dtSaHpiAnnunciatorNumT, dtSaHpiNameT, dtSaHpiStatusCondTypeT, dtSaHpiAnnunciatorModeT, dtSaHpiAnnunciatorTypeT, dtSaHpiRdrTypeT, dtSaHpiParmActionT, dtSaHpiResetActionT, dtSaHpiPowerStateT, dtSaHpiLoadNumberT, dtSaHpiGuidT, dtSaHpiCapabilitiesT, dtSaHpiHsCapabilitiesT, dtSaHpiEventLogOverflowActionT, dtSaHpiEventLogCapabilitiesT, dtSaHpiEventLogEntryIdT, // Non-trivial cases dtSaHpiCtrlStateStreamTWithoutRepeat, dtSaHpiCtrlStateOemTWithoutMId, dtControlOemConfigData, dtSensorReadingBuffer, dtDimiTestParamName, dtSaHpiFumiOemDefinedSpecInfoTWithoutMid, }; /************************************************************** * Var *************************************************************/ struct Var { explicit Var() : type( dtInvalid ), rdata( 0 ), wdata( 0 ) { // empty } explicit Var( eDataType _type, const std::string& _name, const void * _rdata, void * _wdata ) : type( _type ), name( _name ), rdata( _rdata ), wdata( _wdata ) { // empty } // data eDataType type; std::string name; const void * rdata; void * wdata; }; /************************************************************** * cVars components *************************************************************/ struct IF { explicit IF( bool _cond ) : cond( _cond ) { // empty } bool cond; }; struct READONLY { }; struct READONLY_IF { explicit READONLY_IF( bool _cond ) : cond( _cond ) { // empty } bool cond; }; struct DATA { template explicit DATA( X& rwx ) : rdata( &rwx ), wdata( &rwx ) { // empty } template explicit DATA( const X& rx, X& wx ) : rdata( &rx ), wdata( &wx ) { // empty } const void * rdata; void * wdata; }; struct VAR_END { }; typedef std::list VarList; typedef VarList::const_iterator VarIter; /************************************************************** * cVars *************************************************************/ class cVars : private VarList { public: explicit cVars(); ~cVars(); VarIter begin() const { return VarList::begin(); } VarIter end() const { return VarList::end(); } cVars& operator <<( const IF& i_f ); cVars& operator <<( const std::string& name ); cVars& operator <<( eDataType type ); cVars& operator <<( const READONLY& ); cVars& operator <<( const READONLY_IF& ); cVars& operator <<( const DATA& d ); cVars& operator <<( const VAR_END& ); private: cVars( const cVars& ); cVars& operator =( const cVars& ); private: // data bool m_cond; bool m_ro_cond; Var m_pending; }; }; // namespace TA #endif // VARS_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 openhpi-3.6.1/plugins/test_agent/area.h0000644000175100017510000000553112575647277017104 0ustar mohanmohan/* -*- c++ -*- * * (C) Copyright Pigeon Point Systems. 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTAREALITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #ifndef AREA_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 #define AREA_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 #include #include #include #include "object.h" namespace TA { /************************************************************** * class cArea *************************************************************/ class cField; class cArea : public cObject { public: static const std::string classname; explicit cArea( volatile SaHpiUint32T& update_count, SaHpiEntryIdT id, SaHpiIdrAreaTypeT type = SAHPI_IDR_AREATYPE_OEM ); virtual ~cArea(); public: SaHpiEntryIdT GetId() const { return m_id; } SaHpiIdrAreaTypeT GetType() const { return m_type; } void GetHeader( SaHpiIdrAreaHeaderT& hdr ) const; bool CanBeDeleted() const; cField * GetField( SaHpiEntryIdT fid ) const; public: // HPI interface SaErrorT GetField( SaHpiIdrFieldTypeT ftype, SaHpiEntryIdT fid, SaHpiEntryIdT& next_fid, SaHpiIdrFieldT& field ) const; SaErrorT AddField( SaHpiIdrFieldTypeT ftype, const SaHpiTextBufferT& fdata, SaHpiEntryIdT& fid ); SaErrorT AddFieldById( SaHpiEntryIdT fid, SaHpiIdrFieldTypeT ftype, const SaHpiTextBufferT& fdata ); SaErrorT SetField( SaHpiEntryIdT fid, SaHpiIdrFieldTypeT ftype, const SaHpiTextBufferT& fdata ); SaErrorT DeleteFieldById( SaHpiEntryIdT fid ); protected: // cObject virtual functions virtual void GetNewNames( cObject::NewNames& names ) const; virtual bool CreateChild( const std::string& name ); virtual bool RemoveChild( const std::string& name ); virtual void GetChildren( cObject::Children& children ) const; virtual void GetVars( cVars& vars ); virtual void AfterVarSet( const std::string& var_name ); private: cArea( const cArea& ); cArea& operator =( const cArea& ); private: // data SaHpiEntryIdT m_id; SaHpiIdrAreaTypeT m_type; SaHpiBoolT m_readonly; volatile SaHpiUint32T& m_update_count; typedef std::list Fields; Fields m_fields; }; }; // namespace TA #endif // AREA_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 openhpi-3.6.1/plugins/test_agent/watchdog.h0000644000175100017510000000356212575647277017776 0ustar mohanmohan/* -*- c++ -*- * * (C) Copyright Pigeon Point Systems. 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTWATCHDOGLITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #ifndef WATCHDOG_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 #define WATCHDOG_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 #include #include #include "instrument.h" #include "timers.h" namespace TA { /************************************************************** * class cWatchdog *************************************************************/ class cWatchdog : public cInstrument, private cTimerCallback { public: static const std::string classname; explicit cWatchdog( cHandler& handler, cResource& resource, SaHpiWatchdogNumT num ); virtual ~cWatchdog(); public: // HPI interface SaErrorT Get( SaHpiWatchdogT& wdt ) const; SaErrorT Set( const SaHpiWatchdogT& wdt ); SaErrorT Reset(); protected: // cObject virtual functions virtual void GetVars( cVars& vars ); private: cWatchdog( const cWatchdog& ); cWatchdog& operator =( const cWatchdog& ); private: virtual SaHpiCapabilitiesT RequiredResourceCap() const { return SAHPI_CAPABILITY_WATCHDOG; } private: // cTimerCallback virtual functions virtual void TimerEvent(); private: void ProcessTick(); void PostEvent( SaHpiWatchdogActionEventT ae ); private: // data const SaHpiWatchdogRecT& m_rec; SaHpiWatchdogT m_wdt; }; }; // namespace TA #endif // WATCHDOG_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 openhpi-3.6.1/plugins/test_agent/bank.cpp0000644000175100017510000007744112575647277017453 0ustar mohanmohan/* -*- c++ -*- * * (C) Copyright Pigeon Point Systems. 2012 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTAREALITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #include #include #include "bank.h" #include "codec.h" #include "fumi.h" #include "handler.h" #include "structs.h" #include "utils.h" namespace TA { /************************************************************** * Helper functions *************************************************************/ static SaHpiFumiBankInfoT MakeDefaultBankInfo( SaHpiBankNumT num ) { SaHpiFumiBankInfoT info; info.BankId = num; info.BankSize = ( num == 0 ) ? 0 : 42; info.Position = num; info.BankState = ( num == 0 ) ? SAHPI_FUMI_BANK_UNKNOWN : SAHPI_FUMI_BANK_VALID; FormatHpiTextBuffer( info.Identifier, "/banks/bank%u.img", (unsigned int)num ); MakeHpiTextBuffer( info.Description, "Firmware" ); MakeHpiTextBuffer( info.DateTime, "1979-06-10" ); info.MajorVersion = 1; info.MinorVersion = 2; info.AuxVersion = 3; return info; } static SaHpiFumiLogicalBankInfoT MakeDefaultLogicalBankInfo( SaHpiBankNumT num ) { SaHpiFumiLogicalBankInfoT info; info.FirmwarePersistentLocationCount = 3; info.BankStateFlags = 0; SaHpiFumiFirmwareInstanceInfoT& pfw = info.PendingFwInstance; pfw.InstancePresent = SAHPI_FALSE; FormatHpiTextBuffer( pfw.Identifier, "/banks/bank%u_pending.img", (unsigned int)num ); MakeHpiTextBuffer( pfw.Description, "Firmware" ); MakeHpiTextBuffer( pfw.DateTime, "1979-06-14" ); pfw.MajorVersion = 1; pfw.MinorVersion = 2; pfw.AuxVersion = 4; SaHpiFumiFirmwareInstanceInfoT& rfw = info.RollbackFwInstance; rfw.InstancePresent = SAHPI_FALSE; FormatHpiTextBuffer( rfw.Identifier, "/banks/bank%u_rollback.img", (unsigned int)num ); MakeHpiTextBuffer( rfw.Description, "Firmware" ); MakeHpiTextBuffer( rfw.DateTime, "1979-06-05" ); rfw.MajorVersion = 1; rfw.MinorVersion = 2; rfw.AuxVersion = 2; return info; } static SaHpiFumiSourceInfoT MakeDefaultSourceInfo() { SaHpiFumiSourceInfoT info; MakeHpiTextBuffer( info.SourceUri, "file:///tmp/1.fw" ); info.SourceStatus = SAHPI_FUMI_SRC_VALID; MakeHpiTextBuffer( info.Identifier, "" ); MakeHpiTextBuffer( info.Description, "Firmware" ); MakeHpiTextBuffer( info.DateTime, "1979-06-14" ); info.MajorVersion = 1; info.MinorVersion = 2; info.AuxVersion = 4; return info; } static void MakeDefaultComponents( SaHpiFumiComponentInfoT * components, size_t max_components ) { for ( size_t i = 0; i < max_components; ++i ) { SaHpiFumiComponentInfoT& c = components[i]; SaHpiFumiFirmwareInstanceInfoT& fw = c.MainFwInstance; c.EntryId = i; c.ComponentId = i; fw.InstancePresent = SAHPI_TRUE; FormatHpiTextBuffer( fw.Identifier, "/components/component%u.img", (unsigned int)i ); MakeHpiTextBuffer( fw.Description, "Firmware" ); MakeHpiTextBuffer( fw.DateTime, "1979-06-10" ); fw.MajorVersion = 1; fw.MinorVersion = 2; fw.AuxVersion = 3; c.ComponentFlags = 0; } } static void MakeDefaultLogicalComponents( SaHpiFumiLogicalComponentInfoT * components, size_t max_components ) { for ( size_t i = 0; i < max_components; ++i ) { SaHpiFumiLogicalComponentInfoT& c = components[i]; c.EntryId = i; c.ComponentId = i; SaHpiFumiFirmwareInstanceInfoT& pfw = c.PendingFwInstance; pfw.InstancePresent = SAHPI_FALSE; FormatHpiTextBuffer( pfw.Identifier, "/components/component%u_pending.img", (unsigned int)i ); MakeHpiTextBuffer( pfw.Description, "Firmware" ); MakeHpiTextBuffer( pfw.DateTime, "1979-06-14" ); pfw.MajorVersion = 1; pfw.MinorVersion = 2; pfw.AuxVersion = 4; SaHpiFumiFirmwareInstanceInfoT& rfw = c.RollbackFwInstance; rfw.InstancePresent = SAHPI_FALSE; FormatHpiTextBuffer( rfw.Identifier, "/components/component%u_rollback.img", (unsigned int)i ); MakeHpiTextBuffer( rfw.Description, "Firmware" ); MakeHpiTextBuffer( rfw.DateTime, "1979-06-05" ); rfw.MajorVersion = 1; rfw.MinorVersion = 2; rfw.AuxVersion = 2; c.ComponentFlags = 0; } } static void MakeDefaultSourceComponents( SaHpiFumiComponentInfoT * components, size_t max_components ) { for ( size_t i = 0; i < max_components; ++i ) { SaHpiFumiComponentInfoT& c = components[i]; SaHpiFumiFirmwareInstanceInfoT& fw = c.MainFwInstance; c.EntryId = i; c.ComponentId = i; fw.InstancePresent = SAHPI_TRUE; FormatHpiTextBuffer( fw.Identifier, "/components/component%u.img", (unsigned int)i ); MakeHpiTextBuffer( fw.Description, "Firmware" ); MakeHpiTextBuffer( fw.DateTime, "1979-06-14" ); fw.MajorVersion = 1; fw.MinorVersion = 2; fw.AuxVersion = 4; c.ComponentFlags = 0; } } static bool GetEntryIds( SaHpiEntryIdT requested_eid, const SaHpiBoolT * arr_enabled, size_t arr_size, SaHpiEntryIdT& eid, SaHpiEntryIdT& next_eid ) { if ( requested_eid >= arr_size ) { return false; } if ( requested_eid == SAHPI_FIRST_ENTRY ) { eid = SAHPI_LAST_ENTRY; for ( SaHpiEntryIdT i = 0; i < arr_size; ++i ) { if ( arr_enabled[i] != SAHPI_FALSE ) { eid = i; break; } } if ( eid == SAHPI_LAST_ENTRY ) { return false; } } else { eid = requested_eid; if ( arr_enabled[eid] == SAHPI_FALSE ) { return false; } } next_eid = SAHPI_LAST_ENTRY; for ( SaHpiEntryIdT i = eid + 1; i < arr_size; ++i ) { if ( arr_enabled[i] != SAHPI_FALSE ) { next_eid = i; break; } } return true; } static void ResetSourceInfo( SaHpiFumiSourceInfoT& info, SaHpiFumiSourceStatusT status, bool reset_uri ) { if ( reset_uri ) { MakeHpiTextBuffer( info.SourceUri, "" ); } info.SourceStatus = status; MakeHpiTextBuffer( info.Identifier, "" ); MakeHpiTextBuffer( info.Description, "" ); MakeHpiTextBuffer( info.DateTime, "" ); info.MajorVersion = 0; info.MinorVersion = 0; info.AuxVersion = 0; } static void ResetComponents( SaHpiBoolT * enabled, SaHpiFumiComponentInfoT * components, size_t max_components ) { for ( size_t i = 0; i < max_components; ++i ) { enabled[i] = SAHPI_FALSE; SaHpiFumiComponentInfoT& c = components[i]; SaHpiFumiFirmwareInstanceInfoT& fw = c.MainFwInstance; c.EntryId = i; c.ComponentId = i; fw.InstancePresent = SAHPI_FALSE; MakeHpiTextBuffer( fw.Identifier, "" ); MakeHpiTextBuffer( fw.Description, "" ); MakeHpiTextBuffer( fw.DateTime, "" ); fw.MajorVersion = 0; fw.MinorVersion = 0; fw.AuxVersion = 0; c.ComponentFlags = 0; } } static bool SplitUri( const SaHpiTextBufferT& uri, std::string& proto, std::string& path ) { std::string s; ToTxt( Var( dtSaHpiTextBufferT, "", &uri, 0 ), s ); size_t pos = 0, pos2; pos2 = s.find_first_of( ':', pos ); if ( pos2 == std::string::npos ) { return false; } std::string type( s.begin() + pos, s.begin() + pos2 ); if ( ( type != "TEXT" ) && ( type != "ASCII6" ) ) { return false; } pos = pos2 + 1; pos2 = s.find( "://", pos ); if ( pos2 == std::string::npos ) { return false; } proto.assign( s.begin() + pos, s.begin() + pos2 ); pos = pos2 + 3; if ( pos >= s.size() ) { return false; } path.assign( s.begin() + pos, s.end() ); return true; } /************************************************************** * class cBank *************************************************************/ const std::string cBank::classname( "bank" ); cBank::cBank( cHandler& handler, cFumi& fumi, SaHpiBankNumT num ) : cObject( AssembleNumberedObjectName( classname, num ) ), m_handler( handler ), m_fumi( fumi ), m_info( MakeDefaultBankInfo( num ) ), m_logical_info( MakeDefaultLogicalBankInfo( num ) ), m_src_set( SAHPI_FALSE ), m_src_info( MakeDefaultSourceInfo() ), m_status( SAHPI_FUMI_OPERATION_NOTSTARTED ), m_verify_main( false ), m_copy_dest_num( 0xFFU ) { MakeDefaultComponents( m_components, MAX_COMPONENTS ); MakeDefaultLogicalComponents( m_logical_components, MAX_COMPONENTS ); MakeDefaultSourceComponents( m_src_components, MAX_COMPONENTS ); for ( size_t i = 0; i < MAX_COMPONENTS; ++i ) { m_enabled_components[i] = SAHPI_FALSE; m_enabled_src_components[i] = SAHPI_FALSE; } m_enabled_components[2] = SAHPI_TRUE; m_enabled_components[5] = SAHPI_TRUE; m_enabled_src_components[1] = SAHPI_TRUE; m_enabled_src_components[3] = SAHPI_TRUE; m_next.action_duration = 5000000000LL; // 5 sec m_next.pass.validate = SAHPI_TRUE; m_next.pass.install = SAHPI_TRUE; m_next.pass.rollback = SAHPI_TRUE; m_next.pass.backup = SAHPI_TRUE; m_next.pass.copy = SAHPI_TRUE; m_next.pass.verify = SAHPI_TRUE; m_next.pass.verifymain = SAHPI_TRUE; m_next.pass.activate = SAHPI_TRUE; m_next.src_fail_status = SAHPI_FUMI_SRC_UNREACHABLE; m_next.src_info = MakeDefaultSourceInfo(); } cBank::~cBank() { m_handler.CancelTimer( this ); } SaHpiUint32T cBank::Position() const { return m_info.Position; } void cBank::SetPosition( SaHpiUint32T pos ) { m_info.Position = pos; } SaHpiFumiBankStateT cBank::State() const { return m_info.BankState; } // HPI Interface SaErrorT cBank::SetSource( const SaHpiTextBufferT& uri ) { if ( m_src_set != SAHPI_FALSE ) { return SA_ERR_HPI_INVALID_REQUEST; } ResetSourceInfo( m_src_info, SAHPI_FUMI_SRC_VALIDATION_NOT_STARTED, true ); ResetComponents( m_enabled_src_components, m_src_components, MAX_COMPONENTS ); m_src_info.SourceUri = uri; m_src_set = SAHPI_TRUE; return SA_OK; } SaErrorT cBank::StartSourceValidation() { if ( m_src_set == SAHPI_FALSE ) { return SA_ERR_HPI_INVALID_REQUEST; } bool has = m_handler.HasTimerSet( this ); if ( has ) { return SA_ERR_HPI_INVALID_REQUEST; } m_src_info.SourceStatus = SAHPI_FUMI_SRC_VALIDATION_INITIATED; ChangeStatus( SAHPI_FUMI_SOURCE_VALIDATION_INITIATED ); m_handler.SetTimer( this, m_next.action_duration ); return SA_OK; } SaErrorT cBank::GetSourceInfo( SaHpiFumiSourceInfoT& info ) const { if ( m_src_set == SAHPI_FALSE ) { return SA_ERR_HPI_INVALID_REQUEST; } info = m_src_info; return SA_OK; } SaErrorT cBank::GetSourceComponentInfo( SaHpiEntryIdT eid, SaHpiEntryIdT& next_eid, SaHpiFumiComponentInfoT& info ) const { if ( ( m_fumi.Capabilities() & SAHPI_FUMI_CAP_COMPONENTS ) == 0 ) { return SA_ERR_HPI_CAPABILITY; } if ( m_src_set == SAHPI_FALSE ) { return SA_ERR_HPI_INVALID_REQUEST; } bool rc = GetEntryIds( eid, m_enabled_src_components, MAX_COMPONENTS, eid, next_eid ); if ( !rc ) { return SA_ERR_HPI_NOT_PRESENT; } info = m_src_components[eid]; return SA_OK; } SaErrorT cBank::GetTargetInfo( SaHpiFumiBankInfoT& info ) const { info = m_info; return SA_OK; } SaErrorT cBank::GetTargetComponentInfo( SaHpiEntryIdT eid, SaHpiEntryIdT& next_eid, SaHpiFumiComponentInfoT& info ) const { if ( ( m_fumi.Capabilities() & SAHPI_FUMI_CAP_COMPONENTS ) == 0 ) { return SA_ERR_HPI_CAPABILITY; } bool rc = GetEntryIds( eid, m_enabled_components, MAX_COMPONENTS, eid, next_eid ); if ( !rc ) { return SA_ERR_HPI_NOT_PRESENT; } info = m_components[eid]; return SA_OK; } SaErrorT cBank::GetLogicalTargetInfo( SaHpiFumiLogicalBankInfoT& info ) const { if ( m_info.BankId != 0 ) { return SA_ERR_HPI_INVALID_REQUEST; } info = m_logical_info; return SA_OK; } SaErrorT cBank::GetLogicalTargetComponentInfo( SaHpiEntryIdT eid, SaHpiEntryIdT& next_eid, SaHpiFumiLogicalComponentInfoT& info ) const { if ( ( m_fumi.Capabilities() & SAHPI_FUMI_CAP_COMPONENTS ) == 0 ) { return SA_ERR_HPI_CAPABILITY; } if ( m_info.BankId != 0 ) { return SA_ERR_HPI_INVALID_REQUEST; } bool rc = GetEntryIds( eid, m_enabled_components, MAX_COMPONENTS, eid, next_eid ); if ( !rc ) { return SA_ERR_HPI_NOT_PRESENT; } info = m_logical_components[eid]; return SA_OK; } SaErrorT cBank::StartBackup() { if ( ( m_fumi.Capabilities() & SAHPI_FUMI_CAP_BACKUP ) == 0 ) { return SA_ERR_HPI_CAPABILITY; } if ( m_info.BankId != 0 ) { return SA_ERR_HPI_INVALID_REQUEST; } bool has = m_handler.HasTimerSet( this ); if ( has ) { return SA_ERR_HPI_INVALID_REQUEST; } ChangeStatus( SAHPI_FUMI_BACKUP_INITIATED ); m_handler.SetTimer( this, m_next.action_duration ); return SA_OK; } SaErrorT cBank::StartCopy( SaHpiBankNumT dest_num ) { if ( ( m_fumi.Capabilities() & SAHPI_FUMI_CAP_BANKCOPY ) == 0 ) { return SA_ERR_HPI_CAPABILITY; } if ( m_info.BankId == 0 ) { return SA_ERR_HPI_INVALID_REQUEST; } if ( dest_num == 0 ) { return SA_ERR_HPI_INVALID_REQUEST; } if ( m_info.BankId == dest_num ) { return SA_ERR_HPI_INVALID_REQUEST; } cBank * dest = m_fumi.GetBank( dest_num ); if ( !dest ) { return SA_ERR_HPI_INVALID_DATA; } bool has = m_handler.HasTimerSet( this ); if ( has ) { return SA_ERR_HPI_INVALID_REQUEST; } m_copy_dest_num = dest_num; ChangeStatus( SAHPI_FUMI_BANK_COPY_INITIATED ); m_handler.SetTimer( this, m_next.action_duration ); return SA_OK; } SaErrorT cBank::StartInstallation() { if ( m_src_set == SAHPI_FALSE ) { return SA_ERR_HPI_INVALID_REQUEST; } bool ok = false; ok = ok || ( m_src_info.SourceStatus == SAHPI_FUMI_SRC_VALID ); ok = ok || ( m_src_info.SourceStatus == SAHPI_FUMI_SRC_VALIDITY_UNKNOWN ); if ( !ok ) { return SA_ERR_HPI_INVALID_REQUEST; } bool has = m_handler.HasTimerSet( this ); if ( has ) { return SA_ERR_HPI_INVALID_REQUEST; } ChangeStatus( SAHPI_FUMI_INSTALL_INITIATED ); m_handler.SetTimer( this, m_next.action_duration ); return SA_OK; } SaErrorT cBank::GetUpgradeStatus( SaHpiFumiUpgradeStatusT& status ) const { status = m_status; return SA_OK; } SaErrorT cBank::StartTargetVerification() { if ( ( m_fumi.Capabilities() & SAHPI_FUMI_CAP_TARGET_VERIFY ) == 0 ) { return SA_ERR_HPI_CAPABILITY; } if ( m_src_set == SAHPI_FALSE ) { return SA_ERR_HPI_INVALID_REQUEST; } bool ok = false; ok = ok || ( m_src_info.SourceStatus == SAHPI_FUMI_SRC_VALID ); ok = ok || ( m_src_info.SourceStatus == SAHPI_FUMI_SRC_VALIDITY_UNKNOWN ); if ( !ok ) { return SA_ERR_HPI_INVALID_REQUEST; } if ( m_info.BankId == 0 ) { if ( m_logical_info.PendingFwInstance.InstancePresent == SAHPI_FALSE ) { return SA_ERR_HPI_INVALID_REQUEST; } } bool has = m_handler.HasTimerSet( this ); if ( has ) { return SA_ERR_HPI_INVALID_REQUEST; } m_verify_main = false; ChangeStatus( SAHPI_FUMI_TARGET_VERIFY_INITIATED ); m_handler.SetTimer( this, m_next.action_duration ); return SA_OK; } SaErrorT cBank::StartTargetMainVerification() { if ( ( m_fumi.Capabilities() & SAHPI_FUMI_CAP_TARGET_VERIFY_MAIN ) == 0 ) { return SA_ERR_HPI_CAPABILITY; } if ( m_info.BankId != 0 ) { return SA_ERR_HPI_INVALID_REQUEST; } if ( m_src_set == SAHPI_FALSE ) { return SA_ERR_HPI_INVALID_REQUEST; } bool ok = false; ok = ok || ( m_src_info.SourceStatus == SAHPI_FUMI_SRC_VALID ); ok = ok || ( m_src_info.SourceStatus == SAHPI_FUMI_SRC_VALIDITY_UNKNOWN ); if ( !ok ) { return SA_ERR_HPI_INVALID_REQUEST; } bool has = m_handler.HasTimerSet( this ); if ( has ) { return SA_ERR_HPI_INVALID_REQUEST; } m_verify_main = true; ChangeStatus( SAHPI_FUMI_TARGET_VERIFY_INITIATED ); m_handler.SetTimer( this, m_next.action_duration ); return SA_OK; } SaErrorT cBank::CancelUpgrade() { bool has = m_handler.HasTimerSet( this ); if ( !has ) { return SA_ERR_HPI_INVALID_REQUEST; } m_handler.CancelTimer( this ); SaHpiFumiUpgradeStatusT new_status; switch ( m_status ) { case SAHPI_FUMI_SOURCE_VALIDATION_INITIATED: new_status = SAHPI_FUMI_SOURCE_VALIDATION_CANCELLED; break; case SAHPI_FUMI_INSTALL_INITIATED: new_status = SAHPI_FUMI_INSTALL_CANCELLED; break; case SAHPI_FUMI_BACKUP_INITIATED: new_status = SAHPI_FUMI_BACKUP_CANCELLED; break; case SAHPI_FUMI_BANK_COPY_INITIATED: new_status = SAHPI_FUMI_BANK_COPY_CANCELLED; break; case SAHPI_FUMI_TARGET_VERIFY_INITIATED: new_status = SAHPI_FUMI_TARGET_VERIFY_CANCELLED; break; case SAHPI_FUMI_ACTIVATE_INITIATED: new_status = SAHPI_FUMI_ACTIVATE_CANCELLED; break; case SAHPI_FUMI_ROLLBACK_INITIATED: case SAHPI_FUMI_INSTALL_FAILED_ROLLBACK_INITIATED: case SAHPI_FUMI_ACTIVATE_FAILED_ROLLBACK_INITIATED: new_status = SAHPI_FUMI_ROLLBACK_CANCELLED; break; default: new_status = m_status; } ChangeStatus( new_status ); return SA_OK; } SaErrorT cBank::StartRollback() { if ( ( m_fumi.Capabilities() & SAHPI_FUMI_CAP_ROLLBACK ) == 0 ) { return SA_ERR_HPI_CAPABILITY; } if ( m_info.BankId != 0 ) { return SA_ERR_HPI_INVALID_REQUEST; } if ( m_logical_info.RollbackFwInstance.InstancePresent == SAHPI_FALSE ) { return SA_ERR_HPI_INVALID_REQUEST; } bool has = m_handler.HasTimerSet( this ); if ( has ) { return SA_ERR_HPI_INVALID_REQUEST; } ChangeStatus( SAHPI_FUMI_ROLLBACK_INITIATED ); m_handler.SetTimer( this, m_next.action_duration ); return SA_OK; } SaErrorT cBank::StartActivation( SaHpiBoolT pass ) { if ( m_info.BankId == 0 ) { if ( m_logical_info.PendingFwInstance.InstancePresent == SAHPI_FALSE ) { return SA_ERR_HPI_INVALID_REQUEST; } } bool has = m_handler.HasTimerSet( this ); if ( has ) { return SA_ERR_HPI_INVALID_REQUEST; } m_next.pass.activate = pass; ChangeStatus( SAHPI_FUMI_ACTIVATE_INITIATED ); m_handler.SetTimer( this, m_next.action_duration ); return SA_OK; } SaErrorT cBank::Cleanup() { m_handler.CancelTimer( this ); ResetSourceInfo( m_src_info, SAHPI_FUMI_SRC_VALIDATION_NOT_STARTED, true ); ResetComponents( m_enabled_src_components, m_src_components, MAX_COMPONENTS ); m_src_set = SAHPI_FALSE; m_verify_main = false; m_copy_dest_num = 0xFFU; ChangeStatus( SAHPI_FUMI_OPERATION_NOTSTARTED ); return SA_OK; } // cObject virtual functions void cBank::GetVars( cVars& vars ) { cObject::GetVars( vars ); Structs::GetVars( m_info, vars ); if ( m_info.BankId == 0 ) { Structs::GetVars( m_logical_info, vars ); } for ( size_t i = 0; i < MAX_COMPONENTS; ++i ) { char prefix[256]; snprintf( &prefix[0], sizeof(prefix), "Component[%u]", (unsigned int)i ); const std::string name( prefix ); vars << name + ".Enabled" << dtSaHpiBoolT << DATA( m_enabled_components[i] ) << VAR_END(); if ( m_enabled_components[i] != SAHPI_FALSE ) { Structs::GetVars( name, m_components[i], vars ); if ( m_info.BankId == 0 ) { Structs::GetVars( name, m_logical_components[i], vars ); } } } vars << "Next.ActionDuration" << dtSaHpiTimeoutT << DATA( m_next.action_duration ) << VAR_END(); vars << "Next.Pass.Validate" << dtSaHpiBoolT << DATA( m_next.pass.validate ) << VAR_END(); vars << "Next.Pass.Install" << dtSaHpiBoolT << DATA( m_next.pass.install ) << VAR_END(); vars << "Next.Pass.Rollback" << dtSaHpiBoolT << DATA( m_next.pass.rollback ) << VAR_END(); vars << "Next.Pass.Backup" << dtSaHpiBoolT << DATA( m_next.pass.backup ) << VAR_END(); vars << "Next.Pass.Copy" << dtSaHpiBoolT << DATA( m_next.pass.copy ) << VAR_END(); vars << "Next.Pass.Verify" << dtSaHpiBoolT << DATA( m_next.pass.verify ) << VAR_END(); vars << "Next.Pass.Verifymain" << dtSaHpiBoolT << DATA( m_next.pass.verifymain ) << VAR_END(); vars << "Next.Pass.SourceFailStatus" << dtSaHpiFumiSourceStatusT << DATA( m_next.src_fail_status ) << VAR_END(); Structs::GetVars( "Next.SourceInfo", m_next.src_info, true, vars ); } void cBank::AfterVarSet( const std::string& var_name ) { cObject::AfterVarSet( var_name ); } // cTimerCallback virtual functions void cBank::TimerEvent() { cLocker al( &m_handler ); switch ( m_status ) { case SAHPI_FUMI_SOURCE_VALIDATION_INITIATED: DoValidation(); break; case SAHPI_FUMI_INSTALL_INITIATED: DoInstall(); break; case SAHPI_FUMI_BACKUP_INITIATED: DoBackup(); break; case SAHPI_FUMI_BANK_COPY_INITIATED: DoCopy(); break; case SAHPI_FUMI_TARGET_VERIFY_INITIATED: DoVerification(); break; case SAHPI_FUMI_ACTIVATE_INITIATED: DoActivation(); break; case SAHPI_FUMI_ROLLBACK_INITIATED: case SAHPI_FUMI_INSTALL_FAILED_ROLLBACK_INITIATED: case SAHPI_FUMI_ACTIVATE_FAILED_ROLLBACK_INITIATED: DoRollback(); break; default: break; } } void cBank::ChangeStatus( SaHpiFumiUpgradeStatusT status ) { if ( m_status == status ) { return; } m_status = status; if ( IsVisible() ) { m_fumi.PostEvent( m_info.BankId, m_status ); } } void cBank::DoValidation() { bool rc; std::string proto, path; rc = SplitUri( m_src_info.SourceUri, proto, path ); if ( !rc ) { m_src_info.SourceStatus = SAHPI_FUMI_SRC_PROTOCOL_NOT_SUPPORTED; ChangeStatus( SAHPI_FUMI_SOURCE_VALIDATION_FAILED ); return; } rc = m_fumi.CheckProtocol( proto ); if ( !rc ) { m_src_info.SourceStatus = SAHPI_FUMI_SRC_PROTOCOL_NOT_SUPPORTED; ChangeStatus( SAHPI_FUMI_SOURCE_VALIDATION_FAILED ); return; } if ( m_next.pass.validate == SAHPI_FALSE ) { m_src_info.SourceStatus = m_next.src_fail_status; ChangeStatus( SAHPI_FUMI_SOURCE_VALIDATION_FAILED ); return; } m_next.src_info.SourceUri = m_src_info.SourceUri; m_next.src_info.SourceStatus = SAHPI_FUMI_SRC_VALID; m_src_info = m_next.src_info; for ( size_t i = 0; i < MAX_COMPONENTS; ++i ) { m_enabled_src_components[i] = m_enabled_components[i]; SaHpiFumiComponentInfoT& c = m_src_components[i]; c = m_components[i]; c.MainFwInstance.DateTime = m_next.src_info.DateTime; c.MainFwInstance.MajorVersion = m_next.src_info.MajorVersion; c.MainFwInstance.MinorVersion = m_next.src_info.MinorVersion; c.MainFwInstance.AuxVersion = m_next.src_info.AuxVersion; } ChangeStatus( SAHPI_FUMI_SOURCE_VALIDATION_DONE ); } void cBank::DoInstall() { if ( m_next.pass.install == SAHPI_FALSE ) { SaHpiFumiUpgradeStatusT new_status = SAHPI_FUMI_INSTALL_FAILED_ROLLBACK_NOT_POSSIBLE; if ( m_info.BankId == 0 ) { bool has_rb_fw = ( m_logical_info.RollbackFwInstance.InstancePresent != SAHPI_FALSE ); bool has_autorb_cap = ( ( m_fumi.Capabilities() & SAHPI_FUMI_CAP_AUTOROLLBACK ) != 0 ); bool autorb_disabled = m_fumi.IsAutoRollbackDisabled(); if ( has_rb_fw ) { if ( has_autorb_cap && ( !autorb_disabled ) ) { new_status = SAHPI_FUMI_INSTALL_FAILED_ROLLBACK_INITIATED; } else { new_status = SAHPI_FUMI_INSTALL_FAILED_ROLLBACK_NEEDED; } } } ChangeStatus( new_status ); if ( new_status == SAHPI_FUMI_INSTALL_FAILED_ROLLBACK_INITIATED ) { m_handler.SetTimer( this, m_next.action_duration ); } return; } if ( m_info.BankId == 0 ) { m_logical_info.PendingFwInstance.InstancePresent = SAHPI_TRUE; m_logical_info.PendingFwInstance.Identifier = m_src_info.Identifier; m_logical_info.PendingFwInstance.Description = m_src_info.Description; m_logical_info.PendingFwInstance.DateTime = m_src_info.DateTime; m_logical_info.PendingFwInstance.MajorVersion = m_src_info.MajorVersion; m_logical_info.PendingFwInstance.MinorVersion = m_src_info.MinorVersion; m_logical_info.PendingFwInstance.AuxVersion = m_src_info.AuxVersion; for ( size_t i = 0; i < MAX_COMPONENTS; ++i ) { m_logical_components[i].PendingFwInstance = m_src_components[i].MainFwInstance; } } else { m_info.Identifier = m_src_info.Identifier; m_info.Description = m_src_info.Description; m_info.DateTime = m_src_info.DateTime; m_info.MajorVersion = m_src_info.MajorVersion; m_info.MinorVersion = m_src_info.MinorVersion; m_info.AuxVersion = m_src_info.AuxVersion; for ( size_t i = 0; i < MAX_COMPONENTS; ++i ) { m_components[i].MainFwInstance = m_src_components[i].MainFwInstance; } } ChangeStatus( SAHPI_FUMI_INSTALL_DONE ); } void cBank::DoBackup() { if ( m_next.pass.backup == SAHPI_FALSE ) { ChangeStatus( SAHPI_FUMI_BACKUP_FAILED ); } m_logical_info.RollbackFwInstance.InstancePresent = SAHPI_TRUE; m_logical_info.RollbackFwInstance.Identifier = m_info.Identifier; m_logical_info.RollbackFwInstance.Description = m_info.Description; m_logical_info.RollbackFwInstance.DateTime = m_info.DateTime; m_logical_info.RollbackFwInstance.MajorVersion = m_info.MajorVersion; m_logical_info.RollbackFwInstance.MinorVersion = m_info.MinorVersion; m_logical_info.RollbackFwInstance.AuxVersion = m_info.AuxVersion; for ( size_t i = 0; i < MAX_COMPONENTS; ++i ) { m_logical_components[i].RollbackFwInstance = m_components[i].MainFwInstance; } ChangeStatus( SAHPI_FUMI_BACKUP_DONE ); } void cBank::DoCopy() { if ( m_next.pass.copy == SAHPI_FALSE ) { ChangeStatus( SAHPI_FUMI_BANK_COPY_FAILED ); return; } cBank * dest = m_fumi.GetBank( m_copy_dest_num ); if ( !dest ) { ChangeStatus( SAHPI_FUMI_BANK_COPY_FAILED ); return; } dest->m_info.Identifier = m_info.Identifier; dest->m_info.Description = m_info.Description; dest->m_info.DateTime = m_info.DateTime; dest->m_info.MajorVersion = m_info.MajorVersion; dest->m_info.MinorVersion = m_info.MinorVersion; dest->m_info.AuxVersion = m_info.AuxVersion; for ( size_t i = 0; i < MAX_COMPONENTS; ++i ) { dest->m_enabled_components[i] = m_enabled_components[i]; dest->m_components[i] = m_components[i]; } ChangeStatus( SAHPI_FUMI_BANK_COPY_DONE ); } void cBank::DoVerification() { bool fail; if ( m_verify_main ) { fail = ( m_next.pass.verifymain == SAHPI_FALSE ); } else { fail = ( m_next.pass.verify == SAHPI_FALSE ); } if ( fail ) { ChangeStatus( SAHPI_FUMI_TARGET_VERIFY_FAILED ); return; } ChangeStatus( SAHPI_FUMI_TARGET_VERIFY_DONE ); } void cBank::DoActivation() { if ( m_next.pass.activate == SAHPI_FALSE ) { SaHpiFumiUpgradeStatusT new_status = SAHPI_FUMI_ACTIVATE_FAILED_ROLLBACK_NOT_POSSIBLE; if ( m_info.BankId == 0 ) { bool has_rb_fw = ( m_logical_info.RollbackFwInstance.InstancePresent != SAHPI_FALSE ); bool has_autorb_cap = ( ( m_fumi.Capabilities() & SAHPI_FUMI_CAP_AUTOROLLBACK ) != 0 ); bool autorb_disabled = m_fumi.IsAutoRollbackDisabled(); if ( has_rb_fw ) { if ( has_autorb_cap && ( !autorb_disabled ) ) { new_status = SAHPI_FUMI_ACTIVATE_FAILED_ROLLBACK_INITIATED; } else { new_status = SAHPI_FUMI_ACTIVATE_FAILED_ROLLBACK_NEEDED; } } } ChangeStatus( new_status ); if ( new_status == SAHPI_FUMI_ACTIVATE_FAILED_ROLLBACK_INITIATED ) { m_handler.SetTimer( this, m_next.action_duration ); } return; } if ( m_info.BankId == 0 ) { m_info.Identifier = m_logical_info.PendingFwInstance.Identifier; m_info.Description = m_logical_info.PendingFwInstance.Description; m_info.DateTime = m_logical_info.PendingFwInstance.DateTime; m_info.MajorVersion = m_logical_info.PendingFwInstance.MajorVersion; m_info.MinorVersion = m_logical_info.PendingFwInstance.MinorVersion; m_info.AuxVersion = m_logical_info.PendingFwInstance.AuxVersion; m_logical_info.PendingFwInstance.InstancePresent = SAHPI_FALSE; for ( size_t i = 0; i < MAX_COMPONENTS; ++i ) { m_components[i].MainFwInstance = m_logical_components[i].PendingFwInstance; m_logical_components[i].PendingFwInstance.InstancePresent = SAHPI_FALSE; } } ChangeStatus( SAHPI_FUMI_ACTIVATE_DONE ); } void cBank::DoRollback() { if ( m_next.pass.rollback == SAHPI_FALSE ) { ChangeStatus( SAHPI_FUMI_ROLLBACK_FAILED ); return; } m_info.Identifier = m_logical_info.RollbackFwInstance.Identifier; m_info.Description = m_logical_info.RollbackFwInstance.Description; m_info.DateTime = m_logical_info.RollbackFwInstance.DateTime; m_info.MajorVersion = m_logical_info.RollbackFwInstance.MajorVersion; m_info.MinorVersion = m_logical_info.RollbackFwInstance.MinorVersion; m_info.AuxVersion = m_logical_info.RollbackFwInstance.AuxVersion; m_logical_info.RollbackFwInstance.InstancePresent = SAHPI_FALSE; for ( size_t i = 0; i < MAX_COMPONENTS; ++i ) { m_components[i].MainFwInstance = m_logical_components[i].RollbackFwInstance; m_logical_components[i].RollbackFwInstance.InstancePresent = SAHPI_FALSE; } ChangeStatus( SAHPI_FUMI_ROLLBACK_DONE ); } }; // namespace TA openhpi-3.6.1/plugins/test_agent/field.h0000644000175100017510000000366612575647277017266 0ustar mohanmohan/* -*- c++ -*- * * (C) Copyright Pigeon Point Systems. 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTFIELDLITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #ifndef FIELD_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 #define FIELD_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 #include #include #include "object.h" namespace TA { /************************************************************** * class cField *************************************************************/ class cField : public cObject { public: static const std::string classname; explicit cField( volatile SaHpiUint32T& update_count, SaHpiEntryIdT id ); virtual ~cField(); public: SaHpiEntryIdT GetId() const { return m_id; } SaHpiIdrFieldTypeT GetType() const { return m_type; } bool IsReadOnly() const { return m_readonly != SAHPI_FALSE; } void Get( SaHpiEntryIdT& id, SaHpiIdrFieldTypeT& type, SaHpiBoolT& readonly, SaHpiTextBufferT& data ) const; void Set( SaHpiIdrFieldTypeT type, const SaHpiTextBufferT& data ); protected: // cObject virtual functions virtual void GetVars( cVars& vars ); virtual void AfterVarSet( const std::string& var_name ); private: cField( const cField& ); cField& operator =( const cField& ); private: // data SaHpiEntryIdT m_id; SaHpiIdrFieldTypeT m_type; SaHpiBoolT m_readonly; SaHpiTextBufferT m_data; volatile SaHpiUint32T& m_update_count; }; }; // namespace TA #endif // FIELD_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 openhpi-3.6.1/plugins/test_agent/bank.h0000644000175100017510000001053112575647277017103 0ustar mohanmohan/* -*- c++ -*- * * (C) Copyright Pigeon Point Systems. 2012 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTBANKLITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #ifndef BANK_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 #define BANK_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 #include #include #include #include #include "object.h" #include "timers.h" namespace TA { /************************************************************** * class cBank *************************************************************/ class cHandler; class cFumi; class cBank : public cObject, private cTimerCallback { public: static const std::string classname; explicit cBank( cHandler& handler, cFumi& fumi, SaHpiBankNumT num ); virtual ~cBank(); public: SaHpiUint32T Position() const; void SetPosition( SaHpiUint32T pos ); SaHpiFumiBankStateT State() const; public: // HPI interface SaErrorT SetSource( const SaHpiTextBufferT& uri ); SaErrorT StartSourceValidation(); SaErrorT GetSourceInfo( SaHpiFumiSourceInfoT& info ) const; SaErrorT GetSourceComponentInfo( SaHpiEntryIdT eid, SaHpiEntryIdT& next_eid, SaHpiFumiComponentInfoT& info ) const; SaErrorT GetTargetInfo( SaHpiFumiBankInfoT& info ) const; SaErrorT GetTargetComponentInfo( SaHpiEntryIdT eid, SaHpiEntryIdT& next_eid, SaHpiFumiComponentInfoT& info ) const; SaErrorT GetLogicalTargetInfo( SaHpiFumiLogicalBankInfoT& info ) const; SaErrorT GetLogicalTargetComponentInfo( SaHpiEntryIdT eid, SaHpiEntryIdT& next_eid, SaHpiFumiLogicalComponentInfoT& info ) const; SaErrorT StartBackup(); SaErrorT StartCopy( SaHpiBankNumT dest_num ); SaErrorT StartInstallation(); SaErrorT GetUpgradeStatus( SaHpiFumiUpgradeStatusT& status ) const; SaErrorT StartTargetVerification(); SaErrorT StartTargetMainVerification(); SaErrorT CancelUpgrade(); SaErrorT StartRollback(); SaErrorT StartActivation( SaHpiBoolT pass ); SaErrorT Cleanup(); protected: // cObject virtual functions virtual void GetVars( cVars& vars ); virtual void AfterVarSet( const std::string& var_name ); private: cBank( const cBank& ); cBank& operator =( const cBank& ); private: // cTimerCallback virtual functions virtual void TimerEvent(); private: void ChangeStatus( SaHpiFumiUpgradeStatusT status ); void DoValidation(); void DoInstall(); void DoBackup(); void DoCopy(); void DoVerification(); void DoActivation(); void DoRollback(); private: // data static const size_t MAX_COMPONENTS = 8; cHandler& m_handler; cFumi& m_fumi; SaHpiFumiBankInfoT m_info; SaHpiFumiLogicalBankInfoT m_logical_info; SaHpiBoolT m_enabled_components[MAX_COMPONENTS]; SaHpiFumiComponentInfoT m_components[MAX_COMPONENTS]; SaHpiFumiLogicalComponentInfoT m_logical_components[MAX_COMPONENTS]; SaHpiBoolT m_src_set; SaHpiFumiSourceInfoT m_src_info; SaHpiBoolT m_enabled_src_components[MAX_COMPONENTS]; SaHpiFumiComponentInfoT m_src_components[MAX_COMPONENTS]; SaHpiFumiUpgradeStatusT m_status; struct { SaHpiTimeoutT action_duration; struct { SaHpiBoolT validate; SaHpiBoolT install; SaHpiBoolT rollback; SaHpiBoolT backup; SaHpiBoolT copy; SaHpiBoolT verify; SaHpiBoolT verifymain; SaHpiBoolT activate; } pass; SaHpiFumiSourceStatusT src_fail_status; SaHpiFumiSourceInfoT src_info; } m_next; bool m_verify_main; SaHpiBankNumT m_copy_dest_num; }; }; // namespace TA #endif // BANK_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 openhpi-3.6.1/plugins/test_agent/announcement.cpp0000644000175100017510000000476112575647277021225 0ustar mohanmohan/* -*- c++ -*- * * (C) Copyright Pigeon Point Systems. 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTWATCHDOGLITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #include #include "announcement.h" #include "codec.h" #include "structs.h" #include "utils.h" #include "vars.h" namespace TA { /************************************************************** * Helper functions *************************************************************/ static void MakeDefaultAnnouncement( SaHpiAnnouncementT& a, SaHpiEntryIdT id ) { a.EntryId = id; oh_gettimeofday( &a.Timestamp ); a.AddedByUser = SAHPI_FALSE; a.Severity = SAHPI_INFORMATIONAL; a.Acknowledged = SAHPI_FALSE; SaHpiConditionT& c = a.StatusCond; c.Type = SAHPI_STATUS_COND_TYPE_OEM; oh_init_ep( &c.Entity ); c.DomainId = SAHPI_UNSPECIFIED_DOMAIN_ID; c.ResourceId = SAHPI_UNSPECIFIED_RESOURCE_ID; c.SensorNum = 0; c.EventState = SAHPI_ES_UNSPECIFIED; c.Name.Length = 0; c.Mid = 12345; MakeHpiTextBuffer( c.Data, "" ); } static void MakeUserAnnouncement( SaHpiAnnouncementT& a, SaHpiEntryIdT id, const SaHpiAnnouncementT& user_data ) { a = user_data; a.EntryId = id; oh_gettimeofday( &a.Timestamp ); a.AddedByUser = SAHPI_TRUE; } /************************************************************** * class cAnnouncement *************************************************************/ const std::string cAnnouncement::classname( "announcement" ); cAnnouncement::cAnnouncement( SaHpiEntryIdT id ) : cObject( AssembleNumberedObjectName( classname, id ) ) { MakeDefaultAnnouncement( m_data, id ); } cAnnouncement::cAnnouncement( SaHpiEntryIdT id, const SaHpiAnnouncementT& user_data ) : cObject( AssembleNumberedObjectName( classname, id ) ) { MakeUserAnnouncement( m_data, id, user_data ); } cAnnouncement::~cAnnouncement() { // empty } // cObject virtual functions void cAnnouncement::GetVars( cVars& vars ) { cObject::GetVars( vars ); Structs::GetVars( m_data, vars ); } }; // namespace TA openhpi-3.6.1/plugins/test_agent/structs.h0000644000175100017510000000377412575647277017712 0ustar mohanmohan/* -*- c++ -*- * * (C) Copyright Pigeon Point Systems. 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTSTRUCTSLITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #ifndef STRUCTS_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 #define STRUCTS_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 #include #include #include "vars.h" namespace TA { namespace Structs { /************************************************************** * Helpers to get vars from common HPI structures *************************************************************/ void GetVars( SaHpiRptEntryT& rpte, cVars& vars ); void GetVars( SaHpiEventLogInfoT& info, cVars& vars ); void GetVars( SaHpiLoadIdT& load_id, cVars& vars ); void GetVars( SaHpiRdrT& rdr, cVars& vars ); void GetVars( SaHpiCtrlStateT& state, cVars& vars ); void GetVars( const std::string& name, SaHpiSensorReadingT& r, cVars& vars ); void GetVars( SaHpiSensorThresholdsT& ths, cVars& vars ); void GetVars( SaHpiWatchdogT& wd, cVars& vars ); void GetVars( SaHpiAnnouncementT& a, cVars& vars ); void GetVars( SaHpiDimiTestT& info, cVars& vars ); void GetVars( SaHpiFumiSpecInfoT& info, cVars& vars ); void GetVars( SaHpiFumiServiceImpactDataT& data, cVars& vars ); void GetVars( SaHpiFumiBankInfoT& info, cVars& vars ); void GetVars( const std::string& name, SaHpiFumiSourceInfoT& info, bool uri_and_status, cVars& vars ); void GetVars( const std::string& name, SaHpiFumiComponentInfoT& info, cVars& vars ); void GetVars( SaHpiFumiLogicalBankInfoT& info, cVars& vars ); void GetVars( const std::string& name, SaHpiFumiLogicalComponentInfoT& info, cVars& vars ); }; // namespace Structs }; // namespace TA #endif // STRUCTS_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 openhpi-3.6.1/plugins/test_agent/codec.cpp0000644000175100017510000026507012575647277017612 0ustar mohanmohan/* -*- c++ -*- * * (C) Copyright Pigeon Point Systems. 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTCODECLITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #include #include #include #include #include #include #include #include #include #include #include #include "codec.h" #include "utils.h" #include "vars.h" namespace TA { /************************************************************** * Helper Functions *************************************************************/ static bool ToHex( const char src, unsigned char& dst ) { switch ( toupper( src ) ) { case '0': dst = 0; break; case '1': dst = 0x1; break; case '2': dst = 0x2; break; case '3': dst = 0x3; break; case '4': dst = 0x4; break; case '5': dst = 0x5; break; case '6': dst = 0x6; break; case '7': dst = 0x7; break; case '8': dst = 0x8; break; case '9': dst = 0x9; break; case 'A': dst = 0xA; break; case 'B': dst = 0xB; break; case 'C': dst = 0xC; break; case 'D': dst = 0xD; break; case 'E': dst = 0xE; break; case 'F': dst = 0xF; break; default: return false; } return true; } /************************************************************** * Basic Types Codecs *************************************************************/ static void ToTxt_Uint( const uint64_t& src, std::string& txt ) { char buf[32]; snprintf( buf, sizeof(buf), "%" PRIu64, src ); txt.append( buf ); } static bool FromTxt_Uint( const std::string& txt, uint64_t& dst ) { char * endptr = 0; dst = strtoull( txt.c_str(), &endptr, 0 ); return *endptr == '\0'; } static void ToTxt_Int( const int64_t& src, std::string& txt ) { char buf[32]; snprintf( buf, sizeof(buf), "%" PRId64, src ); txt.append( buf ); } static bool FromTxt_Int( const std::string& txt, int64_t& dst ) { char * endptr = 0; dst = strtoll( txt.c_str(), &endptr, 0 ); return *endptr == '\0'; } static void ToTxt_Double( double& src, std::string& txt ) { char buf[32]; snprintf( buf, sizeof(buf), "%f", src ); txt.append( buf ); } static bool FromTxt_Double( const std::string& txt, double& dst ) { char * endptr = 0; dst = strtod( txt.c_str(), &endptr ); return *endptr == '\0'; } static void ToTxt_Ascii( const void * src, size_t len, std::string& txt ) { const char * x = ConstPtr( src ); txt.append( x, len ); } static bool FromTxt_Ascii( const std::string& txt, size_t capacity, void * dst, size_t& len ) { memset( dst, 0, capacity ); len = std::min( txt.length(), capacity ); memcpy( dst, txt.data(), len ); return true; } static void ToTxt_Binary( const void * src, size_t len, std::string& txt ) { char buf[8]; const unsigned char * x = ConstPtr( src ); for ( size_t i = 0; i < len; ++i ) { snprintf( buf, sizeof(buf), "%02X", x[i] ); txt.append( buf ); } } static bool FromTxt_Binary( const std::string& txt, size_t capacity, void * dst, size_t& len ) { memset( dst, 0, capacity ); size_t n = txt.length(); if ( n & 1 ) { // accept only odd number of characters return false; } len = std::min( n / 2, capacity ); for ( size_t i = 0; i < len; ++i ) { unsigned char x = 0; for ( size_t j = 0; j < 2; ++j ) { x <<= 4; unsigned char xx = 0; bool rc = ToHex( txt[ 2 * i + j], xx ); if ( !rc ) { return false; } x |= xx; } *( Ptr( dst ) + i ) = x; } return true; } /************************************************************** * Enum Codecs *************************************************************/ struct EElem { int val; const char * name; }; static void ToTxt_Enum( const EElem * elems, const void * src, std::string& txt ) { int x = ConstRef( src ); for ( size_t i = 0; elems[i].name != 0; ++i ) { if ( x == elems[i].val ) { txt.append( elems[i].name ); return; } } // No name was found. Use numeric value. ToTxt_Int( x, txt ); } static void ToTxt_EnumU8( const EElem * elems, const void * src, std::string& txt ) { int x = ConstRef( src ); ToTxt_Enum( elems, &x, txt ); } static bool FromTxt_Enum( const EElem * elems, const std::string& txt, void * dst ) { for ( size_t i = 0; elems[i].name != 0; ++i ) { if ( txt == elems[i].name ) { Ref( dst ) = elems[i].val; return true; } } // No name was found. Use numeric value. int64_t x = 0; bool rc = FromTxt_Int( txt, x ); if ( rc ) { Ref( dst ) = x; } return rc; } static bool FromTxt_EnumU8( const EElem * elems, const std::string& txt, void * dst ) { int x = 0; bool rc = FromTxt_Enum( elems, txt, &x ); if ( rc ) { Ref( dst ) = x; } return rc; } /************************************************************** * Enum Data *************************************************************/ static EElem SaHpiLanguageTElems[] = { { SAHPI_LANG_UNDEF , "UNDEF" }, { SAHPI_LANG_AFAR , "AFAR" }, { SAHPI_LANG_ABKHAZIAN , "ABKHAZIAN" }, { SAHPI_LANG_AFRIKAANS , "AFRIKAANS" }, { SAHPI_LANG_AMHARIC , "AMHARIC" }, { SAHPI_LANG_ARABIC , "ARABIC" }, { SAHPI_LANG_ASSAMESE , "ASSAMESE" }, { SAHPI_LANG_AYMARA , "AYMARA" }, { SAHPI_LANG_AZERBAIJANI , "AZERBAIJANI" }, { SAHPI_LANG_BASHKIR , "BASHKIR" }, { SAHPI_LANG_BYELORUSSIAN , "BYELORUSSIAN" }, { SAHPI_LANG_BULGARIAN , "BULGARIAN" }, { SAHPI_LANG_BIHARI , "BIHARI" }, { SAHPI_LANG_BISLAMA , "BISLAMA" }, { SAHPI_LANG_BENGALI , "BENGALI" }, { SAHPI_LANG_TIBETAN , "TIBETAN" }, { SAHPI_LANG_BRETON , "BRETON" }, { SAHPI_LANG_CATALAN , "CATALAN" }, { SAHPI_LANG_CORSICAN , "CORSICAN" }, { SAHPI_LANG_CZECH , "CZECH" }, { SAHPI_LANG_WELSH , "WELSH" }, { SAHPI_LANG_DANISH , "DANISH" }, { SAHPI_LANG_GERMAN , "GERMAN" }, { SAHPI_LANG_BHUTANI , "BHUTANI" }, { SAHPI_LANG_GREEK , "GREEK" }, { SAHPI_LANG_ENGLISH , "ENGLISH" }, { SAHPI_LANG_ESPERANTO , "ESPERANTO" }, { SAHPI_LANG_SPANISH , "SPANISH" }, { SAHPI_LANG_ESTONIAN , "ESTONIAN" }, { SAHPI_LANG_BASQUE , "BASQUE" }, { SAHPI_LANG_PERSIAN , "PERSIAN" }, { SAHPI_LANG_FINNISH , "FINNISH" }, { SAHPI_LANG_FIJI , "FIJI" }, { SAHPI_LANG_FAEROESE , "FAEROESE" }, { SAHPI_LANG_FRENCH , "FRENCH" }, { SAHPI_LANG_FRISIAN , "FRISIAN" }, { SAHPI_LANG_IRISH , "IRISH" }, { SAHPI_LANG_SCOTSGAELIC , "SCOTSGAELIC" }, { SAHPI_LANG_GALICIAN , "GALICIAN" }, { SAHPI_LANG_GUARANI , "GUARANI" }, { SAHPI_LANG_GUJARATI , "GUJARATI" }, { SAHPI_LANG_HAUSA , "HAUSA" }, { SAHPI_LANG_HINDI , "HINDI" }, { SAHPI_LANG_CROATIAN , "CROATIAN" }, { SAHPI_LANG_HUNGARIAN , "HUNGARIAN" }, { SAHPI_LANG_ARMENIAN , "ARMENIAN" }, { SAHPI_LANG_INTERLINGUA , "INTERLINGUA" }, { SAHPI_LANG_INTERLINGUE , "INTERLINGUE" }, { SAHPI_LANG_INUPIAK , "INUPIAK" }, { SAHPI_LANG_INDONESIAN , "INDONESIAN" }, { SAHPI_LANG_ICELANDIC , "ICELANDIC" }, { SAHPI_LANG_ITALIAN , "ITALIAN" }, { SAHPI_LANG_HEBREW , "HEBREW" }, { SAHPI_LANG_JAPANESE , "JAPANESE" }, { SAHPI_LANG_YIDDISH , "YIDDISH" }, { SAHPI_LANG_JAVANESE , "JAVANESE" }, { SAHPI_LANG_GEORGIAN , "GEORGIAN" }, { SAHPI_LANG_KAZAKH , "KAZAKH" }, { SAHPI_LANG_GREENLANDIC , "GREENLANDIC" }, { SAHPI_LANG_CAMBODIAN , "CAMBODIAN" }, { SAHPI_LANG_KANNADA , "KANNADA" }, { SAHPI_LANG_KOREAN , "KOREAN" }, { SAHPI_LANG_KASHMIRI , "KASHMIRI" }, { SAHPI_LANG_KURDISH , "KURDISH" }, { SAHPI_LANG_KIRGHIZ , "KIRGHIZ" }, { SAHPI_LANG_LATIN , "LATIN" }, { SAHPI_LANG_LINGALA , "LINGALA" }, { SAHPI_LANG_LAOTHIAN , "LAOTHIAN" }, { SAHPI_LANG_LITHUANIAN , "LITHUANIAN" }, { SAHPI_LANG_LATVIANLETTISH , "LATVIANLETTISH" }, { SAHPI_LANG_MALAGASY , "MALAGASY" }, { SAHPI_LANG_MAORI , "MAORI" }, { SAHPI_LANG_MACEDONIAN , "MACEDONIAN" }, { SAHPI_LANG_MALAYALAM , "MALAYALAM" }, { SAHPI_LANG_MONGOLIAN , "MONGOLIAN" }, { SAHPI_LANG_MOLDAVIAN , "MOLDAVIAN" }, { SAHPI_LANG_MARATHI , "MARATHI" }, { SAHPI_LANG_MALAY , "MALAY" }, { SAHPI_LANG_MALTESE , "MALTESE" }, { SAHPI_LANG_BURMESE , "BURMESE" }, { SAHPI_LANG_NAURU , "NAURU" }, { SAHPI_LANG_NEPALI , "NEPALI" }, { SAHPI_LANG_DUTCH , "DUTCH" }, { SAHPI_LANG_NORWEGIAN , "NORWEGIAN" }, { SAHPI_LANG_OCCITAN , "OCCITAN" }, { SAHPI_LANG_AFANOROMO , "AFANOROMO" }, { SAHPI_LANG_ORIYA , "ORIYA" }, { SAHPI_LANG_PUNJABI , "PUNJABI" }, { SAHPI_LANG_POLISH , "POLISH" }, { SAHPI_LANG_PASHTOPUSHTO , "PASHTOPUSHTO" }, { SAHPI_LANG_PORTUGUESE , "PORTUGUESE" }, { SAHPI_LANG_QUECHUA , "QUECHUA" }, { SAHPI_LANG_RHAETOROMANCE , "RHAETOROMANCE" }, { SAHPI_LANG_KIRUNDI , "KIRUNDI" }, { SAHPI_LANG_ROMANIAN , "ROMANIAN" }, { SAHPI_LANG_RUSSIAN , "RUSSIAN" }, { SAHPI_LANG_KINYARWANDA , "KINYARWANDA" }, { SAHPI_LANG_SANSKRIT , "SANSKRIT" }, { SAHPI_LANG_SINDHI , "SINDHI" }, { SAHPI_LANG_SANGRO , "SANGRO" }, { SAHPI_LANG_SERBOCROATIAN , "SERBOCROATIAN" }, { SAHPI_LANG_SINGHALESE , "SINGHALESE" }, { SAHPI_LANG_SLOVAK , "SLOVAK" }, { SAHPI_LANG_SLOVENIAN , "SLOVENIAN" }, { SAHPI_LANG_SAMOAN , "SAMOAN" }, { SAHPI_LANG_SHONA , "SHONA" }, { SAHPI_LANG_SOMALI , "SOMALI" }, { SAHPI_LANG_ALBANIAN , "ALBANIAN" }, { SAHPI_LANG_SERBIAN , "SERBIAN" }, { SAHPI_LANG_SISWATI , "SISWATI" }, { SAHPI_LANG_SESOTHO , "SESOTHO" }, { SAHPI_LANG_SUDANESE , "SUDANESE" }, { SAHPI_LANG_SWEDISH , "SWEDISH" }, { SAHPI_LANG_SWAHILI , "SWAHILI" }, { SAHPI_LANG_TAMIL , "TAMIL" }, { SAHPI_LANG_TELUGU , "TELUGU" }, { SAHPI_LANG_TAJIK , "TAJIK" }, { SAHPI_LANG_THAI , "THAI" }, { SAHPI_LANG_TIGRINYA , "TIGRINYA" }, { SAHPI_LANG_TURKMEN , "TURKMEN" }, { SAHPI_LANG_TAGALOG , "TAGALOG" }, { SAHPI_LANG_SETSWANA , "SETSWANA" }, { SAHPI_LANG_TONGA , "TONGA" }, { SAHPI_LANG_TURKISH , "TURKISH" }, { SAHPI_LANG_TSONGA , "TSONGA" }, { SAHPI_LANG_TATAR , "TATAR" }, { SAHPI_LANG_TWI , "TWI" }, { SAHPI_LANG_UKRAINIAN , "UKRAINIAN" }, { SAHPI_LANG_URDU , "URDU" }, { SAHPI_LANG_UZBEK , "UZBEK" }, { SAHPI_LANG_VIETNAMESE , "VIETNAMESE" }, { SAHPI_LANG_VOLAPUK , "VOLAPUK" }, { SAHPI_LANG_WOLOF , "WOLOF" }, { SAHPI_LANG_XHOSA , "XHOSA" }, { SAHPI_LANG_YORUBA , "YORUBA" }, { SAHPI_LANG_CHINESE , "CHINESE" }, { SAHPI_LANG_ZULU , "ZULU" }, { 0 , 0 }, }; static EElem SaHpiTextTypeTElems[] = { { SAHPI_TL_TYPE_UNICODE , "UNICODE" }, { SAHPI_TL_TYPE_BCDPLUS , "BCDPLUS" }, { SAHPI_TL_TYPE_ASCII6 , "ASCII6" }, { SAHPI_TL_TYPE_TEXT , "TEXT" }, { SAHPI_TL_TYPE_BINARY , "BINARY" }, { 0 , 0 }, }; static EElem SaHpiEventCategoryTElems[] = { { SAHPI_EC_UNSPECIFIED , "UNSPECIFIED" }, { SAHPI_EC_THRESHOLD , "THRESHOLD" }, { SAHPI_EC_USAGE , "USAGE" }, { SAHPI_EC_STATE , "STATE" }, { SAHPI_EC_PRED_FAIL , "PRED_FAIL" }, { SAHPI_EC_LIMIT , "LIMIT" }, { SAHPI_EC_PERFORMANCE , "PERFORMANCE" }, { SAHPI_EC_SEVERITY , "SEVERITY" }, { SAHPI_EC_PRESENCE , "PRESENCE" }, { SAHPI_EC_ENABLE , "ENABLE" }, { SAHPI_EC_AVAILABILITY , "AVAILABILITY" }, { SAHPI_EC_REDUNDANCY , "REDUNDANCY" }, { SAHPI_EC_SENSOR_SPECIFIC , "SENSOR_SPECIFIC" }, { SAHPI_EC_GENERIC , "GENERIC" }, { 0 , 0 }, }; static EElem SaHpiSensorTypeTElems[] = { { SAHPI_TEMPERATURE , "TEMPERATURE" }, { SAHPI_VOLTAGE , "VOLTAGE" }, { SAHPI_CURRENT , "CURRENT" }, { SAHPI_FAN , "FAN" }, { SAHPI_PHYSICAL_SECURITY , "PHYSICAL_SECURITY" }, { SAHPI_PLATFORM_VIOLATION , "PLATFORM_VIOLATION" }, { SAHPI_PROCESSOR , "PROCESSOR" }, { SAHPI_POWER_SUPPLY , "POWER_SUPPLY" }, { SAHPI_POWER_UNIT , "POWER_UNIT" }, { SAHPI_COOLING_DEVICE , "COOLING_DEVICE" }, { SAHPI_OTHER_UNITS_BASED_SENSOR , "OTHER_UNITS_BASED_SENSOR" }, { SAHPI_MEMORY , "MEMORY" }, { SAHPI_DRIVE_SLOT , "DRIVE_SLOT" }, { SAHPI_POST_MEMORY_RESIZE , "POST_MEMORY_RESIZE" }, { SAHPI_SYSTEM_FW_PROGRESS , "SYSTEM_FW_PROGRESS" }, { SAHPI_EVENT_LOGGING_DISABLED , "EVENT_LOGGING_DISABLED" }, { SAHPI_RESERVED1 , "RESERVED1" }, { SAHPI_SYSTEM_EVENT , "SYSTEM_EVENT" }, { SAHPI_CRITICAL_INTERRUPT , "CRITICAL_INTERRUPT" }, { SAHPI_BUTTON , "BUTTON" }, { SAHPI_MODULE_BOARD , "MODULE_BOARD" }, { SAHPI_MICROCONTROLLER_COPROCESSOR , "MICROCONTROLLER_COPROCESSOR" }, { SAHPI_ADDIN_CARD , "ADDIN_CARD" }, { SAHPI_CHASSIS , "CHASSIS" }, { SAHPI_CHIP_SET , "CHIP_SET" }, { SAHPI_OTHER_FRU , "OTHER_FRU" }, { SAHPI_CABLE_INTERCONNECT , "CABLE_INTERCONNECT" }, { SAHPI_TERMINATOR , "TERMINATOR" }, { SAHPI_SYSTEM_BOOT_INITIATED , "SYSTEM_BOOT_INITIATED" }, { SAHPI_BOOT_ERROR , "BOOT_ERROR" }, { SAHPI_OS_BOOT , "OS_BOOT" }, { SAHPI_OS_CRITICAL_STOP , "OS_CRITICAL_STOP" }, { SAHPI_SLOT_CONNECTOR , "SLOT_CONNECTOR" }, { SAHPI_SYSTEM_ACPI_POWER_STATE , "SYSTEM_ACPI_POWER_STATE" }, { SAHPI_RESERVED2 , "RESERVED2" }, { SAHPI_PLATFORM_ALERT , "PLATFORM_ALERT" }, { SAHPI_ENTITY_PRESENCE , "ENTITY_PRESENCE" }, { SAHPI_MONITOR_ASIC_IC , "MONITOR_ASIC_IC" }, { SAHPI_LAN , "LAN" }, { SAHPI_MANAGEMENT_SUBSYSTEM_HEALTH , "MANAGEMENT_SUBSYSTEM_HEALTH" }, { SAHPI_BATTERY , "BATTERY" }, { SAHPI_SESSION_AUDIT , "SESSION_AUDIT" }, { SAHPI_VERSION_CHANGE , "VERSION_CHANGE" }, { SAHPI_OPERATIONAL , "OPERATIONAL" }, { SAHPI_OEM_SENSOR , "OEM_SENSOR" }, { SAHPI_COMM_CHANNEL_LINK_STATE , "COMM_CHANNEL_LINK_STATE" }, { SAHPI_MANAGEMENT_BUS_STATE , "MANAGEMENT_BUS_STATE" }, { SAHPI_COMM_CHANNEL_BUS_STATE , "COMM_CHANNEL_BUS_STATE" }, { SAHPI_CONFIG_DATA , "CONFIG_DATA" }, { SAHPI_POWER_BUDGET , "POWER_BUDGET" }, { 0 , 0 }, }; static EElem SaHpiSensorReadingTypeTElems[] = { { SAHPI_SENSOR_READING_TYPE_INT64 , "INT64" }, { SAHPI_SENSOR_READING_TYPE_UINT64 , "UINT64" }, { SAHPI_SENSOR_READING_TYPE_FLOAT64 , "FLOAT64" }, { SAHPI_SENSOR_READING_TYPE_BUFFER , "BUFFER" }, { 0 , 0 }, }; static EElem SaHpiSensorUnitsTElems[] = { { SAHPI_SU_UNSPECIFIED , "UNSPECIFIED" }, { SAHPI_SU_DEGREES_C , "DEGREES_C" }, { SAHPI_SU_DEGREES_F , "DEGREES_F" }, { SAHPI_SU_DEGREES_K , "DEGREES_K" }, { SAHPI_SU_VOLTS , "VOLTS" }, { SAHPI_SU_AMPS , "AMPS" }, { SAHPI_SU_WATTS , "WATTS" }, { SAHPI_SU_JOULES , "JOULES" }, { SAHPI_SU_COULOMBS , "COULOMBS" }, { SAHPI_SU_VA , "VA" }, { SAHPI_SU_NITS , "NITS" }, { SAHPI_SU_LUMEN , "LUMEN" }, { SAHPI_SU_LUX , "LUX" }, { SAHPI_SU_CANDELA , "CANDELA" }, { SAHPI_SU_KPA , "KPA" }, { SAHPI_SU_PSI , "PSI" }, { SAHPI_SU_NEWTON , "NEWTON" }, { SAHPI_SU_CFM , "CFM" }, { SAHPI_SU_RPM , "RPM" }, { SAHPI_SU_HZ , "HZ" }, { SAHPI_SU_MICROSECOND , "MICROSECOND" }, { SAHPI_SU_MILLISECOND , "MILLISECOND" }, { SAHPI_SU_SECOND , "SECOND" }, { SAHPI_SU_MINUTE , "MINUTE" }, { SAHPI_SU_HOUR , "HOUR" }, { SAHPI_SU_DAY , "DAY" }, { SAHPI_SU_WEEK , "WEEK" }, { SAHPI_SU_MIL , "MIL" }, { SAHPI_SU_INCHES , "INCHES" }, { SAHPI_SU_FEET , "FEET" }, { SAHPI_SU_CU_IN , "CU_IN" }, { SAHPI_SU_CU_FEET , "CU_FEET" }, { SAHPI_SU_MM , "MM" }, { SAHPI_SU_CM , "CM" }, { SAHPI_SU_M , "M" }, { SAHPI_SU_CU_CM , "CU_CM" }, { SAHPI_SU_CU_M , "CU_M" }, { SAHPI_SU_LITERS , "LITERS" }, { SAHPI_SU_FLUID_OUNCE , "FLUID_OUNCE" }, { SAHPI_SU_RADIANS , "RADIANS" }, { SAHPI_SU_STERADIANS , "STERADIANS" }, { SAHPI_SU_REVOLUTIONS , "REVOLUTIONS" }, { SAHPI_SU_CYCLES , "CYCLES" }, { SAHPI_SU_GRAVITIES , "GRAVITIES" }, { SAHPI_SU_OUNCE , "OUNCE" }, { SAHPI_SU_POUND , "POUND" }, { SAHPI_SU_FT_LB , "FT_LB" }, { SAHPI_SU_OZ_IN , "OZ_IN" }, { SAHPI_SU_GAUSS , "GAUSS" }, { SAHPI_SU_GILBERTS , "GILBERTS" }, { SAHPI_SU_HENRY , "HENRY" }, { SAHPI_SU_MILLIHENRY , "MILLIHENRY" }, { SAHPI_SU_FARAD , "FARAD" }, { SAHPI_SU_MICROFARAD , "MICROFARAD" }, { SAHPI_SU_OHMS , "OHMS" }, { SAHPI_SU_SIEMENS , "SIEMENS" }, { SAHPI_SU_MOLE , "MOLE" }, { SAHPI_SU_BECQUEREL , "BECQUEREL" }, { SAHPI_SU_PPM , "PPM" }, { SAHPI_SU_RESERVED , "RESERVED" }, { SAHPI_SU_DECIBELS , "DECIBELS" }, { SAHPI_SU_DBA , "DBA" }, { SAHPI_SU_DBC , "DBC" }, { SAHPI_SU_GRAY , "GRAY" }, { SAHPI_SU_SIEVERT , "SIEVERT" }, { SAHPI_SU_COLOR_TEMP_DEG_K , "COLOR_TEMP_DEG_K" }, { SAHPI_SU_BIT , "BIT" }, { SAHPI_SU_KILOBIT , "KILOBIT" }, { SAHPI_SU_MEGABIT , "MEGABIT" }, { SAHPI_SU_GIGABIT , "GIGABIT" }, { SAHPI_SU_BYTE , "BYTE" }, { SAHPI_SU_KILOBYTE , "KILOBYTE" }, { SAHPI_SU_MEGABYTE , "MEGABYTE" }, { SAHPI_SU_GIGABYTE , "GIGABYTE" }, { SAHPI_SU_WORD , "WORD" }, { SAHPI_SU_DWORD , "DWORD" }, { SAHPI_SU_QWORD , "QWORD" }, { SAHPI_SU_LINE , "LINE" }, { SAHPI_SU_HIT , "HIT" }, { SAHPI_SU_MISS , "MISS" }, { SAHPI_SU_RETRY , "RETRY" }, { SAHPI_SU_RESET , "RESET" }, { SAHPI_SU_OVERRUN , "OVERRUN" }, { SAHPI_SU_UNDERRUN , "UNDERRUN" }, { SAHPI_SU_COLLISION , "COLLISION" }, { SAHPI_SU_PACKETS , "PACKETS" }, { SAHPI_SU_MESSAGES , "MESSAGES" }, { SAHPI_SU_CHARACTERS , "CHARACTERS" }, { SAHPI_SU_ERRORS , "ERRORS" }, { SAHPI_SU_CORRECTABLE_ERRORS , "CORRECTABLE_ERRORS" }, { SAHPI_SU_UNCORRECTABLE_ERRORS , "UNCORRECTABLE_ERRORS" }, { 0 , 0 }, }; static EElem SaHpiSensorModUnitUseTElems[] = { { SAHPI_SMUU_NONE , "NONE" }, { SAHPI_SMUU_BASIC_OVER_MODIFIER , "BASIC_OVER_MODIFIER" }, { SAHPI_SMUU_BASIC_TIMES_MODIFIER , "BASIC_TIMES_MODIFIER" }, { 0 , 0 }, }; static EElem SaHpiSensorEventCtrlTElems[] = { { SAHPI_SEC_PER_EVENT , "PER_EVENT" }, { SAHPI_SEC_READ_ONLY_MASKS , "READ_ONLY_MASKS" }, { SAHPI_SEC_READ_ONLY , "READ_ONLY" }, { 0 , 0 }, }; static EElem SaHpiCtrlTypeTElems[] = { { SAHPI_CTRL_TYPE_DIGITAL , "DIGITAL" }, { SAHPI_CTRL_TYPE_DISCRETE , "DISCRETE" }, { SAHPI_CTRL_TYPE_ANALOG , "ANALOG" }, { SAHPI_CTRL_TYPE_STREAM , "STREAM" }, { SAHPI_CTRL_TYPE_TEXT , "TEXT" }, { SAHPI_CTRL_TYPE_OEM , "OEM" }, { 0 , 0 }, }; static EElem SaHpiCtrlStateDigitalTElems[] = { { SAHPI_CTRL_STATE_OFF , "OFF" }, { SAHPI_CTRL_STATE_ON , "ON" }, { SAHPI_CTRL_STATE_PULSE_OFF , "PULSE_OFF" }, { SAHPI_CTRL_STATE_PULSE_ON , "PULSE_ON" }, { 0 , 0 }, }; static EElem SaHpiCtrlModeTElems[] = { { SAHPI_CTRL_MODE_AUTO , "AUTO" }, { SAHPI_CTRL_MODE_MANUAL , "MANUAL" }, { 0 , 0 }, }; static EElem SaHpiCtrlOutputTypeTElems[] = { { SAHPI_CTRL_GENERIC , "GENERIC" }, { SAHPI_CTRL_LED , "LED" }, { SAHPI_CTRL_FAN_SPEED , "FAN_SPEED" }, { SAHPI_CTRL_DRY_CONTACT_CLOSURE , "DRY_CONTACT_CLOSURE" }, { SAHPI_CTRL_POWER_SUPPLY_INHIBIT , "POWER_SUPPLY_INHIBIT" }, { SAHPI_CTRL_AUDIBLE , "AUDIBLE" }, { SAHPI_CTRL_FRONT_PANEL_LOCKOUT , "FRONT_PANEL_LOCKOUT" }, { SAHPI_CTRL_POWER_INTERLOCK , "POWER_INTERLOCK" }, { SAHPI_CTRL_POWER_STATE , "POWER_STATE" }, { SAHPI_CTRL_LCD_DISPLAY , "LCD_DISPLAY" }, { SAHPI_CTRL_OEM , "OEM" }, { SAHPI_CTRL_GENERIC_ADDRESS , "GENERIC_ADDRESS" }, { SAHPI_CTRL_IP_ADDRESS , "IP_ADDRESS" }, { SAHPI_CTRL_RESOURCE_ID , "RESOURCE_ID" }, { SAHPI_CTRL_POWER_BUDGET , "POWER_BUDGET" }, { SAHPI_CTRL_ACTIVATE , "ACTIVATE" }, { SAHPI_CTRL_RESET , "RESET" }, { 0 , 0 }, }; static EElem SaHpiIdrAreaTypeTElems[] = { { SAHPI_IDR_AREATYPE_INTERNAL_USE , "INTERNAL_USE" }, { SAHPI_IDR_AREATYPE_CHASSIS_INFO , "CHASSIS_INFO" }, { SAHPI_IDR_AREATYPE_BOARD_INFO , "BOARD_INFO" }, { SAHPI_IDR_AREATYPE_PRODUCT_INFO , "PRODUCT_INFO" }, { SAHPI_IDR_AREATYPE_OEM , "OEM" }, { SAHPI_IDR_AREATYPE_UNSPECIFIED , "UNSPECIFIED" }, { 0 , 0 }, }; static EElem SaHpiIdrFieldTypeTElems[] = { { SAHPI_IDR_FIELDTYPE_CHASSIS_TYPE , "CHASSIS_TYPE" }, { SAHPI_IDR_FIELDTYPE_MFG_DATETIME , "MFG_DATETIME" }, { SAHPI_IDR_FIELDTYPE_MANUFACTURER , "MANUFACTURER" }, { SAHPI_IDR_FIELDTYPE_PRODUCT_NAME , "PRODUCT_NAME" }, { SAHPI_IDR_FIELDTYPE_PRODUCT_VERSION , "PRODUCT_VERSION" }, { SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER , "SERIAL_NUMBER" }, { SAHPI_IDR_FIELDTYPE_PART_NUMBER , "PART_NUMBER" }, { SAHPI_IDR_FIELDTYPE_FILE_ID , "FILE_ID" }, { SAHPI_IDR_FIELDTYPE_ASSET_TAG , "ASSET_TAG" }, { SAHPI_IDR_FIELDTYPE_CUSTOM , "CUSTOM" }, { SAHPI_IDR_FIELDTYPE_UNSPECIFIED , "UNSPECIFIED" }, { 0 , 0 }, }; static EElem SaHpiWatchdogActionTElems[] = { { SAHPI_WA_NO_ACTION , "NO_ACTION" }, { SAHPI_WA_RESET , "RESET" }, { SAHPI_WA_POWER_DOWN , "POWER_DOWN" }, { SAHPI_WA_POWER_CYCLE , "POWER_CYCLE" }, { 0 , 0 }, }; static EElem SaHpiWatchdogActionEventTElems[] = { { SAHPI_WAE_NO_ACTION , "NO_ACTION" }, { SAHPI_WAE_RESET , "RESET" }, { SAHPI_WAE_POWER_DOWN , "POWER_DOWN" }, { SAHPI_WAE_POWER_CYCLE , "POWER_CYCLE" }, { SAHPI_WAE_TIMER_INT , "TIMER_INT" }, { 0 , 0 }, }; static EElem SaHpiWatchdogPretimerInterruptTElems[] = { { SAHPI_WPI_NONE , "NONE" }, { SAHPI_WPI_SMI , "SMI" }, { SAHPI_WPI_NMI , "NMI" }, { SAHPI_WPI_MESSAGE_INTERRUPT , "MESSAGE_INTERRUPT" }, { SAHPI_WPI_OEM , "OEM" }, { 0 , 0 }, }; static EElem SaHpiWatchdogTimerUseTElems[] = { { SAHPI_WTU_NONE , "NONE" }, { SAHPI_WTU_BIOS_FRB2 , "BIOS_FRB2" }, { SAHPI_WTU_BIOS_POST , "BIOS_POST" }, { SAHPI_WTU_OS_LOAD , "OS_LOAD" }, { SAHPI_WTU_SMS_OS , "SMS_OS" }, { SAHPI_WTU_OEM , "OEM" }, { SAHPI_WTU_UNSPECIFIED , "UNSPECIFIED" }, { 0 , 0 }, }; static EElem SaHpiDimiTestServiceImpactTElems[] = { { SAHPI_DIMITEST_NONDEGRADING , "NONDEGRADING" }, { SAHPI_DIMITEST_DEGRADING , "DEGRADING" }, { SAHPI_DIMITEST_VENDOR_DEFINED_LEVEL , "VENDOR_DEFINED_LEVEL" }, { 0 , 0 }, }; static EElem SaHpiDimiTestRunStatusTElems[] = { { SAHPI_DIMITEST_STATUS_NOT_RUN , "NOT_RUN" }, { SAHPI_DIMITEST_STATUS_FINISHED_NO_ERRORS , "FINISHED_NO_ERRORS" }, { SAHPI_DIMITEST_STATUS_FINISHED_ERRORS , "FINISHED_ERRORS" }, { SAHPI_DIMITEST_STATUS_CANCELED , "CANCELED" }, { SAHPI_DIMITEST_STATUS_RUNNING , "RUNNING" }, { 0 , 0 }, }; static EElem SaHpiDimiTestErrCodeTElems[] = { { SAHPI_DIMITEST_STATUSERR_NOERR , "NOERR" }, { SAHPI_DIMITEST_STATUSERR_RUNERR , "RUNERR" }, { SAHPI_DIMITEST_STATUSERR_UNDEF , "UNDEF" }, { 0 , 0 }, }; static EElem SaHpiDimiTestParamTypeTElems[] = { { SAHPI_DIMITEST_PARAM_TYPE_BOOLEAN , "BOOLEAN" }, { SAHPI_DIMITEST_PARAM_TYPE_INT32 , "INT32" }, { SAHPI_DIMITEST_PARAM_TYPE_FLOAT64 , "FLOAT64" }, { SAHPI_DIMITEST_PARAM_TYPE_TEXT , "TEXT" }, { 0 , 0 }, }; static EElem SaHpiDimiReadyTElems[] = { { SAHPI_DIMI_READY , "READY" }, { SAHPI_DIMI_WRONG_STATE , "WRONG_STATE" }, { SAHPI_DIMI_BUSY , "BUSY" }, { 0 , 0 }, }; static EElem SaHpiFumiSpecInfoTypeTElems[] = { { SAHPI_FUMI_SPEC_INFO_NONE , "NONE" }, { SAHPI_FUMI_SPEC_INFO_SAF_DEFINED , "SAF_DEFINED" }, { SAHPI_FUMI_SPEC_INFO_OEM_DEFINED , "OEM_DEFINED" }, { 0 , 0 }, }; static EElem SaHpiFumiSafDefinedSpecIdTElems[] = { { SAHPI_FUMI_SPEC_HPM1 , "HPM1" }, { 0 , 0 }, }; static EElem SaHpiFumiServiceImpactTElems[] = { { SAHPI_FUMI_PROCESS_NONDEGRADING , "NONDEGRADING" }, { SAHPI_FUMI_PROCESS_DEGRADING , "DEGRADING" }, { SAHPI_FUMI_PROCESS_VENDOR_DEFINED_IMPACT_LEVEL , "VENDOR_DEFINED_IMPACT_LEVEL" }, { 0 , 0 }, }; static EElem SaHpiFumiSourceStatusTElems[] = { { SAHPI_FUMI_SRC_VALID , "VALID" }, { SAHPI_FUMI_SRC_PROTOCOL_NOT_SUPPORTED , "PROTOCOL_NOT_SUPPORTED" }, { SAHPI_FUMI_SRC_UNREACHABLE , "UNREACHABLE" }, { SAHPI_FUMI_SRC_VALIDATION_NOT_STARTED , "VALIDATION_NOT_STARTED" }, { SAHPI_FUMI_SRC_VALIDATION_INITIATED , "VALIDATION_INITIATED" }, { SAHPI_FUMI_SRC_VALIDATION_FAIL , "VALIDATION_FAIL" }, { SAHPI_FUMI_SRC_TYPE_MISMATCH , "TYPE_MISMATCH" }, { SAHPI_FUMI_SRC_INVALID , "INVALID" }, { SAHPI_FUMI_SRC_VALIDITY_UNKNOWN , "VALIDITY_UNKNOWN" }, { 0 , 0 }, }; static EElem SaHpiFumiBankStateTElems[] = { { SAHPI_FUMI_BANK_VALID , "VALID" }, { SAHPI_FUMI_BANK_UPGRADE_IN_PROGRESS , "UPGRADE_IN_PROGRESS" }, { SAHPI_FUMI_BANK_CORRUPTED , "CORRUPTED" }, { SAHPI_FUMI_BANK_ACTIVE , "ACTIVE" }, { SAHPI_FUMI_BANK_BUSY , "BUSY" }, { SAHPI_FUMI_BANK_UNKNOWN , "UNKNOWN" }, { 0 , 0 }, }; static EElem SaHpiFumiUpgradeStatusTElems[] = { { SAHPI_FUMI_OPERATION_NOTSTARTED , "OPERATION_NOTSTARTED" }, { SAHPI_FUMI_SOURCE_VALIDATION_INITIATED , "SOURCE_VALIDATION_INITIATED" }, { SAHPI_FUMI_SOURCE_VALIDATION_FAILED , "SOURCE_VALIDATION_FAILED" }, { SAHPI_FUMI_SOURCE_VALIDATION_DONE , "SOURCE_VALIDATION_DONE" }, { SAHPI_FUMI_SOURCE_VALIDATION_CANCELLED , "SOURCE_VALIDATION_CANCELLED" }, { SAHPI_FUMI_INSTALL_INITIATED , "INSTALL_INITIATED" }, { SAHPI_FUMI_INSTALL_FAILED_ROLLBACK_NEEDED , "INSTALL_FAILED_ROLLBACK_NEEDED" }, { SAHPI_FUMI_INSTALL_FAILED_ROLLBACK_INITIATED , "INSTALL_FAILED_ROLLBACK_INITIATED" }, { SAHPI_FUMI_INSTALL_FAILED_ROLLBACK_NOT_POSSIBLE , "INSTALL_FAILED_ROLLBACK_NOT_POSSIBLE" }, { SAHPI_FUMI_INSTALL_DONE , "INSTALL_DONE" }, { SAHPI_FUMI_INSTALL_CANCELLED , "INSTALL_CANCELLED" }, { SAHPI_FUMI_ROLLBACK_INITIATED , "ROLLBACK_INITIATED" }, { SAHPI_FUMI_ROLLBACK_FAILED , "ROLLBACK_FAILED" }, { SAHPI_FUMI_ROLLBACK_DONE , "ROLLBACK_DONE" }, { SAHPI_FUMI_ROLLBACK_CANCELLED , "ROLLBACK_CANCELLED" }, { SAHPI_FUMI_BACKUP_INITIATED , "BACKUP_INITIATED" }, { SAHPI_FUMI_BACKUP_FAILED , "BACKUP_FAILED" }, { SAHPI_FUMI_BACKUP_DONE , "BACKUP_DONE" }, { SAHPI_FUMI_BACKUP_CANCELLED , "BACKUP_CANCELLED" }, { SAHPI_FUMI_BANK_COPY_INITIATED , "BANK_COPY_INITIATED" }, { SAHPI_FUMI_BANK_COPY_FAILED , "BANK_COPY_FAILED" }, { SAHPI_FUMI_BANK_COPY_DONE , "BANK_COPY_DONE" }, { SAHPI_FUMI_BANK_COPY_CANCELLED , "BANK_COPY_CANCELLED" }, { SAHPI_FUMI_TARGET_VERIFY_INITIATED , "TARGET_VERIFY_INITIATED" }, { SAHPI_FUMI_TARGET_VERIFY_FAILED , "TARGET_VERIFY_FAILED" }, { SAHPI_FUMI_TARGET_VERIFY_DONE , "TARGET_VERIFY_DONE" }, { SAHPI_FUMI_TARGET_VERIFY_CANCELLED , "TARGET_VERIFY_CANCELLED" }, { SAHPI_FUMI_ACTIVATE_INITIATED , "ACTIVATE_INITIATED" }, { SAHPI_FUMI_ACTIVATE_FAILED_ROLLBACK_NEEDED , "ACTIVATE_FAILED_ROLLBACK_NEEDED" }, { SAHPI_FUMI_ACTIVATE_FAILED_ROLLBACK_INITIATED , "ACTIVATE_FAILED_ROLLBACK_INITIATED" }, { SAHPI_FUMI_ACTIVATE_FAILED_ROLLBACK_NOT_POSSIBLE , "ACTIVATE_FAILED_ROLLBACK_NOT_POSSIBLE" }, { SAHPI_FUMI_ACTIVATE_DONE , "ACTIVATE_DONE" }, { SAHPI_FUMI_ACTIVATE_CANCELLED , "ACTIVATE_CANCELLED" }, { 0 , 0 }, }; static EElem SaHpiHsIndicatorStateTElems[] = { { SAHPI_HS_INDICATOR_OFF , "OFF" }, { SAHPI_HS_INDICATOR_ON , "ON" }, { 0 , 0 }, }; static EElem SaHpiHsStateTElems[] = { { SAHPI_HS_STATE_INACTIVE , "INACTIVE" }, { SAHPI_HS_STATE_INSERTION_PENDING , "INSERTION_PENDING" }, { SAHPI_HS_STATE_ACTIVE , "ACTIVE" }, { SAHPI_HS_STATE_EXTRACTION_PENDING , "EXTRACTION_PENDING" }, { SAHPI_HS_STATE_NOT_PRESENT , "NOT_PRESENT" }, { 0 , 0 }, }; static EElem SaHpiHsCauseOfStateChangeTElems[] = { { SAHPI_HS_CAUSE_AUTO_POLICY , "AUTO_POLICY" }, { SAHPI_HS_CAUSE_EXT_SOFTWARE , "EXT_SOFTWARE" }, { SAHPI_HS_CAUSE_OPERATOR_INIT , "OPERATOR_INIT" }, { SAHPI_HS_CAUSE_USER_UPDATE , "USER_UPDATE" }, { SAHPI_HS_CAUSE_UNEXPECTED_DEACTIVATION , "UNEXPECTED_DEACTIVATION" }, { SAHPI_HS_CAUSE_SURPRISE_EXTRACTION , "SURPRISE_EXTRACTION" }, { SAHPI_HS_CAUSE_EXTRACTION_UPDATE , "EXTRACTION_UPDATE" }, { SAHPI_HS_CAUSE_HARDWARE_FAULT , "HARDWARE_FAULT" }, { SAHPI_HS_CAUSE_CONTAINING_FRU , "CONTAINING_FRU" }, { SAHPI_HS_CAUSE_UNKNOWN , "UNKNOWN" }, { 0 , 0 }, }; static EElem SaHpiSeverityTElems[] = { { SAHPI_CRITICAL , "CRITICAL" }, { SAHPI_MAJOR , "MAJOR" }, { SAHPI_MINOR , "MINOR" }, { SAHPI_INFORMATIONAL , "INFORMATIONAL" }, { SAHPI_OK , "OK" }, { SAHPI_DEBUG , "DEBUG" }, { SAHPI_ALL_SEVERITIES , "ALL_SEVERITIES" }, { 0 , 0 }, }; static EElem SaHpiResourceEventTypeTElems[] = { { SAHPI_RESE_RESOURCE_FAILURE , "FAILURE" }, { SAHPI_RESE_RESOURCE_RESTORED , "RESTORED" }, { SAHPI_RESE_RESOURCE_ADDED , "ADDED" }, { SAHPI_RESE_RESOURCE_REMOVED , "REMOVED" }, { SAHPI_RESE_RESOURCE_INACCESSIBLE , "INACCESSIBLE" }, { SAHPI_RESE_RESOURCE_UPDATED , "UPDATED" }, { 0 , 0 }, }; static EElem SaHpiDomainEventTypeTElems[] = { { SAHPI_DOMAIN_REF_ADDED , "REF_ADDED" }, { SAHPI_DOMAIN_REF_REMOVED , "REF_REMOVED" }, { 0 , 0 }, }; static EElem SaHpiSwEventTypeTElems[] = { { SAHPI_HPIE_AUDIT , "AUDIT" }, { SAHPI_HPIE_STARTUP , "STARTUP" }, { SAHPI_HPIE_OTHER , "OTHER" }, { 0 , 0 }, }; static EElem SaHpiEventTypeTElems[] = { { SAHPI_ET_RESOURCE , "RESOURCE" }, { SAHPI_ET_DOMAIN , "DOMAIN" }, { SAHPI_ET_SENSOR , "SENSOR" }, { SAHPI_ET_SENSOR_ENABLE_CHANGE , "SENSOR_ENABLE_CHANGE" }, { SAHPI_ET_HOTSWAP , "HOTSWAP" }, { SAHPI_ET_WATCHDOG , "WATCHDOG" }, { SAHPI_ET_HPI_SW , "HPI_SW" }, { SAHPI_ET_OEM , "OEM" }, { SAHPI_ET_USER , "USER" }, { SAHPI_ET_DIMI , "DIMI" }, { SAHPI_ET_DIMI_UPDATE , "DIMI_UPDATE" }, { SAHPI_ET_FUMI , "FUMI" }, { 0 , 0 }, }; static EElem SaHpiStatusCondTypeTElems[] = { { SAHPI_STATUS_COND_TYPE_SENSOR , "SENSOR" }, { SAHPI_STATUS_COND_TYPE_RESOURCE , "RESOURCE" }, { SAHPI_STATUS_COND_TYPE_OEM , "OEM" }, { SAHPI_STATUS_COND_TYPE_USER , "USER" }, { 0 , 0 }, }; static EElem SaHpiAnnunciatorModeTElems[] = { { SAHPI_ANNUNCIATOR_MODE_AUTO , "AUTO" }, { SAHPI_ANNUNCIATOR_MODE_USER , "USER" }, { SAHPI_ANNUNCIATOR_MODE_SHARED , "SHARED" }, { 0 , 0 }, }; static EElem SaHpiAnnunciatorTypeTElems[] = { { SAHPI_ANNUNCIATOR_TYPE_LED , "LED" }, { SAHPI_ANNUNCIATOR_TYPE_DRY_CONTACT_CLOSURE , "DRY_CONTACT_CLOSURE" }, { SAHPI_ANNUNCIATOR_TYPE_AUDIBLE , "AUDIBLE" }, { SAHPI_ANNUNCIATOR_TYPE_LCD_DISPLAY , "LCD_DISPLAY" }, { SAHPI_ANNUNCIATOR_TYPE_MESSAGE , "MESSAGE" }, { SAHPI_ANNUNCIATOR_TYPE_COMPOSITE , "COMPOSITE" }, { SAHPI_ANNUNCIATOR_TYPE_OEM , "OEM" }, { 0 , 0 }, }; static EElem SaHpiRdrTypeTElems[] = { { SAHPI_NO_RECORD , "NO_RECORD" }, { SAHPI_CTRL_RDR , "CTRL_RDR" }, { SAHPI_SENSOR_RDR , "SENSOR_RDR" }, { SAHPI_INVENTORY_RDR , "INVENTORY_RDR" }, { SAHPI_WATCHDOG_RDR , "WATCHDOG_RDR" }, { SAHPI_ANNUNCIATOR_RDR , "ANNUNCIATOR_RDR" }, { SAHPI_DIMI_RDR , "DIMI_RDR" }, { SAHPI_FUMI_RDR , "FUMI_RDR" }, { 0 , 0 }, }; static EElem SaHpiParmActionTElems[] = { { SAHPI_DEFAULT_PARM , "DEFAULT_PARM" }, { SAHPI_SAVE_PARM , "SAVE_PARM" }, { SAHPI_RESTORE_PARM , "RESTORE_PARM" }, { 0 , 0 }, }; static EElem SaHpiResetActionTElems[] = { { SAHPI_COLD_RESET , "COLD_RESET" }, { SAHPI_WARM_RESET , "WARM_RESET" }, { SAHPI_RESET_ASSERT , "RESET_ASSERT" }, { SAHPI_RESET_DEASSERT , "RESET_DEASSERT" }, { 0 , 0 }, }; static EElem SaHpiPowerStateTElems[] = { { SAHPI_POWER_OFF , "OFF" }, { SAHPI_POWER_ON , "ON" }, { SAHPI_POWER_CYCLE , "CYCLE" }, { 0 , 0 }, }; static EElem SaHpiEventLogOverflowActionTElems[] = { { SAHPI_EL_OVERFLOW_DROP , "DROP" }, { SAHPI_EL_OVERFLOW_OVERWRITE , "OVERWRITE" }, { 0 , 0 }, }; /************************************************************** * Flags Codecs *************************************************************/ struct FElem { uint64_t val; const char * name; }; static void ToTxt_Flags( const FElem * elems, const uint64_t& src, std::string& txt ) { uint64_t done = 0; if ( src != 0 ) { bool first = true; for ( size_t i = 0; elems[i].name != 0; ++i ) { if ( ( src & elems[i].val ) == elems[i].val ) { if ( first ) { first = false; } else { txt.append( " | " ); } txt.append( elems[i].name ); done |= elems[i].val; } } if ( done != src ) { // done != src - some bits were not recognized if ( !first ) { txt.append( " | " ); } ToTxt_Uint( src & ( ~done ), txt ); } } else { txt.append( "0" ); } } static void ToTxt_Flags8( const FElem * elems, const void * src, std::string& txt ) { const uint8_t x = ConstRef( src ); ToTxt_Flags( elems, x, txt ); } static void ToTxt_Flags16( const FElem * elems, const void * src, std::string& txt ) { const uint16_t x = ConstRef( src ); ToTxt_Flags( elems, x, txt ); } static void ToTxt_Flags32( const FElem * elems, const void * src, std::string& txt ) { const uint32_t x = ConstRef( src ); ToTxt_Flags( elems, x, txt ); } static bool FromTxt_Flags( const FElem * elems, const std::string& txt, uint64_t& dst ) { dst = 0; static const char delimeters[] = " \t|"; std::vector buf( txt.begin(), txt.end() ); buf.push_back( '\0' ); char * token = strtok( &buf[0], delimeters ); if ( !token ) { return false; } while ( token ) { std::string stoken( token ); bool found = false; for ( size_t i = 0; elems[i].name != 0; ++i ) { if ( stoken == elems[i].name ) { dst |= elems[i].val; found = true; break; } } if ( !found ) { uint64_t x = 0; bool rc = FromTxt_Uint( stoken, x ); if ( !rc ) { return false; } dst |= x; } token = strtok( 0, delimeters ); } return true; } static bool FromTxt_Flags8( const FElem * elems, const std::string& txt, void * dst ) { uint64_t x = 0; bool rc = FromTxt_Flags( elems, txt, x ); if ( rc ) { Ref( dst ) = x; } return rc; } static bool FromTxt_Flags16( const FElem * elems, const std::string& txt, void * dst ) { uint64_t x = 0; bool rc = FromTxt_Flags( elems, txt, x ); if ( rc ) { Ref( dst ) = x; } return rc; } static bool FromTxt_Flags32( const FElem * elems, const std::string& txt, void * dst ) { uint64_t x = 0; bool rc = FromTxt_Flags( elems, txt, x ); if ( rc ) { Ref( dst ) = x; } return rc; } /************************************************************** * Flags Data *************************************************************/ static FElem SaHpiEventStateTElems[] = { { SAHPI_ES_STATE_00 , "STATE_00" }, { SAHPI_ES_STATE_01 , "STATE_01" }, { SAHPI_ES_STATE_02 , "STATE_02" }, { SAHPI_ES_STATE_03 , "STATE_03" }, { SAHPI_ES_STATE_04 , "STATE_04" }, { SAHPI_ES_STATE_05 , "STATE_05" }, { SAHPI_ES_STATE_06 , "STATE_06" }, { SAHPI_ES_STATE_07 , "STATE_07" }, { SAHPI_ES_STATE_08 , "STATE_08" }, { SAHPI_ES_STATE_09 , "STATE_09" }, { SAHPI_ES_STATE_10 , "STATE_10" }, { SAHPI_ES_STATE_11 , "STATE_11" }, { SAHPI_ES_STATE_12 , "STATE_12" }, { SAHPI_ES_STATE_13 , "STATE_13" }, { SAHPI_ES_STATE_14 , "STATE_14" }, { 0 , 0 }, }; static FElem SaHpiEventStateTThresholdElems[] = { { SAHPI_ES_LOWER_MINOR , "LOWER_MINOR" }, { SAHPI_ES_LOWER_MAJOR , "LOWER_MAJOR" }, { SAHPI_ES_LOWER_CRIT , "LOWER_CRIT" }, { SAHPI_ES_UPPER_MINOR , "UPPER_MINOR" }, { SAHPI_ES_UPPER_MAJOR , "UPPER_MAJOR" }, { SAHPI_ES_UPPER_CRIT , "UPPER_CRIT" }, { 0 , 0 }, }; static FElem SaHpiSensorRangeFlagsTElems[] = { { SAHPI_SRF_MIN , "MIN" }, { SAHPI_SRF_MAX , "MAX" }, { SAHPI_SRF_NORMAL_MIN , "NORMAL_MIN" }, { SAHPI_SRF_NORMAL_MAX , "NORMAL_MAX" }, { SAHPI_SRF_NOMINAL , "NOMINAL" }, { 0 , 0 }, }; static FElem SaHpiSensorThdMaskTElems[] = { { SAHPI_STM_LOW_MINOR , "LOW_MINOR" }, { SAHPI_STM_LOW_MAJOR , "LOW_MAJOR" }, { SAHPI_STM_LOW_CRIT , "LOW_CRIT" }, { SAHPI_STM_UP_MINOR , "UP_MINOR" }, { SAHPI_STM_UP_MAJOR , "UP_MAJOR" }, { SAHPI_STM_UP_CRIT , "UP_CRIT" }, { SAHPI_STM_UP_HYSTERESIS , "UP_HYSTERESIS" }, { SAHPI_STM_LOW_HYSTERESIS , "LOW_HYSTERESIS" }, { 0 , 0 }, }; static FElem SaHpiWatchdogExpFlagsTElems[] = { { SAHPI_WATCHDOG_EXP_BIOS_FRB2 , "BIOS_FRB2" }, { SAHPI_WATCHDOG_EXP_BIOS_POST , "BIOS_POST" }, { SAHPI_WATCHDOG_EXP_OS_LOAD , "OS_LOAD" }, { SAHPI_WATCHDOG_EXP_SMS_OS , "SMS_OS" }, { SAHPI_WATCHDOG_EXP_OEM , "OEM" }, { 0 , 0 }, }; static FElem SaHpiDimiTestCapabilityTElems[] = { { SAHPI_DIMITEST_CAPABILITY_RESULTSOUTPUT , "RESULTSOUTPUT" }, { SAHPI_DIMITEST_CAPABILITY_SERVICEMODE , "SERVICEMODE" }, { SAHPI_DIMITEST_CAPABILITY_LOOPCOUNT , "LOOPCOUNT" }, { SAHPI_DIMITEST_CAPABILITY_LOOPTIME , "LOOPTIME" }, { SAHPI_DIMITEST_CAPABILITY_LOGGING , "LOGGING" }, { SAHPI_DIMITEST_CAPABILITY_TESTCANCEL , "TESTCANCEL" }, { 0 , 0 }, }; static FElem SaHpiFumiLogicalBankStateFlagsTElems[] = { { SAHPI_FUMI_NO_MAIN_PERSISTENT_COPY , "NO_MAIN_PERSISTENT_COPY" }, { 0 , 0 }, }; static FElem SaHpiFumiProtocolTElems[] = { { SAHPI_FUMI_PROT_TFTP , "TFTP" }, { SAHPI_FUMI_PROT_FTP , "FTP" }, { SAHPI_FUMI_PROT_HTTP , "HTTP" }, { SAHPI_FUMI_PROT_LDAP , "LDAP" }, { SAHPI_FUMI_PROT_LOCAL , "LOCAL" }, { SAHPI_FUMI_PROT_NFS , "NFS" }, { SAHPI_FUMI_PROT_DBACCESS , "DBACCESS" }, { 0 , 0 }, }; static FElem SaHpiFumiCapabilityTElems[] = { { SAHPI_FUMI_CAP_ROLLBACK , "ROLLBACK" }, { SAHPI_FUMI_CAP_BANKCOPY , "BANKCOPY" }, { SAHPI_FUMI_CAP_BANKREORDER , "BANKREORDER" }, { SAHPI_FUMI_CAP_BACKUP , "BACKUP" }, { SAHPI_FUMI_CAP_TARGET_VERIFY , "TARGET_VERIFY" }, { SAHPI_FUMI_CAP_TARGET_VERIFY_MAIN , "TARGET_VERIFY_MAIN" }, { SAHPI_FUMI_CAP_COMPONENTS , "COMPONENTS" }, { SAHPI_FUMI_CAP_AUTOROLLBACK , "AUTOROLLBACK" }, { SAHPI_FUMI_CAP_AUTOROLLBACK_CAN_BE_DISABLED , "AUTOROLLBACK_CAN_BE_DISABLED" }, { SAHPI_FUMI_CAP_MAIN_NOT_PERSISTENT , "MAIN_NOT_PERSISTENT" }, { 0 , 0 }, }; static FElem SaHpiSensorOptionalDataTElems[] = { { SAHPI_SOD_TRIGGER_READING , "TRIGGER_READING" }, { SAHPI_SOD_TRIGGER_THRESHOLD , "TRIGGER_THRESHOLD" }, { SAHPI_SOD_OEM , "OEM" }, { SAHPI_SOD_PREVIOUS_STATE , "PREVIOUS_STATE" }, { SAHPI_SOD_CURRENT_STATE , "CURRENT_STATE" }, { SAHPI_SOD_SENSOR_SPECIFIC , "SENSOR_SPECIFIC" }, { 0 , 0 }, }; static FElem SaHpiSensorEnableOptDataTElems[] = { { SAHPI_SEOD_CURRENT_STATE , "CURRENT_STATE" }, { SAHPI_SEOD_ALARM_STATES , "ALARM_STATES" }, { 0 , 0 }, }; static FElem SaHpiCapabilitiesTElems[] = { { SAHPI_CAPABILITY_RESOURCE , "RESOURCE" }, { SAHPI_CAPABILITY_FUMI , "FUMI" }, { SAHPI_CAPABILITY_EVT_DEASSERTS , "EVT_DEASSERTS" }, { SAHPI_CAPABILITY_DIMI , "DIMI" }, { SAHPI_CAPABILITY_AGGREGATE_STATUS , "AGGREGATE_STATUS" }, { SAHPI_CAPABILITY_CONFIGURATION , "CONFIGURATION" }, { SAHPI_CAPABILITY_MANAGED_HOTSWAP , "MANAGED_HOTSWAP" }, { SAHPI_CAPABILITY_WATCHDOG , "WATCHDOG" }, { SAHPI_CAPABILITY_CONTROL , "CONTROL" }, { SAHPI_CAPABILITY_FRU , "FRU" }, { SAHPI_CAPABILITY_LOAD_ID , "LOAD_ID" }, { SAHPI_CAPABILITY_ANNUNCIATOR , "ANNUNCIATOR" }, { SAHPI_CAPABILITY_POWER , "POWER" }, { SAHPI_CAPABILITY_RESET , "RESET" }, { SAHPI_CAPABILITY_INVENTORY_DATA , "INVENTORY_DATA" }, { SAHPI_CAPABILITY_EVENT_LOG , "EVENT_LOG" }, { SAHPI_CAPABILITY_RDR , "RDR" }, { SAHPI_CAPABILITY_SENSOR , "SENSOR" }, { 0 , 0 }, }; static FElem SaHpiHsCapabilitiesTElems[] = { { SAHPI_HS_CAPABILITY_AUTOEXTRACT_READ_ONLY , "AUTOEXTRACT_READ_ONLY" }, { SAHPI_HS_CAPABILITY_INDICATOR_SUPPORTED , "INDICATOR_SUPPORTED" }, { SAHPI_HS_CAPABILITY_AUTOINSERT_IMMEDIATE , "AUTOINSERT_IMMEDIATE" }, { 0 , 0 }, }; static FElem SaHpiEventLogCapabilitiesTElems[] = { { SAHPI_EVTLOG_CAPABILITY_ENTRY_ADD , "ENTRY_ADD" }, { SAHPI_EVTLOG_CAPABILITY_CLEAR , "CLEAR" }, { SAHPI_EVTLOG_CAPABILITY_TIME_SET , "TIME_SET" }, { SAHPI_EVTLOG_CAPABILITY_STATE_SET , "STATE_SET" }, { SAHPI_EVTLOG_CAPABILITY_OVERFLOW_RESET , "OVERFLOW_RESET" }, { 0 , 0 }, }; /************************************************************** * Buffer Codecs *************************************************************/ static void ToTxt_Buffer( const SaHpiTextTypeT type, const void * src, size_t len, std::string& txt ) { ToTxt_Enum( SaHpiTextTypeTElems, &type, txt ); txt.append( ":" ); switch ( type ) { case SAHPI_TL_TYPE_UNICODE: // TODO unicode break; case SAHPI_TL_TYPE_BCDPLUS: case SAHPI_TL_TYPE_ASCII6: case SAHPI_TL_TYPE_TEXT: ToTxt_Ascii( src, len, txt ); break; case SAHPI_TL_TYPE_BINARY: ToTxt_Binary( src, len, txt ); break; default: break; } } static bool FromTxt_Buffer( const std::string& txt, size_t capacity, SaHpiTextTypeT& type, void * dst, size_t& len ) { std::string::const_iterator iter; size_t n = txt.find_first_of( ':' ); if ( n == std::string::npos ) { type = SAHPI_TL_TYPE_TEXT; iter = txt.begin(); } else { iter = txt.begin() + n; std::string stype( txt.begin(), iter ); bool rc = FromTxt_Enum( SaHpiTextTypeTElems, stype, &type ); if ( !rc ) { return false; } ++iter; } std::string data( iter, txt.end() ); switch ( type ) { case SAHPI_TL_TYPE_UNICODE: // TODO unicode return false; case SAHPI_TL_TYPE_BCDPLUS: case SAHPI_TL_TYPE_ASCII6: case SAHPI_TL_TYPE_TEXT: return FromTxt_Ascii( data, capacity, dst, len ); case SAHPI_TL_TYPE_BINARY: return FromTxt_Binary( data, capacity, dst, len ); default: return false; } } /************************************************************** * ToTxt_XXX *************************************************************/ static void ToTxt_SaHpiUint8T( const void * src, std::string& txt ) { const uint64_t x = ConstRef( src ); ToTxt_Uint( x, txt ); } static void ToTxt_SaHpiUint16T( const void * src, std::string& txt ) { const uint64_t x = ConstRef( src ); ToTxt_Uint( x, txt ); } static void ToTxt_SaHpiUint32T( const void * src, std::string& txt ) { const uint64_t x = ConstRef( src ); ToTxt_Uint( x, txt ); } static void ToTxt_SaHpiUint64T( const void * src, std::string& txt ) { const uint64_t x = ConstRef( src ); ToTxt_Uint( x, txt ); } static void ToTxt_SaHpiInt8T( const void * src, std::string& txt ) { int64_t x = ConstRef( src ); ToTxt_Int( x, txt ); } static void ToTxt_SaHpiInt16T( const void * src, std::string& txt ) { int64_t x = ConstRef( src ); ToTxt_Int( x, txt ); } static void ToTxt_SaHpiInt32T( const void * src, std::string& txt ) { int64_t x = ConstRef( src ); ToTxt_Int( x, txt ); } static void ToTxt_SaHpiInt64T( const void * src, std::string& txt ) { int64_t x = ConstRef( src ); ToTxt_Int( x, txt ); } static void ToTxt_SaHpiFloat64T( const void * src, std::string& txt ) { double x = ConstRef( src ); ToTxt_Double( x, txt ); } static void ToTxt_SaHpiBoolT( const void * src, std::string& txt ) { SaHpiBoolT x = ConstRef( src ); txt.append( ( x == SAHPI_FALSE ) ? "FALSE" : "TRUE" ); } static void ToTxt_SaHpiDomainIdT( const void * src, std::string& txt ) { SaHpiDomainIdT x = ConstRef( src ); if ( x == SAHPI_UNSPECIFIED_DOMAIN_ID ) { txt.append( "UNSPECIFIED" ); return; } ToTxt_SaHpiUint32T( src, txt ); } static void ToTxt_SaHpiResourceIdT( const void * src, std::string& txt ) { SaHpiResourceIdT x = ConstRef( src ); if ( x == SAHPI_UNSPECIFIED_RESOURCE_ID ) { txt.append( "UNSPECIFIED" ); return; } ToTxt_SaHpiUint32T( src, txt ); } static void ToTxt_SaHpiTimeT( const void * src, std::string& txt ) { SaHpiTimeT x = ConstRef( src ); if ( x == SAHPI_TIME_UNSPECIFIED ) { txt.append( "UNSPECIFIED" ); return; } ToTxt_SaHpiInt64T( src, txt ); } static void ToTxt_SaHpiTimeoutT( const void * src, std::string& txt ) { SaHpiTimeoutT x = ConstRef( src ); if ( x == SAHPI_TIMEOUT_IMMEDIATE ) { txt.append( "IMMEDIATE" ); return; } else if ( x == SAHPI_TIMEOUT_BLOCK ) { txt.append( "BLOCK" ); return; } ToTxt_SaHpiInt64T( src, txt ); } static void ToTxt_SaHpiTextBufferT( const void * src, std::string& txt ) { const SaHpiTextBufferT& tb = ConstRef( src ); ToTxt_Buffer( tb.DataType, &tb.Data, tb.DataLength, txt ); } static void ToTxt_SaHpiEntityPathT( const void * src, std::string& txt ) { const SaHpiEntityPathT& ep = ConstRef( src ); oh_big_textbuffer buf; oh_decode_entitypath( &ep, &buf ); txt.append( ConstPtr( &buf.Data[0] ), buf.DataLength ); } static void ToTxt_SaHpiNameT( const void * src, std::string& txt ) { const SaHpiNameT& name = ConstRef( src ); ToTxt_Buffer( SAHPI_TL_TYPE_TEXT, &name.Value, name.Length, txt ); } static void ToTxt_SaHpiLoadNumberT( const void * src, std::string& txt ) { SaHpiLoadNumberT ln = ConstRef( src ); if ( ln == SAHPI_LOAD_ID_DEFAULT ) { txt.append( "DEFAULT" ); return; } else if ( ln == SAHPI_LOAD_ID_BYNAME ) { txt.append( "BYNAME" ); return; } ToTxt_SaHpiUint32T( src, txt ); } static void ToTxt_SaHpiGuidT( const void * src, std::string& txt ) { const SaHpiGuidT& guid = ConstRef( src ); ToTxt_Buffer( SAHPI_TL_TYPE_BINARY, &guid, sizeof(guid), txt ); } static void ToTxt_SaHpiCtrlStateStreamTWithoutRepeat( const void * src, std::string& txt ) { const SaHpiCtrlStateStreamT& state = ConstRef( src ); ToTxt_Buffer( SAHPI_TL_TYPE_BINARY, &state.Stream, state.StreamLength, txt ); } static void ToTxt_SaHpiCtrlStateOemTWithoutMId( const void * src, std::string& txt ) { const SaHpiCtrlStateOemT& state = ConstRef( src ); ToTxt_Buffer( SAHPI_TL_TYPE_BINARY, &state.Body, state.BodyLength, txt ); } static void ToTxt_ControlOemConfigData( const void * src, std::string& txt ) { const SaHpiUint8T * cd = ConstPtr( src ); ToTxt_Buffer( SAHPI_TL_TYPE_BINARY, cd, SAHPI_CTRL_OEM_CONFIG_LENGTH, txt ); } static void ToTxt_SensorReadingBuffer( const void * src, std::string& txt ) { const SaHpiUint8T * cd = ConstPtr( src ); ToTxt_Buffer( SAHPI_TL_TYPE_BINARY, cd, SAHPI_SENSOR_BUFFER_LENGTH, txt ); } static void ToTxt_DimiTestParamName( const void * src, std::string& txt ) { const SaHpiUint8T * name = ConstPtr( src ); ToTxt_Buffer( SAHPI_TL_TYPE_TEXT, name, SAHPI_DIMITEST_PARAM_NAME_LEN, txt ); } static void ToTxt_SaHpiFumiOemDefinedSpecInfoTWithoutMid( const void * src, std::string& txt ) { const SaHpiFumiOemDefinedSpecInfoT& info = ConstRef( src ); ToTxt_Buffer( SAHPI_TL_TYPE_BINARY, &info.Body, info.BodyLength, txt ); } /************************************************************** * FromTxt_XXX *************************************************************/ static bool FromTxt_SaHpiUint8T( const std::string& txt, void * dst ) { uint64_t x = 0; bool rc = FromTxt_Uint( txt, x ); if ( rc ) { Ref( dst ) = x; } return rc; } static bool FromTxt_SaHpiUint16T( const std::string& txt, void * dst ) { uint64_t x = 0; bool rc = FromTxt_Uint( txt, x ); if ( rc ) { Ref( dst ) = x; } return rc; } static bool FromTxt_SaHpiUint32T( const std::string& txt, void * dst ) { uint64_t x = 0; bool rc = FromTxt_Uint( txt, x ); if ( rc ) { Ref( dst ) = x; } return rc; } static bool FromTxt_SaHpiUint64T( const std::string& txt, void * dst ) { uint64_t x = 0; bool rc = FromTxt_Uint( txt, x ); if ( rc ) { Ref( dst ) = x; } return rc; } static bool FromTxt_SaHpiInt8T( const std::string& txt, void * dst ) { int64_t x = 0; bool rc = FromTxt_Int( txt, x ); if ( rc ) { Ref( dst ) = x; } return rc; } static bool FromTxt_SaHpiInt16T( const std::string& txt, void * dst ) { int64_t x = 0; bool rc = FromTxt_Int( txt, x ); if ( rc ) { Ref( dst ) = x; } return rc; } static bool FromTxt_SaHpiInt32T( const std::string& txt, void * dst ) { int64_t x = 0; bool rc = FromTxt_Int( txt, x ); if ( rc ) { Ref( dst ) = x; } return rc; } static bool FromTxt_SaHpiInt64T( const std::string& txt, void * dst ) { int64_t x = 0; bool rc = FromTxt_Int( txt, x ); if ( rc ) { Ref( dst ) = x; } return rc; } static bool FromTxt_SaHpiFloat64T( const std::string& txt, void * dst ) { double x = 0; bool rc = FromTxt_Double( txt, x ); if ( rc ) { Ref( dst ) = x; } return rc; } static bool FromTxt_SaHpiBoolT( const std::string& txt, void * dst ) { SaHpiBoolT& x = Ref( dst ); if ( txt == "FALSE" ) { x = SAHPI_FALSE; return true; } else if ( txt == "TRUE" ) { x = SAHPI_TRUE; return true; } else { return false; } } static bool FromTxt_SaHpiDomainIdT( const std::string& txt, void * dst ) { SaHpiDomainIdT& x = Ref( dst ); if ( txt == "UNSPECIFIED" ) { x = SAHPI_UNSPECIFIED_DOMAIN_ID; return true; } return FromTxt_SaHpiUint32T( txt, dst ); } static bool FromTxt_SaHpiResourceIdT( const std::string& txt, void * dst ) { SaHpiResourceIdT& x = Ref( dst ); if ( txt == "UNSPECIFIED" ) { x = SAHPI_UNSPECIFIED_RESOURCE_ID; return true; } return FromTxt_SaHpiUint32T( txt, dst ); } static bool FromTxt_SaHpiTimeT( const std::string& txt, void * dst ) { SaHpiTimeT& x = Ref( dst ); if ( txt == "UNSPECIFIED" ) { x = SAHPI_TIME_UNSPECIFIED; return true; } return FromTxt_SaHpiInt64T( txt, dst ); } static bool FromTxt_SaHpiTimeoutT( const std::string& txt, void * dst ) { SaHpiTimeoutT& x = Ref( dst ); if ( txt == "IMMEDIATE" ) { x = SAHPI_TIMEOUT_IMMEDIATE; return true; } else if ( txt == "BLOCK" ) { x = SAHPI_TIMEOUT_BLOCK; return true; } return FromTxt_SaHpiInt64T( txt, dst ); } static bool FromTxt_SaHpiTextBufferT( const std::string& txt, void * dst ) { SaHpiTextBufferT& tb = Ref( dst ); size_t len = 0; bool rc = FromTxt_Buffer( txt, SAHPI_MAX_TEXT_BUFFER_LENGTH, tb.DataType, &tb.Data, len ); if ( rc ) { tb.DataLength = len; } return rc; } static bool FromTxt_SaHpiInstrumentIdT( const std::string& txt, void * dst ) { return FromTxt_SaHpiUint32T( txt, dst ); } static bool FromTxt_SaHpiEntityPathT( const std::string& txt, void * dst ) { SaHpiEntityPathT& ep = Ref( dst ); SaErrorT rv = oh_encode_entitypath( txt.c_str(), &ep ); return ( rv == SA_OK ); } static bool FromTxt_SaHpiNameT( const std::string& txt, void * dst ) { SaHpiNameT& name = Ref( dst ); SaHpiTextTypeT type; size_t len = 0; bool rc = FromTxt_Buffer( txt, SA_HPI_MAX_NAME_LENGTH, type, &name.Value, len ); if ( rc ) { name.Length = len; } return rc; } static bool FromTxt_SaHpiLoadNumberT( const std::string& txt, void * dst ) { SaHpiLoadNumberT& ln = Ref( dst ); if ( txt == "DEFAULT" ) { ln = SAHPI_LOAD_ID_DEFAULT; return true; } else if ( txt == "BYNAME" ) { ln = SAHPI_LOAD_ID_BYNAME; return true; } return FromTxt_SaHpiUint32T( txt, dst ); } static bool FromTxt_SaHpiGuidT( const std::string& txt, void * dst ) { SaHpiGuidT& guid = Ref( dst ); SaHpiTextTypeT type; size_t len = 0; return FromTxt_Buffer( txt, sizeof(guid), type, &guid, len ); } static bool FromTxt_SaHpiCtrlStateStreamTWithoutRepeat( const std::string& txt, void * dst ) { SaHpiCtrlStateStreamT& state = Ref( dst ); SaHpiTextTypeT type; size_t len = 0; bool rc = FromTxt_Buffer( txt, SAHPI_CTRL_MAX_STREAM_LENGTH, type, &state.Stream, len ); if ( rc ) { state.StreamLength = len; } return rc; } static bool FromTxt_SaHpiCtrlStateOemTWithoutMId( const std::string& txt, void * dst ) { SaHpiCtrlStateOemT& state = Ref( dst ); SaHpiTextTypeT type; size_t len = 0; bool rc = FromTxt_Buffer( txt, SAHPI_CTRL_MAX_OEM_BODY_LENGTH, type, &state.Body, len ); if ( rc ) { state.BodyLength = len; } return rc; } static bool FromTxt_ControlOemConfigData( const std::string& txt, void * dst ) { SaHpiUint8T * cd = Ptr( dst ); SaHpiTextTypeT type; size_t len = 0; return FromTxt_Buffer( txt, SAHPI_CTRL_OEM_CONFIG_LENGTH, type, cd, len ); } static bool FromTxt_SensorReadingBuffer( const std::string& txt, void * dst ) { SaHpiUint8T * cd = Ptr( dst ); SaHpiTextTypeT type; size_t len = 0; return FromTxt_Buffer( txt, SAHPI_SENSOR_BUFFER_LENGTH, type, cd, len ); } static bool FromTxt_DimiTestParamName( const std::string& txt, void * dst ) { SaHpiUint8T * name = Ptr( dst ); SaHpiTextTypeT type; size_t len = 0; return FromTxt_Buffer( txt, SAHPI_DIMITEST_PARAM_NAME_LEN, type, name, len ); } static bool FromTxt_SaHpiFumiOemDefinedSpecInfoTWithoutMid( const std::string& txt, void * dst ) { SaHpiFumiOemDefinedSpecInfoT& info = Ref( dst ); SaHpiTextTypeT type; size_t len = 0; bool rc = FromTxt_Buffer( txt, SAHPI_FUMI_MAX_OEM_BODY_LENGTH, type, &info.Body, len ); if ( rc ) { info.BodyLength = len; } return rc; } /************************************************************** * Codec Interface *************************************************************/ // Data Codecs void ToTxt( const Var& var, std::string& txt ) { const void * src = var.rdata; switch ( var.type ) { case dtSaHpiUint8T: ToTxt_SaHpiUint8T( src, txt ); return; case dtSaHpiUint16T: ToTxt_SaHpiUint16T( src, txt ); return; case dtSaHpiUint32T: ToTxt_SaHpiUint32T( src, txt ); return; case dtSaHpiUint64T: ToTxt_SaHpiUint64T( src, txt ); return; case dtSaHpiInt8T: ToTxt_SaHpiInt8T( src, txt ); return; case dtSaHpiInt16T: ToTxt_SaHpiInt16T( src, txt ); return; case dtSaHpiInt32T: ToTxt_SaHpiInt32T( src, txt ); return; case dtSaHpiInt64T: ToTxt_SaHpiInt64T( src, txt ); return; case dtSaHpiFloat64T: ToTxt_SaHpiFloat64T( src, txt ); return; case dtSaHpiBoolT: ToTxt_SaHpiBoolT( src, txt ); return; case dtSaHpiManufacturerIdT: ToTxt_SaHpiUint32T( src, txt ); return; case dtSaHpiDomainIdT: ToTxt_SaHpiDomainIdT( src, txt ); return; case dtSaHpiResourceIdT: ToTxt_SaHpiResourceIdT( src, txt ); return; case dtSaHpiEntryIdT: ToTxt_SaHpiUint32T( src, txt ); return; case dtSaHpiTimeT: ToTxt_SaHpiTimeT( src, txt ); return; case dtSaHpiTimeoutT: ToTxt_SaHpiTimeoutT( src, txt ); return; case dtSaHpiLanguageT: ToTxt_Enum( SaHpiLanguageTElems, src, txt ); return; case dtSaHpiTextTypeT: ToTxt_Enum( SaHpiTextTypeTElems, src, txt ); return; case dtSaHpiTextBufferT: ToTxt_SaHpiTextBufferT( src, txt ); return; case dtSaHpiInstrumentIdT: ToTxt_SaHpiUint32T( src, txt ); return; case dtSaHpiEntityPathT: ToTxt_SaHpiEntityPathT( src, txt ); return; case dtSaHpiEventCategoryT: ToTxt_EnumU8( SaHpiEventCategoryTElems, src, txt ); return; case dtSaHpiEventStateT: ToTxt_Flags16( SaHpiEventStateTElems, src, txt ); return; case dtSaHpiEventStateTThreshold: ToTxt_Flags16( SaHpiEventStateTThresholdElems, src, txt ); return; case dtSaHpiSensorNumT: ToTxt_SaHpiUint32T( src, txt ); return; case dtSaHpiSensorTypeT: ToTxt_Enum( SaHpiSensorTypeTElems, src, txt ); return; case dtSaHpiSensorReadingTypeT: ToTxt_Enum( SaHpiSensorReadingTypeTElems, src, txt ); return; case dtSaHpiSensorRangeFlagsT: ToTxt_Flags8( SaHpiSensorRangeFlagsTElems, src, txt ); return; case dtSaHpiSensorUnitsT: ToTxt_Enum( SaHpiSensorUnitsTElems, src, txt ); return; case dtSaHpiSensorModUnitUseT: ToTxt_Enum( SaHpiSensorModUnitUseTElems, src, txt ); return; case dtSaHpiSensorThdMaskT: ToTxt_Flags8( SaHpiSensorThdMaskTElems, src, txt ); return; case dtSaHpiSensorEventCtrlT: ToTxt_Enum( SaHpiSensorEventCtrlTElems, src, txt ); return; case dtSaHpiCtrlNumT: ToTxt_SaHpiUint32T( src, txt ); return; case dtSaHpiCtrlTypeT: ToTxt_Enum( SaHpiCtrlTypeTElems, src, txt ); return; case dtSaHpiCtrlStateDigitalT: ToTxt_Enum( SaHpiCtrlStateDigitalTElems, src, txt ); return; case dtSaHpiCtrlStateDiscreteT: ToTxt_SaHpiUint32T( src, txt ); return; case dtSaHpiCtrlStateAnalogT: ToTxt_SaHpiInt32T( src, txt ); return; case dtSaHpiTxtLineNumT: ToTxt_SaHpiUint8T( src, txt ); return; case dtSaHpiCtrlModeT: ToTxt_Enum( SaHpiCtrlModeTElems, src, txt ); return; case dtSaHpiCtrlOutputTypeT: ToTxt_Enum( SaHpiCtrlOutputTypeTElems, src, txt ); return; case dtSaHpiIdrIdT: ToTxt_SaHpiUint32T( src, txt ); return; case dtSaHpiIdrAreaTypeT: ToTxt_Enum( SaHpiIdrAreaTypeTElems, src, txt ); return; case dtSaHpiIdrFieldTypeT: ToTxt_Enum( SaHpiIdrFieldTypeTElems, src, txt ); return; case dtSaHpiWatchdogNumT: ToTxt_SaHpiUint32T( src, txt ); return; case dtSaHpiWatchdogActionT: ToTxt_Enum( SaHpiWatchdogActionTElems, src, txt ); return; case dtSaHpiWatchdogActionEventT: ToTxt_Enum( SaHpiWatchdogActionEventTElems, src, txt ); return; case dtSaHpiWatchdogPretimerInterruptT: ToTxt_Enum( SaHpiWatchdogPretimerInterruptTElems, src, txt ); return; case dtSaHpiWatchdogTimerUseT: ToTxt_Enum( SaHpiWatchdogTimerUseTElems, src, txt ); return; case dtSaHpiWatchdogExpFlagsT: ToTxt_Flags8( SaHpiWatchdogExpFlagsTElems, src, txt ); return; case dtSaHpiDimiNumT: ToTxt_SaHpiUint32T( src, txt ); return; case dtSaHpiDimiTestServiceImpactT: ToTxt_Enum( SaHpiDimiTestServiceImpactTElems, src, txt ); return; case dtSaHpiDimiTestRunStatusT: ToTxt_Enum( SaHpiDimiTestRunStatusTElems, src, txt ); return; case dtSaHpiDimiTestErrCodeT: ToTxt_Enum( SaHpiDimiTestErrCodeTElems, src, txt ); return; case dtSaHpiDimiTestParamTypeT: ToTxt_Enum( SaHpiDimiTestParamTypeTElems, src, txt ); return; case dtSaHpiDimiTestCapabilityT: ToTxt_Flags32( SaHpiDimiTestCapabilityTElems, src, txt ); return; case dtSaHpiDimiTestNumT: ToTxt_SaHpiUint32T( src, txt ); return; case dtSaHpiDimiTestPercentCompletedT: ToTxt_SaHpiUint8T( src, txt ); return; case dtSaHpiDimiReadyT: ToTxt_Enum( SaHpiDimiReadyTElems, src, txt ); return; case dtSaHpiFumiNumT: ToTxt_SaHpiUint32T( src, txt ); return; case dtSaHpiBankNumT: ToTxt_SaHpiUint8T( src, txt ); return; case dtSaHpiFumiSpecInfoTypeT: ToTxt_Enum( SaHpiFumiSpecInfoTypeTElems, src, txt ); return; case dtSaHpiFumiSafDefinedSpecIdT: ToTxt_Enum( SaHpiFumiSafDefinedSpecIdTElems, src, txt ); return; case dtSaHpiFumiServiceImpactT: ToTxt_Enum( SaHpiFumiServiceImpactTElems, src, txt ); return; case dtSaHpiFumiSourceStatusT: ToTxt_Enum( SaHpiFumiSourceStatusTElems, src, txt ); return; case dtSaHpiFumiBankStateT: ToTxt_Enum( SaHpiFumiBankStateTElems, src, txt ); return; case dtSaHpiFumiUpgradeStatusT: ToTxt_Enum( SaHpiFumiUpgradeStatusTElems, src, txt ); return; case dtSaHpiFumiLogicalBankStateFlagsT: ToTxt_Flags32( SaHpiFumiLogicalBankStateFlagsTElems, src, txt ); return; case dtSaHpiFumiProtocolT: ToTxt_Flags32( SaHpiFumiProtocolTElems, src, txt ); return; case dtSaHpiFumiCapabilityT: ToTxt_Flags32( SaHpiFumiCapabilityTElems, src, txt ); return; case dtSaHpiHsIndicatorStateT: ToTxt_Enum( SaHpiHsIndicatorStateTElems, src, txt ); return; case dtSaHpiHsStateT: ToTxt_Enum( SaHpiHsStateTElems, src, txt ); return; case dtSaHpiHsCauseOfStateChangeT: ToTxt_Enum( SaHpiHsCauseOfStateChangeTElems, src, txt ); return; case dtSaHpiSeverityT: ToTxt_Enum( SaHpiSeverityTElems, src, txt ); return; case dtSaHpiResourceEventTypeT: ToTxt_Enum( SaHpiResourceEventTypeTElems, src, txt ); return; case dtSaHpiDomainEventTypeT: ToTxt_Enum( SaHpiDomainEventTypeTElems, src, txt ); return; case dtSaHpiSensorOptionalDataT: ToTxt_Flags8( SaHpiSensorOptionalDataTElems, src, txt ); return; case dtSaHpiSensorEnableOptDataT: ToTxt_Flags8( SaHpiSensorEnableOptDataTElems, src, txt ); return; case dtSaHpiSwEventTypeT: ToTxt_Enum( SaHpiSwEventTypeTElems, src, txt ); return; case dtSaHpiEventTypeT: ToTxt_Enum( SaHpiEventTypeTElems, src, txt ); return; case dtSaHpiAnnunciatorNumT: ToTxt_SaHpiUint32T( src, txt ); return; case dtSaHpiNameT: ToTxt_SaHpiNameT( src, txt ); return; case dtSaHpiStatusCondTypeT: ToTxt_Enum( SaHpiStatusCondTypeTElems, src, txt ); return; case dtSaHpiAnnunciatorModeT: ToTxt_Enum( SaHpiAnnunciatorModeTElems, src, txt ); return; case dtSaHpiAnnunciatorTypeT: ToTxt_Enum( SaHpiAnnunciatorTypeTElems, src, txt ); return; case dtSaHpiRdrTypeT: ToTxt_Enum( SaHpiRdrTypeTElems, src, txt ); return; case dtSaHpiParmActionT: ToTxt_Enum( SaHpiParmActionTElems, src, txt ); return; case dtSaHpiResetActionT: ToTxt_Enum( SaHpiResetActionTElems, src, txt ); return; case dtSaHpiPowerStateT: ToTxt_Enum( SaHpiPowerStateTElems, src, txt ); return; case dtSaHpiLoadNumberT: ToTxt_SaHpiLoadNumberT( src, txt ); return; case dtSaHpiGuidT: ToTxt_SaHpiGuidT( src, txt ); return; case dtSaHpiCapabilitiesT: ToTxt_Flags32( SaHpiCapabilitiesTElems, src, txt ); return; case dtSaHpiHsCapabilitiesT: ToTxt_Flags32( SaHpiHsCapabilitiesTElems, src, txt ); return; case dtSaHpiEventLogOverflowActionT: ToTxt_Enum( SaHpiEventLogOverflowActionTElems, src, txt ); return; case dtSaHpiEventLogCapabilitiesT: ToTxt_Flags32( SaHpiEventLogCapabilitiesTElems, src, txt ); return; case dtSaHpiEventLogEntryIdT: ToTxt_SaHpiUint32T( src, txt ); return; case dtSaHpiCtrlStateStreamTWithoutRepeat: ToTxt_SaHpiCtrlStateStreamTWithoutRepeat( src, txt ); return; case dtSaHpiCtrlStateOemTWithoutMId: ToTxt_SaHpiCtrlStateOemTWithoutMId( src, txt ); return; case dtControlOemConfigData: ToTxt_ControlOemConfigData( src, txt ); return; case dtSensorReadingBuffer: ToTxt_SensorReadingBuffer( src, txt ); return; case dtDimiTestParamName: ToTxt_DimiTestParamName( src, txt ); return; case dtSaHpiFumiOemDefinedSpecInfoTWithoutMid: ToTxt_SaHpiFumiOemDefinedSpecInfoTWithoutMid( src, txt ); return; default: return; } } bool FromTxt( const std::string& txt, Var& var ) { void * dst = var.wdata; if ( !dst ) { return false; } switch ( var.type ) { case dtSaHpiUint8T: return FromTxt_SaHpiUint8T( txt, dst ); case dtSaHpiUint16T: return FromTxt_SaHpiUint16T( txt, dst ); case dtSaHpiUint32T: return FromTxt_SaHpiUint32T( txt, dst ); case dtSaHpiUint64T: return FromTxt_SaHpiUint64T( txt, dst ); case dtSaHpiInt8T: return FromTxt_SaHpiInt8T( txt, dst ); case dtSaHpiInt16T: return FromTxt_SaHpiInt16T( txt, dst ); case dtSaHpiInt32T: return FromTxt_SaHpiInt32T( txt, dst ); case dtSaHpiInt64T: return FromTxt_SaHpiInt64T( txt, dst ); case dtSaHpiFloat64T: return FromTxt_SaHpiFloat64T( txt, dst ); case dtSaHpiBoolT: return FromTxt_SaHpiBoolT( txt, dst ); case dtSaHpiManufacturerIdT: return FromTxt_SaHpiUint32T( txt, dst ); case dtSaHpiDomainIdT: return FromTxt_SaHpiDomainIdT( txt, dst ); case dtSaHpiResourceIdT: return FromTxt_SaHpiResourceIdT( txt, dst ); case dtSaHpiEntryIdT: return FromTxt_SaHpiUint32T( txt, dst ); case dtSaHpiTimeT: return FromTxt_SaHpiTimeT( txt, dst ); case dtSaHpiTimeoutT: return FromTxt_SaHpiTimeoutT( txt, dst ); case dtSaHpiLanguageT: return FromTxt_Enum( SaHpiLanguageTElems, txt, dst ); case dtSaHpiTextTypeT: return FromTxt_Enum( SaHpiTextTypeTElems, txt, dst ); case dtSaHpiTextBufferT: return FromTxt_SaHpiTextBufferT( txt, dst ); case dtSaHpiInstrumentIdT: return FromTxt_SaHpiInstrumentIdT( txt, dst ); case dtSaHpiEntityPathT: return FromTxt_SaHpiEntityPathT( txt, dst ); case dtSaHpiEventCategoryT: return FromTxt_EnumU8( SaHpiEventCategoryTElems, txt, dst ); case dtSaHpiEventStateT: return FromTxt_Flags16( SaHpiEventStateTElems, txt, dst ); case dtSaHpiEventStateTThreshold: return FromTxt_Flags16( SaHpiEventStateTThresholdElems, txt, dst ); case dtSaHpiSensorNumT: return FromTxt_SaHpiUint32T( txt, dst ); case dtSaHpiSensorTypeT: return FromTxt_Enum( SaHpiSensorTypeTElems, txt, dst ); case dtSaHpiSensorReadingTypeT: return FromTxt_Enum( SaHpiSensorReadingTypeTElems, txt, dst ); case dtSaHpiSensorRangeFlagsT: return FromTxt_Flags8( SaHpiSensorRangeFlagsTElems, txt, dst ); case dtSaHpiSensorUnitsT: return FromTxt_Enum( SaHpiSensorUnitsTElems, txt, dst ); case dtSaHpiSensorModUnitUseT: return FromTxt_Enum( SaHpiSensorModUnitUseTElems, txt, dst ); case dtSaHpiSensorThdMaskT: return FromTxt_Flags8( SaHpiSensorThdMaskTElems, txt, dst ); case dtSaHpiSensorEventCtrlT: return FromTxt_Enum( SaHpiSensorEventCtrlTElems, txt, dst ); case dtSaHpiCtrlNumT: return FromTxt_SaHpiUint32T( txt, dst ); case dtSaHpiCtrlTypeT: return FromTxt_Enum( SaHpiCtrlTypeTElems, txt, dst ); case dtSaHpiCtrlStateDigitalT: return FromTxt_Enum( SaHpiCtrlStateDigitalTElems, txt, dst ); case dtSaHpiCtrlStateDiscreteT: return FromTxt_SaHpiUint32T( txt, dst ); case dtSaHpiCtrlStateAnalogT: return FromTxt_SaHpiInt32T( txt, dst ); case dtSaHpiTxtLineNumT: return FromTxt_SaHpiUint8T( txt, dst ); case dtSaHpiCtrlModeT: return FromTxt_Enum( SaHpiCtrlModeTElems, txt, dst ); case dtSaHpiCtrlOutputTypeT: return FromTxt_Enum( SaHpiCtrlOutputTypeTElems, txt, dst ); case dtSaHpiIdrIdT: return FromTxt_SaHpiUint32T( txt, dst ); case dtSaHpiIdrAreaTypeT: return FromTxt_Enum( SaHpiIdrAreaTypeTElems, txt, dst ); case dtSaHpiIdrFieldTypeT: return FromTxt_Enum( SaHpiIdrFieldTypeTElems, txt, dst ); case dtSaHpiWatchdogNumT: return FromTxt_SaHpiUint32T( txt, dst ); case dtSaHpiWatchdogActionT: return FromTxt_Enum( SaHpiWatchdogActionTElems, txt, dst ); case dtSaHpiWatchdogActionEventT: return FromTxt_Enum( SaHpiWatchdogActionEventTElems, txt, dst ); case dtSaHpiWatchdogPretimerInterruptT: return FromTxt_Enum( SaHpiWatchdogPretimerInterruptTElems, txt, dst ); case dtSaHpiWatchdogTimerUseT: return FromTxt_Enum( SaHpiWatchdogTimerUseTElems, txt, dst ); case dtSaHpiWatchdogExpFlagsT: return FromTxt_Flags8( SaHpiWatchdogExpFlagsTElems, txt, dst ); case dtSaHpiDimiNumT: return FromTxt_SaHpiUint32T( txt, dst ); case dtSaHpiDimiTestServiceImpactT: return FromTxt_Enum( SaHpiDimiTestServiceImpactTElems, txt, dst ); case dtSaHpiDimiTestRunStatusT: return FromTxt_Enum( SaHpiDimiTestRunStatusTElems, txt, dst ); case dtSaHpiDimiTestErrCodeT: return FromTxt_Enum( SaHpiDimiTestErrCodeTElems, txt, dst ); case dtSaHpiDimiTestParamTypeT: return FromTxt_Enum( SaHpiDimiTestParamTypeTElems, txt, dst ); case dtSaHpiDimiTestCapabilityT: return FromTxt_Flags32( SaHpiDimiTestCapabilityTElems, txt, dst ); case dtSaHpiDimiTestNumT: return FromTxt_SaHpiUint32T( txt, dst ); case dtSaHpiDimiTestPercentCompletedT: return FromTxt_SaHpiUint8T( txt, dst ); case dtSaHpiDimiReadyT: return FromTxt_Enum( SaHpiDimiReadyTElems, txt, dst ); case dtSaHpiFumiNumT: return FromTxt_SaHpiUint32T( txt, dst ); case dtSaHpiBankNumT: return FromTxt_SaHpiUint8T( txt, dst ); case dtSaHpiFumiSpecInfoTypeT: return FromTxt_Enum( SaHpiFumiSpecInfoTypeTElems, txt, dst ); case dtSaHpiFumiSafDefinedSpecIdT: return FromTxt_Enum( SaHpiFumiSafDefinedSpecIdTElems, txt, dst ); case dtSaHpiFumiServiceImpactT: return FromTxt_Enum( SaHpiFumiServiceImpactTElems, txt, dst ); case dtSaHpiFumiSourceStatusT: return FromTxt_Enum( SaHpiFumiSourceStatusTElems, txt, dst ); case dtSaHpiFumiBankStateT: return FromTxt_Enum( SaHpiFumiBankStateTElems, txt, dst ); case dtSaHpiFumiUpgradeStatusT: return FromTxt_Enum( SaHpiFumiUpgradeStatusTElems, txt, dst ); case dtSaHpiFumiLogicalBankStateFlagsT: return FromTxt_Flags32( SaHpiFumiLogicalBankStateFlagsTElems, txt, dst ); case dtSaHpiFumiProtocolT: return FromTxt_Flags32( SaHpiFumiProtocolTElems, txt, dst ); case dtSaHpiFumiCapabilityT: return FromTxt_Flags32( SaHpiFumiCapabilityTElems, txt, dst ); case dtSaHpiHsIndicatorStateT: return FromTxt_Enum( SaHpiHsIndicatorStateTElems, txt, dst ); case dtSaHpiHsStateT: return FromTxt_Enum( SaHpiHsStateTElems, txt, dst ); case dtSaHpiHsCauseOfStateChangeT: return FromTxt_Enum( SaHpiHsCauseOfStateChangeTElems, txt, dst ); case dtSaHpiSeverityT: return FromTxt_Enum( SaHpiSeverityTElems, txt, dst ); case dtSaHpiResourceEventTypeT: return FromTxt_Enum( SaHpiResourceEventTypeTElems, txt, dst ); case dtSaHpiDomainEventTypeT: return FromTxt_Enum( SaHpiDomainEventTypeTElems, txt, dst ); case dtSaHpiSensorOptionalDataT: return FromTxt_Flags8( SaHpiSensorOptionalDataTElems, txt, dst ); case dtSaHpiSensorEnableOptDataT: return FromTxt_Flags8( SaHpiSensorEnableOptDataTElems, txt, dst ); case dtSaHpiSwEventTypeT: return FromTxt_Enum( SaHpiSwEventTypeTElems, txt, dst ); case dtSaHpiEventTypeT: return FromTxt_Enum( SaHpiEventTypeTElems, txt, dst ); case dtSaHpiAnnunciatorNumT: return FromTxt_SaHpiUint32T( txt, dst ); case dtSaHpiNameT: return FromTxt_SaHpiNameT( txt, dst ); case dtSaHpiStatusCondTypeT: return FromTxt_Enum( SaHpiStatusCondTypeTElems, txt, dst ); case dtSaHpiAnnunciatorModeT: return FromTxt_Enum( SaHpiAnnunciatorModeTElems, txt, dst ); case dtSaHpiAnnunciatorTypeT: return FromTxt_Enum( SaHpiAnnunciatorTypeTElems, txt, dst ); case dtSaHpiRdrTypeT: return FromTxt_Enum( SaHpiRdrTypeTElems, txt, dst ); case dtSaHpiParmActionT: return FromTxt_Enum( SaHpiParmActionTElems, txt, dst ); case dtSaHpiResetActionT: return FromTxt_Enum( SaHpiResetActionTElems, txt, dst ); case dtSaHpiPowerStateT: return FromTxt_Enum( SaHpiPowerStateTElems, txt, dst ); case dtSaHpiLoadNumberT: return FromTxt_SaHpiLoadNumberT( txt, dst ); case dtSaHpiGuidT: return FromTxt_SaHpiGuidT( txt, dst ); case dtSaHpiCapabilitiesT: return FromTxt_Flags32( SaHpiCapabilitiesTElems, txt, dst ); case dtSaHpiHsCapabilitiesT: return FromTxt_Flags32( SaHpiHsCapabilitiesTElems, txt, dst ); case dtSaHpiEventLogOverflowActionT: return FromTxt_Enum( SaHpiEventLogOverflowActionTElems, txt, dst ); case dtSaHpiEventLogCapabilitiesT: return FromTxt_Flags32( SaHpiEventLogCapabilitiesTElems, txt, dst ); case dtSaHpiEventLogEntryIdT: return FromTxt_SaHpiUint32T( txt, dst ); case dtSaHpiCtrlStateStreamTWithoutRepeat: return FromTxt_SaHpiCtrlStateStreamTWithoutRepeat( txt, dst ); case dtSaHpiCtrlStateOemTWithoutMId: return FromTxt_SaHpiCtrlStateOemTWithoutMId( txt, dst ); case dtControlOemConfigData: return FromTxt_ControlOemConfigData( txt, dst ); case dtSensorReadingBuffer: return FromTxt_SensorReadingBuffer( txt, dst ); case dtDimiTestParamName: return FromTxt_DimiTestParamName( txt, dst ); case dtSaHpiFumiOemDefinedSpecInfoTWithoutMid: return FromTxt_SaHpiFumiOemDefinedSpecInfoTWithoutMid( txt, dst ); default: return false; } } // Object Name Codecs std::string AssembleNumberedObjectName( const std::string& classname, SaHpiUint32T num ) { std::string name( classname ); name.push_back( '-' ); ToTxt_SaHpiUint32T( &num, name ); return name; } bool DisassembleNumberedObjectName( const std::string& name, std::string& classname, SaHpiUint32T& num ) { size_t n = name.find_first_of( '-' ); if ( n == std::string::npos ) { return false; } std::string::const_iterator iter = name.begin() + n; classname.assign( name.begin(), iter ); ++iter; std::string snum( iter, name.end() ); return FromTxt_SaHpiUint32T( snum, &num ); } std::string AssembleResourceObjectName( const SaHpiEntityPathT& ep ) { std::string name; ToTxt_SaHpiEntityPathT( &ep, name ); return name; } bool DisassembleResourceObjectName( const std::string& name, SaHpiEntityPathT& ep ) { return FromTxt_SaHpiEntityPathT( name, &ep ); } }; // namespace TA openhpi-3.6.1/plugins/test_agent/Makefile.am0000644000175100017510000000545512575647277020064 0ustar mohanmohan# -*- linux-c++ -*- # # (C) Copyright Pigeon Point Systems. 2010 # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # # Author(s): # Anton Pak # MAINTAINERCLEANFILES = Makefile.in AM_CPPFLAGS = -DG_LOG_DOMAIN=\"test_agent\" -D__STDC_FORMAT_MACROS AM_CPPFLAGS += @OPENHPI_INCLUDES@ EXTRA_DIST = Makefile.mingw32 version.rc pkglib_LTLIBRARIES = libtest_agent.la libtest_agent_la_SOURCES = abi.cpp \ abi.h \ announcement.cpp \ announcement.h \ annunciator.cpp \ annunciator.h \ area.cpp \ area.h \ bank.cpp \ bank.h \ codec.cpp \ codec.h \ console.cpp \ console.h \ control.cpp \ control.h \ dimi.cpp \ dimi.h \ fumi.cpp \ fumi.h \ field.cpp \ field.h \ handler.cpp \ handler.h \ instrument.cpp \ instrument.h \ instruments.cpp \ instruments.h \ inventory.cpp \ inventory.h \ log.cpp \ log.h \ object.cpp \ object.h \ resource.cpp \ resource.h \ sensor.cpp \ sensor.h \ server.cpp \ server.h \ structs.cpp \ structs.h \ test.cpp \ test.h \ timers.cpp \ timers.h \ utils.cpp \ utils.h \ vars.cpp \ vars.h \ watchdog.cpp \ watchdog.h libtest_agent_la_LDFLAGS = -module -version-info @HPI_LIB_VERSION@ libtest_agent_la_LIBADD = @GMODULE_ONLY_LIBS@ openhpi-3.6.1/plugins/test_agent/log.h0000644000175100017510000000533312575647277016755 0ustar mohanmohan/* -*- c++ -*- * * (C) Copyright Pigeon Point Systems. 2012 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTLOGLITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #ifndef LOG_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 #define LOG_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 #include #include #include #include "object.h" namespace TA { /************************************************************** * class cLog *************************************************************/ class cLog : public cObject { public: static const std::string classname; struct Entry { SaHpiEventLogEntryT entry; SaHpiRdrT rdr; SaHpiRptEntryT rpte; }; explicit cLog(); virtual ~cLog(); static SaHpiCapabilitiesT RequiredResourceCap() { return SAHPI_CAPABILITY_EVENT_LOG; } void AddEntry( SaHpiEventTypeT type, const SaHpiEventUnionT& data, SaHpiSeverityT severity, const SaHpiRdrT * rdr, const SaHpiRptEntryT * rpte ); public: // HPI interface SaErrorT GetInfo( SaHpiEventLogInfoT& info ); SaErrorT GetCapabilities( SaHpiEventLogCapabilitiesT& caps ) const; SaErrorT SetTime( SaHpiTimeT t ); SaErrorT AddEntry( const SaHpiEventT& event ); SaErrorT GetEntry( SaHpiEventLogEntryIdT eid, SaHpiEventLogEntryIdT& prev_eid, SaHpiEventLogEntryIdT& next_eid, SaHpiEventLogEntryT& entry, SaHpiRdrT& rdr, SaHpiRptEntryT& rpte ); SaErrorT Clear(); SaErrorT SetState( SaHpiBoolT enable ); SaErrorT ResetOverflow(); protected: // cObject virtual functions virtual void GetVars( cVars& vars ); virtual void AfterVarSet( const std::string& var_name ); private: cLog( const cLog& ); cLog& operator =( const cLog& ); private: void Update(); void SyncInfo(); bool AddEntry( const SaHpiEventT& event, const SaHpiRdrT * rdr, const SaHpiRptEntryT * rpte ); private: // data SaHpiEventLogInfoT m_info; SaHpiEventLogCapabilitiesT m_caps; SaHpiTimeT m_delta; SaHpiEventLogEntryIdT m_next_eid; typedef std::list Entries; Entries m_entries; }; }; // namespace TA #endif // LOG_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 openhpi-3.6.1/plugins/test_agent/inventory.cpp0000644000175100017510000002251212575647277020562 0ustar mohanmohan/* -*- c++ -*- * * (C) Copyright Pigeon Point Systems. 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTINVENTORYLITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #include #include #include "area.h" #include "codec.h" #include "inventory.h" namespace TA { /************************************************************** * Helper functions *************************************************************/ static SaHpiRdrTypeUnionT MakeDefaultInvRec( SaHpiIdrIdT num ) { SaHpiRdrTypeUnionT data; SaHpiInventoryRecT& rec = data.InventoryRec; rec.IdrId = num; rec.Persistent = SAHPI_FALSE; rec.Oem = 0; return data; } /************************************************************** * Functors for working with areas *************************************************************/ struct AreaDeleter { void operator ()( cArea * area ) { delete area; } }; struct AreaIdPred { explicit AreaIdPred( SaHpiEntryIdT _id ) : id( _id ) { // empty } bool operator ()( const cArea * area ) const { return ( id == SAHPI_FIRST_ENTRY ) || ( id == area->GetId() ); } SaHpiEntryIdT id; }; struct AreaIdTypePred { explicit AreaIdTypePred( SaHpiEntryIdT _id, SaHpiIdrAreaTypeT _type ) : id( _id ), type( _type ) { // empty } bool operator ()( const cArea * area ) const { if ( type == area->GetType() ) { return ( id == SAHPI_FIRST_ENTRY ) || ( id == area->GetId() ); } else { return false; } } SaHpiEntryIdT id; SaHpiIdrAreaTypeT type; }; struct ObjectCollector { explicit ObjectCollector( cObject::Children& _children ) : children( _children ) { // empty } void operator ()( cArea * area ) { children.push_back( area ); } cObject::Children& children; }; struct AreaMaxId { explicit AreaMaxId() : value( 0 ) { // empty } void operator ()( const cArea * area ) { value = std::max( value, area->GetId() ); } SaHpiEntryIdT value; }; /************************************************************** * class cInventory *************************************************************/ const std::string cInventory::classname = "inv"; cInventory::cInventory( cHandler& handler, cResource& resource, SaHpiIdrIdT num ) : cInstrument( handler, resource, AssembleNumberedObjectName( classname, num ), SAHPI_INVENTORY_RDR, MakeDefaultInvRec( num ) ), m_rec( GetRdr().RdrTypeUnion.InventoryRec ), m_readonly( SAHPI_FALSE ), m_update_count( 0 ) { // empty } cInventory::~cInventory() { AreaDeleter deleter; std::for_each( m_areas.begin(), m_areas.end(), deleter ); m_areas.clear(); } cArea * cInventory::GetArea( SaHpiEntryIdT aid ) const { Areas::const_iterator i; i = std::find_if( m_areas.begin(), m_areas.end(), AreaIdPred( aid ) ); if ( i == m_areas.end() ) { return 0; } return *i; } // HPI Interface SaErrorT cInventory::GetInfo( SaHpiIdrInfoT& info ) const { info.IdrId = m_rec.IdrId; info.UpdateCount = m_update_count; info.ReadOnly = m_readonly; info.NumAreas = m_areas.size(); return SA_OK; } SaErrorT cInventory::GetArea( SaHpiIdrAreaTypeT atype, SaHpiEntryIdT aid, SaHpiEntryIdT& next_aid, SaHpiIdrAreaHeaderT& hdr ) const { if ( aid == SAHPI_LAST_ENTRY ) { return SA_ERR_HPI_INVALID_PARAMS; } next_aid = SAHPI_LAST_ENTRY; Areas::const_iterator i, j; if ( atype == SAHPI_IDR_AREATYPE_UNSPECIFIED ) { i = std::find_if( m_areas.begin(), m_areas.end(), AreaIdPred( aid ) ); if ( i == m_areas.end() ) { return SA_ERR_HPI_NOT_PRESENT; } (*i)->GetHeader( hdr ); ++i; if ( i != m_areas.end() ) { next_aid = (*i)->GetId(); } } else { i = std::find_if( m_areas.begin(), m_areas.end(), AreaIdTypePred( aid, atype ) ); if ( i == m_areas.end() ) { return SA_ERR_HPI_NOT_PRESENT; } (*i)->GetHeader( hdr ); ++i; if ( i != m_areas.end() ) { j = std::find_if( i, m_areas.end(), AreaIdTypePred( SAHPI_FIRST_ENTRY, atype ) ); if ( j != m_areas.end() ) { next_aid = (*j)->GetId(); } } } return SA_OK; } SaErrorT cInventory::AddArea( SaHpiIdrAreaTypeT atype, SaHpiEntryIdT& aid ) { if ( m_readonly != SAHPI_FALSE ) { return SA_ERR_HPI_READ_ONLY; } if ( atype == SAHPI_IDR_AREATYPE_UNSPECIFIED ) { return SA_ERR_HPI_INVALID_DATA; } AreaMaxId max_id = std::for_each( m_areas.begin(), m_areas.end(), AreaMaxId() ); aid = max_id.value + 1; m_areas.push_back( new cArea( m_update_count, aid, atype ) ); ++m_update_count; return SA_OK; } SaErrorT cInventory::AddAreaById( SaHpiEntryIdT aid, SaHpiIdrAreaTypeT atype ) { if ( m_readonly != SAHPI_FALSE ) { return SA_ERR_HPI_READ_ONLY; } if ( atype == SAHPI_IDR_AREATYPE_UNSPECIFIED ) { return SA_ERR_HPI_INVALID_DATA; } if ( aid == SAHPI_LAST_ENTRY ) { return SA_ERR_HPI_INVALID_PARAMS; } cArea * area; if ( aid == SAHPI_FIRST_ENTRY ) { AreaMaxId max_id = std::for_each( m_areas.begin(), m_areas.end(), AreaMaxId() ); SaHpiEntryIdT new_aid = max_id.value + 1; area = new cArea( m_update_count, new_aid, atype ); m_areas.push_front( area ); } else { if ( GetArea( aid ) ) { return SA_ERR_HPI_DUPLICATE; } area = new cArea( m_update_count, aid, atype ); m_areas.push_back( area ); } ++m_update_count; return SA_OK; } SaErrorT cInventory::DeleteAreaById( SaHpiEntryIdT aid ) { if ( m_readonly != SAHPI_FALSE ) { return SA_ERR_HPI_READ_ONLY; } if ( aid == SAHPI_LAST_ENTRY ) { return SA_ERR_HPI_INVALID_PARAMS; } cArea * area = GetArea( aid ); if ( !area ) { return SA_ERR_HPI_NOT_PRESENT; } if ( !area->CanBeDeleted() ) { return SA_ERR_HPI_READ_ONLY; } // NB: if we pass aid to AreaIdPred // and aid is SAHPI_FIRST_ENTRY // then all areas will be deleted. m_areas.remove_if( AreaIdPred( area->GetId() ) ); delete area; ++m_update_count; return SA_OK; } void cInventory::GetNewNames( cObject::NewNames& names ) const { cObject::GetNewNames( names ); names.push_back( cArea::classname + "-XXX" ); } bool cInventory::CreateChild( const std::string& name ) { bool rc; rc = cObject::CreateChild( name ); if ( rc ) { return true; } std::string cname; SaHpiUint32T id; rc = DisassembleNumberedObjectName( name, cname, id ); if ( !rc ) { return false; } if ( id == SAHPI_FIRST_ENTRY ) { return false; } if ( id == SAHPI_LAST_ENTRY ) { return false; } if ( cname == cArea::classname ) { if ( !GetArea( id ) ) { m_areas.push_back( new cArea( m_update_count, id ) ); ++m_update_count; return true; } } return false; } bool cInventory::RemoveChild( const std::string& name ) { bool rc; rc = cObject::RemoveChild( name ); if ( rc ) { return true; } std::string cname; SaHpiUint32T id; rc = DisassembleNumberedObjectName( name, cname, id ); if ( !rc ) { return false; } if ( id == SAHPI_FIRST_ENTRY ) { return false; } if ( id == SAHPI_LAST_ENTRY ) { return false; } if ( cname == cArea::classname ) { cArea * area = GetArea( id ); if ( area ) { // NB: if we pass id to AreaIdPred // and id is SAHPI_FIRST_ENTRY // then all areas will be deleted. m_areas.remove_if( AreaIdPred( id ) ); delete area; ++m_update_count; return true; } } return false; } void cInventory::GetChildren( Children& children ) const { cObject::GetChildren( children ); ObjectCollector collector( children ); std::for_each( m_areas.begin(), m_areas.end(), collector ); } void cInventory::GetVars( cVars& vars ) { cInstrument::GetVars( vars ); vars << "ReadOnly" << dtSaHpiBoolT << DATA( m_readonly ) << VAR_END(); } void cInventory::AfterVarSet( const std::string& var_name ) { cInstrument::AfterVarSet( var_name ); ++m_update_count; } }; // namespace TA openhpi-3.6.1/plugins/test_agent/sensor.h0000644000175100017510000000601612575647277017504 0ustar mohanmohan/* -*- c++ -*- * * (C) Copyright Pigeon Point Systems. 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTSENSORLITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #ifndef SENSOR_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 #define SENSOR_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 #include #include #include "instrument.h" namespace TA { /************************************************************** * class cSensor *************************************************************/ class cSensor : public cInstrument { public: static const std::string classname; explicit cSensor( cHandler& handler, cResource& resource, SaHpiSensorNumT num ); virtual ~cSensor(); public: // HPI interface SaErrorT GetReading( SaHpiSensorReadingT& r, SaHpiEventStateT& s ) const; SaErrorT GetThresholds( SaHpiSensorThresholdsT& ths ) const; SaErrorT SetThresholds( const SaHpiSensorThresholdsT& ths ); SaErrorT GetEnable( SaHpiBoolT& e ) const; SaErrorT SetEnable( SaHpiBoolT e ); SaErrorT GetEventEnable( SaHpiBoolT& e ) const; SaErrorT SetEventEnable( SaHpiBoolT e ); SaErrorT GetMasks( SaHpiEventStateT& amask, SaHpiEventStateT& dmask ) const; SaErrorT SetMasks( SaHpiSensorEventMaskActionT act, SaHpiEventStateT amask, SaHpiEventStateT dmask ); protected: // cObject virtual functions virtual void GetVars( cVars& vars ); virtual void BeforeVarSet( const std::string& var_name ); virtual void AfterVarSet( const std::string& var_name ); private: cSensor( const cSensor& ); cSensor& operator =( const cSensor& ); private: // Handling RDR changes virtual void UpdateRdr( const std::string& field_name, SaHpiRdrTypeUnionT& data ); private: virtual SaHpiCapabilitiesT RequiredResourceCap() const { return SAHPI_CAPABILITY_SENSOR; } void PostEnableChangeEvent() const; void PostEvent( bool assertion, SaHpiEventStateT state ) const; SaHpiEventStateT CalculateThresholdEventStates() const; void CommitChanges(); private: // data const SaHpiSensorRecT& m_rec; SaHpiBoolT m_enabled; SaHpiBoolT m_new_enabled; SaHpiBoolT m_event_enabled; SaHpiBoolT m_new_event_enabled; SaHpiSensorReadingT m_reading; SaHpiEventStateT m_prev_states; SaHpiEventStateT m_states; SaHpiEventStateT m_new_states; SaHpiEventStateT m_amask; SaHpiEventStateT m_new_amask; SaHpiEventStateT m_dmask; SaHpiEventStateT m_new_dmask; SaHpiSensorThresholdsT m_ths; }; }; // namespace TA #endif // SENSOR_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 openhpi-3.6.1/plugins/test_agent/resource.h0000644000175100017510000001111512575647277020016 0ustar mohanmohan/* -*- c++ -*- * * (C) Copyright Pigeon Point Systems. 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTRESOURCELITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #ifndef RESOURCE_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 #define RESOURCE_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 #include #include #include "instruments.h" #include "object.h" #include "timers.h" namespace TA { /************************************************************** * class cResource *************************************************************/ class cHandler; class cLog; class cResource : public cObject, public cInstruments, private cTimerCallback { public: explicit cResource( cHandler& handler, const SaHpiEntityPathT& ep ); virtual ~cResource(); public: const SaHpiRptEntryT& GetRptEntry() const; SaHpiResourceIdT GetResourceId() const; const SaHpiEntityPathT& GetEntityPath() const; bool IsFailed() const; void UpdateCaps( SaHpiCapabilitiesT caps ); cLog * GetLog() const; public: // HPI interface SaErrorT SetTag( const SaHpiTextBufferT& tag ); SaErrorT SetSeverity( SaHpiSeverityT sev ); SaErrorT CancelHsPolicy( const SaHpiTimeoutT& timeout ); SaErrorT GetAutoExtractTimeout( SaHpiTimeoutT& timeout ) const; SaErrorT SetAutoExtractTimeout( const SaHpiTimeoutT& timeout ); SaErrorT GetHsState( SaHpiHsStateT& state ) const; SaErrorT SetHsState( SaHpiHsStateT state ); SaErrorT RequestHsAction( SaHpiHsActionT action ); SaErrorT GetHsIndicatorState( SaHpiHsIndicatorStateT& state ) const; SaErrorT SetHsIndicatorState( const SaHpiHsIndicatorStateT& state ); SaErrorT GetPowerState( SaHpiPowerStateT& state ); SaErrorT SetPowerState( const SaHpiPowerStateT& state ); SaErrorT ControlParm( SaHpiParmActionT action ); SaErrorT GetLoadId( SaHpiLoadIdT& load_id ) const; SaErrorT SetLoadId( const SaHpiLoadIdT& load_id ); SaErrorT GetResetState( SaHpiResetActionT& action ) const; SaErrorT SetResetState( const SaHpiResetActionT& action ); public: // Event generation void PostEvent( SaHpiEventTypeT type, const SaHpiEventUnionT& data, SaHpiSeverityT severity, const InstrumentList& updates = InstrumentList(), const InstrumentList& removals = InstrumentList() ) const; private: cResource( const cResource& ); cResource& operator =( const cResource& ); private: // Event Generation void PostResourceEvent( SaHpiResourceEventTypeT type ) const; void PostHsEvent( SaHpiHsStateT current, SaHpiHsStateT prev ) const; private: // cObject virtual functions virtual void BeforeVisibilityChange(); virtual void AfterVisibilityChange(); virtual void GetNewNames( cObject::NewNames& names ) const; virtual bool CreateChild( const std::string& name ); virtual bool RemoveChild( const std::string& name ); virtual void GetChildren( cObject::Children& children ) const; virtual void GetVars( cVars& vars ); virtual void BeforeVarSet( const std::string& var_name ); virtual void AfterVarSet( const std::string& var_name ); private: // cTimerCallback virtual functions void CreateLog(); void RemoveLog(); virtual void TimerEvent(); private: void GetTimeouts( SaHpiTimeoutT& ai_timeout, SaHpiTimeoutT& ae_timeout ) const; void CommitChanges(); private: // data cHandler& m_handler; cLog * m_log; SaHpiRptEntryT m_rpte; SaHpiBoolT m_failed; SaHpiBoolT m_new_failed; SaHpiTimeoutT m_ae_timeout; SaHpiHsStateT m_prev_hs_state; SaHpiHsStateT m_hs_state; SaHpiHsStateT m_new_hs_state; SaHpiHsIndicatorStateT m_hs_ind_state; SaHpiLoadIdT m_load_id; SaHpiResetActionT m_rst_state; SaHpiPowerStateT m_pwr_state; // If Power State is set to POWER_CYCLE then for PwrCycleDuration times // saHpiResourcePowerStateGet() call will report ON (or OFF) // and after that it will report OFF (or ON). static const int PwrCycleDuration = 3; int m_pwr_cycle_cnt; }; }; // namespace TA #endif // RESOURCE_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 openhpi-3.6.1/plugins/test_agent/Makefile.mingw320000644000175100017510000000211712575647277020745 0ustar mohanmohaninclude ../../Makefile.mingw32.def TARGET := libtest_agent.dll SRC := abi.cpp \ announcement.cpp \ annunciator.cpp \ area.cpp \ bank.cpp \ codec.cpp \ console.cpp \ control.cpp \ dimi.cpp \ fumi.cpp \ field.cpp \ handler.cpp \ instrument.cpp \ instruments.cpp \ inventory.cpp \ log.cpp \ object.cpp \ resource.cpp \ sensor.cpp \ server.cpp \ structs.cpp \ test.cpp \ timers.cpp \ utils.cpp \ vars.cpp \ version.rc \ watchdog.cpp OBJ := $(patsubst %.rc, %.o, $(patsubst %.cpp, %.o, ${SRC})) DEFS := -DG_LOG_DOMAIN=\"test_agent\" -D__STDC_FORMAT_MACROS INCLUDES := ${GLIB_INCLUDES} -I ../../mingw32 -I ../../include -I ../../utils LIBS := ${GLIB_LIBS} ${GTHREAD_LIBS} -lws2_32 LIBS += -L ../../utils -lopenhpiutils CPPFLAGS += ${DEFS} ${INCLUDES} .PHONY: all clean .SUFFIXES: .rc all : ${TARGET} ${TARGET} : ${OBJ} ${CXX} -shared -o $@ $^ ${LIBS} .rc.o: ${RC} ${RCFLAGS} $< $@ clean: rm -f ${OBJ} ${TARGET} openhpi-3.6.1/plugins/test_agent/dimi.h0000644000175100017510000000405412575647277017115 0ustar mohanmohan/* -*- c++ -*- * * (C) Copyright Pigeon Point Systems. 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTDIMILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #ifndef DIMI_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 #define DIMI_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 #include #include #include #include "instrument.h" namespace TA { /************************************************************** * class cDimi *************************************************************/ class cTest; class cDimi : public cInstrument { public: static const std::string classname; explicit cDimi( cHandler& handler, cResource& resource, SaHpiDimiNumT num ); virtual ~cDimi(); public: cTest * GetTest( SaHpiDimiTestNumT tnum ) const; void PostEvent( SaHpiDimiTestNumT tnum, SaHpiDimiTestRunStatusT status, SaHpiDimiTestPercentCompletedT progress ); public: // HPI interface SaErrorT GetInfo( SaHpiDimiInfoT& info ) const; protected: // cObject virtual functions virtual void GetNB( std::string& nb ) const; virtual void GetNewNames( cObject::NewNames& names ) const; virtual bool CreateChild( const std::string& name ); virtual bool RemoveChild( const std::string& name ); virtual void GetChildren( cObject::Children& children ) const; private: cDimi( const cDimi& ); cDimi& operator =( const cDimi& ); private: virtual SaHpiCapabilitiesT RequiredResourceCap() const { return SAHPI_CAPABILITY_DIMI; } void Update(); private: // data const SaHpiDimiRecT& m_rec; std::vector m_tests; SaHpiUint32T m_update_count; }; }; // namespace TA #endif // DIMI_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 openhpi-3.6.1/plugins/test_agent/annunciator.h0000644000175100017510000000511112575647277020507 0ustar mohanmohan/* -*- c++ -*- * * (C) Copyright Pigeon Point Systems. 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTANNUNCIATORLITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #ifndef ANNUNCIATOR_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 #define ANNUNCIATOR_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 #include #include #include "instrument.h" namespace TA { /************************************************************** * class cAnnunciator *************************************************************/ class cAnnouncement; class cAnnunciator : public cInstrument { public: static const std::string classname; explicit cAnnunciator( cHandler& handler, cResource& resource, SaHpiAnnunciatorNumT num ); virtual ~cAnnunciator(); public: cAnnouncement * GetAnnouncement( SaHpiEntryIdT aid ) const; public: // HPI interface SaErrorT GetAnnouncement( SaHpiEntryIdT aid, SaHpiAnnouncementT& a ) const; SaErrorT GetNextAnnouncement( SaHpiSeverityT sev, SaHpiBoolT only_unack, SaHpiAnnouncementT& a ) const; SaErrorT AckAnnouncement( SaHpiEntryIdT aid, SaHpiSeverityT sev ); SaErrorT AddAnnouncement( SaHpiAnnouncementT& a ); SaErrorT DeleteAnnouncement( SaHpiEntryIdT aid, SaHpiSeverityT sev ); SaErrorT GetMode( SaHpiAnnunciatorModeT& mode ) const; SaErrorT SetMode( SaHpiAnnunciatorModeT mode ); protected: // cObject virtual functions virtual void GetNewNames( cObject::NewNames& names ) const; virtual bool CreateChild( const std::string& name ); virtual bool RemoveChild( const std::string& name ); virtual void GetChildren( cObject::Children& children ) const; virtual void GetVars( cVars& vars ); private: cAnnunciator( const cAnnunciator& ); cAnnunciator& operator =( const cAnnunciator& ); private: virtual SaHpiCapabilitiesT RequiredResourceCap() const { return SAHPI_CAPABILITY_ANNUNCIATOR; } private: // data const SaHpiAnnunciatorRecT& m_rec; SaHpiAnnunciatorModeT m_mode; typedef std::list Announcements; Announcements m_as; }; }; // namespace TA #endif // ANNUNCIATOR_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 openhpi-3.6.1/plugins/test_agent/handler.cpp0000644000175100017510000001316512575647277020146 0ustar mohanmohan/* -*- c++ -*- * * (C) Copyright Pigeon Point Systems. 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #include #include #include #include #include #include "codec.h" #include "handler.h" #include "resource.h" #include "timers.h" #include "vars.h" namespace TA { /************************************************************** * Helpers *************************************************************/ /************************************************************** * class cHandler *************************************************************/ cHandler::cHandler( unsigned int id, unsigned short port, oh_evt_queue& eventq ) : cObject( "root" ), cConsole( *this, port, *this ), m_id( id ), m_eventq( eventq ), m_ai_timeout( SAHPI_TIMEOUT_IMMEDIATE ) { g_static_mutex_init( &m_lock ); } cHandler::~cHandler() { Resources::const_iterator iter = m_resources.begin(); Resources::const_iterator end = m_resources.end(); for ( ; iter != end; ++iter ) { cResource * r = iter->second; delete r; } m_resources.clear(); g_static_mutex_free( &m_lock ); } bool cHandler::Init() { bool rc; rc = cConsole::Init(); if ( !rc ) { CRIT( "cannot initialize console" ); return false; } rc = cTimers::Start(); if ( !rc ) { CRIT( "cannot start timers" ); return false; } return true; } void cHandler::Lock() { g_static_mutex_lock( &m_lock ); } void cHandler::Unlock() { g_static_mutex_unlock( &m_lock ); } cResource * cHandler::GetResource( SaHpiResourceIdT rid ) const { Resources::const_iterator iter = m_resources.find( rid ); if ( iter != m_resources.end() ) { cResource * r = iter->second; return r; } return 0; } SaErrorT cHandler::RemoveFailedResource( SaHpiResourceIdT rid ) { cResource * r = GetResource( rid ); if ( !r ) { return SA_ERR_HPI_NOT_PRESENT; } if ( !r->IsFailed() ) { return SA_ERR_HPI_INVALID_REQUEST; } m_resources.erase( rid ); delete r; return SA_OK; } SaHpiTimeoutT cHandler::GetAutoInsertTimeout() const { return m_ai_timeout; } SaErrorT cHandler::SetAutoInsertTimeout( SaHpiTimeoutT t ) { m_ai_timeout = t; return SA_OK; } void cHandler::PostEvent( SaHpiEventTypeT type, const SaHpiEventUnionT& data, SaHpiSeverityT severity, const cResource * r, const InstrumentList& updates, const InstrumentList& removals ) const { if ( !IsVisible() ) { return; } struct oh_event * e = oh_new_event(); e->hid = m_id; e->event.Source = r ? r->GetResourceId() : SAHPI_UNSPECIFIED_RESOURCE_ID; e->event.EventType = type; oh_gettimeofday( &e->event.Timestamp ); e->event.Severity = severity; e->event.EventDataUnion = data; e->resource.ResourceId = SAHPI_UNSPECIFIED_RESOURCE_ID; e->resource.ResourceCapabilities = 0; if ( r ) { e->resource = r->GetRptEntry(); } InstrumentList::const_iterator i, end; for ( i = updates.begin(), end = updates.end(); i != end; ++i ) { const SaHpiRdrT& rdr = (*i)->GetRdr(); void * copy = g_memdup( &rdr, sizeof(rdr) ); e->rdrs = g_slist_append( e->rdrs, copy ); } for ( i = removals.begin(), end = removals.end(); i != end; ++i ) { const SaHpiRdrT& rdr = (*i)->GetRdr(); void * copy = g_memdup( &rdr, sizeof(rdr) ); e->rdrs_to_remove = g_slist_append( e->rdrs_to_remove, copy ); } oh_evt_queue_push( &m_eventq, e ); } void cHandler::GetNewNames( cObject::NewNames& names ) const { cObject::GetNewNames( names ); names.push_back( "Any Valid Entity Path" ); } bool cHandler::CreateChild( const std::string& name ) { bool rc; rc = cObject::CreateChild( name ); if ( rc ) { return true; } SaHpiEntityPathT ep; rc = DisassembleResourceObjectName( name, ep ); if ( !rc ) { return false; } cResource * r = new cResource( *this, ep ); m_resources[r->GetResourceId()] = r; return true; } bool cHandler::RemoveChild( const std::string& name ) { bool rc; rc = cObject::RemoveChild( name ); if ( rc ) { return true; } cObject * obj = cObject::GetChild( name ); if ( !obj ) { return false; } cResource * r = static_cast(obj); size_t n = m_resources.erase( r->GetResourceId() ); if ( n == 0 ) { return false; } delete r; return true; } void cHandler::GetChildren( Children& children ) const { cObject::GetChildren( children ); Resources::const_iterator iter = m_resources.begin(); Resources::const_iterator end = m_resources.end(); for ( ; iter != end; ++iter ) { cResource * r = iter->second; children.push_back( r ); } } void cHandler::GetVars( cVars& vars ) { cObject::GetVars( vars ); vars << "AutoInsertTimeout" << dtSaHpiTimeoutT << DATA( m_ai_timeout ) << VAR_END(); } }; // namespace TA openhpi-3.6.1/plugins/test_agent/instrument.h0000644000175100017510000000505012575647277020400 0ustar mohanmohan/* -*- c++ -*- * * (C) Copyright Pigeon Point Systems. 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTINSTRUMENTLITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #ifndef INSTRUMENT_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 #define INSTRUMENT_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 #include #include #include "object.h" namespace TA { /************************************************************** * class cInstrument *************************************************************/ class cHandler; class cResource; class cTimers; class cInstrument : public cObject { public: explicit cInstrument( cHandler& handler, cResource& resource, const std::string& name, SaHpiRdrTypeT type, const SaHpiRdrTypeUnionT& data ); virtual ~cInstrument(); public: const SaHpiRdrT& GetRdr() const; protected: // cObject virtual functions virtual void BeforeVisibilityChange(); virtual void AfterVisibilityChange(); virtual void GetVars( cVars& vars ); virtual void AfterVarSet( const std::string& var_name ); protected: // Event generation void PostEvent( SaHpiEventTypeT type, const SaHpiEventUnionT& data, SaHpiSeverityT severity, bool remove = false ) const; protected: // Handling RDR changes void HandleRdrChange( const std::string& field_name ); virtual void UpdateRdr( const std::string& field_name, SaHpiRdrTypeUnionT& data ); private: cInstrument( const cInstrument& ); cInstrument& operator =( const cInstrument& ); private: // Event generation void PostUpdateEvent( bool remove = false ) const; virtual SaHpiCapabilitiesT RequiredResourceCap() const = 0; protected: // data cHandler& m_handler; cResource& m_resource; private: // data SaHpiRdrT m_rdr; }; /************************************************************** * List of instruments for event generation *************************************************************/ typedef std::list InstrumentList; }; // namespace TA #endif // INSTRUMENT_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 openhpi-3.6.1/plugins/test_agent/control.h0000644000175100017510000000440512575647277017653 0ustar mohanmohan/* -*- c++ -*- * * (C) Copyright Pigeon Point Systems. 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTCONTROLLITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #ifndef CONTROL_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 #define CONTROL_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 #include #include #include #include "instrument.h" namespace TA { /************************************************************** * class cControl *************************************************************/ class cControl : public cInstrument { public: static const std::string classname; explicit cControl( cHandler& handler, cResource& resource, SaHpiCtrlNumT num ); virtual ~cControl(); public: // HPI interface SaErrorT Get( SaHpiCtrlModeT& mode, SaHpiCtrlStateT& state ) const; SaErrorT Set( SaHpiCtrlModeT mode, const SaHpiCtrlStateT& state ); protected: // cObject virtual functions virtual void GetVars( cVars& vars ); virtual void AfterVarSet( const std::string& var_name ); private: cControl( const cControl& ); cControl& operator =( const cControl& ); private: // Handling RDR changes virtual void UpdateRdr( const std::string& field_name, SaHpiRdrTypeUnionT& data ); private: virtual SaHpiCapabilitiesT RequiredResourceCap() const { return SAHPI_CAPABILITY_CONTROL; } SaErrorT CheckStateDigital( const SaHpiCtrlStateDigitalT& ds ) const; SaErrorT CheckStateAnalog( const SaHpiCtrlStateAnalogT& as ) const; SaErrorT CheckStateStream( const SaHpiCtrlStateStreamT& ss ) const; SaErrorT CheckStateText( const SaHpiCtrlStateTextT& ts ) const; void NormalizeLines(); private: // data const SaHpiCtrlRecT& m_rec; SaHpiCtrlModeT m_mode; SaHpiCtrlStateT m_state; std::vector m_lines; }; }; // namespace TA #endif // CONTROL_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 openhpi-3.6.1/plugins/test_agent/abi.h0000644000175100017510000003156412575647277016734 0ustar mohanmohan/* -*- c++ -*- * * (C) Copyright Pigeon Point Systems. 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #ifndef ABI_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 #define ABI_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 #include extern "C" { /************************************************************** * Test_agent plugin interface *************************************************************/ void * oh_open( GHashTable * handler_config, unsigned int hid, oh_evt_queue * eventq ); void oh_close( void * hnd ); SaErrorT oh_discover_resources( void * hnd ); SaErrorT oh_set_resource_tag( void * hnd, SaHpiResourceIdT rid, SaHpiTextBufferT * tag ); SaErrorT oh_set_resource_severity( void * hnd, SaHpiResourceIdT rid, SaHpiSeverityT sev ); SaErrorT oh_resource_failed_remove( void * hnd, SaHpiResourceIdT rid ); SaErrorT oh_get_el_info( void * hnd, SaHpiResourceIdT rid, SaHpiEventLogInfoT * info ); SaErrorT oh_get_el_caps( void * hnd, SaHpiResourceIdT rid, SaHpiEventLogCapabilitiesT * caps ); SaErrorT oh_set_el_time( void * hnd, SaHpiResourceIdT rid, SaHpiTimeT time ); SaErrorT oh_add_el_entry( void * hnd, SaHpiResourceIdT rid, const SaHpiEventT * event ); SaErrorT oh_get_el_entry( void * hnd, SaHpiResourceIdT rid, SaHpiEventLogEntryIdT current, SaHpiEventLogEntryIdT * prev, SaHpiEventLogEntryIdT * next, SaHpiEventLogEntryT * entry, SaHpiRdrT * rdr, SaHpiRptEntryT * rpte ); SaErrorT oh_clear_el( void * hnd, SaHpiResourceIdT rid ); SaErrorT oh_set_el_state( void * hnd, SaHpiResourceIdT rid, SaHpiBoolT e ); SaErrorT oh_reset_el_overflow( void * hnd, SaHpiResourceIdT rid ); SaErrorT oh_get_sensor_reading( void * hnd, SaHpiResourceIdT rid, SaHpiSensorNumT num, SaHpiSensorReadingT * reading, SaHpiEventStateT * state ); SaErrorT oh_get_sensor_thresholds( void * hnd, SaHpiResourceIdT rid, SaHpiSensorNumT num, SaHpiSensorThresholdsT * thres ); SaErrorT oh_set_sensor_thresholds( void * hnd, SaHpiResourceIdT rid, SaHpiSensorNumT num, const SaHpiSensorThresholdsT * thres ); SaErrorT oh_get_sensor_enable( void * hnd, SaHpiResourceIdT rid, SaHpiSensorNumT num, SaHpiBoolT * enable ); SaErrorT oh_set_sensor_enable( void * hnd, SaHpiResourceIdT rid, SaHpiSensorNumT num, SaHpiBoolT enable ); SaErrorT oh_get_sensor_event_enables( void * hnd, SaHpiResourceIdT rid, SaHpiSensorNumT num, SaHpiBoolT * enables ); SaErrorT oh_set_sensor_event_enables( void * hnd, SaHpiResourceIdT rid, SaHpiSensorNumT num, const SaHpiBoolT enables ); SaErrorT oh_get_sensor_event_masks( void * hnd, SaHpiResourceIdT rid, SaHpiSensorNumT num, SaHpiEventStateT * AssertEventMask, SaHpiEventStateT * DeassertEventMask ); SaErrorT oh_set_sensor_event_masks( void * hnd, SaHpiResourceIdT rid, SaHpiSensorNumT num, SaHpiSensorEventMaskActionT act, SaHpiEventStateT AssertEventMask, SaHpiEventStateT DeassertEventMask ); SaErrorT oh_get_control_state( void * hnd, SaHpiResourceIdT rid, SaHpiCtrlNumT num, SaHpiCtrlModeT * mode, SaHpiCtrlStateT * state ); SaErrorT oh_set_control_state( void * hnd, SaHpiResourceIdT rid, SaHpiCtrlNumT num, SaHpiCtrlModeT mode, SaHpiCtrlStateT * state ); SaErrorT oh_get_idr_info( void * hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrInfoT * idrinfo ); SaErrorT oh_get_idr_area_header( void * hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrAreaTypeT areatype, SaHpiEntryIdT areaid, SaHpiEntryIdT * nextareaid, SaHpiIdrAreaHeaderT * header ); SaErrorT oh_add_idr_area( void * hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrAreaTypeT areatype, SaHpiEntryIdT * areaid ); SaErrorT oh_add_idr_area_id( void * hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrAreaTypeT areatype, SaHpiEntryIdT areaid ); SaErrorT oh_del_idr_area( void * hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiEntryIdT areaid ); SaErrorT oh_get_idr_field( void * hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiEntryIdT areaid, SaHpiIdrFieldTypeT fieldtype, SaHpiEntryIdT fieldid, SaHpiEntryIdT * nextfieldid, SaHpiIdrFieldT * field ); SaErrorT oh_add_idr_field( void * hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrFieldT * field ); SaErrorT oh_add_idr_field_id( void * hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrFieldT * field ); SaErrorT oh_set_idr_field( void * hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrFieldT * field ); SaErrorT oh_del_idr_field( void * hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiEntryIdT areaid, SaHpiEntryIdT fieldid ); SaErrorT oh_get_watchdog_info( void * hnd, SaHpiResourceIdT rid, SaHpiWatchdogNumT num, SaHpiWatchdogT * wdt ); SaErrorT oh_set_watchdog_info( void * hnd, SaHpiResourceIdT rid, SaHpiWatchdogNumT num, SaHpiWatchdogT * wdt ); SaErrorT oh_reset_watchdog( void * hnd, SaHpiResourceIdT rid, SaHpiWatchdogNumT num ); SaErrorT oh_get_next_announce( void * hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT num, SaHpiSeverityT sev, SaHpiBoolT ack, SaHpiAnnouncementT * a ); SaErrorT oh_get_announce( void * hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT num, SaHpiEntryIdT aid, SaHpiAnnouncementT * a ); SaErrorT oh_ack_announce( void * hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT num, SaHpiEntryIdT aid, SaHpiSeverityT sev ); SaErrorT oh_add_announce( void * hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT num, SaHpiAnnouncementT * a ); SaErrorT oh_del_announce( void * hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT num, SaHpiEntryIdT aid, SaHpiSeverityT sev ); SaErrorT oh_get_annunc_mode( void * hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT num, SaHpiAnnunciatorModeT * mode ); SaErrorT oh_set_annunc_mode( void * hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT num, SaHpiAnnunciatorModeT mode ); SaErrorT oh_get_dimi_info( void * hnd, SaHpiResourceIdT rid, SaHpiDimiNumT num, SaHpiDimiInfoT * info ); SaErrorT oh_get_dimi_test( void * hnd, SaHpiResourceIdT rid, SaHpiDimiNumT num, SaHpiDimiTestNumT testnum, SaHpiDimiTestT * test ); SaErrorT oh_get_dimi_test_ready( void * hnd, SaHpiResourceIdT rid, SaHpiDimiNumT num, SaHpiDimiTestNumT testnum, SaHpiDimiReadyT * ready ); SaErrorT oh_start_dimi_test( void * hnd, SaHpiResourceIdT rid, SaHpiDimiNumT num, SaHpiDimiTestNumT testnum, SaHpiUint8T numparams, SaHpiDimiTestVariableParamsT * paramslist ); SaErrorT oh_cancel_dimi_test( void * hnd, SaHpiResourceIdT rid, SaHpiDimiNumT num, SaHpiDimiTestNumT testnum ); SaErrorT oh_get_dimi_test_status( void * hnd, SaHpiResourceIdT rid, SaHpiDimiNumT num, SaHpiDimiTestNumT testnum, SaHpiDimiTestPercentCompletedT * percentcompleted, SaHpiDimiTestRunStatusT * runstatus ); SaErrorT oh_get_dimi_test_results( void * hnd, SaHpiResourceIdT rid, SaHpiDimiNumT num, SaHpiDimiTestNumT testnum, SaHpiDimiTestResultsT * testresults ); SaErrorT oh_get_fumi_spec( void * hnd, SaHpiResourceIdT rid, SaHpiFumiNumT num, SaHpiFumiSpecInfoT * specinfo ); SaErrorT oh_get_fumi_service_impact( void * hnd, SaHpiResourceIdT rid, SaHpiFumiNumT num, SaHpiFumiServiceImpactDataT * serviceimpact ); SaErrorT oh_set_fumi_source( void * hnd, SaHpiResourceIdT rid, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiTextBufferT * sourceuri ); SaErrorT oh_validate_fumi_source( void * hnd, SaHpiResourceIdT rid, SaHpiFumiNumT num, SaHpiBankNumT banknum ); SaErrorT oh_get_fumi_source( void * hnd, SaHpiResourceIdT rid, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiFumiSourceInfoT * sourceinfo ); SaErrorT oh_get_fumi_source_component( void * hnd, SaHpiResourceIdT rid, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiEntryIdT compid, SaHpiEntryIdT * nextcompid, SaHpiFumiComponentInfoT * compinfo ); SaErrorT oh_get_fumi_target( void * hnd, SaHpiResourceIdT rid, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiFumiBankInfoT * bankinfo ); SaErrorT oh_get_fumi_target_component( void * hnd, SaHpiResourceIdT rid, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiEntryIdT compid, SaHpiEntryIdT * nextcompid, SaHpiFumiComponentInfoT * compinfo ); SaErrorT oh_get_fumi_logical_target( void * hnd, SaHpiResourceIdT rid, SaHpiFumiNumT num, SaHpiFumiLogicalBankInfoT * bankinfo ); SaErrorT oh_get_fumi_logical_target_component( void * hnd, SaHpiResourceIdT rid, SaHpiFumiNumT num, SaHpiEntryIdT compid, SaHpiEntryIdT * nextcompid, SaHpiFumiLogicalComponentInfoT * compinfo ); SaErrorT oh_start_fumi_backup( void * hnd, SaHpiResourceIdT rid, SaHpiFumiNumT num ); SaErrorT oh_set_fumi_bank_order( void * hnd, SaHpiResourceIdT rid, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiUint32T position ); SaErrorT oh_start_fumi_bank_copy( void * hnd, SaHpiResourceIdT rid, SaHpiFumiNumT num, SaHpiBankNumT sourcebanknum, SaHpiBankNumT targetbanknum ); SaErrorT oh_start_fumi_install( void * hnd, SaHpiResourceIdT rid, SaHpiFumiNumT num, SaHpiBankNumT banknum ); SaErrorT oh_get_fumi_status( void * hnd, SaHpiResourceIdT rid, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiFumiUpgradeStatusT * status ); SaErrorT oh_start_fumi_verify( void * hnd, SaHpiResourceIdT rid, SaHpiFumiNumT num, SaHpiBankNumT banknum ); SaErrorT oh_start_fumi_verify_main( void * hnd, SaHpiResourceIdT rid, SaHpiFumiNumT num ); SaErrorT oh_cancel_fumi_upgrade( void * hnd, SaHpiResourceIdT rid, SaHpiFumiNumT num, SaHpiBankNumT banknum ); SaErrorT oh_get_fumi_autorollback_disable( void * hnd, SaHpiResourceIdT rid, SaHpiFumiNumT num, SaHpiBoolT * disable ); SaErrorT oh_set_fumi_autorollback_disable( void * hnd, SaHpiResourceIdT rid, SaHpiFumiNumT num, SaHpiBoolT disable ); SaErrorT oh_start_fumi_rollback( void * hnd, SaHpiResourceIdT rid, SaHpiFumiNumT num ); SaErrorT oh_activate_fumi( void * hnd, SaHpiResourceIdT rid, SaHpiFumiNumT num ); SaErrorT oh_start_fumi_activate( void * hnd, SaHpiResourceIdT rid, SaHpiFumiNumT num, SaHpiBoolT logical ); SaErrorT oh_cleanup_fumi( void * hnd, SaHpiResourceIdT rid, SaHpiFumiNumT num, SaHpiBankNumT banknum ); SaErrorT oh_hotswap_policy_cancel( void * hnd, SaHpiResourceIdT rid, SaHpiTimeoutT timeout ); SaErrorT oh_set_autoinsert_timeout( void * hnd, SaHpiTimeoutT timeout ); SaErrorT oh_get_autoextract_timeout( void * hnd, SaHpiResourceIdT rid, SaHpiTimeoutT * timeout ); SaErrorT oh_set_autoextract_timeout( void * hnd, SaHpiResourceIdT rid, SaHpiTimeoutT timeout ); SaErrorT oh_get_hotswap_state( void * hnd, SaHpiResourceIdT rid, SaHpiHsStateT * state ); SaErrorT oh_set_hotswap_state( void * hnd, SaHpiResourceIdT rid, SaHpiHsStateT state ); SaErrorT oh_request_hotswap_action( void * hnd, SaHpiResourceIdT rid, SaHpiHsActionT act ); SaErrorT oh_get_indicator_state( void * hnd, SaHpiResourceIdT rid, SaHpiHsIndicatorStateT * state ); SaErrorT oh_set_indicator_state( void * hnd, SaHpiResourceIdT rid, SaHpiHsIndicatorStateT state ); SaErrorT oh_get_power_state( void * hnd, SaHpiResourceIdT rid, SaHpiPowerStateT * state ); SaErrorT oh_set_power_state( void * hnd, SaHpiResourceIdT rid, SaHpiPowerStateT state ); SaErrorT oh_control_parm( void * hnd, SaHpiResourceIdT rid, SaHpiParmActionT act ); SaErrorT oh_load_id_get( void * hnd, SaHpiResourceIdT rid, SaHpiLoadIdT * load_id ); SaErrorT oh_load_id_set( void * hnd, SaHpiResourceIdT rid, SaHpiLoadIdT * load_id ); SaErrorT oh_get_reset_state( void * hnd, SaHpiResourceIdT rid, SaHpiResetActionT * act ); SaErrorT oh_set_reset_state( void * hnd, SaHpiResourceIdT rid, SaHpiResetActionT act ); }; // extern "C" #endif // ABI_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 openhpi-3.6.1/plugins/test_agent/instruments.cpp0000644000175100017510000002361412575647277021124 0ustar mohanmohan/* -*- c++ -*- * * (C) Copyright Pigeon Point Systems. 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTINSTRUMENTSLITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #include #include #include #include "annunciator.h" #include "codec.h" #include "control.h" #include "dimi.h" #include "fumi.h" #include "handler.h" #include "instruments.h" #include "inventory.h" #include "sensor.h" #include "watchdog.h" namespace TA { /************************************************************** * Helpers *************************************************************/ template struct Deleter { void operator ()( typename Map::value_type& v ) { delete v.second; } }; template struct InstrumentCollector { explicit InstrumentCollector( InstrumentList& _all ) : all( _all ) { // empty } void operator ()( const typename Map::value_type& v ) { all.push_back( v.second ); } InstrumentList& all; }; template struct ObjectCollector { explicit ObjectCollector( cObject::Children& _children ) : children( _children ) { // empty } void operator ()( const typename Map::value_type& v ) { children.push_back( v.second ); } cObject::Children& children; }; /************************************************************** * class cInstruments *************************************************************/ cInstruments::cInstruments( cHandler& handler, cResource& resource ) : m_handler( handler ), m_resource( resource ) { // empty } cInstruments::~cInstruments() { Deleter cdeleter; std::for_each( m_controls.begin(), m_controls.end(), cdeleter ); m_controls.clear(); Deleter sdeleter; std::for_each( m_sensors.begin(), m_sensors.end(), sdeleter ); m_sensors.clear(); Deleter ideleter; std::for_each( m_invs.begin(), m_invs.end(), ideleter ); m_invs.clear(); Deleter wdeleter; std::for_each( m_wdts.begin(), m_wdts.end(), wdeleter ); m_wdts.clear(); Deleter adeleter; std::for_each( m_anns.begin(), m_anns.end(), adeleter ); m_anns.clear(); Deleter ddeleter; std::for_each( m_dimis.begin(), m_dimis.end(), ddeleter ); m_dimis.clear(); Deleter fdeleter; std::for_each( m_fumis.begin(), m_fumis.end(), fdeleter ); m_fumis.clear(); } cControl * cInstruments::GetControl( SaHpiCtrlNumT num ) const { Controls::const_iterator iter = m_controls.find( num ); if ( iter != m_controls.end() ) { cControl * ctrl = iter->second; return ctrl; } return 0; } cSensor * cInstruments::GetSensor( SaHpiSensorNumT num ) const { Sensors::const_iterator iter = m_sensors.find( num ); if ( iter != m_sensors.end() ) { cSensor * sen = iter->second; return sen; } return 0; } cInventory * cInstruments::GetInventory( SaHpiIdrIdT num ) const { Inventories::const_iterator iter = m_invs.find( num ); if ( iter != m_invs.end() ) { cInventory * inv = iter->second; return inv; } return 0; } cWatchdog * cInstruments::GetWatchdog( SaHpiWatchdogNumT num ) const { Watchdogs::const_iterator iter = m_wdts.find( num ); if ( iter != m_wdts.end() ) { cWatchdog * wdt = iter->second; return wdt; } return 0; } cAnnunciator * cInstruments::GetAnnunciator( SaHpiAnnunciatorNumT num ) const { Annunciators::const_iterator iter = m_anns.find( num ); if ( iter != m_anns.end() ) { cAnnunciator * ann = iter->second; return ann; } return 0; } cDimi * cInstruments::GetDimi( SaHpiDimiNumT num ) const { Dimis::const_iterator iter = m_dimis.find( num ); if ( iter != m_dimis.end() ) { cDimi * dimi = iter->second; return dimi; } return 0; } cFumi * cInstruments::GetFumi( SaHpiFumiNumT num ) const { Fumis::const_iterator iter = m_fumis.find( num ); if ( iter != m_fumis.end() ) { cFumi * fumi = iter->second; return fumi; } return 0; } void cInstruments::GetAllInstruments( InstrumentList& all ) const { InstrumentCollector ccollector( all ); std::for_each( m_controls.begin(), m_controls.end(), ccollector ); InstrumentCollector scollector( all ); std::for_each( m_sensors.begin(), m_sensors.end(), scollector ); InstrumentCollector icollector( all ); std::for_each( m_invs.begin(), m_invs.end(), icollector ); InstrumentCollector wcollector( all ); std::for_each( m_wdts.begin(), m_wdts.end(), wcollector ); InstrumentCollector acollector( all ); std::for_each( m_anns.begin(), m_anns.end(), acollector ); InstrumentCollector dcollector( all ); std::for_each( m_dimis.begin(), m_dimis.end(), dcollector ); InstrumentCollector fcollector( all ); std::for_each( m_fumis.begin(), m_fumis.end(), fcollector ); } void cInstruments::GetNewNames( cObject::NewNames& names ) const { names.push_back( cControl::classname + "-XXX" ); names.push_back( cSensor::classname + "-XXX" ); names.push_back( cInventory::classname + "-XXX" ); names.push_back( cWatchdog::classname + "-XXX" ); names.push_back( cAnnunciator::classname + "-XXX" ); names.push_back( cDimi::classname + "-XXX" ); names.push_back( cFumi::classname + "-XXX" ); } void cInstruments::GetChildren( cObject::Children& children ) const { ObjectCollector ccollector( children ); std::for_each( m_controls.begin(), m_controls.end(), ccollector ); ObjectCollector scollector( children ); std::for_each( m_sensors.begin(), m_sensors.end(), scollector ); ObjectCollector icollector( children ); std::for_each( m_invs.begin(), m_invs.end(), icollector ); ObjectCollector wcollector( children ); std::for_each( m_wdts.begin(), m_wdts.end(), wcollector ); ObjectCollector acollector( children ); std::for_each( m_anns.begin(), m_anns.end(), acollector ); ObjectCollector dcollector( children ); std::for_each( m_dimis.begin(), m_dimis.end(), dcollector ); ObjectCollector fcollector( children ); std::for_each( m_fumis.begin(), m_fumis.end(), fcollector ); } bool cInstruments::CreateInstrument( const std::string& name ) { std::string cname; SaHpiUint32T num; bool rc = DisassembleNumberedObjectName( name, cname, num ); if ( !rc ) { return false; } if ( cname == cControl::classname ) { if ( !GetControl( num ) ) { m_controls[num] = new cControl( m_handler, m_resource, num ); return true; } } if ( cname == cSensor::classname ) { if ( !GetSensor( num ) ) { m_sensors[num] = new cSensor( m_handler, m_resource, num ); return true; } } if ( cname == cInventory::classname ) { if ( !GetInventory( num ) ) { m_invs[num] = new cInventory( m_handler, m_resource, num ); return true; } } if ( cname == cWatchdog::classname ) { if ( !GetWatchdog( num ) ) { m_wdts[num] = new cWatchdog( m_handler, m_resource, num ); return true; } } if ( cname == cAnnunciator::classname ) { if ( !GetAnnunciator( num ) ) { m_anns[num] = new cAnnunciator( m_handler, m_resource, num ); return true; } } if ( cname == cDimi::classname ) { if ( !GetDimi( num ) ) { m_dimis[num] = new cDimi( m_handler, m_resource, num ); return true; } } if ( cname == cFumi::classname ) { if ( !GetFumi( num ) ) { m_fumis[num] = new cFumi( m_handler, m_resource, num ); return true; } } return false; } bool cInstruments::RemoveInstrument( const std::string& name ) { std::string classname; SaHpiUint32T num; bool rc = DisassembleNumberedObjectName( name, classname, num ); if ( !rc ) { return false; } if ( classname == cControl::classname ) { cControl * ctrl = GetControl( num ); if ( ctrl ) { m_controls.erase( num ); delete ctrl; return true; } } if ( classname == cSensor::classname ) { cSensor * sen = GetSensor( num ); if ( sen ) { m_sensors.erase( num ); delete sen; return true; } } if ( classname == cInventory::classname ) { cInventory * inv = GetInventory( num ); if ( inv ) { m_invs.erase( num ); delete inv; return true; } } if ( classname == cWatchdog::classname ) { cWatchdog * wdt = GetWatchdog( num ); if ( wdt ) { m_wdts.erase( num ); delete wdt; return true; } } if ( classname == cAnnunciator::classname ) { cAnnunciator * ann = GetAnnunciator( num ); if ( ann ) { m_anns.erase( num ); delete ann; return true; } } if ( classname == cDimi::classname ) { cDimi * dimi = GetDimi( num ); if ( dimi ) { m_dimis.erase( num ); delete dimi; return true; } } if ( classname == cFumi::classname ) { cFumi * fumi = GetFumi( num ); if ( fumi ) { m_fumis.erase( num ); delete fumi; return true; } } return false; } }; // namespace TA openhpi-3.6.1/plugins/test_agent/log.cpp0000644000175100017510000002062512575647277017311 0ustar mohanmohan/* -*- c++ -*- * * (C) Copyright Pigeon Point Systems. 2012 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTWATCHDOGLITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #include #include #include #include "log.h" #include "structs.h" namespace TA { /************************************************************** * Helper functions *************************************************************/ static SaHpiEventLogInfoT MakeDefaultInfo() { SaHpiEventLogInfoT info; info.Entries = 0; info.Size = 100; info.UserEventMaxSize = 100; oh_gettimeofday( &info.UpdateTimestamp ); oh_gettimeofday( &info.CurrentTime ); info.Enabled = SAHPI_TRUE; info.OverflowFlag = SAHPI_FALSE; info.OverflowResetable = SAHPI_TRUE; info.OverflowAction = SAHPI_EL_OVERFLOW_OVERWRITE; return info; } static SaHpiEventLogCapabilitiesT MakeDefaultCaps() { return SAHPI_EVTLOG_CAPABILITY_ENTRY_ADD | SAHPI_EVTLOG_CAPABILITY_CLEAR | SAHPI_EVTLOG_CAPABILITY_TIME_SET | SAHPI_EVTLOG_CAPABILITY_STATE_SET | SAHPI_EVTLOG_CAPABILITY_OVERFLOW_RESET; } /************************************************************** * class cLog *************************************************************/ const std::string cLog::classname( "log" ); static const std::string size_name( "Info.Size" ); cLog::cLog() : cObject( classname ), m_info( MakeDefaultInfo() ), m_caps( MakeDefaultCaps() ), m_delta( 0LL ), m_next_eid( 1 ) { // empty } cLog::~cLog() { // empty } void cLog::AddEntry( SaHpiEventTypeT type, const SaHpiEventUnionT& data, SaHpiSeverityT severity, const SaHpiRdrT * rdr, const SaHpiRptEntryT * rpte ) { if ( m_info.Enabled == SAHPI_FALSE ) { return; } SaHpiEventT event; event.Source = ( rpte == 0 ) ? SAHPI_UNSPECIFIED_RESOURCE_ID : rpte->ResourceId; event.EventType = type; oh_gettimeofday( &event.Timestamp ); event.Severity = severity; event.EventDataUnion = data; AddEntry( event, rdr, rpte ); } // HPI interface SaErrorT cLog::GetInfo( SaHpiEventLogInfoT& info ) { SyncInfo(); info = m_info; return SA_OK; } SaErrorT cLog::GetCapabilities( SaHpiEventLogCapabilitiesT& caps ) const { caps = m_caps; return SA_OK; } SaErrorT cLog::SetTime( SaHpiTimeT t ) { if ( ( m_caps && SAHPI_EVTLOG_CAPABILITY_TIME_SET ) == 0 ) { return SA_ERR_HPI_INVALID_CMD; } if ( t == SAHPI_TIME_UNSPECIFIED ) { return SA_ERR_HPI_INVALID_PARAMS; } SaHpiTimeT current; oh_gettimeofday( ¤t ); m_delta = t - current; Update(); return SA_OK; } SaErrorT cLog::AddEntry( const SaHpiEventT& event ) { if ( ( m_caps && SAHPI_EVTLOG_CAPABILITY_ENTRY_ADD ) == 0 ) { return SA_ERR_HPI_INVALID_CMD; } if ( event.Source != SAHPI_UNSPECIFIED_RESOURCE_ID ) { return SA_ERR_HPI_INVALID_PARAMS; } if ( event.EventType != SAHPI_ET_USER ) { return SA_ERR_HPI_INVALID_PARAMS; } if ( event.EventDataUnion.UserEvent.UserEventData.DataLength > m_info.UserEventMaxSize ) { return SA_ERR_HPI_INVALID_DATA; } bool rc = AddEntry( event, 0, 0 ); if ( !rc ) { return SA_ERR_HPI_OUT_OF_SPACE; } return SA_OK; } SaErrorT cLog::GetEntry( SaHpiEventLogEntryIdT eid, SaHpiEventLogEntryIdT& prev_eid, SaHpiEventLogEntryIdT& next_eid, SaHpiEventLogEntryT& entry, SaHpiRdrT& rdr, SaHpiRptEntryT& rpte ) { if ( m_entries.empty() ) { return SA_ERR_HPI_NOT_PRESENT; } if ( eid == SAHPI_NO_MORE_ENTRIES ) { return SA_ERR_HPI_INVALID_PARAMS; } Entries::const_iterator iter; Entries::const_iterator begin = m_entries.begin(); Entries::const_iterator end = m_entries.end(); if ( eid == SAHPI_OLDEST_ENTRY ) { iter = begin; } else if ( eid == SAHPI_NEWEST_ENTRY ) { iter = end; Entries::const_iterator iter2; for ( iter2 = begin; iter2 != end; ++iter2 ) { iter = iter2; } } else { iter = end; Entries::const_iterator iter2; for ( iter2 = begin; iter2 != end; ++iter2 ) { if ( iter2->entry.EntryId == eid ) { iter = iter2; break; } } } if ( iter == end ) { return SA_ERR_HPI_NOT_PRESENT; } prev_eid = SAHPI_NO_MORE_ENTRIES; Entries::const_iterator prev_iter = iter; --prev_iter; if ( prev_iter != end ) { prev_eid = prev_iter->entry.EntryId; } next_eid = SAHPI_NO_MORE_ENTRIES; Entries::const_iterator next_iter = iter; ++next_iter; if ( next_iter != end ) { next_eid = next_iter->entry.EntryId; } entry = iter->entry; rdr = iter->rdr; rpte = iter->rpte; return SA_OK; } SaErrorT cLog::Clear() { if ( ( m_caps && SAHPI_EVTLOG_CAPABILITY_CLEAR ) == 0 ) { return SA_ERR_HPI_INVALID_CMD; } m_entries.clear(); SyncInfo(); Update(); return SA_OK; } SaErrorT cLog::SetState( SaHpiBoolT enable ) { if ( ( m_caps && SAHPI_EVTLOG_CAPABILITY_STATE_SET ) == 0 ) { return SA_ERR_HPI_INVALID_CMD; } m_info.Enabled = enable; Update(); return SA_OK; } SaErrorT cLog::ResetOverflow() { if ( m_info.OverflowResetable == SAHPI_FALSE ) { return SA_ERR_HPI_INVALID_CMD; } if ( ( m_caps && SAHPI_EVTLOG_CAPABILITY_OVERFLOW_RESET ) == 0 ) { return SA_ERR_HPI_INVALID_CMD; } m_info.OverflowFlag = SAHPI_FALSE; Update(); return SA_OK; } // cObject virtual functions void cLog::GetVars( cVars& vars ) { cObject::GetVars( vars ); SyncInfo(); Structs::GetVars( m_info, vars ); vars << "Capabilities" << dtSaHpiEventLogCapabilitiesT << DATA( m_caps ) << VAR_END(); } void cLog::AfterVarSet( const std::string& var_name ) { cObject::AfterVarSet( var_name ); if ( var_name == size_name ) { if ( m_info.Size == 0 ) { m_entries.clear(); } if ( m_entries.size() >= m_info.Size ) { if ( m_info.OverflowAction == SAHPI_EL_OVERFLOW_DROP ) { m_entries.resize( m_info.Size ); } else { while ( m_entries.size() > m_info.Size ) { m_entries.pop_front(); } } } } } void cLog::Update() { oh_gettimeofday( &m_info.UpdateTimestamp ); m_info.UpdateTimestamp += m_delta; } void cLog::SyncInfo() { m_info.Entries = m_entries.size(); oh_gettimeofday( &m_info.CurrentTime ); m_info.CurrentTime += m_delta; if ( ( m_info.Entries == 0 ) || ( m_info.Entries < m_info.Size ) ) { m_info.OverflowFlag = SAHPI_FALSE; } } bool cLog::AddEntry( const SaHpiEventT& event, const SaHpiRdrT * rdr, const SaHpiRptEntryT * rpte ) { if ( m_entries.size() >= m_info.Size ) { if ( m_info.OverflowAction == SAHPI_EL_OVERFLOW_DROP ) { return false; } if ( m_info.Size == 0 ) { return false; } const size_t need = m_info.Size - 1; while ( m_entries.size() > need ) { m_entries.pop_front(); } } Entry entry; entry.entry.EntryId = m_next_eid; entry.entry.Event = event; oh_gettimeofday( &entry.entry.Timestamp ); entry.entry.Timestamp += m_delta; entry.rdr.RdrType = SAHPI_NO_RECORD; if ( rdr ) { entry.rdr = *rdr; } entry.rpte.ResourceId = SAHPI_UNSPECIFIED_RESOURCE_ID; entry.rpte.ResourceCapabilities = 0; if ( rpte ) { entry.rpte = *rpte; } m_entries.push_back( entry ); ++m_next_eid; if ( m_entries.size() == m_info.Size ) { m_info.OverflowFlag = SAHPI_TRUE; } Update(); return true; } }; // namespace TA openhpi-3.6.1/plugins/test_agent/instrument.cpp0000644000175100017510000001121612575647277020734 0ustar mohanmohan/* -*- c++ -*- * * (C) Copyright Pigeon Point Systems. 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTINSTRUMENTLITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #include #include #include "instrument.h" #include "resource.h" #include "structs.h" #include "utils.h" namespace TA { /************************************************************** * Helper functions *************************************************************/ static void MakeDefaultRdr( const SaHpiEntityPathT& ep, SaHpiRdrTypeT type, const SaHpiRdrTypeUnionT& data, const std::string& name, SaHpiRdrT& rdr ) { SaHpiInstrumentIdT instr_id = SAHPI_ENTRY_UNSPECIFIED; switch ( type ) { case SAHPI_CTRL_RDR: instr_id = data.CtrlRec.Num; break; case SAHPI_SENSOR_RDR: instr_id = data.SensorRec.Num; break; case SAHPI_INVENTORY_RDR: instr_id = data.InventoryRec.IdrId; break; case SAHPI_WATCHDOG_RDR: instr_id = data.WatchdogRec.WatchdogNum; break; case SAHPI_ANNUNCIATOR_RDR: instr_id = data.AnnunciatorRec.AnnunciatorNum; break; case SAHPI_DIMI_RDR: instr_id = data.DimiRec.DimiNum; break; case SAHPI_FUMI_RDR: instr_id = data.FumiRec.Num; break; default: instr_id = SAHPI_ENTRY_UNSPECIFIED; } rdr.RecordId = oh_get_rdr_uid( type, instr_id ); rdr.RdrType = type; rdr.Entity = ep; rdr.IsFru = SAHPI_FALSE; rdr.RdrTypeUnion = data; MakeHpiTextBuffer( rdr.IdString, name.c_str() ); } /************************************************************** * class cInstrument *************************************************************/ cInstrument::cInstrument( cHandler& handler, cResource& resource, const std::string& name, SaHpiRdrTypeT type, const SaHpiRdrTypeUnionT& data ) : cObject( name, SAHPI_FALSE ), m_handler( handler ), m_resource( resource ) { MakeDefaultRdr( resource.GetEntityPath(), type, data, GetName(), m_rdr ); } cInstrument::~cInstrument() { SetVisible( false ); } const SaHpiRdrT& cInstrument::GetRdr() const { return m_rdr; } // cObject virtual functions void cInstrument::BeforeVisibilityChange() { cObject::BeforeVisibilityChange(); if ( IsVisible() ) { // Instrument disappears PostUpdateEvent( true ); } } void cInstrument::AfterVisibilityChange() { if ( IsVisible() ) { // Instrument appears m_resource.UpdateCaps( RequiredResourceCap() ); PostUpdateEvent(); } cObject::AfterVisibilityChange(); } void cInstrument::GetVars( cVars& vars ) { cObject::GetVars( vars ); Structs::GetVars( m_rdr, vars ); } void cInstrument::AfterVarSet( const std::string& var_name ) { cObject::AfterVarSet( var_name ); if ( var_name.find( "Rdr." ) == 0 ) { // RDR has been changed HandleRdrChange( var_name ); } } // Event generation void cInstrument::PostEvent( SaHpiEventTypeT type, const SaHpiEventUnionT& data, SaHpiSeverityT severity, bool remove ) const { if ( !IsVisible() ) { return; } InstrumentList l, l_remove; if ( !remove ) { l.push_back( this ); } else { l_remove.push_back( this ); } m_resource.PostEvent( type, data, severity, l, l_remove ); } void cInstrument::PostUpdateEvent( bool remove ) const { SaHpiEventUnionT data; data.ResourceEvent.ResourceEventType = SAHPI_RESE_RESOURCE_UPDATED; PostEvent( SAHPI_ET_RESOURCE, data, SAHPI_INFORMATIONAL, remove ); } // Handling RDR changes void cInstrument::HandleRdrChange( const std::string& field_name ) { UpdateRdr( field_name, m_rdr.RdrTypeUnion ); PostUpdateEvent(); } void cInstrument::UpdateRdr( const std::string& field_name, SaHpiRdrTypeUnionT& data ) { // extend in inherited classes } }; // namespace TA openhpi-3.6.1/plugins/test_agent/utils.cpp0000644000175100017510000000604712575647277017672 0ustar mohanmohan/* -*- c++ -*- * * (C) Copyright Pigeon Point Systems. 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTUTILSLITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #include #include #include #include #include "utils.h" namespace TA { /************************************************************** * Entity Path Helpers *************************************************************/ void MakeUnspecifiedHpiEntityPath( SaHpiEntityPathT& ep ) { for ( size_t i = 0; i < SAHPI_MAX_ENTITY_PATH; ++i ) { ep.Entry[i].EntityType = SAHPI_ENT_UNSPECIFIED; ep.Entry[i].EntityLocation = 0; } } /************************************************************** * Text Buffer Helpers *************************************************************/ void MakeHpiTextBuffer( SaHpiTextBufferT& tb, const char * s ) { if ( s ) { MakeHpiTextBuffer( tb, s, strlen( s ) ); } } void MakeHpiTextBuffer( SaHpiTextBufferT& tb, const char * s, size_t size ) { tb.DataType = SAHPI_TL_TYPE_TEXT; tb.Language = SAHPI_LANG_ENGLISH; if ( s ) { tb.DataLength = std::min( size, SAHPI_MAX_TEXT_BUFFER_LENGTH ); if ( tb.DataLength != 0 ) { memcpy( tb.Data, s, tb.DataLength ); } else { tb.Data[0] = '\0'; } } else { tb.DataLength = 0; } } void MakeHpiTextBuffer( SaHpiTextBufferT& tb, char c, size_t size ) { if ( size > 0 ) { tb.DataType = SAHPI_TL_TYPE_TEXT; tb.Language = SAHPI_LANG_ENGLISH; tb.DataLength = std::min( size, SAHPI_MAX_TEXT_BUFFER_LENGTH ); memset( &tb.Data[0], c, tb.DataLength ); } else { tb.DataLength = 0; } } void FormatHpiTextBuffer( SaHpiTextBufferT& tb, const char * fmt, ... ) { va_list ap; va_start(ap, fmt ); vFormatHpiTextBuffer( tb, fmt, ap ); va_end( ap ); } void vFormatHpiTextBuffer( SaHpiTextBufferT& tb, const char * fmt, va_list ap ) { char * p = reinterpret_cast( &(tb.Data[0]) ); tb.DataType = SAHPI_TL_TYPE_TEXT; tb.Language = SAHPI_LANG_ENGLISH; int len = vsnprintf( p, SAHPI_MAX_TEXT_BUFFER_LENGTH, fmt, ap ); tb.DataLength = ( len < 0 ) ? 0 : (SaHpiUint8T)(len); } void AppendToTextBuffer( SaHpiTextBufferT& tb, const SaHpiTextBufferT& appendix ) { if ( tb.DataType != appendix.DataType ) { return; } if ( tb.Language != appendix.Language ) { return; } size_t len = std::min( SAHPI_MAX_TEXT_BUFFER_LENGTH - tb.DataLength, appendix.DataLength ); if ( len > 0 ) { memcpy( &tb.Data[tb.DataLength], &appendix.Data[0], len ); } tb.DataLength += len; } }; // namespace TA openhpi-3.6.1/plugins/test_agent/field.cpp0000644000175100017510000000420412575647277017606 0ustar mohanmohan/* -*- c++ -*- * * (C) Copyright Pigeon Point Systems. 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTFIELDLITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #include "codec.h" #include "field.h" #include "utils.h" namespace TA { /************************************************************** * class cField *************************************************************/ const std::string cField::classname( "field" ); cField::cField( volatile SaHpiUint32T& update_count, SaHpiEntryIdT id ) : cObject( AssembleNumberedObjectName( classname, id ) ), m_id( id ), m_type( SAHPI_IDR_FIELDTYPE_CUSTOM ), m_readonly( SAHPI_FALSE ), m_update_count( update_count ) { MakeHpiTextBuffer( m_data, "" ); } cField::~cField() { // empty } void cField::Get( SaHpiEntryIdT& id, SaHpiIdrFieldTypeT& type, SaHpiBoolT& readonly, SaHpiTextBufferT& data ) const { id = m_id; type = m_type; readonly = m_readonly ? SAHPI_TRUE : SAHPI_FALSE; data = m_data; } void cField::Set( SaHpiIdrFieldTypeT type, const SaHpiTextBufferT& data ) { m_type = type; m_data = data; } void cField::GetVars( cVars& vars ) { cObject::GetVars( vars ); vars << "FieldId" << dtSaHpiEntryIdT << DATA( m_id ) << READONLY() << VAR_END(); vars << "FieldType" << dtSaHpiIdrFieldTypeT << DATA( m_type ) << VAR_END(); vars << "ReadOnly" << dtSaHpiBoolT << DATA( m_readonly ) << VAR_END(); vars << "Field" << dtSaHpiTextBufferT << DATA( m_data ) << VAR_END(); } void cField::AfterVarSet( const std::string& var_name ) { cObject::AfterVarSet( var_name ); ++m_update_count; } }; // namespace TA openhpi-3.6.1/plugins/test_agent/dimi.cpp0000644000175100017510000001207512575647277017452 0ustar mohanmohan/* -*- c++ -*- * * (C) Copyright Pigeon Point Systems. 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTWATCHDOGLITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #include #include #include "codec.h" #include "dimi.h" #include "test.h" namespace TA { /************************************************************** * Helper functions *************************************************************/ static SaHpiRdrTypeUnionT MakeDefaultDimiRec( SaHpiDimiNumT num ) { SaHpiRdrTypeUnionT data; SaHpiDimiRecT& rec = data.DimiRec; rec.DimiNum = num; rec.Oem = 0; return data; } /************************************************************** * Functors for working with tests *************************************************************/ struct TestDeleter { void operator ()( cTest * test ) { delete test; } }; struct ObjectCollector { explicit ObjectCollector( cObject::Children& _children ) : children( _children ) { // empty } void operator ()( cTest * test ) { if ( test ) { children.push_back( test ); } } cObject::Children& children; }; /************************************************************** * class cDimi *************************************************************/ const std::string cDimi::classname( "dimi" ); cDimi::cDimi( cHandler& handler, cResource& resource, SaHpiDimiNumT num ) : cInstrument( handler, resource, AssembleNumberedObjectName( classname, num ), SAHPI_DIMI_RDR, MakeDefaultDimiRec( num ) ), m_rec( GetRdr().RdrTypeUnion.DimiRec ), m_update_count( 0 ) { // empty } cDimi::~cDimi() { TestDeleter deleter; std::for_each( m_tests.begin(), m_tests.end(), deleter ); m_tests.clear(); } cTest * cDimi::GetTest( SaHpiDimiTestNumT tnum ) const { return ( tnum < m_tests.size() ) ? m_tests[tnum] : 0; } void cDimi::PostEvent( SaHpiDimiTestNumT tnum, SaHpiDimiTestRunStatusT status, SaHpiDimiTestPercentCompletedT progress ) { SaHpiEventUnionT data; SaHpiDimiEventT& de = data.DimiEvent; de.DimiNum = m_rec.DimiNum; de.TestNum = tnum; de.DimiTestRunStatus = status; de.DimiTestPercentCompleted = progress; cInstrument::PostEvent( SAHPI_ET_DIMI, data, SAHPI_INFORMATIONAL ); } // HPI interface SaErrorT cDimi::GetInfo( SaHpiDimiInfoT& info ) const { info.NumberOfTests = m_tests.size(); info.TestNumUpdateCounter = m_update_count; return SA_OK; } // cObject virtual functions void cDimi::GetNB( std::string& nb ) const { cObject::GetNB( nb ); nb += "- Test Agent supports creation of a DIMI test with\n"; nb += " id == current number of tests.\n"; nb += "- Test Agent supports removal of a DIMI test with\n"; nb += " id == (current number of tests - 1).\n"; nb += "- Be careful when removing a test:\n"; nb += "-- Any DIMI API directed to the removed test will fail.\n"; nb += "-- Any DIMI asynchronous operation on the test can fail or cause crash.\n"; } void cDimi::GetNewNames( cObject::NewNames& names ) const { cObject::GetNewNames( names ); names.push_back( cTest::classname + "-XXX" ); } bool cDimi::CreateChild( const std::string& name ) { bool rc; rc = cObject::CreateChild( name ); if ( rc ) { return true; } std::string cname; SaHpiUint32T id; rc = DisassembleNumberedObjectName( name, cname, id ); if ( !rc ) { return false; } if ( cname != cTest::classname ) { return false; } if ( id != m_tests.size() ) { return false; } m_tests.push_back( new cTest( m_handler, *this, id ) ); Update(); return true; } bool cDimi::RemoveChild( const std::string& name ) { bool rc; rc = cObject::RemoveChild( name ); if ( rc ) { return true; } std::string cname; SaHpiUint32T id; rc = DisassembleNumberedObjectName( name, cname, id ); if ( !rc ) { return false; } if ( ( id + 1 ) != m_tests.size() ) { return false; } delete m_tests[id]; m_tests[id] = 0; m_tests.resize( id ); Update(); return true; } void cDimi::GetChildren( Children& children ) const { cObject::GetChildren( children ); ObjectCollector collector( children ); std::for_each( m_tests.begin(), m_tests.end(), collector ); } void cDimi::Update() { ++m_update_count; SaHpiEventUnionT data; SaHpiDimiUpdateEventT& due = data.DimiUpdateEvent; due.DimiNum = m_rec.DimiNum; cInstrument::PostEvent( SAHPI_ET_DIMI_UPDATE, data, SAHPI_INFORMATIONAL ); } }; // namespace TA openhpi-3.6.1/plugins/test_agent/inventory.h0000644000175100017510000000475512575647277020240 0ustar mohanmohan/* -*- c++ -*- * * (C) Copyright Pigeon Point Systems. 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTINVENTORYLITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #ifndef INVENTORY_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 #define INVENTORY_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 #include #include #include #include "instrument.h" namespace TA { /************************************************************** * class cInventory *************************************************************/ class cArea; class cInventory : public cInstrument { public: static const std::string classname; explicit cInventory( cHandler& handler, cResource& resource, SaHpiIdrIdT num ); virtual ~cInventory(); public: cArea * GetArea( SaHpiEntryIdT aid ) const; public: // HPI interface SaErrorT GetInfo( SaHpiIdrInfoT& info ) const; SaErrorT GetArea( SaHpiIdrAreaTypeT atype, SaHpiEntryIdT aid, SaHpiEntryIdT& next_aid, SaHpiIdrAreaHeaderT& hdr ) const; SaErrorT AddArea( SaHpiIdrAreaTypeT atype, SaHpiEntryIdT& aid ); SaErrorT AddAreaById( SaHpiEntryIdT aid, SaHpiIdrAreaTypeT atype ); SaErrorT DeleteAreaById( SaHpiEntryIdT aid ); protected: // cObject virtual functions virtual void GetNewNames( cObject::NewNames& names ) const; virtual bool CreateChild( const std::string& name ); virtual bool RemoveChild( const std::string& name ); virtual void GetChildren( cObject::Children& children ) const; virtual void GetVars( cVars& vars ); virtual void AfterVarSet( const std::string& var_name ); private: cInventory( const cInventory& ); cInventory& operator =( const cInventory& ); private: virtual SaHpiCapabilitiesT RequiredResourceCap() const { return SAHPI_CAPABILITY_INVENTORY_DATA; } private: // data const SaHpiInventoryRecT& m_rec; SaHpiBoolT m_readonly; volatile SaHpiUint32T m_update_count; typedef std::list Areas; Areas m_areas; }; }; // namespace TA #endif // INVENTORY_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 openhpi-3.6.1/plugins/test_agent/structs.cpp0000644000175100017510000010307412575647277020237 0ustar mohanmohan/* -*- c++ -*- * * (C) Copyright Pigeon Point Systems. 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTSTRUCTSLITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #include #include #include "structs.h" #include "vars.h" namespace TA { namespace Structs { /************************************************************** * Helpers to get vars from common HPI structures *************************************************************/ void GetVars( SaHpiRptEntryT& rpte, cVars& vars ) { SaHpiResourceInfoT& ri = rpte.ResourceInfo; vars << "RptEntry.ResourceId" << dtSaHpiResourceIdT << DATA( rpte.ResourceId ) << READONLY() << VAR_END(); vars << "RptEntry.ResourceInfo.ResourceRev" << dtSaHpiUint8T << DATA( ri.ResourceRev ) << VAR_END(); vars << "RptEntry.ResourceInfo.SpecificVer" << dtSaHpiUint8T << DATA( ri.SpecificVer ) << VAR_END(); vars << "RptEntry.ResourceInfo.DeviceSupport" << dtSaHpiUint8T << DATA( ri.DeviceSupport ) << VAR_END(); vars << "RptEntry.ResourceInfo.ManufacturerId" << dtSaHpiManufacturerIdT << DATA( ri.ManufacturerId ) << VAR_END(); vars << "RptEntry.ResourceInfo.ProductId" << dtSaHpiUint16T << DATA( ri.ProductId ) << VAR_END(); vars << "RptEntry.ResourceInfo.FirmwareMajorRev" << dtSaHpiUint8T << DATA( ri.FirmwareMajorRev ) << VAR_END(); vars << "RptEntry.ResourceInfo.FirmwareMinorRev" << dtSaHpiUint8T << DATA( ri.FirmwareMinorRev ) << VAR_END(); vars << "RptEntry.ResourceInfo.AuxFirmwareRev" << dtSaHpiUint8T << DATA( ri.AuxFirmwareRev ) << VAR_END(); vars << "RptEntry.ResourceInfo.Guid" << dtSaHpiGuidT << DATA( ri.Guid ) << VAR_END(); vars << "RptEntry.ResourceEntity" << dtSaHpiEntityPathT << DATA( rpte.ResourceEntity ) << READONLY() << VAR_END(); vars << "RptEntry.ResourceCapabilities" << dtSaHpiCapabilitiesT << DATA( rpte.ResourceCapabilities ) << VAR_END(); vars << "RptEntry.HotSwapCapabilities" << dtSaHpiHsCapabilitiesT << DATA( rpte.HotSwapCapabilities ) << VAR_END(); vars << "RptEntry.ResourceSeverity" << dtSaHpiSeverityT << DATA( rpte.ResourceSeverity ) << VAR_END(); vars << "RptEntry.ResourceFailed" << dtSaHpiBoolT << DATA( rpte.ResourceFailed ) << READONLY() << VAR_END(); vars << "RptEntry.ResourceTag" << dtSaHpiTextBufferT << DATA( rpte.ResourceTag ) << VAR_END(); } void GetVars( SaHpiEventLogInfoT& info, cVars& vars ) { vars << "Info.Entries" << dtSaHpiUint32T << DATA( info.Entries ) << READONLY() << VAR_END(); vars << "Info.Size" << dtSaHpiUint32T << DATA( info.Size ) << VAR_END(); vars << "Info.UserEventMaxSize" << dtSaHpiUint32T << DATA( info.UserEventMaxSize ) << VAR_END(); vars << "Info.UpdateTimestamp" << dtSaHpiTimeT << DATA( info.UpdateTimestamp ) << READONLY() << VAR_END(); vars << "Info.CurrentTime" << dtSaHpiTimeT << DATA( info.CurrentTime ) << VAR_END(); vars << "Info.Enabled" << dtSaHpiBoolT << DATA( info.Enabled ) << VAR_END(); vars << "Info.OverflowFlag" << dtSaHpiBoolT << DATA( info.OverflowFlag ) << VAR_END(); vars << "Info.OverflowResetable" << dtSaHpiBoolT << DATA( info.OverflowResetable ) << VAR_END(); vars << "Info.OverflowAction" << dtSaHpiEventLogOverflowActionT << DATA( info.OverflowAction ) << VAR_END(); } void GetVars( SaHpiLoadIdT& load_id, cVars& vars ) { vars << "LoadId.LoadNumber" << dtSaHpiLoadNumberT << DATA( load_id.LoadNumber ) << VAR_END(); vars << IF( load_id.LoadNumber == SAHPI_LOAD_ID_BYNAME ) << "LoadId.LoadName" << dtSaHpiTextBufferT << DATA( load_id.LoadName ) << VAR_END(); } static void GetVars( SaHpiCtrlRecT& rec, cVars& vars ) { vars << "Rdr.CtrlRec.Num" << dtSaHpiCtrlNumT << DATA( rec.Num ) << READONLY() << VAR_END(); vars << "Rdr.CtrlRec.OutputType" << dtSaHpiCtrlOutputTypeT << DATA( rec.OutputType ) << VAR_END(); vars << "Rdr.CtrlRec.Type" << dtSaHpiCtrlTypeT << DATA( rec.Type ) << VAR_END(); vars << IF( rec.Type == SAHPI_CTRL_TYPE_DIGITAL ) << "Rdr.CtrlRec.Digital.Default" << dtSaHpiCtrlStateDigitalT << DATA( rec.TypeUnion.Digital.Default ) << VAR_END(); vars << IF( rec.Type == SAHPI_CTRL_TYPE_DISCRETE ) << "Rdr.CtrlRec.Discrete.Default" << dtSaHpiCtrlStateDiscreteT << DATA( rec.TypeUnion.Discrete.Default ) << VAR_END(); vars << IF( rec.Type == SAHPI_CTRL_TYPE_ANALOG ) << "Rdr.CtrlRec.Analog.Min" << dtSaHpiCtrlStateAnalogT << DATA( rec.TypeUnion.Analog.Min ) << VAR_END(); vars << IF( rec.Type == SAHPI_CTRL_TYPE_ANALOG ) << "Rdr.CtrlRec.Analog.Max" << dtSaHpiCtrlStateAnalogT << DATA( rec.TypeUnion.Analog.Max ) << VAR_END(); vars << IF( rec.Type == SAHPI_CTRL_TYPE_ANALOG ) << "Rdr.CtrlRec.Analog.Default" << dtSaHpiCtrlStateAnalogT << DATA( rec.TypeUnion.Analog.Default ) << VAR_END(); vars << IF( rec.Type == SAHPI_CTRL_TYPE_STREAM ) << "Rdr.CtrlRec.Stream.Default.Repeat" << dtSaHpiBoolT << DATA( rec.TypeUnion.Stream.Default.Repeat ) << VAR_END(); vars << IF( rec.Type == SAHPI_CTRL_TYPE_STREAM ) << "Rdr.CtrlRec.Stream.Default.Stream" << dtSaHpiCtrlStateStreamTWithoutRepeat << DATA( rec.TypeUnion.Stream.Default ) << VAR_END(); vars << IF( rec.Type == SAHPI_CTRL_TYPE_TEXT ) << "Rdr.CtrlRec.Text.MaxChars" << dtSaHpiUint8T << DATA( rec.TypeUnion.Text.MaxChars ) << VAR_END(); vars << IF( rec.Type == SAHPI_CTRL_TYPE_TEXT ) << "Rdr.CtrlRec.Text.MaxLines" << dtSaHpiUint8T << DATA( rec.TypeUnion.Text.MaxLines ) << VAR_END(); vars << IF( rec.Type == SAHPI_CTRL_TYPE_TEXT ) << "Rdr.CtrlRec.Text.Language" << dtSaHpiLanguageT << DATA( rec.TypeUnion.Text.Language ) << VAR_END(); vars << IF( rec.Type == SAHPI_CTRL_TYPE_TEXT ) << "Rdr.CtrlRec.Text.DataType" << dtSaHpiTextTypeT << DATA( rec.TypeUnion.Text.DataType ) << VAR_END(); vars << IF( rec.Type == SAHPI_CTRL_TYPE_TEXT ) << "Rdr.CtrlRec.Text.Default.Line" << dtSaHpiTxtLineNumT << DATA( rec.TypeUnion.Text.Default.Line ) << VAR_END(); vars << IF( rec.Type == SAHPI_CTRL_TYPE_TEXT ) << "Rdr.CtrlRec.Text.Default.Text" << dtSaHpiTextBufferT << DATA( rec.TypeUnion.Text.Default.Text ) << VAR_END(); vars << IF( rec.Type == SAHPI_CTRL_TYPE_OEM ) << "Rdr.CtrlRec.Oem.MId" << dtSaHpiManufacturerIdT << DATA( rec.TypeUnion.Oem.MId ) << VAR_END(); vars << IF( rec.Type == SAHPI_CTRL_TYPE_OEM ) << "Rdr.CtrlRec.Oem.ConfigData" << dtControlOemConfigData << DATA( rec.TypeUnion.Oem.ConfigData ) << VAR_END(); vars << IF( rec.Type == SAHPI_CTRL_TYPE_OEM ) << "Rdr.CtrlRec.Oem.Default.MId" << dtSaHpiManufacturerIdT << DATA( rec.TypeUnion.Oem.Default.MId ) << VAR_END(); vars << IF( rec.Type == SAHPI_CTRL_TYPE_OEM ) << "Rdr.CtrlRec.Oem.Default.Body" << dtSaHpiCtrlStateOemTWithoutMId << DATA( rec.TypeUnion.Oem.Default ) << VAR_END(); vars << "Rdr.CtrlRec.DefaultModeMode" << dtSaHpiCtrlModeT << DATA( rec.DefaultMode.Mode ) << VAR_END(); vars << "Rdr.CtrlRec.DefaultMode.ReadOnly" << dtSaHpiBoolT << DATA( rec.DefaultMode.ReadOnly ) << VAR_END(); vars << "Rdr.CtrlRec.WriteOnly" << dtSaHpiBoolT << DATA( rec.WriteOnly ) << VAR_END(); vars << "Rdr.CtrlRec.Oem" << dtSaHpiUint32T << DATA( rec.Oem ) << VAR_END(); } static void GetVars( SaHpiSensorRecT& rec, cVars& vars ) { SaHpiSensorDataFormatT& df = rec.DataFormat; SaHpiSensorRangeT& r = df.Range; SaHpiSensorThdDefnT& thd = rec.ThresholdDefn; bool has_df = ( df.IsSupported != SAHPI_FALSE ); bool is_th = ( rec.Category == SAHPI_EC_THRESHOLD ); bool has_thd = is_th && ( thd.IsAccessible != SAHPI_FALSE ); vars << "Rdr.SensorRec.Num" << dtSaHpiSensorNumT << DATA( rec.Num ) << READONLY() << VAR_END(); vars << "Rdr.SensorRec.Type" << dtSaHpiSensorTypeT << DATA( rec.Type ) << VAR_END(); vars << "Rdr.SensorRec.Category" << dtSaHpiEventCategoryT << DATA( rec.Category ) << VAR_END(); vars << "Rdr.SensorRec.EnableCtrl" << dtSaHpiBoolT << DATA( rec.EnableCtrl ) << VAR_END(); vars << "Rdr.SensorRec.EventCtrl" << dtSaHpiSensorEventCtrlT << DATA( rec.EventCtrl ) << VAR_END(); vars << "Rdr.SensorRec.Events" << dtSaHpiEventStateT << DATA( rec.Events ) << VAR_END(); vars << "Rdr.SensorRec.DataFormat.IsSupported" << dtSaHpiBoolT << DATA( df.IsSupported ) << VAR_END(); vars << IF( has_df ) << "Rdr.SensorRec.DataFormat.ReadingType" << dtSaHpiSensorReadingTypeT << DATA( df.ReadingType ) << VAR_END(); vars << IF( has_df ) << "Rdr.SensorRec.DataFormat.BaseUnits" << dtSaHpiSensorUnitsT << DATA( df.BaseUnits ) << VAR_END(); vars << IF( has_df ) << "Rdr.SensorRec.DataFormat.ModifierUnits" << dtSaHpiSensorUnitsT << DATA( df.ModifierUnits ) << VAR_END(); vars << IF( has_df ) << "Rdr.SensorRec.DataFormat.ModifierUse" << dtSaHpiSensorModUnitUseT << DATA( df.ModifierUse ) << VAR_END(); vars << IF( has_df ) << "Rdr.SensorRec.DataFormat.Percentage" << dtSaHpiBoolT << DATA( df.Percentage ) << VAR_END(); vars << IF( has_df ) << "Rdr.SensorRec.DataFormat.Range.Flags" << dtSaHpiSensorRangeFlagsT << DATA( r.Flags ) << VAR_END(); if ( has_df && ( r.Flags & SAHPI_SRF_MAX ) ) { GetVars( "Rdr.SensorRec.DataFormat.Range.Max", r.Max, vars ); } if ( has_df && ( r.Flags & SAHPI_SRF_MIN ) ) { GetVars( "Rdr.SensorRec.DataFormat.Range.Min", r.Min, vars ); } if ( has_df && ( r.Flags & SAHPI_SRF_NOMINAL ) ) { GetVars( "Rdr.SensorRec.DataFormat.Range.Nominal", r.Nominal, vars ); } if ( has_df && ( r.Flags & SAHPI_SRF_NORMAL_MAX ) ) { GetVars( "Rdr.SensorRec.DataFormat.Range.NormalMax", r.NormalMax, vars ); } if ( has_df && ( r.Flags & SAHPI_SRF_NORMAL_MIN ) ) { GetVars( "Rdr.SensorRec.DataFormat.Range.NormalMin", r.NormalMin, vars ); } vars << IF( has_df ) << "Rdr.SensorRec.DataFormat.AccuracyFactor" << dtSaHpiFloat64T << DATA( df.AccuracyFactor ) << VAR_END(); vars << IF( is_th ) << "Rdr.SensorRec.ThresholdDefn.IsAccessible" << dtSaHpiBoolT << DATA( thd.IsAccessible ) << VAR_END(); vars << IF( has_thd ) << "Rdr.SensorRec.ThresholdDefn.ReadThold" << dtSaHpiSensorThdMaskT << DATA( thd.ReadThold ) << VAR_END(); vars << IF( has_thd ) << "Rdr.SensorRec.ThresholdDefn.WriteThold" << dtSaHpiSensorThdMaskT << DATA( thd.WriteThold ) << VAR_END(); vars << IF( has_thd ) << "Rdr.SensorRec.ThresholdDefn.Nonlinear" << dtSaHpiBoolT << DATA( thd.Nonlinear ) << VAR_END(); vars << "Rdr.SensorRec.Oem" << dtSaHpiUint32T << DATA( rec.Oem ) << VAR_END(); } static void GetVars( SaHpiInventoryRecT& rec, cVars& vars ) { vars << "Rdr.InventoryRec.IdrId" << dtSaHpiIdrIdT << DATA( rec.IdrId ) << READONLY() << VAR_END(); vars << "Rdr.InventoryRec.Persistent" << dtSaHpiBoolT << DATA( rec.Persistent ) << VAR_END(); vars << "Rdr.InventoryRec.Oem" << dtSaHpiUint32T << DATA( rec.Oem ) << VAR_END(); } static void GetVars( SaHpiWatchdogRecT& rec, cVars& vars ) { vars << "Rdr.WatchdogRec.WatchdogNum" << dtSaHpiWatchdogNumT << DATA( rec.WatchdogNum ) << READONLY() << VAR_END(); vars << "Rdr.WatchdogRec.Oem" << dtSaHpiUint32T << DATA( rec.Oem ) << VAR_END(); } static void GetVars( SaHpiAnnunciatorRecT& rec, cVars& vars ) { vars << "Rdr.AnnunciatorRec.AnnunciatorNum" << dtSaHpiAnnunciatorNumT << DATA( rec.AnnunciatorNum ) << READONLY() << VAR_END(); vars << "Rdr.AnnunciatorRec.AnnunciatorType" << dtSaHpiAnnunciatorTypeT << DATA( rec.AnnunciatorType ) << VAR_END(); vars << "Rdr.AnnunciatorRec.ModeReadOnly" << dtSaHpiBoolT << DATA( rec.ModeReadOnly ) << VAR_END(); vars << "Rdr.AnnunciatorRec.MaxConditions" << dtSaHpiUint32T << DATA( rec.MaxConditions ) << VAR_END(); vars << "Rdr.AnnunciatorRec.Oem" << dtSaHpiUint32T << DATA( rec.Oem ) << VAR_END(); } static void GetVars( SaHpiDimiRecT& rec, cVars& vars ) { vars << "Rdr.DimiRec.DimiNum" << dtSaHpiDimiNumT << DATA( rec.DimiNum ) << READONLY() << VAR_END(); vars << "Rdr.DimiRec.Oem" << dtSaHpiUint32T << DATA( rec.Oem ) << VAR_END(); } static void GetVars( SaHpiFumiRecT& rec, cVars& vars ) { vars << "Rdr.FumiRec.Num" << dtSaHpiFumiNumT << DATA( rec.Num ) << READONLY() << VAR_END(); vars << "Rdr.FumiRec.AccessProt" << dtSaHpiFumiProtocolT << DATA( rec.AccessProt ) << VAR_END(); vars << "Rdr.FumiRec.Capability" << dtSaHpiFumiCapabilityT << DATA( rec.Capability ) << VAR_END(); vars << "Rdr.FumiRec.NumBanks" << dtSaHpiUint8T << DATA( rec.NumBanks ) << READONLY() << VAR_END(); vars << "Rdr.FumiRec.Oem" << dtSaHpiUint32T << DATA( rec.Oem ) << VAR_END(); } void GetVars( SaHpiRdrT& rdr, cVars& vars ) { vars << "Rdr.RdrType" << dtSaHpiRdrTypeT << DATA( rdr.RdrType ) << READONLY() << VAR_END(); vars << "Rdr.Entity" << dtSaHpiEntityPathT << DATA( rdr.Entity ) << VAR_END(); vars << "Rdr.IsFru" << dtSaHpiBoolT << DATA( rdr.IsFru ) << VAR_END(); if ( rdr.RdrType == SAHPI_CTRL_RDR ) { GetVars( rdr.RdrTypeUnion.CtrlRec, vars ); } else if ( rdr.RdrType == SAHPI_SENSOR_RDR ) { GetVars( rdr.RdrTypeUnion.SensorRec, vars ); } else if ( rdr.RdrType == SAHPI_INVENTORY_RDR ) { GetVars( rdr.RdrTypeUnion.InventoryRec, vars ); } else if ( rdr.RdrType == SAHPI_WATCHDOG_RDR ) { GetVars( rdr.RdrTypeUnion.WatchdogRec, vars ); } else if ( rdr.RdrType == SAHPI_ANNUNCIATOR_RDR ) { GetVars( rdr.RdrTypeUnion.AnnunciatorRec, vars ); } else if ( rdr.RdrType == SAHPI_DIMI_RDR ) { GetVars( rdr.RdrTypeUnion.DimiRec, vars ); } else if ( rdr.RdrType == SAHPI_FUMI_RDR ) { GetVars( rdr.RdrTypeUnion.FumiRec, vars ); } vars << "Rdr.IdString" << dtSaHpiTextBufferT << DATA( rdr.IdString ) << VAR_END(); } void GetVars( SaHpiCtrlStateT& state, cVars& vars ) { vars << "State.Type" << dtSaHpiCtrlTypeT << DATA( state.Type ) << VAR_END(); vars << IF( state.Type == SAHPI_CTRL_TYPE_DIGITAL ) << "State.Digital" << dtSaHpiCtrlStateDigitalT << DATA( state.StateUnion.Digital ) << VAR_END(); vars << IF( state.Type == SAHPI_CTRL_TYPE_DISCRETE ) << "State.Discrete" << dtSaHpiCtrlStateDiscreteT << DATA( state.StateUnion.Discrete ) << VAR_END(); vars << IF( state.Type == SAHPI_CTRL_TYPE_ANALOG ) << "State.Analog" << dtSaHpiCtrlStateAnalogT << DATA( state.StateUnion.Analog ) << VAR_END(); vars << IF ( state.Type == SAHPI_CTRL_TYPE_STREAM ) << "State.Stream.Repeat" << dtSaHpiBoolT << DATA( state.StateUnion.Stream.Repeat ) << VAR_END(); vars << IF ( state.Type == SAHPI_CTRL_TYPE_STREAM ) << "State.Stream.Stream" << dtSaHpiCtrlStateStreamTWithoutRepeat << DATA( state.StateUnion.Stream ) << VAR_END(); vars << IF( state.Type == SAHPI_CTRL_TYPE_TEXT ) << "State.Text.Line" << dtSaHpiTxtLineNumT << DATA( state.StateUnion.Text.Line ) << VAR_END(); vars << IF( state.Type == SAHPI_CTRL_TYPE_TEXT ) << "State.Text.Text" << dtSaHpiTextBufferT << DATA( state.StateUnion.Text.Text ) << VAR_END(); vars << IF( state.Type == SAHPI_CTRL_TYPE_OEM ) << "State.Oem.MId" << dtSaHpiManufacturerIdT << DATA( state.StateUnion.Oem.MId ) << VAR_END(); vars << IF( state.Type == SAHPI_CTRL_TYPE_OEM ) << "State.Oem.Body" << dtSaHpiCtrlStateOemTWithoutMId << DATA( state.StateUnion.Oem ) << VAR_END(); } void GetVars( const std::string& name, SaHpiSensorReadingT& r, cVars& vars ) { vars << name + ".IsSupported" << dtSaHpiBoolT << DATA( r.IsSupported ) << VAR_END(); if ( r.IsSupported == SAHPI_FALSE ) { return; } /* vars << name + ".Type" << dtSaHpiSensorReadingTypeT << DATA( r.Type ) << VAR_END(); */ vars << IF( r.Type == SAHPI_SENSOR_READING_TYPE_INT64 ) << name + ".Value" << dtSaHpiInt64T << DATA( r.Value.SensorInt64 ) << VAR_END(); vars << IF( r.Type == SAHPI_SENSOR_READING_TYPE_UINT64 ) << name + ".Value" << dtSaHpiUint64T << DATA( r.Value.SensorUint64 ) << VAR_END(); vars << IF( r.Type == SAHPI_SENSOR_READING_TYPE_FLOAT64 ) << name + ".Value" << dtSaHpiFloat64T << DATA( r.Value.SensorFloat64 ) << VAR_END(); vars << IF( r.Type == SAHPI_SENSOR_READING_TYPE_BUFFER ) << name + ".Value" << dtSensorReadingBuffer << DATA( r.Value.SensorBuffer ) << VAR_END(); } void GetVars( SaHpiSensorThresholdsT& ths, cVars& vars ) { GetVars( "Thresholds.LowCritical", ths.LowCritical, vars ); GetVars( "Thresholds.LowMajor", ths.LowMajor, vars ); GetVars( "Thresholds.LowMinor", ths.LowMinor, vars ); GetVars( "Thresholds.UpMinor", ths.UpMinor, vars ); GetVars( "Thresholds.UpMajor", ths.UpMajor, vars ); GetVars( "Thresholds.UpCritical", ths.UpCritical, vars ); GetVars( "Thresholds.PosThdHysteresis", ths.PosThdHysteresis, vars ); GetVars( "Thresholds.NegThdHysteresis", ths.NegThdHysteresis, vars ); } void GetVars( SaHpiWatchdogT& wd, cVars& vars ) { vars << "Watchdog.Log" << dtSaHpiBoolT << DATA( wd.Log ) << READONLY() << VAR_END(); vars << "Watchdog.Running" << dtSaHpiBoolT << DATA( wd.Running ) << READONLY() << VAR_END(); vars << "Watchdog.TimerUse" << dtSaHpiWatchdogTimerUseT << DATA( wd.TimerUse ) << READONLY() << VAR_END(); vars << "Watchdog.TimerAction" << dtSaHpiWatchdogActionT << DATA( wd.TimerAction ) << READONLY() << VAR_END(); vars << "Watchdog.PretimerInterrupt" << dtSaHpiWatchdogPretimerInterruptT << DATA( wd.PretimerInterrupt ) << READONLY() << VAR_END(); vars << "Watchdog.PreTimeoutInterval" << dtSaHpiUint32T << DATA( wd.PreTimeoutInterval ) << READONLY() << VAR_END(); vars << "Watchdog.TimerUseExpFlags" << dtSaHpiWatchdogExpFlagsT << DATA( wd.TimerUseExpFlags ) << VAR_END(); vars << "Watchdog.InitialCount" << dtSaHpiUint32T << DATA( wd.InitialCount ) << READONLY() << VAR_END(); vars << "Watchdog.PresentCount" << dtSaHpiUint32T << DATA( wd.PresentCount ) << READONLY() << VAR_END(); } void GetVars( SaHpiAnnouncementT& a, cVars& vars ) { vars << "EntryId" << dtSaHpiEntryIdT << DATA( a.EntryId ) << READONLY() << VAR_END(); vars << "Timestamp" << dtSaHpiTimeT << DATA( a.Timestamp ) << VAR_END(); vars << "AddedByUser" << dtSaHpiBoolT << DATA( a.AddedByUser ) << VAR_END(); vars << "Severity" << dtSaHpiSeverityT << DATA( a.Severity ) << VAR_END(); vars << "Acknowledged" << dtSaHpiBoolT << DATA( a.Acknowledged ) << VAR_END(); SaHpiConditionT& c = a.StatusCond; vars << "StatusCond.Type" << dtSaHpiStatusCondTypeT << DATA( c.Type ) << VAR_END(); vars << "StatusCond.Entity" << dtSaHpiEntityPathT << DATA( c.Entity ) << VAR_END(); vars << "StatusCond.DomainId" << dtSaHpiDomainIdT << DATA( c.DomainId ) << VAR_END(); vars << "StatusCond.ResourceId" << dtSaHpiResourceIdT << DATA( c.ResourceId ) << VAR_END(); vars << IF( c.Type == SAHPI_STATUS_COND_TYPE_SENSOR ) << "StatusCond.SensorNum" << dtSaHpiSensorNumT << DATA( c.SensorNum ) << VAR_END(); vars << IF( c.Type == SAHPI_STATUS_COND_TYPE_SENSOR ) << "StatusCond.EventState" << dtSaHpiEventStateT << DATA( c.EventState ) << VAR_END(); vars << "StatusCond.Name" << dtSaHpiNameT << DATA( c.Name ) << VAR_END(); vars << IF( c.Type == SAHPI_STATUS_COND_TYPE_OEM ) << "StatusCond.Mid" << dtSaHpiManufacturerIdT << DATA( c.Mid ) << VAR_END(); vars << IF( c.Type == SAHPI_STATUS_COND_TYPE_OEM ) << "StatusCond.Data" << dtSaHpiTextBufferT << DATA( c.Data ) << VAR_END(); } static void GetVars( const std::string& name, SaHpiDimiTestParamsDefinitionT& pd, cVars& vars ) { vars << name + ".ParamName" << dtDimiTestParamName << DATA( pd.ParamName ) << VAR_END(); vars << name + ".ParamInfo" << dtSaHpiTextBufferT << DATA( pd.ParamInfo ) << VAR_END(); vars << name + ".ParamType" << dtSaHpiDimiTestParamTypeT << DATA( pd.ParamType ) << VAR_END(); if ( pd.ParamType == SAHPI_DIMITEST_PARAM_TYPE_INT32 ) { vars << name + ".MinValue.IntValue" << dtSaHpiInt32T << DATA( pd.MinValue.IntValue ) << VAR_END(); vars << name + ".MaxValue.IntValue" << dtSaHpiInt32T << DATA( pd.MaxValue.IntValue ) << VAR_END(); } else if ( pd.ParamType == SAHPI_DIMITEST_PARAM_TYPE_FLOAT64 ) { vars << name + ".MinValue.FloatValue" << dtSaHpiFloat64T << DATA( pd.MinValue.FloatValue ) << VAR_END(); vars << name + ".MaxValue.FloatValue" << dtSaHpiFloat64T << DATA( pd.MaxValue.FloatValue ) << VAR_END(); } if ( pd.ParamType == SAHPI_DIMITEST_PARAM_TYPE_BOOLEAN ) { vars << name + ".DefaultParam.parambool" << dtSaHpiBoolT << DATA( pd.DefaultParam.parambool ) << VAR_END(); } else if ( pd.ParamType == SAHPI_DIMITEST_PARAM_TYPE_INT32 ) { vars << name + ".DefaultParam.paramint" << dtSaHpiInt32T << DATA( pd.DefaultParam.paramint ) << VAR_END(); } else if ( pd.ParamType == SAHPI_DIMITEST_PARAM_TYPE_FLOAT64 ) { vars << name + ".DefaultParam.paramfloat" << dtSaHpiFloat64T << DATA( pd.DefaultParam.paramfloat ) << VAR_END(); } else if ( pd.ParamType == SAHPI_DIMITEST_PARAM_TYPE_TEXT ) { vars << name + ".DefaultParam.paramtext" << dtSaHpiTextBufferT << DATA( pd.DefaultParam.paramtext ) << VAR_END(); } } void GetVars( SaHpiDimiTestT& info, cVars& vars ) { char prefix[256]; vars << "TestInfo.TestName" << dtSaHpiTextBufferT << DATA( info.TestName ) << VAR_END(); vars << "TestInfo.ServiceImpact" << dtSaHpiDimiTestServiceImpactT << DATA( info.ServiceImpact ) << VAR_END(); for ( size_t i = 0; i < SAHPI_DIMITEST_MAX_ENTITIESIMPACTED; ++i ) { snprintf( &prefix[0], sizeof(prefix), "TestInfo.EntitiesImpacted[%u]", (unsigned int)i ); vars << std::string( prefix ) + ".EntityImpacted" << dtSaHpiEntityPathT << DATA( info.EntitiesImpacted[i].EntityImpacted ) << VAR_END(); vars << std::string( prefix ) + ".ServiceImpact" << dtSaHpiDimiTestServiceImpactT << DATA( info.EntitiesImpacted[i].ServiceImpact ) << VAR_END(); } vars << "TestInfo.NeedServiceOS" << dtSaHpiBoolT << DATA( info.NeedServiceOS ) << VAR_END(); vars << "TestInfo.ServiceOS" << dtSaHpiTextBufferT << DATA( info.ServiceOS ) << VAR_END(); vars << "TestInfo.ExpectedRunDuration" << dtSaHpiTimeT << DATA( info.ExpectedRunDuration ) << VAR_END(); vars << "TestInfo.TestCapabilities" << dtSaHpiDimiTestCapabilityT << DATA( info.TestCapabilities ) << VAR_END(); for ( size_t i = 0; i < SAHPI_DIMITEST_MAX_PARAMETERS; ++i ) { snprintf( &prefix[0], sizeof(prefix), "TestInfo.TestParameters[%u]", (unsigned int)i ); GetVars( prefix, info.TestParameters[i], vars ); } } void GetVars( SaHpiFumiSpecInfoT& info, cVars& vars ) { vars << "SpecInfo.SpecInfoType" << dtSaHpiFumiSpecInfoTypeT << DATA( info.SpecInfoType ) << VAR_END(); vars << IF( info.SpecInfoType == SAHPI_FUMI_SPEC_INFO_SAF_DEFINED ) << "SpecInfo.SafDefined.SpecID" << dtSaHpiFumiSafDefinedSpecIdT << DATA( info.SpecInfoTypeUnion.SafDefined.SpecID ) << VAR_END(); vars << IF( info.SpecInfoType == SAHPI_FUMI_SPEC_INFO_SAF_DEFINED ) << "SpecInfo.SafDefined.RevisionID" << dtSaHpiUint32T << DATA( info.SpecInfoTypeUnion.SafDefined.RevisionID ) << VAR_END(); vars << IF( info.SpecInfoType == SAHPI_FUMI_SPEC_INFO_OEM_DEFINED ) << "SpecInfo.OemDefined.Mid" << dtSaHpiManufacturerIdT << DATA( info.SpecInfoTypeUnion.OemDefined.Mid ) << VAR_END(); vars << IF( info.SpecInfoType == SAHPI_FUMI_SPEC_INFO_OEM_DEFINED ) << "SpecInfo.OemDefined.Body" << dtSaHpiFumiOemDefinedSpecInfoTWithoutMid << DATA( info.SpecInfoTypeUnion.OemDefined ) << VAR_END(); } void GetVars( SaHpiFumiServiceImpactDataT& data, cVars& vars ) { char prefix[256]; vars << "ServiceImpact.NumEntities" << dtSaHpiUint32T << DATA( data.NumEntities ) << VAR_END(); for ( size_t i = 0; i < data.NumEntities; ++i ) { snprintf( &prefix[0], sizeof(prefix), "ServiceImpact.ImpactedEntities[%u]", (unsigned int)i ); vars << std::string( prefix ) + ".ImpactedEntity" << dtSaHpiEntityPathT << DATA( data.ImpactedEntities[i].ImpactedEntity ) << VAR_END(); vars << std::string( prefix ) + ".ServiceImpact" << dtSaHpiFumiServiceImpactT << DATA( data.ImpactedEntities[i].ServiceImpact ) << VAR_END(); } } void GetVars( SaHpiFumiBankInfoT& info, cVars& vars ) { vars << "BankInfo.BankId" << dtSaHpiUint8T << DATA( info.BankId ) << READONLY() << VAR_END(); vars << "BankInfo.BankSize" << dtSaHpiUint32T << DATA( info.BankSize ) << VAR_END(); vars << "BankInfo.Position" << dtSaHpiUint32T << DATA( info.Position ) << READONLY() << VAR_END(); vars << "BankInfo.BankState" << dtSaHpiFumiBankStateT << DATA( info.BankState ) << VAR_END(); vars << "BankInfo.Identifier" << dtSaHpiTextBufferT << DATA( info.Identifier ) << VAR_END(); vars << "BankInfo.Description" << dtSaHpiTextBufferT << DATA( info.Description ) << VAR_END(); vars << "BankInfo.DateTime" << dtSaHpiTextBufferT << DATA( info.DateTime ) << VAR_END(); vars << "BankInfo.MajorVersion" << dtSaHpiUint32T << DATA( info.MajorVersion ) << VAR_END(); vars << "BankInfo.MinorVersion" << dtSaHpiUint32T << DATA( info.MinorVersion ) << VAR_END(); vars << "BankInfo.AuxVersion" << dtSaHpiUint32T << DATA( info.AuxVersion ) << VAR_END(); } void GetVars( const std::string& name, SaHpiFumiSourceInfoT& info, bool uri_and_status, cVars& vars ) { // This function does provide Source URI and Status. vars << IF( uri_and_status ) << name + ".SourceUri" << dtSaHpiTextBufferT << DATA( info.SourceUri ) << VAR_END(); vars << IF( uri_and_status ) << name + ".SourceStatus" << dtSaHpiFumiSourceStatusT << DATA( info.SourceStatus ) << VAR_END(); vars << name + ".Identifier" << dtSaHpiTextBufferT << DATA( info.Identifier ) << VAR_END(); vars << name + ".Description" << dtSaHpiTextBufferT << DATA( info.Description ) << VAR_END(); vars << name + ".DateTime" << dtSaHpiTextBufferT << DATA( info.DateTime ) << VAR_END(); vars << name + ".MajorVersion" << dtSaHpiUint32T << DATA( info.MajorVersion ) << VAR_END(); vars << name + ".MinorVersion" << dtSaHpiUint32T << DATA( info.MinorVersion ) << VAR_END(); vars << name + ".AuxVersion" << dtSaHpiUint32T << DATA( info.AuxVersion ) << VAR_END(); } static void GetVars( const std::string& name, SaHpiFumiFirmwareInstanceInfoT& info, cVars& vars ) { vars << name + ".InstancePresent" << dtSaHpiBoolT << DATA( info.InstancePresent ) << VAR_END(); vars << IF( info.InstancePresent != SAHPI_FALSE ) << name + ".Identifier" << dtSaHpiTextBufferT << DATA( info.Identifier ) << VAR_END(); vars << IF( info.InstancePresent != SAHPI_FALSE ) << name + ".Description" << dtSaHpiTextBufferT << DATA( info.Description ) << VAR_END(); vars << IF( info.InstancePresent != SAHPI_FALSE ) << name + ".DateTime" << dtSaHpiTextBufferT << DATA( info.DateTime ) << VAR_END(); vars << IF( info.InstancePresent != SAHPI_FALSE ) << name + ".MajorVersion" << dtSaHpiUint32T << DATA( info.MajorVersion ) << VAR_END(); vars << IF( info.InstancePresent != SAHPI_FALSE ) << name + ".MinorVersion" << dtSaHpiUint32T << DATA( info.MinorVersion ) << VAR_END(); vars << IF( info.InstancePresent != SAHPI_FALSE ) << name + ".AuxVersion" << dtSaHpiUint32T << DATA( info.AuxVersion ) << VAR_END(); } void GetVars( const std::string& name, SaHpiFumiComponentInfoT& info, cVars& vars ) { GetVars( name + ".MainFwInstance", info.MainFwInstance, vars ); vars << name + ".ComponentFlags" << dtSaHpiUint32T << DATA( info.ComponentFlags ) << VAR_END(); } void GetVars( SaHpiFumiLogicalBankInfoT& info, cVars& vars ) { vars << "LogicalBankInfo.FirmwarePersistentLocationCount" << dtSaHpiUint8T << DATA( info.FirmwarePersistentLocationCount ) << VAR_END(); vars << "LogicalBankInfo.BankStateFlags" << dtSaHpiFumiLogicalBankStateFlagsT << DATA( info.BankStateFlags ) << VAR_END(); // Do not show pending/rollback fw info /* GetVars( "LogicalBankInfo.PendingFwInstance", info.PendingFwInstance, vars ); GetVars( "LogicalBankInfo.RollbackFwInstance", info.RollbackFwInstance, vars ); */ } void GetVars( const std::string& name, SaHpiFumiLogicalComponentInfoT& info, cVars& vars ) { // Do not show pending/rollback fw info /* GetVars( name + ".PendingFwInstance", info.PendingFwInstance, vars ); GetVars( name + ".RollbackFwInstance", info.RollbackFwInstance, vars ); */ vars << name + ".ComponentFlags" << dtSaHpiUint32T << DATA( info.ComponentFlags ) << VAR_END(); } }; // namespace Structs }; // namespace TA openhpi-3.6.1/plugins/test_agent/console.h0000644000175100017510000000640012575647277017632 0ustar mohanmohan/* -*- c++ -*- * * (C) Copyright Pigeon Point Systems. 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTConsoleLITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #ifndef CONSOLE_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 #define CONSOLE_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 #include #include #include #include #include "object.h" #include "server.h" namespace TA { /************************************************************** * class cConsoleCmd *************************************************************/ class cConsole; struct cConsoleCmd { typedef std::vector Args; typedef void ( cConsole::*CmdHandler)( const Args& args ); explicit cConsoleCmd( const std::string& _name, const std::string& _usage, const std::string& _info, CmdHandler _cmd_handler, size_t _nargs ) : name( _name ), usage( _usage ), info( _info ), cmd_handler( _cmd_handler ), nargs( _nargs ) { // empty } std::string name; std::string usage; std::string info; CmdHandler cmd_handler; size_t nargs; }; /************************************************************** * class cConsole *************************************************************/ class cHandler; typedef std::list ObjectPath; class cConsole : private cServer { public: explicit cConsole( cHandler& handler, uint16_t port, cObject& root ); virtual ~cConsole(); bool Init(); void Send( const char * data, size_t len ) const; void Send( const char * str ) const; void Send( const std::string& str ) const; private: cConsole( const cConsole& ); cConsole& operator =( const cConsole& ); private: // cServer virtual functions virtual void WelcomeUser() const; virtual void ProcessUserLine( const std::vector& line, bool& quit ); private: // Console commands void CmdHelp( const cConsoleCmd::Args& args ); void CmdQuit( const cConsoleCmd::Args& args ); void CmdLs( const cConsoleCmd::Args& args ); void CmdCd( const cConsoleCmd::Args& args ); void CmdNew( const cConsoleCmd::Args& args ); void CmdRm( const cConsoleCmd::Args& args ); void CmdSet( const cConsoleCmd::Args& args ); private: void SendOK( const std::string& msg ); void SendERR( const std::string& msg ); void SendCurrentPath() const; cObject * GetObject( const ObjectPath& path ) const; cObject * TestAndGetCurrentObject(); void MakeNewPath( ObjectPath& path, const std::string& path_str ) const; private: // data cHandler& m_handler; std::vector m_cmds; bool m_quit; ObjectPath m_path; cObject& m_root; }; }; // namespace TA #endif // CONSOLE_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 openhpi-3.6.1/plugins/test_agent/test.h0000644000175100017510000000526612575647277017160 0ustar mohanmohan/* -*- c++ -*- * * (C) Copyright Pigeon Point Systems. 2012 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTTESTLITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #ifndef TEST_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 #define TEST_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 #include #include #include #include "object.h" #include "timers.h" namespace TA { /************************************************************** * class cTest *************************************************************/ class cHandler; class cDimi; class cTest : public cObject, private cTimerCallback { public: static const std::string classname; explicit cTest( cHandler& handler, cDimi& dimi, SaHpiDimiTestNumT num ); virtual ~cTest(); public: // HPI interface SaErrorT GetInfo( SaHpiDimiTestT& info ) const; SaErrorT GetReadiness( SaHpiDimiReadyT& ready ); SaErrorT Start( SaHpiUint8T nparams, const SaHpiDimiTestVariableParamsT * params ); SaErrorT Cancel(); SaErrorT GetStatus( SaHpiDimiTestPercentCompletedT& progress, SaHpiDimiTestRunStatusT& status ) const; SaErrorT GetResults( SaHpiDimiTestResultsT& results ) const; protected: // cObject virtual functions virtual void GetVars( cVars& vars ); virtual void AfterVarSet( const std::string& var_name ); private: cTest( const cTest& ); cTest& operator =( const cTest& ); private: bool CheckParams( SaHpiUint8T nparams, const SaHpiDimiTestVariableParamsT * params ) const; void ChangeStatus( SaHpiDimiTestRunStatusT status ); private: // cTimerCallback virtual functions virtual void TimerEvent(); private: // data cHandler& m_handler; cDimi& m_dimi; const SaHpiDimiTestNumT m_num; SaHpiDimiTestT m_info; SaHpiDimiReadyT m_ready; SaHpiDimiTestRunStatusT m_status; SaHpiDimiTestPercentCompletedT m_progress; SaHpiDimiTestResultsT m_prev_results; SaHpiTimeT m_start_timestamp; struct { SaHpiTimeoutT run_duration; SaHpiDimiTestErrCodeT err; SaHpiTextBufferT result_string; SaHpiBoolT result_string_is_uri; } m_next; }; }; // namespace TA #endif // TEST_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 openhpi-3.6.1/plugins/test_agent/handler.h0000644000175100017510000000476712575647277017623 0ustar mohanmohan/* -*- c++ -*- * * (C) Copyright Pigeon Point Systems. 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTHANDLERLITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #ifndef HANDLER_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 #define HANDLER_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 #include #include #include #include #include #include "console.h" #include "instrument.h" #include "object.h" #include "timers.h" namespace TA { /************************************************************** * class cHandler *************************************************************/ class cResource; class cHandler : public cTimers, private cObject, private cConsole { public: explicit cHandler( unsigned int id, unsigned short port, oh_evt_queue& eventq ); ~cHandler(); bool Init(); void Lock(); void Unlock(); public: cResource * GetResource( SaHpiResourceIdT rid ) const; public: // HPI interface SaErrorT RemoveFailedResource( SaHpiResourceIdT rid ); SaHpiTimeoutT GetAutoInsertTimeout() const; SaErrorT SetAutoInsertTimeout( SaHpiTimeoutT t ); public: // Event generation void PostEvent( SaHpiEventTypeT type, const SaHpiEventUnionT& data, SaHpiSeverityT severity, const cResource * r, const InstrumentList& updates, const InstrumentList& removals ) const; private: cHandler( const cHandler& ); cHandler& operator =( const cHandler& ); private: // cObject virtual functions virtual void GetNewNames( cObject::NewNames& names ) const; virtual bool CreateChild( const std::string& name ); virtual bool RemoveChild( const std::string& name ); virtual void GetChildren( cObject::Children& children ) const; virtual void GetVars( cVars& vars ); private: // data typedef std::map Resources; unsigned int m_id; oh_evt_queue& m_eventq; GStaticMutex m_lock; Resources m_resources; SaHpiTimeoutT m_ai_timeout; }; }; // namespace TA #endif // HANDLER_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 openhpi-3.6.1/plugins/test_agent/annunciator.cpp0000644000175100017510000002337712575647277021060 0ustar mohanmohan/* -*- c++ -*- * * (C) Copyright Pigeon Point Systems. 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTWATCHDOGLITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #include #include #include "announcement.h" #include "annunciator.h" #include "codec.h" #include "vars.h" namespace TA { /************************************************************** * Helper functions *************************************************************/ static SaHpiRdrTypeUnionT MakeDefaultAnnunciatorRec( SaHpiAnnunciatorNumT num ) { SaHpiRdrTypeUnionT data; SaHpiAnnunciatorRecT& rec = data.AnnunciatorRec; rec.AnnunciatorNum = num; rec.AnnunciatorType = SAHPI_ANNUNCIATOR_TYPE_DRY_CONTACT_CLOSURE; rec.ModeReadOnly = SAHPI_FALSE; rec.MaxConditions = 0; rec.Oem = 0; return data; } struct AnnouncementIdPred { explicit AnnouncementIdPred( SaHpiEntryIdT _id ) : id( _id ) { // empty } bool operator ()( const cAnnouncement * a ) const { return ( id == SAHPI_FIRST_ENTRY ) || ( id == a->GetId() ); } SaHpiEntryIdT id; }; struct AnnouncementNextTimestampPred { explicit AnnouncementNextTimestampPred( const SaHpiTimeT& _timestamp ) : timestamp( _timestamp ) { // empty } bool operator ()( const cAnnouncement * a ) const { return ( timestamp < a->GetTimestamp() ); } SaHpiTimeT timestamp; }; struct AnnouncementSeverityPred { explicit AnnouncementSeverityPred( SaHpiSeverityT _sev, bool _only_unack = false ) : sev( _sev ), only_unack( _only_unack ) { // empty } bool operator ()( const cAnnouncement * a ) const { if ( only_unack && a->IsAcknowledged() ) { return false; } return ( sev == SAHPI_ALL_SEVERITIES ) || ( sev == a->GetSeverity() ); } SaHpiSeverityT sev; bool only_unack; }; struct AnnouncementAck { explicit AnnouncementAck( SaHpiSeverityT _sev ) : sev( _sev ) { // empty } void operator ()( cAnnouncement * a ) { if ( ( sev == SAHPI_ALL_SEVERITIES ) || ( sev == a->GetSeverity() ) ) { a->Acknowledge(); } } SaHpiSeverityT sev; }; struct AnnouncementDelete { explicit AnnouncementDelete( SaHpiSeverityT _sev ) : sev( _sev ) { // empty } void operator ()( cAnnouncement * a ) { if ( ( sev == SAHPI_ALL_SEVERITIES ) || ( sev == a->GetSeverity() ) ) { delete a; } } SaHpiSeverityT sev; }; struct AnnouncementMaxId { explicit AnnouncementMaxId() : value( 0 ) { // empty } void operator ()( const cAnnouncement * a ) { value = std::max( value, a->GetId() ); } SaHpiEntryIdT value; }; struct ObjectCollector { explicit ObjectCollector( cObject::Children& _children ) : children( _children ) { // empty } void operator ()( cAnnouncement * a ) { children.push_back( a ); } cObject::Children& children; }; /************************************************************** * class cAnnunciator *************************************************************/ const std::string cAnnunciator::classname( "ann" ); cAnnunciator::cAnnunciator( cHandler& handler, cResource& resource, SaHpiAnnunciatorNumT num ) : cInstrument( handler, resource, AssembleNumberedObjectName( classname, num ), SAHPI_ANNUNCIATOR_RDR, MakeDefaultAnnunciatorRec( num ) ), m_rec( GetRdr().RdrTypeUnion.AnnunciatorRec ), m_mode( SAHPI_ANNUNCIATOR_MODE_SHARED ) { // empty } cAnnunciator::~cAnnunciator() { // empty } cAnnouncement * cAnnunciator::GetAnnouncement( SaHpiEntryIdT aid ) const { Announcements::const_iterator i; i = std::find_if( m_as.begin(), m_as.end(), AnnouncementIdPred( aid ) ); if ( i == m_as.end() ) { return 0; } return *i; } // HPI interface SaErrorT cAnnunciator::GetAnnouncement( SaHpiEntryIdT aid, SaHpiAnnouncementT& data ) const { if ( ( aid == SAHPI_FIRST_ENTRY ) || ( aid == SAHPI_LAST_ENTRY ) ) { return SA_ERR_HPI_INVALID_PARAMS; } cAnnouncement * a = GetAnnouncement( aid ); if ( !a ) { return SA_ERR_HPI_NOT_PRESENT; } data = a->GetData(); return SA_OK; } SaErrorT cAnnunciator::GetNextAnnouncement( SaHpiSeverityT sev, SaHpiBoolT only_unack, SaHpiAnnouncementT& data ) const { Announcements::const_iterator i; if ( data.EntryId != SAHPI_FIRST_ENTRY ) { i = std::find_if( m_as.begin(), m_as.end(), AnnouncementIdPred( data.EntryId ) ); if ( i != m_as.end() ) { if ( (*i)->GetTimestamp() != data.Timestamp ) { return SA_ERR_HPI_INVALID_DATA; } ++i; } else { // announcement with specified id might have been removed i = std::find_if( m_as.begin(), m_as.end(), AnnouncementNextTimestampPred( data.EntryId ) ); } } else { i = m_as.begin(); } AnnouncementSeverityPred pred( sev, ( only_unack != SAHPI_FALSE ) ); Announcements::const_iterator j; j = std::find_if( i, m_as.end(), pred ); if ( j == m_as.end() ) { return SA_ERR_HPI_NOT_PRESENT; } data = (*j)->GetData(); return SA_OK; } SaErrorT cAnnunciator::AckAnnouncement( SaHpiEntryIdT aid, SaHpiSeverityT sev ) { if ( aid != SAHPI_ENTRY_UNSPECIFIED ) { cAnnouncement * a = GetAnnouncement( aid ); if ( !a ) { return SA_ERR_HPI_NOT_PRESENT; } a->Acknowledge(); } else { std::for_each( m_as.begin(), m_as.end(), AnnouncementAck( sev ) ); } return SA_OK; } SaErrorT cAnnunciator::AddAnnouncement( SaHpiAnnouncementT& data ) { if ( m_mode == SAHPI_ANNUNCIATOR_MODE_AUTO ) { return SA_ERR_HPI_READ_ONLY; } AnnouncementMaxId max_id = std::for_each( m_as.begin(), m_as.end(), AnnouncementMaxId() ); cAnnouncement * a = new cAnnouncement( max_id.value + 1, data ); m_as.push_back( a ); data = a->GetData(); return SA_OK; } SaErrorT cAnnunciator::DeleteAnnouncement( SaHpiEntryIdT aid, SaHpiSeverityT sev ) { if ( m_mode == SAHPI_ANNUNCIATOR_MODE_AUTO ) { return SA_ERR_HPI_READ_ONLY; } if ( aid != SAHPI_ENTRY_UNSPECIFIED ) { cAnnouncement * a = GetAnnouncement( aid ); if ( !a ) { return SA_ERR_HPI_NOT_PRESENT; } m_as.remove_if( AnnouncementIdPred( a->GetId() ) ); delete a; } else { std::for_each( m_as.begin(), m_as.end(), AnnouncementDelete( sev ) ); m_as.remove_if( AnnouncementSeverityPred( sev ) ); } return SA_OK; } SaErrorT cAnnunciator::GetMode( SaHpiAnnunciatorModeT& mode ) const { mode = m_mode; return SA_OK; } SaErrorT cAnnunciator::SetMode( SaHpiAnnunciatorModeT mode ) { if ( m_rec.ModeReadOnly != SAHPI_FALSE ) { return SA_ERR_HPI_READ_ONLY; } m_mode = mode; return SA_OK; } // cObject virtual functions void cAnnunciator::GetNewNames( cObject::NewNames& names ) const { cObject::GetNewNames( names ); names.push_back( cAnnouncement::classname + "-XXX" ); } bool cAnnunciator::CreateChild( const std::string& name ) { bool rc; rc = cObject::CreateChild( name ); if ( rc ) { return true; } std::string cname; SaHpiUint32T id; rc = DisassembleNumberedObjectName( name, cname, id ); if ( !rc ) { return false; } if ( id == SAHPI_FIRST_ENTRY ) { return false; } if ( id == SAHPI_LAST_ENTRY ) { return false; } if ( cname == cAnnouncement::classname ) { if ( !GetAnnouncement( id ) ) { m_as.push_back( new cAnnouncement( id ) ); return true; } } return false; } bool cAnnunciator::RemoveChild( const std::string& name ) { bool rc; rc = cObject::RemoveChild( name ); if ( rc ) { return true; } std::string cname; SaHpiUint32T id; rc = DisassembleNumberedObjectName( name, cname, id ); if ( !rc ) { return false; } if ( id == SAHPI_FIRST_ENTRY ) { return false; } if ( id == SAHPI_LAST_ENTRY ) { return false; } if ( cname == cAnnouncement::classname ) { cAnnouncement * a = GetAnnouncement( id ); if ( a ) { // NB: if we pass id to AnnouncementIdPred // and id is SAHPI_FIRST_ENTRY // then all areas will be deleted. m_as.remove_if( AnnouncementIdPred( id ) ); delete a; return true; } } return false; } void cAnnunciator::GetChildren( cObject::Children& children ) const { cObject::GetChildren( children ); ObjectCollector collector( children ); std::for_each( m_as.begin(), m_as.end(), collector ); } void cAnnunciator::GetVars( cVars& vars ) { cInstrument::GetVars( vars ); vars << "Mode" << dtSaHpiAnnunciatorModeT << DATA( m_mode ) << VAR_END(); } }; // namespace TA openhpi-3.6.1/plugins/test_agent/server.h0000644000175100017510000000410412575647277017475 0ustar mohanmohan/* -*- c++ -*- * * (C) Copyright Pigeon Point Systems. 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTSERVERLITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #ifndef SERVER_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 #define SERVER_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 #include #include #ifdef _WIN32 #include #include #endif #include #include #include #include namespace TA { /************************************************************** * Sockets *************************************************************/ #ifdef _WIN32 typedef SOCKET SockFdT; const SockFdT InvalidSockFd = INVALID_SOCKET; #else typedef int SockFdT; const SockFdT InvalidSockFd = -1; #endif /************************************************************** * class cServer *************************************************************/ class cServer { public: explicit cServer( unsigned short port ); virtual ~cServer(); bool Init(); void Send( const char * data, size_t len ) const; private: cServer( const cServer& ); cServer& operator =( const cServer& ); private: virtual void WelcomeUser() const = 0; virtual void ProcessUserLine( const std::vector& line, bool& quit ) = 0; void SetClientSocket( SockFdT csock ); static gpointer ThreadProcAdapter( gpointer data ); void ThreadProc(); private: // data uint16_t m_port; bool m_initialized; volatile bool m_stop; GThread * m_thread; SockFdT m_csock; mutable GStaticMutex m_csock_lock; }; }; // namespace TA #endif // SERVER_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 openhpi-3.6.1/plugins/test_agent/version.rc0000644000175100017510000000163012575647277020032 0ustar mohanmohan#include LANGUAGE 0x09,0x01 // English(US) VS_VERSION_INFO VERSIONINFO FILEVERSION BINARY_VERSION PRODUCTVERSION BINARY_VERSION FILEFLAGSMASK 0 FILEFLAGS 0 FILEOS VOS_NT_WINDOWS32 FILETYPE VFT_DLL FILESUBTYPE VFT2_UNKNOWN BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904E4" // English(US), Multilingual BEGIN VALUE "Comments", "" VALUE "CompanyName", "OpenHPI Community (http://openhpi.org/)" VALUE "FileDescription", "OpenHPI Test Agent Plug-in" VALUE "FileVersion", VERSION VALUE "InternalName", "libtest_agent" VALUE "LegalCopyright", "OpenHPI is distributed under BSD license" VALUE "OriginalFilename", "libtest_agent.dll" VALUE "ProductName", "OpenHPI" VALUE "ProductVersion", VERSION END END END openhpi-3.6.1/plugins/test_agent/object.cpp0000644000175100017510000000641112575647277017773 0ustar mohanmohan/* -*- c++ -*- * * (C) Copyright Pigeon Point Systems. 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTOBJECTLITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #include #include #include #include "object.h" #include "vars.h" namespace TA { /************************************************************** * class cObject *************************************************************/ cObject::cObject( const std::string& name, SaHpiBoolT visible ) : m_name( name ), m_visible( visible ), m_new_visible( visible ), m_visible_ro( visible != SAHPI_FALSE ) // If object is visible at creation time, // It will be always visible { // empty } cObject::~cObject() { // empty } bool cObject::SetVisible( bool value ) { if ( m_visible_ro ) { return false; } m_new_visible = value ? SAHPI_TRUE : SAHPI_FALSE; if ( m_visible != m_new_visible ) { BeforeVisibilityChange(); m_visible = m_new_visible; AfterVisibilityChange(); } return true; } cObject * cObject::GetChild( const std::string& name ) const { Children children; GetChildren( children ); Children::const_iterator i = children.begin(); Children::const_iterator end = children.end(); for ( ; i != end; ++i ) { if ( name == (*i)->GetName() ) { return *i; } } return 0; } bool cObject::GetVar( const std::string& name, Var& var ) { cVars vars; GetVars( vars ); VarIter vi, vend; for ( vi = vars.begin(), vend = vars.end(); vi != vend; ++vi ) { if ( name == vi->name ) { var = *vi; return true; } } return false; } // Extensible interface void cObject::GetNB( std::string& nb ) const { nb.clear(); } void cObject::BeforeVisibilityChange() { // extend in inherited classes } void cObject::AfterVisibilityChange() { // extend in inherited classes } void cObject::GetNewNames( NewNames& names ) const { // extend in inherited classes } bool cObject::CreateChild( const std::string& name ) { // extend in inherited classes return false; } bool cObject::RemoveChild( const std::string& name ) { // extend in inherited classes return false; } void cObject::GetChildren( Children& children ) const { // extend in inherited classes } void cObject::GetVars( cVars& vars ) { vars << "Visible" << dtSaHpiBoolT << DATA( m_visible, m_new_visible ) << READONLY_IF( m_visible_ro ) << VAR_END(); // extend in inherited classes } void cObject::BeforeVarSet( const std::string& var_name ) { m_new_visible = m_visible; // extend in inherited classes } void cObject::AfterVarSet( const std::string& var_name ) { if ( m_visible != m_new_visible ) { BeforeVisibilityChange(); m_visible = m_new_visible; AfterVisibilityChange(); } // extend in inherited classes } }; // namespace TA openhpi-3.6.1/plugins/test_agent/sensor.cpp0000644000175100017510000004742312575647277020046 0ustar mohanmohan/* -*- c++ -*- * * (C) Copyright Pigeon Point Systems. 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTCONTROLLITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #include #include #include #include "codec.h" #include "sensor.h" #include "structs.h" namespace TA { /************************************************************** * Helper functions *************************************************************/ static const SaHpiEventStateT all_th_states = SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT; static const SaHpiSensorThdMaskT all_thd_mask = SAHPI_STM_LOW_MINOR | SAHPI_STM_LOW_MAJOR | SAHPI_STM_LOW_CRIT | SAHPI_STM_UP_MINOR | SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT | SAHPI_STM_UP_HYSTERESIS | SAHPI_STM_LOW_HYSTERESIS; static void MakeFloatNoReading( SaHpiSensorReadingT& r ) { r.IsSupported = SAHPI_FALSE; r.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; r.Value.SensorFloat64 = 0.0; } static void MakeFloatReading( SaHpiSensorReadingT& r, const SaHpiFloat64T& x ) { r.IsSupported = SAHPI_TRUE; r.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; r.Value.SensorFloat64 = x; } static SaHpiRdrTypeUnionT MakeDefaultSensorRec( SaHpiSensorNumT num ) { SaHpiRdrTypeUnionT data; SaHpiSensorRecT& rec = data.SensorRec; SaHpiSensorDataFormatT& df = rec.DataFormat; SaHpiSensorRangeT& range = df.Range; SaHpiSensorThdDefnT& thd = rec.ThresholdDefn; rec.Num = num; rec.Type = SAHPI_TEMPERATURE; rec.Category = SAHPI_EC_THRESHOLD; rec.EnableCtrl = SAHPI_TRUE; rec.EventCtrl = SAHPI_SEC_PER_EVENT; rec.Events = all_th_states; df.IsSupported = SAHPI_TRUE; df.ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64; df.BaseUnits = SAHPI_SU_DEGREES_C; df.ModifierUnits = SAHPI_SU_UNSPECIFIED; df.ModifierUse = SAHPI_SMUU_NONE; df.Percentage = SAHPI_FALSE; range.Flags = SAHPI_SRF_MIN | SAHPI_SRF_MAX | SAHPI_SRF_NOMINAL; MakeFloatReading( range.Max, 1000. ); MakeFloatReading( range.Min, -273.15 ); MakeFloatReading( range.Nominal, 36.6 ); MakeFloatNoReading( range.NormalMax ); MakeFloatNoReading( range.NormalMin ); df.AccuracyFactor = 0.1; thd.IsAccessible = SAHPI_TRUE; thd.ReadThold = all_thd_mask; thd.WriteThold = all_thd_mask; thd.Nonlinear = SAHPI_FALSE; rec.Oem = 0; return data; } static void MakeDefaultThresholds( SaHpiSensorThresholdsT& ths ) { MakeFloatReading( ths.LowCritical, 0.0 ); MakeFloatReading( ths.LowMajor, 30.0 ); MakeFloatReading( ths.LowMinor, 36.0 ); MakeFloatReading( ths.UpCritical, 100.0 ); MakeFloatReading( ths.UpMajor, 40.0 ); MakeFloatReading( ths.UpMinor, 37.0 ); MakeFloatReading( ths.PosThdHysteresis, 0.0 ); MakeFloatReading( ths.NegThdHysteresis, 0.0 ); } static void MakeDefaultReading( SaHpiSensorReadingT& reading ) { MakeFloatReading( reading, 36.7 ); } static void MergeThreshold( SaHpiSensorReadingT& th, const SaHpiSensorReadingT& th1, const SaHpiSensorReadingT& th2 ) { if ( th2.IsSupported != SAHPI_FALSE ) { th = th2; } else { th = th1; } } static void MergeThresholds( SaHpiSensorThresholdsT& ths, const SaHpiSensorThresholdsT& ths1, const SaHpiSensorThresholdsT& ths2 ) { MergeThreshold( ths.LowCritical, ths1.LowCritical, ths2.LowCritical ); MergeThreshold( ths.LowMajor, ths1.LowMajor, ths2.LowMajor ); MergeThreshold( ths.LowMinor, ths1.LowMinor, ths2.LowMinor ); MergeThreshold( ths.UpCritical, ths1.UpCritical, ths2.UpCritical ); MergeThreshold( ths.UpMajor, ths1.UpMajor, ths2.UpMajor ); MergeThreshold( ths.UpMinor, ths1.UpMinor, ths2.UpMinor ); MergeThreshold( ths.PosThdHysteresis, ths1.PosThdHysteresis, ths2.PosThdHysteresis ); MergeThreshold( ths.NegThdHysteresis, ths1.NegThdHysteresis, ths2.NegThdHysteresis ); } static bool IsThresholdCrossed( const SaHpiSensorReadingT& r, const SaHpiSensorReadingT& th, bool up ) { if ( r.IsSupported == SAHPI_FALSE ) { return false; } if ( th.IsSupported == SAHPI_FALSE ) { return false; } if ( r.Type != th.Type ) { return false; } if ( r.Type == SAHPI_SENSOR_READING_TYPE_INT64 ) { if ( up ) { return r.Value.SensorInt64 > th.Value.SensorInt64; } else { return r.Value.SensorInt64 < th.Value.SensorInt64; } } else if ( r.Type == SAHPI_SENSOR_READING_TYPE_UINT64 ) { if ( up ) { return r.Value.SensorUint64 > th.Value.SensorUint64; } else { return r.Value.SensorUint64 < th.Value.SensorUint64; } } else if ( r.Type == SAHPI_SENSOR_READING_TYPE_FLOAT64 ) { if ( up ) { return r.Value.SensorFloat64 > th.Value.SensorFloat64; } else { return r.Value.SensorFloat64 < th.Value.SensorFloat64; } } return false; } SaHpiSeverityT GetEventSeverity( SaHpiEventCategoryT cat, bool assertion, SaHpiEventStateT state ) { if ( cat == SAHPI_EC_THRESHOLD ) { switch ( state ) { case SAHPI_ES_LOWER_CRIT: case SAHPI_ES_UPPER_CRIT: return SAHPI_CRITICAL; case SAHPI_ES_LOWER_MAJOR: case SAHPI_ES_UPPER_MAJOR: return SAHPI_MAJOR; case SAHPI_ES_LOWER_MINOR: case SAHPI_ES_UPPER_MINOR: return SAHPI_MINOR; } } else if ( cat == SAHPI_EC_SEVERITY ) { switch ( state ) { case SAHPI_ES_INFORMATIONAL: return SAHPI_INFORMATIONAL; case SAHPI_ES_OK: return SAHPI_OK; case SAHPI_ES_MINOR_FROM_OK: case SAHPI_ES_MINOR_FROM_MORE: return SAHPI_MINOR; case SAHPI_ES_MAJOR_FROM_LESS: case SAHPI_ES_MAJOR_FROM_CRITICAL: return SAHPI_MAJOR; case SAHPI_ES_CRITICAL_FROM_LESS: case SAHPI_ES_CRITICAL: return SAHPI_CRITICAL; } } return SAHPI_INFORMATIONAL; } /************************************************************** * class cSensor *************************************************************/ const std::string cSensor::classname( "sen" ); cSensor::cSensor( cHandler& handler, cResource& resource, SaHpiSensorNumT num ) : cInstrument( handler, resource, AssembleNumberedObjectName( classname, num ), SAHPI_SENSOR_RDR, MakeDefaultSensorRec( num ) ), m_rec( GetRdr().RdrTypeUnion.SensorRec ) { m_enabled = SAHPI_TRUE; m_event_enabled = SAHPI_TRUE; m_states = SAHPI_ES_UNSPECIFIED; m_amask = m_rec.Events; m_dmask = SAHPI_ES_UNSPECIFIED; MakeDefaultThresholds( m_ths ); MakeDefaultReading( m_reading ); m_prev_states = m_states; m_new_enabled = m_enabled; m_new_event_enabled = m_event_enabled; m_new_states = m_states; m_new_amask = m_amask; m_new_dmask = m_dmask; } cSensor::~cSensor() { // empty } // HPI interface SaErrorT cSensor::GetReading( SaHpiSensorReadingT& r, SaHpiEventStateT& s ) const { if ( m_enabled == SAHPI_FALSE ) { return SA_ERR_HPI_INVALID_REQUEST; } r = m_reading; s = m_states; return SA_OK; } SaErrorT cSensor::GetThresholds( SaHpiSensorThresholdsT& ths ) const { if ( m_rec.Category != SAHPI_EC_THRESHOLD ) { return SA_ERR_HPI_INVALID_CMD; } if ( m_rec.ThresholdDefn.IsAccessible == SAHPI_FALSE ) { return SA_ERR_HPI_INVALID_CMD; } if ( m_rec.ThresholdDefn.ReadThold == 0 ) { return SA_ERR_HPI_INVALID_CMD; } ths = m_ths; return SA_OK; } SaErrorT cSensor::SetThresholds( const SaHpiSensorThresholdsT& ths ) { if ( m_rec.Category != SAHPI_EC_THRESHOLD ) { return SA_ERR_HPI_INVALID_CMD; } if ( m_rec.ThresholdDefn.IsAccessible == SAHPI_FALSE ) { return SA_ERR_HPI_INVALID_CMD; } if ( m_rec.ThresholdDefn.WriteThold == 0 ) { return SA_ERR_HPI_INVALID_CMD; } // TODO other checks // Writing to a threshold that is not writable. // Setting a threshold outside of the Min-Max range. // Setting a hysteresis value to a positive value greater // than an implementation-specific limit. // Thresholds are set out-of-order. // A negative number is provided for either // the postive hysteresis value or for the negative hysteresis. SaHpiSensorThresholdsT new_ths; MergeThresholds( new_ths, m_ths, ths ); m_ths = new_ths; CommitChanges(); return SA_OK; } SaErrorT cSensor::GetEnable( SaHpiBoolT& e ) const { e = m_enabled; return SA_OK; } SaErrorT cSensor::SetEnable( SaHpiBoolT e ) { if ( m_rec.EnableCtrl == SAHPI_FALSE ) { return SA_ERR_HPI_READ_ONLY; } m_new_enabled = e; CommitChanges(); return SA_OK; } SaErrorT cSensor::GetEventEnable( SaHpiBoolT& e ) const { e = m_event_enabled; return SA_OK; } SaErrorT cSensor::SetEventEnable( SaHpiBoolT e ) { if ( m_rec.EventCtrl == SAHPI_SEC_READ_ONLY ) { return SA_ERR_HPI_READ_ONLY; } m_new_event_enabled = e; CommitChanges(); return SA_OK; } SaErrorT cSensor::GetMasks( SaHpiEventStateT& amask, SaHpiEventStateT& dmask ) const { amask = m_amask; dmask = m_dmask; return SA_OK; } SaErrorT cSensor::SetMasks( SaHpiSensorEventMaskActionT act, SaHpiEventStateT amask, SaHpiEventStateT dmask ) { if ( m_rec.EventCtrl != SAHPI_SEC_PER_EVENT ) { return SA_ERR_HPI_READ_ONLY; } SaHpiEventStateT a = amask; SaHpiEventStateT d = dmask; if ( a == SAHPI_ALL_EVENT_STATES ) { a = m_rec.Events; } if ( d == SAHPI_ALL_EVENT_STATES ) { d = m_rec.Events; } if ( act == SAHPI_SENS_ADD_EVENTS_TO_MASKS ) { if ( ( a & m_rec.Events ) != a ) { return SA_ERR_HPI_INVALID_DATA; } if ( ( d & m_rec.Events ) != d ) { return SA_ERR_HPI_INVALID_DATA; } m_new_amask = m_amask | a; m_new_dmask = m_dmask | d; } else if ( act == SAHPI_SENS_REMOVE_EVENTS_FROM_MASKS ) { m_new_amask = m_amask & ( ~a ); m_new_dmask = m_dmask & ( ~d ); } else { return SA_ERR_HPI_INVALID_PARAMS; } CommitChanges(); return SA_OK; } void cSensor::GetVars( cVars& vars ) { cInstrument::GetVars( vars ); vars << "Enabled" << dtSaHpiBoolT << DATA( m_enabled, m_new_enabled ) << VAR_END(); vars << "EventsEnabled" << dtSaHpiBoolT << DATA( m_event_enabled, m_new_event_enabled ) << VAR_END(); Structs::GetVars( "Reading", m_reading, vars ); vars << IF( m_rec.Category != SAHPI_EC_THRESHOLD ) << "PreviousEventState" << dtSaHpiEventStateT << DATA( m_prev_states ) << READONLY() << VAR_END(); vars << IF( m_rec.Category == SAHPI_EC_THRESHOLD ) << "PreviousEventState" << dtSaHpiEventStateTThreshold << DATA( m_prev_states ) << READONLY() << VAR_END(); vars << IF( m_rec.Category != SAHPI_EC_THRESHOLD ) << "EventState" << dtSaHpiEventStateT << DATA( m_states, m_new_states ) << VAR_END(); vars << IF( m_rec.Category == SAHPI_EC_THRESHOLD ) << "EventState" << dtSaHpiEventStateTThreshold << DATA( m_states ) << READONLY() << VAR_END(); vars << "AssertEventMask" << dtSaHpiEventStateT << DATA( m_amask, m_new_amask ) << VAR_END(); vars << "DeassertEventMask" << dtSaHpiEventStateT << DATA( m_dmask, m_new_dmask ) << VAR_END(); if ( m_rec.Category == SAHPI_EC_THRESHOLD ) { Structs::GetVars( m_ths, vars ); } } void cSensor::BeforeVarSet( const std::string& var_name ) { cInstrument::BeforeVarSet( var_name ); m_new_enabled = m_enabled; m_new_event_enabled = m_event_enabled; m_new_states = m_states; m_new_amask = m_amask; m_new_dmask = m_dmask; } void cSensor::AfterVarSet( const std::string& var_name ) { cInstrument::AfterVarSet( var_name ); CommitChanges(); } // Handling RDR changes void cSensor::UpdateRdr( const std::string& field_name, SaHpiRdrTypeUnionT& data ) { cInstrument::UpdateRdr( field_name, data ); SaHpiSensorRecT& rec = data.SensorRec; SaHpiSensorDataFormatT& df = rec.DataFormat; SaHpiSensorRangeT& range = df.Range; SaHpiSensorThdDefnT& thd = rec.ThresholdDefn; if ( field_name == "Rdr.SensorRec.Category" ) { if ( rec.Category == SAHPI_EC_THRESHOLD ) { thd.IsAccessible = SAHPI_TRUE; } else { thd.IsAccessible = SAHPI_FALSE; thd.ReadThold = 0; thd.WriteThold = 0; } } if ( field_name == "Rdr.SensorRec.DataFormat.IsSupported" ) { m_reading.IsSupported = df.IsSupported; } if ( field_name == "Rdr.SensorRec.DataFormat.ReadingType" ) { range.Max.Type = df.ReadingType; range.Min.Type = df.ReadingType; range.Nominal.Type = df.ReadingType; range.NormalMax.Type = df.ReadingType; range.NormalMin.Type = df.ReadingType; m_reading.Type = df.ReadingType; m_ths.LowCritical.Type = df.ReadingType; m_ths.LowMajor.Type = df.ReadingType; m_ths.LowMinor.Type = df.ReadingType; m_ths.UpCritical.Type = df.ReadingType; m_ths.UpMajor.Type = df.ReadingType; m_ths.UpMinor.Type = df.ReadingType; m_ths.PosThdHysteresis.Type = df.ReadingType; m_ths.NegThdHysteresis.Type = df.ReadingType; } } SaHpiEventStateT cSensor::CalculateThresholdEventStates() const { // TODO hysteresis SaHpiEventStateT states = SAHPI_ES_UNSPECIFIED; bool rc; rc = IsThresholdCrossed( m_reading, m_ths.LowCritical, false ); if ( rc ) { states |= SAHPI_ES_LOWER_CRIT; } rc = IsThresholdCrossed( m_reading, m_ths.LowMajor, false ); if ( rc ) { states |= SAHPI_ES_LOWER_MAJOR; } rc = IsThresholdCrossed( m_reading, m_ths.LowMinor, false ); if ( rc ) { states |= SAHPI_ES_LOWER_MINOR; } rc = IsThresholdCrossed( m_reading, m_ths.UpMinor, true ); if ( rc ) { states |= SAHPI_ES_UPPER_MINOR; } rc = IsThresholdCrossed( m_reading, m_ths.UpMajor, true ); if ( rc ) { states |= SAHPI_ES_UPPER_MAJOR; } rc = IsThresholdCrossed( m_reading, m_ths.UpCritical, true ); if ( rc ) { states |= SAHPI_ES_UPPER_CRIT; } return states; } void cSensor::CommitChanges() { bool send_enable_event = false; bool states_changed = false; if ( m_enabled != m_new_enabled ) { m_enabled = m_new_enabled; send_enable_event = true; } if ( m_event_enabled != m_new_event_enabled ) { m_event_enabled = m_new_event_enabled; send_enable_event = true; } if ( m_rec.Category == SAHPI_EC_THRESHOLD ) { m_new_states = CalculateThresholdEventStates(); } if ( m_states != m_new_states ) { m_prev_states = m_states; m_states = m_new_states; states_changed = true; } if ( m_amask != m_new_amask ) { m_amask = m_new_amask; send_enable_event = true; } if ( m_dmask != m_new_dmask ) { m_dmask = m_new_dmask; send_enable_event = true; } if ( send_enable_event ) { PostEnableChangeEvent(); } // Check if event shall be generated if ( m_enabled == SAHPI_FALSE ) { return; } if ( m_event_enabled == SAHPI_FALSE ) { return; } if ( !states_changed ) { return; } SaHpiEventStateT a = m_states & ( ~m_prev_states ) & m_amask; SaHpiEventStateT d = m_prev_states & ( ~m_states ) & m_dmask; for ( size_t i = 0; i < 15; ++i ) { SaHpiEventStateT s = ( 1 << i ); if ( s & a ) { PostEvent( true, s ); } if ( s & d ) { PostEvent( false, s ); } } } void cSensor::PostEnableChangeEvent() const { SaHpiEventUnionT data; SaHpiSensorEnableChangeEventT& sece = data.SensorEnableChangeEvent; sece.SensorNum = m_rec.Num; sece.SensorType = m_rec.Type; sece.EventCategory = m_rec.Category; sece.SensorEnable = m_enabled; sece.SensorEventEnable = m_event_enabled; sece.AssertEventMask = m_amask; sece.DeassertEventMask = m_dmask; sece.OptionalDataPresent = SAHPI_SEOD_CURRENT_STATE; sece.CurrentState = m_states; cInstrument::PostEvent( SAHPI_ET_SENSOR_ENABLE_CHANGE, data, SAHPI_INFORMATIONAL ); } void cSensor::PostEvent( bool assertion, SaHpiEventStateT state ) const { SaHpiEventUnionT data; SaHpiSensorEventT& se = data.SensorEvent; se.SensorNum = m_rec.Num; se.SensorType = m_rec.Type; se.EventCategory = m_rec.Category; se.Assertion = assertion ? SAHPI_TRUE : SAHPI_FALSE; se.EventState = state; se.OptionalDataPresent = SAHPI_SOD_PREVIOUS_STATE | SAHPI_SOD_CURRENT_STATE; MakeFloatNoReading( se.TriggerReading ); MakeFloatNoReading( se.TriggerThreshold ); se.PreviousState = m_prev_states; se.CurrentState = m_states; //se.Oem SaHpiUint32T SAHPI_SOD_OEM //se.SensorSpecific SaHpiUint32T SAHPI_SOD_SENSOR_SPECIFIC if ( m_rec.Category == SAHPI_EC_THRESHOLD ) { se.OptionalDataPresent |= SAHPI_SOD_TRIGGER_READING; se.TriggerReading = m_reading; // TODO SAHPI_SOD_TRIGGER_THRESHOLD #if 0 #define SAHPI_SOD_TRIGGER_THRESHOLD (SaHpiSensorOptionalDataT)0x02 #endif //se.TriggerThreshold SaHpiSensorReadingT } SaHpiSeverityT sev = GetEventSeverity( m_rec.Category, assertion, state ); cInstrument::PostEvent( SAHPI_ET_SENSOR, data, sev ); } }; // namespace TA openhpi-3.6.1/plugins/test_agent/fumi.cpp0000644000175100017510000002551312575647277017471 0ustar mohanmohan/* -*- c++ -*- * * (C) Copyright Pigeon Point Systems. 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTWATCHDOGLITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #include #include #include #include #include "bank.h" #include "codec.h" #include "fumi.h" #include "structs.h" #include "utils.h" namespace TA { /************************************************************** * Helper functions *************************************************************/ static SaHpiRdrTypeUnionT MakeDefaultFumiRec( SaHpiFumiNumT num ) { SaHpiRdrTypeUnionT data; SaHpiFumiRecT& rec = data.FumiRec; rec.Num = num; rec.AccessProt = SAHPI_FUMI_PROT_LOCAL; rec.Capability = SAHPI_FUMI_CAP_ROLLBACK | SAHPI_FUMI_CAP_BACKUP | SAHPI_FUMI_CAP_TARGET_VERIFY | SAHPI_FUMI_CAP_TARGET_VERIFY_MAIN | SAHPI_FUMI_CAP_COMPONENTS | SAHPI_FUMI_CAP_AUTOROLLBACK | SAHPI_FUMI_CAP_AUTOROLLBACK_CAN_BE_DISABLED; rec.NumBanks = 0; rec.Oem = 0; return data; } static SaHpiFumiSpecInfoT MakeDefaultSpecInfo() { SaHpiFumiSpecInfoT spec_info; spec_info.SpecInfoType = SAHPI_FUMI_SPEC_INFO_SAF_DEFINED; spec_info.SpecInfoTypeUnion.SafDefined.SpecID = SAHPI_FUMI_SPEC_HPM1; spec_info.SpecInfoTypeUnion.SafDefined.RevisionID = 0; return spec_info; } static SaHpiFumiServiceImpactDataT MakeDefaultServiceImpact() { SaHpiFumiServiceImpactDataT service_impact; service_impact.NumEntities = 0; for ( size_t i = 0; i < SAHPI_FUMI_MAX_ENTITIES_IMPACTED; ++i ) { MakeUnspecifiedHpiEntityPath( service_impact.ImpactedEntities[i].ImpactedEntity ); service_impact.ImpactedEntities[i].ServiceImpact = SAHPI_FUMI_PROCESS_NONDEGRADING; } return service_impact; } /************************************************************** * Functors for working with banks *************************************************************/ struct BankDeleter { void operator ()( cBank * bank ) { delete bank; } }; struct ObjectCollector { explicit ObjectCollector( cObject::Children& _children ) : children( _children ) { // empty } void operator ()( cBank * bank ) { if ( bank ) { children.push_back( bank ); } } cObject::Children& children; }; /************************************************************** * class cFumi *************************************************************/ const std::string cFumi::classname( "fumi" ); cFumi::cFumi( cHandler& handler, cResource& resource, SaHpiFumiNumT num ) : cInstrument( handler, resource, AssembleNumberedObjectName( classname, num ), SAHPI_FUMI_RDR, MakeDefaultFumiRec( num ) ), m_rec( GetRdr().RdrTypeUnion.FumiRec ), m_spec_info( MakeDefaultSpecInfo() ), m_service_impact( MakeDefaultServiceImpact() ), m_auto_rb_disabled( SAHPI_FALSE ) { m_next.pass.activate = SAHPI_TRUE; // Create logical bank m_banks.push_back( new cBank( m_handler, *this, 0 ) ); } cFumi::~cFumi() { BankDeleter deleter; std::for_each( m_banks.begin(), m_banks.end(), deleter ); m_banks.clear(); } SaHpiFumiCapabilityT cFumi::Capabilities() const { return m_rec.Capability; } bool cFumi::CheckProtocol( const std::string& proto ) const { if ( proto == "tftp" ) { return ( m_rec.AccessProt & SAHPI_FUMI_PROT_TFTP ) != 0; } if ( proto == "ftp" ) { return ( m_rec.AccessProt & SAHPI_FUMI_PROT_FTP ) != 0; } if ( proto == "http" ) { return ( m_rec.AccessProt & SAHPI_FUMI_PROT_HTTP ) != 0; } if ( proto == "https" ) { return ( m_rec.AccessProt & SAHPI_FUMI_PROT_HTTP ) != 0; } if ( proto == "ldap" ) { return ( m_rec.AccessProt & SAHPI_FUMI_PROT_LDAP ) != 0; } if ( proto == "file" ) { return ( m_rec.AccessProt & SAHPI_FUMI_PROT_LOCAL ) != 0; } if ( proto == "local" ) { return ( m_rec.AccessProt & SAHPI_FUMI_PROT_LOCAL ) != 0; } if ( proto == "nfs" ) { return ( m_rec.AccessProt & SAHPI_FUMI_PROT_NFS ) != 0; } if ( proto == "dbaccess" ) { return ( m_rec.AccessProt & SAHPI_FUMI_PROT_DBACCESS ) != 0; } return false; } cBank * cFumi::GetBank( SaHpiBankNumT bnum ) const { return ( bnum < m_banks.size() ) ? m_banks[bnum] : 0; } bool cFumi::IsAutoRollbackDisabled() const { return ( m_auto_rb_disabled != SAHPI_FALSE ); } bool cFumi::ShallNextActivationPass() const { return ( m_next.pass.activate != SAHPI_FALSE ); } void cFumi::PostEvent( SaHpiBankNumT bnum, SaHpiFumiUpgradeStatusT status ) { SaHpiEventUnionT data; SaHpiFumiEventT& fe = data.FumiEvent; fe.FumiNum = m_rec.Num; fe.BankNum = bnum; fe.UpgradeStatus = status; cInstrument::PostEvent( SAHPI_ET_FUMI, data, SAHPI_INFORMATIONAL ); } // HPI interface SaErrorT cFumi::GetSpecInfo( SaHpiFumiSpecInfoT& specinfo ) const { specinfo = m_spec_info; return SA_OK; } SaErrorT cFumi::GetServiceImpact( SaHpiFumiServiceImpactDataT& data ) const { data = m_service_impact; return SA_OK; } SaErrorT cFumi::SetBootOrder( SaHpiBankNumT bnum, SaHpiUint32T position ) { if ( ( m_rec.Capability & SAHPI_FUMI_CAP_BANKREORDER ) == 0 ) { return SA_ERR_HPI_CAPABILITY; } if ( bnum == 0 ) { return SA_ERR_HPI_INVALID_DATA; } if ( bnum >= m_banks.size() ) { return SA_ERR_HPI_INVALID_DATA; } if ( ( position == 0 ) || ( position >= m_banks.size() ) ) { return SA_ERR_HPI_INVALID_DATA; } std::vector sorted; for ( size_t i = 1, n = m_banks.size(); i < n; ++i ) { if ( i != bnum ) { sorted.push_back( MakeUint16T( m_banks[i]->Position(), i ) ); } } std::sort( sorted.begin(), sorted.end() ); uint8_t new_pos = 1; for ( size_t i = 0, n = sorted.size(); i < n; ++i ) { if ( new_pos == position ) { ++new_pos; } m_banks[GetLowByte( sorted[i] )]->SetPosition( new_pos ); ++new_pos; } m_banks[bnum]->SetPosition( position ); return SA_OK; } SaErrorT cFumi::GetAutoRollbackDisabled( SaHpiBoolT& disable ) const { if ( ( m_rec.Capability & SAHPI_FUMI_CAP_AUTOROLLBACK ) == 0 ) { return SA_ERR_HPI_CAPABILITY; } disable = m_auto_rb_disabled; return SA_OK; } SaErrorT cFumi::SetAutoRollbackDisabled( SaHpiBoolT disable ) { if ( ( m_rec.Capability & SAHPI_FUMI_CAP_AUTOROLLBACK ) == 0 ) { return SA_ERR_HPI_CAPABILITY; } if ( ( m_rec.Capability & SAHPI_FUMI_CAP_AUTOROLLBACK_CAN_BE_DISABLED ) == 0 ) { return SA_ERR_HPI_CAPABILITY; } m_auto_rb_disabled = disable; return SA_OK; } SaErrorT cFumi::StartActivation( SaHpiBoolT logical ) { if ( logical == SAHPI_FALSE ) { if ( m_banks.size() < 2 ) { return SA_ERR_HPI_INVALID_REQUEST; } const size_t n = m_banks.size(); for ( size_t pos = 1; pos < n; ++pos ) { size_t id; for ( id = 1; id < n; ++id ) { if ( m_banks[id]->Position() == pos ) { const SaHpiFumiBankStateT st = m_banks[id]->State(); if ( ( st == SAHPI_FUMI_BANK_VALID ) || ( st == SAHPI_FUMI_BANK_ACTIVE ) ) { break; } } } if ( id < n ) { return m_banks[id]->StartActivation( m_next.pass.activate ); } } return SA_ERR_HPI_INVALID_REQUEST; } else { return m_banks[0]->StartActivation( m_next.pass.activate ); } } // cObject virtual functions void cFumi::GetNB( std::string& nb ) const { cObject::GetNB( nb ); nb += "- Test Agent supports creation of a bank with\n"; nb += " id == current number of banks.\n"; nb += "- Test Agent supports removal of a bank with.\n"; nb += " id == (current number of banks - 1).\n"; nb += "- Test Agent does not support Logical Bank (id == 0) removal.\n"; nb += "- Be careful when removing a bank:\n"; nb += "-- BankNum in FUMI RDR is not updated in that case.\n"; nb += "-- Any FUMI API directed to the removed bank will fail.\n"; nb += "-- Any FUMI asynchronous operation on the bank can fail or cause crash.\n"; } void cFumi::GetNewNames( cObject::NewNames& names ) const { cObject::GetNewNames( names ); names.push_back( cBank::classname + "-XXX" ); } bool cFumi::CreateChild( const std::string& name ) { bool rc; rc = cObject::CreateChild( name ); if ( rc ) { return true; } std::string cname; SaHpiUint32T id; rc = DisassembleNumberedObjectName( name, cname, id ); if ( !rc ) { return false; } if ( cname != cBank::classname ) { return false; } if ( id != m_banks.size() ) { return false; } m_banks.push_back( new cBank( m_handler, *this, id ) ); HandleRdrChange( "Rdr.FumiRec.NumBanks" ); return true; } bool cFumi::RemoveChild( const std::string& name ) { bool rc; rc = cObject::RemoveChild( name ); if ( rc ) { return true; } std::string cname; SaHpiUint32T id; rc = DisassembleNumberedObjectName( name, cname, id ); if ( !rc ) { return false; } if ( ( id + 1 ) != m_banks.size() ) { return false; } // Do not allow removing logical bank if ( id == 0 ) { return false; } delete m_banks[id]; m_banks[id] = 0; m_banks.resize( id ); return true; } void cFumi::GetChildren( Children& children ) const { cObject::GetChildren( children ); ObjectCollector collector( children ); std::for_each( m_banks.begin(), m_banks.end(), collector ); } void cFumi::GetVars( cVars& vars ) { cInstrument::GetVars( vars ); Structs::GetVars( m_spec_info, vars ); Structs::GetVars( m_service_impact, vars ); vars << "AutoRollbackDisabled" << dtSaHpiBoolT << DATA( m_auto_rb_disabled ) << VAR_END(); vars << "Next.Pass.Activate" << dtSaHpiBoolT << DATA( m_next.pass.activate ) << VAR_END(); } // Handling RDR changes void cFumi::UpdateRdr( const std::string& field_name, SaHpiRdrTypeUnionT& data ) { cInstrument::UpdateRdr( field_name, data ); if ( field_name == "Rdr.FumiRec.NumBanks" ) { data.FumiRec.NumBanks = m_banks.size() - 1; } } }; // namespace TA openhpi-3.6.1/plugins/test_agent/vars.cpp0000644000175100017510000000321012575647277017472 0ustar mohanmohan/* -*- c++ -*- * * (C) Copyright Pigeon Point Systems. 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTVARLITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #include "vars.h" namespace TA { /************************************************************** * cVars *************************************************************/ cVars::cVars() : m_cond( true ), m_ro_cond( false ) { // empty } cVars::~cVars() { // empty } cVars& cVars::operator <<( const IF& i_f ) { m_cond = i_f.cond; return *this; } cVars& cVars::operator <<( const std::string& name ) { m_pending.name = name; return *this; } cVars& cVars::operator <<( eDataType type ) { m_pending.type = type; return *this; } cVars& cVars::operator <<( const READONLY& ) { m_ro_cond = true; return *this; } cVars& cVars::operator <<( const READONLY_IF& rif ) { m_ro_cond = rif.cond; return *this; } cVars& cVars::operator <<( const DATA& d ) { m_pending.rdata = d.rdata; m_pending.wdata = d.wdata; return *this; } cVars& cVars::operator <<( const VAR_END& ) { if ( m_cond ) { if ( m_ro_cond ) { m_pending.wdata = 0; } push_back( m_pending ); } m_cond = true; m_ro_cond = false; m_pending = Var(); return *this; } }; // namespace TA openhpi-3.6.1/plugins/test_agent/object.h0000644000175100017510000000433012575647277017436 0ustar mohanmohan/* -*- c++ -*- * * (C) Copyright Pigeon Point Systems. 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTOBJECTLITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #ifndef OBJECT_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 #define OBJECT_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 #include #include #include #include "vars.h" namespace TA { /************************************************************** * class cObject *************************************************************/ class cObject { public: typedef std::list NewNames; typedef std::list Children; public: const std::string& GetName() const { return m_name; } bool IsVisible() const { return m_visible != SAHPI_FALSE; } bool SetVisible( bool value ); cObject * GetChild( const std::string& name ) const; bool GetVar( const std::string& name, Var& var ); public: // Extensible interface virtual void GetNB( std::string& nb ) const; virtual void BeforeVisibilityChange(); virtual void AfterVisibilityChange(); virtual void GetNewNames( NewNames& names ) const; virtual bool CreateChild( const std::string& name ); virtual bool RemoveChild( const std::string& name ); virtual void GetChildren( Children& children ) const; virtual void GetVars( cVars& vars ); virtual void BeforeVarSet( const std::string& var_name ); virtual void AfterVarSet( const std::string& var_name ); protected: explicit cObject( const std::string& name, SaHpiBoolT visible = SAHPI_TRUE ); virtual ~cObject(); private: cObject( const cObject& ); cObject& operator =( const cObject& ); private: // data const std::string m_name; SaHpiBoolT m_visible; SaHpiBoolT m_new_visible; bool m_visible_ro; }; }; // namespace TA #endif // OBJECT_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 openhpi-3.6.1/plugins/test_agent/timers.cpp0000644000175100017510000001055012575647277020027 0ustar mohanmohan/* This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTUTILSLITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #include #include "timers.h" namespace TA { /************************************************************** * Helper functions *************************************************************/ struct CallbackPred { bool operator ()( const Timer& item ) const { return item.callback == callback; } const cTimerCallback * callback; }; /********************************************************** * NB: comparison relies on the fact * that x1.tv_usec and x2.tv_usec both < 1000000. * I.e. GTimeVal data is valid. *********************************************************/ bool operator <( const GTimeVal& x1, const GTimeVal& x2 ) { if ( x1.tv_sec != x2.tv_sec ) { return x1.tv_sec < x2.tv_sec; } else { return x1.tv_usec < x2.tv_usec; } } /************************************************************** * class cTimers *************************************************************/ cTimers::cTimers() : m_thread( 0 ), m_cond( g_cond_new() ), m_mutex( g_mutex_new() ), m_stop( false ) { } cTimers::~cTimers() { if ( m_thread ) { m_stop = true; g_mutex_lock( m_mutex ); g_cond_signal( m_cond ); g_mutex_unlock( m_mutex ); g_thread_join( m_thread ); } g_mutex_free( m_mutex ); g_cond_free( m_cond ); } bool cTimers::Start() { m_thread = g_thread_create( ThreadFuncAdapter, this, TRUE, 0 ); //g_usleep( 1000 ); return ( m_thread != 0 ); } void cTimers::SetTimer( cTimerCallback * callback, SaHpiTimeoutT timeout ) { if ( timeout == SAHPI_TIMEOUT_IMMEDIATE ) { callback->TimerEvent(); return; } else if ( timeout == SAHPI_TIMEOUT_BLOCK ) { return; } glong sec = timeout / 1000000000LL; // TODO possible overflow glong usec = ( timeout % 1000000000LL ) / 1000LL; Timer timer; timer.callback = callback; g_get_current_time( &timer.expire ); timer.expire.tv_sec += sec; timer.expire.tv_usec += usec; if ( timer.expire.tv_usec > 1000000L ) { ++timer.expire.tv_sec; timer.expire.tv_usec -= 1000000L; } g_mutex_lock( m_mutex ); m_timers.push_back( timer ); g_cond_signal( m_cond ); g_mutex_unlock( m_mutex ); } void cTimers::CancelTimer( const cTimerCallback * callback ) { g_mutex_lock( m_mutex ); CallbackPred pred; pred.callback = callback; m_timers.remove_if( pred ); g_cond_signal( m_cond ); g_mutex_unlock( m_mutex ); } bool cTimers::HasTimerSet( const cTimerCallback * callback ) { g_mutex_lock( m_mutex ); CallbackPred pred; pred.callback = callback; Timers::const_iterator iter = std::find_if( m_timers.begin(), m_timers.end(), pred ); bool has = iter != m_timers.end(); g_mutex_unlock( m_mutex ); return has; } gpointer cTimers::ThreadFuncAdapter( gpointer data ) { cTimers * me = reinterpret_cast(data); me->ThreadFunc(); return 0; } void cTimers::ThreadFunc() { if ( m_stop ) { return; } g_mutex_lock( m_mutex ); GTimeVal now, next; while ( !m_stop ) { g_get_current_time( &next ); g_time_val_add( &next, 1800000000L /* + 30 min from now */ ); Timers rest; while ( ( !m_stop ) && ( !m_timers.empty() ) ) { Timer t = m_timers.front(); m_timers.pop_front(); g_get_current_time( &now ); if ( now < t.expire ) { rest.push_back( t ); if ( t.expire < next ) { next = t.expire; } } else { g_mutex_unlock( m_mutex ); // TODO Callback can be deleted there t.callback->TimerEvent(); g_mutex_lock( m_mutex ); } } if ( m_stop ) { break; } m_timers.swap( rest ); g_cond_timed_wait( m_cond, m_mutex, &next ); } g_mutex_unlock( m_mutex ); } }; // namespace TA openhpi-3.6.1/plugins/test_agent/fumi.h0000644000175100017510000000556612575647277017144 0ustar mohanmohan/* -*- c++ -*- * * (C) Copyright Pigeon Point Systems. 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTFUMILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #ifndef FUMI_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 #define FUMI_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 #include #include #include #include "instrument.h" namespace TA { /************************************************************** * class cFumi *************************************************************/ class cBank; class cFumi : public cInstrument { public: static const std::string classname; explicit cFumi( cHandler& handler, cResource& resource, SaHpiFumiNumT num ); virtual ~cFumi(); public: SaHpiFumiCapabilityT Capabilities() const; bool CheckProtocol( const std::string& proto ) const; cBank * GetBank( SaHpiBankNumT bnum ) const; bool IsAutoRollbackDisabled() const; bool ShallNextActivationPass() const; void PostEvent( SaHpiBankNumT bnum, SaHpiFumiUpgradeStatusT status ); public: // HPI interface SaErrorT GetSpecInfo( SaHpiFumiSpecInfoT& specinfo ) const; SaErrorT GetServiceImpact( SaHpiFumiServiceImpactDataT& data ) const; SaErrorT SetBootOrder( SaHpiBankNumT bnum, SaHpiUint32T position ); SaErrorT GetAutoRollbackDisabled( SaHpiBoolT& disable ) const; SaErrorT SetAutoRollbackDisabled( SaHpiBoolT disable ); SaErrorT StartActivation( SaHpiBoolT logical ); protected: // cObject virtual functions virtual void GetNB( std::string& nb ) const; virtual void GetNewNames( cObject::NewNames& names ) const; virtual bool CreateChild( const std::string& name ); virtual bool RemoveChild( const std::string& name ); virtual void GetChildren( cObject::Children& children ) const; virtual void GetVars( cVars& vars ); private: // Handling RDR changes virtual void UpdateRdr( const std::string& field_name, SaHpiRdrTypeUnionT& data ); private: cFumi( const cFumi& ); cFumi& operator =( const cFumi& ); private: virtual SaHpiCapabilitiesT RequiredResourceCap() const { return SAHPI_CAPABILITY_FUMI; } private: // data const SaHpiFumiRecT& m_rec; SaHpiFumiSpecInfoT m_spec_info; SaHpiFumiServiceImpactDataT m_service_impact; SaHpiBoolT m_auto_rb_disabled; std::vector m_banks; struct { struct { SaHpiBoolT activate; } pass; } m_next; }; }; // namespace TA #endif // FUMI_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 openhpi-3.6.1/plugins/test_agent/utils.h0000644000175100017510000000600112575647277017325 0ustar mohanmohan/* -*- c++ -*- * * (C) Copyright Pigeon Point Systems. 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTUTILSLITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #ifndef UTILS_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 #define UTILS_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 #include #include #include #include namespace TA { /************************************************************** * uint16_t <-> uint8_t *************************************************************/ inline uint16_t MakeUint16T( uint8_t high, uint8_t low ) { return ( ( (uint16_t)high ) << 8 ) | ( (uint16_t)low ); } inline uint8_t GetHighByte( uint16_t x ) { return (uint8_t)( x >> 8 ); } inline uint8_t GetLowByte( uint16_t x ) { return (uint8_t)( x & 0xFFU ); } /************************************************************** * Cast Templates *************************************************************/ template static inline const T * ConstPtr( const void * ptr ) { return reinterpret_cast(ptr); } template static inline T * Ptr( void * ptr ) { return reinterpret_cast(ptr); } template static inline const T& ConstRef( const void * ptr ) { return *ConstPtr( ptr ); } template static inline T& Ref( void * ptr ) { return *Ptr( ptr ); } /************************************************************** * cLocker: class for for locking object while in scope *************************************************************/ template class cLocker { public: explicit cLocker( T * t ) : m_t( t ) { m_t->Lock(); } ~cLocker() { m_t->Unlock(); } private: cLocker( const cLocker& ); cLocker& operator =( const cLocker& ); private: // data T * m_t; }; /************************************************************** * Entity Path Helpers *************************************************************/ void MakeUnspecifiedHpiEntityPath( SaHpiEntityPathT& ep ); /************************************************************** * Text Buffer Helpers *************************************************************/ void MakeHpiTextBuffer( SaHpiTextBufferT& tb, const char * s ); void MakeHpiTextBuffer( SaHpiTextBufferT& tb, const char * s, size_t size ); void MakeHpiTextBuffer( SaHpiTextBufferT& tb, char c, size_t size ); void FormatHpiTextBuffer( SaHpiTextBufferT& tb, const char * fmt, ... ); void vFormatHpiTextBuffer( SaHpiTextBufferT& tb, const char * fmt, va_list ap ); void AppendToTextBuffer( SaHpiTextBufferT& tb, const SaHpiTextBufferT& appendix ); }; // namespace TA #endif // UTILS_H_FB2B5DD5_4E7D_49F5_9397_C2FEC21B4010 openhpi-3.6.1/plugins/test_agent/control.cpp0000644000175100017510000002303512575647277020206 0ustar mohanmohan/* -*- c++ -*- * * (C) Copyright Pigeon Point Systems. 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTCONTROLLITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #include #include #include #include #include #include "codec.h" #include "control.h" #include "structs.h" #include "utils.h" namespace TA { /************************************************************** * Helper functions *************************************************************/ static const char fillchar = 'X'; static void MakeDefaultControlState( const SaHpiRdrTypeUnionT& data, SaHpiCtrlStateT& state ) { state.Type = SAHPI_CTRL_TYPE_TEXT; state.StateUnion.Text = data.CtrlRec.TypeUnion.Text.Default; } static SaHpiRdrTypeUnionT MakeDefaultCtrlRec( SaHpiCtrlNumT num ) { SaHpiRdrTypeUnionT data; SaHpiCtrlRecT& rec = data.CtrlRec; SaHpiCtrlRecTextT& tr = rec.TypeUnion.Text; rec.Num = num; rec.OutputType = SAHPI_CTRL_GENERIC; rec.Type = SAHPI_CTRL_TYPE_TEXT; tr.MaxChars = 10; tr.MaxLines = 3; tr.Language = SAHPI_LANG_ENGLISH; tr.DataType = SAHPI_TL_TYPE_TEXT; tr.Default.Line = SAHPI_TLN_ALL_LINES; tr.Default.Text.DataType = tr.DataType; tr.Default.Text.Language = tr.Language; tr.Default.Text.DataLength = tr.MaxLines * tr.MaxChars; memset( &tr.Default.Text.Data[0], fillchar, SAHPI_MAX_TEXT_BUFFER_LENGTH ); rec.DefaultMode.Mode = SAHPI_CTRL_MODE_AUTO; rec.DefaultMode.ReadOnly = SAHPI_FALSE; rec.WriteOnly = SAHPI_FALSE; rec.Oem = 0; return data; } /************************************************************** * class cControl *************************************************************/ const std::string cControl::classname( "ctrl"); static const std::string line_name( "Line" ); cControl::cControl( cHandler& handler, cResource& resource, SaHpiCtrlNumT num ) : cInstrument( handler, resource, AssembleNumberedObjectName( classname, num ), SAHPI_CTRL_RDR, MakeDefaultCtrlRec( num ) ), m_rec( GetRdr().RdrTypeUnion.CtrlRec ), m_mode( m_rec.DefaultMode.Mode ) { MakeDefaultControlState( GetRdr().RdrTypeUnion, m_state ); if ( m_rec.Type == SAHPI_CTRL_TYPE_TEXT ) { size_t nlines = m_rec.TypeUnion.Text.MaxLines; size_t nchars = m_rec.TypeUnion.Text.MaxChars; m_lines.resize( nlines ); for ( size_t n = 0; n < nlines; ++n ) { MakeHpiTextBuffer( m_lines[n], fillchar, nchars ); } } } cControl::~cControl() { // empty } // HPI interface SaErrorT cControl::Get( SaHpiCtrlModeT& mode, SaHpiCtrlStateT& state ) const { if ( m_rec.WriteOnly != SAHPI_FALSE ) { return SA_ERR_HPI_INVALID_CMD; } mode = m_mode; if ( m_rec.Type == SAHPI_CTRL_TYPE_TEXT ) { size_t nlines = m_lines.size(); size_t n = state.StateUnion.Text.Line; state.Type = SAHPI_CTRL_TYPE_TEXT; state.StateUnion.Text.Line = n; state.StateUnion.Text.Text.DataType = m_rec.TypeUnion.Text.DataType; state.StateUnion.Text.Text.Language = m_rec.TypeUnion.Text.Language; state.StateUnion.Text.Text.DataLength = 0; if ( n == SAHPI_TLN_ALL_LINES ) { // merge all lines for ( size_t i = 0; i < nlines; ++i ) { AppendToTextBuffer( state.StateUnion.Text.Text, m_lines[i] ); } } else if ( n <= nlines ) { state.StateUnion.Text.Text = m_lines[n - 1]; } else { return SA_ERR_HPI_INVALID_DATA; } } else { state = m_state; } return SA_OK; } SaErrorT cControl::Set( SaHpiCtrlModeT mode, const SaHpiCtrlStateT& state ) { if ( m_rec.DefaultMode.ReadOnly != SAHPI_FALSE ) { if ( m_mode != mode ) { return SA_ERR_HPI_READ_ONLY; } } m_mode = mode; if ( mode == SAHPI_CTRL_MODE_AUTO ) { return SA_OK; } if ( state.Type != m_rec.Type ) { return SA_ERR_HPI_INVALID_DATA; } SaErrorT rv = SA_OK; if ( m_rec.Type == SAHPI_CTRL_TYPE_DIGITAL ) { rv = CheckStateDigital( state.StateUnion.Digital ); } else if ( m_rec.Type == SAHPI_CTRL_TYPE_ANALOG ) { rv = CheckStateAnalog( state.StateUnion.Analog ); } else if ( m_rec.Type == SAHPI_CTRL_TYPE_STREAM ) { rv = CheckStateStream( state.StateUnion.Stream ); } else if ( m_rec.Type == SAHPI_CTRL_TYPE_TEXT ) { rv = CheckStateText( state.StateUnion.Text ); } if ( rv != SA_OK ) { return rv; } m_state = state; if ( m_rec.Type == SAHPI_CTRL_TYPE_TEXT ) { size_t n = state.StateUnion.Text.Line; if ( n == SAHPI_TLN_ALL_LINES ) { size_t nlines = m_lines.size(); for ( size_t i = 0; i < nlines; ++i ) { m_lines[i].DataLength = 0; } m_lines[0] = state.StateUnion.Text.Text; } else { m_lines[n - 1] = state.StateUnion.Text.Text; } NormalizeLines(); } if ( m_rec.Type == SAHPI_CTRL_TYPE_OEM ) { // Do not allow override MId m_state.StateUnion.Oem.MId = m_rec.TypeUnion.Oem.MId; } return SA_OK; } void cControl::GetVars( cVars& vars ) { cInstrument::GetVars( vars ); vars << "Mode" << dtSaHpiCtrlModeT << DATA( m_mode ) << VAR_END(); if ( m_rec.Type == SAHPI_CTRL_TYPE_TEXT ) { for ( size_t i = 0, n = m_lines.size(); i < n; ++i ) { vars << AssembleNumberedObjectName( line_name, i + 1 ) << dtSaHpiTextBufferT << DATA( m_lines[i] ) << VAR_END(); } } else { Structs::GetVars( m_state, vars ); } } void cControl::AfterVarSet( const std::string& var_name ) { cInstrument::AfterVarSet( var_name ); if ( var_name.find( line_name ) == 0 ) { NormalizeLines(); } } // Handling RDR changes void cControl::UpdateRdr( const std::string& field_name, SaHpiRdrTypeUnionT& data ) { cInstrument::UpdateRdr( field_name, data ); if ( field_name == "Rdr.CtrlRec.Type" ) { m_state.Type = data.CtrlRec.Type; } } SaErrorT cControl::CheckStateDigital( const SaHpiCtrlStateDigitalT& ds ) const { if ( m_state.StateUnion.Digital == SAHPI_CTRL_STATE_ON ) { if ( ds == SAHPI_CTRL_STATE_PULSE_ON ) { return SA_ERR_HPI_INVALID_REQUEST; } } if ( m_state.StateUnion.Digital == SAHPI_CTRL_STATE_OFF ) { if ( ds == SAHPI_CTRL_STATE_PULSE_OFF ) { return SA_ERR_HPI_INVALID_REQUEST; } } return SA_OK; } SaErrorT cControl::CheckStateAnalog( const SaHpiCtrlStateAnalogT& as ) const { SaHpiCtrlStateAnalogT amax = m_rec.TypeUnion.Analog.Max; SaHpiCtrlStateAnalogT amin = m_rec.TypeUnion.Analog.Min; if ( ( as < amin ) || ( as > amax ) ) { return SA_ERR_HPI_INVALID_DATA; } return SA_OK; } SaErrorT cControl::CheckStateStream( const SaHpiCtrlStateStreamT& ss ) const { if ( ss.StreamLength > SAHPI_CTRL_MAX_STREAM_LENGTH ) { return SA_ERR_HPI_INVALID_PARAMS; } return SA_OK; } SaErrorT cControl::CheckStateText( const SaHpiCtrlStateTextT& ts ) const { const SaHpiCtrlRecTextT& tr = m_rec.TypeUnion.Text; if ( tr.MaxLines == 0 ) { // Spec does not define this return SA_ERR_HPI_INVALID_STATE; } if ( ts.Line != SAHPI_TLN_ALL_LINES ) { if ( ts.Line > tr.MaxLines ) { return SA_ERR_HPI_INVALID_DATA; } } if ( ts.Text.DataType != tr.DataType ) { return SA_ERR_HPI_INVALID_DATA; } if ( tr.DataType == SAHPI_TL_TYPE_UNICODE ) { if ( ts.Text.Language != tr.Language ) { return SA_ERR_HPI_INVALID_DATA; } } if ( tr.DataType == SAHPI_TL_TYPE_TEXT ) { if ( ts.Text.Language != tr.Language ) { return SA_ERR_HPI_INVALID_DATA; } } return SA_OK; } void cControl::NormalizeLines() { size_t nlines = m_lines.size(); size_t mc = m_rec.TypeUnion.Text.MaxChars; size_t n; // find long line bool found = false; for ( n = 0; n < nlines; ++n ) { SaHpiTextBufferT& line = m_lines[n]; if ( line.DataLength > mc ) { found = true; break; } } // wrap long line to the next lines if ( found ) { SaHpiTextBufferT& longline = m_lines[n]; size_t pos = mc; ++n; for ( ; ( n < nlines ) && ( pos < longline.DataLength ); ++n ) { size_t len = std::min( mc, longline.DataLength - pos ); memcpy( &m_lines[n].Data[0], &longline.Data[pos], len ); m_lines[n].DataLength = len; pos += len; } longline.DataLength = mc; } // append spaces to short lines for ( n = 0; n < nlines; ++n ) { SaHpiTextBufferT& line = m_lines[n]; if ( line.DataLength >= mc ) { continue; } std::fill( &line.Data[line.DataLength], &line.Data[mc], ' ' ); line.DataLength = mc; } } }; // namespace TA openhpi-3.6.1/plugins/test_agent/test.cpp0000644000175100017510000002225312575647277017506 0ustar mohanmohan/* -*- c++ -*- * * (C) Copyright Pigeon Point Systems. 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTAREALITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #include #include #include #include #include #include #include "codec.h" #include "dimi.h" #include "handler.h" #include "structs.h" #include "test.h" #include "utils.h" namespace TA { /************************************************************** * Helper functions *************************************************************/ static SaHpiDimiTestT MakeDefaultTestInfo( SaHpiDimiTestNumT num ) { SaHpiDimiTestT info; FormatHpiTextBuffer( info.TestName, "test %u", (unsigned int)num ); info.ServiceImpact = SAHPI_DIMITEST_NONDEGRADING; for ( size_t i = 0; i < SAHPI_DIMITEST_MAX_ENTITIESIMPACTED; ++i ) { MakeUnspecifiedHpiEntityPath( info.EntitiesImpacted[i].EntityImpacted ); info.EntitiesImpacted[i].ServiceImpact = SAHPI_DIMITEST_NONDEGRADING; } info.NeedServiceOS = SAHPI_FALSE; MakeHpiTextBuffer( info.ServiceOS, "Unspecified OS" ); info.ExpectedRunDuration = 2000000000LL; // 2 sec info.TestCapabilities = SAHPI_DIMITEST_CAPABILITY_TESTCANCEL; for ( size_t i = 0; i < SAHPI_DIMITEST_MAX_PARAMETERS; ++i ) { SaHpiDimiTestParamsDefinitionT& pd = info.TestParameters[i]; memset( &pd.ParamName[0], 0, SAHPI_DIMITEST_PARAM_NAME_LEN ); snprintf( reinterpret_cast(&pd.ParamName[0]), SAHPI_DIMITEST_PARAM_NAME_LEN, "Param %u", (unsigned int)i ); FormatHpiTextBuffer( pd.ParamInfo, "This is param %u", (unsigned int)i ); pd.ParamType = SAHPI_DIMITEST_PARAM_TYPE_INT32; pd.MinValue.IntValue = 0; pd.MaxValue.IntValue = 255; pd.DefaultParam.paramint = i; } return info; } static SaHpiDimiTestResultsT MakeDefaultTestResults() { SaHpiDimiTestResultsT results; results.ResultTimeStamp = SAHPI_TIME_UNSPECIFIED; results.RunDuration = SAHPI_TIMEOUT_IMMEDIATE; results.LastRunStatus = SAHPI_DIMITEST_STATUS_NOT_RUN; results.TestErrorCode = SAHPI_DIMITEST_STATUSERR_NOERR; MakeHpiTextBuffer( results.TestResultString, "http://openhpi.org" ); results.TestResultStringIsURI = SAHPI_TRUE; return results; } /************************************************************** * class cTest *************************************************************/ const std::string cTest::classname( "test" ); cTest::cTest( cHandler& handler, cDimi& dimi, SaHpiDimiTestNumT num ) : cObject( AssembleNumberedObjectName( classname, num ) ), m_handler( handler ), m_dimi( dimi ), m_num( num ), m_info( MakeDefaultTestInfo( num ) ), m_ready( SAHPI_DIMI_READY ), m_status( SAHPI_DIMITEST_STATUS_NOT_RUN ), m_progress( 0xff ), m_prev_results( MakeDefaultTestResults() ), m_start_timestamp( SAHPI_TIME_UNSPECIFIED ) { m_next.run_duration = m_info.ExpectedRunDuration; m_next.err = SAHPI_DIMITEST_STATUSERR_NOERR; MakeHpiTextBuffer( m_next.result_string, "No error has been detected" ); m_next.result_string_is_uri = SAHPI_FALSE; } cTest::~cTest() { m_handler.CancelTimer( this ); } // HPI Interface SaErrorT cTest::GetInfo( SaHpiDimiTestT& info ) const { info = m_info; return SA_OK; } SaErrorT cTest::GetReadiness( SaHpiDimiReadyT& ready ) { if ( m_status == SAHPI_DIMITEST_STATUS_RUNNING ) { ready = SAHPI_DIMI_BUSY; } else { ready = m_ready; } return SA_OK; } SaErrorT cTest::Start( SaHpiUint8T nparams, const SaHpiDimiTestVariableParamsT * params ) { SaHpiDimiReadyT ready; SaErrorT rv = GetReadiness( ready ); if ( rv != SA_OK ) { return rv; } if ( ready != SAHPI_DIMI_READY ) { return SA_ERR_HPI_INVALID_STATE; } bool rc= CheckParams( nparams, params ); if ( !rc ) { return SA_ERR_HPI_INVALID_DATA; } ChangeStatus( SAHPI_DIMITEST_STATUS_RUNNING ); m_handler.SetTimer( this, m_next.run_duration ); return SA_OK; } SaErrorT cTest::Cancel() { if ( m_status != SAHPI_DIMITEST_STATUS_RUNNING ) { return SA_ERR_HPI_INVALID_STATE; } if ( ( m_info.TestCapabilities & SAHPI_DIMITEST_CAPABILITY_TESTCANCEL ) == 0 ) { return SA_ERR_HPI_INVALID_REQUEST; } m_handler.CancelTimer( this ); ChangeStatus( SAHPI_DIMITEST_STATUS_CANCELED ); return SA_OK; } SaErrorT cTest::GetStatus( SaHpiDimiTestPercentCompletedT& progress, SaHpiDimiTestRunStatusT& status ) const { progress = m_progress; status = m_status; return SA_OK; } SaErrorT cTest::GetResults( SaHpiDimiTestResultsT& results ) const { results = m_prev_results; return SA_OK; } // cObject virtual functions void cTest::GetVars( cVars& vars ) { cObject::GetVars( vars ); Structs::GetVars( m_info, vars ); vars << "Readiness" << dtSaHpiDimiReadyT << DATA( m_ready ) << VAR_END(); vars << "Status" << dtSaHpiDimiTestRunStatusT << DATA( m_status ) << READONLY() << VAR_END(); vars << "Progress" << dtSaHpiDimiTestPercentCompletedT << DATA( m_progress ) << READONLY() << VAR_END(); vars << "Next.RunDuration" << dtSaHpiTimeoutT << DATA( m_next.run_duration ) << VAR_END(); vars << "Next.TestErrorCode" << dtSaHpiDimiTestErrCodeT << DATA( m_next.err ) << VAR_END(); vars << "Next.TestResultString" << dtSaHpiTextBufferT << DATA( m_next.result_string ) << VAR_END(); vars << "Next.TestResultStringIsURI" << dtSaHpiBoolT << DATA( m_next.result_string_is_uri ) << VAR_END(); } void cTest::AfterVarSet( const std::string& var_name ) { cObject::AfterVarSet( var_name ); } bool cTest::CheckParams( SaHpiUint8T nparams, const SaHpiDimiTestVariableParamsT * params ) const { for ( size_t i = 0; i < nparams; ++i ) { const SaHpiDimiTestVariableParamsT * p = ¶ms[i]; const SaHpiDimiTestParamsDefinitionT * pd; size_t j; for ( j = 0; j < SAHPI_DIMITEST_MAX_PARAMETERS; ++j ) { pd = &m_info.TestParameters[j]; int cc = strncmp( reinterpret_cast( &p->ParamName[0] ), reinterpret_cast( &pd->ParamName[0] ), SAHPI_DIMITEST_PARAM_NAME_LEN ); if ( cc == 0 ) { break; } } if ( j == SAHPI_DIMITEST_MAX_PARAMETERS ) { continue; } if ( p->ParamType != pd->ParamType ) { return false; } if ( p->ParamType == SAHPI_DIMITEST_PARAM_TYPE_INT32 ) { if ( p->Value.paramint < pd->MinValue.IntValue ) { return false; } if ( p->Value.paramint > pd->MaxValue.IntValue ) { return false; } } if ( p->ParamType == SAHPI_DIMITEST_PARAM_TYPE_FLOAT64 ) { if ( p->Value.paramfloat < pd->MinValue.FloatValue ) { return false; } if ( p->Value.paramfloat > pd->MaxValue.FloatValue ) { return false; } } } return true; } void cTest::ChangeStatus( SaHpiDimiTestRunStatusT status ) { m_status = status; SaHpiTimeT now; oh_gettimeofday( &now ); if ( m_status == SAHPI_DIMITEST_STATUS_RUNNING ) { m_start_timestamp = now; } else if ( m_status == SAHPI_DIMITEST_STATUS_NOT_RUN ) { // Do nothing } else { // Update results m_prev_results.ResultTimeStamp = now; m_prev_results.RunDuration = now - m_start_timestamp; m_prev_results.LastRunStatus = m_status; m_prev_results.TestErrorCode = m_next.err; if ( m_status != SAHPI_DIMITEST_STATUS_CANCELED ) { m_prev_results.TestResultString = m_next.result_string; m_prev_results.TestResultStringIsURI = m_next.result_string_is_uri; } else { MakeHpiTextBuffer( m_prev_results.TestResultString, "The test has been cancelled" ); m_prev_results.TestResultStringIsURI = SAHPI_FALSE; } } // Post event if ( !IsVisible() ) { return; } m_dimi.PostEvent( m_num, m_status, m_progress ); } // cTimerCallback virtual functions void cTest::TimerEvent() { cLocker al( &m_handler ); SaHpiDimiTestRunStatusT status; if ( m_next.err == SAHPI_DIMITEST_STATUSERR_NOERR ) { status = SAHPI_DIMITEST_STATUS_FINISHED_NO_ERRORS; } else { status = SAHPI_DIMITEST_STATUS_FINISHED_ERRORS; } ChangeStatus( status ); } }; // namespace TA openhpi-3.6.1/plugins/test_agent/abi.cpp0000644000175100017510000015544612575647277017275 0ustar mohanmohan/* -*- c++ -*- * * (C) Copyright Pigeon Point Systems. 2011 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak */ #include #include #include #include #include #include #include "abi.h" #include "annunciator.h" #include "area.h" #include "bank.h" #include "control.h" #include "dimi.h" #include "fumi.h" #include "handler.h" #include "inventory.h" #include "log.h" #include "resource.h" #include "sensor.h" #include "test.h" #include "utils.h" #include "watchdog.h" namespace TA { /************************************************************** * Helpers *************************************************************/ static bool ParseConfig( GHashTable * config, uint16_t& port ) { const char * param; param = (const char*)g_hash_table_lookup( config, "port" ); if ( !param ) { CRIT( "no port is specified!" ); return false; } port = atoi( param ); return true; } static cHandler * GetHandler( void * hnd ) { return Ptr(hnd); } static cResource * GetResource( cHandler * h, SaHpiResourceIdT rid ) { cResource * r = h->GetResource( rid ); if ( r && r->IsVisible() ) { return r; } return 0; } static cLog * GetLog( cHandler * h, SaHpiResourceIdT rid ) { cResource * r = GetResource( h, rid ); if ( r ) { cLog * log = r->GetLog(); if ( log && log->IsVisible() ) { return log; } } return 0; } static cControl * GetControl( cHandler * h, SaHpiResourceIdT rid, SaHpiCtrlNumT num ) { cResource * r = GetResource( h, rid ); if ( r ) { cControl * ctrl = r->GetControl( num ); if ( ctrl && ctrl->IsVisible() ) { return ctrl; } } return 0; } static cSensor * GetSensor( cHandler * h, SaHpiResourceIdT rid, SaHpiSensorNumT num ) { cResource * r = GetResource( h, rid ); if ( r ) { cSensor * sen = r->GetSensor( num ); if ( sen && sen->IsVisible() ) { return sen; } } return 0; } static cInventory * GetInventory( cHandler * h, SaHpiResourceIdT rid, SaHpiIdrIdT num ) { cResource * r = GetResource( h, rid ); if ( r ) { cInventory * inv = r->GetInventory( num ); if ( inv && inv->IsVisible() ) { return inv; } } return 0; } static cArea * GetArea( cHandler * h, SaHpiResourceIdT rid, SaHpiIdrIdT num, SaHpiEntryIdT id ) { cInventory * inv = GetInventory( h, rid, num ); if ( inv ) { cArea * area = inv->GetArea( id ); if ( area && area->IsVisible() ) { return area; } } return 0; } static cWatchdog * GetWatchdog( cHandler * h, SaHpiResourceIdT rid, SaHpiWatchdogNumT num ) { cResource * r = GetResource( h, rid ); if ( r ) { cWatchdog * wdt = r->GetWatchdog( num ); if ( wdt && wdt->IsVisible() ) { return wdt; } } return 0; } static cAnnunciator * GetAnnunciator( cHandler * h, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT num ) { cResource * r = GetResource( h, rid ); if ( r ) { cAnnunciator * ann = r->GetAnnunciator( num ); if ( ann && ann->IsVisible() ) { return ann; } } return 0; } static cDimi * GetDimi( cHandler * h, SaHpiResourceIdT rid, SaHpiDimiNumT num ) { cResource * r = GetResource( h, rid ); if ( r ) { cDimi * dimi = r->GetDimi( num ); if ( dimi && dimi->IsVisible() ) { return dimi; } } return 0; } static cTest * GetTest( cHandler * h, SaHpiResourceIdT rid, SaHpiDimiNumT num, SaHpiDimiTestNumT tnum ) { cDimi * dimi = GetDimi( h, rid, num ); if ( dimi ) { cTest * test = dimi->GetTest( tnum ); if ( test && test->IsVisible() ) { return test; } } return 0; } static cFumi * GetFumi( cHandler * h, SaHpiResourceIdT rid, SaHpiFumiNumT num ) { cResource * r = GetResource( h, rid ); if ( r ) { cFumi * fumi = r->GetFumi( num ); if ( fumi && fumi->IsVisible() ) { return fumi; } } return 0; } static cBank * GetBank( cHandler * h, SaHpiResourceIdT rid, SaHpiFumiNumT num, SaHpiBankNumT bnum ) { cFumi * fumi = GetFumi( h, rid, num ); if ( fumi ) { cBank * bank = fumi->GetBank( bnum ); if ( bank && bank->IsVisible() ) { return bank; } } return 0; } }; // namespace TA /************************************************************** * oh_open *************************************************************/ void * oh_open( GHashTable * handler_config, unsigned int hid, oh_evt_queue * eventq ) { if ( !handler_config ) { CRIT( "handler_config is NULL!" ); return 0; } if ( hid == 0 ) { CRIT( "Bad handler id passed." ); return 0; } if ( !eventq ) { CRIT( "No event queue was passed." ); return 0; } bool rc; uint16_t port; rc = TA::ParseConfig( handler_config, port ); if ( !rc ) { CRIT( "Error while parsing config." ); return 0; } TA::cHandler * handler = new TA::cHandler( hid, port, *eventq ); rc = handler->Init(); if ( !rc ) { CRIT( "Handler::Init failed."); return 0; } return handler; } /************************************************************** * oh_close *************************************************************/ void oh_close( void * hnd ) { TA::cHandler * handler = TA::GetHandler( hnd ); // TODO it is not safe to get handler lock here delete handler; } /************************************************************** * oh_discover_resources *************************************************************/ SaErrorT oh_discover_resources( void * hnd ) { return SA_OK; } /************************************************************** * oh_set_resource_tag *************************************************************/ SaErrorT oh_set_resource_tag( void * hnd, SaHpiResourceIdT rid, SaHpiTextBufferT * tag ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cResource * r = TA::GetResource( handler, rid ); if ( !r ) { return SA_ERR_HPI_NOT_PRESENT; } return r->SetTag( *tag ); } /************************************************************** * oh_set_resource_severity *************************************************************/ SaErrorT oh_set_resource_severity( void * hnd, SaHpiResourceIdT rid, SaHpiSeverityT sev ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cResource * r = TA::GetResource( handler, rid ); if ( !r ) { return SA_ERR_HPI_NOT_PRESENT; } return r->SetSeverity( sev ); } /************************************************************** * oh_resource_failed_remove *************************************************************/ SaErrorT oh_resource_failed_remove( void * hnd, SaHpiResourceIdT rid ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); return handler->RemoveFailedResource( rid ); } /************************************************************** * oh_get_el_info *************************************************************/ SaErrorT oh_get_el_info( void * hnd, SaHpiResourceIdT rid, SaHpiEventLogInfoT * info ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cLog * log = TA::GetLog( handler, rid ); if ( !log ) { return SA_ERR_HPI_CAPABILITY; } return log->GetInfo( *info ); } /************************************************************** * oh_get_el_caps *************************************************************/ SaErrorT oh_get_el_caps( void * hnd, SaHpiResourceIdT rid, SaHpiEventLogCapabilitiesT * caps ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cLog * log = TA::GetLog( handler, rid ); if ( !log ) { return SA_ERR_HPI_CAPABILITY; } return log->GetCapabilities( *caps ); } /************************************************************** * oh_set_el_time *************************************************************/ SaErrorT oh_set_el_time( void * hnd, SaHpiResourceIdT rid, SaHpiTimeT time ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cLog * log = TA::GetLog( handler, rid ); if ( !log ) { return SA_ERR_HPI_CAPABILITY; } return log->SetTime( time ); } /************************************************************** * oh_add_el_entry *************************************************************/ SaErrorT oh_add_el_entry( void * hnd, SaHpiResourceIdT rid, const SaHpiEventT * event ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cLog * log = TA::GetLog( handler, rid ); if ( !log ) { return SA_ERR_HPI_CAPABILITY; } return log->AddEntry( *event ); } /************************************************************** * oh_get_el_entry *************************************************************/ SaErrorT oh_get_el_entry( void * hnd, SaHpiResourceIdT rid, SaHpiEventLogEntryIdT current, SaHpiEventLogEntryIdT * prev, SaHpiEventLogEntryIdT * next, SaHpiEventLogEntryT * entry, SaHpiRdrT * rdr, SaHpiRptEntryT * rpte ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cLog * log = TA::GetLog( handler, rid ); if ( !log ) { return SA_ERR_HPI_CAPABILITY; } return log->GetEntry( current, *prev, *next, *entry, *rdr, *rpte ); } /************************************************************** * oh_clear_el *************************************************************/ SaErrorT oh_clear_el( void * hnd, SaHpiResourceIdT rid ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cLog * log = TA::GetLog( handler, rid ); if ( !log ) { return SA_ERR_HPI_CAPABILITY; } return log->Clear(); } /************************************************************** * oh_set_el_state *************************************************************/ SaErrorT oh_set_el_state( void * hnd, SaHpiResourceIdT rid, SaHpiBoolT e ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cLog * log = TA::GetLog( handler, rid ); if ( !log ) { return SA_ERR_HPI_CAPABILITY; } return log->SetState( e ); } /************************************************************** * oh_reset_el_overflow *************************************************************/ SaErrorT oh_reset_el_overflow( void * hnd, SaHpiResourceIdT rid ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cLog * log = TA::GetLog( handler, rid ); if ( !log ) { return SA_ERR_HPI_CAPABILITY; } return log->ResetOverflow(); } /************************************************************** * oh_get_sensor_reading *************************************************************/ SaErrorT oh_get_sensor_reading( void * hnd, SaHpiResourceIdT rid, SaHpiSensorNumT num, SaHpiSensorReadingT * reading, SaHpiEventStateT * state ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cSensor * sen = TA::GetSensor( handler, rid, num ); if ( !sen ) { return SA_ERR_HPI_NOT_PRESENT; } return sen->GetReading( *reading, *state ); } /************************************************************** * oh_get_sensor_thresholds *************************************************************/ SaErrorT oh_get_sensor_thresholds( void * hnd, SaHpiResourceIdT rid, SaHpiSensorNumT num, SaHpiSensorThresholdsT * thres ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cSensor * sen = TA::GetSensor( handler, rid, num ); if ( !sen ) { return SA_ERR_HPI_NOT_PRESENT; } return sen->GetThresholds( *thres ); } /************************************************************** * oh_set_sensor_thresholds *************************************************************/ SaErrorT oh_set_sensor_thresholds( void * hnd, SaHpiResourceIdT rid, SaHpiSensorNumT num, const SaHpiSensorThresholdsT * thres ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cSensor * sen = TA::GetSensor( handler, rid, num ); if ( !sen ) { return SA_ERR_HPI_NOT_PRESENT; } return sen->SetThresholds( *thres ); } /************************************************************** * oh_get_sensor_enable *************************************************************/ SaErrorT oh_get_sensor_enable( void * hnd, SaHpiResourceIdT rid, SaHpiSensorNumT num, SaHpiBoolT * enable ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cSensor * sen = TA::GetSensor( handler, rid, num ); if ( !sen ) { return SA_ERR_HPI_NOT_PRESENT; } return sen->GetEnable( *enable ); } /************************************************************** * oh_set_sensor_enable *************************************************************/ SaErrorT oh_set_sensor_enable( void * hnd, SaHpiResourceIdT rid, SaHpiSensorNumT num, SaHpiBoolT enable ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cSensor * sen = TA::GetSensor( handler, rid, num ); if ( !sen ) { return SA_ERR_HPI_NOT_PRESENT; } return sen->SetEnable( enable ); } /************************************************************** * oh_get_sensor_event_enables *************************************************************/ SaErrorT oh_get_sensor_event_enables( void * hnd, SaHpiResourceIdT rid, SaHpiSensorNumT num, SaHpiBoolT * enables ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cSensor * sen = TA::GetSensor( handler, rid, num ); if ( !sen ) { return SA_ERR_HPI_NOT_PRESENT; } return sen->GetEventEnable( *enables ); } /************************************************************** * oh_set_sensor_event_enables *************************************************************/ SaErrorT oh_set_sensor_event_enables( void * hnd, SaHpiResourceIdT rid, SaHpiSensorNumT num, const SaHpiBoolT enables ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cSensor * sen = TA::GetSensor( handler, rid, num ); if ( !sen ) { return SA_ERR_HPI_NOT_PRESENT; } return sen->SetEventEnable( enables ); } /************************************************************** * oh_get_sensor_event_masks *************************************************************/ SaErrorT oh_get_sensor_event_masks( void * hnd, SaHpiResourceIdT rid, SaHpiSensorNumT num, SaHpiEventStateT * AssertEventMask, SaHpiEventStateT * DeassertEventMask ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cSensor * sen = TA::GetSensor( handler, rid, num ); if ( !sen ) { return SA_ERR_HPI_NOT_PRESENT; } return sen->GetMasks( *AssertEventMask, *DeassertEventMask ); } /************************************************************** * oh_set_sensor_event_masks *************************************************************/ SaErrorT oh_set_sensor_event_masks( void * hnd, SaHpiResourceIdT rid, SaHpiSensorNumT num, SaHpiSensorEventMaskActionT act, SaHpiEventStateT AssertEventMask, SaHpiEventStateT DeassertEventMask ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cSensor * sen = TA::GetSensor( handler, rid, num ); if ( !sen ) { return SA_ERR_HPI_NOT_PRESENT; } return sen->SetMasks( act, AssertEventMask, DeassertEventMask ); } /************************************************************** * oh_get_control_state *************************************************************/ SaErrorT oh_get_control_state( void * hnd, SaHpiResourceIdT rid, SaHpiCtrlNumT num, SaHpiCtrlModeT * mode, SaHpiCtrlStateT * state ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cControl * ctrl = TA::GetControl( handler, rid, num ); if ( !ctrl ) { return SA_ERR_HPI_NOT_PRESENT; } return ctrl->Get( *mode, *state ); } /************************************************************** * oh_set_control_state *************************************************************/ SaErrorT oh_set_control_state( void * hnd, SaHpiResourceIdT rid, SaHpiCtrlNumT num, SaHpiCtrlModeT mode, SaHpiCtrlStateT * state ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cControl * ctrl = TA::GetControl( handler, rid, num ); if ( !ctrl ) { return SA_ERR_HPI_NOT_PRESENT; } return ctrl->Set( mode, *state ); } /************************************************************** * oh_get_idr_info *************************************************************/ SaErrorT oh_get_idr_info( void * hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrInfoT * idrinfo ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cInventory * inv = TA::GetInventory( handler, rid, idrid ); if ( !inv ) { return SA_ERR_HPI_NOT_PRESENT; } return inv->GetInfo( *idrinfo ); } /************************************************************** * oh_get_idr_area_header *************************************************************/ SaErrorT oh_get_idr_area_header( void * hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrAreaTypeT areatype, SaHpiEntryIdT areaid, SaHpiEntryIdT * nextareaid, SaHpiIdrAreaHeaderT * header ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cInventory * inv = TA::GetInventory( handler, rid, idrid ); if ( !inv ) { return SA_ERR_HPI_NOT_PRESENT; } return inv->GetArea( areatype, areaid, *nextareaid, *header ); } /************************************************************** * oh_add_idr_area *************************************************************/ SaErrorT oh_add_idr_area( void * hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrAreaTypeT areatype, SaHpiEntryIdT * areaid ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cInventory * inv = TA::GetInventory( handler, rid, idrid ); if ( !inv ) { return SA_ERR_HPI_NOT_PRESENT; } return inv->AddArea( areatype, *areaid ); } /************************************************************** * oh_add_idr_area_id *************************************************************/ SaErrorT oh_add_idr_area_id( void * hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrAreaTypeT areatype, SaHpiEntryIdT areaid ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cInventory * inv = TA::GetInventory( handler, rid, idrid ); if ( !inv ) { return SA_ERR_HPI_NOT_PRESENT; } return inv->AddAreaById( areaid, areatype ); } /************************************************************** * oh_del_idr_area *************************************************************/ SaErrorT oh_del_idr_area( void * hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiEntryIdT areaid ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cInventory * inv = TA::GetInventory( handler, rid, idrid ); if ( !inv ) { return SA_ERR_HPI_NOT_PRESENT; } return inv->DeleteAreaById( areaid ); } /************************************************************** * oh_get_idr_field *************************************************************/ SaErrorT oh_get_idr_field( void * hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiEntryIdT areaid, SaHpiIdrFieldTypeT fieldtype, SaHpiEntryIdT fieldid, SaHpiEntryIdT * nextfieldid, SaHpiIdrFieldT * field ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cArea * area = TA::GetArea( handler, rid, idrid, areaid ); if ( !area ) { return SA_ERR_HPI_NOT_PRESENT; } return area->GetField( fieldtype, fieldid, *nextfieldid, *field ); } /************************************************************** * oh_add_idr_field *************************************************************/ SaErrorT oh_add_idr_field( void * hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrFieldT * field ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cArea * area = TA::GetArea( handler, rid, idrid, field->AreaId ); if ( !area ) { return SA_ERR_HPI_NOT_PRESENT; } field->ReadOnly = SAHPI_FALSE; return area->AddField( field->Type, field->Field, field->FieldId ); } /************************************************************** * oh_add_idr_field_id *************************************************************/ SaErrorT oh_add_idr_field_id( void * hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrFieldT * field ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cArea * area = TA::GetArea( handler, rid, idrid, field->AreaId ); if ( !area ) { return SA_ERR_HPI_NOT_PRESENT; } return area->AddFieldById( field->FieldId, field->Type, field->Field ); } /************************************************************** * oh_set_idr_field *************************************************************/ SaErrorT oh_set_idr_field( void * hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrFieldT * field ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cArea * area = TA::GetArea( handler, rid, idrid, field->AreaId ); if ( !area ) { return SA_ERR_HPI_NOT_PRESENT; } return area->SetField( field->FieldId, field->Type, field->Field ); } /************************************************************** * oh_del_idr_field *************************************************************/ SaErrorT oh_del_idr_field( void * hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiEntryIdT areaid, SaHpiEntryIdT fieldid ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cArea * area = TA::GetArea( handler, rid, idrid, areaid ); if ( !area ) { return SA_ERR_HPI_NOT_PRESENT; } return area->DeleteFieldById( fieldid ); } /************************************************************** * oh_get_watchdog_info *************************************************************/ SaErrorT oh_get_watchdog_info( void * hnd, SaHpiResourceIdT rid, SaHpiWatchdogNumT num, SaHpiWatchdogT * wdt ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cWatchdog * w = TA::GetWatchdog( handler, rid, num ); if ( !w ) { return SA_ERR_HPI_NOT_PRESENT; } return w->Get( *wdt ); } /************************************************************** * oh_set_watchdog_info *************************************************************/ SaErrorT oh_set_watchdog_info( void * hnd, SaHpiResourceIdT rid, SaHpiWatchdogNumT num, SaHpiWatchdogT * wdt ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cWatchdog * w = TA::GetWatchdog( handler, rid, num ); if ( !w ) { return SA_ERR_HPI_NOT_PRESENT; } return w->Set( *wdt ); } /************************************************************** * oh_reset_watchdog *************************************************************/ SaErrorT oh_reset_watchdog( void * hnd, SaHpiResourceIdT rid, SaHpiWatchdogNumT num ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cWatchdog * w = TA::GetWatchdog( handler, rid, num ); if ( !w ) { return SA_ERR_HPI_NOT_PRESENT; } return w->Reset(); } /************************************************************** * oh_get_next_announce *************************************************************/ SaErrorT oh_get_next_announce( void * hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT num, SaHpiSeverityT sev, SaHpiBoolT ack, SaHpiAnnouncementT * a ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cAnnunciator * ann = TA::GetAnnunciator( handler, rid, num ); if ( !ann ) { return SA_ERR_HPI_NOT_PRESENT; } return ann->GetNextAnnouncement( sev, ack, *a ); } /************************************************************** * oh_get_announce *************************************************************/ SaErrorT oh_get_announce( void * hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT num, SaHpiEntryIdT aid, SaHpiAnnouncementT * a ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cAnnunciator * ann = TA::GetAnnunciator( handler, rid, num ); if ( !ann ) { return SA_ERR_HPI_NOT_PRESENT; } return ann->GetAnnouncement( aid, *a ); } /************************************************************** * oh_ack_announce *************************************************************/ SaErrorT oh_ack_announce( void * hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT num, SaHpiEntryIdT aid, SaHpiSeverityT sev ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cAnnunciator * ann = TA::GetAnnunciator( handler, rid, num ); if ( !ann ) { return SA_ERR_HPI_NOT_PRESENT; } return ann->AckAnnouncement( aid, sev ); } /************************************************************** * oh_add_announce *************************************************************/ SaErrorT oh_add_announce( void * hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT num, SaHpiAnnouncementT * a ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cAnnunciator * ann = TA::GetAnnunciator( handler, rid, num ); if ( !ann ) { return SA_ERR_HPI_NOT_PRESENT; } return ann->AddAnnouncement( *a ); } /************************************************************** * oh_del_announce *************************************************************/ SaErrorT oh_del_announce( void * hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT num, SaHpiEntryIdT aid, SaHpiSeverityT sev ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cAnnunciator * ann = TA::GetAnnunciator( handler, rid, num ); if ( !ann ) { return SA_ERR_HPI_NOT_PRESENT; } return ann->DeleteAnnouncement( aid, sev ); } /************************************************************** * oh_get_annunc_mode *************************************************************/ SaErrorT oh_get_annunc_mode( void * hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT num, SaHpiAnnunciatorModeT * mode ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cAnnunciator * ann = TA::GetAnnunciator( handler, rid, num ); if ( !ann ) { return SA_ERR_HPI_NOT_PRESENT; } return ann->GetMode( *mode ); } /************************************************************** * oh_set_annunc_mode *************************************************************/ SaErrorT oh_set_annunc_mode( void * hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT num, SaHpiAnnunciatorModeT mode ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cAnnunciator * ann = TA::GetAnnunciator( handler, rid, num ); if ( !ann ) { return SA_ERR_HPI_NOT_PRESENT; } return ann->SetMode( mode ); } /************************************************************** * oh_get_dimi_info *************************************************************/ SaErrorT oh_get_dimi_info( void * hnd, SaHpiResourceIdT rid, SaHpiDimiNumT num, SaHpiDimiInfoT * info ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cDimi * dimi = TA::GetDimi( handler, rid, num ); if ( !dimi ) { return SA_ERR_HPI_NOT_PRESENT; } return dimi->GetInfo( *info ); } /************************************************************** * oh_get_dimi_test *************************************************************/ SaErrorT oh_get_dimi_test( void * hnd, SaHpiResourceIdT rid, SaHpiDimiNumT num, SaHpiDimiTestNumT testnum, SaHpiDimiTestT * test ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cTest * t = TA::GetTest( handler, rid, num, testnum ); if ( !t ) { return SA_ERR_HPI_NOT_PRESENT; } return t->GetInfo( *test ); } /************************************************************** * oh_get_dimi_test_ready *************************************************************/ SaErrorT oh_get_dimi_test_ready( void * hnd, SaHpiResourceIdT rid, SaHpiDimiNumT num, SaHpiDimiTestNumT testnum, SaHpiDimiReadyT * ready ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cTest * t = TA::GetTest( handler, rid, num, testnum ); if ( !t ) { return SA_ERR_HPI_NOT_PRESENT; } return t->GetReadiness( *ready ); } /************************************************************** * oh_start_dimi_test *************************************************************/ SaErrorT oh_start_dimi_test( void * hnd, SaHpiResourceIdT rid, SaHpiDimiNumT num, SaHpiDimiTestNumT testnum, SaHpiUint8T numparams, SaHpiDimiTestVariableParamsT * paramslist ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cTest * t = TA::GetTest( handler, rid, num, testnum ); if ( !t ) { return SA_ERR_HPI_NOT_PRESENT; } return t->Start( numparams, paramslist ); } /************************************************************** * oh_cancel_dimi_test *************************************************************/ SaErrorT oh_cancel_dimi_test( void * hnd, SaHpiResourceIdT rid, SaHpiDimiNumT num, SaHpiDimiTestNumT testnum ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cTest * t = TA::GetTest( handler, rid, num, testnum ); if ( !t ) { return SA_ERR_HPI_NOT_PRESENT; } return t->Cancel(); } /************************************************************** * oh_get_dimi_test_status *************************************************************/ SaErrorT oh_get_dimi_test_status( void * hnd, SaHpiResourceIdT rid, SaHpiDimiNumT num, SaHpiDimiTestNumT testnum, SaHpiDimiTestPercentCompletedT * percentcompleted, SaHpiDimiTestRunStatusT * runstatus ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cTest * t = TA::GetTest( handler, rid, num, testnum ); if ( !t ) { return SA_ERR_HPI_NOT_PRESENT; } return t->GetStatus( *percentcompleted, *runstatus ); } /************************************************************** * oh_get_dimi_test_results *************************************************************/ SaErrorT oh_get_dimi_test_results( void * hnd, SaHpiResourceIdT rid, SaHpiDimiNumT num, SaHpiDimiTestNumT testnum, SaHpiDimiTestResultsT * testresults ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cTest * t = TA::GetTest( handler, rid, num, testnum ); if ( !t ) { return SA_ERR_HPI_NOT_PRESENT; } return t->GetResults( *testresults ); } /************************************************************** * oh_get_fumi_spec *************************************************************/ SaErrorT oh_get_fumi_spec( void * hnd, SaHpiResourceIdT rid, SaHpiFumiNumT num, SaHpiFumiSpecInfoT * specinfo ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cFumi * fumi = TA::GetFumi( handler, rid, num ); if ( !fumi ) { return SA_ERR_HPI_NOT_PRESENT; } return fumi->GetSpecInfo( *specinfo ); } /************************************************************** * oh_get_fumi_service_impact *************************************************************/ SaErrorT oh_get_fumi_service_impact( void * hnd, SaHpiResourceIdT rid, SaHpiFumiNumT num, SaHpiFumiServiceImpactDataT * serviceimpact ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cFumi * fumi = TA::GetFumi( handler, rid, num ); if ( !fumi ) { return SA_ERR_HPI_NOT_PRESENT; } return fumi->GetServiceImpact( *serviceimpact ); } /************************************************************** * oh_set_fumi_source *************************************************************/ SaErrorT oh_set_fumi_source( void * hnd, SaHpiResourceIdT rid, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiTextBufferT * sourceuri ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cBank * b = TA::GetBank( handler, rid, num, banknum ); if ( !b ) { return SA_ERR_HPI_NOT_PRESENT; } return b->SetSource( *sourceuri ); } /************************************************************** * oh_validate_fumi_source *************************************************************/ SaErrorT oh_validate_fumi_source( void * hnd, SaHpiResourceIdT rid, SaHpiFumiNumT num, SaHpiBankNumT banknum ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cBank * b = TA::GetBank( handler, rid, num, banknum ); if ( !b ) { return SA_ERR_HPI_NOT_PRESENT; } return b->StartSourceValidation(); } /************************************************************** * oh_get_fumi_source *************************************************************/ SaErrorT oh_get_fumi_source( void * hnd, SaHpiResourceIdT rid, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiFumiSourceInfoT * sourceinfo ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cBank * b = TA::GetBank( handler, rid, num, banknum ); if ( !b ) { return SA_ERR_HPI_NOT_PRESENT; } return b->GetSourceInfo( *sourceinfo ); } /************************************************************** * oh_get_fumi_source_component *************************************************************/ SaErrorT oh_get_fumi_source_component( void * hnd, SaHpiResourceIdT rid, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiEntryIdT compid, SaHpiEntryIdT * nextcompid, SaHpiFumiComponentInfoT * compinfo ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cBank * b = TA::GetBank( handler, rid, num, banknum ); if ( !b ) { return SA_ERR_HPI_NOT_PRESENT; } return b->GetSourceComponentInfo( compid, *nextcompid, *compinfo ); } /************************************************************** * oh_get_fumi_target *************************************************************/ SaErrorT oh_get_fumi_target( void * hnd, SaHpiResourceIdT rid, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiFumiBankInfoT * bankinfo ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cBank * b = TA::GetBank( handler, rid, num, banknum ); if ( !b ) { return SA_ERR_HPI_NOT_PRESENT; } return b->GetTargetInfo( *bankinfo ); } /************************************************************** * oh_get_fumi_target_component *************************************************************/ SaErrorT oh_get_fumi_target_component( void * hnd, SaHpiResourceIdT rid, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiEntryIdT compid, SaHpiEntryIdT * nextcompid, SaHpiFumiComponentInfoT * compinfo ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cBank * b = TA::GetBank( handler, rid, num, banknum ); if ( !b ) { return SA_ERR_HPI_NOT_PRESENT; } return b->GetTargetComponentInfo( compid, *nextcompid, *compinfo ); } /************************************************************** * oh_get_fumi_logical_target *************************************************************/ SaErrorT oh_get_fumi_logical_target( void * hnd, SaHpiResourceIdT rid, SaHpiFumiNumT num, SaHpiFumiLogicalBankInfoT * bankinfo ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cBank * b = TA::GetBank( handler, rid, num, 0 ); if ( !b ) { return SA_ERR_HPI_NOT_PRESENT; } return b->GetLogicalTargetInfo( *bankinfo ); } /************************************************************** * oh_get_fumi_logical_target_component *************************************************************/ SaErrorT oh_get_fumi_logical_target_component( void * hnd, SaHpiResourceIdT rid, SaHpiFumiNumT num, SaHpiEntryIdT compid, SaHpiEntryIdT * nextcompid, SaHpiFumiLogicalComponentInfoT * compinfo ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cBank * b = TA::GetBank( handler, rid, num, 0 ); if ( !b ) { return SA_ERR_HPI_NOT_PRESENT; } return b->GetLogicalTargetComponentInfo( compid, *nextcompid, *compinfo ); } /************************************************************** * oh_start_fumi_backup *************************************************************/ SaErrorT oh_start_fumi_backup( void * hnd, SaHpiResourceIdT rid, SaHpiFumiNumT num ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cBank * b = TA::GetBank( handler, rid, num, 0 ); if ( !b ) { return SA_ERR_HPI_NOT_PRESENT; } return b->StartBackup(); } /************************************************************** * oh_set_fumi_bank_order *************************************************************/ SaErrorT oh_set_fumi_bank_order( void * hnd, SaHpiResourceIdT rid, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiUint32T position ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cFumi * fumi = TA::GetFumi( handler, rid, num ); if ( !fumi ) { return SA_ERR_HPI_NOT_PRESENT; } return fumi->SetBootOrder( banknum, position ); } /************************************************************** * oh_start_fumi_bank_copy *************************************************************/ SaErrorT oh_start_fumi_bank_copy( void * hnd, SaHpiResourceIdT rid, SaHpiFumiNumT num, SaHpiBankNumT sourcebanknum, SaHpiBankNumT targetbanknum ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cBank * b = TA::GetBank( handler, rid, num, sourcebanknum ); if ( !b ) { return SA_ERR_HPI_NOT_PRESENT; } return b->StartCopy( targetbanknum ); } /************************************************************** * oh_start_fumi_install *************************************************************/ SaErrorT oh_start_fumi_install( void * hnd, SaHpiResourceIdT rid, SaHpiFumiNumT num, SaHpiBankNumT banknum ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cBank * b = TA::GetBank( handler, rid, num, banknum ); if ( !b ) { return SA_ERR_HPI_NOT_PRESENT; } return b->StartInstallation(); } /************************************************************** * oh_get_fumi_status *************************************************************/ SaErrorT oh_get_fumi_status( void * hnd, SaHpiResourceIdT rid, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiFumiUpgradeStatusT * status ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cBank * b = TA::GetBank( handler, rid, num, banknum ); if ( !b ) { return SA_ERR_HPI_NOT_PRESENT; } return b->GetUpgradeStatus( *status ); } /************************************************************** * oh_start_fumi_verify *************************************************************/ SaErrorT oh_start_fumi_verify( void * hnd, SaHpiResourceIdT rid, SaHpiFumiNumT num, SaHpiBankNumT banknum ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cBank * b = TA::GetBank( handler, rid, num, banknum ); if ( !b ) { return SA_ERR_HPI_NOT_PRESENT; } return b->StartTargetVerification(); } /************************************************************** * oh_start_fumi_verify_main *************************************************************/ SaErrorT oh_start_fumi_verify_main( void * hnd, SaHpiResourceIdT rid, SaHpiFumiNumT num ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cBank * b = TA::GetBank( handler, rid, num, 0 ); if ( !b ) { return SA_ERR_HPI_NOT_PRESENT; } return b->StartTargetMainVerification(); } /************************************************************** * oh_cancel_fumi_upgrade *************************************************************/ SaErrorT oh_cancel_fumi_upgrade( void * hnd, SaHpiResourceIdT rid, SaHpiFumiNumT num, SaHpiBankNumT banknum ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cBank * b = TA::GetBank( handler, rid, num, banknum ); if ( !b ) { return SA_ERR_HPI_NOT_PRESENT; } return b->CancelUpgrade(); } /************************************************************** * oh_get_fumi_autorollback_disable *************************************************************/ SaErrorT oh_get_fumi_autorollback_disable( void * hnd, SaHpiResourceIdT rid, SaHpiFumiNumT num, SaHpiBoolT * disable ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cFumi * fumi = TA::GetFumi( handler, rid, num ); if ( !fumi ) { return SA_ERR_HPI_NOT_PRESENT; } return fumi->GetAutoRollbackDisabled( *disable ); } /************************************************************** * oh_set_fumi_autorollback_disable *************************************************************/ SaErrorT oh_set_fumi_autorollback_disable( void * hnd, SaHpiResourceIdT rid, SaHpiFumiNumT num, SaHpiBoolT disable ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cFumi * fumi = TA::GetFumi( handler, rid, num ); if ( !fumi ) { return SA_ERR_HPI_NOT_PRESENT; } return fumi->SetAutoRollbackDisabled( disable ); } /************************************************************** * oh_start_fumi_rollback *************************************************************/ SaErrorT oh_start_fumi_rollback( void * hnd, SaHpiResourceIdT rid, SaHpiFumiNumT num ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cBank * b = TA::GetBank( handler, rid, num, 0 ); if ( !b ) { return SA_ERR_HPI_NOT_PRESENT; } return b->StartRollback(); } /************************************************************** * oh_activate_fumi *************************************************************/ SaErrorT oh_activate_fumi( void * hnd, SaHpiResourceIdT rid, SaHpiFumiNumT num ) { return SA_ERR_HPI_UNSUPPORTED_API; } /************************************************************** * oh_start_fumi_activate *************************************************************/ SaErrorT oh_start_fumi_activate( void * hnd, SaHpiResourceIdT rid, SaHpiFumiNumT num, SaHpiBoolT logical ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cFumi * fumi = TA::GetFumi( handler, rid, num ); if ( !fumi ) { return SA_ERR_HPI_NOT_PRESENT; } return fumi->StartActivation( logical ); } /************************************************************** * oh_cleanup_fumi *************************************************************/ SaErrorT oh_cleanup_fumi( void * hnd, SaHpiResourceIdT rid, SaHpiFumiNumT num, SaHpiBankNumT banknum ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cBank * b = TA::GetBank( handler, rid, num, banknum ); if ( !b ) { return SA_ERR_HPI_NOT_PRESENT; } return b->Cleanup(); } /************************************************************** * oh_hotswap_policy_cancel *************************************************************/ SaErrorT oh_hotswap_policy_cancel( void * hnd, SaHpiResourceIdT rid, SaHpiTimeoutT timeout ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cResource * r = TA::GetResource( handler, rid ); if ( !r ) { return SA_ERR_HPI_NOT_PRESENT; } return r->CancelHsPolicy( timeout ); } /************************************************************** * oh_set_autoinsert_timeout *************************************************************/ SaErrorT oh_set_autoinsert_timeout( void * hnd, SaHpiTimeoutT timeout ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); return handler->SetAutoInsertTimeout( timeout ); } /************************************************************** * oh_get_autoextract_timeout *************************************************************/ SaErrorT oh_get_autoextract_timeout( void * hnd, SaHpiResourceIdT rid, SaHpiTimeoutT * timeout ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cResource * r = TA::GetResource( handler, rid ); if ( !r ) { return SA_ERR_HPI_NOT_PRESENT; } return r->GetAutoExtractTimeout( *timeout ); } /************************************************************** * oh_set_autoextract_timeout *************************************************************/ SaErrorT oh_set_autoextract_timeout( void * hnd, SaHpiResourceIdT rid, SaHpiTimeoutT timeout ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cResource * r = TA::GetResource( handler, rid ); if ( !r ) { return SA_ERR_HPI_NOT_PRESENT; } return r->SetAutoExtractTimeout( timeout ); } /************************************************************** * oh_get_hotswap_state *************************************************************/ SaErrorT oh_get_hotswap_state( void * hnd, SaHpiResourceIdT rid, SaHpiHsStateT * state ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cResource * r = TA::GetResource( handler, rid ); if ( !r ) { return SA_ERR_HPI_NOT_PRESENT; } return r->GetHsState( *state ); } /************************************************************** * oh_set_hotswap_state *************************************************************/ SaErrorT oh_set_hotswap_state( void * hnd, SaHpiResourceIdT rid, SaHpiHsStateT state ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cResource * r = TA::GetResource( handler, rid ); if ( !r ) { return SA_ERR_HPI_NOT_PRESENT; } return r->SetHsState( state ); } /************************************************************** * oh_request_hotswap_action *************************************************************/ SaErrorT oh_request_hotswap_action( void * hnd, SaHpiResourceIdT rid, SaHpiHsActionT act ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cResource * r = TA::GetResource( handler, rid ); if ( !r ) { return SA_ERR_HPI_NOT_PRESENT; } return r->RequestHsAction( act ); } /************************************************************** * oh_get_indicator_state *************************************************************/ SaErrorT oh_get_indicator_state( void * hnd, SaHpiResourceIdT rid, SaHpiHsIndicatorStateT * state ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cResource * r = TA::GetResource( handler, rid ); if ( !r ) { return SA_ERR_HPI_NOT_PRESENT; } return r->GetHsIndicatorState( *state ); } /************************************************************** * oh_set_indicator_state *************************************************************/ SaErrorT oh_set_indicator_state( void * hnd, SaHpiResourceIdT rid, SaHpiHsIndicatorStateT state ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cResource * r = TA::GetResource( handler, rid ); if ( !r ) { return SA_ERR_HPI_NOT_PRESENT; } return r->SetHsIndicatorState( state ); } /************************************************************** * oh_get_power_state *************************************************************/ SaErrorT oh_get_power_state( void * hnd, SaHpiResourceIdT rid, SaHpiPowerStateT * state ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cResource * r = TA::GetResource( handler, rid ); if ( !r ) { return SA_ERR_HPI_NOT_PRESENT; } return r->GetPowerState( *state ); } /************************************************************** * oh_set_power_state *************************************************************/ SaErrorT oh_set_power_state( void * hnd, SaHpiResourceIdT rid, SaHpiPowerStateT state ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cResource * r = TA::GetResource( handler, rid ); if ( !r ) { return SA_ERR_HPI_NOT_PRESENT; } return r->SetPowerState( state ); } /************************************************************** * oh_control_parm *************************************************************/ SaErrorT oh_control_parm( void * hnd, SaHpiResourceIdT rid, SaHpiParmActionT act ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cResource * r = TA::GetResource( handler, rid ); if ( !r ) { return SA_ERR_HPI_NOT_PRESENT; } return r->ControlParm( act ); } /************************************************************** * oh_load_id_get *************************************************************/ SaErrorT oh_load_id_get( void * hnd, SaHpiResourceIdT rid, SaHpiLoadIdT * load_id ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cResource * r = TA::GetResource( handler, rid ); if ( !r ) { return SA_ERR_HPI_NOT_PRESENT; } return r->GetLoadId( *load_id ); } /************************************************************** * oh_load_id_set *************************************************************/ SaErrorT oh_load_id_set( void * hnd, SaHpiResourceIdT rid, SaHpiLoadIdT * load_id ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cResource * r = TA::GetResource( handler, rid ); if ( !r ) { return SA_ERR_HPI_NOT_PRESENT; } return r->SetLoadId( *load_id ); } /************************************************************** * oh_get_reset_state *************************************************************/ SaErrorT oh_get_reset_state( void * hnd, SaHpiResourceIdT rid, SaHpiResetActionT * act ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cResource * r = TA::GetResource( handler, rid ); if ( !r ) { return SA_ERR_HPI_NOT_PRESENT; } return r->GetResetState( *act ); } /************************************************************** * oh_set_reset_state *************************************************************/ SaErrorT oh_set_reset_state( void * hnd, SaHpiResourceIdT rid, SaHpiResetActionT act ) { TA::cHandler * handler = TA::GetHandler( hnd ); TA::cLocker al( handler ); TA::cResource * r = TA::GetResource( handler, rid ); if ( !r ) { return SA_ERR_HPI_NOT_PRESENT; } return r->SetResetState( act ); } openhpi-3.6.1/plugins/dynamic_simulator/0000755000175100017510000000000012605014570017357 5ustar mohanmohanopenhpi-3.6.1/plugins/dynamic_simulator/new_sim_control_analog.cpp0000644000175100017510000001001212575647274024622 0ustar mohanmohan/** * @file new_sim_control_analog.cpp * * The file includes a class for analog control handling:\n * NewSimulatorControlAnalog * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * */ #include "new_sim_control.h" #include "new_sim_control_analog.h" #include "new_sim_domain.h" /** * Constructor **/ NewSimulatorControlAnalog::NewSimulatorControlAnalog( NewSimulatorResource *res, SaHpiRdrT rdr, SaHpiCtrlStateAnalogT state, SaHpiCtrlModeT mode ) : NewSimulatorControl( res, rdr, mode ) { memcpy(&m_rec, &rdr.RdrTypeUnion.CtrlRec.TypeUnion.Analog, sizeof( SaHpiCtrlRecAnalogT )); memcpy(&m_state, &state, sizeof( SaHpiCtrlStateAnalogT )); } /** * Destructor **/ NewSimulatorControlAnalog::~NewSimulatorControlAnalog() {} /** * A rdr structure is filled with the data * * This method is called by method NewSimulatorRdr::Populate(). * * @param resource Address of resource structure * @param rdr Address of rdr structure * * @return true **/ bool NewSimulatorControlAnalog::CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ) { if ( NewSimulatorControl::CreateRdr( resource, rdr ) == false ) return false; memcpy(&rdr.RdrTypeUnion.CtrlRec.TypeUnion.Analog, &m_rec, sizeof( SaHpiCtrlRecAnalogT )); return true; } /** * HPI function saHpiControlGet() * * See also the description of the function inside the specification or header file. * Copying the internal values (if a read is allowed). * * @param mode address to be filled * @param state address to be filled * * @return HPI return code **/ SaErrorT NewSimulatorControlAnalog::GetState( SaHpiCtrlModeT &mode, SaHpiCtrlStateT &state ) { if (m_write_only == SAHPI_TRUE) return SA_ERR_HPI_INVALID_CMD; if ( &mode != NULL ) { mode = m_ctrl_mode; } if ( &state != NULL ) { state.Type = m_type; memcpy( &state.StateUnion.Analog, &m_state, sizeof( SaHpiCtrlStateAnalogT )); } return SA_OK; } /** * HPI function saHpiControlSet() * * See also the description of the function inside the specification or header file. * Copying the internal values (if a read is allowed). * * @param mode address to be set * @param state address to be set * * @return HPI return code **/ SaErrorT NewSimulatorControlAnalog::SetState( const SaHpiCtrlModeT &mode, const SaHpiCtrlStateT &state ) { if (&mode == NULL) return SA_ERR_HPI_INVALID_PARAMS; if ((m_def_mode.ReadOnly == SAHPI_TRUE) && (mode != m_def_mode.Mode)) return SA_ERR_HPI_READ_ONLY; if (mode == SAHPI_CTRL_MODE_AUTO) { m_ctrl_mode = mode; return SA_OK; } if (mode != SAHPI_CTRL_MODE_MANUAL) return SA_ERR_HPI_INVALID_PARAMS; if (&state == NULL) return SA_ERR_HPI_INVALID_PARAMS; if (state.Type != m_type) return SA_ERR_HPI_INVALID_DATA; if ((state.StateUnion.Analog < m_rec.Min) || (state.StateUnion.Analog > m_rec.Max)) return SA_ERR_HPI_INVALID_DATA; m_state = state.StateUnion.Analog; m_ctrl_mode = mode; return SA_OK; } /** * Dump the control information * * @param dump Address of the log * **/ void NewSimulatorControlAnalog::Dump( NewSimulatorLog &dump ) const { dump << "Analog control " << m_id_string << ";\n"; dump << "ControlNum " << m_num << ";\n"; dump << "Oem" << m_oem << ";\n"; dump << "State" << m_state << ";\n"; dump << "Mode" << m_ctrl_mode << ";\n"; } openhpi-3.6.1/plugins/dynamic_simulator/new_sim_file_control.h0000644000175100017510000000415312575647274023756 0ustar mohanmohan/** * @file new_sim_file_control.h * * The file includes helper classes for parsing control data from the simulation file:\n * NewSimulatorFileControl * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * */ #ifndef __NEW_SIM_FILE_CONTROL_H__ #define __NEW_SIM_FILE_CONTROL_H__ #include extern "C" { #include "SaHpi.h" } #ifndef __NEW_SIM_FILE_RDR_H__ #include "new_sim_file_rdr.h" #endif #ifndef __NEW_SIM_RDR_H__ #include "new_sim_rdr.h" #endif #ifndef __NEW_SIM_RESOURCE_H__ #include "new_sim_resource.h" #endif #ifndef __NEW_SIM_CONTROL_H__ #include "new_sim_control.h" #endif /** * @class NewSimulatorFileControl * * Provides some functions for parsing the control section of the simulation file. **/ class NewSimulatorFileControl : public NewSimulatorFileRdr { private: /// static control rdr information SaHpiCtrlRecT *m_ctrl_rec; /// state of the control SaHpiCtrlStateT m_ctrl_state; /// mode of the control SaHpiCtrlModeT m_ctrl_mode; /// exists different mode bool m_diff_mode; /// exists different state bool m_diff_state; bool process_type_digital(); bool process_type_discrete(); bool process_type_analog(); bool process_type_stream(); bool process_state_stream(SaHpiCtrlStateStreamT *stream); bool process_type_text(); bool process_state_text(SaHpiCtrlStateTextT *text); bool process_type_oem(); bool process_state_oem(SaHpiCtrlStateOemT *oem); bool process_control_mode(); public: NewSimulatorFileControl(GScanner *scanner); virtual ~NewSimulatorFileControl(); virtual NewSimulatorRdr * process_token(NewSimulatorResource *res); }; #endif /*__NEW_SIM_FILE_CONTROL_H_*/ openhpi-3.6.1/plugins/dynamic_simulator/new_sim_sensor.h0000644000175100017510000001205112575647274022604 0ustar mohanmohan/** * @file new_sim_sensor.h * * The file includes an abstract class for sensor handling:\n * NewSimulatorSensor * * @author Lars Wetzel * @version 0.3 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * The new Simulator plugin is adapted from the ipmidirect plugin. * Thanks to * Thomas Kanngieser * Pierre Sangouard * */ #ifndef __NEW_SIM_SENSOR_H__ #define __NEW_SIM_SENSOR_H__ extern "C" { #include "SaHpi.h" } /** #ifndef __NEW_SIM_EVENT_H__ #include "new_sim_event.h" #endif **/ #ifndef __NEW_SIM_RDR_H__ #include "new_sim_rdr.h" #endif class NewSimulatorDomain; /** * @class NewSimulatorSensor * * Abstract class for simulating sensors * **/ class NewSimulatorSensor : public NewSimulatorRdr { protected: /// Record with the sensor information SaHpiSensorRecT m_sensor_record; /// Is this sensor enabled SaHpiBoolT m_enabled; /// Are events from this sensor enabled SaHpiBoolT m_events_enabled; /// Is the reading supported SaHpiBoolT m_read_support; /// Events assertion mask SaHpiEventStateT m_assert_mask; /// Events deassertion mask SaHpiEventStateT m_deassert_mask; /// SensorReading values SaHpiSensorReadingT m_read_data; /// EventState SaHpiEventStateT m_event_data; virtual bool gt(const SaHpiSensorReadingT &val1, const SaHpiSensorReadingT &val2); virtual bool ge(const SaHpiSensorReadingT &val1, const SaHpiSensorReadingT &val2); virtual bool lt(const SaHpiSensorReadingT &val1, const SaHpiSensorReadingT &val2); virtual bool le(const SaHpiSensorReadingT &val1, const SaHpiSensorReadingT &val2); virtual bool eq(const SaHpiSensorReadingT &val1, const SaHpiSensorReadingT &val2); virtual bool ltZero(const SaHpiSensorReadingT &val1); public: NewSimulatorSensor( NewSimulatorResource *res ); NewSimulatorSensor( NewSimulatorResource *res, SaHpiRdrT rdr, SaHpiSensorReadingT data, SaHpiEventStateT event_state, SaHpiEventStateT event_amask, SaHpiEventStateT event_dmask, SaHpiBoolT enabled, SaHpiBoolT event_enabled); virtual ~NewSimulatorSensor(); /// Return sensor Number virtual unsigned int Num() const { return m_sensor_record.Num; } /// Return Sensor Type SaHpiSensorTypeT Type() const { return m_sensor_record.Type; } /// Return Sensor Event Category SaHpiEventCategoryT EventCategory() const { return m_sensor_record.Category; } /// Return if Sensor is enabbled or not SaHpiBoolT EnableCtrl() const { return m_sensor_record.EnableCtrl; } /// Return the event change capability of the sensor SaHpiSensorEventCtrlT EventCtrl() const { return m_sensor_record.EventCtrl; } /// Return Sensor Event States SaHpiEventStateT EventStates() const { return m_sensor_record.Events; } /// Return Sensor Data Format SaHpiSensorDataFormatT DataFormat() const { return m_sensor_record.DataFormat; } /// Return Sensor Threshold definitions SaHpiSensorThdDefnT ThresholdDefn() const { return m_sensor_record.ThresholdDefn; } /// Return Sensor Oem information SaHpiUint32T Oem() const { return m_sensor_record.Oem; } /// Not clear if this function is really needed virtual void HandleNew( NewSimulatorDomain *domain ); /// Not implemented - to be verified if needed virtual bool Cmp( const NewSimulatorSensor &s2 ) const; // create an HPI event from ipmi event // virtual SaErrorT CreateEvent( NewSimulatorEvent *event, SaHpiEventT &h ); /// create and send HPI sensor enable change event void CreateEnableChangeEvent(); // handle all incoming sensor events // virtual void HandleEvent( NewSimulatorEvent *event ); virtual void Dump( NewSimulatorLog &dump ) const; /// create an RDR sensor record virtual bool CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ); // Official HPI functions /// abstract method for the GetSensorReading command virtual SaErrorT GetSensorReading( SaHpiSensorReadingT &data, SaHpiEventStateT &state ) = 0; SaErrorT GetEnable( SaHpiBoolT &enable ); SaErrorT GetEventEnables( SaHpiBoolT &enables ); SaErrorT GetEventMasks( SaHpiEventStateT &AssertEventMask, SaHpiEventStateT &DeassertEventMask); SaErrorT SetEnable( const SaHpiBoolT &enable ); SaErrorT SetEventEnables( const SaHpiBoolT &enables ); SaErrorT SetEventMasks( const SaHpiSensorEventMaskActionT &act, SaHpiEventStateT &AssertEventMask, SaHpiEventStateT &DeassertEventMask ); }; #endif openhpi-3.6.1/plugins/dynamic_simulator/new_sim_annunciator.cpp0000644000175100017510000002527712575647274024165 0ustar mohanmohan/** * @file new_sim_annunciator.cpp * * The file includes a class for annunciator handling:\n * NewSimulatorAnnunciator * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * */ #include #include #include #include #include #include "new_sim_domain.h" #include "new_sim_annunciator.h" #include "new_sim_announcement.h" #include "new_sim_entity.h" /** * Constructor **/ NewSimulatorAnnunciator::NewSimulatorAnnunciator( NewSimulatorResource *res ) : NewSimulatorRdr( res, SAHPI_ANNUNCIATOR_RDR ), m_mode( SAHPI_ANNUNCIATOR_MODE_SHARED ), m_ann_id( 0 ) { memset( &m_ann_rec, 0, sizeof( SaHpiAnnunciatorRecT )); } /** * Full qualified constructor to fill an object with the parsed data **/ NewSimulatorAnnunciator::NewSimulatorAnnunciator( NewSimulatorResource *res, SaHpiRdrT rdr ) : NewSimulatorRdr( res, SAHPI_ANNUNCIATOR_RDR, rdr.Entity, rdr.IsFru, rdr.IdString ), m_mode( SAHPI_ANNUNCIATOR_MODE_SHARED ), m_ann_id( 0 ) { memcpy(&m_ann_rec, &rdr.RdrTypeUnion.AnnunciatorRec, sizeof( SaHpiAnnunciatorRecT )); } /** * Destructor **/ NewSimulatorAnnunciator::~NewSimulatorAnnunciator() { } /** * Dump the Annunciator information * * @param dump Address of the log * **/ void NewSimulatorAnnunciator::Dump( NewSimulatorLog &dump ) const { char str[256]; IdString().GetAscii( str, 256 ); dump << "Annunciator: " << m_ann_rec.AnnunciatorNum << " " << str << "\n"; dump << "Announcements: " << "\n"; for (int i= 0; i < m_anns.Num(); i++) { m_anns[i]->Dump( dump ); } } /** * A rdr structure is filled with the data * * This method is called by method NewSimulatorRdr::Populate(). * * @param resource Address of resource structure * @param rdr Address of rdr structure * * @return true **/ bool NewSimulatorAnnunciator::CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ) { if ( NewSimulatorRdr::CreateRdr( resource, rdr ) == false ) return false; // Annunciator record memcpy(&rdr.RdrTypeUnion.AnnunciatorRec, &m_ann_rec, sizeof(SaHpiAnnunciatorRecT)); return true; } /** * Find announcement by announcement pointer * * @param ann pointer on the announcement to be found * @return return the same pointer if it could be found successfully **/ NewSimulatorAnnouncement *NewSimulatorAnnunciator::FindAnnouncement( NewSimulatorAnnouncement *ann ) { for( int i = 0; i < m_anns.Num(); i++ ) { NewSimulatorAnnouncement *a = m_anns[i]; if ( a == ann ) return ann; } return 0; } /** * Add an announcement to the array if it isn't already included in the array * * @param ann pointer to announcement to be added * @return bool if successful **/ bool NewSimulatorAnnunciator::AddAnnouncement( NewSimulatorAnnouncement *ann ) { if ( FindAnnouncement( ann ) ) { return false; } if (ann->EntryId() > m_ann_id) m_ann_id = ann->EntryId(); m_anns.Add( ann ); return true; } /** * The annunciator data is copied into the internal record structer * * @param ann_data Record to be copied into the internal structure **/ void NewSimulatorAnnunciator::SetData( SaHpiAnnunciatorRecT ann_data ) { memcpy( &m_ann_rec, &ann_data, sizeof( SaHpiAnnunciatorRecT )); } // Official HPI functions /** * HPI function saHpiAnnunciatorGetNext() * * See also the description of the function inside the specification or header file. * Copying the internal reading values (if a read is allowed). * * @param severity of announcement to get * @param uackOnly flag if only unacknowledge announcement should be returned * @param ann address to announcement structure where the announcement should be copied to * * @return HPI return code **/ SaErrorT NewSimulatorAnnunciator::GetNextAnnouncement( SaHpiSeverityT severity, SaHpiBoolT uackOnly, SaHpiAnnouncementT &ann ) { SaHpiEntryIdT num; SaHpiTimeT time; NewSimulatorAnnouncement *a; bool found = false; if (&ann == NULL) return SA_ERR_HPI_INVALID_PARAMS; if (m_anns.Num() == 0) return SA_ERR_HPI_NOT_PRESENT; if (ann.EntryId == SAHPI_FIRST_ENTRY) { a = m_anns[0]; num = a->EntryId(); time = a->TimeStamp(); found = true; } else { num = ann.EntryId; time = ann.Timestamp; } for (int i = 0; i < m_anns.Num(); i++) { a = m_anns[i]; // Be aware that the previos Announcement can already be deleted if (( a->EntryId() > num ) && ( a->TimeStamp() >= time )) { found = true; } if (found) { // If we have found the previous announcement, we have to check the criteria if ( (severity == SAHPI_ALL_SEVERITIES) || (severity == a->Severity()) ) { if ( (uackOnly == SAHPI_TRUE) && !a->IsAcknowledge() ) { memcpy( &ann, &a->AnnRec(), sizeof( SaHpiAnnouncementT )); return SA_OK; } else if (uackOnly == SAHPI_FALSE) { memcpy( &ann, &a->AnnRec(), sizeof( SaHpiAnnouncementT )); return SA_OK; } } } else { // Find the previous announciator if ( a->EntryId() == num ) { if ( a->TimeStamp() == time ) { found = true; } else { return SA_ERR_HPI_INVALID_DATA; } } } } return SA_ERR_HPI_NOT_PRESENT; } /** * HPI function saHpiAnnunciatorGet() * * See also the description of the function inside the specification or header file. * Copying the internal reading values (if a read is allowed). * * @param num announcement id * @param ann address to Announcement structure where the announcement should be copied to * * @return HPI return code **/ SaErrorT NewSimulatorAnnunciator::GetAnnouncement( SaHpiEntryIdT num, SaHpiAnnouncementT &ann ) { if ((&ann == NULL) || (num == SAHPI_FIRST_ENTRY) || (num == SAHPI_LAST_ENTRY)) return SA_ERR_HPI_INVALID_PARAMS; for (int i = 0; i < m_anns.Num(); i++) { NewSimulatorAnnouncement *a = m_anns[i]; if ( a->EntryId() == num ) { memcpy( &ann, &a->AnnRec(), sizeof( SaHpiAnnouncementT )); return SA_OK; } } return SA_ERR_HPI_NOT_PRESENT; } /** * HPI function saHpiAnnunciatorAcknowledge() * * See also the description of the function inside the specification or header file. * Copying the internal reading values (if a read is allowed). * * @param num announcement id to be acknowledged * @param severity everity of announcements to be acknowledged * * @return HPI return code **/ SaErrorT NewSimulatorAnnunciator::SetAcknowledge( SaHpiEntryIdT num, SaHpiSeverityT severity) { for (int i = 0; i < m_anns.Num(); i++) { NewSimulatorAnnouncement *ann = m_anns[i]; if (num != SAHPI_ENTRY_UNSPECIFIED) { if ( ann->EntryId() == num ) { ann->SetAcknowledge( true ); return SA_OK; } } else { if ( (severity == SAHPI_ALL_SEVERITIES) || (severity == ann->Severity()) ) ann->SetAcknowledge( true ); } } if (num != SAHPI_ENTRY_UNSPECIFIED) return SA_ERR_HPI_NOT_PRESENT; return SA_OK; } /** * HPI function saHpiAnnunciatorAdd() * * See also the description of the function inside the specification or header file. * Copying the internal reading values (if a read is allowed). * * @param ann announcement to be added * * @return HPI return code **/ SaErrorT NewSimulatorAnnunciator::AddAnnouncement( SaHpiAnnouncementT &ann ) { if (&ann == NULL) return SA_ERR_HPI_INVALID_PARAMS; if (m_mode == SAHPI_ANNUNCIATOR_MODE_AUTO) return SA_ERR_HPI_READ_ONLY; ann.AddedByUser = SAHPI_TRUE; oh_gettimeofday(&ann.Timestamp); ann.EntryId = ValidEntryId(); NewSimulatorAnnouncement *ann_obj = new NewSimulatorAnnouncement( ann ); if ( ann_obj == NULL) return SA_ERR_HPI_OUT_OF_SPACE; m_anns.Add( ann_obj ); return SA_OK; } /** * HPI function saHpiAnnunciatorDelete() * * See also the description of the function inside the specification or header file. * * @param num entryId of announcement to be deleted * @param severity severity of announcements to be deleted * * @return HPI return code **/ SaErrorT NewSimulatorAnnunciator::DeleteAnnouncement( SaHpiEntryIdT &num, SaHpiSeverityT &severity) { if (m_mode == SAHPI_ANNUNCIATOR_MODE_AUTO) return SA_ERR_HPI_READ_ONLY; for (int i = m_anns.Num() - 1; i >= 0; i--) { NewSimulatorAnnouncement *ann = m_anns[i]; if (num != SAHPI_ENTRY_UNSPECIFIED) { if ( ann->EntryId() == num ) { m_anns.Rem( i ); return SA_OK; } } else { if ( (severity == SAHPI_ALL_SEVERITIES) || (severity == ann->Severity()) ) m_anns.Rem( i ); } } if (num != SAHPI_ENTRY_UNSPECIFIED) return SA_ERR_HPI_NOT_PRESENT; return SA_OK; } /** * HPI function saHpiAnnunciatorModeGet() * * See also the description of the function inside the specification or header file. * Copying the internal reading values (if a read is allowed). * * @param mode address of return value * * @return HPI return code **/ SaErrorT NewSimulatorAnnunciator::GetMode( SaHpiAnnunciatorModeT &mode ) { if (&mode == NULL) return SA_ERR_HPI_INVALID_PARAMS; mode = m_mode; return SA_OK; } /** * HPI function saHpiAnnunciatorModeSet() * * See also the description of the function inside the specification or header file. * Copying the internal reading values (if a read is allowed). * * @param mode to be set * * @return HPI return code **/ SaErrorT NewSimulatorAnnunciator::SetMode( SaHpiAnnunciatorModeT mode ) { if ( m_ann_rec.ModeReadOnly == SAHPI_TRUE) return SA_ERR_HPI_READ_ONLY; if ((mode != SAHPI_ANNUNCIATOR_MODE_AUTO) && (mode != SAHPI_ANNUNCIATOR_MODE_USER) && (mode != SAHPI_ANNUNCIATOR_MODE_SHARED)) return SA_ERR_HPI_INVALID_PARAMS; m_mode = mode; return SA_OK; } openhpi-3.6.1/plugins/dynamic_simulator/new_sim_resource.cpp0000644000175100017510000002473012575647274023464 0ustar mohanmohan/** * @file new_sim_resource.cpp * * The file includes a class for handling resources: * NewSimulatorResource * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * The new Simulator plugin is adapted from the ipmidirect plugin. * Thanks to \n * Thomas Kanngieser \n * Pierre Sangouard * **/ #include #include #include #include #include "new_sim_resource.h" #include "new_sim_domain.h" /** * Constructor **/ NewSimulatorResource::NewSimulatorResource( NewSimulatorDomain *domain ) : m_domain( domain ), m_hotswap( this ), m_is_fru( false ), m_oem( 0 ), m_current_control_id( 0 ), m_populate( false ) { for( int i = 0; i < 256; i++ ) m_sensor_num[i] = -1; m_power_state = SAHPI_POWER_OFF; memset( &m_rpt_entry, 0, sizeof( SaHpiRptEntryT )); m_hotswap_indicator = SAHPI_HS_INDICATOR_OFF; m_reset_state = SAHPI_RESET_DEASSERT; } /** * Destructor **/ NewSimulatorResource::~NewSimulatorResource() {} /** * Return the domain to which the resource is mapped * * @return pointer on domain **/ NewSimulatorDomain *NewSimulatorResource::Domain() const { return m_domain; } /** * @deprecated Create a Sensor number * * @param num sensor number * @return sensor number to be used in HPI **/ int NewSimulatorResource::CreateSensorNum( SaHpiSensorNumT num ) { int v = num; if ( m_sensor_num[v] != -1 ) { for( int i = 0xff; i >= 0; i-- ) if ( m_sensor_num[i] == -1 ) { v = i; break; } if ( m_sensor_num[v] != -1 ) { assert( 0 ); return -1; } } m_sensor_num[v] = num; return v; } /** * Set the resource information * * @param resinfo resource information to be set in the resource **/ void NewSimulatorResource::SetResourceInfo( SaHpiResourceInfoT resinfo ) { memcpy( &m_rpt_entry.ResourceInfo, &resinfo, sizeof( SaHpiResourceInfoT ) ); } /** * Destroy the resource and clean up * * @return success **/ bool NewSimulatorResource::Destroy() { SaHpiRptEntryT *rptentry; stdlog << "removing resource: " << m_entity_path << ").\n"; while( Num() ) { NewSimulatorRdr *rdr = GetRdr( 0 ); RemRdr( rdr ); delete rdr; } rptentry = oh_get_resource_by_id( Domain()->GetHandler()->rptcache, m_rpt_entry.ResourceId ); if ( !rptentry ) { stdlog << "Can't find resource in plugin cache !\n"; } else { // create remove event oh_event *e = (oh_event *)g_malloc0( sizeof( oh_event ) ); // remove sensors only if resource is FRU if ( rptentry->ResourceCapabilities & SAHPI_CAPABILITY_FRU ) { e->event.EventType = SAHPI_ET_HOTSWAP; if (e->resource.ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP) { e->event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_NOT_PRESENT; e->event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_NOT_PRESENT; } else { e->event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_NOT_PRESENT; e->event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_ACTIVE; } } else { e->event.EventType = SAHPI_ET_RESOURCE; e->event.EventDataUnion.ResourceEvent.ResourceEventType = SAHPI_RESE_RESOURCE_FAILURE; rptentry->ResourceFailed = SAHPI_TRUE; } e->event.Source = rptentry->ResourceId; oh_gettimeofday(&e->event.Timestamp); e->event.Severity = rptentry->ResourceSeverity; e->resource = *rptentry; stdlog << "NewSimulatorResource::Destroy OH_ET_RESOURCE_DEL Event resource " << m_rpt_entry.ResourceId << "\n"; Domain()->AddHpiEvent( e ); // remove resource from local cache int rv = oh_remove_resource( Domain()->GetHandler()->rptcache, m_rpt_entry.ResourceId ); if ( rv != 0 ) { stdlog << "Can't remove resource from plugin cache !\n"; } } m_domain->RemResource( this ); delete this; return true; } /** * Find a rdr entry with the correct type and number * * @param type type of rdr entry * @param num number of rdr entry * * @return pointer on the rdr object **/ NewSimulatorRdr *NewSimulatorResource::FindRdr( SaHpiRdrTypeT type, unsigned int num) { for( int i = 0; i < NumRdr(); i++ ) { NewSimulatorRdr *r = GetRdr( i ); if ( r->Type() == type && r->Num() == num ) return r; } return 0; } /** * Add a rdr entry * * @param rdr pointer on the rdr to be added * @return success **/ bool NewSimulatorResource::AddRdr( NewSimulatorRdr *rdr ) { stdlog << "adding rdr: " << rdr->EntityPath(); stdlog << " " << rdr->Num(); stdlog << " " << rdr->IdString() << "\n"; // set resource rdr->Resource() = this; // add rdr to resource Add( rdr ); return true; } /** * Remove a rdr entry * * @param rdr pointer on the rdr to be deleted * @return success **/ bool NewSimulatorResource::RemRdr( NewSimulatorRdr *rdr ) { int idx = Find( rdr ); if ( idx == -1 ) { stdlog << "user requested removal of a control" " from a resource, but the control was not there !\n"; return false; } Rem( idx ); return true; } /** * Initialize a new resource * * @param entry address of RptEntry structure * @return success **/ bool NewSimulatorResource::Create( SaHpiRptEntryT &entry ) { stdlog << "DBG: Resource::Create: " << m_entity_path << ".\n"; stdlog << "DBG: Should be checked\n"; entry.EntryId = 0; // resource info SaHpiResourceInfoT &info = entry.ResourceInfo; memset( &info, 0, sizeof( SaHpiResourceInfoT ) ); entry.ResourceEntity = m_entity_path; entry.ResourceId = oh_uid_from_entity_path( &entry.ResourceEntity ); entry.ResourceCapabilities = SAHPI_CAPABILITY_RESOURCE; // if ( m_sel ) // entry.ResourceCapabilities |= SAHPI_CAPABILITY_EVENT_LOG; if ( m_is_fru == true ) { entry.ResourceCapabilities |= SAHPI_CAPABILITY_FRU; } entry.HotSwapCapabilities = 0; entry.ResourceSeverity = SAHPI_OK; entry.ResourceFailed = SAHPI_FALSE; entry.ResourceTag = ResourceTag(); return true; } /** * Popolate the resource * * @return success **/ bool NewSimulatorResource::Populate() { stdlog << "DBG: Start Populate()\n"; if ( m_populate == false ) { stdlog << "DBG: populate resource: " << EntityPath() << ".\n"; // Work with some rpt_entries m_rpt_entry.ResourceTag = ResourceTag(); if (m_rpt_entry.ResourceCapabilities & SAHPI_CAPABILITY_FRU) { m_is_fru = true; } else { m_is_fru = false; } struct oh_event *e = (struct oh_event *)g_malloc0( sizeof( struct oh_event ) ); // Get own ResourceId e->resource.ResourceEntity = m_entity_path; m_rpt_entry.ResourceEntity = m_entity_path; m_rpt_entry.ResourceId = oh_uid_from_entity_path( &(e->resource.ResourceEntity) ); memcpy(&e->resource, &m_rpt_entry, sizeof (SaHpiRptEntryT)); // add the resource to the resource cache int rv = oh_add_resource( Domain()->GetHandler()->rptcache, &(e->resource), this, 1 ); if ( rv != 0 ) { stdlog << "Can't add resource to plugin cache !\n"; g_free( e ); return false; } // find updated resource in plugin cache SaHpiRptEntryT *resource = oh_get_resource_by_id( Domain()->GetHandler()->rptcache, m_rpt_entry.ResourceId ); if (!resource) return false; for( int i = 0; i < NumRdr(); i++ ) { NewSimulatorRdr *rdr = GetRdr( i ); if ( rdr->Populate(&e->rdrs) == false ) return false; } m_hotswap.SetTimeouts( Domain()->InsertTimeout(), Domain()->ExtractTimeout()); // Update resource in event accordingly memcpy(&e->resource, resource, sizeof (SaHpiRptEntryT)); stdlog << "NewSimulatorResource::Populate start the hotswap state transitions\n"; if ( m_hotswap.StartResource( e ) != SA_OK ) return false; if ( ResourceCapabilities() & SAHPI_CAPABILITY_MANAGED_HOTSWAP ) if ( m_hotswap.ActionRequest( SAHPI_HS_ACTION_INSERTION ) != SA_OK ) stdlog << "ERR: ActionRequest returns an error\n"; m_populate = true; } return true; } /** * Dump the information of the resource * * @param dump address of logfile **/ void NewSimulatorResource::Dump( NewSimulatorLog &dump ) const { dump << "Resource " << m_rpt_entry.ResourceId << " " << m_entity_path << "\n"; dump << " EntryId " << m_rpt_entry.EntryId << "\n"; dump << " ResourceId " << m_rpt_entry.ResourceId << "\n"; dump << " ResourceInfo\n"; dump << " ResourceRev " << m_rpt_entry.ResourceInfo.ResourceRev << "\n"; dump << " SpecificVer " << m_rpt_entry.ResourceInfo.SpecificVer << "\n"; dump << " DeviceSupport " << m_rpt_entry.ResourceInfo.DeviceSupport << "\n"; dump << " ManufacturerId " << m_rpt_entry.ResourceInfo.ManufacturerId << "\n"; dump << " ProductId " << m_rpt_entry.ResourceInfo.ProductId << "\n"; dump << " FirmwareMajorRev " << m_rpt_entry.ResourceInfo.FirmwareMajorRev << "\n"; dump << " FirmwareMinorRev " << m_rpt_entry.ResourceInfo.FirmwareMinorRev << "\n"; dump << " AuxFirmwareRev " << m_rpt_entry.ResourceInfo.AuxFirmwareRev << "\n"; dump << " ResourceEntity " << m_rpt_entry.ResourceEntity << "\n"; dump << " ResourceCapabilities " << m_rpt_entry.ResourceCapabilities << "\n"; dump << " HotSwapCapabilities " << m_rpt_entry.HotSwapCapabilities << "\n"; dump << " ResourceSeverity " << m_rpt_entry.ResourceSeverity << "\n"; dump << " ResourceFailed " << m_rpt_entry.ResourceFailed << "\n"; dump << " ResourceTag " << m_rpt_entry.ResourceTag << "\n"; dump << "------------------------\n"; } openhpi-3.6.1/plugins/dynamic_simulator/new_sim_file_util.h0000644000175100017510000000632412575647274023255 0ustar mohanmohan/** * @file new_sim_file_util.h * * The file includes some helper classes for parsing the simulation file:\n * SimulatorTokens\n * NewSimulatorFileUtil * * @author Lars Wetzel * @version 0.2 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * */ #ifndef __NEW_SIM_FILE_UTIL_H__ #define __NEW_SIM_FILE_UTIL_H__ #include #ifndef __NEW_SIM_TEXT_BUFFER_H__ #include "new_sim_text_buffer.h" #endif #ifndef __NEW_SIM_ENTITY_H__ #include "new_sim_entity.h" #endif extern "C" { #include "SaHpi.h" } /** * @enum SimTokenType * Enhancemeent of standard tokens from GScanner to have it a little bit easier * when scanning the simulation file. **/ enum SimTokenType { CONFIG_TOKEN_HANDLER = G_TOKEN_LAST, RPT_TOKEN_HANDLER, RDR_TOKEN_HANDLER, RDR_DETAIL_TOKEN_HANDLER, SENSOR_TOKEN_HANDLER, CONTROL_TOKEN_HANDLER, INVENTORY_TOKEN_HANDLER, WATCHDOG_TOKEN_HANDLER, ANNUNCIATOR_TOKEN_HANDLER, DIMI_TOKEN_HANDLER, FUMI_TOKEN_HANDLER, CONTROL_GET_TOKEN_HANDLER, SENSOR_DATA_TOKEN_HANDLER, INVENTORY_DATA_TOKEN_HANDLER, INV_AREA_TOKEN_HANDLER, INV_FIELD_TOKEN_HANDLER, WDT_GET_TOKEN_HANDLER, ANNUNCIATOR_DATA_TOKEN_HANDLER, ANNOUNCEMENT_TOKEN_HANDLER, DIMI_DATA_TOKEN_HANDLER, DIMI_TESTCASE_TOKEN_HANDLER, DIMI_TEST_DATA_TOKEN_HANDLER, FUMI_DATA_TOKEN_HANDLER, FUMI_SOURCE_DATA_TOKEN_HANDLER, FUMI_TARGET_DATA_TOKEN_HANDLER, FUMI_LOG_TARGET_DATA_TOKEN_HANDLER }; /** * @class SimulatorToken * * Holds one token which is needed for parsing * * In order to use the glib lexical parser we need to define token * types which we want to switch on. **/ class SimulatorToken { private: gchar *m_name; //!< Name of one token guint m_token; //!< Value of the token public: SimulatorToken(const gchar *name, const guint token); ~SimulatorToken(); gchar *Name() { return m_name; } //!< Read/Write function to the private m_name value guint &Token() { return m_token; } //!< Read/Write function fo the private m_token value }; /** * @class NewSimulatorFileUtil * * Provides some helper functions for parsing. **/ class NewSimulatorFileUtil { protected: GScanner *m_scanner; //!< Holding the scanner pointer /// Root entity path comes from configuration file NewSimulatorEntityPath m_root_ep; public: NewSimulatorFileUtil( NewSimulatorEntityPath root ); NewSimulatorFileUtil( GScanner *scanner ); ~NewSimulatorFileUtil(); bool process_textbuffer(NewSimulatorTextBuffer &buffer); bool process_textbuffer(SaHpiTextBufferT &text); bool process_entity( SaHpiEntityPathT &path ); bool process_hexstring(guint max_len, gchar *str, SaHpiUint8T *hexlist); }; #endif /*NEW_SIM_FILE_H_*/ openhpi-3.6.1/plugins/dynamic_simulator/new_sim_control_analog.h0000644000175100017510000000331012575647274024272 0ustar mohanmohan/** * @file new_sim_control_analog.h * * The file includes a class for analog control handling:\n * NewSimulatorControlAnalog * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * */ #ifndef __NEW_SIM_CONTROL_ANALOG_H__ #define __NEW_SIM_CONTROL_ANALOG_H__ #ifndef __NEW_SIM_RDR_H__ #include "new_sim_rdr.h" #endif #ifndef __NEW_SIM_CONTROL_H__ #include "new_sim_control.h" #endif extern "C" { #include "SaHpi.h" } /** * @class NewSimulatorControlAnalog * * Class for simulating Analog controls * **/ class NewSimulatorControlAnalog : public NewSimulatorControl { protected: /// rdr information - Analog record SaHpiCtrlRecAnalogT m_rec; /// state of the control SaHpiCtrlStateAnalogT m_state; public: NewSimulatorControlAnalog( NewSimulatorResource *res, SaHpiRdrT rdr, SaHpiCtrlStateAnalogT state, SaHpiCtrlModeT mode ); virtual ~NewSimulatorControlAnalog(); // create an RDR sensor record virtual bool CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ); virtual SaErrorT SetState( const SaHpiCtrlModeT &mode, const SaHpiCtrlStateT &state ); virtual SaErrorT GetState( SaHpiCtrlModeT &mode, SaHpiCtrlStateT &state ); virtual void Dump( NewSimulatorLog &dump ) const; }; #endif openhpi-3.6.1/plugins/dynamic_simulator/new_sim_file_fumi.h0000644000175100017510000000372112575647274023236 0ustar mohanmohan/** * @file new_sim_file_fumi.h * * The file includes helper classes for parsing fumi data from the simulation file:\n * NewSimulatorFileFumi * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * */ #ifndef __NEW_SIM_FILE_FUMI_H__ #define __NEW_SIM_FILE_FUMI_H__ #include extern "C" { #include "SaHpi.h" } #ifndef __NEW_SIM_FILE_RDR_H__ #include "new_sim_file_rdr.h" #endif #ifndef __NEW_SIM_RDR_H__ #include "new_sim_rdr.h" #endif #ifndef __NEW_SIM_RESOURCE_H__ #include "new_sim_resource.h" #endif #ifndef __NEW_SIM_FUMI_H__ #include "new_sim_fumi.h" #endif #ifndef __NEW_SIM_FUMI_DATA_H__ #include "new_sim_fumi_data.h" #endif /** * @class NewSimulatorFileFumi * * Provides some functions for parsing the fumi section of the simulation file. **/ class NewSimulatorFileFumi : public NewSimulatorFileRdr { private: /// static control rdr information SaHpiFumiRecT *m_fumi_rec; bool process_fumi_data( NewSimulatorFumi *fumi ); bool process_fumi_source_info( NewSimulatorFumiBank *bank ); bool process_fumi_component( NewSimulatorFumiComponent *comp ); bool process_fumi_firmware( SaHpiFumiFirmwareInstanceInfoT &fw ); bool process_fumi_target_info( NewSimulatorFumiBank *bank ); bool process_fumi_logical_target_info( NewSimulatorFumiBank *bank ); bool process_fumi_logical_component( NewSimulatorFumiComponent *comp ); public: NewSimulatorFileFumi(GScanner *scanner); virtual ~NewSimulatorFileFumi(); virtual NewSimulatorRdr * process_token(NewSimulatorResource *res); }; #endif /*__NEW_SIM_FILE_FUMI_H_*/ openhpi-3.6.1/plugins/dynamic_simulator/new_sim_event_log.cpp0000644000175100017510000001521412575647274023614 0ustar mohanmohan/** * @file new_sim_event_log.cpp * * The file includes the implementation of a class for an event log wrapper: * NewSimulatorEventLog * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * This EventLog class is adapted from the simulator plugin. * Thanks to * W. David Ashley * Suntrupth S Yadav */ #include "new_sim_event_log.h" #include "new_sim_log.h" #include #include #include #include #include /** * Constructor **/ NewSimulatorEventLog::NewSimulatorEventLog() { capability = SAHPI_EVTLOG_CAPABILITY_ENTRY_ADD | SAHPI_EVTLOG_CAPABILITY_CLEAR | SAHPI_EVTLOG_CAPABILITY_TIME_SET | SAHPI_EVTLOG_CAPABILITY_STATE_SET; } /** * Destructor **/ NewSimulatorEventLog::~NewSimulatorEventLog() { } // Official HPI functions /** * HPI function saHpiEventLogInfoGet() * * See also the description of the function inside the specification or header file. * * @param hstate pointer on the handler state struct * @param info pointer to the returned Event Log information * * @return HPI return code **/ SaErrorT NewSimulatorEventLog::IfELGetInfo(oh_handler_state *hstate, SaHpiEventLogInfoT *info) { if (info == NULL) return SA_ERR_HPI_INVALID_PARAMS; return oh_el_info(hstate->elcache, info); } /** * HPI function saHpiEventLogStateSet() * * See also the description of the function inside the specification or header file. * * @param hstate pointer on the handler state struct * @param state event Log state to be set * * @return HPI return code **/ SaErrorT NewSimulatorEventLog::IfELSetState(oh_handler_state *hstate, SaHpiBoolT state) { return oh_el_enableset(hstate->elcache, state); } /** * HPI function saHpiEventLogStateGet() * * See also the description of the function inside the specification or header file. * * @param hstate pointer on the handler state struct * @param state pointer to the current event log enable state * * @return HPI return code **/ SaErrorT NewSimulatorEventLog::IfELGetState(oh_handler_state *hstate, SaHpiBoolT *state) { SaHpiEventLogInfoT elinfo; SaErrorT rv; rv = oh_el_info(hstate->elcache, &elinfo); *state = elinfo.Enabled; return rv; } /** * HPI function saHpiEventLogTimeSet() * * See also the description of the function inside the specification or header file. * * @param hstate pointer on the handler state struct * @param time time to which the Event Log clock should be set * * @return HPI return code **/ SaErrorT NewSimulatorEventLog::IfELSetTime(oh_handler_state *hstate, SaHpiTimeT time) { return oh_el_timeset(hstate->elcache, time); } /** * HPI function saHpiEventLogEntryAdd() * * See also the description of the function inside the specification or header file. * * @param hstate pointer on the handler state struct * @param event pointer to event data to write to the Event Log * * @return HPI return code **/ SaErrorT NewSimulatorEventLog::IfELAddEntry(oh_handler_state *hstate, const SaHpiEventT *event) { if (!event) return SA_ERR_HPI_INVALID_PARAMS; return oh_el_append(hstate->elcache, event, NULL, NULL); } /** * HPI function saHpiEventLogEntryGet() * * See also the description of the function inside the specification or header file. * * @param hstate pointer on the handler state struct * @param current Identifier of event log entry to retrieve * @param prev Event Log entry identifier for the previous entry * @param next Event Log entry identifier for the next entry * @param entry Pointer to retrieved Event Log entry * @param rdr Pointer to structure to receive resource data record * @param rptentry Pointer to structure to receive RPT entry * * @return HPI return code **/ SaErrorT NewSimulatorEventLog::IfELGetEntry(oh_handler_state *hstate, SaHpiEventLogEntryIdT current, SaHpiEventLogEntryIdT *prev, SaHpiEventLogEntryIdT *next, SaHpiEventLogEntryT *entry, SaHpiRdrT *rdr, SaHpiRptEntryT *rptentry) { SaErrorT rv; oh_el_entry tmpentry, *tmpentryptr; tmpentryptr = &tmpentry; if (!prev || !next || !entry) return SA_ERR_HPI_INVALID_PARAMS; rv = oh_el_get(hstate->elcache, current, prev, next, &tmpentryptr); if (rv != SA_OK) return rv; memcpy(entry, &(tmpentryptr->event), sizeof(SaHpiEventLogEntryT)); if (rdr) memcpy(rdr, &tmpentryptr->rdr, sizeof(SaHpiRdrT)); if (rptentry) memcpy(rptentry, &(tmpentryptr->res), sizeof(SaHpiRptEntryT)); return rv; } /** * HPI function saHpiEventLogClear() * * See also the description of the function inside the specification or header file. * * @param hstate pointer on the handler state struct * * @return HPI return code **/ SaErrorT NewSimulatorEventLog::IfELClear(oh_handler_state *hstate) { return oh_el_clear(hstate->elcache); } /** * HPI function saHpiEventLogOverflowReset() * * See also the description of the function inside the specification or header file. * * @param hstate pointer on the handler state struct * * @return HPI return code **/ SaErrorT NewSimulatorEventLog::IfELOverflow(oh_handler_state *hstate) { return oh_el_overflowreset(hstate->elcache); } /** * HPI function saHpiEventLogCapabilitiesGet() * * See also the description of the function inside the specification or header file. * * @param hstate pointer on the handler state struct * @param caps Pointer to store the Event Log Capabilities value * * @return HPI return code **/ SaErrorT NewSimulatorEventLog::IfELGetCaps(oh_handler_state *hstate, SaHpiEventLogCapabilitiesT *caps) { *caps = capability; if (hstate->elcache->info.OverflowResetable) { *caps |= SAHPI_EVTLOG_CAPABILITY_OVERFLOW_RESET; } return SA_OK; } openhpi-3.6.1/plugins/dynamic_simulator/new_sim_log.h0000644000175100017510000000702112575647274022055 0ustar mohanmohan/** * @file new_sim_log.h * * The file includes the definition for a class for logfile handling:\n * NewSimulatorLog * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * The new Simulator plugin is adapted from the ipmidirect plugin. * Thanks to * Thomas Kanngieser * Pierre Sangouard * */ #ifndef __NEW_SIM_LOG_H__ #define __NEW_SIM_LOG_H__ #ifndef __THREAD_H__ #include "thread.h" #endif #include #include /// default logfile name #define dDefaultLogfile "log" /* log file properties */ #define dIpmiLogPropNone 0 //!< no property #define dIpmiLogStdOut 1 //!< use stdout #define dIpmiLogStdErr 2 //!< use stderr #define dIpmiLogLogFile 4 //!< use a log file #define dIpmiLogFile 8 //!< use a file /** * @class NewSimulatorLog * * Class for the handling of logfiles * **/ class NewSimulatorLog { protected: /// Thread lock cThreadLock m_lock; /// count of locks int m_lock_count; /// count of open files int m_open_count; /// flag if hex values are written bool m_hex; // true => print int in hex /// flag if time should be written bool m_time; // with time /// flag recursive bool m_recursive; /// flag if output should be on stdout bool m_std_out; /// flag if output should be on stderr bool m_std_err; /// flag for newline bool m_nl; /// file handler FILE *m_fd; void Start(); void Output( const char *str ); public: NewSimulatorLog(); virtual ~NewSimulatorLog(); bool Open( int properties, const char *filename = "", int max_log_files = 1 ); void Close(); /** * Set a lock **/ void Lock() { m_lock.Lock(); m_lock_count++; } /** * Unset a lock **/ void Unlock() { m_lock_count--; assert( m_lock_count >= 0 ); m_lock.Unlock(); } /** * Set/Unset hex flag * @param hex bool value - set yes/no **/ void Hex( bool hex = true ) { m_hex = hex; } /// Is the hex flag set bool IsHex() { return m_hex; } /** * Set/Unset time flag * @param t bool value - set yes/no **/ void Time( bool t = true ) { m_time = t; } /// Is the time flag set bool WithTime() { return m_time; } /** * Set/Unset recursive flag * @param r bool value - set yes/no **/ void Recursive( bool r ) { m_recursive = true; } /// Is the recursive flag set bool IsRecursive() { return m_recursive; } NewSimulatorLog &operator<<( bool b ); NewSimulatorLog &operator<<( unsigned char c ); NewSimulatorLog &operator<<( int i ); NewSimulatorLog &operator<<( unsigned int i ); NewSimulatorLog &operator<<( long l ); NewSimulatorLog &operator<<( double d ); NewSimulatorLog &operator<<( const char *str ); void Log( const char *fmt, ... ); void Hex( const unsigned char *data, int size ); void Begin( const char *section, const char *name ); void End(); NewSimulatorLog &Entry( const char *entry ); }; /// Define object stdlog of class NewSimulatorLog extern NewSimulatorLog stdlog; #endif openhpi-3.6.1/plugins/dynamic_simulator/new_sim_fumi.cpp0000644000175100017510000002752612575647274022603 0ustar mohanmohan/** * @file new_sim_fumi.cpp * * The file includes a class for fumi handling:\n * NewSimulatorFumi * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * */ #include #include #include #include #include #include "new_sim_domain.h" #include "new_sim_fumi.h" #include "new_sim_fumi_data.h" #include "new_sim_entity.h" /** * Constructor **/ NewSimulatorFumi::NewSimulatorFumi( NewSimulatorResource *res ) : NewSimulatorRdr( res, SAHPI_FUMI_RDR ), m_dis_rb( SAHPI_TRUE ) { memset( &m_fumi_rec, 0, sizeof( SaHpiFumiRecT )); memset( &m_spec_info, 0, sizeof( SaHpiFumiSpecInfoT )); memset( &m_impact_data, 0, sizeof( SaHpiFumiServiceImpactDataT )); } /** * Full qualified constructor to fill an object with the parsed data **/ NewSimulatorFumi::NewSimulatorFumi( NewSimulatorResource *res, SaHpiRdrT rdr) : NewSimulatorRdr( res, SAHPI_FUMI_RDR, rdr.Entity, rdr.IsFru, rdr.IdString ), m_dis_rb( SAHPI_TRUE ) { memcpy(&m_fumi_rec, &rdr.RdrTypeUnion.FumiRec, sizeof( SaHpiFumiRecT )); memset( &m_spec_info, 0, sizeof( SaHpiFumiSpecInfoT )); memset( &m_impact_data, 0, sizeof( SaHpiFumiServiceImpactDataT )); } /** * Destructor **/ NewSimulatorFumi::~NewSimulatorFumi() { m_banks.RemAll(); } /** * Dump the Fumi information * * @param dump Address of the log * **/ void NewSimulatorFumi::Dump( NewSimulatorLog &dump ) const { dump << "Fumi: " << m_fumi_rec.Num << "\n"; dump << "AccessProt: " << m_fumi_rec.AccessProt << "\n"; dump << "Capability: " << m_fumi_rec.Capability << "\n"; dump << "NumBanks: " << m_fumi_rec.NumBanks << "\n"; dump << "Oem: " << m_fumi_rec.Oem << "\n"; dump << "Bank(s) Information: " << "\n"; dump << "-------------------\n"; for (int i= 0; i < m_banks.Num(); i++) { m_banks[i]->Dump( dump ); } } /** * A rdr structure is filled with the data * * This method is called by method NewSimulatorRdr::Populate(). * * @param resource Address of resource structure * @param rdr Address of rdr structure * * @return true **/ bool NewSimulatorFumi::CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ) { if ( NewSimulatorRdr::CreateRdr( resource, rdr ) == false ) return false; // Inventory record memcpy(&rdr.RdrTypeUnion.FumiRec, &m_fumi_rec, sizeof(SaHpiFumiRecT)); return true; } /** * Set fumi record data * * @param fumiRec FumiRecord data * @return true (simple copy) **/ bool NewSimulatorFumi::SetData( SaHpiFumiRecT fumiRec ) { memcpy( &m_fumi_rec, &fumiRec, sizeof( SaHpiFumiRecT )); return true; } /** * Set fumi information data * * @param spec record with specification information * @param impact record with information about affected entities * @param rbDis flag if automatic rollback is disabled or not * @return true **/ bool NewSimulatorFumi::SetInfo( SaHpiFumiSpecInfoT spec, SaHpiFumiServiceImpactDataT impact, SaHpiBoolT rbDis ) { memcpy( &m_spec_info, &spec, sizeof( SaHpiFumiSpecInfoT )); memcpy( &m_impact_data, &impact, sizeof( SaHpiFumiServiceImpactDataT )); m_dis_rb = rbDis; return true; } /** * Add or find a bank by id * * A new NewSimulatorFumiBank is generated inside the function, if the bank doesn't * exist. If a bank with the same id already exists, it is returned. * * @param id bankId of NewSimulatorFumiBank object * @return pointer on a NewSimulatorFumiBank object **/ NewSimulatorFumiBank *NewSimulatorFumi::GetOrAddBank( SaHpiUint8T id ) { NewSimulatorFumiBank *b = NULL; for (int i=0; i < m_banks.Num(); i++) { if ( id == m_banks[i]->Num() ) b = m_banks[i]; } if (b == NULL) { b = new NewSimulatorFumiBank(); b->SetId( id ); m_banks.Add( b ); } return b; } /** * Find a bank by id * * If a bank with the same id already exists, it is returned. * * @param id bankId of NewSimulatorFumiBank object * @return pointer on a NewSimulatorFumiBank object **/ NewSimulatorFumiBank *NewSimulatorFumi::GetBank( SaHpiUint8T id ) { NewSimulatorFumiBank *b = NULL; for (int i=0; i < m_banks.Num(); i++) { if ( id == m_banks[i]->Num() ) b = m_banks[i]; } return b; } /** * Set source information for a FumiBank * * @param bank pointer on a NewSimulatorFumiBank object with the source information * @return true **/ bool NewSimulatorFumi::SetBankSource( NewSimulatorFumiBank *bank ) { NewSimulatorFumiBank *b; b = GetOrAddBank( bank->Num() ); b->SetData( bank->GetSource() ); return true; } /** * Set target information for a FumiBank * * @param bank pointer on a NewSimulatorFumiBank object with the target information * @return true **/ bool NewSimulatorFumi::SetBankTarget( NewSimulatorFumiBank *bank ) { NewSimulatorFumiBank *b; b = GetOrAddBank( bank->Num() ); b->SetData( bank->GetTarget() ); return true; } /** * Set logical target information for a FumiBank * * @param bank pointer on a NewSimulatorFumiBank object with the logical target information * @return true **/ bool NewSimulatorFumi::SetBankLogical( NewSimulatorFumiBank *bank ) { NewSimulatorFumiBank *b; b = GetOrAddBank( bank->Num() ); b->SetData( bank->GetLogical() ); return true; } // Official HPI functions /** * HPI function saHpiFumiSpecInfoGet() * * See also the description of the function inside the specification or header file. * Copying the internal values (if a read is allowed). * * @param spec address of the FumiSpecInfo record to be filled * * @return HPI return code **/ SaErrorT NewSimulatorFumi::GetSpecInfo( SaHpiFumiSpecInfoT &spec ) { SaErrorT rv = SA_OK; if ( &spec == NULL ) return SA_ERR_HPI_INVALID_PARAMS; memcpy( &spec, &m_spec_info, sizeof( SaHpiFumiSpecInfoT )); return rv; } /** * HPI function saHpiFumiServiceImpactGet() * * See also the description of the function inside the specification or header file. * Copying the internal values (if a read is allowed). * * @param impact address of the FumiServiceImpactData record to be filled * * @return HPI return code **/ SaErrorT NewSimulatorFumi::GetImpact( SaHpiFumiServiceImpactDataT &impact ) { SaErrorT rv = SA_OK; if ( &impact == NULL ) return SA_ERR_HPI_INVALID_PARAMS; memcpy( &impact, &m_impact_data, sizeof( SaHpiFumiServiceImpactDataT )); return rv; } /** * HPI function saHpiFumiSourceSet() * * See also the description of the function inside the specification or header file. * Copying the internal values (if a read is allowed). * * @param bank number of bank * @param src text buffer including the source information * * @return HPI return code **/ SaErrorT NewSimulatorFumi::SetSource( SaHpiBankNumT bank, SaHpiTextBufferT &src ) { NewSimulatorFumiBank *b = GetBank(bank); if ( b == NULL ) return SA_ERR_HPI_NOT_PRESENT; b->SetSource( src ); return b->SetSource( src ); } SaErrorT NewSimulatorFumi::ValidateSource( SaHpiBankNumT bank ) { SaErrorT rv = SA_OK; return rv; } /** * HPI function saHpiFumiSourceGet() * * See also the description of the function inside the specification or header file. * Copying the internal values (if a read is allowed). * * @param bank number of bank * @param src address of source info structure to be filled * * @return HPI return code **/ SaErrorT NewSimulatorFumi::GetSource( SaHpiBankNumT bank, SaHpiFumiSourceInfoT &src ) { NewSimulatorFumiBank *b = GetBank(bank); if ( b == NULL ) return SA_ERR_HPI_NOT_PRESENT; return b->GetSource( src ); } SaErrorT NewSimulatorFumi::GetComponentSource( SaHpiBankNumT bank, SaHpiEntryIdT comp, SaHpiEntryIdT &next, SaHpiFumiComponentInfoT &inf ) { SaErrorT rv = SA_ERR_HPI_UNSUPPORTED_API; return rv; } /** * HPI function saHpiFumiTargetInfoGet() * * See also the description of the function inside the specification or header file. * Copying the internal values (if a read is allowed). * Inside the function the bank information is get by a call of * NewSimulatorFumiBank::GetTarget. * * @param bank number of bank * @param trg address of target info structure to be filled * * @return HPI return code **/ SaErrorT NewSimulatorFumi::GetTarget( SaHpiBankNumT bank, SaHpiFumiBankInfoT &trg ) { NewSimulatorFumiBank *b = GetBank(bank); if ( b == NULL ) return SA_ERR_HPI_NOT_PRESENT; return b->GetTarget( trg ); } SaErrorT NewSimulatorFumi::GetComponentTarget( SaHpiBankNumT bank, SaHpiEntryIdT comp, SaHpiEntryIdT &next, SaHpiFumiComponentInfoT &inf ) { SaErrorT rv = SA_ERR_HPI_UNSUPPORTED_API; return rv; } /** * HPI function saHpiFumiLogicalTargetInfoGet() * * See also the description of the function inside the specification or header file. * Copying the internal values (if a read is allowed). * Inside the function the bank information is get by a call of * NewSimulatorFumiBank::GetLogicalTarget. * * @param trg address of logical target info structure to be filled * * @return HPI return code **/ SaErrorT NewSimulatorFumi::GetTargetLogical( SaHpiFumiLogicalBankInfoT &trg ) { NewSimulatorFumiBank *b = GetBank( 0 ); if ( b == NULL ) return SA_ERR_HPI_NOT_PRESENT; return b->GetLogicalTarget( trg ); } SaErrorT NewSimulatorFumi::GetComponentTargetLogical( SaHpiEntryIdT comp, SaHpiEntryIdT &next, SaHpiFumiLogicalComponentInfoT &inf ) { SaErrorT rv = SA_ERR_HPI_UNSUPPORTED_API; return rv; } SaErrorT NewSimulatorFumi::StartBackup() { SaErrorT rv = SA_OK; return rv; } SaErrorT NewSimulatorFumi::SetOrder( SaHpiBankNumT bank, SaHpiUint32T pos ) { SaErrorT rv = SA_OK; return rv; } SaErrorT NewSimulatorFumi::CopyBank( SaHpiBankNumT bank, SaHpiBankNumT dest ) { SaErrorT rv = SA_OK; return rv; } SaErrorT NewSimulatorFumi::Install( SaHpiBankNumT bank ) { SaErrorT rv = SA_OK; return rv; } SaErrorT NewSimulatorFumi::GetStatus( SaHpiBankNumT bank, SaHpiFumiUpgradeStatusT &status ) { SaErrorT rv = SA_OK; return rv; } SaErrorT NewSimulatorFumi::VerifyTarget( SaHpiBankNumT bank ) { SaErrorT rv = SA_OK; return rv; } SaErrorT NewSimulatorFumi::VerifyTargetMain() { SaErrorT rv = SA_OK; return rv; } SaErrorT NewSimulatorFumi::CancelUpgrade( SaHpiBankNumT bank ) { SaErrorT rv = SA_OK; return rv; } SaErrorT NewSimulatorFumi::GetRollbackFlag( SaHpiBoolT &rollb ) { SaErrorT rv = SA_OK; return rv; } SaErrorT NewSimulatorFumi::SetRollbackFlag( SaHpiBoolT rollb ) { SaErrorT rv = SA_OK; return rv; } SaErrorT NewSimulatorFumi::Rollback() { SaErrorT rv = SA_OK; return rv; } SaErrorT NewSimulatorFumi::Activate() { SaErrorT rv = SA_OK; return rv; } SaErrorT NewSimulatorFumi::Activate( SaHpiBoolT log ) { SaErrorT rv = SA_OK; return rv; } SaErrorT NewSimulatorFumi::Cleanup( SaHpiBankNumT bank ) { SaErrorT rv = SA_OK; return rv; } openhpi-3.6.1/plugins/dynamic_simulator/new_sim_sensor.cpp0000644000175100017510000003672612575647274023156 0ustar mohanmohan/** * @file new_sim_sensor.cpp * * The file includes an abstract class for sensor handling:\n * NewSimulatorSensor * * @author Lars Wetzel * @version 0.3 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * The new Simulator plugin is adapted from the ipmidirect plugin. * Thanks to \n * Thomas Kanngieser \n * Pierre Sangouard * */ #include #include #include #include #include #include #include #include #include "new_sim_domain.h" #include "new_sim_sensor.h" #include "new_sim_entity.h" #include "new_sim_utils.h" #include "new_sim_text_buffer.h" /** * Constructor **/ NewSimulatorSensor::NewSimulatorSensor( NewSimulatorResource *res ) : NewSimulatorRdr( res, SAHPI_SENSOR_RDR ), m_enabled( SAHPI_TRUE ), m_events_enabled( SAHPI_TRUE ), m_read_support( SAHPI_TRUE ), m_assert_mask( 0 ), m_deassert_mask( 0 ){ memset( &m_sensor_record, 0, sizeof( SaHpiSensorRecT )); memset( &m_read_data, 0, sizeof( SaHpiSensorReadingT )); memset( &m_event_data, 0, sizeof( SaHpiEventStateT )); } /** * Full qualified constructor to fill an object with the parsed data **/ NewSimulatorSensor::NewSimulatorSensor( NewSimulatorResource *res, SaHpiRdrT rdr, SaHpiSensorReadingT data, SaHpiEventStateT event_state, SaHpiEventStateT event_amask, SaHpiEventStateT event_dmask, SaHpiBoolT enabled, SaHpiBoolT event_enabled) : NewSimulatorRdr( res, SAHPI_SENSOR_RDR, rdr.Entity, rdr.IsFru, rdr.IdString ), m_enabled( enabled ), m_events_enabled( event_enabled ), m_read_support( SAHPI_TRUE ), m_assert_mask( event_amask ), m_deassert_mask( event_dmask ), m_event_data( event_state ) { memcpy(&m_sensor_record, &rdr.RdrTypeUnion.SensorRec, sizeof( SaHpiSensorRecT )); memcpy(&m_read_data, &data, sizeof( SaHpiSensorReadingT )); } /** * Destructor **/ NewSimulatorSensor::~NewSimulatorSensor() { } /** * TBD: Check where and whether it is needed **/ void NewSimulatorSensor::HandleNew( NewSimulatorDomain *domain ) { // m_sensor_type_string = IpmiSensorTypeToString( m_sensor_type ); // m_event_reading_type_string = IpmiEventReadingTypeToString( m_event_reading_type ); } /** * TBD: Check where and whether it is needed * TODO: Change it properly due to new data structure **/ bool NewSimulatorSensor::Cmp( const NewSimulatorSensor &s2 ) const { /** if ( m_entity_path != s2.m_entity_path ) return false; if ( m_sensor_init_scanning != s2.m_sensor_init_scanning ) return false; if ( m_sensor_init_events != s2.m_sensor_init_events ) return false; if ( m_sensor_init_type != s2.m_sensor_init_type ) return false; if ( m_sensor_init_pu_events != s2.m_sensor_init_pu_events ) return false; if ( m_sensor_init_pu_scanning != s2.m_sensor_init_pu_scanning ) return false; if ( m_ignore_if_no_entity != s2.m_ignore_if_no_entity ) return false; if ( m_supports_auto_rearm != s2.m_supports_auto_rearm ) return false; if ( m_event_support != s2.m_event_support ) return false; if ( m_sensor_type != s2.m_sensor_type ) return false; if ( m_event_reading_type != s2.m_event_reading_type ) return false; if ( m_oem != s2.m_oem ) return false; if ( IdString() != s2.IdString() ) return false; **/ return true; } /** * Check if val1 > val2 * * @param val1 SensorReading * @param val2 SensorReading * * @return false also in error case **/ bool NewSimulatorSensor::gt(const SaHpiSensorReadingT &val1, const SaHpiSensorReadingT &val2) { if (val1.Type != val2.Type) { err("Different sensor reading types in comparision."); return false; } switch(val1.Type) { case SAHPI_SENSOR_READING_TYPE_INT64: return (val1.Value.SensorInt64 > val2.Value.SensorInt64) ? true : false; break; case SAHPI_SENSOR_READING_TYPE_UINT64: return (val1.Value.SensorUint64 > val2.Value.SensorUint64) ? true : false; break; case SAHPI_SENSOR_READING_TYPE_FLOAT64: return (val1.Value.SensorFloat64 > val2.Value.SensorFloat64) ? true : false; break; case SAHPI_SENSOR_READING_TYPE_BUFFER: return (memcmp(&val1.Value.SensorBuffer, &val2.Value.SensorBuffer, SAHPI_SENSOR_BUFFER_LENGTH) > 0) ? true : false; default: err("Invalid sensor reading type."); return false; } } /** * Check if val1 == val2 * * @param val1 SensorReading * @param val2 SensorReading * * @return false also in error case **/ bool NewSimulatorSensor::eq(const SaHpiSensorReadingT &val1, const SaHpiSensorReadingT &val2) { if (val1.Type != val2.Type) { err("Different sensor reading types in comparision."); return false; } switch(val1.Type) { case SAHPI_SENSOR_READING_TYPE_INT64: return (val1.Value.SensorInt64 == val2.Value.SensorInt64) ? true : false; break; case SAHPI_SENSOR_READING_TYPE_UINT64: return (val1.Value.SensorUint64 == val2.Value.SensorUint64) ? true : false; break; case SAHPI_SENSOR_READING_TYPE_FLOAT64: return (val1.Value.SensorFloat64 == val2.Value.SensorFloat64) ? true : false; break; case SAHPI_SENSOR_READING_TYPE_BUFFER: return (memcmp(&val1.Value.SensorBuffer, &val2.Value.SensorBuffer, SAHPI_SENSOR_BUFFER_LENGTH) == 0) ? true : false; default: err("Invalid sensor reading type."); return false; } } /** * Check if val1 >= val2 * * @param val1 SensorReading * @param val2 SensorReading * * @return false also in error case **/ bool NewSimulatorSensor::ge(const SaHpiSensorReadingT &val1, const SaHpiSensorReadingT &val2) { if (val1.Type != val2.Type) { err("Different sensor reading types in comparision."); return false; } return ( gt( val1, val2 ) || eq( val1, val2 ) ); } /** * Check if val1 < val2 * * @param val1 SensorReading * @param val2 SensorReading * * @return false also in error case **/ bool NewSimulatorSensor::lt(const SaHpiSensorReadingT &val1, const SaHpiSensorReadingT &val2) { if (val1.Type != val2.Type) { err("Different sensor reading types in comparision."); return false; } return ( ! ge( val1, val2 ) ) ; } /** * Check if val1 <= val2 * * @param val1 SensorReading * @param val2 SensorReading * * @return false also in error case **/ bool NewSimulatorSensor::le(const SaHpiSensorReadingT &val1, const SaHpiSensorReadingT &val2) { if (val1.Type != val2.Type) { err("Different sensor reading types in comparision."); return false; } return ( ! gt( val1, val2 ) ); } /** * Check if val1 < 0 * * @param val1 SensorReading * * @return return false also in error case **/ bool NewSimulatorSensor::ltZero(const SaHpiSensorReadingT &val1) { switch(val1.Type) { case SAHPI_SENSOR_READING_TYPE_INT64: return (val1.Value.SensorInt64 < 0) ? true : false; break; case SAHPI_SENSOR_READING_TYPE_UINT64: return false; break; case SAHPI_SENSOR_READING_TYPE_FLOAT64: return (val1.Value.SensorFloat64 < 0) ? true : false; break; case SAHPI_SENSOR_READING_TYPE_BUFFER: SaHpiUint8T zeroBuffer[SAHPI_SENSOR_BUFFER_LENGTH]; memset(&zeroBuffer, 0, (sizeof(SaHpiUint8T)*SAHPI_SENSOR_BUFFER_LENGTH)); return (memcmp(&val1.Value.SensorBuffer, &zeroBuffer, SAHPI_SENSOR_BUFFER_LENGTH) < 0) ? true : false; break; default: err("Invalid sensor reading type."); return false; } } /** * Dump the sensor information * * @param dump Address of the log * **/ void NewSimulatorSensor::Dump( NewSimulatorLog &dump ) const { char str[256]; IdString().GetAscii( str, 256 ); dump << "Sensor: " << m_sensor_record.Num << " " << str << "\n"; } /** * A rdr structure is filled with the data * * This method is called by method NewSimulatorRdr::Populate(). * * @param resource Address of resource structure * @param rdr Address of rdr structure * * @return true **/ bool NewSimulatorSensor::CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ) { if ( NewSimulatorRdr::CreateRdr( resource, rdr ) == false ) return false; // sensor record memcpy(&rdr.RdrTypeUnion.SensorRec, &m_sensor_record, sizeof(SaHpiSensorRecT)); return true; } /** * HPI function saHpiSensorEnableGet() * * See also the description of the function inside the specification or header file. * Copying the internal reading values (if a read is allowed). * * @param enable address of enable return value * * @return HPI return code **/ SaErrorT NewSimulatorSensor::GetEnable( SaHpiBoolT &enable ) { enable = m_enabled; return SA_OK; } /** * HPI function saHpiSensorEnableSet() * * See also the description of the function inside the specification or header file. * Copying the internal reading values (if a read is allowed). * * @param enable address of enable value to be set internally * * @return HPI return code **/ SaErrorT NewSimulatorSensor::SetEnable( const SaHpiBoolT &enable ) { if (m_enabled == enable) return SA_OK; m_enabled = enable; CreateEnableChangeEvent(); return SA_OK; } /** * HPI function saHpiSensorEventEnableGet() * * See also the description of the function inside the specification or header file. * Copying the internal reading values (if a read is allowed). * * @param enables address of event enable return value * * @return HPI return code **/ SaErrorT NewSimulatorSensor::GetEventEnables( SaHpiBoolT &enables ) { enables = m_events_enabled; return SA_OK; } /** * HPI function saHpiSensorEventEnableSet() * * See also the description of the function inside the specification or header file. * Copying the internal reading values (if a read is allowed). * * @param enables address of event enable value to be set internally * * @return HPI return code **/ SaErrorT NewSimulatorSensor::SetEventEnables( const SaHpiBoolT &enables ) { if ( EventCtrl() == SAHPI_SEC_READ_ONLY ) return SA_ERR_HPI_READ_ONLY; if ( m_events_enabled == enables ) return SA_OK; m_events_enabled = enables; CreateEnableChangeEvent(); return SA_OK; } /** * HPI function saHpiSensorEventMasksGet() * * See also the description of the function inside the specification or header file. * Copying the internal reading values (if a read is allowed). * * @param AssertEventMask address of mask to be filled with assertion mask * @param DeassertEventMask address of mask to be filled with deassertion mask * * @return HPI return code **/ SaErrorT NewSimulatorSensor::GetEventMasks( SaHpiEventStateT &AssertEventMask, SaHpiEventStateT &DeassertEventMask) { if (&AssertEventMask) AssertEventMask = m_assert_mask; if (&DeassertEventMask) DeassertEventMask = m_deassert_mask; return SA_OK; } /** * HPI function saHpiSensorEventMasksSet() * * See also the description of the function inside the specification or header file. * Copying the internal reading values (if a read is allowed). * * @param act address of variable which includes the action to be done * @param AssertEventMask address of variable which include new assertion mask data * @param DeassertEventMask address of variable which include new deassertion mask data * * @return HPI return code **/ SaErrorT NewSimulatorSensor::SetEventMasks( const SaHpiSensorEventMaskActionT &act, SaHpiEventStateT &AssertEventMask, SaHpiEventStateT &DeassertEventMask ) { if ( EventCtrl() != SAHPI_SEC_PER_EVENT ) return SA_ERR_HPI_READ_ONLY; if ( AssertEventMask == SAHPI_ALL_EVENT_STATES ) AssertEventMask = EventStates(); if ( DeassertEventMask == SAHPI_ALL_EVENT_STATES ) DeassertEventMask = EventStates(); if ( act == SAHPI_SENS_ADD_EVENTS_TO_MASKS ) { if ((( AssertEventMask & ~EventStates() ) != 0 ) || (( DeassertEventMask & ~EventStates() ) != 0 )) return SA_ERR_HPI_INVALID_DATA; } SaHpiEventStateT save_assert_mask = m_assert_mask; SaHpiEventStateT save_deassert_mask = m_deassert_mask; if ( act == SAHPI_SENS_ADD_EVENTS_TO_MASKS ) { m_assert_mask |= AssertEventMask; m_deassert_mask |= DeassertEventMask; } else if ( act == SAHPI_SENS_REMOVE_EVENTS_FROM_MASKS ) { m_assert_mask &= (AssertEventMask ^ SAHPI_ALL_EVENT_STATES); m_deassert_mask &= (DeassertEventMask ^ SAHPI_ALL_EVENT_STATES); } else return SA_ERR_HPI_INVALID_PARAMS; stdlog << "SetEventMasks sensor " << m_sensor_record.Num << " assert " << m_assert_mask << " deassert " << m_deassert_mask << "\n"; if (( save_assert_mask == m_assert_mask ) && ( save_deassert_mask == m_deassert_mask )) return SA_OK; CreateEnableChangeEvent(); return SA_OK; } /** * Generate an event if the enabling / mask of the sensor was changed **/ void NewSimulatorSensor::CreateEnableChangeEvent() { NewSimulatorResource *res = Resource(); if( !res ) { stdlog << "CreateEnableChangeEvent: No resource !\n"; return; } oh_event *e = (oh_event *)g_malloc0( sizeof( struct oh_event ) ); e->event.EventType = SAHPI_ET_SENSOR_ENABLE_CHANGE; SaHpiRptEntryT *rptentry = oh_get_resource_by_id( res->Domain()->GetHandler()->rptcache, res->ResourceId() ); SaHpiRdrT *rdrentry = oh_get_rdr_by_id( res->Domain()->GetHandler()->rptcache, res->ResourceId(), m_record_id ); if ( rptentry ) e->resource = *rptentry; else e->resource.ResourceCapabilities = 0; if ( rdrentry ) e->rdrs = g_slist_append(e->rdrs, g_memdup(rdrentry, sizeof(SaHpiRdrT))); else e->rdrs = NULL; // hpi events e->event.Source = res->ResourceId(); e->event.EventType = SAHPI_ET_SENSOR_ENABLE_CHANGE; e->event.Severity = SAHPI_INFORMATIONAL; oh_gettimeofday(&e->event.Timestamp); // sensor enable event SaHpiSensorEnableChangeEventT *se = &e->event.EventDataUnion.SensorEnableChangeEvent; se->SensorNum = m_sensor_record.Num; se->SensorType = Type(); se->EventCategory = EventCategory(); se->SensorEnable = m_enabled; se->SensorEventEnable = m_events_enabled; se->AssertEventMask = m_assert_mask; se->DeassertEventMask = m_deassert_mask; stdlog << "NewSimulatorSensor::CreateEnableChangeEvent OH_ET_HPI Event enable change resource " << res-> ResourceId() << "\n"; res->Domain()->AddHpiEvent( e ); return; } openhpi-3.6.1/plugins/dynamic_simulator/new_sim_dimi_data.cpp0000644000175100017510000001406212575647274023545 0ustar mohanmohan/** * @file new_sim_dimi_data.cpp * * The file includes a class for dimi data handling:\n * NewSimulatorDimiTest * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * */ #include #include #include #include #include #include "new_sim_domain.h" #include "new_sim_dimi.h" #include "new_sim_dimi_data.h" #include "new_sim_entity.h" /** * Constructor **/ NewSimulatorDimiTest::NewSimulatorDimiTest( SaHpiDimiTestNumT id ) : m_test_id( id ), m_status ( SAHPI_DIMITEST_STATUS_NOT_RUN ), m_ready( SAHPI_DIMI_READY ) { } /** * Destructor **/ NewSimulatorDimiTest::~NewSimulatorDimiTest() { } /** * Dump Dimi Test information * * @param dump Address of the log * **/ void NewSimulatorDimiTest::Dump( NewSimulatorLog &dump ) const { dump << "Test information\n"; dump << "----------------\n"; dump << "TestName: " << m_info.TestName << "\n"; dump << "ServiceImpact: " << (int) m_info.ServiceImpact << "\n"; dump << "EntitiesImpacted:\n"; for (int i = 0; i < SAHPI_DIMITEST_MAX_ENTITIESIMPACTED; i++) dump << " " << m_info.EntitiesImpacted[i].EntityImpacted << "\n"; dump << "NeedServiceOS: " << m_info.NeedServiceOS << "\n"; dump << "ServiceOS: " << m_info.ServiceOS << "\n"; dump << "ExpectedRunDuration: " << (long int) m_info.ExpectedRunDuration << "\n"; dump << "TestCapabilities: " << m_info.TestCapabilities << "\n"; } /** * Set testcase data - info * * @param tinfo test information * * @return true **/ bool NewSimulatorDimiTest::SetData( SaHpiDimiTestT tinfo ) { memcpy( &m_info, &tinfo, sizeof( SaHpiDimiTestT )); return true; } /** * Set testcase data - readiness * * @param ready readiness value * * @return true **/ bool NewSimulatorDimiTest::SetReadiness( SaHpiDimiReadyT ready ) { m_ready = ready; return true; } /** * Set testcase data - results * * The status is set on \c SAHPI_DIMITEST_STATUS_FINISHED_NO_ERRORS * * @param results information about results * * @return true **/ bool NewSimulatorDimiTest::SetResults( SaHpiDimiTestResultsT results ) { memcpy( &m_results, &results, sizeof( SaHpiDimiTestResultsT )); m_status = SAHPI_DIMITEST_STATUS_FINISHED_NO_ERRORS; return true; } /** * Test if a test case is running * * @return true if the test case is marked as running **/ bool NewSimulatorDimiTest::IsRunning() { if ( m_status == SAHPI_DIMITEST_STATUS_RUNNING ) return true; return false; } // HPI functions /** * HPI function saHpiDimiTestInfoGet() * * See also the description of the function inside the specification or header file. * * @param tinfo address of the Dimi test record to be filled * * @return HPI return code **/ SaErrorT NewSimulatorDimiTest::GetInfo( SaHpiDimiTestT &tinfo ) { memcpy( &tinfo, &m_info, sizeof( SaHpiDimiTestT )); return SA_OK; } /** * HPI function saHpiDimiTestReadinessGet() * * See also the description of the function inside the specification or header file. * * @param ready address to store the Ready information * * @return HPI return code **/ SaErrorT NewSimulatorDimiTest::GetReady( SaHpiDimiReadyT &ready ) { ready = m_ready; return SA_OK; } /** * HPI function saHpiDimiTestStart() * * See also the description of the function inside the specification or header file. * @todo: add some functionality * * @param number number of parameters * @param param pointer on array including the parameters * * @return HPI return code **/ SaErrorT NewSimulatorDimiTest::StartTest( SaHpiUint8T number, SaHpiDimiTestVariableParamsT *param ) { SaErrorT rv = SA_OK; if ( m_ready != SAHPI_DIMI_READY ) return SA_ERR_HPI_INVALID_STATE; if ( number != 0 && param == NULL) return SA_ERR_HPI_INVALID_PARAMS; /// @todo some functionality behind start dimi test return rv; } /** * HPI function saHpiDimiTestCancel() * * See also the description of the function inside the specification or header file. * * @return HPI return code **/ SaErrorT NewSimulatorDimiTest::Cancel() { if ( m_status != SAHPI_DIMITEST_STATUS_RUNNING ) return SA_ERR_HPI_INVALID_STATE; return SA_OK; } /** * HPI function saHpiDimiTestStatusGet() * * See also the description of the function inside the specification or header file. * * @param perc address to store percentage of test completed * @param status address to store the status of the last run * * @return HPI return code **/ SaErrorT NewSimulatorDimiTest::GetStatus( SaHpiDimiTestPercentCompletedT &perc, SaHpiDimiTestRunStatusT &status) { if ( &perc != NULL ) { switch ( m_status ) { case SAHPI_DIMITEST_STATUS_NOT_RUN: case SAHPI_DIMITEST_STATUS_CANCELED: perc = 0; break; case SAHPI_DIMITEST_STATUS_FINISHED_NO_ERRORS: case SAHPI_DIMITEST_STATUS_FINISHED_ERRORS: perc = 100; break; case SAHPI_DIMITEST_STATUS_RUNNING: perc = 50; break; default: perc = 0; } } status = m_status; return SA_OK; } /** * HPI function saHpiDimiTestResultsGet() * * See also the description of the function inside the specification or header file. * * @param results address to store test results * * @return HPI return code **/ SaErrorT NewSimulatorDimiTest::GetResults(SaHpiDimiTestResultsT &results) { memcpy( &results, &m_results, sizeof( SaHpiDimiTestResultsT )); return SA_OK; } openhpi-3.6.1/plugins/dynamic_simulator/new_sim_file_annunciator.h0000644000175100017510000000341112575647274024613 0ustar mohanmohan/** * @file new_sim_file_annunciator.h * * The file includes helper classes for parsing control data from the simulation file:\n * NewSimulatorFileAnnunciator * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * */ #ifndef __NEW_SIM_FILE_ANNUNCIATOR_H__ #define __NEW_SIM_FILE_ANNUNCIATOR_H__ #include extern "C" { #include "SaHpi.h" } #ifndef __NEW_SIM_FILE_RDR_H__ #include "new_sim_file_rdr.h" #endif #ifndef __NEW_SIM_RDR_H__ #include "new_sim_rdr.h" #endif #ifndef __NEW_SIM_RESOURCE_H__ #include "new_sim_resource.h" #endif #ifndef __NEW_SIM_ANNUNCIATOR_H__ #include "new_sim_annunciator.h" #endif /** * @class NewSimulatorFileAnnunciator * * Provides some functions for parsing the annunciator and announcement sections of the simulation file. **/ class NewSimulatorFileAnnunciator : public NewSimulatorFileRdr { private: /// static annunciator rdr information SaHpiAnnunciatorRecT *m_ann_rec; bool process_annunciator_data( NewSimulatorAnnunciator *ann ); bool process_announcement(SaHpiAnnouncementT *announce); bool process_announce_condition(SaHpiConditionT *cond); bool process_name( SaHpiNameT &name ); public: NewSimulatorFileAnnunciator(GScanner *scanner); virtual ~NewSimulatorFileAnnunciator(); virtual NewSimulatorRdr * process_token(NewSimulatorResource *res); }; #endif /*__NEW_SIM_FILE_ANNUNCIATOR_H_*/ openhpi-3.6.1/plugins/dynamic_simulator/new_sim_control.h0000644000175100017510000000461112575647274022756 0ustar mohanmohan/** * @file new_sim_control.h * * The file includes an abstract class for control handling:\n * NewSimulatorControl * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * The new Simulator plugin is adapted from the ipmidirect plugin. * Thanks to * Thomas Kanngieser * Pierre Sangouard * */ #ifndef __NEW_SIM_CONTROL_H__ #define __NEW_SIM_CONTROL_H__ #ifndef __NEW_SIM_RDR_H__ #include "new_sim_rdr.h" #endif extern "C" { #include "SaHpi.h" } /** * @class NewSimulatorControl * * Abstract class for simulating controls * **/ class NewSimulatorControl : public NewSimulatorRdr { protected: /// rdr information - Num SaHpiCtrlNumT m_num; /// rdr information - Output Type SaHpiCtrlOutputTypeT m_output_type; /// rdr information - Type SaHpiCtrlTypeT m_type; /// rdr information - Default Mode SaHpiCtrlDefaultModeT m_def_mode; /// rdr information - WriteOnly SaHpiBoolT m_write_only; /// rdr information - Oem SaHpiUint32T m_oem; /// mode of the control SaHpiCtrlModeT m_ctrl_mode; public: NewSimulatorControl( NewSimulatorResource *res, SaHpiRdrT rdr, SaHpiCtrlModeT ctrl_mode); virtual ~NewSimulatorControl(); virtual unsigned int Num() const { return (unsigned int) m_num; } // create an RDR sensor record virtual bool CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ); /// abstract method for hpi function saHpiControlStateSet virtual SaErrorT SetState( const SaHpiCtrlModeT &mode, const SaHpiCtrlStateT &state ) = 0; /// abstract method for hpi function saHpiControlStateGet virtual SaErrorT GetState( SaHpiCtrlModeT &mode, SaHpiCtrlStateT &state ) = 0; /// method for hpi function saHpiControlTypeGet virtual SaErrorT GetType( SaHpiCtrlTypeT &type ); /// abstract method to dump control information virtual void Dump( NewSimulatorLog &dump ) const = 0; }; #endif openhpi-3.6.1/plugins/dynamic_simulator/new_sim_dimi_data.h0000644000175100017510000000402712575647274023212 0ustar mohanmohan/** * @file new_sim_dimi_data.h * * The file includes the class for dimi test handling:\n * NewSimulatorDimiTest * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * */ #ifndef __NEW_SIM_DIMI_DATA_H__ #define __NEW_SIM_DIMI_DATA_H__ extern "C" { #include "SaHpi.h" } #ifndef __NEW_SIM_RDR_H__ #include "new_sim_rdr.h" #endif class NewSimulatorDomain; /** * @class NewSimulatorDimiTest * * Class for simulating dimi Test * **/ class NewSimulatorDimiTest { private: /// Number of test case SaHpiDimiTestNumT m_test_id; /// Record with test information SaHpiDimiTestT m_info; /// Record with test results SaHpiDimiTestResultsT m_results; /// State of test case SaHpiDimiTestRunStatusT m_status; /// Readiness of test case SaHpiDimiReadyT m_ready; public: NewSimulatorDimiTest( SaHpiDimiTestNumT id ); virtual ~NewSimulatorDimiTest(); /// Return test case id virtual SaHpiDimiTestNumT Num() const { return m_test_id; } bool SetData( SaHpiDimiTestT info ); bool SetReadiness( SaHpiDimiReadyT ready ); bool SetResults( SaHpiDimiTestResultsT results ); bool IsRunning(); // HPI functions SaErrorT GetInfo( SaHpiDimiTestT &tinfo ); SaErrorT GetReady( SaHpiDimiReadyT &ready ); SaErrorT StartTest( SaHpiUint8T number, SaHpiDimiTestVariableParamsT *param ); SaErrorT Cancel(); SaErrorT GetStatus( SaHpiDimiTestPercentCompletedT &perc, SaHpiDimiTestRunStatusT &status); SaErrorT GetResults(SaHpiDimiTestResultsT &results); virtual void Dump( NewSimulatorLog &dump ) const; }; #endif openhpi-3.6.1/plugins/dynamic_simulator/new_sim_inventory_data.h0000644000175100017510000000666112575647274024333 0ustar mohanmohan/** * @file new_sim_inventory_data.h * * The file includes the classes for inventory area and field handling:\n * NewSimulatorInventoryArea * NewSimulatorInventoryField * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * */ #ifndef __NEW_SIM_INVENTORY_DATA_H__ #define __NEW_SIM_INVENTORY_DATA_H__ extern "C" { #include "SaHpi.h" } #ifndef __NEW_SIM_RDR_H__ #include "new_sim_rdr.h" #endif class NewSimulatorDomain; /** * @class NewSimulatorInventoryField * * Class for simulating Inventory fields * **/ class NewSimulatorInventoryField { private: /// Record with the Inventory Field Information SaHpiIdrFieldT m_field; public: NewSimulatorInventoryField(); NewSimulatorInventoryField( SaHpiIdrFieldT field ); virtual ~NewSimulatorInventoryField(); /// Return Inventory Area Number virtual SaHpiEntryIdT Num() const { return m_field.FieldId; } /// Return Field Type virtual SaHpiIdrFieldTypeT Type() const { return m_field.Type; } /// Return ReadOnly Flag bool IsReadOnly() const { return (bool) m_field.ReadOnly; } /// Return address of field data SaHpiIdrFieldT &FieldData() { return m_field; } virtual bool SetData( SaHpiIdrFieldT field ); virtual void Dump( NewSimulatorLog &dump ) const; }; /** * @class NewSimulatorInventoryArea * * Class for simulating InventoryArea * **/ class NewSimulatorInventoryArea { private: /// Record with the AreaHeader information SaHpiIdrAreaHeaderT m_area_header; /// Array including the areas cArray m_fields; /// Valid fieldId SaHpiEntryIdT m_field_id; public: NewSimulatorInventoryArea( ); NewSimulatorInventoryArea( SaHpiIdrAreaHeaderT area ); virtual ~NewSimulatorInventoryArea(); /// Return Inventory AreaId virtual SaHpiEntryIdT Num() const { return m_area_header.AreaId; } /// Return Area Type virtual SaHpiIdrAreaTypeT Type() const { return m_area_header.Type; } /// Return a new entryId SaHpiEntryIdT ValidFieldId() { return ++m_field_id; } /// Return the ReadOnly flag bool IsReadOnly() { return (bool) m_area_header.ReadOnly; } /// Return the complete header information SaHpiIdrAreaHeaderT &AreaHeader() { m_area_header.NumFields = m_fields.Num(); return m_area_header; } // Find and add inventory field NewSimulatorInventoryField *FindInventoryField( NewSimulatorInventoryField *field ); bool AddInventoryField( NewSimulatorInventoryField *field ); bool IncludesReadOnlyField(); void DeleteFields(); bool SetData( SaHpiIdrAreaHeaderT aheader ); // methods for HPI functions SaErrorT GetField( SaHpiIdrFieldTypeT fieldType, SaHpiEntryIdT fieldId, SaHpiEntryIdT &nextId, SaHpiIdrFieldT &field ); SaErrorT AddField( SaHpiIdrFieldT &field ); SaErrorT AddFieldById( SaHpiIdrFieldT &field ); SaErrorT SetField( SaHpiIdrFieldT field ); SaErrorT DeleteField( SaHpiEntryIdT fieldId ); virtual void Dump( NewSimulatorLog &dump ) const; }; #endif openhpi-3.6.1/plugins/dynamic_simulator/new_sim_file_dimi.cpp0000644000175100017510000005172312575647274023560 0ustar mohanmohan/** * @file new_sim_file_dimi.cpp * * The file includes the class for parsing dimi data:\n * NewSimulatorFileDimi * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * */ #include #include #include #include #include #include "new_sim_file_rdr.h" #include "new_sim_file_dimi.h" #include "new_sim_dimi.h" #include "new_sim_dimi_data.h" #include "new_sim_file_util.h" #include "new_sim_resource.h" #include "new_sim_rdr.h" #include /** * Constructor **/ NewSimulatorFileDimi::NewSimulatorFileDimi( GScanner *scanner ) : NewSimulatorFileRdr ( scanner ) { m_dimi_rec = &m_rdr.RdrTypeUnion.DimiRec; } /** * Destructor **/ NewSimulatorFileDimi::~NewSimulatorFileDimi() { } /** * Parse inside the \c DIMI_TOKEN_HANDLER the \c RDR_DETAIL_TOKEN_HANDLER * * Startpoint is the \c RDR_DETAIL_TOKEN_HANDLER. Endpoint is the last * \c G_TOKEN_RIGHT_CURLY of the \c DIMI_TOKEN_HANDLER. For * \c DIMI_DATA_TOKEN_HANDLER the method * NewSimulatorFileInventory::process_dimi_data is called. * * @param res Pointer on the resource which includes the dimi data * * @return Pointer on a new Rdr entry **/ NewSimulatorRdr * NewSimulatorFileDimi::process_token( NewSimulatorResource *res) { bool success = true; char *field; NewSimulatorDimi *dimi = NULL; guint cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_LEFT_CURLY) { err("Processing parse configuration: Expected left curly token."); return NULL; } m_depth++; while ( (m_depth > 0) && success ) { cur_token = g_scanner_get_next_token(m_scanner); switch (cur_token) { case G_TOKEN_EOF: err("Processing parse rpt entry: File ends too early"); success = false; break; case G_TOKEN_RIGHT_CURLY: m_depth--; break; case G_TOKEN_LEFT_CURLY: m_depth++; break; case G_TOKEN_STRING: field = g_strdup(m_scanner->value.v_string); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (!strcmp(field, "DimiNum")) { if (cur_token == G_TOKEN_INT) m_dimi_rec->DimiNum = m_scanner->value.v_int; } else if (!strcmp(field, "Oem")) { if (cur_token == G_TOKEN_INT) m_dimi_rec->Oem = m_scanner->value.v_int; } else { // Unknown Token err("Processing parse rdr entry: Unknown Rdr field %s", field); success = false; } break; case DIMI_DATA_TOKEN_HANDLER: dimi = new NewSimulatorDimi( res, m_rdr ); success = process_dimi_data( dimi ); break; default: err("Processing parse rdr entry: Unknown token"); success = false; break; } } if ( success ) { stdlog << "DBG: Parse Dimi successfully\n"; // necessary if some inventory_rec data was read after the DATA section if ( dimi != NULL ) dimi->SetData( *m_dimi_rec ); return dimi; } if (dimi != NULL) delete dimi; return NULL; } /** * Parse the Dimi Data section * * Startpoint is the \c DIMI_DATA_TOKEN_HANDLER. Endpoint is the last * \c G_TOKEN_RIGHT_CURLY. * * @return bool value success * **/ bool NewSimulatorFileDimi::process_dimi_data( NewSimulatorDimi *dimi ) { bool success = true; int start = m_depth; char *field; guint cur_token; SaHpiDimiInfoT dimiInfo; NewSimulatorDimiTest *dt; memset( &dimiInfo, 0, sizeof( SaHpiDimiInfoT )); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_LEFT_CURLY) { err("Processing parse control rdr entry - Missing left curly in DimiData section"); success = false; } m_depth++; if (!success) return success; while ( (m_depth > start) && success ) { cur_token = g_scanner_get_next_token(m_scanner); switch (cur_token) { case G_TOKEN_EOF: err("Processing parse rdr entry: File ends too early"); success = false; break; case G_TOKEN_RIGHT_CURLY: m_depth--; break; case G_TOKEN_LEFT_CURLY: m_depth++; break; case G_TOKEN_STRING: field = g_strdup(m_scanner->value.v_string); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (!strcmp(field, "NumberOfTests")) { if (cur_token == G_TOKEN_INT) dimiInfo.NumberOfTests = m_scanner->value.v_int; } else if (!strcmp(field, "TestNumUpdateCounter")) { if (cur_token == G_TOKEN_INT) dimiInfo.TestNumUpdateCounter = m_scanner->value.v_int; } else { // Unknown Token err("Processing parse rdr entry: Unknown type field %s", field); success = false; } break; case DIMI_TESTCASE_TOKEN_HANDLER: dt = new NewSimulatorDimiTest( dimi->GetTestId() ); success = process_dimi_test( dt ); dimi->AddTest( dt ); break; default: err("Processing Dimi data: Unknown token"); success = false; break; } } dimi->SetInfo( dimiInfo ); return success; } /** * Parse a test case * * Startpoint is the \c DIMI_TESTCASE_TOKEN_HANDLER. * Endpoint is the last \c G_TOKEN_RIGHT_CURLY. * * @param dt pointer on a NewSimulatorDimiTest to be filled * * @return bool value success * **/ bool NewSimulatorFileDimi::process_dimi_test( NewSimulatorDimiTest *dt ) { bool success = true; int start = m_depth; char *field; guint cur_token; int entcnt = 0, tpcnt = 0; SaHpiDimiTestT tinfo; memset( &tinfo, 0, sizeof( SaHpiDimiTestT )); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_LEFT_CURLY) { err("Processing parse dimi test case entry - Missing left curly"); success = false; } m_depth++; if (!success) return success; while ( (m_depth > start) && success ) { cur_token = g_scanner_get_next_token(m_scanner); switch (cur_token) { case G_TOKEN_EOF: err("Processing parse rdr entry: File ends too early"); success = false; break; case G_TOKEN_RIGHT_CURLY: m_depth--; break; case G_TOKEN_LEFT_CURLY: m_depth++; break; case G_TOKEN_STRING: field = g_strdup(m_scanner->value.v_string); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (!strcmp(field, "TestName")) { if (cur_token == G_TOKEN_LEFT_CURLY) success = process_textbuffer( tinfo.TestName ); } else if (!strcmp(field, "ServiceImpact")) { if (cur_token == G_TOKEN_INT) tinfo.ServiceImpact = ( SaHpiDimiTestServiceImpactT ) m_scanner->value.v_int; } else if (!strcmp(field, "EntitiesImpacted")) { if (cur_token == G_TOKEN_LEFT_CURLY) { if ( entcnt == SAHPI_DIMITEST_MAX_ENTITIESIMPACTED ) { err("Processing dimi test: Too many impacted entities are in the file"); } else { success = process_dimi_entities( tinfo.EntitiesImpacted[entcnt] ); entcnt++; } } } else if (!strcmp(field, "NeedServiceOS")) { if (cur_token == G_TOKEN_INT) tinfo.NeedServiceOS = ( SaHpiBoolT ) m_scanner->value.v_int; } else if (!strcmp(field, "ServiceOS")) { if (cur_token == G_TOKEN_LEFT_CURLY) success = process_textbuffer( tinfo.ServiceOS ); } else if (!strcmp(field, "ExpectedRunDuration")) { if (cur_token == G_TOKEN_INT) tinfo.ExpectedRunDuration = ( SaHpiTimeT ) m_scanner->value.v_int; } else if (!strcmp(field, "TestCapabilities")) { if (cur_token == G_TOKEN_INT) tinfo.TestCapabilities = ( SaHpiDimiTestCapabilityT ) m_scanner->value.v_int; } else if (!strcmp(field, "TestParameters")) { if (cur_token == G_TOKEN_LEFT_CURLY) { if ( tpcnt == SAHPI_DIMITEST_MAX_PARAMETERS ) { err("Processing dimi test: Too many test parameters are in the file"); } else { success = process_dimi_testparameters( tinfo.TestParameters[tpcnt] ); tpcnt++; } } } else if (!strcmp(field, "TestReadiness")) { if (cur_token == G_TOKEN_INT) { dt->SetReadiness( (SaHpiDimiReadyT) m_scanner->value.v_int ); } } else { // Unknown Token err("Processing parse dimi test entry: Unknown type field %s!", field); success = false; } break; case DIMI_TEST_DATA_TOKEN_HANDLER: success = process_dimi_testdata( dt ); break; default: err("Processing data format: Unknown token"); success = false; break; } } dt->SetData( tinfo ); return success; } /** * Parse test case data * * Startpoint is the \c DIMI_TEST_DATA_TOKEN_HANDLER. * Endpoint is the last \c G_TOKEN_RIGHT_CURLY. * * @param dt pointer on a NewSimulatorDimiTest object to be filled with * test results * * @return bool value success * **/ bool NewSimulatorFileDimi::process_dimi_testdata( NewSimulatorDimiTest *dt ) { bool success = true; int start = m_depth; char *field; guint cur_token; SaHpiDimiTestResultsT tresults; memset( &tresults, 0, sizeof( SaHpiDimiTestResultsT )); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_LEFT_CURLY) { err("Processing parse dimi test data entry - Missing left curly"); success = false; } m_depth++; if (!success) return success; while ( (m_depth > start) && success ) { cur_token = g_scanner_get_next_token(m_scanner); switch (cur_token) { case G_TOKEN_EOF: err("Processing parse rdr entry: File ends too early"); success = false; break; case G_TOKEN_RIGHT_CURLY: m_depth--; break; case G_TOKEN_LEFT_CURLY: m_depth++; break; case G_TOKEN_STRING: field = g_strdup(m_scanner->value.v_string); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (!strcmp(field, "ResultTimeStamp")) { if (cur_token == G_TOKEN_INT) tresults.ResultTimeStamp = ( SaHpiTimeT ) m_scanner->value.v_int; } else if (!strcmp(field, "RunDuration")) { if (cur_token == G_TOKEN_INT) tresults.RunDuration = ( SaHpiTimeoutT ) m_scanner->value.v_int; } else if (!strcmp(field, "LastRunStatus")) { if (cur_token == G_TOKEN_INT) tresults.LastRunStatus = ( SaHpiDimiTestRunStatusT ) m_scanner->value.v_int; } else if (!strcmp(field, "TestErrorCode")) { if (cur_token == G_TOKEN_INT) tresults.TestErrorCode = ( SaHpiDimiTestErrCodeT ) m_scanner->value.v_int; } else if (!strcmp(field, "TestResultString")) { if (cur_token == G_TOKEN_LEFT_CURLY) success = process_textbuffer( tresults.TestResultString ); } else if (!strcmp(field, "TestResultStringIsURI")) { if (cur_token == G_TOKEN_INT) tresults.TestResultStringIsURI = ( SaHpiBoolT ) m_scanner->value.v_int; } else { // Unknown Token err("Processing parse dimi test results: Unknown type field %s", field); success = false; } break; default: err("Processing data format: Unknown token"); success = false; break; } } dt->SetResults( tresults ); return success; } /** * Parse a test afffected entity structure * * Startpoint is the \c G_TOKEN_LEFT_CURLY. * Endpoint is the last \c G_TOKEN_RIGHT_CURLY. * * @param tae address of structure SaHpiDimiTestAffectedEntityT * * @return bool value success * **/ bool NewSimulatorFileDimi::process_dimi_entities( SaHpiDimiTestAffectedEntityT &tae ) { bool success = true; char *field = NULL; guint cur_token = g_scanner_get_next_token(m_scanner); if (cur_token == G_TOKEN_STRING) { field = g_strdup(m_scanner->value.v_string); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing dimi entities: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); } else if (cur_token == G_TOKEN_RIGHT_CURLY) { err("Processing dimi entities: Empty entities field"); success = false; } else { err("Processing dimi entitier: Unknown token"); success = false; } while ((cur_token != G_TOKEN_RIGHT_CURLY) && success) { if (!strcmp( "EntityImpacted", field )) { if (cur_token == G_TOKEN_LEFT_CURLY) success = process_entity( tae.EntityImpacted ); if ( !success ) err("Processing entity in dimi entities returns false"); } else if (!strcmp( "ServiceImpact", field )) { if (cur_token == G_TOKEN_INT) tae.ServiceImpact = ( SaHpiDimiTestServiceImpactT ) m_scanner->value.v_int; } else { err("Processing dimi entities: unknown field %s", field); } // Take the next token cur_token = g_scanner_get_next_token(m_scanner); if (cur_token == G_TOKEN_STRING) { field = g_strdup(m_scanner->value.v_string); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing dimi entities: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); } } return success; } /** * Parse a test parameters definition * * Startpoint is the \c G_TOKEN_LEFT_CURLY. * Endpoint is the last \c G_TOKEN_RIGHT_CURLY. * * @param tp address of structure SaHpiDimiTestParamsDefinitionT * * @return bool value success * **/ bool NewSimulatorFileDimi::process_dimi_testparameters( SaHpiDimiTestParamsDefinitionT &tp ) { bool success = true; char *datafield = NULL; int dlen; char *field = NULL; guint cur_token = g_scanner_get_next_token(m_scanner); if (cur_token == G_TOKEN_STRING) { field = g_strdup(m_scanner->value.v_string); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing dimi entities: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); } else if (cur_token == G_TOKEN_RIGHT_CURLY) { err("Processing dimi entities: Empty entities field"); success = false; } else { err("Processing dimi entitier: Unknown token"); success = false; } while ((cur_token != G_TOKEN_RIGHT_CURLY) && success) { if (!strcmp( "ParamName", field )) { if (cur_token == G_TOKEN_STRING) { datafield = g_strdup(m_scanner->value.v_string); dlen = strlen( datafield ); for (int i=0; (ivalue.v_int; } else if (!strcmp( "MinValue", field )) { if (cur_token == G_TOKEN_INT) { tp.MinValue.IntValue = m_scanner->value.v_int; } else if ( cur_token == G_TOKEN_FLOAT ) { tp.MinValue.FloatValue = m_scanner->value.v_float; } else { err("Unknown datatype for test parameter"); } } else if (!strcmp( "MaxValue", field )) { if (cur_token == G_TOKEN_INT) { tp.MaxValue.IntValue = m_scanner->value.v_int; } else if ( cur_token == G_TOKEN_FLOAT ) { tp.MaxValue.FloatValue = m_scanner->value.v_float; } else { err("Unknown datatype for test parameter"); } } else if (!strcmp( "DefaultParam", field )) { if (cur_token == G_TOKEN_INT) { if ( tp.ParamType == SAHPI_DIMITEST_PARAM_TYPE_BOOLEAN) { tp.DefaultParam.parambool = ( SaHpiBoolT ) m_scanner->value.v_int; } else { tp.DefaultParam.paramint = m_scanner->value.v_int; } } else if ( cur_token == G_TOKEN_FLOAT ) { tp.DefaultParam.paramfloat = m_scanner->value.v_float; } else if ( cur_token == G_TOKEN_LEFT_CURLY) { success = process_textbuffer( tp.DefaultParam.paramtext ); } else { err("Unknown datatype for test parameter"); } } else { err("Processing dimi testparametes: unknown field %s", field); } // Take the next token cur_token = g_scanner_get_next_token(m_scanner); if (cur_token == G_TOKEN_STRING) { field = g_strdup(m_scanner->value.v_string); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing dimi testparameters: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); } } return success; } openhpi-3.6.1/plugins/dynamic_simulator/new_sim_announcement.cpp0000644000175100017510000000261712575647274024327 0ustar mohanmohan/** * @file new_sim_announcement.cpp * * The file includes a class for holding announcement information:\n * NewSimulatorAnnouncement * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * */ #include "new_sim_announcement.h" #include "new_sim_domain.h" /** * Constructor **/ NewSimulatorAnnouncement::NewSimulatorAnnouncement( SaHpiAnnouncementT &ann ) { memcpy(&m_announcement, &ann, sizeof( SaHpiAnnouncementT )); } /** * Destructor **/ NewSimulatorAnnouncement::~NewSimulatorAnnouncement() {} /** * Dump the control information * * @param dump Address of the log * **/ void NewSimulatorAnnouncement::Dump( NewSimulatorLog &dump ) const { dump << "---------------\n"; dump << "Announcement Id " << m_announcement.EntryId << "\n"; dump << "Announcement Name " << m_announcement.StatusCond.Name.Value << "\n"; dump << "Acknowledge = " << m_announcement.Acknowledged; dump << " AddedByUser = " << m_announcement.AddedByUser << "\n"; } openhpi-3.6.1/plugins/dynamic_simulator/new_sim_file_dimi.h0000644000175100017510000000347112575647274023222 0ustar mohanmohan/** * @file new_sim_file_dimi.h * * The file includes helper class for parsing dimi data from the simulation file:\n * NewSimulatorFileDimi * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * */ #ifndef __NEW_SIM_FILE_DIMI_H__ #define __NEW_SIM_FILE_DIMI_H__ #include extern "C" { #include "SaHpi.h" } #ifndef __NEW_SIM_FILE_RDR_H__ #include "new_sim_file_rdr.h" #endif #ifndef __NEW_SIM_RDR_H__ #include "new_sim_rdr.h" #endif #ifndef __NEW_SIM_RESOURCE_H__ #include "new_sim_resource.h" #endif #ifndef __NEW_SIM_DIMI_H__ #include "new_sim_dimi.h" #endif #ifndef __NEW_SIM_DIMI_DATA_H__ #include "new_sim_dimi_data.h" #endif /** * @class NewSimulatorFileDimi * * Provides some functions for parsing the dimi section of * the simulation file. **/ class NewSimulatorFileDimi : public NewSimulatorFileRdr { private: /// static control rdr information SaHpiDimiRecT *m_dimi_rec; bool process_dimi_data( NewSimulatorDimi *dimi ); public: NewSimulatorFileDimi(GScanner *scanner); virtual ~NewSimulatorFileDimi(); virtual NewSimulatorRdr * process_token(NewSimulatorResource *res); bool process_dimi_test( NewSimulatorDimiTest *dt ); bool process_dimi_testdata( NewSimulatorDimiTest *dt ); bool process_dimi_entities( SaHpiDimiTestAffectedEntityT &tae ); bool process_dimi_testparameters( SaHpiDimiTestParamsDefinitionT &tp ); }; #endif /*__NEW_SIM_FILE_DIMI_H_*/ openhpi-3.6.1/plugins/dynamic_simulator/new_sim_fumi.h0000644000175100017510000000732412575647274022242 0ustar mohanmohan/** * @file new_sim_fumi.h * * The file includes a class for fumi handling:\n * NewSimulatorFumi * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * */ #ifndef __NEW_SIM_FUMI_H__ #define __NEW_SIM_FUMI_H__ extern "C" { #include "SaHpi.h" } #ifndef __NEW_SIM_RDR_H__ #include "new_sim_rdr.h" #endif #ifndef __NEW_SIM_FUMI_DATA_H__ #include "new_sim_fumi_data.h" #endif class NewSimulatorDomain; /** * @class NewSimulatorFumi * * Class for simulating Fumi * **/ class NewSimulatorFumi : public NewSimulatorRdr { private: /// Record with the Fumi rdr information SaHpiFumiRecT m_fumi_rec; /// Record with underlying spec framework information SaHpiFumiSpecInfoT m_spec_info; /// Record with entities affected by an upgrade process SaHpiFumiServiceImpactDataT m_impact_data; /// Flag for automatic rollback SaHpiBoolT m_dis_rb; /// Array including the banks with source and target information cArray m_banks; NewSimulatorFumiBank *GetOrAddBank( SaHpiUint8T id ); NewSimulatorFumiBank *GetBank( SaHpiUint8T id ); public: NewSimulatorFumi( NewSimulatorResource *res ); NewSimulatorFumi( NewSimulatorResource *res, SaHpiRdrT rdr ); virtual ~NewSimulatorFumi(); /// Return FumiId virtual unsigned int Num() const { return ( unsigned int ) m_fumi_rec.Num; } bool SetData( SaHpiFumiRecT fumiRec ); bool SetInfo( SaHpiFumiSpecInfoT spec, SaHpiFumiServiceImpactDataT impact, SaHpiBoolT rbDis ); bool SetBankSource( NewSimulatorFumiBank *bank ); bool SetBankTarget( NewSimulatorFumiBank *bank ); bool SetBankLogical( NewSimulatorFumiBank *bank ); // create a RDR record virtual bool CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ); // Official HPI functions SaErrorT GetSpecInfo( SaHpiFumiSpecInfoT &spec ); SaErrorT GetImpact( SaHpiFumiServiceImpactDataT &impact ); SaErrorT SetSource( SaHpiBankNumT bank, SaHpiTextBufferT &src ); SaErrorT ValidateSource( SaHpiBankNumT bank ); SaErrorT GetSource( SaHpiBankNumT bank, SaHpiFumiSourceInfoT &src ); SaErrorT GetComponentSource( SaHpiBankNumT bank, SaHpiEntryIdT comp, SaHpiEntryIdT &next, SaHpiFumiComponentInfoT &inf ); SaErrorT GetTarget( SaHpiBankNumT bank, SaHpiFumiBankInfoT &trg ); SaErrorT GetComponentTarget( SaHpiBankNumT bank, SaHpiEntryIdT comp, SaHpiEntryIdT &next, SaHpiFumiComponentInfoT &inf ); SaErrorT GetTargetLogical( SaHpiFumiLogicalBankInfoT &trg ); SaErrorT GetComponentTargetLogical( SaHpiEntryIdT comp, SaHpiEntryIdT &next, SaHpiFumiLogicalComponentInfoT &inf ); SaErrorT StartBackup(); SaErrorT SetOrder( SaHpiBankNumT bank, SaHpiUint32T pos ); SaErrorT CopyBank( SaHpiBankNumT bank, SaHpiBankNumT dest ); SaErrorT Install( SaHpiBankNumT bank ); SaErrorT GetStatus( SaHpiBankNumT bank, SaHpiFumiUpgradeStatusT &status ); SaErrorT VerifyTarget( SaHpiBankNumT bank ); SaErrorT VerifyTargetMain(); SaErrorT CancelUpgrade( SaHpiBankNumT bank ); SaErrorT GetRollbackFlag( SaHpiBoolT &rollb ); SaErrorT SetRollbackFlag( SaHpiBoolT rollb ); SaErrorT Rollback(); SaErrorT Activate(); SaErrorT Activate( SaHpiBoolT log ); SaErrorT Cleanup( SaHpiBankNumT bank ); virtual void Dump( NewSimulatorLog &dump ) const; }; #endif openhpi-3.6.1/plugins/dynamic_simulator/new_sim_rdr.cpp0000644000175100017510000000666112575647274022427 0ustar mohanmohan/** * @file new_sim_rdr.cpp * * The file includes an abstract class for rdr types:\n * NewSimulatorRdr * * @author Lars Wetzel * @version 0.2 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * The new Simulator plugin is adapted from the ipmidirect plugin. * Thanks to \n * Thomas Kanngieser \n * Pierre Sangouard * */ #include "new_sim_rdr.h" #include "new_sim_entity.h" #include "new_sim_resource.h" #include "new_sim_domain.h" /** * Constructor **/ NewSimulatorRdr::NewSimulatorRdr( NewSimulatorResource *res, SaHpiRdrTypeT type ) : m_resource( 0 ), m_type( type ), m_populate( false ) { } /** * Full qualified constructor **/ NewSimulatorRdr::NewSimulatorRdr( NewSimulatorResource *res, SaHpiRdrTypeT type, SaHpiEntityPathT entity, SaHpiBoolT isFru, SaHpiTextBufferT idString) : m_resource( 0 ), m_type( type ), m_entity_path( entity ), m_is_fru( isFru ), m_id_string( idString ), m_populate( false ) { } /** * Destructor **/ NewSimulatorRdr::~NewSimulatorRdr() {} /** * Return a pointer on the own domain * * @return pointer on NewSimulatorDomain **/ NewSimulatorDomain *NewSimulatorRdr::Domain() { return m_resource->Domain(); } /** * A rdr structure is filled with the internally data * * This method is called by method NewSimulatorRdr::Populate(). * * @param resource Address of resource structure * @param rdr Address of rdr structure * * @return true **/ bool NewSimulatorRdr::CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ) { rdr.RecordId = m_record_id; rdr.RdrType = m_type; rdr.Entity = m_entity_path; rdr.IdString = m_id_string; return true; } /** * Add the Rdr to the rptcache * * In this function the object is added to the rptcache by calling oh_add_rdr and * afterwards append on the given list. * * @param list Pointer on GSList * @return success **/ bool NewSimulatorRdr::Populate(GSList **list) { if ( m_populate ) return true; // find resource SaHpiRptEntryT *resource = Domain()->FindResource( Resource()->ResourceId() ); if ( !resource ) { stdlog << "Resource not found: Can't populate RDR !\n"; return false; } // create rdr SaHpiRdrT *rdr = (SaHpiRdrT *)g_malloc0(sizeof(SaHpiRdrT)); CreateRdr( *resource, *rdr ); int rv = oh_add_rdr( Domain()->GetHandler()->rptcache, resource->ResourceId, rdr, this, 1 ); if ( rv != 0 ) { stdlog << "Can't add RDR to plugin cache !\n"; g_free( rdr ); return false; } // assign the hpi record id to sensor, so we can find // the rdr for a given sensor. // the id comes from oh_add_rdr. RecordId() = rdr->RecordId; stdlog << "NewSimulatorRdr::Populate RDR for resource " << resource->ResourceId << " RDR " << RecordId() << "\n"; *list = g_slist_append(*list, rdr); m_populate = true; return true; } openhpi-3.6.1/plugins/dynamic_simulator/new_sim_dimi.h0000644000175100017510000000514212575647274022220 0ustar mohanmohan/** * @file new_sim_dimi.h * * The file includes a class for dimi handling:\n * NewSimulatorDimi * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * */ #ifndef __NEW_SIM_DIMI_H__ #define __NEW_SIM_DIMI_H__ extern "C" { #include "SaHpi.h" } #ifndef __NEW_SIM_RDR_H__ #include "new_sim_rdr.h" #endif #ifndef __NEW_SIM_DIMI_DATA_H__ #include "new_sim_dimi_data.h" #endif class NewSimulatorDomain; /** * @class NewSimulatorDimi * * Class for simulating Dimi * **/ class NewSimulatorDimi : public NewSimulatorRdr { private: /// Record with the Dimi rdr information SaHpiDimiRecT m_dimi_rec; /// Record with dimi information SaHpiDimiInfoT m_dimi_info; /// Array including dimi tests cArray m_tests; /// Number of max test id SaHpiDimiTestNumT m_test_id; NewSimulatorDimiTest *GetTest( SaHpiDimiTestNumT num ); public: NewSimulatorDimi( NewSimulatorResource *res ); NewSimulatorDimi( NewSimulatorResource *res, SaHpiRdrT rdr ); virtual ~NewSimulatorDimi(); /// Return DimiId virtual unsigned int Num() const { return ( unsigned int ) m_dimi_rec.DimiNum; } /// Get a valid test id SaHpiDimiTestNumT GetTestId() { return m_test_id++; } bool SetData( SaHpiDimiRecT dimiRec ); bool SetInfo( SaHpiDimiInfoT spec ); bool AddTest( NewSimulatorDimiTest *test ); // create a RDR record virtual bool CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ); // Official HPI functions SaErrorT GetResults( SaHpiDimiTestNumT id, SaHpiDimiTestResultsT &results); SaErrorT GetStatus( SaHpiDimiTestNumT id, SaHpiDimiTestPercentCompletedT &perc, SaHpiDimiTestRunStatusT &status ); SaErrorT CancelTest( SaHpiDimiTestNumT id ); SaErrorT StartTest( SaHpiDimiTestNumT id, SaHpiUint8T number, SaHpiDimiTestVariableParamsT *param); SaErrorT GetReadiness( SaHpiDimiTestNumT id, SaHpiDimiReadyT &ready ); SaErrorT GetTestInfo( SaHpiDimiTestNumT id, SaHpiDimiTestT &tinfo ); SaErrorT GetInfo( SaHpiDimiInfoT &info ); virtual void Dump( NewSimulatorLog &dump ) const; }; #endif openhpi-3.6.1/plugins/dynamic_simulator/new_sim_control.cpp0000644000175100017510000000527312575647274023316 0ustar mohanmohan/** * @file new_sim_control.cpp * * The file includes an abstract class for control handling:\n * NewSimulatorControl * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * The new Simulator plugin is adapted from the ipmidirect plugin. * Thanks to \n * Thomas Kanngieser \n * Pierre Sangouard * */ #include "new_sim_control.h" #include "new_sim_domain.h" /** * Constructor **/ NewSimulatorControl::NewSimulatorControl( NewSimulatorResource *res, SaHpiRdrT rdr, SaHpiCtrlModeT ctrl_mode ) : NewSimulatorRdr( res, SAHPI_CTRL_RDR, rdr.Entity, rdr.IsFru, rdr.IdString ), m_num ( rdr.RdrTypeUnion.CtrlRec.Num ), m_output_type( rdr.RdrTypeUnion.CtrlRec.OutputType ), m_type( rdr.RdrTypeUnion.CtrlRec.Type ), m_write_only( rdr.RdrTypeUnion.CtrlRec.WriteOnly ), m_oem( rdr.RdrTypeUnion.CtrlRec.Oem ), m_ctrl_mode( ctrl_mode ) { memcpy(&m_def_mode, &rdr.RdrTypeUnion.CtrlRec.DefaultMode, sizeof(SaHpiCtrlDefaultModeT)); } /** * Destructor **/ NewSimulatorControl::~NewSimulatorControl() {} /** * A rdr structure is filled with the data * * This method is called by method NewSimulatorRdr::Populate(). * * @param resource Address of resource structure * @param rdr Address of rdr structure * * @return true **/ bool NewSimulatorControl::CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ) { if ( NewSimulatorRdr::CreateRdr( resource, rdr ) == false ) return false; SaHpiCtrlRecT &rec = rdr.RdrTypeUnion.CtrlRec; rec.Num = m_num; rec.OutputType = m_output_type; rec.Type = m_type; rec.WriteOnly = m_write_only; rec.Oem = m_oem; memcpy(&rec.DefaultMode, &m_def_mode, sizeof(SaHpiCtrlDefaultModeT)); return true; } /** * HPI function saHpiControlTypeGet() * * See also the description of the function inside the specification or header file. * Copying the internal reading values (if a read is allowed). * * @param type address * * @return HPI return code **/ SaErrorT NewSimulatorControl::GetType( SaHpiCtrlTypeT &type ) { if ( &type == NULL ) return SA_ERR_HPI_INVALID_PARAMS; type = m_type; return SA_OK; } openhpi-3.6.1/plugins/dynamic_simulator/new_sim_file_util.cpp0000644000175100017510000001467512575647277023623 0ustar mohanmohan/** * @file new_sim_file_util.cpp * * The file includes some helper classes for parsing the simulation file:\n * SimulatorTokens\n * NewSimulatorFileUtil * * @author Lars Wetzel * @version 0.2 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * */ #include #include #include #include "new_sim_file_util.h" #include "new_sim_text_buffer.h" #include "new_sim_entity.h" #include "new_sim_log.h" /** * Constructor with the name and value of the token * * @param name Name of the token * @param token Value of the token **/ SimulatorToken::SimulatorToken(const gchar *name, const guint token) { int len = strlen(name); m_name = new char[len+1]; strcpy(m_name, name); m_token = token; } /** * Destructor **/ SimulatorToken::~SimulatorToken() { } /** * Constructor **/ NewSimulatorFileUtil::NewSimulatorFileUtil( NewSimulatorEntityPath root ): m_root_ep( root ) { } /** * Constructor with Scanner information **/ NewSimulatorFileUtil::NewSimulatorFileUtil(GScanner *scanner) : m_scanner( scanner ) { } /** * Destructor **/ NewSimulatorFileUtil::~NewSimulatorFileUtil() { } /** * Parse a textbuffer * * A textbuffer is read from the simulation file and the information is stored inside * the class NewSimulatorTextBuffer. The scanner should be on token G_TOKEN_LEFT_CURLY * and will be afterwards on token G_TOKEN_RIGHT_CURLY.\n\n * \b Input example:\n * DataType=3\n * Language=25\n * DataLength=9\n * Data="Chassis 1"\n * * @param buffer Address of a textbuffer which is filled with the following input values * @return success of parsing * **/ bool NewSimulatorFileUtil::process_textbuffer( NewSimulatorTextBuffer &buffer ) { bool success = true; SaHpiTextBufferT tmp; char *datafield = NULL; char *field; guint val=0; guint cur_token = g_scanner_get_next_token(m_scanner); if (cur_token == G_TOKEN_STRING) { field = g_strdup(m_scanner->value.v_string); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse textbuffer: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); } else if (cur_token == G_TOKEN_RIGHT_CURLY) { err("Processing parse textbuffer: Empty buffer field"); } else { err("Processing parse textbuffer: Unknown token"); success = false; } while ((cur_token != G_TOKEN_RIGHT_CURLY) && success) { if (cur_token == G_TOKEN_INT) { val = m_scanner->value.v_int; } else if (cur_token == G_TOKEN_STRING) { datafield = g_strdup(m_scanner->value.v_string); } else { err("Processing parse textbuffer: unknow value type %u", cur_token); success = false; break; } if (!strcmp( "DataType", field )) { tmp.DataType = ( SaHpiTextTypeT ) val; } else if (!strcmp( "Language", field )) { tmp.Language = ( SaHpiLanguageT ) val; } else if (!strcmp( "DataLength", field )) { tmp.DataLength = val; } else if (!strcmp( "Data", field )) { strncpy ((char *) tmp.Data, datafield, SAHPI_MAX_TEXT_BUFFER_LENGTH); } else { err("Processing parse textbuffer: unknown field %s", field); } // Take the next token cur_token = g_scanner_get_next_token(m_scanner); if (cur_token == G_TOKEN_STRING) { field = g_strdup(m_scanner->value.v_string); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse textbuffer: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); } } if (success) return buffer.SetData( tmp ); return success; } /** * Parse a textbuffer * * With another method signature * * @param text Address of a SaHpiTextBufferT structure * @return success of parsing * **/ bool NewSimulatorFileUtil::process_textbuffer( SaHpiTextBufferT &text ) { NewSimulatorTextBuffer textbuffer; bool success; success = process_textbuffer( textbuffer ); text = textbuffer; return success; } /** * Parse a hex string * * Common function to parse strings filled with hex values * * @param max_len maximal length of list with the hex values * @param str string with the values * @param hexlist list to be filled with the values * @return success value **/ bool NewSimulatorFileUtil::process_hexstring( guint max_len, gchar *str, SaHpiUint8T *hexlist) { bool success = true; guint i; guint len = strlen(str); guint val_uint; if (len % 2) { err("Processing parse rpt info: Wrong Stream string length\n"); return false; } if (len > max_len*2) { err("String is longer than allowed by max_len\n"); return false; } for (i = 0; (i< max_len) || (i*2 < len); i++) { sscanf(str, "%02X", &val_uint); hexlist[i] = static_cast(val_uint); str++; str++; } return success; } /** * Parse the entity string * * Common function to parse entity string.\n * The scanner should be on token \c G_TOKEN_LEFT_CURLY and will be afterwards * on token \c G_TOKEN_RIGHT_CURLY.\n * * @param path address of entity structure * @return success value **/ bool NewSimulatorFileUtil::process_entity( SaHpiEntityPathT &path ) { NewSimulatorEntityPath ep; bool success=true; guint cur_token = g_scanner_get_next_token(m_scanner); if (cur_token == G_TOKEN_STRING) { gchar *val_str; val_str = g_strdup(m_scanner->value.v_string); ep.FromString(val_str); ep.ReplaceRoot( m_root_ep ); path = ep; } else { success = false; err("Processing parse rdr - wrong Entity value"); } cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_RIGHT_CURLY) { success = false; err("Processing parse rdr entity - Missing right culy"); } return success; } openhpi-3.6.1/plugins/dynamic_simulator/new_sim_watchdog.h0000644000175100017510000000445712575647274023106 0ustar mohanmohan/** * @file new_sim_watchdog.h * * The file includes a class for watchdog handling:\n * NewSimulatorWatchdog * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * */ #ifndef __NEW_SIM_WATCHDOG_H__ #define __NEW_SIM_WATCHDOG_H__ #ifndef __NEW_SIM_RDR_H__ #include "new_sim_rdr.h" #endif #ifndef __NEW_SIM_UTILS_H__ #include "new_sim_utils.h" #endif #ifndef __NEW_SIM_TIMER_THREAD_H__ #include "new_sim_timer_thread.h" #endif extern "C" { #include "SaHpi.h" } /** * @class NewSimulatorWatchdog * * Provides functions for simulating a watchdog timer. **/ class NewSimulatorWatchdog : public NewSimulatorRdr, public NewSimulatorTimerThread { private: /// Rdr information SaHpiWatchdogRecT m_wdt_rec; /// Watchdog information SaHpiWatchdogT m_wdt_data; /// Watchdog start time cTime m_start; /// State of the simulator watchdog timer enum WdtStateT { NONE = 0, PRETIMEOUT, TIMEOUT }; /// Internal Wdt state WdtStateT m_state; void TriggerAction( WdtStateT state ); void SendEvent( SaHpiWatchdogActionEventT wdtaction, SaHpiSeverityT sev ); protected: virtual bool TriggerAction(); public: NewSimulatorWatchdog( NewSimulatorResource *res ); NewSimulatorWatchdog( NewSimulatorResource *res, SaHpiRdrT rdr, SaHpiWatchdogT wdt_data ); ~NewSimulatorWatchdog(); /// return the number of the watchdog unsigned int Num() const { return m_wdt_rec.WatchdogNum; } /// return the Oem data of the watchdog unsigned int Oem() const { return m_wdt_rec.Oem; } // create an RDR sensor record bool CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ); // Dump void Dump( NewSimulatorLog &dump ) const; // HPI functions SaErrorT GetWatchdogInfo( SaHpiWatchdogT &watchdog); SaErrorT SetWatchdogInfo( SaHpiWatchdogT &watchdog); SaErrorT ResetWatchdog(); }; #endif openhpi-3.6.1/plugins/dynamic_simulator/new_sim_file_inventory.h0000644000175100017510000000340012575647274024325 0ustar mohanmohan/** * @file new_sim_file_inventory.h * * The file includes helper class for parsing inventory data from the simulation file:\n * NewSimulatorFileInventory * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * */ #ifndef __NEW_SIM_FILE_INVENTORY_H__ #define __NEW_SIM_FILE_INVENTORY_H__ #include extern "C" { #include "SaHpi.h" } #ifndef __NEW_SIM_FILE_RDR_H__ #include "new_sim_file_rdr.h" #endif #ifndef __NEW_SIM_RDR_H__ #include "new_sim_rdr.h" #endif #ifndef __NEW_SIM_RESOURCE_H__ #include "new_sim_resource.h" #endif #ifndef __NEW_SIM_INVENTORY_H__ #include "new_sim_inventory.h" #endif #ifndef __NEW_SIM_INVENTORY_DATA_H__ #include "new_sim_inventory_data.h" #endif /** * @class NewSimulatorFileInventory * * Provides some functions for parsing the inventory section of the simulation file. **/ class NewSimulatorFileInventory : public NewSimulatorFileRdr { private: /// static control rdr information SaHpiInventoryRecT *m_idr_rec; bool process_idr_data( NewSimulatorInventory *idr ); bool process_idr_area( NewSimulatorInventoryArea *ida ); bool process_idr_field( NewSimulatorInventoryField *idf ); public: NewSimulatorFileInventory(GScanner *scanner); virtual ~NewSimulatorFileInventory(); virtual NewSimulatorRdr * process_token(NewSimulatorResource *res); }; #endif /*__NEW_SIM_FILE_INVENTORY_H_*/ openhpi-3.6.1/plugins/dynamic_simulator/new_sim_announcement.h0000644000175100017510000000361612575647274023774 0ustar mohanmohan/** * @file new_sim_announcement.h * * The file includes an abstract class for control handling:\n * NewSimulatorAnnouncement * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * */ #ifndef __NEW_SIM_ANNOUNCEMENT_H__ #define __NEW_SIM_ANNOUNCEMENT_H__ #ifndef __NEW_SIM_RDR_H__ #include "new_sim_rdr.h" #endif extern "C" { #include "SaHpi.h" } /** * @class NewSimulatorAnnouncement * * Class for holding Announcement information * **/ class NewSimulatorAnnouncement { protected: /// Announcement data SaHpiAnnouncementT m_announcement; public: NewSimulatorAnnouncement( SaHpiAnnouncementT &ann ); virtual ~NewSimulatorAnnouncement(); /// Return the number (entryId) of an announcement virtual unsigned int EntryId() const { return (unsigned int) m_announcement.EntryId; } /// Return the severity of an announcement virtual SaHpiSeverityT Severity() const { return m_announcement.Severity; } /// Return the timestamp of an announcement virtual SaHpiTimeT TimeStamp() const { return m_announcement.Timestamp; } /// Return the Announcement structure SaHpiAnnouncementT &AnnRec() { return m_announcement; } /// Return if an announcement is acknowledge bool IsAcknowledge() { return (bool) m_announcement.Acknowledged; } /// Set Acknowledge flag void SetAcknowledge( SaHpiBoolT ack ) { m_announcement.Acknowledged = ack; } /// abstract method to dump Announcement information virtual void Dump( NewSimulatorLog &dump ) const; }; #endif openhpi-3.6.1/plugins/dynamic_simulator/new_sim_sensor_common.cpp0000644000175100017510000001373412575647274024520 0ustar mohanmohan/** * @file new_sim_sensor_common.cpp * * The file includes a class for common sensor handling:\n * NewSimulatorSensorCommon * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * */ #include "new_sim_sensor_common.h" #include "new_sim_domain.h" #include #include #include #include #include #include /** * Constructor **/ NewSimulatorSensorCommon::NewSimulatorSensorCommon( NewSimulatorResource *res ) : NewSimulatorSensor( res ) { } /** * Fully qualified constructor to fill an object with the parsed data **/ NewSimulatorSensorCommon::NewSimulatorSensorCommon( NewSimulatorResource *res, SaHpiRdrT rdr, SaHpiSensorReadingT data, SaHpiEventStateT event_state, SaHpiEventStateT event_amask, SaHpiEventStateT event_dmask, SaHpiBoolT enabled, SaHpiBoolT event_enabled) : NewSimulatorSensor( res, rdr, data, event_state, event_amask, event_dmask, enabled, event_enabled ) { } /** * Destructor **/ NewSimulatorSensorCommon::~NewSimulatorSensorCommon() { } /** * A rdr structure is filled with the internally data * * This method is called by method NewSimulatorRdr::Populate(). * * @param resource Address of resource structure * @param rdr Address of rdr structure * * @return true **/ bool NewSimulatorSensorCommon::CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ) { if ( NewSimulatorSensor::CreateRdr( resource, rdr ) == false ) return false; return true; } /** * HPI function saHpiSensorReadingGet() * * See also the description of the function inside the specification or header file. * Copying the internal reading values (if a read is allowed). * * @param data sensor reading variable in which the data should be copied * @param state sensor event state variable in which the states should be copied * * @return error code **/ SaErrorT NewSimulatorSensorCommon::GetSensorReading( SaHpiSensorReadingT &data, SaHpiEventStateT &state ) { stdlog << "DBG: NewSimulatorSensorCommon::GetSensorReading is called\n"; if ( m_enabled == SAHPI_FALSE ) return SA_ERR_HPI_INVALID_REQUEST; if ( &data != NULL ) { if (m_read_support) { memcpy( &data, &m_read_data, sizeof( SaHpiSensorReadingT )); } else { memset( &data, 0, sizeof( SaHpiSensorReadingT ) ); data.IsSupported = SAHPI_FALSE; } } if ( &state != NULL ) { memcpy( &state, &m_event_data, sizeof( SaHpiEventStateT ) ); } return SA_OK; } /** SaErrorT NewSimulatorSensorCommon::CreateEvent( NewSimulatorEvent *event, SaHpiEventT &h ) { SaErrorT rv = NewSimulatorSensor::CreateEvent( event, h ); if ( rv != SA_OK ) return rv; // sensor event SaHpiSensorEventT &se = h.EventDataUnion.SensorEvent; se.Assertion = (SaHpiBoolT)!(event->m_data[9] & 0x80); se.EventState = (1 << (event->m_data[10] & 0x0f)); // default value h.Severity = SAHPI_INFORMATIONAL; SaHpiSensorOptionalDataT optional_data = 0; // byte 2 tIpmiEventType type = (tIpmiEventType)(event->m_data[10] >> 6); if ( type == eIpmiEventData1 ) { if ((event->m_data[11] & 0x0f) != 0x0f) { se.PreviousState = (1 << (event->m_data[11] & 0x0f)); optional_data |= SAHPI_SOD_PREVIOUS_STATE; } if ((event->m_data[11] & 0xf0) != 0xf0) { SaHpiEventStateT evt_sec_state = (1 << ((event->m_data[11]>> 4) & 0x0f)); switch (evt_sec_state) { case SAHPI_ES_OK: h.Severity = SAHPI_OK; break; case SAHPI_ES_MINOR_FROM_OK: h.Severity = SAHPI_MINOR; break; case SAHPI_ES_MAJOR_FROM_LESS: h.Severity = SAHPI_MAJOR; break; case SAHPI_ES_CRITICAL_FROM_LESS: h.Severity = SAHPI_CRITICAL; break; case SAHPI_ES_MINOR_FROM_MORE: h.Severity = SAHPI_MINOR; break; case SAHPI_ES_MAJOR_FROM_CRITICAL: h.Severity = SAHPI_MAJOR; break; case SAHPI_ES_CRITICAL: h.Severity = SAHPI_CRITICAL; break; case SAHPI_ES_MONITOR: h.Severity = SAHPI_INFORMATIONAL; break; case SAHPI_ES_INFORMATIONAL: h.Severity = SAHPI_INFORMATIONAL; break; } } } else if ( type == eIpmiEventData2 ) { se.Oem = (SaHpiUint32T)event->m_data[11]; optional_data |= SAHPI_SOD_OEM; } else if ( type == eIpmiEventData3 ) { se.SensorSpecific = (SaHpiUint32T)event->m_data[11]; optional_data |= SAHPI_SOD_SENSOR_SPECIFIC; } // byte 3 type = (tIpmiEventType)((event->m_data[10] & 0x30) >> 4); if ( type == eIpmiEventData2 ) { se.Oem |= (SaHpiUint32T)((event->m_data[12] << 8) & 0xff00); optional_data |= SAHPI_SOD_OEM; } else if ( type == eIpmiEventData3 ) { se.SensorSpecific |= (SaHpiUint32T)((event->m_data[12] << 8) & 0xff00); optional_data |= SAHPI_SOD_SENSOR_SPECIFIC; } se.OptionalDataPresent = optional_data; return SA_OK; } **/ /** * Dump the sensor information * * @param dump Address of the log * **/ void NewSimulatorSensorCommon::Dump( NewSimulatorLog &dump ) const { NewSimulatorSensor::Dump( dump ); dump << "Common Sensor is defined,\n"; } openhpi-3.6.1/plugins/dynamic_simulator/new_sim_control_discrete.h0000644000175100017510000000334412575647277024645 0ustar mohanmohan/** * @file new_sim_control_discrete.h * * The file includes a class for discrete control handling:\n * NewSimulatorControlDiscrete * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * */ #ifndef __NEW_SIM_CONTROL_DISCRETE_H__ #define __NEW_SIM_CONTROL_DISCRETE_H__ #ifndef __NEW_SIM_RDR_H__ #include "new_sim_rdr.h" #endif #ifndef __NEW_SIM_CONTROL_H__ #include "new_sim_control.h" #endif extern "C" { #include "SaHpi.h" } /** * @class NewSimulatorControlDiscrete * * Class for simulating Discrete controls * **/ class NewSimulatorControlDiscrete : public NewSimulatorControl { protected: /// rdr information - Discrete record SaHpiCtrlRecDiscreteT m_rec; /// state of the control SaHpiCtrlStateDiscreteT m_state; public: NewSimulatorControlDiscrete( NewSimulatorResource *res, SaHpiRdrT rdr, SaHpiCtrlStateDiscreteT state, SaHpiCtrlModeT mode ); virtual ~NewSimulatorControlDiscrete(); // create an RDR sensor record virtual bool CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ); virtual SaErrorT SetState( const SaHpiCtrlModeT &mode, const SaHpiCtrlStateT &state ); virtual SaErrorT GetState( SaHpiCtrlModeT &mode, SaHpiCtrlStateT &state ); virtual void Dump( NewSimulatorLog &dump ) const; }; #endif openhpi-3.6.1/plugins/dynamic_simulator/new_sim_utils.h0000644000175100017510000001211412575647274022433 0ustar mohanmohan/** * @file new_sim_utils.h * * The file includes an some utilities and a class for time handling\n * cClass * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * The new Simulator plugin is adapted from the ipmidirect plugin. * Thanks to * Thomas Kanngieser * */ #ifndef __NEW_SIM_UTILS_H__ #define __NEW_SIM_UTILS_H__ #include /** * @enum tNewSimulatorFruState * * Mapping Fru states to the ipmi state numbering. **/ enum tNewSimulatorFruState { eFruStateNotInstalled = 0, eFruStateInactive = 1, eFruStateActivationRequest = 2, eFruStateActivationInProgress = 3, eFruStateActive = 4, eFruStateDeactivationRequest = 5, eFruStateDeactivationInProgress = 6, eFruStateCommunicationLost = 7 }; /** * Returns a string for a Fru state * * @param state IPMI state * @return string with the name of the state **/ const char *NewSimulatorFruStateToString( tNewSimulatorFruState state ); /// Size of a date string #define dDateStringSize 11 void NewSimulatorDateToString( unsigned int time, char *str ); /// Size of a time string #define dTimeStringSize 9 void NewSimulatorTimeToString( unsigned int time, char *str ); /// Size of a date and time string #define dDateTimeStringSize 20 void NewSimulatorDateTimeToString( unsigned int time, char *str ); /** * @class cTime * * The time class can be used to work with time values **/ class cTime { public: /// time value timeval m_time; /** * Constructor **/ cTime() { m_time.tv_sec = 0; m_time.tv_usec = 0; } /** * qualified Constructor with timeval **/ cTime( const struct timeval &tv ) { m_time.tv_sec = tv.tv_sec; m_time.tv_usec = tv.tv_usec; } /** * copy Constructor **/ cTime( const cTime &t ) { m_time.tv_sec = t.m_time.tv_sec; m_time.tv_usec = t.m_time.tv_usec; } /** * qualified Constructor with seconds and usec **/ cTime( unsigned int s, unsigned int u ) { m_time.tv_sec = s; m_time.tv_usec = u; } /** * noramlize the internal data */ void Normalize() { while( m_time.tv_usec > 1000000 ) { m_time.tv_usec -= 1000000; m_time.tv_sec++; } while( m_time.tv_usec < 0 ) { m_time.tv_usec += 1000000; m_time.tv_sec--; } } /** * compare two time classes */ int Cmp( const cTime &t ) { if ( m_time.tv_sec < t.m_time.tv_sec ) return -1; if ( m_time.tv_sec > t.m_time.tv_sec ) return 1; if ( m_time.tv_usec < t.m_time.tv_usec ) return -1; if ( m_time.tv_usec > t.m_time.tv_usec ) return 1; return 0; } /** * lower operator **/ bool operator<( const cTime &t ) { return Cmp( t ) < 0; } /** * lower equal operator **/ bool operator<=( const cTime &t ) { return Cmp( t ) < 0; } /** * higher operator **/ bool operator>( const cTime &t ) { return Cmp( t ) > 0; } /** * higher equal operator **/ bool operator>=( const cTime &t ) { return Cmp( t ) >= 0; } /** * equal operator **/ bool operator==( const cTime &t ) { return Cmp( t ) == 0; } /** * not equal operator **/ bool operator!=( const cTime &t ) { return Cmp( t ) == 0; } /** * add cTime class operator **/ cTime &operator+=( const cTime &t ) { m_time.tv_sec += t.m_time.tv_sec; m_time.tv_usec += t.m_time.tv_usec; Normalize(); return *this; } /** * add msec value operator **/ cTime &operator+=( int ms ) { m_time.tv_sec += ms / 1000; m_time.tv_usec += (ms % 1000) * 1000; Normalize(); return *this; } /** * subtract time value operator **/ cTime &operator-=( int ms ) { m_time.tv_sec -= ms / 1000; m_time.tv_usec -= (ms % 1000) * 1000; Normalize(); return *this; } /** * subtract time value operator **/ cTime &operator-=( cTime t ) { m_time.tv_sec -= t.m_time.tv_sec; m_time.tv_usec -= t.m_time.tv_usec; Normalize(); return *this; } /** * fill the class with actual time **/ static cTime Now() { cTime t; gettimeofday( &t.m_time, 0 ); return t; } /** * get the time value in msec **/ unsigned int GetMsec() { return (unsigned int) (m_time.tv_sec * 1000 + m_time.tv_usec / 1000); } /** * Clear the value **/ void Clear() { m_time.tv_sec = 0; m_time.tv_usec = 0; } /** * Check whether the time was set **/ bool IsSet() { return ( !(( m_time.tv_sec == 0 ) && ( m_time.tv_usec == 0 )) ); } }; #endif openhpi-3.6.1/plugins/dynamic_simulator/new_sim_file_annunciator.cpp0000644000175100017510000004116312575647274025154 0ustar mohanmohan/** * @file new_sim_file_annunciator.cpp * * The file includes the class for parsing the control data:\n * NewSimulatorFileAnnunciator * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * */ #include #include #include #include #include #include "new_sim_file_rdr.h" #include "new_sim_file_annunciator.h" #include "new_sim_file_util.h" #include "new_sim_resource.h" #include "new_sim_rdr.h" #include "new_sim_annunciator.h" #include "new_sim_announcement.h" #include /** * Constructor **/ NewSimulatorFileAnnunciator::NewSimulatorFileAnnunciator( GScanner *scanner ) : NewSimulatorFileRdr ( scanner ) { m_ann_rec = &m_rdr.RdrTypeUnion.AnnunciatorRec; } /** * Destructor **/ NewSimulatorFileAnnunciator::~NewSimulatorFileAnnunciator() { } /** * Parse inside the \c ANNUNCIATOR_TOKEN_HANDLER the \c RDR_DETAIL_TOKEN_HANDLER * * Startpoint is the \c RDR_DETAIL_TOKEN_HANDLER. Endpoint is the last \c G_TOKEN_RIGHT_CURLY of the \c * ANNUNCIATOR_TOKEN_HANDLER. * * @param res Pointer on the resource which includes the annunciator * * @return Pointer on a new Rdr entry **/ NewSimulatorRdr * NewSimulatorFileAnnunciator::process_token( NewSimulatorResource *res) { bool success = true; char *field; NewSimulatorAnnunciator *ann = NULL; guint cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_LEFT_CURLY) { err("Processing parse configuration: Expected left curly token."); return NULL; } m_depth++; while ( (m_depth > 0) && success ) { cur_token = g_scanner_get_next_token(m_scanner); switch (cur_token) { case G_TOKEN_EOF: err("Processing parse rpt entry: File ends too early"); success = false; break; case G_TOKEN_RIGHT_CURLY: m_depth--; break; case G_TOKEN_LEFT_CURLY: m_depth++; break; case G_TOKEN_STRING: field = g_strdup(m_scanner->value.v_string); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (!strcmp(field, "AnnunciatorNum")) { if (cur_token == G_TOKEN_INT) m_ann_rec->AnnunciatorNum = m_scanner->value.v_int; } else if (!strcmp(field, "AnnunciatorType")) { if (cur_token == G_TOKEN_INT) m_ann_rec->AnnunciatorType = (SaHpiAnnunciatorTypeT) m_scanner->value.v_int; } else if (!strcmp(field, "ModeReadOnly")) { if (cur_token == G_TOKEN_INT) m_ann_rec->ModeReadOnly = (SaHpiAnnunciatorTypeT) m_scanner->value.v_int; } else if (!strcmp(field, "MaxConditions")) { if (cur_token == G_TOKEN_INT) m_ann_rec->MaxConditions = m_scanner->value.v_int; } else if (!strcmp(field, "Oem")) { if (cur_token == G_TOKEN_INT) m_ann_rec->Oem = m_scanner->value.v_int; } else { // Unknown Token err("Processing parse rdr entry: Unknown Rdr field %s", field); success = false; } break; case ANNUNCIATOR_DATA_TOKEN_HANDLER: stdlog << "DBG: Start parsing annunciator data.\n"; ann = new NewSimulatorAnnunciator( res, m_rdr ); success = process_annunciator_data( ann ); stdlog << "DBG: Parsing returns success = " << success << "\n"; break; default: err("Processing parse rdr entry: Unknown token"); success = false; break; } } if ( success ) { stdlog << "DBG: Parse Annunciator successfully\n"; // necessary if some ann_rec data was read after the DATA section if ( ann != NULL ) ann->SetData( *m_ann_rec ); return ann; } if (ann != NULL) delete ann; return NULL; } /** * Parse the Annunciator Data seciton * * Startpoint is the \c ANNUNCIATOR_DATA_TOKEN_HANDLER. Endpoint is the last \c G_TOKEN_RIGHT_CURLY. * * @return bool value success * **/ bool NewSimulatorFileAnnunciator::process_annunciator_data( NewSimulatorAnnunciator *ann ) { bool success = true; int start = m_depth; char *field; guint cur_token; cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_LEFT_CURLY) { err("Processing parse control rdr entry - Missing left curly in AnnunciatorData section"); success = false; } m_depth++; if (!success) return success; while ( (m_depth > start) && success ) { cur_token = g_scanner_get_next_token(m_scanner); switch (cur_token) { case G_TOKEN_EOF: err("Processing parse rdr entry: File ends too early"); success = false; break; case G_TOKEN_RIGHT_CURLY: m_depth--; break; case G_TOKEN_LEFT_CURLY: m_depth++; break; case G_TOKEN_STRING: field = g_strdup(m_scanner->value.v_string); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (!strcmp(field, "Mode")) { if (cur_token == G_TOKEN_INT) { ann->SetMode(( SaHpiAnnunciatorModeT ) m_scanner->value.v_int); } else { err("Wrong typ of AnnunciatorMode"); success = false; } } else { // Unknown Token err("Processing parse rdr entry: Unknown type field %s", field); success = false; } break; case ANNOUNCEMENT_TOKEN_HANDLER: SaHpiAnnouncementT announce; SaErrorT rv; success = process_announcement( &announce ); stdlog << "DBG: Process Announcement with success = " << success <<"\n"; rv = ann->AddAnnouncement( announce ); if (rv != SA_OK ) { stdlog << "DBG: Ups AddAnnouncement returns an error: rv = " << rv << "\n"; success = false; } break; default: err("Processing Annunciator data: Unknown token"); success = false; break; } } return success; } /** * Parse an announcement * * Startpoint is the \c ANNOUNCEMENT_TOKEN_HANDLER. Endpoint is the last \c G_TOKEN_RIGHT_CURLY. * * @param announce pointer on SaHpiAnnouncementT record to be filled * @return bool value success * **/ bool NewSimulatorFileAnnunciator::process_announcement(SaHpiAnnouncementT *announce ) { bool success = true; int start = m_depth; char *field; guint cur_token; cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_LEFT_CURLY) { err("Processing parse announcement entry - Missing left curly at Announcement"); success = false; } m_depth++; if (!success) return success; while ( (m_depth > start) && success ) { cur_token = g_scanner_get_next_token(m_scanner); switch (cur_token) { case G_TOKEN_EOF: err("Processing parse rdr entry: File ends too early"); success = false; break; case G_TOKEN_RIGHT_CURLY: m_depth--; break; case G_TOKEN_LEFT_CURLY: m_depth++; break; case G_TOKEN_STRING: field = g_strdup(m_scanner->value.v_string); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (!strcmp(field, "EntryId")) { if (cur_token == G_TOKEN_INT) announce->EntryId = m_scanner->value.v_int; } else if (!strcmp(field, "Timestamp")) { if (cur_token == G_TOKEN_INT) announce->Timestamp = m_scanner->value.v_int64; } else if (!strcmp(field, "AddedByUser")) { if (cur_token == G_TOKEN_INT) announce->AddedByUser = ( SaHpiBoolT ) m_scanner->value.v_int; } else if (!strcmp(field, "Severity")) { if (cur_token == G_TOKEN_INT) announce->Severity = ( SaHpiSeverityT ) m_scanner->value.v_int; } else if (!strcmp(field, "Acknowledged")) { if (cur_token == G_TOKEN_INT) announce->Acknowledged = ( SaHpiBoolT ) m_scanner->value.v_int; } else if (!strcmp(field, "StatusCond")) { if (cur_token == G_TOKEN_LEFT_CURLY) { success = process_announce_condition( &announce->StatusCond ); if ( !success ) err("Processing StatusCond entry returns false"); } else { err("Processing StatusCond entry - Missing left curly"); success = false; } } else { // Unknown Token err("Processing parse rdr entry: Unknown type field %s", field); success = false; } break; default: err("Processing data format: Unknown token"); success = false; break; } } return success; } /** * Parse the status condition structure * * Startpoint is the \c G_TOKEN_LEFT_CURLY. Endpoint is the last \c G_TOKEN_RIGHT_CURLY. * * @return bool value success * **/ bool NewSimulatorFileAnnunciator::process_announce_condition(SaHpiConditionT *cond) { bool success = true; int start = m_depth; char *field; guint cur_token; m_depth++; // Left Curly -- our startpoint while ( (m_depth > start) && success ) { cur_token = g_scanner_get_next_token(m_scanner); switch (cur_token) { case G_TOKEN_EOF: err("Processing parse rdr entry: File ends too early"); success = false; break; case G_TOKEN_RIGHT_CURLY: m_depth--; break; case G_TOKEN_LEFT_CURLY: m_depth++; break; case G_TOKEN_STRING: field = g_strdup(m_scanner->value.v_string); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (!strcmp(field, "Type")) { if (cur_token == G_TOKEN_INT) cond->Type = ( SaHpiStatusCondTypeT ) m_scanner->value.v_int; } else if (!strcmp(field, "Entity")) { if (cur_token == G_TOKEN_LEFT_CURLY) success = process_entity( cond->Entity ); if ( !success ) err("Processing entity in status condition returns false"); } else if (!strcmp(field, "DomainId")) { if (cur_token == G_TOKEN_INT) cond->DomainId = m_scanner->value.v_int; } else if (!strcmp(field, "ResourceId")) { if (cur_token == G_TOKEN_INT) cond->ResourceId = m_scanner->value.v_int; } else if (!strcmp(field, "SensorNum")) { if (cur_token == G_TOKEN_INT) cond->SensorNum = m_scanner->value.v_int; } else if (!strcmp(field, "EventState")) { if (cur_token == G_TOKEN_INT) cond->EventState = ( SaHpiEventStateT ) m_scanner->value.v_int; } else if (!strcmp(field, "Name")) { if (cur_token == G_TOKEN_LEFT_CURLY) success = process_name( cond->Name ); if ( !success ) err("Processing Name in status condition returns false"); } else if (!strcmp(field, "Mid")) { if (cur_token == G_TOKEN_INT) cond->Mid = ( SaHpiManufacturerIdT ) m_scanner->value.v_int; } else if (!strcmp(field, "Data")) { if (cur_token == G_TOKEN_LEFT_CURLY) success = process_textbuffer( cond->Data ); if ( !success ) err("Processing Textbuffer in status condition returns false"); } else { // Unknown Token err("Processing parse rdr entry: Unknown type field %s", field); success = false; } break; default: err("Processing data format: Unknown token"); success = false; break; } } return success; } /** * Parse the name record * * Common function to parse name record.\n * The scanner should be on token \c G_TOKEN_LEFT_CURLY and will be afterwards * on token \c G_TOKEN_RIGHT_CURLY.\n * * @param address of entity structure * @return success value **/ bool NewSimulatorFileAnnunciator::process_name( SaHpiNameT &name ) { int start = m_depth; bool success = true; char *field; guint cur_token; name.Length = SA_HPI_MAX_NAME_LENGTH; m_depth++; // Left Curly -- our startpoint while ( (m_depth > start) && success ) { cur_token = g_scanner_get_next_token(m_scanner); switch (cur_token) { case G_TOKEN_EOF: err("Processing parse rdr entry: File ends too early"); success = false; break; case G_TOKEN_RIGHT_CURLY: m_depth--; break; case G_TOKEN_LEFT_CURLY: m_depth++; break; case G_TOKEN_STRING: field = g_strdup(m_scanner->value.v_string); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (!strcmp(field, "Length")) { if (cur_token == G_TOKEN_INT) name.Length = m_scanner->value.v_int; } else if (!strcmp(field, "Value")) { if (cur_token == G_TOKEN_STRING) strncpy((char *) &name.Value, g_strdup(m_scanner->value.v_string), name.Length); } else { // Unknown Token err("Processing parse rdr entry: Unknown type field %s", field); success = false; } break; default: err("Processing data format: Unknown token"); success = false; break; } } return success; } openhpi-3.6.1/plugins/dynamic_simulator/new_sim_control_text.cpp0000644000175100017510000001625412575647274024363 0ustar mohanmohan/** * @file new_sim_control_text.cpp * * The file includes a class for text control handling:\n * NewSimulatorControlText * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * */ #include #include "new_sim_control.h" #include "new_sim_control_text.h" #include "new_sim_domain.h" /** * Constructor **/ NewSimulatorControlText::NewSimulatorControlText( NewSimulatorResource *res, SaHpiRdrT rdr, SaHpiCtrlStateTextT state, SaHpiCtrlModeT mode ) : NewSimulatorControl( res, rdr, mode ) { memcpy(&m_rec, &rdr.RdrTypeUnion.CtrlRec.TypeUnion.Text, sizeof( SaHpiCtrlRecTextT )); memcpy(&m_state, &state, sizeof( SaHpiCtrlStateTextT )); } /** * Destructor **/ NewSimulatorControlText::~NewSimulatorControlText() {} /** * A rdr structure is filled with the data * * This method is called by method NewSimulatorRdr::Populate(). * * @param resource Address of resource structure * @param rdr Address of rdr structure * * @return true **/ bool NewSimulatorControlText::CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ) { if ( NewSimulatorControl::CreateRdr( resource, rdr ) == false ) return false; memcpy(&rdr.RdrTypeUnion.CtrlRec.TypeUnion.Text, &m_rec, sizeof( SaHpiCtrlRecTextT )); return true; } /** * HPI function saHpiControlGet() * * See also the description of the function inside the specification or header file. * Copying the internal values (if a read is allowed). * * @param mode address to be filled * @param state address to be filled * * @return HPI return code **/ SaErrorT NewSimulatorControlText::GetState( SaHpiCtrlModeT &mode, SaHpiCtrlStateT &state ) { int pos = 0; int factor = 1; if (m_write_only == SAHPI_TRUE) return SA_ERR_HPI_INVALID_CMD; if ( &mode != NULL ) { mode = m_ctrl_mode; } if ( &state != NULL ) { state.Type = m_type; if (state.StateUnion.Text.Line != SAHPI_TLN_ALL_LINES) { if (state.StateUnion.Text.Line > m_rec.MaxLines) return SA_ERR_HPI_INVALID_DATA; state.StateUnion.Text.Text.DataType = m_state.Text.DataType; state.StateUnion.Text.Text.Language = m_state.Text.Language; if (m_rec.DataType == SAHPI_TL_TYPE_UNICODE) factor = 2; pos = state.StateUnion.Text.Line - factor * m_rec.MaxChars; memcpy( &state.StateUnion.Text.Text.Data[0], &m_state.Text.Data[pos], sizeof( SaHpiUint8T )*m_rec.MaxChars*factor ); state.StateUnion.Text.Text.DataLength = m_rec.MaxChars*factor; } else { memcpy( &state.StateUnion.Text, &m_state, sizeof( SaHpiCtrlStateTextT )); } } return SA_OK; } /** * HPI function saHpiControlSet() * * See also the description of the function inside the specification or header file. * Copying the internal values (if a read is allowed). * * @param mode address to be set * @param state address to be set * * @return HPI return code **/ SaErrorT NewSimulatorControlText::SetState( const SaHpiCtrlModeT &mode, const SaHpiCtrlStateT &state ) { int factor = 1; SaHpiTextTypeT tmpType; NewSimulatorTextBuffer tb; int i, pos; unsigned uint; if (&mode == NULL) return SA_ERR_HPI_INVALID_PARAMS; if ((m_def_mode.ReadOnly == SAHPI_TRUE) && (mode != m_def_mode.Mode)) return SA_ERR_HPI_READ_ONLY; if (mode == SAHPI_CTRL_MODE_AUTO) { m_ctrl_mode = mode; return SA_OK; } if (mode != SAHPI_CTRL_MODE_MANUAL) return SA_ERR_HPI_INVALID_PARAMS; if (&state == NULL) return SA_ERR_HPI_INVALID_PARAMS; if (state.Type != m_type) return SA_ERR_HPI_INVALID_DATA; if (state.StateUnion.Text.Text.DataType != m_rec.DataType) return SA_ERR_HPI_INVALID_DATA; if ( ((m_rec.DataType == SAHPI_TL_TYPE_UNICODE) || (m_rec.DataType == SAHPI_TL_TYPE_TEXT)) && (state.StateUnion.Text.Text.Language != m_rec.Language) ) return SA_ERR_HPI_INVALID_DATA; if ( m_rec.DataType == SAHPI_TL_TYPE_UNICODE ) factor = 2; if ( ((state.StateUnion.Text.Line - 1) * m_rec.MaxChars * factor + state.StateUnion.Text.Text.DataLength) > (m_rec.MaxChars * factor * m_rec.MaxLines ) ) return SA_ERR_HPI_INVALID_DATA; switch (state.StateUnion.Text.Text.DataType) { case SAHPI_TL_TYPE_UNICODE: if ( state.StateUnion.Text.Text.DataLength % 2 ) return SA_ERR_HPI_INVALID_PARAMS; for (i = 0; i < state.StateUnion.Text.Text.DataLength; i++) { uint = 0; uint = state.StateUnion.Text.Text.Data[i]; uint = uint << 8; uint = uint & state.StateUnion.Text.Text.Data[++i]; if ((uint >= 0xD800) && (uint <= 0xDFFF)) return SA_ERR_HPI_INVALID_PARAMS; } break; case SAHPI_TL_TYPE_BCDPLUS: case SAHPI_TL_TYPE_ASCII6: case SAHPI_TL_TYPE_TEXT: tmpType = tb.CheckAscii( (char *) state.StateUnion.Text.Text.Data ); if (tmpType > state.StateUnion.Text.Text.DataType) return SA_ERR_HPI_INVALID_PARAMS; break; case SAHPI_TL_TYPE_BINARY: break; default: err("Unknown Text type"); } if (state.StateUnion.Text.Line == SAHPI_TLN_ALL_LINES) { memset(&m_state, 0, sizeof ( SaHpiUint8T ) * m_rec.MaxChars * factor * m_rec.MaxLines); memcpy(&m_state, &state.StateUnion.Text, sizeof( SaHpiCtrlStateTextT )); } else { // Check whether wrapping occurs i = state.StateUnion.Text.Text.DataLength / (m_rec.MaxChars * factor); pos = ((state.StateUnion.Text.Line - 1) + i) * m_rec.MaxChars * factor; // and clear this line memset( &m_state.Text.Data[pos], 0, sizeof ( SaHpiUint8T ) * m_rec.MaxChars * factor); // Copy the stuff pos = (state.StateUnion.Text.Line - 1) * m_rec.MaxChars * factor; memcpy( &m_state.Text.Data[pos], state.StateUnion.Text.Text.Data, sizeof ( SaHpiUint8T ) * state.StateUnion.Text.Text.DataLength ); } m_ctrl_mode = mode; return SA_OK; } /** * Dump the control information * * @param dump Address of the log * **/ void NewSimulatorControlText::Dump( NewSimulatorLog &dump ) const { dump << "Text control " << m_id_string << ";\n"; dump << "ControlNum " << m_num << ";\n"; dump << "Oem " << m_oem << ";\n"; dump << "State.Line " << m_state.Line << ";\n"; dump << "State.Text.DataLength " << m_state.Text.DataLength << ";\n"; dump << "State.Text.Data " << m_state.Text.Data << ";\n"; dump << "Mode" << m_ctrl_mode << ";\n"; } openhpi-3.6.1/plugins/dynamic_simulator/new_sim_file_control.cpp0000644000175100017510000011222212575647274024306 0ustar mohanmohan/** * @file new_sim_file_control.cpp * * The file includes the class for parsing the control data:\n * NewSimulatorFileControl * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * */ #include #include #include #include #include #include "new_sim_file_rdr.h" #include "new_sim_file_control.h" #include "new_sim_file_util.h" #include "new_sim_resource.h" #include "new_sim_rdr.h" #include "new_sim_control.h" #include "new_sim_control_digital.h" #include "new_sim_control_discrete.h" #include "new_sim_control_analog.h" #include "new_sim_control_oem.h" #include "new_sim_control_stream.h" #include "new_sim_control_text.h" #include /** * Constructor **/ NewSimulatorFileControl::NewSimulatorFileControl( GScanner *scanner ) : NewSimulatorFileRdr ( scanner ), m_diff_mode( false ), m_diff_state( false ) { m_ctrl_rec = &m_rdr.RdrTypeUnion.CtrlRec; memset(&m_ctrl_state, 0, sizeof( SaHpiCtrlStateT )); memset(&m_ctrl_mode, 0, sizeof( SaHpiCtrlModeT )); } /** * Destructor **/ NewSimulatorFileControl::~NewSimulatorFileControl() { } /** * Parse inside the \c CONTROL_TOKEN_HANDLER the \c RDR_DETAIL_TOKEN_HANDLER * * Depend on which control type is parsed several help methods are called. Startpoint is the * \c RDR_DETAIL_TOKEN_HANDLER. Endpoint is the last \c G_TOKEN_RIGHT_CURLY of the \c * CONTROL_TOKEN_HANDLER. * * @param res Pointer on the resource which includes the control * * @return Pointer on a new Rdr entry **/ NewSimulatorRdr * NewSimulatorFileControl::process_token( NewSimulatorResource *res) { bool success = true; char *field; guint cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_LEFT_CURLY) { err("Processing parse configuration: Expected left curly token."); return NULL; } m_depth++; while ( (m_depth > 0) && success ) { cur_token = g_scanner_get_next_token(m_scanner); switch (cur_token) { case G_TOKEN_EOF: err("Processing parse rpt entry: File ends too early"); success = false; break; case G_TOKEN_RIGHT_CURLY: m_depth--; break; case G_TOKEN_LEFT_CURLY: m_depth++; break; case G_TOKEN_STRING: field = g_strdup(m_scanner->value.v_string); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (!strcmp(field, "Num")) { if (cur_token == G_TOKEN_INT) m_ctrl_rec->Num = m_scanner->value.v_int; } else if (!strcmp(field, "OutputType")) { if (cur_token == G_TOKEN_INT) m_ctrl_rec->OutputType = (SaHpiCtrlOutputTypeT) m_scanner->value.v_int; } else if (!strcmp(field, "Type")) { if (cur_token == G_TOKEN_INT) m_ctrl_rec->Type = (SaHpiCtrlTypeT) m_scanner->value.v_int; } else if (!strcmp(field, "TypeUnion.Digital")) { if (cur_token != G_TOKEN_LEFT_CURLY) { err("Processing control - Missing left curly at TypeUnion.Digital"); success = false; } else { success = process_type_digital( ); } } else if (!strcmp(field, "TypeUnion.Discrete")) { if (cur_token != G_TOKEN_LEFT_CURLY) { err("Processing control - Missing left curly at TypeUnion.Digital"); success = false; } else { success = process_type_discrete(); } } else if (!strcmp(field, "TypeUnion.Analog")) { if (cur_token != G_TOKEN_LEFT_CURLY) { err("Processing parse control rdr entry - Missing left curly at TypeUnion"); success = false; } else { success = process_type_analog(); } } else if (!strcmp(field, "TypeUnion.Stream")) { if (cur_token != G_TOKEN_LEFT_CURLY) { err("Processing parse control rdr entry - Missing left curly at TypeUnion"); success = false; } else { success = process_type_stream(); } } else if (!strcmp(field, "TypeUnion.Text")) { if (cur_token != G_TOKEN_LEFT_CURLY) { err("Processing parse control rdr entry - Missing left curly at TypeUnion"); return NULL; } else { success = process_type_text(); } } else if (!strcmp(field, "TypeUnion.Oem")) { if (cur_token != G_TOKEN_LEFT_CURLY) { err("Processing parse control rdr entry - Missing left curly at TypeUnion"); return NULL; } else { success = process_type_oem(); } } else if (!strcmp(field, "DefaultMode")) { if (cur_token != G_TOKEN_LEFT_CURLY) { err("Processing parse control rdr entry - Missing left curly at DefaultMode"); success = false; } else { success = process_control_mode(); } } else if (!strcmp(field, "WriteOnly")) { if (cur_token == G_TOKEN_INT) m_ctrl_rec->WriteOnly = (SaHpiBoolT) m_scanner->value.v_int; } else if (!strcmp(field, "Oem")) { if (cur_token == G_TOKEN_INT) m_ctrl_rec->Oem = m_scanner->value.v_int; } else { // Unknown Token err("Processing parse rdr entry: Unknown Rdr field %s", field); success = false; } break; case CONTROL_GET_TOKEN_HANDLER: cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_LEFT_CURLY) { err("Processing parse control rdr entry - Missing left curly at ControlMode"); success = false; } else { m_depth++; cur_token = g_scanner_get_next_token(m_scanner); if (cur_token == G_TOKEN_STRING) { field = g_strdup(m_scanner->value.v_string); } else { err("Processing parse control GET token - don't find field string"); return NULL; } cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (!strcmp(field, "Mode")) { if (cur_token == G_TOKEN_INT) { m_ctrl_mode = ( SaHpiCtrlModeT ) m_scanner->value.v_int; m_diff_mode = true; } } } break; default: err("Processing parse rdr entry: Unknown token"); success = false; break; } } if ( success ) { stdlog << "DBG: Parse Control successfully\n"; if (!m_diff_mode) m_ctrl_mode = m_ctrl_rec->DefaultMode.Mode; switch ( m_ctrl_rec->Type ) { case SAHPI_CTRL_TYPE_DIGITAL: if (!m_diff_state) m_ctrl_state.StateUnion.Digital = m_ctrl_rec->TypeUnion.Digital.Default; return ( new NewSimulatorControlDigital( res, m_rdr, m_ctrl_state.StateUnion.Digital, m_ctrl_mode ) ); break; case SAHPI_CTRL_TYPE_DISCRETE: if (!m_diff_state) m_ctrl_state.StateUnion.Discrete = m_ctrl_rec->TypeUnion.Discrete.Default; return ( new NewSimulatorControlDiscrete( res, m_rdr, m_ctrl_state.StateUnion.Discrete, m_ctrl_mode ) ); break; case SAHPI_CTRL_TYPE_ANALOG: if (!m_diff_state) m_ctrl_state.StateUnion.Analog = m_ctrl_rec->TypeUnion.Analog.Default; return ( new NewSimulatorControlAnalog( res, m_rdr, m_ctrl_state.StateUnion.Analog, m_ctrl_mode ) ); break; case SAHPI_CTRL_TYPE_STREAM: if (!m_diff_state) memcpy(&m_ctrl_state.StateUnion.Stream, &m_ctrl_rec->TypeUnion.Stream.Default, sizeof( SaHpiCtrlStateStreamT )); return ( new NewSimulatorControlStream( res, m_rdr, m_ctrl_state.StateUnion.Stream, m_ctrl_mode ) ); break; case SAHPI_CTRL_TYPE_TEXT: if (!m_diff_state) memcpy(&m_ctrl_state.StateUnion.Text, &m_ctrl_rec->TypeUnion.Text.Default, sizeof( SaHpiCtrlStateTextT )); return ( new NewSimulatorControlText( res, m_rdr, m_ctrl_state.StateUnion.Text, m_ctrl_mode ) ); break; case SAHPI_CTRL_TYPE_OEM: if (!m_diff_state) memcpy(&m_ctrl_state.StateUnion.Oem, &m_ctrl_rec->TypeUnion.Oem.Default, sizeof( SaHpiCtrlStateOemT )); return ( new NewSimulatorControlOem( res, m_rdr, m_ctrl_state.StateUnion.Oem, m_ctrl_mode ) ); break; default: err("Unknown Control Type"); return NULL; } } return NULL; } /** * Parse the digital control type structure * * Startpoint is the \c G_TOKEN_LEFT_CURLY. Endpoint is the last \c G_TOKEN_RIGHT_CURLY. * * @return bool value success * **/ bool NewSimulatorFileControl::process_type_digital( ) { bool success = true; int start = m_depth; char *field; guint cur_token; m_depth++; // Left Curly -- our startpoint while ( (m_depth > start) && success ) { cur_token = g_scanner_get_next_token(m_scanner); switch (cur_token) { case G_TOKEN_EOF: err("Processing parse rdr entry: File ends too early"); success = false; break; case G_TOKEN_RIGHT_CURLY: m_depth--; break; case G_TOKEN_LEFT_CURLY: m_depth++; break; case G_TOKEN_STRING: field = g_strdup(m_scanner->value.v_string); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (!strcmp(field, "Default")) { if (cur_token == G_TOKEN_INT) m_ctrl_rec->TypeUnion.Digital.Default = ( SaHpiCtrlStateDigitalT ) m_scanner->value.v_int; } else { // Unknown Token err("Processing parse rdr entry: Unknown type field %s", field); success = false; } break; case CONTROL_GET_TOKEN_HANDLER: cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (cur_token == G_TOKEN_INT) { m_ctrl_state.StateUnion.Digital = ( SaHpiCtrlStateDigitalT ) m_scanner->value.v_int; m_ctrl_state.Type = m_ctrl_rec->Type; m_diff_state = true; } break; default: err("Processing data format: Unknown token"); success = false; break; } } return success; } /** * Parse the discrete control type structure * * Startpoint is the \c G_TOKEN_LEFT_CURLY. Endpoint is the last \c G_TOKEN_RIGHT_CURLY. * * @return bool value success * **/ bool NewSimulatorFileControl::process_type_discrete( ) { bool success = true; int start = m_depth; char *field; guint cur_token; m_depth++; // Left Curly -- our startpoint while ( (m_depth > start) && success ) { cur_token = g_scanner_get_next_token(m_scanner); switch (cur_token) { case G_TOKEN_EOF: err("Processing parse rdr entry: File ends too early"); success = false; break; case G_TOKEN_RIGHT_CURLY: m_depth--; break; case G_TOKEN_LEFT_CURLY: m_depth++; break; case G_TOKEN_STRING: field = g_strdup(m_scanner->value.v_string); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (!strcmp(field, "Default")) { if (cur_token == G_TOKEN_INT) m_ctrl_rec->TypeUnion.Discrete.Default = m_scanner->value.v_int; } else { // Unknown Token err("Processing parse rdr entry: Unknown type field %s", field); success = false; } break; case CONTROL_GET_TOKEN_HANDLER: cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (cur_token == G_TOKEN_INT) { m_ctrl_state.StateUnion.Discrete = m_scanner->value.v_int; m_ctrl_state.Type = m_ctrl_rec->Type; m_diff_state = true; } break; default: err("Processing data format: Unknown token"); success = false; break; } } return success; } /** * Parse the analog control type structure * * Startpoint is the \c G_TOKEN_LEFT_CURLY. Endpoint is the last \c G_TOKEN_RIGHT_CURLY. * * @return bool value success * **/ bool NewSimulatorFileControl::process_type_analog() { bool success = true; int start = m_depth; char *field; guint cur_token; m_depth++; // Left Curly -- our startpoint while ( (m_depth > start) && success ) { cur_token = g_scanner_get_next_token(m_scanner); switch (cur_token) { case G_TOKEN_EOF: err("Processing parse rdr entry: File ends too early"); success = false; break; case G_TOKEN_RIGHT_CURLY: m_depth--; break; case G_TOKEN_LEFT_CURLY: m_depth++; break; case G_TOKEN_STRING: field = g_strdup(m_scanner->value.v_string); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (!strcmp(field, "Default")) { if (cur_token == G_TOKEN_INT) m_ctrl_rec->TypeUnion.Analog.Default = m_scanner->value.v_int; } else if (!strcmp(field, "Min")) { if (cur_token == G_TOKEN_INT) m_ctrl_rec->TypeUnion.Analog.Min = m_scanner->value.v_int; } else if (!strcmp(field, "Max")) { if (cur_token == G_TOKEN_INT) m_ctrl_rec->TypeUnion.Analog.Max = m_scanner->value.v_int; } else { // Unknown Token err("Processing parse rdr entry: Unknown type field %s", field); success = false; } break; case CONTROL_GET_TOKEN_HANDLER: cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (cur_token == G_TOKEN_INT) { m_ctrl_state.StateUnion.Analog = m_scanner->value.v_int; m_ctrl_state.Type = m_ctrl_rec->Type; m_diff_state = true; } break; default: err("Processing data format: Unknown token"); success = false; break; } } return success; } /** * Parse the control type stream structure * * Startpoint is the \c G_TOKEN_LEFT_CURLY. Endpoint is the last \c G_TOKEN_RIGHT_CURLY. * * @return bool value success * **/ bool NewSimulatorFileControl::process_type_stream() { bool success = true; int start = m_depth; char *field; guint cur_token; m_depth++; // Left Curly -- our startpoint while ( (m_depth > start) && success ) { cur_token = g_scanner_get_next_token(m_scanner); switch (cur_token) { case G_TOKEN_EOF: err("Processing parse rdr entry: File ends too early"); success = false; break; case G_TOKEN_RIGHT_CURLY: m_depth--; break; case G_TOKEN_LEFT_CURLY: m_depth++; break; case G_TOKEN_STRING: field = g_strdup(m_scanner->value.v_string); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (!strcmp(field, "Default")) { if (cur_token != G_TOKEN_LEFT_CURLY) { err("Processing parse control rdr entry - Missing left curly at DefaultMode"); success = false; } else { success = process_state_stream( &m_ctrl_rec->TypeUnion.Stream.Default ); } } else { // Unknown Token err("Processing parse rdr entry: Unknown type field %s", field); success = false; } break; case CONTROL_GET_TOKEN_HANDLER: cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_LEFT_CURLY) { err("Processing parse control rdr entry - Missing left curly at DefaultMode"); success = false; } else { success = process_state_stream( &m_ctrl_state.StateUnion.Stream ); m_ctrl_state.Type = m_ctrl_rec->Type; m_diff_state = true; } break; default: err("Processing data format: Unknown token"); success = false; break; } } return success; } /** * Parse the control state stream * * Startpoint is the \c G_TOKEN_LEFT_CURLY. Endpoint is the last \c G_TOKEN_RIGHT_CURLY. * * @param stream pointer on SaHpiCtrlStateStreamT structure to be filled * * @return bool value success * **/ bool NewSimulatorFileControl::process_state_stream( SaHpiCtrlStateStreamT *stream ) { bool success = true; int start = m_depth; char *field; guint cur_token; m_depth++; // Left Curly -- our startpoint while ( (m_depth > start) && success ) { cur_token = g_scanner_get_next_token(m_scanner); switch (cur_token) { case G_TOKEN_EOF: err("Processing parse rdr entry: File ends too early"); success = false; break; case G_TOKEN_RIGHT_CURLY: m_depth--; break; case G_TOKEN_LEFT_CURLY: m_depth++; break; case G_TOKEN_STRING: field = g_strdup(m_scanner->value.v_string); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (!strcmp(field, "Repeat")) { if (cur_token == G_TOKEN_INT) stream->Repeat = m_scanner->value.v_int; } else if (!strcmp(field, "StreamLength")) { if (cur_token == G_TOKEN_INT) stream->StreamLength = m_scanner->value.v_int; } else if (!strcmp(field, "Stream")) { if (cur_token != G_TOKEN_STRING) { err("Processing parse control stream.Stream: Wrong token type"); return false; } success = process_hexstring( SAHPI_CTRL_MAX_STREAM_LENGTH, g_strdup(m_scanner->value.v_string), &(stream->Stream[0]) ); unsigned int i; stdlog << "DBG: control: Parsing stream "; for (i = 0; i < stream->StreamLength; i++) { stdlog << stream->Stream[i] << " "; } stdlog << "\n"; } else { // Unknown Token err("Processing parse rdr entry: Unknown type field %s", field); success = false; } break; default: err("Processing data format: Unknown token"); success = false; break; } // switch } // while return success; } /** * Parse control type text structure * * Startpoint is the \c G_TOKEN_LEFT_CURLY. Endpoint is the last \c G_TOKEN_RIGHT_CURLY. * * @return bool value success * **/ bool NewSimulatorFileControl::process_type_text() { bool success = true; int start = m_depth; char *field; guint cur_token; m_depth++; // Left Curly -- our startpoint while ( (m_depth > start) && success ) { cur_token = g_scanner_get_next_token(m_scanner); switch (cur_token) { case G_TOKEN_EOF: err("Processing parse rdr entry: File ends too early"); success = false; break; case G_TOKEN_RIGHT_CURLY: m_depth--; break; case G_TOKEN_LEFT_CURLY: m_depth++; break; case G_TOKEN_STRING: field = g_strdup(m_scanner->value.v_string); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (!strcmp(field, "MaxChars")) { if (cur_token == G_TOKEN_INT) m_ctrl_rec->TypeUnion.Text.MaxChars = m_scanner->value.v_int; } else if (!strcmp(field, "MaxLines")) { if (cur_token == G_TOKEN_INT) m_ctrl_rec->TypeUnion.Text.MaxLines = m_scanner->value.v_int; } else if (!strcmp(field, "Language")) { if (cur_token == G_TOKEN_INT) m_ctrl_rec->TypeUnion.Text.Language = ( SaHpiLanguageT ) m_scanner->value.v_int; } else if (!strcmp(field, "DataType")) { if (cur_token == G_TOKEN_INT) m_ctrl_rec->TypeUnion.Text.DataType = ( SaHpiTextTypeT ) m_scanner->value.v_int; } else if (!strcmp(field, "Default")) { if (cur_token != G_TOKEN_LEFT_CURLY) { err("Processing parse control rdr entry - Missing left curly at DefaultMode"); success = false; } else { success = process_state_text( &m_ctrl_rec->TypeUnion.Text.Default ); } } else { // Unknown Token err("Processing parse rdr entry: Unknown type field %s", field); success = false; } break; case CONTROL_GET_TOKEN_HANDLER: cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_LEFT_CURLY) { err("Processing parse control rdr entry - Missing left curly at DefaultMode"); success = false; } else { success = process_state_text( &m_ctrl_state.StateUnion.Text ); m_ctrl_state.Type = m_ctrl_rec->Type; m_diff_state = true; } break; default: err("Processing data format: Unknown token"); success = false; break; } } return success; } /** * Parse the control state text * * Startpoint is the \c G_TOKEN_LEFT_CURLY. Endpoint is the last \c G_TOKEN_RIGHT_CURLY. * * @param stream pointer on SaHpiCtrlStateStreamT structure to be filled * * @return bool value success * **/ bool NewSimulatorFileControl::process_state_text( SaHpiCtrlStateTextT *text ) { bool success = true; int start = m_depth; char *field; guint cur_token; m_depth++; // Left Curly -- our startpoint while ( (m_depth > start) && success ) { cur_token = g_scanner_get_next_token(m_scanner); switch (cur_token) { case G_TOKEN_EOF: err("Processing parse rdr entry: File ends too early"); success = false; break; case G_TOKEN_RIGHT_CURLY: m_depth--; break; case G_TOKEN_LEFT_CURLY: m_depth++; break; case G_TOKEN_STRING: field = g_strdup(m_scanner->value.v_string); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (!strcmp(field, "Line")) { if (cur_token == G_TOKEN_INT) text->Line = m_scanner->value.v_int; } else if (!strcmp(field, "Text")) { if (cur_token == G_TOKEN_LEFT_CURLY) { success = process_textbuffer( text->Text ); } else { err("Processing parse control entry: Couldn't parse state text"); } } else { // Unknown Token err("Processing parse rdr entry: Unknown type field %s", field); success = false; } break; default: err("Processing data format: Unknown token"); success = false; break; } } return success; } /** * Parse control type oem structure * * Startpoint is the \c G_TOKEN_LEFT_CURLY. Endpoint is the last \c G_TOKEN_RIGHT_CURLY. * * @return bool value success * **/ bool NewSimulatorFileControl::process_type_oem() { bool success = true; int start = m_depth; char *field; guint cur_token; m_depth++; // Left Curly -- our startpoint while ( (m_depth > start) && success ) { cur_token = g_scanner_get_next_token(m_scanner); switch (cur_token) { case G_TOKEN_EOF: err("Processing parse rdr entry: File ends too early"); success = false; break; case G_TOKEN_RIGHT_CURLY: m_depth--; break; case G_TOKEN_LEFT_CURLY: m_depth++; break; case G_TOKEN_STRING: field = g_strdup(m_scanner->value.v_string); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (!strcmp(field, "MId")) { if (cur_token == G_TOKEN_INT) m_ctrl_rec->TypeUnion.Oem.MId = m_scanner->value.v_int; } else if (!strcmp(field, "ConfigData")) { if (cur_token == G_TOKEN_STRING) success = process_hexstring(SAHPI_CTRL_OEM_CONFIG_LENGTH, g_strdup(m_scanner->value.v_string), &(m_ctrl_rec->TypeUnion.Oem.ConfigData[0])); stdlog << "DBG: control - oem: Parse config data\n"; } else if (!strcmp(field, "Default")) { if (cur_token != G_TOKEN_LEFT_CURLY) { err("Processing parse control rdr entry - Missing left curly at DefaultMode"); success = false; } else { success = process_state_oem( &m_ctrl_rec->TypeUnion.Oem.Default ); } } else { // Unknown Token err("Processing parse rdr entry: Unknown type field %s", field); success = false; } break; case CONTROL_GET_TOKEN_HANDLER: cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_LEFT_CURLY) { err("Processing parse control rdr entry - Missing left curly at DefaultMode"); success = false; } else { success = process_state_oem( &m_ctrl_state.StateUnion.Oem ); m_ctrl_state.Type = m_ctrl_rec->Type; m_diff_state = true; } break; default: err("Processing data format: Unknown token"); success = false; break; } } return success; } /** * Parse the control state oem * * Startpoint is the \c G_TOKEN_LEFT_CURLY. Endpoint is the last \c G_TOKEN_RIGHT_CURLY. * * @param stream pointer on SaHpiCtrlStateStreamT structure to be filled * * @return bool value success * **/ bool NewSimulatorFileControl::process_state_oem( SaHpiCtrlStateOemT *oem ) { bool success = true; int start = m_depth; char *field; guint cur_token; m_depth++; // Left Curly -- our startpoint while ( (m_depth > start) && success ) { cur_token = g_scanner_get_next_token(m_scanner); switch (cur_token) { case G_TOKEN_EOF: err("Processing parse rdr entry: File ends too early"); success = false; break; case G_TOKEN_RIGHT_CURLY: m_depth--; break; case G_TOKEN_LEFT_CURLY: m_depth++; break; case G_TOKEN_STRING: field = g_strdup(m_scanner->value.v_string); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (!strcmp(field, "MId")) { if (cur_token == G_TOKEN_INT) oem->MId = m_scanner->value.v_int; } else if (!strcmp(field, "BodyLength")) { if (cur_token == G_TOKEN_INT) oem->BodyLength = m_scanner->value.v_int; } else if (!strcmp(field, "Body")) { if (cur_token == G_TOKEN_STRING) success = process_hexstring(oem->BodyLength, g_strdup(m_scanner->value.v_string), &(oem->Body[0])); } else { // Unknown Token err("Processing parse rdr entry: Unknown type field %s", field); success = false; } break; default: err("Processing data format: Unknown token"); success = false; break; } } return success; } /** * Parse the SaHpiCtrlDefaultModeT structure * * Startpoint is the \c G_TOKEN_LEFT_CURLY. Endpoint is the last \c G_TOKEN_RIGHT_CURLY * of DefaultMode. * * @return bool value success * **/ bool NewSimulatorFileControl::process_control_mode() { bool success = true; int start = m_depth; char *field; guint cur_token; m_depth++; // Left Curly -- our startpoint while ( (m_depth > start) && success ) { cur_token = g_scanner_get_next_token(m_scanner); switch (cur_token) { case G_TOKEN_EOF: err("Processing parse rpt entry: File ends too early"); success = false; break; case G_TOKEN_RIGHT_CURLY: m_depth--; break; case G_TOKEN_LEFT_CURLY: m_depth++; break; case G_TOKEN_STRING: field = g_strdup(m_scanner->value.v_string); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (!strcmp(field, "Mode")) { if (cur_token == G_TOKEN_INT) m_ctrl_rec->DefaultMode.Mode = ( SaHpiCtrlModeT ) m_scanner->value.v_int; } else if (!strcmp(field, "ReadOnly")) { if (cur_token == G_TOKEN_INT) m_ctrl_rec->DefaultMode.ReadOnly = m_scanner->value.v_int; } else { // Unknown Token err("Processing parse rdr entry: Unknown Rdr field %s", field); success = false; } break; default: err("Processing DefaultMode: Unknown token"); success = false; break; } } return success; } openhpi-3.6.1/plugins/dynamic_simulator/new_sim_annunciator.h0000644000175100017510000000510612575647274023617 0ustar mohanmohan/** * @file new_sim_annunciator.h * * The file includes a class for annunciator handling:\n * NewSimulatorAnnunciator * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * */ #ifndef __NEW_SIM_ANNUNCIATOR_H__ #define __NEW_SIM_ANNUNCIATOR_H__ extern "C" { #include "SaHpi.h" } #ifndef __NEW_SIM_RDR_H__ #include "new_sim_rdr.h" #endif #ifndef __NEW_SIM_ANNOUNCEMENT_H__ #include "new_sim_announcement.h" #endif class NewSimulatorDomain; /** * @class NewSimulatorAnnunciator * * Class for simulating Annunciators * **/ class NewSimulatorAnnunciator : public NewSimulatorRdr { private: /// Record with the annunciator rdr information SaHpiAnnunciatorRecT m_ann_rec; /// Mode of the annunciator SaHpiAnnunciatorModeT m_mode; /// Array including the announcements cArray m_anns; /// last max EntryId SaHpiEntryIdT m_ann_id; public: NewSimulatorAnnunciator( NewSimulatorResource *res ); NewSimulatorAnnunciator( NewSimulatorResource *res, SaHpiRdrT rdr ); virtual ~NewSimulatorAnnunciator(); /// Return annunciator Number virtual unsigned int Num() const { return m_ann_rec.AnnunciatorNum; } /// Return a new entryId SaHpiEntryIdT ValidEntryId() { return ++m_ann_id; } // Find and add Announcement NewSimulatorAnnouncement *FindAnnouncement( NewSimulatorAnnouncement *ann ); bool AddAnnouncement( NewSimulatorAnnouncement *ann ); // create an RDR sensor record virtual bool CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ); virtual void SetData( SaHpiAnnunciatorRecT ann_data ); // Official HPI functions SaErrorT GetMode( SaHpiAnnunciatorModeT &mode ); SaErrorT SetMode( SaHpiAnnunciatorModeT mode ); SaErrorT DeleteAnnouncement( SaHpiEntryIdT &num, SaHpiSeverityT &severity); SaErrorT AddAnnouncement( SaHpiAnnouncementT &ann ); SaErrorT GetAnnouncement( SaHpiEntryIdT num, SaHpiAnnouncementT &ann ); SaErrorT GetNextAnnouncement( SaHpiSeverityT severity, SaHpiBoolT uackOnly, SaHpiAnnouncementT &ann ); SaErrorT SetAcknowledge( SaHpiEntryIdT num, SaHpiSeverityT severity); virtual void Dump( NewSimulatorLog &dump ) const; }; #endif openhpi-3.6.1/plugins/dynamic_simulator/Makefile.am0000644000175100017510000001046212575647277021444 0ustar mohanmohan# # Copyright (c) 2003, Intel Corporation # All rights reserved. # # Redistribution and use in source and binary forms, with or # without modification, are permitted provided that the following # conditions are met: # # Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the distribution. # # Neither the name of Intel Corporation nor the names # of its contributors may be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, # OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # MAINTAINERCLEANFILES = Makefile.in *~ core core.* AM_CPPFLAGS = -DG_LOG_DOMAIN=\"dynsim\" AM_CPPFLAGS += @OPENHPI_INCLUDES@ pkglib_LTLIBRARIES = libdyn_simulator.la EXTRA_DIST = \ doc.html.tgz \ Doxyfile \ README libdyn_simulator_la_SOURCES= \ array.h \ new_sim.h \ new_sim.cpp \ new_sim_domain.h \ new_sim_domain.cpp \ new_sim_resource.h \ new_sim_resource.cpp \ new_sim_event_log.h \ new_sim_event_log.cpp \ new_sim_file.h \ new_sim_file.cpp \ new_sim_file_util.h \ new_sim_file_util.cpp \ new_sim_file_rdr.h \ new_sim_file_rdr.cpp \ new_sim_file_sensor.h \ new_sim_file_sensor.cpp \ new_sim_file_control.h \ new_sim_file_control.cpp \ new_sim_file_annunciator.cpp \ new_sim_file_annunciator.h \ new_sim_file_inventory.cpp \ new_sim_file_inventory.h \ new_sim_file_watchdog.cpp \ new_sim_file_watchdog.h \ new_sim_file_fumi.cpp \ new_sim_file_fumi.h \ new_sim_file_dimi.cpp \ new_sim_file_dimi.h \ new_sim_entity.h \ new_sim_entity.cpp \ new_sim_log.h \ new_sim_log.cpp \ new_sim_rdr.h \ new_sim_rdr.cpp \ new_sim_announcement.h \ new_sim_announcement.cpp \ new_sim_annunciator.h \ new_sim_annunciator.cpp \ new_sim_sensor.h \ new_sim_sensor.cpp \ new_sim_sensor_common.h \ new_sim_sensor_common.cpp \ new_sim_sensor_threshold.h \ new_sim_sensor_threshold.cpp \ new_sim_control.h \ new_sim_control.cpp \ new_sim_control_digital.h \ new_sim_control_digital.cpp \ new_sim_control_discrete.h \ new_sim_control_discrete.cpp \ new_sim_control_analog.h \ new_sim_control_analog.cpp \ new_sim_control_stream.h \ new_sim_control_stream.cpp \ new_sim_control_text.h \ new_sim_control_text.cpp \ new_sim_control_oem.h \ new_sim_control_oem.cpp \ new_sim_inventory.cpp \ new_sim_inventory.h \ new_sim_inventory_data.cpp \ new_sim_inventory_data.h \ new_sim_watchdog.cpp \ new_sim_watchdog.h \ new_sim_fumi.cpp \ new_sim_fumi.h \ new_sim_fumi_data.cpp \ new_sim_fumi_data.h \ new_sim_dimi.cpp \ new_sim_dimi.h \ new_sim_dimi_data.cpp \ new_sim_dimi_data.h \ new_sim_text_buffer.h \ new_sim_text_buffer.cpp \ new_sim_utils.h \ new_sim_utils.cpp \ new_sim_hotswap.h \ new_sim_hotswap.cpp \ new_sim_timer_thread.h \ new_sim_timer_thread.cpp \ thread.h \ thread.cpp libdyn_simulator_la_LIBADD = -lm -lstdc++ $(top_builddir)/utils/libopenhpiutils.la libdyn_simulator_la_LDFLAGS= -module -version-info @HPI_LIB_VERSION@ clean-local: rm -f *~ openhpi-3.6.1/plugins/dynamic_simulator/new_sim_hotswap.h0000644000175100017510000000532512575647274022766 0ustar mohanmohan/** * @file new_sim_hotswap.h * * The file includes a class for hotswap handling:\n * NewSimulatorHotswap * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * */ #ifndef __NEW_SIM_HOTSWAP_H__ #define __NEW_SIM_HOTSWAP_H__ #include #ifndef __NEW_SIM_UTILS_H__ #include "new_sim_utils.h" #endif #ifndef __NEW_SIM_TIMER_THREAD_H__ #include "new_sim_timer_thread.h" #endif extern "C" { #include "SaHpi.h" } class NewSimulatorResource; class NewSimulatorLog; class NewSimulatorTimerThread; /** * @class NewSimulatorHotSwap * * Provides functions for simulating the hotswap behaviour. **/ class NewSimulatorHotSwap : public NewSimulatorTimerThread { private: /// HotSwap auto-insertion value SaHpiTimeoutT m_insert_time; /// HotSwap auto-extraction value SaHpiTimeoutT m_extract_time; /// HotSwap transition start time cTime m_start; /// Flag if a state transition is running bool m_running; /// State of resource SaHpiHsStateT m_state; /// Pointer on the resource for which the object belongs to NewSimulatorResource *m_res; SaErrorT TriggerTransition( SaHpiHsStateT state ); void SendEvent( SaHpiHsStateT newState, SaHpiHsStateT prevState, SaHpiHsCauseOfStateChangeT cause, SaHpiSeverityT severity ); protected: virtual bool TriggerAction(); public: NewSimulatorHotSwap( NewSimulatorResource *res ); NewSimulatorHotSwap( NewSimulatorResource *res, SaHpiTimeoutT insertTime, SaHpiTimeoutT extractTime, SaHpiHsStateT startState ); ~NewSimulatorHotSwap(); // Dump void Dump( NewSimulatorLog &dump ) const; /// Get the HotSwap State SaHpiHsStateT GetState() { return m_state; } /// Get Extraction Timeout SaHpiTimeoutT GetExtractTimeout() { return m_extract_time; } // Start a resource SaErrorT StartResource( oh_event *e ); // Set the timeout values void SetTimeouts( SaHpiTimeoutT insert, SaHpiTimeoutT extract ); // HPI functions SaErrorT CancelPolicy(); SaErrorT SetActive(); SaErrorT SetInactive(); SaErrorT GetExtractTimeout(SaHpiTimeoutT &timeout); SaErrorT SetExtractTimeout(SaHpiTimeoutT timeout); SaErrorT GetState( SaHpiHsStateT &state ); SaErrorT ActionRequest( SaHpiHsActionT action ); }; #endif openhpi-3.6.1/plugins/dynamic_simulator/new_sim_file_rdr.h0000644000175100017510000000335612575647274023071 0ustar mohanmohan/** * @file new_sim_file_rdr.h * * The file includes an abstract class for parsing special rdr data from the simulation file:\n * NewSimulatorFileRdr * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * */ #ifndef __NEW_SIM_FILE_RDR_H__ #define __NEW_SIM_FILE_RDR_H__ #include extern "C" { #include "SaHpi.h" } #ifndef __NEW_SIM_FILE_UTIL_H__ #include "new_sim_file_util.h" #endif #ifndef __NEW_SIM_RDR_H__ #include "new_sim_rdr.h" #endif #ifndef __NEW_SIM_RESOURCE_H__ #include "new_sim_resource.h" #endif #ifndef __NEW_SIM_ENTITY_H__ #include "new_sim_entity.h" #endif /** * @class NewSimulatorFileRdr * * Provides functions for parsing the a rdr section of the simulation file. **/ class NewSimulatorFileRdr : public NewSimulatorFileUtil { protected: /// Hold the "depth" inside a file (how many parenthesis are open) int m_depth; /// Rdr structure to be filled SaHpiRdrT m_rdr; public: NewSimulatorFileRdr(GScanner *scanner); virtual ~NewSimulatorFileRdr(); /// Set Root entity path void setRoot( NewSimulatorEntityPath root ) { m_root_ep = root; } bool process_rdr_token( void ); /// abstract method in which the childs should parse the rdr type union information virtual NewSimulatorRdr * process_token( NewSimulatorResource *res ) = 0; }; #endif /*__NEW_SIM_FILE_RDR_H__*/ openhpi-3.6.1/plugins/dynamic_simulator/new_sim_fumi_data.h0000644000175100017510000000760112575647274023231 0ustar mohanmohan/** * @file new_sim_fumi_data.h * * The file includes the classes for fumi bank and component handling:\n * NewSimulatorFumiBank * NewSimulatorFumiComponent * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * */ #ifndef __NEW_SIM_FUMI_DATA_H__ #define __NEW_SIM_FUMI_DATA_H__ extern "C" { #include "SaHpi.h" } #ifndef __NEW_SIM_RDR_H__ #include "new_sim_rdr.h" #endif class NewSimulatorDomain; /** * @class NewSimulatorFumiComponent * * Class for simulating fumi components * **/ class NewSimulatorFumiComponent { private: /// Record with component target information SaHpiFumiComponentInfoT m_target_info; /// Record with component source information SaHpiFumiComponentInfoT m_source_info; /// Recourd with logical component information SaHpiFumiLogicalComponentInfoT m_logical; public: NewSimulatorFumiComponent(); virtual ~NewSimulatorFumiComponent(); /// Return componentId virtual SaHpiUint32T Num() const { return m_target_info.ComponentId; } /// Return the values of source record SaHpiFumiComponentInfoT GetSourceData() const { return m_source_info; } bool SetSourceData( SaHpiFumiComponentInfoT cinf ); /// Return the values of target record SaHpiFumiComponentInfoT GetTargetData() const { return m_target_info; } bool SetTargetData( SaHpiFumiComponentInfoT cinf ); /// Return the values of target record SaHpiFumiComponentInfoT GetData() const { return m_target_info; } bool SetData( SaHpiFumiComponentInfoT cinf ); /// Return the values of logical target record SaHpiFumiLogicalComponentInfoT GetLogicalData() const { return m_logical; } bool SetData( SaHpiFumiLogicalComponentInfoT cinf ); // methods for HPI functions virtual void Dump( NewSimulatorLog &dump ) const; }; /** * @class NewSimulatorFumiBank * * Class for simulating a fumi bank * **/ class NewSimulatorFumiBank { private: /// Record with source information SaHpiFumiSourceInfoT m_source; /// Source location SaHpiTextBufferT m_source_loc; /// Record with target information SaHpiFumiBankInfoT m_target; /// Record with logical target information SaHpiFumiLogicalBankInfoT m_logical; /// Array including source components information cArray m_comps; NewSimulatorFumiComponent *GetComponent( SaHpiUint32T id ); public: NewSimulatorFumiBank(); virtual ~NewSimulatorFumiBank(); /// Return bank id virtual SaHpiUint8T Num() const { return m_target.BankId; } bool SetId( SaHpiUint8T id ); /// Return source information SaHpiFumiSourceInfoT GetSource() const { return m_source; } bool SetData( SaHpiFumiSourceInfoT src ); /// Return target information SaHpiFumiBankInfoT GetTarget() const { return m_target; } bool SetData( SaHpiFumiBankInfoT trg ); /// Return logical target information SaHpiFumiLogicalBankInfoT GetLogical() const { return m_logical; } bool SetData( SaHpiFumiLogicalBankInfoT lgc ); bool AddSourceComponent( NewSimulatorFumiComponent *component ); bool AddTargetComponent( NewSimulatorFumiComponent *component ); bool AddLogicalTargetComponent( NewSimulatorFumiComponent *component ); // HPI functions SaErrorT SetSource( SaHpiTextBufferT &src ); SaErrorT GetSource( SaHpiFumiSourceInfoT &src ); SaErrorT GetTarget( SaHpiFumiBankInfoT &trg ); SaErrorT GetLogicalTarget( SaHpiFumiLogicalBankInfoT &trg ); virtual void Dump( NewSimulatorLog &dump ) const; }; #endif openhpi-3.6.1/plugins/dynamic_simulator/new_sim.cpp0000644000175100017510000044331612575647274021562 0ustar mohanmohan/** * @file new_sim.cpp * * The file includes the interface to the openhpi abi, an * implementation of the class NewSimulator and some HPI API * functions. * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * The new Simulator plugin is adapted from the ipmidirect plugin. * Thanks to \n * Thomas Kanngieser \n * Pierre Sangouard \n * Andy Cress * **/ #include #include #include #include "new_sim.h" #include "new_sim_utils.h" /// Definition of eventlog size #define NEWSIM_EVENTLOG_ENTRIES 256 /** * @fn static NewSimulator *VerifyNewSimulator( void *hnd ) * * Function for verification of a handler. It returns a pointer on * the equivalent NewSimulator object. * * @param hnd pointer on a oh_handler * @return pointer on a NewSimulator object **/ static NewSimulator *VerifyNewSimulator( void *hnd ) { if (!hnd) return 0; oh_handler_state *handler = (oh_handler_state *)hnd; NewSimulator *newsim = (NewSimulator *)handler->data; if ( !newsim ) { return 0; } if ( !newsim->CheckMagic() ) { return 0; } if ( !newsim->CheckHandler( handler ) ) { return 0; } return newsim; } /** * * Function for verification of handler and the sensor data in the cache. * It returns a pointer on the equivalent NewSimulatorSensor object.\n * * @param hnd pointer on a oh_handler * @param rid resource id * @param num sensor id * @param newsim pointer on the address of a newsim object * @return pointer on NewSimulatorSensor object equivalent to the input **/ static NewSimulatorSensor *VerifySensorAndEnter( void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT num, NewSimulator *&newsim ) { newsim = VerifyNewSimulator( hnd ); if ( !newsim ) return 0; newsim->IfEnter(); SaHpiRdrT *rdr = oh_get_rdr_by_type( newsim->GetHandler()->rptcache, rid, SAHPI_SENSOR_RDR, num ); if ( !rdr ) { newsim->IfLeave(); return 0; } NewSimulatorSensor *sensor = (NewSimulatorSensor *)oh_get_rdr_data( newsim->GetHandler()->rptcache, rid, rdr->RecordId ); if ( !sensor ) { newsim->IfLeave(); return 0; } if ( !newsim->VerifySensor( sensor ) ) { newsim->IfLeave(); return 0; } return sensor; } /** * Function for verification of handler and the control data in the cache. * It returns a pointer on the equivalent NewSimulatorControl object.\n * * @param hnd pointer on a oh_handler * @param rid resource id * @param num control id * @param newsim pointer on the address of a newsim object * @return pointer on NewSimulatorControl object equivalent to the input **/ static NewSimulatorControl *VerifyControlAndEnter( void *hnd, SaHpiResourceIdT rid, SaHpiCtrlNumT num, NewSimulator *&newsim ) { newsim = VerifyNewSimulator( hnd ); if ( !newsim ) return 0; newsim->IfEnter(); SaHpiRdrT *rdr = oh_get_rdr_by_type( newsim->GetHandler()->rptcache, rid, SAHPI_CTRL_RDR, num ); if ( !rdr ) { newsim->IfLeave(); return 0; } NewSimulatorControl *control = (NewSimulatorControl *)oh_get_rdr_data( newsim->GetHandler()->rptcache, rid, rdr->RecordId ); if ( !control ) { newsim->IfLeave(); return 0; } if ( !newsim->VerifyControl( control ) ) { newsim->IfLeave(); return 0; } return control; } /** * Function for verification of handler and the annunciator data in the cache. * It returns a pointer on the equivalent NewSimulatorAnnunciator object.\n * * @param hnd pointer on a oh_handler * @param rid resource id * @param num annunciator id * @param newsim pointer on the address of a newsim object * @return pointer on NewSimulatorAnnunciator object equivalent to the input **/ static NewSimulatorAnnunciator *VerifyAnnunciatorAndEnter( void *hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT num, NewSimulator *&newsim ) { newsim = VerifyNewSimulator( hnd ); if ( !newsim ) return 0; newsim->IfEnter(); SaHpiRdrT *rdr = oh_get_rdr_by_type( newsim->GetHandler()->rptcache, rid, SAHPI_ANNUNCIATOR_RDR, num ); if ( !rdr ) { newsim->IfLeave(); return 0; } NewSimulatorAnnunciator *annunciator = (NewSimulatorAnnunciator *)oh_get_rdr_data( newsim->GetHandler()->rptcache, rid, rdr->RecordId ); if ( !annunciator ) { newsim->IfLeave(); return 0; } if ( !newsim->VerifyAnnunciator( annunciator ) ) { newsim->IfLeave(); return 0; } return annunciator; } /** * Function for verification of handler and resource data in the cache. * It returns a pointer on the equivalent NewSimulatorResource object.\n * * @param hnd pointer on a oh_handler * @param rid resource id * @param newsim pointer on the address of a newsim object * @return pointer on NewSimulatorAnnunciator object equivalent to the input **/ static NewSimulatorResource *VerifyResourceAndEnter( void *hnd, SaHpiResourceIdT rid, NewSimulator *&newsim ) { newsim = VerifyNewSimulator( hnd ); if ( !newsim ) return 0; newsim->IfEnter(); NewSimulatorResource *res = (NewSimulatorResource *)oh_get_resource_data( newsim->GetHandler()->rptcache, rid ); if ( !res ) { newsim->IfLeave(); return 0; } if ( !newsim->VerifyResource( res ) ) { newsim->IfLeave(); return 0; } return res; } /** * Function for verification of handler and inventory data in the cache. * It returns a pointer on the equivalent NewSimulatorInventory object.\n * * @param hnd pointer on a oh_handler * @param rid resource id * @param idrid inventory id * @param newsim pointer on the address of a newsim object * * @return pointer on NewSimulatorInventory object equivalent to the input **/ static NewSimulatorInventory * VerifyInventoryAndEnter( void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, NewSimulator *&newsim ) { newsim = VerifyNewSimulator( hnd ); if ( !newsim ) return 0; newsim->IfEnter(); SaHpiRdrT *rdr = oh_get_rdr_by_type( newsim->GetHandler()->rptcache, rid, SAHPI_INVENTORY_RDR, idrid ); if ( !rdr ) { newsim->IfLeave(); return 0; } NewSimulatorInventory *inv = (NewSimulatorInventory *)oh_get_rdr_data( newsim->GetHandler()->rptcache, rid, rdr->RecordId ); if ( !inv ) { newsim->IfLeave(); return 0; } if ( !newsim->VerifyInventory( inv ) ) { newsim->IfLeave(); return 0; } return inv; } /** * Function for verification of handler and watchdog data in the cache. * It returns a pointer on the equivalent NewSimulatorWatchdog object.\n * * @param hnd pointer on a oh_handler * @param rid resource id * @param num watchdog number * @param newsim pointer on the address of a newsim object * * @return pointer on NewSimulatorWatchdog object equivalent to the input **/ static NewSimulatorWatchdog *VerifyWatchdogAndEnter( void *hnd, SaHpiResourceIdT rid, SaHpiWatchdogNumT num, NewSimulator *&newsim ) { newsim = VerifyNewSimulator( hnd ); if ( !newsim ) return 0; newsim->IfEnter(); SaHpiRdrT *rdr = oh_get_rdr_by_type( newsim->GetHandler()->rptcache, rid, SAHPI_WATCHDOG_RDR, num ); if ( !rdr ) { newsim->IfLeave(); return 0; } NewSimulatorWatchdog *watchdog = (NewSimulatorWatchdog *)oh_get_rdr_data( newsim->GetHandler()->rptcache, rid, rdr->RecordId ); if ( !watchdog ) { newsim->IfLeave(); return 0; } if ( !newsim->VerifyWatchdog( watchdog ) ) { newsim->IfLeave(); return 0; } return watchdog; } /** * Function for verification of handler and fumi data in the cache. * It returns a pointer on the equivalent NewSimulatorFumi object.\n * * @param hnd pointer on a oh_handler * @param rid resource id * @param num fumi number * @param newsim pointer on the address of a newsim object * * @return pointer on NewSimulatorFumi object equivalent to the input **/ static NewSimulatorFumi *VerifyFumiAndEnter( void *hnd, SaHpiResourceIdT rid, SaHpiFumiNumT num, NewSimulator *&newsim ) { newsim = VerifyNewSimulator( hnd ); if ( !newsim ) return 0; newsim->IfEnter(); SaHpiRdrT *rdr = oh_get_rdr_by_type( newsim->GetHandler()->rptcache, rid, SAHPI_FUMI_RDR, num ); if ( !rdr ) { newsim->IfLeave(); return 0; } NewSimulatorFumi *fumi = (NewSimulatorFumi *)oh_get_rdr_data( newsim->GetHandler()->rptcache, rid, rdr->RecordId ); if ( !fumi ) { newsim->IfLeave(); return 0; } if ( !newsim->VerifyFumi( fumi ) ) { newsim->IfLeave(); return 0; } return fumi; } /** * Function for verification of handler and dimi data in the cache. * It returns a pointer on the equivalent NewSimulatorDimi object.\n * * @param hnd pointer on a oh_handler * @param rid resource id * @param num dimi number * @param newsim pointer on the address of a newsim object * * @return pointer on NewSimulatorDimi object equivalent to the input **/ static NewSimulatorDimi *VerifyDimiAndEnter( void *hnd, SaHpiResourceIdT rid, SaHpiDimiNumT num, NewSimulator *&newsim ) { newsim = VerifyNewSimulator( hnd ); if ( !newsim ) return 0; newsim->IfEnter(); SaHpiRdrT *rdr = oh_get_rdr_by_type( newsim->GetHandler()->rptcache, rid, SAHPI_DIMI_RDR, num ); if ( !rdr ) { newsim->IfLeave(); return 0; } NewSimulatorDimi *dimi = (NewSimulatorDimi *)oh_get_rdr_data( newsim->GetHandler()->rptcache, rid, rdr->RecordId ); if ( !dimi ) { newsim->IfLeave(); return 0; } if ( !newsim->VerifyDimi( dimi ) ) { newsim->IfLeave(); return 0; } return dimi; } /******************************************************* * * * @name New Plugin interface * Implementation of the alias definitions. Inside the functions the corresponding object methods * are called. * */ //@{ // new plugin_loader extern "C" { /** * Alias for @ref öh_open(), implemented by @ref NewSimulatorOpen(). **/ static void * NewSimulatorOpen( GHashTable *, unsigned int, oh_evt_queue * ) __attribute__((used)); /** * @fn NewSimulatorOpen( GHashTable *handler_config, unsigned int hid, * oh_evt_queue *eventq ) * * First function which is called at start of the plugin. It opens the * logfiles, allocates and initializes the handler and a NewSim object.\n * For reading the configuration data the method NewSimulator::IfOpen is called. * * @param handler_config pointer on the oh hash table with the configuration data * @param hid id of the handler * @param eventq pointer on a eventqueue * * @return pointer on handler if everything works successfully. **/ static void * NewSimulatorOpen( GHashTable *handler_config, unsigned int hid, oh_evt_queue *eventq ) { // open log const char *logfile = 0; int max_logfiles = 10; char *tmp; int lp = dIpmiLogPropNone; dbg( "NewSimulatorOpen" ); if ( !handler_config ) { err( "No config file provided.....ooops!" ); return 0; } logfile = (char *)g_hash_table_lookup( handler_config, "logfile" ); tmp = (char *)g_hash_table_lookup( handler_config, "logfile_max" ); if ( tmp ) max_logfiles = atoi( tmp ); tmp = (char *)g_hash_table_lookup( handler_config, "logflags" ); if ( tmp ) { if ( strstr( tmp, "StdOut" ) || strstr( tmp, "stdout" ) ) lp |= dIpmiLogStdOut; if ( strstr( tmp, "StdError" ) || strstr( tmp, "stderr" ) ) lp |= dIpmiLogStdErr; if ( strstr( tmp, "File" ) || strstr( tmp, "file" ) ) { lp |= dIpmiLogLogFile; if ( logfile == 0 ) logfile = dDefaultLogfile; } } stdlog.Open( lp, logfile, max_logfiles ); stdlog.Time( true ); // create domain NewSimulator *newsim = new NewSimulator; // allocate handler oh_handler_state *handler = (oh_handler_state *)g_malloc0( sizeof( oh_handler_state ) ); if ( !handler ) { err("cannot allocate handler"); delete newsim; stdlog.Close(); return 0; } handler->data = newsim; handler->rptcache = (RPTable *)g_malloc0( sizeof( RPTable ) ); if ( !handler->rptcache ) { err("cannot allocate RPT cache"); g_free( handler ); delete newsim; stdlog.Close(); return 0; } /* initialize the event log */ handler->elcache = oh_el_create(NEWSIM_EVENTLOG_ENTRIES); if (!handler->elcache) { err("Event log creation failed"); g_free(handler->rptcache); g_free(handler); delete newsim; stdlog.Close(); return NULL; } handler->config = handler_config; handler->hid = hid; handler->eventq = eventq; newsim->SetHandler( handler ); if ( !newsim->IfOpen( handler_config ) ) { newsim->IfClose(); delete newsim; oh_flush_rpt( handler->rptcache ); g_free( handler->rptcache ); g_free( handler ); stdlog.Close(); return 0; } return handler; } /** * Alias for @ref öh_close(), implemented by @ref NewSimulatorClose(). **/ static void NewSimulatorClose( void * ) __attribute__((used)); /** * @relate NewSimulatorClose * Close the plugin and clean up the allocated memory. * * @param hnd pointer on handler **/ static void NewSimulatorClose( void *hnd ) { dbg( "NewSimulatorClose" ); NewSimulator *newsim = VerifyNewSimulator( hnd ); if ( !newsim ) { return; } /* Commenting this code block due to the multi-domain changes * in the infrastructure. * (Renier Morales 11/21/06) if ( ipmi->DomainId() != oh_get_default_domain_id() ) { stdlog << "Releasing domain id " << ipmi->DomainId() << "\n"; SaErrorT rv = oh_request_domain_delete( ipmi->HandlerId(), ipmi->DomainId() ); if ( rv != SA_OK ) stdlog << "oh_request_domain_delete error " << rv << "\n"; }*/ newsim->IfClose(); newsim->CheckLock(); delete newsim; oh_handler_state *handler = (oh_handler_state *)hnd; if ( handler->rptcache ) { oh_flush_rpt( handler->rptcache ); g_free( handler->rptcache ); } g_free( handler ); // close logfile stdlog.Close(); } /** * Interface for GetEvent. * Inside the function the method NewSimulator::IfGetEvent is called. * * @param hnd pointer on handler * * @return HPI error code **/ static SaErrorT NewSimulatorGetEvent( void * ) __attribute__((used)); static SaErrorT NewSimulatorGetEvent( void *hnd ) { dbg( "NewSimulatorGetEvent" ); NewSimulator *newsim = VerifyNewSimulator( hnd ); struct oh_event event; if ( !newsim ) { return SA_ERR_HPI_INTERNAL_ERROR; } // there is no need to get a lock because // the event queue has its own lock SaErrorT rv = newsim->IfGetEvent( &event ); return rv; } /** * Interface for DiscoverResource. * Inside the function the method NewSimulator::IfDiscoverResources is called. * * @param hnd pointer on handler * * @return HPI error code **/ static SaErrorT NewSimulatorDiscoverResources( void * ) __attribute__((used)); static SaErrorT NewSimulatorDiscoverResources( void *hnd ) { dbg( "NewSimulatorDiscoverResources" ); NewSimulator *newsim = VerifyNewSimulator( hnd ); if ( !newsim ) { return SA_ERR_HPI_INTERNAL_ERROR; } stdlog << "DBG: new_sim.cpp::NewSimulatorDiscoverResources let's go: " << hnd << "\n"; SaErrorT rv = newsim->IfDiscoverResources(); return rv; } /** * Interface for SetResourceTag. * Inside the function the method NewSimulator::IfSetResourceTag is called. * * @param hnd pointer on handler * @param id resource id * @param tag pointer on the SaHpiTextBufferT to be set in a resource * * @return HPI error code **/ static SaErrorT NewSimulatorSetResourceTag( void *, SaHpiResourceIdT, SaHpiTextBufferT * ) __attribute__((used)); static SaErrorT NewSimulatorSetResourceTag( void *hnd, SaHpiResourceIdT id, SaHpiTextBufferT *tag ) { NewSimulator *newsim = 0; NewSimulatorResource *res = VerifyResourceAndEnter( hnd, id, newsim ); if ( !res ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = newsim->IfSetResourceTag( res, tag ); newsim->IfLeave(); return rv; } /** * Interface for SetResourceSeverity. * Inside the function the method NewSimulator::IfSetResourceSeverity is called. * * @param hnd pointer on handler * @param id resource id * @param sev severity to be set in a resource * * @return HPI error code **/ static SaErrorT NewSimulatorSetResourceSeverity( void *, SaHpiResourceIdT, SaHpiSeverityT ) __attribute__((used)); static SaErrorT NewSimulatorSetResourceSeverity( void *hnd, SaHpiResourceIdT id, SaHpiSeverityT sev ) { NewSimulator *newsim = 0; NewSimulatorResource *res = VerifyResourceAndEnter( hnd, id, newsim ); if ( !res ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = newsim->IfSetResourceSeverity( res, sev ); newsim->IfLeave(); return rv; } /** * Interface for GetSensorReading. * Inside the function the method NewSimulatorSensor::GetSensorReading is called. * * @param hnd pointer on handler * @param id resource id * @param num number of sensor * @param data pointer on data structure to be filled * @param state pointer on state structure to be filled * * @return HPI error code **/ static SaErrorT NewSimulatorGetSensorReading( void *, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiSensorReadingT *data, SaHpiEventStateT *state ) __attribute__((used)); static SaErrorT NewSimulatorGetSensorReading( void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiSensorReadingT *data, SaHpiEventStateT *state ) { NewSimulator *newsim = 0; NewSimulatorSensor *sensor = VerifySensorAndEnter( hnd, id, num, newsim ); if ( !sensor ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = sensor->GetSensorReading( *data, *state ); newsim->IfLeave(); return rv; } /** * Interface for GetSensorThresholds. * Inside the function the method NewSimulatorSensorThreshold::GetThresholds is called. * * @param hnd pointer on handler * @param id resource id * @param num number of sensor * @param thres pointer on structure to be filled * * @return HPI error code **/ static SaErrorT NewSimulatorGetSensorThresholds( void *hnd, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiSensorThresholdsT * ) __attribute__((used)); static SaErrorT NewSimulatorGetSensorThresholds( void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiSensorThresholdsT *thres ) { NewSimulator *newsim; NewSimulatorSensor *sensor = VerifySensorAndEnter( hnd, id, num, newsim ); if ( !sensor ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = SA_ERR_HPI_INVALID_PARAMS; NewSimulatorSensorThreshold *t = dynamic_cast( sensor ); if ( t ) rv = t->GetThresholds( *thres ); newsim->IfLeave(); return rv; } /** * Interface for SetSensorThresholds. * Inside the function the method NewSimulatorSensorThreshold::SetThresholds is called. * * @param hnd pointer on handler * @param id resource id * @param num number of sensor * @param thres pointer on structure to be set * * @return HPI error code **/ static SaErrorT NewSimulatorSetSensorThresholds( void *, SaHpiResourceIdT, SaHpiSensorNumT, const SaHpiSensorThresholdsT * ) __attribute__((used)); static SaErrorT NewSimulatorSetSensorThresholds( void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, const SaHpiSensorThresholdsT *thres ) { NewSimulator *newsim; NewSimulatorSensor *sensor = VerifySensorAndEnter( hnd, id, num, newsim ); if ( !sensor ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = SA_ERR_HPI_INVALID_PARAMS; NewSimulatorSensorThreshold *t = dynamic_cast( sensor ); if ( t ) rv = t->SetThresholds( *thres ); newsim->IfLeave(); return rv; } /** * Interface for GetSensorEnable. * Inside the function the method NewSimulatorSensor::GetEnable is called. * * @param hnd pointer on handler * @param id resource id * @param num number of sensor * @param enable pointer on Bool to be filled * * @return HPI error code **/ static SaErrorT NewSimulatorGetSensorEnable( void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT * ) __attribute__((used)); static SaErrorT NewSimulatorGetSensorEnable( void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiBoolT *enable ) { NewSimulator *newsim; NewSimulatorSensor *sensor = VerifySensorAndEnter( hnd, id, num, newsim ); if ( !sensor ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = sensor->GetEnable( *enable ); newsim->IfLeave(); return rv; } /** * Interface for SetSensorEnable. * Inside the function the method NewSimulatorSensor::SetEnable is called. * * @param hnd pointer on handler * @param id resource id * @param num number of sensor * @param enable Bool to be set * * @return HPI error code **/ static SaErrorT NewSimulatorSetSensorEnable( void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT ) __attribute__((used)); static SaErrorT NewSimulatorSetSensorEnable( void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiBoolT enable ) { NewSimulator *newsim; NewSimulatorSensor *sensor = VerifySensorAndEnter( hnd, id, num, newsim ); if ( !sensor ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = sensor->SetEnable( enable ); newsim->IfLeave(); return rv; } /** * Interface for GetSensorEventEnables. * Inside the function the method NewSimulatorSensor::GetEventEnables is called. * * @param hnd pointer on handler * @param id resource id * @param num number of sensor * @param enables pointer on Bool to be filled * * @return HPI error code **/ static SaErrorT NewSimulatorGetSensorEventEnables( void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT * ) __attribute__((used)); static SaErrorT NewSimulatorGetSensorEventEnables( void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiBoolT *enables ) { NewSimulator *newsim; NewSimulatorSensor *sensor = VerifySensorAndEnter( hnd, id, num, newsim ); if ( !sensor ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = sensor->GetEventEnables( *enables ); newsim->IfLeave(); return rv; } /** * Interface for SetSensorEventEnables. * Inside the function the method NewSimulatorSensor::SetEventEnables is called. * * @param hnd pointer on handler * @param id resource id * @param num number of sensor * @param enables on Bool to be set * * @return HPI error code **/ static SaErrorT NewSimulatorSetSensorEventEnables( void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT ) __attribute__((used)); static SaErrorT NewSimulatorSetSensorEventEnables( void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiBoolT enables ) { NewSimulator *newsim; NewSimulatorSensor *sensor = VerifySensorAndEnter( hnd, id, num, newsim ); if ( !sensor ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = sensor->SetEventEnables( enables ); newsim->IfLeave(); return rv; } /** * Interface for GetSensorEventMasks. * Inside the function the method NewSimulatorSensor::GetEventMasks is called. * * @param hnd pointer on handler * @param id resource id * @param num number of sensor * @param AssertEventMask pointer on assertion mask to be filled * @param DeassertEventMask pointer on deassertion mask to be filled * * @return HPI error code **/ static SaErrorT NewSimulatorGetSensorEventMasks( void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiEventStateT *, SaHpiEventStateT * ) __attribute__((used)); static SaErrorT NewSimulatorGetSensorEventMasks( void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiEventStateT *AssertEventMask, SaHpiEventStateT *DeassertEventMask) { NewSimulator *newsim; NewSimulatorSensor *sensor = VerifySensorAndEnter( hnd, id, num, newsim ); if ( !sensor ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = sensor->GetEventMasks( *AssertEventMask, *DeassertEventMask ); newsim->IfLeave(); return rv; } /** * Interface for SetSensorEventMasks. * Inside the function the method NewSimulatorSensor::SetEventMasks is called. * * @param hnd pointer on handler * @param id resource id * @param num number of sensor * @param AssertEventMask assertion mask to be set * @param DeassertEventMask deassertion mask to be set * * @return HPI error code **/ static SaErrorT NewSimulatorSetSensorEventMasks( void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiSensorEventMaskActionT, SaHpiEventStateT, SaHpiEventStateT ) __attribute__((used)); static SaErrorT NewSimulatorSetSensorEventMasks( void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiSensorEventMaskActionT act, SaHpiEventStateT AssertEventMask, SaHpiEventStateT DeassertEventMask) { NewSimulator *newsim; NewSimulatorSensor *sensor = VerifySensorAndEnter( hnd, id, num, newsim ); if ( !sensor ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = sensor->SetEventMasks( act, AssertEventMask, DeassertEventMask ); newsim->IfLeave(); return rv; } /** * Interface for GetControlState. * Inside the function the method NewSimulatorControl::GetState is called. * * @param hnd pointer on handler * @param id resource id * @param num number of control * @param mode pointer on mode to be filled * @param state pointer on state to be filled * * @return HPI error code **/ static SaErrorT NewSimulatorGetControlState( void *, SaHpiResourceIdT, SaHpiCtrlNumT, SaHpiCtrlModeT *, SaHpiCtrlStateT * ) __attribute__((used)); static SaErrorT NewSimulatorGetControlState( void *hnd, SaHpiResourceIdT id, SaHpiCtrlNumT num, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state ) { NewSimulator *newsim; NewSimulatorControl *control = VerifyControlAndEnter( hnd, id, num, newsim ); if ( !control ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = control->GetState( *mode, *state ); newsim->IfLeave(); return rv; } /** * Interface for SetControlState. * Inside the function the method NewSimulatorControl::SetState is called. * * @param hnd pointer on handler * @param id resource id * @param num number of control * @param mode mode to be set * @param state pointer on state to be set * * @return HPI error code **/ static SaErrorT NewSimulatorSetControlState( void *, SaHpiResourceIdT, SaHpiCtrlNumT, SaHpiCtrlModeT, SaHpiCtrlStateT * ) __attribute__((used)); static SaErrorT NewSimulatorSetControlState( void *hnd, SaHpiResourceIdT id, SaHpiCtrlNumT num, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state ) { NewSimulator *newsim; NewSimulatorControl *control = VerifyControlAndEnter( hnd, id, num, newsim ); if ( !control ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = control->SetState( mode, *state ); newsim->IfLeave(); return rv; } /** * Interface for GetNextAnnouncement. * Inside the function the method NewSimulatorAnnunciator::GetNextAnnouncement is called. * * @param hnd pointer on handler * @param id resource id * @param num number of annunciator * @param severity severity flag * @param unAckOnly unacknowledge flag * @param ann pointer on announcement to be filled * * @return HPI error code **/ static SaErrorT NewSimulatorGetNextAnnouncement(void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiSeverityT, SaHpiBoolT, SaHpiAnnouncementT *) __attribute__((used)); static SaErrorT NewSimulatorGetNextAnnouncement(void *hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiSeverityT severity, SaHpiBoolT unAckOnly, SaHpiAnnouncementT *ann) { NewSimulator *newsim; NewSimulatorAnnunciator *annunciator = VerifyAnnunciatorAndEnter( hnd, id, num, newsim ); if ( !annunciator ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = annunciator->GetNextAnnouncement( severity, unAckOnly, *ann ); newsim->IfLeave(); return rv; } /** * Interface for GetAnnouncement. * Inside the function the method NewSimulatorAnnunciator::GetAnnouncement is called. * * @param hnd pointer on handler * @param id resource id * @param num number of annunciator * @param entryId number of announcement to be got * @param ann pointer on announcement to be filled * * @return HPI error code **/ static SaErrorT NewSimulatorGetAnnouncement(void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiEntryIdT, SaHpiAnnouncementT *) __attribute__((used)); static SaErrorT NewSimulatorGetAnnouncement(void *hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiEntryIdT entryId, SaHpiAnnouncementT *ann) { NewSimulator *newsim; NewSimulatorAnnunciator *annunciator = VerifyAnnunciatorAndEnter( hnd, id, num, newsim ); if ( !annunciator ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = annunciator->GetAnnouncement( entryId, *ann ); newsim->IfLeave(); return rv; } /** * Interface for AckAnnouncement. * Inside the function the method NewSimulatorAnnunciator::SetAcknowledge is called. * * @param hnd pointer on handler * @param id resource id * @param num number of annunciator * @param entryId number of announcement to be acknowledged * @param severity of announcements to be acknowledged * * @return HPI error code **/ static SaErrorT NewSimulatorAckAnnouncement(void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiEntryIdT, SaHpiSeverityT) __attribute__((used)); static SaErrorT NewSimulatorAckAnnouncement(void *hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiEntryIdT entryId, SaHpiSeverityT severity) { NewSimulator *newsim; NewSimulatorAnnunciator *annunciator = VerifyAnnunciatorAndEnter( hnd, id, num, newsim ); if ( !annunciator ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = annunciator->SetAcknowledge( entryId, severity ); newsim->IfLeave(); return rv; } /** * Interface for AddAnnouncement. * Inside the function the method NewSimulatorAnnunciator::AddAnnouncement is called. * * @param hnd pointer on handler * @param id resource id * @param num number of annunciator * @param ann pointer on announcement to be added * * @return HPI error code **/ static SaErrorT NewSimulatorAddAnnouncement(void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiAnnouncementT *) __attribute__((used)); static SaErrorT NewSimulatorAddAnnouncement(void *hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiAnnouncementT *ann) { NewSimulator *newsim; NewSimulatorAnnunciator *annunciator = VerifyAnnunciatorAndEnter( hnd, id, num, newsim ); if ( !annunciator ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = annunciator->AddAnnouncement( *ann ); newsim->IfLeave(); return rv; } /** * Interface for DelAnnouncement. * Inside the function the method NewSimulatorAnnunciator::DelAnnouncement is called. * * @param hnd pointer on handler * @param id resource id * @param num number of annunciator * @param entryId number of announcement to be deleted * @param severity of announcements to be deleted * * @return HPI error code **/ static SaErrorT NewSimulatorDelAnnouncement(void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiEntryIdT, SaHpiSeverityT) __attribute__((used)); static SaErrorT NewSimulatorDelAnnouncement(void *hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiEntryIdT entryId, SaHpiSeverityT severity) { NewSimulator *newsim; NewSimulatorAnnunciator *annunciator = VerifyAnnunciatorAndEnter( hnd, id, num, newsim ); if ( !annunciator ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = annunciator->DeleteAnnouncement( entryId, severity ); newsim->IfLeave(); return rv; } /** * Interface for GetAnnMode. * Inside the function the method NewSimulatorAnnunciator::GetMode is called. * * @param hnd pointer on handler * @param id resource id * @param num number of annunciator * @param mode pointer on mode to be filled * * @return HPI error code **/ static SaErrorT NewSimulatorGetAnnMode(void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiAnnunciatorModeT *) __attribute__((used)); static SaErrorT NewSimulatorGetAnnMode(void *hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiAnnunciatorModeT *mode) { NewSimulator *newsim; NewSimulatorAnnunciator *annunciator = VerifyAnnunciatorAndEnter( hnd, id, num, newsim ); if ( !annunciator ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = annunciator->GetMode( *mode ); newsim->IfLeave(); return rv; } /** * Interface for SetAnnMode. * Inside the function the method NewSimulatorAnnunciator::SetMode is called. * * @param hnd pointer on handler * @param id resource id * @param num number of annunciator * @param mode mode to be set * * @return HPI error code **/ static SaErrorT NewSimulatorSetAnnMode(void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiAnnunciatorModeT) __attribute__((used)); static SaErrorT NewSimulatorSetAnnMode(void *hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiAnnunciatorModeT mode) { NewSimulator *newsim; NewSimulatorAnnunciator *annunciator = VerifyAnnunciatorAndEnter( hnd, id, num, newsim ); if ( !annunciator ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = annunciator->SetMode( mode ); newsim->IfLeave(); return rv; } /** * Interface for GetIdrInfo * Inside the function the method NewSimulatorInventory::GetIdrInfo is called. * * @param hnd pointer on handler * @param id resource id * @param idrid number of inventory * @param idrinfo info record to be filled * * @return HPI error code **/ static SaErrorT NewSimulatorGetIdrInfo( void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrInfoT * ) __attribute__((used)); static SaErrorT NewSimulatorGetIdrInfo( void *hnd, SaHpiResourceIdT id, SaHpiIdrIdT idrid, SaHpiIdrInfoT *idrinfo ) { NewSimulator *newsim = 0; NewSimulatorInventory *inv = VerifyInventoryAndEnter( hnd, id, idrid, newsim ); if ( !inv ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = inv->GetIdrInfo( *idrinfo ); newsim->IfLeave(); return rv; } /** * Interface for GetIdrAreaHeader * Inside the function the method NewSimulatorInventory::GetAreaHeader is called. * * @param hnd pointer on handler * @param id resource id * @param idrid number of inventory * @param areatype type of area to be found * @param areaid id of area to be found * @param nextareaid id of next area * @param header header information to be filled * * @return HPI error code **/ static SaErrorT NewSimulatorGetIdrAreaHeader( void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrAreaTypeT, SaHpiEntryIdT, SaHpiEntryIdT *, SaHpiIdrAreaHeaderT * ) __attribute__((used)); static SaErrorT NewSimulatorGetIdrAreaHeader( void *hnd, SaHpiResourceIdT id, SaHpiIdrIdT idrid, SaHpiIdrAreaTypeT areatype, SaHpiEntryIdT areaid, SaHpiEntryIdT *nextareaid, SaHpiIdrAreaHeaderT *header ) { NewSimulator *newsim = 0; NewSimulatorInventory *inv = VerifyInventoryAndEnter( hnd, id, idrid, newsim ); if ( !inv ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = inv->GetAreaHeader( areatype, areaid, *nextareaid, *header ); newsim->IfLeave(); return rv; } /** * Interface for AddIdrArea * Inside the function the method NewSimulatorInventory::AddArea is called. * * @param hnd pointer on handler * @param id resource id * @param idrid number of inventory * @param areatype type of area to be added * @param areaid id of area which is added * * @return HPI error code **/ static SaErrorT NewSimulatorAddIdrArea( void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrAreaTypeT, SaHpiEntryIdT * ) __attribute__((used)); static SaErrorT NewSimulatorAddIdrArea( void *hnd, SaHpiResourceIdT id, SaHpiIdrIdT idrid, SaHpiIdrAreaTypeT areatype, SaHpiEntryIdT *areaid ) { NewSimulator *newsim = 0; NewSimulatorInventory *inv = VerifyInventoryAndEnter( hnd, id, idrid, newsim ); if ( !inv ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = inv->AddArea( areatype, *areaid ); newsim->IfLeave(); return rv; } /** * Interface for AddIdrAreaById * Inside the function the method NewSimulatorInventory::AddAreaById is called. * * @param hnd pointer on handler * @param id resource id * @param idrid number of inventory * @param areatype type of area to be added * @param areaid id of area to use * * @return HPI error code **/ static SaErrorT NewSimulatorAddIdrAreaById( void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrAreaTypeT, SaHpiEntryIdT ) __attribute__((used)); static SaErrorT NewSimulatorAddIdrAreaById( void *hnd, SaHpiResourceIdT id, SaHpiIdrIdT idrid, SaHpiIdrAreaTypeT areatype, SaHpiEntryIdT areaid ) { NewSimulator *newsim = 0; NewSimulatorInventory *inv = VerifyInventoryAndEnter( hnd, id, idrid, newsim ); if ( !inv ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = inv->AddAreaById( areatype, areaid ); newsim->IfLeave(); return rv; } /** * Interface for DelIdrArea * Inside the function the method NewSimulatorInventory::DeleteArea is called. * * @param hnd pointer on handler * @param id resource id * @param idrid number of inventory * @param areaid id of area to be deleted * * @return HPI error code **/ static SaErrorT NewSimulatorDelIdrArea( void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT ) __attribute__((used)); static SaErrorT NewSimulatorDelIdrArea( void *hnd, SaHpiResourceIdT id, SaHpiIdrIdT idrid, SaHpiEntryIdT areaid ) { NewSimulator *newsim = 0; NewSimulatorInventory *inv = VerifyInventoryAndEnter( hnd, id, idrid, newsim ); if ( !inv ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = inv->DeleteArea( areaid ); newsim->IfLeave(); return rv; } /** * Interface for GetIdrField * Inside the function the method NewSimulatorInventory::GetField is called. * * @param hnd pointer on handler * @param id resource id * @param idrid number of inventory * @param areaid id of area * @param fieldtype type of the field * @param fieldid id of the field * @param nextfieldid id of next field * @param field pointer on field record to be filled * * @return HPI error code **/ static SaErrorT NewSimulatorGetIdrField( void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT, SaHpiIdrFieldTypeT, SaHpiEntryIdT, SaHpiEntryIdT *, SaHpiIdrFieldT * ) __attribute__((used)); static SaErrorT NewSimulatorGetIdrField( void *hnd, SaHpiResourceIdT id, SaHpiIdrIdT idrid, SaHpiEntryIdT areaid, SaHpiIdrFieldTypeT fieldtype, SaHpiEntryIdT fieldid, SaHpiEntryIdT *nextfieldid, SaHpiIdrFieldT *field ) { NewSimulator *newsim = 0; NewSimulatorInventory *inv = VerifyInventoryAndEnter( hnd, id, idrid, newsim ); if ( !inv ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = inv->GetField( areaid, fieldtype, fieldid, *nextfieldid, *field ); newsim->IfLeave(); return rv; } /** * Interface for AddIdrField * Inside the function the method NewSimulatorInventory::AddField is called. * * @param hnd pointer on handler * @param id resource id * @param idrid number of inventory * @param field pointer on field record to add * * @return HPI error code **/ static SaErrorT NewSimulatorAddIdrField( void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrFieldT * ) __attribute__((used)); static SaErrorT NewSimulatorAddIdrField( void *hnd, SaHpiResourceIdT id, SaHpiIdrIdT idrid, SaHpiIdrFieldT *field ) { NewSimulator *newsim = 0; NewSimulatorInventory *inv = VerifyInventoryAndEnter( hnd, id, idrid, newsim ); if ( !inv ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = inv->AddField( *field ); newsim->IfLeave(); return rv; } /** * Interface for AddIdrFieldById * Inside the function the method NewSimulatorInventory::AddFieldById is called. * * @param hnd pointer on handler * @param id resource id * @param idrid number of inventory * @param field pointer on field record to add * * @return HPI error code **/ static SaErrorT NewSimulatorAddIdrFieldById( void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrFieldT * ) __attribute__((used)); static SaErrorT NewSimulatorAddIdrFieldById( void *hnd, SaHpiResourceIdT id, SaHpiIdrIdT idrid, SaHpiIdrFieldT *field ) { NewSimulator *newsim = 0; NewSimulatorInventory *inv = VerifyInventoryAndEnter( hnd, id, idrid, newsim ); if ( !inv ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = inv->AddFieldById( *field ); newsim->IfLeave(); return rv; } /** * Interface for SetIdrField * Inside the function the method NewSimulatorInventory::SetField is called. * * @param hnd pointer on handler * @param id resource id * @param idrid number of inventory * @param field pointer on field record to be set * * @return HPI error code **/ static SaErrorT NewSimulatorSetIdrField( void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrFieldT * ) __attribute__((used)); static SaErrorT NewSimulatorSetIdrField( void *hnd, SaHpiResourceIdT id, SaHpiIdrIdT idrid, SaHpiIdrFieldT *field ) { NewSimulator *newsim = 0; NewSimulatorInventory *inv = VerifyInventoryAndEnter( hnd, id, idrid, newsim ); if ( !inv ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = inv->SetField( *field ); newsim->IfLeave(); return rv; } /** * Interface for DelIdrField * Inside the function the method NewSimulatorInventory::DeleteField is called. * * @param hnd pointer on handler * @param id resource id * @param idrid number of inventory * @param areaid id of area * @param fieldid id of field to be deleted * * @return HPI error code **/ static SaErrorT NewSimulatorDelIdrField( void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT, SaHpiEntryIdT ) __attribute__((used)); static SaErrorT NewSimulatorDelIdrField( void *hnd, SaHpiResourceIdT id, SaHpiIdrIdT idrid, SaHpiEntryIdT areaid, SaHpiEntryIdT fieldid ) { NewSimulator *newsim = 0; NewSimulatorInventory *inv = VerifyInventoryAndEnter( hnd, id, idrid, newsim ); if ( !inv ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = inv->DeleteField( areaid, fieldid ); newsim->IfLeave(); return rv; } /** * Interface for GetSelInfo * Inside the function the method NewSimulatorEventLog::IfELGetInfo is called. * * @param hnd pointer on handler * @param id resource id * @param info pointer on event log structure to be filled * * @return HPI error code **/ static SaErrorT NewSimulatorGetSelInfo( void *, SaHpiResourceIdT, SaHpiEventLogInfoT * ) __attribute__((used)); static SaErrorT NewSimulatorGetSelInfo( void *hnd, SaHpiResourceIdT id, SaHpiEventLogInfoT *info ) { SaErrorT rv = SA_ERR_HPI_INTERNAL_ERROR; NewSimulator *newsim = VerifyNewSimulator( hnd ); if ( !newsim ) { return SA_ERR_HPI_INTERNAL_ERROR; } rv = newsim->IfELGetInfo((struct oh_handler_state *)hnd, info); newsim->IfLeave(); return rv; } /** * Interface for SetSelTime * Inside the function the method NewSimulatorEventLog::IfELSetTime is called. * * @param hnd pointer on handler * @param id resource id * @param t time to be set * * @return HPI error code **/ static SaErrorT NewSimulatorSetSelTime( void *, SaHpiResourceIdT, SaHpiTimeT ) __attribute__((used)); static SaErrorT NewSimulatorSetSelTime( void *hnd, SaHpiResourceIdT id, SaHpiTimeT t ) { SaErrorT rv = SA_ERR_HPI_INTERNAL_ERROR; NewSimulator *newsim = VerifyNewSimulator( hnd ); if ( !newsim ) { return SA_ERR_HPI_INTERNAL_ERROR; } rv = newsim->IfELSetTime((struct oh_handler_state *)hnd, t); newsim->IfLeave(); return rv; } /** * Interface for AddSelEntry * Inside the function the method NewSimulatorEventLog::IfELAddEntry is called. * A resource event log isn't supported at the moment. * * @param hnd pointer on handler * @param id resource id * @param Event pointer on event to be added * * @return HPI error code **/ static SaErrorT NewSimulatorAddSelEntry( void *, SaHpiResourceIdT, const SaHpiEventT * ) __attribute__((used)); static SaErrorT NewSimulatorAddSelEntry( void *hnd, SaHpiResourceIdT id, const SaHpiEventT *Event ) { SaErrorT rv = SA_ERR_HPI_INTERNAL_ERROR; NewSimulator *newsim = VerifyNewSimulator( hnd ); if ( !newsim ) { return SA_ERR_HPI_INTERNAL_ERROR; } rv = newsim->IfELAddEntry((struct oh_handler_state *)hnd, Event); newsim->IfLeave(); return rv; } /** * Interface for GetSelEntry * Inside the function the method NewSimulatorEventLog::IfELGetEntry is called. * * @param hnd pointer on handler * @param id resource id * @param current Identifier of event log entry to retrieve * @param prev Event Log entry identifier for the previous entry * @param next Event Log entry identifier for the next entry * @param entry Pointer to retrieved Event Log entry * @param rdr Pointer to structure to receive resource data record * @param rptentry Pointer to structure to receive RPT entry * * @return HPI error code **/ static SaErrorT NewSimulatorGetSelEntry( void *hnd, SaHpiResourceIdT, SaHpiEventLogEntryIdT, SaHpiEventLogEntryIdT *, SaHpiEventLogEntryIdT *, SaHpiEventLogEntryT *, SaHpiRdrT *, SaHpiRptEntryT * ) __attribute__((used)); static SaErrorT NewSimulatorGetSelEntry( void *hnd, SaHpiResourceIdT id, SaHpiEventLogEntryIdT current, SaHpiEventLogEntryIdT *prev, SaHpiEventLogEntryIdT *next, SaHpiEventLogEntryT *entry, SaHpiRdrT *rdr, SaHpiRptEntryT *rptentry ) { SaErrorT rv = SA_ERR_HPI_INTERNAL_ERROR; NewSimulator *newsim = VerifyNewSimulator( hnd ); if ( !newsim ) { return SA_ERR_HPI_INTERNAL_ERROR; } rv = newsim->IfELGetEntry((struct oh_handler_state *)hnd, current, prev, next, entry, rdr, rptentry); newsim->IfLeave(); return rv; } /** * Interface for ClearSel * Inside the function the method NewSimulatorEventLog::IfELClear is called. * * @param hnd pointer on handler * @param id resource id * * @return HPI error code **/ static SaErrorT NewSimulatorClearSel( void *, SaHpiResourceIdT ) __attribute__((used)); static SaErrorT NewSimulatorClearSel( void *hnd, SaHpiResourceIdT id ) { SaErrorT rv = SA_ERR_HPI_INTERNAL_ERROR; NewSimulator *newsim = VerifyNewSimulator( hnd ); if ( !newsim ) { return SA_ERR_HPI_INTERNAL_ERROR; } rv = newsim->IfELClear((struct oh_handler_state *)hnd); newsim->IfLeave(); return rv; } /** * Interface for SetSelState * Inside the function the method NewSimulatorEventLog::IfELSetState is called. * A resource event log isn't supported at the moment. * * @param hnd pointer on handler * @param id resource id * @param state Event Log state to be set * * @return HPI error code **/ static SaErrorT NewSimulatorSetSelState(void *, SaHpiResourceIdT, SaHpiBoolT) __attribute__((used)); static SaErrorT NewSimulatorSetSelState( void *hnd, SaHpiResourceIdT id, SaHpiBoolT state ) { SaErrorT rv = SA_ERR_HPI_INTERNAL_ERROR; NewSimulator *newsim = VerifyNewSimulator( hnd ); if ( !newsim ) { return SA_ERR_HPI_INTERNAL_ERROR; } rv = newsim->IfELSetState((struct oh_handler_state *)hnd, state); newsim->IfLeave(); return rv; } /** * Interface for GetSelState * Inside the function the method NewSimulatorEventLog::IfELGetState is called. * A resource event log isn't supported at the moment. * * @param hnd pointer on handler * @param id resource id * @param state pointer to the current event log enable state * * @return HPI error code **/ static SaErrorT NewSimulatorGetSelState(void *, SaHpiResourceIdT, SaHpiBoolT *) __attribute__((used)); static SaErrorT NewSimulatorGetSelState( void *hnd, SaHpiResourceIdT id, SaHpiBoolT *state ) { SaErrorT rv = SA_ERR_HPI_INTERNAL_ERROR; NewSimulator *newsim = VerifyNewSimulator( hnd ); if ( !newsim ) { return SA_ERR_HPI_INTERNAL_ERROR; } rv = newsim->IfELGetState((struct oh_handler_state *)hnd, state); newsim->IfLeave(); return rv; } /** * Interface for GetSelCapability * Inside the function the method NewSimulatorEventLog::IfELGetCaps is called. * A resource event log isn't supported at the moment. * * @param hnd pointer on handler * @param id resource id * @param caps pointer to the current event log enable state * * @return HPI error code **/ static SaErrorT NewSimulatorGetSelCapability(void *, SaHpiResourceIdT, SaHpiEventLogCapabilitiesT *) __attribute__((used)); static SaErrorT NewSimulatorGetSelCapability( void *hnd, SaHpiResourceIdT id, SaHpiEventLogCapabilitiesT *caps ) { SaErrorT rv = SA_ERR_HPI_INTERNAL_ERROR; NewSimulator *newsim = VerifyNewSimulator( hnd ); if ( !newsim ) { return SA_ERR_HPI_INTERNAL_ERROR; } rv = newsim->IfELGetCaps((struct oh_handler_state *)hnd, caps); newsim->IfLeave(); return rv; } /** * Interface for ResetSelOverflow * Inside the function the method NewSimulatorEventLog::IfELOverflow is called. * A resource event log isn't supported at the moment. * * @param hnd pointer on handler * @param id resource id * * @return HPI error code **/ static SaErrorT NewSimulatorResetSelOverflow(void *, SaHpiResourceIdT) __attribute__((used)); static SaErrorT NewSimulatorResetSelOverflow( void *hnd, SaHpiResourceIdT id ) { SaErrorT rv = SA_ERR_HPI_INTERNAL_ERROR; NewSimulator *newsim = VerifyNewSimulator( hnd ); if ( !newsim ) { return SA_ERR_HPI_INTERNAL_ERROR; } rv = newsim->IfELOverflow((struct oh_handler_state *)hnd); newsim->IfLeave(); return rv; } /** * Interface for HotswapPolicyCancel. * Inside the function the method NewSimulatorResource::HotswapPolicyCancel() * is called. * * @param hnd pointer on handler * @param id resource id * @param state Pointer on state variable to be filled * * @return HPI error code **/ static SaErrorT NewSimulatorHotswapPolicyCancel( void *, SaHpiResourceIdT, SaHpiTimeoutT ) __attribute__((used)); static SaErrorT NewSimulatorHotswapPolicyCancel( void *hnd, SaHpiResourceIdT id, SaHpiTimeoutT timeout) { NewSimulator *newsim = 0; NewSimulatorResource *res = VerifyResourceAndEnter( hnd, id, newsim ); if ( !res ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = res->HotswapPolicyCancel(); newsim->IfLeave(); return rv; } /** * Interface for GetHotswapState. * Inside the function the method NewSimulatorResource::GetHotswapState() * is called. * * @param hnd pointer on handler * @param id resource id * @param state Pointer on state variable to be filled * * @return HPI error code **/ static SaErrorT NewSimulatorGetHotswapState( void *, SaHpiResourceIdT , SaHpiHsStateT * ) __attribute__((used)); static SaErrorT NewSimulatorGetHotswapState( void *hnd, SaHpiResourceIdT id, SaHpiHsStateT *state ) { NewSimulator *newsim = 0; NewSimulatorResource *res = VerifyResourceAndEnter( hnd, id, newsim ); if ( !res ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = res->GetHotswapState( *state ); newsim->IfLeave(); return rv; } /** * Interface for SetHotswapState. * Inside the function the method in dependency of the given state * NewSimulatorResource::SetStateActive() or NewSimulatorResource::SetStateInactive() * is called. * * @param hnd pointer on handler * @param id resource id * @param state HotSwap state to be set * * @return HPI error code **/ static SaErrorT NewSimulatorSetHotswapState( void *, SaHpiResourceIdT, SaHpiHsStateT ) __attribute__((used)); static SaErrorT NewSimulatorSetHotswapState( void *hnd, SaHpiResourceIdT id, SaHpiHsStateT state ) { SaErrorT rv = SA_OK; NewSimulator *newsim = 0; NewSimulatorResource *res = VerifyResourceAndEnter( hnd, id, newsim ); if ( !res ) return SA_ERR_HPI_NOT_PRESENT; rv = SA_ERR_HPI_INTERNAL_ERROR; if ( state == SAHPI_HS_STATE_ACTIVE ) { rv = res->SetStateActive(); } else if ( state == SAHPI_HS_STATE_INACTIVE ) { rv = res->SetStateInactive(); } if ( rv == SA_ERR_HPI_INTERNAL_ERROR ) err( "It looks like the plugin got an invalid state for SetHotswapState."); newsim->IfLeave(); return rv; } /** * Interface for RequestHotswapAction. * Inside the function the method NewSimulatorResource::RequestHotswapAction() * is called. * * @param hnd pointer on handler * @param id resource id * @param act action requested * * @return HPI error code **/ static SaErrorT NewSimulatorRequestHotswapAction( void *, SaHpiResourceIdT, SaHpiHsActionT ) __attribute__((used)); static SaErrorT NewSimulatorRequestHotswapAction( void *hnd, SaHpiResourceIdT id, SaHpiHsActionT act ) { NewSimulator *newsim = 0; NewSimulatorResource *res = VerifyResourceAndEnter( hnd, id, newsim ); if ( !res ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = res->RequestHotswapAction( act ); newsim->IfLeave(); return rv; } /** * Interface for GetWatchdogInfo. * Inside the function the method NewSimulatorWatchdog::GetWatchdogInfo * is called. * * @param hnd pointer on handler * @param id resource id * @param num number of watchdog * @param watchdog watchdog information record to be filled * * @return HPI error code **/ static SaErrorT NewSimulatorGetWatchdogInfo(void *, SaHpiResourceIdT, SaHpiWatchdogNumT, SaHpiWatchdogT *) __attribute__((used)); static SaErrorT NewSimulatorGetWatchdogInfo(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num, SaHpiWatchdogT *watchdog) { NewSimulator *newsim = 0; NewSimulatorWatchdog *wd = VerifyWatchdogAndEnter( hnd, id, num, newsim ); if ( !wd ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = wd->GetWatchdogInfo( *watchdog ); newsim->IfLeave(); return rv; } /** * Interface for SetWatchdogInfo. * Inside the function the method NewSimulatorWatchdog::SetWatchdogInfo * is called. * * @param hnd pointer on handler * @param id resource id * @param num number of watchdog * @param watchdog record with the information which should be set * * @return HPI error code **/ static SaErrorT NewSimulatorSetWatchdogInfo(void *, SaHpiResourceIdT, SaHpiWatchdogNumT, SaHpiWatchdogT *) __attribute__((used)); static SaErrorT NewSimulatorSetWatchdogInfo(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num, SaHpiWatchdogT *watchdog) { NewSimulator *newsim = 0; NewSimulatorWatchdog *wd = VerifyWatchdogAndEnter( hnd, id, num, newsim ); if ( !wd ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = wd->SetWatchdogInfo( *watchdog ); newsim->IfLeave(); return rv; } /** * Interface for ResetWatchdog. * Inside the function the method NewSimulatorWatchdog::ResetWatchdog * is called. * * @param hnd pointer on handler * @param id resource id * @param num number of watchdog * * @return HPI error code **/ static SaErrorT NewSimulatorResetWatchdog(void *, SaHpiResourceIdT, SaHpiWatchdogNumT) __attribute__((used)); static SaErrorT NewSimulatorResetWatchdog(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num) { NewSimulator *newsim = 0; NewSimulatorWatchdog *wd = VerifyWatchdogAndEnter( hnd, id, num, newsim ); if ( !wd ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = wd->ResetWatchdog(); newsim->IfLeave(); return rv; } /** * Interface for FumiSpecInfoGet. * Inside the function the method NewSimulatorFumi::GetSpecInfo * is called. * * @param hnd pointer on handler * @param id resource id * @param num number of fumi * @param spec pointer to the location to store spec information * * @return HPI error code **/ static SaErrorT NewSimulatorGetFumiSpec(void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiFumiSpecInfoT *) __attribute__((used)); static SaErrorT NewSimulatorGetFumiSpec(void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiFumiSpecInfoT *spec) { NewSimulator *newsim = 0; NewSimulatorFumi *fumi = VerifyFumiAndEnter( hnd, id, num, newsim ); if ( !fumi ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = fumi->GetSpecInfo( *spec ); newsim->IfLeave(); return rv; } /** * Interface for FumiServiceImpactGet. * Inside the function the method NewSimulatorFumi::GetImpact * is called. * * @param hnd pointer on handler * @param id resource id * @param num number of fumi * @param impact pointer to the location to store service impact information * * @return HPI error code **/ static SaErrorT NewSimulatorGetFumiServImpact(void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiFumiServiceImpactDataT *) __attribute__((used)); static SaErrorT NewSimulatorGetFumiServImpact(void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiFumiServiceImpactDataT *impact) { NewSimulator *newsim = 0; NewSimulatorFumi *fumi = VerifyFumiAndEnter( hnd, id, num, newsim ); if ( !fumi ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = fumi->GetImpact( *impact ); newsim->IfLeave(); return rv; } /** * Interface for FumiSourceSet. * Inside the function the method NewSimulatorFumi::SetSource * is called. * * @param hnd pointer on handler * @param id resource id * @param num fumi number * @param bank bank number * @param src Text buffer containing URI of the source * * @return HPI error code **/ static SaErrorT NewSimulatorSetFumiSource(void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiBankNumT, SaHpiTextBufferT *) __attribute__((used)); static SaErrorT NewSimulatorSetFumiSource(void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT bank, SaHpiTextBufferT *src) { NewSimulator *newsim = 0; NewSimulatorFumi *fumi = VerifyFumiAndEnter( hnd, id, num, newsim ); if ( !fumi ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = fumi->SetSource( bank, *src ); newsim->IfLeave(); return rv; } /** * Interface for FumiSourceInfoValidateStart. * Inside the function the method NewSimulatorFumi::ValidateSource * is called. * * @param hnd pointer on handler * @param id resource id * @param num fumi number * @param bank bank number * * @return HPI error code **/ static SaErrorT NewSimulatorValidateFumiSource(void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiBankNumT) __attribute__((used)); static SaErrorT NewSimulatorValidateFumiSource(void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT bank) { NewSimulator *newsim = 0; NewSimulatorFumi *fumi = VerifyFumiAndEnter( hnd, id, num, newsim ); if ( !fumi ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = fumi->ValidateSource( bank ); newsim->IfLeave(); return rv; } /** * Interface for FumiSourceInfoGet. * Inside the function the method NewSimulatorFumi::GetSource * is called. * * @param hnd pointer on handler * @param id resource id * @param num fumi number * @param bank bank number * @param src pointer to the location to store source information * * @return HPI error code **/ static SaErrorT NewSimulatorGetFumiSource(void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiBankNumT, SaHpiFumiSourceInfoT *) __attribute__((used)); static SaErrorT NewSimulatorGetFumiSource(void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT bank, SaHpiFumiSourceInfoT *src) { NewSimulator *newsim = 0; NewSimulatorFumi *fumi = VerifyFumiAndEnter( hnd, id, num, newsim ); if ( !fumi ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = fumi->GetSource( bank, *src ); newsim->IfLeave(); return rv; } /** * Interface for FumiSourceComponentInfoGet. * Inside the function the method NewSimulatorFumi::GetComponentSource * is called. * * @param hnd pointer on handler * @param id resource id * @param num fumi number * @param bank bank number * @param comp identifier of the component * @param next pointer to store the next component identifier * @param inf pointer to the location to store component information * * @return HPI error code **/ static SaErrorT NewSimulatorGetFumiSourceComponent(void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiBankNumT, SaHpiEntryIdT, SaHpiEntryIdT *, SaHpiFumiComponentInfoT *) __attribute__((used)); static SaErrorT NewSimulatorGetFumiSourceComponent(void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT bank, SaHpiEntryIdT comp, SaHpiEntryIdT *next, SaHpiFumiComponentInfoT *inf) { NewSimulator *newsim = 0; NewSimulatorFumi *fumi = VerifyFumiAndEnter( hnd, id, num, newsim ); if ( !fumi ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = fumi->GetComponentSource( bank, comp, *next, *inf ); newsim->IfLeave(); return rv; } /** * Interface for FumiTargetInfoGet. * Inside the function the method NewSimulatorFumi::GetTarget * is called. * * @param hnd pointer on handler * @param id resource id * @param num fumi number * @param bank bank number * @param trg pointer to the location to store target information * * @return HPI error code **/ static SaErrorT NewSimulatorGetFumiTarget(void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiBankNumT, SaHpiFumiBankInfoT *) __attribute__((used)); static SaErrorT NewSimulatorGetFumiTarget(void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT bank, SaHpiFumiBankInfoT *trg) { NewSimulator *newsim = 0; NewSimulatorFumi *fumi = VerifyFumiAndEnter( hnd, id, num, newsim ); if ( !fumi ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = fumi->GetTarget( bank, *trg ); newsim->IfLeave(); return rv; } /** * Interface for FumiTargetComponentInfoGet. * Inside the function the method NewSimulatorFumi::GetComponentTarget * is called. * * @param hnd pointer on handler * @param id resource id * @param num fumi number * @param bank bank number * @param comp identifier of the component * @param next pointer to store the next component identifier * @param inf pointer to the location to store component information * * @return HPI error code **/ static SaErrorT NewSimulatorGetFumiTargetComponent(void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiBankNumT, SaHpiEntryIdT, SaHpiEntryIdT *, SaHpiFumiComponentInfoT *) __attribute__((used)); static SaErrorT NewSimulatorGetFumiTargetComponent(void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT bank, SaHpiEntryIdT comp, SaHpiEntryIdT *next, SaHpiFumiComponentInfoT *inf) { NewSimulator *newsim = 0; NewSimulatorFumi *fumi = VerifyFumiAndEnter( hnd, id, num, newsim ); if ( !fumi ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = fumi->GetComponentTarget( bank, comp, *next, *inf ); newsim->IfLeave(); return rv; } /** * Interface for FumiLogicalTargetInfoGet. * Inside the function the method NewSimulatorFumi::GetTargetLogical * is called. * * @param hnd pointer on handler * @param id resource id * @param num fumi number * @param trg pointer to the location to store target information * * @return HPI error code **/ static SaErrorT NewSimulatorGetFumiLogicalTarget(void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiFumiLogicalBankInfoT *) __attribute__((used)); static SaErrorT NewSimulatorGetFumiLogicalTarget(void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiFumiLogicalBankInfoT *trg) { NewSimulator *newsim = 0; NewSimulatorFumi *fumi = VerifyFumiAndEnter( hnd, id, num, newsim ); if ( !fumi ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = fumi->GetTargetLogical( *trg ); newsim->IfLeave(); return rv; } /** * Interface for FumiLogicalTargetComponentInfoGet. * Inside the function the method NewSimulatorFumi::GetComponentTargetLogical * is called. * * @param hnd pointer on handler * @param id resource id * @param num fumi number * @param comp identifier of the component * @param next pointer to store the next component identifier * @param inf pointer to the location to store logical component information * * @return HPI error code **/ static SaErrorT NewSimulatorGetFumiLogicalTargetComponent(void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiEntryIdT, SaHpiEntryIdT *, SaHpiFumiLogicalComponentInfoT *) __attribute__((used)); static SaErrorT NewSimulatorGetFumiLogicalTargetComponent(void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiEntryIdT comp, SaHpiEntryIdT *next, SaHpiFumiLogicalComponentInfoT *inf) { NewSimulator *newsim = 0; NewSimulatorFumi *fumi = VerifyFumiAndEnter( hnd, id, num, newsim ); if ( !fumi ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = fumi->GetComponentTargetLogical( comp, *next, *inf ); newsim->IfLeave(); return rv; } /** * Interface for FumiBackupStart. * Inside the function the method NewSimulatorFumi::StartBackup * is called. * * @param hnd pointer on handler * @param id resource id * @param num fumi number * * @return HPI error code **/ static SaErrorT NewSimulatorStartFumiBackup(void *, SaHpiResourceIdT, SaHpiFumiNumT) __attribute__((used)); static SaErrorT NewSimulatorStartFumiBackup(void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num) { NewSimulator *newsim = 0; NewSimulatorFumi *fumi = VerifyFumiAndEnter( hnd, id, num, newsim ); if ( !fumi ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = fumi->StartBackup(); newsim->IfLeave(); return rv; } /** * Interface for FumiBankBootOrderSet. * Inside the function the method NewSimulatorFumi::SetOrder * is called. * * @param hnd pointer on handler * @param id resource id * @param num fumi number * @param bank bank number * @param pos new position * * @return HPI error code **/ static SaErrorT NewSimulatorSetFumiBankOrder(void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiBankNumT, SaHpiUint32T) __attribute__((used)); static SaErrorT NewSimulatorSetFumiBankOrder(void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT bank, SaHpiUint32T pos) { NewSimulator *newsim = 0; NewSimulatorFumi *fumi = VerifyFumiAndEnter( hnd, id, num, newsim ); if ( !fumi ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = fumi->SetOrder( bank, pos ); newsim->IfLeave(); return rv; } /** * Interface for FumiBankCopyStart. * Inside the function the method NewSimulatorFumi::CopyBank * is called. * * @param hnd pointer on handler * @param id resource id * @param num fumi number * @param bank bank number * @param dest bank number of destination * * @return HPI error code **/ static SaErrorT NewSimulatorStartFumiBankCopy(void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiBankNumT, SaHpiBankNumT) __attribute__((used)); static SaErrorT NewSimulatorStartFumiBankCopy(void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT bank, SaHpiBankNumT dest) { NewSimulator *newsim = 0; NewSimulatorFumi *fumi = VerifyFumiAndEnter( hnd, id, num, newsim ); if ( !fumi ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = fumi->CopyBank( bank, dest ); newsim->IfLeave(); return rv; } /** * Interface for FumiInstallStart. * Inside the function the method NewSimulatorFumi::Install * is called. * * @param hnd pointer on handler * @param id resource id * @param num fumi number * @param bank bank number * * @return HPI error code **/ static SaErrorT NewSimulatorStartFumiInstall(void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiBankNumT) __attribute__((used)); static SaErrorT NewSimulatorStartFumiInstall(void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT bank) { NewSimulator *newsim = 0; NewSimulatorFumi *fumi = VerifyFumiAndEnter( hnd, id, num, newsim ); if ( !fumi ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = fumi->Install( bank ); newsim->IfLeave(); return rv; } /** * Interface for FumiUpgradeStatusGet. * Inside the function the method NewSimulatorFumi::GetStatus * is called. * * @param hnd pointer on handler * @param id resource id * @param num fumi number * @param bank bank number * @param status pointer to location to store upgrade status * * @return HPI error code **/ static SaErrorT NewSimulatorGetFumiStatus(void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiBankNumT, SaHpiFumiUpgradeStatusT *) __attribute__((used)); static SaErrorT NewSimulatorGetFumiStatus(void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT bank, SaHpiFumiUpgradeStatusT *status) { NewSimulator *newsim = 0; NewSimulatorFumi *fumi = VerifyFumiAndEnter( hnd, id, num, newsim ); if ( !fumi ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = fumi->GetStatus( bank, *status ); newsim->IfLeave(); return rv; } /** * Interface for FumiTargetVerifyStart. * Inside the function the method NewSimulatorFumi::VerifyTarget * is called. * * @param hnd pointer on handler * @param id resource id * @param num fumi number * @param bank bank number * * @return HPI error code **/ static SaErrorT NewSimulatorStartFumiVerification(void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiBankNumT) __attribute__((used)); static SaErrorT NewSimulatorStartFumiVerification(void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT bank) { NewSimulator *newsim = 0; NewSimulatorFumi *fumi = VerifyFumiAndEnter( hnd, id, num, newsim ); if ( !fumi ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = fumi->VerifyTarget( bank ); newsim->IfLeave(); return rv; } /** * Interface for TargetVerifyMainStart. * Inside the function the method NewSimulatorFumi::VerifyTargetMain * is called. * * @param hnd pointer on handler * @param id resource id * @param num fumi number * * @return HPI error code **/ static SaErrorT NewSimulatorStartFumiVerificationMain(void *, SaHpiResourceIdT, SaHpiFumiNumT) __attribute__((used)); static SaErrorT NewSimulatorStartFumiVerificationMain(void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num) { NewSimulator *newsim = 0; NewSimulatorFumi *fumi = VerifyFumiAndEnter( hnd, id, num, newsim ); if ( !fumi ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = fumi->VerifyTargetMain(); newsim->IfLeave(); return rv; } /** * Interface for FumiUpgradeCancel. * Inside the function the method NewSimulatorFumi::CancelUpgrade * is called. * * @param hnd pointer on handler * @param id resource id * @param num fumi number * @param bank bank number * * @return HPI error code **/ static SaErrorT NewSimulatorCancelFumiUpgrade(void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiBankNumT) __attribute__((used)); static SaErrorT NewSimulatorCancelFumiUpgrade(void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT bank) { NewSimulator *newsim = 0; NewSimulatorFumi *fumi = VerifyFumiAndEnter( hnd, id, num, newsim ); if ( !fumi ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = fumi->CancelUpgrade( bank ); newsim->IfLeave(); return rv; } /** * Interface for FumiAutoRollbackDisableGet. * Inside the function the method NewSimulatorFumi::GetRollbackFlag * is called. * * @param hnd pointer on handler * @param id resource id * @param num fumi number * @param rollb pointer to location to store information about rollback status * * @return HPI error code **/ static SaErrorT NewSimulatorGetFumiRollback(void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiBoolT *) __attribute__((used)); static SaErrorT NewSimulatorGetFumiRollback(void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBoolT *rollb) { NewSimulator *newsim = 0; NewSimulatorFumi *fumi = VerifyFumiAndEnter( hnd, id, num, newsim ); if ( !fumi ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = fumi->GetRollbackFlag( *rollb ); newsim->IfLeave(); return rv; } /** * Interface for FumiAutoRollbackDisableSet. * Inside the function the method NewSimulatorFumi::SetRollbackFlag * is called. * * @param hnd pointer on handler * @param id resource id * @param num fumi number * @param rollb information about rollback status * * @return HPI error code **/ static SaErrorT NewSimulatorSetFumiRollback(void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiBoolT) __attribute__((used)); static SaErrorT NewSimulatorSetFumiRollback(void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBoolT rollb) { NewSimulator *newsim = 0; NewSimulatorFumi *fumi = VerifyFumiAndEnter( hnd, id, num, newsim ); if ( !fumi ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = fumi->SetRollbackFlag( rollb ); newsim->IfLeave(); return rv; } /** * Interface for FumiRollbackStart. * Inside the function the method NewSimulatorFumi::Rollback * is called. * * @param hnd pointer on handler * @param id resource id * @param num fumi number * * @return HPI error code **/ static SaErrorT NewSimulatorStartFumiRollback(void *, SaHpiResourceIdT, SaHpiFumiNumT) __attribute__((used)); static SaErrorT NewSimulatorStartFumiRollback(void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num) { NewSimulator *newsim = 0; NewSimulatorFumi *fumi = VerifyFumiAndEnter( hnd, id, num, newsim ); if ( !fumi ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = fumi->Rollback(); newsim->IfLeave(); return rv; } /** * Interface for FumiActivate. * Inside the function the method NewSimulatorFumi::ActivateOld * is called. * * @param hnd pointer on handler * @param id resource id * @param num fumi number * * @return HPI error code **/ static SaErrorT NewSimulatorActivateFumi(void *, SaHpiResourceIdT, SaHpiFumiNumT) __attribute__((used)); static SaErrorT NewSimulatorActivateFumi(void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num) { NewSimulator *newsim = 0; NewSimulatorFumi *fumi = VerifyFumiAndEnter( hnd, id, num, newsim ); if ( !fumi ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = fumi->Activate(); newsim->IfLeave(); return rv; } /** * Interface for FumiActivateStart. * Inside the function the method NewSimulatorFumi::Activate * is called. * * @param hnd pointer on handler * @param id resource id * @param num fumi number * @param log indicates a logical bank or boot order activation * * @return HPI error code **/ static SaErrorT NewSimulatorStartFumiActivation(void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiBoolT) __attribute__((used)); static SaErrorT NewSimulatorStartFumiActivation(void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBoolT log) { NewSimulator *newsim = 0; NewSimulatorFumi *fumi = VerifyFumiAndEnter( hnd, id, num, newsim ); if ( !fumi ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = fumi->Activate( log ); newsim->IfLeave(); return rv; } /** * Interface for FumiCleanup. * Inside the function the method NewSimulatorFumi::Cleanup * is called. * * @param hnd pointer on handler * @param id resource id * @param num fumi number * @param bank bank number * * @return HPI error code **/ static SaErrorT NewSimulatorCleanupFumi(void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiBankNumT) __attribute__((used)); static SaErrorT NewSimulatorCleanupFumi(void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT bank) { NewSimulator *newsim = 0; NewSimulatorFumi *fumi = VerifyFumiAndEnter( hnd, id, num, newsim ); if ( !fumi ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = fumi->Cleanup( bank ); newsim->IfLeave(); return rv; } /** * Interface for DimiInfoGet. * Inside the function the method NewSimulatorDimi::GetInfo is called. * * @param hnd pointer on handler * @param id resource id * @param num dimi number * @param info pointer on dimi info to be filled * * @return HPI error code **/ static SaErrorT NewSimulatorGetDimiInfo( void *, SaHpiResourceIdT, SaHpiDimiNumT, SaHpiDimiInfoT *) __attribute__((used)); static SaErrorT NewSimulatorGetDimiInfo( void *hnd, SaHpiResourceIdT id, SaHpiDimiNumT num, SaHpiDimiInfoT *info) { NewSimulator *newsim = 0; NewSimulatorDimi *dimi = VerifyDimiAndEnter( hnd, id, num, newsim ); if ( !dimi ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = dimi->GetInfo( *info ); newsim->IfLeave(); return rv; } /** * Interface for DimiTestInfoGet. * Inside the function the method NewSimulatorDimi::GetTestInfo is called. * * @param hnd pointer on handler * @param id resource id * @param num dimi number * @param tnum dimi test number * @param tinfo pointer on dimi test info to be filled * * @return HPI error code **/ static SaErrorT NewSimulatorGetDimiTestInfo( void *, SaHpiResourceIdT, SaHpiDimiNumT, SaHpiDimiTestNumT, SaHpiDimiTestT *) __attribute__((used)); static SaErrorT NewSimulatorGetDimiTestInfo( void *hnd, SaHpiResourceIdT id, SaHpiDimiNumT num, SaHpiDimiTestNumT tnum, SaHpiDimiTestT *tinfo) { NewSimulator *newsim = 0; NewSimulatorDimi *dimi = VerifyDimiAndEnter( hnd, id, num, newsim ); if ( !dimi ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = dimi->GetTestInfo( tnum, *tinfo ); newsim->IfLeave(); return rv; } /** * Interface for DimiTestReadinessGet. * Inside the function the method NewSimulatorDimi::GetReadiness is called. * * @param hnd pointer on handler * @param id resource id * @param num dimi number * @param tnum dimi test number * @param tready pointer on dimi test readiness info to be filled * * @return HPI error code **/ static SaErrorT NewSimulatorGetDimiTestReadiness( void *, SaHpiResourceIdT, SaHpiDimiNumT, SaHpiDimiTestNumT, SaHpiDimiReadyT *) __attribute__((used)); static SaErrorT NewSimulatorGetDimiTestReadiness( void *hnd, SaHpiResourceIdT id, SaHpiDimiNumT num, SaHpiDimiTestNumT tnum, SaHpiDimiReadyT *tready) { NewSimulator *newsim = 0; NewSimulatorDimi *dimi = VerifyDimiAndEnter( hnd, id, num, newsim ); if ( !dimi ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = dimi->GetReadiness( tnum, *tready ); newsim->IfLeave(); return rv; } /** * Interface for DimiTestStart. * Inside the function the method NewSimulatorDimi::StartTest is called. * * @param hnd pointer on handler * @param id resource id * @param num dimi number * @param tnum dimi test number * @param tnump number of variable parameters * @param params pointer to array containing variable parameters * * @return HPI error code **/ static SaErrorT NewSimulatorStartDimiTest( void *, SaHpiResourceIdT, SaHpiDimiNumT, SaHpiDimiTestNumT, SaHpiUint8T, SaHpiDimiTestVariableParamsT *) __attribute__((used)); static SaErrorT NewSimulatorStartDimiTest( void *hnd, SaHpiResourceIdT id, SaHpiDimiNumT num, SaHpiDimiTestNumT tnum, SaHpiUint8T tnump, SaHpiDimiTestVariableParamsT *params) { NewSimulator *newsim = 0; NewSimulatorDimi *dimi = VerifyDimiAndEnter( hnd, id, num, newsim ); if ( !dimi ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = dimi->StartTest( tnum, tnump, params ); newsim->IfLeave(); return rv; } /** * Interface for DimiTestCancel. * Inside the function the method NewSimulatorDimi::CancelTest is called. * * @param hnd pointer on handler * @param id resource id * @param num dimi number * @param tnum dimi test number * * @return HPI error code **/ static SaErrorT NewSimulatorCancelDimiTest( void *, SaHpiResourceIdT, SaHpiDimiNumT, SaHpiDimiTestNumT) __attribute__((used)); static SaErrorT NewSimulatorCancelDimiTest( void *hnd, SaHpiResourceIdT id, SaHpiDimiNumT num, SaHpiDimiTestNumT tnum) { NewSimulator *newsim = 0; NewSimulatorDimi *dimi = VerifyDimiAndEnter( hnd, id, num, newsim ); if ( !dimi ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = dimi->CancelTest( tnum ); newsim->IfLeave(); return rv; } /** * Interface for DimiTestStatusGet. * Inside the function the method NewSimulatorDimi::GetStatus is called. * * @param hnd pointer on handler * @param id resource id * @param num dimi number * @param tnum dimi test number * @param tperc pointer to location to store percentage of test completed * @param tstatus pointer to location to store the status * * @return HPI error code **/ static SaErrorT NewSimulatorGetDimiTestStatus( void *, SaHpiResourceIdT, SaHpiDimiNumT, SaHpiDimiTestNumT, SaHpiDimiTestPercentCompletedT *, SaHpiDimiTestRunStatusT *) __attribute__((used)); static SaErrorT NewSimulatorGetDimiTestStatus( void *hnd, SaHpiResourceIdT id, SaHpiDimiNumT num, SaHpiDimiTestNumT tnum, SaHpiDimiTestPercentCompletedT *tperc, SaHpiDimiTestRunStatusT *tstatus) { NewSimulator *newsim = 0; NewSimulatorDimi *dimi = VerifyDimiAndEnter( hnd, id, num, newsim ); if ( !dimi ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = dimi->GetStatus( tnum, *tperc, *tstatus ); newsim->IfLeave(); return rv; } /** * Interface for DimiTestResultsGet. * Inside the function the method NewSimulatorDimi::GetResults is called. * * @param hnd pointer on handler * @param id resource id * @param num dimi number * @param tnum dimi test number * @param tresults pointer to location to store results from last run * * @return HPI error code **/ static SaErrorT NewSimulatorGetDimiTestResults( void *, SaHpiResourceIdT, SaHpiDimiNumT, SaHpiDimiTestNumT, SaHpiDimiTestResultsT *) __attribute__((used)); static SaErrorT NewSimulatorGetDimiTestResults( void *hnd, SaHpiResourceIdT id, SaHpiDimiNumT num, SaHpiDimiTestNumT tnum, SaHpiDimiTestResultsT *tresults) { NewSimulator *newsim = 0; NewSimulatorDimi *dimi = VerifyDimiAndEnter( hnd, id, num, newsim ); if ( !dimi ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = dimi->GetResults( tnum, *tresults ); newsim->IfLeave(); return rv; } /** * Interface for SetAutoInsertTimeout. * Inside the function the method NewSimulator::IfSetAutoInsertTimeout is called. * * @param hnd pointer on handler * @param timeout timeout value to be set * * @return HPI error code **/ static SaErrorT NewSimulatorSetAutoInsertTimeout( void *, SaHpiTimeoutT ) __attribute__((used)); static SaErrorT NewSimulatorSetAutoInsertTimeout( void *hnd, SaHpiTimeoutT timeout) { NewSimulator *newsim = VerifyNewSimulator( hnd ); if ( !newsim ) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rv = newsim->IfSetAutoInsertTimeout( timeout ); return rv; } /** * Interface for GetAutoExtractTimeout. * Inside the function the method NewSimulatorResource::GetAutoExtractTimeout is called. * * @param hnd pointer on handler * @param id resource id * @param timeout pointer to be filled * * @return HPI error code **/ static SaErrorT NewSimulatorGetAutoExtractTimeout( void *, SaHpiResourceIdT, SaHpiTimeoutT * ) __attribute__((used)); static SaErrorT NewSimulatorGetAutoExtractTimeout( void *hnd, SaHpiResourceIdT id, SaHpiTimeoutT *timeout ) { NewSimulator *newsim = 0; NewSimulatorResource *res = VerifyResourceAndEnter( hnd, id, newsim ); if ( !res ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = res->GetAutoExtractTimeout( *timeout ); newsim->IfLeave(); return rv; } /** * Interface for SetAutoExtractTimeout. * * Inside the function the method NewSimulatorResource::SetAutoExtractTimeout is called. * * @param hnd pointer on handler * @param id resource id * @param timeout timeout value to be set * * @return HPI error code **/ static SaErrorT NewSimulatorSetAutoExtractTimeout( void *, SaHpiResourceIdT, SaHpiTimeoutT ) __attribute__((used)); static SaErrorT NewSimulatorSetAutoExtractTimeout( void *hnd, SaHpiResourceIdT id, SaHpiTimeoutT timeout ) { NewSimulator *newsim = 0; NewSimulatorResource *res = VerifyResourceAndEnter( hnd, id, newsim ); if ( !res ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = res->SetAutoExtractTimeout( timeout ); newsim->IfLeave(); return rv; } /** * Interface for GetPowerState. * Inside the function the method NewSimulator::IfGetPowerState is called. * * @todo It should be implemented inside class NewSimulatorResource instead * of class NewSimulator. * * @param hnd pointer on handler * @param id resource id * @param state pointer on state structure to be filled * * @return HPI error code **/ static SaErrorT NewSimulatorGetPowerState( void *, SaHpiResourceIdT, SaHpiPowerStateT * ) __attribute__((used)); static SaErrorT NewSimulatorGetPowerState( void *hnd, SaHpiResourceIdT id, SaHpiPowerStateT *state ) { NewSimulator *newsim = 0; NewSimulatorResource *res = VerifyResourceAndEnter( hnd, id, newsim ); if ( !res ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = newsim->IfGetPowerState( res, *state ); newsim->IfLeave(); return rv; } /** * Interface for SetPowerState. * Inside the function the method NewSimulator::IfSetPowerState is called. * * @todo It should be implemented inside class NewSimulatorResource instead * of class NewSimulator. * * @param hnd pointer on handler * @param id resource id * @param state structure to be set * * @return HPI error code **/ static SaErrorT NewSimulatorSetPowerState( void *, SaHpiResourceIdT, SaHpiPowerStateT ) __attribute__((used)); static SaErrorT NewSimulatorSetPowerState( void *hnd, SaHpiResourceIdT id, SaHpiPowerStateT state ) { NewSimulator *newsim = 0; NewSimulatorResource *res = VerifyResourceAndEnter( hnd, id, newsim ); if ( !res ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = newsim->IfSetPowerState( res, state ); newsim->IfLeave(); return rv; } /** * Interface for GetIndicatorState. * Inside the function the method NewSimulator::IfGetIndicatorState is called. * * @todo It should be implemented inside class NewSimulatorResource instead * of class NewSimulator. * * @param hnd pointer on handler * @param id resource id * @param state pointer on structure to be filled * * @return HPI error code **/ static SaErrorT NewSimulatorGetIndicatorState( void *, SaHpiResourceIdT, SaHpiHsIndicatorStateT * ) __attribute__((used)); static SaErrorT NewSimulatorGetIndicatorState( void *hnd, SaHpiResourceIdT id, SaHpiHsIndicatorStateT *state ) { NewSimulator *newsim = 0; NewSimulatorResource *res = VerifyResourceAndEnter( hnd, id, newsim ); if ( !res ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = newsim->IfGetIndicatorState( res, *state ); newsim->IfLeave(); return rv; } /** * Interface for SetIndicatorState. * Inside the function the method NewSimulator::IfSetIndicatorState is called. * * @todo It should be implemented inside class NewSimulatorResource instead * of class NewSimulator. * * @param hnd pointer on handler * @param id resource id * @param state structure to be set * * @return HPI error code **/ static SaErrorT NewSimulatorSetIndicatorState( void *, SaHpiResourceIdT, SaHpiHsIndicatorStateT ) __attribute__((used)); static SaErrorT NewSimulatorSetIndicatorState( void *hnd, SaHpiResourceIdT id, SaHpiHsIndicatorStateT state ) { NewSimulator *newsim = 0; NewSimulatorResource *res = VerifyResourceAndEnter( hnd, id, newsim ); if ( !res ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = newsim->IfSetIndicatorState( res, state ); newsim->IfLeave(); return rv; } /** * Interface for ControlParm. * Inside the function the method NewSimulator::IfControlParm is called. * * @todo It should be implemented inside class NewSimulatorResource instead * of class NewSimulator. * * @param hnd pointer on handler * @param id resource id * @param act structure of ParmAction to be set * * @return HPI error code **/ static SaErrorT NewSimulatorControlParm( void *, SaHpiResourceIdT, SaHpiParmActionT ) __attribute__((used)); static SaErrorT NewSimulatorControlParm( void *hnd, SaHpiResourceIdT id, SaHpiParmActionT act ) { NewSimulator *newsim = 0; NewSimulatorResource *res = VerifyResourceAndEnter( hnd, id, newsim ); if ( !res ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = newsim->IfControlParm( res, act ); newsim->IfLeave(); return rv; } /** * Interface for GetResetState. * Inside the function the method NewSimulator::IfGetResetState is called. * * @todo It should be implemented inside class NewSimulatorResource instead * of class NewSimulator. * * @param hnd pointer on handler * @param id resource id * @param act structure of ResetAction to be filled * * @return HPI error code **/ static SaErrorT NewSimulatorGetResetState( void *, SaHpiResourceIdT, SaHpiResetActionT * ) __attribute__((used)); static SaErrorT NewSimulatorGetResetState( void *hnd, SaHpiResourceIdT id, SaHpiResetActionT *act ) { NewSimulator *newsim = 0; NewSimulatorResource *res = VerifyResourceAndEnter( hnd, id, newsim ); if ( !res ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = newsim->IfGetResetState( res, *act ); newsim->IfLeave(); return rv; } /** * Interface for SetResetState. * Inside the function the method NewSimulator::IfSetResetState is called. * * @todo It should be implemented inside class NewSimulatorResource instead * of class NewSimulator. * * @param hnd pointer on handler * @param id resource id * @param act structure of ResetAction to be set * * @return HPI error code **/ static SaErrorT NewSimulatorSetResetState( void *, SaHpiResourceIdT, SaHpiResetActionT ) __attribute__((used)); static SaErrorT NewSimulatorSetResetState( void *hnd, SaHpiResourceIdT id, SaHpiResetActionT act ) { NewSimulator *newsim = 0; NewSimulatorResource *res = VerifyResourceAndEnter( hnd, id, newsim ); if ( !res ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = newsim->IfSetResetState( res, act ); newsim->IfLeave(); return rv; } } // new plugin_loader //@} /* * End of new plugin ************************************************************************************/ /** * * * @name Plugin interface * Defining alias names for the abi functions, If someone has an idea how the link * between both plugin interfaces can be documented, be free and give me a hint. * */ //@{ extern "C" { /// Alias definition void * oh_open (GHashTable *, unsigned int, oh_evt_queue *) __attribute__ ((weak, alias("NewSimulatorOpen"))); /// Alias definition void * oh_close (void *) __attribute__ ((weak, alias("NewSimulatorClose"))); /// Alias definition void * oh_get_event (void *) __attribute__ ((weak, alias("NewSimulatorGetEvent"))); /// Alias definition void * oh_discover_resources (void *) __attribute__ ((weak, alias("NewSimulatorDiscoverResources"))); /// Alias definition void * oh_set_resource_tag (void *, SaHpiResourceIdT, SaHpiTextBufferT *) __attribute__ ((weak, alias("NewSimulatorSetResourceTag"))); /// Alias definition void * oh_set_resource_severity (void *, SaHpiResourceIdT, SaHpiSeverityT) __attribute__ ((weak, alias("NewSimulatorSetResourceSeverity"))); /// Alias definition void * oh_get_el_info (void *, SaHpiResourceIdT, SaHpiEventLogInfoT *) __attribute__ ((weak, alias("NewSimulatorGetSelInfo"))); /// Alias definition void * oh_set_el_time (void *, SaHpiResourceIdT, const SaHpiEventT *) __attribute__ ((weak, alias("NewSimulatorSetSelTime"))); /// Alias definition void * oh_add_el_entry (void *, SaHpiResourceIdT, const SaHpiEventT *) __attribute__ ((weak, alias("NewSimulatorAddSelEntry"))); /// Alias definition void * oh_get_el_entry (void *, SaHpiResourceIdT, SaHpiEventLogEntryIdT, SaHpiEventLogEntryIdT *, SaHpiEventLogEntryIdT *, SaHpiEventLogEntryT *, SaHpiRdrT *, SaHpiRptEntryT *) __attribute__ ((weak, alias("NewSimulatorGetSelEntry"))); /// Alias definition void * oh_clear_el (void *, SaHpiResourceIdT) __attribute__ ((weak, alias("NewSimulatorClearSel"))); /// Alias definition void * oh_set_el_state (void *, SaHpiResourceIdT, SaHpiBoolT) __attribute__ ((weak, alias("NewSimulatorSetSelState"))); /// Alias definition void * oh_get_el_state (void *, SaHpiResourceIdT, SaHpiBoolT *) __attribute__ ((weak, alias("NewSimulatorGetSelState"))); /// Alias definition void * oh_get_el_caps (void *, SaHpiResourceIdT, SaHpiEventLogCapabilitiesT *) __attribute__ ((weak, alias("NewSimulatorGetSelCapability"))); /// Alias definition void * oh_reset_el_overflow (void *, SaHpiResourceIdT) __attribute__ ((weak, alias("NewSimulatorResetSelOverflow"))); /// Alias definition void * oh_get_sensor_reading (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiSensorReadingT *, SaHpiEventStateT *) __attribute__ ((weak, alias("NewSimulatorGetSensorReading"))); /// Alias definition void * oh_get_sensor_thresholds (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiSensorThresholdsT *) __attribute__ ((weak, alias("NewSimulatorGetSensorThresholds"))); /// Alias definition void * oh_set_sensor_thresholds (void *, SaHpiResourceIdT, SaHpiSensorNumT, const SaHpiSensorThresholdsT *) __attribute__ ((weak, alias("NewSimulatorSetSensorThresholds"))); /// Alias definition void * oh_get_sensor_enable (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT *) __attribute__ ((weak, alias("NewSimulatorGetSensorEnable"))); /// Alias definition void * oh_set_sensor_enable (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT) __attribute__ ((weak, alias("NewSimulatorSetSensorEnable"))); /// Alias definition void * oh_get_sensor_event_enables (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT *) __attribute__ ((weak, alias("NewSimulatorGetSensorEventEnables"))); /// Alias definition void * oh_set_sensor_event_enables (void *, SaHpiResourceIdT id, SaHpiSensorNumT, SaHpiBoolT *) __attribute__ ((weak, alias("NewSimulatorSetSensorEventEnables"))); /// Alias definition void * oh_get_sensor_event_masks (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiEventStateT *, SaHpiEventStateT *) __attribute__ ((weak, alias("NewSimulatorGetSensorEventMasks"))); /// Alias definition void * oh_set_sensor_event_masks (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiSensorEventMaskActionT, SaHpiEventStateT, SaHpiEventStateT) __attribute__ ((weak, alias("NewSimulatorSetSensorEventMasks"))); /// Alias definition void * oh_get_control_state (void *, SaHpiResourceIdT, SaHpiCtrlNumT, SaHpiCtrlModeT *, SaHpiCtrlStateT *) __attribute__ ((weak, alias("NewSimulatorGetControlState"))); /// Alias definition void * oh_set_control_state (void *, SaHpiResourceIdT,SaHpiCtrlNumT, SaHpiCtrlModeT, SaHpiCtrlStateT *) __attribute__ ((weak, alias("NewSimulatorSetControlState"))); /// Alias definition void * oh_get_idr_info (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrInfoT *) __attribute__ ((weak, alias("NewSimulatorGetIdrInfo"))); /// Alias definition void * oh_get_idr_area_header (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrAreaTypeT, SaHpiEntryIdT, SaHpiEntryIdT, SaHpiIdrAreaHeaderT) __attribute__ ((weak, alias("NewSimulatorGetIdrAreaHeader"))); /// Alias definition void * oh_add_idr_area (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrAreaTypeT, SaHpiEntryIdT *) __attribute__ ((weak, alias("NewSimulatorAddIdrArea"))); /// Alias definition void * oh_add_idr_area_id (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrAreaTypeT, SaHpiEntryIdT) __attribute__ ((weak, alias("NewSimulatorAddIdrAreaById"))); /// Alias definition void * oh_del_idr_area (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT) __attribute__ ((weak, alias("NewSimulatorDelIdrArea"))); /// Alias definition void * oh_get_idr_field (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT, SaHpiIdrFieldTypeT, SaHpiEntryIdT, SaHpiEntryIdT, SaHpiIdrFieldT) __attribute__ ((weak, alias("NewSimulatorGetIdrField"))); /// Alias definition void * oh_add_idr_field (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrFieldT *) __attribute__ ((weak, alias("NewSimulatorAddIdrField"))); /// Alias definition void * oh_add_idr_field_id (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrFieldT *) __attribute__ ((weak, alias("NewSimulatorAddIdrFieldById"))); /// Alias definition void * oh_set_idr_field (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrFieldT) __attribute__ ((weak, alias("NewSimulatorSetIdrField"))); /// Alias definition void * oh_del_idr_field (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT, SaHpiEntryIdT) __attribute__ ((weak, alias("NewSimulatorDelIdrField"))); /// Alias definition void * oh_hotswap_policy_cancel (void *, SaHpiResourceIdT, SaHpiTimeoutT) __attribute__ ((weak, alias("NewSimulatorHotswapPolicyCancel"))); /// Alias definition void * oh_set_autoinsert_timeout (void *, SaHpiTimeoutT) __attribute__ ((weak, alias("NewSimulatorSetAutoInsertTimeout"))); /// Alias definition void * oh_get_autoextract_timeout (void *, SaHpiResourceIdT, SaHpiTimeoutT *) __attribute__ ((weak, alias("NewSimulatorGetAutoExtractTimeout"))); /// Alias definition void * oh_set_autoextract_timeout (void *, SaHpiResourceIdT, SaHpiTimeoutT) __attribute__ ((weak, alias("NewSimulatorSetAutoExtractTimeout"))); /// Alias definition void * oh_get_hotswap_state (void *, SaHpiResourceIdT, SaHpiHsStateT *) __attribute__ ((weak, alias("NewSimulatorGetHotswapState"))); /// Alias definition void * oh_set_hotswap_state (void *, SaHpiResourceIdT, SaHpiHsStateT) __attribute__ ((weak, alias("NewSimulatorSetHotswapState"))); /// Alias definition void * oh_request_hotswap_action (void *, SaHpiResourceIdT, SaHpiHsActionT) __attribute__ ((weak, alias("NewSimulatorRequestHotswapAction"))); /// Alias definition void * oh_get_power_state (void *, SaHpiResourceIdT, SaHpiPowerStateT *) __attribute__ ((weak, alias("NewSimulatorGetPowerState"))); /// Alias definition void * oh_set_power_state (void *, SaHpiResourceIdT, SaHpiPowerStateT) __attribute__ ((weak, alias("NewSimulatorSetPowerState"))); /// Alias definition void * oh_get_indicator_state (void *, SaHpiResourceIdT, SaHpiHsIndicatorStateT *) __attribute__ ((weak, alias("NewSimulatorGetIndicatorState"))); /// Alias definition void * oh_set_indicator_state (void *, SaHpiResourceIdT, SaHpiHsIndicatorStateT) __attribute__ ((weak, alias("NewSimulatorSetIndicatorState"))); /// Alias definition void * oh_control_parm (void *, SaHpiResourceIdT, SaHpiParmActionT) __attribute__ ((weak, alias("NewSimulatorControlParm"))); /// Alias definition void * oh_get_reset_state (void *, SaHpiResourceIdT, SaHpiResetActionT *) __attribute__ ((weak, alias("NewSimulatorGetResetState"))); /// Alias definition void * oh_set_reset_state (void *, SaHpiResourceIdT, SaHpiResetActionT) __attribute__ ((weak, alias("NewSimulatorSetResetState"))); /// Alias definition void * oh_get_watchdog_info (void *, SaHpiResourceIdT, SaHpiWatchdogNumT, SaHpiWatchdogT *) __attribute__ ((weak, alias("NewSimulatorGetWatchdogInfo"))); /// Alias definition void * oh_set_watchdog_info (void *, SaHpiResourceIdT, SaHpiWatchdogNumT, SaHpiWatchdogT *) __attribute__ ((weak, alias("NewSimulatorSetWatchdogInfo"))); /// Alias definition void * oh_reset_watchdog (void *, SaHpiResourceIdT , SaHpiWatchdogNumT ) __attribute__ ((weak, alias("NewSimulatorResetWatchdog"))); /// Alias definition void * oh_get_next_announce(void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiSeverityT, SaHpiBoolT, SaHpiAnnouncementT *) __attribute__ ((weak, alias("NewSimulatorGetNextAnnouncement"))); /// Alias definition void * oh_get_announce(void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiEntryIdT, SaHpiAnnouncementT *) __attribute__ ((weak, alias("NewSimulatorGetAnnouncement"))); /// Alias definition void * oh_ack_announce(void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiEntryIdT, SaHpiSeverityT) __attribute__ ((weak, alias("NewSimulatorAckAnnouncement"))); /// Alias definition void * oh_add_announce(void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiAnnouncementT *) __attribute__ ((weak, alias("NewSimulatorAddAnnouncement"))); /// Alias definition void * oh_del_announce(void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiEntryIdT, SaHpiSeverityT) __attribute__ ((weak, alias("NewSimulatorDelAnnouncement"))); /// Alias definition void * oh_get_annunc_mode(void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiAnnunciatorModeT *) __attribute__ ((weak, alias("NewSimulatorGetAnnMode"))); /// Alias definition void * oh_set_annunc_mode(void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiAnnunciatorModeT) __attribute__ ((weak, alias("NewSimulatorSetAnnMode"))); /// Alias definition void * oh_get_fumi_spec(void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiFumiSpecInfoT *) __attribute__ ((weak, alias("NewSimulatorGetFumiSpec"))); /// Alias definition void * oh_get_fumi_service_impact(void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiFumiServiceImpactDataT *) __attribute__ ((weak, alias("NewSimulatorGetFumiServImpact"))); /// Alias definition void * oh_set_fumi_source(void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiBankNumT, SaHpiTextBufferT *) __attribute__ ((weak, alias("NewSimulatorSetFumiSource"))); /// Alias definition void * oh_validate_fumi_source(void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiBankNumT) __attribute__ ((weak, alias("NewSimulatorValidateFumiSource"))); /// Alias definition void * oh_get_fumi_source(void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiBankNumT, SaHpiFumiSourceInfoT *) __attribute__ ((weak, alias("NewSimulatorGetFumiSource"))); /// Alias definition void * oh_get_fumi_source_component(void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiBankNumT, SaHpiEntryIdT, SaHpiEntryIdT *, SaHpiFumiComponentInfoT *) __attribute__ ((weak, alias("NewSimulatorGetFumiSourceComponent"))); /// Alias definition void * oh_get_fumi_target(void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiBankNumT, SaHpiFumiBankInfoT *) __attribute__ ((weak, alias("NewSimulatorGetFumiTarget"))); /// Alias definition void * oh_get_fumi_target_component(void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiBankNumT, SaHpiEntryIdT, SaHpiEntryIdT *, SaHpiFumiComponentInfoT *) __attribute__ ((weak, alias("NewSimulatorGetFumiTargetComponent"))); /// Alias definition void * oh_get_fumi_logical_target(void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiFumiLogicalBankInfoT *) __attribute__ ((weak, alias("NewSimulatorGetFumiLogicalTarget"))); /// Alias definition void * oh_get_fumi_logical_target_component(void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiEntryIdT, SaHpiEntryIdT *, SaHpiFumiLogicalComponentInfoT *) __attribute__ ((weak, alias("NewSimulatorGetFumiLogicalTargetComponent"))); /// Alias definition void * oh_start_fumi_backup(void *, SaHpiResourceIdT, SaHpiFumiNumT) __attribute__ ((weak, alias("NewSimulatorStartFumiBackup"))); /// Alias definition void * oh_set_fumi_bank_order(void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiBankNumT, SaHpiUint32T) __attribute__ ((weak, alias("NewSimulatorSetFumiBankOrder"))); /// Alias definition void * oh_start_fumi_bank_copy(void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiBankNumT, SaHpiBankNumT) __attribute__ ((weak, alias("NewSimulatorStartFumiBankCopy"))); /// Alias definition void * oh_start_fumi_install(void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiBankNumT) __attribute__ ((weak, alias("NewSimulatorStartFumiInstall"))); /// Alias definition void * oh_get_fumi_status(void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiBankNumT, SaHpiFumiUpgradeStatusT *) __attribute__ ((weak, alias("NewSimulatorGetFumiStatus"))); /// Alias definition void * oh_start_fumi_verify(void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiBankNumT) __attribute__ ((weak, alias("NewSimulatorStartFumiVerification"))); /// Alias definition void * oh_start_fumi_verify_main(void *, SaHpiResourceIdT, SaHpiFumiNumT) __attribute__ ((weak, alias("NewSimulatorStartFumiVerificationMain"))); /// Alias definition void * oh_cancel_fumi_upgrade(void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiBankNumT) __attribute__ ((weak, alias("NewSimulatorCancelFumiUpgrade"))); /// Alias definition void * oh_get_fumi_autorollback_disable(void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiBoolT *) __attribute__ ((weak, alias("NewSimulatorGetFumiRollback"))); /// Alias definition void * oh_set_fumi_autorollback_disable(void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiBoolT) __attribute__ ((weak, alias("NewSimulatorSetFumiRollback"))); /// Alias definition void * oh_start_fumi_rollback(void *, SaHpiResourceIdT, SaHpiFumiNumT) __attribute__ ((weak, alias("NewSimulatorStartFumiRollback"))); /// Alias definition void * oh_activate_fumi(void *, SaHpiResourceIdT, SaHpiFumiNumT) __attribute__ ((weak, alias("NewSimulatorActivateFumi"))); /// Alias definition void * oh_start_fumi_activate(void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiBoolT) __attribute__ ((weak, alias("NewSimulatorStartFumiActivation"))); /// Alias definition void * oh_cleanup_fumi(void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiBankNumT) __attribute__ ((weak, alias("NewSimulatorCleanupFumi"))); /// Alias definition void * oh_get_dimi_info(void *, SaHpiResourceIdT, SaHpiDimiNumT, SaHpiDimiInfoT *) __attribute__ ((weak, alias("NewSimulatorGetDimiInfo"))); /// Alias definition void * oh_get_dimi_test(void *, SaHpiResourceIdT, SaHpiDimiNumT, SaHpiDimiTestNumT, SaHpiDimiTestT *) __attribute__ ((weak, alias("NewSimulatorGetDimiTestInfo"))); /// Alias definition void * oh_get_dimi_test_ready(void *, SaHpiResourceIdT, SaHpiDimiNumT, SaHpiDimiTestNumT, SaHpiDimiReadyT *) __attribute__ ((weak, alias("NewSimulatorGetDimiTestReadiness"))); /// Alias definition void * oh_start_dimi_test(void *, SaHpiResourceIdT, SaHpiDimiNumT, SaHpiDimiTestNumT, SaHpiUint8T, SaHpiDimiTestVariableParamsT *) __attribute__ ((weak, alias("NewSimulatorStartDimiTest"))); /// Alias definition void * oh_cancel_dimi_test(void *, SaHpiResourceIdT, SaHpiDimiNumT, SaHpiDimiTestNumT) __attribute__ ((weak, alias("NewSimulatorCancelDimiTest"))); /// Alias definition void * oh_get_dimi_test_status(void *, SaHpiResourceIdT, SaHpiDimiNumT, SaHpiDimiTestNumT, SaHpiDimiTestPercentCompletedT *, SaHpiDimiTestRunStatusT *) __attribute__ ((weak, alias("NewSimulatorGetDimiTestStatus"))); /// Alias definition void * oh_get_dimi_test_results(void *, SaHpiResourceIdT, SaHpiDimiNumT, SaHpiDimiTestNumT, SaHpiDimiTestResultsT *) __attribute__ ((weak, alias("NewSimulatorGetDimiTestResults"))); } //@} /* * Isn't needed at the moment static unsigned int GetIntNotNull( GHashTable *handler_config, const char *str, unsigned int def = 0 ) { const char *value = (const char *)g_hash_table_lookup(handler_config, str ); if ( !value ) return def; unsigned int v = strtol( value, 0, 0 ); if ( v == 0 ) return def; return v; } static SaHpiTimeoutT GetTimeout( GHashTable *handler_config, const char *str, SaHpiTimeoutT def ) { const char *value = (const char *)g_hash_table_lookup(handler_config, str ); if ( !value ) return def; int v = strtol( value, 0, 0 ); if ( v == 0 ) return SAHPI_TIMEOUT_IMMEDIATE; if ( v == -1 ) return SAHPI_TIMEOUT_BLOCK; SaHpiTimeoutT timeout = v * 1000000000; return timeout; } */ /***************************************************************** * Implementation of class NewSimulator */ /** * Constructor **/ NewSimulator::NewSimulator() : m_magic( dNewSimulatorMagic ), m_handler( 0 ) {} /** * Destructor **/ NewSimulator::~NewSimulator() {} /** * Set handler pointer * * @param handler pointer on plugin handler **/ void NewSimulator::SetHandler( oh_handler_state *handler ) { m_handler = handler; } /** * Add an HPI event in the queue * * @param event pointer on event to be added **/ void NewSimulator::AddHpiEvent( oh_event *event ) { m_event_lock.Lock(); if ( m_handler ) { event->hid = m_handler->hid; oh_evt_queue_push(m_handler->eventq, event); } m_event_lock.Unlock(); } /** * Return the root entity path * * @return address of root entity path **/ const NewSimulatorEntityPath &NewSimulator::EntityRoot() { return m_entity_root; } /** * Return pointer on the plugin handler * * @return pointer on plugin handler **/ oh_handler_state *NewSimulator::GetHandler() { return m_handler; } /** * Return the rpt entry of a resource * * @param rid resource id to be found * @return pointer on plugin handler **/ SaHpiRptEntryT * NewSimulator::FindResource( SaHpiResourceIdT rid ) { if ( m_handler ) { return oh_get_resource_by_id( m_handler->rptcache, rid); } else { return 0; } } /** * Interface function Enter - only a lock is set **/ void NewSimulator::IfEnter() { ReadLock(); } /** * Interface function Leave - only a lock is unset **/ void NewSimulator::IfLeave() { ReadUnlock(); } /** * Get the parameter from the configuration file. At the moment it * is only a dummy method, since the filename param and entity root * are read inside NewSimulator::Init(). * * @param handler_config pointer on the configuration hash table * @return true **/ bool NewSimulator::GetParams( GHashTable *handler_config ) { return true; } /** * Interface Open. The parameters entity root and filename are read from * the hash table and it is tried to open the file by generating a new * NewSimulatorFile object and calling NewSimulatorFile::Open().\n * The Initializiation itself is done inside NewSimulatorDomain::Init() which is * called inside this method. * * @param handler_config pointer on the configuration hash table * @return error code of initialization **/ bool NewSimulator::IfOpen( GHashTable *handler_config ) { stdlog << "DBG: We are inside IfOpen\n"; const char *entity_root = (const char *)g_hash_table_lookup( handler_config, "entity_root" ); if ( !entity_root ) { err( "entity_root is missing in config file" ); return false; } if ( !m_entity_root.FromString( entity_root ) ) { err( "cannot decode entity path string" ); return false; } const char *filename = (const char *)g_hash_table_lookup( handler_config, "file" ); if ( !filename ) { err("file is missing in config file" ); return false; } NewSimulatorFile *simfile = new NewSimulatorFile( filename, m_entity_root ); if ( !simfile ) { stdlog << "NewSimulator cannot alloc File object !\n"; return false; } bool rv = simfile->Open(); if ( rv == false ) { stdlog << "File open connection fails !\n"; delete simfile; return false; } if ( !Init( simfile ) ) { IfClose(); return false; } return true; } /** * Interface Close - deletion of file object **/ void NewSimulator::IfClose() { Cleanup(); if ( m_file ) { delete m_file; m_file = 0; } } /** * Interface GetEvent * m_event_lock is set and unset. * It is also used to reduce the keep alive interval time * * @param event pointer on oh_event * @return 0 **/ int NewSimulator::IfGetEvent( oh_event *event ) { int rv = 0; m_event_lock.Lock(); m_event_lock.Unlock(); return rv; } /** * Interface Discover - check whether all resources are * discovered. * m_initial_discover_lock is set and unset. * * @return SA_OK * **/ SaErrorT NewSimulator::IfDiscoverResources() { dbg( "NewSimulator::IfDiscoverResources"); stdlog << "DBG: NewSimulator::IfDiscoverResources ...\n"; bool loop; do { usleep( 10000 ); m_initial_discover_lock.Lock(); loop = m_initial_discover ? true : false; m_initial_discover_lock.Unlock(); } while( loop ); stdlog << "DBG: Return simple OK\n"; return SA_OK; } /** * HPI function saHpiResourceTagSet() * * See also the description of the function inside the specification or header file. * The resource tag is set. * * @todo it fits better to implement it in class NewSimulatorResource * * @param ent pointer on NewSimulatorResource object for which the resource tag should be set * @param tag pointer on SaHpiTextBufferT with tag information to be set * * @return HPI error code **/ SaErrorT NewSimulator::IfSetResourceTag( NewSimulatorResource *ent, SaHpiTextBufferT *tag ) { // change tag in plugin cache SaHpiRptEntryT *rptentry = oh_get_resource_by_id( ent->Domain()->GetHandler()->rptcache, ent->ResourceId() ); if ( !rptentry ) return SA_ERR_HPI_NOT_PRESENT; memcpy(&rptentry->ResourceTag, tag, sizeof(SaHpiTextBufferT)); oh_add_resource(ent->Domain()->GetHandler()->rptcache, rptentry, ent, 1); return SA_OK; } /** * HPI function saHpiResourceSeveritySet() * * See also the description of the function inside the specification or header file. * The resource severity is set. * * @todo it fits better to implement it in class NewSimulatorResource * * @param ent pointer on NewSimulatorResource object for which severity should be set * @param sev severity to be set * * @return HPI error code **/ SaErrorT NewSimulator::IfSetResourceSeverity( NewSimulatorResource *ent, SaHpiSeverityT sev ) { // change severity in plugin cache SaHpiRptEntryT *rptentry = oh_get_resource_by_id( ent->Domain()->GetHandler()->rptcache, ent->ResourceId() ); if ( !rptentry ) return SA_ERR_HPI_NOT_PRESENT; rptentry->ResourceSeverity = sev; oh_add_resource(ent->Domain()->GetHandler()->rptcache, rptentry, ent, 1); return SA_OK; } /** * HPI function saHpiAutoInsertTimeoutSet() * * See also the description of the function inside the specification or header file. * Set the insertion timeout value * * @todo it fits better to implement it in class NewSimulatorDomain * * @param timeout timeout value to be set * * @return HPI error code **/ SaErrorT NewSimulator::IfSetAutoInsertTimeout( SaHpiTimeoutT timeout ) { InsertTimeout() = timeout; return SA_OK; } /** * HPI function saHpiResourcePowerStateGet() * * See also the description of the function inside the specification or header file. * Get the power state of a resource. * * @todo it fits better to implement it in class NewSimulatorResource * * @param res pointer on NewSimulatorResource to be used * @param state address of power state to be filled * * @return HPI error code **/ SaErrorT NewSimulator::IfGetPowerState( NewSimulatorResource *res, SaHpiPowerStateT &state ) { state = res->PowerState(); return SA_OK; } /** * HPI function saHpiResourcePowerStateSet() * * See also the description of the function inside the specification or header file. * Set the power state of a resource. * * @todo it fits better to implement it in class NewSimulatorResource * * @param res pointer on NewSimulatorResource to be used * @param state power state to be set * * @return HPI error code **/ SaErrorT NewSimulator::IfSetPowerState( NewSimulatorResource *res, SaHpiPowerStateT state ) { SaHpiPowerStateT origState; if (!(res->ResourceCapabilities() & SAHPI_CAPABILITY_POWER)) return SA_ERR_HPI_CAPABILITY; origState = res->PowerState(); /// @todo Generate some proper events for the power state transition if (state == SAHPI_POWER_CYCLE) { /// @todo: Depentend on the state of the resource send the transition event return SA_OK; } else if (state > SAHPI_POWER_STATE_MAX_VALID) { return SA_ERR_HPI_INVALID_PARAMS; } else { if (state != origState) { // TODO: Generate proper events res->PowerState() = state; } else { return SA_OK; } } return SA_OK; } /** * HPI function saHpiHotSwapIndicatorStateGet() * * See also the description of the function inside the specification or header file. * Get the indicator state of a resource. * * @todo it fits better to implement it in class NewSimulatorResource * * @param res pointer on NewSimulatorResource to be used * @param state address of indicator state to be filled * * @return HPI error code **/ SaErrorT NewSimulator::IfGetIndicatorState( NewSimulatorResource *res, SaHpiHsIndicatorStateT &state ) { if (!(res->ResourceCapabilities() & SAHPI_CAPABILITY_MANAGED_HOTSWAP) || !(res->HotSwapCapabilities() & SAHPI_HS_CAPABILITY_INDICATOR_SUPPORTED)) return SA_ERR_HPI_CAPABILITY; state = res->HSIndicator(); return SA_OK; } /** * HPI function saHpiHotSwapIndicatorStateSet() * * See also the description of the function inside the specification or header file. * Get the indicator state of a resource. * * @todo it fits better to implement it in class NewSimulatorResource * * @param res pointer on NewSimulatorResource to be used * @param state indicator state to be set * * @return HPI error code **/ SaErrorT NewSimulator::IfSetIndicatorState( NewSimulatorResource *res, SaHpiHsIndicatorStateT state ) { if (!(res->ResourceCapabilities() & SAHPI_CAPABILITY_MANAGED_HOTSWAP) || !(res->HotSwapCapabilities() & SAHPI_HS_CAPABILITY_INDICATOR_SUPPORTED)) return SA_ERR_HPI_CAPABILITY; if ( state > SAHPI_HS_INDICATOR_STATE_MAX_VALID ) return SA_ERR_HPI_INVALID_PARAMS; res->HSIndicator() = state; return SA_OK; } /** * HPI function saHpiResourceResetStateGet() * * See also the description of the function inside the specification or header file. * Get the reset state of a resource. * * @todo it fits better to implement it in class NewSimulatorResource * * @param res pointer on NewSimulatorResource to be used * @param state address of reset state to be filled * * @return HPI error code **/ SaErrorT NewSimulator::IfGetResetState( NewSimulatorResource *res, SaHpiResetActionT &state ) { if (!(res->ResourceCapabilities() & SAHPI_CAPABILITY_RESET)) return SA_ERR_HPI_CAPABILITY; state = SAHPI_RESET_DEASSERT; return SA_OK; } /** * HPI function saHpiResourceResetStateSet() * * See also the description of the function inside the specification or header file. * Get the reset state of a resource. * * @todo it fits better to implement it in class NewSimulatorResource * * @param res pointer on NewSimulatorResource to be used * @param state Reset action * * @return HPI error code **/ SaErrorT NewSimulator::IfSetResetState( NewSimulatorResource *res, SaHpiResetActionT state ) { if (!(res->ResourceCapabilities() & SAHPI_CAPABILITY_RESET)) return SA_ERR_HPI_CAPABILITY; if (state > SAHPI_RESET_MAX_VALID) return SA_ERR_HPI_INVALID_PARAMS; if ( (res->ResetState() == SAHPI_RESET_ASSERT) && ((state == SAHPI_COLD_RESET) || (state == SAHPI_WARM_RESET)) ) return SA_ERR_HPI_INVALID_REQUEST; if ( (state == SAHPI_COLD_RESET) || (state == SAHPI_WARM_RESET) ) { /// @todo Send proper transition events as if a reset was done return SA_OK; } else { res->ResetState() = state; return SA_OK; } } /** * HPI function saHpiParmControl() * * See also the description of the function inside the specification or header file. * Conrol the parameter of a resource. * * @todo it fits better to implement it in class NewSimulatorResource - at the moment * it is only a method stub * * @param res pointer on NewSimulatorResource to be used * @param act parm action to be done * * @return HPI error code **/ SaErrorT NewSimulator::IfControlParm( NewSimulatorResource * /*res*/, SaHpiParmActionT act ) { /// @todo implementation switch( act ) { case SAHPI_DEFAULT_PARM: break; case SAHPI_SAVE_PARM: break; case SAHPI_RESTORE_PARM: break; } return SA_OK; } openhpi-3.6.1/plugins/dynamic_simulator/new_sim_control_discrete.cpp0000644000175100017510000000765312575647274025204 0ustar mohanmohan/** * @file new_sim_control_discrete.cpp * * The file includes a class for discrete control handling:\n * NewSimulatorControlDiscrete * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * */ #include "new_sim_control.h" #include "new_sim_control_discrete.h" #include "new_sim_domain.h" /** * Constructor **/ NewSimulatorControlDiscrete::NewSimulatorControlDiscrete( NewSimulatorResource *res, SaHpiRdrT rdr, SaHpiCtrlStateDiscreteT state, SaHpiCtrlModeT mode ) : NewSimulatorControl( res, rdr, mode ) { memcpy(&m_rec, &rdr.RdrTypeUnion.CtrlRec.TypeUnion.Discrete, sizeof( SaHpiCtrlRecDiscreteT )); memcpy(&m_state, &state, sizeof( SaHpiCtrlStateDiscreteT )); } /** * Destructor **/ NewSimulatorControlDiscrete::~NewSimulatorControlDiscrete() {} /** * A rdr structure is filled with the data * * This method is called by method NewSimulatorRdr::Populate(). * * @param resource Address of resource structure * @param rdr Address of rdr structure * * @return true **/ bool NewSimulatorControlDiscrete::CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ) { if ( NewSimulatorControl::CreateRdr( resource, rdr ) == false ) return false; memcpy(&rdr.RdrTypeUnion.CtrlRec.TypeUnion.Discrete, &m_rec, sizeof( SaHpiCtrlRecDiscreteT )); return true; } /** * HPI function saHpiControlGet() * * See also the description of the function inside the specification or header file. * Copying the internal values (if a read is allowed). * * @param mode address to be filled * @param state address to be filled * * @return HPI return code **/ SaErrorT NewSimulatorControlDiscrete::GetState( SaHpiCtrlModeT &mode, SaHpiCtrlStateT &state ) { if (m_write_only == SAHPI_TRUE) return SA_ERR_HPI_INVALID_CMD; if ( &mode != NULL ) { mode = m_ctrl_mode; } if ( &state != NULL ) { state.Type = m_type; memcpy( &state.StateUnion.Discrete, &m_state, sizeof( SaHpiCtrlStateDiscreteT )); } return SA_OK; } /** * HPI function saHpiControlSet() * * See also the description of the function inside the specification or header file. * Copying the internal values (if a read is allowed). * * @param mode address to be set * @param state address to be set * * @return HPI return code **/ SaErrorT NewSimulatorControlDiscrete::SetState( const SaHpiCtrlModeT &mode, const SaHpiCtrlStateT &state ) { if (&mode == NULL) return SA_ERR_HPI_INVALID_PARAMS; if ((m_def_mode.ReadOnly == SAHPI_TRUE) && (mode != m_def_mode.Mode)) return SA_ERR_HPI_READ_ONLY; if (mode == SAHPI_CTRL_MODE_AUTO) { m_ctrl_mode = mode; return SA_OK; } if (mode != SAHPI_CTRL_MODE_MANUAL) return SA_ERR_HPI_INVALID_PARAMS; if (&state == NULL) return SA_ERR_HPI_INVALID_PARAMS; if (state.Type != m_type) return SA_ERR_HPI_INVALID_DATA; m_state = state.StateUnion.Discrete; m_ctrl_mode = mode; return SA_OK; } /** * Dump the control information * * @param dump Address of the log * **/ void NewSimulatorControlDiscrete::Dump( NewSimulatorLog &dump ) const { dump << "Discrete control " << m_id_string << ";\n"; dump << "ControlNum " << m_num << ";\n"; dump << "Oem" << m_oem << ";\n"; dump << "State" << m_state << ";\n"; dump << "Mode" << m_ctrl_mode << ";\n"; } openhpi-3.6.1/plugins/dynamic_simulator/new_sim_control_text.h0000644000175100017510000000325412575647274024024 0ustar mohanmohan/** * @file new_sim_control_text.h * * The file includes a class for text control handling:\n * NewSimulatorControlText * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * */ #ifndef __NEW_SIM_CONTROL_TEXT_H__ #define __NEW_SIM_CONTROL_TEXT_H__ #ifndef __NEW_SIM_RDR_H__ #include "new_sim_rdr.h" #endif #ifndef __NEW_SIM_CONTROL_H__ #include "new_sim_control.h" #endif extern "C" { #include "SaHpi.h" } /** * @class NewSimulatorControlText * * Class for simulating Text controls * **/ class NewSimulatorControlText : public NewSimulatorControl { protected: /// rdr information - Text record SaHpiCtrlRecTextT m_rec; /// state of the control SaHpiCtrlStateTextT m_state; public: NewSimulatorControlText( NewSimulatorResource *res, SaHpiRdrT rdr, SaHpiCtrlStateTextT state, SaHpiCtrlModeT mode ); virtual ~NewSimulatorControlText(); // create an RDR sensor record virtual bool CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ); virtual SaErrorT SetState( const SaHpiCtrlModeT &mode, const SaHpiCtrlStateT &state ); virtual SaErrorT GetState( SaHpiCtrlModeT &mode, SaHpiCtrlStateT &state ); virtual void Dump( NewSimulatorLog &dump ) const; }; #endif openhpi-3.6.1/plugins/dynamic_simulator/new_sim_domain.h0000644000175100017510000001413212575647274022544 0ustar mohanmohan/** * @file new_sim_domain.h * * The file includes the definition of the abstract domain class:\n * NewSimulatorDomain\n * * @author Lars Wetzel * @version 0.2 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * The new Simulator plugin is adapted from the ipmidirect plugin. * Thanks to * Thomas Kanngieser * Pierre Sangouard */ #ifndef __NEW_SIM_DOMAIN_H__ #define __NEW_SIM_DOMAIN_H__ #include #include extern "C" { #include "SaHpi.h" } #include #ifndef __NEW_SIM_FILE_H__ #include "new_sim_file.h" #endif #ifndef __NEW_SIM_RESOURCE_H__ #include "new_sim_resource.h" #endif #ifndef __NEW_SIM_EVENT_LOG_H__ #include "new_sim_event_log.h" #endif #ifndef __NEW_SIM_SENSOR_H__ #include "new_sim_sensor.h" #endif #ifndef __NEW_SIM_SENSOR_THRESHOLD_H__ #include "new_sim_sensor_threshold.h" #endif #ifndef __NEW_SIM_CONTROL_H__ #include "new_sim_control.h" #endif #ifndef __NEW_SIM_ANNUNCIATOR_H__ #include "new_sim_annunciator.h" #endif #ifndef __NEW_SIM_ANNOUNCEMENT_H__ #include "new_sim_announcement.h" #endif #ifndef __NEW_SIM_INVENTORY_H__ #include "new_sim_inventory.h" #endif #ifndef __NEW_SIM_WATCHDOG_H__ #include "new_sim_watchdog.h" #endif #ifndef __NEW_SIM_FUMI_H__ #include "new_sim_fumi.h" #endif #ifndef __NEW_SIM_DIMI_H__ #include "new_sim_dimi.h" #endif /** * @class NewSimulatorDomain * * The domain class includes funtions for the access of NewSimulatorResource objects * and the verification of the rdr classes. * Inside the method NewSimulatorDomain:Init the preparation for reading the * simulation data file is done. **/ class NewSimulatorDomain : public NewSimulatorEventLog { protected: /// pointer on the Simulation file to be used NewSimulatorFile *m_file; /// own domain id SaHpiDomainIdT m_did; /// own domain tag NewSimulatorTextBuffer m_domain_tag; /// insertion timeout value SaHpiTimeoutT m_insert_timeout; /// extraction timeout value SaHpiTimeoutT m_extract_timeout; /// TBD: to be clarified if needed bool m_own_domain; /// id of the used plugin handler int m_handler_id; /// flag if a watchdog is running and should be checked bool m_running_wdt; /// flag if a fumi is running and should be checked bool m_running_fumi; public: /// return the own domain id SaHpiDomainIdT DomainId() { return m_did; } /// return a reference to the insert timeout parameter SaHpiTimeoutT &InsertTimeout() { return m_insert_timeout; } /// return a reference to the extraction timeout parameter SaHpiTimeoutT &ExtractTimeout() { return m_extract_timeout; } /// return the handler id int HandlerId() { return m_handler_id; } /// return if a watchdog timer is running bool HasRunningWdt() { return m_running_wdt; } /// return if a fumi is running bool HasRunningFumi() { return m_running_fumi; } /// set running watchdog flag void SetRunningWdt( bool flag ) { m_running_wdt = flag; } /// set running fumi flag void SetRunningFumi( bool flag ) { m_running_fumi = flag; } protected: /// Major version unsigned int m_major_version; /// Minor version. unsigned int m_minor_version; protected: /// global lock for reading/writing: // mcs, entities, sensors, frus, sels cThreadLockRw m_lock; /// Array with all resources of the rpt cArray m_resources; public: /// Setting a read lock void ReadLock() { m_lock.ReadLock(); } /// Unlock the reading void ReadUnlock() { m_lock.ReadUnlock(); } /// Setting a write lock void WriteLock() { m_lock.WriteLock(); } /// Unlock the writing void WriteUnlock() { m_lock.WriteUnlock(); } /// Check if a lock is set bool CheckLock() { return m_lock.CheckLock(); } /// lock m_initial_discover cThreadLock m_initial_discover_lock; /// > 0 => initial discover in progress int m_initial_discover; public: /// Return the number of resource in the domain int Num() { return m_resources.Num(); } void AddResource( NewSimulatorResource *res ); bool CleanupResource( NewSimulatorResource *res ); void RemResource( NewSimulatorResource *res ); NewSimulatorResource *GetResource( int i ); NewSimulatorResource *FindResource( NewSimulatorResource *res ); NewSimulatorResource *FindResource( const NewSimulatorEntityPath &ep ); public: NewSimulatorDomain(); virtual ~NewSimulatorDomain(); bool Init( NewSimulatorFile *file ); void Cleanup(); NewSimulatorResource *VerifyResource( NewSimulatorResource *res ); NewSimulatorRdr *VerifyRdr( NewSimulatorRdr *rdr ); NewSimulatorSensor *VerifySensor( NewSimulatorSensor *s ); NewSimulatorControl *VerifyControl( NewSimulatorControl *c ); NewSimulatorAnnunciator *VerifyAnnunciator( NewSimulatorAnnunciator *a ); NewSimulatorWatchdog *VerifyWatchdog( NewSimulatorWatchdog *c ); NewSimulatorFumi *VerifyFumi( NewSimulatorFumi *f ); NewSimulatorDimi *VerifyDimi( NewSimulatorDimi *d ); NewSimulatorInventory *VerifyInventory( NewSimulatorInventory *i ); /// abstract method for adding a hpi event virtual void AddHpiEvent( oh_event *event ) = 0; /// abstract method for getting a hpi event virtual oh_evt_queue *GetHpiEventList() = 0; /// abstract method for getting a reference on the entity root virtual const NewSimulatorEntityPath &EntityRoot() = 0; /// abstract method for getting a pointer on the handler virtual oh_handler_state *GetHandler() = 0; /// abstract method for finding a resource with a given id virtual SaHpiRptEntryT *FindResource( SaHpiResourceIdT id ) = 0; void Dump( NewSimulatorLog &dump ) const; }; #endif openhpi-3.6.1/plugins/dynamic_simulator/thread.h0000644000175100017510000000630012575647274021021 0ustar mohanmohan/** * @file thread.h * * The file includes classes for thread handling:\n * cThread\n * cThreadLock\n * cThreadLockAuto\n * cThreadLockRw\n * cThreadCond\n * * @author Thomas Kanngieser * @author Lars Wetzel (documentation only) * @version 1.0 * @date 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Copyright (c) 2004 by FORCE Computers. */ #ifndef __THREAD_H__ #define __THREAD_H__ #include #include /// states of a thread enum tTheadState { eTsUnknown, eTsSuspend, eTsRun, eTsExit }; /** * @class cThread * * abstract class to support threads **/ class cThread { protected: /// thread structure pthread_t m_thread; bool m_main; //!< true => main thread /// state of the thread tTheadState m_state; static void *Thread( void *param ); public: cThread(); cThread( const pthread_t &thread, bool main_thread, tTheadState state ); virtual ~cThread(); // get the current thread class static cThread *GetThread(); // start thread virtual bool Start(); // wait for thread termination virtual bool Wait( void *&rv ); /// return if the thread is running bool IsRunning() { return m_state == eTsRun; } /// return if it is the main thread bool IsMain() { return m_main; } protected: /// abstract run method to be implemented by childs virtual void *Run() = 0; virtual void Exit( void *rv ); }; /** * @class cThreadLock * * Supports the locking **/ class cThreadLock { protected: /// mutex lock variable pthread_mutex_t m_lock; public: cThreadLock(); virtual ~cThreadLock(); virtual void Lock(); virtual void Unlock(); virtual bool TryLock(); }; /** * @class cThreadLockAuto * * The lock is set at calling the constructor and unlock * in the destructor **/ class cThreadLockAuto { /// holding the lock cThreadLock &m_lock; public: /// Constructor with lock address which is set cThreadLockAuto( cThreadLock &lock ) : m_lock( lock ) { m_lock.Lock(); } /// Destructor with unlock ~cThreadLockAuto() { m_lock.Unlock(); } }; /** * @class cThreadLockRw * * Using read and write locks **/ class cThreadLockRw { protected: /// holding the read/write lock pthread_rwlock_t m_rwlock; public: cThreadLockRw(); virtual ~cThreadLockRw(); virtual void ReadLock(); virtual void ReadUnlock(); virtual bool TryReadLock(); virtual void WriteLock(); virtual void WriteUnlock(); virtual bool TryWriteLock(); // true => no lock held bool CheckLock(); }; /** * @class cThreadCond * * holding the thread conditions **/ class cThreadCond : public cThreadLock { protected: /// conditions pthread_cond_t m_cond; public: cThreadCond(); virtual ~cThreadCond(); // call Lock before Signal virtual void Signal(); // call Lock before Wait virtual void Wait(); }; #endif openhpi-3.6.1/plugins/dynamic_simulator/new_sim_file_watchdog.h0000644000175100017510000000310012575647277024070 0ustar mohanmohan/** * @file new_sim_file_watchdog.h * * The file includes helper classes for parsing watchdog data from the simulation file:\n * NewSimulatorFileWatchdog * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * */ #ifndef __NEW_SIM_FILE_WATCHDOG_H__ #define __NEW_SIM_FILE_WATCHDOG_H__ #include extern "C" { #include "SaHpi.h" } #ifndef __NEW_SIM_FILE_RDR_H__ #include "new_sim_file_rdr.h" #endif #ifndef __NEW_SIM_RDR_H__ #include "new_sim_rdr.h" #endif #ifndef __NEW_SIM_RESOURCE_H__ #include "new_sim_resource.h" #endif #ifndef __NEW_SIM_WATCHDOG_H__ #include "new_sim_watchdog.h" #endif /** * @class NewSimulatorFileWatchdog * * Provides some functions for parsing the watchdog sections of the simulation file. **/ class NewSimulatorFileWatchdog : public NewSimulatorFileRdr { private: /// static watchdog rdr information SaHpiWatchdogRecT *m_wdt_rec; /// watchdog data SaHpiWatchdogT m_data; bool process_watchdog_data(); public: NewSimulatorFileWatchdog(GScanner *scanner); virtual ~NewSimulatorFileWatchdog(); virtual NewSimulatorRdr * process_token(NewSimulatorResource *res); }; #endif /*__NEW_SIM_FILE_WATCHDOG_H_*/ openhpi-3.6.1/plugins/dynamic_simulator/new_sim_dimi.cpp0000644000175100017510000002001012575647274022542 0ustar mohanmohan/** * @file new_sim_dimi.cpp * * The file includes a class for dimi handling:\n * NewSimulatorDimi * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * */ #include #include #include #include #include #include "new_sim_domain.h" #include "new_sim_dimi.h" #include "new_sim_dimi_data.h" #include "new_sim_entity.h" /** * Constructor **/ NewSimulatorDimi::NewSimulatorDimi( NewSimulatorResource *res ) : NewSimulatorRdr( res, SAHPI_DIMI_RDR ), m_test_id( 0 ) { memset( &m_dimi_rec, 0, sizeof( SaHpiFumiRecT )); memset( &m_dimi_info, 0, sizeof( SaHpiFumiSpecInfoT )); } /** * Full qualified constructor to fill an object with the parsed data **/ NewSimulatorDimi::NewSimulatorDimi( NewSimulatorResource *res, SaHpiRdrT rdr) : NewSimulatorRdr( res, SAHPI_DIMI_RDR, rdr.Entity, rdr.IsFru, rdr.IdString ), m_test_id( 0 ) { memcpy(&m_dimi_rec, &rdr.RdrTypeUnion.DimiRec, sizeof( SaHpiDimiRecT )); memset( &m_dimi_info, 0, sizeof( SaHpiDimiInfoT )); } /** * Destructor **/ NewSimulatorDimi::~NewSimulatorDimi() { m_tests.RemAll(); } /** * Dump the dimi information * * @param dump Address of the log * **/ void NewSimulatorDimi::Dump( NewSimulatorLog &dump ) const { dump << "Dimi: " << m_dimi_rec.DimiNum << "\n"; dump << "Oem: " << m_dimi_rec.Oem << "\n"; dump << "NumberOfTests: " << m_dimi_info.NumberOfTests << "\n"; dump << "TestNumUpdateCounter: " << m_dimi_info.TestNumUpdateCounter << "\n"; dump << "Test(s) Information: " << "\n"; dump << "-------------------\n"; for (int i= 0; i < m_tests.Num(); i++) { m_tests[i]->Dump( dump ); } } /** * A rdr structure is filled with the data * * This method is called by method NewSimulatorRdr::Populate(). * * @param resource Address of resource structure * @param rdr Address of rdr structure * * @return true **/ bool NewSimulatorDimi::CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ) { if ( NewSimulatorRdr::CreateRdr( resource, rdr ) == false ) return false; // Inventory record memcpy(&rdr.RdrTypeUnion.DimiRec, &m_dimi_rec, sizeof(SaHpiDimiRecT)); return true; } /** * Set dimi record data * * @param dimiRec DimiRecord data * @return true (simple copy) **/ bool NewSimulatorDimi::SetData( SaHpiDimiRecT dimiRec ) { memcpy( &m_dimi_rec, &dimiRec, sizeof( SaHpiDimiRecT )); return true; } /** * Set dimi information data * * @param info record with information * * @return true **/ bool NewSimulatorDimi::SetInfo( SaHpiDimiInfoT info ) { memcpy( &m_dimi_info, &info, sizeof( SaHpiDimiInfoT )); return true; } /** * Find a test by id * * @param id id of NewSimulatorTest object * @return pointer on a NewSimulatorTest object, NULL if no test can be found **/ NewSimulatorDimiTest *NewSimulatorDimi::GetTest( SaHpiDimiTestNumT id ) { NewSimulatorDimiTest *t = NULL; for (int i=0; i < m_tests.Num(); i++) { if ( id == m_tests[i]->Num() ) t = m_tests[i]; } return t; } /** * Add a test * * @param t pointer on NewSimulatorDimiTest to be added * @return true **/ bool NewSimulatorDimi::AddTest( NewSimulatorDimiTest *t ) { m_tests.Add( t ); return true; } // Official HPI functions /** * HPI function saHpiDimiInfoGet() * * See also the description of the function inside the specification or header file. * Copying the internal values (if a read is allowed). * * @param info address of the DimiInfo record to be filled * * @return HPI return code **/ SaErrorT NewSimulatorDimi::GetInfo( SaHpiDimiInfoT &info ) { SaErrorT rv = SA_OK; if ( &info == NULL ) return SA_ERR_HPI_INVALID_PARAMS; memcpy( &info, &m_dimi_info, sizeof( SaHpiDimiInfoT )); return rv; } /** * HPI function saHpiDimiTestInfoGet() * * See also the description of the function inside the specification or header file. * * @param id id of test * @param tinfo address of the Dimi test record to be filled * * @return HPI return code **/ SaErrorT NewSimulatorDimi::GetTestInfo( SaHpiDimiTestNumT id, SaHpiDimiTestT &tinfo ) { NewSimulatorDimiTest *t; if ( &tinfo == NULL ) return SA_ERR_HPI_INVALID_PARAMS; t = GetTest( id ); if ( t == NULL ) return SA_ERR_HPI_NOT_PRESENT; return t->GetInfo( tinfo ); } /** * HPI function saHpiDimiTestReadinessGet() * * See also the description of the function inside the specification or header file. * * @param id id of test * @param ready address to store the Ready information * * @return HPI return code **/ SaErrorT NewSimulatorDimi::GetReadiness( SaHpiDimiTestNumT id, SaHpiDimiReadyT &ready ) { NewSimulatorDimiTest *t; if ( &ready == NULL ) return SA_ERR_HPI_INVALID_PARAMS; t = GetTest( id ); if ( t == NULL ) return SA_ERR_HPI_NOT_PRESENT; return t->GetReady( ready ); } /** * HPI function saHpiDimiTestStart() * * See also the description of the function inside the specification or header file. * Copying the internal values (if a read is allowed). * * @param id id of test * @param number number of parameters * @param param pointer on array including the parameters * * @return HPI return code **/ SaErrorT NewSimulatorDimi::StartTest( SaHpiDimiTestNumT id, SaHpiUint8T number, SaHpiDimiTestVariableParamsT *param) { NewSimulatorDimiTest *t; if ( (number != 0) && (param == NULL) ) return SA_ERR_HPI_INVALID_PARAMS; t = GetTest( id ); if ( t == NULL ) return SA_ERR_HPI_NOT_PRESENT; return t->StartTest( number, param ); } /** * HPI function saHpiDimiTestCancel() * * See also the description of the function inside the specification or header file. * * @param id id of test * * @return HPI return code **/ SaErrorT NewSimulatorDimi::CancelTest( SaHpiDimiTestNumT id ) { NewSimulatorDimiTest *t; t = GetTest( id ); if ( t == NULL ) return SA_ERR_HPI_NOT_PRESENT; if ( !t->IsRunning() ) return SA_ERR_HPI_INVALID_STATE; return t->Cancel(); } /** * HPI function saHpiDimiTestStatusGet() * * See also the description of the function inside the specification or header file. * * @param id id of test * @param perc address to store percentage of test completed * @param status address to store the status of the last run * * @return HPI return code **/ SaErrorT NewSimulatorDimi::GetStatus( SaHpiDimiTestNumT id, SaHpiDimiTestPercentCompletedT &perc, SaHpiDimiTestRunStatusT &status ) { NewSimulatorDimiTest *t; if ( &status == NULL ) return SA_ERR_HPI_INVALID_PARAMS; t = GetTest( id ); if ( t == NULL ) return SA_ERR_HPI_NOT_PRESENT; return t->GetStatus( perc, status); } /** * HPI function saHpiDimiTestResultsGet() * * See also the description of the function inside the specification or header file. * * @param id id of test * @param results address to store the results of the last run * * @return HPI return code **/ SaErrorT NewSimulatorDimi::GetResults( SaHpiDimiTestNumT id, SaHpiDimiTestResultsT &results) { NewSimulatorDimiTest *t; if ( &results == NULL ) return SA_ERR_HPI_INVALID_PARAMS; t = GetTest( id ); if ( t == NULL ) return SA_ERR_HPI_NOT_PRESENT; return t->GetResults( results ); } openhpi-3.6.1/plugins/dynamic_simulator/new_sim_event_log.h0000644000175100017510000000407212575647274023261 0ustar mohanmohan/** * @file new_sim_event_log.h * * The file includes the class for an event log wrapper:\n * NewSimulatorEventLog * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * This EventLog class is adapted from the simulator plugin. * Thanks to * W. David Ashley * Suntrupth S Yadav */ #ifndef __NEW_SIM_EVENT_LOG_H__ #define __NEW_SIM_EVENT_LOG_H__ extern "C" { #include "SaHpi.h" } #include #include /** * @class NewSimulatorEventLog * * Class for wrapping event log functions * **/ class NewSimulatorEventLog { private: SaHpiEventLogCapabilitiesT capability; public: NewSimulatorEventLog(); virtual ~NewSimulatorEventLog(); // methods for HPI functions SaErrorT IfELGetInfo(oh_handler_state *hstate, SaHpiEventLogInfoT *info); SaErrorT IfELSetState(oh_handler_state *hstate, SaHpiBoolT state); SaErrorT IfELGetState(oh_handler_state *hstate, SaHpiBoolT *state); SaErrorT IfELSetTime(oh_handler_state *hstate, SaHpiTimeT time); SaErrorT IfELAddEntry(oh_handler_state *hstate, const SaHpiEventT *event); SaErrorT IfELGetEntry(oh_handler_state *hstate, SaHpiEventLogEntryIdT current, SaHpiEventLogEntryIdT *prev, SaHpiEventLogEntryIdT *next, SaHpiEventLogEntryT *entry, SaHpiRdrT *rdr, SaHpiRptEntryT *rptentry); SaErrorT IfELClear(oh_handler_state *hstate); SaErrorT IfELOverflow(oh_handler_state *hstate); SaErrorT IfELGetCaps(oh_handler_state *hstate, SaHpiEventLogCapabilitiesT *caps); }; #endif openhpi-3.6.1/plugins/dynamic_simulator/new_sim_control_digital.h0000644000175100017510000000332612575647274024455 0ustar mohanmohan/** * @file new_sim_control_digital.h * * The file includes a class for digital control handling:\n * NewSimulatorControlDigital * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * */ #ifndef __NEW_SIM_CONTROL_DIGITAL_H__ #define __NEW_SIM_CONTROL_DIGITAL_H__ #ifndef __NEW_SIM_RDR_H__ #include "new_sim_rdr.h" #endif #ifndef __NEW_SIM_CONTROL_H__ #include "new_sim_control.h" #endif extern "C" { #include "SaHpi.h" } /** * @class NewSimulatorControlDigital * * Class for simulating digital controls * **/ class NewSimulatorControlDigital : public NewSimulatorControl { protected: /// rdr information - digital record SaHpiCtrlRecDigitalT m_rec; /// state of the control SaHpiCtrlStateDigitalT m_state; public: NewSimulatorControlDigital( NewSimulatorResource *res, SaHpiRdrT rdr, SaHpiCtrlStateDigitalT state, SaHpiCtrlModeT mode ); virtual ~NewSimulatorControlDigital(); // create an RDR sensor record virtual bool CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ); virtual SaErrorT SetState( const SaHpiCtrlModeT &mode, const SaHpiCtrlStateT &state ); virtual SaErrorT GetState( SaHpiCtrlModeT &mode, SaHpiCtrlStateT &state ); virtual void Dump( NewSimulatorLog &dump ) const; }; #endif openhpi-3.6.1/plugins/dynamic_simulator/new_sim.h0000644000175100017510000000714612575647274021224 0ustar mohanmohan/** * @file new_sim.h * * The file includes the interface class to the abi:\n * NewSimulator\n * It also includes implementation of some HPI APIs. * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * The new Simulator plugin is adapted from the ipmidirect plugin. * Thanks to \n * Thomas Kanngieser \n * Pierre Sangouard * Andy Cress * */ #ifndef __NEW_SIM_H__ #define __NEW_SIM_H__ #include #include #include #include #include #ifndef __NEW_SIM_DOMAIN_H__ #include "new_sim_domain.h" #endif /// Simulator magic number #define dNewSimulatorMagic 0x47110815 /** * @class NewSimulator * * Interface to the openhpi abi **/ class NewSimulator : public NewSimulatorDomain { /// Magic number unsigned int m_magic; /// pointer on the oh_handler oh_handler_state *m_handler; /// root entity path NewSimulatorEntityPath m_entity_root; bool GetParams( GHashTable *handler_config ); public: /** * Check the Magic number * * @return true if it is the same defined by dNewSimulatorMagic **/ bool CheckMagic() { if ( m_magic == dNewSimulatorMagic ) return true; return false; } /** * Check the oh_handler * * @param handler pointer to be verified * @return true if it is the same **/ bool CheckHandler( oh_handler_state *handler ) { if ( handler == m_handler ) return true; return false; } virtual void IfEnter(); virtual void IfLeave(); // openhpi abi interface functions virtual bool IfOpen( GHashTable *handler_config ); virtual void IfClose(); virtual SaErrorT IfGetEvent( oh_event *event ); virtual SaErrorT IfDiscoverResources(); virtual SaErrorT IfSetResourceTag( NewSimulatorResource *ent, SaHpiTextBufferT *tag ); virtual SaErrorT IfSetResourceSeverity( NewSimulatorResource *res, SaHpiSeverityT sev ); // hot swap virtual SaErrorT IfSetAutoInsertTimeout( SaHpiTimeoutT timeout); virtual SaErrorT IfGetPowerState ( NewSimulatorResource *res, SaHpiPowerStateT &state ); virtual SaErrorT IfSetPowerState ( NewSimulatorResource *res, SaHpiPowerStateT state ); virtual SaErrorT IfGetIndicatorState( NewSimulatorResource *res, SaHpiHsIndicatorStateT &state ); virtual SaErrorT IfSetIndicatorState( NewSimulatorResource *res, SaHpiHsIndicatorStateT state ); virtual SaErrorT IfGetResetState ( NewSimulatorResource *res, SaHpiResetActionT &state ); virtual SaErrorT IfSetResetState ( NewSimulatorResource *res, SaHpiResetActionT state ); virtual SaErrorT IfControlParm( NewSimulatorResource *res, SaHpiParmActionT act ); /// lock for the hpi event queue cThreadLock m_event_lock; virtual void AddHpiEvent( oh_event *event ); /** * Return the HPI event list * * @return pointer on the HPI event queue **/ virtual oh_evt_queue *GetHpiEventList() { return m_handler->eventq; } NewSimulator(); ~NewSimulator(); void SetHandler( oh_handler_state *handler ); oh_handler_state *GetHandler(); virtual const NewSimulatorEntityPath &EntityRoot(); virtual SaHpiRptEntryT *FindResource( SaHpiResourceIdT id ); }; #endif openhpi-3.6.1/plugins/dynamic_simulator/new_sim_sensor_threshold.cpp0000644000175100017510000004532312575647274025223 0ustar mohanmohan/** * @file new_sim_sensor_threshold.cpp * * The file includes a class for threshold sensor handling:\n * NewSimulatorSensorThreshold * * @author Lars Wetzel * @version 0.2 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * */ #include "new_sim_sensor_threshold.h" #include "new_sim_log.h" #include "new_sim_domain.h" #include #include #include #include #include /** * Constructor **/ NewSimulatorSensorThreshold::NewSimulatorSensorThreshold( NewSimulatorResource *res ) : NewSimulatorSensor( res ) { } /** * Fully qualified constructor to fill an object with the parsed data **/ NewSimulatorSensorThreshold::NewSimulatorSensorThreshold( NewSimulatorResource *res, SaHpiRdrT rdr, SaHpiSensorReadingT data, SaHpiEventStateT event_state, SaHpiEventStateT event_amask, SaHpiEventStateT event_dmask, SaHpiSensorThresholdsT thresholds, SaHpiBoolT enabled, SaHpiBoolT event_enabled) : NewSimulatorSensor( res, rdr, data, event_state, event_amask, event_dmask, enabled, event_enabled ) { memcpy(&m_thres, &thresholds, sizeof(SaHpiSensorThresholdsT)); m_read_thold = rdr.RdrTypeUnion.SensorRec.ThresholdDefn.ReadThold; m_write_thold = rdr.RdrTypeUnion.SensorRec.ThresholdDefn.WriteThold; } /** * Destructor **/ NewSimulatorSensorThreshold::~NewSimulatorSensorThreshold() { } /** * TBD: Check where and whether it is needed **/ void NewSimulatorSensorThreshold::HandleNew( NewSimulatorDomain *domain ) { NewSimulatorSensor::HandleNew( domain ); } /** * TBD: Check where and whether it is needed * TODO: Change it properly due to new data structure **/ bool NewSimulatorSensorThreshold::Cmp( const NewSimulatorSensor &s2 ) const { if ( NewSimulatorSensor::Cmp( s2 ) == false ) return false; const NewSimulatorSensorThreshold *t = dynamic_cast( &s2 ); if ( !t ) return false; /** TODO * Should be changed due to other private variables * if ( m_sensor_init_thresholds != t->m_sensor_init_thresholds ) return false; if ( m_sensor_init_hysteresis != t->m_sensor_init_hysteresis ) return false; if ( m_hysteresis_support != t->m_hysteresis_support ) return false; if ( m_threshold_access != t->m_threshold_access ) return false; if ( m_assertion_event_mask != t->m_assertion_event_mask ) return false; if ( m_deassertion_event_mask != t->m_deassertion_event_mask ) return false; if ( m_reading_mask != t->m_reading_mask ) return false; if ( m_threshold_readable != t->m_threshold_readable ) return false; if ( m_threshold_settable != t->m_threshold_settable ) return false; if ( m_rate_unit != t->m_rate_unit ) return false; if ( m_modifier_unit_use != t->m_modifier_unit_use ) return false; if ( m_percentage != t->m_percentage ) return false; if ( m_base_unit != t->m_base_unit ) return false; if ( m_modifier_unit != t->m_modifier_unit ) return false; bool sf1 = m_sensor_factors ? true : false; bool sf2 = t->m_sensor_factors ? true : false; if ( sf1 != sf2 ) return false; if ( m_sensor_factors ) if ( m_sensor_factors->Cmp( *t->m_sensor_factors ) == false ) return false; if ( m_normal_min_specified != t->m_normal_min_specified ) return false; if ( m_normal_max_specified != t->m_normal_max_specified ) return false; if ( m_nominal_reading_specified != t->m_nominal_reading_specified ) return false; if ( m_nominal_reading != t->m_nominal_reading ) return false; if ( m_normal_max != t->m_normal_max ) return false; if ( m_normal_min != t->m_normal_min ) return false; if ( m_sensor_max != t->m_sensor_max ) return false; if ( m_sensor_min != t->m_sensor_min ) return false; if ( m_upper_non_recoverable_threshold != t->m_upper_non_recoverable_threshold ) return false; if ( m_upper_critical_threshold != t->m_upper_critical_threshold ) return false; if ( m_upper_non_critical_threshold != t->m_upper_non_critical_threshold ) return false; if ( m_lower_non_recoverable_threshold != t->m_lower_non_recoverable_threshold ) return false; if ( m_lower_critical_threshold != t->m_lower_critical_threshold ) return false; if ( m_lower_non_critical_threshold != t->m_lower_non_critical_threshold ) return false; if ( m_positive_going_threshold_hysteresis != t->m_positive_going_threshold_hysteresis ) return false; if ( m_negative_going_threshold_hysteresis != t->m_negative_going_threshold_hysteresis ) return false; **/ return true; } /** SaErrorT NewSimulatorSensorThreshold::CreateEvent( NewSimulatorEvent *event, SaHpiEventT &h ) { SaErrorT rv = NewSimulatorSensor::CreateEvent( event, h ); if ( rv != SA_OK ) return rv; // sensor event SaHpiSensorEventT &se = h.EventDataUnion.SensorEvent; se.Assertion = (SaHpiBoolT)!(event->m_data[9] & 0x80); tIpmiThresh threshold = (tIpmiThresh)((event->m_data[10] >> 1) & 0x07); switch( threshold ) { case eIpmiLowerNonCritical: se.EventState = SAHPI_ES_LOWER_MINOR; h.Severity = SAHPI_MINOR; break; case eIpmiLowerCritical: se.EventState = SAHPI_ES_LOWER_MAJOR; h.Severity = SAHPI_MAJOR; break; case eIpmiLowerNonRecoverable: se.EventState = SAHPI_ES_LOWER_CRIT; h.Severity = SAHPI_CRITICAL; break; case eIpmiUpperNonCritical: se.EventState = SAHPI_ES_UPPER_MINOR; h.Severity = SAHPI_MINOR; break; case eIpmiUpperCritical: se.EventState = SAHPI_ES_UPPER_MAJOR; h.Severity = SAHPI_MAJOR; break; case eIpmiUpperNonRecoverable: se.EventState = SAHPI_ES_UPPER_CRIT; h.Severity = SAHPI_CRITICAL; break; default: stdlog << "Invalid threshold giving !\n"; se.EventState = SAHPI_ES_UNSPECIFIED; } SaHpiSensorOptionalDataT optional_data = 0; // byte 2 tIpmiEventType type = (tIpmiEventType)(event->m_data[10] >> 6); if ( type == eIpmiEventData1 ) { ConvertToInterpreted( event->m_data[11], se.TriggerReading ); optional_data |= SAHPI_SOD_TRIGGER_READING; } else if ( type == eIpmiEventData2 ) { se.Oem = (SaHpiUint32T)event->m_data[11]; optional_data |= SAHPI_SOD_OEM; } else if ( type == eIpmiEventData3 ) { se.SensorSpecific = (SaHpiUint32T)event->m_data[11]; optional_data |= SAHPI_SOD_SENSOR_SPECIFIC; } // byte 3 type = (tIpmiEventType)((event->m_data[10] & 0x30) >> 4); if ( type == eIpmiEventData1 ) { ConvertToInterpreted( event->m_data[12], se.TriggerThreshold ); optional_data |= SAHPI_SOD_TRIGGER_THRESHOLD; } else if ( type == eIpmiEventData2 ) { se.Oem |= (SaHpiUint32T)((event->m_data[12] << 8) & 0xff00); optional_data |= SAHPI_SOD_OEM; } else if ( type == eIpmiEventData3 ) { se.SensorSpecific |= (SaHpiUint32T)((event->m_data[12] << 8) & 0xff00); optional_data |= SAHPI_SOD_SENSOR_SPECIFIC; } se.OptionalDataPresent = optional_data; return SA_OK; } **/ /** * Dump the sensor information * * @param dump Address of the log * **/ void NewSimulatorSensorThreshold::Dump( NewSimulatorLog &dump ) const { NewSimulatorSensor::Dump( dump ); dump << "Reading Threshold definition: " << m_read_thold << "\n"; dump << "Writing Threshold definition: " << m_write_thold << "\n"; dump << "Threshold values should come here - to be done\n"; } /** * A rdr structure is filled with the internally data * * This method is called by method NewSimulatorRdr::Populate(). * * @param resource Address of resource structure * @param rdr Address of rdr structure * * @return true **/ bool NewSimulatorSensorThreshold::CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ) { if ( NewSimulatorSensor::CreateRdr( resource, rdr ) == false ) return false; return true; } /** * HPI function saHpiSensorReadingGet() * * See also the description of the function inside the specification or header file. * Copying the internal reading values (if a read is allowed). * * @param data sensor reading variable in which the data should be copied * @param state sensor event state variable in which the states should be copied * * @return error code **/ SaErrorT NewSimulatorSensorThreshold::GetSensorReading( SaHpiSensorReadingT &data, SaHpiEventStateT &state ) { stdlog << "DBG: NewSimulatorSensorThreshold::GetSensorReading is called\n"; if ( m_enabled == SAHPI_FALSE ) return SA_ERR_HPI_INVALID_REQUEST; if ( &data != NULL ) memcpy( &data, &m_read_data, sizeof( SaHpiSensorReadingT )); if ( &state != NULL ) memcpy( &state, &m_event_data, sizeof( SaHpiEventStateT )); return SA_OK; } /** * HPI function saHpiSensorThresholdsGet() * * See also the description of the function inside the specification or header file. * Copy of the internal threshold values (if a read is allowed). * * @param thres Threshold structure in which the internal data should be copied * * @return error code **/ SaErrorT NewSimulatorSensorThreshold::GetThresholds( SaHpiSensorThresholdsT &thres ) { stdlog << "DBG: read thresholds for sensor " << EntityPath() << " num " << m_sensor_record.Num << " " << IdString() << ".\n"; if ((ThresholdDefn().IsAccessible == SAHPI_FALSE ) || ( m_read_thold == 0 )) return SA_ERR_HPI_INVALID_CMD; memcpy(&thres, &m_thres, sizeof(SaHpiSensorThresholdsT)); setMask(thres, m_read_thold); return SA_OK; } /** * HPI function saHpiSensorThresholdsSet() * * See also the description of the function inside the specification or header file. * The checks are done in the methods \n * NewSimulatorSensorThreshold::checkThresholdValue()\n * NewSimulatorSensorThreshold::checkHysteresisValue()\n * NewSimulatorSensorThreshold::checkOrdering(). * * @param thres Threshold structure with data which should be set internally * * @return error code **/ SaErrorT NewSimulatorSensorThreshold::SetThresholds( const SaHpiSensorThresholdsT &thres ) { SaErrorT rv; SaHpiSensorThresholdsT tmp; stdlog << "DBG: write thresholds for sensor " << EntityPath() << " num " << m_sensor_record.Num << " " << IdString() << ".\n"; if ( ( EventCategory() != SAHPI_EC_THRESHOLD ) || ( ThresholdDefn().IsAccessible == SAHPI_FALSE )) { stdlog << "DBG: return INVALID_CMD since "; if ( EventCategory() != SAHPI_EC_THRESHOLD ) stdlog << " - the event category isn't EC_THRESHOLD "; if ( ThresholdDefn().IsAccessible == SAHPI_FALSE ) stdlog << " - the thresholdsdefinition isn't accessible"; stdlog << "\n"; return SA_ERR_HPI_INVALID_CMD; } memcpy(&tmp, &m_thres, sizeof(SaHpiSensorThresholdsT)); // Check the threshold values if (thres.LowCritical.IsSupported) { rv = checkThresholdValue( thres.LowCritical, SAHPI_STM_LOW_CRIT, tmp.LowCritical ); if (rv != SA_OK) return rv; } if (thres.LowMajor.IsSupported) { rv = checkThresholdValue( thres.LowMajor, SAHPI_STM_LOW_MAJOR, tmp.LowMajor ); if (rv != SA_OK) return rv; } if (thres.LowMinor.IsSupported) { rv = checkThresholdValue( thres.LowMinor, SAHPI_STM_LOW_MINOR, tmp.LowMinor ); if (rv != SA_OK) return rv; } if (thres.UpCritical.IsSupported) { rv = checkThresholdValue( thres.UpCritical, SAHPI_STM_UP_CRIT, tmp.UpCritical ); if (rv != SA_OK) return rv; } if (thres.UpMajor.IsSupported) { rv = checkThresholdValue( thres.UpMajor, SAHPI_STM_UP_MAJOR, tmp.UpMajor ); if (rv != SA_OK) return rv; } if (thres.UpMinor.IsSupported) { rv = checkThresholdValue( thres.UpMinor, SAHPI_STM_UP_MINOR, tmp.UpMinor ); if (rv != SA_OK) return rv; } // Check the hysteresis values if (thres.PosThdHysteresis.IsSupported) { rv = checkHysteresisValue( thres.PosThdHysteresis, SAHPI_STM_UP_HYSTERESIS, tmp.PosThdHysteresis ); if (rv != SA_OK) return rv; } if (thres.NegThdHysteresis.IsSupported) { rv = checkHysteresisValue( thres.NegThdHysteresis, SAHPI_STM_LOW_HYSTERESIS, tmp.NegThdHysteresis ); if (rv != SA_OK) return rv; } // Check the ordering rv = checkOrdering( tmp ); if ( rv != SA_OK ) return rv; // Ok, it seems everything is fine - take the new values memcpy( &m_thres, &tmp, sizeof(SaHpiSensorThresholdsT)); return SA_OK; } /** * Check whether the setting of one threshold value is allowed * * It is checked if the WriteFlag is set, the value has the correct type and is in the Range * MIN <= value <= MAX. If the checks are successful, the value is copied. * * @param checkval Value which should be checked * @param flag Check whether a Write operation is allowed * @param setval Address where to copy the value * * @return error code or SA_OK in success case **/ SaErrorT NewSimulatorSensorThreshold::checkThresholdValue( const SaHpiSensorReadingT &checkval, SaHpiSensorRangeFlagsT flag, SaHpiSensorReadingT &setval ) { if (!(m_write_thold & flag)) return SA_ERR_HPI_INVALID_CMD; if (checkval.Type != DataFormat().ReadingType) return SA_ERR_HPI_INVALID_DATA; if (DataFormat().Range.Flags & SAHPI_SRF_MIN) { if (lt(checkval, DataFormat().Range.Min)) return SA_ERR_HPI_INVALID_CMD; } if (DataFormat().Range.Flags & SAHPI_SRF_MAX) { if (gt(checkval, DataFormat().Range.Max)) return SA_ERR_HPI_INVALID_CMD; } memcpy(&setval, &checkval, sizeof(SaHpiSensorReadingT)); return SA_OK; } /** * Check whether the setting of one Hysteresis value is allowed * * It is checked if the WriteFlag is set, the value has the correct type and is > 0. * If the checks are successful, the value is copied. * * @param checkval Value which should be checked * @param flag Check whether a Write operation is allowed * @param setval Address where to copy the value * * @return error code or SA_OK in success case **/ SaErrorT NewSimulatorSensorThreshold::checkHysteresisValue( const SaHpiSensorReadingT &checkval, SaHpiSensorRangeFlagsT flag, SaHpiSensorReadingT &setval ) { if (!(m_write_thold & flag)) return SA_ERR_HPI_INVALID_CMD; if (checkval.Type != DataFormat().ReadingType) return SA_ERR_HPI_INVALID_DATA; if (ltZero(checkval)) return SA_ERR_HPI_INVALID_DATA; memcpy(&setval, &checkval, sizeof(SaHpiSensorReadingT)); return SA_OK; } /** * Check if the ordering is correct * * @param thres Threshold values to be checked * * @return SA_ERR_HPI_INVALID_DATA if thres is out-of-order **/ SaErrorT NewSimulatorSensorThreshold::checkOrdering( const SaHpiSensorThresholdsT &thres ) { int i = 0, j; SaHpiSensorReadingT val[6]; if (m_write_thold & SAHPI_STM_UP_CRIT) { memcpy(&val[i], &thres.UpCritical, sizeof( SaHpiSensorReadingT )); i++; } if (m_write_thold & SAHPI_STM_UP_MAJOR) { memcpy(&val[i], &thres.UpMajor, sizeof( SaHpiSensorReadingT )); i++; } if (m_write_thold & SAHPI_STM_UP_MINOR) { memcpy(&val[i], &thres.UpMinor, sizeof( SaHpiSensorReadingT )); i++; } if (m_write_thold & SAHPI_STM_LOW_MINOR) { memcpy(&val[i], &thres.LowMinor, sizeof( SaHpiSensorReadingT )); i++; } if (m_write_thold & SAHPI_STM_LOW_MAJOR) { memcpy(&val[i], &thres.LowMajor, sizeof( SaHpiSensorReadingT )); i++; } if (m_write_thold & SAHPI_STM_LOW_CRIT) { memcpy(&val[i], &thres.LowCritical, sizeof( SaHpiSensorReadingT )); i++; } // No ordering must be checked - only one value could be set if (i < 1) return SA_OK; for (j = 1; j < i; j++) if ( lt(val[j-1], val[j]) ) return SA_ERR_HPI_INVALID_DATA; return SA_OK; } /** * Set the threshold support flags how it is allowed by a mask * * @param thres address of threshold to be set * @param mask threshold mask to set in structure **/ void NewSimulatorSensorThreshold::setMask( SaHpiSensorThresholdsT &thres, const SaHpiSensorThdMaskT mask) { if (mask & SAHPI_STM_UP_CRIT) { thres.UpCritical.IsSupported = SAHPI_TRUE; } else { thres.UpCritical.IsSupported = SAHPI_FALSE; } if (mask & SAHPI_STM_UP_MAJOR) { thres.UpMajor.IsSupported = SAHPI_TRUE; } else { thres.UpMajor.IsSupported = SAHPI_FALSE; } if (mask & SAHPI_STM_UP_MINOR) { thres.UpMinor.IsSupported = SAHPI_TRUE; } else { thres.UpMinor.IsSupported = SAHPI_FALSE; } if (mask & SAHPI_STM_LOW_MINOR) { thres.LowMinor.IsSupported = SAHPI_TRUE; } else { thres.LowMinor.IsSupported = SAHPI_FALSE; } if (mask & SAHPI_STM_LOW_MAJOR) { thres.LowMajor.IsSupported = SAHPI_TRUE; } else { thres.LowMajor.IsSupported = SAHPI_FALSE; } if (mask & SAHPI_STM_LOW_CRIT) { thres.LowCritical.IsSupported = SAHPI_TRUE; } else { thres.LowCritical.IsSupported = SAHPI_FALSE; } if (mask & SAHPI_STM_UP_HYSTERESIS) { thres.PosThdHysteresis.IsSupported = SAHPI_TRUE; } else { thres.PosThdHysteresis.IsSupported = SAHPI_FALSE; } if (mask & SAHPI_STM_LOW_HYSTERESIS) { thres.NegThdHysteresis.IsSupported = SAHPI_TRUE; } else { thres.NegThdHysteresis.IsSupported = SAHPI_FALSE; } } openhpi-3.6.1/plugins/dynamic_simulator/new_sim_file_sensor.cpp0000644000175100017510000007055612575647274024154 0ustar mohanmohan/** * @file new_sim_file_sensor.cpp * * The file includes the class for parsing the sensor data:\n * NewSimulatorFileSensor * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * */ #include #include #include #include #include #include "new_sim_file_rdr.h" #include "new_sim_file_sensor.h" #include "new_sim_file_util.h" #include "new_sim_resource.h" #include "new_sim_rdr.h" #include "new_sim_sensor.h" #include "new_sim_sensor_common.h" #include "new_sim_sensor_threshold.h" #include /** * Constructor **/ NewSimulatorFileSensor::NewSimulatorFileSensor( GScanner *scanner ) : NewSimulatorFileRdr ( scanner ), m_sensor_event_state ( 0 ), m_sensor_event_amask ( 0 ), m_sensor_event_dmask ( 0 ), m_sensor_enabled ( SAHPI_TRUE ), m_sensor_event_enabled( SAHPI_TRUE ) { m_sensor_rec = &m_rdr.RdrTypeUnion.SensorRec; memset ( &m_sensor_data, 0, sizeof( SaHpiSensorReadingT )); memset ( &m_sensor_thresholds, 0, sizeof( SaHpiSensorThresholdsT )); } /** * Destructor **/ NewSimulatorFileSensor::~NewSimulatorFileSensor() { } /** * Parse inside the \c SENSOR_TOKEN_HANDLER the \c RDR_DETAIL_TOKEN_HANDLER * * Depend on which sensor type is parsed several help methods are called. Startpoint is the * \c RDR_DETAIL_TOKEN_HANDLER. Endpoint is the last \c G_TOKEN_RIGHT_CURLY of the \c * SENSOR_TOKEN_HANDLER. * * @param res Pointer on the resource which includes the sensor * * @return Pointer on a new Rdr entry **/ NewSimulatorRdr * NewSimulatorFileSensor::process_token( NewSimulatorResource *res) { bool success = true; char *sensorfield; guint cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_LEFT_CURLY) { err("Processing parse configuration: Expected left curly token."); return NULL; } m_depth++; while ( (m_depth > 0) && success ) { cur_token = g_scanner_get_next_token(m_scanner); switch (cur_token) { case G_TOKEN_EOF: err("Processing parse rpt entry: File ends too early"); success = false; break; case G_TOKEN_RIGHT_CURLY: m_depth--; break; case G_TOKEN_LEFT_CURLY: m_depth++; break; case G_TOKEN_STRING: sensorfield = g_strdup(m_scanner->value.v_string); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (!strcmp(sensorfield, "Num")) { if (cur_token == G_TOKEN_INT) m_sensor_rec->Num = m_scanner->value.v_int; } else if (!strcmp(sensorfield, "Type")) { if (cur_token == G_TOKEN_INT) m_sensor_rec->Type = (SaHpiSensorTypeT) m_scanner->value.v_int; } else if (!strcmp(sensorfield, "Category")) { if (cur_token == G_TOKEN_INT) m_sensor_rec->Category = m_scanner->value.v_int; } else if (!strcmp(sensorfield, "EnableCtrl")) { if (cur_token == G_TOKEN_INT) m_sensor_rec->EnableCtrl = m_scanner->value.v_int; } else if (!strcmp(sensorfield, "EventCtrl")) { if (cur_token == G_TOKEN_INT) m_sensor_rec->EventCtrl = ( SaHpiSensorEventCtrlT ) m_scanner->value.v_int; } else if (!strcmp(sensorfield, "Events")) { if (cur_token == G_TOKEN_INT) m_sensor_rec->Events = m_scanner->value.v_int; } else if (!strcmp(sensorfield, "DataFormat")) { if (cur_token != G_TOKEN_LEFT_CURLY) { err("Processing parse sensor rdr entry - Missing left curly at DataFormat"); success = false; } else { success = process_dataformat( &m_sensor_rec->DataFormat ); } } else if (!strcmp(sensorfield, "ThresholdDefn")) { if (cur_token != G_TOKEN_LEFT_CURLY) { err("Processing parse sensor rdr entry - Missing left curly at ThresholdDefn"); success = false; } else { success = process_thresholddef( &m_sensor_rec->ThresholdDefn ); } } else if (!strcmp(sensorfield, "Oem")) { if (cur_token == G_TOKEN_INT) m_sensor_rec->Oem = m_scanner->value.v_int; } else { // Unknown Token err("Processing parse rdr entry: Unknown Rdr field %s", sensorfield); success = false; } break; case SENSOR_DATA_TOKEN_HANDLER: success = process_sensor_data_token(); break; default: err("Processing parse rdr entry: Unknown token"); success = false; break; } } if ( success ) { if ( m_sensor_rec->ThresholdDefn.IsAccessible ) { return ( new NewSimulatorSensorThreshold(res, m_rdr, m_sensor_data, m_sensor_event_state, m_sensor_event_amask, m_sensor_event_dmask, m_sensor_thresholds, m_sensor_enabled, m_sensor_event_enabled) ); } else { return ( new NewSimulatorSensorCommon(res, m_rdr, m_sensor_data, m_sensor_event_state, m_sensor_event_amask, m_sensor_event_dmask, m_sensor_enabled, m_sensor_event_enabled) ); } } return NULL; } /** * Parse the DataFormat structure of sensor record * * Startpoint is the \c G_TOKEN_LEFT_CURLY. Endpoint is the last \c G_TOKEN_RIGHT_CURLY. * * @param dataformat Pointer on SaHpiSensorDataFormatT to be filled * @return bool value success * **/ bool NewSimulatorFileSensor::process_dataformat( SaHpiSensorDataFormatT *dataformat ) { bool success = true; int start = m_depth; char *field; guint cur_token; m_depth++; // Left Curly -- our startpoint while ( (m_depth > start) && success ) { cur_token = g_scanner_get_next_token(m_scanner); switch (cur_token) { case G_TOKEN_EOF: err("Processing parse rpt entry: File ends too early"); success = false; break; case G_TOKEN_RIGHT_CURLY: m_depth--; break; case G_TOKEN_LEFT_CURLY: m_depth++; break; case G_TOKEN_STRING: field = g_strdup(m_scanner->value.v_string); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (!strcmp(field, "IsSupported")) { if (cur_token == G_TOKEN_INT) dataformat->IsSupported = m_scanner->value.v_int; } else if (!strcmp(field, "ReadingType")) { if (cur_token == G_TOKEN_INT) dataformat->ReadingType = ( SaHpiSensorReadingTypeT ) m_scanner->value.v_int; } else if (!strcmp(field, "BaseUnits")) { if (cur_token == G_TOKEN_INT) dataformat->BaseUnits = ( SaHpiSensorUnitsT ) m_scanner->value.v_int; } else if (!strcmp(field, "ModifierUnits")) { if (cur_token == G_TOKEN_INT) dataformat->ModifierUnits = ( SaHpiSensorUnitsT ) m_scanner->value.v_int; } else if (!strcmp(field, "ModifierUse")) { if (cur_token == G_TOKEN_INT) dataformat->ModifierUse = ( SaHpiSensorModUnitUseT ) m_scanner->value.v_int; } else if (!strcmp(field, "Percentage")) { if (cur_token == G_TOKEN_INT) dataformat->Percentage = m_scanner->value.v_int; } else if (!strcmp(field, "Range")) { if (cur_token != G_TOKEN_LEFT_CURLY) { err("Processing sensor dataformat - Missing left curly at DataFormat.Range"); success = false; } else { success = process_dataformat_range( &dataformat->Range ); } } else if (!strcmp(field, "AccuracyFactor")) { if (cur_token == G_TOKEN_FLOAT) dataformat->AccuracyFactor = m_scanner->value.v_float; } else { // Unknown Token err("Processing parse rdr entry: Unknown DataFormat.Range field %s", field); success = false; } break; default: err("Processing data format: Unknown token"); success = false; break; } } return success; } /** * Parse the DataFormat.Range structure of sensor record * * Startpoint is the \c G_TOKEN_LEFT_CURLY. Endpoint is the last \c G_TOKEN_RIGHT_CURLY * of DataFormat.Range. * * @param dataformat Pointer on SaHpiSensorRangeT to be filled * @return bool value success * **/ bool NewSimulatorFileSensor::process_dataformat_range( SaHpiSensorRangeT *datarange ) { bool success = true; int start = m_depth; char *field; guint cur_token; m_depth++; // Left Curly -- our startpoint while ( (m_depth > start) && success ) { cur_token = g_scanner_get_next_token(m_scanner); switch (cur_token) { case G_TOKEN_EOF: err("Processing parse rpt entry: File ends too early"); success = false; break; case G_TOKEN_RIGHT_CURLY: m_depth--; break; case G_TOKEN_LEFT_CURLY: m_depth++; break; case G_TOKEN_STRING: field = g_strdup(m_scanner->value.v_string); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (!strcmp(field, "Flags")) { if (cur_token == G_TOKEN_INT) datarange->Flags = m_scanner->value.v_int; } else if (!strcmp(field, "Max")) { if (cur_token != G_TOKEN_LEFT_CURLY) { err("Processing sensor - Missing left curly at DataFormat.Range.Max"); success = false; } else { success = process_sensor_reading( &datarange->Max ); } } else if (!strcmp(field, "Min")) { if (cur_token != G_TOKEN_LEFT_CURLY) { err("Processing sensor - Missing left curly at DataFormat.Range.Min"); success = false; } else { success = process_sensor_reading( &datarange->Min ); } } else if (!strcmp(field, "Nominal")) { if (cur_token != G_TOKEN_LEFT_CURLY) { err("Processing sensor - Missing left curly at DataFormat.Range.Nominal"); success = false; } else { success = process_sensor_reading( &datarange->Nominal ); } } else if (!strcmp(field, "NormalMax")) { if (cur_token != G_TOKEN_LEFT_CURLY) { err("Processing sensor - Missing left curly at DataFormat.Range.NormalMax"); success = false; } else { success = process_sensor_reading( &datarange->NormalMax ); } } else if (!strcmp(field, "NormalMin")) { if (cur_token != G_TOKEN_LEFT_CURLY) { err("Processing sensor - Missing left curly at DataFormat.Range.NormalMin"); success = false; } else { success = process_sensor_reading( &datarange->NormalMin ); } } else { // Unknown Token err("Processing parse rdr entry: Unknown Rdr field %s", field); success = false; } break; default: err("Processing data format: Unknown token"); success = false; break; } } return success; } /** * Parse the ThresholdDefn structure of sensor record * * Startpoint is the \c G_TOKEN_LEFT_CURLY. Endpoint is the last \c G_TOKEN_RIGHT_CURLY * of DataFormat.Range. * * @param thresdef Pointer on SaHpiSensorThdDefnT to be filled * @return bool value success * **/ bool NewSimulatorFileSensor::process_thresholddef( SaHpiSensorThdDefnT *thresdef ) { bool success = true; int start = m_depth; char *field; guint cur_token; m_depth++; // Left Curly -- our startpoint while ( (m_depth > start) && success ) { cur_token = g_scanner_get_next_token(m_scanner); switch (cur_token) { case G_TOKEN_EOF: err("Processing parse rpt entry: File ends too early"); success = false; break; case G_TOKEN_RIGHT_CURLY: m_depth--; break; case G_TOKEN_LEFT_CURLY: m_depth++; break; case G_TOKEN_STRING: field = g_strdup(m_scanner->value.v_string); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (!strcmp(field, "IsAccessible")) { if (cur_token == G_TOKEN_INT) thresdef->IsAccessible = m_scanner->value.v_int; } else if (!strcmp(field, "ReadThold")) { if (cur_token == G_TOKEN_INT) thresdef->ReadThold = m_scanner->value.v_int; } else if (!strcmp(field, "WriteThold")) { if (cur_token == G_TOKEN_INT) thresdef->WriteThold = m_scanner->value.v_int; } else if (!strcmp(field, "Nonlinear")) { if (cur_token == G_TOKEN_INT) thresdef->Nonlinear = m_scanner->value.v_int; } else { // Unknown Token err("Processing parse rdr entry: Unknown Rdr field %s", field); success = false; } break; default: err("Processing data format: Unknown token"); success = false; break; } } return success; } /** * Parse inside the \c RDR_DETAIL_TOKEN_HANDLER the \c SENSOR_DATA_TOKEN_HANDLER * * Depend on which sensor type is parsed several help methods are called. Startpoint is the * \c SENSOR_DATA_TOKEN_HANDLER. Endpoint is the last \c G_TOKEN_RIGHT_CURLY. * * @return success **/ bool NewSimulatorFileSensor::process_sensor_data_token( ) { bool success = true; int start = m_depth; char *field; guint cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_LEFT_CURLY) { err("Processing parse configuration: Expected left curly token after SENSOR_DATA_TOKEN_HANDLER."); return false; } m_depth++; while ( (m_depth > start) && success ) { cur_token = g_scanner_get_next_token(m_scanner); switch (cur_token) { case G_TOKEN_EOF: err("Processing parse rpt entry: File ends too early"); success = false; break; case G_TOKEN_RIGHT_CURLY: m_depth--; break; case G_TOKEN_LEFT_CURLY: m_depth++; break; case G_TOKEN_STRING: field = g_strdup(m_scanner->value.v_string); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (!strcmp(field, "SensorEnable")) { if (cur_token == G_TOKEN_INT) m_sensor_enabled = ( SaHpiBoolT ) m_scanner->value.v_int; } else if (!strcmp(field, "SensorEventEnable")) { if (cur_token == G_TOKEN_INT) m_sensor_event_enabled = ( SaHpiBoolT ) m_scanner->value.v_int; } else if (!strcmp(field, "EventState")) { if (cur_token == G_TOKEN_INT) m_sensor_event_state = ( SaHpiEventStateT ) m_scanner->value.v_int; } else if (!strcmp(field, "SensorReading")) { if (cur_token != G_TOKEN_LEFT_CURLY) { err("Processing sensor - Missing left curly at SensorReading"); success = false; } else { success = process_sensor_reading( &m_sensor_data ); } } else if (!strcmp(field, "SensorThresholds")) { if (cur_token != G_TOKEN_LEFT_CURLY) { err("Processing sensor - Missing left curly at SensorThresholds"); success = false; } else { success = process_sensor_thresholds( &m_sensor_thresholds ); } } else if (!strcmp(field, "AssertEventMask")) { if (cur_token == G_TOKEN_INT) m_sensor_event_amask = ( SaHpiEventStateT ) m_scanner->value.v_int; } else if (!strcmp(field, "DeassertEventMask")) { if (cur_token == G_TOKEN_INT) m_sensor_event_dmask = ( SaHpiEventStateT ) m_scanner->value.v_int; } else { // Unknown Token err("Processing parse rdr entry: Unknown Rdr field %s", field); success = false; } break; default: err("Processing parse rdr entry: Unknown token"); success = false; break; } } return success; } /** * Parse the ThresholdsT structure * * Startpoint is the \c G_TOKEN_LEFT_CURLY. Endpoint is the last \c G_TOKEN_RIGHT_CURLY * of the ThresholdsT structure. * * @param thres Pointer on SaHpiSensorThresholdsT to be filled * @return bool value success * **/ bool NewSimulatorFileSensor::process_sensor_thresholds( SaHpiSensorThresholdsT *thres ) { bool success = true; int start = m_depth; char *field; guint cur_token; m_depth++; // Left Curly -- our startpoint while ( (m_depth > start) && success ) { cur_token = g_scanner_get_next_token(m_scanner); switch (cur_token) { case G_TOKEN_EOF: err("Processing parse rpt entry: File ends too early"); success = false; break; case G_TOKEN_RIGHT_CURLY: m_depth--; break; case G_TOKEN_LEFT_CURLY: m_depth++; break; case G_TOKEN_STRING: field = g_strdup(m_scanner->value.v_string); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse thresholds entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (!strcmp(field, "LowCritical")) { if (cur_token != G_TOKEN_LEFT_CURLY) { err("Processing sensor - Missing left curly at Threshold LowCritical"); success = false; } else { success = process_sensor_reading( &thres->LowCritical ); } } else if (!strcmp(field, "LowMajor")) { if (cur_token != G_TOKEN_LEFT_CURLY) { err("Processing sensor - Missing left curly at Threshold LowMajor"); success = false; } else { success = process_sensor_reading( &thres->LowMajor ); } } else if (!strcmp(field, "LowMinor")) { if (cur_token != G_TOKEN_LEFT_CURLY) { err("Processing sensor - Missing left curly at Threshold LowMinor"); success = false; } else { success = process_sensor_reading( &thres->LowMinor ); } } else if (!strcmp(field, "UpCritical")) { if (cur_token != G_TOKEN_LEFT_CURLY) { err("Processing sensor - Missing left curly at Threshold UpCritical"); success = false; } else { success = process_sensor_reading( &thres->UpCritical ); } } else if (!strcmp(field, "UpMajor")) { if (cur_token != G_TOKEN_LEFT_CURLY) { err("Processing sensor - Missing left curly at Threshold UpMajor"); success = false; } else { success = process_sensor_reading( &thres->UpMajor ); } } else if (!strcmp(field, "UpMinor")) { if (cur_token != G_TOKEN_LEFT_CURLY) { err("Processing sensor - Missing left curly at Threshold UpMinor"); success = false; } else { success = process_sensor_reading( &thres->UpMinor ); } } else if (!strcmp(field, "PosThdHysteresis")) { if (cur_token != G_TOKEN_LEFT_CURLY) { err("Processing sensor - Missing left curly at Threshold PosThdHysteresis"); success = false; } else { success = process_sensor_reading( &thres->PosThdHysteresis ); } } else if (!strcmp(field, "NegThdHysteresis")) { if (cur_token != G_TOKEN_LEFT_CURLY) { err("Processing sensor - Missing left curly at Threshold NegThdHysteresis"); success = false; } else { success = process_sensor_reading( &thres->NegThdHysteresis ); } } else { // Unknown Token err("Processing parse rdr entry: Unknown Rdr field %s", field); success = false; } break; default: err("Processing data format: Unknown token"); success = false; break; } } return success; } /** * Parse the SensorReading structure * * Startpoint is the \c G_TOKEN_LEFT_CURLY. Endpoint is the last \c G_TOKEN_RIGHT_CURLY * of SensorReading * * @param sensorreading Pointer on SaHpiSensorReadingT to be filled * @return bool value success * **/ bool NewSimulatorFileSensor::process_sensor_reading( SaHpiSensorReadingT *sensorreading ) { bool success = true; bool negative = false; int start = m_depth; char *field; guint cur_token; m_depth++; // Left Curly -- our startpoint while ( (m_depth > start) && success ) { cur_token = g_scanner_get_next_token(m_scanner); switch (cur_token) { case G_TOKEN_EOF: err("Processing parse rpt entry: File ends too early"); success = false; break; case G_TOKEN_RIGHT_CURLY: m_depth--; break; case G_TOKEN_LEFT_CURLY: m_depth++; break; case G_TOKEN_STRING: negative = false; field = g_strdup(m_scanner->value.v_string); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing sensorreading: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if ( cur_token == '-' ) { negative = !negative; cur_token = g_scanner_get_next_token(m_scanner); } if (!strcmp(field, "IsSupported")) { if (cur_token == G_TOKEN_INT) sensorreading->IsSupported = m_scanner->value.v_int; } else if (!strcmp(field, "Type")) { if (cur_token == G_TOKEN_INT) sensorreading->Type = (SaHpiSensorReadingTypeT) m_scanner->value.v_int; } else if (!strcmp(field, "value.SensorInt64")) { if (cur_token == G_TOKEN_INT) { sensorreading->Value.SensorInt64 = m_scanner->value.v_int; if (negative) sensorreading->Value.SensorInt64 = -sensorreading->Value.SensorInt64; } } else if (!strcmp(field, "value.SensorUint64")) { if (cur_token == G_TOKEN_INT) sensorreading->Value.SensorUint64 = m_scanner->value.v_int; } else if (!strcmp(field, "value.SensorFloat64")) { if (cur_token == G_TOKEN_FLOAT) { sensorreading->Value.SensorFloat64 = m_scanner->value.v_float; if (negative) sensorreading->Value.SensorFloat64 = -sensorreading->Value.SensorFloat64; } } else if (!strcmp(field, "value.SensorBuffer")) { if (cur_token == G_TOKEN_STRING) success = process_hexstring( SAHPI_SENSOR_BUFFER_LENGTH, g_strdup(m_scanner->value.v_string), &(sensorreading->Value.SensorBuffer[0]) ); /** char *val_str = NULL; guint val_uint = 0; val_str = g_strdup(m_scanner->value.v_string); int len = strlen(val_str); int i; if (val_str == NULL) { err("Processing parse sensorreading: Wrong SensorBuffer\n"); } else if (len % 2) { err("Processing parse sensorreading: Wrong SensorBuffer length\n"); } else { stdlog << "DBG: SensorReading: Parsing SensorBuffer "; for (i = 0; (i < SAHPI_SENSOR_BUFFER_LENGTH) || (i*2Value.SensorBuffer[i] = static_cast(val_uint); val_str++; val_str++; stdlog << sensorreading->Value.SensorBuffer[i] << " "; } stdlog << "\n"; } **/ } else { // Unknown Token err("Processing sensorreading entry: Unknown field %s", field); success = false; } break; default: err("Processing data format: Unknown token"); success = false; break; } } return success; } openhpi-3.6.1/plugins/dynamic_simulator/new_sim_file.cpp0000644000175100017510000006421112575647274022552 0ustar mohanmohan/** * @file new_sim_file.cpp * * The file includes the main class for parsing:\n * NewSimulatorFile\n * and some functions for the configuration of GScanner. * * @author Lars Wetzel * @version 0.2 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * */ #include #include #include #include #include #include #include "new_sim_file.h" #include "new_sim_file_util.h" #include "new_sim_file_rdr.h" #include "new_sim_file_sensor.h" #include "new_sim_file_control.h" #include "new_sim_file_annunciator.h" #include "new_sim_file_inventory.h" #include "new_sim_file_watchdog.h" #include "new_sim_file_fumi.h" #include "new_sim_file_dimi.h" #include "new_sim_domain.h" #include "new_sim_entity.h" #include "new_sim_utils.h" #include "new_sim_log.h" #define GEN_SIM_DATA_VERSION 0.901 ///< Global skip characters for oh_scanner_config static gchar skip_characters[] = " \t\n"; ///< Global identifier_first for oh_scanner_config static gchar identifier_first[] = G_CSET_a_2_z"_/."G_CSET_A_2_Z; ///< Global identifier_nth for oh_scanner_config static gchar identifier_nth[] = G_CSET_a_2_z"_-0123456789/."G_CSET_A_2_Z; ///< Global comment signs for oh_scanner_config static gchar comment_single[] = "#\n"; /******************************************************************************* * The configuration was taken from source/config.c * * G_TOKEN_STRING will be created when anything starts with a-zA-z_/. * due to cset_identifier_first and identifier2string values below. * Therefor, if you want 0 to be scanned as a string, you need to quote * it (e.g. "0") * *******************************************************************************/ static GScannerConfig oh_scanner_config = { skip_characters /* cset_skip_characters */, identifier_first /* cset_identifier_first */, identifier_nth /* cset_identifier_nth */, comment_single /* cpair_comment_single */, FALSE /* case_sensitive */, TRUE /* skip_comment_multi */, TRUE /* skip_comment_single */, TRUE /* scan_comment_multi */, TRUE /* scan_identifier */, TRUE /* scan_identifier_1char */, TRUE /* scan_identifier_NULL */, TRUE /* scan_symbols */, TRUE /* scan_binary */, TRUE /* scan_octal */, TRUE /* scan_float */, TRUE /* scan_hex */, TRUE /* scan_hex_dollar */, TRUE /* scan_string_sq */, TRUE /* scan_string_dq */, TRUE /* numbers_2_int */, FALSE /* int_2_float */, TRUE /* identifier_2_string */, TRUE /* char_2_token */, TRUE /* symbol_2_token */, FALSE /* scope_0_fallback */, }; /** * scanner_msg_handler * A reference of this function is passed into the GScanner.\n * Used by the GScanner object to output messages that come up during parsing. * * @param scanner Object used to parse the config file. * @paran message Message string. * @param is_error: Bit to say the message is an error. * * @return None (void). **/ extern "C" { static void scanner_msg_handler (GScanner *scanner, gchar *message, gboolean is_error) { g_return_if_fail (scanner != NULL); err("%s:%d: %s%s\n", scanner->input_name ? scanner->input_name : "", scanner->line, is_error ? "error: " : "", message ); } } /** * Constructor * Open the file \ and initialize a GScanner. * * @param filename Pointer with the simulation filename */ NewSimulatorFile::NewSimulatorFile(const char *filename, NewSimulatorEntityPath root) : NewSimulatorFileUtil( root ), m_version ( GEN_SIM_DATA_VERSION ) { stdlog << "DBG: NewSimulatorFile.constructor with " << filename << "\n"; m_scanner = g_scanner_new(&oh_scanner_config); if (!m_scanner) { err("Couldn't allocate g_scanner for file parsing"); } m_scanner->msg_handler = scanner_msg_handler; m_scanner->input_name = filename; m_file = open(filename, O_RDONLY); if (m_file < 0) { err("Configuration file '%s' could not be opened", filename); } m_mode = UNKNOWN; m_depth = 0; } /** * Destructor */ NewSimulatorFile::~NewSimulatorFile() { int i; stdlog << "DBG: NewSimulatorFile.Destructor\n"; g_scanner_destroy(m_scanner); if (close(m_file) != 0) { err("Couldn't close the file"); } for (i=m_tokens.Num()-1; i >= 0; i--) m_tokens.Rem(i); } /** * * Configuration of the GScanner and reading the configuration part of the simulator file. * * Inside the method some additional tokens are put to GScanner. Afterwards the \c CONFIGURATION * part is read from the simulation file by calling NewSimulatorFile::process_configuration_token() * to configure the class NewSimulatorFile properly. * * @return true **/ bool NewSimulatorFile::Open() { int done=0; int i; m_tokens.Add(new SimulatorToken( "CONFIGURATION", CONFIG_TOKEN_HANDLER )); m_tokens.Add(new SimulatorToken( "RPT", RPT_TOKEN_HANDLER )); m_tokens.Add(new SimulatorToken( "RDR", RDR_TOKEN_HANDLER )); m_tokens.Add(new SimulatorToken( "RDR_DETAIL", RDR_DETAIL_TOKEN_HANDLER )); m_tokens.Add(new SimulatorToken( "SENSOR", SENSOR_TOKEN_HANDLER )); m_tokens.Add(new SimulatorToken( "CONTROL", CONTROL_TOKEN_HANDLER )); m_tokens.Add(new SimulatorToken( "INVENTORY", INVENTORY_TOKEN_HANDLER )); m_tokens.Add(new SimulatorToken( "WATCHDOG", WATCHDOG_TOKEN_HANDLER )); m_tokens.Add(new SimulatorToken( "ANNUNCIATOR", ANNUNCIATOR_TOKEN_HANDLER )); m_tokens.Add(new SimulatorToken( "DIMI", DIMI_TOKEN_HANDLER )); m_tokens.Add(new SimulatorToken( "FUMI", FUMI_TOKEN_HANDLER )); m_tokens.Add(new SimulatorToken( "CONTROL_GET", CONTROL_GET_TOKEN_HANDLER )); m_tokens.Add(new SimulatorToken( "SENSOR_DATA", SENSOR_DATA_TOKEN_HANDLER )); m_tokens.Add(new SimulatorToken( "INVENTORY_DATA", INVENTORY_DATA_TOKEN_HANDLER )); m_tokens.Add(new SimulatorToken( "INV_AREA", INV_AREA_TOKEN_HANDLER )); m_tokens.Add(new SimulatorToken( "INV_FIELD", INV_FIELD_TOKEN_HANDLER )); m_tokens.Add(new SimulatorToken( "WDT_GET", WDT_GET_TOKEN_HANDLER )); m_tokens.Add(new SimulatorToken( "ANNUNCIATOR_DATA", ANNUNCIATOR_DATA_TOKEN_HANDLER )); m_tokens.Add(new SimulatorToken( "ANNOUNCEMENT", ANNOUNCEMENT_TOKEN_HANDLER )); m_tokens.Add(new SimulatorToken( "DIMI_DATA", DIMI_DATA_TOKEN_HANDLER )); m_tokens.Add(new SimulatorToken( "DIMI_TESTCASE", DIMI_TESTCASE_TOKEN_HANDLER )); m_tokens.Add(new SimulatorToken( "DIMI_TEST_DATA", DIMI_TEST_DATA_TOKEN_HANDLER )); m_tokens.Add(new SimulatorToken( "FUMI_DATA", FUMI_DATA_TOKEN_HANDLER )); m_tokens.Add(new SimulatorToken( "FUMI_SOURCE_DATA", FUMI_SOURCE_DATA_TOKEN_HANDLER )); m_tokens.Add(new SimulatorToken( "FUMI_TARGET_DATA", FUMI_TARGET_DATA_TOKEN_HANDLER )); m_tokens.Add(new SimulatorToken( "FUMI_LOG_TARGET_DATA", FUMI_LOG_TARGET_DATA_TOKEN_HANDLER )); stdlog << "DBG: NewSimulatorFile::Open()\n"; stdlog << "DBG: Working with entity path: " << m_root_ep << "\n"; if (m_depth != 0) return false; g_scanner_input_file(m_scanner, m_file); for (i = 0; i < m_tokens.Num(); i++) { g_scanner_scope_add_symbol(m_scanner, 0, m_tokens[i]->Name(), (void *)((unsigned long)m_tokens[i]->Token())); } while (!done) { guint my_token; my_token = g_scanner_peek_next_token (m_scanner); stdlog << "DBG: token " << my_token << "\n"; //dbg("token: %d", my_token); switch (my_token) { case G_TOKEN_EOF: done = 1; break; case CONFIG_TOKEN_HANDLER: return process_configuration_token(); break; case RPT_TOKEN_HANDLER: case RDR_TOKEN_HANDLER: err("Configuration settings are missing in the file - setting default values"); m_mode = INIT; done = 1; break; default: // need to advance it my_token = g_scanner_get_next_token(m_scanner); g_scanner_unexp_token(m_scanner, G_TOKEN_SYMBOL, NULL, "\"CONFIGURATION\"", NULL, NULL, TRUE); break; } } return true; } /** * Parse the simulation file to discover the HPI values * * Starting with \c RPT_TOKEN_HANDLER the rpt information * is read inside NewSimulatorFile::process_rpt_token. * * @param domain Pointer to the domain to which the information should be linked * * @return success **/ bool NewSimulatorFile::Discover(NewSimulatorDomain *domain) { guint cur_token = g_scanner_peek_next_token (m_scanner); int done = 0; bool success = true; while (!done) { switch (cur_token) { case G_TOKEN_EOF: done = 1; break; case RPT_TOKEN_HANDLER: stdlog << "DBG: NewSimulatorFile::Discover: Discover RPT entry\n"; success = process_rpt_token(domain); if (!success) { done = 1; err("Stop parsing due to the error before"); } else { cur_token = g_scanner_peek_next_token (m_scanner); } break; default: cur_token = g_scanner_get_next_token(m_scanner); g_scanner_unexp_token(m_scanner, G_TOKEN_SYMBOL, NULL, "\"CONFIGURATION\"", NULL, NULL, TRUE); done = 1; break; }; } return success; } /** * Read the configuration information from the simulation file * * Startpoint is token \c CONFIG_TOKEN_HANDLER. Endpoint is the last * \c G_TOKEN_RIGHT_CURLY of the \c CONFIGURATION section. * **/ bool NewSimulatorFile::process_configuration_token() { char *conf_value; double conf_float; guint cur_token = g_scanner_get_next_token(m_scanner); gchar *field; if (g_scanner_get_next_token(m_scanner) != G_TOKEN_LEFT_CURLY) { err("Processing parse configuration: Expected left curly token."); return false; } m_depth++; while (m_depth) { cur_token = g_scanner_get_next_token(m_scanner); switch (cur_token) { case G_TOKEN_STRING: field = g_strdup(m_scanner->value.v_string); if (g_scanner_get_next_token(m_scanner) != G_TOKEN_EQUAL_SIGN) { err("Processing parse configuration: Expected equal sign."); return false; } cur_token = g_scanner_get_next_token(m_scanner); if (cur_token == G_TOKEN_STRING) { conf_value = g_strdup(m_scanner->value.v_string); if (!strcmp(field, "MODE")) { if (!strcmp(conf_value, "INIT")) { m_mode = INIT; } else if (!strcmp(conf_value, "UPDDATE")) { m_mode = UPDATE; } else { err("Processing parse configuration: Unknown File mode"); return false; } } else { stdlog << "WARN: Unknown configuration string - we will ignore it: " << field << "\n"; } } else if (cur_token == G_TOKEN_FLOAT) { conf_float = m_scanner->value.v_float; if (!strcmp(field, "VERSION")) { if (conf_float != m_version) { stdlog << "WARN: Version of file " << conf_float << " is not equal "; stdlog << "to own version " << m_version << "! - Hope it works\n"; } } } else { stdlog << "WARN: Unknow kind of configuration value\n"; } break; case G_TOKEN_LEFT_CURLY: m_depth++; break; case G_TOKEN_RIGHT_CURLY: m_depth--; break; default: err("Processing parse configuration: Unknown token"); return false; } } stdlog << "DBG: process_configuration_token - Set file mode on " << m_mode << "\n"; return true; } /** * Read one RPT section * * Startpoint is token \c G_TOKEN_RIGHT_CURLY. Endpoint is the last * \c G_TOKEN_RIGHT_CURLY of one \c RPT section.\n * The information is stored inside a NewSimulatorResource object which * is added to the domain by calling NewSimulatorDomain::AddResource(). * * @param domain Pointer to a NewSimulatorDomain object * * @return success bool * **/ bool NewSimulatorFile::process_rpt_token( NewSimulatorDomain *domain ) { guint cur_token = g_scanner_get_next_token(m_scanner); char *rptfield; NewSimulatorResource *res = new NewSimulatorResource( domain ); bool success = true; if (g_scanner_get_next_token(m_scanner) != G_TOKEN_LEFT_CURLY) { err("Processing parse configuration: Expected left curly token."); return false; } m_depth++; while ((m_depth > 0) && success) { cur_token = g_scanner_get_next_token(m_scanner); switch (cur_token) { case G_TOKEN_EOF: err("Processing parse rpt entry: File ends too early"); success = false; break; case G_TOKEN_RIGHT_CURLY: m_depth--; break; case G_TOKEN_LEFT_CURLY: m_depth++; break; case G_TOKEN_STRING: rptfield = g_strdup(m_scanner->value.v_string); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rpt entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (!strcmp("EntryId", rptfield)) { if (cur_token == G_TOKEN_INT) { res->EntryId() = m_scanner->value.v_int; stdlog << "DBG: rpt - entityId " << res->EntryId() << "\n"; } else { err("Processing parse rpt entry: Wrong kind of EntryId"); } } else if (!strcmp("ResourceId", rptfield)) { // will be assigned by the daemon -> ignore it stdlog << "DBG: rpt - ResourceId is ignored\n"; } else if (!strcmp("ResourceInfo", rptfield)) { stdlog << "DBG: rpt - ResourceInfo must be proccessed\n"; SaHpiResourceInfoT info; if ( (cur_token == G_TOKEN_LEFT_CURLY) && process_rpt_info( &info ) ) { res->SetResourceInfo( info ); } else { success = false; err("Processing parse rpt info returns parse error"); } } else if (!strcmp("ResourceEntity", rptfield)) { stdlog << "DBG: rpt - ResourceEntity\n"; if (cur_token == G_TOKEN_LEFT_CURLY) { m_depth++; cur_token = g_scanner_get_next_token(m_scanner); if (cur_token == G_TOKEN_STRING) { gchar *val_str; val_str = g_strdup(m_scanner->value.v_string); res->EntityPath().FromString(val_str); res->EntityPath().ReplaceRoot( m_root_ep ); stdlog << "DBG: rpt - Enitity " << res->EntityPath() << "\n"; } else { success = false; err("Processing parse rpt - wrong EntityPath value"); } cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_RIGHT_CURLY) { success = false; err("Processing parse rpt - Missing right culy"); } m_depth--; } else { err("Processing parse rpt entry: Missing left curly"); } } else if (!strcmp("ResourceCapabilities", rptfield)) { if (cur_token == G_TOKEN_INT) { res->ResourceCapabilities() = m_scanner->value.v_int; stdlog << "DBG: rpt - ResourceCapabilities " << res->ResourceCapabilities() << "\n"; } else { err("Processing parse rpt entry: Wrong kind of ResourceCapabilities"); } } else if (!strcmp("HotSwapCapabilities", rptfield)) { if (cur_token == G_TOKEN_INT) { res->HotSwapCapabilities() = m_scanner->value.v_int; stdlog << "DBG: rpt - HotSwapCapabilities " << res->HotSwapCapabilities() << "\n"; } else { err("Processing parse rpt entry: Wrong kind of HotSwapCapabilities"); } } else if (!strcmp("ResourceSeverity", rptfield)) { if (cur_token == G_TOKEN_INT) { res->ResourceSeverity() = (SaHpiSeverityT) m_scanner->value.v_int; stdlog << "DBG: rpt - ResourceSeverity " << res->ResourceSeverity() << "\n"; } else { err("Processing parse rpt entry: Wrong kind of ResourceSeverity"); } } else if (!strcmp("ResourceFailed", rptfield)) { if (cur_token == G_TOKEN_INT) { res->ResourceFailed() = m_scanner->value.v_int; stdlog << "DBG: rpt - ResourceFailed " << res->ResourceFailed() << "\n"; } else { err("Processing parse rpt entry: Wrong kind of ResourceFailed"); } } else if (!strcmp("ResourceTag", rptfield)) { if ( cur_token == G_TOKEN_LEFT_CURLY ) { success = process_textbuffer( res->ResourceTag() ); } else { err("Processing parse rpt entry: Couldn't parse ResourceTag"); } } else { // Unknown Token err("Processing parse rpt entry: Unknown Rpt field %s", rptfield); success = false; } break; case RDR_TOKEN_HANDLER: stdlog << "DBG: Add resource to domain\n"; domain->AddResource(res); success = process_rdr_token(res); break; default: err("Processing parse rpt entry: Unknown token"); success = false; break; } } return success; } /** * Read one RDR section * * Startpoint is token \c RDR_TOKEN_HANDLER. Endpoint is the last * \c G_TOKEN_RIGHT_CURLY of the \c RDR section. The rdr entries are added to * the resource.\n * * @param resource pointer * * @return success bool * **/ bool NewSimulatorFile::process_rdr_token( NewSimulatorResource *res ) { int start = m_depth; bool success = true; bool emptyrun = false; NewSimulatorRdr *rdr = NULL; NewSimulatorFileRdr *filerdr = NULL; guint cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_LEFT_CURLY) { err("Processing parse configuration: Expected left curly token."); return false; } m_depth++; while ((m_depth > start) && success) { cur_token = g_scanner_get_next_token(m_scanner); switch (cur_token) { case G_TOKEN_EOF: err("Processing parse rdr entry: File ends too early"); success = false; break; case G_TOKEN_RIGHT_CURLY: m_depth--; break; case G_TOKEN_LEFT_CURLY: m_depth++; break; case SENSOR_TOKEN_HANDLER: filerdr = new NewSimulatorFileSensor( m_scanner ); break; case CONTROL_TOKEN_HANDLER: filerdr = new NewSimulatorFileControl( m_scanner ); break; case INVENTORY_TOKEN_HANDLER: filerdr = new NewSimulatorFileInventory( m_scanner ); break; case ANNUNCIATOR_TOKEN_HANDLER: filerdr = new NewSimulatorFileAnnunciator( m_scanner ); break; case WATCHDOG_TOKEN_HANDLER: filerdr = new NewSimulatorFileWatchdog( m_scanner ); break; case FUMI_TOKEN_HANDLER: filerdr = new NewSimulatorFileFumi( m_scanner ); break; case DIMI_TOKEN_HANDLER: filerdr = new NewSimulatorFileDimi( m_scanner ); break; default: err("Processing parse rdr entry: Unknown token"); success = false; break; } // Process the token section if (filerdr != NULL) { filerdr->setRoot( m_root_ep ); success = filerdr->process_rdr_token(); stdlog << "DBG: process_rdr_token returns " << success << "\n"; if (success) rdr = filerdr->process_token( res ); if ( rdr != NULL ) { stdlog << "DBG: Dump the input.\n"; rdr->Dump( stdlog ); stdlog << "DBG: End Dump -----.\n"; } delete filerdr; filerdr = NULL; } else if (emptyrun) { success = process_empty(); emptyrun = false; } if (success && (rdr != NULL)) { success = res->AddRdr( rdr ); rdr = NULL; } } // while RDR TOKEN stdlog << "DBG: Populate the resource including all rdr information.\n"; if (res->Populate()) { stdlog << "DBG: Resource::Populate was successful.\n"; } else { stdlog << "DBG: Resource::Populate returns an error.\n"; success = false; } return success; } /** * Read SaHpiResourceInfoT information * * Startpoint is token \c G_TOKEN_LEFT_CURLY. Endpoint is \c G_TOKEN_RIGHT_CURLY if * no error occurs during parsing.\n * * @param rptinfo Pointer to SaHpiResourceInfoT structure * * @return success bool **/ bool NewSimulatorFile::process_rpt_info(SaHpiResourceInfoT *rptinfo) { bool success = true; char *field = NULL; guint cur_token = g_scanner_get_next_token(m_scanner); if (cur_token == G_TOKEN_STRING) { field = g_strdup(m_scanner->value.v_string); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rpt entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); } else if (cur_token == G_TOKEN_RIGHT_CURLY) { err("Processing parse rpt info: Empty Info field"); success = false; } else { err("Processing parse rpt info: Unknown token"); success = false; } while ((cur_token != G_TOKEN_RIGHT_CURLY) && success) { gulong val = 0L; gchar *val_str = NULL; int i; if (cur_token == G_TOKEN_INT) { val = m_scanner->value.v_hex; } else if (cur_token == G_TOKEN_STRING) { val_str = g_strdup(m_scanner->value.v_string); } else { err("Processing parse rpt info: unknow value type %u", cur_token); success = false; } if (!strcmp( "ResourceRev", field )) { rptinfo->ResourceRev = val; } else if (!strcmp( "SpecificVer", field )) { rptinfo->SpecificVer = val; } else if (!strcmp( "DeviceSupport", field )) { rptinfo->DeviceSupport = val; } else if (!strcmp( "ManufacturerId", field )) { rptinfo->ManufacturerId = val; } else if (!strcmp( "ProductId", field )) { rptinfo->ProductId = val; } else if (!strcmp( "FirmwareMajorRev", field )) { rptinfo->FirmwareMajorRev = val; } else if (!strcmp( "FirmwareMinorRev", field )) { rptinfo->FirmwareMinorRev = val; } else if (!strcmp( "AuxFirmwareRev", field )) { rptinfo->AuxFirmwareRev = val; } else if (!strcmp( "Guid", field )) { success = process_hexstring( 16, val_str, &(rptinfo->Guid[0]) ); stdlog << "DBG: rptinfo: Parsing GUID "; for (i = 0; i < 16; i++) stdlog << rptinfo->Guid[i] << " "; stdlog << "\n"; } else { err("Processing parse rpt info: unknown field %s", field); } cur_token = g_scanner_get_next_token(m_scanner); if (cur_token == G_TOKEN_STRING) { field = g_strdup(m_scanner->value.v_string); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rpt entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); } } return success; } /** * Go to the end of a section without reading values * * Startpoint is token \c TOKEN. Endpoint is \c G_TOKEN_RIGHT_CURLY of this token. * * @return success bool **/ bool NewSimulatorFile::process_empty() { int start = m_depth; guint cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_LEFT_CURLY) { err("Processing parse configuration: Expected left curly token."); return false; } m_depth++; while (m_depth > start) { cur_token = g_scanner_get_next_token(m_scanner); if (cur_token == G_TOKEN_LEFT_CURLY) { m_depth++; } else if (cur_token == G_TOKEN_RIGHT_CURLY) { m_depth--; } } return true; } openhpi-3.6.1/plugins/dynamic_simulator/new_sim_sensor_threshold.h0000644000175100017510000000565712575647274024676 0ustar mohanmohan/** * @file new_sim_sensor_threshold.h * * The file includes a class for threshold sensor handling:\n * NewSimulatorSensorThreshold * * @author Lars Wetzel * @version 0.2 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * */ #ifndef __NEW_SIM_SENSOR_THRESHOLD_H__ #define __NEW_SIM_SENSOR_THRESHOLD_H__ #ifndef __NEW_SIM_SENSOR_H__ #include "new_sim_sensor.h" #endif /** * @class NewSimulatorSensorThreshold * * Class for simulating threshold sensors * **/ class NewSimulatorSensorThreshold : public NewSimulatorSensor { private: SaHpiSensorThdMaskT m_read_thold; SaHpiSensorThdMaskT m_write_thold; SaHpiSensorThresholdsT m_thres; SaErrorT checkThresholdValue( const SaHpiSensorReadingT &checkval, SaHpiSensorRangeFlagsT flag, SaHpiSensorReadingT &setval ); SaErrorT checkHysteresisValue( const SaHpiSensorReadingT &checkval, SaHpiSensorRangeFlagsT flag, SaHpiSensorReadingT &setval ); SaErrorT checkOrdering( const SaHpiSensorThresholdsT &thres ); void setMask( SaHpiSensorThresholdsT &thres, const SaHpiSensorThdMaskT mask); public: NewSimulatorSensorThreshold( NewSimulatorResource *res ); NewSimulatorSensorThreshold( NewSimulatorResource *res, SaHpiRdrT rdr, SaHpiSensorReadingT data, SaHpiEventStateT event_state, SaHpiEventStateT event_amask, SaHpiEventStateT event_dmask, SaHpiSensorThresholdsT thresholds, SaHpiBoolT enabled, SaHpiBoolT event_enabled); virtual ~NewSimulatorSensorThreshold(); virtual void HandleNew( NewSimulatorDomain *domain ); // virtual SaErrorT CreateEvent( NewSimulatorEvent *event, SaHpiEventT &h ); // print some data virtual void Dump( NewSimulatorLog &dump ) const; // Compare to Sensors bool Cmp( const NewSimulatorSensor &s2 ) const; // create an RDR sensor record virtual bool CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ); // official hpi functions // get sensor data SaErrorT GetSensorReading( SaHpiSensorReadingT &data, SaHpiEventStateT &state ); // get thresholds data SaErrorT GetThresholds( SaHpiSensorThresholdsT &thres ); // helper functions for SetThresholdsAndHysteresis SaErrorT SetThresholds( const SaHpiSensorThresholdsT &thres ); }; #endif openhpi-3.6.1/plugins/dynamic_simulator/new_sim_inventory.cpp0000644000175100017510000004103612575647274023670 0ustar mohanmohan/** * @file new_sim_inventory.cpp * * The file includes a class for inventory handling:\n * NewSimulatorInventory * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * */ #include #include #include #include #include #include "new_sim_domain.h" #include "new_sim_inventory.h" #include "new_sim_inventory_data.h" #include "new_sim_entity.h" /** * Constructor **/ NewSimulatorInventory::NewSimulatorInventory( NewSimulatorResource *res ) : NewSimulatorRdr( res, SAHPI_INVENTORY_RDR ), m_area_id( 0 ) { memset( &m_inv_rec, 0, sizeof( SaHpiInventoryRecT )); memset( &m_inv_info, 0, sizeof( SaHpiIdrInfoT )); } /** * Full qualified constructor to fill an object with the parsed data **/ NewSimulatorInventory::NewSimulatorInventory( NewSimulatorResource *res, SaHpiRdrT rdr) : NewSimulatorRdr( res, SAHPI_INVENTORY_RDR, rdr.Entity, rdr.IsFru, rdr.IdString ), m_area_id( 0 ) { memcpy(&m_inv_rec, &rdr.RdrTypeUnion.InventoryRec, sizeof( SaHpiInventoryRecT )); memset( &m_inv_info, 0, sizeof( SaHpiIdrInfoT )); } /** * Full qualified constructor to fill an object with the parsed data including idr_info **/ NewSimulatorInventory::NewSimulatorInventory( NewSimulatorResource *res, SaHpiRdrT rdr, SaHpiIdrInfoT inv_info) : NewSimulatorRdr( res, SAHPI_INVENTORY_RDR, rdr.Entity, rdr.IsFru, rdr.IdString ), m_area_id( 0 ) { memcpy(&m_inv_rec, &rdr.RdrTypeUnion.InventoryRec, sizeof( SaHpiInventoryRecT )); memcpy(&m_inv_info, &inv_info, sizeof( SaHpiIdrInfoT )); } /** * Destructor **/ NewSimulatorInventory::~NewSimulatorInventory() { m_areas.RemAll(); } /** * Dump the Inventory information * * @param dump Address of the log * **/ void NewSimulatorInventory::Dump( NewSimulatorLog &dump ) const { dump << "Inventory: " << m_inv_rec.IdrId << "\n"; dump << "Persistent: " << m_inv_rec.Persistent << "\n"; dump << "Oem: " << m_inv_rec.Oem << "\n"; dump << "Area(s): " << "\n"; dump << "-------------------\n"; for (int i= 0; i < m_areas.Num(); i++) { m_areas[i]->Dump( dump ); } } /** * A rdr structure is filled with the data * * This method is called by method NewSimulatorRdr::Populate(). * * @param resource Address of resource structure * @param rdr Address of rdr structure * * @return true **/ bool NewSimulatorInventory::CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ) { if ( NewSimulatorRdr::CreateRdr( resource, rdr ) == false ) return false; // Inventory record memcpy(&rdr.RdrTypeUnion.InventoryRec, &m_inv_rec, sizeof(SaHpiInventoryRecT)); return true; } /** * Find area by area pointer * * @param area pointer on the inventory area to be found * @return return the same pointer if it could be found successfully **/ NewSimulatorInventoryArea *NewSimulatorInventory::FindInventoryArea( NewSimulatorInventoryArea *area ) { for( int i = 0; i < m_areas.Num(); i++ ) { NewSimulatorInventoryArea *ia = m_areas[i]; if ( ia == area ) return area; } return 0; } /** * Add a inventory area to the array if it isn't already included in the array * * @param area pointer to area to be added * @return bool if successful **/ bool NewSimulatorInventory::AddInventoryArea( NewSimulatorInventoryArea *area ) { if ( FindInventoryArea( area ) ) { return false; } if (area->Num() > m_area_id) m_area_id = area->Num(); m_areas.Add( area ); m_inv_info.NumAreas = m_areas.Num(); return true; } /** * Set inventory record data * * @param idrRec InventoryRecord data * @return true (simple copy) **/ bool NewSimulatorInventory::SetData( SaHpiInventoryRecT idrRec ) { memcpy( &m_inv_rec, &idrRec, sizeof( SaHpiInventoryRecT )); return true; } /** * Set inventory information data * The fields UpdateCount and NumAreas are filled with internal values and are not * overwritten. * * @param idrInfo record with IdrInfo data * @return true **/ bool NewSimulatorInventory::SetInfo( SaHpiIdrInfoT idrInfo ) { m_inv_info.IdrId = idrInfo.IdrId; m_inv_info.ReadOnly = idrInfo.ReadOnly; // UpdateCount is incremented if an official HPI function is called // NumAreas is filled with the own value m_inv_info.NumAreas = m_areas.Num(); return true; } // Official HPI functions /** * HPI function saHpiIdrInfoGet() * * See also the description of the function inside the specification or header file. * Copying the internal reading values (if a read is allowed). * * @param idrInfo address of the IdrInfo record to be filled * * @return HPI return code **/ SaErrorT NewSimulatorInventory::GetIdrInfo( SaHpiIdrInfoT &idrInfo ) { if ( &idrInfo == NULL) return SA_ERR_HPI_INVALID_PARAMS; m_inv_info.NumAreas = m_areas.Num(); memcpy( &idrInfo, &m_inv_info, sizeof( SaHpiIdrInfoT )); return SA_OK; } /** * HPI function saHpiIdrAreaHeaderGet() * * See also the description of the function inside the specification or header file. * Copying the internal reading values (if a read is allowed). * * @param type type of area to be found * @param areaId Id of area to be found * @param nextId address to copy the Id of the next area header * @param header address to be filled with the area header record * * @return HPI return code **/ SaErrorT NewSimulatorInventory::GetAreaHeader( SaHpiIdrAreaTypeT type, SaHpiEntryIdT areaId, SaHpiEntryIdT &nextId, SaHpiIdrAreaHeaderT &header) { bool found = false, foundId = false, foundType = false; if ((areaId == SAHPI_LAST_ENTRY) || (&nextId == NULL) || (&header == NULL)) return SA_ERR_HPI_INVALID_PARAMS; for (int i = 0; i < m_areas.Num(); i++) { if ( (areaId == SAHPI_FIRST_ENTRY) || (areaId == m_areas[i]->Num()) ) foundId = true; if ( (type == SAHPI_IDR_AREATYPE_UNSPECIFIED) || (type == m_areas[i]->Type()) ) foundType = true; if (found) { nextId = m_areas[i]->Num(); return SA_OK; } if (foundType && foundId) { if (!found) { found = true; memcpy( &header, &m_areas[i]->AreaHeader(), sizeof( SaHpiIdrAreaHeaderT )); } } foundId = false; foundType = false; } if (found) { nextId = SAHPI_LAST_ENTRY; return SA_OK; } return SA_ERR_HPI_NOT_PRESENT; } /** * HPI function saHpiIdrAreaAdd() * * See also the description of the function inside the specification or header file. * * @param type type of area to add * @param newId address to copy the Id of the new area header * * @return HPI return code **/ SaErrorT NewSimulatorInventory::AddArea( SaHpiIdrAreaTypeT type, SaHpiEntryIdT &newId ) { if ( IsReadOnly() ) return SA_ERR_HPI_READ_ONLY; if ( &newId == NULL ) return SA_ERR_HPI_INVALID_PARAMS; if ( type == SAHPI_IDR_AREATYPE_UNSPECIFIED ) return SA_ERR_HPI_INVALID_DATA; if ( !(( type == SAHPI_IDR_AREATYPE_INTERNAL_USE ) || ( type == SAHPI_IDR_AREATYPE_CHASSIS_INFO ) || ( type == SAHPI_IDR_AREATYPE_BOARD_INFO ) || ( type == SAHPI_IDR_AREATYPE_PRODUCT_INFO ) || ( type == SAHPI_IDR_AREATYPE_OEM )) ) return SA_ERR_HPI_INVALID_PARAMS; // Ok, we can add a new area SaHpiIdrAreaHeaderT ah; ah.AreaId = ValidAreaId(); ah.Type = type; ah.ReadOnly = SAHPI_FALSE; ah.NumFields = 0; NewSimulatorInventoryArea *ida = new NewSimulatorInventoryArea( ah ); if ( AddInventoryArea( ida ) ) { newId = ida->Num(); IncUpdateCount(); return SA_OK; } else { return SA_ERR_HPI_INVALID_DATA; } } /** * HPI function saHpiIdrAreaAddById() * * See also the description of the function inside the specification or header file. * * @param type Type of Area to add * @param id AreaId for the new Area to be created * * @return HPI return code **/ SaErrorT NewSimulatorInventory::AddAreaById( SaHpiIdrAreaTypeT type, SaHpiEntryIdT id ) { // Ok, we can try to add a new area stdlog << "DBG: NewSimulatorInventory::AddAreaById Try to add a new area by id.\n"; if ( IsReadOnly() ) return SA_ERR_HPI_READ_ONLY; if ( type == SAHPI_IDR_AREATYPE_UNSPECIFIED ) return SA_ERR_HPI_INVALID_DATA; if ( !(( type == SAHPI_IDR_AREATYPE_INTERNAL_USE ) || ( type == SAHPI_IDR_AREATYPE_CHASSIS_INFO ) || ( type == SAHPI_IDR_AREATYPE_BOARD_INFO ) || ( type == SAHPI_IDR_AREATYPE_PRODUCT_INFO ) || ( type == SAHPI_IDR_AREATYPE_OEM )) ) return SA_ERR_HPI_INVALID_PARAMS; if ( id == SAHPI_LAST_ENTRY ) return SA_ERR_HPI_INVALID_PARAMS; SaHpiIdrAreaHeaderT ah; NewSimulatorInventoryArea *ida; ah.Type = type; ah.ReadOnly = SAHPI_FALSE; ah.NumFields = 0; if ( id == SAHPI_FIRST_ENTRY ) { ah.AreaId = ValidAreaId(); ida = new NewSimulatorInventoryArea( ah ); m_areas.Insert( 0, ida ); IncUpdateCount(); stdlog << "DBG: Area was added with id " << ah.AreaId << "\n"; return SA_OK; } ah.AreaId = id; for (int i=0; i < m_areas.Num(); i++) { if ( m_areas[i]->Num() == id ) return SA_ERR_HPI_DUPLICATE; } ida = new NewSimulatorInventoryArea( ah ); if ( AddInventoryArea( ida ) ) { IncUpdateCount(); return SA_OK; } else { return SA_ERR_HPI_INVALID_DATA; } } /** * HPI function saHpiIdrAreaDel() * * See also the description of the function inside the specification or header file. * * @param id Identifier of Area entry to delete from the IDR * * @return HPI return code **/ SaErrorT NewSimulatorInventory::DeleteArea( SaHpiEntryIdT id ) { NewSimulatorInventoryArea *ida = NULL; int idx = -1; if ( IsReadOnly() ) return SA_ERR_HPI_READ_ONLY; if ( id == SAHPI_LAST_ENTRY ) return SA_ERR_HPI_INVALID_PARAMS; // Find the correct area if ( id == SAHPI_FIRST_ENTRY ) { ida = m_areas[0]; idx = 0; } else { for (int i=0; i < m_areas.Num(); i++) { if (m_areas[i]->Num() == id) { ida = m_areas[i]; idx = i; break; } } if ( ida == NULL ) return SA_ERR_HPI_NOT_PRESENT; } if ( ida->IsReadOnly() ) return SA_ERR_HPI_READ_ONLY; if ( ida->IncludesReadOnlyField() ) return SA_ERR_HPI_READ_ONLY; ida->DeleteFields(); m_areas.Rem( idx ); IncUpdateCount(); return SA_OK; } /** * Start for HPI function saHpiIdrFieldGet() * * See also the description of the function inside the specification or header file. * Inside the method the correct AreaId is identified and afterwards * NewSimulatorInventoryArea::GetField() is called. * * @param areaId Identifier for the IDA * @param fieldType Type of Inventory Data Field * @param fieldId Identifier of Field to retrieve * @param nextId address to store the FieldId of next field * @param field address into which the field information is placed * * @return HPI return code **/ SaErrorT NewSimulatorInventory::GetField( SaHpiEntryIdT areaId, SaHpiIdrFieldTypeT fieldType, SaHpiEntryIdT fieldId, SaHpiEntryIdT &nextId, SaHpiIdrFieldT &field ) { if ( ( areaId == SAHPI_LAST_ENTRY ) || ( fieldId == SAHPI_LAST_ENTRY ) ) return SA_ERR_HPI_INVALID_PARAMS; for (int i=0; i < m_areas.Num(); i++) { if ( ( m_areas[i]->Num() == areaId ) || ( areaId == SAHPI_FIRST_ENTRY ) ) return m_areas[i]->GetField( fieldType, fieldId, nextId, field ); } return SA_ERR_HPI_NOT_PRESENT; } /** * Start for HPI function saHpiIdrFieldAdd() * * See also the description of the function inside the specification or header file. * Inside the method the correct AreaId is identified and afterwards * NewSimulatorInventoryArea::AddField() is called * * @param field address to the field to add to the IDA * * @return HPI return code **/ SaErrorT NewSimulatorInventory::AddField( SaHpiIdrFieldT &field ) { int i; SaErrorT rv; if ( ( field.AreaId == SAHPI_LAST_ENTRY ) || ( field.FieldId == SAHPI_LAST_ENTRY ) ) return SA_ERR_HPI_INVALID_PARAMS; for (i=0; i < m_areas.Num(); i++) { if ( ( m_areas[i]->Num() == field.AreaId ) || ( field.AreaId == SAHPI_FIRST_ENTRY ) ) { if ( m_areas[i]->IsReadOnly() ) return SA_ERR_HPI_READ_ONLY; rv = m_areas[i]->AddField( field ); if ( rv == SA_OK ) IncUpdateCount(); return rv; } } return SA_ERR_HPI_NOT_PRESENT; } /** * Start for HPI function saHpiIdrFieldAddById() * * See also the description of the function inside the specification or header file. * Inside the method the correct AreaId is identified and afterwards * NewSimulatorInventoryArea::AddFieldById() is called * * @param field address of field to add to the IDA * * @return HPI return code **/ SaErrorT NewSimulatorInventory::AddFieldById( SaHpiIdrFieldT &field ) { SaErrorT rv; int i; if ( ( field.AreaId == SAHPI_LAST_ENTRY ) || ( field.FieldId == SAHPI_LAST_ENTRY ) ) return SA_ERR_HPI_INVALID_PARAMS; for (i=0; i < m_areas.Num(); i++) { if ( ( m_areas[i]->Num() == field.AreaId ) || ( field.AreaId == SAHPI_FIRST_ENTRY ) ) { if ( m_areas[i]->IsReadOnly() ) return SA_ERR_HPI_READ_ONLY; rv = m_areas[i]->AddFieldById( field ); if ( rv == SA_OK ) IncUpdateCount(); return rv; } } return SA_ERR_HPI_NOT_PRESENT; } /** * Start for HPI function saHpiIdrFieldSet() * * See also the description of the function inside the specification or header file. * Inside the method the correct AreaId is identified and afterwards * NewSimulatorInventoryArea::SetField() is called * * @param field field to set in the IDA * * @return HPI return code **/ SaErrorT NewSimulatorInventory::SetField( SaHpiIdrFieldT field ) { SaErrorT rv; int i; if ( ( field.AreaId == SAHPI_LAST_ENTRY ) || ( field.FieldId == SAHPI_LAST_ENTRY ) ) return SA_ERR_HPI_INVALID_PARAMS; for (i=0; i < m_areas.Num(); i++) { if ( ( m_areas[i]->Num() == field.AreaId ) || ( field.AreaId == SAHPI_FIRST_ENTRY ) ) { rv = m_areas[i]->SetField( field ); if ( rv == SA_OK ) IncUpdateCount(); return rv; } } return SA_ERR_HPI_NOT_PRESENT; } /** * Start for HPI function saHpiIdrFieldDelete() * * See also the description of the function inside the specification or header file. * Inside the method the correct AreaId is identified and afterwards * NewSimulatorInventoryArea::DeleteField() is called * * @param areaId identifier for the IDA * @param fieldId Identifier of Field to delete from the IDA * * @return HPI return code **/ SaErrorT NewSimulatorInventory::DeleteField( SaHpiEntryIdT areaId, SaHpiEntryIdT fieldId ) { SaErrorT rv; if ( ( areaId == SAHPI_LAST_ENTRY ) || ( fieldId == SAHPI_LAST_ENTRY ) ) return SA_ERR_HPI_INVALID_PARAMS; for (int i=0; i < m_areas.Num(); i++) { if ( ( m_areas[i]->Num() == areaId ) || ( areaId == SAHPI_FIRST_ENTRY ) ) { if ( m_areas[i]->IsReadOnly() ) return SA_ERR_HPI_READ_ONLY; rv = m_areas[i]->DeleteField( fieldId ); if ( rv == SA_OK ) IncUpdateCount(); return rv; } } return SA_ERR_HPI_NOT_PRESENT; } openhpi-3.6.1/plugins/dynamic_simulator/new_sim_domain.cpp0000644000175100017510000002161512575647274023103 0ustar mohanmohan/** * @file new_sim_domain.cpp * * The file includes the abstract domain class:\n * NewSimulatorDomain * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * The new Simulator plugin is adapted from the ipmidirect plugin. * Thanks to \n * Thomas Kanngieser \n * Pierre Sangouard * */ #include #include "new_sim.h" #include "new_sim_utils.h" #include "new_sim_file.h" /** * Constructor **/ NewSimulatorDomain::NewSimulatorDomain() : m_file( 0 ), m_major_version( 0 ), m_minor_version( 0 ), m_initial_discover( 0 ) { m_did = 0; m_own_domain = false; m_running_wdt = false; m_running_fumi = false; m_insert_timeout = SAHPI_TIMEOUT_IMMEDIATE; m_extract_timeout = SAHPI_TIMEOUT_IMMEDIATE; stdlog << "DBG: NewSimulatorDomain.Constructor is called\n"; } /** * Destructor **/ NewSimulatorDomain::~NewSimulatorDomain() { } /** * Initialization and filling the domain with resources and rdr by * calling NewSimulatorFile::Discover(). * * @todo Here the domain is set hard coded to '0'. How should this be done for more than one * domain ...? * * @param file pointer to NewSimulatorfile which includes system information * @return true **/ bool NewSimulatorDomain::Init( NewSimulatorFile *file ) { stdlog << "DBG: We are inside NewSimulatorDomain::Init\n"; if ( m_file != 0 ) { stdlog << "New Simulator Domain already initialized !\n"; return false; } m_file = file; file->Discover( this ); m_did = 0; stdlog << "Domain ID " << m_did << "\n"; Dump( stdlog ); return true; } /** * Ceanup all resources in the domain **/ void NewSimulatorDomain::Cleanup() { int i; // cleanup all Resources for( i = m_resources.Num() - 1; i >= 0; i-- ) { NewSimulatorResource *res = m_resources[i]; CleanupResource( res ); } // now all resources are ready to destroy while( m_resources.Num() ) { NewSimulatorResource *res = m_resources[0]; CleanupResource( res ); } } /** * Verify Resource * * @param res pointer on a NewSimulatorResource to be verified * @return res pointer for successful verification **/ NewSimulatorResource *NewSimulatorDomain::VerifyResource( NewSimulatorResource *res ) { stdlog << "DBG: VerifyResource \n"; for( int i = 0; i < m_resources.Num(); i++ ) { NewSimulatorResource *m_res = m_resources[i]; if ( res == m_res ) return res; } return 0; } /** * Verify Rdr * * @param rdr pointer on a NewSimulatorRdr to be verified * @return rdr pointer for successful verification **/ NewSimulatorRdr *NewSimulatorDomain::VerifyRdr( NewSimulatorRdr *rdr ) { stdlog << "DBG: VerifyRdr \n"; for( int i = 0; i < m_resources.Num(); i++ ) { NewSimulatorResource *m_res = m_resources[i]; if ( m_res->FindRdr( rdr ) >= 0 ) return rdr; } return 0; } /** * Verify Sensor * * @param s pointer on a NewSimulatorSensor to be verified * @return s pointer for successfull verification **/ NewSimulatorSensor *NewSimulatorDomain::VerifySensor( NewSimulatorSensor *s ) { stdlog << "DBG: VerifySensor \n"; for( int i = 0; i < m_resources.Num(); i++ ) { NewSimulatorResource *m_res = m_resources[i]; if ( m_res->FindRdr( s ) >= 0 ) return s; } return 0; } /** * Verify Control * * @param c pointer on a NewSimulatorControl to be verified * @return c pointer for successfull verification **/ NewSimulatorControl *NewSimulatorDomain::VerifyControl( NewSimulatorControl *c ) { for( int i = 0; i < m_resources.Num(); i++ ) { NewSimulatorResource *m_res = m_resources[i]; if ( m_res->FindRdr( c ) >= 0 ) return c; } return 0; } /** * Verify Annunciator * * @param a pointer on a NewSimulatorAnnunciator to be verified * @return a pointer for successfull verification **/ NewSimulatorAnnunciator *NewSimulatorDomain::VerifyAnnunciator( NewSimulatorAnnunciator *a ) { stdlog << "DBG: VerifyAnnunciator \n"; for( int i = 0; i < m_resources.Num(); i++ ) { NewSimulatorResource *m_res = m_resources[i]; if ( m_res->FindRdr( a ) >= 0 ) return a; } return 0; } /** * Verify Watchdog * * @param c pointer on a NewSimulatorInventory object to be verified * @return c pointer for successfull verification **/ NewSimulatorWatchdog *NewSimulatorDomain::VerifyWatchdog ( NewSimulatorWatchdog *c ) { for( int i = 0; i < m_resources.Num(); i++ ) { NewSimulatorResource *m_res = m_resources[i]; if ( m_res->FindRdr( c ) >= 0 ) return c; } return 0; } /** * Verify Fumi * * @param f pointer on a NewSimulatorFumi object to be verified * @return f pointer for successfull verification **/ NewSimulatorFumi *NewSimulatorDomain::VerifyFumi ( NewSimulatorFumi *f ) { for( int i = 0; i < m_resources.Num(); i++ ) { NewSimulatorResource *m_res = m_resources[i]; if ( m_res->FindRdr( f ) >= 0 ) return f; } return 0; } /** * Verify Dimi * * @param d pointer on a NewSimulatorDimi object to be verified * @return d pointer for successfull verification **/ NewSimulatorDimi *NewSimulatorDomain::VerifyDimi ( NewSimulatorDimi *d ) { for( int i = 0; i < m_resources.Num(); i++ ) { NewSimulatorResource *m_res = m_resources[i]; if ( m_res->FindRdr( d ) >= 0 ) return d; } return 0; } /** * Verify Inventory * * @param inv pointer on a NewSimulatorInventory object to be verified * @return inv pointer for successfull verification **/ NewSimulatorInventory *NewSimulatorDomain::VerifyInventory( NewSimulatorInventory *inv ) { for( int i = 0; i < m_resources.Num(); i++ ) { NewSimulatorResource *m_res = m_resources[i]; if ( m_res->FindRdr( inv ) >= 0 ) return inv; } return 0; } /** * Dump some information about the resources hold in the domain * * For each resource in the array the dump method is called. * * @param dump Address of the NewSimulatorlog in which the dump should be written **/ void NewSimulatorDomain::Dump( NewSimulatorLog &dump ) const { dump << "Dump of NewSimulatorDomain is called\n" ; dump << "Count of resources: " << m_resources.Num() << "\n"; for (int i = 0; i < m_resources.Num(); i++) { NewSimulatorResource *m_res = m_resources[i]; m_res->Dump( dump ); } } /** * Cleanup one resource * * @param res Pointer on NewSimulorResource to be cleaned up * @return true if it was found and was deleted **/ bool NewSimulatorDomain::CleanupResource( NewSimulatorResource *res ) { if ( !res->Destroy() ) return false; int idx = m_resources.Find( res ); if ( idx == -1 ) { stdlog << "unable to find resource at " << idx << " in resources list !\n"; return false; } m_resources.Rem( idx ); delete res; return true; } /** * Get Resource * * @param i with the number of the resource * @return pointer on the resource which was found **/ NewSimulatorResource *NewSimulatorDomain::GetResource( int i ) { if ( i >= m_resources.Num() ) return 0; NewSimulatorResource *res = m_resources[i]; return res; } /** * Find resource by resource pointer * * @param res pointer on the resource to be found * @return return the same pointer if it could be found successfully **/ NewSimulatorResource *NewSimulatorDomain::FindResource( NewSimulatorResource *res ) { for( int i = 0; i < m_resources.Num(); i++ ) { NewSimulatorResource *r = m_resources[i]; if ( r == res ) return res; } return 0; } /** * Find resource by entity path * * @param ep address of entity path to be found * @return return pointer on resource if it could be found successfully **/ NewSimulatorResource *NewSimulatorDomain::FindResource( const NewSimulatorEntityPath &ep ) { for( int i = 0; i < m_resources.Num(); i++ ) { NewSimulatorResource *res = m_resources[i]; if ( res->EntityPath() == ep ) return res; } return 0; } /** * Add a resource to the domain * * @param res pointer to the resource **/ void NewSimulatorDomain::AddResource( NewSimulatorResource *res ) { if ( FindResource( res ) ) { assert( 0 ); return; } m_resources.Add( res ); } /** * Remove a resource from the domain * * @param res pointer to the resource **/ void NewSimulatorDomain::RemResource( NewSimulatorResource *res ) { int idx = m_resources.Find( res ); if ( idx == -1 ) { assert( 0 ); return; } m_resources.Rem( idx ); } openhpi-3.6.1/plugins/dynamic_simulator/README0000644000175100017510000001605012575647274020264 0ustar mohanmohan/*! @file README @author Lars Wetzel @version 0.1 @date 23.04.2010 @mainpage Dynamic Simulator plugin @section intro Introduction With the simulation plugins it is possible to run the openhpi daemon locally without having hardware for it in the background.\n Since the new simulation plugin gets its simulation data from a file instead of having it inside the code, the data can be changed without compiling the plugin afterwards. This is also the reason, why it is named "dynamic simulator". Due to the late change of the name, it could be that at some places the old name "new simulator" is used. I try to replace it step by step and any comment is welcome. But it was decided not to change the name of classes or files. So please don't wonder or be confused if the classes and files have still the old naming scheme.\n In combination with the \c hpigensimdata client you can generate your own simulation data based on a running system e.g. for demonstration purposes - see also @ref data.\n The plugin is written in C++ and adapts the ipmidirect plugin for simulation purposes. Therefore you will find many conformities between both plugins.\n Since it was tried not to introduce new libraries, the gnu lexical scanner was used for parsing the simulation data as it is used for the \e openhpid.conf file. A documentation of this scanner can be found at: http://library.gnome.org/devel/glib/stable/glib-Lexical-Scanner.html\n Don't hit me, but the documention was not done by the \c openhpi recommended tool. Instead of this \c doxygen is used for this purpose. The doxygen configuration file \c Doxyfile can be found in the main directory of the plugin. The documentation itself is in the file \c doc.html.tgz. A good description of this tool can be found at: http://www.stack.nl/~dimitri/doxygen/index.html\n @section architecture Plugin architecture As already mentioned the new simulator plugin is adapted from the ipmidirect plugin. Therefore many conformities can be found.\n To make it easier to enhance the plugin in the following some call hierarchies are given.\n @subsection start Build up of the simulation data The call hierarchy isn't as deep as for the ipmi plugin due to the missing micro controller classes (mc). But if you replace the communication layer of the ipmidirect plugin by the following simulation file handling, the call hierarchie is nearly the same:\n - NewSimulatorOpen Initialize handler and call - NewSimulator::IfOpen() -# open files (in NewSimulatorFile::Constructor) -# call of NewSimulatorFile::Open() and -# call of NewSimulatorDomain::Init() - NewSimulatorFile::Open() Initialize all tokens and parse \c CONFIG_TOKEN_HANDLER - NewSimulatorDomain::Init() call of NewSimulatorFile::Discover - NewSimulatorFile::Discover() Parsing the simulation file, beginning with \c RPT_TOKEN_HANDLER @subsection parse Parsing the simulation file As already mentioned the glib lexical scanner is used. All classes relevant for parsing the simulation data file start with NewSimulatorFilexxx (xxx is the component which should be parsed.). The rdr objects are generated by a fabric pattern. (To be correct for a real fabric pattern a interface class is missing including the switch - block for the RDR Types.)\n The start point is - NewSimulatorFile::Discover() call of process_rpt_token() - NewSimulatorFile::process_rpt_token() -# parsing the \c RPT section -# with the start of a \c RDR section a resource is added to the domain by calling NewSimulatorDomain::AddResource() - NewSimulatorFile::process_rdr_token() -# parse the \c RDR section. For each RDR entry the common rdr information is parsed by calling process_rdr_token(). -# In dependency of \c RDR type a NewSimulatorFilexxx object is initialized and process_token() of this object is called. - NewSimulatorFileRdr::process_rdr_token() parsing the common \c RDR information - NewSimulatorFileRdr::process_token() Method to be implemented by the child rdr classes. Return value is a pointer on a NewSimulatorRdr object. The object is insert in the Rdr cache by calling - NewSimulatorResource::AddRdr() @subsection hpifunction Calling a HPI function For each openhpi function alias \c oh_... a NewSimulator... function is defined inside the new plugin loader block of new_sim.cpp. Inside these functions the relevant rdr object is taken (function VerifyAndEnterXXX) and the relevant method is called of the object.\n In some cases some sub structures are needed (e.g. inventory areas and fields) In these cases first the relevant method of the \c RDR object is called (e.g. NewSimulatorInventory). Inside this object the correct sub object is identified, which is common an array entry. The implementation of such "sub ojects" can be found in the ..._data files (e.g. new_sim_inventory_data.cpp). @section data Simulation data The NewSimulator plugin reads at start a simulation file which includes the data to be simulated. The filename can be defined inside the plugin section of \e openhpid.conf. The default filename is \e simulation.data. The file can be found in the directory of the \e openhpid.conf file.\n The file itself is read only one time during the discovery phase. This means that the daemon has to be restarted if changes were made and should take effect.\n Small changes can be done easily in the file but if a whole system hardware should be simulated it is recommended to use the \c hpigensimdata client which is described in @ref datagen. @subsection datagen Generating own simulation data To generate a simulation file including the data of an own system, it is recommended to use the client \c hpigensimdata \c -f \c \.\n The content of \c \ is in ascii and can be modified using a text editor of chose. But at changing the file you should be aware to set the parenthesis correctly and take the correct names of variables.\n With the exception of config section and the token marks, all variable names are equivalent to the variables defined inside \c SafHpi.h. The values of the unions and defines are put as integer or hex values inside the file to spare the decoding at startup of the daemon (and development efforts ;-)).\n You can use this client also for dump a running system. But keep in mind that for reading e.g. the capability fields it is much easier to transfer also the values properly to text, which is not done by this client.\n @subsection restrictions As at the ipmidirect plugin, at the moment no UTF-8 text fields are supported.\n For announcements the timestamp is overwritten by the plugin when importing the data.\n **/ openhpi-3.6.1/plugins/dynamic_simulator/new_sim_file.h0000644000175100017510000000431012575647274022211 0ustar mohanmohan/** * @file new_sim_file.h * * The file includes the main class for parsing:\n * NewSimulatorFile\n * * @author Lars Wetzel * @version 0.2 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * */ #ifndef __NEW_SIM_FILE_H__ #define __NEW_SIM_FILE_H__ #include #include extern "C" { #include "SaHpi.h" } #ifndef __ARRAY_H__ #include "array.h" #endif /** #ifndef __NEW_SIM_DOMAIN_H__ #include "new_sim_domain.h" #endif **/ #ifndef __NEW_SIM_RESOURCE_H__ #include "new_sim_resource.h" #endif #ifndef __NEW_SIM_FILE_UTIL_H__ #include "new_sim_file_util.h" #endif class NewSimulatorDomain; /** * @class NewSimulatorFile * * Main class for parsing the simulation file. **/ class NewSimulatorFile : public NewSimulatorFileUtil { private: double m_version; //!< Version number int m_file; //!< Holding the FILE pointer int m_mode; //!< Switch if the class is running in UPDATE or INIT mode int m_depth; //!< Deepth concerning LEFT and RIGHT_CURLY cArray m_tokens; //!< Array with additional TOKENS of type SimulatorToken bool process_configuration_token(); bool process_rpt_token(NewSimulatorDomain *domain); bool process_rpt_info(SaHpiResourceInfoT *rptinfo); bool process_rdr_token( NewSimulatorResource *res ); bool process_empty(); public: NewSimulatorFile(const char *filename, NewSimulatorEntityPath root); ~NewSimulatorFile(); /** @enum mode in which the class can work **/ enum mode { INIT = 0, UPDATE, UNKNOWN }; bool Open(); bool Discover( NewSimulatorDomain *domain ); int &Mode() { return m_mode; } //!< Read/Write function fo the private m_mode }; #endif /*NEW_SIM_FILE_H_*/ openhpi-3.6.1/plugins/dynamic_simulator/new_sim_sensor_common.h0000644000175100017510000000343612575647274024163 0ustar mohanmohan/** * @file new_sim_sensor_common.h * * The file includes a class for common sensor handling:\n * NewSimulatorSensorCommon * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * */ #ifndef __NEW_SIM_SENSOR_COMMON_H__ #define __NEW_SIM_SENSOR_COMMON_H__ #ifndef __NEW_SIM_SENSOR_H__ #include "new_sim_sensor.h" #endif /** * @class NewSimulatorSensorCommon * * Class for simulating common sensors * **/ class NewSimulatorSensorCommon : public NewSimulatorSensor { public: NewSimulatorSensorCommon( NewSimulatorResource *res ); NewSimulatorSensorCommon( NewSimulatorResource *res, SaHpiRdrT rdr, SaHpiSensorReadingT data, SaHpiEventStateT event_state, SaHpiEventStateT event_amask, SaHpiEventStateT event_dmask, SaHpiBoolT enabled, SaHpiBoolT event_enabled); virtual ~NewSimulatorSensorCommon(); // create an hpi event from ipmi event // virtual SaErrorT CreateEvent( NewSimulatorEvent *event, SaHpiEventT &h ); // create an RDR sensor record virtual bool CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ); // get sensor data virtual SaErrorT GetSensorReading( SaHpiSensorReadingT &data, SaHpiEventStateT &state ); // print the data virtual void Dump( NewSimulatorLog &dump ) const; }; #endif openhpi-3.6.1/plugins/dynamic_simulator/new_sim_control_oem.h0000644000175100017510000000323612575647274023620 0ustar mohanmohan/** * @file new_sim_control_oem.h * * The file includes a class for oem control handling:\n * NewSimulatorControlOem * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * */ #ifndef __NEW_SIM_CONTROL_OEM_H__ #define __NEW_SIM_CONTROL_OEM_H__ #ifndef __NEW_SIM_RDR_H__ #include "new_sim_rdr.h" #endif #ifndef __NEW_SIM_CONTROL_H__ #include "new_sim_control.h" #endif extern "C" { #include "SaHpi.h" } /** * @class NewSimulatorControlOem * * Class for simulating Oem controls * **/ class NewSimulatorControlOem : public NewSimulatorControl { protected: /// rdr information - Oem record SaHpiCtrlRecOemT m_rec; /// state of the control SaHpiCtrlStateOemT m_state; public: NewSimulatorControlOem( NewSimulatorResource *res, SaHpiRdrT rdr, SaHpiCtrlStateOemT state, SaHpiCtrlModeT mode ); virtual ~NewSimulatorControlOem(); // create an RDR sensor record virtual bool CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ); virtual SaErrorT SetState( const SaHpiCtrlModeT &mode, const SaHpiCtrlStateT &state ); virtual SaErrorT GetState( SaHpiCtrlModeT &mode, SaHpiCtrlStateT &state ); virtual void Dump( NewSimulatorLog &dump ) const; }; #endif openhpi-3.6.1/plugins/dynamic_simulator/thread.cpp0000644000175100017510000001512112575647274021355 0ustar mohanmohan/** * @file thread.cpp * * The file includes classes for thread handling:\n * cThreadMain\n * cInit\n * cThread\n * cThreadLock\n * cThreadLockAuto\n * cThreadLockRw\n * cThreadCond\n * * @author Thomas Kanngieser * @author Lars Wetzel (documentation only) * @version 1.0 * @date 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Copyright (c) 2004 by FORCE Computers. */ #include "thread.h" #include #include #include ////////////////////////////////////////////////// // cThread ////////////////////////////////////////////////// /// key of a thread static pthread_key_t thread_key; /** * @class cThreadMain * * Main thread which implements the run method **/ class cThreadMain : public cThread { public: /// Constructor cThreadMain( const pthread_t &thread, bool main_thread, tTheadState state ) : cThread( thread, main_thread, state ) {} protected: /** * Implementation of abstract Run method * @return 0 **/ virtual void *Run() { return 0; } }; /** * @class cInit * * Initialization of a thread **/ class cInit { public: cInit(); ~cInit(); }; /** * Constructor **/ cInit::cInit() { pthread_key_create( &thread_key, 0 ); cThreadMain *thread = new cThreadMain( pthread_self(), true, eTsRun ); pthread_setspecific( thread_key, thread ); } /** * Destructor **/ cInit::~cInit() { cThreadMain *thread = (cThreadMain *)pthread_getspecific( thread_key ); if ( thread ) { delete thread; pthread_key_delete( thread_key ); } } /// global init object static cInit init; /** * Constructor **/ cThread::cThread() : m_main( false ), m_state( eTsSuspend ) { } /** * Fully qualified constructor **/ cThread::cThread( const pthread_t &thread, bool main_thread, tTheadState state ) : m_thread( thread ), m_main( main_thread ), m_state( state ) { } /** * Destructor **/ cThread::~cThread() { } /** * Get a thread * @return pointer on thread **/ cThread * cThread::GetThread() { cThread *thread = (cThread *)pthread_getspecific( thread_key ); return thread; } /** * opens a thread * * @param param thread to be opened * @return pointer on Run method of this thread **/ void * cThread::Thread( void *param ) { cThread *thread = (cThread *)param; pthread_setspecific( thread_key, thread ); thread->m_state = eTsRun; void *rv = thread->Run(); thread->m_state = eTsExit; return rv; } /** * Starts a thread * * @return success **/ bool cThread::Start() { if ( m_state == eTsRun ) { return false; } m_state = eTsSuspend; int rv = pthread_create( &m_thread, 0, Thread, this ); if ( rv ) return false; // wait till the thread is runnung while( m_state == eTsSuspend ) // wait 100 ms usleep( 10000 ); return true; } /** * wait for termination * * @param rv pointer on address of return value * @return success **/ bool cThread::Wait( void *&rv ) { if ( m_state != eTsRun ) return false; void *rr; int r = pthread_join( m_thread, &rr ); if ( r ) return false; rv = rr; return true; } /** * terminate the thread * * @param rv pointer on return value **/ void cThread::Exit( void *rv ) { m_state = eTsExit; pthread_exit( rv ); } ////////////////////////////////////////////////// // cThreadLock ////////////////////////////////////////////////// /** * Constructor **/ #if ( defined(__sun) && defined(__SVR4) ) || defined(__FreeBSD__) cThreadLock::cThreadLock() { pthread_mutexattr_t attr; pthread_mutexattr_init( &attr ); pthread_mutexattr_settype( &attr, PTHREAD_MUTEX_RECURSIVE ); pthread_mutex_init( &m_lock, &attr ); pthread_mutexattr_destroy( &attr ); } #else static pthread_mutex_t lock_tmpl = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP; cThreadLock::cThreadLock() : m_lock( lock_tmpl ) { } #endif /** * Destructor **/ cThreadLock::~cThreadLock() { pthread_mutex_destroy( &m_lock ); } /** * Set a Lock **/ void cThreadLock::Lock() { pthread_mutex_lock( &m_lock ); } /** * Unlock **/ void cThreadLock::Unlock() { pthread_mutex_unlock( &m_lock ); } /** * Is lock possible * * @return true or false **/ bool cThreadLock::TryLock() { return pthread_mutex_trylock( &m_lock ) == 0; } ////////////////////////////////////////////////// // cThreadLockRw ////////////////////////////////////////////////// /** * Constructor **/ #if defined(__sun) && defined(__SVR4) cThreadLockRw::cThreadLockRw() { pthread_rwlock_init( &m_rwlock, NULL ); } #else static pthread_rwlock_t rwlock_tmpl = PTHREAD_RWLOCK_INITIALIZER; cThreadLockRw::cThreadLockRw() { m_rwlock = rwlock_tmpl; } #endif /** * Destructor **/ cThreadLockRw::~cThreadLockRw() { pthread_rwlock_destroy( &m_rwlock ); } /// Set Readlock void cThreadLockRw::ReadLock() { pthread_rwlock_rdlock( &m_rwlock ); } /// Unset Readlock void cThreadLockRw::ReadUnlock() { pthread_rwlock_unlock( &m_rwlock ); } /** * Is read lock possible * * @return true or false **/ bool cThreadLockRw::TryReadLock() { int rv = pthread_rwlock_trywrlock( &m_rwlock ); return rv == 0; } /// Set WriteLock void cThreadLockRw::WriteLock() { pthread_rwlock_wrlock( &m_rwlock ); } /// Unset WriteLock void cThreadLockRw::WriteUnlock() { pthread_rwlock_unlock( &m_rwlock ); } /** * Test if WriteLock is possible * @return success **/ bool cThreadLockRw::TryWriteLock() { int rv = pthread_rwlock_trywrlock( &m_rwlock ); return rv == 0; } /** * Check Write lock * @return success **/ bool cThreadLockRw::CheckLock() { bool rv = TryWriteLock(); if ( rv ) WriteUnlock(); return rv; } ////////////////////////////////////////////////// // cThreadCond ////////////////////////////////////////////////// /// Constructor #if defined(__sun) && defined(__SVR4) cThreadCond::cThreadCond() { pthread_cond_init( &m_cond, NULL ); } #else static pthread_cond_t cond_tmpl = PTHREAD_COND_INITIALIZER; cThreadCond::cThreadCond() { m_cond = cond_tmpl; } #endif /// Destructor cThreadCond::~cThreadCond() { pthread_cond_destroy( &m_cond ); } /// Signal void cThreadCond::Signal() { pthread_cond_signal( &m_cond ); } /// Wait void cThreadCond::Wait() { pthread_cond_wait( &m_cond, &m_lock ); } openhpi-3.6.1/plugins/dynamic_simulator/new_sim_control_stream.cpp0000644000175100017510000001066312575647274024670 0ustar mohanmohan/** * @file new_sim_control_stream.cpp * * The file includes a class for stream control handling:\n * NewSimulatorControlStream * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * */ #include "new_sim_control.h" #include "new_sim_control_stream.h" #include "new_sim_domain.h" /** * Constructor **/ NewSimulatorControlStream::NewSimulatorControlStream( NewSimulatorResource *res, SaHpiRdrT rdr, SaHpiCtrlStateStreamT state, SaHpiCtrlModeT mode ) : NewSimulatorControl( res, rdr, mode ) { memcpy(&m_rec, &rdr.RdrTypeUnion.CtrlRec.TypeUnion.Stream, sizeof( SaHpiCtrlRecStreamT )); memcpy(&m_state, &state, sizeof( SaHpiCtrlStateStreamT )); } /** * Destructor **/ NewSimulatorControlStream::~NewSimulatorControlStream() {} /** * A rdr structure is filled with the data * * This method is called by method NewSimulatorRdr::Populate(). * * @param resource Address of resource structure * @param rdr Address of rdr structure * * @return true **/ bool NewSimulatorControlStream::CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ) { if ( NewSimulatorControl::CreateRdr( resource, rdr ) == false ) return false; memcpy(&rdr.RdrTypeUnion.CtrlRec.TypeUnion.Stream, &m_rec, sizeof( SaHpiCtrlRecStreamT )); return true; } /** * HPI function saHpiControlGet() * * See also the description of the function inside the specification or header file. * Copying the internal values (if a read is allowed). * * @param mode address to be filled * @param state address to be filled * * @return HPI return code **/ SaErrorT NewSimulatorControlStream::GetState( SaHpiCtrlModeT &mode, SaHpiCtrlStateT &state ) { if (m_write_only == SAHPI_TRUE) return SA_ERR_HPI_INVALID_CMD; if ( &mode != NULL ) { mode = m_ctrl_mode; } if ( &state != NULL ) { state.Type = m_type; memcpy( &state.StateUnion.Stream, &m_state, sizeof( SaHpiCtrlStateStreamT )); } return SA_OK; } /** * HPI function saHpiControlSet() * * See also the description of the function inside the specification or header file. * Copying the internal values (if a read is allowed). * * @param mode address to be set * @param state address to be set * * @return HPI return code **/ SaErrorT NewSimulatorControlStream::SetState( const SaHpiCtrlModeT &mode, const SaHpiCtrlStateT &state ) { if (&mode == NULL) return SA_ERR_HPI_INVALID_PARAMS; if ((m_def_mode.ReadOnly == SAHPI_TRUE) && (mode != m_def_mode.Mode)) return SA_ERR_HPI_READ_ONLY; if (mode == SAHPI_CTRL_MODE_AUTO) { m_ctrl_mode = mode; return SA_OK; } if (mode != SAHPI_CTRL_MODE_MANUAL) return SA_ERR_HPI_INVALID_PARAMS; if (&state == NULL) return SA_ERR_HPI_INVALID_PARAMS; if (state.Type != m_type) return SA_ERR_HPI_INVALID_DATA; if (state.StateUnion.Stream.StreamLength > SAHPI_CTRL_MAX_STREAM_LENGTH) return SA_ERR_HPI_INVALID_PARAMS; memcpy(&m_state.Stream, &state.StateUnion.Stream.Stream, sizeof( SaHpiUint8T ) * state.StateUnion.Stream.StreamLength); m_state.StreamLength = state.StateUnion.Stream.StreamLength; m_state.Repeat = state.StateUnion.Stream.Repeat; m_ctrl_mode = mode; return SA_OK; } /** * Dump the control information * * @param dump Address of the log * **/ void NewSimulatorControlStream::Dump( NewSimulatorLog &dump ) const { unsigned int i; dump << "Stream control " << m_id_string << ";\n"; dump << "ControlNum " << m_num << ";\n"; dump << "Oem" << m_oem << ";\n"; dump << "State.StreamLength " << m_state.StreamLength << ";\n"; dump << "State.Repeat " << m_state.Repeat << ";\n"; dump << "State.Stream"; for (i=0; i < m_state.StreamLength; i++) dump << " " << m_state.Stream[i]; dump << ";\n"; dump << "Mode" << m_ctrl_mode << ";\n"; } openhpi-3.6.1/plugins/dynamic_simulator/new_sim_entity.cpp0000644000175100017510000001333212575647274023145 0ustar mohanmohan/** * @file new_sim_entity.cpp * * The file includes the implementation for the entity wrapper class:\n * NewSimulatorEntityPath * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * The new Simulator plugin is adapted from the ipmidirect plugin. * Thanks to \n * Thomas Kanngieser \n * Pierre Sangouard * */ #include #include #include #include #include #include "new_sim_entity.h" #include "new_sim_log.h" // #include /** * Constructor **/ NewSimulatorEntityPath::NewSimulatorEntityPath() { memset( &m_entity_path, 0, sizeof( SaHpiEntityPathT ) ); } /** * Fully qualified Constructor * * @param entity_path Address of entity path to be set internally **/ NewSimulatorEntityPath::NewSimulatorEntityPath( const SaHpiEntityPathT &entity_path ) { m_entity_path = entity_path; } /** * Set an entry on a fix position * * @param idx number of position * @param type entity type * @param instance instance of entity **/ void NewSimulatorEntityPath::SetEntry( int idx, SaHpiEntityTypeT type, SaHpiEntityLocationT instance ) { assert( idx >= 0 && idx < SAHPI_MAX_ENTITY_PATH ); m_entity_path.Entry[idx].EntityType = type; m_entity_path.Entry[idx].EntityLocation = instance; } /** * Return the type of entity on position idx * * @param idx number of position * * @return entity type **/ SaHpiEntityTypeT NewSimulatorEntityPath::GetEntryType( int idx ) { assert( idx >= 0 && idx < SAHPI_MAX_ENTITY_PATH ); return m_entity_path.Entry[idx].EntityType; } /** * Set entry type on position idx * * @param idx number of position * @param type entity type to be set * * @return entity type **/ void NewSimulatorEntityPath::SetEntryType( int idx, SaHpiEntityTypeT type ) { assert( idx >= 0 && idx < SAHPI_MAX_ENTITY_PATH ); m_entity_path.Entry[idx].EntityType = type; } /** * Get entry instance for position idx * * @param idx number of position * * @return entity instance **/ SaHpiEntityLocationT NewSimulatorEntityPath::GetEntryInstance( int idx ) { assert( idx >= 0 && idx < SAHPI_MAX_ENTITY_PATH ); return m_entity_path.Entry[idx].EntityLocation; } /** * Set entry instance on position idx * * @param idx number of position * @param instance instance to be set * * @return entity type **/ void NewSimulatorEntityPath::SetEntryInstance( int idx, SaHpiEntityLocationT instance ) { assert( idx >= 0 && idx < SAHPI_MAX_ENTITY_PATH ); m_entity_path.Entry[idx].EntityLocation = instance; } /** * Operator to add an entity path on an existing path **/ NewSimulatorEntityPath & NewSimulatorEntityPath::operator+=( const NewSimulatorEntityPath &epath ) { oh_concat_ep( &m_entity_path, &epath.m_entity_path ); return *this; } /** * Operator for equal comparision of two entity path **/ bool NewSimulatorEntityPath::operator==( const NewSimulatorEntityPath &epath ) const { SaHpiBoolT cmp_result; cmp_result = oh_cmp_ep( &m_entity_path, &epath.m_entity_path ); if ( cmp_result == SAHPI_TRUE ) return true; else return false; } /** * Operator for not equal comparision of two entity path **/ bool NewSimulatorEntityPath::operator!=( const NewSimulatorEntityPath &epath ) const { SaHpiBoolT cmp_result; cmp_result = oh_cmp_ep( &m_entity_path, &epath.m_entity_path ); if ( cmp_result == SAHPI_TRUE ) return false; else return true; } /** * Append a root entity on position idx * * @param idx number of position **/ void NewSimulatorEntityPath::AppendRoot( int idx ) { assert( idx >= 0 && idx < SAHPI_MAX_ENTITY_PATH ); m_entity_path.Entry[idx].EntityType = SAHPI_ENT_ROOT; m_entity_path.Entry[idx].EntityLocation = 0; } /** * Replace the entity path root entry or append a root entry if * it is missing. * * @param root new root entry **/ void NewSimulatorEntityPath::ReplaceRoot( NewSimulatorEntityPath root ) { int pos = 0; bool notfound = true; while ((pos < SAHPI_MAX_ENTITY_PATH) && (notfound)) { if (m_entity_path.Entry[pos].EntityType == SAHPI_ENT_ROOT) { notfound = false; if (pos > 0) { m_entity_path.Entry[pos-1].EntityLocation = root.GetEntryInstance( 0 ); m_entity_path.Entry[pos-1].EntityType == root.GetEntryType( 0 ); } } pos++; } if ( notfound ) { oh_concat_ep( &m_entity_path, &root.m_entity_path ); } stdlog << "DBG: Replace root - new path: " << m_entity_path << "\n"; } /** * Operator for printing an entity path **/ NewSimulatorLog & operator<<( NewSimulatorLog &log, const NewSimulatorEntityPath &epath ) { oh_big_textbuffer path_text; char str[OH_MAX_TEXT_BUFFER_LENGTH+1]; oh_decode_entitypath( &epath.m_entity_path, &path_text ); memcpy( str, path_text.Data, path_text.DataLength ); str[path_text.DataLength] = 0; log << str; return log; } /** * Encode an entity path to a string * * @param str char pointer to hold the information * * @return return code of successful completion of oh_encode_entitypath() **/ bool NewSimulatorEntityPath::FromString( const char *str ) { return oh_encode_entitypath( str, &m_entity_path ) ? false : true; } openhpi-3.6.1/plugins/dynamic_simulator/Doxyfile0000644000175100017510000014274712575647274021127 0ustar mohanmohan# Doxyfile 1.4.4 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = "New Simulator" # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = "0.9" # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = doc # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = YES # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, # Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, # Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, # Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, # Swedish, and Ukrainian. OUTPUT_LANGUAGE = English # This tag can be used to specify the encoding used in the generated output. # The encoding is not always determined by the language that is chosen, # but also whether or not the output is meant for Windows or non-Windows users. # In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES # forces the Windows encoding (this is the default for the Windows binary), # whereas setting the tag to NO uses a Unix-style encoding (the default for # all platforms other than Windows). USE_WINDOWS_ENCODING = NO # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = YES # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like the Qt-style comments (thus requiring an # explicit @brief command for a brief description. JAVADOC_AUTOBRIEF = YES # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the DETAILS_AT_TOP tag is set to YES then Doxygen # will output the detailed description near the top, like JavaDoc. # If set to NO, the detailed description appears after the member # documentation. DETAILS_AT_TOP = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = NO # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources # only. Doxygen will then generate output that is more tailored for Java. # For instance, namespaces will be presented as packages, qualified scopes # will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = NO # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = NO # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is YES. SHOW_DIRECTORIES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from the # version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the progam writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be abled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = NO # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx # *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm FILE_PATTERNS = *.cpp *.h README # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = NO # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES (the default) # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = YES # If the REFERENCES_RELATION tag is set to YES (the default) # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = NO # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compressed HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # If the GENERATE_TREEVIEW tag is set to YES, a side panel will be # generated containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, # Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are # probably better off using the HTML help feature. GENERATE_TREEVIEW = YES # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = YES # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = YES # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = YES # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. This is useful # if you want to understand what is going on. On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = YES # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_PREDEFINED tags. EXPAND_ONLY_PREDEF = YES # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse # the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option is superseded by the HAVE_DOT option below. This is only a # fallback. It is recommended to install and use dot, since it yields more # powerful graphs. CLASS_DIAGRAMS = YES # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = YES # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = YES # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will # generate a call dependency graph for every global function or class method. # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable call graphs for selected # functions only using the \callgraph command. CALL_GRAPH = YES # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_WIDTH = 1024 # The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_HEIGHT = 1024 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that a graph may be further truncated if the graph's # image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH # and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default), # the graph is not depth-constrained. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, which results in a white background. # Warning: Depending on the platform used, enabling this option may lead to # badly anti-aliased labels on the edges of a graph (i.e. they become hard to # read). DOT_TRANSPARENT = NO # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = NO # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- # The SEARCHENGINE tag specifies whether or not a search engine should be # used. If set to NO the values of all tags below this one will be ignored. SEARCHENGINE = NO openhpi-3.6.1/plugins/dynamic_simulator/array.h0000644000175100017510000001153712575647274020700 0ustar mohanmohan/** * @file array.h * * The file includes a template for arrays. * * @author Thomas Kanngieser * @author Lars Wetzel (documentation only) * @version 1.0 * @date 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Copyright (c) 2004 by FORCE Computers. */ #ifndef dArray_h #define dArray_h #include /** * Template for using arrays **/ template class cArray { T **m_array; int m_num; int m_size; int m_resize; public: /** * Constructur **/ cArray( int r = 1 ) : m_array( 0 ), m_num( 0 ), m_size( 0 ), m_resize( r ) { assert( r > 0 ); } /** * Copy Constructur **/ cArray( const cArray &array ) : m_array( 0 ), m_num( 0 ), m_size( 0 ), m_resize( array.m_resize ) { } /** * Destructor **/ ~cArray() { Clear(); } /** * Add an element **/ int Add( T *t ) { if ( m_num == m_size ) { T **newa = new T *[m_size+m_resize]; if ( m_num ) memcpy( newa, m_array, sizeof( T * ) * m_num ); delete[] m_array; m_array = newa; m_size += m_resize; } m_array[m_num++] = t; return m_num-1; } /** * Remove an element **/ T *Rem( int idx ) { assert( idx >= 0 && idx < m_num ); T *rv = m_array[idx]; m_num--; if ( m_num == 0 ) return rv; int n = m_num/m_resize*m_resize+m_resize-1; if ( m_size > n ) { m_size = n; T **newa = new T *[n]; if ( idx != 0 ) memcpy( newa, m_array, sizeof( T * ) * idx ); if ( idx != m_num ) memcpy( newa+idx, m_array+idx+1, (m_num - idx)*sizeof( T * ) ); delete[] m_array; m_array = newa; return rv; } if ( idx != m_num ) memmove( m_array+idx, m_array+idx+1, (m_num - idx)*sizeof( T * ) ); return rv; } /** * Remove all elements **/ void RemAll() { if ( m_array ) { delete[] m_array; m_num = 0; m_array = 0; m_size = 0; } } /** * [] operator definition **/ T *operator[]( int idx ) const { assert( idx >= 0 && idx < m_num ); return m_array[idx]; } /** * [] address operator definition **/ T * & operator[]( int idx ) { assert( idx >= 0 && idx < m_num ); return m_array[idx]; } /** * + operator definition **/ cArray &operator+=( T *t ) { Add( t ); return *this; } /** * - operator definition **/ cArray &operator-=( T *t ) { int idx = Find( t ); assert( idx != -1 ); if ( idx != -1 ) Rem( idx ); return *this; } /** * Get number of elements **/ int Num() const { return m_num; } /** * Find element **/ int Find( T *t ) const { for( int i = 0; i < m_num; i++ ) if ( m_array[i] == t ) return i; return -1; } /** * Sort the elements **/ void Sort( int (*cmp)( T **t1, T **t2 ) ) { qsort( m_array, m_num, sizeof( T * ), (int (*)(const void *, const void *) )cmp ); } /** * Search in the array for an element **/ int Search( T *key, int (*cmp)( T **t1, T **t2 ), int mmax = -1 ) const { int n = m_num; if ( mmax >= 0 && mmax < m_num ) n = mmax; T **e = (T **)bsearch( &key, m_array, n, sizeof( T * ), (int (*)(const void *, const void *) )cmp ); if ( e == 0 ) return -1; int idx = (e - m_array); assert( idx >= 0 && idx < n ); return idx; } /** * Clear the array **/ void Clear() { if ( m_array ) { for( int i = 0; i < m_num; i++ ) delete m_array[i]; delete[] m_array; m_num = 0; m_array = 0; m_size = 0; } } /** * Insert an element into the array on a position **/ int Insert( int befor, T *t ) { assert( befor <= m_num ); if ( befor == -1 || befor == m_num ) return Add( t ); if ( m_num == m_size ) { T **newa = new T *[m_size+m_resize]; if ( m_num ) memcpy( newa, m_array, sizeof( T * ) * m_num ); delete[] m_array; m_array = newa; m_size += m_resize; } for( int i = m_num-1; i >= befor; i-- ) m_array[i+1] = m_array[i]; m_num++; m_array[befor] = t; return befor; } /** * () operator definition **/ cArray &operator=( const cArray & /*array*/ ) { // this is not a real copy operator ! Clear(); return *this; } }; #endif openhpi-3.6.1/plugins/dynamic_simulator/new_sim_log.cpp0000644000175100017510000002023412575647274022411 0ustar mohanmohan/** * @file new_sim_log.cpp * * The file includes a class for handling the log files:\n * NewSimulatorLog * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * The new Simulator plugin is adapted from the ipmidirect plugin. * Thanks to \n * Thomas Kanngieser \n * Pierre Sangouard * **/ #include #include #include #include #include #include #include #include #include #include #include "new_sim_log.h" #include "new_sim_utils.h" /// Define object stdlog of class NewSimulatorLog NewSimulatorLog stdlog; /** * Constructor **/ NewSimulatorLog::NewSimulatorLog() : m_lock_count( 0 ), m_open_count( 0 ), m_hex( false ), m_time( false ), m_recursive( false ), m_std_out( false ), m_std_err( false ) {} /** * Destructor **/ NewSimulatorLog::~NewSimulatorLog() {} /** * Open logfile(s) * * @param properties properties to be set * @param filename pointer on string with filename * @param max_log_files max logfiles * * return success **/ bool NewSimulatorLog::Open( int properties, const char *filename, int max_log_files ) { m_open_count++; if ( m_open_count > 1 ) // already open return true; assert( m_lock_count == 0 ); if ( properties & dIpmiLogStdOut ) m_std_out = true; if ( properties & dIpmiLogStdErr ) m_std_err = true; char file[1024] = ""; if ( properties & dIpmiLogLogFile ) { char tf[1024]; int i; struct stat st1, st2; if ( filename == 0 || *filename == 0 ) { fprintf( stderr, "not filename for logfile !\n" ); return false; } // max numbers of logfiles if ( max_log_files < 1 ) max_log_files = 1; // find a new one or the oldes logfile for( i = 0; i < max_log_files; i++ ) { snprintf( tf, sizeof(tf), "%s%02d.log", filename, i ); if ( file[0] == 0 ) strcpy( file, tf ); if ( !stat( tf, &st1 ) && S_ISREG( st1. st_mode ) ) { if ( !stat( file, &st2 ) && S_ISREG( st1. st_mode ) && st2.st_mtime > st1.st_mtime ) strcpy( file, tf ); } else { strcpy( file, tf ); break; } } } // It looks to me like a small BUG - it is already handled above /* if ( properties & dIpmiLogFile ) { if ( filename == 0 || *filename == 0 ) { fprintf( stderr, "not filename for logfile !\n" ); return false; } strcpy( file, filename ); } */ if ( file[0] ) { m_fd = fopen( file, "w" ); if ( m_fd == 0 ) { fprintf( stderr, "can not open logfile %s\n", file ); return false; } } m_nl = true; return true; } /** * Close logfile(s) **/ void NewSimulatorLog::Close() { m_open_count--; assert( m_open_count >= 0 ); if ( m_open_count > 0 ) return; assert( m_lock_count == 0 ); assert( m_nl ); if ( m_fd ) { fclose( m_fd ); m_fd = 0; } m_std_out = false; m_std_err = false; } /** * Write the output dependent on which flags are set. * * @param str pointer on string to be printed **/ void NewSimulatorLog::Output( const char *str ) { int l = strlen( str ); size_t fwrote; if ( m_fd ) fwrote = fwrite( str, l, 1, m_fd ); if ( m_std_out ) fwrote = fwrite( str, l, 1, stdout ); if ( m_std_err ) fwrote = fwrite( str, l, 1, stderr ); } /** * Start the logfile writing. **/ void NewSimulatorLog::Start() { //Lock(); if ( m_nl ) { if ( m_time ) { struct timeval tv; gettimeofday( &tv, 0 ); char b[dDateTimeStringSize+5]; NewSimulatorDateTimeToString( tv.tv_sec, b ); #if defined(__sparc) || defined(__sparc__) snprintf( b + dDateTimeStringSize - 1, 6, ".%03ld ", (long)tv.tv_usec / 1000 ); #else snprintf( b + dDateTimeStringSize - 1, 6, ".%03ld ", tv.tv_usec / 1000 ); #endif Output( b ); } } } /** * Output operator definition for a bool value **/ NewSimulatorLog & NewSimulatorLog::operator<<( bool b ) { Start(); Output( b ? "true" : "false" ); return *this; } /** * Output operator definition for a unsigned char value **/ NewSimulatorLog & NewSimulatorLog::operator<<( unsigned char c ) { Start(); char b[5]; snprintf( b, sizeof(b), "0x%02x", c ); Output( b ); return *this; } /** * Output operator definition for a int value **/ NewSimulatorLog & NewSimulatorLog::operator<<( int i ) { Start(); char b[20]; snprintf( b, sizeof(b), "%d", i ); Output( b ); return *this; } /** * Output operator definition for a long value **/ NewSimulatorLog & NewSimulatorLog::operator<<( long l ) { Start(); char b[20]; snprintf( b, sizeof(b), "%ld", l ); Output( b ); return *this; } /** * Output operator definition for a unsigned int value **/ NewSimulatorLog & NewSimulatorLog::operator<<( unsigned int i ) { Start(); char b[20]; if ( m_hex ) snprintf( b, sizeof(b), "0x%08x", i ); else snprintf( b, sizeof(b), "%u", i ); Output( b ); return *this; } /** * Output operator definition for a double value **/ NewSimulatorLog & NewSimulatorLog::operator<<( double d ) { Start(); char b[20]; snprintf( b, sizeof(b), "%f", d ); Output( b ); return *this; } /** * Output operator definition for a string **/ NewSimulatorLog & NewSimulatorLog::operator<<( const char *str ) { Log( "%s", str ); return *this; } /** * Writes a complete log entry **/ void NewSimulatorLog::Log( const char *fmt, ... ) { Start(); va_list ap; va_start( ap, fmt ); char b[10240]; vsnprintf( b, 10240, fmt, ap ); va_end( ap ); // It looks to me like a small BUG - can lead to an overflow in extreme rare cases // char buf[10230] = ""; char buf[10240] = ""; char *p = b; char *q = buf; m_nl = false; while( *p ) { if ( *p == '\n' ) { m_nl = true; *q++ = *p++; *q = 0; Output( buf ); q = buf; continue; } m_nl = false; *q++ = *p++; } if ( q != b ) { *q = 0; Output( buf ); } if ( m_nl ) { if ( m_fd ) fflush( m_fd ); if ( m_std_out ) fflush( stdout ); if ( m_std_err ) fflush( stderr ); //while( m_lock_count > 0 ) // Unlock(); } } /** * Writes hex entries * * @param data pointer on hex values * @param size size of field **/ void NewSimulatorLog::Hex( const unsigned char *data, int size ) { char str[256]; char *s = str; int i, remaining; for( i = 0; i < size; i++ ) { if ( i != 0 && (i % 16) == 0 ) { Log( "%s\n", str ); s = str; } remaining = sizeof(str) - (s - str); if (remaining > 0) s += snprintf( s, remaining, " %02x", *data++ ); } if ( s != str ) Log( "%s\n", str ); } /** * Mark a section inside the logfile * * @param section kind of section * @param name name of section **/ void NewSimulatorLog::Begin( const char *section, const char *name ) { if ( IsRecursive() ) *this << section << " \"" << name << "\"\n{\n"; } /** * End a section inside the logfile **/ void NewSimulatorLog::End() { if ( IsRecursive() ) *this << "}\n\n\n"; } /** * Writes an entry and returns address of object * * @param entry string **/ NewSimulatorLog & NewSimulatorLog::Entry( const char *entry ) { char str[256]; strcpy( str, entry ); int l = 30 - strlen( entry ); if ( l > 0 ) { char *p = str + strlen( entry ); while( l-- > 0 ) *p++ = ' '; *p = 0; } *this << " " << str << " = "; return *this; } openhpi-3.6.1/plugins/dynamic_simulator/new_sim_timer_thread.cpp0000644000175100017510000000460712575647274024305 0ustar mohanmohan/** * @file new_sim_timer_thread.cpp * * The file includes a class Timer which runs in another thread:\n * NewSimulatorTimerThread * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * */ #include #include #include "new_sim.h" #include "new_sim_utils.h" #include "new_sim_watchdog.h" /** * Constructor for Watchdogs **/ // NewSimulatorTimerThread::NewSimulatorTimerThread( NewSimulatorWatchdog *wdt, NewSimulatorTimerThread::NewSimulatorTimerThread( unsigned int ms_timeout ) : m_timeout( ms_timeout ), m_running( false ), m_exit( false ) { } /** * Destructor **/ NewSimulatorTimerThread::~NewSimulatorTimerThread() { } /** * Set the exit flag and sleep THREAD_SLEEPTIME to be sure it is read **/ void NewSimulatorTimerThread::Stop() { m_exit = true; usleep( THREAD_SLEEPTIME ); } /** * Set a new timeout value * * @param new_timeout new timeout value in ms * * @return latest timeout value of the object **/ unsigned int NewSimulatorTimerThread::Reset( unsigned int new_timeout ) { m_timeout = new_timeout; m_start = cTime::Now(); stdlog << "DBG: Reset timeout value " << m_timeout << "\n"; return m_timeout; } /** * Main loop of the timer. * * If the timer expires the method TriggerAction() is called. **/ void * NewSimulatorTimerThread::Run() { cTime now; int delta; m_start = cTime::Now(); m_running = true; m_exit = false; stdlog << "DBG: Run Timerloop - with timeout " << m_timeout << "\n"; while( !m_exit ) { now = cTime::Now(); now -= m_start; delta = m_timeout - now.GetMsec(); if ( delta <= 0 ) { m_exit = TriggerAction(); } else if ( delta <= THREAD_SLEEPTIME / 1000 ) { usleep( delta*1000 ); } else { usleep( THREAD_SLEEPTIME ); } } m_running = false; stdlog << "DBG: Exit TimerLoop\n"; return 0; } openhpi-3.6.1/plugins/dynamic_simulator/new_sim_watchdog.cpp0000644000175100017510000003114712575647274023435 0ustar mohanmohan/** * @file new_sim_watchdog.cpp * * The file includes a class for watchdog handling:\n * NewSimulatorWatchdog * * @todo maybe some watchdog actions * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * */ #include #include "new_sim_watchdog.h" #include "new_sim_utils.h" #include "new_sim_domain.h" #include "new_sim_timer_thread.h" /** * Constructor **/ NewSimulatorWatchdog::NewSimulatorWatchdog( NewSimulatorResource *res ) : NewSimulatorRdr( res, SAHPI_WATCHDOG_RDR ), NewSimulatorTimerThread( 0 ), m_state( NONE ) { memset( &m_wdt_rec, 0, sizeof( SaHpiWatchdogRecT )); memset( &m_wdt_data, 0, sizeof( SaHpiWatchdogT )); } /** * Full qualified constructor to fill an object with the parsed data **/ NewSimulatorWatchdog::NewSimulatorWatchdog( NewSimulatorResource *res, SaHpiRdrT rdr, SaHpiWatchdogT wdt_data) : NewSimulatorRdr( res, SAHPI_WATCHDOG_RDR, rdr.Entity, rdr.IsFru, rdr.IdString ), NewSimulatorTimerThread( (wdt_data.InitialCount - wdt_data.PreTimeoutInterval) ), m_state( NONE ) { memcpy( &m_wdt_rec, &rdr.RdrTypeUnion.WatchdogRec, sizeof( SaHpiWatchdogRecT )); memcpy( &m_wdt_data, &wdt_data, sizeof( SaHpiWatchdogT )); } /** * Destructor **/ NewSimulatorWatchdog::~NewSimulatorWatchdog() { Stop(); } /** * A rdr structure is filled with the data * * This method is called by method NewSimulatorRdr::Populate(). * * @param resource Address of resource structure * @param rdr Address of rdr structure * * @return true **/ bool NewSimulatorWatchdog::CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ) { if ( NewSimulatorRdr::CreateRdr( resource, rdr ) == false ) return false; /// Watchdog record memcpy(&rdr.RdrTypeUnion.WatchdogRec, &m_wdt_rec, sizeof(SaHpiWatchdogRecT)); return true; } /** * Dump the Watchdog information * * @param dump address of the log * **/ void NewSimulatorWatchdog::Dump( NewSimulatorLog &dump ) const { char str[256]; IdString().GetAscii( str, 256 ); dump << "Watchdog: " << m_wdt_rec.WatchdogNum << " " << str << "\n"; dump << "Oem: " << m_wdt_rec.Oem << "\n"; dump << "Watchdog data:\n"; dump << "Log: " << m_wdt_data.Log << "\n"; dump << "Running: " << m_wdt_data.Running << "\n"; dump << "TimerUse: " << m_wdt_data.TimerUse << "\n"; dump << "TimerAction: " << m_wdt_data.TimerAction << "\n"; dump << "PretimerInterrupt: " << m_wdt_data.PretimerInterrupt << "\n"; dump << "PreTimeoutInterval: " << m_wdt_data.PreTimeoutInterval << "\n"; dump << "TimerUseExpFlags: " << m_wdt_data.TimerUseExpFlags << "\n"; dump << "InitialCount: " << m_wdt_data.InitialCount << "\n"; dump << "PresentCount: " << m_wdt_data.PresentCount << "\n"; } /** * Check whether the watchdog timer is running and trigger proper action * * @return true if thread can exit, false if not **/ bool NewSimulatorWatchdog::TriggerAction() { stdlog << "DBG: CheckWatchdogTimer\n"; if ( m_wdt_data.Running == SAHPI_FALSE ) return true; if ( ! m_start.IsSet() ) return true; // Ok, we have a running wdt cTime now( cTime::Now() ); now -= m_start; if ( now.GetMsec() >= m_wdt_data.InitialCount ) { if ( m_state != PRETIMEOUT ) TriggerAction( PRETIMEOUT ); TriggerAction( TIMEOUT ); stdlog << "DBG: WatchdogTimer expires.\n"; return true; } if ( now.GetMsec() >= m_wdt_data.InitialCount - m_wdt_data.PreTimeoutInterval ) { TriggerAction( PRETIMEOUT ); return false; } m_wdt_data.PresentCount = m_wdt_data.InitialCount - now.GetMsec(); return false; } /** * Trigger an action, like sending an event and setting the exp_mask * * @param state watchdog state which should be triggered **/ void NewSimulatorWatchdog::TriggerAction( WdtStateT state ) { SaHpiWatchdogActionEventT wdtaction; SaHpiSeverityT sev = SAHPI_MAJOR; if ( ( state == PRETIMEOUT ) && ( m_state != PRETIMEOUT ) ) { cTime now( cTime::Now() ); now -= m_start; m_state = PRETIMEOUT; wdtaction = SAHPI_WAE_TIMER_INT; sev = SAHPI_MAJOR; m_wdt_data.PresentCount = m_wdt_data.InitialCount - now.GetMsec(); Reset( m_wdt_data.PreTimeoutInterval ); if ( m_wdt_data.Log == SAHPI_TRUE ) { // The next is implementation specific, HPI-B, p. 154 // An event is generated when the pre-timer expires, unless the // pre-timer interrupt action is “None†and the pre-timer interval is zero, // in which case it is implementation-dependent whether an event is generated. if (!( (m_wdt_data.PretimerInterrupt == SAHPI_WPI_NONE) && (m_wdt_data.PreTimeoutInterval == 0) )) SendEvent( wdtaction, sev ); } } if ( state == TIMEOUT ) { m_wdt_data.Running = SAHPI_FALSE; m_wdt_data.PresentCount = 0; m_start.Clear(); stdlog << "DBG: Stop TimerThread due to TimerAction\n"; Stop(); m_state = TIMEOUT; switch ( m_wdt_data.TimerAction ) { case SAHPI_WA_NO_ACTION: sev = SAHPI_INFORMATIONAL; wdtaction = SAHPI_WAE_NO_ACTION; break; case SAHPI_WA_RESET: sev = SAHPI_MAJOR; wdtaction = SAHPI_WAE_RESET; break; case SAHPI_WA_POWER_DOWN: sev = SAHPI_MAJOR; wdtaction = SAHPI_WAE_POWER_DOWN; break; case SAHPI_WA_POWER_CYCLE: sev = SAHPI_MAJOR; wdtaction = SAHPI_WAE_POWER_CYCLE; break; default: err("Invalid TimerAction is configured inside Watchdog"); sev = SAHPI_INFORMATIONAL; wdtaction = SAHPI_WAE_NO_ACTION; break; } switch ( m_wdt_data.TimerUse ) { case SAHPI_WTU_NONE: case SAHPI_WTU_UNSPECIFIED: break; case SAHPI_WTU_BIOS_FRB2: m_wdt_data.TimerUseExpFlags |= SAHPI_WATCHDOG_EXP_BIOS_FRB2; break; case SAHPI_WTU_BIOS_POST: m_wdt_data.TimerUseExpFlags |= SAHPI_WATCHDOG_EXP_BIOS_POST; break; case SAHPI_WTU_OS_LOAD: m_wdt_data.TimerUseExpFlags |= SAHPI_WATCHDOG_EXP_OS_LOAD; break; case SAHPI_WTU_SMS_OS: m_wdt_data.TimerUseExpFlags |= SAHPI_WATCHDOG_EXP_SMS_OS; break; case SAHPI_WTU_OEM: m_wdt_data.TimerUseExpFlags |= SAHPI_WATCHDOG_EXP_OEM; break; default: err("Invalid TimerUse is configured inside Watchdog"); break; } stdlog << "DBG: Watchdog::SendEvent if allowed\n"; if ( m_wdt_data.Log == SAHPI_TRUE ) SendEvent( wdtaction, sev ); } } /** * Send a watchdog event * * @param wdtaction watchdog action event flag to be set * @param sev severity of event to be set **/ void NewSimulatorWatchdog::SendEvent( SaHpiWatchdogActionEventT wdtaction, SaHpiSeverityT sev ) { NewSimulatorResource *res = Resource(); if( !res ) { stdlog << "DBG: Watchdog::TriggerAction: No resource !\n"; return; } oh_event *e = (oh_event *)g_malloc0( sizeof( struct oh_event ) ); e->event.EventType = SAHPI_ET_WATCHDOG; SaHpiRptEntryT *rptentry = oh_get_resource_by_id( res->Domain()->GetHandler()->rptcache, res->ResourceId() ); SaHpiRdrT *rdrentry = oh_get_rdr_by_id( res->Domain()->GetHandler()->rptcache, res->ResourceId(), m_record_id ); if ( rptentry ) e->resource = *rptentry; else e->resource.ResourceCapabilities = 0; if ( rdrentry ) e->rdrs = g_slist_append(e->rdrs, g_memdup(rdrentry, sizeof(SaHpiRdrT))); else e->rdrs = NULL; // hpi events e->event.Source = res->ResourceId(); e->event.EventType = SAHPI_ET_WATCHDOG; e->event.Severity = sev; oh_gettimeofday(&e->event.Timestamp); SaHpiWatchdogEventT *wdte = &e->event.EventDataUnion.WatchdogEvent; wdte->WatchdogNum = m_wdt_rec.WatchdogNum; wdte->WatchdogAction = wdtaction; wdte->WatchdogPreTimerAction = m_wdt_data.PretimerInterrupt; wdte->WatchdogUse = m_wdt_data.TimerUse; stdlog << "DBG: NewSimWatchdog::SendEvent Wdt for resource " << res->ResourceId() << "\n"; res->Domain()->AddHpiEvent( e ); } // Official HPI functions /** * HPI function saHpiWatchdogTimerGet * * See also the description of the function inside the specification or header file. * Copying the internal values and show the remaining time if the timer was started. * * @param watchdog address of watchdog record to be filled * * @return HPI return code **/ SaErrorT NewSimulatorWatchdog::GetWatchdogInfo( SaHpiWatchdogT &watchdog ) { if ( &watchdog == NULL) return SA_ERR_HPI_INVALID_PARAMS; memcpy( &watchdog, &m_wdt_data, sizeof( SaHpiWatchdogT )); if ( m_start.IsSet() ) { cTime now( cTime::Now() ); now -= m_start; if ( m_wdt_data.InitialCount < now.GetMsec() ) { watchdog.PresentCount = 0; } else { watchdog.PresentCount = m_wdt_data.InitialCount - now.GetMsec(); } stdlog << "DBG: GetWatchdogInfo PresentCount == " << watchdog.PresentCount << "\n"; } stdlog << "DBG: Call of GetWatchdogInfo: num " << m_wdt_rec.WatchdogNum << "\n"; return SA_OK; } /** * HPI function saHpiWatchdogTimerSet * * See also the description of the function inside the specification or header file. * Copying the internal reading values (if a read is allowed). * * @param watchdog address of watchdog record to be filled * * @return HPI return code **/ SaErrorT NewSimulatorWatchdog::SetWatchdogInfo( SaHpiWatchdogT &watchdog ) { SaHpiWatchdogExpFlagsT origFlags; if ( &watchdog == NULL ) return SA_ERR_HPI_INVALID_PARAMS; if ( watchdog.PreTimeoutInterval > watchdog.InitialCount ) return SA_ERR_HPI_INVALID_DATA; origFlags = m_wdt_data.TimerUseExpFlags; memcpy( &m_wdt_data, &watchdog, sizeof( SaHpiWatchdogT )); if ( watchdog.Running == SAHPI_TRUE ) { if ( m_start.IsSet() ) { m_start = cTime::Now(); Reset( m_wdt_data.InitialCount - m_wdt_data.PreTimeoutInterval ); if ( !m_running ) Start(); } else { m_wdt_data.Running = SAHPI_FALSE; m_wdt_data.PresentCount = 0; } } else { m_start.Clear(); Stop(); m_wdt_data.PresentCount = 0; } // ClearFlags m_wdt_data.TimerUseExpFlags = origFlags & ~watchdog.TimerUseExpFlags; stdlog << "DBG: SetWatchdogInfo successfully: num " << m_wdt_rec.WatchdogNum << "\n"; return SA_OK; } /** * HPI function saHpiWatchdogTimerReset * * See also the description of the function inside the specification or header file. * Starting or resetting a watchdog timer if it is allowed * * @return HPI return code **/ SaErrorT NewSimulatorWatchdog::ResetWatchdog() { if ( m_start.IsSet() ) { cTime now( cTime::Now() ); now -= m_start; if ( now.GetMsec() > m_wdt_data.InitialCount - m_wdt_data.PreTimeoutInterval ) { stdlog << "DBG: ResetWatchdog not allowed: num " << m_wdt_rec.WatchdogNum << ":\n"; stdlog << "DBG: Time expire in ms: " << now.GetMsec() << " > " << (m_wdt_data.InitialCount - m_wdt_data.PreTimeoutInterval) << "\n"; return SA_ERR_HPI_INVALID_REQUEST; } // Reset the Timer Reset( m_wdt_data.InitialCount - m_wdt_data.PreTimeoutInterval ); m_start = cTime::Now(); } else { m_start = cTime::Now(); // Reset the Timer Reset( m_wdt_data.InitialCount - m_wdt_data.PreTimeoutInterval ); if (!m_running) Start(); } m_wdt_data.Running = SAHPI_TRUE; Domain()->SetRunningWdt( true ); stdlog << "DBG: ResetWatchdog successfully: num " << m_wdt_rec.WatchdogNum << "\n"; return SA_OK; } openhpi-3.6.1/plugins/dynamic_simulator/new_sim_utils.cpp0000644000175100017510000000447612575647274023002 0ustar mohanmohan/** * @file new_sim_utils.cpp * * The file includes some function for the work with time values and * FRU states. * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * The new Simulator plugin is adapted from the ipmidirect plugin. * Thanks to \n * Thomas Kanngieser \n * **/ #include #include "new_sim_utils.h" /// Array including the strings of the FRU states static const char *fru_state[] = { "not installed", "inactive", "activation request", "activation in progress", "active", "deactivation request", "deactivation in progress", "communication lost" }; /** * Return a string a with the state fo a FRU * * @param val state of the FRU * @return string with the FRU state text **/ const char * NewSimulatorFruStateToString( tNewSimulatorFruState val ) { if ( val > eFruStateCommunicationLost ) return "invalid"; return fru_state[val]; } /** * Fill a string a with date information * * @param t time value * @param str pointer on the string to be filled **/ void NewSimulatorDateToString( unsigned int t, char *str ) { struct tm tmt; time_t dummy = t; localtime_r( &dummy, &tmt ); // 2003.10.30 strftime( str, dDateStringSize, "%Y.%m.%d", &tmt ); } /** * Fill a string a with time information * * @param t time value * @param str pointer on the string to be filled **/ void NewSimulatorTimeToString( unsigned int t, char *str ) { struct tm tmt; time_t dummy = t; localtime_r( &dummy, &tmt ); // 11:11:11 strftime( str, dTimeStringSize, "%H:%M:%S", &tmt ); } /** * Fill a string a with date and time information * * @param t time value * @param str pointer on the string to be filled **/ void NewSimulatorDateTimeToString( unsigned int t, char *str ) { struct tm tmt; time_t dummy = t; localtime_r( &dummy, &tmt ); // 2003.10.30 11:11:11 strftime( str, dDateTimeStringSize, "%Y.%m.%d %H:%M:%S", &tmt ); } openhpi-3.6.1/plugins/dynamic_simulator/new_sim_rdr.h0000644000175100017510000000614712575647274022073 0ustar mohanmohan/** * @file new_sim_rdr.h * * The file includes an abstract class for rdr data:\n * NewSimulatorRdr * * @author Lars Wetzel * @version 0.2 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * The new Simulator plugin is adapted from the ipmidirect plugin. * Thanks to * Thomas Kanngieser * Pierre Sangouard * */ #ifndef __NEW_SIM_RDR_H__ #define __NEW_SIM_RDR_H__ #ifndef __NEW_SIM_TEXT_BUFFER_H__ #include "new_sim_text_buffer.h" #endif #include extern "C" { #include "SaHpi.h" } class NewSimulatorResource; #ifndef __NEW_SIM_ENTITY_H__ #include "new_sim_entity.h" #endif class NewSimulatorDomain; /** * @class NewSimulatorRdr * * Abstract class for rdr data * **/ class NewSimulatorRdr { protected: /// Holds a reference on the resource for which the rdr is defined NewSimulatorResource *m_resource; /// id of the rdr entry SaHpiEntryIdT m_record_id; /// type of the rdr entry SaHpiRdrTypeT m_type; /// entity path where it can be found NewSimulatorEntityPath m_entity_path; /// isFru flag - please see also specification about the usage of this flag SaHpiBoolT m_is_fru; /// id string with the name of the entry NewSimulatorTextBuffer m_id_string; public: NewSimulatorRdr( NewSimulatorResource *res, SaHpiRdrTypeT type ); NewSimulatorRdr( NewSimulatorResource *res, SaHpiRdrTypeT type, SaHpiEntityPathT entity, SaHpiBoolT isFru, SaHpiTextBufferT idString); virtual ~NewSimulatorRdr(); /// returns a reference of the resource reference from the class NewSimulatorResource *&Resource() { return m_resource; } /// returns a reference of the record id SaHpiEntryIdT &RecordId() { return m_record_id; } /// returns a reference of the rdr type SaHpiRdrTypeT &Type() { return m_type; } /// returns a reference of the isFru variable SaHpiBoolT &IsFru() { return m_is_fru; } /// returns a reference of the idString NewSimulatorTextBuffer &IdString() { return m_id_string; } /// returns a reference of the idString const NewSimulatorTextBuffer &IdString() const { return m_id_string; } /// returns a reference of theEntity Path NewSimulatorEntityPath &EntityPath() { return m_entity_path; } NewSimulatorDomain *Domain(); /// create an RDR sensor record virtual bool CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ); /// sensor num, control num, fru device id virtual unsigned int Num() const = 0; /// Dump the internal data virtual void Dump( NewSimulatorLog &dump ) const = 0; private: /// Is the rdr entry populated bool m_populate; public: virtual bool Populate(GSList **); }; #endif openhpi-3.6.1/plugins/dynamic_simulator/new_sim_text_buffer.h0000644000175100017510000000500612575647274023612 0ustar mohanmohan/** * @file new_sim_text_buffer.h * * The file includes a wrapper class for SaHpiTextBufferT:\n * NewSimulatorTextBuffer * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * The new Simulator plugin is adapted from the ipmidirect plugin. * Thanks to \n * Thomas Kanngieser \n * Pierre Sangouard * */ #ifndef __NEW_SIM_TEXT_BUFFER_H__ #define __NEW_SIM_TEXT_BUFFER_H__ #ifndef __NEW_SIM_LOG_H__ #include "new_sim_log.h" #endif extern "C" { #include "SaHpi.h" } /** * @class NewSimulatorTextBuffer * * Wrapper class for SaHpiTextBufferT * **/ class NewSimulatorTextBuffer { protected: int BinaryToAscii( char *buffer, unsigned int len ) const; int BcdPlusToAscii( char *buffer, unsigned int len ) const; int Ascii6ToAscii( char *buffer, unsigned int len ) const; int LanguageToAscii( char *buffer, unsigned int len ) const; int AsciiToBcdPlus ( const char *input ); int AsciiToAscii6 ( const char *input ); int AsciiToLanguage( const char *input ); /// internal SaHpiTextBufferT variable SaHpiTextBufferT m_buffer; public: NewSimulatorTextBuffer(); NewSimulatorTextBuffer( const char *string, SaHpiTextTypeT type, SaHpiLanguageT l = SAHPI_LANG_ENGLISH ); NewSimulatorTextBuffer( const SaHpiTextBufferT &buf ); void Clear(); /// return the internal buffer operator SaHpiTextBufferT () const { return m_buffer; } /// return the DataLength SaHpiUint8T DataLength() const { return m_buffer.DataLength; } SaHpiTextTypeT CheckAscii( const char *s ); // convert ascii string to text buffer bool SetAscii( const char *string, SaHpiTextTypeT type, SaHpiLanguageT l = SAHPI_LANG_ENGLISH ); // copy data in the internal buffer bool SetData( SaHpiTextBufferT data ); // returns length of string or -1 on error int GetAscii( char *buffer, unsigned int len ) const; bool operator==( const NewSimulatorTextBuffer &tb ) const; bool operator!=( const NewSimulatorTextBuffer &tb ) const; }; NewSimulatorLog &operator<<( NewSimulatorLog &dump, const NewSimulatorTextBuffer &tb ); #endif openhpi-3.6.1/plugins/dynamic_simulator/new_sim_file_watchdog.cpp0000644000175100017510000001731712575647274024437 0ustar mohanmohan/** * @file new_sim_file_watchdog.cpp * * The file includes the class for parsing the watchdog data:\n * NewSimulatorFileWatchdog * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * */ #include #include #include #include #include #include "new_sim_file_rdr.h" #include "new_sim_file_watchdog.h" #include "new_sim_file_util.h" #include "new_sim_resource.h" #include "new_sim_rdr.h" #include "new_sim_watchdog.h" #include /** * Constructor **/ NewSimulatorFileWatchdog::NewSimulatorFileWatchdog( GScanner *scanner ) : NewSimulatorFileRdr ( scanner ) { m_wdt_rec = &m_rdr.RdrTypeUnion.WatchdogRec; memset(&m_data, 0, sizeof( SaHpiWatchdogT )); } /** * Destructor **/ NewSimulatorFileWatchdog::~NewSimulatorFileWatchdog() { } /** * Parse inside the \c WATCHDOG_TOKEN_HANDLER the \c RDR_DETAIL_TOKEN_HANDLER * * Startpoint is the \c RDR_DETAIL_TOKEN_HANDLER. Endpoint is the last \c G_TOKEN_RIGHT_CURLY of the \c * WATCHDOG_TOKEN_HANDLER. * * @param res Pointer on the resource which includes the watchdog * * @return Pointer on a new Rdr entry **/ NewSimulatorRdr * NewSimulatorFileWatchdog::process_token( NewSimulatorResource *res) { bool success = true; char *field; NewSimulatorWatchdog *wdt = NULL; guint cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_LEFT_CURLY) { err("Processing parse configuration: Expected left curly token."); return NULL; } m_depth++; while ( (m_depth > 0) && success ) { cur_token = g_scanner_get_next_token(m_scanner); switch (cur_token) { case G_TOKEN_EOF: err("Processing parse rpt entry: File ends too early"); success = false; break; case G_TOKEN_RIGHT_CURLY: m_depth--; break; case G_TOKEN_LEFT_CURLY: m_depth++; break; case G_TOKEN_STRING: field = g_strdup(m_scanner->value.v_string); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (!strcmp(field, "WatchdogNum")) { if (cur_token == G_TOKEN_INT) m_wdt_rec->WatchdogNum = m_scanner->value.v_int; } else if (!strcmp(field, "Oem")) { if (cur_token == G_TOKEN_INT) m_wdt_rec->Oem = m_scanner->value.v_int; } else { // Unknown Token err("Processing parse rdr entry: Unknown Rdr field %s", field); success = false; } break; case WDT_GET_TOKEN_HANDLER: stdlog << "DBG: Start parsing watchdog data.\n"; success = process_watchdog_data(); stdlog << "DBG: Parsing returns success = " << success << "\n"; break; default: err("Processing parse rdr entry: Unknown token"); success = false; break; } } if ( success ) { wdt = new NewSimulatorWatchdog( res, m_rdr, m_data ); stdlog << "DBG: Parse Watchdog successfully\n"; return wdt; } if (wdt != NULL) delete wdt; return NULL; } /** * Parse the Watchdog Get section * * Startpoint is the \c WDT_GET_TOKEN_HANDLER. Endpoint is the last \c G_TOKEN_RIGHT_CURLY. * * @return bool value success * **/ bool NewSimulatorFileWatchdog::process_watchdog_data() { bool success = true; int start = m_depth; char *field; guint cur_token; cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_LEFT_CURLY) { err("Processing parse control rdr entry - Missing left curly in WDT_GET section"); success = false; } m_depth++; if (!success) return success; while ( (m_depth > start) && success ) { cur_token = g_scanner_get_next_token(m_scanner); switch (cur_token) { case G_TOKEN_EOF: err("Processing parse rdr entry: File ends too early"); success = false; break; case G_TOKEN_RIGHT_CURLY: m_depth--; break; case G_TOKEN_LEFT_CURLY: m_depth++; break; case G_TOKEN_STRING: field = g_strdup(m_scanner->value.v_string); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (!strcmp(field, "Log")) { if (cur_token == G_TOKEN_INT) m_data.Log = ( SaHpiBoolT ) m_scanner->value.v_int; } else if (!strcmp(field, "Running")) { if (cur_token == G_TOKEN_INT) if ( m_scanner->value.v_int ) stdlog << "WARN: Watchdog is set to not running - you have to restart it"; m_data.Running = SAHPI_FALSE; } else if (!strcmp(field, "TimerUse")) { if (cur_token == G_TOKEN_INT) m_data.TimerUse = ( SaHpiWatchdogTimerUseT ) m_scanner->value.v_int; } else if (!strcmp(field, "TimerAction")) { if (cur_token == G_TOKEN_INT) m_data.TimerAction = ( SaHpiWatchdogActionT ) m_scanner->value.v_int; } else if (!strcmp(field, "PretimerInterrupt")) { if (cur_token == G_TOKEN_INT) m_data.PretimerInterrupt = ( SaHpiWatchdogPretimerInterruptT ) m_scanner->value.v_int; } else if (!strcmp(field, "PreTimeoutInterval")) { if (cur_token == G_TOKEN_INT) m_data.PreTimeoutInterval = m_scanner->value.v_int; } else if (!strcmp(field, "TimerUseExpFlags")) { if (cur_token == G_TOKEN_INT) m_data.TimerUseExpFlags = ( SaHpiWatchdogExpFlagsT ) m_scanner->value.v_int; } else if (!strcmp(field, "InitialCount")) { if (cur_token == G_TOKEN_INT) m_data.InitialCount = m_scanner->value.v_int; } else if (!strcmp(field, "PresentCount")) { if (cur_token == G_TOKEN_INT) m_data.PresentCount = m_scanner->value.v_int; } else { // Unknown Token err("Processing parse rdr entry: Unknown type field %s", field); success = false; } break; default: err("Processing Watchog data: Unknown token"); success = false; break; } } return success; } openhpi-3.6.1/plugins/dynamic_simulator/new_sim_entity.h0000644000175100017510000000433712575647274022617 0ustar mohanmohan/** * @file new_sim_entity.h * * Defines the class NewSimulatorEntityPath. * * @author Lars Wetzel * @version 0.2 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * The new simulator plugin was adapted from the ipmidirect plugin. * Thanks to * Thomas Kanngieser * Pierre Sangouard */ #ifndef __NEW_SIM_ENTITY_H__ #define __NEW_SIM_ENTITY_H__ #include #include extern "C" { #include "SaHpi.h" } #ifndef __NEW_SIM_LOG_h__ #include "new_sim_log.h" #endif /** * @class NewSimulatorEntityPath * * Wrapper class for entity path **/ class NewSimulatorEntityPath { public: SaHpiEntityPathT m_entity_path; ///< Holding the entityPath /// Constructor NewSimulatorEntityPath(); /// Constructor to fill the class with an entity path NewSimulatorEntityPath( const SaHpiEntityPathT &entity_path ); /// return the HPI structure operator SaHpiEntityPathT() { return m_entity_path; } void SetEntry( int idx, SaHpiEntityTypeT type, SaHpiEntityLocationT instance ); SaHpiEntityTypeT GetEntryType( int idx ); void SetEntryType( int idx, SaHpiEntityTypeT type ); SaHpiEntityLocationT GetEntryInstance( int idx ); void SetEntryInstance( int idx, SaHpiEntityLocationT instance ); void AppendRoot( int idx ); void ReplaceRoot( NewSimulatorEntityPath root ); bool FromString( const char *str ); NewSimulatorEntityPath &operator+=( const NewSimulatorEntityPath &epath ); bool operator==( const NewSimulatorEntityPath &epath ) const; bool operator!=( const NewSimulatorEntityPath &epath ) const; }; NewSimulatorLog &operator<<( NewSimulatorLog &log, const NewSimulatorEntityPath &epath ); #endif openhpi-3.6.1/plugins/dynamic_simulator/new_sim_resource.h0000644000175100017510000001341012575647274023122 0ustar mohanmohan/** * @file new_sim_resource.h * * The file includes a definition of a class for resource handling:\n * NewSimulatorResource * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * The new Simulator plugin is adapted from the ipmidirect plugin. * Thanks to * Thomas Kanngieser * Pierre Sangouard * */ #ifndef __NEW_SIM_RESOURCE_H__ #define __NEW_SIM_RESOURCE_H__ #ifndef __NEW_SIM_CONTROL_H__ #include "new_sim_control.h" #endif #ifndef __NEW_SIM_HOTSWAP_H__ #include "new_sim_hotswap.h" #endif #ifndef __ARRAY_H__ #include "array.h" #endif /** * @class NewSimulatorResource * * Class for simulating resources * **/ class NewSimulatorResource : cArray { public: // find a specific rdr NewSimulatorRdr *FindRdr( SaHpiRdrTypeT type, unsigned int num ); bool AddRdr( NewSimulatorRdr *rdr ); bool RemRdr( NewSimulatorRdr *rdr ); /// Find a rdr object int FindRdr( NewSimulatorRdr *rdr ) { return Find( rdr ); } /// Return the number of rdr entries int NumRdr() { return Num(); } /// Get a rdr object by index NewSimulatorRdr *GetRdr( int idx ) { return operator[]( idx ); } protected: /// pointer on the domain NewSimulatorDomain *m_domain; /// hotswap state of the FRU NewSimulatorHotSwap m_hotswap; /// entity path of the resource NewSimulatorEntityPath m_entity_path; /// is the resource a FRU or not bool m_is_fru; /// oem value unsigned int m_oem; /// mapping of sensor numbers - obsolet? int m_sensor_num[256]; /// rpt entry values SaHpiRptEntryT m_rpt_entry; /// resource tag NewSimulatorTextBuffer m_resource_tag; /// highest control id unsigned int m_current_control_id; /// power state SaHpiPowerStateT m_power_state; /// indicator state SaHpiHsIndicatorStateT m_hotswap_indicator; /// reset action SaHpiResetActionT m_reset_state; public: int CreateSensorNum( SaHpiSensorNumT num ); /// get a unique control num for this resource unsigned int GetControlNum() { return ++m_current_control_id; } public: NewSimulatorDomain *Domain() const; /// set/get oem value unsigned int &Oem() { return m_oem; } /// set/get EntityPath NewSimulatorEntityPath &EntityPath() { return m_entity_path; } /// set/get FRU flag bool &IsFru() { return m_is_fru; } /// set/get resource tag NewSimulatorTextBuffer &ResourceTag() { return m_resource_tag; } /// get hotswap state SaHpiHsStateT HotSwapState() { return m_hotswap.GetState(); } /// set/get power state SaHpiPowerStateT &PowerState() { return m_power_state; } /// set/get hotswap indicator state SaHpiHsIndicatorStateT &HSIndicator() { return m_hotswap_indicator; } /// set/get reset state SaHpiResetActionT &ResetState() { return m_reset_state; } /// set/get entry id SaHpiEntryIdT &EntryId() { return m_rpt_entry.EntryId; } /// set/get resource capabilities SaHpiCapabilitiesT &ResourceCapabilities() { return m_rpt_entry.ResourceCapabilities; } /// set/get hotswap capabilities SaHpiHsCapabilitiesT &HotSwapCapabilities() { return m_rpt_entry.HotSwapCapabilities; } /// set/get resource id SaHpiResourceIdT ResourceId() { return m_rpt_entry.ResourceId; } /// set/get resource severity SaHpiSeverityT &ResourceSeverity() { return m_rpt_entry.ResourceSeverity; } /// set/get resource failed flag SaHpiBoolT &ResourceFailed() { return m_rpt_entry.ResourceFailed; } public: NewSimulatorResource( NewSimulatorDomain *domain ); virtual ~NewSimulatorResource(); public: virtual bool Destroy(); void Dump( NewSimulatorLog &dump ) const; /// HPI Function implement in NewSimulatorHotSwap::SetExtractTimeout() SaErrorT SetAutoExtractTimeout( SaHpiTimeoutT timeout ) { return m_hotswap.SetExtractTimeout( timeout ); } /// HPI Function implement in NewSimulatorHotSwap::GetExtractTimeout() SaErrorT GetAutoExtractTimeout( SaHpiTimeoutT &timeout ) { return m_hotswap.GetExtractTimeout( timeout ); } /// HPI Function implement in NewSimulatorHotSwap::ActionRequest() SaErrorT RequestHotswapAction( SaHpiHsActionT action ) { return m_hotswap.ActionRequest( action ); } /// HPI Function implement in NewSimulatorHotSwap::GetState() SaErrorT GetHotswapState( SaHpiHsStateT &state ) { return m_hotswap.GetState( state ); } /// HPI Function implement in NewSimulatorHotSwap::SetActive() SaErrorT SetStateActive() { return m_hotswap.SetActive(); } /// HPI Function implement in NewSimulatorHotSwap::SetInactive() SaErrorT SetStateInactive() { return m_hotswap.SetInactive(); } /// HPI Function implement in NewSimulatorHotSwap::CancelPolicy() SaErrorT HotswapPolicyCancel() { return m_hotswap.CancelPolicy(); } void SetResourceInfo( SaHpiResourceInfoT resinfo ); private: /// flag if resource is populated bool m_populate; public: // create and populate hpi resource virtual bool Create( SaHpiRptEntryT &entry ); virtual bool Populate(); }; #endif openhpi-3.6.1/plugins/dynamic_simulator/new_sim_timer_thread.h0000644000175100017510000000317012575647274023744 0ustar mohanmohan/** * @file new_sim_timer_thread.h * * The file includes a class for starting a timer in a thread:\n * NewSimulatorTimerThread * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * */ #ifndef __NEW_SIM_TIMER_THREAD_H__ #define __NEW_SIM_TIMER_THREAD_H__ #ifndef __NEW_SIM_UTILS_H__ #include "new_sim_utils.h" #endif #ifndef __THREAD_H__ #include "thread.h" #endif class NewSimulatorWatchdog; class NewSimulatorHotSwap; class NewSimulatorTimerThread; /// us for which the timer will sleep #define THREAD_SLEEPTIME 10000 /** * @class NewSimulatorTimerThread * * Starts a thread in which a timer will trigger a function after expiration. **/ class NewSimulatorTimerThread : public cThread { private: /// Timeout in ms unsigned int m_timeout; /// Start time of timer cTime m_start; protected: virtual void *Run(); /// Flag if a thread is already running bool m_running; /// Abstract method which is called after the timre expires virtual bool TriggerAction() = 0; public: /// signal thread to exit bool m_exit; NewSimulatorTimerThread( unsigned int ms_timeout ); virtual ~NewSimulatorTimerThread(); void Stop(); unsigned int Reset( unsigned int new_timeout ); }; #endif openhpi-3.6.1/plugins/dynamic_simulator/new_sim_control_digital.cpp0000644000175100017510000001063512575647274025011 0ustar mohanmohan/** * @file new_sim_control_digital.cpp * * The file includes a class for digital control handling:\n * NewSimulatorControlDigital * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * */ #include "new_sim_control.h" #include "new_sim_control_digital.h" #include "new_sim_domain.h" /** * Constructor **/ NewSimulatorControlDigital::NewSimulatorControlDigital( NewSimulatorResource *res, SaHpiRdrT rdr, SaHpiCtrlStateDigitalT state, SaHpiCtrlModeT mode ) : NewSimulatorControl( res, rdr, mode ) { memcpy(&m_rec, &rdr.RdrTypeUnion.CtrlRec.TypeUnion.Digital, sizeof( SaHpiCtrlRecDigitalT )); memcpy(&m_state, &state, sizeof( SaHpiCtrlStateDigitalT )); } /** * Destructor **/ NewSimulatorControlDigital::~NewSimulatorControlDigital() {} /** * A rdr structure is filled with the data * * This method is called by method NewSimulatorRdr::Populate(). * * @param resource Address of resource structure * @param rdr Address of rdr structure * * @return true **/ bool NewSimulatorControlDigital::CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ) { if ( NewSimulatorControl::CreateRdr( resource, rdr ) == false ) return false; memcpy(&rdr.RdrTypeUnion.CtrlRec.TypeUnion.Digital, &m_rec, sizeof( SaHpiCtrlRecDigitalT )); return true; } /** * HPI function saHpiControlGet() * * See also the description of the function inside the specification or header file. * Copying the internal values (if a read is allowed). * * @param mode address to be filled * @param state address to be filled * * @return HPI return code **/ SaErrorT NewSimulatorControlDigital::GetState( SaHpiCtrlModeT &mode, SaHpiCtrlStateT &state ) { if (m_write_only == SAHPI_TRUE) return SA_ERR_HPI_INVALID_CMD; if ( &mode != NULL ) { mode = m_ctrl_mode; } if ( &state != NULL ) { state.Type = m_type; memcpy( &state.StateUnion.Digital, &m_state, sizeof( SaHpiCtrlStateDigitalT )); } return SA_OK; } /** * HPI function saHpiControlSet() * * See also the description of the function inside the specification or header file. * Copying the internal values (if a read is allowed). * * @param mode address to be set * @param state address to be set * * @return HPI return code **/ SaErrorT NewSimulatorControlDigital::SetState( const SaHpiCtrlModeT &mode, const SaHpiCtrlStateT &state ) { if (&mode == NULL) return SA_ERR_HPI_INVALID_PARAMS; if ((m_def_mode.ReadOnly == SAHPI_TRUE) && (mode != m_def_mode.Mode)) return SA_ERR_HPI_READ_ONLY; if (mode == SAHPI_CTRL_MODE_AUTO) { m_ctrl_mode = mode; return SA_OK; } if (mode != SAHPI_CTRL_MODE_MANUAL) return SA_ERR_HPI_INVALID_PARAMS; if (&state == NULL) return SA_ERR_HPI_INVALID_PARAMS; if (state.Type != m_type) return SA_ERR_HPI_INVALID_DATA; switch ( state.StateUnion.Digital ) { case SAHPI_CTRL_STATE_PULSE_ON: if (m_state == SAHPI_CTRL_STATE_ON) return SA_ERR_HPI_INVALID_REQUEST; break; case SAHPI_CTRL_STATE_PULSE_OFF: if (m_state == SAHPI_CTRL_STATE_OFF) return SA_ERR_HPI_INVALID_REQUEST; break; case SAHPI_CTRL_STATE_ON: case SAHPI_CTRL_STATE_OFF: m_state = state.StateUnion.Digital; break; default: return SA_ERR_HPI_INVALID_PARAMS; } m_ctrl_mode = mode; return SA_OK; } /** * Dump the control information * * @param dump Address of the log * **/ void NewSimulatorControlDigital::Dump( NewSimulatorLog &dump ) const { dump << "Digital control " << m_id_string << ";\n"; dump << "ControlNum " << m_num << ";\n"; dump << "Oem " << m_oem << ";\n"; dump << "State " << m_state << ";\n"; dump << "Mode " << m_ctrl_mode << ";\n"; } openhpi-3.6.1/plugins/dynamic_simulator/new_sim_control_stream.h0000644000175100017510000000331012575647274024324 0ustar mohanmohan/** * @file new_sim_control_stream.h * * The file includes a class for stream control handling:\n * NewSimulatorControlStream * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * */ #ifndef __NEW_SIM_CONTROL_STREAM_H__ #define __NEW_SIM_CONTROL_STREAM_H__ #ifndef __NEW_SIM_RDR_H__ #include "new_sim_rdr.h" #endif #ifndef __NEW_SIM_CONTROL_H__ #include "new_sim_control.h" #endif extern "C" { #include "SaHpi.h" } /** * @class NewSimulatorControlStream * * Class for simulating Stream controls * **/ class NewSimulatorControlStream : public NewSimulatorControl { protected: /// rdr information - Stream record SaHpiCtrlRecStreamT m_rec; /// state of the control SaHpiCtrlStateStreamT m_state; public: NewSimulatorControlStream( NewSimulatorResource *res, SaHpiRdrT rdr, SaHpiCtrlStateStreamT state, SaHpiCtrlModeT mode ); virtual ~NewSimulatorControlStream(); // create an RDR sensor record virtual bool CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ); virtual SaErrorT SetState( const SaHpiCtrlModeT &mode, const SaHpiCtrlStateT &state ); virtual SaErrorT GetState( SaHpiCtrlModeT &mode, SaHpiCtrlStateT &state ); virtual void Dump( NewSimulatorLog &dump ) const; }; #endif openhpi-3.6.1/plugins/dynamic_simulator/new_sim_file_fumi.cpp0000644000175100017510000010642112575647274023572 0ustar mohanmohan/** * @file new_sim_file_fumi.cpp * * The file includes the class for parsing the fumi data:\n * NewSimulatorFileFumi * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * */ #include #include #include #include #include #include "new_sim_file_rdr.h" #include "new_sim_file_fumi.h" #include "new_sim_fumi.h" #include "new_sim_fumi_data.h" #include "new_sim_file_util.h" #include "new_sim_resource.h" #include "new_sim_rdr.h" #include /** * Constructor **/ NewSimulatorFileFumi::NewSimulatorFileFumi( GScanner *scanner ) : NewSimulatorFileRdr ( scanner ) { m_fumi_rec = &m_rdr.RdrTypeUnion.FumiRec; } /** * Destructor **/ NewSimulatorFileFumi::~NewSimulatorFileFumi() { } /** * Parse inside the \c FUMI_TOKEN_HANDLER the \c RDR_DETAIL_TOKEN_HANDLER * * Depend on which control type is parsed several help methods are called. Startpoint is the * \c RDR_DETAIL_TOKEN_HANDLER. Endpoint is the last \c G_TOKEN_RIGHT_CURLY of the \c * FUMI_TOKEN_HANDLER. * * @param res Pointer on the resource which includes the fumi object * * @return Pointer on a new Rdr entry **/ NewSimulatorRdr * NewSimulatorFileFumi::process_token( NewSimulatorResource *res) { bool success = true; char *field; NewSimulatorFumi *fumi = NULL; guint cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_LEFT_CURLY) { err("Processing parse configuration: Expected left curly token."); return NULL; } m_depth++; while ( (m_depth > 0) && success ) { cur_token = g_scanner_get_next_token(m_scanner); switch (cur_token) { case G_TOKEN_EOF: err("Processing parse fumi entry: File ends too early"); success = false; break; case G_TOKEN_RIGHT_CURLY: m_depth--; break; case G_TOKEN_LEFT_CURLY: m_depth++; break; case G_TOKEN_STRING: field = g_strdup(m_scanner->value.v_string); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (!strcmp(field, "Num")) { if (cur_token == G_TOKEN_INT) m_fumi_rec->Num = m_scanner->value.v_int; } else if (!strcmp(field, "AccessProt")) { if (cur_token == G_TOKEN_INT) m_fumi_rec->AccessProt = (SaHpiFumiProtocolT) m_scanner->value.v_int; } else if (!strcmp(field, "Capability")) { if (cur_token == G_TOKEN_INT) m_fumi_rec->Capability = (SaHpiFumiCapabilityT) m_scanner->value.v_int; } else if (!strcmp(field, "NumBanks")) { if (cur_token == G_TOKEN_INT) m_fumi_rec->NumBanks = m_scanner->value.v_int; } else if (!strcmp(field, "Oem")) { if (cur_token == G_TOKEN_INT) m_fumi_rec->Oem = m_scanner->value.v_int; } else { // Unknown Token err("Processing parse rdr entry: Unknown Rdr field %s", field); success = false; } break; case FUMI_DATA_TOKEN_HANDLER: fumi = new NewSimulatorFumi( res, m_rdr ); success = process_fumi_data( fumi ); break; default: err("Processing parse rdr entry: Unknown token"); success = false; break; } } if ( success ) { stdlog << "DBG: Parse Fumi successfully\n"; // necessary if some fumi_rec data was read after the DATA section if ( fumi != NULL ) { fumi->SetData( *m_fumi_rec ); } else { // Missing data section -> we have to initialize a new Fumi object fumi = new NewSimulatorFumi( res, m_rdr ); } return fumi; } if (fumi != NULL) delete fumi; return NULL; } /** * Parse the Fumi Data section * * Startpoint is the \c FUMI_DATA_TOKEN_HANDLER. Endpoint is the last \c G_TOKEN_RIGHT_CURLY. * * @return bool value success * **/ bool NewSimulatorFileFumi::process_fumi_data( NewSimulatorFumi *fumi ) { bool success = true; int start = m_depth; char *field; guint cur_token; SaHpiFumiSpecInfoT fumiSpec; SaHpiFumiSpecInfoTypeT fumiSpecType = SAHPI_FUMI_SPEC_INFO_NONE; SaHpiBoolT rollbDisabled = SAHPI_TRUE; SaHpiFumiServiceImpactDataT fumiImpact; unsigned int entCounter = 0; bool impactFlag = false; NewSimulatorFumiBank *fbank; memset( &fumiSpec, 0, sizeof( SaHpiFumiSpecInfoT )); memset( &fumiImpact, 0, sizeof( SaHpiFumiServiceImpactDataT )); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_LEFT_CURLY) { err("Processing parse fumi rdr entry - Missing left curly in FumiData section"); success = false; } m_depth++; if (!success) return success; while ( (m_depth > start) && success ) { cur_token = g_scanner_get_next_token(m_scanner); switch (cur_token) { case G_TOKEN_EOF: err("Processing parse rdr entry: File ends too early"); success = false; break; case G_TOKEN_RIGHT_CURLY: m_depth--; break; case G_TOKEN_LEFT_CURLY: m_depth++; break; case G_TOKEN_STRING: field = g_strdup(m_scanner->value.v_string); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (!strcmp(field, "SpecInfoType")) { if (cur_token == G_TOKEN_INT) fumiSpec.SpecInfoType = ( SaHpiFumiSpecInfoTypeT ) m_scanner->value.v_int; } else if (!strcmp(field, "SafDefined")) { if (cur_token != G_TOKEN_LEFT_CURLY) { err("Missing Left Curly for fumi SafDefined entry" ); success = false; } else { if ( fumiSpecType != SAHPI_FUMI_SPEC_INFO_NONE ) { err("Too many fumi spec info fields include inside FUMI_DATA."); success = false; } else if ( fumiSpec.SpecInfoType != SAHPI_FUMI_SPEC_INFO_SAF_DEFINED ) { err("SpecInfoType doesn't fit to SafDefined inside FUMI_DATA."); success = false; } fumiSpecType = SAHPI_FUMI_SPEC_INFO_SAF_DEFINED; m_depth++; } } else if (!strcmp(field, "OemDefined")) { if (cur_token != G_TOKEN_LEFT_CURLY) { err("Missing Left Curly for fumi OemDefined entry" ); success = false; } else { if ( fumiSpecType != SAHPI_FUMI_SPEC_INFO_NONE ) { err("Too many fumi spec info fields include inside FUMI_DATA."); success = false; } else if ( fumiSpec.SpecInfoType != SAHPI_FUMI_SPEC_INFO_OEM_DEFINED ) { err("SpecInfoType doesn't fit to OemDefined inside FUMI_DATA."); success = false; } fumiSpecType = SAHPI_FUMI_SPEC_INFO_OEM_DEFINED; m_depth++; } } else if (!strcmp(field, "SpecID")) { if (cur_token == G_TOKEN_INT) fumiSpec.SpecInfoTypeUnion.SafDefined.SpecID = ( SaHpiFumiSafDefinedSpecIdT ) m_scanner->value.v_int; } else if (!strcmp(field, "RevisionID")) { if (cur_token == G_TOKEN_INT) fumiSpec.SpecInfoTypeUnion.SafDefined.RevisionID = m_scanner->value.v_int; } else if (!strcmp(field, "Mid")) { if (cur_token == G_TOKEN_INT) fumiSpec.SpecInfoTypeUnion.OemDefined.Mid = m_scanner->value.v_int; } else if (!strcmp(field, "BodyLength")) { if (cur_token == G_TOKEN_INT) fumiSpec.SpecInfoTypeUnion.OemDefined.BodyLength = m_scanner->value.v_int; } else if (!strcmp(field, "Body")) { if (cur_token == G_TOKEN_STRING) success = process_hexstring(fumiSpec.SpecInfoTypeUnion.OemDefined.BodyLength, g_strdup(m_scanner->value.v_string), &(fumiSpec.SpecInfoTypeUnion.OemDefined.Body[0])); } else if (!strcmp(field, "AutoRollbackDisable")) { if (cur_token == G_TOKEN_INT) rollbDisabled = ( SaHpiBoolT ) m_scanner->value.v_int; } else if (!strcmp(field, "NumEntities")) { if (cur_token == G_TOKEN_INT) fumiImpact.NumEntities = m_scanner->value.v_int; if ( fumiImpact.NumEntities > SAHPI_FUMI_MAX_ENTITIES_IMPACTED ) { err("Too many entities are defined for ImpactedEntities"); success = false; } } else if (!strcmp(field, "ImpactedEntities")) { if (cur_token != G_TOKEN_LEFT_CURLY) { err("Missing Left Curly for fumi ImpactedEntities entry" ); success = false; } else { m_depth++; if ( entCounter > fumiImpact.NumEntities - 1 ) { err("Too many entries for ImpactedEntities are defined"); success = false; } } } else if (!strcmp(field, "ImpactedEntity")) { if (cur_token == G_TOKEN_LEFT_CURLY) success = process_entity( fumiImpact.ImpactedEntities[entCounter].ImpactedEntity ); if ( !success ) err("Error at parsing the entity path"); if ( impactFlag ) { entCounter++; impactFlag = false; } else { impactFlag = true; } } else if (!strcmp(field, "ServiceImpact")) { if (cur_token == G_TOKEN_INT) fumiImpact.ImpactedEntities[entCounter].ServiceImpact = ( SaHpiFumiServiceImpactT ) m_scanner->value.v_int; if ( impactFlag ) { entCounter++; impactFlag = false; } else { impactFlag = true; } } else { // Unknown Token err("Processing parse rdr entry: Unknown type field %s", field); success = false; } break; case FUMI_SOURCE_DATA_TOKEN_HANDLER: fbank = new NewSimulatorFumiBank; success = process_fumi_source_info( fbank ); fumi->SetBankSource( fbank ); delete fbank; fbank = NULL; break; case FUMI_TARGET_DATA_TOKEN_HANDLER: fbank = new NewSimulatorFumiBank; success = process_fumi_target_info( fbank ); fumi->SetBankTarget( fbank ); delete fbank; fbank = NULL; break; case FUMI_LOG_TARGET_DATA_TOKEN_HANDLER: fbank = new NewSimulatorFumiBank; success = process_fumi_logical_target_info( fbank ); fumi->SetBankLogical( fbank ); delete fbank; fbank = NULL; break; default: err("Processing Fumi data: Unknown token"); success = false; break; } } fumi->SetInfo( fumiSpec, fumiImpact, rollbDisabled ); return success; } /** * Parse fumi source information * * Startpoint is the \c FUMI_SOURCE_DATA_TOKEN_HANDLER. Endpoint is the last \c G_TOKEN_RIGHT_CURLY. * * @param fbank pointer on a NewSimulatorFumiBank to be filled * @return bool value success * **/ bool NewSimulatorFileFumi::process_fumi_source_info( NewSimulatorFumiBank *bank ) { bool success = true; int start = m_depth; char *field; guint cur_token; SaHpiFumiSourceInfoT source; NewSimulatorFumiComponent *comp; memset( &source, 0, sizeof( SaHpiFumiSourceInfoT )); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_LEFT_CURLY) { err("Processing parse idr area entry - Missing left curly"); success = false; } m_depth++; if (!success) return success; while ( (m_depth > start) && success ) { cur_token = g_scanner_get_next_token(m_scanner); switch (cur_token) { case G_TOKEN_EOF: err("Processing parse rdr entry: File ends too early"); success = false; break; case G_TOKEN_RIGHT_CURLY: m_depth--; break; case G_TOKEN_LEFT_CURLY: m_depth++; break; case G_TOKEN_STRING: field = g_strdup(m_scanner->value.v_string); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (!strcmp(field, "ForBank")) { if (cur_token == G_TOKEN_INT) bank->SetId( m_scanner->value.v_int ); } else if (!strcmp(field, "SourceUri")) { if (cur_token == G_TOKEN_LEFT_CURLY) { success = process_textbuffer( source.SourceUri ); } else { err("Processing parse fumi entry: Couldn't parse SourceUri"); } } else if (!strcmp(field, "SourceStatus")) { if (cur_token == G_TOKEN_INT) source.SourceStatus = ( SaHpiFumiSourceStatusT ) m_scanner->value.v_int; } else if (!strcmp(field, "Identifier")) { if (cur_token == G_TOKEN_LEFT_CURLY) { success = process_textbuffer( source.Identifier ); } else { err("Processing parse fumi entry: Couldn't parse Identifier"); } } else if (!strcmp(field, "Description")) { if (cur_token == G_TOKEN_LEFT_CURLY) { success = process_textbuffer( source.Description ); } else { err("Processing parse fumi entry: Couldn't parse Description"); } } else if (!strcmp(field, "DateTime")) { if (cur_token == G_TOKEN_LEFT_CURLY) { success = process_textbuffer( source.DateTime ); } else { err("Processing parse fumi entry: Couldn't parse DateTime"); } } else if (!strcmp(field, "MajorVersion")) { if (cur_token == G_TOKEN_INT) source.MajorVersion = ( SaHpiUint32T ) m_scanner->value.v_int; } else if (!strcmp(field, "MinorVersion")) { if (cur_token == G_TOKEN_INT) source.MinorVersion = ( SaHpiUint32T ) m_scanner->value.v_int; } else if (!strcmp(field, "AuxVersion")) { if (cur_token == G_TOKEN_INT) source.AuxVersion = ( SaHpiUint32T ) m_scanner->value.v_int; } else { // Unknown Token err("Processing parse rdr entry: Unknown type field %s", field); success = false; } break; case FUMI_SOURCE_DATA_TOKEN_HANDLER: comp = new NewSimulatorFumiComponent(); success = process_fumi_component( comp ); bank->AddSourceComponent( comp ); delete comp; break; default: err("Processing data format: Unknown token"); success = false; break; } } bank->SetData( source ); return success; } /** * Parse a fumi source component * * Startpoint is the \c FUMI_SOURCE_DATA_TOKEN_HANDLER or \c FUMI_TARGET_DATA_TOKEN_HANDLER. Endpoint is the last \c G_TOKEN_RIGHT_CURLY. * * @param comp pointer on a NewSimulatorFumiComponent to be filled * @return bool value success * **/ bool NewSimulatorFileFumi::process_fumi_component( NewSimulatorFumiComponent *comp ) { bool success = true; int start = m_depth; char *field; guint cur_token; SaHpiFumiComponentInfoT compinfo; cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_LEFT_CURLY) { err("Processing parse idr field entry - Missing left curly"); success = false; } m_depth++; if (!success) return success; while ( (m_depth > start) && success ) { cur_token = g_scanner_get_next_token(m_scanner); switch (cur_token) { case G_TOKEN_EOF: err("Processing parse rdr entry: File ends too early"); success = false; break; case G_TOKEN_RIGHT_CURLY: m_depth--; break; case G_TOKEN_LEFT_CURLY: m_depth++; break; case G_TOKEN_STRING: field = g_strdup(m_scanner->value.v_string); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (!strcmp(field, "EntryId")) { if (cur_token == G_TOKEN_INT) compinfo.EntryId = m_scanner->value.v_int; } else if (!strcmp(field, "ComponentId")) { if (cur_token == G_TOKEN_INT) compinfo.ComponentId = m_scanner->value.v_int; } else if (!strcmp(field, "MainFwInstance")) { if (cur_token == G_TOKEN_LEFT_CURLY) { success = process_fumi_firmware( compinfo.MainFwInstance ); } else { err("Processing parse fumi entry: Couldn't parse MainFwInstance"); } } else if (!strcmp(field, "ComponentFlags")) { if (cur_token == G_TOKEN_INT) compinfo.ComponentFlags = ( SaHpiUint32T ) m_scanner->value.v_int; } else { // Unknown Token err("Processing parse rdr entry: Unknown type field %s", field); success = false; } break; default: err("Processing data format: Unknown token"); success = false; break; } } comp->SetData( compinfo ); return success; } /** * Parse a fumi firmware information field * * Startpoint is the \c G_TOKEN_LEFT_CURLY. Endpoint is the last \c G_TOKEN_RIGHT_CURLY. * * @param fw address of firmware variable to be filled * @return bool value success * **/ bool NewSimulatorFileFumi::process_fumi_firmware( SaHpiFumiFirmwareInstanceInfoT &fw ) { bool success = true; int start = m_depth; char *field; guint cur_token; m_depth++; while ( (m_depth > start) && success ) { cur_token = g_scanner_get_next_token(m_scanner); switch (cur_token) { case G_TOKEN_EOF: err("Processing parse rdr entry: File ends too early"); success = false; break; case G_TOKEN_RIGHT_CURLY: m_depth--; break; case G_TOKEN_LEFT_CURLY: m_depth++; break; case G_TOKEN_STRING: field = g_strdup(m_scanner->value.v_string); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (!strcmp(field, "InstancePresent")) { if (cur_token == G_TOKEN_INT) fw.InstancePresent = ( SaHpiBoolT ) m_scanner->value.v_int; } else if (!strcmp(field, "Identifier")) { if (cur_token == G_TOKEN_LEFT_CURLY) success = process_textbuffer( fw.Identifier ); } else if (!strcmp(field, "Description")) { if (cur_token == G_TOKEN_LEFT_CURLY) success = process_textbuffer( fw.Description ); } else if (!strcmp(field, "DateTime")) { if (cur_token == G_TOKEN_LEFT_CURLY) success = process_textbuffer( fw.DateTime ); } else if (!strcmp(field, "MajorVersion")) { if (cur_token == G_TOKEN_INT) fw.MajorVersion = ( SaHpiUint32T ) m_scanner->value.v_int; } else if (!strcmp(field, "MinorVersion")) { if (cur_token == G_TOKEN_INT) fw.MinorVersion = ( SaHpiUint32T ) m_scanner->value.v_int; } else if (!strcmp(field, "AuxVersion")) { if (cur_token == G_TOKEN_INT) fw.AuxVersion = ( SaHpiUint32T ) m_scanner->value.v_int; } else { // Unknown Token err("Processing parse fumi firmware instance entry: Unknown type field %s", field); success = false; } break; default: err("Processing data format: Unknown token"); success = false; break; } } return success; } /** * Parse fumi target information * * Startpoint is the \c FUMI_TARGET_DATA_TOKEN_HANDLER. Endpoint is the last \c G_TOKEN_RIGHT_CURLY. * * @param bank pointer on a NewSimulatorFumiBank to be filled * @return bool value success * **/ bool NewSimulatorFileFumi::process_fumi_target_info( NewSimulatorFumiBank *bank ) { bool success = true; int start = m_depth; char *field; guint cur_token; SaHpiFumiBankInfoT target; NewSimulatorFumiComponent *comp; memset( &target, 0, sizeof( SaHpiFumiBankInfoT )); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_LEFT_CURLY) { err("Processing parse idr area entry - Missing left curly"); success = false; } m_depth++; if (!success) return success; while ( (m_depth > start) && success ) { cur_token = g_scanner_get_next_token(m_scanner); switch (cur_token) { case G_TOKEN_EOF: err("Processing parse rdr entry: File ends too early"); success = false; break; case G_TOKEN_RIGHT_CURLY: m_depth--; break; case G_TOKEN_LEFT_CURLY: m_depth++; break; case G_TOKEN_STRING: field = g_strdup(m_scanner->value.v_string); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (!strcmp(field, "BankId")) { if (cur_token == G_TOKEN_INT) target.BankId = m_scanner->value.v_int; } else if (!strcmp(field, "BankSize")) { if (cur_token == G_TOKEN_INT) target.BankSize = m_scanner->value.v_int; } else if (!strcmp(field, "Position")) { if (cur_token == G_TOKEN_INT) target.Position = m_scanner->value.v_int; } else if (!strcmp(field, "BankState")) { if (cur_token == G_TOKEN_INT) target.BankState = ( SaHpiFumiBankStateT )m_scanner->value.v_int; } else if (!strcmp(field, "Identifier")) { if (cur_token == G_TOKEN_LEFT_CURLY) { success = process_textbuffer( target.Identifier ); } else { err("Processing parse fumi entry: Couldn't parse Identifier"); } } else if (!strcmp(field, "Description")) { if (cur_token == G_TOKEN_LEFT_CURLY) { success = process_textbuffer( target.Description ); } else { err("Processing parse fumi entry: Couldn't parse Description"); } } else if (!strcmp(field, "DateTime")) { if (cur_token == G_TOKEN_LEFT_CURLY) { success = process_textbuffer( target.DateTime ); } else { err("Processing parse fumi entry: Couldn't parse DateTime"); } } else if (!strcmp(field, "MajorVersion")) { if (cur_token == G_TOKEN_INT) target.MajorVersion = ( SaHpiUint32T ) m_scanner->value.v_int; } else if (!strcmp(field, "MinorVersion")) { if (cur_token == G_TOKEN_INT) target.MinorVersion = ( SaHpiUint32T ) m_scanner->value.v_int; } else if (!strcmp(field, "AuxVersion")) { if (cur_token == G_TOKEN_INT) target.AuxVersion = ( SaHpiUint32T ) m_scanner->value.v_int; } else { // Unknown Token err("Processing parse rdr entry: Unknown type field %s", field); success = false; } break; case FUMI_TARGET_DATA_TOKEN_HANDLER: comp = new NewSimulatorFumiComponent(); success = process_fumi_component( comp ); bank->AddTargetComponent( comp ); delete comp; break; default: err("Processing data format: Unknown token"); success = false; break; } } bank->SetData( target ); return success; } /** * Parse fumi logical target information * * Startpoint is the \c FUMI_LOG_TARGET_DATA_TOKEN_HANDLER. Endpoint is the last * \c G_TOKEN_RIGHT_CURLY. * * @param bank pointer on a NewSimulatorFumiBank to be filled * @return bool value success * **/ bool NewSimulatorFileFumi::process_fumi_logical_target_info( NewSimulatorFumiBank *bank ) { bool success = true; int start = m_depth; char *field; guint cur_token; SaHpiFumiLogicalBankInfoT target; NewSimulatorFumiComponent *comp; memset( &target, 0, sizeof( SaHpiFumiLogicalBankInfoT )); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_LEFT_CURLY) { err("Processing parse idr area entry - Missing left curly"); success = false; } m_depth++; if (!success) return success; while ( (m_depth > start) && success ) { cur_token = g_scanner_get_next_token(m_scanner); switch (cur_token) { case G_TOKEN_EOF: err("Processing parse rdr entry: File ends too early"); success = false; break; case G_TOKEN_RIGHT_CURLY: m_depth--; break; case G_TOKEN_LEFT_CURLY: m_depth++; break; case G_TOKEN_STRING: field = g_strdup(m_scanner->value.v_string); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (!strcmp(field, "FirmwarePersistentLocationCount")) { if (cur_token == G_TOKEN_INT) target.FirmwarePersistentLocationCount = ( SaHpiUint8T ) m_scanner->value.v_int; } else if (!strcmp(field, "BankStateFlags")) { if (cur_token == G_TOKEN_INT) target.BankStateFlags = ( SaHpiFumiLogicalBankStateFlagsT ) m_scanner->value.v_int; } else if (!strcmp(field, "PendingFwInstance")) { if (cur_token == G_TOKEN_LEFT_CURLY) { success = process_fumi_firmware( target.PendingFwInstance ); } else { err("Processing parse fumi entry: Couldn't parse PendingFwInstance"); } } else if (!strcmp(field, "RollbackFwInstance")) { if (cur_token == G_TOKEN_LEFT_CURLY) { success = process_fumi_firmware( target.RollbackFwInstance ); } else { err("Processing parse fumi entry: Couldn't parse RollbackFwInstance"); } } else { // Unknown Token err("Processing parse rdr entry: Unknown type field %s", field); success = false; } break; case FUMI_LOG_TARGET_DATA_TOKEN_HANDLER: comp = new NewSimulatorFumiComponent(); success = process_fumi_logical_component( comp ); bank->AddLogicalTargetComponent( comp ); delete comp; break; default: err("Processing data format: Unknown token"); success = false; break; } } bank->SetData( target ); return success; } /** * Parse a fumi logical target component * * Startpoint is the \c FUMI_LOG_TARGET_DATA_TOKEN_HANDLER. Endpoint is the last * \c G_TOKEN_RIGHT_CURLY. * * @param comp pointer on a NewSimulatorFumiComponent to be filled * @return bool value success * **/ bool NewSimulatorFileFumi::process_fumi_logical_component( NewSimulatorFumiComponent *comp ) { bool success = true; int start = m_depth; char *field; guint cur_token; SaHpiFumiLogicalComponentInfoT compinfo; cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_LEFT_CURLY) { err("Processing parse idr field entry - Missing left curly"); success = false; } m_depth++; if (!success) return success; while ( (m_depth > start) && success ) { cur_token = g_scanner_get_next_token(m_scanner); switch (cur_token) { case G_TOKEN_EOF: err("Processing parse rdr entry: File ends too early"); success = false; break; case G_TOKEN_RIGHT_CURLY: m_depth--; break; case G_TOKEN_LEFT_CURLY: m_depth++; break; case G_TOKEN_STRING: field = g_strdup(m_scanner->value.v_string); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (!strcmp(field, "EntryId")) { if (cur_token == G_TOKEN_INT) compinfo.EntryId = m_scanner->value.v_int; } else if (!strcmp(field, "ComponentId")) { if (cur_token == G_TOKEN_INT) compinfo.ComponentId = m_scanner->value.v_int; } else if (!strcmp(field, "PendingFwInstance")) { if (cur_token == G_TOKEN_LEFT_CURLY) { success = process_fumi_firmware( compinfo.PendingFwInstance ); } else { err("Processing parse fumi entry: Couldn't parse PendingFwInstance"); } } else if (!strcmp(field, "RollbackFwInstance")) { if (cur_token == G_TOKEN_LEFT_CURLY) { success = process_fumi_firmware( compinfo.RollbackFwInstance ); } else { err("Processing parse fumi entry: Couldn't parse RollbackFwInstance"); } } else if (!strcmp(field, "ComponentFlags")) { if (cur_token == G_TOKEN_INT) compinfo.ComponentFlags = ( SaHpiUint32T ) m_scanner->value.v_int; } else { // Unknown Token err("Processing parse rdr entry: Unknown type field %s", field); success = false; } break; default: err("Processing data format: Unknown token"); success = false; break; } } comp->SetData( compinfo ); return success; } openhpi-3.6.1/plugins/dynamic_simulator/new_sim_text_buffer.cpp0000644000175100017510000003342612575647274024154 0ustar mohanmohan/** * @file new_sim_text_buffer.cpp * * * The file includes an abstract class for sensor handling:\n * NewSimulatorSensor * * @author Lars Wetzel * @version 0.2 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * The new Simulator plugin is adapted from the ipmidirect plugin. * Thanks to * Thomas Kanngieser * Pierre Sangouard * */ #include #include "new_sim_text_buffer.h" /** * Constructor **/ NewSimulatorTextBuffer::NewSimulatorTextBuffer() { Clear(); } /** * full qualified constructor **/ NewSimulatorTextBuffer::NewSimulatorTextBuffer( const char *string, SaHpiTextTypeT type, SaHpiLanguageT l ) { m_buffer.DataType = type; m_buffer.Language = l; SetAscii( string, type, l ); } /** * full qualified constructor **/ NewSimulatorTextBuffer::NewSimulatorTextBuffer( const SaHpiTextBufferT &buf ) { m_buffer = buf; } /** * Clear the internal m_buffer and set it to default values **/ void NewSimulatorTextBuffer::Clear() { m_buffer.DataType = SAHPI_TL_TYPE_TEXT; m_buffer.Language = SAHPI_LANG_ENGLISH; m_buffer.DataLength = 0; memset( m_buffer.Data, 0, SAHPI_MAX_TEXT_BUFFER_LENGTH ); } /// Array to check the validity of a character for BCDPLUS en- and decoding /// Element will be zero if not present, n-1 if present. static SaHpiUint8T table_4_bit[256] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0c, 0x0d, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; /** * Convert an ascii string to BCDPLUS * * @param s pointer on the string * @return DataLength after conversion **/ int NewSimulatorTextBuffer::AsciiToBcdPlus( const char *s ) { m_buffer.DataType = SAHPI_TL_TYPE_BCDPLUS; m_buffer.DataLength = 0; SaHpiUint8T *p = m_buffer.Data; int bit = 0; while( *s ) { if ( m_buffer.DataLength == SAHPI_MAX_TEXT_BUFFER_LENGTH ) break; switch( bit ) { case 0: m_buffer.DataLength++; *p = table_4_bit[(unsigned int)*s]; bit = 4; break; case 4: *p |= table_4_bit[(unsigned int)*s++] << 4; p++; bit = 0; break; } } return m_buffer.DataLength; } /// Array to check the validity of a character for ASCII 6 en- and decoding /// Element will be zero if not present, n-1 if present. static SaHpiUint8T table_6_bit[256] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x21, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x00, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; //////// // 0 1 2 3 // 0123456789012345678901234567890 // 000000111111222222333333444444 /** * Convert an ascii string to ascii6 * * @param s pointer on the string * @return DataLength after conversion **/ int NewSimulatorTextBuffer::AsciiToAscii6( const char *s ) { m_buffer.DataType = SAHPI_TL_TYPE_ASCII6; m_buffer.DataLength = 0; SaHpiUint8T *p = m_buffer.Data; int bit = 0; while( *s ) { if ( m_buffer.DataLength == SAHPI_MAX_TEXT_BUFFER_LENGTH ) break; switch( bit ) { case 0: *p = table_6_bit[(unsigned int)*s++]; m_buffer.DataLength++; bit = 6; break; case 2: *p |= (table_6_bit[(unsigned int)*s] << 2); bit = 0; break; case 4: *p |= table_4_bit[(unsigned int)*s] << 4; p++; *p = (table_4_bit[(unsigned int)*s++] >> 4) & 0x3; m_buffer.DataLength++; bit = 2; break; case 6: *p |= table_4_bit[(unsigned int)*s] << 6; p++; *p = (table_4_bit[(unsigned int)*s++] >> 2) & 0xf; m_buffer.DataLength++; bit = 4; break; } } return m_buffer.DataLength; } /** * Copy an ascii string into the internal structure * * @param s pointer on the string * @return DataLength **/ int NewSimulatorTextBuffer::AsciiToLanguage( const char *s ) { m_buffer.DataType = SAHPI_TL_TYPE_TEXT; int l = strlen( s ); if ( l > SAHPI_MAX_TEXT_BUFFER_LENGTH ) l = SAHPI_MAX_TEXT_BUFFER_LENGTH; m_buffer.DataLength = l; strncpy( ( char *)m_buffer.Data, s, SAHPI_MAX_TEXT_BUFFER_LENGTH ); return l; } /** * Set the value internally on ASCII * * @param string pointer on the string * @param type SaHpiTextTypeT value * @param l language value * @return DataLength **/ bool NewSimulatorTextBuffer::SetAscii( const char *string, SaHpiTextTypeT type, SaHpiLanguageT l ) { m_buffer.Language = l; switch( type ) { case SAHPI_TL_TYPE_BCDPLUS: AsciiToBcdPlus( string ); return true; case SAHPI_TL_TYPE_ASCII6: AsciiToAscii6( string ); return true; case SAHPI_TL_TYPE_TEXT: AsciiToLanguage( string ); return true; default: break; } return false; } /** * Fill m_buffer * * @param data SaHpiTextBufferT record to set internally * @return true **/ bool NewSimulatorTextBuffer::SetData( SaHpiTextBufferT data ) { stdlog << "get DataLength = " << data.DataLength << "\n"; memcpy( &m_buffer, &data, sizeof( SaHpiTextBufferT )); stdlog << "Databuffer: "; for (int i = 0; i < m_buffer.DataLength; i++) stdlog << m_buffer.Data[i]; stdlog << "\n"; return true; } /** * Return the type of the string * * @param s pointer on the string * @return type of string **/ SaHpiTextTypeT NewSimulatorTextBuffer::CheckAscii( const char *s ) { SaHpiTextTypeT type = SAHPI_TL_TYPE_BCDPLUS; while( *s ) { if ( type == SAHPI_TL_TYPE_BCDPLUS && table_4_bit[(int)*s] == 0 ) type = SAHPI_TL_TYPE_ASCII6; if ( type == SAHPI_TL_TYPE_ASCII6 && table_6_bit[(int) *s] == 0 ) { type = SAHPI_TL_TYPE_TEXT; break; } } return type; } /** * Copy the internal buffer into a Ascii buffer * * @param buffer pointer on Ascii buffer to be filled * @param len length of buffer * @return length **/ int NewSimulatorTextBuffer::BinaryToAscii( char *buffer, unsigned int len ) const { unsigned int l = m_buffer.DataLength; if ( l >= len ) l = len - 1; memcpy( buffer, m_buffer.Data, l ); buffer[l] = 0; return len; } /** * Copy the internal buffer into a Ascii buffer * * @param buffer pointer to Ascii buffer to be filled * @param len length of buffer * @return length **/ int NewSimulatorTextBuffer::BcdPlusToAscii( char *buffer, unsigned int len ) const { static char table[] = "0123456789 -.:,_"; unsigned int real_length = 2 * m_buffer.DataLength; if ( len > real_length ) len = real_length; bool first = true; const unsigned char *d = m_buffer.Data; for( unsigned int i = 0; i < len; i++ ) { int val = 0; if ( first ) val = *d & 0xf; else val = (*d++ >> 4) & 0xf; first = !first; *buffer++ = table[val]; } *buffer = 0; return len; } /** * Copy the internal buffer into a Ascii buffer * * @param buffer pointer to Ascii buffer to be filled * @param len length of buffer * @return length **/ int NewSimulatorTextBuffer::Ascii6ToAscii( char *buffer, unsigned int len ) const { static char table[64] = { ' ', '!', '"', '#', '$', '%', '&', '\'', '(', ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', '&', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[', '\\', ']', '^', '_' }; unsigned int real_length = (m_buffer.DataLength * 8) / 6; if ( len >= real_length ) len = real_length; const unsigned char *d = m_buffer.Data; int bo = 0; for( unsigned int i =0; i < len; i++ ) { int val = 0; switch( bo ) { case 0: val = *d & 0x3f; bo = 6; break; case 2: val = (*d >> 2) & 0x3f; d++; bo = 0; break; case 4: val = (*d >> 4) & 0xf; d++; val |= (*d & 0x3) << 4; bo = 2; break; case 6: val = (*d >> 6) & 0x3; d++; val |= (*d & 0xf) << 2; bo = 4; break; } *buffer++ = table[val]; } *buffer = 0; return len; } /** * Copy the internal buffer into a Ascii buffer * Only SAHPI_LANG_ENGLISH is supported. * * @param buffer pointer to Ascii buffer to be filled * @param len length of buffer * @return length **/ int NewSimulatorTextBuffer::LanguageToAscii( char *buffer, unsigned int len ) const { if ( m_buffer.Language == SAHPI_LANG_ENGLISH ) return BinaryToAscii( buffer, len ); // unicode not supported return -1; } /** * Fill the an Ascii buffer with the internal value * * @param buffer pointer to Ascii buffer to be filled * @param len length of buffer * @return length **/ int NewSimulatorTextBuffer::GetAscii( char *buffer, unsigned int len ) const { switch( m_buffer.DataType ) { case SAHPI_TL_TYPE_BINARY: return BinaryToAscii( buffer, len ); case SAHPI_TL_TYPE_BCDPLUS: return BcdPlusToAscii( buffer, len ); case SAHPI_TL_TYPE_ASCII6: return Ascii6ToAscii( buffer, len ); case SAHPI_TL_TYPE_TEXT: return LanguageToAscii( buffer, len ); default: return -1; } } /** * Comparison equal operator **/ bool NewSimulatorTextBuffer::operator==( const NewSimulatorTextBuffer &tb ) const { if ( m_buffer.DataType != tb.m_buffer.DataType ) return false; if ( m_buffer.Language != tb.m_buffer.Language ) return false; if ( m_buffer.DataLength != tb.m_buffer.DataLength ) return false; if ( m_buffer.DataLength ) return memcmp( m_buffer.Data, tb.m_buffer.Data, tb.m_buffer.DataLength ) == 0; return true; } /** * Comparison not equal operator **/ bool NewSimulatorTextBuffer::operator!=( const NewSimulatorTextBuffer &tb ) const { return !operator==( tb ); } /** * output operator **/ NewSimulatorLog & operator<<( NewSimulatorLog &dump, const NewSimulatorTextBuffer &tb ) { char str[2*SAHPI_MAX_TEXT_BUFFER_LENGTH+1] = ""; tb.GetAscii( str, 2*SAHPI_MAX_TEXT_BUFFER_LENGTH+1 ); dump << str; return dump; } openhpi-3.6.1/plugins/dynamic_simulator/new_sim_file_rdr.cpp0000644000175100017510000001112012575647274023410 0ustar mohanmohan/** * @file new_sim_file_rdr.cpp * * The file includes an abstract class for parsing the special rdr data:\n * NewSimulatorFileRdr * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * */ #include #include #include #include #include #include "new_sim_file_rdr.h" #include "new_sim_file_util.h" #include /** * Constructor **/ NewSimulatorFileRdr::NewSimulatorFileRdr(GScanner *scanner) : NewSimulatorFileUtil ( scanner ), m_depth ( 0 ) { memset( &m_rdr, 0, sizeof( SaHpiRdrT )); } /** * Destructor **/ NewSimulatorFileRdr::~NewSimulatorFileRdr() { } /** * Read a RDR section * * Startpoint is token \c RDR_TOKEN_HANDLER. Endpoint is \c G_TOKEN_RIGHT_CURLY if * no error occurs during parsing.\n * Depend on wich RDR type is read, some helper functions are called. * * @return success bool * **/ bool NewSimulatorFileRdr::process_rdr_token( void ) { guint cur_token = g_scanner_get_next_token(m_scanner); char *rdrfield; NewSimulatorEntityPath ep; bool success = true; bool commonBlock = true; if (cur_token != G_TOKEN_LEFT_CURLY) { err("Processing parse configuration: Expected left curly token."); return false; } m_depth++; while ( commonBlock && success) { cur_token = g_scanner_get_next_token(m_scanner); switch (cur_token) { case G_TOKEN_EOF: err("Processing parse rpt entry: File ends too early"); success = false; break; case G_TOKEN_RIGHT_CURLY: m_depth--; break; case G_TOKEN_LEFT_CURLY: m_depth++; break; case RDR_DETAIL_TOKEN_HANDLER: commonBlock = false; break; case G_TOKEN_STRING: rdrfield = g_strdup(m_scanner->value.v_string); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (!strcmp(rdrfield, "RecordId")) { // will be assigned by the daemon -> ignore it stdlog << "DBG: rdr - RecordId is ignored\n"; } else if (!strcmp(rdrfield, "RdrType")) { if (cur_token == G_TOKEN_INT) { m_rdr.RdrType = (SaHpiRdrTypeT) m_scanner->value.v_int; stdlog << "DBG: rdr - RdrType " << m_rdr.RdrType << "\n"; } else { err("Processing parse rpt entry: Wrong kind of RdrType"); } } else if (!strcmp(rdrfield, "Entity")) { if (cur_token == G_TOKEN_LEFT_CURLY) success = process_entity( m_rdr.Entity ); if ( !success ) err("Error at parsing the entity path"); } else if (!strcmp(rdrfield, "IsFru")) { if (cur_token == G_TOKEN_INT) { m_rdr.IsFru = m_scanner->value.v_int; stdlog << "DBG: rdr - IsFru " << m_rdr.IsFru << "\n"; } else { success = false; err("Processing parse rdr entry: Wrong kind of IsFru"); } } else if (!strcmp(rdrfield, "IdString")) { if ( cur_token == G_TOKEN_LEFT_CURLY ) { success = process_textbuffer( m_rdr.IdString ); stdlog << "DBG: IdString " << m_rdr.IdString << "\n"; } else { success = false; err("Processing parse rdr entry: Couldn't parse IdSting"); } } else { // Unknown Token err("Processing parse rdr entry: Unknown Rdr field %s", rdrfield); success = false; } break; default: err("Processing parse rdr entry: Unknown token"); success = false; break; } } return success; } openhpi-3.6.1/plugins/dynamic_simulator/new_sim_control_oem.cpp0000644000175100017510000001011112575647274024141 0ustar mohanmohan/** * @file new_sim_control_oem.cpp * * The file includes a class for oem control handling:\n * NewSimulatorControlOem * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * */ #include "new_sim_control.h" #include "new_sim_control_oem.h" #include "new_sim_domain.h" /** * Constructor **/ NewSimulatorControlOem::NewSimulatorControlOem( NewSimulatorResource *res, SaHpiRdrT rdr, SaHpiCtrlStateOemT state, SaHpiCtrlModeT mode ) : NewSimulatorControl( res, rdr, mode ) { memcpy(&m_rec, &rdr.RdrTypeUnion.CtrlRec.TypeUnion.Oem, sizeof( SaHpiCtrlRecOemT )); memcpy(&m_state, &state, sizeof( SaHpiCtrlStateOemT )); } /** * Destructor **/ NewSimulatorControlOem::~NewSimulatorControlOem() {} /** * A rdr structure is filled with the data * * This method is called by method NewSimulatorRdr::Populate(). * * @param resource Address of resource structure * @param rdr Address of rdr structure * * @return true **/ bool NewSimulatorControlOem::CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ) { if ( NewSimulatorControl::CreateRdr( resource, rdr ) == false ) return false; memcpy(&rdr.RdrTypeUnion.CtrlRec.TypeUnion.Oem, &m_rec, sizeof( SaHpiCtrlRecOemT )); return true; } /** * HPI function saHpiControlGet() * * See also the description of the function inside the specification or header file. * Copying the internal values (if a read is allowed). * * @param mode address to be filled * @param state address to be filled * * @return HPI return code **/ SaErrorT NewSimulatorControlOem::GetState( SaHpiCtrlModeT &mode, SaHpiCtrlStateT &state ) { if (m_write_only == SAHPI_TRUE) return SA_ERR_HPI_INVALID_CMD; if ( &mode != NULL ) { mode = m_ctrl_mode; } if ( &state != NULL ) { state.Type = m_type; memcpy( &state.StateUnion.Oem, &m_state, sizeof( SaHpiCtrlStateOemT )); } return SA_OK; } /** * HPI function saHpiControlSet() * * See also the description of the function inside the specification or header file. * Copying the internal values (if a read is allowed). * * @param mode address to be set * @param state address to be set * * @return HPI return code **/ SaErrorT NewSimulatorControlOem::SetState( const SaHpiCtrlModeT &mode, const SaHpiCtrlStateT &state ) { if (&mode == NULL) return SA_ERR_HPI_INVALID_PARAMS; if ((m_def_mode.ReadOnly == SAHPI_TRUE) && (mode != m_def_mode.Mode)) return SA_ERR_HPI_READ_ONLY; if (mode == SAHPI_CTRL_MODE_AUTO) { m_ctrl_mode = mode; return SA_OK; } if (mode != SAHPI_CTRL_MODE_MANUAL) return SA_ERR_HPI_INVALID_PARAMS; if (&state == NULL) return SA_ERR_HPI_INVALID_PARAMS; if (state.Type != m_type) return SA_ERR_HPI_INVALID_DATA; memcpy(&m_state.Body, &state.StateUnion.Oem.Body, sizeof( SaHpiUint8T ) * state.StateUnion.Oem.BodyLength); m_state.BodyLength = state.StateUnion.Oem.BodyLength; m_ctrl_mode = mode; return SA_OK; } /** * Dump the control information * * @param dump Address of the log * **/ void NewSimulatorControlOem::Dump( NewSimulatorLog &dump ) const { dump << "Oem control " << m_id_string << ";\n"; dump << "ControlNum " << m_num << ";\n"; dump << "Oem" << m_oem << ";\n"; dump << "state.mid " << m_state.MId << ";\n"; dump << "state.BodyLength " << m_state.BodyLength << ";\n"; dump << "state.Body " << m_state.Body << ";\n"; dump << "Mode" << m_ctrl_mode << ";\n"; } openhpi-3.6.1/plugins/dynamic_simulator/new_sim_file_sensor.h0000644000175100017510000000421612575647274023607 0ustar mohanmohan/** * @file new_sim_file_sensor.h * * The file includes helper classes for parsing sensor data from the simulation file:\n * NewSimulatorFileSensor * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * */ #ifndef __NEW_SIM_FILE_SENSOR_H__ #define __NEW_SIM_FILE_SENSOR_H__ #include extern "C" { #include "SaHpi.h" } #ifndef __NEW_SIM_FILE_RDR_H__ #include "new_sim_file_rdr.h" #endif #ifndef __NEW_SIM_RDR_H__ #include "new_sim_rdr.h" #endif #ifndef __NEW_SIM_RESOURCE_H__ #include "new_sim_resource.h" #endif #ifndef __NEW_SIM_SENSOR_H__ #include "new_sim_sensor.h" #endif /** * @class NewSimulatorFileSensor * * Provides some functions for parsing the sensor section of the simulation file. **/ class NewSimulatorFileSensor : public NewSimulatorFileRdr { private: SaHpiSensorRecT *m_sensor_rec; SaHpiSensorReadingT m_sensor_data; SaHpiEventStateT m_sensor_event_state; SaHpiEventStateT m_sensor_event_amask; SaHpiEventStateT m_sensor_event_dmask; SaHpiSensorThresholdsT m_sensor_thresholds; SaHpiBoolT m_sensor_enabled; SaHpiBoolT m_sensor_event_enabled; bool process_dataformat ( SaHpiSensorDataFormatT *dataformat); bool process_dataformat_range ( SaHpiSensorRangeT *datarange ); bool process_thresholddef ( SaHpiSensorThdDefnT *thresdef ); bool process_sensor_data_token ( void ); bool process_sensor_thresholds ( SaHpiSensorThresholdsT *thres ); bool process_sensor_reading ( SaHpiSensorReadingT *sensorreading ); public: NewSimulatorFileSensor(GScanner *scanner); virtual ~NewSimulatorFileSensor(); virtual NewSimulatorRdr * process_token(NewSimulatorResource *res); }; #endif /*__NEW_SIM_FILE_SENSOR_H_*/ openhpi-3.6.1/plugins/dynamic_simulator/new_sim_file_inventory.cpp0000644000175100017510000003266012575647274024672 0ustar mohanmohan/** * @file new_sim_file_inventory.cpp * * The file includes the class for parsing inventory data:\n * NewSimulatorFileInventory * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * */ #include #include #include #include #include #include "new_sim_file_rdr.h" #include "new_sim_file_inventory.h" #include "new_sim_inventory.h" #include "new_sim_inventory_data.h" #include "new_sim_file_util.h" #include "new_sim_resource.h" #include "new_sim_rdr.h" #include /** * Constructor **/ NewSimulatorFileInventory::NewSimulatorFileInventory( GScanner *scanner ) : NewSimulatorFileRdr ( scanner ) { m_idr_rec = &m_rdr.RdrTypeUnion.InventoryRec; } /** * Destructor **/ NewSimulatorFileInventory::~NewSimulatorFileInventory() { } /** * Parse inside the \c INVENTORY_TOKEN_HANDLER the \c RDR_DETAIL_TOKEN_HANDLER * * Startpoint is the \c RDR_DETAIL_TOKEN_HANDLER. Endpoint is the last * \c G_TOKEN_RIGHT_CURLY of the \c INVENTORY_TOKEN_HANDLER. For * \c INVENTORY_DATA_TOKEN_HANDLER the method * NewSimulatorFileInventory::process_idr_data is called. * * @param res Pointer on the resource which includes the inventory data * * @return Pointer on a new Rdr entry **/ NewSimulatorRdr * NewSimulatorFileInventory::process_token( NewSimulatorResource *res) { bool success = true; char *field; NewSimulatorInventory *idr = NULL; guint cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_LEFT_CURLY) { err("Processing parse configuration: Expected left curly token."); return NULL; } m_depth++; while ( (m_depth > 0) && success ) { cur_token = g_scanner_get_next_token(m_scanner); switch (cur_token) { case G_TOKEN_EOF: err("Processing parse rpt entry: File ends too early"); success = false; break; case G_TOKEN_RIGHT_CURLY: m_depth--; break; case G_TOKEN_LEFT_CURLY: m_depth++; break; case G_TOKEN_STRING: field = g_strdup(m_scanner->value.v_string); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (!strcmp(field, "IdrId")) { if (cur_token == G_TOKEN_INT) m_idr_rec->IdrId = m_scanner->value.v_int; } else if (!strcmp(field, "Persistent")) { if (cur_token == G_TOKEN_INT) m_idr_rec->Persistent = (SaHpiBoolT) m_scanner->value.v_int; } else if (!strcmp(field, "Oem")) { if (cur_token == G_TOKEN_INT) m_idr_rec->Oem = m_scanner->value.v_int; } else { // Unknown Token err("Processing parse rdr entry: Unknown Rdr field %s", field); success = false; } break; case INVENTORY_DATA_TOKEN_HANDLER: idr = new NewSimulatorInventory( res, m_rdr ); success = process_idr_data( idr ); break; default: err("Processing parse rdr entry: Unknown token"); success = false; break; } } if ( success ) { stdlog << "DBG: Parse Inventory successfully\n"; // necessary if some inventory_rec data was read after the DATA section if ( idr != NULL ) idr->SetData( *m_idr_rec ); return idr; } if (idr != NULL) delete idr; return NULL; } /** * Parse the Inventory Data section * * Startpoint is the \c INVENTORY_DATA_TOKEN_HANDLER. Endpoint is the last \c G_TOKEN_RIGHT_CURLY. * * @return bool value success * **/ bool NewSimulatorFileInventory::process_idr_data( NewSimulatorInventory *idr ) { bool success = true; int start = m_depth; char *field; guint cur_token; SaHpiIdrInfoT idrInfo; NewSimulatorInventoryArea *ida; memset( &idrInfo, 0, sizeof( SaHpiIdrInfoT )); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_LEFT_CURLY) { err("Processing parse control rdr entry - Missing left curly in InventoryData section"); success = false; } m_depth++; if (!success) return success; while ( (m_depth > start) && success ) { cur_token = g_scanner_get_next_token(m_scanner); switch (cur_token) { case G_TOKEN_EOF: err("Processing parse rdr entry: File ends too early"); success = false; break; case G_TOKEN_RIGHT_CURLY: m_depth--; break; case G_TOKEN_LEFT_CURLY: m_depth++; break; case G_TOKEN_STRING: field = g_strdup(m_scanner->value.v_string); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (!strcmp(field, "IdrId")) { if (cur_token == G_TOKEN_INT) idrInfo.IdrId = m_scanner->value.v_int; } else if (!strcmp(field, "UpdateCount")) { if (cur_token == G_TOKEN_INT) idrInfo.UpdateCount = m_scanner->value.v_int; } else if (!strcmp(field, "ReadOnly")) { if (cur_token == G_TOKEN_INT) idrInfo.ReadOnly = (SaHpiBoolT) m_scanner->value.v_int; } else if (!strcmp(field, "NumAreas")) { if (cur_token == G_TOKEN_INT) idrInfo.NumAreas = (SaHpiBoolT) m_scanner->value.v_int; } else { // Unknown Token err("Processing parse rdr entry: Unknown type field %s", field); success = false; } break; case INV_AREA_TOKEN_HANDLER: ida = new NewSimulatorInventoryArea(); success = process_idr_area( ida ); idr->AddInventoryArea( ida ); break; default: err("Processing Annunciator data: Unknown token"); success = false; break; } } idr->SetInfo( idrInfo ); return success; } /** * Parse an idr area * * Startpoint is the \c INV_AREA_TOKEN_HANDLER. Endpoint is the last \c G_TOKEN_RIGHT_CURLY. * * @param ida pointer on a NewSimulatorInventoryArea to be filled * @return bool value success * **/ bool NewSimulatorFileInventory::process_idr_area( NewSimulatorInventoryArea *ida ) { bool success = true; int start = m_depth; char *field; guint cur_token; SaHpiIdrAreaHeaderT aheader; NewSimulatorInventoryField *idf; memset( &aheader, 0, sizeof( SaHpiIdrAreaHeaderT )); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_LEFT_CURLY) { err("Processing parse idr area entry - Missing left curly"); success = false; } m_depth++; if (!success) return success; while ( (m_depth > start) && success ) { cur_token = g_scanner_get_next_token(m_scanner); switch (cur_token) { case G_TOKEN_EOF: err("Processing parse rdr entry: File ends too early"); success = false; break; case G_TOKEN_RIGHT_CURLY: m_depth--; break; case G_TOKEN_LEFT_CURLY: m_depth++; break; case G_TOKEN_STRING: field = g_strdup(m_scanner->value.v_string); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (!strcmp(field, "AreaId")) { if (cur_token == G_TOKEN_INT) aheader.AreaId = m_scanner->value.v_int; } else if (!strcmp(field, "Type")) { if (cur_token == G_TOKEN_INT) aheader.Type = ( SaHpiIdrAreaTypeT ) m_scanner->value.v_int; } else if (!strcmp(field, "ReadOnly")) { if (cur_token == G_TOKEN_INT) aheader.ReadOnly = ( SaHpiBoolT ) m_scanner->value.v_int; } else if (!strcmp(field, "NumFields")) { if (cur_token == G_TOKEN_INT) aheader.NumFields = m_scanner->value.v_int; } else { // Unknown Token err("Processing parse rdr entry: Unknown type field %s", field); success = false; } break; case INV_FIELD_TOKEN_HANDLER: idf = new NewSimulatorInventoryField(); success = process_idr_field( idf ); ida->AddInventoryField( idf ); break; default: err("Processing data format: Unknown token"); success = false; break; } } ida->SetData( aheader ); return success; } /** * Parse an idr field * * Startpoint is the \c INV_FIELD_TOKEN_HANDLER. Endpoint is the last \c G_TOKEN_RIGHT_CURLY. * * @param idf pointer on a NewSimulatorInventoryField to be filled * @return bool value success * **/ bool NewSimulatorFileInventory::process_idr_field( NewSimulatorInventoryField *idf ) { bool success = true; int start = m_depth; char *field; guint cur_token; SaHpiIdrFieldT idrfield; cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_LEFT_CURLY) { err("Processing parse idr field entry - Missing left curly"); success = false; } m_depth++; if (!success) return success; while ( (m_depth > start) && success ) { cur_token = g_scanner_get_next_token(m_scanner); switch (cur_token) { case G_TOKEN_EOF: err("Processing parse rdr entry: File ends too early"); success = false; break; case G_TOKEN_RIGHT_CURLY: m_depth--; break; case G_TOKEN_LEFT_CURLY: m_depth++; break; case G_TOKEN_STRING: field = g_strdup(m_scanner->value.v_string); cur_token = g_scanner_get_next_token(m_scanner); if (cur_token != G_TOKEN_EQUAL_SIGN) { err("Processing parse rdr entry: Missing equal sign"); success = false; } cur_token = g_scanner_get_next_token(m_scanner); if (!strcmp(field, "AreaId")) { if (cur_token == G_TOKEN_INT) idrfield.AreaId = m_scanner->value.v_int; } else if (!strcmp(field, "FieldId")) { if (cur_token == G_TOKEN_INT) idrfield.FieldId = m_scanner->value.v_int; } else if (!strcmp(field, "Type")) { if (cur_token == G_TOKEN_INT) idrfield.Type = ( SaHpiIdrFieldTypeT ) m_scanner->value.v_int; } else if (!strcmp(field, "ReadOnly")) { if (cur_token == G_TOKEN_INT) idrfield.ReadOnly = ( SaHpiBoolT ) m_scanner->value.v_int; } else if (!strcmp(field, "Field")) { if (cur_token == G_TOKEN_LEFT_CURLY) success = process_textbuffer( idrfield.Field ); } else { // Unknown Token err("Processing parse rdr entry: Unknown type field %s", field); success = false; } break; default: err("Processing data format: Unknown token"); success = false; break; } } idf->SetData( idrfield ); return success; } openhpi-3.6.1/plugins/dynamic_simulator/new_sim_inventory.h0000644000175100017510000000637612575647274023345 0ustar mohanmohan/** * @file new_sim_inventory.h * * The file includes a class for inventory handling:\n * NewSimulatorInventory * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * */ #ifndef __NEW_SIM_INVENTORY_H__ #define __NEW_SIM_INVENTORY_H__ extern "C" { #include "SaHpi.h" } #ifndef __NEW_SIM_RDR_H__ #include "new_sim_rdr.h" #endif #ifndef __NEW_SIM_INVENTORY_DATA_H__ #include "new_sim_inventory_data.h" #endif class NewSimulatorDomain; /** * @class NewSimulatorInventory * * Class for simulating Inventory * **/ class NewSimulatorInventory : public NewSimulatorRdr { private: /// Record with the Inventory rdr information SaHpiInventoryRecT m_inv_rec; /// Record with the IdrInfo record SaHpiIdrInfoT m_inv_info; /// Array including the areas cArray m_areas; /// Valid areaId SaHpiEntryIdT m_area_id; public: NewSimulatorInventory( NewSimulatorResource *res ); NewSimulatorInventory( NewSimulatorResource *res, SaHpiRdrT rdr ); NewSimulatorInventory( NewSimulatorResource *res, SaHpiRdrT rdr, SaHpiIdrInfoT inv_info ); virtual ~NewSimulatorInventory(); /// Return Inventory Id virtual unsigned int Num() const { return ( unsigned int ) m_inv_rec.IdrId; } /// Return a new entryId SaHpiEntryIdT ValidAreaId() { return ++m_area_id; } /// Return the ReadOnly flag bool IsReadOnly() { return (bool) m_inv_info.ReadOnly; } /// Increment Update Counter void IncUpdateCount() { m_inv_info.UpdateCount++; } // Find and add Area NewSimulatorInventoryArea *FindInventoryArea( NewSimulatorInventoryArea *area ); bool AddInventoryArea( NewSimulatorInventoryArea *area ); bool SetData( SaHpiInventoryRecT idrRec ); bool SetInfo( SaHpiIdrInfoT idrInfo ); // create a RDR record virtual bool CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ); // Official HPI functions SaErrorT GetIdrInfo( SaHpiIdrInfoT &idrInfo ); SaErrorT GetAreaHeader( SaHpiIdrAreaTypeT type, SaHpiEntryIdT areaId, SaHpiEntryIdT &nextId, SaHpiIdrAreaHeaderT &header); SaErrorT AddArea( SaHpiIdrAreaTypeT type, SaHpiEntryIdT &newId ); SaErrorT AddAreaById( SaHpiIdrAreaTypeT type, SaHpiEntryIdT id ); SaErrorT DeleteArea( SaHpiEntryIdT id ); // Identify the correct area and call the HPI functions of the area afterwards SaErrorT GetField( SaHpiEntryIdT areaId, SaHpiIdrFieldTypeT fieldType, SaHpiEntryIdT fieldId, SaHpiEntryIdT &nextId, SaHpiIdrFieldT &field ); SaErrorT AddField( SaHpiIdrFieldT &field ); SaErrorT AddFieldById( SaHpiIdrFieldT &field ); SaErrorT SetField( SaHpiIdrFieldT field ); SaErrorT DeleteField( SaHpiEntryIdT areaId, SaHpiEntryIdT fieldId ); virtual void Dump( NewSimulatorLog &dump ) const; }; #endif openhpi-3.6.1/plugins/dynamic_simulator/new_sim_fumi_data.cpp0000644000175100017510000003444512575647274023572 0ustar mohanmohan/** * @file new_sim_fumi_data.cpp * * The file includes a class for fumi data handling:\n * NewSimulatorFumiBank * NewSimulatorFumiComponent * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * */ #include #include #include #include #include #include "new_sim_domain.h" #include "new_sim_fumi.h" #include "new_sim_fumi_data.h" #include "new_sim_entity.h" /** * Constructor **/ NewSimulatorFumiBank::NewSimulatorFumiBank() { memset( &m_source, 0, sizeof( SaHpiFumiSourceInfoT )); memset( &m_target, 0, sizeof( SaHpiFumiBankInfoT )); memset( &m_logical, 0, sizeof( SaHpiFumiLogicalBankInfoT )); memset( &m_source_loc, 0, sizeof( SaHpiTextBufferT )); } /** * Destructor **/ NewSimulatorFumiBank::~NewSimulatorFumiBank() { m_comps.RemAll(); } /** * Dump Fumi Bank information * * @param dump Address of the log * **/ void NewSimulatorFumiBank::Dump( NewSimulatorLog &dump ) const { dump << "Bank information\n"; dump << "----------------\n"; dump << "BankId: " << m_target.BankId << "\n"; dump << "BankSize: " << m_target.BankSize << "\n"; dump << "Position: " << m_target.Position << "\n"; dump << "BankState: " << m_target.BankState << "\n"; dump << "Identifier: " << m_target.Identifier << "\n"; dump << "Description: " << m_target.Description << "\n"; dump << "DateTime: " << m_target.DateTime << "\n"; dump << "MajorVersion:" << m_target.MajorVersion << "\n"; dump << "MinorVersion:" << m_target.MinorVersion << "\n"; dump << "AuxVersion: " << m_target.AuxVersion << "\n"; dump << "Source information\n"; dump << "------------------\n"; dump << "SourceUri: " << m_source.SourceUri << "\n"; dump << "SourceStatus: " << m_source.SourceStatus << "\n"; dump << "Identifier: " << m_source.Identifier << "\n"; dump << "Description: " << m_source.Description << "\n"; dump << "DateTime: " << m_source.DateTime << "\n"; dump << "MajorVersion: " << m_source.MajorVersion << "\n"; dump << "MinorVersion: " << m_source.MinorVersion << "\n"; dump << "AuxVersion: " << m_source.AuxVersion << "\n"; dump << "Logical target information:\n"; dump << "---------------------------\n"; dump << "FirmwarePersistentLocationCount: " << m_logical.FirmwarePersistentLocationCount << "\n"; dump << "BankStateFlags: " << m_logical.BankStateFlags << "\n"; dump << "Pend.InstancePresent: " << m_logical.PendingFwInstance.InstancePresent << "\n"; dump << "Pend.Identifier: " << m_logical.PendingFwInstance.Identifier << "\n"; dump << "Pend.Description: " << m_logical.PendingFwInstance.Description << "\n"; dump << "Pend.DateTime: " << m_logical.PendingFwInstance.DateTime << "\n"; dump << "Pend.MajorVersion: " << m_logical.PendingFwInstance.MajorVersion << "\n"; dump << "Pend.MinorVersion: " << m_logical.PendingFwInstance.MinorVersion << "\n"; dump << "Pend.AuxVersion: " << m_logical.PendingFwInstance.AuxVersion << "\n"; dump << "Rollb.InstancePresent: " << m_logical.RollbackFwInstance.InstancePresent << "\n"; dump << "Rollb.Identifier: " << m_logical.RollbackFwInstance.Identifier << "\n"; dump << "Rollb.Description: " << m_logical.RollbackFwInstance.Description << "\n"; dump << "Rollb.DateTime: " << m_logical.RollbackFwInstance.DateTime << "\n"; dump << "Rollb.MajorVersion: " << m_logical.RollbackFwInstance.MajorVersion << "\n"; dump << "Rollb.MinorVersion: " << m_logical.RollbackFwInstance.MinorVersion << "\n"; dump << "Rollb.AuxVersion: " << m_logical.RollbackFwInstance.AuxVersion << "\n"; dump << "Components: " << "\n"; for (int i= 0; i < m_comps.Num(); i++) { m_comps[i]->Dump( dump ); } } /** * Set the bank id * * @param id value to be set * @return bool if successful **/ bool NewSimulatorFumiBank::SetId( SaHpiUint8T id ) { m_target.BankId = id; return true; } /** * Set bank source information * * @param src source information * @return true **/ bool NewSimulatorFumiBank::SetData( SaHpiFumiSourceInfoT src ) { memcpy( &m_source, &src, sizeof( SaHpiFumiSourceInfoT )); return true; } /** * Set bank target information * * @param trg bank information * @return true **/ bool NewSimulatorFumiBank::SetData( SaHpiFumiBankInfoT trg ) { memcpy( &m_target, &trg, sizeof( SaHpiFumiBankInfoT )); return true; } /** * Set bank logical target information * * @param lgc source information * @return true **/ bool NewSimulatorFumiBank::SetData( SaHpiFumiLogicalBankInfoT lgc ) { memcpy( &m_logical, &lgc, sizeof( SaHpiFumiLogicalBankInfoT )); return true; } /** * HPI function saHpiFumiSourceSet() * * See also the description of the function inside the specification or header file. * * @param src text buffer including the source location information * * @return HPI return code **/ SaErrorT NewSimulatorFumiBank::SetSource( SaHpiTextBufferT &src ) { memcpy( &m_source_loc, &src, sizeof( SaHpiTextBufferT )); return SA_OK; } /** * HPI function saHpiFumiSourceGet() * * See also the description of the function inside the specification or header file. * * @param src address of SaHpiFumiSourceInfo structure to be filled * * @return HPI return code **/ SaErrorT NewSimulatorFumiBank::GetSource( SaHpiFumiSourceInfoT &src ) { memcpy( &src, &m_source, sizeof( SaHpiFumiSourceInfoT )); return SA_OK; } /** * HPI function saHpiFumiTargetInfoGet() * * See also the description of the function inside the specification or header file. * * @param trg address of bank information to be filled * * @return SA_OK **/ SaErrorT NewSimulatorFumiBank::GetTarget( SaHpiFumiBankInfoT &trg ) { memcpy( &trg, &m_target, sizeof( SaHpiFumiBankInfoT )); return SA_OK; } /** * HPI function saHpiFumiLogicalTargetInfoGet() * * See also the description of the function inside the specification or header file. * * @param trg address of logical bank information to be filled * * @return SA_OK **/ SaErrorT NewSimulatorFumiBank::GetLogicalTarget( SaHpiFumiLogicalBankInfoT &trg ) { memcpy( &trg, &m_logical, sizeof( SaHpiFumiLogicalBankInfoT )); return SA_OK; } /** * Add or find a component by id * * A new NewSimulatorFumiComponent is generated inside the function, * if the component doesn't exist. If a component with the same id already exists, * it is returned. * * @param id componentId of NewSimulatorFumiComponent object * @return pointer on a NewSimulatorFumiComponent object **/ NewSimulatorFumiComponent *NewSimulatorFumiBank::GetComponent( SaHpiUint32T id ) { NewSimulatorFumiComponent *c = NULL; for (int i=0; i < m_comps.Num(); i++) { if ( id == m_comps[i]->Num() ) c = m_comps[i]; } if (c == NULL) { c = new NewSimulatorFumiComponent(); m_comps.Add( c ); } return c; } /** * Add source information to a component * * The source information is copied from the Component object. * * @param component pointer of NewSimulatorFumiComponent object including information * @return true **/ bool NewSimulatorFumiBank::AddSourceComponent( NewSimulatorFumiComponent *component ) { SaHpiUint32T id = component->Num(); NewSimulatorFumiComponent *comp; comp = GetComponent( id ); comp->SetSourceData( component->GetData() ); return true; } /** * Add target information to a component * * The target information is copied from the Component object. * * @param component pointer of NewSimulatorFumiComponent object including information * @return true **/ bool NewSimulatorFumiBank::AddTargetComponent( NewSimulatorFumiComponent *component ) { SaHpiUint32T id = component->Num(); NewSimulatorFumiComponent *comp; comp = GetComponent( id ); comp->SetTargetData( component->GetData() ); return true; } /** * Add logical target information to a component * * The logical target information is copied from the Component object. * * @param component pointer of NewSimulatorFumiComponent object including information * @return true **/ bool NewSimulatorFumiBank::AddLogicalTargetComponent( NewSimulatorFumiComponent *component ) { SaHpiUint32T id = component->Num(); NewSimulatorFumiComponent *comp; comp = GetComponent( id ); comp->SetData( component->GetLogicalData() ); return true; } // Official HPI functions /** * HPI function saHpiIdrFieldGet() * * See also the description of the function inside the specification or header file. * * @param fieldType Type of Inventory Data Field * @param fieldId Identifier of Field to retrieve * @param nextId address to store the FieldId of next field * @param field address into which the field information is placed * * @return HPI return code **/ /** * Constructor **/ NewSimulatorFumiComponent::NewSimulatorFumiComponent() { memset( &m_target_info, 0, sizeof( SaHpiFumiComponentInfoT )); memset( &m_source_info, 0, sizeof( SaHpiFumiComponentInfoT )); memset( &m_logical, 0, sizeof( SaHpiFumiLogicalComponentInfoT )); } /** * Destructor **/ NewSimulatorFumiComponent::~NewSimulatorFumiComponent() { } /** * Set source data * * @param cinf record with source information * @return true (simple copy) **/ bool NewSimulatorFumiComponent::SetSourceData( SaHpiFumiComponentInfoT cinf ) { memcpy( &m_source_info, &cinf, sizeof( SaHpiFumiComponentInfoT )); return true; } /** * Set target data * * @param cinf record with target information * @return true (simple copy) **/ bool NewSimulatorFumiComponent::SetTargetData( SaHpiFumiComponentInfoT cinf ) { memcpy( &m_target_info, &cinf, sizeof( SaHpiFumiComponentInfoT )); return true; } /** * Set data * * The target data record is taken as default record. * * @param cinf record with information to be stored * @return true (simple copy) **/ bool NewSimulatorFumiComponent::SetData( SaHpiFumiComponentInfoT cinf ) { return SetTargetData( cinf ); } /** * Set logical data * * @param cinf record with logical target information * @return true (simple copy) **/ bool NewSimulatorFumiComponent::SetData( SaHpiFumiLogicalComponentInfoT cinf ) { memcpy( &m_logical, &cinf, sizeof( SaHpiFumiLogicalComponentInfoT )); return true; } /** * Dump the Component information * * @param dump Address of the log * **/ void NewSimulatorFumiComponent::Dump( NewSimulatorLog &dump ) const { dump << " Target Component information:\n"; dump << " EntryId: " << m_target_info.EntryId << "\n"; dump << " ComponentId: " << m_target_info.ComponentId << "\n"; dump << " InstancePresent: " << m_target_info.MainFwInstance.InstancePresent << "\n"; dump << " Identifier: " << m_target_info.MainFwInstance.Identifier << "\n"; dump << " Description: " << m_target_info.MainFwInstance.Description << "\n"; dump << " DateTime: " << m_target_info.MainFwInstance.DateTime << "\n"; dump << " MajorVersion: " << m_target_info.MainFwInstance.MajorVersion << "\n"; dump << " MinorVersion: " << m_target_info.MainFwInstance.MinorVersion << "\n"; dump << " AuxVersion: " << m_target_info.MainFwInstance.AuxVersion << "\n"; dump << " ComponentFlags: " << m_target_info.ComponentFlags << "\n"; dump << " Source Component information:\n"; dump << " EntryId: " << m_source_info.EntryId << "\n"; dump << " ComponentId: " << m_source_info.ComponentId << "\n"; dump << " InstancePresent: " << m_source_info.MainFwInstance.InstancePresent << "\n"; dump << " Identifier: " << m_source_info.MainFwInstance.Identifier << "\n"; dump << " Description: " << m_source_info.MainFwInstance.Description << "\n"; dump << " DateTime: " << m_source_info.MainFwInstance.DateTime << "\n"; dump << " MajorVersion: " << m_source_info.MainFwInstance.MajorVersion << "\n"; dump << " MinorVersion: " << m_source_info.MainFwInstance.MinorVersion << "\n"; dump << " AuxVersion: " << m_source_info.MainFwInstance.AuxVersion << "\n"; dump << " ComponentFlags: " << m_source_info.ComponentFlags << "\n"; dump << " Logical Component information:\n"; dump << " EntryId: " << m_logical.EntryId << "\n"; dump << " ComponentId: " << m_logical.ComponentId << "\n"; dump << " Pend.InstancePresent: " << m_logical.PendingFwInstance.InstancePresent << "\n"; dump << " Pend.Identifier: " << m_logical.PendingFwInstance.Identifier << "\n"; dump << " Pend.Description: " << m_logical.PendingFwInstance.Description << "\n"; dump << " Pend.DateTime: " << m_logical.PendingFwInstance.DateTime << "\n"; dump << " Pend.MajorVersion: " << m_logical.PendingFwInstance.MajorVersion << "\n"; dump << " Pend.MinorVersion: " << m_logical.PendingFwInstance.MinorVersion << "\n"; dump << " Pend.AuxVersion: " << m_logical.PendingFwInstance.AuxVersion << "\n"; dump << " Rollb.InstancePresent: " << m_logical.RollbackFwInstance.InstancePresent << "\n"; dump << " Rollb.Identifier: " << m_logical.RollbackFwInstance.Identifier << "\n"; dump << " Rollb.Description: " << m_logical.RollbackFwInstance.Description << "\n"; dump << " Rollb.DateTime: " << m_logical.RollbackFwInstance.DateTime << "\n"; dump << " Rollb.MajorVersion: " << m_logical.RollbackFwInstance.MajorVersion << "\n"; dump << " Rollb.MinorVersion: " << m_logical.RollbackFwInstance.MinorVersion << "\n"; dump << " Rollb.AuxVersion: " << m_logical.RollbackFwInstance.AuxVersion << "\n"; dump << " ComponentFlags: " << m_logical.ComponentFlags << "\n"; } openhpi-3.6.1/plugins/dynamic_simulator/new_sim_inventory_data.cpp0000644000175100017510000002324212575647274024660 0ustar mohanmohan/** * @file new_sim_inventory_data.cpp * * The file includes a class for inventory data handling:\n * NewSimulatorInventoryArea * NewSimulatorInventoryField * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * */ #include #include #include #include #include #include "new_sim_domain.h" #include "new_sim_inventory.h" #include "new_sim_inventory_data.h" #include "new_sim_entity.h" /** * Constructor **/ NewSimulatorInventoryArea::NewSimulatorInventoryArea( ) : m_field_id( 0 ) { memset( &m_area_header, 0, sizeof( SaHpiIdrAreaHeaderT )); } /** * Full qualified constructor to fill an object with the parsed data **/ NewSimulatorInventoryArea::NewSimulatorInventoryArea( SaHpiIdrAreaHeaderT area ) : m_field_id( 0 ) { memcpy(&m_area_header, &area, sizeof( SaHpiIdrAreaHeaderT )); } /** * Destructor **/ NewSimulatorInventoryArea::~NewSimulatorInventoryArea() { m_fields.RemAll(); } /** * Dump the Inventory Area information * * @param dump Address of the log * **/ void NewSimulatorInventoryArea::Dump( NewSimulatorLog &dump ) const { dump << "Area: " << m_area_header.AreaId << "\n"; dump << "Type: " << m_area_header.Type << "\n"; dump << "ReadOnly; " << m_area_header.ReadOnly << "\n"; dump << "Area: " << "\n"; for (int i= 0; i < m_fields.Num(); i++) { m_fields[i]->Dump( dump ); } } /** * Find field by field pointer * * @param field pointer on the inventory field to be found * @return return the same pointer if it could be found **/ NewSimulatorInventoryField *NewSimulatorInventoryArea::FindInventoryField( NewSimulatorInventoryField *field ) { for( int i = 0; i < m_fields.Num(); i++ ) { NewSimulatorInventoryField *idf = m_fields[i]; if ( idf == field ) return field; } return 0; } /** * Add a inventory field to the array if it isn't already included in the array * * @param field pointer to field to be added * @return bool if successful **/ bool NewSimulatorInventoryArea::AddInventoryField( NewSimulatorInventoryField *field ) { if ( FindInventoryField( field ) ) { return false; } if (field->Num() > m_field_id) m_field_id = field->Num(); m_fields.Add( field ); m_area_header.NumFields = m_fields.Num(); return true; } /** * Check the Inventory fields if one field is set to ReadOnly * * @return bool if one field is set to read only **/ bool NewSimulatorInventoryArea::IncludesReadOnlyField() { for( int i = 0; i < m_fields.Num(); i++ ) { if ( m_fields[i]->IsReadOnly() ) return true; } return false; } /** * Delete all fields from the fields array **/ void NewSimulatorInventoryArea::DeleteFields() { m_fields.RemAll(); } /** * Set area header information * The field NumAreas is filled with a internal values and will not be * overwritten. * * @param aheader record with AreaHeader data * @return true **/ bool NewSimulatorInventoryArea::SetData(SaHpiIdrAreaHeaderT aheader) { m_area_header.AreaId = aheader.AreaId; m_area_header.Type = aheader.Type; m_area_header.ReadOnly = aheader.ReadOnly; m_area_header.NumFields = m_fields.Num(); return true; } // Official HPI functions /** * HPI function saHpiIdrFieldGet() * * See also the description of the function inside the specification or header file. * * @param fieldType Type of Inventory Data Field * @param fieldId Identifier of Field to retrieve * @param nextId address to store the FieldId of next field * @param field address into which the field information is placed * * @return HPI return code **/ SaErrorT NewSimulatorInventoryArea::GetField( SaHpiIdrFieldTypeT fieldType, SaHpiEntryIdT fieldId, SaHpiEntryIdT &nextId, SaHpiIdrFieldT &field ) { bool found = false, foundId = false, foundType = false; if ( fieldId == SAHPI_LAST_ENTRY ) return SA_ERR_HPI_INVALID_PARAMS; if ( &nextId == NULL ) return SA_ERR_HPI_INVALID_PARAMS; if ( &field == NULL ) return SA_ERR_HPI_INVALID_PARAMS; for (int i = 0; i < m_fields.Num(); i++) { if ( (fieldId == SAHPI_FIRST_ENTRY) || (fieldId == m_fields[i]->Num()) ) foundId = true; if ( (fieldType == SAHPI_IDR_FIELDTYPE_UNSPECIFIED) || (fieldType == m_fields[i]->Type()) ) foundType = true; if (found) { nextId = m_fields[i]->Num(); return SA_OK; } if (foundType && foundId) { if (!found) { found = true; memcpy( &field, &m_fields[i]->FieldData(), sizeof( SaHpiIdrFieldT )); } foundId = false; foundType = false; } } if (found) { nextId = SAHPI_LAST_ENTRY; return SA_OK; } return SA_ERR_HPI_NOT_PRESENT; } /** * HPI function saHpiIdrFieldAdd() * * See also the description of the function inside the specification or header file. * * @param field address of Inventory Data Field, which contains the new field information to add * @return HPI return code **/ SaErrorT NewSimulatorInventoryArea::AddField( SaHpiIdrFieldT &field ) { if ( field.Type == SAHPI_IDR_FIELDTYPE_UNSPECIFIED ) return SA_ERR_HPI_INVALID_PARAMS; field.FieldId = ValidFieldId(); field.ReadOnly = SAHPI_FALSE; NewSimulatorInventoryField *idf = new NewSimulatorInventoryField( field ); if ( AddInventoryField( idf ) ) return SA_OK; return SA_ERR_HPI_INVALID_DATA; } /** * HPI function saHpiIdrFieldAddById() * * See also the description of the function inside the specification or header file. * * @param field address of Inventory Data Field, which contains the new field information to add * @return HPI return code **/ SaErrorT NewSimulatorInventoryArea::AddFieldById( SaHpiIdrFieldT &field ) { if ( field.Type == SAHPI_IDR_FIELDTYPE_UNSPECIFIED ) return SA_ERR_HPI_INVALID_PARAMS; // Ok, we can try to add the field NewSimulatorInventoryField *idf; field.ReadOnly = SAHPI_FALSE; if ( field.FieldId == SAHPI_FIRST_ENTRY ) { field.FieldId = ValidFieldId(); idf = new NewSimulatorInventoryField( field ); m_fields.Insert( 0, idf ); return SA_OK; } for (int i=0; i < m_fields.Num(); i++) { if ( m_fields[i]->Num() == field.FieldId ) return SA_ERR_HPI_DUPLICATE; } idf = new NewSimulatorInventoryField( field ); if ( AddInventoryField( idf ) ) { return SA_OK; } else { return SA_ERR_HPI_INVALID_DATA; } } /** * HPI function saHpiIdrFieldSet() * * See also the description of the function inside the specification or header file. * * @param field field to set in the IDA * * @return HPI return code **/ SaErrorT NewSimulatorInventoryArea::SetField( SaHpiIdrFieldT field ) { if ( field.Type == SAHPI_IDR_FIELDTYPE_UNSPECIFIED ) return SA_ERR_HPI_INVALID_PARAMS; for (int i=0; i < m_fields.Num(); i++) { if ( m_fields[i]->Num() == field.FieldId ) { if ( m_fields[i]->IsReadOnly() ) return SA_ERR_HPI_READ_ONLY; SaHpiIdrFieldT *data = &m_fields[i]->FieldData(); data->Type = field.Type; memcpy( &data->Field, &field.Field, sizeof( SaHpiTextBufferT )); return SA_OK; } } return SA_ERR_HPI_NOT_PRESENT; } /** * HPI function saHpiIdrFieldDelete() * * See also the description of the function inside the specification or header file. * * @param fieldId Identifier of Field to delete from the IDA * * @return HPI return code **/ SaErrorT NewSimulatorInventoryArea::DeleteField( SaHpiEntryIdT fieldId ) { for (int i=0; i < m_fields.Num(); i++) { if ( ( m_fields[i]->Num() == fieldId ) || ( fieldId == SAHPI_FIRST_ENTRY ) ) { if ( m_fields[i]->IsReadOnly() ) return SA_ERR_HPI_READ_ONLY; m_fields.Rem( i ); return SA_OK; } } return SA_ERR_HPI_NOT_PRESENT; } /** * Constructor **/ NewSimulatorInventoryField::NewSimulatorInventoryField() { } /** * Full qualified Constructor **/ NewSimulatorInventoryField::NewSimulatorInventoryField( SaHpiIdrFieldT field ) { memcpy( &m_field, &field, sizeof( SaHpiIdrFieldT )); } /** * Destructor **/ NewSimulatorInventoryField::~NewSimulatorInventoryField() { } /** * Set field data * * @param field IdrField data * @return true (simple copy) **/ bool NewSimulatorInventoryField::SetData( SaHpiIdrFieldT field ) { memcpy( &m_field, &field, sizeof( SaHpiIdrFieldT )); return true; } /** * Dump the Inventory Field information * * @param dump Address of the log * **/ void NewSimulatorInventoryField::Dump( NewSimulatorLog &dump ) const { dump << " Field.AreaID: " << m_field.AreaId << "\n"; dump << " Field.FieldID: " << m_field.FieldId << "\n"; dump << " Type: " << m_field.Type << "\n"; dump << " ReadOnly; " << m_field.ReadOnly << "\n"; NewSimulatorTextBuffer tmp( m_field.Field ); char str[256]; tmp.GetAscii( str, 256 ); dump << " Field: " << str << "\n"; } openhpi-3.6.1/plugins/dynamic_simulator/new_sim_hotswap.cpp0000644000175100017510000003520612575647274023322 0ustar mohanmohan/** * @file new_sim_hotswap.cpp * * The file includes a class for hotswap behaviour:\n * NewSimulatorHotSwap * * @author Lars Wetzel * @version 0.1 * @date 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * */ #include #include "new_sim_hotswap.h" #include "new_sim_utils.h" #include "new_sim_domain.h" #include "new_sim_timer_thread.h" /** * Constructor **/ NewSimulatorHotSwap::NewSimulatorHotSwap( NewSimulatorResource *res ) : NewSimulatorTimerThread( 0 ), m_insert_time( SAHPI_TIMEOUT_IMMEDIATE ), m_extract_time( SAHPI_TIMEOUT_IMMEDIATE ), m_running( false ), m_state( SAHPI_HS_STATE_NOT_PRESENT ), m_res( res ) { } /** * Full qualified constructor to fill an object with the parsed data **/ NewSimulatorHotSwap::NewSimulatorHotSwap( NewSimulatorResource *res, SaHpiTimeoutT insertTime, SaHpiTimeoutT extractTime, SaHpiHsStateT startState ) : NewSimulatorTimerThread( 0 ), m_insert_time( insertTime ), m_extract_time( extractTime ), m_running( false ), m_state( startState ), m_res( res ) { } /** * Destructor **/ NewSimulatorHotSwap::~NewSimulatorHotSwap() { Stop(); } /** * Dump hotswap information * * @param dump address of the log * **/ void NewSimulatorHotSwap::Dump( NewSimulatorLog &dump ) const { dump << "HotSwap data: \n"; dump << "InsertionTimeout: " << (long int) m_insert_time << "\n"; dump << "ExtractionTimeout: " << (long int) m_extract_time << "\n"; dump << "State: " << m_state << "\n"; } /** * Set both timeout values **/ void NewSimulatorHotSwap::SetTimeouts( SaHpiTimeoutT insert, SaHpiTimeoutT extract ) { m_insert_time = insert; m_extract_time = extract; } /** * Check if the hotswap policy is still valid and send event * * @return true if thread can exit, false if not **/ bool NewSimulatorHotSwap::TriggerAction() { SaHpiHsCauseOfStateChangeT cause = SAHPI_HS_CAUSE_AUTO_POLICY; SaHpiSeverityT severity = SAHPI_INFORMATIONAL; stdlog << "DBG: CheckHotSwapTimer\n"; if ( m_running == SAHPI_FALSE ) return true; if ( ! m_start.IsSet() ) return true; // Ok, we have a running hotswap policy cTime now( cTime::Now() ); now -= m_start; if ( m_state == SAHPI_HS_STATE_INSERTION_PENDING ) { if ( now.GetMsec() >= m_insert_time / 1000000LL ) { stdlog << "DBG: HotSwapTimer expires for Insertion.\n"; SendEvent( SAHPI_HS_STATE_ACTIVE, SAHPI_HS_STATE_INSERTION_PENDING, cause, severity ); m_state = SAHPI_HS_STATE_ACTIVE; m_running = false; m_start.Clear(); return true; } } if ( m_state == SAHPI_HS_STATE_EXTRACTION_PENDING ) { if ( now.GetMsec() >= m_extract_time / 1000000LL ) { stdlog << "DBG: HotSwapTimer expires for Extraction.\n"; SendEvent( SAHPI_HS_STATE_INACTIVE, SAHPI_HS_STATE_EXTRACTION_PENDING, cause, severity ); m_state = SAHPI_HS_STATE_INACTIVE; m_running = false; m_start.Clear(); return true; } } err(" Timer expires but now action was defined -> Stop Timer. \n"); return true; } /** * Check if the hotswap policy timeouts and start actions * * @return true if thread can exit, false if not **/ SaErrorT NewSimulatorHotSwap::TriggerTransition( SaHpiHsStateT state ) { SaHpiTimeoutT timeout; SaHpiHsCauseOfStateChangeT cause = SAHPI_HS_CAUSE_AUTO_POLICY; SaHpiSeverityT severity = SAHPI_INFORMATIONAL; switch ( state ) { case SAHPI_HS_STATE_ACTIVE: // First get the latest Insertion time value m_insert_time = m_res->Domain()->InsertTimeout(); timeout = m_insert_time; break; case SAHPI_HS_STATE_INACTIVE: timeout = m_extract_time; break; default: err( "Invalid state for NewSimulatorHotSwap::TriggerTransition."); return SA_ERR_HPI_INTERNAL_ERROR; } if ( timeout == SAHPI_TIMEOUT_IMMEDIATE ) { stdlog << "DBG: Transition happens immediatly due to SAHPI_TIMEOUT_IMMEDIATE.\n"; SendEvent( state, m_state, cause, severity ); m_state = state; } else if ( timeout == SAHPI_TIMEOUT_BLOCK ) { stdlog << "DBG: Transition is blocked by timeout value SAHPI_TIMEOUT_BLOCK.\n"; } else if ( timeout > 0 ) { stdlog << "DBG: Transition will happen after " << (long int) timeout << " ms.\n"; Reset( timeout / 1000000LL ); m_start = cTime::Now(); m_running = true; Start(); } else { err( "Invalid timeout value inside NewSimulatorHotSwap::TriggerTransition."); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } /** * Start a resource from NOT_PRESENT **/ SaErrorT NewSimulatorHotSwap::StartResource(oh_event *e) { SaErrorT rv = SA_OK; SaHpiHsCauseOfStateChangeT cause = SAHPI_HS_CAUSE_AUTO_POLICY; SaHpiSeverityT severity = SAHPI_INFORMATIONAL; if ( m_res->ResourceCapabilities() & SAHPI_CAPABILITY_FRU ) { e->event.EventType = SAHPI_ET_HOTSWAP; if ( m_res->ResourceCapabilities() & SAHPI_CAPABILITY_MANAGED_HOTSWAP ) { e->event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_INACTIVE; e->event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_NOT_PRESENT; e->event.EventDataUnion.HotSwapEvent.CauseOfStateChange = cause; m_state = SAHPI_HS_STATE_INACTIVE; } else { e->event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_ACTIVE; e->event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_NOT_PRESENT; e->event.EventDataUnion.HotSwapEvent.CauseOfStateChange = cause; m_state = SAHPI_HS_STATE_ACTIVE; } } else { // Send a Resource event e->event.EventType = SAHPI_ET_RESOURCE; e->event.EventDataUnion.ResourceEvent.ResourceEventType = SAHPI_RESE_RESOURCE_ADDED; m_state = SAHPI_HS_STATE_ACTIVE; } e->event.Source = e->resource.ResourceId; e->event.Severity = severity; oh_gettimeofday(&e->event.Timestamp); m_res->Domain()->AddHpiEvent( e ); if ( rv == SA_OK ) stdlog << "DBG: HotSwap::StartResource successfully.\n"; return rv; } /** * Send a HotSwap event * * @param newState new HotSwap state * @param prevState previous HotSwap state * @param cause cause for the state transition * @param severity severity of event to be set **/ void NewSimulatorHotSwap::SendEvent( SaHpiHsStateT newState, SaHpiHsStateT prevState, SaHpiHsCauseOfStateChangeT cause, SaHpiSeverityT severity ) { NewSimulatorResource *res = m_res; if( !res ) { stdlog << "DBG: HotSwap::SendEvent: No resource !\n"; return; } oh_event *e = (oh_event *)g_malloc0( sizeof( struct oh_event ) ); e->event.EventType = SAHPI_ET_HOTSWAP; SaHpiRptEntryT *rptentry = oh_get_resource_by_id( res->Domain()->GetHandler()->rptcache, res->ResourceId() ); if ( rptentry ) e->resource = *rptentry; else e->resource.ResourceCapabilities = 0; // hpi events e->event.Source = res->ResourceId(); e->event.EventType = SAHPI_ET_HOTSWAP; e->event.Severity = severity; oh_gettimeofday(&e->event.Timestamp); SaHpiHotSwapEventT &he = e->event.EventDataUnion.HotSwapEvent; he.HotSwapState = newState; he.PreviousHotSwapState = prevState; he.CauseOfStateChange = cause; stdlog << "DBG: NewSimHotSwap::Send hotswap event for resource " << res->ResourceId() << "\n"; res->Domain()->AddHpiEvent( e ); } // Official HPI functions /** * HPI function saHpiHotSwapPolicyCancel * * See also the description of the function inside the specification or header file. * Copying the internal values and show the remaining time if the timer was started. * * @return HPI return code **/ SaErrorT NewSimulatorHotSwap::CancelPolicy() { if ( !( (m_state == SAHPI_HS_STATE_INSERTION_PENDING) || (m_state == SAHPI_HS_STATE_EXTRACTION_PENDING) )) return SA_ERR_HPI_INVALID_REQUEST; if (!(m_res->ResourceCapabilities() & SAHPI_CAPABILITY_MANAGED_HOTSWAP)) return SA_ERR_HPI_CAPABILITY; if ( m_running ) Stop(); m_running = false; m_start.Clear(); return SA_OK; } /** * HPI function saHpiHotSwapStateGet * * See also the description of the function inside the specification or header file. * Copying the internal values and show the remaining time if the timer was started. * * @param state address of state to be filled * * @return HPI return code **/ SaErrorT NewSimulatorHotSwap::GetState( SaHpiHsStateT &state ) { if ( &state == NULL) return SA_ERR_HPI_INVALID_PARAMS; if (!(m_res->ResourceCapabilities() & SAHPI_CAPABILITY_FRU)) return SA_ERR_HPI_CAPABILITY; state = m_state; return SA_OK; } /** * HPI function saHpiAutoExtractTimeoutSet * * See also the description of the function inside the specification or header file. * Copying the internal values and show the remaining time if the timer was started. * * @param timeout timeout value to be set * * @return HPI return code **/ SaErrorT NewSimulatorHotSwap::SetExtractTimeout( SaHpiTimeoutT timeout ) { if ( ( timeout != SAHPI_TIMEOUT_BLOCK ) && ( timeout != SAHPI_TIMEOUT_IMMEDIATE ) && ( timeout <= 0 ) ) return SA_ERR_HPI_INVALID_PARAMS; if (!(m_res->ResourceCapabilities() & SAHPI_CAPABILITY_MANAGED_HOTSWAP)) return SA_ERR_HPI_CAPABILITY; if ( m_res->HotSwapCapabilities() & SAHPI_HS_CAPABILITY_AUTOEXTRACT_READ_ONLY ) return SA_ERR_HPI_READ_ONLY; m_extract_time = timeout; return SA_OK; } /** * HPI function saHpiAutoExtractTimeoutGet * * See also the description of the function inside the specification or header file. * Copying the internal values and show the remaining time if the timer was started. * * @param timeout address of timeout value to be filled * * @return HPI return code **/ SaErrorT NewSimulatorHotSwap::GetExtractTimeout( SaHpiTimeoutT &timeout ) { if ( &timeout == NULL ) return SA_ERR_HPI_INVALID_PARAMS; if (!(m_res->ResourceCapabilities() & SAHPI_CAPABILITY_MANAGED_HOTSWAP)) return SA_ERR_HPI_CAPABILITY; timeout = m_extract_time; return SA_OK; } /** * HPI function saHpiHotSwapActionRequest * * See also the description of the function inside the specification or header file. * Copying the internal values and show the remaining time if the timer was started. * * @param action Requested action * * @return HPI return code **/ SaErrorT NewSimulatorHotSwap::ActionRequest( SaHpiHsActionT action ) { SaHpiHsCauseOfStateChangeT cause = SAHPI_HS_CAUSE_EXT_SOFTWARE; SaHpiSeverityT severity = SAHPI_INFORMATIONAL; switch( action ) { case SAHPI_HS_ACTION_INSERTION: if ( m_state != SAHPI_HS_STATE_INACTIVE ) return SA_ERR_HPI_INVALID_REQUEST; SendEvent( SAHPI_HS_STATE_INSERTION_PENDING, SAHPI_HS_STATE_INACTIVE, cause, severity ); m_state = SAHPI_HS_STATE_INSERTION_PENDING; TriggerTransition( SAHPI_HS_STATE_ACTIVE ); break; case SAHPI_HS_ACTION_EXTRACTION: if ( m_state != SAHPI_HS_STATE_ACTIVE ) return SA_ERR_HPI_INVALID_REQUEST; SendEvent( SAHPI_HS_STATE_EXTRACTION_PENDING, SAHPI_HS_STATE_ACTIVE, cause, severity ); m_state = SAHPI_HS_STATE_EXTRACTION_PENDING; TriggerTransition( SAHPI_HS_STATE_INACTIVE ); break; default: return SA_ERR_HPI_INVALID_PARAMS; } return SA_OK; } /** * HPI function saHpiHotSwapInactiveSet * * See also the description of the function inside the specification or header file. * Copying the internal values and show the remaining time if the timer was started. * * @return HPI return code **/ SaErrorT NewSimulatorHotSwap::SetInactive() { SaHpiHsCauseOfStateChangeT cause = SAHPI_HS_CAUSE_EXT_SOFTWARE; SaHpiSeverityT severity = SAHPI_INFORMATIONAL; // Stop Timer if it is running if ( m_running ) Stop(); m_running = false; m_start.Clear(); switch ( m_state ) { case SAHPI_HS_STATE_INSERTION_PENDING: SendEvent( SAHPI_HS_STATE_INACTIVE, SAHPI_HS_STATE_INSERTION_PENDING, cause, severity ); break; case SAHPI_HS_STATE_EXTRACTION_PENDING: SendEvent( SAHPI_HS_STATE_INACTIVE, SAHPI_HS_STATE_EXTRACTION_PENDING, cause, severity ); break; default: return SA_ERR_HPI_INVALID_REQUEST; } m_state = SAHPI_HS_STATE_INACTIVE; return SA_OK; } /** * HPI function saHpiHotSwapActiveSet * * See also the description of the function inside the specification or header file. * Copying the internal values and show the remaining time if the timer was started. * * @return HPI return code **/ SaErrorT NewSimulatorHotSwap::SetActive() { SaHpiHsCauseOfStateChangeT cause = SAHPI_HS_CAUSE_EXT_SOFTWARE; SaHpiSeverityT severity = SAHPI_INFORMATIONAL; // Stop Timer if it is running if ( m_running ) Stop(); m_running = false; m_start.Clear(); switch ( m_state ) { case SAHPI_HS_STATE_INSERTION_PENDING: SendEvent( SAHPI_HS_STATE_ACTIVE, SAHPI_HS_STATE_INSERTION_PENDING, cause, severity ); break; case SAHPI_HS_STATE_EXTRACTION_PENDING: SendEvent( SAHPI_HS_STATE_ACTIVE, SAHPI_HS_STATE_EXTRACTION_PENDING, cause, severity ); break; default: return SA_ERR_HPI_INVALID_REQUEST; } m_state = SAHPI_HS_STATE_ACTIVE; return SA_OK; } openhpi-3.6.1/plugins/dynamic_simulator/doc.html.tgz0000644000175100017510001463775612575647277021700 0ustar mohanmohan‹øŠÕKì™{<”Û¿Ç•;·é¦B ¥¢ÝÆÜ¹ƒ Iw‰a0Ó`†ÙîR¹´r7£b+M&R"i‰1®aË£1¹ÈõŒö~ׯsù}Îï•Ýëu|þ˜µžçY뻾k½¿ßõÌšq&9i‰}cADB#‘‹%„|¹†"_Ê?%…‘( AÃÄ PJT¨ ¿µc‹ò!S½UTÄ\I$ÿÚçM^ ‡–VÎ"þx ‘ð-ƒà/òG!á †ñ‡¢eþK¡çï ùf!ðù# A‰øÃ Hè2ÿ¥Ð?òw†|›øßñG,òG—÷ÿ%Ñ×ü¡ßø2ÿ¥Ð×üaßÄ2ÿ¥Ð×üáßä2ÿ¥Ð×üßÔ2ÿ¥Ð×ü‘ßô2ÿ¥Ð×üQß ÿåóÿÒèkþèï‡ÿòùIô5íï‡ÿòùIô5¿“? G Ð?ßÿËûÿ’è?òw"8’ÉV¸ ¶nD‚#…äm‹;O&yï'‰¤óN$ÁÁÁÕÛѯItþ‹€£þàý_óGü#¸&ª‹òòm§þ‡þŸó‡!œ]Ñ0ÎÑAâ\Î!µµ!p¸æè ƒÃþnÿ–õmõ¯ä¿£ç_ãʨèÿÕþƒ£ÿ[Îÿo¯sŽdœŠ7Îçó–òÆ9QTv|‰—ÿ.4£EýY[ƒÿŒB!¤þî9,ëÿ®!ÿ=Ï»þµ1þyþÃ`Pä?åÿâÿ¿Ëùÿíuù°•™¬”âbËZ˜›•B11qÒâ¢ÚfóQ¡qøÐQÓù…O33³œœœ1±½{÷:88vwwWTTdff*++‰š/,,P&{Eµ”#V¶bFï[]ÄÄTÄ,LŒú¥ ÒÈí˜Äš‡Ö<ý† AϺÞ·:Ñ/k€·ÖÊùÜÔŸUcäÇ´­èkAOލKëU×·öâòL®m8Œ'}¦·hÚ?WZÛ™R:ëlü(„hÿD×Ý——4àZ$ÖÙFbbøõ¿oîF ‘3kXh%)¿4 LH¯^y=šåÒø¾.I÷{b¢6ê—©œú#ZVCy .P´˜ö´ìýèËë¨ÇgÜO^3T3 ¹O[á` Ï¡ù<¯¶’e+ø Òpä̪ÙÕ ÃÎÔÙ· –˜ÈÓ3MªS¿c [£¹Îl–ޏVÚùíª'Ñû—ä¬ÜgßæŒKËWMAÉ=Öûú@½Ò0϶h;Txäú¦I Ûºó›—°Ãkz­PØL“´ ®yc4öq_Ü*uj¥5ït)oూiá.r²¾åÖORˆ“:9ŒkÊÛ”­Ó?O?µ;ñ¶Å¯£”)àíàúÄÀÀ¦N CßO#Ú@Ïʘãõå@vûR’=xoéêÀ)üËöRù·éu»åOo$F-Ü =ôÍv¢ô"%›‹mä÷w850«¼¤«ì#û€dr RÖ”"^ú,8?ÛèÄS‹Wõæ«ÔäYrïÁÝå,’mÊä«N­fѹ•}Á—O‡ùí‰*TÔ½Ï=÷±zò¬Ýä+"Ÿ‰•$Ç](aø$G5ó¿ø¥kÊ( ÑÌ9 „â×¹9HÞÚICó¸¿üø°2„­bóc‘Ç>d!ŸY$xɳæóö ž9¨ððƒ(…=;úPõ7ONén£}®ÐªˆÞ38Aî¯ lj<ë ?n^ œîÕ˜o~‡Ç€Ê‚ŸÎJ,´©"ÚÚï][¼j}Qñ %>èYå<; ½–jÕÈ…Í·zØÓ 6+p¥³›&t·æÃbÒ2škÁêy¢é¢4O«¼FÇÝLö«×+¦Í—êOV`•™hÜÉKL:± 1^ç'ð~‹jU³•¦úÌ¥h‘¬kÝ—ò—9(^×/…À›¨•T°*E³¯hÛ–Žd*g5¦ü±JcÌwC —c6ÉO ó;·§êž©Ž¥ž–3ÑœpQO!›hQ×jƒÀ*½~WóJÍR4™ì#WÁVu­gDc”aô/v5…i>Ñó¥<ÜfOIœ-àNïÎÆs^uȘßȇ÷)ŠV+=úÓA#€´\ñ±»¯ ‹‡øA¥h¨ÈšŽ-’ˆn¬êËÖik^Ôzr24Þ^¿$·Eï=Ƽôá iåÝ÷{É /—çø£¬™í–Èk”S¼Ä)O¯-“i¥œg6nîz¡¯kîiC‰ïÐþ¬åî{5VúèÏÆ-a1)1Û$ØXzqTV$86¾[á& Û¾xã¨/Å­8J :%\žÃ'¢š^)p‡ë’ Ò²ÉþÞ®Yðç:§q¡‡×¥#•cŸ+m©7Ó¸æÉî}öÜòÖ†F”Xw_!ª»2VŠÿóÁÏ£øÔp¾©+ûR|pؾvÂ5ÆÝþLPM1&¢Xÿš'ˆþì9Ôãw’îYL4jÓE¿ZÀû@D}HWq¶Ýéæp+oƒ=‘‰£hUŠg–lz)2ÇÓH¼3¯%lód‚àeâ—¼>^lÉxDCϤölUçáIMáL %²B¡+ôºì9¶Z’ŸeÈÝZ1)6^DÿÒŽÓ‚jkGl»¿žÅë–~ –;§¯užoò%á3¤«½-²E{Pé¾aûsE{2åQ·S¹xwNø{E¿Y» åÈtÿeQQ\æMµÏÎåÁñ¡*zZˆl¼dL…ܬílÂÁÌÙë*]ßn¯á%šg^*^}?ú©‰ã_ïR¤‡˜S.˜vÑ £ÍŸ ýQ}±…ÛÁm»˜Ÿ$ÕX¿Ü}^ö¶ûj2~\éÕ†M™j[ö… ý‹Gê׎sP•E†i§«’~n–±2³j’H(Yx†VèÞ¾¸½õW„þøÔ…î›Ï$¤'ÙóGˬ37e™Nëa=6Þjxî0Èüt©È—6“£´ÀÃ7@ûÇW‚¶üjW‚”~3@#†zµ¶h<ÞæáŒJéLú‡HÆšgž yÕœµr× 2ëæ_qÎ3óPÏäýÈÂeRó Ÿñ L¸0ò-ž“€=Aµô¹ÍMÀ`”Äuþ‰¢¨{‡×Uh£;ôÿiü÷)ØnÊÑBµ†Ãƒ.)j¡ ú:7õ6džYÙ·ÝÛò@aü&õBa '—甃Ié$¨†"”ú+6Àˆ`µÌç7ï\©–ÒøØ`ÿfHKQkc.ο½ÿvH‚f‹P²'|®•‹vóçÄŸb™¥È@ìdgü²™zãEå°ùbê `Ád†¤tzn¹DsiØü$ZÔ-U’1u¬ûµ­G¬Û7¹æpaSôA¸u RЯưí(îçdñ8-2È€‹SÓ¦Áàèétp®Îº<:pçÑÆ,^M=X•ý *oõ#ÿ ⢱ä¨Úaós§òK{è4ª‘µÉ°Ù7ÂÅ0uïþœRéá±íÜ!?Úšvû [•%@zµÕ7†¨J=ï~ iû%‰ü]vŠñ¾W>%†-ÖSVF¹ïn»«Ä–Ý‹s ÊlñÈ`¿¶§ù$м(ßžTÿ€`Ë`q}U½gPºÄÇXBfõ<ô‘ûM“sw©²€ÛßNRÇ9±ªãŠÊ~®ck ˜GJsÄHz…Qí-½èyÔ„bã&’þ=äÉV»f“’^cËb%Π}²µÈŸ o¼ø¸ä>7'ßó ï!Öz8y“ØÖüÖìÀšÇq}­-f HdƒI&úõK¹iæ¶WsuÒêQuw÷ŒË±¡µry«V´p’oÖk*—@`ŸWßıtÓ™ @í“™3D2Í,Ù;e”Q|«'à€ ­ûÆŒÉï˜o>ÓlÐn·§µ:O°aÃcáUÓQýø;:žÑAƒgmì‡CÔò”×vîÈØã¸¦žŒ—Z¯ËÄSÄkŽS&…™t ›ßžyv6û$á[¨ÉéËó=ì±ÁçNîûd`#þƒÒ‹”ìÁ:Sò»²üIËò#²“êyMìâŒØÜÓ÷{¯Ü/ÅÉtš½ ô¨ ܹó~•ä›ñ‘µZîyîØ5s´ÑÛ~>mGއªt^üеd+xë[RŽ2bž~~2#N·kœó¼ øDtÎøFQeÍVÉœ}ÃitxZ"5¡x³R¢$;ÞØ‚òm$råÒRãê%ø¡LÜïaáŠÚ´µ;×ûgµb:D–ê€"5Ø^æ?fÓ²Ž)²¦ÀÂtEÜÙñ*÷xµ•';%ÛR¼¿àõ8ì¸dâ+»¾tEÞŽ•ˆˆ,ž7ç•u¦ÀöÅ¡UåS¨ÚÓþ>›|·0¥ån™Ê|¤;ù­{¢^\9•Àw£7 çsÎsžsÞÏyÎsžÏq¦W¹ƒ°æäFiƒ{»TUV tEê™bçë"ƒã^®VÑzX {Ž˜FyVÄÜÕÈ·"U!¾açC³–G§••ð—×ê ¸pîòØÇU»ložà{ã¾÷âqН@¦áîéýêú#Á”ç3âË2ù&*¤!ÏÜ£ŠÙ|%Ì>èâß™¸ši˜"òÓ á'4ÑFg FhNÚò…x5¾mu i;ÖDJÍñ‰:¬ñ²edR?£#= Ô:_gNd1V0PY±¬ëÛäÞÆùeâAÎà2p7ôðÓPÑsäT›‹¥Øž¡»*ÖÞÖõYßò†g:'îçk‰lÄÞ&Q›ç„'ÔÇZ2÷d= NC‰ð›×˜‰Ò¨„í®l6ˆ³d.KéR­h­v£Ð–9`2x•O 0/.›~éxiWclúrà$šµrÅcQ{ú=‘¨ pká5€|7¨Ï~Zb²%[*U"Rà–œ}`½Ã¬G‚Î{¡1êazÒIFE/nvÈÃâr±§ÕÄÌÌ#¶äKÇ»ú=9u¡C!ø@ ™ìd¸¾s[æ-Ñ‹{"…ví¢ÄéË5‚æˆÀ%L#…°ý³×O¿_Üì"eHt˜îóL~ýã‡glBÔÄL fçJ×¶Î.+L?"½²8¡Á¬‘óÑýû-e˜êgQI¤Eë÷©,‡Y•K%ÔÐÎéä'fD ¤§e¼ÂGö™ß¤“dm‹ÃuÞ<Ã|`—ÖPóæ›OöK­Ï¬Û–7ÿˆ‹–ÉšŠ£ÀÕ=üÕ³üAþ»b˜KÝ›;ϵÓI:º¶Ð½¬=LTW{5õ]dÙý è3ëøÜX*ëxÿíâ¨câÒÏ•J„YÍ/DýusjúzùíNWï&^¨Lpp5B-?ÍDðFy1þ°5IªÌ) #¾gºº6!°PŸª–›G({î~TÆpMêþ{kç:ÞqF˜õT Ÿ;0kÿ«ÆÓý탒§â±»ö-ñÚð|¦Nç ò¢*ÿŽ›'Èo£cö’íÊ. Whñ¦ýeZºÝË0ÝHÕeTQe^HÝiý:Ør¯‡Ñ˜,á,ë%2â+Ž«š]“cµ EÊiŽ×—tLyQàÜyî5lyöÜh= ù?6Lé7z°6áB!|ß-bã»úÞ†ýkS"+mn9óËØo$©h.žkÓ(š ª|D"ß$´â•f ß9Ê`Zªñ> …ø+ï)ÛH:€t·HPsví–ÃÁgõœ®$] äW¬¾aXd/ )j–¿çÍ?Ñ“=sìiòÂW EÖ'šö꿹RÚ~=¤-´QÒƒø.¹^%±÷Г£ÖW£¥ÔßH˜J;vmžÍz&‘'×›Á8Í7Ôþ×ËÃOÍu°ƒôï¢9W¦5ÐÕ³Ôp%ï„IŒõK.T€ü–¥s‡Ú¥#6 Å”Ùʲ÷û{žÐ%E)y¯âøxècCU…ZàzÕ?ó®ÄMŒkW˜ˆwî³£·N•Ùª—‚[cvõ-³Õ/³1Úgª'S[hÌò@‡Ó¥YýŒO/°¿y¼teO–‘k”‰òÞã×–b—pxyè4˜îÞVê7¥OvŒO½ºÍQ𥢨 ¡¤íçç×yòþ•-5ÉÍW ˆj#]PLë~5üÝ.àºxž×µ"IÂXö¼ËB‰# ìO[²õº’;‘žÇS­ãK©¨hÏ“ÍûÂ+›<º3•ÜRŒÏÔݨ£"l§UùfŽX^QNH))iŸPífrØè狪n¿øËïÑ›d ]´£•Šò›TCëÛ)¹¥gõBŸ8¥wÍW ´/ÀÆmñûŠƒè´¹ƒŒH%wÝj¤,Ff_xª+þ§¢«Ÿ}ýz‰ò”]c_ZÊæ,é.õ9Ädëå^-¶ ÷¸ö Û?wVYëZšê†xGF ¦çFOÿca$>ø‹$?èG&=!1WDƒÒJ I[–>B¼›/Qd'؉ñŒKñ²Í_Y$ šv¦Ò‡ÿBEÈ®*¹°>QMB·¥MßVâ£*Š|У³ »}éyµáÜiÅÏta›•„û²ÑÍûzN@îH¸·˜õÁ#r¶M‚íæ¥­wÍ»æÙî9$ïwKÓžIzq"…+ʧLΙ%§ï4\Aßgíš„˜’{çÁò½:‚V³Éa°ýœƒE¢õ3yª§2ç¶tîÂÁí7FçÕ|ª*8|DÂcçŠÁmãŒA²êÇ‚σð9Ï6Yi½ã÷ÔtiôŽ`ëå:hìB.<"ò²¯Ë»Mo¦¼ša´YR¥é­RtÐ;—%f+L×­ª¦Ü3dèçÉ<’8]µÚa¦mÔõ>ïä¥!QR[µîo­ŠØiqA˜¯Ð–l·1iÙei²é™ÏòÓHåHËÜ[Эþ\=}ù³ù-û4íÁ9‡wY‚Ï™©/¥¼V¾[ªb8Èé=v÷´€œ­USçîÛ™$éÝv¢ÈJÕï¾ ÊZw͵_“ÀùŠ ÏMu“ôu©ó|ó<Âü@amí¾®þš¯ˆ‡ÛË™Ú'B×Û=} ­ì鬞kfQãòtO±§¬Ñ'û˜ƒ£qMh<«¿¥´õÚVÌqÕŽf‰*-Ý9÷ÊCMÝäk eݼ|²÷;Ô¾ð ñlȲç°×憎vªèèQ~µü¹yáhÁ³²¿9fÐ÷íDÔ€°—ìÌæå>yºÌ˵xÞ@1ÁG0 åTfŠËÉA—Ô\~]ûöâªê­êv÷C7¯ ñWÝÄ‹ê£ô·íZ¨A k¦­­õÙP3S'îA5_ßò’ˆ4ä@ñ­qá¼ÅzngVók¶v©ä·izœ_ÿòŒåŠÒ†’|dߊ롒Òz‚'ÄÞ\²Ž¿¶˜òöF­ TâÚB ¨õÙ©c6uÍ|a¥‘–Žg5Òz4tdZ»k¦ïÑ¿³Ðp‰FŒCRÔþ3Ò”×¾Þ¹Û%†¥%?îñh™|r¡†ûI²‰Y¼VÄv˜Å ç¬5îÒÔ Ä­¸p…c÷kªð‡‚•·/&.ùÀqåhI½STnStÒ-Ÿ<8ÈN+ƸNI|¾c³^Ò5lÊc›„Ì FÊWw7Ì#Qw»»(k#C{Ulåùxì³…ödÕ´:ÁøúÍ…&6zIG}hÄCpå³ÍtßÕ²o\õ»úÝßKSÊn—º¾wEà…;&?Ø—§µG[5#$¸ÙHWvO<Ãô(”å!afñÃìâ@T„NJ*`>™ !ê@~JÙ\ÙIU̱tù)UŒXKÚôWi·N²Ï9ì¹wíæ©¬[é-è«›K=æUül¨VV…F‰Üòº¶$Ñè ÙÝ"E­'Kn5Tdí’º—Ï×cæVDªÚÍ“ï²!=§²œÓ‘9“ì~úñbÂCŸÜÑy©ê|&Þ…왉O¿ò¦Ôƒ›‘evI³ŠŒíÜ£+§6¾€ßÈ*© íRÎ8øÊ;H0ç÷Ä’Õ!|Y39—\Œ‡RøÏÍL Ó ?óø {^ªÍB{s°#h`¯_ ?´Ð;HË}ºuj))^Ÿ)eÃF/kõÞ\»\½”tå2úÜÌp}~o“ wª?C8SéÛacqˆ{ºÒÙžÄ-oR‘ÚpÜNrXHY™ÿ¸¬Æ< iuëúÅÑ|öë/–F–>öõl&\®dwYi‡úèO³:kjnûfÒLë3¬Ëëoøfî²¥‘ž®S*îiñ®q*¶/ <”þô¶¯j¿¯®`LÛV­SÂ8áΆɹ ¸Ã‘„¾v™»ÎæÛX¥V×ÌëlpxÑ­ûR¬†L9ÐG_T²L[¨‹“,ßSt6§A¸éƒHFSðIA×”ß,Ù¡ª¥Z–¡êGé²:¦b÷¢ÇÙÙðšL©ÜjÃÉ&áB¶ÐR ªeÞ+ t¨"´ç¥bÞ>´SæAg@~ŒqLb"æXKJÚã:%=]Ý&2¬µt¶°ë—õ›Ýo¬\ÿî¼ëÈ»I|ï`“vŒTV©bïà !}aâkÿ]ÚÕð2}‘Žó 6³¯ZVwÚc¥çIŸ€ý™U¬}—KG]ìh!¸¶ÞN,]àm@x_â–ølkWœ‡Ê»|R;È“2 äæØþ„íõ»f¦ïû;Ö“UûQ J¢ã ²$hpåî©k^Š<J:ð.åÅǰ%~ö‰K³û±©ôåpLÎõu¶¾v×™1QšoKzZT^ÿéCß+¸*TœíÓYu&¤[È3ÿ‚&³×çÎ+×ÎÙ³;ħw!H‹iÄúk*×2&ùy°Ü»¢K Šn(ÿ ‘åêY¼k‰½¤Nû¹ÌEÜL„ºÇGÍCƒ—´óÍzóÈ©Ý{HÅQ{âŸRÊ›‡”§¢N±ÔjD–ŠÀ=äs’Úgj‰©*[–4ø<‹}¬¥aÎŽ{ã£ê*!.þ¦^£Äaæ@“JûÒö¾ºËº•ÏÖ’ ö-Ön6=ßéhúR³÷rÙ“p]ÁÚ°·‡rÓmLU>ž˜ë{÷ÖômmÏÐüT©Tæ-3'•'6 »öcmëÍ>D+a|Þ/_mÐù†ðnN*Ú>.=à¨{+zGpžÝ£ #°º–ªi¶VyýÐúúÐ)‰ÜU»Ò½ 6´>õh2=ä­j¿‡êw€}:P÷=ÕëãüpÂk°œj …`ëz»(7òJ«Í—ˆÆÌ÷VÁW¦ïlö>¡“Å–ŽîW±ÄÔÈÀ~TŠ$ûì&áÚƒv¶òq´úʇ }ák‹‹ÙÖJ»MmÜÝo‘rf& |Uc-;ßYiÙ5ièDÌ$õôdIæÆŸ‡¼v‡…m¹”Åz¿°$×ËX¨ŒŸß½ ¹9#'0ÌA4¹™ÃÌ[¯Ÿ½÷)‹üoJ’‰Ûúøv}›Ÿàfû,ƒ°l½ò·®]vÃEä’[œ*£Zgv=;²pQXœ©#~)ëÙ% <î÷¸½j€ÌêC³Ãóòž)4Yô:=ž"rßD7cEÂõí˜N÷¥v.é–wx(ÖôþÁ™¼T› k…o ­>¤«gIjûˆñpJ€ÿfs)«}[o¯Zj‹¡i?"m«ŠÒ¼m³Ó 0–Çe?ª(Ü$¼köf{OÛ ÎðÛ‘{'܆]¸@.eZªªèkƒksﱯ Ùº7d¬Ü÷"×ÿÕ²;F¢‹^Ð|ýØG;ÇÛjMSåkÃŒ|“&ñ5B{L§ªÿY­ Òt7mw„æ3=ÁÝëR°,ÉⵕE—KùoÃôSÞß­žaZã^úz Ãc&:Rb·K½£t,Ö–Ûì"ˆÐØr¶Ú§Üuç«~#öübñ÷~;‚£ ÍÞú/ÒGAyf±:ÌxH¶”¼\]ŸÚ“]¨¨¶)¥ÀîBSŽai"òÿÓ£a/dÎ\u(ÿ°:%ûpßÙê%¹suÏzZÕµD Ôç y z×–YÒSÖ¦Óÿݦê_ëRšz—Àz} Ž­îÎ{`ì"ó(åjÕº"ˈb1PžŸ0Éžf{1Bóêû>Ã~öÅÚÒçô¿êëK+Dvæí_Hì)ý¨ìé)èP¼þ1¹,ßïruÕ¹e7Oÿnzø~øµÃ‡w¥-Kíl5rÝÂþડxN‡_zåáÉÄ(ùöºŠÃGçÒ±Ñ9×Ww‘"­-ÈŸf§“o¥ÞÄÎüã’ ‰· ö÷¡9 >½xçç3Dß ðwV½Ï9¼ø^©ê±‡b&­ ÙÕ¸õÓ´$­<õöl×íEëà|& {î®Y \Zl5PÕüÁSœº·è†„~ï bk£ÓêÉ5Þ]&}ˆdÐÙ¿uÑo–b©ã^]Ÿ±­UèRšJ0:®£p a~ƒ÷ï—¶nˬ•"nNóßÀÿV§°ÆbÉ6Íóâon9ûÌS Î8xdɽZý‚Ã/ÛbÝ ˆ…nô‘íR¯ö|U#ú†±sºIÓvkF†·[„è»izù·¥¬à/xGs“Ââ™â`¾}[ꜞûò¯Õ¢ÊzÖ¢‡Ø³æÏ©ÒŠF˜4aØPb"™Bù“ ³ËÄùÐ×4½\c5ý3ÙzÆM“Ù —ý-0%x{\Û¬m;rߊºwÈn]ϜͺP©s6$òÆì²ž©è@ÿu*¨È:ö#³Ë68•·?¶†É‰Ð­k—q‰~­çšO-™åMaüa:{†^Ûô©è&ʬ-pªd<“ÚuݺáÑÖ„èE ÷×¥«ü©ÖMO=È‘ïÉ9AA¢:mÁ,Áœ«¨¨ŒƒÛk,HàZ8ÑA–µaQ¤uGöZÿ¿¦×Ð;ÔŽÊg~L Â"äæ0ÑmÈ‹*gø'›”Ÿ\sbðx§ŠÉòîå©VV/˃1Æþýƒ½§ Άh¨ž,Úg{Ô0÷7ùФ=üoö{‘e"ìc¥XV­*¾‰êº/.Q r„Û$,G¥w¿0n1F}¼•ÑkƒŽMô?wïìÓ½ˆ®È&›Ã(¾ösâ!6sMJ—ÄN®‚v‡Ìí¢®fû­kˆÏ²÷ÒnøUôFhŸ‘¡¾©Þe­»ÝN§ úñìÿSGçLœÿ0&Ä‹ÿ8:ÿcâü‡1!^üÇÑùç?Œ ñâ?ŽÎÿ˜8ÿaLˆÿqtþÇÄùcB¼øŸó?&ÎâÅÿ1qþØ/þãèü‰óÆ„xñGçL¬ÿÇ„xñÿ¥çðâ?±þâÁ9Žâø ñâ?ŽâñŸ1!^üÇQüo"þ3&Ä‹ÿ8ŠÿMÄÆ„xñ?ñ¿‰øÏØ/þã(þ7ÿâÅÅÿ&â?cB¼ø£øßDügLˆÿqÿ›Xÿ ñâ?Žâëÿ1!ü•ÆQüoÿ1!^üÇQüo"þ3&Ä‹ÿ8ŠÿMÄÆ„xñ?ñ¿‰øÏØ/þã(þ7ÿâÅÅÿ&â?cB¼ø£øßDügLˆÿ_ÿ6_h"×ÿ›°ÿcBŸãÿÅùÿ–D žaI`à±ÎœŸ~ø: €¿wþ?É=ÿ­¤€RF=A*B¿<3qþÿf©ž™®¥õ}Ø:Kc؆M:Ɔº0Iyb‹’.¡g©Ç½‚+(Â,X*“È"Ò¨X2¡o*©%€tB Cê¡…¡àYXÅ¢ËãÝ܉Û5%uiTžÊ’·ô¢ã%a8$ ïÉâhŽ€e0ñ,M"“&¯ªŠV“W„x²ˆ,2^ h!쓪þ¡”0]Hca期0¡âð·´†L¤’` ‹¦$Ž/gš§—+ž Ç1™’0ž¬)Édy‘ñLÏ’„±€ŒÃ¢A·UN4g/pµT^f€§âXÞæäÓ㲃)ÂQpL^äq&n‡qF¦¤‘êŒ÷”ÔÂ`?Kቂ%R9ÃJRË|]NubÒ56`]A3°Z0_Ø÷Kˆ@Žà5Ì‚Ó\ëFný+FX*•Æ‚Úõ%#c"“õ¯x¸AW—_ ¾ÿ×âîT¤YÌ/E0ÁSœÀàûWl\É4',ùK9þ :èÿæx2Ô/ÃaA¤!åWÔú×j òrtÒBÖU}D‚o0„4Š·‘JÀ3ˆ,P7*°_,& cq+&Ra"Ž¥@ì`D2Æb]]Á6ÒÑ0¬ $à=éD Ò ƒ €ŽáöÄ2Gg0˜‰d0Lh <‡Ú-€¡ƒ7ŽæŒ×ZF¤âÈîÎxØr2KãïþÄ“yûšVTq*ÞÃÑ‘I¤8:rd8Â:ªä™4w?ÜÝP>(7kxÚª^î ªApªæHaÈí ,è[˜3ëÊÀR`.4Æ·Ì„:(ƒÁëƒghaˆW“û$#žóÓ§ß›ú‡;ÔßHœh gøíDÌ…Œu…a©Î0&§Ã,×™ë¯Ñs´0Ö×ß`ih¢cÑ`NxÓ‡ÜD&Œ#ÞÏ…s´aùU]­-Ô˜xÖWL´¢øÙ¶ q† s†åŽ ¨¿×OLmþF_{Ö\Ë5'w~ŒæKÚÍ—GH‡GíÓôÈwN4Ú¯2‘Ps¸²qWê?rH£°ä‘56Wœñ÷_ÀeÐXÀ½Zù¿õІç'dù`²¿'€¹;õ'›>(B#ÓhtÈ©…l 'JÀ3Ꜿ?ê~êÀqú1—Ã’ŠYÃAxü8ò34x< Ø/KP yÄFTSágaºÆ xXpIñ,Íy8tf*Xµ€Á R ƒÍÀsÃUøï8•ßzcmZé?jZîT*Z´sP£ëJçX×añ~¦] ¹2D—QqL&èqè›l¸º/AGpV²P –³\ævúß‘KŽ|g=NÀø´8‘ÎÕdpCà'O¹±QWå>³ñ0=ΖõØ¿«þ¦¬ôC:ÃñFü`¥¯/VGûBÜø2$27ð Kèò³ò+!`v! `0èË(HÍi’Üdè—÷÷à £"#G1¹Uŧ!ùMGô›Q5n?ÁF1†ÔéÛñÔ°b”ÿ¸lÿ‚ ¤ м•³Õ‚að­Q@bàúÇšÃdåh”o.î(üô;GKñù0ý[>Áþ2úÄ«£µl¤2®Èã>ì_Ñœ¶yd…j˜~Ûo9I?6ïqÄ5RølQÿ•Ñâºéß1WîÔÿ¡±úž3“Ây¦³¥xir°aÏ×~øyßÿ?ŒÎ·V'ܧ•£’F|XNʰÛû¿ðÕ¡…ðÖ?ùÒp®$:¹"ÌïUúÇ/œõîïp#ü{ý\!KÐBçÑ®'4Ì"@2qž{`™0×O›*\4 §W\hd2Í@ãì*PǸ“9:þÁƒý)šÿ¡¨g¾S ŽNÿ^ à6×iæ4ˆÀ~p-$.¥`Â8{R€…F•:Œ³Úз™¢ÖßP@_š€÷:†T†)¢Ô•ÔÔQj0¤‚¢ÂÈcÅ¿wÏÀœ¼†µ÷ÓRÚ¦£Ž@xxxÀGöÅЮÎvˆá|ñÜq8#çq"çyØpŠäÈâˆBtv† ñ¨ÑÄQBî ‚Û Äm,¤.ÃÛk8û´~õ~¨ÿ׈wÿß/ýÿ_e”© 2ñÿ?cIŸãÿ­½!¼û (Îÿ›ïïÿ„¿Ò$$RY5±ÿs,뤀F+¨*¨)àT]pJ (ÞE:©© •°Îª¿Z¾ úßÒŽ,ý?ÔñO㩌äµÿH¤Š¢ÒÄø rÂ2ñÐ:ÏÀ3 ýO0)Î6CÜ—š`ŽåAÃTå‘ÀÕTTS‘C* UGÊþËÕ LQQY…V†)!QrÊʨ‘â_ÝŸC#åTaŠhUh#Ö„‡øSéÇÆ?Xü‡:¾?þ•QhEôã:ÿabüÿïéÀSƒY"Шše¸NÏ|Ҥߌ&Mš6oH© ë¬´7[ê =­¯ß·*åСC‹ÓóóóO ‹ Ο?¯¢¢24iÒ–-[µµµëëë¯]»#!!áïï ‰Æß~c™›ZLZýªÊeÒ$Ø$èW =OµEˆÃŸKpe0YÖ3Ù1îV¤JöLÚ÷ZuÓPn¥òÔFÖ§_X ÆéYö›5 ·ëÏ c}öʺÅð¶xô¶WÍg8 {B´5~¯tÔè—8¾ïFa„¿ÊÎiF–•Ý•îÛr¡!²Içµ_ÔÙ/¼i”ÿˆ%`]¢Õ¬düÂ7I<¶…Þ[ð<6Ðê¥2-"ÜUíÏËUý_m*¶Uàh5{À¸=N'¬ßKìãyÿn¾êä*öÒ0áùW4­§- ÷ÞVtÄ(W?£ï£(ðþ•Q£Õ}ßÅìëÊÏ·ôb.‹–h­cÉÁƒÑRQŸIûé%EÝcŠ„7KÉ}ñJžÊòk¤¯úØø$ù~«uXyÍ}Ú‘Mï­Ó{52Eâç 2dñnrO³<|:-Îî Î$½ùðäv²ç¡àsŒú𬂬—­O˜ˆC¸Ž “0y+µvEí[ïì>ùÊõxûÙÝŒßrô¶--%´Y† këB`½¸‡…ŽÞZýBÝÖã"Uð\jqøç°/Z¤~/ólÈ_\xp¶k(ÃywtY9بvÀÿäñ^ÐÒ¡`ÓçŽ ?©ð7”é@4K JGݺv6dÔM_IõéFÐëÛY¾^>f¿éÍ`èõU|vS&v¸—•§Ð=Lpˆ°`ŸÈ¶Ö“ï,“SzŸWªí&ë\M ´‚Ÿõ+ÎI쳫£G¨çJy˜»Ú© MÚsµ_”" 3}•h¤ÁùF¸­=Øj¶Ùë*ŠD·Ü¾kÚŽ%[u9·eYÃ|8Û›$›!UIYš½SzÑÒ3I'o÷hÈñ ™wžŒš¢:¤(4[›R놛a;%ÏeûŸNâáÊ¢áÓ /nÉûðʵ}avº3ýÕÛ+¯ãéy‡­Kš$Ñ6aÎp>NMp£Y…1!nj%ç;¶+È-é%ä¹<­ø¸2LêaS{NâJ93ÒÇKU7ßåh­JQºò£WUªä¯ŸYÛœY…s›¿´z")[ÛBüHhÃ%ƒ„©ðmwä’;ÝÂk œVê 1bà‡³÷j#nÛ»€aÀ"­£™üW)6êÄæÌñ8©¹¦™oÞgu#Á-¼×±ðœÿô˜ŽËm’aUÑG³íÄå®xñ¤èªëÝ ÂNnŽ¥F&ó“Q}™…¯Á <Öø±C¹²e®S\[‚Ë0' U¢do:ºÉ‘Œ‘ðð´ºÝ2*xK~ÒØ‡[Þ«7<ºœn0 ŸÌóšµÊ5FžiauƒxÀ(z‚ººš0+åá»ëÅöVã^6~Œü?ì] <”Ý÷WZE mRšر/¡hÑP²dc˜Á„ÁD"m"K‘K–J²Ë-²•²¤hˆBö%Ëÿyf,)õÖûë­÷÷û÷|¦Ì<Ͻçžs¿çžsîú‰tjÔY†„È?¬8Ê%ÞÊ~ðÕê­×N [¾Á±‡,Üßr¹FTÂÕ?Ò7sΪé(ÊQ'¶Ü÷­—puǽBÏ;@áó©VBßKåëR˜$R1o^sTÆ  ôi~ú“~N‘ÕaWm¢×[¸`®)ÑŠ£/zg{5!ì­z{9O壾‘%ð°‰r8J•-8¶4&º¸ ¢åÐà1ª„iNÁFE©>g2©ÐhÞqƒ¿•¢$íÖí†Å•ßÜ'Òk ÉÊoävå¸âTyƶ’ûGY'-Ø­’²[ÑF·›„•Fe @I«ÑcìHÐäjT¯w(ÌM)æ»0ÆGüèeê_°Š«h‡„(‚|°\Ë¿ÞäWxš&Fó+t ¦EžÕÒäó¦è¨#QÊà'Ì?FÉC ñvRtz`‚:¹zµ’mè>3Ë=ô†|Ç1¢WÚ<ô ¥iÙ»EÈaÚº1õ{…Òô”è>¶’@v׌t›êÜá”&é= 0íM”fàŸNçïh× †ÙXH5÷ 6ÿ"7"Fä¡_öÃb7v¥ºní¤ìÚ4Y›‡Î”¢ØÏgwu¬É½8@¥ySéIù€œ¶À¿[G(Ù]oŒ;š˜‡«£^ Â(î ­»àN^nv;:Š}¬+ÓÕ#*lå;©&×Ë^¨£Æ®œÊÃÔw£¸!ÎU`‚ ½ÃT¥t`…t@Ósðå®㺋ôV¦q€üÚñ° »ª)`ˆ²z{-“Ñ•mGŽ‘±:ãÊ™ ÷h–Ä0õ8íðb,µ1âYc˜í+wšêXE¸ÅAÛBW÷ÈêÕ”¡œuÀosð·?íô%|K"Dq4Zö‘rO’AÇCȉÐû3"—Ö‘×ýS´ ´¸'ÐZá“ëuæ2P…ž¹^}@m; #Wœ2SáAIzA¯H¡öùån°k–ÞƒDç¤%>‚ú½‚É ‚FäX‘ï_Êt|sL÷44@ÌS¥aÄ´.­„û\ÚÛaäiÓÐhÅwì:¥µºnY¹§¦-©Æ‹Õ¡}Wzj ŸUŠ\MŠÅI=ßlò¬ÛtíúS6RqÉtËÝ,^"òÚÙ¥¥aP]LÑ|×KYkùçŒÖC Ý?m~§Ô†j]´+A¨—5Â߬ìʶ$“ƒëCek9±)å¬o]× ¦Ý´ÌKä>hC6Ï¡m,p:HÓAH?Se4ç)ÕÙ¨¬žÒ€´l'¨Ï•^X³yï Ñ—M{hœø„c”ÆBµp¤žüqL3`³UõU¤Gj 9MÖúÒé~î××7kæ›él b¯£® ñ³a2hïNÑàzLF,+µû1eõ·“]äÍ> ÞŒÒ$m¢ÇÚ…?T$Œ“âé‡uîBïx¹!PÐʱ•½³ ]mnGJä§Û\|(Lf¥Õô3@ç·¨=MN²Ú/»¢Êc^îŠÊ¦ðC:=Þ2âQ¥Bª‚ÄvdM¢Ð Ê}bÎÞŽ¡gá)¤ýŽ vCÝvLȇ?VÒ~O­7jÉ×]j$%ebh¼£a@ìcW*“K.O}£åkÝŠêÀ:-àŽÎš^cóg›Ê2UËï(49 vF²%>I\½wɾó$Ã\ÏFîÍ\˜¨éï}3EÜÄáiÎ0†Ì—§.fiçqb°+øØàh§l\ÏíÌý<îyæ}4«DÙ›æ}‘ %­~ǶB»3Ð,È `Fø¨ …Žt „˜¿¤ ºêGËçï vÈpaJz:äUw¨½@Œí*˜d‰âŠyêFÙxKæDç•-kºNF®Q}”š¨5òäD•Íã,½µçÒ̪»ÕznÏ1=Û(ig|ôãæ•›eõsö@ÅúÖ±cBG)‰ÏÏ=ß|x¼P³‘;è[¯yLðžÍƒêÇ SEo#…éÅÀ‘[8=›ml{å^쀭ʦQü»P±7;;º*‹["{Ä:ºª=[­ý;Q‘›ä–ÍЧˆKôêqpRw®ï´ÍÌCTÔ›Ö·=Ⱥ®9ãæB«w¯_ùqó}²ëz—x×p9¦Ë­†:óKB Íƒ¢T'9Z?ªUbðý¡§Ps© ŽçžÐ5d»»Ù+"œƒqb §úûE‘Ãe£on‚¶ù6¿lª7uØÃ±v$ŽÚ¬x;šY0rdÇmçìí€}…®æ›àÜlùl–Ƹծˆ^ Ò|—ñ8›E¼ #2Ú᪟צ ÁÐ6ÍEÔ5†/zÀr¶c”ox³ÕõµQzV@+½RÍ9 iZ˨„!ÖJÉÅþû—#hç#¼0åæV•?êØàaðð²±]9)ò±2¥Oj¾ÀñäöÝdþZ õÂX¤"\?`ÛR²Ø)½´”Ô7Cxï­¦øÝä~-)$ú™ðûBhÿÅ^!IgÎ's“°ËÈG[ÉÐÄ[˜Ec»Éö7;dG“8òëŽÄxð:¦¡rîìJ-x/h0¼q]“uÓ“×6Ù.ñ CÖhù楣%ï˪´$h+&»oÙD÷馯q ÆŸÛú1™÷9‚üØ¢•ŒÀVÚq9ÐÿíL*¾³£¼%Lتª&ýÊXNLnZ¿Â­Ðøõ¯¦íIÙ¯‹â’ô¬6Öˆ×&w§¾ÜÛvò@üÁ"ÑõáEÚá›5$ýúÖƒè ë§;DŠBÃÅìô)ÇtS˜gíÖy¸î™NÜí bØØ½¹Uû_vŒ™n·Já#Cõ¹^¤œƒš¼kI[þ&Ð(ØsGDª†E·èÏwŒ Ó¼|8¸æá!çWl׋ç>õ‘î”#?ß•$_aÉAºZ¯õ±e©'Ά ®­H˜[$†z¢™|t…†ûÄÇ6µ-’=úòO Øk …2 K% ì¹/1í|q)úxd‘`o‘æˆa— 3¹ŸÊi–½Ó}¡EŽÎ–vÍëÆ÷äß–r°WÚ7Õ®!]8í;`Š2Å‘ËÜgÏkª3EU×m>”¾¹¦ÀæºBöýA€úýE'„’úF :öœ#)ì}Aë(&ýæÐ¶ÆtÂ÷ñ6zÁâI’˜A¡$ÕšbŠÕÃù¤Ó“%¶i<’·4QÍ•Ul[,kŸ#j‰}­R;WsÐj¥Ú®c'NÛ¥«Doó} g µé¶½¶¹®V`tà ݱ™E]ûÒƒ¼x¡Ìã!ý€´ã/ìÊ·Õiå£Ê¼>pAN`e´ ’/-ÖLéŒ:sÓ›æR¢ õ4_Ý=q9ÿ¥œ˜VÔM£¹ÚOG fn ÷Iä‘]+?$P­~ºÒÁÈm?:O„VÙæÓ¹#Êje‚&^ÊpU ‚•o1·V7¦·WKª->‹Ö[D P¼*^À++ì‹dMZJpße ö±×å:ædk+¼Frœ»bŒ0ä¹b_ýŠUäzOä@ƒÈû뗢ɽ-+©G‹>ÜG\LðÒCš˜ðqÃw‰…wg¡ÊŠ6ðAMÏë­{Ùht=«Ú§ÝŠÞ!Š|=xm[¾yÔ2<öì]†àJh/{’DÕä{EËZäû1I£¨u„zoé1%ÔáÞ“k)èÅÈø·_e¥ àPöâ¢9È{¯?% P0/U‡ «¶¾Ð«ô(È4å¾x¤õ…á Ë„[.z/o½àJ¸dª”­©‡ÃWötA{_,@Æ^~ Q¶† Q…Q“†º%×QkZeæÅDÀ0@ϯ¢}-šÜN˜”ó ùŒ ˜ª¹y wx?1A`ð%óÖ넳+¨*]éíèð­Q³N'O3ïu÷ŒGióï Ë3Hé÷¦nFÝ<†¹ò|Ã<Å:ÉSóMž q}‘vr{T€ÛàAuTÓâuüêƒeG:ŒjOáúÊ/Ã;/‰\ö^ËzŠ6tY‡ î–|î$ÇÝ‹ÓJ/Â㼋‘íÅ#Sc~NçiaÍ[ wúPíŽ>÷+¨ ÙíRäö# ñ¡ñN>¡;P¤ÝcÛådƒ&åªm»1-·K»Áôu¸{ÖžŽ¬â§ž »šÐ㔿QuP§>Û\åäOµ“ýšƒïƒFëžß_Å<_Œ+x=µ·ƒ³&ê¤PÙ ¥”ã¸Ì»Áábe"u»F×ý,yWØP°P'¬w­6jÇÞc>‘Ž×¥×ñ^?þ «èãÖ€œê’>ñLòCÝÛ¢B#ÌÁBÇ™gWÔ,#3:S{Þ£aÕ¡íl‹“‹OÌ%?Úûn¾†7r®VêýáÛØEPêÜþ #G’÷W gq^¨Íçâ/«ð>»ÐjNæÃ=9V{(½0¸þàG¸öØ=#CZÊ«¢@Üãûošt¢Í‹Vz££09óžÑ’¼k/)+Þ}rrÛò¶Ó÷døÄZãz„­?&†Î¿^v^N-mzþ><¢õ€¸«à‹ûZÒ ¥IøPfž¾hL@ôñÓ®œOFª`©îÒ(ñ{oä>º»Û™ûv ô?µÎ£&Ь=–yúîó!ÇfïЮ9F«q\ Õ’jö]•>f; õé.´¨]q+ú59!ÏO×$`…72¹ò}ú©ùuªL÷/Ý, %Èv祺ºiÎ×M‘ÛvŠY.©RÚŠ<¤¾H[ç±3Þ>ØßL=ØR¹ÅIÝ‘£Î·ô÷&`*éà¼ôðuµ:F‚Ãyñ "Š2œû‚TØ{—P^nî~|YãÐZ¹8½DŒÎ¹)çØ¥~ ²Ñ•ñz,ÔÊ!çgFï^1ýÖÑœí:qCěəTÝ8í[D¡µ¶¬Ìw¦\Š?·RŽM6—kJõôó]È먱Þõ´Ûûc*ÖWÖ^^§ˆîv.‘|†-(ÈCè'úF[–TNGr-l|b˜¼­n£Ó~LÅÊøŒ ¶XVàe¤jï¬rÈž¯ÎÖÿ&ùž.FNÐKþñßÕCÏò½¶‰Ò,¯®[/¢[Ú1xd ¯@ôÐfY‹È–MGyÞgÆE–ôˆ7­¡n[/’$~LÅaày¹óTI¤Üc£T9¾¡³/&ÅIÉánʇ»7ÑØ%ë?žì=C±:»ùÞvŠæ ð”U»QÎ$0ÿ`³œÉ¢p»ÌA¿¹äÈ–]^âQýðPoÎÁ (…wg}9k;ám¯×sì{ HˆÃÐ8ÒjÌB5_#ø5ð÷\püæ \À䘯 ùY¨ž£µØÀ·ç‰¤vlœè³]62Ûèô£Æú„¹òˆ¥«Èr£ì:;ÛM™–ØIÓHæ{ÞíËo7®j‘" Ð3§´c[3}GÚ«XæÀ½Eë: ìÖ÷ŸXÏyv.2 ?CǺ(½–Å ±‡ÆÊ…ÀÒÀ'ëïöíjßVþz»˜"¼$~C]Hò¦QÆŠáB…4”_oÉ˃̓±óåjlPó œ›,LiSG܆&¾ÏŠ3?+¼÷{ظËÿì¼ùusÔ>àQFkWÁë룯9ÒåûV¦ëYªA —]B«¼×Jëï]„«kÔ9Ñ=·îr %çiçm¸N‚JW·+~ãzÕBG©ÉoÒ˜Œî©GŽF²ð¬·\!d»H®QÅR% ú p÷­û+J(zà“w÷å.8TýôÍaã—FŽKšhb›´¹’w‘õ,KøunÞa‹4[ßz©«ÄBݳ$A¯fËY“ ]tV¨ú¦kõy/è_Wge6¡MDR=æR}%Ükj›=w9ȇPP OÞ; ëŽU$‹½záeiYе²ä8N>}nêº+a¸f?‚N&ÙŠZÌ9†(™¿EÔë@%FÏT YÐL2 z” tŸ•‘E¦ÕYÎÖÂ<”ÄGH —:Jó î¥aNæR…ó«$’AîNÒfáN¢×ÁÂnºã„.øŠ p-ªšýâÈèéAI^í=A›³;½Ä:Î7y™›²“ÿéÞcÈxÌ‚6•;Bºr¯µ*»…¨\‹Â³]\–„yÝêh9×RªKõÜ7L\\É÷Ðb‹µÔFkI²î‹KDo›êGU¿‹Ú¼ˆ|ÙÕº!Ųé©]¬Ð“¹ ºLóo”ðy'_´˜‡[Xé?Ÿz77%Tí•„Rlp«Ëvø^ÿ4sOé`U¹¯õ v•þs©å¹=bAEE½|,æZ>šß6)2R;ý°ã¥Ø6ÖêYš‘ÞýÆ[JLümàBZ³t½P­E ðnGÕMÑæ.­ÚMH­»=oî!>À6’[k«nZ”ôu¿ÍºØ¶<´€‘K¬·iù4ÛM—ªž7ØåjcGì¶Ç‡©,Ÿè„z¿È©²[šÄ_‡slŒ¾H˜6SÃ_ä§äjf¯x% Úa/ž-ïZÌíº£|]ýhåéÁÝ ‘<#îûí½ï§âz1aSÅúþ“þ`W"!»¦úCÒèyÎè]d×+hg0àÙ@•¿ï§æ::<˜úŽjÅÌÔ×I„¾ÀÌ‚׺†³ýC¯·¤~XFÆ6x¨£Ø÷ý ]d•Œ¹V¡Ÿ@ñšø§§yƒž_Éö¸:G£Ì—³å4ïe†¥>l\´:2aÓ“mk:`Îô[A’W³eï°Mtý<ÄöÃ,íšxƒØî][¡ µ8MãÉG–ð9\8tj–g4€í*å‰~çä§eRãñZóË»×È…¶6ív¯õOvhàv/án+-Y›³Çu?¤4ñ½üƒò¾p|ñ†:öþ« ½ÓëZ‹Ñסò#qx³Ûú£ø ÈÛÔÞ>¯}Uüúé,­üvS¨+ÉÔßåR}¿ìR-™–ŠÂ³–jª×ó—eÊðñ}èÛ)âz¦7yþSûXS|û©‚¶ÒáQ.™“%®ÞUÄžuÆ/HJ廯'Œy<áYÑ2Kǧ[?|0wƒáB‡ÅK—•qÏšv/]Ôá~¸½©ËØÀûÁ­ÄüÉVµ¬¦eëøôÞ&­ò8àúáºý¶Cn¼¨ÙÍ÷ä"Â- k2d–Žª——;z×;çMVVtm²~Ußk¦©›Ëî”hHΑîðò\Pv¥²L\Cèá…6û¦qS†ž Xß|ÁxÙëù²8©W¦Ù½Æ>Ôó@˜ ÊÒù-.ÔÜߨDv{¡’›¶¿þ>N¥8)´L¹öÅ>ciô.èÉÁŠö’¶z¹Ô&€Û­Ç*Ö•<ÌÊ8^E© ߊ‘²ª3Ñ+uõ>v+x°ûH^EíBßšÐÁ‘ÆäÜYÝC¼7˜ˆµji2GÏ#gñ»Ãü¦OFjÜË<‡ÞüåÔ¥t±j43»s -ïÓk},¼/ÒN™­+ÒM ï”doâýqKϽn¿'³™Ãÿ±!Ô}aÁñ‹6Ž\-Qëö¢ËT'åu>Òûáñ¦aû}øÊe;/¶¦†ã¤­·!?s8YÒãP¥¸f‘;ôäº÷Ǩ#¡P®È!62Ù°¾7Ö›&Üü^¬èt±ÞûñÄÀÖôLȬȄ’Í6Ùã#ÎTõ&ª¹IÖ'qíÞSèÕ\ù –O ¬’ní¤ÑçÊ¥ “Z…:Ø‘dtï°YPî™Mm¶,´©Îø ¶ª>NôÓ—æ©<˜ê­h±ÿ(oðù6ÙÚàÅªÅ©É *³[²“ëò¡î° å± ¡›ÍèPÕÕ±ùk&7¸ÔПõ¦' ȬvœÇ‘'úò²c=ý6~Œ]b]lÿ¢Ãuï-¹ºYè„ò•ni˜X ÀM±“zm|XÇèÄj/jç1®d ¦Mu,ª|]r.éx>äÌù~wÒaUàyiæ” 2š¡ú>¹;¬ëŠÓèb­¡û‰¼QÚíG­–f~6ãs·àôí9¨F#ña¡³2P+™…ˆÛ¼õ^©z7ÁF·f-Ž„ VÞ¥²*R¡3V1G?xîk3O,¯e®&P•r¶f6©Rw¾ÂÍUâš+þ„\|‘ uçñC³J"º"nbÍNvÛçš¿ámÅs?C]äõd(ÜñÊüóÕ)zs VªI9_ÀÖ)‚ü˜S)Z§jÕ'áP*èºmÑ Ø%I¡úâ•h¹.Îë•-éæú¬ü÷øäž|ÒµäÉ¢•d87z¤~ˆ{a*T~MPl;y+¿LDR%,Ò{vÞÞWÀ=ò®ÁÆYÔ­g׬u®ny×n ”_ÚܲOC­JžªžOã$§Æ¹†E†Áäï#ž±P#â\É‘— Zâ`5¯iZ ³a†@ÏV¢.¨Þm h—&¶úáÙ7dDbÙ>©Úœ"l;X±ë]uı²çpg®sÅ°tÜÞ_ç:hªÖnÛõ:ñ~ØŒÒaë…€¸rA’Ìh×ë ²;XÙ5ZºÎ'·GP§7$îrz,Àà”‡yC±z_ë½Ã‘·lØ4 À¢Ø]ñ”ú·8²6À~\Z7K=qõE+rV'Åäh‚ÚyZèaÆe}G9v¤ z ,9´Î¼ÕDn_Þ*†Eó›yýEOøˆªÒ|ÞÆ‰Á¹ÉOô‘Cã‹S7^Wï0én—ðë|Tê§_k>à%Pÿ4á4'-ʨkìb² PQ:.‹ÈNÌiÉZ-7w$Ÿb™+E>óLWwÿ]D½õKá´Û"G,\Ö…W!ét[vObëîŠ\¿á’¢ëB¼1[_üöÞ+ê’ƒ¥kÊ*jq=,a 7[·Õ6=ùîPU—ZÀâ½#³"#ZÂöËr~ŒÖÚæ —Ë-Ê¿0Ýž rQÒU^·HÕ!¤.’ëZu³ºG‰EË·«1@j>jßAõ u˜¯à@äDYÝ󲯭–*­(¡¤aáSù…Í£œé&€“Ùî{få˜Ôõa%M@µuÈÛjÛ©+‹=_RâÚzÇš|79ó7È*Ê{q×§pkzÝq¸–_Ũ‘qâ7˜Ò.ùxQ+×mj=–ïøÆYoΉ­”„<†¼Þ‡zvÜXúÎ[K©szzt†FR7 â?²_/<ç45ðbd¬ÚJÜàkgÎdÖ&d–H ͬfäˆ2JªŒ¾Yùô_ë=g$\xY àN85· “‡£.FfT‘ ï2*ïwUó¸+½½©Ï|Oâ³æ,ê7Ýi¢âmÅI  ë8¹¨&û±è© ¾ãNç;—n$¢='žÓ¦¼S%†üN®)ÊÛñY¬‘ñ¾h_Ð7Bµ«¬¾©Îúî³ÞR‘r&€zû$ëuÃ.ØÊ5Á¹DzAûò=Ô?¦¢#þ¸&ó8)!¹6Ì׃ºþνŠüKFë5jëÄÞÜ‹MÄ—äá2ú9ïxs®\¤Ó>˜­r²,É+x2v…‘TŸ<ò¤ç0«³JåŽõ•Õ˜eaçia¾œ:£½ƒ–¨±ñn¸M£q¦Ë—¦O–œôÎÈ:’¬‚Å‘`Š ×Y©6êñÈNøã|Vç]¦ÆQÐù9ë;á'm2Ràë““¹4KÙUj`÷_æ{éœð–Z<$bŒ£ä¢¸£[Ôå.ökîĹïʹ¤jKžãYãýZ|ð ³8ÝnÙl7ûQ^´khGP¬* r^Ðâ‘òBmÐŒ-‚n¶B¿Ï¿Î#÷RCÙÀr‹2—/ÄßXš¥9¿ 2ñ‰…NZHbœhŸNµ9ÏzíöÉBŸ´z;âù×QéDÏêß”1/ܪbt"#!QvéšAOÀ€MÍùôé´Âô>òݱڼ·K_t¥YP÷öÊÅWY Oð»Ï9:w™îzIßYAÂ{z§æ»æZ˜Æ¢*÷Ôê;øryÊ¿¥êø†êWïL¢g¸#†5Ôy®p²·ʧJÂ- L¥?P„ÞžOñö]vèùñº7w4ê1jûHiºÅ1ÇàÌ¿5kvió…dãÍrJ,T³ä.Hõ‹n…[ÍÛÒ¸ñÑHzõ ¨Óö:¥UJ„Ë|%Ñ™[”ÅÒß[ç8¿(c—aZù;ÔÉ—óAjÛŽŸz»w$­î Ž.]Ù­ hqQ ô”; 3ÞïÈ¿&Œ‚&TU #»O1›RæõÈ»E"Z^g9…ê·×¾…¢hú…ßBâ6„ {!GáΉPÐï‚i#îQ:àþViEØÂ(÷y_w¡!Ja\[ÊØ<‡í{%uƒ*Ÿ·Ð–HÇ1 6V]Ú¾2QÓ\ñÀÜ4£ i#Yï¾uè<»ÏÁ¦çY‚Šäœ]QuZç×y é9 h'ê Pšz»T /v‹LC`$Å‘ÃPomž>âß%Þ6nââ²6Vk¡‚óI¹­eíü%|¾:a‡Dï5)1ŒL±ýàqœÇA>/ª¹Þþëô”Rg¡mÃæ(“¤­êµxÃ]òèLÍŽÛƒÉ*ÍHÿÃqë‹"Ý]Ù¨·\ñaå÷ª–{æèm?ÆaŠ›·Ï”Y·‚ÏÇøfÆK  d¨êÅ‘î`0R‹jªxàôo6ÙCE€š »T“¢àk6VÆvT`w5Ó#P×›}aŠ‚÷nŠª:\Š9yæÚËege÷¨à²9tt` Zx»ç©À=S.y·´…OW£ÙÅ x‡DfK«•Y.;,•~^¡;ïÙ9ÂòÝ9›,|ÈMÀS º¬¢ÉÁc8…Ù‘0›%–õN ÷ñ†FÃU—Ì¥kcAWA£õTäËgküºc÷:+?_+øÈt6¨P)sÎ8Èjƒ•¥”îAeÞœk6 ƒ~â  ’}ì¦!žT$}« 4%}°ÇN¢ð€‚“ü¡m/dµ @÷0Ê+yÒÆqË vr[þSghL6À\ó0²J¾ùˆoÒ%¾Ã•Iìd©± ]ߨö ~7hzp. ~ó0Ò0]LèÑ P—ÉuÓáô¥¾•%„¸º/‘Åu2g“º¯Ùyþ$¨8Ôâ#AC^ôï¨Ô¸¾ó“+<+wàuŒ¿¿<)ûh¦ÓZËòQ}õß &†ûISDº¹ùWsËQXt\6S¨ÜQ5ºÎ'‚PS¢Îu±›)¿MhEÒ0‘œ1€™e¥¥Ù\áÜxu·ñò냥·œ=Dû|h^ý,cÎzcÖûÂ0 ñrå¾aÞÒL(òÎiøV›,äihî%ßhÒÃøµ5Gr”üÙÓ²4 »¨:& 0ù¦Jyß}èfvÔ e}~ì`(ÔêÝ“¶ï:NCa ÕYâĵŠEÇ@sšô¼cDs±nÝr\ĸÖ1ñ.i¹ªžŸkF1âãÝîG… Êåž»ºð—tߦ]&¯°ræX2=ÍB¨jLXºñ~,ö̾¦ä]`å R[SUQ3Q{YÁtÁð­ÖÆýg«Ô+7‹"½ºw{—P‚bœ ^2}J»LÞNPUM7 "½÷ð*)/r~Vº¬ÈáNC½üuGy6ŠábÐAÝ_Ó5hò„ÜxÛè°•Üi°”­ó›lÇãñŽÍoå÷üó¨Y£>ä˱—ño•ÀðøJ‡èÏŸSž&”䣹“`0»¡Œ‹v@+Ýä7@îzQ{4®²ìö­n°½sçXVS(Ò#zTiÀõÓd^=¯±Ëúz¸¹N3ØWº.¬N†i+}޵Œ”¨_ÜžV$|B>–QL¼ZYÆûÑOŒŠ—­0«Ì©]M1Ñö8t‘¹ sôL3^¶4ë>È]ß{*2ÔEJÙž¶4Yì ƒ¸±£à»lº¿1(Ùa—!kO9óNÊà•ÀÇó¬žæ ÁÍLö_÷Ú ü“Ëy¥ïv)Äsqq-N¼F’\”ˆ´;Ns3ضÔùƒ”“™´ØŒ;Z?ÞqzÜõ*ºfž®ŸÔ% n«{aÝwœ„î¼Çz¿RxùÕ“(V®·þÃדƒô"xƒ€FdD ›ªíë1§KKø6eV¬ò#OçKni¡¦xã ÁŽïŠæNÐÂu<=¹+²[p{V±*BÔ€‹WDñ}Ô Z–šÔM¤;âíJ ¸ä;NÇލ} zkX=¨ñbs sʱª´ È+·ŸËNM‘ªMgEÝ·õ:¹Ídƒ?#T+sÛÌKCš^ŒqFELÁ#Ê,¤F,< ‡×–RÚž@êî K= ÕvêMïXîƒäR—zåXË{¦fo 5·ƒK¯n=E‚Ë)åu¥ g5RnµŸ2¹æÖú­)—³,Μ]—›"÷ÊVîÉÅl ”:ˆ*¥¸¾=û‚õÃÖª Í³Â»/GMQ#u’t9z>Åi·s©{°`H¶RÙåŸÇžÝn/Ij^Ä9|:g“lp¿”¾gz§ÔúÃ{ æÕíhTÚðF§/v”íQì,«ôÌîn¹ëHǵ¡6ý † Ué‚Ö¡ ÌHãwÒ1Ì£I9›†3žù×Z]:˜v+7?­íîZ½¨4»u±ƒgs65ŽÜV$²µaÉ“6˃6RKö†¯X– ç…÷¬ÃD½‡ÕÙ‹‡Ê¾ßÿò®úèvF2T_›cKjˆphíN“…¼™k÷sÒ#¹|âs8lH_+Eö>ÖÃHn^`NSäˆÕƒìžš$â;“ÀóȲ®eŠÉ¬™§}¼©ÛºX|EÑ:êÖA/y hµÌ¡Ú7=ZÞ^m/Ä™ä\Z@ç(Ô0ƒ`p ©÷ÉŽ^£÷\8Ì ³špûDÏ0„lK‡½ 2^i65Ù%÷ÁÈTk­î¬oÕk XjÖý¤s]˜‰w,ŒÔá;æltáºG<è»B poŠ“òâÊ«ê7Ø ]8bvTïÑÑ[ïÌ*‹¡TîàÈç­”ôÇ‚ÔAý›¶=³Ë#í.P7}[zuU2÷ƒk],0öíåë°y¨ê”ÞÑxÕpN”2í ¾A+Éâ`pÿ5|!gÎù‡ÂÎÒ*yS^Ÿ–:ãÛÞI©‡¦Ì¢¦š;Qx¹“œ¯/…KÕJ‡òJ «åä84O[wGšîÛŸ¶•Plº¹‘E¡Û×<Ýá½Ù%ÚY¬óò©Ìi0öêéqØATjkŽ\]:-™üTºöI,ì¥4ÝPÊÂð Ð:6ymA… ‹j^Ñèh÷¢ jŠ쇭PÁHÙ^t˸œ õØ2,\Mö41t¡y ³"»]1QV­ñåîÎa;ò^á݇¡w’êw‡mȾi‹ùï‹+ ®Me_a4ø®Š&¸”¶Ý…Q– .Db2«—¯ï€Ò†ü¢àh§öÒvõ9ž %uAIk¥[ÜH$û'È^É ¾D@I.F5¡_].*`AzPqÙ=ïâ~™RßGKTšúÌRóÔƒÆ^엗׺swqáËÆCÒˆš#Ä£ÃÒÙOSô«|Lôö…Æ%†º¾»xb³](!Efõ0SÌñnƒ5ÉÌÅiƒžû’5ÏRE„Ózâ]¬¡v»"+bW›\»yò‘tVÑ­±€zß:ªf}„f3jts{»zh~yyëá·‡FäC½ž¥ª&x'kòV-ˆ ^÷„Ÿü8ý=FS¼QÁõ<]"=­ rt¡¼tívKé{êV™¥ˆ`Xså#Ñ1t™ùÒARèIÀF㛑Ϸ[ò{4ÛùUE[˜ÌÓ*ËDU‹Šø®šØnr·©Š/òXÌ¢J«GR›$=(;ÒQ€•}{1Ö˜¢—«ìÅèù²ì´ò’Bj[*­šcÝͯ\Œlg­»z>œ«ŒR<ÆØ{Ž#rNwG"b_¨.ŽÝŸ«5¤{çÀBdhÀGxcÅ›æàÚºMÞòQ•^±²ÝÏ›Î÷•ÇÜ<…[1#HŒOÁÝ•ÏürÜäA3Qí5Ÿ[eå £î¿Ûå_“N<°vÿ9•óIÑ ¢•†žŽËp•ØzøIý#¹ÂûV/覾:×P¬îzº:„xxØXî0²ÔÿVâîÀ)°†uz>Oz?_,sºDÖ°¥§ç#í±K|Ýβ#;õtçìkõÃ-E/}ˆ)Ã\ܵúRgpzÒ““Ä„{›ù×QœÖ<òEzU,%¿Žy|Ù¬)ž—úйE<áÀšûg1E÷ëa¬Ô‡Žz§;×HïUDu£ÈÍ~¶¸Ë¦—ñm`>0==©¶*¶-göüùT‹‰{–2{jê-’Ú û÷J=é¬g¡C¤(sYÍçì9©ÞÑÓ! Q0Gáöçå6X¾(Ûà2Zлú_¥ç¥À) rÏ“j»`uÛ^;ã+ò-vèF­{ÓhD%RsIý†~¨òż×k¶Ë ¥Bñ=­,àÊe~rõv¹¸›(ĪsÚ0ÆÖÝ®WÊMm—¡ÉG;)n=³ñµip÷vmö‡èy÷Ï lã²:@®é¤ î³SiC—žï‰ß…fVMmÕï] «´è3ÔäÓ&‡ŒF CmØ`iì|)£ÝøÚä‘í ºpÏÖ'É™¨]Ä¿½æ“$´lÎhÝ­‚œŠWÅÄ‚\QÞ[ï7΢:æ9i>»“¡"ƒ]CU« ''¼w÷Ecªm<¶ɃrõtGîÕ¹‰ù°J]]QŽËàtõ³·]+k44.5=’»ä(wA„Jíû~”ÁÓՒаg.äúVªVÛGÊô«¾›Gu8‘M“úÜ^€öáÀÏ3oËГܶV aâx?ËîV@Û7)Pi…½UärÄ^?ysÔ¡f™Yóüâ[Wû;w6§BÓaï1ØXeŒ#ï({£àíÂQ ¢ÒË\=:É7ÎóZn â`Ñ…EFW¡•,ÀÚÝÕl3f'øìŒ'*°œŽéEî›5ƒŸp2˜Fð\F®l(&ÊŒ&% *­ê…!=¨¡Hÿù6;ƒØ<Ï R7vR‚¤Oò>  ¹ŒJ>ɳªÐÜkK?UpÑÝI)rÎxqÐßÜ”\œÞ?»% ýk£ŸÍÐ1æ@®WŽF²U/xt°2µ¥~ÜP¼q}ÛìVx–¿ÕrŒý$LñcEÀݼÛÒ§Œ¯HbÕà$/y  ý‘bÂs»/2öÌ`§Ã®Ç„ôÓÆÏ×{Ó5>€¸ {mÐa94R°ÔÕ‡–êêqâq ßn×XÑ!püù<@Yã#{»]wd=Åxá½ Üben^÷#4_³M.,ëôÂÒámäžôèT˜ë\Ó~Ë“×6ñHïäŒ^Ú0Õθݒê£^¥ ­è¯¹<_O§ýo?ª˜=¤…+6êÃ(iÎà•LWBÕVøæèé”8RÓ·4ÙX¥¹ú ð¼Õ9óŒöæ~þNx8‡6Ù½¦ßÍ}Ô!j¢¾¼[ hŽõ¹›%„^ßã¥Þ˜ÈUöÌ9Úˆ|$M¦ƸÕ&õš¾uÖQY±ê¡ó>õV•íù'NÊßCð{^ºiÄÉé—“N Ûÿ"÷Id ?¹„agaûN×Áˆè" èÅ.*ÉHªí‡ÅâÌ·Nç]b—|üÆ")ƒüNKî>óµ©éàã¶Öš|£«/˜¾è3^ä[ÓöžÐkôd $á,¡¶È”gįͪ±¤®½Ñß) fqÝþç¯æ£¸;aÞ‡ðÆð×Be–„4ÅíK)]‰¸Œ´nZE¾Q¦Í‹ ÈÕöWkŸ¾wºÕ=Ÿ–ãÚÒ„ô"Ùá'×<̬x’ûäЭRJj¸ïËãI(¾Cä¬ÑH;«Ýé±® ´ÙßX©°C>¼^ÊW>>çª%²› }-²o`§šÔjަIxõ[nùæþÛQŸ¨¼“8ë½òûÃÞ &ew Ûuí;çmȰ±)›Õ‰s¬Ï­½Ã~P'®.yk4­»À[¤E£[¸œÈéÊ)/èßëZ‡‘Η×7ß hÔßU) ÕþQe7<'Í,maóêÎ#áÅÜD¾Ú%èû€ P2­HLyH ,¹^MÔA¥HSäÈ6~#]ŒsÔVW©Ñ7Îë\9C 6®]$Þ6‘é¯^C> ÂwÈÇŽ+ß®þºi„y8–&_`Ö«ñ©i4éß´_¥š¹všÌ5Šcy•.±JÛî¤×Mì9.¹õô{Å]77q]”(Qƒö ÓJ:¥^‡ß-5‰<´áÅæÌf#½3ååHH÷œçÚQsË—­ºÝ ¨çû`6‡Å^+\5y[:1mʽ q³Ä]ÛËMÀt‰¸Œwèy³(…ênO4q‡[_8°úÚQ<§B)¥å¹ I¢R²”¨™úÜ”í‡Q³9,÷šâÖ$WX¾ØÜ`kéÌ»K÷¦p´lÒîýg¨#ÃX½+ª-·TŒ6åóÊVåk7¤¯ÕWw*»Ã– uè.¨¬x~ñY±R2B}ßvUw¤ÄÕÁ®ÚC5WgbçÅ¥føCÝ:•ÝéŽqò¾ ÷µZát™Ö-;DuzÊA&Ýô¤9j°ŸÃæ4š|è—ÊvšX²ùþ5RµÇ+^ P3ï¤ eNßE.×&_‡æêA?ý.µ<ÄySâXïÜêcìVs¯–Ï5Øõò Ç%ª6Z…Ô ã ÷¹EJ žJO’EUÔ² †îR Cœy&ò·t†î^–À§Ýa¡çšq fù ÷^uô•³cô(î¢H;3lÕË7¾ÞT†!¼0Dáåyß4*ÒƒÜ?'ꇟ….éjëk¬/餷¶Cü :MVÇõúÊXîJ–)j<"‚dü8,£œ–œ{1þÞ€'ð[›~µ¨QY9à•ÛpPèa@äÓ ¸r÷ÃÀH.Ý0-uÖõA' ‚a5÷ˆwŠÁr>¢°ìEUsêîÏ7h¢~xiGnq”½µåÌõðXý'V'góKžNëØO©/T÷^ÿ”r¶i`¹õªÜÜ34‡$覕ñô˜O¡­ŽêOGg×RuQ‹OŠxï ߪ¥îEÙkòÓ\:‰0äž“æ+ž\Éʶ¿ßOŒ iìiT·úèÉ['#G¿+Ķtá8‡(‡·U^ˆ>ZD‰dÉ_Yð |rð^Å¥£ËQœk©ü(ñ&9ßÒaÇKG‹‚ib+la¹çqðþ..2–뇃O‚·»¦]½(ßw.ŸÉ¬%É,äËû3Q†F+?Çr] ñ=Í×ô‘›Ï˜¬<­ßV`¨ Ôìc©Îs®€-Axº=–‹¼ÀñŒ×Ö÷õ•Úíãa¾ññE1†-ÕÎy½ùþÇXUUê ^[„O;‡i¦Ö–<ä>¸ŒÍ¾vNõäǶ!ïõëNDæ¬WUy@|»÷HàÓ„9¢ö9špä2®9Âji”Ó9ø ¢ßù‘7µ4¼ ×òØbW°ô®3=RÃÇ–tËèÜìÔ¸û`XÜ þ9HæÍ›ˆ&”G%C7¹^Úç'¿osÑúëþo|+•» Z6 6’ü†mf|<9zØ6¨d},™½™¯“’hçUïù•¹*)ìI‘›F»ÎÛPï‘¶æá|óÐ3 ÇkᙇŽ;ìºí¥Ï2$o'żºÆvm-Ò#×ËîîæÃ [£ó»\Òìñr³f=üà÷´ÏRã…×{äÖžÏCW(7ÀZ6u~z¨J–ݼÇ…ŸË]òBj²A³.·dÙ°¬~ôn;|Þ›óÈlz/½fmÌ}…Áè]YLzo+=ÂÑUð4û~‹'eK>´nù[Uÿ%-ù¼«Ùµ!ÛîÙÊ—–¦+Ùà8)M·®ª²-•idìËŠT¿³¨ÂÈ|y %3u0øÆ;¹î‹¥=zÙZU­)6¡©ÌƒNóÞ2ˆÇßð²ñBq^È'i‰P#½+9>¸íSú5LÅÔ´¶¾-Ÿûø RsoO÷T°yïÖ%¶ª“s¶×Ô{¾Ís1`¦Fºr2õ߹ÜvhYhUeg²Ê0òéÖž-÷ –%§":¹i» j|•ƒ÷‚¥Ÿ‹=[ú®¥ÙKGhùa‹*Q4ë¬~d™¬nz&+k¿&±TѲ§jÕÕD©4éøëáÚù앚—›­tµmG¥R¬÷¡ø8Ö‹?K·•¹ÒM’Ò&#Ç’Ìe8DÌdKö׈7ÕÉhs>bÚêÿ"íìÊ× m »I] Iš‹Æˆk?„¾ãZÇ”Úñ²¶Ñ2=]ŤÃöQbÔ;“qA3ͯܘgbuÁÉÁ$üQ[Õ唢KiÃsº#Õkèò™.å½äùÚö°l‰œw3*èÙSÍ!Ý;6!(…"G½è¶qWVôöØ.Ž[E~B ¶ÁÈ”Ê2l'h¼çDt”ÉîêXþä²_0ÍOØ(yùÅUKÃöl`çÕCà¤e!bàÜZ\pp¥íÌ!eÎÄ¢@šýp¤ˆX݉üô€!¸ðÖiSjì5¯çØ¢È("›cUõËrQ¹ë‡\­2.. ¹ Òc&'ÂÚñ8Z»·ø,]4Â5*×øûD²Œ…#Œü·W¹¶¨<*dEå7Ÿ‚Do¹áÄG+Ðsó±…ˆK°ª: ÷£5(“FXh4çÇ’—rØÛ=Ç9“áñz>ìH>µ,侟‘ªÂcrà¡"÷ú‹KOîÇ´m}ú8«3ª÷V%.ïâGÍ~¨¸ýæM,‹`´Æ¸ï”¿[9RgÕY½ž¨Øumu²—ùù{Wë Æ*ÒÉÁ´=„=ašúPòù…ÞG•ç^ClÚô.qca.jœ1ì„e¢Y‹üŠÕóy,‹Ò/½—j/%‚%“ª”ÅTœÁ̃R#Ïkßc—k_Çu(ÀÑV¹Á´¤ëJqäy×õT 5º0 Å2(‘åô ò£ÄðlìC*J,áý¼='tá¼ÈƒÙ^@ÃËO8œ¼1Ù xâ¥5Øþ,Õòò!¿A¾Q Â;÷’«±ìàvý[ ¸[™(£aÏÎ MÜ=”žÎ™Ñȯ%â£Ä¢$Tì-5=›Â£¡G…GªýB;Ù #bB`Z¹× †Ìí¼rU*ïœÓÊözHƒ¯ˆ=ÂãDÞ)`3WäIIÌ9ÎËõ©Ã¸þvŽ¿^(l£èÉû¸øÁ­„'±N³Õœ¢Evy4,õ^:gÅâí9oŽŽš¬€f½o{EH^R©ºŽºjD5ê?€4?dtFrøÄµÂh‡€Zç%®sïÃfn”|‘8WP†KáÆª†Tí½°çÇ;ö+¸ „Ý4\8tªWÈR¸Ie¯«f£´öòd%I>m2uIƒzÇUJšéb¨ô:7ù?rjo¥º œ²S¨³¿ÔJ8e~E¨@í|Ÿôä•@ÞûðÃ…]ènÃ3éûx´½ãM£5Õ–w£Ý¬Uò¡KðµYµŽëo]ÂI¼[Rß-ñÎäÅþùÂwš¬ž=ò£LD×å.èï;“Ykå®{;Qå–J,uÄþ†•¶uÐ)wÝa¸ `YQÙõQïû­´·W}lS;§ÖÜå“%GZ:#êZÒc=Q÷Ãóo\Ê,c‘ÚÕ«}½°¢KƒÌj$‘ž¤Y”Îüa4«e@ñé}öJÐË4o™'7OãˆÜUòªp*P.Ûvý€âŽøfè˜Q¿øvŽïªOq«é^I+HÕè*).åG®Lʰ{i7’’ Þ-cˆ?è¡]ú4è6ÍÖe3èðyÕ:ï4æmñö©¤á| ¯¢3óáüÉðwך‡÷åC¯ŠaçÏZ“Ú¤ö€'¹ÛK:õ¹Îª!fg‹Op÷[J!òa¤åÚB¯Øgkë3qúK7¼JÜ=²/ºª“"=\Õä “ñœïfYle*߸4Ï xlë¹jÑË€–-„®»Ï¹êìûDó%­£” †>M`uò½¾îá1°÷΂†MGJ£‚Eέ÷-mÄhpŸ9¦·›¨ø\ '¾ÿc¨—{LAGMX·Œ«;¯s~oÑ{xn·ªµ,—Ógÿ`¨|^—Íd-¹7Ôú›¨–lä*oÐ.R‡éWóíãDZ çí'ùúƒ÷Ø9ÊÄ)0—“ÎMÌŽ4 }ŽFê—)4¥÷z’‚ãJO‡UäGÚd»G €Íм{õ°Ç3F:“gçMæNé ’L½Þãj¦aß½+áåÂÌáóQÖ¦>■د5v/sç¤<_£qdNólËâRGJºgyiVÊùóÚ¥4„kí>?”úr¹{ÕOÖë8)yn3‰ëî3¾DYf_›Þi¨'½1è˜.ŒpjŽÏr3µ½ Otî,Y_('ŒWãÐp½0/™fh¹WÉUÊKžßM˜µKT*¨Àú”™â$—<ÐqN”ñÍbÓeZ¸2ªTv·y·[6ðü-o›ûŽÃqƒ ƒý‰²¬geã‡ß¡V.Ÿ¾ åŽ lïnvó£údF,s~¯¢5©z­>çYQuÀ’Ñ€EA.à8Žóu€ÂKÙwÀDìi•.8þ|hãÒl÷,ªMª¡a͘­=í î&?ªÚ%3v—Oä9Ò¢á’r:͇´Ã#HýºgÒd³]ÁäFÚrïµ£@³íÌC{lF]ály€âÈêÂä"´´ sR|"ÃaZ/,­@¦ÀB=lÈ«2RÖ÷ hÀM”cVµ޲RÁÿS›ßŽ.¥LR­ó±µåíñ’Z—ÎêZ{÷Ö¹H‘­« O*lö”‰úrj%–„\äÏ•T©zYÆè®!Ò·;d©kx2Ìæ¸s’ò‹7gIÝ£M‹æáuÐêÀ»×R9çc Ü—GªžéI$ «¯zwäåÝ['"Ï岪ì}·‡•¯ËlÒM¾QÔÂzç—wß#¸\9ƒ/DJúÖ,¬x¨»‹³ ¶:°ûO¢[¯²§¹èù`náPƒ¯æ2' ‘Ý”ñ:BMTÈ3Ä­ÂÎn:«¦êóÄ6 ;® ݻޜó §ã½»Ø?Àrîƒ.Gænw”Áp”z}Rðºx×A—¤#»´jã\9qþ¹dhØP›¢;]ïÅŒ»ë^!Ó#ÈÛ%|ûýv.ì!1w”÷eëAÿ‡m|Àïø4“ê–Y啾âŽÙ,Úd÷Vtð!DN®@÷“°hòáŽYÎ#H[¸¸1s¥E×>Ž®Ã¨¦VôÐ ‘W§–Àø=4Ü™>Š[eê_PÔо0,ËO (bŒ þ¿Œ Ü[A¶:;<4 ÷½kö†µ­¸JÜ©• ìsýBÀª¶Wñ ­{ÄÓúNY!~í¼@\šÿôJuà©óÅóx$‡ N¼@ Ú$H[©ìØi€¹*qêÀNg€Àͼo9¢N…XAMˆm«war°šqg¨O‡;!IêY Üñ1^ƒÙ2xâ Z}"qFä‘x­Õ§ýd\áGÝ;†ž7`4?™]4OÀå­Y‹ ]Aà¶Ðë +¨‡ƒüÐfy·ÐÊèÏMn+1ºc¤wÄ|Œà=z ¬Cä˜hy=jc6ݱ ‡¹^Ÿ~:L–O‡U<¶§i%d׺:›e¶‹ÄÞK©Ý5`.šÿ¶¡¡çH`wè¸E*Ruʼ0ùyñµö¥ŒË˜Mö0IŠ–º™‰\Ò.Bð:P•]»–¦” ôsòo‹®­™LÍ6¹³;Rçm ‹uÓ–ÍÕÚ÷ºŒÆ:ãVõöÝczTj¹21ÏûÖ{îFûõtüzÖÏíºŠtúhx<ª~{a…V‰èî…ì‡úó"¥Ù][vÕﳑígåoi;9+ؼ±B–Ó—xEßQ ß³Þ¡JÉÆj=WD !®„b}‘£­8“±Ò5ã…k¶y§î¶v0K‹ãZïÚp  ödvµ=ô°§Ý'î/¨ [IEŠw¾¶§É?ìÂLšßžõõâ°6üQ˜Èõ¨Æ¦È›i—Gkš"MQo98ÞÏÖ Hº´H‡)Ö? EÚ·né¼|/ß^B} D9Ó^Òp݈c½‘=Jc6òxÒˆ^â‹Vž—| ¡´ÄÀ"7†VP"ЈÉg'Rî³15È'à’tîwe:F$i¾(;",º,í™km%ñPEêjʲv µç)¥bãHA›Øãû±^â‡BaeÁt²¦C¾‡ºöþÖ"Y[³- ¢âs.´$8FŸ¢ùø„PZ¹tâîôº?Böž†.šì68ñ"öAå_+h¬€Æç£ó=h›/šßÅrðŸÑÕõ£A×líé¦?ëøH‰‹ñ͈r¼X-\¸š×lþå­0¹Ô˜QÜ“§§ÒÅ®ÞyV‘oV]ÃTñRØ`]~YÆŽ`Y @YqÁ5úþ½0«SÐÄóMZƒž&d7 3W«ri-ìEÔ9·èmxòT$ã¸Õµ6ß,³Æ?£l¸ïHØK'g«+L4`!&l+T µ§û pCyóD/ %qi‘cø¦+/´¤ØãVãþPX:ßÛ5ŠÌô‘Z,—kËEŒòóNw82x)‚ˆ;ÁjãÕñ~àA ¯òpä‹YQ^ó9}ÅKÏ&ç¾beª‘ÏŒ.Ìǽì…*Úà”W¸.$nm”S¬­±é—¥Ý~ĘúV ‚ûH¸?M ËGóáòjnBÞ÷‘]ãÓÈ×:¿PÖxjëêdçÝÀ—0^LÁzŒrUçîOzdÕݯüx³Ä—‘_Ä´y#?Ⱥl‚̸øn½S¸v¸a†™ŽËSöº$ ,|ax½êtêF(3¹ÅvèÊ!{ Üts•êè³\ËKÎ&-#W7”?*Ú]¡7×Þ=Qè²QÔm™ÛeŽ/ÀìœÉ¬ÏÎ?ÇÕÆEê!Wa¢u|>ls·Û€¬Oª¬¯=Û‰sxvO³]¶‘uÐR¼ %ýN5:0òõZÙÎ ×®ÅW‡êéðÒdS_èäÕ/¢BîOó®Ì"ñöl¼G\I2à>ó6^óêš•}ΛÈäF2ôqE^åuzJV6Öƒð"ôvÂ{>yt¦%‡Å¤¸B78u'‰®Ö7HRJ{_ª‹š½lÕn<Ò s5gˆ7êD®Ãr^º?.*ô6Î!éHïŠÄÚ$ì¡`áy(Ôà˜´j*¸Àf´ªã8BOÿ®åÄ×n¸ûÃú. Ç¤÷¼êeA^×x¦F‹³JÖré7Æ»Ž•1Š»äËY¨³ÞŽ”ξ§bÕ·±|åqón+¸iʦžûýÑeEI²ïŒŸÝMÒ ·_üžãN^yA @îmuÛzΞ¶Ämǽ|ƒL¢šUâ ŠcÅCqE>Vu@«cå‚:8—¤[-!°v'zõÂÀ³¿z0ð-ï¼Ø£—¼ƒ’HOÙ¼Q_jÙ<´ñ31269VR:á‹ß,ØlìÄ%b²Püštƒqþ±£µÎ-Î%¤œ’ÁÀÛ‰¢–Þå=rQÉpE²™âÍr&µióË/ûaAFò¡:ÍÆ`&ɺó†ŠÈñÓFóR#'»ha`îB†¯Ý4|á _íYc…—ÒcÞSáš+ n/’øÌ^ÚoRY ¿è—Û Oßó‹Â‘;~ÔÃõr)ÐZŒN8œo¨ŒâNÝÞTÓ‡®ºç*árLô@Gï8pª&\ó]¬ùádÔY› .ze#ûZøÈîÕн –Éþ˳/óƒ#A’¨ @?.€©´À±‚WÕ»îù=GÔfxoÚ µ: §Vòl5rTDçùIŽ-A^á!KôlƒR'ç¿®|€Ë h%èuÂ6®°¼sÓ0£}†¿Y× n’ÑÓ¿¥¹ÔHj,cå’ÁÔÕÉzNðÛ5Õîš“TUEÌ>r±;Ú2O ×FÞ6Œ.¤¢ V}æfôǺ¢t(@Hë^…ÇiÇ:2o)…¦‡ŒçGI!κ§@;e Jo÷•t­-ȼdÞÒ+¥ÌÜNîÞ ü HÆNl¸ãr¼$cõg½õa6½²¤iÀa€Çµ’7Ö W½«V2èÁÒÁ·;A)m:p9Lä¼ë5êõPÓÔz{eÃŒÂÅØD9]—ù~¸ÁbþºÝÎë8n”ÐWχÞqåL[æ¾É:ôƒì€:…o5G£4Û¥|· ‡mabDä‹s‹Þ³PM«çÑ0‚*É#©ÈâÀH.¸2—̓Ã%j²H [–Î#±´¹M5gß9ÅÅ,Xóq—ìÛ³:çÝ~äZ#„gƒ®²Ìë…ù3­K$DYrV±=xû@î.[2g‰ŽPÇ›n]rÐVmòe× ÔeUf§äwßnÅØ5ÇÐd§¿"a½>ÎÃÝÃsZõL0%Orß;ûI8W÷d‹g.ï8¢W-QÃ6€É¿¦wÖÕ.èջƊõùOïç• D!u™©)Þ’.Ù½óï¤I5Ûù…8¥¹¢ð¶…pæµC>¦:ŸV¯¢eÖ5 ­ˆAÓôÕWÆçp“C„¶mfUp2: í}ªœ•`úœ3P,áý™¨Žü­G–¼âåÖ^«BdNžG>ÿèVþ«m,º»ÙJVˆf¸F›vÙKTBwÞE–¬´fç ”{<ìç†÷M°2D˜´ì@œxˆm¬ªàd®Œ+ä`®” ¤°ª8œÒgN^ILÉX|)â’[Ë¥‚çwI‹›x™EŒ2ð†DçCtpò>µb+q^T£ßêÀöËÈy&ghÅîÈNáíDz“tçße¿¼pu —¹r¦êî-7š³ê»î Ë‹š¨·ÜZš¨Ïï¦@ã9Å[më§‘­º–[RsöâdFêrKÝZØÏûd]±µ·ñ†€iéM¨̳'ŠÀ šU¨Ä䔺¢õòO±zÒqóPonPl`±öebZ®YEÓ¿ÚÚ+{Á™ÉJ }c›¬úƽÕ ÛÔ+Fx:Ê›wíZœ†Ímóf³>Îêœ[5¹Jˆ¡ùgÔYØvj©”%uŸ¹îø¼xðyªA`ƳW„û™'…å -L:¨ÐÌôjF’„ViÁ»»#Ÿ÷ '®;fCry[쌷Ÿ®ÐnCí_¹æ\“lû%êN­’‡ŽzõK²ÂäÍLk瓜Dd}Cêîmþ8Œ¼ybéõ>æë:ºaç41½ÇFq½·n#%Í®0ôÒÉaÞÑ.ÏAû•–¬¯·ÞܯÅLµ¦­8WÁ{eÉàuËLÿ7Áé®;[8wﯱßÜÿÇ%­FäÐ|vã9×¥>¿°Ö!«m_û98µmY†XYÛ¹EŸGÚ‚‹´I"«È£µˆºs82­þÖ±ÑÛ|{•:œ{tÜíˆh=ö|´ÓGz&K0“ý¦~Ç–ë¹wXÎNõ¹Ü+ÙÕZ2Ü‘"¯ðÛw“k,\b %Á=m!Ü‘û•Â¥WØMÄLÕ¦5Èîo”ض7üìËÙ…éÃd2`ù€¬lA6‘¨yÕ¤Íý½\PßÙÕDà Í>Y—Gia+7wEég¨±Am{aý· 7>¾(ÑV|šß0(Æ5Ãt'·GT¶¹¶ÐëzêëëU_ì¨ ìÇ‚·"Cꉽ0‡[…΢‘©g›U€»šW`B¢`0;?ÇÒ‹lpÚcÄÏ’ÝkÎkÚÓv¦P¯Äð|ÕÓMW·ªž#òd/¯A™´¢ÛQÌ_ŒÚ)uÎøm³½•W.Æéžñº]UœÞ[w—·V áÈ £.Á¼‰““øNàþ*ÕE×…憎÷rõL¥ÞxêWˆÂâÓVŒCiÁþʆX„‰cAîœZ¾f.cá;þƒe\AnS·ÉGâiÚM/ YCUfo,ݪa$Wm”kÈü;þ-Þ%fîýlã VCû½¡®ço?isjãæîœ E‘™ÍèyÐÎíX'pÛÔB¯’5¨°~3¹ïžYŽÒ§·Øx,qÚÜ.‚PÜì·[Òµm™lYWôõ4ïÙkŽ ×&;ñ¤k¥¯ŠìBøV ¼ù²Õ,ÂdÔ÷ºg–Šñ‹¹wö™lyvÿ’kÍÊÝB…ßš,'w3‹e$é=É%Ù?4¹yõA=:Ávwù3Sn›gÑ•'Ó%—è ð({ün}X„Û‹ê|3}=Eî¬7媬³VdjK˧™ÝQðZÏúäÖ9áæQôa\ÒÜ Úœ'·x·N)(èQF?wxA€gY£æŠãB|‹Óz!j­ì’4Ä˨œn³À´k“Þ‡œé¼tÏ^T­{•Žýƒ¢ã”“nÁõù]wµû’ª½í jÝTÔÊ“lírÞ¿þ£’|çNdáasàs¹²U•›ÕÌêNX°CX¼‘V=hµDÛBÍs)š¦5Âî8pØw(·ö(Vuú²òˆ<ð¡mÚè¥CÈGß÷D¼m1ÎêÏÙHªêß êB[·û‰¢šÁ0ovÄõ%CAʹ¡…EzJ&ó|¶(/àÓ&·îÆ•Wn~ÿÒ8ç~ÃHiÉçÝ9NÌǪâNA)%êög 9®¤÷\ (bSŒcò¹²ÆÔÛK𼿻`‹+ ¶îæLvÖZ¾!ð>ûÎ¥'¶BcÛÝ YÒS3Cýïçî nÛóN'L‹ *ÁÌÛ8*s­Zvs9ÄÍïÞšà-lÃI«“U†ú·¤ldÎ%æ ÛìXÒå³:9ż’¾ßõqÕÓü“§"Vêöã’ò·„†îÛ)·)`¾ãn=¡ý$KÓ[¢ŠFå×<³†jû gé®^\-iÑpqQšeÁÑwa1óÈíÁ[>X–c%Ñì‘nèƒlPýì*ÍøüëÌ$^é‹JøWÀ†ã—ŸI$nÚËœ{+ÞHÙž‹Nýä[“]„;²u’«d?uœKf!Û¹r‡ùô+Ðp$]×:³±ÆªMå¯G[‚7·ˆ#›Odn(tô2z‘t'¯¾cè‘ñJ謠G¢ÞÖベ”"úH=ïIS#¨¶“Gî{è8fò‹Yzár(5&ZPÿÁЇ¨¸v×ê-O‰{‰1´›N èàUÞËnê¿Sb…Ó¹O½ußÕq4hEV`"Êžü%ß:ÄË©;bêÊñxû§Gîz%ôàÚàp›ð%JÊ;÷)Åí0<ñ»^âô\Óßÿ%õ;ßÿ**&*.!!Ìxÿ«¨øŸ÷¿þŠkþ¢ÂÿüEþàÿK®éøÃÿ=øÿyÿó/¹¦ãø×à/*üÿ_qMÇ_ä߃?üþ¿âšŽ¿èoÅ_|à û/öÿ_q}Ž?ç€FÛâ-Ñh `G0ƃïFKš¡Ñx‚±…%öo€òWïÿýq&aÚÿ?ïÿýç/#I#q)))q\J'02B˜c°XŒ”1æwó÷çúg¯mÿë/ã¯Ú¿(ìO³ÿà‡ÈŸöÿ+.#Œ-BÄ™àˆ8" gL‚lÂ"`X)±éš`¨ÎG ª ê —„Š‹AD……¡RˆOrŠH}’“ˆ%Nf•‚ÂE%!bbâP¸„èD1VRø“,$Ümdg°4™W\X †Hˆ Cá’ây`X#ì'yþð$Ç©\8r‰ŠB"¹Ä]‡’ËÂÊt2‹¤°½ )@:° ß Ï?~ý`û·&˜þxßnÿp¸¸˜Èí_LôOûÿ—‡Ú¾Ýl,k@EgSÞ£¤ÎÄÄÎÄ4kófàN­T« ðg“šŠæÎѱ±1&&NNëÜÜÜððpyyyWW×úúz4½~ýz ðü‚&ê8ðmI}Ÿ“BÓs&&1pÿÈ¥¶P¤CøÊ‚fi; {gÄÊþmÏ*Bùn“×möNyoàG•ò>t´E4hOV§"9½E- · MøðŠùbžÓ‰#ÍkÏAf©½öíŸ}êî¹\Èyå¡n˜ª+óyµYjæ(°q0‰©0=þ…?ž8E˜"U]#w=ݱðÌÑš‚p±W}L½I«Mn%Úßœ«°³óCØ\T¨ÛÞ®À°Ç.¨Ýa›ü±hÁ"ÂtÃÍx4wz$j%vÓ‰ÉrAÔJÓU·šÜZwŠÎ;œ¬Ð{8O66Gu§Ø¼'•‹Ln<ã:¼Q¡·ÏªM\“¦Ð{†óæ•€Ù–óK,‡â.-ŸmY?÷ðÕn­¹OÌë#1‡C.óÏ®Ž;—´!^Uå)“e´]þaß“f=1§>,ÔD–hʩů[uå¸îk'³ØüÍ£qÚBå⵸ÈÁ1e>5‘êRK¼e»[ë±ÍUþ9&ü‹n‰‘»ÕE“7Ÿ§9¿Là>-sçñ¤í÷Zá‡ç/kw”ŠHÞl*Ü!?ßßíè‰ÊþÒAòR®Î%¯G‡7KnG¨ ïÈ–rÍZ»¿©9ÆÍVü éÓ[gD#z^Fj³á¾rî£ûåm=‚— |äãô>~h¯[w%zÿ‚Í{¢ž>ÜÆ×ä»gÔ¡¿´r˜½ã˜â"ÿï‚vç™–Ï5{`RÌ|,[¿~­Á±Ê6‡O> ­~áúdóÊ·‹‡Œ/ œ9qrôúɘ«Ek¯×u>º÷4ëa‘sj¶¾)ÓÃ4!f§´@¹Ððcw›[üRêßE8ÐÖÖ1vòšºÝV¡#·3ÿK's„­‚ïN­ëØ1UõäÛe‡ ÒŒYw²-XÁU/¬]PPï×ÓðÑxñÛ®ðU‹/ïAÀ˱ëýâTÓ;Ò:OáB”BHW6—BÝ ó°÷Ì“fÿ²ùxæf+i‡xâ醦 7ÊlöÛgŽì+÷2mxãlízɯg¶TDMfÙN£Ëâ/òVJ“ó'¨Ú5ļÓ;°ežZín}ûâv›)kË‹Š„g;íðH½œìžÁÖÛ¼ÊQáÁ¾egÜBîQ¯º8ì¨È±Ë›u;vû‚‹©—ŸÍ}ÁZ£V|!å2É8Zª|·ªÄñ†öÖçëÒO:>¡²¹½ŒuI`ŽpˆAÎ&Õn¼Sûº ¿~Œr±tÎ^9žˆtæwŠár.I„=6öÒ û´7¾?«»±tŒÛ!zëîìðv™éLf­vG-¶ô %Ná‚nÙ"㌽×JU4Ž÷uæöîÝRNP‰Ó”³-ß*¢a Õ«Ê»H:_2«•ß÷–‹lü… ž|þ!œ .*£o=AE¨„…iòºl~à¦Þ²z¿–îü)&\…÷ÍMeZg½¬ø‡ò_k¾õ©ˆºíeÅÓ\Gæ‹ Ò¾¸—ºj„èÛ6‘xÒBÁå‹röñÝY¯Û[qäQuÌs®ÞywdnHÝâ);¬éušý‘ÙÍ`›û ¥f—_ìzd¶w[q¢gúªhÖs›žó¯;¿ô©\´Ç¦¨vÂ*WnœjL 9VWtß}ü ,6Y{i7%ÏijC8c¤Åˆ^¹ÍRój9ûQ•ÞŽ•·áÍ+H籃µ±Ý{îë¦í}znA¡oÕµ¾"íì%‹­†<L˜©Î{Ln+I-$èrVx²YÔYˆ­fRãsÛ8ò¦ýJË_@@ùfÆ‹õûeázÚoªMýÎîì¶k ×;™–µÝ\¼÷¢¹\f¡v.<< 1¯.v§Ë> ‡2”9ôq¨Þ”­z•xÃNᜲ˜ å ¼éótr‹Ëð¼êk˜V´;ÞîÊÈÒœc~]ØYàBÅì¯6ljsCИŒwW¿%)‰G ÕZFádj-_Ø“-?°OfX‰ˆˆ©7=âÖ‘°`Î&Q£åŠö>¹Æ¡† K;¦ÀÜÉfúaíÞ~ùKc=ÁÎg”Íò2­ 9Ö¼±uˆæ¸€S€g3wqÎÚ;Ëó”l~ʺ-Ë6Ú¶’ùÓº:/X4•íêZ]£5³W”¦>k&6„<¥ rÏS¸¦`µ;|K¹pñå€-Q¼åCaULª¬#‚û¬ö°*±çØçíàÎ?°8V ®êv%8¬jAÄs¦ÒÛó@Ε­ÒP+Ž6Œ×våx”r×ô5QqE+žM´*äLÇŽmK"nœ}÷ôIóÊ£w6H¿œ«¢ã¡yÈíŠsUL¨‡½ßÈó[—Ž^ærڧЭýB€ÓCé[˜ö¶dò–h´á°!C“,Mi“ŠõaýŠsFž*­;N>­<*û„iÊú-{íî$¿k#Û&ˆ¾ãä»Lá€ç;A+n#Í£³›tâ_KÌ}»OÄ’ÉÌî¢ÊQ»«+‚˜—[ª*Þlê¾®w·Eúvxª×ìÌ׎Z‚ 7-÷<¾YðÁq>Y+ý~í·XžýÛ³-늽˜=D¸T5†ëvyÆÍ_f¶¶e7Ù£8ã@ßùã{EÜeÈãžKv5%9é 0©j—·½×<4Ï$&ÓšÅíÖ®çFŸøÝS`¾â™yÍò¢ÑtÄ?pIJ°ë›ãüŽ—p²s‡¥±²å‚‡øî}ÑpæÞ‡óÇ5‚Ø.Dzh®@^±N_r|¥šXÄÞUËX=¶q÷„j©>¶–e¼"*Òqöùãð[êìËeúȱ,Ï«?fõ/Š:NÌYw|墘h5‡7hT‡-,úèÈY¡öõgúÊÓ–.財U»;t˜™­þx×IBæ¾k# îyœÏåѼˆÓyÇ_ Fío6]?TçBio/ÇPNŸIô]ﲦ¦@ïÖj1ÿd&³ ð ÑÞЇMœö:ôY_?›ýdÚ<-Ôn‰¥û¹þóžPÒ G. Õ£cZvÏj½½-dg³?ß»å.â©PÄ5Ø.·&/ù«ýÝHR§Mñ\ù4ä\wýæ´Çï*¶@dè¤÷µlr#vIîx^9¨ex9ÞEÊ!úXÅfÌÇÕ±'œ·*t†>8nâ+½»~[Žt‘¹œ)Å9ši‹‹Kè•“í¯šå”ë!kpÒn¾i4ìÅ­f²[Α“ø|ñ:”ÉíNð³bOXÍúD¤ŠªuU3f™1éæh2-ÜX+cÐÑÑÑ¿Çilɹù™<·çï{~&.j–"Ø"ùÀâƒ5}¶Ëªz‹9]óÝ-ÃÃ6®asäS@ŽŒvÖÁõ)Ìybó¸ÿáÈëó);õ„L/Îcóðß¶S<ºƒ…÷þ%æò®½sƒ×)]š·iÉq¹Ðý{žÉ<³ØËѽø£+jSIœê»ªD½UL‚ñЈ–íy: ]LoŒÃOªUïl 2G”ì˜e¶.R‰V²˜§t¶ß|…ǃøÙå ¤;^na>B—¸™b#Y9‰õRŽ-rzWɉ:nxóàŠÇ%ÚÀ8}ùñg~Ç…cäÉ‚w̯mÅ_Ë2énïu‹‹ã'§¦ö]òq¡ù3¥xv565A^Ü)† ™›—U¯Ÿ¡µIr)Q0‚kv„V Ív–•W<ÉÎc0ý Á<&]e£‡>>lDê8rÑÏÂyž,¹Jf zO7‰jJ©¤ ŒæÛ­üõÿTÙ±Nû-µF“)寛<ÔÒA!®L‚PeŒÚ+¶ö¨M¬ž¨´E çº×xΞ¨ðºvÚý¤äN6eÝ#’g7=£ÿD¹²)¨ìÈ1—«û­ò×xR¹ˆI×qŸö“;³¨ÊM–'_lWše¦£¼‰ÿ ; *]g=ß®žUÞå·[Sá!àÊÞ< GÙby¼=f—ï­ laŠå³¾zV_ù_'»]ñݵŸÙäRÌ­!x…)å –¯ ã’ѽVVt;µxv¹®îÚöŽ]öÂʪ«™Þ)ÔŸMÀêͺ±Wùײ`è¾eLZ: O f…ȗ̬çBÙ~æÝËcºá´âhUò­Ö®èÓ-æÉ’"xÌcX™VlâÜ#± ŠÊðeÒ }ƒÚÚ ½3Ik«òÎòë//Ȫ éäåqKz±Á\@„iÿVà~åã…³œd†–Ì+62aV›ËÏ•°º\Ë¡A:î–t$œIÓ»5.+eë<’çð²6Zõ5¶¹‡y/¶,^47¢•÷Þýãm‰t¯º|?’©úüašûhƒA\Sy¾¦ÕECÌÆóbþ·oÏ?^¬mwÃËô-ѵ®ÔвmVÄaM§Gà)å4>fCG™nìXÚ+Þ¾jåñzE;m·ÓÓo-8¾æÚbvdÉ6æO‘îÅ,-Óù|didе=Ûf©×¬š'àÝ?ººtÚø¯0æß²þC.ògþÿW\ÓÇÿÅþ-ø‹‰þÁÿ—\ÓÛ¿Ñ¿q¸èüÅ5½ý‹ÿ[ðýƒÿ/¹¦·ã þâð?ëÿ~É5½ýKü[ðýƒÿ/¹¦·ì¿qøŸý?¿äšÞþ%ÿ-øÿÙÿ÷‹®éøÿ‹öþÙÿõK®éö÷oÁ_þÿ_rMÇßä_ƒ?âÏþ¿_r}Ž¿±ÆÖvÎAoig®ýÕÀl­ˆôÕÑ· ௮ÿ…‹K0öÿˆ‹‰‹‚À #„EÄàÖÿþŠKvƒÒ~EMµ=šª*5­*ÊŠAL[DSÒTb<†C4‰‚-ž„·"`,`°ûxäXdAÅ“5Ãa°r²–8bF"Y âlìðöÛx­$$¨éhã3~mã×øÓµNÆØ C´Å‘¶ám­%%Ťá Mžd“´2©†Ò/•¢*+D¾{`Œ“…12²ÈZà æ3"Îd ø`­Ž8šâBƶ¶<"Îb-ÉÑgk†Ã‘x $€½q®ÀC #+¬#ðkƒ  d7Ž€#bH8,Ä颀  ‰ ‰B4X¼=„Þx¶ñØà XÜ9YÌgw¦±d‰ÁèÍŠGNøÊG0²µ–QØb`ä Îoç6ÃÜÍÇIЫ‚AcÏÄ£ï"nî r}IHoKú.&x *Çóï¾ÿhv;‚1¨T¶_² Š³4ÚÝw‘1µ°2ÂX|ÉÇаê‚‚:ά—)`è$daÒ ÞÃå¾G#dtõ„1•ž(ü˼< MO‹'˜áˆxÒgÉÕ±Œ´ÛlIDŒ1‰AboËHƒ'˜BléDm… @d†ŒÑX …â-Wµ"â„„„@‰Xd­ÆVXœÜFp“‡á³ ÉLÕÎbz-aEaXqñOöŠ0 CKš ÚZÙqã5&ŸÛŽû°4>S€2Œ^½`e†Œ ¶ X<Æ”ˆ±¤‹òeIÉe‚#ÊÉâ-‰Æ“ÁaXökÞ Ü¼B/è[›ÛXx FVD,ޏG˜wKŒ5PAX)ƒ€}“’‚±ìا¼Ó m6Î!‹,BÀX–å{©™0Dfz]‹Á°&˜¯I¦heii5nF ¶fÐŽÛœ@c ˆ`' 7Ó‚ûŸ pQaáqÎg.Ê_+JHjkfeýVi@à…ÃÅ…¡¢Râàn¯o—g ʈY àß*.!•„Š $¡¢Â’ŸÐ,*]‘Ç5Äð6@ƒpò#xäÚ 8zSè~¬¬?³ vh `Ò'Ì ã¨°ú²0Ô²ŠV@y0 ÍúOtKqûªÎåüµÂDÄfV-Fþ)mÎ÷7õõ{ˆþDDEPúv»ß¨ì—Bˆ‹~ AK†;' :9ˆ• À´dâ ÝM0F¸O!3ÆYXXc°XÀ8Oþ¶µÆÿÀuÀÿ'o&%З5î™!äÔìŒ,ðƆwƒìšð¡€ËAÌH‚aÊ•I8Kœ Pÿ+ ¢Þñ¦m"ÞÔ ¸i?þ¬ÔOBÀÈ™NŠ¡!aPu0Ÿù+FÌäܤ¥grxôJÇ€6‚h ±ešÊà®Â˜­t‡ÇÂpÅ á¾I}:ûFV$’•å§|áÅþºÇ³”óËgôPbË7(ƒÍÀx†f€›ægzD'Mù ¿‹³5¦C(÷•*0*0W N°3 ‚ЕçWøÏSø_+¢ÙclŒ&„ˆ%ŽÿdQÂx iB°füÉN{ Ùk€1¯&~GÛ‚?¾úc‰±5ÿêSì'OwXYY÷ `ÓÇN¿GO;þä÷i3üwióF?«ùí²<ƒ€£ ZòÉÖ!YA€ž“C€X7§;àIf’b v‹±ôùUñ£Öåë­1ÙjÇuÝO$uðTkF:ÿÓ@VÂýj+òÃ&ÖÎr‘)tú™ÄŽ` p¨ž@ú ˆ¢ÌŽ#4ÎàÏJG²#Æ;Ç  ¾~d¢? cÔŒ™èW0ûÄŽ‚É5^€\`Ñÿ(`ãÃ+`9¿ .±…‹îw·cjEtœÀMì[¸MËñ; dœÆÃ¯À^ d¢Ä_…¦ø£IID‹ (Å¿%=„ø rMqú‡7™@oKŸÀ0 ü$X‘~НM~¢Ä_ÛÑÉ<¿O‰‰ùOà F™ôˆbl†!˜â ÆkŒÞOrÇ3ÀÇãö¿[É¿…-=η@Wò/­-£_ð€•–Áð¯3´Œò~ˆR? ¢ÐÃÙeE´Ä&0”úë:•éw È8ÅÀ¯, Â(î—àüðøÞäô€΄09z#üa«=Ëï@”rß¿$†(‚Å™à xÆÌç¯Âõ‡‡æöã&ûpø·ÐÔz‹"ˆß# Àæ¯(è›ÐÛ"€Û/ƒí‡gö`X ðd<ÄŒ#©JVà:?–þwúh ÄÞ ýxÒNòÿ—£“VtŠ Áf›d<`ŒLŽKý³teŸ8ÃÁ`™dÄÉKÀ˜™ˆÃXX8B8‡ýÉš3˜Ð ùˆ‰ðÈ)ZZ3°oÿ ůSóa,­el?»‘ƒÀá-­-èGœ½AplÖ±Çöž¸A¦–SÐ妷Ë_c~xIÐ9n¼ƒHóéAá¤Mýbœö7µx@²¯ðú“Gjé¥@ëvo°=jÊ£Œ‘ÿ‰î£oô4ÒßUÉb@àj7ÑJ¿AÌøH}ILÅÊt†Æ Üj™X€üÏn› ËŸtG§»ßiQìhŒ¿Û°ŠO4 uìø¤c"Íš´“@":j2ê8>ßöé4ã–øó›D]I} "ÎØŠˆŽƒø/5Š?<&´Gš6ñ8i §Æ†fšd(øÌS” ·~ߺMxz ¥ÙI$½œß¡<@Õ|.ì':ôwåûYú„™X¿h‰#™Yaé+¨Àvþ9Ë€=±´ öOU¨ß‰‹$†«ûÆ44½®¾è§5]ÐËM†¢¶Ÿ uÒ‹xÙ²õ3[*ù´áßYåRŒ*uš!´í·*þç­¾ùjÍOq2SõKýoU?BxªúU1¶æŸVþvf»­-Ž8•ökæH ‡™žð×`FgÈÂÿcÁâ§)F\÷[M•Æ ÿ«x£â¿0Uߪþ_j°fñ?‚ÈŸ¬O øÌ$l§WØ8&@Pó5«õ_`Üf‚÷/Æ9fZžL´"áŒÁÁ”v…òïí Vß”ôå˜Zá¿N„øy+ÍpÆæàÐX4Üx~CLƒÖèŸp[¿À!˜~é²þ­˜l›”Â¥ýfPÓ`ñ_ÒP,fl(ÿ„‡û͘ˆ€Ûbþk0™©¡üãï¿Q9œÍ(ÛfBDô1ÐtéâˆVßÊ?i™„§×÷_ z32ÛN"ñFvôõH¿bטõ¯*™Ø;ŒfŒ3ÕZO.+ùb5‰:Îø7ô@Á>c•±Wüg­A ²Oî™i&ä—Œ¶[ÿðòˉ 5ÐÁg€î7-ž¥™äïgâ¥l˘ýŸ6±ø³§ü¿ŠÑ¯êìüÙ~â_‚Õ46&bÛ‰ã3¾¶¢•åï„ï‡wöXƒEÛÚY[['æö­EþEà‰€à}ÊäOolà;l“Eã%ü:¼~xQ†%š1¶ƒw%NÀ%:\¿uÁ2(×4N&f;MAˆ øU€ýðÆK47dbÿ:ÈÄ@Ȧñú€6AÿWÃöÃ;xÆM8¥=™ø7âFF ÿPŸ´Ž «?±éÓèÛv¿l'€õ/ËwïÓð’ø×51‰É8ä§£5%Ø—Áèlj€ÇNÑ+aÔñÔiNt6€œýгSÈñÖ`#¥wíX¾ó°(ÆYPfŒŽâg÷%+c;p$fŠì×—åüp£hi=¹gj‡2£³=ÃI[Ÿ­eœž2Ï8xe²~5ÁŸŸ¾‚˜áô S Ö4~ùu+Æmðƒö·OrùäЗ‰ŒŸŸøùI“ílZË;f:Q¬(È'”@-ù:åi$·|¢„?ÆÌ?¾¦÷;85 >]¢q^å ²8K9[„, øó÷ª†QþÖ¨ 9†æ1Nƒ£Ò?Ûl: F+žüÎhËŸ²øy3ŸR´IÅûò¡éŠö©þNÆgZQãÏé-ýGÖ=Ó3¿·@À>3 OrD[cHf Û ¶¡é÷¶ ™¾mÂca‹“ù$çø ¸ïmkŒ!@ó3AbƇßGk¼ó6¥ñGßG< rF*ôßGÃÚî[ìL=ýnj߬¨OŸ" éVDo‚&XC5Im¦gßàÑÁ²EcìHV`ÜB´œâk†g_§4~° #Ï”M»û—u4`£„ñãt3<ú:+Ü”äà÷¯¥ü‹£u¾q^}?°2VƒDØÁæ’QâÔÍÏ‹¥·SuܧÍOø?pêýÄ€o$ú–]ûj¸ðÃÑýäªèÉ A|úòÝY"ýÿ)z˜¨·_CÌ„Êwºý鎞8yºð ùº«ýΊ›Ö½‘û¶dñx‚ÏÏtìï‰ ®øþþmùþJ”ï‹v¦M!ý7;ßÚ¿@O  úŽ/F¾c,,Ç=ßûOì8¸Ãé³'ÒÒjVÖà/ò Ñ Ö\ïÔIN ü3’SÃÝ áˆ¶Ò²0# ²ÁÛXFMÎxÊäd-"¾¨Å‰:aôR§÷ä'º¦Óï~ÞÞ¦÷cå¶c±Àc[ðȈ‰dÆYXvDܧ{€þN¹ã àEfl²´i…Mi k1cµ26ö~V§-€¤f›Á—Ò§þ#M€¡ tôØoïÁÀŒµ¾’,Jß÷³"ñ(Bøáa[pãØdp 6ãîg+Ó/7®ýïà†ÃƒúÞºOHý’8àÙyøÆ°ô½‘F~È©~sw&˿գMBýu×ÊdjØ× ãüú {mûŸy‘_îfìÊýS^Aôñ F?<ùгw F¢Ÿ1ÿ„evÿ{žã«ÝHœÍ/÷ÀßêcØþ‹»‘ÿȈk¿Òzbi"ò_é ¿²>ö_ë'Õÿ3?8}âø?ëÅMêÛ·Êø}7úð'Ð m­@‰·Ž}xÛOûsßR‘¯¹˜^òh:qh¯ü‹ù\Œ)ò ¡?.æ‹ùãb>w1Ÿn ûãeþ{½ÌÔ?rŒ c;öä—äô °/÷èÿï9‰-â3:É‚|Bó×Mu}Rÿ?at 7~ïŸúï°ˆßu¸ =¥n¼å‚ƒ;Ø©%rã=S§5lñXc\ËgŒ7Á3Þš4vðÍ 8"øæœDÑÊÚ4^`J<ø21Æbr):cÁ%d `¬1ô›à¬ÆÂÂʇÝú¯íùDÑ>³¥˜©Ñ±ñ³òÆÐýÆ„rœ&è’ÿS›úçQvDФe•ú ËjûÿÑ´~RQÿ;Öö…ý ûÅ!VÌì™YÛ¿²³ôSHÿ+¬íäX?lmé§ÎL¾:Lxº­ýy'èü?5ÑôÚý=ú PþÖhÂg€ÿ‹ÇR~¢Ð_¨ï¿n<å¿ßs}z”ßÇõ½Žk¦æøuîßT¾ë7~ŠfÚÂÿpìgæ¶òÃ<}¾±ñ_çb~ØÃšNl7þ3ñŸLE Ÿú3ñg*âÏTÄLSf"þëg"Œ~xãîä „ÑçÛvÿ8™q2¿ažâ“ùãdf`ö_ìd,þÌwÿOx™>¤Ìb²+ƒøãeþ/ó§+óÇË|åñ/óŠМ̱“ùá-ƒŒc~'Ø8šÿ_>¬&È'Äþ‹üÈ·ÖL6ª¿'ÚßYð¿k@…ÿÛ­çϰlŸÍòóW"~xs‚Æç«F3nRø¿vTã·­…?+HÛ R?3ÄÿÜ Rº„㓱¶8ÒdX8þ ëû“W8ýð …ÆÌëI3aüYUªñ›W•þæ÷ÏÚÒ¿·¶ôþç×–þWÙអԘq¥é7¦+Ý{ÿŸšøß³*õ;qþ[ó€rü‹¤ÿ¬Çý³wüÇ¿ÖÛúöÙ?Îþ{ý„Ýùº£·ÇñtNÌðÆf€ÜÆv@mÒ+è@†ãÇZþÓ3luðÌœA8‡ÏWƒ/[øÅË„¿ÁÜçK…!ŒwAü®@ÉŒ(§ ¶OßÏ@Åý5VtƒqÀØBLq3yŠ%½ Yú j?Ø@nì@n-ðß:¥O†‡õ€FÛâ-ѧnKš 2?«L>·=dû6e, + Ÿ²±µõÌDŒWpÐÙ6_jᄈà°è’¶$G 0jµABw/2Àc[K eË힬 ÆTÛ­‰„8.*-"%-* AÃ…éU 3Éhbä8nè&ßÄhF"YKÃ`B`H TµÑ†'`qGÆyg‘Å[šBl‰Æ“òŽ'´&˜¡¨iÏøž oh‰ÇbÁ(ðÃK?ó.$*$ èC àCXP)Œ¬°Žà_°L9¦¿¸¡§¤¿ÁALöWéÿÎ% \bbà_¸„˜0ý7\T”þwüb‚ÃEDÅDÅ%$„ûp„˜ˆDìŸ`æóËΖ„!B L¦VV&ŽßL˜ø_ÁЯ½¦ãÿ×à/*üÿ_qMÇñïÁþÿ_qMÇ_äwâ/.*">Ýþ#þàÿ+®ÏñŸŠ½¯BA[X™NÅ_¯ `qÞ3á/.¥ã/&",* |F‹Áÿ/üsEùúŽ¿ì¥ýŠš:j;!{4UU jZ;T”!<‚0˜¶ˆ" ¦¤©Äx *$ ‡h1@Gì]`,`°ûÀ–fÊ‚l9Y  „Ã@ ,ˆ³±ÃÛoãQ´úØ’ ¦£58”ÉøtÉpGHt­“16Ãmq¤mx[+AII1)A8H“„'ýši·4d"ògè% –`ðÙôZ ê8GßPÀÈ ö`æÓûã±¶±-}Øb½c`k†Ã‘x à›~ÆùÐãgºHãÑ48Ò<ÕW0r„(1ÈâàË e±xû‰Ž =ìÿô¨óñ;ÓX²Äà ã]Uà+£G¡†1ÅÑC|gÈ·s›ánˆÆfŽã$Á¤ {&}! `a¿$¤‚·%} zçq~„†5PÿÔqàÛ9°SÀØ2:›Ò æÃå¾O'„`÷¬£éƒ/“§zc&FµÆY£÷81„ñ)€.‰´ÆÍà½g`Äž<›>Þ1óúçoOöe7N½YRÕŠˆ0sÑפmœ á³±³"É|ƒ'IÖXê+^å+ãS•I2/b|1œñÇy0aqŸŽ*|«ð(Ö‚$cKÂâ­„ÌÀ­ÒoôIÁ{}WR‘Hø¾òMg,q‚ýx2,δ‚±#ÄÐ63ºΨáÒ²àÂEð4z¢ÜcVÜøëq ²Åòøddp¯–k@õf, <!@Æ‹f‘nO ~=8‘HÄa¾h*b&_SK†J@lÍ0 S âŒI ïx” @@%E¡"(.<ÉÓLeˆ6˜õÄEP\*"ü‘ø&u1úéû$3ú‹ƒ¿MVTD †Š ‹Aá’âŸ\ÐÔÌãgãÔߘ(”›xÏ­Ü'cžÓ†#ÿÖ;jÿ+Œä×–´n·#™aÊ´Ñ\ ¸hãHN8 z#œ4°€ç· YI[Ïèèá¥Ã$r™â„@\"÷W)è– ÜxýÉHñ ̲•7;a!ø_dS¼ßô<àpè'yèo̲&Zöœ,ÁâAãed7þš >3+kpbC‚àI¼…8ÑÈbbg…)!ÚÊš{ökiB¶ïÓhoWWß¾OSG†~"‡ðwR À7’:`ˆ@JrAu§ºâ ýöÊ*Êš:àlÏ.eÍ};54 »ö«C¶CÔ¶«k*+j©lW"[uµý;… tžéj¾ßb‚y A,ð€a±ʰ#€3FÈ %ÆðñÄ#!8%²31‘ô©¾ŽŸ#>Þ˜Rp,²B&Fä±-Æ©Ñç¡pDK[¡É—M¨Ú¸‚ƒÓOXŒõ´{ÛÉ1hk ;S €ÂÌmÁ)m!ˆÆ…l·5³À9ΨsX ý NBx#K!cðØ_Þ›Ô+ ;‰hg ˆ¥Ñ˜±Ÿ‘¨íD*€¡I²3Ý ü“Çê%¤EÿócõÿÄ5½ÿ/úïÿù3þó+®iøÃ1ÿüÁ!¡?øÿ‚kzûû·à/&úÿ_rMÇ_ü߃¿ØüÅ5Ýþý^üÅ%„EÄÄÿØÿ_x}ŽÿÔpžvF¬ˆŽh4¸ºibŒáo”ñíù8¸¦æÄ=AÀE„áæ~Åõß7ÿ3¥— Z ™ý™ú3ô/˜úKµüê,c8s’ „>â ŽP™àqXˆðPhSiú¸ý·8A;nòå§òåíáF9§=§WÓ·_2+1Ãël'iìyþV!ôÿá¬}u¿Ù>?HÇ~âùˆØ¯/f%b‰_›úþÉ”Ïuå›ó)àTö›~ù{§T>/öûgUfÌùµ‰©/êò›“"’P¸°ˆÿ p±¿šôþ„:h­Ñh#; •ýE1"R¢ôbÄD¥þ²#àói•²ãIŽ5ˆÂÅ€DD>›eùSCbRŒZ’–øžZúÞ©! 1I(ð‘DH@%ž˜b™˜fè°­™•ƒíørxº¹‡`ñ = GÝvMþšhz¤‰±öoj8†Åþ•†íéïª9˜õokúDæ+Zø fdü¯TQR *")EÀáß ¨³$ãüUYbÂt=Ú°ä·•!ñII vüTb@½ÁáPIÀdˆH~³,#ùIYX+0Þú«v ÐPHþµ= ù–01/ §‹".ŒøL”OšŸì ¦Ãä›eºãÚmÎ ÑgŽè·éûJ¨ÆÛ&ÝÍþ¤9àñ9Ó6¦¾œ÷Ud„9ô©Þ™²ŒokÃY*“p–*8ÒÌ;?ÛÐIŸ'›¾‡ç3RêÓ³Y‘HàäÔ/‰n>‘ó AÁýlt1å¾Â>˜€Á<£îè!Äøô8w8Y#D´‚@>W–ï—dæà‹ŽÝ¿«Ÿíþ¤èÜ| Ów ñ}(ýC 1þŸ÷Sþ,üø³ðã§/üø¹« $¥á"VAü¹~àš>þoüo™ÿ‡‹ÿ™ÿù×ôù_‰ þÀ×?øÿŠkzûÇþ[ð‡ÿÙÿýK®ÏñŸXgëˆVŸ (ü2þbþWLL\xrþWÜÿ‰€ Kˆþ™ÿý×ßüï¸^ ™A4ZàDÛŸYß?³¾¿cÖwRéó»ŸëHÀ°Râ3šÔ/g§ŸÝóåðì':fBĘ‚I-³&âf¸;1äcA7¯Œþý+„eÚ3„èä3Ð5Gl'¨„²1ÐA³"òÈmÄ›õeA£÷íÔFk(«¢÷ïÓT߯‚ÞƒF]: £Üg¤Å¦H‹}‹ôxîo”Œ'à~¤pñ©ÂÅ¿£ðÏrKLå–ø¼Æ$§žIþX©+©a©)²RÿamML½ñLi;8âÿå.¨¯NÓ~9×Í3#×"“\‹³2p,ÞdfSê)ÿa¨DS¹Ós›ã¬ˆX9À²ãˆ„ñìÓÓ06ZZà@lÅ 9!G?+Gdª‘oÃ>Qû㋾RsS ODr쳇SMGDì3ý™ÒlñÏž‰NœŠú-ÜEÈ—¢ŠfŒŽ?chuÆ*e äOèâ\Ü Oè…K¥xk;# ¼ñ$¢ß*ßPóÆÕAÅþ¢là.½ÜÏÀKTôó:ŸÂJTìkìN¼ÙcœcéÏHHüØ6Z 3“  \tT$-öÙYjN!ù3ʱDìè[¹d>Fêg g#õ…0ûíHÖv$0 ÔüÂÀAa¬è4Ñ`,8ƒPbðŸ%‚.”ü ¡ÆÅùY!@¡¾&ÍO2­EÒˆ|!ÎcgARèjþiD@igж¤Ÿˆø¥Db?K"Q†DbÓ$bœÿÉõSʱD;ǃ¶"X8Î$ÓO³ b ™¦[-<$‚Ðü™2‰Ñn&« 65‰I~fAÅ…– âtAÅ…¿PG†þ,9ÅA9²_SGñ©Füóˆ[|*`ÿZÀ2ͽ}æ,ħq‘Ÿ!Fø«þwË_»Vã\+nÚê“™Ñâ'âl¡Ÿ 7åhÅE!_¹è¨žZD§Ÿ˜òÆâb_#0ДzL"ºõs8§B.qñ¿"úYÖ©ž„¸ˆÖŒx¿îë»â™ï‚Ð?—¯aú…tSMSü‹¦ù³œ9†á÷Ä'œù÷Õà ‰@—Æ#gG°Å›&ã©o¤¬ÜÏ«V@ˆ}Œ gËÖ™%Õìx‘GgdÌÄ<–ŸqÄïo[~®¬[vŒ÷yEbªã'!ü™ÒHLY? øçX2†(`0ˆ1‡!Sñ g aç !âŒfì3IL™N Ä®Dà» žnfY‘.Ïxb˸²&í’9ŽïÁйØê,9e3$…¿ð”’S[ò'4n{+<öç5n@™”ì,­¿#&2>R_’›ùX¡ñ…u† ÿFS˜p+_ê„䔥ûüéTT%ùùð…䔑ü|¨Ir*î‘üæ êg£{0àéøHùO^Ý$.-*ùguÓO¾¦¯ÿüÌÿ‹Ñ׈ý9ÿû—\Óñ—ú÷àÿçüï_rM_ÿûàÏXÿƒøÓþÉ5“ß~þ‡(B„±þëÏù_¿äúÿïØñÃe kýµÈÔùïâp¸þK\ñgýׯ¸þ{Ö}U)!Œ=WNù³ì·¬ûÅ׈M{ií8_%A;,ƒÌ_ì)œêùþÀ9ß<ãG·mý䙯ŒÃ2èœ(ZYX`€^4c½¡oÆïØÏ\ßoêãÓ'¿O/Ÿ-Lø'›¼îW·x‘¿Ûâí,' ™‚l|-Á4ä³môee¬æïÃQdr%d’ÑŸ…ã­ÈŸœm–«ŒýU ŠþM\Š¢ßƒâ¸ñ£O›þ>$q'ærÿ1(é=!°”_…¡ØßÄð @K?ðC;¥ØçFô_Ò?e÷'Ïqä0ôwãÂþ*ôÄÿ&zʶê@ ±Ÿ`á8øçØk~~d€`S<þ3€1ÌD  Œé¯Mâo‚6ÿM€&1cƒû,T¤/™ø}HÒNqóÏ! žÉc#á fô‚ xÂÿ±w`M]]µú´¿" õ—‡5Ù (#€TdŠ¢3!Èâ®"U[œU+"u ­Š£hµˆÖ:P[µ¸PkPKuáÿî{Ix F ˆ¹_ZCÞ}wœsï¹çž)”ÊÃ;Ãë;Œ  j:ŒÑ PÂ×3(W ͉Že¾ëHp‹«ÿ%IE@ì‚ /†LÜìqÜš–Œ2àÍÇo9˜„石ÕáÔP\ª‚AÄ«TH$´DrÉŒÔ5µ:ð”:ØRSõŒ‡z‚|„ª#ÒiŽ9 þÍ'.Jð¦ `­bàB*¨±$’Cr K3] <Þ Kœ*r €S¤\+e"Ô’HEü&D=\é«ÇivirÐ1³ÑÚ|{ê¿Õ¬%í&"bÅÀQÊ¡¼‡Ù wˆFŒ¬ÍÓ@‘hC!ÊD0$"ÕiìB ¼¹áK4 ¥@ŽDòCb J¤ _P:U Žu ¤Æ^$¾ƒ½¨1¬nB$’ƒl Ô`ù µÊj¾âu%Hè¿æÏ{-|ªÐ>Ò¶‡>3ïÂ%jt¿Û<3×5ðHj™x$#¬€A\‹2tÔ¼E‹‡Hðg ¢ÈH ,ÃÏq{uuÛÆíe°NíµA"4kþÄt¡Ýz©£.-¨0nôÈ‚1Ü“N®˜Å[ßÁÕFDKƒ ;uóÞÐPA¢·¥ªð·†MÂÀzLË[·ºÓ´ßÑý†EÍ­X½"´+€RÛ¢JwE`š¦3µ žî„‘çȆ4Éo"µ@œuŽX®ŽŠW½ûјx‚êD¹ˆÆd—' x"¡ˆ§ž'ÓÜ.ÑðyúÃö‡rd0"áÛ¤\7Ð}{í©a]¦… ±l43Eé«®¸FCTuÕY'ºä×[ã( O¸šÚ‚k:„ ¯NÀ¬©90EZ(…¹Q+¤ÜöÀ¬ƒÁÿQD °ä¡Q 2˜TÆV–AºÚP-–W×ÒVŠ•¶Ö\Vúú!ÓWÍÒJc?Ëh8‰ÕU{iè,CKf «È4ê±–Gn°Þ©­ KÓ[Ëkñ­$ÜÌ$ܼÚ`C«š/YVÛ0 6Úê©s€À ÌCb‘] ƒP®äø%B¥¸±œlCMŸ0"8-#KÓedkÉãZU­ ‹”Åiª!sÏFQ>–•öÕ‹}­€Ü+K/¡dñANj¸‚ Ìz¸†VòQ;­ñ+À¯ù1¦ZÑp½I¦21IK+éz¹ÑQÒøÚBð–G6Ã(ÉâzKÓÊw¢Ì0Íå#êK\tÝ¡ÎÖеâ)Víþü~Pã:)|š-ƒ©Ey ²éW}ísƒ•f˜<6„¸5”¶Õ6OÖP:ý„îC¹v[èRkŒ˜ÖFMs"­Ö«ýûAPšì7[Bjò¦.U'i®-²€ïíB©Rbž{»¬Ú-FCD9µ4„'U°ª;l,{ÚPG^¦–E%ÐK½K£Ì–wÔED ½Å smÄÖ‘†ê¡š¨'.ü2LÒêA;(oã3ñX3ІˆB ?Þƒ9Öë¢;StŸ6÷‰6L7kè¼oð4MͨnÌ€NŸ÷‚#0i÷þJ»´4°»~7¤¬Õe0, eƒ™™H0UÐÈŽ1D€vîKOEªÚÕŒ¼©f´Ì0wc#€¹,©Z®u†ÒQ‹äP’˜ÃJšœ±¡Q´ôúj¹ºš!´Z³eJË­4¦ 3s]Æ®› ê´ÅÞ/ã´jèúiT…ª¯I Ž†Ð”vÛº ‹¥vhÔnV¢ñhijïÆo«áôw®ñû f:©ñh;Õ& u¸m¶b,ì©Áé )ÇÐéV¯J$ Y$W ™²ÑŒLCc"EÔ”HQ YJÈ£ˆæ!<² ß›âªñÁ^µõC­ððsjcÂ&µ!IyƒSŠõÙCœÿ ðQ…,G(>·âµaù«wHÅbi ðDâÒ{UŠ‘”Æ”iæŒxn¢+¸7¢±®xIIÆ{+ ‘葉™7×Ód͵ö!ü/Tfÿ ÍÿE¶æÿ²HÑÅ?¡ùàŸhÅ¿%Š.þ‰M‰ ‘L¤’þ‰d+þ-Qjâ¿ I½û0žÿ‹@ð µù¿ÈT2ÈÿE¡P­ù¿,QÞŸü_†¹`$y²æÿ²æÿjšü_õX˜pmTè*hœöäz$ÈM«ÚŽ@&p$|xÇ{‚0:í!s„ 2•›Å"¦¦n˜PAõÊV&WðER·L612úkŠEÜ:V•Á0®SUL&©[ÿñuê=Y)5š‚ƒœ€9”ùR@/ Ê!ÐÇêŒkhÛèœsT½I9ˆ¹†`Öt † 3`¢0 ô±¡Î‘%®Ö§C|A’&C^*š>!† ‹ÑTxdx§z˜`äÀ¯<±áx†»Æ¤½3ãÎÄ»zÓÚÁëœC×·Î¥·ƒo x Œ'Ñéx ™€IqW»üÑÏÝïƒL%àéTžêAÇÓ£}Ì5ºXõD¥ð îÍÏ SöÄ…?|} Ñ8¸èx"ÁO$ÑŒvï;!vëƒË¤èx2•„§Ðx2ÃÃhóðF¢`·µŠÍKãM¢ÃO%P`tÀ(!v"€ÑAÂt"HäR™‰h<™@ÂÓIT<™Ä0ÚÁO'Ô€kɤb¾©Éhx€§’ˆx‰n´/¼~)˜¾`~ f—Dàx5µ®0ȨT<ÿË ™B;‹—Ž‚—À7‰*ƒŠ§hx:™‚§‘wov“•‰"S8!ñ4*Ü<‘§1ÈF›ç¹óáÿ0„DT§æé:Ò<<ƒÚ™2Í“l²Ñ‘­œ#Â922ðS*à{¢ŽÒi|»„¢Ši±&Ù-:.øt+¤žbøy òع߻¡ç8 Ïx›¾z›ª¡Ém aZz7~F¤îè<Ü&^ €oºï æH K’I‘ì¹ðW¾0³\¥¢:H‚4 ¨*9 à)ƒ˜npà *Åx® E³"ƒÆDEB~!ã¡h¿ðp¿Èñ^ˆA„~ H3êⓘ$¹S@t‰"hEG†ûÁõý˜¬Q¬Èñ@ÿ9œ ùA¡~á‘,ÿ¨Q~áPhTx蘈@73²1‰fððV†Ä"˜• Cå@̈T‡¥yä%-Ž¿4)U£Ü«€¢Må8æ§€ÊQ âP2C¢­×aæ%QîffíÝ“@´jϬå=(ºò_RóÑÿXåÿ)ºø'7üS¬ø·DÑÁ?‘Ó ðOø‡ïxVü[¢èîJ3À¿zÿS­ø·DÑÅ?µùàŸfÅ¿%Š.ýç6ü«é¿uÿ[¤èâŸ×¤ø§ÉT‰f=ÿ-Xjâ¿Zr ì Øl®R(³Zc”ȯ?VŒÛÿÀ…ŒÅ?Øÿ)$«ý% ‰@¤óø$2NåzPi$Y@ yP©4‰Æ'óšz|ÖònK½÷?'©Þ}˜Úÿ A—þ ÿgÝÿï¾p9rðȲö@/õEŒ.°zMŒZ"e " xÁCó~ƒèôž­Ò"Ñ€Z"“ x Ã*Nnž¥¾û?I_ï>Lì2•L¨yþS¨ëþ·DI ñßöÝÁöü/+( ¼U«6Løû–¶Áÿ¯úymüÏ€ÐQ‘UoßvëÖ-''ÇÉ)éðáÃYYY>>>³gϾqã›Ívvv†+¾}ûv?·Š k­‰håûçea«V¶®¬¿ÈO×–gž•ߢ:5ûÉÙõ;G§ø^zæK?Oÿì2+¾ë—«‡ôxu•32$“a+CùïÍËW=ŽLzöÛ²×þvù.Ï?q1%eQ¿uqe¤J‡?Y·ç:îØò¦M\¡£ËìgPð½ƒ|æ¾]ªP)0ˆ¿—~ þuuï¾ÄU€ð‹Œ¹•ª«/ž‘º¿9»:*³Äç‹’YÙeE‘ªgŽøMñ–ä8lÈùí\顨îþý\Ùñ)éLîy•›dÚæW÷VÅô˜]ÁžVXìœré?['Þ[2~“íý3'£Å“=©É׎•Žî@[ýBŸïƒzäTä²líå½…¯A¡çèqÏ\`TþhÚ‰ƒ~»; dNH^йwrl÷´˜/ì¾,&^Mý7s—Íà‡“ÛòVoÅÝôèØ†Õ'rÛ9›¶ic˜S<¶õrù–öàzU~WJVXo—‰QLi(þù“ìyNr÷l)Ÿ?òã~SZ ív+­ªHîÜõóÐ]>­áÖä>[¸0³Š]œ«hÏ\3nE’ãÂÈÖÌŸmž–3ZÜu›Ìá;ÁŸS™¶£TKוH¨iË7 ÄÝÍîìéúòÙ°À{ù÷®ÐªÖ}2,eFÁ^iò…ÛMg.ˆLîïÔÏËeÇÛ{«*gV°o­æÍútÂUP—ø¥a•DÂéö·eù6,Û!qäàsÔ…SE«m‡„j]Ú•óÇOÌ é¶;YáN=údo*RÅ]ŸwôâžövÓ’§\LŸ”àJpYkãr¨Óü ó ÂYö1ü5§Ã¦{¯Ü^–n¤Bëˆrât¿ƒ]òó{ªºJ'ys…4\ÇîÏ^æïLÛ¾2¹`Ù—ËW”Ì ~ªÂæHkÜéž?9ÄWÜ÷ºIJ ó½ŸS:¬ÛÜÏ‹‰KUvð Û!²I?©ÊÖï/ö4ækD0ËÕÇ·µËâÎ̤åûlê»ÜʲëNdÞÞäœ#s8éâ›ÆL7þî";§_Öí¼À ©lYüjWOžÎv¿ÏrÒúÊÎ'{„ÞÇÝé¸E¬’íët¥‹}LP€kš×‹»Lf‡T\—#w•öÁù›“²¸­úÄõ²³?tý¶Ã´›‘+V ]÷f;¼Ϙ7S`[Xœûäaïåã¾ÈÒ~vÌ Ýf_Л4«Kæ['Ûä¨<Æäè^Ìmñ IV¿žG¾!GÛÚû-èÍœunÌ×ÄŸCpÏ&Æ^)8|€4t¾ìÂdQEÑ¿™ý=¯í÷šQ4åáÄn¹E¹É^?âO_ãFñ$ÑÑãmŸvy·êÎ ’2!õÖ)JÊŸù9^löŒG±O½Lê×ÿðÂŒK“KÈóX=äœ J;[¸óAÕß½N:„^è°(#Çkƒ·ï¸ôñ·§~[ƒ|¾øj^Þ.û£qYWó¥gΜ‰ õ~5÷S¦bÛØƒÃÂ7O÷d:ånì7›GŽ.]uåûÈ8æËžVLÞâït$jïŽNÇò¾½ý*ãóäØîϲííz''0”øFœ¤379aK‡±ÜÊ%¥þw'öŒY9×.wßZõVÉN|oÇE‚¹+V½NSL\ã&à­Îù%Äõ³ëéˆ5IO嬀g#ûöSüöv™ûØ›‡N9+§ÞøÎ¿x÷ýuçK•ÄĵI;Pà³eiUÄ–6ª¹§'G9—ö½½ƒ¦z¶`¦˜a·Õá»TßÊfá–®Îx~Tõw\XÁ„Ï~·yÊœÝN°iLë/•û  …þÜ.¿¦É¢ZŸôf»S¾#]â2—ôT…¤»®,¹g7¯,=.ç'~ì½ «.¥zìT ÏÝ?}‘å{/ýµWÇì .ÁÓV$î ÎqÙâ¾Ö.Îñθõ Jòw ø÷µÍ”cžÅ?þïËÜ=U¯÷kw¡<ã®Û¢ÖŒì½#çòyºIröìÑíÜ߇¬,ÙêÝ-Yuà¯ÅÎoßTl%mºóô×ã·Ý—àÎJÍzò*ôMÖæÓK„çðrÎü}¥4Êvp¹…s’óx첞öê¾Ünë®ʘsÓ:l»ñÔÖéB¬’««&÷ùiïÑy?v›nÐÓez•;ƒv¥ü™ÝÉò‡Çà–Ò¦žÅÝÊØó·íâ :/ö?æàiûíæüø Ë®ç |÷ít)í„üâSÆ¥4üÅ4ñz÷쨴÷ô’ò¾×ÌiWû¬ë1{Á­’´–cÚ£›Kp™­ÎQ³§_Ýý›¾rž*4m(-ßæ?•ljŸ§ÛïŠy>z¼wÀ×z)˾þ#¯ý ÙЧ)T­Âöfígm-TAßßí;(sNhqyZøÈCÞË•)™»—. ­¸ñOqp sÄÃ{ûàçŸoX5*oCIô_ž•cG9Çùÿð²|ýœó4®»«;3ÐU²ƒØWœÙ—=èÙÒ'h¼(þõª²sT£3q>W֓ϽöUâó¶®”ݽ=.½ð„¿ëÇצO]xuǃÎGñŠœk—hc¹îK;=§Þ¶Ýs÷…y_U*¨k·ÿüxEzF*+ûvÅ«#g_Ìè>‘}”ç‹{^ µý¥ËŽž¤=|ü‰ýÑT»6ÑKÚ÷Ùsi.Å©ÓòÐÙÜ«ç·áO¿d>h7”|ó›²éCgżyèufá"Õå-_•å“g],ŒóÏQm~cìŠÖûqsÞöâiÿ;å‚·ã§K22ܾ:ó[Ѽ.óþˆË“Þòì·\8Óåi›^ý«˜ñE¥iq}ì.Ú·ÿµàÄË’µywFP¥ºô:sº;áûòýÏ–Ùõþ‹ùOÆq\»™®—ÇsÖ2ð‘EãÜ»e+_½ ÷uë¸i";¨pŽÍå_»d^ ”ºôǽ\ËËÝF^©~F]¹ÿ§ç«D§R—dÚå\Ëš´ãQìh÷„l\9®|쾯.Xª¨ýD X>lpfI‡“7çûöÍ`0<´’Ü ‚Ú7ÐïÒˆm?ÙÏÁºÙ¨{c³¥‚Dƒ®qšJRp¬hlèÕÞqjÇ8dºx_ÄALÄÕÆÔzàeÔŽ lcm"½±Ùˆóa·8$‘ÍÝd3Õ>rØy pš«OËz_þÏÞµ´Øýñy©ôt%©¶ˆÊ²voÑ}‰ݤP¶¶ˆu[Kˆä–ÉuIHÖŠ")JÉ;]x•J庉’Pâ·++Rñ¾¿Î­íyÎ9Ï9ßÛùží|>,1 ½Ž²Ïsap…†À°: ò»§k=œã°"Rúê€è@`:R[çÛÓ5|±¹°ž”÷#|¸ªþR–ƱóJ•‡s×ÅÊÙéD&±Ü/ßeqß°5iù,(»©¯ÓlâA&ãYÒ䂇ý¢2±ÆÁúV&gVß×$<”ˆBö*on_Õ¨ëúT¤mxX‹~J‹f}{Ž «Ý—"hq:ù‘„ ÙGfðd2ˆ…Kæt° Â9Q¶È‡@vuqC h6?Ðr•õÔã‘ä6—Jr›Or¡öLDÑCU7ðÒa0@ÝÞ¢"ÆT»GF4+7Ò€4)$oEK¥l@"…÷Ö„J![³:¬Æl@Þìÿ®X°‚ Èõ— „:¶+8b·‰±ê: *ÕíO¦®K°&³g¬çëœÕ‹z=° ˹Ã"u‰Á=]âòýúÄ èÓ7 ÅFÔ䨓~/˾;­,ŸíîM¥ø8³qˆ£Èƒ®¨°þ(ªßš ëÆ0–Çù›4‹5Ä^˜«Z&>i¤Ç›?ßü7M"˳š°B•IJî´q-Æ“Ê!â‘éPx†%hOÜ DÊ€M³ÛDAÜ©ö¡º£ws`lÙÐ ¸<Z0ć[þM¢A¨ê[“¨GÅ• —ÿ·›£âˆí­  n×95y7pœÜ€Iê[bÞÃóð‡„øï ©ªoÖE@½‹æw Åì[¡ Q(l6çß$ËWs¸r¿³²è?³ ÷€…>91o¡++± ØP}‹­§Õ2ŃÊÊ;X>ÔˆÊ;J?DKeÏ~-•ÝœXio½áùeeÌ]m|±!+’3{åö{”Œ=.ÎSr·ÎFØOËB‹³ÓÅ#s’£g¿ŒnNƬ}Ylÿ&‘ÁØ"óæûé§A>š>ßv» ë—qR~`”»Í¹ŠkñÝcNlžÛd¯IÃó êÀ—å#?MèÆRô3KÉÿeÇ7ÔE=NÝï!ëè&™~1fR¾¤Ü6;èW=ëß0‰”?Ž”óõh)oݵœÆ÷¯ 0ùá\s7cÇD]åÁ¡gsÆsî$¬çöM¤>vg'ãaÈn{HDŠ®î"Oö;{¯ÿÇ2Ÿt1¾nä'F<ØV|âß&0ß]8P~¾_bäS‚] Jwˆ§8jaEb£8‘ØÑO•Ò÷7{ßû2€“­öp‘ ÕÕ‡ÕôPQý ¨ì|€KQ=n³R’oÓ‘ÿ^ìdg’½ÆNNÖ$ÐÜ„ÍAÉ)€*‹ÈÉz‡’)‹«tÿêÔwÞýDzÿ}‘uïÞ—=(2[Åz÷»ÜŸ%ðݧ÷/;NÌÀ:Nd'3Žï<‘]‘ŸÝ˜ûï9Ôù{šÁ!w¬= ¨_ u7ÛŸ‹tW·~ ”·1œ“ "­b× ôÁaUüýÉA%íÆO«îêÂsy¨Yy+íñð%5þØ|ä‹ñu M|Rª­•—èýZ òUý ¯H@zg|èPŠØPŠèO(µîJ_Bé/ ùV­WXí]XÿÅàÚ‡ê ‡Ø?;Ä*qñÿ_ˆeI|õfcÆÿ›‚+²Áuˆ™›æÂw:ÁB‰0í^;ù–°Y°ýÁekÖfk.ý)]ñˆÀù_.þ'|øüï”®çuþùóÎóIéjÿ¤?@þ<û–ÿ”®öý­üßH4R…Fã¿aé.ÿ¯‹[þo ~ û—]~ÿ÷«üá¬íaü‡¡(´6 Gáµ1x$áŒpa+^"b‰.øßý|ÃepËOÙ?°Ùå{öA¢ºÛ?šõ2lÿCPzÂÿÅ@‰XtÛ_0€µu ( ƒè  €1‚¼ž«<¨Þ¾xOJH6û,«ŠÍ>˯†€‰h(›Rpý×[‘H6/*¡bó¢òo…C‰ˆ. JüB} BÂQìGB!à]IG»wD[nM4LÓÆ‚0h„¥ƒüº}3ì‚Ðp4†bÕBb!0´Àh\{ô¡º’½*a9ã тã²* vEuu#ñXdÑ”±ÜIA¡á‚•{D^F£ÂÀY÷êô‰½ü3ößì_véÛþaæ›øÆ ãÿIùÿWd§ðþï±cײ^4¿âÿ~ú.ðÍõI¡®ÀJùÀ7ÞGGæ?•¼[öàÊ?®ó¼®-m<ë^hãÓxgWSÆþÔ¦)§+è‘2~ñص }··&Z «5ÕN]“qÜ$y`¤áÖ«éæ!s„ Þ’Á÷çl›}©ñQÎÝѳÓH µ†¢„ÑÄÁ~1Nt¼Ôn±b&ªj-•d»¯< §²àâ+¸·ãhq/Ûh—´Ý5FÆIÛ ‹v‡U˜lS?ï´4-ÆXÀa#ìu”Eq·Ñó°k•a¹ÄÔ ™â^±-Äãs÷,ß‘ae°Žì~þž)MB¨UÆ]Ôù)í×~auŒm“,sñ2` H,b˱6×¥chn)Òs¼Öê Õ«ÔžldéGÓJÜvBÖe¾/ÍÍ”+]ع¹üu[`ý´‚32:ð1¤Å EŸ|ŒhjJÑ‘€1MM!:°ÛfYšÐ.ÙšLÝu±B¢:áPåÊŒ)/7ÎQÂÅgg$§¬—kššT³P‰IrûØtÒ®Ð?m iÊ)øó‘ôœ÷ÇZ– å&)&&M9J”ðpI¬Z¶ hÌK•*a_i—WvXO¿åœÕÇaèc¦‡ û£Ø»[§û3œbÁm-&ûªoÉ:(Ûyä ¶SSòl¾bðQ±Œ‚T‰kÀéš™ïæG^ô}51Yê‡ðCM¶­Íô»9ˬ1úauáÛÖ½ˆ\ÀÃ%éÓ+#¦„ܘ¹ªŽU{’è£oµ»´å.gˆoô5£´ÈnL×1š<ͽÃX-ÁÂV ™òh¿Sx²G%±Óåòù™o;'Vf5½©<˜ÿ49ç¢ÉïwòuüÁ¥` ŽºÝšVPT“Yi!Q$:¥Ý3´Oôà–½Þ”Kþ© J —NÓ÷lÊ·âÈ¿ã·5]“\¹®SÔ͸©.5óñ8=¿Î1É7—gm áíizc¥Lqõq7ìÞxKo¢…¹ˆmP›2-éÂÂÍx”°å’d‰£ñ»×?ן€ces,&= +µ£¼ìÓ¦2h ;;ËZ–VHŒ†Ñf¬V%OdÐìKâ6Uׯ½ RLÆHÑü£L¦lªN™ÅÔ1ô½(t†jIî\qÕg2O¦n?ÙzâöªÈƉ«„ªŸ*em£âæÌŽ×Ç!C¦D[g}j)”.y–af«H›áêɵô'ZJX9‚Q®Î¼•bîspuãzBØÈðãïî߇m÷I•®°æY‚°WÀ?Q¤$5B]ùØõêk,‘(˜¬ßâLÏ[ÐØ]ËËik@³ §ÛC$$ÁàOO –¹ÌUI¶Q vÕº?Àé%ùªoS_Qqaë‰"5÷7ê‹<—HФ%FŽCÑKL曫x0\¼/ù/ÕÕk[*s[dOl¾xòRBž­ˆÔËð©€H\£©’ïbÛÌIj@¡”&a¢Aòj‹š•ñPîPQ{:c,-(W1^ëúÌ®„åÉè K!Ë·uµíSûÏÈ”ûì4§ìÌÏ€Åä¦_ϦÅÛÏÛšÌH¨·Òü·i>?Z+=jQ¬‘­ðYŸ3•Au’–×ôì‹:©ä 8PvMç³YhÁ¾:›–ùñ/î®\•œ5鿤&¨¤«t .;'Éû ºéµ&«g.ó®5جê—h.ÑÜ<Ùü®‰£NKÎÆTCb®rþ9µ8!F …†”–y°¶jÿ9lhRG ø¹ƒÔ&ÿÚxˆÊbûšpЬ“üvòÎòQ²$’AÝðÁ39ì ¼‘Uˆ2þ•“”Òí8Ôq„.aù”}“æºÖ›˜GÎÞÍ:ûD`v+„Ë<œ:¡Ô"ý&˜drûÊâ|üêú£Çe P-ÒÅc&Ð.:Œk0 É1û”[*O Kk‰û—„$W«›º øüÆ7Õ Âé Ÿ?øÑÍç…è•¥Vt8»¹®+޹YuzÖªïyyme9üà™G¥hŠ);ÎI”àŸ±$~NìHÕ:‹&,à ÌÄ@˲¬™Á’ô1²yhàÃUšDÔ !á'm3ME,OxŠÄÀðñiÍðj ŒÖ²ãúµÛ´Z\~—ß¶ÁO©xÔhÜ»(±jÉ©§j¦“!´Ó#eñí Ò1'¡h8à<3Ø^Æ,79B©óÉ´Záâ…*hðé¾r@t\xЖ «·glÍL`+½´“fQÕî8 Ñ#UGÈ·h¤žWÉ,îJ,6 ½Süèµ^›Ã^%ó¥ù¾ k¶+»E¤í_ÒbøÏ; ½cŒÏQh»†Ñcfæ: ­,»+û´zÃÄKI3f-l ¼óÞl„×|„r^³ŽR"u@î…×›÷K:^‹½Xt/LQ¥´+jÑ;ùí3S“ï¤Ý\œîU­Z!CCÖàÉr€¢beÊô‚€¤ÒÛÚÇnÂï, mÚûº˜Äd= *t¬ƒúäàt¹³ ̺zÓa㘋-_ütÙÚÆ2òébe“ª¼&…¾Ön6ŒÑ{kÜTd v–68Jçל˜l{` {îÃû›¯-šî¾ÏišÕ £%ê5ß›îr Ü)±=ÿXò W‹Ig߉„‹\PR–oÀç ÆÀ°çÆ€\:âf;5ä¤C¨U½^•¹h‰ÌÙx 2)è ['øé¡é#”ω*Ÿ!Y+.x¬¾7M_¬ƒ¹_>C¼Y(Bˆ"5¾ní/ŸAkÝ¥ S¨*É%[$#²½ª>… IÌ‚eÀÁ‚ì>æíߨö—›“ÑQʯîê)G¸Ÿ6RµÐ”Iò‘gj/ý¼ìxÁS»' HéÌD`îÂsAá«ðל4/øºŽº²,ÖH6öêÁΓmð* Z6FÝ¡þÊ£$ÜÔ<'2ÞO¶|®± §Îœ‹Ѷ[gЪÿWôÊFéä$&1/ó/؇Y"÷Ø3`ç°I™ÀÍzGèL–ߎÊ]7¤ï±Š mâB«-3Þä†Ä·¿€p·Ìµèm‰b\CŸBÄ ¯¬ex¾NŒ/·WZá_¸Íjš±BTÇrãÖ˜ÇXÄ•5ŸË[Å=}5̃Ž2ù:ͬ%S'<™/p}¹E¼°%Ê¥nÓÆx€dp2¤Å0ðAë†\븽÷âV§Ç¦S5$‰sl¡ B¦o2_hc*G4Wì[Ù&gâtÉë³Ø¹ºœ„çÇA×ÎÖ`^ITÌ©të'¬ªoOWÚ~ÚsvŒ(#Èæ¶‘¸Bµ/–2|([tÀªÖðÙë‘¿,-ÞDO‘³&ûâüÔ¤o+3‚Ÿ/¡oÖ¿·°Ãò¬yºùœäÿçÅšš=|IŒäpp3p(2¯àa´úß”ÌX,δòêG"Q^rbU!Uœ /œ3ÆõS(Ær­†iöÖåôPÇ!)dMQÕý‹ý FNÏK¡ªn0±ññS¯†Xuf”—šÅm)ˆõ¿õ BË;däBRÎiÈÐçiä‘NË´äB+ÐlÊAþ['³š÷Kkª ¸lZH3JZ¼jçh¯æñ±ZÇÕÈ;'±"0´æºË/5îm­ºMæv¸240«9ú”U[àŠ+‘á*…ˆwã¤v¤ìÏaĽñüîí{ZŸàFàùÅ @âÞÉÈÀºÐ•Ýìe>’qÖï*¶YÆ£âcstªt4`&òâSËÆM™Så.<ÈD!n.[ìœC{ó¶¼^“ú1|ÜYÂQ%!\±ãfB$ÄP2÷™ï1Ž™qbôýÝ*E¯tád)³&ÒÛÞô?öŽ®‰ëí®¢V¬»ޏY—B ÈÅj%f$šeDÜàŠ{k­V+.jݳ­³g­ÖZ÷¿Ö=ꪣú7Bra…Šg°÷ýpwï½ï}ë}o}ßž›?ûX^­ª•×xüoV[㟿TË[²¨òÖ?å+ÿ¹ìQžÿâŒnݺ…mŸRgœgŸë¾ j8»xÛY‹µÑ/w*AW¿jÚe“dÝõ ¯˜Ùuëo=|{~ʹ¼†úØQ_øâ³DkÜ®‘5óª žÞDyY|l\Mÿy·5õüøêkï]$Á—0§mú•š´ê߇å7ì²ê\ÕôÆŠÕZLmƺ“÷¼mó¯Œ zmû¨Œiw:x *îüEïmM .ðoz&z;FQya—![¥ <;A‘ìÇÕxÎo¹`MÎ}©OÃäuç³`áú¹onµ]î—·éš ý¸Éå{›D3óŽ>M]°¥^Î_bV¾i»;m"¯gάþÂ; s¼±"Gr"®VåE~GúŽöÉoí»š‡=ðÜøûÓšó÷-š±|šæÕôÈVü^Ÿ{ΞÒ_"¾´gþrŸçûe_/II¶6çî ?~ã,ë&«µ¤gÒ”þ³8³ÒÕsVšãÛÇ{l§ÕÓ¯ºpë̬•ó£|Û0Íˤ‰s«Æ÷é¿rÎâU-oŸ9_÷WoßTŸo}Ÿö»gma]Ù+ñ:·'3x’§9Ö$†{6ÚõM|ÂWëÏ@É3¢oÃÿü{ÀøØ“†˜sÏÆÄ‡K/}©¨%Òaס¨îÖï$ì}¯ëZF‡ƒ#s¯GËöyŽêÎhpïU»×´]­QÖ©Þjé¡Ì7aV¥øƒë–‡ŒÝxmÖ0õ¯Kt¾¾Š%uªÇGo;ý™nW^˜4¡þ|ħÍ?«.þ$ü¡g’4/5ÖŸ±òÂ'ª¡¹+žË’óRÌí›Ô?u8ôã• Ç„ISòã"’¾ãØñD:ü™}’Û¯kLV¿LkT‡9ùÝy"MŒS_³OÊL®ýläÎÉs.íìkÝÐQ±Å«ý“•ù+µó]ÊXÞIK­±_þ ›ÒtóòOI9šÑyÈíY6{”OGûu¼³6ˆ—-Íbdt?Þq°ÈÐò5ìy;=Gõ†svtI¼¯ð°oƒ¯[²=gçV›Ë}2'sʬÞ5rº Hdò×=õNÝÏñ ŸP/vÞÒǘWÎ}aÇœ-aÌ\u£Þ ŒÝ;/´ý_ö÷ƒ6±\¹þâê-ÅóOV_:oh|ñÔ¶»ÂÞUn=ÿ¥ù ì-^—ÎÞ¸ OðˆT¯Nêæ/î_|ÄXÁ›öçò¹¢*ïE§žøõÎÏ?ø4sÑQqÎäMž9Ÿ`ÍL_}qoÊÈ&S'Î|x_›³ƒ{zgJ½Š UB&Í ¯!9z¶ÏbñÍ'ǎɼ¸;s‰ä£NÛœ_бJýÊmÎ?!ÎK™sàÈÿ¶Ý ïüÛþ¿î<9³Â8xð‹?®÷ËÃO2ª,uPöûÚIUôó+oÿr‰©õ’êÏUa_¹sÿâ›;5%2k{¸ ú¹®ý¯6ÊþûÜsëÖpï{2>kðè÷ǼrÛ­¹Réõ¦WïUžzJ µó]8í|j%–‚¿¾)ãVƒ¸v£xá¬ö¬ßÇ ðvõïì/ò^†Z‡íŠ;l>Ñ}øoâú vÏÜøÓìêþ‹D'k(6ÝÿãZ® |½æ­¬¯¤nÙÞ3EôÓ ¸ÊêA©KNtÊȆ.îVn¯»uÕž“+qNİžgu]QïŒÚâ±cºðœÿ‘ÎWêŸýÂËúÓóѹµjVbí9¦ÉËXè}õö/«G¥ìÓt–dÇwéþéÅë6wÿI|ñE§SõßÎk4oŸ ¯7ß{}Óôj³s‚=TY¿;f-+c†aùFX%ý³kó& 挰,¼ÿÑo+ÚEq[ÇÈÛ®:ŸÓx0GèùGî\ÑÞÜ#ѶóBêHjE=ÚúãÕ«Ã÷`Y=¸£šYsfóæt¨j:U»Þëzœž®fž‰âv™ÞÄ<Ì{BÓíµ?ßÀcÄÕè•3²:ô˜¦‰–Y9¹fEÈ©Îs49ð*Í+Ç'rѾ©µ>kæ1=»êÊÃððø¯»Ôí¿=aØýŽI½jçÏ’t>×nÈþÁò]ù_tŒ¨¹wÙ…™{Öw{æ1nèÕ¤›'ã6l’º(jʉ¿.ý¶<Ô¯šµíÅ!c³k4ºwiíÌ©b¾îúi`kÅÓ,³‡JJìØ¬kxTØÖ¾‹ßÜ_•ýÇ÷â=³{ÄMó>{üXˆLÝùÒì¤Ú»-[òÝaë°)Û>ìßçæOµ×ŒÜܧWàêÉ—6wlÄÿç¯eùw:Ìãy-©Ï›—­hý,/>'î~Ûnƒw&Èßð—49þ¨ðäó†©[×ÕXz³ö®ã­º~1éBÖ Ý}–,¿½uDnå ¨U¿3¹·;áÝõRœÉ°ŽËçÊΗ‰zÝ žÔgô cÓô1=O¦x¬Ù­q^»Ná+«~zE]{ú’•^Ñó}ë*6~ͨm†f¯?áYo·_íéwˆ­‡|ê*µn¾¼jÓ˯«•7}û"”y,%cGÌìÖ·ÏõÉûªfåß=äSO110<çãä}?gå_94¨‹ç¶![¼ëç܉](äø¯‚$¥uöŒ 1Á°õëU“>ñ>t¯áw­Ú\Øvw-'ïÖÓm§—·j“·frb½†Š­?vçy~Дú+Ãú,9âyûÜýè3ƒxv:Á?4:ÿ^ìô• šÖk©hÏŽ“ÿú鬈!“j0æ\oºy¬Ïº§_ ó•†û~×¼n^— ‡ÆäÆ€ùrÿ3jhßÒö]ð|Ò/n¼åΧuó–Â-®DŒÍí3$jÒ­ÓË?µjޝê?«Nü~PgÇI?†ÍJ>ÅßãÓ¡êá>›n]Ì~v­‰çÞîL¬V_ç½HжÎUußÖUÿ¼}ž?~ÀÆ” £¡1ÖóXñ)}›oȘð¤a+åÌù‹…©xóŸŽ9Õª—rÓÜ¿Ï/Oúí¸Ax(LòÇgoßüëÔ«k‡„I­sº1Ö¥ñÓ:N\šu¢­×ß ÏÝ{UUÒô@¿ø–šJT­š5Õ²†‹~¾-T7ˆ©¹ÚPÇtî©÷ž–ƒÆÆˆÏ5eœm²à¼µÃo-òúöÝøü–i»äå„wŸåjýz¶dør×sa«¨æÝÌ‹¬â5×D&6yp»ÁŸ!þµ%Ù‹«í;°ûÞ5Gewë<ª¡Õ‡æƒ o?¼ÐbþБbÉ‚ž'ª=Á·Û·½_yjÉ¥§'X}ûXsæwöÛÕ¶Ó÷cGüÊšåäûß:z=1¡Á\¤?cäœà-+r_e}l˜ÕTÍÖMÒõj¿êÉ8žö/CePksˆ;=xýîêYÖw/|$ZU«~Æ öi£:n¿—5¶.k³~¨5w[—Ƶ05±xõœžõëÝÁ!§× ã­g¦® ¨ÞÔyzANÏ]¯?˜á-ù½ýÇç«Ø&z3Ú;çþwÝ~ouzÔ”‹ç/hÝZøÄ[üÅÆ {C|òæÆùä tôðaÿ À¯Ía}÷Pkþî–KîÇŸí™XÏ<«N˯ç¬o9)öJ[Nf ¯×SïÖŽÕ^ô·ÆëÚÛÌ}6Xzi/Ô=`î…ÉÚ~ìê½j<ô‹xõëäõÛÎÄ^ЄDüæo½ýòŸ]÷wÜkt¨Òä+G¸§#z©ÑEμ2©ù¯Ý³½®öѤΖ§/µhº­wƒÚÕÖsöœU¦Î}<=³¥O¿ZñOgîçhºÄÇY_†Ÿâ&7ëp¼aÎñ[Ç^ðêÆx:!þ¦G¼®õ™¿ôñ½­©Æ`þPZ—÷~¼Œ# ;6÷ˆç¯—ÇFöÖ %›6ZžûU˜4jýæ 9÷<ë†çW¶ŽU4>Ðg¤Úg`åœsŒ~A'nTË[ÐÁ8´ðöŠ'çïO|òù£ÿ>U×zÖ,  ß”à{ÍÐâa¼Ðe[Í߈ݦNXð°¹U1ë…¢zS[GôRüÄÚ{†w˜0½×gÊÞúmb†÷j¸"Ë'V^]î×ÊgÊÏõÛ´ö›QmXïÉY> ;¯u~Zw‚ÒXíà'׿g¬ñ®#ù‰±Ú×<­Æ†*c†'ñFÛuýä…Ÿ†ß³ž°™uÙ¦¿.üþ$äÜ¥N½[H®OœúJy$\Ñ/!?æË¾ÖM¬…Í­¡{'4¾|iþÙnw¼&Šú9eÜ¥GëVS²FŽV›ìýªòç›V™åûhÛÞHØ»êúU9U›àu†Óù/YO£û)._iz2¦&KcÜÿÙêÄQÆÝ|¶QZCñùú± /WÚohØ«¿Öþ\ ýÔqdœuÕÕ£/<–=hýzÁØZͬª?¨2„/~ÑlÕ.ñ²”qšE>Õ¿óàësµ[ÀŒiY=ã+±Ö%+×í»8âÛ3ò³žàͯ[Gž”T]¿¦RJßµûÎ4¿óÏÜÁ-ŸÞ™,µ¶idÌz™79«§ +jôZÜÛ#oî”ÅÀ“Û© Ïz~²´çõ ó%•½C& Pö{œõ묿5¯nrOü=ùÖÁ.wFÖÉûø€ý¿×ÿ¼™\¥_ÆÙËÕסûÍ¥5£ÁE ŸÿNuŸóß\úü/@â¿íüÇïÀ4ÿ)2ÿ9îÃÍ*€Ì®ûð¦ùOùÏsþóiþSdþÃîÃúþ%@â?OîüÇýÍJ€¬ÿ|7à?¡ÿBšÿTYÿnÀBÿiþSdý¸ÿ‰øtüJ€¬ÿJ7à?ÿ…J ë¿Ð øOÇ¡Èüw£ø?ôú/%@¶ÿnÿ‹ÖJ€Ì7ŠÿDë?%@¶ÿï5þÙþÓû?”YÿÝhÿŸæ?%@â¿ÈöÿiþSdþ»Ñþ?½ÿK ùïFûÿôþ/%@æ¿íÿÓû”™ÿn´ÿOïÿPdþ»Ïþ/½ÿC ø»ÑùZÿ)2ÿÝgÿŸÞÿ£ÈößöÿéõJ€¬ÿn´ÿOóŸ ë¿íÿÓû?”™ÿn´ÿO¯ÿRdûïFûÿ´þSdþ»Ñþ?­ÿ”Ùþ»Ñþ?½ÿC õßöÿiþS$þ¸Ñþ?ÍJÀ™ÿÅ%ƒŽCt~:D§DÀrÌ”¥ ”ÁÅçá°Fù/àóØ0jøÙ\|ÿ‡Îÿòî!È[&ý¼G8!‰†z$…FG†A ?+™ÆbI¤üìÏæ@R“\oÖ ™¼åZ+<M%oB“Ç‹ƒtˆE¡é¥ýéšÁ Tx½ÅOšiDÿ-˜&b¤®“R-7™K°Ælð‰ø~´N‹Æ¢EĤ<ÖP &}P´ÆŒ&PǾ@“‚ëû“st‰ª•f32!Ú`–UÛ¬F ²<ˆæÑ°äÓæD*jo??Èžh[‘ Iðêˆ,Ö~~h‚vÍ@[‚ðXÎl†CÊpâ %\£'òjÇ€ñtÜ=äi–{(Triµ`cRª3‰*ÂÐOñ:"l¯\ªH®×ÐõªÂá4u¡,;Q¾+ø¹¬ÅÓõJTzÌ…QÀ¹kv©š4­A!ׯ£,uým5$ Z”.vƘñLí€Ó¨€sÄEÛC²D‚Ϥhf{ðÍa¯4èŒZÄ‚@Zð2¤B„ñÄ2´—bÍÂ%,É 8ýÅ› ¡ÉºÒU}$×jÁojĤAåÙf¿ƒŒâ ‹\*YL6dÀ{[ Ï•ø­ql-ç›@Ú• ÅÌ'QaÔ$-áàÃL)ÔN®3v²¥cBø[•ÉöBeê]U>Ø”D1{+Jƒ C½jL–t¹¶O {€¿gYLÿ’^J–Š'(Œ!è*A(›!–P;‘É¥n—R)¹¿ìõ¾e\•>èWºÎˆõÊñÃhCÎdxÛ€’üG˜À‡cÉ{È-jªøMôU£&R^]uU `†¸bID»³˜´1 BÛuàG o°‰WfôçÄÀà¯X z 0z¡>™\è‚&¨#ãI\h°Hz¸…ªâHU¢Å†² ­(¥vTäÜÑ2˜ÄŠØ_ á‘æ®¦ô ÍUWtÙzª“)òÊP GÆŠ"­5š D @J;ÎC;®BR? ~—&ÖxŸ‰LÁFbt§L¸©ï.í®F%3®¸³0ÖY³,·Z·§.i/í­>]÷a(®K]ƤÙàì~Ð]æ`]N·Ó-2 ánVü®»8-ÁeÜ„(]íõ;˜]PoÆ8D§ &0ÝÛ’•ÚY‚ÃøSÅî««Bñ×l›j(bí’5ã¢]ÿp̘K}Ƽ’ tyWfÐk3ÿ;=—³‹E´Ò˜@h?ä ì€ã³IerXoÂW¢ æi.­P´W4¹þ7ÃVè@y)„Y›B´t™ŒåiÞõº»Hëïù°µ;——íÞëê~éûå@â™})\ á3gâE¨Á •Bt•ˆx"EYBÓSS ‹bµÌý‰é’1CW,>Ù*ÓÒ_¹šq|qŒ Q¾ùư#ú_ïî–ˆî¨B¾¾Ô- RÝgÝtF}ðHU…^-µ£<´£vÿ»ÂvÔÕaô7Ñq« ×åâ7¼œÞ¨Û^¥Ê Ÿ!.Øïª¨2â’¥CçðâüÖ ¿¡çª–C›7ú_z®l~”;Œ{à_ì„PÚ™5ƒ‘`=ç¦RwÎ agê‚r­&M™4ijK'ðÚ¬“kµbû:ƒŠCŒ&ˆ+€8p / -‚¸l;E:á)2ñX ×xWÑ£„,VFF†¿í\ŸÁ”ÆÂŽs½ôÒèÒ ³Ié|ШOc@r­%˜A0Iñ &ë¸PÚ¦òNx'qT,ƒŽQÊ:JñÃ>¾TCzŽé’m‰£`!ª³# ¸\ÑpLÅÄl1¥+…÷‡0νsÎpËÀ™âgO¸ÅðhШ¨e µRø³rfI"bЪQ+DSxedJ’^ëÀžû°…‡³ǯœ“¤7¿;ÖØH¦0(610C,5e¾#aŽ4ãƒ+J1Èh0›5`ØC«}dEÛÇdAç—AГQgÀÑüðÝGÎA? Ð{ö§ nª  ¬|![ ûpF@pæš wÅ÷gƒ„˜ zW-N¤IµÓ ½%^´1¾cD=9E`&§F”ýß-±zqJBø0èH>QÉä+jš`;½…X,&"Ý‚P4G0²Ë`st2S†ƒÁe ƒƒ›#1£Ã?’Y(e7qÎ:ÃfoÊ‹Õjƒ‹b€ÆS@ÛdÙgÇ…ì±] &ç&´#8…í“f -ÀT ö0Ì;”&bÜö(i"ŽO€Õ¸À8M(!‰A™®Cô¹½®bGQ8^ @¶1Fä4Æ`HáÓèâIÑ_æÒÜ"æÒ؆6úúƒñ  ü1ú¯»äy¹ã6*QСrÛ¯M¨L!GÈ¡*”çÅWMªÓÇAÄŠ+‚2†C.Gà'þwâmvp¡é‚†È_ÙN?Ûâtرp–x;› ØÂ/¼œBf“#÷m»ïäcï1ù/lxqµPi±`'r¥E¤`dI7éÍA,ºf†>W‰ÍéJ%b¦U…ê¬J[rŸŠS ¸ ä0©°©ü_S!|èJT‘·×­bf©eR0‹) &(U®5#o©f²©Y¡‰ªð?¨gvçžV4·U´RfbïpDÞ£ø±*Go;gA£†ad†2äf(­`³1ÕdÐa¾oªA«5d î)¶Û”®Å6:KòØ]Þç)¥KÅÔ£4ÉU€¸Ç¡T¾gE|˜>+øŽ|þÃ}ò¿Ñù¿¨2ÿÝ(ÿÿ… ñŸïùßøtþ ÌwÈÿƧóPdûïFùßhþSdýw‡üo|:ÿ …@Ö7ÊÿFóŸ ë¿;äÿâÓù_(²þ»Qþ?šÿ”YÿÝ!ÿ¡ÿôýOJ€¬ÿn”ÿæ?%@ÖwÈÿFè?}ÿ— ñ_àFëôüŸ óßÖÿèù%@æ¿­ÿÐþ?%@æ¿Íÿiÿ óÿ=ÏÿB6Ìæ`üçÐöŸpæ¿ÉÉÌL¦Äƒ¥Éd*YiB,ˆL¤þw±@P—ÿƒÍØãð„à=—ƒÿtüw'þ*™¨`ÚäÒ&–þj ø@Ç¡c¼ŸX eL,I,‚ã$²´"fˆÀ;åh+ •Aj¹^Ä8-½ðäQRæX4 ¤¢Ø€˜’¤Š‹Šiûí¿Ã:×# H7X:a±lýÕø/¶³Á(îE~]Bø,Gå0™T¦BYm¤7¡Q/±¨%oÝ,Û©YW‹kZi ¼Ztóøñ~¢qbD€°é•™PšInTc,/^|ÑD½J`1“¸ÐÑU„¥ J®e2´ÛøñV‡H+`(ÓÉ€µÅ7-GbѯAà1qG ”²èåâ3† D4 Kq‚Bfµ5¿&DiA‡ €.`Ìå39“Ïã290·¥¢jbXŠâ\I-pa.“ˆ™<¡€Éå±Klˆ¤ˆíÐ:TÈd ,&})ÍðE&‡ÀòLàê”ØŒüqA"£\) ™|SÈe3Eü«!ç8T¯5¤•R·PÄÇÀ¥"hÄæÚž—TmÌGQægŒ3¶ûèéx\YÌjC†ÊPk”jü <°–h…ÚLôÚ °â¶ßlºŽ¬G¿,Q‘TÀtrJU$ ºÿ^›ÐÂo¡P¶âÅ ? dô Ní§<¦ ƒyp©âïH)”´jVZ3€ÕàÌ (–ÙÎ1¦Nö¢(Ö­r7d1`—&ˆô¨%FãOÈEѧ0祼o’ã~B9ßí.O¿¡Ü.ù8Df¼5ôò‹ÄÉ72;^ý/{gŠvlÊý^yñ÷Š»ù’nQƒÙéâS4˜³AɈe0¢µ…›Ã1s­Å¨ï3°×]°Y³?®‹ ¿iˆ¿Ì´Ä¥}a @9\®*¹Ï@Q@h2vlN)Å$ÀŸ'—Ao9”Á£ÉÆzA p‰ ¡lÄÌ‹Ú`D¹ÒX  V )t(HM×2!ð%”)ˆK’B!±ŸCÉ! !±ÒÏ;/9Á[d ‚ףѵPm†Ü&×–LÔVÅ„'„E€ïCB#£#¥Ÿ££[×Hilxb"Ô5. z„$H#Ã’¢CÀ„=¡G\b¸?$µ8,| y`Ä!­Œ6fÐF:ð=M@üB%ø­,Û+(A0t ÆLÛE3›Äª0¬±×qÀèi'ˆíè¶–¨ ‹Ø€˜tfÿr¾& äpéû`å Îë…ìIˆ^æåôGRhÇ2´QòúpÀ…°=þ/ÿøáèþ?½þ÷î¡â¬ÿqWðå$z…^á£n…¯{HIlmŒÁà:T¢>‡õì´D\ÂxbƒW n‡¥‚‹pëš-Â¥sx‹¢Î$†nt(Fïjôj½ð®²‡à5s ™ÛÆE,±ht!*xn/ôæ{¡TŽ/!_ ¦.å¿):ÙÛyËT?.“ƒÃ-šت©ãS" ؇M !0&èž-óž&Òh 3”L‚¶üÍŽ©Hñ*Ó{ Í»ÉåºqИɨa)Z†0ÊEªéÓuÙÁŒ˜QÍįO¸JÏ' |r‰t©J¦Eï1•¤ëŒ…,h´! g« ¼-KÑŠ ¥2<€!¶g‘­Ð]–>êöèéaµ@3x q7ÄRŠI´[ÃÿÜH€ÑM?Jr7l_9å%ý€ f”ˆSÀ¢¥Å>PÚÆHRBêt¹²œ^›ù R©F¸j‘DÎí mbKí¨È¹£eN+bhŒü®¦ôš«F¡˜ØG7ne}5ÚBLSÖ]>Ú]Jf.㸳0ÖY³,⸧,Î6–8p÷ï,TÜ!yüÜW.ÚW ‘½âöÓe/Œ]¢WCšÆ$ùY¨xŽ•ëŽé¿$‰ã²ØûY{× »Hiv‰"@£¤Ø¦û¯•¾®Ud žÙ—K¤î‘æ8Ô$žHÁD);àž~±ûÓe­~alº®ÌŽþ;Y7Ã]b&Dõú:%îa0¢ñÕn‰XÖF__ê¦T÷FwýP?*RõAO|ð|tvªÂvÔõq”e Qö×2´ˆ*ÍaÅ«ˆ•ÀÂË=ou™6"Œ4¹E^ä* Ð)$×ëe*ðÅpk‘§”EÒŠ¹>ZªZ#%æ¾Öÿ3¹V£"ìë~‡ã>åDsÎá%Í8>Pªì;SÂæZ»ƒûD@/ÿÜ ôYZœÎÿºQü/!ÿ ñ_èFñ¿èø”™ÿnÿ‹ŽÿD ùïFñ¿èøO”™ÿnÿ‹ŽÿI ùïFñŸiÿ óß}üÿ ñ_äFþ?íÿQdþ»‘ÿOû”™ÿïÕÿçÀ-„éü‚3ÿõöàVbÿ•B¸lm  .!þ'øÕÿFãr¹<.}ÿŸ ¨8÷ÿõD|,\.m)¬¡DüÄz <ˆ @‡x?ɉEpŽKÀR¥ªJ0®…—‘óÄ`æ n©&yú)8£ )â©-l•3·ø.ö#äAzÇe¼ã²¡ 4¦™­6P±Ñd@ÓÝL qkM* ]*$“ņ'Ë#cdÒȘð™4"!@\Ääpm¤š®ÀŒèÍ$ª¡ÝÓ¬Û˜ëÀi¯Pé â^ ©u.Ìk@ù&W$r“³D®Ø£>í­Ú(Ùþsn ü¿ÿ³÷qM|mÚ¡†Þ”Þ½„"‰´€t•ŽŠ "- M`(ÒEHED‘Ð¥Q)ÒyÑg÷yþ¾Ïî¾»ûþÖõƒ×‡L2sî3gæºçžsî™\Gõ{ü‡+þùÿ÷/Aœ¹©#Ïwod4ÄèZB Éy<%ÅÁš {—4âæÆ'ô¾íïïC ÜÜ­­­oݺÕÒÒ"((¨­­6==íäätPð ˆ<¸ßrðÌÏÒô85?îC]ô‰À¼Õ›&—'Ô2>½“î©8³yVã3MmHÒùwj7S2|./w˜ˆÎÍåá‹‹ÜŠÙr_)™!X_zËikg¼i#7ô,&˜&‰Ç£^Ÿb¹ýÁ,©}ŒžNÛBÑvû”΋ýo:ÓÖ¯©„™} ú?º°<þ¦œö R¬žÎœÛÐܤB¡À¶P›KÉÀ"‚ yªõÜ"Z…~<Û¨%Ž«O.J Ú^*š@¢Ä³È,ú#d̾:î/Å^‰øD¯%dkbt£‹%,™Ù,Ü/¼ÎEéC\Àƒ†gfÏ}$–åh1§–ÅÈY:ÕEv?Pòõ>ÍH>þ|•ÇxÆð-ð«˜õ•O‚k¤W¯/n˜6 $´û£fl/~î˜9–ãUôqç3¹£>~³ºªIlη¦?•ïtÏe^83S«8¨`Š2í›±%pä N÷M‹O,L÷…½Ì´ó[ÎLH˜p6mÞÒäTÒöÊ·ÒÁý’ˆ¼ÙQ;2°‘¹cмx¬(`¡È¢KÁY^§ùfWbCÝ¥ÓÅèY'ÔíoÒ\ib€¯l¾)€<Äo:רÜÌÿ]Yª)‰p­y=q¶-Ʋ£ÒÅùy´âFSp¥Ý’-ÓÓ,»¯~fYZ].Âøƒn§Ê›4ùFl¨ÛD–Aè–@ç°Òsr">éÑ+mÞ[Óöà+Óí ~äC#T±ÿlQ•Htp‡ „ÛQ«ç­‡¦Ûráˆ$¨æ±}eÿý]Zbf»èG*Õô¹;{§£$cëOƒU«ñ›Ý]½ 0‡@qš‘è3È£åiS~ÒïæáÇ;/“"dŸ,4-ÔaѼâ™Ð2™\…`p‰@W-“²©öPÃnèŧ ³ NãVäÊŠ¥°ÏƒA®T¯.jî$ȱðºÃ\*’J’-(Df,7¢».C¸¨âÚ|Z¦IdeÜSŸ€ÆÔÁ7CÈÔÙÛ€F@9%7¹ØÉat€l3^?ÔúZ´î”=Š­óØÒ]täʤ8b£‰|ãá›ôІ © Ò™•ãã­:ã¸W X%yéx07¬ žß¿›Qí^XB.dÎ,άÛó|˜!•^P (V-ž{Û蔋§†Z."cJ2W1gÊ¿oþ:¶·ä‚H.™±mMzWÔL:Û0Ûà^æ—wÚrõGIU¿zãíoÕøNVÞ3]?J}äÒƒœmEÝeš¹v´Þ(BBw> ZÓbˆß ®cÁ×7·Êó¯SSY>Òuýd1 2c˜¡Yè4§e¹õ¦ —žBˆÜOþÚ·„a‚g…°‚#)±LHØõÒ–r°óŠ‘.ô‘éPÍ7ÀNé…E+i‹ÇGi¡xxdz”­Ær;n™IXá ã¦kä–W{¤40=©þÀ\ä[èmÕÝH+ý«ª±·ê®‘YÞ,Rèb&ÏêºFMf™}z´AÎVå§Äø'‘"YAJ…F^ªãè.W‡êúf£ÖO‰™Lõ‡qoƒÚ¯o»™{"’2¹YpOE§?h·‹^ïáN¼wŠ~DÇËæÇ‹^cyP-‚.Aße~©¢í’ L\æYh >‰¿UØ ðKÙ¬÷ãÂ?QGÅøqÃߟ {-ûy7™<^—ÌÈ`=®-¹ÛÕjÖa êîô Õñµâ,Kux#îVR€ àÄy¶ÐöÏ-/üYJÀŒ”[Ii@=ùé…Ý¡ó…ä¾=e'r 'íýÊØšh RŽDž°Ë-ÐE¾ØHÇv;7½neÀ=¾ò…ðà›dc‰ª×Õ÷Û :ô2fâê6“/ëÉ ÷]2%™¿É©u¨Î:ªÐ˜4ØÔì{ýjwk4›Ã!òY?ÍÝÕ¯{#SñïÖ?¤ê…:פ.n„ µÜ܇JMWÍk¶n\×wU5‘&®öu”ÈL½öS²Ù\‹ôÚò óåèŸÿxñë×EédÛm-Œü¨˜´Ô/O†/>6¥66[ ¢'áVÜ3¥VüÃ\)Ã[a‚atEžz’–ØÏ™Ð>Tn]Å4þ¥\ÛlH q“Ž Îh?º•°R,L.oæ‡/È™p,Ø,(Á¢ÎN *¿ñn½ä¾vüJ~&*^NÝvÈ=8MÇ;ÆÑ†&&RVöqšr¤À“ÓQòyU@ÎxÐ8ûy=[¸òJ9`m¸¼uÏ¥ÒУ$èÊQ½óá|òv:ª™‘ˆ&šT€—¶i6´œ;úyÒ]>JÚ· ¬¾Í(îp¥¶‰&*E ôW5æ_D7Ä£¸Ê ÙÚw!çVü6;ù)h•4󼼥޸“sû檦AÊ£ gÆáU‰P¾‚žã†Sú"¢|ˆŒÒì%dz÷³[çÙ‰ÞA0²K²‡Š}ŒÞ]¨ñ,}‹GÂSe’¨C¥ÆÙŸ&ž´E>]S¦p`e¤ ݲ.ô7Í>OÙñ `ì (7<Ö 7a²‹’·5ñÄ0B‹èÚ:îZ>éÅ‚‘ÞQ¥/±ž{ˆ/ARx81»jÞ›õ.«$.v 4ÂK|iXs!bÒò+ø{Sþ+K§k½/‰)µ5gQ蹸GËþ_°•‰d@etœ]Ë­ÍÆ¥$I U+6Ó‡xaÇ@²— •5É“GËÚ^9»p8÷nÓä9QÐ=80Åòa¢ÎRrdÊ€æ ¤z8pBïqd+Fã|y®^6ŸD±ÉSA}@wu†ö®roM³ÓºTVëšuút•Ô+ÿq¶B,b ¶ø€êˆè@ÆUJI‹\4ÛÕCÂVñIö3Õ÷Ü (¶"†í»ÂŽ‰í€‹Ñ¨éqÅCiÏwÏWÀàÉ3j'SEëîén=¯çˆQÕ ³ôÑ ðâÀfFtêõsŽ«¢8Œ¬N‚h?Íðæ.Ýbq;«±1y†1'[Ök¯š@ÂóîçȯTðCl½jïFÂX8 ZÜsNñÞ»þÖ¨çÌd ÇuþKï/Ñën’Ç-é¹–7›m—I¦8ݲæ‚!j0‹ª" áÁª§Ö„xÇ›?Žülþ¡Šp]¾8š‹§‡sëóW™ˆ£#f÷+ F 3Q\˜GúÒÄ=’ Û!!Ù^Í}8:u²ÔÃÖÏÆÎ'Xʺ–ˆ5¥ÍèRzt¡®½,ˆšb¸ÙLêØü40µ3¡ÙSRLžH¨Ê]áèˆr­;r©úU¡éôAO+ÉfrZæÃ½Û7«x×?Óh–*Z¿kž×k ©E2¯òÌT;BlC£nDx%YʆÞï\Æð%S®6­~ìMZ°~§I ÞN_z$$¹Â“ew´ÕñÃÍæì˜dåœÓ}¤b¿±s-Њœ$«°e¡m¸ø±÷ÇZ½¡‡IyÓ=ˆËÝscžŸëØr¼s 0\U´§šÐ‹¬Uðç¤à¡Ž#·oƒ¦ÐÚ…Fº $x7ˆ††Í3ëÉ‹[¡‡Ñb«}Í‚§ Ú}^T´¬B 7î€;G[€õÆ)Ç ·˜"Œ7@ä™[ÀºBÒ5íai[[±ý]ʸÏ,×÷H´à#÷ÁÆ/kŒ%]w$u7òsc—H/BžÂG×Ën!”Õ¡¼¸)¬cÑ6ÑÀë ‰øx™±´È…5ô¶Ud¼F;F7ÿ 굉ïÞ£Byp\¨_±9Ó°Kõˮ㋑øˆ¤æÚ>OÑ©”;Ê7غ"é<$zdëŸ]/J–n5¡xZz‚Ë&ÌO³¿¦eL@Í÷l°çU­=y6y‚¥ZÀX²_[›S§óÙ¤/­hºúPý·ˆ´$QàØ+€…­ˆÓYn:È<̺] ÙÔ.Æ®Ý9sVÛœeU›2ÆÐ錹#„›$ê7x¿2iyŹ,8ë®ÂvŽ oqù™´ÇjÛwLQ9Ò¶½"o™ë΀õk¨REðÚ”O)À;‘%ekÒ$¢÷5b›–ÐÉ+>Ÿbݼ²ECàMI­‡^~öõÔã¯NWr,ó&†† +HÚù2A£p”K+Â«× Ü{ r=DO”ý†æO¦01Í6tb‰À®¯ÁdC 3p߆>—: "&óS²€]i+IoûI5LÜu]J’SMWTöÐ’ McµqµQÄ÷ò [Ð÷Ò| jÛ®bP("]fDmÛW ’E¤ûÓ¯6‰ð÷hdÌ]béNlɾ¯O9ô@ä§S¡s–ÞÈ“_‡ãênÛÜy !ÉŠÓú-½ Ñ5¯ä%#Õ8/(û-.5 _±«f%>[•°Ê¦¹ëN]JE3y#öÛ  äÇÍWI]5‰qˆÒ´pÒøSð"Zê¤ùŇŽ)Å$¼Î1 *ËHq*=æ\˜uÚ(˲RÌÊ· ˜¹mL“Z#½%?”Ó­¦NoYt“Œl0ß;Ü8)r¸Ó ¼#Ee*ï{Ÿ¡½€«‹ÒD7â<¨â«{+# b©*è¶a€‰hÙÍä Òsž†»ûØÚ´`Æßás¤ X#÷6è@E*+ù¡ìºdA…^pÛŸ¢B\¥ˆŒêÒw­^`…‰ÛoP‘nER˜rd#ÛÚš +~Šï&­FYD]^‘€¶ç6ο‹¸HM ó*É¢ÃL ÉØ TAƒ“äÂ)[‚–™C“˜Â£ÂF_pã)øV¡q/2Ùñô|ç¡qƒâ£¬øC|²Ð¸Mšû¼U5;F¶ò„ÆCµ— lçuõ8Á{ë¸`¯17ßœ•Åôˆ‡mSoÎJc†#Î üoÏJb&¡ë` )g^/ãX±VïF‡™%cOȾú<Üc‘XæˆÔä9#Xè0å~fO;Œ»h‹¡ÝQ{Š/ZÁ/ël±é‡`ò–&=å íñGïÅ0Ûê"3ú¢(rÇÓHW÷¯ï@ó±J¸|hðc†sÉqË-ðQÃLúã  1ª¨LõÑ*Ú~“Ãùc ª~dúSTH6é†9\¹™F×΄cX%£ d×,ÿ{?ÑlR~àÕ*šåªö·¹Àœ Í)B!‚Ô»ýAgÛ»¤Ã ¿#³Shèo®ˆS Î=y¥3,G~™TŸzÐ)åÉ¡›dbÛè³ ÏK:Ór³eÿA£ýúÖûr7–©*«K *Él`§wCóC§Þ™ï· ßÖ˜±˜îÌËN¡AŸD‘ç›4ÂxíúÛUç'@N]¾9‹º6Nù8™8³îeÊÜÑ«9¿fë}g1þYÞ‚ˆUµŸé)¤œeÝã…>*(wÓ´ßóH­0¯YUȪ4¥½„þQ ŽxÈ“B ~©±Ñ|¼µ^ÙòeO7 ¨u % ¾êç´Òè{—î’Ä¡P1ÎAô˜tøwˆœVô˜×¡wf½ ‹2Íú­+XuÄ+ÎÊ^Áre7u¼%>«VÀ"‚Ah}«È„vJ; g,õ¤£iDv:pó¼R„$4Ð{ÉÎ@,fÖ¶ýë@ªú -øzï’˜Ð.úØì›âº•'7l¢÷ÓÎÇíŽé §82WÀ£åˆüšó{÷ídɹU¯w—#¬jëì°‚ËM}”*ˆak9ùÎ×µÈû—µˆ©9(a?ƒè{©UÁÖMV¯ŽŒð_XÈL ^ÀJ]÷M3Ó¦ âýDNøÖþHb '+>‡~ë· fÝ¥ˆkSÔ]«¼ûÕøâ!éˆG×Ü|´;vY[üÖþ嚯;ÛnÛL M‹ûècã`¼!ØÙL¼ÊôTMÿå„îöÕ™©´ ð˜Ê^"x™?ù:G¥Z`úÈM¾[|µý;ýa“Gd+ ´=ŠÆ‚ë=£)bèo-aWÔmó>ô¿¿bV‘TG“èh;Íçê×n¶ÈSg7×\½h1¨¤;ŠL :-åðÍuýåíOW˜R¯ÊõU |!3ìÒv”HrñÇÓSLÖážÍ )CUU Än%àÚ7Ì8£ÞpyáT]ÅÐ[·î &=%¤dvé<Ô*Ú_0B®iÜï;U@ʦY_(è߉1ïÞ ×œxO “Œî]{Κ7O?ú*~4š Øj‡3e*¯¡{fD`W0 Æ9ÉwG]®ªÍ®Eô\Ê.µ'Á%NM’.¯g€ÙâNäVž¾¸ëC< ÚTwõ˜[ÔVÈNbWɹù`HGïü”xÈ1i¤d‹gÔî NÖ >ž Ø‘±íº‹­}?Ð2<3 Ì(yÎ1T…cÍŸ†5‡Šy1àT‰ ]Œ:z—b ®Í¶u4ë³µèŽàâúñ‹/F•“]“gâØ|iŒÐ†{&ï`KÎØ÷O¹'Žê¤‡)‰k¢åFBBž¼á“mI·ùð“Ök/Ì+Å °Îo,q¸“ô±ŽPÉ‘OwJL~KÉKI(Í/•=†º&ò1¼I“»Q«ªþœgâq„3fÖøõèÓóN6O¹ï–5øÉãˆÎ+Ž; åŽe› û /0´Ç~1&{ ïBëi»³„”_¡Œ³¿íÏmrñ^ä=Á`å}o´=Ìéåy00¥Z 4¡… rÆæ/óÂN¡ÍžMS;˜:Ý=íÚX§Í_Ô’`oà çL=Ææ’7¼¹B$A5ŽÛONõ*cvŸ/}#猼Ȟ=ƒ­æ7Â>.å‚6UHînêÌx—£ à‘gèªÁpW¾•/Oy°LúòƒÓ4m¸ÚÈ'I>Õ‚ÉÓ„…±JŽ77 mÍ×3:çK&:Ûߪ7"—< ä˜ë\¼+ý¥^ÜwÒò+85ž?I*™ÙÜɻيKÐ=CR) ÓØ—lÌýȳx|î¼?åW)®'–NrÙ¦âÇ;ÔÆYûÒzW(©}ûÚÖB“êçÖøRýþì¸ðÆ15Ö7Kę̈?N)ÉÝ]×¾×—Æ/Ó(­m3µ«ìœ'åE·º3Ž)r‘~L“q¢ ›U캋y¦(êˆÎ8w¤2ÂÕÞET·ˆé-ÃLµ|I”½DÁr†©¼D/ò¥Íe;Ð×§×YÂ7¥!^%’ÖëÁÿpE•§á¥Fí$˫㦃Š/ˆOYΡ»ÚŸ„6ï}Ö¡ÛØ ¸1»^Ö+®½iµL˜>;~xãª]5OÖn|=ï Þkº(EÛOÄWUA;}^YñT` ¯ g§51ÃâÝñ€~¦GüF/ÙMZ)¦ÛÇzO­¨ÊÌR§¤æ•X×Hš<ß-p€”K½o9o!ê…›P¶;+„]w“Äô6^9Ñg£™¤Ü®¬I4Îys܈Ï⋯J È~h¸äÊøb p•áÈvYY»7Ÿ×kûé¨oÝ®èºL=]ÅIEnfÂm›™Éaööß{×&Ùuéº÷Éyô4È0*° ÍD÷ÍÙãFtÀ±s÷Èî{^5¬]€b/¥‰§—‘ÝO–Éê ¯X'˜?Ý;—ž»Xà<Å ºD[ǾHÎÈ^>ó’€î3Nšœ 1®ž§^ŽMé*±-(ŽŸM9^6DÜñ¦¨×{f`æCIS¼~*aÑ•—‰O?bL°…€^“rÿ’ §uÓ šÖív~ÿBP‹•ÏôÇX§Jp̓y‘SLû!’×öÍGÝhj[cÛÞ¥[A+$ê„?rêu’k Ñཕ¸óçCî«Þ,PáñD’·9Ýë´Hºq(ùÝûv°ÅwÔ“Wƒ‹m[‹ÈH ^RO>S^4'¿™2Cæ†ËxkÛƒîw~‚å=è»1øX˵Í«s6@Ѓ µZ&BKãuh°‘I65ÛoµÖÎç@[ª<˼pZç2©Ô\%éò“ƒæt!ê2«œ¤¢ËSÏG‰Ñ×^ènÙ@G}σcuBÒη‰à¾ßÈ¥®íåPgC™õTô¶J¥ ÙÃ)c»gf5ûœ¨;—ˆGªDÄ­i‰uI!‘ºÉC+hIè¿ WR±XM=?“&á ŠÙUòëĺâ“ÄŽ5.ôLƒ&‘Ëž(2Q¶¬ˆ–kVÍ#1QQïaËuíw¯ô¤6 ¸:Ë!èÈãÔ9|¬‰Üwf¤\(3¸ ½ëŸ€Eq<€?q^Ê%˜ö÷xåÆœqÁàÖÒ…7,¥ì‹¾Æß¶{ÏŒ-V'õJN¼PV¼}²t¦=à„PÎux×NãH;ƒ§ï¡’ÌûÏ¥|moÓZ¾éhÌ—3çZ®ä,qh@Ï¢#ïzû™ÒøÞb½g2vt•}V¿«z‰ kÃÌö€âvŸÉ2ùù+àÒÝîÓúÕz)ŽY™÷6ÏðGï>OêÍè;÷ˆq @vj£´Î”»Â«w'~ðOϬðLÕGe\ª­g“b5î†^²?®n¾ÅfeV¼)­Žs·ŸáXb­¢×`LmŸ‡I$d©_yŽ“aÑŒ?ÖûMÔWÈ;ÉÂ;Ÿ Ñ"hý®Çö::iUJíU5Ð̦»„iUôá)¨;o¤ÂBDùF ¥9h#ƒgß¿}››Ê”Ôp˜2 1k¾Ñ¾íÿÞQÓo‘kdYøaÚsœÜR]xû ×o%þ5ª”ÅçÓ¥Öû£“wpÐÎø‘<Z>üGeó[w¸V³½äžµrØ/ŸvzƒëÁ¸—SjÔ0ú_½ªÛâ›| W¬žÐbÛW<; Ø.1ôÒV5í.ð°j”‹—¹ÆWýg™Âñ"§åHL–rÂ* ½Ñ•V»åÔ ?Ãʶ•4zç¨Þ³%[¤›7»€a9ÁéˆÊÕOCœ=rûLt—ÂÃ2:–!AôîêÞaW§ó\ãMä©)=-Òo/ß[EÂ7>ɹ8Û’Á…úæåŸÛõ5 WV¤bWq¤û¢6Ã*v)ù¸BÞH]A(Ý%Ë®#0âSÐáX7Ï/Wš·õÙË87îŸl¢‡;4ÁÐFEtƒãæÌƒYJ½È Çzù#Óõ¹±*Êd®‘­Åñ@¯±j %6µ[È—Ä“*t» q63;½‚¬s#ß-!™þR]ÿTiz±§·=jƒ€Øë£~û™",=.+CçÐÀq“ÆgbB¬ƒÂ|Iv¥Â‰ÔÊâöÉá)²@´ŽpFå²Ô „Ái%ü*ÙAÙyÑr'XiéƒHñ¸¼-#”(f#°ÁÚÆú¬pŸ’5‘§%m)àøh#¶o»gD¥ÉîOæWÔ¤¯PÒæ‘Á  ‘ʶIö”lU^ü)uX¿[LÖ±.Kð6RÀ}Ç` êïMó€|¦¤œÞq¥ÞÒý J‚áQ÷£êœ/Õ ŠIT¾Ž GñY.Þ9Eo¨ õ·'x¢ºA€Fú)#ö êZ¤hç¨áf?ã¥d弪ç¼Äш%H…DErNf†êácàIèÐãpص¡ZFì"òHDÍ3DUn”Wò—¾-cŸÓ[5¡Ûf Ž›)s›UÀè„ýw‚õ#˜!vxÚ°¨½œK¥0`1/9ÇM4ª½ÑHKˆ¡Kµ£ò­%-‰a\ÕÑrÌlvWO€Ã8Jk3>Y ÛÇû™±N|çÉmǼΚӤ~ 9”®SL½sËêÄRbQ"àæ)íÑ|Ø,¿’Œ$hp}½¿T¸2{–›X‘+ÇYr0€Ë,™.y¢œÿb¥~éÊ'ÁÀ×fD¬êN­K\舙؛•OŽsPpѽêëG1»wî›ïÎÜé³WÏèÌ¿Þ)²òÖeȲWšÝ ^í­/´$5Ñ2>3=Ç‚­â«<‘Dä iÚóˆe‡a—×Ñ<_TúÐÏ…-Ï)‡©ßž9+ç*ÌiÌeÞ·JahX“zÈôáè.j©ÞI.9 FĶ´ÆÆg=÷ºü„²9x~˜5Hº?çôu˜ÿBàÁØJpGÙE£·’[tPÊÈö+Ø&µyoUoœ¨²GRºÏXÈ šàVn)Eå1¶š‰%^ŽuvÇ’·̳^ŒªÂtÙ?hm¶ªÿ¨[ù!G¿=Íûw‰¸á ’Ì„À6Ûè5u[á” Ç™zÏ9-O!\]ûåk_ñ #R¬å®E¾L — à¯yIZe¯PfgVZáꊊëÕ Ô Fáïï0b˜0W¬Ž¡Ýݤ!Ñamg†"ˆR`´O¥®× ª8qRåúv¤±#¶¢f²«ð’ž ›u!–|°¸aÉ®!"ŠQÆ u1Í‚™£Üd1Y)Ÿ„0öŠ/© j(nwÓC¥f<ùn$ÃíȨ›AGÞÊÚðëÌϰø¥¶ÅÜרbNø÷¼ð>šoéæÝ QÖç«R÷P·×ŸèŠçÊ%XøOp ¸.ß$Ðcݺàæ>œ¼WÚèÊ\™#WÝ<ô¬pQžïc+ço¿·N™žx£Ÿ}´-Ï× ëöQr${ /HÄ‹âM÷¤/õ=•Q&‘»Xnb"@n«å^ÅUŠUBiÙíXæö¨8:CAó-¬þÅÛ#x À³ýñ%ú4uVŠ&TqF䤺ªOé|Ñ Ì“W¶H¡I-Š$‘¥úQ ͧœ.`T"+{މqst’½2S§° ;ìJ‹õà!?qìeŒwq åÞ`—wÏ¢Íý1´óDØ~ŠQ•û„ŒÉÓ´x(m•Œ°?Oê¹~¸ûüLÙڨĩå~7-MLày²²“*ytZÁ“8ìÁFRzpCfn%UP².‹‡GäóÓŒé[Ë ?-»¹Èæ$/lTÒÂÈ UvHŒ¦ßD©â¼°PGã‹d§b½8ô—ßDs(Ë¨¾C{‡%U™7«¨Ãûƒ94wÝ|öŽûÝzàTøx| ýÚ½®lÔè¦çIÈ] :ªÄYð€ûÅ»™îÙêeç÷g{ÈPÚ&]‘ˆ¾KàÿËÓ¹ª0'YÜBèVõ[E×w2n„\Ù°À«jÖýi"Úù-Ék}ÓÔïCorTpgúå /™VãjÉï]|óygÈZ`pMc®&ë#œÔ›1ýbÄ!ŠÛ H^x'AbužÆ߈Lçauø§‡rR@VÕɽr”o6Ï: Zç À¬ÅA~ o ¤ýàÂÜÐ&;3IÃEÏ“$’6åµSú6Åé±Á¨Ä•x=¼hðkI{äU¥÷ÎóÜFðŽºexÈG,ްÎ4cvÇ›ê G‡ÿtâÑ—èûvÝ×vN½1p›ð¡rT]2ÜA;ùe°Í^ÀTg"œP,¶Œš7«Áܺ«ƒb7"VŽ4„-ËøØ‚åø i‘4ÉÆâ…9Ü$zK··Ã]žn2ï¤Ð锪L‰yÑN¿FçRšCÃé…ÿÖñí;K¹åÞê&$€qIƒz˜\Ðø9… +ËáÒ.½ÆòŸ1êxs2ØGüð@q å+Å|‹èp“ Á°LA¤aŒs&ò8 ãÑe€!ó`i¼H¯‹¸I´É¡(j@ÍáË;ŒÓÄ ß™¼–çÀçÍ _®®€Ò.À[¤À5[ÏÁÓ¹áË¥+PÚƒUçÓÜG°ªÛ$Ƕž8]gf Ï€NZÐ|õ809Vúö"¥G‰Ö÷©gø]C—âs!,ìêäf"£Ñ?<‹0FH¢˜^þT0†N‹üÖ×XIL$…›(Ôˆ×ÐG¯gÔ1’ÄcPä`OËËk+i‰ï-‹³i=(&9bI=À¢Ï‰ ÕPÔ6" 6 Ç(RNäsœP¡1ÔRŠÌ ýDÜÞ+¾zmİ-åÆCå¼iÐ섺}e׆Œ¾ž´@nƒ²ô3SéaäÙìÌlǰ{çÖí¨³m×¶IXÞîﲕ4<ØeDùe2µjxßµ ÷,uØYõÆ[ÿÍÃîí?&Kõ¢ßÞ¶êxºhOó§tãzD5Æ+/ñÍ5Î<µ!^3_ǯÅ:`åv,ø=»‚?Àµc\%VGƒK¡Ùå: Þ¬öË)´ÉéÌÑWCž¹6m82¬ÅÄØVj%§§»t0ŒŒ ˆ—ºpŸïw`õµáHK|wÙéîrË·±©{—>œCÂlæt²!2)ZöG‰C?–+m¼†±óÍÀ” a6Ši“Ãaî­N‹©V…ßkÞ[üxØIjÉÂf†ˆ6ºÖæà L¨ÄVkóÇœöŠc”¨¡–ä¤Ó C>ìB |V'è\¾µ|Eg)w8@óJóT?ªoñÆ…z#VØæ!;>)ò­}†&±þÄi‰KZ¯ØÌYt¡¡Ö5ßàPGV† £ŽK­Ú¸ _}heóżNñ¥„û€&ÆLÚö—˜EnœU¡lÞÖusº\kG#øÎ©¼§IŒŒýÎOr:t9Sé£@œ¸ð‘Û3õ£ö JÝR8ð1éŠHÛJªÅ†Û’ý^\£)ÀåÍt¹i`^\oÝöJÝ„è­É½úÅl™ÙE‡qʲ–M4.‡ûòNúB`y̬6—¬:ÉÀ‹ÑÒªKhv‡:·^9ÜËa€Eò+N„öäƒTž!^ âQ,ЧÖ8)<*©o$ø4Uäà>“<+ÕIêHXY“a_xmËUx¬‘‚ Øí|Þvq–³— NÎCEÁ—0Ÿ|ß—BžèQõD1ü’¼¢,˜£W‰Ë¢ŸãÂh¥º¬¾U˜åÁȦêåê>MJ$p`O›z‚ ¼1À'Ô9PæÉémhݶú£4¸äs¹›I»vû"3œÝãÕ—öœVcšŠsåÏzkÎ~Kë…ú¾3B%P”}aŽ4"ÓNS¦AƒÀŠ 6Ûßé<®Õ~O›"»K&,¡ê ³0ÛØ™¸(¥Tø‰Ù"Hé$Æ‚´òõÔ°³ÇÜ6ði°>°R@.…´ÉawÿæÚ=uQwÙæ‘•ÉFOóͳ°ÂõÙøèüÜ#S¦rcOÞ´8‰‹t"\ôûžÏo@"™EÇGqéL…û?-¼éžËìÆJ®[nîλg*`¶ð/o_OU Ež¿ä+€/©€Jò«#cS×gí{žÖƇÅ<¹.°wäŽÁÇKÏÆ¬Ä©&汊˜Eq“ Öä¥ß7Ïu*Þt®ÉÚ¤8pƒ2tØ1ç¾ ‡'XÙ¹ô¼ð AW¡¹$·zö…S‘ ’ìoìX†æÎZ¿OaæOº¡C¢±”ó#Œ-¡°2ˆ§°áÏ®‹}¥ùåà’˜Êß3*€Íðá°5;ñúÖÌ“"aó•VFNë+noì+M–¾°8 £®ÎAn÷„6Ï V8L_ =Sî‰{1š;‘èÓI-ñ™nA ‰0Ý»¨J iŽòì)äÁÞ23Šeb7ôŠÎcm-ýÃOØŸØLý:Ĭ4ȵ8jN ÷bò쉲Áà5]?ÆX…N*%·¼Y¢0Ór¤srާ%KHõ„*oÿQÀÈr¬úãóÜÙèGŒJxÚðfs ·bØZÕÉýêñÄ(ŽRÜ0|ÕVx}ôÝWT·E®¨I|EiÌ6š#ëKS04?=J¤«a1¶ dl0¼¬ç, Æ<çghŠL¥TvKÌ#+S#=²¢ìIÕò…b3‘öÊÏ#¢ OAª9ütÚ$9íÉf¦¢üK6«N$¨0·üÁa îÕ_°¯6–‹ŒB!Õ2ýá1òx«“Ž>¤·tUÁ.w^s‰v 6¼ß{Í‹UP gWÐ|ë´¯#âo˜îóLñÚ@#vÒϸm?l(«=M—ù=1Î(vÙ•yÐÒ_Òv ¨ۉ½,×ÖĨ>a0Hж’ÞåKÏ'pQ7žQnZˆüiax7D3”NXYh àOÒy^ô=*Sø[Þì4GÒÊúg“:†í5í ¸ƒŠ³ÙÖ+·½™OqŒ­DÍ]:.f6|^& É ès› 3²PDØÃ¯«^!*îËëOÔÈüNɶ”cáÆNµŽÓÖÝÓ}Óµ‡Rqº^]®!„ÏùA×͘ñtß:uú­ ºæIÁ!([¿þ@ŽwÀŒráÚåmßÐ62“¿…Ú·Þþc8eù7)ǺÞÚËÿ=qf…¦öŒ± }l#(áÀÂ-ûJòIfÙ’yð‘/h8ßß,»ßU´zo!ðé÷¾Ô¶Þa0‡ŸQ>¬’€[Õ"œ™lE„©qY^ǶÐÁËE.ñwͶõ$V œ ìnóaý¶JÖÓ+¬üÿÑÿù%ø™•߇ÿ?ú?¿?ó¯úûð¯ô‡ÿ_ŸùWû}øÿ£ÿôKð3ÿÈ߇ÿ?úO¿?ñïúé¿ýáÿ—àgþ#ý·?ú_¿?óÿé¿ýÑÿú%ø™ÿÿUý·?ùŸÿüÌÿo”ÿû“ÿù%ø™ÿß(ÿ÷'ÿóKð3ÿ¿QþïOþç—àgþ£üߟüÏ/ÁÏüÿFù¿?ãÿ_‚ŸùÿòÆÿ¿?ñú7Êÿýáÿ—àgþ£üߟüÏ/ÁÏüÿ¯æÿT”•Š*Ê*òÿ¿ÿ7ÿÿ†¦òÿ÷,ß þÏéÿç_ ¢W€+«þÑý@¸¹+a]H„’BÁÅ Gº»ÂX÷Ó*ØÓjŠÊÿÛíûƒÿYü®ÿÿö,ÿë_QYUñçøWPBüÑÿÿ%ø/ëÿ+WäG„’ª \ñïâñÊÞóÏ2èþ~^ÿÐòGªÉÀ‘J€ª\F þ_¼WVT‘QQVÊHUå¿(¯»#þ]Ýöv©*£ªª (!à2j ŠÑ|WýgÛ¿kÝÿÝXEFMIõÀXIFís+ùkíÿkjŠ2Ê5@IEMFùS (ÉcÕþùdýE²þïæH„ÒAãUd*o¼ª<Öퟵþÿ!9ÿwëï2÷­WQ”QÿµõÈ>ßÓÚÿK¸‚²Œ ò ÙÊU8â/~üçfÿMáÿ/–H¸ÂK¤²Êr–¸‚ÊŸRR†ÿÕ§\å±®=΃³ãá÷³WT’Q<è+Jß§¢PøÇDíTøëD^9)?Ü®€øá¿Šp%ø_šè®ð£ï®{é/û:ØÅAp:Ø×ÁN‘ ¿‰|ÿÿ7þóñÿ¿? ÀÿUª ÊÿÿUÿÄÿ_‚Cÿÿ4B¥ÿCÿÿͽÐhÈ?ôÿKJJþ6@KKË­[·þ*þ/((ù¡ÿ6¾Åùwôÿ÷fòªf¼Ö;¶•Qîº*àh0cá;u)©âίÌúþ5¹9ÂDF‚ƒu¹þˤ¦”ô© HêÚT¶uƒÇÁX€\ð9 üž¬{9ÍWrNš×oß¶TÛ‹îjÁ›>‘I‚‹äæõÅĕ׽|ߟØD¯²”a#ù aÞÖ¢Œ«¸|%öZO¹Ä@7y&=áb½¼Þ÷pårùÛmǯξ·õìª#J¸7ç{²g²Ù¦ÅŸ)‘Hz:K,̠ᾫ¯ü,P.Z––pâý× Ã Ÿ‰…çtWŽË{Õ¤´Å^ÍV«@$X·JQL¨8µÖy—K<ú~ Fo¯‰åf›?nã`´-~eœ`'ƒEš 1rÓÚ®=³¸%hÅ%QÆÖ Q‘”c}²#C¯Gx©??oÇ€=.ü\t³ƒÌvíB¥>Á;þµH. ˜Qªk±š–ltï +/É/®Æ!Nà$ÂeÎ= Š™]w?ŒÖ `zfð…õw;½zÃ,%ã![w:Qã‘Ú ‡ÛBÂ"mŒ^¸cMS)”u±gŠ9232“p¡²‚^¢&LVYû®ì`5-##‰›.´x»—øH”]Y{¦ò`5…¬(áéûltº‚¹!#}vâ)M†|Ç<…ã[§GÝ‹8ûÉmCÎ*Á!qôŒ´¤ØSéÉ*ÄxhüøK£(c ¬¢la ˜¨ž÷Âß”(Ü'õ­òØû머‚h_ÄIÐà4 —†àÁ%ÁœÆå@Ðàܵîà„Á½q‡`,Á]w 6äÞïͼûÍZ3ë›Yóæýqë>§výÎ>UµwÕÞ»OSÓf)šq£xP© ¢9¤âùaƒ„ߢPCeÔ’•@…S…°¶O7#cCN”J]žL"”´{É‘æ½_ˆ>­D_M¦Re2[4ø¦*Ó|ëyR9ÿÕÐf ˆ}ýã5|ˬ>í¶ðÔÊÕÏØñ÷îìï_°ÚÜNYÂ?L5uØ()21µ®Î“qkïвüAÈVÕª|BJ©T ÆAv˜í6L.'Møõ”Uã²¥ N1¡åi åÖÂÓ ȯ0JÌÌ­Hìî:<7(™ig[)?‹álFÁÛ¿ö]4gïU¶\T Ý"s"È–^Ÿ^N'ñjþ%½ïÂ(-(Ë=BE÷|Þ}U† »E÷Ìú=`pÿÇÊ2rÛ&T®%GÈàUí¡8dcR°ˆŠs¾œ°À»…”DÆÛ €Õá.gFÿðãÑ®®ÕLK–ÖˆLr}Œ!'eJÙÌu¸Ùžc|# M½Å@Ì•Sé…Z‹€ãÙ,†á#~5à×ß$#Ó<Ú!#(<!a ÖlòÑ£ZT7ÔVŽþlG©M ¡”vÐ-/²£±`jÉœŸù2ÌÜÖøÒèV9þiæK.4nñXqwŒ –Ï÷«eœï.çÖ1æ¢{ôͨ)@Qšå="Xæ\wòƒ¢‡ºa÷?Q 0ðzÜÑSo8Åõñ× ”«i*MÆ•}¿!J×úñÕ›¾`1äs•ó?Ue¶ÆÓ6cˆ\I7¿W«ˆ­@¹‹¤ŠËïYlH ˜‹"g|"ÎÓi7»üC.[-¸ýDëšÌÎwìî^ 4ýyB"ÏèWÆy©‰Ã““¿¿ÅÝK-ò!FAgço¿3ŒM3Lp™ç4²a@>•+÷ćðl[¹e5Ĥ!:…Jtnά?Rq ˆuå?’2eþÔ"Èö‹R¡ózöÊú”]Hj Ó:k÷ð …ÂÑ®£!|B--˜ñké{ þ£CwUÕo‡›™i¹ÎËÆÐjàlŽä[½{• 7¡Íˆƒ°,`zÖQ"$k»Gè÷Œ† 9Ùe˜”éá÷AXhû@B„Fo›ñg ¢†0¤Bj4Éz¡BV,C¬áªßp¨= j²àô0öêý¬Ž¬ÉbÉÊÇ Šicm]¾]Ô''óKŠEØ–MwÑ‘@ÙýƾAe-Ôÿ®·Œ„Ð>Îtpá d£ryœq 2;,š³º*$aÄ}k]W@‚”z,OY[tºôC ¬‘|ä–§\ç/Ž£,JFBƒüâ'øçÙA'16Ÿ@xYú…Ââxf_´ð3&¨Ì«–ÄÀñ#CÐ[oФ¢~ €“~ªs£2HCëm¦—*o~åR?ýcëM[%s|9•õüJÓÕSür >€À‡6;©¹³—Ç,Ǭb úJzåÝe¿“(`| ]ŒB "`jЍsgÇçÁºº,^ŽÍo!ÆN{ŒüÔN•õ'SN}Eht=2Jy[æ“BNÍ—DV:.š°‡F÷$$L¿^fe©'kó÷»õ6P_†]›J½½p2þ<_Z©i€iAXm,õÆhHï‡OûÌ…šN¡µm#y\#销´goS ‚jy"2šeßbóÛ¦ö¤p§›óITù'~ÒšA› %«›ëR‹`é²½ÂO,vïSK2pm8I¼áEkyZò–%%Ÿziø‰UYÙɮמ'Ž‘ùVº_^PZçÂ@{¦Œ®Žu²jyûÓà@t{ߣø°pü,}ò’}y~ÊF+FK\Ÿ½ˆçìWxÝ[\6À-ë€&ªâ»A.JÓÏ >Fßv ^2'ʘ}¹jšÂ¹OˆVÏTøa¦ÝG±C bYTö8!ÆÞŽ94_|÷‡¹ÁˆXšròÌGÛC‡)Y!ƒŸ{I‘Us.}lC‘C-”%.”»§½¿Ì/±¢š„X{t"/Æú– ¯ßúë¿Ùm‘ÊAîaž^‡Ñá0Ñ]¹´YÒqÁ D0Daó¹ÒâU_ÿXP 'l¹wó=‘°ÍX'ÐÑÏ=¦PV»îà¦ÆI^ÿ€³Ã›è7÷¦nP·ßŸ=8 kƒ8Ð=Ëzy}û~¼L…¿rð±ãP“9«Sô[yÊ›"´#«Æ…ÀçjL§ãþ!B#BZ»µ´!åû…QÅïww̾(â=톖àî`ß󃹣õ“hڎε¸ÓÁOm°úHA',åŒ íþ¨R§þú<ïˆ./Ò¯bEÑÚBì*ÊÏTž€ŸàOÄ?ø…‡ŒŸneöÍÆìÆ¡y}³Êý¯¨Ž]/®6i—­·c%L ÐH–G™g’ub•Tºª½‡ÈQ¾W%j.øëY5ÿY|ˆ¡ª “H Fàhÿé p~Á'qgiÖ:#ÿ"\mˆ”VÖô¤ýÏ!)/F§’œ²÷¤ "Wü_vS{—ênL÷=²aÉÎx´(øwËÿ'½/¤D œ?Ž! -ôA¥Ù¿O,Dˆ×¯3+°nVP9O°:3K¿Òtµ†ÄYz<µw†E4HàsŽqv¨'±W¯$êѰ3ÿš¦á"õi^§ «î§Æð ï¶Þ˦—¢ÊWZ_ \©rlÓU–†‡ “u¥v³anðÐï7ñTìÁúó—¸Ñå¦zë7mpËë ¼ Söúã°ì¾9šñ‡¦TÙ­’ÝÅ 4kfb|ðU3š/JŒ4”QÂ.Ë0üN5M<1Xy‡UŽ£4‡ó …;•qÒûàš¬)§"j$;!JÓ~†ã± ‚1 xÒqÝ-œÌ@nFF󉬭+¦°¬ *§&¿nõÁy¡ñ3ýÉçi£2CXtÌÖmX€úÛ/8  få”ò-?‰ìŽ­žÐô~Ô‰e.\|`lÈ?žð ÿÍ\¡™T°¹ZÂbýÐJ»õ†åKztšÊ1›Kë q…hø ãÁx1u*usá×ãʈ‚“y`Hýâ‚ÿ“ˆÀ³«é_PvT9¤Ñ0%Kæãw«©Í:è_A\À /“ ÙÒàó’> ¡ÔýGP.¸2sÈéÓ©õãÆÿ(R¡ûŒ}‡ÄÚTœF¢²¶€ts­VÌ@œæFý=—è–y‘ÊÞp6?—ßìüŒõ5|’"°6JÅàÓ) ëÝ~ùýDƒ8*¬jŠ©DkNd†3óuÌœR¾<–2Éë`Ç2ùôæ/L5Ù_´c–œ޷õB²ôÞ8¯ÕªègýZj'¨—S6VéÇ¢„i¼#B¥ >É«²`ÎYqÿà <í¼Sµ/ àÕVcfÇGˆ¿­óÈ—þ•¨–õ»;%ì=Á˜ñ׬ƒ¡‚™ÒSáç !uŸKS²Ü”ûën;Я£`\¨Þ‚©¾+æ /µÚó$®!HØàÚ±uM¢ 6©0Åb‰M©ßïÅ ì¼QV>‚4 Ëô“šrì\­(&¶ ¦²¿_F,3)‘\®sî¿d¼õö3™h!D\ÅĹ æü8!‘HôÌFé4è¤X”ægj2fZg¢A/(PåÙ©cE„€™i‰©á ¡lúiý1ô¿ß^…9M¢=å¡@}g:)ÛonÁ"Ù´Ø-³¯'Ž×àZøñ‰ÕŠŸÁÉ©Ðçî¶+žˆÔ½¿?‹†=œ]%}4õX¿‚þ”eÏ+PF”j!Ôêfßu6dÅâ˜ÞL“µ1Ûò±gð¬³p¦ –bFŸþñªžd6“Åñz~`û"ä±…p%Äê_B4Á7Ö•îbpûWýúƒÈ×ܵ7%Ì;⼤ÐnHdæål“m»¼ ÀLžšÌg«˜‘4á°¯ö§)p{*˜à)C0àuŸ×"Éóeä€O“iùb˜_6HE Ò®QF›I‡”2Óž`âCژʶ=¦ZûàUfL¯yçÝ*QiÅDZc5KÛHä_¦¼¾rl„êUÞ–¢÷€Ší‰:>4™ ÕUT¾™ÔÒ”ÉxŽ$‘‰)|ÚãˆÊPœßž¤ß™Pùãä+_L ƒ©Fàgí¿œ÷Âséç?hi h ™(¢™§‹£Ë1*û‹Qa‚Ð+»jz~¥‰úfþwÃpÔ6bâ°™¥¶"Á3]nJNa]¢¡À.à'IM‚oLyƒ/“¥Ö›¸°•hÛc* ˼[—âyýyàΪôÍ\üQ ì cè áh2|˜tvú(9v{Þ|ÏXp.ÔÖ; Ú†”vRPB¹õHc¤Pô7FY‘¥)6aåŽÝù}<{ºl²çGñÁ×~í~•“6ÍLá;aŠÓ/õ0€Ýàåö ¦ëóôÂ>ßy 2QšÈaoȒψ]°ëë%ÝÙÂGq¼ÐÔ`¦ð]×H…iµ)Xy3‘ß_1 µ­"®gÈ™˜eÇüÂHVtu8Ík”p‰*¬üé‰ "XåL:Ð¥0*&³Ô(åÃÑ+à¶W!Ê ‚9}–#DZ¹K€¾‹8Ìù¢NEÈç^“Q2‚øõ‡qY¾ä¯3ƒÔf¤¤[ˆiA©:è} òNíAhàüÒHn[ž“sY ü›¼rCyZÆz¬Ôί0‚‘ZKj$BOªýk]‚Ôçhå jWÏZÙßÒ~'ieäS‘‚"—↬7êAkÎðôÉaUwxôFy×VA‘‘&øÖcÆXì²ó㩚Oy1Ò#EY)qAk“-h@~ÉW9vø©:Æc~«Ém5 Ȱÿ bå6¯ÚuW*Ku®±!µ5» öԤµp×Цºê¨•뿎TR~†z½0XG‘>»ˆ‘PîîÿEȈÉ=Ö*›ã‘„øËR[jf©c6e>_¬$š¿q¼÷å:ƒû9Hkv =®œÇ8ªùQC~Ú–¼JÔžB{^uÝ4u¿½oߟ°31§ ~eá6’¦Pñ®—̵mèPÓ:õÞ¸B–‚A+°Â¾qÁðzEõ­f„ßÒöyTg2F懺ÇD PC8ÍŽA­ñndOîä; VenÆb“‚y6 3³Ý’a˜µ§P­›Z—¿6þ 5È™§­ßïuÀ>È1‡=äêÕàS¹âÿ±@töó7ù9n+ .È©|a9‹ 7Ñî¢üþJU0ñ“üÔó:r]€¤ü©ÉÉÔÆ±¬ä½>ÿ\B3VòÏ-‚<Å?Ÿú˜¼ îWg1îWÞÔ/X¥ÿeçÄN]ÁW=\Uöˆï9Êî!ƒ~yí:·™´úÃ⃤ȤÏѤqê·­BʉSBÆ’_C‘ßÄrH³»¿$|ndJ yªAÕñyØ—üV¬¼<Œ7SGoóÝïJ5ÁÒ~[ì×öa1é·MïÚÕ|8sãlxŒ˜$Eñ^~3yïR( »£Ij…Õ'¼µ[[yYR×·©Â†Ë‡Ÿ ¡êœDª^⠶Ǩœ>zœO_ç:Òæëc›(蜣‚®iÕß²ù:gŽùÚ›‹?r¢ôàÝ8KˆÈ˜Ñc«ïip½Âlu$½S)Ø‘ÎâwøðŒLÃø+ÛxíÊ?ò±D¡/„ pœ:º†±Ÿ¦™ò²A `Çø ܵÙÛ¢é·4þâÙÎßåˆÕ‘ZÝò|VÙLj› âû¤„îUÜ›þ…NV!ÈG¬ÓlÂ% xÝÁ']éU{õÉÎ{fÂ×—]wÂî ¥là r'í :ööµÁÜdêª ²Fwý¨Aæ_ãkrÊžûrÊ×˹8¹­K¦w(ò¹†ÁÅ6Úè•´%X¶Aë”Ò©(s¾ à¶"©uÆœÁ%žEïÿþ<á­ïѕ煵[VNs畱ÛZÖJ5e™ ‰Ìb›Ô~|OξþClǸÒa¯‚T¤Cûò½ïçLWa:ÊÎUY%üîè¬1úW‹·ýÿrÃ9ĬCËÅF_Íð¿%6ÂTÑw º^ÛYÿÄÿ§Þ&8èhãè¶:¢ÆB8ÜUiO„ ˆúçÅŽ(G8k*%ÊtøùÞõuÜ'Æ*}j(—kH1ÌýUrËx¨7¾óJu°ÌþU˜ÙÍöÀ@2+ù#S”€1YT! ú¿îÞ6^?„ÂùE÷cæôÀÀšðJǃ1#zÙ"ìX4ã=d «ZCŽ:˜é£Âú®Ñabï‘ãCOæl¿'2æÈ´ÍÞRÀö´õ?l.M•È5lf»ÌGZ™|ÔÞ„ñøöVF;•϶ôŠRO°”0êÁ)þ3dž ö_QП¶Ù™:¡™S%ÓJ?ÂnL +7û¾0fu`eÀg'ðÇ\´U¬€/Y/rY®Ý.Þ/Aæ¦ÉxûE A-ðèV—`>ÄóÅÀQDà"¯rÇçѼ¾âjs1÷LjR£ô;D¼¹+í*“¥ çÙ×5+é‚¿LNí·N ‡4MR”‡,; ÿ¶p¦Ë­Gq”Ø»·ÍŠÃeôBòq¼ !#ó wÈïM‰ò»ŽÎ5qL­èÇ?qOŸeO·_¼ñ„óÀµŠmÄ ÿªx˜ø‡K>sxV/:ü+ç=\ãÒ »›fµX¥ Ša8gÕ'vUr™˜kÇé(&˜iã§ÑiŠ\¬9íé?ŸK¿Ç†”Q„}UJÏy®–ö2yÃëÔè`yøŽŽ[_–4ìÎÓØV%_ 4°Ž¿¿ßQ ˆd¢¦¯D&Ö;Ž}Uo¡Þr(Ã*¯URûÃ'/ÒïÚ~@&…|«½¾‡ËÚN¨CÚVp÷^3ñ!š>‹ùuןý¾äT›h™ò>‹Rãý¸ûþ=ŸµãÞV®F±»“ظ­ÛÛGl$‹)6´õøx¸SZØavÿ%<ô%ª÷ƒl%ß“Erða3Á³/ð©Œ&íOUlÛU_W7Ó>Y‡«]‡Z„ãAoÙ-Q)v_ËWSø®5qXÿ€jåÙMrUT(i,õ 沫q:X½ÎG •ËxI¯ù˜Ÿ;ˆþÐEÞ½ï0˜¦»Õ–BŽä0ržÈþ4«º=C$™Ú–é£@>ìqõ‡½/‹ä"Î7pD1ª4Šê…;¨Æ³7„ç”þè¾ÏǧçOÏ­Ðêf*©-H­­K» máAòÀSÕÜú”pHŒ[s~í0‹}-%êPüÊè}¶Dv ýß>ÊÆóÞצ½†¹ÿb2ôé×#o±S`“*‡.Þá—Ü“;D¹Õÿ>”ׄ“@>ÇVåË?£d’¶z±ÿÞî ­E‹*Žà³ÿuÇ[^¦ƒ_H„8ª$Y.)#ËæWX—V‚ãd¡e;¸Ä2ÖGý:Ê@…H° íµTä ?ÊŒ¼`ú|‰æwÝÿ^U" óèenïGPl,Bɦùœ%¥O^’`ŽØÕ…!ƒÎ;c¦›îMÖ³F•+<Ç,²ãª·Š´öE™°é‹8Ø«©´Ûº86ÑÈÜbÙ&ÿkbÏzÒ®@}å¹%·>ò,Ÿú¯üâQÃ$d¹#6Èû¹ =¶Enœ\ƒ°ß›5yÛð„íæçKûé÷TÈñ{V€›åÜå¼it”$Æ9äô®¥ÝQôIÔØ¬Ø‰,æéÐãÌËê„Y+ÖaÆÌ.k=ØÏ@7/´ôèò㔲t…þ‰QÛjw'ø·ö!9ý$Ðuï†kRXù­Þg]»—*‹ß8©éCÕicXƳŸ©üKL:0ûÅu÷¡ã–dt,)sG}Ô`Í¢¹Öâ>Ãä-3 þ p1‰ü¼q&SÙtz¿›~ëë¸XbÈÌ®þõR¶l@ªu£CÛÀÙØLc[1~¸UüqdH¶ ´¬ôõÉMº+û9 âi§ô›ÁUƒ’ǰšŒ\D&XÖkJ†R8èïøOs‡ô†Qå½Eˆf\ÿŒÌ[° ¤j;š«3]“*i{íÑAç{ØÅ¯ŸÂ‡º¡!Л–Çzé· #wþéÃfÆqÄ’Y†{ÁÐÄ´ýv G-fÔkÃñ!âJ‹r‚oqñfôçˆT6¬åv+šÀ·y9‹Èÿa}ûõ\þOÿ$ó™Ó|°!—ÓE’“{‚ýMQ äë4ü·ÖꚎ é¤*îÖëÄoÚlŽ;výO.Iâ`¶¹Šö <Ÿ}È3ŸÕê3ÕI¤!Þ~5ÿåY>îÜ¿VüŠ–1s™i]Ò7y½[¯ºËÝ0=¸Ç»¢§ÿVÀÈŠ$ºìiíSö°_1Nµo’¾3š9_ÞÅq÷{srkÆs_ýìyõ]Ö>;S«¸ï5tÜðngn@…á°}ó¥cP؈„þW#;css,½á•Ù2c£D»QtM„TMó.K ¼%‹—w S„/¿ £‚ÛFõ†+ÅøšXŽ-Ò`÷r;œÃf%†lÍxQ”À÷€‘÷²˜´´ÀþP+Y8ˆ?=zf{Y~NŸb}‹¨‹u0‹.!ò÷wйýû36o»½O½QÊ™ds¹v43ûõß=÷ÿþ˜7åXˆÚŒ6ê–››·ÙBI]™oŒµ!BQòs v‚Úß- ÛÏ"Ò»‹%žÚó¡€_ØD”{b¸'d@êSG@¡JE4F >F„Üp‘ ¯ú² %3§‹ 2šC«ÝÝÃ……­3]G~žøq2õÚ##ÉYs ~d@[·SNkµðm¿UžÃkkÒNÝ®(2±á!× ¨X¸#Ü*%‹3 ™ÎK.ÊÛ2J3@æ’"lW—¤ÖŸ@öh:>ÑBÏiy·!rÊò¡:â;<Ô²"¯ÿ~(nfžø|ohMŸIùÑ%™—q˜Õ1Ý´›ü;F=û“š° `V¥c¢ Cõ×vûi¹ÎŒ‰ÐR%Î1kŸb/f?¶5ô›-m‹…w·×Bж&”ê)˘ÚNBÝk#î*Ó ¦É_é¡M(êÄŠ›úRIœ¯ ÿæE„èDe¶N&“1Ôxö1ÂÈ&¦€€ê1ðQØþíwg»<Ÿ7øï÷³.•4wŸàÛÉUÏL·LWx€Î@X>u|äŒri)“i^O‘n³ôû¬R‘ЬïþŒºî‚¢JÊ‚on—{Åì(fw"/ž‰´¡6T ×ï0iKiì>¡&«nA6ët„*t΄õ£Bn¨wî‹ãð²0„ 2mühD »Ç"߃lQVS66 OT0Já`ÀÖš¥Ô ±+à4½ÅaÌ4IÛ†tƒ¢°ª ŸÎÿÔVÀ—µ¦ýFb&·Ški@¿œ—e«{°—y5èicE”€¾ÇÚàwHu‡¸n§ýB‹’tò:ñ몧ÂШʽ¶m“^G­l¡1ÉK.À—»PËšöë¦mOˆ™Lœš ºåKï– 9ˆ!á#÷Ì6† °ºÓF.³5=¶|P §oÓ$x˜ÍÔ|”¢üv´áÏ@O,Œïßõ§Zß3Tt+ø,ûdZ…ª÷›¢ñiØÏ÷ìq€uÕ{á)'›h'tšÞ=Nâ&”:}«õ ›Ý¶¢>JÕú1ìYè0Óê'Î+ÚKT“‚Áé‘N¨Œ€Yr>n`Íå–ÿǪ£=®š@gÁa¿Œ"ë§ï;ß9‰÷è?qlpÌU%ÍY‡·Çš×Jº°,öØØy3¤\³ë«k®¥eAÝňËïBïêâœp½LòžáöSÕ=]8ˆR¿ô×D”8³‚S🖲–ñ¤à7Ñ®&ÅÆê÷‡•ÒôÀ-žójÔ¾!‘Zìüv?Ë_ÎÊ÷ÎÝ'ðß:R6s£­Ÿ›E–÷|»ˆWˆ§¢WtO¨—æ²çSR5êƒ#’«2çøÜ±jo‰&6¨Ìãñÿ--½¨ê¸ß/;‡ì«’Àç&S+„a^ñ¿"`è¿ûÌÑá.³'JiAVÑ·ö—ߧ܆Ô¸3G–™{óδ ò,Ô7ÂÔáÏŽø/“n¿ª®½þë7DrbäÔjC÷Ç­¡÷é­} ¼¾â%.ÿ$S­Ëi¿¼msõû¦_¼d»¸Aß²õ9'ø*XýD˜sòØô+’´ÉU¬À¡¶Ñ0øoy/¿xG Çrí} ßµ›d[é{c‰…i•w^’s®¦jJ¿â†ßZ²¹};é¼ýyàòù«¥PæÛÛ¨Žéþ‘MýB‹缿ôºbâ–›fcm¹†‹ŒÊX /wõ0ßD\^y«(;‚ô:XOd Yß¡ƒÚ ­®-7[žD¶šíÖe~û® æ—EhÍ-¨œ(õ÷ý¤MäêÔôysÔ»0 ²À†Ê¹ñç•·ÇV†Vµ7ý%Á~Ø8û$|ŠÁ0>ІSõâig;¥KÝçMXyÝþP‘³qY *2§jüPŒÂè7_{ôìM{±7=[ Y®ê4wm³ºÄ€{®ÔEÿ+ù¸¤\‰Ð!”;Ò‡lOÃ!ª’œl™«"§ê¹OgùŸþ*¥Z°§¶`ÿ8$Œø¢ÜàGª@°_2ÊßtZ_£ƒÀsLùãyÕÃ/€½—CÙŒj©#ËÌv ºP0vÉc/µ(˜»5!D·c­Ø:ʰ»å$Qœ 2Â|;¢KÏT ‡vÒÀQ1ŠìÉÍuÆ ž×Y<–8…éïŒ6CÔ}r?AõQ¥‰–Ÿ°näûuUNeõõG²7‹©…L똦:†RP_”Ón³·©žUò £·_óN¹©Ð†Ý¹íÕ´ÁyËz{9uHþü0oÓ{UöR¿¯È!‚UAÙ¡ÈÚ’÷­AIê«&‰>Þ²&NåŽØD3ö~ÿçÇ5íªOÊɯ¡eP±ÅçS2p\È‘³®þ²B; މkS•mÒó±k©öòØ 12à,p•2˜Ü3R‚á¾òɰG@;¯ðt˜z°J…Q…<á­~LzÆÈ·"=þ¬œ’³÷ÞW±Ni˜ÞM/ õþ€ôƒ÷¼Ë„Qj ­Òt„‹]7lÐâ¬&í4£®Ççà®̞IöGé(]<3ì¹(‡Î¬7téS`6d4îÑÎ&V¤º­ ÄFLÂùÏ4ã‚Wǯõy4ì?4’˜žËilWÜí|ä¢=y­®k“L„Âù«ÕòƒnM'êÑ<ê…0¤ë§%%lb#Ò6Þ…œø[›~ܯ-åÑ#c¤™Ëˆ &‹µ.*tx§„J´Ïž…Øõ}ã¶á©\úq¦~LÜþâ=„ ?­“Päý nö–rÐÒJÝV+?ñEö3«,ùBåÖGÄÃ\'iš¢ÛÕ­æO{þ ‰:˜M±Ã‰JPägÛŸZÑf=)¿Â`’¨Wgô#ï™È&ºÖ´sÈé7ÄKk±k7×—!êÒ¥*rŽÄOú¯Ç’UjÉQY/=+¿;ÉÛ–åZÀÝÔn ÒIÉkdEVi.šÞ”–iÒ¥ëD*{/ŒåǙ֭{sÂ㱑è3Mû¨ù”E<KÖç»yx~ÃE¯† ·éºx'»(LÙhS×~tu¦¦jÍǶ¤&_Ûü0WºÍ$Ýº>[§ð‰çV V*DÌ Ö¬:¤ÿÀB]6±¿,£ºF•›®Wv®ÞaΘW[¿s§Ë\æïˆ·Æ›—W6tè ­Ú‹;xñï¬h|Úv¸ÎÐzó¼Jdª©á±/ЩÒv;þBn ˜®t—Ô„ÇNÈG!y†­SÑë¼8mê=ÚíPŠŨ<¾»%*íÎÿd6ÒÄoâ„O»§õ ÞLÌ¢.w¾Vx¦)oPËogvàw8þ)šöšg¦ µê.§³ç¾ e[E½¯&Õ,¡¢-3˜irìüYy%ˆä¿èç®;_-ÁÄDñ#mÄ+žs|~mOêY¡‚ÄË 妢wKU „0ê{“<¾V«ä÷ó S10¤ÌûÆ0RŸ³ßHNYI*¾€ìë½?NÚ” OC=G[[ûŸ1×Þ#ãû¸ ®ˆ£þ<]EµI¥õ±2J½›*pjøœÌܽ‘Ê®¬…àu´´ÚS¾UŸÔá£êîvDˆ{‰LÊå(+®˜·kÍõ°ê_ìl«¦3~áÃŽ_ÍðD™”9œHeó—¨=T±Ž9ªy5°Ç^,±0ƒ?l}’ÉÃÅ„Ð?§,:÷¥ÇP¶ÖUŒ¢svC\ G^p TÕk:†J‹göNhÒRdæPŽØ9¾ŠŸÿ5H8ǧxv›}9«Íë…û$¢Þõ)á²jïë­éÇŸx p/;ú'²íóo5±‹oï*t—>;ió\lœã×0•^ÉÕ–ÁxŽœ¡Ë·þr8§³Ê›û©Æ < @TüK½žÑ>œñÓU;ÂA¦:hްÃoTx]Œò¶ŠBY˜Ö¾î*-§„{6~eÚqÅ|øùœtrøƒQ4{¿¯??ø‡˜/e[¼t¹õ¦çÌÂÀ Ï]š<$aê%_òšŠñ/HbN‹ðž|Êz;e®´ýÝÁ®¯©s.~›£˜¡Kr§ÏŒ˜*Gc(ß«hŠû|óXÎûÂí$àâônïÄüÓA'繌SP›äíññOs†Ë¹‘ Aév~‘û»Íôô‹¾œlrk hØßj‡Š¶GS8öàžŠ0øó¶ûÓýoÙ÷Ag»Û™LGÛÐÐÝ«Úï9K1ÚúLÜšÁ­7›'æ ÷7=Áwpbˆø>4f¤]°Í›ƒ %½'½ç²üwâžAQz˜6Õ¡¬ÿÁì ae±ýïÆæmŽô^Ç Næa/ÖfRAå×læ,û_6ÉZA9ïX$÷¤o¿În]«$ÝÑ®ßÏåóA‚²fZÍñºŠÖD©€cìc¿RÓ{6á_%‘Šì јð=ŸÖ‡Êþ½—~ ´¾iÿ÷7uÁî;Û'h¢ÛWOš5´}\ÎxƒÈ-âhpûlª¶ÞiºsŸe½È|à ýÛ[Wjâe[H(vņ »^&ÀçÕËù÷‹ï>^ñ5‘°œ;]aÚÁ´»WLÃÇQ5äÂóÜo6âÙE$˃´ü•IÁemè“ÖùÜS~Ìòû¢ïa«yðÔ*éÐË~¥ì á÷ZÄè`}ºVÈ®ÛU‰ìù;JÔö§H‹v»Åƒ‘b;Ï[ ý¡†2Ç /qòÇå´ËU•y]]½/îÙ?%IÆÓ€û§¡%®œá~c±áµÞººŸH‰+ÉyGäí)Ûäú+spò¦coï³\'þÔü6…(Á;抬n™·9ûEÆó{xãN²E½v–ÿÓ¸SçöÝ‘¬çvÁ£úvOÝ]œæÜÍŸD£Ô'á ø<)¾óÄâ‡;Çi¼ÌLûÝõIqt‘È/èÕE;¥ŒånQ nç/RpUò»AoùM>œxœ èâ |ã!¬ϵ»ÿ˜覿×DZ ¦¡ÍÌZ -沆Gº;#ºÿБ6¿"¡.©±kþCª?bíԞϤ3o§ðȱ«öµW%ר™J×´ ¾Êõ/›§ÆáÃí|'ïû•†í1u`ý ‹ðP#+ÂÍ:iÓcŽŠ3+fÇ_h®,í·ÃÜ¿i‚–»^*Œ¾ˆou?ç-Á…;±þˆU}“e(~÷µ† ß…ºiM<>B_Ê Ç„>Ÿ³¦¥ŒZǹ¨!v™âN<{Á™Q°qb5ÇŸ—Õ<ø™•ù~®I-,ògSwà®}zsƒŽÀáx{eÛ‚b(=ßÓ©þºÏ÷Eéõì„òs¡8ØøØï©Ó‚î¸ÊÏ„,_ä”óY’­ã‡j¬ÌÖ¾µË²kRܹ¬žx.RÚSB{píÔðïÈõ“«ëcˆÖIòÆ AãCFÿ‹š"BvM7à?€§ÌT·püˆ¤—×}Ô´&¯)ÿ":^Y3'ŸÌ÷;Ôbß×ø0r#buè { Þ¹ÄK<C^«I&ö——¯1P <Ë3x/“Ú¯g‰íBÃo¶ ãm,ë5¢ $œ6ëSnœLš3Í/¥@|¶ÿì—tØØŸEMÊ«”Ën1N·FШ_‰]_ó÷$ô?*†œ*Û›RÒPÚ QÔ¦lþFMŸ™@C·²Ó.EªÅ Ïç°ÁžÌƒR(DÃí™·\?áƒ"¿}”Tzš½÷s`è|ñc¾«D/ù} 7[ù7pÙÌjLïÜ‚¦ž3ÙÏé„›õ;f„¦þŒ’ôƒ‡ÄæX6&¤¯É@=²Ôʆ±2@bؼšë؉cXžÞ«ŒÍ'|ûçõždÜ@Á"L=@Q_#¸D}¶=+Þú%7mŽC:×ÈßñµÜy¹‚œ1 us-X …)ÑAtà?õ?»êü~l\±¶ìª’²“ïz?¸ÔνÁ@\ËSðØS@ ¯×­òæm¥-»©åCwÞŒ¸™‡¿ÍP!Ý^¨_Ê}V.½Ý©îÄxyžçvØìAZ¹W­vo`8so¶%ÄRËSœYü¥RùAsaàð hO(µºñ¸¯LE&DòhFçÜ„GX[Mp “Z«þúT¤8 ‚\BÚ·rrQk½_N¸ÈÎ\i0šWSìž­ •Q©wËFýúñǧV6Ê¥6Ÿúu¸çX|b$¥ Ž®¡"¯MŒVð ,ã3B¸•¢þ ^8Ú©ŸQ @«4ÛC(ashœú韓{ T°-§âÈz’ÂÕMªïG· œ©e®®®Æšçÿ×àõà¶bT+«ŽÌîö ù‰ RhAÙ—<ÈY$¶BÔî¥ &Ç‹_÷wÿ4—×z©gÙļ‘:¨Ï­ŒæVL–ÖàjLØăÄ%–ŸYP áßãÅOn½7Ð LÁüàÝ¿f‡ÊtÇH*7eøŠèsÕ(Ü#.}ßF~b¾ë3‡wª+FU‘DÚ©%…9ýè0¤À"8‡uo(…£ÌýG™€š´½É§šZ0AHi›^ºáüöãw¾­úçžÚÄ,gêhH_iÜŠ“XÔ³¡oB$ðÌlÆ™³iû3‹xu2š#yÊ©ßÌÎz__>k^ÊC…ƒó¿xòÙ…–#&¢”””÷Üq5 zæO¿þ|Dgv§¢;Í«ª^•YÝßm­Ýþ:OúÊp¾Ih«’ŽÙÉY|~Ûä?âÂÁg%³oVÅXEÓ3gŒ¹ zŒseC×V[‰Ðç´“vÏ«o/¯ï}½Ïvãr>™Q *«¾<ßµ×ypö;7‹–éσß=ëÌmй½êKßá'ïÒC@éØHò¦ÙaÚO>•K×~ž¨*7B–®ã^ÖÈhÊW·ªyíÞa!°'ô±Èé˾¡Çzœ 4U4GÕ&-ê¤ q0ŸËhH?&[¸×SŸ4|,¼—a»¥vO¤'öë¿Û)™6ýŠu‚+í¥ÿ°\þvªú0}bj$èT±é·!¤„œÕË©( )‹|(„¤°ÅÓ ÎTÞ1 þÀŒ$!ÿR:¨ Ô¦œ@O”D¦K Ó š‡%2™w/Ü;PýÚºÛJÑÄ[±,;í¬@~B\iûŸq 2lPX¨ÏÚi]mU˜´çÆ€Ì+EUåÊ”ý "Ë_àßeéþF€Ø!7W6Ïr¥PaÎÁúã:’RÝwÚ 8‘Ã,Ïldh½²&žÙªÄAQ(Žã§àçH›d:€³ì€1'û¹`+zâ HÕ”’êœ!Ðù\½üÓ' †Ì(Pïf•¼ ^ØWx@Qª*ýÍ̵ªyU¾ðBoK‘0ø\=û TÚÆ¬˜S×&õ‰‚íÜ]2 µÁ\f¦—F1VðÐgÉ»Ÿ/@n k+®A1Îw¥”£hÐŘþ6Ð0÷Šædÿ êPêÉŽr’„8”M )(óH¼!M6¬zæ‹¢¾Ëjl°Ê‰RÒ÷†Ú„ Kж£è{ó˜â§’¿8-OØJ报Pæ±x@ÔT(¿1{NEç`Cp­Rl"`)+ãZˆ1:xóä‹©è—~ÀÍIõMZbxy^J·^Ñ7§/güÏ!xŠÃ2Ñ\1½kU¦²+<‰ŠH*Ì«àG“ŠrÓ²ï÷GßÇ.Lˆ,å!f #‘jæºÆý³ºWߨޗÐþëí¨‡»°÷È´¨ÆŠð&ˆñµËeÅïÑR>Î, :'_VÖš÷ªI™OáçÞÚnÞÕL±Lª“‘T"JwBß„ÀtQ&m,½ÓóÞ»æ‘$3¿ôK-3™L¢å*ê5–Ru«/Iu²™ÞžP­"x‡Ž#“ÊÏ>{]s¿ÜTÛ•G öŽ3:ÔÛc9Ù·@Ì 9Ó Í[®°/ô¦õÕòMêâÒÙøÝ*Öñ…2kØ„§'{¡IK>P™_‘8þ¸u‚—.WÕ#×®±^×ëßËU@]@)}9*£¥Ê·ê)cóçfëöRQ@ÑÏ6\Ù­Ôz»ñ»îÞ:oŸ‘äÍWF@^Y©½`ߢüŒA[Ô,ªþ#æþ2œ9Ž.„YzOÞÒMõ§ÓƒD¨¢›sÀü½‘aì~´7§qÓÎïLû23É–ô%†®ÜLð#”p¦-]*Nå¸TØÎЇ¿,D^ÿïS¶U”ç+1‹hЂw‡šS“gÖ0Aœ{ÔÜéHv`ÇöäêÍuýO.öt‹ÒW9Ãñ ºRÕ“ªÖC™É1 ²L1ÈêÕMî\ÀP¥*(-xuú‘¼)Á4?~bjµ ¥ÿB½ Qá÷59§ŠŸ ¤SBDÇ2"õš¼OËeŽÏ£¨@æ ­õý³ô…¼‚? ‚|N–F¼jN¶¹ûׄeN\OŽ/·1;sÅnÎG’Zg0 õÈñoÔg¨d\•÷Òv•<²ÖoÞLô¹³©M~þŽK*˜ÎWèÏwÖ÷~öÈ¥|á5ßü,6ÒØxt6PÕѹ)ê”t`tT «_Qþ+ç…¤…àíóºv¹— (‘¢‘´çÿcÍb¥˜îçY$Ô-Ë¥Óò~tÆTôp#uÖ:´Üʉ–é¾²#­£Øôv½HYÿ*à€Åºˆªui"_%éÓñ­J°©œ~ˆÏ\«ê[ŸR\Oß3Gh::Ó 7oÚ@ÆÛ¼½¨CfTÄÿóŠ“=Ñ]\­AVdKJ7Ó‰@Ìq)ÆHΖÓFByqùþ ã~owãÅsàcK¹"û6Ò_ Ð4õ±÷ wv„¦I"ÿó#¼2cVNàõ"ü«¦dÞþµ(é¡1+]}}»à.»J? Ø‘+è¢Åéµòã Ç ¹-ˆ7ˆ;žFÂ7Ù5‚H{TJs¨ñ°Œ«‰kðD_Ž×ÂÍêIV˜¨þ&T ùÍŒá \.Æ{…4õP‰œkÞã;þtš®É à±ËÀõ—Þ‰×8lõÂ`EP•1o=}1’AëEÝT¨!z¥t^¾ˆæüö&š‡ßS(µéRòzaƒ¥‘Œ»$W¯¤?¯*zífNN½‰+*ÿ¼®1-Wò’¶}²ä8QRï.Ëî$CÊta‹Íµÿírîí!«ì.GùÝúƒ¦SÌØ Jœ¢ú86©™ºOÿ g$j¦¾0ñ(Ë{Øx†ð= èe$¬î®Ž ]ØÙ_OgÿXV¿Í<“9~ym¦Lc%•£­a°¢#çÙxÊ ÷çw¼Î¾ ~aÜ1Äm“Z{Æ aöÈsŒ,.Õ¬ŽèK,ôóøIæE—­¢ÿÎ!6æy·m.I43˜¾_Ü$5yqÚ³ãøK†ÜÐ"ìšgr„¨T)ª§\R»"“q‘6ý¨ÃºõVL2„šœßÈëñ×ÞQÁ5\éSós¤¾Ø rUM`°&šg‘ÔÜĨnz &4ÈôÃ9K !½cL´GYEˆ”º&]‰"ÑÄOTHöwøp1 «0¡¹>ÊÂj7™g@ËHu~7È•Mÿ.T%AýÄv›ácTãP®be­¢þ¯ŠáìtŠ‹¬ó·ÒÕº5Mf_V#ÆÜu­ÐIª~Ì_Á/WÕx^z¿¿~ui™ ¸›3›“|{q|`Ö\¬8Í-5˜Ebf¯B¥`ðÎ ø%¯×‹›|…ߣñïÓW°,˜%ì0 ·»–¯8äP½gËERˆÔª;«›;ç²aú‹oÚÌÜVþ7@T,[ÝB £Øä>$½oü®7N—ùÕþ§Ê¤ƒ·­?±·'è `}öAÿ¾h¶×Ñt“Ô(/HyñMwžN†ZºfæÐ#l:°W ææÎwÇk;.ÄÄyíÿÓÛõIØÈ5á•»õ7IøÀŒAU•™+PU%ÂRgŽëdQfoû÷ÒGÓ‡z`⢙ý?¿h_Ì¡d<ÍôÏŠæÌæÊökf'Ëê/>•¿ö²xÂg ý-¿c!3Ná¦n›ÝóÎaxîwšr ów§4|×/©eƒ·Ä |oþû©^NØâ'TÏ%ñ÷¿Ï%ƒîz. LÔþÃ1°OGâÍU s\±¬_åêýÎd2žîp%¯û;×§DíÌŽS6¤s·uˆ£ˆLÓ> ô¹¤ÖôÝ´o”Ÿí"ÄrAU h$qĶD ÁnϳNg¥ tCä€^1®N>wÄY€Hý٤˜p@Õ’cŽýÐ$œp”0µÈ]¶PPÕ’Êh0Maç€CÇ|0Báxž(è³z?2}1$°æif^I'œÁ^!C„+¯‘RÒ‡™ºf>£Þ(ÿÊL·Ä)pŽ!e AáaR×D•6·† ×%sgŠ !ìhŽï8r5äqpQgÍ[ ¼Ûÿ‚åÕ«JŠëê—=XpK5ÿE&ôæ·ÖÓƒG³J`!è¡"³Ê5I‚Ôó=çY|1ÈûÇH. T”ÎDTÍüK£%ÿïÄrÒ ÎÀ8‚´5A+e Ä•Söý«ú3g·X3ùd$­¾ Œ_lˆÙ[vÈÓjå‘©¤n} ÿFós>Zk¸f$’A¡ê«Ý–|rü«–7À*$‹²t©. ªƒI|Íÿ"6Šâ‰9ÛÄj„*ÇÖ¿ßžp  ž=@Î~uj–€ýœï$ eF ÝëåÎ&ñû‰êglž;[¿Þ# <«Ó+UTvÀñ9$Fè ¾KÔ÷8x½LÂŒ‚oõ7³±#‘85†Èn* ¿ÊÉÁEžêeb jD=´K$­(=r8*cóýRš ¿i6‚ŒöûL‹ÚÍ8a<¬@.ÍßX÷;Š4v¤¸þ.ë¥Ï?ÿDè‹«ršby h2$Ç[ à<ËKåMâ }ǤvÄùÑ}M¥ôIÜEºÝÇdÕ̦Š~˦âq,UéËY6AÂûTgK©µ 5paÀ–1»Á¢ö…Š7ý ­ÏÍOžU/¨'`—ÉV“;ÏG ¤˜=‚ Y-?ÆUîç}\êŒ Á̓‘ió<¥$j䨕£\øÊ…²™w~ÓÔ:ø Ñ7ßàá£óî7±Eæ²._ÝöÃ’«(ûAd®gëdÖ)†)—<æ7äò Bõ4³BûT@¡>­_JU‘šW%“* ^'VtFÁ5HÉ2ë¿?ÉV¹Îïæ-7LÍâ@Ye¹AýÙ«ýŽÛà©D«ßñ3ÛZ¹ù)¡<ívæ½»QÏ´ÃÔï>@¢ßÔØdƒ [¶bòÞÊãñDƒå )Aœ?ÃÂÕ[jÃæž0‘kªŽåÆ®¥’3‹¡¾äÓ£àg¤ üä‚Ñ*D/®¾ ”8>Í“ObŒ@ÝÖ߇ÞÖ4[3acÝxŠÀ‚‚ׇхgËý!}”‚¨ÈÀÞ2¸*hKÛ~c$ eÚ/4QÛupN°Ç™çö6 Á±a‡â†”?2 m¦¬iƒs:–ò6â€ÅHÄ®IÏ×RŽƒÆâG»㩇(A-Vв›?+~söh'F´‹>– ð±0Sâ±ìvÊS0`ÃÖnx+S/¾jK›ŸýÆÞ<#ùÎÒQŽZ¼ QPn×>2?|*°‘jy)¹ö…Œæ¾Ü-¥ñ1¿¼³¹Íɱ;º$à0ããVþùY=†¹ˆ.ðqæ1)(ÂèÔ,–ïKLÍ0œW2áÆ{ ]¦Ô‰§¾ ¢|÷g¦>µŒfBv œ—wýªÈuQ[FÍ£!"c4þƒ–W©?ž„âû êÍ8Å€;~‡˜Êªqf¾v¨kkEfÀé/6­GÄÏÞvšðÝîrÈmn&©+¿›5¬ôW ²É PˆÞU/ºjÔo!-‡Ž!Û"õv?S7öMÑvä*lŽùÓfüü霨ÌJviB®·f;žo÷¬TÍÌéÕŸL¸u¹_»•—Ï^y^ÌÝmŽ˜ÏÚ³ñQiƒ=è¿…„T¢3ÞÉÐA9ŸŒXZŸ;ÉtÜÜÉ|2}Þºv]Td€Ü)›1ȶª;i™sJºžØôÿšÈHd R¥Fµìuqw¾ÂÌ4yÞ*ß`³0±yh{¿tnÜìgÄÑé•‹ÉÂ3zƒäÁF¾*ãïÛ€Àu@)v]Ú+Ÿ†1$=â¯>‚óªþ ¦Þ×¢æGßî£ùÉ‚”tÇbÜЬ¯o>× _óÛ²t\Aà‹²¾“Óõ}UX_¨iIA¹˜XòæT]ΛÆIñ’oáù!Ï£6Ù¿ÊùLܵ'÷?> WÕH{Ÿá¯ÈTHÀc[ÊåûïN¶&(‘Aœ'f–»r¯}áÌà?o-mŠ¢Õa¼q 8³ôh‘Ž-üì$¨ºuœŒ¼¹îì´©ŠS£íkš|¬MýÊ‹²áB©ºíWÿ5XZB?Îh³è‡¹+{ä·Ó ª¹½«ÙEœ}êˆÞuh\x.´{„Yuæ¶á–àDZ¾…“g&c á)•QI¾g„„ŨÓobìʆÝ$ÒR<)«Þb’LÌQ´‰½ä#Î|‚Ÿxbyùè…ý'óäÕBù”JÄ{tPQ’»#]sý>F[ ¢¨¬ß°ã¥Ó±xOG*ÿb¶9­ð0¡ŸÆ~¨áÄ—+=¦û7srï#àhBú¾—AÚ·°v‘ÿÒÍõÆtž&8õ9)³çÉ&¡kv-ó«—‘ªýþPFì”6¯5»î0{(<(ƒÒ”’Ç’ýÌL&'BU«¼ŠÄ š3æB~lx–¨ÍWµÚh+¦@7',¼ÿIö’)|8j œaûr#/ð€7‡$:MÃLØ# dTž†œ¶÷©D™ ³É­p ,”)™ü€?ЬvÛˆtC ¢nJr*>¡Â„ìZ¥=P‹d¼g(¾ ù>,„¥Ð‰F§v5Ê(³È'1‚Yâ"î1æñº¾ÅG¤C—QŸËæ Q¯37–î2x Ã#´ ÓVbU­›ò&oê0Ã&@ÊM‘+˜x7D ñ žíÏ8&9´¥â€@¢x\ßµ‡ÆÔR\ÎpŠ@~Ô‹¥ÄÔ¦ ÉFaðZ‡/ÕBÊ÷É8Öœ6Ôá‚Ꮃýè9½ÍxòCf[Ü€Ä_¶@ÇZœ“®SÉÆÂ Šof¢ÇDökÝqP&/a“ŒW¢xt„EÀ¼½lâ òß|„D˜%ƒ2«˜XhXF(@ª-ìáN®/H<‚B=»f…+3EEœ ëÈ4NÈ@/³Fþ¡öxJ*¶Vÿ(Au±ÌB‚CµÉn¤(£Å—5²6±%»¯ˆ2;–ÄÀ'Éb¨ºnÛXN-2ŲQ[ è+¢/#÷‹–˜8KC¿&If¡Ä H?‹=¶ü»“òæÓoÿ/%ÙKŸ…£ÎßÉhKì(Øð«âÇl''5ÉÌ µq]„Wi-(3GQišè¹ àû|*åz=3æÿ¹‹_é3ÊW¢¤%‰‹DÂP.L¨D왥¯#%¼ð‡‹xÀ`GÙ Q®„K"K–øßžÊ›œîÞþuìù¤Þ(²ˆ8#Á!"Ðfø:KדEðIŠ4ä´m˜äàGX–)ÏÿMNø,ýL ™øJ¦iµ^>¯w+ù_øƒTŒÊ¦ó´ü* Q×Yyàxía[à“¶DÜ+usn3ä×ä*8^Ð) ´“¢C#ƶÚ$Ž¿£Þ‚PD oD´»öÂw™Iº=Cþ/T»½LL;6Åõ††P#r«”dÓÂ'LÕ‘QuÛLf…Wj¬@ÆðذðWQR¨ö’TÀû^#Îà [”Ÿ„!@Y)_žú‡ô¡Ã~os¾ÂQT^cš`F(eãeçË|yQ’Á…©åi‘±ª7®ÿìtwÀ‚ÈØƒ‚Ñž…ñÀûÆG'” mµˆPyßÀùƒ|HŽwÂ:9‹"ÍÎn]ǺÊ8ýÌùã)jíÌC“ºÞÃõüˆÀm ÿ鿵H_Î.Êuæíª.Pf:|t·-¦§=A¯KúüK´×*1†'ÏV=‘Çö†LEÿª: ñî%1ô^®Cåõ?f.‰#ʇ+zu†GA/ ”Ë¡oxÞþú¼)|Œ†úâ¾UÔפӈã©ÔÇQ™~lüì+£\Z]*£ø['ÀÙ¿§bgôέ5=øbŠ 1jØ×x¼E©Úÿù꺣àñæœ_GžRÜ!pï(ÿð·±ßÞ¸)§ßý2š§A31FœðZ|Á»;øÿñ=Ý]Þ•`÷ Ïÿü×ø¼!g_zaÿÀ%ˆë|96܉:x®²›ŽÍ9½C*ô…*À%0°þj(¾ªóy›LŒüé~µ9£ ñƒ™gGÔ8k¥üdFáÌ”à$ņî[wûLgOØ1˜?—ºÿ Z 6 {ÿÅ´’Œ;÷9™ =õa#‚èæ‡{Ï$ÛÿX²·¦Z%ØÔNw¨Ôü”Õ[Oˆu‚‚vÿçOµÉyó j¸ÕûÆ# wÅ>CTØ+ dêý/jÔìh7@´ßrõOýÞ-yŽRçÄ™&Ú÷u½Ž»·MþßÞÆß7ÅPZGžßÛupÃ3Å›7­3•?é/9ŠY‚Ýñî8¨÷ 2¤ŠxqåƒRù<ÿ>Ķq¹\=“¦Ä ¯÷1צ«# bÈÐ纲ÿ‰'* ‘f„»¹s©¬™„dP_%™½äKÁUWã1EÐAñF2¾ üôQV§öËZp#ö²‘a,_‡­úDÅãfubR8¡ªõÎWEjcú`¹Š È(¡Éï´"'ƒó;¸c£üG  Ã1:™|«Lñ7Ó:…ùʨoÊáJ¼¶ßvÃáp6Ü^§V¡XÊÊ©{¾y-§ÌˆåtOeß7QêäBJ/oX?zA(‘Åü–C2 £mðà¬û[G¾>¾/†2ȸ^ð·8!’ç§"­àà/™W<ª¼h0{ Oz2W 䘚‹Ùï· Q¦´rTcË„Ù.èÖ ³}éž¶çsÌÜoœxn0m¼%é$vÀöSm)­l ¼À â^ˆúAèSÓÊ[ÁÍ(2ªÇzÅ&ñ83÷(R}›, ¯°±ôК—÷ŽB±ÖEšËŠ4²ñ«(#ózW9c%Süg`Ç_…‰¸R4&œ7›ÖðY‘•ıà^åôåjs Ä™è¡:`áÎ.ö Ìo¼dQ3E½Fd~Ú_%ßÜdyŽ$)0`œhý.§’Ñg§þ ÄéYgfÚé«[•kZJÝž5òwÌq0XRæ ²ñ‡ÿ…à_TÔǯD¢Í—É©8ÿ£ì£$$›‰iY$°³¶’öQ$Îé¡x„M•y÷Øš…Öo"âláƒD {V®P~ÐæU™MËÁ–Ý©Í%ÀI@–A™cœêV‹óà¡ÏðnðŽtj¡DbK:a0asry_™RßGðºðrå,N ²èû+%¯¹£›h¡†K}³üw»®ÆD‘<È /Xyk'2¾l/¶¨›sx`É@¡±ž-^žúÝÏ€…Ûá}éŒåí/L÷‘ª y†Æ5‹ æd|VfÁrZ·Q„ â¬å˜;WO.9˜ ™×~ÎoSÕó·Læ_å¼Ç`… õöª»PÁʆʧ‹çé[c†Þ'pûzè/õYŠú·&çåñ‰»¯Ê¬CÕéœ$Xõ½ÝÖÁC ¼Ê ú\ö–ˆŠ> œ¿ZYý€©·Cá­þ¤ïxñ¾$­¤ÅÁ¢ÕçMÕÊ~¦ì8ñªe>Ez·áÿîMZJÃÄ0¿ëgE>Ø£HõI›2™€3ëØ]{o”»V<‘:œõoœ7R3îK§ó*oõ,€ ’Ë‘j-¼o‡”y1¬G•¾j|ýþÏR̵ꭠO‚¸@…o.aÛ s´3©Fþüp*é»ßEyy¾ÊðtÀ$ ²{v_ŠR”éMšZ.»È^~νóçnó…Òœ6–\¥˜Ä$N¢ '’æeˆúá.ò´þ¬|¸@Á‘"Üõ1áN»Î* …ô˜Äém1?™hß-Ás½5s8zðf[’Çs¨¡D‹Õ%5ô¿”l)KU‘ÞçüQ ^+fµË]ZoŠ(¿?¹– ÊX½@½—æd­½™\ƒ²`i¹FŠ iç{XÖi`A ¶-ñ +Š•äÁàþ eA—³ù’€ºíGû™r0evŽÿM· 0PòÌZ Ö)V¬ö«XŸ[nø˜-*š§ÙV·£I­¿w”&3xô·:1çÁnÊnÁ˜}QH[éaänö¯EDs°îoM(‹Š›ÂZ “¿UÈ0¡ü]¯Â&ôQ@=dV‰©WÛ*…ƒYá•LÙ\}ñ•ýŒ(Qâ.# 6Äþu[š),v¸´Ç 2±§=ìcxƒÍKÝ­hËg{~þ•ûþËŸ‡â1ê²7èx\kAµ(˜þd¯«›œ’--' 1Yø…"Tyºðl}K¿ÈÅÄé^ÓÃãƒèT9á  ¹Q¨°@ß*Œ÷î…a N½ÑýßU®ñX4~³Í¢”|¿£±é窉@™­!àt.ÂÚO+:úN·æ.+‡ .+M×Rí¬±!ê=å¿/Nÿ½^Þq¿{Çè×é~ñÎï%)f¦DFUK©Þͧ¸‘õ©_û'§ï±è2 ¯íJ©¸§¶Þ6.Q=ËúõSö$Œ•‰“µëùçêùsÁó0pr´- €‘4<ù’-tóé¸ö@’ ødïUè/Õkñ z¯¡58¨ „DU‘¢v>ôwHѳs}õž ìÁhÂÄD[W®Í¨=_VãiƒR,DŠ„÷©‹ÐýÖ¦dªA¼ÌD`?ÂAºeO<8œÿ6¢Fõ?[‡ñÈÚÉdä@~–ÛCÜ g<”&““K›ÁŠó £®Ôy%2š®ð‘,­XV Ö¶74÷ ëñ\9è ÿ!Œû(‹ˆwË‹8* ÿÿøVûþ~ÿLüF<üš ÃÿåÀtÿÀO`•`u@!ËMÄú”òá¤ÏɆ*lÃ†Š­…77ȇ54ħúAH^›jŠ––nš²Ê"TEQÄï:FÆ“š¶¶Ü­×¼ü­rʶå£úÞÆfÞZa ú+;Sk‡ë[düБzQV \÷£¨Øô™ÝKo$Á”€úNC_0ù«ú«ìçÿ¾öÃôév’H ˜gS7¸Q9Òmåk¨ú÷Üí~Ïö\G’C ^â|‹DU\&­•x›:ÝGÝ^y?”°¸Á9ËÓÕ*Ê/“¶Kf—=Œ:?}üDôàÎÐl‹qwTø–òªÍÜú=ӦءT‹Š Šæ ùÊàS^s=üµ9ór±1ê/¶ÎRÊ/×Jôë¨eöã(Á× »EÞ¯­Àe™s¦íòCÂl$Èæ¤1sm¦²ÁGIMU ðC×ÀÉ\n6>õÿzo ‘ŠÄhßÍû×åÿ:û¡›ÿ‰Ž•9g4k¬ÍœÝgüþOˆ_÷w÷o¸Ÿ½ú·w×K%MÅJy‹°ÿoöÿú¯û¿ ýo³ÿ7Dð¿÷þ_‘þ«ü…ÿ÷‘?ä¿åÿ¿"ýWù?ûßGþBÿ-ÿÿé¿Ê_äù ÿ·üÿW¤ÿ*Ñÿ}äÿì¿åÿ¿"ýWù‹ýÿSþÿöÿ}öoã÷ÿ¶ÿÿëÒÿYþÖN–š6>:öÎ^Nÿö2Wü·½·¹ý[;w{Osó7î–®v|ÎÀÿÙü¿Þÿù! ÿÏòD€@þm ýßû?ÿ/H¶€­€˜•€­¥¸ˆˆ µ`¬!Ï,„!n)j+$ôÿïúýwúÿmúÿpü[ºþ_¸Çÿ»ñ/( ø_çÿ‡ñ/úßãÿI²²ô°ar·±µq·qÇs·±ödb¬ù!‘ÿgMÐÜùþ© “ “ È3a1¼ÿ7à¿ÓÿWéÿ³ñïúöÍÿ…{ü¿ÿ‚¢ÁÿÙþCÆ¿€ Ðÿÿ)öµ¦ !Í¿aLøò…¢öñ Ó óáÌ´þõáÀõZ]Wéîþr-**200077—‘‘YYYéììÌÉÉadd ~ÀÞßßßFÚ=œ¡{jkê ÉnÎÚ¢¡1ü[Þáûaïãˆ÷‚rZÈ5…­Ì-û-^­úäKT1RWIRS÷Le3kd2«ô­ â&A"º¥Dù=Ó Î$7Ý:ÜÞxøŠü5vÈLjðm§;”y©Z×@|¼|ðj4èþ:šÆ$ü~ÉB+&„JOÓÛ <é‰ÔïE¢O&Œ¾¢¾›½Aðš—ŒwÛÇ—ð°Lt™6û·d3O¾~ÄWÕ’&î–52þiŒÑvÒ%âãD_ý<"xœºJyi¬ò>â~ü$XPÅ´c‡G¤Zxó‡=ìãÖþàË“Ýÿ%ÌWÿwãwkm>Ëë¢É>hŸª³»Zµ¾Ï‚†&Î^®lVe-üT«õ/[ŸB-ƒv~®Q]«Œv¾%l©Æ¡²ˆöA'pY™³Ëè\m¯Ì}d¶à^Ów¸»+Îx˜@ír7ŽæD¥Oe¾`X½¼ÔË2Ô}CF»,Üaxc±ÎoGÒZM~ûQÔ: QzØ´Ø÷ìíò§ ž»­©ìBâ}Q‰ø·÷cÆëØ·*ö ©ÝÆ´A{ýoëh ®ž_t-Ì9¿©ùxkWQè«ûæ,ÁEÞm£BXÙ=€S Î}èNîìÍ7Ñèü¸>¸è.h?—²¯¾{à…N¼&ºù¼ÓB#†¶6³ù8z¦îM›q¦Ë¤ã9VÎÑ+‰ïÞá ÷u'l¡ßƒv¥zfêºgHú©“˜¨óçv–ÐdÖ«;\\*RíÊ3Ñc{àNÛÞ®°Äð… Â]¥üíG.©`Å` ß9èɧ 7ª.…;<ó œœ=_:˜ãbgÁ³}Q4Ï„ƒeÖ.ªÝ^I.¦6ŒÃ÷WçWãú«0ö»înž¬j¯ßcRƒ}Ú"<‘Á&+ž/¸ÐFOj‚+rñ5ÏŽ¦¥˜Í/~rE}6>1óé·—V~þ™{ô°%¾KÆÜt'l"`—³Éqµž7ôàʈìöuvZJÀ.=EÃ?ÿÈ@±Å± Ù©oñóu]ÆkÇá¡r·¬¤È°Ÿ:Yéb\\4ÌŒU zQ›®eÂQ´Àݧ4Üÿy '“‰Î9\šJžû•àö 4Ø&Ty• ´Ð¥ w]ìÙ Þ²ˆqR$Cbw=f<€mÄjðÙªï;T?½û`;ܬEDw!xs$Pl›°.m¦ñ.\ÒU×BIçër¿8ÒBÀ諙䯱/\†N£B yÍîR „O¬¯KJ«–Î=;íÚ:ªi¯ÚüÈ öÓzR@Êí¾¶ÐÒ£VÐIöŠî+-Pâ55ú+ºPpž¿ŸxV•sFÍ%HÉu|Àßåþ õ¤º…ïˆë'”L³ûºõifâÌ.ט€‚ncl³4!®ÅëZ™uΜ@uÇÝp¹,éö±%‡ðuieÂõäé©°&b\ 2m†g]Ðu\ôÑ[qSâfÒC³€EGm×-J:F±K¥çç:ËSt‹9ÛnS'Þóñ«@ưdH§jÂr:3Mf]±#L&¶Ìm!ót(”ì ïŽ5èG¼–Ü—ßüh3Ð<„j£Ëÿ*®£“ü‘¦.‘]hòUÜ;Ö-[×·€H1®G°«õµ ”Uõzøuq¸ZÂ:¦Ï»›+ •¾tê@ .‚å 7´i7÷Ž$¥·p—aŸó¢2lœ¾„ëÅ{åʤv'öc?ï‹ah—q•æÂ?ùùƒ¬5O[pB–lVÆpŸîÚÀ®þöÒž‰Sóú$ÜlŒžÕ¤ nzª}ǤÊr覹pÁ<,›ˆÇXý’Ô“ÖxÇÚ¥œ›/oYžpCVýÄ×ßá/©É)½ŒŸBK–OÐ4)æ^­9^‚fX¡š‡f82Xb¡UÎÅ ¼•6B˜Ê&aغ=ú÷jŠ"@Q¶þò7æVöÃz¯´Âõ·9N¡¼j@ˆ¹'8IU†¾Ô´ž¢”[[&k¼ŠêèÝn¥í`à¹W’l"¿¥ëla¡¢ƒ®o‘v¶}£‰VÁnØ®løww5Á¥œl¤A^Ê}÷vqª <=×oZáIX&éÕÓ«æ¸m´J2qíRT /D´pòWëÌdâN?H pî„14÷6ŽÖs«Óq+‰ÁTCœ7ß¿F’„X·K­YMl„ú¾H‘ˆl—ªR¹©Ê´¸q¼Hl|ž÷¯ðÙŸ¥2bÿw«_÷ ŒN/+øf ņdz,Ë1§Ç]÷}¦8¾J…’˜Aå!2ôxß–//ø‰ÃÅgsŽ–»VíRÒ³;$B›WÎÄe©u ­µK1Ìl8ƒÛ¥Êä„õS®òI«ŸÓ‹¦¨ 4-ù¿~ þ†EEŸØ÷Šc3Ø\”sÙ Öb½n×UŸd?)]ȃ9#Í'äÀèn­é-“À¢éi§ǧó:ÞþµQ‹2Í~:áš\Û¥õ´§ä‰Fl8Èÿ#Ï‘`{¤¦’]¼Y´+ø¥fâ&ÂSë1ŸÉoïuü$;ŒàÉ2[R yÉ¢›áûóÂþ_Œ xBÒJT>ò W‰TˆƒÈØŸVú{ôýáiÀPü¶Øšû«S"ïz®4>x"÷–¾ó¿á ˆ’ÃþžïЈ<¢r“k(˜¶©ÿ'ñׯÜÐi±÷BÕéÜÜÙ©?À^ʹÿ®-ıWXùæ©{¨±ú+îÕÖoz­,®îS«]ßT FÂC|` ~Çwœ¶›êýöØê„zl„%À$2DÇÄ 1øº$K!홄mK¬Õ„Ž0A¡{\ÇöÙ=ÜÒ#þ¶[þ–7 Þdæ´Êë¦Ö:¥À¯÷–¶hÞ®€V½…‰ôq®;s¹&D®—iµ¦#ªúøêÒ1–»/›:Ív{izÜ•/ç?šâˆ7©9J-ý  k]4_ÿwQ´U?ªã:lРJ"õÛ«úW¯’|ùn®©«{#=!W>ý¡]\’µ—îïW!´¶ìì—èÊÛK¨yTƒ›XÄæÙ%Èx¯þ4[ˆÞê‹Búç!D\âIÀ övèyÀ×ÙáþøM_#yÚÝ«K9ŽËÑMêûùŒŒ˜"¶Én7F¡p¼[çšpRìÚ£ºˆ;íGŒæya[dÀ ¡ý3)^-´Å„Ê£0\GºWj䙂ÍÔeê·ùVºcn¡:ŸÒŠŸ<”è>N,`+Å*KÈG_ÑFØL’—cx›ÍD½*á4Ħ{•ËÁ%FüÐÕCì÷OÓªy :ZÝïV#Ѫ*Fè)—º¦êòÂ(ºšþþI}ÌÉ%F»»Ávó²1vëEbcÿ¿~*3ˉoÊÝï,‚²ïºË‹-ô–¯ªŠ9 IÚ¢ékðô±ÒéT0)ŸÒ|ðÄ<21Ge®Ú¤#;àBÝröèÌjëÖå[ n¿3¸=Â¥±Ò*Ù§  ÇEÓÑft¼­)Ð5F_fpÝ*Q•£ÑRŒ:-+Y ð1WÚ2¡Ej­!ð‹ûâÕŒ²Ù?øÐ½”‡"%ƒ‡3’rþ_ùc›Ý]¾ŸÄñË˺H¢>m›bY›bï½867¸p§œío‰Ë ·ñœ šÅZ™FŠc±-¼Ú|´Põ@z^p4ÚáråWøTµ·go<0¤-àRɶCþÆÙŸX1]:ô?AÕè¤>;îoª²â.bþp›ÞáN•¿¶dîd‹¸­©KNioxí>jþ@—˜*ûGϹø5kuÀ½Z®|ø•3°@m 0qÔ„wèà÷»X<¬`–sŒü*Ï­ý1Þ7¼JhwQfŸ«<™«å## ¦¶",.ÌtÃW Zžæ~•ïèÂÊO0¾Ýë:Må»Wü‡çlwf7{]\ýÜý•E$>Å¡_ðÄØ ^ü)4(œy4&>g0¬Ê,èmoÐëÓð Ca„û÷§Ä9ˆÎÚ)%ö !,ýAO:蜵ïp WéÃX[7á§’,àW™ÚþIùÁ434?¢º~;N1ÝÚw]À]î¶¹õ%¡¶‹œÑÚ…AK'ÀIJöl“9cmog©X4É(ã›ó¶½µ¸ØÄkŽ®ÁÛdVX}‹®å®2á4º«}`㌻ä9Éßn”ŽJ÷ga'´÷©³´jZôW.Ë6I .Âù—;…~¯™`ß8c|™@ùcìúÉØ!·xÕè·V[§¿¬5šopª·ërß-OÞà-q¬!û=æmtq3-ñ\tî‹ãHZ?þ¸vÀŠiÆÊó¶[{ä§Ýþ~G²®¤ß¿‰±–5M2މÍ],ú§$çÔMت¯Î¾zÎm]œæ°Ëðþ4ï‰ÇGyó(ª‘wóà°™ærÑ/df·¶¶¶?£&™úò» :¦¾y~Á4Âaúìç ›˜R)BÞ çÔ\n؇¾¡›ñmû$¶»5rÝ(í{ö˨vjÑÜÚ­É>tÕmŒo}ðÁ˜Ø)‘ou%ÉÌ´FšžÂ7ÌDˆÐ•"ÿ¡ëò1-nÌÒópAÔ2bv†œ.i˜Eѯ(BÎBݰu.-ÞšìæýLöš«v|»HŽm-`ó5<‰_ÓúgòY”åìÙaG†ôŸŸÝØÙ½_ŸõrŒt𣽭[ˆ’¤Cpd~sY ½YÔÍ|Ô:¿«­6\§nÊzF©¢D@`9CÆï§«+|·dÁ£¹c#ÅOÀ'“HðìÝ šëa&þ͸3¬+E?h'7Ãs ߎHRö™%ÇR $H2mÂjc´›³(I:Ò¦ZÉö¬ïž“îÀŸÐ¾æ˜<ªA{/Ú~[£óuöûKS®~UQRz01„Ó ¶ÇrJ«²íƒD£8¸Ò"óšH²"˺~%l‹•Ï‘Ù?÷Ü‘á:mnfè³>‘OæÞ3{6C¥qξ½á7îêôÓÙƒ„Œ›ÈÉô÷´Wiªú›ú+l#W·ð&¿j šê¹?´(È™Ñç¡1Ô°ŸIš"²KI©¡&D6­Ã¬]¼kÖÖ<ÿyl3!ç9 ]B:þË6ª ‹¡ s™®Ç$A)ª½>s&Ôþ£…Æõê!º@9ò7£¹qÁv ×&-Ô¡õqÙi¡Mõ_ j·‰lúM¡»ø‘¸9Ãiú¬ÙŸŸˆûÆ79£ 8X› RáÔ ¦ð}¨˜ÏcRŒÐœž_«™=¹Äꪙ§N?Žê‰Ò†ÊTçE(Eh¦-Yù¼[ݧ¾¨äÛ@Ú9ô½H×-ˆ°økظúMoâéGI7Ó¶—dÓýŠÝÁAÜ㑇Yä̳Ù‚×£6Lw§úc@móÔÄÑqlkˆìzr»3ý1Ï–ßÕ 2øÎÇÐKo­6YÕ b ßÌSÇ!,,a¸ +Hó_«¤ÖÓ63¸èµŒìˆ7aÖ'«—bD®{ÖYŒwZ×Sa‡‰xÓy »Øæ/ÿu½ÓÕäoÇKnO$ÇñBtí ·‰Žäçæ2Êx0U>Å.ë¹»g%¹Á“qi•5Í nŒ÷KòCI5;N‡Àšš’*+†¿u+Dò«éœÚÕOadšÞ·óÇ1É]í2.ß¾epkÞ!Wí_°ˆýfª&ÅÄGêÈWuò÷É´N‹ ¡dš°0+ØcÍ~EfqqïÚeÈŇ€õp°fZ8¯‘µûq#ÿhØüÉt×¢Çq8q¢”èSkëSùÛšG‘ý¾¸xqT’Xó¼ŽÄÚ¯8S‰f+×?¿ÖÇ6庩jçö’ôB­ùlu< )Ä(k…οŸ20ê ½=X™½!ËÅ"zP+Õ…þ“&Èòbª¡gCaà#7òr#Ó,Ikך˜H’h¹‘!%£úêŒz‰¢*¡Ô…•%VpÿfRæ#6×Á¦p_L«ïÖß¡WÆEÐä0>2q¢Ãõ1ô—vüJË{o#uÿúøùá’(£bîöÆnûõj»ïVèú?šìö׈ T¶)º&À–Òýk]Äú@ÐÜR’­3&úÕ‡´!i‰E}y¬¨.ƒÍD-´¾DÿÔ»nG Tÿ„]ÓùscS3òØsîâH¾Øt»¿f[¸°… ºuš5¤²Õ’ õ››‘ùs÷ÁŽäâÓ0Ò~J!R`®,¸dÔ<3K¸}öp÷Ó®Ú;Ûí©R\‡Ý±âóY©¯q~'*êçI¸²pk1‹}J-~R.‘ˆ Ûz|oÚÄ„¥ÿåNÿ)Ö]à7}âï%¦¬OëX6È]៘°u¢~„?”oZ«¿ªîîWÆîy¬þ-V'éæ­jí‡Q•oßoænuT â, |ÚŒGü™œ9* ÚKžbµÉ¯ê >Pß_Èòkk&‰¼‘Öóí”B|°³W´·Pó¬¿Gƒõiùô‹‡rÌŽ·”¿uXŸn޾2­xý2—âÕe„@¦Ex²l¬ÿxð*s“¶O²ªöÏÆ)ç¤Ù«g¼*ÒPg5üë/_ñ;#Ö׫¯¶·´þ³Á·[¼ît"æÝavôbâÒDÙU”…Q06¡ÄK1§¤F{RCÒRõ•Ãü5càz–0»ª¿ÑÏCÇozJ͸¸u ·½.R·<½AŒÈ™Hê+&þw\üÎNÉ?‘¼ôŒµšßqk£OpuÚì²mÖ­EŒ›ÑÅÚºL3 Ö×ßP<“ýɦô5ϲNm`À{Üàôöç8¨Ûì«•–´´´è÷|7šÙàê1þˆúÃpUù &!nó„GÆ27ó¥f¶`¹k#¡ÐÛXÿãøã££^›d=«„’»N§€›Éð—*‰xü–‚¦SGnbÛ—MC§Õ](ß°‘Ù¼oøœŽÖ« 4YsÜTOà f™ |¢Kî.#êQR7}%·-|"`ç«Ó±uÚ×.\;F‡–Íœ˜Ž¦ýß{IãÆ.’ŒC_ûQâÆIý{eÁpl>Z[N»lé›fJgS ®,‡zpUéX¼bKjÕ%ì&BÙKG™/« Äúyú¾ª± 9ô!3¬pÄ aÑÙ/€V$_ÞÛ'dþ£HíHþÌ3R¾?‰M‚ë½OÑf¢r4ÂiF3ä  ›—¢kËi\•š†íÕvÖã…ö\¿‹§">°²àGÜüàÆ":øýs‰MïœìÛ•rÚålkŽ&;Ùmî2›ïevÂfžüâdÕáâ`x'‰­z¶îs…Å/Ïê`—Ðt³`'´þï%`µ€Ý—Ôi§ïnk¨Ey])`2IÒ¼mw†¥ždÙ”&\ÔÐ5ëƒ ŠFª¢5öÝŽØà¢ëÙΜh•È­³í‚ìÙºU!l0•DÁ9Ìä‘Ô½ð ªõ4öSõׇ9ýµÎË;| Úƒ"—€t·:ËX¬‹ > Ùù½ÊeôcïJàš8¾ÿ†+Šˆhµõ–´ åÈ áNA@@A‚ haÉ.$º$1 r%Ô³*`ëÕzâ *"ˆŠâAªrxßZEP<-HµÖßl­ñêñoÓü?Ÿ¼ »;3ï½™ï{of’™L@ͳ†uùH0^p%òÅ'˧ob^#ÛfÎ;Ó£êK–šõÅÉý¬ZüÐ69ÊI1‘yÍÐ6 ¤û¬¹¿©w±}ÓÏj³æ X¼(.½Ø^Éš=-Þºîêf¯±‹ÊŒoÜšÖ|õÀªí:–4ð"´Më7sμ9‘èønÅ”¦„ø“ƒ{5~ñæ·G*´OvŒ³Q”©8Ó>ÙhðæL‡ÞÖ'K7ð¸¼-Ђ13ªŠ2§Eôúu¼=Ç„›ßl]2+íJKbs$¶zþO}ÚfâRŒú ¦|æ5‹DÃê†46­înnbØÔ¯Û¡Ú'6g~4ŒÚÛ:ÛŸÛu¼gy`Ú}¤9r?(ÊloïciÖ°ÏÅÄfÏFž›¯âÇ.ĨŒq¨6¡¦€ßWRY[{£¨©i[Cé~ƒÀc‡6¯}ôÔ´êù 6oèØ-œÅ£üëÛ(CÇ–—a3®àçÙõc>r¸¡ðÍ2ŽÜåæt:ç›E›óË[e<ŒYcø‘C”õÑ»Eî#¶ e«Õ¡ôÀq2ù›X¨3´x|–ãÖ­¦®]EËJÖ ýjCLVñÔ ì¤=Ãv<T“•él6zé;¿K ^01Óñ¨uìaÑôº¢]uóòüÒ´ï¬ûÚÆa}¬Ûšó­Ë¬b[×6‹­æ\±½qØÀššÇµN¼BƒdNÞÉOPRm¶ì "·ÝÊ·‰©ZˆOîº9‘ÞÛ~¤õ³öÉÌì—:17슕Ùsnظ˜É6ßÝ1é›~PZZ^7!H™“’ixz[tÓ ~$ÈIˆ¢xs®µæÕ|g 5IÛŠ€vv©#’¸ão çïmltÛžNÏ^™ÁìÌòôñ¹¹ß–gí½¸ªðËyËï7¥e¯K$4=O©®»ÌÉ{Ò,è÷iÒ3·k« #ߟÌGûÍù¶G%¥ªÿnØ­ªÿ/J)ŸqØí£oÄW?K×”¯¾ŒÎ|,¶³Òhï'Ö<óqnÑêëXnû̯Âöæ/é Fݽ2ýtß¶¦õÓž4ñDµÌú´ñwc]5òH5®Õ5l—.cAv㼚Zƒy3³¼º»ñì®Õž%;¨ß  ƒjIy©ÁM§def÷Rƒgù­f–^biúI¡¼ÐªËùÒèn_7ÆNwûÖm¼d‚×ïü*m}LÄj³ =«ý Šo5f•V¬š_Õ7¡¹iú©ßL>;<ïºÉ³î§ç¹Lp4œKˆ¾°‰á…~rT±fdý•ÑwHù¦ë'ä¬ÄI•Ñ–Å- .t›ŽñÅFT<ƒÌ“qsÉe·÷>z~¦|ë—óbº˜–Gí{Ú²øøÔ.E®Kó¢{Kjï¸T<¤~}ï{Ùî£%¸}<|û£Œeç–Gm‹[ªˆx0Gþýļ紑çi¹×M[Â,á/1?¼å5äÙúÏÕ€ÛšÏâND€ì7ntŠk.|¿ôñˆÎ‘Mý-›tšš{}íàÌq1?Ñ,çUÆUš¼0Wûƒ‰i¡üE/—ƒØK¶šøþùŸØÃ¤§¿Ošë?Üugý·«~ý¯6Hðú7dü5üÙ*üézüµAšø3týþO­&þLÝÁ_¿ÿC+¤‰¿.ìÿfë÷j‘4ñ×…ýßlýþO-’&þº°ÿ›­ßÿ©EÒÄ_ö«ñgëñ×i⯠û¿Ùúù¿Iÿÿtÿ·þ,ýü_+¤‰¿.|þ§Æ_?ÿ× ½‰¿K‹“ ’ãâ$¨$Î'+÷|þŸd`ÿ/Û•ÅVîÿsaÑ]‰ßpe²õûµB^6þ£ý¸ãÂà nh9,$ئ8ÑhQ,?ÍŸë¯Jp¦Ò0W‚¥™@$Dp-`…cêEXÇ‹!(Ç+“!0_&;a“SS¼)~"¡ Êœ¸ébŒóTwÞ–&SZ'H¤˜Ì[ 9¹¹¹¸;1ž2 Ç8£°TøÕ6T˜°LÂ0]RYÂÃ8‡+w. y˜MUÈÔ 'Á| –èM¡Ri॥'aB*O*¥À ÷¦Heé8&åc˜ŒË€jjˆ €MU™šîlœœà@LˆI†Â é°¿ŠÌ :Sa''L•g½)“BK£p¼7žh¨”Œ„J¿¢pBÁåPa‚Tì†$j 8þpi¾h#áñÓÕ,üˆ¬*A/“þ#D(Ɉz½Í(D •ý)‰©º<É_-ž"ä%}[…P,9øÜŸb“„‹üm=þ 1hÿ—Â1œh—ßQ²ð¢¤ ›gpþÈA.ƒ‰ÖBž‚bRÂH‚T&Ax2•"p¢HJ+”zx%H8¦¯i‰ášþÑÎ| ç§„ÒT‚¡ŠË§q(ðPÌU« œ"’y~@Ê@ßì-øNRQŠ„‡©•y½ø„$5WšR–²²U,“†"¯wR œdéJþ§„»ÒPg—×댩„¾¿âØËÇÿŒ, ã5PHÞ+^•ü>áJ؃բQLŒòÒaå¥a¾aã €4)&áx ’“`©„÷JµêîòŽÑñÓ<œøÁ œ ’ ˜Ä›B§À 7MFÄÀ"ßžR`ˆ¡4µ4S/ð"É R¿«È€H0ä-Sa½5žá«š–ò"ì?xAôK@1ÐÞ w7G7GÝÅ‘åüJ‰w±•M@ße…âÎruvd±Ý]Ùô²š» ï¶³ªïFwdÐÝYLgG0šú `IˆÛ»,éÃc6‚Ü^:4"†Èî^ƒ™‡á¸AQ0éÕ½TŒðÔ÷D`K2ÐÛÒToÖ4%"ÌJˆnTûï‘KˆùLŽ¿òè“ý1)O"½ˆ»LŽ©Î^UdEqЂɠÖ2Ž ^ ß i¼h D—BSQÙ7*C©ú qÔ-"@Q{½ãTF?õÔ˦ªx¤ª,;Õ³åìŠó'~œIcþéÐúýç?Z!Müuhý~ý‡VHZÿ£_ÿ¡ÒÄ_‡Öÿè×h…4ñסõ?úõZ! üDðW­ÿwÕã¯ÒôZÿ¥_ÿ£ÒôÿÀ_íÿzüµBšþ¯Cëÿôë¿´BšþÏÓüÕþ¯Ç_+¤éÿº³þS¿þO;¤éÿ¨à¯ôWº­¦ÿëÐú_ýçÿZ!Müuhý¯þó­füÇtuü×û¿VHÿDÝÁ_ïÿZ! üuèû=þZ!Müuèûý÷¿Z!MüÿÓïÿ‰ó¿˜t&]‰?]¿VèMüßZâJlᑈð¸8žÇÿõó_™ ‡òüG"þë÷ýûÄsq ö&bLgw&…¸¸8c w7gg&Š!ÿµ~zúwéoúÿ¿uþ«*þ3YtºÞÿµBëüW7âüWW–þü×ÿÿô÷üÿ=ÿÕÅ•íú–ÿ;3ôþ¯ zÇù¯UdЦ<ÿµæ|÷»àýÍó__@§§ç‡O]Vxs*¤y ì ”—§ÀžL­¯[\{½ŠÞ|lÿ‹KŸÿú¹è‡)¶9Ø@Ûž{ë,.¶‡r°BOsÇÄÓŒ)ë0£?TÐ Æ,M=±ÜÐ`õÒÊŠÏlºˆl©ÛTT9ÚÑtmþ\ûÖØ'öUÇñwßÊ~N²W\4êª6Ò áúÜ_¾ØjÀ…< Ïu³,h+êãµmËCZfK™µiîb.4ÆO¸bÁÓ¡&bîoüz÷3åPIl,´§iÄuN5©„L/JFIýý:ÏÔwHŠçýtÍìAüÉí'ë£W kcÊ+BÕï˜4ÕM­¸c[¾uyÇM¨ù\ôàíÖ;+·P½Wýzz|¾ãˆÜóÁ¦’Jþö/B2L²Æ^7[5ñÈj´ÇbÞÁÈ(¿»åíäõ´e†3ö±LnAËìÍ+÷Ó£m¬dLXdTlægsh •gƒaå…ƒòŽ|—)Sgì{Vqa\¶]Ù¨ ò©©3Gn|z*CäCòADcNvÄ@)ç$ÅÆg ã§×D))OŸ·ÿDþy¢åȖܽœR‹¼,¸ç¥þø÷E.YžÑéÙ *¿^ƾmýTbº¶[l|ƒÝwF7úpå¨ÏŽm›¡~ «L¢/¶-émFa\ŒØ,züK¡»Úã€ñÆ­;Ffø·â¡ëì“h; ´n3(Ú3±ìYÞžŽS¹_ÆÖÇu–²–'+VYˆ»›{ŸÃL–'הޙÒŠï—}Û<>Y2J ÊžIG2gÙ€&–?Á;nÎß"ïk¤Ö­•YÑP¾v8„Onå/©ðAä6Y&)?fQs zedÝ›öe.éQçÕÁfbó½c-Î5+…ÉaK„…íî'§rØÂ$í>Ra4 i/òó5˜¿Ì·Ï•Bg~VTTo3èÓ¿Ö²ÀjyÇ÷;f¹^ç/;™þ\1^Ö­ÓÞ€³b%füYKŽ-iŽ)ÇÐhü™Èá>k¬úw-^k•¶¶®îÚáà ¨<if¬ xL¯_9?û~g%î¿Ù4Fag_tÕÔg›Uq·¼r ´{„qivkÎÚÍÁ{›ÕÜâ¬arZ~e!k˨I«¡„Œ†MI?_])»–3·¼¿·×øó-ÏÑißÌ´|è1¼Åç«srb|ê~»ºËxŒw|vÖ#ÖgcŒ¼‰|oÕfß²,‹óÓn-¼Pt|xï]?Ì%Ý[øDðhÙG £ÝŽÐÅiÂÀˆ¡ÝG\»µÞ麽¼?|™³«€˜;Ö}"Ûg[Vü½Ó–õ*Í'u*£š\Mó®ÚÐ|;zÐ6[æv ƒn\F¶_6fÌÀ×…5íiû™Ñ=ºÚ‚ 3JÏ ±½I!-­ÜAPëñ9ö¸5}€œÜ-þŒb¯ûÒÛ@auøã †C Iòài׿þü¸ÙìVRgN/.¯iŸÕ2”ØÃ† Ò'®v†å¹kNï±=*`+ö?ZižMsû­–[>+ˆ lj(²ó)ytúÚܲ£ÏÊãF³[}-ÄÌE{ªöVÕm:f0ûÙÜKǾˆÿâ8dÖ3Îîò]U³Oìºx°Ôv_ÄÈݶçÎCT£Ò&šGú•&hsE^UQsU4; 58ô<àlÇǧ6÷ƒ£.»aÐ=ë›ä¾\¡±â¢¡o¯o½à¨_¦@¦¹sö–zÛ­%“ Ûí“…Š+#h@¨ÅEÃw×Oº†ñ"cÊÄœ1a{B°îwsš·l(]ÛÍÚY½2ã¿:ô³â £`×úâ"³‚ÊZoOO¸„|-4ÁÛ}:ÝwP±q@h›9âýpŠ™ðó©òñN³ïúž"ïû J»àv„4ûîSúž¾çîsÜeŽÑ‘¡/|š ð¯(Â;Ì[¶¬(’,õ…›#YÌ5?B²ˆ˜±²š~‚ÖºË8-ïÆAö¡už‰4ïJ»žrß;bFËÞƒ¡ÇjÚÉF>!•6—¿3Q@ü]r7ÊÕ  á Þ™ž9wÖìûî²)ÉѬbì^X¦~âTzéuw±qËé€ò0ëOÌ FËŒNB½ÓC }B2Ê—Xý½ïŒjjÛÞI€ÐAz ˆ€H“ „&½‰P:R)Ò{h"EiÒÄ X(¢€ˆ@C¤D¥…~¤HçíèÑw}ç|÷Ž{Çû|ç‡ó;{­5לk¶µæ`̵­ø7–TêÔèoXÀ»„ð™í3­êü4­§…qrÔ%j=‡qäž-vŸoØv¾#0ÎecµCŸè,|Ö@3Á);×Í®B·J™’é=]¾X­ÛÑ@¯À»ºl/ñÃ4.Ò?þ}qŠóÁ*‚kx’S™§Ç&X‚שÌV\`îTžâí²Ô­Z÷ZÁb±R½CeúIM!vx‰ö"=]ƒ5õç'PÌÁ3›e¯¬÷½V …¬oÒ›…ÞPJˆÀ3ò„lö× +ëN^ݧ⹀իÔñ¤F ¬“wÆþJÁ’¾éü‡“Wé›êô”és”¸k_+XyÑýö³M„1»ï€±³¼ï"äêÅ)ˆ;žÎ}2Ș¨ª€ÑE4¨a8úɶ"è©T¯ ØZPña*DyÊÔóPWh?y6 Jyº¥c•¥“ øZh¿‘aD´¹d bŽD‡â, 0·R*né3åÌšÒȼ·žzC!mw_é7/–ŠÑùèÒ€‡×ÁÀõÙIV™ƒ¬Ã½Ñ}gbÎ |m­Ùl…!ƒS¦tDb\¡ò&ŒÜ™¾ˆ‚ã!¸‚ÐÍY4£n¶pu¶q¿å~µÓ4£{³Û¦/ÌRíæWLÂN…ÿGï&LOg‡Í“¹‡î!†¬ ñ,G ¡±\·áò‡ûQj!„\>2W쀭Tw¬ÝQ g‘ÓÐ71øêS§ê z¹D?®™K`ûaLÊ¡ã‰]œÕ¦>â ¬DªÉ#«AL+O̯Ÿ|‡9¦œá£°ïgFó`B»-N‹QD?<LëËÂ÷ä ß²­{©lËP`ü ÁM3—~ù!0S¾lËaaãû,zC‹é½ÈY {¸…ÝÍ )(ï»á›è„][ší²¸¼h)ø§#qµ1’0†LcDí4°Oi=šÇ:X1:#{%¡2Ž3n¦Q=3lÉMÍ<˜W>¦TûÁÓÎØ|ƒÀz¹.fb¢„ gÛvP±|®5¢–eA 6Ñ„‡ÝEVZLÔ'½°göÕ^Ñ´ÛäòŸ½©0%^áûïÏò]L9{œVé;|î…’€=Èæ&+'×þ#T)·F‰†Ó5/øÑH_W*]ŒPÁ H‚âÎÑèQm+c¨„~oe•œ¬tdöC p‰©ØùE2 (–¶5i=ˆè‡øþ.²ÊŒUÈÅäݾTà4ÆÛ58%y€‰™ §æ¾ØOÈ0Ù“ Ôň`ˆ•{®Œ©€n&›B6NÃr~¼ ì6:ò|€„‹ˆSªa\[XÈU‘P²#ØÈxû”170C¾£Ž4c´‘)u>Ï;xåãio˜°‘©˜•”£d‡6ð‘)çxl'‘*§0°ÞH ¢HsAþSdÊ.³ê$ZLs u ºm¢Ñhöð: ÙãR¾(”v§æ§HU K´¸RNذ><ÄüœIuPìÑ _UJÀK“þÉ;Âl$%S{³•“¿¦4¸®ôœÉU]€ê¥>‡ºbi´Ø-C&B¦–O>ç­ìäá³=.íÓjÂ@r^È 'nC²Ú3ýV².åœÀÃn;—2%n/—ñ&¦—¹ <®ÉK‚8Cˆ›4æA[šo¥“|x™€"Ê— !l 'îê#·OBˆ·êPœÏ /«V‰AUÅÒZ±âàÊ,üK$áFcáM`4Vª]2‹½VK:]%tÐ}lj[mÂÛ>½tɾFùöCÕ= :újʳ¸=ézš°:j(ßüçT^UNÃ|ŸŽ)_اZÛ3Oö(\‘qºc碗)–ÆÕÏb›oÛ‹³ ˆ¢üŠá\ÝØåîðÙ"é´&ìÙfÙY[Š;"·ƒ“ø€áΖÌÆ|.‡Þ‰«×„æ˜~#˜ñ¢QMBtžCD7HçÁä¤Èòu“ žLqYcf†.Ý]Ü¥"(”–Ú›&Ÿ¢Ô`Õ$}dŒy¦µ}Ìý&#ÏàYZbþ I™™\>tX™*’Ò„œ¬»·Øp®ï í'Е̉H†Hçn ­Ìnue€Êü4Fnpu<î6²èrèv9­ šrÿ®L‰ªCˆº~xÄf•Efý })Þ“(jÞÅŒA¢pûämô@sïÞ @Ú#–¨öˆAÝ»yàhJó÷%µõ¥ýçJÍ)ïÆ-gò{á¢l(ëeBœåK›/ >ø3ô™úòŠ6L6 ¯΢d¢Æ`³ïÐÂh溫É^òàCÓ †.wÄnMGôDõໂ2#$üôkÑfí‚UF±b]`J.\q‘òêB‡.®¼½LV˜ìèPêhJñL$í»Á¶ZAiMDFQCnËæ¥¤ËÞ-&ª&Ñ‘WÑY+En¤Y$ºØ?²Õ<>ävÁЗPÎA7¨!og®~?@ozE^)Ó=R™0uòA°Jqi] ³M¯4y×}ž§Áj9·SîÐîJ³j2W!NøòŽôÒ×Åc+¥Ýs#uuŠ¥aÝm³6ÜÈtðyÎñ®»B¼£Ò×r,ךhn¤qáICz\~Ü · ¢L; ^ðUMË7ÛGQ¢YckòÑÙÀRÝïú»5ðu|€,y¶ñÄów=ß‹ OèÖ»Öžü½Ø¨˜¿æÉDñÛÖd(ããuÚM§Ò((·5#¸qûªÊnJ£ T+@Ã+ݦSüä„N$Sͨ&—èd_øUz1m˜åUÜzT ì]{9Ї)a”SHsâlöOC®ðQ™™°ÛÖx‰/¿¢;ÚÀ«½—x(Ô{¼ŒÉäŽV9Y—Roú¬¹…‰jF­ŽÛÇg‰'ýjÓêO˜QÛZi?0«é«ê ¦{ìõI–çk©ŒI÷XúÈ#vÆ¿ö¥8<-‹’Ií¥öúb:+$?çiñ› Ùûêz©c+üuˆtƒí†á²·Þb†H I¾`,‡q*.ÀcÃZ_ÌbÉx0?Í:‹#ôUþœ0š¼ø’åQC¾¾®Ã,O–cÂ8ö}zË<™Ï†xoÝãÜ8¨tyìÈ&pi´»FÎöÂ:|®1¼áÎÀ¶sÒAàY 0Gž˜«Òýá*¹¸Ù%Ï€I(ƾvÙÃ>æÕK؉/¾Ëã¦ìööèÄô8Ž›ÍoùÚÚêñ"8'úþI5G_£ëJ˜ ÛeæC³wYxïÆßW`µí©)CVdÉÏ•ïÌÏ`Ã"årréTìrŸS»O‰vu¥w}8ùÑßJr£ÖøÍÕ ãÅ(Ý?¯¸7ßv¤?³þ7Ên|¹y®W@€ùqtý=ùpÇAÅ»ç–õ‹?òá&ñaÑÞñ ]ðlì>% “¶‚?Œ¦"•É%ŽôˆÐ)D”™1ætŽ6,AÚ³ŠrÚÁC2ÕxÖ÷ʨ³ó×òRé¶’·Ï}VÂÈ*Û‹²ª=øT€G\}M5Ê„ 3ʘA™t“O$W™PåpzM (ë›ÀgçGi,ãdÛö.Xè ó¢?"ÿ”ù|S$Ò,¡ÂM„=¬î7öÚA)"]ä î½Ç#5€qBêž—Õ ±úûm쇚¿¸¿ÇlLg>‡8]Ÿö$Âl™sâÞ%B(˘i`iÆ ¬€á˜M:•н“Ài0iu»½ôqº™£¡T©(¸iÌìƒI =÷ªWa—iŸ´ë[;o¿3okÐj+:Ç1¡þüHzgîCªJD³t+ä.ÛëÎØP0-ÅÝ[_>xBcy•ln:bâwt’µº9_­¬1BÐè?#w29}+É£]®aJ¸my$”¡8±H“ÞRǹ¨nœT)SlP(’¾É¦’•™´}™£Û±‡Þ.=Äl[½ »äÉvÿÂjTv¦I—<…\c•P²q£ <I̵„Fæ`3È£`Š,ðê´ª´£€ßJWc=QƒÌžÁty¯¾ß„F(ì°c¥´¦±´g†Å#Ô¯8áÂó|¥`àÆcù娜ÇHœaÖç‚“ú˜§Ó€ò²Q¿FÈdlÿo Ç€à€†+}Ù á—CqŸ+³_@>¬EÔ˜üÆŠrâ ©˜E‘ŸËA–_lµTºø‚Ü>Ÿ»ãÇ©¦b^7Hyn.Ož´åïm®ùܬ2øH¶tX³~äI¯/#Í+à­yÔœˆç-2ð•Õ *@^Éüð4ÍsR·Æp~yMUa»ÿÈ!Jȶ ¿Ò&èŽY‰ø$Ÿ¼°`±ÒE6×™K>¹n2ÜbZÀ½dÏD¦Ù§“ï ¶ïyf¡<!)«Q‰Ä†Ñt…JfÕ‚w3Õ}Œ,Û‡§¯cJµy• S(´öF–pëwujõ±ò´*:O6ÄÙIÛ8AŸÏE­µµyÇ VJwÉD[ó5UÞ&[ÊC—^îô¼À6Q7^’C…¬BÌŒ\o‚¼Wbœ{ì|ì¼C" aTÆË©IÉJ9ª²|òwç6 *—¥â0Äó¥†\Ê-sìÒàCèðÄŽÃʶ¤^ÁÇ%«æ¡‡à³‚.ÀÅ:p« Ü4ªó¯ˆÚ^G»nµ©òì‡k¿U_å[Î †“c¸j ®äK l7Å*Šà¿U‚A9Äüü9 mº²š]¾Š=M¿kŒÈGˆÎK¡Õ“éˆgÓÞ[÷…&d‘Åm$d;ÑùÙ+à>WW8zè¹*P¼ÜÑ$[»¦8¡Œ§Õ޶é`jŸµr¾º#ÎG´^d@MŠERŒÏGerKÙÖ]êMø¦Þ *¦WŠË¤ ‡Pf"X@ÓÌ^Yœ„¸3Ù2&•¤t)HI›úý5˜[7ÔÃ}Á„ueÖGòéL1Ð?‚Dšêþäþµí¢vØc6‰˜ð²¤”—«áÞ²7}Ÿì­8Ñwǽs¼)õÐyêk—†Ÿ±Ùò>á&…Xz±Y}•©n<ªíBígCÊÔ“Gmšì¶ŠMiõ: ó—§&8o ®¿ý}L¼C!ú ÊŸF~[,Ã}®\Ê‹³b©F!Ö‡ìnôìäí·ë´“]½Äœ2@?ÎIq:áØTJ .qœŠ©!ÈK^O…(®5ÊNuÃÖbëÃڼРDžÖ%+IÛ…íÎBâHU9̫͡Ÿn4o/¿Æð½"W8Ì"±§\/!vöÁ“Ûé´qiOhâ\š°›"Ûï÷uG·J‘#ßD³˜ÅîÒVØ0vv¸S£îQÍyï¯<Ó#c‡§“æÕAHDÑÊØAÄ?+¯/úÉ@Ô:”  ïŽU™P阾XOOʪùÏ55Î@`žhKFTý`Ùp‰}o‚fÁÑKV1õX`»÷.±á =¦V©¾MUÛ÷rôðá}Ý4nGºÁ~Æsãgâûì¥üB¤÷°ÆÏ›f}leÌ-ÓÁ²,Y=—±ãà7ª w“'Æ‹RÂ|æ`½Ñcyœk¡hï‚ùsM²ù̆ç#†i3ºtE tôæÇÃ3ßù^0c¬× ï&©_€gwž´ŽH“fyš¿žmÌ@Ø%û.iÂøÖ  SCaõmÊoÒxšžô18ÒKõ{ïÓ×FÙ÷©O-¿M\SeM¼¼'°e›c$Â4€²[ Û_qÀ’Sá˜6*¸ü&CÊðŠ|«$:s€{ 4r³`cI”ÍãÀÛv±#?­,Û3â7ŸÏäéµ»e¿'¾™a–qþ¶l§ jÍøÉk«U ˆöF»ÌçC0AÝNþö‡÷Øæm¤ÞéÄÐd.ZR®õq$kí OኩCx:N1~H×¥K¾kñ¥4ë7R;¿g ¬°f‘1o#­ʨx?.É@\ƒy*™?`šO§á.šÝcwaæ4{á2p¹ù#YÍù½+¢Ã]\6äÈGƒL#^}ÎM@í¥/ÃðÜ“pâ¨\“dž!ôY¶0Ñý»§!N]eYž„ÞáÝý ‚"ôýs *-¢dÀ(ïïèAÝvBÆ_a‚…Â&”òäL0e÷G¦Xžƒ° ¹ú9%ÊŒê(|ˆ\è…¥U5Uäxb«³„+ÎSK)Ò†NBx—Lå^-¦žî¸žÉ!p?ÈO³‰–·Ö½ze??PË]×'àèZ@”qâùn×43»Ñl|é0ÝIˆÜ~~,á8PÀƒKÇFÛòhë6&žˆˆò’è»D†“ÃCÇ2Ò"ùq»|‡È?:‡Z”ÔHZ í„;´£ñUÂVJáÓl¾¡Hc‹Ðw4ï^Еœ6Kêcª)k\óœÃú“yÔFÈ[¡Zroáv*ƒ2òmÉ÷¹îµ¹ñÏ­sÝ0ôT¥Îi›óh9pÎÎO2œË|îØ¹O^»}úâ{ð_ñóL€œ6ZLK¤šyöÃÅiŠ­‚ÎD( î=©‰õkzâ8ÄM YùÓðl”«ÁšϽ؀KÊ7îŽ8ï}¨|d”©fùªuÑ4¦T{+‰êæg|ÃÜ#ÝÝp «2v6’V7ªwe|`ƒè¨é<5QtU}b¡˜Ž˜xµ_É%{AÄg½ƒ#p¥‰x뻾”U]˜R ŸSôY¿rÀƒûÖ4P‹íÒ8+Yƒº(¹”½E¾7ëòõ@µR)D€]á$uq]Ÿÿb =zQ’ö²‡åe#7îÓŒ×íµ 8îz~%£êJUIÛ{cØƒÇÆUTª’8ïKKhÆÝÌwï:gE£ÉÐ ŽÔª|¸wFkc|MÏÞòq«Ñ ±&Ûj{Išh–~kôR¹•,H+{h«²A}Ü„™W›bŽÙò¬Ã>è!43/’‚p_Š2BåQ èÑèx,xЄ{&–'ó²<¤÷ýés›?þÿ÷otÿ˯û~ ü¨ÿ¿Ñý/¿êÿ ü û¿Ñý/¿ôÿSàGÿÿÝÿò«þÿ§ÀúÿûÜÿñ«þÿçÀñÿotÿÏ/ÿÿ)ð£þÿ6÷¿üºÿá'Áñÿotÿ˯úïŸ?úÿßèþ—_úÿ)ð£ÿÿîùUÿýSàGýÿŸÞÿBªÿ‘–üuÿÿO„ÿ©ÿ¿ªú"}ÃÉÅñ¢«ÏVþûïÔÿ‚ú?Bªÿ•‘ùUÿóS@RÊþ¬‚´¬$ø×ÉAþˆ´¤½ƒ“äYI9{'YGy¹ÿkþ~Áÿ_øÏüÿß*ÿý—þ/++ùcü—””•ùõýןUÿ{DÜAÚþÏ– êîîë~Ö•ôók°¼ˆ¬¤4Jòé³sòß°¥Al©ÿgéWLI)iY9I”4ˆ« +ñ UöË”BÕp½àúOš„wD%£ Ò<"û ÑIÜANúψÇ}¿!Ê‘‘–‘EÉK*ˆ9"÷‘ô%¿#FÔq÷stŸ,TFJDFVuÜ©@º²ÒßÐAŸ‘pú3º©£»÷7!‘†‹H˃Ȓ²² mié -ùL›Ùùœuqðpþ]RABDV†ôM*yIóÿ]ýÿGþÿï•ÿþsÿ?º¼ŒÜŸü_Nê—ÿÿ øsý/9Èò)Iõ¿ÊY{©àCêúßæææ¯Å¿llžZZZ---ÿ¼øj¾ÒeàÇ`ðµx.7>òžP¤¦óªÛM#{{CW¹N§×Í:^…^D¾¹wDf~1|bŒÑDè¦5ViX=¼°0-õÍQ æ—ú¿äiôº¨šÚùñ26 ƒW¥g®É–aXŒ…"†?T§>q– ºðƒ)Ã~hk4±€ìbÂ;Ã…lŽFˆ+ 3R"µã¯¨,™¸3ä‘lè ÏwïåTò8ªF,P+ð1†Ò2c¥}›kE–cðÁË„G9Åóó€.Ü rRÁáËÙ™Þi9¼ §/åÒ¿ñü¸×Ck8÷ÞÒÅÌK-¾\v£üÇRËÖìÞJ»½:P¾\¿Ó²ÿ©áx{2]‡Ûž_»Fr^ÙbfG›û;ÈŽ–£Ð§›\$®tjSÞ°G¢³\åÜÜ{9/l×»b¯-|š¡œáöŽíÛ¤¯ž÷sW®j9”¾©Kk˜×sª4v,ß9æö‰ç7™š«xA™äºðy’axž‘9üø< NRÝãÿ—Ìíîõ®ÍJ €€DZEÝþA\(HÝ µÿK3þ¶§vÛ×Û—`ßÇÖiÈå6‹âiý6•1õN%݈š²Ð&hfÃUFÉÖÓ×ËÆ¸ óéžn·ÞVbt¹8Ø-6Å(orK•HP'ñE/6‚#W˜pgÊ]såŠ{ÓâÊþÒqçB²› Ý;£ª›Ý¯a¡–spl‚D¤›shµý˜w„”x6^°ÁõÝyGØÂœ vÅ•—kƒ(ø9 ßKâX(fmeª±ØgqôÇæý®N¹CØö‘Û;¦êÄ‚PÿÙê5bAâ7Bî¬ÄìJ‰ZØÔ[¬Zo>O7 &V #tá<$(øÌ–gãŒÒÄ^âŸLÜNÍ¥5=©ÒgÉêë[ñc\„s;½²:ØÄÛëwpé -/ÂŒב$udŒ&jÿ¥Ôk—εøs\3FhHâ~zgñÚ¿Vn4»C쫚úoÕ„fe”Ñ*/Êãý¦;tÆt{ýJTc¡Ï/‰QÝÂÏËø@áºV=ÁäÕRå%{7wë«FÛõ2tÄŽ}tD_,.HswÿÖ';úZOÎô ñÿ§˜b©Ëͯé@ÿà!ùljéùú_¼\[h"›ø$h‰$ÂÞÓ#õ>Y—Ë”ûâÜ$ƒ‰/èXÙ1W ”Ù+®+’BÌëšeüêIŸ]J§zL9 KÀ‘Ú¿všò  l,YשÀ1’ˆÏLZÿ]#öÀ>Ó =þ=‹™˜YoRca„/ÚÞ?Ó¡·8ÐÀ¡Å7”¤¬ÝàøŒi¯I°µ"ë¿3¹“§qÛÈTeÇ"ÄPYYÉañܰÿv‰ªé• 6»`@À_ÜÁwÛ³X¶±¦9yk1)ßx;dÃ…dcYyÃÃü¤xî†þÞZµôiÛUNøBuÒäN2¥T⇷”u@€"¸ A@N ŽƒY>¯ÆBoN‡~7“~=ßýºp-ˆŠ‹1[¥\Iº/’m_&Žo=# ¬“¶ í¢)ÁŠ–,Ëy¤*7ädk)ÐëMÏhˆ‘Ê-7íÝ¢½ò½õóü­p¯y l”Ç÷E'øø¬Q&YÞÇ–,?}ŽÇÏYÏ­IåÁuáHlHðÏ´êMÅ‹Í]ÕñyvêrÝIEÌÿ/ý‰Ð/>”•1º*ré±¢‘I†îÔV¥ѽg K£¿ÿ¦)âô‡}DM«…–Ý ºæ¿¨ïf[·Œ'®Ia«öû–úpŸ¨~÷úÜ@âE‘Ÿë7ÅÒ [ð· ˆRiô d_5)%ž{»(AëRzGÀ›½Xüà•ŒÀù©B–ïø»w”$ο¹Iõ÷þ&øÑ»Ø’žŸ%Òë¾eü…à+Cîæ^ï>J ™$l2)OÏŒk‰/tÎwúÑjýh£¼zGªßú“”±ºÉHìú xõ»‚H„‰óìü>œÞ4 bÃE*&‘fex4…íAgŒU«Îëã!—/'ûk|5Ø™^Æ‘¡U¨N_cK 1çSl˜ñg ÍV¾?,îËHÃôN ëõŒiôʈï¦O_ïÓ¾¨O‘T#–ÿÿ'R*ÿzûÌ Ëýmù®o¬ç?xøÓ«aÒ5q•Èî<;øá0±~¥_4Qü=l ÅXOb»VK1¢#»-ÅUEÕþ—$Úu–ûi€¼¯¡Qq?õúUyL}ÅúŠ/C%q®Ä•»ØƒoÀ|qÚ§­z·7Är }6Á^Æ£7›4¤&ÿÈUúpç¦5xb{ЦI›û×ð úÖçûŸñ!›ªÄil”ÑÆ®UÏùw"›Z¹‚„Ì|U¶zù'¼‘s½Hófy©OG$ŸŒä¯CõðºCgðß%óyfDn uXüΉeÀ*krW¦²;‚ÂüDöÝã@Éä OƒÎ^ý—».xõ’‘®ów1×›•¯Üu±¿øß>`fÔ=·ò)Mžf|è 'Ëšòm­J󴃇uœ¯å޾Q¸r´8‰º>±¥bÅ.;èÓ{f~êÐI•]gâà å¤wʼ7ò¾ñåY¼2\’|#½šûœ»?ÏŸÄ·š›‰všZxY…Ozû£R‹-> ëKvºùkF4$ù;½·3”ã#X6O³Î ‹n  ‘ÎÃwµàŸ8:è Žu‚7Ÿ‚DȈè,e-ßcéÃŽmX[îo.ö«C Þ$B ­¾5ÊÒýßp}Wˆÿ8¸yxR‘—OíKÜ Ÿì^ßïpðÍÁÓwÉÒ¹í¸¿ï9·se¬ÊèAæË°ƒùž>앳­#Øg¦ýŽ~”ôO‚%ä¤dp;Õ€Ø,oÀµÁ_7x%ÌiÈ gͯâWæuÐTa$Š"Š\ð|V“ÝõVCâV±+õí+ÿ¹Ör¶pcÅ’/‡;“AëÛ ™‹yä;r¢ñ}Öýù)’;´øÀ…Óa¶‡6>Á¤Þ©änßûoåµÝ˜«æRU~˜æÆ¥c¶ç¿{•ý;çÅšé`†bú?2”#`†r”¡¤ÖÎìŽäM#7³Û0cVÏÀq‰g³:ŸlŸG›š¤P)±á1kXÞ~¬¼GÿÉï#Çܬ|oúTOÙ ç­f&VWØÔªÙ6Ø´‡Ï€ù™5 u¨„f'©ëŒÏ]·•KÙ» [üQÌ‚gôÎʘÄ}¢Ï±äA‹•Õ"Ñ»o¡û¼x(›ÖóŸ>~IXx[‚–7!2ò؉‰[o]§¯ö™›ÎSaû/Êþ;ª©­kÆ * *J‘NA¤‰ˆ$ô^ƒ‚HÐBQ‘.élªôšJi›Þ‘¾é%´Ð~Ásßçœ÷ý~ßxžïLj;kͶ®5ç5×^ü§Ö=×&fä¦åäÀ¦øí(í$’”lÕ€ð•™RíÜÕ ÂyOŠžõÍCuœ8VR¦HŽðç—0¦üÔ¨–d?Àí9ùË8¡¹ç6‡{¡yYˆ$&¿ªàóÈoñ¸_çˆ8†Æƒ" Á¹—¸ß(.Ò§ã'Ï2WOnØAm©‰6 ;mAå5U²ß&F¢Fi°¥ç³÷éîueSßiþÓñÇÿûé Õ)àäêå㪊ôŸ?©û{Êߥ$Ù`Lo䎥«üóÅÉã1Ù>’ýŸÇ»Sš¤¢í½÷,ÇŸOÿùìË"Mú|êmü÷÷ZYeP[?a¨ r¨&üºrò ËV è;vÅäA%Ž]Ó^œeÐ?5 ^2RnÒe7›xÐæÐõ7Y¸È,aôl:¥Ë)^Ï hT8ŒÊ‹'(ÙŠê?Áë8þ3P!0ÀnÆiÑü®QqVÆ#bX—#MÉ&£˜7óÿ=¶-B‚¯Úg«^ÖV´EÀ0Œº]e® Ã0‡.7k¢q«b»>ì„ëŸêòÔp®}¦?°Q‘!ú#tãý“m!¼¥?Ý¡(P×V4TQ» Š sÇÕ~‰iHõÿ“ä­€®a”6Û¡KÓŸŽº]5ܨ¨Mê°ÝlѯˆFYk|³".ƒ$s8E Û\uÛþåÀm{î?s¤˜ß³aè ^ñì\îb³=y™ÿK÷¾ÐGŒ-®ƒ¦õN7¹ý“Ïa°$ä4ÿ õ:ìÿñÀäÿŸ¸ø¨¿ÚǪX§ÛãÆNŠ´¶ÿ‹“%õèÃßÙYiõÎ¥—Yô'<Ž[̯ ¨(¼SŸ‹¨oJâ?›&÷\OU¶¤5þïéd5‰zcÑ\žìŽ¿ú¼ûŒªÁ>QqkRø®“ý q·†¨¿Õîf—¨‚ºd`)î{úœÊ_õ ªeO¶2vž5ªII$èÒß°xaÀÉüY ±ëdêß_¤Èö”hL1Ò÷ R‡þõ…ó<Òß2^¨wþ÷L²lˆðh0«X#äþ£Q?sÃõ†É¹èÛ¿óÝBs+2iÏóí¿ý|-_49É¿·t‹“¿£V«½¡þ?s¦Ü9Ô`dϤÂç/±%ȫǬûygz ÁV”=•S^¡ý_E÷´>ݾ+þ·)¹i‹nt¡GÄ¢£s€²UŸ êqË1ªöïlFÖ•ˆûÆÀ,8$SrHý—´×<†QNñöA! Ú®{ÚNxý…ÏÍ TTªA¿Ý` Äù‚l97[ îžØ!û“ŠxªoÁ‚|i ì Ëåõ\ÂŽS[Éÿë¹Èäû}1;ý^ ÿ*˜òËèy1fÎþOóô¨Ë&à|ú½þW\s=lÝÂ0%ÏÈÝóçDÓõ$®ÝÔáà,õóì_X==×pR]ÿ§8dcÚˆS/ÓÓÄ»8”¼þ®$ÂÀó¼)§}©±ÔZÒé‘°§ž÷œ8Ϧ¯xSòŸø¦¥ÜÂ]úr؞LJw”ØFzŒ†~°¸ž8ú·O:£]Öù@´ßfC„DÞ/ò^—ë/óÿ#IŠ…ÃU­Ÿ2]^_(V 8ûcãbËŒO¬þ'ñxÕÈ©#ñ*{þ ,LüßÖjBÆ|ž7Dïû¯¥¡±Ì°˜º;iz Üh}±ä g¸‡œ˜úǬŠ0ÛIcÑÉúÎ> ’Âð=ã]Yh½û¯¸=|pã>ÓAT Nìÿéy˜Ü ÃÇ;üõöšòÿÁÌ¡cÆFñ—KTãZÉ\Éþ ÷þ’”?`Ìý#pçÄÿùÑ•Í$ð¦ÏçH?[‹Ô%uÃ'ÎÛš {#ä®$¢ÂË®ËXÚ<¦”.¦”»OÐèz8Ùw–¿håHa‚×í3~Á˜%ií›MâP>ŠÔvþ§¬@3›{ÅúEq(ï~C ü+÷=EŠúp&|#õôìLEêéÈE“Åbï£îyÇO„o\9 à%*v%ßó–ªÀ#œ}䇿Å:ÄÆ*À¹Bgô·­|ðÔ}ú° lŒÒ;ñ_4ë‘Iýò‹-÷\P«üåÇò T6H#޼#õ¡ÀlB_¦üßÛ^!°Ùn¾B‹_Êsþ9©\fÿE‰(Q{Qu"Øš; »´‹á;„Ð?{ŒD>Ð鍨‰O»Ï¶i+ ÇG[œ4¼¥Wå§ž)ÿMWµ—<„%Ã~9Ÿûûw>n3˜^m°(yô8ùtîëÛõXÿ±äw¤ðF&5ÉQÊÀHáò훋7þÓgʦ²Sy.Æ(õ½Šõ;÷l,îä ῲ*¦Ù£ôá•»*RÄCÒØs`ÙiˆÕí‘ ž:¹ cKTØèp{L,Tò9y\:ïýµ>)`ÓëÝgg4_a£ÛÖIß‹ªoÝ$57Âǧͥj¢”FݾŽÇÏÑýoH£ûŸ}Nø‚]0¶P±Ÿlm/\úD*ÏQ>ÿaCI HQåg}f®¿eår*_6Ô Ö[†êèø¿¥‘†œªñÊñi˜ìc| AŠì¸”_;ΔgwÏœ6öw¬.ÖV½ ]þÞ™ï:í>½!üsÖðCñFÐÿ¼-ø$8ö^Ë/Ÿl‡ã2ƒSìÏ}úW’º‹–Tê²wÁÓ')aÙMªÕ‰wøÉþ•6ÚœDÁ‡þe¸"!âR­ÈÙ?0úWªþ üt¿oû{à2´:~>vxE¿t¤„3²$«:bIi¢ëä¿Øúi#Í3}Ož67ØG}P=Ð…nðk@]lß6 ,Æ=ÿ•É3¬žë-hqmègQ¹î× ¨ÌAq)/ô(šì;ÝŸt“†S¢@¦¼`uˆÛ‰}Ä“rwÝ$½Ò»òªºö’äÌ=ͳ'ÚÿR~elu(iŸíÎÜ«kO¶\üÔ•‡ á­œõ"ñ]Üñ ¯¼¤µK~õŠm–•ËS«´¥jQ*ÓÂö÷T6Áôz¿Û–´ÓK¯À p£E“úÝW¿®å¯6 ¬lü¾Ñ€íS¢ÓÿòHêÄ{–/Þˆ7ûÿÌg$×õÉÿ¤S]Ùÿ74£$]Èw‚ŠÎÏKþ落Z;CøùËT³ÿ“ ºÂì@>°¿gßáãÙ]è.bˆ­ΪöŠ™½Ðx*@Æ”Öÿ+ÁðGhuˆ×3Ùíx*‰vÑï£h÷â>¦*írýûcÖEùß5£.S‡Vp~¡xŽ¿ØÜ´÷4÷¯Ô ï\)ò„ùÁ?ǦºgPGÿ“Œ.vüðùÿøþþsíত·÷‹8¹ðƒÓb'ŒIDà×þiÜ«×ÀÑ{I¹$ꤢ~øÞéõÜlR*×Y¼u<êå«góÍ¹íŒ ÑUƧÎt“a˜$}‡ÍÔ%*Bßò~7mLÝ£3ûè|ºî$ 9¾Ôe¸þÕˆiU‰Nò)‡à:¸ÝŽ¿SÎÔÒ!Oó uØVÈ!½+¹¸î•\(ˆ[kf–†|äÝ=§ô.]¦ÆxÉJ1Ô,Šz s{jŠÊQ¾ýìÆ<ÙÝx?pΘYþr’³Û‹$üÎt¼NõeŒ×cËV/…Ë}ÖŸ|Ÿ«kDnÅvëLfĬ¥Riaª8Ñ’INšmg ga|{÷„“ƒ_,:0Nœä¯Ê&LA‡ÞA%‡ïºc8¯ ­–3JÎÏÔÊb«Ùët–_ªª}Ôùa·äuöð‘ÜE<#¸d]ÜÐ^»tÀ` oøèbº­‘øÊP8üÕ ®ÃKqZhMíl q!ÑkÔº,ßµo˜âÚ×?vÝi¿íüü–BŸ²šÁlÙ:îhÞÊŸ}ï¦ßßÈf¿u¤£ËÛó@ù³‘ƒ`€—Sm`3UÎ݃µmCKѾwÚPQÕêœñgž "ÞÜã‘Uâ9åÕ}9ešfUŒ5Ó=ÐÞ[úæ‹9<•ËÚoЧ<¹%wÃûÚm¶¥JéʼÿZ=ëìdhµ ضãG÷8­Ÿ½W¬9=ž·‹‡Âs¾Î?dxz?ÓÚP?¹(¨õ{[j> jïBÔúÍÂCE@œ÷öÖEþ(é¶¿j¡dÿêšWä^HÑJ¸n¡²æm÷i–ûÝë+êFhÆV~£¢ÓUoB•à{ ˆ]þCª•Y³ËÛ´hÄòùÖ†mÌ虣lÙJ/šÔÏÄnI»Ûâ®™ ”ÂhÖøï|õ͇tä.åŒMÊ'³\·$öÕ%}ìS6?ï>ÔÞ€}<‰Ì¶”wá1«>,å?°H>ô¤ªÈ¸º„©BèaAFóÞrº8º¯ÍYFQIÍ÷*ü…V› Õ?‹åq¤Ùá3úñkåÖ4ÀCßýêBŸ>úÔ˜Ï7ÌœÀy<ƒ¨„f ,ìU•¦Gaê³qn,þ2b×ÉÒ½å ªÂéh×O¹f+ŽsÁìçÝs Ÿ—ª ô××5/½EŒ†›f®+W†?IHH¼a§Š>™uõq#Ù™þI™*ÑöÍhF׈szs交oÇTДŠWsφV.;´•aâöê.™§óQèÝy ãª|?C‰ü$`â^MõÒpäðÇØXl³C²azI~Pà…@Vêü’òåßS<;#TýìüûÓÌ‹P­¼•ï?dæ^ÐUÞM²ãüm‘q‡âºg‹¥¤X¨÷޴ѽ9ÎSòœ’úû‡à;æ­Â,Âm½o?¿”˜¦©Nx—"YéTa#FŸ8jêžåªdºÎÛæÃsôÝ@èávTFóã) H¹:éTêÃÙ%‹o­<•Á Æ1ï={UÐ:Q¼!÷ n™kBŠBj¬hÑ,fï”ÃÑá¸v¼xÄ!¦€Cæ z”aŽqRËc,±÷ã ÕÞŽ}ºÐ­w~È Ö´ƒØÎÜψ7¾Î†hÁûIS¢õ/Äí3êµRôÛ¥ÅFtƒ/çJ%‚=Xr¸¯­8ƒ"=<5˜¼8•pTëWÞGÀsJ „t¹bnŸïÿ F›G Èõy),<é}'Ћ• ÿ&Œûi?§†®SœKlUƒº~cFF/êm¶œ‡3h ¤ä‹PÚä°†C=%g’&ŒK•FŒ …£¥ÐPBµEd±Ü^§øHc\˜ ‘iJTfOæJIbàÓ@@Õýœ¾zÉæGzéÕ6uR¥´Ü¸¸TW±àÇðmœ~sì/_\ÂØƒS³v”ç‡[9†`zDÒ:íýdB³þc5û‡yú²Ráf sÊF X¡–pww­¡ˆµ.»ì„ËeúF¨Z~KlRÀWR},vJøª‹¢EôÛ“3+òÂ[G•ZÙÝÅÁÄwó}"—Æ^,A‚ 'µñêÌ×½Æy, ´,»¬‰Ë½hœ¿.Œc«üy¶ö–E\r?¥å•çÍÂãJ«—ª‘ê¢#ýÛ¾¶bèeœ­Î6çW¯‚î±{¸-cÍ:@^[rߨ{ûeeŒzf¨º¶69´²ml)ôŠiÆv!C(×–4¶+]ßÜhõbG¡]‹d€{‡õË›ôy—€¾¡·5qlÀj!UX`cÔ‡}»a44õ;‹ÒN“Øï$iØ;Tðñ W8\°Ubh¥WPµ¹4¤‚.ê©Nšw0ˆÙgr$_¡Í«g²âZå ·à+»ß[âÑs‰¸ªëð•¬þ`½–þw UÖ¾¸Ž-Ü“ rؘä97 ¼F¤8ï.GH|“´´\©`A L“<•ëôN$;…xøM(á9…ó4݆!-Þ)(ËW¢f€™Uh?‘-¿{®dSµ$ü«{Èű¤©Z¿;§Éc8t îý´œC½[·þ iVÇ’^qã)3ͨP]"ÙÃC©[ f~Û¢ã5lB2b§mÓeMlÐÖ]0Ó@^ä:øÚÝ#},D§~0i§æ&mûU3z•ŠAQíŵ‚`Zå |ð ~¯tlx·v}sÒè}œºûÃ寒˜Ñü8EÃk Zh§›¤­·R³¥>ÃñSýk™Zh›`ëí°¨7W¥t”À¤bÖÞo„ÁùAøæiÐPc¬Bàøi>«Ö7B³å Òæé2í7€ìOMe@Èð’¡é7mÈ©§ pá …µ³Rl7kxž,7Ç¿þšÑ¬“ff˜röà¦^‘Ån“2áۨ󺙠U†‰È&î¼:ñð¾sê÷©+Wháí 'IsÌãØ EŸÊš~Ó€®ô¬žÞÄMÙž“øF8£7 Ýõž®[½Q4©|€ì”’'XÍÛÍ=Øq×aU扺ýM êé^æ ÂL9_Š'D¹%ÿx즅ÕÌ} ô©•ôª|þkJýÀìº)³Væ©×S"„A"èC-âÙ·_+{§>SðÞëc? Ï ó3MO¦âÕ@s»ûÒÃi  ƒ®{M?ý‡®Ãsªu4Ó&Ú>¡úî`³åÿÆ#þ|: þ®›ÓºîT„–;6LnÄs [ý°ý$› Zµ[5«Ä<Ë.B"§ffFz³5½¹N{7-›rõ o{Än¹±:§íˆƒYf?¢„ÔkjЏ+à•rt²n™„ª"ŒKOÄèFVÍüÂÁÎþÔØI`åyŸ¾Y’Ù]9y4¿ ž©¤ºÎžÌípKC†í14@R'aÚqhÙ` 5öÉÁSî䇖ï)Ô¦—W®ðVM.CÅ”™>ê1®6ñ%3_(%yQXRŒâj–(á+1p³öž.$º·ìŽ 1dZn4SÓ6hó¥¦+–yQbùìLy-ƒ”~?šò>ß5⇠TCt$Q  !ôÉòhˆé’ °Óo¶—ú'—WÜ ¶˜NP–IWmÌѼalV‹Øb_–$²‰± -ðÝ`°%§mOHûn4»Ú“…"ú ç,ŽIAbX¯¯æIþ"#N:Þ?FúèíÊ|X5½×T+:¥ägýþµÝân7•3—®áùf/¨ ™£¸Œn76Qý¸ä箽Gô°ßöh°x vúë„~Þm€Á(’YH•žk$GAX„è ØšO˜o=ôêê;²!g˜9ËÁ†ì={à ÷qB hˆxÒ×¹”,³ì’)ôp»º ­IìxªKÎã9o{I“–Sü9°ÓOŒ.ñ"*‡dÝ[ÁŒnøà¤7;dÇÜ5üÍ0p#è{`±Ù\~?W)ð‘¬hC:¸sUMéEÁ0” ÑtJp ´Œ<ø¶áÅg(¦ ø–Œ4ÔõßCéZ_ Øäª\ $çKA*DæÁÔÛ¯fDr¡A¶âÃ|׈YbÀ†þï—-[#Ã6ë+ô“²bJHnˆLr<Öý† RASGqÚÝ"í:FfŸ×eEL„á0<½¸Eß&Û©©­«§‹ è;‹A’Ëj'rc8Œ`†üW[­QG‚šC[*x¥¦Ö³@jjp¾+޵þ;bÃÀUù”Œ;{î‹!My†ºAûÙ žo†éL¿·>G•%=Š¥8*I×Óg‹p•^[PAÿ¸2§Ìöþ\Á)j8;3S.øRúêCY#ÇtåýßKwGI¦<û˜ QA[^çô¾kûª"h‘¬˜í}×·3ÜÍx]Æ7-môä±Í±1™+dÁ—g"@&7¨ÜiÔúÒÎ-;Íl‘°À–+Â4^6À °ÂUÌ”@¨RÃRÔ•ö!Ì*La1ËEQ?æR@Þ Hþt¹<"ÌUÙßì.ÅkꟂ*nÛCóyFÀs¬ø*{qß½õXŸcC®pUvg¸?á}OâX¨£e{*iƒì Âé‘Ï,\…·É…jXÎéÕN£ì<{#æ˜W0r®©„%*2«Ô¬Pí*W̱£iù˜O*hx7â5°2ѱW†!g늫ÜèÞ|†bBêx+Yº?ã}ï¦%uÀÂ´ßødï³cb?½j&™±é?È1^Oý©tñ â[AC¡Ú³é7 Ç•ª‹ñ„{pëg\âL­ŽD0n˜¡Õvª¼3C¥ƒ%×Ï 0蘴[¤Ü¹ë¹ô^P|•œ½%"ÉA=äiMDžÇŸi#2f¹8ß> W~zÏÔMçÓkïÈ@M(}£«úø éܘX Ú‡_·lÉÌaRÿò.9´ð¡ðªõ)áÂ@ÁGÅTnèk$ß}ÃÚIÂ¥COÚª4B˜"‡âóÖòYéíG½Èìs¯<öL?Q5V™ ¹qUU1Øš›º)»ñŸRcòßi%`†¯º‚YçMM׿Xçe7ëf-æü,~‡n¼öÑm7 m1ÒØ¶ì.ývRŸñXðïG•Ö øˆÔ5ë,ž±ÏжµY'~™èƆ®+zÙ ‡ev(¼ˆ¥ŸÒªÄŽåÓ˜ºØ§Ký(Ž‹ƒ·Ø›‚3ƒTpc©ãáð±ë/_8XЇ6`l~¯÷vëË-ßU@/¬W>Ù¨çmq°’ç¿´„áx.¹AîÀFL}ö¿Úé()tñI÷¯|UÊ?"$Ò9*B*Ü<¾Ú^ÉJ§ _ÙmÛH ÉxÊ‹8 ·jþÔ3¬LŒüùH 1)z­lº’00„óîd160ÏQA¶á%Š69оú ž ÁëÒî»êòú– Š)”ì «p森¦ç¤,Ž£—“Ÿ¬)ʈXQlÉCî4KLôŽ{«Ìã¹ð~ÃAcyZ‡È3öJΆÏPœá`T›mQK2ç¼UóÛ¤ŽbeRÌO’„¸5AX×°"ëýJý­{ÈÒB®yž—H'¤³<ÁGñ¯ÄRŒ´4¸ÜCv;æ½ ïÍ®pÚ¬lŽ[˧ïè i¹[6>w ˜am9ù¸Säd‹˜Ì4Oå74Z^ì½èO¸în¨h‰W&%ä?Q#ºÑ-¬ñžÛ)èFû™¦!/4}sF ®Pý weÃÁ;ÓŒY$Þ71Š®,%cêRý‘⨢ÁQ Äü¬à>‡±UëË$‡»¨ªé?†Ö,Òø,0Uú/Òì`AÚœ= gdk–®ßÑv ]ãJ@v©¼øÌ} $ÂooȬ ÌD ÿš˜z'>‘ŠŠ[Úuuy,\y9 È@ç¸Õ¡Óšî×y̸)›Í·B™rv†~Kޗ«Ui($‘§×+?E„i‘L±Þÿ‰ïp—‚ î´·£$}?y=ãJøÕÄÍ©ÇÒdï‡íXÓïª}îª>ž*Úb¥+«&ºÇz=ÁÂ@ýåK“Zvmt“Á–ôØB_\dË"ÖXOv0\«äw^Ò¾öKç,F£ÓjÒ‰Çú+Eä¼ë¯ äç¶ß€áêJ›§â~žRNjà Ù_†Ëéîû¶ÊyO•æ­ µU b=X^üÞÔ;ƒgíÐAKÛè&‚é_oªGá8Êú³ç4 Ì»«ù‰¸Ø°r7ˆoÏ@âçÏ…`¤èÈ-5Z¢x<¡û²úÃ[æiw¸1¶A@ÁœMQæ>h캌F2¹l€$°5(Õ,h.{˜@Ó…¦>p`ù³CÅBkäî¤igóïp¸Ë °±è¸v–2§Ï¬b•ézôZ>¶ «‚~9ÈÝ:ô#t†9@™§O(ĨÝ{až&¤B ë3͘Ù$ŒÔž‘ÍÞ"MH5–²C€ãê9¦»"F!ž|Y æCøI<×S!Õ¨N ª&*ñºQ\:Vû,ÆKñšnØ’ñ\Hã×Á)R½‹'`0ª¼ æéB¯ªøÜ´+I¢*èS‰³÷I{÷Rð9 !9¬€ÇxÁ9r´ݠ¯Ñþ*DÞóêèKN´AXøI nMpŸé¹ÄÉTÐOôx/,ÅÓäªüæÑüìq"WäãðêpÜhÕK"]]ÖÚOºWòÚ¡"5›`­%ûMª+œRª¶Ó@Ë3Ô¥ÂÖêoŽ}+´Ýˆ›µMÝkâ)z6Û½Ù&öN¹UwínÁN·)qF¶!¢ÑÓw ¯Ž¯ðç’0Šê¶e‡—x¾+øºöØ»½î"†ùm/5î5Ç3v5"ØÍïRaZZnRºNéá)x½áyj!“@þ& O¸(ñû€_“Ê»žjÖ1Õô8µt$¢¼Z^»4¬v Œ”1̯Ú=á+9ù¹pôT4ÀÝü¹\ýZ%Êq±åÜÐáÔò:µý½’M8Œ'X”Hˆ?'……áÄ5Gˆf¼âB{>žÀ€‰'ßè×±ÿÌ3zl›PDUõ±miçîˆÑÎËé &Еצ͒r9àwÈWnù]jjΧþhø8F˜^1Kxj¸á«YËèTSü ÁiÜq&¯zŠÉ¹l¨¬Þœ´kϣಕðÔâLX¾)ÞTp“„‹íM†7 =T¡L^˜á4}‡j+ç«¶EJ<£\`‚UÁ“ºç ƒ©ÿÌè®à÷jDìzÏåN“ˆÀ49L.ÚߦMµ+L°:ÿˆ4uDÌà[Ûɇž›ÔY¨@ ¥! k²ÇyÐÔ– !Ë00Ç“ô=åõõAü«§â=wNÜÙxÂ÷x¡û–[_ƒa<#‘8GJÑ=ív®\îΚî=»A¼f¦g¹ñ(‘û@ß/·0ÛÙc'£Ú{îçƒãÂq®_DËĉù6‹RP˜Ï©–Óp—&$žäÚ ýÕ{È rþÓž’Áþ7R_U|SוoË2U·kñ ¾ÂéJFàdߘƒó_ª‘_Œpýï] 3=¦>ÀéÓ„ŒtåàG·#'=Pô6jFä¼1ƒW·!¼‹í.ÇJ¥HÛNû…È9AeÖ4’éïõtªÞÍï~ë /)ôO™¯IAÒ™Bþ˜ Âç7 / rn"çxzÔžÅÄ|=¥‚ÿ|:‡‹KœçÓó²'êDË-P2 Çl3ºÉkËuÀIu¶›â×Ê$<mÌúޏIö4 /$Ž#A]e_v p'(€¬ vu"Å:Ú9A÷·fߦí¿B1¦ôj)’\pþ3¾ýû 0³@ûË]N7jççˆ;(6'qW´(†™îA®9.åS¶UJÁ¤ð¦hL¾LÊ~Ú™ûVr G Üe—) ½Ëù…p“ý3^ø0<ó#q&xè3}jëolxÄÕ‘DÝŸW”éS_hJfm `»¨é Ÿ[>XÙ‘)½ãZ1xŽ…ÞþðÕ?ºÑø±‡ïH±NΚÊ ºAIÂzFSõcÚŒq‡t¾7ù ޱ’½l^!þO«Ãþ„DO-…ÜêIÜÆQYâÀo ìj *[Ê×A¨±4à™ˆIÇJC*cú®®ÂÇï>Ó´x!¼&´ <Ëz<ÐÅ"Yµ´ƒº÷Ù¡dǬs”,n]îòÞagÀ;ƒk#‘â ã„Òe¿k?Å%~Óæ g¸ôçg "eЊIWõCX¥s<‰ÉÃ#\êF™Y£‡ Ûy :X Z3oñ!Ír}‘±mQtiH©nVôfŠ>|—®.Þ2ƒ{Û¯C-T€\÷éb­¯pÉ}²ÌaTñ²ÊtJf?Á ç)Àjôµ ²l±%.ô£ »©.ˆ ƒÓÈ%NTìíoí‹K€Î£³’­-vÏÏù?‰ÉÓ(ƒxî{Ž˜ÆQbŽ]=!~ľÿ˜ÔùŒSÁÃEŒf™È¹O²ïvì’µÆ?ì´‰ %”±eç±^Ž?§¶BñNÌr #¼Ô_Ô<1üö—ð‘”™-^‚qž­RÅÛd„TyRãkgèí1U¼Ö£ß\¹Ä郯1ÁÍ\·Àé3aÑm}Lè¢Fœiä…ŠR‡®M&—2(§u=gm‘e£lG¸èqöG0 ¯ÝVAó]WGgL}CEE·5€šÇ?“˹³W½Ü±«ˆÉ ÿãPþ˵¬ !ù#›pAöhBH&¾Ôïö£"¢Lº¶y/ÈÙZºØâ‹'Dœ¬ñíó{n±XLMÍyLÈfœë‹`ë¾6!gõù£œòp¼‰Ÿ 8 7VG;7Zãú¸‡%àÕq8â‚sR„üÉi7ôë$Ür#¢¯ft÷ ûµ½ŸŸ$-»0OìéȹĻI ñ?«ùl÷uR[ÛÝ98¦ªmr¯Åä¬ÛæM-Kƒ§â_’Ëö«Üð&ø8æ–ww ·¿+á‰Ç¨óŽäôní,B­õ–nWÙ©}sÅJ¹‘«Üºj’ûO7¤´sòè’T‚ ÙŒS^”(=¥vÜkŠ/Æ(?¡u)©Ûdéâ¸û1‡K|Ó.¤Ñ,âК$'häÇ¢\µkŸ%†ùM_%ªØ>gûÄ¡Aª /Vèz[:ÊD±Ò@m©ž3’9˜“.Bìå‚»dýZ)îjºqá<çW¥¨Ä·Æñ§å¤ãJäØxFœ•]L#gVdZÙÖŸ@,­X²ë»^ñý—f‚AÎ{^íá»úFZøª¤@ºKNz¶{¥¯»E>èG‰gM‹ºµÆk±ƒMƒ9$o‘è`$ôƒS,œq{,³'|¬-‚Teƒ…7ä+ÿãUìf&ñÀ‡ “ݪ>³Àž€'¢¿—œÒܞĮË`k•ªãá1òq«M`¨ÁC2ÏBy)k3ô;d0|Nê¨%rއ4Qôæ’1Ò+ÕV_gåY$$yϧ摳SÀÍ ”½r_ ëéâŽ}rPýFaFçßówûÂy‰È&!ýMD b¯uõÈuÈÒý:ï5$÷¹è,”Ñ)‹.½ÊR!¾Ì怅ÚñH#EM%2ôîÛ˜‹ËØø.új=ÏËåæ‘ãí8ª¦Øý} R9èB+k|‹PéüȤ’Ì`™ R‹yÄ—Þ_ý3S!®q?ÈeCÊ©S‘ÙWO‰ §€›Øt·ê% D¦#±Ì{p•_àÌå.V#¶æ’0XäŒ-òOù`õ/67ÈC:&U…ŽðÎûj^)¨¥ŸÑ[`ú6¿² ¼½I{«äìÆdÉ|‰XIªÓ~¸ÜOµžôõÉÇ´Ó†ÀôSØH®’•v\¶?0àéìÇd_”n·™âD(b Úè|ðƒ)íbm£ïÙ„ÊK9)ÅoSêf×K'*ç3Ò.®y´dfG,7#Nÿ>·:ø =%Ð<”zAÑìË ñ^dòŠr¹•˜Gþ%êi{%º±öŸ’É:;5;î'D¥;ÁêN¬@i}b‰ÃÁ‚ìLüÏvÚ¨C'@û1?ÙºÔçI)g5ažÚ­ çTñ ~×ñºœÀùŸtãÊœp†tèOtæÍ ÀDlå&@Îp2€pI"ƒ[¦ÖωO븬»©¿áø˜GpÊAI`c9…˜à9!õ±«.âdðêÄìÉkz–ž©!xìÚÄ/îô‹s«‹œyú%7^U¼ ,…3´F!¯’ú 4dç^ÂüèÿÌ µà°üf–:'ÿècÛÝ¥¡”šM]Šû£ö.6[¢Ž˜{lð¦ÐI˜ Z'ž0ÿÌ[ˆ8§„»Íì¹;_NsiJ®#”hÂ=²ÈFÆ;Öä¼IGãM·@Ýôøñ}šõ‰­LÊÀf•m]ñùpœ@HØÒêhPŸõ…“ Úur8|lV+ðÑüAŸ’%×|ù°l£»KÜÕ4>àCAÏu°în>S—}*ž€ó ‘+™UIû–ÎãÏ玞}ÿ8;;¼Œ¿6Ÿ#ˆ¼á­_í Hõ  zê¼ÄÏ>0:ÄÈ]] ë‡Ã¸eô öuðÚA¢-3çd<ôáéØL8¥ëÃx L?bÖ­[ Ø¿½ìSœ£{kÅ< ¶NßMdêZ38%;¤ 2n¨^‡h©Ž6dמþæ…úcµ$Ù¶¹êÚÀgü¶Ø‡îìCÞËAC!('…»÷´±­IÑÜù þT‡RÝ Á†1s–èÜ%}5Q¶Ö B²+wŒbÓ£Êklƒ›„§o&—¿,üÀ/Lí·óŒ‡;¿,ø*w mâeÓŸÞËnûµð)ì˜M'tU –ý6«uO\wZüÕ)^–ÇBºêÄB1×#ôëU¡‡G5ð’öä˜>3OÚ¬»Õ÷WW¿q²h5o:½ýn)ùÇÕPrÚ$\MtÒ̉¾i•Qzd’”1^æ}árêÎÐa=¦ýDzŒFîYìøî~WßÍ)ÇcÁœup—ãæAÞ,΋§“Œª—s‡2ÖæPÜó'ŸŽ(ì¹O  RN/9Ä!Þ{t&®êž,hÙY¦>j2 ;_˜œò0†üpÌ!"ÑŒF!lrõöÛœ¹¢/»ÛY¥)¼†­9­Œ R ‰§•±$~fUÙú‹ƒ;fMhñÄz}ýr²v*=«STtA­Wîë¶7^œè¶þ$C=_’ú_v€¾n9D`énîÀ6Š+kd[þN¿ö2$²Ð ΰauRÙiëÔŸÝÉïMD)é5æ'ÆìœŒGwµm å]FÑq÷–èò9àFÚ=ß2Uü°ÞíÔô-¯‚û|+¶Ì*]Õ:Μeî.*mj%r8gŠ®ªÝu6»Ó#ö8 \äËËdu–‰Ê!ñÅže[î5TÀX#‚&°Æ¿Ô§»R7=ïc´³ Ê¢TúX4*„šòNͦ2÷ÝG¿/ —¹‹7úúÙΟYSëèÞß$Õä‡/Y õ¶!WâøÂÕbèéØQ££Ey®<‡Ã7y…'¯|%×}“rÛÑQaÐÜ-z‘*êNÜ3pƒæË¿?Ý^Z8VöÉWÒPˆ8¢Ãgðš‘oUÁ¢xgè'._¿¯fAšéÑ'³‡Øªìöðƒˆ6?Ü$„ßÏú9ÐËÕÂ=°¿íP„¦^ÀCÍÿÔ“â¼É9_4--ã‡E¢7’}ýülÖ%ßð…ÅÙò~eŠQ!킚BÔCØgCÈcþLµ@*ma°kyœ“ÈVCÿö]kéÁaÐúøHÎÉ3öë‘„rmÆ¿TÅ|1D³Y1Âæ±ÙQZ2X9Ô¥7œjxÇXë^ùÂYRR;tƒRá¬1qŽ{ž‹ÔH¡eYp?&§öIl£Ò T‚­@Í*Øí„âhÿ¶ò“3â£m˜Íà­-,78ýÇzR*üñˆ>Óöt\'íuÐBdà.þåaä’.¤A€¿bÕæ²dxˆm‹…`}A*cÏù£oœU#™„‚‡·>¦œønsÇfÓ/适t¯­NŽI»Õ;xÔUäu(ùÝXþõòÜT\ûezD¥&v‡oÔAzŽ$’ øúùb­Ú‚T®ÔLo~-<›¶DéœrJÖÁöÌ»ð|š :²Ã‡¡ ÁUéŠä>xú×D)H“á †YRîvƒ]…Øi†÷© ò]ΨYЮh«`-Jºým[ü1~§KöôzMMtlùý æ¯0á”pâx.²"¬‚Vzá…“ ˜ùÐ>>… T¥ë°Óß2܇C{Ó+½q` î¬DS^š™PÆé±ÝÜwø€_ÜÉ›’^~ü¾(–w<›ù‘ᾄm`ÚœHEM 5ü@N9™iÚ ;>½`Ï^‘5Mô꣗ÎT÷ «¿²iÙlgCÝéEɧW¶æ/Úè]¡ª`j–TâUýIääpÜÊ„å-V ­ÅR¡/²AG;J[è²$Bè4Ðç#m5µíí3å)DF™ðÛ;TDØVzx|ñ«Øêr/½c»¼ýh‰ãsƒx+熼ƒèËVrXéí>É•K?yXßn¡„Ä4> dóø=ÚìMŸà JÙ G2 tªÂ\0ÌONÏ}Ò¹H¼N!œ%Ô½­dM =÷h*bëáÎÔÆA<ê§<‰Uëа$ o‡d-s;½®°¤r\pwÂÇbšòu鞯¢ÖdØÔ;äú$ø¼øHKu _‰|qø¾‚ êšCø@*S· ×Ðñ¥ì{LAñ‰Ž×µˆÁ(ÁZ‡ý«Y!Uõ…¹ìüôð*Qí]ƒÌƒeëÙÌ –j=bwIá=9âfŒíkÀèVD2d.bVñÈ—Ï!|wkŒÊ¨{ZÄB©Ð»ÎÌW¡N´ÏðµY—1ä9 5š³8È9ܹ«Wyö¡±_#RTYžö&œßÜ·A¶äÀÀ“,§î±àÎò*å‡g"=Ü!–FDŽ/#<‡Á h“é胱ô¼Ï÷¸¤ïšJ0™å06ëÙ/)n‰SÚ›ØëÝô”%žFzní«&³gíåH+p§ù*Íí 8^™Ò!ò¼·@±ô¿;#WéÊ[y@ ÎpóÀwöVòùùòÑŒ¢<–T9=I{§PìÛ½ž;žž£ß²1øh¥›ÛÍJ$AŽ×üæ® OLÖÊš,¾s"Ù§ÄС$¾G„¾ÃâsÀÂ^`KÃs·FKÚ¤»íJÜâ‹:ĵb¿-f¶å5‡A)¸zñÝæãÖÕÐ,åÎÍ ò?…ŸÔ&ÚQð Qo©Ç‹§6ªB—•.É#u (œM>ö—î?"Æ´ˆª>z:gõEÚéß|‘§ýh ç*|À°pŠ­¼]sÅê½mjCzè@§ùn­ªãuR³é&åz+›Â—ý#Ú¼ÂÆffHŒLºýíÊ Žò* å€8¦J;þ<å%HkЭ †™çó£y,Øwp¦š²Þ„&åËâb_òÄ6æð6Ìsûª[Jn°ÙrU"ã È{Ä%¸÷'\S3›gâ˜qЗä7-H ¯ƒ4tÒ›ù/ÿ¯ÈZœ"×h˜Åx‰Á ö®^ZÕ †“Úqò¥»w'eInªBœ¦ùÖ÷aÏ¢Hõ £à…ä‹äݱuÂüú]½æ ú…Ñ´ŒÇUØ•»òÍ1$U ‘ °nÙýù6†ó{ sÖÆ‚‰ („¤ áó~îR%aÂ? 'àÂP`ÉöIB›1\yÈ£F7#vŠ…ÐPÏÚµãë÷j­¿š@/vcdÖÃS»SõëàéX~*@»Á #» B&Dv²²ò/šŒ>7àí²6ðjé`øö)xµüð@›„4£ƒoFàÊK„±±T\•Og³.£ $º›ô-i§îÆA„ÏWÝ Ëíá{ÈAËKsƒàÞþáÝlÔ „ÖÙº—}úæb¥&âp^Uj««ù“”’‰Röþì~9ÿÆIÎ^É[–H¼å·T›OŒðj:¶C¶7~«AIÄ ïM¸eó¦^ÎÉ'ÿf;^(¯Ã’|;¼ËTJÂekGá–¹.Åè\•Ì;<—·¾?,´nZÛšu­˜Á‚v3@ËIHñu®ª3½ù SÉ7ÝŒñJû ô®¡|ϧW2ŽÁ*± l€+E§ÄœÍñ©`t ¢÷ñ DPNÄdhQäÑ5^jØr{ŽÐtl•?´ñ#­ ƳT‹¸ÕPÓÍ„à(BäË{2õ¸Â‘¢vçŠßª|»1Íà¿?JVÝÀå…€¨fÚðóØ¥ÿØZ—‚4E¬Û©«à]¢œËÖf,émó‘ 6×Áéãó 4 šúo§=>~CmÝô<ãqELè ýèé]Mý•, 7OµDÎZÒòGk'ïÜ?Mê)fI‹rôñØÄeÀÎ%Ñ<§…¦Ü'Ó nPG?ëû°ê}¢*Sív΋*¸?Ì;—|T£—^«mõ­U&ß‚êÝ‘;î»,,ëÁjʱ&uÉ—Ø{-Á6@]Dî5þõ31ówbN¥7LèA6³€‡Ày˜Y&C’SE’sy,e\vðf8TýùLŸ!fŒÉ‰Ë0ð‡/(¾ºfjæõjjn’vµËhÆö¬2TìâÜÂŽïØ¦©ÏZ^Ϭíÿ¸Wh-hsþxëfG O²¨}+PÄ×9Á€cznê ¾?:„Ûñþ5­8I„2ó"‡–Äw¿ÁaLCnú^ëíˆTeÎ{Èþ{æuÔŠÛÚh}7(ãIBOt€m|@O ½-澦W’—è;mù GžL—w%8 t5 tÒ-Ľ© Ì›Wàb |ûòß]ßP›æÃ„yL¬ Ì“¹oÇSY V)OøÊ®EtÓ³ۚ£màÊÑ8‰ì5Òì?G±áÝðvùã'àÎcL¤LOÈ<h7÷E,‡á¼h_¥Ú0tR8R-%ÃTÀn¦ï-À·’ºÆÉ9¸d¡»?KÏU×Ñâ¿Õƾ_ÊD 6Øâ½Ü#èë¸W} ^9Hªã+Ó¿òO[g˜ÁjÂç7TEiÒ‘múñÓOO†Üg[iìþõ‘ ÔݱÈö<ŽÎ(Î"/™–g·Çò]˽û%x•ÜCsÀ¥À ?{š!{ÉüžG¯_½p穌+.`Ä9¦Z™=éc8H‘7k›òJCY©?ÔoÐ`€çŒ”2Ú3qU1Kµòd&Ê ½$gw9¶£%nfZ$×ãÙ¨F…uFºbõ¦štíªo£e•#¢½´<]0ÙK2mÐþìÀI Âwºžÿþ"øå–ȘþÌpØöC¢½Q×íRÑÁb ÷SÿN}R¦Uª37z#F3ñÚ’Í–Ó%’Sr i·7ÕÑ%ºÏ#‹R&L»¢á…˜ÃŸÝ¶6<÷îzw|{&.rðÈÌuð½]-áUÁÆzÍñøF~¾­ãõC¾›‡Ö>»–ß0ÖjJµ®ßh<2P6jÁØ~ar…ĶF¶z\ :¬Úúkí¼eéWoå>x_ ËŒ"GËíhxF‘ä9­ØÁŽœšÊ–2k,n6%Ns [i;SÅ*ZGî;#©*.,”®öº©ê}úï]€øß_TÐçÿ:’¿‡t-½q®`ò²–^œ­Ìd»¿\ŠåÚ¹~„D¿»³1Ê,~ƒ´.[ @àPÒÄèi1—°%¥›°‰µÎ»ßÜç„^ÞÙ§Ïtj$Zç§ngÆOÏ DÁÛé:ÔZS =† óî Bò?6yž:³–hšP@ëŒõÿz®,p6<ÆÿêÊm[|lÊ‘.g%’w$<“af?puÂ3žÐñbؘvRÊæ³VZ䃫Sec­&[AgKS*0sÔµáQ½? ‘(™2ÚêÜîOPªaëòAþ9$剄®–îa“Ù®L96çÛKÞîÅèåš®O iÓiÝð•Î…GÞ‡êÌ\⨫"•?—·)lÇÊósÅ#ª¶˜ô-k†ƒÑïÙálÙ“ÓA8§ÖئhQ]´ötŒ5Ï€ÚS{­°ÕÞaT™$≙2¿H@&§+.‹Hb†‹À°[ Ö(;ßf ¦`SÞ“iüîo.ÜÄŒC÷:JóV¾52´¯ š|Ndó-ºÃC½™¹KkBdÖã"¥¶¯tMÙ2Šùl€”?²_Âcš0ü÷ŸßËX’ävsÏÞ½8ΑU ,Ó.šp”™ß&-ïO¥tÂpäpO ct@œQ +LœÛ°ÒÞ8~§k>u’Ý=oÇò>M²d¾r˜“²ŒÑ¬Õ).q‰-¾Ådxû×&ÃLÐÔ–˜GBõˆsd@3¬…^mj;ý“cæÊöÞIw{›ŽÐeÿÒ½p‰‡ž'¹Ä©,"bqzËã߆JP§X;Áÿ•gûˆÏB¢œ[錂~ýTáë_/9˜½Êã7TMðQ¬³ƒÂ%A$q1ê£Øæ–üm ¢°›{_NüU^|ï| Ö(93ï̵¼VÁ?ø´ŸVÚÐÙ7½kSÕJu|ßåWƒÿÜ:Xn_“·”®Ámf,G|c+ ˆEq54ÅM(ç¥å ô=ê£×µƒg£qÈfçü{Gw\"5xi´(@§K_ÖŒ#?"^•÷ß®üëkÇtF§Ê¥9¤'ÌsÎénx×'3k7ž%¸ØO©’TÐ0é=¸Çó®_?âiNò¶ýζh‘ª›9R4Þ~ë#“- }"rÉ8š€N‘¼3zr op‘§¸.°ýøÊÓ…½æš µol•ýè´x”=Éêƒ_ÙËM.z£óÝõYÁñnРÇ÷g©îáóUmINàBxÌEÔb>fë鯋³ŠÊ21y‘?Z±¼¹>¢ø7Òb³7ÈFJ0^Ö¬&—Îdvƒu+\†¼—ƾ«Ö‘köܤ6ò[“X …hJ/¬Íúë1Jo€EåªJ[÷7y=™²Â‘°ã« våÄÑRÇa ±&eGU3ë©«ú|¿öÛ.ux" †Û‚ô/ráü· ÷CÀVŸd'-°Fß=ø´ú †ÑTaËôîÛáÝû©Á³Q¸*Ë ²ð ¸d° ÚMáÉ¢ˆT÷z±ßêœÒL«eÓ\¥W=úŒˆQöw¥·1A½r1ìmÑæÞ,ã×ý‡^ðÔ D³VÆÇVŒŠÐ¼l½‹ B©õ¦‹³Ó²ûog€;hÔ¾mK€E›”ùc¼DòØÓóÀ¡&„QëK¿È×êÔÕýMŒæ×O¢f³ò²$"‡½­Ço—tŸPƒÊi例ËRZÚ$M¬öþ:«1vº¬ s²±è’ŒÉâ.ýSNžÆ·$ ÿ,&(= ;ä¢Aµy%ŠxÕ(;W¿¸ùP‰‡v´Õûd†õÑè.4z¹£Éo']ióòFÕëd9Zwcí{ÚQfÈ A]ŽWÕ°M2OyP Ênë—ÀVñØäþè¿@6rOU|)ðó9›à_S2Æh9ðyFØ$Õýnaˆ¼=Ôw–^æ[·µñ°ßL´Q5ÉlC˜É;qWVXÊf•dbI@ÉÊÉ妻FŽ?ˆh‹j4x'í—gð¾ƒU*§"dhñs&Ø©'›L¬1DšÏá4)O î_ìj Ÿk¿§âpS*£•³Ý}áØÿÀLü‚Œ7øýÞ^M c#ÂLT‰6†k¡I«[’ d#¿1H¼«(Ð僋as qÜ1†–kwnU؈Ì|dðíËe';£œ[¾[îÜ#Ÿq¶—íëR†âÜ;`5§ôjHM\{}A‡Y°îË`M×TmÛï“áq<#¢ìÓòãzð›¸LÆ]íYâÇÇm¤V‰ ÄÔBG;béÕZÇÛÝ«ÊÙ„þ²y/¸d;B’ǰ.ea)8ah§|¥¦EÕæ¦TEÁmP@2Eù…«rnoÃÎxöì-å[}ø8R~/ ûäÎwŸ+e nSeòsäS~öfì;e–´¦šæä¾@˜Så‡ÂÜ5’¿“@M^«’&ÓZï<òdç:M'<Ó'óÞóÜõ56;4yöèøj”7YùkĹn8ùZ¦:Ò>,ÚëÑ*_1„­ƒîŸ?ÂXMgøs§lÖßVÃóñ0¹ ï&Ý81tË97–æØ‡4ù†`èl"ÀBjhu‘•ÝšyPrϳKGyhµœÔX9á Û¾òÄlgÖ¶Ý%?I63-·¢Üœ”—áãPá=GX 2„Ê †“¤È®pî¿$L½|ÛæÌXRÐoóéŧNëÅ~z£ï<ý‰glýþrß;ËÊz­é|ž—¾g3ÆTñï”7ËÞÎx™\éE²EF&É&'ö²Ôc?r|ãGÙºÖñJ¸Çp%ªêÞ˜{,|¥7O_'4„ŸcÜ, Æq‘÷µ’qs˜ Õ¼ýM÷Z‡§%mÑÁé夞Çèþ1&µlûé„$þ›¤®ˆ²pj¶ú9‚¦Òº’!Mhù‘Ʊ¥.jŠáäGÜžM ºûoUryìçë¼3'ÿÜ?ìÓÁ–|ÌCyžóñøãøÄ@íÀíCÿØV•(k‹×„êݨ£€£Ôþ!.nÇ ½Cˆ“’Wçýé.¦oQ7«o õZ5f¨P±n‰e®]–u˜ëÕ8 Ox¥óštÉ®üXŸ—'#uk}nèv*J4Í@å×`—H+à9È´ãh?RR”a¤‚¹–ZùÊ—‡ “>fe½^•(+$Qó·£íH">¨ðÉ:ݳ=Y$]Ô‚pc[åèMãjöh(ý4ù/3pJ,½&] £i­ 4Õ¹Ã6“bÄ[yÉã|XûÞׯEûåU %y¿–‹-Q"iŠ…K¶"$¹bB€®Ððxeƺ³ò£‚óPŽ•.0ãHîÆf.§¢bqfìŸ×¶Ô8¯ ³Í·ÕÐ;¡Añê`ÿ¯ÕpÓ ¢=gû‹¸æ•LÔÂéåɦ¶KŽ]’9¨-SjäeŸ¿¯NÿRÏĵ ’À¿7°ŠhôÚÏvåM~Òöʾ±!/˜Ô–!e4N9ªÞC’€%yCüÐlš bP¥½=šçÂ?”ÉyÚ ^º$¾ßxV´Ú¸ÛxlɹLïÉSsL‘“Ó)¤–Vœö¡²Ž•Ï ’¿Û˜åm«o x,'û8ô¥×>O†ñ²*C?$ßnµ2^fyå‹ä¹1–E¸ÓîØÕãsèªîF´ÿ’ÏvRÊIÓoV‚I³œèì 1xènØ¥¡û×-±ˆ!ÙR¥(åÑdýiN©‡)ëåÞ ì>1dÚaa‚+7Üíý2yoo‘’ccüqšâŽˆåf; ‹Ä¾[ñËô sû´‘ÛM¹¸§JÀä½…F{ܾÏ‘" ÷uÑ#6:›z±Ž1ÙÛV~ÃÞ€‡*¨³?Ôÿ¸ÑjzÐꛈbºWÆ#Áõ*+¦$Lò¿-7›²@‘­ìØ%ÃsÐv#óÁFnöÒMî|ÁîP-rÚDµõ†­üÌöÝø…Àm˜M›†â÷Ÿ]WðT†æ+¦ãЉ¹Ë‘TY¶×û í{0$µŽ¨M+Hãv9ç>ºÌ’=i£êZ(Kùäûç‹´cªÄï/xB0Ö™˜¸{6pq®Ð+™ÿ^ê°vJtõ±ï©oê»CªÄ¦Ú©?×d{ømœ“|ÝÕhž0l'I'e1x O-û›Ý|óU’WnèÅN•R•ŠÚ ÿ2œIa”a3ain*;æÒêÏí¶+e•°÷VöTÕ•úþ¡¤¥Ñ¤¾tºý©ŠlœÀV‡À)܉$«úGÆÛÎr&YL½´²ùþ±h¬yOò¡ú2¯†¨[ÁËÇï)üqÓ ]R( ´¤Kì‹|Dy0 &ãÒvÀÆnAy4Ý`wjî¬YÍ1ôrÒÔ³gîë²?tï Ü¡’‰W!¥D“ð]ë—2P9åþãÂÒŽH'¸¹¬¡ ÈiS!¥`xõÌäŸIèâA~(³pVè4ó Â/„Q÷¾®“Z Xƒ”í/M@TôL!7o© ûô|ºÖ#éÀ£ÚbÀë' ßçÊêF_öÈ9ƒLù{#ž>XÌ®Áå§„¹LeJ8Ck~yŠó<'Äê8ÖÓü6 (·½å|–IÃ݃…OÇw.÷um߸tÀç–íH|î—RêÏ6··Ü`•Ú,Ár5àÀhkI]ÓØ€õe'•8+Ë%možó±²mC™ÿD¸ó;¥¤òª!„VÁk g0{ʼ•_šÚ¼âäŽsCâ4¥Ùö ·<5HÞ7]çRB7ƒ]†iq‰[Ü)ZÑæÍömä+³`_/è3ºá DßC=ñÄ'üUÝsdÓÔƒœö¶•‹¢îô˜ÃP•?¶Ï ÷ÍàÕaË4œ¼ÏoJÏçÝá4O²Iûœ ðEž­Xcª9þeÖ7þî—«ü5… ˆ²‡òm°Sl¸ïAö½Ea‚"QОQOÕD“R†h¡üQÊ¡”H¨àÞŽkCÀ^ýõZŽ–Wœ×‚ùùÓSHw…Dß ©|:’Ú†\•KãÛbîö2ÐöX@öWÿþßÙ¤¾>Ka„3rÇìÞ¯“y§üª:`ÛH¤,¯ú® =ªR¨¼b%kÎOì>Àx-Ä8ãùF’=Ww Ä"@X¨ D/EIt¹Au Î[ò¡[¸Û´H:X2©h‰º%Û[±=ÛìëfŸÓE"˜]=}âÀKÊ+6 8º¦•ƒåvºªóyÙW ²¾_¾–HZÌjR’Y®L'ß#É'5ô‚ÊçœÿºðÎ`´o¸ûÒOÈ•Çð´z ?ƒE`:¡cò2-¶Ç"sC<¦!–Òú“ñÈkÀ*ôÆÐöª‚4|15;öîªLʰ„~ÄcóýÞç„ÿ:¸¡D’üç\ðjèWý‹ ÄµÝæß^\Š«È+ 11öV×ãÚn¤mr¸!L ¾u‡ãfå)ª§>ø0ä}T‹.jiÉ TcÈ ç†`ÁÍMöÁo“F9Ü1¶GM÷GHS¶ ) ]¡ÌÎoòÅòŒø:(ëÞÉÒÚÄЕB¥’£¥¯ƒÇf¤£Ìø€£¤ËÙ¨µðÞ¢ðKÃù8’ ‰ÊÊ|“$§„>†au|ï5–~Â7Ý_ó#Ù;é×èÜwŸ¥\²a9þh·reæPÒT'›FÉþp+kbCÛž75z­)+ ÷ƒfÒjçÚKE³Ö¦ÉÉ®3i¤l;ÄÙ‹Á ·@hR˜;F¡j>8ó‚¦þ½sdm‡ÍŒUãÖ¶†¨¡kgÓ9¼4ÑBçÞgˆÁ êc¹6¯F‡©kùÉ_þŠs×Ì`¼.L™Ýžájh,y\sžº3E«×6l¯(ïKóD…òŽDâªX’‹ŸÎŒU œ_d«eF€Óôô½YG?6³5ØqJÚU­>Vè0ÅÉMüÚô¯üv¡œËÉô¾î;Œê||LѾ׌©¥@ªÂTõ5Ò6IØmu爙²JXNJm#0˜a!ÃÞh|É;\•¢ÙŽLD"˜–?GdÕÚÆ…•O,Îÿœ6øk2¨*>Fæb»³–Ä^g»v»6Ñt¬6_%£€ûÓô£šwÂÈæI/ÃQq!'ðŠf]˜s´®,”\ÏüY¨*ú7Àà-Ñûœ¡¡ÊŒñ‡¦@9'•‘"<¢2Ex­¢Ë è{“ °—ÈWÅ]¹Ëu74•Ußõ¡êtýéS†&|#_ú[šI@š 30Ü@PWŽPŠ /Lr¹¼™‡Rµµá3T4~Do`.øŒT¿½"qCVP{TxCC*•Šw2ÊÝïþÈšÒô/Ej1·$•îq WIn'É m4è–§!J•r¦|ŠnÃL×@Ø]ÆT¿Ÿ<ߓĆçÀVµˆR»§ ë[¼Œí¼?ª™…¿ÙÓ^çÚL…3¤Â)›;ƒ¯Á*†“Ç×' Ÿ¬îÈÿ`À*2'gÈ7(±Rt~ÃÓqýÌâdw÷ˆèƒ© Å’o‚78vå`¼.Ï·ú0Ì&ÿö\ã“ÜFÌ»¥¶c¼Ø`âÜéäd$Ý¥©„d{ärVpþbr­ †ùk!Ù|ûñ—ªux쫚߈O4*V«ýUFàÕ":ûh›ë<1Ì r:Ê*‹QΣ ‘­¨Š¿ ¤êˆ¨’˜8æA H‚¸û4Ðâgj+ZWûóälÔÂvNŽc׿û³¨Ö·:ßsõe›ÂbÏõd¡²î-G ñE¤Fƒž¯¨[¶o1ìj{œ-¯Š¿ pêˆ\R‚^¼£¯uÃÄ Ið^|Žô:É>¾á¼cx"":Û¸KÛ&½ì. ˆ¡þÇïË«ý„ž_èKyÙãÊtÔlò‹»ÜšÑš_™ÙT‡~Ú´ìKÞPJ |Å$vN©£¾TCÃ+0ÿ<ªõÞæñŸÓÉnëŠðúêݨØGÏš+L¹ÎÉ&bxJdua(üƒ&ÌSÎÉX¼}w˪Õ0¼•üBa1ñ¬ ç/.^Kbt¿»¦“EFgóGärˆŠò?ê6£ò?‰v Üz’æâµÉ×Ü ä32Ï(>Z!|8>\hAÄHAgTÐ=²ïAe/½].¢²×M‡.Ù†Í4TÞëqÑ?®öò}4tì2…IË>´ðHKt¡/à=9i¹ëSà} Ô³)V”—´;‰»A8º|Ä!Öí¨á ¡ÁH<ÌÑÄ&’ânYfsÊ승<ÛÇx}aâ•ÖZªrzH·­AÔmÛ«Ó0ò-D0;»ò`ã! hÁ~ÇØã ŒL°\wmf”Ô-R`”*}N°Þ?PHSUöËL#9œsüj©OmýåÇzt?.Ô&2n’ér;©]ñGŒµ›ò›9#š#ó<Î[>Xs‡»ÌV¬¨uʶ@¬ <† i5l¹=«Cž´!‹8˜Ã ÜyŸªÒ 6‡.âg¸öë”à“‡ÌSÅÛ¹K©0j©~/o³Å`éÍ妭Þüg–*ø EÉK– ™ÉEîÙ˜?øU—è>)EdùÜÞNÚ5\ýäz†<í¦}lì­–Âèk-ÕÁôœ^ÊÐgºÈ:ʯ†ù˜É•ç2øÇ"ÃÃdÞ˜º”L’Eö~aFÊ ÄÛ…,ú¡Æ±½š¿^-µÑ¸éýmÒ>“űIÃW˜»3QW¢½.[ûà~lƒÇ`§£@-Q -]~5ØŸ"“uhǸ £¯ez2,\ì³#|AhXNbP¥c%Z<¢M”V*t*tbt(Î#QÛû–ePr…õ4…êDîÇž›Æ{¿¦EdñjÄ&Ê —èÂÄ9o©A²Nd=Þ7ôø·v¶A€~²V/á­Õ¢iÿ{Ð)ïëµLow—ï]¤ø—ÛÈ äÀÙÐ<'ô Nh"ãÑ>k;WTì#¯ >!-¯_¨TÝnZŒö½¯,=-ÊáPù=(²ŸÈò©X»—xú¿5O[úõ1£2\}ãºF0Ï¥/Û†Îß3(霨=@C³W¢^Â*g‘“ÚªÆ+ÇX{Äâš i‰x4e…Pf–DÒ_畼%ûYâï<{ïk\o‹/’HŠ,ã÷Ë÷ò‚×Ó*ÕØ‡ô[XÓGÞˆ6¼üB,ÝÞ‡ípœäÉ*Ÿ[¾µEy¨» Ñ×x«H+»œNèúºmx ¿]aÔ–O|é³,‚•@¦Â©µIÓ„ªußVçkµÝ/ìÏÆýÞ/ük¯¬îå¹t×!¹?/e™†õ‚QáU·ãTV¦²Á¬{#ŽÆ,´æŸç9#lÏøäZ:û+ðhþM$Ç:Eã¦ZFê—Éžñ8F7 Œ_ÖX;>7L? ‹+xÉyóÅBæÆôô·ÇµfS/û6P*è¨DûWFóS? ³¶ã¬íÅf_úVK73¬I´wÝ蟭•È”hdï1ƒ—ÌfçÕBoœ½È¯´ ú†97Õ„èÃC¼˜nðIÝtƒ|äìs&SQúJÄ(¯Ç•t% Ý¯dMGc9,õ£ù@žé%>·ŽP'©©—úyHõ8oFËÏó¤¢Öî…3V²À=Zlá,̽ˆ3@ê³â¾µfî!ô¡ëK•šršË„†kµúÇ芮~ãÏШ3£¸ÆrÞâ[ŸÐì˜ÀÑØh$Wzö‚Aér¶¨æÅSq[ÅfX&Þ5Lü&Mù¹Ž†€EöX ,Ï-Íb«ðOÿíbB6?Ï]ÑÁÝKP¿ÛµSã– ûÍ7ÓÉî±[æCCöOl¬ˆŽÔaÈ|ß7½¤Új‘íýèÌÙ¬^Êô| TÃÁ’ö‚¶$T î˜CQáÌg,ú>T2ÉaòùìY8ÿ¢÷÷ôæÚ¸¦©=‹à÷Lîa†<úè—>ŸÃcó/XhÅ™ú]~½Õ¿Ôñâvï•€©›<å·^ «Ÿxô‰Ïò#¼F1ê;ÈŒÄ}ï*N!‰Guƒ­H|œ¿Ó{Ö‡®0OGì2KÆeµy„œd{0þÛ*šµ>²Nÿhoâ’¦˜í¥a~Îä]ÊNO¨Ì!!Dß§ùM£üç…I²‡Œ ½¿y mF£­!Ú™)÷¨Á0èFZû|]çÚ¨åòìÇ÷™M”?‹­P$7„_@Úté¢_qË£w;:‡Xëý±!ë æ‘êÀ6§T…}Øßwh{\Þd«ó3.òU²ñÇ”ÂÄ~dÎ<4†nY2Uœ©lÂfG•x(Óõ‰©ÄiŽ‚rŸm2hC)ªÃâ|¹¨×Oÿ¿†ùvKó­]kJ4x´ësêX¤x¾ÿ ViÔÕžÿ T>Ý’8ÿk];ãÌ©9¦´vK$"ç¢Úbl¨i<OßE¾‚ÜøÃèP{$Ìw÷÷XÍ3?jü²\Ã/.\yc&){IxR o9UpðWþÄéÙ@ø‡W›´;5y)pÞöK”½ðö£åÌ“€c¼D¦?ÿdzMßÈ(||1ed4gtV€r¤ä›¼1yš¹ûÝE†3ÈÞjïªÓ+Òb7;œŽæ•œJ]`~U7OŸ…½Šú\ˆzÆd' Í[½jÑô|%—c½)4Ã|çtŠ¥)4-Ÿ¶â±ýºýqiž‘äÞ+„dV\!áL:å?³¥è‚¤»¢C€2Ħtþ(A¹4Žø¢¼Œ_ØÊ?’Ÿ#V5jа†Œ|»Lÿï>ð°2Q)ù˜´Nmƒ#ÚžMa±,»âOW™ËýªÞ3¬¾}_зz¥ëõ¤§F¿ífm–i ÿH¶¦DÉ­§¥¸ìc]Škw™.jš¨~&e°M‘ª‡&ÞË ºoBwžOüUªZÏÉîû‚’¾¸e}¼|Eáų@ ïz(k¼>b›FŒ-­¹Ea¸-Ê‘QS·¦f£ˆríü—êl9cZXÆö5cÕâ¹q>¡6÷p>ÏÝÆé ÅÁÂß5„2»EAd‰‡š6vêÖ¬oëŽGiè`~ñp[ŠSæ$x&-×|* *6Ívœ ‚»¬z7»ÏÀ‚dŒ2FaˆäÊ:¶*:Y\ ±ÍZ¯h™b™7>mšO5ÈäµÎ¿mÈ¿üKÖî•|¢Ú÷¶®5ê=¢n{ÄïÚ·%‡?­—ïzÉ"r.0ØYCT£z²BÄ—Ý^Tоčó—pê­Ë«ìKözÄ3lÉ·e1qkD y{C.¨#‹¼zÝa¨¼†ŒŒ~¦¹ŠÄ[‰<½·ûÛŸý¸6ƒâ׸"0Ú ’PÇ™G(v³;ñ¡œõLo1)Ê¡]`¥ªãµ±=+v5lö%ÓžÕ4aߌÎD‡]ŒÉGÅðÇ1øyíü»NC'ßÕ¤ÓFZО,ÍãöDz¤ÊWûù bòŸÍ}Äfc¦¿•Iæ…T^“´»j­¤ƒW"Ë‘¶}‘”¾oÀ¢dmЍ~ÓæpÑÂF¬+<.žl©ô,Ï| ™S=³'ÌoÛ³??²Á+4V×ôS˽¨v9y Q†1Jd5šø¦t Ýxý œå"ÎÈÒ¾ì_;'ú}T&m¼{à;¬×w°g–Fü{ɰ<îÁ-&kjþ 3µï¯a†û̓zx±¯M4áüL6·î<[Øy«Ç{[¸¼„D£;~«S¤¾µÀ†°.ÉX—½Ãö¿6BTÃ͇èš@×îæ31 Eè¢yäÝßb—å‚ô;@¼eû[¦‘.ª¯%¯Xoñ3i¤ªWµ}–áUuÑ…dðm}ÑÑÇña½?dpÎ –‰Àdʺ#EW3®q§TMöüHå×Ji“÷»ôÖ+²£˜ó3P^­÷ѧhi5žÛšÔàƒ5^ÍPðúb ¥Ó“/†'”¾éW,DapUGö½BwƒO‡ó‰Ï;¾fýð¼Æ>Œï@0ÁFyóÍ ±GæQ=`&»ì%¹' k}«ßº|êW/ë­± yÃ?™0tâÚ)¯ûëÌBW ^BîÏölº* †¦âlƒ¨4¡>J÷ŒFW‹ÁßÒ]…X$[š¡<ë—.õFƒÒÇÒBpSB&+l¢†ÓÅ—–ÙY3¾Ž¯úð)ûìl&ÅÛÈ›ÇB·´È-ªÓ-¥ÃeX¬dÓ"h8í;ŠS£H8&¶Õ º‚âF(“hÉË%†À3¾™ï›ŒŠ¾lÄ2¯ƒ­ö1{%ï6Æ¥'Õ!”o.‰xvÖ\9뵈—FÄ=*\‚䃴»ÛuÐò”>!/,ï”&êœDäT×så ‘øWÕ2ï‹ãÛÇVØA§Ÿí)ÚUôߦØ1Ù&wá?øL ˜5„ëj×­ˆ°¼Õ‘‰Ú­Iáî½­6Ä®ŽÐ?^´‚µÄC¢ŽÃãÕøµôçƒ<#ô)«°ÐŸ·ý´‡¸›ýóáÕJæC]vúèk»úá‚N[•&?êdÝ B£À®aß}ñ½DþÙ¶Ô€WüU—\œÀ¥¯c¶r@ÛAKÅœ£.óßúÿ Pñã%¡‡_XMjõ¶ïõ‰¦‡bÓ*V:Ï€ÔÆ1µ›Ò¼È/Þm©q/½úþ£« £+èG™Cœ¥Pcz¢.š¶Þæð¥ùR…Šï<îÝîí‘xÑ,Ñí61Á5rR8† Ÿ¶è©£nBƒÿ"+쀕^Çâ^/A7OÍ™ Ìú¯õa—RÐH–—ìꔃ­¨sÆõ“dQwÓ[øb2Ö¹½¡iéLé|·Rã•ï±óI‡ÿFUΩ‹ãåHµ„2»AÑ¥uµü=¶ªA±d‘1.zyu½?Ý2dɲ6ÙÖšˆ¡ƒí>M}˨Ö'Á6+á¦%ï‹#‡°Ù9m‹éåê?£ò_‚[¿eØÃùÊ*ã„mKIÂEúQ¥šgù™¦>öœ´ÅS- ÌÄ´_×T0þj”ÅïùÆR˜,j 9ê?¯';ro{G/¦+µ>UØnøpåÛæo†ŒV}à ÿ-ù¨h[«üa§’.‘ZäÀ{>Þ³xWfœÚ$5€ßÓ‹Ä“UÙ‘DS¾\ëˆåÆ1Ë7õÆjúW9Fµè´hXh3GŠÉ Ìl.ŠÌñ·[)Â/ëï#K!Û‡ÔüL7ê•®è÷Õ‰æ„Ìc” m³¨(ƒ·~`”Ÿ¸kËf‘Y+!™XƒˆPTÄF/çBUÂ/НQÜ®ï!%× AûÏû|’ªý݇W÷)k*@¾¬õšù…ëU«¯/¡2Í4·ò9¹ÛCÄ>ø`TKNÉ?ò¹ºç¶Osì|÷·ZoÆÚÒH=÷2—¡úZ˃ß2WHyÖºSø¡-¾.Å=o(‡ž³G „ªûVTôòqÌ¡®)3QÞë0Ïœè¥ÿ«–Ú쌄óe«Š€óuX¤œŒqÑc¬.W]¶`±^ðä¸y08skah¯±<¶®ž”U-_ëà\_ÖçÕëë¢3–L¤²ÞœçÏõhü{ζƒyê²S€rxál„ÞDróÁ…’?Ü:ÒÌwî(EQ#椣Öã9bYs Ÿg(ŽºÁºŠÁú†UE-h(Û ¶êjigd°öm%P—‡9¿¬@~ÀJ°jñ¢¤rJW¨ÎÞQö*þNÚû^úéK|WóúˆÊU÷pñähA©¡Rësg|UFðxŽÂ)¼Wö:+¢¤„¶‚ÀaiuÕÿ-,µwÕ šákñ÷ÊÏÒ,ñœ;™½”ä%žgxÀ— ЀWøÅ{í,ÑqâÏ¡[0ñ7|s§Âœ¾×õN'‚®—Y¶n¥>¢X§>–ípºB¯=é;.„ÐÖ«(Ø/¹Y’ï“i¹×A!5$·­ç]ë*Ob¶Ê‘qüR¯vPÓ®>ÊoXœ8pS£02˜ÁÚ ò‡7¤1½‡E~GÐøªÔŸ›Ž<¹¤‡q³<kº:H^Ô\Lãþ½Ø“Áà@¼†ð+Iijµ ¤(«çÂE¶ÍذÙm><÷>dÇe~-†‹(™™qæ£Êá, ×%ñkmùƒ÷K2Qkg+3 ¯é¦I‹Oì†ܶxÏì/™‘tŠ}†¥üEÍï÷_ð¬×ù©ý¬“DwˆÈ¬¾F¯ƒ—øÇó¤ Ô©í$>èݹ‹ð3{˜‡Ë’øE6´ÕY­õ0[j3×a SI’äõN.ùQ,ѹŠwò‰o—Ù½|ØË!IJö_q¶>½ÞxMÈŽ%ÅR%EK\™¿1ç5zöXÍR´þ˜–³#I£Éènéãµvs¢ÓZ‹&çn]1Ó?rªú³Ñ»3X¯‰J_é¾vÑ6Ð/¯žB½¢'/uÂÊ%OòK¦èÉò³oÎ󋇑lŠàÄ­Ÿ– ©vV(D1})R/ JI˜¾ãoï%\HP½þŠqA‘IšÛî¹'¸L Óòƒ¤r®£ð`ÿ®[V^´3¿øÇÞ¨ï‹Ø\ÂÝé\ VLà ¨G„ÞGÞ7ƒ†æÈãj¢YåËÓN_¤ËöºñáÙöC óû7x…V¢ðF1a·ë%ˤð;Ó8GHdžHë;Ù³ä7O(”îÚ_e¡MŸkìHhøgÏÂħBÜ_£¦¸¥‰Ip<Öj,¥TÃs¡­ ³ðñ; ™ô ÙÑäÎïÚ̻ڗÅy¾˜c©—–/éàG,}¤åÄãB8,¦)•êøo=¸¶ìo ñÜÉ<1×úaef†a{šGfTQç-“­þ$»@•Ù¹‘×x ˜fô8‰O¦JÎ>É'X˪Òž'ꊖ»<‡D×IösÙA~Â$¡éµ` Pá×® ”ãÝçòËëü¼…upH/Hš=ºQ~›_³£˜õ¶FwÆ"ŽÄ}¯´v&½M§¿øÝóÍ1îºA?²5  Ó7&Šaû‹ö'6K–´ ´†4V³±Ù¤\¸_*Þ]fÓæ8ù?¹NVe:Ï&¡6hVBIÍ Kôx¶÷•„‘L.¸Uû±l<ºÀz‚ÔåïÊy]b£CÈO§[?ž ¹v$†T·7æ*€ÞR••Cf Ÿ¸¤­Ì0ñúc"¥t #BÛàòÆ Ÿ·Ç:ûj9…1Q¦àÂv’“y‰…[7HaÎÐŬ©ž’jåó<£YHð%å9GíkŠ&?†$ú Š’É?Æßr“÷„{k˫ȻËòPNž«~jš^Š5Ì*õ¶ù=óîå—F÷’ìÑ#Î81¤iùZµÞÅ^o5oÆç'&0ª•(Ö{ÃC\Ò›·ŠÔŠüЃÉcL%$:B}“¸ Þèìsµ‘%íœçÖ·jÅŠ’©†e­ËÉE³sª?jÿ{0Àå2œ…!üÀMëÀ¾ƒ"Ekjœ†ÇTtò~‹„ܘ´Êì®&±ÏÝ9iüŽE„ (ÁÙÌ#þ­Q8(TÂÏD%–yg¶JqµmTÇ‹ 3*J–?«5òjv«(}Áfè¤uE£oXDª| Y>tø!iäZê,ÏbÉ›JÅ0¯ÝöÊ]¢ÉÝgØeí©Ô?>)@Õ’sÃÞ†ž[i×Ù¡ê¿ýk9ÖùócDCM‘—GÈÛþPf¤—ø‰ )›\®É‘H«á7Ц¾¤xšø@ñóPâ•ÙA2¶î2"ïž4-Œ™yÃüÿÐ÷’Ï9s¬1õ‹|lžü“kû·ñ\·§y@ÍzPþgÛ˜@\ó_WßÜÿñ;;š.7QèE%´œ>ûF|Œü€¦àä„|!0‘f§Ÿ›=·©È…pJ¨¶Ùª¿È'N-óöVUfuõTxÓ‹ -ëÑ Îž§¼GÊNE Qh#Ð ;]%91¿2ÉK?ÿWCæ]åtY¢üKn„˨]\ámîB+9G6’0¡ö-š¤M/ÇzùçÞù› ’Öƒ!ò‘«d~ã|?×ï‰WÒcïŠZȨõ~È7kAM¹³ÓÁwÉô6âì?oæñý{ö3ö§vÍYƒ+g* ?¹ZSœýñXò:Âk”´¨âWœ½¼¾i¹ySW4=M´ë#°Gùm$/±ºwoÅÄÞî30éI·¢)û¼˜ ýÞòc®~~dmË+~Ã1÷Q ½´|wpØ)AÉWhÞóLghò·cæÖ¥‹üL6ž÷)/Sý\²œaÑ,vçöº„%íôu‹êßXêúެߗPrJȳÀ‘Î+h )\ÿºÎ°ûÙ‹ÏSó&* ‹$X{aGÝõßã²~Ñf“ýMàfb˳zEVù‘ìÁr+Šó§ûý ë/;=v·4‹!ѳ ½ª¿Õà´g%æO¦zݽ!OðL·vÒéìw¨Ö ¥EHöwç ši¶'¯k˜ÕR亇îÛêßñ™ék•˳ Až4vÿ¬k}uþ\•À² w‚Œ¯ì¬VÁ#äP{Ie·íÉÂlÏržc[ìk|2/—ŠÔ\ôÙæ[æùˆØZü¡­^aÄHn(’=þÞŸ³^Ü]&¼FÇš ñ4”&æM{e1s`™µ5:º˜Sx÷DóñÄÄW÷<—$*ä2fOÓ™{eÍy^Ž“ì;q}›ÙwiÐêÛƒvR–†ÖC‹õŒG«žƒ Ì[ŸÅ ŠG:KW^kìOn¨S=~éûÈÖ¾Ýx…LÄÈÌgØ8C¿P¥Bç§qäÂÖÀ–1\> í‡Kë!óçï‹I$•çÍ÷Í ç‡ùÐÑàкWJøpq5Œ‰×Ö6|¿^AhØ\ÖozWAÞp0o‰±„²!’iƒJ_Ë^!‹Î‹ò§™Î¢F¦Æ+Vs‡ÇF!”Ü\ÿ¶!Ÿ0‘B통1Ýú–‰r‡HV´âß‘{)Ω¥5sGøM}¥Åë‘~Êf{håÅ\”„ÀÁ·¤ËzøVa+Iô¿L»èX#ä‚#'Rd }¹H|Z¿æŒ¹0¬Rð•?ì£_‘E[ ¼öü<Û'Lßr8ޤ7kÁÚ¯â³#ì'd%kÅÔ]|âþ…~ÿ§¾Å"½ßÚ3_ä>œp¾ã¾û*BÚóï¬_—šeGÈí“Õbî\%(œW¯j3ßÈtÔ7Îöÿ­ ÙDQ-Öë³g$·¸sÙ.Æ[²HG,}þK~êN|IEN³;«'©ô³p!—I°· &/N‚}lØeýfy¹&}˜éì—z”j<$= .QE[‘Vyƒècô$›8žT<ãÀÆò“ÂY~0¨tÚ¹ÎYs‘ÍÜâDî’dÛ;”&ۖDz·9ïÐ’D“‘Ýñ–z -LT7>©¼[wW…/öm}h\ìû±íÐ*jzâ5D4ƒ0Êã3WþÏRùîHÇ‘GÖ>¨&m^ÎVHó‰IÅÍÃ7ã â†W+ÁÜD]ÆÁ°x@oHº|±Ü=õâb÷oP1[öٕh…>aˆ;–•ÓÒ["õææ }‘¼YŠŠÎdp.â>ÃD³:/òº£uØóñûLÔ=«§ ™F¾žhÄG×°g™„'þª_Ý‹f•Nçÿ§ß(„7ì“ý¢I,íAñ]Yëˆ*ÙLÂyŠ÷X[ÇÖQ$¾˜tÿ³²¬º¤•¥Ÿ=ãyžô1&£}Ti)xuMô™m"`æ~¢Û’Û ‚¹wrðÖGlHâï#¤aÓkãåç®ô<Êù¨:Þ1]ƒ-ÖJ†À­+W?›]Šˆ !U5cDN¿³ gK ßYžÄØÌ€ÂŸá þxá;·À0Ú¼% ˆm¾Omˆ1¹ –Sw>\곆®[¸“šg.÷ØërünóyJ‰jU‘xópù(c(¢9U—8¶_Á|ö KT©SX‰úÅbl€€ò'ž¢kùºÇŠ?•-Ï]‚©ùqªqäÊà%nF)>U¯ß|§RtEO>÷c­üi6•Hdzû â‚Úýºí¥ZôñĽ‚^vŽ(<[©»NvŠë;‡Â`±£´¬Èä^ìhêw™ ‚͹K]Q{6*àúÝõ#±ÒÍ¡<€7y‰Ô!4¼e>qnL‹Šü›ú½RÅuíý—øSŠ4?²"Ú7À÷uÞìg§EYPeßÁV˶XŠŽ³¬qz™û´šëÖÈbþ˯—Z l• VI°]®Ž°;KrƱ¢6þ‰÷ûrØ®1錵ŒÃJ+üÙ² ¢¤äÓ±ÚâLÔ~—òˆ1θÔÿè”ûÿ±÷pMmKß0U * ,Ð{Sº¡)¤'t%H‘¢ˆ¥ªP鑦t Ò{ HEøv‚žs¸çÜ{îóÞïúø{_F0Ù{¯53kþ3³f­½R(]ª··žSI=9/¦ްmn—¢æoÞÊ–@»šÅÒ}-ȳU’ù@'`RÙl£7Ÿ¼pÌg EZzµÅ ª«¬è~{/Â͆E¯$¸KÌÜë¶½½Dy™3B‰®Òü´ÑÊåÌ’*?A~M!¾L–›ŽXzÈ&z»ùMÄÈ F»Ä§Í”¹D«í«/шñ‚|ÿœyщ¼ÆšÀÁžL ϶]ÎC‚Á¥*s’ÕÐèd›»ûû ºÕÈ…­´[£bR"°Ñ­cèq™E]VŸbÕú™ƒÐ:,„eÊk÷™Þŧ§Ò¸D”nÈx ì¸pÎ ËQm=aîŠÊ\ż‰è‘ÏE.?a_µ”TÏêT¹b‹½8{8´:ÉòyA›ÄyÕ\¤8ôð€ËåÏÜAûš{-¥ÏЗô–éÛîÈÎh`˜nÚ™—À*õh®bFN ^î"5ëWÛ¤~Xáç¸Ðîäz$ãX+-PΆFo%z÷-÷²õ-.@.‘ù <Ö'Ý£“EÞdíŽÆÛ£l”~þdƒ´2çöHì¹Ë\’õñﮑó_Ë_ÉWD+£Âoß^ÈX{­ø¹PüàS†‡o>`¦J9óeë{±¶Ÿ¯¨Æ@aÏ™7€vtp1TØIáQ„q§rm g²Çä lk-Xum÷?‘ÓèÞ§oô^GjVN«¤³dfÆΠТA”¦m…F‹)Í^ÁǸ94Kû†tNÁ r4,zö¡\väÈY©>Œ6¿Må½R4E´tõ—â2½ûLé…dùG9žWÍ…©¡´Ï“ùš£bŒî$ë$v23;ð˜vä­dn!i¶‘öƒÞ>®¾òSëE²`@~ʲÄ~LÃU{ËûΘ³î¢OÉ[s¯Kª\ô›küw‰§Yˬ3Tåª&ìgÙÏf°2%ÛßWD7 NÞ¾Íkº~T*y)Z9tÉî<4+É%•cr<å^»v³ŽØ§$ØJ”Ç—(õ"Íé’ÊÑq øí¸"Ä`:3böÊýÍåØ ²ïW<´¼:0îUïŽñHzÔ8·V£¤*vî…•7$ãIõÙ=wBW)+¥!_3 bt©i¿oœÿù͇£Ã!yHö³¨Ê©¢‹Pi” :³="=tð Ì¡ 3Áh¸~D“Øõ&„˜è'.OaâÄ“é˜ Bš Jhx-W0›Ö\ÙȼhîÓi)BìggZ²xFgôÅŽUÀ:AÊ?£¨:šä°m¡¸}¡Îø} pº; b'¤œ”b“©´¬ž’•$ìg‰=ó`Ëa©ª›šßšö¾/¹BKƒóÁDÚÌís:ö)g ±ân¯-+it¤¥Jñb}Ýtåu2´ë.ÚÌDóÀßps>ǰCëÞ½ƒxÌ}CˆQpÆÀ %žK6 =ÄÕÎjûµ^ú¥“é34Òéçb“ó`ɶŽÖX!µ\8™µô`™SQüû+®°(G–FvcÚá¶Àj(Á{Ô“,ž|V"©'õ ¥Ø¯¯k5}¬ý­7yÕòޝT! óÎ:§'ïÞEÑn?E[­‹•´Õ*£nã~PË-5KqédV#"ãYÃÝk:̘ƒx® úOÛAGÑV¯GÆ}óa yjYæD#N›µn@œ¡D!ý’ ê~'uCXåb 7ë“ÙÈÖ7mµP°ä\Õ³Ó¾Ì×e»Óµƒ>‘¡°Ë1ç2ͱA|,à2ÙÏ(J²z—ºÀ>™F%Ä[üƒ ½Ž®˜•ÀÌÜ›(ä|äù\¤;t1yóK‘¦W=21´?QÈØ{¿×(‚DVq]D‡eVèÌýøªýྡ¶4AÍkµ˜û/‚ÐEŒQ GÂ{ÀÚÒ3Ž…¨†Þr<‚»*Wª²S >ƒŽÝ¢1zðò—iŽ›åà“Ã`Å"ö¹îYÖÇØ‡u‡ ŒMì±m!õÐf—ºåZ£j¥¬c!5µŠÇ…¬Ç„1v >LüDxfûw½å9SE…9 qÄ q­›ÑŽ M§É—Rá«uµŠµO®áøQ´ˆSWÖ[0U0‡v={sŸ[Îio=£¸æœbù–l†l«xFÍçFîË2‘Éô\Ü!.÷²ûƒ"ÈäûUàzÕ‹‰ù:®M™‡+laÚ6¨ðyL›¨ãfèIgƒ)]ÓÑâëÜBG°où¢sàÓ,Þ÷WŠ’7`¶²£gWÝÖ`¸­|ç‡hR¥í;oû‡ŒKžªÁù²¹ Î9wRòjšU s2j_rbó«‡`–1t’¨cšÔ³)c¯pqÇw.§N—‘[ĵU-M`yJ»„µ»õ­ú=¶Ðï´Réš/ ññ2@wö(†.(çÜ)y4Ö£kßG³ôv˜jÝ@Öö"¹!Ë…C' „­=F]Ö×~ˆ¶(Åqmp¾ÖÔ*¦8ø”Ü¢ôFÝ–Œ™åJ:ñª{·G0º£5[œ«X]åœ/“$GÝí¶h<{£³_ÙàþƒòÇ£ó)….ô2ëGadeÖ±é¶Áè Oì«}Ø•á¥ì­¨ðlœu©švF±Eiú>h¶lŸÍÈ&Ø·“yÖ`½§ÇÝnlp³6.Í/= av¿U”ßuÎkÕ+݆öÇkš KÞäÄ&/SbO˜šr±'#xOI’%'~|…Ò+ñ<ðª[W#•øÁüâÊ—ýÐûµÓZ'¦ùk7ôÖ‰DÄžÓ¢úc…ú[1ŠMfoÏûjSÛ¾”Ÿ˜¬) º-*œïjgÊ&c™¾hc$·EÓw¡Þò^œŠ«ŒG™©Z#ݘ$ê‹þ2rZf½«ˆ¬ L§ õB¼}4¨“aÂ'¿¦OÁ°š€÷»ë¨CY“}¡ÛÞ±~f`9ƒÊÜþχÎ^"ÍÓÁ~ù8Úìb·¼X¯'&¨<-c´oßV#š®SwôtÚ’)IÇj÷ào]Aï¦ûoôÓ£Ê*æ¢=V÷S&ÚÏ_ZDÑ<Þ+B$ÀÓ|¾©ï£¸5Vµ4É)Ê•l4xwù’OŽ¢¯LIÅåè Á¼4˜ö9Â3]uó륉±†èé qùÛßwAÅåmÃçâáìQÜsº‰“Ú—ß,éb{>¿¢cgöëÇ4>Ìÿˆ™1.aOfºêT]®]}‚6J?߀¯ÇClßû£*¢ûÏW)@²›Ì¹¾JâLÉ<Íkð =ÑC;÷E²n66¬&E“+¾Œþ3BzÉ1lý´5*¼lÒetk^åé; i>!8g¸>ð WÕ{ÂÕÑz¢²2N{Ø{—ƒiX$‡=&£UV¦Ä +ÅßG„Q·ÒVÆß…X6œy–rõŒ±×;LÒ‚ùéÕ[ãÓ’jn¸P7ˆ÷Yh>ìâ­yD¢*Ôß7®ö‡.t\eÊ~d ˜VF#¥ÊæÍ:¾,õocúIãfàÙ©³ù8ž…áôÑ®ô=ºF?„Opùƽ‚iCÁe*‹±o«j.¥¾àiÅ´ú”mUÐ]ß&|vŒ«“Wïà`–5ÿÚr2)+•nÁË—©âeå0ÆŸO·?ãíûÒ|^•‚ÄúÃëgñ‘í|÷¤Óк ¯tòpäOkÖån—"Lè2³½Áv›ÎÐLéþ§ò•ÙŸÜü°ÏŽ9h¹Ôæ«‘èT固/¿’B->²Ö/Çó„ 7Ûah!FàÉ´z^²Üœ8B“¥&¦öÖD¤ÍDŽ24Ò·'mfÒŠøz©îŸfÚzî<‹ßæÍ³Øâî& ~ìã>à‡õÓõ¨p·5üØ]!ç%›2Å*¦ÖÆlø8´m·œFŽ,ó£Êc³¢çüWëÜÈe¨Vsß$Ùd¯¹ê.·Üä8€zU‰‰¬w8äú@œfÖ›¡šá(hplUPò-ãS·µ·ì0ióùÍŸÎÔìýÎ\Þ‹„;öµ‡P©åùúîÓV„¨ÚEÅta ©‰9Hꦎ7ÚéRÖg{_½%*·ÂE†j§«±¶ICõÒê`_qV>’©lô;úéðx‰‹Þ!êÆ­hÇ颉*É ÀQáQ ž­ ¢S «C—8 ú¦Û²ÄnxÆh{EÅøõ`rzmÄõ¼Ðy0c‹ƒ9Kît§ú îÒ¹¶+ÖíÀäó¶ à§Fw[{ ’ÄçÇ9f>žl—Ϊ´¶kرâŠOq@ªh‚QÆŒ¨þÏ T\,AÁEþè´f 7óZhtÔ¨øi1zŒ¯*™Èá$®<ίMbÖðàʉ0UH.îò½Š±ø°˜ƒD’e]几¢SÉPý ‹¨rÒC«fX¦Ôì[ S+¦܇zñQjT±ûT ¹륒¬ýàMЇhHâÃæ9X.QVÕõÓãùÈX²¬+üíù;[^'vØ9:¾n#B•Ó[c¢ú-±+¼ï1f+U´­Ó+§’7bÞbîW[7”x5M'øir5‰óÉŸ¼ÿ¸ cÄPz© õ+G-eãj….eãκŸ¨µÞŸ¤ôØTÀÆ,<{Nq?ÜÒ­NÍÆ‘ŠÙ`£¯6‡E«Å|ÂØÝsÄbž5¿Ã0õ(ÕbÜ]S‰Á}KïêO,g^õWÐU_¢%†JoXyt`Ê’ÂÅ娧m"‰úé¿ß ¹\þ‚¶Ó´mÃÈc)s-\‘«-– NcŠ5¯¤åê3A{rFŠñަ!ã æµ½8/•@¾o^µêb™J.G¯ÆÎ·KËrðî§1Ãrw—ªCWÁeô\ñ¶Àrvò¾¡~I?tNN©9¬ãÜrŒŒ¥L¦Ð·3Žƒp­ ìVÁ¨ÂΨþ…þl­`Iû¥²2~Ö™¯óPõKë#~Þ}LßkU¾+j(ÂþômTø˜Ú6µ)öF¾g## EÈY²Nì×Ëñí«“/%¶Üvs1ó³8mØ'þoT ]m¨“~‰î2è¹$­ˆÆÇ—åaÝRÝKC@I~Wç÷‚ÊÊŸCÁµ Æe”Ë÷ÑùšP`[©é~0›¶Âb´?3øÎ–ÝJÝpý„Áúƒß¸¹’6_J™I"eM€am”üÀÕ Õ/A•úz^LOÚ0jBÓ ñ¶Ë:QŠÔ$½õ¬qd±*ÊŽ’‡5àÖfY!_“qÉ*ê¦%Ñ;ËŸÏÅ“¿SˆiR·ÍüzMI}Ut•emþ ʘë¾yþ Û6ÏtŸóæÉ ®M|hªØb¸h÷ÅosßBšz`OÂùy‘".4Äë|JQ£öOÐUmĆáͦ­5kAùä‡_Öc/,ÐÚ r8">§¦RÄmÐú¬1@›+&ãÐÓ…OTœá—·NåE…?éLêÌlËÆ¥ñ³×.(k0žÆé·-#×oÆ;ÊTöïQf}}ûúJAë¨ûJßñ·ì¬B )WÚÅ׆ÅÕ£üqF=*)ªÕí>¯YZ‘Ç /sp}GI\mêŸBBѺ4ƒŒz^-Œ¦ $ggPáRé\O•6P Ö<–ü‚Ü_Š|Mã6 SÍ;0 M&=U¢Oeà.¿Û+‰z…¸F¬˜¥ÿ’!å‡Ë¬Wª§:13¹/\VêÏmRûw£Â¹…€ÑcŽêwY“°/E­*fªú³DWÝN»¸aеäë;o$íÑR½UˆNz­ù¤JyÓÙ¡æ*'»‹séVi:™ƒŽ-ÃhèAet§Mѯ@Y1G5ØŸ£{ZXBú”"xè€õè©M¾jÊwM–|ÚÑPV²âYY¿M±ë1—7*žé.–·`zm†—¾ÿ,dúRóÊ”´ V¤¤;JæØº«ïm”#Dða^—iA"†D€Å¨W8°´ˆë 7&=UáSú KÞ9÷WÚf¾¨’oÕ J£[ÑÚax¯ÑÀ‹G_Ùq@h Ga'¦Ý¤½z‚Ò÷‰0—…aüÃUOè@cüº4Y÷õL±öÍW9Ÿ~¾¾A…þˆº¡wäaÞ2—¯’¡L„—¡…”:~üci¸ö’u©0lôEßñ!çpè‡.ÔQß~LÙƒ‡£Å}§‰J­­ÞôLD«É¼D<@ß E'dãÒ‚µŒ¸âÕ? eãðñ2分—ï‡j”áz¢°ô¥¯,ŸÉ¶-ØhmhÀ ŸŸÏ ¯&ô¾kjÈZÙM†FEãKŠtîã¹RŽ/(^™Ò­¸ßñ¥½ §ß>€‰MËBÓÑŸYX\—Òw£{<ª;V®[}—ÅŸ[Y¸^Ê̇2~(î›A­„y²0~ùnÝÕ m°ç#±|\äÙå I+‚ÞnöØhî(.–yÌXy#“ƒžìâ ¤0.kä®—˜ûº‡?ûÌbãí1 šD4mZÏÅ—iHOJ©Ø‡õe‹â¶&yºu¨Ø«]˜!Þ±òS FƒŒÙ¸Ž‰ÍÐÐxká1ÔUÉŽÞúS†{€vÜÿfã¬[3¦ùÙ§¬oáݺ¯Äòo¥Ó™-€ l±Å®ž¦ÛΧä êm5ƒ¾t·7©“õŢ˷)DÌÜxoñ(׺Û*Ìþ&:óÐ`ÿ(îJUG퓱̪¢¥Ý¦FFŽäP¯Ohà}Öƒš8é¡Û˜êç žÑ»~ÃÍYI§ Í˜š>(“×6‰2Jm='Íæ€¤Ý*Cæäüxȧ/P¹t’¬œ²Ú>"âxÏÔ£ÒfÃõ[ÏÙ]¬²ÆâÚgž§½mVmË•ƒÖÕÎ,V“äß üdƒ2Vb¤@I=•yˆÖôÀnÜW2ð‚«ø(‚dêF7ÇÀñëãËQš‹i=òº±`®Ñçª(ýõÅË=ŒÙm5ÍÛÎ+¯>¡¥xɨïEoÔ›Ó6vßë¸ÈÓJ(d›_˜ˆíç|¨ùŒ³„£œsm²¸å…RSýhÒx¢®Ý´=l¾J}KeùýÈÊÀöu(rìËL;'gÖ‰ö•Æëù8€ÉgÀ•+U7Ç#W_?¥Ç[ۨ̈É­l×·¸·Ò¯Ûm_Û.¸·Mê}ËÒOCªy¦\ûcœBA¯šö+»Ç¨,hM\e~š^F*>ï0YÜFu'Gj&ÈÓütnO`Š—¤!&F.zÒóÍ&Äã$ž†‘Qͮʟß?i›ª°k26Ò…²¦¯ ú\ ¼´ñ˜‹—âüÓ!pJß>ôúÄ¡ñ¸‰ügqÑäÎë:ºåéÞPœ±[™ÚùìåzMAÞe÷¯¦ÎÐÓþ‚ F#ÑVÏ“×>¦Ì ˆm>#eœj²³ÓÁNéêìhÿ[–ƒd–eUÎ{¾í¡z0éañ™¸­,U1¦¶ný‚–î5öû`£Õ8ó(—þYÝÇ ø“k1èŠö~¦£ÊåÉàœå éÑ™>”b@ùù4‰Ô”BÛ—èÉì¡6»"‡Qù<\`)RÛ<™çùø¾æ†º¡¦§¤†2%g’K;{ö3ú滌 ¼»~¹«ÞNߘîÖ9ÚvÒ Õ<\›µ¿Ô¹1ý‘w=Ûµ'ï`­²-X-( K FV¢®’ÕWÁØ€¹¿ˆYNÝjS­ ˆ—fÙ7މ÷O4Ÿ ä#=©»^è2~r‘_c*s.sßøX÷¼|³Ñoˆ.zÏU–;ZKíAÿ©)Žjó!úÍQ’¯+Y¾GÂHšmE?ů ÃQŽu\îÆìß®U½3! á%›ÔyzVY³­fÒÖETr¦öi[¸¯ìóEÅ µR[©Â›û®V]½‹5¢¾ƒÿkp¢XõÊo‚ÏKÈç ?}DšoÐlyfƈY?]Í‚¥…´Çæ"[ÏÎ;1O!8Ë=ž }G¢K ‰9›£_—KY¦Ôð¥¾H|ó]b ËÔ«‡¯‹[“˜{u¼» î“lž~Ù¼˜"–^9ù›À,SƒÊ¤3x×÷™¢B5¹0däãÒaqMåòå®ükØ—Ô|±åˆœ'ç:»[ÐùJÐ"–W²U¶Õõ¸ûóxrѬChˆ_Ý€úmÌ×¢¢õÛT-ûœÖhl­ q„¼”N¸}ÈÔ™ŸÑMò€ÕdJ„¹HïCÃy{ÊÓµ×¶üÅ7‚Þk´™Ï.xµyÃdöÒX±ÎœIÐ楤2§ß™‰ÖBWŒ&7†1 fQ…fÆ^ÑV\œÁÄ'Þ68Ê=­…½™…y3Xô2 W!ø„9eÍyl´T¨ †ñ§›]Ömޏ°~-ÿ<c¦¤‡žV;öääÁ¶7GôщƒèF.wOͦ4’¤iFÿ*ÄÀa×̬Þhè޽"[#‰ Ìh¾õ«‡%Þ~5­X×¾,¾™ÆÕ‡ª,ÃñN"W §}gìXVª„ºñ(ºü…² I@«[$uåPÑ‹Í"._T6¿r… vq$ûñ9ò#«øDY2XÔ€Úzh˜JtÔ‘kó+Úë>» QÝ%­á7èK©‘à>7dò!H8-Þ}Në¯_1^Îákô¥´¤ºq`?‰È·£Û…èf†ëØhüR*ÏŽñÛõ'hFlHżq=Gã1¤~¯¯ØepY¤AûVJʤó {!Òäã–×`Ñ´~É;’*q¦Ooé'q@>zêp:+\¦=Sa}+X´ÿÝGöô†AoÏsÒo€4ð0îAvÞE[2±²@t¢§ÞŽˆ@qÃõ€ÍRN¨¸™­&,Û^…·;E$‰·3ØEK©v>IÞU¯mŸ7@«¼Îaóê­Pî|:b׌±Ú/‰sÿTÞ2uÐÑí~¤¿%¶ÀK³Çžþ±-i\Ò˜2eRV$ð68ìëyvµJítMìE‡äUÿäƒ[aé‹ n ߉ŒÌt @³j ÷é{çÏt½2}…nóÄ.J=`»ƒê'ãTËÅMX\1‰H:cER‡>êg"GàBPÆÏËñ¾ÐŒ9íX`‘t«ÙØÀá °ñùL$¥ã3KòC\›D#÷¸“pZœ9Ö6nðt z&ù$uj®8Uÿ].ÝEN­'±Ù†n0pu3 ‰Ö÷r0“qJS|ÿu Yt¡˜°çHSÞw Ë©‹mlŽÍDÔœà{¼CQ1Ñ—ŸuQ³ìB®ôïL¥­°¼E'Ò1MEòr3ìgóÙˆk·£iöNE`0‚Ïßè¿•GÍ:² ¢¡³oMÂÆaéP‹G^Á螺o¯qšå_Ëžt"E÷=ØróÓéÂü—Ò®! îÑ!… +2–8p·bÒ0\7½y‡Àw'5y„Mh3_¾Þ6¦¡jeÔ–pø\[‹Áëk%’–R*6[vÈÊXü'>J4¹rdÜæØ‹ºõKDIŽ}rßO.Ûéc+n?mäw­êæ*Wds#‡Sv»Ý1èê@R/âG©´¡\æ@¥×»Aù+nK&I¤bÀ¼— 8Ô_ÏÃNiCçXð›Bʘeê’ãr‡üú¦§ŽÍG9 ½Ž¯Oá±iÁÄQ!lÓ4>{®Ëzîr|a4·AX5ÏàÚ×”²y' †}õ´`»÷à2%2c/&*nü.œšSþ>Ò÷ßÁÓ~‘iÃyQʹ€É³ÕvR„*ª)Šó†Î…ß^?­ˆTHhuŨQí¦-JmmÕþbð*E sºD‚ËB¹i¹Ê¸:O2Ö`Εâ6Ù¹ÊVrÑy)IpŸAq¸!ä¤îÆCvÖWZ«ÌPáT´·Ò™‹FmŸT¥-!lîèè–š+:^Ù’™À‚d ½›bmþÞ`#²môc?´Iü”³s†«Z£ü¢‘tÇUM/ú×Ê2þÌFÌcoöõŒ°»”"/ºûù^Ó¿—0Ì!ïèîNÅ,˜xŸèÂè§Su +ÛáY£æ{ÐwêŠE8ŠN?pgÃ[M™Q=Ã8ãÜz rܸDï™ty&XqŸÐ}žº£<RWúx·ì( ‘GÓnjC`‹Ùëáe$¯»§Íu³® G…_Mœøl'̶ZŽfÄì us¶óÙd)rhbšÄªÅÀË€ü¬Oâ Úcۂͤ†b!ÚƒÑiåë]̽™˜ŠXÒ»ˆ•­$íuË„iÊÑEý™àÞ|m¯;Üá¹Ý"t°¢Æ%gJ߸ ¯¬º²9¦&Û¬f>škk¼›°¿Ûêü±†I¢-þAýkXÛuHxçZU†—sŒA'!€šÓ0Û·¡3PJÖÃßš«ó•øáJZ¡ÛÝxàN¶úOûǼ\>Žy›ðË\—‘[9u¹´s¢û…„MØÂ’b¥Gð2ko,`¯S¥Ç¯9?/‘R”s‹òx)fëko ¦KßdÔh‹=ô:¼YÜ}sÆ9JÏ˪=A`J[C¯ý‚e‚orÐEä=#1-;õÓ»,ƒ*Þ@_`Â{3¸ÊÎužìE{î 9×;ù|Õo‚_à ,{lºZIn3ºuCþŸ_þG™.Iú!ÁVy×¾ëÊãú¢É¤’Ffoñ)‘&Ì%«£æ±,ÎóÉ‹ñ0,…'ö¼ùÖ‹UK­¯tº2çøœÌ{ssuÖêJÓYºŽkWͱŽr†,nqÖX?YI©Ïõ•z}o[ÉÜ¢YGÑÓ)m@Ù¬}0 ýYw=±%uN†:Ö7Þ Ê+ 5h^ŽÈA£e‘´”çQ¯$mgK‘¹ÝC³ŽsȬ7"ª?}Gî·U»J¨Iõ¶îû€O׿”ÕÈTm¿*lmjme Ù ©Ä,÷¥”åŸr+­Ç°]£]@Ÿ¸ ÉW\}wzâÐ'(x Ùäòªî}üò¡ïs/ŽSeÊt†ŒMá)oOZF•ûÔô|=%å놆>])ôTr#–÷ä>¹}y¡ˆF£ì”[Ü>2 Yœ÷Áp’X?GÃ9nÔÌ^,ü2Š+¾æÕÓP4µñ´9¨ ƒAW¿ïÃ|ÝžR´+¹ôjû‰<ÑÉŽo¶öJ,Ò¶XÞã>ÎÒág^´ƒÔy`V=Å´»˜4')#®ìXm°éøæÌu?·Îf98¸V%%AyFÚ²Z¾9È2!”XŠYZy Ãdž‰feûƒè?¹s•íƒlÎ1K EeÖOzqHªx…|ç2ب}ìJNÖ«bß·…gHÎ÷µ¶Fg•TÉž°Ý*ÔG '‡³ê£+¤]^œ²îÝ,;ý"Rä‰e-ÛŸ”z9¢uYå’ŠWäwfkqÃh¿j¸ŠÄȺ‚©@…;®bj„­+k2†LO½d§DZ1wæ½¼oâïT-b¶Ç×—z‰Îý‰Õ(Zºš±ÝF©PÆvZ»dÌHÓ©s?Úrá+ ç'÷Øj(ÛXøíovðãÀ`3ý˜U4RgЬ#À!Í©€‘òžÃxË’Áûé=!”ÛfHTö½è ¦ÖˆÖÕTxÙþâeLûÎEwh‘ÌòõO ³¨þ„§R÷ÑÂi;΢fý§š^Œlr•‰^ôeûÍ…ã²}z^vM0l~þËAç‰aßKE3®qû'Ç熎(^?ÎÝÇÌ|*ÝUlg¾[žT…’ò3‡Zåœ?û£Á:åµuec±Wã28–#zëô2¸r…17! œ²”N5:a?c1ê‹ÞŠçs/*1ÛµÛFW¡Þ’B Z–ëI¦¶9)ê 9é­ËV–GOë\®9¸M^ìê@'7К‰®`áÐL´µªú!ŠÁhñÜèõѴΓt´ÎX r=Ì{ƒ¬.… „2žö½ÛzÂG•´N¥ƒM»ö{S$ÕUC°ê½…‡rŽ©N؃A[…¡3£EBUéG¬¸|ù™TiùºðÃ÷…n3¥(dɰmÎD‡àmš¿¹äÈé ôr´Æòr÷a ÙjW¹$ßBØ ^Ä­îùvXV]zv «ÇëN¼Ë¼ç2º2ZÈ[ê(jRÕÕÏÀ{•éYI]~ßÖùMDpfVø;íõžÞj~V?ÃÌÍ2Ür$hc#Ek=µHíj€ÿâ$ÇK¡æwï9pX`€+\›_ùèø&Š—m2Áã\õÆsº‹ «†¶|†Î÷a>i£Ï˜; Ù¼P7®_¢Vš@c=€‘nl¼å=ê*äóìKA.²PĽcYûȲ ÎLŠ?GÞ/¯´lüM·(G,ýÈ2W™äA_ÅÃP÷ &éyÀ™ôŽ|ÚÀÁØLÐ]“ThÇÎÉ¥§¯ý0 ¼Ù¿1Yþ‚8)°ªnPÒÖ8@i-ÊÁqà$绬gY‹÷±EÊ?ÎÛv€ 磷RW…ªa„˜ia™™ *‰¤éÿ1{'möåp\sÏ}û(÷ü ñÏ·¦Õ„<~d¿Áú2øís—m`Ñc«¶²ƒ˜-)ÖúΣ\wÍò?¿– \OA—d#y…5›Ê P\îÈ-%“½åoáÊûÚ¯ Ã1Ò[èý ȹ±“š€à+Wo¥·}<™¸¼dð9U$»\€Ûˆ96²a3EëõCq[fŠví$žý ÊO¨SÈxñ]íħÄgõî¾C7j¯?RY íHý‡™>6Ò[n¼[üŒâÖ™4Ÿ)9¹ ´Ó¯m5> 12\¿æš ÙIE¥¸¬o_íV£ÐÒŸˆoCuë,a.&uµ©ÆÐ(©†¸/;QS}Þh. œÉµ¹ìIݦQŒ,¸ÌH—Ö Ù(ÒM=†Ž ‹~ùCø*õ<6ƒÞ1#ãf™E7׌–‡‡Åyí@Iu|g êÅÖÏ!22÷ô¸úîOõ¨§°¾¶>#ú¤WÚÍÍ1…p‰ô%ø‹VÝÖ8`éd´bŒÝ ÎlÄÞkhBq ¶ÿÐÔ`EøPd,—‘MÊ»ý YløŠ{]ŒS_þ9-(ut8ûZ·fõeŠw ÆÛœ§ØÇÑ&úúÆ%ß¾ò6ç¹KPJÙ¸$bòð´DJA äÒÕyé8<Ʀ‹ž î´"÷j)RÒ¦ÒNðsãõ¨¨Qt çKƒëÕx½.a²Ò™!}åÕ(þØ alùÅBnu)îÂ…&h´týé¿ãÄaùÐ(Ж{š€éãèð™®§£mRàŠDx!›ï» ÞÎy'üQɇyɃ{*Þ=Àb÷Γ©Xð²â‘Šo,T‹ga„Å¢XZ䬵Ÿ{úþŽxûy`Á ßíêÃê5=Ý#— ßäÑ·ua$UøEwB;»blIµºÎ]„ ¾‹’*ú¤íó' Á;óæ$ 7³.Ä=ùqÑ:åÇE2Èf’ÔKÈÁò ìÍœ åUjý9Ü‹ã°jÁÍ…—–7c³VÅÚ?Œî€–ÌÉΕèÀ•Ç8ù6LZ:ZÞçT­Ü÷Ö@ëRT‡U¼­¥ËÎ Qô14Ã0†)¡¤Xy}ïà¾Ç·‹8[àöêw%Œ|ošlé ÒâÕè~F`V­ØR¹p}ÁfpA…?òÐN\—K¬€y‡ÛÊA¨òbíu•jœ¨B«,iÍѽN_ ÑÍ¿Û ©~±b)Èѧ¿nç]\†7ÀR.׳Rœ)Ä÷7|êP†¨wØ&õPE:‚z}ÞT7\ó‘uТ%4„¿IEm|ôRð óuu1nçs°ßll€’:ÄÏÕwY¥Y©\}15ÕÈBäQÉ¥ßYüÉù“ÿ g`Xáì¡cÏn´P£]½oXRb¾ip‘ßéÛã¯)á¡+PcË2fjÍp   d M ÝŽ}=¦ž%¡˜è4µ“&õK–¬„68 SFvò詌MläüÌñÔð`è¿›1k­0¹xYxó9Cµä™  Fü­âí”/y—ß…¬?FOb××K./=Ò¬#¤Êì˜å„äEe¿³¦%ÏK”®>bÞI•Ei¸"¤‡ê›íØÂŽ•ƒLÜ‘j,ûà7ÒÅVž{}]yÜM9†f‚š|R(yÖg÷q3ÿ;ß{Ñ'Jí?b„³â"ª$Ÿè jÝŒÎLÛÅž¸SÚ$îF0*\»¸TRûÑz~3OåýP‚³ŠÃ­ELUléÔ¾žãqn¿ ?¯x}l4‡¦&¨ØPúꙆqI.nuý(omÍ z»¾‚±ŠÛ©PÜÒµ!ð„·Ï1nÃòrx³%£ÅK§M¬'ÚbpÈìóCþï£Bnä±vÊÃÌ/ÓS©˜òÓœ`ßò‰Q§<ôœí»—øà˜ôG‹C<š†,¡>;ãý?š;÷HG¸yßyZ>¶ / Z[qÔñ­ÑÚ÷Üa½Õ;SµA¢på©c!îÂÔ÷DÂ`é×8±`Pž–gÜe¿æYŽêhk5ï¥âÚ,¨ÿˆŽÙþØUDá–‡6¹òÃy6¼•·Ä¦H*й-Ù Æ×s´Æw^ø–Q‹ «¸jÿa¥°?Oº¡»ÿ¨²å‘¾;Ë3hçRÙÔuÑ=<÷­!‚Ûg¡Œ´[¨{yÜt>ÛŸ×o¶õüÔô‡þ¥/tóq¬0£/z|·º6&6­0ï^˜4N7´KÇL2f75rýL®>xA¨slàöøÓYÖ\œ¸ ®Áþ<~–Aƒ\g”¥æ2bÞÜðÞ–2g+˜òà Fš ë›Iãï|ˆ› ƶÂÑy™lø.ÄÞ†z%Ýôjéz=iú¦!›‡ÇfM<›;ìó;7~ Ô+¯HTWtúfØÙMéÆ0 sç¢ó,á탉V0⾡w³1 “²,Uâ²Þñj›8…k‹›ýÈXçH;e µjâÀ :s)´qq+ºJqJÁ¬oï)ïe«^ÛT¢Ø¾†º¿ŽøCû¡ õ€Î£Ç]jºo¼orn³eÿ¦ŸÕµí,*»lqã–ç–H+&fçÞò}Á0fü£Š·á”ß?œ°÷Xý|ò'üæ2$_ÄrÅ ÆþžzÒí~w´ê’Â?]¨)E2ߢUžœ¹8yÛü‡ŽG–0ÎÅØŸQ>aAÞïû?{óÿO¡ÄßÂÞÌÕU î®iãàfo†D¸(ØØÃ•¯Ã÷ž&&{{+3'knØ¿‡`¡¼ÿÀŸO€WÈÿ<ÿå±èÿqüáæ"|<"f–|"B0Ÿ( Î'Ìç…ñ YˆˆXXüoë·Gÿ]úâßÌéß’ñwñÏ÷ùx4Û‹ÿŸ@æf®p Üîw¡r[ Aì€À„ÌþÚ®Â\¸ñîâóñóèÀüÂB?zZB`‚|ÝSicÿ½« XÄ+*æ úßÿÿëôŸÄ¿“£Õ¿%ã_Ç?/Ÿ€€ÐŸâ_Xh/þk¨)ÒPÀÇ!²’ÜUàu€ˆˆDŒxGËÍì¼pj¨hÉomo+**¦¦¦?îdbb"--=00PQQ‘˜˜ÈÊÊêçç4ÜÞÞfÙç¼#F^UÓ$’ï´$":œÿ¬®GÜL¼ºwwqIesPñÀ0÷Ü"RTµ'ŽÀE)‹½,³w‰yç’¢¹OgõÉä—5j(Ï1Oç«JÓ– ±¹ ]zB´õµ+ª©W­(× ¹ÌÛÉ—Ö)¸„77X©^øS)f»Í>áhÊûúª 9˜ªxª-ê¤Sb§¯pï•{¥z½‘ fkÍnlÓèQK©Ïå ÞÁ¨Š¡š—å‡ýuóiÖ4ˆÞÑsßvûæª8åx†(£óøƒ} ‚ºë´LЉ¸Í?6°[„“ tçn$ôIphÏäËH £ˆIº«cÕÇ/oá°©_fÁ¡VbDa¶#ˆ9]©]Öæq·¯çWbß*GMðØŸ‚Ìã® ¡ÊtÝĶjGÒqG(¦¸IÌ Rªä5)/'Æz“0uŸëõ*[ZZúx£C¶Ö¨YùÖó“ÀÔ„Fà\B¥¼û ñ® bÌʆ¤FDáÖªˆ(ŧeF‘‰6=Î}Ç5Ví¾±ÒKôë$¸Æ­³UpÆ-¯\Rui $Éöä¡7S¤Ëý‚£Ù« ¢9iD%Qj¾Qãч5ˆÌ“j7¯oÈ·$fQû|Á¢Izn…¾*?áû­3W:B4½¢ÑTã+VCuƒ_äöñÙ)Þ'tãé| â‰j‰æ}'m×Sõj‚J’®³7÷ì‹5Ñ·«nJâE­ú<óLǯ$sp‚Ràiˆ¨YZ`óÓÌ3ª{Ë>Œd3åúÜ.…ø³ßÎçŇ>‹ [q5íºó“½ƒ Õ¿¦ë:G\||Hi¦àïÌiû¢™²år¤ì>2ÂÙ—ü}¶ë)‡?qÊs.j¾zóPôpÀ‰ ²ãÕA 7D铱j£ð»j°J}«„WDlrʵ'«_.ˆ/@ßd Ä®X¬Ëq~T8!æÜM6yÍ5%š*Ù¯ƒ·¹ÖUGïJ‘-˜¹ß²¸ZãH*¹ív?Ð,ÊJxh ÝO2S°ÏÉ@×jåŒaŠQy¸ÀxÀZKÂOáÙuç¯kúÇŽ¾j«T£–ž÷ô"ên§mÖ£Ðlô[ñ=ìp,…dq–rþ^ßáA ¡›u>’vÂ%¾D7Á¤ ¹§éœBÑyúYøÜÆ\lmJd5K%ßžÆ~¸N7ºÉøœ¦ê“h²DP–ÒµÏ?h¾kSƒÆåEsîuÂÉ é"óãWsÄ:|ɯ ˜÷¼Þؘ}ßåÀû Lw^ú{D½à}i.L~ÐÈ#*÷c=W·Øñ!í{.ù7·¨C”ðCn8RôP½õŽÙþJë*ž#N®Ò*âÜr'îØø{r«D<¢;ð>è}P—ÿû å¯ó±y5''·ÃÞ´7 7ROb¡™µOnäºU•ú{´n&cWÊW6Ö,êg'[ò¶C2c¤1ònAnÖa£¼ÓÜlnêOót‘ÓNitO¾k±+¯\*Y.ÏÏ¢#]âÄU.’~õ§eå[úZùÕ…»}ƽ¿Ì·þÃ)V5H*¤vƒŸ¤híÁºYáÄ‹œKÏŽÊ)ð“ð*Oc騖óA|$-3WK¾”ö—¨fJÙ^wfJ%rØI·»4áÝ™Ùû±MU¥/ªoÌ›]/é’øÀtìuX§ÝêÊ©ëºp™g·)©%7Ìq~"¥¤ñ—Ž|«»5>Ô/…¤p]‘£2¼›ÝâÄ(R¸…ÍOq?ä½q0Q™z¯óÒÓš cþ†žÑ‚I ÷àVsÆ£_ÚœO]÷X` þ¶-éòø‹,Ù°¦¼õ©áw‚]=¢Z$z{‚(«ùª²¯‘JÇëà¬ö7U•ùÞ•ñyEÉUhj6óŽbX{ÝõÒRvöx7yÜǼ[ãff•ê©tØÅ[ÓwáHï §Ë ÷¹åÐJ‰H’óƒÂ4* ›Ù~ã ڹ؋…}|¤ÛëÓºjü¤¬>•ö·×šˆ¶Ÿ‘æ&õ‘áOhK¯Ü~«Å‘ý-¶ˆäüÓ?ý˜Þ¨<<„X¸Êkz‚ÜòKFÿ¹§$GI?”‘ŸR\h_¬·^‹“j ý TFNÛCÿØÙ‹z½Æ±.¨:ŠÔ2¦ÿݦE—¯M5áèIÿÍÏÂÖ?¬Ti3ÌÏf¹}v¿Št9êYÇ-fKÒ”Ä~?ˆÎ.lj‘é€|eš5Os²?P@¬{œ2ÏÑ—È ¨u#­²e@¿Â¤ôXb¿9MéyJÂkþ=âÚ”"1úí-•yZýòÊIÜQ½i “S¢Ó†™Òcò;g\'´×_Û¼þ¼‚‘žˆÀréÅÇvø_ ;ûXšG¬ŒüsoW‡¿-5±BjÑ]”Ù©ÊNÜQ¨áÒ/s×ÈxDÏà·™ˆj¸›ëàD®Pªâˆ\ƒK Å¢}šo+›° ÷È|'ÃK #Ý'ÜBH÷´±&ÜÜf¨ …ZÌplùTé[¾ï¯iùJ¦ÄØ~טYìÉ `¾wÖ¸]LüEÄy*bG›õ´¤ªÂ"à€WLRh³½Õ¬æß•RäÄU.&dßC;(Õf(ò퉫}g!‹ÌJA}›aé«E«9f=ÉþÇ[½±Œ”v §é)dÑë±ð ¹Ý(ZwÇ!ò½Ù,Wö¯üV1ûXfžMÜQ‘j¿qf¦BUÚÇ7¼¨…ptÞã¥wi{t¾ep Ùî_ÅLf;œ!Ôéƒú°âý‰“Ïû–Ú#r<ðâIJœïIòTjrO厳æÆCà0;Îa¹'††+X.cíŠk×Äè9ßå©ÍJS\K@CÍ@3›¯I1™zA›yQƒ«¸Çx=;4xJå@HÔ³I9OÓu,WKð—óè–à±Þn2NB¯ÇÀƒ.+¨q§ •h8ØûXâ‘MxeÚ1ϳmÌ:€ã—·èŠh:8$ÒÄ9Ú bÖ‡êì¡'ßk .t(ZЧ™ûT"QmÈÞ…ÚpšvrÊ;ÑïÀ¨Øû¢rô™ÊŸb‹âÂeà$ïW¿´ªR–†˜@÷.æ~Ñk†kéw&ZXž ÑãÙß9U;÷øÛí¨SD‘A|QÄŽ,™\>:#î*+Žc)Uð’çx¦ù[ÆÔdtðó¤é'Õ}tÚ@ÓSñ‚ø6:,°¹‹ñ(>#u%{/ÊCî´Š;ZNºé\æN3Q–E×A{ ¨ãVË¥®‰óëðîpêßXwš©4½6gTå97]U@úR:s5s¨tuy¨;àmqÿ›;KýAv+;Lâß$\þwzz~åQ¿³´¥àðÌŸjm›L¥­o(ѦyÖÃůf#ü·ÞDÚ¾†~Mʪ!xãå_%“§$)1z¶‰£gŸ’Œ“ ½ªyoÒ­ˆYÙ5uökFfp¯'ÁÝÚTÌ C(AöI, ûܰPyð™¥B†o^×ÌÄL5-Ò²$\ñ0À}L万¶k(¯CEA4l\kþñøÛÅëûƒVT\WÀE×U{ÆÍXÂï¥æç>6iÍ•Q£Y ¾AbØ™¹šm-<ïÞÄÛ?PúU"ŽN—t³€¸Ò¸Ì¨Â¬r¬%yËk鳄»ˆSïTa<“Þ "NR +M?×Ï™ÌJ£-ÓÇNЦ«¯³2ÁÖ<©dô&žš>¨»ïKÑS‹‚ûP¢ߎì'²·iïO4=NÎ ?Oz‰–­R1ØâtR5rMTÀ̽ХwɾÒy¬y¥x¬¨ŽÅBþ‹³&À$Š%’µjß`(™èÚSßŠŽŸ¦üR'd)zþ;qþ9Ô©²aí[U,‘“wŠd,\‰ N)ãb`¯Ên'-=vbvß/û.¢æï—ºöHµL²ÊÒndq+E¡‰[fÁ´ÊA;étC-BáŠ8L˜§gÕ ³‘ 3-3âãIÒL)Te ñœ¶ ùbë‡z5åÖƒÉö sûëÏ/3_ŸÖy–Ž ËÙ'Ýjx›(ç*b0¶¡‚åüôÚ ³_"¢ÿ0 ìÈ% m¥>Ëe˶Ê{sû¿J"LݸI<ãc·ôW YÎ2=`õ‰¯:1ÚBaN³uË|´þ=êÊ/çiü5YÛ.ebn¶ù>·ý^çP9ü˜“®›c½EÑTkE$ܧ,ÙX,t^oå“*јm'ó>(ÃhþÅyðÉüVîÒbkÊ ÎšÎ@¢ P'½Ý\U«w×´ÖÿtáÂ~{ÖàoÍÍ´~úÎåCoòüÅ^³–U{cµÁ{݃ÎmDµ®j9ÒÿÔ—³Å¬’”X[ô»óº~ÐÂ=t¾ÚXÊQm%[×¹ YÛ¹yö›“µNÓçëDŠ’GÍi-¾œÜgâ Ì1–Xº{ÐbÕþ¤EÝ*Gˆtž©¸èñåÁƒ>rûÜ©aœ^ºDhNàD”ÚÎzÕ]VõZqIó£’˜Õ§<ç"”B%‰Öy¯'T ´ør@DÂqÐ{ßè—5ÊL›Ìûd"_e Ý“{ÿ ®Sÿ8(äÝ¡éǡ竌àJ'ƒ«;Eñ®´ÈÂD³˜¨¤}»J ˆ•²®$»sò¬ Ø2d:>Fœe{ëÛ‚ŠžS±ôÛÈEÿXì¹BœGFƒ|1¶ºÞµ;V$}»‡“ä´š«ë§„jzNRrÎðÐÊ`wbyÎaM™!ãˆÁjØÓù¯wÉÔTOõ‹§t´P‹æu—+ ±k•ó½§Víþüßé€C‘Ž›&*ÀçɉDD#HGÔ>CÉ8 oq¶MVbáÝßé‘S“+ræ,·ÖQ¹ž‡ p挙ÜÇ&²ðÁPº®†S¬f¦ *  /§N½LÀäJ¢œÓ°ÁÓòCeÙY/ÑzT¬¶8|>¹ÂL韒ƒ•;´¬LÆÙŸþ/…ßœs\ƒ,&ýÀ“C~¾7>Ñú„ç`«ŸèP³wìÎêèøÚW „yZšžUÄ9­6åjŠúÛ`pÐÍC¬‘•ÁðÞîÊ`]v'óã2NÃÉ "9d Wó3NÃe95«4‡}Žye‚õà_ž2’ÞIh¤”c½ÙXiî]©È *!Vkð­‰0¬š³=âÅ}ú ÂaåÛx”gøêÅ#Uª˜—Ÿ“ÂÈ…‘×J n'ôPÔsKß `í¤LXlzM´®ÐÒ~wM´tªèXù»! dUˆ« .·Öß~¬¢û¢î„—*íþæ!ÅÃ}>)s‰ ‹1 äF—šgH«ùØÍ~:øþAï>£ cÅi×ã@å“ôXHêqëm]›§"iîT’ÑôwÏ5)SIê2ðàz¥*G¥áÌ‘–å9ù‹ìfm*Í#I®&ÏÝôp0j4ä=ƒq õdš¿Ú梁ÍúÙäÖ»ÖO=ý›¤^HF¾ð¨ºOÊ|îëã*Ǿó/úÕp#GæâdlÇŽl<š_Îí©'q0LéÛDÿÓËJEÍtº¥4”„6 ÄÊñª¶£·l/Z†¬B—ˆ´/‰qTL>tß[ÔQ™z HúK¤X ´À³(§¾èÝoœÓßPšqQ3Êœùy%;˜ò¼Üi†Š9ŠZÏ9˜G˜‚œ&鳺rge5Nˆ ƒ×ÞäÃéÍÁì/(œ~þ2€¢óKUÚᘠN¹P´ý…ÒË¿u‚»Óh °ðœ W¥.Uëw²¸Pzd®ˆkk«R|c±«¢Š¸¿+l;K¦4Kr2"1tÌG¤ÅÄ,Uª°„¢©ºÎ›í3‰›Î>’®p!A戄¸Æû !^D§Î‰¢ç‘>kF2ž¬´[íoC•¶Žò]ˆ‡ð•gšUs郶ùÃO¾±ˆ¤Ñ5lï«°øäð숉b­Tò÷_[6}j ùZîÝoèôÏ}C…½w E'Ñ›dS4JqZ<{0Ù?‚}͉¿êLG¤¯ÌÛ 5ÈŒo%ÑÅÏ÷éŽ;u>è0³dâüòä”!ßlÃ4Ï:š•Ò`®Ã’|ZþƒÇôªÏ8y¡ÝwÁx5¯Ý”±¨`¾¼ÖbÚ| ‹¡QÉ™ôã”lÎÅ#ž,–+§Hô?Fè^û ¯^È‘Uåã³V§±5$Ï-Å| TÒŸœ“\«A©g~U†üÛ>ÿmâÏ*鯃p÷çð»£ÿ÷ìq÷þÿ¯ðüï÷ç÷žÿø´ÿ_áùßïø íáÿ3hþð_èùß½ç? íÆÿõù_!~!!a!þ½ç¿"ý#þŽpwWK7kÂ3ÿ™Œ¿¹ÿÏ#$ÈKÀ_ŸG@W8Ú»ÿÿ3H├º¬–¾†„?ڔЂÛ¯ä®ƒ  Æup¹üSá.øÿZ,ÁZÊß…ÂàNpÀ‡-fNŒ»%˜'Ù@fö@JRä»,* à4ÈÑÌHlѸnæ7Ûm"!@#ø?ƒiÇD Wk3|®Ä?ê‰Ïå€v€±y……ÀB‚`~>°(ßoºü•>Œ_ôO(ü+ÞüÂÂ`^°€ˆ˜WXà_r0áùw|F711w³bòoÄòóƒy…xÀB"øGR…þ¥sàç®XÜéùwDÁ|¼€a>0¿ð¿ÁÃûö«¿á.Ì/LP_D@èoÕ¬ÄÃAçÌ`ÃVD`Ë# Øòÿ‘-0}9}-k×ïþïjpw¹[ÛXXòž+fƒçhï "È·?Ž~„-ßßò_ƉfföWqàÿ,Xðþ‡ñò£Ë_Ú’ÐLäšÁøiýoÃE,(æç‹þ§ÁDÿ4p '§1"‚€§öÿÚÏ€häáù'ÿwB„„Á€s†ÿ_JÐåû£îÝ+‹j'ÀûECý}LZó£È?òwCæØ ‚ùðÊû×N.ñò„8²ø³KîžO $ð;§Aøy„°üÝí 3°Ǫ̀þà½p{{'3 ¨ ~;vu2³ø~Œ¯Ž0A*dç?—ßN2ðM%ÙøØS–„5ßNE…¯_€÷ÕegÎt€;(#á*pKÀ:Žw ¤[ØX¼\l¬¬“׿"@<ì2;åÑÓ?±ºº»›9‰D8ü±0þÿ©ÈùØþ4( ê² I꟨Šo°£è޳¸ëŽÀà ‚lè=àï4ýëj‹€È€°Çד.x³ì$ ß{º ÉN‹9@Y'|¹L@“ê—(1wBf8Ÿà¦H) ðk.uÑ i ,Û$ æøº&¥,ö@ºp¤ÜÄaO¨Ùvt2§=!f\w'\–!,·¹wbœÛX®Iý] Båf…2ñ††Ùÿ¥r:@WÀŒ»µãáæý›nrÀ¢`w>^ž?ô!̇N.`JtÙà§@W¤‹¹~íhãHHÖ'üÜg†Ù Aî6öö s8~ʲt³ƒ€– ]e-%um-ÐE5}îÅ«W/ªié‹-sWá×á;|lœìm¶îf.Àªé‰Ï-ªòWe•€ö/)«(kéã'^e-5yMM‚úUÐEÆÅ«ZʲÚ*¯+ý«êšòÜ ­ øÊoÊidoÌ®€ 7 Òuœë’¦ˆ°xþq‰¤ ‡Ô‘E8yâ#æþ#hM¸¬TËJÊ¿°þw/,°Ã ߘ\¹ˆ¢Ð ^|Æ€Á\à€S$K²Šˆ–ÄË®fööR¿¯ÑƪÀïE'ŸˆW@Œ_DŒ‡„GŠ q×¶°¢ßI ¿gyüþ…âîîÎýcëð.aÅø=¨þT¦|oH(EsÈ÷3l?²¨ƒ fÿcBðïÛQ§v‹Oßw %Rÿ­JíÞÿû…>ÿ¿÷ùïŸB»ñÿ¾ÿkïþïÏ¤ÝøÿB÷ÿ÷îÿþÚÿ/tÿïû_ íÂßòºÿ¿÷ý??…vãÿ }ÿ×^ý÷Sh7þ¿Pý¿WÿýÚÿ/TÿïÕ?…vãÿ Õÿ{õßO¡Ýøÿ:õ?ïÞ÷ÿÿúÞÿ öxúáÏ‹þW`oþÿ)ôGüñw„ÿ2þâ_ÿŸB»ñÿïä€ÿ#ü÷꿟B»ñçûuðß«ÿ~ íÆŸÿ—Á_`¯þû)´_ÿ½Ïÿüڿ௃ÿÞçÿ~ íÆ_è×ÁïþÏO¡Ýø ÿ:øïÝÿù)´‘_ÿ½õÿO¡Ýø‹þ:øï­ÿ íŸ÷ÚÿÛÃÿ§Ðnü¡ý¿½ýŸŸB»ñÿuöÿöö~íÆÿÚÿÛÛÿù)´ÿ_hÿooÿç§Ðnü¡ý¿½ýŸŸB»ñÿ…öÿöö~ íÆÿÚÿÛÛÿù)´ÿ_hÿooýÿSh7þ¿ÐþßÞúÿ§Ð.üù~¡ý¿=ü íÆÿ×ÙÿÛÛÿù9´ÿ_hÿooÿç§ÐnüÿW÷ÿðÿWH@€ðü¿ ß^ý÷SèñÿË¿ÿ¬ wtE¸à¿nÏîbƒüíï¿Ãþ=„ðÿ«¿ÿÎ#ðøó ðà¿ÿ{ïûŸÿûÄ#À/(liÉ+"h!`ffÁƒ‰ ‹À…ùù`‚pK^ÞŸ‚{ô¿GÿQü›9ý[2þ.þùþ1ÿñ/$¼ÿ?ƒÌÍ\á Â7W»Pá¿ÄƒA`Bfí Wñ_ ¸ ˆÿU¶| ^Q0¿°Ðž–˜ ß_÷ÔFÚØïÊ: ƒyEþ[_k¶Gÿ&ý'ñïähõoÉø×ñÏ+$Ô†ÿÿ¼||{ñÿ3(XCM‘†ê>i”•䮯½DD$sd¤À»oä…N -ù­ímEEÅÔÔÔãÇLLL¤¥¥***YYYýüü€†ÛÛÛ,û<€wÄÈ«jšD2ã–DDÌ8e¹‹Zq3ñª~=B…A²½çhwQ#µ^Fï'vÂÑ9 A×jm$1¹mŸ tV… Fî6rذqq½?\œ&Ì&õI’ºxXùÊ qân½¡Øÿ¯u¢""ߘúl¾ÆÖèÇÕ`‹oÙ§¦¿sHU˜ê0ˆ«q¸]pSÀ9´Ü‡{œ¯T_E÷Ž|Þï°mõ°¹p—÷ÖãF'ÝáêU÷ÌÁLë ªÙˆ›ÓÍQߦ}œÙЃßnw3VÇrW¡MP8-¦"¶ö±fr„²¼Ó}R¾å~à ¿Ë`\Q°ë6jH-°#Êqœâ¼ÝêóÍQìñ¼ÙUîÁõŒ@È!MVÛÕ_?‰^q,uw©´Ó͘éMõ°øh¸Ôßh!æë4ð°xÝkúáÁì‘Kº¢û® «•…9q¥îoîXûò%? w©jsš·rVŒöH+å~áwa«}Fú}nÏ9_½FV|*ª R¤¸3¬§új˜í¦ƒ0“ ©˜”×–Þðÿ½/‡rýoCd©TÊÖÄdŒa0t…$[!’­1ØÍXF‹ì¢F]·kב¥©±¤±¤,©H–±eÏÖXÒúgèÞÜnÝûýýïÇ×ï÷q>–yŸç<Ï9ÏsÎy¶yÏsí§Â¼^úX¢i3ÐÅ–åõ)ïO¿®_÷Á „UípQ`ó$Cû_#d»Bs‰÷@åE3‘óþ.ÇË»äj»FÖÕR.Ë×v¯m5ë®U ´—ðbCxѤŸw÷ê?‰÷ÆÿÊôijKEЦ =¨ãå ªŸðy„¡ÐÐo³f6 (ºàºŽˆí ®=@hn}þ¾LNøB"Ì÷W‡gB°}áãdˆXú‹°¡qŽ¥Éf›¯ÑÏ®7x½Þ=øj•üy_¦ýQa‡g±°}B0ÉaBŒOZW£)zÍHôŽýqêÛ™[‘Á)êa—4O?ÝÎ¿ç ´Ë<½A-TÖ$–u݉°©@¦–¿hÇÄÇ+ÏgŒÖ->>µ O”]I—€uí„Åôiú”ëÇ÷%vfá»5ÂiZVx©º‚‰(Ù\ô7.‘9˜c”ݹ»†9œè=83â`ð¾ ~ìð[¡zæ*ìíèÑé³PÂkzI2«šõ“Vû)Mm8y—›,ÃÂA³)¢e"ï'ìS×îV~© ßo˜ì0c9~,6a(TÅo0ùx£®âq|ŸmyiœA,òý†º‚0¯Ç ”OÁgb!ueÜujÙöiþÅÙ/Ç6à®g|º½®~sX¹®à¾a޶òXÀ±ã>÷ñ1”昨Î^La¹X²¯nÚ9B b©Õαu[ÓŸ»òÝ E,s=y{×7q$–ú²ºm»©ì&×IÊõ V£oV£76E-y‡ŠÞ›u«Ôå,²›i³o„Ô l'$ôjaSĪ…ð·dôjã•ïÓc~dv¼»‘*jÛXÈ[Tp½’ˆM`Ü2:Àü¹2®·­SíM• ¯°M#œ«ç\ç½o-‡êøy:› F=ÂÑâÚkâ{íyOpŠ>ƒSlŸÃ¹¶Þºìc̔Ȇ¼u”¼NNCÚ1?½ì‡µ.¯#D%ô]„»ÀÞJ‡èãíF›jVÕèŠ!^\‚˜ÑåÝS‚ߤu~ ¾VtÜü .úæ*¬ÒžMórïxâÀžP÷Ô.ÑF nñÀ8C»£í@Ã'Ì«6`l”'VYs|Ó­µ‘O‰<­p*)Z‡x‘ ¶E#Ì<±ÍNkû)À&ê¬Ã²ÛıSLSBEv>õ¼~¤Cv›àT’KSC°à¶BŸíØÕŸÇ/oñ™ì¸Ê)%SûžDÏÚÌ?É—ú鹕¼Ü˶%z·w¨È‰F«b.Є@BxݘgIÃ^µŽè0{%ÑzÁ½¶}«»µ”~Z&f˜º|E¡BŽcåo~3›“×Á½‰Ñ@µ«(féf¼Ü'TŽŒÞ¶õo›XÎå´ƒ¿ùš·wyQ÷{os„bÞ½Z½rÕf ·mÊ]ˆG4zã>Ú/ùW }À^ÏcÕî“#öñÈ£/§ùÖ¡À¦ƒPB“¥'mj;çj¼(ÆŒÁ¼3tåmÕ+÷Ö+µOxT-[uò,J+&tlÄþIT̶)ã »+xªUXíê’ÜiA¢c‡`m9²¶Å<›aËkrd)¹‡ì.9MÖ&7hføêãÝdÄG6и‚KêëKÃ[Ÿ ––$µ—iUiÝÕ%c”j¢÷µz>]ÔZ^Põ£X²æ¤mªï[Òë‚8ÐÛ¾‰EØô­ë¬Gãn+ÙµžˆôU™Þ’Ï0D!©ã)डÄØP†J:ˆìO™1k⛤È$Þ¯Oäÿè0]jý §_ÌâNY2¯ØÙâãâÚQ÷¡êóªÃŸOíÍsà÷tÖLDm€zZÄns˜¦˜ðqÐêAƒ 0ˆoÎ*Û}£Wœ–n<“ÞŒÚHø8iÓ½“QIÍÖö²Ë¯8º–ZÒŸEhÕé(¾¼qÔÚúùÈK1ì‹h·¨\Ø·?6û¨;Œf º,§W-ÍÀPm-©àÊqKû.—ÖG×s;“Ïê´(N[¯ŠÍ Š p|ý&‘+Ó¡ˆÑfîì"Z­Më Mî‰(ÙsB?é|@óãÕÌl6 B½KäPZyU6‚Nž>³«P!º[6¢D+VVDÝ"%×OÉm‚½í)­|Ñ÷égI™%›nöI3Uú„/5hó;®.<‡ÒD”ˆÆ¤PPOgO×Е+£7Šƒ6c{?Ð2ÙÉiæ±;¹pÓ› O ‚¥Mª¬ÖÒk0ÒYv:rX©,PÅZXóÁãËb+åq„Ô¬ejlVà¹5¼³ó-O×Õ BVkÕèä±ÚÙ~ëµH9É©jªpk…Ó&b€OÜåîJØ4}ŸaÞÚ’(ÖßI•Q°å>,m½ûÔÔ”P¥Š‡ˆ&šO}Rn 9Çïr‹îgbÇ­‘.b3 ”·¾¸¤:T~s%B*¯H‡)ÿœ2š±Ñ—â!ýv¯)HÉï!W_ÕêéÚ´- .ëâd(g.p^ºìi­I9iÏá{&ÿJ^•GGë:Ϊk°¢á;'i„&ÏI9e„¬ÜbÔp-qzó ´úÆseù]ƒ;7¥þ¹oÿê‚4_Û ùÁ6Âÿ¾¤‚]œ±×Ÿ-x .úÖÖxG.xþ>àQ'©È«•ªkû%çõטF¿íµ—"îZIY¾ü(OöÿeRîjÙ}ì9ѵ¡¨…#+‹5Åo©Õ¸¨èD›¡c¾hTÍ„Tˆè)ºÿ£ó+`žê9èëÖ”ã¹ñŒWÞL[Â!³»æË¦÷–nqõïáuV}¥«»µÑ"ëU÷þ1ÕnÖL¼ ÌO8³rêÞ8ÓGõÙã§žãñZ=û´ùwý"äÐ5):v$¹vâMì­2¹¡§D>êÌg§¯-«=þHJó|¼C<§^õÄ£Hw1æ×º‰Aë7xAÕHS»ÍiC"~WÿãÅ?ÙÇ„&’uŽ«¢W5Ÿ™¶?~X“ƒ³ÅºøÛ´ÌR]g§g¤w¼2ã4ÓóÅH?i?ËHµ“ º¢e}a ‡Jº^Pê/Å*à¢ÊÎyùNרìîmï¤"ê}´›|Ï£"‹º­©hÆÙÀß Ñ\«ktCªdƒL C­WÈ{0ŽRº©ÆLž.˯ V’ƒðh;©qHŒ¶*@:vÈ §ˆ§‘åΔÿÒ;óúüϯïrW»êÎxÞôaÊû¡Š@J¨×søÔ¾‹gÑâG_¾a!å+§‘ûÓ#,kl£«…_'5]P®¡[¯¸e'ú¡­Ö(¡/×zÅ¥ÞK‰2æP\cÜÇMݤŸ´]´~o90‘×9p‡$T:ô]¨4DÝÄ÷È]ê] 3Þœ›FÖ>º}í±{ñ™‘]?3¸Ù;ÂÕf¹É·‡ÓèÍ@/ÞÀOrJÏ^Õ+˜æÄG±É*ÕÐSn¸3LÅâ{‡WÅ¢Xñú½mFúo‰„ô]´-ŠûßáoÑNBz¢²R ?P6"‹ûWø÷ÙùU.Ý_i›ÇTD Ja/¿+äèãë³EŹb0„ì;¶õЦoÍ« —¾À¯äÕTUÚ¦RöayAmݶK£cõÂg®+9’Ö‰ÔEk¡ Ä6(+Q:º¹¡ÏÄïþP„ëYr…±ŒÐõÑOC/¬*Þúúõ´ª‹À6%1ø&eû'¢‰E[¹»Pdóä‡ÍÏÖæ†8ÎÐ ajxVƒÄº4ÓcpåÍ W÷µð¹nc—<åF»îÉ!A]súiy ·DÅíp”–E¼Ú¹ÎBœÎ¦uj@SÆŽZ6UÄý²PWP]{q½&Õ7Êg.oM‘8Æ æ [‹(ø —ŸÉà³6îŽìnì·O'ÀaØÐŠ•™õ4ËnÅûî×*Ηe6Ÿýð­—í[}Ö¦ûNÄÃN½Õ¿èqäîGîò›\ <ÖR9£‰\Û~•qˆßŵ§lŸˆÅ™`±{ëŒÌ2"ó•E}¾_ÅO°Û-W‡?,cwl…ãóx¾£`Ìéq‘à[ï«BýCÔªä[¡Ó?õWUžn­7 J-•Nj¢y_8§6ñT³¡løÜÛ‘®w„¡¸×&%­ÇEÊx…¦(4ÄôȇwÝyÛð%ŒMƒÍ`JüÓÑU`µÏµ‘ئ(úHÇO3@¯ÐGÛƒn¤¬‰à‚ÁŽ Ó'-ÊÊ_Mæ¼°¦,ªî’/Kaæ +®äŸé©ª¿VÕP;õ¢?ꎰºð¾#öšW„ëæpd÷¥ Ñ¢ƒ‘V!½Ž=õ¥&Ê‘Ú0:÷Tõ†é0‡œgcÐ 9SÕ—©žYÓÿûºNëⓉh ÔÏ:Ij»*K:Æ8+:rLò”`^W?|X”ÆõB³>òÀßÁ× 0èÜܪI_×ɵy !Hæ„‚)…yzóR49k¹g¦+¨Á7‚èj¢÷==yùW¢7×Tf”Ü>< ”FâÃ,*;rVîaJ¿ò,‚‰ú![:ïhpr!±"ž•´n¬ŸsìˆJ€ÁÐ@|‹üôŠðK¥™=1›jÒjæÆ([9xßÂ!1ébWcÝu[‰Ü­û¥(­/¥uÓØXfeæ3Ú´¿à„®w½u¾:6™¡%|Udÿñƒ"<báÅŸÖáû3Ò³}2&FV¹«móƒˆôÐŒÈEÁw¢¤%ï_ÊN×nÝYDOy0ãÓql¨ ÿv40×ß•ßmþ²;@½MYá8e¼ä&DìÑXbÆ6A¥])YEn.l…âý¯óDCÇb øWk2žûÅŒŠ*a%_òV»;T5 D¡·¥(]H‘ “uiôž¶õÓ™XS)¦…pƒ?œØï0úäžæ‡„Õ#'‘ûaœIå½xÙ þLÍÏ[Î=óªÝ5¡~:ˆ£ô¯¼IÓ3-ᕦ øK½(ñé6ÉꜾŸ²3¿c_¿½:_¡P~.µð6\ÞF°ÓëÉç*^ Tyð9M¼„ßSÛ¯ÌïUÑø…1ŒRÇ·ÞidÐ F¡Ûpz¿XÓÑÏákwáÎß2fUfëÖ¬gž8¤”f0*¥×±Ÿùó‡Â#æï\6½ -{­uBÌ]HȘÀÂ:a$;eôšÈD5[+˜¾´j;Yó¤• EÈ:µ{[€;í슞Æw ^Û™uò¸o`˜ØëéÚl…õvG9ê§SWLµÉ¤‰&ŠgÁƒ†{?–QìŒlö¥ÆñÈ«ßÉ⹃.ðoÙ˜3ŠmÚ}}ÿsÊÙŒ=ךÑTÑ÷#¥=chÑÞùö”ãáùºF”Iã¼éôéY6ü§·wíßF´t²híúÐö!Šé‹"œÿ?@#ÚQg/»{jù”vmF“ì À[’(¤³¢E²Û+ï†|Mû)æÏ+qø€»Ž]á´zJÓ¸PYëY ~’x~‹þdšÄ%üЃ«¥øÀJÙ6óÂH€Ñ<‚ºvG¶»nC_ gÊí”Swo¥Üe‰»ñšà¸ëÛ³†¿iÚ¦#O^ZwÀ̦á*ß®Ýû*Åw¹ÓíŠeO>{:Æ >ñùœ3ä ¯´AmgLâHD÷i´_XÛÐ ”OàD‰°_5žøªÚÁms>¬/¢UÞÿwëÚ€¸"ÿ'WEiAQ'N%#z°®`t‡)œO  >¢ú@þ 9„ß}sÓýñö‡ÃNç½íâ†p, ØlÌU•ù>]¤LŽO òÖ9ˆ]S¡³ñ-¤1k®Ÿ\/gõ2DdªIôáxÚç;úœ[+à\”û·8L[½VÙ_〉Z!…Å;M$DnSåÿ٠喙»TS˜Š¦P¦pÜ/Ÿá1‚@Åîát÷ß2Ãi1ë™Ò§ªæn(Å¥‹ÍœçÀµOÄurqu®?wìX  ‹‰›ç­ØL`€#VˆS˜ îAkIøº–|ÞAˆ¡5­iZ!f€Ö4¦K¶¼ƒsh¸øìÈO/!‚oø¶ÈWpb˜Û|8Jú5ËÎL•8¶æ7L|*Ð,—¯ñ¯½HV¿ÑÔ.Ìþó&IX¿g;O>6Ôr}R˜ôÜËàUjõR«¼yݺëdÿÁ»#·{Q7úžÊlpyÇ—"/Kx½­ñs¬´E½rÍ3‹:ïX(ØHK:u¿¹Ú3n¸íBfvŸòdjf¤õ¾±Pn2éIauÍæ¨JWó }‹:¥/ÅL´¤¡`/Hù=³'û5ÃoôÅõÜè»÷8!öZŠ`BìÝxÓÉöÄó° :%Å?‹v“l3¨~‰Ÿ8p¾8³’š‚LHMMRðpøÍßÔÍ¡×å]رÃg2JìÖÉ›{µPë%‡ s' &vÝÓ,(ïÚùæ¨GNÇ`Y²Bï&»dªÜ­`Î5Y¼ü“ü}ê?§u\:ÿóñuË%‘°W|âVÏ7>“`#lu*èݾz#ü"MÎ{ ð¾Kw>RÇ¢x¸ìHéù ÃKeÕÆc]ÐÞÊø¶ðmmNìôûJEÝ»Cw!µ?Þò4¨á­äÿ„—IÕ¨_k^ç@+Øá¼Ã ?¢xŽMI…¿…’æÉÕÅ¡*R©´ñ(˜Š2NzK€œmê~òd@>¦ÄmR:„Gá=jæ(0I* ’=ùÜ•àªû›<õ65sSÔãȧgö„õˆàÓ7ŠZåÜÂóÊ3ó­9*ÅcŒ“kÛgœ0‚Þšpq|ƒÖžã{*çbõÊãÍ•Ê}X‚¸þ}¹bãð¤mE²càKNÎû©LÑ7ŽNa<â5òo çÕÈ×^YWÞ§Ö˜Þ®LIôlÓÉ]wñnïiòÉe†Lèøjºc<Þ 1žyp_å•O0ÁòK.ûyPO¥àá‹2ÉŽ«•„ê®54†ºC4½çYáRâ{“#z7Í$ø­JRƒQlŽðf66ùphæ‡X޹aÏeŸ2¸o¸2ºW®Öê˜q¢"%þb2gÑí(©¤4Or8µžKú5qeô  tA¬GnKAoPÒz˜GC¶©è 2ó|'#®ÎvôÅØ–üAßìÌŠÌzÍîí ܇2ñ‘Ø7|+ŒH‚9¦Eô€ºW!á&G.¯ô¹ËΈHTUÜÀ¯º«5æ7›oß  ½nà¨7«H÷™ÇºN¤£&ŠÆy’nÚëuÃxCô†;ˆm«nZŒÂøu;—Mw^¶Kjˇ€Éˆ¾vQWö(mµÜü±à¸É=n*´5<ѱ) æ{ÃÏ 4Ñ ²|4Ÿµ#(ܘÉmèKø­´'»•U¨U¦~˜,Ä@º»ä®øµ²›2²úP]î¯h°ÇýÉvu²SéCäqŠaqTîiFÕd¡Sö½”ØÌÔào£ìRåìRd¹¸{=ìBe§Šý>л­ÞØ'¡€I²ÌÁ[ ×è3Ðó—~ÁŒdgÓg÷)`'ï†îªö±þX½§œ·ê+²  º:ª8 ç™K*@Æ~»>óôâyaB|`¼F:ØêQòín"“ºÛB¿ÆhÔÀ¬C#©—. Z3]³ÏŽÂ@ ¥‘V]]÷^7¯pBItˆ|Å«0ÉŒiŸYÖÓog-g=½>%÷”yÀ&-ê…딘uù“Û+¾îIKùúIà ëH0ŸVÂ>÷}ÄŸŠõŠÿeøðžÑ_½ÍäøÀ){ýj¥.÷\ëË_#å§~¡7æãõ_¿Ôká8ìàÏðy¥å¡©ZãKem€R—]‰m)7z®á˜)!gTÚSÏÃ̪‚¬|‚Y©>§]³Ñb’ÑO[†Ô §ò97̆çி¹Ò7!ÚBWeè~ù ª—ËY´’,BÓÍ)EÚ>‰ß‚/ê~I|¾¶Fx‚ß=ü\¢«Ä5*ãÜÔ=Â…ÏŸ Fzì­Yã8´&Ä„ÝØ–„zäd[¶ç—^‚¹®ŠÇÍS‚·äË7š¾šM m¨DÚâ%=4©z|õ7uG›Í`”Ê; Ó¡x÷ˆ^þU{ùê[—›9¶£ÆúÜõÇ""Ç®uŒù&[ªÒe˜Jê ª¿e£©ð1ø̸&^+nzÅø¦¶¿é¦Î芑ÎUk¤ßâ;W$B4Tj'ÂJйµÁkc|÷TL á¤ù ì ò;øzö±o•,´v3™]#G5¼|“8NS‰ìJÂ4^ôý@JzЭeaÌØ"–ز”Ī· ˜^¥yé¥é_)5jL© Ï\ l` Ý>Ö¬ï̤G>/÷}˜V=cEg}Éj¨oª—µûHÐïkÞïÂüïÿ‘ÿï’ÿç‚À|ù/"ÿß%ÿÏùò_Dþ¿KþŸ óåÿ_õÿe¿ÿ¥¬ºäÿ³ðgùÿ9Œ:ëƒÂ’pDò±ÔÿcóþŸ"`ø,ù«B!Š**¥eŠÊJÐ¥÷àÛôÌt-möëƒöZšƒöÜml¨ ’ƒ­!º`°ž¥Þl†Š‚¢È’ˆÀz¡Y±›0Xß” ™î†B8kÃ=Q$ˆ?YEðFûhIèâ°$@}ä-Éx”9û¤%ABù‘ØZ§‰tC½P$-´NƒªË+±#Ü£I”ö¼@Í –f²“­—¿«¥ • Ö;ª söKÌX$ ž-ÏÇ ±ó£œÏÅiFzyI€ˆ(Œ–;¨´— E’‘.ç˜c!°c/³Û5‰y›¼<è8ÓNdÞlusAœååYAÃÑ>_B¬Ø!£¿y?—2%O;VÚø8z?ÂÅ} ôãÒnh€"Ò:›vxr<`¬Hè¿WrFp'¢6ÏW\£0ó9vFÃ7ò¯_ß6ü§Ù}7ŸÕ0Ðï‘Ð%ƒFcS0ÁQ ,8øEâœQÚ’smIaHš¬ÀîXW7)W’&ÌÎg3ý¨.H, ó0½±€ö8ÿ#TW Úé!Z öâÑIðÆßïpeö}9ž/‰ÎDG˜›¼ΛˆDÍõ÷<!²<(Xý8GàÿƒØÙYýG3öøøCQÿ%n`gÕ¯ûãïùø×YP;+ºü% Ž,#ú{FØhÿ¢xTP߈Ǜ„ÆüX2ÞlO™‡5€èW<Q³t¿ËÁ„‹(`%Î_3ðûøL0cœ›#ŠHÄ¿µdöe8‡êŒÂ£€‹$ƒØ^+ìAöûC¶PŽžQDm8ÚÓäEDþÞðówKdÖ3Ãò‘9áˆÎ(¢–„¢X>z"ðÀ˜ú}ÒŽ‚HÀ¢<ÇHažÀÒäoʸ" ñͼUþÎ05Ûÿ /7káÃòáb-Ò¦I[q9DQ¦¤(ªýÎØ_ÑPÈ@¾§é?"ƒ©Ë)Ã唕•å Šª?¤ ¸õoTéGÕ«+*Ë©@”êÕåT °¿«êüצòã&¨È)+«³š“S†þ¸ @¾í¨¯GÊ‘RVQ”SQ†Ê©"Q*ÿ`øjÊßDè%9( zUE(ð«òCŠ€m;ýp¸ý¡‚AUØ”`ÈŸ(kbÖƒ„p–I_Ù…ÁàÎÎÀ2ã÷g/<9÷Ì*- X°ƒgÿ°¬Ì®†µR#²VⳆôdž½–sSÖÖc'Ëz=”’ˆÆ³¢ÀzMY›gñ/ØfWdΠk=î iÃ_'mo’°s‚ƒXËUV²³¶1À-ÈEòGaØ£èï‹=`‚!á40@¾/;ûgöŽWaÖ€†º¢°À.Iûï0Ø80"ƒš,)8cþ’9+ (ÐÇó¹STPú›bzÀZ|~eE%ůÊXº¡½@x"ì=AÀGg4kaêäÍÚ²¡±lÙ¹áð(à‚B“@¾h ä„b Ð.Þ9€ ²6´ÜkvФcj²Ö17×1µ´Ñ0îrQ@ç³ëA{â1h Z_Ø“È œ ÈDß\w/€¯³ÛÐØÐÒ(ÈCKS} Ð3sh¿Ž¹¥¡îAcs`³m¾ßÌB_Äæ™­c¬óïÌ iÀ  á ÌaD´ÛBÄÞ³~ÉRY Plvtqx2K¿VVg6×ìl3`Ü»ßðzŸ­À@³1sµ±Š“ާ—`. /´?`+J¬¬³30zÍRÖ’@`ЮX íêFÒ²½<Œö[c bàWO)«‚”T4 j*PKRlŠóvöÀFzvoÅó».²Ž4À`___…/;v@»ÀìÚœIð|39Ï!²'^öP2—ÂzØ4íìŒA}=+³­n÷϶Hšm,kì˜Ûø³Ï*´ÿOú*Ï?ÿ[D÷ÿ-Ýÿµ 0_þ‹çþ?èÒùÿ‚À<ùCÏýKßÿ, Ì—ÿ"ºÿoéþ·ùò_D÷ÿ-Ýÿ¿ 0_þ‹(þÇÒû_ ó忈Þÿ[zÿkA`¾üÑûKï-Ì—ÿ"zÿoéþ×ùò_Dñ?–ÎæËñœÿ-ÿ, Ì—ÿ":ÿ[Úÿ/Ì“¿Ê":ÿ[’ÿ‚À|ù/¢ó¿¥óŸùò_DçKç? ó忈Îÿ–ÎæË1œÿ©-íÿæÉ_±ä϶U¥%ù/Ì·ÿÅpþ«¶tþ³€0ßþüçìIþ óí1œÿ«-ÿ- Ì·ä"ÿ¬ý+/ÉA`¾ýÿ—¿ÿQS¯²ôýïŸåÏöGAZ¢=Qÿ³»þ Xþþýʪ*ʪ¿ßÿÀ ü¬¨…B–â?.üï¹ÿ­” ö¥Kw=,Ýõðß¹ëá;Jä°5†¥s$„«Æzlt –¶°¼I¬²³ŽƒHvÎéÌDÂ|qD9O-Žã ðñüïbøÛ¡ØYýky–—®×w]²Ù¹sNÙxYÏ’ýÖÑØEõ«ùCÞsVs5²Tƒå ‡À`@_rØûï¸yÎ&C «%¡,Áög¹vî÷v ‘ Yíù¢ylïοªb¶ã I(Oc” 0Z`q¾Dþ‹#ÛïM‚%%ö# ‡ÿÚðX¤Ž(1çiŠ˜ó2›¯³0§sjÂîM At*Ú!ÃÖžYmœåôþÌçóâ„#‘pž_³óüå`÷¿Ã;öÔ;ã`“xi±T”ž‚¥âf¦ µ®À½kÝN|ÓS‰\𢢣Dšœ,ÍІq6"=Yµ·µ=…ÿå}#|Uµwn¤wî0VW¤÷NÒ=ÿ#6ó?]ñ_Œ’tϘBü/Íù¿®ø/FIºø›Bü/ þ]ñ_Œ’tý?føkü—ý%éâ/1ü»ìß(I–)ÄÿãtÅÿ2bÒÅßâÿqºâ1éâo ñÿ8]çÿ˜ôñ'¦‘ðÓÚri²@ L&Kãõ&”:ÒFûçÿi :ƒ8ÿÏ`Â|:Éauÿ7Fúçœÿ×N`jy©¦¥OˆR±à§¿Gt…è `ÄpmqR •·dsÚu°šfC¥ø ƒ¢Å ‚T¢^@À•­>;ߌr¹0¿’N&ÇZùU»’¬rºêqÕGU”"æ×”Gó#ðå.mm°b™\*ÂÒÒ¤rwD TŸ!±‚¨ð±‚ qÑ‘ãÆøü1ãBaÁ_¼¼¿n tjS tj{-hJ·' 1û 2 Ó A¯4(M×ÓAä1:¦¿ÈàȶfÕ2ßPiÚPî„)àqôÖ•Ú{ßzóáêÅ$÷Ö¥fR³ÚU–*N”´^›¨ƒÝq¨8DiÎ_£s›p‰ª¹F„ã+öc·âBZÀ¢ÉhÂÎéíÛyÛÐ0KfbÉz¥ dèÙà lv†T.v÷‡#2&OÕ×½uj|r"¼@»î¤í'øP¯ÂZôö) E!J&KôIh]s  ¥—IØ)ƒ©ç„50XzyLíõöðgªb4«ò›¿>H6_3ú¨˜ ªR5âµ®Xõ*´–™Ôh›ù*A†µ!ŠLµ¢ ã×ÉÂhS–¶¥Pµ¯G &#“¡"“Ù–Ør©ÁûäÃôª`w& 2ªS¶ª+0©(¤'Gb"õ…ÑàõÊ3¼1èÛÕÛ‡ëõ‹p¨L޾Úü:·Ï4uŸýZô߀…i{݉­¥ð]QX+Ýf®ŽEÅeÑË&|«-_¦Ãs=¶°Å¢ƒNëÓ®Qzµß’ÞˆZ¶‰éì-i-KÙ9–FÑë(au,h?©àŽË£¼Í èkœ0QÓŠZðFµ¾x„‹f± ­u,T\4Hÿ‚Áú´!n^Xl×V™1+QŽo=3Ø>ädvûè·—0n–¾q³ˆÛW¿+"iŠú9Ã׈äT,€™ð†¤a©pp…Ü"ØÕVÇSq'Âò3XG­\„?Å»ûã;U;[“Ð:ƒT½‚lT›š›2E¼xv´zë¿\Ã}J3æª3ÄòÌ`…MÕS5›ð&l𡉆ÈåRy§ùC<äM¦ˆÒ:D¯¶î$ðCd„:6¡ê=n”Vµ©)­²Ò–Ú#ü%›þÖ4ÄTí×o¦¡¶»ß‘¾.’Íh1Ò° ¿Çf¾¹µà›ê;ÛZ  NWGwyÍø"ÿùµ¬tL«w”c4÷‘*Õ‰a`°¬ÒW.áàÙ,¥ŸK¸k6[_ñ„odëûF6áÙí> ê=LùÂ\Í„R'ïÃdcr»öav¥×$ÝõSxÿS×ûŒ™tñ7¡÷?u½ÿÃ(Iš ½ÿ© £$]û7÷?u½ÿÅ8Iÿ·úþ6“Áf¨ö@ü]ã¿Q’>þÄÚ¾Ê,ˆS\‘L&à‹#>)⎣B¥¶·ÿŸàm†?þþ:tô®ý?ÆHU(f Åô8‡+a2éQœ˜&bŸãÄì8?öÛ–¯+ý½©Ãö/”u¸×Ù?¾Ù_ÇÿÓiL£Ëþ‘â„i~:“crk9&R€ø¢ÎNP5šmÿ,‡Â`P‡F¥0XmA|‡£EAüÄqSI‡I¡s©ÀÊ¥0¨lmÉvöš—Ka2è€ëǤ0YÜfEXâæE4“ïD9¶…N÷~4…ÎjjŠí+ök)¤šçš’pü¡0é,À`á-Ò›éþO”Ô)äÒ)P-€E§RØT¦¶ ËW,ÁôËðá„2¡œxI«*iTü;jÿ²Ôø·Ñ¾ý3hlKüg²»ìß(iÑøˆP[kgœt¶áaÁ‘ffˆ™éb™~`ǯðÏ ñc¢Cׯ_ßhfÖ·¯ìСC¥¥¥óæÍ«­­®®®ðÂÆÆFþ˜R'øÉ\eÆ«» 13fáÁüèÌÝ]õÞòK•%÷o}x"õÞ²Ík3êRŸW:;þ—‘¶nRÒÇ¿Nð¾÷ÉΤá¿&-1ÙÿldÒ‹Ë›V tŒ¹‘__~qcÉD$\ìIŸWP9æÆuWz‰WUÃ-׸õ¼c¤¼°÷xhbw²»·9Ý@P°AJ&ˆÑƒÎÑçn¬*vÏ/¶y5=¨˜ü¾'(°Ö½ª÷ ´îæ¾»s#xÀ¾Ú°¬ñÐЀÞhåqK%vWdž;e/l=ãñ ênK¤®µþsÿ”øÏ›»4ë`Ö·•»ïoó9yAÜ[¸ßbvõ•äÀ/Ùauª¾;Îñ]}ÌýÅÁ3"£Ñ¯ ˆï§ß>UòèYÜ÷™KO¦¡ËVæð6—ƒöY®¬¯ŒíQ÷(ùû‰u1.|Þš úuÌùb¯óãs¦Sòrx[½À ñ¾ž?ýu½¹væ.n´ÒÑB¹1»úq~ð¼OŸ¼¼x”„Ô$M´&ß(ëæV󮸦Nc7Ôe1lÈSŽFþ4¾òD麇¯8¾ Ñ#Ђ`ÛŠÕùá×»•ÆÚÜßš\fµöTîˆ,±Gúuèÿ>ÓD*Ià‡- [p …×÷¨¸ó4_|ÛÆ<7l`Úäå¥ýû)`ÚæPÄyŒF?·â¥;^ýpM¢Ç²Þ.ä8tbQO„FÞ‚ë½’‡ž>ƒxñ²ÌF]Î,°GVÚTMÜÖ uŸfOR‚‚ø+”h4)Ä×*w×m±I8 6±ý!V±ËRRÚû8¤{p[ëE¾Ö·¼Ç;ÊÑ¿ñ¯ø8Cä¶÷±…(^À­·$¬Î=†×#p€ÔpÊÅ‹XÂ"£ ™?“áÓIãG?8;h¹ÿéé´¥ƒÍà Â`»=\•‡àd\Š$_ò¦{@3Ÿo(ðÅ^Ì[q¿6ùügÞýì¯/úù8Y9üñÿ07ÜkùÀ«Â±ç·O&“ß?f®œ½ûÇ õòÕ#Ž<4'-ãñ¬© <ò^éw:§”ëÂ+¿H¹uñÅÉ9ß?½wõËtìåˆoVYa\îtö nÎöäÿ°öŸdÿþOŸîÓž;† üðC±`‹#Ù.{ô¬"ì}ˆxD<ÖñˆìÁÐWÙ«OÚ’Ém¥;C •͵emåW?‰µRf”«ØÍŸ îd<¡ƒ_~õ§[.oœp4’·¦7›ì£ŒŽ±=;ÛÛ]±)xkY7á¤;·× )$‘ú¹åŸùÃæ8éîœ/9æ¹K6ð7ØÍìƒ^(pVîÝŒ¢È}•ׇTTŸrÁ¯Ü¶BŽTìÈ…?ôVŠ,ÜÀö^ƒÉ9ç«m|˜#‚°Ëµ7‚¨Ëp&8žœXÎ%çœ(¬£üâ2% ƒø‡ËÂ¥1t5Ü- ¤îy^]xµÛµ¾+ŠÈð¢_Bxѽ K¡ ÒZ;|÷aõ°¢§Eüþÿî=•„Ûþ GT$¹÷Ç)ˆ@ :åÃj—á¶mévwâ¸÷ŽE¨ÈIøe1ü5ÐÊíϤ /¥]^t¯Qn8#zæe.˜ y–(Ì/.ŒwZH”ßæN&_ÇKá•“* †¼3T1qg¼Ù"+s¡Íè%UýW[šç8qªÀv×¼zoº®È/ÌÅÁ¡Ö¼,Ç6oÄ rõ™©v$:ycÎß/æ˜9Y“HQ_í®á¯™´"çp¤‹ïd†_Ükô©oÙV/jƒÄ;rí2l¿_üÌ;âw¼H€O!¹îÙ«¬ßxdP«™[ÖSW sÑu©ë®Ñ"½º“£­¦'Kü4 á•ö›íÌáùd"Ö–{ú$£‘æW±ž¯\l—ÇìGŸ‹N$rD·[Nt}7šÇ$‘ʼúR{=/À¢ÏÍ=,‘LþÛqq Eвýüy·“î†GTlrÆÐü?§9ÝôU8ÎæX_^é xäø³á‚âU'ž•y¥õ çŸÇop9:ÁRéTñEQ'oÏÝ Óäî¼òõ'­Žuß8Áéví.ñÖøÔdÿ åáþù[j¼2?G轩¡$$Âév©ë­orxk~Ø"–íYXKµÎ¾è . x›ñäèÛ–p¡€DØ|+²Gw«yhÖ˜¼Ø¤Á<'i(É:‰CcF­‹w‡.ê™W¼ÒC?[7ç&‡Nž³²áa.l~ξ›#,‹–š•Ÿ ™”¢–ÊMn•?_42ðyä^#—%½ º4¨vÐQKä+'T¼¦Ž·yÀ)sÑòq3!æ;ý¨üÞ}Üwˆ3r¸h@ÿÀ­¯fVwÏGíòl.½ƒåaÖ¤£þ’—?XT9?¹¡üÖÓÁyhÃmŒ ؼ/¹’:n•û¤¥È¹3C·ùTtË­–l¯›ÈíHß_û‚4pJÚÑ™m§>ÈvTy”w—W/Çñ>w0¾RùŽYîü jÒäõñ:.0_ë=ÇçkÞæô« úrîÑ,«Ü’Ág’ÆÙrÉžû,•îÓ&ÀL‘Àº›Eùa¼5÷D÷.‘¾·\Ù_›I"qŽßð“¿[;ø »þØi7§Ç WEîö©“çð­ÛsÇÆå?Yæ wMßö$ý“±Iý+¾Š9“ž>]ð‚DªJ:2Íåw¬_ªÅÔ ¡äþžW§åÞ9i{ìù½¿y^tVÞ}±¹êNÍŸ[Ë÷ hP<žµouÀÁg÷Fe Ÿ÷éÜiNTeO9°:~ßñ—ÕÒo¦IžÅ?ËX"-¼âù™SMÕÆÜÃçÝê§ÔnÙ/Æ]nÀ¡— §ûÄ÷‰¯ÏÌÈ^–/›ýäyr‰ëÉRɼÙÓ>x²¾Ï¡0âUÝñóõß½þh髼…R'yñf˯ö~ôÙÜjè›—í;^wòù¥›XÉêØÞ1%÷{?«ž[âý]è³øú%V‡ž/¤ékþðï'ä¿5y‘¶ã×ÿéZ7Vysî®I‡f?ÿ# æaÝŸã6ñ¥š¤¯ªêœ•ï’^­|þ-’QK€þÀϽRÿym_aH%ÿvñÚéß'mº>vÖ ·Éñÿgï< šÚÖE„ ¤„ŽÒHUÐAZ‚€¥Ò”R¤w”’ (Š(*HGÞT¤¤+"Ò{éJyÁ½Oñœ{îçŽû<ûíá?ff­5Ë?ÿùÏç\ßÀ®˜5Í” àúœãƒ,˜üÄÓáÄ kÎdJfgýö&ÆLØ–ïóy#ôÙ8ý CÿÛ\Vü“È•l¢ÃÔ}tª6"ê^ï10¯½ Å/æÞœÔòåˆ58CŒç0Ž0h\ŒfÅwæÆÌ‰Mò¨Â” p´bä×bZÙû]®¦œy{1Úäó\#O®*1,F²~thyïá íqìˆ-€j¾‚n) ›Ç·ža3o"ü‹J ·wî2Õ›{¤nÃñ3ôÒ ›*Êã‘*nA0ÄàÑjL(µ}ôžO‚Xf@Û‡CäßQÇÜk(É‹¥·I†@åT0rB##6¢àåñ}åòn`Ú§·M™hƒšY}>A€BeBâ¡<¾TQLÚÏ6)g@›¸DšU”ë0÷eIaJ*e¦ÍÊ„øîšà÷í¹FIõUtm¥ÀÙœ SËqcÙŠÖ ‡1Ô™8ž(ƒZFû:H)CÛù”-äëŠæœªæäŒl Ø¶ýu¡˜âJ¾z]¿±ìû>bj*@ò­÷ ¥; µJ&’)¿ã†BJôYšæ3ƒ à9v÷ÇÞlUÚŸé=_oä>œL…¤&‘ûQŒ)Eù{ ž?×·¤œãš!1GÊ‚X£òØ/ÄÂÙA}:håM]'=‹‰’8[¯  ºº3™g>á®…ÎPY k—ܤUì&±ìsº€±SºDd;‚Øür r°µDø¢E`@iм8@¼äàrEJ* Ò´Gû³ðŠ"œ2®¤ƒp&/L§¹F:ÛMëFLJxVɪ”Š1¡îiôêì/Œ Âëv\Ÿ7T[ŒÉ)°Ï«+R¯%M-³ ÆÕ>À"©šsKÊ>ÌH¼ÃeÀ‰²…‰íéb‹†æV1ìÉy½Kè½ÉU±» zÙp ÉO”#Ó3è¤ÐPQz¿ç½Ê 4šßÕ“ÑCœ¶»‡€?¼§¾UÚh8ÒïL^ûV”ϼÀð½W }Ú#›Y^zUQ$8å&|’ÎQrõæ îB#ÕÝ §N¡OЇ¾4+¦O:!2¨Òž® ï°à(RV kÞ¨Û»YCÐ5ýX6(1â®î"JÚ©åž|pYRoµÞ‘AGê®ÖË8Ñë¨À°ƒ”¯ËójǽdKT®Ã¶1ˆýŒ»ahþ÷q w§U¤ÝQEÍe"úähŠÜ>ßÒ¸šèQºGߊK u}}6Á•Š7á?¸|e«/»"ŽvÓQë•×vÔNêÌí­š( .h*^#t ®…§ÖpÂ¥-3U××[vƒ?4= (Gwù=¡6«2=Ñ»²mýÌ7êÑÎ-8>5E½=…0s¡g¬â²¶¢æf{íS ªÃùËRó;›WÖÜӤ܌N l-‰\<Ï–ú¹)“/wncÉwø*"h«©÷S C¿øšˆÄRN}„ûåEÄAB‚„ÚnÎ,,íP3ÍmW|šT–)™$J¯îj ÝÆO†‚ÕKŽá§L–Ùl‚îÅ*ö6{¥]á9$ªÈ·B¤Î‹å¿Zm”o`Î.ççVɱû€5Äbs);DÇå£[¥vÛ=/üŽ«¡©¦œù¨ÑÆq¡_cuͬ×S ÜÀ}´ºÇÔ5=í[È8'­[êB³>$?³Ft0†0ã«?Œç³÷÷á–(ñž+r"Wf¦ ‚·–ôˆð„.Õ%] çè¥ œb¦_ƒç*¤ŽxmGäºó¼>‘¥¹qÛ‘¦žÖ^1!è c.¥ºã©äš† ¥æIćdeVBÈQîòDÄÊ¢íy)s3ùbPáþ¹úî+Ý©ÅÆÅÎrI±Še`ñõïzwNûú•œØ5Q;‹ÖÂv_éiL¨¸Y…VkØv ¥z[ àËf×21ã-E­PÌÞS“Ý©«É§¦æ`Ź9›èíö’">ôöʨV6Z&€â/ÚûìsÄ ”RdaÀo8zo,W¬©àŠÊíð»Wmi’ØŒñÓ+¾m¯ÂÕó^a´×$ûß¹ÄnPêDÝx|YÈ¡]ùº`Uàº`WxÕCCŽ0óî¥É¶1œ|Ùh¯‘C‡Oºãó¥F¦j‡Ç¹]ߟu$ÔwÀÅ’cŽ`Va«Áh}L¥tÈÑÍ‚„û쥷bjýe7Æïø˜ ÔÐݲ)Æ;VB)§¦æ…¹Ù,-2a'º_Z߇ÖY¦%ž­yu°€Ð ª˜Ôy,(OwRuÝûì§g}©9ò§µOVLFÙ¬ÓŽ]þÙ ×Íkñ¸› Í eSœJѰ½Ýªd«€±¾OëQ}ì(8ôæ (íTüB¼Â“½D9†G„ZÚG<¦…Ïßñâ@0ÀåO¿_¤€¦Vd›,êxôÙóu{ã.£˜œ)#)bA²ÿ±oNΠÐYÔHáhÁɶSWÄÛø®&JŒ¦±ipÎ bNn“LdÿkˆÛ§ôb(ö›ªl&Q= ™õã+ 3eAl´#÷m›Gуeœá©Ž;4Ôø~°Â‹¾£.’(œä£ÀE­±8Âqž¼SÕ‚6OºYx®wT7MC@äˆXïu·Æ-:âST”ž«Y^óûˆH÷~65òÀ%EåâC}}w±Ñ@D•gÿý¹3™`>õªî3‚^ãlë¡§+ø?ч‰¸ëè µPpZrž^±ÅfÄáÈ›WBTŒ…Ž0ráR|¶Å(¤ùðú!²EYìô¢äÏÐ]Œœ‰"[”Ã/¿’d` žöaÙ6i#&KÈ(97 ùßO™~ e7,xÐÔ'Õç$2êMEÙ¯´ŠîÒ$ήÚýJr‰Š¾ÙOVá‘ÒœÇaáTÈɇ޳žcÉó´T§(•’º)u5k3Œ¶9züK$ŠFÇŠSiÞ#ÒŒ¶p^pç_"g`%fmôî@Ï òdP×}‹jù‘PÎîE’ êºê/aÖªQº#0%³ó±«bd›¬)O+KÀ7 8y¨³æˆ\ofÊM*NˆE(VׂH)ƒ…*/‡{©ÌíÒ訆PÆC7l$äyDÂgÙ9™Ój¼¸ü}JKç ú† Coð¬ds—å{…?ºÝF.Zư¹ (Å}9š46•®£ç¬§<ªB¼Rcù,]ûÒÚ'5ì±8Ár¶¢îÙû[ W*FˆîÀS«‚Žd‘<­0<*­ö\b ¢îVYZôé%•bzç㣀 ;º¼ßÈÉ‹Íãõ°"’ý¸´·NBxõ­÷[ó´‘sQàóU}™i@Q¹!¨y/XâêÖ©pd*ö¸÷ gëJ³²è÷ŠÔߊÌ|&Á…´èÐõ+# _³&­­GÃ.mI'´>äVpԤܾÆ^kòÜA¸Î<éµ À²rBä,2÷Üp3­ýžèë§Nƒ›«hµñ6ìú8†7;é™tiøz…2)mÂþÂ\DüžŠœóÎû̉·P]¥ª´gü ’žä+yQiòîÓën¾Mô`Ô7’åwÝú³áMKýÌØ”lœ$uñD¢­ â¯ßÈ»‡|ÚöD½¹j¤Ì¸TÅ”jcé/.…ìˆøÝdoh"½2½—:M}X†¬•çñBµ•t6õçùÐ(`ãAN‚Y=ÊÑœ!wC ôB£8¹ýÄûVÑ`žÐ ýo—ÊÏ6¢jàOxÄ”¤Á¤xR¬©oœ?6Š6Qõ擾½7ËUx–ïÂÞ1ͪ£ÈA +ÄÁ3À¬PÚ•«ic6ØËh¤5¹’¤¾L“_r¿–¾;»j=é¸XröîÃMÕ&¨Åb±:–<žèk¿±êùtÎá2ÄáÓsŒ“4ŠÍèŽfì\sáólnáZ5ÀÂooosIã0eênjɯМçmú¥=¨IðôÎkOR$2­ (ŽÌ¼ú¹F8Âx6¨–¼CTÍȅ̔ᰃ¸§XØJnû }`Lçá¯Bû®†Ô—¤Qq·íÂ2¡œDƒ¶¯tttßxѨ¥œ+ÞŒ9 \öîC6-0§¬¥;aˆÈXo÷ Ù£·žµŸ(¼ŒFrCn0]xÀÏâò>êðt°™OψOA;œCb8x³'þB̉[§ä¼Jÿb…\u¤Óœ ‡ÿ„j‡ W„5%Íê9‘§Om(êâ΂_¦1L$ü¼u²6$:_¾³áÚgÐI½v6V!ÐËlA ŒdšÍÖ9Ò½s&U¨|”Ñ'á€|«rôãÀÏÜ øÃ/2mÇ ©Ê—Á¹M8}‚g–÷‰H:üÎèâZØ|Ë;ÀŠ‚Ýfvø&=¿€§-ùrr¥ø'RñÜ}6>À7¬tùyë `^smê=^D'E|ÐЖÏ,s¹óÄ^r†c¨_œ÷)Ìùi× Å|€Ép¨[x=¿ðV!ꂎ1¥¦‰˜ºëúü¿Xô}h?˜4xuc÷êFû`ÏÀ$a>á+Õ/11í@‰Cò’?¸ÅçAWM˜Ù<ö†Šÿ»…Óì·ökÕUŸ> ö¼óˆÇEço­èRÕO~šÁDŽïµ;†Rfûø›[8 Éloh&Ý!Â7º MVprÙX­Ð¦D8zÉê3OÝî„ùöéêš\ö•“%ì;ÌÊøœ­OôcŒ‹Ä´Ž¹Ý7Ô²”Í\El}fc À|ñ9æb)§Qõ8MßÕ'f×.õøº~\]:ÿ(ØËXfÞV+¡+\•?¿¦¼ÓJ­^"7À–Ö±0àÏÉmw]Ó?È(ø¦'#ý^¹j½¤ Ts0ÃlÎ7,>ƒ¼5”Ûo•zóÚ¬³é¼ÔWõ„ _é\ÎiGUr¥£ 0«ïYî° f0"ôϳ#–½Ôцrc_ ÖFõ5‰j±ÞšZùžÃšTùù|“OD`B–JV“ÄóŽ7ÈÉÙíÏ"Åßì;¿Û8Ì_LÞ}ûV¤å`þ|Ndç "oM"©7ô9â¡Õ$NÌ"¢–^”"×iÖÄù8$óîÞÜ窆El”N¼/†˜Áãeü•7C‹|*]a/Óx_4RfÀ”|¥IžëÓŽð²©Ö½#¡ÃBbæ-8u¯GX‹²‰¬’{Þ÷>7ëy&{‘¸ÐIîÐ@¤ðÑÐt-Fyñpú™ÑìsïQ%ƒµd8 êìyÓ¾¸ñ6®è±ÖéÏ%ÛÇø¿ø7h¡ú8%—;ÇÄ=FÀ+CgëæN º_ˆðEqÒ·ñ¬ßâžá c Ýžñë%ßäßãü™€ÍtRÀ “£9çï{{Ÿ¸"Äa‘ruUvqQÜ.µ±$d[x-tUnDîzgH:ZÜÔ&líòÄн÷f+†ºçÛSÑ¢‚ï“TÔh³J7 ²4&L“ecêÞë“}[ùh$çÌ$6rÌwÕz#°¨‡“I§­ŸS唿Å@üüùðù1ê0AöUµÏ-[©uŸ‰²Õ™7á«Ç𽬳\ܬR9îB&ÙíQn•Ãagõ sã8Éæ/Úîõ<žÌg²¶ ºžâ§1Aæ<¶^vánzÕŽD¢$ÊÑTø8{Ô‘pLHÊS¤ús² £³Í¼5㉌)úŸÃh»hܪP:ñ7kR4r%شγ)ÒuzdÝNxBÓÅØ9Ê\z?­‚¡Xz‡j®7ÄòõN@Zêw§?Ly’«9ó[*µé-2¥G¡‹ëÞWŠmcâèßÏs)Í&}½±{Z0f,²xá,ÔªøÞm3ÃT«n %g°‡%eœ¾I­4Õ^Â_m©9§)¶¿—x+¶œ·­…áÛ\÷ÍÙð&¯Äø¿åô÷»öÜu»¬R%…#$!J; £OäN¹Må•¿Œ›iÍÂ!§¥sv/m^ck~±i7Ú™Ÿ,‰ž9ÿáOÃ^šûëâFÜœN\ÇÑ#ŠzÜ%CY#q䣆ælâ‰A=Ê(”a“­,·<}Øë9¾4KøC|Ç]/f×ÎÏ@‘¡Ó#ßÓ.…ò]‹2ÚÃøOØ®ÀvK_“óÈg_ob0YIš$ê¯+Ôni¼¡‚-÷[ 3à´üjSg:ÏÝ8£‡+o˜"•êã;žø-%P$Ç€ß\•YÞCn¹‰çëHSnÍ\Mk›à§Ó….û÷À~NûØòeýEz}î¯ …ær~ùûKè²¶|©fiQÉ* `ŽÉJ«ì’êkgÇŸC¥tu•YÞŸÒÊ¿·£ w$ÀÜ‘0„(:öê¸>¸Í/Xlª[ǃô£«aÍ.’šDõËûY%VŠN¤@úØ9Æ£€ñ'Çíök>ó r'ž½J2,%Ò€Ãé)ÍOÐ_µŸ˜w¾Ðî=Øô¶¤}™meË«Œªj|x!Cö]akåça[b T%…mºõcᙺîÎŽâb–—r¼ñžPèE¡£× æ{à ;æÁæ‚ÄðsÆçWxœ7yïhO ªÚÂVêÝ%T--È·{–d´éQr&¥…îbñÈB•$u‘Kw*ÔE¡ÈßYˆ1©?×øŒ67Üžk·ecSä§«Hë,mù¡P“Û(7cÎÛ^¨/,a—oÝ:’ûqS¸Æ1yIUfr‘åV.gÓk`Ê,JIƶVƒe¦lœ@£‰ NA ¹g}Úþ´rk}écà8ˆjö0&Gdt{¼jC~\ˆ™¨LG*å}[¶®Ý×R ©—¿Ð˜É¡ÜN:!Þb†Áî|.¤`Â{Üìéo¹F”MÀNº[fâ®{^} ‹¹p…µ¢ã„4]3ÅØÁô—Šü–gôÑùÅ‹©®‘@9õÍlo‘(5½OÊqËÀ xkâ¨iŧ‰g%ã)U@øÛ$·‰”*b4=nBð\þ[4ðá]ÔLUÇÂ:„’Õ– Îm}ß‹0AJ,Á5ÌÂbMü´ Ù¿µ:„T!Iš[’ ÙÐÈÜÓÏ[2¸ßˆ6ØV |…!µHÌ9rÍ✈ڒ èwÒFêRWÞÌ¢¬V¾§jE¯«à ÆX¤ËÚþ“O?Š?9ôÉ ­¼¢ÁüÑçV#º÷«ì+å#pÔˆ+0X¬É ÖF倱Æd3 Z¡‰Xlº‚ÌöëÃDIaNuÖùçV]'ùeün¼Ã!R¯ŠÈµŒ +±÷1˜ì"œ=ðèúv™ ´NF bGß7Uä}^,&« ͯ硈Œ€ðoBC—åC3›Ú¤8ˆKäH<üÊÈrîx£,ýÕ¢»¡Ô€C«¬Žn GˆôŠÖ‹7ÉZ„â¸!èI“|>SK·—a1z6^`­)F¥e†Na¼‡±8Y¶þ­Oukpl0˜Yï‹z ÑËTئS«‘I–» B‚Ô[޳±#ä ŒÂÜ%]u±4V0´x=© ­;AÛU\Ÿºò–QÔ¿%Àæú&Ö2¬KNÄm‹† ÅÈu’Þ==f&–þüVîŠÙt(!ÛÌ9n0Ž@X4„IÊømæ³ê¹‘CŽâ5L.ä]„ê(Éé“s!8$ÿ˜´Âí$àÌ :AúP—ætC:ÕaEøÇ,ŽÔoŸ cä8ó–2ûø’Ä‹›Y§.#Þ÷{‚˜É@ªSruq<©x3Å2Ó{‹¸®Ö5TïâMÏS|=ÚœbYtKôñdåY«Ý¤g:`ü-üŸ±iĖʼЛ¸‚âzK+¢vˆ¨s0¥,#Öâar 3«N°·î1®K‘HLaf}K8¬A²y©FÂì[|³kå²´¡„EzƆú¾¹ˆhñ¡(<…¬°qÄ>à-åNÕ0@S'aÒ?s6<ÄZGäÎgt-’,{ªù‘%”øÃ1¿E€×ß…*¥ÓEg1t$]„G[¼b(¹¨“Õ)šbm¡Ãr0êÃ+¬ðÖ]¡Ó´ŒÃ™|J±ÐÉ[#…q£B0sŒÏ[Ê­¤™? hí¢Qe‹D—¤õcže—¦²¯ƒ§vØð<^9 …žËôÝ¥E5,f ÛR€àí-`“²Ï%Õ¯kï}¥*ìÌ-L«•sÁkw–FLŸâ‰3=˜"ÇKNF7Èš5º›U$Q€¡6Ò?äþ_æ––K÷í~ºMÔ3%^hÁ ZH‡IìfË€ùãÝ#oC¡uÌÉHÀ¹´Ç…)äM8äGúˆƒC:-Füǯªp•oRúUw ñ’’¬@ól¯¤yõ™–ÙÅr¤”ëTðeô ÅóÕɤÈ\KƒnDSÉNËÜ`ȵ×wªÝTÈÐív )ÇŠ7Ím¸NAØð¬¬L@ ·Ñ¤×†Ï"1:ÚbòXÉ|ÉøS™Z’TW={>è}xb÷À–a̧ܻ5—;„}Õƒvgçœ]Ê9†|Óª«*®U$M+îlÎy˜ínº9žŸrŸêPóÜÝÞüÒê|¿f ”«~[>Ññu¥8ŽˆŒ(K»@¤Š…Ž^y±»û团y‚iBöøàޱ™cŒ]a'ãÎ;_jŽÉ§>/vÊŒO ¾(>Ô»*jmêS€ŽßÅæÊêur ê9v¶ì«o¨Ï/ĈœP)ºä4”Wc”é;].ZziÌ€StLÿiaÊzÑyRËrOÊ÷¬Â^Ísññæ/ßÐäU÷^¾C ëSƒ)™q¯õ8îMÍvè7Å+æ?è¿À0 Åo°ãb.ãÄ›6_ÂÐUWæ|N„älepp:8¨âË7¿ÕéàY¥!»‡®Ö1We#Fé2A™‘¢„9T€TM…súÎ&_N0Í7ý’~ÁñM*ÓSx½à€ ‰C$aý’æ¼ÿ•Œ9­…@ÝV"«ßìij\òȼϸU#,¡×(¬áü‰«ÑÕ!Ò<¶M`“å5¿ôÂ(ñ©9 ˆcìyŠ£ªÐâÿ”3dÜ‘J÷¹!%0ª:ú I‚Bòå ¥,]û‰õOŽ/Ëg¤I¿Ô!Âïƒßž@ˆ-ËÞÊ;"`a\É‘*E3׎ÊèýQTÑ,Ö³CU ±°äs€΄a/’Üá€SÓߢӂÃ+œlàJǨ.Uô0\èþæy 4šjÛƒpzÆ·Ú< 8ú0ÐN¬{#N,KݪeØ(™" T,§¼ŒAÚUtáz!ªyónÐׂê-éÖ]¾´½r&ü,½M ØÔ^XfT¦õ¬<+H Ÿöóɼ®CS—ZâÎhp¼µ×d;ñx¥¶µ‹"J}ËÍ ÆŸ¬ËHvÛ¹Š¸â6®÷ Œ¼lŠSœÉ(×Ì¿9½È¾ê„^ì#ÂÔ$Eæ¦åášL³Üö%O8Œb—Y#t_ZOŸFx"Ê>›Æåã¶Ü‹ÖVM éj;·²æÜ¾%}ôêo&U=k{Yg%§à넘À|5;$«9µ·,\Ã]Dr^¨² CªcµÛvßðT7¶¶K†‚^r" ,ø²ØÈL´Ãš dº'IûÍx³‹ ç°—faK´Ö<Zçkâïƒón¨Ôdªãƒ¸À$wLm ¼ªn|QÊ>NÊY≱'œ«•Ý3èpGÚ‘ò»Ï,€¥žõsôòÍy˜×»ºUÎr #o´¡’ζ ±Ä‡qÞòDF»ßAˆ¸2ãÁtùaΈ±·#áv N•ës~oI…Y!×OUŠ“ôרÆn½“uj'ZÁø\¤¼:8çʰÂæhÞÝ5 Z@¹#äíÊý%u“Zòæj`T,œ—¹K Ý’ý< ºÖN öXi©À´èezE©’¡ÓÕ®"°7C׆=­BógÂ;F¹E€¶.?0E&,:÷8#yš" MèüHR_¥ƒÃiµŠ²uø?t«CãðÝyÇ…šù_FX¨K[RÔ‹‰Šî§I”@%# Ãë|íE í+žÞE^–ö¥ÆX±¡Å2„,ôe‰Ž!4›/Y¦b»t'¬håðòöb$À¹bö‡]6Ö°£î"<¢>Û5 Í-}³ÿŠ>‡P›òz}¨ ÿHÇÆÂ5ïß{CœZQik}8såk# € å7ŒºM‚õ⥸éƒF\F¤0]å¡é<ˆ$Åê3_WV$’ã.X:&xC¢Ð35ó2¬'‡¬ºh0‹7½;Ü£¼ÒAx…f.›}–C–mn<“¦–ÌÆqV÷2BGr7Ât÷‘ã®'EhæòiNOKq 7zIÇ TÔ^…SqHZðÄmºì qÆÄ'둊³xA_êÛ÷œõdì ºÈžëëQw Ê Š ÓEèA ýÄZ“'èk# ðÖ¥3—d…éS©É}ô‰0{.H]ugVÍ&_|©Å-<ì¬fbi¥FÁZq/¾Ó £F^U7krƒÍ3Êû\Pô›ôÕïÛå¡è¢ëï5RõûÞj–²ÃMµdŸUˆ 58u¸‡U wµ8%Šxͽr¸Å•‹ˆÇõ]!ÎËßwë²E qTBœŽÃ8@Ö…y*1¯»x€³¼œÏ䉩tõÒÁ½¯Õœ´é€2¹Ò  w‰Bœ:ÅJ; ‡Ãhp:d7Õa°ptVþõ&+4õœùú$•óS°¤ëÃÎ3 tDˆ“]1¸úü@ ez èÉ®y>?P&|¹†øBžöx6i&ðpú®ëú@çÎÀÙƒm~]yç{M0X(&Šá*;÷×má ÙàÀ׃/có;Ý;z{ïº?sÑsèoA±ŸÞX<šÁÙnÚW÷ µ”®…îÄãtA~v ãM™©Ýš†f@…Iþ”{m@úƒ%> )ò¥œÛÖHtf¦ŽCC ÜQYâCSøÝ/žÕgî*é· J©Ê59¼JºcŠfŽˆ[wáp Ò:%‚Ú‡•J‡èøÂØ ÒKM ‡‰@S »üè/»ŠÿzT%?l~ ¥u À†Gÿó{¤OÈv^J4ÚQWÑR.P²Àþ/œÿùñýV€÷?üÎúõþ‡Ÿ"?Úßúcÿ_üÏŸ"?žÿ”úØÿÿógÊþÿâÿþ²ÿO‘ýÿÄÿýÅÿû)ò£ýÿ@üß_ü¿Ÿ"?öÿ þï/ÿÿ)ò£ýÿ@üß_þÿSäûKþø¿¿ìÿSäGûÿø¿¿ø¯?E~´ÿˆÿûëýŸ?E~´ÿøýï’RH1©_öÿ™òöÿ­°F{xXú 9ÿ†Mý·yÏÿ(‡þoøÏ¢H1ñ¿òŸ%aÂSb¢¿ÞÿúSäÿþóo_ð7¦ð/Ìó/ÌóÏÃ<ÿÖò:yÉ‚ú ¯áã‡ÆHxBÿËLø;„6[»:»9ÙzÙ‚N„»‡ÐæßûÑï ž¿•ÊÖéXH–Â62Òßÿ^¼Êý°t‚ào¬R;ÐÒɉðÍÞÖÃá°Õþ¥×–sSó²´:t”óòøK¾„û‡#´Z/…»8ß©`h›ïl'}ð„—Ámþgiý Õþ–à!0JáðÅ$7·5•þþý·ÛÂ^ÿËz!ÿRœïª9¸xò"íD~Ðî; üíÂo8-ËÃàŸG[ñÃÎÅÖò7VߟG-‘ÃîÎåïœüÍ’%¸Ô]3-¯¿:¡•-¡ÛÿT]È!•ÕÛù·Æù'3¡4—‚«ÛáÊÕã¤üŸo”ù›zBBõD$ÿ¦Ÿü¿*þ4Êþ®—LÿÚá8ØøýÙ|Rê_*úgÑPüpïü§TMâ»jh'§?Ù\æ;]øpùú—^ôª­ÿáªÆ‹ÿ„µ³›Àá•^"ßGþ^¢ßoÎΖ~òB"6%T†ëßf=ÿuüilOÐ6èïV#ÿI½ÿ~_#ÿ/Ów¥OKˆþ¢ïþ’?¼üøûÿ‡ÿú‹ÿøsäû‹þqø¯¿ÎüùÑÿÿ@ü×_ç?~Šühÿÿ(ÿõ×ùÿ€üØÿÿÎÿýòÿŸ"?Úÿtþï—ÿÿù±ÿÿÿûµÿÿ§Èþÿ=ÿ'!*.*).ùÿ.)ò«ÿÿ)òöÿþ›–­ï_®Ò³uñtõ8¤¿~ß`bnnçaéfÿoqàÿûýÈ¿ðßÿfQ1Bà×þ¿Ÿ!¢HK1QkQ1K)[+1)[)K)ñ+"WD­­ÄdþÓåû%ÿoåìÿÿþÿæÿb„1ÿü_Lò×þߟ"ÿÿýYnù¯ZÂWgg×ßö³‚Ò‚"¢âHPTLJPD‰üKü+Â6HÑ_ßÞÃÖÓÞÕÉæwÔº¤ˆ ˆˆ$—‘$$"ü;غ˜ä?'rÁÆã·ˆ"Rb‚Ò ˜¨´ 8Rú×UüOåêÿÿþ¿÷qÂ\ÿŸÆBkúåÿ?Cþ™ÿÝ‚@ˆ;¿óßÕäsšÈßùïRRR™™™Gº544”––š››+**ÿF„çàà†|Á뙆´Cþ¾Õc\õãtMiléÌùå³®Ha$õªóŽ’ ïÇ&‚¹˜§_þÊA3üæ©fˆfLn«•r'NÌË[/r[š Çç΃¦á¾ _^<¡ûäm6ûþ¢;Ô×ʾ*<[ö-:+°}æ!VQŸðÑS22­œ¾°Xù6¿îˆ|<–I˜¸†XÀÏòÂÊØKºmÿ°o׆ú9ièF.ÎÌ•*FÙ£íˆÝ™íž#ý«wÝ·e·nºÎ™w=¯ >†µ+îMµfòJÎÒ;/̲këY@­¾qÕõm±ËA w—ˆÄÁqýÍܹü)™lÇ^ÊÄ*·+r±{ßš?¥ß8ÈïUÌ®ñS\º³xsõaLjìÇ´Èܳ·K»™…/»_-íj)V¿’¼Þ~øxoMÒ2•K9ټټ†ùnÒÓ’í3Ÿ&n¸Ú{Oig ’OöTŠf›Ãéõ&ÞwÖµOg}ª«…R1oFÒû†ö‹[T‰qÔËÈm…%¹ÚÎYùе§X_ xGÝÕéÝèl.{@°½£VðÔKÿ…Ågí1äI ³Ó±T}3L=¡½Éì}‰Á×¶î,*m’-<ãjεý™PƒOGJAbásäf•ô»Œé#¡ê’~ Ïhxˆ…ÍȃŽ\X©OiÔ¬sE“'½ç¸!DcM·¿–}jÌéBý°¢Þ_r_ü´Sëìp·FÌ‘PæûP†Õg¹ Õ”÷i“ú oû#—"9áãëq ãsk}ìI—w¡+UËÚ§rŠ\>¥ã9J^ÇæÞ´4"åêßÛ}$_MäçÙïeòÛm)@æHÝ€¾5Õ✳^CøƒÙ>Ä«’’£v‰²ÇBì*6¦úÞÈ.#ý|¦eOPb‘_®xy>Ü)0:¾»Ëcä·Ë3=T±Ö~ahGZqù¥ü£Êö¦¯þ.£ŸT?]¿Ž>lævŠÃàJ`‘îý†éèßÛÿ¶Šbp̆“Gýٽʣk¯•ïÓ*ÌMg~,½ØßëR“ÝAÈðC§žçç¤â—Ñ­|L¿_z¡¸t–í`攵_Ó ,±Y\Ö8X’ÃÈJ#> rʃ»cÇÂ6n6þ1iÑj ç檋c•ÿTç͇VŽ%QÎ~º!c×A•/¸7XÙÝu¾)P+/oþe­7Šœ|´®_ïö'sÙ¶ÙÇ‘¯¦ O Œ2­9= eaݧSÛ¿!òí­â‰ò›&<„»r/V¡r/6 ïø{š©n+R;…Ù}Lú"Y(‘ÜÔŒL?¾vGלP”/CAWª\{‡P%ƾÌd!ñ©Ö ¾ù–Š$ Ð™'ŸÖÎQïø»–ÃZ9üªý«@'/A'ßJÜ»¼’x¾€Ý€oþŸ;¼ïÓYVWÉ‹¸k¥ØÛè§|BP!ÖÕµó’tC,å’voä$Ïn}Àu–ûzøÞVêéá Ý/ôÔJQÕë+k‹M¾õ½ Ìœ8 OŸO¸¹²gùv”iz€Ðšj¾î¼¶‹¦5{@¨÷ÅÏ| –'Vv~÷ÞÜÝ€ ÒÖמчզ°«?}ršN]k›Gq¹!óËú…zá¯þ¾”<é¯Åösƒ ÑÅAöƒsñ„Ʋû$Ù×°óýô3ù­¸cÊóýW¿f¼P'«™™dX£¿0Ös>­³Ï~äa~̃•ˆ !SíÂ!ÉTŸh’°6x»¹¡‘.ÄfFÑvâ„Í××Ìâ—µaÛ[·ªg³ÝÑqUüZzÄ|hH!dˆ›yæ!ã~à^÷Î{¬C[kš!_9e>ùI¾]S¯‹ˆÁc%2íõµ¶³“fœ&ñÚ3sOC›ê[wÑL¢Üu š”8I)ƒ¦2í¨A³+~ü•y ¸èV*ÞúÿÃÞ“ÀCµý߆(iW„i‘TŒ}å%)$¥“e0Y3˜aŒB¼6ZŸ$&©ôR!JeìIE&I”,“2Ö c þ÷Î ÚÞë½Çëÿ~îçõÌ=÷Üïùžï~Îùžsã2j˜ˆuWÃé‰Ó×Àžç9GMo9ŸÓ"¬f—6¿ÿ®hPð»šsÓj˜Èô‚eúûOé ŠÉ`н(’D›g›å#]{¦¾Fë•ₚT{§r-=që’šö™þv©ÅmýÚm€ ¼™Óý0 îWgZLÙê¾0ÊšjÖÊÕ%´PŸ'ñDæ„¿èÊÃtz²F¡èN™÷û—»‰wöMwtu½jסSwà!SW$+4•Æ Û)ÿйðaƳ/ ëíO,J÷Y¸2zrüÉ{ÂgT‹49 „öžGžæw®k&yÓu”öÔ7ÁW¾ˆ³dµàÊ õ—Å.l5$pò©“5:D[òÒáŠé/$æÉ Ý ’)Y§6â*º%ö_8—V ÷XŸ83œ®'q.Ä£â< SÓE£ú‡ÎhÉuþ¸¥ŽÙc\úøáë=K­eéŽ÷¢ÙªœÀx{x”œ7öžwá&~ì}B(œ´‰MgúÈÒ+´ŠKµ_01;R˜ªR•Ši÷„SÉVó£}¤nmY–ѶY8Þ*‚Òþh¡DTº7=«+øª(ˆÏ®‡Bo¨[3.ÕœJ&j)+>iôHµk‡¨äÂünâÁUD oŸˆþ_ì#«{hÿJZ¼vÚ~¤£¯ø-›Ùd7æœA¢·±n¡t]æPÛXOikñ#~ÄN 0#W†ñ,¬\¶¬ï~«¼Óû¼i,í=sŽÑÀ%òa´ÞV{”Ù~*'/Ôýít.Ñ»L”à­I׫TóîÙv)ÖÏN[%JC6ù®Òûz¤yŠaYq¾`¨Ü÷jtlð!Óºz¬7rÛqC¡ø›íð¾¦þ³ô@8 JöÈYÏ‹sÞé¬Ïˆ¿£¥+ýàöâ…ÎVFPiÒ3š—`”äB£K±Ø"}í)ÕõEAð´3Ìu¼òàµÛ¤„»/ºÚ‹W¦²€—àÔ gIx_,öÖuI’ƒó•–úÄgÁð´v¦ònv\@ÏÊ« ~¶%Ë·¯)B-²dkvØCfà‰•V&üF¡¦êõð>þ®zýÇ—½jXé:$2gîêë¼/k÷(SH¸ob’í#åÓùѹᗾeQ’‡³ªŠK°×ežD-S…M T«¢æªUÝP ¤< 5ló"l¤ˆhéì,È.îB>ò-q]B>û>°jU¬DHN¼‰>½>#½‚sáE¶ù øGæOœÛXbºh m­›ä++‚BY,yÞ¼o³þL)Â]—ÜsöÔ<Ä;FVv%Ã…œìâvýŠDäÎ À9s`3VN~B‰÷îϺ²õRqƒÙfk–ºÐ²xi?¢4úÂÉð™[6³¯QÔÝ´f]ÕRÃZëÇèz¾ÚCL`Ö1xµŠ,nÛ^3ÉÁñXr7·I±¨^ Hˆ»BÆJñZÚ€h‡}*È-•>d´’Í eM¿1·ãìól½PØMõïîoE^vÃúR'/0Iéi‘ѬŒ ¼lÁ=#úòSó¢®9zän ^”#éºçE RÑNoÀ“ìTV³ªL-ñÀœ¥úÜ‚^/2Ç5È+Ê}(t“ ¡§¬í „þž¹ þÀÉ(°Ej|U´7p!bÙ}z¤‚[•½ñl”OèéÝì_ßÑdy8Ùˆ‘½uÔ¯6bñL@d±°í”¬ç"ñ>àý¦ ©ÿÑ~EB¬ŸÈº§3ƒ, ê{;`w'§—Nc·.„&¦á–µ;ί¶ä2ÏD/,—$™ë@¥©^ŒŽÓ|¡T•ä÷.K}7?ð“Z^^>ÿ·|{…v÷ì<Ù€h¨‰_% €K×eÖ_á¹Ó£· ¨÷>;mg{¿¦+Æ÷Iø¼—É6 7¢ƒK!ñ¾¶[(Ù¥ù‚-=Äsn¯/á÷§Yýf™ºøùRñú+Ì@;èrwQ;_N3ˆ÷ëéõ–;¶X²¶TÇÒ‡Ÿ¶6íjŽˆ˜¹ @²‘aE†¿¿“w¦S¬«ýw ç•‘yÝM…ÁFŒFtP°š±y*àOMÓ—W×¼4~3Í\O¨×tçàüôô½Ì–FÊ î÷SJÃf ®ð³MÝD³Q6¢«”ý•ùÀ8K1ºìž{†§Xô“«L~Õ@¼é@%b]h´ú}õ´·G¶Ü»þnV Ñ º¥5A™A{ ^¿ÈmË£St€)P)IôʨûÄò{…'  àð*ãà–-× C†&yÄÿ°ýòÞûäã‡A ùm®íÝá\§¯ôÖ`&M‹ºð!¢–tìâƒY|õû°§fvJÏj–¥8ˆ0slnd H7îÞáíN·sXë= 2•–·œÛçøì=JÐ'rÿ›´B»÷Ñ…°ìFA`Aõc ¦y¥Y°S¬Ÿ{œZ$™Ñ@pÛìki¿1*Ç/÷AV PD¾Ë?u[›v  Eqîd:†’aÆp@rÍóŒ~X¦÷NãìM©ýw“^z âG·/¯WóˆÍâ¿×4ùUBÀ»oê“ïg‰,ì|½(Ö>„Ùº,­²JN DÖÅòÝ mP3½Á‰É&IøPmÚç)´0¾¼®ñJ Ã/qVKLÀ‚ÆÚ­L¦Éw‰«vÅýžþºÔ`¦ʃjùŠÔVNµ±‰ˆye‡‚*R·'™Ïì¿°„v£«yž)æYV^¬ï‘6qðB§ eNè‰wó(Þþt2¼."ÊÄ’=¸]Tà@nãÛ2JN>žV<5ά>#GjWšK²ôäyÂo_GC¸¨d K`g|á Ø£†Y7,#5Õb˜Á¦ñ…—) „¼CÈo•%[b‘xºðPß~¥¯·+]$ÁÒâbNœ™è zIÜ ƒ’8žÍ3×®B<3õ9ó™Ïj޾厞þÌ X"(ºÀì'ùTÑ´iUŸñnÏàªh¥>^˜«obžN ºu‹@øÇò_6³“|D+8û&ær Hmy/Y²…tä÷ÎU‡éô¸Â.VY-x(«ŽDW¶Ÿ]•`<8+˜bªã˜öm¿w^û¤7[YÑ­[M@Ò†õ.È6ò`+ÿK¥CˆÞ]†næUv°œlQõþ§ƒ×EñÔ÷1¯_ JJê£ÚwN÷Vñ;«,°ÝA´är:`7•Ó:Z#SO˜Ç<°YÿÒå­aÀkFN@IŽXð@+_@éôÄÓ=Þ²ô¡?²tIª­/IÇ@C“ZZ±À"`/úL¦£ãT0"zI)…ˆV^£uÖéûšm•[°Q¿¡Ñ@ò²4lRú*4:>L M6•…D’«ÒýmáEÖ½MOWÉöFª§§—ÕÔÇWªnjÉ9‘•©¬¾ö€}p9ÿ’½ÄRRlÓ¾YÏó1 ¿‰Ô Éôë”ÐAË]¬XI8ŸóF§åÙ‚*Y8—n^ã}e‡Åw×½APs«õ¦²¦…ÌéÔ ”±'Ŷ3R«’èZÒFêèÔ!·Ãœ÷Ä,­m]t—È-½Ö¸l{.®d3°©™"O-Ò´÷Jgõc¬±¡y»Dý¦2-±Pm@bŠ&ÌK—«Pý͘Bý³«Ñ§°†ï-³°ÆœµÛY~ý{5÷²¥¶Ôì£Ç ùUõåÀKÅÄ&ÓMŽSÖ­"°ÁÞ,â+ÖOºš2µ/ˆiá§Q¢”yº[Ö&¢c%|æºY>,FD¯øô-‰ÁѰÇ'!o­›ÝتퟚžNˆ ›œÛ'Hß4sã$‡T‘xs©[ͶI¡‰Gf´‰W¡w>Þ½¸Úc³øRv±Ùµ+Û˾ŠRtœöØâæ|&æ™H”|ŽWú«ˆòÀ_fIf;{Ò—ªy¬«¤GR"í&;KIy$>ËQó™.ü6@äNw÷ÅΕ¤òé9Iò•û·2 SÓÒ~ÁFɶ43.¯Mëû ˆ"˜ð»ŽKXÑ¿ bš˜å'ýE—óA77VÝÉÍئŒ{‘߯˜œñ”&5…¤ÚÀè[|%þ5Já7Ç­&3¶(&«ò؋ؤ¼Öõ…3Ûý¶"N„ “³h©Ê›å^uøÂïÄ-CÙDìFLå¦þcÁÛâ÷µjl>dKáª;Žw}‚÷ \*Ñ ´Ç^xÞÌyÃi¼ÒÍ}.¡!%Ÿ˜b_[¹Ê ›¸ù&˜‚œÎnÞ”u@öÊÌ3ËDzi.š?+C”Ó$y<¡ù5‰õÆù”#Å6êKF Øh¤ßÃêøÎâðƒë¼½¼6òʰ¥äq:VVõ'–Û¦t * ãpXÅóûý;ð³/ÇŸÜ«–ñœ™ON÷ª<¡A:î×”TÎYŸí%f#ž?¯C~ÙQNRãA22g‹fª§U"RŸAU8wA⊱Ϧ‘µM˜Ö—«7`rÊg¡ƒVËq6#3ÄÏVtXçÄ·³âèÍ·3Í–“%íJ•ãÈM0áv\ ½Lí•O ›§ô|Bl¨ôA`€á¸×&§s]ÅèÏ,x>v¬îµ­´K*ï΋·Ý×()é½FÊ7ê5éd—é;Ý –RŒwaü–À»µ¯d#ý:+ð w‰ç9}|·”ïŒjd˜8Ÿ8Õ®äøœpË{^éüR½žì°éÜÒs.H1¶sÔâÏ› \XÒþ”ÎI7¼ÆX¤ëuz%Ù°'æT¦Ìvviè`òv¤Ô«Š¶Í32$xZwæøJt†™»£‘Öçò{ui<%Å@e±:ƒQn¿åá%’dcÑ÷ö¼ˆõJ§Ç‚³)^¢…©ùu%kÃ#ov_1 ¸ÁœÑJ|\›)Ã`r´íÌÊ2t lèÓ;êz€k©Ç3i!ëìn·v*eB2ôHtn)2» paÒ=ôA@¶N…ï&ø-ö.òúÎêFfòm°æÒå–æn%ïä­ÙþŠ•{áá/ß.'Ñòr ‹ï»gB{º liåíBìý/i9ÉOí½ËKP9¿ˆlöÈ|Ù{z^,ÿ€¼ñ“'w8¨É‡‚nñîȯñ¤0 Ÿoç¹gÆ)´‘– ØÓY¿¤k”<]¯Ù'¥§ÂÒPççÌ»Ö-çg<"Àß1œW™?œå1ðZé\¬@¯¡Uƒï¢¨=ýa‚ξÑàLð¼Šg‡Ñ¥NÄɪ#Ù¸|äV‡ÆÂR,Ël©?«Ýøœ`lepµÔý”• >Qž—#ŸGd­Ãùø\ð6:¯:PˆËØÀEÅÙ ëhQÿ+šý³#2‚ÏËÕ¹€Ò½J‘ƒH›Óéê…)zl'bõ ‘ ·txvù•Àx—sXÄÝßQr¡âœ îN²àLêä…NLñÚò˜¬¡›žžîNµ§ì#î~zfÑdƒJ2ȰJ‡'gˆïkÍçÏÀ¤ÃÛ;’SŽ¢Ôxø¤×–‡I³DsÝneI™§Á¥³°gúª'!F—YÒÑÍÜ'%þ^Q9ôIkÔS¾Œ¥R’ôqu»´v/@¡ÅÛès\ê³ j{ݳY#î°ƒõî]P÷1Ÿ÷ž³dÌðT”D"$„vtî«Pýµ Lˆ\ }#›”nî17 «'dyl>u•,à¼0oëW·™€îe ['rÈï·²{ÔúüÚet1»[Ø ×ôgŸM¨möZñ˱‚̇6îŠÍÍ1[JØè3WkaøÁû®ÇâJ!ÈÇ‚UÁÈ«¢3%/©¾:vlŸj¤j.dÖÎÖjeâmXð/SŽ¿ L6J÷^FÉÄ.ç( |hMIsÃV–d¨ÞåwÓ€f¾B?'JK\cïÄØÞûôÆIípz¯“ÕüäõEÖ­uÞRA'ÊE_ä@Àª‹OWU­(SÎÝéÞ}9û._\9?G¥¶¾sÅà±Û4Iû}m¶y„cmCÀ¡— þž ÌÎd~Œ”ÉØ²t ëíâäêw} G³X‹ÏYÞ®¹+J«?©Le1w$¸÷øÏg:;±*ÜhKifØ Vµ­XrðÉi‰Eh”Méõ²ZýŒ¹¬yœ}GŠÎ/>æEvw± ¼<¯Uׂ£ B¼¾òòC (Ä`y©À #rËÍ-Ó÷’Ù.¥{ÙªƒâѾð,8{Ä®5wØÆrÏžqpl3€ ˜ NôkÁ\õßÕWåÏ”jm¯‚GUÎZX­Nèñ §çDE Û{ÓWÌчùrn¿´ÎéJK9u¼ìy±ÈäSÐäÀ¬·›hGQ ‘4£Š²–ëœæ]–8~Yo½‘¬ß?+&–Á\ƒŸÑÊŽ´{vä™Ì²É¤š¤ÅÞÞ®˜·Å~7’»/­™•‘]l ‘{µ_^…TŒÒ%ùbytlü‰[ ¢èõ‰û÷\Ñð,²ˆ¦TíË,Öñ^ÑÞ~Bâi0V| œ øêJ»…[í.±½™Kë¨v”³¹l¢w/ UÿäM­&gŸPýÉçÅÈÆªÙ¢äjÓãg£*››wï¹'ñPþT Ùm^¥±‹ÐÖk–˜*25½7wrNü ^H²¨µíáƒã]µÒ‡B ÄêïÒˆúôå­D÷ͯ~sŸC•¢ä]\ñjUÏÙ‡>¬¶¬ÞVb`žØÑ•a ¢ˆDÉþF5éÖJ*žÍ&-BìRy]À†…æNå ßh5ÞÎI!®•¤g€U’™SÕŠ0)§ XK{QÅI–<›°™ªŽœN09ÜU<jÌS7¾–ƒ¥“oÄOe±BíC7&xì##´:Þer`‡Êˆ°¥³£‘ HZµÑc·Þž‚—<j‹©»{ÓÛU~}.uŽbϤ©o¿7ªç€/µDª3 ç¹;%½{½sY@íÉéÞÜH žÞ7¹§Û¯ÕÌ`Üœ!ÕÏäp^Ë™’€«1“¦ÍI›åŒqe„0Òà÷Ø>jëC'!ô2Ó˘úg€w¤i@‡§Ò@“çƒn²<³{òÖZRÖ³#º^††ÒPË8C?&“w\J5ÉŒ¡EúEQ/ÄoÆ› ±U[»1½Oσ7’1q å®°£Kü&¼?Û£•8óiùš¹g'“-H’t3ékDHN¤¨œáÚØ~™ÔÙº[ó™É«‹*ÖeO¼1w$øÁR0r›ï}_DÓ!÷òíÎxõT0ã=ciœâèWßÜ„T{ ®)*f¤9ëΊ¼%¿YFŽD¥£öl0ó{&‰,.¿E6$[Xœ14gïBA€zelvX^ 0„¼¿ (v!<¨f¾OI>š,|ÃF wæÕ¸£/žed ú”×õ'¡÷I¤VF¬ñä>8›fÔj?3•?”ñ°á¤ò«æøµ›eÔ9§(ÁœÎ»E·<Þª¡âNaÍD¯œ’ÂAl•”ðó$`¸{1e€ä±M CŸ×èâ±íA[ŽâY[¯¯~õ™G“sÀ žaÛTÿp:¶èC¦Ó#Í®¹™¡’ë« å8þ©v‘8€Ïâ•Ö}ðr×”…ªÏ´+£(Hzþ‡ðCzlïrñ0_ã½8š÷I¢›Á ·Fi¡U)ñ„,­ô55|vW»Ý‡í"lΣJJ@-?ÜïÙâÖ³>§—ÜvYgF輓ofÇðÀª½@±W¿vÊ a¿Çt9 XÕY·Â´iL掼°|Ü Z9¬UèUÖ­c¸Òìo¾­Îÿ•í“ ¢ ¼à«Y­\x*@:$}¶’'hþ^Ó»›P„é5Çí![ŠìZøS´TÙ,+ã5 `ïSüö ´5ñ;µrJwÆìe^– n¤ ¿ÐS?jÓk¹|Ǻ%ÙÇñòŽÑÛ}0'æ…M~;øiïÞ<\¯à7ÐÎ9³ÚÐGhEß•Úx°Ê>µY¹{"³öà¦×l Ï œ¿cêæ­_•½ÈEARMavçãÅÙ6•>éÚôçL2ÙÇòV¡ð£TqœC Sª×þµ+A¼úø©L/IbÅ>Xl 6*G»*ãÐsxvÄÆëi¦LØ"ñuÁñZ•µ¯?’¥w\°\M<|übJl»˜N×ôª´­ bKd¾Ûüº†ïýê'-i*Ua3ÓËUg‰""çSɶ ¥mh”‘á¤âÓ¥Y·³ª,Òú씫N_WûÙ½R»×¡V`0-”Üïï zîlŠ„‚{BÕe*PI¹ÜÐ|Ÿ“}€T(Í2ÉV^Ó„fÉ…‡ DõÙe¨ÛÎÒ’¸œY¡»‰³Àwœ˜ì€Åɇ‡ K hs7œ ­7Ç=ÓþÌpÀ!§N‰EcZÞ'ÞZò¡Þ6°ëé3܇UF2‹©¢”‚Sº/ìÉö(C%Tw+xçÛu¨ŸÌ$•(,ênúPÿÞŸA–|ñéN¸pÅÕ¸•¸É^êm7Pž;kIÔÞï`|§<¬±w&öôLòº„ÀzD­n:x+Þ?¹ÿ±e`±Š†ÊrÔQ~Í–ò{O“‰[—.¿ ÛÅ>Ú$} ´§ûÊ ¶°áøA¿n‡@µ×}:çfêõQ¯ HU­·©>~èÙ¾“¾‰ô©HäƒÌ\VüáY"ÙªõVe¢//wy>NÚ®Zær ©èóò|æSŸNo?neí[YëßÄ*稕¸nõV«ÎÞÿ"ÛmèÙ”c3/jÓâf,¼êmÕ¾iûN¦­e.:üÞëÄ´fGÉ–Ƨ+«0â¢çV·ΙeÕÆßKE½;ãQ޲†x ”à}°IRt‡k+áòWº_ôjÓ¥)GûÍʶkEú07¶Ò—“Ɇk7‘íÅ›ÖÝ[ Ï`YnõÆÊн$-§]”¡dÝ—œƒØe LmdDï(Õr‰)¹,pZ è’§[$TΉ}]z‰hxñÙrRÂcË)„Rò¹ø&r©Ô:Ó(~Õz"¶¥¨{;ãbŠ}êâh(FÂcÉ$¿ùkoŠ+Ÿ¶÷äúe»lQÖ,džSôuØ¢þð[/UCoC9vëˆÓyÑ©¤þr`W[¹ÀÓ‘†› Ð _°È6 ‹UnsärÍk)e»'Xå±§…+ZC˜Fö)ö¡5y¥‹ãŠŸ‹õ™¦N¹©iË\GîD6|”ëóK¾ªvg]¡}œ¡Œ4Œ†hÊÖ‰ qáGUõ¿=\‰Øã¡õº:ìÒÞ.ÎÐl.hró¤Ð²ðëÅOD ¦ÃjL"‘÷â|2ð²ÍèÀ»#äIÎtÞÎÊËcÈY>\í¼Ùçpui.ƒ1µT‰è^mÁ½Ȩªèom³­LßþÂr3û›Ô|¡½6!²â­¨àãÓãÖI{*h3æfǧѠՅ§Ïp8J˱ÈS32¹š&ŒGˆÝš"#»ýÁ4Ê/ÀŸ°ôæÞSY±”{ɰ€ß|UÖÁšþÑ Ûò»ÄL¢šÝ“Ó“ú?æyQU Ákþô·å½Ì©ôGk‰s3{É’ ì‡Çjï¥tÑûô"’Þ/¯d±°nˆ4¿¬¸o»’áQçxïÖÕ¥Õ®×56›3ŠŸín;"ܲÇÜjÏ­þ›ëW{·Ð¬ñ¨+*×y°6‚‘ï˜S”Õáë¿…m’©þ{VN[šˆN{‡6=;î¤x]óÒ ’¸ÞÐxa½Å Î¡ ®>ªã»ÔÀ%ñÁpè^_m‚Ϧ“yo½±)Ù‚JtQ±Ê.Ö—wÎÌ.W{%5qaf¿DÏ'4ë¤Ãƒµ34 ¢¦1 ho"Q‰ñZêÅiqmZíuÍÑÏ”SÏ«­u¼é„ ÇiÞ>̺¼»÷Éý¥ Ÿ´´ˆµ ªŠ™Í6XÇæÝX’e"0͈6€gçGù6‰ó~$?zT»–ˆ>d´b(öSd²èW˜ÑhVø¼÷ú“¤ØÝLö$„ÏdmÁê©H¬x–¥Borªu´‡ÈêRR£9‘B¦xæ‚S7w†·îúìRÑéYÂ×tù@¶öPÞ¦´'I'jdÚ`¤(Ú«ì¾Ö\y>%ëQùëe Äh8ö5¬Œ ¼´â€÷¥)M•·‰,M¡2.Ê›%¨, $¡(Y Ž8ì>?á4•¹™öÐ}fSØMÃSÓÇy¢&xeª¡@6™‘¼| Åinú4f+™ŒÑ[„ ¯àXçä±»÷§J`ï»õ°¶§™G…¥j:¿7ÿ6³_øQSÓÓÝÙú·ƒûH«îTœÊÊxhâéy¨ìÉJ€qˆBZ°I¹ÜbŽìo·Óîß>½5¯\ ˆ\¹»G‰¶(¶ådRài&×sÛ8™Òm®J_A¬Ž!#μqyRÍ2ñ¼‘b¤!˜QÆÜ}Öu.Y“>Ï0*Kº­Ïæe]ðøáI)-SxîªþÖjëϹ™ñ,Övë">ö|¾æP F†LEíð(7¨ªŽªŸ±?S·×&öÅJ?ÎUJ¬¬ƒ™û8¹¿Ð!Ex×NdÓ³òÇs”K#ç3ãú89Åöw'ç77ÙT)²Wp¶q ¶“…½ƒužú[ %ýúbþ ˜þ¶ç·ž39>ÛÆø×û6Ýœ³%ÛhÛsÃ)lr%û÷,Äô;!Š …»ƒN3·ÏO>=‰IQ/\­f˜œWYɉìè”z°í¨Éüä5R ¶€×o2Ÿ\k!ª²7¬öP8á[.²_:hàcëü“М SØ&Œ›s¤Çj¡¯}Ù§99*¿1ÞKêj‚L(Ÿ&a ó¡Ka³°¡y¨L‡~ϳßmøûÝ8lá7V{!`ëÓ]v:Ý€U€/ ß í_¥gö‘DXàåËy }ùh&ìý}ÆŽ†§‘""¿ýªó~Àž?ªŠhÇÜ%Ò‹M¡>KÝÑ ¶äÄ’¦wÝð›:«ÒáÕµ=WB³ ššÃóͺ™³X~ÈÑÞ5ÂrÙ€‚˜Ysê¡¢·`5÷f:){‘o+½føw"݆ÃézxKQœæäû¸ZJÛ(=«eeh‘¨8 RIѰËivw ì¤Ê—m3ÉG¡÷6î‘ )‚ ?}¾'=ËH2†+}~äóþÇ|µ:è:9Zuì¯E\Aí*ßWÃ\þ®’è¹bÃ1`{"Ó!t—(r6:@Y¶:™ô’vzádqæÁ¬*Ù¦›I<– ¦ÂF”!;P±Ç=[æXQØ|DøP|š«J®´ªÌJüM~ƒ7L°º”MÜ¢séH;!7Ë<£÷I|l•úÖ#ÂOh"ªmÍó¯–'YYDp¬–hŸå•ÑPæÅ²;ã.Ü(µ-‹ˆÕ•™ÌC"û³^*´%%Xäpä2¸e4]½·û4-TÜ~;ÀúíBúõײ/jˆ‘“(ꯃ¥®–wAâû~}Y–‡D§»žµF)wµ'8³þøš¶ÑiI£)lU2ùø)Ù-)€X’¬Ó|ÏØÑ.èl ¬„[vWo¿œH¨ω'·oL²O [Ð+:¿1dmçíìÌk­bš·Ë „PWðº$Ÿ\~4í2Ó–,ÔAø{—wo6zU™Ø~!Þi±‰â´×¯“€·„íI¬SÙ]Ž8`óZTïÔœ½úHç?ý•öÂB¨ri¿çšÊ|Q)IUUý¸¡û]N%¥ön"E`¯fo¡œ²òE%%û`o»çÙ916÷Gc5ÂÐZÔíÿ©hĔھ¢…Tî뜕Ÿ?5ƒ á,¤Ü¡UÁ,í÷9â¥o¢³pH‘ОÐã:@|-iG³ éÙ^¢d$íB®¥ ß±êHµ Åèà+dC<I‹aÝuÛ.oði*9J¡lr£ƒÓ¢h‚¼[Zà!9ÕÅrWè X÷C}lçÁå¾^×kË¥æRÏc¶`zº9F¹ÎÊH˨÷t¸m†¶LZ÷ºÂ”à&¯ >‚;Sgx2€gi¥µ"¸ô¾©i+ûrÜnVÀlK–T-Ég–_\m9¸ê¾ˆyâÃë¿Ðk»S‘ÖÝjÝB°Jì±Îña5 xÓ²­;Å{³šŸ°¤Ë¼ñ­¿`ss¸c%™±™­7Ýšy-‡vùFÓûØTU=Øu—Xó–­Ý‰r TD`«w+ÏëìÐâø¥÷ñ¿ñšåe¹ë0®$õV…†ò'wkTƒr«`ÓûÐÚb¯” u͇À¦2ÖH(eÏ8Z’?¨•׆—¹‘kÙ'B£š¡Ñö¬;ÒìŒ#$-#!KjPø1¾™ôqÕµOšš3ÏaV~9wVÆÙ=r„DìÎöî½Î|ýТª½K³ö Y&‡Ü”qœ–æ/z#£_>=§W[;ÖÕ¹Þ§¿ÅOÔ;ýæE,öÄrs½lÚ¦”.8Ô¼D[CHÔr ù5ËïmÕÛ£ë/*ÇÍÒLQ½+*ÏÝõ"[s™ ÖÕpwu kyïIöö§S3%­&di9°—·Æ¾-Ä, î“8ŒüàiW»ß`žÃ|ê.YBâ›…T6Ëerÿ&öâûó©ÆúÓ ý…,¯Ý-©ž´d‡/ K\!oxñÒj`Oû¥Cë3’g\¥}UÇš§S)Ñf&Lí0QR!•ÉšÙXÄ:TâæoÎ>ìêTo:¯S¢³…ùT»«„6ÏâdŠ0;¦z8;b)»¨5N4¹Fª†émcp]½Áã0)œ¥ü¦ñ¹â,ì#ÉQ5›fú½¾Ð¨cÒ÷fñó~*_ËîÔŤ% ).#÷'y»-£EÛho 3~ûzánü:^¶\XÜðJc™rͺ)lì\ß鞣]5•eQ‹Põ3Ó‹¯©5LG.Šh*ô30×>ds^dÕ[{“¿ê°Wº¶Úbz놳ÍAÇéOr¥:óÔK÷Ó¬—˜=¥¸ŠË¥Ç_7*k‘ ª_j—J°V•ÉZ^6•2;}^õëY[)5jåÇõ:Z#û~ÉSÊTOÖjLй»iÑ«)*Çß)vê:ˆÔ„Å’bËk_+«ÚY°]æõÃpΖ“8 —Ê_.F<[ÝÔ¹íY°×¢ o/ÉŽÏјn$N²ŸD3¼žT‘pЫß2D»e¶ëteÙ¥œb3(ŒÝÿüå…þGaf9¬ZÛ]8I²œÄZ¨æùª6T‰j7ù‹-Q‹^§†%¥Á%m,8ŠÕÄ4¸põnÑx, x§\ MØŠ JÑ[lSí%ßÊ 'Û˜r¹íý( ù´m_nŸ¥Ã ;¿9NÌõUëMƒi 7ó*³ÁJí«JO&·ô3¯ñí™Ü`wZ—¹=­Ž¹Ø~¦ôAJ˜”äÔíìêš+J·†<@ÂĺšUŠ8" rPVBòBvü –¡Ž—Ÿ»W”Äá9Zº9RhŸÝÓ%ý. hm¼TVårîpV£ëZyæ™­‡ü3šÑeu/­¸Vg÷¼–žq/s»Ú!ÉùþÁ›^R5K[ú´*´3æž^]Ÿ“n{Yï,™MÈufíf×7—Ž¿ÅÞÝÇœƒ =m¤z×Ù?>O&‹³ý‚Í‘íP–ÁZζW¢Þ/Ž0«[õ'ÑZHI¼úW5ΰ©vk“ î*§nñ¶6ôvº¿¤ e ¬@$ã7•dåÓsº6‹©Ö+fÏ'åð$=ôuˆemR¼‰"Ý Y5Øê…£~¯•¶ž²3÷PWNkùv7:Ã=‹± =·†AÔˆ‚ ¥%š«ö^8"ÐxçÆÑõ”C¥ÃLa¬-§•´­÷±kaÜú,=U4$xC´6b}%Ý_7[ í‡áD2¶]W?:ˆ|ÚÿB•ù¼¶÷ôÔ¾ÊÔ¿²U¯Á©JI´ßïíLâ‹;Îm¬òm fRˆó+/ï7™šq¶åÔóñª¶,¡++äJµd‹á†ƒ´ª*;ãmÕ^d㵘Ùz-51#•ùÐÕ¤ô@|X^ÕŠîŽèkÌî¹/|××÷N “ç–w5ñüÚVµìu4’ˆÐ:·uþÎmtœôåœYÖ÷"züâc$<óAÂ!Êš¥‘©»·¨œ¤Sá*‹9•y_/Ÿüôìþ…•svc˜"‚hgOÜ2ªÏ¸]z¯»nnöIN\Œ°{E÷=vŸ¥OOµ–yä‘bi¿¤ª"[b— ß†à›Ç™÷ç¾È2“¸Û=I2ŒÏ9H ð´pëË©ªÄØz”GðvJŸ¿QàãY—Ɉ΂Lº±ˆSBÈ9hA÷)Ãëâ`'pûwΨҟšï¯–Sƒª¦X€OYéy>¤´¢MzgÚÕÒŠÛ!;ì+äú}(ï"E‚½÷T̳­Ø›6™¬n.ˆlØ'ô`Ïé©Þr¨½yýÒŠšß%HÅ-'i¼œ*rÑèúœÝ´dc¦*çCá’z¥:—æT°=r¤ì]^qVRùå¤U/cèø+ç,¥-Êœ­&k ]…ÅF®/ÐÏ+¼™.^òqí©{c…+óø™.×Ô˜…9J©µ^®Ïv,« øøêP׃=^»¯TUXW½ ~ðušÔä½/ËB¹e•Ã"³`ùÆ^ùôßK+Bz¨íöd²¼{gSÅ g¤ ,ÔÊÚq”/ÃÃâÅII'‰EœÎ™Õ˜ÆØç¢³ôV(XŸ6Ï=ˆ¬ÓF-aÃ{»+®]$“ÕW_£Tj`x-ÿÀˆ =K1#[vÁLqQé _‰EÔ6Vú|jï¾<¦bèº9F~.Ôâwš¢,s.@Óø´ù…zD;âÖjüVQŒco«ˆxfiÌNˆµù™°68–Á4kÇyy%VƒÛh¼Õ¬uŒDXoT‰‡C+vzÄKŠ<ããM˜ßÚ+}Ö.е:×?/# Qü¼8§l ¼ok‹ hTTN<³½€Êмßu~›-éÆÛ$7I³ÉtyÉÅX°Gð¾®;¿ÕÞÃùL"Šõ{D4N8íÓó@?&*Ê~§RßQ¡ôÚø“DÈKà¾G ßÌa/ˆ’|¦Ý„&\Æþ5–~Ö¿þÊ!σ±È(Iò!&}éžWBF´íªÅ™zp8ížátèPi³˜Øög;J€XèlTT¸WºòPoïÊÚŒ¶ ©# n eÑöÍ=Evàl´`‡{ÄÅ··»`¥‚À:å¿ ì „>Œ¬:,_¸·nÝiV¡'0Ýȯ¨B xz‹AVªˆç ëlÆŒIШàfÚÕ€ã;˜E׎<‚JÚaKд[ì “ÛªRn.0Óv+ô?nÊ<Ù¥k”½­³éHM"µ³¾É ÝOªÝƒ9?ÑõÈž¾ÊÇS.sÆô¨$£»…¢óNÎ ÔûØsÉ*/åE+s¹T”_áÓ¶M×›¨'»Tš¶\ßs@t6$Æ2žÆ¿džäýÆ£çâïÍ”OÓÚ›ÛÌ K·³qË šìý¾5‚¾*u{ïd÷+&Zz%êrõ-¨õ3i]ªPÔñž­÷„´¥YU³vÝñ|OdMïv?’}tú ZÄKÍÖ…óï3?®Ìlt¬®ÈÏx½£Ì@5==8¼í±Ïy=oä6æ²)ïŸÓïØ|„•_Øx[%¾¯¬«õJØV*ëÆ¼ÃÔØßå/{ ±a“Ý9×Y\Hµ×ô{î1³‚ ßéfúˆÝyTîÈêžò^ÔéDÜ*wzÅ3ý’”âÕôÕL“¦æ¬3z•Å—ÅBnϨºµKÊw®ZªR«Ùõ <ÕSûî@é=1§÷‹ÊËŸÑô/Vd­ôN89•ÜV\ËXqÂÝãc€„AV¬2R¨Ž!XßPÆ7Ç#qõE ¸y f÷æ*Å–IÊØrñH=#¾ÕÄ%ýäþU—Òw°ýÙÄ™†­¤åi=©Æº¾ÌÞV+y aCíoéÂ`å©í¹ÛªV’¶q83Ȳ-…U2¬Rff˜!EPÙÀ`µoÅÝÌj)¡Í{QÜ}e’¤w¯T6´\’ãy6‹VSݦÄQ:¸úE ¹$¿sCËpAûòë+{#•Ù+v³{%5¾£ÝÒÉwIÅÏaÁì‚E“& ¥ƒ¹øÜÔ]7ýištßÈØ.ëÆ¸ê˜n˜5•¹ûÒ[ái¢{P|RϤÄ,Zåwº‘%Ï`³{çÃú4WòwÀáUMÓ;v%YÁ M/êŽtÝÌ®‰xŒ¤K Ũ¾¯ï¾ºøá+³™X·]5éÌ÷·çY´¦û²9ó*çT¾/|)^åC\ßWÖcNè_?½ÛztU!­F›¦J—€õ ÜÆÔ©~ó T7Ëbåëô#ë²t9g=Ï ‰BÔÆÄz½ª"H‰½íšµÈb„3CP÷à¼ÔÊzVØ×q¨ÇoHøÜÞ[Õ¸­£Ð£¯¦¼”½ïŸÇ‰æº‘z‹PµšÓ¹àá+ultÕ±[ѸŠÐæ¾2o%vݯÄ7pªÔžª™~³ü’>|WsyE5Ø÷ü—¶Ÿÿø\y®--Ú–Lv ‹menÓ—†ªÚl ]þ츶8½ïÁŒuK6×2R<‰b-Œ"ã®–p}Ê¢–k“E2÷î;²´¹§<ä¢C·92£/¿¸Œ.×u&m¥xm)s¦ÿu Êléý3žb·ÏÍ RªÌEÑ^Ô³ ÁtAÁûöWQ’{ÉQâûêOû™ž›¬š±2©ýêžË:ÆÉ¤4JUÏ 5'¬Š»ÊZÉVìœ$.±âLq©è|¹ªjFŠ/QL¤E x÷™LFQk »Øqþ×8‡JUç Œêx ÀvwKy "°^º¢É¥þòêUæéY4lo›J>SM è²SΫ°ØðG'!>³ÐKÊ>€=›&%x›a¼‘°-,öi‰,¯åéïíæcʪµÕK£’÷œtÙÝ»™q:¿x¹?©Ô—ä*Š:p:Âq aÝ{DÅíγ€ÿ ‹çP‹“¼žÝñóØöÝ,ÞÇñ„™õt›Ív§˜·òi(ºš×›$”KÝÜ#l€Ý)Yp&ÿM)»Ûb/yqe×™ùz/ù4Šöê,ÁŠÞÓy_y!rï9Ù°;ñIÉÚ÷8›ÙbEݰ®{S.8ÜZêIkêDUSÑxzk‰P#°êɇ°j_æuì)öqŸ«­uíÊù¾ÞÊJ½Ç™KÅ^ÃÞ?Í<>˺«À%gŠU‹S»÷Uú#ZË»¶5ÕáÑj÷¸jÅÄ$’Ê©E‰1I§qÊnwª’É¢a¨É-/ˆî¢$½:&—y8®w…D“šgÊì-öÎ@_ãú8†ò3)»m:à îß°xÏTËùð»¡ó¾6x»‚”¿ý࣫/Š·Ë;ŠîwzŠZm Œþã$äöU51JK£ôºý;Ü˜Úæ™é¯iññpÐ6¾Æšj¯ä¾IÊ'¤vÖ«¼în^ý˜;Œ²E"j®!2ºX—¯P Bj _SD)¹s ®ý|êB©OÚ‰EÐRñ=32*øš9Ôy·àyKÒjo>Ú/üHëxôŽÃ Y˜€íd½ÁÝ[_Y+|«R Çßhö¶Ûbí`Cçb¬”בÁ»|Oû6±>áú*Ê&DR£VE)Ó à¡•IÓ¦¿Á=/ßî%—^^ntA}6%å€E&SÍ>±˜ÓÄØâxãቾéûúì°^µ… GÐDo˜Ý*ôM°‘eŸËKÝ>™nu±?;ˆ80+ ]}àC_dôf‚¹TzLÇÆ´ô…FËÌÜ€.³Æˆ];]åH…U‹ð…’%Ãv›>((œÊI*j]Y…¬æ¿jÕãP±~º PÁ¹ë¨šë°XrÀ¿¤–¦š©#‰@t§—ޒɧz ²Âòâ—"gåäìïÓDiÆÓú º£^ÓûÉo=ÀÁöQ/3ßÒRÞ²SKk—.è½Àœ¿õ{Þœ“vKËÌCþ]dC¦É›^æìËR:×}Z Õ16Kdáaú|Á%=ë"ÀÐ#¸|ùËÚˆ¢Ÿý*ìÆ+KG~fA¥kc‹¨kÆõ¯e'?íÖxËÔô³?!v•{8EUþÙå&̨õ††{šˆ×:ƒLÔ^ §­8ž EpV›Ñèªj¯Šs ú6­ÒPôMε#YœjAÌZ2½Úþ‘"å—ª+R©Zâùõ·âJoEÌ1£å¨Vó=·¨å­ô£³.«¢4Ø]¢å¡ÐtØýkû“æÑJcUÞ53 ëµk©Å×–Ã4üUf¸2»ÚÅKï"Õ"ë¼ìs˲8æV”@}½L’rðþ%QB'81ÆÌ8çÃ,gíÆG}¡×Íe Å€öv»—ç91ÙôîøIOäÈÑÕëºÚUßxÖšŸ7ÔÃõL&½,aAà‘UÙ}”âÙ @ß–p|i•ެv›é™ˆØœSG„"ÛŽ¯œ$"½”b)”>%­/y^¦Þ^xKs=;¼ðF——ÚŠ†Ñ+‰ìC´8m< D}uñ.N[Vì‰!b.Ü[ñôBVëT7U8þª!B%Ïþ]’¸C êm¬Íé úiZVØ „KY¿ì‹.úö‚,¡Û¶Q•hsGAÓrö­”¥ûq:±r×v†ÎXóúà|s†@FcrÿyE„Ž˜Û®ÝÁο9nݼ¿c:mÖåsÖh$íØ MgòV7rZêù(qqëöœŸ;iÅ6ISŸ0ªE…•´œH)Ɉùµ¥¥nªiئ¥‘¿C% E- Sek’É@;dŽëFEjkËbŸ_‹Ší-oJyÓ¦ tÕÉ*+GÞuð{w·²WDÑ»'wñθàS\!¹K8ÙYÐ^b`¼ñµ³þOZ×Ó½ëš11¹q%Hø¾³iú¼÷£«æQVç.!éWGö¾glè3—½Qµûþ)€.Ü\{ŸûîºB•Åþq¬¤w˜£Á¬«Â&õ·µ— 9ÂÆyÚçÕKÒ¦1)&Z q«†¼ž§¿“‘éë }%÷*7•l“£ä½å@n·½:Œ+ÌTð©ªÊPRPUƙǶŠÍ«þ°÷ðž4’FßzΚ6ïæ‰ý§d2ó»ä¶­b"R½ÚâYó® Þn¬â›xÁ——4Ñ9½S•tUV½ÊÕa 7Ñ#•hv8²–ô«®ÌÌ¿è|²$¿¦“h{ç.ÑP5{A3¬Ct"š0…z!¿}ˆ!Èt¿&´Þ`iN˜3Øq²•YÄ‹ó…R14ƒÈtrÌ!d c¥Ç¾ÀëÙ/ëÕ¯_câ|ûU#[H=íâ;4Ó³Ê]ÞÒ°uu;3µE„W\1Bel;|B;ðÝ9ÇÕcT›ýiQß¾ fGµ­êåPY5{ƒ7wÉ5Ìt]y¿®iÖ!¤ˆ›×±Û4ÔŒóÈôÌ‚Î4Qßžžã«çà œµ×FÜSgxK)—笾ÞâáÊœíÎp¶xçd @š}˜r§86¾êZv Ö™Ó¿›\ÛSœF:Ò—:XÍYƒ'S)àýi-îp%Ô,dSVËÞáVéh!Ö MÉP•Ð}R=^XÂM’í娱dÊäÅä{ZëíûÙ§fë×&ø‹©^*–M´o ] ðå ïÞd?CëÒ4¯í‰Ä×­Ð{5Ë S¢PÏŸp“`HĦÚÃoÓýRU•/-oˆ4:±KÙWéZÅùnÝÅ+:ÛãÎ/Ó¯‚D>¡ÝÜyÙǰ4^ºâôÕ §Ìà#ë3j‰Ç+\t°-¿ ïx¡´JðS¯ÊÜÊ%øjÖb -TÅþUõQuô~‡JŸ¢¢IAáçñGeVÉÎ|3Yem5<ûAê5f…ÄÑJi/±Í¢tÕó5'Å:ºÚyVŸÀ­ŒÖ)~èæUkú@{÷M—Ä“ÛÄ~ܨ¼\,MõÐß·gNEú*;™çñƶwH?çûT“k^b*¶·¾+jU<:S'ñ!üu’ÀÛ†g5Ñn¹Ž–QÊâ °‡÷{ä_ŒH}åÙž's%Ÿu5à–ÌSG>‰Ü .µm¯Ì J]Ìâ¦Þ³…Oß- G?ß]p©,R«åFUöžšîy뛋ål»$;ïŽu†TÚÁr¿•4ü¶Ž¡`Pƒ<›CwL¨HɱÁC6F/î6—(Êõ´]÷ØÜÍ¥¿ºØtµöܳsß,k/~Î'®<}Ûå;ì[©Ú²íLL?âÊT‡]RZKW„Tª€?•$¨‹MçÞ8c¼t~®¡É-aaGmÏßýƒä,<ïàfnˆõœ$¼çAÓþú¨EG ›'‰-4(MŽìd™ Z‰¤ú~IôÒž;Ñ@Ë÷ÿm¦vl®Ñóv?ÏüŸêÄüÏx\£ø¯®ððŸ7ÿ¯2Áÿq¹Fó_ñçáÿÄüï¸\£ù¯ôóð_}‚ÿãqæ¿ò¿Ê5Ee¥Áõ¥ þËõ9ÿ¿øþwÒïïµñÝùEeu5Þ÷ÕT• ð_]QiâûoãrÁ–êé˜î6ÞÙdºu ÄxÇú-ú:erP¨™²ªkªË{ "¯ 1u·rÁa𬋕ºÁpBŠ怶²EÀœÑx+ˆï*‡vóÀx—é`]ðh¼œ)ѽ bûƒ/ã x®ÔiÛ8X¹ãÐx8‡•ÓÐPÕ”Saâ1x'4BȰjAF %DSˆ wÞÚÅ ƒò^‚9a\!îh;ø2yy(ðŸ-–@´G»ÈÛàpË îh'ø2žè„Æ9 Ñøe<€Ø >`”×k¬-¸[*'ÑC» Ý­ðh[ˆ5¢ËQ”W‘WÈÉul1ž®ÚÀ—¹a\lÑ„e˜Õg%£Pr¶Âð> ¹ ±ø¹ÒÅçªmletà !A¾ÿ¶ÀÆÝÆ8‚K ŒMCþ +,ì×—€¶`pø?ÃrðýÀï}ÝÃÅ'Ü—(lE;[÷§ÀØ;a­­œ¾ÄãG`¸ô‚`‚véò‰1\0(ÀiPâß—E Wp@ÑÃ[Ùk 5;ò­e ìŒ®5ø…ÍÏ*êbAqáV×ÔÇÝÎÊ Ác!x4ëŠvqpÅ@¬¬1òˆÐA^–£lMÄ8½뎖——ñ‚¹ÿl°¶hÄrpBßà Yé„×þD´ÓhšØZAmT?­ h8Èá°î6èA:€ryüJ{” žÛ’>¯;VI ¶+{w+gˆ@®‘Ó*ÂlÐ`¿0Œ³=çn3Ü8jk£ð¥CúÚ§H—A¬±î¶hwø2…eÀR;[¹T°µ€hB¿ñ2PgÄÊ 0G#1å‚:ˆ• ¨q±rÌÄê[¹£­FQ j«b÷e?xŒåQ‚s° ¸ÚI 3;4Öj¬WÛ4•1å( !ƒT³Œ*‡ñÞVZ†Ø0ðgöhÐÊb]?S°o('4`¿†tžw²ÏA}ê¹ÖÉÉ «¨ ™ƒÊ*_ã  ûÙ§ÐN úµ7?ñn4–ßåÞ÷Áý³¬STÑ\«¤¨¶ü>±¢¢’Æþ}ÙŠ&|iðZ±?le»kãø=ð** h¨i®UTUú.h @‡U¿ìÀÀ_­ðßkEYUi­ª²ÚZUெ‚Æ¿ ƒ°Ïº£ Pê+%çÌ3ôƒA÷ÁÚè:A†žp 8ÞÊÚ =RÖlÐNN®V¶¶ûá{œ«•Íà=ŠHàxÊûŸûp@%°ª ·Ë0k ÌA aìa턱ðüdãw\‚ÒWAðÌ.€£>í¼mßëÀcÀvÇØ;…žƒ· 9ÖX¬Ï5ñ@~ÈdôKÖX<ë<2(ùÂÎ/ö_nBÇmã¸ÕÊcÃu¦«dGôæ‹îØ¢q6ÜÎ ¾&X‡$0×™q¡C\<@ÒÞì“3Ûç²$òÿ["*öu“•‹­ÚGF¬Êw¡dõàíÐ÷S[£©«8ÔýD%À©:€ÑÏ[) 66*ðáéèè°GKKßnhÀ ÝŽû&°)ÄU²Ü`HÈãŽ÷°r‚xb1¶ãÊI ƒ¸ýúð)¾Š‹!Üf r¬‹bqüƒƒC&yÈøpLùG8¶må‰â˜òOÃ1ec\ÜÆžcÜf¾ä˜‡Ë?ϳ!zŽ»-Séi >xäÔÛd…s0åúÖ!ûV.vû1 4Øìh¦2žLõGÔAÇ ‹VÕŸFTAöqq3uàB´Àí„æªŽs¬õ~ Æ#EØnµÁÝën:®ÔT©©‡ÆoðbÖa·Žï «¹Æ€¾CíAœy-¡Fx ‚Cöf¤ž¨žü«”W)¯‹ÁÙ`=Ñî&hÞÔnÌdz¨%@¬m¸Q•—¬Ü¹ã ÷¡æ%ç;xUѶ£Y þ_cÈ‚íhüõM­ìyôÿD`gó%Ä!ƒƒ¸¯=â‚^ ˆûZ ·›\1¦h~½‡Úݲ°ÄÿÓ7ëòè8°©º»Jv4_5þk|ÕüŒ¯Û+ãŽÁÇœ¹€ 2w¨ISÀ¦yŽg‡Úû {5ÿkìUTäï:ó1ÿ.·U`?Þœæ6ºŽËˆqvÔŸºû5¥VýϱYíÓ ç_fóøsøkŠüŸ›0RäÎIiîX'c+wçñ Ä€æ†Øke3–ƒ)°¥Á>~ÁÒ±œ€÷ylEeˆu¶¶@—ÇaîhbåÉ̓qá.«ºy =ПQy,§ƒ¸ýã¸ÍBV/½5—!O0Dïá,¿n²Õ÷pçÑõ¡€v>#ðXLÈ|{ÍZáϯùŒNñ\¹Vø|åg|—«F¨:ë‚û{Ø€ ŽÓ’´’âŸgù«Qüw9àOC–è¢Çˆ#ãŸj¡´ D&ãœ3´„ qÅbÀ ÑöGi,æ0¾ì×ø’Z™gÜG’úŸ¶ëƒÄ„`y&ÞÕÉÃð¢_ÍJRË9ÐfA¾Cª?™6‰øúC.ñ¸#µñå 0ðæ!a‚ÅŽ¡gv CÐ܆ ® -F3nl‡ÿààÅtÓh:Þ¢ î-p±á¯Ú>r<¥ok ÁØŽ Ñ]¹4w'r[‡—›?£ýŒÉ¿±ºwÇX{àÑÿp®ê·|8öbª‘)ƒ;RñÜ÷wxú½äjĈî†q'#{ÆÛaòÏÈ 7ÌÔ%Ü Â ¤yc†Ï…ÊÍŠ÷µpó­yüù´„‹ ºÜ´-ˆ.lÜ1®àx“++Bßß–ÂÛuâÀ“¶Ï£!ºXg5«Oоõ ªþ„ÈŒÅ|ŠÃ1ßçCDÞ^M^‚ø0E¹9mŸe‰+}%KPB”øcGL°^ËxÅàìïgœHNzqð¡ÛM +áä›$Œ€ ·aºj„àý:Ÿþ'@€ìVÝô P†vF yc}à×_ëÙè ‚·i ²gÐ Y nsý2O†ó”j$rŸëÛ'Õ/·$Œˆ‘r6Ô¯'£š|ÎÕ½?˜¸àé§-9hà0[àŸ5ÂØÊ` Ù8-ÔÜü>âuä«û(†;¡ôE'†PâY´ÑbÈŒ.ÅçÑ1"Šäu0;ÖhÐÚv„aÁy§Ajè;»:¡A“ƒû^ü÷Çû~–[)+ŽÿxA %ÿ=®Ó¼ýyë6rÁ°yiݾ1>úïÙ90óòmâü†îÛc¸¿jð††dÿ†Éø8a\Ðÿ¿,Þ×÷¼ü´†n$¿aêxÌO³Ã!Ø÷¬ÜWzÈF|Ö=¼; bì <˜6  x Bý#öQý§eC&ìóiÒÿ KÅÛõ6vvê{Æe–üˆ-½?ñ[Öät b‹¶èÁ=VÂv¤h î³ü[š8< ó'TñÓ¤Ñð¹ÊYÇmúò-:ÿ(üÿËñÒwg:Hí¬ÜÑ88c÷9¤ÚýOKTÿÑa‰Òlx99:lI>m{ûÚLéϸ|>E ù6ÆÐ |·Oø'îÛ‰¹˜¿d[¾5¡ÿÓŽS†XýÙes@Ç)vX—f2bªgôbáÚOõÖ~þÀþùO˯ÃÖóó=ôÿ)Sùål ä[CS90ý3Fí÷(rú7ô^íŸÎÕü1½‘S7<¥«ù_Vþ¯å3~MÿGæÄð¦IÖBþ?ƒ¯epþU 0WPÆÐ ¨ü³f@ýÏ›Q™éÃF@}Ø|-Ëü{æÿ=›1´iò¡‘ø:Rc¸{àO®ÏFd`ðw-äÛãOTbâû´ùƒÇC(~.©©‹€ts»ø—;øG}ùsv{T>Õÿçî÷pkmG£‰Àñr|l?eX°hƇ±Eóæ¹]Ñ6;pà ·¢;<]0ëàY@ò  ^¸84ºýl8ü Ÿñm¥Ãcm±<[Žr?0Æø­Å˱áe0xÀiX£ñƒËl˜!O¬wáµò=§ò7u\b…çÀ;Ü*nèð0€ X[ïa=Âãý”sƒFçÛ©cGBÞ¤ƒîó…ÑîÄYù¼ W±â‰6¯-[¬ úŸ˜ÞàF5 Gƒ€Æâû,þ§$~H¾SîþÖ"Ó7_Ô4â¨ÿ—‡9ß Y¾ dÜÿðèæÿ¥ƒüÛ‡€q¡8£0.<ÆÊ 5ôèǶýÈ@iû:”‘ÁßÔcµÑã¡£ç†ÔWí(¯ðf_(òðQ|c§¿Yµ?±Eø³G1ò^ã†wÜ(š°ñ`$8d|Úwü þ÷ˆ¯œÀ£ d˜q‰F’ýŸ;»dsëËa}™÷ÁKn¡éÈDIÜÐ~bîÞbp¡ôV C¸Ù'à¹v;w¬3ï8€«ê`ÍÁƒÜ1¼%hðÀ6žo?ÑhM„Ø£]Ðà'Õ]ì/ç‚öúƒ¬zͯ|“{#è:¿4ž`1×pò>ÉÅÆÆÊÉ lêo4Âý*ïçO´´@Úg`Z!äÁcï„ õyI8o ÏÝ®ídÌë þæ>%¥¯í#Ôhœ‡ÄËcã6 ö`Äp<ñ2?¿Wüë÷+jýmç ¯¢‡;â#¤ñŸp]ŸÜo`½ÿD†ãðGÇþ”'ûÚÕ†‡Ï £7ÂñuµÿžWûæàøktwO7Š ÿ€«Ã}@oÂÇýå‘Ý·¾8F»íË×`“ÜüîAaøâñ­´«ÕåÞƒ?vDßÚÌö“èFêÒgŽe‡GAÀ¨è§)þÐè‹O‰ » •¿‘jö?7ëúÇÝ«L̼þý,³‰‰×ŸÔ=ï€ÿÿóËÔ&æ_'æ_¿ìÆ×“Ê~ÊCéCޝd”)ý¥Œ²ÿÅ@c"™ìÿS1BZ'‹Ÿ4¼øæ÷ÃÇxø?ÆidJqÅD\ñµn|ž;6Ö1ÅØI²o½èÖÐ'w¬+Ð5î¶?ÜðwˆFõ×Ý PÒÏæçÇ=-ˆ.Ú@íb;´ 1¬íƒ‰¼ðÖK>!Üäø÷"³Úa½ý«éwj-ýî14›È¼ûÿš׉Øì';øbüÿïœ;‰Øl"6û²\)<óéçɾ)ÀÛÁPf0û<šÁA¬pà÷H¬ÕËË 7x¦Õߊr~àÈÛ!7Íeêv4øe#ëáp[?ï2×|z”£4µ²Š04þ ÂØ?a˜¢ øõvvhÀ ¯Zú 2ÚAFˆ/~Îøb”´þ¥N">cŒKŒ¨Ô8†_ÿÑÈbbâä¿Yà?‘2Â2%ßîé6Ë ƒwà‰ª €¤³Õˆ3·ÆHDén¶ùq/¥ÿÉo¶{b1¶oÑ2Ô¸ÿ¡/¶ÿ¿ð‡`ÎÅ y†¾öòðO|šý+Ÿ(û¶•úܠǶÅÚx ŸÏ?¸xîä:Mp¢vpo&zÄîN;¬“Ö ÜB z~€X EtÂ|/„¶‚Ú*¨B]Ð^(ãŒÒpåCÀ@¹<÷kÆÊ¥9”«ëgP€žkæ"æàÁa¼ ž€7´½‡':6䀄kqÎVNNÃùÜåû­À¿u®î%5ˆ¢Š–²†–ªDIAQK,À°@†- Äš8(Žö<”ðxW-(ÔËËK4Ø1å±îöPŒ‹-š0ˆ´ ã xBw›áVtuVNxø²Á’eC¼3ÆÖ´Æ#ÔƒëpåUäUNózñ: ²ÝkKÿ‚m"„&ý[ n\ ¶ŠP[uèX´Ƌꪪ“¸‡\¨*pïUT¸¯IŠŠÊ*ª*jêê ê“•TU'ATÇ™Ï/Àìng’=kGün=À Bã{⿲ÕOÀ5ÿjJü—k´þ«þüÔ¥ þÇ5Zÿ­þêÿÿÇå­ÿj?ÿõ_y‚ÿãqÖ›Ÿ€ÿƒú?Áÿq¹Fë¿úOÀÿAýW™àÿx\£ù¯ñóð_u‚ÿãq¶ÿ¶?ÿíÿ„þË5šÿ蟇ÿú?.×hû¯ùðÐþ«Mð<®Ñúo÷ðPÿ'ø?.×(þk(üüçé¿ÊÿÇåÍÅŸ‡ÿêüësþ¯â¢phÖ…Â;¸£qX'[”†w…ô‡Û¬Æã÷Wø¯¨ ¢Ê忚ª2ðSQy’‚’¢ªšÒ$ˆÂô÷‹ëœÿ°¥ºF:¦»7@6™nÝ1Þ±~‹¾d™j¦¬…êšêò¨È+(BL‡÷‘Y9A¡ Áµrîú5 LTaŒ¬t*ÒêócÉøå^¼p418_èꚉêÉrtÊÅEÔé -³;Ì<™ƒƒU­Õõ0Ä`"¢££á¤ÇòÃ~’öÌ8«Á祇â\*u•0\¨×¤U7åù IAEÉ'›ÆaxиË7©Œˆ–žq‰‡‘“a@“ÒÅÙ'/'ø>ä`N4éÄpA2¢Pe4óÜtø€r"‚>BT'"âÁÏ”W©²ÐÕD¨Ø”%€ø¹£,IRÌ\ ‚¬ÍD¨- ƒ|„!O"ç‰äBž\bï“»ê…@5d8xå˜p_u‹E"ž€¯àIÄ|ž@ä½v R<µCœ““‡\‚}4#‘+P32±Øg3×<œÑ ™=ÁGR¾„'€„rž@.õÚ€,@æJgÈ÷Q»LARIÁV‡J`yÃÙ Â}T«ˆ °¾Ð Y lŒÔÊÉ‚N…äZ³«ÈL9„#ŽáZX¡®^)€á©Ñ 9$Â/½®#€Uæs•[ûÅ ×a=ÑÅÝÒ[ƒ«äŒîã(v¶¯%%•óä<1_̉½¢)Fhz%ŽÝ‹Òà “ñy`‘Ierž”ïµ- $L rᣡ„¦¨X(STê~2Å;µT Bâz6ÏO6@7t§…¼Œ@gs°Ï5$vÜ{ýzñY‡›Iäñ«d¸åÒNÀ¬KF@¦ÄÉMñàowE(·k¢0ÅB&4÷wºØ®Ä¤|g;;U•Á.–g°X …^ïÀùSÞ3Fê2Tx Téað²û$õð5“­AŸdç=9ÜgL ã~C‚ðcàÅt«‘¬ÀQ'¡Àn>Éqã aqìÓ<¹Î'X-@kb¹Íº6œ°L tØ3:´U#{8›ÎbˆÕ÷Eèu?¤íF“kŒ7ŸˆÖ Iéë ´UË·ÄaÞ/a E¡Ù½ãG }KûpvèöÍ(ƒ„šÑdr­åóª‡I›gµ ì:d"$ƒ 0ºŒV¤Õé¨P2«Ž‡/±á)YƒÒ†fa ©ÙØð„ŒŒ„Ô¬ì8t1 f€áSÈxÔ…FÌžT¤2¥ØR yÕ‰ƒÀ÷ ýS§deCé90%+u@f&60-KÀÒ2²R‡NÈŠvFzZæxKbp(Ýy˜ÁI§Ò ¹±êá¥>Ö?3‰t“§_Á–äMÀDƒ±˜öÿ§g,N]§* sHÁ›Ov‚Ðw À°uTmh©¦Bs´ßôE’ƒ~>ìó?aМÿ‚ÏBç¿xØø‹‚ÿÿ@6þAtÿ'äÿ‡Ýÿùÿäaá/†û_²ÿw6þ |ÿG*ã‹d!üù8ãïr.‘ ×[õj-ü³vÖ_ö™P(”:ìÿbdÿÉBöÿ€<÷ŽýßäÄÈ3Çõ?dýoëµ§%ø–'ˆê‡ ÈÀ?¬Z}ŒÍèT&'¿u{öΨ»GÔÆ¬¯ójÔÏ‹Áù*†­GåhÑ£e_Å”)ô™1eܧìúh¤*@8 תБ(uxèŽV^íÐGW¹ ¨½œdõlŠÄe1¸J㻇U’9T»3eªvkçƒÁÁ¤n‚ƒá&o>‘‡LÛ<1_îbݳUX7u&,ŒRŽóHÍ|ÂB?b­@8ÈX#ÍNÈ@ _ˆU9HhÐéT€Ôd¸›ºb ö0*7¶!Õ Eß@Cm÷ŒY‰eö0¼â\íšý2´J ¤B'Œ]kWÅà 9Y»:ÁdR{«N˜7bX/¿掳‘ƒK ¯è÷&c³ÑÌ '”UB§Ãè713§[ótZ5FJ%l -ûükvö·Ž_ݰuÌuëQP‘áìø¾£ö“Ñì"ül¯¦âò$¶‡ж {=œ…ƒ÷›‘L‹Éª†ÜíÞõ3aõ1aÕOh…›²0njàù#hÐùãL M§Ð<Î è¥mµcvA— 4‘«ôtèP»EÙõ6ÃUU &aµƒm²&á³Ð„“š]T˜á†šd`”žºLÎ2¿ŸDšˆjÇF¬…4X"XäDÅX˜aV½ty{X @0HÐc +ª—þ‚Œ i‹1ô' ´•G Aq­êÆè-¦âœ†Rì¼îw£>Êj(ðÀø˜õóŠ£áƒ®éA6Qoȹ‹ø)v#ƒ € (B·9Ä|í²…]F* Ó9ˆ‘ÞÌ =j¯³VÃ;ˆtþ) ÔN–i,‰™–ˆ¬Ò³µ°v–§}„ÝLè°Ðxã…/QšÛ¼¬Þ(ðäižððC 5i(}ZuÒ‰ºnyë)(}ÅØé8F©o%ÌXw­S¡á!ŽJ§3xOG<½=ÉœR»9ŸåæRâ83ròOšH3PJýÉh¥ný1X ¦gãä´ð<¨Ý,ÒI1h¢QV%µÁªÃ :ì#ºâºî}kw•×ÉQÕ¾ y8ÒñéµÚøxºïÃ'"œïzº¨Û¨ÎpjïÕäžý‡Žpüy„Cù‘‡<êxöÃ’MÚºžòxr§¢t ûX|Ëaƒ)* L„«°4Ðò‹ºh1ß)¢¶‚Þ㢠ÂÅÅÕÓõ¾ûTàA2`ŒjêÞê ?(…hî…4ƒ1~ÆÅÓó¯._¶Ï4ŒÆ?Dã >k¿kTc&ë|Ë®qˆÙ×/×±îSÞìLã†áÓvënn bµMÇZžÂÁ>ÂâÌò—q4$ýaývcuÏ',uTÄXkÝ©AN• à=fÕ«7I=)_¤¯³€oíPÕø´CAíL]ì;ÈöM‹Äç1©› É÷㮄M?ŒQ{è„Ôï^n!ÿ¶à’ÑNÁBrÚχ¤Ôõ%•ëÓ;·s³Á'ýäµ~0 -õäÏFÙ!韜óîG‘ cTÙ §¢ÿøI |$z/û·Õ=xb0»V8fƒKÌ GA2@c­Ö›Ú05{ ½s5¦ÅGÀ÷aò¹o­=™Ádí ÙyÎΓ²óøÇÎCrJ3ai¸b …úÅ™Q¤P4* ¼ÐЦ0V¤2cùö‹è#‚ÖéQAcã­°·:­7ÿO¿$¥ó݆˜ðÔ†ÚhôR=xKfDC)0QÙ±àMIú8 e¦rB‹!å=¼6‚Y¨t¤¡TþŸ`4aB)&ÇŠä±&ä øt5GM,¯˜Z“öˆc0YglLLQQQ4Ó`ÊAI©D¸dY£>DÉÓPÒ/ê—(ú¬¡P‹ãP<1xò§%3eÆÇ£?‘ƒ……J²‰²‚*#:+êýó°ó¿Kƒ%ÿ·D"åÄÃÎÿ¬nHü%B±P*¤óóCøâqÆß!Ï ´ÍɱZ´:$Î`Rµ.º¯9*ÞóƒGÌÄ_ ó‹Ág¡üßxÄB¹B-ÑäáR‰F¢Q)2±ˆà+Ôb•X. T Ý¿ÐS¿O׿ÊXã6|­°ìÙü_(H¡õˆ'Oe†~˜¥ÜóûbOáâ\-ò0 V )OÀW`"1Ÿ£KJÀ’Ï(i!Æ[rrò¬P¿½¬H®àIä˜D,æÉí%¥@c0Jê ùö…ˆ' Œ/ä E2ºPÀòpF Wj-ÅŽ. „¨”H$f–]ä c,P«·+“ˆx 7É…B˜ û>Ò?jºþÒWã6¼¯T$”¸¬©$´þñ¼žžšÜ*¢œñ­R%ep8áewöáà—Š²fÓÀº¥ÎPYUÕ®]»U«V=ñ„±¬¬¬´´´oß¾S§N=wî\NNN—.]À‡UUU[ó*sÀ_\KFj&§ßÅ“'rtJRBÖø¥W—=g>/Ý´÷Òƒ:ö^5ºôÛ%=7/î³ÀråÂŽegNÈÚÛIÛçüìKzmûõó¢Óm,éùlá©gnÿzTe¿#9Óo¤||@„íúy'¥¢¢(åÿŽü}äWÝb¬ÙPîºK¶>Ã9W¶†åyŒ3q-礹Iùò^œ?GûïÕíÖòÎÆSѯö)nY²¡ÓM;xgñÓiܽDüùÅûN&—K°óí.­½)[òËÓ·;¹ú¯zÍ› ˜}7ì“W‡wþ[8éóá¶Qo_˜ÅW—r6Ëö·ËÝSÉ™»}ýo;F]m•ÛªèuglÔo‹×w±Åm»´4ž¸Ò¤¢ýjÙ•ó½êÂIÌÐŽ{úû6Åœö'7Lxiñš*ÛÃ#SK£çMlÓ¾ù ™æLQ¹àů§ŒwŽ«>½¤ÝÜm—l7Z–OþÞ\þóçîøpJ¸ô‡Ä‰gÿ+rÝ›_Ÿûé•3Q¹«OØžÛ›šW°lH›O·ž°Í¼ØôóY»ô¹bù£Éº¥+Ò?þï£>ŽJÿj—ú`ÕñîyëÆ\¾ ¬H¸ðÉôg»{¡x¾{ÅŤf#ÆY.ˆ+¶,zñ‹åo~vhcÓuÆ'¹ü×ÞŽKßýGøèݶ™Üu›Þê|ªÕ‰´WæpõÞÕåí¶]sÿ}tá4Ûc]öéצ Vp³9¬%2÷B¯‡[Ø>xeÖµµ÷ùñPqzóñÇ7ž/‰l{C¿Ä4´Éÿ\úiú%¥¦jÖ£ÿi™¢Žúð§G*†…÷µêÅí«?;åðŽìi[VT5ÿˆûø…¶¶²¥wo-ºÍíÖküt¤róóܥϿ5Qô¬ìÛÒ^a§7É}{Oô‘É­äÍmcÿ½~ôE#wüÆ©¥ñCbv¾x¶Å†3¥‘³m~îAòßñ]-ç®/ÝùÃ^eú{GoâEýw™4zEòò׎_æÞŒËŽ:1í©ìÑ“´¥þ½eÖ‡DEÔÕ)-ß;Ã9SùÑØ?·Î}`Òg²Ê ¿_Ý~ûû¥¢mËŽ ñÛ9ɘ/·b¾xoéȰÈηÖ<+ºØ_õÏÖºÆM»¿%e›@r%¬u›Þy¿“èƒë“§-NYÒ±ÓçQé]Ô¤üô¤Y¢éÃZ'¾Ôáý.7W—Øžo×§¥í‘Ê®î·jmÖbÿÑioì:¾°÷+ÞwœÎYic_´óÝ„ÅöÍé½´5þÚG[qü°Ü¸ÛÉïå‰+ÃS‡¼a|æJå5ÙÊfUó ÊË­Çï_ÙAcna{ùx3yÛ—ªžQìçVÜÇ]$K~íÌèÃã¸×Êfîiú…€Û¤]§Ç}è»ï9³¾{'IŸ±­g/׸òÿÙû¸¦²íë„ÐBG”.TjHB:R©Ò’@( @hÒ¢€¨4¥ "H•¢tTšADZ,4)‚("Eÿ èÌ0íÍ›ï{ŒÇþQrïÍ9÷¬³Î>9÷Þ•½ÙÈ" ãpÝþS›ÚñIßÚˆ1I.ù¸'¡#žØª/­$E p%PDøxÈ#·ÇËIã†Ò^’Ï©¾Éó‰äÎr©†Þ[jNä·&_P VŽl êlɇ«äSX#À>ªÑ“3*9º€‡áÈ n8rÈÄ£\ *¢'OtÈ#ðµ0±æàîá†þ—†r¯5›¥ÓhudÅÄÛ€ŠØk’Ÿô¼¼ÿ˜ãËn?%EØìRï Q=!5E>Ô0îÒ…ñVl*gj±é  VxNÝ ´J6ZFõ jwz\¹×82)>¢o8hzÑcȸ%$g„ú¨ñ )oIF*0O÷]©ûDA©¾ Ã#Ä\'T'ä›þÜ3ÜWÅm~ø•ÏLô½°Ðtan7¹¬l—þfãgsyè®{Ìž& ž&Oãbż÷†¤€GÍï˜KFß5‘K®±^Зáæ&‹;ñ”¼N«lH±'å§ç&ëú(. £vŸÝžT¦73O*mÓp?a§V0 ›~Š5 LJŸ³gßH3¢„KôVìÀX`.ä9¼1©›‡0ax=j»¡ÓÌP²=¹“ú¾Ä?ÇP ¬Uß 0³¥åÆ©KÙŒóÊúìý8bßÖûÑ 1—€¯ù©‚[U;„‡Sö¤Ï½JÊõˆ64Á€Ïsb^µÍg¨ E²+x=¹%jhGÙ½R©¾g’™»Y(‘†‡X#ñ(õbœ¹ÜÃ2¯>½Ž(ý#—Q×x0Oùú‰&&ŠW{HnQSºÂñ¤® ã çðSE †s›Óš_Ï‹wf¦«Û‡¤_{¸çµ£ñù&Ns»8µmgŸnSüó2/39Œžï=WöQàãÔP”eíú’tÃSÉ s¶ÊoÇxÕIÓ5ÏÝ)ûJwã-óx}Û§F&a³É-.£>Ùäí²ùÔQ%€ÓC¡*àÃ3¼›¶6ê3Î++î58Me`F”Ê[Æc(ÕrÝÌrrÉ {©Æé ÕLù'üDň¶eýq¥îPã.jYša/³"ˆ¹ ûL†pð‚€¡–3y:ëV7+¥y*jr2ÏÓZ1Õ=•‘ï„Oz2Ál»ã±;¥5Üi‡' ÉÁõHa` c›‰C¹y莺٪u$‘ ýW^—6‘ <"¶[~™NÀ¤yàMõÝ Â•!"Ïu=ó%©ü܃;¸êyf[6sJØ^õÔ  §W/ÖÔ>£T8 ßßÛGÑõ·-wæl×tf,Z(-LÉEiUƒ¬F?E)—ˆÕ )²‘G¨‘ìâȈ¯™$rEäFÅ\ Ë ¶ï8 ”Üuw¾“¢«Áî*ÌÅ~ÐÎsƒvPäÑÃXU›u90’¹^O¤å.²,L[oÄß­öe fèö Ön-@ÌähûeKgSˆìÓ<Ä‘2Ç-½&¦\ÐCᆯ“+ê£3äò8-[®Ù_ødfМ×`iq–V7éµk³'9÷;€&I÷k6§J!©‡U8®ÿ@Œ39Rô^¦wfá캂”óQþ¡1}{¶í,@ÖoÌVsz¼‚MÔÀã#Ç£g!3ÌõÜÄîôñþGDYÃô…Ð6ÅþÇUøY!²‘fjœQî¨ÀÈ K5²¯£HeqúƒXA£’;ì•bBÔS.Í®é9þYåƒÊ;o½l¶F'Ü,ŽWìí:pî)˜‰ÛÊ“—}û3Œý´ +Ïi® J}½¨K—}§tTŒX^³’_µŒ$jë„WU'Ž)òc¯ J)¨ntIcg1™‘e b| ˆdDCÅ!¦'µsèg7;)>tÔ%p Ê(\OÝ]ÿÈü‰¨ZìTbeÉvB=ã¨$†ëĆ?6o.Ú} ¯¸•"·nx¬½qkg¦¨­?Ã,ßg6îë º ¢®GÁ "~¼<÷ïÜá<°Pó p3Ó0ûµŸ¦M,;pÆÄb;~QÜÒýrÕVךX¡Ê]Wr߉PxER›mIâ´^SÉÍ¡@ò®çMÍXI e…2Œ5œT!PÝ”¬õR5‘̶8JIÀ¡Qð!p‹k?™:ÿLxb@ºE_`±1œ]䋇nH¨´Hü ˜ ص˜àœqœ(6Ìöc9ÌúdöðôjŸÌ£åmöï“DžFÇÍšzlÀ÷(ð9»0lõ@…6àv‘aÐþý,ê¾%¶xGÙ 0÷Ѓ×3Á;+`Ý€ìâ¤]b»åÇäõÄíî“O'®¯JQÆÀI ˆcÅq”.vròØ‚þ•¹–†âÜ!˜è˜VW+È$L7æIÕºƒGz¯Êìh3ÜlåEI#^ÖM¿›”'_ s«3U ÌJ?t åzqrÖÄÔ|‘{Öœ]Áê?V“™ å¹î3A¹~è뼸þ"¯ÛT_SËôJò‡7šQNw±Ò@éû¶ÖÍZ¢´%|Õº†€Ô¾Â—æiM¥E)Mo¸1Í´µ(ë©X`¡ä°‘7lø›jP‹æ;æqv?Œ= G‹'”e¹kòÔtµEµ5eS–é¸( N(ßj[!,7 ;>¡É‚¨©±d–›34×úà5’08éø.å–°dkhS楷gÑë÷Sp-³;_¤]2/¸4šåbÙ&ú襟<Æ+Lg#¯Èù»Rh`òÔ^âã7ä©2¾×ÉP;£%,dAïšbrqÅñ.Q¤9ì<¶´F3hþóé±·\>aêãmwgþ0ý~î‡ö¸¦ÏíÀˆOšüæÝO~x§YíšKünúš’mÚ8vsU±‚áÃ-‡G›µ³3ýÏnÕdi‰:—©¬"t¾µÇÞ6Äö«P5GTjS®@ã§{—· òÛè™Ê¸©L¬5q{ç@㥠kJ¼ÿ깤°Nµçj/ Äo¥¾Êî0´ìÆmÛ[3WÁØR•÷±6©¸Ø_kSYX¹SE9¦2çŠ쪚êt ÔJº]1,VÃ{œþxþ°§ÈB]¶Þ$æÀuÚÇý— æå÷*-Y‚ÖO4flíßúin¸#¾¯.>5«Òe˩ǒ3Õ®Óï[çZPà/ÊÈ™B•µ Þf|ÙÈ•,ÞÖiÍ–<.Ö0ŒJ˜:4û¢âÙ>–èzò=àíxï«É=†„¹ÄÐ;,'½($n‘êVà–$ÌbÜ´°£n¥‡Üpì*½±±&YÙY õ¸”ÆÐÏ=8óDr&ùƒë݆›.7wj³e2_{ÌañÖßïsKå[û±õ@‡h¼'ŠÜYt(Tì>ó§ªíº-w¶½Êð÷óãz6ý Ø °óc 'pF@ b·OœÆËÒrú¤ézðÔ@1!èóXš¦&H¯OÿÄj¾zÇ?&Y馇ò1MToÌ6¿¹•©B¦]˵õÌßo¼{4ÞæTþ‹œµæF­Œ©¾íÉÑ&òÉã€Þ6ôl á‰—ììΑ»ÎLj9¹Ý¬¶gZFîze·„>¶ÖtÖ¨À˜Q Oßx¦ö²Ä9J@Ÿ2‚œi¾ ˜¿ÐËÌÝá•×rwðŸ÷ù—Ýgpv'²Í|ÚL|?·î‡=À²¡Ñâøé¢Îé“u€îQ—óiÕg5Ž‹Ôi3««Xٶƹˆ&éÒÐÑ5˜¦X·[sï¨~žÖ¹s_n¿—«Þ£çrúcÖ~ ]3Þp#®Æ6ŽÅ6ß•bjÉ*+6±¨ëP<üX„R*Ðcæq÷ Šo~ßàqë+…­SŸLú˜åvÚÔG{m¬8×$ÌQ#ý¢i»ï9›8+û\8ª¹Ï?|µôÔ3IaƒEÝ’¨›Ër ÚFOYoÔðíí¸)Ì~-²é ‚zG ;du.ؽ¨•Ÿ 7% 6K–_ŸÊ®n(8ÞêY"7ÿÆ<³1±(Š÷)Apd„#åO&º+tð¼TH=?‚ñM8fì«Kí¬9y×Þ ‰)-ï™ÞèFFž‚¸äq'6-ë̪ïÇßÜhpX÷2  ƒ|ætðýAÒY”â»Û¢0è!æ<—ž„ÑÑ×õ¬"cîâÀ8‘§_Ž‘ …©Úœ ÌÖ&v;È XÇ#ºH³=ÔC ÕPå‹@ ´UºÓX#<#¥¾ [ÌŸÛþ¦#¨Ê=f¸ÿj«ÕéZ]¤¶`\`$VÌu›E=À?핚_Ñ$Ø1À5\:|ÝW«ª9%ÖD\²ÏÔÒZ¥Û_þyì¾å9Á¤.éÝ‚Ä{ÏÝ%u˜û“²Î Ÿ_?»Ý§ÅïøÅÇ®d¾ž4oyQë|^TñAm³'pD¤¹D=õ#žì-|Í#H @é-8|´ö½hÀuaÔ)¥©5ÚœwëT@z äÉ›æPé½þ"®îý^šVž9ÇuBÄÓAæ0¡ý»SÂd´Y(¶Ì€Í²y-ü#üœ~š˜ÏΉãÒf¨}÷õ²ÉœWÓ·É>¦¯^ß«½¿Ëƒ½QÁZêÖ’uê¦XÖœkÆGø*{_¨õ®÷î3×Kf²”ãUiM@ÃÚ¢ýE0RÞ7œ2¬-–‹ÖÚDÈDl‰â óÖ‰¾¯SZÚÎáñYY× ÏÊä” ÖÁÑ<ÛÕ«c>µÂj2 ÀÌ]R’jñrÈ &, ר,F_ 6Lfjîç< D¢É,¾Ûµ.&KR†¹kKì¶ \©l}'v‘ûíwJï³2c·Sœ{Ê µÅ aw’Ο§xp½èØD,0PÊ$øåAã´å•†€ºÊ.t´ú ùtO¹fÔ¾sèN*\äÑf=DÒÃÉN#_'ÑñÆ÷Ü>ƒ§$Þ¾Øq¿^œC!gÉù‘ÁJ@­Û“ _»×ÌÜ!{÷æë|Ïñ‘Ïû´õ¢]-µ¹ÕúH¯Y1U1Ï6ƒüXJt FÇd©=KɈµ >Ï0z,m:ºØ†lGl˘ôå( Ù<[ìC–¹æÜ"Tã»Â ÷·S¦¯t†rì*ûsC^HcÔ F¥Ì(ªU¤X‘k K×­ÞJÜ6OÏÉõ+`²}Çå’€"ïSÅìÅ®öÃ0ŽÞºM5÷#1pƒQ¸C0 Š+þTÃ-ò˜óÖ§i´ˆw®+$ñ £';•á©pyõ!¼ém­w˜A02²ÑÜþj>Š\¿Pþö†ì63 åU´xì³!™ndû Ùà£éÄ4Ԭ쓄°C~ðyJ‡ö¢øTG{!ÆðTg¾abz=T·ü㮃Á9‡Ù®GÄ:@ì(×ùòmÄãb¯æ'æ°:ŸúD¸-ãJ™ïÚ^lˆÂ•‘;A2¶gœøvtÏnŠqµÔŽW󳑊nœ®Ý|Æ\¥§ ä’áUÀd2˜|0[zJ#£>bí²ŒVŸ²lr·¡ím` .Ç3Q2ØEˆ#¹ÐÉ%vôÍ´M¿ € …`J½¡9­Ì½Œ93€…¯rˆî: ¦ÔGÈ71R1 üxF"c × oæ R³¯6rÐ=ub¥²1Òɧ0¤£^håŸLÞvþŒ íÙ ÷Á¦‰…Ùü¾ Õ6X%kV¾.ãÄA|pìÄÿ³ÜWNm§¨ß¼`lv+;³7’ƒa`£<¯ý‘Ë¡úŸ(ØR‡›\}ô>ˆ,V²•*™È¼ÛþwW°±ÑG–üf9ªÞ]Џ7`ÄD9 =„Öb¬ÍSQýcíà/é7o|úØ*574Û©ÅE®À_çL<ÝÄÚ0;°ð‘{êø- 0¿oâJâÇw”žÝÄB™-%;È^½;õpߺϤÓó[­›âA˜!¿Ç¦7b¶ÞO¨¤šd ¹þ`XÈÉE>âÄ …[îô>'™ÇQ2³À|VŸRXNÒZ¤ÏÅ€A[3¶Ô´œ‘ i–· ]¸Ý(yDë†õ´Î!¶ ¿7é§\0)å¢Aþ½Çnxbr ÎØÀ"´ÿ×ÏèF´¾pÃFýÆ”îcé3wê›èé`ŽþƒÏSÿÛl¹þõÏë?‘ðEý/¾¦ÿ\ û5ÿ¿Ö,ÿ愃ƒþßW‚þ[úO:ÿ08…XÓ¬„Áax4D+ÃÑŽH–î©HÂíè„‚baÐ5ýç*·ÿÿÿËJÐåÿ0¨Ò¯ýAû·æÿ+`¿§ÿ„+:á”~=~úJ†V’CAP„ñ­mð89ýùàù¹<F×"hÿÐÊÿCRËïÒþ¾ÿÿu%è¿ðØ2ý÷’ÿ+C×ôŸ+b¿Õh¯mõŸÜò—'iÿÄ¿ê?ÿ\ùÙ]…ê,W~2fU~¦îNxnÀslA`úM¶]Q)ZU`hªÏgã…#¿àL­­b‹«­?9ÝÞ1t,&q Ön%ÞztƒÈ‰ÓY)Ó¤‡—?@7Ée9\ËiÏñ¼@ªˆø`¹Ë*¬"âœL®Ö¥$E¬P¶MƒQûºÐŽ¡ÄÓŠˆ>åþˆ‹ ̲cÌHò¬)©~ÃŒ±’êC:VcàÛ[ìð>.Ùv™¶\_^ô¡±árh|iœü©Qü@Ç‘ñèðÇY’’åÁAA¨˜Å]6ÿé ³s‘:%údžv~Žžô?‰{‘`vFøS_sV*À>³³"à4´æÃϬë[5ÎŽ&ö£Ûñ1TMDñ]ir‘3Ñó7®¼…óN)Vˆ•Ÿ1|‡ë!É›‘ÀôSwàrë PÓÓœ±Çñ·a<ür¬Ì óœGlÅ” õÖlCwû®¬Ö5H0Õ_ذ ¬‹p±’ŒwâJ±BʱGŽbF«Ù2À–6ˆOšzþ¥Ü?íæØ-V̧ƒ ÔÖ9ªß0Ô[8cÝD;?˜õa±ñ>÷]VEŒ ¯˜êq^^ø¦cR›å¶î²ò˜–ñ.èw.–øºaWb½çƒb~bÉçƒà‘â¾Ïì,<`«§÷ôÙðïÒòÏô÷óýoäÚýŸ•°åßÿqú^ø§­×ø_ [Î?þûáµÆÿJØòù_å{á_Yyÿ±åþïü½ð„¯ÅÿX[Æ¿ ô{á_±æÿ+bËùWúnøW^óÿ±åüþþ•Öø_ [Î?üûá¶ÆÿJØrþßÿkúŸ±åü+?ü¯Å\[Æ¿2öå SR†Ñ.üè×Ð5ÿ_û5ÿ‹ÑŽ›ÝØÓE~)¸½Ï¢|ãoœƒNð?ÿ‡ÁPðEýRE •`ôøO0å5ýÏŠ˜º¸Þ]3ë½úf»!{ÍuŒwêB$ä-ẊŠzfzK P%ˆ™7ÖÃÇ»KPTÔ7¡‡^ جN­®©îŽ'a!ôÒòx/_7? ]OÞƒ$oH¤g+XÚÒ ‡…[ujŽ®Xoý u,F`ÿZÞ€öúß-þ5J¿Ïo›°Ä®Ï_ªÆ…à‰Ã~ÛŽ§"­ÿ¿Õ`Š'Ðûågb|–¢³Ó˜¦p%Í_͇ˇ"í¸=ˆ=퇮žCŸ€'á!ÚQzz‚¯“çb8ö? 'ïLûQùÝé÷k+µ—ÞD9]‰å»˜²K ж\éÙ¢hC÷ÛŒ­NÔTÿ)åƒ:Éû§lxwzû$óüýVmÆÂh«ƒwqó ·g+ÍÃi éN ‘ñÁ/r-ùåNz²Œm?%&øÿÜ?×»,ÏÁ5œ>v=}=xë*ÀƒIhê{8­8p:’wào%ž¾w DJhîÀ,ÂÃyz ®ø ’·ïJøÖ׌Yn´Ï^ü²„YÿQJ¡?#^"Ô—¶q¡§¥]b–ž-Š>’“i¬ŠQš;}¾A^µ¼*)Ñašâ}½}ÜüVlBýgÀ"$4=­nJ*t”.¿™zÝIr ÿýžI¤twpvZ~Òÿ0‰DoOmA…wZ)‰p:J×¥ùgÄÒa¾zå*Æ©ô §ƒ£§¯i•£EÓÑzV9J¥'ïñ?Á©2­÷/W «,ŠÖ‡ää€÷ö^åP‘ß zú®ö!Œ C%¹¹¯òÑ‹…þnÃVÅ­ Í=´ wýb“Ö·D¼7É ï³üFýNébÂ`i/_O’ÚÒߥëSwlÀbz“Å›©J« S”h½Bïú^i -í÷ç{¸Õ€þ—ß…p\ P•>vÝV@åÅåªAŠü¤Oa5 DýB'O_zÆe§Õ€ý—=m!yÿ÷CÅÑ.R÷ø’ˆKëÀß?¶`R‚ÒCþò&èâGç b^Ù»„8Þý$¬7i…ï…®<³4ç5ûºà_â”´ºÔÐ>\Í=«þ.·Š„¦¥Éõ'jW-PÚ”ú]Ë}ìçæMòÅ~1íAÝÕ{ñ©Ÿ†„]Œ³”U²(üÑXÌI¯ ñvsq%©Ñ/%ŸÿYåãéÙMûÝNô†À%„*\EކÀ JÐEÍÆ2¸$a£¡^‚J×;©**úûû+|yz»(.jN¾¢dSwswøx;þZ¥Dôp‘€` $ ‰¯{è[´æÒøssr"à% 8Oo'¼·†m¾\Ôµ, ‘Ô—PÐv-¥÷ÅW Ó¢°Jó¯ÆUZ®ÿÃ}/ú_$LyMÿ¹¶\ÿü'ùG"àÊJH¥¯ßÿ[ûþÿŠØ¯ùÿ9þ—“›»Ûbȯ¿÷ý›ý¹þú-þç/øG!×ô¿+cP'¨“3¯„w„ÃñXÅ¡ÐJPg,JŠG¨üÓí[³ÿ¬ýeÿÿy߿ٿòe%¥_û?Š>ÿ¯ùÿÞ~/þ§2mÕŽÿõHp  ì~J˜®„BÈ!•!p\Nö­LÑ ®ò‹rÞN¿HúN+ „@Ch%9Zá+a¼2*§„„BhåÅìì-ÿ;m ±˜ÿ‰Tùeþ÷?K4‚#O„FÀy¢ßMV¡½ªQAÒÞ ÿ¯MÿWýÿïä}ÿfîÿ´ÅñÿGÂÖü%ìwò¿·À-‹ñ?ã„;è«>™eùß¿4#· Xtýýo)àút¡ï rw~Á= s'N:ÉÛûlš~¬vžÜmôð®êô4Zü¡ÆÎΤ«¥jòv¹¸æòKmg*]Ù¿4¨Š§$¶bÜAè3kŒØ¡ ›ŸÐ óÌLˆ0´o Ï1jÛ±BEÄ)„@/C‹Á o”SFcß½™‹!%”&[—¿:_¡ò¦V„ 3å(ëˆIg)/Èas¿@öK9|OËR2õ†»ŒÐ1u!?ñŠ@KO È®vå±`‰€ªä ºÞ\É8¨¬WŠ9:*ãG sÎÑÜ‹—úq '¦L‡‹FŒÞAeû慨ÉHm¬/Ìâtâw'kôó¾ûñ–þN´skúž'G•FCäùËŠ:M\ÒÇM“nZ¤š#•¥¸Êòæ|…½»lÖ;‰ïw›:µ×åÁÚ¡v€Û¥…qüäN‘n}!û Ø@r•f{IƵ8…cÀfµû EÀžúõ>> #°ÚÙ7‡d˜Ùqæ¶“ ”O†¾mçÑ9s ;ì9+ ÛÓþš Ûí´Äe¸°5Ë/ìú,){б é–›M°’äÿ‘S^tIV©Ï%%3Š}ð\r¶æ5X‹H%&Ûí:4¶ÙJ‘Ë΂§ìî9DØ£ y W1£å£Êè&›(ÙÖ]Fª?¨)·þ?ö¾êíýEQT !c‹,3f³«ˆY"K‘a ƒ-Z5K®!’È’h±dMa ÙB‹EYSþCîu©{¿÷~_÷Ûíÿ{y^^/3ç|Îsžó<ïçùœÏ|Î9OoJ¿’"[X÷Ë®“¤¸fÒ4‹Û«Š†â}¯%¹¹òÇ o0©ûß§z,+™ƒ©ÝOóÉ—¿{¾´k2X>WWÉ…ÿ¢¨Òx)OÒÎ]SqGŸÄ¸ó ½ BhnF/Ì.x¿”´œ/ë$Å]©épa”×ÏD™ÈëÏ3c¤ôç GûÔ2vLÔ\ñøR•ñFÎÏqÓô—󣯪(sAœµòI'5%Úu„gà e[¡%dH ^ª Ù‡7¾hdL0'J#q"h£ôÒHí]ŒùØÀC†T‰ ‡ÌÆîy{yy¡2”Ê4ÁV7ñì¢UónÂuÛ®Èn„”=ä.ß³gObäxe³AgG%<4þ2ï‚O08F[å~ªîŽ<ì]¹óž…&â£éÓ»^³æïĹ2IaKFX¹Ûï’OÆb¡‡]ÉIDô·wG_ WŠ­ Ëwy'†>‰Pš õÿ%yïn¢NïË3¡2ØsEØ3'gŽ”ŒLEUîyÚĈÖ-ÌÁ‡Åû\µó?‘êîÁ>Á,käh`±?¡0ߊ¨sDîQÙU}+!?V"¯Ar‹Â5ãn0%óF’¹Ð›¦ñÞùw¿ø”™· ¹o}ßÓª@> n¥êõû¶•0iR²}‚Îo î2—å¿òá½.ªƒVª ¥ù }·êýn˜m ;ŽOey‡x™³Ü uÐO¾ãZµGTN„ôàxgédõLš„#=D!? e\Ü™#GA6T¼ýâ.Ùqùy~Óh"ï%žØ;õ^·œç)ƒ/”Žn̯c£ëýRÓÁ"9¿á´ºÊXŸ6àBG§à‚WÅÁÞR«ìªGGvÔ_+7›f4ÞAª’b¬ÿ¼Ôf¸Ëðz,dq¹Í¾³!‰sòËRcÄII^;ÚÈ£æL/½¥¹Kdhñþ3‹Ø^¿ìWÏäëu’® otMJ–"§7ÒŠOªêň£ºÆ;/¿&½ßa o™s F% ªª‰¾$Ãú©ïâÑÒëÌí‘ù"šÌ2"ª¯ ïñðÞ^!¨uT ¤÷I¼ÜË~Ðå ´—Ý%TRºSvi‡AØîf¡ûgx«/Z7‹ W´ÅÈåÙ¶ôÝýôÎ5VÉóZѱ‚rë{»QÜThug…Ëf7[&¨¥ÜC|êK&ϰÝpoËh ÷ 1ë×ö4ìö¹Ù¯HY "¼°w·Ê¹OØeÛ¯ÏÓ=v>¡Àã38Ô3Ò€ / Ñ=ßÜodÉ>æsôM‚|õ”Ü`_áT÷“]SÃdªýô™äá÷¦ŒZ8ðÆqò§Fo"Ô$Çò?œM+©vÑ!œ¯Fs[i^/J<ót ºí¦L:U|ËýÖ’óöOØp,¹ŸïžHg¤Ämaß§ÉÙO9™)æ¬þ0`ÍW–`Þ'R,c7|}*÷ºú³ër*¬bš"èOoÏ2 K‹ (] /MÎ=xÊ.Œï½Ÿ˜ák‰eòRçìÆ„]GKù(¼ñ‰9ùˆ~“s“³¯˜ÁS_ž¾L¨÷ì–¤ ¯¹]êÞ‡2µ¸¡T¦àLWfô¶;BI˜Ðïpê7y‹ ÚÌ]zðËâÕŠP³áù‡Dù£I×êfyŸ«ô…!eË á69%]ÌírüUµ=™XüùýŸSÝ/;÷\§?÷šý0‡ á´(¢2Jﻵ ­‡pß¶?ÞZ£}›E±ÛY2›&CuÞM»³®h_®>)é>Ä[Ѽ3ÐõüÉlÜ(á—BcÞ‰V¥CD%Q¸ªQwî9‚}8wkOR¼ð@Ùø1¿·=]'„°-\V,Ÿ*Êîñ5™Z3“¤öäå$i*¾n¨~Dd4R"šºG>T»ä²)_KçÙþÌ€ Å[þG>´E:|¡•í<À£_¡A+ A úƒr0»ØTw˜Åõ‹RæB7K B,)7QIÜÝ êiˆúw‹3›ª¶ú6Æóè òƒRÇ; §…×Úö]Ü5掘ˑ•ìÈ?Š2ÖÓ¸ØduX{Ç9¬ÎíÚ—lu'çýoСo YÞk<þz(¥ oPg/ÞBPaDf§moGzfÙÝUzoä¢Ýýhì õëZiØkZ¯ÃkàûNõÚ{™“ÎÐâ‡:šëÎቧ•%Ò÷Š‚_&¤YðW6Ÿuã2—µ@_éuT]¸x}$#ê…íÜI{b¸!¦ã’ìãçO®³J@…KŽÙžÄmM2%è¨%Ʊñü¨ B vD§zÍòT‡‘_êEk„Vøî³ˆB«ëk½»xÂÀEóÄŽs%IHÛÜ¥ΉÑM‘ðhžL•)'V˜´NQêâI$_yŸâ{6K‰û}ª8ºÍõÜ!ôm­«U.†v…k?BŒê6¬—K6ÄsA[ÐŒÛ4Þ„l¬« t'V÷¼Ãƒm‚KÇô˜(ØBCˆàAebÎSŸª0>KRy¨JLN§aI5±-õè>Ýæ"ÑeiFà=dé~¥xQ&ã*(Ï‘fÁXÓ9Mê2{nç>`y".Â+®ýþvJA3nW)†Å(eñã Ëü ½XàþÏ`maÒ@(bt>@»ÑãK7ËÈg‰î;}²®ìÔk¹‰]Â…Sc-Ãt%´íPÑ[§{2 Cœ"Ï_Þ¶;ÄÒuñØÃDhË1Š*Ïk›¹ðpbC‡KÃI«òɺ°BŽÙ²_oƒìçãÅ6Ž$ š…œÈŒÃAðÕ©†'båTqØ­´yyª•³2ŸMèFG† ØåQG~#1D´2lˆRP‘fÖ§ˆÇ”x6Y[ˆ>ÜSL›w]£‚šžáÝáˆPG¼«ª4dŽ<"êÝò/.äšÂ øeE00Т?-Ó–C‘bí¶ôõ¿DÏÕ”ï‰eÛv_rCd²¹¹m ÅÏíû1½£6qªRw„ÃüÌÛLk‰-êxÀ§Öjý®Æ‚ãÕ‘â‚Bƒ¾`t7ݳ֫ڟ^ƒlÎ$>º/lñÆyÓpNµ„!éõ'QbÙ°çb1§ÓIÊFü› lÃs|N't¼~)#ooEFÓLÌt`a\ºn‹ë³ýdR²Ióã*‡aÃæ æœAj¨ºÛúÓÕ·Ï7núX&ïNˆ˜±$j°Ä¤¾yBöª/|ôôéˆ “¿Ì„¯Óhisò™ùg]¯5<‹a\šíÑuùP’ÝÌ›Ór…ƒÃï~–d«ð´¹Ÿ\OîVüÈÍO/;šoû%>(==â³!Ĉ}ê¼PZüÅš,ñ 7 I ²} lòܸ®ÂÔoôÿ›aƦã¼56ãuÉ~ó¬ôŽ<µ„1 ™ÅýTX «{ÄæòÁ330™Í[YZw˜…ÄÇsÕøÊÜy…tá$ŠÎœä£-QXn”s[[{!ôòçQ-¡¾$üJ[“û…ø7c["²G{… _W2 ÇðµX¥ùÊÞ˜z•Î?;ªísèõ-wÈû¡°â¾Kò¡_~aÔY5;)üÂëï­÷‚˜N15Á')0&)Âôi¼›’Ï`“=W+Ôñ’Bk‘›ñšã+‰:;ZØ›¬II++ˆX”×Z2êh"ä61ww7þt]'H[Éç8ÂLVx¡_h7¼²­In§á¼ÌgÚþ'Â5iØõˆñM‹#rµó®¡ŸGçÇâ„Ʉ晱Ûcb©“ª‹VZ÷2x±˜RopŒ’Ã+Çnr_<²@é;D"ËÊñ'ÏŒøÄò$7´*èîÛÎHŠ8¬` îo( MnxÿÆZ¿¼¯«À~«›T9\É%çîëÒI*ûü¡9»Cpjüž¨Vµqë@¯Û½²b.¼¯·'Õ§¸‚eÊ)¥#[ ›ÒÆ=:h&"õæ>ŠmÁñ4¬^w7QY³_ƒ•ÒcAƒWµ€ùð^W) J ìºvfèzÊͽWköWöHl¸Q9z¦÷´:ïôáMö±ý!\v5]ˆúÛš_Åæ¿F‘šúL©lIjM®é–H!ŒZ¹½%uÝ,¾‘Cɰ °ôÊðñ9OLÌzõÄËA”9/¤M;6ti“Š!­¢ByæÊüþÅ¡ýmšh³4¸ò(‘çðð[PAL—a·ƒKC åÈã¤:©ˆ'ò²rÎv ß*C‹5jz‚å.AÔX…•)%ÛSt®/ññ»Ýç„t\Œ¼ŸØîšߊêµï¹æ‚uó.Ù<±þþ³ÔÉ•Fÿ9Á ":ßø1·wu¿nÙ^ãSy|0q¬:iLÿVYÕᨩ7,ÚY“ÕéÅ„®ãâ•CNz±Ïª³P‰ìÖ&Ro¼”·ÖO5¨phOùWyám d‚Øå”õ7å™<Å\à “*ïÛçõ©¢wæ½]‘Â&¿fš!܃»SÝTt0ñÜd&XÕžŒ o)AÄÅÌzß¿#}ËÉA™e#ag¸ŠÀIÓÖÆò;¸Ai=ý÷"/4Úã ”!6Z"OÖæ‰LA´O²Sá]Z¼aCA塿î2G‡‡=±LàûÞ¬s ½V´„R] 3w9¥Eƒ7¼Е;#aR‡¹À’\I|­®íxbO¡ú}TÓîKÅ\EM$„$)$”ò&Ñ<"ªS@Úê/£_êà' dKàÌ“@WÉT&j¤ø»б<Û¾X«Ó–~M4C`ÿXlCžý'›Y^ÃÓ¡ÖãL‰©»'úß3\‘ñyCîâÀž|ÔyOÚáDJ”äë­wÅ]gýßWû£›h(.DýÖ]€hƒÙ>T­IG²©µ~[øH apØ¢Ö”ÀAíey+iÎvå™iðAÑEÊ$ƒw þÅGê™ztdÕ²]7<ìÉ$z’rN›2ïÿRÅÒ¥uÞ½ä!ÎxÍ#]ûî“] iq‘½šÖ5[Ü/“ö‚¦EQ×Äç<=û£¯ù~ô?˜¦ÅkGÓuyD+ççúÙ˜®Ïò/F$ß:À> Àä3¢ë’S c[Þ—…ò+"u}ºÉµlMŠÆF‚wìq2ûìãÓsƒÃ@¤7QRO@äÌq„¶6Mžú¸ª¸±õÞg]ñ…ù&o%¨:õÖ˜F*Š(²™ Ãu‚uì'HÂ5tĬ©Äæz=T Ihñ;SC?á…¤‰°©a¿§wc>ýuúuGZ ßãó|~Bû¸±XÂ&lWf󽑷È0Ï÷Ô;h(´Œ¦¹´Á»Ìá‡ü»6Ó¢ù7·S¿,l¬ò|áï¸ûŒÑâo§ÿ²…¬^ÿcõó¬ÿY_ÿñChõûŸ5ÿïzþ—VûÿO”ÿeýü÷B«ýÿ'Êÿ´nÿB«ýÿçÉÿ³žÿãÇÐjÿÿyòÿÀ×íÿChµÿÿDùÖó?üZeø¿{þ÷úþO«íÿíÿYþû!´Úþ?Ñï?ëóÿB«íÿï>ÿÃ¥ p òÕþë÷ÿBkí¿´W×Joi­ûâY¥‹Ë¿—73³u±p²ûo6‚-ø/ìÿZ±¿®¯ÿþ„I#¤6 4\ †Á Ò– (Z*cµ²‚X¢-þmùÖéKßÿÿþF°ÿèÿøZÿG@`ëþÿ#èö@« ŒÃZ/o{“`ˆ´DJúÿ×MOëôýmÿÿ/6‚ýÿ‡àˆoü1ÿçºÿÿïéÛý_4Ñ44´ÚKû¿ôÎ…ÌЬìÿâätª®®ÎÈÈ044433SRRª¨¨àååMNN~þü¹ŸŸÍÒþ¯.î'$šÕû¿K—÷]ivé>Î^û‰B;.4Á”§áuÈ¢ÿ. s¼ÖQøŽÆÃãF²šä;Pçwßw:V_·gЬy Ôß°9eBO:ü–7ºˆ®+ Û5{Ï'º¹ÙÁ“½£‰£EãÒ`g#9EÜ¢k¦¸¼TewëҚ;h½'Q¬´%¦m›ªÂÌ»^¤F\±|†l­m™Un.“׌%ÒEé%ö‰ Ä÷"éÒ²ç… ¢}\;nüÂoEžmá'÷:OµG ×íïL' ¼cõ ß…‚åËïßɘÑ·)zsýñ:F”FíôypdU¿„íí³ÛâwaIÅI`LíÖœ×&ÇÌ lin‰ÒŒým‰šÎ^&qíΖ`šœ]‰@æÃ¤øs9š€©\MïŒIz¤\XØå¨‘à˵Ò=¥È FjnŸnw˜D¢FÆãÞEÎ(ß›ir9,ÀN)‡mrÌEñêoo‘´Ú;ö|pT¨® ÝMPPMØ·6/æóVfl›ŸdxšG-±\@Ýk&FV ¥ny?a×½tû#‚‚<ïˆjFu˜ë‚&ÆcìF»‹<ÞÛë’Iý‘6>9.æö ÈiMu«=#½6i&È˹_8ü‰æÃN|˜Ž~œ0øÆËw æät¦±·ž;ôª‘÷‹Q©Ü ‹J/W䔳cö6«¿¼£Þ*Ó϶¹ù1< Åί¬h™<(ìUᨅܫÜkî( Õ¦"Eà;ry\OÑrt'µ³T¡N¸¹2p§ðùyÈÃp g¢| ŠÜ¾¨hŸÃOx¥¾6Ù‰h‹ëSUõI4‹9ÉõAºiÐíRÊ™êgHëL²T˜{È{“¹×ÖI¼;·š:ˆ‹Øº½+êIÁX½÷8—¬Ž‰*ëÅt§üÝ€ž*mñß|/#ôóžp¦a.nM%ãT:M%µÔ*íFë±în»¹..6»9.6-®mÙŸÃÓ“stΦ'§ê¼œS±J}gk¯wm‘ÅL‚ô³C8Ó"£!ú+gÄ—ù\G­ðœRPÖtžZØYÖž©–!*Ù3AjŒmE‰’ © SCîk± ë;D?++òp޶‰é¡Œ·£êQØ :[¯=ü‰ùdáA£¢¦-@”÷íàŽ„ü(ŽG¨ÌƒØ ËÄévã×Ô&¯ÒšRDßK–[ L d²ÍšJ‘öÝPa应æ&¤à%e 8ÛÓcšf8&Ê–¥MðÄyâ‚ 4òM6ºíohäGyõRKž¡"ÇŒ2°‡‹ežÀRúÂb®÷$îÃgî©e:¬íEŸÙDš‚#jü¦7X#}°XÉèæ¦aµÞKAz4sÆŒìâówÃö§U¡¬ßß,’RTZšEÝ Ð»P¡l‘à¦NúâÓ¯Þ†9ÉÇæl •d;AÂQ,·dÙEŸ ùðõãf¿ -Ì—_"ðÔfÄà%™3M'øØÔ,{ËžkØuï¦Á'®+õ3eu¶Žšï5FÖDµi}ˆ-:$¡×W$–é%3:jï…|ŽÙ– 1WåeD?Ž|°…~0õáu R›,À¸qð ê¹£Sšß d€+Á(2JJWµˆømÒ¨þ;Ÿæ¨õ·#û1ªäñh7绣È6ðœí‹<¦“wŽyœš“ Æ›åç² Ä–æ¸ë²úbÏCÅÞK¼˜Ù%±-ÑßådÓ¶”,–FŽœúþWãy<Èæ"IL‘ÜÌ\tSÈÇL5ñIUÖ¹âöfcîâÏO ݯ£K㚯D)d«™á‹mO©r‹&^˜dè!Ò#»eµtôÛêâžn¨¹yî„ÞÃ6×hŠôÓÙGîàV- U¶" ûCºšvšCÒάµ"Óqé± ÿWîJkž ¾4œ³½½v^[h˜'úÑ6#*JŠ\95ô-#Í/(@?ñ–<›ŸÄú®øÉ‘ ¶ëÚ–¹b å{sñˆæMÁíi¼¤Db^ýj£e†ù¶A'‰ŸýÅÖ,<Ã"õTápf±üÔõ…’7‘ ³ç“JEâ„⛘ÜGà7; Ùƒ{ɲZ—cjëgt§"Ýr Â}¥ µŸcÞÞHÝ`|LµÄC÷—&ˆnä.ËLtÝb'…vŸ*“2Ï´-'¹ë^LO^KQ¤Ãl‹DÜ–núìè•~®[[añ Ôô±slísôbLQP‚üÎÀ¹›Ý a|f¯óF$ÓnŸ©‹Þ7ÙX’}Ö1³þ>š¡.Ý1f¦1ŸÆúÆ\½¼ðÍûA{eM†„­“~ØZámÝ Þu¹˜Ñ‹…ܧŒb3¹½÷rkÝc†Õ(Ñï~vt!Œ %¬{ûµ Ñb‰uPöpSyRt!>ƒ®'(ß¡bŒ8%[9ÜŒ‰òéwŽbß§³Ð{t3äv¡/^-Õ²½-ǵ”;­±‡×£¯8[ÇÙ#cã}i?¦Mr0Qd»HUk†LcÇíõ˜%3KΞ g’ÿÌËvf*òºr~²»Y•z ô XÞ»áyÂ^owÖ¼s,ä¦WËÛ-7tö³’²v¾íÈÜîûêQŸ¬×ȶ`'Œámä) âm {:ãÔvŸæÆ© W>šÈq{½ž 6Æ~ën®šdºÑó\l_q½‰”8Îâ.udÆšÜÇW[çÓUvÃÔ)Áb®‚iFwè s–:WÚ–wDÃ̼ý3ÕÝïl¦3ï|Œ áé„BžNAÜ'o™pq8÷h2XEçì|–*0?’t‡[Œ‰5ŸUK>»KÇ=†X‰vóô=M…*Ku+Ca¬|;/çFóÜpÕ³˜·œ ɦ‡&'¦ÕXÛU˜ vFß5S•$p?B6÷íeiq$¦é}2ñm¿:º+#ëc_Ÿ+ߤ±²Ù®²Øèíõ<øQæø{÷uÕ‘U¥øìÓ3CÌÜO„¥•ÆÅ¬ÆdfÜétÉcHd«ÔGo!!c ]Jè )-€åÆÔ9Ê»‡·Œ#Š\åã bªZçùO?Ø<ÔÚU–ÞÌp$häK; 5ƒñ, Ëe×`ÊÍ Ä¸ÛêâÛÏ褜C½ÔTÙ?7hGVO¾¬>Ú%8Ûù9Š…ú…žI9Œ ÏqìÞMv¥«%0 ?‡Å¾$¥ÕìN—eÓ`º|sÀ©t'òX<~ÿºÀŒ@¡Û¥ÃúRäêHòP{º”Y9æË6ƒs:LÈÄùÅ™àÿ‰%¯ëô;Zýü÷­ÿYÿýÿ‡ÐjûÿDë?¤Öíÿ#h•ý?Ñúõ÷ÿ?„VÛÿ'Zÿ±þþÿ‡Ðjûÿ<ë?Ö×ÿþZmÿuýÕæp8 ^_ÿñi­ýWÎÿC»ýîÔGq<ÎÍÅÊféàßîãÏßÿHQ}²d…@A‹ï`àõ÷¿?„äùT´•õN= @êijŽêÒ@)€â’’†eII=•¯P  çbÅc\18¬…ƒ¤äa­Å“í—N›—·³±°V”w´qµ,ž‡/nãì†qW*ã°®6XWq=O'àb~´Åo ÀÅS>—P'·˜Üo㪀ÁãÄ¥¥a2âàEž®WÅUïË‘¹Ì%\.ÂRÂpl •UŒƒ¼ä×VLò¬ýê4˧í[áñ@€‹ƒp)5ÞÎÆÆp¥Ê¶,ÒâK'è/fù<}>qqÀJ¶KO€ÊWvËGñ‹‹S¯±Æ¸ÿšÁyéààï²",—¬Éу]N Iýø5§ÀQ Û¥dÀŸ·¶ÃP¥q±²ó\f¡¼xéWÈ_«þ# ,çº8®oi`ð®‰ÇR»åö‹†ø»ÍݰV‹ˆÂ+‚¦£%Õéþ[œ¥…÷rüNTýÿÊAׯaQ/+†ÁÍMAµô"èÁŠß#8`ÅßòB,c.i-móGau¹35À•úgg †c7GªX,ª€CS 1xÀ¢Š%–úÿÐÐ.¶‹—R¡æäbóR ÀRB ÃR¼ýš?bé#€iU”ÔouRRy¼“öWnTÆN.8+<çTäÇ ©JCÌÌ´šCiš©êk¢ÌTê4Cš™ÉK.6U\òÂògÌ—[ÿY÷Ô¾1X›¿×=t¥{è_è~MkØJkØZ­ÁWêà«9ÛÛxzà\¬ŠÔ˜bã‚]f½ú¼« k뀡^`AEPøëeÞkúA¬ôƒøsë`­ܬmÀcH'Œ„ðûc’^á' ð]S)³R)³fÀÐouÐÚºxAÀBº*ºh=È 2!ŠÌ¿žß´³ÓɬIXó'GXsyjᢳ[(~_ÃÈCþòü6Xk úûKø@€~>KøøwXydB€82¤—ñ_b±2SCH­EÄ?:U_ʳºÄu-"¾?)ü{ýì]y<”ÛWÒ2´\M e™´¡2óÎ>Ö"-7]„äÚšŒPŒ±‹¤b¨Tr»J›ì En‘„š•DY áÊ-²SÈþ{g¨·™áæÞ[ó›?<Ÿó¾ó¾ç<çyÎóœïyæ9sÀ1ÒÆŸ,ÏØ€0&/8cct™>D pJ$ðº È+y¼¢•£Ãp …B:X»Ú:R]Øç°nÐÛˆü,uÙK„|q_Å6ˆäqãå1%ïîhGýî¨ô kÝèÃrÿÛZÿÍɺÈeº l©0ÖÊ—5”GºÅ¥R„"Ih¤÷§;#qI¿ qû Òx€?Žš6ª5)´ÝЪžDþ.«úñµ7ÚG£­åÉàȬ5ò¿Y²“!’Y‹cÈ(‡±ßW«ìÏp•KAdæ‘q_j0´ötÕdŸ¶öeþÕ*ÝÞÑŠ»È®É>X½5lÀ]d¤dG #îªh¬%>²d2™g…@±n°ˆüÖÂþÙ»ámokœ)Ÿ¿S¾Xfïª2¦Õ.³qUž—,A¯EwQáb1‚áf }†ý&“ß-̤Nk_îÈs-yÇôu§Sàî"êÉnÐxèüß þ±#.šUAø¦¨Æc»£F[>›/wä@¡ö‰cwáŸDZÆÇähA–±¹$A\’¸”Œ¦'v`¬pýÃÈ émÜ<üà˜ŠÛ ±")<€¼ Œ%ÎÆ×m,—m¤~…Ê>Ët\–ËÝÈ;ÜÞ Š׸áóÀ>q}Ÿv¾D‚~dˆ¬äá€1=Üø±€ú×¢uq¶âñÚäQ·êIßMõ„aÕ“xTMñß§•/AžéFudHdÁÐ=$[WgÍc¾`Q°ÈÕÌxBÁããŽÄÖ<ãyŒ÷}ƒë|]¨PvX ýóHØÞ†×@i`‘{@þ Ã_Æ‚)k¨ÔaïÅùm¿à±ÕçK^‘A>Cà¯X¶X†=œÀ‰ǘ1Áñ †-–‘ñ. Ò@9†Ä»8‚ÒmÀ"ð¾„}3ø@é9`qØçj;;;: `¿úžé+‡óuø€\ m@ÉA`ñ{sÆûFGAc3¡`,æ{3ÇMF›¦Ù¬6WCyD`ñ»k”ðõ¬9*‹<3ÉØœBÓ Ç;Ì¡t$°8þô½ŽSDÁºPÊX䎺PÒÀ4`!߃å`!ǃåÊóp#ÁqCDdʸ¿Ïó3µ ÀA‡ORLÞI½UµuFºØyU±8¡P©ÎàÃHv:·šÅÞΆ¦Œt¶³±uU?vq ØÛ«C¹ÛŽ4äfðo Ý NáNKPÆ‘4€fÃÀ‘pŽÜ±g8ù—Åýð `e¶+£PJŸSÊmPìLâýÃTílXk.îÜs:ÍFI±wU“¹ÃºÙU“s°£RíÁ¶ ÖÎjr#âI/…Àîxk¸³,yŒd¦³SèÕÿÛ°qîÿ ýßûùBœú ýߨ ýóƒ8ôO ýßûùBœúœýßûùCœú ýßûùBœúœóÿ&ðˆSÿ„ÿ'ð_ˆSÿ„ÿqúçqžÿ'8øÿñ‡8õ/@øÿñ…8õ/@øÿñ…8õ/@øÿñ…8õ/@øÿñ…8õ/@øâüW¾‡þ)hÑ?0ÿç qêýc&Ö|!Nýcþ¯¿ÿ‰Ãâ1hÏÖ?zÿñ…¸õϓ۴†Fs£YÙ±Š––VŽööÿü X–‚ÇqþëˆþÁû,?qþ+_h'ž„ÝIEï°¢PI+k‚µÀ ÞO¶¢Rqÿoþ&èÇÒ°ÿqû-ûÀ¹Ãÿc°„ ûçvþ«ŠŠ%ðŽ„-¬Ÿ=>–„˜•84éó+£ï¢F$ÂJ€€ÄáX£'Ž‹<ú÷ö?þƒ`ÿÞþ±,ÍcÿDì„ýóƒxÏĶœÎ:ÿÕ'rÕ=ðaäüWÆŠ?Â0ùººº’’t"‘?$$”žž>|luuuNNÎÅ‹eee¿œ{™¸ØXˆó,X¤ÐÈY°>‡6]ºú—šZ÷1C*ëš$2W.¥+ÞÒ5šÿö©«âmÿ%ƒ‹%ŽÕjÄ:îo‡ëP>l‡›fðJ5Œùî.œ0;.eÏ6ØPºÅï×u…éðS·ƒ нmÜö+ØËp<ÚNd4N¶ p  YÔ5§ß;ëùkª~NÔZAŸY‡Bfs^mÒåqÝuaΦ7vêX—O¹I¼ÏØ(Uibçqƒt]ZIïU§ÜÆÈÔRë¾kV˼0ý¤°‡}ðÁöÛÉÂkjÐÁOš*o¹GY¢Q©+»m1¶_"ÖˆKÎK0ø=ɯŸpù€{Ÿ2-úêÞ®”ã.=:yÚA7,~Þ‚¡ì’ÄæœÉbŒ"1¸{ÅÍ2M¨‡FƒÂ½v…p%Sƒô…ª°H§ÂþîŠ?N¯yv #—"ܦ:«öö,ÚÕÌ‘wSë,cßZËŠç¥Î ’2pó£©ñXI¨\½°6¶‡ø¬aý‡å+3Û×9¬n(鲜tD3¥#b%êݵÓC¥N®Qð_|ªíz#ܼç¹\(4¯ ú$WøŠÈÃÒÃ.Íž"B¸’©îi½>.Ž^(ü¾Þ+â=ƒ™DK[>®S£ö§¼ÔVÄ‘;53f5÷þtþHÓÉô“X!éÈÒpQFtU>ã4­óç¾Ô8©óÅñÊÝ33yL–bÜ™’¤0­ó}IÖ“‚òǘͿf<™r„`ðqaÙ@ÃÖfóî• ¨Ê†Ð®=-º–y> ZŽÝi™AžSÜw8]`¾Y­w³³ïClȃÈtïêJíÛ*“s“?°ô–•Ó9\H ¸ãðVÌòw›rsز3¬ÅëšÕ=J^EUfeîý­[MÂW'1Û*Ò×®z}zXãø4 ýýÕô÷”³§,ž`ò‚sÈgŸˆˆº_Þè–xí\'švê~ðksü½ÄnçÖ«û³…*wµlËÊìVßù˜~Å»†„‚ª£ôcgÍÝKµV­ ih­hõî™–½‡|+ÈıûLfbxÒ>±ªÊ>™«Ü³k=#e²b¢õÄò¤öï Ò #Ú̵þ°Æ34ß²Ù.D¯=oØê‡umjžµ°ŠÝQ[}r{+ýºõ»­ÎÞΠ7øÝÈO—÷Ïy/²SŽ|Š »a£ü¬¨4+ êØºÒ Ÿw-åJ‹™¾ëO½|>õeBë¶ïBÑ’&…×½”nsXÉÓ¨R¿Zå_aWl”ïY„»ö¸®¿^Õ‚õxùŒ±KÊ­µEßö¦g¶Ý±:Í>uš|£b‰L~@uÔœ­NZñ·S÷8ezÆ]hIÓ°n U”“ÉÈt×V<Ó]]­gÞzȨ5¡ªÒWÖG#î²ñŠ÷uÞô ý:X¬ Æè|LŸtïŒL™â¾Äϧ½?)Àrf€Žfäû}1è\„|¿›­Ê…óÊÏ›»\Žð¦,ˆ‡Óú¥íOø)èÔú34Lš$$­šìN³žÂ¼¼òÕÕéL¦’5èïÚ¡Ì\J«Ø/iãž$âvpƒ”!«¥°´èŠ…Ãмóú¤g;ô+Ÿ!ÖøÓ€»ÞFÊz¶²&sæQo±Œíà\˜M(SA6NN0ÛÞ˜ˆ½/y˜”Š[ñÈ•m+6YôƃÔ¬Ž‘Çݽÿ€ë×ïbaÖmá^®k#ψæ:4/QEˆÿy”¹§0ñŒ̾:En¦œèÁ”ƒ:é^7ŒÛ•’/2/Í®Ž¡·æž­ßóþÊ boùÚ£ûÎÝÙBJxðö¬†[n„üÑm”èÚ>ýžë™[ÛK,ä£2*Öœó/ÝÛWÁâµ4J׬8»[è]Uk _°D¾øù‡ãLäºëÛ#7GK•^ª™/£oU·Šátt_¦§Êõè*§{Òª e¯ªN¦ùÑ}‰àÍ×Àºu‹¦æçÖÛ<½¡X_òî…Èœ¦röž¬¾'GH HyEVÎp»‘á*)îíTÜV¿59Mx°ÃJcNôE-ÔѓǦ™þ–g!…W–ø´‘#°âEJÍs¶øÿ*½¢Xoèmþ[ž¹áËsUL¿Àì“ð£(DoBDû­_MBÒ‚i)ðì”'Áø’ëþ ¦×æÂÏ=Hô¢X8µ‡XÔ'ØÍЮùEÏ~¾e3CîmîºØ0ææâ @‚;™†øUq'ÌöŽlû¨—"†Ñ·mp˜Ê°ñZäSúë|XV¯©Æšš3†ÊÊP:µW-äEg6Jè|ŠÝ¶øp“ÍéëQ£¿N(e”Ï^[²sÃù›tP“Dj-.ÓQþ맺 MÈ¿MG½f<ó,½ÓE7:bá¨Âí¢Ÿòã83´µúócj%ž&Ô1§¼™Úp¼ž· ¥X"akŒÉH]KÔ#tî{¦©a†¾eª'âÚiÎó3YĘÖàÛO¿)©7iÈœxJL÷£¦´yŽäʾEÅŸûÒ0&›/ŸËIÍ¿²»Vv #½rfoód¿f2a–Ô£·n pÔ·=¥vÀõEàÑ;ŒÇ“R’ ·o&edõî!ÐtÚöì’jXu˜èO=Œ”w©öùÀ-ðòyvñ.Ó«Ü­ŸX‘£WÑ€šçÙ Bç¼"vùù#—’1¦Ä„'A·ìo!²ÃãœLQ¯/$l’ 5{:5Á·,¿ms©h‘g " î÷³ ¡k–"[Õ+¢âD%ûûz™.?Ïd€·]ü#®v¼‘#Ì'kN¹|j¨YR©÷4À®yWžP_¨ÙG3Û„ÛÅkkŒ¯ß«ðª<¿¥§ðò¡w˜,¹# /ûÍͦYåƒËÕ£¤³¯Ý}gìüøSü3a»(= Cg­šX|v”ô»Ô”yÏ-Néëì ³¼©b\»¢¼&Y~Þaö‡û‚˜¢sëví]­Ò?Ÿ1µÎÍY=Nº*–ž£cR¥´%üóO³cɶéÌ ^gzÄàSÁ‡µUžÆ"Ä—H¥Z†=5¼yIbÅÏ[þ$UWûdx±ýˆG§æ«9ú™ž‰ÊSÞ ÊÔ—€œÎÚžÕ#syF>½e»9|P¨¥‘± WtÇz,î„8øF„^ÓÔ-çŒiÝ+º™ˆ`®N8¾ª˜Oø jɆ 3½jhÚ oD;{ÉÑH|µfÑö2²™nŠŠq¹}×ΰØà…è<0ìv=2Ä·Á/¨°"°ÜrÓaØ%¿9},Þ«&œùÒõ^&\)þ2]kù©´àï(ĺiw.åŸmÎó½ao‹™‘©Z÷P8_‡ Œ—½_˜&Þ¹u4˜ò¢#2élUë‚÷ôõÊ¡Ñôm©’5Âêäæ4U™zF{ˆÿ¯ê¿ÃËôlÄ™wwQáå2±Á„PJÀ‡(fųpF®²dÆIYú.|ÇŒ¶Õ(ÿÜ*³KoµÌ3÷¦d¦‹®„§Ÿër3ç\·ÞZóZ1ÆôØLeI“PänÕ+é¶6µÈ^P´[©²ýxæŠÀj#EWLæð5»ô6©Í;»–ÄũԴnù$}{ué&WP? O½-2{˜ ßYÙ¹= }L.#%>{“ó¥—Q¾¸sÀ²BÓPÙ|ã"F'§¤&ÿf²ö:bî‰Þ¥&sOiïÃYʨ42ìÌ¢ôbŽÜ|d®Ð郮ö-üòÒ3aÔ³ ›a­ƒDì ¯·ë]J\)`+O³ ¥6¾ü.ñ=Ó‹²€¨ SÀP¼6çVü*Ÿ•©õDRŒ¼Î• ›w,Úp8­ß6û¬R"Î)uT"² ô¸ÀS-ÂüC¦9’nü$½ýXKN¢aŠÅ†Ù “ødËFµòª§g.,Ù / ÒPgÊ’ØW¾qˆð¼€U£é/O^§Õ?HðrB.<àv¯@ß–øêÔ“ £×?Rµ:—ž˜iZ:3ggŽIrÕ²$[î-K±®l3…wõ5ÍR›Ô›Ù+þˆUˆèšT~+éS¦·""ÛþU*Í3Dó­ÁÒ¡ ³JEÞøî€—PÖ3çv7É0v)‰QµV õ¦RònÕÁ‚wË|¬Du¾{¢ã¼®\&ÑeÖÂçŒå-ej°PšÄ£€†üÉìVÛýàŒ']ë}s–‡TÞÚþpŽ™ç»ð¬ëwãž©:l#ªÆvM3JŸÜ4³30ù'¦³&oôH~-¢ëŠ0-êmîîÅ÷È• ôÞ6i5žñîšÅx÷´èì½w\“˶0 ¢AC(j€ HQ‘ÐCïRD¤+H]©Ò›ôБ^¤÷¦4é -HéÅ(½Wéø%€ûì}ʽç¾ß÷î{~¿oÏ!ÏÌš5kVŸá™‰½]³ МJÝïAE¾GY·"åe`”h'R=Í>E‰p3¨ pìw'ô^¾Pc (K®6.R01lF÷ëǧ>$æ¨yQÉôŽ2àh¦j{iºåBPRË ’å®Ãû¥“Ñ“mt¤ÿ ”ƒn'1Í@\šF¶†;ÞÝbÔõþ&&üNc¸Ø²%faì¤4tœ­™KuVäbu_—-FàÆ¯ò«Hyç=‚–íÛI ›Ñ({g“ÙϨÑK V^¯×D=×פ¬ô€4e¯–mÒœhyJB|W®ò)çé®L3Uby‰Í\Iøj¦êi:à/vs4)p™D”•bÐàóp¯&-Á³´>I#ù$>ÈɲˆHò”7ªMô¶ûJaÚø?Ë\¶d~×ð%#týMÕ0ž¹÷gür³y[ñPOäÀö+½ÑÓ‘E;1èʼnÞDl};4¾àlù°ó¾èeг XŽv® aw7w’µ£·52ÃH~NN¢¾¾ä‹^õÕÀåêæ(ãÌùgŠûð+¢¾£%ÄYí¬P&`Ì‚ÍTàiÙ)¥¯D5«ÓËòZ e¦š†š Ì«w?æ’Ö,fjךòœ°×ßG=®ë}#7êÖª„‚U1¶&÷fÖ­­G_GÚùº²¨Þ«ë-’ãçL±vŒF*Ó-ö5 ]ÓtÎÀÆrƒdì5škæÅåhšùˆê;Xe Qߦ ?‹™›t²Ó’Œ]jêËV&`ã#Nޤ½.nhV9BO?nôІŧž%£sg–Û¡“ÞO•>8‘)rŒ¼JÖ¿5Ým·¯Éò„¡¯*YÂûtŒ‚§¹„Ùé·uÏ3ˆ^'rdšï©žmV” ë@»ÏA§—ç âisŽí7gÅ"e¡ßªaè!¸cîO²(¹£]ý—, 0µpçv4….Z÷bŠon<”°i÷³´,6´­~§\•MoƼ¿¾#ÔçÊBªÄJ‘(s™ç+¢0û¶:>¢€–ª¾¡;©{FÌ¢xDí <¬vÔ(,¦yµÀ9AØP 2¯öå¸j?¦FdÚ½G‚Hf\ª}[œ°"Ñìí?è4ª0­¿ŸÆ»€x÷ˆ5 gOmδ+Õæ}ûã)SDs)2‰ö|<£A¼ÛÀRg5i`qÝ J‰²@‡÷ºÞ’ú‚gwŠ-öþØŸ†Õ7QèLð—[zê«Ö˜ØE?'!& àû<ÒÑ$…¹'¯/_.P%ÜrVÛ…¾ïALÜFºž­ É÷ò~UxiGïæ‘ß­¿™û7xÐΘꖜŒWwZ‡N·•YËòSmÞȺ}寠Fûà„ÓUUx<%&üª²n?øüƒ±ï=% :迯iŠjÖCÇs‡]éÒS˜Mn9 tàw“ÊÓ­+ÄÄj 0p¯Å3-ûËJñŠè´T‰v\k‹6ïDz”®ÍffSÄYð¾"fEÖÊÈ£CÍŸä5ên`Lz1®ÛHRŘ¾€è EˆFD0óíâ’¼¦Â̈tGŒNy~™tîyø¾"Ú«´y{”Yo©¡¡ýŠÐÙ§1sb ‰HÉü¨[ô˺_HªÐèÐy?Aˆ ý}‹bæ ·®ÌÍŒÉA<ý2¥,°TZà뀡[‹æu þ뚯žäG¥C)vöÈ*û÷-—·6ƒÕó”dZRœÓÜ6 Ò™4ÐÌ@ªÄF5E ý1 â[€6ô›'§N{¢ªg»Y!6J&D‚ÍUƒüYdT&ºÜ¡ÒlâH£šÄ»?€‡Æàì<^É€Ô3s¯$JG+I¸¥±ìeBËÂc7o´„Å#фܺ°iwEI<Þ§JéæõŸÚURäe^€‘âjÎc&ÿ¨ÁÃ0ÆÿHì±×À±’Œõá§Ù0| Öm™0gpǪt„ñL ôØ‹3U!Iý¡4¬ðŠÆ irŸ¡a±ÿÊ3°¸R]qE3¹g M–ö°Ò+x²Òµ–0Ö2ú6X?7BO:•T½,JÍâ:ØPƒ¯eêšN*'PP|©DÁ5DlCáž(Oåcà A€üA êýTR€:üº^Z•8ÊÈeèýV£Üá²ÎFþåm± kÐgp¾¼)Éågï¿?V |Ä<¹µ-¦<ñ@ùöCÁüÛßÛuº•³7‹UXÍ më€ú·%_äù«¾ñõ¶/Ke3= )Ж{…²> ÿ¼ÒÙW™­P­ælž£W7µ™¯–'ý½F»jÑŽ;8£ŸéL–\ð0Æí#8ÛsQ8™Ë\r]ÑÄ% M¬pcY>Pä#vÎhî%»ùg ªJ‰‹Š[M™G8ßgÈ4e%½’ ALj¿:9@XN¾4Às÷$à-¹Y½än *:þERdÑ›= 8ºþ”ÞÇSE}ޏ˜GZz&éòtF”¿·˜¹ÝÓýÖ·]óõož÷ ÛÜ• f1`–0j¾ˆKõ×Pý2÷.‚ð1Ó˜HlïóÈOH>ⶃN%$‚æ ûÁ4 ¦oµÎi£‡8@šÑ/9Å´|ëò®ª¬>Úi—,Uh±ÊfœÁLg¯FÛÑǼɾ…6b§bíaÁ{oIóx?ëDÔ|ç†hðÛÓ¢¢{ÿ8ÿMˆXé:­ß?Q˜oÇ<ÖÕ‹Ê[k¬Àú¤Ó>í½Ó¾<å!f¥Ñm0)‹y.VJÓ¼•J4þdi¸0|£ÎßRÛqµ†ZϳMvª4/`aÀë28uÅÑh”/ça]|èññò¢“(¥ð2=žÅ,«wþ¾fŒAŒŸÑ¯óÍø­"¬Ð)m´ë»ŸPVo¡´=§óUé:ØÁˆ©¯ß÷Åc3ú®i?Ã1]SL?êm±++zôDõyøR•x…HöŠ¢Ÿå z”ÂLS”Ïn#$Y/”4Ýe«Š`FkKç@ÃKËç5"¬*¢ ÕGÅÁcãæÂ߀ã%ÉlÁùø!äÜqñ,"(]ïÇÖ{ð·*™/´X/:v¤¦õpÚªÎdz(~5"FÇ1¡°À81Þþ^­4Óš=°Ñfs’³Pé²\KX:v{p=?;H~WôÅ2ùå°;vZl\“WXþÊXÙøÚ·t1že¬èÄŠž }ÙFá½ÆðãÍ8}oó}SÏävÂfÅùoZ/?þd®†á šær£Ú›¾´EÓÐ(êã8ͽDä‹:Ý&7ˆµwwkí­GMÞ—¯µ2ªµç_Ù*¿iª„nk=½¾¶èg2sö.a\JT•BµM‹Ei'Ì*týÕ\´©÷о5kTs¨ª™*é‹ÏÀ´£½À¹hóÐm k‹ I#£÷5ËÄæû@:›ï7ÍmÜeX>(Ϭmµ}Xº×i?¡“6gÄùiö¥ËÍ­¤‚¬h‡NèŸ)²j>Ê+¿€j:ÝICK{FÅQ;&üR´Ø¼âš„G¬eªoôż‰ÔÛS pÑŽYE¨ÓlC]Û¶:ÒHÅà ­¤íhü Á" gø·ˆÙ7‘õ¥Rsvª¬*t¤ü»v‰mÝi+€‡aG»¾ØŠê©õ÷K+õHë‹ß?Ž|½þåzQ*áœ6WŸ_àG }òþk›Jœ½#æa£sL–‚|â`†N¤›tŸ^~!÷Ê*ÞXÌT¥ªÿp´›þh犾áZ4Þƒi±ïõùïê¶‚oÉ9‡#á“˰‚gLÍÝ9ƒòKB}xB»s¹òƒL-Þó/ÜÒ\2?\ztÂÞÃNqT-i°U«V}LKB[ AGPˆ™81¯¯j囜ñræõQáîé±B9gsïî‡ ±ZóÏLÚu°kòkã³|šv¨«êž°µSDˆ/?{mÇvW8æÅVþpliCtª ‘ösS \L&É%ο_RΧotßÒ¡žcO •I£u‰ly6ýšÒr2W4¿¾Ájåt·Ù}¿…ÌS0Ýlìœs IÀC|œq€Ós.¦ú¤ÚbUª IK“Ç‹ÀDα¨b p‡’qànwÅ•¶;LÏ›9r ‘Ù[óìv·;Ì ”3t 1€'¤úÄ'>í‡yC„‘tiwRËÒ¼xßM!“,_¥ùS&™Û“¼Ëô Á§±Ï‡ ¥çѲ¡¬~—F·‘8J|EÈ5HìÅt ùmú:Ç3_UŽÞ;”à_U.&¿íQ>”‰G/Ú?ùÞL‡É¾ÕF/é<éÞ@d1•Œ¼wîmÆŒÑtÏ‘Æß¹·K¹€™DNKúá{WªTdÌM,|'­Â…s¤$èoh·®£væˆVወ,Â)%G¸Úž¯žjñ6ÍÆSú#xˆÜL÷”^³A9޳’^r—»¡—–H浂ÒN72óiEõ3$lãÛ•+=%läYTŒ²ZYbs×€÷Ó,öõà}hW[ýÎè3×­Á­2“½jd&:h|¨SxIµ³ön享p:D›$áä­ÔAM‚]ŠØÓ¦¾¼ËtmÖº˜P_åÄÛCð"qÞ5|aÕ¸mébxýŠ‘á”î¡¿žãSÖ(6¾4R¤xûʘœ¡>K¨o>7ëãö~<aSõãmCž%„ùª<Ô·’l¿7<ŽŒ`¬ I­¨‰_‰‰Úh ¢n>颕x );z¥¯™ÕËKìR×Ûƒ°¬}jæ~’Œ»‚rA޵ŒCÓ2ZtÕ!Ñt/ë›fŸ Ö-æ¬ëNZ>“NÙ—†9§9¤Æ£¯ãÙÅÓ˜øN¢|g ¢éºEÒ‹×jž—AlÌÒâópJ:ýµó6&¹¡[Ë”à¢ßËo”(v½ µMub×SÑŸyÐp?m®ã÷yH<éjp6.Äʦ*MÒô´“÷wû#2BàܪNE½êN}LΨ¦¹î·T³¯ñ.©¨ùyȸ³€-¨Í é%Yâ/uKÑL=ü@/%î6—øO+ñÁ´kBn˜Xm0}}DS½Ó¬á† Á.)ßÌ„ÔõfwÆ7˜—JÝnp©aÙŒÐÎL/F·Ä%Ö‡ARĦ†”îk[/ù¡×Í÷5f”¸d6ñʱš35"|š'“EÚ:ùæ\ÀénìY@ÜúŒ÷h2wÍ´Ïoù€-ƒ¤ ËÅ …7Çú˜x<›%?´«Å-ø-î½ú8tãÝiÕ.÷0KHhõŽ8zÙ@JßU@…N-Ç3×op9í4‹9¾§Œ³îq—ݼñ„ý{Š»É$@œXˆ{rWÄÚø' Áêõ­çd?G‹àµXºVUT,mÏRG…Ea€y gd¤ ÐÛÆ“´6´58'p¡L!î?™wz~Ʊʢ8ÀëT‡Ñô®¾î÷K, ØàŠv83ø„1P) œ½~儸>ßQÛáè81,å=ŠŸ£¬÷{ï:eÓ$:Aƒ÷ál¯‘s{<{’Ùë|'!õ×½é] ÔÂd¢œ\ÐÀ>ºÆÅ$@ÚEµð«©Ùµ¬­ðG’ÙµÆ@Ë´üZÖøcI‘ ô øcîÆŒü1càZêÙgá+®u·1£ðU >öJH‡|¯ ´Le>´æ÷–E3š|›‚ñº œÞ> õˆ„*«¡Ú¤2ŸDÀ·È3Óe€ô|À)ì›Ý0z3*YøÖÞ3 p“n48âÅGp= ›È;%»¸ƒ0T2:ÅËÉ ,@ùØ „®åàûÙ¹Ùs.Adi.Øa*=Ñ•Wvn¶‚‹GèÊh7 ãñ¼‰ÊßeèQë`°.P+»ØIE†ÛOÕ阄üû®U§wMÏ^·ƒ!TEEQ7‰Ôðð³‰.]0MC³PD—™3N |ù- ìÁ³¼W¨H]Lrƒ–Œçš´Ûð:G4f97`rþÌÈû2  $|Á…Øö,ùðÅ(d¿y[ühzcÅZïòúö€\ßø ñƒã0·xyøÑôÓí<áá×pà§fUiª³ >qƒ/F ÃξóªŸÉ$+~ÖŠ2uR3\vŒ8ļß1*Nþ ¢RH»õ1~ãæƒµ/ÓŸk‘>ö” ¨)CPqH ,`Žù8EN÷Q]ØO´’.Dç §ùO£P1“D®Ÿß,’|7:HÛ{ºi´5qO±œeóJDAs,x›Bê2ù㱺ÕáwÒ¥wþNžíouZ / ;¸R‰æ“ºY§KQRí~éråŸ>_üfÙ¨Ôyc»†`“ƒŽ/3?zÃB~ xR‰Ÿ{e¡µ†´  {Ø”øh™Ÿ™{“ï8mè%G …t?k3¸•7ÍŠ\<ëQSúR™ÙqoœJh:¢”RÚeÈNvw¤|@66ÝÊ,Æz1™PÛ—>ø…$ŠiY󲡖 ÍPÚuð«D{ð1¤±o«ùÌ5y½çÑ:‡7³½ÏçÞè©8ðfÉ^jzºÐÁ[x\& ¶"HÒÓs) &ɰzø ýÂûÕb °³|žîžáaò¦\HÉ?]–xqPÌ›^³Q݆€þ M‘,ÿ<üæ«öÿA×?ŽgÝN_ÆçìÌŸøË Kù-R–÷%F”À£PÓD¨Û†ûø&¿Š¢Q 6º/ô>jñ›¥]d`H%Í6ŠUëmá•Vô@¢á9¡‹² ¹úß3†ð‰_h/Ëm>åÆ`{îœö*D8»×geÉê€3v¹‚‰Þwyèt5,DÊY²AŽ/~y\pCäáïéWŒ³ñu}'ײÀäž\Tv1Û?Ìîyκ\t©èßO4÷>+H]eæ=ˆ I-DN Ã>fgxoú¢“¸ð®7Ì%ã1ëÀ;©ePC«°t]Ö`9µKgpiSé¦Ï®)ØÝ¢Åà~¾Šxw'm±îÂу©ÈÏ ›ågÂ4Ã{h/!/£eaßPÌþ{ò‘wš”1LèsþkœI1ƒ¤nºA¡"¦CO#ÎtRÊiÒ@¬|¦9F¨ÏûHLQ™Tó5’|qÌ›Hé}3Ö#VÙ9ÒŒ„™îi$@ÂM¼ÊÁWô‚RÌ`tw´ÿ´,Öùý`Yôuël2ÊàÃ\Ád3!pŽï*šjn¨f9ÚÓßí½Œ¸! ¿½„øák®ÆPb]׫Ý z‡éôe9üD1Ô–kÄׯ!<.#-ߨ9äÅü„û—Û¿ž§­rÎ$¥DÓø³Pªƒ±§l†”÷÷”M;g†¢9×ú_3ê\Ý>:ãý{vС˜«ФÛê‰ –=Þ\–×»ªê/äòÚIàÚÑ´ØEžuwß9?Õ½IüÖ\z\ì² Ó$É7]Ó–Œ–@£gZEÉ(æJóó5fXí¢Ýk{C€Íù…Jò„¾†ˆD±Ã9æÙ´¡Yo¥ñï^4²Gu«$„ÓQT[²¾•D¸Yê8kµ¹|—«e/ ³:”Øùþãyd`)¿ãë1I2C6tè MƒGS>Œã×Pß‹jœêš ºú ÄÓÿ*)ÿ²^øÈªñÈD!ÙhžÛK¶¸ ÿJ¥¼ÕNÀ8+N[aNF+"ÄF6ÆKÀä·˜Aú#ìZŠJU£ <¡b7V’AŸ§¥ÑM¥ÔîLf÷zó"?e¤Yqð¨©iqmgY’KÀ)V|õvó•O%…á½ï½&Åî+¼øzmÚðÕÐSYø8^% x;ÒB¹wŽ\«æµ<ê-®WÐÁ„T½o"îŒt|ªU…°« 'U]—ë¼ Æ*Þó½_o¿€Ýìò±&ˆo¥Ä¼igž…-×ké~MC5 ø%ÈM*Í)ýès7—µ´Ãó«®,FJ—IÊÚšÁã\ £ò¦i ½Uðuþm°ý•®¢|ÖVÔjÀ¦ÔŽE+Λϴu÷1òwô6'¬¾q³•öT›®«Õœ|c=Õì^;\Á¥>ÎðÍ㧬 øƒx¥;bƒx¬Ô° Kˆê&gš%©•úóiãÙ÷a¼§¬]؃èÏ÷ú@ôw¬IÝ1ïäM2G‚A<ýÞQa\5Ö`ÓÕpYPyT‰…#yÌg|Œ6^S®'uøÚŠcd‰ªAU›©IòÜA+Ç̶˜1o9€ùO’ÕŽ­¸ûÜõ,òºÉ¡ÓÎÕø÷e‹_?³¯{¼ˆù‡Ta²Å¼²þÄõµ%_ŒS ¾†ôŽ[ä~ðú2„bVåì’åyâñùo ‰Úó¥,ò#½ ¾rÜ‚éDYä’›(æ‰0Œ3^BP"dxÞ¥õã'™A”y<Áäòïß_CË–zqBáBŽÇö\š&×ÎkÊÓb^h£ÂB=íÅT…¤ Cñrõ‘Þ…7˜æpLsáisÇ!bçV~öúE—Óñ`ãáß!"EC·4•ÅÁ pC:Æ<ž%EªŸ@[Š g²ÉÙ`b EÝàa'9JW²”¢¾©žú2¯#$õ±|Ö5ä•y\z·û§.ì#k0u°ä‹°s˜À#䎇˜ë^çfâiRß÷uË^¸ÝßžŸûD}n.÷ÂTqVmR1I*zaœyu è³÷9vJU,οHPYý"‘íõ3 FÊ9½ô¿-›™f½ðåz()§6ôǃÞ# ²hA]À(—Óðù9üÕEÞO9ëUÎ&n;³ÆY¸¼ZËU?&§¼ ¾€ y”ñTg¾|{û•=7¹Ë¡;Ù´\H†ìÜ…Žáû wÖÞé-˜± åQv€gÅL.n‰¼Ê »fäÛ£7·èç!–p€Ëçn=¥Òü£/r1MÎ’I¯I'ËÕþR„†É¹6qA–%õ^”OHXÔ<‹P!‘W©H˜NÕÎ]è½üˆC±ÈW³;È/йŽCo}c•ah20Šœ÷À'å-P’‡.ûÉÝ4òP>ßo' Pwƒâ¦ëÑ ¾½Iå*˜—³ êÁŽB6ŒôT…–ÙÖZ§ìÖ¥aA­×9ô‰²åÕÛ™ÎPå8¼§!UNš±¬@1w¶«í‹ø–7š×œ’ð”Q¡·ç|a>ôþ °ó=Jzo­\¿p“õbô†é´˜‹âïl'²–f$Š.€ÛÚžÎÑn˜ÉâeŸ“8OÕšb“ÉŒ1‰ˆ}Äz7 ¹ÖŠ[çg6Ÿ|íga¯Lòõ²Ý^éõf†Ü“×ÀX6g³N/Ãbhë+Dì1%³¬gô€-6°›‰R»Ò§~’³HE+yEõÀm#Ê¿…x%ÖŸ«ÓÔ æä|´:róùHìŠêíO t3_^|G#9çt"PNƾ ëtçûñ‚! ¤øPP‚AÉç¹Ó¹Ïá>‡KI_w:eÓ3ꬊ*cþŸ¬x¶UDYË‹õÊÃèƒQy^؈/ùYøEâmú·ªÌ@ìBr“ǽf‚ªxâÕë—Ð`*’Å¡e ¹•’¹ˆ7¬¤õi$ì„$ñ;PãYÀGvÄ2€Ï_üÕç•÷Õ?‚nÇáþ‚YFôFapã  Ý¤’g@,–Ú›ïõ9pÛS¢°ç‹îD"ùêVfb~Ð.Åé(´Z]C&žÏï§h>"|ÄLÑø0X}®4Ù) ‡ÃR>àÜfŒ?|¶÷0ÐÉ?òÇGf‚€÷Ô›C}j¢´EûzUlözW|ó[•p)0ø­ÓX¨qpO¤¹¹ul_(e­å­@aó+äcËz±ý0º6 Hй䘰°Í’³;~7çUÎÝ Æü·7­0¾4?µ÷.Nü·Ìdδ‚Ar­ÏZ'*‡µ˜¤]Ö@èsJŒvË,hyô5gdÀAWS·œ3J¥ìx3íjN]"2õÎižãO¼ FmžSæU^¢Œ- q’'¦ ™{<××…0¥\Y#Àxܦõ'•º{¬ÁÂZ‰àÅÐç̽¯^Û߯)l9›oˆEq4ÿWŒ[ç”ç±ç ˜ä¼ê!œì’7`à£ÈѾɧ&üqß|°1ô7¯ÍVSMä[ÇEsË'«Í§h¨Iß‚SŠÒ78“3YìŽ~ÿ2v‰™ö*#šKKáêÜ"‹ lÙrU‘LœÏñK¢$ §«‹1ݱ8²¦r¥´„e|'ÞáÃó‘>s$Ä(VM7†‰1SxM.QÆ„]>]‹[;ÓgLèf‰IÑ€2ex£ð'›¯]ƒŸ¦^U×n¿ÞÌáSï1AÝøÒ¬t^¯°yÓeFeÏ&íC°tü·úM¦)ó,zÒ8uH½‡Ÿ‰´:/…§°£šÌÙ„FGtÏ'±¢ð«òFzqØñeðKÿƒ{X)nψB,ƒ¹á®¡nÉÀüÓ°nâfEfèÛ,<ºYthXžz4®y³f¢oPXm ¦¦OÚ£'Q>Í$ŽOÝ¿öQ¢ßä]OZiIzžÛŸe¦&Ç…‘%ñœý‘ëz¾øJÒ"ʇdÕ—æˆÇè1^Æ>ê[dì(•EÝ[ò³Ï„w zksSŸc4SfŽTòµÞÒ ¥H¢Ò¼~s¥•º s mÝà¤F×Ä<ªì—ü½šœ]´OÓ þ«ËWfä7ý½¿W+8G̨œVó6XÅK)óƒ#€ˆ·ߟ!‰óª¥ %;óNñUãsWß`ιÑÜY¨flá£V+ç#ŠþcÌ}ê†J±†£îˆÿ³køÂ¯‡´H¼•˜§¦;FƒbtLfÄ^J*—ÝWÿ}ÍÄvDV$ÃUó}„$ ç±äoX´ÜÒÂñ±‚f}NIzw$FGš=÷‡GIF¥—Šg>4οA~a5“ȱc„Ò­¨Fò÷¹Rˆ5Yô~4CŠàð–ö&Íê†SCK–K 2—`ÓC¸(ü¿«ê%ûæÍc¿ö«Þ9ùuN™ˆÝjh4Á£{(öBvA}’‰â܃„+;ÜRV¯g ÄKO²Ì4v¿lÛ-:~ÄÌ`›'L·ÇXñÐüœ.tv´Ð;?³”ï«‚y?0͉ì‹M^Gë•¡"nC9KÚÓñn@UÒ}\¦g¸ :õ¸sHF›ñ&lžìjèf¹/,PžŒøW^#ÆÌ½éHŒ#ì93Ñ«»*C8ô‹¨ S$ü=Oho; ¾9‰Š§9qõOC%äJOuŒÕ'“³Ø…éf¾Q¶ !_âqr–Àè2ÔG»jrÓw^Ù‘Q1ütÁ×ËOLg“¦òc¬ü*ˆ%*‡[ãù·ê^E“91)TÄ}ŒøÂÄ®ô†D‘\êxà·ˆÊLÀè9Ûý”dmëÎQ×r‚I¹mâ[œMkjB·6:£„n±HSþ|÷£yV…^Ýÿƒ5Geö*_(-¨¯Ë"2úøèÎYàŒjô@’‚؉îõœU½¹à"“*"¦]½œ2{÷<Š(^xô¾âÁA…ËÆ{ÏcïÒÝ#Õ¨]ã0Ó¦´ Æâ¦n#æÔÔ€×/ jT/ë{®?³8Mt¤Ð(ìihJ— ¾U:¤‰TF}bØoy®ÃÏ@rHoÐö…QóI3úÜ‚™á_KAJslC]9»Oɨë…zò{÷Þ¹FIï£-•`n %ò­#Š×ûmÉ´Ç2ª×¥iÊlh >‡‡mo¿BgÚ¼ °kxª>êå~ªO;6 J'Ÿw¹À{£¢Sq òi«*P8¥ˆ÷†ØGüd=묰‡AFr?Y&£%ÆÐ.åöÓ4„ñ”áõiV•Ãý‡4$zñ<ôÀ„0Ëõ Ʒ˲ª¼Øw>Fômœ&ìu "wÖ“Å’^( n`œ”J6i~ˆ<ü~£ÛíD*cÔ“0GŒr0ô㵌㟰ä=( þÙßÝ¢|ÄÝéåˆ-üø7@â‡r‘oJóh~CI3@ï¦Áêsa6y¸Ø‡gG”ÀCú*è5ÞiAŒÞÚ- ³[èݬ_ôã§î=?…sôƧ¥=]ZµHœŠ/ªŠé¬æŸlŽŠ–<  ¬×hÇøJµj¿½ôáËSkàË3Ïg±º3^[º¦ñUX: >8[5©vH\‹øª Ü:¯»ô‰µ,{‡€yûyÔâ£hÃ8qC"îþé9£ÏúsZçõ²#ù…$+gÛé €¡ÜÃÜê’ë­ï½ãÍBú>›™³è'T•Œãí[Úå¾¾`±.X¹O—F/8~[ëÐ,׿E+ʼk>ž÷ÒRga¬Jƒ¤:œÏ­ÜNžäCȢµ/71eÝeÜ É RÆ~D.ŸqT¤ÌæTV1ß0}Ÿñ¾ÉÅÃÆ\[õ3”ØR/ x™5„9¥&óèô²+Hóc»"•?‚)eêõ‹<¤57²ìY¶·î—³7Éò¾ÅµAMÏ"O‡DiBµ\ªÕmýHÐ0É]s´äÏ ‰3‚Ò„ùÔÃ1@43 a\ãäD1Ìúè»)²hÞfÐN¿Y-×ßO£ððÖŽ½Ó‹Y£íA–ÿ¸|z%¶÷e»M–KÞi§>ç”ÕôËsÕ)¾6Y?/\¯Ä *]žÉ1u£ß3ür˜Œ Èà|0&65;ׯ.\¬¼°ßu±5t´ÕÑÑ;ýiØßú¢%|Ú— Æöû¾z¬z¿ëkhaûÌÖéo½¸Ù™Ø¸ø¨9y¹˜Øx¹õâf5€±ý®—™¥ño]¸¸Îˆäæâû;"a쬶&Ö†pƒß`yØ`L\¼Ô<<|L¼\ÿÿ»¡èß·ÿÿ¾Ÿ¿/ÿµý³anûüûgûëþŸ?¥üãý?8QèïÛ1÷ÿ\´}þCw~ÿ))iNN™ÕÙ=?ÂÂÂîîîSSS:::TTTX§þTëè`ýñŸk|çþ$=tø^Aܶ%tÀ6 Unv³ ùëÄŽÁwIeúÌcmÓü¯ù~ä·­ÊÞ.àwë½åÉôôƒË^ÌÖ}[y‡ÂWü×/´†’bѯo2.ú×Úc+¼ó Ü–!£é蹬h/éÿŽC,*éjúr0‘¡ñÿ×M¥;.¢Š#¶WK îG="½úКÀz+¤È­#ÁD–nVï¯Æ.1âŠn÷· 5Š”¡ü¼ç^Od¸uß+ú“ÿ»™[MžP – x+ëÏø&¨BËp6õ´?µ¦Ì-\]vߎ¤é˜ j¨£ ¢kë•›o R]5Yïïn3û¹#²qÖÞŸPËM[HÅÅË×¢ìÇ^v°cÅŒ™‰“ÛQߧ˘ý¬§¾AOÖI':vûÞ'F>™çŸÇ"ë®)VH_$ÑÖYH3x™%Ùã¤ã »sÛ+Ëø²cwÖo»û¢d1 Ý,ò2S™—„ÿ;ü[Å"QZDž-‡HôÔšÞ¹ÔQ¶èHÖP‹´> ’3QÑ^=ýKHË]l»!´Ì˜õÀŒåE¸,6­ÜW¡ißfÊð.kÙ¹'áHð+bÏŽúK4G8"?ÉIE-ÜBÐgf”¹œÎå§w]§—¥!κÙp}xMq6œæ§tt—]ÜŸ]>†¸e_¤š˜+röäÿ”ÝqŸÏn [²M dóxïúÏ¡¯?7¨¯ƒ¿AUé„ß­˜ÄZGÍÕY­Ï¼ ª3Ýã᛺8³©W Å€GMù4z=®âðŒÆ¢¸˜¥q»c!ÈÍ‚òÓjÝÜ Ù˜[ß”üD»ßþÔ\v¥ádÿíŠnUË‘Å2ᬠ¨þ'õÕ‘Ÿ~ýW¥®Øp¤zÖQ…î±Á£¾»—*“8ð°ÎrAB- >šEmùÍ£º¼Qº4ñÉ:¶PŸ­–Í_»ìš¹€Þ¸í,µ'ó% 1ÕEðÝE‘ûºg‡¾B¥ ÖQ`wеÙô^Ón—{*JZÔ8–Ððƒò…j6zY&÷‹äMÁÇGÌJ€¬7>B<Û/HrñG²îU³ks»4\_GL“½ü)µãkw6ÎeÚZ% šÊÈn›| t¬0¸Íº²“"Y<^<ûäà ]¦d«ÄÚËwò“€Ž‚Ò(+c€»s“'Cጅÿú(ã‡ï“3cßž‰ÍÀ{ç¥ã.K³s,Cÿåé=U>ˆèK†]ë·¶W¤n+x¾;‘¬°žŠ+“Ìâ."®]‚Ð|þ0⨫C ¥U½_?­—yÄ"±˜e²›çðþÀ³W6ò©Œ *‚<7ÑõŽ~æûyë¢n{âðr!X@& ª¼X¥ñ3cÕ8Š1ºï;‘Úzq¤_(ž)w½–Üöñ †¨Ž§ŽÄlÝLLEu½Ï¹®ªYEe4!f( sÙä}Çžø*Y¸—ÞÒ˜4±k¥$Ò~N-[ iôÊÐi¿1lˆFÁÕá[ÒÁ«ôó Ò_I»STÕ²cM¢°ŠDU|ISù DÓ–:;cH]BH]¬¦†GE»%¥ÿTY@”µ;.µH$¦ˆKö‘‡?« yMiU[0Š…oó ã©têÖ熞(h”ÎV˽¼Ø›¨Î- BZò¦>HSó#(êj\™°ôÎVcjê»wácaHp b‡sã#ÓªÚ+OâŸj+ʼn±uàÓégŽ„ÃiY½=RˆpÑ;íF°ÞȽž~1|üú}í'DDéÛhÐÀ¨’WŠÙ@E/éÕÿwùD†|†;eŽÈï©òÄkÌ<‡-•ãlÕîO<ïÉR”4|5CN޽ÓeÂh\A1#XýÔ§¯á°g;V±ªbà;£çƒØªS)¯úH>Ò2”Â:$¾Z,~’L.J±ŽbdX:¹êä®Zäݱr§”ù¬ùA±ð}µÙ`¯LlÿGËûø†´‡¯Ð Éîw*§ª…–‰nWWÓñ‰ßäsR§?aí»%//.8e†T½én­Ä 2܈ù´~sªX¿gnħ`½löBÏ•ÃWaˆ©Èä®Uúâá›êéØuM¡Ï± áÚDœ“m¨í°O’ƒó.[5½Ø_¼­9{…µß;äu=œ,)kÉøŽHÐ «<ÄmÅ hI‘»ßÎbE8“¡ÿÞÕq·Ó FÑXá"¨ •±ô-zSª?DÅ0MHúóK•|Â…UÎë¼7 ú½.ˆíwÈà!5ví]FsÂÈëSqßü'Rá(Ð(sª³Â»@Îù&]·“~¢ŠµJ‘HÕ QË<}H t íô ³°9D“È—¤¾ã›Õ¶ Z¿›òE ÷LoFN5¾3É2‹6—äðäP8ÀÌÏK6Îoé’héu¯µã‘7Bk´XL*=ELàõsƺ¸¸´×íR]+"¹ìm¦VÒÛ&ªùŽk8×ïò¨¿†oÏL Hþ5<~ùP¦[ê ­Ç*}b®Ñܬ’‚Ñå÷Ý[þÀ¤g¬{¡¯¿–†7ÉHº—eñ¹¥sÿHÆÏüBÈcÐ þVÇÅ×"ƒö8ÜùµŸ_ÛoòK;Ó Øï3¬Fߨ•yâu±£ŠtÄ´Å·Ù1¾þþJ‘ÁÝ=³éFƱÀˆR\ã‡ÉîhZQ™žâ[@3e è 9¥{aŒ…O&ÕG_Xâå ]ˆ&âe£ý£¢¢÷}x^F‡$to ªÆà¡y:ª –º µˆO¹oó½&Yü„)ÐŽ¡ÃJøŽ>ŽôÄÍj׋ó!º8QŸ–‡î–~ú[÷¹ºœˆÏ‰¢fÄvTfè8Qg¹dˆJhF¾ º{A¢Ûyi…DA|•1¨‡ÁY¢8@I!¦ÓPx¿Kfúªh¾=ž!­)™ºÔSöXRaã«íåýJQäÄ÷ Ì S¢«©¾y"*iƒÙßt±Î>‹©#OÔ+#1,/Uq2´þvç„=‚AâÊ­jº[ùbQ3>PÑ;»O—äË;ÖÑúO'_‹24rzs¼8xÿ¨¬(¡'—§Á`Hì‹ô'1¥wÁ·<¸ü„@ŠOœ?eU¤Z‘=¿Ög3ÐÙ÷éí☱†ÑȨÝÊç†dÓ÷“zÉ#‰¹€†ßº¿äÓšá34äÕ}IýÞ-V}3¦½ð]|ó;3HGA1h+œè‹AS‚¯5ž~ÊGúCöú€âòùï ­~;ÅÁ݈kízL ~}… †¼nÑÑS1jÜ„†+LÇLw$;Ç :é²ïTRvC§€wÓe‹U´O@ÌÄ’Ko+ÞexÂöÐðvºfªUè‡âÝÂçåå}ª‘m$jÜ`×´Ÿ¤=ç: ùµ3}Óß \Á_:ñùµßf§Ër:Ÿþ ®@(Ýk§-lM—-{Ô¡6ÊàR¾(?÷0¯yûê}.$,Ÿ"EDÍš:›.K@6  áõ*(¿ªjA¤2P]°—œ¶)?’5 ÅxÛÉ2‘¾To¹^="z­ì­X÷– Êö²¥œâ"BüƒÌ»šµM.'¾Ì6(Ç\Z¦ÎxðݬD~vbÌk‡iôë:ê˜ÇÔ8Tø—‚?‘Ó]xr±ïc\ê¤IÔÒ§º£úv™&yø-™§2RdjGÕH–^´PÒÈ1ŠÿJ×üâjþI)e :”¥hÇßšŸÈXϽ¥û"GÁ¨¬ø>Ó‡Ò­[íÑ÷¯05ß h¶ë'Æt}~£¸JÚ?Ñü?_Š:}gORC®¡Úˆ)2–uÅÿÔZÙÕÕTßtûåÔ N£ Ë÷’ÃåÄö¼¾\ÿBàfs§ Oü5éµ±½RmÒ‘¾¯¥‹Œ!¡.nøµm8F³p˜ËV¿ƒ{Ùý‹fœ,ŒÌŒ4¥—Dåʯ¯F§½Ö’ÂtvF• EmÏ:/’Hà)ˆ-¿Dw{qy”ù•u“\Í®9ßõO"Ft ÙÅ”ãaÃw ‹V2Žr¥§º¬&é¿- S]€——x£Ùm’…j œÃãè™f¢"VÝkŒ@Ã| ´T\O™õ}Eèæ×1Ǻè?±¨zÕ©…kªÆ´5¢kØ»™Å£^Ó”8é¥kNöp‹ŒÈXƒÓSêyŒR>Vc°nÔGÅÑÈ0\»–°¹>:àXß?Oæ€;J"q¥@”×ëm°î÷ æd£{/96$‹‰˜43>9¼à¨õd/@0~µpÓú±•#4I)´OÏsK÷!5~:ø íÈòòÎ #üeXý£A¥·©»_¥Ê>ƒ«ÂÁ>öÉÖŸzžÈàëÍo<º¥{ÿ´íÅC2 Ÿ†`éÁ[à•[2GuÖ.êoµéÄhÓ£ ¸*ߎ7åȤ¢úÊc®È$âÖÞ,¨É &Å7ÃŽû¢Ã‰uå½qï>)¾XÞ•OÅu½d¢ò/ÔÜø!Z®î¥ôx ªÀ÷qÌÛ˜T¿<ñ3 …|<£²sѼâÖZä;.(±oÍ’´ûeÔbüð«à—£ÞJpq5SQÃçWe–Y¶¾ÜúÈ®Z À´5À‚þ*Å,ž·ž÷lɯÄ\>C#8œƒ“Ó›O_—ƒ—›—ƒÆÇÎkÄÅghÈÎû¿Mß_åÿnùŸÙÿÿÙÿýsópýÑÿ³³Á0ë¿¿ìÿÿ~ùg÷?p¢5ã4ÁÎö™ÙßnXà1¡ƒ45Œƒ‰—÷ß¹9‚‹ Ê£ææCwåàù]®ßßþ`mhcig­oø‡'88x¨988™8¸9ÿG7Nðpñœ’ÉÇÆö{2ÿ›'xx8N¯àåãbbãøíÆ V>îßõÒ·´°µ¶üO8Ðä`c§æbãAÌû;Byô~×ÍÄÒÖÆnõ7¾ps3q²q YÉÃÄÉ ûÕƒÕÀ€›nm ÿaœl|§ œ¼l§ ÿÈÿdÿÿ‡W@ü×öÏÎÆÎÁùöÿWüÿSÊ?Þÿp„……}rzÿÃb‘ç:ÖßîÈÉÉù‰…õ_ßÿ *›ÁúãýÔX¿îxä2Æ]Ñ6ç2®µÆýæó²díXûv@YC¸ã‚\_kçaf¿zçä+gÙú¬I²º…3ˆñÅDêa-êH €²|ÀºO„&Õó¸…®Àc¹ú«I½¬çñM ¤p‘Mä êI­BC‰‚4ÿÖí ´©1¢¦''Û9XÔ ÔY°-=buÁWKÛÓXd›Ð»ç ´½|)O¥V¼0˜^Fd-—„ùcçñ¯8Â>>;{‰N žtÞxŠN#è?¶——Bªg2W\wöð”'Hƒ:ˆ¬Sá°>ePuõ^ƒì™¯U£ÈÛé"“)`W´õ¿ÖÑKÛá{}‚8:$ §¾zéݱ=Æóz[ߤrþNd½ØÃ³(šB!&§åù• ”åa{É+²s¡/¤vëº7eë%§žËÚz½6@þuÐ=="»—Ø$#Žþ¢îÍÍ^o+èœüE!`¢74^îí{°áÚþ_o°E–=¿’h|ü. 5S‡­S“—¤C.Jc—`{é@|ˆ!Ó7.Á.³À>¶›½¿ ÈÉêž­_ö.¦§–Eÿí¥§¬Q7Q£»‹—¤ó@|((I >p8zc×ø¨Ü»¨Ñ».x¹^×£5•Ú„H° +Dôi1µ£ö osQ¯¯¸Ã%\/*H*[îUðem  6ŒÚÑ pWÔã+À^šê"S±r µ£º»§ Ô ­h¿Ïö=„øX€*–îí¼är¾]*ú±•úy¼a­Þ²™ÉË=úD…l&\uöNM÷‰Û¨ô©¹FÜPº´šmÔ²úÔ?z^Dk†Ø.†@oü0‹¦A¸Hµ±]î…ÌÛò?z -j¢åúJŸ(‘­wÕ)1Œˆ–·ì(f âcÒ­IÙÚåÃ.˜›²#÷.Æþª \8žr~@—Ãv¹Òøƒ˜º¬nÍö†wX0öQ'ôÅWv Îíï¶‘Æ„o>-ES,°°Ép8ô£o75¥,†ªÑù{â°s)ð=wcô¾‘’¢köÍW[Í[!سzAà@_Œ 0K÷âéÊ$bË„§¼ï" ¹×Ôê#GXš±­3°ÌžÑêÑ#òg+Æv!ðv™‚]n†¨½î¥÷ÃQD%=«“ЯçM—Cm.ûè­ñ7tj¼Ö¯ÄÜu¸nw<;ÏÕüuq~ ìù™©Ý"Tdï]·{)“ òæs’d‹k)g1f»ÜQëÌÈ]â ÝKBFµü=ß­3¼õ¤ƒ\üz}9<¹Ðv‹ÛÑ}-GÝ;üiÑkào¯Ñº 3x˜ú^¿zñU½Þ’·÷GÞ³º ÀÜ%x/ïºùI´¬¿(é…©cÄ&O:ù@^[WZÙL"M!á Q8õA„ª{ÅÈHqì©¥&•B‡ù}¹Š{û"wC9~dÓBlXæÐòJ˜™ÊEXˆ3³A*’èûÙ@¶¯¤ßŠ5¾níºõŒ=éƒ~ÍK‡u‰÷Nä‚ùêáâ²”– jÉI'2ߨ„]·Vnà«ËÇ-B¢oP¡ê–_¥ð‘5ŒR²âh)Áü¡êZÍœE×ì’¡ ‹dräN÷óäCûc'õWÐò›kÞ|¯ÛJ¿,l&ì“WÜ\+Ùh¸dE'²›XJs—»mã¡›ãêØ—ƒ—I¢{>Ö_.ƒb îi1Åäê¼[ù2tȦ¬hbst˜ó›«×¢-ªh'òaËm¡¾kð£sSC»‘½C§†®Ywg5 $þ=I ÒWè1ôÅÂÒ¦î±t oöhЦ+ëê& £iõtµÊ!oC-6îÌVb}“£iñX“5¨¹ÕP·m÷jA¤{Ò¿ð=Á¶¹òó€;A}´ $  Áu'¨é l}¥Ë,󡱸ódgÙ¸L‰àyÅ0.Ý~AèãYg=æX´1Й½{ ;Êxòœê›Ð½¢r°?Û°Çë*‡¢[1|á¬>4Vt@°¶y B¼ q¦Ÿi@6®ðÞŸ¢ö° kÑ Z‚ô@Æí{‡—¢½lq½E‚EYRÂçÉ/ö]aVuf¸~óÉ*A?ÕàqR58%¬™ºd†Ú{èÝ7å„ 12ÚŽÉÇýR_Ëù½{CQ{⋽N‘÷ &°ehÚóÉÝÞ%ð`Ð(Ô% dûÈL†$ûY_ôÖ U?dwS>º¥§ûôÎõýN’åèW±åÛû_¤ðAH6€â*«mߤ>Ñ+6˜Ÿ(ç€41[1£âã»›o¾Ü˜¹@í]TT¾»)Ð+3t}ë `óÍ3CÍFjj}] ·ôÖ=0þ‰ºvŒ{á{ÿ¢–«[)÷ƒÇHŠFê;úºoÍ+‡>lÔúŒ ŠC×Ú«z_½ï%‡=䌾¥?¡O!óEÁ³*!> 5£´Ö¬¹gte©ÁžØ Â("œÝv<³ãŽö¼hã9ÈÅ™ë_Ù†W[¦ qwRƒ±;™Í|iåv!¢ ­X‚œ¹‰ßÄhi>4f£ÃƒÚÅÒ‰è+LÔ4§½…“á|Ýx‹L}a$ªÛŠõC2­/ß}‹œp#ÿa»0èÂÖ•TÈ@¨Ë¦y_Bc0¶‰ÏpX˜%䢈šÍäF‚¤Š¹‘‘m VXºæÝëzAפ——z”$ư‚pª–é`þW1ï›ÞO®âä\òmb‰üöÅ :mÿ" dßõí: ‰ '·WסißGÔªë²7IéSÇÓ¯@o’ŽeÉbè¯&Áb ôGMÔ‚úX×i*d°Ù¬Ôˆ e ³T äÖê 5 ’Û{QV¬[bf•ù¬c5ÌäøûÆEo¬l“^·“‡ò0txÂÒí­8j¤–ÐO õü¹ä¦K”ÎÖK€oÙ¼àMâÉPº®ïâ)êß*â+UI£Êpp†i„´à‚¼¶¯Ä×EÐvÊÖø 4RKë§.\¿ÓÙ…Brœ!Yzg°¢7p„R¨µÞ¬êe³õ"EÜ®Òî²]ì_Ü¿eCé-"šÙÔ€ìHêÁPß`ÌÎwýlºÀãž<®÷‡ðÒ㧤–Å•.ARåâFw)Ú°B<—y¾ÔÏñ¢#ÂtfÍò»1ÈÅç  åüݹ-ô‰rÙüU8 Á”2w¨8åkôÊè˜óÙÌQ(çÙñ‘ñÔkµ3Ëi†ì-]û†ˆø{»E§?ˆó==F`ÐΠ#»+érŽˆBÖOw§÷fû øÚlW—'œù^ºOp ¼ä>Yýqéøá¼”Áó>‡d­V»Eµ¿g[«È÷%ÀЛýæ1*7>ÈÍà=?—ÛM¶ìñŸ NŽvû_ȹ¦ú{BÍÁšuôE$ì.ƒf (?=Éé´œµ¶/%þ>Àx#Øâ‘q¨‹gR‰ÃÈÏ÷ò†8š®3ÃÔ"ömKÔ’W×ÜÛ+TuÖæØR-?ÚÆ×ë+5¦ÚF¦Êy¹@'F$.®“¶»—cg*m*êne\„ê?Ç÷'ßÏ’Æ€<-œñ3g™˜Ym~Óµí©ø¾t ÈMíp2p¤«"meÑGN¨%Vö ÅøÔ{g£›)ùÃûj‘qz3õ²œ§E¾¾‚ŽCø²y¦ dÏT¡áØ’-Wy= ”g-úBè= @Ì\#¦8ñŠ;âƒîÜ–f.P"7 üK CÓ×O3Ÿ¤‚Z¾¥1FRÌ«„.¿‚nöiêYd¥ä/û V'QÑ G62Ǧê~³YôEì?94}î°oÿøÐıªá0h1©w4Eòî÷¾7ØSÒ_ê]ÅË :fSñÍõõ™k€¤ *Ig,Nßt¼wÊ&C›·Ýöfˆ7‰è]<˜ñ#©’­¢µ¸î¢¬GÃ…`ÅòØšÇx†6dÏñµowÇf †ß¿-´ª«~á2®M1§Jykh}s®nV V/¶ ·<ºÀ˜}‰c𥇩ÿl§¹þÆÉ1÷µ§ú§¯—­Ðb…ŸºòŠOQX#¹ô&<0X¯®nÑ "U´ð+Ö48: ªD…gþ‘×Ê|0EW$õqtðu–bï£c:v«A½’\.Òe9U×;I—£`[ô´qrà>]‹œ™ €ùµE?·e‚3kذŠÍM5bZ°AFGöY'×Éj"ÊÌ5Ô"&…}à2²=SVÊÀ>¶° ½‡Wžã‘6¸W¾²;¢®ùqí¢mÿ!´À±¡[äÖÞëì½7Ü .zŠ^‹Û“ÇRnJÍÇW€æò³ÜóVA|õ~ZZ»7yM%ߣéuݨõ~nŠãc=™‚(VTìm¯ÖT·é€G‹àM )¦ ÔˆˆpúpA·L@=<–t:msûZ•/è$@Ù •~:L9ˆ—f}]ãØ›(Ró‘Ñî/ÜëÃ\õ€¦ÂÜzVuN‡Ï^@.øÄq" —ܶ~xÉ!®_ÇB w†Ô½üX}ã©GºH  ‘´¹[Y|zi¬×$‘ dÖWA3aÑ*RVRfl_Ûžò~úƒO0g¹F;Ý¢c¹¶ Ÿ²¸r°wôþ£{9Ì¢k¨‹¾wâè£*«±pë\‘vÿ„zù9Ä$w 4ìLO»dŠ4ߨ«[8Ø\Nàøñæå{C9ÏÕY©ˆ=ºúº§úYœÞ¢êÙû=r õ_üjm|©\Ù÷„²Œ5u-z”ueÜ´æ)~¸Æ?ÇtNvŸÛµ¸Oªn쯙ør»P Æ©I Úß^Óiü”Âb™tüÁãÆEÏ&ÎÃù7¿ðÕ óÝ¥W#— ŠZ¶À0[¯F²‹öMMùÉP^Àöíç;T¤ä y‹Ó¡xG¾qŒ(ƒâžØÌ;|NÜ5ÂGmØcõ™T%ûí uÕMÔ¥cvà‚wë}áÎÅ£œÝåÔœhß;´5îHi%¿= Scrך6;œj`[%Pt8êª0íYNáÖ ÀòÆo?¹ ŸroBLþ' ¼XÛÿJ‘5ÄÀ¢.*÷êl+µ)Æ%MœMZDxÄï¶Àla”7U¿2ikËîö ÿ0z¬’H4¾¥ô®Wóˆ'y‹Í¼HûT˜b’êÓð8>D:WjmKx?3Èþ)†äy¼‰Ý~U'SØÌ Gòg ÀÀþÔÛÂA×ÃþnÀ3³â¯%Mßªæ ™4·P…{«Ïí:wµÆÍáa­€ïúžM“ >¢’ŸI®’¿ÿX¡ïÖuRõóÜîͽXû¸Õ"t;AfÓ­ÝBdž—ƒ< >EkùXøú÷oÌÕwo1Ì9-òÇHKÑ ðz<ûd÷Á}{Z½/:¸í¢®×JÁ€Ë`3:¡ïί5:³|<Í‚ýCÚ/B8y¨H§íKß÷ÇΔ¹÷¥Ó¨Ñ$J PÝ.}<óä…¼ämÄ­áI†Õö¼³ïk<±Ê{$ËÎ+b¦:s`ŠO„ƒ¿ƒ‹Ó¸óºèD—z$92ýå6hÚK]aýcÉd8í~Ýþ¢r´s¥YÓuu•c󱟻.Çþõ¡aúC'¥®7ªY¤õ!<Í$.l¶Ý!²o¿ï$$ž9 ["0 9øà™vÀÎsE»ÿ©/û¬ˆ‹„=ËO>ØÜÈrðs²ÄóÀ“ƨArCöÆöÅÞœ@Yßm¶ãb9oŠÅ>.ïŒù_Ý|LÍ•I¬„{ðÌŽþ{¬%¶ ®xvý·Zb‘'"kŠbsýkaÕ¡é}oRÞÙèßðÁÇeïŸòÐûZÉWl»‘M ´T?a÷¼ûQÇËï㊑%9{‡c§¨À¬GvÛ²¨­îN_H¼Ï[vÇ ¥7®ØŸ"‹øŠÝfpô¹ið %¤öžyÇsŒ¸Øô¶ ¤|¥¥—IÛsúwy®qÖºE¥Žîz§qIGÌVs÷ÄIæ’PXxú$vÈ)²îä¶úÞ+Kä‰o0ÚºŽ¬¯ÂãRr^ÂÆ¯F" ¯k Fâ¨â/S¦‹x‡xç^ÝSHÎõ¢(㈀ßp/K“YÏpm|“i§µÇaš¾»H-0äà¥é÷"îp)zÜE¢>cpôn8í;SQÒÞ^÷º°ÕÂ%<ÅK€}Ÿ¶ÆÏbæaÍ_óÉ·µËxó7º“6µŒ-ô&“9ÉH‡³jlÜ™é'…Ttç.$ ½¹;sÿ-Àû“Í£…-†«º þË×–p/È"£ÔÔÊ.²­pXž’ð75Ö«^ÆÇ)Ì}Ù/FÉeæR³}}>Ô5@஫‚Xá/Žá\¼5¡›ZÅý¶æB›Hî¸d#­ìýXˆÚ6°ÜŽ·`,|yœÉð»0 ¤'®[|2·âS×ZÚ}áæSl²ÆÆÕÜ‚æÃyaÿX7½Æ²g\$%Þ_ûÇÖö3{èf7S`°ÜAÍ÷Û¤8iÝËÇpâu꿊ûb³{šQ/¿¸I±9ÑmöÒµ9¦Ôéýñ·oÛm-íœO'îÆJ¬Ei”y2Š®öì-Rl|ž¹â\8¼ +6'¸Šlªvßino~Cuâö¨rvéÍÆ')V2@û-¾ãV]èÛ¦‰‘ØÒ¸˜«m_ç…Ú¨µRÚ¨ƒ]¢^¢ýü¼¡ßw´5^êjØTäâk$zYDʧ;t\zçlSm”…^ý¿>ì?”„•ñ5¥>»I3F_`__§˜õ|O ÐNLxÀ”Ü"°H·vbÏô¶)â§7£uÜ‘ç…øø†"oñ‚&Ÿ§Þ½n0á¼”!s6xI ™ƒP@ÞMÈ*„;P¾ô5³D4;ÿ‡W£nÜ8ìÞ²ûÏ/¶®qAø«Lp¢‘׻ϼEùyÛ¾Éyš7œè=ØKB bÔÝ)i¶”_µœJ´\[/mÅ5Qï\ ‚Ø&ùå»d—_«z ’ ég²™<™ƒ€ÞÆyð¿ÕÁͱ»öR逎دQ? €{K‚›LÝÛÈnË'œþ™È 7î­—RŸZèêöRL'H•ù@âlÙu^©X¢¥5ͺýÎ&=Œ™øó`û—@ÐËîƒTr·¢ä£4ÈPW‰¼ª=±?°si>Ó2ouäÁʈ!±›[ö~ò3:Då† ÁSv¶çwˆz{‘»ê#zäƒFíQÂTÔ€,ÏIiQ¼,eʧ‰Ûw#¯€–9í>z·bÑÌæ):É(Ò€^¡åN½@¯WÇPüfmõñ"Ì„âQDÞPÝÇG¦ßö„/W€Þ‹ŸïÒø;ÌW¯(× S“ˆpnªñ7R“R¬;›Q@Âr÷©NÕ䉕˜ðâ“þð¾OÂÙrÓ à9&CG ¾°N—ø³éâÝhb²ˆ }I3¸‚p¼O}š`FÊ ÓâlÈ:öÝmŽ"RìÊ£ Mº6‹ ïÑÏw¶ñƒp晸«S!ãt%¢?Û¢âTúðÞ>&Ïz.Ù˳M¿» þˆà“Á^ï¸Ëˆ>À¿ËåÝ4;=7és =þÑZb@dþôã«»WÅ@whyV‚ÍA*ˆ´ŒEÍUtcëe¶yɈÒjÀqÔô¸x6Lš SÃþI]wáCêõöC÷´‘·Ü!Z½Þ‡í=rÏÐ57°Ä/Ž_5_3¸S[ˆàyÌ5—r8ÉÈß2,ᥤŽü7B{I’¡ä¹'ãüí¹7ÄãS„:¤#øy˜™‰î5œ=§ÈÒ‹á>’íEFè'+…8œ¶ŠA·ÆHHc‚w:~£bW„N? X·É-%¡¹LA€ß¥‡eIP±åKmöžv»ǃ{Qt8É/eÄV 'øhôœÙqÀíËV¬GSÄtaOyÞ¹üÀ^ð{ˆh­(ûsi¢$œpòÒ˜vNÀºEÚkFÎ+#·¤ØÙ_aWi G7ô&5¯÷)Ͳ›ìÑãØ<{Që‹]Åg­]|®ælN‡‘ `î~w—†¡®"ê¨qBÌôíÎ+Ï|o~Àe–¾Cÿàãsw t±Ì¦#ðòƒ:¬– bU&@ª…¨w^½—BªHë2ü«/µÐ¥´;K?`X\¸ÎÏv}”šƒ;!"’5ÙYÆÔQ s™ÆWq¤+SSTRD†ŸgÚÝ@?`…©XR ˜7›ƒ°&..´4ûš§ñÚaع'G»øÄw»í0ÅäCßü JÞJ¬Šír´êª À£÷y—P’1s~½É~zI¶&!x//ú}еE³7¸Æã@”Ÿ”3@leæÀ[Ó WçY^øÎ?õÚ|ä6«aæ°mÒYϧ¹WðöXöøá•"ßìžæµƒ4]H!UË$—y.õLñpê-^XÔ^šLæÅ !ÍQ‚&é~­Ð°Jöö-öX{"ýŽÔø¶š¬’fåTYÎp¿àj¤£6Œ$ ‚NªngUxu0õ|}œg"€Äꉷ<6^ÝCFN<“D‚Ëxß…Øk…«ÇA‹`¥³3)¸X€>)n ÷MQÏ0¥&{¶n˜Î­üJH™éÒ4ÅL¢5µLj¤ìåW9 LK!‚Œ†ïi݇ÔceÖr¥"œÉ‚¶×Ü]ü=»2ä×`æ8™´´Fo™vvØ]3í"ì¤äÞDK“âäÍMŽÒŠ#SýŽÓ.V+#^&šß¼ˆð4 »|oŒÐhÞä…³1£#ÿTaߤK}˜«ü¥Ñ>ÛLêïGÛ”pC’lÊq[)ÛËãèßwfFîð->XÚÞ ïŸš†¿Ø´~ùˆEé¢?Ê#(”¼YÚ_[êr·ÿÁQléîvóõ !Cø@öMŒq%Ë·Z {è;­{Í'í”ð9ƒ—¥ñtRBÏ’(…­ùɺ݄»Ÿ·¸ľ™±}YwmaÃÀýž3Ù§ouŸ›æuÁò’RªRk »r’áÁ72ÊÂŒ¤Æm_\oM^O9¥ Áu÷^é =n®,ÈØfÓÌÖ}/§âåáôz‘̶È,2€Aù‘щѣl©mœ ¡ð` ðX;*ÄtÒ(Ì@’u"¬ÓÓ%Ü?äWiƒd”›°µ®|Š™$¨-G>eµd%çç9XªåüÏgèô N^nw·áýáØÆçˆ$G6÷ª< 6¬#ÅèÞ-XjÑ\gHWŒÁ±•£» þ˜þ,xrÙ´øÖíÍÎÍ1'ÁW×MS=<-„qwÒ—)pÖ)%Þ ‘îRàüq«íoöh8¨¾Ñ8Aµh‘á\%Ö #ÅÍØZØ k¸D@î8Ôª÷AÛWÙ°’ŸèwšwulLEtÚÙÊ—Ô!GUŽ üö“İqœsÖ¼&éïa2W]àÖˆˆÝ‹Ï%ot±((Íb*tÊÏÝ Dg²[øA€}r¬p¤ÑW#«þ³Ù½gIJ‡·ƒæL?PßQu/î‰ÕjÄâFêÚ* »öñgm†3:·Y=.î¯q¬×lÁÙû©¾p“؈Å)8ºÞÊÝ×܉¢æ»|ç‘÷âe€\/ 2ï«Z¨‹Ez××ßÓ~¡Ú ›—F/U˾G˾–ˆpí'}쇅uó.€D€‚c­ãX_Æ¡&ÀÑ^¸Q p4× Z ¥¦°øÐ„¥vЃŽâl>²yF½Ö€Ä‘åLš6©)TÂD .ÙºÏ@¾Ù% ©nÜ…pxzpcpŽ „÷Ú›´U¸E‰æ>lë^%QA膂‹Nª3wEñ<'5j°­‹•‹™™^éyP,Y $¼Aƒ„xY˜Û‘àL§Š~5_]ÕûÚ9O®û_fi”Øo4Šøh¬¾Åþ'ïQüO_¿Xü‰]ü9Á`Äëôýó¿nzüóÊßÿú¸ÿ vöþÿ_çÿ”òGùÿÜÿðKþÿýSÊåÿpÿÃ/ùÿuþ÷O)”ÿÀý¿äÿ×ùß?¥üQþÿ÷?œËÿ¯û¿þœò÷ò×7ƒÛØÈ:(?3·3ƒÛZZ‹ŸŸrÐyfabhýÌVGÇØneò?9 øožÿãäàáábçàÁ‚±sprþuþçO)0C8‡Ì€G‡ƒÏn¨¯oÈÉÅÆÁ7Ð3àâÿoÓ÷Wù¿[þÏíÿß? øßÙ?æÌÿoööhûçâdÿËþÿŒò/ÎÿqrþKMµ€›YŸŸ”câác§fgç`âãþíÀ›>«¯þ¿ì.ñÌø™-Üì¬?;çNn¶¿ÃÀ¡÷_`°Ñ·6´5AÁ_°dÅ$v*)®aƒ¾ÅsßÎ^ï«°w²œÔ'Lšzš»nf5IÑ ªÉ¸w3œ¨®˜î•tî9‰V^Õöhf(TýÏ>ãºs0榸Àìû“†8™óD»µ5µ˜@a”·.~˜"z*1Ô•GæÈÄÒCù]Û~¾gB{!æoîáûukÍM·õ|_4—ÐÒ«[w}ÿ©{%‰[NË­sÄP‡K§k,gùéyÚúªß,žz¥Ñ¹´Tö 3œže_wëLãS—Ÿ5?È>P®3˜ê á:çÀtYS½;ùã¸K®lnåä g=ôñˆ}½‰øsÊÞ‘žÚ#öu»ä Y—­¬#eÝ¿M‚¥ôq\+²À†ÄÂÜÁFR ægpÝðÍRíi ®Œ|Md<újù¹æ×˜Vö…ãå „üË©©¡ x˜à©ýÌÞgŒ/| húNèwÚ}sÑr銳Â0Pa8ØÕ ÕÂÅ•Z| 9â„zjüp!¯ž˜ ÞN²+LµÚGwx·…¥`ÑJ G¦¼’ÿ­.1übA¦<\¯§Õ¼‡Æ·ü¾˜Î·þ+eø:Œ¤­O¬²Wáá¤ÙŒ_Ø•ö®Õ㟠բg2#E륽¶š¤ùà•´Ú%ô®wýÍÞ?Æ’R~‹ká?c×ö¿p ÒxòZÝçæá&Ž{¦Ì̬ãÕGÝ¡küø/•MÎ-A]Ûq5¹¸ôkÅþ |©XÑàwÕrS9[ŠVIFÎXCš\K¨‘üxè–v›ädœC½êa:©Qó;¶_Cu¹¿7ÕgÒ$Fó¡ìýzî§Š§VCÏ.ŽñX„Ÿ“F¦?!<øò ñY­¯×€ªô7!V×Q]ÑŒ½sµøàúüït#ùŒj!q:Ÿö”€Vý-<âÉǪ´ šÜèÛfID|FñYnžÑ§‡© àí’+°NÙÃÔŠÄCŒÔr y…"„+ _8e¬Åg¡urMÇþ[/ŽO¾ä":À„’“‹[Tßæôý¼cÏÜ»)1K‹°Âð t·ò-¼îÓH\'nÀé ÔyOМƒjþö̉ˆ¥š(Ôh9‡ÈœA!ÜšÎe:ƒx­jõ›ä‡áÆÞÜ?øyWuîÙs³üâ’ýpÒ{í*ÒñŠÔbó3å*,~ß'@˜c¯¯”Dz¥ä2[; \:ærñ µ(PÀbòo é·CLjÐû]ªåê•4´k]ýeºÐû¼ 0«ÏçÐÿè(ãI_¹MpìFëŸ*LðÛ÷ëJpøk‹3/‡îÏJÌAæ{jñ}[H´E뽜{ο·F×&¯âxø¼ ûlêϵí÷kn?©”=· wrð;ó ï×˺åží¼ïƽöª“Ø~Nª ¨aK<é¬p‹šãÑóXÆ® ñæÃ/†ƒÒN Áô¡uA± h1k“œÕX3óë0Mô`ƒ+.œêÖ{þ[M?NjU†Ñ\xˆ¦Ð:E—²vI¾ïl¾ÕÄÉ+ËE. 3!ð5X饣V4&ÎÍãΗ¿7’k¶KwÎü›5C"¿ƒé…35ÎAî+5Ÿ™ŒêkáVu$¾ýWžÄRòÂ"R]Òn¿èR“åÛs!”(í¹¹rd÷pW™×ŠŸê}‹@nMæ-•ųž3W¾ËŽø;¢QŸÎõáE©ʃeÂîý¹2íµdû#Åg{Ä>%¸sR²âì¹vhÊs¦†o87¤Ëfß“R¾Ó]9›Q0q[u‚£:üLKŸÉì*I òÍíkËŒ‚ä®ó«åGåçî?¢ Ašó=ñƒ©çésªÕÊi¶ðì êgM,a å™"Jÿ}(v˨ãqðoFã«ŠŽ“úz¾fí¢s/ïXæõ,|?¬d¾û=·ô‰Þío ³ËEj«üÊÂøsäœz •PIÔìÞŒ§,¾úxï©|u¹ª¶F>©¿Mÿ[›&jã^æÉ)Ù—‰³ mݾ-§‚å,'k¾›R8‰*øu' ïm'ÕDÆH}:Ääbõk%)OÎyâûÆ}vÊx ¢Ðùͱ²½ý!žªš&‘ ”in;Í’{mS{¯ EÜ>’T1üùù¹ Tà»ä5ÓŸ÷¬÷F‡C]Ì¥´/>€¾Oìo{A¯ö9чß‘é_y–(8Þ)<ás¨Ž|µFÈêà óŽ;Á6ØÉ÷ò“°æôƒØB")á b§,ÃzT¼b71×,œÛ€NÉ’Œxswßô' ‰‹óȳ9NÙ‘¥Øã$±H\K±)ý΂@¬``C-WÒ x¥ŠüÔç ]…º‡­I»³B?z÷“ÀO€¹î™Ä{ø#x.ßü/&pÏ}97‘æë]¢±+o-Î *›,À=„ü ùÙLò‘µ5ØÿÂm‚¦OEíùþT­ÂH Ññ°yê•Dβ‹xC`n'Ô(:w§fý÷:IçÁtýö‰N4ãÉê)·o‰¢ÊºŠÕ*»@gÉõ DÆkÔçÁ%Ò·•ïY™9˜™9ÎlXReb4 ÿ¬l™÷®^ÙqþFÃÞLè&nà+?6ûdó¸Ž:œ,Ù®Ð÷sìLëøškù(»ÖU»I9:@òü¬Z…0Cß1”£Ñ^ÿF;,þÜYÞ†Þu 'û1Ü®fàÛFµZ…ŒŠ ¶q4«š ùžù9ií¸Ô.«ÈB\¹×¨+úÆÈ®âË’ìç¾Fa_ÊÈ×I7Š,[åP å¸VÒµN»ƒ4«ù5Ç+œ”Vd0šìÚ"&ðª°âûk8É+ƒó|Ë£Bë•qAîB&>ÀÚ!UM4©jẑ†FSS¢.n1pœ-¢ÂÃÕ~ÇÖ>ÿúO\åÕ¤‘¾]*RAKÃÉÊQ±+¬ó„c@}ŸzJε˱¦ažæCº‚ÎDoçwRð,½°Lߺl|¦2s¤$¥+äöÜ&¸c<à«örê)&=ð‚ü¡Vgù‘/Î(Uð¬J-9!•=p²¶4©PPÜs;ñÒ¹Þ=ÿþb÷•-¥NrµŒ¸ìYRl›ü©×­—į³×=Ó|!Lò@W=GSæ.ÞYkÒˆµIMÁ†Â6[5n)¤îp5IŠ÷¼õñðU´+•Fj¢“̽¬MÃYЙ—Uceš%‘º3¼C¬·1V¶š3/ˆ|z–\8ÉèîÏ]í¹p?߬/µàžÇ#ý{ ÕKT8ÿ*ÑàrBéBYÅöÏFB× ô>T—Î"F$)±ö#š#è¯tc/’—†t›õYå‹×Ÿü´“«Ðjzë"HÝäJü“šC+™ã9º3‚˜‹²‰ÜÀg±Œ–õHNÒ‡UPr ×¥Ÿ[@ëoød´‡p?âõ«Åù~|óÛ¸ÒíxTŠj®¦ß•¶‘Ìöüv[iبõ~]IР³dý9%uHú6‘ì·(@#›þ2ÃéX@ˆrôt§šÞÇÿ6¯D²€02ôÂ)'¦Uùëgüû'ö¾Î§ioÇ¡#¡†}JŽ?”âýøp—Íû>ÄgøæEnùO~$»úÄãÌöÐÙÕº¸÷qJ­œ7z —x~élêÎØcº¼«r, k#h滞/©aµ/·‡¯h-ß3þm˜iÄTQâl:ìþ*ù–ôÞ>_ª¶ãG¯gõþÅÎÔPÙÑ™ØGõ·‘²×›a©·¯áž ÞùÝIºÉ\$¸~6’¿èŽCJÌ쇸þê&þØÑµÙK²*‘õÖ[¬åX팾Z;4wªuÔ=³_iè¸%‹Xs ιwƒ[¾P¾}¾ª‡náÉó«fÛX $Kž÷P¸›_)@Öb«ªýüε©|õhzñÜè ÝPo´>ã•"%ç9¤ « QÇR]ð×¶NÀ S®ÕϦþËç>)tûZ°–ŽSä7Oø;/–þÛñÎmÅ_}Ó­6Ï<«g¦úÊoYÈÙ§Þƒr]Ç^'V‹‚ìê®ò3¿z Ø`RÿLvÿÚóàÜ'ü_ž¾Ž†Ü!ÚLÂsü [Ú4báyŠƒkžÍB"…‹CåX=CÄ9†¨ë]¶Ý3¥c:{¥äŽ»ú–6jwxιÔ)Ù;®šÖzÎ). Aëõ¾¸M¸§|Ä'q“áîË és.e‘ÖO×Áž½W‰sF=;9?‚',àÖ¯Æ 8Æ÷ 0bÁÿƒøœ÷¢°ÿjÀƒ_À{WfKÈAxçƒÛˆgqŽ/TŸñNÿQ—ñá sØ9’0•7˜ .üÛçÿû¨úÏ:ý—ÿ(ÿ$DÓ:†±âƒ×GÜOC­çç"ÛÅž$ÕpØÓ¨¾w£y¹ ˜1;:|3;ñXOvå"…½îƒáß$´o‚*ì_ÒäïoÚÅœcL|0'´tÔ¾éVû\tqÕÈ]ýÐk×&«z–¥BçЖ“ÁBöÕ¿@$ˆ×6ê+Áíù7ˆ°mª®Ì?- ÒÎ ;‚”¤R Ñðmq“8Òݬ–“„Xkz¾”û€{í!BÞ„q¶À)w½åièÔ²jD“^°îP `I»¤ß|H(ÃQ$“¦B ²´ÉouþgR¸ ô\ _ÓŇ f씜«½2*coaz¤(Äî<Á|¦œºóäx¶p ò¯´½Ð‰qÎŒ}±nük™'£½·3Th='{4Î×U{¶O Þz£]*x—j”ï|Ië„zÁ3\e•?E@èr™tã·f¶ݽb›½ ôÒäºÌ{ÔVFlks¾ñgth#½¥þ@îw!ÖÕn²ù<Ç“R:na;ƒÁöwÁ¿- \PŠú#xÊ jPA;œm$7Zs N¨!SŸV?e#©¸rJêŒÿ 8;µXÁ±/nç5aÉË5·yæÎW/Íãî/Sγj]ÃôÄ¿dS:jOu£v®¾¡ÓÀŠ×äm÷¹ ®"¼§æV¾t[¢f‡d­‡fϵÔIˆÏÔåU§7ü" i9¿· º$@`ãê¾·…ב¿qé^oÆF±ÿÉoô‡kÇÝë±»¹Ù»ô¦“Z£ºb`ý­Šj*6ª –;Æ%0›j޵ߕŸ;‹Ûé0í¢=ÞáúES z.m®žÎðØWÒ y3s‹3üÑÝkß¿à×€ûÄÉ忱è[Ê_#ý3¦shüˆZr¡ìúFüïÜXÔê$VäŠS·o¤ž;ƒOéÀÐÝ‘© _ªÕÃê*ÑŸ[â¤ÜÅzÔ«/L|.Õ«Ia‹c…*j]¬‚æ%éç\ŽzÍÜì|Í<ñMòlÔq„Ìy•_¬q¾ËâÛ‡'lfƒ¸™·>€_4òëÌy×µrÊ™‰)ËGüÚðXdZZ5³b!NF/i~ág—‡ájU(Ûž«™½ä7ï’¿zŒåïZüzø'¹H¼ÊÖqÁp®iø<×Hög]ÿââ0(G²%ˆ³ñ†^íý­j ¹Éþ ®=ÌW '¬{ññ|yµsѦ9‹HJʘ,+·—ù•<<‚;‘½ˆ×f¶ÿp–G*l"Q"b ]/gMýBš[·ž[Ò…§Ì*h7ôûÁ½Ÿw¾‡… ¤VÊ•Œgj§ˆxéîǼ…´•ÐëSÈ:ÏZÂùˆH– “”ÎGø¢¿õz ¤ê m¥Gÿ«ý’ð$ÒWÉ_>¾>Mh×ôQH …W’ÈqPÑ>©]ÿ˜ðTq3Á‘¯½¸*>¡odÏáBêÎWžÍsÙÉ•»w[&&e„Š¡œÖv†Ñ©šÓ/ó¼*¹ÞvSç2gÖ ±ÿþ\óÑN¦kø…Ú×vÏÂZ¬ë/…-Ïõ]a i6‚‡ËfÒíÄ*h :ùË”Ty)ðv©ªrKê¯[¿l  ¹é±¶þzYLUãR€ãÎø ‘4õ"ù0žó¹M+ñþÖ¢¸G]Í`|þôom™œoœ°œ0N5Õìβ^z±Ú5x¸§Z ¾TßeÜãU±Á—Ñ-9Ã8@ÕFR/ó£ÞQÙêÐú¸ jvª‰­c¥Ö}K¡êB²ÆBüçwl­l.^=>xƒ(÷D&`ƒ@K€‚9ô=™ܵVA¥z ¨šÞ9l_A©{"G/£n‡5yŽd9a=‹§gÃ%~$y ñ•°fmc\©ÿ=”Õ¿šæƒÊM¨æ46šñ‚­×³X`ޤu„•óõýK®çõ‰ÃÏ$P|àB èÛ¢Õ“ƒ¡Œ‚ÈÇåW‘;»³/Ï š7Oawpf³Î¦z!£ÑJý™ ŒÅÿEpBœs¥ëP•<˜}Q+ÍêÊ¿˜—æsmGâFA%K1Ô&z>Òß•¶Í35yÎױ辒—‡ÐQÆvƒ”_|ŽÒ¾ò1ü½nh‘¡û–ßOÓo‡+WÀ,ähZ9åÚñúi«>VI^_ýõ.À8<ÇÅzãÙ‹Ñ×»H›—öNˆ‡ú(£ÃÍTË—«YÈÉÉPW|-ŽÏžHZÌL«7Þ[ñ¨8¾QÏ[Ÿ‰*zí@– ŽŠ8å7:N,#pƒ´‹Uö~|UÙFÖOýê–çg#¡œ@èÃë‹o}oU¾vÊ©xÒìÛ×¢HWCk4®«¯k¸Lï´<,3êMN%ÅPßqË^¿òg´âá ©²ª‰\q õ<ÞDjN¬zL+Æe'“\!Gy¡Éõ±z®=<ö½n}œêƒ3J|oŽàw-j7ñ‚Ê!xc§*4ƒYy AßóÞ !ðÐìh76€ÿÞ¹|Pž%}B‡ÎRÐk™QÈv™B•Äß9˜Hs8{¬of¼Ð)µÕ¬n>ÔÅÄ[Œ Uyž\Â]ˆ^ÞM,¡Þ|þ)ä@xüC¢ªóç‚E7`k*BgÆ™…ætxk:9:î?nÚûâ:|…µRöjÀêÎIíþ«„ö0ð\Ÿë“Ü“OøâªQ ·iö…'zÖ'ÆÇ¯bþƒ†žšÍ—}áÔû}7¢6øó^ì7¤V £«CÌ?Å™úÒhš¹¡Ü{~rE _6”Î# Æ¼•¡f—N•»Áê»íT8Pª ™Y<%Ë·@<Ä:ç™ßP³©R•ð2º¼ Û×ÄPö÷¼Ó¬Ñsç‹Ö\g…šáBß>bóÆõS&8uDíþë÷2š‰ƒÈX³.Ÿñ8Ï@ñ_9ðN.V‚£!?ባO­àÆâRu9q–tÕ¢û^Oª×)we´‡îL„ræ¨ï¢Ãa‚û\u8+aÇS;ô0Ðy•Mô{˜ÑðÔè9Ás'X@UŒ:^&íÄcmE*TñŸÛRÜ+iMŒáРy%$žf5ò›)äò`§aYÙ«ð,êÿ~[þ¾匩VÏN xC°¦Y!ÎÖ‰€ªxgæ±…¤¢»¹[\»%üìiaÖ‚ë||ªu ó¢Æ7ð7¬·Ïì÷¿¼Í¯Uýcuzs ¥Á“¨‡î•Ñž¦®®‰[µê61‰©_ÒØlE•:íÄ=Ÿëz±øO‡c¤–{#¿O":ý­£«ëMå8g”Ð$^ç‚oæu‹Sã@§½RÄhŸÉ}ªL¬ãɶ·ï£Öý%x'``*´XïÝÆÃ9•à™ÇCûÇÒ'Ù$¾È'hžÎ; mCö¿Ê_Y Ðá§îß ¾wÓ'ºbš¾Æ~u.>HOäG ÍÕ_`l÷ç¸7z¸ù-’wr¨“‘1ª#ÓǨWzoË).’ÒŸLƒvÇ'µÊ˜‘ÑXÖ§9ÓaöR /÷¿}[oЙ¯QÚq8NÁP¥–Pü)‹ª_¼pý¦Àϰ-)ñÉn‚lk†¾—xîŒUö„¸+íº¶óWÅýH¨ÆMã¯&9»¸û!öÝ©¡‰šš<^Ÿ[Ù³wûî6E&Û¢rO 5²b;\-P}Ä9y]‹9Ðn‚Ç6 ³Ð}^3ÑbnE´7Ø&žM:>œP;”ìl#:®§§„:Ý–ø9’6âK/*¸¼g5#Æ0Ô‚¯ÁŠ7o=dÍò&¾©Æ]ûÐ,ÇË@Oô­3ü€w(,HHO-8#§Ìº|x³ˆC„Õ ó$PA¥SZ|è¥cBåÑœ®-Õ+ÄáX%:ëGÿuEÇÞxM{%Ôà$kßÏÌCÝsy~ž¹Ý¡Ð+xˆÌ"ïšõ×m…a4s\%O6ÞÅ;WÉIW|ÄÊ…ÉÞ‚M$¾[›öô+wI 8ã¯:ïÊ~‡pƒ5¹´bCŒÐWž8Áu„RÞk8:£>0šæáO}¡µ-a »RW&~ü|ú[£IbÑ4b³Àæ»­eUÈd ÒýËh%:åSvýOo†tI´Ncc–F;â€ûèDüËD|JÍ‚Tx\n2ŒuÖRÖÈåè  ÄZM2é— šâEáз˜Xp™n Ùéé£àÈ2k|Ó>ÕŠ=ê€öž_“+Ñ‚Ë mËÿ{ï×TÒÅ »vAl4+DÞI¥«€Ho¡7 Å„^d-Ë RéUzik‘."½‰Š Òå½ ¸Ô]w¿gY¿÷åü”$÷Þ9sæüÏ93sfî½ÛClw‘¦Q_Ÿ}‘“ƒ%®sÌsS4ÉIîèçƒh1îÒú´Ïâ³èüq5š—¿O€eñ8„‘HÉOüP¢)ˆKýZ¸ºjþ„|áØk£y÷è7oÓór¿ñéw¯¤ú„K2•n‡Ž¯%Œ÷myË£3|SZÕÇZº”»k”¾{g…„ûot ‚—§µ3¸'Ë@;½Å?â%ïY³Á5î Ðiô0D3]NkÆf·õÜÆûŸèíó™G0{KÛuà?²n`T«BÄ ‰Xë­D0Ô?'í(u)Ý=eÛzúŽ5oÏGýÞ[|¸7Fr'kÙÍcÍ^¨šTö-¼6ùÖin”qq¹áÞßEbnØr¿×ëp¯¹äÎûOݸŒÏ“T¥e´ÜƸx*Øû“.ÜIïÙ‚ˆØÄm|îñ³;Yê/WòÂ6ùŽÿB¤=¬ðäfBšÏ‡½\ê°5¾„_ˆããç0OAIû÷×­c¨SM¸wÞ$³û&¤wÔã–£©(]~R¦ãn¬_Åi’X%¬u¨ïÝ™‹=ëvñYÌΗîõºÞ»gJJ ö°®Þ6ß–_ˆ„1¹óžO*‹c7_Ýù¡öôý+kˆã£}Y;±<²½§v>F¤û%ÝãhÓ£sÜnRê,2Ü£¹¼W>rJº¯õŸ&ÙLIåW¼­­}éÞofsjWt{à¶ú·e_\È+£iòf¯lÜq¡V§äüZ\6Éì&z4·*4sò ¦ÉãîÈ/ŒC3¡Îµ³˜qþn}"«mª£_Äàkgí½žGMÛÝÅ29$ +ÓåNdƒ'×âqÇëN P‰´—ÝàUÏéwôgÓ>6êE”g+­ Ñ•ÐsôIU¾8Ëcr¸Aòß)xû3±ž–'wºäN7jTe­=ß±#®„Š…‰¼¹^ú€ø(r{ª1ªäwµ‚c®ÛáLyx¬ãžÛÑ qïå6pPï]+(äga*o g¨<ùø¡`xŒ#¶¬vÃ<$áÓs†¶Ã§}C “ïÀ‰ùgeK¤Æ,¹ñiÌAÝcÌž"<ûÇëûÞl-ïô}PõjûѦò7îE›·zЧ_c‚Ò˜=ßÇ2:dl< ïj?òH¼Ì0û£Ž ‹üKË9¶¡§J\-©€ÕûgŠo¢ŸàÃM]Ñ8VÄá8vE^>jt·z€ ÇŒ¦ …nWx˜)7_oûw#ÅÕ-Åžè÷ªÇDx­<¤þ´Ï±–Fo"uŸ7;=Tµ»?‘3ƒ÷rÃ[Y´Ð«§nEMõFB5°y&xǤ…º[¸ÞЩJCOiîTzõÄVÓUQଟ8cº…o¿ç>=ƒp­Š˜OGŸBEo÷º&#¾â©:e×ím?–Ð4?ò4ÁQ Kî54*¤¨PˇýøQ ç®» é˜LÝS/¤\ ý.oòÄærŸà¡<Æ ƒí¯¦ÈWVp8GÚ'M áhZD/dž¤‰G÷WÍs»{&¿ MÜF´}½?­8<<ÝÑ{›žþâ X§E¢¢rõë2ú 1ã¶šú43‰ÕíŒÍ—9Có&’PŸÚç1Ÿn˜3–õy^ÂìÔT”Ÿ8GÒ=%&–(¨«Ÿ×ÞÅC£gªi¯Ö4¬½•é}+³ÉC£UZ£ÕFŠÇÊËcaÈßÎo¸¦cÑíPé›"î/nß«6:ýdï½É[:@>¿r¯FaÑ<’o³ ‹:·œ5»q7~ݵ›H±˜ê oÚÖÍRÖ¦þT ‰d„ññt‡\¼±Vy˜¼¯¬W<Ï+…ŸM5ôzñbä íÁv½‹ÞúöXͱÄsÌb”<Àº”_'WCišïÆpq‡±5¥£lÌßñâò‹¼PO5hä]ÌCH–y¬nì^AIÁII¼8]­b>zí̧uW ´¢R2]+Yó¼ÁoÄJÜN±FPö•Z‹Å"FËÖDVŸ˜å|efúÎn\æ ÝË¡›µË3íg…‡Ç*¦ZÛ~•9Û3+ŒpÍqÑÒ™N‚º²Î=„ß“¬ïˆ)¯‘é·óØfg/n­™Dÿ‰¹<>ô÷j•M• •=]H=Í÷Ü ­…}Bà ’eQu‡[g¼^Ë'§â\Ÿ>H„z”†Uˆµ6êîs5,ÚÕ§®3êé\CËb*±Ì¯¨!óŸÖÅ ÷4ÒO]4Ú‘Šœ¾è¾ÝÈ·~J}J½­mX¨¸ùã´åŸáxwrµ|‡Øœ›'ÿƒñ} iìðo&µwçÆXŠ­F=e Si‘HÆOù®e6¥ÓÂ¥ƽ=*ò½ª/5&h„Á^ûÙÅ('˜››8vÄäÅeÒou‡~b3ù$îÎk7IžPu}1yÿ|NõôàË+=â8îr0#,Euø™†|ƒŠ »ØÍÔЗð~¯‘•VØÛ×÷›1é¦nOÇFÈ»¶_øpÅÓÎ÷ÃNÛ 5½ý®fnÙáã­~Æ@8¿ŸŸ\›]K'ùîM_  »&ÄŽõåœ*Óëäò±KzŸÏvøtH<)½5)ià‘ÂxèaÛµ…0d˜;qÝ®T›ëEEaªFG:¢{»ýܼôxn&gjÚ%g¶º†ëˆ$dj*zÉ5 ú»"LÛ´$ÀcÏ‚ž™…’,ê ^>n…E³ymqûnCg*`v¡º›Ø#уÀËìçl®ó2›{m%S6úÊOí½¬¡W…9M”¸ê§{„µá“ç²Àò¨R±cE M†ü­W…ޤÙö&Ñ—5 ú\/”×å˜÷¢óù8'ÍayŸE³5 Fw¨.Éü ñ’Ò“¶ž¥[<|i¹qÈ0éÍ„—íµñ³U/ø:ÉûÑϾ`°ÑÜÔr÷LPv¯«¡óÚ˯vû6²Ìbé±"zöúÚ…–5ûîÞ>‘MzßÑm`ªï1X Ê3}O )^ÄdìdêöØ-ÆQÔŽgSïjy( ÈÔù`]& 1»£Å÷ga¼*%Âó;‹íú´[£(¿ðšÏ­¾y  Ëo“çV?›~ÿHµËÇ/4 ”ÓúKxXëÜŽøäï¦u(ò‹ÁÎ>šŸ›…0Ýì¼¼i55@$}ÜÔ5^K´@¹k¨–®'¯>P+UiÆC¯›¡‚º75¹ùí¦Í‰±@Ŷ¿»µ÷‘–§E±'/z£çoe*ö:òK~s௱d™Ç½ªógñ|5WG2È”Ùçõêò‡Ós¿Ý[\¹\ÜœTß“W?­ ÛÛ<1«·áÊñ;sõN—•¼žn9{,)ÓÓ»<Üßáò°û®¹·}8ÆD=ç¦äÓ&>Á%ÙDÞŒ‡º_5$‹œý´^áÐ4ç~ñÁl–Œ|>‰3¯?™Î4+ŒtŒc¦ƒíFì`wïZš}Œ ]u­×‹ >]«Ü_±}».ÑÐ'¼(œFMØè¶•QïöZ«Ê˜Jy£¦'JGPžs¼s¿Ï?áôçd¶ÓQæÛ@{›ähÓÐgNÔ‰¦¬ÀÿÕ‡ö¬^Ìxÿ›­¼ç]´µÚ§äuUË7è€e…Œ7¼"Þn>Kš£gzƒdaæu1WRh]4b¡êù¦Qdg€dLf|ûœ3Y7ïIM¿š~î)òBç“úÀ¼"‘'úò„¹N‘1¾¨œÉ%„Ã^†‘ü:Ó‹/­´z` À‘[¹?µ ÅDP쉣¥.ˆ9?›‚{æŽxå[øî©mº6Êß½ˆúC|ZP£ìU¼±OsÔE›×ÒO¼=lß4¼Ü)X´¯šïÞ]–È&˜“À"äIbÍî³×üRGŒ ÕK ¥ñ¦ ¸´pžtÂhž,?úÂPiQk:„4§Ó¸“M]×ë÷æp á¢'ïgæ‘§ClêôÏçH_?èqZ…Ú"\®ô†ó,Äâ@Y{°^—já§4Ûw$&›ŒjZ£ 4úµÃÙÍú¦[B¦ÎË2ínÑúŒ·Íeçµ~WítۚřÄöÁw¤f—‚7.ºŒº„¢4™«zgò¤™Òãì³±Mû‹3îUêfá쎲]°¤ÔBqQPúúŽøÁ‡!a|ªÜÆŠ]èÆ1ÝOŠ×‡óÒ{Ê”¨eýv uÍšÝ4佋Âí±z™ò‹ÕË´Ï>~Pèb±£²«î1õ—’?wóMÄáu@t¸¿7 N+vAvØð &ÝÜãÑË{Xè;/ %Ïiz¸7—²¼?£C¨ÊÙ>—:½qf]ºg¥k!Èb°&=e'Ëï“Ç|¶}º(É‹}YòêÜÆM‘SW O¿ëÞÔqÖ%ÍF8bö“îo ²+öÐìkfª¿ævSS3Ù^èB'ã#ë½?pÎ?o;þ¤ÊÅ“o6ÂM¤È·a§µÎô„¿ 0pžûåíd°­Ë™ãeQ÷ï~˜bguÒó¹ í?‹jÊ5ÍÅšAz –ÕFÙXæq·ývÞžw^šý:36˜ÑÕ4h\rs%‡–z Xê=¨%™Ìà lÈŸé²ÍÔSµPÒ9VÎXÚv%éA—ß):Ó¤\7žít0#œmVêH6‹êÅ)´ZÌV"Ýà»—¥Ò·žññ•¤žê,ÿ“ÜbX3ÚPÕ"7M3‘IÔÉ+nk|F’î1ô…î–ªÓjM›\çpÎA·Þ-H‡¬` ë§Ò..âLI¼Y¤ÎFsåA£à xq ÚXðiºJ®¬™=!,ìB“¨w­:þZ\Ñ0¬›ËcT«÷©kÁoL6g‘K<ɦDN¨¦tWã+Iãúü×½uZoôú!üÏ™ÏJë:ß7ýÕÔˆ®g<YR¯[2úô Sõbí›'…¡ÎÄDÕ.ºÐÜï©c÷&Æ{Yã~™”mmè;šž@ã7ÜXqQ¯ Žaf±£«º¦—Ðc\]XM¶ÛÓÖ¤üiDET÷53´ÒÕØå,—HZÀü*s•æ­ÝïN>Iˆ#]Þ¤f_±n2söCùÑøOëÞ’eÄ»ÝTЃôÛ(ì¥it`ò9`’=6üjŒ¨BT}ãÖfã í±™IK˜Ý³,¦nJ½h¨m,üa Ö¨£6š¬K3–¡ÙØ~ýé鉖÷Û"²„.›¤ê€”ˆ¤c¨äÑê4ÿ`úÚn'͸Iܦꗥ5dÏj!“UÃiê%ïf/JÌ¡3Û¾7Zi胿raØy¢øÙyÿJy‡yŒ¬ìɶnêM3ëBqÒMŠù’8÷ÌúÏ+:æýéÕ öñ5Ûðù“1XÌ@‰û)§SV¨Æº/k{ÍÕ–z3 ѵg?íì’`©ÒžúyxÿÕÖ0_n´fÔÛsw+®ÓìkbâÚ<­ÕJ;MGS§5íÑî®çEÇ·‡ÔäyÑ%@0[§9~1òÀdÌ@úžä€OÝYÁÅ®ÊìÁ˱¾·$ðÊ]˜áW,zø33Ü©1ô5 {Þ¦Ç{«¶£ PŸ ¼£>Úvjp2Wóå÷™õ(Œ¤è¢œ¯ðiºMÚ“¤á æ³~yN5ßBº£@0\Å8ÏŸUl®ÌY&7’¬Â\Iõ›™ Ñl8UÃeXxÆE­õ\Ü o^MDêsS­Û1•å4©”¾¼)ÀΟ¤ä¢Gç:P9R7¢ÍR¢òV:&ÓÀ„æm•¯X@âúK×RƲÇMûœÔù“#Ø«•û¡×{qD:ÛŠµÅÉîûBÚUÕ5™y.¥ã¯ÛíiŸ0èfÙÜ«»¸~ÐõÎ=q½Û[•s—­˜ï¦H¢¶ï¥Îk)~ —n¼ÄL@¼ŽSêÛ“:«[جtTÞ¹³X¯ÞŽ×UáÆeÈëw3ÕÃü¢÷'Û ÝÛ·FÕVóÁâyö׎<$EºgÕ%§JÞÐweÕlM³‡V&£xtèU÷Õf‹Ûh‰)„@‘º#}†ä &Á#Gfν÷ßÌQ=ÞçÊè,¬ÙÚaû2Xùڞ˥cÅ™n{1®aFü·Æ?Ù„v™úÝ?»¨bNqÛ¬ðpƒ?Ærå8’þ¤H‘¨œ¢|=<!ûò­Šø˜rò]}ÓOÛ4B&î9\àÄ¡‹xª•çÏÈ…@oi¡B‚MáñÚuîz¯eT:–'Ãhoe'£`2ÌL¬ÍÌò|#ß±qAääb,7uó[êâF'k§ÍŸÄ×8¾÷¾u¢ôS8{v‘ÓQ#´«ümÓí†úi[|?Ú%4£ÿ¹qíÝÜ3¢÷YoxŽð–„#ïÄݽæµß¿F8þ”ܘrˆÔã9Á… É`МqCÈò†Q±?úQ6L¾ñaNZ 2 tGÂötßµkdF]9žý¸>ÇÝ®›ãI œézï{ÿúŽ!Á¶ðýZ}Ã6S ðõ#3þ§v"QÌÛy/¡ì¢kÞÁm&4®þÅ–IZ’EÊGê„‹”Õñ»õ-•˜¯÷*›â¿!*‹¿«…RJK}Σ«*qchB.$ØÇŸv Éâ?>•}a «Yl ë±A™Èž xTàR.uÕØö.i /žT]ãèQžD¢ærX ½Ëˆ,× zØ;Åf´ÓÛì…;ê`Eë8w'Ov[çž®f²œ#L÷Ķ(~ñ;Óu”:Ó„(ƒ`júþã¹øÕ8‚túßY»l¯ÊÖzª¢s(8Vu_}ö'3•nÕÛ‚¦§÷T#|»7Ãl}{aóR|SÂi9×ë{Ô2v×Ò†jc»1Ø£šQ%T ^Â×}ÈàI‚›?ÒÜÌ}î<YŒB ¿ÀcCésÆÐ^×”!ÃYêÏÇj„'H©ïí áLõ¼"Œ&I1Ó”“÷@7Jã´aVå{R‘ÅŸÊ͸ñæ’ÑPÍVŸýOšìôº™Ž¿ýºÄqK^yEá 8ÂT¤64»èé[ þš­U“í×+%'haWÚ®¥g²?Œc+â#EF+ݶƒ_ï fgŒÜý{ÄÝ¡÷nÜc»/ ºt<¦4";xˆß¿ Í£¤ºorÌ‚b4™ØÙíÅŸèŠu†ªò™þrIKªmþM ‚tÕxЂ75…íEq!Äü°ä't?kaÒµSÒsð³k¹è“ˆWʹW^3RU&}ì]:JÉÝ)ÿyßÉ¢$Zn¡•ì»Þ­ Ú6¡mËj{W ë—3œºñ¤bŒ¬Kƒr¾[qïØÀ 3ºzÆNÙUyÒ ™šv'm,È…=Í¡”J¸è}æ¬ÜìËçvŸò% wOè„ó"îy©4…¾îR¸Lz:p´9Ÿxå¾Ê<]§3b%æ\a¡×{mÚ ò’×e QòOŠBuEïç¸(5¥àiRmuöø=õæ–œ…¦kJðÁtn®›_W¦ôÖPW¿vkvŠnü(o‹a0)™ˆÐ@HcÌË1§´™LVê}ê?]:(À¨K¤Üœ€>ÚÖµ³o¼§›Ò ãÔâªk¸aœkOÅjŸ© ôô`D÷TíÛw5:³¼Ý€Æ¨˜:‰©öZëv>†o¿­ôæAá]€cþ %ÄâVCr|3wg LÕÉ¥Ò3kÛ÷ÐtüQ*ˆhU*Å䦟%~2ݘæ ßÝ£ºŽ%GXãÈKi“¶ÜÔ⬯i:Ò"£3?’ç4él­~cÌé÷ÿ½%uR+Õ#‹I™èÆc“åGõÕ¶zÁ^©nÊ­5‹Úør®)íÝÃcq/‰vÍuhjï_Ÿ3ZrãˆîzÉB¥¨ô¨­‘]­dÙÉÉˈé8Á_+ýNóôU4œ‘± ÍXdu"ß@âÅúŠ<`FÓ:ßÚ›NŒ=ÍŒû¶Ëµ¼' XÐt¤ÎZ7úgñݯx!8Ö•ß–ì÷ºé£‚’ÈcÕiXÈeˆð½t5©ñYV÷3ršÕ8²'ß=ÄÌtc°÷ÝúÑå rg6`ž[Ÿ?YÉâNÎôÕrøbñ‚F´=PW›¶†€ù·áË…*9&ÎãRÔ"R&i1öÇÞ‚ÎTˆ^hgN>)"+>~ºšÇJÑi ‰’ gîá7¶•‡Avû‹ð¨þQ¾Ñÿ¬Û…»MQÖ5;-rQäúï’`¶VÜ8r6B”×%ˆM Ð{?þüÑšð$ú—oÒY ¹lnü\KOÍûhd¸±ŽV¯º¼»õ ;`=î¨AòÔ=ñó©ˆÖ?¬f†ñ}^ܹæ-–±í\aÊ­\…wHY~g`pb×ÒdÛ®ÓݺY€xÉfǘDVä^šTr­ª‚íé©-›ña j¿!Â:Nn”¦ Þ»+U·¨h} ÍòüÝI¢ÞxÅC«@è!JµÖíMëK²’=ªýihEI!L¶VDÛo훆#„kY•çM3›T²Çfð—i´â».&06vŠVqÄÓòðpñò×ðÙJ¦‰qÌ kn¡ÕW>|Y e3Au8ƒo4oI,doŒà'¤¥å&e‚LPáy`†ü2râNuµƒÑ,r¡¯ê:º¿8ãWá±CŒé1öJZ=Òà‡n5Æqˆ œôØlÉ!OÜðÚ\üiÒµà‹šÄ=•ñŠ*÷{}*Ùøn=çRcvQ5a£ôð“σ ÁýwÍ+i¹D2bã’F³µòòÀj‹‰ó᯽Ê2^²ƒñ2ÒìQƒ§ï›èË pŠŒ„00šê¤äºè#}ølÁ!àæmRœVÁã¥)ãý{¯jÜ ¼ë—,¦+R{›û¨2ÞÐ\Ú”>#öÐN)!\ŽË1ÓÖOäÂØ’Ì0Ýš«|Ô¢ ´€  ÏÔÑ×L²úˆA»Ç[4µnÉí_ZëŒE$BQ·f6¥.ÔVî<)ˆ6ª¾ ëeËa{ÛLÑŠvØÀ•`ŠJ™ÇK‘‘EU;ç<´Fô×4Y&ÊÃBôU̇>·°Y¿•ÒB¢špèFSŠmM?°RÔDF$y´Q'mÉp”†zÁ¬2`3þ¼8Ó¢L†œ\3VA¢Xã\ºHªFZH} Ä€…q‘[Mb¹5<Æ»ˆŒ‚E6yEÊ dËå –fÓùË#‡n];Ž¥4:|zŸÅÀ³©^ÙO~QZd|æÄ‚j¤?t¸zg9f)¹ž)Š—SŒÊ‹=Ûs%CžV­KGÅàÓ~(¥ØU×€/´ã&VŸñ’?(2à™=ÏÕ'[‰d/è/.pâh–Wq߉à`QãÀ;¿`e—yŠÃ^NA9$Ï6N²µñ¼<ëýJuïÆòJøL€@_ç–Ÿa*ו­Ã# ÇÆñÏ–.5áêbØc\ðÐ5 U#@ÚFuᲡ6Fo»×›ÀÏåTÄÏÅR’„´¾H_³`ßznõÌA³©h+kšQ•o‡ ñvs-®ýjwöEžúû-ší\oø‰ÃMÀorÁH«ÝOݯôÖ«¬ë÷ÊÄÈ)ÑÓèiÁr«Ý˜åuEúËûÆ?ˆõ{_L‰î¨YJPzOzŸõ¦“1h6=0/Ýšl¤)aÎ7Ǻ>csö¢ Rò#:§c"ÜÞÇ ²¨ÊiëÁŽË®@³,žh}† b7ê9Î1ä¨b‘Úÿ –98åöç~­‘aÛ¤ý6“®y*.U3'¸.i±ÅØî;ô¸§=ºõMR™?Ouå%^@#iHìpZñ"ê—i­è”ý®YîgÎ7.˜ö«%+»—¾æa^`¥X²•šÓäøïâHsäq€µœw7PD/Ù2ëÝ¡"-¯$‡–¡q¯è&ÃÉp[S]-É C#öí:²70 ú>§ 5&/»ÿ†ÌY–Ï àš…§HÚu6' ¦Ržä\Ff²B‚üu—ÄDz™Ä/®Ì¹1I~\À‡Gx­š¥æ<¹Û3Z:åÁ³¡Š¥%8·%EKfÆ!sž'q™ç½Rg+¨Ö¦•°šŠ9[¤–|¯M^Ó9Ëÿ.ª²·dmîñ–öÝÎÒ®uØdkâR¬#O ðúÙI”4>ÄŽçÏ”Ö<ÊöÏÖ—ïºHUŒ={:L^“P( $|ÍŒ#÷ú?Æc|NßçΪqÆÚ¦¼†¨KäL³vkûç8Y4wV¹×¿ÓK–œa÷K #¤È8fcå·e»™Ñ}Dæº*Ú…aU,ó©[ÏwÐ7wt17ºc—·Â6ˆƒ‰mñ1Œ¢ž(Û¼OT5¥ <*› Î|’MÚuIQyk`*w€ÎÓZCñÖ¹ù÷ú-r¿RîÀÇÒêôŒ£Á¯ö»×†aÄê2Pœ•ÀÁÛÃC|´yoÿöÅ@Ï}x‹eCKèîr´ |ÀEg¬¤$Ï×'vÏØ~ØPÌaõÞ¶ŒK»lx(ú€};¹jwFÁ {bu7™O ‰îƒ©£‹&yÅ>=Aêk\ ã;n2šrï~›{›Ù”Ò4"x:îÆäßSê[ˆyýžfÄÛ”UïÑ5•H±ƒ22#»ê¢Ik戧)7ylô9¹ä½sóMtS×O‘ŸM¼ú¸Ÿ–>ÿöó¼ÿEdõý/+AKñ‡ÿ<ø‹®â¿´Äσ?xÿ• ¥ø‹ý<ø¯¾ÿsEh þháŸÿÕ÷¿® -Åÿ'zÿïêû_W„–âÿ½ÿwõý¯+BKñÿ‰Þÿ»úþס¥øÿ<ïÿ]}ÿëÊÐRü¢÷ÿ®æV„–âÿåÿVó?+BKñÿ‰ò«ùŸ¡¥øÿDù¿ÕùÿŠÐRü¢üßêüEh þ˜Ÿ(ÿ·ŠÿŠÐRü¢üßjþgEh)þ?Qþo5ÿ³"´ÿŸ'ÿ·šÿYZŠÿO”ÿ[Íÿ¬-Á…úïñ†“ñ‡ ¯úÿŠÐRÿÿ‰ò¿«ù¿¡åøÛc\ÍÌX;àÆžà€73s²ÆcÖ8´ÂZ€ààŒ·À’Küxd€a xàLÆ CÀà¼(X¸ $üï5›Jÿã/yPN]i !:ŽTUièUQ”±  ée…„är ' ‚Â" $eOÀ:aìQ8!!y56iI²)HKZcPhiI;Œ díää(€9éŒu‘b“u°wÂØ; Ý1l ‹…_RlN7'ŠÕIXX£ðŒ“–à €@@ÅDÈ<°N8Œ´Æ¤µsÆ¡œðâ ²e’ sÑ.ÿ0KAk6Å*Aǰ8Œ¤ÐBaIÖÞ\d)Å&((üC;¸¹[aì-6ƒ“b#8¹ã&ŒÈ qQ2ò¡…F™; Ý_@ { å„AƒÌÝAr ì@"‚AH@¸uYàP‚ÛI¬=ãÆ&-‰Zvd‰Hv(¬=řؤU¯œöæG ”Ð ”4È ô祭±€4x k÷E²äKxÿ|ꇡìíœÈíúš‘ –àôC<,åË“ø»Åí-ȆEøZUŒ9à{?ÄÆ ç`ŽÂ}-Çßááèÿ3- ެ*0’BÒdÛ‘þ¾Uö#B†‰ A!òAv±jðÏb´³à8(²‚@–ÀA,DV¸ Eš/Ìβ"_ ž#ó£(=Ê0t%ô”¯ š%çD…ÿ8'* ’$8¢ì?s;â,0@r6iv¬% BK™™š¼ž™¶¢ª™¶¼š¶º–ò¸–¼öqu9³ãff’BdÒËê Ö/*ògu,–þ3)°ö˜$…(U ÑbYi0µ4x¹!Ôs¤ÃïÊ ¥r†þÔÖÞçŒÆ€Ø¨^aá€Æ,õ 4°]ð׆û‡µ.õ²õ£¤Ù¾-;Œ*;ìOµ‚±Gc-¿ÍNåÿÛ˜qùÓ[ ¡…E…(çŽè~H›Ò>$ÕÍ)­§0¥—%²ØbÜ]ðh6iÊoÐg0þgÕþÉaÄ¿#Ž£³9k±(èOåþY~OžïŠA©Ýs™Ö©6 †~O0<Öˆ·‹’‰/c@50 6ê¸#ös»Ñª(‚-8jg†úm ¢ZXÆj6`øŸqpÅc0ßf ²@|ÅbQù$™ %¦//.F-.¶,\@¨!"¼ÀZØ‚,¬1¶p×Eáœ1Üß³4  uúŒì²i:ÁÚ[!Aœ(;G CŽ™Ô€ ý%}Éeo…9†CYM·>–3¦ÆXˆèßc¼Dn`¨H âY¦U5CÀÅ|YQjŒ†@¾Vúqw‚Ð;–ð/jêè_+çï¨ê1ØßäüCz§úþüÿŒ–q¦ºdÑ;„EÆàñþ._z(¥aýº]T/…ˆ}-”ê¨PŠ£~Kò|‚MÚÅ‹þ, Dr„áþkøÿv³c—ðwyc T§†.åA©~ ]~ŽêTPðt$ËÂ5”êYP²gý¯º=v”ð_ö|Ü^›…lñumZ˜/ÒKëø|ŠÒ±ñ~Ëf T/†Bÿ¯kî²À¥è÷ Å>µÐ€ËâÑxþåÆEÐïEŽoE#4Ê õ/j¬€"þŒ—¼ 0Ò&Ot‘ ù»üã+~Tý=~(².磆 ˜ðß㇦ð[ÆŽêϰïuÒ߉0Ì2—ã £ÆØ÷úg Ï£8@8{”9ƒþª¡Ôˆû^7ü%JyñH|óòePC ŒR¾”\°x'g·Ë%ú+O\`Ô°ƒ.oÕ‹`°nÎõ5ÿ»F˜GÙ£qàÒˆ5¢BhÈ7æ r_¤º¾>±gДï_EV5VÀàËUHõ}b©n,ìrBB Т©ÃY`’à„¡x7èK(‡@¼ãäÿÂ/ûgk@¼oN*aÔ¨[æ—²s ‚ƒ†Í¾É N páŸÕ2g”s¶sü£ØZŠ}ÍVÅÁ꥘EÝh Ï ‡–Ù œ$á"††¬ƒ# !§ÚZIø6 Ô ý º6bÛÿ^×@‘ýCÕ=6ü·¦ô “Ñ„µs€ƒÿ  Šg‚€“ZrZ …|±*ø64ÔNþã ãDú…ˆ ˆP\9:ÉÛ;á݃ ~qØÅÿÅàiáÿUX„S{øòžNíYà_õ,_*ÛÁÒk£µ#ôGômESã0|y†Sã0ñgZaœ>cúýèG ¥p1Ðs¿ÿ@S0NK—_Àò­)ðÂÈó«qÚ‚G¿‚Ä_ñå:¡;¯5¨!Dþ½ (z¡Ž¿RÊΠÔx‰ø*^~Ùvk ΃ÿÂô,ËÐþR„#öhjæÛz¡†øßÑ `‘Ú_ëå_I> ¨ñ YæfªÏ#  ïå%©^€-/Iu^ÄrçEPøy!àìâZ˜¤5DÀz É6ŠB£–@”õU)6ke/Âc­¬$€Ó;'M]Lu°©ÿ8âA¢0D ‡ @¢Â"ÂsX² 2w_X£ùcm¼â,.$äêê*øy×o%DYÚ[ìÏh$±vV Þbùb°£½…s’b[ùi¨)ÐÑì%»>âq9­5k~Ù|ç]¿ø«òûÙGÀÇ! ¤ü§ùù={ËÊÊ¢¢¢ddd|||zzzÌÌÌXYY«æçç!(v?àÛ/NZjÚk´Z®Y³v‡¢Ü¤>q¸EÕ!\x÷¦ÑSêfv›À/rô_Ƚ݋ÀVŸô›Øt‹¦@ œßþP9S(xó/³3x°Úñje¦ÛJ\3Q´W0£ê"ZjϦÝbùk™ïóÛquóÕ—G$Σß|~;Vv¨6x³ß´ÌÎg¹êë çKvÒ$È ±µ 8Œ9ËÅ+Ž$¾uŒ™Öí§±w'§ìD6]VfKëÙê–†½\îv‰ò×¢Õ_%‡œ͈Q†ôêènÍ];}8­³MJØn÷ëä§8\ï?ÿu«ÄþÞB]öç„2¤?d™=½^ÏÔÐn6“{ôD•çUÓà³v›K÷pœyýFlë½€J%+ ¼Uòeÿ‘ V„ùßK›Cï0”Á× ú‚¦5 'c¬5:/i¬_›4¹Mò×­ý›O\ˆÞQ'ÆvÎr='áÔ½ç¯ »$»ñÜü@ZŠÿÒP‹‡ÙžëHm®¿œÞ=^äÓZöÎV…›Œ¯ìM¯¼kÉ’—c\î,7¥öàÖC0}n˜1nÇ…Ãí—žIe]ü˜ëv*;}W†ÇöMê³;Ö5зsÔ8O—°M2]:×M »·#cÆ ¾~­½Þ§ÇöÖØ$®KX3çöÛ\Êzœlëy÷GÖÔzuË¡ƒ™ÇËøŽWä"}ü4"™3éK®nösk»àµîÓéb»²ídÛuðÝè¦qÕþ­H/·²õ­¾á鿦¥ñßò¿Ïÿ|Îÿ®æÿV„–àoù=ÿo5ÿ³"´ÿŸèù«Ï[ZŠÿÏóü¿Õç¿­ -Åÿ'zþßêþ¯¡¥øÿDÏÿ[Ýÿ³"´óŸèù«þ¿"´Ôÿ¢çÿ­îÿYZŠÿO´ÿwuÿߊÐÒøÿŸîÿ‡AÀP( º°ÿc5ÿ³"´êúÊÞÞÙÞK¾ç†² „Æ8þí d€`ÿQQ0|uÿÇŠ!Š…Š¡Áh„¥9‚ ‹Y˜ ›‹@Í1"æ¢ðÿZ¾UúwéùÿßÜ òWþ†Ã—û?¾ºþ»"´dÿcá:„ ¡Qˆ/,aṟŸõ…€ù 0\Œ ù\Ä\ Á|Ïx,JB`P~ ƒˆðÃÁŸ‹B„ÐP±/Š’ŸkºÜú+Að‹‹ ÂP~À\>3 ¿¸ ýç ¨@Áü"¢¢ ù"¶ºãåŸøÿßÝ òþC–û?T²êÿ+A_ïÿX{ øN¢ìÿج^³fÉþù5kþdÿ‡|È‘Wk–îÿ ÙHÞÿá1©Jh?¶û×Yæ;º¦ž8pro§î2–ËO,ÿÒ>„„Zœ…UàDàIÎ'WwŸvŠiå¶ž7ž’ýµtgeQÑÑâzós}Á§» ‡KgùuZmjûãý»“vmEnÙ˜²~ΙӼ÷'¾+c=ž|aÕ” #®>qKI˜råÅÉ[çbèŽÖ< <ê¤!ŒÞá©U¸ËL¨Ä¤ÅË®Ùep·ý‘㤰ð&”¯}OëÚɨÒÙ%|³gY·Z½¿:ù¬»”ƒSææãuωO×wñ&*OUϺ–¸dÔæß·OÙŸ«``_âá5àãîâ 5© ±GXqJÜLa(ڒ°9X𤬭ؤÙ]ŸœáLåÁ\Å£|¹¯š7e¿Ý}E:ÚwÃ8Þ×´)ZCœIZ ¤–rÂË™‰ê>VÕÌê¼&#PǪY™óÈøz]È=V©¢‡x¼œ‘=Ì­@^~¡¹Çå(òz½.‡ŸsIþýüûuò*ý ·ûxkÕÌ’Š‚yòy_CÛi6œGð¤?Û·Ð+¼1?ì AhbÖŸ\»AssÊ¡]>‹èawÓŒ©›‘m¢™gd³zÿ¢Ýf“UvñÔÓTãÝÏù.(}°ÂF¦U gÐÑs¥á]»6¦z²y>ao°Ç­•[¥qêqÇâ£ûøå¯GÇ‘\ûožQ궆ÉÅ×}(™Ù‰Î»ž˜˜ÍÃØ©q2P "‹9p&û /݆—­´)ëcc>=8½ÛrÆ>ž×V³, ¯‘Ë~FÝÑÀh¶ZçÖ“ß|üi¼Œ6ô\|ÉÏ7•‹ ©·ëm4¨KÁv‡¨bÝ¡9*xiÖV ÚE”ó}dxýä°põÕŒl– -ñ¢ºÕž\‡WGŒûo}üÐ6ñè“ÄÿaïZà¡Ú¾¿J·)¥nï=nÓó4à ofPNÍcõÓákYÕS” Óv$_XôËœ7òª«s‚8¯Ìs"熠ž0óóÆ{*z'ÛUqiŒY̓}tcAë›ßãÆè¿Ý?¼¼²áúÄŠÂT§ŒŒèºÍ6‹#DëÿU¼ä” ÜTÐŽ}W›"”\>‘ILÛ~!¹8)ÛËñìÖÙI±V7¨Vc^‰i"·=ᶸ´ ×SŠS ËüT]_¨3æ oßsJ1ØM¿í‘Ó8Y;›eT¨}$hºeíwÕ”Ÿšƒ,&Y0ϾöS>}žâd”PoÜ0:»ÎDdvÅëÿuÜ(mTf´ÊR¢qŠA\*b7g›:«à¬¦†ß«¸\Ú ¥àÈÑÔ¼ì$5k¸æú½”;ãÔ9ÿSËm7ƪÓàÌ’§{cgˆ×m{ÊЮ*}ùtÒŒ·J丫–ᬖWâ½Ù®ÔLü*““ÃÄÕÑYôg×ÅI'íµ;=_æ6v¤5½è°<§wòÁM㺎¿Ú¿Ž–Ϊ\6J›5ke½[eEÜ+ýÇ.¥Íí—&·÷»ÌÊj¼àÖUÛòÜÐøQÇÍZ"§èM‰Îó¹»Åö”•]•£7݃2«²åÙ-Ÿ?œnXò£W1YÕ–§:6fåïx²x}©×.-÷Õuû½¨?wnœuÙ¡üíÕ­·ÿzÚº{fЫP º(%Ý…ºvmiü¬ŽK?7ÍZ¼)coǽô’²ÎIf(½ªeªíUJyË/Œ3#Æ3ë#÷wÌmÿiìÙæœèmzž}ýñD÷dkµ)c#*Åu Çù½²r¿¨iŽÕ.Ëü;aÔüEuÊwÅGsçHæRE/˜¼7+óšü©ênµ-©­df•^ ;=¿øäjâ¨Ð‘>U[PðK§ýÈü%ÒSûî\rÁð¤–òô2·¼ò-N1sNOqkn:ô}†jû)aLfZËŸû¶üvÙ¿õô8údÃÛ o6mo­Á¨…å;G¯Õu™V¹Èèâ8!MWbíðöÇᎠþºG¥êä[ä å³i£Sÿ–[¡‡nD)³/NQÁÿ–R°¦úo¬ëäŒÍéO\¬oê]“ñ&tÙ6}gÙΦl,*¬¾íR‘_|§á‚Yæ¤?‹ 2í.šFd bÇØÀ;=²²uÝèy«FQþ¸zàÖ(Fƒþþáè}çâwúÌtŸvø,ªÙUAT[ßö{DÚXµâŠ e㽕®°NHÕ¯Qô˜²bÕuä%pÑ ïäl¢Ûl'Z•·Cõ $ ¿ïÜ-œ†ûîÎ_G,L·sÞŸÉÉ)Ëò8Ãð>fÖdy¨1µêŠåÄuS2’´2ôÇmÛûü¢EÞ 焬xóy•…¡Ö×làjoæ+íVL§{kÝV ~âvÑ•ú¶ÿy7îœah·Ö€ÓŒÌʉŒ]cn-¨®tWQú’ïa‚¢u®ÙC«4rnã®\®ÿúáz^ÐÍ'–\éKÇ]U%ãEÇoŠÑ6¥a  Ï*<M2QèZ³Zoz¸bK´=k~>S0òVÑFLäãV¥JÆT–Øj=œ‹¡zTÍn,0YRÐÔVèìpÊhäâSTTN¬ØwìའÆRöË Æ9©¯©u'9³üNí1à—Fä¤:>ÝçÃ?¦RvGõOey I"ÿ,néɰ×)*'övø9­.ÆßN¿Ô0!6Ô|]ûÌŸÅ&¼y'.yt´ a¨Pó£eTf°Y“B¦ùŒò™é™GïÍÜ®êO9EݤxÚõâÔõ ''Aõ¿Ý±Ò\u»ÝôèôCÙØÈD<Š}.õAšS‚]óðC/ýïÔe¡æÅÛk$‡£Æš+Ðõ3hÓ69HÂFÄLÿ^tv߯âßC™é»¶/Ù°sÖâæt1Y#9B„l.Q[|hœHñàó…-GG¸¡¦–ùòZ9Ãì1ëzÆcÎnYçCÛY ‰„,5Ÿ¦…±f?ÊäF½³¨o}xsç°ÔV¿Còíþwœsè©ÏÁC²ë¿ATÿcèþ߀ìý¿ATÿcèþÏ€lü¢úC÷„dãÕÿzþ{@HÖþƒ¨þÇÐóßB²óÿ?\ÿchÿÏ€“¬ýÁþ¯®øÂ ’±¿× xþ·{þ'åB²öõ{ì?4ÿÉÚ|ÿÓcÿ¡ü@HÖþƒ`ýßcÿ¡ü@HÖþƒ ÿÊÿ”dí?ˆòÿ¡ý_B2öç ¢ü(ÿ’µÿ Êÿ‡ò¿!Yû¢ü(ÿ’µÿ?šÿKŸÿ&ã‰Cñ?€ô¡ý¿hÅWöøÓÏÿã°$\—ýI,‘(­ÿŒÇ#ø/CÏÿÿïIwމ­1ËÙβ`Y[AvFV4cHMCSÓ‰`¬©iÂ2é:AÄ`qKÀæ"8}lž¦¦© ‚«&Å:Óõ…Ù}]XȆ46 8(„ª§fÌÂB ­ yu½ÓSÂ+„R¯£zù²Á°PÌ× PHÚ8D¦+äÁú2°o:♈cJý²—[b€WBfà Ä”nc @`Ë»$(èò¸Ëeaÿºqß¼‚ƒÕ ÌÓS“‚Ôû°P B @»ÕC¤XnÒ+ëFv›£¡½Ç­ó ‡LºÄuƒÂih7´=/H A‡â}pDF¥^ÈÈÖàeºÛ§ }= 꿵/h#ðò ïaŒ°vɰè9õE‚ÀòKN_AV\Ðð d ¶ în˜äk›÷ @öUÁö÷„Á_$ƇÇ÷dóúêñ52Áø÷H`Â]GAÐø<)*¨Ž®§@_¡—æ0ïPKdë¡/¨%¢ƒa/½ú‚ü~À\ z‡°¨îÁ¡Íå°æ ` ƒ0(è‚_ZS_½ûJ ùÀ+ò°}¥³m³·h­ëtú} d)ÀÅÓÌdé²mñ^mX¾Ü`(PÀs¿?^r¸Hªê‚,æ¸R[ùòað‚-„¸B(ŒËãAž02W{‡ðÐà„œh, [dhã 92™†6,g*àà Ρp—® Ʊ`Ñ, ‡øÞµ)ÓØðѬh,g¸‰ecjo™Ù2!CÈÎÉ¢;X2ÁBœigkoФ:K=Ày§<ˆ9ˆÇŸÁ ð‘&€Ø‘½IäzÏ) dÃRuŒùáˆ;övYŽTkéi[ð±haG{? `ô¥n .›×-MêͰÀ?óÁÞÉàgìý¢OÿÇ ¾ lîáL\ÿE °þ¿ÿÃÊÔÿ"ã rX<Oªÿ1 DöÖ‚‰x²‘ãåó&RØx,â‰Å³qÚžD{¨þ×ÿsúãÿ+j€}.þIZZ²÷ðqèûÿ¡Õÿ"ƒEþ£žð®X¢á($ˆ@! ñ8\OCX³?Þð].--Д¤ QðˆˆwE¼°š­÷Ùí}ï€õ‰Qˆ$° íU Oúhÿ$°„Åá A,e)_XóŒHÔ––#QÒc¤^­(}׸}Ç‹HÀI;ÕÂâ¥þÓVOÿiüM °ÏÜÿ#haÉ}⟄Šÿ ¾õ¿F°ää†m–ÖÿÒÌ};üCu×ÿꔓ›:5ÐÜÜüÌ™3ýTsÍH8&'[lÊØž*`…‚Šk§¯6+œô?ç^}áªÉ® ®VHæbVªSk𥄩Aa„lβ]Ón˜f1‹‡S•%Š™?L˜ÛæV\)g8~öÜßê.ëtÃLðPú»=Іs6³eRIÒ¯Û o«7L.7g©E]¬uq]ª_Nf¥4|¿fÓ1y­‘Ѝ8• A¼‚¶ânùÁš”Œµ.КMk1¢þ¶ ¢t? ÿs£Ý*Vv£]p®dâÊÝ ~Ž¢5ÒÏž âèîu¶ëä(ô¬ƒâ(jdSDjB™¥9#<¾c\Cœ‡ŽãU~MmÝÛܺ¥‡mëo;:¹,*®ýÑ¥ú‡¢´æßêÕ;“Ge·^½>UgŸ°-ìVÇ-NÏå°W”…&Åpãú3%;½B³Ÿ*2㟙ånïp‘Ú@ŒPš>µ¢y¡Žá¬ªQË莨•JySu•Ÿßo­\üftSu…þƒõøY÷÷(/V<¶xÔ±&êÄÁb[Sß-·Œ×zù´¨#úEúÆ¿Ž´Je¦ìÙ3;èOê‰ç’ ­?–Vænmã•)q"_¯PvÖZª•»¾u¡Ú-Æþ¾ªHÎŽ:Ëi¤{mʶZJcå“ÒNËí>«"sW+ðÝ…fûÿ pjGk&†@g«6y&;ñq’º¼Pÿ¥°óÎÜ¿)÷'ªjÚÁ³æ›‰ÓžÅ7.öÝÃ^?Æ:ùFëAiªXìtöñŸªeae—Ý_œ/æ·ÝËÔ9ýJ²P]ÌeèLßd÷ðœ$ì~€âµì*]Ë#—SY)b ·Ú”Z½²÷äÏHÍÞ½#t¹rjûô óïn-*ùÇúÕ¶üÃ1“«çK0Fä" çpC—1Kå•V?ßÞ~fGl럕rMNÍ“—Ávö÷Í—(δlv/únу2U²Y¯ö¯ƒÛ†•Äz­oK‘0iAM’ŒJ~}v>´¨x½·1ß%¶^ƒü½ÃŸA!F$ ÁþøgÖ·"‚D§Ú’š'¢×HÄ#S¿¤(‰Ay…ã”×*Icü›½?‡òmÆñ6‘=’ÊV*Š=ë0’"†ì1dÏÆ6¶ÊB%„CŒ}Í6 EEÖaìBöÛcÛï>Ÿgù>Ïÿ}ßï{üßç}~Ç﹇û¾Ïë¼Îë¼®s½îû¾î‰¯}‹û,ƤÃÐÞòR«&ZK®=¯Aóf9GýdêdŽeºnNãtÖIýóñKð»jmà£7Ÿ ¼UÖgñÌͦ§åÃÆ¼1Â÷×TXÞôLgë#èµ(¯!>Aà™M§Žë™xÄïm.EÔúx¬5áœä9^‡|ð½~‡ÍéÎÉ>—x®¹Œáä|w‡iÝÝ÷cÒ¼§îÙ¯…Áî£%ü}Í•¯óﮫJœ^€=róóÜ–àØZŸìÐo†<×: ÷Þíç0 ªóÇi¥Ë¢e+ö‚ëÅ0tl¶×iR%f‰#Ö[§‹iÅ/EÒºÁî–ÝMF±3Z/óÕzswozâ²PŸÙ5ÕŸ-¥wéP‘ཊ©[mSSSg÷²jžÑ@xFÜßë¼ózU`ò#殃Aøc¾œÎq½:<,*;ùVß…ø%^W7â°uͽc@Ôˆ3´w”^¨ue-†'ºñ…2Æ’žä05T`²cEïüz®¨Sû„£ÇÐPì@y '›ë\Óe…÷aóßjT!×îæBLž¦äœ\@[Mê‹0}¤z¡Xà%áxtå<¢ÆEç$7ø9'Ìi|Šç3Ï ÕŽ÷zÿ›`Oc1£M•8]e¹,Vþ+§ôáJª­¡v ˆè*ö/Énà7ÚYAådêu“,þ+Ôúw Ä„d.]Ï)ûg¥¾»¤[ô%³Õ?E]CoX¢­ü*§þºŸë0òÁ{½Û:3uÈVK*¹Twoæq²Þgò¦×ÿQd> âd³xäýõ7FzC—{‡¨7¿pï–µoÑS³¾ÖÖêŽm6Õc3>:ò%£Õ¶ñ+xœÕS®¨dá*t:çyI"׬Bqê7íxÝéçYž ¤_Âf=c¨ÿƒô=ñų{G>3<Ïgð(—‘fÒ¢™.ÑRpˆc(?‘0­ g3SWk6RtüªÀrNO]øuªþ<õv5u½:›7²gdÏk¶æêÅDŸ½6–óÀ ú•):nÑ÷FûJg΃ooÉ{6õÏDŠäٳķ°»Z}å¹Çižÿ¨#ñ¹]›aEq›Â¡—õñOô^ø-ˆ°c»9< ?€¿+}Õ01ãV õþé+;z‚ª/æ&>üÀ®¹‡[ÿó,Tbôv—mÞ $§ßÞ“–›¹A᚟ØÅž|c]a©½ºšl'‚yße?>b»É¸0E“7š ²>?|î‚v×µêÑ|áL$BˆGL'š|]okC?+ø‡sZFLŒ¾äaqšëzç¹Æ-Ñó,Y¿Õk‹_÷çðÑm÷Ø+€L…Géêä+]ùö~zí5½s1eºš=O_Ìé˾wZYÙ·ë¤Ú ðpÁhl;850Ee×n ‰‚®ÈÜÊ T¾æ hª˜60ðXz¸÷Úùå|Y@ÿ².°h)\ý¶Õ6šŒßÍZ™ïK$íö]0ñYÀõ‰T{?Ù›½ŸÞæ_Ì’IºU‰¦ú|./+XS¡n¥Á|OA)ôøÐ‘f i%U)sÿðËã)GÍ*®¶–O= Ê,Ây‘Yýw¾œ'Ùëä£Õ^ ‘dfDõêË9/N›sñì'Ý`jPS •™ ÿ!j=Ã,S‚Γ‚e~î,ÄžëÛL1@œeC¾‰\à¬p/ÐÔ+š"5¬îÇûâ?Æå„I34{óa[÷])#âùõÑýVßhÔD¾Ñm¶‹™.Ô]°de+Êï„GWªúwkd¸Õþ±D‘Ëäà/Èçœëû™#òéÜÓKwôW*‘ÒÑ|ØUmñ³gÖ{ìÇí>÷÷~0u){:¬7w°—ŒýQ¯± í_+Ó»£Bòî(¿ª°"œl#rÜçTs¢¬J3ÈîH\–€Tž- ‹µóãÍûüÖÉ„èÕez§Ný9[ZËY>Áß[G‚?P5B‚[ÛeèËÜ.]ò´ú•QôFYc«ö˜õU¡Ky'šÄã¤?} ÍØÊÉùñaá§Ñ÷÷lZ0æá´¦¡W½ËŒ?ºß9ž_ròRx]]ØäV­†˜@iÿõ .%Úçe:§*´BߥRÞÊ9ñe]Ë{ëä}f½§êœù9?O(³å„”æ…Ѫ3ë=W×ëÍ}A{—Y/X]Û\Y_ï&ZXÉbù~>çbɃ0õÛÎOi•¦À\§+d4"†¥…Ïd°<âÌ>æi—ÅÂ4UòUѾ.°üÍBµXR°"LJ#|HÃÓ6ë›ùT µ^4ÇóV7›¯Ÿ;ÉFó:¿­¿º[±Ý34¸>yVÞ#I3ÿ4Ò<3•I@38ýlNuédˆ:¤¹ç8›ˆÁm 'ò”€Yö„Ý£ÝçéÂ9·J' th*egíß_ûÐÉ2 Š9Õ%“†Æ:ö3F“Ÿ#Å 95øõäܼdŸë¦e£F13—Â"žÃ‘–Ä )®£öIð[ ¶9ïŒ#”²"¬a‘Iñç2ç #-m®Î“ ‰Fd¤¥õU¾c¼ œ*z/c.-Ï.ÉfXÖbXC*b². H4ò^|ÝÊa)¤SZÊ‘ݫª¬ #Z¦]õà•¤ê×ú3/Õ“¬‘‘¡ñO4òÜn8눞3­6ɵ7ÃGE"í/]Vúž%"pÒ€å-p& œ½™¨)ÝÑ•›®f{C§á¨×—òl%·òÐO1A{—ÐéÏ=œú6ˆf¬w¸ôõ pãQXåec¨¦AÛ{? ì~Û29!Û2:I'3~gˆœ™÷­5ýA†@½€dÞ'àôà pª/Мf—§žßØã+ö|¶ m ÆÜ[”— ¿«êOøËØ+믈ú çm‘§ŽÏÏÏ­ÿ¢È¯mãue&#ïIýû²‰tûîát®©rˆ”œ2þ+7XŽD¥‰ œ”rÔKiµQÇ™±ÿ=«T­‡ ƒûõãŸéÚNºë#>ÊZ¼üþrÃWäà61ÐòÄñ{ן1>—1ïœó¯ ŠX+À¹Õ9iç´ÒƒNéx^XG-Tm›Î§nl»Í>ÖŽ™ì¿[š²›Ri>kø3©7\Š]~óûÇïû¸`ÒÒ¨[æ%Ó{¿•ö-êúíO,‡7-tõ§0¥ •hÇ?6 ÉqçFÆ}ÛY H¹bá¨yÒ@ŽÛŒ "¯/¶ÑPíkÝàÅÀ_WÎ¥®YåÜæìò\Á÷81 r\Èk,ëµ4xqÚùúûÿàmkn`Í^mŒqDûÏLjgÈý´¡¸(ÙzrÝËgÝßMžgLÆh%ǬªÿñÒ9dtZHxšrCúžÒp]ëo[4¿±B­«U¹im·~ ö»à• \~õ{"#¦8ØÍÙ´@g¢uÂ÷V v&|î-!\°7Ìë©Vr´½±Ç›2;l¨wÄFûÙkeª;'ÙÎ×{dý/º ñh0_ú2lN¹ýþýSÈÿüçßèûÿÙÿÿ/)/ÿ£ï?üç÷Ÿÿ%åïäoóoôý‡ÿìÿý—”¿—ÿ¿Ñ÷þ³ÿÿ_Rþ^þÿ6ßøÏ÷ŸþEåïåÿoóý·ÿäÿ¢ò÷òÿ7Êÿÿ“ÿýKÊßËÿÿjþOyÿOLôæßùüÿ%å¿Êÿö=°v77·rur27?Ø2ûßþõ÷ÿÖþ@þ”ýb¢¢ÿyÿó_Rl­%,-,m,%oÙˆR~øÝVZJÂÒÒÖÊRRú–Ø-kËÿÛüý§üŸ-ÿöÿßüõ÷ÿ…ß’½¿óÿÿùþÓ¿¬ü³ýV"ÖâVÿDlþæ‹ E¥oÞ¸yQ\R憨ح¿l¤±–ýÇÆz6>0°§-ÐÏasé·.ŠÝ”¾!.ý—- ·D¬-$ÿ±¥ª Ìæ«mûsï‰”Ì I©‹ÀA\ìßi+Åÿ+Ëßþÿ»¿þþ?³i)Q ©°qÉÿØÿ¿¢üãþ£¤#GNŽÓPöè}™n2ìÿŠŠz'Ö¡¦¦†B¡¤¥¥÷inn644477@ããã‡ûBxxx‚‚‚Žl°ô8ò÷ÛA.ùc;&âyù-–,ñ¡>‘§G1ûMfWBש˜‡_MÁöôç4ž½P Ù»”ƒÀ ™Žè›ÓìR‡bƒ´ÿþpŒ¬™\9«q)­éaÆï x_ù‰çÌ_Ðçõ®‹ãCv{Ûð:¹íÊ akrãnßdà™¾ŠörýCò TLk+É GìyWA¼«$óÓG ‡,žýÖl°-o"÷aa±­ôݲ¶?©q¿V $Py =ˆo2´³T8?Hœ ]^:'¡4`± T[»˜ÁL¦‚+Ó¹nwÕµ|äj‘ê?¾!b>¥t‹8î9^9b$á¿7ÇŠ€vyö…›+žº(éF9Â;n¨±ïùs|·´\úRˆŸ\Yª0È BFa™øÞ6Ï©taF`¤¯kÍÁRêQœ× Yf÷á#©B!c䤘Â*_Ä5éJÆqžÝK{yø ØéE°ð”c#@¤Ë×´À ®=ú¹{À«Ìy»®ÛCѸ’€_Îs¥þ¼«ÜN‹ïÎßzXhÊ9ŸÆ°){óS9’cä㚎ã΋"0-˜Õ¢홄ßÑ•“«åA=»H"J¹`_ :³ÅÌýO-r1ѹÙ”<±}Ô7‡ ù[M»{«áÁ RŸ[ÂxLýÞë—·ÜèÈô(ï¥BpÁ~óT¢«Ù”axZ¸·ÒI3$M5ÙU[—ÍS5DŠÔj^DØ[T9I‘fÎùt8M4Ö–jÚm÷šÁ¾š¨*§T9ôÖ©œŒÁ‹Á¾ÅD7ØqNœæ¸ð~‹™Ž\ºLžÁ¬m:§Ä€bí 3½+!evÛ™™_ˆ¢ÏQ ¿~¶ƒ±;Ÿæ'#i¹xÈÚ9YÐqµ;"ßN ÇÜÒ]göîä«°Òõ"èæÈ †UFô,Hq4„xßé§¢ª0&Õñ ÞzûÍUx… þ¾Š2hù|}·‰^H§ÄY’ø%_Hàߨ-!©-,,¸FOŽ $s¬ÑË’ Åz´0Î\˜„+¦C–›c!AYXHC©P$ëâ#"’rñ¥ÐWêA‰)º~Ì$=ˆ*ØQ´qß0Š29W…Wx=³dv"Å —}S9ÓÜâ€~û–dz9Ô"ŸL˜ 5!™Å7ö½‰ÞMÝ ëÜ|g¨UÍ‹¶u«@r¼ KÖ÷LŸ;ï ¡r·Ëzg*‹JMOc·sî#’I\øaøz½)ÌÊù?+Êó^¶ìá%4n½ Ö´ r´wðíüŠWí*ïÑ„Úæ²šGÖ:Þ° ÙËD¯<5žQ9`—ðäÚ®ir;<ëöcªzªÑ–‰˜‡]ö6RìY¬Â7÷¤›‹-šº®à[Û²Ìi¾ò•ç5¶ÆÊ:`v:ß;¯¬$èÐ[çÑ¥~S#i×Ïù ÝxŸÉh¦ñ'Ý!Ú•ÞÂ%æEúµèžC1Ãj)Øè6+a|Ã"jD!•+ç utZNO×ÌÌÝâ·w§Çó†pC"¯²\ ×Oïfμˆ°ŒñõûŸÓötá?“µÞvç›Nßf0žå)¹³¼w+±¼§wÉÝo¤hUs†d¾‚+ì®5¸&úž2*Aü:½„çQèþãRêØRSZ2q‹PÃý¢u÷Q|³Q' &^ö7Î/tY4aœ à è$½¿]´{MæÛÊðeæÅáij4˜þ?CºÂóe4zØ ^nÏUÊóøn« Õ\%µkABÕÉ=q|oßîc©âåÍ;ÈñÕ ò\Ro8­–³ç€~bÛ° • ÃŽÖnª€j½xLˆ¸Ù0Ô{=rf€[ ¤*xÀAt»Ã­$÷l¥ëWß'ȳ"ã’Vçn˜ù>&;…4Ó½[KØ·Õ½ƒgãо´ù´PØ™~MÙQmMû®.–ý–¢ ½cC¤Ïîò|®é—Èâí†!=^z“eŠ¡>Ê/$Jx>Ì>Ñcb»Õ‘r m  GzN;…З< ÝïÈ~Pº!ÆÄö~x~ETgM¹Õ§AnÁo<ÌÅøû -bϹþ žÂ÷ËÐxê9€a¼'·À‹[?  m^ÑíÆP¹å¢Êß,&‹Æ Ò}¹ çê½oYÜ#”É3±ÝN÷0–éñX«lô : ýQfÿ­d‡mYúå Ar4°'Ó–Åï«£¬ïžöçÜ¢=³ü'a®”Y³™fKßTüè”IùéFünö~ŠæÕôD¿œŸ½‰ ЀW £&Ç\Îyý~ßêÈWšX )^A Ï[Õ_ØôD–ãj¹xòÞ}Q¤'ÑUʶo†]¨yâ特²þ›¯¨÷仵¯ÃOð1#çÆ’Ñ¿Éá>Øa3ׯú½]¾_ÄëÕðúŸÂÇHj½è:U%í`L³šäƒñ®x…6ùOx 6&>u1™‹6ãQJ€€7cÓ›0m¡âïžrëјA[Eço&×çÖ¤»]Ú9ƒ¯‡9íø+œÙÊy]íc#JVy<æ5ªõªxýïàç‘ÇNÅøÆß|`íDðéÁ}§À›Æ²î…_ÙÎ[îá¢Gߊ÷„Hv•åKfãhšÔMÏÔ ÀÉs±¨û"®¦4 va“ÛüeÀU8rîú7’ɪ«Övˆ¿nõÚ¯WÓ59wDgbùMíÄ0uË•žðœ1¹}ËŸ|åÞ± K~´z˜7…8ÞñÞôÚ–ø_¸Š+°´4—uXF:Ž ÷Å;/¼n³íõ³SH­Ÿ-Úºs‘=Ѽ‹°€Ä˜•ÃU7Y ÆS¤>ÎpFÂL4Ýà±ÇÊ|‹o׎Ím†¦«ï—ĸ«nŠÊV}‹vDÏ„hà_™U3ï]ÆßÁxÛN¬Ò;;k­z7\ÂýIÂãÖ±ný…4æÓÉÂn›+Àœ{4~]=΋©fö›Å`+ÛÄH¸E @!paÐo4òW’ާÎùÒN?vÁ Ä•ºõS“nB:ÜL¿éÍ{¬zì4ã|nÁ¡…´¶3Ì2˜&Û3-×>>9 —ê…¡&FºªžËxEÁ!bZÃictv¤üíÒÀ„¡w¥B<Íür' I'ÐêŠ])Z9fÇÐ@\-”®uó´S¾EkRϽE¸weÿXÍfÍKü…ÛJݸ¿?aÅÚþ:7O§©µÏtnžSvpAL.ÌÕhj`PFHc=ïÀ¾ì‹;ÕGbQÁMW˜¾ëÐFMñÒ{ÖsÕ±l9–lÀÏúm}Ïö+Zôˆz ø¾/;ÖIÕ²Ûôž{rçæK¸‚$:ª g©¢»Ô¥F=ⳋ”‰’xÿÇ ä±5‰g}¸ˆ“©wURñÅÖ+h‡¯e…¤Ôv5N¿Gè_ƒ§æeEkQ½ù–„2§ì¹ùÛAWýdÇëý/YúFhãG]¶_\–cÞ `˾ŸX¨ Tï”ÑÞÐÏŠk«ê)wD;^Y®ùØê7¯ñÊäü‡¬Ø¦çV xFýHe)¾ýÞÜH¢kVž…‘+ Oæ0IÖ¶!Á=³úøùocß{$û¸ÑIFŠŽ¸–ël®Y­aQü€<’U¤YÛ&âãâÌÐñX›| ³ã+*—ï¸óëµîü£ ˆ´Wˆ±A­."ªÙá…šFUUàV· òGÅGAˆ´·ˆ±~Jýjñ\ñAƒ7ˆ¢Â~rü¤£Ä/Ô÷® Ãæé]Ò‡بVU^kÿã‹èçŠû/„±\þë@ MuÑ,î¾;´ ["qç½ûƒÎÏì8¸<e˜þqá— ™ð7È5»¤Ç ›—vIoHØ.\¯BpeSØZdm^ˆ r‹S¹QÃýú'—‘3GG¾ØÔeÓú6i2¡¢2{eˆàº1"lò—$óp*ºÒ·”«œšÿ àm¢šÎ?â§ú±"9Z~Í?wè󉵓k£Îl¾/x¯‚FC—“¬GÔgûMIæÒÐ&Öb}‡ûïm\ާ®ï¾ÔÜhldÛ†³ôšôzWé7B ­qýhÿ±ûÃVÔe>Š®2ƒŽÙ~,ak¨¿ ]¤OI@tš5®ž,HúØÌø…ënY|>eYÆ/)÷6},£¾¶ðÖu•È);‚ð_Tª;*„YJJ^~XÖì`¼šS•CtÉ¡H©^:F:n}ðYA&ã·ÚaÇ¢l?ÛBòÁð„ækG, ³§Q ØYŒHO›B@œ_Ç ,–2Á`U¸‚w¦Üó:²€âÄ¥FÅA£qÉ»íçð(òreä&E<`ùÖŸý8ùq=¹” nQ+ 3órÄöEtqÙ8¡‡K7ÒèRG“È_æbV$¡žMYSà9›*[´øïšL'ÍðC4Ò°r Ê(ÿÔ*ŠÿD¿»m!{Xà, ÓP‚|‡@Jp ~舙È€ÍÝúÔ4IÇÝ׈Î窪ÁŸÚT6µ_M«øšà0²puÐ’ —l5ájY?â¼0i±Îø»ÑÓ&­DÇšÄÃëðˆ›Nêd*9.^¢jY?òœAqü£·Š—0gQ½Á­†fÓQ3?H h·]‹Zs·ŸÌ ‚ö_ç‡?—lhÉ} šÃ ôöe ×µÛâ?+X+R»«û^pwÙ‚™¡ g?Ìmȸª¢Ì¹qüÀì î«Y¹mabuvySÜw‚»ÐdÚ˜ãÈ‚*wÆÝHÃ#”É©Àx¡‹;ã¦ñÇÖ̸–†»£ïº90lwM€b‰ Ž6ãuTh ÇiäÎIõiu%WŒ…W2$˜œ‚]?œ‰É*ÂŒ] ³Ê)XõË¢þbù‡q]?¬ˆ‰|áLÈñÑÄX"kÔÏm³ŸŽptz¢HÅU{CsU¬W£—eñÿq‘Î1ç!„]o'‰Šl`ÆÝÖ\eðVÙ¤a¶DxÞˆNIßô;‚NO©ˆß*¼4ú{M0§ÐñÊKQ½~G¿ c€GMUK^Å2uüüxÒ»yÀÆÌà©"®„Ó•mË!¨Õ€ „¬}ñj_®¦GùïÈü¸°Ýî” J?ýéùÇü:C?tz%¢¨3Ò˜k2J``Üu|*'\LÏéÛ„PaÀÁ½ë¸¾[Yª¿7€8;=%áÜÚ©i;¢/^¢›'$ú‹ü}tJ‰[›HGY‹åê@͹«‰?)Û„aw€Qªô¶SSKݵý¨uIŠ&™ÞýÚ}iÂí +¯í™‰ÑÓuü CÑ] "60À…vIä¯ãQà}<¨G@8røsåóÇÊöô~3WÝ­¸P¿E;}†ú‚¯@T¼kAÛ¢e¾Q¡¿Ä»y ;rïæ‘$™ûˆ–Ø1Óá¸ÐíE;ãÄèÔ(õìâ(5:ygýZšÀc¤à[þGiø=ÀUŠˆ2YTMW£þ! Pg¶Æ»Y… ªˆ«xq½l?¶27k=!vbFºX?Xdþlm²'~ÇOÈ­|4 ~ÁÚ³¹WìÏÄÐÓÁù“ŸDJݸ{l¶äÚíIÙi#¹¸Ð¶GåÅœu õ9™¦O^cc‹éÇ_K —|qß|Ü÷«wŸÁb¾áZ7ÆüËk&òç'^¨¢ìÌOˆ=Ñ©4¾5xoÌýÜâ×›ài^lM›€n7»Ph´ù¾5™\×õÐä7Ý‘Œ™l9Ч‘ŠË´)ÊhmÖ•é¸n¼µž,LŒRÒ-ˆá¸N¸pÏÀ×Lªyg{„áj÷¨Èd\1ŠgÔ”þ6Õ•%?™þ~ë ,]ÝÌOÊÜ’HZu Ð ÿÆa?803HÜòõ³¸Z¶LÔÂò|N„”ïðK•k¦;#™z/0úL«ŒÊ‹]ÞåñÇ¿œšŽÛ~p/(üÞ¸Õ²>%ô7Mð©9¬UwÍÃ#‰M"ºý€NT›J¼ãJ¡@C-ØÝ ŠÍN4\!mÌZ/J/ÇÉÉýî~nÎ Wó²ˆÂâI­'¹êÜOûÿƒÖ´N¢ßÈ òÄvv=ù)ºq C~¿â»»ú:s¿¾Ç­ª`í·>• y톳¡ ÚeŠøQÒ¿ê×é[躎ø ž¾s6¼dhË9ð¸ù±÷žm‹ovÃïàc#Ç8¸j÷Þ¯œR]ÃùmÿœÆÇ%«')«¾ïˆùv{ájcÉuUb´BBwO‹èÔt§öK›N’ 'q‹E»á¹ƒÛW*K“rÌ×:JÁˆ¢­Ÿ­g¥ë¨r\>X›ô£Å„Ï~¸å™by®låGœåˆ R›¬dÑuk3tßõã#úI0ôbã /vFÍýÆ) À¾¹^B@ $¥‹ fVk‘0–{=ÒâÚÜÛ¦Ñ)”г»8µÉûÆ$»EÌH?<4¢!×á®Í s„ aBS¢ÀÂ(èI`å_Œmói‡‚‹Ó*l”O;²á¢4ϵ5ñú·ëÞnÑ/IE·ðb/të÷üØñ”ÃïèÑ*37¬EíÚøˆO$öü¤ù;å_ ÁfÆw@©„×nñ/Æ×v¸Ë:édîù‰¢‘‰[Qö¸ú…{fcÓ°ÁŒ;»f;0‘UÜå°Íº Îï† Wåµ´÷{>ĤR\ ˆTÝÚ†÷Ȱ7øÄá4ñªVºÐMB§ ÀâüdûÍ^?´´ ôý˜?*NV!UxβeïeÞ?—¹aôGçìð…{Óˆ-‚ŽÊûjf8œEÔ…µq¿ß8†Ý2„€‘Ø?Ù&°Í7xŸÚ­Ú%­¬wCìæOÁ}×ì«õØÿ&^Ǧ£Â__°ÉÛ8 å!I¾»½‡Dì]ôäÓÅ0 ácX¶ÂÉ™OÝ¢î¯)îÀ–RªPÇïôúÌé·#™3èkV½õÝáŽäpÃÀý’·õ¢k.˘lÃ6=b#ÄU!bG”:‡*†G{+*ÚMÁZî³g‹Ý˜ñ­V=à°¿Üä>¯9/}­¤y/Ëð-Îe¹ó¡³h°TÎ{¹µÕã(×n'íMM‡*}b,TDªŒôfe¨ƒ‹LXã­–X8öwM>„cƒ¥ªmÞEµ"û#J‹Åü‘œC:I-Ø¡ŸÙ˹ô]éÔ‚M±zDŒœÂ ÎJªÚ—ýø%éí€ÒAs6fcùÕÖ’,lÙþêý׫_-K£ó„†0Ò €b–îø›-mmýuûí뙨€ø‰Ú‚´ô†·ÑbÄÏú$Çì9«84>(!‡rÛÞ§²×ä|ýý¯µzòÆ@“ðòuP껢‚ñy³´þŠžÏÇdõÂDâ>B9Èã–ç½Üt™Vp…iŒLtŸd3$ꨠùôãV˜rÛqŒØõ¡_r4‡ÞÕg¡Ÿ/æ»6FœwåÄ®â:ºåjùZZ}ç¾PË&µþRè÷kÈmàÄ–/N§•Œù¡¯åÝÀ:2ͧeçVçzϯ¢{KÇüòΡ8±[feœ8Ud[Bè7QÅlÇ_'Q Á!v~ŸA¯› ]"ñ[~LS)í+ß"ÌÅOäph`@ש÷.Îíèâ'¶‹7 ƒVj~-%“ÖYTsHë¯Ý¿†|Ó’aµéž˜+Ò[Ý×W³‘Òú-O$5ÁC?d­€ö0ã½w±qH¿[è»ì ^çA%éG&Ò„¯§ –…HÂé]ÉUc˜ ¿ §àÉHÑÕtœ>袢 ùÛ ³Ëóß_s½~9—1µIØ-5?ƶ…¢©0oɲÆþûâkóP¡º•§9q7¦ÌýÂ9ø0‰4HïË!S8f2ôÉEoÉoúkïyRÛI¸´×¯Ùþ.ïAW"bï\èäñ-ü÷-‚ý‘ u'3žQ‘#¯[Ó¿·˜ÆÇ”õÕ-²Á_7ñIÞoiFu*ç+×4,Íõ’‚´Õ„e¥ólp¤\œä/¹0(û!˵k“&´®×°³Ëv f¢½¥ˆ+ÚË3œ­N[¼ìN:†õˆ—8_@©ö‰Õë °9®Š/µÞ5ZÙ`Á ÝÓ>w懡Ö%˜FÐ,(i½/‘ ©y^r~#^—fõ>l£©0ŸªBŒ•o88ágsö8…·Þn ž†½DJã/‘–×ò½ñŸ[4Ð<—£º—Hünã·B±ÄSHÃ!+ó^:`qš]‡ Ç vâ~ñ fc>b}'SزŸÜþ Ï;xýÍtù™­Ï/"ùyJ/“p +e=#yÙœï6BÒB®oZ?©Ëæ:S:%ø«±¯lR§îhþ-Wd~ÿVóÑÚ³žÅ„úØã·wÂÓÞÖIüÕ5“°¶{¦é¤×Ö¦ô"ODdµaôØ(Ë}„g…Q¶ñT®â]SÝâ¦^¼0oÖ&\×õ‘fÖðl£|ŒmÁü|A³øz0ÖSg>^ý\xž×úÑ?æÈž:a3á`ì–ܲÖÙ˾ëǹ¢b·u2\ ä×£uÿɉòÏR¶} ™¨âyÒÞv¢ÜÃTYd_çwÙ® u_“ç‘>éMEkÒGÈn´Ú~gûÊTSô• ÷“=ß‚š®n0fbU¯Ú+Æ—÷ãTã}¯™ jyÔ°åsG£Ê¡~é" †}_ß*pÍ[_&­BÃÒ£eSZÍpÆÝö•à_É.úêáW¸ñ“ÉZNxkh_»Äd²ð¼uì ŒÞë0fXÎç—cH¼ÄŽþ/u\ƤÄÀ—‡fÅwÖîÊcíDŸI˜û,¦ì)–6ÈWärbšæh0“Š¡;žyâ\ß³ãe÷™CÌQ¦{²}¾Œ! 禣tñDŒ SÀ3±§pk¹nœtr)Q}{~p"9æ¿z\÷;vÆ GHHÊšŸa5=Á\È!ó³àâÒÚÆZŒ`ˆ™•w¨·Ÿ¡ ÓTÅç$$’]‘6Ä%7Jž=ÄÌÆûŠ™ìɦHÀ¨ñY±G‘#óOeÁÅårWCÒt¨æ[âuüæiFEBÆ~ïÅ›ÇøgK¼­ ³8M>~ fØ‘›¨x$d9O’4‰ˆÅnK t ¹±sÔF1¯MÜØº—)/4<;eNð¶9bØ_¼'îKö ÞØÊµÈ€CMŠÎõžðM†&^Ò fx$3\ˆ¢`üu0¾æmœîÄ?¸+ëtúj^T}£èjxb()áÙ‹Þ°Ÿ}'~nH×iU˜Î§(®Öa3¤l§¯Yõßù|…;Ç<,âßk/xü’Z¶}â'[=ÔÆ13SDƒD]£OÕ'!_©–Ú[Å[Û;Ëäp«o9°…VD¾Ñf{§Os¶/$‘¶²õõÞó&}óÏ~á"!X…H%”§·/´Ó—ìÄj¼¡ÿJÞHsü|z›zýXadq¼i›ñ’‘óOÞÅ_Ygç¯óÜé›*ƒµü¤‹ï>]åȧº7.—ÃùéŒ7oÏ‹”-¾A}v[LèÊÃ'ïœ "·ü~…2£ÕDñm‘ŸWòĺ÷¹®Ë›’`aìóµéî4f[·±©µ¢ ·‘Ôž<ÃYtB3šyŽ4ER÷“ ð|?S•YL—ðÄ¥ ©òùQN'•ój/SÈ/õ˜?Ù쟠ðÀ Ïîž!×µ9Ên• Ê* f‡Ž– aU??ÒI¨Îf]kfºÕn°¹æ×Å¿LÍ!׺òZª‹óX*ОTñ43¨àLnjxý¼é—á„àŸLg†[œF«Ñ($Š> ßÁׄ`O!Qaøbz@Î9a!f;‹!X kbCN–Vªé¬çoÐø(Àøo«¿m(Bß”°/§ú'–„÷¯@ét^ IãÍì«çYÙ ë¿bg`¬•ŠÕµþ8¬ì­ð¦ÿƒ¸pù¡bØÐæòc‚:˜# ÒÍðÞ]‡Ðâ»–3tQ<î?íÂ/‘VÂ>^è=jp~õW ¯–90ÝÈg»ÿ(”hË]× Êk:9äÌS’± ¤rÁͨ¡Cƒ€ÎF~40ñí;BΧƒj8Š®¼Ù¿ub–—}ixËÓãRyCÌrÏÝØ€µXγ’·Kâ‘8˜å^ ÝhMvÛí³¬`¢#è4¡°’òꎒ÷âí.» ãû4˜âÝÛðsg‘~À”Ù_ÄÓÅ.ên©Ü; LÝ:É´•*¿ñôe’)߇`ualð “8ŸÓ5‚² waðÞç…ü!iùhŒ =ßµÃsR«ïí˜ø#3¡ÏõŽê¸”KN}Uˆâ¬74(?|Ãì÷ Óç21DÞÓkU¸¹]#«BÒ *0¤[4š·}=Õ£|´û|+uÚÙ›f—`±Edœ BfºÜÖêŸw,ㇻ£ÞéÃFǸZý[)Àæ´±&— ô<ªí*Y25që ÕíÏFÍŽp¦Úˆù<„p¢’äá±3"wûp s•‹.Õ7âABÒ4Ž+7Q]ZKz4 ªø²`­ 8+^ ¦áèîä‹Bü'F@A Ñ|Ð#Îk@4¬Ò›ñqA9>ÏéH*¬¿LòËcPHC0ê>z^¬µK æÛý¬z\ûî†ñ—©êªNCÁwŠH²á~}vœM'LÒ™{Í ¾Çüôkï€ HMÁZwcɲy6QtÊš"èÅãÄ/N”*÷ȶg/€I^”EÓ­ËTuÌ}‚»d5Å&Kö ¢ èýg„gõælظÞôŸ&+ô…s¯âú$S±ßÑyÛòÕÙQ}‡„ûÃ^%Ä`¿› ³(EٻኗIœXG®…ÔX‹õu<݉ós= Ûµ‚‹î®…£}3Cž&k ´®ïqòùò&!€í©þzcZš &á0@Øl¦?lŽÄz ±®Ó(ï dº¡\/ „¡c` s>Jl<ï%Èhâ§1ðá|5ZìW °·KïUœB¹@Õ@3 áD§=_È2> YÁ©B숗aj"¡Ü]ª"B'­&ÅžD@Ð/iËó2eá²þ·—° W§.’L/ÐÀÍ×k2_7–ì*Mf†  ƒ5… ÂH8|!V„;Îo Dßuí^„ÕÀÎVüLìËÙ®Àš‰n\Á¯ÑZ“IZ…›93ÏœhG˜O7¾Ÿ­u‹^ßVÂ.ˆ6L V£0%¸¯NóæØh¨ä˜]ÐÓ¸HÈ2`0Œß •© ÅÐ¥ö£ÌdÇÆ’h8¼> kÓšÓ°n÷<î¢Á|[—† Q #Zv3’Ð% °Ý÷ÌÎ!¼»Öe’é]!Rzb¦†Ÿ©j@N\v§e\ó³ôqÎq„ qçA¸þ®c’¦É„4´VT$UÝžf&Û£¾ºE°Ø¯¨Âê¾F…«Ü¨ðàÄU4àgþH€Ä$¸&\µr?¿~0.ÏPfç)3:am,©ùd\fþÞbŠÁ®î½¦gÂ/ …o(:êò âÑñõù[=÷úSßèl=6¡0MÖôNP“ÎâÙŽ»WÍcüüdýp¡.÷óÌæ~í‚ñE˽~±f¸ˆS£ïô0Ûk,xɤñ¼ a~5DoõP¡¬(¿~±Çf æ ý=9w¹=£Ÿdv‰Ê9³z°æØz•ÿ½»ËÕ¦XH×!Ý¿ÂèÀÞ¡´ìîXäO£Ø%†NÃ#€úÆË¤3£+¸P¿"»Ú–Gœ&SƒÓ*§£&éµ¢Rœ£ p’1,a…­;iaÞ%^ÃÔ¬’ëx\™æb@iÚ Pôœ{CjáS,WEpà<ŠnãG«>¿»˜'\ì]CžµÄë…g]Jø˜då†I”džét^¹*-ÚZ@m™ƒ#M›ö;Êœ  Õs¼†ÐuÒùôò˜ºïkJ¯p÷KPÔ}Œä\„p1áU>ãL1HzÙG%èüD³KfHöÏvßðÐvDgÿObÔšëåz\dæÆÓ 1cmŽIÄš» Tð¾kNÎøERÚï ÀÍ=_äpÏí^·z ¸]†Ä?«§ªÐí*'W~-t À[Ðno’¤!ö´kç:`’[QˆoÐõ‹$ì›@Y„üæ´jòöNEà]Ñ5Ï$F}Ÿù$}*òýmÚ\ÌÁ@â49Tô à¹¡ù(~Ð襓xÕg>w Ôùð*®lêõ#B̤iý† Ô(S0ûÐüÝ‹ýUâéå/›©‰ú ¨ìÌí~×¹´¼8ÄòÐ#©Y“¹‘ܯ' ¬Mvf%1Ø-ÂÏ· k#[êNžL0ûBŽØS[sªéÙ¢fxm% kˆ®ËÎ'/ýÐð\Áu0P®`€Mºc¼Ÿ´T—vxþ†?ù[ð•r`.à ›Â-Æ`Ä<ãBØj@ˆ9˜'…¿}ã~æ,ÒŽõ ˜e¼Ù"$kš¨î#=do¯w½G¸ô1_¢Ä•-BÑ•žÁ+)àÁäd9.±G9ÞŒö„v»~:ÎÀ»4£ÝÑ;0ƒ³gŸÏŽÀê¤Ï‹çå×àT÷d£¿ rŒ¶» ºm^‚©U­àì[eö}oŽV(.„Õ¼j5pò·Ã|š î‘†Û]üØA6ûÛ,wJP[Ã9?2òø¦o`‰}8õ,Uîi¾]d› EÒ þ1ÐÁóné²R1w(fÕvä}ÞÄ^_§KZÛ`ê ¶ Ýùò‰¡'ç6O:™—·x˜»hâÀ`0 7dö³}h›"蘚2'¦."uæû¯á’Ï)_—‡äûKfˆÜoE±&»Ôø-ûG…]¯ºÎÍÑËŽhM#Vwô’k]jSçÒ|6zò„9Óîþ€°_GÝ •œíy87[£îr†£±’wŸS¬;ÂìÄXÉŽñ`² 0Þù¨`gáB€Ïm¸ìˆÁ4B2n}Ú'…â9˜o ¤­K¦ŽÌ6>¤^ýá­i7";›¨ä ‘š˜hrh}b@âÖìÓ\Nö…«?¤ás#yݵê^(¹ÑDNÌ!½›Nú¬gsFÎõ(a‰)Ó7¿Ã¹¼Žà×2K@?ËÝ9Œv ÌaªxÀ)ê¾½õ´¼’ ˆJlUË}/ô Œp*q[¸ˆ²þ¯ÂÖ–èåxöï÷½‡Ò½Cø¥¾0 &:ú«Uúԗ‘Ðð[;„³°ßa ñ‰Š”‘©¶ŠZ5¼‹çâ3sU —ÚÄ”ëMá¡k2W Ã;XzŽ Î-ÄȲácO·Ê·p£Žè»÷¥1+Ù¤ÎËî…Hþ„K¯a!Æp¬„÷)µifôåÃ4Ò:ªªåþø¿¤»gI ’/Ƙ0Êg¤ÄIË5‚€ÕÕaéjçŠÆx–NíK½}rç$úݺD¸ê ë‘U–Ã,r™ÍcªçÇÏ‚½§Cµ&¯¦ÛýÎÉ-Íÿh­(ìY8X+É/+‡1tëÊ ça{“JP]“$³¯ °ÍJ`ÌQØÝ˜T¢,ˆJï !`^xaãx®ÙsYy´ Ʊ&'¦‹FQµú<~§£‘N:u$¦«ÏR8W ÂïÒÈï¯æ pŒsŠâ\Ÿï¹§5!¥#-!]|!f€1M©e飰¬‡Þû0Îé¤÷U×®¯ùäÉ+xêÐmŠð”&Û^f ŒMÜzåJ¾½Þi§O÷.;©}5þ4<ŒÅtÉuhß¾ÛùájzyÙÕSlwxNZœ$‡ŒÙôÉ·}ìfuMûgTºhÆOvÔqÁ™J½}O 9pü+OGÜN%zˆp±û\ƒÅO¤ 浩†¬n(È•Œ§É·~t3`ßö…RöžV¤4-uKn\ßt¤ï8ŽÁÝ`°(ÆÔZÄÛE/Iï³:ÒY¦ï¼€Ku1ÅJa01ÅÅ°Ê løjªácŠÀUjD²äÍ'ãí)d¸ Iª]<ÔbèS@^Ð=5ü½Ö3~ãõÖö¯¹ÍüÔÙWÀOkÔ3ȳgSؤ ;rÛâ4\êð¦måp¶á™8ÙW¬\ ›àD°jp¼0–{@ Ox¢À^ä‹r!/ ½O‡±ýÜl b—ÄðPh}gÚm‚¬¨mĎɹᱸ‡X¤Ô\™š¤,Óø×ÇZ)´ZUK¸S*±6mWU0ë1¦Ñ_™Dûløq@éZbïw³Iû†„.æjÏQÒ½CâÑ’Çi®‘Ó€‰Ð‘¥þÖÃU~*x9¯À`•&‹Ì†´~Ó;ÀCtë¢`¦?Ó±_íºvgï@vG-ÇÒƒ]‹²-/»Ÿäßâ~7¿s¿k?×Oqê¥;$¢ú—È“°ßiÕÕD÷(n;ý;ø˜ ãüZ# 9,ÁýfŸ ÉÓe"H¶¾¦‹‡M&kÝÇ;TtÓD™hëbêQ1XÝ3D‚ø}4~P~ƒ€M›ëˈֳaY—7y®Ü^wþ™ÛÀ·³<Àá3_6¹%RíD3ÚϤD”L˜‚D Æ;dùñœø×͵±ÓèÌß Š'ð´ç[ñƘÉ@g'g#ËmNäBÊ]hók°\Fz'#cþ$§ž𙀴ŒòÑÄBC|Ç»Ë$' _"Ùâ;2J”£G©Ê Ì1Xg*ž »ëhÃãJv3ÇEA»aftÐUœ½Ó2íPŸ#ÒÑÂè®F q¤È";‹ïeÆšÐüéN²ØU\›ååóWìÆùÛ$¾ß¥¬‘ꡳ¨­néB»çr륦åz)†lÚ¯ž(qáX ,]~\Ò^Û<&ÎÓ<1í% …¬Šj<ÙX’ìÑèØÔš6õš0£H%”ÁýÚX­x²cÓúÑÑ_¸-æY¡û£ç oü´íµ»¹zò^â ­ÈehvËÏ´rÉ.rG–rwïHj;«ÐªV[S)œHšn Yðn1rî€}éß!føDOã]jÌ9¸ôéšSf¸…\ˆ±·ßX&rJ»&.Xž'f&d¿1,ä ZÓÓ—@hý©ð;ÍL˜X —!Šî½žšHÒø]môÍ^³¹vm‘_FÅ%=µë”_Åë:r%0{ c³ç-Öï ªÞ˜RÀ˜RR÷$D§¼Ç‹†ÕVâË÷/Zx~òy%AÊq Tå7U†«—¸Û| "ì@æcäj­á™ûeŒ9#¼ý›(Õ½\ß$±ðK tô1ÝÔyâ÷F3F;äõ“üæÇíÉOî÷ØØ=‰vÒ,¯¿¿Ð];$ØákWÇï»B »I˱«bcîfßÖ`~·É2S™Œ+É“’_"„|õ}ìMu—4uùYÿkÑf)y/él`›­Vy`ÁV_Ñß`}ÝI±C=^Îumþð0©BØÔ ,ÎSyÑ>zìT„]*1*Èõ\%>úíÁ´åÐág–ü4ÍôÀŠÏ=¼ ‚u$ôL ÀÌɪq©_,—}¿½\߯Ðç·¥ ¸%† skzµ&vöã)<.# “^ø¥‰gn¯ˆ–²É‰®#)Ø&çÓ˜¶+t%už‚§¶Í9Rn±¬…2랔۵)P˜M›k x ôkD‘²ô¨£7_rþY.Û”å]+d@ÓËâ­þöF—Õ²oçK/@›ä¶=ÖÑî è!\0¸>vý¾cˆFÛà^ºs¡5™jçdć!.O£4â Ò­Þ{i+£O¹Ýÿ \AÓdÛþ8Hˆ” 3(Uºá~ p†Îô‰N'w§‹ÞÙø5d*–Ü¢ø»çõí«+Æ™½rK¶WÇOSâóùe¾“wÛÞP–p„ ƒ<“¹”ûŠãÕå+.¯ÆÏnÐiXÓk¨¿Ðã(µ†œ0z±!wL¼F¿ðlY´×'™\·ÞÉŒ§qÅjöâSEç%ÍQÓwm®# ¡Öè›'Ôú5… Wv+,…‘m&RͲìöóH^03””Æöâfá*4;×;ïOñÆ,aΆ+”(YÄ÷ˆÝÓÈCt {»¡8b ±1AôHÐFaËíà»ÁËBv÷¥„óL;ÄNÿèq>ß¶ó8MŒ$ýÈUS¸¬ï6\Þçë&ˆÿ5Â%ÑÎUÊ MáÓ'ü›Õ}hqe±Ãö€Œ–k—ª>Z8«#E¡ø ÷•À¶E&Ù– ÏS¼Ê ªíç4jdf(¥ã -Àè;„°Ëдdê¹CÐ|!Ö¶Éa‹À{ëøÁËwÝV<;…rsíT“Tªè(e~,bf^²Ç.„\"%Vƒ…þæ^Æ.~ÇÑàÖ·ŽG³ó³U;[ÁÙE_cht¾cáÀˆœ+~¸4ÜÖ@VÙpwA¼Í£†Š£Ì.‹ñU gà#לäAÐA¼vwêî#*Ë Õβ<>ýý*eôA|~öšYæùÆJ‚=–Ë¡&Î7ùã½¾¹ck?ˆ\J»ªÓ²¡¤¾9 öïóÔÈgâ[¼Rf>Ì õôA¯×©øS5dln“o\ u©õdõðëó÷áúÊ•³©äã>/»3ªÅ|Ì $R±‰kùÖL>}××EiÔh?W–‡…ìø‹sOŠ<+îÊbìV•øó÷jþå̪ ¿IºjߌºÓº»dh0JŸ\2¼ð1s¶ö˜S†RÅ0g<¼«™·ç [ÄŽJ«ùw eãc÷?FT^‚6µ7Ì­@Éêà[…çW©WmÌ –¶4\Ó½ß#”íT£Ojf`Eìåj9òñUæÁ.Uçå­;¥Tƒ^˜°–Nt?"ê5„Š®gæ_e0$<:%7*|ÆÛÚÈ̘êüÙ%‹[1€cvThؽ³¬Hºñ!ÓEúç$UŸeÓyÂïqoç†ñȨ[X±Bo±R¹ÿÛ>é¼z†€!‘_€tQÊájþK2×$?æè úÉh3vÁC_˜~Hø¸`¯pi…¤ÃûÂá†êK§jÙÉ/¨&.uClª#\¯ˆ'%ï)ãoCq \.š_Âv’…—µÑÏ—¹0ù×ßêe7ð»žê!<¿+ìR’a–ä°›ðp¹3ÝHPÏä©ä÷µN¼¼ùŽ{¯ÅzË9„É…ß1GtQØ!¨ZD©ªÀSà‚‘WEA6Õÿ„§#>Û>cúsþ8ÕQIèÓå´ö‹1µ0²¥ùÅUó‹Ã>Æs|Ȳq}µŠ<ªÄþYAQ*½*ê¡þÊŸï”A­sz!DZ´Eõ¯Oi!Á~¼!Ý÷Â(ÚÉ)»Ï1·]ðíó1=¼N0ÖˆÎã~e(Vj8µ±01dlós’dìÒJ>Û†3副 !•jHüÄ`¶ï6^#÷:›³dÃ\¢Ç þb0Å'û×r¾íä2Ð9`SY_Ǫ¦\ŠÂG`!in7Íh[´7¤b È🖀„Wq´ª½á‘¶±ÉÙÕññS·3RɈ½{4 í«erë~2ûº³¨&³8~y“Π »s•"xƒ@٦挊Oç»Ø×¾‹¤£ ¡ÓÇgÔS^U02ÍįR!¯Å`’‚ÈÉ ‹Ï¦Ò¶f6Ür)[-k!lvzß dÔ8½e“ßj_3N±JJÝj"™×¤•Ø~U–lÞ09ƒÂëSSfæÉ«Ÿ,Üàv2—x³²ßïSbAdük†±ô€/qTv¡#Åò~Œ]áÏÚàΛ޲Ò_%S·æˆ’\îàÛꚇÃÃÙGÏa‚‹Ûº1™öô.òOëñ“´.»û^yàкE‰'ªÈ¶·É–{r€øŒ›T³{ß®ŒŸã※zµÃ›€g:VX>î–é+.xÕÀHIpôñ9Rí,ĘiÚü¤?ÈˇòD «Š‰7z¤Yøâ*¢M Äÿk˨¨»ù ×ÞK=´î½¼Ýèìaœ¢Zð©ßÀælhŸY:ãŽÒ›'l¦ÛëõœD÷È’3o›bi™M»Tb<ÛWZy6­ã3[Ç<¤AèkßoïÂÖ KœXƒ’-­¼hgËÆ’ž!x?$ ·•vÕÎÜòoü-‡¬]«x+@álz­Í#öˆt•5y× 9F‰Eõ8°¯Ã“š˜òzØH©Øˆ RÑŒPX™Y,žåÿüŽ—N$ÞøŒß3Ù_”ç E)”l€úh·¡EJ›#ÚôY*¯u’ª›æá@ñÉa •›yÌWÁ©¤c-º):YÖÎk´D5ÿ PÜš&3öœã@Ö§Ç ?$lœnΗ„9˜T¦j§]e¢ ý¶ì_BŠ·,Vxs!+¿±Aœ~D4óEµ24ºëa´DŒGú.­6îÕÓÿѹrÆHIKï¾Òh•_÷µß—¤Ü$4cö,Hï™ô¶ˆ˜ì¯Žöõ®©p";°ŠXÅñÛ—]§†Î:ì¡]þZái³“ç¹…'O‡*nוqËì¤3£ ã¶pªÅñŒh_¤ó؆AØmÚ&4ö³;#ZÔÙ¥(²ˆh¦<ÜpY —$ô(ð‹(l¯nNl‡bãé› Þ©í¦Z ¾F¾S46§`â?·'Á†Üÿzo~Ce€çÙIÜ-ƒq‘/ÐHÊÓ,6Ë~Y‰¿ShÓi~ÅðœAk»Ç}ÉØâa·õŠ?ê¶DßìHŠ[빘_mI}aI|(L.ØY§=¬g›Üõ3ÉuALD0T˜¶)Ïf¬ uDwL›â ñb ¨xG¨y}¹^ÎÃÔ·Ô;>Êesi†`3£|6*! ±Ëôv;Xƒ¿£ºyH6kv³ƒ &%>OHI‹*êÚÕþLñOèWaM££5ÙŽ5xò 6z ]|Ä@6Q;ÓûI§¾0Z¡KEñw9ÏUÖQÖœzRëf?´)fÛTR£7üWGG>Šß µ8M¾ èJV¬¡ºV ˜ûUGßx>›÷eIä¼GzÕm&-“z‘$1ú”ZÝ7¾4¹\¢: ;xÂR¹Ü‰`,ž}äæ]ªþØ›Yˆt^ƒÉ×ÑhýÖìÙñÊÑ6™%ƒRÊ^zá´ óÏhiñÓ(hzÏAæŠodŽJôn °½Á¥6mä7¼0í¬¢òáéÕµFY`w´Ç^_EuÙ®y—W×þH÷ÿøµ±hw Ñ­ôÛš†=Çâô°O®§½×b†'~²QÁW¾Iç'Õ7–Gð¿wH%³kâ]ã ·¡GÆ]9¤çSSv¦e¨^çm‚ûìªÙ÷³àl¸äÎì6Í<Öü#p¬.³(ǵ‹öT÷ör©×7ÁŸpˆ8~WÙ»l‘¸Bꌆ—ŠúÓzâE’ks<'õQ$Ðð߬oþÖ`öQ(ô&ÿž‘]ÓŸm«‰<žšsÊ¢r‚ûgÖÃ=:2Uo…$bíx5êúI>­dú•cÛ7 ÅÓ›Ô]¶Ÿ›ðÓ_0%káWp³El4| ëáîôM¶wÙYKTŽÕ?c„vVw‚TóïøOýRãc–gQm{òǵWR‹©×è(ˆJc<µˆL딃ۤ‘:š6h‘rèã)ô…™“®OˆãCA“$ôJI[â3GÙí· /â’c°\YÓ¨ròò8ô~F§F}Ô=ÜÜ©çâò6Зc—žrc‚uDìLí'—nÀÍê±|K;øi7™2­½—ae\Þ.‡U“ظ´â[Z¿ž?£x¦ÛËž]ÿO éliÇ6i‡‰fã:`]·ˆè$Šº¥êÂÏHã®>²ÈöÃ8le•ñöhÚÑœ_Ü~Üè8'É–_x•Mx ÖA84,ø¶-á³­÷õmÛCv”÷D ¡“ò– úÎ1þÎH4-QÍÐl="ë:GZÍ|k˜_ýù|{Q£[~Wðú.‘ú{!s =ÖiD‘gQ¨ËTΦznÙá$ÉZ|TÆ¿˜Y¾… åqÑó9ˆ£Ž¾‡:JÒÁÞÍè0nœë=;,.kœ<SßIúÃinüxØA À2ÏüIFnf<±ÛV„ÏŸIÊÖ– Òtf8bòŸ¯â"Œ'RKJ·mýþìâ×›±¸À5aæoÒ°“$¨ ßB;(ž¢—ë9j=¦ð%§ä`¿y>8´÷9TJèO×[Söðë¤ÀÆô›U\ø—ôû߀mÍtBªh?' X†hTà„9šeG£©ªôáÂþ\zŠ’Âx¢uiêŸ\¥d8‹[ƒK›ñ”l nú×HÌ '²½ÿBˆå:Ë;°|f‚:%ÄS5•l=bÎÀƒ7Ð3/Q@~š“3áÞ| Ä9´Ó9+å9Í6’›€’Yôú8;´¸´®Ù%á8½t¦¡.¿¯¯yàû\"¨Ÿ¦áQˆ¹’6Œ‡ÂûJ¾W‹>Z6;iÛø¼R¾ÊÆxFuìëíE&;ó ë¤o½ÛÞp.3ÝÌeüFÆ“ÅÒ£Wø£"y:ë÷ ðÎS%5»°×MÂUV©Æ³ùy/a’§·Y»(T«Âîƒ_ï˜ÖýL¸aÝÔ1ˆðY¦ h–a—ººÕ?ÊÈÅgtk›,Cr0ìR¦¼.-µN-ßꟑ„*‡t„±·˜±Ú‹Äbï5°ÒÜ÷e§…ðòbÊ­º¦•?QzéÑï^ì޹0=wPÀuma”wMáÎçÖ)¦Ôš†è¼bÊn<l&qûâÑ€œËæP8†¾§UpÐ,rîx®‚‡¬â²ä±<ðõi”n ñv>ž1I¢@ú5±‚…²µ@æäž²®¾žZïUa⩇Ќê¯ïÀJìT#¼;ôY}þÙîÍÕ1}Uï´â*öøÁ“Mý/þÛ >už¯«öþBàÙ¬Q*”…XïHVaRðßT\;…AÝtJÛ èL¦>fýŠßE†s+ú#˜Ñùg-ùÑEUw¦™t(; =M3¯Ã‹(O~ •ó ~ëí¥6Asõ¹Êâq¯oµNÉÝ]Š|”£g›¾½üQŸ_áV¦ÊS~x¿ô1);uæ7e¥hÛ€³ýϬâ¨nEÈ{¼ƒÚ¦ëŽÏÔ.T.OZwÃ~¨Û‰Ñm§’—¿Ÿ h $Uö[9”*{]Ni»Ž³9)Z_:7À.úL,œ1•ñ0‰˜æÒݼ¸¡‹_ë̼¬Ä3_x£¯÷-á¶uºFx<3«ì~0VjvŽÄu:ø€åA.ü=À]ÆðŒû)@†XnÑúˆ?nu”²tl[ߺ™Nš)ȾŸX”OÇuÃë<”H°L¼Gቲ|R¸\•ïˆ~/íÈpQa?[ Ô7dGAùŒI¢Û‡K;W 'GÝO<çƒuX†ÇÙ³ ¥Ä U‡“ÖM×Xr€ˆ§Â8ÒÕ7À®Â¨H%€ÖÜ bÝY$ þC_c=¼× x6ÐÛTe¦oJ™•pIsJ{zx‹!èú¢Y›!Àí&Üj8ç&>“/h’ú¸MÓ]éÛ¾$&õæ×mò|váòZ ›cƒÎûJ6^¿ú.1ù{Úä³v [óð}[´äF—|Š‹Ob,é§w±ü+©ëš«}ŸGú<-òY…N«€Vû,æ7 vV ~ßö_¯ò¢¶ àFCö±Ê•¾øBîç“ùmP1s.Ñ´O¢ÎžÅÅ”Å#žàþì@Ë ]ÖçŒwß c5‡.¾Ùž¡6-ëÃÔ“‘ÒYGeWû¾†ê“ç[ ¤‘â&ïM÷ÍPÖ›+ÉžÛÉË«}]é†u°ªT$k%z¥/«°H…úí«ptwír¾Iüt@=%-Žj,Q<˜-Uì! %ÝÏŸ’*Sž<>©ìñCV½lú6 –³Ø¢­ï¸s7êýH6+S`”ÛqcrIïùcw¥|¾[–^»é‰7ð¹üqºïGåìYHÔ”§ §úx§_Ýïä-À{½r?.Dy }ÆŸäoPiœ}ËCIý ˆ©&©p±uu¾E„|\úœŒ?ÂaŒ¾UÖ .+®HêH½ø` c>å JrÉ óm³å‹£Ãÿ œK:±û ÐKê›<¸û|/Ÿ’{òÈÖÊ£O»Ùfô Îu‹sRmWðL$Kxà6'[(…ëT5¤d—ô©9œ_ïÖûP·¦n¾<Ó*ƒ§H‡[Ô>ÕòD›…ÎþJ³¸I8½I“Ut&ÜÌÓ_þŒ€rÜš<&ûrl䇦’•—c‡ÔáG(˜€ƒz{úÌe&Cs.>¯Rë„Qqe{ñ—7}¯a2’ks™F‘¿åßÑ5¡EÌ=ö7Üõøç‡›‘†ÛztÁ,ãd'}a¯Æ¶ªœw¹œÈålÕ ]kePÑì­Œk¥*Y·ƒ«U^øNÔÏ"ôçñÓ¾ñg}5oüäð\¢¸»@´“mBkcd%=žŸ,ÊŸ¯’•^W qþNv©J‡÷;æT¢ª-hW¬r¶N4QÖ´< ˜3Uc ÀÜ}›Ì†âñà´ç­ŸT´R‡›Éu¯@g¼í$ÇUã Q)6“_›Ïyä®îOQÞ‚*‘ºQ<+ŒÃ˜Ì¨<ÆxòÉzÌ£]¢¹êâG<ñºÁTº…¼äÚä&«—+øBqg¥Hóßïß.̲þ/eÑŒ g¶ü¤I½Vä‚ȲrV!̺KÙ•Ú!U¼oèê­·þ¶¡ôÖ3ëO †<—ç„ãüz+‚dHwÜÀt: µÙ«¯·Áñ¾šÞSÉ.C¶²å±uÙ¬¼õáE„ÛÑ íŽhòSÖJ:Ó wXæUNdýæÙår@—[{ŠÂí!‰²Q^:«\•¸b þ—è7ÓyÿÝjGJ’pNjyX©a™i§w yøÁ~”ôî/š ¸êU)¼ãšÆ×üc¾“²d¥U |™Äw¤â›íغŠÂÏ;éÞqFŒ&§Ö¡ Gzèã·YQ3ÉÞãÝ+‹7?AæÖ&lÉ"LoD]G¬r¢.&Ûçä7þº†Þ ñPQ Å,׬V`mV"ÏÆîæT×4k³w{·i'ÆÀß …A½”N)ó'2·è= !)ahXo½çqøAí jõÒ{)7²â6½ç)¬XïŒ @™~ñZ8àË †TIùï]¼6ÎÍÃÙm&ÃÐ!iÖ9m[’½Ç5©ôU 3.÷Òܸ¸B— óÇàÉHá²É.†µs¤ÖOö<!ð‚ßá Ä!aÕ~?¶K;1Ó§:£÷ü} u0È}‹ÁÊ"¿DÊAîÁñš“%"O¹Å)ŒQÈœ0Tôàýs)/Ë•,×@Å”±9³¹šv­}ç’} ,˜éúbÀži!}u'7žÿëä–lRõĵžàâwˆþÒ×yL—áöÒrp …UbÃEy‰t„YçzÂ[¶7sml¨æì-ƒ³—YE%ì <© NÊ¥„êϳ¾[(›½²¹š<Ò ®zõaÏæŽ\.n­wå™›-Np%}Óë—‘Õh’>TyàAÿÖõ° jÿY–ÞWŸå.Ç×¾RVrW>þŽß²b?Uê ´+ºA÷Öc<ª#³öݽ/ß æKBí?­V]÷¶E?­ÑºÍe?ÑåèR›\ íŠÒ\Á™èrJwÛÒÞœ¾¹Öîæmà9„[{ëéãå#7ˆ¼[èyrz¯n¶’ŽãN€ÞNÑ@ÁØ£6ßçÕ¡V…[Êóo‘3¥v–º¼ŽØjåþ2ÝhD üð VG wº–z&8òÆ8OÈ"®ÖeÇ-·ç-7d¯V5,FÖÓz@MqY žêìÕÑÒp¢îÁÈëP]bÊ©±cY¨/Ç`Ÿ`ÍÂ×áy“â=S¹é]/'õò›Â>ÕšœÅ ©‡÷a&Žj ?¦QÈYFÆ-U5~ãNõ«ÒíA æÐgHqà¾Ü5ãa<¼¾u|¡y°)†#£‰ˆ4ˤmºæ¢ÚÀ~‡@JÛm&6ûŒ{…@†çàk3ÛH¿Uë ý[c Æ?„@@*Ùº¼ß@bí2=“¸àò*«Ó›Ã»È]_´¡T ÙÕ D?/ºš…ð™-{"o’Ø€¢"N¹l6 P6ùÅ!ŠL ,P]ÓíâÒ´Í]ìú#*ƒB ~›@Nm佂‹Ge4Íš²áè·>Ø=Þ wÍ l™JÅ~7Dó~XÃ=Ã?:•«.S{vÌÂݽCú$©0Ÿ”ßø{ûÆ8®ˆàVµ³<ág%ÍSû]žÇ¬’~çØÑ6C^ÞòƒdW jf¼™ÌYÁ±9zçÖ'¯Ë-' €´,G”TmXôsb Öç"i!Í·ýpÔ9Â#ùéÙ1¾ÿÔ½…ë*ø-84Ë´ä¡v Ï öeŒiT:ˆœ$xud° äxòÁ®3Þiµ^“©œn¨8ƱŠBMí9­Fć˜‰ Íñ‡‡`­Ð¢AäÉå.)ÔÉ7¯k‚³žKø¶Càï÷¹6ò¾£ãÕwEŒÖI¦¸Vò^ yÏÚeƒhfg>ĵ£Àüt¥¶w¦Åį-tˆtòhTO´.ë‚0šŸB6ÃöH¬Žòoëôj}þè.×åÜznÀòµ'›B­rI¯¸‡çb'ìÀ!ܵè¡Ö¤T o±B;Ñ(.‡…g¬ÏËËMBé­”ª—~ŒV”,à«'óiÄvDB§”Šï)P Üîýâç(+±­غ÷gÇ*1h÷þ}ýoèÙ»›ý€ƒZÙ"ÐËÞ˜é1;¿€.Oûl´¡â*¦öí ^ýø½iW;èù…oŒˆçCBnC À<é¤[°½k¡ é~êçf¿sV)´ñÑ•Yh5H]£ÿFqŒR h°ð˜DáQÁB'üä£)ˆ¢¼}u+¨7…½@¼æ,*Pˆìxúè°$–w;^Á¯åT‰›ò–g˜S”á•08Öñ6^óÝe’%#ìÈó·üvæ©9u?ãqäXI!ÿì)_¡××ð}Œ;$º¬QÂû…djÈ\ßGà ÉS·<ÍÞ­?ä•;xöÁ.«ð¡úEbýÅ|“;c—Ï–cÞµP’jz6üå[¯ÄŠKªNÜ­÷VprU½çž‰­XóÁõ75 ¨ÌäªÅw¼DH|:ƒàûµ¾‡¡a{·³ï9}NWÙL½3”dÇ¿!’×XŽà½Û5µ+ÌX¤ÜGÜÂiVÉkC ¼æ: ˜»Òé4v7¿ï1~Ù³+ØQt¼¾t±Òw{½4} ƒ;…_ëîY&‡B˜k¨‚…ÃŽ©ñœ »¡ÀÕ0`²ÒðqT<ûÈ?WªÝœ6ÕB|ÙHô2T€ê_¾éGæë€k)Ì­Àj&'‡1¿oM¹‡í©¹‘à%]DÐKsDßÄ}JÉ£íRüŠÉ6×<¨– ‚|¬•óáÄg1ÚÊ ^†l\Êo\]z$´\ 5d¥¼bŸnQ¬@ú8ºªSÌWÆtÓSjø\±XÚã0_Ù< |ÖQ6øhò!oíܯ‘/SôpÝÃG"­Mù´ž/N,·©Î­ ùà.TbÛÞ™zI5à^?g¼‚ ÜúÝüd_n€zI•ëpgK‰Ôt¡dÆãCNmøxä–²y¿úÕÊ…™’EÇx ²`¹9õpVv„éöbÙ‡œXjÌ7öjÊçÊn”ñ ¬9Úd¹,ÉÞ•Â.{@UWË?PE޶@æ¾ñc®E…îÀÒMŸ¼Ît!OÁgѳ#6÷tß<鼨½+}µ½ð!ˆO._¶.rd H8ãÉϼèôI²ë(kr„î³¹¡BÀÉìl‹r¢‚‚Z$e…½Û ¿ÈîÄ Â¢³VŠL$ƒKáDkõyÊ®‹…± ˜^éÈ>?;[º+ˆò¼Wð7rÏàt®ïO~ºëXÕv[Ò`¿¯å¾'Ÿ¶ëD!Gø¸Ü XΨ°îƒBNÒ§ó}˜µÏHö î á¨*?w,†5Çp£ßïœÔpFÖ-O‰a—Á/Ÿ˜ª£¬œÅñý’ÐÙt¿r±Œ˜v³®tŽLoêÑT%Lhå *!z¿Ò:ï×¼ªWÊi€›üÕú>UüÀ£þþŠ&×vyü¨8p ;rÒâ4\áÐÔÖ·¶r7$~`l\}Ný*Uö*š×‘#U”wö{Šä74nïŸÂ/5Œ(ôÕúºŒÝ¤á"mFÁ·½®ûžXjeè “å6<ו³¿«Ÿƒõ; ú>&>O,¾°¶Þ®aåK·¼Á£Œ/ Öùôqí7²!D4Dmͼ«–§M|êë˧àÿ]|7iÿí~Á7ñÓ~› n»öX gvþzZên…5Ðܸ;™ ¿«k—çþz³ØãLqz VAyJ6d,<Ï2HÇ~5Þ·)&ªõ}[IžšÌE‡›1ø%A¯·8Ò 9×¥ZTUDvÍ.­æÈ (¾)ÛWL©êÊ\É»¹ÆRKüè)§p£¸õ> ¹‘÷¼—n=ðmi­,0øìf8¤úãHåÒú§F¸fÝᯀGûÐÆ°ÍÍB4ÖœE^ï«?™ãA,7Ÿ 5›,9 'ëÃæöqZÌ'·Ë¤½øÝO«Ë%v³ÄдݖÓdŽ·5ÐòÊÛíãô m¶£&ãÃÝ©‰…&|Â!f·ÿ'‡"Qd\ôn-šX0žÔÞ\›ïjEGOŠ¥¿ÀÒ öÌ:!¯@ì·–·½ŽHIóáÐÜA7i05Î{ЬL¡½×Ø£‡å‰ùF/°#×Ì.È»i›ƒë·Ë¸ÞI C½W^¬$}¯äÚw{aRÜ!íÈq C¯©gûNVšO®†—„Ò`žñbAâÁ{ ³mÞ&ëØýs¸™òc¤%#’ž‰$Þi‚6H´­t­²ÇQ& Æ…Tv² §ýy®¯šŽ ØÑ0îD»rKÃ;ÇQÎ2h¹àÎ xÁ÷_¿áÚÍŸÞÛÁóníÝð?~2ÄLYÿ²v¡Þ÷þei·AÙG¾gœ rÄN#óbÍëV@ …'Kl¬¸ÜáŸt6j¬ «o$<À˜’`GS—c ßùCÆîëà_v›Šð°ö=(ŸW›­ "æÒxëY­m[sœ÷ZsF=/'µgæû1LÍéñ“ÙZl¬'áÅ{e…“Ķßs¥Ì’p xégz‡ŒÝéörÍëbe‹düïò‘™=$|ᶇÑÿšü¥°HªßÞÀE–fR¨ÝÄ2MztHy£bn Çv›Ø±ÍqNW™?\,Eq÷ØU¥ùZ;r¦`í®Y(„Œå¾´CQ1·9]=•š}ñ3;ÝÔ“ÒŽJ!\ic_¸DÒʪX‘ Žœ|áŸwDãöäJéYë›É¾ô0¸˜ÈBBïr×âËó퉔ûmþ$?A«ˆ¬Ê‚’² DZÄŠè­9¾È(z”½Ê»gø´NæPÁ§ª;Ú$k\ZWb έå:ÊjØMn©ûh…~4H3<×L…T ‹…‡ÃøêOZ+EÜ¿2†â~s=ço¦¯ËoäœÛ8¤³•ékÁräy¶} ÅFåüí¡ÆÚ&"ÞˆîM/ÚfòÂI² *:¶Huý`ŠŽï"Ë7ïÌH®x‚¸L= ]{ËØóˆƒpJbÉ[ÉáË‹yÇ®9¥‹í ¢ÁˆØú÷A¤¡ëŒgöôA¹wêQqúæÖýTgˆï( {nå!„¡kÓô–`Ê_`.æ¸ ®bñMkâ.lT2Üû iOáóƒ¿ñE¯‘ã+¸ÕdbáÃéä;acÚÿÙ7ïÈ2í9ßät¸z0Êð^J÷q }KÒ` i€óžúÒ–q›àäR~ö§I¿çØÊ•‚K¤³=efQåã³]åtÆó2o°@Ð̽C&ܼ”ÙrÏV]¡Šþh³EÀƒÚŠà²&¬È퇂Í;°½‘v±·¿“µ¾=ã^Å Inö GîJë²È‚]‘&œø—LÿÚ"Š º”ì Í—`Ù¯‘ g·¾X‰:~ñ2;»Ã=ï5RZo!!‚É®ó×ÂÒœ{5vûaÕ}Ó&¥†×-6ÅbŒ ¡Ãÿ2ˆ+CÊNXN¯ .éÞ a_– Z°Ò¬Y,I èÎxcY[Ê2fvG\möâ㪷Aá¢xõ"‹,SûBþùme<×]Ç]P@rÍW[%êD(8|m³X›Z‘`‘Oá÷"ekõÖð$ƒ¬÷Ð |ÑUæßçp œ¸!wØr™þQ%„üp 7#9ú¬êu*г?½É€Ü(ŒÏ ”­ž›L Ud˯úæÁP^,OúJi3>ñçTõ²Þ‘2àf¤G"´N /‚½×†@½O„%t;¹öñHˆ‘Â(ºz‰Äû7‡Ýc0ï§•¯¿WY*V¸$U‡Q$À…(ð1Ó‚‹çm˜É[`õ—¤!ÅÁ‰îÃ0a—xˆü R:®»ÈâjßIA ÚQ÷!±…—I¶€˜ØqÙ Ø.@¼y¯! ˜U{^” Xqþ†âR'kÌø49ÿCÅŠ1Æû0Ü9ˆžøº¿Õnmì`/üùY @'Ш†¢‡`¼ê:žGO¡R´1úQ¦¸j¤ktXêv—y åB’žDˆn3xWz="WçptŸ!ÞHöÕ>@‚•@k¸Â{l¾O—7ç‚åGÝ'¹¦1CG¼dp±];0?²^ÉÀw'Ϩn)/) ðaHãºlh§³gËm»8áËøÂV;¤ u›Ú/<~Tv$²0ë—ÐßʈV¸*;¸À[$Œj8ΰ‚Fk²=üFŸidè×)ÚqÒ`Þ² N4‹º•Ü/ÿ»æÀ5IÑ"ž?p蟠Û;?´÷{ä=CÆJÓš®gýcˆU‘¦›¢üt6©Ö˜ƒi¹Ê²G»um+Ûþ®³õNd"ïþ7æ>¾þ¸¼*Ê”/'ê^lïelñ-4àóêüê¯Qæ§Iy<õ“ÜýøÎ ¢ÉðçE­µs)¨DB*+›…­©¼«XYîw9 rçØÖ‚˜%@¼»¤ ám¤Nß.&È‹¦¦³öõ®ËnPHß¾CäM5^*ú±?”ƒ2ÓÎùæ þj·ŽFøFÙýýv XÖ©Þ©¶Ü°Ð±ÿÕôÆPE-‹Ð‡5Ù˜+¡X= æÅÿìp< òã±2oXt³kø|Á :„ú.óÈšª•XOe»æøã&ÿ…Óðê‡X 1ŠPdš<}þ»×¥ƒÄ¨?² ]üìÃeþ_`õòÀ´I/=®ŒPEê~‹,»—.aO'¾¬ë÷—Ì~7\†ŒOÌë·wÞA<3ȽùëQjüoZnJ̸Œ úB1´)!@˜œ º–I™nFØVdÏdèZhûöYðâ#´¿{pm¦ò@9ô ®üûG Cú”¯WšUphäü‘"Ú-¹*u#™Ç®…g¿u~q‡yÇ/•¤`Sدñ·À”ÂZãòá?ûƒ¢íG„í.œ 7š‰“mæe1˜µGîËù”–o»qÓ€¼’h›¶"WÃë=¯ UXdšb/b ÓßV„ĽHkÅ‹ïëX ¨Bqµ KoÆôPe'‚S<·*^ÿLX=‹Å *‘&·S%;‚°W%)î*Ì,˜¹ˆ@ZlÔZóÑ,.¸ Óâ+()•«•D}N"º(‡ÃØÍ+Û\H$ýè1ïsÕ®{÷.Qä5¥T,,õ„éLªãƒ9#h§µ(Cf&X‡\)ý'áûà yFÂuIðÿ!ügþ‹âÁ£Ìû_a»!±ŽÌÀùx7eŒ1p½`°H![™‰àÆÝÂæÓí’øòè†N“ Bz‰¥‚$GŽð¤Ü?:Vz…Å|5çµ¶z´i×T¾´Ë;Öhzü߀(æw'Œ{¥oª’lc-˜;tKSJÞi:õ²C­ùVƒ”}{+~­Ï÷‘ yž¢áném†[Zíò§ëeC~Æ9y´~üä6çÿòúRú§ Ñ-t7ÎmÏ7”¼#;[“çå•Í1εïí™ñhD‘ñ‡a⪀º9thþž¿]öxêaÅ §ÚòCŸLÝðÍ¡V¶Ê­øß}Ÿ ƃë)ÖíøßnÈþGC>Ø>¥(çÝP„‘d»²5`¶{¦Üæ‡ÎJ¼eí` þX©«Ð³/¿sú]¯ï]n¸âr%nü4C“¼ea Ò1šfô._Ã%‡—Ô+ļCÓ¥îjìOÜ‘•lÕr?´ðÍxVQÜn5ž+ÊÝ"­†mq²ã’ÕàcWö^±øNxÈœ ‘GƒWJ¸+tŽmÍÒ`8¨ÒÅ5ko¶ÜÞ=Õ!œ‰5L FöÂóë9€Éô'Æ3úPú[¼o=ÑóäoÈXl»WBC‹£ì9ëj}Eãw|ÊÕã­¸ÿ[«}B6˜¿ˆ€Ûë."ðž¨*&ôžcR¼…•Ó9A.šAqdz O®X«ÿìï2]öK'ãò†Rý”˘ÑÙK¬­Ò ù``íÔLʸþ?$@úS%üb!] YÝz3ZÕ©±oä4\VbS4úœ;w,+÷ ý³™ÀG2Zó {ýÒ Hð~&/D̾Bf8(-—Î/Ñ`.'-¨ ìÂÎ[FÌò²G_½öÛÜ꒒݃@4!Ùã2×J[ìx…ùZêE’YÖ !\¸jIz°´“\´+0¦„Whs²ÛŠšAi ˜*È\^i³‡„ÿA"Ri`¶\O¬w„ÀåÀÄ»§)ªY;‹Míö;„$ш~Í«7<Œpª9ÕÍÿóôŸ ]Ïãƒ#FÛyv49 ß@]`"×}D»>ºŸÐ'É”àHF’Ŏ܇~úá~¶”–²›àaç=.@¥€pŒÁrzÂ*Ë4cAåØý»Z3{°d¼nîPü«×ã2•B ñ®d™1jäô Õ2¿·Â°‚¦`µ{4ˆõâvŒ½úpC+íE2`×ôk¤€4B׬¤B1¥Ý5ÆÝ6­Ox¨†r×\òeÒÉHéuÏ®i_èêA$›Ïu}Z°¦ „bàtÏËÑyÔŒáûþš+ý™21£ÏºNå'e?dS;°ø'x ýÑ Uún½¡WÅ›zÞ“s¾na£w`×X¾#ËßÂ^W5ëP¼HôñÑ»ŽÏYˆÇÐ׎ ±œ’;t@ȶJsÞV¹¨ÞéÉøT˜ à-—v`f“ÐuÒè3³[ÕZ4¤ÑyÂÃoÙ¥•?:IÇ"¿ÔMíŠ1;¤Ï@;zƒ ²ð"ÉÆÀ§Ÿ]ÿ°j—óØÂFºá!» LØ?s êrÅãSýš «·m"7(<–"EÆ=SO|2¦ýÁAâÝ; ÿ_gµ£ÚÐzˆä–ΈΡ9u3ÖµzþÆ\èú†H,6þ÷À¡#h*Éø¹ðÙ{ë“é÷ŸyÅÔ¿#ŠÀ‚_Ï®T[ÙUÄU†ú!·B¶òýßY ÍSœúÉg.[„ f ¹Ú Û§õ kc_­ 6;kß<2”Ó‰õ[ÎÉtPIì«ûøÉä=(_`Û,5@rÿhIªÇý¤çJ±.C­n&þàª!÷w©ƒ®ÏÊÊap¯ÍOQ<èZ9Ö^Ryì³ÆáèÆCÍôþ1?:Jùy¤ìRàÿrˆwľ[ÀyC(%Îõ]¤œgÌûŽîHj€ÛNƒv³àÏ©vI‰ó§ÙI¸ñÜ9+¹ÿ,ÐJ•?ñí«m$wLI;½¥»p­?úí‡Tǃ9Ç’wѦ*Ê(Ez0ÑèÙIsLñ’Ø/Ön3 |¯Y×Ï"Êð¾=sÙ$èý|ï!’ºûÓ#Ò;Á¤Ëµ¿A/šœõ> $°ËômH9ÎÉåf&E”¬¹4Ëà‘Ân[bûê]Ê\ÞÆßG@oÍÑÊ"tØm~z»”xàý¡OLOÃD; ø¡zÞ{MíÈ-êß¼Ñf¨4 ‹æ˜½¬4ŽAyS˦èB •ù”‚7–á‡$œ×”í<ò4ðOìØ*£Öá'Yâ…eƒ©E»ä¶~…¹“ĶûãdÄS-µåó?Ö*—ܳÝÒÍ{¼¼¤ï(†áJ¡Ô\à^} :ÄsÅ×tò ™ÃJˆr1êóý§Ø!“q|¨1Sô(6 [x'Dkt…È™U41'Š]²Â?¼ ¶«NŒ’6K¢‡mŸC"Âá·"N‘Ûó«mŸ•p½«ç€E}B»—×¶ž˜†–^Î÷hàä„Åg§µ)©á+`'S9ÑδŒhuÝ.›ôˤ‡¢ÉœÓ\nÏþ'eiöY°X›±®,ßQeœþ‘ÆÈˆ>©÷,ëxýt¬,Â"Ì c€óçB<8"ËV®ö³ÿ:íþItÖÁò^¥Ë:Ýä0’?„ýóû]/°„Ôa—÷¥Ð?³Ú6ï§­)ò:6Ÿ#¢_ ÐñYõvtp~¨ôå!Ó«qå彆IKì¶ûI 5:„¾«÷h¶Ó™áþPm”1Rñ½W Ï>läZQe<*ŃãS¦ þz°Ò»\Wsã» …i¹;~UpÂç?þÔœøt¿ìV]Â×ÍúôÃô* Ñ©E\h| ch¤ Q w>?Þu#êõ]&¾à†±eaf|m¿œÅEþƒ!ó§ ‘Â -ZB‘Må}âñA‡I0¢^;´EY0t :›èWôçx켸ßOÄjÏ««"EÈÆµuo×Ïý968·Íá)Ÿ°òö€à%˜‰qkÅ´˜á§+þáp2¤s…EE¹‚·<Ëï ¡RHÈÕ³®„‹’ N#ƒÖ¤g·¶',Ë„¤VgÏ;Êy铆zNÃU !}aõš.^„iw"Ð`2ÀX{o.rg%@ò2)°¶Ä:Ü…èyŽuüätù³LXCÖ?H„"‹C”QLʰmí 1XAúThiéõžè•˪¶jx6Ož;êAHÿË)üõŸ§Œp®:´±È?½™QÙ0I^ÝÚX›žïÀÁ0wÁ˜ 1ý± Àd€ô{S(»¿'ù6w`øÑê*};¤xN”§Áûô»ñÞ!fʆH"ïz}ë¯þØi8UîÆ¿ªtbÞNÐ=Œ[ÓûÇ€lq¸ÄâfH¢æþA“£øÉ„Ê ž¿\ëÑI÷  1V€±ÁRBóèŒ?´Ö>8¼y•˜»RD ãdQ<-,B€¨~àÖŸ›iþ3·^^õ<~ñJܹëÁŠU–¡óDª>Ú¥Æný t\£n ~~dúbúZ°ªáý' Ê«k“¡MwƒV&‰ërg‚º–Šÿð¾³eBQÉñ_G<ñÚ;©v²eàҚݵCÌ=k< 9g`‹:b¶¤FŒv|½€Š‚ú’¬šš:æûÛ{=’x è®DG˜2%S(bZš°›Òoï~ÜBÍë rIŠÁ’;Û=÷α‰ìAqÛ ‡·0,øæ€qPØ$±í(OdÃÜúA‰Ðc,w80Þ4é'&¥†“âŇ#ã³þ£üf \ñ|!{Á`<èÚßröyøn´Õcgô­)¿.~OUëvøÑóÿ‹?pþŸò?,Ö®V"aÎN"Ö¢"Ö¶"ÿ'ú¸ iIIÊQTZòæÁµ¨„ÄÁñrDTT\BRBJZZ¨NŽ\”ü?ÁÌ-ž0 ÷‹عºÚúþñlÜ=þ ýkËßËßòßEþÒè?òÿ”¿—¿Õ¿üEÿ#ÿEù{ù[ÿûÈ_ì?òÿW”¿—¿Í¿üÅÿ#ÿEù{ùÛþûÈ_â?òÿW”¿Ê_ìÿˆì)å¿'1ŠüE%ÿ“ÿýKÊßÊßúæÍÿ›ö/%~SJJZJŠ"Iñÿ¬ÿþ%å¿ÊßÅÆÛÜÜÃÞÙÜÜÖÓÙÞÜÜÚfa~ËêÉa Öÿ^KÊûŸÈ_ô&%Ù§È_Rü¦„„¤ø‘›b7)‡‹7ÿÿ;Ô^þ?.ùK·!*zÆÚªïêiÞ¿¨­¾Oå"¯ˆˆ¡¸ŠˆÈm½Û‡Â7E/ê¹[¸xØÃì]],œDDTµxiå)j¡(ÿØÆÂZQÞÙfqñ1 öDÈÆÍÓÞKWÅÕfãÒó}bÃ{ÑêðJfã;Ð:9«Çî60{W¡[·$e„D)4aö0'E-öΞN0WwÙ‹ͤ(æ^RÔRÐÊ‹wìl.>°±µq·q±²‘9lJ+ïdïâxñ±»­¯°°ðgíêãkgã"låáÁ{ÑÝÆI׿ëdãñØÆÆ{0ø_€€Èá,]­}«Kÿ;×SúÿY÷h«¶XŽJ Ms¿Ö4IEÑL…Œ™9g.5ÍŒ™IBnjeB.QJ$·±[.‘DÖT,¹“\66"—”\ê÷œ)É­ì~¿ßÝ?~{^Msæ<Ïçóþ<ŸÛóù<Ó+h"GT| C‚hȽ…DÄQpÈÁÌ¥3!¡Œ¯V;[ÍÊad–›ÅÿèÉ"Eð¥rCXY±}Á­­\ V:ùñÅ`|64ê˜Z"Ò¨„’èVnèԞŠ_.WhÐu}Êh¼T­ù*"`u+=j’?K)¢n¥þT_$B"ï«Øˆe _ö©†‡èÿ."CõòÞ0,<°4êùDö×ù$˜ A TGT.”Eˆj)TJ¡ä„/‡ëŠYÛ¨¨ˆìC1a ¦!xÃ(”¶8 XáËÃ[Wð¹!ƒ:à,½€èóœÝJ…ÄðØ·£8¤…³5©A*‘å«P!8`ÄR‚—P#lëV½@¶2“ZK8‰­XãĆ ÚøüL™Tð•SU@¯_5Q©ä_‡/þ*ô‘ 0áË 'ãa:±ÝÎ +ÐÌÀcHÔŠH•iUö;gkÆIP¶òþÀéx˜*üxÛÿ4:øßý&þB½Ñ|K˜ý—d5ŸÙNà¹RMôñ[†¿npg¯VhQ" ¹È…ÑXÅWJ qþÙtáÈXBÀQ±YÒ1¤V Û¤áa&åËE‡.§”‹­ B#*g+‚j•¾„Ýgy`Ì âËÀF v(|+´ <†äü°~™ Lã«þ'þËg|Î[Ô©%|twU!B Z9-H$–J¤`ÉT–J!¶ ô9FŸúhGì)–Acb©4 –Á¤vÈ(™|É;¡QiX&‘‰eX&…Ö!ˆüÀŸsµŽ•ÄÄ’ˆ $–D¦w¶ ­ý*ÀvÓ™’¨,…FJïLB‡ìA¨PEíåŸ VÀãÉâÎ@È,HÅRàBêiÜDÈÕ UgV Ñ°"KgÒ±2³CtÄOx0K-QÈàÎ,M&±4 K&3:Äb‚Gm‡ê,PæHѽ²S¿"aÑU1ˆàIîäo:©ŠTŽF¡ê̵h îèD:ð]*–NéÍBímÅ×%p§–§QéX: … ãP:„EÜ~‚¥†8N«`° Jû•5ZYhøPqµË‹BD&SòamŸÕJ¾°õ3Jr°”ýø–_hZÄØ õž ­ç[2äûzÆPJHlwÃи#j¡JªDËYPú‘ØFÿ?k¿–â–sEkØ,¼l×H´s,¼-¤ÑÇ0{‘N£‰„Bÿiùþ½þ·×Ÿ‰¾ò¯atÿ"õãø§Ð¨ÿÆÿßq øjRΪUFhÙ ž@n*¦‚ÛVˆš-" ‘@³M$Sß‘PA_ÝþËCô›O)ŒÛh… ´T±=mÇ'#™FÂR…AÅ2Úhh9k»cˆJm‘Fe~$"„G}~[—щ”9ÎD™ÿÓÆø®?ÿ ˆýk|ÿKaÿqüSÑ¿ÿý7þÿ÷×2¿ ãŒ,Q×7öòtçvéÒM îëºw¿ÍºkòÁ›ßø¦æfssó¬¬, eAAÁæÍ›]\\æÏŸ_YYÉãñ† &6774ñÀ]W w‚—Ñ÷®ˆºtà€þ'·Ymò‰º›;èÔsçWÄ ¡¿È6íXŒl(†WÛ’s×:¯ž™ƒ8>]7ÕŽ|jÚ‹+)ÒŒ@ë’Ÿ3~écö4-¾ïÑìѦ[<_6‘Ó»à¡7±½N—ì܃ñóKí7[à>œ0k÷+M2ic´×z£B2\Dá•>F³eðÐìcãLUž÷Lݯ’V•ZÇé«”q&H‰;)Òçþúø™‹ ¹kºlyÍ·b/Ò@Hÿ6{u–»÷õ뮋"„Tú­Ú°Çµ£µ¯¹F»êlæ}ÚÒ¶Ï·–š˜†Ý‚8©2ÒkïÙ[Í&UMk˜ëâÓôݵØ?¦'µÐ¿¾½ ÖMK ¯€úg^.Äñ îcx¼Šß.n>í§³½H(îgÌ[=hœÔÑú“ž3qæoÄ ]a³IðÛ*  Ül‚ø&,ôH´Ò϶YkYÜX8̾WŒ{ÈrXQè°HÒ3|¸Þ2`FêjÜ7}OõÛck=ÜÛC7âÇŸö=ô¾T˜ªÈ­õ¶)û 8éLÌãBÞ=¸ç÷Ïäõæ.Ædúôñ†˜s.ÙM1þuMzŽï³=ìWÌáçÑUkL2Ç KÊg¾ò$¥q¼µ»2¼zV&Ú2bY¬pÔçYf®?CýùÁÛŠÚå=ݱswN^Á ¼Ÿ}âÁn+Áék+¹çæf…Øð¾ñFÖBa¥±VkrNb.–F­ǯw¼|oÕ…¡™Ù–Š¡§¿×—eÉâí&ùp²-m7x’Æ4z¸i³—x…Ùë¦xÙï«sÛ‘1ª(Ù}:ˆóî¬=—v»ûë¬Ü¬èl]EÝ÷õ./O_‹ã^Œµ;WN1 ^µ®Gê…â>o5Å?ÔÍËËÿµ¾²n<>¤/'{ð™õ ¿ó]2«W`ŸdÐÆ‡+DÝýêç^¯CË}.±µø„ŒÄ$_ÞÁ­Ã¦¤”‰–+öXø³ƒrͪJ¬-ÉCFl*Oö¹a| ÎÉÞ  ­çæÔùéö‡ÌçæÔä™gê–yYãÝX@»WíûW-½zªªîQoÑÞ pΨpDzü~OÁ¾³ ìé›Uhó‹ûŽÝÕ”¨-l}ÿŧ'/~–¹ [×à³Ýx@7çy`r\¬ßv³´ª-ªXxª2xdÀr¿ìÙn'-Ûbv2¬¿7u¥nߦð—f)K„U¢»)I ·ÎšI’&¤ÙM1Gº¦½®€ÖšºLÙ®p¨w±Ko¬*Y¹ë5~[´ÿЊüò¼°#$õ H5/|ïFŒ>èÌ rÉò¼´â|/F›ºêˆ»öNeƒ#'žç.ÚnŒÉsI‹ÝÇõü%Mk:°çž_žzñíHóääÕõ½ ¯8æZë×5à彃S©Ceã›Tm[3eÎ¥{Ión‡WùÍ~§ŠÐ„X‡ºé_ŒH¿A¿,Ï~VéãÅDûeIûûqzN|óhÁyíULaZCôÌç&ð_K®ÑƒŠj|¯¯éë?ô¦åÃêÍŠàø_›'õQjç¬]~û²ú¥~Ñ“ÒËQA7Ö®ë}åN£qsÑ™i+!ƒ½z•Ü®`Å7¼ã·­bþ ¿ogßË*¡+6-+Ê«Ýtpßlå”ïõ½SË·¬!O^!h*X„ )ªó;ôv(Y­Ó­sî}yHÃÛorß6Ê]o„Ó×äωd$Þq.˜¥Ý>¹no^þ˧CrkkÇù¹,!hÒ&$ÝdVÇ1N]ATZÞÓ ê!‚Ì Ü3Žnô‚ûnúñœú·}ï:˜h¥—ˆz9ï¿*‹Q*[úèGžg쀩óùEnËwéuqókë‘.¬;S¤$Ÿ|´°ñW3Ó—ÝoKwÝóý*\¿+îÔœyÿÍŠß Κ—„Ìí£ÙËß ³Ò.­<±³@¶S#Á»Wçé7qƼr,¢âYP£ÎoÛÍR#Žn•˜8cÛÜû³LÇõ"qª˜¼+]ú÷ö§gÄ 8NÅgo‰U­\ ÞZÿ½¾ÿþĺ…³Ë½Ø?stÖ{ŸRhXD§v[®Â ¿«ìÙWÄð^WXaÚu « «9“vÂ|óD~Ïð#XmuS7DqÃA¡O=2c9tAt@d5½¯âÆŒL,fù³øš™õ4}™² ¶?™k2S´C¼_5„†ßË NÝØ¿?Yåc=•lºwÆu¦dGÊY{û·1tûІ]Ù< õº£÷“ä3¦,MâÙÄL )®vâ¹c ÆìÃû©â‚L;¥,kãë˜%Ž?œ òSô²¿s&ekPzM"Y:9219y:mpÕ¥^«/Æ7©&½-OeŒWø–öYCRU_—ñðÅnÒÜ9îë«Ø¢½¦¥é *¾áæx8èÈ%›»ÝVL\an\sf˜÷Q‰É±:vøŒoADq.?9 X4gj½Ü…SS&ö¨´”vÕÃ[ëlG‘Â+ƒÞÎÌ EEô-(‘´ÌÑó(ô"Öé0Õ{âqE0m’εC3åÉzXx¨§Ù¼Úƒ˜»‘[¶7^‰ïUêÝ ŒU,¥ “²³kwŸWvwš0[ .ÿ=ØÂÙ~e¯ú–~–ñξƒŠgê“æ O>A?p;ëz^$Ñ o%¡‹ïæÎ›¼Zö¨«]’YÚŠ¨9£²lsõ;–{sñEK7±f—™~¡µ)Š ArŒ./þÝbdc ?Øã´°Ç8æ¡g*æ%N.<m]1iáµð‚Ý鬌§ÞX†wymΡv€Ö ­°7>J9Ÿµï™·ïôÛ'_ ˜Må[ ëŸWk©Iý,3à5||§ï[¿g®6ÇyòCÀÑvkÎjø·µÏ_³uK”LÛ½Á+7;kqÌúb½‡½_ñ¨Ÿ~Cnßu•æÍËX³þIÕÉMK“ʦW[”Nâžµ¸(vpýãйøØ’Ñ£_È x¨93¹—FÕt·™ud¡ÍÚõßm“`õÛm¼J[h²9´jT²5{±ñªãßùzX<ÝéP#_‡džZ~Ô¡z±íâ‘–ñ¤ìøWÇÛr‚ôA…—±­~ï¨0ãÃןå\Ãjl„5g¬MxxÒ}Åþ nw]ú*Lƒ‰¹t×­[3P!|1>ÌíMf9ðE/¯¥“8•åæ«~ª ‹ŸWb;ò÷ÐÔáÜàSÔ´e‰¬‡9aÓªÇGÇÚ ¯YçsÆ)ɦáÄÜa/‹ó% 0®àþÎe‹ØXŒkwô£Ñ)ù{b1þ‹Ñçîî!qººlÄšBk¸¸rÈÌ’ôýDG"§3§%ÐÕ “b{±85Ö%íI¾ ¿ø c†>FhžV·ç(ùz 4õnÚ¾¢äc>SïÔžu ùÉ'@Ä×= )ÎŽ>8CT‘o7ÉTþ´tî¼>œ%]§ª9ñ÷¬TwËû A饯+XVâ–F]zI3›ïØcDÁæâ†çðåĉ݄Ç6\ÌÊ[¿{sFÿÊÛN÷憬¸b4qN·„EׇÇE{¤“b¶N}VÂâ…ºœ¿_½/Ä„âôôæ©suqs¬×Õ,+Î5B¦Ij.Æ‚$,ñõÄ6iFé¡ÝOœ›×ô²éþó›ÑýsK¦ ©cõç]†OÉÙ¡¦{'àšÃŸÐNwKÐå[M¼5ëâõ)_ÝôæÕÛ[ªRÈÿ±÷$àMT[?ù•¥¢ˆÈã±E$-¥ÍžnTJw(´MS–²¤i2iò“vòOÒ–²ÊŽøÅ" ‘EYYY~”EZDÀ§R+ ²= Âcð=àÝ{g&3“&iJ0÷û”fîÌ=çžõnçܪ­É+ˆIc·½þqÅe“ݸ:ýÜÔ}#†\3òÝý•¿Ëø3vÄöðŸýþŸ1zZ¾7psâáé_vγߨ¼œ3dËS}Þ.>Ó¬lâÑo»í:hûzÊfëFÌ´…x;ýäÓ7Ï힦ï¼5Kd‹Ó°'{Ö3=ÍœðÍ¿c/ˆZø ‘6àîóU‡~KiÔ­ÃÐl`Òo‰>|Z=õÍÿ-*}W»={ÅáL:o<Új•xñô–æx‘ɲ…¬ÈÆáãWOù¥¢ô½W¿½·÷¨Mó,s/û~á¨ÕòQ«¯÷±&‰žÍÆÇC· ý"Õ‘àÍ.Íê°©|Ë’ƒÍg}30gMÙwã[–çüô՜ݣF=Ñ~÷–~o¶:V|dðíJìÇSƒ#´Ë–^?×ëʰ€ò‹³æþhŒ=l9Ø,uϾòñ#3ŒÓö{ˆ'ßø2ãüâæ@Ê•åÇ'Vä½v¢¹²÷m¹qÿÝ^ÙcK&½Þý`Î<Ë’fMJš^šßÝÜ÷ˆ´‰ìؤŕ;^œþ)õÈøêêþuwh_ÍŽq¡ëæÜ\_ÐrY5þáCϸ*Q¿sWÿ¸úqꘔ·‡EõLòB»¨ÓkÞéeüe˜iäЫfŸÚºçµk ·ì˜’<@’ýƆŸ†TgãÊß¿Ø-žL‹/Íš ¼…B¤Ÿ †­—<ýöÏ­ZâY]ÊÉ>¥Øœ1¹=Ò/UÿöþÙ »Vš¦Ü~à‹,[Æ™÷CC E=vLȨh_r`ëÞUç_[ºP=uCõÐŒÖlqéWR_>³Uûny6~£¸õÙ=£D_¿¼jlÛu—ç.Ï.mýê‚RQ‹Û3ƒµ}ÏL·A3mCöયgVo{<0ưò¥å¢¤kÎà/hv–½öòæ%¼µÁœ6(ûòв³ûN®ú©M¿,žðQ£•— “'•—ÓBZx1¹£B3{þøãý* ¯†Ì]\Únï‘­+6Ž>}µïö6璘Z°7h‡ôJõˆÿ³ò/Ë7Üþì—Ù.-+øì­¥½Ök^SŸý죿¿rïî­ªó‚:/¿:²‰â«Wö‹® ¼Ðæ¹)Ý:âO&¦wVþ]}@Ñ¢ñ…7>uƇߙÙ轎•³Vô8ûã„)ÝÚâïwœYºp{³Ésö—Üê¿·ÝÂåÃJ7ŸL}÷]o¯{ÒŠeKÖØ 3Î_^}rntïäQ‡»‡¾.ºy3µ÷À¿ŒùgÖ²Æö˸T¹1áù€Ö¢~9kWuOJ‰ûœ˜3ìû&Ý¿èñiu;Ƙô©l:gѪ’Ö·Ót/+‹ì3']9cÙºãUÿ³nôåa§Öo‹Øµkžî£Áð›9+ NÝ´03€˜wâæk/½ò×+!a[÷ÆYº¸ãèðÏ*ª*ÿ¼qÍÞ¥|tÖ¶ÏMªžÿbÆëÈ6cú©ç¿q©ß’AMÆ¿‚þÎ*’|ß{ct—ò;=f$Ï+N_ú|QiÒìŽeÛ~Oh+Ú|ç™Ë¶ÜyCwkÁ½ÍÛo¿"6mnzb˲ҥc“YÞº¯¶ýVüâ­Á·Ï]ý¥ñÝÆ¢yÒô>Ñÿj—ñÑȵ]û~²bâ>m üXYË5O‹V6/}Á”ÖºüÈþ³ušÐkø¡E9ÿ>]=Z>N¹K–sáƒ7NmÚ•SÕæ‡êë¿Ý騫qé·'b‡§žùë¶Ä.%¿±ÿF»¤ÙÛ'÷l²pèõ#þœ‘uê_o޵š¾ë‹å‰JQØ¡éîÜH»7?¼Õ‰c‹º_2m+ yåp@çç‰Ù—['{Vþ0ººìÎÙ×=µ¼8]VºxO¿ª¤wvi²ÿjúÎíþÖm2Þjðg“•\>x||‹IeíºoÏjüé.|i‡CÓ/T^¸6}÷ùNIŠ>ídÿ&JsÁ2ºWçŸäŒì5õìÈÞŸ/2Ï:J̽~aãÎÏ7,~/ä+{bâœÊŸËg¶;×köóÏgLܱâ¤â˜wM[¹­$É窺¿Z– :—,~í÷•ÌÞþéѤÛC“ú•¬ÝÖf)qâÖÚ9MªBÛè,6vL~§ÿô)û®UÓ¦·ôË¥¥qÅÊ£¯O_?®qGËš¬½W_Ïh¼ö踖kæžÙ÷$0ê=*þë{{DmjòÔîï—ôg—ʆ\ùýãý+ÏYÓ<ýê§W³m¥»¾öñ &÷WÜ<$t°rkî[ÏÚ¶ÏÿâÌüÙs›ÿÚ'¨ÿeþÃáü‡O Ÿÿrÿá¿Bà¿/ ŸÿЇÿ+—)¤b¹J°ÿ>,Îü¯qô7'O%òXü¯B)“Ëñ¿ ¥íÿ*¥Âþ¯/Ê£ÿëJ(1(*Äÿ ñ¿'þ·n2 ^DEЮˋdÀ»ú:ÊRœ#:¤˜ÔY­ð< ·Â, y–Vàe„­‡ð0ƒ>Â]œ—›°HôŠú&Î‚Ž‹¤C"M8i¶ë-0ƒY‡Âè÷5ºï1TÉÜ{(xL AÒjQÈ¥û°HxäL—VK#l˜$·¨i7q“uo×]ˆÜEðM<Á בPYˆ4B"‰„H¤âðš‘P EÀÓÒÀ˜¡@ €óËáI&¬Nºû©µàÀÈ1†úY<<: 6ÅR!Ú©+ Еp÷¬ê™Oi$Ý0´0NEg±`L Ò´†‰à¢jÁW P×aˆŒÚJ/̵˜õe °DFµPà–«&(¥8¦ØñüTܘP@@%eâ9PøI VDÿ„dåx A&‚ ¤ÅEG{ðE×Ö!2ÒµÍ@¤×ÁN2€!3@.ª5°Wó1Í%ìv"Ÿ‹¬«héZGˆ]a§\Õ"ã+ âµU ¸Mhãqø…v YØìd¡@Å78·$õçÖxOì’8³«ÈLÚ u–‡Â5Ð9—È60ÛâñĵL]I¤æ¡”cBjnO)0É“tâ¤ÖGWX° ý‚eê’­f¦ø 6ƒŒÈ0 Ž%`6ghKQ;°Cˆ?’ìdž!2Š!™¸=Ò¼NéC †žø€¯Ìš¬=n¬;t£¾¬ö)/\¨…üqã…¡s~ÝX_Ô`vð0s¡ŠÇJбCB,©z8ÖḠ hÊåŽ üžÎ,Q>n,Q9ÌTX’YƒH) ¦/$Á”ßî®:ØJâEn+ ðQ.¿„܆ÿÒuj ž’ùmµ3¯‘V;zÓWráÂdª7¹§ä"΂ëHÏBáª#,œIþ¸‘<‚"yZN-DñC§:ƒˆ·ÕøˆÇú±ÃÆé¬¶zBð.×l1Û͸ Ø#=øÞZÁêÂ$IÄ®Ytßy}êºJK-š¨'§•&,žÐæƒtl»n ”õ_€à3˜u¥cÝÁ‹!Z©ˆf³+98¥?è¤.èo ù1 þÁá´š(¤à ªmÏ‹}Üœ)ô‡œÆ™ŸÝs©m®×£yÄ8 CIrˆAÄ‘îúáV“Auh J Ó\ çÇP\†8aN)C½¨Ç³\1ž{UK5ƒ¥ qóª£HFQ?½îem ª3ykÍnQqØ ®D9›'V²¯¨¹Î×®Š1Àè|F|áEõÈ@Õm€^…¹t28X³—ðá#G3æ›Ù@å²Yq½ÙhÖë¨I n¯C7Cݤ Kב€Ãvœ´ñ“k8,„Ó΀ƒ@ÒbºK9 þ‚/ãuøOùzÃwP1V ÷=`R)”¼‹RRjõ£–81޳ñ6+Ên@Û ÚÝ äqàW1iÀí[ó0´€ËÁ‚•*w©ÌÔ¸½,p"8” U`p[“ØÌ“àºscáÞ¹14øe|Xx­>ìÉôTˆH§UÿvS> wý¡p¨›½¦?ê¦Ú1Aìtí´ÿHÇŒ¥ž’ž²9öÅuè×:{"Í(MÉGÇ>bã}ORçUõh©B÷7¨3©¹®"¸_ ÿí9ýÛ€ÙÂùƒ}ŒË3Øh!îîMåµwã-c©êëÝün›æIu­ÂZšÏ|+#·Þ9UJOµ¾zÉX¨õOHW¡ {¤ºêõz0µ—ïß=¥\…WýþÅï{Ç:>ïºH{KatÿVõ…a½¯‡õ—ê<Å;‘³“Œ¤Ž÷Áœ4ƒç÷‰‚ÃÏ9Ág'D3‹Ü㆟š‰BýÆýáápBõÇ~Ú 8°–Åý4‹!»sÆìþ`3¶ÛÓJ\!‰ShèqsÌÕMÅ`QÛ>à)P–ûÅ„kb뉎:]ƒÑûÛ}øÎߘÜk†"Z&¯«ã…Ý<©® ‘ã4,ø®†ö]´œyÕC¶ƒ‚Ój0§Å €¼–¯¼V­ i·E¯ð–mèüÍmEx綘0 ÆmEGü<Ò ã4ìß>J8å×°æºF@’`³áÓ~2ïÌe¦Ó(_V¿Qþl@3…A¾¯ùÂß_|7߈à.úw¬@QÐÀP?ÀÄýÐ?)¼öO0ãžuuOœ„#Oªw‚$À8í Ω¡2¯úgG‰sßÔ¾‰“öGpM¾rMAv‚ Ÿ£hR“Yor:]®·ú‘˜ÍDZ Ý_™È ”nú„ˆÙF© V¬³ayŽ´ÍF’ȧˆ°€é3LØ€òGFZPÊhOÙ3î?/n-Äa…Ì ½Õê¶mPGe%F0‘t~W˜­ˆ'‰2 L×À CˆÄ5Õ¶|Åæµôëþ‹µ’˜T‰I䑲ˆH‰ “Š%b&a/›Ë-¡Þ‘kfþŽ +..e²md^J²L£P#©/ý"ÊÕ‹ÒÖÒOãŸo6 ·ç ””„ʼFõ<¢: E„NÚRŒÇ<‰·º×½ðóÿ+ýçþ•pÿƒ/ Ÿÿ*¿á¿\,ðß…Ïÿpÿá¿Dà¿/ ŸÿþéÀ_ÿ%b¿á¿Là¿O Ÿÿÿá¿pÿ—O Ÿÿ~tÿ§pÿ£O Ÿÿ~tÿ§pÿ£O Ÿÿ~tÿ§Rà¿/ ŸÿõþOaýç!>ÿýgýOXÿñMqæ?»ÿ·F´ZÒ@:íoÔd°ûû_%R‰Rì¸ÿU/–P ÷¿ú¢<:÷¿2;_H.X†š°L*^ô-Üü*ÜüêÛ_kJ#uÏ«Ó=˜ú0ƒBêÆ¨Ò ’&Ѓ¿•;˜mô #fFR—_‚f%qO™ ,ÈÄR[¦èOtg,[';ê¤b,ž)aZ [IBÛlÓÕl$3bZ퀄AÚÌ”þÚĔԭ:^­MÖj£Ãà—1Nm³p¥OmÓ_{‚@› ðzA—²Ð¥u€îôµŒýZæ™.œ{uó,æÜPu®«Fål£rgF(Ø:àH¼¤˜ 1ÀHádÝ4ÿ›4ðàªÀ¸@æµ1Np”,e:ˆŽL…š]÷IŶ§ÂÆ9U†³•áÎŽ`ë"¼¼,MJª[æËX±–yë:ˆžƒ¬ù€ÇTœŽoȲËjhz¡ÝlaUg4`u0Ä5ae¬öÈ)©)š!0ßIbŠf@Bf&–˜¦Æb±ôXµ&%.+5V †têô´Ì„PLÜ&Âdp t ³˜!°…0gŠë“O­S2U¡LÊщ#¬%Læ Fd kTL Ìçá “•tÛB·?f'ßÚà+¤ …°BZ¯Â›ÿIý(þSˆÿóIáóßâ?…ø?Ÿ>ÿý(þSˆÿóIáóßâ?…õ_Ÿ>ÿý(þSˆÿóIù/{WßDý«¨·Ë±ër,øQÆ HKh3G&IéA¶zARèN2“4‹IÚr-ˆ¬ðþhZj "­PÄáÏ%t‹ êr(‡ì T9*¢r Ýßo’´™I€2Ê<’Éd~yïûÞ›ßï½ù½ÇÇ_<û?¥ýÂíÿ”òÿ‚=ÿ!åÿ!>þ"zþCZÿ B|üETÿMZÿ B<üqÅÿ$ü!>þ"ŠÿIñAˆ¿ˆâRüGâã/†ø*­ÿ$>þbˆÿ¡Òú_@âã/†ø*­ÿ$>þbˆÿ¡Òú_@âã/†ø*­ÿ$>þÍÿ# \’rBÊÿ Huñ¯}ÄîÖ`mæÌLcñ~æØBß-.`û`¹/üq¸ÿG Ÿÿ’öÿt£•´šl@Ü»-BËpQ¨H)÷|IA“t£êãþ&†«d BÈ ™Jáù¦ï½˜ ÈP¹ÁUjP©‚D“ÒÝÛ¿Ýj¼Ë1üØ?“=uíŸê? B¯§§&¶ î­ªMÒÀCƒ‚‚<Ñ ü½ëóžùàŸnéÉÚø;ÕÕ;Û«ƒ‚ÊËË‹‹‹ccc§M›vêÔ©ÌÌÌ®]»‚³ª««ãÇý^=暪 ê[ùµ!(è©Ê¤qÚ …U…ƒs%´ŸþK§Þtòµ­gìü˜åD>SðîkŠì°÷Ÿ½–ßÝúÕÀ²ç[ÍørÎdÅ ÇÛ³ŸX÷s÷/ÞšÙvA¯Wé£ †µEéOìyó£êéO/Y¶,´gVppÁŒMörГɷ¯U휜XFÿ)Åuè\ÊáO¢ &å¤Ï*y¾dXÙá2ÃêţϾ\òë»Ñë;E¿ÔúùÒUo‡¿q [°ð¥â=#u3)&J§‘‡¦¿óóÕWJ{w'´oc±)? ½=¡Ÿ­âß+•Ë•Q1E³môÅ+Q‘Å]¾=œ·{ûá‹?®µÞ¼jáäËCò ŒÝ“v»þ©MÃïl½~v^ŸœøÕÿ;*ñZUoˆªjgM»u©‡lýöñÎ]r"oòÂJËØ¢CKgž˜ú×}?µYJnd®]k» ÑüÇ>™Çoxä˜ãÊiQ룧ž:Sb.ضêb÷Š“¿õÏöW"ž~¡,aÅ—•ãO_:²'ÏöS‡¨—?)ÚµøÂú·÷}£Í™}<õHIëÙ“6<»hç鎱7CÔ‡O«;ä;Âlš±Ññ)ërÆ¢9Æ#$ϪÒf Ú ©*L MíÙEq¥hÔW¿»µ÷S2³æŒ©Ø±`¯1±m‡)Åo—…^)š3‘|sviHÁ¾½ÿj« ¿Ðj/ú¥5¯ àû'MýSèðÔæä´_9½|ëþŒÉO$ÜYŽhíXpéÛñƒJ Jf&<^¸ÿfîÝ­¹ÏÔëYgÉ óf—ŸþiéK…óBßèúÕMù3Ißµù+›ìæº^^ªŽzy°aì­¹W÷¦_O^iÏëþ7ðï¬z«yáòî š¸mÏÏ/òUfK¥6÷h¿ãQŸæEm|¿òÅæ;.øäÐiÓ–….[¾Â†¯Ý߶İ)aɆNÊÑe ×MûQñ#g>ùFy$:¿BM¡èÍ#çÊ®ö+(ØØ‰î¶xî•o{'_`ã®÷þ¶ý_º'OÙ½9|fôrÝ–á lý7®:;Aù|ÌÑÈ‘‰“?-k‹®*tNh»ýÎoy¿]¿ñJÇ¥óMŠ„ÿÙ"ß]ä,ž2µË¥©mÚšÊÒðòîùºÕ﮺½7»óÅŠ*¦žÖ5ëµ±š^ëÙýãOMÛ6©wʺVûu{ TÇnžéº>¤tq…~jì]Kf7üûÏÎNºúÍÅ}ºÁ×{Ù—º(b­„— m¿ôÂ:õ–6‡K&¯_ßóÊ­y{ÚE=ßUR2L÷äà=×å§æÄRÏ>}ätÙÈ~ö/æÜþìãQ¢x«|cõæµþàÐ7Óf>WðΖ|öi´øVùÚWC¿Úò¦¦kEdîõ)ÝJ'cÇÏh¯MM=y:5µ*ví`&uȤ…„I}»õ†ù×ó>ÿÑ…™K×¼\•7eÞ{o ŸüËîïF[ri[É^6z¯¹ÿ͘;ÿ 7žÚ>;šúlfáz‡|QÇaö¹xF§vÝû,­øXÛwDrö×Xï#wýϘ“U»î´Äjþ1~tïëãr†n.ÜÚÿœ#8Å2³ÖA¼q%ë•èÊY»{mª¸º‚Žžùbé¾ÿïöše£*ó™é3nhºY©+¡Ö†¾µ}xpƜʉG]ì¡ià¹ð¿…1®éPõRŸ¼'šÆ˜'½WöÔª^Ç5ä{xƯ%ƒ¨YCvf¬Z3²WNÙÚ ;>XËM+i—¿9È’mYXöÞÚþöm#†Œ>>fTÆù_6i¶iù}ÏÄg,:®PmWÉŽ^y ôÈm„Ý2웈ƒe篎«8wS³± pgq¿Eï¬Ñì/úhí!Å‚1¶‹}÷Y¶ë¬Ý¥­ZJ¿Ó¬Úpþ¬2#Í4uPEJÒíóTš¢?uZÓë&9kÊ"2þ•…ß_K~’Y™5öYÛ÷ûw„ΔÿÕË£Mc‡ŒÐ¬ÉÅ+ŠØ‘P±#‚èpuÊLJث{ž)>6ã‹CË؇‰ìMaĺgŠ"eJ›º·‰¡m4ªccb¾hßžxòÉ”¸8M:Xõc­3·”ÈÞS“âS¬í÷×ÍwWœøó?1<ÿ…Jõ¤ºø7X$û>Çð=ÿG`…WSÿ‡P*þ$ N“æÿÐÃWÿÇÕúE*ú#ýiþ¢? ëbÕ~¬¥s8YJïô*ï.€Ð”“ò_Æã^*?˜J>n£xíZOf¦.ÛÐhî$×9ò©ÓOÅOÅw“’û¯÷}x,“sb£Œ¹>¾ÿú@œ*ù, 䮓׻AZ ˆ»~àåjOo°"‚VÉ×_UyPR!S2“ËPTî³êüO7…Ïë«P˜LÊÀdB†’¨ÏÈZî­Êf›ÑÏÕqR =¡Tùýõ@Fr, ŽQ´Ÿ«*0µ Çe µJFÊëU*┈«ÞâRG–-×äf™ôYœ“ågàõÌa!àÛ<ï<:_ÓGʧ~au"øýj{WJÏ¿;=ó|£A1úÉF4ªjªRÅ0ª"}[÷(Š|S`žãW#9¬a¥ ᧆ´´^‡ v<6†$H†Êe*T)Ãp¥Ï‘ ‡fbˆ6MNÊŸì9ëf)”$¿nVýä@eÈ¡g'ãÏšÔ$Ìí€ÑJ¸ï±I05ÊKv %æWv4@IßÐ0àÞÍPþFÂc$ ’Ë0•ï‘ô܆ËF✩?Ž€j£`:•Ïqî£>ôÕ øR | ·/ø(ë F1ÁéHÌ$Î1C¨};U D×3"ÞXþ Çdð*ð¯õ­s"Ú[h“Åä\.#Q 6øróyyXQ× þ¸Pàò¨LdG’¾ 8S—‹L8í àVJ’$Ð0À“÷'*?wÔ*Òå¨Uj¿pTõÆ0d$/\¦Vƒ™p(ì èGÉx–éÇdÍcc'à«Á ÃÀSúæ vIª?šƒ±:Ðf˜JüO „/ßš æöxÔ*—rê³hx£ó3ç®Q®ª"ðרZíïæÀè¼ËÈxP¹å¬Ü|;60{S1uL¯ÝÃàÀøL@”Þší¥¾™A´p ¸’»»ùvŸ@Z¨®ÁQâˆt…Š€Æ¢ë…úü`ª9U÷0Aq¹ï€gC½ͣ;™PËej¥¸تoMØ« ^Ôê°ÿÅ \ ti(J¨žl×mã <(ZjÌ_ÖöquFà*°.®MSvÔuŒOµF‡Àî8`Á KrA²¯úŠkÝka,INÆ’Ì€x¬¶\°²ð”0ä*.† 9î·N›ÝÓtÎq]´Þ¥†ò¿¦³96‹w,¬Ib^Õc‰fzŽ¡˜F~(<Áõ3câÆ„#H]ðóKŽ®p€<àR±ÍUjI¥`1©¬8JÁÚ]úmåUmµ›³@ˆà×R4e‡"5°6‹Kv‹ÉépŸÙ¢¬ãÐ k³lÊ  £‰ZÓ î9¹³ÂÇÕœÕ× 7…ë¡×jô£mK71,˜†²mÙK78‚Ýáù¸/ã°õv2ú,×õùÀsõ&.Œ«ŠÄp©0®Dõ‰—ÿ%ÄPÿ•öÿ H|üÅPÿ•ö H|üÅPÿCªÿ $ññQý©þƒ ÄÇ_Dõ?¤ú‚9%ü¹úO$*á/ñí_Dõ_¤ú‚ßþu"Àßmÿþ‚ßþETÿGªÿ"ñí_/üÝö/á/ñí_DõŸ¤ú¯‚ßþiàï¶ Aˆoÿb¨ÿ/íÿ’øø‹hÿ§ÿ„øþŸþnÿ/Ù¿ ÄÇß ü%û„xø+D”ÿ—ð„øø‹'ÿ/å…!>þ"ÊÿKù_Aˆ¿ˆòÿRþOâã/¢ü¿”ÿ„xø£"ÊÿKø B|ûQþ_ÊÿB|üE”ÿ•âÿ‚ßÿ‹èùÉþ!>þ"ÊÿKö/ñý¿ˆòÿRü_âÛ¿ˆòÿþ‚ßþE”ÿ—âÿ‚ñäÿRü_âûåÿ%û„øø‹'ÿIö/ñð'Å“ÿ—ò¿Âåÿ¥ü¯ ÄÇ_Dù)ÿ+ññQþ_Êÿ B|üE”ÿ—âÿ‚LDù Aˆoÿ"ÊÿKùAˆ¿ˆòÿRü_âûåÿ%û„øø‹(ÿ/Ù¿ Ä÷ÿ"ÊÿKñAˆoÿ"ÊÿKø B|ûoÖü?‰ËI%8AÊÿ Huñ¯× !Ûbêmq5Ò¼ÇfÀàÆûÿâ Åjúÿ’r€?ßHý… ‡§ÿ¯«™+âê-+µû•Úý ×î·®?äë"×î×ä€M*`_ Ø?ÄÌ8a¿ ‡vèp;O®õ‚ﶺJ¢aÿÛ@/xþJ™»ñl¤A™Íà]Ú öz|6lùén<ƒ QNÑõ6³yÑ ‡ÿ…¸š ébâ89@°ÛIÏP¤'ÍLVW“&ÿÝ¡žÞ<¾úÝÛ¥k¯\Û{çn8ç: ÷³ÙÌZÄl3>RrèOYõŒ9Ãnd)Ú[”u\j¶E‹èÀ‹GK f†²fÛ%QQØì!÷ÈB†ðÑŒÃÙåSÛó ú÷ûþEJ îƒ,œ»½–K¶CíÎx«“¨EzP{–q5½rKœêù€f×Òy9ÇÄ:³)óhOóû”Ž¿¶j ôo€ Π8ÑÄê½w•oœ,e[ìCÞç$ÛŒ.Liði(œ-ƒùC Æ(~<×Ð=rf ¯›W“¬˜FYmÔ &2Îþ`~g³‚uŒ†³Hßî³á$ZËÍ ëãÀ¶‚ňûˆLÍÕ“¬›û“ÕÐ=i@BÖR¬¶ø“„üÀ… üIO™ke}×ru_áo“ßP4B“Äõ ¬À34 ›cÒ3®PNÊ#Zî€è´k¨ÍlÖQúq fÊXw]嚺À$¥D)N)<7ʇ/ä…;ÏËø¬¾…Bî„ÑCöêØ‡û¨‡iðVtF¡qRÎl‡ïÛÁ½wîaˆ{#L zBrzâ™<ø3xÜKsœ¬±…ˆAå%†šÛ»·Í¸>œð»ÂP†Ä$Ñ'k²ŵ¾hjFUu½‹Õc³®§’À¯¤ÌæG(¾ÖÔÐO—äH`³[´‚ÛñK&ÃE 2íîp`¼ÚY›“Ñ;Z0v]é¨1éÌ,Á1ëÈ4¸”¸sŠBNYFoci€n gVîbÖQ³hiÁ¼bWøpÁÃͧÿ¥¼áÛ/Ž=Ô9Ðî±L¤ï–mï¢e&8ûe P(“{ª/~a ? Ûr׋–&Jy¹f±2Dð´&˜ó¤Ûìð°+ž—¨Ï!aaÂÍà…æ™€ZÁ©OÝ¢×*P¥‡zM{ÄÃh£«pO¨¾Å>øÕänK£aœ0XáV«{2ü ã"-‚k²†k¯TDKgZYôW8¹¥3MpLÃ$#?^ <¸1¸^´ N§¾²I0‘ä]«Ÿ†ue`ys7V7ÀÔ<‹ŸF½<`3¥Öwö)Ãdu☱ÛZdªÉ—t|e¬¥duÀkeŒ³¨@’ÕÞ‹šfMT7®Nо_?Îý °¤þç¿À£jÝ¡°‡`î;Œ2›h° óù4_K„½q‰0¬É0Ñçƒw¬¹¨1Áͽ·yˆ_ÿA<õ¿¥úÏÂÿ¿ˆêÿKõ!¾ý‹¨þ»„¿ ÄÃ_)¢úïþ‚ÿf­ÿN¸“+•þR]üë-=’¬9Œü;13¬Í™™F–²g…[èÀÑñ]ÿá?$Çp #¥ú?B­ÓãªÄi¥J®"9M¤t¥R¥$h”!šû÷Iô`éžíŸ²<†?ûGÁ½çÿ1—ì_ÒQaÃ2l0ËèH7A(D%S!(‰É¹Êó*‚V»‹ÇéãX–rU«BP)CI„À p²ü ±ˆšîÕþíVcÀcø¶f_ÏþáüO²ÿO¯§§&¶ îM³MÒÀCƒ‚ÛÔêàÓ­À‘Y#î\ÿD¥'kãïTWÏêõa>v ---11±sg»R©,--­ êӧϦM›233cccO:U^^^\\ܵk×iÓ¦oWWWÇQ{óÀ«ÇœCS5A}+¿6!AIâ´ «¦Ì›ñË{óÏþ—½+‡ªýþmR*•¨d›¨1Æ>¶ìY³•c &ŒeæÚB›hCYB…µP$[ZDe iR”e&¤l‘úß;CoïÛû+õûý»ŽÏvÎùžsžçžg¹ŽÝýÏŽtÖ·Ž4AKŠ/ó¼Ü5S,¦+k½æ¦;IË6Ã:ŠÃÏ™~0ï\°ÄâQÝ~5XŸ¹s@QK¥-&}¯+ÒYÍì–ÛQ£)j¨¼%TTèºižØàƒ­Ï=Z¡’B¦‚x£S¹yer7O±EŸö\àÆ^ Ì;åE9û]ö‰“ò~=È ­aÃJ7j»“Gÿóîšs]Ò©(êñ{)ï[Ž,Ö ]Q’èThH‰¬SZÑ@zgS5²£.rÕ©{õÇx‘»}Ïðžé©ìSʺ›="iv1ñc¿Œ,¹“v…‚ê»P œT?Ý•[´Ë/ëþ`§Ú»Æ¸ê3I£']!eœä+Ô½7ªÞðž$a¼>Ý܇´ç>9€ÙÓ‡ Ê~’ÒRØÜ"••7,.U<òþVŠaȕΠ¹ù¼’»·?v}àa,½¡L¦w²ÖT“䉾ò)¹áüúúÓ}—(·(g6Õ.¸ç¼Wyy? mí*½ùàGçäSñ¼Õ^›({VZn⺂ï¶澓ÙÓx¨5O…o5wO/0”ÒyýšcK5â€ÇÝpÒRç¨0>Ww²pÁîÞ’…²ó3£T.sÙº4Ù*¢7êýªu.¬&Ôd'UIµ–󧈙¦±n*uX û­ÃÙ]ï…÷ì%ÇçxSv*Ñâ`à O»`´ñžíAŒ€×¶ÓkƲC¶7Ù^­yç2´õc’¸5kÏtê™ØšëöÔt8’S”_ÿâ˜G|ErÐ^o|>j*(!9õR‡Kr_K瑜V/D·~ÿ$`IUÁª›ºÏ¶ÜÞ)ÇÖ–qúãнªî2®ERs«7ô~RéO(=&“åR\ŠêêBœG=5ÓÓé(š“[Ú*¸j1·ž’ÿ3Û•YœÝÝ ‡åí^ç‚-ÚRË÷lÇ'ÃwëWêÞoB™y>È?ëR¬V\óöö³ƒ©µö>ehåãË»ßÁÙdì˜à [÷¾Ûzï%$ÓKsÕ 1ˆMæ³4#>,æÐíFUñq-_œÀúéwMÅЉ;ò§·sÙû”ˆTm½±ùYúˆfnÜÈÇá{Ûcv¾£X€eû­žfÁ=ßfkS%—¤îÜuç¾,ßfä©ÚÏjåÏ„Ð[¥™,Z^ìd&kŽ\6%>ð”è2Ÿ‘ë:à- ØfJæ”]1 F¶m«¾ô*%ÃíY½}äÞN€y4µ¬É® ù*uÁðÃÍ–Š|tü.÷Q¼<¢U7#]CZ+B´m×_Ÿöž£òp[› ó£Œ•[ôcÞû¶f8%zàO"ÛÃ-¤,p Ù¾Wº§J‘µN·(N '¹»1¿Ü¥6ÛáEà±!…Dü.nb±¹)¾ËuÔ¢¿¸ÞÍ”&¦#ä"4õjÎ'“ùªÉY£¼wÏÐ|j¨£êÔg]‡Rß¼9q­AëòÃε‚ç˜cå.ðÝO·C-Júºœx¡ƒáò6ÁÍåC3{ä•(eã2§±½ú<þÔÆ>£z«Í%NEoæú —ofo_ÆlxIÜ%þ}gMåj g>мx ÕÔòp\'ë›Ô7úÈy·=3KYú™Ä K•ãOœÉè|Ä l=Çþ>’Êu©èú|Î𬧛>úp›¦lNŽÖÖ&7\Ã?y,å—yP`F«© ðhŽ"y•o¹³*×ÑWœµ¯2渑3Óh¹Þâ3¥Þ^!ûÅ÷/Ìï—ù4[¹£Óÿlc"q¬"bU¸ÉŒ5Trì̺gÉ=:*¬9vÁȈª{`ö‘ר"mÐTâùv×ìãª[kƒÐ‚jÖ!omhwC x€éWvåÄü\,Âô ÷Ì}jÉkÛ½t ˆM[ë” I‹'væ@bW |ÏÞüÍYûŽ!YN+VÅÎòæIwSe^øÚ#fËÓ7e Wi‹¿]ö:z•EPˆPdO®u‰ à…ÄóæÞb§·ð=b~u4«-Õ §ÉÆ™„‡ôB*|Å4À0Â4ÞrE¼…ž}ä=TGúYóÛ@x7·ìÝÞ(dð£j‹{öû4µ-ÕÞEá{n.“-ý8/v%–ûzÄZû>m‰,ÀVÅõ’twŒV·‡AÁ\m 'ñx—‡¥*<¦…†¯SãñãÖß§ù#-Ùª×õ–ì¼yöön]J= a’Ü¥ŸÕòéLE–ž«AV­—KÏBÅ4¾Só†½é$IUŸ½UbW&WŠ#ÏÚÏ„}7QÏÓö‘üäºhbHØmB±ûÚí×-íý†ß•”}ÈYµ€HbS%¢éŽÌøbåAÿBw²jMÁØ“hm—€Ë×ÄJœ‘¾à½*¯!àA&üØœ¾E÷?ô£ˆìç±²LÕp7ßÐWÑÍÌÔ*ΛsÓgô^ö\l£nߊÑ\‹:Ú›…-·löñµÐ`y üªˆ'^RL%g¼Ù/Ùê.AžiíQ¿Ð“ ìTñ+Rë \wö Û]ÖŽÉ–­’Ýš²/ø•xØÒŠÔ»™–>x–ù?»¤/ѳº&–6¯ +ô1ïi½¼Àz_šÓU'´ (3”Üœ¡HYjQK»¸“=ü2ù$“eE™¥û… a ʳº`@XŒ dFŠXIlÖ_ã~Pòµ{Ï`b; ìwŸv`Ud,InÙ‘¸Þ‘{;Jµ(‰®Ò׫ó5UU•ôPáGÊŸ(]ë`ô´ó ]‹ÌûöM‰bw4šË …_¯#s”hUßÖ'bî™è|™NIHîS¸){ XÌ$t‘´,”ÔBÛXA °õR¹YçKƶ£ †¹î”¢>^-4X{Ÿ"¦^÷„–š#WóîíÊήU@ÜÝW]/ë˜RQ½Y™¦|6¡±öÔŠsbéwï»›keYÏË_V,Vj‘>û…¦·“§Rè¦ · @„ÛZN[2sê†cwgÑ”X>uß×*WÝ;¸õ¨Ã1’vKº¥]ˆÌŽÁM kÉ=ÏÁä´®uʽGÌñPµ¬ø¨dGžRS;j…8ª°]Ö‡:j:0#¤3tKólÖªçSýDAÝhÚ»=«…pÖ†œÔ¾—|ÙRSoÔ1ûÕÒXCE¨¼"' d Ûܺ£Q±YÄLQN+0È+Ð¥¸­b“¹N~èÀy…æ2—;f:¢?ÌŽ :¿'¢Áòš.E1N^¬,õ¦%Gü]oÔŽdæW 11u·ÜWîa^»—j,›i÷Àç óG“GW։ќ2¼[ ÐÊ-Û„ºR¡Ã¥ºíŽ _Ý™„œxæ•»Ž•ä‰0_V0ž“±®¤eW¦ú{V‚UˆX5å·ø¦'}õo-‡–åVµæÈÏrêbZéã`‚íóð^î²=KOïa¼Ï€*OwjNµÞvjÁ+–ë×X^’.É£­¼ž*iñ˜¦ÜŠhò5JQù´vNáBêܽ‰—Š]ö'3q좘™»npy­w(Â{ºÝ­"ŠTÙ“7¬[¥Ñ$¡¬ÜåpÀ¹íef¾iÞ™›ˆ›×¤ê¢½²áGÄ-ÞHš5x®dÍ•€Z}cQÎ>šF"«ÞöfñØ*TøÇsšJ›Ý:¤®÷Õ ’ºPô*F<#ÍÝûÊlMÚ©3Í›©»Ÿg­g^éSPøˆœ¶sÀ<íŒãœ·;‹xˆ{#H‚çä W‘Ø=L̯܊1Šl6¤í29lÙ,0k^Çà½×z£]àeµXëLoä+·P0‰ÿ )fÍš/Ýž•®Û,xá¯Rßuˆß­ÀƒÒW#ý5ºy£»G’¹åìµ³kê’äž»Äú—û-.nà²=ñ1ÛÌíÍ„Èeß¼w»˜àИŌóTê¢o W‹¬¥Yz£Ž+Qû·FÉ\b=¯ù1Û‚^Èâ -T%¢C|E‘X…zÚ²"±­ ŽKàMz «FVËA°ºBÀæ}ŒñByªBd'‰ÜiB}RÑÁ÷†£-I¢ðqàq$JYêðJùÔF¦ì˜Û§¸n»§ëQº0äkA—°¾Az çïÙn»ûRÝ7'áºUÍOJ“PB/"ri¦y{Ø€2»ÞÙ†.ñŽv×5èõ…¥šÆÍf ŒrÕ™áCäÎìTIå]n>%>ÅŸ<âV–-t«ˆjò2˜Ô¹•“ÛÖoCcþžkû­Ö‚/5e Õ†ŸÏQ¹§-½2 õ©7¥åª>D³RÕ/“c\Ø‘Jóƒ1¾zUgbY·È\Y7 ;ù‚U<°3È–’'eU—®Ï©µüÄF}#ÔûLÇž#ˆô þèÚÍd1£v5joe[ûZßø´ K’GuQ©÷™È¸ºË²˜®Æ­–Æ}H³vÇõ’gèÍ'0Û#-8JZÀÂc˜${­í‘»ÝkßÍT…¹'‘îÇ7¶»µ®Jy›{á%8¸X€2¾pÿ…îã ö!² Ê@µ)ñÌfá!‰ÙuYUZÏöLµlc'3k3­KŸÎäM¯“?$†ÂPa¡Û§-SÌ#¡V Þ”·]†Q 7šjiÏ(à“%E™;[ÖmÐÈ¢-ßüˆfU,¡ò€ç™n¹b8h¾÷ñäa S. S©Þùø¬EðtBæ9Ë¢[}×Iö"  ôäˆZÚ٦õ„vÀÓ`àÄDÒ'³­®Yß§UÙÝ_Ð82?ᦳ†91ôLvK¬FŒîŠŠ7‰®šêTXÅœ#$kJ—YîÝÇÅ<•4àŸ{¦i0I,±CY5±Ë(O!¢3P¨s®ì!ÉPÏŠ¬2©ƒh±'ót¸ƒ¦™‹·î”·d’-…jÓ8ei÷P0•,§¹[æ.P6®yÐitS™Ü©Û…é_ Rx1®¯Ö (<½ÓKЉì4{®zˆìû óõ‹“ê”Ìö~B (‚[ ¬a'<)ÕƒºëÉSl_{¾ëÞn±./Õ=ûü­‡4Ñ‹ø¶Ýr”ê»îÚPùBÏóf—nnïm_–äº8¤øCÔÁ:gžDæ‹Õ'“râ3Dö€5xàU8Ý"µQÍk¶=¾…=À•žÁŒŽ DkÈo:É…^!¯ÓÈ-£ÍÊQ~dŽîX%dúÚCs COûPù$©ð¨êG³+ý˜PëâÅ4•ýaçZx]Ã.dD5À„J.HkijÚ#ME –x„·µÐ8l—èÛÑöø½²Hn&¯T»W¤°ûxtkmSL“hÊÀÈœ&Jaàöj,?H4ïx>ë@bܰ ÚzBшE–ï-'¶%ÕãL§Ö:î‘§JKw§Ñ»nß™Ûw¶u°½íã#=Ê3Îû2=k¨³Ì¥ˆò˜È†cîÌ‚j˨ÈzK/6€jCÓ7­Âè>JZ¨Ê™»Ž„òšD_cÍtÐHMÊŒ{^àRC/>² •]ºP£àà²øS$?z~ «t^ÏçÅM;zë§-Ó-V ¦Dæ>Û«7'@åõ¼cÓzñ'ƒ8÷ ´·b¶/îX¼çÎW‚ë.¯—mN33ZöXÂ'õŽ×&PÏóÏ×Éo1Ôô¢¸d.àMwã ûÿPË63ùîå ƒùqñ]ïM gÕ£¿M]•­‹è;¡A¿Y°Ež{[œHU6o(ØÍâŸÎ¡­>Žª•ª(~bôGYBÌ u Þt l`÷¼§O·ëíA°¦“ÒT-C9Þ§êQ``Çnó Ò ³ð;æÎîEözö¶¹Žl~½þò{Upqëɼ2߀íw™o÷–´2ƒuØc«SÓqòB9xëv‚_/ë]öL­CžæGî-ÕÇH‹"UÌ‘¯ëèwÂ(ò€ZÌi»~¹XZþ˜;õtM¨NBÓ…K·¶X½;ØŽáîûœÒ¨Uÿv¨PÖí½ª ~扯>«£“"½N¥_d˜–Ÿ©>¼1Ÿlà§ßèõá\A2ÂS®Óîö‘;%æE¬è¹)5¡ï×PýÒ’XÁ$PV&ÉV¹ £ñj~ç+Ï)_^ÑÖ¸V¶ª?Ç&4­6Þý¶“¿æå‚Y¦·STôÖE“j TB¬<òÚßõ w j'øÑ÷i ‡ëQe°=, áZj’@á7ëÔ¿íœä+XºV)bõˆF:|ù.e^Αb™S²¼§Ôá5´ç#)ÉM=T@©¼þ•‰]˜} ã+ÜÔ,½zZžË7Ò|ÍÕ£EøŠ>ÄSñ¦Ý ’zŠG‡(–ׯmïP$2|>àN¦´pÌ„S ‡¨ã„7:1±´®ÚîÃäR‡}»ÇêJ_Í\Ë@ý$”›ÒûÅ´ðuKü(iMÆi žÏqp€ý׺3k:—gÖåanJÉ\,ß%ÂbÂ,«ï±³?Á2O ~®èí5Ó“÷7fvª m¬÷­Ú¬’_&Âï¬xw—eÖÌËK4öìzµk?5<ÛJ•Ïí©¹âR9GÌ®œçQ¤Ö<½ëÏuÈi6ƼWÖú(zú–,É=Ä1Y§ƒÉ} ­¦}Èü—LÜ&hiž4Ô– nýƒ¹]ñ‡v»jð0ËéP;@QëÑÛŠª_zè(«¶ݹ™}¤’ D5­½¾0Ì$½O#2Úó¢eÞððjWŸwGÄ${,ŠX¯«¦vU 8%¾‡R3-™›ö!]:m(ª wõ·ÊÃ31ãSúu­ËP¶Í:dßp“Jcf•Ë{³Ë‘}¢TrÉ"Ó†Äõpê¨9ÅW3–tÞæsF/à¹3h\lÒÖJêKò‡ÖÌouäN†½;Ü53–D{‘&Ò¢=¢³“׎X¶¦Hì½¼}@`íª¯SE^js4ÎsPy€]—݇\DÉqdçÛ‚_œQ}ëÙ¼Ú•¾w–Z\ˆ>íîÉn³ÒÑm%ÐzßZX%ýy?rzR›§•š{çlJ5ùJžlO$*,4) a{Ó¹ž.¯ÇC¾òN .¨ãöæ²?ßZrì|‹îØÃM¨Õ*º UjóÈ1·ðFµbÛŽ9»f5pèƒ?ÀצyÐ.vuq+©Á8pGLµâ,éΩeg×4š~ºLæx›x˜|í]ÂêK}Z ƒ.Ì)u+$Á¸­æXÀ>…¦/Iqi\mYq?ö-Y9¯ç‹¯fjµ~IB§y¼P„½'ñ0¦«Ð>êmö¹3 3bÓ¹ýÛ4QwîÀÛÎödâEvƒiÇé’¢AªEæè«NIé’pãQÍÚãg¢îð´Y~i¡M³,<’‰R5÷DFAÖ;µgûÛܵiÄÐ^{=€¿Jr×à¨3î%‘K”J•bMÁátå-€½È°ÉöÀËÌ(ÿ9$xU×òš´zÞVÓ—È;ý9×;ê£ËW«ªl ¼”hôó;l¡$¶-ë….’ÏÖ#¬ ´]––²–¡Ai²,¨§žÛÖ€Â=Ž\xOW‹²ÛÔ5by»;c–ä1í8a‰§ÎÖS’,¨‰¢ê¾m¨:åëVp)µp 7 î)-ò÷iürTï{Á^eZõ`ÖùEøðÕZ¢»¾¬°‚@J¯‹¾<9ÛŠ#lB'+ É(´nh¬ñð4ŒìC¦¶¶Pj0>ˆ e6y¹W¥¬»ªùq¶waH³tüõîÊ°ÔÆ:ÚŒg# tÔ¨CpŒ°Û<«V…©KOÞLƒ§øx?Ì_åC} ½þµ,ê1í’[  b@:P²GŽb[Y•€?›Wü©¨‹©Ñàt~=õbSoÔЋò#^ÏÁ:l™ã·5¦·¥îà¶±m©r&9 \l|µÝ›'ö*wÐNö=º­.‰óÍÝI‡ê:ô!y¸¾ç^ptÎÒåþ‡hÑ¢ýáRèz«„×§"õ„æR¼7Å«xœæ Ó¥Dyëºû.Ò943L/–³Üy¤ðÀ2PÙc-™e«\W´¾¿e:«ïÆ••§dìîdVQ‚‰3‹u@Oâ~ލjç» ¯ÎÍŸiKß8 æfÉ ÙÆux)œDˆéjiC&é¾70£^ñîïP©;Fê´ä¬_Ý«¯¾2¸'q'&ÝJózš‰C/®QõÆ}ÀÙŸãí™ÃdyóÞ}$fÿ‰×˜S=g{£žMß–£Þtå\!¸³ßo™“€h¯Û½jÿ'J°ª®ø;ªú¨—G†Œ x5I36'tÝâR2æë­MÜ´Rvs©·‹€ÅórîëÅ»%{’tKþ°¢ññ:*HU)§qA­„øJEJ8)¸;uÏÆ(pܼˆý½XáÒþ}ð‚ªAÒæu½nL?Ÿm$§˜Iñ-žÎ¶®²×n¾é+Þ/e†÷Aõñ7A½Í 鉿õC$öò#±·çÅZdîXq'“fÚ «ª8ÙÒü`‰åIx_5«ª¦xt°„I ÍgFÌ©)ÍÍzÇ·ïŽn[) dQ¾ë©NYVpò}TyÔæ-¬ðS†œÔK¯¶‘ˆÓ@5}RA–ªjܤþ Kz£«ó^su…{^EÄ=:¡¦Î'*¯@§.­6šýà5Ö¸Nô廉b|­üC€êr§QÀ¼öfÕè#“ž K]úE†{cZyŠXywv»‡Ý™Î¬åìϯ°ß2ï½N˼ա²:²Ž*™õ¨ó† LýíV4¼{ôp¡.m0 M8šò4¬Á©pLE¾ µË= |£ò"oo{nšE P(x6.€r¾²*±úUÙ‡û´§,ïð²àX^¿[¶Cb/eÞ;ù#`GM=àâa¼9+"1¡[3Ì_U æÌ¾'&„·C×oö®ŠK{·÷ežMÚ¢üT†¤¤ëšÇך©Æ® *|¹·ÕÞ1[/–ù‹+3-”*Î"xW ¯ÈOÀ¨ÎåÞä_÷âå\nEç’‘ó•>£ã|‘Ç]¯³:9 ÕÁZ´Ì{í0#™U)>½.™¦À–}ŠºŒÞÍO]à›T:Äs’dsˆó(õFÓÁÃhý]©£}Û‡W%ìÆ;Š ^Ö¡ò{úÂx%ÑY„ñý9Žf½7ÌK׬MêS£é„Dóà o/d3Y1¤»NG7Òµ 0—k_«´Îi±äŽ<ð xP·¢OÁ˜Õd è€wÅGíϲ Ü JwN‘açq$—8ç.©e›Eñ2ªÉýT½Vä’î*¼æs‘èk™WüÉIçŒWìÑÓ*”Äò±¡q¢™Màh(ÓÑKaÖ£Ac¥ÆT‘ 虘q¤¶Îö‘®¤æÁ”;ŸÍVØÊz´%no¾ŸéÒy¯jgÔÜš±µ8TƒŠ }"ÞŒ1²[MŽ`®‰ÝpºØ§‡Úðaø*s ÏÇŸÕïUr$ —6Ò®„¬ .¶¼?0p$÷d ›p*]žk47Ÿ,_­–*ÐÒÔ¾Si`300ø´Ûì:k|ðñåö¦Jó8dÐÜT‡RV))×ÛjŽ+®·]s([(uÅõž…é«ÿ¯¦9”±hH¹=ˆ¸æPÎ"þ¡ÆÃdAÄR‘Oõ–Rú“hK¨íöþ$ÒSàöY£”Õä‘YñÁ ãñeŸÞö•ˆê—ªVÝÂ#XO¯C{\“ñ'9Ýgê+q<£#gȶ^¾®JÕž&f®-B~ô²«øÀiá\§r6-™-1™›’.õº-P7œ¬ÚCŽö?uä¾ w9·ÿ6kÊþ¤{sèSQ{9XÕvz\Cú“PTø‹sñÕëœdåç9Q^QíHÞO;ƒ‘a.÷9™%˜ã/ÂUŒN’”ÜÌ›3W/¸ÿþ¡¼›­a‹9æ"ˆnTW_ay„¤, ßbJÞÒl˜*2#>Ø_e3*¯j> †š?XsEÅÑåOâ_B¤‘¥ûjï““ìR@‡“ ©àá4ò^ê ЩÆ3Ó U`¤½qgyéýÇW ¦uÑ›5v®‡n+ÀÛî­GÙ¨ÈF÷Ár ê)pï¬Qøè°2õ±_‰­›?i᥆ÃsâÅf;Êð«¦Þq&hÓ*âÆç$ÿ!rÓõ긚ªnã ÆœwÏ<¸zx<žÑ¡Ä¹©³õº£÷x×¼ƒÕ ^Û7QVr;d¸NÞŸtãšžœÅ<Ý»}SL‚±6oØLüLj«+¼ÕG¤Ï2kå²Ý½ Ø!mƒÛŠ®˜Å g/Ü´wO4µØç³²»ó6†;w1Òw¦D!cpÔ\Jü§O…—ÃŒ<öYS-Œžu…Ôî‰~¬Ú±÷FUïiúÚçO­ûögOàöô!.à¶íGzêçðæ¶f\–h¿NýH*£ír\¬ª$w”ì_þÈÚµ\Zü„f[²SûL ¹m•1ó•êþù#»‡G®/JUî(8ã×;ÛŸlÏêªF‘a—Z‘Ü(§?¤³z“ÊȪ´=µ®Wg…Ô×øíoÜçÔK¹7ऻy/Äð|ªL î5îÊÕÈPïMÉ<ÕÓ>F§xìÁ{Zk朻 4ÔÜzGF‘3ÁB02vß×IjÖ)qLïOÿe†)Ë{¸­,Z•7%wÆ9Ï€ä´ºŠ TÀÔM(—•”«>gå*û1WRjê:™ºÆ+¢!­L7icM,8Õ[~Í).àc ÀÞ‹P…[ÒvŽt˜7†ž•Ëë” vXÙ÷æLMˆÁrf¨º”Ç$yòæ VûïÞ·"dO¤èöÎäŒGÞŒU4®,dÂõd˜¬àYW)yQ§iŠôþžû¬2ºÇSAâdpãËÈ ëŸãÂd·WY§âó|ݡλ¸€°=ù§ºŒ²< ’9‰¯1üÈ4G›#¥Kü”!ƒ2ìE6â͘Âä.†R¤T…*Ó:Ô±{*îý€öPßôb`%ÔàžD<å­´A‘aI0vÑ´÷L"ÛÁ¿¶cf‘ÞÑv§ÄHЛÂ!¥Š¢ý3XM½c2z­š;\jæ4öʶÎàc†,:ÜÒN¤h£"Okuž•©Â**(u5'R$çjH›]Ÿ¼{ѵ-©„¹Ç4Ǥ¦ç 9•Ir²Ï„jÝ™È*Rew.Äkë5ÌMû£ÈËuNǯ?Žk¼^äOZb` ¶%°på¦@§ìRýÕ~ã);¦Œv7m?uÈI,µb”z«Îȇ1þº²Œ:”È :¼óu uÕªNzl>%%‚·ŽU‹ÞÁY€ NLl;Ð%})ì¶?¾©Í£xêZæUc„ºku×îæ‚Œ=’Á¿oYÚ%IUkmš3NÐß:u½7Ãâw0íJ§ô²ƒ©ËØŽÿMŠG­°&|ç÷N›û;•¼>èäñ×¾L…Re€ÌþæäÅÅCRM–éÏ÷‘$¼zd©?v Ü{wò|9XÝnÓXÖ‹N·äïTóE^]5sÍâÆC…‹ùc@x¨O+wªVX_ZÇí»\nû…ý Â9,!:-û—Üã>öø•œëŠ¼Ô¢Êжµ­+¥e’Gšœ_Ÿ—äç± ·e¤T¢ü'’¹h|YO?¿øÌ¶½[]3·òülªã*«[%¬É‹Ì6+Žyżu$ö{Ê+[ €·ã`Y5—ÝÝ„V¦€W—ôï×’3”I)ÕÉnâ±åœ‘B%ÖäL‰Žb×äÀ¯ £<æ½yþ|‚z¶O’kA§\Üi;àn§>ï±Ü zñvÏœnG®Ú爂,‹[U!÷·—ì”;»¶ƒï*è’Üs¥ù°Qm 1¬|‰BñÕáB%¬©Ç†¬yÂ\•Ýå!pg“ïÝ©h l‘Jm…)3Ï G½ŽÚo¢oÍ^…š$k9CS0{/Z'0=ð>™ÅÆùHüb…²!6 ùÎÐâ:¤ïÊ!¬HVl8Z"™\tКœ+Ñè÷RÝäSeÊ@€l ThYÞ€a†<ÑùØÊÅðXÌî}˜M©<@×D ž%»° YôY3VlAŸYÞ1¬‚C]~Ÿ‡ˆ~þÜv¦cwÍò¬Ay f¶Y$“xèNHÔ(o§%-ά?Ò¿¶3WÓ‰TSúN-•§ƒÀÎÙ2º3 4xõ(u\d0t¢²¶ÐXÏ笇pÍ(¯»_§›'2šÕÏ…@jÇ,NjŒ¨¦w*f)¬šÙ°ÁõO뚺.΀7ô¡xo¤Tø/\ ]©!ÈÄZ&WÂ)j´…Ùäý†m-­Ü@ÁÃíŒá©d Œ¯6kÆÞSÀÑyaTüs¶SiaŒF¥ P"“ºG£HRdÏ-‘Åù‰·Œµ¯ï§ØÌ4ÿˆG…€%ÈI† ÍŽ|šp. äô7ä½´Ÿò^6ÞݘŠ®DÏw”4tVí¥èǾr”Uá¶³ž%- JÇŸ T°]GÓïàï+$çùÅ©"mÖÈuYlBµ@TíC.Ó´3#]‘‰7½+åÂRé zWc ¹ÞUÀ ;…ÂÌ u^Ô§ÌÝñ ÂR=#jm3em'Ôm_ÑB])½Â;ZJÌ|@uÇÃ: AQr¥Ù%)‘ ÏS Úý7 #G¼/†BâYÕ; /fâ< Ñ‘0ùšQé—; Ë$¤¥-è½zŽˆÒÛcä±ëÔF´€QeÚãùÀðÖù}Ò³€³àãOJ÷£ vg)–G·´²>B®Øâ‘·C¬™ëb„.˸»‹¹–Å3pwÌ1©ü˨îi9C«î÷ïh+{ÉJ&]êØzÕ|#š×‡¼¯¿"P>nƒÎÈ }:ÕÞPª|i4{ª‚ ­tÛãñødJVg5°©vÿŽZ'šÒAšöå}<‘âI0Ï l]¡²]AZPˆb]f4’ÃÖ»e3÷vLGa©ˆÕFÝq]&@”‘Öhaö|®„Úá’Çý¬ì׌ΘQÄ ì(êk±S²¡wio8ŸY¦ãW@6ïîc=3Wkc ¤>'v“AüÒ-yz:!eöÌïÙÊèÙͧ¹€s|ƒå§ßô6u5é1°m]Ÿ[ó}]'ÒjOÏ-@ôÎl´=ëà0ÖèJµ)³¬¾ÀÕŽ€ç/úÞY©Q¤!…:››¾÷t–E×ieCzqÓ {~:€°^$'( ˜(Ô'á‰É³#$›O?~qNö–¤ÐUƒ\Š…E£Ùqaò"Ó¡(CûqÒѽZJÕU3'¿_I­{ÍÑX½>& q² Ä’N\ãknñƒª²ßšEPÙña ߀ÔÈoÔ¶¬¶¶ $÷~ЩTå[$¶A5Å9M¥¼rÒËûÉ–+ØË²·‹ï=2ÌqhP$–Á›ªMYÜãZ|€AEèØºóÑ©»k€=Þ(ýæãXË*\˜Ïõ->ÿ¹¨kaPÚ~„´{òç ²¨—¯˜6ó ë2ÝÕm,¹Öt¸¶îäð[l-ôôÞ»ZO+9c^æ†%€X9êØÚRÊE Õ3v^¢;«‹uR§é6-NQÕŒ² ö/v×_®Ÿ¹‹îF<ªœÕYî®9˜dx×nGUpýÛ\/I\zò}VÀrÍ<Ä6äeVx}a´j€ë|ú¸$Í,[åu Ü)ŽSÔé¦CyòVäîæoèõA¥¨)ü6´Ä$YÛ<7Ê j>¥á@'CÙÏf,\Ã)vÍp ‡@!½ej¤—¼)Šœ‘>ý:⨹z;ð¬]AøC×2}Jèoýø;â»Ð dZ¹œÎ1)9X¤>˜Þÿò,›¤ädì)6B¶9xßuÜ‹å•rqÆæ‚Ï¡’R)uijúœ§ëzIÛ÷Jß9»¼CJ%^Ì\‰žã ÿAÄ¥&Žv·G³»ãYÜR!£Öç˜ô»åC´Gv)#/p¹@”¾O³¼Œ°[Æ´¸€¼eÞXë‹UšŠ ða&äù♊º”h³#R« Ö[büL*ùèEww'˜q}]ö€#«µ~V×_Ž)œ¨ý½È wyĆj‚SX½Óé¥,S”󱸲Su+š þ–÷!7ôqw°¥Š,ß µµƒL“Š@Þ¨.Z¡ê1p7­PÜß(^¿Cæ#]6°¡•þ˜Zô´O¬¼ŒlÇ•-}>¿ ãH¶¥›!ßv`öÇ31—Í¥p®ˆ¼xÃnÏŠ bk†-.P´¸ˆ°‹}£êq{AÕ2™zîwoŽUëXE1¼OYø¬dÙÖçe³{蜪U_c–^yaï\JÆ ‹ÀÍ>U€C ƒ¡s–*­–H±Òšöjc;ô¾ÍÛö×\9Åh慎i—ÆezÆ76Ô£ ޵MÍ×ÓyQ΃ßú¶ØÖÖõìÙÖtžóûŽÓVàØÚ‚mÑŒn¾ø^” t;³è±5ŸŸò[O«_»—Ž¿l³B„ÀÁB§†D–ljEÓ¬ÆÕ ¤íÙ‰ÛŽ¹.p[̸uAõ? Ó›ôt“J4½ÆÞM<{VÓŶx:ëH’%s÷rQ‰-Fh¯0ýÅ(%8³NuCÁí, ujc¤åDkòkÙ>9Zº‡ÑÇ H2í5¯t¹HêêTy·È±G°.`x{·õõçB{ ƒZã¬Ù 7’ç$Þ/z½ŽÞ@oz]ÇêkAZe?ç1Ê"\V.<ýžß%FÏDL­ÛO8§MiÝXøØ>³@ç+*ð¦34ùÕÄÍE,;E^œÏÈ¡d*ÂwÆr€1üµ¦Î½Zöp£(¤òä7b}Åwýµµ'U|W9™¯ëx5ŸÁ­Ì€·gHpÁ>’„…óY­Æo¯Y Wü¼’–<x±õe¤}AAÓU/™µÇv':H|d›õޤ®5ª¶—ÏGªQVóï,'ãJ×Ããfúu›Ùl–ëy “yšZáïBJ¶ÛÍG[[ÄNe}±p髲+²úì¯ÎÙÄt°šE~NZÚPªär—]àNIêAm[ò¸”Ë›c¬†­¤Ú9Ñ¡–,@`}Šál›U`Îýsj XŽ­®éÎKË¿}ü#–ŠÝŒ „b4㥳S ø&Å8w›æ™W÷îeòËõµ÷anuŒR£d»ÓêJ8·ûv=ôXj] Lî\…Íó£´ØläÙ+£/v¥Âk„×t*‘°ÔóCüéÖòAßb?ÔÆñÖ-,ƒ9àä†7Ã~#Ève¦õ±~+—§¶Ük’W÷É@·i£Œ‚«oÞï±+c§òï¬g.è£àZ—[}Gëù–[`.ÍÜK‹û©u15½r¼9$RuŽ›'þªûPÕ­¸E¦©"Xí~d”„ºTUÔ=Û$ÓMóâ×®9ñÚª¢«ÿ0i%#Ú9ü®²¦`Û奱¹Œˆ‰ªrUˆÁË-¯!èé9>ßv]:èÅ×uĪR„n’Zï0¥"j·Å¶¼Þ¶–n…öÊU‹'Ý¿ödÜÚ*WÕ^ H0L]pY›b¬\Õ§ž­Ç®`y›î„úibû¤´Ÿ@Ò©M]ÉOµ‚"%bi-s'ÍRÉúžÔ?J # ÀƒÊRHE{$Òv·©‡ê¸[ІݩuQú›k©fðУےvë’ÇY;éfVDŒGHIŠÑñ–Û‹»ðcfëû9Ý\]GHgèùŒ³†çƒ(â¯f5äN0£:#£iº¸‹•Qƒ>ßäNÜ0}PF3By°d§¹O²Q^ེØÀ{jW§\¤‚x+ÀÏÏiäË[k(þ®H ªà¾,tÛ¶7š´ê+¤õ ŽÜ_Þ_â`¶LÎJuu\ÎÈÝÑg_\Ò÷n?¤I“beäC3¼¯îFdéiQR¶š¯Û_3”\ÂÛãZ{ÞÇ?Ú¢(L>*à³Ú]g>½– 5‡!m)xé]²’=CáÁ‰·3fÌÒ€ÖÔRÓσŠwô”)sázè†e¿ Xiø$FÍ’Yc½†o;45Ê8m.¡÷hi„µ¯¬ ·æ8³õ¦§=§;zòLK‡E© dÖ;ˆxÒ½ %óùÕ§ÂZgu°Þ­{´•>üZÐXÓãŽÍáTÔ/p]OÏÇI=+µBÇcÐ(1áþº¬Y}ñ{LQ©Ít@ËS6Ûm4\Oyè ÉDæ%WË3G¶!çŽÞÎÖà† ñ(_Ì SôQ¶t%;½° °…2š Ði{1ŸL™<õ¾„ D¦¥kmBÍa¼`kd5j ÍcÌ•±Ì \¿X ñ!âÍóZ-Ýkk–ñ†»ý·O׎¥tÁE†ä¨Ëo"ÚƒL*£Íç§£Oå%â¯ß–< jTúÄ‘{/©ï 骣=Ç3U¸0¯½ä-£v›ÚÅܾˆ¦ÏÚF«ß‰*µ1{û•¡å¦"Uc ¸0]¼Ûמ›â¾Ï™ËÈ^¤õþdMˆ½N“º%ߞ›˜ôÆXPhá— ¾óðQål4)ª¿6©:áBGÓP#Sm×_xÈÆo|M<ÿñûœÿ(ùçü¿é¸&â/ùûà/õÿé¸&â/õ‹Ïÿ”‘”BÈüÁ¯¯ñÇc=ÐhÎ &b=‰h´ýó>¾ôs>5O©¶Ï˜xÎ'Ë»Ñs>cj‰rË+ÛÐo¢-†I iQ4Kn¾œG@ðNJ‘Ÿ)ì†W¥iµD‡Ž´òó\C^6ëĽø5=\Ö k6­ì¹žVî=ïØ›4Áù¢Å•›çõú¥óÙûïc;6þ‡šØûîBoæ©OW•u³ÐçÊ»QÎFVKÇý<è1~˜Ü¦±W·©Â¼R&½*ÚeY´öÉ“¼î¢µ§—ØõI;ã}Zõol=¸Zž¥¬.Ä…{Gº<2À‘}Êzó•OFµf&zéy¼:]ÿf95mxïÐÑÂ]³w‹¬¥ÔŸP£Øö˾èÂòëÞÖ¸%m°c·ôÚ—è†Ü"yùŽeÃ/ N'h°Ävø'½D•náJºªöÑJ—t°°ÓEòÁ‘ŒPÞÈb oZE8R÷¥ž…·EþrŠâž*þ–ЃCçÉk” ‹s+íì=ÜΙ Ñ*ç˜{ò!Iýc)n’Åw¦îZîùqYÇÚH3EŒ„û߈Ô%ëÝØqÂ侇33jOì3¹|àBç¶i›ä7mL3Ò­àx3+C“çp ¿±‰øKتX|w©Þ’$­YL8»Dà‹µ᫺t «—nV’¦D”™hpû§€híö \¦¦³Ôeáu¶iï3×-ý´¤)|[y\èÃk /\ tù°ÂZN$·‘›‡.K÷ìÃK@pœuMˆùH¡‘>RD>2ò•§©I¿ìÈÕœG4Á7ãõ« ÷›X2îÄãÃç”ÄßÓ×Û®Qnèz,ÔäRç9ñ æÐ,<"Ü}h®Pçí:ã“]y!lA±g/Æj=¹e~yÄþéžàÇ;ýâ{„nòt`Â8(µª¶»—F‚u[ ´EPø84ŒÈÖs,nª×¢4fŠò˜–<Ê:§ÑiVŽuŠ~ù”¢Ðöþd½_ l©a>áP¸K;V¨bidF¼ *Ç©­ëǦr÷O„Øtã€PÁµIöÖú·µ7}¢¼çS"¬|æ›×*m5åŸ]Ó€õÐuD+Ý5=z3©Aæ\o½¡î3›¤a¸ê%Ü‘ñé:Þ<óá7þq6ü¨Jª¿BøEPÒ+…§Æë¢W²¥…uy0h~•¹ºY÷ާ Ì_›äâÀŽä9×[øLÇ0í4aÏ /S¶ ÷L…9êÍ1Ö$X´ë9,=§a²ƒoö(bãëÚ¬¸l‘e×"_ê‡d%.K{í-\ëAPŽQÜÀ¦+<¿1Ϥ([šä›.Žàãk¬êN™ªeÂ&ɡɜI¤¶èëèmn1æjÑÓµH_mŸ'Êj®mChzôÈW7ÙîX,×p¶È²ÚpG³¶Î|ô¡{xNž„ð;ÔFžÙ}Dem’ ŸŸU»«­Ø'Â3ëåA&äšÝºy…#l;(ÛÏW¾ØM|ëœ$sse·›ž_Ø©|c“‘$7“9áw²{C?¯*}DÜü’FÖâËRö€ mwåºÇÄš 'aM o³óënÜœ&üî±^ù“÷èR)™„Na´Âôt°l?wÌHí“9¬ˆþu¦ö> ¬‡ÍÌ,€ßÌß8à[¾Í=ÙãÅ¢¡þ^«}ÜZá÷ 泂L>|óp°.dïb©E¨AS‡O‹×³²J€wÏêîGòy+÷§zxÈ(]Îp)6Gíá+2 _XYß°"òîƒ8”î|ç쩦'#Ðv¯4A,—]½¶r›½iYnsµùgÑÑÐÎ7°ï>|ðQ{ý͌ӵɸÉËù ߦSM×ôC¿0OäµÛoœ”wô/²Z¼)Dï=[fŽŸ’ÞûPŽÁP'® ‰þ•±oÚ”3²Ã](¯õb¾^§[B•pË’ösdc[¬t©3ê‚:/ÇÎ*‘’Ã/~èOBíÚ’Dª9Z-‹ðIMÅÈÛ»%×¾I:ûUçåy±së3›Îæ>¥ýwÎdlÑq:š¸4¯[|f’ÛmR€IÆc†çÎßæÆ›‰ù-]ŽÀ4¯¬]³t]lëÛ]Í«„+KºÛm·‹Ý¯Ü'Rxz…Hõû9k8O{¶%Ÿ˜½l`!¯É®æ8Ií¹úÙ¶ËÓ·ò»yIòÞøø¸Ý#]ýà’dk¶ˆ#—Îj`ûŽ#¶Ê3^ÔÛ¼ìMÆÅéÛÖ›<7Ü(œU´`íkèw‚h»î– =õ´v²7IJÂÃgö=Œ 1؈ÛÌ4»vµî3½ž«¡&Ô™iŽ»“"uýt_-ÞT±\ÇY/ôyh³´Xlzû]Ý:ï kúâÃYº÷™¼Ÿm2Œ Õ ]S²¶âº¨®úAk3-ÃÝõ¼¡@Ã,¨xg˜bFÊšùx …G4Òð’”5N3“2Ÿg[ÐônÙ™­0ƒÄÍÎZ«nr¥äE~øñ»)òÃ>3Ç“½¹álblhµòH­ì!“ùI¡ÌçÓíˆü2b¡®óû°¼‘ºB<~wÃ/á¹çZ¿îmµëðìÚ™‘Wz×"ç–C‘•P)µw4pλ(„Ïš¹v9ýg°<—‡Îí°¥÷ ü:o8Äç„×—Ÿ ånœ«+Úl¨sTŒìcBÙQ¬`ç§²–“ĽW!·ÌÈêä ]6¢üÌð5.ë–†ŸîÖç’nŠö7Ú](9?žìiǦžÖQ½&À¤6FgIR€BLwQH.»fZƒ¯áJ°S–Ç„¥’ä^\pkrí ØêÉd’Þõ"óÈxÝz¢®£Ðj•ÊúhvÁ•À‡ë„•mX–&q~”?×o¤{»ŠýJ=|Á€ÖCþ¥á;‡û‹òrŸmÚx§ÚÄ•’ö¬Œ‰Ô}Tãâ닦z1‚–F– ‘†øÌù”I "Ÿê&¸¥D­‰Â)\_àÛÑlûÚhsÂR#i- –”óä#†g^äéYÕô¬«9‚äð’ïó;®¦ bhòðØa]žä¢{«¸T6­ ,,Lùòæëpºkn±-ê³·à¿Îv¤ê¢DsöÜ C¤·k-Ú|‹ Þ‡®dSóIŒJ­kZJ¯¶ßl°>Å–¹gèìq½8»F‹tñælVݺþ•–ÞãYRå*‘´ÿ(Í;5e±™F›œTaJø&[°|%PTž€´šŽ wŸ×ˆ]MÚ•HhÎöº¾tâ8ü9龋ÉÂmL FF‘…U3°å Ðû7Ÿ~œðþ'‰ù]æd$dþÄÿ§ãšøþ/ý»àþùÿé¸&Ú¿Õï‚¿Œ„ìü§ãšhÿ2¿tþW.#+!ƒø³þc¯¯ñŸôý'-œ#V pÂmpÂ:Y" È¿¯oÇ%R ü¥%áRÒ²RPüRƒ?ñßi¸WklV7Ûn¤ Ûdf 3Ú¢¦¯£ãß .n.©..®a¦ÁHƒKÀÌÜ0xŽˆsÆcÅÅ5 ù•Y!uPV´Çbl”°D ÌžHtÙ€upîJüêÎx"OÜ`æå‚å‡Y3î”ø¡©ºÖ)XÛcÜX¢Žà¼ANNZ~ƒT'GtÄ*ƒZû¬†H˜]ÿ`ú8QQœ‘ƒEчw€Ù»am•øÅÄÄÁgO/;,^Ìš@à‡¹a•ø D/G,Á‹%òÈ £ÍCÀ Ä”[9Ûxw«7l€icñX7 k³ò‚i0ªƒIˆI‰IÁ6lóØàÜat+QâwÅám°žüÊŠ˜¯žL É ƒÃÓ­†_ÙüsÞŠà¢`„±Ã*Šc”a>°o—¶ÇÔ¸YÛ{V¡eeÔ±i,éU„Áã‰_“+bÈôÔÍÐFËCŽá{‹xkH{“I` KøGÕØ9:[a'Óñ=u¸€ò«ÁëÉå 0ô*ÅA¤!—PžÊNÔG0“™=ŽˆöXPÓ\±D,ÌL…9ÛÂF'ÌÖÙmaXljDÙØÒ¿Áþ—>x”Þ©’ ŠEaÐì`ƒÃÛÁ0ŽŽà=Ö iò˜ïVtQV$b¬ ÓÁ‰nc„€é¥ &m”¿AŸ¸ fjúƾ)àçWv‚& ‰ö 1BUþÇÕNæL™X¿µ³ V¶ÓÅÍ™ˆµ¹F)ŠÓ1rˆÝ~&ÓÓn_“ôßÊ2¨‡Òˆ©©ÛBÄ9Žš` :ì?æûŸÔ<™q(iÚ8ÿ[ ÀÀÿÚ…´M­ð?”Ë`ù_Z˜]ŸŠûQÍü—Ìÿc˜ŸŠ÷1åú§@ÿ˜n%¾Áí¿Öóÿö¥ù•Ac%Ðà¸G¤´„L1›\pšô{# ÑÞ ¶ãä¢àþù¿'™/°ÇzˆnàØ‚.;‡'œ0žhG,^f äAM º‰ÂèòÙ&Ë™ÁÖƒ¥ rþ›$ó| â‹` åqDg,ž.wgœÍÿšÓ“üÂ,ôîÄXFçv|!30IžÄ°F¶ÿ&äÿ™4¤þRtÍÿ"†QÏeú/“Â?3€/Ê?ásñX‚3àf…­wæu 4:6tǹŒãôŽ ÁÓï/‡†ÿRøGÎq*!Œ§Ñ7þ4=øN1…~õ@üŸþî¯hï#༱JüPìÊÆ4PŒ'SâÇ8âìðH˜ÎΞ¨&œ0ŽŽÊ_‚bÎx˜øOÕÅ †IH!%å‘).§G7&Dí`V^Œ¨ È(ƒ;(<ˆ÷ðð‹Õ9»Ù‰ÓC4£<±(âœì`7믃z.x;~Æ‘¨Ä?úºÉÁÃÙØ8bùaVÎn6X7%~p˜N1âvŠâ .ÀG f!YŒ†üèqHåÿáÞß¾&ÎÿYÿ6óøŸùŸé¸&ÎÿÈþ.øKKÿÁZ®‰øËý>øKüÁ:®‰þßæwÁ_ñÿi¹&âý}ðGüÁ:®‰þ_þwÁ_ZúþÓrM´ÛßÄŸõ_ÓrMÀ_þ»à/-õÇþ§åšˆ¿ÄïƒÿûŸ–k"þ¿ÑùoΚ–k"þ¿ÑùoÒðŸŽk"þ¿ôü·?û~Á5ÿßhÿןý?ÓrMÀ_ê7Úÿùÿi¹&âÿûìÿû3ÿ7=×DÿÿK÷ÿý™ÿû×DûÿÅóÿ² 8BŠnÿð?þZ®¯ñŸ´ÞèËrƽøû?¥%á_öÊ èû?éøÿÙÿùó¯?û?ÿìÿü³ÿó;öŽ[åþ3v€Ê€?ßòÂS¬ûü’8=»@ÿV~eU‚5'cæLÿM_ûÊØ(ÂX4/ @b‡iƒv“8bñ“öOÈþç¢úùÛ ÿ©¨¤GE5*)†¨è¢` ‡wþÙ.‚ÿ%±H}‹šµ‘#@ø#º\d>ËEƒ·Fû’?‚±‡£šòÇçü¬à ¬pxŒ›×Qý¨ mêöXk‡qrgjÿlwÓ”Ç4±- Ѱ˜ïظó_È$Øõj`ˆ},ÞŽqb…Ð/Ör|«ÁN·ŠËó+kc‰¿»#˜&×*þXÇúÇ9þ°Ç€XMAØÿ ö¿>b"™ÿ³^Sâ›\Oè里 僂AfôPÌèÃϦsT2UÝd¤ƒÖW5ÔFkjëë˜nú_• âHpê å ­ý¯ |ásvÂoÎn“˜ÿÿÛ7KH|Ëj¥qúñ­ãˆVÿÛ4FþE*J¤2*Y~eÓ ã¸?®øoe&G—ô0õ16`Ê/äý§íÛ—’û³oÿÿù5qýÇo´ÿûÏþÏi¹&âÿíÿþ³ÿgZ®‰ë?~£ýßðŸ–k"þ¿Ñþï?û¿¦åšèÿ£ýßðŸ–k¢ýÿFû¿ÿìÿ›–ëkü'½»j8^¿öoÛøæúO i8\RòË÷?d õŸpIèü—?ë?þõß³þs²RÂèëa&ô¯×ã­±–…þYú«–…þ•F‚Ùèê) c‡k|rY~H&æ]ºùUvMwЈôíèÌì±`~zÛôšGb 0Pªt¡Ò£{Ð’TŒ5tZ/´õLkú)“z±Ã|§ˆ_Ž%ÑåëlµkM$À0xz›î ý¶8k D Ô2ôÌÍf4 Jûa@Û€þç ³VLL ª’EÑüGŸnå ¶Î‘¨ð $Åmd%ÄñX4š€sB£òAËÙo˜À”J·íá ÖÖÙ53&wè ë0À€XÂlp;7ŒÓX´ô+øÐªZk¬›ò¤8(VÜ>Åy¶Œ’hô(Îh4X¿‹=#\ú%" »'Œ (  °†‹³ 0çh¬u<íôŠ¡Øê(…,Š`>ãú½Z+Xã†ÅL”5XVVr2g Ãöȳº:¹%/ IQp€/#*!/!*!‡’;uýà¨.=¹þ1øV;²¢r`²¢)¹qM€~—®P£HÙ‚}ÒhPÁ¯¼Ô*p8`‡…:)g—¯ü $C´#tücÎ’q)JQªê‹„Õ1 ˆ ÕÿtC?—ï/uÇlçïG´lÙ)!f”ÿ¢5éþ¦Þü“J¨p:ª’ˆo+(6y9FÖªnn¯oÕŠ@H€Ê"%%-*)øfµ ÏcÕš)}gk‡oÕ-%#껜¨´¼”(BöÛµƒ‚‘—šúÌço5!#V/#*‡•”’úf p°ÉIô›x|«z9i¸¨¼Œ¨<$uø·«ÿ‡`áà  c€à”“úV«ø?Ò &òe|6Äñ+ëîô€6]|Þjè³wãíÒëè肱¶h|¾'¸`¬Gï¡°Û¤I@Æ#PXPV¦a¡OÀŽå2c ÀÆ&F¿¢Þd"¥VÎD¢³ÿ·æhÿþ=—¾¦k¬yú°fl]Œ“ä޶¬éRTþ R¡ B•ݰDÀ O9{àdžn8ËŸŽ•Ä÷b¥ƒß{‰f8'¬3@LbJÀF3.Rú¨ÌM ÷ç@‡„ÀÞÈÎt$qôVaDF³0 ØÕcAw2M "¾TMO¢ÆúkT¿'ª wé6X±Œf¡qЯ‚Vò{¡Ý¾y9bݾ8WɯQÅቿE‘Ϥý<—jÏhbúü©Ô÷ãC0ðx°§7·ùlyR_cdåììø @’‚@GßÏ ‘`¢µ½³ݲܠ]³nŒf§ 8éô©1ä¤ä¤Ç#7ö- Ÿ-ôõÛiLæ{3Å'[šÌg¼  `¶Ž»Qà ï¶ýàdèK¿6¹/Äý( XâgÀ>ÛÔÂ4Á'ûïáoo²¿~²ãñûbx?@ºN#xrß žÉh\a 6¹¯Ýä/BKŠê3HûÁT"ýÄS9BA¡iBGþß ³ï8ùßy> â~0BŒJ3` XÓÄwGHÌ¡;ÆĤÉ/Bâå3u?͆< ¦Õˆ$¾;2B—ÂD3’˜ùU(IŒ¢ô³- j:-é»Cômû,iR˜ã Ù!^>S÷ƒ¢×Ë­Ó¡GëàøaÚPú!àôŸß$`1’õƒ1ù«Àôh½³-Èøè—rqŒ”Ñ é‹Ö¯òDÐ>66 ý¼õã¾5üŸƒÒMÏ¢3CöeáKºÆÿHÄ~•_’fœú\þ+Q¥æŒÇ~Æî+´¤Z¿Ê¾d §âô_‰H·³;v¼‰Ùº9;ýµ‘ÉüØ~¢¨~…6ÈÒOq™¨ Ðñ$¸X=Ìdj³’ýƒÏßá#-LÄÿwv‡á_LÕÊëËß.Î8hõÄWê ÷GþNä§R‡Ñã þºj9qÌT˧ðDÑËC´Ÿ‚×/‰ôF蓹X—Ÿ§Xz{0ˆš‰j!ÿSÕâë©ñï½Lµ0wt~|R æW̆uÜ#ñG¿>BèXC 9§k ÃwÇ_ü¾Ôä8 Î`~Åpbl R0bØŸØ/z A  µ<8âßv»bRùëÇ omYøaÒ‡(Åðf,š…¿ƒõ;B±Ì/ƒY˜ŽhÿÙG2–ÈCKáAgiadþø¤¯°ø:‰ÔÀ¬Á1¶¤i剞˜VOüÝA¡Ñ¹ÏF=)0ô‹^¹’Ÿ_2´ße¼¹B H¿èÉÏ ýo §RüÊ[¡ '^ÿ•ãkéñr…ø¦¿ŒÌ‚±™ê#ðé¯]ú3è£TüÞßÏè¦8Ê6_½.!~FPê’€ƒ?SÈÖ‹'8O% F¯ƒYfLtãùÒÿ ?ܦG[ø4‡³¤ÀŸ)vjA[tÝœ§Èhʯƒ\vL~ã)ùæÿ‹Ö?õ±v'Â>ÍQ2 úgý&ÉDðÖ¸/{õ”ÿ"õ×Á/7&ȯ©ù– üv1?ZÆ·?Q¦9Jf Š÷óÑ%Sg,é×)‚ü˜'ò--øO¹üá®àsËÁÿ¹±°Ib±·‘ê%pÂMõ²<¶šñW€. “Ý—E•?3Û 4½Å K§dqÌTû…qSŠzüë@–“Ûg2¾ò¿åÌæGƒLoq"ÈÓîÆ­¦Øg«ƒ‡¶P;»yM!Ïi¿nĘ'Òò7žü?dôÇM}Ž¢ÿ¥í‰*0­á4Éï§©ÚØlrÁÑ÷ØÞö%¤ælÆBI°õô_ÂJð sØ/еAlŽ#œ¡.“iýQc¬ô-  ‰öÎ6ôãû´a Ð.8£Ýi‚ø»7—ic‰c’‚6£†yÜþ²¯q¥Ë’ˆv°ö×8)úš‚ñtFU.¬vŸO;®ß½÷Œ1ykâìüR鿆tÚæ…¶€²û"iV”/„1ùÑIn7”éÒïÞÙcWìgÝ‘ù¦;ÝC‹&@§‚ý— Ãp B¦äѵ,cí(ž&x¿{›Üøå#Ÿþ²K޾…,]ÇÆ †³™„9# ´+7/³_ƒ¸ìT a¦&þgª-HØ­®e¡ÏÚb`v8°‡øáûÊÕ¨JŽ_Yprù'¯Õ¶S£?eE4zBïlÀê'~iå,r넜 …ò ZN£³íVÐÁ Œm]cs¦öÎŽ6_OœN«ÿMÔí¯ÏØQ%ÝpV;M§ë8÷&'4ޱm3:ù·GÉùó"&†øøß:êJyÜú¹yÓ®ÄÎôÏÎMÉê—ï¨üç:Gß>3¹é霿{QÔdJÇp—˜ˆû/ÙTñ3™Â t~# S¢ÿmö4Ð#¸¸9ÛÑ?›ó=¦?öiÁi·~—aýÐʦQÐ]þ¹±ÿÛuTÓ¯DŒïMÚŽRð£ç«aßhËPÿµíý±ÂBç)NÓÁ2.ÿÂòmpc‡þ¸|eì¿ú<5ºÝƒôýHÄ~Áñi.ß½ýtìtY4˜s Ä?6Êÿüsb¿këÏ\ÿ$ȉÓuø…ËwZ¡:Mœp¾š‹äF9vºÚ/ÀI’ѧôGbŨyüÙi ývš@ûîЩzô´·¯Q“ú½P“‚PûŠÔ ÛgÞM'nßuBƒNaÔÝŒA&=²_³„be:ÍEö·°*YªqÔýH¬è'jM{„²ýè\5ÀöÜp.Dº{XþÛ?5ú*ÎKO«žBã¡=Èô,.nXè”zFìú‹ÉÒÓ_ÂÚ6"†ÛÇH6Îx¬ãK[öŒ9ƒ‰ßi8[NX<óE¶}þÛwG_Æöù¸/‹Ö¦'cë%ã›iÙŒo¬|Ö;3èö«­ ¦øÐ é4ø úcœÞš8{ð3C Œº¿ýÑ–qßw+8®ò±ÛqM|vˆ“VLïxÁÆÕË_·0¡j¡qFú}DMÏ6á¿¢ Ò*‰‰¼ŒR© SÄ:)»AŽ üýï¤Â @ø;d£<1ÃU}þ›á°ÆSñµ/û¢NŸÕGzò7&ªÓx-kŒAò„¦þ½ko¢Êú¸â~ ‹R?YpÊk‘dòn)-¥¥Pû´ «'™iM“L(¡èŠfÑ•uEVTÀ•\?A>‘\êjQ@|"lµ."/—"ýî½óÈL2IšGC¤™¥Mfæ¾Î¹ÿ{î9çžÃÞG39|ô:f²“Ð[°´‚ÎÍ!Á9·’KpáÉÎQ˜AWá×$ÓÉÇvÃÍ3¿XF´Úž!¡+jd@¨<¾´¾PÜóv SÂÒ¤C9þÜ «ÒïZÀ1‘85>è)`AgÃAšD¯™ˆ²]¦Ý^ jÁ€HXO@× N(tÂO$e£D‚‡a=±"¥:j$tßã]T ’ðXê¬ v¼òP2¤‡<Sc÷ÿL(’ÈC5™¨È0ÜÏãs†EEÝ!EXüA©¸§´WGÏÃZØM'Ø'Â@U)OUæ9&(ìf÷ö°SB¦µC#«·ÚÀ8ð=öÛ  ¢‹¦ —3£¶H9úãþ¼ TJŸØá£=^yHÚb$@ ©t ¾»bo*ÉÐýóíðaRSV°¥$Q•𣪠¬@ˈœ‰eÙÔs]ÿr…$\ ‡ÕL/RäÖxíö†8e\R mRPˆ\ ĉ¶D˜ ·Œ:W½Æ zª¨½_ 37[%)~Â#|lô+þBš¡—D²ªc]Æ xÌ Ê4æbÞÏ'˜(<]3í$L &ø§\0°¸üÍ8{ Àm<妄]f’HbV I“ ¥Ê¡Ê¡r¼wÖsÊSÚ ^0SÈ·9"Õ9Qy„ÙóØBåry^ª.+ü í‹ $r¦bŸ÷2ó4xhªN¤¢O”}/^I:êã;‚4s¼$­ë”ªö;Á¥Ò*“VA¤êbÓŽˆ)+u_^O-UÔºÙ `⼄,­ < #‚_y0ÖáaÔ%12ˆ ©„” –+^i´ FK©`ú) Dý,n‡>d”¾Ì*1z_|D(Ñ »¢£ ñê;¢VòŠÒ„ð°®—„uö)ä¿SAz|ÉQÂ@97 )ã Ëu+|[Òð¾ù´8) Ý–x ;.Þëȶ$²ÕQŸÅõç}à}‚qI¼†À ¬cMu¦Ñ8¦F' OI¬èL¦Ñ9$:3¹MRšÉx 9F–cNív6“IÁæ¨cZø/ñج”6"Â+·Õt.lŽ5×TlFã˜BØœ€Da1›%ÓØ›™äb)‹Í5ñ`sŒ,×qØ\“lŽÚµ# ÐÒ^üs0V§Béø‡…Ákÿ°¦h'4'\¬ðmsLKxH¤ŽKYç(#ŽÇÍ…‡è gIQ_GC‚Ï_Ï«®CD ÝL2úN…äÐ{A'á½@JÙ@À·Ñc ávlýK„O,+Õ!°Žê¢4G»Q:&žëH†>“ÒœPDŽ:  înªÎ“,Ù‡IăŸjPv¤KeÐNýÃ*‘OîEDî8X°#0œò$ãöWfX¢šrx®~ÒËÌCØm ½•àŸDHXf4$8‰¹¹ÙÑL!ÜŽ§£ Àì4b‡Fl–©‹×q¡uŒ×H § ÔQ‡6b8a"›sƒ‡ê,I¨æëtþ{f©’0pã!ÁLÜ­ˆ€Íi Av¼ÝM;ñu(lótH]àŽË‹/…ÕØ u賺s™ù‚ðîlH|ïöc¯¥”›€9pùJ5N»ÝYºÂ“ ‘^Ø »-ܬV+H=®pPõ&“ÇVgâòD¬#DÛø¼ÏžB¡É"”L*ÈR¢d‹Ë%](¸ÁyEͶ‚‘´Íëtdä"[yè;\Ò cec(cÅHpÛSGØí¹ãø#V~ò]nL¥ÃpM¶:+×a*%®DC ˜ã¹37°3ŒÏGn¥iW¶BQ__/‡ë%j¹Ó]«°9Hj:Ûön9¶ºZÌã¶ðýet9À‚IØéQ™ì7™\‚:IÂEP0ãcâr\ø€éøŠé,d ³“l€¿a¹Ýº¤¯+ÿ‘›9”®TtDð˜¹^«…¿q½V‰>ã úÍ^]p\­Ñjtz=ŽwQâ*­FÝÓvDc/¯‡&À^µK­ÓYÓö9°’%£AɽÄôÇS‡þš4ý“q‰é¯JúkÓôOÆ%¦¿:uè¯KÓ?—˜þšÔ¡¿>Mÿd\ôvÀå‚Å^$°Ž¡·ýU*µR é¯Óª•­NèØÐ_™¸n†¾:9ýsV'WŽÅÆËJ±Ê cJ‹ °Ì ÅDuBQh,dnhäJ3º ‡ÇU„]¡[÷¥h¯˜c¥27§Ž¢ÁžìfGPS½¶i£2áÑFÊA06¸ :–ù4*“¦¦ÓˆëFZ¬„ÛCÑ£lçƒA›5‡eÒ6ÚN劶ÍÙX SbH9QEÕPnÊŒ ×  Âq¿X9Àn–-” Ò>*íì=VŠ¢314Žm|m€QwØí0Ôcû7ûæ¬)ŽÝI£T’¤m§™˜ŠöíBÝ&û¨I|ÒE˜èÖæ`T•D-c¥} ÿ¶ÕZã¶X95 ¦ŒñÜ­vD8Nö+¸ R›‡nWHûþ íëlŠAOp˜$„žvÃd* nG4e¸Àøs%TQv8.~°Ù0¥!×ãAñÙ‚ù<$6‚°U¾É˜1DOÚVÊm£%ž@Ûìè…2RK¨dr‰d Nó‰#Ç0¿²i ?}f™ÓMÉårØ/F‰ £ºådƒ—a0Åiø©J¡*ÖR‘‡šÔx0³iŽÕĆÛC=%Àˆa¤¨uuœÒLþ<œc¡ Þ37H¦Ë—„™ ¾g2±ci2²]VFc&P=`¯#\``à-®SxŽU¶ [Š…Ê5¶uÝrÀs¬5¬}eBkš›"‚ÄhUÒ}‚<À 0汽ܔ…† ºh¥ÒÊ 2< ü4lƒ¬º •ÙA¬pÌ*=U™¹wRƒ•°–¢YKˆhrÁ.šì@=)˜¢Sr°(ÿ8ívŒ0›h4V¢šÁ„HL& ¨#2E• ½Äè3oûÉ)nqX‚F.2ÑÔdÄU€”¸Le0È\Iˆ´Å!˜D ¹D­?YªËÀ%9Á#j`¬Ç4Ã¥†ó…y„¹;œ%ÍJaŒ¶¹\FcQÒaÖÊ u n£¼ÄVUn¥×l·Y0(ÎxP\©÷XÃ^t©¯)‡·K|ÆçðaFëÕ™¹u‰Ñâ8Ë1ç—¡± …aJX6̹* ócá—ìçò’òЉåð‹nØ,ÁÄ•Z”ƒ‰YÕ,øÎé¾?dŽñÐ È^œ`Z%›L„2D`6뢙PΣ†%Š$°p·×V.Š q‚œBÉ€«®ç(ü­‹› ÃŽ«ÔsÀ ˜_ò ¸ƒèÉÈO´;" \wv°TÆÆ8åÝP“nI'?èIPëú'ŒÖ…Gêà$ìq‘FâNú€@€ ›à1ó¡ÆVëu‹²µsŒÎD€¤Z·ˆžÒ9ͽâáMÁ¬p.˜!ª˜!—…`eáÂU3d_šFbå/t 6ÉÁ77ƘŸ0WBu„Ô :rl‡Ðýñ•Åpļ`Ã(¢ :™×îs- Æ•µžƒ5M ¬ÁT(Ùß’Ã+¸% iU`2*&‚=X´X9ìAí\nÛ4°¹ÇêLPú F<¡w è3Øþ}3r P¢/(èiqÛ\ŒÛ ¸Ñ-š½9³õ¶2ò‹pÍEÄÀüÈŒ t˜ŠBrF»c¾0œjñS$˜ 5®<ÌÈC“t'IáÈ'(ï|&íÜìܘ‘7e="E¤‘¥œO›TÌ{¡½#8Bp Ø•E…gêèðŒ“=øð(Ò¡™œqå¡YPñè$Ê:HLDH@¶¸4&bbl"1zµšÛ(ø PaÌ U•F“±¢dl¹i|~yaéØ*ÖÀ$ pÑ¢\)6ÚSï<6’’àd—Û ½ŸMàEí¼Ÿr¤nnr?ƒ…@^6a›|ò+Ä„câÏM휙ƒAŒy¼'¢Ãh¸Àò‡}v#…‘€ÑqñÒ õuˆb‡µo"è‚÷þX$æqÖy´Ÿq¤Ànyÿƒ©ñ‹’ù5ê 7éA%0ZPQ^Tc.5ø¬ *°ƒOªd¥OªtÞKìÿ§½¼þŸ:½R þ†þŸê´ÿoR®@úû! º†:A^> áý?q¥^§æý?Õð¾J‰Î¤ý?;þúùørK¢/åV Éi'дèeqm'S‚'œ&™Ï K80Âì¡Ý@6ØŠ,l6%+Øw@9=§º…;ª$TDD¨|Q“¤’…ñ·™t±¸ˆNõ:é‘ÕÄx—Mne>°ûÔjɧÃôD« qán7é)j»a¨BäPT-»ïb*%)°Í&¿>4ÈÒd 똥 kÂ,УÓbíŠ(]£À1„¿a˜÷$]Á*®Î °~€jƒ WfÉ€ü%ÃÕÚ°†€@¥ tˆ—&“Ù[8=B5ê, ªF«ÉŠX ¾ äÐgÝ¡ ®”áZPZ-à º°è6uvgm„ÒµYÌ(é•úöŒ’R¥ ­p+¡X½Ö ÿ *½Ì  rÂDŒl„ÛZ†u=Vg½‡U "ÀÅH,ÏÞ€¦XÆ}âfÚ×Dr´5P5ˆµÁŠ¿á‹1²8÷ªäƒÉ¨˜Œ\æÃöp»N)S#ïèð\æžr\øÍºtE:ƒV8Ñ`PÊtÊHÜ®¡Bu&R-ì¬2èó«ÃwW$¨sˆ®6ƒJ¦Òá Sªˆ¾Èj°0¤"}„Ãz5êŽN™±;0ѲÂw'|]êŒN­ èŒ`ò:)ƒ©¥=UÄKÕ8'§Óg#™Â%ŠQ²Ó2InËHšJ´Ç2#²$ØY(1²LÂ<þx©Ìê´#°°&¡UFèeW¤¥­„»$¥¾üÊm"ßK[ÁP¤/.ÛFl"EÏ ìÜ9%¦Mdì´3Ûî×£Û£ÑÆ]ÎÌ@ÐÁZJî¾ÜHOpg•0ZZ¢qw‚WÁ‹[§”ã^+Û ñ;P+x­ú.·±Á…PÊföÂݧñK±:]p…'#ÒX½Ín‡6AЗ¯]†'±‰ÅÆñŒX~ùdlb~UU~¹qòHd‹u‚»Ô4Ö¿ÅVç²ÃØTõ„ìïéˆPec« ƃçóÇ—'Cñ¢¨ØX>¶º+ª¨Âò±Êü*cqÁ„Òü*¬rBUeEõX9fä` ÙL¸ÆC»†ÝÖ}¨Ã Dq7F`cª 5wKŽUSŒY¡ÀéjàTô³’~·h5ƒ†f~@8õ?ЀŔ†L5”»Î#O°¶\—­½Ââ:‰ôZ"UÎÿëTÊ´þ7—˜þæÔ¡?ž¦2.±þ_—*ô×jÓôOÊ%žÿ–T¡¿N¥JÓ?—xþëS…þZmšþI¹Ä󟼬ôש4: ÎOÒæ¿ËQ]üÿp-˜ìó_­Lûÿ%åúCeù¸Ý~ ¿GñøÂª.]®nßõjðÿ+=O}~ÝVYj{©­­wïÞ+W®ìÓÇõúë¯755-]º4//¯±±±¥¥Åd2õïß<ÛÖÖ¶û›U›Á_WÑUåÕ]F½È7þP\˜oœþüñÅ;Ü_mÈØzkè>Áñ¥eÐ=[ß·­°ß:tӒ׿o³¿º{ĶUu§žÙ·}Á¬â§/ú#½máˆ3+dÛþ<ö’]ذپ›ò3°² m¯•œ¾Úî:_}5vfvÑÏ­­3u¹ýµžkÏŽiÞ×=ã~Eáªv؇ýe?Ý^ySFý„BÙgg¶®žç\Ð| WFÉ#¾MÃ3þ*£~b¡¬Oæ·«}“T…û§×4北›{ ‚>8×¶ã³­Xo»ã¹ßÈþÞõ¬½'îʇufLzfUVïÚwöÛº¨Ñ»eÒé·dÔ›ºÞü`oOó'ËK–žÿËÃ3ñÌÝ£»Þœ?¥Vã][¼sú”œÑÍÙ¾7zí¥ÃÛfÏ9ÿÖ…5Ïlî[ðؾ"øí[²â‡}›d¿è^¸jݵ2ùíO h½þ½£gfÜÔ¤9,½ô-/j¾Õè{†ù=ç–î÷MéµÑuÃQóÁ.»gȸÑÿïé=Þ°xJ­[üGÓC«ç-XñÌu“26dÍ6/^67ï—M×ÌÕCªž“m~¥÷jŸnÅž1Í›| VüiÞÞ’ÜÁ}®)î>×WŸ1¬lÀ kϸìyRž¹|Ø ggüóTá`æÑÊ]û÷M¸+£â§3G6üªF•ÿÀ’Ý>EÑÒó¦çÚ¶æ]\5óywNû3õùIùAßâugö|ý.%7Ïü[–ùƒ/¯5mղ鑦ŒÖ-rßÄCÇ3å»oë½öFµ¾p¸àÞÞþΚ¬Ø„í[˜3kýÎçÿuñ[û_/Ys|ÜQó‘ùy²K¯~ÑõËïz?1Ó]1oùÌwÉü#ÝK¾øÎ´pÏÎG.:séÃr5ˇµ6oZ>ólÛ—ô»ýûþö%@þÙ¥·œü¦åØ‚ƒv¬óôxçæewé×gö=i~ucÞ^mÜ—w^]Þ§uÝÇË>ηýúF׋[~:·Ç~ÈzðâÙ&Si­iÑü!#øîRÞ·oÜ0ð/·zVœÞv»©yû“×µž¿ø`îöc]Nž<سgÞÎ_<ºú‹- ¦‡ÈiìþÎæÏó\–á¯f¼Òïë©·M;³² >ܵuÕ1ïÕÍ®óÿ)¹sLÿùŸ­îµjͬ'Þ4~è“>eŸ]¨®Íi]¡)Ú¯¿æÌ–moþnŸëœý›Ý|u¿ëƒœ»tÚèEkïÊöÀrÜyßöÇ7·|þc{ÅÙsU¾Ï¾üqݧ –?²xøú?ÎÖÿæïw{/z¥OëVS¢ýÆ9çW.Y¨:?¥ï® çÏ9 5½¬»^\ýøÞ¹­Ýõéb•eÚ¤Þà Žeïü¦¤íƒç?hÎÚ‘¹äîïomYänÞÿجCç—þiw.qÏÅ®ËçÌl’qÿñ-s¾zâ_âß½pÚ»rûÞçÌs}“§<@ÈÓf-~ê¨Ì|èâ¼=[úáŸlÙl1ˆ)9³fÜëÛ:ôíŸþ¼v‰h<ñöÌɽo˜6nû‘ÖÁê_zOŽÜzøÞ¿.•;¯ÿ¯G4­~µÿ£‚½ÅÓÛWÿíï ´ÞqCSKÓÌ“.m»ûðö>ö¾í­úœù³ÿV»tsñÿ¾tüˆoé¥ÞØfWîÜzÇç/÷<±âÑeÿxôÌè~›ï=öÔ{Ólß¾×½ôªY¹öÅkŸýlûÑ~{²šWÚMM÷_¾mÿ¢5ËÔ?õ)¦fþ£izóGŸŒj¾ãÏ5jrŠnßµö¦hz¶ì¶=¯ŸttæÔ†òåcšï~è‹æ‘/¿Ê\qlãúß<»þ¦÷Ÿ»où gäÏþÔwÍý¬‡&óþŸwêˆw_¹yj¯–[úݳaÙÆc_ßy£{ÍýSÚ&dž}ù«å_N¹~ÿ’C¶¼øÄ€¡ûîþ}ëU Õÿ³w%ðPnïÿ*¹–êšÈr£ÆPŠÁì3ZìKö²'d0Æ>#Å6ÆZ*K¨”R٢Ŗ(†$[в\Õ .…%¥ßûŽVÙºuo¿ßÿßûË|Îûžç=çù¾ÏyÏyÎ÷y,öx™ä{DÖvðìÈ g“³î‹£p@¡”ó-׳ØCêæ3c¾-ƒnù%£.ùî¹:\ÍwKót–6Z³·‹ö9ÕïÚX¬êMÑ}.œñ²#vO­|ÑQøÃeµò]rŽ‘lXÚú»·Öë7f5s¬+RPUé&¥!iÅ;ÈöþÙ‡Z,×™Éû*sD¢3†nK¿N:lrž —îr÷ ÙÅØiuüÀ—ËŒ¼{#°=æv(Û²ð¢Œ0ªgGô†«û;8ú|ÞÎ ÉC–Ÿï7Ô7Ïä[òò–¦†VrL€èéŒ^Åû¶‹åÊëzÍä‚û µ”ŸZ³ìÏ̉u®J·éËñæ¸Î³–Ôc%~š‘ÑÈ·sžæÚ§Ç.%ô¨oo,‡Ų̈E t\:Šº–®+3¼F"ë]fï…]ۣⒶ1*SíHþä——ÑÍ­µTm Œ%ŽtÇû…ÇsޱŠCÛv®ìX‰ŠÝÉX£d“M³}T<,Hç¡/ÆXñ›\Ri²÷3T³É.ô[È;Ú±òLØcñ €dµÓiMí§ŒÅ dEí³Šš%±Ž¹l¶'R$ëN gÄ@JÓ”Èo74ô©'óDGG´Î >”âÄ•þÛÜ‹;Og9•í·3:PÏ/#Ö–m¤wTTØ4‡d£&íUu£ÈÚ0þ„ ã’Btæ©}¦Ö ­1>ñUz·¤l“3#â9*‹G1Üm\ûˈZÍû½ ãB ç*±’z'1ê—éÖ޹ííS\Þ7´žšÃÝ*®‹rf÷( +jbÝÝ´È¡¼»¯xÝSÿŠÍ>˜ {cRö’,ÙoUCW˜žvŸW}¯Æc‚NwRØó¸6v¦¨wJ#޲Îs”:×:^Æ•!:? kã…Å$×@qÎwÑI‰{鹜wNÈÍ·z*ç˜\m|`qÜ=à.bÞ*Ó{^ÞLCd‹7LñxÖC RyUâÙULõíæ{¾4=^WôäRt´eˆî+†äÃ1ÆQ%Ù~,¸¾ž’R©uoXÕáxXÍ~Ïg:ö…W¢-7‰ç4޿РT«‹x:œ,>’÷K¯êé^ÇǯžtÎí,ë|Hµ‘íÓ¼?5rórBÙ_E—µ·j•«îïx³¶©¡ývˆ×ÝÄ}n±²7™kÚ¼ý©¥‘Õ µ×){O_ ZˆHN€ìy긭l]•ÑúpŠl˹&+ëuõ»¢L½VÄÊvyl¯ðËOx^’ŸI lV_ûtó²ÚûE zþ£;Åß ÞÄ‹ »ß³ìßzò±°8yµÀ—DÅß·çn‘—å¼Q>&¶tx÷Ñö¢²H«€B‰‚5˜üßF=æÁÏåoS`®Œí¹ûTaYñ²¢5ŠÙÚ»Þ p-Ð{v”¶âÍÃ×OBþÆyÆŠñ”£åyR1atŒ?§¯Iv陨û² mõ‡]%Oô B{…Ùl—l_TëÖêÞ³5«ç7ß“/²àAŠú;Og%94iЛ¤ZÂýâ¡ ½›vTËÚ—h³§I¼ pŠª«cïëthš›ª§Mò½mõLlhkkû%çŘê\ž’œ7˜±ÿ1UŽÑëW¶ >Ú—µnô‘7Rdó½'÷æCJ+ åöæýåZ}ª#ž8‡í¨¦ÿ­½Ã'ÜS«€Úú¤j¤nh¡ËÄÊ«0 ð­|¾ˆî'xš×ý…mLø¶ð!¹çÖŽ„ß¶®Š´*ÒÛž}ãJœ•2·gý“ÂKíLùaf±ÔȺJ÷™uo”à“ ¸—Á”Ê­mÕ·éÇe}øn½äáÕ¬–‰™ßÝ’|{L(ç¯C*ó¯E>a¬È·¸[Ö[ÈŸ}û+­?TêÅõ0¾‚¼æŽ¹sœE‘ìUIÊv1¹ú|ôãê=+Nô?†Y÷Û§+»Œ¨Ë]¿[€¶çeW¤èèuß±®ßKêNXgɉ؛ýÒvï^ÐàdšÖ³·u°ÝD†L·3 ®¿ö* Æ1î¶ì„fÆÜÜñJôHEÚ>K1fs#÷Å<[Ù¾š€•çc!MΚhbèêI›´—é%oµ×ÎÖ5¦ìZ ^ð¶´—?߉º¨jÙ7±Nìµ Û/ÅÙ]ÑÈñtu™§ÂðÚCW¶BÏ˹4gù~!”—2U£ÂØ|G€)•ÌÅ4I.²eT§TvYizßß[Õµ,D5º,Ö±ÏÄ.ÔÙFؽˆÆæYr8ž$âðhyñëž>Â[Ù<½ÖÚ&‡'n¿”—º@Äš÷vœ Žæ¥h‹ÛvVxÞÑÈè+³]ÉÞ.ÜUÍ™kjžù ¯ –n­1Ö?¶³AOÌvHêþZ§á(Ó¦¸? S0BhÏ–Ù¤!ô(ÇåQ¶½]sÖZ‰ý¯j7q2›¸$ at!ûŽÞÅrgÄÚH¼äóR¶6…EƒOÈ¿:• @²¢8à0Û EKbƒ‡ƒÅyPí2SŠóV5òqÐa½ê[w(»*Ø]ËÐãË¡Ê,a7« ÜJÓt^úúõ ò#¬xÍÖöº1~>Å* ÝÒ¥¶|Ðs-1Á´ö} ÔÃÛ.\<|¥¬ßO©0GÒQ¸lá³·J€ÝwßCÎ:A™±):xøô5 ›íöAL¸ä|^ÍÖ0^Õôí.d´Ÿôx%‘þG¨Ëšã#æÎÍ>lAÈ=)yõámö=tÅxSçB‹]"ýÏ/¸· ǵþ2çmKHÅóÅÜÝç2á $]ŠM ã–­T½mÈÛ­ïà‹ ©‚µN„çÌnúÌÍO¹¯ œ€éKÕFÜT,ð𥭹ϖ i(ëpŠðõô'ÖnU¦@‡Y‰]({bë`IWuU·j>6@žsæ Õ±žo 1¡Ä›­Ì'ãŒ(…¨†­&‡qÞc’nomOR_ppiÜó.Yò#šxôÙ´¢«––fëÖ<î1ͺ®mpM‹Âuè u-Ÿ5~ƒ5v½Âäëá )ÚÐjiÍD#C³ÄH›á¼¡§¶­#i!Ñ­sLÙë ½ònðä¾ú3#ÕfªZ¢¸šO±`ñZá&Qìs_%$ÌM{‰›åå$‘ô%£šb6Ú)vÇžJ_rSè“K)SñÁ< D[gÃBßM:z懆a¤6æBÒ¸«î8å-nè&ؚ܊°X0Wn“¨f:¼(^c/í.$Ç0eA{¦¸ézÁò#šéþ”Õ7#RGé ‹â/æì3'îlvÂ’êAš^o95×Ö¾ÐĪQÞròWà_õx¨éKÓM‡¦œä±¥ŽPë9²UÊCŸâ–ÿÁ›6êU×ßm.Îè6§&d›Ò£±««Íå•R²èÆùÙç¹óKÃiªééY½²vox¥%2êy³¥4­7/Kíy ßh3½Óˆ]¥+iǹ[­+Ä|qµô¬Æz¢”Zk8ÿ¥‚{î×y˜nQ%zžØ*?n»„ƒ%üô<äªø§RöºÜ|P&Ç)v/!Xÿ %F„öØ=·ÖòK4e­–*mõåàáç¥Ýu±¶õb0·ÍÚ•.‹2âˆB¾j­©üºËu^t7ízõ,J¬è7f£83F‚°äD'·ªPT˜rá¶æfൊÏ\IÈY‰R]N.¯Tgdhst>;½sûÁÇ2ΦÁÀ ¨Zëù‚ÁÉ-6)…BbhCü£?u _Ú ([­2cSŽ ýnm X­ë—géÁͨ0Öç  ’]Ú2+F?¸É”ƒÅ¡f”ó€—c8¨ª%Èÿ¨P$`¼AOeP¾"LÀG ñU!¾¼lªð¸‰ÔðQŽü`¦Õ™+‘×DÚù,Âl q,º9À7Š0½eùv¦>¸i ä¶fÚ„/"~´Æ3Él‰c姃œV€æ IödWòÌbÀ½_xà¡"°òÚͤ Âbh³ƒ¬>Ђ<¨«™t„Â!æã¦©™5 c – ˜^G¬œsey“ܼg@E åUô¹å˜Ôð¡Ñ_ÚJ¤Ú9ÙƒûëflŽA¢6aàôô¢€Wû/ƹêG¡p 0„ÀxŠ‘Ÿ>ªÐ,iRK5“àæ±¤ÑÀóƒý ÒÓÄ…Þf0ØÉíâϘßâÛ&8ß?Äû˜ºnަkޓĘÍmÿ¸Øÿ]sП¡~†~øî¡<ÆïöY” Í‘ÌJ,@´'z|šìáJ-~wØ,¢›‹7h±Ü]‰ÞPà%Ì‘LP3)ö¨¬³d]>œ¥ä`G–µ Ü”EжLò:̈èæèN#zÙO*ÁÃû}±ðÉPIvNãõOQð!åò÷ „AXú?ãÿéñ9ÿ—ðßÃÿEÿäþÇçþ?ÒÔ? ~ ‡ÇŒóÿ±?õÿoõÿÅ;Üzwªkmüﻀ§÷ÿb‘8äGÿ/gÅÿF ~úÿãÇÿ; (¡ã“²ŸàŸàâž$ó>ψõNú$§¾úìd²›É‹Lp¾1è0fù X×lðr÷!ƒóú=9q¥b|ÖÈrsE'¢˜óÊB¡ÜÇýKù½¯Ž\¢ï¼¡¬ö®æ}DÖ´òÝ”cbïMë¸À”£¸pË’³e Ë}2µ\‹Å䦯ã£?ãÓÛgÕ<…ƒcÖÕNµ–ŠÆÙ¸OP2Ý‚'ŽFà ;sÈ]Ä»N´›¹^0®5‰ÃÂQÄ«¨å ïf¦(˜ÂfWÀxìH¢¾ËXöÙó và 0¼ïÕø8VkåÀª>v¯ª;…BT8ž ê[°vïtر$Í ¢œ= 1¹†Ç+øˆšÏo}ZÜ̪֩ü$3¯ÙM…$è$GÊãáÀ«Úôî˜oÃ&@%‹ŠãpÓ{æ@ñïÑ T?-6Q 6Áò¨€Í‰kÅÀƒ…’Ÿa2ã9ßKà°ÊZ³¥P ïKþŸÁš-…lÇ÷;û¾=¥ùûgzõ¤CìÄÄæ“*åEòÏDÉý½³˜f‰ƒM¤õ³ò[†oôwó—|L¥- èÑøg‚üžAÎ 8”•ù´5î4ª1˜¥–äE¿N,&`˜íOŠÖ{/ÝÆPpúIeýÿñ†üaxûÞ}ø½à«º®¾®ž~í%QzË%Ê—«¶D.OºBžêƆÆ… ò/Üq\O0I·¤õ­¦ °AÃ}‚‡£¤£áH|Z«Ê¿#­ŠÏ-‘õT¡—H(àÎke@Dâ‹ä‹è€}kcÔ1jeå± £ Æ&É`&ªE#aÌií±‚FîbÔ`²Ê¬e~b¬I(oÝC9íÊ]9½&üIŸƒAc&eÜEç3 Ù†.)7Æ­‰ ÀOMdTÉß,ƒŽ`S j짨Nõ”ËPÍ—´êb™FàAI6Õø¶˜Íw(ËáÙõH´÷>üïàÑ–T‰ïØ?›cµÏ»TÑÎS›ç¼:ŸX$ås‘°—¶uû̈¥á!|i¸8T¥[ˆTÅè t«(nŸXs*§ e-YüZ‹c*K埚âÙц`Ú jQï­POyÁî#½v€J‹¡qÝÊ!¢6\ÆCÔÔsüéAâtP¨w»í`B}sÚÄ÷ß C7О7Lã> Ó¡iw|‡„UÉ·7ÀªÑ#Í#¡w+°å±~ÿ ¨Áߨ´Füé¡Vó&ìjwS#ŒV!©|=Z;|óPJƒûâ#Lu8nâu°èÄ{ð‘¨Óô!Ÿ÷áÍ+Á–Ucæ@ŠêÂ]S‡ÅgÂ(:{•%Ð Ø+Á|RZä}ëIl£M‹¹ï‡¹º§qÑg>p¤e¶hÁÿ7°#åO£R F±óŸIZù·Ç¥*\Ö6äýìï/Dòþ¼_àæÏ&Ñ)dšâüg*!ç?“‘óßµç?·ýõñœÿ,N`z)D"µ €µÇ? €›ÓHµ€‘=6ÚGF«È$=®@¦…a|ñ›S.ÁpM‚šÎW\‘šÔ‡óÊo½gÚ_Ôaüæ4¹B©ƒ(ËÍ ?ô6£§øâ¦¿}f\œ0š=ÔžAM¯»·Mc‰#¦!‰e;æåÔøònQfN\—Z”šSM9µ§ôR†ñ8øôŒ<„oÌÎIF²s¢™ßtÚ0DÑÀ‡7æýc¢©…é*©…›ÉúÇ€¹ÎÔÄumÞ¿÷ß¶ý‡ë[+åýC¡YiDëÆ7Ð$ÿßÛ4¿Ãòÿ}o mÒ?mÒ¿¶Iú7K®j Z®.ߟD%) >Ýß$;À…3GÀFJ‚…üyjuŽÇAïÁêd'Á²ð5ýM¡W¾á¡RqxÜ-_` ܘ9j+•ÈŸbÁ RT«î×6ÊìG·§P´+©ŸÍ¥´þCã|(ë¿42¨]ÿkKYþŽüÉZù·Ç¥,î‡#mþÏv¹”åÏë`ÿBI¨üA­ÿ¯].Uù7.fˆyb•µ£Þ»Iä þ‰Š“?‰†æÿ¤ió¶ËHa2¨…rùˆ3þ†H+HæpxÝ>íÕ¶W‹ìŸöN4Þ`ÿDVÆ2‰¦õÿ¶ÏÀ‘ !µˆ¿Jlˆ,ˆÄ5¤á4ñÛŠEBù=2˜Db2™2hòbÔa<.]M1N(EPI$"€èÈb¾¼,4ŒÇqe‘Å aùÒ=@£Òˆd0@:‘L¡Ë‹ÂêËWGš'H9Bm2bÀÄiD$/M‚5_Ci WÌ—òÅ)L$1ˆ÷œ¢¨€©b:Š Düi¬éŒo:î9W]Y‰TÌç„àH3ˆð°&M"’Šâ\¸çj™Žx³q´™D ¦ÁŸ†¼0òá #¾àðP.,Ù(mD„@*@YQA\Ÿé*eá¢dH‰,•FAÉR™$yQpÇk"l¥ N!© &À€?!Âu›‡çO"h$K!i @T‘F%ËËð‡ñHÔ&d±’ô *\pÓi4:N?ùªôü‘<_8«á4€‚PgRp-…ÈM¨bàÚhN fN &¾‹Œ&ÃUšK!2™l$X1Éd‹•Ô+,EVEEâyJ—$Sa“©ð:„³)¨i~¨DI@T¡ ëùB¥ã„BiR>‚#åóðî8̨@:³*ÉÄÙ%?_C¸ŠAD¥ Û¤B©i°AñUK©Šª¡,Ö*|YÕˆYÃädA¸±2¬\4@\cÁµEUhÓ*€ç»ªð˜ªï_“@&*Ø aä)$§Õ žÍrÉÉ1ID&++ Ç$&Þ_Ü(œ6ƒ ™Œª3R™Ú5ÕOòjÉø/,4èh4?þ£‘)7ÿ£#ã?: ÒŽÿÚãJðòt36ü±ncw¶‹ŽN'7ý-;Á¿éøþäåáçúº¾ÞÍÍ­wï°züüüÍ›7;99EEE]½zÕßßßÒÒ~°¾¾~ƒñ $NTWêãé«ÃºU¨£踻Œô››v?olê_´œêËþ7<ÿ¿ßÍÑwexåÙ¾“®˜ý£ý"AŤŸöŠ+üÑtœ8T°ÎvAzÙí]Éæ>'¶ôJÇ™?󧹘Àоy¥O瘨©‰‘‹+Q'¾`ëm¬GÜûº8Ê(¯Ë ûý¬å,£ ƒìÆÚ%E¼Üî/ÎÝê”ðÀÏNvNqoCZÒ¯±=Ù¾Þ>ú\»Î§ÞØÏúw „L‚~ŠÿÈïÒφ_ý$%>_®·}úŽºgÂÓÏN½Wrõñfýö€W¶e‰wÖe§~ŒËJ?ûäUDU郿/ÆGT}[tµþÑÌ…s%OŽ—/M{YóêÖ£ª…öQ5ϧ^Luz8c–ÙNÓΗ:Å/ÜÀ:¿“˜µÆnÌôЉWÇw9]X(‡.åÿGÍ(ä i¨¡~¸“0|âè"+bÇ&&ÅVÏ9TY}(â¡£¬6¢>|†sÒ …CM¦B›ísò&ÏfG½ž³1ôWw´påèþ+ô“&pCÝ%ìyŒÈùâ—ÖÕÅ™‡(cJ–Ý{gì%L7Ò¿ó­ß˜½ß·]ÊÞ¾8ù‚»åÕ+‘^F{œ¾–ýkoŸ|Ñ=þÞÔ®w¦¼´sÍ¢+‹¦—¨&‰ºwª+%5ž··­ŸUù·ì„QeîšÚ«Q{¹Þ{ðûž«¿ÃŒ„¿ý:€’¿w‰g+¢ºo6«¨dÌîzì†÷aßy/ ‹W‹ûýhÃ:Æ*žB y¸›ûSÙ”Ü:ï…×Wؘ“v Òe³‡õ^›uMúõ僳Y[Kž=uNì>óï²s £œ#Ós·:¤°ÖîËŠvv2š<Äž+ºõÊü+³M;}‹V™”ôúÁfiLìü›CΆžò÷z*®ñ&±—<”½n=äúg¯ßG-8¹ö#gì/}jqo¢ûL¼Ç4™4 •lda+Lö™òßskø¿¯d?™š ¤¸;çtŽÇ뙡#{´ºç9É®{e_›<ûþL^ú¿,ÑI›PvçíÛ5dŠnL¬uV¦¤€Álqþ”Æ £„­Oõ£‡‡ŒžüOÅIÄhÓË=L¦Åm¨Šu)Y®¿Ü#ÄðöC «ó tÜâ -?Ù%!ÎôÆãÈm³b\¤§‹ lÒòoD»„Dz’÷¸î‹w)OrB7 ôõ-ì?‘}t¹Ù—„½ngX)¿Œ«s‰²ÖJæÎÎdçÃíøGrFõ`Âf­­Õë:6ö!õhÚwçTï==h>;9ÕrÅeú䨈K7º3 ÇΛÔÉôž;ˆÙ¬uOÒ†Êâ–g¯)ÔëêšívÒÄÆ+ÓÅ(!Ûù[àºÁ`Êž '[iÆ*r¶]ϵ‰}o™$ü¹t?Ôïö™'»=_LÍ9§kã‘ébØÕ 6ôüàÍ?§EŽ‘Ym`+±vv{ýìúÎýßÎ~]w}Z\¢‡UÞù©eÀÒšˆXÙ²©Æ+WÌœ{ûÌå?êî÷œzQàžÄ!ø²çp$‡dXý`íäôUÐ=if4á8{›,§Ê8èá_Î+-ÍíÉÓÌÈr2L2´¶)£ÉŸ²w¹‰™?m{Ý·®¸êâêÑî>ÂøÎf•çÍõOß}»ªànÆæ„oFÿ{TÀÒ«#®sô»2÷g·ž»j^4´>>ÒÐÇÆ{¤s^Õ])¹ü–›cϧW@\öâ5ãî˜1k…›3úƒ?Û@û‚3!WœKÜ?7ñ` ‘àŸ…»®Êê¾5\•uMÝÙ:ç‰å*ÿ}{Yw3ÙÝé1LwǾá2çì£îÀÑ-»_¬:¾'Ýn/¨[Y­'8ó]7ƒ ohÎ÷*¦#‹¿J›vp ?Ž(½ù°fŒ‹×"Í‹ ~þ£ÿÒýóF[MÝh‘ÿxƒ)á¢Í¨§Ò¸¡¿WØýøŠonDŽŸôgÕß.®ô6«èiv²l`lNíå=×>ý—ã@Ê–ã}•/B!3­ŠN§Þíî[&3èbkl×»Fƒ»$  Å$ëÝH-cwy9TöÅö‘Á]xzÿõaÜê³Ï'Y¶¬Ká1=Á²»#®µ/Ç b¼…¹Óaç¥ou{~M206e .³Xín÷àrõ4žìŒC??+ïð\ß³‡¦›w5Ù6"·¸tãú˜u=a™G³-¦ólñL²Ñ!<}4´?{qêNß™3ºƧ Zy¤ˆfžû'µÿ’¥T¸+¦þ+Éb¯xòTƒ_FÜ³åŠ LK–E'—-Ü ‘rÂ2š^Þw®zå nLrš=Á‰QÀ1ÂbrÕ†u„ÛùÛ£}q|ƒ H(,¦Þ¹_^û$¯VúrçØšª¼Þ×KcÍ_>ËàÈ’t—ÍI)…È9Y/ž]:p/¾åë_Ÿ?®»3ÖúXu°äué RÒ¢~?åîÖ/¹V±‰|'óÙËùÖ½,K…¡3ú˜:ûfé ºûónOÜ=þ€Sè…C•W ú1G±¯%J €CÆ’_FðKÆÖøæ•ŽCÝ…ž}ÍŽm ôŽÚÎ@(ÛÞ#x_pÿÒÓÂÌÄJ°-kqVe­tdî+Ë‹‚Ü †6ë»däüeM¸[Üe}?£Â~>Ñö’%T™u´Øu™srNz*,Oö?{Üò¿{ßg'Æ3»tóîÖ*`¼¦“ÙyFþ¬m0«/-nº²v'äÜ“½i¯óÖùkް¾؇°÷Š ä!›¸J`ǵãÉ¥A³R’w½vàyaX·Ôìd.xÅ)˜Û×CxÖVÈžY3⛸£ ‘uqÏ«ÖýµÖ5VÆ.N×MØ”Ø{iʕɾgd›N-N•”šW ¼S’l± rù"áé_)%¤³Ë“6€“º÷&üöÇÅ­Ç.×Ìj¥ÙCË«Ö&%$Öd~10¦‡Õ¨hq’³Ýè}±.ŽúN.°Ó[À8öK¢8Ü‚;Af`îîHÁÁ%¸»;HšÀà:ƒÎ æUh-¶GIx?˜Vž‡Óe- }À#׌۔Ml¨L–„åðæÖý° x }Õ:SR“Ÿ=xÀÓ^<ÞJ¶MdìcFD@•mQú„ãïíÒ唆³ ¬Ÿà€Þ€@§f)/½ŸH}¦È8âÆt™BÑlð ï¦êåBR<ü2ä(#æñHÇuÔ·º1÷†¡@™Bd8W‹Ü"uˆÅD E®=iw†ž¦*ØÐEhŒji±O-!†èÎ>Cð2‚é\ŸSÚ=sìÀUá4ÃNÍ(;¾®ÉE¨1½TIû0; rÿ1ÃÒùÙÜ]vLs,-ÿKèUï\êõ#K"  ª‰lµ¡¹ïTðÇŒ—µ²¸Qø>JÀüBA6¥ÛeÇ×Ð’\\U,%ÑH"HûÇ |*hA¨T‹T[v‹ÜkäaÅÛ†½‚Ÿ§È⦠áZvç/QçÍßk;2:ÇŠê{ ®·f~…ÿÜ.V7ߤ…0¨ׯRö+~>R×^Añ^¯,Sùç§`“o+#Ì\·-·ú5%UP‹… ºDû®W˜jSÉ‚f"Ð!›„[ðy|‹"q@P~8FŸ¿•žêÏVIãÏïjÂŒË.r擤yKtZ˜S‹ÜZ#ôÊÖ°¾æ 6’=1îÄR.6«L!’6,½|DZœá2ÎEÔ;‡FʯžÔ©JÄÛÐuvy{.«Xº‘Y&°«ž€ÑÉXÎ^£ †·Ù?ÓúóÂÁ.Ræñ¸0ùð@à9d6•ˆ  XÝø '£T¢˜´T‘rÔ  æ—Óf¾ûÈ–`ìr¡ö÷§«iïŒBSŠv¾z‡¢UÑ!Xn¤°*‹Îd5ÚÞÿä-ö×hÊÔ&qb Æ‡tÝAÞУË}MK‰© g€—1»<‡T‹Ç.ѤF£±ô9Ò>¯àˆ:6s4ÑxP¡œFÕU˜šµætG¢ Oy¼*ê èïÚtZ‹«‚oÏê$òø]i>d<¯C“_¼™l×N*u÷Í|†a˜Ì_¹u/¸~êzžBE’;â4Ä’5ÀÏ ª½V± µt¿èyQ>™Â~À‚š.òá-H/ Yù¥$¯ªú«÷=-H+@žze6ä8v͈èí­W¤Ûšé­Á ÉÀgç€ÖÆO3Å\úiL2:ôeöVÅÒÇ¡•£ gŸrZöfˆpun éyEº7Ð#ò0³€Þá2|Oø,Uúd`<=V‡˜q‰`”±@À¶`qn Ô^þBö˜DQiú€Í)™ÌèëéDî³6@+fS¶ì¯Þ;Ôfa$1l3ï½8[2é7Ѳû*ç.¯Ëj)5=×7˜|hyý EÂ&8)µ¡d=®ž=OKP+lôðÓLïÞ¸#ó †$ø[ë¤vÎíÃGÚ0tùâ§©ª˜uùÉ>ÖJଋó,OMóâfÝ~ÝÁ‘裕k0_eâ|uøüe…r•luËôJñW9ß»Ÿ×Ž·Göy57sL;£m#­ëÈ6mEnצ$bqV…ço;ݹï)Y0Y:Í‹™øáw¬'bç1i~¢øY«û’2:gYžp÷ºÌ6’ 5‡VG¿KÚÕ¬Õ%•Bì¡_—Ì« §‰bÖˆS߆™5¨<^1æ‹Ñǵ¥šá1[ýÝN#ª¾3YÖ×k¤$‚ ê 0+^d9Uö ˜-8eVrðôPRÖíßT9LfU¢‚èÁs9”¤ñ‹‡˜šq!íÌ©½,øˆ7àò!;@dWþV’,9<¡$ý°oÜn~x… p aaÌxÎ5oÅhó"dÔ“ ®-í:£ ]ÙÒÊñlòxãÝí4 š…«Ø¼ð’Æî L0€:¯ºðÅžï8r|kf!SP ¬RíÆ*–+Ä-æxƒBÔlµy¤ÈÉhÜ­Wüz#r­;HŠKô96&¡ä ºRÌJôÖŽŸ0)¸ª¥äÁÉ{íœ\!’ÒY¹ð3°‘„w!ÖI0Ÿ8;«,£5YÖ]^d¶2‡ˆ ug‰A†aƒP0)O©J~ìðôã±4÷Ip€[Ÿ$ó«<ùÈVÃ0ÇØ¼ë®’onG´š)d¶DÄCëöŸ¥ªØZÞ˜ÙÉB¯ÖÌv–*Ǧ]&æ–¢ãOFÊÝk‰uñÚÅ!ƒóT1¡7E;CWкµÚ ß¼Áa½Œ|OLб°;K¿Ê²¾—¡jJî´›1êD˜f‡’P §ý¼C*4ðìoeÚe‹@³Øp­…_ü$Myù¾ú”jb" wyc ›YKÕ þÆ»Fö33>ÿxU í™RËGVíEO Â{tŠ¥S0p“VÜü#Œÿî}à­ëšzý„ºn—ŠLÇ«²n˜‡|l¥–Gý ‡ ’{èèÝð׸¯Úa¨£õaÒ‡?#Rf›âÊã*±dW¹nˆ‰ ýcõǬ îïÍÈ¿”#XËGA\Ê¡¥ßÔ3)é(Z³ ™•Õž•˜²©¼Ñá€R|åµøÅt‰*½Ÿþ8åºÛH‚º$˜}D× ›ÎQK¿éöf36•†hô£E‘yƒ'˜äœ'•}ìmŠ©XwìyAWÂúæMo©nÔíÕ]3öÓ‚™ÒuÖ¥‘[¯¥-×€}RLåBØñzŽ'—”ÑmzÔŠ–OªÞE³FaæŒ2ZÛ†”È“½—×›—#Æ´Y¢ÉǽV,ðX>šòãÃ'íÚØš—šÀ"¹’M-W£'¢bF™ý²®´ÕŸ2CFIÒ»¸žºÏ>66ÎÞ`_OįƌÿšeÓ^ÊþH„+ÈÒY6Kù{éF°YÆcqûR¢” Æ&Ýé\kó”ìÅSdžvÿ‹.×»µæ(t¸Yæ@e wŽhjæ›!!©»ëXäá».@]µyƒÒ&s×Ú›Û…Q¬6B«TØIrÂz1”‘åãºåÉÀòe(½Ó6hˆÔ**e\‰«Ý×ýLÿ;Ý`;/`Õ‚^\–ü½µ ¸…˜DBõ÷µL[p£æ hðÎØóŒånºoîÛœQ'6…/¼6oè&Šýøô½m_h¹=ÆkõæÆµ—¸$yÈw k<Î× –÷b‡Fí’ùî=K[U³¢ƒ¹çCŸÕyÏá‚ÇŠ²(²w :è=¢axŸŸ@1±!F¾Ÿž÷hÃÞ]ôO`eÑÅ ™LóŠé¾-´ ­Ð¿*|Rt .¹‚Áo2våÄqà’¶a¨Ën G}¸äf¡Z‚{-4ð*Åa‹2óÈ.=FB9ªs“1½PlÊ)â3“Vó*̸y<˜ù ÎÃÁÚŒo0°cÚãê]"¾”øg˜ EÒ<ÜZÀl!¹PÓ©K©W8˜Ñ#üŒp™Þ¡} ›œZН»ÝXXìýýÓ«Ú„ñ|<ª­SÒ[~m¤C,O3°@ý¹d¸þ üÖyŸC]CGø§žnrq̯XªîЖÛÏB Ø‘DæÈ»Ã2¶œU¶+±ûh°Â2hË÷yg!Ý"Ó4õŽùxOèÚËe,Ÿ)M³§Èu“Ó}Sñ&Yhð+ÿgÌ_ú‰²r¶Ä‹±‚wÉ©žÔŠ©iòG" =ûÍ£•/4”.nÇÕ|8`]!_cÍ‚\‹t¤ù^Y¨º„áã§!Œð㢲ҰeÆjœ6'gN0æ+úQ;­Ö­èjm ¸ˆ4²oõéC¬’³OÙ1`èÎzo™é¸¬Wm1§I`|ªvVÃ+ׄ.úc3Xnòk[µÒ÷—Y¹ý†5akß'ï¦iã"Ó?hnh.s{üÁŒjósuJ½4Rß0i@\šgFÇ0Æ# ÝÌÝR4š›¾ÅÔ*?°ñÀ†~)Ísåb”ë¼~¯ìP 7 ¥˜;y0L^ø º.ÆItý@î“àPü-jÙ½\ÂÜ_”ÁïåËwFñäD ¢odšêj1EÚ ¾ok@½ìÈþwãXÑ—‡¬ û'‚ìu­G¥]¿¢Õ°‡½Ÿ(="ËÐR¢"[>Þ:Ù[m¸¤ûž•$QÓS÷óAªÞ-»R«–úfVX$?{ÏúZÎ`ÛíÉ ¤Vþlt)ÐUÑCXÄÆ¬´á@ÜØÃÆ¤!‰ûã\ŽêB²ãf7Ìâ󤸕 ¥ÖùG-i*‚eÍq¥ ›ÓjÒá8@ˆ€å³çhEêHÅAqƒRAóí\{NmR^ gZÊ9•™-Éó×^6Ë ‡’ÅÓpAõ<¤‡ÒÈöl†¹!¨ )zÈ¡¼ð±`~Á+XËÉâ<.|LÑdËJËÒÔ…kf^ŵö|˜PC˜ž3Rg^á&î'“)Þ@™¯üâmwO9bo!æ¯hˆ´sZÞ;VJÍ›zö¼zDdÚÞôj”Sœ,XÀÓ€ç»çfæiÉáÀGñD\ ×Bxm2eQãæ’>Ë1¤D 3Í{ÎTÜîŸ;BVÎyö„ÊpÕo%ËDq3¥H²!µG¡$ð^ÙA§ë LçêM $Xs5œÞ¤áj_œR¿á‡+¡ütOªÎÐö#ù3†¸Íz öýfcÀ/SÝ8XÓÀ¾©2ˆ›Ò·t&¸)ü­¬-û«5áá3¶`ô@& üIŽa9Y‘‚#”öàúg_øÁuSmÊúتYe6|ú«†ˆ· “€˜[|v=ÛåÏY³ 㿨ÞŸâFJÎ’í‚¢{ŠSN.$õíVQð(<ÄŠ\Z2  ÐÄÙx¦¥€c\óȰñ‡9²-ŠÇO9ÞA“ìÕ‡š~Ó³ô£Í€gÎà8é´íèU=4ª ðR‡ººCÀÚxûlðÄþØW~ª)µoò¢fEnÿÐÞ)Ébú±,ØDi‹,Þ‹þ³<Ô²ypÊ v_HeøžmúÆÀH6QÙ"°É ¼E~°r#˜/ W™”[3j+¯i¯ÍYÁxáËÄéEi/Q°v”8Ì®> å*fá€î—MüŒ£&BÓp@Î ‡W5NldÂ@Ø~ñú]._B«ô‘D̃½k™o(DÂÉ:$k/ž/ó ÃÖeP¯¦&KlÈ ŸÞk}rúo/“‰ÿ°pûh,T˜l)PÀ?é••Á–:s |ÔòSšPúèý'e4¡$>÷y‡&”貸‡Wâ& ˜ÿPɆ ß|xûhí8Òžï ðl+컜?í»}…fdétž®õÓyøðYüЃœ ¾KëŸÒ¼íó]4¥aE…ƒ(é­Î14ÃZTž§¬OgqéÁÄ–£ƒëÔÃîT Ï.¯[|äÒòÞÓ/tðÛ‰­Vv×ÚÅ…ÆÒAV;?‘Šè>U¦`‘/bÙTã6§7áŒø»;ÀîçÚo9à¯(¢9s„tÁšm2ÕÅsëH#FK¡†Â6u¤¯µI:BµöH!ßUKW úCŸP@‰Le«_ LYº^‰/Îâp‚MôÈ"¨#úÚRž²Cé9À³Ô±¼>W-q<×~ÏÔ–æOHXT*K‘u²1H®ïœš¤£ëÑݰ¶p–ˆ•(‚†äbÉŠßSåoŠ÷ Á‡bbù¬ùÂ@FU0`í=vþ[™t%"måãP’sˆvOÕ7"~˜bl¸ 0Ð;Å‚X ¡a¥÷åé@®ûApÍG…Ì“œ `HÕKϯøXÏË!²È*¶ú·wN_š4ù¸ÅÀHØÃû“”ãÀÕ(¬ÉH} –." øÎW{¹òÜ0ÔñÑÚܨ2“G¶¤è 2ØÃ¶&ÁðDœ¸u¶â PWæK»§û<ÒÃè¿0 ±|ã Ây¼ v(Ò–‡"ÏÑ»HC&è~! Qdls7hÎhUÐô9@W>Ë$fQqQùÑŠoê=5E#j@†îlA’NÕxà>vÀû9zm™ÚU}SõÞg‚CH};Ø_é‰ÀܬO.Þ°*E é’/u_KqŽ“÷»ß-•vÜÏ%_kÃùx‡D»aª1t NãKwQ±¥ý{9j[%+ †C䔥‚d³AÇ…K5Üœ±[¸®äã~¶ñô;]f>”ó»Q¶ÃÊl÷Ôã,Ÿ×!ˆpàÕÚfx=1CmAüv{ÆÍÅ;¨fŒrÈÈŒÚz î¹feĵa>pk¼7½~ŽÀ¿SAÖØÛŒgœ®]°?ƒğǘ²iÎÞÔ‰l<Ü…Þäš/±ˆÃ+¦ ùá¾w^Í·«QAIÇB üd°éŸ}nÎÉ‹ÝÄ$g¬ ].­IåÍRAÍ©nQ»FëïøÜ¥ÍÚpAÁ+A©ŒÂ«…Yu#VèpÄ2#¼öu²’ri¡]R*ˆ Ü¢–XdŒKSHûe˜°”'žnìÔeJeYJëçH±²Jeó·à§:L»Ý(øà²;<"oÜd­¢àÁÁÞØ<Û¼ÍqC¼Í³Îå Jø ¾±8ƒ¼Úã|ebÿîãër±F!NT/^ôC(I¿9eþzjz²ç+›{ûX„^`¬ú¼”Vˆ |(O§.8ìŽ0¸hEÖüÝßµÐrÐ1úƒ•¿œJÞÀR&éÀÅy–y]èÑ«(±P5ÜÓ!W/ÈSè«í\ãå³.s/}°‰q@´ò6¦ŒÖ Ê÷peÖ³Kw ¨@Íä+[H®‡• õWE:ÈTX|•„n3æü@<ð…1ÿ³ƒôJ¾–Õ-51È.`,û$¯å†Èƒ¯~TœJsâ…ÏÃ!93Ö'ì:¬È×·Ä!E@—±'?Þ¢N¯MðæÊ²ÕíYuûšÎMoM%¾Ó`„ÁÑÙTå¶Ó]’Gn~hW7¦÷Î$ü—'…¹oÂþ_<) †zÊàM[‘»1·<¿Ôüä7KûQ­;•,š bð_7W|ÝŽõW¡ÀÏ1UyüÜS.3ãÐáãÖ™]É…V¿óÌöëÊc*¸\“¾jB#ž>aiîß³ z6%§äÈ8JTeD^.IææUQC‹o@ÞŠªŠí,djàt½3hj¶ý½¸Ü8äæÉÁÄÕ­VÜ,&õ’цKeXm”Ñ&õƒ‡'ö#bŒQ'„R¸K¶µ^¾#3 ²—þº?½LFndÕ*Q…Ý xdÕÞÑ`:”Á¦nÀDdþÃÓ¢¨J ÉC7¤‹3ÆsÜðpx7ªWk®õ`º¶ ¬Ô÷º^~ tœS¯hCèCwR¤o‡ÅÉ`F•- 1Ä0ÿNrqzÆ"¡Z~?<u9åÁg&OºM|•š”2\œÊÝÆvEá^mRänÂÐO¢·ã­åR5r}ñÍ|°+6-ÐN7Ȉ®Ò 8_œ!µ¼ \G]Šö¾_~¾Á›‡Ï ‡E~;ƒæ9 Æ\=,34¦žˆ$µºî¼µÑ‚ºŠNщ°?úáמJEµøY+?—RŸy9Š?pÐÀ5¾e;¥‰[‹ ¶eve\kø\ ‰¨)h”U_‘ºÓø°o±êÏ:¯FaK§Ý¢æ‹b1BîÓO2Ñâ—H‰§ÏEà(%¿‹ÔòY‚ª¿¡xÃz\:$£\ “õé\y¿0%àA”TÁ’ö¼Kƒ<¾µ:–j©>]Ø›ãu¹Ïr„Ðá6D.rúÑ‚à0w~`cäNMìi7 |\2ŒWÝ|^M½Uˆì…ˆß©A‹7—{Z¯»yãN YÏÛ‡ EÞHl¥ÑøCˆ]Îg/¡¹q5õÓO¶G‡5N–þ4k+šÁ˜"céAuú¢¥ÍZS»#Q™£êÉX³?Q“cÏH0ÉÌ›/¶PéÁoEI U—m~Ÿc™Yæ°ó±8\¥BLN"e/îN…Æ"e¤j*{t)pbF3”‰…?\r'ÒîÃj4¿ü„о8Ħ ö‰å·tçÕF¬êß…wÑ¥‚^IßuaÛ¤f¢Â».,‰ƒ¤'sŠÙ\Áš¯*¤¹â1¼ãs¥¿¢C‘zðž˜ÜTcá@ª¥s‰©@Ë85ndíöT¸Xò‡þ¤–Qå;!¬dð1›Ù~t›YèÖ¨S T:R@øí®†rÜíÛÒ·O°mêD£{ Ó?/‡eor /¿Ñ €êð~C· ª°0øL§<µRéß+‹ "=±÷ °“×)ÙCa)´Ü µsÜ‹žDeZ&ÐåF‚ç ÅT!éuöð¦ê;ie0q%§íi n×ÃbLÊèŠðÒe © ôu\ûp^·¢ÅU £¬>MšìC@²l0(cá#ÙóΩ›„túI&A #sŽPÒ(J‡c-/2œü3ÿ½=Ó§6z#p´ÿϨ¥½Ç2à>§tU¾&Œ‚ ß$€T›ÅÃÞ¡ç™Å,;p¤½»øIŠ ºÄôOÉËÞ’þÞ“Ò_I`ì£k²Ëç—ˆaЃ›MÙA?¼²ä€–»ŒÄįžûXm&5ßoCXyB^‘ÀÊ`‘Òéõ¥¬íi+9ÌÀ¾;ÜÒùfZ%à×Ô¹Ò0ÌaG ,¥Öüà6¨«ü[~F‚$YeK}5W¼,Ê—RŽñ¡¨Ñ_$´eté¾âURÞR²|0Ãì“f–(Ä‚™••Ò<;Áà%pÌÒÜ­G‚OÀMH{5Û|¯j—.`‹‘lÐ_…ytìMÂR62òÏÜ¥áú5ˆ03¸T>ÁjÏV¨kj­žëäs‡ Ôb¦²R#`íðn‘ï«P¯­ô“@ßL´–2fÓ6"Ø$?Í!³|So$„ZÄ×*ÏâGtˆŠbƒQ²AycéÐY’DyBAJïÇŽ  ‚Φùýó2P‰äÏ$•Ú ÔI!nía ¹a$ÚŠ$êI˜åÚà ý9.Æ©É3-+ÎGð©yÁHé?Q€}œ¥Ó3c敪ŸFX¿Ÿ˜¿ÕÛŽ®kìÀb± îüb¸]5L ül&›^¨éš½‰c~õ¡}Œ¸! @ô,yó]vöí 5ÓÒfJËl–^Ù °›0E]àÃØˆöÈL„“gÄê—½#Ûâ}ßÛ}µäý=¨Å7Õ÷ãõ~ ?ÓļQëtåHÊÀ°¬¦vµ€Œt‚ºç£)(æ!)ÝP@²¼rï;ÖçdKÝ®Måñ‰ù;¿–möó©WZ¼92ÂÞœ¸Î(O¹ã¬+:Ø™½s|Òu~”œ¦yä®L5¬cŸ˜‘Ñ‹?Óëzw!]Gš±ü8ËÑöKz¬¿]ÛS@–ŠÏòßóhL^h¯5T+ž‹L!z¾ïyÝ…O¿îÔæg-=­lÆo•½T¾ô$?\ó+ Ûø¾zV ¶ïÜ<˜}Ň2lYò)q—CúPYJ—÷&5 Ñ€>^ßLÁÛd•*ZU®ÞÞ°¡À*’yÁøW2få¯}eô•„]¿=¿KU€Ä ³hŒZ¨¹JV ^x‰€æšúb@4ÜõÔ) #^Þ´Uõ§§æü¢ª+4Y*yeÈêÖ“×Óo¡bãE&§µ.}¬[HÅ®¬Z^£UC¼½Å³”E•Ê­.VY»žÍŠ "v=§â«‰6щÃêàtM‚'Ñ· ²áÑq´†5ünµ*€÷( $~û *M.üÃLâ“Ö’"jËÇÌqTŽðÄàÎp ›t$]¦¸ƒ¤À^Äç’q îÈ7úb^<‘JY “o´ X\y‘b£ØvRjÔíÈï˜øœSÓ  Ú ö,–¢ÎŸ&3_ø6>f•/‚£3œ@³ãõß-ôÔ¡åçÌä¾Îcúz†§}ñv>~Ÿº·’S&‚«£×‹û:ÿ©¹ºøE龃h”;/o|ØJÏœ.ræÓ‡´LçTù[æ ÃQ‘ü¾Úªó]ãh÷¯º|ƒƒÞwöwÿñ¸è–#U¤ÝFn«e¿ÇÍîl'ú¨Û6h[ŒÇÁkݛŮYã¼Íæ•àõS92–ŽT8~ïÖÍöS”Ö¡1ù[ÈÓHX¼!'xÛõ¨ïŸùÞ‡± jûg¬JjÓÀÕ\, –ŠX¤£èy¨cŸ‹©ì´•ÄNyMóYC\ˆ†ë'³(9{4²_éØV¿ê‡î4RB%ý§Å§$.¼oWN“oÏ7o®é*sîNuÞ_®]·Ó´7»'Ež›bñxòl̼Sݾº;ü×Ë™ñkެ˙¦f÷:7¿SÛÒfåç¿\ ,¸&Î2Iysm·7kw«÷â~îg`ÒòDX6àtCY¶ézo³]°r¿@Ó7ÄÝ+X¥'øã£½-˜Ü*#Hòúìp`æ‘ÀýÚãý–õúê Äàþbµµ|¯à’ýÙåÅTCTÃ` aÐq"Cƒìcø`óàuiƒZ¢”ÿ1dÚÙ»uÆx—^º;—7¡ëj›#‡}¥‡ÕC+f’U–›¦zᲿsÖ§–¸r“áž´·I¿NòË?!ѱ¾I%.Üå.¬[†0ãg±ßBšmÒ—Gš½î£2ƒ®W ‰!¢U~·¢9_;î½Veɤ6ॠv žœýùÖkéï ·>¸Ã@ÃòËíŠàZmíQ_C-­rèYóÜØ½øÝ})|.¾{n£d+‹ý¸íM‡dV¸ë¿v 㪚úÛg¢,žã›¯U½ÚZÊ«3;¸íÇi3íΫ¡­Çú™SQÛ ƒüãÃÝŒºƒ+sH¾ê0Tò¬8¦£õo™–š*a˜kbîZlsfe¡ƒ¾ãq›+ÞSýsn 4Œšm£˜œ>ç俬“Ûj• ããÈô …qú’…ZðgàÆF›§«gCªaèieáï9oƒ~òQ0obÕ¼ˆÏDŽ“>§¹‚ÑùIbóEzŠBŒh(4ª/õ”¦u†¿C4œÖçv¤)ž¡6@3??zÄÖßÛQ1nhä.ŠoòîC’%cô.=JR@¯fÎkøí° ŒÍ;/ûM{û&% ¬¯Ã½-»YJëõM¬‚ý¾Ên/»~¦èt:¸`+õÔŸLº Ü¢Þ€"gcZXzF™è”–/c0¤EñÀÙ+ ThëòšŽS2HX-ÈÃJŽÃÏÍUf†÷W.ª<%$4 ká¬ù¢õÜa(¨[¿¨ZU¹=z×9QÏà1QúŠ.GI\Œ÷ Ì3þj<6¥¾î¡8šóÐõËW$Û Í1)W‹À’¤ZãÙ?²Ý .(ƒtOÛ†|ôÓû±Ylôó€!®5K(4 œŒ …_™ô=BšÈÈÀ³È3pKšøÈn´‰0X¸£˜°&)T< Aû¨8H*2Ò‚‹½JzXE‹öûd.2Ìê Çþ®¯r!zpdaù17èg"eîè"~Ì ¡F\FaÓœ9žþÏ2\èm·‡·pmZ‡iJ"»ýo„9±ý9 !¥CcÁ£´-UiæàÕ³u ò ’-i’Ì\w]Wûôž7â¯Â‹¯Žñ>âן&É…¾&=”ŽGsþ°ç> ¥¾næÊ0¤Üóc’ÊõcÕ–ýä/X¢ÞØQ¥ÛåEŽvyÁ)Aœ¦Ô 1cð§úGÊËF%ý„O§C_Š€!~ÚD” Ó¹µ8µ0"W!s:‘Úð©™øHx $ƒàÌŠ5ôµG’ l2æµà˜Œ5­Ã›ˆNƒ«t)öåvΟš¶¶<f¹¾šp=º789wå Vªf'ª­ˆÇ…‰S_j,æ ¦£åãaïhs!ƒNŸ`¡¹Y/Éôn%œnPá(yì »±Åõ;#o5}Ï ‡‹Ö„6‚e®mÏ e™¡á7ç¾ÇgÍù·‰ø°éŸ©7t1 .š['¨;øŸ]}ç5kL•¹¨sX¢É;~x$ôk…âÓâfåx˜»gé׊^,qˆ{áç1kp$T¸Ä¥£Lë0b d¬ÃN‹eÈGÍb!º{!C Þð•ßœŒ“ûb^H|÷âó!Ô½_Æc¯¤â68•øÒ©Û«ˆ%>,¥$ežš&š›ðÌØˆIê%8ÚòáSû}ŽOLµPÈàk³êpš°¡F¾¯û³r)Гl¬>¢á’*‹¦£YÝW°¨Ù!9¡ò¾¡,DNF§zê°Ÿ÷~Åo øüZŒ1Ìì³ÿ¸ ‡Eé¹>ÄE=”Ë<<…Œ5J·@º]®Rȸœ}¢•Ì|zl§}¼©dðaŸN GR P9É"š$~z‡Dè]G kÉrÇäpQ–ˆñ…Z,ã}ò©M.-Ž#ƒäFÝÈàÀ•4Cim¬[Þªë6?ÖËö`AÆÃ4óG÷ñ€f`d^°ƒî*?ËiKl,5ìÖ!¢˜²åWH#RÇ×›Á7 MyguUd”„(Ÿãuã°h@Wœ&žÆAîç¢iaÇ2ß+iP¨ó¸‚£©•Æ]Å2X¾`ìîRyK"(ßli¤¨e@Åy/ ÷—mz>üaî5ì‡6‘7è,ÇEQ;F ¸Äxrë¼&;1ÂòdþÍ+rXÜX*n߉‡e ® Üb ò\¹3¾÷¡R`n!šò$M’üÓÑ®×€¶&x´ÐòQ‹d &o,¶Ò9Y(mÚ{þïÙ´p‚”ˆBd £àpa<¡B]<[Õ  ’ ØlžÊÎ8‚P»›GÁÑßÉ-8ˆ°?êžAË &Ðe íÅhY³fSY›yüâf¦ócà#´j¢E,AxH—•O0Le:Z¤Gñå¶ŠAïŒ#ºÅ¬C´18E (3œÄ (C_‘ö[º…QéH/>\^Ÿç§% <ÕÕ;ü„u 듟ò§»¶<¬™Ü’4‰Mq@¼&Õ o=¨–*óµÜkËàõÒ/PTdÿ›(_}†¨€L‡clÞË(ÿÖ4™ððxËÞzÕ,CÞ¢´ŠŸ‡HYMÚ‘¿ºScˆ‚o hÕwd^o>¶Êg0ß®j>…¶Òp²CżI sï¾úThÈ)o/I'‚PRøO’<%vÈêRÆH¼ëkW’Ùbªu†SŠâ2/·D{§_ð1œÌ^Îì`¼þYSÅ”ž ì\k&‚î…ò½Ñ þÕŸÜæÚ(^½Nsòx6†Ö¹š„»ÉOEt [MöøïK qð'á‚Z´/ß—ÒÖ4F¡TXEßRrA¯J iϱ‡‘‹Û¿u Z<Éäc¡…–%ì턈ó.?¿¼¤Ê¢ü< þ*=ÌÛ tÛHsxIáhÃêå¨/db0ØP#å¯Nhô­(Ã'1±£8fIªSºbS¡†¡Z å½3Ï6r qy¥ohœ†v-8¦á‚ R$õÇÌ#SP#RrDü—y»‹ÞJ‡ú#Ϭ $Éã³¼··¬ûâïcG7mïbC ý”ùy ‡Ðš3—Œ „‰YìÉJh˜ÍÈÔò­U@ì-Ac_˶O›Ž*âú”kÑβ-Ù*Ыð¢V®%y7|ÑøÑú©úá:›x}áÑ.[YÛâUÍ42춨^MÛ‡lýÔæÍψq“Ôˆ§qÍ´r1ö®-óÒ<ÖÃÝñð•Io­l”4¬PäóžëqÀ;í!9[)»0¯ž:ÓoPynð6ßÅya=÷´¼¡Y n^—Ô“rí¢=¼ÜñœÏ"Èä£öÝp0«S•4ýxÄ+Qø:­s‚Ez«QÅ¡¸õÛ{œóè°L‹ˆ•ÍÀ«ÍÓÜóx»,Þ¹íj\iÀ+Ñý,[§LN(úÔé³F]5XËÀOVG°D…}åÜ–ïôDUº2JŸU{Ú‘g‘ÓËK LN—¡Øk÷3Þ˜Gú“m7 =ðnq3!Ú±§7T–ÿ³ŸÑÇü7 ¡îhfJ AØE.´íoUüæKÊ dLŽ‚'¥m%ËÛyw„ ¡~;j©%&î;X"¨(àb‰Ž3ÕózŸ7•bã}²U†ru¾ÿzØ0=Í–a*F!òypȵ«)KóoZ.J€lÂL-j¯‚¢aÕ4×d rÉ›«6ÚÑråiN/ßWu‘ã}‘Á!b.Ƭ%‚O GùDªÕ!˜xÅäôCo “¡á˜Ñ—S4i|(Mg¹£L!ˆ‘ôê¹7@»bW†éƒq+16)L”"›ÙÜ÷ÂýËž7‡á/`+¨8 ã ©x†ë»ˆn@1ßãe»‚ vè»LjÇÁý(+P žg}µ×$ ôS¦Ø…„Sì2.^7g • ƒ¿ðÂê× e49y%p H ùÅ\£:dPÐ%”Öˆ­XãPtD¦pK‡îpEæŸÁxqŸl@)Ú´“rt©åÊ twY›J# ƒQ—Ývø™¶$+€RDÆïåŽv¬… J¿æºž§uUsë§Akéè#þPn`°Ç‘R>£°Ô„ø¦ÎðfÄ•&w„Ö.…À+œÜQãG\< ¨Pf|õ·È;Û²cI~¨ôê3wd¶1"Ÿ‘Â(€ñeêr=8ë#é[>Ž>5|BVÐàÛ‰Õý{A}/ùñe… e൘ŒÒ0ù-Æê©vu‰èft4&äç—BdJEéõy -ª¶j±³·¦—WtÒ!h¾c:…eHHÙVPl#F<Ü”ùë—I‡ Ñcº|®/é¸'šå©_–œóX›õ™-däP”èEB°ŠŠ;ôäøWCyJ):\,ïüÃû®ŸLú?¥‘òà/û;ߤðÃÿòŽ·M•’Ç}gØéÏ1|]òÍoëøÃsù¥Ú_ýî÷ÇJo¯æ}š®d­ò€?³Úë¯ÒLjA"oeš„gnާæç‹Ö^¶K¶4ûÕ¤ºÍÈa³–C$oûý®Oå\¾è¼„ªÓ3Î9Æn#„C|uxÿÝëÜ·S:)Ðá1ÑU¶$¢ÙWrõ9×K&5=ÑIÍ9Fv°IDŠPÚøÒ…}ÃL@›ßùŠHйñº8ʽNµ‘öV½ÔƒŒa/ùÊIL!* ™…P¬§DôËPR¢1 *éx}xN[Ò¤_Ø’ÂØ‡\l¼íèK ªù!¢¿éïïw,3`üëGÅmÐû-Ðá»ð•  yOª@abvehà¼ùþð=\ë÷ú[‡ÅÉr[•³´ÆÃ ïϾoàŽñ’$øLäÊ|}b®Œ¦‰$'%EÊ`T{/ â?”žÙiåž,¸<¯¿^b§\õÞGš©€}™Á½,6wö[A÷ÅD!z… )ý´ù9½ˆµÏÞ3©¹•EDÜ †=ÕJµ`gàT…¿=×A«ñ®ë¾»À³¶™ÜkHp@ϘŠ O|G\¼Á·{@Ëút˨@¸‚30îêMÄÚ¦à­NH5â©ÛCwn_±ϲwcôIÒ&¸"‡Šc`.³k é¨>"/x·F ‹‹ƒ?¡²¸$^tžûN^âjúCá…vg¾#õrƒåw@0ø)vï©o²³÷2ÐÒtˆe-²uJPCÅÎî~‡½cbŸ½ {=ÝJE_ÀBÂ(~·®»‚Q°ï—éäÉ`|V¢!’y-+넾|8á 6 ‘7HIaÙx9:Œ³` Z`½Ì£~œÔGA(“þDƒH8-tP&—S™×o IÓ:Jˆ B_}•XúF&±o‚(‰ ýÄœWö¨‡Ls1W-ºsá´Š‡H_•>L~Î9Ð_[s27Y©gú‹Ø2¯ nÞeÇšµ¹´(AšÊ!¨´0€°ýGÜù”µ·é– –.3tÅn ´E^{TxÁý‘íÔ+jh·(q¼ØŠÒÐI@ú +Qñùü Žæ—\ĘÀ¢Ø–¬W|9Ç:‡Igffb*óâ=&>$°-NSú’õ¥0<$‚ÅDƒ>BÞçÔRM"JB+-òmèg°üÅ0å(&ÿ;n\#s ¥55”™%ÞÿÉd;wıW3‘Ýï!Z߆aZd ÌFjêé´·âh~È GÇ¢†~©hÿ–œ ê&£Ù>ê%¯Ía©à5»:WÉÁªlí#&"ÍŸmOøÖJžŸTƒDDÈ·Ì?0lÆ£_Œî¨mkñ·\pÑŽ¼Ì2g…¤Df^vpóea 1Ü¥R¡¼#lt™[3å@f¾;Ĉž;Ýë­?Ë ŒâÑãvSªâÕw+ÍVÌ=WØXÃÊÞÒD1šËî£(ŠbÏÌeÊÓœãNI¨àK³ž¾ p†t¯%%ìVF‡q6Ò„ª@ì}*J^2à@?ZøÒ®ÈñØ÷Ê @=u­L"ðËc éîïGä5 ¶ÇE©°ê‰,¼Fº \ç)*TœÊÇE®äM1™˜˜d°ÜC舻Ü›r7n6‹§·ò±%"”ÿ@‹âYiÔ=­F •Þ²é}ÈÒgÅ<ÿæËçOŽ×Y[ÂÈöns!) ZhYŠô»†Ï|utÈAáðJžôl&2eiôâå!²¦FÎøpÔ+5t¥]IówkÅJ€:¡î™ñ$LRXzþVç˜"fq]ÒDuÌ04˜Róˆˆ.¨¼s‡‡kSIY@·DÈëù»$" 5Œ¾á0Êo­Ò¯#Y<ÁX»ïàÊó£ÐÙ(YËAF p.ã+ŽÈOiQ+¢d¼~x è,ÅÏÂÉQ«é6´wF®àMÇ30xáŒÂÝÏÊdÃP/‰ôÁèP"¢U¥šùñéׄØ4D2Æc1°¯$£¯5(Â×xûé•ßËÑ'Þ½XDí{=µ”amž£Ô”ÿzÌ•MÉ©yœ¿L 2ä繫–®V·eh‡3óë/¾œz'ïðµ¬pqÕQShÿë›ç¡¸0¢ÊöXBØ·÷PÉ_ðÉ]EYôQ²‚cµjôü; 68µÿájÍ´NM Ô6åy,ü+KMæRvõŠzK «¾ï§áå1ñÌÀT1\udZ0;S¹ ÅÃ5ú Z$,å;äèUøÛgôßsåQú„‘©Àhæ×ÁŒ”õÊ|õôг Æ%yFaTÈ_ЇjMðCGY¾ÞSÆuÛsÂa0œá&†u×V¨BaŠØO¯ t£=`úZÐ͵P÷™$· 0{!nYr—l(*.ø²äý^ DòͶ¿ˆÎ<$ó•ªl‹¤r¿8Ç“ 1ÁO¸ÞÝEalwf”ÒUpV‹þ:‰È„¿¹rš?-Ÿ"2É®"§®‡^Ÿò‘7ýçÃñZLàæò”ó»à½ÿÙîrFƒŸÈý¿ÌÔk’AW7†¢LLí>W ëf¿ß!<ŒêÚ9˜ŒALò Jÿvÿ}È”«Þ,c€FH¨½¯Ñ âëæ"ü”{>çN_êó‚WˆÕAŒÂšÜ6žuήgó ×þ|`}ÿn{6´îÙ\žù&y ªúõ™ (1¾SåÄŽúbŠ—ø9ˆgSC¥¦æhl¿rÓèî…wßcîâábñSáäw êjÈ"…<¥”l%^žüÛèµQ?0ß­ZvìÊ[ž|F× ,þ¹70ÂWÑæ:"ÙG‘“Á/vöÊÈñì{Ÿa_â¡+=üLTV=n¨Ÿ)»5A\ Û+tD2Á”‹}(MŨ‹ýàZïÈÃgœBÓHæòˆäé‚k6ˆëÍZÙõ(ùËÍk70¡tIöÇ+–6¥>N4nž"QÀ¯Éj¾<ùX¾³7]0Í1¾ ”áýNÖÖ¬Rö^?{p¦µ‘aØîÜ“f»”3it³ûKû”}Ùa(ÿó¬”Ì,Z"ÊC…NÛÌÔ-õ1½«¸÷§Å÷uú»ÐÚÊI¬œQhµŽôÜ)±Ü–Üæ+»·”D¡å2’1ÕG ÇßwpèÈ…@ì!wšåo‹fÚh£`¤JrÃY Òw4ýFõ&ö‡(Å'.#-˜? ö•?釚n s9»&‰lq²Î”YŸ µ݃.Ä YTn¶]Û…u©”Vö ¡‚”3“Ö¬p¨<oè@2–#´¨ù¶é–£ÃŠ’yßë<«cËhR-¡¡zþöŠ’ˆµ ‰QWÉõDí$ù­ÙÛǶuÂQúNw¾³Öv–¼p•ù•¢É82l¨W}²Žùk€gÌí°(¹~ŽÐw†7¢G+€Œ(à¿‹^á¾ö˜9m˧èxsAêpyŒíp©uú]+k ÿýÎÀ˜Joì\òóÈ3X ajn‰Xƒïn‰é2|ïNògù|¯FÖrn}ݱB¶Œ ¾Û½Ml3¸}íAK(”Ê'u¿²]]ÞÜçoã'|×V¿ì'³A›û©£úúšƒ–¼ð'šçŒÎXòbh…ª Cf;¦ŸñßPÖ]K ƒŸª‚³o‰º¦40Io?ı¦¿†·×§À±i[E¡òl4:?uü•i°âi’¡ÕÖòд/M®ÎÓl7øŽ‡ODR³øtcÒŸù±¨ý.Úf{ ÆXðhECA[¨ûõ¸aBa¦!ü(Næþa¤©­}øÉŽêY ÛiðÈ“1üŒšÎMj²aé§ñÏ„Œ¡í€÷2T×-. zÐ=À­×L¶}œ1Ž1IrÊ_§L·â‹“2¯´#´è/ZihAá…z·ÜƒDp³8ju 7keè•)6:ÖÎ8V²M~ï»õó•D8È,BCñ6‹«@Š(ùT‹¡˜*kÆN_‰*~‹Ü”[—‘‹ù£^.ÂBr‚ªÜñ©°§¯ŠÔƒe,¬‰^¦Õ#šØDN2”|iþ&î‘ÓøG[žŒ:Íô¶à.ãÅòRnRP‘²®òÓÕTáGÃ9ƒÈD*¥Ü½Z"”KáðžKRkëvC}Žîàb¢g¨ÅEáHJYyÁÐ mìAqÀjò²Ô¸Áµ½[·­6îSó¸1üª­Å5$©°e)?£Ø•xS£søá¶ˆn¼ÂÃba‡÷€hÛøøò¸£vÕÜ”TVOðš ?ØCJ”<{U®D,È<óÒAât~e¯ÐaÙXÈJE/ Iã"RR•^à§½®6WdÀ@ìB¯L"ˆg¢½Í4†÷3YT¥ˆpþá¹¾Ž·é„ Ë^ìñÕ•äã«áÎùô£„·ç`ÕåÕ˜íz×Yà ¤iÖ#›õ§à¶Š|áä)î06lä#–ÙG–UÌ%ä.9çKWáÞ¼àkkðÔ+œTè‚2\‚!z„F/ÛÛ{ØÀRµD¼¸t¶5†°Øbé¾·VÓì†>,¥i™ð¶a{Ëú¡9•3œ¼}nÈh§·Jý^&Ôä5´©Ãa+HVΗÑñ,#Ì€%h¬GϨTêKÁå0–3§ê"g;›ûa ²MƸRÐNEJ;«·ák;cãåürApt üÌ9ƒxØRV1öÕN#„ÿè”;p :Ýá`Ä Ì÷>»òd{³à(•u÷ȶÂͺ›¸@‘/ZRë±Cõ;b˜*Ÿ‚ÿx« ë|}sßÅ\¶ÄÝ*øûí–¿´º] .‘py +úp™J$µü%üðØvê]¢*Ll¶`X¯i1©ÿ›5˜¦çY42"‡l°V é +CاAájnàæëÎL cvOR´­m ô^q˘\Ôh3–$b¨Z´¡ÖKƒV»´w³€K‘„j:k¥©ŠÆl‘¡DÆT)$RÊÏ ãòÛ6®wãxΫ҃.ä±°´Ç„\v…qónê5€Åvq[ZNM-L.`è.f³©xKFò#,A ¦à mëÚý;‚µ¾CeY¯– ƒä¤Cý…&9–e!\oL-S½,–„AñX‚ hÅZ4€OÔùýö4ô_ïqذû‚Ç$Ñ\¹^Ñ7uçÂÁD¢´w¢µ­~¸…ocaêê$þx"$†6ØH5lÍ)wL $OYÒR ›äÕ úŒÌ~ÛR€CÅé¡`kbLÝQ&!ƒŠ8’Žm§H§ç>4›rîý Pxàc¤b¦U ðÖóLèxªèx¡X5ØšÒu@óÒ|K•‚ä, ƒ;¸ ­Ç¿ [‰í+Ìâa³äKî©FĽ[ ëÛOÖ;éPAìNz~½—¤HÉx´ut¶åÓt!û„üÊçÒâ]'+¢8•|-VaËÈj©È0@ÿŠ2Nà?ï}½±3ô6ŽÈgV<ðlhÈl®x×[SéÔîcû$¡+.Xݵû´ WP ’­†’µ¾¼ï<«úU ¦½šÄëi‘~sìÃè wHã}þÚ‡¥*œëdܤ”AþAñÇq^pùÐ#.:É›Ø8"™¯ÓÖͤQ»FešÂ/ÕeµÀy$¬8ð×ñ¿Ü så¿ÂN’ üõX”p@,¨àÓ^Y2ðÞF¼±„¨Gžü–(‹¡Á¨’TFƒ4ô¡c6Èë¤g¹ûPVüò´YªBj7»¿ûÉö÷WÔÒT áüO…2¾*²‘ÍQ'HŽÍù{{IÒUо,SÀb!”œ^B$Jr#´¼DZP2DâRÓñA Åø¯Tpàm¯ùܨǩtôH9à¹ú¡õò“¹–L¢I"VÉ’@?⡱ ?ãE%R{WÑòÐ…ŒÑ¤V;•hÂ'ÌŸn5®^yHÚL4­¬ëˆbYÐò&ÑÈX9F#/ã"߯ÐÌP™pü.‘挌æRµ€Ø_Òº{s?xÆÂ vwÚÖçÉ”#’Y‚wé¤÷«+„CÓÌvq¾sÁÞ¼aÖÑÂÆr›Ëe+%JŠøÎ§ärO}¶øëŸÝþÉy06а0Z&4N«ßl_ïÌæc&¾SˆƒŽ¾R¦°üÎ[Ì+šü½´)ÿ•ù×Kzø¬%Eg¼ŠäbºÂ©Pw½kÚ¶;$Éÿ>oHGiKC!1#ã^«Šà´Úo{`ÀŽÁ‹°O"’éR’³±i†Ç\õ‹HŸÒz"pÕ‘ŸŽnÊåZ=0¥[…êÓG—ÀR*^°*!è×€ŠžÂRú¤H±Á{àÜ—Y dþܘQ¥'¤§¢Å¬âêh /šRÅkدúkÆç\Þ ”{èΜf £˜¹½?y^ôŠ•õ>ÅK› _ɉ”ÐÄ+hi`À™£Ú‚?Äå¿UK­Ú¿^ÓˆZIm‘kŸ@çïf¿„X”\‡n5¥*PÎ¥£Àấdú╬dà¼ZiWœ.äh#¸Qã 䃠íŠN‹,R˜h¯¬ùˆ(øA¯à#°A(Árð-*0"}«@ÐÁŒ÷íGzb)j)ƒ™GaØÄž¥£øG€º¶}j(}¹}°†jÓ†‡<Ùb1uºóÁDž…ñëFa ÙÃdÒK;q\ž»C_nÐGZÌœ¾_R´)ÀÿxF/ýõ^-ï(»(xÄ×mypB2ÌNcÔ5PýT%ür˜š†öà P$¿¢ò'Ç$ªá‡,‡×b®àã<ø’„BvM„¦ù0;ç‰ù*¡ó#‹~>åOP "ãoxU×bì`Ã7™éø5ülÊŸìq‡3©|f¢ñ‡ãÒñÝ"ùé”?ÙááÂ&ÆÞ<¡uÓXŠàÏXCù / ?Ÿ<^JÇbœÏíµáŒ_äDï j¸”„Ë1/ò“=fŸÆ/»ÃC='àörEÊãßV”oð¸åWA¿Þœ‹ž‘¡¼í ª\v”á&ˇB—eäÑY:ùØË˜âjèÔ?½dᆧñ’2ʃå¸Ê­_|²Ä$^Ta&C}¡‘Ž ŠÆêÙU$@J¦!ùµîHÖÏ îûnˆÆq¹Ó/{‰òª¬Íu^²1¡+a†žýP¢å¶<Ñ} ŽÈAÑ­ÎŽ‰a•¿R%Ru†ÊSgêÊÈ:¥,VÄÉ~†åÞõS$y!l-«ÃÔ§ àÓ›­«é×õ ûUPÛÛF°Ó~Ü7Ðã¶þõŽPbK0IŠå­QÕ؇¹¡Õ|• $]+iërÌ£ñbÉÎE<èÐH5àÎùîxoõjþÞû­ãÆÕš(†;³|þ“ÍÅèwVo?ãÙë“›ÍcwV¥ûÃíÓÎŒ :c±v§XÜèF¶ëJÛÝÁÊŠÊÕ7ã‰ëíÔBBíwûó¾ œ÷Ý$\Áoe«¡ª»éölqÐF¾Mõ8<í¹ðpó ÑLÇŽK·mJÙ»±0PW«Ts{£$ø’³6à ±¡D{Sùý:ŠÓ&jµªò òÊÙÅДQò§²ìÆïwØ[/"„[¼+•‡ÏK<˜º [¯3¶k"µŠnj¹=­É?•Û¾›‘ZÇ·A¾«P¨¯”8'§¡—0¹ím¼’C)žzA÷dâ­s[S`²ð¶ÐDà­Å§×öm1‹Úhõ·4Md`BLÌãžP Jœ×ZnÚÕ1ïAYÜ Ûi=¸ ±ô²Ùå¥w6‰hŽ 1Oå‡3Ñ$;îˆË·-Ö½”•Öà ÇŽÜp-åãP ÉúE_qZ˜ÃŽåþ: K±¤®™_¼JñÒÁKd–b©‚X+áóÆ©GxPv|år<¡ /WÍpŠ.e/.jåÕ½íœá÷õÓÛ, ‰íø´ŽqL+h…YH ÈPËŠ ³ï9Fà#=¼'U›:²²9ƒ ß%~Ø|®¥Z(J.ÝÒ‘oÇ.ûˆÞn™¶·Ýï)ž6ùìßôâç·W½ó÷3h‘ÁC+z]Z¾6Ï( ö!ÁÅÝœ89.lõs¼žˆÿ&·âÜœ½ú¹»zߦ/ER͹¥qÒ‰\}Å¡^aOЖƒ" ½¹¦«O\½9 ¶ò%d,?ùÒ‘C÷ªæôÉ™íUóÎÖ‰íRÔʈ°:’+Ö…I…¤XŒ7ÏÝýìlÿr™±O›ÆSP?wxcW]OÇäÍ'•D<ýÑÐà'áNS÷ÏN]›­HÁ9ƒ#0Öý'uÆbÅAºw0}TJÖúôºšñ¿¼R­ßòhe­¼¯u3CXÎC%Ñïv#걩‰òf"´\ìýFuÃ^Ó –À©Š„‘Ôך#Îï±+¥I¨ÚkI:|eú|Svk}åëÀ/¸ð§—+Þ_£“Ý¢lN=]#Ð ( ¢¡îÏY.œeMe¦²®;·'€ømK©—3¦¢à¼(_Oƒz÷Ô° ÛɃìÜgy9ªØD_MrK[ÔÍtLP¡E0L…+ Ô…TœšÔ®œÂ71`R Ÿ“£Y¢6û†‰ÿ kͪu,70 Æ õuÇ%¼ûä¶sãÏožŒcÔìpÂY.ÅÒ7pe8å,Àš,Ê 0¶uµÃ;p(BËÍŸ*‹±YòªŒ øÛfµãÐ,€°wƒ~`–Å,sKc„ [×xÙ¥±ÿåª(³T”B4úê,{xB^ÝJ…åRˆH/wf&üå~§×rA*88|r¦8‡Ž8`î3ïc¾¯(呤dpe Y15\Ÿ•8,•îQäbƼðö÷f¤T ‘…4Hð8\Ûú-—ŸLì≯“å¿,ﳸ«¿êöxðòË`‡µo\ÎOPKIÝQVxÈ;E®—Ñ>ª;P*ôydÇíNÈúζˆßP´à×ÅK {ÛØy¤Cg!„‘OmÀSQŸí Ó†?ÀË­ÊÉÀÔ;U£íõOÚÖƒRœÃWÄ‹ºo¢È÷»£9ƒÖÁàL©îu¢n{àsà}gÄ÷’/Û‘žðØòhÄ:fæw±öö6Ÿ¬ä›—'#±§~KmO¯—ßœŸõº_—Cs0ÈíhPµHÎ9T?bˆÏ¨/ —ç·¬ïº-nú(ë5}‘Dâ”+éSÏlmcq 0eŒ*ÿÎÚߨÜ-0üÑg·+Žô1<—yóxôLÄ™f{ïÍòãkToÑ÷¯|+Ú³3¾ûßœ“oúÜ7̰_ÂŽóróM2‡Ç£¥]ƒð r ý‚^ æ…X½Ù_ЈQã¦7'Ng]Q¶ðŒòbHzW!¬ö}0dûøä2AR¶6ŽìMaÓeV­dPõm…S])Ó÷GÃËtëø,\ÊÝ>®¿P«]ß/”¢¿&àÒÒŸjj¾=¸8=_W ¼Uõe8îò—ydÙâhG•Æÿ4ÈÎXbée}Ãá[Ù¯·sbõ•Lžº|’º`=ºìk·E¬VûÈk~®e žh4¢ì´…oªò¡¼A Ò¤¼ Ã2ðG}À¿þhm;Öñ³-`q. &ŒÖ¾*®Ê¶Î—·*ÓDóv™Ä¾˜„"ãJaòRG>Û€†ÆI¥ äêIcóì%ên@?ÞÎD{Ù\Á5\òÊЋ›¹›[ƒÇþ`…M’ƒ‚çÀ,e „>¸kq¦)+ÝÆœ•7C0MÊ ƒ=¾¥ÏCĵÎÃ!\“ÐN’Î#”N=NQ@Žþö3ë]irnˆüòj /˜o_>6 ¾ ZO% žÄÛwGD„‡ë§¨6R`ɂӄø™ ãPAüQ^KÝ`¨¬¬«w¡Q* ˆ$ª„AëóOŽnp Éðó_a˜fÇ;$Kµ|ðÚLëŰs¹0É9\þ¡Í‡ÎY@[p'3GE½+XŽ™£»ˆÕÜÊ‚øæDKüúâñ_èÉÀó)k%®¼>}‚©nÔ¾¨á¥Mƒ¥ÐÑg6,OT«d¶‚!ËñW1øþ¾dJ]õ8hx¦¥"xLašñ¸tç’gÍùÆa?°Ñ0æ€Òÿ@fAþïöuÙîI£ÓØN åüu͉’‚ª|…¬Iè?ÿ¦ð×÷ÿXþCïÿåãâüÓýÏÜÿ¼ÿ÷ïÿVþæö¦nnª–^š6ö¿îâ{bcoùä÷jæNööÆÆV®¦ÎÖÿµ«€ÿÖûÿÿ¯û?ù¸y¸ÿyÿÓßLy^š›Šð ós› ðð˜Zð[¼â}iÊ-ÌoÁ/(ÂËó¦ïŸðÿþOõÿ¿rðÿNÿyÿíøÐ!¡êÿßþ£û-=Áô?î  ×?]Ú)ÌÎËÇ àåágçü×w†òþÇ%µÝmìÿ|ß'»0¢ ;0ÿ?o•üÃÿ¡þÿ—®‚üÏõŸG€W@ðßÎÿ ðŸúÿ÷€ÿホßÿØ\ÖD„øbýËý………””κººÆÆÆRRR ÜIGGôà÷±Tþú H*Þ?]™ÕŸ>ÝSß{®’Ù \Ã'á.1»×e9?WoºñØFEÎËÉË$MxóÓŠÿ‚§q\dÍ£HA¾†$æXsfŽR*2–á§VÃÔ2ä'Û¹£Wv†¶›N7ïv°+°ï-%tTUb¹>ƾÀ+E„ó—ZiÏOL>ûØŸRû5>‹Ýù2 &~ôå Ý\±Þª+ƒ(Ð÷¤“xþÅç… 1£ñÓˆðöŸ­ô‰ qê}åéÇxNWbKFDó—ž¼KƒÙ’¦©ëßÓð[‰j· y‚ŸÆ¿˜°m3!Ý-Aò¾9J¼—jàĹ< â¿¥;eÚ· {+±/>†´`§EåÑ‘hõøäNã¶Ñs ëfe£ŒÞ×øÛäöàal‹-{—ÿY`¸â©»Ú¢Æá½‘Ÿ£¥Hó#VOÞ_Dê`´:sqrN»}¯d¸0Î~@Ýæòl9p_ gGö0Ù|ní;¼YxüçÇi¢ý_Âæ1¼/>ì þ,cÃÞ禾¾4yyØ·‰¯†|ãlfûÝ™0NâMO  NPŽÂOÝ Ï wˉå1‰Í^?®÷š­Z”­ƒ½®Eï-N½ë |í ~±¶°²Œ:B×;B ón]éz±op|Af.·'š#&aÐR?ûP_ÛÄüómÎ;›1vœÁ]îžš»8û/C߃BuH'Ÿ{ðW,î½{¦¶@(Å'™Üm‹MìÙuÉqOXÎú¡pKe¤„ßÃ^+è°>ºÒDû3‡„þs<ë4²ãÍЃØùøÙëµom«\C%G‡Ôì•D‡#ËQnÔ~µ%Èâ >ÞçQéqQ|AÈdϵ‘håˆhÀˆÉù,")LÝö®àWXNMÊ?Àz~ãMÉþ³˜Aéñm"Ùp¼7™ø£¿ˆåƒLôÓÉùgWñj繑$'Œ¤ëí¯¸gÏÓÆ.¼ÞjŠŽrP3)ñöè=‰6|wY œ¿ºsçëîfª˜$îÜ^Š·¦M,e ÆÞZ\Ë€úF˜˜¬èП±¤|ñq“sÖ»Ôü,Ó@ÉŽYXxRÄT|_>x˜(‘'«ì‚U_d6óíïtJ|ÁÄB;ê ¥$8¦Ñà„ß~µU|Π”{^O­ÔÄxü Ýßðnù[ä„õN'–ˆO¯d¶ã ;Ù<Ê•½°yq§Òi • ~CÍÆH‚o ú¿Hqˆî›ì,~ËѽXÿvq3Àsчtx3¨· ½¸4I~ÀnwÊ?çUÛlöË?WÞoÌ?êb¢Õù™|k}‡sQ «`ÜNç§ßó0Iæ^ªm‘§vc#€óù‚“k2½õŽzóÉM×W\³a–Vu² …ýMõ¢ËwËðKЫÅÇûÊíÚ"0Â÷g—´? UZtŒ¨œ¿ˆç§«\…_N„ 3 _hL¨ÓßÌ'¯‰=ñôß}Ãc#¹õñÇMN‰Ã3Ô¨ÚÇ-˜‡lSz²ûUï×ò’×.g_-ê w΄aΧà7¿ØÇÂOOUMOl€ª´Tþ®”ZÀØÿ²)¹øœ×(¯Ši ÕŒv1£÷ªi-¶Jq€é¦V¢Ÿç ¹›…D høRèü§4QòIFÑåÈûÈôö Ëòjó:‚Á{ÿºÕ«ËëNx1 ¾Ï#ãñåÛgv®Îü»>paì«a!ÕáÈ]¨Õ¾25Æ“üˆqðÚ›ï9¹ÀNÍO}™IM´R“¯D˜—-nQ6ÔúêÒ?øç‡•Ÿ›>hqÛŽ·Ñ­¤ o»Û%9¾ç±Äâ\3jÁzš[ùA\$4ãáîJ&ÑÉ3©œU~ÛÉõO±£ ‹h•ƒP¼„¤IUÏv·ñÙ‡¨Þ<ÏäC,øñl£uåB³³Ì‰*M6‹·î.+pjŽ~œòãô½'Šðïy”ö ä‹ßÿ}Fù‡_¼¯ZãSNI ÚÞì~ó{SääOG'a×´1AÜgâ¿j]~‹¯K¨ó9…‘àèà[! PqâæÊþ••dL;å ïïöE5ªÄRùõ*â^S_œæ™¨|3¡8›:TŒàB«<1*ÓðE|nzçŸS¦ûE,`Ì·w§&¾ðbÃØßÂÞjÞÚo'¬..q®UìÖÅŒù¥§ºK¬Î+Ngí×S‘•|uÏÂP[–&6Í^ã´kï+Maí æ,cÚ·>!+=©&tµ¸ú\š{í«öuoÙÊK@ø¶MþóïÐe@†T|ÏGìÏNC~Oµ<è9Þy}Èzxýhè5F”ßÌ'·v¯·þËÜ[ÛmIÆ­”s»öè9Œ¶/Ý?'¿:Ç|C‚2_¶š˜ê í÷w+rž“ó¬ ªáKJ¼¦f÷¾©ÿ¦ó¾“^Ýyíûùï¤ý+’):ôï‹D±Ò›ûÛÚ·‚=-\Ï÷«¾?9êpÊkŒ_vì7%-;O#éMÃ%“¬è"]øB~½Ð2Ï@ë9ô¹£7UEüìîñæ‰d’eK ‰§…¿kJôŽÛ ‹¸g(+3ºò?JàÙ?·01î ¢5ŸßǺo»{ÅXN–(òpÁqAâäF¨•À?éÙOR£Ÿ K^i“7íÝj¡óùÉûË"‡A·§ÚËn×"‡ þ«þa÷ïƒå–qïÂz‚: —÷a»Îr* l-ÿÑŸ?u ù­êÝMÔ‚ZÒü¥«™¦wDô©Zî瀋~ße©ô˜*¾Çg9híùKÑÂê‡Ï+1ÔºS ýlÐד|˜Hµ›éDSh1>´˜ñ5âÓ?„;šr‡Æ0¡èˆW‘g‰¹ygÐq±fûÛR‰ÿJöKq°f_xk®X®Ž¬¦ŠX;J:ê·y»Ú .[w'7í:'=Ž'U[ô—שùàÓkUиúÑæ0°;yfd¤µí&ˆv[¦›xȯ}©o–ÛÆ2AÄŠß5¾?W™7²qàÈHX ÓÝ›DR5ç§÷ç‹ ÝÉ:å¦eZâÅ3ú5¥¤jôæû“Âg¿ˆ+×OuX³Gw#Nç1WæÚ¸å½FÌõå7Çœ>í›­î Ó>ÙGH„TÒ>Cü&¾?§òÊøq}û3Ï·Ò…ê÷7¾‰øñyW›ÄÓøyÔ'ò1£Ÿíö-®%¬-tdû§j²Mß«4ƒÜjWŒÐýáþJk`“Øð· ó–·Uí"ú®\(wIá‰ÔX¼$ß[ǻ׬ûZç¼£~f-kZÓ¿eè8ÀâU4À‰= >%~™ .¢—$BÄÑØðˆÖ¸…W-ñef§Õ[33²;Hj^w‹ôn _˜‚Tû!k`õñAêC¶ å· Î[¸_¨£_ÏΠI1²õŽ|þó2ìýšGA‰–Å Ñ¡ìÑ7Ak_]¼vnWž#°£zK¹ÉŸd«¼eà?û/μ©/¿[W/Æ[³‹Ÿ]$o†`~z-¥Š|ЍoE ù|9ˆZ}Ï-äUövos!Höò¯]™¿cd‚¸îfÉîPäZMúˆ˜Ú‰êüÑ H1ߤ*.UØÝa„§'^¨ó-YLä&vNÜXÞ1ÛJ.É ,þËÜ/h8§~\üm2}-ãlдT­ŸPvÙlìN~«’ÁOW±Š3êï ªx–nÌtS‚Èó\kÔß=B¤zm?!ç{©Ä°?´ŽÒFR’èm±r{Éåc "rº¹w¿lKŽÞˆfŽR äÐF³-ë ,À—r×F–í,ZÏ‘=廢˥4IZì Û6¥Ä®î*E¡"»@qkÉ—Áˆ¼ .7Ρ§uù¥(ü*†&ûÓsH—ƒ_^€ Bæp°ñ˜2m´Jz¢U[Ù%FãFdzÑeTRfþš¸[óâÙ³®/Ótç-™Güò=½\…â- ¡9Ý\LaóvÂÛ(æ7št»þeÌ1 >ü,Q“±>r|mNþ¸¾jñqÖi} ¯oj¸,ÓO‡rÀ¾,»?ÏåYPÌ'¿t+q>óœ7Éh\Ùn¥ƒ{ª"üQË^/§›…v=—‰ÚÚé#š5Üï.ÿè{&ˆ0œÇÜþ¨éaö;µÇÓ£éö­ ·óçê_2ø•®YŒäÐæ b‰ J¢ˆrNf;ì8pÆß:;šŸÐÆÛ]™·s;ï Ñ]·d²_Øež†XI¾ÖÄôg© |ŠïƒÑ€ö*ÑX¦Î…€ž"›c׳¨Ä#Uô›Ø‹<—‹á&—ÁþËAÍ–ÊG9E‡ù?Glüm.Ü©rhrÞ«Ä“÷õ?â—“”ÙC•ˆUöH@’)°fžKÀÄåôã¢ìB¾Ÿ?;ve—*‡4§Q we5ž*‡¸]ïWóve·%¡í[È2O^U¯ùŒŒó²@ Ó…wü`”Úøõ‡n[Iÿ÷LN‹^Já¬ïç¿sîføÓ FK¹#ùiKݳõ”^]bt!>¢:¿8ÿÑFï>‘sÅâј=ðsZ³ÁÇc^óF …l]\EŸÊÏ3ËYž=Ç áAAÓT•‹ ÏÓçj*ªü›íç .|ºPœÞEd ÎŸÖ¾!l{6YœãÖ÷“Ü¡2l• ’Úþ¡v=¿Ýi²a¥ãçølÐà&à¡àGWçZ‚KíŇ/—«ÍŠßh îæ‹lw¬Ï(b?û/Íï‹zZ¹{\Û蜶ϵ-5×éì"89é±û}ñÛõN ÅŽÏñdðÝǧ‹/Ð æ4;· ìWû«x_X­wãL,Ί5ôîNÐ3N>¼ ª{Ue`ÕÚp`"³û©fÁ £êûþ|ÎÆÐD¡ÅþÊéÀ}ñã4ƃ'2Þ(½mÚ6£ügÛ5#:Á•õûyÓÇ½Ñø=mÓœ˜Rž<ϾîM YHîhíµVkÿ{Ò·^Þ<Ú­qZ}à)àßÞ­ÊŠ»ÀÝHªIØ64˜ëI”¦abW…ŒTN!NõL #kͤWÃ:­¯ÛP9ôvcÿùæüëk'ŒÓ–MŸÃÔ)Á–ÞOãKYK‹Ñ­B¹ÞêKtB‚Ðg Ű®i®‹²P½kë¦W³/ýŒÓfòÃ-3­Dgè}çîÇEg×ûs¡Q½ŠfŠã Ù(E"ké½Í^Å‹S‰5=Òå[f¨Êûy:3K’»xZH5ïÇ¡2zº[ ð.¯N©ÂÂñwè|I/¬w¬˜HY}ÆßT§£:W}¶kÞÒY8Ixõ ×sÅ=l’pé°c&*sóƒÞ¤|ç5'ÎüãÂ'Ü{ÆAÔßÐŒƒÆª bh°nÌÑ«è«"pÙÓ×|u¬^Ž2ŒKÏíiõ¼& ¡¢ÃoJ Š/ô‡*"‰¹-ì¼ûÀoŠòàYSgç$!zø·‘‘‘eIsE›†Ê9€çÊ9íòS™}9&·ý)'Nôð'­<‘ÅÁ‹Âw)2;_zÍ3£t‚£¤pÍqø±œ~Lž[¡DÅsηáŒ$Ù=©zÔ• ÓC+„ss |´^͸‘¶Ñ}'¤Úß[3#¸¿jI vth}½HGëð!_I«Ïä£ìñ†4ƒwð9•Žóë,¹¥ÁˆÄN§>òè¡›Iÿ¤æó©ÃG füR‚Æ+[‚b*mีÞÕØ‡Tyø™ó#ïåÛ0×bÝǤ8-Fw™îw{ ÝýÚ)dÚÀ±üRé\Ãz7ý klm^|Ê8Œw"—i{õ˜_ öç„‹VØÜ‹¯šq[—l:Ýùf™] AÛ«9Ó¾>9—V¦–¿ŽžR" ŸŒ#¿¤‡_ù'}oúMN"ÆTÑ¢B¦M ¿1¼¦âÒå’þv\xêòżÂÄpdÊÒZò9 áB¿ºzÁAóckƒ>‹|«ðÍ%và¤p«ûg¾½ºm!{DQaoÞ|؇†¸ä-§øS;’#Éq|/sÑÓ&t¢¨Ü³n¿C^ùúй—Oݪ,‡ÞúÞ(~„vvÏJVTõ}ò2ûdkîQ*3!f…À¶ÿ cWPCíûdû! 5qUÖN`žâ Et]{‰'û<ú6?Ôø_˜Ž,…fÝ©3Š;ÜèâèæÕ~Üä Õ\ìœçºöb^AÑ1[ìï'Ñe¸·zù¹ ÊêhR—Í~úMOvÀ»*Œ¶×²£^]ˆ`=šS¼t—Ì—N¾î·Nž¦Kíæ,ò´3œÆë¸*À­ÕŸ½½,òŠþ7 I¨O&¢`ç~ ‹¿mKJ¯EY‹¬Êvç`Ü›£4d·œwrètTÍ‚Þ ï¦Â³ŸN½­ë_µP›2‘Œ>JÛ £›Á(ž0î0|@qSpuQúˆ{æsðµ¿ÇŒ,>œ–4çò­øy[¾ƒÿ™No#“êw6oÓúØÿ¡Ì–ƒ‹"ãA[>΀øKÌGKØaRùøA|Fï§ð¤x¤°žùC}µn(ÄEg\_±=¼{(âxØz~3ï5Ô…Q¬Ø}~9{ÍZús–€÷nTòU<®µ^õ+É*69¼·ê/•^ä5~Q ­i {车ù+‘n=’¿ÔäÑ>¦E/ÉHkD¶ÕEÍ냆åý%/ƒs}CÕýÎ…„;Í q_º™8çuT i£ÖD‡å?=©M‹|F‚ªí›?— “ôáÌDrÇäN ï”êC‚ªìmad$·É0„t¶g,>ø’n}Ö­r‘°ÿÀ{ÂËÇ /ØÀ_çžOM8wM uÞ¼ãç>£ð×M ýÛQ¿‡³×ß`%¶ª9?Xö«½rÙaq¦£ôëXžd~p´Ù*|¬°8ï…öŠòNús¼cõ!âùT2ðÖã“ä—E ³ßùÚâøM˜Zíeÿˆ_dÈ"(Cª0 Q ßæ2é6O„Çð‚¤-íû":'ßoQÀ¸¬±i3íáQ'ŽJýåñÔù‡¨Ê󢋢=&Ù­C‚“ÇŸ×í^оˆßtÝeÆ‚jä¡tò˜ðM4ëM›dZ´Z¸6ç¿0ß×î(W©½<Þ x‘yi´Ö‰ìsf+©T}K<ûqqúfu‰ØánéDòÌMIðþ7áíç­íN“|R9ójB}Ó%[¬Ûòã·×‡ýF.Åv”/}´0·°kgk%\9\ÐìøM|x©ýuÐ/*âÝ'ƒE«ážSõœúG)y§d82ïÀæãˆå›íB3ó¾Ù;Y¨ìBÛç÷[-—[ÿ³Öð^Yõ¡ƒ»Çˆj¸~V\áf–Ì*?š,<'¢ýã]ñW›å+FÊÉ_Ÿ?GzNqöo_óVÜCIö·{ «÷­]cäJ%:J;ž?}:Ä¥µß©Pe…ˆVm%Ǿ-^Ì.д$üñwÌaÛÔ!ÓK…ÌË>–+‘S#æÊ%þ]os2ss4÷#:–¶KÿUPs¿ÞòŠOJDAªr>¹#¨Å©ß¼Ý}©pc}äzÍ rA˜yùѪ†jéð_æ^ .²êêýáÝÄn4"nãö•q÷~JZîdWnÝåeVdTòš©TÆH12q¶#ó—=oÄ!à;ß@ôõå¨ìOˆ>"7¾Õ73ælm3­ç‰Äº>;}N¾éçüp28gbÐZwÙ8|½ÚÕfàëdŠêåï±Mµ1‡¶Û~î‡ã4݉~Óbœ÷é]—äEðÎÊ`þ9Tˆö„ô`›‚-ø"aUŸÓñ@;ç å{âæ,YêÍüHóÖEXÈÆ…“q³ìîá1íÈ%ÇaÈê&BãZ÷C),ßÞÍw®[ŠŸy!ºIÐÎ~×dØÙµ÷Ó…ñY@¢ÄÏŸ(Õ¿©XIî`ŒßŠüd ÀÇ´¼c è,Âÿp‰æõa3Áv}ª/‡Áż–Üþ ÕiP´¿. tgÒiû²}e%sî±ì¶˜¿ã=‘|Ÿ¥òÇw#¬¡µµ÷œLá êÉ ¼St'±Û…ô‰œS–oâ¾K`}Ñ_s Ù¬ ^N¿ì¯X§˜Á¬X^ÐA °TZ'¹ïµÊ¿t’ïT‘íßâ´Þ2nH´ïJp^¸]ýJ¿6ÙA›§ó38X?hd?9{óþ|ɾ„!ôÅÁŸv:ˆÊ¢}»œ(jx‰Eç‡ïÚŸ¶2ù—»lî"h/D„9QRšÞ÷¢‡÷ø¤é¥¤_šä~ûýÓ}ïÿüõï¿/ÿ‘þüü‚BB<òÿü§ÿßßþJþB¦ÿ}äÏûOùÿ=à¯åoößGþ|ÿ”ÿßþZþæÿHù ðòó ðþ!žÊÿïÿVþÿ¡ÿ—’£§¥#âÙ‡ÃÁÒÁ Á‡ßŽ|sÿÿ/Þ_2ÿåÿ%ÀÇÍ/ $ðËÿ‹‘üOÿ¯¿ˆåÕä´ôÔ`­gOêÚ²O•äô\\º|r\\òZò$ðsró´\MÝlÜmœMí¹¸Té%±ÅõIqkKS IqKwS€µ»»3‡¥‹‡§½œ“£;¢çphù8[ÒÌÿIл[z»ÿîubæÖ¦®n–î6nNÂÂ"<¿pºÛ¸Û[J"z!à_º¡(àÙï®xjãæ.ÎõGlq{G;€µ«åK zNN.ÄŸ…“·•¥#§¹›=ÀÕÒ^‚ÞÍÝÇÞÒÍÚÒÒàŽ ãOÕÿÊ€@ÀõåfN>ˆƒ héhéjêni0óÈÿÀÃÉÏÉàà@ä±°ñüÖ zG KozIqÓóW$9˜Ú8þVzÉgˆÇÇŽfnÎbê¦V–â\¦’À^ÚÚA«¹µÏŸPÈýÊúðŸ“þ&D¦ŽŽNî¿ÚõïýÁÓ¿ÇKÄ`àö§ò¿†ÿjqGó_½Çíß“ð‡tÝþ&4VöNf¦öÿžŽÿ gÿÿŒbiÿ‹/Ìoâ\Iÿêà<’ÿËñð¯;%"§–µñçnm‰èîÎö–î–{D*Àé%àOƒ'॓뿢ÎÒþ¯)³0GŒÅÿ»øO”ÿ/Ó5€`ãhnïaaãh0µ·G„¬-]m~uì?ââÎ’âî¦f¿4 wwý3Iˆô_4#:¶»…äBéßà(ÎàÌM/é`laéìnýW¡üÿí¿o:"å¯ñ›;YXJ^8»:¹[š#Zm(Îõ;ê\î®ÿ/Íó«Ñ®ÿ–¤ÿ©Mþ[Üúÿ$h7sÄ8cù7·ûoÁüïþ+éïÓò¿YL¹ÿ7êȬ¨ùo¬bËß¡ÿ[£Á_êú;ôÿÿˆê­ÿ‡lø¿£ =øÚþçËü7µõÿ–Rü]ZËóŸ´öÿLÔÿ£š/@/‰tÌ-ÝÜŒºfãþ‡ªkš‚m~‡ÕMÝ­µMœÅœÿßã€à_8`méíæîа7~3ÁÊÃÆÑà`êmloéȰúeë#z‚»+;à7´ÉÂZVD©_äüOâÌß4òþ…1KÀØÝÉÎÒñ7czÚ¸º{˜ÚÿŒGÄ,øŸ[ÿŸâÌß4~þG<ù³ùw>ÿßpàoGxÿü£mIÄçï-qkW€›¯¥=ϯ0 „úº~ï¶IЛÚÛX9Š\m¬¬ÝÅÉn¦öö’ÙZsr¿ÿ üó÷Ÿ¿üµüÿ¡ç?ýÓÿã-ÿÿFþ?Bÿ”ÿßþJþÂÿüþéÿñw¿–ÿ#ÿþÊÿï-ÿ¨ÿÏ?í¿üµüÿÙÿÿ´ÿþ.ð×òÿÇÚÿˆA_ñüKþ<ÿÔÿ¿ ü[ù;Zz»Ù8ÿòõ16öp·±7¶66þåKò_;öõ_à?÷ÿãþóù¯¿åÏ+$ô€›úçù¯0ã5à31ããäµäæ´4ã1áç6{iÉcñòMß?áÿ-üõÿ¿rìë¿ÀÿNÿjÿ×ã?//ß?õÿïÿÑù¯ˆžÀý¯z¯_'ÿøÑþ8Å•G„—‡[€;ß¿œ+ÈeÁÍó¯ÊÚ;YýK>ÁßE¸þuDuܼ\îÖ®–¦ÿ’W@@]@€X° üÜWÿŸÿ5ýÿ/ûú/ð¿ÑA>ÄbïßÌÿ¼üÿÔÿ¿ üûó_‘¯Ï¿Ïý凸búÓù¯äääœÿúÇ™¯RRRAAA ÆÆÆttt~þÚhvgüà¯}hðçÃ_ÕܦÁdŸŽ%ÎÌ?4œºô§òì·hZº}³Èšì5T³]L;šLúþâ{ÚÈë,8zN}G˜c0a‘Ôè–Ôâ=Ù nßö·DW#¶,RBåOÄ%æ¹;hìs¤óׂÿæ¯Êê~¿ÉŽÉ’ÂïÌ´üY3ÚTÖ¿úë#›ôB^ø<ñ)¨Êfb ýºLáìJ eÔ½ÚY<²¿oÀ¶é ÛÉÔ¾§~ß3ÒOÕ·‡‡" A7ù¡…ïßLj¡±ÏäÈ~Úmî#óŽÛÉ@v&jŠ›éU•ºÊÙ±³RŸé$ÿ¤T²›€òЖЯ&ðžwïünµ²cûãùÑ<‰ŠgÏ;ûHßñ纙ƒÒ$€~i tý9çâ…\±Á}ÇUѦ׳ÍžÁ•_#'ZçÙÕ] ]û?7ª0q4ý&é)|hoÖõVísÁ\ôÖ;Ž‹ æC‹û¯Ð«Û”kÊ-þ¿žƒo Î-膜¤nñf¸0‰û#ã6륊8fªkªìÕÛÒ^^‡1â½ 9ê>™®Ì½)¯2Vºœ1kO?jè TXuŠº-ùª698/‘Óýý[¬M±Þ%εTÙTeÅMDÀàë[ì~ò³¬ÎB›}‡†W<“a§DÑ…)§Vƒû4悾ÀˆÕÞ³ÄöZñ8|·ùªJrºÛóŒÁ,ë€æ=Θͪö“3YÒ™&qqQ‡¦ ýâžÜë*ac.œ16UR?46K‘œCMÅ•Ò7ϯóÎ'†rBί›vuG¬ŠëwùrЀáÆÁ sglœRSû8×íûÒÉç׸»ˆˆ É5S&§ˆÛþ»±^žQæ´j ·ÊÆ.„Ÿ¢Xà}u•1»nK¼®ØëƒôJÒÌ®S_'GF3~6³ÝåºFo¥…}ž‚³Ôâ8RSá¯*›óDœ½‰âÒB5]PÔÜ5ŠX}QÕÎÛ.O­­åÊ{¾‡Q×*¬Nñ5‹™ÌOóÌ„÷ëõXå¡Ê(ìXú™FÒ…~óZZÔŽÕó¾ÀÇü«`ÙêS´ëèÏ=_u%«sTô®W£Î¡·_'+9²{ôÈqX׬è>RoH{Å·!Öíäß­èrö‰T09™tX„ß ¼š¡_]äõjÞ†W\ð¢ Ø­û÷Ï ö,¿Ò¢-¦ÏИ=Ë8¹_á±\ØwÌxOç|äz‰Òö}§f\ô¬Üs—ë@ì6% ªÅð¬1ð“’ÅÕãõ³)Ñ3¹°3?â†)§¸½ ¯g÷ ý@W.¿Ÿsc# Më“#üO\¢øIûýsv«¤‚P%í¹#š[ßçÎØg[‘)èL®·Ï©²}l{2³óa‚ÊËñVþŠ·û¬dïçÀàéÈ‹ÓÜDaÒíÚæMTÃéÏÚKæúÁ7×­Cî;ƒÃRq¢íMK÷\¯ñÉoõH¦°îm6ÐðN—Pü¨}Û[%ˆ7ûIfrrG¢Ž&6ÛÃoÁdž𹜙DA1›ë!É–Rª‘Vs–{r‰›?©óJ*Ô‡$z×=rCÙûM …^CÀÁóó ŽÕ¨†k½ë"R™3•X7y믪:‡®í†Î¾5¤¿2×/^8G¦3š”’ô6 xë{ؾp)r#$tõC*`è,o Åb??m½š²ÊÿÓå—bYæÁ黦3²ø9¾ýȆ€ø³*s§ 5ž{«ÝÁ«ÛõŠ÷µgVºs}̓’¯7ÎM&^Ý.~»¾T½ní)Z L 4ÏN ˜ËÐ3âws²zßhxvˆvÑA×*™ÈÑ#þ¾¹évýëúÍ-ÛøÍa¯x6çõ£ÜEA†K=¡¾ØQóÊUÕÎÒj:”)ÒÊÁ;›ÚŠìæ”ùêggÉ^T0ÔÝo1å ÷T3âó¨62Õ•!ZéƒôZs Í©s5tA㲆~\‘OÒ\¿öÍŽ¿Ù¹ÕKÐÆ¹½C¿óê’ôåzÔ¿+i>àªÍ_Þô¤‡©‡¦$XÂtŸ_g´4æßIóÝkåñ¸à¨S(”–hGÓM©“v‹=ßÖÿzNYvq§I!ã¨Ò>½n‰¾Y."‡Áfä§%)aªØ®¹$×ùD¬’{Ï÷t°‚9b[ µà1H“3ÑA©%U 4¹A¬ut]'[;)Ta|ˢQ;?–~­%C{]pÊöFj¾Œà®hOߨ€ù‚ýkôUüüƒÃœx»ìWɃ*lR:£;o,žc}ŠîlµAtÛY Ù*÷)¡bãÆ›K ¾LÖ÷."eb'rBÄ1ùm"·%•<¹’hVøÂ.òü:t~ÙO™_K^ §½®Ü«EbJxv™¼œCÄ?¹~‰.ùuµÔ¯Y•z ó:XBí1‰JañUÃó@{ºŠˆÛkÙ}¡‡S뎵žÒ%lºéëœy÷h°®‡ÒÖ/%5NHnM¼ý(sšj¸+†g䟱ò³¯QÔ³¬cS8üá>³°ã™ŠÚMZÈRîxýhž‡E¾Êµk˜hz×éH@SÃmÞB&z¹cg}SÒ®:äà0…/L¼3v‰×U„¾æ¶0ö /o’¬ë® ?ËŽŠn—Žþ’vÄžšß$ic þ³ýüåÓIE-Tý~¶ÇÌhÍ2?º×̧^k(\#fc•àš¾¶Ð.Ò La:Á­—Äý³ÀR"Šê}3ù~™€Ù›[’7ÍqVì1bäÙ·,5¤3^QRf×ïÅZÜf;üÕ³´.5¸ŸõìE*mõ¯\Ú¼’fþƒ±íR¥tZ<ºO¯Oå¤ï•-ôÑöO®Û:‰L¹»)‹±”ÜâWÑqi,,‹Ñb®fé~û …l~f˜ƒ–¼v1ÝmùIˆ¬>7xæîbäîò­ì¨LiÀÚ¹{U«wñõ²0dfîJëèN¿äE™&V¶Ðåï*ÎdKq\ݪ'+´bËth¦èµí*©0æ4áýdÚ¯L[(A]Û1,T|ÜóðÿÇÞ™GC½ÿ|“±…±ï3LD¶™1¶dÑŒ%ÆR(û nÜQö%Éö1CRL7S(Êe»%C’A¸%ÑH„d—¥¯úÞûýÖ½¿åÜ?nßû=§ç™sf>óy?çý>çõ~ÞïÏù<æýŠÐ@×D³tW‡¾¹h´¸;¶Tkڻĵån˨ÇÏ™÷ÁtÊ‹P¼¼ 0Ï‹Bó‡²Ý$Z×òìäWogùÀ„&[Z6BÒƒBß’ëÜ÷ÜèÛTÏÖËrR"¶ïË]È0﫹¾´hgº¬=Xƒ; GÒI®ÍĶr{[”>©TÙȶóùûªƒ0#mOZöm ÁA|z©F¢£ÑüPàÚ¹hÊÉ¥4ïÅ0£±éC}VKþ“ kš‹”Ho¢Áà>î±ÛáàÁqñeJdlA Á`Fc™²!¦¹@ÙÐV½GŠ7.ˆoHl%ÃoÆr¦hÓŠ]lDè ÕeÔ[i’AçIƒºJU’AZuªÓÖ¯Q‡ö3^²å¦;mß*µ«pÖu:–Þjµt\´wS©K¹}ïÒqðêÖ‚ÀÀ¯H2±¶ÙË9ØÉÌÄýþ”Cus¦ˆ#¸²‹YvéN5°ã@$+h¿iÁ»ó¾ž½w¼ôL]`wšÛôA [³ëhRsRÖDìǵ[ÏÝH®21”­ý¼§Ûk7Ô+oð6ÑßlTÕä9-3œ,èU4¬°ö 8?¯N}µGÔŠhºÄÖ¼4±õK-™x¢pÜÖB·‰¾µâRhÕ“5œ”Õìgß©(›85ÎbvX»C–µi‹R½D=#¸ÕÞÿ÷”Íh̨ٽ­Áò¯MÞŸ¤~œ„÷ºŒ}º™ù¾MПÖ×÷ÿþó=ÿß7ÑWñ×ùñ?ßùo¢¯ãÿ7â¾?ÿý&ú:þ#þç;ÿñMôuüÿFüÏwþ÷›èëøÿÇó?kji`¾¯ÿ¾¡~ÿß?ÿóþ”úñÛð?¿Æý™ÿùžÿùÛ½5écܽQšêX/uwm-¬···—»§Úí¥ùO·ï»þZýÉñÿ—ð?X êëë?…Vÿžÿõ›èâÔÕH^_ö„ö‚9hu”2Z[ŽAi+cP˜ß<žŸÿgüûÞóiß‹Ñ?ZZÊ(m,‹RWÞ ðÀÐרÉç\Ã$÷`÷;5?U…†cÑêÊŒöoέ‹ÑùÂùeeXmme´& ®©£±ÕÚY4ÔHž˜ÿqùÕ©¥ñRÒR×þRÚª Kú²²_w-ø·OSG¥©×úœØZó¿Yúsãÿ¯àPXŒ†úÆÿ§ý_¿ÿ¿^äX÷@àÆÏü{{ÅôÖòWþç#ôÃ?™v1 ße~öû þ1?ñ¼6ûá¼wõsÅúÞ€ çÒ"ýês 'uX,ßg„JÖ_êÛ•yn‰a¨V>Ð'ïM³?0ÒÁž7¼¯ŸnÈH][a!¬‡ùjAQ&Ö oeÅ×¶[Çãð`(OŒá³ý·\0KgslÆÙˆ¼ÂÔ³»U.`‘ö±ÊUx€Œ‚ / $A±UïÈh€ÌzsÞ”Åg?ÔŸÜ@4’ç³¹Á Ÿ?$ˆ›ä·kõð#Biæ1áœ\ œŸÈúUX>¡W~·Ðž_ª“ñ8Ëñk .qDõâcûkNª¤bJº,’8iªa—Ý_i»ç8ÅÎ5(÷ì™6yú[õðYSê\î³õ¢±ó0º¹,R¾/x¿œÍÑM±ZáƒÓƒ¦G]!f~¦•XS([€ùð¨Ìй' ß~†û†‚Û¤Ò&6ø%eÎêW¶éØ[ͳ| A»qˆ”Öº4•·\3tvu$‰‹ ³Æ^.dpÁ +¸L,7N¤®ò’}8ɶ”ÕÆŸ¨.ÏŸiª”ѹJç$(AŠÿ®Ø{kÔ·€é«Cµ°ÍÌrgÝéâs¢cB·—ùËYã©”ª¬]£•Có ÏzC¥‘e¸Ûþ¦,È ÐY`!(úmê^<ó bB¨hÓŽÏvèfÎ¬Ž 2^Çö72JU5¡„­,ñÄ/L[‰–Ãëa¡RœÈ¡w’"©ÚÉÃÂUjúI5²ìPB}]Dn¿G#’Ö 0ã㩮΀á Ó«u%Œf#ôìLy@(œQ¯l¥»[_//T\-fï'ÙΚl‚‹Ù§:YMݯ«Ÿ®\×Uš¦œ&=mpÛS!ðCss†¾÷ÑGK1²ãZ܆ñ•=롃zqï.¨#{4á@{³ÝèL|¥3%‘ô<Ë[õJ~÷å±›Ó„×–4aÚ±X÷ÄÓñþ ¬+-Þxœ­²gpIç8Ÿ‹œ&¼¯!VüsÛ+ï W@^5}A®½ª3 )GûàÍÚ®B±{_»G"œ«lé±'o²è¸6ã&q E‘;ÙïT³= ±Mš¸ÉûÚ‡“sÂ|Ü~;?,¿Ð—c7š·T€<?)Ç6Á5%“Þ½™0Œ ¦‰\“(J7ë깚gâ%s÷·bƒ«aYL?áb?¥äš´7ÑæÁ?y Á§Œ¶õ/> -´¹EX\Ÿ «X [”;îq·˜î\—'EX2¨ Ý~ðÄÄþ¹Py0Çݤƒ¬ŒÁˆÕá×ÜOÕ{¥=—©É{0Ó£yÜãp·ÞΡÎtäÚØÙq‚ÈüÞ¢­æû[aû#'öФx‰/2×Gº‚7äÞ²¡L·íØr(#®ŒÏÂùÈi.a–xÒÇÐ{.úásÌóå«…µÛ|sf§?Bd"ð ËÍÆ•ݹöÜè".ñ‰Êµ“Ž5Pߢ,g®Ëšy½O•Š ‡¿Jƒ½ý³¼u—kží®~ÿº¬ØE=¾}BáUÙ3R+Ũ_<5—< “Ø5dè¢Iϸ(»v3†üøÈ¬‘O€£!ÚÂeçguáôáˆ6 ô×Ãíbdlô³Z¢ÿ¸¦JëPu¹ý2Ô/‰ú2]Py*Rú$·DŠÜ2ÍÎEÁ< å0×-ýÉ83<¦ °ËWcM$×7;†/ã˜_@8`nÃ"ùh“9šp¥‘ÓP:Cáhù¤uõVa×_\®%WeW÷ýäøé§GšapÓ^œqâý…æZ1Qä[ç–”7ñùjÕÍ$0uâÙ C–z§=ð+1¬ñL·#‰í“n—Ÿªø´‡¹£ç$@jZo§ZùÜD²«Xz×Ç0 j)Ùù¼3æªkéóuâŽØ¤BFƒØħ`W<';¹xä|åu$[ëÉ·“qA÷wfèwèã{˜g‰6«>rGÒ^²Æn}–Ž< zp›.ÿXÔ‹ß×G;‹:–“ÃL'n£3ÛÛ¹«æq1L€(«ìŸ¸?Ë5×!%cd¢pÚÓ‚?m£+ÊÕ;2¶ê÷ºïÙõÂú®€r6"‰yŽ¿1ÿÁ“Ù³{’Hýj%—© A„Ž7I†ì2Ñý¾\ÌÑjZ³§¡ãs¿èÉŒum<ó" ®h0 "š„Ÿá@LVOªQùE±7O5‰™˜ä™5€©[ïÑôĤ^õb«œ¾Ü¦ÊˆEz§¤[Vö •ÅñÊAô²Ž²·‰ÞÍgSÓêÞ ‹†ÒlåP~tÕ:xU§øÓ¢ Ã-%+X~¼'ÊcèS)8,/ä&<™=‹Hk-“Ò²˜‘çòÕ0-ì˜ã…Ñ:‡ò§_olN²´Îõü )Ú;긙 ÷î©Hð“«nýXþb¾[¿ƒ_¿mA6-#JÍ1¸»‘žQz }V,Û]¾ÙX<“˜·¬•t[öúFЩ;«‹¬ÎÃ2·b—?ÉéS¹ÅE©c;VÕôñÑiñAº(ã_¡üTBñ•N¥ýy9jÑVý5Â~ÝJ…g¦ÂÜ0)¶ŒŒ%Çíá"Éý’ŒÙF¹N6õ0ÆE`ëºcP‚Ö\b÷î[²¨ 4w¢ªôÂÕ#…” ùbªJ™ üJ8ãA eë<üPípä¢`£[¸MÄE\ûu-OÖ ¢ÄªrR¹ðõó]ƒ#¥ß3 @C"ÔÇŸb>îñ×Ë“¤?•S±ãJäñ=lJøá2aU-N_=(¼ö¥MS=ˬ2Ãhnˆ´G%Dæèž®2˜5SìÊi;ó©•&”ðd µ­4Š}ß>à•%˜ñ&õÂûV±Ë;„Ä ˆþ|—™;kä²:bº£üKyh–áýaNI:w ûÅúœDsz‚oyxÛ»f³¸RÖS°á‡StKxŒ »WlíÛ2xèʪ x 8¼æ<ý \¬¢æN±1qr“}™†äµÐÖ›p±Æ&8„}œ““.ÛÃAóñz=àpRK–êÖ;›ÌÍ•D(B[Pxù;×»,Ò&dôî„â#‹Í©¼ë¼yn×ÑC#¨ÍÚ^ÓG>zõÃÄ­Îу^»ùm2bòáü†¢fd½$ëèÍÁùlr.IÚcðœÊóËŠó Q#8u{¬Ž€@õ‘o¤žKNCÆgqäüÜü›zÉ’œ„Õ÷cØòÛâÈy¹FÒG&ÒŒñ÷XJ;¹o9íáìc(=ÝðDèõ‘g/@ö¿0Žó¿®@Žó˜5³¤s×2·³4‚÷s|HLì¤ÎÍšöqW>A¿eõðS*ó½-d§™v´B!"vI™}¾ïÅm«+˜”9QØÑwÑßh½wëÑ B<’)'÷jdzéáX ÏK¶vÖ® í?J=µ‰‹óʲ”æq9a=»J©àb$¨¶Êä=ƒ—¤®ƒøc©AÚO8ˆ¥â\:mñÖ©° V6 Àk€umäÝ o˜ªÔÍf@žyi‰»rÓÇâNj”6ܶ_©5ÏOÖ‘Ó²÷ êW×RAä¶Þ¨e£·™s£Â¡tåÓe–¡. å,6Ðô—þ}Áf›~òjÑÀmÏADъ鄇ÙÝën}‘?”ßëV=á|bGè+¾"›{åû_3¥im¡Cµ²‹9fR¶ž¥4wÇDªäP1¬ˆvݾ “, î-8òP|»€Ö vbF£¨ú*„°»OéQaYŸŠªâ]úE- ½{ ƒ»Ï|uFq˜ÒýI©%²ñ"¦×Ò:váÑ<‚/øeO‡,Áº0óŒ'H}˜lkYr<ï˜uÓ'äÔ ¥WòÛ =¹Œ.ajÃýǶí^ëK Þ–ÒF“ÞLú²uÈâîÃóÞºo²Ò^iê}žNH1¯A­²Ò6„á{/­º³!3jõÃ=9d^©JÂÖFÙŽ¶Ásžá‹•ð.ê<_»\懟œê¹¶”7­«æµf½q‰ÛL·ÆÉí…ä„NV–¨=\e´®}÷KˆÕ™¦å¨Qµcü×ü½€G§1–q|Ý&Óø£ûÄE`LÏ4¥•þŸrLðð8­ïçÙÍmqŠÙYv®à„^U ©«)êü0 ÉÒ÷@¾W·‹ýÝêBGÈÐ%3½Ñ“g&ó‘àL[›ÖmÊ·WªþÁÞµ@C¹µJ¹åÞ]ñCQ˜û ¦q¯„\r:r ¦ÆŒÆ ÝIG5 õ‘JIr+ÝT¨tJ‰RQN:HåR$—ÊÁ÷Π7CþõDZþË^c-óý<Ïï÷îýìmmOh{Zx›Uí.ŠiNC¥jÿÊŠ²¢ê:˳…Åg覓TÎkw=Ôª7ËíÊ%ºªÖÔvKdú±;B?½cníîyi¤úæy­ò¡ªù5k2ª;»ÚÕ+oóò:å”ÂŬÒ$SÏk.P(»õöÏÂ×ÿÉOH¼o÷öpb2ׯÖíðj¤•¥ÚÉ÷}xS 1´5‹ÓÝQcÜȰù87¹Ý\ iy•„*302ʪ%c¯e˜üžùÔ9¿²W|Ñìª3¶sÁ¸ìP=R2&øÂ¥s䯶¿2sY{çÀÕ¯¾oûÓ¡K¡A+"ë(ù›î«m>Š‚³cÛ{v]|ðàÁÌv•´“!XrHa§sÂã’úÜ…ÕN@iõU‰-º‘±ïâÉ›¶„“½·¬´Bgÿ|»RZf¡2_f¤\Ê\ëšyrñÔ¨}mR|ƒw2ì¶qxÌ„Ë`Ìf­bÏ“©U jrwt^ûØdÙI—¤V…ŸdͳwŽ%9:+ssQ‰æµ.’jEZ<ÃLÙ´¼m‡…D®oÁ)5,úü®®õeí†:^¬RFo`È6tLÅ”ç`>ëZLf3óϧ¶‰§™^TÏö£›"S‚ÏÇÊóÃrßñÞ|¦z78v³ aEÈ6Éî˜äpî«é¥ÍðƦBf¶Â립L½ãy«oMvÊH×ÁŠë-sëDu\îç_º”ÖyÌ8оd×›¤^{›xI îP í*uÃ=ù/ŸËܹþ"æ î7õs?§ èTûD•Ÿ8ºí¡Jo\‰õî¬{ó6}äÚ¹ãÞ:cäÝzÈ»ŠæY»”Â+oe9Í9An|uôÂnŠ¿FÝ>±úÏö‘‡ÈIÿy*‘ý[XˆíyÝô-U‘”$ #꟤ê,>³ö×Õ)bˆgJ"¹kEbZì'ÁÖž'·Ò«o^ÎL–J¡Ém:ÛbG«»ÑPÿ´uúý«›l?†ujËèÌÌ,ÞËn *d ãŶ̴"h ²HF[c¾iÏ$¹çâÍJ›<—>n®Ób’šsÝäU,™™Ó¦×C?Ô…Ö G­2…æšÌJ€Oí¬œÞRÇiK*–ÞÓÔŒÑ/.Q£—R-½fÝ<™±1úäzBôì ‡|ˆó(šÝÕeŽS²c*½WÆm?ž€¤O—ÿ˜µþ£¦g‚—ôº÷Ê•ÊáiS%E–«©ˆ5µUßî*Þ±'Ò6êíÞ2§bQx7æ4Ú¸G5·"¦Z½w–œªªËìæ3íñ™¦a)1k²¬‹IVu o-+œ¹t/ã´øùÉ”‡eËýúî‹U·Õ©4V­38rÞm9oÅîÈ}ѧ§ÅV*†¸r-å°­êÌÁ¯òwÃDoèÈmÉÐÞÒîܱÕbýÚ—¦Ññüî”,ÃΕ*Š¿¸dpW?u¹ÑAgæ‡ÇUmîì(šÒh¶á¬\ÚíX8/¯Û~µsnþ ÙÙµXS¤k²\Þµ#6¹@4¹Î E¾îÃ_ô|Aûà:Uƒn°ÍŠ¿u£\£ðÈÀä,:l,ºfžcí#¯K‘Só æì¸¸¾'^#ÄB¬à`Љ|ý¼²So»ðFà4TÇøó=1‚ƒËÓ«ÿg’”Á‡)¥n$ëÊà}î½¾ÜkSv÷%÷zw}´©6 Æ—ˆŒ}~{K®|ÞîO´ÙsˆGÕruÆž¡”H¶©äyõ4'8ÞkÛÿ´±}͹*7=s½ŠŠßŸ³ƒdé1×4¶×µÖÞ«yÜþ¶S/OÍÿNØ+˜¬Œ_bº·vé^€wÔI)È»$¼JïHž’ÜVØúº$±¢ Uw\œ­ÊS_Z^V­½ù¹2Ϥxq‘hò!­Ü2bý·‹þ:äíî¨vûµ~rW)£q¼ÓÓÚVÔ• Ž´5Më8;%¹úÓëÚÆC)Ý«gÓ W6î7Kºƒ‘‚ûFì´ÜsëiF¯Æ©­Ýn «O6N?ÄËK‘Bçha$Ú^çõ:éºZ06‚p3}ÈSÝ̹’=³J+¹ØêÙ6ó®¬DNfù+YÞü¥oöRœ7–å}ÞYQwñ÷?”Ä©”Ù;6?H+Ú¥sá‰üå€~úNjМ¼[»Å÷¼þÓnÀ¾”ƒŽ¡n‹îÞ¯>~²âÉ «ùž <Ë;EG*¢ —fD¬ö~1inÿS ´lÅË›¢‰ý¦úU™ÎŸ*ÙÓ-í¦ˆ¯ (9ïµkoEΓsR÷h&—Årª£{{RÖ¹Ÿ´ª!F&£­}ÍS¥,ëHÞü»b¸ÍCÚ#8K„·2ÞX÷\‘ôE. i¶¯ xMAÒ ³e~Nq%Ë×´Ì?zï’Ú³wÙbzëæçq5‹º×}šº–{˜“n©=/¨°IñÆ…à¸2dÝ–é’V=£Èù †Sö¿ÈŽ,BI]JÚÓè’ð›z` ©DÙqF‰ß/7à 6R•yK,]¹á¢xÖ\ýäü÷y†¤¦5t±Šz‘Ad@†îÏ'œ¼¤#cý³~â¡Ëóžæ^ò1–×£KÓgž»6™Iz¾ä¤Nã€hè•ÏgC·„t¬Ÿåàl|^þ ry ?ÙXF:Ìþƒ>!ùº(>甈;ëf´ùÒK›]ÊÌ*˜+áODPˆçGbEb•ˆ²i¬%Ó]h\÷­OQ•l=ïÈâðZãå*ËP§á6Àv»tÖ îç©U ã¤ÿ*ÉýºÏZ‚Lê(GiËV£~ºÈž,fß½‚M®žÌ´76T(£­¡ð[¹š­9kðX.bä  É^‰7Íý¤mšt‹…ZPàš{5D:-h¶q/kY$vÜ*ã†yh×Ã[äÕJËæ™nšqÊêÝzÝpšÓi Â3Ù—{_«Ü-ù{ §ü½¼ëH³,Oÿd:brZÆGÍîøfyòdƒY¹z°Ç’÷ó†ùN'Ý_mŠJqÔ7’·j8óa–^ TQïã»)¢iÍfN×ëžéÀœÝÞ×J‹Ø÷¾©|nŠòÏ‘Сjß«œFRŠ7Œ_!%Qf79Ü”Hˆô~SêÒÓ¦\桼ß°‘ì[xüªsÚ15|›¶ÅM nô„g¾µËUûéÑ¢E»xÒî*ê”+¿’Íï~šKÄkPöÍÌ~­*Σ$ê$žrâHMâQVo´¢<׳FêÏ–á™ÔîH|ÆÛÝè†à¶ÅÿìM%—äÙ¿]žœºŒR*º2»­  ¨gYL*N1ÒåQµœ{a½ÖV‹èi”Ê8âñdìŒÔV­feXMUËò<ñö×óUyב{¢)>ÏuÒ$—=Œ_Z¼ÙÏã«Û¼íî+KÆl9µüHî2[ ¾°C".ú󔆪Óz\kmà°'ª)'Í)ªY¾gßÍÕñ§ËsW$¡{%“:/¸­sçNc{ß‹óø|jí–°®©”Œ£F¥35Ï*ˆaXŒÈæ5‡ÖuKw¸ÿœ+*Yt÷°Ha ÙCü\éu¤­šBL³75B•Fî­}?‹·]?~nìêÎi¦ms‘÷η[ÿúÁNsûÙ¨¸uöˆÔâõ -(©§[Éðu“vÞ;×c¨ysIdˆÆW©ÚÎÙ”O%ÅÏ}Pxe^‡^>9Jd«XŽâŒÓáÚ!QÓ£çé/…–Ý" (Û†TÓpóK‹ÅÛt#¤¢ŠCv„!Õqð?.›üzÍd»Y›pìrØû»¬')ÑR}óÖZLñýâÚ×bê“Z Ž1ét˜Û•í57^ûÏé¯"sNIDEÇ™¬Êi2W[±çFQٌӢ‰ìÂßn§ÈD·¬Ú¤ª)u¥èX¦ÛKy`ųZïO„éäÏ›¾Õ6rŠçbZô&Ì› ×öèeκ]xk‡ù‹tøê-rŠŠÛ_x¿H;“na~ŸsZ…èA67<ãêüB‡á;×[¨;Jªáºú5ÿùpâSr’Á†U¯*ïäê„?Q;7ùNEgw’¼©”±„–ˆZ²Hø¸ûòȨG¸†3Ójî\ÿ˜¸ ò}eðßÇÑý‰üŸcRáOEŒü‘ÿÿuLÊ`ü‘ãÿ‰û?cRã?øOÜÿ“2ô8ÀÕ‡ÿÄý1)ƒñÇŒüQ÷?Ƥ Æ;~ðŸˆÿǤ Æ7~ðGMà?e0þøñƒÿÄþoLÊ`ü ãÿ‰ýߘ”Áøëü'öcR„ñ‡îÿô¥³v'øéôÝt\súŸÆà<ÂýÛwÿ‹F`øw(š¸ÿ3…¨fnkæ¸ÊÎ ;.·ìœL­)fLGOÏm¦§gîhÞWÑE G6•HçÐYL*COφŸdSø’èG£z“ˆþ4à§æÔ¡­ ¢/™±˜G:Ž¡4àÕ÷m ŒÿŬ3äç¤q–ÐY:V_É— A# Êjð™É'f/uý‡¾´Áü|¥D½¾.RD¹vpÔþ¬Ÿ^0€Mc, R”úÑhÀëׇß@ÉS`J^O5ÊZê ˜÷‰ëO ª£¶ñ¦¤_]'H@ û*!kÿ“A*ùSéÌþ$¥ËÁ_ûr›ÚQ}i‚d£›€‘{ûÑAmØ^~‰|ÍøMûdª¾K•Édqøv dMä|— þ%ÁÀþþ| ~´{Ó‹O§À¡*,§ù{‚oÜw‰ñe°<©Œ¡züˆŒÐÿìi ¾_ `û’á‚Hó$ sd ’ô%9m?ñ<Á÷pjÿ(ËXüøÑpò«©|_,ð!=àûVW0ðW óaS}ùMAްiÃ<¥Lª?Èi†`níK`+øT‡B©C¡b`•9 ÜŸ²›Å†‘Ôé> ·|ww gwÊrw GŠã*w²»;Qß$$IÆŒ$¹¿÷HcƒÓ™´ ýޱ…zã Þ8aá¡:üÈþbz1‚¼i€&ƒcèË {êúiúr ‡ %|·Ð@›ÎôI¬>$V_È4âK!\ñ¬ÎZZh‹í #S%Íìvp›>½t°ä7Ì 6Ðl£Ð8(hÔw™ s ’èº~°aíEC\F£ÍB•Ñaƒ!º G¤ËЗÀÚv™»ß7Xˆ†x„ÆýÍ7à‹ é‹Ÿ€\(Í÷i7`_f+ð!ª¢’¾áEˆáè‘NczÓ}†—="¡‡ï ñ-Ì[L?T#º 8Ã’íÜB0óÚQ9È, Ó\ð@g4F¾R ‚ÐËȃÁ}C¿€ OÝ«_?¡þøQs”: Ñç+¼@Q°^C¨•#ŒÖ0‹©{@¿_ a@Ü„ê°Ð¬†E𠵨ˆ‘p[¨e(¬4­aQc¤Ä· ÆTœÙwhšTÿÃ¯Ü h Y‚=QQa1-¡¬~XÎb±¯`ã°¾ña°B`$6ôÕ*öÏqXh1ÂB +LèÅÇâŽF}þ†F fѽ”*£â]p=u qÀÇìÐo³¬O:ó ÏèÞë ×ç(Øb zlÍòºŽ$)• îá†ðZаx¡y§Oꨙ 2}Y¿©|É?fîPÅ¡9 Køw1ÄBþ¸aßÀq¨½ÐŠÕ ÂyTìÁA@Qúyó7ÁÂA‹ñï‚…‡ÀúߌûÑ7 …ú8¤ðJ‹ƒ2êßu ø>™€§=‹Åù»xCÛzd³ç¤Ì6w¼”ª†”Šš&\CSm÷çßf*K9.<¬~WÕ’²÷ýµÈ°ú÷âÁçò™& váÂ…]¿•®px'Ø—ŠÅ×Ñ^­uÆÍIÊïðç—û9'i);WO”ô×#Ÿ÷º‹’v;ƒÅº.°k¿0NãQÒ_íkka¾ÜÅ¡_oöóx|­€}©Ó¡ÿS~g¹„¿ˆïêÿö?‚þGuéûÿEÄ÷üÿúŸ¯ü/ù, ¾çÿGÐÿ,é?ßóÿãè–ô‹ƒïùÿô?KúEÁ÷üÿ@úŸ%ýÇ¢à{þ ýÏ’þcQð=ÿ?þgIÿ±(øžÿTÿ£¡WWAh¨-é?æÿWØžgÜNãgüi;ì—7Ù×î3Áÿÿ·_ùÿìÿ¢ª¢¾äÿ¶(аÃb±ŽÊøneu {U{ 8R Ž…#”±ÊªöjغKøÿÅßÉÿ¿j÷?å?®ñýú¯ªªª¾äÿ´(øWþov0¬Æ7JÀßßàÈ/npUõª**߸!¿™7ì<œ±|.¥®ŽÜ¡Š€K!”Z$ò·88laÝù&î³ ›ÇïAuÄ— Ýµ?Ù};I±¸Ïbªo<æÔv¨¨#¿xÌý™°ýƒøùÿ—Màþ}þ«¨«©Ãÿ[þk,ù?. þ…ÿÈÃÃñÅÿ-¬l\h¶ÿáÿ–™™)"â.$$ôo\à~Ñ -åù“ õ7¸j|ÏBU½RF~³XMzÑ;ü‰Û[ TNå[6Áâ>îo¯Î¨‚âoÜìQ¼(tÑqðe¶bÛÑ«Ç3ŽÅî´ñIâY^yˇ—·Ûð¦élÈò½û´»+Œ6$iëÈ›LÊ7­p·%uG‚Í¯Ó ®§=ÂôpÄ .} ¥ÿë)>ýÒgV:(ñÏ(¬{¼iFouÐ'Vk&¨ ƒGÈÛ %:|:’M×/@Jl+ö²xvã#ý#WÑWä„`îò’©ð)$rz³ª¤ßrg{äôU(JÂx7òÒ Dß ÁDELÏQUq?§øõþÛ ˜FkÏœ˜?'MaZùÜÁæ :ˆDB•3ßzx±œA¢"_¢¤ °eã·hD * £ÅT”IvÉSàbø´fÇ}î‹t'ðã-¬õ$b jC܃&Öavs6ÿC)n;Aн¬"§@HKðÏj@Òx$©Çõ~ÆÉ¤ÆŽ‡xÍFêÃ*ßöSû؆éqr/[.J«Îma†4ò¯õó(OlØ$ºÑOò^άà}ê·2ç>Ž%“ôÎLK^è^7gíÉÜx-A,¬Oë}Öê±S-O¥ì|)éß7@Çîð›`„„y(¶'ñ¤a’cŒÆ4ŸAÉ*e¶Œ”8í†Þl¤«5À¼5G7”ùªÖ5>^Î-Óã>”±š$]ö÷Pë\žŠ¡¥ìLaùë²JD!OºÃ6!Ö£²Ð¦ìÖÇ@LYIPu›½àœ›§=@A¥–=Èÿ“Ÿfú¹n­Üu;~V”QÒXgÑ„Xçw›&ß[9o«‹¥z<²•#8›6In"D G”[š©DÆà­0èa¨¬ åö¨MŽ"‚ˆ #ôžörÐgò¡Bÿû&c9'›Ëèªðx5r3!kf|gXÕyðŠìÜ`˜­KN“=lq£7ÔP<–¹ã~fWØ5 -çËì³Þ}3½¥`ðV$}S£ª‘ÑåÔEÝ…†?ÐA7A¹ÜbûÑüžÍ(-5• ̪”BÃsuZÄ($Í6¿¦•VÏšÛ>MIžy³+)N‚~>Øñê˜ïtüÓv Q?fÔ$]÷õ0=hj=§øxÖ1 2€1¼5{Øx˜ž4€“¯øåƲ~Έ@:4på°:›–Ê$CÜ÷Y4ÙFÊÚ'ÍÎ1Œê»šìþœ¹WžOEA½{`ÞáR«(®²]<²«?VÝV4I#¹pZúv\éÙløË<_,1ÊÅ>ÉÐó!™q†&whL9í F/‹çJ&ÊT,D](è›E¸Ï·XÙ §My8 @œF cWcPlÅä]„êÊe9 >kÙxØ•t<84ÐàÚ#Q>°ýÜ HÙ†<ó2|‰¯™q¬Ny(××'ˆ0êèPÊBd¦™ˆêjÈÆ÷äO±€œâè:}mÐXÒd‘dkµŠ„“"0öƒñ§¦·3´žfO+*¬.§Ü›/¯†¤ƒ¢«B©kýžäfXÛn5cÛÅ„–Y]BÛÌülm‹Þ` YfL)\^fжå¹T[Ë·,œRZj’r߯Á·;ápiamß®¦<¥>y—@¢2Þ…ÔݽoÈÚC4Ú¼£K[uX*ûiå€Z‹¨ÑÍiSLY UnÕûÞ­Ek(¹&md] ¬=yõþÔ8~p}#xNœ}Uz0ÛŒ ʼš$ºÔéí x`òú]HØ1u‹ h®\Dr¦y :„÷`` ­{ÉßJ…˜(rq=mFwÔš`´™ ÑRlä·6ÅéöQúÝõ0ÔÊ©q&_JF]õh~µdek’kÇA’ÿOá±PÔ›å>®Éž Ö¨8[ÔÉ÷f¹1ƒo*#Ç(Ó ê¦OòwwÞvoo}Å5ç²Áåù!9Z/Óð!¯Ÿ~ÃJG„NÿÜd¬‘Ø¡„ƒ?y‰^b‰ øª³^¬—i˜Zð»ñ gPª¬÷QLö.®I=;a:¹ç¾ÏQöjöŒ»èÁ@:v„–TNnôÃÔ^¨;ûéz#[’ðiÖ­å ¢.º ”•zìH6ôe]^aQu;¹W!Y3?¹úÀX>¶6k¾ggé3³ùö?tŸþ @Gx¤KÁ ÔÎĶŠsÏ!i';º/‘æ—9qÙv3^È‹ôiü%&2dw¸ vÑó9ú¶ü$ÝK‡Çlans|Â… ôR`L:´À,·Ø1Û`E¨ËŽHØIÂìfÚzRM›à˜÷šN}M|.µæ(E`ÎÚ=)= &Œuœ?ôªb^‚S}©ƒq±ºrhä õ‹lÊýf=a~c;ªêQ¸qÖÎ2ß Ä64u÷­–{:\»@I#bêÂæÕŶ^w.v-Šzпֆq¿øãïv%káò)3î¸ù%Û2oÝæŠ•Ú:ægiÞ€Í5„·ÍòÀy›’{†˜ãV:•ÓáØªÄ#aÜž¶ÓÂ5ñü>cý¾>yQ¨¹Zk Âé"¡”¡>Nב`èÅi8‰~’L,uÙ­Í?ÈF1³ÅÊx1›Y¤= ×²>>[“à9ßh>èp¯Ì1/¿iÉzÿ:ˆ[3hœ—*«ó‘h÷ôùíýìµÓ’ž€ËC—;´ÄMO'|aæSÑ®-ÙCÏ•v<Ž·l‚ÑÆzŠÝ]7TŒ3mÌI¦à©þË-±Ò "ûdR××]5¾Õ2f¨ T<»ºÎ2›™˜%¿Y‹ hØë-ñ@ZÀ¯®³¡nmmpZ Üõ{î±çv¦ÑIy‰,¯äâD™6_žÂ&‰Œ*nÿð–ú‘òâòYÔKÎí'5¶&±´Z£‹‚ Q›çW§%²ÌÀCŸî†3ŒžgX˜¿~Œ~Õ§:˜vP„~–2ö\)ì eœ!ôÈy¯è68ñ4âIu(ǹ¶«’i£lcä‘yÞ»ø§ àbÈÁ]Ðô 8!šs%¥¦Èнvþè¶Né2¼ .WsÏôYFHGU‘­{OÀÊ÷rX½€Fshí ÈÀ;Ÿy†Éå¢k ߟBÔ@)Nö¬ÂÕÆ2¾K”›@“åkY½÷1|º¬GT4!¬óÉLV¢IŸšbq@e ??ª‚º} ªEaM41>öšó/ì# êi.-†jpAð(õwFŒiAäŠÙþžÌÝDeíñ8ž}©ý¤Q­bÝ´6Ù2sÈ@«R묇±FHj^%†õfÿF€[êqÊyñÓyß’ˆìñ|Œ©¢QPæÐüÍÒÔzºQL΋² |ƒ2ýtF•O§~ü€É.Âc«á@â"íK¬ãèäô@o•ƒ8]ôR ¾ÉÜãƒçKv.¥TYǪ̈®§9ËŽØðZÚód[Õ‹vñëOîX[‘Äáp¶‰wÎ7U3¶½æz¿œ“›þ(aˆI†Á7€[#e@žåXsè°7îÃÂu„Ü9ÄqO‘w¹¤uþLJhÄ©åiéN¢RT¤u#ßxÞ-B¨¶²qc3õcÒÄô;ϽÔǓœ6PQ' —¡g ðbå16p°¿k1{>«µ‚•nŽš{Òœ:7•BN]·uj¿Ì ¿·5‚U{Œ 8\óE‚ö+|˜ݡ‡ú’Äòo4H1 ÖYÅ¡»·šC•f9FwF7ú²?©§i"AéK¹ÑUŠ.[jDòoÆéÁ,´z¯¤Q}[öuê ‘|?îfiõöÌú:­ÕUµ%yä ˜ÍΜ]òëž?{È l+SêôðRs‘Ú ôÏå¶¿oØl'rë$%>nÔ8O³µ€©<âÊp\4|R箬CÝ-¤Õ0#8Θ >º‹¹2@¥ –_F;²ê,¥ÙD¹+’œ9äîUQGâÚã*!›¸¢ÉõˆB!sm­®‚²$›M]–â²Å~W¥kšG…Ïô$íñ¶½o öå’šz§ì/¥C›)U»ÄºÚÔ¤;®™k±[Ýç5zÃy9 œê޲ILUUOð›>Ý<ÑGëŠ ggxn8E¼ócÜñ¨à‰>Rɧ~«ñlÅlá­Ñ.uÍYö§úê’ùÖ@葹å~sW<÷ ÷}Tú›8‡gâì¤ÑÓ*OçógÀñ‘å¨üw…—gì¯ú Æ*p‡CÉ[çË »°\<´WÞFšéîåÊï¯âØÓí¸úÏ$R—ƒ{\]—)½¾‹¡hƒ Ó> ¬kÖjöp>¾ýá£ùQa`4€;7ìQzÇ<ù° ½a.ÏŠ2ýÌlBþ—Ž2dœ¸@zÑB_¤Ù¸Ïf¢’„ý|NXŠ_Æv¬«¨í3±2ÖÈ›´`ƉòËœ¸ÀûÂÓ|²µDTrVå!¿Õ ç1=úhr¢ŠôäAI†ëo ê>õØÝ½¸÷‚ÐS¦VúÚÚÇͶÈ_Sž-2£VÄ/‘?u ‚ˆQ)-ÎØæ©QLù¶Õü’Iêz˜ÿbï;àálÖ¾‰(!H!¢—$¢×eµÕ[ôÑ£¬Þ»Õ‚ D Q‚Dï‚„èY"‚è«G‚]¢¯Þ¾•çyÎyœsÞrÞï=Žïû¹~ì}ßsÏuMùÏÌ}ÍÌ53 ?ºJÊÔ«Èu-ƒeå'œožDŽÜôg{£ÿ@,uǃ¾;ñ#ó~/4ô'ºI²þ­ŠþiP./Ë"l’ò¦g¨ûÕ‹ƒaò1c¶w×í—Õë‘ø/Q瀦ñIÍæ]¡8àú4£Ÿ!T¼Åj“Q±¶©_ 2[nèî:k“ó¨õá"U,f±ƒÚqjž¡ PV¬W®hÀ>h‰qv/È«ØÓ¨¾†{i5TMÑ&Zm)ÊÒ×ÐËzšê¤•ÑÌú®tÚ‹u¸ò ­ŒÄ·Œêª¹mmråa¬W´«˜!w£ukÝÒG˧u²Ï'M¬ G{Cán46‘jŽoÞ"–ÜۯؠË"ÞSkÂ~]Í£ù )ã²é&êssõcüÏÑ®ç/ àÏãÞûê^¿W¶„™¦Œ·öû«k¬b\Óãæƒ&“’ÞÍKêúpøLkA~‹Ò§$•±ƒ=qýÙÀÉ=ˆðƒ]^?Êv¨Áøzsñz¨¨¥¼ôd Ç烅=ªXv”ïクR‚˜õE ö¨my"åY+ñÔŒ¼‚_àSù†E7lRîCã³¼x쨨æ%"ê2,% ÚRðt”F\š>—·`¼¢%Ô¶m°0Óp`át¨ÖþÁ ý.^ϳƒ½X½íéû ÿ¨aè …ŒJŠqÿ* n¬oJñÁ•{€Ls.$a{bÔ¼³M@w‰»S²Á»Ì(eˆ#X¨ÑÚÎiïWÓ^)')uG| :ÂÙßñ0uzGB$ð6ˆwèPýÕÒ&Mâ—nîá‡.ühb®t{o¸ÍZ¼‡Ùb)Ƭhg©• ‰î{¬EؽDk ÂßÛªm.¢ÚÌý±^úçIé¶Ž3Üð OúŽë†[$‡Î¡‡.RXlÅ(ÐrhÏ·'óDtćAAä@Á»U›‡Ô¤da^ —]â>lÊ€2eHçGöúâ$ s™ºXˆëã®NíDî£CŽùš¨ŽÞš#fù Eì ×ç³Ã|.¿ß\kâŒ3ŒS6xMY­Xoœµ´HíÑJ(ܯ°g$:´“± éÂ{1_œÕ¤^~­Ìd€ÄßU/nZ*OH³·Œ¬ËÉ)ë±ßMúÜcî³Ãc%È.š”YÂj86I¡O³Wt'>q«É,9T|x0·¬§ /÷5,íí]r+܉0ÔÀŒË ,¢êÞ“‰ Ý£¦…oR'c¿RoŸ"ÈHõ®êY¹Ú|,ÉöX‰ÏÇù:‚¹€TÈ|=ã3ê‰~©ƒ1;ÝÞî%œ¤ÌâÙWàZJs’Œþ}ô¹Ø^Xelôü¹Þ¦qrå÷Ý1(.GnlH«Å=°0Ý{´)-¸.ÕÞàþËŠ†Üðfº×å4'ˆEÙY6«˜lN˜W1ìq÷¶䆿?7±'ó0©½Œ™‹YmðD )/Þ¿ RäGys>Ûzâø|Ž40e.!»lîÒ7“ÞÍ´gæ®ûfÊ:ž3° ¢G"ÈØGû¦©KYØÍà1emµ¬zö­ .HÞâÝOÑÙ #j¤‡T·xYJ¾€_7aSXÞËÌ=²´¬Z=_zE¸þ#OôÉ¢b8BÚCë`¤§ü-iÁõ¡7L¤> ©ñ9jÜ“Ö#Ô‰´‚A\¸>¹Ÿqßïuº?×¾E½z7>¢.ÙDÉ|³6|Å*Yz †§Ñ25¤Q' ÞfW*x ¸>éÃDí3D€k­¾uïîÑS$A/îÇ…¹Cµõ«±*ŠÌ„©x3°.éå§­LÊ,¶iöä&ÞÓ®zRÖ¤­A ']~h¥ÅVé2½Ì¦qéz^L(\»m “îŽ sè»|ñeÐh!‰vfîZ¤§|>hÆÈ¿êO+h@–²9÷nˆ6|ÇÝþݧDbÈœQ¹>Uÿ«’ÇŸW–> …DÒ œ«žqazp«„¤XóAE÷T‡RÐx¦Ý¥ˆ3æ©­z´Äp3t˜ä¡hîL=ÎQ%7M=0³òCæ•Ëá»-ÃÒL/A>¥#} —&…í×öá.ju Ë/'Þ/õR­«DÖåz–ú†Æ¦·{ûÞRùØ;ç0Ëh•Y•´DŒY³‰Õ&ºAv“ÈÒVœë¼ûžW {ËÇöÞ"ª—¶ *Fa;‡ÄCìu<‹ê%ØéƘ¨W`í/’zö‘7î­ª ,p?—t†ƒå¾gXHïëk5N-×;Hš1Už±1Ÿa1ÖB.r=šd7„XÀ›Êî[5(w fø€žVÊ­璉'ð±Î¼‘¥ß‹Ðó>RTs×<2ù¨ ¹d ßwǃµT±­¡‡I?¡ Ñ;ÄÞ¡0ð©÷}¢N!üŠzw±¶5×£o½EýØe†²Cyí!‚Äã¾óÇÔiOLv{³»¶o™ùF¡@Ñú¹uñ©Xö¯wVù•~ÞY}i-2QÌ™0s­§P'‰ÏïEý dîÌ÷„2wê„íö¡:]¶ƒÍÆ#!aªÆY››ÞB^!î\-µyGÞ[‡}£ì·øžqçKF±ˆEõŠzïê¾&‰ôHÕ[îrJ×_9ðØÒ‹l”,qÓ^€*8~#\5øVÒ¢|_„jf•R€h%&¬‡$ÕŒÚè]Ê”âËcòÓHw™ÛáYÜùÒ©cú|Ãô Z<§¾Ê\[‰‚Ò†r#G{_P‡ìÆüÒ!šÝ®û¹²B=µzTbLePï¹a¿ZëÎííõeT»ûZ+&òziÃ-óK8©_Z8ô¾xÒ²NÖç‹G±½nw̃k*?ùª=³Óbðis£µü¤‘Šw‡q¯žõÈ9ØûIÕàñ3BC+PVÁ&éÞg!ñŽèPe˜×ûj!Hh¤oܳ™ÔtÛÃ_þ¨Æ>MªÃ©µ7ÜÄ…Ïv±Û¼© $¼'a{HÜÅù“r®ÕÖƒjVÛ°VZy]ÛsSÔûBŸ¾Ø|’š1ùÚNiªÕ~…:·{ SøõÆêõwôH´9X {=–£Ãâ”}H'a` ãÚª3?Ám¨Sf÷PtíU\J§7µ.#<¦È°ajˆéjc©Ü:ËC7€’Mþbrèi[ÍG¤ÒAaéDª¡§ad¼&éIhµ:SœôdºsÐÉ/+øä—Móä—] õ;$&.ÜÒÿŠri®Î'sC9œ$ÀÀs[é8Ìie9¶õ2² Öý²,ƺYÚPšr½ù!~ì} a\†ìëðE¸ïlºÙ¹ d#çÞ·'R ­ÉOSl½˜Çc½¯à×…=€GTîUߢÊcÁŽÖ†—ç±¾íýÔLbJ1)ª³ûŽ/iŸ10Ô:çï,Ý‹ÆR^àºe|hhøó‘YðÓÂ"ÌpˆE½gÌV;¶ –žËúÐ ÄŒo…»–íEó{.]=04šY;/RR/£Å8ÓS¨ÿq‚ƒÜ†+„`Z¥E°[\ƒ§# ìóPw p°W¢AË#Ô{˜Ä•àIÔ]LÂ?Øðyt,ÔÊŽ©q(Ýw „|WßÕŸ.~Ÿì.„¥ÁÚ¬x„|{gEíÅ7¸‰êúV–†öáÁ®é‚¹ý±òé6b†0ƒÆˆÇQo%WžþoL«œ»WGÔ`|WÝ·ÌÝó'Sdÿ_%wzþ÷íÿ|±þëLèþ&ÿÖõŸ¼n^n. ÷Åù_gH‹ÿ_í?Nvkv²·1ä³044ÿ?ÑþûÏüQõŸ õ–çÂþã,ÈÔhÄËÍÏÍcldlÊÃÍÉòqró͸øMÍ€Àwü.è_Kÿtýÿg?ÑþËúÏÉËËsºýçâäá\Ôÿ³ dÿ‰* <ÞÌÆ üÛ µåä`AýÓpóX¸¸ðñ°›òýyâ“ ÌÿTŽþØ ‡@±óñÒð¢ÄpsrÿÁnükâ?(€aäâàgrQáò²€?Y €ÿ€ÑÐÈÎè×FÈ ™‹…››†—‹‹…—ãvªàÿ§ì¿§š“Ÿ›…‡†ÈÅÂÇó'ƒT.À?b6µ4·t1:•ln”–‹ uåý‹ý¬Jø?•ð—ðyQ|¨\çåÿeÜú×lãáÿÇüÎ&N`ð©ôó°pQ9º8¸þÁÁnÊûDáÄ*xQÉ÷‡~vSÎÔvÚƒmOå/ êËŽÀrý‰›×ô?äþ£Ìq  /*d^Tøøÿd«lò ¡³‹ØÈöo°çáù |¾¿ oŠ*´&ÿ™€¿ä>Š€J9ªþ‚…ï?b?9SâTÒ,¼\ü¨¤s³ðòü<û?,{¿±ÿ%í¨òÊÉ‹J;ê àúß4kþgÛÿÚøí¿jÿ¹¸y¸þ¾ýç½8ÿåLèïí/APÿ+¿ìÑØ]»Q¿w·ÿ%%u8FCûO,¥âÅàh§-iÐþ°ü•w&ç_™gvðyÈ=:²õañùa¥†4$´1¦&q¤x¿˜Yèë‹ÜÞd­v>ܺ¸'š"¥¿0ãE2}´·3?Ä׸-ˆÎxçƒ o]6Ó§~Ëm„M¡;¶¡œfÀÉð«yÏ€„Þ›…»¢Ç«}Ê"K3»ÊÇeº0ÝNŽÏNÅ]`Rýgù9Ûó λM‰¿øI¥S uTš¿.ˆß‚ˆ&{rAÊ‚MÔ× &Mí²Åë5nÀ¶Ô AKo®H­(ÄÚ®¸ûŽÊ˪¯¨()zUε˜V¦% x‘BßN覌ÓB%v㽨ç*}@4ŠP ~(áPê— ƒ5[;ie /I·!HûÙÇNŸíYT"ÚGÇ~%ÕwnšARûíÌ,5Cì›(²*£— ¼=о!ÐÁÓo zk£mW<ÛµÓ)IjÈ<\„ÕWÚMh…5¸Ò²æ»‘âpôφ,öž(]¿×º|ùJ¡dJfÙí÷<áï«Û!k²žÝÕxwåpÒm´]Á^*Î_®š£ÌÉÏ;«R‰ÙÖ“1_͆kIȲ§SçèÞa‚x&‹É°[r ¨öþ|Rú#X®¤JÊŠçã³gT?d> ïŠÀ#¥˜È ÍoœÈ¡Å ½{!}ÁQð#6òçÁTD!EC0¢uûÌsá¬ÍZi Äh6×>cöH6? ‡µë[È 'ÎñZB,Še%‘|£ (ž#„ËgO2‚7ï‘áêóuÅÞ—×—KR:]Ô¤Ú|¥Ä ÃMW¦Í|‡“†+'Tý÷c&ºÖºòü!«EõΞ¢Îžt©¾Þ·'‘«¾¢u‹ 7†*VùÔ `Ý2kHf@Ì¡FŒ<•¤¦Ú'cÛ=o‘ïŒ ZþILŠ»w?’ÁÜØÒæ'È"|F6t2Ýa*Å ×qN/ÅüÆeÑnfá!dÚLGu lîÆOq™øË¶^0Š–7BÉ)Ö°5Feèñ£Âè)/¾nS¦š@`ñŒ'G¡&åÅÖ QÕß§ Û­•ñhAIHim§ç‘TC`tuaE'yBHÆÙ¾¯ð÷úHo"½©„pª*½D)©¨˜'œ%¥ypÿv—¡gÜ%¥âió%plìÝë+˜ #·%é2°‹¾$'Ó’A:À­º=ø)À™Ìtì%GÙ/o éo@~ÞkÕê‰@Úüˆ1ðÅÿÎÑÓù%5S-Ëü.„ªíúªy(îӔܰ¨*>…2óÁŽßšìgOR˜Ñ©Qí±ö’ße€®µÉç4À6Ôתsçç~5ï\æñ^ïM‰Üí´Ð~ø'ý0Ÿ÷tç‘Þ®Q éó÷&QŸƒ.„íeì]oQ÷ÅOòÁS…ÊFWQR&±ÌÆ2"_¯±n¤\uÇìAd¸A)âრ3ù·ë–yÈú4³WS}w´ÛÇõš%2e>Þ µíþ¶Iù*/öüõͽ{3¯‘ëÊ,Ê c£Ö©µÍGÑ„zíÏŠ7 ¨4„#Éìâ«+ìÙÌûJ& «*»'4ßiAl¼ 6zº>cWWÖ  Ž‚õ^§¤îK-ÆoÏßèGˆ¨"ÚH-!c£õ>ë.u¨j·àð>)ý7/?;ÙD }ä?&ŽÊªÙ•¾!~×¼-ˆŸæ’ƒÀw²i ¬~D ZZ¨³mß[ElºÛûKqs¬ƒx@a2™Nù¡GËK}£Öv‘î`ˆ²ý¯ý‡Ž9zã•vÚÔ¼ vóÖV$$Íܦ¦˜°4=ã±M”Ÿ'¤(ý:ð6D’¤Œ•áˆg“!’¸›{sT±p­z©ìÉ*n ÇÊÖ»˜ý Ë<=è2Xþ^òeIe´ØnA„¢îgyj¥Üæá~ ê·wy!î醛ºJ+J2‡IXÒ7r@†NDbÃÌ\¥Mƒªô…†àmV&pÿ¼}ì YuØüñSr3¡pµÐ\Ýé)ìS52^+ð פo ¡YŒ¾*Õ'ø-ñpfu69yƒÜõèÐŒSß` ÎÚ¿bðQ¤Y,ñ9ùý·VÄÀãVCåÜõF~»qIÈnÎâTü¢óaYµGóöòöÇ‘>V~ÄÓè¦Æe'jìËk6Åš~pÐÏçoòTz’Y‰¡Þ}›ª='ß^ï?{iÙ@·#· ßµCPaHõìo´Wo7?°¯¸Ö¾ïî.Ã-4ÙcýmŸ*ü!wt”ÇfE!<ÕÚuÛ÷ß7¯ÄB}[Ûáš PBY{O·û“[9Zo;1}û‡ôpxöå+«IAŽY£zB~›¦´ ¶ÅåûËíìêœöÙØvì¦ÜŽ=äÅÉÚ6òö7[cök½³m‚Àå¶Žµ…Ì mõ‡è½Ö¶ÍøáÖ‡7ï«üA¡S•d¼ú“¯§]$'‹þú}Œ ƒ.ŽŽGª"f}¼Ÿ óµpJíàìvÅ„y¿Ïå¹\}ãìRu¸T+{h×°áÒy4‘:|…pe}×B¼94„wµ¯ýg^ùeñ¢9¢Gé…1:t]#^º…¹µŽýÜÎö’ \T`d’›+!Hò­ãíŒéíA/óí˜ }•¥¨dƒKÕKålï°áÄ•ÕÓãæzÒ%CcÝs™9÷Rû?ç„àa¼î±aíT¿‡“jB’YßÙÃêyù,ñ_¥°=\–³û†d’WéUwGÆìI¿›‚rAv^@{ˤ}ãî1E5Æ7x ÓzïÓBj©iHB7H}æÐØ8·¤YŠÿMhz«XЇ,’DG1£u…|[z Æ ™Ë/ Yé¿§]ï ]§8+…õ:§zhî’=€‡IÝSƒP€¨- Ð{Úóa탲—$ x®‡ÏßêÛ~D&~x¿`¯uîú=Pó¥æLtY Èèt#HÉ@3rI`IGÙã‡éÌ‘\]{]Ø‚¤{ð½õíÝáHÝ[zÏŒOaé圅茆ª-:ž."SYj– š+ ¼ áᬷ€+>Ò|þžÏÜš2PõÅÝÚ@ù®­nŒëz†ë¹î–%'dÌ 8⎄*)BÅ&ªD¤õ¹¿A݉…E¦¿LH ‹2ÞÊ$4«P¥ÊÂïEO<öÌ˜ÏœÆ Iy" WôðI#Ýåbf€üKèô#oøýä‚è/ñ€P~SŸMÂr¡{ëÖÇD(™ù¸Ð]³¬©æÂ‹ú[å¶Ïâs†fG ztÛ¢8¥¥“díý V¢ ¨’4ÈRßK©Þ„`äˆþ¨õèKꙵÐýá”­o+c {—¶ó·aXÅKä‹ÐØ”‚m»êET·3I\¥Ó¨µ«m bªEm{¨¦3ÎÐõÐH®MjUiæ%¹oœeÒ단®UMÂÝ(~ñÚ`w9ëP;³¤ ±Ë^µþ0Ь¼¶bÅÍù˜ö°¤I’ðuîøŒ–B)¤»ZaÔòb¯p‰3ä^%‹¤ mþ=Û•¨·&¯S Bó€…[,¯¶KlR—ògo6h9ÈC¯Y®X¹ŽÊ^…0'My›hˆ¬<âÝ{Ué @€¶//GIç™=µG™šzm&.ÈÞŠ²b‰£†Ésst19Â~RN¨™‡hR>ã%ÈMɈxƒ™'#Oßëvð€fIÀ1Zc,÷*×1n{•=€‹8¾¬$+w¼ùý£¼»"!ú3%=Î`Þ`q8¤¯ùQ‡Q#eëÓMôèt°O þÚ€°QêÚc²Õ6ýÊ f32g$o'€ó¦Ù/L÷ús;HGäŠ>ŒŸ×Jz)^ܲ /©*‚ðâåC¡Þ¦<>ŠC-ßcdV)ºWU%;;.Dzüeï"Ù‹‡äWë=Žð<ã Ä™!î÷ý@oŒ5(â=#ï µÁ[d ;ê`;D¾¥>²+«/b ~Z[§è—Á(­ÙØsûc’&ïcû´Á%Q{ã1@Ö‰ÇæH‚kô‰P.=ª¯y>_?žB›OÙ-Ë_YA× é·MÑù¡[è–åï–K‹Ä•Ï+îgN;btäF™íQ^±u¡¥ÄßB=Û5aÖ”/º áÕ/UßOÜ”‚VNÊEÕvÒd`{ÊŠ•øˆêØ¿-îBå–SòóÆžK2oý^£¢U›ÙöZŒ¥úþ\{ÉQ(vºAk.»qô}›g%&…êÏîÍ„™WÑÊ×Õ¡En–žöy?޶{ O ¡–×óéßÕ`wžESù%OŦ°UÍÖ„$PYš):)Ò§ÀwªØþy^/§2±u—íIWýÀ‘B÷A„e‘c=Ô†ÉÜÀtÒJàp„±Šá_w™£ñ;c΃{`§„K]Y2õ½Ù¯Ìæf|›hAã•f—Lª^{ÆZƒ(w“Ñ¡é hÄôl¬†?w’V>F<hWQšQ;‹t‰æÁeã“óЯ3¨« Ö.†[Ú!Ç…- ßsGœ¥”ú>#¿]#K5ˆªnBö²Ò®3¯õR¹ãASá9¿x·Èe=Ï–sÜ:cY‘` ƒ¾«ÇÑež#©[“÷i Ó±©m‚³ùž¶#j@Ù!I#(ê vçz°òqg*û¹vu™&™¨òä¸[—†í¹ÂÊ^Ãlɨ$“„ˆâò5ˆí£‰Æ…ïò3Ú Ù7õ¦[–äý ßîi»ÈÍ©·~¨¼­IÈCGÆÜÈ6®~Šíaá`9*^òî}‡>9•VÚú×W‹sFÔ"†r,ª¼ZÙ-:û·íáVÈ\-.>“7fb8u;8iï‰WCzåé±r²”_ZN¡Ü'íZ’·çÊ¿&ßøR rY¢zÓ÷»9“ÎýaíÞpùsÄÜm©üÄ€u–2,˜:´/¹¾›Ôb¼âåÿf‚Ú mªþ¢ª¼)×é5gÙÛ=ÖÚ¥•è’œDYÕ§.k·×úØ‘Hœ’P.n‹¬sEIm0kØOÒ·õnXÚ>sv³ÓÈV=^×=Z¡öµÉZ¸å‡á·ÌÔ¾¨ÈÓ'N×®ë†;r ò`1P§>FWÛÀÞ "´n$~jŸº\\ÿÜܯ¦¦öÈ>5^f²xÙ¼¾kbjØÐN¹dË~v·vw=zEä¹¹ìŠ_ü^¡UþäŒXû⬿ÊUŽÑÝÄɨÉÂÀœíåMÄñþüñîñZYÚz‚ŠÐcä‘:™=ä#7wŒ‚fNK]TVŽ{ ŸO•ïÚÞô÷öÈŒû¦=Þ*÷\,!G×»©ŠW71{½¾†9î¾/+Ø<šZÄÜDôš¿ Ž6-à)ycA›Df×v7æe<ŽJJp!ÏÕÃ6ÓºJr$o«Aüj²ØÌaëWšcRÐ{töUÈÀ Fy^¯ ¾¾¡HÕ7‘¦ ­GNø£^! ½í6ö-[Á,%Z÷¿±C¾JJ®áµ!M¡îžÎu¢¾zd'9™¹ Ð;)ü~PÎL£öÅ2ˆr˨ßRø9tQp—0{d,|b³ÎÎyÍ{;a ÜÊ™Z) ÷Òþû¯Ìð©Q°µ?ò@hk]:Låañó¢Ç 4Ð’¾\º)Ä©úv˜3Û Ân_¤æ„ªØ–8–,„xŒ~@°ß&9ˆ9.VêÅšø,í`ŽÊuÛL4ÿx8¶§‰ï2±^n›³âèu9›\—ÙNÝ8P,T:ü¨§°Í6Q@žSÛ§¼Pa±"þ:E!UXÕ]žé`Û63¬2!ľ²2e¥eû0DwÀGÄfÿ¢¬y«ù1 ¯¶*±|©¾~šyiÛý.4r¼gun5»æžÈ·è¨®¾ù=%ý…¥—¹AáLö“"oV2& «'><ð5òôÝÉþÈÿòþ²)HFЉü1^î½#¨} à‡ÕíÕxº^ŸßÒ@š2Ã,|OÎçP–šòØ„ 69©gÿð~ý; C Ö"çÍ;–¯l¢;Ûá˽å¼K5·ŒYA»ÞG{J)"ÇÊBõ»³Õbö)[¢y–#éŸgýÃkÔRV÷¡ÚúG˜Îê5˜ÞÐc©Rs>×…ÉnžŒÞL×_¼7º¯ï.e©^z“¶Ôš×»eªÚ¼Ò½i溎÷°ÂÜf/ŽƒÚËÖNœp±È¼Ä½.ÿÓ¸ùIVêÁŽ›?Za•4Xwë÷‚ú¾ãtÍǹyÓ×{×ðº"½¾n AN¿ÄΙòK™é2u|[^]`}©þØj»qó~9£¾|òè<¶ñÏ]ª„vË´\Áœ„;¥ƒ¸’`xtoûœ·™Á*—=*wêa·f¦Ö²ƒÂ>­då©7këÐÍ»ê=ãç:"”ÇÖ4vä´¶õ©Ò³Ì;¾‹À)ö4±H†g³ÙÞiµoýýk#J­,ÝŸŽ}HÀ”lq(£þ ˆì˜L4=HSR®ûT¡þ²­Ò”ë= Q­ôÞKÏÒTË“d7*䥀ÉkñJßNÒw5гãÃݰ>¦~U¿üa¥êÁÐOvñà~¿7Õ« 1¶/?‘équû€×uK?Pe¬ÃßÏój>"å³¥O¹…{ÅÜ7ÏiqÛ´WK1ôîfþm=§y Eþ´.} î†Á¾>Á{¡Ô%·}6G ¼GpÓ±|a 9Š7ŠÙïþ1‹=:3®:U‘GýTT¹³­$` ëVE+‰J-}v½ ÈçTg´eãÁç—£ª-Hz×®«÷ò£ç{ï¶Ò*µQÚZÒ¼G/‰ *BL¨þá½=uK0ðé1ܵºŽ[t$÷Ò­rl…œ`‰úéc>¤Îs;&\Œþ{C>5‹³I)O\=ÆÈ‹"5ÌȪëB±ÞÏ JþÓñŒýñárà*òíÜkªÈE;¢n£+X´znÊìÃc+̾¯ ô ÜèäKá–ú´$ æí2¼`ƒÉ­î$jœèÝï3q^ªcCîwƒÐ¯€ÆÄI ~ífÁÒÄõp5X +s‰N?¦C#{α¬’URœ0x?’Ê4 t-U“é ÿàöÑáý·Vbw‘?Í¥‘Ü ¯©*×@jŒ„+·Þ´?~cËÞsvÝÇ(zm˜€ŸÍi\Ù?ÎÅ'g›Éu•®¦Y‘ú,¥Ÿ<¦¼OAÌtÌ#"ê‰A¼º.¼+±†& äD1?ÊHÑè»>:N^Ùö¶YF\ß?Öuÿr'6~WCùRfniÞ5Pçô óµ·޼ÒR|fe$£Ò†-4äÞ­¿À[ˆs‹Ž»A j.žøÀȹÞW&†#t-7”ªÀI$sÕ–4×c©â,Šû´jÁÈ á Ï¡a¯&ýÜú°o†Ò°Ù.¨6œõ Áh›»„`»5a–Ilë—TŠª†K”lGrñI—Xv”Q‚­ÈðA$‚mYºkõÑ\a/¨6XåYæ(—H¼_.aTv·!’+¿q0{}")77%%¬R´3)K*õ ª²'ÈêEÙ/—ŽŠíGðáe†™ô “e0"ü6Saá]ÜûÎÙzý`«í÷y\øuªVÌÓ[Fmú¹ž#yµ|8g#¹àï\=õä=%‘c¡T+ø†¿Í-nb ÷ŽêE§D|NÇÏš±òÆÍÀhP.Ivëú"ëó’Û’¦÷ÔN!Gh‡ÆPåÚ硘60™OF€ÄØu¹n!ðoàlm–¢÷Î$û.m¹m¡$|Õ:°DP” îÿ Œ÷”0á6Yúà[ôÚZŸü:‰„7#=c_½!Q7ý @áxUEË­>0Þ”ní5£ï*Rn|Hô¡æSäíø]ÅK92õÊ7%ªö¨³÷gŠkšWõdÖ%eMÛ1q@¾ »ªk²öï¹S÷ºo Nüær¿ú{k߉ô„¬+°¢oÕŶ!Äd Ît]ÖŠO%ÂH*£aýûgp.ë[ü Qëwšö·Úº öš„—J;’¤$ ×eKhüB‘{xë ²%õ4~ˆ,à· ›£áWÛ9Ï-kP›Ü¿h~Ø$GZ“Aš?Áž)ãµ#ÎŽ.Œ„„¦döì½b›%ì_Ìk“âu¯ˆ@EâS[‘îf\¬›LÍ’¿»ÏšOšµóC5ìâ¼L©vÉH~Ù`i·Oë[\lJ5¼…”„#i@XÌÝeµœHd-Ý襕Jêq÷ìÿÖ—[qËBîy¥Ä½_ÕóåõÚž%Q´ç!§Ý’c7¼„m R”i>ãYñ–³×9÷Zªóyâ±hÃßæµ¿È—pù&™Ä„¼w`IG¾Ùkɪ˜¢í÷%(z݈ —‚< C¾Õxs„óeWSJŒ°ÔÄ b…•Ú@8’cQ‹ÈÆãuò…]ÿ€„³ßïù®æûcXóÃr]îa9r8NJ´„¡ø-[Vr Ð «ïÄ —´L7Ä`©!PŒ¶§Q{îãÁ3ÄšÛVA]ÓˆžƒøuXàÁ7lÿ½WNo$˜öÅ¢z6ó8¨ÒîÄ“¿‡™íâÊç.’0ÏŠ*E¹¿ŒP@ÕaonóËŽ ¢Ž£ÞòÏé-Z›Ä¤˜’QE ÌëŽÂêõô¼›0›×Ýý%¡Ï¨n·(ú»pÙu™/ }‘e_ ÎÔŒKiOÜsÏMÍñJ¸tLέh(OŸ@¦ÝúÇOïœ£äÆ„>jÂÕúh r–·tŠ1õÙd×e”WŽ8="ÏùèèºÄ=gb/ÿãŠÛÕJJ3»ß|ޤÐ,×ÚdÍ[å«C‡¤¢â ¸7WJ´GÆì ±.Œ)ý9Ÿ½)hÒ­<ž‡¥&ZU!ŸíÄqe¾Ê?¦=´ÿñ=ˆªõ›â}Ðöúåþ:Ì—!ÙF\ÇÛ”Ðr79º;ú½Ð#‚q è6÷ W%b]{åsæÐdúhá}™„zŸÚý™Žo>™÷ËßÁ«û±R¸é Y |¹È¦/Ëw¤fÔ\1Æh~ŒÐ.„0pTô–¹ðR_ÑÖ,B·”½¶5ˆq <>˜ y;ëII™]ÅÝ=¦¥}ú¶9©îûŒ«Äƒ[ß_¦¸NJ4 ‚æ @pímE ý޲¾Œ×)à“ßàÛŠ%ÛóÒ̇€ª®œ"ô% §%©0ߨK:ù%™¡ú5#hÑÛ»!ðžïIJøè©úÛøš–·ÉÆÖ(ÕLW'Öæ¨r¶á` m/6$ìç9jf x謱# ´Uš’²Hù–wX"@^r¯]NOÏzýYØ8ý>ÌXGD'3|¶¢öÜ@:ýN@¾«W´Ðè½å0X@ŽŸMS™Ä²£ŠžÍa_ðÕh´ŒooL…N¾âïRGžýfo½è¬ç1bøëaÊfñMïß篿òCU5½QZÂX¹úÉä÷‰ÊùË •Æë0rÕ&’“yî‰gav¿êì c ê<"#X‹>ùùõÙÆgÈKس4ËHÚßm>az6!ÆF u¼M}òƒRLîpA2jL‘ÒFÞ.ÈæÇ'Àáéð½äþk×O~Ne‘øödg‘Ô­E÷âMì bºÖÁ{{ñÆw,Av'\ÏÄRCo”‹dJoR†½2x,ègw'#!a\ÖþO2˜Á¹¥®¨8HB//ðô’Óë»/Ùñ²AÈ ™¡øn@fkS$‘pòxg9hì¾Çβ—KMHz‹Àûžž—ÝîÀFây”¿ÈAÆK2Z(2ÚöÓ²ÙmÍteW9T5ðp/£]–Q,YA9“Ù*C·&ÇmD½ŒQ¢œ¯Rz%[ogÑã­r…ÜBljdiá³qç."Œ™pt»ñ­ÀÈîAùnÞ)xû7–aÈzó©§ö•É'ærÿ®ÿë7ü¹€‹õßgB'=m /¿ ??¯¯'Àæ565ãâûwÇï‚þµôUÿÿ›{AüWõŸÈý·õŸÀ}QÿÏ‚þÑþvS÷X~_’ÎÇàá¥áâüy'vSnÞ¿çT3uúý|.>¾_û(8ø.ç:ôSÿÿ»{üçõŸ‹‹‡çïë?ïÅùŸgB¿þm £û×úÿÎΆÔ…ã÷õÿ@ ð ”Ô¡±±177WPPÐÐÐPDDdrrò·M¨©©ýüüÐ~í°Œ®öíÐí<*ß2o?ì÷¸Ðmùå±é¾L¨¢AEÛáôÈ”¤U¶YâKwÉÖqÏb2—ÂY©rdUî¾+çA#†ÜòŠ0ÄW3vÏD×½>¢y Gí oø±ßšAýöžrÖÞV½_A:χà[AGɃô8‡îoÆ÷êÉt$DH]äž½â{7yíŽç¯a’šå¯"W?ïåY›¥)¶tj½úÙSå¤\ÎU‘ÓFöåÞ„§¬Qê«äÊLs¾& ³ÿT»Ü’ñzüâÝ+¢Åvû F½ÍÐs‡š~¾9_“"ýz¸kêåa—oÈëß,¸ÊမE—ádKÈG›b»‰²„ò<Æ} h%s#òµŽ~ o‘Jêm"¹Ô:xб—«ê.S|Á‹(jž%Èâ²[‰%Eæ˜+UnúŠ_@+ä$.ÞqB›í»?r¦üs^®C¤‡¿”W¦Õ§W¼ÝÛ‚>ë³­ŽÜÁ:æ†z^Av°§^YùS@<“¦h(^$â…¦¶zŽê*NlΛTAÞç@ÉÒ¤tñ‹ÒyQE+«Ö¨{wфΒ®’8‰‡ …ð2D£PVóç[¶%y§ï¼P‰åë£Ç+× J÷cŸ>÷i#sI¢¼™æõCußòÛÒ öÑI—ý}Æ×}¸ }üOX^–Oš<Èܦ„7ˆÒÍ¢¼ñ]Ä1¬~˜¥ÉMÝžÞ¥‚6ò\ÃÖ8 Äy_U Ãóx›‹´õUž/—¸†ä®‰Õ›™W:ø¸¬& ì‘Î0 ÷û5übéÜîØ]–AVVÛ¸#éCpߘxQpXÃ4Ö6ñÊ[fœñœ\‹9B€D%Âò§.ìÊx^.³ö&²ƒ_æ{[]ÿpŸ"·µêõ½V òRý LBö Ï(@„ =Á4ýzª2%…x|Ái ›Œ$ºK´Itàˆ³d¹„E´ÄÆòä$#c0@ÉïÞÓ‡&@ìû‚ž¹kŸDÅWZÅ@£ìCIîÚôÃjØë”¨Ì]¡ê÷ÉYœ,„I}}0¡{æGy‡Xñòmë²$ÿÍBú‚DýGýW;–¨òDѯ6õ f¿Ô‰`\ú>+¼{­L%Y_h·kÒ¶ˆðV û’«ÅÎ⇭om_9N‡– ”ÕOLqKúbÿ›µß*È¥¯)–0O%Ä®B™ý+ Ç®º>aͰ°ë`6O?6JòWŸk JB±¯~å')ký´Üs)ê ÁUgóy¬–-f¤u»V&ñ9.éAë\DdÒÞÁÉî St!Ñ­&|ê_…³¹p ¯Ée§#Õ|‰ÒÜÇĉ{Õ™2¯ÄÊYõqöàÎnµ‚Õ,¥àË=ûkṟCê/T=`k*:×åJ&Ýó&>°Ú]¬ñ=7*LEÙC?û”nFôr¥éàûÓ“t–—OiÛ¢rõåãŽ÷êQõCÃ.j$€••ì¶ál‘ü´H/÷NÑ 4O?öj£™jíY1ç#§Æ—<ÄC2—ÎI¯ƒÂ¦4O_ ±ßG´N©D«À¹Cè ·œìžØÆ‘Û&Ñ r»ÿI¡"[ÌO Ñ"ü R˜N§¸ 4þ,•IÛÀÊÚø·YXq‚ÀÖJ¦–†X/ëSR<Çò²U®ã!,?ÔHÓÜmåÜòŽÞtÚVáäæö„16¼¸Û˜¥Â-Tê …}L‘fÎ1]ó&ìÅ÷~÷ßyõVoŸESìcYµË}SèQ¥þ>,¡;)ݤXbлǘ4Rbà_ÁQ©¬0’^8XD+´ÔÇ#QÎÉÕpËŠGƒŒ©ìI)Ó­ÐBR¦œ‚^•xš¯I·Ûƒ ÿÀúiíåR‚KtóòÔã~ß@1æZ™•븻‘¢wóp‰^¶~G›öà¼v¥oλƒÄår†W¶½Ö· aßp8ƒ¬Å[L†¦FKWÙgÇ£èÅ–‹—‹=­…™B 7nwCo iݼ$^÷¸}„j\÷‡™²˜x× f!Ò/é磯…:ï`d:Œ”Èߦóh“”.Cjh° ;˜âpû[Ř¡+Ü®bn‡á üK‡\›¿9õÕÐ<÷‰q\} >Õ·¥6$yÊß3]CƒNͦÉr«#¡Õ¦—ݱ¥þLVê*öê&k>Þô;¢Ë1ƒ˜WXœ4®ZùÎrp¡^4Þ;y±?¥ m¯çiŒÒ!þ²Ïä.x{×c>5ï’JÙ#esü—%x7$2khÞæÞU'¹ËQæ!§2ɳ[CsPŒ÷¹9Öt! £V»VîŠ\±bN ½«˜Î-y1ÙÅ–ä™\å»>¥ºü±Î=o©jô’$ªJ¬< .O‰ÑQ¶Å-Xåþv7³x5 q¼fúâz¯bRØü EÍ 3׺iKú$“—9ÓÕ’êšéÚŠÙ}¢nÚ¦/s>Wk¨#‰ÒÓò¹+C“FŸk3r̆2ÔƒîμÍaR,œ IÚË;tÁLªùšx»³ççnkÕüqׇêÄi`ë'IrÙ¦þI5îyëo[2e}5çÑS^›ÉN n¢‡õߣ5§”ä+E\3ÄÆU òß}»œ„+ðF´¯EßÚ–X¹<±iNúkì™#ꔇð¦(°ô:=–5 .D–ºYh”;Ò˜oÜ•ÒÁ‡bÔ Ênö$ñéÈåÓûöZ×MQO«¢Â÷oÅ—,8ÖíôA¨v0JT|­+=T.{Ÿ#(`n)”Cõ 9Ö}Ñ*˜ ¾!·‚õ²Ð}˜(Z½³%µ§­Öµ0ÀÉn¼ ͸(xÔ"Y–úÀB5ïø³¥yÊõ—° • WV†t©´ý«Ö1~b_·:lqå,®çµ¤=?Z¿ÐG]žŠ+—‡Å€èœ”1Ú ¸Q@q%Úûj!ñ‰yOƒ2i ‰ä¡§ðøBøå®6  ™ÉI«B K$¹Gñ“¥éî€]¡ÙøÄQâGÔ}ÍøFzÍí˜,µäWO­žÜ²áA0$?›öƒ£f15IìZ2˜ØóÚ`wµ”ÅTâ~ª¥uKËØ¹Â“BtY³õí§«y f˜bšO§/ þø$ÑÊe)¦YªÌ‰‘¢in¢R&i1¦^Áˆ-îsÿ‰Fy ×÷ë)ü¸—#J .ÕMdL»•ŠE|Y³qŒ™=,m=b¨17%jt´z¶Ÿä0]Sp5¨jâ U¶¿,êו¦8!Ùùž‹æå ,G¨[”\³ aÚÛð§ÅLŠßñžV|›isÏÁ3/÷bÈ,”S ˜ yH²ðz/C|¹^“àWùü}mt}Â%°‹f~.|òžJ @\ÃQ_“JýÙ¢bZá8©¾fÀç½ÅIËrëéD¯ˆ•„iÈ N ƒ¹fR¾ ÿq™ùËÓ¦kS…·¢L?wÒ{ÿöÕêÌø×¸#hÄÏV5·¶KS•\>1¹ÒiÐ|Öb¥º‚kÐÀFÑ𣖞TB¯5fúíÍòÄ#ÞÿÛ*“À2xà·¿@¢Äwøåc—鼦£í¼C–ÅH7ÐAïñ¹ŒFÚ uÁš¬TŒNÈKÈë£Çj¦ºÁ8’;¾¯ ÊIÊ"R¬™þ)FU¦ªƒ®—OÈû®ˆŠ)êvH0d}í8ÆTñÇ™üÜ÷½ QöÚ”îmHl*äsq’Eò)Û¨U(;Ó†CZ¨7}D'v}ÜçÚ·)¦›n„íO“L'ôüšŒýY±É(õ%=úñS¢þë§”{Ð#轩_2½»Å„ÃØïüäGœo+ŒA5˜& ë+9hÉv§é3LR™ä𛓓¨lfÆç¸éˆ€==“VÊâñ^60¨¾“ú C< æ©å‘ Ä¿§šDR’ÿ‚Îeøéu°èŠ…¯ŸÝC‚{ÇJ/òoÖ¬ÝmÒŇâA¾Ì¥F:Y8DíÌ=Ô× ]9Ìö™P¤–¦gšƒ¡¹ØÙ hbÂß>xHZ äU¥ ÁJk1-,f‚[>n` ̽e–Fp…" ÙøcŒz;åX(Gìã®-îhü/þ_Óýàú™n~EÉN¢e¾q5_ŠÚɂƨ¹¥­´_ZJ™uz…ì•íÞ#ü*è ÙC#Í¥°Ï¼Ð0>ÓäHUUz8ãÝ8æpA!®ÊAÛãæŽ.¸pÆÑ’Àõ”袚‚“^²÷±1¶£>ún¼þ ”¦qc§wja3ϧFSkS9Pç…â]×ò§Wêk5µV"Ú„n[| Ë`\|¤ZwU‹üÁ½Z­ÂA#²*K}aëàw¼7D{„‹ ±¬ï%Šô¿²Z?‚6°ô³ÜLÊ>+ÇD'ÓxÉXý®‚F”¹-¡aDö‘îµÎã…upïC£:…Íxö—¶®uÔh5Ë+q›LCÐÅ`xR½ÖçÂKŠÐДÏñb(7b‹iˆ"²ÿˆL¶ ‚'‘(Ñûå»*vžPìÆv³ ’¯ÝöCÑŠ"’Â4µ üY‹¾Gý¶ú­.¢_B˜QÎþÅ@—˜ÐZȦØ==($­j*®ªP‹P#{&˜Æêì ¨)Èɦ\¹·HܯÉZz+æ¸L<€ºãáµ§d,(´ªè˜üí®Ày¥¹èŽ”«&ˆÊ²q0:£¦àvÔÏEYU}Í »15 -ÍtòÊH¢K}ßkØ uÒ3jtÐjŒeÅôQUB] Ä]–Ù¥Ö©,"²1Ì;2F‡¯Ô‹ÜÎ[Ÿ×EÛkÂ( X) ãk¸ª¬"ñ2v $ޝYÁs뢺ۃ(ÍMâ¯"·úã,ü¢=ŠÜI4˜Ðd2N;V@Gß ¿¹!uà[s·ôšÒÝmŽ;&¸GŽÛY?2à@MöÍ·RT;ÐtáDO¥GEüf”[o[y›Wøñf°ˆíöÓ}1­ÞC޵VµT h¢¼Ôë†ß2°Û7||‹vôˆE‹ºwNæÖ¨è#|2Ûã1mýú±nÛc›kt¦Ž$X^<6Ÿ1a…¦R £Gü|ÂÂËs(Ù8f×Kq^2Tr´ lƒÜ·Uø¥è—™ý.vñæÜ­Í+AàQv™çWZQw^I}­ðk.Qˆ)TNjŒyÊÏþ& - ;£×…“k²þ…Zæ…'y2áœ×AY§°ù•OšOêbÚ‹z18˜CR¥+Þ¦5qõÄ ½ÌbX‹|/MßßhÚÄu—>H›Ì¥çø+“LÆ•9 LÕ¿¨4­bqÙ<Íàlà{ÀtßaXõìlúã±xø?çÓ.³†ª¥ßûÐMUã0™'^^N¶—ŸN¾ à˜ÉÄ;J§‡Kƒïc…øåa·-2V±>~Xê¥Ú¦Åñççòê³§~ ò½J ÑP=2 €0óõºé””nYhд YÚÇ”f¦€æ#F,ü·öÊE bRÈ®¶¾pÂm°ûò#^+æàÌnÆnöGy-܇5ýê–ªc úsê¹6 1§MWžHÆ’\‡Í€”®Õ6ˆAê—XþÜ*»òÈŠøî:³ÁžyÿJÆì&ò‰È¨¥Ü%f‚AT© ^‡@TñQòòʼnÛPJÎ0Á£gO•³Åœ!aµ|ŸXöócx1AKØi÷#½×Q}bl˜šÀuTGx¨oè2dáz½…’²#Iªs’›[õCŠm ~)`4q ¿Üh‹½éæxía×´Ší‰:ÔThÁÓõ&ŽQ;ëqjé«K…z—H傿~ö¾t~¡V+#ë?Ñs¬EñÑcð&QØ ‰|ÜŸŒ‚‚£ ŠO‘®Ó/ß¿MOGäÈzßRè•KVÖ8ñf¯Ç"rC¢Å5ëòÇ(ÍZ™‡àÖ^ Ã{û6eÝ$̼ývßkT"Ÿ À@é$ŽþPö¾Çå*]¬Ó‡?½öhÒ“ÔJSŒÉ/›åÃ:s=ÅXÕ•ó›xq”›WóÒ¸†Ød›‡û·©Š&•$œ!5“Ã+;™7 RàXOó‡n»ŒL0òß4‘[D|Þ‡ltÒ2û1Dýn2äѤE *uÜÏʯv~-·þ4Ì8±ÜG†nÁ¾–?a§ Éæ©)+î{W“(ÕßC°:–|8Øho¢î ±@qlq¸Ê•íEÐQ°¢ë'À"ñÜÒ´±4t ÓSÉöDg¢0­°îa3‡Ë”ó¾3EÈ\ ÚÐ"zºe™½&ûMÝ*ô!YTl¸eÜš¬Ç¦šü‡H™^‚¢™è£o°òlŒÄòËÄ üŽõtkY¢ƒjg%?4 ZGÍô>›/iÞú׎¸mJ-˜m~Ó@õ3EPHaóž‚̰)_¬š|6ÙŸx_1C»I¼eÒD9~Mää*FáæE=„ùÞKEÉh¬Ô‚ê>Æ}ÁS®*RÃL«šÌs–vè‹þÀö,°rÛWä. ÝáË×¶ALtõ'/àŽºÙ¸ó,!Ñ(ÑÖ’®bR ŸCE¬ßâ]ÊAs.á{˜?šÎú‘ÄéÝÝ—ƒ˜­â†"Šj×P=æUŠAÌ)÷ïÄËŒžOÉ[Q]ê«;oÙpó[0јÛÐ!d|9–ú/pȆ0L]Å®…™ì…׎5¥3‡8¸ŠeØDV±áË6„G矄Wˆ·6ÊTža¹ú u¡ƒ/äšmª¬—í^I«¬·Ç ËÍÇÞJþIb ªÞ·ÔN{#lK Ôâ·x\ŠÌÃ3•4 ±7>/Ä7Êãm'ÂV SQ'—H‚`ØÑ3Ãð\OÂÍ÷ÎIùTêi¶ïØc¹ºÇŒÁCìÍ—ožIÍk‹êàÌ×y”•›æÅ°¯QÍ1$, ×—3'_äCôOè% uZt¶^«A_mNBØáÕPo`N¹×.ŒÝi¹àg¦vÈ¿SvXe¡<Òb~4©úøóñÌ–˜H@NE®üŽøDvÔ+ÕKŒW“ÞƒxÄT•½ãù³üÎÉòVÛ£hÎuØ­ÊÍwŒ®ÔBtÜ>ß࣯B%b-_b`D{¥W, š š·ú ¤¢ØÒFÞK7bì èytì:?—HL‰Ì×ìßú4ƒçõ,DåFÒf{]ã:¾ÝÍîû\Hñ=ÑZ¼j¯[ð«Y‹ ¯ÄRÄ.qÏ÷õ`•\ ·Ér}ž¿2õ*&|)ÿæB%½>u˜ÀÊ'ªé Î*ߩ̃R§#=|ÿø÷ Â@3›nÜôü%mZâØÁËïÔRQÙY¸¸Ëú;žþ2þ­‘é­ò¯W<ˆ£ãÕT'xÁ _îÔÊhÆQ©k¾Aya ÊsX 0„5ܘU×lj>`Œ ð~©áú‰£1ª6ÎÒ¸Ö†$¯-^ä÷ JJ+PŠ%c§$c·+ߥÚPº™LXÑÜÏVSqX)å Ê„]Öl⌋Ucd¨ro-ýn!Œ¥ô†È-ÞI Zû@.Ÿ*/+Ö* íA>}žxaúîýÃæT‚ÅyIn‡ÉÜаœ,ùà³ð˜ãÆÆU馥ý¸wʆ¢Bj—t»ä¦ z««­6ïlBèsèÄ0°¢-¨Éé^E`Èl3ØVÓ·Oè~¬M?NöÕp ÂMþ©Éf”*-ÍxùŽ*ƒâe\ò¤Þ:Ã+ûÈפÙ×Â%9«x®3Ø<–Û÷½÷S=ùÄé²£l¡…¼>*U>B_|Âtg¼<ŠÒ½ùF%HŸ7Û§¾)W¬ž}i€cûH}d»½&vëÐwð¤g—Ÿ’èζñå¦å††˜ò!‰’à™°“;` o,lèýGÏ‚´Üø•N.)•ԯɹ¸¹¨2)¯õ¹ü°”Þ…ë2Bš0õ'fai(Ç€”KõË›âqVÏã.LË%Jb Ø“C¹¾Æâ–R‰úÑ©.e‘ƒÃD]­KËÐ&µÃ:beqô`¨3÷CNþ]—±#6-y=)Ù{éýz­šÏ4®«9Â…Rè×d"Šè³¦a_i[8†çª3·ÈïÑjM/ˆ3]˜ŽžŽŽS/e’&!‘–7¢ž‚4¯«=`ðÇxÜ¥P'¦{Šª‚ ÓÑ#›¨ø\ SÐô°·‚ p,i¦‰ž~Àù`Ò=‘„¸qŠŽŸ¼·‚Øo=9:Úôgò«ÃL3¢É[H›à†¯üèÕÄÞL«§iK-@và ‚}“®Ôÿ­bÿÇCL¥¹Rï'Ê1k³X¿;’ZÁYrQæ³<”ŽT/î!¹ZüÒpâ[B'Œƒ2õpšüQþ2(lbc´ÐìŽïƒ§Xmæ¥CFŒlûÒv÷§O@Uüî¹Whžr$b3ÁžÇ›O¾Ø ¦gv_æùî¾/X¸Í¼wKlr|­„²ÞõA×~m-ëPùýñYS³^çîù‡ø#Jvý=ˆ»EÝë§HíJ¯k8¢~œBûó…+~ä¬ÒS°ƒ®ØâáÆ!óÓbiô¥e-dÔûQ`.”ÐîԢA{Èò£;bÑv%éËgkÆRù²Õñ÷aÿÚZʈªÌI3"9eÈU+e4¹ÔåQŸ­…žë)‰ïÊ–ë öÛ¶Ý)U‡…/„Gퟦí2Cº†GG­¯ê»‡ún‚ÐÄ+•»ËÇZ)¿ÐHZ|í"À©"<®õ’òs·ÑÂô•K¸;q¿rCþܺ *>o7¦þñÅU¸åe°¹aï˽øûê{C=œ”lÒu^΋ۜ.¾7‘÷7,…r~2c˜IL±PNôPLÚãgpB‰j0öc^W3ïuöˆD¥m}²å²ºþ¥|uÁuœê Å÷̼M!—©ŸŠ-®†Ÿsìe¦µJæxK ‡˜ÒúúÚ•fU*k߆ÌLýAÒ‰+C¶ÖP°C&Ó 'âW`Z‘úü|Ëæý,s“%§õ–]©¹’PsüBO¹Ô¦§Ê'Óìs§öÊJ.tC-ýÎÌô‰åOÆOuÁã3Šßú˜‚Ôîø´ÍÏ’aÃÞÔÛÎਫ਼X§oJ›yøU¢ð¶úüa¶´ÿ8ëþBQŽÏC•o鶪<úJ>-F0¾¬ÉTC©y S&à4Ò¶ÅüÚ`Gcúnïš.PrFÏ#!¥¦Lî_ÖI0–ZRÇŽ‡ò!(‘3ZÙ£¥y Õup_‘Â{cëÆA+PÙZ+¯<~Ë÷#«ƒ’Zã/ŸÔÁpfwOPP¡»Pê^=é÷8Af<Õý·iå)'¹ü0½ž Û ..Ö Nõi*éºKTov).®®QzºQ ·5æÂú89q» ·Š‹½®ÓÔP§Î NÝ„çÍÔÕ HàÎNa|D(NuJ<ª{M-PäB9!ôs¥¢ÊÕcï³ð[ÛÏrsåû›E*„é‚lGÙ‹«èHåiWîà )æZe{ò(};Ê””Ÿ‰Kö4¿‰¦[ð2{DŸë¶o³«Ç£ú ¦íŸBA#ñ­‡‘á}“í¡W¬¦ØV>éî¹P ã.x¡}Ÿör£¤êv\\EùðIøã”¯,çïsOôæ.®¶.놘ƒð«]=ž¬/®:—¡܆0áHËj±WÞÚJ‚(ØOb#@NBCUô!M°FŠõ…ê.Úåñ[ Au÷ðIp¾ bB>FN›ÝãQ•âíïD8ÇúäÒ«ŽÝbßÿ(|µjDéË÷¡0¨¸œ¬Ír!{—kü¬aÕXÈ>iëï”´w80± À†êª¿!!OË…²ÂÞæô®}ý.0m××TÅ¢t5¦þN B)oú5yùÜ;ús²|™<ŠÙJoó»ì›ã“¯­ù¢-"&?؇̓§óál«ªÛwAæóòŸ·…%µ¥y*fsÿ¼Û«‰w"ÈÁzí`¢x¸ÔVŠøb?F°ä].®˜½gÄ¡xØl…Lì ÛH’+7½aÉtpã R†¥ƒu°_‚$űQQ%ç—*¹d±²j¤$£äæ×ì^ch.)_i ‘j<݈±vV?Ñ+E©¿åå£T½ô ŠRY•ï0lõW»MÎ,š(¥<@\BAÀhµ Ü½ÝebQh]bÍny¹‰3{hùhã‘Y”åPÚ=œ1P 㑯¸"”³Þõ<Ö x1 WË>+ÿÚ×ÁãP_sÎÏlƒUù¾ÅXéˆómk-ÜÃ¥0·£%îJ58~: ±e@|wë]úËâú ¤Ò× b) çœ^xÓ0{òúÍÖÝìëbüêêäHsH¨¹? íÒµkmÉIiy¹!(%PM ÏUvE]ïI¾Àë$l#¿mRs«…'ŸÏR§L{2¯¾6úÊTÇïwì üI½‘“cÀ “w3Vì‘OF‰eUæ5pOíá!Qš‚ò¼Ë­zÜñ û„âÍC€Ê”^7¨65<貕,ïaªi 'èiJÍÇü||\CRÜl‰+…Êk¯”Ä)Ô€<åb÷ã'_‰Â¶Iß GÌ?.èMÁòØ<ñ‹ÁóP/£c°·zˆ9«ÐYÖ4ÚÀŸ$F¥¬ k J•ñˆ@0°eWŠÝt|ºC˜ndñ¢WQ¥_ý£-œ²S&ñUdò´ZÍ•°>šW™[.{Ć"`4Ù•â ˜3ÌÏ"c^”TÅÚ=áI9Ǧ\Ye¸Ù7EœÐ‹û†'p¥ÿ›*Y_º˜œ}P[3Q$'%Yò!JV²+_Û—“ð`µÉXŒq!V/Ô0-5ŸXY’ Øèö‰n)W'ÜgÓ]‚=²ŸópxúÀ•öŽ„«´ ò¬ÿ\Ÿé²k~“[ÓSÍçú5¤dMwš¨ÙÅ%4€Ýlø(ÍÊë–Ñ6RÅGBTÇuÛë©Êí¾—g›à¥ï´^Z8Ô9‘ŠR°[ƒ¨j5ÕPB ¤ÆîÔªY x¢}˜~x2–|$òyz¨)¡éþ‰‰Õ¹^~Úþïü¬ÿ¹8ÿõLè4þçèüß‹õÿgB§ð7ý·žÿ{±ÿÿNã~öÿ¸Øÿálè4þçhÿ‹õŸgB§ñ?Gû\ìÿp&tÿs´ÿÇÅþgB§ñ?Gû\ìÿp&tÿs´ÿÏþgA§ñÿ·îÿq1þóo ÓøŸ£ñ¿‹þÿ™ÐiüÏÏø÷EÿÿLèþàó3þw1þs6tÿs4þw1þs&tÿs4þw1þs&tÿïøªÓÏË}òþdþç¢ÿw&ô·øÿÚÿÇDàldÊj ¶5F¥ú×ÞMÿaœüïÿÃÉÁÅÃùkÿn7Êå‹›ëbÿŸ³ !ZIe m)Y EMq…4t¬ììZÜìì’’¿½°qpÒh8Ù9[ºXÚÛÙ°³K)Ñ ã ” a! Tq²»ÑX¸¸8°‚]-Ý@t'›Gí\X5<Àt4&¿=è\À.¿J ‰…‘“3ØdélÏÊÇÇÃÏÊy"ÓÅÒÅ,¬v§ùË6T4Š¿ #‚¥³‹ûo>p…l,í¬iP…Õ DÇÆÆŽú3µ÷ð4Û±™8;ÓÑ8m@tÎ.ž6`g 0Ø…ŽÆ߃?ñ€Àþ[ÌíM=QO´¬¬42`;°“‘ Ø”ÆØ“Fò7q4œl6 ++Ê©¥ͯZ¢s´´3{Ð ýË©(ÙYÚýªBtЍ[z;cgA#s°»‘07ÍÎma‰Š“‰…çï"$N¼þ&CöWÿ-AFvvö.'éú{A¿åéC†™%*+ç—FÝÿ³ì®v&'¥Çùï£ðºÎÿ-1æ6öÆF6F†*ÿÿ ¶9É—¿óK„; é“Î)ü{{xº¢Ü5,,iP.`Tá¶u°»€ilPoiìÍh~o ޳h¿\ÀgÕˆqÓ £>¯N.ÿâöጒc†BëO¤ß>»FNF¶gòå=£Ï€NXËè”fñKúWªgUQ ¢ï¿XÓý/S„úý¥Ã Y8Ñ8[BP]UΓΥ©©ØÙ™æWGDgdcin'@ãdiná"ˆzíl‹êÿµ×joG£ˆúsp¢áâ¥ápó ðpÑpqprüꋜêV£ú¸¿u{pQ©ü-i'ýwvvwww¶?:ÓöNæì¿úP¿§WÈÒÖœÆÙÉäo{Ývæt¨ ª‹ÿ»ËÉ*º(|,MMmÀt(MÛÉì¢CU—_ý´ß:ÖBì¿¥åô[bOòâ÷>ù¯á‹ÝÂÿ5tzüïÙÿ]Ø ÂßÈèÜà¼ÿ?:]ÿÏ‘ýçþgB§ë¿ñ¹Áxaÿw&tºþŸ#ûß üÏ„Nדsƒ?ðÂþóLètý?GößøŸ ®ÿ¦ç Ç…ýç™Ðéú~ìÿ/ì¿Ï†NãŽìÿ/ìÏ„N·ÿàó‚?ãÿ3¡Óø›ü/ì¿Ï„NáovŽÖÿ\Ôÿ3¡ÓøŸ£õ?õÿLè4þçhýÏÅþgB§ñ?Gûÿ\Ìÿž ÆÿÍÿ_Ìÿ ÂßøÍÿ_Ìÿœ ®ÿçhþÿÿ3¡ÓøŸ£ùß‹ùŸ3¡Óíÿ9²ÿ¸ÀÿLè4þçfþÿbþïŒètû~æÿ/æÿΆN×ÿs4ÿ1þ{&tºþŸ£ùÿ üÏ„NãŽæÿ/ÆÿÏ„N·ÿçhþÿÿ3¡ÓøŸ£ùÿ‹ùŸ3¡Óç?£ñß‹þÿ™ÐiüÏÍøÏEÿÿŒè4þçhüçBÿ?:ÿ9êÿ_ègB§ñ?Gúÿ…þw&tÿs¤ÿ_Øÿœ >ÿáÜèÿúßÑiüÏ‘þ¡ÿ Æÿéÿúß™ÐiüÏ‘þ¡ÿ Æÿéÿúß™ÐiüÏ‘þaÿ}&tzý÷9Òÿ/ô¿3¡ÓøŸ#ýÿBÿ;:ÿ9Òÿ/ô¿3¡ÓøŸ#ýÿBÿ;:ÿ9Òÿ/ô¿3¡ÓøŸ#ýÿbý×™ÐiûÏs¤ÿ_ègB§ñ?Gúÿ…þw&tÿs¤ÿ_ègB§ñ?Gúÿ…þw&tÿ«þÏ àæá<1ü=ÁŸóbüïLèoñ·»:[Úš¹ÚZò™88žœ>Êfkú?ÅãàÿøügþŒ?/7/ïÅùÏgAfÜü&¼|Ü`>° ˜`ÌÉmÂÃkÆËgÄÉ^~n.>~ž?xxÙMùþ®Ìš¹ý…“— ÀÂÏÉOò²ðxÿà4þµZý¯œ`;KÏ?ÅÈÂÅÉŠ# 7ðOá™ñþ9–‘‘9FCËÍÍ%%u¨¯¯OMMñó󛜜444¤¦¦Fù=>>&”È´FÝ¡»¨)©£‰Î}3CC£A{ )¦áñzé¼;0~~¿ ™XTßÀRæNY»ÖÓóì}±°Ì´¨Â†Õë'Óóv+âÄE¦ê¦&–¬ÒÚ<}uã°ÄdhÀKï„+hk¢¯‚zÜ;ªˆ!e§¹Tÿ‘ç²Ã µlìñöèýk˜i²œ—¥ÂhÔ®ŠEã„I¼À 3Œj?¸²ËŽGÔ×S$È}ÿz<]Ó5"ÆàÓ^Kë'ÖÙÛ³òhžQ?äoZ"5|Fäj=m$Åx /:#RAMïîOe9;v½ºúÚƒwË“>­ Ê%»JÑájz‘Œ‡¾| þ·¾S(ôxËuY3ä>s…:Jj#‘s‘sÔžÿÏÁÑF«mÎܪ ‚xÉ09.åèýq÷nÂBÛL6íÙª»Ñ5WÕ:pŸ1ê‹ˬ#±áTëÁ¦ý™ÒjJµÏ\êAÎhÕz»i,:¬(ùcÄÞ¨æ€4è-ebú+Uò»Rq¯"—É™¾^•òͬúއ€ŸDOEßÛãsG “4í­tØêçÜW÷ŠˆðeÔk£ ÊI<÷›ÿmÆÏxÉÆƒúq‘T×™p’‡ˆîHyЪÿälâûLmð•ÈK× Šhÿä‚Ê»ÏÙ·) HÓÕÂs,dóˆ2ÉnÐ7Y„å<}À™”ÁˆÊbœhc—¼æ§²¨GÎ)U”/%”¯¤›d(_XÄŒÁ4€°žt2¢[¨Gú“GÔc’FÖí€ Ò!V¨Ä3P!¨žˆ A‰2#þ ½)•ð í× ”kð +щ¤‡(VŽVßÊ€Ê¯çææK”_¸,#Ûåaa4JÚ&Þj4>*Ò&ßQfq£ýB“ ¾iw=?ŠË†´IÁ%dÒL´JlþþHô{P¯ªJ¬m½Çó5†.‹À½ÍÀ\¾áÏê%d|M»ÛÆ’iðH-µšÔížB,Õråœýeœyb©_žc,9Õû~Áp1µþåI·|úL4Fq¡ÌÕ·ÙddRyóA¾FWÃŒ±vò`2‰Ù f@­¦.‹_¿M+ß{'œVERôkŒ”ìÍê’â²³Êx-öaÏpò?6ÀÙ¥®á 2HS3&‘K/ÈÀ¯7u|æx¬ì]`BDr§tzâ`5¿X¥ƒ‚Òv%DÙÕߨ¬fúc‚°Pf±FáEëRÙL©BõH<¡ð“áíìÞRa¾w…w4¬‰@dõ‹uÊåR=¹óÂ2Tç2:?È»*ËrQÎû9º1­çv.e¿J3­Ñ®SÐI¹*ê—…ºáÛ‹«ºLd'åZdé7ÖšÞ‘rPôñÍ‚é»çç0’Õ4~'”ýÄPcŽz èzÿÀ°44:ë+_ÏÚ®=ý®™Ìâ›éçÀÿÃÞwÀ5™l}[ІŽC1¡‡Ž¥„&- H3 ¡I ¡7+È#EP:Šô&"(Ei*PD¤JG©JU¤ó%¨»Ëî½[î÷^®ër~b’gÊ3çü§œ9sf¦ŸÐY ‹Ñ)ï ‹§- ù ¤o3"öÁžŸyµxZÈ›úHË[?ÚïWýÙ%â`šò"Ñ-íé^ó94•’J•–)a&àâQë4©‡ýš´‚ã´¸ÚežTW‡\¬„D»Û.ô´b“pE(v yôêäB.-À3„QM’È8ÇSaÝz°Ø?+f¥•:µ*Õ»;È" x”AðêøÙËIVÉ5©PÆÏ |JÀ¾¡äËú°fçHºÍº¤¢%…9õ4ŸC©Ü Nçô h‚ïÆ‰òÃ\v‰KΜ÷‘¯CæøsP†Ÿ^oôN‘ƒ ¸‹­8‡ hæ=Cú…q&½BŠ´ƒÒ¢00ªQ›©ø(߯ zÛ¤´xÄ«}ÓŽÁÌnäšÏäglHç_ݰíŠt5`¼|t4NOÔø~H‚on‚n·Æíè/E€Ù ÓP²ðÖù]ã8;9Ç{öS ï-, ÒÏ_bfá‹ÒˆG7~LÝÿÖú…KptÂIKSHìx]¿Ánk cI‡K%å­6^É1æ°)Dð‹¾î¶Ïaƒ#èCOœ)L@æ*²}JIzÛ#z:xâö µÓÙHnBãˆðƒ¥„F䤙?‹@£ ²'òð";BÎV[ÇvwöÈOÊÎðVÚÖ|g8-,Hf¥–}~A’ÀÒ"(ÖŽSV~–ïõ`šáyjnNfØ´;—ÔrU8òøÊ펢<¤œáf`¡|VïŸ` ‚KuB•Õ ïŠVøôãÓX4iº±ÁH窛ƒžY¤›´½³ŸM¥ú?,(Ê:5LÔ̯TÍYÎØˆÕ8žzÕj©EΚp Ü@z¹œ„ž×s£úÎûwLݺ8z]sTüÁ…´Ä¤–‹H··(÷7Œ é‹\.‘19œoÍÖ&":¯\˜<ø¹SWÒAaùj,ÜÓ×uôé´4R§c:0Î/MHKµ5Ç«Á…ÒøÐtýb(Ö“\žá™oä“UvÔ»oBËeÞÄ’pñ!h#û¬†t.ï®»31ôÃWîÚ%CÛ9ŸÞß—ùXi^—åŠöØâé©ZlÙGn†¸l–úÞ t`Œ¦2º`/·Y+P&÷v zîñ&M¸ñׯ‹¦: ²_“£©8è©NÉm?™.—ÝÌÅÛ%{¶¡ºÉ»„kØXFÑTÊ­´·ÐØJ)æôß¿ÅÁ_’óh½ÂØ,Y’·7SŪsÒkïLžFzνÈ5•ü ÐNƒÐaÒz†]lWr À,Óü¥m¾YæSw.Ý¥úÝäõ\|Ø(:¿CˆgœÏŠÐ³Ù)a¤d£C®±û8«²ذ§x5²‹¸£ò?we]ägÝ£áy?ZrÉ®Ä}¦àŒûØO?ÛTraG«œ¬KêEùÇî=Éþ§½Ÿh`KPÅÃvï:à [:å .Û¶jÂy²éÙ­|Bó<TF×I—ˆÜ%Ï0áô‹&©¸:_¢wŠ˜¦ºNËB£ðT 츻¹xàµê}‹Ö(MN™ Z¶ü;nö¼rݽ5/nŸó><¯‘Ë‘°Ç}42­ €þòµ¥Vݲ ÿ]ŽÞkà†tkr©ê¦;‡n,9ñÂ}–®½­z?me}ú .ÆÚn&94oWG²ëíëŸåGã¥Ñ%÷ï²/~p 61þ¤I³Ø:M³¸1¶ÊGûÈ> ø´¹±õòÎ2÷ÆwSš¼×Ó3ùé±ͮ¼œ‰°Ãm*F 7[îôÞŠüÔÝ´[¥yËqÿÛû¥CiÇ·&žÖ…)(µùûlY÷cSƒÏöœªäˆ•Ô¼ïλgÑŒT$9„Ú3“×¹ª£~U?³Ö|>±ª…]œéÔíój»1àïQo¡Ó¯NXíK²ò»kJæ¬¯ÜÆ‰ß@­*õîBr±!YÙ—UÁ¦·ßn!:~ ð¡ rï^D—ÕÈ1›ÀéŒUÕ§,¼Ga /ÞxiÕôR‰!+ï ±žQJ¸\3ŒÞþ^ö¦jØþœSáüÌì[49SO7.`…á'®€ŒD”6[ŸR!,8Š•ãݺíTi˜Ù7.œyÊtšÈHâ—¸ø)¹ÿ|m ?¬ÞפyOËß^ت‰U>©j+˜ñÀVOë )Y¤Y#‘¡ ?ÜÂèˆòÅLyֻǘÙH·‡–*XšLTÔÛòá-/ËØù€+I›ý$baûÇ•²ÚÏOí·8î×#_˜¨rÚ½Ø`µ+,×äò¦D*’º½#.D„†…ÎçVó²]Ês"Îö‰&ý$ØP˜ãQúmYû¥¯N+²Ì§Hø:ˆ{jöÃ1´áý¸Ãmâ¡ 4šoô:tv?h[LoHOKí§ÒíÌ3p€S–ª£åÏ@‹†@•AÎo¢tŽ:K–5‚{4¼®Ù/tŸâæo^xî4%æË+û(5ôxõé"/á4ê4M;èMš"KÇ ¤äB–õ¶Ù|¼}o@—Pѳ#X›HŠ-æ>hÇ£]ìx1áì{‚§£]OGå‹iÃBwi§‡îÛ ²ÓÍK-ÐÍ–-Åú~ÆO |ø8Ú9>þ®¹i8XR5_EfhÜnr¼€eÎî:dJ2 ü&bÇÒD{ëÄȱìé …1ÂMãå§åTeóòìÔG;¤»ŒK—£XQùRè+ ÇiÂÒÙú+q´öÀgñÚ—d½úý„ŽM–§¦Ž/÷÷õ?;N5ÐYÛ“Qkl,d` zßÓM3|x<ÎËsb˜gÎ.»4ÜÊvž/È^=ì-±'õ°$éÞ~61‰nBˆÀíæùQÌÔEiÎy"Q­r'À36rïöЬù· j'g}¶Ç‡ ï£÷Be­Ùò#âLz{ΈkÂí*µ‰ç F/`wÊÊÜ>œ˜ ]ŠI(|z-R12¶8]9µ‡8k¯–¹Üá#´'ÚnV…ZØó^ÜÚå¦ï<¨ú£w_éáãj7©)ùïß eÛspå±ø®n9¥:îàQæ$]/Ó«W¨†}”«2/;ÑxÎ/ÍNú$WßÜ zOÿð´«Ìè^gõ¾ õ‘Û¯ûì_¶¥?”v´× L˜Ð,>‡ì(¶F.@Ûz2£òUzeöçÎUOïÙU{9?Ò.:&[ ‚æ[×eUì¦=˜1‘9šƒhMºl%=;®d6¿ˆ¸Öó9•“$ ?òâ] DšÆÝóx³æ¿~OÆ0©e¬(>.¶÷vë‘0ÔýýrÉU¢=K^Ñ’ZæíôÂÛ…ÚN X[Ô'´gT¶“÷TüŒx\jˆY÷>#‡:G"íõòd«œåí¸·Hñngñd‹ÔžjáÝl Ž%¢Ð›ƒý;=RÞ2#è—Ó†*”Ê X%Ò†n„jŸ ÷õV 驪»ñˆ9\C(èft2‰K<†‹IYèe=5‚û8—ä°?H9ˆ-Aåvd_•M&PÛg>Üx&øC¶ãK’`ídÄ l¦(ïý‡TF™hSÂݹîÞù°ª-rbôª—æ›|‰æñ'ÇÝê†}Œ}WI|¯zmþ8ÿ¦·ý¾0„lþ|Ã1­­Ž‰žS©/÷ZŠÊ‡Ýõ’è‹—sÒËå%boeyà˜“’Ó"1íC†¡eÁÐm…K)—]{ƒÅÃ5g±íDœŸ9½ÙQñr¬ °9{»Ÿ sÞÉP‡Ì—'¯¼Ýëú|ñµÇ£a‘Jö„HL*¦©}€y‡Ôw¶q”æôø›Iù’ ÉSœ$0àj š´¢M~Tƒ¶ŽL¬¦¡»Ñ$Y\H8T©D›ÎÓ´ƒÔÆÊŽˆ4åkRš‘Ý£|éXÈÉêô¶½È^8J±ÐÌ%ÉvqýðCzØÉù†tT$^i@ÍÑñÅvˆ’¿¨ŸõRë…'ñ—±âá°¶‡M!È$èazWúÙ‚6þiúipÐî8h›uÈM  ½©—ða€i«ðõëôš²lóƒ¨ie°€nX÷žF*Zo|Çb_‡{0²#Z_l•Ô•Ä"Ód;âßö_–‡ï Æòœ©L@^´ÞT˜ÜÐŽ‰6°‰UAjµ;ng§G\¼B H8¾ò¤dÒ.öñeEÚÔÉ ìdЏ¹9·2Ð3²¿ƒ$¦@øÉ±Æ:(D‡ù–\ªù  øp›DH‚u—!>p?ìù€ t› @`®n•Ub˜ö‘ÂU­ïæee[|"Øà>ùc›S ´Ðª‡‚²pŠ —?i—Ÿòád±‡¦X0±3#ßßÙpp¦<‹–«ã&g"ñ±¼3Åb?.I"EÄ×U3§˜ãX.¡è i6–vÕÏ®^nŠ@Þ-ÊÆA*zŸäMºe±wÄy_)Þb';âú¶P„Vö³Åž˜EÑ ÕZvšóZGoÒïëŒðœ ðî4ÉîÌ–Mñù´ÙDÌwFt>Ô{è3?7êTªXæ=?÷9ýл¤ÖEO¶¶ÀˆUS+œá0ÏC›ù†^òÚ£G8 ’qzë d–[iÜŒí(™k8þpf6ÿTTŸá¸_Ó˜îC¯äSã“'>½ê¬,‡¿`Ûî žÕ˜°f*Öí¨Ø -Ÿ5»çæúé]ÌÈûÓk[*b1¢F)&Žò±»²^µk+õ¸™šƒmoF”¤ÉÕQ)uCÅÔî%>?¾´ÔÔYDg¤™®œ8¾Mþå{¡EµÑÀ§´_d9÷]Lyœ_bžŸ¦\÷ä8š#NG*6.^,.ÂðdÛ"€Ù}Y ”òùºr!MWÞ G+¸9„éö¿ LËùd/I<¦ ïÈr0‡äŠ1Ï­s, BÝGÍ@“tÆ?£N eQ]°xgËk¹xƒoóàûê:mžÒâS#´}Ì•Ûôk·¾Õ Ôî~eø$°[—$[ž›£nów4L]Kx«_¤?ÏߘA ;ÏØöÎÞörŠòhîä¬ÈÝ>vÄd¶©JÆ'ÌÉ@c”Õ!B³Öå„€cPÈÉÀ.ä‹Û[ÂU©I¾Î]*ð$ìT$˜ZvtÐO•¶ñÄÙšö]Á…t3*uOΤ\á©§G5‘e~^8Ø\^½yìyIºÅç¼$Ç­ —Ñ,àDÃF ô™êØ6mªÕ§« †âÜ‚$ç«ôNÀ%ä éÔËHQwäés°üÍ ÔSÝUŠ¥T" çá¾*!b$¤ŽÕî3çe\KŸèÛœ9÷D{ÅB¢‘;6‡—´ë•ï# Ê0]|O¶#•JÍ®ÕÞr³a]’©Ñ¬Ðs¾¡õž‰¡¯“¹!’ê±ìâé!4›¨- âQî6~¦=0Í+Þ9[écg˜ÝÜœ š½û}æš_ï!=F1~»är¨Z½ YO‰:z7ûžÃ" Næý'³¥ŸÀÛ¢!#W0W¸8„·'Mjù…ý–*Xò+•:øÝ¤5óý8»ïL/cEâjS¬Ú ‡2C±˜+á°']6®*9¾ûl.{‰cKô´M§zÞ{¯„gÁ;ïdí˜mt˜C “ªÈ-ft=ˆÕJÌÉ=œÙ_SiòÞ& \­¸|,':ÏÀÚÉŽ¡·¨¿T²^Þ]²¶§ì|§c^2?¬ÜzÇu!UB0„v.Šj¢ðSqªD#öóYHG§ï8hÛÎ'Û€Ó²tç°¨%ø1‡™×»´h1ûÇŸ ýð€Çpõ)ëÕ~4tã&ÄÅáBJÙ° °sAçh¯A*ªª/ú˜N=9{Vy¿È×/ŒèEð¹KrÑê@Õ¹¤T Ï!P=« —›­ít5k¼FPsXHøvãá‹Â~ 7G’-Þr¾t½Ð)Úχ˜\]ƒ»¯+>Š˜ÿ.u‡<}‚ºÿFë#ëÙi’"pOHybÃÃgîjuž{á7%÷!:3?†byN%\Ë2SUuÀ¼ ?(ê5ЯLlÚiÔÈ^’°)Uψ+CywP‚ñÄbí¢7yõS¡ ¦U,ñ²4 j¯¡oSo‰.ZœR>ò~N•Ö•>:)ÅÏÿ]ê.ià–Œ›ób-Ç}å:.4د+¢dÐIJþF€…Wá‰ö²Ú@b»}ºÉ5?ðÉé 7Ç:áG‚*ý×’•› ðm‹ó¦Â"ÏM À½ þsVö&úø'yôSTfÚ³ÎÁ¸EHê ôü¶þ± C'@ý¾{¼Æ¢{4yO!K}ú›øÃí@WÛ""ÐCä¡h¶þÜULJêeùŒ0r´->Ð8ž­s© ‘¯¯Ĺˆ[·7e©ÀM¦ ä¡tÒÝÁCJ Ù__œXøÆ’‡+ë|p¦%ñ.艩1 h¸–_ûÅð6@%©†|Ì|©‡w°5µ+·iüÜpQÐ,Éy Hô#ÝPv\Ïò;UqÔÈ͆«ª@¿]¦7›ÞÐk]™Í®E·`çqXäÏœ¨}T¥‚l¡ÝûVûÙé¨!ÃêByb$¸ÓòU°*À•?JµàøpŸm]³9Ê%­xLDì?ÓŒ,Ÿ,Ü)>jï_õœYGI6À,àéOÝœ~™ácq°hx¨ ­„*éEÿ%nMÞ¹—ü8»é «U/ƒðpå~˜fÕ-˜?ÌàÊD”çH‡Þ´Û7ñE†‹äÃhë݃a §X ¡Ñ4™×¦<¯] 1hã¥%P‰Y*:¾2¬HïøHà‘‰'€¨ ~=ŠyiG„î ðõ¦¼cF¸ï‹m@9OwÏ ¡«W£Ã%é¥'¸¡¥Ù€ýMVKJKñÛpº6‘MÌvFÄ~v÷‡Gh€í>b¢ÅÛ<{›¢Å—¦ÙÛ>‡'`´ü|ÖÀv¸\]ÐQÎ;Ú/†%J˜V]‚¾Êf³‹ ³òÁͯéI[YîÈ#/oòB¼LF3E6¥öÞ’¨+ ù˜6¼£{/ÂcoŒWdèĵž–ÚëHÖÀM‹ö 2V¥QÔñq, yâHzÜSœv¬U=H9ñXögI’§0­üшǨ"9@c˜ª)f»HDÞb"yÞcœ{Orç2º–ž>­Ù<ÇsH~8U‚yk4ªc0†të±>Æ£\àYÕ®',ºN#MSÏË9dœºî¿©ÆÞÍ‹Jʇî¶0¾=ô@í”Oê¥cðLÙ«PšÂè'ûO‚üELõØì!é›_ÀE?F›ž³¥‚5>¼©:CzUë#°iC†àF19Wc÷Bs;r A÷µÝô3¦5ÉØ–‹ö^?«÷Ò®kFÉ¡%>1ÍÑ%0Dòx5c«ý‚š™”3VpéCÊ>¹Pä-̼­Ðëц»:Íû.¥|׿èݨÞTB¯kmÚ´1Uâ¶›¥V̬Õц G\8¯Ävª â#ã‘#¤\zžSœÚZþOÅNî²¼Rô[HŸk^èº<¥êh­ºM~ß½l;æCy&úZ³Ï]X }9q;Hû…=t ¹™Q¥ÎCyƒ]cÄ‹·ïÙÍ{%FŠ0xô} öÑ Òæ²Õüæ À»)Rm(ÒÃÀ誳ńS寧¥8èÍ}þ͸FA÷¸”â%Ès¢I]|4³ÅåÀOÕŽ6hFƒÓ-K\"¡‚^Ë~WTÂíÝ4³äš*m|ôåèùò„Ë‚Ýâ™êuï m’Š•²òDزœ)­héÐ…r5)(AñQ­g£Ã^y —71M½0è‰Ï~ÓØWgS¥/ &×3ҌŻüŠ­šg„ùŠÅ†ßuGe¨×-\¶y§±ÜT¨¿à }´|*’ˆÆÛ1ÕØT`P=ß«·n´Ä V7½.õÑ B7Ý0•QWÓî×nD«Ñ ·°Š”@ÛÄòS,{ÍÚ5dT€+¹ ÷)šÕ„‹Ø ¿¤Ç†^t7[èG¸NlK”Å›ñ›žH²ß6ІKî~Ò¿‹´ë2¤ÀüíâΓG·æ.!†ASTt3bR4_ä‰_?'’ã®@LUr+.”úÞvy¶šq‡-Šn_28Sy©׸a`"ìñh "}Ù¬†‰]/Þ0“|º Ãe™8>ÝRm¼ÞÙìN!häü'>Eˆ»àô‰ª'p@pë-‹7HµæEfjêéµhŸgQ®`®]Qc·™t<°gÓM›Ô¬-¨„oç¾,`½Â|¼õ‰ŠìTÕçi`;¦¦átœ HãÒ„•н‹E”ù¨À´! ÿÕÅ“ ¤R<ý«íC錘9FÄ \·A5:ñQÓÐÅa>‚¾el”U•z5#Ÿï~žÏ×Ö¬çÏ-ž|Šp [±1@‰†ëh§4»ìæQ£Á˜—ÓôrÝoo«Ô¸ê{¡åþ ô’3c‹žÅÕ–=sy(¡o4n‘Vâé“+°iç~¨e¨õnE§+=z}oüÐùÍÛ>\ök²Ò‚ÕS?™‡œ…8\LXð*Óä¼)2AX‰ÅÊh¤GÊ<?1F&°}æ™¶hÖ Ö…«@¾+âü­*m‡;úìƒP%š;Cµ Cwn¹1#’e g¹žUv¾|QÏHz[õÏÖÚ“iRÚ z-§ÍqïÆ.3|¶µñùy7!Äý¹òÁЍ.éµG üÐúzkÇuÓA¸Ú܉èÀaPˆ ñLît$cÛçãê„â¹]mWõX` ;Z#ÕA…*´ZÚZ‡;2Aª›6=:‡$éœî}ÕQÉ¡ kÍEmP"ÜVÐz(tr]ÆâåhCËÛªvÆõš#(ìÚÞƒÔ¦ýÌÕPÌ'oò ås˜]o9væ±Ð¥êõS4oHnÛ»ñ6çeƒfzµw˜%…Z‚™6ÏõiS©±TÍϘ7ëÒÒ“˜qõªÔÜså¼ç–‰sæT¾:¨0Æk…¥Ûe³â‘IŒ ½°Çåhú' ²wÜt«_nω( NI:¸M^“ñ£‡-ky¢Þiu®ìªËª }¯ëåmz_u¡S…óÒ¸¡Ê·+[¡‚"ðb§ŠC(Ól£Ø&”|ñ69¡©÷årn>Ú:Ùž|¢·ãþU,Ârom^©Ž2T^æ yYm«å!â®[¤¶½üü:@cj³˜ Úíf4{›F$ÈRmgë´FÜí¦ÄðKQ@›Ï©Z"ŒŠZí¾A÷[ øvV>Ç"uè8 g4|GIj<ùå÷¶Wç1Û ?ÊÿúÄHØ+•Êt#·ræãÛ#®û(lQM‰ ²æñù|ýbo›¸‚¾ÆEŸ‘Ö r!),Ò¤­f5-q½g¯ÎJžÓ~ÁšL­?ææv*ʹ¡Vw§neÀ Û ô™Ò8B!#^e1 ÌyÄÙyÉÆÇÉĵñS«MR‹z‡\7ŠkÞ-{Û§¨Ç¦1Ö, Ê5ÆEbbßZï?ª:ÀhAiu8¦³öU»¡i}tpekÏNQÿ,–;×jÌ& §Ç‰Ò9·Ù¶0!^?´{ŽÜx¬V$6™Únæ¯ÀvÂO2ªâbýÇýÙ¸5@s"€´Ù‡MPHxÒ7`²¯: DŠ•º}›ùâ¥f)m:¬µl½2Ðòä@›'hr °)ľª·¡3™Zšæ¥Õ$•GèÆƒÚ>[@þɇzcUL¯‚?Àr:zÄÂ{YôÛ.½LÆÝ/ZÐL76m‹ºU¼«pƒ,ß“#$Yç»—nž®ùêox …ºËw)!J½Õµ1ñV¡ XºÞÕCc‚ˆwóÞ;Aø(ƒç(F§T nåð=Ž]/‘KÆk…&ésv_‚ìŽÂÎ,ïÈ®À·’oš¦À˜_Œ¹B£K›[#@_“Ns¡{݆دΫ¤ßÛÍ›è;NEšNKxiu•W%2\r#…ú=*Åê# °€ ÿPnÝm°ó¾-I ‘¥š² ’é²å©* 8%8XìØ“¸ÇÚŸ©|”-S[¦N;ÂÂS[æ*Ùgæèƒ“*Ó³ßì[ö»r㱌-z 1}+b©›Ou3¡U %§¬œSÚ¿!ÕâÙÞô ƒ@\|$§çX´äϘ¢Ói%¡J{{z2ûñÙ$ ºC´vŒøÚr ?Ðð£±ý1ÀyG+ ÚÕ°aÞ¿:`oKËêÑýn°N›wÕn¤!ÍíAnÈ+1â…„WK7ÑÀéÒ ¸âG[¨¿?(õeübž‹>O0©Õ̘ªŒ·Ÿqäy­*pšÿÄ-½Ë­À!ϲ3f>wÞM4Ä4ô/5ôG˜ýmù}ºéw±ÔSKïCµ‹IUÑž3p1Ie%-¥¿è¹Ôã×9x@8W«h”àS2ŸkÐìYž¸¸?O—ïº<:|°Ì«„ž]Þ UOu—yOÿÚáÃ.ÙKŸBù}z²ïéíW‚wT–Q¾ù¡l'‹Ê’çói 8zAñ܇€>ûÒVk66w¢ZÄÁEÑ,ØØ$ßgó3s~Ü|PþÉ)ž‡%A&̰}í ÝU³\ƒ#²ÅI>[€<¾“ 0©Ý)=’9žŸ6Ý=6´ª»s:ÐÔ5:عÛÀ͉õ¢àjÙ\÷œ”ª!’øp{>ßÉñ#93±3—a¥­Åœ¯/ˆë³ä%¨ã|Þy—Õ´nR¢c—/Ép‹ÞŠ˜e˜y‚ÆP é‹ ¦ûÛ M E*C#ê^ *}cíâ¤þÍ5òy1˜ àp@}Ãü.49ú5‹úÓä£}º@s¹;ј¹Ö\7ǨȸææK¦úðçù@ç 3¤@éT•€6TѰŸS6‚¹e ão’ÔOŸÀ'¥ñŒ²Iœ³†·VœÞчº‘RuÝ2äöØ|¿i,$î Møð:ŒJÕY"mÖ¬«²:ßúæ¢8,£zú ½©#†hÜ[Co_ß×: ‘d¡â¨Zï•Ì’>“/ÔQªÓ´×8€¶U@<“•Ø ÚP‡trÁއY'+œ[CÑ×=%ðç gOÅ@B6=3´zj¥;E}g{:ìêV¬!¡ôøîs¨ ú:¨27ÐT`ú¾,b÷±rðq@H— vêõ^•ÚõɧâÓŒb!’™C£{UôÃÐ C¢¤c!‡¶íä?f’¦.VùÖ{­ô4®”3ågOFCNyÑ´üÌ·ý@ñïAQ÷Ó£ÚÄK¢¤³žÜèQ½{„ÊøŽ§4 – U?:Jm\ù"è,ÖB6ìºØT)а!£EíªIEåœÔ¸ÖSwׂKÇ©Ed™]¨zÁq,Y¢gì>롃Yú\´¥CÄË/FØ @y9ªp•ýþ˜ ÆM¤½ðè\3óÖ„´~T;¨w‘u©MŠ*?–kVôõò󲥆×%jÛ¥I)Q Òõ²o´‰)/]‰³–ï`9*ÈÊdgX4ÛëËš9¯lç^]×KJÃÈ€vã@œùÏúên&XEN$µ .H?Üo³›JØ”,¦9X'nÔÆX©‚´ê%²-^ëÚíÀš ÁÆü€öj^μiѧ+¶®ÌïÄæ¼#"œ'aÜEpÀW‚ɺ+Ш›É3dޝÊ>^=hòªŒ ð€ÂbB"æÞ»5:Íâ å…<.òË'Aª@W”QìùK'÷+9H‹ûŽ{žoy»ý}MÆù»Ç "ʤ;’È*xõaËàÁ’-äÑXMÅ›5ÑuéýÄy·Æ‰W×[’Ó†P©°}ÖWc{,,ú†;˜è JÝ@³¯¾4)ð[¸%:;9+^=(¶Ïx I "–ù0óÜo²v°Lè‡K àÕ‘~Uö2X’T÷ª*sÑ=ΧÆ šÌV6^0¿pWtO$ï¶[…ж´¢ƒ²u½415ÒG¯#y÷h¨¶€Tk?3¢Kwpñ!ÏÆo¿ßÔéz±œe9<1½\lP—ÜJïtÉþ¶FNVÁŸ”J¸AGnœš—…/ZÇ1„¬›×w$,y?ÎG `ÉVÑp¨--=ìó\ÆÊjB ­°w[ªã@Ç ˆ¾ Ñð—É*[•‡Š±¶""KCw\jKsÝ¢J¹‡)6Dšôñ” Î&D@¹™w ¸ýsL þ¨ø“Å #9‡©¡Í‰®eÏÚÓ\Äz.ÜÌCúï¥[¦)Áx¡6f§»a§Æ3$²Où™l>‹öGô£ñsûÇçyî>†·ÒúPWpPz+уl‘-ÃÊN! ;¶SyîÑ“©X‚Œ*¥0» CïŸLzz`,¢Œl’Ò»O Bao£ª×öˆŸˆíñĽÈ( ‡Ö Á*t!û|ž¤´œ‡ _ÞC6‚ø4ïûƒ”ƒ¯£úÔüƒAÕ"Â1Ž ì¤ðûó9jŸ;Vè–ª8Êɯ{&€Ü€Ìo5[9)˜²/ª£w9äê¤;W–[ØÅ{Â‹Øælm*6Sò†O[ÀfÐ î¶P6OÎ!£·k#0¹+Cn×F}UˆŽ„ž-\A5,p±Ùs7¸ºKµã½tÍM×}C›HúÓ)Œ)Z5¡/¤Ç‘t¸bÜó @£Ñ_ç#е:Ò¡÷ÈO#œâB ºbÈÔ–#r¾’Mîñ×j?íI¼ @öD9Ÿeõæc-¯H½Íåî‹KŒxG…˜=à£ò 1Ú啵»H/ªÙ€táI•@Ž§Â¹ë1„‹ ÷¸Å¸WÉ›³ßô`˜ü@^ªÊª˜EšŽ/Úúäëë< | C¡jïT{9wRBçÖáRÏ‚íÍ;£h¨üne̤àOñp]18¯%Dt8>6êòä‰q ]üëh¬g¨¤"2ýŒ:ä%¦üñÅ+ä´ø{Dº×a˜û™ À8$Ÿƒ‰+hQ¤²¹s¼ØŠ6+e7XF˜è3o‡PIÒç-VôØ"Û2%‘äþ¬½™õ±¯ßr‰T=Ñ,ïÝ>ÒGÇ å=TÛ”rR©TÌh>ì ï™9mµáq+Öå„Pö)"Ðó©+P†ãŽÚ&ò ÏOòH?³=+6~³4|œ}ºµÕ}ÏvnÄ´r)Öè)†* ŸèÅšD‘Ô*Âô>»²üznß±ïa&¥/ž€íÛtÐÌñ}m†ÝèLCÙŽîJ(­NÅ„Ú&ªº5ø!}i0Òð…›¼z?=)}ÿëD•0KĹ^ÕLf•èâùw²«û˜OÌ”{yº/î¿2®Ü«ç¥@ó~qbòŒ]c<{©{ëƒe¡KÊ=g+œ,}ûвßñ÷~ó ›˜èëßn${³T«é*aÁìã¾x]úÐѸ2½ð”ÏqeK®ó!#W5BÅJ8‚…þn*¸­ô44šýš~òöŠ.Rcþz©Ä0·æ½‰ëÙ÷‡6¥c‹væ#*7ý°á3šŸ.(]žßæÿ9`šíÚuå–Æ³Ÿ]ºÄ¡õiiæÃ‹f÷âyô“Þ/t×VÓI…¦¾N®Ê¶VzûeáûäþýœM—Rõ¸¤Ùžd›&¥¸‚M§"F2^; i‰îðrUÍ7­…îcãŸ{6®’¤7æ_ß)³OÓñÐXˆÅ­«§µúZ0qöªì4‡~ ’¨2Lâs›9¦© åZB³J=ÝB‚;õÚ¢èç]LNúÝÛ|ÆaBÌêZ”|—uW}o=±t¬”z¨=ZºÍ©ªÄ= bÂ9^s ø2ÞÉîí©‚Ó ‡”ƒu ­Ð/r7@ƒqW’a‹­Ç.7^+æœ#œNÀF@Ê4Ë`4û¨ñãTò€{v FI®s7nm€aÍ’ÚXúƯ_Ü›~S&¤éÐu™ó3Ì,«ìÆnÂyªí;ž¸tºËavi3>êqö†·„’ÜcT,›gÚ5Þ‚ªM{½ظª›ÕicÚò\PÀ¤|nŸ»÷ ×A›5Ò+!"ß¶°]lxÀvRñfÏ †KðÙc) ¥æ:Bj/½ƒ”ñro“`/Ëê$oçèƒíŽ@uêë>oÇ5Kцuý©â©"/>óF‹+,~™Xìì7`ÆÎM”O× œ/ž¿;P)t`;é\ô¦f²gO±2tgÞruΛ] í)ª•23s6`6‹V¾VŠsH#÷&åC~“ "O?iÇY/{.ÕtdÃlásPšŽm8â3‘òÄé=;0¢Vr!¤oáó–Àû‰T¡X®äBrºó±=ãä ü÷pd•ÕOõèq-‘vŸIãf7‡=A´3Î˸2.kh×ÏBxpäy<æ%ɼàTÄ+¸v¬Ê3Gu÷RÕ猈 ÜÊuº§L‹\˜Á‘*¦å¹uYͺN¬ NÔïnKÃëÕ †C±ó°Žwiö½l¶æ*"ó–4GF¯É}C“ˆôš†håÓ«=nlÛIL°x–¤ŠB «Õ…˜vД‘UÔãÛׯöúeäÖ¶Ž'? DæïÙKJ)»+å¾#Û< ñâ7¿t«åˆh%̪HÇ Ø"{ ΰÔLÚXt  ´U¤Õa^ô\øp;ÿ1”˜ó\N’3M”|æ\•ÐB¶3ŠÎ-ž9÷”›Ÿ“áž«þ–ÂxŸhdÑfŽÔ´3ò9fjÚÐ~,½À3¦eBsBËÁ¬GÀà èÝÍL¬°-1Y’uW½ºË†|£ µ ÏÂèCƒíÛ¥oµ§¼”u†v»I#ï‡fly²cyþãÙ³·æ%&ç®ó™Equ£¹Ì>Î5 « üš/ äz–@›’#SÓ$­EÞ/îàQmè{ĉ¥?z-"y›& çX@<{’ ›²Û?øíý}Ñá{ó??aI­ÄÒ¾ ‡Î½Ë¿da<†n¼oúFêŽ)DkO%¯·JL>ã‹•´F“ªÊ ë»Öž ^þ!„¦ƒ ’C”ë\jæ-ö¡ó|[¾ë½È¤$é1#éRq|z®¦2yûûãÒYIÆÀH´ç­´s=9ÎH©‰ûƒ 'µîCÀšÝÌá I}æzpʨõØûcÛ[è½}áBÑ}ºæa žÌJ×wñëÕÁÑ‚JCn^ijíýj|À´7/©§Í3ž1Î&Šì©¥b°¦¾Þ3Ûué6²êjÈý‚zY¾?ÌMö9cV‘Î1Øž‚u0ú]pÓK¡‘FrŠw8ŒØÐ.¡tÒ™= ‡”†5ItÐ[HNë »yw¹`è°½öQâ.»›:2ÙÊš™Ý Ŧd+ÚÎGÖüã­¬ ßš¾ÝˆH¯zmŒÖIc&íÒ¯Ú™ {®_ NË2NÞ7û²± Æ­˜·˜{Yû*ö3?u-,ãômšÉЋQ^aÀ™áÝ A_ã㡬‰iW!å¥% „‘——=›ô®h r—A'NIlªÎ7rª@ÝíÅÔ4âd-AƒQIÉAdi²¼¦—O’”¼w™)›ÂÜ!‹8Û¥~éŒùƒ›y ôË’‡U`¹+áA cí³!èxF'θl¨mzåø¡¥{ü¤#VÆGÎiëäVlµS²<¼ü@#$ eMUtÉ$ÏôPùƒÃlíH "ù¤lùìJ5¹sîbV²64CçU&Á¼,™êêd‚”méÁêÍ1p±_2ñ‹[r“ÓùõÍ~–¹‡Ž”÷P™êœÞ|Øl>S½½I}•ý `™é³+óbZôø™s¡€”cx6>ö¼Ò‡Ëï…^“xÊ]h¦Ñ+—øü„”:r{âÒ5˜c`÷ƒc´Äco[,Ê6>–6yê_Hº¾ã•%°Ã…õ˜–¿ðV…$ ö–{Þ¬’$Øß\Þ-Å6A¼Ù£p WN7„·ÙªVg†.÷ì²êߦA‹ ­Ñ¤k`äGyáÌàFé  `j\(˜*{ïÉ~àdô•°ýYzî¥Ú÷;tD¯[í< éza3`ñޏdï®/Ê =%¢ÌÎVýR ¯©Û¢ÔÏë™hQËúQ!'mðÍ„ÇÀå¥Id¿=@í˜ÿpÃÕ{M3‹ó*uẈ¥)V„qîi†°ÿ34þ"£(¤zã _6ˆ/ ~k·~ÓVX¼’÷„c×ýiÄ…CüäqïåÅE¸¥ð”ɾ¯‚½ö\ýÓ 6'S|R,pÆ_¡`½ìFÏT‹›ì/ïcKâ.-ƒ4yÍŠ†vyÚœÉ4°8¤Í¡RSa"*Bïr¿i4ñRªÅáèÒœ·3œˆª‘ü‡¶Çk‹Èfmj¤wª•fBëbã·¨"çïÓBÛ<ï]’ º;•²)ÑâNüþ#ˆvBh9% Eè±CZß6ôhA‰ÇÕºsº²5Wòï$ćÜe£A‚-=g€ ¶ª‡BgÌw§êÝv‰MðŠ8µ¾Ä¹‡E‚ý¾“íÕˆƒùZv/ÙlëÐN`šÛ«9$ILñYÛgß¼6:¤ä›'ûŒ8ìá[ÔL$G*9™è¡ƒU¶Em ŸÐ—ÉiÔvtpT»]ŸeéUؽ4¶µSåè%è3[ñyróyø³žJmÔuªùúì¥9&7OƒÏSƒ7J~S&Ãk]—3—l½†eÛŒ2 Yo.!tAœ û»”¼¦ª]úæE–¥oCŒ°: ýeØÃa”‡(ŠÏÇ«3ŒPwl€Íî2§ø©×m¥,!÷§TK{úµóC áTñBøÜPƒi§™aîYOÚÙ¶"–†®>-ò#€|"´Ù9Ý0K}þÀÛl˜ð¸H'´²¡ÿÛ7i .9ÄxþT)ÂJ“²—?‰Ñ(~ˆÜm[¨S ü\9%à–˜žBI£CNÃŒ"§Ñ†‘Ó¨|9aÀ(ƒ‰)‚ÉŒÉáŸÞž\hJº ›fÄqxÚ8vç.Ì9~Ckå¡£Û*ªˆÔdÌ“Éà!pê‡i"ÛØšèŽ4µGˆØåôQ¤Ñ[´5ù¹sùyØF +>Ú™ÔÓ^&c¥Î _xãSßåE9Zá–^éé`?U“éEìÆ«Êª­À| iâÙ²çÄLCëRgDlÏaúîE€[H1Ç5^ ïÙu>²¢õœõô)1èö™Ÿ ¹2S’¨#yìî7÷=#䙆xìÉìTÎ5¹¦‚Ô¯€žÌQEÏy•µZ‡›ªf–‹Î›n„F¡ÍAhÃ$ëCƒ'Q}ùŒ0«*i„w™Ü0é<$‹ÁŽq€)EEMÍNÌî8p?Ð]"$jz¯ãHÄÏç ü«³/„´àAü"Üä‡ßÄZôéÈBԲ津¢ŠÐT¼#úüÿðÌ’uú¿£Õçÿ|Gç¿‹¯Ÿÿ¹ô3þÂÿì)ô×ð¡à]?ÿ{Mè—ø› ~/í_Txýüï5¡ÕøÃ¿ü×Ïÿ^Z¿Ð÷ƒÿúý/kB«ñÿïèÿþëúßšÐjüE¾üE×ñ_ Z¿è÷ƒÿúýkB«ñû~ð_¿ÿkMh5þâßþëóÿ5¡ÕøK|?ø¯ÏÿׄVã/ùýà¿>ÿ_Z…?ü;²ÿ­ã¿&´ÿïÈþ·nÿYZÿwdÿ[·ÿ¬ ­Æÿjÿûrÿ‹ |¡õö¿&ôkü¾ÿggK$ØYSîdrÄðDü|$à?}ÿ#¹. ‰Sôÿõûþû„ȅð3!Iœ°°^k*Ç ‰˜Š‹˜ŠHŠbþ×å[§ÿ.ý§íÿ¯\ùGí_HL|uÿ/$,(º~ÿךпºÿQ\ÀTRì_Ô„Ÿ.J”æ^¹ PLð×?Šá¿ú|M.$*Á+*å•ý“wN IˆðÂ%Á"B‚¼äš²~àÿý‡íÿ/]øí_„¬îý¶ý¯ÿkB¿½ÿo“;ù{ðÊýqŠgŠÉ_ïÿcb²_Þ°áwnþC„˽۰úæ¿mÝ?ßüצ:;ÏPlöÚ¦ÀÉè ¾ýӆ㟟nçmx*Êk€U>%®Y³O<óLœuY0WÄ王Ç!ë«p‘³cŽgyjÀ3Ò{N³ÍúÒfN1Üm¸*³ËtÏæÖòcÓ‚ÿw_¯"=LÊ“ªïÈ, W*p¸l[À¼MÞd`$æ$»ø¼È„ŠÙßÝ»"‰úÁ=uX÷zôcÕ×4l wOÎÝ8éÎÐóBfÑ5z¹¤.º„$¡×o‡}^”U .ßTÏyµV ú¦ñ»{™ëGïÑï,s6?%ÊvcÏ®ÏîjXØœ¢#N^h~~ÍÀÜ®¡+!³ï‰±B¶eEê]»7Ù×9Nã»X›¹R§*-oï y?=ácRÜ7ݧš˜nî|ÄiÌSi·ÙÃ×.rD/F§[׵㒂¶¨]Rl0±{pg°zD7›£W;Ä#ñS1iû|ùI.ïø‡wŸö–ûL¢=Jï/L¹lÄ4œÛÙÎì‘XóºqVqzW̃ÏMÏò÷Jg?ÈÉÕíÅ Üe/Ížþp¢‘í¾GïMaƒ9ë=†|x™º±°üŠ›¹ç+{¦ù³xšý|Xë}§[òFÝ es£Þ9Öðå¤ÖwÞñA£‡m FÓ‰oÄé·Íuu·Íñ¹h-¨Ý•F`3® ese£yrÄQ<Á2Yª' w#ž0´’Ô}âÛHÑ™}Rú#=Þ,Þ6ßúÐ[¯ZÅS¹d;ñöÔ¨>ìê'n±Š×uå›ÊÎ!ãKò>ÏÄ!þMLw |…·ü\JâãN³KK~ Eq¶ìœ+GL§°§n?<{·œ5i£Zµ±S—Ü=Ñ3µqSK‰r²Ìtc\^ ?52­½©!zàS„µIMÞÁ¶™Q>;­wÆ5ýìF¼¶vÓŸˆ¯LB£KÞ– óÔz5óŒòª÷î ¨Žï.ŽÕ˜i-EÞµÕ£ÅV§h™DTÔŸê.üä©bu#Ðn|èj7±Úè$ˆé Ó¡r‰Çl¯øš~l¤‘=ëv¹2‹åuóÎEGøAK#Ì%ù¸¼è¹!Œ6{+íÔYBs'#R·Ï–`–º¬ªT7ÁÚc>ÛÆÏÊgZÐ!ŸÞá9} vÒUßÃq¾dªatÏÞ‚‘“ów=:¤¦_ǹËrŒß©É4Á 3l®R-¼ëFûçÑ^¦-·´Ú†¥O,²ôæ˜Ô?2Ö8cA¥h'`ì(+ÚlÆ×¢üðìd"®Á7éZÃÜ =³,\ó[,£ø'“-kïI5e΋׳é<kD#ÑÃÍ>Ú‡µÚùØ&Û»¶aÆë‡<ÂõÙ–zåznŽ}$BʵMß½)iK=ã©¿ùL½Û>zZj2ëþ¶°Ð=nþÑm¦>þou.T.„çnñvzæÕp6‡s¶ÊDsŸJëM;7×ΩòòƒnRGZ'Ïç´Ÿ”±’YÚ*ñf›ðPøxé{רÏä5Îñ‘™yÓÇs²w­Åµ4½{s&ç8ÌjAÛ‰LéË$hö€a=ƒ‡ÊÞe×^ê´ÜãËœz²l$² “)„ž–½’ËÐrå¹ñ•ø=Bµãú¥¢ &¶°}³çl-“L²m>—}»1mê­~É%i#¢n­’´§oqO.pÝ‹Ê|ÎfWÀ| QlRÔq¹ug{É£® ÎÙoFoÚ!F»N·: Œˆ>"Gè²jpGM¾E0é½Y“àlw»ªë®ˆmë ƒb“Vrc{¨>ý`¯ËØ­#²CŽÇ{ âÚöW‹ß>].oðâ/»2òàõæòìٞͱ#Ž ŸÃG•+ñj4ÞÃoíÝÈâÑ—mÈ+ð.ìvÉäGàBJ4rʦ7M×o ²Ü™@-Û2ÆÑÆsª¹frÔò1ç ‚¶:`úÞ ~{¼î[çu§«º¿èj“$öã;,÷ÅxiÁ^nBIn³PH:²ÙfüS²”]÷§d™yxgµMô}ó®±ˆÒÆA¾ñ°ÒOƒ/ƯÉnå¡!¼7! ¡wSmñ}mÈœ“Io¢cäžÉ+±œk¼ÒÁàœŒh4tîL;ƒvìM´²™ñþÄúüdó8¢!ÕV×ÏëUª½V@ìÃãÙ;䀾F#´Ž³ÏSx¢À-Ñx÷ƒÜÉʉî{DHEm`¤@[«Rר#F[Öþé'CóOs3Íï¾Ýìÿè¦`A}næ¬i [áNg°Ã^ﳦÏÖ¥¶¥úNU—ÚS†¬9Ƌlj©NcâxžOMž±¬åðøÄ³‘&×ïm|ɠݲæ´ý¯ÇFçÑ:õ€]r«FÍ…=RÇ“L›o¼BQ”‰õ½A;Z­ÿÿoýÿÄà"ÂBä¹ÀŠýÝÿoMè×øã¬1ŽŽšx´¥“5†hGà³ÁÛ`ɬ¯ÌÃÿ³wüþüOTT.²2ÿ#ƒ.Bqü¢ÜÿNYÿ[Ÿÿý÷Iú¢–‚޾6¬¢£¡Ö>!¯®ª†ð è +(ê(~ ᄃu[GK¢¥-ÆZ@¡ ‘Ý!M©²ÒxŒ©¬´ žˆ[‰ö|x'Kgˆ‚-oKäÓq³ÇCÀ¸/¿d D¼+q¥ÖIá,0Gš¬…,‰nJ>ß"“…ƒwþáD#ñ+Ñè`ÌG*?›Òtð®Dy'33<ÅöEÄüG¤?åNDénl-‰¿‘ ÅÌMñðÿ‘Öš)Úùoß¿÷äŸ`۞̶‰©¥éê⬠³ö;"GÄ›®%¿B+ü~93†ˆ1ÿØþÝ^ÎNÂðŠéÁÄú«Wú³¿ZEV8úâéhBü¹µþÝqü3¼¯ Iézÿ) ‹Qþ6üÇtSv+ݲ%yôµÄX¯œ«DñXKæ×€GÁÅã_ê¤þŒÚ a”¢\üÓú+øJE^kLÿ—KR¶ÁXÙLÈÕÙ‘<µü§p_iÐ6–¶ÿ<ÖE)œÛ¹Ø~Õ,ÿ)lÃW´iÂ/ÝØþ lK¬pýÅUÕÄì«î?qñ_2îbúCŒb°^-øÛÉÎwíe-,;‚ÿNܧ½­ÂçâW|þÒßáOsú=øTü)ûYËÔt²ùg˜­(¶[cúƒì³ÿ3K~áø„­õ?‡gʺ oócíeüƒ‡¬R¡WoÙûߢ±ðН°úë½NX;;k°™õŸ\Wù[×o±_ àÛ¦§ÿBänü$ž`iæ&gkëd‹³üIÅúe’_„¹1—fþ§øÿÆÿ×}R¿áýës07îGâ[þoE˯­~U\òC0÷ŸÛµÿwáXðÇ?õs«–T(›ýP }ãXÕ–¢Û~ësðS˜û‡Ú·L9—â ï(Óßögäg+{f~(ŽE~âø‡RÖþïbßxGãmÿÅöå1˜ûÇâZò׺"ÎÂÔî·Î3ß~°Ñ‹bçÖ¥£øš}RÖqVxþaæŸ0 #óëýãþ~ÍÕÿÂò÷¿ÜŠþkþÿwÁ?”ùÿ•sY¥-`GKw¼ N9?ØÔ”¡ü"—Œ©¥©©5ÆÚLñ¹?¥çëÙÉÒ_¸ ?úÂ,E_]^9 ZvýR¯ÿ­>ÿ]ô»¹ÿWDhýüÿµ Õø‹}?ø ¯ã¿´ñï‘uüׂVã/ñýà/ºŽÿZÐjü%¿ü×ï_Z…¿àwƒ¿ð:þkB«ñ‡?ø‹¯ã¿´¡ïá/ý?|ÿµ Õø ?ø¯ÏÿׄVãÿ¿½ÿqþëóÿ5¡_ão‹w11q´´1¡œËBñQ111µ4·$b¬M$pöö+Öá¿ú ÀÿþþGA1!ò˜ÿíþGa1òs!¸8¾~ÿãZÐßçþGJͤTÌoõòkµä'×JðÊÙ(¼ž€·¥ø(¬_¹~=äoÊñ_»ò¯ÔÌ• #ñ`Ф¾Þâˆw-ÊÊÚÝ×Ä௙Wœ‚-mÍHc)‹¨¿³†‰0•Àýv 󫯡â×Býv%su oüàŸ– ÙMLÉÚÒšÜ4ìx~~~J„Òöä¿•µMö¯\€¹œìˆR¿S>AS¸é¿`$,ø¾¸}-Û¯ÄÉoAyã×Ü¿®§RDñW_/BÐïŽo¿_ŽŸ`ý?*y¼‡ÿ¢<_O¯øw¥0ýºÿ¯_¾ˆê×W›âíñä*m‹s›0ö+õêw*éÊu¡8<åøNÙß,ûŠ“%'üGj‰ …í/kÃ?/ÿ‚Éc¦ Æž\‰~çå&ä_”)ëÅ_‹±Cšül‹±!÷Ç”˜CÀcVK—\lI±YÙ¾Èìh¡tö<ŽH™È…&ƒ$"&É+,Ì+&(Dþû©Tÿ*3²¶„ÿýÚô{/ã•àä•ýÝ‘« Fâ_U“ßÍ^L”.(É+"ç%+V¿xy¸¡4Ý'„_B…Ã[[ÛcL)wÊþôÛуûú›’„ðk‡–o¾ äN@ä¾Àõs‡±ÒMZÉ*®< ˜ŠxGÁÒž¸²…˜°ãïÐ~éëL­W.÷Åàˆ²Ò¦ä?¬¬œÑ‚¬—H `)c屩¬:Y›ëâ‰îxk0—õJóÿR.2fÖD»#Öäp—•àc+ú$ÿ—¦NfÖÏoKVAdÿ(ÆJó7'JÉï¤à`jý/ wòËFíÕ¥ä‡ÿA2Eò@·: ŧäiV.;¶'Ø‘ûʥǦä±`‰u¢èC–¶+w [ØÙãÉ_0D°%ìbim Æâ)=™“5/˜¬«ª£¢uB,§©Ö•C¡ä4uô¥È1Éâ$‡RδYÉÇÒÆÞÚ’œ­ †@V;‰n”ë”5(r|9yUuU}0¹’(©êh"Ðh°’ ,Ö–Cé¨*œP—C‘UY”¶Á^)óJ-#ןŸ Oni`kKrwãH~‡¹»$ëžaZÕ™Çu›Ó_²Ë+Öï–˜V%Ücjï{¼ùÉ[ ò ±ž'‹ƒË›²Í½K4‰¹£üLëM‹¯ßš´zLéèÛ×¼’GYÉúdøË#]Þ"¼©G¶•ÿiþêdeJTÞ…|Þõ ]ãJõ80zV/ÓèɃyõuËɧÇ{¯*F>5‘ßâØåY³VÝí›Î¾´jõÛ53eoÍO[KϚƽÆd]Â8åòâóGkz{Öˆ{ôMå¦&ã7Ž–Ì¹Z~ÿëå”ÐßÕYza?£X¼èQCñ˜c‰Õ=ãJÅžò¢òãE™ÇžÔŸéSºqÑhŸl÷õ¶ª½*\›üºØrµiÅô ìªÚ]¦¯²0 ŠËjÇäÅÝ_<Ó¸²Ác0—ÿ}ç°ä»«mz­šÙ/Ox3x„$¡§9992Ç1½æ·Ô('~C…¹çÔnä·Dèp(´tæÒ O°Ð‡Éû¬Ê6y{Í4¾³D°Ô#·ß•ãE³'çþLýae>=vhPÁ¼?ûD£µ{g)×W~û,¹fMÁ›ófw•„Zœ´ï·Ê|‘©0~ZJ£ù¹ž½–ì*\ðImÚ…c=k·y™äNÛòHº»ðbÿ\±lÀý„°/‹Yw‡|{ãMï=ºY•_ltõêÿáG½SŒñ¿üηsKÜ,Ö°+›+ÍCÅ[¦Ì$—ìð*®.ÊÙä9ûöì0ãKÝcdN÷Üì9²òOñXs)·~»\ž1wû™Ó3§£óOÑ\&^µ[m_{C¸êÚß)Æß«½À\5z,í;KÉàsÃb£rÎöÈïû†²ºM·Î³>,øO™gÙÛÃMzcKͦÔåL‘øz9û®4jÐ2ÁÌ©Vò5›= Ë3ó9?Ë]Nä»H‚‘­y'bv†”‹ò½OU×*í‘8pxÛzûåÜ+ ™\Õ÷´ó¤ÒµÁá; Wä_±O§7áVž$Y—]ÆX‘–‹‡Ï“æ,úxÍ@"Íßÿ:Ñú?Ãú/½fþÇïöoúýß`½&þ;ÏúOÃú?ý&þÀþjüÓ ö× iâ¿­ÿ5¬ÿÓ iÚ¿­ÿ5¬ÿÓ iƤؿ)þð¯Ò´¿°óØß€½†ý™hý¿Áþz!Mûw¢õÿ†õßz!Mûw¢õÿ†õßz!Mûw¢õÿ†õ¿z!Mûw¢õÿ†õŸz!Í÷v¢õÿûë…4ñ߉ÖÿæôBšöï<ó¿†ùýfüÿ¨û? ó¿4íßyæÿ óú!Íøß‰æÿ ¿ÿë…4ñÿqçÿY4|8Uÿ ø× iÛ•ŠŠñxª7Çñx”»é¯áîÀþ¿&ûƒëT–*ÿ3¬ÿÿðDe°"hlS³ùHÂÂ4,` ,„F·ÿØúèÃRðÿï6ýµ ÷áŸÊ´×Šÿ,¾þÀÿOºöÿÁdÛAýöD>G¡€Õï†Ø *›ÕbÓxŽ×,#-Þ` ÑLÐAQíüØk -z?þÿ妿ôüÓ¨tfküÛð¯Ò±ÿ/SíÿÛò£ïuðaÕ´ÿoùС'N|·ó/))ÉHµù¯|F~±‘Öæ¿ê¦Í8Ê_ÌKÞ TT<¯¥Ôoœp$uÛ›ÿ ^?°Ð¯S3ýO=d˜[R»> ù’tèNVù+»Õ‘v÷,ΤÂC|o4þtuÍÓªnÃCç'Öç0>æò‰É=×MíZ“8Ú-ú™ï¨ÏbëË^&§v~y7g[¾gÏÃÊ4·übY·¡qË\–þQ½÷ú“®3gï‘ÿ} þºhΨ£Æ’ÝûÊ–åZ³Zœ5ße2jaá–±ÙbY±cPÑÇ+ÕãÎðÎ_ßõU67é¯{Ý+,¯gHí†Vî¯õ^ìš™›ñKnYt“s»ß§=†Ý3Yúã嬟E'Kú>î‹®üËÃm‘_ÈÌAfÓ ‡V^®ÍèC-ø´áÒÕVVíãe}>±›±°ÖñòÓi3#Ú­M~““#XÑË7ÞÉ~Â{~ö^ßK5Þ-6ÚÖïňգMÃйg<šjä½kãã/β:ØkÕ¾äùf î!é ®Ø<|d±° Ÿ¥è(å^ÿ¥ð¹ðè&•~RUX8ðjCXì_Y¡=®»=ç,wð÷3ÝIIî÷Ó@ÒÖ gä¾) KÌ»®BçþtË]ÖÍ;cašeÏ×âJe•m&·KÕÃ<ôù‚à˜un¡e}72½_í†_Ž$/X¿yìÈI®f{ïÜ´â7“/—Ÿé6£×®£½3 ýþ ÿêeŽä–{ÜôÛŒfŸôe­Åálÿ—l›>[Æ;ÿþÌÆ¡®"óþ˜íç²Gx­I|u.+$ààÊËYÖ?N©·uÛ}ÛT:çk˼t3Ëù'’,e/l²Â¼Ë¼Ø'³Ü,]×ó…óHÚÌÆ$qÒ¡AeÉܬ­Œ7 йŽÝ2o ÞZ¸ÝäWö”­øGß!»Ÿ5RìIýv?ó¨:õ6w¿4·7#¿êþÂÒví1Ò(a T »ÿþÏÐûƪë&˞ 7Õÿ†ýÿz!/`ìY•?‹Í²òél>…!¤8°"`äcëg KÀÿ¯ÿ)êÿÿÓÿ,&Ý€}Ð?¬ÿÙlCÿÿŠÞÿ^ÿSXjkü³ ø×µ®ÿÄFÍõÿNŸ©àcdSýßNñïT™°ÝH³øïò)^ü{/«)=ð¥›Ù'•'Œ}®Vøù¾òý’ÂÏ7OùuÇŠuqM<áÖ?š² É6ëçBé9ø{ËÆ âI©3¦äGžlØ9õïC^>ñ%s¦ÎŸ/zúÝÍœ#‰ä½×üÉH º2ðÄM¦…ÔóÁ'¿Ý¬¸ž´¢n,y†ûÅÅÉHXîOiK~ëS¿¤ÀæÐžÀóë/>õgú²i“ ôà:ÛlKõÝu2<ôû_KÓFgç: g=^:ª‘¹ùåïåÆç·L±îYz|ùŽ‹[`û ,ã`EIÐ-ÊëÑÏŒ#kç¬Y^S:Æôüá±C®lÿæòøì U]û>9ÖPÃë¶Cޏø›ëÙCoÔ,ÿÑñwÞÓ^û!Ò.hY·ÞxÇw’Isþ¿íÿ5ìÿÑ iÚ¿íÿ5ìÿÑ iŽÿhÿ¯ÿz!mûÿÿQÂç9ˆl[Ìäýkíç :³iþ—Jc0X€…Bcò?}³•G ;7<ÈòæúûAAÓ&ùù¸C$[29ŒîN&{p=Ôv*ÄUÀR%Š¡2),&“=H®¦Î¸g¸:‹Xàê,A0a˜Ü‰ŽAç¹ÜeR ‘b¶Üx9B‚øêo.$ ‰ÃT^çÄÁ %‚¹ J™­ƒ“mKÅyb(&F\XèÝœ²#„{& Q¹%ä…Šg²úvSg1*‚D ˜u!ÙÙ‘ÁŸ@‰HíøJ% ¹b’‹#J‚`$J5é‚ßÕ!ăoV¶¶ÐdDŠ(` @ñ‡šDµcØ1 [[p© eR4* q$WgX댆JªS*8‘\ýaTj-PÊ‚àHð°+4j¿¹ê(ø¢ø&îø­jÞÍ—:Ä–Jeþ`­ù¡J¬C<„ ÷•MíqKüÓæ1R>îKÊÖ*ø#’·±‰Ë"`qk=Zðp&;á¾JuméEÀÞT×–&*àH ðP`D¹Ñq†¤°8XÂÀ À\u9+å°´¹_&Q7 s&ã€l¦4¢)­¦Ð8È]&W ‘" Ë·@Pdã^è…!X"ÖÍœN0§·É\wSєѶ^\ª„ä Y¤–@àP,®@#bp˜ R!H&GÀŒA(Å¢b1@ „ cÄt‹f¢™m‹B 0®wà4.Ä ‡Â8ÁÁœn¸‚‰dà*2Q«€Jäbh +@ØÂâ!™P·d!™Õ¶dÏ`wo Š3ÉÇχÉ—7À3$ò †8P'˜ëã>Í ¢hpP`ˆ§¤ê*ÝRí ©ömKÅ!ÁRÁ»î†_ŠQ>"U‚G‹hP@04)ÄRE¶æK@r‚èì@vh[0Þƒ¸ÿ¡ÒHµø?€Žàý :Zu9PŽH½ƒ|ó,CB™B·X6!–ÝÎóÆWQ?.C¥N†TÊ;†TÊ?ss*\j[ÈU¹9‚:ÄÉÅ1‘ÀÁËÃXŽ»»P!“¨½M.A¨êTõ]mhM ŸÚò¹"X¥„0¤› qjÛ‡pâŠdX ù‚x‰" ‡¬Å˜¦:kõڶ֑˜“n‘Dh ¶p ðÒX)‹H%R®lþÁCø¢öÚN@ÐÝ–€4µHsb@?(Æ*mus! Jm¢8µˆÉšðGƒ³±ª“nªìÑNLˆD"vRkûÙ ŒRÛÆ(Yw[hT6i^¤ ¡i x Æð¥R¦ ¹ŽB… ¶!/À3ŒâãÏówçyóx:EÒ<ѨíqmjÝž\ •"”K€‰Fë€\­Öˆhtí~"¼Æh¿ŸÔaQeïH1a'jÓª4£iÌ3UÆ+A‚+AÚcL¸;¥õ$tâ)éZ¡" ‰•)$WÕ÷f$É_&@4S-,`[/øôP½ì¡)k}—拉ÑÁtFGÔjÉÕŸÏZÁmžDÿÒ™ÚÝ@t½U8§Ûÿs] GH=K†[K×2XÜnZ |Ó D­‹€éì6ÔÎ(€š4rÔdÁ `Π€`¤©p("€Álœ„7Ou¤¥ƒ@3ƒªÕU q `ÜFÖK†|„ªQÑß,£¤²X)>˜”Ùï’DàÚ"™€K!ÔóÀ8ª;]bnÌ ·'SÄàÙÿŽ!$å2AŽJPªX0Lá •¤2E’ Oe0Ú•ŒóTͤâŠá9²¿ûUÆJt(º ~ ¥˜8¾©t‹%œ™ÁlO¬ºug Âë,m&M΄WÁ$×™¬¹š€’ðÔ¨í!`öÚB¸6Ãùa à üWý’míü0ØZÚ1 `0)íõ*žû5y…Ú°|ÀƒÈöÈ<£B!ÁLÚlkÝ6`pbRÈÉx}ü®‡ÁC4‰á¡Rž$ž§hã‘I`ŽIÓ~Ìvaäãî?š’¦$âpÝ9P„ äcºýžIø=³•ßkøN ÈÕ#¥ïbQ;wâ¿ö4ß%áÉQ¾$’'ç¶ ALÂù™­œÿ)•¶–M`†©=R0 ÇgÚ¿Ï}°3ªTù €Q ,†0N‰`ÍŽ„ TEð§6ª&+¦ÃèÐ%jUx¨ö°Ê$ðÄÔÆ‹À«žþ§j)Àî»Zʱt±´+V«ÁªCÑ ³óP¢lV€S©­@V+vHHoxŒŠá±v°eý—½+kâhÿ ©­µ¨HÐ"[Œ’ͱI£DiEE¼QB² ’LÂ%‘*F,ÚªõB¼jDŠ"Š*õ¾¨ˆx£¶ÞÖßWßÝØ„p~|~ævÙyæy¾ÏÌ<óÝ€C„N”à需ÚÉ#ÂÃ¥2â8XAÚÖ¿`¥Éå"ySïxC´ðÖ¢÷óe"Áœ&«@…èUS¯Çfý|.qRpçh"ÅRYS…!ìö&¢B¬_nª,&€%S?,›*+XuHxYRYLS¥ì1á6•"Šõ@˜Ù6cÅZ+\*é“€˜Ù6k:ñf„Hf‘ÌHfv’Õ-78ª)WÊ`fêsÛ«€÷·úªðÎ$,™¬Ìê5-T;H"V À—©¾ílÝų¢YB˰YúqØòª‰$ `æxËH"‚ñAŒ ó9Z#@)K?J[^y ã5™T*t”  Ë"FqXp¬ŽÂâó£ˆè†ö@ŸM¬6‹”`ıÚÖ}b=§åqÃPb©H¬¶uœØ›ear®z‚@|9@"‹E À„…ÃÄŸç-“Ie“!¡Dà/Txã]Ê$4Rfÿo›)O A„ª²lØDذlذÎ2¬ÝÂ#øbª;ÈÂVÏÖoõ‘RQ½,A]\ÈÒ-‚±‰ƒ¶ ÀÌÙú{¨†…M†µ©0€6ŽÝOrD’¢46“JäõÒ `9 x íP€·D!RÄLä)Bt„ÀMuHÀŽ>J®-€ ›ÑBqZÑXÄl¤É·*ô·•–=‹´K fëu#ï]—ÆGÔƒÜÞA·¾ µÂê✱:‹K£¬ÝdB¬3Ô•‚½ÛÞa4ŸPaà(ج¶ 86"†1í;,¶ä¨‰+‘[bÔ _á» µêrF0¥ÞaÙ&ô‡áW$Ãcuï#­õR¼”0†ÍËB‹sÔäÿm£ªïì  ,K”™îuDŸï¥áOªíï;@dB¸CKv¯#& ùü5˜¯n‚¤%¤Cˆše‚{úÝ_Û$÷ÅGÿœ¨ŽS­öLK|±#æ8¾ø £CEÔšài‰È"¢‰0 t`ÙŽÒðTÍüªIÙ±ÔN ×Íàˆ¢Ú –í(ív¨x&¨ZâÞ¦5 <6¬øÚ¶)ªoƒù© iáÛ¡ÙÆ`-áA·ÿ[ÝN£)ðDÍXŸpíÒmƒ ¶–l ËDŇ wDÐÈ#"º¿j™5DBzýš®õp}`"×§A ×µ+áYàµa–Z M7»¨ŽƒÙcõÄ™®E3fTÿÀ/б~‘9 ~§õÔ¦–ë—¨ˆ$*`@ ²ͼ\(–ë\µ†˶º–b•€G¡âãW‚]L$ðÀ€Àƒe›k·`$çì Ö@ ük°,±²DTý j8¹÷ ¢¡“QžÖ”€ l™Ê$l•Úò%9V>ùhU;€à”Vcc¦4`‡´–¯]¨uå#Ÿ&G¬Z_Sì"V–lšFœaÑ€…ÒZò*ü…b}Þ¬¡hr¡ÂÅѵ\¹â·µ« A#"0¯°,aRí¯^Å+UÈ£xášHíš;Z¦(W0‘rÊ–…êˆx$Ä_P[R3q.°µà&ÙZMyjÀ»Â²­t ÍÐ4`@Û²ÚÎ P²°,¡¥ã ˶ʊ@CÖ5oi…Ð}â¬&nЫ`5½ Ò%°ÚØÔעЬ¦HEFB' `(Á­`(M¬]—¯¬ š3¤6ˆ´×þµDÆH×?'%hN‡-=’'Ö8]õÃ4„Ý×®%0{:‹¨`¶ô–/K«Ý-VëIõ+«õƒV9Þ&Vg‰Ú¬MÛj²’˜íàh†Žõk­ªl3ˆ½`vaY-W,†ñ^¢#*­]K€±ÃD0¸"XÃÆ÷ ±)S8ÖËÕ„\ñA0þ•HÉyÁBœ<‰™µB&ÂP] ‡aYbmCa  Æò$±kb­N °º`mV—ÞÅ2yyñGƒ¦0,ãЂ§‰•Øn†F\À:bMý}¸™4l’<¼k¼ C¿wièñ¤Ý‚ÕBâ‹ñ VÏ­3bÊÀæë‚v‰BÖ}G&çâw µ GÀ´‡˜þå ‡8B‚ù{ŠîU ­ÿƼ€L$Ä{Ox˜ÈKÌ‹+&Õ^Õj^à™b,0Þàfom 3KÏžD‚»¾Öðå°l‡TŸ åò6Uø­fèzD4à 5x¨ÙØÚ`>OCÃÓ·ÎCQó­µÎ£GêXçÑÜЬóà‚Ú™@X³>KnÓ;kIY"¶}—¯!êk1|—sDÇ.ç]Í…]m…ýÑÌ*eÛÞ­½¶¨ŒX–Xà„›a©šEì›ú|$’8É´CXM;$L2_f­ˆ“é(¸'5-ª²h¾gÁ|\X$¡}ÃV3üã@̓‰Ô<Pó`&‘>ZcL}s9@­×~ƒ£U#€i&Ò„«Ñÿ ØtX¶Å㯈°pŽ,BÞXí㤵 »Ý¢…ñ–Åwñê¶eÜè€p3t@¢pøž2©¸Ë PË$ÆÈ˶žXÆ Ü c°¡GÀ¯‹7`"bYb£ÀÒû­ *òµ_ÝKÃqIÕsh˜3êË2îÅ`À8„›djQVÅü—ì¬à„ÝuÓì·á"ƒä¢yØ qsãiÆMš} \­yb¬?w†ÔÛ[ŒÂnËÃxb±ØnE*¦a¿8B>D¥C0âLg8S˜ÿØÿ|©Ñæ0?F³ç.ƒ¦Åw¡qvrŠŠŠY· ŒT6§Ñö+½]Das ¹ %n.™c ñÄ WëÚ+ø_Xu]­ÃDli ñ1 e®Öµ8¬ÝkµØ%°x{Ôn&£ÞîÆ­ëíœÚxÿ§à®³ÿW÷þo’é¡týמÿÜ­ÿNIõwýÓ»õß©±þ©]GÿŒnýwFj¬Z×Ñ?Ò­ÿÎHõOï:úï>ÿ½SR#ýSy]EÿÝç¿wRjŒFWÑ¿úüçnýw|j¬¤ëèîÖg¤ÆþŸßUôP»õß)©±þÑÿKýcê§SèLf÷þÿ˜ˆúûÿã»þrY!\.¾e»NÄÜ‚ókõàë•Ôîóß:%Á0Š3„46Êä#(Ê`Ñá`„'`³(|“Ö}þãÿóÔbü·ãÈæðÏ ÒûüünüwJÒuþ#f Ä ß6?3Íát ›LC¨I!ÓX캥: ‚FS·N^ÿŒ°ÉTÑ`ëÕ랣; PÑØ¸ ‘<ɤ“q¾:Â$cùº'™N6ÒàITCç¨ sZd*L+˜Y÷ÃIÀä7x,Dó] x ¯'C ˜B¦²X cQ<†ŸÂåò#‚±kð,•ŒÓP0VSÒõyõ¤–â¿=§@êÇ?Lc"-ücC‚nüwBÒ>ÿ±‡ÒÀÀp…úüÇuËVb¿kÏü```nnž‘‘aa^XX˜žžîîî¾`Á‚úã ÔgA Ùá¯kx¤¹? 2zý£ §"+X«âߙվ4~aRðrj™Ûcűˆ¾(ýfBõ™²Ÿ'¿.¯oûå•Êí¨ÓìŸ^–S¼jĈ‡_|&¾9;ÙàÍ„z$Ä.¾ã›j›2ô«¸ƒæPüÒ¥Uiw¢r6 ¦¥Ú,þ”ä!8lbÝ“ó¹%ñx¼©—±j×­—†· Í®‘—Ã_..Û[A*»sö«HjŸN)9¾3›tÔ9pß(ÅViðO#“˜FòÌ”{6ÛKÚöµ{È¢¿I%•)kLvŽìî¼j“t§üKeØÎ ±©Žd>Òóx– éR ñMV¤!šynx;ï5é’ÅÞìÖc&Ç5™ü)5VùÌ`ë:ÃäÛ‡øI¹ÝÌ[NJäOÕdžc…Ä;?îÏÙÅ30ȾÞ_™gãPüÈ¥äìἇfŒZšvÛsóvÁ/ëâcIž ßL:wꔃrsLœÏ鵿;/<7ÈcäÚàGFœž?.6é2œü´uKFj$üðõÙÃK./š~lñ‘ð·¥3ŸE®ÏO'ù}÷Õñ½q«÷ßžœÖO•+ÿÌægÖÂTÿj’SÜÏ~*·ü唸nÕc¢ûm·X +7þœx'fŒéѼ¸6ò¾ûçÁ ñãÕ´¸¤ai)/Hi%ž}Ñäg'*(Ê#Ï“ÅÁ[?âw"I¦ëøÎ=8…ÒžE”ó‰pM•¥Ò˜ìü}Ö¦e»)ŽûL•Çô-q(Íÿ‡´zYuéì¢Å_§-_T¼0åîÚy—û©vLYwxñ}ÆŠÏ†Ý }(ü¡`Dð-ÛÌè/)|?rô¶c/Rú©Üvy|b냑“×GvPï5À¼0Ë¯ÊøÍe»Â¬ÌJ¡4¹ô ÕnøDyÁ!·Èœ”·ç'þv@Eòp6 õlÏa¥ló{´¶ZµÌ/khi± °éo‹‰w73ñ÷ùäàðoËRFò“ìIÅC÷}ÊJ?övûl;;ÎüF ÛËÃßš/[ì÷.ø/—Wá÷ѹ}TO]>àºå•‚•ì—$~jYli!ÿT5°Ø®×¬É+#û¨ROÒca›¾cX‹üf #½Ï{L応Kq4W¨cÝÔh1‹”à°v*g eô˜‘𵝠2* ½€„õEGrŸ²&Þû)+b• éHDéAjîéþClÞ܉ýädÈ'¨ýc[äǬGa_¡I}˜ãmQáæ¢|ºÅs®òDAÑÛ´o`óÐäÝ/ö-1½n0ØÿûG“ÿ|å0ÃÌñ´Û½‹ÿ6;ÊÍõéoŒfþýãä±GvO-ÿ~ q¾‰”ÌJœÙ{ú°e3®)‹þ úÏ£qÇÛÇeèóÃ%pzõh÷s#¨…ëg$¤Þ-0 ¢¤ÊüntÍ̪÷äÑ ã“Ñ3rãIŸl^V㓳²wÎÄŸ|ò¬£nü]‰?±4B×¼÷ºÃÁ§×\;D"ßÛ¿‡´rÚ¥…/m=ý\I/;¿ÓÃ’ãþnÞ+ñMóWYf³ÓÉÏîtЀ—¦Gs¶÷žïO=?Áµÿ0JJX~â\‹)'öí¾µqý¥s±Ó‰Ã0·™IÏù u=ávúù{çÇ+­öþvÆâæ¶´ô2“ÏU!‡{d|?¬„=äÒùƸØÞϹ+*®Ï pz_`ŠÎ2~r°¾»n2¼=Ý%)ù¢ßÀ“‡Îl33û°‚?Žû8*èÎŒè¤ô7sû)† Ë|oóïp,÷>s¢ø¿¯åÖo/Xcž¿öy函WÿÚRõü¯‡v5E©[Ÿ\™veš-ŽVprоr×§¯Ê9ߤRO[pògf[Uû~d¢ÊKô({ËÑîÛ g†¸~¸òàŽ¢(Õ}£ḛ́ƒ~‡úl™¿Ú}Áó<äzÜ›ýgi'$’‚]Ï¿‡']öEåûaKžß"qço©ŒY—Ç50A7PoñV65súW–#ÓGÄ­/@K­²S«Ê%JŸß»°ºþý¥ÝÓ~?þýR‰SÕú”óóÿš1©9WOfxÔl¬º±¬äÉ­5»$qÑ–¡6OTUdžêëü»Ýç{–T’l.)¸ ýÙ¨µöÁW_?ˆ<ÿ—e~´Cñs3Ó[vý2´„j3´dâÙ¡Ç.ñ¼>œ Ø|·jé…}*¯ÏsêMú{WUÛþ ÉRDâ”dÌŠ13˜‰* бGYÇÌÈd˜l¡$JÙ…O”2B¶^O´eR¨(•¤§ÂS–J¶ô;ƒÞy¨üò¾ï§Otÿa.ç¾ÏuŸs¾×uÍqÜçûí¼vbëÃÁƒÅ­‰…Þ 7’¬1Ÿƒw •ÖŸˆ­> ´ÌW>Y…Žxzóås–ÓŒ­yµ]|iE=²ks.´uŽàòÎÓÊN½Oö%PÞi¡E{j;}NNÙ”˜s~û@/•+=Ë*ïpmÄÍaÃc»:l‚1y…y—³?¼i*aæ\7!*f.h¬¢…÷ýý¾ªÛÄ T’üG7¥hµ¤à“ºÈ|Fc_ð0#SØ–Ù¯Þ <ô>U™„;jû:²îJ¦ôÆâQÑÏ&%ŒT™ãPùûO×[Îë^ŽôƤ:¦Žè.hz3Z”Ûð6ßõ–¿þ*?‡%˜ÆòŸ®w¶)uª„Ò‘´D@Ÿù³m޹8/'*ÈÔñ†Q€®¿Ù»ÈN.ì,Æèæ)M|Å`ò˜À‡È «BMRdm…ÇHó¢¿DŸä úw/DxëYèFÅ»XWß~#Dø‹Ì3P7?£þø!D°¼ìªâ£8:’Ùe¶£!Í&80!Eyé=RnìÑ#ßzY fÏ*Œ,÷ñ”-÷¸Ôçðž¼\¤H¸doÙÏ0QÒÈñ z®; {-ÎnKÁgª*д,VÒ¸žÞ·(ÿÂè«;*o—²Õ‹Û³NfƒCO5=–k²ÙF‚=:WV~íMà_ÿ˜¬¶#çã>ûdé¸5Qkò Ϭ[Ìš·œLNWê]ö舙aæ¾ÎRC-‡˜›ÒÜ0’;¤6Ï“¯nV“Ž‹~fxð¹ÛñÔf†,9ìÔ©eZUv²«Û£Gõ]dÞ£šÙü`t@šÎUFÝ  ¡ O%ƒñÇb•JÐ’>E¤LÎ6íú SÏ}©„•¦]|ŠhI›^XŸ°úÊU±Þu6ꢽ¹ñN›Y7²²ù·Éiݼ8RÐ~ «P_²¿À‘η†¹©1úDºÔúŒJååÉ{n‰ß¸K¸Ó,¼Ý:$ðl˜9V“Qï"ßQ¸5Y@ð±é¾Íš¸+÷ VU7»š û¯‚»3Àcæ‚.íý;äeŸIÎeöô`3”Ï“Åÿeæiž”W èËì=’Ö"ºg,Ù¢ªã†•y½¢fÁA sóL¿¡+§„5g#Ÿ-CH„ß?Þ“âL¸®pjtì®ã¾—u"n}Lוm,eã••-‹zRïR‹ÒÚä?‡Ç霻TØ>xš¤ü·šÓ9ßï…Ú0réœé:ºËâÌhñ»>±UеœHåH¸ ¦&¤£¢OG:9µiÑØÃšSÆà¶Û GmPVàÞ>jQT¢oÇ<¨{È6VÖÚ Á"~…ìá°ARúªT.ý½ ô~øgá‹ oâ zF„ÀtʽÇ4óÏwû¬ M-Â|9GëÞð=p‘«ÓÍP\‚]ÞôX,}ºbUÎ9è–_6ò•ë¦×…•|ì›7÷dÆ>Ê7tÞ‰úõ wTnáövzp‡Ÿ¡˜„·¬)×+Ïq½•Ïÿ k³_oÇþ9‚oçŽï:$îuô¤ IíÜý˜ÓVOp#k6cŽò ¾RÛ`§ {´ºa%_Npèdéýµøìb të º7† ^¸ä/å'Û Î‘Ø½ói¬uèiþU„]훫ŒA.»vǪPeB¸[Ä™ã$Yqß‘:%ëh!&FìLcJtYƒ—|Àw@{+€w°ò“"°ý¾ž¬¿jE•(ÁÕK×_ºÅá±.>ÐP´µ6€²ûýN¢-áå+jíka Âàs‹Qù—V%aÕ¶=w¶¿hõéó *sÐhò/­}¢Y§ÀDõ,Méq»åúëÊ 8n¹'ä—.Þ¡­…:^ƒ¹ð¥¾A™¡¹>Â[”Ý^ôÚöpnþ#šÕ†y¥´-È¡ÝKÏ®ÛtëÍ+ç,ÜîºªŽ‡Ãð¤;é<ˆ÷Á. VñI­f×{ ½K·åzMî° +ôo-žÂì7æzÛо”>Ì~‰#îÀ¾Åõ-/mG åèG’€?$6ô+öÔ*È»q6{ßžbæZÛ-_âgö¶$ñ­‚Ý6é7»’¯aaöVþpIØÈ÷ì jÙ[¾DÀŸlŸ º'ñ•ô¿ˆÃE[\ / í»‘¨õM@Ö‡Yôïˆ%ß+ 3Ã(Ñ6&rżo$UÆÜW0Q“+©}/1! ¯’€¿b‰ çêÅÀ‹éÍ8B¼Q’°ì”æ@Aoí@SÅÅš¬Î»Ä—$a¦¥M»dňÝ]¹Â¥HéëH)ÍjaÀ&Úˆiƒ•:ïݘR…P  o÷ 8ž¹7•—½×Èi3 ·ÿê-›Ð,nÖ 7Jƒ®}ýèÒpá‹sÑ¿Ú4æRicÑÈÂx@±û½ÃÄ>lÙ.f%#“O>ƒqÍ6IE»>Í)Û²0NìÓ|0_1ou/€q<Þ›ð@"Œ\פF®íεA¸è_yèDª´2Üž·Œñ´t×§òÈê›6+rW¾BູaŠ ±ðÑþp±7!26†Ê ]¹ ÷ö»—݇~¾ŠøýÜZÍkNX~ÛÛJƒy.q˜˜XCˆƒ>T •l„*aAœR^†ÅŽ,Ó1vÜPÉjÀûWV»»Ùw»ÎAðT/ó\Ÿ|Î_'!±ñ¶‹¾™õ-ïÖàqOxúvÉRöź¨_RñhÆ”ûJ¬l {—¸=Ù övó k ÌA ®cñÄí½!põZ^(…Þ¯D9Èt“_6${’Ãmk0Æzñ>DCÑWГöÇ´;©µê$Qî˜Øg–Žm$+]Èß''õ±rߘ¬­›Y6h´hß\s@ý5â•_IÊâ˜à§`bœOŒTQeRåâ'§Íö3êª7J¹}4KÂ9yBÒ±à3›Ö†àæ«ý1&{÷ŽbÕ«o1ÐñºXúùü¶´‹‡iúÃÒ©y•õŸ- ",‚n'zŸ´“¨{åôPQo´Ž¬î‹óÄùoûô®1zßþšfß+ßât¼óŠ0Å‹™ô\ÆÖZÉK1”Mì×¾Cu4fÎëªç3¤ÔfÕ(qÇåYW]V#w5ƒMn¥n@§âÐõŽcëØ”X‘å¤|IûžyJÒˆP¥tqd*ÑrKôwFEfX^Š2²A ñ©÷uꇊ2i'+†Ê[„ç¨Î~’¼Kñ©föþQüõ¹-ѵ•‚`žd§»‰¼’´oáå› ÿs¦ŽˆGò‰Ñ—Êi>´uiÒ ÖÚ¯l)=¿*\xÙ¼êÞ&:¡Hp%¢ªü_w3ò]s¡ˆ?˜ŸqûjÓ+õ÷½”F%Ð!|a‰£â‰§Ó2:×~è!öÐ>[h\ñóœßØ€¨Ÿ¿ÑeÿôçÿS×ÿ­ýUÖa±¿×ÿü”6õÿ”_ÿßïþ¤65ÿ5~ü±Øßøÿ”65ÿ©¿ þ8Õßïþ”65ÿ5ü±Øßøÿ”65ÿþ‡ÉüÿýþïOiSð_û ñ?üÎÿŸÒ¦âÿ ñ?üÎÿŸÒ¦ãÏ]ÿ9!¾å¬áŽœXÒ;¾Öõ?šcæõŸØµªjjüqX5´ºš:š³þ‡Qÿ½þóg4m9}3=ë­æ0#kS˜¹ÍFc=‰BÙªé¡PúÖúê*h ÌÚ‡äåKó£1¼HtÊ€ÈáÐçµÒv§’(:ÚžT?ŒÃ¼…¤zûÓváá®=ª—ÒšCgÆ¡¬æü†‡sVQG‡õ͗ꇧù2XM$†ãÓæG§êL¡øZãD&'0)“Št0« mENÕFMì"¤M§yyL¥Øœ$õ"ûúÂa>T:>Î@æëN¥úÁažµÉãá 'ê?•IÚ.9$Æ%%s ‚éO¸›düB"¡1Ú®/ÔhÞãüb¶³i[¦Ò?õL!s‚ºÌœ´:Î% ›yowt4>d÷ Izœ¡>Œ¾tý#’—Ãs^_;âh üÎ"qßÉý9@Ìvw/2'œ|¿>Sª§+•C³÷n¶Ó®$ú×Ç1;¡ëÿŃ%•ôGá3îb‚ÕŠxŒÎôX„¢£óoî¹ÉÀƒ *Iã[urC‡ëÜÏ ƒŠ°?‡~Ĺ0†´‘æ ã\[•ñ‰ÿan>¤íL…Ú;}¨ßØúOM®8$zº8$š+H™3üÑÜ «åsv&Ø:[›:ë›™n0&:9;‹Í•³Ì™þ”ïL޹q¨6Í™ÌÙå4ÁØÄà»YŨÌÿ2£ÿ猼Ø8Å ÷õËH“•óKù¯ãâÏߎ ®ê d΂ÄtŠnF¨«Íº¢p¥q svˆXX™ÙXêÍ€ 7æÕg¬àÿ3Tþ¿·ý¸È|é™nZªÏø=1:ÜôUŸ}½ç ã@æìÐ1Øb@´v613ü><ÜDUŸñ ã Û?à¡rä3œéŒí_4ÑuÍ„Ww2ÿC„¸89k„¸99;„¬ ˆVf–ß…‡+y™?*Š‚ùç;¯“ò_Aã;)Å0.ܪ‚¹ªÌ€ ·z`¤zLÛ››»Ø™s÷{¸XAÎÈÌDÿûqsû#¹ýß#„AQ40_#äìòugÐ)ß‹;bFظå;Ní)>¸Uû#UeêÞ\ÙÈœlzfDkK³ÿcïZÀ£(²5ï¢á¢‚h„Uh‚!L2Ó=Ý==yA^$YIˆa0²«ÆžéN¦a^éé$Ä‹¢‹²¢²¸»*+®ËsÅ]¹(‹~ºê‚»øÀ«(Ü‹«È‡¼DÁUy©Üªî™ÔLwgf’4ìuúSÓÕ]UçüuꜪ>Ugj§h¡8 i ZIv‚#Œ"‰ Ao@²›Ð À8 ÙuhLÓ]´ŠkjfÔ”V» w(ö Hš DÅÀÃ`¶/ÀÅ-D1™ aBÃÝ]“Å~ɮÄd˜î¢É`šp*¯†–C§8!ù¦M³œ*œ‚ ®'èÕ‘›) $»‰ ’]F ‰É®!UU­»iu3;… Å“I³F;“€Œš¨Á¨#+!@h¼qt׆@¡q@²ë!aV‡¸IP}±«´²,ñb߀¤Y3Vg¬ñÝÆJ/§gzGs¢ƒ†GwMA$»ŒŠ1cSǘIº–0£ºªSdPì40½c~ilñ :k àn"DPhì&"( Hv$±L-„²ªDˆ )fÌ1 šÍfzcC6 (N¦!Y4Ahn‘Ú§ÈK™ö(7ÙŽ(ÙF4VY8…Ū‚EÙƒ8‚+!¢M—×î•'ª8WLHT*‚§G i1„B ™¼´EES ‹Ÿ#•ȧ†é€Œ2•*ŒhqôÛdƒÄ6é1ǘ‘klÈ®0‡ŽCÚ%øù`‹tÏi²Cš„@˜¥I)_.Æ ºH….æ¼ÓEBº@YO"Âp£+J& Gƒ•ÎЩíZÍØ€†ø‚mHGÕ£Ù¨áˆVh&’Ó¬’m0Í4¤Ù+G"‡qiõh6jÔr(4“½Ž³Ò,¶B ©¡ÓíÜFFŒB4ÝëD3±Dé…Õ(ü"®¿ˆ£ð‹x§æM‚Ÿ„AëØ6Dt¸P)r#Š–k?¡ ±s5Ôx ƒV±…"–ƒŠDŽžjDU²ft!ýa.+;Óή4¼±ŠQFç‘« ŠrE/÷[;54|5he{ŽˆŽ )iJ#*­T”bo zJYÃ_ƒìJV±+ &)c”µV²á:EÕs½Ð“u­5—íFi-ÅȵÛÌå2Ëå)¥o.›õí ŸÒmŠam'’ò96ޏµNç%UoNäFÛ„ÉœÊhn”ÚS¬z;i.ñ ïèØ¦s\·swÊrÝN©¬kä ’Ý[<´µÐàTM®Za¡)À#TSšÄÑ>ƒŸZy1,õfê¤Q«¸2ß “ܽÄ\^?õ ÄüèøÈ’€ U.r‰îu?äW ’j>y‚~e3€Õ ²üž°?IàAJqX‰F±Eþé ë}ÛÀ£Þ¥=ç˜2"©(¤I¾Õ9íJÈa¹©AÏ캶ȪiܽØuqãfî¸<+ôôpuÅeþB:Ra ˜ÂD˜R £rD¹!ÿ€~ã±õÔE\orCÖ“qyA9êÓVl gЂɨóœ(ÏÙÅŒ¨ iõ˜²Ë5r•ÖZÓâï…ïlÚéCâ‘F£˜hFä.’&*S0/æ¸è´+²4–ÄýÑîÑ–ZÇÇ´ï![8– 8‰MPÉòvImàÙ@K¨·€†I‡ÝDôih¶û{›x´ä “ Å=m@ÏyÆè ^Rñ,•1PÐRŽ–yTß§œÇ“z}°@ ÔAÿ«2MßQ:§¦1 fô\•áBi{-+yuC™2i²›Ò²Ù µ ‚6vàê©Ù h-Íá4Àèb¡§¾Cøx5]hKHv2Ä‚áU¥Ö8Cµ~Gª-D&£:öG8@Ò< ýˆª€M›‚¨wÓ5<zsk:!Úk’æéCÂÞaè#„4CªBc9s¾ÇrÆ%èËt/ í½<œ£0 ™ ßhpzžéànÌÔ×–Q,SJN[]nl¶È‰Z¡1™q¤ðʦCÊôÈÁ šš•Œ(§ `e*9 §zÐäl…´Ã$ã þ³k«.îº×ÔɉðËv9¢ìŠ)9 ¿zÔèl–cH/3Iõ2*wk+/ŽÝ¯i@L®A†tjSø¦*; ïŒi>«á¡ÙN[2º:ʲ¾cs­¦Ñ,ÃÆg”}±%'á]›­ÓóœÈæqâɸÖhåz&†¼ùUkbD}l þ¡ŸÂ±'¢óÐÜìF-—õç$’q‰sN‡A·ZxÛP.áQ.EKNÂ¥n67›Ór N{ èÖÙêV…NÐÔÝ‘gÐVÅ•œ\{Øpí:„ÙµNµ]ëDö™“NyÞd޽|,æ¸Ê ïÄU¸ô*çƒaÙÊŸ X!fSŒL'“*QrÁRCs ßÂ?)/$E=vv¼n{‘‚vªÎM$Ð9© Ù€zc¢ç\F¹Rp]0Ø) ›1©³ ¥àQÏú0$;‚DFào¢§¼Èƒ¡@SÆú¤Â¬Èø 4·0Ë/p@@³07… ³" Œœœ˜ Sn)ÄB~D]—†/Êèí£ñW|ü¢ïÄÿ Óñ?̸âñ·÷üiü͸âñ'û þà±4þ&\qøÛÙ¾‚?Màiü͸âåŸê+øSTS®xùw÷üi"ÿÛ”+^þ龂:þ»IW¼ü{ú þéøï&]ñòïè+ø§ã¿›tÅãÏôüÓñM¹âÇ®¯àOiüM¹âñçûþéøÏ¦\ñ㿳¯àOQiüM¹â忱¯àOéï?¦\qø3¶¾‚?E¦åß”+¼ïàŸ–S®xüûÐ÷ÿô÷_S®xü{õû?EPï;Ò㿉—ÿ@|Èmm˜¹nÔ¦¼uðÇm@è!þ4e·‘¤È? ³N­ÎõÇ¿`LÙ´R×ÌÚr¬ÒU=«Q2µªËʱZëí¥Vk™«LÉ sm8æÙ@X„`€õY­å5Ð/PöÕ+ðò,WTàç%ƒÞ„9|s‹ÐZ˜7Mî“ã‚~¦˜GùU˜%ñs$¹×å{¼¬æ¥B!ÌaÊ™ƒÃ2%AòñEqn‹yX &è{lˆC n„ÅêøF^äÐÃVy;£À'fÇ;œF|=áp&ò¾Â,ÙÁ2ìåy) ƒ¾°‘¦Ád?D™ªˆW☜ ù\ºÛ±2¥¸ˆCcNx†Z£žŸÍ²ûdVÌa1‘;qMЉÊU ’Šgf-Û¤ìöœ‹%~Û+€ÖˆotÇB)|T)£2š•RA0ª'tÏæ´Eê“–q GÞ‡tõõ–€ö¬°¶ Õ¼ß „/¥bš|A7ëÓ¶£+e„ÿ£%Ôñ>ÈŒ\„â´ :?^”r·Ϻ¼<&oÖŽ„É c^ÞâE¥1²¯nȃhÂ:JÂ8U£ôcx=¬`”\R^[,ʈ¡‡÷i·Ð:Žaëmx‰Ë—OìÁ:ü…Ç6p@Ð’ê ÈçææÂ2 BàtóFaáÙ¤M>ÁëUN#•så&«ln Jù²_üåñ)®ÞÈ›Ñφ@wè¬Úq‡¾ß‘d€Ûïù„o‰Ežgkò0¸XØË‘\ä=Ô9 Á‚ -C[ì»ÅŽÛ;š¥WŠèºDu$eÁÊB9 0aÖaÝíKGød5 ‚°Ð6Üb·3 kÑ)9´Ãf!hÜâp8Ï—Nvi­ÆIð%«„rXp›ÓâpÚ,ð@ö$$P\, ‘­3I« ,8mUÐxHªèÝPD \^!¡°7ØÆÚ¼‚Ç+®aŒ`‰¾v PÑ_ÑA@‚ï*ÃpsZ¹FwâÜ])ƒ¯v[Т/ë²Ý.ï“T5œñ„B  àê°Ø›ÅN&¸:±%YE@¢)ÆBâ6 Céc[ ª uœ3!ñ#sE“‚ŠÚ•ocp0Æ‚xYóH¬(õÐ<¼Ïb9hòŽßáë‰ü†&.è(0.­ÊÿÄŽ[ øh˜%û^B1† éÒz¯(:ÈÏû«$Þ?•ol Û@§ŽnÆ‘÷ea­‘ŸR0 *«X6J¡š¢êâ_s%)èµiÏ›¹C¥†L`8yd"‹:i<|@izQ­l ¥úñ52ãl-0²·Â¼üˆ³ÆàÊÅ0u¯J™d}»IÆ8S«Ü› q)ul3Coʯ€nP&ß3‘2@¬(„$9ÈÈø×¶2Áå|@ü@b¤¢üs·H^0 ,°º¡õ osESX=/ÝÆûdS³0­òIÁ<Èo“³'ËÓ÷\EŒšøÜ˜ô%{B¶Ä€éŠ:!BœO·q7(‘ â[gËÅ“¼V¦ñïÀ={1ïÈÊ)$~òcÔGaIÜ-p*d¨¼ÁTD¬„ Ö&ø|˜›‡J£±ÅgÁÀ“X}•«rÚ V\3«/®«+®qÍÌOv‚\¸Á[È'€bÛXÌò¥vØÿ«ËëJ+ÁóÅ%US«\3¡œRåª)Ÿ>›2­+Æj‹ë\U¥3¦×aµ3êj§M/ÏÅ\ѱc\GãÁøù ™Â Ž`¹Š‹•L/Sö8F³r±é´«±_¿ÏW•»æüîØã[[?˜òÈgïúö‚ ­[>ðÁØbÞág_ýËùëŸ}»y½dDÅÅÏÔ<46§qÌyO´þ×%÷¸xuù¯NäÞ<º_ÿÇ÷»àó«½çLÛcý'¿ð[)xùúÏϦíøÉŠIÔíŽ=\¾ê!Õ ¼‡Î=:aÀ‰ü¼_žýxÒWGÿzáŽwŸ»¸ÚZ;ïäÄMïï?wdÔȆ¬Ý?]4ÿøÁ÷÷”ì_óX•8¨ê©½cÈ¿ÜXrÏ;†’w[ö½sѲë2ÿØ:åWKË6dfŽ\yäÚµ¯7˜·dChpƾâжSg›W¼ôÞÔÙÃoòó·½dÁ’¡çv/ÿrצW¼ÿ^2}ÀÛS†mÝw TòQÍ/¯:ÃÞöæ¶UŸ]÷ÝÑÕ#‹÷Þ±z÷¯½Ÿ²ÿóȧ‡×—ÎË?{méWÌÉï¯þt÷=³úUh¸oâäÍWÍ¢VüÅé÷ú—î¿þ»í® .[Ù~záœÙKž«]ûHsÙÍ«ò—ÎÚxÍ5Û/=T;qØÌEßx¿ýÓ¸ÒRòùûçÜlß1ªšoú8ãgOî«ÚQÒ¾tUÿиÜËV`¿[øVY˽]:pÊë ⦖¬|ý™“T-÷êàÇ‚>9Æ6iFæÈ+‰qûÝó—eU·¿õüÄ_yN,ïŸuÙrü'‡Ý÷À×ã_8S0í”wî ¥ïýäG£‡pަ>\^R1°ò‰ãgÿöÝÝ‹~ôÎã· ÿó?²1޼õók¼;r—÷•-;2Ê32‡ìººz Ú~ç ²úÁ¿•l)nçÆ³+ïzqeã–[Wö¯]¾äØÙÁC‡wéöÉ7¹~Ã}±mò•Õ«ÀŸ~7ÍØÀmÛÖïÊêÍàkÓÚ'Þ|6³z?÷Ì6×7k~º÷ð_TýÞàÙŸîÃr¯"ïÚ¾vÍÁ‡N´¾¼·¿cyé’‰Ã^+¹ìÊ­/Þt¤å‘­—3;sWïšðŨÿ¡W¾¹öI²â²[~6ó© ßñßÃÛËW\tõßWîÞùúËR¿Öõ÷7^w}Î¬í¾ £«‡¿ÿÜE'î³>‘9ø÷WíÌ?ø÷G7ÿºuX~Å+%—íyxü¹¹«N]tÌ’½mKÓ ÓO|ï嚇­kpÜ9®µ¾î•S'‹ÇæÖÜqäáÉcïûMhÏìþ#‡žiûòTËv~ûêû¿õhøÔßÿþÒÅ_8õÉú×6ÿâÆõ{öÿ7ÓøåÁYÇ~ìèUÞ_Ñúò»_;0þé¹—ÖÔ¼ºxTѺqOïj_?¶`šµmñwk]bÝ^ðö_urÓ²‹k¹÷‡^ÙöÀ– \²ì?ïn?óyaÅØç¹•Gük€â6ì¿e]Åü†uwŒ:üð%uƒ/ÝxtîÉ϶ì³ðü»ýGÏî»ãž×W}ôǶÞñõG÷.*½a`žtlÝiáÞʧ/Ÿ)’âuôÒ[î]pìís[ƒì8ÝR9¨ýàü}«î¶æ¯ýíï¾Õ|úÝŽê?¨úÛþ•+]?ý·5Mõo¼1/sÓ™3Ì/¼1hÝéusZ/Ï^xsÁÆ ¥§›3Ͻpký'Ã-ÖïCçOZüÚ»æŸù|謲ÍW|¸·iRûñúAO­8{ã¢É›¿4…§kzdïs#ïZðÎ'âÉ ïÇÖá´wÎã!)ï…¡?~óú‹žœ]4çþ¯;gxÅæÅŸ=Øöò[&Ž~íÜ™;©aCžšýó±Ûþ½ïkjÙNB€€€éÍMï=ô–ÐU@ºH/¡#iI("¢‚(JU‘¢4”^ ¢T•"ˆ (]iÿ豜s¼çÜwŸ÷üïs¾(Ù{fÖ¬Yuf²×ÚöÛ±'N¬d¨–®ˆMè„‹¦Jwï–䇳D>»xç ëÆi[µÒ®5[ œÛ•·$¡²5m¯—ìä¼Jaxªöð™D®àÖ}wëYw)p?¡EÝË58ÂçN¦?20v_Æ"Ì7£"èÀ´ }»òËÈZäÚ,ç"òÝ9A>ì:Q–´ã>u¢§ŽcwUšièãÆ$dÂ`1jiI…ž2Ì»Ák© ›éc4ÇhsR4 Ãîí,7Áél—s²]oS JSí³¸åý&qnû„sáœ/7 /Ãr)‰¥XI˜¤‘3ÝCˆá;(glnvˆÃlG <ÁetOd ª¯ßT896¿Bíð93'“>Ï”ÎlQE¡»¬.ÖN½B¸¢0vYÛ䘾Ö¨ÖöÚU½ÊƒW‹‹ßߨjh…˜)î’)ÓÅ~´Ã§§Ñ˜Jp°fEÞB§©iXšÞp÷=6|‰J{lª° U%3+)m9Λ fÀ™æž.ò²Ì¡°1J­À͹DÈTí=’›J½»~Z¢ÇJMo}wLYj‡þ’\Ñ}&jcˆõþ‡49³»äE¼ZXßA6hMãݵ @×Âöu¼¹„ž$‡óãÃt&ýjiÞØ¹¹6?¯·Ý(Ý5ºdHÇÙ{WõK_ íF­:hPUu¥*s‡ ÒKÏÑ( ¾.¨¸ØË‚êÏ<¸í\I®`·Ð²sñó Òd—õêãrQö¨…tÁ+n,ú³t-‘'5ö»žt–íÈë·W|,Çž”ž”ŸÚ:œßkçKy¾ËaåØƒ˜åzëÁµõ˜|¯=„3Zø¤Æ*ë¦]¯æ ù`u6¢±Žß&<¯å¬\$ˆºà }2(*élñQŽÛ‚óì/¹Q*“¿b Šœî°ÝÑ“žm£ÑDᜪԂ%ƒVE¶K¹Ï;-Ö¬Ð{¦š]죮ՙê+8±(Czb§Þ9ööD5ŸNx‰ªÍ#_V6Ôr­é*ÍX\ ìT8•%-À£]£õgivœö‰ÅÑ´['SC S^O/Êœ+Tuºªœqk¥÷°Õ>~þ±j£­0KüózÐ?Ö‘kŸØ·%šÊ^šV_Ôÿ‚ËÛ Wó,Îo¯¹æ•[ûzãÈ„Š]cŠ.`›æ2Í/y\mÙ.“‹ŸÄâ´kè-9˜’ŠNFOv=kt”Ë}˜ë¦ñqM:¥8©Ý—»oOðV8ŠJO(ãeOê--¿Å‚múÅ·+)õ‹Ÿša-G ”ö¡G#öÎZ'_ÍuÛr:S$Ç:oüu†lt¾ÊTe&i÷Ú`%ê²d†&ƒá±Ð©{«Dµ>žÓP:ÒŽ’Õ¯\ö4¤áûr˜©ï»Ômí Û幉Îq;ªäeÌ€l鼿‘§Ð+tZɺì{ñ…„ü]RiÜ­Ëèú@)¬(6C*cP,Ñ«xöT}H±Y§eg¯;JrÔ0j‡ykõZêiúÀŽ<ÔÕ¾æ~G’›WpÝÁ;xYɪWÐô@›Rz;k.=æ-¿_&tQ=¿Bøx-¹*‹ò¹;”Üàw² §1‚=êw×±g*•&²¦žV uP)kpM­øS¹Ôw9*yÁ¶Š,ñçu:-®éNqx錒|4TÒ¡VCvPÞš=Væ+Ó]~&d«uCQ³TzDŸ*,™FÝìL§]ÅU2ýöksÜØŸÐ nr¿r7›Ç>ÁJ¨c± û}vSk#D¹#·¡.Ë0å’uU>¶‹aÑè ’HÊ…Þ>RäÒYY“LAšÈ'—xħQœ¢ï¨6¹-m{COŒ¬š©"T?|g9êɇ㆙XKi†ÊS9]ž%‘ŒÑªWM#°•~|%5fˆ¾í+îÚ(Åã…äIÞôet šg„.dWè‹÷á´M¤drºÒ¨T3d©oíyŒ­ôZǺ°Ö]†N(Ë­sþZF]Øý]†!¨r…¼… ~8ŠyÄÅjËÀ*ÅÖï…ïsµjûPîÏs¡ª¾«ØÔÍA»§kúDË„gÕ!W31°˜ µL7äáê´µëë~«%–.¡ÓÓ†ÖÇöíœßÅ^¾£·ºDn¿ <¢ýÚC~¯Ñyïs gWÞœ wÙa~b=groðèºK'–]ø»žuøø0È)¾´- FoM_tÍÎ~0d;'jô¾Ã;/wáõd¼ë3åñþíë×&šŸdÍk rÛP·G,^y~ ì+ø.ëÁÒ6Y:3í¬‡Ö‰®3ìíð Q+‘¸Þ3QÊôæ…J{œ†ÞetäÛɶÝô|w¬äNוvËñVýýÉeO±<¯IrD\Xˆ±ža> žÎxTÌ'·Î;÷0YŠgÉ{Áê5Á“GTsÅr+NÈî]¦H?¹w@côbâ UiÐÚµ~Ô5½°ã ÓÏÈúå§(ââªìNDÐØ‰etÈH”ðÌw¨’O 2€½¹t¨ª’m /_m')rÖrìò}›÷êiòþBj£-‹*ŽbÐ Û«ÖOß´âgC­^ó%$‚úxÔO3ãµõzîK:ФÒZqŠÜœWÌÃeØ– ‰F3Õr åS©aŸÓµlàÃFE~x£x*/Gò\~3zôŒïžVÒx>lÎÂÖì-ðä¶G*q¡Üò(¼Ú»¤k£mÇä.HÞ±µÞjl­9)ëèž2lH­×ÝýÔˬõ+Va=|ÓØ;¬“™£!/Õ!¾™‹ ‡bòö¡Ça<†¨¢³2¤ËÛ[tB9ÃfÏ;Úâv,¡H;ÿ,»îxA‡€m‰„÷eÎxìËÈòájìJÃHäÑ|ÒnÉʪ!,Šm§¸cçm€ÝJõlJël8ý‘\i$µN·‰ ï[²îWŽˆSa-î-LŠÒ]3ÞÞï&ãÐ5JS†SÆyŽTš­ä,ÎÌú»@ï'ª‡v£zíP‘G]L[Üð1J½¢2ìIâÓX)›iX¹³OèòN=ížé.Ïs;)Î;¶ó¿dëó¨ä:Vs"!–FûÉyÒî ·Q¨‘×fÓ1Ìó'huÓùZ;oo+r…«1?£Ýr~÷‰}Xæ±ø«y7Õ·÷òök÷LÎ\ÐDfç2Áš”w–½ ž‰ÐŸtãV ~Úç[us¥Pã¸ÓŠÅÛ‘öØ’ÜW±ìë³B§yé |ûQ=»FVÂ^Várî`ÏÉL=¾œà2­, ǽ´}i´ vÙãÞñ½£)_Æ™Žn'¯.ž»®ñ§yÏk¢2»Î5êeåÛ.}\šq™{³6ѰË×zsÁ;T!Ë`=X²AÁ¶¬4Y1úåÀ«¥¶k“‡–—ê%Ž/¿ëxñ*ò@#-vЦdpu&6ñâVò½:rä|Æm#_QeÌzÖeD”ø¨ŒÄ>æ{©S\¨)Í:¤4Ýo`2íäw@ºa=ííSfTO?cÕö;lgÞfïÁz?nì }¹îºl`>Y„gÌT¼ÎªBu+|5FÉ´¦¯n2«o¦æåÈFºIÛÛ±Nû¥ÙlÊK챪ݭ¯¶/åƒkÛÑ^wÅ7Ö[ÌÐ¥­¯Çø"/:vI¬ÎŒEÕ$¿Ìò:sñÒ@ÉõWÜþ½;QËwòʱ"†ïÊŒ U(õmÉ 9lwÑŠ@+Û…ƒE÷wë“JÊËV0ñ(XZnHb.‰2jKœöMÚþî§ìw]Ñ7I¶oMKÀBÕÏImË|¹i“ÍTÀKe‹€CuvZ•vö„¾8¿ORi®#Ô™|Â9#é™–œ¢á+Ù®Ó”ïÜ»šW ˜ð\0:B›_­Óí­?ã1æ+Ý™F0ÜO¿Pdi;Ý46öT:²}:x¸ÓéüÓÛB}6о èݹ¹¢ÞW Ò·Šæ½(J“SNÁ ]ôΞ…¸ŠM•sW&Ð8=Y¤ä¸jtÄz µ®ÔJÕ5†oXûT„M3-Ç+I´INyÉcø#-Žï9ì~˜ï¤^jîiÉÒ¹‡S+dò™,Ïõ°ú!8¾,=”æhü±‚œþ­’°&¶´KÌ»ùjÊYv ˜Ÿ£ ‹ÎëX7¸áª|÷H¦é•¦Qç Gíø‰üÛUB9»DÄ9öä `;mûr*Æ*uݾKÆ®$ÕežwìD8¡`8B’ÂÜÿøáªíIÀñ³×–Ù¯\Ɔ£Pç'Ö¼´NèN ­h¬ËæQh+©›ß°_ëϺ/ŽæFùr!ÔÞr’9[lžw8+ë =É×ð‘i1Šz¾Œk»Õg×à>¹åeø[&–m®V«H°ÇßßqŸJknËQ׌‚,[‰’Æ0,Vœ—Ý›îVo ¾rظÌ2ãØÛ7´™hë//Ý9Ÿ¹_{»‹§Ã[_?ùÐÀ°±™ëãwŽ G¿‰QĹxhÄkÓÖžyP7¦ràlWS„PK§ò}é׆šáƒ’‡,ö>72ÜÛ{@+%óYî$Ö&’‹£Ø†cpt¹ã˜a –®”+~å }Î1sÇ.Í~%9ìàÙý×Z§rfÝd3Zï̼0W2†6é/Oð*YÙðžè·B<»Ê`{Ë¥²§ñHi$)ï_¨–èuF‹k²umŒŽhŠåì\8¾·7Ϩh ¶[¥hž½ÖÅB MzNÆy¯ß¡ë¼›tÏQ ‚qÅùšU:+ÃÅÜ‚vŒ×á¼g‡í:/ˆvŒÓÉÍ‘lõôíd²—™+MœàAñ¢½åÝãU-DFÙåJ6y¦¼fÙ~Œ:iÍűK€4¡mˆÂ£k_¶RŽUeårnŸ8*ãüžŽ8§4OÛ!^±Œóý)—Žï×8q6>Å)í [Æ ¡;Bý*¨Y1¥ãfaXž30|!»fk?ÌdèØ ëżC¶ÛÏúã¦Þ§vów¯b«`&­Z®jiœÀß±mW.ò ë4?Äøð•Þ»Á³.N0ï™iQìä!1©þå÷ZõP•b’Mÿîh”Dß‘sóVÏ*‰ä(Õ!y¤é4RšßÑy›Ž2ø^®¹†¢…ñ­ÀgÂïû_žþØYl/: ®¶Íç­±ëìÑ-ìuûág(¦§¶§¹ÊPƧL·Ë2I‹[Õ‡±¢äÀm¥¸—ý±µà†Á=¤Åª€xyHõ ƒ{„K×yϰ´{âö]šýß[ Š%aPz¦ç‚ÜL©óú£Ò:w |÷1cdyZîq|ÓYüöY£®1xôlÈöJ6ñ§¢Zš%êv„ÿâ¯U¿Êº|ûüï?(ÿó¯ü¯?¥|ûûÿ?(ÿó¯üŸ?¥|«ÿÿ üÏ¿øÿSÊ·üÿåþ•ÿé§”oíÿ?(ÿó/þÿ”ò-ÿÿAùŸÅü”ò­ýÿ¯æ–EIË€õ’¿â?bùžÿ_žÿõwöö÷ñ³µuôñòòñþŸ„ý«çÿ?ÅÿlòE|þWJZòWþ¿ŸR¤åìå$œ]\ì¥$e䥜eä%ååäd¤eå¥ÿÛøý*ÿ»åßÒÿ¿ ô/ô_RRNê[û/%…’ý¥ÿ?£üQü½¸“¤Ä$áS¬1E˜¤¼€’‘‘’”ý*Èþë|rNo‡ÿÒK^A%) ¤dDP(Ôç^Îà˜Ò¿ós/9Y PDyb¶0”ÄW‘J.¿K²÷¹ %"#«ÈcŠ~ØLÌå«>Ä (ß9ÉH¡DP²ò€¬œ´Já7%72¤ÿž.Ä&¬ç—0& 4²(@–˜yLá7t6^±ù€½·w ·£1qÈ—™¢dD¤%e ð/Jês×™÷“‘‘’•I$/"¥ õ‰¾žn°}€#Öé«É‚)"-Kü« ý¹Ÿ„¸“ó7Y˽ܾb‡ìååQ_3ÑQÜ ü÷ëݾê#ƒ’‘•’ˆ‰ßdQ²¿‚»þåß±ÿ7ìÇö_ZNR õ•ý—ذÿÄü¿ìÿÿ~ù}üœ!i؈ÿJˆ·W‡|‰ÿÒÑÑY‡@.^¼øãø¯­ç< ߯Ïñ_úþ£ÚããþoÊK×Î>‘Írס¸5L–<x}ÿ-ŠÚ[}®Þ}q½VÑôbRQP’YõÃ-¼Ry$©Z‡—ö3,Á$ /YqáΪQµš|P'ØíYáÕõôõÉÆ5Áfa Â$CÂháü·/.ߥ¸è6qå7}¡âÄtL¼!ÿ¨oºæÎÎAÁk^¸û~oQ3²ž#AÄHÝ!iÈTûPt3xœº{ý$ÒœõQy(N–Û g×ñPC‚ ‚±Z7í?©§Á쎾6ç C7y`½ù¼© 0ƒÖì‰Ê$(º¬§ Qï4 —ÓuÛSïø÷ᄞ^µ)±/$¥ÝT‚(¸Ä4Oü/B?qX– Mç!…@+Îø C¦ÚÏÜ=)ˆ“}׊Y®wŒ Hy&‚5çÌ)™Ù3¥g«·KÇ6'%7 oÓÁ·º¾Éö ”ÕΔŸ!(sά`apÉ»ÕÉuÊ·iaÓ{\^äCùÛðeÁ݈«ñkíÑlœ!b^a5ñOé pØUFQ1/òªàím°À¸Ô¼Àâöò,1áÚy<áÝN{d`(Y)[øví”§‹I '|îMgã4kCŠ$™v¾ß~á~°™d:ùè îY\kåË"Kî<ɪÒI%E¶m£æN¢ÍhT\*£Iëª=$i·ÚßN‚Ãa›ä›Ú @¼NKŠ¡ò¢$1rLBœìä£ÕÈÑË ŽØ{¦åª ›‘Ipd¢d¯Ê ŠÖéæµg’%,7¬@.Š\S–<âµÃo³JSå‰nõ‹¶Skë”DJ Ï“è¦'\´7îjriÃÞ:{ÃüêÝ€eI„`Ø^£í"´riD·ÎÅ5í,ï¥{A/Ö;vY(x›–ÞÞN¡Aä!³%K®h6aÎŽaî#Cn› ȗׇ¢‡-½(óP¤ÌÓ…žÌÑÄ[e2É B"çÌiöZ.4Ò<¦vN*W¾Íò`~¨¥2g†Ï\:Þ·p4œ‘ÂX邞8r—‘ =lÒKiÉóË<- ·Â45k®¶õ×B`‡P¦]ópÝ÷{«[42_ÿ89V‹^â¶eLÝ*tÚÂÃ…RÝ%@ 0Sñ“È#S¤„tk4=™µÉ_¾ÚSVå †–@´’u¸&‘ØÐhÀ’ -ƒcœ`ÐÂkŒDPüº¤ Ñh©è)²X»žÄHOóQ|]‘qÇŸrK~æEŽ »$Ü©DzM¯²#^ìû£@0]p÷ßS¤øtjP)ͳKE!MOUÀ}Ò§]oUOXŠô< ¨ÔP¨:8:’CÙÅ éªQQ–@Ï?Óñ’lÿÈÌìÀK ëäêôêãÕ<õ¯'ó?\³µÜ”0‡4`}w*ÍSÎõd?h8]¿òj¡ÔuÈÛûá‘þåsW&¯dK«'IU ˜üeé=çBÓš''eÊÅ÷Nö]Ú•tÁ0–c¨>t†ðùC“03~©q&a\Î6aècYœabɳaÍ:“+yÆçÁÌ#J‚æQ¡¶³Ô±v ™{Ë9TêÖz„ÙŠ"‹ŽÛ šæ¾ _¥8”Qú)W~—†©/‹l}Ì`*yÆL¡ÁZì@Õ½Î÷žZ~ñNÝÞ¹yHÓrs e•°÷oà‡²W/M¹c~øÖRÂ~·Ï±¿ÕóòQÎ¥ï#=ò@œâ-ÛÒ\—0;û®uéìø#Ñd¡J­ ªC³îÒBàŽ¼qè²»º˜5¿@´pû³§q9»†×FèDÖÕs¨_3ÀÐÍø-Hà£<1hÔÃb jßäðÛ¹ýÔP7vÏ"†¼8oäå¹1$P/Ú”‹É)rH³Àa™¼(üZüí`í~rLp#'Kv¬y¿3%4jú†£ê‘»Ÿ!W»$Zqªº ±Îkµ.Tü©O| òR±yËUžÃÍmeco8Sn´H¨÷¬ÆTÌ2t©ãS”àÝä…2WeრÎÀwåÆD<µQO„Š5P*ú>ùîÝ‚ý`ˆ3 ~EPhãîåî×3å] V:Ìaì™r_Ez¥™JOÝV‡œ§lEè/z´»Àiï¹xw; ãƒÙ»)ì7âÊ pû9u%ù¹Çbø=%==z:ÛÒÈ4Ø]̶¯åMR$áx†ä\úmO!É âÒ‹6ò˜¦.uÞsb|ŽB*Y C1qÏljL>вý@2FNÃx™¥5  —„‹5³n“C¤‹°Àô«#sP¾÷f„ïÒ qMï„N¶Š îE¬°ÂÆ…OÃàqyrî,-Èk·¼})Oc Y–åàËÙõdÑÃ:6z:‹ÁiL_Àg_è8dcž…ü o8Y½ã”ž ²Lçæ¢âü 5Næ ªù ®Éö hO›"ò8N°ž4=‰ü ßÃï×*&ªƒ¨3§XÉ`Ç¡Å/Ý»È;³)Õ:ùá ïÌÔ 2 ³ˆº9è•åZD5LYñøqËG·~Å=eµ—‡AáŠå屇¨šsæ°J×—sî 0L–ÊÆ׸}(¸È ³CábôçÆÙ{âA%r¢îÝUÔ³¥›nËmPDÞöèÉSƈ€AW¡ˆt £ì½€ç€‘ˆB<¼x;Ü"sLÖTCË”oãxõÄÚwrô%•UßÙc‹IÛaŸ:¡ àœ˜Ž ³ßmøVb¹æÉûÈ0¿˜®³‰¨•× Ó¬ä@¼~`}ÙLÔ´4B=ðüÞ£ìj~š‘£#Ü–ó èÎFåÛ䄃ƒw8à«õK~‹{†W½®®­>z¼é¯B‹V @0NîæÂOå”.2÷¢ ½Î”vmKŽö\F‹`,ÓÉûÑÀ©Ô†èœôEæ Æh\/E£|r¾/ y£h ;†8šÍ±HÏùhŸlEnƦ?i·…08†C¦Ön^…»Ày´Õ)^Ž¢PX¾P0}„&=-­Ó7]zï8)¡;u¾»ÓŒY¹Âʦ ¯?CŠ6¢Ç¡ DlX-QsFp›Ü‚î4£B^Ë‚Ï-òñ‚•À }Ô<ÍaRöÖjk¼ÞE(§ o rT÷õžùDçDÚœºlõÄWŸ¹ÓZQ†›¯œÐ¡·E©ÜEM§&Ÿ ¾Mhr¢·îè‚!ø Ћœ§ày)0-0L/=NnÅ«ËDÀœ@w­ž¯n_ hŠÛფÎêF\ÿ°m+&´¹ðV Aà<æ°i]¿â3iF5}ô%Ê‚=Æ5Æwöœ÷ÍÎ!Òƒ{kT§ás¦žEÑ‘Ãr4Ç£}c¬WÞ^ ¶a$œhuÓ:úT¥iWuã¶ùÏ+;ÂàJZ¤˜õ@¯<½Œ^*õÊl§Fg­î~þaÀ®9ŒÞ³æ³Ïظ¹ ÷3°"gƒ‹Äó“ qÊ;ñnÁ/ Y¾ýN‡f‰2\,° D -²à0$–Žž<2d›;lHŠÔõä4 Èۣ䞻ÛÑâÔXè ¸~UP÷¹EG³“¤UÂ5R¸à÷]aå oæÂ5=ÕÈšŸ§“Q¨{e<ã;,x5e ,*z¬'h PdRƒ¾*Kc‚_¸ÕpV]v±ùá,¼…ZVÕ÷)þÑi48†=çŒ{â³ ¶×±n˜á`E&4`„ášjh£›Æ œBE¥½êB’ˆ|Žô£\£‰¹×J‡‘!—JHà´¤qM'H0“ÛC‡ï@ð|ål6<ÉðD ‚ÆZã‹<¾=Tbœ©ŠÎéD) îz·¥ó•ZB`±ÆÑè•áÉŒ%2äþ17ã4/ÔyãƒpèÓÖRH콆ƒá¦ÆÈS×v’¢«ÝïîƒàÕÝÐvá†oÒRÇ·O#S»ŽŠI­^Ù!4“Þ}w‚sbü¸Ž%^´0—Ó¸—‚T3¬¢‘g—â(&I Á 5‡p2)Þ5Ð…¢svI˜#´©jÙOÓ­<¨wžÃLJípè\&N¦ésþÙ0ðëP&=ܰ3íA…À¯¯Äo…Í{+‚«Æ»t£ø¦)º{AÖ‚dcmkqtw3ϳ‡ÎPxO«ºªú¥‹»Üš4!x~…¬˜!ÂÃÅa_dŒ@f½F+çkù\ã¹]H3zV7V‘–acò|¯tl4c_e$ùFúýÓs×\AårK.[fS60Sin¾ÃºRvãÝÒ_ÄÈ•õ°Œ©Iz´]€u¯,Nƒ ([ô`æTJ ¤µ;I‘ÛÙ!Í‚ëPoÃY¶·™aåÄ_3µ?ÔÙêL†±m*“š‰LÏÚ…»~_‹1&yÏi·ˆbG´Ô=š&Ç?5›eGúE-#€”»å®pEX‡Ýò…4wÞ\™'äÜ2>y_å<Þ HtX.f’H!\:ª;vøà-'–W±Ô³‚7äøˆpF*¿iȪªVî¸AKÈ›i ¶/ŠÓTù‹1¸TòU/ DKÀMõá±ýÐ;µý³Ô­Ö]ü£Å|ø0åTu½æÃs+¾£èÉʤÛÕ±•ª³ #­/W:²Öå*Eo³ÖÔƒàm\Bm59åU2Öß½y:ý葇1ôše©Ë™3ïÞÄ#àuÖç?ÎÖÊMƒ‹º·+³cgzú=è:øbùœã¶íû*¯.¾ Ãc$_¼Êä$®ÊÄ;çÏzu0¶uoß³_<¼ïeû­pmVøÑÍ*öa¶ëüÅÖƒ<`otN:¼aÕ.Ë®[«þ¶Ãb ûHÖ*2œl¿I©!ÁݨÒ`•Â=¾‰42¤¸ü!òÞ^ìü‡ÏÓ[IÅhž •×ÙŸpT¹‹@-£Ây£!C{qèËÆO'ñ&Á˜ñ_k´:¶C|zùC£_ë~~[‘T'9`Qã}è™ %šÀòÿåhYøÑ´ ò7O?ÚÝ­ˆž`{~ƒÀœFÂsùÈ']²CØteóž~P{ŠÁA7`&Ô²•óq¸¡&Êé8=ºéŽm,ä­FY‰%Å£ã†V:Óô`+ËBŸcŽTÇcO=h|ž³xB`✱d’¶ÓaÇÍ3á ªbáÕ.Ι‡ŠNóOÞî#¼çÝ¿þyäáOqß­§ çMøäx·£ô°ª¶ÃŠÍ7Ý!KŽ=ñêvÁ,,Á!x)Ä =Ù…7¯Íï°ë™#ä¤^^VÈ>nJzV$´âˆ$3B=pûm`¦Kêqi楃ݚHl}Õ¶ÌlƒZˆom¾ :G/ßÓb×H6Ìw]ñtµ ‚o½r <õªu¢(}¦ãß“¿N*>)#í¯!H†TíÉ_¨Ëñâ>hï,äÁ EН¿JU;ìU¯ŒáBÆÔì¹`G••æ*ëû^ºüô+Þ†hc¹ _‘ ¿ËÀ©p9`: ´ÍYm»*3ÍíÝv=!—Òl±§@3š,sœ¦'}Xzý0v.@ ¹ çŽxRóî­½wÎ3`báÒ6%ýýEzä;¡ZäÂÁ¢sü(œï5ºÓÕ¬õÚ¼vçn:'jülý.·ëa8ô97Xã+·óÑèÝódãTø}óc h»Á¡DYÅ#•H´ç]QtŽáXô3}üÁÁÀÆžûŒ°è¾²Üc;ò±ûúo}¬@ÿÀŠXX¼“ÉüáÐ[”`ó*Cc¸Ì±‰Þ{Q£Qé¬(üÉÕ7ÖA4PøNôp¡h7b=Õ ‡Ý:‘š©ÑYjœÂ ÿXû¢Æy‚†z»_Ž€û­•è’5»\Pð}Hù6ˆññBñ¡¦ÕeõB^ù>6ÝðQ”·/r¡æ&¤9K¹Nšc/xãr¡”ù%%~….<‘@Ú•Xyÿ¨§ÿUUAË"ãŽÃ­gvܱ|´È¨æÈ(Â_wRæ}ÐüèÛð¸äéÖ³cä,$ÛÐv—WÏÕí´iK6D€Š+ØgmîõDß6Ÿ=Éñ­¬¯¹„D•Â\û àà¾N­>|>2Î]N>êšXg\Í ¸ò2£„ªVwä!‘Ge'·ï`y#ê½çÞ*YÇË+Kï/=9Œ–ZW.؆Üû⪢X*”:®ÉâR4Š¿(éDG0Kkl{ÝúÈv݇Íf}̓†°¼îŸÁrö2«tfôaótÃo_a’¤”C9Qó`x̃͞¤™!wÉÖ|Sá—”,¨ºDÞLuYc¦rÍÉÛWÕ ˜ð? .iÛŽË"M ‹â6ìmϽf ÑvæuÞ€@¼Hè#)Þ~©“Ü™F•;½Ijœ½A 7“‰jP8®¨êÅÞ‹T~±~3ã»H©U¸u9ú‘ÚzÖµfN#œûnY@0ÜGïf±.–2ÃàWÃï C#1M“ÏŽ« ’O¶ ï¼­é…0|° ŠF-¦>³$ Ê´ž&—‘!ïް²ÆÀª¡N h$'¼aÏmIx„0):gÃ[”c†AkzÓüÓÈ!ø¡‡œþ8§02ã` /ú„g°]ã+åoàŒ>¨·{9 ðHaøý‡ªžZ”ȉãoÑÃ' éíÙs‹—蜶âý ÙëyÉçp»ƒ^ ÃÒ݆S ËBT,ã{Å›FJ.؆‚›EU¦áÝ‹óÖÁtz“³©ÚwÙ`.·Öˤ ØÔÀ4î "å•·ñ«J\:ó@5 Ç)`ÕøØìÔ›Òí®ÙõB¤û4ìöyÁ…‡¯¼Ö)Ý…ÉGžºdÒµ{V¾I`R²ïÉ•¶=÷‘w¯ 8ÖO>¶s|ÂmP,MÈ1¸g·²ï†Ýi^ úAw^ÞL\ÒœŠÂK¤_ 6o+˜sð±S¤!Ìg»×DãŒr”Ÿ¯Xë1šÛ·àsÙE oÜ‹^”Vô‰iÚk&i+Ëw_×~¬—!¾1ôè4Åè½½ôÃ9'üi)úq–ËÈÛâP sGú©m€ÐÓÌGŒR ¬ÕU “Nná…@±³0c$.oŸ~ÎÆcÏ0ê9Ïüð三¿æW'º‰ÚÅèÁ“³ÓµÔ .b øAý,ìþbÔšßÅ(¯XzÞ´ä2Žg\DÇlâ¨XELÓù]à ;“n:_à êzùEDÝÂÚý0L'3 †#áºW^ ¥!C<èa`'`n(©ˆ­Pø&“hžöë™ÜG’]ž ½OÎ+xŒè!¬D„ÍJ/Y5°×‰j5·iaû܆«£ ?~ÈšZ_ XE­?E€7€Î—#ê!RÙi+4#?.6¢z³ú!O™2)ø8kòHÖÍÁ.­8¤Þ øÇqñ/Î>!¹/w†5 4jv¾g?^eÈŽ\>X\Ü4ÎNÝ´YÎ7ßiËFÇãk¶ªÔ Ä‹¼—ì³ó@'Û~'ÊæÈkCtFˆTß[ÛÒ½©ï@KýÖ×&öìX ™ý0×ñjÑu¨ƒ·Áǽ¼+…”‚Ív]üì!õ™¹‹&Tÿ€mØ‡ŽŸÛI#7¤]/"ý :>ñü]¶½œüþ7K. «¯àìfµQk†«|³&Gê•ŰÕC™÷ŠWÓÛÇÌÙÕFUÆé Ð%Ñ·9)ñÝ$÷{®¸>0(c=KJcL.e_`',ìæS¥S·µJàQkÕ÷h‘÷®;BÅù8;m»K'šÿŒäþèä¡y… èhÑfÁ¸V+Xù­-ù'y-L•l¹È Wà ‚J…ä’$ñÑè)è8ñ,èÙp§"ôÉÔkø¸ÿéiV>Ùøó^-êÝ›1[~ù;¬7¤çC"tššÂµVoßáøñ3oÏz°ß’(ï*'¥P¶Yá:Óz•†!TݱæE\=åÁ•Z+9Ðf{•ÝÕ#Œ*´£Fn #ñ|ûVcº²¶§LˆµeéoÞMAôå*Ì©¼œ7TÐË}­àæxw¼!m¶j; ¶ß–Q7÷y°&ê€F¹‘Ò¼y2 Á@ºÇÇÎKÂU™–JXoE£í^{з[.©…5’#c¸d”¶ SJÇú•NÍ7`âÄ §–ŒɶŽB®kå&D Úиô˜AÏÞ=ëc/"YXTϸŒô¿°]_Úý\¤Ò®§*•Ò!6fXÏÊâ…÷á ±¢þx¯à€¨+är  î;MÉ)nD~ ›]?’)¢z³TÝØV¥«…Dð½+†…Ý7à3z©Ö7Õ;±¯ˆaàáx’äÕÔý{ú˜ܯìµn:µµJSvЛ¥=7ÂöÃ|ñf[tÈvBpW‹ªn±&¤RÀå'_ígº‡>¿;c7 “iV YÓvº?OIÝ_Spþ¸•3TJ_BÛÖ--ÜÓÉåùaWà 9‘Zï+¸o½êöÕ‡þâüN…s–~¸œgï˜Î¨ö¾‚ážÚvï‘ÏtÙ õbÏ`%œ‡¢3ßïÙÐ3óy ƒ¤Í_Õ,$ÁÝ´urCEŽÌp6¹é§`z†‘tæJK½”R»S8ÅmX²ræ¤bÖé$›ÓìŠp^v=uZ:WÿÓN܆ùïe2˜ чìv¥qE·ÃÇBr¦dÆþ¾ ©•6 ‡4Hì¢,z/¡ä}|“­÷W”!kµå. ‘‘zîq=æ'wèñ–]V¹tF0Xqp+3á ˆÑ3xžKfìzE}Með2ŽÛöÈŠçM§¶¨ÑåG•¨x$ám7Á\~üŒ}mÀ¨†Ý½˜h>Úçê[:DÂßjé ðIpó1ïã˜ù72í{šÉ—ély×·érf¦Ó#ÖîD”ûô¸ìA<Æ¡ïÃQbØì¼nXP G9S2ª ¤ rd¯•ŒN|@ÑÀB)ª­ZöEÍ’S6S®súÄ:A<àð]˲2¥´lbð7KGËT:OÆ&äšÌ aÔ‘•Ö„€•è{–;°ã“ªÉÎ#}wwÔ‹}° f5E¾ÙMÈ£=OÒL²: ØíضHãÎPò8¢ÞsÕ¬™Ž^w#‹´xÈ;ù4ž£ý¡ˆ%'7B>}ø•zNÅœïì« —ƒ>>YXqEKV.óG ™K¤æ¾É·…1sXMlhû^~ùðð`©s{÷’Üv'†uIáÏNùGÃ$Í©b˜È•×K¯Á]—Ú³K>¶¼aqŠ[,Ú:(? Ýi9XUS±dû ·ÄÀ÷ƒ{}Kúº)}n¾m¶çÉ`W ¼Û0M{²ÌjáKñ‹Ý'ùëŒaµd§t8¤«C`Ò·ÎÜñ¢#¼¾Á8¡p @ܱ9±ûÑÀhÏÎ2 Â1áS9?0®ìK넉,r;¢¹3ÁÞzóòò5Zäõí}‡³EÓw¼Þز¥hྭîú6µáÐ3(#$v§l­ãm*Á¼,ôäà^» 3?PzÅogó=ФQöŠÓ¿²“Ö‹‚)ŒQLDÚ˜ ¦Bw#ç'aB²÷êñ9EÛ‘{ù-Ò½b;XÕíü¶sp—˺7úTÓl`u›ýé}…ݸsGj/ÆSpBjÃu¬3íŽ=l¦-|t$inÀ"ïîw@–é´ŽÔF25V²À@IÐDÛ O£?Ê6tÓƒZ=*‚ tJrÁ—¢;>P€a$F€{9)Ĺے€¯iûZ?ÛžÎK–Œåo¬Û[Ï} Ò¼æsx¡G2íäAú†:_6H!#}ωM#¡À4¿±`ßÃ=çx<ñd ­ˆ¬Tg°"ï@÷Ä;³ '4. ØÌ¾„çÞ·C/UPc"\ÃP44ô3)éž^ù$˜e=Q}ѬõÁ2)j¯‹«§iàÞsñí'†ž˜Dtb†‹Ô\åv_I¬?l§ÿŒw~ »\ÉÑP(ÝOHðqÑ–…!ØN>óÞåÀ@§W;dŒoòšVµ*vb }×™,ß¹=º)p°ÌìHÞ´ ‹8>”ñºR«Bi™žÎç|7’FuñY@b«)ë,ð83óèÅíÕ4t[žrÄ<¡Zpç$;Ôô uŸA¡à Á˜ ˆCçø)–?GŠ[R0H©PRãKõù«¬Û TªNšÆ3W>´·v7D즄Ýg–¤¢L °ƒà-çšéÇûôÊãš<âzÅS·g XwUK30ÀJó¯ŸåHw‹r"”­^R(ÊS:ɰáÐù;ý÷ÒÄÂ^éŠf¬ÄY÷äêø¡n|S˜J„+% v -EˆQWý˜Ÿ-$‰WÿêZA7ßvTXïZÉgøˆöÄy´3™¡:òÃôUÁ§£Gtooc~°ß#> µzн7³ž¬­Ç/y2ù ˆ~üœÂ}è4…»¨ˆ»Îgç)|C}”Ñ¡ôꤺ§ds%ÐÉÎH¨oU›ÂJ^œQéá…câ?Zô‹ne±J¡‚k¿{l 楎*k]~z»TÌCGŒSâ¬Y¿ÇšQ²ò¸ „Çž"‘ÿa> sêá’æÃý¢í×O¿.êØUvNqðÞe2ÄÂÊK)"ã<ç.*ÌQbJ_½ƒà¥ö^Ü>éï„·÷A.XÛsÒ#`¼JÇÎø¼ŠóÄ<ÍûØ´¼?ÍDèXU\¿6\ßýøPÎ"+¸7wG¤Ú`‹DoM(¬5-Kîž—f[Ň*­§ÇÙ5) F#_›MiJ•$©ç¼WÎò9Ò8¼µnG´’íº±§eIð%uCKwrÀðbq z,ÖÅÄ+TyÿðѶYØlË•³Õõ%1vØuRtŽÁÞ¹ÈËqèç±ùO*Ö>PFù"߈à#q¥ÕidpüÇ„ ÚF9äíúNS«NqþóeÄÿÁ*¼…‚á=5¬üµÕÓz5j¸Ÿ8*¤]a©iy5áéVýI\p½#”P¾úD×Ýô‘¦_”ö‹gï2&¡ôph>fÅ‚ÔkÅ%t‰·¯J÷±Ý—p— bÎþÝ‹ÞÎö„åö/=WhÌ*ΓR*=, Ñõ\àöF´P‰q ²ªK¨«œòj¼« Á‹Tw¸¨\öäšÜ^?‡(žV1¿©R|ElŽ?Ì\´Ù©¢ÝñÂQ§½»`·Û#h  1Ø_"µeò”ÌxÓ LàÍëàÀÎû4:´Þ ÇqJêBaáAÏ$ÍÍ@IÁ³CA8tf%¦S[³ „ Uß!eѺµ*cˆDÔœhV¦”¦ÄüRmR2ð/"®ëAð±L<¨ÂuOaÄs†)xÞFO’ʼnð-„àßB@ WÓƒÀúE€”0übÅVÀ0!ºi”ùC ¾+ß$G bÄË®×Ò¯QÝN‚èf¬lç3˜Ð9t[1ñ‰³§Ѐ)Tn¼™Ÿ”£˜4¢½¶ŽsæcÈÇsÀ°˜ÿȲ¶z7¢÷5z8f{a~0º7¶I<1«„0ôØJиă³è¿wÑ »Ð´Ûái›2‰ ‚¦´ûd©—@g‘¯‡èRØ–wL²sŠ´eÉrᬔÇ>u„2+ÉՙݯFɨŒ]µg<©àj .·JÞÕBà,w„­´À½ä^N Ðq)À’š“I>^PBLâ¤ðþc²Fl”WÎA³Æêì$UzÛd(cû%"òÃlQ0DÍœò¶q5ç\ ¥á±Àb´¿®Žµ6?õ¶4Ö.Ø ;L ¢1$7½º˜ eœ]Ÿ‹‡ÀǸ~4¡šk‚kйÀ }Ä(»·ßæAâ!;£å¾WÐfÓýË+ÀDy¸Í«ðË×ù˜o¼†Ÿ™ÚAX-­ñ4{ª¡(!z´v»é:ùX·n+|±XLã· ?*>´‚¿þ´y2_Ü7sؽ^õ=7ÚŽ{Ö/%Ýå"ÏÌIP£vON0Ö÷ç8PÇB(ã–"þ¦Õðô¡Ú½ìˆ¬ÕËMÄß1,G¸œmòÉ·lYa·"˜csšnâ%á&Ï÷^€0åo pÐ?Xs¿uÍÀPÃð¬ Blz/r†‘y›6û±þõZßÀÒ~…'!Õ4‘jÏêOEݲ$ß‚kr9É9±ëʵë3g^+ÁãŽÞ\PoM’¤"mF™Ú^0­ãíÜMÝœsXæ9hýXº®ó2åPT¥w> ÜA ‚¯¥(ÂÊó#n¥Z¤+‘-αHay8ÍÛN›{ 3ºfÎÔísAƒ Þ.ÆÄÁŒ$õÕôðeá´'v“½?G†¸Ñ‚ŒÞjýp'©06¶É¾%¯–YÎIN‡D¨§‘‹ s·ôí¥:JŠX¹ã\Ñr Šg@b ßn{ìAÓäl4¤ƒCm?~0þ|f¾`> ˆÜ`Èâvb¢}F¨úp£2¢‚¢›‚ŸØ3ųŽ/Oî{gáØ˜ß$H’°Œ@"d¨_3!£;FW—™?ž»˜¤Ñ ¯‚M&ø¼ÇœÁ‹·.\wòzg€hä^»Ð®|–>Éþj$™vÐ/—sæxC{ZÏ;­ã©ËâS2ê4¸;9Î8ôñ¹©¶ø=Ãr­ ±€Pz{ËsRd¼iÕIiúAn#oìtY7/,î‚^/2µcÇE5;ï‘ r¼IºkˆQKÌS$­'¨#hÂs)8U™v±`©¹ @ò/`鈅ˮ°íbÍã÷S¯åϸ:å¦ 8s;ùâðîBÙžÕ2sÞ–«1A/©HøHp鋽.þ‚ð‹:óY˫ַÿ6Ÿµã·W¸¶$ ¥ âdjLPmi*,Æ}:† V©b%–¾çA–ŠRós×(aE¤gQG¯…Ê3ø…´•‹FÌSéìð9SfRø<ýå†HùìQ_ü‘è*ÞY«¸œ7WFêbâ–I @¯µ=ü7h Ì&†lK§oWµ/« f\v#gJöxRH~¥>utÌuêé˜R@4ömv%ͤé™êyvxÄü±ùœÑ7iþ0dÌ)ÖKø7öF•Ä–Wí•Ñ€ña:¤D?‹)-苎é±ñû_y«ùúÄžÖÝå¸âÔªw¤¢[ò`P™oùzZ¯®ôxXû‚)„PâÀaÚmÁK˜E;yQ‰9oÏ '¢„î|»{„¸+zÊÝJÿB‚Тn“´˜ä÷UXº¡Û¶¿‚Y=g§Ü17, #…o*"˜#G·kòè`Ù>%êŠÖàýŒÞË&hÊD“ûÛ`‡@—„‚ß Äï€EïUx˜Q>ËKz8C{¡E;¯¬¾Ú1)¹µQçº+Þ†‡>É—¶Î/ƧÀàœÊ=ú‹ Œqî`cóyQ&ÃÙ°yø®=þÔ½Ý0ÄSR\èˆÿ±²[ôqÑ8y‰EáHËøÓâ6&$ˆ”Tø!wÌѱ@g^Íß—qœ-OXÎ8XÊ93„í÷|³BU·_ôªa²î)ÕŠƒb,@J5i2ü¶h™‡ùáäÅv2Ïk$öÒ¡ô; õˆ­üºÞ¨1"qe·;}È=ùIºýKA|®T­í ked[ÒÉÎkËIÙqþqåE›EYq„âNJÆ=ÈÛí-ꑉ=YX(!“çòõ:tg Eì òf~ýãå³» uG¯?Ùq¯òV®ÂIš~Ë4A?/ ÞaÿNŠ)×Yfïr’ ¡Øðà›ù%™ûïq>>×$ ¥²h/O™¾ô¸×èÒ%ø~¢þZâ;ÂGŽº´ˆ‰]"ûŸTÓžî;lHÛ‚WÆäžöÌŽ¥"«Jh\\h‚¸-hGµ+A£™WЉe6u@òÞyòf¡Ôè€ÄöˆPh5ÛTå0%fˆ••6ä¥Ùÿ1°òªËë²ÕżŠÞ[rjƒ)#9A8iJX¯/zúÎÒ-R1šdaD‰Ø©A½s¯Ãl¥£ÑÇ_ÀO+5†~˜¹uD(ÊàèàŽÌËòäòA@ŽÂêÌ5~xlÏtWÜÒ3(B„W ^Måìrf·µëÓûÕpÂh²þîSO|þk¥ýääÎÚS¤ˆÇ²ŽãrfYB)Ô¾·Šz^­Ÿ7 1£'<Þá…é¶ ëéqX³˜v­Þ丫9Õ™½YqÁG R-ê´r½ -zv]ŸçB4ï^™ÿÿ屬’‚’7ó.ej,^ݹ¤Hß§UÁlf6ƒó /ç"ágàÅf]M2Œ UÙ²æÙ;ÁÖ“ÚFâ’¼ÕÞ¶&ÇáñN¦¼Eûî68†òNý%Ò¥ ¸ß«*ãdí~L“¸1ñl·¥]Ƶ€§OÁ %%¦ðÊûKVù7.<d@wšå´A¥„&­¦^Ñu{ùl&„ ðK/‡¸û^¼¯òŠzSðu(<Œ¿(„©n¿ªSqóö[/(|ÿýxÜ;‹¼Ôèyw Á²éÚÖœrpÃB0:Éã9‚C5±6W„TÙ9àÞ_õ8¥C LÜÝw‰tou"Çv[Ï?¥$D†P¤„ãÇÚ0â{úðwIp9Âg $á…3Åéh`JGGËšƒŸ?’HÜ%¨‘ãC®{”-3ˆÅEh⮤F”p²-Qu@"riB[ŽÌŒ€\(EPîiª†’ã4ì<â¢L ÈSš»±Ïé›#–ƒ‹:¯ÐvçØl¼+1vÁ‹MþT¸Ê°C~D–¦Ü ÉèÒ\¦c‡š¬‡NÃ@ËóDÞ·Jˆ¤H{²êÏ‹¨ÞðÔQØö›‰ ³¸"áàÅî½¼¾–ToŒgSÈøq9¼únÃט†÷´žãš’ ‚á+P3ðŒù°J4Ômø"Ö¸ÇÓvò%ûÂé²’G”ÚZäaa*ßõ«²„eQ\Îãp:îœ&\Sf~‹sþ*7. øò¹ _jÚ™)mÎ-– N˜º¼5Òr‚8[hÅbü¼swÑ (Ì5£Š ƒ{mg•ð ù¦ŽÍ°”\36-€Ð®çRj1%·26Ý‚ÈzÙ—Ýó2gwéZ7`·wb…‡Q5ÿpZˆ¿~ !¼ ÒÄCŒÏ’ǯŒÞ<Ô?_Êðø9è.µH›g©Ÿž“0€ý©dö“Ñ¢wîǨ—©(<¹ïjëà 7y³µ]މ°¨ã_£c– ÝTèÌîŒë¼Ó¹ÃQ4b';$€5õ”€Ïׄ $žˆå·ø‚fÎrÑ,¾Æåp²ÏE䥨õ@Rès„º àìRó{/Ç iR÷–œï¾éà Ÿ(ÀãöÖšûY>ÄáN’ÍJâžtôQŒa­ê°@HÈRЭÈD:Yø63ЧBüÛïÞtꮤ‰¬wB?„òÁ¦s;?ˆ©ã-÷=pó¹õî줼¦ ?º›#òVé#;÷é3¬ƒ´3àÆ{oø5 }¢âÁ®. ’»:™O]…â"UÆ£cí3¤“Er"ÌXô¥²ehÞrÁàIábîs Á©taȘê¨]KÑ9R$‘ñÏC‡ŽÉ ¸äà @ް¾‚(õ¥±nÐ[´]+Kx?ß@¬§®CîmóTEnFTíÞaùÊ@[P_-™¤Ÿ¼ïÜ+®aVUù¹7½1€]Uí6´UsóXÄå‰ÝÑ3H6ÏA¹„A$<:GùC])}#ç &siV£*µ)­ˆóƒ'=¡Ñ5mI‚ F —3çdz´'%„EÓh&á9^˜”,¡Úfa“ËØXf±–Ð:-;ž=Í1®vÏöJçÜ‹ÊÆ6Ûé¢ÒƆæÆõçk#Ü1‹ÅZ[“G{¿¼•=4 >ÛhÍ©›+Õ˜ùØws}elhmõ`„~ËÑGOo}´øhH@àÊó¹”ÏK¨­\[+ù¸ôréãúhúP÷j“M]MNó뜨õ±!Uµõ–õvzf áHßÍž¹±â3=ÙGu«öª x¥ïiçg°Üo½£Ññhבé©ûÅÑ‘ÙÅC;Ù‚_äȵ¯¯„Pi]—Ѝ5: v×?^øØðáãdéƒ&Õ"oap•çk5ua\ä—ÅNö©f+ " £?¬»7Š®¥óÃwöR1޼›z½ðòìPcëMp Eo)šÞ8,±f¹ z^JzÒn·hóƒ}V§'­ìˆ"Åæ·j̽ydÅAŠ™„Ë'6šÂü 7Ÿ†}zoÞu¿¼/9áèDÈ’áê£JöÎöP1Gv-¦ŠFaáx v΋ý†ÄµA‹äe UñëÞ·] h#rEåÄ^mÁ4¸¦¢¤xèáñNƒÒ¢¡£½Èp§õøS¼e›Û×»Ã0´5O?t†èÎ)ªk4 F°«,ÆØŽò×#.ì‚$l'h¯hv_Ãëž‚Ð)Àë·ìÔlÕ<D¡JguÍKLlÛ6§ 3ð\I&[ÍpJ:tÿù–3}©"êNü$w#òEÌ… yµ5.¶¶/”¬”ìCéבæÌÕùšq^–:1HµÙ7-=\ÜC‰Ô™.ÓùÙ~ƒ¹Æ» tˆ.A\Ï Òò;[y$H»î4îVÎ-v2Ô] N~åao’Rû°‹ÌyfEÃ’ˆ‘ârôœ+¼e)¡ÐTòcà†ÆãF>‰^¤bq»Ñ·é0 RIA8X¡™ ÑÜ’b±xˆ©‘ Þ©›¸Û8…EžhACÒ`c­ÆLˆcdÃ(S’CO°t-¯ûÀÍ,¤1=Œ æä/b ZRÎ*Az@bcÁ¡åéèÀ¡€^"€YZ‚ÔH@nG™gh‡°#=ÇDÇ@: 2î‘› mš9q0Î:‚„.foGN€ÀTHm‹Ì䕈БÀ-)ŒÎ`I£sÒ¦Y|˜bÅ:\R  sfM F»=É^ÑQê× ié§ÕÙÓ\¤u/bC3*Ê@ÓŒ sŸSÄt[B ×ÈM6: S ‹U"B0”íå+³k^—=Óõ@Ô÷êUæ^Ûf Eþ¤ › ¸RøQ.,g óH †¤MÜ5¼²‰mŸ¿‡1RÇÉmßnh,w•té•{½¥rø‡Ñ›T«KoÎPž¾#LY]S~ÀF' ¯Èi(ºHºô¼Hˆ&Ë ³ë’}Ö^¤m§óÜ’œL<¥ýdûk×(a†§¡}Šî$ÒÆüÄw„a;-ÙÓ7"P´Ýn ´áøÜ˜Š-¿<qIð bF»Ì?ôvã´1£…ZH’€ît¼&¾A>&ÓÄ'TÝ‚lp•üLºs m@¦B  ss4îwxÄÝ,©ê"îµG;ô‚}v¢!=Ï„(hoz?1®{ÚÉš¨€Qº¸pº P€FhåP‰¢@jsq7Z€Ž”#¢hØ´ÐÜf‚#qê |QQÖç ž" èXÀúm(PD¸ }M ø"vŸÄY +à ø^8GZnCƒ’Vé€C»R>Ì%·­QîbÅCѤì!¸ˆ£é D TS °[ 0˜>‚”7gC(m!Þ€ÃxI!xÇ›0|ȼò<<ƒç9ášñ0Ñz±¦ýš| à{)H©¢ƒ‚­)`§«­OÞ¯>Ó¾¼d®±?{X|%¨Óôô67qdn|j aóS‹'‚¢øKö¸L}ù,¨ÓŽ4Ý­†:ýæ–Ïg|rÏ‘XÇ˧ Bp9`õM2ÌÛÕ‚µdÔ ×ö1­³Yžâ'O¼n?ë Eh ©"B.†Ü˜ÝéETtDJì† -Œ‘9mOIñ•ÅÛ{‘ÈGü¼(8ˆRªSÅv Ÿû>¬»ÑÖÙx8Ü¢Ž7e ÀTøóTK-É£vX#zØâ9 Áìt/˜á)2ÑôÒ O&Eâ6ù:~²q¥®ngÍ~MƒÃ%¨;.ÃÔ!ÛArSRBEô‡ÁƆˆåx"·EˆF†ä6ÃgfSÌþ¢ßMt7rš8ÁxL.'ĉÀHV# Ï™A‚Çæ9±ÊzóÿM®‚ò£‡ÁÞ„àÒ5Õ‘T'@a—zÏØ“uëjAñm«ÔàLŒÐ9ÂHÊw.8»ó#8ô¨pµá*pN<Ȱé-œ›~ üî]û\U: D@sÄàÔµÚÇ—^h ã.40‚7«Tßãk*Á£ŸÃ ±±U¼óMxsƒ¤³&~ý^²OdæVðEÆ$4O¬÷Ÿí®‡Ž%€ÖE[}g’Ø€xðÑáóðÈ]Z»[rgˆJL$«2àÙÄ"#éZòÞª¡ûã¬TРð+û\S²CtÎÛµüók>”+™ê3µ>’ðÇ=³ ýÙ½(Ç»²¡iHžŽÊJ˜8ÑÔäpÂÊ&µmˆûb;˜à ¿e´(¡Eкa‰«ðÒ¨µÕÒôŒ h;ýYuÜM+ØuÁ]XHð°e—Nò ¤YW‹úÈQ€œ5QÍ äHàÜ<Ù¥ª8/ zíWÌ@®Ó£!›j… Z‚ Šl×w_>ñÌ % MŒ%ÿ• úÿ¿òmþ?—Nþ?¹_ùß~Fù†ÿ ÿþƒ_ñÿg”où/ùà?j3ÿ£Ä/þÿŒò-ÿ¥þ9üÿ•ÿó§”où/ýÏá¿Ô/þÿŒò-ÿQÿþÿzÿÇO)ßò_æŸÃÿ_ïø)åþËØÿøÿiÿ÷KÿJùžÿ?Èú*êïèç輑Íóoñãü’RR›ùe¤%PÒ¨Oùåÿý)E™Ss†é>C-@×T_04S×Û©p‰Š‹ï•Ö×4Õܬ@‰IH¦~öÞþnn>ÞöžââZ\ª”ÊDiPUÆ:Û;©*{9ØØ€_QçnA*\>ÞÎÞ¢¦¡¾Î\€ãæ• W€sHÀ†Ô)9bíýüTÜü}DååeD%‰0Ü¡Elßœ‘ƒS(xÅ)* è8{;ûÙ8;¡€æ&8@R %†DEÁ6NnA€£§½¿¿ ×7o'ç.Ueûïî|ƒ1-ò†2q©êƒ_ù¼ü}• í]ÁiØ«áÀ{cÝ@lü±¡Ÿ@h›nÂÐý\õ—Ù{{ûçõ{@znþ 1ï²ÿ§þDFüÝîÞŽD©òÿ= úÎ^ âý%0®ž>öž¿ÇãïÀðéÿ‚±³'‘._³BYä4Qð%UÿD$Aá‘$òþùûkIµ¹Tu|€ðƒu@Óèê‹=‘4€ xÓÍ ’Zl¯ÎÅÏÞ•Ø9_?ç?¸kxÛ{"î¹aqÁ €¯å7uR_ê¤$e_{ïÏÐ@À¾~>ŽÎþ Ú\ªÜn. ñ\[[­½¶&;õmM´ LöÛjìÑ×ßc`«kk«,Nì®úÝR_úÑŸzÿp|7oç¿‚ô¤ÿ ßõF}éúžz2_êdþ-êý)β_ ËþÉFÌáèä p}ÑG'çoõà_$dçúNö‰Bo¯ÊõǸË}Á]î‡Tqövrsùcò_`ÈÿmžIâË',#îäb/¾QzžßÉÆü4>©öÆÔ7 nX“oñp öñsâRݸ>sâ?3æŸUo ¡ø'ˆø:xº9~Bø!&àÇåÏ0ùSˆ£Gê/‚*- „}WùE¤åþ Ίßõÿ"ÒòðãýUÚrÛKü˜¼?Ç\:;þ~c篖Ëßð¹jƒwB~Îþ€ ÒwUø2Q…ÿCùvš(‰ß¦‰’þ¸˜Øëúº;ù™~N~"ß\Ôw…’ü€Í©ƒk:7oWSÀÉ>Àþw°¾x&”Ô`iß¼`B\2™›/ð'^üÞ7ƒ’þ{ðì½ìý=~ï‹ãA¡þ<§ xßûâ«P2?§îãã ò¶wðtvúR_Ô%û l ó Ö÷BúbPrë»_ìjÃü¡E ró ´÷üKfð¯ë(-‘?T¦ßMï‹N£¾›ˆÌE‘ø~"ÄâÆ*N\pôsù €•X_·Mr.~>^€›¯×§ë?ô€2_EFòGŸ¨rMËÏÏT;!7„JøzÆ·¡AE¾=S€ÏÞËW Zµ?Æå‹¢ÉH}Oˆ/J##ý×a¬i l.BÀ}#Èñ?ô‹öÈ þ²¨üA#âV‘KÕçÿ°@3ß$5hì6­ñ¦éó Ðòð ýDU¿O&Uä+øYáä÷;7"óEÇed¾§ôÍ•‘ý¥]>Ó—h6ÿ˜º_TWFî¯R÷7 ûä°ŽsÀ7–þ+:~ç6h¶é~g47ê6lúï)úÅâÈüÎâ|M5_?7P96¶qJ´/AFá.’A>nNÿa‘ÅG3ÐË÷/¬ \ÀÂïaêù¸þÁ²¼»±"Øä8 øg+ioÿÏí;NÈ~1™²ßɶìk'+ D|ßó‹ý‘ýÞþÈ~±?²Òß×}1!²¨¿±k?(cý·ƒ @"†öNN :û'Q*\öžn®ÞŠ€Ÿ›+6@ ¬ö÷²÷ôTýrìäã èƒÿ0¾~¸”D)JË*‚nOJBRpµó›ó2À!tóÜ‚ò·ƒâÁœ¢¸xpp°ØçÓ0?WñCO\¢Tvórüý¿?6óõvåì=T¸>Ý!^èªpy¹99y‚âà2ÌÙO…ë[>ŒDؘxks²Dz|:TÛ8Týõ¨ÿjùöüßáŸóûϯßÿ~Jùžÿ_|ˆ§õ~>žÄ·¸¹ºØ{ÚÊcÁïÎÿÆK`üûÄç÷¿¢¤åäd$e¥ RÒÒ’¿~ÿùEVÆÑÞÑÉÅQFÖÙA^Ê %mo/çà$+rvP°—•¶ÿoã÷«üï–_ÿÿúK`ÿ•þKIJ~¥ÿÒDýGIHþÒÿŸQþèý¯ $H¡~( ޾¾ŸÞæ*-)B|—«¤ˆôoo•ùî5©/eý ÈW}Q’"à& %))"/ókøß)ÿ¶þÿ—€þ ý—’uþ{ýÿõüÇÏ)¿ÿ'ôøÝzãýŸM$g¥À?œŸÞÿùã×~>«–{ùöµŸ¤¸O¯ýÌxàÿD›îÖ¼¸oGù±‘SnŠ:Áêžì7dƒ!‹g¯‘è_Ô­žÓÈ©ßWåä¶~·¡z‹nËÓn7'&™o„ÕZ¾uœ"y8Mª¦[/pænjŸ¶“Þü´©ý[ýÃ¥æZö…;ZžLúÓoµµûîz¡Ҳ÷­o¶zÄjeÕx èê¶= <dñÜ`š1´ß.¶b2ý’XÈå² öéÔæ/ï`pëXŠV ßÞ±û°›§«7tú1v¿eóºÕ~îNÁôVÞæ±¹S3Í®Go´»x¸mïO«,›”`o@‹<͉z7ذŪÆ"AÛ­…³G<x®Q&IÞ~Ä¥ãh½L˜mõ»€ÐÜÂrøÍ®'{¯ &1X r9|˜ìÇ£yËšè%O‰:Ü츭‡!oy×” ïÄÒYЉç oÛÏji7{žÜ¶zô`½wÞþõÚÓ¼tJšYeÜd‘§!Í{uˆK¶ƒ\æOÒ°-棊Ïqy7´N>™Ôei¡ËÝ%Oæy1¶ÿ Ö–Ň"”a~éÍ–Ó—e>|ÍmŽ¢xîðºªRwÅeü%]´l§Ðöµ(R”CèVàbI…C3Wå‡J9ìvü•R‹Bª«‘;íyýˆ&—C`ë­{-Â"JFžgC‹ßëߊ|§lq•í¦×es¥lŸ¬…®iØìÛŠP.©ôíþ}ÊÞÜc„"óâ>:Ÿ‹:Æ Vˆãî—¢ŽNu¿ôŽKY^$5Ò¢ý¢ßÚÌü…±ŒrGÍâ³’Í]Ó{üç,Oôm›ò³{K÷´íîµw­–ªÉ>ƒúŠÞ‡2ñõ9«Î#6‡9«î»µ¯ß;ÚüÞí‘WvF0­«Áò©¤¸Ñ˜ ƅ覚ÀJ×ÙJ™ƒ^q¼|2ebGv+¦¸ùÙ£kų{ì”î˜ìi›0¶Û¶jôEø36þ{öì‰s4ûËÔ\î_:Swô/ƒˆ ãÓû÷¯ïP{ÿ´$Z¶á~ Ü|(ûæÎGÁÛ<36ù2°8¼£v&ö²Uézâû7YÍ Zä{Ÿˆ½Ù2r«C6çÃr»¥{É¡`þÆ[°öj¿®šm ½òú:4dJª”Ûù°o¥>¿3“ZÚb²þjË“A+>‡ë®ïå÷a㯢¦íF¯$7Þ‰ñ¸$˜~ù掊Hó­Ó¾~jGï—Ò2ïŽ(kиøÊÕÌÜù–âŽF!Ò“7ÇÜFÅ<¸•ó¨nÔ ú¤Â<Ժ߱®;²¿˜¾¬±~Ê•ùÕžvŸ{yN“þ-OoaL,Nµ¤òï•Ñ©4Ê^¢R¥¶ê/Z¹o5?x)³ÆìÄŽ#mBë\á ®j÷Ñ›øm3¸Õ6·-æÕt;tómånég±ô&¡¢Œæù[ÆjËÊx¨/ˆ3˜Ï5 òu×ï/±IvgØ&H ¸Æñ-C®Š3VNo%ó•KnV 3q=U¬NŸ(³µîÐä{ÕsuSER.¦+GÚ!ï|IcùqX´nùEîÀUç±ñw—‚·õ’:†²¹0'>›ÎôÍ({S /‚“vˆ¥ËdqøÜf-óEù:‹>/í>SÈ«IŸxóšÎ°ÒìÄ‹r•Ñ='¼D¸¢œÛ#ø„曒ƲêOßÝc:k1é/Ô‚c=šGÚaý0ÄÁÚÜ­R •ÄàåØî{%´.éêÕjs ?ŸÓ5S¢§œQ7 nÜJ»£ âÙ–*›oë*üdÎí‹¥BG¾gÑ3'Dm¹•½/Ö±p;0^•æÓOkñRXÍè£ÝÛÀ^ÊÝðÞDKûÂÓ¸ #a™í†Òî,ÆT/‰io˜Å´ä ïvˆ ¹ ïzé¹Mý†ç~ûü·ì?àüçÓóß2¿Î~Fùvýçøàÿ§ó¿_üÿ)å[ý—ûðÿ“þÿŠÿý)å[ýwúðÿ“þÿâÿO)ßê¿ü?€ÿŸôÿWþ‡ŸR¾Õçÿåÿø™å[ýWøðSÿeåø)å[ýÿçäÿ‘þÅÿŸR¾á¿ì?(þ÷×ó?¥|ËÿÐó?¿öÿ?¥|Ïÿß=©±ù3 I€Ÿ³½×ßý&"ƒÿü÷?ii”´ÌoñßÄ¿„”$qðë÷¿ŸPþÿ‰ÿþS¡6…ㇼEÿŠÿ©QàC0‰qáD)"Êa€½«âgþQª¾íâæuös øã^í7‡%>î¿Yíæí |BéÓSþb›±T›“æ¶u5×Í”y}?g11±ÍÀN_ðñaÿ/1Ã|žJ_Hçìù]€¬¸“”Ä=Câ¿1úwID¾nçÿɡçs‡ß~“›ó¶ 8¹Ù»ú³ùôØûÓNì¥ìg?Õß=׎?ÿÊÛŸtÙÓÖÍ»ùü—ÝÐ'xÙû‚ôsrwrvÿ+ÀŸž¤ÿzBð‰OΗRl÷)öào'F™€·¿e qºÒ:ÝMnþX{¢$>ÆE4Öà×lxbäì×ÂâèìéékïD jûíÚß×ÞñÓ5q1b.bÄ7ÿóûíH/bSïù+;€÷°Rª†á÷À¦³´?»dÐuIý!ˆMGâ¸3ÀÙKÏÙdƒ·O0H¯ÏñAáL\@ЧK"m¿ZÆëãÇõI(í?}ëð6 ð'©¨øÿ¹Á 02PàâÓ7cÓ¿5߸ÔðóÜ Ü„g |Šõþ­RtP¦€ø¿à†ó¥Ü\(lÒêw2þ–>>^_äw.õ/oË~ÞÿM“eÀÆùOD÷ÿ)ø•„ýNÄœœý7LõO(Ll°I_Ш{ƒK‰@GK1`C´ÿ×EWòßÝÈ)»’¿Éî' ûúß4Éïbßÿ@Òþc¬Ôtþ_âäç@wb(÷”RßE}7êû?Fi QiMjú9›É¦<Á­n°[ö·Xf±t$Ÿ6öŸbiÿW8ó9@ü¿Çi.UçͰðMæl$oº68A´_"Àwõ¿ (ÿ1K×p'ðyà øoŒ÷ çÁoy$ýšGŸÂþ¿ðèϹóßä‹Îïù‚ú_ä 1À'_%øá¢ã–6@ð“ºýÇ\ 1ÑÌ}:ŽÜ¼Á} ×Æfê[ÎÉü˜s´®öó 7) 1Åø¹98ÿ¤Eµï¿»¨ö²·UŸ!¾¿- 7— ¿i’±³ã§uÝMÚˆÜÀuó\î?# DWøûÑÏh›9f~΢Ò÷ß]Tzm¦¤úÌ<É?aÞ×Ëòÿû$‰ìóÿl¿ÿS ÜÌß²‘5ó‹BÏ5ñý4ñ×ïKŽÌ/‡¡ø€:ª¹qÔ]p1êèçæK”ˆ å¥ükG­›'©ØMKðÝÖÐü:Íç&Ô?ÝdHý›òðÛóóžBê·=Åß^nnI'´yñíM‰—ßHHýÁ‰hI‰Ä'¦óú†wÆ>Á\›·‰›°|ºñuÒÊÏ)Â~þùò«!~SÆoÔ¸øÁißê}•ˆlCŠþ|˜oà |%­³?bÎ_F”–ÏUeg/U¿ßöêà…ÈwØo*Ãߢß7ÆLõÇ3ûÕŸñüNÔþ½i7Qàß{~ÿj*‚‰•ß,6~Á¬>-ÌöúIãÏ1üÍ(}-fßÛ«/êñ›:Èüþ0ð[õøZë>ö)Gз½Q¿a³þò–p£µ)1?±—sÖljØÒÑ~£¥Cèç{ÿâôé½Üö’¨ïŸœü }|‰WÎÄÓ{U± £ää ’ß $J€ª²øÏAÕÐÞ”g?Eeqâ/wĪM²þáyêo$•úI?hÓ/}ëÄ?;£oï~¯|ßz.U̧P £úÜì+zå«þq?iÆüš»ß öEÔÄ<ÿ¬ÆÎ`'ïïh Âá8á»mˆ…±³›—¯§3ÑÇâ°‘­ð’ð~WØØÑþAå†üHkþÌ­Êü›n•¸aøìQeþð„ܳü~¿òσw›?ò ;«¯ þçù¿²ïü‹nIòÛY|㤜6vÆà— ›ü5GôyØÍQÿ¦ùü|l÷Ù„¢¾Ý”üÝ#¼ÿ{fõ· ©ˆ?ݼþþ­E;‘±ÿô}É÷÷oMôÓǯýÉÌ+ü«ÓöF&ÎΠ\øz©Ê—œÏÆ÷7nÞþnNÎ÷ü}Ý\Ü?½{Å >êì·ùö@ÃÇ7”xÐCléF|æÃ›xânïèìÿÿØ»ø&ª­ß­ey¶Ê⌠Ê2´³e’Y -m¥´¥ PxÒ¦™Iš&1I)‹”VŸl òDPŸ( « ˆ‚ŠR¨¬²hÙwPáC@ùî4m&ËL a|s~Ú´ÌÍœ;÷œ{ιwþ÷U£A¥MÇ­ÀÈRÆ2]e»6©›|Ê•›ÖaQ°®EßÍ-GêÕ?^ÁXŒ@í°qTzî1ùë’ :Tup*qƒ5Ëáuõ¦ß[þo:׬Ûå\ýËëïèb´Oq´òv´YŠ£ ¦£µ³i¼,`tg¹XòÆ\l‘­O¶W-=ø¾Ž+¦ÇñT•éìªÂºs=Ü%§®¨SPý¸ƒ-=)5qgŠ„6–‚yB„•.ŽÑ«…X¹­úå8߸rÜÒtO UJÈŸøç?e”ÿKÉÿ# ñå/£üOJþIˆ/ùäÿQòHC|ùË(ÿ ¦È_ âÉ_#£ü/JþIˆ/åQâ?Iˆ/ÅÿJü' ñå/Ÿø_‰ÿ¤!¾üeÿ+ñŸ$Ä—¿Œâ\‘¿Ä“¿VFñ¿ÿIB|ùË(þWâ?Iˆ/ùÄÿJü' ñå/£ø_‰ÿ$!¾üeÿ+ñŸ$Ä—¿ŒâB‘¿įÿ ‡øŸTü¿„Ä—¿âRñÿ_þrˆÿIÅÿKH|ùË!þ'ÿ/!ñå/‡ø¿VþJýIˆ/9ÄÿµòWð’Oþ:T6òÇ”ý_Iˆ/L6òÇ•õŸ$Ä—?.ù+ë?Iˆ/âvÊ_“8E‚…?”?ªØIÈSþ^§ð`¥x³¹Ô¬7Â?o¤°ÿúo˜×Põõß4à:Žc¥þ›$tgÖóPJ¥œRN.àDU3p7 ¸ ü—å´Ï°YÆÖ®²[JêÏÞ;“[Á¬s«×¹uVgfàßðܱm•­ýVí~W–cxˆš;¡+ªÈâ’v;Ù 9åå¹õÓï1j®¥ÎÝ[Ýh%9 –übâLÜs6 šœÜ‹ ì^7PO®¡·÷Yš‹áÊEû|h‘ò\ŽàðT‹J°þÐ5î›IŽÃ(XeŒ -àA!˜–”mY¹†h™Œ€–VZNÇÂ:pÅåtwE½n¾ÆœË;!¦J•¹†U™óœž=}´g¥¹¤,=pEàùºÙ¿Ü²q®Û¼JÄy4rÖkñîw°j2ȹ,›—¬Ë¶t¥Ù±gq6Ÿ2¾sʳÝxÒx¯„ñÎB…·S6ÀZm=k·ç9,ŬYŠªŒAu\ª»çîrFõñii9iRâ³Ó3ó²Ó%¦å%ǧ%¤&fÖ†ÜnM32ó³ãSR}¶ ¨²ÜM—l‘f]$}É/ÆÓ4ïÂ/~ ¡þ s=݈Fñü‘W¹õôv罿Ys„ì÷6¸{"eòû;:ï¢6×™º¬KV‹˜6£½!ßN43¼¯áwÔ~7©ö+™)IÉÙyr2Ss]Ý«µš=ŒlS:ºTÙ#Ñb†…KU “âÁ‡¬+ëRVdÔ©j÷Àìž>&ÙÝ8ÏÈ–©`Í*ÖŽº±ÄŒ,½j±Ô^”[bÆ`ï)аÃÀà1Âì¼Ó3zqºµ q%A£Bü÷¿¤|ð þWâË_-ù+ø_Iˆ/J>òWð¿’_þùÈ_Éÿ! ñ寕üüŸ$ä)ÿú% cÀ$°,ºÈ„ñ8JDþÄÀuLCP þOºsð®U²S/c‹Tp§AÁü)˜¿ÛƒùUGÐnpÁááoú1¬Áh6ºÆÑØ6Þ¡rÞÌÙÇžðÍW¤ÐöÇïí¹‹›vy_p½T‹ŒUÝ tÏî`LÆ‚Ø"7\wCŸMmFs¡xÓÇK-Ž^\(ЖûCäÆ+k.âZ‹wÂR”Wê0Bå¨Â5WPÌs[Ohã°€(úDbŒµqŒÞ}û’ i^žÉRè—½³‰ –4NÈ8†¢Üú`gÍv}Sçå`1ÇâVíÍ<ÏZÙ‹,&F¤õ ƒÕ£  :·²—ì M½énè<¤b4C¹[lãüv¢®E°º@ñn](Ó9ôEŒ€jº«š8F­wŸ–¥%FÿÓ\ â”À4î1³Q€1¼èq-.ÙÉ–aqc€çDYr;ôžþF+ $B’¾by¨z“\¨'7ø§¬§ÏoøD[‚N(oã)„²Ä ‚SB‚k5‚`Nà Õ&R ¦A ÿS¡¥™°ÔÛ‡ b@ª „$hD­Ÿ”0$Ø9-&bç„xa4‰òäEƒ™£ökÁŸˆÐ"jGÔ4øÄ…¹€É©Áý(A¤Q«Á¨Ñ9áQ£¸Ü>-0 ¡À`©ið)2X(~·–;Px ¡hLðö“¯÷¶$b·Ç’»=Fa^(dΦd÷©N+Ô§Ì^ûš ÚUŒÞÑ4Ö]ñ°ë/—ùãÞÄ–‚¶hësßüÊZjpàWls\_ò9²ÐAº…N"¶@­A´ÀÜk@ŠYŒæÏ:t˜Û»]?\àÔlhÀL-È$ëoŠŠqÁ0Ci` €~Âð)ðULP”NÝCBC ˜ø$%5¾ êÌ:ÎJ0j8†rà /HˆôÅ‹1º U;=°§¸V+6xjÚ73»ÞÆ:XQn Ä„¥ƒŸ„070ß0Ÿ%&-lI::}–õu˜ô//Îy‘$*æ$pÊ/¸/¦“Éi:I sbÀƒyZ1ÐÌb€´æ¤°%ÃFž òCÀsh5`Ah¡kÅÅ4¼À{)*úZàð@˜4›"…­fh/‡À@Q0ŽOAÑ„˜ EQO”†m` 4¤°¥!›Ú]E‡½Lg À´{SðàE ó`¸Üù>cÑ'¡-¹€ORØ€„òI8j`Bj)ÚéwhaczH߯àp€vÑ8ÊiM ßX1µ»cs¡ä ¸¹zÀŒöŒÇv+ZÄ©¡€çÕPRÔódïŠØõ–’‹9Ó¼3ª¦H¸kaf`Á‰âÂËQ~jÃpÈ<F û`(µÏÀZT¯µàî¸QŽ¢¾ÃSÏsl° æ+˜ä/©“,°Œ5¼wb+áJÚ¹›Z²JtÛ­fƒ|pÍ ~ ò9•›Ø,Òù'ܳ~ƒ»~WÜPj®?ƒÁmˆë!~ ôÖÙ-£ÆÚ¹³çÖæVˆÞ¹1¬ž“=kw?œðúÞWú‘¹¿gˆôƒàŽ/uÁSÏîæTÍ®Æ:Ƴ&WžggÀ=MKO¸^Æ]îǽ’uŠhN!kfž‰µp¥P¹¢}tn(ø*;~ïÐX\äk :ËÿÙº}‡[‘[mî@¸.ÂáK’‚RøvÑ脌Y¬põ­s¨ŒU™ÑdR°pÉl(5!*ÐR5,%;9='[Ÿ–«Ÿ™Ÿ–Û ´à ®Â/î>Æ«Én[¦³ÙtfÇ8¨ƒ3$ƒöñýSRS²sáÒ`JvZbV–j`z¦*^•Ÿ™2 '5>S•‘“™‘ž•«Êv™Un¶¸:Ü…Êdës;àQj6V¥SõÏJp‚’]—bUY¬óì‹uœ µíRU†ë5w9ÝÊš“3RêÄ…mª½w8‹µ•Øc›,s¯G.[M¥…`AouŒÎÊC­%FçGm+øX:s±º’ì" ³vÕ °¾.4²@k|ꞃk[\תŸAoŒÕCËë÷R¶eY°,¹ÐRª³1>9Xí®Ëý€­êá`õEÎûû¹P—Þ"¸àpMO\«€Ãÿˆÿ¡eƒÿRòÿKC<ùÈ'ÿ«’ÿSâË_Fù_•üŸ’§üým(Þ aü'FjÔîøO â?I  þSºóðŸÜîPKÿ©à?e€ÿô«Ž~ñŸn;`n9GÚ†¡Iß§±}lÂÀ®Û‚á–í>òÀî€Yi0–Úê6¾\ùŸnè45èÍS@-KÍ@£˜€šŠNuNïTT(ëpž2‡XWáÓì¥\r»àô!¼P]Î×EB]°1AC@ÂĈ^=A§r‚ QUƒÿ¼G¢I!Ô‘ÚFÁêIШCSï‰cU¹vA¬Ò 7„WoDa«\³`cWY®ì²g_„¬°I0a¬´|ÎÙA0+×DÑÚÐ>øæÏú4#¦ãÁëÍ ˜ô¯•ÎËA’óFŸ;«à—wíI†  Ö}Ð…Î4à$óÌEí.{€'4X› š›À›,úbﶃ¨]A› °cô¸¯q ˜F—À¼o DMâZ£qD ÁÔ˜(¾@ïmk# !& ŒÓ¢!p„À…!Xz.í®ïAðA0 ¡H-¢&i„Ò#r€I3¨ýbˆ †D5ŽhQa°—ÁBíéó…ùPˆÈ„Pˆ–~ÒbèË£ òÒb !§”!E0§°´· ÛÆ´4Ð4•C5%ÿuÖ†ò›ÿ˜šôœÿ”Pæ¿T ³ÃuðÔ‚-’;ß ™Q<®NðÜ++WZÁœu®–‚H Ž“0£Š 1˜€N9-Cjðü·š ÊCdþ0Ø÷œÿ˜RÿAš–‘–Ô"ò^87[¤$'d†„„ž¿?~¦ÜÕ|tÊHÍNüëúõví¬Ë–-Û¸qãüùóûöí;iÒ¤'NäååÝwß} Õõë×I݃ÓÀo¡ŽÌ´¬~ß2„„4ùgJB|öØyç^Ýk?¢½{ÛÕ¸3»æ±ÛðäÌ£½ÿqqô!ëÙµÇ7¯žýü¡Iýpkq 3úÄÜû6_ZòlèS÷®|©Òš; zäÖÍ6EïÝ{eøø°m¾kq8îÏòÙ¥Q£r;[¿È kóüh~r]AÿÅ]ª’­ˆ˜›éþ³è½o޼òÎò³çEON™¾õjÄŠ/F]Xþκýzr݇1¾ö„:}Ay[´{ôù)oµ“ÔrhúŽÁWwçl½+21À?:™?ê{þòÉ“ 0LŸz¶*$êÈü9MöŒLYtWEwã¥Yí_šñCö„»CÖ??ºÕ•Ûæ¬í€hίï_3fÕ±ª{¶ÎKÃßû3©[JóyÚ_>Ó¨üÞw>­š³ìÜC=¬;ËÍa¥õÎíѹëù˜ð—¶G^sŒ¢+ËNΉÛfT»Ê}åã¿zቪô‰}ëÜáüÌ 5¡¿ììÞîüØÂQT”ý÷µ‰l”©s÷YE­5½£þ5çÛɇÎS ¦:Μx\Åéê6{>5vžãñhðK¤vÜûý§ÍìÖúƒ»Ÿ‰î±8´õG53£{0¡­¯-¯Œîa‹hŸöãÒoJsjè_Ó›Ff¯Œ~ŸjÿM“±_|Õ쥘Eý<;î€-ê칦»¦Yßñ·îöÈ׿ÿ©Çº²^ë>\lxßp¥CÉÃ+#_út{Þ]I«VÖÌn2)¬ßñ.WJ¶)¯øøÒöM?‡_»wûç›òž›iìeÌ©ê4°¼eÈ“%!K;f×”™Ò£è1èCHéüö1»·”}ºðÜ¿OídÚ¿y¶pœêÐÐâ"›èy¦Kzuí‹ÏÍÞ¸½4`¯å;|ÚiÕ¨ü͹ŸüþuúãýI„O^;±æÁËsKŸ\Óü‡œVoµo»iVKzgëC×W­MÕ:·{xóî?Ttÿ,%ªTkµœÚ¶êùæ÷iÚn÷ï}[>a|lö·Ò©okïA¹ÿ²šH×¢¯.Yöñ¬E»*.y#6$aì©ô._ éX‘ûFÔ¼˜<ºvûÝcw\mÞûlTçL“æú—Ÿûþ»¶5Ÿd¼ž8°ê¯÷þ{rñ=qã*·mZ~Q3=ê‘–ƒ3þ:6"ã$znDbÄÌ¥Û…M+îh|¯ÝÚ£sÌotNëúâˆQac×=}¥Í¾¨KÖ>9a/VMhdŠx÷¶[Oÿöa·â5M·„·:øÊ°¡Äï|ùL“öŸŸ2£G¯U÷~÷Ê™3évÃà…OœÓÜþöÄ/¯žðó§âv}:oÔçÝÎ…]BûìŸ3M]óÉȼc±e´°¾»pãÕ‹Û¶UùßüQEì:œç¿úÚ{´usjê²=^j=£ºüÜ¥OÍÔÏqå£÷7[ù|ãáë.>}q!f:>¬ºòuâÀæ¡Y ±×î_ya[?uÓ õêõ1ÆŠWÛß ¬S‡.óËß²„6Žé£мºzÁÕç¾ê6y~x·üãïî*/^¾Š:¨Kîû³nôšf¦‘sÍÏMéù“nG…±bæ¼ÊÏF<Ò¡¤Ñä¶_…LnKýØcê×ÿqT•-6ìFú|±&w|£g÷L̽¹rBVKS·˜‰ß—gÿ€ìÞ[‰Tí]±bÇÙaD‹¢Wc†ŒþüÍÑ•óäÎN\[9(?~É'Õ[úž0öt· 7¬YôÐú_R«|áÞî­ú¼q9lÄ¿7LŸt(|ü’-dŸõ[^L~°S+´ræÛSãžLJîvòÀÊ 5íèÔÎ:=anÓÍ6ôÐÓXybìþ-_?1Nwò³Ý®–†~k}ºwbè^ê™Vgáè¤ê ×ö/n4=7ôjtûš±‡÷ Ïx­éúÕŽ£ÍÆõ{9´zÆß ý¿{uêÝå`jbéÕ+…s?iùÇ¢.4=óçÌÛ‘u¡Õ«¾®ÚyòØ©ãm]iõJǯ»÷øyøÎ–ës˜ΟWY½sâ¶¡ÇVï;˜Û¿ËRìlלèíÆ‘©½^Ï:­Ï OÙR|ô÷¦yvA“:¬jÜìØ¶¹&„ïœ8b ½£1úÂPúÜ]UMå¯é÷˦}ÿ Ï?õ«>¢÷‚³Ó.=Ѹõ”)SBu=;²âÕ YÑÉ¿vLZRýî°7~½vïS˺憭;¬™ùÞ”ÔJõ+ë/|»bÑê¹U³F…Ô=¶¯üø±Ë—nÝóXø# ­Æ~ O=]Œ[S‡~%¢r‚}Rò¢˜×;…›‹¥Î˜Ôõäã[4ÇþŸ½+kêØú®UñQ+j«x VAC–›››BÙ!ˆBîÅD³™„Í}ß}T¬­•~Z×Ö}).”7Ä–Ú]­´TìÓjµ‚[í³ê›¹IÈmyß—óû¡¹÷Μ3sΙ™3sgîçÏû ?-šÿ4­'ÅœùÛË«>u9ÿ'·nŸ»¹BÈEªÖu¬`k|f¯ßüsŸ§ƒóGìï¨Û5ûBM§~=Ži–Ìz%á1Ms X£x«K攪eUJ7úNê”nýüÅŽÎmxù𵨀‚¤néúÕÇÂÏ?iÿ´GUŸ>ïüOnî8G†Ç†í™9×Éã¿uü׆ö¹öÿ8…¬í߆ö¹ÖBÖöoCû¿\ûœBÖöoCû¿\ûœBÖöoCû¿\ûœBÖöo;û¿\ûœCÖöoCû¿\û?œBÖö¡û¿@›ÇqæjÿÎ$[û7sFÞËë™w€´ðþÇ´ÿÃle»¾ÿèâdIù¤4[ÊË’d(7[šÅH0‰„ÃÇP‘-}ÑåsÑßKÏÓþŸuHKíŸÍCíÚ?wµgPSû?i¡À·G@ç`¦,R&‘ÍoÆy3B”;¸…„Km!yÑ5w¤çhÿϼ¤…ö¢\»ö²\íß)ÔÄþø­ïtjÿÇáÿ-ZþhÞÿá`óLJx?¶³ÞüщgÜü±6J]<â•Oyi뿟´ìÖJÅ€¤1üƒ1iü²È¼[1ä€ ‹–ª¸/,ïÜ¥Ã#ÿ N^í›Âèã½äéÀ¬53þèã^LÇ廿Y>ûiÒ¢7>¬ <'yš¶!iÌ IÊwe"Å%myP]Å`ÆyãÅ–c ßßü6íÍù÷ejÿ½¥>¼ëÓêÇbÒc³äצï?rf‰OÃñÚ>gŒzéê^å§þ±ŠØ¿ðtÜä1/M–‰Vw¨ÑïzT|'%9ÁkŠns»ƒ»£½–zwVhâJL¾¾çèôqo<~«CÍ¥±ú–•ÔŽ®~Ó»S~Eüð/Âk|G^Èðž5°3~Ù{J?<(hÚ’ƒÓf¾]9Š—-rûÍ<3×½÷½adÝ»Þè®Z~‘ZÂ.X´íÍ{TAÇ?½ÿ žùh×ý~<ýü7cŠNŒ:Ôùô’èaUiUOßïß ùL2ìö‚EYv·Ÿ6þlÚMÙðÊDu½â·µõدOGõJZ~·êÌ'Ý8\½M|8&ÕCz å÷¼²qIŸ²ž–’yÑûÈÌä[“|ø[Âî «³†Çè[:©nø]'kGÞØ›ð…´æÎuíÒ¨£×|°oò7Od“§ b~ÞçãÜHQݸÏ#NŠ"J×V¼µíêr¼»r7;z.·ü`Åï+eö—-Çó•¿ÿ²¡W×w"Š^Û©P{Ñ»|”ž,nÏNhŸ–´hûÀîÕ?ù,•Õ,^±ûââþdnAšÙ;Oý‹¼ŸXX²¦#³F2¯ødõ5ê„e[÷öìÜà~yÂ-Á;&–Óþ¤­<ž»öTö?¥ï-¼urØ!íÙô’ãg+OÏ_Q”,^Ù­.kmå?uT¥•¢f+ ñ—ά¹Z7¶ÈÿxSçø£µYó6%ÔÝýuïÓiW¾‘DÕŽ™6¨‚Ñ«þjÞì.ÒCÚ£¾ÛSœ;3jð‘ WÌܬóX'Ôû‹z ¿ºM|¯ë§n²†éwóÓ‰³ç–{UßëüÜ×®èÕ(ê³»¢6(®²‚»4æRT}ßšÔÚ†O:¼qýgÖ¬Yí¨% ÇŒA±í¬—€Ú—€Æ-¨ç‹I'Fx.˜±`çŒy7»oœÖóÂÁñ×ö¯ýöÝòî‰ÿÝë|À¶Ô±£V uyFií»Xì°Òµ;KX]æ¾|§ŸèfÜÜ×wZý¥ûû¤ÿrú‚•[Xßz&$l;|"2òí­H¨ÿÊ…'"—T&Ž[:kdBeeiàÞ5S~ æ…g{G…êÞŠš;2wÁé'ã v~6(<»hú”Îxþ;Óí“ þè*Üçäƒ!~YG÷”¯î¼wÔdּτó3'${z_Îéšÿkº`PçÕ%ÊöšåE3û<ªˆ^šwhSù„UÇý%à;šOÎŒð}ò¢šàÂÊú³Û?·¡‘½»lÝîwöµw=}ó¿žpäò¯ã K=k^ż:ûd¤í?5xø…ÔÀ/{‚„I?ýž:»Ï‰ÀU#7_c²¦ŸNÏëäq­4ñ½?åÆë±‹—%v'^ÛtÒc>r5«SÜ©²Š—cC2‡Ì:G#´k÷x9)ð“íÞlÚ¤•¹IÓö?–¿÷yø…+×ÓGìÍ»ºfYÅ òm“oÎ]»,æ,oÂ{„¨ ìLG¸ô€oǾ5š[é+=Å÷noÛ’ÛÉÿÃþþWÅíš›Úû¡Ï>Ï·O$¦£•ä¼ 2Jçû=G]/ÓæT£4è:®‰ùÿj©ÿÇœ>ÿ£â?.ÎvõÿÎ ‰€%%.%` H”pI)KÀ%²ØÄ§˜ÀE/ŽZÑþÿöù‹Ç³›ÿá®ï?8…ššÿI™Ÿk7ÿ ÉÑ« ³:œBˆלZnÿûüÅcãv퟇ºÚ¿3È~þ×®°iþ—ÿž×ãvæù“Ét<ÿ:qÉÚv6ó¿qpþ±¤~õñ¨ –ç©y¥eËv†æzr¢¿Œ·Ÿ¶;¨Ç©©gÅUá²iwŸ2ûõúοÉP3Ágø‘™ú+¶Ö\»8oçö”©=¶ûÐùñ`¿üÖß??ðë»™1‡Èw §gÖ}}æØž¼Kž] Ó;tJ-=tîýÊñü¯£ŠFz«“ß’„Uœ·p(ZÕµ¤›ç“ºòäÙ 7ôÞÊŽ»ºwÛq{Ý}å«‹+ ¾šw³úÜ{÷C¾ªÜ]vöažgI÷ 7Fxl)ÛÛåÓÊNÝ{lT.?{(û•9~! ÿ]f}pÑûsîžfžÂê‚7Î+LðΘ->aÛn ¿î613tØ¥ÐðCïDù‚/ß5öÞõ„n´ÂüÃ÷|ÈåõÁ输´Ëÿz84Ÿ‘4,$”‹ÿþù–­gOm9˜üÖ«¢¯S0n1çκä-c7ï>ÉûìÙõçL ™åq¯=ãBz¯ß¼ñ:´âóOŬÛÿ ýþŸëüï kû·¡óß®÷¿N!kû·¡óß®ó¿N!kû·¡óß®ó¿N!kû·¡óß®ó¿N!kû¿àóß8…ò8®ñ߉dkˆ؈öúÉp<ÿg³xjþs9,Œƒ¡Àþ\u½ÿu †Å…ŠSãÑqL4Ÿ<2:2¡0™)œP&3Lfx€1XlD¬•¨trˆ¼(Q0™á±ÇÂÊH !*I½è‡ä”yn0-T­Ò“*}€¸@CB¬]ê*˜¦'óõ”×A¸T©–ëÔ|>WÀ¦`såz)²‚Y D(ÏdÈ9Š$R+–*))d» rÕdk(S#¤¢T§ƒ@µŠ`…ÿ¨“‘¤ž†è 0U˜€‚I¤*aM„°¸fHȬ$ÌÀΈ·qn…„<ׄ£:…Bw´°5Þ±*e5"@Æ€ŸàÈxÉD C™Ž8Î-“ƒÒh¥²#‹P˜ÔÀ#Âô¨UŒ$*•ZëeÏ(Z®Ó·Š<¤3æ‡&yÖì&„Xû"ÄPĺV±™HAïÚ—ãYxh€þMIÔ‹Ù0 !Xú:[Ôœ‚Gö8¼DO*5#…JåÕ1F P_3ÌoŒZK2 (Í€‡+U¤È×Ȋº µz† ¢Ó ™Ôs v—JiLHTQ%-@¨\³`†,$JA $µ";üQŒIàdc÷o>êe 8 Qf• (¸‘c¸jÊe2ð6”ˆB…5”A'Sçé<™\*£4amá»E˜&1]™ª«7!Ê:,2‹IH8E¶:¢æ°Ü0eÓE‚Û&„lë´ÍA™gãvG%"sPœÎÆYt B¥ó£½£L‚k Æ®% hÅ-ˆ`£l:‡Ã££8—ÎÁ±¿Pž ñØY:ŽcðËÞ- ppš´<¥”Æ„•DMÔ \ $.ŸbN:ŸëPð3Âòd¤–ж®@CTZÐX™lÒÊ- Á€}9t ¥ã,‡"¤@jw¸“ªˆcgectŒÍ¡cü9–Áj"ìd€±tõr8†·XL€Ó9lPø?‡ïP—IðíÜ ‚¬ëµjEËÆg³@Ë’ø ¥ð%‘À0;I„Üòls³b€Ú@Áy@…‚MÔâêfÅðè\6ƒÑ¹»%+¡<;1rU.èÕÚ‚–e±€ Яà|>+@ÊÊf²—¥#UºV84ÎÆ)á˜cA q8v‚ò$z©ŒPOlEPÐW1|å[úˆØ4ÆñLhßõ Ì£O€¡ÉÈÑjD¯¦`Ë ·8ZC|õÆé…zIˆ,*)©Ph$!WMl¼Öi$Rã5ŒÁ@¨‡hñ†´·€ ˜TLCiT` ”¡†° 1àwSY Q‘’TF‚H%šÌJQ©óÀ mB§@ÒiH®ñR¯!• 1ÄH¦v¬­³e©õzµÒ2:&ÖA!ê4m:1Œ¼”* 0þAĈ!ô‘XVÅ®. ð’R55SB˜ÀP>‘Ø2<Ë¡ðãMAbkï¦ ØtG©ßBÝLÊÐ0‚ÔBâ sN* °PuL7Â@µr )Ó¹µ:¶4¸*¡Þ ~£ ð—% ÉÑËÀ,JÈÌ‚Ñ,¼M€€Œ”:$ tÑå$.©0³±Þ`UèÕz*crcªÙR9C ÍÙì#X!h+–&LñR?•T4)@žçQGP“l†¡Í€ZM$*0Wµ”¢Qœ¡–æ(AO&ªCÔ*E?ê A(šTÌXÀ¤µÖ ›Áj![P¼u”ÅÂ,òPá¯F«°‘ÈW§×ʳràlR®¢ú™ZC]‰‘ë‘<¹Bd‘0TÍÎQÐI‰GÄ%‹‘ØT$%$11$VœR½ƒ§$è²)>ràrÀ6:J_;š˜ðÄÐ>dddt¤8ÆÙ£"űáIIȨ¸D$‰IG†&G‡$‚Ib|\R8›z'D¢" º[D!²ÈÈ“ àmÈȤ0„šN›1$’¤ŠªÖÀ–dé¯Ujêq˜ DÄGš-]T[a䳃p\©c@‚ ©~ñ“ú#PÏp>ª„)5@§À'@ÛBtò© a±aGC ŒÒÊbyØ"— ðX§”("óü!ü…h´Š#l,ƒrY@›E•Íj-H7t-æ1.z2™yyy Ó²pN&5Û4vdnvócBj²B8Æ;4Sç«”„‚´œÉP]…q BÈ4ÔÜ2Tv4ÆÕ juEÔŠíYÖëmèû®ïÿ9…¬í߆¾ÿˆºìï ²¶Âÿuíÿq YÙŸlCø¿.û;…¬í߆öÿ¹Þÿ:…líß÷g¹ ñ'e8~ÿËas¸l‹÷¿,jÿ7æÂÿs ý÷¼ÿ5x&C†$–Ôà8×Û_×Û_g¾ý5ù õ¾×v°)Ø\Ë¥`›µ)»Å` ÊÖJ&¤À£4Z²‰»¦5DÕ—–¨Ÿˆ›Õ3”Ûø å"B¸>lâk´j)©Ó©µ4‘¯<è&ÉÈG$†‡„eDdd™0½È†#næˆ;âhÌíH&(W‘­É3ËäµB¦Mn¾97ßV?ó3cýX¼‰×˜üÀ°Ý„L«‘/‡Õj¾9*Ѐ²5›šckjǸÜèîð¥­eõ•`4Š#‡j0V…L䩵MDªr”Æ"!Ï'A/†=lìy »¬ ™+†!Ólš˜ÃE„ë’U“Uê<Ý&¡Ù79¸!aRŽnˆ°Mhv(Ï01ÇŽ›Ùo8|C¢ð|¹Þ&‘Ù8dFõSÌìËÆ^˜Ù–˜­-1^+l‰M[¦ÇØåP ØÒðþÆÔ>ŸK„ñÊÞ˜YißÖ˜YY˜ ™Â¶¡'¥ 6–/К—ýüšñÕ°(åpÙ”rÄØŽ3ôâØ©1T!²!OósÑ?SX¶¡°¨±°M© †14Q–Z­0µM#=·DeŒR¨º 6NÉå4Z˱}†ý™š¢†šb¦šþýËsª…*Й˜ØÚÓÜq¹¶0÷=\¼sÑD³\ÚØ‘6kÒ\µÜÔ¡ÏU“làšæFê×ZY |åãÿö®>Š"ÝQŽ(¬Š¨Q!P 0&Ó÷4„p‚€aˆ çè„1s„ÉL"‡ OQžÆ X]Aãå ÊËOÐõ'DÑAˆ .²ÀVõ5Ý3Ós04#¯ë÷KÒé®ó;þõUU÷÷IŽð’f¥GOëÂ)µÛhõ[ªÑh.^Ñ5hE˜”)ƒ€˜Ñ&ª‘pð ìZ— bn7تú{þÓD©ÌÂ{Lþ" Ñ A´ƒøË ¹ˆÁà oÅér¬Q™ail¦,§ÔB"j B †”vÓä°yŒãìl¬‚w &·Éít‚{Þµ£'gHÊAöCE«½ç;sÆ©Ù<Ãa¼Kކ§)N1§˜ œ ¤!ÜñQ.4Í(0lÔB•àÇ'Z@:Ša§CÓÁ#]0‚NŽ&µ‹K8ö <£¶Ø ž÷4BˆE°Ãj“D@ÌKÁbšàrÖ‹@ƒ•°l4‹‘°½¤{€%c²|ânªÚþv‹½Â#7Øô –[µ=r¼Ëí´ŸW“0À»üèÍ‘>"2"Ò ‘Dåµ/8 %†ª”nâXF*˜´X6¾%‹Ð‚ B‹Ø•úüM=#@ ?^âÀ´EÕ!Ò%…;_ûàJ:& @:@:¯ŠmeV/U$BÁ!;£$ŒçÕÄÑq,d8;i gƒl½å/A 82ÙÃw ™WœÔ¼â`r ÌøÐ!Ü`p­_yÀe²t(ÜX»5l—qÔe‰1†k ôŒPÐ •PÄç´ð, QŸI)¶ãZ =•¨1ŽG³CÁÅ„&PQB0a§F¨+šÅh* Á£ÌD“ë-¡‡¨É ;»ý0K2±Pù „\D.‰°%\¨ÎSYÖ…ÁQ .g†äq4›Æ¹#l“ƒºÂjÉTççµ”ÌH:™‘LbÈ,þè€\† ´=Ö):—mFç˜àRúŒ‰‚}Zá+)é ôµfI&!0¡!ѽ`ˆE‚àRÊNt.ã2—qßA`üCðÌ &‰Á쬅bÉbŽ\·Í[S°ÕŒ££J\zT‰SHÇ)"¼§ÐDO‘‘ô7V&) …fK*ü>o,–³’eœq q¡¡HÐ þ2ò‘ ãŠe‰s ï:NCâ: G © Œ˜g"zÎÁ¨Z Ih54™üˆ2%ˆM0&+Ûôúb h‚³¬Ìç›.R(>ÈlœÐ° 1$'a¸¤%ù©,©Áu´†¤p ËG„‘þÊÚAqå5Oˆ&ÈÕƒC"e›ÀÃÐ!›ˆD/ŽÕ$è¥Õ€ÅS¤™ŒnÅ‹Ð0€J$þ2ò‰3^-´›Öü„b•‰¾h”ðćÔjFQU±Çaó8ÅúÞ†ìï'àÚc%(ô"`Š`íxFa¶‘'ú²¬Öá¬ô†Œƒy@ÿÝ|¨ Œ!{]LFn ü’'˜[ˆæ»i²ÃÙÃfÚ÷i8\iÀµŠËPѳ †kЯŸF,v9$[àኦ\¨38+@å=„%‰×µz‚eCv‹@ð“!é—§¿¡c•Älª³3C·¦ÕBÃÀTÃêÄò oP<ƒù†'ßÀ@$½ Í7.ñl´[Y¶±«[hÖIÀ:«rѰÐ^ µƒ‹Ø¨j‡ÚÝ6¸··‹·0bA¢'ÇHŠD÷Èuæký»VN7r½<] Kj KrŒ¹¼/Ïh‡«Ð^í2X­ðVc.6ô,50O¡Ý`rYjxßs\ò<>ˆ©ç§€ÓåËH„ÍXh/‚q^yèÙ“—òÊô4_ÔJRõÞ®´LÖà~0’܃6›Ûn1 ÙG:Pµ¬§»ØŒDÉ÷(CU A Zö8Ì®ö™‘–*›ÅëCˆ€ŒXå½À·ß•`SúÇàn*ÖGa™³G(‘/qxðHýÌ ¥S+z'ŠïzÁ5-Œ­íA2Odm$¨gär†e\Œ„_­*Ì@BÌÀ!AÌsÛ«A[BÜj—ô¯¤*%Œö0þµŸðñ/L/;`ƒMÐz ˆKƒ¤˜p.OÓzx—¨DLYá¹A…æF¶°»-œ(pZ" E„E/¼Æ7tÇi©ò8µR|áÙÏ1[Áüh«@nŽüsóÝ.`§÷ƒ³zN6¼e6çŽ48«±RÞõoN3üõ¾ºý¬ày­ð8O8 Íòìó€TðYvP4RÁV†Nj@›dfkÈÎEAĽÓfáŠAQ—ßÑ”Î4ª åc°axŒyot»AlŽÉŽ*x~apa ž’r·UƒœXiaÉð»Æ–`ù£Çc¥ùz}þè’ñýÑq€§| ï©Çb«²Z@µµ§Ó`wMƒü¨¡úÁÃAþüA…# KÆÃÓ‚Â’ÑC‹‹±‚»ôX>V”¯/)˜¡°€Z÷ ´Á% ââqˆàµ:K㣈§Ñ!¨·Õ?xFÞëOZÜôqT‚lžc)áå&+ÐÅä€,ĸ¼ÊKÿ¶ ¬×Ó|e>`#+.d$ãFÆ›¤jè† âX¨ºª¡{á ]ußâbº‰õ.¬ëG‘ªwá‹•ÄßâÉòý·êÿW¡$æùVýÿ*’ÄüO"ÿÏê÷ÿŠ$1ÿ“Çÿ³êÿU™$â¿1‰ü?«þ?IbýO"ÿÏ*ÿIbþ'‘ÿ_Õÿ§"IŒÿIäÿ[å¿"IÌÿ$òÿ¬úÿT$‰ñ?‰ü?«üW$‰õ?‰ü?«þ?IbýO"ÿÏ*ÿIbþ'‘ÿguÿ_‘$Æÿ$òÿ¬ò_‘$æùVÏI"þ›’hÿW]ÿ+’ÄüO¢ýuý§Hó?‰öTû_‘$æ­ÿUûO‘$æÙÿªý§Hó?‰ìõýE’ˆÿæ$²ÿUûO‘$æÿEµÿФqš!„ý?VÅE’”ÿè3EƒÝî¶›,ð=|ÁG¸7üÍ3[ ƒÃÇÿ‰ ä?ž¢%pîÿ«ñ.|"IŠ¥ŒoÔRå„ÉHS¤ÖÀ ¯5¸ ¦K:Å®ÿ†ªXÛˆ ÿ8A3bü'-ɪú¯D2ªyøù,ïä©‚;´[…HºT<_¬cIjhœÂH†ÓÐî+Åe›Y:œüx‹R$£Ñ1Fsà/GûŠÙfNRÔÊòÐ!š¿,Ãàç0Eh8Šñ•5 ¯- ² ˆÅ5 u–Òj\ :Kh’õ•b„—¥\|½-Q ‰Ñ¬VCqÚ€^Ò!' c=—7D‹¯$…kœÆ`¬†"|%ùl3N†ˆºâ™·!1Îj(’ó•³ͺ±Z„ø&Õ“V3j‡FpŒÁI4ÅW 8BT`±Ã;œˆ: «Ó0 ƒéZÃpdudž€r¬†ÅYPŽÑ°”¿œ6ÛÌBH¹ÛfAe8RÃ2  ®Õ°å+c°.Æl‘”Ñá:¡ŒŽ¢ÿ¼ŸÙ%mŠÿ«ì±¶!ÿ0öÉ ü§ÕøŠ¤yE£‡uJ½ jV§ÂáCô))m·Ÿ#—·w^±s øÓ§hdÉгçÎ 6ì\JÊŠ+ÒÒª¶lÙòÒK/ 8pÖ¬Yßÿ}YYYzz:È{îܹ¿ ~¥\µqéG§äýôMyJ –R8$¿dê’–¥wV7¯[pèÐÛ®î.3ö˜¾gâ¦Õn˪°»V¾ó†½qâÚ#™µÎiûÇ}÷éóïxôE‹Šö¾Wºom÷Þ|ëÛ¼UÏé4^ÕýÁÙŽºœ©×ž{\ÿLáµ·ßQ2ç¶Îú ÿ½Ã[Î.þ¥o}}Ê´ËRëzý ýih׺°åñQe/íhhç̹¿ºhñeÍ3ó^œ-þsäáÍwûâ»×jª‹îmª¶uÖñ¦…mÍWïm?mèÙ^ÿu öASŽ™2¥ã§§O55}Ö¬s÷?4°þ‹͇Ÿà®gÚwz¦S]ÅuÕŸŽ«_¿x×ÁSéÙ×ÿkÅÁ·:67¶<þk×Å›rÒÍíÍs¸ò¾{>œ40ý‡¹Wߗݱ¹kçºm;®ozû±77ÿ‹¾·eáòšQ#^Ñ÷Ù¶Ílj¿p†[Þ~~цÇtë›SÒ½–ñJÚš[ÞÞµºý𑹩uùæ‰e÷¬œÚíéï~V¹guJÚ‚ rÓc7l›rº¾Ûâ¹ûÌ׳ò 6oïºþ×ýk¸•£Úe|‘Z9åôç³ÎΧ§Ì~£è5ì•k¦Œ_62ÿÉíe¶œ®µv¾ÿÙŒ¦•­£¾™·í§¿1is&âÍ Ã§yõ79Ar¬´wÕ³c2{ÖU^Å _6?¯oƤƺÔÍ]¿[~gT.hÓ´µÎ½#¥ù¾¦M¯¦;µæ˜á ÌÕ2^X2œ¸“Ú-¿dh 3|20àwÆâ¢Ù9m~yä–Ík¯¹¢©KݽM[ï¹y ¸e·Òà­qàÖbx þ3ºiÙpf9àõW¹©•ƒa]ÿ ëzÞên#‘ÀfÔ ~wÇ"ë×S]ÌLÀºb½úÌ=ѱzöüÕ³w:f¼Þ§]ÓõiÓæŒO7÷ýmõêc'Úþ¶»ë†Ò§Ÿ¯kIùÀ‚Þ÷tØ;óÃoðâuº<Ömõôñíö.ýü­,ÎÚˆ5šÓ;OZ5¶®¥~ÌÂæºÞû/ß›VúÙuX鮥½öÝ8kï²»³Òj¿}’þÀLÛxàéý]6š¶¯ËÛ­ÿqÄÌaS¶Ù'íïrEÓØµú¯‹ßýâÖƒO~·iÝ çÇeûÛŒßùJqk}Ÿ£ß¼Y9}UÊÆ—×i¾|nyö=…;}*þ½¶k{ׯò%Îo×ܳçäÈúE êÖŽ¿ü×IWô~iã®ò5ûÿ÷Õ¡''Í¿­+¶p×¢ž›úLúëW¿ ÈNkÞ¶µnÒñ=?e¾oÉ×F,Ø\F4éòÚ?™Y1¿aýBãG‡8°ó£S?êõõoeÞ¡ùƒýæõw÷³ û÷Ú)MÛO‘êpmi·?žùrëÌSgJ³{7/>8°KSEû;ß»G³têì‰úæ]Ýß:fìûËî4íš){^:¶`н?,¼¼õ™MŽUw÷;‘²qù„%_Ù¬g»¬9°öÌÉ37ލÜså„ÛôÈðeÖôTÛ=sõÄm.÷óso¸ƒËëþÖ¦«Æ¼P¸qaÞ¼3·/=fúã»Ü™·=÷É–^ɨëv|OAF_÷îœ)·æÞøD×l}ãÙoûº¾´ 1û~¬o¹¦•1îà“ƒ×]™Z÷ĪAã~~cLËÏ™ßüþÉ‘œÖÆ›ž+lzüÓ”±š Ë7ô|¨¾åÀÆæZ:sn]WsÑɇ¿þãô¼þú_öeeæe­Z’þ÷µõŽí:YþΆžoַ̹¬ùåí§Ú|¼aÂÙóŒoŸ¾oO͘Ñ_ož?ª©£©í‰¹‹ú;s§rúSÅ{3Lumœ+^Ÿ¹ëÄç=»oœT2{bIÆÀ‚›ÁŒ9ïóåŸÞ?ôЦ¡óNá »Ù×nCÍí¨9ƒŽš™¦«›ÇLÛyöº7Ö¿3vÃmÍÛ:\ýfAÑÒÆy mûUÍ[·Ìš7ÀÖ7/«ÏgâvZ>ìùUw -+W–ÞÛ°õ}Ã3mœcNõÿ÷ÙmÛ=‘Z·ÚÙ¦á?ì½\[û8N#­¨ R³( H.%]JHJˆ´À.!½4R’**+)!JHê¢Ò "2´Š€H©,%¥tóŸõê ï}ßï}}ïûû{>èΜ9óœç<}Î33'6™åÚÂ)¨;ªÐ^çýûú¢„¡&!ÀbʘòÙTR¨:¨÷,<¯LST‘EÀTïápõMá ×.2_…æã!ênþبêá[²… ØœºKçWÒ2ìµ&âv<\äjw©B“ Ñ•å\<ÙêWxŽ9û3Gó¡Øy(†¸zwó\ËBrÞµzéà.9kË¢ë¾l:ÛnfXvÉ:UÕt&>zuÕ”¥p­O$« Gß¶ö]Ž :¢Ûþôù!ý8Жø8~áYXÈ̱ ì{òäè;:;šé_´Å< 7ÉžÜ0Gõ½?3¾ßòa"ÆœdzŸÀ‘ë»’$OnD%ÛwfàY™L1îK¯}©"ˆx"*,ÈBq-wçÇh ýðF‘æ ŠN'˜zœ•ð.v‡¹•Þgv±Ø1Èó’+q;Tê°Vát¨kƒc“CÅú}k°Q€ä×ÜŒH|—g2FªÑ1?¾—yüDÚ òèÉd 7¨*/u¸Z hÚ­%õQ»•ƒױ{å5+^Ä%Åï]믳q‰FsåK¢s2kH6{éÅͦéŽÕ—Ó¤èW0Ƥ',«äT&‹pDjâc÷Ü]¢54 ¤:x ÝíðàUì#§Háœ¢É ˜ Q(&l0Ó ¿­Ä÷1MIþº„¾ñ¢}|ý€="uLèn5Ŧm ÙÛáÙWsEù'n¢Ÿól6Õ9 pÛÒ]@´(ŠS‡^â>GôzG‘²]Ì^K{ñÃ+|=½í’'}M™fL®ˆåN6'Ÿèª’¿u½vBy(‰P¢< c/#/ƒ¿ê%PœZ¹E Jëû°[cêñQZìÊ6hÇzޱ„ØTnŵhWBä2¨W—|°^˜ÝlìÁæ×ÿ±z°ë¹ç0?=㸠P˜Ñ¼*‰D{%G^ïÓÊŸ»ø6à)gx3pã% *šLÍzx@ŠŸÕ0v™ìô¶ÏåFö—™­ÙîBˆK/†6³bû敽Qqð¨@îi`ž*UXô1/°2Ð$0kœ³¢½i5{È«‰Æo’ÐpYΓMf%‘¯ŸfzÑ«‰Õ ¢äƇ¼&çþ±Nû•š½ðŒæéè§—ÍoøWUÔ¸¯ذ½[Q½t…ô*§±­ÔrälÝìúæ‘gŸõ•]D;Îtê Å˰L„*”zT¦‰ù„Ï®^ˆ3»²c¹¶"rs>!p©+y’Ê8°¼Û¼_¶_ªW@Ϳ҇ãp"»FD|4ßœ¡Y\¥õY—Ýœ‰Jàï´Ÿij}¶9‰¾=û=BÚd~e r ß¡{e>¾wsR”ŒMë:®# ìaÞäP-»Y 3›§bëªÆž'Õ¾kñ ÕâB­Óœ'}Eذ‘Toç[*z–I)áËx½êéÛW'ž1u¬Õ1µ£,&fù]Øä¦Èdâõb:WPm¿ÎÚУÁÖçóö3{) š€^áT©Km²mÝSR»š`³R ÈžG·} VàXÜx䟪e C³ª€õ•ØÂšAcü™Í›r¯ttæQEõêÌhp¡©ÙÌãåh?¯ÄŽr^KÙyâ~ÖvBóJo×£]ækûGÐ^ Ó·è@Cž±)5Á¦Ý3{Ë'+ÌÞ¬¸+T¿*š.)Q¦w_çõèbÀ¶3ÍH¯Y¬3ºv9‹]`/ºÍ¾ÙÙÝ`m¶GÔëz–|ô

<Ÿ££{òå™×#ç¸å².îIÂ`²\}š;ÏÚó¢wé,Æ+¼]¥1lƇïUxßÏ}Ø¿]Ÿ°xÀØþœz¨þ]íUݬtfÀ혊a‘FGŸ|… )hr¾³j{AåÑ ßTLJ'±¡aZ> Ê€ŠGNs×aI9§º‰ ’NÃŽ'y¾@Éij´. Y5á!ïä—JŽ:Öh;z˜vüúUÂc%ðbÀŒ„PYë5B¬º G$Æ>5 wŒ¹|§Fص\ò^áj>ÜBP7†õ5ïí%+*4ñmßó/ *Zµ¸úÏSô1"t¶£Ä+;ÝŒ^cnav&2ºñ?‘æ@‚ê$>z57&ZìDÀ)#)ǧÕSÃg»5½í Ðú{I`³»øTÇú/)œì¼DÊs·§ñ¢U´;Æj8’z,$?‹m6&ÙÃníÅ:²`eŒ9{Ã0ÄèI1kôÞŽÊK']Ún\}ªï3šŸÙ¢æ¸ã65räAÒ>,?}IŠ˜¿ZU¯Â ®î Eu©Ñõ9.NgóÌ÷È 5NEÊ Øç™'ÁŸÿ`Aƒ€`yû²v#Œ)†ñ|zš0ÑR4UgåMG«y5!„wq1ærÿeôX;µßük îd VðL)cÏ!IšîÑT{"o%é2‘@ ¶öÌË5—€å1Zr" C9QƒÙ3UŒg‡SÒ<1´!Ä®Wè?Ыé¸DI}rŒ²Á–y=–÷ÔNþA(Æ$oäʃõÈC3XŸ©VSž›ÄXK³¢85)¯ÅùÄì|zø |€‹Ñ ïÊ*©'»¼Ë˜º[ Y€~. cÌÆµoi’³¸HÁõVŒE#>**È!ã r›)Šãu‚š6ÆF»ŽÖ5;WƤÕ䈟~´i“L"/ªê£€þX)t{ä–HÂ¥E†*Yà†%gL†B…:¦ýþ©üë×òeMü^;ÒE” XV‡ßè´A\ç 8É?fF?‚Íëëï§™Þ¼%_òvzÚ|Q²F$ŽM-Î:4–o]}U§%R±º¯0U3`i¹ïQayµ¬ykܪ@x x€bg‚ûÇìÁ"ú¢n³¦ºîG5Ô¼Ÿ|ïTaÙÃÒ¶é-ÌZ)ˉ3¬`Ï ‡6ð¾oîÔ&6PÐß>¿¾ëc5…‚k ÖÞ;Ìœ4z.E]1˜£ðkyqº'5J`ùÏÒ]+€1}‚KeÆÛ9Þ²<Þµ©ÞU2PM´ßŸ÷Õèê&©|CÌdzXÏXNU³48š¤GéŠrÆ´>t–ÀP]$Dý4O`ÿÚêÅBççv$ž†âjF¥ Ž9I.«Ç¥ÒÔQGíJ"»¢œ¨B7)˜ƒçŠi3«’,Í_]Š-4ÈWÏG\¯˜x¶ÎSIJ{O=/Ø!Ó†öÊöjZ÷kc‰ò™”kÎ{Éé.]`Z¬(kî " LuA»É¤æ˜ª§ò¢r†’b÷@ÞKp…Ë> ôây:Ýû,ÏÆrØá a ÷e€¸!/*ûÄØqƲv24)L—>üÞSÅNuq¹)~<Зk•Àtäì™ÞbÀD[Œj*tŠ?§ÁcàþzÿÑÉZÑ\•®càÊE¤9@áùq1W¹aÍæcsŸqä=Å“/ ;f$sM'øMë I>žFŸšæÞü”½÷q©y,Gcµ|ª]"Š7×p"ú¸a"§Ú¾q°¤²UxÆÁ—Û<ºœ"9qצ]gy†5CyŒÁž{8ýÅÈé±R³ÀËèöŠ}ÓbÂÞ,U!ÏîF—w ÅŠ:_ÔÊN;µ@±ƒa¯ žŽÎ!Y »Mûu¥ˆ¦ã¾`ôŒý¦õBÃÕ^™zgYâÆ„V¯zZßü¾'x†CJ6~©'#;£s¶Û—0‡;<¿l÷AifíUÇ¡¦Ý`¯Áa•ÒÁÌÓ#zF H1ªžÝË7§”nÑÏaÞrî ÉÀœ‚&¾;h1•ÆcåOuëRŸ•Nú¦Š÷]._$Bù\°®M| ÏxÂïÅoæ\‹`–ªã’Ïêó|¿g&ƒýˆy!ØÝèê¡FÎÐCÀ ¥j(›NÒ iŠg5U´W@F‚A¦*ãí¨zµî-³[—Ë z/UnD¬ h'‹ô@÷ðœŽ??93×B³éé¶Æx9½â+Ó€£A¤ó†°ùŽGc· ëiHb²˜D€¥Ô¼‡]G­®’×dMPÍ\!6ÝÜÎN9q‡/19ìÔG£7}•2͋Ĥæ>^ô+ÞÒžN™œÃ‰>1H±æþæÒÒŽ8#øÓ¦=(ˆrá"Ht;¾¥,ÃÏ!öÕ;öø2ÄIÖùˆüܶ¹fŠ… õûÛeU'“”hÁŠ_Ï7²€7=øµeÉ$å=œ7× v¤ÛÕhr£ ®i¬À3•Îzö®3d¤†úœjY£dÑj0*êš2^6aE²¢“]\H4~{‰8MÍMb”nÚN5ŽC7ŸctÉšàÂ> –W×ö”Ëp{øÞ,@Á©°·.š¬q*Û}^c€œ¦y6Ú˜ûÃ]ÄEÌ*ó•Cwª‚yv™ŽW?á){ßJó\t'‰x£Ì^ùVcÅטSðcÝëw^¼”Ëš€a;S.°ëÆöÑä]Þ…§»8³e¿r§á2²ü”ü ë&`Ϻ˜åò€}£Á)¦ù(ð8Užæ™úcнWÌÑoIo6¤˜Œµ‘¿ X J9Y:GêP› S0î»Pè;·º´Ç3”gˆWìtaQZfôØCæÚdÝA°¼MäeÍ~!„ÒPû¼¦ÏçÞK¢§Ã×ðArÌÁ°|Ù¶NFcyëb¡Úì>.ª6ÇÅ͇Áã,mM§2Èwœ%=±"ò­ü:0lâ…> ªá Í@HŠIY ‹Á @ŒÒG·`*áÕÎý³û†H,ÒóŽœZ8A¥~y2§£Jˆdeô ´£è¶÷ÕÝR8¼)—¥,‹&¹È…ñr•_N\9¾«rJ‡HNÕÝO·ë7ftÐm ¡*µ:p©“ž7û=§3àÖª£ŸÊ¿˜SD€Mç9Ç#p;Hjnä6Ò4·&5Œ¦ ‹[Á5S4>¦KÛ¨:!ÀŽ&í7’:Y§›¾ãã«À3M“¤,ÀéͤN•HüQÐçÕ q÷Ñ’qÔÎØdÀ€-\Ä©HÃâóûs<&Ilà¡Íi}·¢¯ßÑ áu{ g â2ß‹¥æ»Ð­!üûNC‘DÅq½ÎC\Ž00Š|LIF…&íµ 29ðRé¾ßðJÈnµ§«ƒó¾ëkïê"”o¼ë:¤ÞÕ9¾×4;Ò¡•æd"ƒO‰8¨zòHºÌe¢]ìUdÓDe«•³èz]—ç°?{)jLÂô`¼IPïKÙâšjt ÑÊ ¨<µ hºæR\eÓSÈrD\Žop¿Î ÷™ŒPµóD âæð„<_&Ú~…–¬]œKt³ÜBy¦6hŸ¸$C”Nǰ‰K×ýsÝ«Ø'°¨·M/½´‹­©†ðÊêa˺mçgEΩ(,{Ò_sܘ½‡Œaq|X7Ûy›ÒGíL·•}——Ö~L/:p!_jÉIç´\;Ý$:ÙµÜîœ7€„»1 Ãí±<Ä JmOHÓ¹ÓŽê¤pm.iÇ*@’*–_J®p€z"«®½“‚Õm±ØòHUîä›ì0èüÞªÖ˜>Ê#™ûIAÀnO¢ccG¥Azp—SPþλOÓ n1& c“¸Åm'Îë¼_ê™>]Ë;ÆÐ#‰0gž‘6^™é2“çËÌgº«©Èguý 6‡Àp’‰-ó½ÖÕ¼köøð8’§IõØ=‘éf¾Äâm¤Ì—D¼f¨ÑjhNéRj‘B÷F5ÐhŸ½(öETn³2t2ÎÊn –4(h¾yo‘߇Ž<}öº™VE¡QVz‰º‚I(Y¹ÂC´tzòšÒeÎé Ú}I»ÍM+Kð Ë.íC› ‚µÝégë>£Ç´*€Ý·Ã'îÃ"G&ÝÈðgv2ÀŸ´‡¦\òÑE{ë?2’n9%å‘s ¢C¼)ÈjK0õ¬ýÛ—í¡½f7÷òøUª*ò=-Š·A3ÆlŒ? µ¤%}ì ˆvt´ª€eÓgS¢”¯R’vg?­³f7$'sDÏ€1áLõ’uIB^¡ggKw¶ Ç"Àƒ 9U‰Ä” ÅûQÑâï¶;t ï Ý}®–ªÛ Nª¥d3N1¼2f¼Ñ"o›hí­ûµöÃ¥ñà©6j«Kw)0Ï•±sûß !AÕ'ÓyU™¿£Eø*Iб¢à¡Õ<x|p³5Á‘ªU)óæEAÃÀÒ¥{=<ÔÎ56o5ø[oWÈT©- ÒÂŒ•>+|Ô]œÿùY€ƒ\²@Û©¡r^SêeÏ _‰å·#^¤ÓÔ£+£Ar©¬ðÔdj+x&•$xωjÐÏäg =7 /DÊ41- 5ØÒÞèäzÉ„ky¼ÒäuÚƒ+åÕùV‰®¯Ü[YèéB‚îB=ü‰Œgn9íÏ!¶/}C„ßíÚ™ CŒxù¶À <{)AÖyãº|ﻋì1-lX~¥°—Ì{ù«N¨ë†öº·IÅ÷žùÏO½‰.œ4€ ÎîÚ‡à 2u1¦d¸ø–‘ƒdbVŽ•ï¿ÞÏ»8+'=ûÚÞWI Ëžò8F­FCæCPVg<ûØÕ¶Øú)ñÁø”cý"üþh×>m|¬¡ÚžI×6ñÇn¨É|VB᤹£°’³ö¹ÙY󻯡Ø8˜œ×,ˆxüZp¿5¸#/XÊ~¦ó%¢ôíÃʰ`ÇÅ}LʲÜ~îj°÷¬ªhA‘ðDšöÇý7_úÐY _Xá<ÿš©yŸO4”h;»ŠíOí±q%¤Áº¤Žt?½4Oy¢]粯kêA,Ö%¬ðØ«;/“^/”Ô‚n¨ã:g²ÐéQFüjÚ¨Û˜Ó®ÙßXñž‚R.@¯õR!ˆ‰#cª/ýà0™‚ÒU[ðýàðä]®°²éÌI0îH6tAW¸œÕõÁì°{1…3çvB¸‘óó ÝN  ¶÷Žûü“}=y‰~¾hbç‚¢’¸™®É§½Å¦ºÐ„y/¬z±òõ™÷¦ö|ÝT‰TÖø-7 ‡ î/$éÉÆ¦· µ¨P±¢-ÒV"R·E**`ç4-B_¼tÒyáZ­d•º{¨…”*^_¢øJŒ°¶Ò:Ÿ¼‚ˆBülÀ ÙL½¨ñœþ&XL š*ªø<§µ¥Êm–je6ƒ÷@ËÁºS-´ÎŽˆCIY¬'û ©îzU.RË5 g|/nß×"ŽÇ»–ÂÞ¡¥«x\$Õ2©A ?žzð2c§þ®œÔzOðtÆ1Û¶Â…C~·Æ›ã(‹™àÁÁê—¯1`yK½0:{ þ쎩S-³ÅõXµ25qkqìsBy Ã[¯£Ñ÷“Ú’ˆó â0ÉööŒ¼c+­fïÝL–Fc@oal¨àÅ›O¨ãeÀ§Kp]‰B/Ž… né"l&÷VZN©¸Æœ¦‹Çø™ÏÐü‹SãŠ"‡O*†ûLtË„kJä-X¦ŠãûÐ\}å ¯¾z}«øáÎÖ½@IníšÈhæeîHO…ᨒ$¡ï¡&ëÌsž©îAê·Ðöò"ÓÔ/) Ý‚¸žô®µ»òØ£0„,S6lZTãð>~rÖ#çò%ÐÈ„rMò‹ûãèÂ/e(©¥R4±ƒQk"®äe³Šëäí{zÃyÎÆótß[ bdÕì']±¬ü2ÏåÙÓ|Ã4ô5o‰£8µé–Éx2¾ø­ÞøhÍgÜÊ?(µ5RÃF]~Ald§qóx÷e8ÃÚ]J}­™îzåJq9ÚJšÂáAs‘K/ÓªÂ:nî æÒ…|\ÿ4+[“Må;öÄX£gý]˜ Ú¦›š3Ûvœº›M”×ð"+…%3 žUþŠ_»5•i2œr¶IÙ_C<î±Mn(yÓîà”f-yÕ¼…®°E¶:hW½$’ª’‡ :9ÎÂQ¡·T啚“”³ 䌪¸Fê0Жî©å±ªB56‹â"à)ŒôQ*ybCù§® Çq¤¦kÔNàrÓI‘’ÕØ9ÓZSHÞ’ëá2õ –q[£Ã~öÀ)ݽãoR|I|`SªV”t5—Ø£op#¤„&‹(ÒCu3†ŸŒ²ü¬rõkÐØXXté²)5ôH}jž°(ð-…ã•SËq³šqÉØù›Ü`9üìÔú‘'¦²&~´6&ç‘/R¹ç7`wŽ º•´ð.gÅ4ìõ”z3íT,+±×BÇsÜ=Í!®&ëݵ:¸O˜9GÌáè»Gxb> `=ÃE‰3ö!<¯oœküyI£Ñ×áˆqõDUž˜ÛìÙh/2„ß3F¸†CúÀꚈn™º&`.Í>%0/À„™`f ¡4½È3×UjT¡é 1{ůξëÝ%Š»zÑÞ´#O¬+9ÃÃÙCZ{1q¾'Ï||¯ÍSÜîS^·ö^ŽõgÃ>(£·¼€0¼–׿<.ܹïpŒòzcì·Ï1rÓ\õdwØ%¹w-r9;éÑæíaMºÜÒ» ·Eç „O€Þ$3Ž9ûÓÏ+N-F×3‚'ÕgU¬ðºð”lO-íTñÚ$a”?ÓšÔ*^h–žoÏDš*€mñœ{±·Ð£=&‡Œ Ã<@W:dª9È•?íµèj»*…/Y8J”RP–œèÑ'>”ºSÝi¹Š¨ÑÆ:°{,›Ü0†+nÅíy&–W”%Þw 7_ã–ã»rz}|àáX$~Œõ%]p—'1üƒ÷¡æÚãØ {æ)1'„žâÃKàIøkÉFïçú:ýX$ØëÜîüƨÌ#£hHZV-¸ûžv+P,ÖäŽO××x:µi·‡_Š‘{‚FovºøÖ¥6]” Ki>CCÖMûäHmbmÊ0£®1ùºÔ;ÆZX¾K€Íâðö$M¤É«çpðœf:óÆb–ôˆc@v ODŠ´"1hê6Õaló>C!ýá½qÉq‰ý¦æÍÇúF–-«£Vjë²û¬]½W¥oì rzd€ ™ZôÓZ<õìT¶ÖbQüÚ©B¼2cØ€“§ìÚÚÔ›>|ÓVæà,¡ ^÷L _Iv0t"ÁhF«Þ¼F6@ p4P5Š—Ï)ÂK¼¨hö\àcÏl‹WÞ¢»àÑJ*Ùf‚1¼ Zn3%¥È™½Mñ¾‹¨ç°ë&Ï33&ç÷;Q»Œä„ü:'@”¬Gûå‹2 P eœúûÝ@SVúiÓ ±ÍÖ ÇçlMM²Ï¢5.³ #ô±±çe”%“v t°©U¾^.ª]‹CaõÌÚ…€”hÃD¿r)nãú7‹qnhÅ5XÑ^1Pm#‚4«Ð„µój1®<âYv¼öz>·Î”¢Ò£Ä›ƒñ–¢‘ÞŒœ¿~ŠtqºRR‹d)¨gÔÈnܾçÿñEhRW¥vºþ9“Æ›ÖYA¼ËïÃy¥ j¸ÆNTœœz£ÐÍ¢EøµÕøòìѱé´KãIôÂÇä‡Ëpæ Œã¢©Ðe;yÆ3µP¢Ülì*t[‚v¢IiÐn†¤‰ö•œ„‡¼náÆÌvC'çY4>Å7‚½ñF˜IxÚŒÏçŽÚî±u}:ÕsÖJmjtßó ¶$úÆhˆ?ÝÔi©)¦!”'gQ ð§ÒÊoï(b,„䟹’¬ï‚qŒvïí5oªr|IlX:Õè!¿·‘s·A }°4›<ÑGÀø)ËýìÁ,ãeJü›@ˆçŒH®gýõ=ð{BÄ!žjù§)†ovL²""IhCr.Y:CX›ë±ó¥_½RZ3UŠd-TFr‡Ü“"× ÷¦<å,Oe”N©{ñ!W¯U¯Ð‰³ÍPè‚¡ŒÂu íºäê¨,]=OiG²îZKñNÅv ‚Ÿg¨ìÆ.œ—ØÐšÈ®µ>~YtœþÐó]Z`¿„CÊý1$ú„—˜¶luüŽ Ò 2ÔxÑkrP@…]åw¥Q8yÈ–=üµQ"gtÁ@,ñ=ÚZ›ª° qä#U¯d 3Zž|ˆA³BsOå΀“îÂ>L™„¨‰ÍôS݃ˆÍ)5¾ò5d•e,9‰— Ÿ5`vÇÎe9º»Óhª2*ôîº>»'¯ÈšR‰ôt¤Ý—š¨ÑúòšÑr"o0„ˆ>4ÕÜ$ÚF¸§ñ2z>¡ƒ–Û¸ æ9Úf&<¡Ó«A;S9ðj„;ªëzö.-LzÙóè‘îVvMÓ1”ØLi~ëÀ¦š#7¸°Ê’8HÌhºÂÞùã§ 9÷4‡æÂ€Ç…Ì1orqÿÄþʈB/qìBÐ2Eù²}eÔNlÓÈêÒàŠƒ×|`Û‡¸|5TðŠÄk&1›‹n$>®Þõ½ñJR¼ ÷èêwhcÂaþÑaÅ5ÚMÔZ¸_™Éó‡•Éüü¬|a.Ë“è ‚õC†o¸ÐzÞ_Ör#W;ð€tfIÁÞù8QщêZÍéäÁvˆIâå‹´¾ªÕ’›Rô‡¼äR š¯Ö—(«¡^úV™ñÆ÷4Ó½8ï!¯tùpù‚¡µ^¼UÕã¼¢͵¶t—6I‚ðÕ¾ö鮣:mµÓ¢çoLï5Ùx«aÙ0‘}0sW¡OeÍ>CÔ…Šö¬L‰Xy'êkm€³lU-c¥:‘ÝùC“ìù ƒ¼>ǨË“aŸDW…¦d½¶òÃ`íSdèínÄH›mÐͯœ‚¢öv¸OÈ Ù·ì@»ºñì"³é‹È™A<,$g^¨Ê.BûÐzyÏ`Ôøî•!ã“ýo8}c™+»Šã²#eijü¿,4ðT`1>DÚ|ð¹‡á [©Û¾çùËÞ…ª¢áçs…oÕác€ NQ×é©5îBo'|]Xž‚af:šSA-™›usšòÚ3g N1ã-[µðuÊAðlÐø »ôC½šAÞ²CÙý âäe%ÑgL‚&Ä+‚`ÝóöùÕK¡V¤ˆ´: |Ôús%'9šÑîÊL—8‚‚D˜ÄÇT`ƒóƒó-®Qîn oøpnÑ "Ï¢½ÎÒz,.ÉÔ¨\l™@œ–Ž'Ç—Ë@¼ZÎ~À [e<¨» uöpþ1´òÞ,bnOS£~É€ejƒ¸ÛåqáÐLÙA-`Ä®3ÊqN3‡¼ÌÇ&ˆºSGL3{Ž]·>«ÌAˆfÄ—SXX'×ï»o²û^NbR'Æ Ä6´\`I">áØÝg šéZ·]ð1˱’ºÁ‰ÎHbä*Þ vW*LÈô“ªÔ. ™àEÆkì`Ÿ¼–³šöÜLÕöÚÛ-I»8*‚åâŒOîMR ÒGGÐ7R¡ý3›og¿?~e ßðˆ<ÙÀ¡lA§hÕgC~7LÑ+ãÖ`jØ ÀâC"¶·3*#xf‘#¸¢stG03Ú}äݬV­…dˆ†‰B”^ŵ& +º€¼õÊûŽhÒ•q>Pf_ñ©°£ëÖJOZ¼\æ²]bOŒçΉÞÎH26J~W§µ c»ÉK6z±cÁ 4 Ëü ½YùL΀”çyl;¬½÷ÅÛ{’õÒ`¤BaùÍÔc˜@´d¾¾òè1mУFíe±V.ÔÛò8 ú.‰IèZÉý’•½ rtQWõê†)w”½=·ó¾Cþóƒ0«û»DÏ5asÙº`4\±¤rOMûN)«Hce¨º¼_ 5käíBµ§Uhl””fd£#–Æ¡ŸîèwSàkS•›«|RË0+ºy‡Má%ºOûYž¯ŽnFø&Zæ‚?zuuü9ºÛuç1aYñˆÊ#•uZãÅE^%K YûYŸ‹“U[µ“|P¥ ž¡‰¢çtç;W©•5.ä·bW…$GÛGí³Šf!¬¨cV 𠸳6´Ô²:ÙŸ8:ï©8rðM;‰F•©$o}fý#£DÂÃEóªÞ5÷µùA1YmÐ:„ô/ßÐî&-«©! iÖß7ÑÃ1µ°txq.4Š5ÀO¹«¨}©~ÏL¼†ÑÞ]àÈ’ì¨ Á Ð ±8â]ò®sô lñýÀ±!Bìcü ÂÔ­Ý„s’Y¯ÊýjÑÿHÄ¥îLâ@ïâtY"£ýE'½K^¿!>WaYÏgÈ6^æmÈ¡‡n˜ÔwÌ/tqÙ¹OT&û%#*{ßôµGÔ·³›FÝ®€"DUŠBb,ëX×±5ºI‡ÌPÛôTïkS˜©PÚÝ_<ŸGº ~ýÞi¯ùk± Øñ|õR_Ûˆ)ù2ª²’šN¢²œÖRpÏËúy²êºÊ¬æ3] Q»GÕë~ó÷dÒÌ)î¯Ãåœp -£ ñRê=·>”NaS7^ÃÁç9ìßåy 3ðºmcM6FõÏU²ßŸH¿ÑtŽlÄ‹uϼ4‡ìÞQ–]ó€ ¾š·Ä«7]`”o‰Äl$©òâÇÑ« ƒ/E§ò…]˜.~g`Ê©rS6—àÓÚÄà)iD;µ1âå¦FÆ-ôYŸ^KTÎôÛ¬ò0ò[m41Á—Μ¼ÜUõ’ ³%Þľsî¦iw‰ ,8ýžF›?(=u“cQ iû0YÉvvüÎ ºGMP½S ¦ˆZ’¦¯ÅüÀ=ħÓD-Üw0ýèR0ŒÐ?s‚±|Ö6tâÀÐ!¹¬÷b@ŸÈzõ¥x~ÿn^ôõ¨q=:çb*td½ÏÂÁ!F„N«…ç¬+ƒy|è‡ú¸ÇYN OÎHm®ôÆ/¢™£žh[>Ö”‹"6Q¢SZ¨â—W}öî.TÇì 5^IÿºÑ݈²¾LàìÛâv~|Ô`_Åtq ã,ÅÌѱ§L‹ÝÝÉ !z4â4eÝÙ ²9ñÀ %æe€4Pq‰LÍLž¥³âæ: ,H¡!Q-ß}—qýZý\ ŸG)Ÿ¸\ájzR~VÒµ«{ŽïæWH|´i¹$;‚(Q°Ú¹~ì0¯iÃ>Å Æ2çv”-]©“•ÊŽ'”r& áËóU)+®“h샟ÜוBF‚Z6½ Ù/fR†b£kÜÏôáéÚÉP“²T™!ÕÂÓÞÓž,ƒ«RÞ;ÊìÍw‚zÀÇÂÈ3Á•=ˆÈ(ƒw%ÉP}™ÚòSåŒ à©—ã¥Úâî.92 Ö)t†žÀ¢˜‰ˆå$R h„ x¬VΉâ.+ª¾õÚ‡M1Ýt„–íUûmÒcÌ7¢‚~y(§øN.ýˆðInã[S++l"3üI«âãa!OÄj;¼ôX.=æWa*}}íƒPrTm »ÐF³DD$ðKs —{‰¥Âž®.ìB­öŸe?µhg£’ uµÐ4)ž…§ >9¬‹iÖåDq‡¥È¤b÷ÖÌ·Ë.%X [•®›_6µPN; #‡Ósûoâ=”=9‡ö ç4ý#LÜá%Ör-ÑÚHù“Wä ÇK8=¨Xö¹yŽtÚïŽY3•œ.ž]+¯Ë{{ªûeïBwðò ÏÑ3Wž–Óòõ‚!g3‡ù¬wsâùôªñšÞ-LcG0¼¿8%_ÈÔ·xAÁî™Þ1…°!29¾l±Ó//³´X1M¨0Lˆô¸‚>A£ªÑÃ"œNTæRÐd¢érÕØÂ@ ç.ÐÀG•UL¾‘鼨'º‹]±“{:TÁ—’$ð $íÀb6÷'\ãn•C7ÅEÜ–ã»%°¡œ*D‰=Nü|8HʽW7/ó4ßE%0òq£S­Ì˜òX„‰ÿŽóL9¨ýioF/šl*äy!·0+ŠÐø¶Ÿ39ÂÛ Î—ÚvîE.µhÃÏœ ße‚õýÅ[_káF}ʺׇ¼ Üä&C´õοåÕz‰å~ÏG¥EŠºÛ`vUéha=vùÑL Øt‰˜ñÉ%3g±È¾ÉxÒÛR›ƒÇhÁk Ã'ıáÖ»Rwb7‰'2>ˆò'ñ)3/üÐRO#[1ÞUYXòR–ù¶ˆ‹„Ï‚ô-þLĆ<²J8g/xŒÊ1OŒ”ݘ?)¼aûÁX,ûèÃÜ5æ`J›ÆæùÕ©¢“é—ÔHîUÁ®[š´HT‚¾NÝÌ’J§ÁœÑYLËÔ>Ol ŠÑøw)Gݦb?"ñmàA¨ðiø¼¨RÊJðZoX/þgQCb†ÜCl¹ed†l`Fúl)=Zå h ê¸J™FP¾ÃÄhÛMÉÇSv¼—BìHh©eSr’WšyîÝAù“¡¦§È~½—¦ÙÓ€´l wG•ùÈ«>÷½ä–dÚS6–¥Mu)Ë6±ôr,ÎÍëu»ÎÄñ •šàž •ºÉîã×Bà|ƒù͇͓ÃÎýí±|2f)¢4ô5Òõ¬]6‘ ®26x‡Â~+„΀¢”º WŸ„$^u_!ØxqÂ]S·Xïì™,-n(±áûÑèš匊XûªöYXTàµwèkÒ‡M}g”éèy²ŽKÕoÞí™-Ü£"o Øàáa]gÎÍØ&´ÀJZ¨ƒ6?X3ÕÜ_®I¿?(núâ~Å[l½Ë+Õë+].áRÈlt² )PçNíSO×ö1ê‰iýê“èûÀÇÂ$VS)g¦L„Kµ^/N²ZWã"—uLN°öàásâžàŒ0CG¶ïÎ+{&«/Vž{ÊdAÄ€îÆ—Y[p$ðY~»;díÇýñúÕÅgÃÉýn$ÂmüéO3Á°»dz ¬5 ©@5R@Lãó6žøU t] œ)&|ÙD |p’c9)¼j×À¢È¢#|–ÌGåäûs”/¨Ê½žSRu_|Ô–ª8e*bŒI'0Û"Ó”Ÿ2®­°ÏQ-ÕØÔ›g{R‡ƒñÁ°ü±p7ôÙ=-g”´ý–8Ȉ¿½|À…þôÔZHk>Ü¥î¥{·­“T_(0ø€ìí}ðYCÄPF1ÚUâ\,Q|qHöèQ2Y¸c߃¾{­SËç´¨Mw¦¸ý¦•Txq¶V›W}5ãe&ÌJÑÉxöpdZö, &1ëP5btÒ‡ˆ!ùMþ¬{Èz¸9ú®g«DäУìjxg³¡ù]©5õr`¼0}4ÏÙþp|Ħ‹t˜ú­ÈâÂCQø¨ª{.u˜+­»ÄGÅùaB/^ŒŠ>6ô¦a˜=aÛ¨uóµETÃC.¹, £ÚS%‚²l¦hÇr”Ä:ΗÇÑ·cßȽ( ¥;dQ'#„)5Y<ªtCÕ‰ÉìNãg¹ê'ÝVÈÚ¿ëxw·ò´ú ʹˆÇ\ðøDÔ IˆmˆÃ C®¾@&!"&t™ƒè¡I´£Ãë~­P¦D8ÞˆQC'jÓ@nša°æ¡ŠÊ)‹ A3‡5w„%9;„öа*ÄÌøÐšœ›H©)™À w‰ë)±¹\Î’WF_³¼dBçe1‡caà^]jôÞÆØ‹$G’ùOàÎ÷`1µ¸ß}“”â[øïҭ΢/5Ëkr¹Åàªl(Ü’£zÉÏâ [5çN­iOƒÍé÷Rd­µ…ˆÁˆ=ðbË'ÁÇÜÎkqʦôúyìæ<×G†-aІ ÝéÍCçJͳ¯öÅ<œ’¢”Úº`Ž¥ø0½³¬2sôdL!òq ëŽÇó å9'µ*ù ²~éȹ”S¨ JÀ˜MåÑïá¾ÆCcóßÝ—¬jâÙz=Ú¬8LÞ’DŽ#D•=ôÓ)G]‹xÙ@ÊÿNÓÍùMü&áô\±–äÜ'[Ti-T8ü·|ÿåÛïÿüƒ¾ÿþóûß?¤|ËÿÐ÷ß~ÿõ‡”oùÿúþûÏïÿò-ÿÿ9ßøÉÿQ¾á?òôý÷Ÿû¿üò-ÿÿAû?ýŒÿ~Hù–ÿÿ øÿgü÷CÊ·üÿÅÿ?ã¿R¾åÿ?'þÿÿý˜ò-ÿÿAñ¿àOþÿˆòíþßÿ øÿgü÷CÊ·üÿÅÿ?ã¿R¾åÿ?(þÿÿýò-ÿÿ9ñÿÏøïÇ”oùÿŠÿÆ?¤|ËÿPüÿÉÿQ~á¿ð„÷¸ò¯ñ_ÇA‘Ÿñß)_ó! ðOÑ¡Ÿñß)ßò_ðÃáŸñß)ßòþÏáÿÏøï‡”_óÿ»ÛMZ¹¸líËø/öcðïÿ'( (º½ÿ³ˆ€°ˆ nÿg¸ nýïçþÿù";ª¥¨g¨} PÑÓP´õÔU6^~~!E~þ£zG·/ó z( '7;w;g' ~þcšl2äR8y‘²EZ d¤‘»» /ÒÕÃÎSšMÑÙÉéäΫçã‚d¬¶Ï¤ÙÜ‘Þî[R'iekrCºKÛ¹9ó9""Î+ˆƒénçÑDzºvޏ-(%œdâó“\~K>H*%;$ ³µ­“Rй”ƒ“=µ´–fããã‡þÎÞ>6H'>+776…tfss÷q€ !‘îl€;„ç'ôp üÛ#³tFø@g0^^@é„DY¸#€¥pt È'Ì' ðòBmvž€•ƒ…››4›«éÍ&#eñ«šoPÂm®»¥Vl2Ð!‡“¥›‹¤¶… 4 Àøþݶv6(+[ŸO qM·a¨|¾ô—á6ÝuÇë·€ÔíÜÜÿ Ü6ºnŸîDZä_½ÝÃÉ ']n¿EAéh )à_cãàliáð[<þ.ý?CÐA:àèò c¶@HñCœÆ)€ Ì¿$šP{=[$€#€ÛQÕt>áX;£€/·Ûð[ '$È6R–(ò¯G:|‹4Âzˆo]…´ç‹òènÁÑû‚Öö°¾Ó7>>\GÛИ# Ͷs€4BÃ…äããÃ5 —rþY9#2> àpõpv—ü†‚ü¤ÈŸljÌëæì²B~Bó‰k‹CâS‡ü[hlÑç_Å¢òëm–·÷sþ} kW·Bü1ÁßÛdû÷{Þ¾üW;wp—tsGØ9óÙrØü•–v–±) ’ÿÔ‰B9ýµþm~·÷-éRýÔ tAB:êd娠,\l·ôä{Z'Ý-e9$JFÊÎÑpCY}!=òWûbÿ~¤óË~Çl€¥3 DI³ °PàháéÄ÷º7‡š°¯ƒ¬?ÿ'DÈ¥ jÀÉÂò1z7ÔÚ…´øöüµ-ÁÙ7[ œ/Ãí²ó¼Ð )âá>Â#"ÿ‚âïõ%º5üµ^|:üˆ n·n!ñ­Ýº¿ ýû{ÌÿQ¢pQ8°€0Ðñïvðý=×ÿ 1Aø}p{ÌÿúüáòD~qQaQaQÜÆòßÿç»ÍÿQ'b¢ô}#±ˆ-¬·.kAaˆŠ¶ê/¨¿%Çа>AÃÝy{G7>Hg7;_Haqs@’8·íž¥Ù,ìlœ$”­»$tÙÍÑÂÁAæ—É%Xú'ï‚ࢀ °„Ð !!Ç©­¿™CSÑíÙ ùYÄMÃ%øù½¼¼ø>Ïy!éâßšê|R òßDFŸnÅ<[öäS î B’p;Âùu@´e>Í¥ø·GUmg@>M·æû2äÿíõŽŸåÛòíúŸÐ?gý÷gþ÷‡”oùÿŸÉÿ[üúÉÿQ¾å¿È?‡ÿ?ßÿû!å[þ‹þsøÿóùïR¾å¿Ø?‡ÿ?Ÿÿù!å[þù¯ò_.,*„»þóùŸV~Íÿ­õ+ÜâˆâßÉõÿ^ù~þ_. ý%ÿ/„ÓQèçgþÿ”ÿüÿ'¡¶’Â?sý?sýÿ\ÿŠ!tmKfpRçna#ñ¹ÇO7°á$ÆÂÒÍeaåþiÜÝpópqqF¹o-„[ Ü€üßɺ;üYª)È¿ÝÃoÌîŸLýç%çO9ØOéW[$ÊÎÝ€°³ØZQÅ­=~Òw“¬GøÖ߸\êg ž¹ùV÷S«?BÐ’ÿ·÷ý’Výµ-hgý.¨?ÊÅX#¾A\ã‹Òþ~*æÐaAøá#ßOê @ÌûmÎBÏΉúÊçþA?‚"p!8.*À#"$ú§éCäo{Rqv×õ²pù^/"¢<"Ðp ¯Ìƒ{4﻽XB ÿ¶ƒO ¸ïçrEyD…x„EŽðˆ‹ ü6õY°¬!¯ñiÎ&c É9ä°m87âìò+c€s$d¥?[¶íœp›Jñã@ý"&R¿%RèÆó:n[‘O°p¶ —Ÿ°pp>_Ù²Oªm» "®©ÓÖhqI0\zMÛÃÒÁÎ Ø6j€ÒgÓ¹•aû=Û†ÂQÕ騎´†èîäìQçó:þVÚ ðütŠ£äWž Ò*[gÛ'²ø´Èÿ­uÛ&Àó&!ñÅÎmÑÔÇQ” ì×–é#ß6©ÛØþGoñ±tvwwvü¥ßµ?Wà°ýT±eüq}E ßPt³Ú¢Ì ‡k°œ Ì@ÖÛà p>`‹3ÿqÊ þ;”üBy+Æ€Ë'ËïpX8ºHnŸñ@âê ‰1î¡‹Ï5îz¸Hn¸ÿ0çŹýït)²•+þâ?õ' y¿_†¼Õçö°ÿ.‰Qòppð\= ÚXã’œV?^‚àI‚~%Bð_+¯§ÊÆ’ë€ÿŒEþ‡8ð‰B[rù£È$Ä&‰.Êýo¦ÑLÜsŸbCà«'Aq}n Ôÿ:í å7°°ûD:Og;À½e_Pž½ øÛO¹ QŽvN[O |MKáÿ-ÿЈü%K ê¦ãáäd‡‹Ì·MȯMÁd„ó„þf!G!Ý=PN€õÖƒÛ’Ž{ÖµÝÛ2Ï¢‘)¸)ÈgŽˆþ79"Šã›ÿ; Ø€c λæÌ±ãw‚eœ7‡‚å3»m÷õ¯SòÛP‡û± ÇÊH÷ÿˆg…àþ¾Ë@ |ßÌýÞ|åìÍ¡é¿3å±ükSÈ2}RJ˯¦;ÒßÄLÀ'çòc8ŒÃBëo¥þ.î~Y¹‚ì#Dw[gnùÊrû >¤#nJ½µJjekç€pûÏÄV8Jþ(:B“‘cÞ߯chð9"@~í}¾ÒKÁYg>›½¤:Ÿ,ßnkH¸¿¶]Û»X ,ÿ6Î8» ~‰}¿æ‰õÿÅŽÉ»z‚öY0—¿fÁ?Íž?™1—/flÛ„}™{ÿ ã°þŒÒöºûߤnÛÌÜžúy ?&ºsùkË7ŽæŽ¿Dw.‚ßràÆv8t·qù[Iò@Ò[³ÿ•xîïeÀ_[ýp4ßZöùÌø·ø–•~á8º}îõïâà@ܺ÷W®ê×ìû?¿&òç™±íÄ—í¶aý•oŽ:[yàb‹_ þal÷×´çü?w¿¬¨~ ¶dCê—÷l¾ÐMwú« üw2gÁQp_Ñ]ÇÙ‹m»waö÷³ _?Œÿ鯝€>ýª‹/*õm…Ú7þºÇë?†÷  C_‰Ô¿÷_¸ÇIÁo»ýPB:Ê <¥ø¡Ÿÿíþ¹þ…QÈlçcc—Ïþžø³š~~§õ8ÛZóåx[w¾Æó×jõ‹ |a¼ÈoÓLß Â×òõ¹³Oo‰|K’­ë[êõ»aé½¥‹»Ð-nß¾LDþEp•û‚:ü7¨FdÛJ}kÜ?›¦okáò·LÆÅÙ—Þý@óiQºÑù•µúŠæÛï;}ò`E-¾ú2ÙþdJ¿N‹ý?eBþÏË Ào ÷4Bß³"?ÚrlO§þ·¬Å·+>d&t¶”ðW6â+%ýíyûðßÐÆ/Y‰ïkãVbãó2ªÐÿËš¸•ývÜÿ?Q¤ÿI¿û›ŒÛ¿¤LnVVH7·ÿ› Yÿ5‡ö7³øU`¼½óÿž:møþƒõŽ·øôß ‘·ð%TþßÒÔ_-þccã_8ü«ðøâÛk÷¸Ñ@³ñïÅÆÿ†G×ù%E°µj°•Îûœ¼ð_²P¸¬þg/ü+ûô9Ãÿÿž…úÖáãhðß²N8ÿOáÿ'ã‡ß}Òäk›þtÞþùSõøz ÿ·Ø©-X²Em}¬ñõòâ§×@Vm{­ÒË °ùò¢ˆ5ÊÙqkõÄÚÙÁÁÙëóÇD ,<¶^RùÞ,ù/?©ÿ'pü¸Ø8Ÿ?ÛúT±½@¼…Òßý•øÏ¯”üÏ”oßÿÿǼÿ+òóûß?¤|ÃÁÿò÷ÿEÅ„ÄÄ~~ÿû–_ó{…V…²ð17·‚\Øç—µÿ6;¾ÿþ/T„¿æ¿(žÎ}ü|ÿ÷GaAa1KKAKk!A8)lm´²…[­ÿÛøý,ÿÙò×õßÂåßíãOõ_Pä[û鿘ÐOýÿÅÒ ‰[,A¢¨ÿ…½?˧ò—õšmý»}ü‰þ‹ˆ ÿZÿá‚¢?õÿG” ÚšÊTäûqªO¥ªrTúõÅÃ#`%"„Ž4žwÐC?œÚêzÇ667¯Á[ŠŠŠ ÌÍÍeeekjjXYYoܸ1005ÜÜÜdeHa…ŽðÝu4uñä†_YãáQP=*¯ç2™Òr²G….hu/¦í@ófL„p=MtéÆÝû_Ü™xt/%4åZß›wú2/ÅOŽs£VíTœ¯ÒÇ\}sòöqÛ˜œ#6—r¢MnLë÷O§{íE¼®ÿLV¨%¥¿zõ¥¾¼ìSÒ nL6'ëjýòêŽÚe]âuªgN>#6}Ì7Šû3;^~þ(±é3Ü_ÕÁ«£ÙRWmûùRϘ·Þ¼Á£$kT}*¶“Z:²ó†¨ô:ö‚ä„QP€oZ`ýý9â'ö×ÜSìz¡u¾T“Ý›c=j?jÎ7Zti£ø&+C_/«˳ëw+ÄÆN&3&Oõ½Él+é|`ämã[í1á,vcpRÙy‚áÅó{"ì¾´"Q«'ŠÃJ ÞöF³lf»K=‰ðîY©îÆdf÷èÊ:ÚNN uËËúè„û–*¦•k ô$\õ¼3}À‰4îÊ‚êD·kN‘ܬ{Ô“Ô볬o"Åý³'?%˜{cîj­R»8Åv¯š—ù˜AkËȤ+ß¿>¼}äz…“ ž[Äf´0SðÔBz¹I‡þ­aJéØ9³ëñC¹…Ü"Ï—À´[Æeå··L¿x1½SBèüz{®o–%öUÏÕ<7‘ËZõ¼¶À1ÉL¤ ®*Ü:‰[D,CÿvCÁñ*;Sc¸Ä¤Ø17·ÔÙ>Y{Z.ô¿n›KN±A‡«aӠɪý|tmQôòè½­Ã}çKØÛ/G[C7gŽA%´K5M‹á.öÑfûÄÀ¡£ëÙecêTI)ÃOg×Ä4ݬÊkíªáý4ÌG7åZH¯°ûïi¿‡W¼ëànÏÝ•iëz[—ªÏDù ì¤pX¿ ¨g7–Ó¥É>Ѭîo°Z×óÊqq!oÕòUí!éûšþ‹×¡;Zg1#+-i㬠Ä´eŽ _”Ð{þØÙ¨;=Ï€ÿ¢BÙCºÖÔè{ö/Åä4øî4T÷yé’Ul”$K9É{©Ý½ž6èÆÂtÉuÎÑ8ÅM~tœž]Ú~bˆèùÒ£$õW¼vK-Zù³sÔjíRÓî½ê¯ïIÓ–0V¦ 8üÚ*ÃYǃ¢fd’C¿äÃÙNÚÛåaÔ`TÜÑ\§·‹:Ws—4æöŸIVéà]›zW=ún«¥ÌL²^ßãénp7îŽâjÜOZq¼J‡Û³ ¸ >ª¬Éi‘Ïv8M{ÁƒW¯_|s2@Wí˜ËášÛ·ØJãîö)¦v®V‰¯r/ó*¥^‚¨UìÞÕÛè|æö'G[îàžÕë—Þ,pX„ ‡Tk"+XnÑ…9tµÕßW|ÁH‘•å3ê#F²4Žª#Ʋ‹µÂŽe,c@sEÀTØ£úaSYÖP—€}tã#QaO•ÛÞE»„³tœ)6w¹ƒ„Ü-lö>¯{ +X×Úª—ÞW5ApDÑŠíò=ÉÞ¾ ·€Èj‹Q$ýøo<ñM§¡‘{ɦxmI·W¼é øƒlŒÒyƒøÓ"ŸKÄ:sÞsÞ÷yŸïsyçÌyŸ‡Ý0?ñ§}•Ê‘ó[ïÔ+ËÅ3÷?º9U¡Ç t’¯®ìÜ´ì\õV¹Û‡JX¬s=æ?ui°Ìà¾iA·~l)Û\ :Ê©=ž¿A>ÿîuÕÝ›«Y™S’VWçî\è®oõÝŸQ Y:Ç =·á}5â»h¿Üì|¿åý}™ÐtU™m«SÓß3~¹ šì{&à&¸±™ Ÿs^i¯¸Ï+Ë]AIg_+_›[).Ñn;êpÝΦ’·î»Àö;ð§š—Ÿ.<—ýí#ðHêár[}+ÂÉwàÃ:Y¼•ÖHáxh¨¹ jèuv| H<ƒŽ ¿"ZU%ÍJ~uùûÐÙ±‘Rooî_`R¨»Ö$¿Ä?p¼w²ÕB¿á/ÓóX·¿T&ÛzT×y˰4tšSrs.ý®Òjà ﴧC NŽ…z&-Íæœ M^œT~©Ž-Ѱ½wlâùavÓ”›—ón•¶}ŽÆe…»×x¿|òWŸck.üç\OÀ¥·ù?¨ Þ§èßµ½Þý½ûºÓëX|pð>w¨õƱ`vŸãÕ:Û—´îIû(²<î¦ÈÒú¯ÉÍMVŸ5t‹õ?ÿ÷¿qTÿuâùÿ˜?þã¨þëDþÿ1!~üÇQý‡‰üÿcBüø£úùÿÇ„øñGõ&òÿ ñã?Žê?LäÿâÇÿ?­ÿ€œ6ø9øO¼ÿ5&$ˆ¿P ÊÏßAý‡c ýûƒ Ÿòÿððïø‰ßÿÆ„þïäÿÿT ÒKMwÔZŽZrª«/›(0Q` Kðk"7óÿß)è«oæï¿b m,èß-Ë•›Yü3íre’ÝàK!ýòfR8ÛŸv…Îñ¯ÜWÞ9‡œšHiÃj£–ÁI«ú{ƒ:öfzÁû#¼˜júê4WHR®('§U&ß9­5·r26·2wZáä´L ¾K_ _,Ò/v¨~yw524,AñÈ220‚‘î‘»AAYá6ÏTÿí^LŠš>ä>¨L¯kþkà*± 7: º€ á®f¤ÖY À8xdüИðj>¨­%¯ð†ÔOmà9þ¨D¤‘(8aÒFh0ŸÚÌßSc›AÑ}†ÔÇèÍ'é æoãØƒÕ¢¤Ï¬“IAʲnè$w¯ÍÀm†Ôvu*ƒBs¸Do¿¯·¢·øìØØÀÖ`pPÅpc N‹âJt™N2‹,Œ § n!Ħ€¡mj„;!ÄÐâ Þƒ»‡ Õ/ÆaÔt®¶aìõÙ’B¸f@W€/ÄÈA#ûSÅ ^‹B¦ À ' røàôÄ ½CM{$³~,ÁÓœauØ›“ø“·jd(ˆxá‘m`Ç 40t–3®€c ‚¢FÔL=¼™4_N>7¿:üà‡ŒÃ P(NH€%`Cu±í߳ʳ&ÕE@ pˆÃa?¿ÛœáêeË7 :%x;â~p 5´(ÉZñó—Kû³ÿp>Àõ‹A´¥ú°¸õˆ ¡Bl° Ï>‚, ŽÃ>øæUÛ}8„ÔŽˆ¸\"8šƒ”Ë®ÍJGÖ?’˜0Ljï%âF“c,¯îÙ2̃x´ˆ!r¾½m¦2ÁDü(?0íÈLœˆ“¸ B”—fQWÐK ˜HMÑ<“&Sh Nê¤Ñ0¸;ÄUBÇÂP#€HÍù|¶ØŽû_`ϼٰà‡%(axO$ætpœé º„áðÄc‰Ÿ#VH˜Añ_!6HD‚#Ñz8 Ý(zmÈR·yz`Åå ý# w¶²¿²¾ÀYÎ:‹ ú¢3ÈcRø‹o6‚è!ÁŽ„EílE" 8âõI‚?x‘ÿJò¹¿ÀCs-¨•÷é('Ãë€Ä‰„bÿñ¿ÿCïÿá¸ù¿&öŒ ñã?ò¿ñðŸØÿ1&ć?ö?ÎÿöþûƆøñûÿpûÆøñûÿpûÆøñûÿpûÆøñûÿpûÆøñûÿxø&ð Ä_è ¼…ƒéE·¥ú±œœh w*“Æú›9a€G’ÿ pX0 ƒ±ÀDþÏ1!ïB%‘É<£'‘]e³6~³  wqÁ©ÿ5ôïÒ—ÙÿÈrgÿp²_ÄþAØþ ûâËÿˤº°PßÀšƒjç): ‹Aƒ8ÿÿD_dÿ#Ì <´ýc!Ò²p"ÿÿ˜ÐùïMš$ZÁÉÿ{Rߨúo)/ÿ/@PRòf³ÙiiiºººÜ,À………GŽQUUý”8LÓÔo`Ô$^àäÛÌÓ¼_Ÿ:¸w-ð—6‹°b0âÌÎiÎ×Áf)[ÞÃf_[òdËâ™óC-”3~Y·ö›E’§  ºúi¯*'iSvÇœ,Qýw¹æ£~ZEÛåúMï k²æØ±-,§ßZçw4¼CÍò0Ìø³èê»ýî¯Ôµz MTìÞcZe2µ¥õë[ŸžºtóZP²^’ï›=Tr“¯Èñ#W¬Ö¶ŸQŒþÃJ®Ýµs¥Ë2UÚñkCVw½UѲBÝà×Uçj¾ö‹Ê&̵YºÚwµ®ö^öª\ÉïnGÞå'¬×ÀîZ¥Ó¦‘‹N¥ÕKû¸ézÖ®–-/oÝ}cq—®^d‡¶÷·Žª’þ5Ï<ºr$Cýcz»ÅÕÏüþÖü»jËkòñ'Iûuë {)¤'ä²`p‘ÅñLñ·ñìå ×§V>q~ò½IãÑo™Žw¦§Â¹y+& Áñ€fz¢)Yôõ×ß·‹#Šê\MC‹móêë­%ò:_„Ĭ*Р·¼¸¦7cÒ¼ŠýË…ŠÜ|ñ%ë¶Ôµ‹£Wz_öË/Ü•rŒ¤k#VVsÃ×nrÃ)·%>_õ¼¸~4^'Ä®åÒÞ$Ï*@q:™þ@TU¬Xî‘S»<«rÖƒsÿ2•Ô]8M<+*À•,w,ewA¥Mµ¾Mi…â3¥?£fàרäDÈç*Y?t=Üi®˜¼qfIµõ¥ê¬ÛyÞY…gÂããèû².¤˜ìCÍ.ª ·ZÖšHò[Ò´$Ç|ŽKOVdŠxïRÏ‚äí}¿“±|îp´¯4Z%Á]§ðÎ ÉøÊœåGÚíOQ÷«×8îkUʼã¯ìaúÃY•øZ ·Â¤ð¼åóú ‹9×ÌŒ·¸Ë®½Ùw¥-ÜP1y]´´;£á›M9ö§mØøx«äo.ÏДi Iޱ¶»T°Œž³Ã5ÓÒqJ|%p@»÷Z~ôÆñRˆsc×R¦·Ê5;+é…΋ѿÓv#ºJâÜ_³{ÓöÕF¤Š¡ÓÝöÍC·«GZ(·ê=U ´Új_«+!3Ãô¤4ù‚ÇU)Œl| °ØE;ÒÂÑ6GÃZÄò¹RžƒØñªð¬‡ìèê8YûõËK<¯3¡)¶GêL)Ok&çǽ•ŠïÓ™YìWTû"‡!•ó~±óI é&ËJšQÒñá'{ÐÓ×¾™}ór¦¡¬øüÓ3vôÆN½ÏònøÁZ2¾‡ppIËÌœ+ÇTâ_AÇoN˜X)5gá‚›*;%B/=#{|0Uï39U#œú>ªš*ÌÙKvV%ÚärôHMO® ©5Ç|µw˜ç»ŸäÙËM-ÈÏ¡ ˜™’›z¬ØÑ×ë¢y¾Ô_3ÿ@Êît-1CC´g…OÛÚŠí2³Š°ògfJM©dM­5b¯-{æpÍîÖ?ÚTÂÌ3i;»fWåx—D:¯X!¹Ö.'#¥ÄÓµ{s]×Ã&Y)ó b.\¥b6:xÍZ4M/e-áØÞñ4œ1+¯¢V*·Ôø;iXÛ£LJµ3%ÈÇœ’\º¥¿âºfÒÅî{O+«<™ý./Fõá"Q¶±ÚÅÖ#òš¢ŽßÍ 6ÅÌŸ¡±P”}bÖÅ]DS)±"–²L×^ô÷­¦¿Ó ‡^J˜~|w„±JËl‘ʨ“-E÷ÜÅ.¸¾«ŒÚí¼á°•Û, “¸\‡*åßšI» 6Y—݈f _o——V2\U¨%!aWÿ_Ÿ{`O¶Tå4—1+c•Ö2­³‡¬ƒ^7o²d?6{Y=#þä» À–ö¥òX«ƒA¨=%νÑ5wµ'ŠÎ+Ïϯ :X–Ÿæ$n6#äv%[®µûa[PàôÒ–âÚ–×í“SÒë3ޱŸôR-* ´Š›út¾â¿?¥<_†l}UÏ>YÑw¥`ž¸ú¡Æ”¢?‚úâ‹ Scƒú¨±Añá³—>:ð‚!mú¡À!“·áYC(¤¹ê¹)ÙGrSJ¥÷dÔæ¬¯³Ìt &¡OÒ^ŸR¿ÀŠ˜ú[±ŸÕáÎe·2¯zUW<’Б÷ÀÞ§e—ïhsX‚V†/›Ò€´ˆ¤ÚvvÚ±ÔW ©²óÎÑdÙ5[‚^üœª×ºlÓ÷©Ko/Ô9{•py.£]­\ýg%‚wÊ3=Ec¹;M]ª¿!;îÁÑØM—ï$¤X,n×JKª­à~ÿàêYètšÝÅ3Rc3”B­­BK¦Ü{g®—²¬Õ”µ ýÑnSõ ²mµóVÐ3ïí‹­bMðy6¾ ´šcŠ“–_¸¦Zåþí©iµšjVìG+â³S=É-@Oe— Zî’$ßCfïû¦LûÚ-úí³Ò¨ŠÙ!s·«<ú“Ôµª¯ôéÔ¢Ö¬ãÝ$3cg¶ºRŸ”Y§åM7;Yެ®]G2ÓkO\ØnŸ÷oHÌ\o¶Þ¼Ü‚š¹i?ݕⷶ¦ŠßqvRdYgR‡ò&Õ‡úÕ‹¥ö½˜{ëõÍ •­;-: ¼Ý@žO¾Ô| Ÿ}&cƾ%ÑF%»d Æ4 £1ö„l-´"R(¥…4²¤d/’­&D²D¤T–’úß;C¥7ïßû{ß$œOËsï=ç|Ÿçœç<çÜççš²pïEŸkeœÌé&a̶ù&WRð~Í ?Y‰ÒF5Á“ŠÔDÁ+¬Éåø@.ÿ >\íò/þGGW/ '‰@Opµó14¨wªr‡“8¡²Q¾¬EûéaL'B‚>ë0{Ç»BÖœ([£[؆ÚX±¥ÉÊ/}³ª&“ý»ªRÊdV\G0í#•Í0& ºC÷¯ð¤2m2åã=ã»ÎýÎòdl‹7ç 'éø…àE§ï/ í•VòvßJ¶7ý<¬ééƒ5Î÷Àï-J·šO¶±7\¸ܥ`—\ÈNzF–„ì:µP :mD&¬7Ÿ+7Eg3Á¢,i%¯ð5ÜDÅ­yЖ«sÏT›L´ãâ@ˆ™>`â?ùvŸñž,qÈ®Å:žš´'xÒ³•_6#Mã‹pìÏùÏ._–•²±’²h°T@{𮫷¦…¨Å]íµuçß³ª*sÔíb¿tÞ̤cA&êè¹Ë-Ì{Œ8êx; %weÔ«}('ÆëdöùJMˆOŸjm¿-QoSU~¹„|÷AóMÙ[+àïe8É·¤5+–õnU@R`ÁWÝÑD=fÆœEÏùQHÕŽLÇ ]æ7[˜ÁZ2ÐÆ`M‹ºMìwHlY)Okô¿|.¤Ë©M;N2¯Z’o¯fÀ ~Ó«wAnÅ-ǹ›­ŽÆg2­S¼7 óMu‰¤¸†âÞàICBkÒóޤ²d¶ 2ˆ¶?×´Òâ!g4Þ@"JÛ¼!¿õõOß–,R×Ê¢ÏÌà-|öz„þˆÔëü&-ºE‡ }“Ø»‰qjK d{àøÒ¬äh1õÈ2—ƒ+Mc)bO 8±&ÐFŸl=’æÓ‚*Ã$‘»Q¾w‡} iUölÛªVúö²ûÂ+~]¶M_µ½kMXXúq°Àm²* Yß^.Å¥7¾‘÷¢O ÑlÎr^À×f Å1B1å½´U’C–Í6¸‰ûÕu‚W&¯w쵉AÙÑ{%LÒ<á)| ø ÷ø«mfÉï)åºC·L‹|[f×ÉÓ±¯ŽCëý ïqdâRtìQ7–àën0Š~Ù»ìÞvÚŸokGy\Fm8ó.ãFï^ùkÑI²}ay®^#m¨]çP¬ù^))óíô®?ïɹ·®šÈ¨"róÖʳõ3b/ëøóím>DcAˆë‰UR)Käçý”Ï’9?zóãM¢ÜkX5|½Û¬!¸êñ'ÎïÁ‰A¡ÜZû[Bü|ºóWtß’õ²ãÀ›áÒŽ /òøoÙB_N´Ë6[ÄGä}/ôq W˜å¶m4´ÃKÜ"ó^g`ÍV×éy­k²;&u¤BìSi\ôP1ýÇõW[< •íx- ÇE§¾£3L:£ ¨ö©³ëà?!\MU\ýn “ºÞžK¾xT×HŠøáº­¯ÝvßÞk?z¥µ7žƒÎô*í åÒï¬ñîÛê½lûôZ¢drq+ç·f?Gyq‘.Ù¥1640[q•t·6A²npåE-´Âs460W4¾lí?q=ÈÃ'ÅPøZÕIeË/,~W‡VX„=¾„À$}þÌ|¸³Üý|k_›dŒóò}@#w6Z€¨ð\ª\?ÑÆ#Ì1¨ }O¼/´G¬ÚÏj¿²Å>ËÅ›R{u‡þNºÅ5t$¶õzL/ëw õ;˜² Bí{aT`ƒG´¡Ñ|©ººB‘Mؼ¥N¦é³Ð÷Ü2]È~Åf¸š#óeêåUaFÑF¶›˜kËX›nÈÖCѯtƒWàÙ¢ZfcX¤[‚uÞØN¶'ê\‡^'7:§AU29£¾$ŸñO5@KømëĵgdÒÛ›ÖKÑÈ{•fQÉ:j,Ͻ?¢”€…T¾`ˆþÁ@±å¹Žd©aZ¦\5¡Ö'i+¬°jôëµ²”Vl^vÀÞmí–e5ìòZb´ÀR,kÛZÓ6´yèØ…õÌm:£¹³ù¼Byq™]Çø1 Kü.ô‡Ö”²ï¸KºKYwZÒëNü &¹¢S»Q@æ#s½äU`8hVuTCƒÓã*/ž×|ÆÞck@çfPjçz›§Yö,¢\àRÐ…~œ†Ï†ÆpÃ킉ÉIWPX5•$n ¼Ëwœ±r 9м5„³X·¤¡Ì€Ö±rÞ¡ÀX¶QÞf©zÆoWl²­"•ž,çá"¹ªykÅÛI÷=.’õ ζ6©µãS+Ú™zV¡÷šcóYšLcc½{™‹ØÃó£)äÂûF`ÕPÎJ¢quùÎè«*Ë{à™ò8Cú²zLËZâ R¨Ï@i¯x4ýÚÂl"§îA>”ÿâ89s{ý™uî˜ìù¢ŠËÖï!-2º/ŽôîÛèvóe?óéK±ó¼öz1Ч•çTÔW Óêò‘1€+Öl°x¶®_ò©‡ :ýžÕK4B–»_g·vRQ›•Øpr軾ʚž$¿«Gú¸ºø"õkeLŦr‚Kæ +‚¾÷Hi.D‡y í:•œÆùÝo¥ØÊ:Ͳz½€uç'çÎÄ}gõ\Uz™”¤v¦¥ÇJ5VÕÎo¬Ô^¸óЭ+™æ¡T„¤MÛÀ@ì]óøm©úÏŽ™¢öx–@äJÑNæËç~ñê@„Z÷Öâ|½rîeÀŠ Ì:41[µêDtåÌ6' îô¤ ¹2u+?0J˜¯E_6bÞô\Óù®5ãKÇe µÖV)y¤ SÞ·nÏ5¨7lR]Pjn½ãÀü Éüäà~¸ýš>HÊUõÞI¶.ˆ.4Z~Qœ|*v^MÁõÏÅ©ìë/ø²ÔÈ[ôI]äÄh`&KHsàÆu©y}ïžE‹-1::¿lH€íÚÂE‹Y¹=Û/m|Èu¡4àê¦;ûœ¡öñJÊE4ßZ™ù&(ÜÏ·c¼½aùaÉV¼­cq‘a¦™NÕ%}Æ2‰¤À¬½¯­@|µ;; ¯‡ciuÍ€¯+l|‘ˆë-J_4xaeŠ*z}$W¬YýTéÛÕÂÊUn ¶;²g™ 4¢ªnéŶ­v5¬—")}²a[-ǧv9‡ãñ쫞Êùp¢=ÞQÊi·_¬¿œðÈÉ¿%øn­XÞ“{¼Y.Y†ã—>[voq@ÕËð²§Âço* ªXåÛÖ°^©•«–buÚì¡ûÁPW»^ˆDFÉÛ w¥\rP@תª=­Š¶§ªn”xGáãÔÍdnصÑ:kk(y2,Ù[S®×Þ@ZÓ#Ù?xla5©âøžaîö†ù-5{rÕ I±çoáÕqèc†¹>¼háö†VfÆO\(õ}¸f°þ‚‘ª…PâáMI¼™/ÜTãõLÂ/ŠG* Ûá•Ï ÖToÕжÓónT²O‘%5ÈI)}6`(và‰Ñóy+¦ò¾µ*>>QŸž_ßM|äíìQþ%öõ0ÉC„ß6““Í—°Ï¯ÑS9óIÕA¢åØé®Õ+š‡ìªR5®³çÚ•˜cߟq¯›Ž”œ¨I§w ›®—Wá©=èˆy€xÓŸØ_JˆÚ‡F¼Ê»ùbq~~”´1| [=_ô²~µä߯ÜääÄ·28 }ch²­:WEÝ^špöšƒùñÊ»Ü]7[5îZI°Œ(+ñw7ÞàðèÁ÷®z,‹kÖT;Û-øÅlÄù®Ð—›A©0¥Ï.,¤¶¡*…—Í[M7•í¯ W)6àŒ|$+[×~¸/<ðBÜÞ)‚™–#µêø^ácè4~S\Ü ëþFXìuètiÇã›±â¶q}$Ù'æ"f×E¢h£Š_ÝyxO¨UŒmÇnØí•„ƒEòáZ"î¡1òð?Þ®2¡V3vã”=9Ðk¨Á´×»OXÄȱ*ó$3¹¥r«I©¨QOe¸ˆ#’l)nµpÁ‡£ªÌŒb¢¬ÅO,W .aè?^~üö”RÅŠ ¼^–_*9¨ùUÛÝÕí[%iZ˜ó$ðÖkšî]Jj5Ž[2p› +Z/Œñ 8[²¨òÍ«ê¨ËÅ~†K=N«¥]…„v= 7gâQ=쌡Ùá³ý-aWêPçíÛà¸]ýº¿ÝKyÇW@jÖ‹ž~uŽqg\!$²<ëq‚ü; ¼ð ÐD˲^o’Ù öÓ-Jqûº­œO(½ývU¤Ó’Ê+Â@»wø­È¬ã¶"´wù{ü¹Ô#Ë.ãÍâiyÁg ScÙšü^dÚc™þF|©‡lFxx{Á¶ªm‰6ÍòÏî :¯2ؼÑL˜5DÂYf_óýB å%«À¬hÖÆC´½Eù)C'.£ÏKÎ/~ÏúôÐáVs®ÎO¥ßû^±:ÆÕzó™C:9¢òŒ®T\wÜ|úAx3±×Öþ›ô[«g– H›2¿¤á*Ñæ›î¿µºÁ³QLbþ‰ðëÇ¡JbLÛr-£ê¢Þ%… ¬î¯õÁ6Û¤ø Œ¸d¶ñ1@ÅXæéÕ®ÆÅ™ñ²ªšœß8,<¯' ñðyÃSõ¸-I”‡ßFV@*æ¥Ujé:ç} é[ÜühÖµ(6ºÕñ›)% ÃïÓq@ ݤa~Ñý(w=íp¹­CÀÁ{â¸4Odý Q¾ùÙ÷Àé‘oß½ ›+Îe‰é¯S‡œÛÙ.øYQ\ì ”µ9?òQn‰Š¸R;‡Q{#²{«êqùªåï˽í\³Eyjò9ÕÊ’CKc0œ^v½¡ ˆ×Çn{‹ž÷§šx>¶´“/§C¾"­­ΤFÏ{k©LH•”LÂдÊW¨œPJcµjLôÜÊÜ£±ú,fI±ã©Aó&Õ‚)YzïØÛ+àGß¡3µ¯¾mØf=tèJ[ä#®î?ÊT˜x†':yhA4$tË ¸ÊQ®E×÷UÏÜéƒ4E˜éÞ{‹:›:/)U«oå÷ @]ngˆçÖF²°´jž»vŒ¤Õw}ÙÐA«ÝÂ%}Ó4‘µ+¤,- °ŠáZ$«Õªû^Qø<}Nêþ£íEµ,•˜¡L-“`ÐÒ¥]&A'±P¸³[¡ÑKÈ^”…ãÞ¾ é©Òx-• èçjÁ\ØtšUO¤“7$øÐ’ðξNåíy½-s^Cï‹ïöoÚûÆ:¾<»‚íEöQªå9D ¸—Õ—žõ¥iEPÙ'tù Ê\˜¢ª /æå¥á¤¢7<ºÎ=Ù«jéü0wA³ãÝ8K»Ž†ÏÉ/wûqjY/•êžvòiìÕ´n3pò?“añîà{Ë'˜ÞGȧìÁ*IG$>:~Ô”d§ß®Uêbswßqئ~ä‚ZuWÎÅwôY‡HŸ ÅÚ÷ô´dü)‡Ü%¶0¦â,' ¥ræ/Ž«}~òI‘hraMé³ÅMi»ùß©N}¶ÍÝÑiƒÉí§Z¿tÅäê –ºÄÄ*I}âßñ ‘@ϧžHB9êÅ\ègõj%î}5rÖ°ÓP.ù9a•UFl éÚ¼Ì „æ¼bþí"ãOëR?^y:|”>a¥7]Cz.…í‡þšNá¼\¯NÝ MvÜ“v«˜Z“§oІ¨Ù/U¼Ù5âªò‡NѼþøã•#'Ú<|Œ4üÐÉük6Õšô´8IääÖ÷™ç)·6…AyP*ì[.ï7ZºªÔ-=÷å)Òš»úº“ˆünm¶µ&>/òS3Éï9/æ—~¼²Tþü£xrCÁ9ñ¼ÜM(;7®UØ=(ýVóþUê[üOô Œl²²0l¯3é³´óáBíÝRqú†â¼-µ&­5晹÷í¹ÏךÐFîDöc}ÓñÉf Ö1+º“–Iš#ÑŽà½E‘fÈþ3¥ôhbw"™ûŸ%-Hìër‚ª^7OU´« Æ$.^f–k¯TNЯÝ%Æ[ ·ï^(½í¨UFaÐ6ÓM—ìùºh¹ö·Ç˜8“³8˜9ºÑÈ4)Ýn§G£ôGC ìµÛ¹ù9vè ÕùÉàŠ šûjv êÊ‘LRö}øò¡öÈ’`¦%öŸãÚò6-*÷Ô»µÁ”F^8¦!€KÉÃZžÚc4”E º€Þ…u¯ðs®0•X†Ž±º„Y]=²Bî곃;òÄ¥E %Æw{–^Ë’óHÊ¢¾ºHãöÁºgOŸoϤT« ˜WI‰„[“”4ZÀê˜I%{¾ü»'Fבkï;ú+׳¦dÉ qnwe-‡‘*B¹-v;¼Yq·¸g`ûÚûm¨ç“i’³Â¹ü"$‘<å½2k‡Y¹«¶Ëh|y¾ZàUšÂk²}Ã2éX T9’˜V R}:ZŸó½S Þg,n1Ì8ÜãîÌcn³!yœŒT69Ù*ë»K!Z—÷p[Ñs¾«‹—îÂf µCµ¡ñú@ÞHmåºÓ"á] dÌY}ÆC˜%Ábâ¥_'oÔ\=»ð›+õÍ‚Òtw쬰ÖÅèðIÆÜzâJ¶«.^·;F§”ÿi]BZ]ÂëMÏ ®8·6õ·_]ºj^™Xf±Lˆ«K“F©o˜,yõÙ!¼à~Ä5 òB3:ö¤jiàºU›­î£ˆCe ñ½ieN~zZ¼ÒWIˇ£›\öJaN>¥aacÉä-<ÞÃÃSus饻m%>éÔyX× <{6-Rùw]ÏŠC#ûíÝL+¥³Ùw.µÑà`tX«õÁŽwˉ»{iá½°½çº€U÷¼´˜öY%Óë Æ0VX§i4´*QYаXD÷°|^º&°þ±žaë-Ði*ƒÎ¥¯i¼ýßtˆÿ3zþ{.þË”¤ñüÿ­ñæü?ü†4žÿ¿×ÿ‡¼,\†€QøŸ;ÿ9%éGþOè]XÊ‘Nåõ÷ö߸Ühü/0þ“uȬ Ð’ÑØ;Ue(7¨ÏÉ ÿ#øÉ0G£bÌ3ð_¨A°%LŠÿ®'|«á_bžˆáÐ1ÎPPbˆ‚l¦0z"аq ©>ò©TOŽ(ðrÆÊm4Š0@`f Ü؃bQ=SÀÿÌë7¼žÒ>J˜Qÿ¨SKù1z \ð„±°Â|Í¢¸Aþ“„Þä°ƒ¡ס]ˆ¼çä‡ÂL`º"€ûkd±Õb_ƒ…Ì4þ~ïü÷ï½ß<÷ÎXø Ï{@°a‰žÛPÄ]¿­‡Såý«p èϱX,<î 's¸~ršPsÿ{ÆLòP*IÆ4ø¯Á;<ц” IÈX,#¨øÎÈÉ >ž¿}ó¥-w=š¨éJÄk{ (¢!Öw%~ë£_ýÿS~Íú(PÈ3ê&ä[`±ÙN ³OtqG9ƒ!W¾[lp¡d|‚=[èBI1&>@1‰µõ˜-àaJ"ê@0z„ÊeÅa‰Xê¦âìp ÀQ± ÃÚxRÃÍ*Àà_ûÁ7É0kÀ"`ƒÁF'[¬ xw†`ŸP‘ÐntrAˆ_ž5ÚOü‹Ò;ëöÃ%ÆF‚ë é“Bí 茎HWíDDÚPu#$Öv|û¦ŒÎ<mCDÛN-  l¿nÍಠp4eóé<º{2{ÐÃ@ô»¨sÿ,Cý:ûýÜ7{ˆi€uAÚQEþìŽãÑŽ³ µˆÚïŽ& ]Æ”ÜÙƒFv´ š8á+Œ¢§ä!‰(Ìì‚/OïLDR¾úÎ.ìr vÊ7^¤“ëìz(YøÄm·YNýP §jÁÒw‚ Wº€Žóu—w6~BPðmmÎ’-Ö}+z¦ìíOÔ·U;Þ4þÅ$Ôf¸5ãD4PúF©ÙJ0îóÔ&0ö›é4øŽ;vŽûŠ3³„þDø&Ä?C€Oò;жáÁ{¿ïûÅo1s ]·ëÚ™ôíf¢ÞŽOA8ÎÄn>b9 bMÜ?ø$ù äò…‚}Ú÷L f%ônW´Ë˜µ†&å,Ò÷æÔCŠòÿŸ?Ú')èäAʸ ‰3IÐMº":%kÖšjÈÊ~#‚ ‹CÏ«×I‡~ƒ?c ~' ö ºÚ <,øûÎ2ü–ñÿ]×7¤î^Ïì.ká"êhðÄðÏç}´'x„”¸ZÜÆÑYì¯÷ʼn°ŸØ³ˆeÅ(¯AQjR°¶@œäPRi;9+áYf GPHóUÆ:Ùῳ¬ÿ.×B@»`‹™§}ÂaP4,PËt›]z\öüN¨™D€ …-ÿÍðŸ Õ™²&ˆBö~wžz¦Àä|Ž~Bœ^›lÀ¿Ÿª»¬ZMú<±µĵ „â_EM…Ãbœ”!,fQ¸íâˆÂáÔ¿9SÁ;Aô€¿šÎˆ¬<†P†+)#àY( Jñбå{o/kOª7f?4èVFYFÆÝÝ]zÌÇ ž€‘¡¸ö…ʬŠuÄ@\6_I4ú ³F‚ÂÕDFsÀ_@s¦bmmqhˆ5ž`‹&¨‰k8£þ^Te¨(€,*X£®b(þkÔÿø Æãý?)ýNÿ_ryT¸¦øÿ’Ÿóÿ5éGþÿEœŒ`øî¿þßøÏp¸Â7ÿ_PŠÿ/(Ð]æüMAšóÿ5çÿkÎÿnòþ¿Fåá/qÿ%+c+‡žPÿD¡½6÷×;ÿšDë¨_M©ŸQF?¶üËï+ÿ†$ÿÙRÈþL9ãH=ï8y=~Z@fèØÂʸƒ²ýæa4còˆ&(l\I¿¾å°ñ-§nJ:)9HâèY}Ê/I@ÿÇã   FŽå Á™²c™üÑí)E>©n ÿ¯½ØLëîj 0]ÛK•:nx¬-Dœàö 8÷£ù±$ä?¶Q™o©§ì²ß<…rç—lªMnªMÿ_:å˜=|R$@P(ð¿Ûÿñ|‡ÿ€ú_9̞ۘHœ¡©îE~íü;ÊIdX›ÿŠ“ÎÊòàqp½¯Þã~œÿ¶cN<÷ï²ÝÕÉ Ð»ÿ(DP[¸Â_û=(5 ß#ÄSδ¢GçÔÉ€›dÉãGÕww§ddQO)ÿ“£éÿNAøÕ‘zØžø“–LwD“’ùÐ eðø/j£8­íòçˆÿÉM{ÿ $!ãU!,ÅE øóÇ;èoZÔè­¯*¸AJmÿŠNVºýر~C«ÇyústAþ5rZÉÁI>j úWøNh÷™ß´týÊÉ‹rz¬+•¨¶LÿÐLcZ üɉRª9Êj¨õ¡‡RÐÿs;œ?"Õo”.?á,u"œ`üsˆ1á²´ô§í_¼$ùÂI~Ú8ƒü.$Ú LRâ3QIÅïü»&¥_ÔIí9ôªEÝ­uFP“ó§üo7lÿÛýŽÉt]P·0$`14ỳGS¿g÷ë´‹ åBDÝ5n[ž²M÷+÷æ§ ÅŒqJvè~‡´•ýÁLñûeç ”´°àþ¸ü}K‚ß`ž —›3Ïœéiœý:mâÿ"àsöŸS‘Æó6}ø˜ãÿT¤ñü—>üŸ‹ÿ<%i<ÿáÓ‡ÿsöÿS’Æó1}ø¯0Çÿ©Hãù/7mø<6Çÿ)Hãù/?}ø›ãÿT¤ñüW˜>ü—ãÿT¤ñüWœ>üŸ[ÿOIÏÿßzþw<ÿçÖÿS’Æñ1öÿæø?%i<ÿ§ÑþßÜþÏ”¤ñüŸFûsû?S’ÆóíÿÍíÿLIú‘ÿùj=Øùñû1–@OìÿŽ@È}óÿ ~¨,!Ÿóÿ1éÏñÿñ“N Ñ{+d;ÚM@;¦€s~Aæü‚ü¿ vIà9Jÿ{ …Q«ý'/‹€=iüãn<~x~»-ò¬¦µ Åb™Z&ÅPÇ…ú èd44òÍPGi ŒR,èåzxZZZŬê ü¥X‰Rýˆ ! 7½¿·r‚ÙÊ€‡B@ȯQnwIs@>>`36‘€õQòQê£T½‘ ôŸ±Å¢0”ã˜ÙÑDRý˜ØrMPÿ‹ELÆÖFnÂI ‰%' Ô་jyô͸yG”3@$[E[”µÌß—<:j·ô}ó)%ƒvJ£mdVžƒ8¡ 3éb·P4ê/FƒÄ„à4¡ŒÇP‰qÙ…%mCå.€`¡‚¤‚’¬¤¬,\RI^q´å?¯ÉFÆVñ'®GkZ‡ÅXqW•,‚ZB6™ÊàÖS™‹ MDÿ]mE9Jm P¥ÿ·6 ÛÊÿÄ8o´¶­hÇ¿¥ N©H ®øÿV*š–xáoëR’—¥Ôƒ)þÿ4D&î÷†ÀÄöwUÁd¡TÂÀÅdø%ÿ¿“¶„¿«C ™"P \ý¾|`¤ˆžÑm´xÔŠQVD} õ ƒ•¼óâhH˜‡Çæ.êPÀìT•‹ú6 µð8 ê(p¢ùW2èAÿÇÞ•À5ulý(*¢ˆuA­zå¹ =€ˆ ‹ (‚`¥bHnL”˜Qêu—ÖRû¬J+Š…µªe|‚aI,®#|µ­®W€A«$0Р©‚Õ;H P!fIÈ@“xˆB¨PŸ†©écÁøÏCàWªüŒÙ4n¸½E8@ë•>^·¤i2•J&õ6ãjon^Û€¬¾‰YŒ>M‚×ÊÚÑÒŒª!D•L1‚Ô|¯;Ðf«1Srã‹`*Ùä*G·ZåæšÐ9ºFçÔ£öw„âèt4Çf…£öFŒa}'‘)%bÔ¤,¦ƒ¢M+wh Í'l½oؾ>Tø'‘‘ŒL)•˜€á'"E&"DgH@¯(ÚE¢^a;GÔ't*À P¡êOŠ!êo;ÈUðÃØê˜LÄwµ{<ü†æ{c¯_ý¡°EðÖ’©@aDN‘$=èZ–D%Æ¢s ù*>˜×ψaþ1e·KËbYݲˆ/'Í‹¥i^¸êêXƒŠèÝo!k8M·e&ð# ™‚ç-bÕ#W"”ÎVjÅ'Z¤¨J,bó±\‚+WˆË1·ÂAQìÔU³­V¨Qz ÅÖ(”ñÊn!JÄÖ ‡4¶DŽSœQ¶Vœæ c7K® ¼D„h?m6XRÝP6¬mí¡€cÏ¡€kuË…¡\‰VË58õ2×U¿…B ¶#Ô€[ŒÖä¼ ÌãE¾EC¬oë]Å4Pê¦jÅ*i <øÑ*…_Ÿ1¦:†Ö">ªR)$i™*ÔN‹r뤩 _®™öãz¥iÎÀ¬vDÿ‚G¿ËÀmz[ Im`‡" töÓåÖO˜¥©²L•Rêx§¦^m¿|ìÉ´YÄ53›ò&åzâà !ø?-8†§DU¨Bä—}Aá-¼Z ºhª”Ñ J‰ Â#Ýášt¯ê7>Ýá*8Tò OÄcZõ­CÏz¹êÖ`B¤6º:ÂêUÍO˜n°ZãQðR†^‚´@:B˜| S‹xT?­Ç5 "…Lúzš@o  údI2LI²Ø5ß|6öþ!?Ó%²Ð1Ó˜ õ3–H²Ô+Ó¸(ü!³²,óÉ4&&·ÆMJ°ØÓ˜ü\?Ãdÿc¡/¦1IðL MõÙÆ 9ëÍyõ¶ aÆqnêoÑüóÌ5bg̰ɦ®!D+IûlzXhÉÐu3¡c×àËxàGãʃçÀ2ÛE-¶E›-Öl$b/$ (0i•2Ü¢©ŸÚ³FM ’ ¥L&á5¥HD>ÿ‡¢P>È64P_$L&Ÿ'~ðI ô{cÅ‹œLT‰øHD»Í%`-ɲPáàfkÆh”PÏžPrµ…ù êÞ@Ø"€Æ’0¥U`2̓¸iOž1ðUÐ ÅçãY|%2EÃÃŒ X¬uˆ F‡ ÊLǘhfB7žDc&í4ðÛPÚ¹ÜH²à¾X‚eÝÖñ„itg<áævèò›Oü?gü7ûúø[0…±Z†þ7“Ådkñ¿¹$ƒÎ¡9ùßv9Z4ÿWJ' ÜÉof,pcŠiOÂbF¸6ƒ<ÌЮ‘:KMË §û Ù &g*“nάU?öÚq¼¬&Iœ\Yº™ÑÎ:º8ƒkˆwÙ ¥Æ‘Æ­HÜ(uÜÌ®©1&·?•ÅæP4•Ëb51ãÓ[/ØÅb€z0¾–I fGXä'ä˜þ5˜ÂV¤íÔ¨×"%³Rç‹ãÕí¤&7Šš¬n†ÊÄøiš2FËÀÓþ†¬B°t›–¾láÎ’asýÎ’ã¨Ì–Ö ­¼tZÅ™P]Cìa]ݵ#ÝÙBE3BzÖÖ´æO}nbÒ¬å»Á-š:K¸º·0š…è0mNIµXpwÃ0‡Uù nzzsóÁˆeÆg“ã2ª!.¬&Ä¥‰~b¶+ÏÏfC ¤ôi;öj9eë"Ç6\˦ú–‰4L«ÌþâQÚ®s˜¶áä?צõÉW/ 9`öÕLi€õÐ)µøýFi€Úf¹ãàÃØ€J¢ÿ¶€X‚Mî©oÙR«Íüô­%úÐÀ[ŸáôÖ7ï­ß öãæôÙ·¼˜NŸ}§Ï~³svsúì[á³oiÀ1#A÷å5m-E•´£±°-ÆòÏAálÓԊͬ´R´ËàÙ$óN8` ±™±=°q½kÑ#‘é¹¹[síú5Xïƒa¡°esã½/îÿ@t¢Ê×î>¹¶í>­È@ô úaèX¯†îŸ×­šâ¥èW¢Ý»WC5ÊhÇ)úÍ{^¢¯q*¨zÃ9?±Ù¨`nµÝž„œ–IÄÑ4>ÃDé. %&}¯7©W dÙb2bœdë•mÛÕÚpÄX (˜i»@Áÿ?×G ®Æñú'±&´Ï9Ð6ï6Á9ÐÚr U¢*ûŒ²@PËbYbíÌçµ%ÂŒ(¨5®)QFi¾„”&fû2lßæèð?iüfÀÿeAþ/‡áäÿÚåÐåÿ²›þjþ7݉¿=ÝöŸÖ ðW·'þv9tÛ?§à¯nÿ 'þö8tÛ¿À‘ø³Yt‡ÁÆÛ?P'þv8ôñ¯ŸO¨$RTþˆá»~6ѦãÐ8L.§>þ0üh  gü{-'þ1‰ÅõWK8…E`ˆgôgôÇDÿ°X-Á³p% V¢§¡DÔù@xðm$K,ˆEf††›åLÄ(\©‚iBßu73QT™"`Ióð|5tnÒº‹¯¥52(Š*T¾b­¨X† <Š*2óONÏ”™Œ5Â%Ö ogdeMKOì5¤¥ù DZ£c¦ ÔŒÑå<ì®­Dsü„t––è,¾J šXL$0–u8\¼•£  dfáñ"°õ:cJm.òEš¿IF*¤xaL¬V„ #á,L¾i0´‹¡¥>&CV0¨t6•É`StºÉ˜=Mт˔6;€Êà2©\ø`RÓO(¢PFSésÙ\,}.Ë’ôùÚH epœ2#€ ¦ƒB°é4PWœ†7l»âµ);-¡6æÏš©[Hg &XPHªÊFÓ‰ðLxŽfé*Y`:¸Ÿ…ÝÁlX_¼ÏÍ| ê›,Ÿ`sOј­í™^µ¬›;š/ÝÌká`|Õ}nh½ƒÑ ä ˜ü“gPbQÙáVX&‡Û‰|"Q!Y’ôt¸ÅÊ"ÊL§"àI$)š›ÈCBÇM@’BããCÇñ& ÃH 2pâé@Gu d7ðÀÔUÍ‚;—c#ââÀó¡#£c¢yàed4o\DB„"q¡ñ¼è°Ä˜Ðx`>ÇÇÅ&Dø"Xž1-ƒÁ‰̃–†¤K@÷¥223à>'™Žo³·|¸‘ ³Clj««õ"ôÜpNS!ÄÞ(vº:5l÷UH•¾6ÞàñdÑœ<-þÐ]ÿã6Ÿõ?¦sýLJîú°à¯^ÿwâo—C·ýû;vý—âq¸Îõ{úø7°\£dª„,¾¼A,L©Ðbx̬ÿÒh,müÁu“ .9×íp¹L! `§ñÓØ"š€É¦ù³EB0þÒ9\>Í.MÐy8îh|ûçË-•a®ýÓ9ÝþŸÁd±Îöo#¯D![U  7¸ ƒô·t ñ§2þƒÎ¡²™âehFªÕH ý0ÛŸêÐ9l*ßæœw5›£ÑíÌÊ-•aºý3 áëÿ,¶sÿ×.ÇÒ¸q£:¸õ„-²CtTx<ø{D¢Ôµ¢€_;>iµü˨­«ëÑC^QQ±qãÆ¤¤¤ÔÔÔ#F\¿~½¬¬lݺu}ûö7ox¶®®nâq¯¡à—‹*~\)äÎe‰„¢ÃCy3?ÿ}혬«GW»ûÖ©¹ÇÞyëºá³)ÙýOÞŽ_ñ/ÊÉã\·ïbn¿-ú!ºÿ™rÆò´O¾ èÿ\\Èüëó~¡ïß«a$^ =B …”¤Ý•G=|¤,.ª-ÞüÕæºW]­ýëúÉ­¿Îy‘“¾mI^XÖþó«]·“kÇäN+}P7HuÞ}øª«yDl ÙZMrk5×ksÛÏÅåì=“Ÿíús¹lçËC9ŸÝzH^üVÅ›»ÊöÏy¼ó`ñ¥K ]¶ìþ)býÁ¯Ö¥~–òv͋ʹõ[SÜ;(3=Û[»­`jÿE•»µÝ¶fÆÕñ5nÕEÃ‘Û ¾Üùráò~Û–~Å#ýxùŒèïI~‡œ¾ŒåqgûÞ'[sº>ü†¼òöÝÅ”K϶Í9FÝ%¿±á½ßêÊÓw}§`¾¤Ul¼Ò;hÁÄ9¥%7¹ç\êh¿G¹*Þ»° ÃýgŸžØ´øÙÅ#_~ï¸íÇñGïüQ2°×Ìï{ܘõmâU—Í.t)KÚ;µçøU{úS† EöŒäy}V÷êÔöÄÝOó!éÐ_›ÉÒûÃozÞuXˆWEñ£/òéû¿LY%paU-«ûcç’¯XS^þ'wèjJJfîr+åÒªcòÛ¸?(ºäá2?{õáoE3I£Å?Tñ=Ëóû,k³~éÍJÏûåëñß]F )aÙ>}r:“ó»“ÝïͤÝiMžŸåáÒ.âú,.ˆ4€Úqõ·sΖöxëÆ/ÙQŠ…ObéåïgÝËË#/z*ßòóÄsœ{E‘Ó\ʷϹ, õõv{Ø;§ßËíy»<í´nÛSrN¿á)k IùÔ0–g{xíÈ£¿ßç’æ™GZT]1£ÍáîO·—ÒÝôK)ÙÆuxÊò3áT2!€òéûšJdÄäÁ×^í~· myLÕɼüÉÿ *Ùç™ìVv³_X¹Ó¾íg–—¾‘[’²gm[êÓ¬y'ç­èx8µÆ¯pú ò˜€*oòo]³ŸÖÜHYI?$ú÷Î>çŒkuqÀÖ×N¤º¹}PDZÖ–Ú³ân¼ßû¸×mRɈGÍ]úûо«Ú_Û¿iUûÛe›P*¶EmÆgûx$ß/N.Y¼²Ï ×ñÙÉ. 9½W j™ª˜ª)½Ö <ѺÀïüŸCö Îm\º"vð«_kHIcËŽ>–þåÒ¶û×L¯<|%XA©×söÛgÏïîq ðÖìeåÙcÇU–Ôˆ7\øsÚ†þ7?{­èWroxfɰ‚¶ß.ŽÂÞg-òººè$c9¸·²ÍÓ­½ÏÚiúæØäª÷;çþáÕ¹Ó±Ê3‡ÑKÛ–vÎýréDÄ÷¤AéÖ—ìol:}þÉGSþ¾´y’¯üûñ'[»¾ÓúT[VÙšŽ³·U'/<›{²xÕ¥½Bäû¦uÝæÐµÌ¡îîË?y°<ѧ뒵}ϳh}JjìÕaã‹xHí;Ó~LnÖ‚û½'Õ ò™{ª¢÷WqÞq÷ª žô7å.¼<ò²ÔÝ´àc)¤¬¯GÞ/?ÒîÕ„¸dxR{z§¯wÒeqMòÂø\Oé±!Ôž¥‚®Ý:\ûÆ­}›£{ÜV{>ïzÝ+E2Ì¥zŠÇBʰÙ¹}+]åÅsfOò“\M}ü×Í^•g†v^’-î°uâ«Ö^ î¤ì›è~ñ™w.kÕźíW´¶~wvOÝU%Ú7ùÆ;óÌ\=?tIHþòçí“Wô)þ·¡k…•6¢ÿ˜¡seÅ.^ T£/”Vw\Z~%gš”ÖÖ³´:2"t´ëŒ+ûDö¯õ;ö[ «°[›k’/ðÆ´~\vࣺ¸~åÏüP>ÕÙ…{…vÿùï#kD—åÇçÞÊcÖ¥¾½<O\·Îˆ`•…œØá‘èÞѵ'zbòæÖþ7=&íã¾">½Ú³_õ¶­Z½žpæpÊÝ[Ê ¿üι]¾¾<~÷ ±hox_ùþœ_´GU䢑—/íÝ1¶µë7)§ŽÔ}Ïgäåéî+IÞ»×=jÖÆ.a—«vó$—Èå§­©ê% ¹;„Í97Ž´$iS*Ò~Ý•ñòÀÿ‘'øw'9ç—$ö—]?è~<6qhð¼õqyƒc‚~øÛ½öëQk–*Z'ÿêvšOyõ ¯øTø¦ò39uÕínvýˆñFɃªð»?v`tžîùhâ­ÝÉOïWm‘x û§}ú¤7v¿èÑï{%ù/i¿$òv&5ÉcÛªwç΋˜Ó}V9u“kÐ>¤’‘$îeó}Š>^R~w¾ð»œ>[ú,™Üßûá >èÀnþ»Þ}ìÃü&䯽ÀYÀ¬¬âS‡AV I?ÞÝcCûëÙW|¦|¼çÒœCÙ;nÙøáŠœ¼Àë•=K¶Dv;ðlçÛŸ–í<}šógZVî¡=É”Vc–W$Sÿ¥,LŸ©š˜òöá › 9£)¾kré,réÐÙyo-K~~ñ\ä„ì¶I€kx.”Mð”‰íUòÝúWÖ{õLp9€ ®ah'®1]0S€¿ë¿¨sâñªÂo‹MXNY(›U÷óàI%…œOY»f]Iî\yîèŽ5[8swL}ôEztÜîXò£ÿ<Î彨˜;çÑé?g"…¼àü!ón´*\œtú¹¸g»·_P(}$s]¸ýdt›e'úîžZRY69hÓl$±6'O2ÿó•í®gÓ*ÕasoÅüI+äÆñj; Äi^±CúF­ñpûX{²ë­è_)›·Y{´v¸Ë¥gÏÅ#¿Ø=9HÒ®üÓ£<þsx¼ “ÌŸZÑs¬wÁÀèŽ-‹õQÿz2gêŽ7GŸ;ðì= Ôoÿe–¬–ŠpFö:ã약…ÈJöÉj ¡²WE—”dÊYÙ¤£Ì"úúiýÖûïíí÷¾=¿_îîÙŸù|žõyÊÍô„µb>Æ(xÍŽ:žËV‹Qó¼<£¹³7f>kvžzzœbß5šm½/˜Žñ´h®ç€ù¼Y:u/¬|ôÌífÁûÄtXÌÈ­Àë¼Æ”áW4vÞÚv"ý Co YvQµ!wÝäP£¾nݿמký[“·ÍÕë¬Òn»¨îò¶®î9€Oz¨€lÜâvK©.йì¯[{·$eF»dÇÌ·6ÄÌ“˱ÃÖ‹Í?ÛL"”0%y¾_y½Õ„Ó@# ,Zßø›æ 3þV_ìŒ['3«ÏøÄ¾?¢ÊùøÌb­?cÝ›–ÿÅjé–Éþjþä-Î÷äßÙ¾%\¢{¨Cò†x`îêôŽwžN¶)•øá/°• «ÉŽmÝüQ´ò²%ö9¿Öl&Ùóã‘Ò æ[¹S÷¤J¿R:f¹ª6À…9Ÿ`7d.wp•hµà¿ðB‡ò0£ç‹#Vyë–î_¹Ñ4Y]pRî,郛ëûÎÎ'O_»Ñt ð2ÜÔüÖò׺ú+ŽšÆŒvéË+Mn'´zìóòÍJ^¯4…-î /s™Ý'|%ÙgØb‹þ"&M·×Xq{Í‘G¢·=¡;Íàïþú°xe|Q§³R·Zssç¹Üq¶€E dÕH+O–sñÍQNäùLJsߨbOöXÀ•òL.Ä~kñÅ¥ýy¹¹¹|])ä[üítç+Ó©Oº8q£É803ììðî'7óÌ'Ží>;Î’æ")›`JÒkUìnÈ7½å%i°È‘- û+vwhSmß–š œ J7[.×»M,/L› H*Ùm@®›fÕz÷báhñrµdG ¥Öùží\$¥i{´?<»˜˜ëkÅòüÐÔ°Ç).k‡/‰Ž’ÜÚmÀ[À~­>&E”z´Åq¬¤ýj‘‹ÜEY~VKo¦Î¨[YßÎÑøì-Û£ê:Ë>‚Hï|[Fg|,ó:ÅhKtE¸ç;>–œ@)£¾|K‚;òþºLS¸=Éd¥Žño0ѱj$o«1-s‘:dC’§°#l˜ˆñÕQ´§¬×¾ßÉÍÔ9¾4ZikuS¢·ÜáÕq$<éÒZ ëŒ DÊpK¦bUbs¦ö¥eúihv‘˜­ô§+#,™H9Þe½!?/iFlQZ†)?NÝ_iÑÙ&P­Kü. Ÿcç#çJj²7œµÂûÛù†T8'˜h=s1»ß)ÉÁv¼m˹ë’Föj‡¨gÌåùýìÕÂ^¸Èý5xy2 Äßj¼æ:k±Ñ.*°µ#œ9(ÚôزóØ麩…ƒü¥ç&Õná,j,IÎ(Ú²õx»ÐêêFCù„/A£!ÌShˆ§â£v9·êI«Ø3É=~É,Íšz.+‚Õâž|jq§BŽîgo½ý[Röä{ ú§%Úl 8‹Âç/¼Kßr²yTÍ’è‚`…*ÕY‹C|Õ}câ>‘Í1@ý<©/YƒJÁ^õtŒ¡ýR*Yœ•A“ƒJS‡ûÔœ¦·LÞÜg‹L}äùÊ=Þœå³{ŠË[幓\ZHiÊÛ¤ŽK̶ ‰E›VSÓI»§˜ì…§ÊVV®³‘Õ¾[ÂaÀ0ç¸Ú/ý9Õñ»:+V÷¢py‹²)?ïF‚:×BÚƒ,^9¼¯ùÌìøäÇ9»™a—&ìðU±¿¨XgºÓHs@&‘¤ [­}9C5’@õFa&ShÇV ÞmÂè×M3²/©ÌJ¤@ÔÊç–b¶4+T—‘Œ?÷ Hu§À˜G­øô«ÞêW®+{Ã/©Éw‘Zû¶ .?§Ñ• .ÒG¦¬<ÌâŒnÞ.eÕ526 Ïív(ÌèÝÒ{¾‹%'^*Ud×Ä£¯lÑŽ§”ózÛnõJ^ìIäàž(–“²UyŽkG4Ž£¬o.ȯ²¼«”-§ìî(„‘¢ìÐ5KÃ>VÚ¤…7Å­±¦+ü/«;ú ÜŲ"Ê0 [÷HŸ‘yA>Å?>Äq!—\0Ô·DjëHðÝjÃuûX??ŸF˜ ¾jv?…¸ŠÑ¢Y6ØÉî¾íµ¦•9™Äk`R1¡)i_;ŽáCdz(©óÛ_ǬZyìÇçô»Ä€ok¡ò²€ôæEžéëú&€Hô\xy€ºKÂ[ަp/ßë´&Žûš¥W*mRK¯×“û£-ÈËñþ' ÏS}òkÚdïW¾È·¾'Ë~ñ‚˜ùÂQ«Ò²£ ØpÇAœ°ˆÇvUÑ3¡¢•"ç÷˜Ï>)Ûihµ5>H¡ŸlKôÂ2rÙ†à…÷ZŒàuP^˜èª¤œÔ±mÎý×0ûƒƒjÏ3)TÌ#—·>CTßݾuH^¼šËB4䯓ۚ“©F¨ŽØ+p³–#‹çyÖ’®W%_:çè[™kg)mA,\Ðò?&)ø3ú6ºÛ> _dá eÍVJûB͈îù «ØK”ksÞäÛŒ‹¦*"15×õ"/lu×s{£É¿üfU3ÑDÙÚ¤‡ Ö7ˆÔ rB—jƒ:Ò³¼BEóà”œÏé' X' ¿n¦ç1–T+i è2 ,CëÉq“(šƒ ¯º­½Z‘Ï¢»dît?ït,ÕÂÔiHõ˸¾"Ù¾NŒ‘Íúι-0¯,¶¹]>Ù;p–ÐÜÕY¶H€®SÃR”LÕi„ßny0Xø”!½K‰wf´2 ÆÛ‰“sb| -s„SC^Žšwz…háó /©&Ij¯«~ŽÚ&wÌA±ÍhÒK\ˆ‘ÎvæÖþ;q; ¨n/­cðn˜Mz[iTâ<è¹å1i0 +òÙ}àìá7í¾¥„u·1¾J{ÊK£šF-s‚ɦ'Ùçú ›îM«¯>µ€2û»rPêˆáÖ÷gåžÊ›Ð:[žçûA¯DÔ­w¨4èžÊ`ñ%¤•Ð*Ûò^âµ÷y¿Py!=äóÝ!û·Þ8&ÐjÏhÕúdè„à uäi.R¨´e+`Kê;TЭ Ü/¬ÿ樉¢ï™%Dž›ë"Ëý¼rÆ>_$á×óˆ’üM{ÊÐü©Ááæ¥OSž&TË+Ï¿~æjçîE}6ÐZÑXÉ~êGÆ{Û¦Í7,Oµ ´Eѵ‰ç:Ïô["»ŸÆ¾q\K<|¤¹êêÑw«šŒ³XUvö2DaMŽßvõH¤¿¶ªýHe¿ÒÛd|èéÅüÚ‘¼ÅV¤í œËYÓSÐõæuýÌòËE/Éžîé½Þ:zµ“!ÿ_eƒv¹‰€}'±„xnz›ý%¯I Ubí2š'Æî@‡ö+ÐÄ©[¿¹ûþ†qa½·Þ옯Äû„M>}iÍ–z^9 ·äIÉÃ#$΋—ZBÌ„/èZ8dmõì‰%5ô à¬Òyó·Ú 'õ‰H„wÖ6³ŸqI}|ºT¤ì‘àÀ|{n^D{÷qB ”4Ü–tYÌêNx¶ƒ‹Ý:#.7ŒÓG)¯uµúà)Ú§yâÞ-ˆì=Ì{»¯Ä]ñ‰|üvØ­&N!-,¶ È©ßãäç˶†] ¦¬œM–ÔÚ Ø… æùi(™ó†,=mŠƒVdÎRNKj»-»Ø#n»Æ¸&dé)B–-»¯Rôß9¨u†enÏs¯©Ie­—÷-Ó\@[ëîvh›™Â¨°¶¶¶~å³±]a+‘ÖÃ7DíbŽkbÕœÉíØÎ1¤£´IŠòÇ éie Wðvåëí×\8<øœÅñuÔîOGQ±ÄŠ'ˆå—íódA™ëØ/°z&.w&©¾Å6tTâx:ªâÝ8tèÖ°ƒÕv}ºµ›Ú{vkÊ*'͆ÒRÞi¼¿8ô %f6¾æ—Vh;•RZŽçÚm]5•› òS…°E¦g‡Ïm³ªà¯â™¤’T³ðÚÒZÖ™–ÇN¶b>°Qg öNYMîÈYmhŸ¼‘Ë ¿‰«z9Í }–;¯LJô¼ òhSPhLšKÙ@£M-™>øe ÝMøèíº‡”r¥ê!IƲ¯é–H§!•W¸¬o€V†ß2Už”ãz&ú.[*õ¼áÖ™·KÓö½:¥N¨}O’¾u‰,VG±(óh—u(>rŸõ›U5Øâ ý½²d½4*a ö¯°.«ê\ÄWÚ Ž· n凨܇ÞóÜÿ&Ï£·ˆµ6jÊ5‹Ž{HlXsÑÔ`áÓ … ‡cwítzîj‰ oÓØ+Ùu)4ïéó?žÜ?†ÝŽÏÇtÊ#×r2颃e´‚eý@¡·`ƒÉ<‡…†}äÒÅ1#TÙàKÿ桼G/}¶ñwà³#ÂTX¢úØ] m<¤3o÷\¾Cœ®LVrðümæ¹ &3´dç­J†te=ª×qÏ‹QfÒgdwÀKhãHÝêo]š¹g¿^ö̾‹}ǨEvåë ° ¾yÊÓ|ŽêPa ¤ÊWó¿fók££´ye|Op@HìR”_Ùºffo•µ­Ö(~ÙWï{¶P\O?m6Á™vv»˜7ƒE¤É¤f6Š¢UöF”&ó–¡"±gâÆ…H¢lÝ2³5á¥fÛV :j<錵TV|rë #*§l€ô¦¬Œb–ÕŒåG¯¬NwÜ®;ˆ›2>¿i™VÕjS8q[÷½8X¸Óe~ùq›Ìì28íJüÁë“kzäÕÆ‚û9Ôït”À’V».R®7¸] ®îصJgÌ~È‹ÈÅ­­jÎGv ÁŸ]ñ œzÁ"¹ãL‚ë%2•gZo;Exë›*«ÜxX&œÈr”Y ‘eáöõÚqªùù[”üïxÇ4fKµ‹&˜‘Ë=¼A—Ü”¨â‹&ö.¸Œ¹$Ùµ* ßUïzØUó#Yp-6;Lú˜ï)ŒFš(W~¾µ›‘Ü^Û^Ÿ3ozàɨDSvH=ß…¸Ô3ËmÅÆè$9 ‰ôCÆ­ )Eàýpö øÚïÏîX¼ðRib°#G„*ÚOC’oŸˆDYµy”™åÏSóÈÞ"’Ý` n"oÎ{½« ]*_ŸSß”áéõ='€?W$C¦æHvoéŸ+jew+Ì¡nµBêX£™t«ô u~ÛØp𱌛î+Š6ÅTÕ)'RºÈÝ!·__¹¬À´ýJWåÁs1Ç)•Œ«áø?w±±¤>>û¯H5r"—•ì¤É·øÑ=Õº÷(/dkjÉ£‹’«ÌE .z -™/ŒuIÝ RQÛ㳸w]×Ô‘ø”Hdä@¹B¼vîŽË<·æá“ªd…jÎYv%Tâ·zŒ&ª2YÏqEP†yfÝ¢|þ„9€³3Ó¥^€ëÛýK 52grJd©©c©Á7„!ëQ}2Rg{2ÂÈoOœ ÷<í´Ëìz7N¡¹)M°R1€“I{×i§!ó뵚ðíù§ÆÚ½Œ䫽Œ^X뇳oÉ›}mK°Ó`tXƒÈð훣2U'O\вØjXqDø¶xh7‘ E)ÒîØÓ^ñG@˜@É#Â.⡆ÊAšm {(ú ‡w1‹“ÉSÛ¿8`Â÷ÆùZò»:}½)<ý~zœÄ^n¿§ò®Ã-k‚ôÑ#5½eNñóJm©\é4èh¡‚É÷ËõËÙ' ·ÙœcXN‡š‰2ŒÒ Û­©Ï]  ´ã[Z¸ Þ|œNaWZˆ>Öûh&‹ÝîG{RùÏ×]ØÎäQO}^ž¶F™>è.ñDxzZîEñ~[jÅRu¸ lçikœ2$HÊÆa‡8¬p{¦â àǶý6»©äФHߢԡ³¼<˜¯\Ç¿ol ¥d*d‚Ú¶j¹¯ÃCDпL€ÔY¯&«#db=ƒéƒãéYƒH\˜ñÓrûL¿e—Œª‰QÄy ¾'m5o¯)Iwd/*¬N/GŽi­>ΉF?#¢=pÏì ¡—f®Ê–ŽìEq ’N?Ç©D¶ý"%+/P)mz²¨Ãó’ë5[˜ûäDOŸ²|‡²Œdðgµ?»¥\:ÓmG@æõ"VÚõZ”DÉ Þ´NUUTí³žxªêÙ&Šïç«Ù‡„åFœY¦oX´’lqoF” ´]æà¤áô/sÖy®0Óôr¹jï ïëÆ³¾ìïÜLÞ=}È·ozûÅgÉbÔì¯l' ΉHSÃNE÷*_¶L#>,1æX$‡†9)//j÷ˆEA´îìÔZ~=°_SPìé­iÚP½µÁíà!-ÇrËd=‰¡Ã8{Õûª¤Ç-ƒˆÏ…ú’ôúEÕ_³¢Ø6hE¤ÏXgu|ÀïYªC6tRŽÂõUžëll$¯‹¦A^¼ãõ׊¢,U6¶@¥µÐí ¸¶eÛ¦ýg‹ÅظºžÜ‰½LA€0¢Ô‡?œg,q+—»qL¨þî£@ï9Ï#w¥Ä’¼B8˜R_]cšhð–'NEOÏræDøªîu+ÝWÖŒâ"^ϯO§>có•P S¦©3qX‘à£5cEU™¸¬‚ã’O½.Å«‡ÓŽÁËM­µ&¾˜ ûðD7Ñì:Ø~ÑXߢpÅÐia«^Íi Õ7Ô1XS•~“ÇÒª&óPa#“ (ÿÀù¹×™ã÷r·¹ÅPå8o¶C!=¢Q—Ú˜Ô’ŽXk»¾³!D¿q»uƒ¯û”¥V‡½k¦öùASÑ‹[æ=L„X÷>¬aÛª4›¶eúv·’ õSò³dçÀ¯ÐFŸäôuòˆ&(¢vŠÆ<ëj¢ö,Á¶d·/D ¤¹<7K( ' z+Záeãpd+÷skâ8 × âwD喝oðÅåg6(àOW©)i+æ>qê?uºëÏÃççÿÄ‚û?îüòÿóCÂç÷¿lú¸ÿ%ü‹þ?"|N»Ÿ‡þ¿äÿ‡„Ïè/"ðŸ¤?DXH,*^×ÿB¿îþð%ý7~À¶7$ÊÛÂÿÆã§\þÆÝ?|ø‹÷ÿ>ÐïÿMøúëüÿAli+´±³±µ´²³±Å{áýþ«Ã¿&ÿýî>ü‰üã½}~®ÿý/üKþDøÖý¿?vÿä ƒ„ÄÄxD„ÁK‰òÛˆ ~“>†€yÄ â ˆ€˜¸È'× ÁVÄxŠCÄÀ<â`qD€G\ø· ‡Vü6V6ŸÊÂܼ?é­ Xè-˜GPHôc)¿ä“Rx;›à†DÄÄy„Å>–$äSÏ^x·AnN›¾½x `Dqˆ°àÇ’¶ˆBŸ”tµE¸"Q¿•á Ä„ <ÂBâKùmÄÀ_—Zwoæ E:Ùl6+$Ê#ƒ B‚õT¯XÜøøÞ1âeâEN³õÌXïô§/Þ~òÌM¥‹¹/ÅØš/–Ž4W^ðˆp»MgéÙyÑ­“If«ìFÄb›uÑ+øÐÿÀ-Þ¯ä©ßsqoß%vbö²Øµ“ïè·'D­5/n':`*ÍNŒuÕÛüWñ]RÊaî…•©T¬8ÛŒ°ž<úU.à#¦½4Å;pÌΗ9ƒ}8±7kµTŠÔñµ*GW ©¸Õ%)ˆ°¨ÐE‚ í•顚ڕ•pª)ÜÚKý]Çe*£™%ÇÇÂÌÒï¦VŠãj^·Y.Ô\ÖyÚr¹ Y%%kr›0úfNѦíeÞ­³ô²«§ÆÁ3¾õø‘zmœ *bÑê~±ç@¥X^Z«ÊæÒR v*Äã‰å\á]–0öþ‹89:…æÖã[ø»¯³G%ïXX4O`QÖ‡£¸ya±U{FBަF0³Cë_Ž…u6\W.““$YŒ.n)VöÑ©u—“<›ÄÕÚű‚~Ë‚6 *V6ι{í !<¢PK2zZä± •¤µêxѫ۳ø4ÇŠÈ2@/™cuö*“À.ÅR(Iªæäµ“$Æ· Z¼jëá<’m 9öÄ7¹PUr|¸P•´Qwý¹bo<~¥±'xÇß>¦Åé¢yÑÂo]z}Õ6܃ ± ‡{ìÙO†gÕ@Ÿf)aÖ@ß×.v5èÒF°Œ_š{âÐÓT9_m|6n´Â¸¾Ý³g„9Z“/àÄHpºðžä¤Àž`jÝJÊIŠ¡r™Šï@ß?'o”ßå0:Ãoe³b#°j´Çh[½ÌkJ4ñQµqߦ”s ÄØø!ÊÜä:©rëÔá¦Ò¹DÕ®&™Ž b7É<×µa_,|Úk¶ÿä4ºóÝ\ÇÝ·•0î’»lÓMM’añb˜ª¤/¶ÿd:¤__ëÀ’,ª4 Y`Ú»a)Ϧ¼t\ÕwÞõvÃP2#ü¼}ª@ÿ™½Mç ƽ— Çé^wŽ*º´{̘ò)¹^©;c@GŠ}´xJ‚IÍN°ªéõÄ&èêkQ—¤SÅQùjmÍ+ÞK*´ÑáÞ^yD¤¿;Í|²áÞD+h…PDÄBf+Öïlwvõâök .ØÛ5™×ÙÆ“²¥ƒŽˆŸX!º8"€Û~+ÙdÐ#n‘õXl˜HÇÁ,é½]6&U½ZX}ŸáCÓ¬8ÎûɃыn•b»ŸÉlõWí9V1Π„²cyÜ—Ϧ‹JÞ®œtVM\¥‡è%ÚœzAqJ2y;IJ(¬L¹GµA{f&=êWïêÊ¢]›w0^‘s÷à‡(ëæÚk½´mŽåY®ìJÒmË‘ã§vŽ[h·AÜS’<œÂ|Òèù_FHÐFƒ\‘ îÇ1íZâ½¼‚‹A¼,éÎUåjE]ÉwÎ]B½=«‹±áÀ5”¢B tI–¶¾Zûá» ¹ÅžÇæE#½ÇsB‰“ûd*"üKý´¥ßélÇEíc—2aEÒ.(.4À–›B‡$;Ðïõ0zö,¬®Èšébùß{i/¦x82ðƈFz$øŒ’Ã[¯æBS|gÏ{ 50F5ì̺‹5YM ÂBª}¸qêã¡Çœ²¤ßj eòÚ!Þz0ö÷ܘdõZÜ6øÝ³O$1*<û%¿ïzì‘qMùVªPýd&¡–ºŽQþôCŸ•5.¬% u\î-K¿Ö¡îëáûîf+›ìUl¨C©€IA'sÅà®Ù?Reœ¡ˆÙþÖ˦ÃF–z îH]½¸ƒ[k‚k¿_|Fò¼_½RÐa3_T`qð8— Iù\Èž…c“’|d{†°±„èÜÁ#\QýÓkLJÒÅË‘á/ž<:Ð1^?å.,\׸gáÙ”$Ÿm“ð:ú—õÞ¾Ó ·»=͘¸Ul’ ÂuGôz@3UŒzÖ%3^œügKm'r;ÀH½ž5ͶGÃYÝPGb˜‚ëAcw­¢ö[`y¡fvÚqG¢4‡§%R§@Å8šÚˆÄÇ/’¤¯ >ƒèzÀjNЭÆÎì烟€TXªûrP_WkcM?ñØÙ£FXã꟯zßÙÿ´Í%ȵœKÉ2¼­ˆÖLh®¦ãuß<ÍqQÕÝé7…¹Ó_K2 $ Rk‘_áÊ>b#UÔ° >Ú­=ªÅÒଠ¼ûB¨'!-Û*mCc-Þx… ˜¥ìûìÔSÁ8—½PQ°Å[ñ³K…N¼d±%xƒT¿Â<h¡SÇ׆qÎå:)À͆foó`#Nóù¾©}y ØáJ±Û þÌ@‚(®­QSÕbÑÜ"õ^â¢i&…V}]K“N…¨r&‹i"*RG-ÛT¼}ë{h©Ôþpâ3÷i9øn‚µ#RÛŽW68~Ó'×s&u>z Tr~¯Ì ÙV‡ŸÍa“Y­ésÆÆpÂsŒñ·Æê ãUOŽ5Êõ&@‡ º @.ÝŠ9CÍV”>2ìÒúg®¹gP<à«<+i[^#wÇI6?F–Ýû¼Ýw,”¸bTß‘yìꜙ•%ûÔ‹åqw×é¶ ½æqØ|,ÀHûÑ–3;¤u´üÙŽ[Î8`@vÔH¼äDL~·¹bñ³ãÇ8a'd4Dd5n”QŠué?´=zßÃÇYžý—3ïnµ+xväö1o]9rME7Õz?p^Üîиù®mŒgo ½ Ž­ä½{Ë-9£74[wBÒÚæ>ñŒ¦»Ž¾YÒç„….øÚ/ÈýÔ¼ŒÛ[Q|?R%ÆÒ®C½–`˜ÚôpàˆH ƒé5ý,È …#OÈxF¹9Yо*-ÝHË¡: £AjÇn´n_TH‚”—·>ª÷]j]}À¾2ç «êàj“fÁvɳ&œuW²¶6Ÿ'(t©Å8baöæ5\}msaJ¹­ :%½‹euØHöýÞ„î’ìãƒq©sÐÖÖé=2ôi}}Ò» ž\™å–FI¥],A97Ð}ØLbOœâÍë8í£Àø ¼ÃáAR¢âÍ0§öª'%ˆê¾åÍ©‹…Ö.O̱Z¥˜Ê#´½ÈË'O¿[y–é§ïTÅÇhl!ܾ–A†›w@·Uà¼Íúb-žrÃ튥÷”âT?½‚»«€î¹Ï^½¦˜8ÀÙè‹’`M€kö2)^$ÙÝQ µ¨ª8ÉÚò~rÑ.>xׇd4(8.t¥a0÷iCôp…ÍøTgbÏpEÓhãûªnÿăUÆw¥Oš¬–ö¬ Þ'¤ŠNj™ÊnzGû¾¼ñ¨fì]î*EYú }I}ãj}ø ÿ3cC4«3êµÿ[¯Ù–Øýµ³[8q³­[í p™±ÍwhÛp!=ã9¦Ë‡ZÎŽR>ió_}1°ºõu·Ân0dªf·ºÐ·À’³ºÜÀWp™1ån€GÀjéÝ7oæW§ÙùEg ½«c£–‰™½½˜‰÷³S²ýÓþ«¯g'ù |¡ì²nÚ+#ÐÌäÓ\¾'Ï;—Ëf¡‰}9ôÜ@¿ªÙ®šÏðÍðÝÚ›TÒøðz,¦¹x É_f‘²–s«7H»¯çLW£‘(»,#ÛÿPV¡‡mla´@òç¿¿òË–65:Z»Üî2€È§* ;[ßT ßµÚ4&uù²ÚEìŽçh£Î)éò€ÕanÚ5 ÆøìÜÈ#-1øìÚ\Ø-©À)t·¹Q¼ OÏLCL»vUâz뉸‚†ÅåÚð}öÂâ ìî ïû›±Edfù5,ú\|45ÕS“ùû~-**oY[ïøñ1Þ¥ggÅÔpÞ™iˆµ¦õŸ½|-õ®NäË’¸”8nK²×|ÍçüFÝg/'žäÔ DÆ,ÖZº®¼»"r¿*+¹Rseô²8±© ¤Ò ™? (ûг§yù¦ÒÒvž³0éd_fÃì«åµó~8hÉÞǨÌÔÕù’¡Ù-£…8C–ˆs"Jû¸•‡×ÂÏzè!°æ3ÒZRÐO‘¢è~;´ñÝ»ÝW“mGKØ÷E•¤ d¯wôsó¾-WÃô¼[a[Ÿ?­ˆE÷7ÃdýK)q•ކà£Ê+¡ãÈ÷'íÃIg\SÞ].ihD˲پ‡ËmÉÓªê>XTŠÖò/zÙv×eÁö:Ô&ñªÿzÑM÷€.'O+£ٺŜåyÏ„%7•n6…_»î¥„—ÚØ}pÔàJ©÷½¤©÷è—9"¯9òÁSÉ9ÜðrÙ} “Y®1s˜KyNÝóèV8¶ŒÑÎR_‰:".Â-Ä׎˜8‘Hó2๜ãCK‡.€Uñ¦—¨T§dì„É8ɧßÕ(r"k£OIÐ+6¼Ó×`Ë$Åð¬2OŹÂIãÆ¹nÐëÉ;FŽ<°îxfÌYùúaFSÎ5Ó^ö-èk ª©}×wÁU wDôÅv˜ç(ÞTôŠH[v¡ÙʹH“("lÒ.˜ÙE¥œ~ŒÙùõß/R›<º]^´ú‰­ë¨!Ko™û=Ù÷ßaËÓ5ܹyü8ôÜe‡ÞÕ̾äðAfJéz\$ùaÃÊÀÒ“îwdßéä>Ùë’Ã0{1Ó^‘ßtÜ”~J,Žèm _­]`â#ë+n]9-à´m‡M¥X¬è)=Ôñ,:^õ´½M}üÍdÕ¹=ù…v)2Ø=.Ç#Ý*PÇG¹¦æ'±äQ—»Þ¶C§®"k^É],(äK™vnë’–<î/Ħ霥 Gr‰“¾šôj0–üV°™Ö1Á\üBÚå‰%J=ÕyÅ'c7åT6³ëå:ˆ¡)Ÿo9FOè˜8å>*pC—©¹u­ "H·zŠ—8{A¢úÑÔAkñùnÌXø»Z¿ƒç=ÓÄ*ë“Ï7 •º\Î<ù¸•ìˆ ¹‰¹8œ($Òe­­ÓBI¦-åò–66úòa¥žÞÇ‘©w*DpG(éq…öÃ}..çeŸLó´Éß?í8oh#‰4Ëæå;`ÖÛ#úÕ—å±"÷u³ÒtÇp'Û j•‡·¢…Éöx;ŠÚÄgRÐî(ÉfŒÙ…<{-Î&Æãàw/–§±@c¢ŠET]’³›Z'z£°Å”WêZìןZqïO}M~Á梇&z/¢éî!¯Ó]BrÑ–X ÃñÑl÷•¶µ1$ÑŠ zb‡J¨¥š$®ì-Ñ ø0Ú}A¹C§"Ê3Õüh^Ô¹hðUóÊž¨R–"´H9Jţǻç©V›BÖÕÙ—ˆßïØ~þ‚%ö6„‡DeX”f†Ó ‡êèSm…š>›=DU5­…{&-câä*äSs"–r5y‡Ïkb´§ïÏ—¢†ms‡šï»­)Ø$³!,MÐíOÇŠA4¬öæèãgWˆt8úƒ<2¬°g•N¿|b¸oF®âHyÿiXò»4­î"ɲÜÇbp‚Ûqõ°8¨ýt¯á´C¡œ©ŽP-|¬9gðokäÝŒ¤=@)¥Û ØTy®âeo,Zó²=rg¢ƒíþFúî\ù<§á¤BÇzš2÷ d´VÐóž—iêÍœø±-ð¥ð’½X‰Çv÷Q÷Oæ —Þlí:B2ßÜÚ™#…,¹ë‘ÎŒÄ5òœ¦ÇÒš•q£“êà!ÅÁÜCäðË=4PŒ©À;¶Kýe4+DYŠJï¦Á—hÈËõ8BÙKN";™°ù†ýAí±NzÄÐbhq“‰´#{Š ½!ncµ‹;yÚºZ5]#‹OÃïÈÑ)ðÔ•=îaÄB¥=( ÏÔˆXÏž­%\H:4ŒΆ¦wÌíN£w,ÝÙîqãæØn¸oºy ^áR /öM”ÑÕ,õ´çLsM¾AÿZ+Mýø¼ÝËmnôpw›‹ö…`¬"H²µî‚fßóbeº.ƒXH>ÇÏêêOù¼XÁTã)áµöº–tf,ðûp¢Œ±[F§©À8´§žu >Uºšn^þ‚²½8B²•!íjñ;}©ŠRBÜNZ¹>„#Ú½òy2<·×yçIÝÖÑÜ~u_NKÇ{{ ­,f Ä„C‹µz]3ý/öE y‡’YàÛoº·‡ôøbíEG,]×:ׂÍÚ^õ ® ×.íc‡…^õSÀîæšâtü®Ž‡l¿üK™ˆf™èŠpªéâ»÷Þ\h]{„¡ÌS”šd«]ÆèaÙUrS´ï­!<ïZ;ËL7®6McIÁ ýw½=cÏLŒ5о÷¡o[òÛeù–YÜÃ_LÆ$™ñæÄm•…Œ4¦ÒZ|¶Ç°»ëõ©ŠøÅ·LbsT– N*Õ0Æš‡ñu§•Èó¸×ª[¥v§Ÿ½ÚÞ7:x¥;µ¾˜Qu6¶;VßZ|¦';â\ÞíÄ"åÒ¬ÑYÛµ ƒcú4UQ§ÐýÇùÕPNÀ´Îʺ6ò&ÆÇW .Y:.ç{‰ÚÇË/ 8}0ÔgöªÇ.õô¤v¾ÌÑËYê0özCI”"ü–õŒq·rœ¸DÍÝ„> Ëæ3ã7/´3“Î@ïjÕ¸Åv5ñª'vö´¹:°”DEC{ª¥w`‘¢3´f÷:ÆŽ£½®^¡µš·û¯ÊHzy¬ âmÅ‚Œ-¸ 5­†G/𠍤\%ŒìÙ—.9q"b±šßš¶ÄÝØ„¦Å™·Cî!¶ï•P_¼Óˆ†cJÇé̇atu¯PÀ‹ð|ñ îö*áæøˆÉñpÝØ !l‡{F¶é@/Ó²Á¢8ÓHTJ½¸þ0ØûÅ-Iy,I.ÀC ²šáw¢ÈOé5gh÷œ—O•ÙsòÕµ'çöCMÔ³A'lÄ!Ðg´Ìú¥~YôüšÁJƒ$< &£œ8¢âèbä†cfv&þíÙ·D® uã'l¿ ¦Ù‡CÇ+[Ò¥ÓɄкMÃj]\UϽ§øzâ±çŒÃ÷·Ýèiï%Wl<3ŸUxó¾OìP{ýþbÖü°ÝÖ‘WmÎÒ 7n9ðV–„g×’Àr,™dW–” Eö#›bÈ^iNÆJcMŽŸªw9D$÷FR¯¼«e[Ùöj&(6Í®×ÃîÎ!ÝIkMâ·Œ¬¦Ø‘ð~Rú¸ž½92ž.ÄäÉùV½£Š›ÏF[ª4ߣ2É–ÈD[|Ÿ'6Ðî:›äTÐÎ$tÿp†éðÛeÉbùÄÕºWy“sZ2í]–%¦‰¹Å7z°4Ê÷/‡ðž¿œ_p"ª8¹`Ïné>V×Z¸Y-·ÍiÈ+Yÿꘚ]U Xã¹AZð¨²öHÖ&µ:—C×r^2ÂËT`Ñ™â ^àò¹N”;ü¢×ôƒ¾þ¶ã¼ï«¶_u’’[º+q²Ì½‚(Å,ê°Â´! 2pú³=87á^le½ >.™K‹ío›ž‘Ö^ÔSxƒ‰½õ+•‹h¥ø«jÅÛ³K3‚ºÉö°G¶Ö-e&=¤¥Ü;!v˜®/‰®"¥?¿HÀLãU!n!³¢ø”-uOJ+㸯‹wª„…–Pxêcø‰Þ¶±[E÷‰$VÞÎF±Ë&ùß½×}óò¸JÎÓÙ™ÚQbæîówæ£ ®5…A2̸zgÝʰælŒ“&„9núfÇA1MÇtb62,X©{nŠ'Kvçk”gWÛ©Ù§ÈöºsœS»ÎÒ}^dÁï¡È :84W¾¨e25-”¸½0éy4Ƕç¶ôlîä¶<삆ÁyiÝ/p!¹%3$­]‚ïéäùzi`Ž/Î>“«°48öp->[’èyÞÅ&{µ\îNÚØ\]´¼Ö>žÇÇá>qqo¸k§.åó ]¹ #AÓ… TºƒçÐ`¿àt.?GB"é‘â×Åh߀~š#,”å8û:(`"“—&$®ø+L’ÜŒxéì—Ó×õ*Š•âqF®¥pm:3ˬvºð5šòˆ|…^r‰^zŸ¿£íÅtdW Nyp=Kh˜ëØåÇb8±÷J’nØQS–õøþjÖu:X¨>¾)†6 ºëGžƒqÚ+XNûÌÑqfÀP,Vdz²‚OìkÓµëàÐ Çß‘L6Q×–ßC§I²U ·l²ìãÇzOi*د­=¹ï=×ßÜ*‘i_¸ýþš×îªvˆú΂ý#‘þJÖåvÚ%Èsº™3×ìaþ+9hw™Ih‹Y‰BÐm©,Š7ŇŸjùº)4é`Ëé4áñ§×x”T° †)1Ì|‹øÊ.£V:âžÜ±—$Ä ™z^ů->(%¯Ì„«™¬uÔÙžˆ… Uè8¦Ðôü½ÇÛ‹_œ¿’.ýâ†qF:1M¤KlnG8zÁ^Š”vZIñ¼¬9ô T&½©÷'fa§ KU¢%öA¼z\—€XVú>œâÎ}NBxGåõù•ÙûÞ¨Hct®»¹^7>-t!‰=ç2 ùôýâRFç¥K ï2(aá‰tð’ûžj pjˆt½QÉ[J^tˆÿ]9:,ž é”æ;pig{$±'¯„±…S2´¨pAü­uz‡‰]Ç_¤Ißr&Å»aWö|÷ ‡té—;|ÔMOOÊ-Má)»ä·+în¢‘[{Bæ­’Hë AÇáb® ­4¡Ht®q6¦ÿýÓ ±e(j4¹-2)£ Qóìñ^û™Ê#»ª*ÞÜàKé{ç¬àÊç}¦›-Éa fÀãÑ6DãmÃ#Qì¤+Ev£‰Û¶‡ç÷š× ö%ÊÞ“ðqW¬ Î8³ØÐö¶í\È# öÁ½}™è=jš hšt¦³¯ši½W?Y›Oó;^6ó²¡[Ø»þ÷Ö"ƒ©êÃrŽÇÔ¼¸5Ä$Ãï¿«r¶–ëà¯û~WÇåòW†-GxzÜçšìVÖjÃÚ^M'î#€Ób ÂO([GùÏŒRàºÈ/@5˜i Z¢%®.]èL)¹g¿ÍsD5S+òQÜË8›Ø8x´G;íóÇ„¸sÁ9DÓí£1Ú/psã‘|°7ÔÒû¤½ç¯vö_uj÷I<¸ÃV!“"—ØsPÕwÿ¸ð0‰ëK¤¶oÀ"Ì]LüV0k ¿ïè)ìᳬ> ±¢Í×ЦAQáAãâm“ 0L­CSÑÑ ÈNDBpnç–.×ÙàܬéÇãcG7w&XF,içß¹ëE¡®=T(Qm}ž9‰ÎQúÔeÞZÑQý.¨ãv-ºXáÆ’…mCt-´]‘Q:øbI$f‰¦#™qlçÀ÷8¿WûÄŽWñÔÅ¡…*Ö—uãÆõ²6åÅçÆÅ¸Ý•|ƒ€œT¨Ãq´ûÇ8ø So²º®ŒÁöÅÇ&{w ÝoOW¾(µVâ’å>j$È]>F·¿«;F?µ¯wÔ€Ý1VÚŒÛ8Èä…wk×c‰VÄîS˜£¼=:Êm´ª-ß“=ʽ"iÀ4½má±/vÙ^]@J€XÙ' '¼EáiÏGhØØ£­%oíyu¥H®â–I6œ øu4Y+íÄ¥§èˆjˆÌUaÅüc{¬ò ÓýRä§]—¢!Î5vÀ”aâ ’Iô´–öPä™’gžˆŽBY/ž€.®µCÎl}bƒIÈÑ[ëÓÀ¨HÞ,nj->‚nL?ºkYÃôôI|C‹QÖîmèúM¾£ÛÏšNÌ °Ë…sG^½8ßcÇmíÃÛâÍÊg)Ð&/ÞL絑:€¥Í?Jþ¶ƒ›H5Ùl©Az½~Œ3î•S—æ0Gܸ4ö6v¯Jÿ›5‚Û²âäBÜÞýºË—uÐûl·4=%w±¹PU+¬L›oãçFÇb)Ðòï°Ëì7º°3‘¢É!*hkjrãm7Ø’â½Ò¶Ó–ì’÷e:騰ª:ïÁ53Nq.g ÷Ð]¡ž‡¹0v~ù‹jF¶H!qiY9ÛÜ ‡Ä7TyÞå_ÿ(mÞvåàÂG¹ðؾ­ ˨výJöÉ}•©zaÖ¶÷‚™[“T^'oƒ{DëÂÆ[®PDµ ¾êqàï/Ê¢ˆ©FsÅÞ’ž[2€òoãÃY¹oWÌ@‰Ó5%,Ær¾9ÜÃÈžíœw`G‡öývÒûÄ·§·Uqr C†IîèßRõ½o©Ñ­T ègCVÍ>áµ#ÌŠ:Þ]N¨Áe"…gf;UCÆtª^K ’Æz%MX«rKÞŠ!§«b¸(ã3º޵=k\HÔÓ ß‚Æ]g„Ɖ`¡„6“Ä%0)>ÚÕ4pô î<Ù+‘.p…©õy[R ´m8¤ë–Ýb¸å¾­utt\®Ç³vã£;c£rÌÑÍNG±š'¸ÙuháÏ%²Dº¤tSïo¼®W*Ïà‹&òç:Ÿº/Ø'íNã  ‡u#:™ÃÑ ªFÉ,™Ä#Z$°ËE§ÚU œÚƒk­„̼±÷N%Í€Èxl‰ºM³(8<µH‰è¬‰Ç ¹Ì…tûùà…J·D’=x„–ÌK¨«Bæ»Ézæè4ƒ]Ö½?áªe‚e~èsS&çe”1Ö¤‘¹u¿9í‚niZŒo”TüI÷aÇ.¡Óމ£,pºNN4Ãý™J±9ZðV÷Ö|ôšƒYÁíôöì½¢ó¥(¦bárûöÏ“™àÓuG&YòýúÑ‚ÓâívS2Ôë=óèÞ-6ÆY®ÍH›¢;t9<­ÞÚ‡°0÷Aª¹§²œÌ¡=®™Z¯Ÿ­P=¿ÜAѤ›hå⇾žUËa Ñ;¹å:+ïN£xKú|ÿyù1Àˆ##@­æW¾I‡Oj®¦6íPChÄ«¹qñAìÔ¥uj¸X²a‚·*Õ<¬b3"H·Í.¬µ “—lk,¸æ]Í% ½ýCJïbtCzša|ïÉIñ&ȈM<ÄJ>tá"îpû£…•Y7›Îó0ŒQŸW‰P´<åM•ª ú¬—ŸÄ{´k* »²ªê‘¸ñ ¶­t¯ÏŠc´ÉJò³]ê :n^–)êc¤xd oYH*XL¨c”'ಪÍд›É#B½Ù°âø„ ãβk¦Î*¨.Öôû/aõ;E+’¸®9çÜWm>¯ˆö:‡>òúYNS§ÀøÉS,â„‚m'¦Ñ ¥O“quŽOÚ]$Yªv—¨°ö¶W\Þ ­?–”¢ûæ”NtN–´:U:€‰]ZSˆÐ ƒxÔât›Cæv/C¨³T±SN¼r¦Gvìæ?´çâÓþˆò»²+oÆÞf Á¯GzÍÚ—Ô?:}.è‰E”¡n\ôÄ:‡O,Ö4оOÈÖ®¯ÌÌuÜn¯¨§æ±­@wwȣᒸßê®ß1œ¿ZÎ0”=ÈêõyÕ:„&›™Õ¯ÊWl ìS#-Ž}Zš¾mm£‚jËJ'Æ:ÍòÔ›‰ÓÉ]dŽ<×gÞUä]Ñ8uÚéÛí|ÞBèøö¦jTfºV,„ï „5Ã| ëëCû{BGÚÕ”NW*¼= ãï½^ªQP´1¢§®”H‚{×›ºK¹íÁ¥Ë½ôÑ,eh½¶@›š…q IÓ9sª|w „AÝ¥]œmuþü»z¦Â¯\w”g½|œ‹–ÛQÑ_*I#qŸ–û0±Ó5–FÝÅ'R™Z<ˆˆq¶ݽx’»·çö¼”K4-2qILdN´{HZO„³qf¥½ Ö®\PÚ6>r!®Á2DŽÞ¥Y$°ÕÀú2 0²(öjÖ@7•ïÇ:› Û¸Ö¸!T+ñ.hQ̚ؼG5µ)%‰ö¦œ~ÐÙwÙª ‹å{¼â.¼oÙQrbÌ•hÙ>íb :º¢àJ¢9çå³qàÖȦSÝPšBBܳWf&µ÷yÄï±xBU¥M†ÄVxþ•ýþzˆñÛR#Æ’šb" ­Dñýæ‰O›c+¶c”yé]ÚìÎðܧD»Z“ÀzNI[b¯å_;‘7)¿ê«Æ3ìvÇ[í­:Ý݉‰ã7d‘‹ûTS“„1š^Ç|‰5 7†‰»,„ß.y-k¹4Óì€4ðuŸ"Â:¡ƒ· ‹Þt¹t)±°KªqÖ>€þˆ³Qè~|–¡@é%›Ý¡à'‡ ï¤cŠÍo]\ àÓ,si÷§çÐcLðÁŸºª²m"ÅÊîÐö·Z‰Á)4 ±Y\ ñ<•« (þÁ약¢{p£n1‚ŠØü[ÍÉ[·£•°ÛôpÔÔº»ˆµaOskÛ¨nÚ]¨ú%šåÉ E·óÅÎÃmü-0û¢µ¦r¤ÐëRæf ⾜à}M(7lÞ#E(†Ï _M Ý+*b†Ð+~s'ᤩϙƒé#§ë*¼t8p«Ýì¨EË& Yv/õ-Yj¨hû'sn4£gÏèšÝåü™ ½•“Û©hùy{¨øN¾Ÿ¥ÈòóGïÒ,cJ € Q°î~rÎã³V2Cß½µ×{)4=n§ãO0- ­¦¾ÖÆtN?…Þƒë#8OÛ £‰¯éÊèm¤¾Ó¡˜xP[4±i8–]'ö¦Á"ýÔ¢Œø¬sa6£ÛÛ‹‹‚Ý÷†ň±„6—4© fZ …ÑI¾ 40]ýÌÔÊ÷ØCÛ÷X®Nx»h¯€Ö+ÿª»=®ÆÞ9Û·0‡«,ß cWyTPŸ×Ï-òYÁ-ç›Ï-ôæ¢B ið~ØGïyŠßGÏVi~F±_Œƒ¼µìœn ~ì]äAˆ³ÄÞT×ÈóH4n yÍ >Ú{ =cQå—åÄ©‘ÂYðH×¹d£¥„y—/¾ô­-nÎ72Ï.oV( háB\8/«eÉD¨g¸Ú+ËûœÏÐ@·q!ê¡®0Ήê5"ls›öÙn„±kLa˜ ÃÍ9ŒšÞaè¢Ñ—JÓâ»wÅ6õ&×ÈøÈk±{”/[XaÖe(å óÆG ) öf¾K1‘—ÂwxS̽Z†í딡¸“|Ÿ{ à!%ì£aõí áK™#˜·b ö9Aű1K“•CqN—*”è®eçh%>ZqÍ”jah¼·íLf×IT'£~kÔ‹h«så¡ò"¼Q²Ë~oÉÈ0Z®ÇÏÝhVËë>ù.+B‚¹·¸œËt¾øIAËAÜ®€5€Wia¥<±k¥³f|ÒÙ,˸‘b&1õhú¥­:úâ·¤ƒGø2= Dë¡¥v ¶Çæ2 rxç&&‹Â÷e—µ3ß´O:A³ËÅ,#bðq|qœûQ±y±©1’]«}š˜à8œf)zu~T3þi3¬Þ5»i€Ì{ªQM¢ÌþÄÍ%¢ ³ak÷ ì_FquIpc¦ùz«0‹³£¡æ¹ AúNé̤(‡±YZϺýozˆ«øVNÝl]¤ó4ˆ\qi ,f,(7ݳRjzi´¹aæ±#‡~²³â–§›ÎvþªçËŒ c+éGvÆo‡s—¶©pkŸÖaˆ.k-¾ý<üöºÇj‹ÕUë†Ák5s×ËD"%[!‡o.Ü‚HI…ÇÃúƒŠÉqm{EuÄ|°ÎÈõ@ౕ!¼žº {î¼›²¸&‹èé 9 ¾ç“,ìÝÎ0õ¸¬»+úH¶7¿ç…°­+‡v,´ cÖÞMSY`ZÎCDD\±¼~o[Ešc Š"ŽcÉ—øÂW.ú¡ÃVÐ*å³ÂáÚélq¶M?ïÆ©íScn›4œ[­­X]œ¯ï™À|+üÂ|>PöÀ8šªþ kØ&jßø“XûIA#ìË´Ùkfˇn÷ÞoB$u©eê«Kv¿›žŸZ]¼Àj+›äçdÛ½‰­1u°ów÷ç;ØjèØ¡‹æwºÄ.Šñ©$B='v5Òç-NùÆ+Z¡c›–F{übœšöÉOX‹iõŒTÌÈ´? i²sMÈ´ÇkÓ™žr†jknń̮6Ò_ð¿›½•6¬]{í&Lay:P h³¬ð¸x:æq›­o£¿‘Òrh©šïUn£TéC;8ådYã$K™‰qÒ='uü5¥¼ÝT!“C‡yzÔžÒzµ·íAbaVoÁÉ«IK{\]Æ^L»b¨œb;{'ÜM±ØtR^û˜l囚§Â.GÄXŠs£ý´ê=×G)¿§¥î»°L˜±zK ;²T2`î߈Étl#ä[èOáÞ—Jç„…CÊ.È0G¶3uÉ1$=?7‘Îq%®Þ«qsÄ¡|m”Ò'Su¥²…YSG»wæ!¶[æÅŽçBsÑ*5ܰ/ì«ï“b]Ó´d p‚JШg.ª‚;ÂÑ€î+ÞŠ5VŸ*zI„U†™2ô€j`´¹„h¡F{¢åLSžœ'z¬BòzP>Âú4ón0_Jcb’Ü„bbáúP$éZU[³ë+’›çnPMKXÌ”ªû^£ãk[ôéæÑRt¼Ö“_®uMÑ÷ö¶¹áÅÙF´ýóFëÎRBXoÁµ¤Õ¥Ñѡ޹öfc,a’3BÈ—IäÉ›=Oaž“ŠÇK,Á·2L<ž3LJ¤ï=z]­£ÖÏŸØæ^´9-ð%:„ ¯âTéÍ’~ti_Ø$ޱ¨™vìh¨NFç¥jS¬JÇ¥þŽáQ^×r ß ÜÈl'âDÀ›±JüŒöøÐØ€€é}ýÇ{%4}C¹‘8&ÄÚsCŸó#8&`f¢·zóM°$<¾–Ó06¹ ž¸êÅÄ=¤‡Š_ÜbtüJ{±ÀJd´@¾£íIh±lmÅ›¾:¤‡yöÍéÇÃuZ–9ûjMß´ÝŸo[L÷ ¿÷ì"D•Í=¡¸{&Gúí¹D€’Ê4>ú€WÞw¨¶â¤…4{ø]$÷ +„ÛÃæ‘É0£f)CבHŒ¡ûè©ÚæLs¿ügEÍFó:«*7ŽÁ}5+êËôÁ0Ñ59&? 6î 4wñ*'k:Zq&À9ï^ K;b ~ÊJÖ¡¾˜u|÷•+ïv)ñÊm• „w½º](it§ýaÓ†KT9ZÛ&lÁªdáZRù¡p]úµ‘½ð¶çÀò`Abä‚åtEº7!n|ùCÔ¨UoKõPò ž:Åû®³í¹Ë©§= Ó•ýþUSiIýÞJ¦UÎtéæ nm|©;Ë÷%Š]=¨=qnwJÁ3æÝ6¼è†³¶Ìc ¦Ë=_Ƨ÷qÜv¢Â ŽšHZó¯Û´HÀ÷/\•z=RpæÄnÜIÝ •Û[hø‹ÅSÚӽϡ.Õ²†ÊákÑ>„c\ð òbõÅ©‹/»³šdç«õïõ-†y˜mïv5óNA“öÝh ,žµž…µÆ fÁ1—\aYô¹÷ö¼N(^x@-!Ý ÉUîYÞæw}ß«—…\Ó–!å}ÀÀ­·ËÆ“pãö2™ˆh{cZ8ݸÀi8ãòBÞsÖ4chkAuöaS6.a¢UÞÞç`ÜÖau¯V­DP"'o+Í©]Ûs®‰ÑÍæÌç6eæ&‘^õǦ³h<Ïá‘«º\z‰½m [ Mô7N-ùçz`1ÉF9Gú1Óá}ò=÷ΦŠéT<®9ˆkh‰1ÜK.5I¿ WÅèÂoáB.š¯f÷í¦÷y 3H²X>[ღéI)61±$Åšß¾{½2èýB¢‡çɉíúññGJÚ§ž‹ã¦˜K?;ØMêI92Ž–Üh62Y1÷2œ+Í>Ý<Ç®t‚VvjÍ„zúÝI¸M9¥ï1^k-?óÌÔMƒ#‚Q'åoJâ"g²}Ë+Ïš„z²“^êØÑ—¬ ‹°Hw†ú\Úºmè2º3/qHÚꉪ8lÒ<ù=ºç^/5ÖÎ$—I‘µ¥Ãcæ€6ź=Q.1ºÊqˆ·"ý@+bÕãÎj{×mÕ–3Šz3X‡§­¬ðkgèÓ´Bë¶OÆ;CZ.œ•Îé‹»æ`Ö-Q×[Ë{8Í\²L¼ÁÝ{§O!ÏñJt2ÙiÕËb;°¼×oÔ…Pî’O©dÛË~\e¨¨YXt#'™÷À¼G²UóìmwÌ1—¡èõжák÷æ®,N¼ößö3²+ù¤9Ù%XIeæÑMÄ¥E9†&Ù˜ò›–]Ü/®\;Æ%¢þ‡q—M ÇîgÝz@¤…“\¡¸–ÔMeÏ9½«Ö­X{ƒ ÃºÊ­ÍšÉ §1#ãÖtã5Ù8[pL]h¾º×ˆY•e©@,ºÝ_‰¢Ñ!{ìBáÍFU§çÍÓsk@cå*„’Ž`ã%ìÒ‘W/UùÕ†™÷߯ žf…‰ú©p£WX¾ø,\ÀÈP¢}wIhлsZÂðê±Ø§Œ(¬ã¬“z–q+âML~{6#t¦D©)Äs‹1LºîÐ{·,-i´|VÖxË=ÐãÆNnm·V;ׂkI€()ÏËu½+;áah‡Æ#-¾n/Ttz¿eÞõx™:™l·ÖÈÉCºî±Y¼˜¬¶½ ë‰Z³GÃöN¦RÌ¥Ó{’`’2Pr»û¥àÇ^êh²èÝkÉå Î…g(R×799TB\k°;Ûü¶QQs´_Ú»)ÊCÜ»IB!ŸìQ/Ô(XªXQ¢Þs-ðI¤§_“£Ë\ÕÈã§Èv´c—«w(ÝDJY EGÞ¾Y*ÑVY× Þ„<ã}#tÓó8nz·.R,iÂvÐ8tiÌî}äuêÊ»<º{úeyÃë˜Hºâ„ÑÓÝí|çi'^†Pœzœƒfӑ̇£U2½Æöèk'{XÞ±«ÊÓ1L"s +Lß±('®,uÀ8ÄWú?¶/Éžifê¹ò¬Hø Öe´Hg·çxmwKŒ‡ÒZ…NwÒŽT2z¸=ÄàÜäl°•k2ZHˆ«k^Ç6W%«Ä.“žªÐÎùõV© RiìuzwÇ`²7¡À@¤q©_â†=ÒÕ%…u ÷ »ÈHÅÈ=[‚ºÕ{ÚÃÝ&qæÁ6Çei Z@bú{N¤;•Ö° ­¥\ŠÑψ½HXg‚Ù~0ÌÃo„Ž#¡H“®Ä¹FŒ8ÜšOéÏï} ½V’A*F†ÃîÏÇdï#¬Õfì¨ã¢¡$;KHŒ[,>¶º£';BTÓ±ú2òÒÛ;¤ƒ»«\Ú+,燈`,”eÄ#¯+”Ÿ2pì›§Åe§Ýpľ¸íaîè7_ _¼¯`;â_j™,eêˆAø‡îÎŒ2\]Ó7débHe\u¤ê½÷¾FéðÊÈÄ» 7î<éj¨¨=]ìöveÞÞrRG*cß-6] ^Rl*Ûá¨côûqN¸ {w<‹ãÙàOÀ UíX -Çúªå<9Û›íò¦½Îë,µ$/O­F¿8O•¡ó›ÂF)sŠMw*Ù>+;[¨CWTH¬hš±çi·g¾ô…®ž«‹Iä8y$ÉÁÔãÒ­-4Á7l+üp[ûÙ€E®œ©z t‡¼7üvú•‘ ek¢MùÐtÛÄ%6©L\7Ò;ŽíÞ¢7ÎÒüµ¾Š¤—Ç®¥9‘by¨M¡írtꌅ¨S‹‘e¶{ —‰¼âÅ\y·¥,VwèMÅyÖåP\ÒQ+“ï™F, F½K·XfçH»ñQª@3ª–e­Œ–¿žZÌÄn]1/>zR^Wc‚ Þñ7ÂB£(_wñjZÄÒ1E÷—YÍTt5&ÉኔùwÊÓ#?¢Ç†nÇ×›5y #FBQrB\¾±øÌÁô 6ò¦8ך-©¬—¡Ö”oæ‹rìuc4Ð ƒqÔng|F÷àtK}¾5IÃrb¯MŸèFi´xkŠnc¸˜s¶bù"uG 0I§ˆ~,ªîïh—T¦s­’zOæ¹úVöÚç 3hmï´„Óe•U5sÿÌ%#…º ‰ü`n!oì•9Z–xoçµì-[¶¹áÏ(hÕžXFG«³r÷êÐVˆA.£Á9×–ê/‹93´*sEƒR2æ#÷àÄTé®+ú”JÚëFÁ>eÐEJév‚ïîàH@Å@"ùI/ñ$_¶M…>QÊ•Εqż§¢ãïlÖ”ïÓG»38]HD»8¶ÄÆEžçË@¯ŒM(ùF¶+ßO¢™®5€-5×g›i•©Ó‹ Ýg»’ÈïÔî;9âMí\”{û 3¼Œó¨tzDd™SryX[\’j';V,+±EG” K;æ£D—å¶ÔÊ78àé“>™uò^úZ‚g„aÚûÀŠŠ}”%Š›éÄ)¼ÊŽ­×ì!¸iv5I9¬„; vQC'Ï­É•# á[íú$ºTû¾š )\úÖY™V•f™C’:|ý3-2Ñ£˜÷‡)Üž?M‰}Ýz‡çânq_Öi¥0§VTNi!½æ2•¾sÓv%2y ǫī¼Ô“·kÈ‚0‘õy&éþ"}9}s×Jùo—ªË[QmǼê¬i°¼³r¨Û]õpEãè ð²ú±å­Ñ‹û[5·3ôrC=y«sHßÏYÞéuê2U÷mX”®4ݾõ|¶ù}ÙöÖ %eú©ÒU7ãdÌ'Í^aü—Mi—Ü/à W^9ìÁÍ ]ÉõËML ‚¿ÍÑ€sAKø«a²þ »,Z ê=Ðwy«k…5|b\Œn¦ö•?#ÌY½pqµHíPeGn½5¯°ò|¶îêµS'³û Ÿ'eÖI‰¯úqÚ”Š*„ÈI7¸A£†¤O-®ùqî‡6î¨;Äø¤BÙÔÿvHÆœ^ë¬V“λsOÞk¦zþNùR¬Í±•ƒ¯#Æßôȼ( v{sôÞMy¿{7_ç«Ë €šXa¹’n#ýä”äìݱ«'rT½©Ÿ®¼õ6ðZ|ßQC¥–ªéj˜¸¢Të¼Ð²;­SLalÚ‰ÏÜo,¢<˜(0]Bcí HÇ-WŠk™MK-u¹t =®qþv5¨…`ÈíÑÖ›R¦tÏÖ^‡ó† ¶Š’kŒíÃE#ï‡<›N+dæRÔ 1¥„p&ª¹J {1aIF˜ésø¢HÃóð vø\eDs‘Âîeõ1äé£K¯'øá˜Ê¦ÁàûœZHO2øqÏ ÿHü»lxœ(5‹ëôñ~ð~ïód5±Ë:= ™g+âÁ¼)â­zÓ)Ž{Ö/[NßÞ—¾LºQ~¬ÝÓ¿§Ä+*ᘂvF^KhqоôÛk;ï °½Îƒ:zN,“:GUœÊК§qîÀÏßD-VÇOd*¹d,/xQ0Ü D‡!ž{±è_à¥ËÁ=á’¡ "Å–U{EÞ<'rçÎì„T½ö$Tˆì½Vªñ€:ŽºÙËöZ®‚úJ‹žÞ±‡„¸Ã'd4ˆ-©‘Ö̪9HL-¨˜¾Ñê;ý˜WX­] ŒË£%ÜTèF2ôÍcÅŠ=H£È’|%­amžÖäX§¶ÅžKëÎB”$KQtx/!ŽèÓÜ%x#…Ê@Ô|”/%Z€R¢æðQáø¨||”*5ŒJÄGÝÄG©Q|T.>*¥^Ñp) -ãѼø2kšŽÌ³#6sÆK7äe;‚£÷ˆÎ¹ªayúBÍŠã¥É{üêOKØÄ{ø…Í^c—xJÙm^C¿ðpF’¡ƒi {Ô³c÷Ýõ˜|ƒ¾#Ö™¶-¯AœÝ9Z…j©oU:ö³·*G¢ÕÈ_žÖ¢ÍÀ{¯ ‚„ícµ€­|›epk+£Et³®É­þ±uyWÓØQ§ ÜO'ÃwR¬"ËS¡Íßç` vaOÖùï‚FŰ 1œ«û8›j–}î±4\Ë9}G^.¿µù²sèÄ"ªÈ9éônÄYý}{ÄÞ(cIyªJœv-Á¸M\ –c‹¿ãŠB`|$3´¦pÃrtJÚm$1í½)~!ðØBøž2ɣ³„8qN€N¿÷Ñ Žµ´¹ ,®"©šñUâä{BÄ¥˜mQ•xH?¿“öcøÜÿø'ðÿ¼áÿ]òËÿïŸÓ_ðç¡¿è/úÿˆð9ý…~úÙ~Ñÿ„Ïé/üóÐü‹þ?"|F°åÏBˆ à/úÿˆð¹ü‹ü,ôùEÿ>§?äç¡ÿ¯÷?~Hø\ÿ[ý,ô‡þ¢ÿ ŸÓßúç¡ÿ¯÷¿~Hø\ÿ‹þ,ôùEÿ>—›Ÿ…þ¿ÞûAásùûYèÿëýÏ>§ÿôýWAaAüsd뿿쿾¤ÿ/"}ëÉ ¿ÝžÀ¿ÿþ  $®¿ÿ""$ ,,(¸E@,"ùõþËRLŠ: ƺJ U-MîÑÚj f^~~#!~~EÅa>0Èe‰p…¹ÁK'~~%mf2)ÈÖéshÖôâ_O„ê7™Â÷NþÓþ®Ãû9ð€óáÚ¨ÅÂx˜ *ZH”->™”3ðÏic+ÃòF›“›¤½ÌŠÊfï&)Å¿žºÞí/3º¸#Ý$õ-Ua@Þõšû·â·°üÝðx]‘î(kÛp$ãgÄôÿï† 0µúê±A ”Íïwb=á÷z°ŽdµíÛØ:Û<Œ°öÙ£,¡ë,ôû\)”•²±-JF ·¹¢¬ëª¿¸åŸX›¯À1ƒ¬([”4³3!á–Î[ü~Ó@f¥0z‘ÿC'Ȥ€hÂhß?) äµDÙZ~ŽÞ¿ðÌ!3Èj‰×îø'ñ#Ðm€R‚ÂÂ<‚baa!°Ðo]ûV+Öëç#¾MÄ?jCXT”,& ð‚ÿ° €QÄ¿€ €b Ç?4ù'͈ ò@„„ñO@þY3BŸšz„¨€ þùNqa\;`HZ }…(w7˜ÓŸ4ç ˆ òæàŸ ò髟(Û 9úÓ&„yÀ  1€(Ÿ6 ÄÎäÊ sý I®P¤§+È ³†®ëZW _£“71`äøøë£.p×ÝÐÊ eø—=EÿTʹþ×E _øÿ!m‹ùÀxbþêñTkgç?”510膤 ÿ!i䨨ü1rþ¬)aA1`2Á#&òmK}ѨÀ·6ûù\U« AnÈñx=„×Î ¤Ý& ¬‡Rn–VÀhÿ ñ¬mœœ-ml€þ·ß®Î–Ö~ãí_€eÜ»“ãê·(  |V"óú@ ܰ“ðV ðý[E6%¸-\ÍÍ®ik ôØ@ ̨ ³‡‘~º!²¯—m=•~U•ÞçŬnnHø§æî¿ÕùÒ¯@¬*ëu@e~|†îËè¢0¼抄–ÙGô33 OäOXønúT5ƒ\m?”Z'ÿWô%¿ý T|ÛÌZ§þ'Ôæ_ç3¼EŠÂ“`C¾7K®Dq=˜¾((@Áœñ}\ç²¾aº!Ø6N@ïà€<¹ÉHÙÿ¬däÝÝ À RŠß o¶ã£md4@@F¶n>¶NëÖéoôæcNnH ' Ýs=Yn}æÏ·!äìmùÀlQæÏr¬n€µ ÚÄSÉÆé›3Šû¼w|à?)¦ÌI>/#(ø¤Ìú æŒBãÃ[®n(˜•;~ê C¬“ ŠtÆX–n ˜Èæä²²Å-vîN< 'ÈHÍ@Uç¨H^Ûd$¯§'¯m`, äÐ ¤âŸ¿^¯wv‚ÕzZ¢P–7o¼h)é)¨ùå«iªãGKe5m%}}²ŽH¤+¯g ¦pTS^¤{TOWG_‰dðQs®KØÇÎ#È Œ^®@  è°¾"h}îþ1‰¤ok»Þ¤³7žG?ef›õ^¯'ëÆ²ª®Ú&BÖÙè¶Ó‡ÚÖ…ÞwåÄ `k@–ÀxÕfc®-K3¯k> кþ”’]á–NN2›K@ÅZÀ?ygH K‰J‰ð”Zoñ³•÷†¶Ú›ðK)üüžžž|W.îâ_Ÿ°~ ²¯l‹×M†õ‘ïC óGu‡ÙØ8Ù~jO¬k‡«RüPQÀâuˇõ5™_Opÿ…Ï÷ÿl–ýˆà¯óÿ?$|N»Ÿ‡þ¿Îÿÿðý!? ýÝÿùAásúÿD÷¿~Éÿ ŸÓÿç¹ÿõëþÏ ŸÓÿ?zÿ "$‹B~éÿ¾¤ÿWk1úÀt‰2&¤®P¤“ /|cõïœùãó‚ÑÍóøƒ¿‚BAð¯ó?"üsÎlì߃6Žü:áñë„Ç;áñúðs¶\?ßsů·â—ñk¶N¶nø5JW7üªèå¹¾ø÷Ëâvü6‚ªŠ¿±,þE<<–@ñKš–NNÀ/¨- †gïš¿Qùaó’rC}²Íƒï7óÆ^Ôwé-‹¥@u¸3¾c€:°òu›%ÜYÒU´‘ããîÍwêßbl³½õó SÊÍÝÒÉüãŒÍ]— _Àÿv¿××h xBÙl©„À“Fj‰°·UòÔç:î8ÿ Rþ¼¡oáâsü?aý[¼ù³žÍz/8ÖÏé9»)!ÜPÞ|ñq£Ÿ´‘jƒú˜`ƒúKXùocqfüf¥2·üÀCp¾|€†FcÛïº5¿äëŽéÙü&"àHüàú×%âO*ýÔ\øŸ‘@þÝ?(ÊOsk"í7ØÝHý_Ö€²ø ÝPNÿCl/އ0½u-Ý ?Šóÿ- þ*[b`ëò‰µ°®ó7rè†;`Ô|Ðþ–N`Пgüa#çœ9£n¶Ö€½ÅúH `n­ À¨jDyÿ÷Ê_^ô#ôÿU*â¯@.ör}üŒÏõ v+0³ÌÆÜú—Îø×æó¨ØºmŒ®›vøa$ÒéNlדþ)s¿³øÌx™ÙÜõ wýo]P`t-KWÇOßT!À—wuµEmfý0û*›¢­åçÿ)øú[&ºè:Þ>Ó›¨û–*Á–ü=”¹â¿ÿ×Í_ÿ>7ÔÎo±®_"s3åÎÜðÿAœý€± M{·_cÙÿŸ¹„˜eT-6N¶@Ö¯&ÕË .›õÏÿ:)üÓ9% ÉÔlôÝP5Ø?uFù§€Š} èß°‰ÿ‰ðBx]•Qîÿhªþ= ˆ·Ó/›ÿ_ÇŸ €¿_ãÌ¿Ž?<þLlQÈ¿ŠÃÿ)ô8 3ËÀ-6æp`>ðy,~$Ü"x¸mlÿ!ã!ߘ-Ûü7ÀügC­³ÐÀø•y çKó?lÀýXtbüDÖ?³ýo ò_[ð7°]ÿ§|]—Ál,\3Ÿÿ¹ìý§À®X0W » ÛùŸ é_áhX`¢üOɱÐoP»º;;#Qnÿ €ÿ)cƒ7 ¶F¢laþgóöŸ+°ìÆ¡6¬…£×Áu]ù@âÿ –^ñ'{ÿÙþÓÅovì³…L½¼â¸þ“rr Ö?ÿü§¤þüÜ×w@ÃÇ]˜ßÒ€6L÷ ;~0üÒÙ‡[/·Ãîvv¶( þÃâÏÌ¿²ÿ'ð{¢ýû(ý§lçý¥ß¿þ§GOQ6(žo®ôüÎf߯|i}·ïwS-áßÞ[ý0×ú$uƒO?ÌB>[Ïû!åŸB¯¿µ£óM¾ýl_åÿÉÀ?å¦áßBÑ7yû/¢èçaò¯wÝ~ûþoƒŸ’ìE“mwøþ¬×æÐÀë:¶?ô?îü»0³Œ.Ò½±ó¥¢¿„ââúq}?z£ZY ?±Q³ùGoiþ) Bx@7ç­ÿX@ÿÒ4@tõ?;oøÉþÙõ©CAÁ È¿ü·xÿ±^wÄûÇŠøãìgéxþýžþrO7Ög¿¯C‹ï…¦°¨ùW‘´q£PñÃ!¬¿{;å߃ï>Wù«Èظ‘ °ÌÚÒéN>. 㯜®¯ ÿBÉÇ)=þÖ¨%Êþ—ä|{gü«žþå‰ÿwÆËÀ࿶úof…ï¾1ú70"¶¾ü›€¬/ü~–O a‡4YÃvÿõÜ_öý&2> 6ÿ‹8^GÉ#Ëÿ4—@6¶M>Xþ§1þb-ñ§Xþs«ˆBB¿V…pø|ýWøçyÿAð—ÿÿ>£¿ åÏBˆ Ð/úÿˆð¹ü‹ü,ôùEÿ>§?äç¡¿ð/úÿˆð%ý¿½€ýá"áçÏ^ÿKmüñþ¯ ë"¿íÿ 邈ð¯ýßþ9û¿ˆoÕ»~8ÚX¬á÷ÿ~mÿÚþ‘Â_òâúÞ¯ÔO¼ÛòÛ€…¾¥P?´¢‚¹!×wŠ%ìŽG~ãéôõ7ä?<„½ñÔû'f‡²´ÇgxÌeûØO¿;­kÙÅ€õ¯ ²ÏÒE~KI¹:[">ÖTìŒBZÛºÝe–aÙزYXh+Yè«iYè+iëëèY¨ZXHñãËÉ|Q3d³fÈÕü¡ôµ 4 CØþ¶E7Ûý mQZl³´Ø—øßLÿ¼fG[oO$ʆYP#¶(ćª?ϳá5Å d°hϬÀü1›ïçí üÖŽÀÓeãisóú¢$”ù›0 mò€ä÷E¢àf¢à m¦ }‘&¼ÙIá?éä—Ì£§øûÔÞì«0øÿÉ9¿agSìñ«‚_¬E òÛ‰"£(›Oô£”£lÖEÜRæÛÞD¢°à"Ãa³ûv›ÈúÛ|+,¼YZøKRmʹ°Èïðíúoè#VÿaÂßX¼Ýð úUÛÍZ$¿èצ–†|Ñg‘ØøÃžü•ºëu­«ÿ?ü¯Àý¯IüNãÎîVN0ëߴŵþ¯ÂþR±ˆl2‰È—L"²É$"¿Ç$¿9¼øÐc‰/ªý.4[÷b²^Ý:  Ï¯[€>„ïÑÌ7œ¥|Á¤"›‚ˆÐêç©ï2xdˆÀ§ o\üú4|f>óÉ÷°ÁïŽà8‚ÿfp~ÇÛ—P '¨„6 þ7CõM·T_ÂùN0 oÀù¦OoÉ}'˜¾åþóKľH" ‰ý›Aú¶gÏ/Ú´!â_©Qðw²²(ø[󃣆ïò×nâ¾Wôû Ûëž%׫û7Óð,¿„hsÌþš€›£¦¨¾Cß7?ìJsVð!~‚YÆ P&Éø{üŽåƒ?õ±µ?ñöüÿ¬AóK¬nš~¢Ÿ o›ý„xۜ܊ŠþdxÛt þâmÓŠûÉð¶é¸þ'ÄÛæð%*þ“ámóaÀŸob›«#b?Þ>wTÿÿÅÝWo.àˆ¿/Å6JÄÿʤø‹)¦Øæ"‰˜Ðw0þÀõÝŸOÇ­¿1·ýd§ì‹9ù'Î\ÖÝk¾Bݦ©!&üŽç Ð6í$1зÃÎÆ¾¨`Ó`ƒüQßtOöE]›ƒ¨˜èÕõ»;¨ospû{õ}pöE}›JWLüïÕ·á4íóêÄ7u‘¸ÀU÷… µ/jÙ”kqð_¨å3§k_0ºø¦üº¾(±)÷âërÿ—ôéÿW~þÈÀ— mÊ®ø—Kkâßi®n¹±þ þq®þÿTÜ®0{Äo‹y†pûn8ýÔEÝ·øí¶Æz‹¾ßì—Ò“YeëæþÉfË¿g=è®ä—»&â›*D\ôKr‹'ro,͈‹=©ßpc»¾G3Ÿ8@ùGßß/iøN‹)–ëëG@u_­=||Bù»,¦üÎÃÌÿ |ìó×DøN @– "|¶ôý×Z¿õ†ü?ƒ›½þš"߉¢4ùZýö¦¶Áw Á×otÿCHð±Ó_Sà;í„áïì­W÷ï]ýæ[áÿ ¸~M€ï5‹oàc0þB˜2·t3øÿhf³¾þ7{ý Àßk<¯ïõ}®;íû>òïøügⳎM‹ï5,ƒÁ´øl\> L„ ¾ç¸ü™3ç€î~÷ߦ…ÀWÐiÍ´ï°â„Ù|·YXðËÇ’ÿ¸ÎýLÐÇ'—¿\ ƒÅ6Ñó“-Ù[âÅIáƒ'›¿²vüï:W´ñn¼ ˆó/tâKôŠo¢÷«i°àokFÀ×/‘o„oœ4åçY£l“$ªêªm¬ú€ìPH8æ ‡müþÖy5° x³ðïWÿÑ] g”P(@߃Ö\ö9@Ÿ¢e= ĵÞä§Þ~?¬UCûvO7{"ø%6ÅWPøwxðß!}@³àܰò¡–û ˜¿µøÞ<È |ý„M-#øì] 8”ÛÿŸMö-Ù³µPRÆ0‹mÌ Iv*”kß !{™©›!‰šD¸×–kM¡²ŒF¶l7BvR•%²„ßLÝ{çFÝí×߯ÿóø>ó<ó÷¼ç¼gÎçûùž÷yßóýž5^æCíøî¿¦‰¢PsF}traôúüè!iÍ#ÿŽÔqýèYþÃ/âEó °¯à¾.pð?¤¸úóæì)ùµÍi»;|†ò”£4¾S³dýÆÓ–/SÔUVB["LQ¿5g‹ø ¿e­ýõU‡·º›7õi̇aùm“·?îZò±ÀÖsÍäB[õ,³zÕ³ mÕ3Eý3ÆèÙÛ;Ù8QŒšêú~cø¬ÑÊÒ* ÿB‹¿ Øßüßâ?¾sŽ}òâäÃü¹_ØôåãtDÕ)ö©, ]=è4W$‹øpïøÕþêÃ_øÃþ_H¿ÖhþKùuûô1{ÙšÌþ_Jê¿¶k4G'‹úª]£ÎîkrîÿÍDú«:Is*²_zWõû«¡¿‘}ÕТ (ê׃5[NüíEmU´(Šúu»ý…ý"þ}ç×-š¢~ÝÞv³‡¸úâË[A¬ú4?.'ûMóÏÍžnAQÿ{³_ m¾[}GG › ¨¢§Wפ949äêš4"‡Z]F#²Üªà¦? a‘¦”þ÷•Së 6t¯‹|šÿÃú[‰ÿGÀ6âÿ×E>ÅßæÛÁ¾ÿzȧùß þpøþë"Ÿòßö[ÁClà¿ò)ÿQß þpøþë"Ÿòßî[ÁCnà¿ò)ÿå¿üáð ü×E>å¿ýÿ8L†£ÿÿe6ð_YÿšGxÔlJ¿îcaáàiåá¸ï„í?Á† ð—ó¿A©9d>ÅCB7öÿZÚBá”›m;Yy+¤ŒÒJÎaoo£†zØÀþ×ýÛÿ[ù—ü·òø×ø+þË@kø„oð=ÄÚÊËNÔÓÎÞÎÓΓÉÓÎÆ[tuuü3[}R-ሷ“ë‡ê¢0¸JTF%%ƒ’ûÿð {C>+ÿŽÿnÿàΘ lõü/ …Ênð=$L_Wƒ•I€Ê`V̓j†”ï~ÄS4 ?åKR_û°úòÊ ?¿‡††FFF†±±±………ŠŠJEEERR’ˆˆHpp0åÜ•••µŠçÔÊÞ†ºFÌóN{€«MSí»Ã~ ¯}ºòÔŒpÛ«”%ÇÇÚáubäQlR­E·.öž´|’X…{œ&´m¯âI‰|nW¢l€1%€x§ÁŽ2¦ØÔdywN ¹gòÇÌŸ¹ËõOUTp“@&$|“0ÔÃÒ£“Ãd ìᆎ¶bˆ‚¯¹î½ÉÝ×¶Mb3¬}î»À²Wbídf$!Ú\)mÉ…Ä|rèEJ9PÚQEh€ÁÅ,ôy«*Ìï(ƒã÷ 0œF&éJ½—ï~ïèßÜHÔ+×h9ÐüªÜ½˜í º¢ ˆCÄÉŸ„Õ˜uª×XçUF/³*;¸)µ;ÝÆãYP“R™ƒ?‘GºÌI¸Vßî»Ä±ÎŒÌù5Ň÷L HªñK°£ô}9ðp!!,îuÜqе.1–²åº:MÝþ¹E#R¥W›œ¤sf宲ÇÚ…^ê†ßdó}ƒáÅn—tÙ…ó(x]œ\‘JÒí~ëªÐ8y¤a¤å¥Áü$D®-$\kn6•þÑõ3˜CÞ àQ®{Û°o¶·å¿sJj7‘ŽÆ+µ¼0¾§ç²;ÐÉ' ÀCùeà4Ü£hôÌïOtÕñÎuvxÑ1òøºÉ.”ø»ùò`™…¶â{O+<`<³GQô”.)*ÖiºÇ¦y>hn µT¥j7ºAèvÙpéqÜõùSUddõUóGnì… ägÕd`Ñ~¿©”óVnìFú #÷D¿„ÄÔW¶™‘cFÌÙ$t3‹ö· \ä­/õ d¬B4l­ÈÄãZ´2 ƒø;eûïUŒ,Ÿ?c+F’•püÑÓ(„ð-QM(¡Å+«3nSÜ\r2ŸAg;& ªžï|æ*?lã@bîɼ{êÈ@ò‡ciôhÊ1 3¢Tát6 ¡ \zðQhd¯5a2-²·Äû!Ø×{w)qÔF#Ù}åá©ôÓ ×@QK7›æß»>£\À¶'=‹I:*h’ÓÁxÏ£l¸©iÁõRÙTÁq×m#‡DœË˜ÃC‚ƵDÊ `ÔtzŒCül}ð¦ûJJ-ð ‹ûѳ úÆ9bK— ŒÑ>Œ[Ð>æªã6¶­¦A©s?¶d Ìæ;éô:ý¬D;Z Là&…AóÄ-%–^ãÑ‘‰ào štj%æGž¶ :˃3WÈkqg"½ wy䜋YÈ0®ãE%̓¶§¦ G­Rðç…s;ò[ÈûÙ§éxüŒ±œ:JX´È"Ïeæ¦é< ƒþ¦Ç®'îB ÏÅ¢¹jUùùÚÕJÎ9„\ÊqbªÝßXz×ÌàP:~ܺM­E>=̦TÂ"¿2*æ”N›>š¿¥¤ª W%oä¦EY’\zêLGI¤(ÚªÆVš&ÀVöcˆ6×÷Ft&+§ïËqžºä24vLãiÓ™¥õ#L ÁŒüQcb©Éa™^Ú\ŠÞn°pÕù‹€½Ñ0QÇm/·¶ª%lÝ‹‹/§V‘P׎<ìËÕei3„éA¬%p97)e¥¬\üí“W»¢À¼<á9ûuVÒ@%ùÝ wŵÑ\ÛYá'ÑchH/y®ÝÌ}p%Hsš®©˜Å,”©Ÿºkö˜²ûr6v›>HcO µŠåÖw¶Í‡ó´hƒj3©)CÉ?€ +¡twïLrÏ F¹[.j«Ð?Q!Ù°^—-ÒS ä—a!€&‰ŠJïS_YUI†ì&‰ò{ÇóÝ"»[7׿U¶¦Ç˜,ö… „Â_¨ÈhϤp*=¯‰ëõY@ ®b„“³knimSž¬žã:F¾©»ŸœL·Éö~Gkœ€¨ö)ï!)ž¬»óe˜5®QZwaè~¿Rí\;D-ÜÌÑÒÿ¸:™Ží‡WOxûBNoÑ øg>I`ñþ»ØÃPmànµL¡ž/®#)f°u/4’/DgÒ3aZ§ÕmòÁY¢±cVwà>bÖ|Y€B):ý”-±&TK{=/\MÜÏþ&ñXÐ;̤ïcA½‡L£cÌû"dË &«²±(Ç)”Ó]ùö3Ç•m/p1yŽv¯¤~7æ çJWªÃ~²mgbâðvë’¿•ÅÉC”mëk°gÆäÑO슎fìÔBMf²Ô^Õ”Ežͺ¦Ñ—3µ; ðÈ _X4!GÅŒÊ1IrQÕ°óþño/¦C¬5¥ô‚õc34›Ù0ï®ôÀòŒØpñ‚SLÎ ‡ª t¸"ã©.‹çm+ÁáÕcb “G8¥Ôzî@¬Y¥­È”³p!”f›vNL[™ó|¸CÕõ|Ž`\âm#`•ùÂñ‹þ%²^¯¶Pµ²†÷dÑ>/±^W]ƶ׉×7ÇÚíÆÒM˜ƒ¹§ÈË—Õ%ãÍ‹õÚÝÀ/Íô‚Эm$aôûí}‚rÁ–w”"I"ŽõñFlÐâÔ».‚ æáÀñB7â[ éÚQŽ®—ô+nªŒ"Ž&Îg:Ì&tmyã¤7ã®ÐöàÅ&°_UùuÃ+SrMN³z®¾'»s(²Yº9Ö¨°Û_PÂׄGƒÊîò=-|˜g®è?eq‚qëLP â¬û2·Xóq;®ë©z¨qqÀàÄeöÄjÕd½¬ã |¹û}Ƙª½éjî6EèD¿& tyîÅ '¾á°.e_†°ÜËÄOt¹”™¹‚íì鸒}ÒL;j»—ÊŠ í ½¤ìuÁ}¸îb±¸¹VÖŒ‘·µ&+çªr¼Ï…¦EØwjI‘oƒ-‹>ÎÆx¬| ~ê e øfßi#›÷‘êZ¤ö–KM]†Ú,»ÜŽºì|§ ˜Þ¡t‹Ù2¯/Wp""ë;'a«ðËxöd%›-ëTÁÕÛïP'¬°óº`¯ïåRS®rçÇ>½Ùê“_1k>NâI0HáÈçÄu»&ç4êKŽ‹ÊK" ­>¢]5$¶J'E±Ì[‚$D¼ªÚaÔMÏšÐÐ0n el¹¡ã¹I€ŸiiÓ€!ûÌ&´!Ÿ¥ëÕ€Q>€Zp].NKYMôBŽSÙ#;&ÝßQUË(øc³K͇¥ÞN,‚ûŠÞPfob@­ÊÀÅÅðãuÚ¼ª®Š«é• eN‘MêU°¢g Œš-ñƒ‡ÆÅíϲbuŽÞ×ÇÔPƪ.ݨÍûæeK‘—e ¾Ÿj«d'Î[‡¹,Ûòd§Ç <× Q50«¸òpéH—þËAâ’d<ψù;>çξ>ê¡Kiô¶|±xI€¬Gt5`{@íÙÍ»fÀÖÖ‚¯!¡vŒ®–¬Œ/¦ž.Y±aÆÓDÏ}?šöÓ6\‡Vuyü=Ë‹”2Áàš4€½#²—i˜+JLÀŠﶈ˜·†Œ_¾r¼Ñ㙴ݘAv«>¯j’6žÿmvD9¢èÇv^Ð#ì{­b ÷d‚W=i¼,ÓŽµÊ³,d–Ew;QŰÜ~Ž®›WX醓q ròD/0ôH÷ž¼³‡tMa´J_Ø ø>{9{ëbD÷½ºít¼zêrçz—„ùêêùƒý¸/tÛ`⢟Žû²r6BaûZÁdSùƒ ¡Ðä[åOÜÙz¶?µŽt!q.[šÊÛt9!]Û€[ìD?¬¯d¡ç²G(ÇEŸÃp6N\g¹ÂŸÛeÇ@ÃS_:²žÃ-?Ê?MÆA鉦ò Pá•M„½©U åGã1Âr†8¿¹Žÿþ‹¹ý3ÒÎFÀ‰¨ì$ Ü^¡2{ëÅ'…³³³õàý‡8ôò‚⢷;‡þŒ8Sâ°§#ªtZÆÞ½'ɲž½ÇtÐ*]è á0>qéJ€âNÜ…ŒCz×Í “÷0&DœŽ×£Ôær&w Z›(y ¾Fw èÞS¸² lË’üX[˜ éÎ5"nùÒh±d†#LÚJØ#üˆIÃ,ÚÇ„÷y¨¦;_ŸRž]<0¢ý˜Og˜dP'\"f?À%ïù>ekÝÒ6£h¨ÎEû,±øZÙ#ý„šz âÖL0Ò.Ýùš“µœÑc“µëÏ:±“âÜùó­ûí³œÍ¸¶ÇeUߟÒ>’d‘ rÝ»70îF½œLü çl—m͇gRðªÇQ@õtÉÖ*Çô¬‚Ü0%£™]ayÓö¢Í‡íâùÃÛá—‹F0’ŠAþŸœ&3ŸÎÒ“eU„#h0¦§Ç±õ©ȃ WñŒjh®u·ôÞ‰¡arÞ ×æî3N8wg®5å ]Ô «sQ•O»ÿTkõÃ~ê<âÖ!×þ1á„dóÞƒ®‹'è†AÆÎW%)PnÏІ„‘S2–°n=¡ÚÇ ÅFãl±‡cžW¨íÎÝηA ^yjƒ¾ëÔ25'zfµ€f1ªÚ®‹vtÚÔöX‚ºÎt| ‹G=ºÃ¹rduã5†V¼ w]xíà>‰å>ÑJ6Œ.²•Ñò1Û¦…J5ü/é»›KÌN·kY%çÇÂïŒ×ÏìòõùXr7²LWeí,´þ‡½ë€kêúþ,ÁªˆŠ Px`]Ìä% %ì)Ã…`É!Ð@#(NÀ‚¨P{TÆÏ*. ˆXD¥8@P[(X‹¢¿÷4& ¡µ‘ßÿŸóq¼¼ûî½çžõÖyç+¾"ãÃÞÄVö#­ßÉ® W]þ‹ÍÜȺ²!‹pã»è„=ê5´v÷|ÞN O}œÌß ÄÄ=‹XšE‚£Ä›ëÅ©9* 1ó¯SˆuÐ…¹˜šÊƬ՚ïTgm)õ£æ©Ý¨MÖî0ø9GKæ‹`$bv¯·_Y¾cÛA-ÔŽNÔ6Í)ÍÙ7!mq¹Æ‰å©Ç&¢.ÖÓ j²\É7U]Ù´îöp¸â¾à&æò÷á¡¿ŠùJ/(CM•¹W€ù­÷Ôµcis¯ßJ.9{ä²B¸±Ì)g¢6ÎMX"ºÄÇ»Vz5a$¥ =Y®qʼ‹À/¸Æ’xñ§3/ÓÜx*ïÀ‹’­g£3%àݵárU§ä98ª½½ísNGK“~OažOŸp+W!Æ<®ª.¨)ù™«ûø}wδ€û‡4ëÏY»Î¦d¥Š™fýÖ>[±I™¤•˜¶ëÙk)rèñ%’6X+úmÆÇýkËõ•¯¿ºßñ­kî“Ìó"·5ËX Íƒ ´[íùÉ9‘;s¶:?žš[¬!Ùå3÷ùÔN±Úû*ŸH…ËñÊ®¹«m‹]Éá¡ë¦ÝÛú íS1óVómÂý½7"|¤¤Cª‹„¹Ú™ó®ÈÌ‹T˜L<1µsv¹è¦oõ5'wJxmþ¾|¾¿'º³bèìl!*îj'(6ÿJ]HË£nÎK½^».—TYš¾Lr[«œSå[õÒT”tÔaΜ&MË%¹×í¼^ëÒCj~€’pǤﬞrVYjCþßç^eyÆAðéFNþæH{æ²’óÒÖçÔ#KgÒŒ &¯)u¾¿Wlb)»UÉ]ú]eFêO›³DŠ6j-¬¼òLÏÛúˆ¯kkè•3y¨Ž|ðã¡ØÆÚ°ïçZ|ˆÑ¬jª|«VG~P‰ V ÿ蜶(pËýÃLCqŠ}9V.Òi‘˜â{)uï¾¥á·Î}¨øÞ´by¯þè–([º"µ™Ôp¤Y%%V1qq@þbßÈ”¶§6A,elŧú̈,¾‹wž#ßu§üá64ô¾0§¸*35b®lN’“ʆçêOè4íë³Ì 󾱹”ݶT­Z}ï¦Tœ&ÚSÒî”ñÒ½¤y¡+¥Ä˧Ã@üϳ%Ä«'­^³Ù¬ª2æK…¬çv¶9§óï:Ý<ž¸Zæ2}¹Úô0ÄÇÅ@p‰Ò9•}Þé^›²HÂDÕ ÈÆV?´¬)§yæòÓI‰ú`Ž¢P0°Ñå7Iv¦>·»i,ߘµ®5)V¿ûQæO!SöÙ„ ’õÅЫöuG¾ž8·Ú€=›¾j}µ¥g…ûj_‰Ç“ÏtF&aÂ{%é5×ýhûÒkºbs—%W_²eEªíI¿¼M-z ËÞ=«)‡U5Cùí®‡ñæ3ÝXjÑÞ‰ò2#Î%/ ¯¨^°gyûîª ¸WUÃJøp î *רE‘*ÈD‹ÎÓJO/KÖ…YÕôêCÍúeÉÙð%ØÆõS -ežz&32mYÀǧC¿C]1ÏøqZBÂÛ:mÓ3¬XUĨ]ë"o”gÆÆ²2÷Ç*VoÕ­i1;´jsŽ¢OJzDsüZC¼leKY_ãø–Z&±- gÅZBŒZˆÄªZdØ;³óÊ;w%Ü·œþ]¢Ý‰rÝ­é –ôÆ;îlH]oô´…ý`©±ßëã.3/‰]€ªt™Üd òAÉüMIGû•ÄPä9¢¥©I®±ûö¯÷$SH‡xžÿãQã&ÿ+Ìÿñê_{Üè>L¨¯þÑãGÿÂü/¯þ1ãGÿBüo¯þÇþ»ÿY Ä£Ì8Â~ÿ)âõÿ¯ŠÿŽÃb@4¬ú¾ëaüñëŸ7Ñ‹HÔF1Ù{ú\þgþw¿þÿÇ8aþ§@H ¢=A<ò ¡=<=A¡I JדâAÑÕÕÆ~mþ„ôïÒhüLÉÞCÐçü_…å‹ÿ8òý—Ðÿÿ}*ÿù"8ÈjL¢ûöåë"éßxmuŒ0ûû™FáÿcKö‚>ãÿÚCœÿqÂó¿`hˆüïø¯*'ÿ»5š†|¦ØŸÿ}òäÉ‹/*))‰ÄÇÿ•óýþˆC“oηh>’ómõªÎÚijšˆûGÂüŒRýIæ ¿dÖ(}¾ù§§®J7\fëÌ~Ó{–îX‘Ä¢V&LÝì÷ÌúþÓK¢¯Õ§º§}Œ_ÝQ—’|¶Œ\[³ÙÂ5NÀæ@\îßÃÃÒ'ø¸¶ðfªÑJ’’ FîíM…¹a½7õA@íÃb iT‘èt Š2x j sTcxÂÂìï(b¬Ý³` ùyÀ®7ªa¼hþ$Ú`>Æ2F,ÿ!"®b8Cô^Á¦¯m8¬QÂæ£mø>ö bû'6÷˜ðo€tIBÄø{Â;©"nM/Ÿ'ƒäÕ&À€†Øû äw ¿àM^80ÞŒê Ð íL×,m‰{;gG{¢‰¥¹¥ó ¢‘8&&Š‹1 oŽ4E€9 Ò¡¿ÃWü8ÄC2Á×ÍíÍ#ŠBc¸m˜±IÐÑÄqx†±Üa±ÿPjT:™D•Ïa{ct?1Y…ÁµÒë‡w"O2TškË58t9ž1pÜ1pcWžÛÿ÷ zX•èp‡ÖˆJðZ]ÜQdZúFT ×ÓÑcþût ו1£qe¾Þ\Äh Ÿ•!}Häá@&ƒJ÷¢QáHðÒUë6óÍÃõV zdпQÓ{hÉq‚áM Œ¯‘ë§,_hà¢Û|mà›#êŸ _¨“§çú´m2pâ˜gLÎio˜Mä70`š_jÖáà°¢7 3A4*yTÐÑðÍ 3,7óÁ™ŸÏ2¸P¡ð&¿B¸ŠÄb‡c›áÏ„ÈðeB?çz|CྨN úÔŠã¬ef”ÀdÐ!rÿ‘ÎÀÈâãtp„‡ÈÈtú|Kã†U~¸QÔ¤èãC»oÙºƒ–ÍWýká_r>?"Ïzˆ•ƒÜ˜"ÐÄ|‹¹A .¨ñX;ŸÍ€Ü`" ¼_jQ$Ôçœó3ÀõdN’Р¹¡Ož ðN1ÐÄQ›* Tç[*×ûÀ‘€zÿR9Û¾âPç—9×UÁ‘PyG°޶ùùã†kí°¶°äœ?ø_~p_ȽôQá½1ýÃv¹å30ˆa®“ƒüNr/~@þÅü…m¯¥ 7—·@ ʾ 'Ëòì r¯K@ÝQKiˆƒûzCÿ//KØG œeÁù †ºcÓ>zS?Ü3£ßþÕ?±Þ¾ cqà¸a‡â“5ŽSpÚ£ÉèлDzê>o§¸8zün®_p–8‡ú˜: ¢ÍñÔÁâã†Múë‰Dæ<"~ýcY7Pâ0ƒÎ88nôÃaÿ¹ÃûS)_ÜaàHjä0ŠÓŒ'üGwð¨6þ^Cœaཛྷ“ Gvx`é(ìŠ_ºÜ0ùqÕQ8nÐÆáø%Ï8þøˆãÆG܈7‡B\õÿc¸êÿ+Äûþg<Ôÿéÿ'¬ÿ!âÕÿx¨ÿƒ~ÿ!@âÕÿW­ÿ«aþ¿@ˆGÿØqTÿIèÿ!^ý£ï?…þ/â×ÿpwrNLDòû{@À(Ô¨ê?a1x<ˆµEPh,N[XÿE „Ãê t1Ùv=2…BÆS°d4…L"k“p$ˆòµùÒ¿KÿÔÿGSêsþ¯Ç|âÿhÄÿñBÿ Sÿés/W´®:Äh¨ŽÇbz"¯‡pC¼BòC^X4«ŽEéŸâŒú‡þ?ªÚP#û?…}žßÿ1h¡ÿ ‚†¨ÿÔ&""~›SÿIcÁÿiô×ÂãñrrW¯^ÍÈÈÐ××x§¦ÙFÞrP€øAQQåm§F)™ü ßTº¬/£¾ú?qÕ„õY„[v/ÖÌ[ävúYòu¶²¾un3 ÄyLÀA©ãúRú7ñC”é€E¥ö]MóTïSD¯œÜL&?ñªYýØÇÇ6'«8óÄ­æ–´Üâ•çÙìDV%;ßÞ£7ñĹ^`S½ÅGÇÖM,'›9²¯Õ]÷J=™tâ÷ÉÑëí».Ú9,}þm·bŠÞ{㸹鸶¤Y‰ä¼·‚IŠî{ìQhIRHÈFÛ›–ÜÂ_Á}qE–Ægòë¦äJ¶ýQz'´‘¬;ß®7¡·1•½åÂ]ºr·gÛâ-{nÝ—¾ÙÒÙñ¶\ÎE>óyHÒ‹˜¸7ÍmµŠ 68©È¡³åDâËüŽà÷W飃ŽuããNíŸ=¿¼ÅÜÜü¸œr†X÷+LuªR‘hKÕÒgR.~ðœÁî(zçZx÷âøþ£ò+Û"M‚&øXä²2·I½ÒS°sC? ûS=ù@Åéûf;\«½\KX¸æyÙYSzëÖ§Qšœo›ŸÓ^ûnNjTØÜvc¥º®!Â-oò²ÀÂôçIer!¯Ã{^5ž>Á’´¯½\Ø{íõ½”ð†éÄ}HÌí¯D×*t•Wnû¦¥À1j« ïòLÅç;’ÀGzÞ®ö½·.+-Ÿÿá\àð@—¬{Ü™‡mC-É(õÝè|ü„xmÂúR·¨i 'ÎIvüa{[å]ÿÃÛÌ&€ã¸&ݶéÇcÙ1Óî%ö¬­w¤º½ °S òøSeVCöjpZY“VµwýŸ× Zéç]ëA%ÕI¬ˆþåØêì\ÆÅL§ž.Ìéc.§ÙΫT‹œÛÑ>+~gMªf¾Õ÷eñ=+·¬<¥ït’¥&¿›ÿn§Q±—^Ö]ÝK§”2ç)º(EÛÇ·–9®yÑ>!Ž(åbq<Äbýâ ø2Ö¢ÐÌ̼™ˆôGÁniy@Ö[õ»ûÛ|^ä´«†ío¨] ¶[…A±V2VíW«{“sïÖI•–`}þãèd„ÉÎÌk™å`´Ú-ó¤j[{cØC`ÁæòŠ )&p[yÂOrKþÇsݧ‘ß]æ!5øÌómïÅg%—Õ(EKËİXèh¶kÝÎJ´Yý”Á9°òýü¥ÝLÃÚúÚ(yx+íþùÇÎLkèîý®HgÉî;Ù‡ª»‚ôÊEc„(KÅv¤˜‰¶Y½ ¢kN}ãº8(­W>ñºc»wêžžIg¬dz‚ëÝ­íï>©¸±Å($:ïgP>S.,íª–A€q¶þ’Âåó‹Eô½x//Í^f°­U6u;{FÕ^,›`×ÔØîTµ%í‰ì<”j¼ËZÃÏFE¶Ry5„›­jñµ;­Ò׃Æ9ì}eÆ*œU wþ@r£¦yvÅW«Î³1“Œs¹ÒóÛ•Ò—`t·ƒ¿š³ÏµÝÊYªñ 5YÖoÔâ]PBä!ǽñ‰‰¿^9×¢nö ȫ߷~pmóùp®-ÕЧÂè¿ì½\T[×0n€ (*)(‚ÃÐÝ Ò3twwƒ¤´€H 8C HÝ]b  9t#¢4()éÿÌ€÷¹õÄ÷~ÏsŸû½ÿ» çì½öZk¯ÚkïsØg¥ÇîÖ…ü©üD„Y‡¯üFDy¨ÈB=É<"”9ŽÉAº$ƒŒ°¤í«Š†+Îôtè+èVP:£ÍÈ-K67Næ vSø²ÚS¦°‚ ›¢R>¡—^yodä»<Œg,S»¤Â—lå0±ôb%ô‘ÃOI-¦z!]K iÅ×hD²JέŒ»HЯ)Ì!]’ë7BªsA«2¡8ÇÂFÃpï1CÀµÜxñˬ:ur’4\…¥>mq·Ž,Z±ÏOÉ”Nö‰£Ý£º6K ¼= 4+7FY`mWT'& «‘§’çÆ÷†¸Ä~¼%ë·d¾¼ŒÌ+of&©0uÌEÛz{%nR>ßy_.ÕWyuܰ¦wí.Ýï7Ò'fV¯jäË ‰Ë+ãî{H,â{ÙΦÉRÍ•p>”]=OëÕ–NëhLîÖÞ/Cm Æ‹4O“°eEÙÊÚj{^ø6ðyiêïx`(Œßê{õ&/ß½ºF^¯@K´‘Ú÷¾(a½‚@Ç×pÏ(¶‡Ç;:ߨúøj.7}#l¦ÎV”k©ÚÚˆ.Éó ‚,+àé_3(9TÔÛe@8qEf&· ¸;*¨Š—¡I`>µa:ØíœÈ3ælìv™[®µoÚeV˜uW®Q·Ë¤ÂµÅIA„ΗÐM˜ÊxûˆÐ2•v™ð‚¹#54e‹M\^„‘pÃÉÆìlïüœZžôÝvåä… öÌ`¨<‡çŒ} +Tcö’±¨ŒU4Ì–'¨UÈ ’eF5ÿ²A „Wyxœ“MlÑÃjtmO{•U#í—F4¤NŠ3©žMzPä6y\„ÔâM°*¢ç*.w¼f¡ªaÍøL–SCÒ0#½Íáê%›®t­w"†ìròÉJŠârzÊÙAž 6Œr–ém©¸þ  8$Г7¤8 AUmJ»SSém/9 ûGȓɂ‚‰B+µôLËýž iúŸ#ÅéWË+'c_ÆxÜöˆÇ&ô IF&ÃE”“¯dz‡•*‡ºR«¼í¥É@kIíü8!×ÎòÇ,) ù.€HÄjÒ–ÛÒËVkúÞ‘ò#†ï—Èî1 µ^YG;KÈqÖÈØd–ÇE—·M±tyÒªõ¼³)$]µ¦—"«Þñ.dn­p)Û)6Q+ÓštlH ™OaKøç9ũŠs¬™™¨±µÊuŽø¨~~å–Öè øÍÚGCæË$Ï’u[÷[®Å‘ˆFJr*_<‰—¯]ÿú,1·–a´TM¡Õ/¥yä´P—6Õ‰YNäu¦T«PæC‘QÀ&ˆÏ&vwW— ¦š—¥•æòåñÁ±µ©’…¨™›ƒ ™G¬qD[‹L‚Ãñü¤¼›²½²ãùêÊíi¥<†YiüÖ›\»—ÛxÀ$"ÆÎ¬…9øŽ²tl+NU’§Lc‰Þ÷“Zß•¢ú½¶qŸ¥·kæ^æM-bõ^Í^÷T/•™æißó™p0*€Ö#H©Gr3°pÈžù¤4…6óÛÑ ÓÞ‘ðVq=o› Dp8ðÇÚê¥XȦÏoÉ-.MxUáÂ…!9óýpœ0%¼î*€K@^Òõ¼¦$áä ueI'óŸìœ)¯Aaeus±™jH›ÚÎ9Ú\QNx÷Ú3¸ÎCþoÁ‡K®w_ˆ?SU‰PWº“{ã\‹[ï;º|þ<—eÛkÓïéò1ó&Dìž|’½)ÈRŠ JosKiÕ€gò9VL͹/lŒ+a“á -{³…˜4aú#‹½tP4»Gî:ж”^sªPï/Ò)gyA»õÜÖ=¢lià#ÄŒC#ÅF*û\¡EKj™Ì)ý²" ®ÙÕߨç¤.¾ W)çYå­›‘5\ÑÔŠpÌüÚ‘Wq®PC3Â÷å].5 HlÛ¯$ƒcܶȎƒ2E£uQ#®Ç¡Ú€Š2~)Ï€&‘¤Í'y¬x$×xK—ÐdTv¨=¾ùèqñ=£˜‡ÝôªlZ7ü©\5ä [†æÞª™Döß<×.vÕ°–Àh¹óúÊ+ƒxã­qjðsX¯6½3{ÓóG“Ï,í+n²ó"J3 —Co*p_qí.$º÷Ž57£Rö: —Ztì/ôÏ,ð½4Ђ͹r”—¾¼¿P’×qÅ»'Ïÿžó›–~¾í©ïI:@ª¬Ìmhà§›mcåW>†$ßYjU¿ëÊ~n 4į€9³Î¿³IH &œØmòÐŽºp™‹Œúöê~bò†QïÌð6×üsÚíeÂÊ1ªàÉØÑ7Í®_|Ã+™¢aÕtaíáíÕsi˜~&> œÉr§„rüˆk1]{»l›dãµPؾïÕ„Š #O£Tؾàç?uYe„êøÂ¥µ÷eöçµM½Ìwî/S *?ÞÉ2#«y##P ÷"Ç´±\{µý <É ¬›cXjr¯b0µÀ#Æ÷îG¥¨çDÕ‡Ö’Í=þž`ÄöR¶ï:†›¸]´ÒDw”T =cní¡Uqæðs™|9IµV#œ?žö%š1UùÇgÞT -_t5J6xºW!Ò:Y{_VÿìÙŒ^~oP™~Ç’4t÷(sXSV(¨˜!ï °þ¦,£„›O|Rþ±âŠ¿³©õüq£àRÕ.–ø#m‡®"Ú›[IÙÊö—üóü¸Pëh³|ÑŰO–ù_Ù×6ò6¼Il*€.ÇÎäÀBù°P.(è lP1Äß ¾ê¦¬¹d{#í½Ýó¼0ÀľqùT4¶Ññ ~f.š~;Ö÷¹?/³9ü¢Q†õÊ­ãë‘1ª6ÒÉ3KéáûáXïnp9›±Ùظ˜’ËB.^.籓;5eCmý ¼Q9y{‡¢ u àæPÉ–äDHLW¤›°¤¾¼ÏOҪѶ…i-FÞvJk9Æw,´è90ð¹Í X¯EXö'ß´Í^¢çÚ®¨&Aá*¤€,n©Ùdæ×–/´Þ³îôÀ  IêÓ´KÞ6z,ñä“rÂVµÀâÍ:;]fÏ[@‡w—,Òk˜÷„«U¶·™Ä{6€U®Û;ôjšc¬ªM˜ž®35NZŸ>â‘Ù Ó€x¡ ½*rñÁœ† ™š~vŽCº‰¦ÎcvKª "úÑRÈ•ÊD-WÕʆ¬ðù*Uކ%éìÁGdæ#ÚûuŠçï9´Æ kŽD^…3…P‡uGyàî?±çÛ}ÁXZZ÷4H&õ¦Ò¨BŒhu"¡´ôŽDp/½$få 캞§o°>[˜»XpÃv“ÆÙQ•1®¬ÒÞüªœ«L$̾(AÊ «Ï» z>’l¼Op· ‚3ž%3ò͘6%r„^úu:±µ]öÇ/iý@¶hɱ‰›·¼¦«Z~iL&°-D&/°æ©„¥^f˜Ï§–‘ìö“wž¤ª”jA]º#òeª¹Ú…?Œe*"ýäUqŠ®ÄUÆ<ã™gh Γ¢Ÿïr{P—ѺÁ:<71îS©jÆŠó+¨)껊JïVôeR³Y*ð²¯9²ï¹©#Ø+R#¿­rµ¶¹E!ê©2¿Íê./ª†ß9Ñëb~YÙceüqµ›„ÛÕ²ŽŠLýåÃOG×î°Ü=ã£ådþìùÚü„¡áqk4Û ²†¢in¶R®ìf›³ì¦<åò²é™!¼FOÄ´2ç=‰Iš&â¦J˜ÙìÍÜI=2¿|§”ëßB(¤Ø.Ô^U_mçêª<¹u°ñ`:fÁyÌ }ã¾tQ¼q5 EÅVNŠ#©¶1m„¿æ”½’ä@ó s@g·‚‡$ ðFªiÙÕmÊù㥽|>“d ¨¼]¿L~¹½zÁÀ€úz ïA8ù{H!˜p¢õË:_³É~r-¼Åå~Qà½}¿32) ˜ ¯âÕÛ¶24ʪÇ7çÐ ÄÇÕ/N´Îˆ»~!$ûžß1û:åY•ŒJ+Ù-“¶›;ØjC"¶Ì¼ü|%=Êæ÷p›±å•´CX¹ßms¥¸õg‚GŒKå”´Ÿ=‰‹Ñ€Ò×i7¾,ìň{ã~zßÊ3Q53h†A3.n×…@p‰lï€hŠòœ‘‘ôTÅcyÙ9%^<#·Ý¿Ò8ÖÙi2·øm†á{;CM]¬gdîû{§ÐôšÞø£Òo]󖿇ßrêÇ×î>â‹Xm©¢øx\¤|Ž«ŒEÊsmBÂ6Ì›©õ`­™ïöË · þ÷¶ûý—ïÓ?íÝ&”-° ž¡–ys”p÷ž¸*c*[†¨ÛȱlzËIÕX' *ÔVç‹{Š+ ×ÎòÌSʼn Ga,dªoR¸€z~©×é4Ë Cì¸ßé€_b)íûá"¨¥ž„aÏ X‚×Çü¢½Di«lnœ—xèå!yù-.mw°}3ýb!á·jûC¹ÈÏ…ðfäðâV±¾õ¦º¼áâ²Ú¾†tsaგê¢nð;#ߢæs\qÍÛzc>êHÍôd­p‚"X«Ç&ÉLïKµ·¯ W³»4Ímè}—gç¥$ÕîøÚò³×©Ù´ª¨j6-{ŽrUc¿¤—'«6°¬Èd¸TÈ—ÄžXÔ‰§8-AoMèË7Ÿ¦d‰¦Ûݯݮ™*¼TÈ÷ÐbD…@‹>Ú1\رÿZ麖ްå=ü!uQ­ìü/]aÀ´§OøP=iÉSœ#ÊÑF”\ãšÉ’s+¦ñà]õkCjsí8¶l(^l—ˆâ´æ¾Ú“œ5û÷äüÕ9ñ’LL«üß][*•#†žÚ¬ó»¹3òS«X-¸õùìÙóM†tÊótK [µäÏ /o?ù.9mÈY“å›…ãW7"ä2;Ý£xÄ'™ý”,ƒ^éóÊÌ~g£µôú¡ýÖË‘s»›ª=É;òÝ~®ÄS¯sãšÆlš~>o©©Ðë#Ýí% ßS9ÙÝI–¼5Ñ~öÙvÛÑgQÇ\¨#«aH¢&_^ ²e;!‚\ørî+'£æºm›u»õsùž -ÏG{Kk}]ŽY“œWHvOÎHS_—Uû¥t‡™èÕ¨SjÍ÷…qGËõœïÍ«WDÓÅ¥n‘ ºÈL¯ ¹o¹ÖS·R4ïki¯ZpEºd8hzÃYy׋xëYecc£Ð—çLû]Wï^jº-4¼5“:ßýµÍá]·ƒ÷ù}í¾þ-¢ · ÕR÷…úá£ä¨Õñ^QÞÁì0âABnŸÔÜÝÎ* yá´,Îç6`Œ¹±’]˜Úîs‘hß~>¯àén>}Ëj84ÜÒ߯Üû‘šW„AeZÚÒöªÇÜ€nï÷çi ÕU%GšoSƒ}G6\c_æ©1xx;µ‰»eW*æöã;¹<­!¯ž eÑKºÛ* ,W×ðK€Ë÷é~ÞMMˆ;Ò›ë'…éBÆ(Ìfß ð}áçXNÜi«;%¼áè\ÎôOsíéÈÆT4’ùJ%¾Üa\¸hãh ³yùY+nì*†GC‚—‹Û–ÚôfwòÚà£dDTR¤¡Ÿ2=ŠÓÁwÏÝÖSÞ{žWvg²ÊÙ¦>;GCN©™ãòI%akð­i_az2ýRa-¡]òÅó›qø\J8LuêþýÿjËžÖ0UÔ¢ÀI|¿fyÛÎÕ&NŠp{pÜwtkµµ…çÖ3—leIßí¤oX<­1ÐO¹è¾fgŽ_X´Ì¹nî±rÆ÷a}à¡CZ]°á©lë È„‹¸zccFøCÒþUâÅ‹Fú1{ëÌîsÑ3eêVàt'¬>ê:ÇE„·fTï¼}S‘„«°üÑ[."¿üS8m¹xrÛzß7J‘˜hÚy$‘G–¡Ñ²÷qÕj.fv‚–ž¶µ ìí£rľšrÁ÷_µ‰éó.ˬO‹ÓkIÉsº U‡¬†“â„“('“yk›fÍã„$ùz¦$\}#ÛjoYm1öö|ÑWCZ ¯ôLõ^QtÜz˯ŒúTywhH_Úü ’6•òh´’ZhÌÆ$¶3è=ûƒ¼üö—yùL2ùêï[:-…3íGÌûB¢|Ýw¢Î濪ٕâ ÜÞ~0•JOA•›CÛ©«lvßt-¤)e^sª6)Ÿ4ûR {¿‘ ¿Þs|¿'êYއ©[·i»ýcÙ夃)Ö‡ͪ†ÄÍ÷ù3Ä÷%ß ä³ÈÅ4VV¥/‚éc:ùEDUEMqÛœ(Õ]#÷™Wlˆ‚ü­çÚš¥¬õe1]…äê½Ù Du†•M]ÜR·32Åu4•• ¿Šfr¸R»l·õÝ&E¸JK°j¶¶%ºh:Þ"›µz2T­öy†LÅÜ´tvášaPUI:»¯¤K\ê)€í“!B`¸ôÈè~w}!OnßbÛ|£’ ÷O%S´ü!U%ÙõØrÍJ¦xÑ÷™S®BAõ*z%.Há9uMϵZŽO;Ëð4ͧ’ƒ²Bþ~,¸ª~Ìe“Ù ™m;Ë‚Ÿæ?+´|ó†Þ7{gÙ‘õû†÷¼}ÅvJ"Mw¦MV[<øÂ§®Ä´„â´G0íg’ƒòÕ—H‹]>Ï›/çŠÞó5&R'æª1¬ïë8|nwÄI[ÂÒ™¹ ¶ ")Þ÷Ý·VÒ»G¤Î7VJÍ¡SŸF<¬(Þ^™ç•_µü¼ücÿçbcåâüÿ)Á_þÿ”ßžÿpqæ Fé%Ôù÷ìýL_ܧç?LMO?eïRTT$!qâááÉÍÍý~挦¦æ?:âÂÍ×gþÎA¾ñEu%s)©©.W¿}O#ca‹¾ÌΤ«eÐäAˆUÍAÙaÄǸèýõ[Ò1}–£rõ.áâÙ<ÐuÄÅôð­3j°Ûgß±¥”Á/ÂÔ¶ôõľè¾H<¯$éuægði’I4û•ã-H®‚%¥î›­æ!»Õ¬zhü¼lý1@=0ˆ}¿›ï8ã{W'íwGuM÷׿ͼÖTü ‹» ˆ:Põ>’4é7ÑTöQ¸áióêJëºä¾Ó$΃ˆÈ&êšÄy ëܸ!è•óÛ[$ ]“‚79‹¿Û"çޏÆ?ì[¶LÝœœˆnŠ—N©1`Åå ;ü¦ðá#ËË+°G0 ›¡FÝq¹UdÏ’?2ŒŸYuÛfè{ã]0ÿIðøöR¾jhÛž'|nÄãˆ×ãø¬Û×ÓÎ ÚßÕ& î•ÉõOÈ/Ý®ÛRmÄ¥Áƒ¦ÕÛI,uêwOGïë¾,xŸ÷h–þcßyÇ]t72Xè[—ÆÇ¾…Ǻ{Ù“ü ’¤c5lçúú¶sG6‰8'[£× „A×­›úóaˆfÝu¯~þxÆÝÏĉãúëÒ02hDŠt‘a_L^)(e62¹’ }WÌ•k;–š3S9â³°`Ô"÷•Ãúëì¾%Þ†BÆÇ~Ü[¾ý ëµ_zrf#\íêæË¢£Â$ôú‹úÓý¥¶­“¨ð¬…4»F ·_Õ>[]±ôˆ¸ MI›¼³NÀ/µú©g#m‰sÿ€éPÀ¯Aa_r[¼Çâ¬,üã#ÈòHSêCÞgRþ"üs¿§z•OC7r%tB¤sËÏT§ó†´i2(«¥Ž.ôX$•æoõM+~Hkyø!M¤O_¦VÀ;‚|¥ÉµLÄ I¹™Õ ã¬Þ7¨è^ÌUf+»`À΂È_‰½ÙLÒÕ5¤Àâý}+ÆýÞ‡i¼Ð9æjPŸ.'ñrÂ`trgLynŠB)42Ü!]±”¤ìzÒž·o“ºâS.jÖW¯%ý[‚ý÷gß„øÛóέôÔâ_äzÚõ&å(?¦QÖ½ÿÆÅíR¼vŸÞ°§Oí”jê ödL2-å‹A ®Gªß,¿g »RãÉ·Hy” ^±ÄoLyü\L ÅŠ&À7ãçoì-lɪC :aN©âÁˆ§ßw03…IaYËfŠîG½m=(ÓCp#±c±:œû¦?¤yS3@v^GBl°ZDögžË[€ê…™?æ" %2It†nX?;„TÀtLs&Íhp#¢Žýp¾O¬8ÜaÒ´õ€·ß±‡ðH6œ-ªmð½uÈ 6 †Eße„éùŸÃ˜Œ3¤ºáo οÿ öM$Dô7·~pêÃHòLjЕ.ä-Ïms%id¤P æoˆ§Ž8»`©¼S0ŠW4LG(ÈØwŸÿÕÈèçç`´ÕêE"<·β|Õéàz°y×oÓ½6žÿը߀B¢ß#BꦚŸRº3 xÅV”OîZ­Ø˜[ŽoŸ«~ûáÄŒ´êÜÿ¤Þ×íö@FESMˆÊMeo·lyB§è|%ën@—YIyü|áÕϼ›â:£Ý¡f+vÞplrÿëÌ*ã1[š– QK•–nöCŽ0;Ó¦¸"áøŒ¢œcó‘*ìñ§ç‰“$ãZiƌֶò¹÷s¿|%þ€É€«=-yý¹ ÂWo¾v{ç£?m›Àˆ'#äÒ¶„ý…"Àåî¡Újš¢¾º Dc~̦´KÍøPc@öQR Zò£:èJî=ýºbME/nè`à^ûV(Ý2›Aݦï IçDåÉ[dß°E–¹d)ÇSÞf¶.ÐxÊç|{ÁóÍŒ9îµ=>²*HtYJÄ:Ê [›ÁˆVýmã¦G>U3÷بúò^ 8Úôþëî~pÝŒMBk9d‹?º_ø[ψ糊c R[át¢p7PQHìœ]§ÈeäÃÊÆÕC´4!34|Ãï*s®EŠxzÏ$ Eˆ÷ Dí9Á˜©?•ÒQÚ9ºÊF陸÷bޝ$ù×/èòQ3SožqÚ‡Zwå¦"º÷ ²zrŸÏÞ_„èDÍ6ØO>´º§Èn@…¬O#X»Púúá-¬ ÃO…0 'LbŒ0ÆóLóvÌÆükðõÅô§ç¿§Å~ïä],ICØè$ Ùneî³Kâ!çÑ 5oÅlÝÆU­*]å³|jôjUMC0Aóôšá>t+nªrh”1› I›F êR‘ŠØ> gB"Ü‚2¬/ÙifmWÔßWQ†u›ù£5.+õ—ô’‰~¾Bü*Á¯š³×{he…zBYä5‡F“éaÕì]ï!ç#÷¡ñIMТí9IþvÅL±Nº\›7Ïõegh…lõs¢÷Mýð“X[”èS\OÂó7 HêÁ¸'°ç2ˆˆCDúW¦ÑÕe•Y”y„UŒOuÔô‡-NS_D†a(P4§ZÞoÌÒÁç¼×+°5½!×KCø äö0÷Äáµw­‘Vr$ ɆIìAE*2÷?“FÔ£iDb!r³Z.Y<¡ý™y¥ë †ïØ—I÷Zz¤½HûrÕÛ0ÞV—¤•y%8×·~²xj¸-Õ¡EÖ°êƒxÔñíƒí@Mç çiY_5ã…Vå?6Ò½‘X€å7?>ŒvbŸU𾝔0î¸ëÏFBrÕaktEÚ…bâµòæ›rêøà°- ÇE ö!ÉNœ†Gï&sŒPWçšÜ †KÒ%Øí9&6Fœà¸ëxÇ Cãúb(T¡ƒlþOjcEÂô¨=tÄ*ß"ôÉ6/zÊú›¦Gí=ÏÖ Ûº#²\s ®Íîé{ÌzN!@«4øõ£ û¥§"ït÷‡Ç0IV¨ðöM)é`i±wŒóÛ »Ë“õ5PÒ1ú¥·ëš/~˜–U†Ã%Yþ®†…][—”W¥™I`ƒ´QÂ8€º3$÷¨é@¾f§I€˜ÇS<ƒ³o{.&{yäØÃˆ¡»Š³^§VeÍÓ¸ÙX-÷\‚¦`PϸÅýü.BäÌ´e'fäò›ûKž&O/¢ý‹R1[cé}¨7SQ=ÌGS—¡5 ^réV1¤ßŸ¦3åÇ_ÉMFåÔ]x¯kA‘Õï÷ºËÒL½ý6¥>®xÃ:Ø=Po×ÏÔ ú$±ô¹ÐŽvÿAËÖë÷ëGˆ:*xyB,dLƒ=2@@ qP{ºceÓ?$YøYÊ÷…è—Û/wýð|Éc7™ôº3{´ÛËÊm*ˆÜª][“©Ü"ÛŸW[v»Êf(Øc=ì³Nó† ö¸© ŸnR€H«î6ø Û z|TùÚ”VåMmímMßOQ0f= ªöû2îï”)ó4“/´ „Ϭêac ©lŒËûn'Ù!Ð8þ]«¹+À‚ÌQß¼1Yi请Žìý2ÈíYñJiüüÌtº >{´'( v·¶#ãLΛsójt 94Y£‹³<1xô,mkTÉF-鸾±Tì{àýÞ @4vv²|¶§$0ùákë+­Ù!P ðp§Ö…Åó‹=á[´â0[1]ÉÙëtÖ1ÙôxÑ(åÞ~¨+²*Žº,GšÃ×–øÆÊg ý)fýȇ@K¸«A@øH½Ã|Ž_ï¬ÄƧUä§, ‘Eħ<Ú@Ù>Ò7asïdz aJGÓƒÃÚÀ#Ã÷Skîù6`5º>H…|©g£+^Aš«*â£%\A.óÎçŽqs_ê#Q‘ö"k4E^TØW+«I™±­E,ˆ›ï?TôJø)V õ}6açR*ðCNëb–úá],HÛš—ð"8ÍÕ¿q€ôÇe*|³µÀ­uÇiNö í;qdžš¸‡2ŽøÖ<¤K Fd^~jÓÐ1CUµ3áÈ»d­¡ê÷£#‹Áš^ÅUöª‚ñô81ÝöÃëc2/}çXóÈN¾¨lŰ(Â]w2\T1´ùd÷j°ãj[1`íÆ±Â\ßû1ĵ…!|ü˜\÷;r·/ŒøC‡hÑÙ¦Á~Á wÖ]3ž³ìµm%NÈâ^YòЭðÅ)¤µ¡µ)â¿é ä‚êí0ĨÐÙó‘.øpcW˜æìþŠ'kÉÔãš íG Ë·œMbk¸ªðWÕxÜuÉôV7tõ»ÚB­x 'ñ3jZööb»›²³€~ÑÇ$+ÃE0îgVº­Ïi\œ+óñ2çŠH«‚R{.èꟇ½œ,r÷€)?Wmi£ŽH‰2f`ñéB«J†›ñä/ ¹ò÷#*¾F t‹— 8†WwÙt8ŽtHæTÈðâ7ŸD =ëBo†QÙ·Ýíét¿óÄØcŠ’áI\É›U·Ý}i¦3¨#z(­›ú0oª$[“ÉF|Ž{‚ñ»4â¸WîËôë}ÚAïºE¯—: rsP¥Óà¹}·óN | êsºÏSèI=JnmãþÔéLV2Ad=¦áWéï©÷q£¿SySÅÚAœgT£ ‚uºeM½·»ù¹×ê…0ÔJbßB(·#œÝÔÞé5`k®…ðC ôø¶·RîÆC4?tè‹´óBj0àÅblåm}XÃ\¯—Lè±ãÂ=çê“LªféÝ`kH þ·ò°¢ ³—¬šó*­íÖᘥxt—W* ˜»g³#q)ž5V[¨Û¹Ÿ—ô¢Âè?½Ö=ÏS¼é†‡qE)|Ñiçƒ|]QèZyM*MóÍÅž4ŠnØ=DX?¸š¹º Bp3€ œQY<{¿8­*ò(´[jìcµ’7‚‚ÿ¦õUí÷bXGû[5Á+v!³°Ø^Elêðæsð°Y3KÊÕ;rW?xÄ«NSÎÇ'ò— Âv7ðåϱŸÃ< £ ¯ %ÂÅÈB{×î"Þ2 >Uêd-Ž$<%²ê­¬Û7[Vk'nÂób@'¨¯§²ñ& ,pÓ::”²/“Pƒ·ÂP¿‰{.q] ޳*CQº§Šà0\Óô¥òžR¦ˆqÒ†¸s#o?M3ûàK¥Ï3} 3¥M‰w°ñM¦_h;N¥d2 Ýy]"v ¥-5‹ÿò¼tÎ>›*"þ&ãŽÿ2¿4Ö5@Ý…’C¸çºRþ°^?³F¾ÕªYqó£‚ovöq«bEY3¼0y݇ʑ!% hÚˆ[¡x4) t€áx>qv™D·ý@æì[DZ}÷ªU#ÛÚ€fhòZ˜•.ÏôÀàX¸«žÛ÷š=ˆO#š2‹4‰TÙ¹Œ“Äayîn›)¥svÙJˆÂ‚ƒòÒ9 ÷奱@W/»Ó%£¨ ¯gt%xÞŠ±[ƒ_‡útÀå`QçúÁKý¤AaŠÚxôHQŠ˜^ÅÁuø+¬ŠäeFÚ\á4æ(«ã¡°VPÄ.˜™£bQªÉM¢-¦jXÅ€ÀEîA·×°èdÓ! ¢o ‘Á‹‡ˆ²}ý݇±T[鱱į5›ß°[ùáå÷JÁÙCQéñ§s¥»±Û4.mâ=¢xlëTwXÁ¼ˆÇŸ ”ä¥BîT¸Õuyº15> h(÷opß¹4‰kï¯émÐp Qèß­8†A¶\iPÙ–-Sq œº<¡Çƒ«_Ç “]QgÐ5†Å~¤ßuRR¹æJ{ÑñR*”›Ä:, àw€ µ~÷·\e†Ê4pÁ}üîÄ`ÊÑã’µç®w ΰL²û~e9"™`bka"¨ÑÞî˜~õ¹œ´ªÕ÷krT„dëgª@X˜¡‘žluá±fÁCwãKÒËySjü£go„­±€d—‰˜JÆßû‘ìÁš; ‹']qÚ@ךæa—ŽPÊ.ް©Ñ¸wà/沫üTÀ*ÈÐ9¾fÖ8÷3:0 j–ìí˜Pv$osxŒÃDMä\L¾=¶% &M$Ë[RÛ4 ¥L@WoÆL`§\åX1pc-j‘»yχ¯»F·1&áùVJZ•[$åô¶yæCg(ñ½õ/É~p—ÈxùO4›rØÍzHÉ[êt•ÏSã͈Ïݾ‰Ü³y É­˜YKdÅ-¡¤Ô­Aņešà ãÁ¨þXhÖ>”ñ½˜5eÔÍ×¢IªHÞ‚´×U/’Øgóüš­…i±çyo¸óh´gFW4…Àò_®Íá>Aß¾ŸÜûÖC¨ „)Ó&pŠõ‘Ã4ûº±‚‹ "Ú†N°¡Ë2‚¡ # ±¥¤8*n.œ!_ž¥rªd™¹=:NÇ ß¿g•@»õŽHS Æ ‹¿§†)Xۃл'é›Skm¤QçHGwžÙ‰q¢Š¹>UÑ;°²nW?‹í B÷(þ~­Òûæì[ÅœºÀqEx{2WQõ/k¡Éz>‚Šz­«4LÊ·îäaO¥ic~_ IŒ¸Øh)¯DøHÕcÒ†E‰Õ0×Å·|ƒÊú4ÊjÎjN¼+`5Ä«©LeŒÂ«M«’¨@aŒ@¨Äe&ß%’ÈdÂÀF_ØŽÇ¢ ¤^Þ¨¦@(((ÒN ÚªO±Y:ŒRq€a¨·¾ª%IÆóÐë"l»kâÆÇÄåŸë‚ú8•Ýõ p¼!Êš­‡`ýÙîH„9 Þf©>!Ö ¨hXã]0bƒWF<çž+;a/œ„·Ú’𸬇]ki9*·¥é ÓÀ Òto*”€ëÜ40£4]û˜>‘4]PÚpÓuÎ÷ÇÍbOQ ¥rHÏ„š‰‘XÄzÄ*Ö‰ødbÙ‡â¾tŽ]+,œnt»ñöÅ´`ªŽw34öÏÁtÈ`È2MvI‹pçÈE£²Ô‘vQ­(¤>lk¾B\L߇^½»sûÁî>´aJb«1sºü©˜;ÅÔ2M¢þxmÎ@(ÙÅÙ&?ä‡EÉÄO翚ˆ„gvíó?v©=Ǽr÷ùˆbf ŒýqE\]åŽÀµu}Ìá³aÆÏp¶,Ð2}[=øÂ8«û}xbÕs9ħ9÷Ú¦«œp ŠógKñ¹¯Ž/˜.á7¼ÂG¾¦j ŸK…bœ‘ Ÿˆä?ƒE'ƒ¶ÍÍò>ì¤ÙÂÕ\7O#9}1dñ½n³ˆ*\΄ƒEovñÜn Ü»Œ&ð¾ì®ÚÒÑ~!÷ð°È÷z9œ÷  Õ(žfÞ‹a§°}†6äÂGUzkj¤ÎE‚›Ú™ÔõàNêrÀ8Ò!9ü%nQÏ!ÄY~]ʉ¥‰œ@‚{P}Ì‹K“tÝ0Â0/ú=¹È‡VYºáuˆpŒéµx-ðRþ\+ž ï •:BÔGð\€Ää0Ч¼C@§¬ç¬Š˜<~12 ­M…fá·ß‡àÛVÛ l€hîG¢Àµ"¬˜îÑ•1xŒ8òi9•a³poÐÞQÀ…ãC^EXÃ×M”òzÎÊüT«y¯'7Wi’K–3›Ôa²Ì8õGÆÐƇƺ ÏÝ 'Èdƨ.;ÓUpFÊ$ù ‡x(IÍ' ±Ó™íí¾èb€˜…z">oÔ²N0ÂÞÉÃ&Ž_”!ô_–1Ñ8‰ä;–ܬ¼»& vÞM4Û½øˆjUÍhWP`1> ä‘åL˜„ ŽPBÃ'šüd ¥'}’¬¸*Os^ã…u½Ÿ¥¸Ú¨O²¯M pEU“p $S™p—B“ «&û¦öGŠ=Nª,ˆû©´DòÛÅ—¹?©¹H‚ÑãqÂå^ÊrÂ-t_ÒT¸¢öüέÑ,ÒÝ¿æ¦5RuA„]¤=…­Q5X³¥ñMßs®PþN;® ž"þRqìE¸yŸìmÅ5ô-?ï'¬Áu­¡5-Ìñ<É×âr4RzÖ ¿þ9ÕÞàú}"->¬ô¼¤òáU}M®þRêQì’G©>fô!‚âYëŽþ‡—׆© òïÄ\~†³»Â2¾yŸ‘†hÆyÉWiÇÅ›Ól9/©Â±þuò:ù)å½[Õifü4£N 4FµÂQO pñóo+òw¾¥—Ô–±%°f–¹r8Gƒùa"sÞÛ/7÷pÉã)$v¦âøÂíæ–tn„ü¡D!eL8í¥~!{P GýÜWíç2x*Íäy”ÙµÝ\½2y:®*øl XiÓBüÕŸí±lÒ®ñÈ:1 tû½u¯íÆqÛ½9cËrµ˜ÞÆÙû¢=•¹@~Ü®˜9®?ìÞà·I½‘çä+±\~ÆýxyHÿõuÄU Aš5ê§àÑn]'jjKÝ»6û„y6A ×cÄ“>”S™ÿdˆpñµp3ñÆJÃè‹ÙtÆ b†|GÊ«2HéÔ®®µx3yÝõ$¿äéÂó‚´òt¯*”2yçr ÌUסÖ2|CkÈ×wxŽUº5©ð°íÛ±9±æ\Ð[ÎŽÚ´IAŠÐ\z!:ùÅâÂ]7,EQÏ„ èÂ2c’»b‹(SqXwñᬭD(œFÁrŠy$ÇäZy`)ížJIx´ÈÁ®;ý5Õ~*7ÆìALÈdì]§½üsÆ-'§H¾OÿЀ­ÇUU1ž•DZ$Ÿ€m>k' ɯ9Ån„‡.~*À…:˜B$ßµˆBeEåÜ£Ó[Tz¤¼nLøVÑKœOc5ñjˆ=åàu¼¢Ió±w‘v º›Ð°¯#/=舴6ít[Œ§ÕÙÈóvZô_x|h. LÖCHF˜E V}™D¯ËšÇaü²ø©ZßÖ€¤ä+é¿›s>‘ÿ––_ϽX¥ÂY ãÚ)ûè S;ªšI43ð}’…Ž1ÐøW ™¸½s­*ëõKtÈÝ&µ2ʽŠ^—[TŠ*þ;Ò$ é·ë^EmÙzDß‹u`ÄÁ´Æ H«j#Ó—n7ë4¾øêܲê­lGIΗzh§±´>f‹ú:3žu{suøÃ¡Æñ¨ø^™:¸jjrJѹ ÐH†ltL€ê½<DÚ»Ös ”`_ òè9ãÜr*kY»$¿§6£‚ÐácNk®Ç§.pLŽDªJ¯^»mÙáä:h/úÕM÷‰É2ÇqêEšÏmrÎ]Î<]q—1â[¼7éëÜ¢í,»Àª^& Ò_U³ÏŵxÇAD­ˆ‰XwId,J›™ï'Ù»Pø´n@…tfƒ°ÙRo;hæ 1|Ã:÷~:ûKŒ‚°²‰?]‡õ×&§W–ÈYG ~¨O ¿‹`ݬ°LÐ%M[Àéîff—ÕÃ^lxð"ŽWˆ®ù´Íh¤ŽîÓ+ìÏÖP<_iÏîVl\K?Æ5¹ªÊy§º%V ÐÖVŽã äám·¬Älü`ÍÆºz{ɶÉ|ª´HæÈË ºÓ;Åð¬è®UæP!×¾‡Ç*„X1ñA03Ž÷/GÄSF¨v y>ްN*²¾‹å!~ÔÙ;èªññdÙ /o×ö£lzd“ùæø1 1b Eýš$À¢)nq¥W19ŒÙ¿HýàqÕSñ±ÿqûæºO=\’p‘xÎÓöû!¥f6=¼MD‘¦$Yº®Pi¡x¥«JŠ¥ÑKò}Š7! ºv¸æ/œö2Ðÿ;ÓÖUrÑ|UÉ1q8¬@híOÌGOÙI~NY{ ÆÛ–¦ öy“‘ÉT+­~-=¿ô°#KY,J6”ŽP–äÑ’Ü2¾È0øã]€Ž¬p×ôH2‚EÃ`öêˆó—R§@ÞZç¾é(R‡ÅÓ#© 7 ïñª*°¢9k0Wk æ RÃñtä'µ÷¤Õ>%´ÅSpLrk¨éq=K8c&:ª¥ûHæ;•x±1C{Í#ø"ëâ¬F=ÎsMX”$Òÿ)žYÉ'yÙ8·þ®Çy ýH°j`ç.•Êv‰]—Oˆ,b®&6öÊ$Ùá³8á¢X3R.ŽGÀ§¸²©…«?ùíf,ü~¤L‹¸1h»áñ cá :a>/æ™Èldø,ª”¾…¥>£Þ#U‡@Ò”%Ï)é 6èÕaÂYá[$êˆÙË>R_kµt³gho ‡B@ë7ï"¯Ô×]-Éýdzëåð›iScX¸¿Ƨi3í¸¿3¨ Øí²)”5ˆæ|%ÏÒ²¨(ÇÝÎP&\Ä:}éâ,bÏ×Èû.!Ö|U€7Ö§OÏ)I¶¾&x@w™:çŒ̈• óîcÈ{ ÿ¨Ͷ ݆íÁ¯ !·o_†Ú¯é»nãFˆF¡ß¶8b²éÜD½máQÛtßú-aÈ÷‘>ÅsSÆtï®[+Õ?¹²&[ûV¡„X˜¥lõ? œ åt/¦v׊7^Ëû½2:U®!Ô–½o½¤¶v,FœßBê+ ÷ÝŽÎÃ_ËЮq(tNÁ5ah<¥•ÄEÆYäQë÷t¿^à;Btú±ÂZˆ³è{tÄÕ‰{wy°¿nkõVÄs1ˆÄçœTh9-\— ÷³µN[ØFëx¾a~¢çö ËWT¿¸E}áÕËž<µ%r_¶äÝÀ°‡}é±®£›k­nÈh>D~úê£eÅòù.À0§C«¦ ‹yc·ðOSË&0)—FÛ#Ú Jk¤–$ÿKMPd„7µrä we—†™„+°1·p6d«{ꬥ -\¨<œà,Ô6)-’¿aðz ¶E4nÜŽswYSµ¥c”ÅÏ}^[¡dÿõ ÎË_ë%=#(Œ°¡rrgó@­¿¯Ê3g´„3¢þ1Ô/çAbÆRÊ^y4Ó‰  Ôâ‘ÍWˆXBº¯RFE䃰á•j–‘µ«a<×’euªwŸîÄwâsÝgº@δ¯oV“{?k‚Œ_yýn`m¶CÖ¯Pˆâ@fÑâßç³¢Þµ¡…ˇX p!Ú²Ì²ì€Æ3-Hë/Ûq­©¯óħàLj¯*àÊõ§R*}žä@EG„DòƒR‰‚”(ÿB”èûÖb÷ŠyfœŸQ&Ô¬±nÇ0M 5zÊßJg„ùY~{h¬bÄL„6 ˜Úýí(@¶TGàžþâÀèÈš6X¡:¾F6Ýy”¶cHÕ,ôöï­PëÞ4j„ÌÛ >Å| ˜ùE}´ºQªåî#Ø×ÈÏÅ÷$@‹>L‘—Ão=pJ!jÖ÷‡’úˆÈ…D¿^0Œ£{£X_€ØXú6rP†u'Õ¶õi øáp“ï$Ñ«üÝ,‘+¨ÇŽø·‡ÕT è–Z˜Þ’ ŽêËL|û¢âQÔö·ac|ƒ~ì;’MÏ~2ÊEºßh]áhqÓ’6m²Ä…gøÛÜ—$–Øu‰Škþº ’«,lOˆ4‚].Öø¢Mº=•3ì2uõÝr»†ÛOK+ „¨+ 0xÉ¡e/•œEu8ʾh)-„LÏ@|:8¾É„“ƒ/Æd ål¼ŒZºÏ¢¤¸ƒ»Oú­äÂNÑꎟ›Xïö ß”ó(xᮚçm0)¡Bφ`U‹^½Ÿ“²ŸhÖ@úL8æeÉŵå[ÀÈ€a+Ý®—*-¯+Ë–Žø/ƒ¤ QÀ[×ú›§œ;‰ë.n¢:=ƒoÿÚ%Â#Ìæ?\|@ãIì°è^@áC¼}ª“ÜŒéÄ ´$C¨TMú¯ž{xƒ-"³+ %BÙ|™µæAYO¸š €±½ZÀòS岘£™~Ið­Ÿ ·ÃÔÙ{·-Œ¯R2 ƒ¶Q€`Ÿ»VJ(éîBaÜ=`ul7ÝÛ¯œÐì¶ô¨œ_@)ë6ÐÅŸØ~pKuÏõ€fö›hðàù!X¹ðò_{yl—â˜8±ÁÝlÐý£û±s(n‘v-)þ÷VUþùb°Wà³(bÄ>10Î1¡^8Ç ›]ëD‹ì"tÀbަècD¸«ý-j,P¢òñ3Hl_…ÛS0ŠgsI€€'0OŠÏ±BÏ 6¼ª‚-‘¤¹¸´Òñ ïAÑ¡þ¯µT*’b¿3Öß‹iÏA‹«z!ٷߊjF7ëÞ–üîrq-}J”­Sµ èùŽ>uѬ"òØ´Ð=݇6oxÐpìÞ›>‘?%‘nSz釕DIRSi`úêÆKdYZ2Ô0²á³H|zî‰$x·±(‚¿tàYišUbÌÕd]« !z‰tÅ»w\/¨¹«ÀAÆVÒ™æáÁ°¿Ddµòg&€ÑŠÐ¹fݶœ~ТÆSU‘ZYEÝZ ç©uøåš†  Õ}îºMDºI +uÇ `< üÖ7ÛJ–äÔ tšFŽO •ã¡fá‹n¾ûÃû_^§ßx®ÁÚ§°~ÚÞòu”´!Ö•J¬nÚwlì›t ³Ì%šì7;Vú)½¡\„ 8ƒ_¡ã .æáÁžê““.k9Ë_q½’¬…è»V²nÿ.AêrûèÃç_ J åd>NääÙ’P¹™áh};b ;hÜKP² Ùy­„H•‘´DbuK"}qì¼?›WÜ9Üìì;‡Lõå k+ï"f^ß'ȇÙLºŸ™|/ÆY¾Œ¿](ôE£dR®…ƒ*!-àL/ÞKêÐDÊä°j»ßÁúÍ”µE+þèÄ$üNšDòÃÍ„S‰ó÷¡†€:¢~Š¥t„ G@"—hÔaØYûÐÈ«÷=y~HB¼ë›i®¯!ç~mLì ”™„$K3r½hÅs]bГiù&Ó2.ƒò02±ÔÕžáhŽáÈŽˆ¥is$ÕÍxÅdÍðÚ¸ÏïnVÈz&4ÃEîÍÿ€X¯è­º\lÂÝ ×~¹ù ¤¿/sü:¥t«²ø5ÚŽ·]úûCË›á=©â†íc2.U¸óDoJ}²¿¼©øæÖÖŽ‚òƒMl…ǾÙiöT¨ˆ–WƒBü¬˜Ï~"s¯²”àÙ=ôÀ¿Ý|/fc±{Âlˤ ׉@¾Q‚ººN„uÁzñë¼RÎOeL„û«K?•Ù“Ët%?¤p ­=óuT4W¢±NSˆåNEM´±iU=jÐdÙרy„à½b’¢„Lõ4§ÐïB*ÒÈœBÆv(ŽeãgwQÍ¢ÂÒ#ÕËÐXΓ×À*§¼À!¿Éº(J!ÜV»£!1!0ptàež’ΣÒlâD©ˆªÅŸ8X܆n<Øx¢ŽÐßjr\ìÀ|ï‘)ˆ öf;1·¦«vc᫨eê)6!þtïMQ³Å”ùd_³Ý0óÛ‰,’žr(µ5ëY’>GCD?+ɾqBïœæ‹PÜõ­v›ß6 ÿŠ¢¦dDølÍn©‘-‰÷a¢t±à)k£ÒÉ–ð”À‹‰Ò;²Ê·ñ‘²‹ÄÈíÀºdU R®^¥‘Ô žfÍŸØs¼»Sñ„ݱB臘G3!†^ûõR®VÀ”žÄÅZÝTE‘Þ?ÌQ.Ã`Uw»¡¡w§qÆ=ýdH *fë*&jjS5;æ{ H©8êäÓþð†òúg` «†kœjØ ÃÊ•Ú+¸'ÒÛ£¢ï‘Ábm¥rŠyr©‡ƒÂÆŒA¾5·ûÓÔ|é¥,àçĩРtW@nØn™íPlG«Ø€Ût±<Ëä&Þ¬÷Ð#»ßWq­ÅÁâ°×«w›˜‘±4ÅAžÿz꥘T´éì90"ø±@‘¾/bÝdt%‚™C‹JšeˆèæÛìÛ:̰NT~úÕOeKg¼:È¡ãÖñcÆv”á_[§±—ù@w3LcÅÕo—£Ì"|ÖOE Û‘3Û^¬?Çâöîc8 ³Ù#°Kãf©ö¸Õ.G]L"Ї)EöùƒáCȆ¥,šäëèk¿oI^ÔWú8èNªæ :‰3\8~Rñf(tÔΪ«6‡¢±)‘9®ÿüùÊD”?ôàCß”(ÇÜAß]%È'øµ3@vc¢†¯»NMëlƬ}øæâ÷†Œeç5Ûõý͇Ù/¦~iŒœ—V’Ò\‰“£wUýàÚØÃš]6A~ÊÅ—3Ãb~‰)ã[¢DÌ›ºkŒ…~Te‰GˆòáÖ¢ÑÎ:bzÙ˨}u Žr†tûU¢Ì0ýï?lœJm L˜k½C'Ë —sÜ:÷ÅÙF¢(â_¦™œŒé+Sê L6g#Ý;»;4‚‡i|ÒÊ!àeŽÑ‹O«œ ¶Eèž2ß ]C|Ý©dЭ$èÝp‰ Êüõ(}âù©ÔºEÙ!‘ƒíf©PÌN”|‰yT¾+­öÕq®ØLÚÖz%èNgDß‹Õ:œ€ ª#N¸‡¹Fo® /1ÂÀd¿^ Ñî[…h3tÞ±ðètÐ&‘þ<ía˜D¡(_Xÿy°É“íWV*90Ýû¬Ö²cêÃT‹·P¡i††ï•U™Ü KÑÒŠmú.:­g.Ÿa²ºØzT;îä/Pko?¤"qnÀZ6 ðµAïÚyTxz¥ÈO å·§sŠÛp…ò_<áJ¶h†Œi©ÿBkxêdbUö ä õ'µŒ®~âïOïîÃ!Ú àôÌ%ÙÐ{Güd$wS!&¿I}¾#®.BÇUe‰ž›ÒØ;†’#c¸ˆ™î¿@gb„³i0iõ¾ ¶=ÎíÓŒšZ8–M»C•“">ƒN:?ú´ÚØ\åþ¡û™~Ý jm·«ÍkããŒé˜û ð` 1šƒl¯>Biãá–bü)ŒÓö,ÑÃ|BéÓÍžéN"béÓÒ1tÜRåC Êt§E¬½í¨)óÙâÎ?N4ë>VÔ!¢?½ÂËwj@©]Q¹õ #,<ð×kB )ÙǺ 2î¾%â̹ÐI=ƒásôÚ[ÛçföKc´íI¨\m|+ùÕ¢¬5tÞdâ6)×Iú.±Û¸í`é½µÚ­ÖÇs±Ý”ý‚ŠרoIp:››ÂižZ½h¼4 ƒÔ¿¹ETÝᜓ¤7AcØ›¼ë!ÐÏ&Q!_iM'Ð4ãò„…kÉ£Üv™&ÿ Eç=7SŒë=Û»Oƒ\õ¾?~g³",?a)QŸ””®ØÜ[Ï.ìýÄ€æ¬Ia;¯¼ËBT ©—$m0IÊù–hvõBâ »B¿Þ;”›ïáršrÔK¦ðå R'7hËY'áh£ÈÞo¯PÂEc`¹N2ˆr¾ÚÐØVTǶ³³}¸½æP'%É0…Êï65Þ,Qî G+Ép}í‘­ZÍ,ÊÀ¥ ùØÎÏC™„(…P¤OMJÂõ3+-‰‹Q6†ÂÄŒ[d_Å×8Ð C™ÙÒ¤>˜–$„V°Q/e"f²J50¡F«7(õ^Êóð€¥ˆÄ„k ¬öÁ/M,™6îŠSœ,™pO¯ÂԪЬܦViG3x? ‚ù›½ìiɇk8žªœ8óâ%=ƒìdõÍf®lÔ¨§ùyï'4éÜÙ'9ò¢åpä^^¢Ê·»Rîé©¢¤Ýj:TF´á§r¿×noŠGÛðž÷›·YX¥?k‹ [ìÂÍdÔÉåMõmÇ`ðy©<ÝIÞ¼ÕZNžÅ‰HOD2‹†]Û)~[øÙ×^† Í 5.;|…ÁÕÏ€kÝV5ü$3ÁœÎi»Ð;«¹ɇš]c±¨ CJ†0rO6»Í­nЧ9þ£í‹ùÜÒC]4 %„#š>„8ìÍìA7À øµÛxŠä³iúTÜ—É¡¾Ž’@«"é8Wz½W¬jS <Šq2aÅ*ëü\3¸ñ@Hì zÒûöø [ÐûÀÄFÍ‘кÂË[é«ç G]·€Èü ÙÊj÷à‹Ê¨žÏ¨º}}â 3"íSkzWEà1á§|¼PLŠŸ·™ç” !”—¡˜†- ȵpk(ÓwúAY‚§úbmÍ)P‚0¯bí§áˆÀ‘£<º§I¨8+“øMäð¡ƒúáYÉ ˜£\ïA°}J·­š@u°ÊM׺mÝ÷ð9{9:}zGG™£!tŸOGÎ=èMÕŽ„Žqæ3Ç?UªíAè>É~²—§ó­åPüyCz–ý©ƒB%I•?ÁLC?d[ìFöFÍw¤£~ü‰ dàiUlÙzùÏßÅî¿GOyß Ð1ÕŽøŽùüéF”}«è½úh/à‹Ï5”ªK¹Ì²è}näUáiݶì ÷ÄP¼ßlîÆÜeXpJ1â)í•ÅLD%åÀŒ(ªÑûÕDáÖæÂ hªõ çe‡`»7òGà’ŸUPÂéî³›êjHJiL*mÇ;Õû·T“ÁëJš¼œ‰ç'I,1'R{ßjW¬Àù´óp[Lµ«[¿+¡ýõÉôy^f5ËÞÖ¥œ:^¢GJ£3äCÄ{§}‰E‡ÙÉ뽢ΘrWÿÑIŽ;¨÷Ë{Ð-UTš+LS—Ä€&JŽÚˆù‚_ÇŽ^-¨ ^‚1rÐü‡,òŠ`‰Р!Ù%ñ°~½FTøxZ+˜¯O"üÑO•ÆãßøD3¹‰09u[„ÏTÑU¼‹˜‹ G{ ^öÏ4Ú0îœXTõ¦1 ¢Ñ͘Ìl×uh}á*ç>ʱ:RÒU¦b°K pOêÒ\ùà9_–²~F”DÑÆVfÏRÅi[ùgœ-¤¸]¬p oÙ§EéeB0ò3Íš[æì¨Œ³ td!Cf†º¾Û ÛIJƒÝ5f8ø×ùç;;õË^†G|X!¯Û>äv¸M wtÎ+MVÔFT-¬ì¼N¥{º¥ú©aµáS²~9)|ôäL#¬Nh êñ­ØyÒåa"íc¥fg1§¢{îf:NãW·g­Þnl0Ò¤ð+ÔÛ%CÍ€ÚVæuŽvHñ™£:Á¿ƒ¨¼dJ%>´ôÓ‘F}I8â#Ò+-É‹ëäÚú‘ìR±o+õm¦~“aÇÎQ uÁï:ô6°Þä*é¦ösòïr*QÁ~­‰"M¤ú `~×…]'Ôè<¥áÞ+ fDŽû—ÁÏ%Á$pcƒÓ#/ñÀâetkYW“†ø¥·ˆðy륜ãDÎä  êŸX) Ôæ¢Y†^Z?ª» æŠ`­—›ëc^Fàrû¹ïêžÊ#„ gT`Â1n¹ù³Ì*ô)ÞöÚK¤»¸Z?Kí1{¬ÏìSºdMeU) ³®%k“=h3垨j¶Qã±]Jî,zíÜ7TÉAò@¤…ð$2âD«ÝΨ[…J6Æ­>JÀ«(‰Šì±ïm *†7¢Ý§ÕÚÛ U›jVhc=D8d ß§&ãTG‚”ß"Fùß û¼S$•R":\I)b=­Ö­IÔôn¾©ƒf@ræRøz._oqq.…Ÿ`Bö*Ë›L“µGÆw?T̹ðÁLB¥qÇ‹ú”ɦÜéÙ‚I{iî,]ç8«ª‘Qý^çüÇÕ¨”…ï½ ÕúX®.‰-ÊFL$ø<¥ky™LPÜÝ ‡ÌS­? Ú!”Ds¹¾xö×Rÿ±îÉõˆÀM^$OEéMz1ºµä¯tƒó^"Zmˆ´ª^»~ræéò¿Uô,ÞTÕz3ÐÑï¶õ­­T¤¢N[”ÏåêñéáŽDy; ”Þ^¢)~•½h11ÜqÓÒ ½)µ£³Ï·äN<Ôñ‘+ù„‹° O»íÆþVl˜¢f“×…ü@¯‚%Ƭ1?.Ÿ¿]÷N›¨á~`—*5»s؃&̰£PH"’ýTOÑ`¿7p¥ô)ý]ã°1ùŽ· §)\Û!Tœ®näèzÀò¥RÀa9tº^$€ª«b[ŸVŸÕÏ÷Ü…ŸpäDuduæDºPÀWí†ÈÞ³;ô#è³wè7`Z•(*L¥l,°l<¾Ð(H&1ÙW\ˆ¸Eí²:Pm:Îä íw–÷P¼|ÞG±Ø•ÇK/,j´Úi_ÃPvóê8oÛ ù"môN›òºágá' QAïÇæaœL4;º¾Å£+Ø’N)fNMtM]t¦´®ˆ‡¹Á, ¿2߀V6Õô D?ë­ðT¼ÕÓÕíLXâ 9yΦB‡ ¹†ÛzÀô<݉èažÛ^[0žõ¡°ÿ°8ë1ÆžC·Ðœ9ªèt:Þ§š)äã)%¸Ú­Úrí{) {´סúì·S_ibG]²oªEð9$l‡Ì¦t‚(5/¤ÍÅ—J/ÓŒúPfç{Dw¦çß<ë|ï ,ÿ´°SŠ»dÀ¥ Èœ4J¡©|^Û\æGމ7»BÓ¦rÅt¯Ô0]*a3Æ®ÆÿªNzÌ™”xÒA"ãªjâ ;Ÿ®;²QrD$쾺¶_0}B…5Û#S¦·xnV¼—1y¯àU ÙìVä_JãG„NB6ÖúxGŸ?ýâ>œäCÅ‘ùMæz‹ã;âM½Û%rn‚rWN%5ƒ¸=‡]ûUØO¼n4ï~X鮓β^Ë1>’µp«…€£6QÅ#ü“q?—[ò~{i ä&ºðuOª¥À~¿—V[ðq¯#ùÇÇ¡îîoGµQ¹®Eä¼({‚ë .ÌgÏÔ½ŒGPø†•¢gRÁý(ðš\{f]C×Ðïn4¬“Ýã—ØEå ÉÝ(^²LoTÔ±ÁúÅ)ÂíB%/ßÏ-Ó¬[%‡½^º6‰JÇÙ#$êv¢jþàâ‡7CfÏÓ:EpVd1È£ªKÂÄí„T°\ ÎÏ„?FØ®[Åütÿš甑3_A?®ö@l§Ì] cþz¯Ú9‚“©ÏuŸ]é“C˜+zjRþüDG!Ô4ù)µS­DêÁè\É-k[Û§=¾¬Ž8Qå?*·cÔ„ÄÒ$ö ‘…çemWÀÚƒx‹Dè‰6ùÞpoà3{…òfdŒ‚d¦^™Ìád=§ªbž|Š‚‘rd•j#X°Øb>{DìCñ}WÝ'nÂ.ø¾È™Ûžò%ïÜ´r¿AÔØÆ>¢Þ •‚óó‰Ë"tOva·:KôǺ8 ]ïoÑùPÿàÑŒ°}Ë^ûmL©{®é†)Mþ³l½S&2‚GtA“èýšˆ×S'|Sè‚×â!µ(Ñ}AóŽÆ ZzÛ1ÿà•“Ù& m3ƒŠ¿ívw«Bi;†S"Bí|e¤.F¡†þ&/ò&ôIÑ]N¿d&õ$ eÒò%y$_3 ,çXT»&xRÃ{Éæ“9ÙëuÛï6_J±ê‡ŒCÔÍÙwE_Cas´¨Œe¹â ¹HÕ ³}õ'‘œ¤<ía4Y4"%%„|œÀøÑ»0p2:ïòòpm¼yë^įŽ4{ýÔ…@€¥Ñt7ÂÄk3øÕC²È¡ð[§OÛ80‡{À¦”ž°1Ï/=`(Ú¹Ù%H¼É;IQi€·í?ZzœÀ_Ò'ªðà=znG‘} {Æê|ÒLýzmJ°Æés¿-Ôú)Jw{4ÕâÅð§ ×ѳº?r°;ÿ§\8ÊÖñŽbÆLoÊÇ8ÃWHƒÒO2¯Úo™è#DoÊxU+(½B\BM­Lp¾…á&L®“žçŽb¸kG#8½Y”BƒªPýeƒûï[ Þ†:“RK¢=¶B01*UIÜ.3wJñœÐÑ;ϲš¾IöJ¾+1èÃΊ'뽌9Æ*¨¹ï>Tá„äJ8±”ÌÉõ5J¸ÏoB |ìÕàÛåñéãH] ̯zñwÜ]„E(;aoPÆð9ÙÕ?ÛŽ¨.q|[³{AEé udàÛ”7$:à§PõsàÝ|iMÿ¬ÚW4Œ¡ÄáÙ| ‘¾ðXš”:I$‘íЬýö˜¼Š”v-5íF?|‚×ËIoŽ?Üs¬Ht]^eS%B¯+“Æ:}ëjÙ¸ Å,¡ÃÅ<­êˆ š”Ø•‰C…ÔÛé1hº ºi“Ë£ö¤A÷«”ýÙüµÇ<“»ªloÜœàÄñ%bÀ.&&T×·ƒ½£«MK.9ðþÇÙ5ç­`R“d»·/}f E4å Å[¤\ðbSÎ{³¯ïÛ€[ΑpÊqñ2§ÐúöžïLt+ÝÓ@¸¯èóo‰ˆœ™X" ŽÅ°WÏèÐÃÕ5X}¬ÆÙ-·´xÇ4H»ƒÁóëìhJ`’–]EâÊÌûö5q>µ› W0HœŽÈ#4–*âô‘ÆÅßleîÄ,̽ft  F/±«Ò\í‚`OͨNš£"3#UÁTè‰ÈaÞÑò;‡#N`ËÒnJnüh >BŒÐ&E?ÝQ•<é ʲvø3ÉϠѸ’®>ѵ˜<íkŸúYŵfF0ò¥$<53žYaÉh ß›€Í=ø^q<¢S˜ìÚoÏ[Cûóý"³“E:ƒ.c êŒÈÿÝ_Àûÿwùåù¯l‚ï?œ~ÿã¯óÿÿˆòKý³ÿW¿ÿÀÁÊÍÍÃÉŽÖ?'÷_úÿ#ʯõï`îahèbmohhamgüDÿÌk…>ÎûJãŸÿÌÆÊ}ª.VNN¶3¬ì¬lÿþ‡Á;ŠâjÚJ’5y9 %u19¨8ˆ‰…E“Cœ…EBM⤓™•BÍÙØÁÅÚÕÚÑÁØŽ…ER$Œ-ˆ2 aA+sc3aA{sWc +WW'&ó{nÖîB qGWsW&5O's…éÉÈÕü¾+ÚêL­Œ]Ì]…¬]™xy¹ø˜ØP8]­]íÌ…Ì=(~:†œŸe™(ÃDÛ%Ê,™­(¤€k ôéõ¦æ‚,'±í¬l)¬œÍ-„@ÌÌ,À?3Çûž–æ̦.. gs;!‹«§¹‹•¹¹+ˆÂ`ï”+€€åd@&ŽfžÀÝ&& issgcWs3 O ‰tl̜̜LLŒ™µ;úðt!Ð=k3óû aAã_Õü‚%{ck´[„åKj'%cK`ÆÂ>ÿ¸·•5À³©•ç) qè Ȧ ‘±ƒƒ£+j\¿E$gíâú/á@©Äå´?J%ÿ§ÝÝLQFåò[äÍíM¿û—ÐXÚ9šÛý–ÿN€ü`P1·CÉåoŠA£d4²{6áÅ"05+s …µƒ©›™¹ …•¹“¹ó À­…£3…àÖ–(4fÆ€Y8;ÚS¸}]N| ¿ ‰³0öÏÆan÷Ë1˜Y°˜±[üÎIþ@g)4—èáý^j€Ì(Ô'ø( Ͷ¶\BÞÑÙœ™™€-èü7u43¦<µ«€¥µ ³µ¥«€ ºÍè¯ï¹9º ¨Cœ>Nnþ)ô?*‹—éÏ'­“éŠÉÅÑÍÙÔüt¤?é =xÔþï ³³˜±qÿf¶t6sþûÔQΨohü>h±BOé›™;™Öé`êIþèÚF~ÇÞøN‚¦@P5w´¶·¤pq6ý9|æoF74Dõ1…‰£³™¹³ˆDLsöÆN€ê‡˜!Т0¶"8ÜXNÉb ÕÆö@ý{ cgsã_Š•ÅÌÜä·º;…‹•1*(£¾/‚š95‰#;/7#/ðŸã'f~½)`¿ÍgN4ôhpðð0²ñr1r±±2²³±ÿCÜ,f¼æ¿‚!Ê}ÿnÔØ¹ØY98xÿ!@|?#òχÀÅËËÈÎÍÆÈÍÇ ˆëcÒ>SŽßˆÉÍÕÚîŸááddcåcäaåe’·6.³ŸÁüÄEþ n>F6nVF6@%?'ÌžN§.£feírê$.VŽ.VÖ¦VèPéBafÂhçI¸îÜýpsWTß“ úüˆßß÷#ÀWÿ΄êõ?ñ§ý~WΧ&l¿æ”×ÔÉé:#`…|ŒœÿÌ£,xÿŽþ 6>>F.Àä¹xy¹~_‚¿¢fø–éß“ú/C¬´#…«ãÉ\‰®¦@EU G‹¿é=q º›ÓðÏdjngçdlf̼?Ý»8›žÞ£RQÀ\Låä‡óOU ¨ ?:€ Z±Ÿd.¨<¸þ½.'“‰½¹=ÔÕÜ^Î܃£`»€D¬-\ÎÖ–V@¥ûé­«# ht/Š“4äéoP©ü²›‰£««£ýÏÐsŽð³±ýfp@‚cŠšðßap°°’³£»5*#rq´’¤yà/2"”ZÑY‘‹9ºõD¯¿I‹˜)(~mAÿÊ?ÅAëógúcA[*ësF õÄ9ÿÖÝP¹ºX"HCt¶vB1‡¶ìÿçrÀ—4³ÌÜpWaA3࿉°¨›«°d1Ae¨j3a9€o MsW/s;t"ø“€%Ž«#¿Ðîn¾‹^E3Ÿx)0dKsf`&üÏ ÐXR4QJ1³û]æ4€®€ˆ~É+3Û?é&¤ù¿ìä¬?냞bœœYÆžÂ5«¸¸:[›¸¡VƒÖhY9:¡¦cW kW k;; sTü·p³c¤ )4¡jEu5 Qm MQQ5m'Ðjîn~‚ÇÚÞÉÎ@ëaì ,¶]=QÖ./©"àEÅ rP5mÔ\&USTU¥RT¡¥PUQƒŠ«Ë‰ª x%EUIf µ¡ÂØÁì'æ Nag Ì4. 7 Ãt¦0¦S• @/‡41S¨š›£ÙwtòD›äÏl× Í5ºYÈR!Jп m À°íN±¡}ØÜÙÞ…ðÀ½×aCÅ&33 p9¡,B‡.~ tš]ìíì„ÿ¶êËÿEœ)ع)Ø8ù9xø9¹(PšBSüÅn°F? >›UPÛü,,Ì?6ëbA¯O½û73ÿ) z^GÏY§5 ñÚÞÚÌÌÎüç“>:œn ²œŒ¨:,*”œî) ÷?„ÿëŸÄûåþÇŸgÿÿ¯ïÿþ!å—úçüóèÿ¯ýÿ?¤üRÿ\ýóü¥ÿ?¢üBÿ\Æýs¡ôÏÍþ—ÿÿ!å—ú7ùóèÿ/ÿÿCÊ/ã?÷Ÿ@ÿ'ñŸ›õ/ýÿå—þoú'Ðÿ‰ÿsü¥ÿ?¤üÒÿyþú?õ¶¿ôÿG”_ú¿ÙŸ@ÿ§þÿ—þÿòKÿçý¯¾ÿÇÉÁÅÎÊÅyòþß_ùßR~­ÿß}b az¬mí`eîlíjhˆ~ØÊloö¯ê¥à¿ÿþP8®Ž3¬ìœì½ÿ÷G^S..VNN>nV 6VVSVScNvn3nn“ÿ6•ÿlù¿ðc§‘Æ?óö_Çvà‚í/ÿÿ#Љ±‹9…3ú}EglÔ;`333nãß·Ôûk€¹P°ó2²s°S°³r2rðpÿèi~çêw{ª»ZÛvåcä:²3²ñrþןýÿ½üÏýßÉÁò_¤ñýŸƒ•‡ó×ó?Ðü—ÿÿ%LIAú 6)ʯ@!*Àïù3gÎ9bœ®œsÆ£_ôJrj’Çß¿KKKçææ’8ijjŠˆˆLOO·´´¤¥¥‘““ûûû°ß¿÷‹¨'®Îºª(¨ž¹ûyÄą̂³î?[Mér¯‹».Û©ÛéPó¶nu­ªª³:æ]cù¤}ÄûÛчèêÄ‚(ó=wø2D6 SC^=Z" oʼûì EåCŒÁ{çæ^áa}µ¼v혗7äÅôÂZÿ÷cyQB5Q†»Ãˆx³\ñeºä@ú…’Œå³ú¶S7ç󹜯ÖR’`%VíA¿9t[y·'¦Ä‘²~ôå1®I¯.ì묄npz­«Òí}ùKØšõ—S>sIJu&• (_òÓ¶å@ú,Ê-ÞŸ|³\Sš{UµîùhÎðЋj~iÄhóós´SSmOD‹#°kw¥M‹ŽæFÞX³lϓ޽¨ÙUˆ!…YŽv‘‡†eü¢-nÊ*'´p ÏqðÓ`¿;„xæ~quÍg¥.QÚg¶½OpÏ6 =ÂXP?Àh°Ý=<|ÞˆØâ?wô‰„âCj͸ZlÕ¡FŒ…¢ŒÑÄmÍ+WJ†v2pï¾`È¿|ÕÖáâ˜Wžx™BBV°¤åEÁÍô‰£îm ¥ Öy šBß,ÔƒÍî; ǽ¹ªw«Éb«¾¯aÚ—-‹¦´)e]zPC_eà EÉ•\H-ò ð›s³¨Ñ{Á£¤ÆeáÊÓ%¹-Åý3Óº“qÍ!îZ„N÷ïZZɹΉåûâ>zïʦNJc]Q6&(.p®(Ÿ“ÆHoLø]O'¦þ´§„ΕvbÖÑÇ¡@×k4ÍlwH ‚ìñS[VgË(B#¸ƒÏ¿¼N6"ó äBí¸;‘{tjÙt§ëÒü®Så¯z¿â-¬^ºîFséØéÆ#±å”€{gÝ^ÄÔçWóòÂèŬêï+É€Ã{`Nï(RRÂdÂIÙïÿÄY;ýÂÌÿkW=§D×U*KIs<_¤æî´œ ššMö/»ìzÿF õÞÁR±wŽ/Ò©ŸkßB®c‹Í¯œúvÿµ£Q…hË:O¯·‚éÂco“Ï„G.¹û{¬Œ>8Ö»Öá÷tØg‚øÛ9îÁ–VäUrÿnb.Ï_ÚV{ûUz÷D~:ßÐ~!4jžçÅÞç7ÅPq¿óäá.{oÒ™n}Pu1®(÷™á¹$nü¼ehŒ :øðÂõ<ÄÖº#ù·+‚y_n~·ˆF_Iøºcó¡TýºUò õ Ï5¥Ç˸Wn3w'_æ_¤ë}}!EílˆJ#+¹érõ+¿ ¸c\›‹:ëP‡ŠQ¢»¸Ùßu8=®ê3WOŠSBEy2d}óªÙ¹õ2[j‹Ö`:!õ^¥p«¥ë>äbÓßäå·M_Êia“ö XÒÌw©_.Î,±LŠ0c^±¥×37~ØmocsÆÜØ'B¼Ç;ÞPqSIU”&1GáKÃ[ð‡»ÉIcR{æJM!G³F£ŒgÌEö§ksLÒ:8·½¶.¤Ë©òq–äÛ¯HBsø¥”>°¨æäçÅè©úÛ¸O„µfÜ“·Ï:¼ ôMråP©$we'0'S]~™}= «:rãf@’¤lGz:ÐINõÞ‹Oâãc995Ê~t6ô-MIªéc@jtýŽw…¬r3ìmèKUÔ.¤x/ÇŠkRGhŠË§,¶¨žÕ׿AõL<ÌÌé~k?00˜~FMÁùq} íÑ0Cƒ÷ÂF—á™í˜Àø‡^™cë[ÁB¤lræb’xóò/’½"O=Ê—ËË-·%·ñz›ùÈú:íÝ%šGö·`Ô\(1o ¸F¿¢^zq »Jj¶éu©ö¾¯~…éê{Í믪.øófÅx¬žLÚæ„» 6<ÉpymæSàn¥Ð“µc:œ/\’r/DX™.2¾ùEä‘Ë‹«œm4‡‚•º)gïŠÚ Ñ^%Æ[¢­MݸátHnƒìüuöLÀX,KCSÚèÍPÒœlOh-ñvÀ}臦͚Ÿª.™ŽYA€gcÚ!º+ÃÖó‚x ¦zD¾ð“¥×y¹Éd¡šj ¾•Ä Çr¡83t]¿ù#[fĦ–Ôå~’œ§å—œF$iNpFrÚ›X’×Ùä"ÄÌ©1™°Ô½tΡÌ,Ù/¦$'£—ê÷A©ï*oWtþ¨™˜¾ý›l·²\‹X¬7 ñoKû·æAf tÞ³3^2¢ úËÓ ›BúÜ â•[Þ£­„ø$›pƒ·¢ªp°yG{ºÃ<ÕÔÇcÙG©^À]¥*/­YœkD*û'‚Þ7“w8?l¥ê„£î”¼¦³{²üc÷ë‡>䆨½üÖ“$­—z«ØÑuÜf Ýõ¬ÏÖÅ9³˜cý›U 1Ž KÄV/C¬|ù)•:¦«°•é`+"˜è>Ñs!n-°ÝA+v¯È÷C›ôìuGÌ…˜ÒK:5*ä$À´0|÷½ÆepÐà¹ào4ƵUºˆžE~ó¯…Ñ*`q ´ÙÔ‡5Í[e¦ff¡¢„9ÉT5°ÃþðÖkEâ øQƒÏ³sÖ\Võ«æNX±{áãï{/.S7˹úY寚?Ñh"ßúÆÞ·—a^“pÇlÅ}QÝ'qá\¯Êø{=Ó¦6†ê3Ußvصr.ÊèÜÖññ&9œÔJ‰!š6x$$X\˨†"©Þ+ËÄþ’.Ü§Ï ô³î5º¥´£ýòV/ÐYx«FÊ èIn3t1ÒžåüGÆãûýÕÌÔ‡O}¬\½In)WHì(^Ì¡¬y»éÀ¤qއœèÑâÓEE­¸%تùÈHêÌGý¨.Ž¢‹¤“Š1vî3XÛ÷.ì°÷ñ_!7¸ Ë"<å&ôšw«!½îNÎwœÀGâ}Ñî˜qñœ„:úØwyjmÇϺº4Öìg( ¹µ5ÅùYFyo‹ey-=æ¿Jœð™–”†ŒtPõI¯@«¬[=fº²9‹“h§L,Dk=Ù›—ú§¨¿]1âµüh艰wbuì¶(ÐÇ{ÑAΔ@z+m«ÄUó»1ü³®®£­Ï{ÙÇß?VŒº|¿aÅÈ¥Š[1i dg‹+šw})7¿èrw4«ôSMŸ­³ˆÝhëD/Þøû»,ãü¾Töj¯šÇ_Ø}õ6ž¬S ´¥œöÎŽ¿Ÿa?š¸J®ëÎ*‚R— ýçC©² yžºîNÒ¾Žd¢Yïqý†è7ÝDßÛ±¼âŠËWHÏ—Lôþ!©#= ‡( #aÆù®ÂÜ•s3åšû)d}Ï'öVÍ»“!¹K¨nнt”ä%MŒºY¢klÊ®IÐ&ÍÑ.Ý|NeÞ‹fn§ a,Ït©¹éò±C‘«$Ë(óPòZdï˜t º#?i<}Ój 7# Ço‡>+ós>–µí†J3<£–Í ýÛârÒóXG!y]Ö¹¼ÖÙ-Ñó£o¸.Æ$lt^Éaâ¹±ýúbvPؽ¯î³ÐÅ3#ÿý• Ât·Å" X.ÇöÎeû¸,Y·95+†_ŒøžVñ~ø–¶ ­ ² i bù¸"1°8ôéÂù´ØKDþFnبªM1Õ„›—}T@ZGgN \üßï?(&Añf`Åñ5É8m€ðkHdFl]캩Fb饤ü xƧ;gÚ#¢‡Ž,”œjEiÕ·š/ ms è‹Øòùx-ÙæÕ2û 9cßVrÔ?,úôÅ|!¿4ã÷ý˜ñ¨Ÿ½(è%ë'ìñ¯üçùaï'ŠF<|ÑíÉ€x©ì¦ÛMéd?Xp †Ö‹ ÷l{ÿn !ÜâxH4JZbSÜ,‡Œùš,OÝ\Žì¯ ´“ZaçJ{˜0 J®Î“(ñ`¶øÊï³-ä¿û6k†½Qëè cz§±o{ ;ö¨—×MRj’åÆó[ÓàWÎbŽº5Â<"Ú ìµ7ïë›:nc&x\©˜ß’Ïu“v||$þ`vu•ù:?ÿve\ÀñTÍöôš¡ÿ-&©åŒ™‹Vß¿|þ’*ªII,³¿|¤ØVß•³Te¼2/9c³œUó Ü.;=¤MèçU\\Rq±P¯£áy<‡ ãkÊ*çK( …¥a\$rüz]_2ˆîο–ÕX­v—m”"LRp‰)C产›wÒ7Ãlµ6ó5sÁz¹_âêK/P|ëÃ7ñ)^žsW£ÒA•8Hãâá I*õluLՓ؈1yoÌ¡ öJ·Î”™Ÿ]åÿÄ’#ÜlÂtÆP®:«Ú¸«JQ'mÒÀ´“¨M­±ä|ø…\áç#lªnÕßòRè}Yç¯16’íÛë$Å}´Îa–xË„©[dqßÉ‹(æ¹LE4çÂ@©*ëu‹…ñ­71Ï©ôía:Ǧë´Z7ðu¤—'E÷Ÿ¥;3¬Þq “¾M©®TßK–[ººC¿@|E¯r\Ûø™}»gmŠø‘І¼3ñÓ†oN3ÌO§ED¶+¶ÛÍKY]= ©ëq-ÅÞéŸ!¿Ô¦UÍ:ãÚÉìty8´G»{ws¬|P_gÓ”íCøÚ¹kÁPÿ§K¥¡¢ö&ƒl%&0™oÎë¦6¾¢Ih ‘dà¬^ÙXt]cfÕÕhdu°¬œ h|an*öÞ…xÆéžëüIãÝ»{ì‡ìù†h«^I‰­½s»ÇJ^‡ó¥Ö»Ñ#ú¥Wå¹0ðdeü\ ¯õgDƒ$¸’¹‰odä¤:˜Q‹_ÑÈ 0 yœ-íwÑ`HBÎïð8|˜.±<Ë<£4[Óæb×´\H!xM<„§Ÿ©¤I"ï™YõÛýèùüÜåÜ´cÌÞLjôëòMýÝ/Åòó/Ùˆ¼±˜´°ï Íin©Ã’ORciã‹Ë#·W“®©-\ uæäì+ìÝU½úÎ]^©ê~v@­š“Ïñ¼„ÇãQ“¯žê•XÜ|¿šïÔã\\ù7oš°Ê¿޳^šš¥û:ß}tXí|£ÍCR¿Ó }Õ˜tÍé’§@ ï,ï;jým“ñR¤mAÀC:(Y¶ÆÖžZ1Ž“ÎßÎY-úhõ°4¸ÐQZ×tÖµ0‡:.VTTUXZHQ¯\öUEÑzrh—K‡_;žq¡X6´4óÖ}-ZZJNêX&hæsÂÑ’üñ Ub7¸õ’Ä,´P>%§9?ÿBŒá€ù>ÐZíTkÖ˜3t!… ïKægÚ˜ã§Ĩ§b^I9IÈô\6«$™ Ô¯Ï2SAS7nlMQ_ë¸ã°¶:óFòÖͽ}Fs ,h݃†f;yßÎPoÉÝ͵áÁm·_vxì™d0kÌ*µÍ9ÈxÁ<Ã&µË/Møã¨§ëð]âv^ò`v¡O6ßDôð‚]ï)àúY±Ñ ìõÜ|Œ8y#+s:¡õg-±¢Ž‹àã^¶7üTøí¹Ú}n¨n ÒÝíW«¼A Ëâ•ìÐ;Ž!FReÀÕµòÊøaN>À^ˆ‡QžË6¸f®a2M »[òÊ]b½û1ò/‰&í<ú5|•z”̧¯ÓD -e»©“snt/ßo}]Ixh±@·7ÃŒÙáÀ²À0Ræd ºe¬dˆ›”‘Ûÿ±6©ìÜ8”·ÆF×òϹ6¦&]q¦-"nªl5q»ÇÎ+®—½Hצªóú mòeBMk¯ðþÊWþ³œL?n¿Æºã|p™µ°˜-X›5sB#±kR7mì'}¦oZ(h“{ù^ñŤ;%[œpä›í{yÃçå‡T}æ=.&Ƽ ÜV«®'7¬w=Ã(ÉËRùÚ;q Q™Œi”V»ÛÝ÷ä  `Xʺcã{”Àã‚WWºamx–ÕP¸˜Ï³ú>Ã`ª:îEŸã+ •üéZÜ û§Îdß§½yž?ˆºAtd½˜Î§-Þ74S“iÙw-¨ÆrÃ9+’8àd æÿp×"{4·ív3oåç·FiŒˆÆ‡—i댪¸Ï%ÆY¤‘&Ôú–)®3•)zÝÞ˜Üäó~¢m½“–å…p“å]ÏË~{ƒÆhè á&Ã,_úL ÖµYæHºx‚ÕÝaš*D»ïÁÄ"äïŠ8€¥ÌJÿ×X® ¬R.Æi.ËHn®íe <í™[üz¢Î_7:ebjVê·îZx\ºb¦‘”:eþÝ ¹S7nO'ý~»_ø Œoj"*™aûU}9$]LŽã6<ÿœüýž7œËwÕh]™(Â{“Ÿ\•%÷ÙuùL)È55ñO‡W¶MÌWg_ì}?"iëö_I)Qƒú½Vt„¥¥ûw ¤.®În¦fŠ_ŸÉúŸÑÛÿ¹¶üþ‘ºØ~­.wkgW7c»ÿŠÖ€Áý.³ÿfµI˜ÿÑZcÿø˜›ý±ÿMG¨S¿PúkêÖ®¼jÿµ£¸=UÒ)‡ÿ.]©˜»º9; ³ k³³¾Lÿ;†ÎV5w…šÈìgúÆøo3s€úÜŸd÷³g 8ø½ƒ¤ÿ3æÏùnþÒæ®ªèŒî‡pþ'@ Õïê`áøßñ`?1ýõ…Ó3ä­‘:Û£“¿ÿ-nÁ…6Z _ÿ™cüJ·¨¬ûßê"h÷ø=™þÜ]¸þHwáþ¹‹:‰þá.ÜÿÌ]Pýþ{ÎÂv––ÿ£Îr²´øßè,<ÏY~Ò,…«³å¿ßU~O¢?wž?ÒUxÿG®"çhimjl÷ÃWxÿ™¯œÂÿw]†í2§¬üG}Æî„Æÿbßáû{¾ókMSØYþf›$àŸ»ßÀ•þk2gÖä¢ff'S¹¸£½“£ƒ¹ÃiðÿÈMYÌØ~ïC!òŸüÞ×B~ÞŽ&BoúãöߦP`8¿“9 ¾õcLñµ_ª”õ•NÙÐB8™Çÿ÷èô·~ùuÊö¿J§ìh!œFÂÿmªýû¡÷«˜ý? bUcIggGçÿN:Áv²ñóõ*zT3¿ï*æfaaî¬FAmlï$ðï\o¡¾ÅóãY…Ë/Ww3´t¿’úb—â¿+õßîüî"÷•¼ôïHžóä¹~³äüÿØ»x¨ö/ŽìYR$â™ÔË’˜3fÈ`,IY&{D 3KdÆEˆz©¼G´ÚJ¤’’TÊR½–R#"„JÉ’(’Êò¿wƾUòè½æ÷fîò»¿åœó½çœßrư˜hý>•fÓØýN¯XäX}ÿO8f¶ï•†Ú.c’`”â=M”V§ñ¢ô¤ßyïíN"Ì QC]ÛËÍ㫯tà£<úq@Ïñ"ÎÒH#xüTÛ¨`•!`S ´É ãÚN°qü?*ñë“èsœèƒ»#Fu!Úîö^n€~|âøƒ}“7WuñNWª}Ñ|!´ÑÂhb Ž ‡1ìyü1„¦Æî>’ôÓàú³'YÆ®/ã‡÷)b@G©ÖcÏð¿÷ CJ¹iü‡%=„¡¿¯’Ó¢cCí@V„ oU_}Õ ªD75ûÁ'G“ë%z5d¾£¯Ô†ßE—íßt Z‹‘Â?Ènì…=±c8» åâþÂú¢8o0í: ¾Óâè‹Mœ(‰ äðCp_dRw;g¢=E~œØ¨8¼'@L Ñ“<<š(÷€ü˜ä2Ð7ðQ}ÓßR:çÜ~ô~v¯ Çz5w8‹œ‚3¼O諭˜¡ „íä!/Œ! 5n€VºßtD¯R<½ˆCb´NÄãâÿ$ææŒv± ?”üÿˆnc >ñ'‡øßà@ú1îe ü/„ð“˜Ï7Úá>€ð0ÂO„ð žðS‚ðߣË3tø_áQßð kÓQcbº¾»ãhÛÏAïè8xNsþD>y7é 6æÈN°¦³}ĺϛmÓ·ºêßä¹’¹Vü ôè^KžD2„^ ݃4N É&7/u˜?uÕç§~ÃÐ×ú‡ãÆÁ¶‘Ý6í8÷¢Lbteh—£1éûF)iYLˆDÞ•ìN“{ÂàpU? <Ž´‰L"içÈD{’ðLúžp59 ¸ë¤ZÕ³ŸeF ~ùúýæv#ðÔÎíˆ`ë\‰„©P M°ŒÖü¨f8Ëb`ˆÑ@:æD’_Cé1sà9ŠS€›-¸ù­¸9l~Ó¯–ý|2>XŽÁ¦úÂX/Oâ”#&H OúúÐDøQìDN ;G(¡ÈÑØÉÐ>‡tÔÌ!'CßœQÜd(š_ÁÎ…‚©üýÙ·*ª!•¿ÁJWHý÷ r‚¤¾>š9pœ`9âdÑ "G£ã7­Øûi]…ýDccL9øIÆJ&1T2°PitÿMeîgFª©„(†71Dý« i k”Zõ“Ó$¬ÍÀ4†©9rS4ÍoŽá•ûÇÁi¬ýu~ZpÇuöóêMŠ“‚'=B?8)§Á­È~5HÒ#Ì Ú¼o²8D"0`hl¶ÞO =}ô<Àm^ýy2‘2%°C’„ìeoO$“¼\Ô%?91œ9ŠÆÜ࿇J_qÈ›ÌìPæ("0¦™Æ4ù]ñãèb`$ˆ'‡Lÿ¥ .¨quïkçumæ†1<ÕÀ©à„¡k¿iKÈ)Nà\pÚŠr<â8Âa`b¸ƒ»««»Ø:Z U/°¶®¤‰¦¢þøNù_)®@€BÇ)ÀÞÃcÜg×è hpòìÛ\Ó?¸B‹z¼ @>PÐvNX\&»á]]ÕC\ýgüa=j»_Ú';WE¤vßé%8]Ô¡ÛU²,ö]½´LLUb÷Õe Íf[6¿ëÑŠG¾4‘ž qñÅGDêȽ0k™—X÷RRÝW ÜrÉbßóÉ'jsîlÚÌ»ù½€fر+Ý4Rû{,ªž]&¶‹…žÆvZd\&–?¶æMg÷&%xøá¢(‰*sn­¬söùðŠ8Çw‰DùýÚx´%|¾œy–ÂÂÚ±]Õ´—éÓüpK¡ ë-ÿûsçwéðí’c΅س½=ž$°žŽ¡öYÍÁãиü;ÌhüW„"EöÅUdÄŽ4’þ£W“\‰Ú$Ðý04ÂÞwÙ…ßhÿ ÒG¡”ø? mDBe%¨Ì U´‡¢íñЏ’AÉNÉn¦ëÇHÿlš¬ü]ø5ù‡Ä¸"p?Cþ§# ³ÿÀ`£%À ø±9Á˜àIóÞBàh9¸"ØérŠ(¥þœ $|ìœf’k_Ve94.C#&ç §IÊÿwÙ…Ë?LŠBŒ”†ÿwšÒößk&&wšýç™\|ÉöÙººº)))€˜€€Á€å‚€9Ø‚€!ÈD3¯ˆ2 7…òAÐ÷hsl¡gåå˜;-kî[ßß”uçróÛÌÌû£î^=_å^ðµÉ¥`Î7ZÛÅúx3ËË›s¹Þ9ΙӃFï̯©[ÜÛc€2Å.Ó(KŠ!¤h5É –­?›ØÄlãR½ðu*Ò#˜ÿÒb®C™Ÿô:™º¼ÞÜý¤‰SdménÝÃgGµþëÝ mëЄKÜoŸ 8¹-®ðÄÖ #uVÞ >|~ÅZN¿Šu.ж6è7øVÝjÊJOá7¹|­<¹¬4ÿ¢ŠnRyî5éêêÛbÒ¹/}ÔµOëî~Yþå–^áÃkQ ‹ÂÓóØcåõ¥PR •.|±Íâ¨-z§KR;æº?~õøT ÷*á)ß´‹Yu¸B¬ôÑM.Ô?ù˜³K燱֛}aÍvùØÕuíjR» K÷+Èó¸¬JÓý™¼˜«¬õgËK}°àå=[ڑȧq§dY*G(¿Ë&Ž ò¤Ö9ÃÇCu9ÔUÛj•{ß^–nH:ihét0 y”ë­ÝQ/ØCM17ѸØ#¾?³÷-›ÛùÒ&lìmÜqþÒíY²™¶[ôÀ~•À˜îm¾…lŸÛÎ\õ¯÷9›E®ç]dߨßnô™©ÆÖº*:w§7«¥‡¯†£“>å¥fê6¾° l=t6)ã\M¼ªÖ –3»ç!¤6®¯P»ûð>›Í‚øƒBž\5I=»€¬s¤ra‹DN…¸Í ŽËk~ftnñÆ]áJ¡³nˆ?Y½ý,û¥ç‘Þó½#âÅ%xèªPªÏߤ¾›Û$ØÌÉ¿ÛKvacÇ‚0ͦؠÍÌÞ;8جµTLýüX©l™ÅEg##~O¸w‡c[>;ösñ+Ä¥š|Bà»Â"Y„v!ÿïVœ‡_¢ZW¾\”ÇRýâȶ×çx(¾ ‚—~âUM׼랟°ôÚ:±G-Üš¯ß°`:}ÿvߘÍkAQý íë÷øÛÕ u³sz¥ú¼)ßÞ³~퀃e[Ÿ wòê+Õû¨æ]·:Ò,¸ÀK“|ÿZRëífj±1õÓö½¯fåý}׾רüOu·Òô´fIì&º•°\ì¹ Ÿq~ë3§þZ^i…`Dh»ÀIóä¤öW9‰N^Õ“­ [#+ðyØÞï:œŸ§› 8yLz†šƒ{èžßTÂ÷…÷7ùGxTZ¬ýêwƒ¥1ï4~è•°oºx3 $º‡Ï™Ãª%CO]h‡¹Ñ>ìG¾½V~ù‹UZ‹õ°¨ÄÕFÛN>29‘reõ©vÓÒŒ·Û©Q`«„fM§Áû|UƒnKnÑ¢G©×…f<À¦FxP•º<¯‹ìz"~Ç7gg&"~k¸ÖCÿ˜ Fål8¬Ô¡dÃÖì§°ÐçGW¬üDÄåìì~±±\މ¨þ¹&ëP²]ü=Ä¿vö}eÄÙT·7§tô%«¬\[ÿ\Á$9õdÔz“@g¯Ê§\OÜlàv¼‹שó¦ w6åMGpò1C¸Aó£A·‘÷¾_tXgͽ„ “¾ÉæüWZ•ÉÉYkdœeór›$$á^“).q×Ã8¥$º9˦›”˜²Çú‡6íײXn¡eÛgÂl³æ<Ôu,ùÁ·’’Ç L¦†ž{®d‘¥»Ë–eû׿/ÜÀô!*8f‡ß±Š–öPŒ(LŸ¨©³}2•Cü¦DœdXªþÉ”ó.Î~wŽ…‘¤e8¥ÂÜÄþZFÞŽ“ÿ°‚qS¦¬1ÿËšfQB›ç%ßmÎ6öÍ739ÑÇ£|šgí½íÁWoZVµŒçí³WÁ/`þ|ÛÑ#3»©£Ÿ-.çy…_تFÎçGÜ–êR½`û…Y늑æ-›Û(})îý. çÙ¡žï^0…¬X°ŸËqƒ½³ól鈶]¢É'V¯Þ¢÷'-ÜβÂWïyN[VCtfáê{/T:ã¥KexËH¯ÙCV «ª·ªˆ'\öóZ}¼”eÛy6ŠÖö´l»ZlŠ›jaY¶‚Åám–+yŠ%qú†ÇjA¤¾ë^ÑäÐÄ#ñ·ö‹Ô ÀôÃ5‰KÙ–s™ùY±€l–ú¨X§¿Ú(:.à9®ˆ]‘ZNдq»uÂë¬xŠÃ~®[†1wÒ‹Û_Kêeü_<ó[5´iª©ÏnÃØ(-ÓºÐ.è_~]hžH[¤m­XÖ$r †xï ›^ÿ^][Ò³&,Î8º€1AK¢)áqðW‚Ô[U‹ÏÛã¬vƒG8¿šìᦠ¯”ÖÕ*­r ¹ÑùðHyÓ­ýÖ= О6oV/¿ýg³ÓÛV•/»_¶-ê਩ƒ1U’Z¨4_lsn ¨iû±$¾k¨¶(ƒ¶L>§¤JŒÔèPëÝé°¤‰7°eÙ zùåE4¡%½j×U£¥<ð¸®êá\*±y¹¨âKTLéZ&y®`[³LÜU'ô c!j÷ǃŸbp:Æí‚7[a{sÃ8`–«¤vm¸¹´IF³è4÷|ÙßÚ-U²¶™îŽ“l\nŠ®×ª‰Gd¾æªKÄèHû™]×ìàË’g´nyÈUGJK~Áö´¢˜µ-Ó¼þK”{}c™ƒÓ¤ìm*‹q÷j2¹q‡€×A{xè|ßù­êDŒ’åŒÌ—ëÜTõÞ.ç„-îlõQéœVYÆ"Àk¡L£À¼qqˆZ"paK}àÆ d{zí-2ê“'çÔP-Ù–SÄUƒÎ$˜ŒqlUË3K:à;Äþ6‰)·­{ñ’„tºÒLôàªå¦FVP9š–æêSœR›‰GÕÍs$Ú;áEŸ‰YÞx7˜m=TÏB5®,XoŸs{ÙE¦ÌθeÊ&ŽÕV¿Ymõ骲ŒÙ9¿Æ6 £œvIÎ,ÒŒªË·~C!R-/Rödp‰ºQ ×±î†Ȭ֞µÒ È)á\ʱ×MaV­\oõ¢üÒ®ƒ[(þ"bk3tƒ:Œ8’gý‹ï&…s”Äü°†ƒ F–Ñ;ÿj&>y÷¬Öf_¡ù½3¢U¶ìi¬¾ÂËHnÔúx‘J¯h¥-»µ‚Zµæot{vÂÿd%÷ÎÓ*Šðf‹ŽDY™Ûpk .¹T2SÈW³>'®ÅxÝΉpÜçÿAó¸_ã~áuÒ*åRâ¢Mþ¤®È†®ñºÂ–°CTðÀÞ÷îÆH“ª¨'ãnÌ>SœM;ñį)¬ôO5ÿ“IÍ¿aõz`#bƒeÖ9j&jD©¼ Pʯ_£Â+ öíãÙ¬’ýf£-H ±¨x[íâ÷™Ó2röv·ž'r5ʧ¿Ê: ì⩾յüúSêÜÊ …ÊçO2BÊ©æ¡ÍÄö7ïĈ߷y\ÛK¿±‹ú¢²à¼û)¿„µ7T$—«ˆlÝÎ +ˆ?5@-°ööÐÝæÔC{¼€/ T¶Í [àªpj˜ª“Ðýùá{ AÉóƒb€nD %.2(<ò†¨Ìy‹Ï±âE%ת6~j&>8 t’·¶I›f@£Ã~ºÂàA£ÌÕœYÖ‰&[>.Ko»ö;‘J«\ǹ$¼Áröå¹9<=›ÎÞ”2,(2çÀ2„nYõãšßtúm]3ÈháÜ8]äÑK7ÚºÑz ‚Lÿuë})•(%àB[&`ßHD¶°(â‹\æÖjÃYË%kJ×<ð|‹k°™ñ´¶¦÷gŽ^’¬nª×?~hŽóì‘»þ\½¯ŒýA`??Ásê¸È>i”¬F#·»‡$§á¢>ÑMÛ,ÊæîÌË:㸉4ÄÀ`”»ÛkÓJ>£ß0ž„ùÕô ~Ef<¾á£{Š—’Gú–ÙϹô\bäòð'°8üåÜ{MÑËÂ7›eù^¾}âuÞË¥1ÿzY\`>§àùÚ£Å:ú嘌ŸüƽޖúÅî!+òv¤|…¹¯6-¤nÂÌg;g ¡IçÆþuóÚnðŠÁÄhÒg?Û|ÓÞ!ö¿aó§dœÏˆÍ"¤õaøÞ~˜yéP@ÈÖº0ÖŒÎÐËŠúeë¤`Ž_ø(úÉQ“$ÿÊS¥ C®YŽ¿[1tä¾_-…K5Úîw²øÁ'“b<~ײ}T½ F÷E“Íh>I&X«ñs™&«âÜ7OÍk­µâ—µü׈á!ß4Õ¹¶mÊ{Ó§vÆùw!y­f­SPüôõ¤GÆú¡oÞ7/)[teçØÒÁÍõÆ™AŽýý„Æë½ÜÁ¬¿íìÜz õ\Œ'.¶8:Ø!ÒílhŸqƒÎøoßã½½ø"F W»¤tðÊåßëÜøþjhÈKþnvó‹šß…ex/\ßX¼Ä5V§.-ÆãÖÌ至·”¬™¸®<Ës2éð“–Çâf nöÌ2œøVäÁû©e'a–Û‘ñÁ77®tð)Öj—ÿx\ …xÅCüÈý‡ùLKyÿzÇ5£lÑ:ñ˜xã¹î-’ü-<¶…»þÌ‚TÀÉ1¡oqUܵÐEŒ‘ãìy9ÙµVŽ™7`î6|FÄ-oÚz!£Ù=‹ZeSTî±kûðÏm—%÷ÿó°° )Õ`ëŸ*svä õ+¯º|ÊíXaტw;WDÔqk«c+—äŸ8á\ú¥_.0¿a¼ðýòÖ§¹ÇôGÕÐé˜:^ÌÏoóëBr6ÞÏï -¾o5½Ò;¿x¼ˆšYž<‡¦¿†‘_˜räƒÅM2¹p´Éá8¿ §µœÆú«/5ª–Þ¯,:}TÊÖPÚê¼àÛEë /ôK¾ÎyóÒzÐò˜Ý©-“óL7ú‰‰^µåÀÍÁ¹ÙöçH‡]3Ÿ[óÅ¥å}Å{ò-Ö®qu¥M[‹©Oô’iH½5+ÿàX /¹)ÑÙ¶ ?œ°-}QTÓØ¸1÷|Ó×?€õÜðzQáM Í8n§ÑãÝ·KöømÎ?QX¨³šQM×6äŽK+a—å×èl¦€ú“Ǥ°ÊòSf‚9j½[Rn~|Tnô´´cÈ2·mYlZ?â݈–´z‹¯Îç5?½Sái2úí¢_yssòwGð,ãÓjþ¼hûó‹W¾.ÑTƒs\s=^NbnX7µ•tÕZ–Do)ù2%ïtïz¢¸ÖÅø.7 0Ï 8þ&‰~ã–|nÁˆÝ´–Ô«V.Uôƒ#¾žMÚÈ«¼Ùßmä¡0ìŠKON3Óó xù¦Tk?rLxV®Ú1Á!\¿é—Ü*ÛV/æù2ªãòªf&þß:qEMãθãH-—›æÿøS©©óºôˆGVoï2œçaM¾¶_6eË+f à WRPu¯$w¿KE:e°ÏäÆ±ë‹› ¿—mÉÕZî5ì KîêÅÍåïÜáŒø‡Ì퇘w² }r÷†Ü›0`´ÑåÓO¯¾ÌšfXE +`ZYUóóò%ÁÛq$Ï€YMú®S°'33^Þ³ËÑu^›>ɘ?`û© ›ÝÏÛ~ËìNKÒ¨!-# Zu¥™ÝJš‡Îùíqá¢³Ç “üÜWÐÅyùÙ{HŽKIâu¾y½)%³tZ-§üàáqó¶îsv>¶:C ù©åF=Ã`NRvÕÁÓ H6ò·/Öľ+jˆX¸À/ÖìKmn` P&ÜrÚCVYÕ¨M¡ì%{8ƒ ôæí˜;¾¨åiÕ•ŠÖy».Ööó«¡-x˜0pÃ꓆­tsڳǞ1/mê_´« ~†irìsÙqBøàwŇã¹ó‰S'7® k—¹Ž*Vº{K ‡Ñ×ÉØó¸úô‚$¬þ¢÷ì¤IùÉžÞží¯ÝãtÛ ùp;Ézü8¨4Îk6¨bL% yEŠöªŽ·5b§KÄ„K“æ<»×ã Ÿa×%bçõ‚3cOØ|ðóÜ­-Ö;ÊÒõ,¾›{ˆòņµ[G­+IÞðÌØf@¢ÑØß—Õ½´KqZ9‹óº°/ö¤Syäk«_NÝKy{5‚‰Rßr*glOž´-×¼Î#¥´úîë'´E——ý~ÁÜØyÜÙ½¤w`+ó¤êùFƒO`AÙ³ÙØk1z3‡Íºcb?ÇUøâeêÅi«<9úÊ%"a>{fî–zøC؉‹Nk߆ä~.%ûÉ·võ·$Þž’˜3š²òÜ|‰cW~á7ÿ— RÓø tK± ”]¹qåŸ1î ~8?0s _]qëù°[Ÿ3nÉ®^Þ5î„Ç•nfyƯ¿_/û±yøŽ¯ ×îXhæuw4¸µbiýÞ,ö‰7xÜæC{u¦™zI.ño éù]å)»0JÙ²á峆œãf´Llø~iýgöÇS‡C»v¥;šKm0Án¬“² ø3šðt»ù⯷mö:gAÿlÑq‡ê’ ƒê[›ã…›‹¼wù»êNŸ¾4¸ ï×·26=º”äe1æX³ìZ’«Áôa÷öQ…7Á’¶¿nl]ékOz8ñžhfH¨‡[É –¯Óðm« cWyg4CV`óÓ·rÌDdÕ×{¿ÐgÂï±Û><;…|fü‘#%ÚôJJßÿP™çù™D¡RñÒó?Dœöü&’2þá½¼M$eüY½‚M$eüÙ½íùO$Uü>§0OÌ'*üMÿû:>rþG”žÿ§‰8 òñT*E{þS#Éa¼G€;}V 'äE÷ó…g¸ùz»C¦6Xl0Ñ‹õ {H3H¢ ™<q®fr±XOćõ«u@\Ýba1B<màyqœxGSw>O ôȆž(@âFHß9š"Þå¨ÖMaE1…"XìÈñmlmÉv6x„'P<.ì¤äblɽ¥z‰¸:CÈÙ$(=¼ÆcÁXi9Ä{›£ìP-ó,f‰DH$ ®£)ê-Š‚‘hÕb L(„õFÛ#óFn(<£Ã!);™Û± âÞΉ—{sÏCœ;Þe${¢$R,“Ó9Bû—Rÿé@f$Œ:4/€º/ÅÒYQ‰2î©”‡—<«GŒ˜<_Œ´«3#_ŽHÜ#¨ã¼¬<ɧ—ÅRuAz¹»¨Gl"¹üp&·³ŸÂCú_Î!æ"ý¢F$u­H#jwêB*$.ÒA²0 °:À‰paÕP0$e!5°P*©½C8P¡›h¶X6“Üùäž'Ê,)ŽRsA–"ijwÜ7c°Á(æpÁ8ðã a ƒHú wO™ÉYpÅSDb!‡‰‰²ˆO‘ßM…ˆ«–”Íå„÷ˆ4²§„ Å°PÜ#R~#NÌAôãcÄóâø€ Ûà L;5 e‘dêö³Œ÷ÿPy– ã;TÎåGvY3¹M}µ(žÞ²JÙ°cÇJ„ÐÓ¨:vÖn{PÆ#:u Ý`~¨ê­…+aÇÀ XPc™ pkb€ Y$Àƒ¬N]ðX ©‹2Hø$!ÌTî²pð£Î°‘ HÅDæä3²F AÇãí(Öxœ5ok L“viÔU@Á²q1éŽ;‘bg§à¬ITÀݶ{îdÀ€ƒgLöGØ’ R¶d;U¶`¹QÄsR )ÓMø%¤NÆ©Cly„!å!¡hP¥rˆ"8M•Ïå`î#¨-$ Çz‹áX_8BÜIã I¢¨Ë XÝ^à®F…íùdç ‘)ù•ÆRw{û-RkÙ%êgQ),/¥ñ³tÿê« ;÷frÏ…óÅb~l·w*~Ìæ7C:XµËPi,ÿ’æuèæ¿t½ëˆV%í¤¥Hä'TGºèx„@ÚíN²nBgOXÅHP!&O¾¨#•u(†EÇF ÉRµV,Á¨rƒ‘ä>Ö§‡":Ätÿ!öEW]ãÄ`<+Ç€ò{('Á\tén·M€ÍÌóí¹ ?ÍvAweéê cxÀ¢wúº(3ê_Jp3AQÐ}ÊÒá0øóv£r$lR‡2t$*•@È«m,rY1›ƒØQáqÈö‚ÃC‘Š£¼`Š!ŽJàp¹HlBЖˆ8®5(¡`oºWÀ :äê? v rõ§Ïš(Aw‚\8æµ+rrâØÏØó# ?Ï w/@ïêæíëMŸ…„*›êM÷÷¤Ñ ©A+èD÷vŸáë6„A4O „ÊŒ*“Çn,W—h¨#އ„;cBn4i˜)yBâ©I¯a$ÊcmÉ5–Jfƒ1ÄC"€µwˆ\yA³¹2nh 2X+ÂÈo€æ)Å¢pã"9èÐL6S ë‹#ˆå°9¨¯’” i“#Bb?J‡=ŠËA>`_Éî¨Õ@1J…‰i§r‰`q0,d¶í2K®sÒzÁ. ôÉ‹äÇ1…lµÕDòllÅ0+JZIíU|ÞÈ_T{‚­6ò×ÿϤüùÜ{>ÿ%i?ÿÕDRÆÿoÿ Œ?Y‹¿&’þ¶½áûŠöû? &eü{Ã÷ÿí÷LÊø÷†ïÿ)Úõ_ƒIÿÞðý?E»þk0)ãßìþ-þšHÊø÷û_†?U‹¿&’þv½Èþ×ÚIÊø÷"û_kÿi$)ãß‹ì­ý§‘¤Œ/²ÿµöŸF’2þ½Èþ×ÚIÊø÷ûŸ¤õÿÒHRŸ‰ë5ø´Ÿÿk$)ãï=øk÷IÊøzþÚýŸF’2þÄÞƒ¿vÿ§‘¤Š¿â,0â­%äs >«âbð‰u wÿük÷ÿ#ÃG à´þšIÿ<ÿ?¹^µÄDA²{›Ç+­ÿŸÖÿïïðÿSRHÔçÏAÅ…Ç˦°»žZe~ÃGŽ!‹;ÝcŒ^9-;|:ãuT¶!3!ê&ÂjžÊ} ¸è\+=5‹¾„t•òðvíyx;Èñì‘sŒB>r‹=_hêdƉ1þžÁ š·Ã=ÀŸàËðôcx1X¤°“2{®=×{Yéîµsxð§  h;ßTJ¥ *=G *òˆŸÖsAA] LR°%ý=&w/4U¨?â ØÙ±‘ØÑ±QÈ*´S®íBäD.SõR“R“»í ˜ÇæD¨çAQð |:TTEiê§È]Bb«`m«H¨`ò ¨™9:Á"ËèÅ't?»††¨ÆÄž c•ÒŠ1HTƒ1pb_È6u«0,äÉŠ+ÓH¹@ÀM7u—·ú·J=ŠÑJ$t¯rhL/¥¾çˆŠN$BÉ*™ŠqJ$©L DÅh ’UòH2!»ÅVjg×+w)ÚÈŠƒªÊ]âÔ÷*ú’«åç¨Q}&*‚}Bâ¹V;´ÝI6#$b—Rt-Z¿Š6葈ª (À#‘º[ÈÃ,` È$·WaAùl8š pR()h;@BÕÒ],äÁ,@E‡ºï¶O¨Ìä0 ©fŠJsÓ'‰ªÚ[vŸ±©xiSí:5•†Ø£hc?W=± ÂSMkÉŠùŒŒC¤PÉVLXä®&,%­VÑ ²b"" Ïâ’Ûõà³ì¾XâYë‚•¨ËBaš$„EÖ*MTŒ.2ê>¡±…tXÖª}­ŠdRO)ë Š°ªlŠé—Lî)K?Ðkt(ü…¬TµEa˜)œj"ž#Ç1¹=šçzŠ9ÐÔn@ï$¨b“Uñÿ±wíPmm_‘Û)Q'IƒQB5an{öP$÷N%!änf\ÂØ·•{•”Ž$æ”K!t ¹Î)•TŠÈe”Ü"]H»G9èò¾½ß9Ÿ·?<ÿÌÌÞë·ÖzžßzžµöžgíŸ\ÄàÁ/• ¹¹~ºnPTD’<(°I9;˜áe*Ò“B…§Løâ™+ùÍY?¹¾ÀØ:ß(Ĺ_¡jçæöÏÚöEq•àøÉU>Gˆ¦—ô3ú´)ÜãóxGM­ŸN=¾Àdø”¾°30;ôšÃÐVËÃÃÍ㟠}¶°kRh†±Oþ{‹ΆûÉLóƒqÕ9΀ú¯Àãm~F{æ×¦› æc8àèL3Ï÷uÿo› ˆö«˜Œrîï;‰·›ùu8bjz¹B?0•üߟò@†@®þñô¥e'Ã9€Gîûòìdp€/­>/ã!0{Q÷Åe‘"|öóí x¿5 Œ›Ýo=+3"ÓÿÿÁý<ÿÿÍæÿ͈Lçÿóð?›ÿ7#2à§áöùï3#Óù'ü<üÏ>ÿ}Fd:ÿàÏÃÿlþçŒÈtþ‰?ÿ³ùŸ3"Óø·û‰ò¿gùŸ™ÎÿO”ÿ=›ÿ;#2ÿŸ(ÿ{6ÿwFd:ÿ?Qþ÷ìýŸ‘éüÿD÷ÿfïÿ̈LçÿzÿÀañ4L<‡ô¬ÿψ|ɿՑâáD³¶„µ5š àJþ›DpþþþXpSùçø?àf÷̈°Œ=m¶³%€¶D,@¶³#‚ hg“€W"ÿ¯û7+ÿ¿ò#þo ý½6þƒÿc0î‹øðèYÿŸ ±³õ¤p^Bñ xŽ?_†3”ÀO™$£ñ÷ÎŒç ‰(,IQ€ÒDI’"Ùž<­äÖ‰mMH4@DH @@aqå•ÉØod¡9¹R<¦¶Db•à*ð`Œ"Où¬ëF3ô±ýô¾$8Äc°Szi§HÆà¾šØÒHŽäÏé*0‹q0@¡ÑSÄßÈ—äl‚ï(Â`$D£àEë »“Ý×0u*Õ‹Jrâ|ýÜ(ž€‚¾H<‹Bè)ü§ìg$–€F¡A<Q°×L@E²-ùk¨¦“«ÓŽ8Þch/5Y[èü!–OèTlöF|©¿]C Z¿…ÙR4|Íç:‚ÖØÇ¶¸Ï¹Åjá‰1Ô/˜[‹¤û¹…bö¼’Ú0?­Íê^gùðHgywXjvÖF|8©ó>Ôóê ÞvS}µ¤BI•¡¤ImƒÁ.Ýbå`G0oUï}fð#t_¾$IÇãÕ¼ù.=PÁU»žøõ àF„ónÈÞKÁ~ç\Vç{tÁµÐ“q&c¼tò‘òÏÛñÜeqVQ±É‹®nÓ]g|¹õp»Îߪ; N2©=P¦¿PþâŽÐj|è‘å ¿K&1KÇ¥¼¶±—‡þrHSTíÈñˆƒÔQï-WV¯4Üå°1šaxK+Y7œ[X8à̲yüîá¼­}¯™ ‡ù¶È.L>ø¡Õ=ž§uãÈËs•cfW¼/iãeF3s÷ Ư}×µÒ¤ŸJx~sÚj_•ü]]D=u÷G©f]Äéà¶¡ž´Dù2z6YÙ'980Ü]q2b僭ÑÚf·ËúõJKzÇ’©·„[Ú`Kų·{˜ ·û³ké5Æ¢ž2ÐÞ˭ͼ1´|—²fzÞàû«Ê47\|LAj[‘gÝDÉ·JéqÿÇܰåp hÀ\B· àÅкsYÙ;±ïABçí5í]l4_yd[LW’rL@Ó‹îÛÏRzÕÑ4hpzL$ Ú <ÿº;zV^Fª/¯r*¸Ë¸ºX™yš²w´@CÙ%ÛTL]Ϫ0í77]ö ðþÂ?L˜Úº4þ€ÔL+*.nH¡)h«Ía±Y"$¾TIשΧ“CcSò3‹­˜¼U±–)^äÂô%ÃE‡–°ã {îR—¾è‰IRFÓ÷·ŠÝOóâG¤xÝ«Vûƒ²KçN5quEmvŒ„3u÷Í_愯+«ë§©IÔÔ× ·ñ³ vb $-a$®¢*Ñ3(­vJí-Ï:Ò}îøõÂ!`GfUÑê}ä1†µöˆp˜¿É.ÖË«Ö*ªy‹ÀºÛ‡$ª³F·ÁZ”ßÞ¼>w©Ø@£ñyÔ0ô¾}CœIŒÂ52¾£ZJr:ægÉÔzŒCØ3{Ó†ý-ï3/I»¸ »§RÏÜRݺÙf™hL¿AiËõÛï:½rò•Û™t¯(K¾ºPçœyt?Çš¾Ý–4Ù-¤eíåõçÛL™+L†>’»_Ò妾»„~Ì ?×d‘´šQEw%êGOïKÈš¯^s£—µm–$‰hZUæ>új=Äûuyè庱ëâåšxP-&'z:eŬ¬rô[8ô9K ãCymrkç.òöw+ϲqp`<¦æ~8Z-‘näö;þYø£–lÆã`RÌž¼¼…ÅI´mÊÀ|ç©s’¬9¢ÐhÏXÌ0÷i‰ùs×ß!|(À4µxs¹!š§âÿÀßD€%TÌê”òÒm7=+ÀzsüàAÕM5ærêrÑîN¡‹û=«êLôßZ”ÆÏ}»È][CrçÅŠ«øßÌÒÝi]»ú’b4T'‘w[;R‰Œ[ÎûŽðÉnÍÔ@¼ÍcoŽ 4@Qe¶‰Æ>Ë®Ðæ?o^I´´¤¿™3r÷ÍÂÎÊGêÑÞ;yÙMOG±j§…gÌðoJØ?Ï"Jb1ºfAôÍýA©¹~Æ/¸P—Ê´pÞ§‚Ëø “ùY¥$C9¢©|]¨"²¦›cìê²ýÕÉ}zÐJ8Yµ…f&óÒ“ê°ª!ÇàAܹ°&ÍñN-°/M;J†ÏYqe4Ë6\¼ÄýÁ°ŒêÃ(ÆE•g b¨:ZàüZ+Uzýûè÷Û ô”Þý%þÙr‹ô‚J¯Üù#«ÑÁ›¯FEȶñKøëzâ]â^l­Q\cöæòéSØÔóh†2ýƒ[-Œï‘n¿cLJÝ>b ÕÑ´HS½«ð×V¤YDô-ѽزÉF8L²Atø]6ùÏÒä¢lŒ”ι‡—„Ê ¶ï†?q®_“àþ«%HTI¾JUÚ’Xe&$a4–B¡`é)¿È%ɾµŽHÝ{¶Âݱãü…JZ«Œ³ØÂ‘ ½oåÙiÖìö%Và뢟$ÔWXl™Ø_{´Y'[š|{Hkô‘‹f}vÞÑZPPáTO€ÕÛ°*…Á¢ÂN ß’ŠçÃk½{“ÜT‘ô.A÷_-@½ÁÓ Å>ÁƒOW,=yÕ),q8où3ö½“úhFG©<3ˆ4ùHJ©¬5ôbgìLðwÜÝè6¿3µà!…S§Æ¶$^-î=:Ê{²ýin&£Æ¤B‘G§$$6OGYJ°OELÅôœox§B=7ÃE÷Ó)} å~¸Ûôjßs/±kS4öˆ€Î]Ú1}ጃ]„HBªqÕ9¹á+­/?MxãOHÕ,7°DÔƒ!þ¤ØçXw-_3ž]·sÅÍÛÛ×56¼nYzÂ:Gø·k~ú‡¤ø_Øi¢½Ñû|{Ã"®ÇŸ8 QQevôdò®|B(iÏË=ONƬoO8ü4ÊW8|{~m)s-%#Ï÷Í–>Ý|¡²f‡’÷¯°çŽ×·6ñÐýLxüÛà.•­ç_mº]f°º1¡ãB>Û®($¤!*(-Mf¡ÎYÈm¯|Œ9_Ì,-„ï“öp7¬”+péç!VÀ-V€áGw}:ú¡Ž`tûBG¡§´¢–b§ô09î)æ8λ»ÊrrÍ+sEÃ2u2‰ÛÛ•¯˜WnB˜kÞp¬¹³¨ÆXŸÑ:æZ‘|»!ô.WÛî?…k "m⤽²5U÷ÓÝ/D:¦GŒ‰À  tgDÄïüáEÒý ½Ú©÷ð"¼x,tû&ÄÉ]­Û—ß»%‹´ühb,â·£<'sMEBϓ࠴ó·ôGÎo_i(Âbìa¬ñÜ:#»h³ByNºBÊÅÍ ‘pˆ×Ð}ý¸\aR5k‡e@жW.ŸÎÇÔ'ÇÞé*œÙm$W.â¼€Ï)-eA._„*Rh±fÊ È&<~ëŠ>cP×ûŠ6e½¶y [iã-wÎñÍmò×Cãš„0‡Ì=cµg5Ùú«_¼¯¦Ÿ{kù˜lÍ‚|ÉâäuôRgÓ VAó]ØEBI+èwVô§u6]*×\žuÅßî‹ww/Ñ-Ï¡³×ön݇ÿ(4ļnº>’XúÁx@ªùYì¾gÇÆ 0ž³d3ÛäÅý²Û¼!szо`þ½‹ýä,ÒÓ€”^ŸX²"=ÅÙÔÕ¦žQ7w)°Ö¾-òúâ,#ªÑò#Înonä"âÜhîmü äý&“5„ ëêMðÅzæ¦Aà¡L[ÊÊršXëþuP½Ž˜ÊzN  A`-·NþBÞâÍÅ!`¹h~ÔbÍ–XŸÒ¸[ÏW¤'s»ÿq)” MgïˆÒ <Üy×:\«SžlM~—ã‡èŒ0¾sd0¢ƒ˜[ïòW-ñ‹9wW/n%=ÊÃz¸ÔOÑo[Â|,AR¹+êúUÂîÀ@(±¬×¥±¸€\±jbÙóöÖ4é×’ÌÕ¢¡{>ôŽMèªjIòó["¬=ל÷GìHô ºÂ]vOº:p UZ¨Ølm/¯ÙĤY„׉_¬¿æxòÔµ:]ðŒ æãÊ r‰˜ËálÌÜw,e;øÕ=¹g@z¶Ay/û_ì= \Œ]÷(Ú4-ˆ2eZ$ŒšµžvSSÓо§È43mZfjZd ©¤¡EˆJâC›Š$ZmQ!­"JYJ–Ôÿy&!TÞ÷{ÿ}}߯ãgzžçnçÞsî½çÞ{î9TžMÒÔÐmy¬Ç,Üw”;[§óîlam,{W÷DÍ`sbüY-Ö‘(¹e¢ýik¶ª ªešÌMo×åi6 ·®¨éšæcáº20ÐÜ<\6E´$*¶(¤T|Ó0FS‘SIöê—bb.=V‚ÿŠk¾vjñjrÚ}™¶± \W]ßÙ˜wOß4‡ÇÌ,ÊoÝ\þÔØ z~Æ}Áí7eà+¤Ô ºÉë‹sxyÌLMÖ½Ú¾JfgcŠ:S§ Äw¦õO{ÛòD”ˆÜ¯äß ‰ò("Ägl5rOfžLª“ß?¾î0Z¥öìŸÝvê“‹)Æ\z+˽ãbK÷¥»î}ÄÿxuØö}÷0ǙؒàD¡ùI+$aߥ9Ík~ K9\½4Âí µ|Õt5š:Ûýæ¢ÒË…â-3®‰Á×'ß3Ù¥ë9£Ø¯–òè-9_N–&ˉ³,|Öd¯¸¹¨5z÷^Iàíç´eI±+1:q×zeœÛh®è–&á{.ÚykMËɳƒ¯ëˆJü¤}­1>dû$MaÒ±ôýv[-ñ}O碥eØAûæžmƒšÃ Ãêrî[SÀ!ÂÊüž–¹Ì)ÁëÊp;Ùü]·ÝõNÕó[èÀ¯Gcæëê,u˜ct¡·*LÖÎ<û‰ß½ÛµaïMª§×í”-N¼ø|¾ïU—e(Ÿø6äe£¹’°hã7öîêK#ÒuoÒsÑèùLµÍzœŸïù%SÀþLpêÁ½”#L„¿èÊWEþ4qvw¥tÿîö¤6¯Š©Î:b€Ó݃ ½àMži÷ßSª·³ÂHëºäò0{‘eQmio1S$ìïQtÄt?ÄEò]3#ëâ¦y¾¹$8ˆW…d¯‚›;æ~Ül•v|ú¬—F­œtží >ÑrfÿÖ‚D“ÓY£•é•Esz­"«…ñ«ÐÀò´2BüidqZ¬yJ)`ùßé,7s<^æë«ûn9üˆpèQ#Ò—>~fåùÓî›ç í«Ç0–¨0¢Õ&¹<ÅBŠ´nÂÍ-›7ò”ˆàaûPkÞ-?QÉ@Ø\8îÒ ÂΖF®üŠƒ%ÙÏÓÚ8²üê|3‡eÏ(ʰzÀòô㻵·Ê¦Fê~T[Qu".îÈ¢£7Krµ£ž<÷Œ‚c{zŸžª-ŽÍlí½á¤pú& þh›´pjÚú{)©’Á‡ŠNÊHià.ËÙµðÐýTqRiûTÒ< w¯¶•_Úg¾—ïu npa‚w§¥iƒ<|U|¨ÐW)™uà %`ᄊÄ›N½GÍàjñ¡v@ÿœ ÷yüÌùE"ÛLבŸaH·ãï—½¬Û­«pŸ›]”&^ÞòYñxõ òuÆãíűÙé/éîÓHM÷w×/FfÄ0>´%Æevv|±|£Ôµ…ÇælšÚúÄjÀÚ¹ÛuЏ Ðo…„—vöTµÜ­~û@KÁ|0ìȆOZA¯àþ¥= ŒØS]¨¯­¢©§Í™^º3^Ÿ1Û¡âaO›÷Hbz®P°9ïv*qS–ÄöÓÑsJ’dþLgšnûyuï»ìYþòêþÖ!íÌ++ö÷Þºr“ªîï–R/ÿä·HJ#G6×ôöS ‹,´Ñ쉵ݵèZ^öÑ4qJÇ»vƒ×Ì ëЦ±¨öãKón|üU3^ö±š–?ñA×C»9BòÔ·~̼•ÛPº•~´=ÀSrz;uOB§"p²!g^yç£ ?K34÷…èá[Þ§NSÄØm›HÖ·zä_.(Žah$]Òfό½±‚soéºäEr)Ô¿rAuÏé;}ÎM¶—‘5–-äšÖö˜Þ@0vüë–]’¢ñQ,%¾8ãÐÊ4ÆŽ®öÓ/¬Z>\K\ìÒÒ_×ÛGzoðþV¾ŠÄ-Òê0^y³¹òl¯Ö^§Ælõ›Õ\èg'bbÓ°#ûoX,­A.JŠ|°ßQç‚p‹Íû_ò6b/%'fnö±yo°³…ɯ<5¬Ê·ä¿FÐÛ³…7e{9ÙJ[Ümñ¿ýô Ê·Ù'úÙÿEPwÖ™ó_^í0öî´¾;3tþ˜TC…H~HmµqIž—Îc€ÿÊÖâ3‹ wæ¯ Ó»¶³@ØMÚŒxp«···ÎD8ϨìÍËy^—ºjŽ_=tÍãz5Ñý½¡fió‹çïž1ï-M˜uFõï4vE]\½õ mN ÏÌò½úÛ…ZDÕV·ÈÒ =Ô6…‡¸ÁÞÿ¹¦Êü`‡ ¤“›:O=±ó„¬šzЂC¡¡Ø;|;#\;„g=¹fÈ.±UQ……½¯¹”+šÙ#yï®Ñ”Lª"½^óó2x\'P£æuù‹NÛƒsŽ/xH]K“߀1k¸rÙ€xTçÄzw_o­ý&Õ¢ÜZ‚ü2.17Q%}€&¢‰?Áá™Ó~xc›y® L‰|p¹[NH„Ç`åÃéŠÑD¸CƇP§¨§ÒÍ¢²yÂZU‚žû·êJ©'P>>¤³·] áî{‡ëÅ6pgÔ$“^Uiö&T`—1ciÉQrÐû•mmý¢a²Ñ&‚®P’¸-|%"Ðöºv²€ toþúÅñÓ)£¶y‹¹ g7óMÏí¼ZÀ”†¥Ðæ²ç6ØÛíl9®"´’QR¡óü½?m>{nýj»Ðz€MMS`í“}›€5¬º4¬-Ó=ϦíÓ%óažw3êâìöË*ð(¹úˆ§¹ri4àþ…TQ*Ëö‘¹^|áÄEP<4x+¬¾ô’ÌuÝ’d¹õ¶>÷‘òx™±îY ùî˜È–uKÌŒ‚³_¼a‹íºe` söü‹ìî«ö:n¸Aé_6¯ß{AœBÆ»J™³ðµ=¶j77ò.]½¶UN¨iÖãÞž»¹‰›k#SSÉ/ ×òè½½®`£´Z1‰Çgý'º 8µÉSÄÓTæf­“}óÚ; y‹Ùú¶û¦\ÏÆÈ~7b–íÂëÌ×5èäÐÓ¢­/ö·‚³ZüS -ÉSËŸGù¶õɘ…l“íC¹Â4¦ì“kllj@ÀKåÀ»È”±/A7ÓÒÌ//W8;»YáÔÓF³;¯iݳ_ã÷¥ˆ_êm#ÍÖ¿Qg–õÖ\øESU›+—É,@ÀžÈ¼ ^\Æo¸K;êÑvYt B™™¯çÁ Ò“-‡æ§éÃÅe¹û­Î«œÁ¤ñ2,<šæTµÐ³"åØÙÃö^|‘õ[Xbf¹p“TÓãUâW6œ®;´$z®>õðêK‡“ÐD¨lµ Ø• &i ¶ö‹lH9gp8`±_“à¥ó3”K#ýc„s„B3ë¡8‡¹xæ¾(8dL”Yàze‹žסæ M^¢GE¿–ÿÌ\»‹ÈÖ _w+×>{ßÃP]o«êçQITñ¦Ä®ª9á7û]t$ùHJõ|siÒ0£Š”ô;²ê<âMÖ'fEñê~ôÓoÏý×3³êç"·ßdoò²é®Üc…iòŠzÑe"];rDBƒ úçï7ÝÚõ¤]¨múA« hN`”›+ïjTD/ZVÁÅ|ºËõ䬡ß$ïà­Þ=›pàíñÂõgcK>Ÿ™Úü¬)oÕC5åë‹ú’>9d”¤ôÈWN#Ðè1Ä«Íf™ZY¦èµ¯Ù—Ír›_·\ìZDVˆÛ|xm¶Œè<Ü}ݾ9ÍžW#/ >W:Þ-†KÔ49VV“P°—¾ æXâµÖ¯5Œê©Ð‹Çà7[óÉ/)H_~Ïžûd§†q­ÎÉœrâ‡Ï9sC%‚#›QäÔ2‘3ÇjC'žák­öõµ'>äîlÀÔ¼vÿ°h /sv̳ŠË™^ô“–‰K>=P½¾5<ŒêŸó¥},îŠV‚¶iÜL ÛëÍ/§1c£¯˜U]f7mUð& ß]X Ï€9[g‰(ÞN÷‘ ÿzˆ;ì%7_ÝKD¾óëùí·ÃÜã<”M»OR)1%ÐÁ6YϘ˜©³vÛðlý¿†ëL û“÷ÿdžÓÙ˜¼ÿ?.0œþÈþÃäýïqáôŸ@ö&ï £?uÙ˜¤ÿ¸ÀpúO û“÷ÿdžÓÙ˜¼ÿ;.0œþÈþÃäýÿqŸéÿÝÕ änÊÑÑåöÍÛÌß-cŒû Ù•¿ùÿÃá0SPfòþ÷øÀŸÿ?_Bl©èÊqû‡0çÜ^õ¢N:œtøq8G‚Ñ,]éß}ˆ¯Î¦|¾Þžt„+݃A÷Dü™zg€ÁÍË…ãÐwó!€Pb5 '-þïýÁÒ{ÝËwðã÷*Ñ=~5ÒÿÍ5KK+¿Xê ‚ꪈøfe^Ö‘vn7°wyûÐ9žù5àÈ9ÀwWZò,u7'EWy–º†'”ƒèÏ™~Þ,õ¯Ž·_ÆŒ=zU1èæ/¨;;::ù9ƒ´øÉíw·iœHƒq]§ýЧŽä¯XÐè :È5^ÔõÎIÙ~Ãj`" *8ØÑ}´~1¾Q¢ô‘fZGG¨Æƒ–ù¿ßG€Ó'…Òá7…9‚!_ÍøCVú¿˯~þêç`¤DúOÞ*ñ z¨‘r°¾®hЄ®óB#;ˆ)H´*‰F©"±8e$8¡CêwÅ(+ÑP?ÒËÃÛeŒÜ±ªÊœÜñ(ü˜¹ã9÷‹Y›cd‹Ç+#ñ\r"ü™‚#4ã+ù-!ÿ›ƒ÷uõðE¸ºQ]9ÓAsƒòóXYR†Þ†÷›ïÎQy‚J_ÀÈ<òÝß` (Õßá¡t#ÑÍYùgLGoa TÁ!±4H?ô¨tÃrì üœ;•Á-FÊG™?•3 þÜÎ?zº‰³¡Ûó*H,‹ÅÔQË@ƒä¤ýRå»ñ‡1+„T‘h ²%ø?ziPwý¥Å¾;Š«éPXÈŒ¶µ$:اp¿”Dsót»08°BÊÊ`3Ž^!Ȩȯ]ÁÙ€œYÁ£Æ¢Få—b܆ WŒM#U° ÈN ‰ƒ#À–S¥üžëƬ‰Ã€cž2‰Ã>æA“ý¯5tÜõGŒ€PFÀ£F/Hì§¿.¾ÚSùƒ–ù `À>«23àœGÇ(­Šå‹UE*£€ßì?»j)…qn.C|÷×<øÉ ¿ñÖÌ¢8ÂßC6•îáÁ Ðh ¨÷íÝ—A¡~}‡@à Á×Jƒ?>ß>e@Q½À1U†#žh¸båeH:Ÿ—dP`ò¤{’YtOCº3ØF^Þàl6äì‡ã›Háÿõ•åÍò:(üfúKVæÃ“9y³XÞž?.{~‘ÑTÀþj-f¸$ûµI‡·¿Õç— ¢4•S­Є" "©eàíAóEx{ó1”õ× ¤“Nu?ˆßŠÄÏ\1:Þ¿—9Ô™ÐÔø÷ÿeL}¼ýÝ~^}[ŽA˜?©Â_#Ïoú—ž—Ÿ'´ö‡ðùg;ÌùŸ¦êØûx²ÈÃ6ØX†öfÝæ"8ëAt¾"夥kb¬O&9Zš¬Ô3v4  õÌ5”œ´šÄÐgC‚…%äÎÓIËÜÔòר_ƒˆæ£õ, dÃbüŠ–…ž±…Ɉ9ò!˜ll­glibn7R‚¥®Ñä7Õ‚±±•±.™`92ND²y¤0}«‘ÆêBÒ©iGl"Á’0vŒË‘`®7j¸>YÏøÇ¨ÙXG©Ê°† 10ž QϬĨ->J&¿"7H#= K]‚…Þè„#Š ‡¤cF°0±2×ÕûkH2 ÁjÅ1 0„˜x´¸ƒE 6ýSùž—+Å‹J÷¤ƒb4$ ù²(^4ŠmpÞÇsoOÉ‚ .‡Àq \)þt„ AAx¸±X¤¾Ð)¾n`p€+8UûBqGØSDü<Ž+qÄ-hƒÎG뛟Çï3gè‡p"ç8ñAÔ}ÜPŽœ±ÿ¿y»nP¤¥y€Ó˜'(P²´4hà°·ø±\½}Ô zk(AŸh4-C{„ D÷àìÙ}›Z=Á†ay«y€áœà圳ÅA)¬¸ ]Ñ‹’z¬œý4–:,¢Íã·ÈYƒIÁvŽJ3F2"…Ežr™ùCΦ ÃÇÛŇâ Iz47_–›“´‡ïæÅ¡š«7Ú ¡°  póð@8Ñ¡g?$Œ‰°![˜XY"Æv‚¹9ÁØÒNŒ 6'J׊œ|Ü<n`¶Šk=ÄøFzæº`?³$è É–vÐî>ÙÒXÏ¡obŽ L æ–d]+C‚9ÂÔÊÜÔÄBOa9´t@€½æòà²ìTƒÀ2ü¼ÀuØ[t,ˆƒ.F‡‚t:]oÆzˆ1dckN° ƒîe`JþÞ ®õ†¤.°sãð5ÝÇÓWñvnª¢†ÇM:700üüwâØÿŸôÿ7>0œþÇÿç¤þÿøÀpúO û“úÿãÃé?îLêÿ üLÿïûFC'HŽŽ5íC l ý/õ]ÿ «Œ‚‚¼€¨Lêü÷é ñ%å«‘÷I%°I%°  6&[þVì+œµð`JÄ׌®/ÈÂ.jcîý±3„á[GÃÂÿ¾º×?«Å…W¢¡ÔÔÌø½ò–mD¥­¿Z,ê§b¿©OŒP4uÈÇ¿«3ö3ÛŒª$DW¢)cG¢ÿTIèçbÿ\Mè·){tQ¢aU!åèz<($­Œä8aÁ®Œ¢¢DSUþ-ÅFÕDª 1(«‚Bb°£+ˆüzpx•AM5,jLM5ȃʬ6½kýX¨b 54n¸ÎÚ?¡f§ 8ÈòÑ?§f§Šƒ4>Àœ9N}þSzv`¢£ÆèBAÙîçÞð—4îFJ<q£ŠçchÃ@œ¯‚Äa1Hìÿ§>§ QêÉ#ùç3|ôO*y¿’dRïæß× øG$„êP÷›Ð3tnæå‚ “|£íñÇÕø3•ÿ‡£Â &Ïý/¢'Ïÿ7ÏQ*“çÿ1¾ÿ7ì¿LÚNÿ dÿeÒþøÀ0úÓ&ý—Iú §ÿ²ÿ2iÿc\`8ý'ý—IûãÃé?qì¿Lê §ÿÒÿ›ÔÿNÿ ¤ÿ7©ÿ5.0œþHÿoRÿk\`8ý'þßäþϸÀpúO ý¿Éõÿ¸ÀpúO ý¿Éõÿ¸À0úÓ'Ðþß$ýdžÓíÿMîÿŒ §ÿÄÙÿ›ÜÿNÿ ´ÿ7¹ÿ3.0œþhÿorÿg\`ý)”ÿ$ý•qX“ÆMjëÙDO~‰szåÓY¦­*ð˜ZSh\+|øw ΤĶmê‹9³ÿKÄÉ­${ÏîÒ&šŠ-ÜÀ%Rv óU:È_ö|wJcizt@î4ž'´‡g71|ì·]>™õÃz¯Š‰x›Xɸýáø±˜'G:JsÜÛɘÃF.¬P8L152e6Žõ1”.þÜTÒjÉa]“°‹¢pØ’SÚŒ*ëní¦[e}ßn‹ØÎžá ° -¤ûDñÀµ&°YÌ¥˜»‰›+4çñô—µm(¸Ë&—×9> Ý$.ðáb5 ¯Qûù!‹UµuË}`c´EUú M&ÑsG¿èE‹P“ॸüE°&±Å‚¡èê•k…èμ†;&s×°å,ãuûåÇá:ާ÷—‘›x_¿2=òND£fqÓµÝ×ÚàIdÖà,ûŽÜ£pYÁ3Ô'Öþ똴DšÏøÔiÂ‡ÅØVŸ˜±uM êžj¯žUݲµ’¸)—·°(ª¡ŸÏÓ¸·>‹‡è u›g`61“¡ºî¢™­¼’‡óÄCýÙzÔà¶ø›vÞØuoLûöÞÎå=Ʊ§Q#Rt÷|~ÛãT ÜðyˆPö»!Œ­áaš¢zÁ\N§¦¾EÄóÏÚëöç÷QLÊ£Ö»«Oã7Ý],p‰oC½ƒß–Îåf‡X‰LO$ˆ7+kФò]®•ü¼xÿjŢ쪉ѩy<Þ ŠŠŠL ?dXmãjVx#º¤)`öÑ×5]5`w\ÚË;S»ùÓ#õʲã˜Ë?3°,ò^Ó—¿¹~ê¦rŸ‚áo]Ù»¥èð‚®»­…omQZù ÆÅÀa5j\‘²}W)¹VóE¡eëÒ•½w…:¬"`—Ê?f.½ÞÌ›s"iE…Qbm¢ ü†ãÍíŸ6Í„ŸÁÝ©,^ð¶ælÑ“¦¬â¹Û¼—„R¯ 9¤”,y.…ìe{½œ~úi†8|Ÿ‰LÝT Á`dõ¢Gü‘N¶Êý*¡ê+Ô¶ríYbצ1ðUyoŽ–'½ eOÚU.tû±zÉ“%\ÎþKÔe×5o’¿ÓÁ×ÍC™õb/<°LgY wé„™9Æb‰‹ºj©úA¹}¾M8ãþ£ÑÕ£ÏƸú¼ÒXÕrQ¨ôLºÑóä Xa“F¬‹+êPè§>Iã&­›üç¦(åqço1|Fˆ¿±VŠžŸã¼qçNHI–9ßÝ’†L•ÛêCv7&“ã¶½Ig Ó½ñsx̼#¶—ZEµªCŽÜ]Qjv¾™|ì°HZÔ¡¸êÑ,OuBF'p,ärQÍ’R´Î†y{Rëã|BŸ."ˆšÌX¥>|Áö²ê¹g‚R:D®ÀÅÑ^)Q™ÿÇÞ•ÇCµ¿ÿÙ£P(„(»YÍŒŠ-õµ‡ÄeiÌ”LHHˆ¢$!K%Œ$KÙ ÙBÝB²&»›­lÙ…~£ºÝ;Ý^·î½¿;|ïwÞÿœ1gæ˜y½Ïû3Ïyžçýž4¬áƒÑÓæÆ))ˆà~ö¹-VÝ'æJ­Viòb8‹ß^šº`$/ÈæÅ"€8URr¾r_–öR«Pâ¨C2×KñjPå°_Ô³²R’™J/.®Ã»È\ߘ²Ë5/ k*¢H¹S4ç?¯¶`SލÈôèJ¿«^, s?Z+mZïP‘gt7±0¼ë¹â­X§.¢:ß’||x8»îƆ€úýõ“‚«4¯3Ò9–’SƱ7wòßrDVÛøA•6ãQ×zYŽlM¡(ƒó¾RÍâ0+†Å>jú2â.bÏ7°%Îi„3äì5‡¨E{ðV3‘0LÔ¨™?bjقك氬JÜŸ4qà*þ®Q–f…‡^hÎzX" (`í•À÷wíƒ<`kØ +ðÝUû*u`$)Îõ:ŸÃö˜5š)Ù†-Øÿ–“>#W«q¢a²ª¸pñõÐÌT˜Sc‡ù@ùóuÇ2‹ŠCmUÚ³4™Ÿ ‘$6˰Ir! n³x–ç„ «öÛÀ´0jW®; ×Ó`ãR^x“T«Äwß×ðéå¹ãí%µ¯ˆÌµŠ»ƒnŠ(vz;4w˜W¥q p76ÀjíBU¸Íè=°(Þy¿ýF(ðhï5ëi–¨ÇÌê¶öŒÍhŽ$•›«ÕUùƒL×¼/zåsW„sFÜ}N:A†^«·çlö{ž-áà‹†›n%p;Úßò8BË}lÉ1L– LÖæ¦Kä¿ÿß¾¸ö) ž­§Lh)Ä×Rß³+MõàéoÆÿ”õŸÔÿKëÿ¤ (¯ÿmV ÿH0­ÿ“* Ôÿ êÿ¦ñOPê³Üõ_(YúùGÒÖªàkþíq‡±Gí]¬¬>Ná²²‚ þjÕ÷Wü‰úïgþPÚý¿©(Ò ƒ2! EÙA!v¶`¸LA©€\îÏGÃ?‹Ñÿ_«úþŠïê©ð•þ‘`(­þC|«þûÇw;FÉÂ(Dÿ×EÿWðúÿ‹Uß_ñ=ý+  ¿Ó?ŒöûOü¾þ ZJI}¬ÿÛÄé‘7BŸë¿×®]+**úTùݼy³••UGGècåw¯²ÖR®é·•_:Å¥ÊïîÀ¡†ú¾`PçB Ö=îÞÈ7_^ã>·Ï8Ó!â[$G:æúAf6« büPOÏd!=ŒoÓ=­gÕpöZµ¢í,Eb»â¶¨O¼c¾Øõs{õü´ú•ž[óª‚øÎ,Ht†½…î¹å't ¾¨ÏH7èW>uR$*:sáÑùÓt[CKòyüÌ“n´zäGnÞ Ñ¬q,n˜S8=,¼å(1bµ¹Ü¿p­Nª‰Ÿ}€ùd„‘æÎUê>eAw÷'›W8È¢úýt·ˆä¯á«¼m2ç=ÝɤÓmˆ×—Çë0å‚o'1v\[Ï#ìá74y´‰Õnøý­zO‰ùœžªè§—ØDƒl{Òd._·£ÛsyØÝÂvWãÃ=r±yÁ.î ',,÷C˜¾ûÛ ¼þ_Aþ_šÿ“* \ÿmW ÿH0ÍÿGPêù¿iüS”ü¯ ÿ7ÍÿAP®ÿØ•Â?LãŸ* äßnÅð¡ù© þíVÐüšþ©JþWÎüšÿŸ: äÍ ùÿ©JþWÐüšÿŸ* äÍ õPüÛ,ëüZÿß2€Rÿ+¨ÿ—Æ?U@Éÿ êÿ¤Õ¨ÊõõÓø§ (ù_Öþ_Zýo@¹þ¯ ú?ª€Rÿ+¨þOËÿR”ú_Öú?A’Ï$-ÿOE|Íÿ×ýŸ ßþñ£þßð¯€@Òú?©€€Ø!À¶6k¨5ƒE (, ƒ#PkkÚü¿9~@ÿ×þñ}ý+À¿Ö¿NÓ?5ð-ÿ„|2 ?ù?0†öG°Ÿl€ ¬ @s}ü»ð}ýÿmûÇ÷çB ¿×?ÍÿE|Ãÿ¡ úÅÿÑËúœ¼ùìÿ ‘H_, _&ÿyyy>Z@äÌÛ·‚(-  +K cªÎ~ÏÈ/Õa« ˜-ÉaƒÊ1ÿ()½ë•â,)û7*#\V[oаÉÜdÔô“áŔljaRJRùÆØ=e))âõkâ*ºíÏ‘ätÖ<)MJ9a´vWCª‘‰ž%vktÊ­µÄFêªñüçÌÖ=¶»³½_“åA£¼Öl';©K)‰QuWýØÎ§ˆ¬'¸E 󱤀¤xÆæÓŒ—¦þÃöŠïé¹\ñ?MÿT€´V€@!0C!`P0 ƒÀ±p @ÀÔr>þYü€þÿñøùþ4ýSߊÿ­É'æSü¿Küb߉Ã9Ça°G°8—_/  `(íšà¿ß×ÿ?ÿ“åüZÿHÚüêàñÿ Ð/ñ?Ü•o5èkÿ79æ'ÇÿŸÌß_‚ÿùˆ} ¯üßMKÁ¿©ßÐ=ýÒký8Ot±C^K@‚4!ëѾ !ñm÷eiš¿­ mÄïÀòïÄKžyäÍD¼ª×ÞöDIÿQííYî#Âÿâƒpy~H‚¨xþpåEv{n-wa·p®²bn+ù⇳Aý x¿ •¸— ±Wî½µ5W­pÔº¹žë î—LµÛ0¤Ú6¬t©oÌEXtËM[÷£JõØùá«äÙ/Œ]ÎVÆŽFou¾¼Íl¢ÂÛõµÈNÇBœìÀ°Å;óÊ8Ò9¸Ù”pIÙÑÄ“(2?ʘÊYY~¿xMÌgµg²ûég¾}A î\Ú®],l,mÜAzbëêåxíAn^v&bÛ9£FÏ Æ€œãŽ^êëßUܦ¬eǪˆí˜³£>Ö`Y­VtE\ë=¶O¤–…Gy_»k²;r@W'K°²ÊsC晫ÈáÅhÖVå<—Dõ»³W‘üŠÉnã§D,Ðâï¶’…0QcâŸÞ&„›ßC¨HÏÎ W:ÞÆ=c×ÜàË-RwÇ1‹çwìL`Ü*YñÞ¥,c’ãÌÒâµPzvHôñŽN¸Œ@¯‚Óµ|^aGÞ\¼ZX]gÌбj+{KˆÀ©]¾½æ}Ì=hˆHÈ_‹äG·ª@.ÝN¿ï8‡¾™w’|oôòaBôÊôÙY¼9áGîš…Ú&è˜l$Ê©Mˆ¬Ýt…=ûÌpï_íç4÷33=_‹y Ö—UàÂúçkò/eß,p•ß÷8)ké讂 §„û2Z2M}š4Ïøš] äO‰32ãœôÛÇsÞÜœy’sóµÉª4÷)Ç'tþ Þ±è0¿ÑaËççÂD¦ty¶[U°>ƒ/}ßsÝ[¤ \Êpo€¶ ió‡¬O[ºª éÛ÷L-nØLVÆ6(Ý&ªãMSÛ£‚ò™NsÕÖ–´Ö –”ÇètÈ ì‚®DxEº,mdpŽXËlrM¼Ö¦Hå—é7PùèýÃX9©yÉßß²rXmý„¥¯ñq¿q ]wCdËùB'¹*%m™Jà^ˆwyæ`9¬´À ¯_ÓUõ}³qú`›ä UÿH¦÷@9mèŒðº¾O0ÁÜŠÞaئóš ¯!šXLN^M«ðºn;s´‚ĦɉæÞt+.RÉdýÃwèͮܠMn±fÏÖ—ã±½›ÍZWŒôÔª^§©‰¨çµ3ijv”e³öòå-sÿ"šø–°E§M!†v]kýÄ€G¢0æaÛi&BÐ+œý(u‡¨×²–fö´» Ã=>1LsãN>=Âçì¶Ã¥**ö ¢aÆ?BÃ>ad¦yhe}B‰t…Oó‚…×**›}y¯×Þ-DÉmòvÃV3hœaVì¿Hû½]~ÌÎ"´;)Ò7øL)#9a! „ž‰ÉÞ6 IØû xÎ!EÉ… V%xÔø )@Ôr±RBÓ¾_Ø‚ñ‰T2^¨¿¡Ô“³{½ï–4&¬¦hb‹6õK¢ÚÕ¸³^=1t6¶D?"s¤ITòÕ¹µãpßµ¤ûÀ½qÜõf!¯÷š¥´%ë^—;[­‰ö –%Ò±ÙÎd&6'ÇKÕñ¥Òú¿§ßOP£†ð²³—ø­iØ·èÖȃ"Æà–­»>Œhhc8ÐF<×â;ö® 3帩g¯£Zªqi÷qÕ 3è4É+Ñ®`yÑ–^Íì©I5õOšÍ™-[žE±ó!¸;eë›N¢]M6ëQ`éiE2Ùtà‰a”Û˸֭ˆ4Îß@†ßr{Osâ_§\j}×xW2< …ÿ y«±ÄÊTEXaý¹mk´¡ RÑ¿_F‘™AßUÜ~5ïã*÷Nü÷"ºa0d÷Å»ïXMú”?‡I˪;ôwVJýúØò±©§üv’éEL·eº2Rõ9½’¥A óÓ‡ï%UлǦ¢'5ûòOUKócã_›„šóN7¢4}ÚXR-0ÕÜž_¡W[ä}Šä°ªô”û‚px­0oa“Ñþˆ§›DÏZÞléW}NŠz™Ôr‡¿,Àèxf¸+OHíÇ™½¥ð{K¥„unß,1ûþý‡;Ž?EÈã}ßtKí(~ý`Áüv`ã¸Q‘Üu.=àY‹^hL3ý»ï®ký B-hNž>ãáH«Rôl'q&1†S`‡Â¬;™‹+Ï9PBQ××bò60¡Ot=x6›eОќùOâÌú*ðéõ¸«ÌÛ;ÅLeQ·´6ƒ&îm žŽù7«|uÍ_†£±—˜l—úKÇ(Ú?çʰd|’V°Ÿf‰Qa6ŠšY¾a±eîH›Qzøëµ}º¬VŒfÅÜ>$é!<œMžZ~£1®˜ÃÎê¿üÌ'Å>W¯W¸)`Lu×6i¿œ|–tÄifmÝH÷bìæ c|Ka½?{™à›þ†ª‘š%Ãg b”7W×:èC¾W8P2º·…J¢,˜¨…^ ¾½Þ3«ìòc1À샩kÝSNsì­íôM¸RAë»´´+jJž|’‰IêÑ&ìΟ×Êš#µ–tAƒÛê?»( üÕßaølJØ4³2MH¦?ýdW;È÷MqˆÔìæId 9²Ô߆ˆ½ˆ[â¿:kã oÕåû›HkF‰…—ÛÉÑRŠa/•oí-Èž¶.’úö¸)ÂlÆNsF¹9­öé^Kü-7 ¢ˆÄÀçdq9$ƒôt2h²wîEº½Ðַަ>«ùlRà‡eJ]xMV/öÜ2L¤—á¬1ÉAÓK´Ÿ¶*¹¿ª‚C„Óƒ®•/ÖK³¿cŸ±Í×$aÏkíu¯~Ð,ö¶Ò†¢š‚Ô'Ç-yiÍìɉ@wsÇVcn~æ4ÐBfÞjiˤ4Û4“щmIÐe[á¶Ü4Ã>êþËKZ_ÿFå<>öáÆVx8öpÄe²â6¸ŒÆœ¿ÍK©R¹|«08¨‘Å0¾€ÑBÞGØ)ÛÚ>nSR͈)bt;úÑ@f¯ÏYâiƒ<çÔwÃ1èŽ"} æ·þkÁ;ï Áê#ÖÀ; ؽ=×ìÕðä/ÆÐá%¯Ô*öØ~¤cB˜ØV§¤5uÍrد•‰ý’^ûÅÈ%åJ¼a7†ºÒpwåp²ð&¤søSÅ[(H¶ÚÀ/v´ÕÔkÛŒ^»½GíÎ:eñvÔû- Œ8€t£GokÖÔN}ˆÃO¸K»2i#³UöÐ޸á¬ÒÚ {÷zŽb‘¸´ù˜bR&ó…Çè¥Tïxñ@—wø,ñ%õÙ*ënÞý({¹ºB}L ¢Ö­2ñø>޽›£¸i7l3w™üy=ÙÞtCGJ @B,°o.¸X «.\è‹™–H2—ƒ& Ö1ú rV†éŒ=ê¨R ’¢ wš©wýÀ¹]k€„\Íæ$„ ÍñòÐ6îªðˆ±°Ç’z$["æ.[_9¶†_7–«\(<\jþù'蓬Z©6€Œ‘NÉæ®K¢)Ç ®Ï÷x±L€‚k~6Ž$0IüV½Ý:„wšÚSŒñ‡ ®Åõ–úŒÊüçËØhcˆŸfýX.î£Mö)ÑÅxh¼XŸÀØ–Á¦9‰gke Éu{)â®°85Ä»‹ãŸX•5ýÉ^·Ù‘E¬Ç#å\Þçó œÎ4þ-ÂR~ø9Š¡´í# >?L»¶–UŸÕ…ÜU%£Ú’wì‰ÛÆa¤Ù¼¿1\"{§Å0N4Ï$á_ñ‡2—‘žã”±µrÅR즋0Ã4RÉå]ÌÎö#1']f˜ …Žp߃å zêË_Þz@Íì‹&5&ÝÅG„øÞÁÖ+3…™™b2nR þžˆËF™'Ì'° Ðï$ؤž¾kŸ„!S[ÄÝ. ¿ƒ£‚+‹ÅJæé`踻`B<§·é¨§ã®ž‹üÞq=“´¶­÷á{5ðj{™äat¶©Un áÏHå¶geQÜ[dY’G7ºøIÄJ•´ìZÐúLä•Jv9ôn_¥Ó¤röøîx®¢1Źâ¤åtEˆò|)^]ªVëR3æºz­n$s%™ŒKËj=Aý¦Êà—#Ü•õ=f®Ü|9}Ž©ÿí¡D·…¬]xžF(ÆUŸ#ß‚»¾ù^GÐ ®°z÷Á˜Úæ½Ãò—û¦´}ÈKKÒï™,™XÂóBP‚lç€Ðí§• ’’‘×üíÕŠÛ±Zl* #0ˆÆjú×üÈÁÜK¨˜ÄÞÈH"fï`ÊÅJ [δ7ú¡h(“W<”ˆ1l+„šm¯£]ýHíìÝ_+‘šú:ܶY˜Rö\îÈØ¯“×XX!±Òöc ^³áµY]’ð‘éõ–BÏVþÏ¢@†Ðñ7TmÜÁz9ι‹~’|õRnx¡‰3ã®w ¾[dCd¸Cë·>‹{Ã]!àéÁ¬nI˜1Lé³è-K‚hÿY­ ìÝV™È]Ž,ôÕªrÕ²ÏØ²Žô…,ˆ‘ [Í'ïŠMçéÖ&#¼Š.€ÛhtÝQ“\_Õ5N••íñÎÙÓii·5‡ïšþ[¼¶¦tÎÎ'œéùkæl)¯å™?Ï9ƃ‘D¼âÅÙDÅ%Ð!šÜUÛþûßÕºa2¥ Z VnUMk½³F†:½€½ó/’W‚m?-ÜMßý{ÐÝ;j7_?3Òž8ùb¼élb~5ïÊo8jòáë²™[ç³NdÊž¤+˜œ¤2†NgˆmòMáG oËhàæ=\;ˆ;ެ[2¾v'ò¡ûw)r «ßr;Ü3|ËÖâJ,ýO+‚¡ u\îùò ¶ÅàŠIJ1÷dõ¬'~|~|`±A^|é1ݽ ö¶ÎÓĈ(Ú]ݱB©ª6uUÝžo¤²÷ë™eÍŸ¢©ô+¸=º:×Høß…½!aWhÿ³0ù—…‹ßÈ"@Jþ¾’Þ¥òzªYÁP7Üo6`˜ºï8Láž+"%@öÇL€ŠÑ_P í-Oš‹§"EJ>!µ"Z-"UçCfy½ÿÇúèÏe£pGýŸ·>x—ܯ?%hÈ:Hg¨á!%¯Ï VE³A€"è“öšìÖÄßC¨®ñhø0ìô3þ\‡?Äg©“"€ýÈÃS~såE QÛ˜žy\¥::è¦(Ù½7ÑûU"R@¾PlÇŽp  bíI…íØÒmù%ËùégÇ&{àOÑê*»t¦½p<»Ñm…Èq‚qÿ077O*¥ãAdÖ…kŸ »bDÐáÓÛ3[!‡æYo9›UqØBö÷ã°Çû)XH>E³ ?:zÙD|5ô0ÔZ“½‚U®Ë*Dà(ì·}uú;?ÄZg¹âÃÊíaª Ò¼uøÖ›7ð*ç$kBv* †‹z¶þ”HÖòFð_‹ømýê*ž6ë5JÁI¢±E¶.]\MO¤ÍÚËc»ß(L¥ö ‡y5Ú(¿»BJWògLÒf;9©çM÷Iãy¹í—nöE°k¶½jéÒlsŒð+I³§ªiˆuJémØgåÌ mÇ¢ªJÒ}/zËy¶cÛË›[¨7WE&Óòi¶ þ#LYšÀÿF¸¶Lµ]MÒ*m6rf>m¶¬):"%ž*:¢4Je{4&…YÄÇC³‘™®º ≮Q1óá^Öw`©ñÆÑ©©ñ‹|Và/PsðŒé¾ŸÛóŒJ}J^7Cˆ¶å'Û [²e’µóµ´Ao­rÇjâøÆHhõã"‹6¸)¨3ä‘ß4ƒ]oº £&*7BÂS±Y´Â«gþ¤ÔäjH1ú<ã½ð/–è¯ë0hVz™5ÒNSí)«äzE[{æ‡?x*˜çÛzuqžøø?R7­7 Œüˆ˜[x7a:-¼­ÉW#kgÅzÓG…`16#r”_Kgþrõ¸ôd°~h1¶en¸ž¥%KZŸŒÓníPØÄvéÞ‘’Ÿ}5lcß<ëí›'ˆ‘V=m:ÈÝÙþw™ÇÌÐîE»\‰YÂtÝÞ;/oöö;ª’ ?[3· Ë Tøñ7tÜ6²VlØ ã}]|Ô×8|T~ðÝxŒpU!ÛrjûÒkÜÐ>ltI„UÝ’¯Øk@«žÆ=ã¬}ÞqLd›%û׈¡¢çšñͺ¬ÉÉ;Ñ„:˜¨ [œÞ4ç:%ª\Ú½mÊÇ¿z{% שô¤" FT€šLTv¸éòw‰O”ª5Ÿ åü[ÇãÉ&ùq£Cöà-Ô:Ql拇¨I ‰¯Òƒå±×#W25Wdòã—vÇ¿c—Ä./b#´ð‡a[M6Zû²FÕºr!0ìcПŠMw.ÃsQðѾ¼ZtüDPN“c]0úÓÙþKÕtάIÌ'_«âp»ÜZ<9Á“ìüZ:§?#{ÖÄ]BXÖr lš‹ÓoãÞI_t]'_=©.ø Ó°]n”S‘5o²ðeõ$ª6ã$Ê•'²lú$¨&µ¢'µ7^Äš`ɰ£´]¯Ó6”½o3è¤Úi¬ùA‘Ïv»ÔWÛµ“>ö‡ö,\Ÿn¥íÃOe¶`° b@_¨ÁÆ'¼öåû^ç×pzû(Ï©voíÆ¹¸üB§×›d»“š[”VTÇ$bgÐä¢-»-Šú0ŒÉbüKv±Õ«mò…å[‚Œ‹®ÉoÊcU7_dÕLϽ(^±àí^‹/4w×…÷™í0jÛ}ô’ËØï:»Ü²¦¬¾µÙY<šý Œxõqùù£ÕÏŽª<¤üñ]Zï&M§ÌßuO˜ùôûûç$|0„÷ Å8MI[Iж8#ްQIf¯GêâÓ¦Sì6ãçÝ}šöDFSÃî ^ÚN^M^Ú¢ÝÈ]éMW‹öFïg>mô©¤¯z´r¤ Õ ;2q£C5åEÔî ðQ¸® HéÕÜ*c½ö¨ÔäÀënŠú-2Kÿ°³[ÅxbL ”Še€))”èÐäøÐšØ`‘8ˆu˜v3€%5ÕH¯æÑÇ{ y«vÉ@ª<^·uÞ^•©¿ ÔõÆz6+IÄÒŽLùÕAU ¬¾˜Ue1Ê2`†ìÊcÒŽáË*ؽէ ;Ü‚ÖRÆÖÞ läÜ­7]F8Œ{uäéJòýÎÀ¼1)Ì­Ì*É.¯7Zçú3åVqVƯ“³ÿ‚ŒãÄ” Kˆb³y¼VU£ eø)>9?ªÇšBήã2¯è墵ô÷¯³W¸cÀ̸“ñšÑ®—i™í$]ͬ{¿::ÄVOJk>ÅÜ`Š¢d=î·ÄÝ ™lüFZwõ)¬Å?ë*ö0é:þÎŒ}åè²óOx D}ü%ë9þ/éÓßÿŸ£ý.ü¿Ï§ø7>Gþ¿þg‚ÓüŸ#ÿÏ ÿ¿3ÁiþÏ‘ÿç…ÿÛ™à4ÿçÇÿñbÿ§³ÁiþÏÏþoúïlpšÿs¤ÿ/ö9œâÿÕ9ÒÿúïLpšÿs¤ÿ/ôß™à4ÿçGÿ_迳ÁiþÏ‘þ¿Ðg‚ÓüŸ#ý¡ÿΧù?Gúÿbÿ¿3Á)þMΑþ¿Ðg‚ÓüŸý¡ÿΧù?GúÿBÿ NóŽôÿ…þ;œæÿéÿ ýw&8Íÿ9Òÿþog‚ÓþçGÿ_迳ÁiþÏ‘þ¿Ðg‚ÓüŸ#ý¡ÿΧù?GúÿBÿ NóŽôÿ…þ;œæÿUÿÿíÿ',ü÷ß/>ÿÏÿÌÿêÿ(ogëðÚÎÚÀàôî ÿ®ô1Áÿ¶ÿó1ÿB"Âþ¯gqAC@ nbd,`,*f$`KŒ€‚¯Œ_ýoïÿ³øïÍÿÏúÿ6ÿ…þùó_HDäXÿ_Ìÿÿyüÿú? ÿÃÿYäÿÙÿYPüÄÿYøÂÿùà¿5ÿÿMèÿzþ ŠŠ ‰üËü¹ØÿëLðŸø?w_º„stâÿ¼tek{àýgÿg$))ù_¸@ÿ °3¼tÚšIë.Ð-NC¾ÔpÎðš[ÙšÙšó“îóIk0ZŒná"»¿4˜Hä=×o¾Ey·©ß6Fÿ#kUõ÷¶›r^?„›Q%D¬AûT—ª´ºraÏSg–B¢ÅØ!³ÞŽòþ«í·>ßPs=¨òwÌ!v®‘áˆ04ȪS’ŒLp;ºý@yæËŒJ¯¡/ÇR†#Ë{ö9<Üß1á ÿ¢r³ÃSd–ÏÀωÇç-ÕÿÎu¥l–ý¾bÖ*j;y…ÞÔzð gÖóèÕ†ü\Dš ©×û5ÜÖXÃÖaØ÷¶”¯$‘Þõj•Žë4¦­ÓhÝBbã"©Ž!†"fL­^Ï ‰ßc7Zcñ¸<ŸÀö&ßå^âŽ÷Ç^Ök5Ìnª=õ°ç›Ht³øƒª¥²ÛÏæ§qåyÇÁ ²déß4’-ŸŸI‡e«'°YÒòFâ—‚y÷ÉGc³Œ?•ðPwsôpÙùC²®Q-2"S÷Ô“»®+).ùs¸…$ò¸H‘þ‰&.úº=.ßÉ•÷ cÞ?‡ “œgS̼ÆÖXp4â8ƒKÕç€æÙþ6/P´îðé#¾{÷Þíé0 ‡¾ëT–—X ÁáñœÄ‚©{§ØüÚ´_F ‚¨´¼À«ŸËÞ§< §zÀæ%/ot½­và$Gäâ~íË8sšìkJÒî^•íRNŠŒI5\‚vZ>ÕZ2Ê,ë8 ëÖŸ½+Ò½C ‡„Gîb«* ÎŽ·»“è* Ô­Núçº ¤£*Çe£Î¾–‚ü'Óxï–ªùÓõ‘ÀXiß ¸ñt[¦ÈÒ*r%°§÷f<Ïyžc‰Ì–Ìí†jY4«Šc<@ ÷ð€©º2KðÔ>šJ[ˆöéq<)å½²ô«üW¶îÚ@Ê Éâ ]†Ï9ŸL}ÿÀxPI¡‰¦žda¦ÊëCÍ˸,N%yW¶Ïõa–KÓ¤9“µðGÑ¾Æ ½-¿Ìî…™Úw›Z_i‡™–šÊtÏš}Ó…Ëë€ ¡ôð¸MK§F”㇤.G6Èá²\šÿãhUãgµ¡è”Äò'ÜÄEâ>Ѿ¢}»>]M™GãÁuqlM3&8BöƒD•(’)zlæÑµD€`µ`Œ™}÷`Ò}wf麫šÕöhOÈ)ÀJ°C­ ýô™x-€nŸ-ÑËýb³H+Q[V–^q½`™á“˜#ó‘¾sCÛ?ù‚®ýƒ|½y7|ï“_-1Ûø(ì)¨t𠣇ô~¡ÐJÇr@HríÏóÊ˺e7ªnñ/Y¥we»&ɰ¦®@Lîp/_1&Å6öŽ]ü:SrÓz¢h’˜ˆ¢ÐÇ`ûhæë$„ßG ±ò¯ãÀýl«]ëµòò¿š£ ½Z[™H§ðEUµ}]™ãÚwOËé«Ô»ž µ¾j]¶ë¦N2i—«³£)wv·òËê„kMáFfÄb§+4¢çàö†ºÜ |üàÁ:ÑׇãªrÜq±_G).§þÖÜ]„xÂSÀ„‰¯ÌZø+“äÜš^põ@n:õmqudÂóG_H2ÜàBJ!Š–HçÆ£E÷(eކóSÿ]úÇ 6ñN(‚HÉ–rOÚC\±âl\&¨*Û5^¿3¯Eжø;SJœ=½Y#y*ÿm½µå°õ¦”Dµ|¿ñ˜‡oûʹÈïºGm.\B%‘DÖq\"&æ’>°Üp|ÉÜl}R].q/g¸ã£ÔsC¹”iXŽ@•¾ûˆíü;_WG°!Ž8´¨½z!‘ÐÇ¢­ŒüºÈê8¶ø+®1™ŽŽN !eõω£Õ®"ðM"•ŽªêêÆ«¾Yeš‘ ‚9š¤Üœöj¯Æ«Ûe#í•ZµgàÑö’« ”]Ã’ç® ¢¹. ‚¬óQÏháÁû–ù½·ù[&8j¼,[¿>äß®>&*]…5ýÞFs¹R!§FEÿ¬üÛÄ?Û9ª×Šúh†‰·kÙƒS d Ý•^õ–»tY€ Á/s¸ä ²¹Rd ‚þCÇ«É3l7غþ_XðÓ\3HܾgFWdö@Û4M`IþLQ¾4ì…Ü3Ë‹6žÌ®Þ ÷Ul š¥1õU\†(ì<9hÆ ÿHCoS§âÛÚYš]D øÊ—Ïo°}µQ7ÑÆ N¤™(…?4ÿ~\‘½ò~­š÷VLW«û‡‚ûC0UÏ—RÜϾºhÏÌ 3¬¬xüï¿JrÑ6uµC‘Me¶OâKQ“Üߣ6õ­fêD‘éÕÎÕ¾‹M²£ªRA:•©†ð8iGgªa¸ÂhÊ„xÓyü®é&Ž+7•¹Eu!—‘æZI™jK2…éAf¾˜x§æ,lßÉŽ‚ô1f¾Šï¦%úA¾êRÜÝ,ûè㊂bƒCmø=CmŽºîq& -£´ãÛ%M”þs©øñž5ßKì-+U¢çîñ0ÝÞvµ¨á71`uä û#ŽJën¢ÙËÒ]WG«3¯8T»È5ÿŠ $:œæÜ"’ézìï,ÐWÍô V· jçƒèèW\kd˽]óÐìÍ}‘ ³8÷;Ê¿FZôƒR’¼vÍ“Âeй®–kÝIV€pßox§%´°"«–¤¸ÛlƒÀôMÒÿœ¿ó}÷r’Ïà ûM£"‘gº)–Å“Ì’Š·Óïwƒµü;¹—ËZ+x·? ÃyQ*½¿WCî·‘7„~ÜVìBÛ;¶¸Ôô Ù2ț»¹y×ÊÚÓ-ÕòÁ—·µº9—¼œ_àMþ¾AóZ=ð|EìíØSÛ®V ÙgTï”O}¼«S©1tm &ùüy"mÃÒo³3ÔUiéÎKÖ¤~õu‚wµ¿›e­ý––é«_îÔ5*×wÓ´&¶¸>)&¬qmˆðV©¬³6ü«ôòUãy}ë‡Y."[OUŠ8uR9tèí63¶·LøM«ñ:Á£!b+Ã=?Fpî^{s{³6òÙqêB³’W¨c´-åQ¶Ñ½ÛU®[]Q¼¶iäÂâDkÙúåê¿uËê°¨§>¨²pÊ+°¬jIš±üT݈rµ„§¯‹M{ÌÌb—þ¡¼cyvƒNÐ6Òö^βR´ÜAËéË×.¬•¹y2àv®¶óí˜zÙå[öiׯ®íRÌ*¼aЪ‘±¡ãž&£§þÊJuâ®Há\§"ãéSãµDÛ¨ìôix¶Ù¹1Â[Ùáh]°üsÇ.'lÜÒ¨ ÀÝ+¿us³pÄM¦¼»NÁæX¾ŽeÂ1ó\:ñü¢ö¦Î†EÔÖïRä3ä÷ï¹Ü+e§=}ivbönr—÷;¯}ÚÛ´Ö0|æv,3G>N`.zÙ&&E×0‹¬¦çœvY±Iái5=SÉÐfîÛÜyÌorÖª\S¥°@ «íaBaÕXlø¤Ìò(¨$p÷ÛüKPÓvÍ¢ÚP„©N,R!ð>Únb‘NôšòÕÙ<+“ù·òTë­Èƒ3W:ØÖóÓ&øÒWodnrBÇ-ÖÉÒœwåИ¢_ ­Õ[5î½ÌRs9Ú‘¤ÜŒæ)ÇݺÒX`5î4žSÓt[ãEÕ„±YWë×dŒ2š¢TÝÞXè ‘ˆuõã sÛ†ÞB’e‰$ÔËä&Ÿ·‰LËâT®²¼ôvüŘcmºÖ›Ï›¤o²rۋ܆ßtún⟘à ,êsgo[ÂpÛŒ\qÓöp[™B·²ÀŸËKu¾Ì‘°B9^6é!ïö]Ý ×òm,‘©Ôö‰´/¯ÊsÆ–™½qº8-ܵÛãå껨……!‡ð§Ýí¢ˆS{œÐ1#lÙw2ÒÇÞ.¿3)çEZY‚uÙR¹¨ž›’—ÛŸ 1g—û¸Uyˆ*‘¡ 7¢ÒV&½HëÜ-¦iÔãm'?kø¬Bä»ü¬– “²,Ýmj.eZÏ6Þ5*¤íSp`fëÞ`¦ fb~»|zì¯I7†1£ˆåÇ–ë–G5ºÒóv¦0µÅêh¡—æˆfQà;‡*ã’ažÅÄèp·B…?¬A0‘mÁèÓµµÃþ[Òï£Jÿ$¥/xPÑõbÍ÷Œs*1dÅø‹Â’Òö0¢Q™û;ÆåºMYáʦR&VúfâNf N‹Ž«™N÷¬žV‹(ޕ¦?Þ-ŽQeSŸþé«|7Yd»•(¢$7£ÄÔ«ŠÝbÌ1'[êr³¡6Ô?(8Ÿ ÑSe ¶¬ñ„÷YĈîñ[~6½d+Ím*ØXÀÎ0†h«cQYiƨТ±5Ò±Rø©éOuÔ/K@.Ø¢RcÔAícsc짬â,³¥={Ãàœ~æ­WuçîÓ’µbº8ȽÑ> ôol ͼSƒòYŸé9 Üï°ÜVûûçTÿPÚ ÿÉ™¶Èý9;ù³]ÆmÉ©26Ó *‰!(õìvÚ’}r¿ÿf¤`—ç¥É%ù”ÿ½ò»Ö9U¡’fÙ]6óŠUFV¡`at¢£–—áéÙÍ+Ëh¹¿{U¡Äj!—ßí¿ku¸%Ý*8HÓTV{tÒë#ö{Òþ´…;;Ÿá™k³ËS™T5©úÜSÉ–›=èsø«%6›ÅøÊbÚ¡¤ˆ³S6Gi»ùœ„œEÞÇÞ^´`f®ÛøËö›«=vyž0ŸvTÙ¥`Ç|ÏjqÑžùš¬ràQàÿX·~1(¯§B6ðÒê…—q³î;-"éÜDFÞâÖ^qèÚ¾çç+fåͰÛÒ"³ ö;v{´6¼xòFÅf!/ÓÀÞòYµË}ÍçËŠÈhD bù³æ|íKʈQûïê¬Û˜ü6´U~ý%,£SÅŸ®aý°‚…Öݱye)ãÒÈü§Ôô”Ïeo^ß&ºg£¶•ȹiÛù«e§çЛå”g`¹VÞ°ÑÇå̯]j´T¯ìѸG$;?¬ºÞ[ímÑuzê:_¢³s~Ãm£sÞ-ˆ„áÓ š†>š¾xIÍ/Ǫ§6U{ î{x¯ò‹‘s¼‹XVû0$C½W]:ñNíÆ»b| mWÚY“\k$Ê.Këè1O½5ÆáÐ5{¯JU`t…HÎËsͦ%lu÷ÛGž×’¯êððéBã–ë»é Îk†NöIX›ólSåÝÕþ£w­«x¢é³¦ÉSåДU±Ý©ÔžÈC~ŒE7ÆsÞß œ[²9ލn¹7ÕëÊâ¸{'Îr§ÎÔ0Ò<ü<}ÂÉæ%ÃÛO>ÕU-,‡á.T½½ä‘ÿz,¿ø¥¼–¦¨ñ…Á†š(™óÄQ;ÖyÜ \Žk›}0vïñ{ÒÉ:ßÈyI0¦ÌÝäG§„c\•ºõäo-XîP˾–'³e>ä–;ÿmÍã"•ÃI‰žóó5g:^G‡Ñ¯EùÜò€+k4œãÓïé#‚M׃!½SÙÕb¾âbtSÏ*ÛPóG¦aÌ ;:¥–Å}—#Ü·'-®Q[÷¼‡Óõ·ùP¥EUe̯E‘ë³è¥¹‹[VÖÖÇDש+©X<›)òJбÕïØ³ç±®+åFf®mÙ3æë«Tõz¤s~έ¹GZk–M”×wkÁ;ªÎ;…UZGåZNèôÚev+®/6rûéÜuJnÎ…Wßµ¹4ikòëA‘{Ú/wf€¢×O™M&kU²Ç¯¼>”÷‹Oæ3¹é+ßÙä?¸š „¦-@§Êý¶–¿s7Äc©ÏÉfC/oNÒ5£‰ó¾z“©\¹ßǰrB©…vÎUc»Í1{·ŒØ˜á‘ôzŒþ˜¼ƒ®ÙU•þ7Ä–Aiñ+'ÝÏØß0G9E!°Ö%)MÍͶðên3¯ÇJíÇC³¦N@žuX]YèÁš§T{КúÓˆ:ô `­©õÞM²#¯çkúXí$…®’S&«m”YeL(@ŽmÚw:GÉYèìk–ïsr⨜áÏ„#¨HÌ„s4êvkš¶z‰¥QJLËâS©¾r­5HƬ¦Ç:·-]hKGçcÉlÑŒjÛæ'¸”nªï ×ú¸Tþ±¾M“O–dç2îŠíîPšîèÜ}(a|M¼ßÃ×jÕ¢³!~×oo8ò˜h®¾Ö略>vx6ÜZWa;á¾_ÌrWC÷‰eYœ¸Jä<™‰9õçìó‹J0ÜZ¥É7_y}O“R²S$p—_=ò.qQNzÿÁ ¾vÚƒ3Fy‘ Lo†OÎÍåv gÞý6£uîð4–[ÃÊ; MI ©ûò¦¹üNªLV™äåÆÍÚšV$*¿ùìÌa]ó\]ä^#²c#oZ!ñÎM˜Ž$ëû¯vPÏ7Rt«.ÏZû׿ó®ûòö¹×.D>éj¤Î> mó<Ì-•înFyñ151w¼»òV›$Ûæi¤EŦƤqÜV;)½ªw´º¥º¥­ÈÛWû6uÜØŒ®u¤_°èrè.ÑrH÷»ÁìGté㬯¾Z1‰6±£R5©>g…¼‘sBƒ±ûx$ú¢ó¾a Æç¥å™ˆÛ+œQh"£èv¦<« AÛÇ7Æ*3Ïž¿Óü9‹W¶º¹s:fPÆeåž±JŽq~6µx²¼×ËeÂ*ç K4Wæêu×v(~´ù ¸½xWŸ}ÆÝ/×÷KL¨%HYÙŠ‡œ³w<6¬ÒõYŽK*6*Ž‘+ð{¹Ä¹·]ÚScëÉ ^“²·<ÒGÕz7»Kî\¯Ìm¥ƒo/ÞÐAÏ“²Z[¥ŸFÆD£¢]…Šœ¸³á-ñ¤Z§‡Ë…ù£Í¯–Ÿºþà¼óWx°µz2ÅGT“ÒxtÆÛw&TÎÜb"̈I˜r:e”ÑåSf·Êµ‚š²MÔkN™]-Gt8 ÝóÂÀž“)Gœ÷Ñ”ò÷¸žÛâ»·;ôâÚåñ,h©î‹ßº÷f¨é<Êv¬¸3æðmÁ¬W߆ä¤Vo׬ ŠóÞ"þ*½u_íµpÙ’RhZWË¥“çøjT×Ú0§XÙ®ózòËVÂã§¹ŽF»<üN(U凤XÅ^3o¬<¥|Øå‚Kåhä†Qc3¯6¾.‰Æ²‡Âêüç¨à†QÈÃrµ½gþ¯…óy)Ã5^K u,üm±¬}n“Š- à6JvÝÚx7e‡Íñañ>.³Öɼx<îvmµ‘R %IJ–š-=ož·NA/Øïåþ'ÿfúÃþ?ñ9û _ëü/ŸÿÄžÿü!Wù³0˜ÿêùoŽ@Â%ò'âþþë‡\ŸÊ_rþ‡IãÙ –€Ï’Ùúÿìcó?"V":ˆz‚%‘€øyþç\æmçÚÐ<í ™4'GÈÙÍÚq– ¤g‚F{àmÐh[š­´‚`ŠÁB4!ƒ/⊹>ƒ‡FÛÍѳ@˜ÃúaaÎêbaÌ3 ŽXb ã†OÓƒޱùbZd[bJï¦é‰Ù‹Ä­›Êä0„"¶xW$0¡PˆT,ŒSÌóØsØÐûchfP?¥„l`-…\%ÇùL¶9ZÚaÎãòƒ ç?MÏÔ þX‚E‘l¾)S$Òƒ„lÞ4=‘8’ÇqØl±$tõ’héHü¬Hp7ÑÄšÁæ³… 1›ùEB¶RtÖ”`J€LL ‹IfÍ4½P.ŸÅ^¤gaÎø¤ä#’‚\¾dZéY8¯|?QÈTgFÃІnÍáj„LNd/ +¤8föU}"Ÿ/Ããú‘#W$þ&þ\ÀÊÞöðAÁ¿Û<ŒÏ„µIô9 Nì`?0á¾ MOàÇà}NÇßÁøß‡Á•̓ùòA0æh iXᱪ"¨—è ¬ybF€Y_¯ýéÁšó1PïÉÊpŽfŽ#౸üHÌaƒ\O$–dŠ Æ%ˆ>æ—ôØI d›ššÂd#ÌCÀ‹)`±-ô¹|&/ŒÅ† xâ©ØÁæ}Ì ÍbcÑÒ¾èމH&d²{™#-6åÀ¸ ´·¤›YÒA0 — dCþaÿ©kàÌ™À °…æÜàH$d¾ï˜f±ÈŸ-A_:vªù „,¶pšF¦9˜¯a8ô—Û=ˆÁæ§?™Œ`Æ¢{iB˜8ˆÏvaPtšª>æÍÂR>,J)÷ ‡[ø¸4lÁ€°Ö?ðz{I”˜"Ð,º^fùë ‰¸Q 9NÏÂÈ,\lØœ B>™ð è<6°T}³[z m¡9FõaÈ6ØÉ€5ê?’àû¹1æÁ…Æ’ìç*F´d©ƒ]xÉ*eã§YBœ­¤H˜F¦#“ˆ1°+.õ´n¨f ˜aÁ`¹–z,°3%æpER‚¡† xVú Á”þÀODÀHâ*3ó0ž$¤ˆÁßì«‚¸M8ò{<ÌQ€©$$q„½~ ¼¸OAȃ’ÄÕ@IaÝ0ƒ$š<T‹‚Çañ!ˆÜp¯é!BG‚°3<ÅŒˆ‡p,F¦¢~rK%þ!ÊÓ fhtDD„i_l/ %!]/͈ÏÔ^@‰*q×zKôú&^0—Åâ±û;¨uèóÍÑÒQ€"é`aeêMHòÿÚß1~œÿÃþOùÿDÂÏÿÿòC®åûïçÿ 8iþÿ§üÈõ©ü߯$ß#ñß{ öû_üGù,?Gúùÿ?~ÈõïÉÿ÷93œàý™ûÿ™ûÿïäþ¿ª† vüa¶@½‰ö^|JIÄÀaðY@UÌàð à“€Eþ81ÙKdÁ ”Ý´èWòMȘh…ø²éabÁçáÒoBŠDâ?Cêñ9J׈oB8@ЩgñI&M‚Ìú7QBú´¡ßNˆã`Ãø`j|´wçD Èb‡°‚ò™‘Ò,w?Å1å ˜ƒ§€Xôaù†w*˜¼¯gÝûpöK²÷ϨKˆ¢Á«” GâV—É‘§‹ çÄy‘ Ì©¾»¾K¢]r°<¦?Ñ`üßJ9 úeâûm| üÅ ’$òá³#èt7˜Nç ú ¯mÉ(žŠÂ‘Hð«ßÀ·üYý°‹¹Ál!øøÈÑúZ?8 Š@Å£pTŠˆ¥ØÏW"ø¯ &QQ ÆB@ E$cD „DÁôX2ét¿0`ú¡OÆ¡(dpçPX,aÀ^€i!ø÷ëÖ:=LÌå :VÒ ™H´?ð×_@c¸âÈÁFAw{(@–D°`³É_ê`Ð!‘ð` –:°<ð` ØO95h8 ‡L"`¡Ø0ÈD|ÿ1„ƒQôN‹AºÁ“(@Y1(àÊ£ðXò`CþtÚ †ŸBBá X  O?AÐ|À/bóE‚Þ™'‚Syƒ÷F ¢ðTÐ"`)ƒÍ²_¿Þ8±(‚2è‘Np"3ègƒN_êa0Ñc@$ zô5°è)¤öŸ… 1“ÃÔâÉÀŒPÁ h ‡l ’ˆ_ìbÐq€€Ý"£K¤?Ûx•.ÒŸO–¯çGg ±@’z•Cðª o’¾_½~ЩÔMü¾Ò\ówNè“OúRù ?‘XÈ`Š{³æ@T¢°PÜë‰ èSq…¼/{ußuŸíáößrÞ¿×.¤”Ç"ɼàä@©M?çô¤ý[¹ýE7߉ë´^fCÀðˆØbˆ´žÁãõí61A Ü»Mø ãKù’ZV¿=üÏ5Ȩþ­ÂúÛQãw”›–‰$’‡!䊥’}÷ùoåüß ¯¿×9ù)ßÚvþ[\ÿÂZmÇ fKO¢}ç› 0ÿÂú4«¯Ï èYˆip¶sœ”$ÉCæ~lšÈ(団ý,PBZ6/L"9ŒÖ¯Ì5ìc»Eða ? ó½„.‚‰I­õ ý»oéÿLÙý[SvRwŸÅ“4¸Þb sxùY€ApB3XÍÑp‹VWA0CÍfðù\¶ˆ-ì;-%"(‡X`&–@™½‡²ògrM™ð ûjUß1h¦Æ‘!Alq›÷Åx >BRm%ÙN2•†@Óئ|6PùÁ Þw‡üø€‰€Ï‹4„Àxá™Áâ}‘1î€ý˜3XSÌ ÍlÁ$ü¸ ƒ!ôk#I†’cÃ\83(ê= ÅêsP8‚Øn§†+†"¸<ädž3zþa< !Y´™sÝhÐô9žÇtW×éshžS$à;¨…<Üà `… ¾8¶ Nv®63ütëY޳hžp>Ò~mŽÝ¼yý\Wh:ä<Ý•6ËÆÍqº+äìæê{Û±T K‚H8ðIÀõµÁÍöÿÊffoKÞT¢@$ø¤úZ²AŽÿ|ÿðýÈðDB…(ðvöý#p° ÞÆ¼ëØ×-™Œ"‰ŒE¨˜> ú'÷ß!gŸÉ…Ýñ}ã$ˆBŸd|_S2hÚǓˇ+FökHFQ0DˆB& (x\?Ƹí'a,{˜EýdA³Øý7=ý¹‰ÅIDÇ¿oÑ#³¿è¹Ÿ¶!õ¶¡Pºõÿôõ-öÿóóÕk`û'‘‰¸~ö#±ÿÄŸöÿ‡\Ÿ?ÿgX'x%Jžÿà t«FžÿÓ3dˆô@ÒgþXZZÆÅÅÕÕÕÑét]]Ý!’‡ÿŒ´Éòñà!þSKÙøgÕßsOq»|ÙóчMß,2Wáï96£ªŠøÌ1ˆúxß!¦gCêúÛo®s=qœ;»tCÁZ=RäØƒÖˆãU‡XZ©Mš®6¤9´ç¼»ì²ImÍÃL­TKþÚ©ú³ëzõ”![\ãë‚db åÚÊ4üå%½ÉÚss»kˆóUÕ½ºáÁ¿ºÁ_?’‹S¿–Â×´U¯¾ÍR¯B°ÃcúDøãa]̱ù×·ž¿ÛÔÒÀ‡¬ïTŸ°àºò†®‰=Q¥Q‹zZyaqÝÅÉOϦ(vµ§ò†´9­3ë4>t]¼)ÿ¼>!%­Ø];‹4¤s÷Ì ÝÊ^v/Z . +iœ«¹þ˜nÓxƒœ¶¿†›x¤0|ÞÉœàº&í,è_gnxöÄÔ2ÏòK^Ý“ç\}öâð7‡vú(5-6©xuXýAʲý&€’Ô”8’R)I 'ußÑä=éhÓÑrx)i(2еޓ/Š~¹®¶jnó²}ë¢;·7Ä®¥¦Òÿší¤ºË0àÂYÝø†âÙ®ÍWR¡ñÓÖ^8£«_!ØÌz4²ª š4*…6\k0ëÌH¹:‹ §G.OH]¡ëxbuï{‚.âDZïûrð¾Ð8[-ö×®p•XdçÆÞwx?‚´¶l½k4®-?!Nétgðº5§êˆ+ ÚÇê+¶-Û²fUЃÚdbƒ:q]{G6yg7·½˜_§FÔ²Üs¾Pm+ÂÌÍnEu9AÔJÞyóÞȶ‚kó;7v«¿zv¹ñyÏöǪ¦¯n¨^óP¶'£"¨ÛÜ}è­¾8õÑÜÙ–@6ÙMäU¯ Ÿw°Üß‘2äD¤V Ɔ‘gK§–]˜mÉo/„‹–ðiÛëmùôía{ý&‘vñ½Øi2'°ZKv2ßvY†¿Þ¶úZHçñpÝLÝøæbûÓÍ7qíÃr;®ùv¦!, ˆ±#œ,K êq·ßžß‹öØ¢:i'±+AŸþ¼z4`Ñ’¶¢Sº›v¾yzðÉ¥óEùµ÷´:#NOB†Z–4ÓmšÏ©“S>Ó3þÒ³pëìç±k€¸ò5ztšJ Z«zä›JM0Ý>ùq¿FY+µû¿Áy–{–—Þ£—Ÿèys°éfiòÅ¿".$Æ×Mƶ½²´Œ5£ô·7w¦«ZL›Ót‚ja^>Ÿn9ÕòxtksK«eJÛBµe=¡]%GÛ:Ã{º÷dµ­ß]W%:pt~¡Ïý>>ÑÝÍ¡]C›J'É÷Äv-Zyµ»aý”et\ì»IçwvzÓ Æ±vvÊuªì]WäCï¼Ûg©Öù‚yäí‰%U¯2*ÛÖëiâÅj:…¾‚ëÜãü×Ô<\÷ÝìÒäË[•#k÷˜Ä-íÁFêÅo<‘¬×x‚µXFæÄx0ðä”J{°O{ƒÍÒÕ¦ÒœÌWí§[mä†ìŒ«¶i$븽J‹¬¾oñ¹òæaú¾‡YÇ›äô} &•½RÐ÷Ýcÿûk†œ}…Å…ôÇÈ(ßMO.5™,‰ªÐQÞQWçõÛÉáóõˆm£ª‡…s0±ë* œG¦›®,iªï{ðITkà-µUñ{S_Ü,ôô•]U=¶pGLq"ÊwÛ¹¶·*ÔžËíg©9VF4éfvqÓ_ÙKkqÝ~Kµ}ãi¶oT5ŸÄïÍÑÛ8WwºJ:mÞãk‡íÞdÅï’£úêm^—Úe-RÑx2¤§h¹T;ÃÛÈš’2ZŒÜÙæ¢9Z~—~óìâîÍÞó“ϦÈQ­Žž{äÁìM·±*q>%CË9ï@[šWÏ‚µÃÔ/¨tÏ“!”·\úçt9­Õô˜zº™Ö“!{ޏ!·Ö‡€€':‘JšÊZ{¯ý?öžÊ­mR I¢Da}7c_¦ì»,Ê„ÁÈ2Öl™QÖ¬!)*k$•´PÄ$d«ì$$Œ}0fþwhÑ]»ß¿¾»tnî¼ï{Ög9ÏyÎ9ÏyλhåÙéÜÊ©;»¡Ç·rnÝ‘ÔË`3œ20Yó’É»½·".Cæ°kŸFÓö½<X®§ä6âÌtæ&ƒØþð°cPÙp’¦) 6Óƒ‘T×>ÒK· ðÒÄÑAzqI꽄JS?° q–Gÿ–¬üQeh³Û[ÔÆÊüi L*Ü‹¤²øÞr£6Ê‚’ HÉ„âH¹¯ j”“MNqx’õñNKn&#èZ½#«h|ŠÙ "ÇL!O.?½Û±!#P`EC†ŠUÕ%›—î0àéá©h<Ô°±±€9¾#Aßû:ñÓQ }Ã|¡™;ÅÌEÈðÑ,”eš³Ã*âvJ[â¨RœY†³sÇ(3Fæ':¤’:³eiY_•‚ ëOçãæ8ÅsvD,ÖEð¾"¥1hjû Aa›1¢ˆC'˜‰& hqrfBp'Ñ=ìÖ„ˆRºO\1ñβ×ÔJõ†Ë=ûœ2ƒJ2œp¼hap3MèÛÉÜñ¶¡î!"– o¡V:6ÞpbK7?Mt.ß—ú ´—ŒÆ¹‚ÿ-Ž^Žxç;Ç,Û`ï>ÉŠã˜.+\ò2÷ë'øœÝ½¾K[·'` PTDzáâ^EZY¢¬§¯¤WÏ£¨—F®¼äSê7?‚ÅO\ã[Ù"|¹ ¹# ó x¿&ÁªÛ… šè‹»ý|j°„ø‚(påbþY¼âEÿWéÙCÄMÉDå©I}d‚/+¾f'^™á’¹îÌ‘ ½i÷‘Hi˜uë°õ¢Z˪Äâ$ ¶ñ´8ŽÛ`©x&LzSÆ»=>éªYЮ¾Ž—]‚L:Ñs̸ÃïÍ9£˜´. Q—À“â7Ú 6á6]-ˆ š€ÕÉf/~d†”ï”럋š§õ¿¼“Ó{²ÌŠ]Z(é­Š¶TÃäeÏ]<£ÛàG±Yïû®Ö8»ÏT\z¯βôªêFœ9}lGÙf¥"v ~Âòáè“CÐìdDgO,øÜ hê89.ÿ½:šØÚï`¿(޾17©ƒv[ÎL»žò6ÉŠCÑI+ñüé|ÙH\Ê;±f|ßÅóî-‰Üýìv+ÕŽ±Þ/¡I{8o;Haøš ž›´ôI'— Ṟ§ì”eèäé?&¶2:ŨižÈÂËçiIC\/—ÝÁ{OŸü1bé%–îÑý£Òïàï±{ôÐÇñ7êì 1ãÒ]Ìñ|ð„K}C|›žÑv^Ÿ½ZSÒYO\†7ò=¿…‹WÅk½~€Þã{}dë’án˜á ÷yO“Юê—}—vLÕ*ò¾s¼ü&·w~Oχª„pLnÜœ\`õŒÜ}&µ–ÔÀÃ;tÐEþ1åÇ7¯¼±¾›âºˆ (‹¸Ù³g¼|¯ôrñ©ò'›1J¶‡óÔ«¢]»!7ÒEÎÒXy†–Ç2w—Ð`65( åéA c¹—üsfœD¢Ï7%Ÿ=H+úpHe€ ¢ãÙ_Zn‚?Ýíý¼¬yø¾a£µ‘¹ L%žR]Ö¼û¼Fîx[¥KHöÓÃišk?È.T©²^]uÜÀ­Sï1C½þçâc›¬6(pbˆ®DšÜ<-ÊŠŽsäS|Wâ¥{“Jž¡o€ ŠJžÎ¾A#9´ uk<9®Ww¥o˜^‡¦²¤ïKNïŽàkH¦Ã-Ž£Îà\ü[i°:gŸdCt]¨~f4Aè‰Z¼Ñ«Â¼aÕd©ÞTñ#Ž>ƒ¶ÃKL£Pü!d€LºLÿƒf(LXZ¢´€8û@5¶ÿr †—Y ÷Á\²tôÖSõäõ }z¼Ë)È»OãÌ J7÷uVm)³L+äe=ƒEç<׬ˆ{-]êä¥FçÁÈÍ6x™cææVú@ƒñ£óEOYÇ¡–¬«7¾&ÃçñÎïß©vd«!þašË^ÛAÉD¿4úvÏ“lÆûe«1D‰îÓãùãÃã<Ššç.Aõ–¯9à!ùªp¡T¦Ô¹Oƒž:”wì2¥'·[^‹&ÕÇR­ñ“R§¶4dí uˆÐ@ !zF¢ÏpI)¤öb—ÝýÏFà&k‘u;…|?´¡Xrè> w*4¬t'<ëîlòôi-ÅÚØâ×ùŽdù$]°­—róŒæUÖÕ¶^–•ìš`„¾I»Ñ1VËkpeïÕÍüX.Mh‰л[dûê¼ëš[‹îZb&>6ÕM£7éGR›î;ºäS{›oåVT±€}GðºÈRip«:þ%Ñ?ã—7KW+}DåyJO{J –²¯1Ëp=æqZ*ãI ­nô‚_@*kHe\Á1ï´ö•ºF¿n¢«·44 ©åPÙ“Â÷1ìU‚6ÎŒÂÄ$>‚E[Úù‡hnܽž›½YN^—YW+m(è |èS  £yž†;OÜg^ñA¿·DÃ:îØŠÊÀÕŠuŠèL¸ªˆs, ~^“vœ‘°4ž½sb·ý™)¨ý®«J ù—ÞI<ŽoÈàÏ©2°d”´ï|k•:ä½äW'¤59ß|~ÓIá•w˜©–„M—jó–Fû¶¶LÙæyx%ÔCñîr|”x͹ ÷Iì`©ŸPe…Læ½&ˆhK‹Jb®ÆWgªáÚìÈ:¦Ì\0Wq‡ìÈ^ãÔ8ðZƒû ¸6ì 5¿rXÅaHéÿNÙk@ŒôŽ~Û[Èm1//Ü5©1¤òªÏé¦ÞKÚŠ}8þsû7ÓíêÔµ¤ÈZúÙ0­3>´8…-á.¦Ý{¢Ó€;‘¨Š£Š ËãÝy%xÏû–n¦ð8”{B½_Cbòµ nf àº ÛíªUê`Üï „1"lõp †&ø4òT±gíP&yøï'€wÄÆj3I]˜}„–ƒÑkø¨‡°ËgÏH±¢j–òUªö}0íO6±Ï©NZ©½„¼¥Y³S/Ó5–v:"ˆ×|Æ­y°Q?ø†)|_%Þ _Ù9Õ˜'g÷v”jÊl볇ˆ³”’D:Ý}Æ.ÌÓþJ^Š›`Óä=ìE0ﺋ0õú ~z±öj\ÞÕô'x¤ñ@9zQZLHˆíiµ±{ç’ÎS s\NL{Û“>;Áwo¥A¿tàMÁÊ@W¤c×U½8ŒÜŒ©²œúbqì¬Ù¼>¿ƒà#—³¥üç䲎™Jc„¢˜µ‘y=Ÿª¤îÜê§Kñƒí.c¿NC˜´KmG[“TaãÄúYºcãJ8Ny  —äËÔÜ_gxÞ}œ³3a*îÆ#c:Wâµ$á>Ú}¤ëúmGµ Á“e̮کâN‘7ã3ï(ªÓîáéÏŒ>ÞhìX ­ˆ}zyhüÝÇ©ý°Lo¼ìUngqòT1£³¬!°ûU•†—Ëñ‰x½3 vyF²  ø~7 Ï@"AtNÇrs`’^²cå!(-·çýÄhÏrM\-;Vz_ÏX âL¶ôR¨h.Šåðâž L~Èñ'¼±™! +÷6álRœˆZRgOŠîg»oÌj¿B[‘vÉOë(Î[f7o‚Ä›\ÿ;Ai©Eb(—Yr´ùQœÆóiúÚñ·Î™+µuÉݘ–&Gßp£Îá#8äÆz^HaÛ€Wo.hˆa=F… lLÚçÂÈoI½s®\צWÁ䨨©…¡î²ÂOeãh§ð/aîõ éd˜òáÀQËËp†b¨€Q³.Z­Ê|‘)^õÀàéô“µH—j¹€€)Áèá¦+wªwBwõM9=;ß" »\†kk«rÉ…8# ]0eÙý!ËF„ÛÑÖ;aÏÞöôð!¶ÁâòZ LÉA«†è£é°’Hr¦· {ŒõõmyfAÉþœsG¯á kÔfwaöä°2mÀQIgÐî÷Ùˆ¹óøÕÁjyc\í&9FŒ|hZ]]F„PÿD‹óüÛlqdúÍcèÉó¥:°¨)AŠÇÕP—:\¾‘tkj8z &Aà/4¶) ¤•ÜeÇš]ÝIl¥ ¼35¼° K“­pyÔ a[_v·Bša”ýž HCO /Õ´RËf¹s–Ò=âÂNVÜ2,㽱غs]y²×åå+‘…˸ xÉCŒ­eGRîGt« E:Q“šª—×õqz<'ì“&²kdö]=§Å‡*øâÄ€ŠÍ$Ý-]ã»”!ÛóPç¨!Ô¡«w$½>XÛè–oy‰)í¹ÅÖƒYYôE)ÔÖ/gùF‹çº[ZAÏWŸ¨Äµl=Ú¼— ­·LC<öîÃÃ&ÿ Xú¾Î™†…|3`N¤jÀRÓ£uÞ¨GølíÆrÓÎÌ~蜟aÅ pwxüÜ{áä@Μw¨«1Ç-é ˜A)=±uF±æÌ‚ ¶ƒÒ_œŠ¢ºß£ÈÞ®â«Mö'~¨-˜¸LÇŽ©©¼þÄ/sÜϰg øAsr”q>PÜÀ¥ÔÁ lÞ@YÊÏi—.õ(UÀ©Üø‚OxdÅÈ£Êî’ãc®÷ΜeÀ âãRZqÝi0š>¤Žâ±ØÁ³£s{iq²ywq¬+‡Ég˜ÈQ±§w ŠG(úIXy»%ÊAs!T­.Tû”eLÚ¥»løÍ›ñÝuø£à•koÒÉñ—ÞÞ%°m¦öMê÷Øá‡ %‚ÒO†õèDB ÏîFž½\cá£ÂÉŽ–.Ü §ï›ÔîuÄã^ŠfgrÒ7àYG)”ä¨å1˜é—Ú%Ó¸ü øy¬k…#>¦åUÉ&ëö¾I²¾a¬<¨¢×¬xª6³BqwxwâÐFœü62Üâü¶-XŸ½AíK·L(P=äaýì;ïëå’¡S¬p¶lžRöY‘Æ{yS§òÓ|#a·ÓS¶S÷z¥ùl<õ°Ì½×†55q“ME¯È‹—гÙædØbö VôäiXwÀ{¡cPTëqœ]Eª až 2Àn†Í×ÒKÚD†^¦gÁê KÚõ´`+v&¶¢ºài*f`wúrB;v H©Ée#zŒ^wÈ`±ùøêó{Ü}]ÜKûÓV°ŠFÃU.%il\Û)»Ú°c—?äõl!#HšK{Ÿ/£éC2TCxªÆî›kk¹µxbWb2Ž7À¶à+®Ó¤:êK«–´ÿ„^PZÖBžÆ_PKÔa¼qKmrð¸ÏÓ¤1­·¿}’ç§ñtj2»ÎqùíØbÖS]I2iåÓ§^Yà›M|ƒî50íi=dÊM†KM”¾5Ö'}•œP2± Éseå¾@VÑ+Ô2ÅEÅÚ 1{&ЧŽ·˜z°õ˜,êêd•žRqn r}[9züCE\M+¹ùLQ¯[?P´k#áE6ŽÂ3u#ìbб§.³hÿ:X:0yfŠLfêÕ-Mý2½ý[q©ÛÎöÒé1_8¹ã9Ò¿n#~HÓ‹’µ¹·“-Tó=ùR9ܲ–|gX ºï^ö–‚ S&*50i½ÁFgŠa–»Ùt@ãÕÆçt|ê=}tB5¢‡7g{a÷;U «Æ…¾J'B6 ù·]My[Ç1 .W³_ŽÞ!<‚Ðh–÷v”D‰Wh@Lã*1ñ/2ÁIµC­¸Ò÷A2õÃÓäh >·ÜÞ-rXŸÙM›N%á«oh»ŸíDi;,ŒÚœÒG– eV+鞟Qú Õ\97椚ÜTµ$dÎë冥õßy‘˜vÂl¸NÎËmyR†öѶ²rE],û‘–`~ä‘{vd‡Ø[b2pÅùá H´ÒöÆ©iâJìyã;’‚û´ËGO`h¹Eý" u‡™ÄFë;ÛßÜr-¼3Aš•R¡J ¶á…oV<(fž£€Þdô\Û¥N4+ÀNø ‡ û`²u¡WÔêŒIÎ÷uQræýìM¼ ”æ ¾! ŒÍs}z7÷GMåï —Î*éÚ‰6mö/“Eð¢¾~ËÝž”P+‹‚ß‹7öÓß|åÞ¾îó©5H„<-³-ŒU÷ž%7E‰6TôŽ[>@…ž¶[œy¾Óª'S6 Êß°ç.±àAH" ú²Rçë™.©-ݶ'»T˜‹ ذ0Uë(D÷’?aÐà=áî§E±SttZÝqÉ@nï(çÞöÖÀ:x»÷áü˜ƒç}?lB½†=&m°N0L?0°$0£Þt¡ã’j ×ï¬N»Q%ŒŽ†:-&^*ÜgéX k$ÓbK››â¶§D1^«‚êÐ@¹ÈÄgŠÜf—evÌCYõT %ᘗôMà¦èeœy',lÀ2]K«ó°¨®1­:VŠœ`D9Âìúl;þ=ϱjrÛåËB+‡Í)ŸRÄRíBÓaÁ¡½æxsÊ‘=>MÛñº|u)…¡½ÖxŠÛÍ”ÕóîìP~Fs³kõ¸)»— ¢lÆOñÏö"á*ø¼s-¥rŒ­^LqÝo~ÝÐd´´ˆ|;‚Ä­ïYÄ^a!ŽwÀЊË%‡8º+ñ×ßõ6Ç+™¿¹{1Ç\éÒûd¢ÒRä#Í)b¡|ÒYÔî`XÌàN¹Öà.ßwŸzìÞ¶4 é™u¬¹t„ÄM½/Xó4†õI¨,YoEq*ŠùYLÕoîÖ¯¼VÆšxu!v îÉe Ùí%22V’-€"ø¸éÀj4‡ù¼±ˆ”êA4{1ÎÁüª„{£Å mL nHz޹qĀݾ´l´C²1û°h4±»ºà­§!¾rDM€cÅm7´sù€ÿã}¹½ ^Oó Ç.8p†A>0‹y ^`ˆ=Îøy”ÉÆÑË1ó)|:*1*¥¶x”­SÏ]]#úzfÛ@r³4O¤5²BáŽN¼rðKw«{³hm{—ÈÂH_Øn¢€™((ß³eP®F¤êÔBšÃªíHFÆJ‘j4v±×ÐI¬Ž£‰†pg³óô';®¸K×WôÙk«‘’+ç$1òCøÆfruˆsCͯ‘eV™Cóʺ0bT˜'0ñ ›Æ”À„—ç8#1D†G4z§ür{ùîôÓ—”âgŠGy£´€ÂÃú“CüzÒìÌ네{d Wft©Ý_E'}ð 5Â;ŽJ³ …òýØÎúô@Ìu¡35D…Ä,6ÜÝœ^ƒ´G˜‡1WðTbMÊ^|+~“ãõ°¿¡ô•:íÝÐr«Hbÿ1Cƒª½‡7«L¶^q ׯŽ>{9Ôkv1¹$ð°Z»ò’5#JiÇhñ¡!#R>u—-4tÿ¹Ðœ+‹X*1ÒåzG?UØZr ±ô=Ý*„ÑfÓSBvl]ïÓÁ{ÅÍkÙ îvM°Ç w1NmåÍdoĽ¾`êl¥Q ›­Ú‡íYe¤^bPuI•tk4ÄÈa£Zý€Ò¨‰Os *ì ³Í3÷YG—Ü.ó?‘Ú6§»"s›p537'ÒyiÌ{ß®:ò &tkUÚ%|å¶Ûi+£Å6½&Mì‘—’üñ`ÁÍþY³ZG_T¥´¾V‹‰ìkÃ]T"š†ÎVÉà=¬š5+Ex„y¬4§hYñU‰†v]S59Ö‘MMx1N=Ô5œsQð=2Ã7¦nùB¨ù ÃÔɼ¨å(¿à;Io…v»¨3=ɾgX÷tž[š­ÈÅ&¿«4á©V½gÄù,"/Ç¢Ÿ¦h3Ú‘MwQq…opa£¿ÈˆË÷–5y¶^® žK„þ¸Ì]T•%mM¯Ý»KÂ+Ënt¸–¥‰=LU|ø¡ = 3ÇõÅ=–f$^®ÅÝ%]ÑÅ4ãR‡+á¤-zÂ|wecˆÉ-Út ªNï´#ñðb(”½—e–UÄzA¡ýÍHÈ%¿pÞÌF˵ÊEdèI?1H|«ìqãžÖÉ£8— ¨ªg`Vêák§ŒãfÄJmdK>cêhé_ÆœÅÛ"ÉÁ¦†AÛ;¦™.]²}ù˜žÓ|2}äà%ßh2ôu™ÃoÄ.$aæ«°¼Ãvz-»yK©:§‘)áüföBçÙ¯>ÂÅ WŸØM!•¼-oéhUšFs¨iäÈÁLÅ|ˆ³—Ö/]tùiâEň«NÑá÷ð{Ÿ¤½ 7%Ó‰ãwH{–~½W ßJÆE#+F§yá¥éUšK¢µ4¼WF²ùDöv§ŽáŸ"ËD·]_b­Ž[ldÜI|iøÄó” ¾ê:j«sZ*•_˜d{èô½S9,Ћo›åéͦÙÈnuíñ8 TŸe©fGJì3žÚ;{=…æå¢}ä“kt@ þå…MK7 ~hÃ¥k黈×I#ÎéÜìlõKªJO7b£´,âcwuYEãKû˜ž,dJMž¢sZdŽ€YÅÇÐòü§š°—[}*%ޝ€Þ† àªSÉ/gës ÄÁlº#*nŠÖ?<9\ðJ¼gK£Ùãj«^!®½‘3{—È9 ¸ÝÁ r âoï­E¾¸M½üʸÒ•ଊ}‡FOÍ =ÎYÐQÈò|ú¤_¨ŸýÕ4˜£;†ÔÝ- $~b\é>=|Ó_¿×?Á§\ßM,\y`3”KQѨ' –ƒ£ ™Üw…º‰OÐXFœ±$  çuaÕ„­öGo%ø6‰uLí1Æozì³Ã`3a ZOýrëeÇQd-ô­6íÑ»'ìuù¤O‘j< ÝÔºRš¿|o¢÷¶» 3þÉUš¾Ámº¾óU;¶ôj)ì<ˆ_(bYÉﺈYœ+5˃R°¡Þ¿¨gÆKÈ;m8”…ZÒ¶ÎíC¶ Ií‹,PÆW¦ªò $_‰Ÿè в°—ßåÜEl Ã,ã(TXˆïµÑ Îþìññ¸«¦„SÌíìX!dÈœY8” /ìØmÊ|u+º}<ÂóDôþôäØˆQü¹~ºí}Èf!±LÊ]ËuùbÓŒ``‚Y$i;·÷’)( ¼Àðå"m©ý@²Åâ`&rÿ”Y–‚Eßp”×RidZŠ$ ô-½O˜½s©Jôþ`m÷3h™ÅæE.46;" ‹fÌÅê°N·xÜ™n¡ÆGDÏKÙ5Åé=Ù ßË,ÜvÄeyÓ¦Š^PdoÙ3̵F2´¥QabÔ3¼«JÔó:“·ßð…9'pE/gdoá3Œ—ì¶d™艂iQƒ£”xþæÅ‘þÿYÕýÉ#o«ïǦ=ðçÂH^½hì‚ñ´ÙG—8Unwíö"Ç»Poð) |HЦƒJî+%Eá†N v—ë]¹N†vR†§¤ÍáRø˜¦tª’^Lß[®+¨œH<´[̗éº|ßÏ‹£ÚÛãÅy© ׹°0ï%TÛ;ti¶8—¡S¡-·œ—…³;D Ÿ „ÛµÀž ÷!wÖˆÝIS>³¸ï#FhÌ@}ŒeÞ„Q¼xÁoªˆ[ÀªO ´ªwÊûDÚ¦bkËžl ˜ÒãqÜzÄrñÓG«Eë–Œñ…¬¸Í!édxÖ¼ƒøwPÜxiÑ h]Žr×–ž»†Uª¸Â§êóð@ÒJÜà•þ¾zy®ŠÞLFô˜å]~ɯr=vaöŽ©² v(+2ð<åüÍ3Ù8Úl\í®e!Ö·(þvèÓî–'°þœ¼µKÖZ5ȈEä™Í ŒÞV”«¿ÊÊMTµÎ ;Ͷ²Q0mw;¬g>1£çüò2jPI mûâ0Á©¢ Z!¾gw˜¸J~07}úÆ9ú>¤^f挥l¥âÔr¿ãz':C/yÊ@Nšûš-êÔ@[´®<µÆÞD³¢CÑ „n¢?zçUçq‡ðw/¾Ùe•ŒZÿº“}IÅvö¶w¾?†à+0ñzŠmIíÖŠÔ­ÀM&GDAÛ‘£²»‰¸gÐwÐÛYFÖ˜›„/³2Usç¹à±ŽßñjY)B®ôè sêÄàÜ xáãqNdÇïòÆÆß÷¯t¦Å ×z>zMáÅ1ÍÜ]Ü!*Ì€¯{¾WúúÖË•ÍÞK×ÏÖã4,‰êxóËzSMÇ1]Wå°²ÇõËYO^hP-<™ÈÅ%¶%ÃK½|* POÝu™{RT9çïIÀ/°Óó¥Ã‡ð¾’¯Eº÷`Çš±K×–dÑJ[,1Ü9E¢@¾Å+Á•ºã–ǧ†õ0ouÑÅ 'ûú±³™N ¶iÁîš ð:^9›¿7{gV@†±¹‰·ÄÓŽÏJÚìîC¦SÍx¼·Ó²UÛ“ ÛÓML†¢Ë­ âöœßM?Èžz–œ ]?Q6E#ps™ö)™þ »ãÊ¡AiÁ>¯êGéÆBÔ+  >a&ø¹‰˜½ö@E a`!>x}ê° ÕŸ,]﹕ gy‚§8gÆD/¼«úlÉ©&ü¾>äŽ(˜qek#úZ‹„<6Ž¿ˆ¡¯£=BNŽÙ1únRŠ ÞŽÞ/Y¤ ðì,X¾¿4ÛÞIðÙKÜâÊÐß1¦ê6êœmk† ¢k§ân_BÝä1w²Úó€½ÏŒ7¦ZÑ›½u™ÛÈa¦q*§w‹+0ÕlÇïÏ)Xò)í0`C•½ƒíAwLÑÕšV"k)Ìaäžj¿\v ò7ÙywÜوǎ§,ÛÞßZébA7%ÿ ïÉNì³1©´š¡ÃJ ˆÔ,>ù`ð&»ÁÖÇ~|Ewy°·/¯Ü’­Oô„H‚[4Z¬UÆ?6ã«Û¦1CFlz–ó9,Mh.ßebö>c¨‡ó6#S Ø9^:®½Ç/>7,¹òRÒ_>H†ÄØÉ€ÍrÄ6µ¿ ™Ô~ðÊŽÈñ-¸Â°£ÖÀ,ààdW_S4•û4úp?v/†Àï—Ç`x|‹ra` –.­Âž`mö*6íÂÛJˆ®Ìæ¦#@b2\akŸ†¹ak^k’_‘d/ËF~>õ†bÍbªôò'žxÝè-ª{Ï$£?T@mv³ãZZü£î¥µ&¼ rÍÜÔ7|ü)wævôb¥n¡þuÿa¼`ˆÿ€hÙó Þ X…±jÎÇ¥q}ä-âôoˆ¾ËqÂæb ÝW»éñUº\}ZEv«¢ŠÑz\OŽÑ Y@¿q½p[|×’ïÁN<«³ü¡ôšÉòqûTÔòм- GNEÜv©VôÁ¥^:,“Õ¤¿9ÝÕŒä×%PíýH\~‡„» ´l ºŸ‰f^Ù.Ú÷2m0ŽàVJ_ =NÆÕ7y¾UAÌVíMÇ 3ÉŠSÒ¹—œ²³½´è­:hïkröM¢}–ïùh‹%÷z(w :àÁÉ‹Ex³Ó¸àg¢²qг!˜ƒ c¹Ï&ö-?y)8ø&YéÎV4ÑI×õ„‘ï*òd‹þ»ƒÎ¼iÏNàÍè;œ;Ææ†ÃÊÞ`‡ç›6ãWn¢§Ê‘þøûÍv¯PAÐÄܘJ”r!«%¶öR¾‡ÐÃtég:’SÝÈ|xWäøëÓMì |+ªçöãƒÎöxñ…üÎU½Kƒ9½O]Ùe.ûòåo' #Át‡e¼*oÀ‡MfÞÙ††… ä@ "ÒÐ#…‰´ó6 b·V¼›sozâÃ.”= ºH&ËŠRӠijj‡/êGÚá™Ós¸Sö*F¨Od®?‹,ã=¡3TX§³™ƒ¦ shLýó¿ØÝ[­"©¡}“ç¨p‡X¥GBqË´¯à¼•º!0ƒ~v/ïò>vqZ(vA@O|¹Išuˆ’ ])ËvÊçÄ4HC°ê`Ö%oÆ+ãy+ ò±Á˜Ö†©¬ÊX¤†–eÿf|—ËÅø&ã¾SÜJeï°2 þƒY ÑìðD¡¾áë[’aN't%ë¦%’¤qËŒüEOÇæûÂLú‡s¨q~©ú—$£§ëÞÒØÌXäd°¥;Voi—ØK”ÀWöfLÂ:‰´·½:7ôÜ…5ÕÉ’\>&BÐŽí8Çׇ콓5¨áÕȇº"€•¶ †âªEïGc¼1Å´šÇ[_ÞQFkàB‘ΛШŒc ™y•½[™±Õ'沫P©ŒÔ<ü%—wà…µüC`8‹ün%a:ôj:þ¼%Ë„øKã×»•ð*•ûÔŠOa®àB`­·Úå÷,lÝ”ÈØ­ONhLÃFY å6bF ž.Æ”´×n3MD wºscÞ#Ë0ã¼\Þªæ è[üù .l1ïÈNTa€åûÑ:Ìôbø¥ÞL|*9N¾Çœ õÂTÇ^æX\v ÜÅÚ•>Ǽ-—žõ/»Ã+Üp¥¤òÃ\¾['ÊÙʦ+w<ûp5VIŠ¢Þº2ú6u¤:. }édiiÏ­Ì»‹uÉ0g·˜ƒï™#ómïE:àBE¤¦ÜÉæfÊœ²pM¤Û«Ïe1a€í e8ÂŨ¨òWz‹ ÛÑæ^Ȧ÷fh¢-(´*H,Èß2n;áìzpvëÐÀ¤v¯ìS )Îõ–èÅ;»zc–÷ï8š¶=¼_­¢±;‡º J3Òëß6ÀëM<ŠÆY¢ºÏ,†Áúüi:¶ ˟ム}ƘQ/§k½+Bp›jò€ètMAM+œm¾0r3Á$ã^ Cò~‹ LÎã¸øM¦3بô¹m˜c|!ìâ‡{“Ú'^¤†kêNcih çŸÓe½ ð:^c ¤\™EíÊ[øž‰“·Gê©ÔÙj¶Cnò~¸jžÜÅpÌÌ6ùS0·ãœ}yncûnûñùšTŽÃ­d2¯TõúÕmëcºrþáÖ”¥U;i$×WÀÏx8®³nŠ&6h{•¨OB2#>p¯.³Âcv£¼ª\â:ÁjB“ Ýb¡3µ p®íE%N›ÊMéȘBÍTQȲ÷Ú>Gqr™Ó h§©´íDDgo-3PƒҎУ?¢PÝ{âu’»ËTœ‚IW歷\ܦ\…Á‚ö>öÓÎgNQ¢£ï °Û-o–MŸÙ‰IÇDU°à»˜GYN¸mŸ=‘µ“x‹vFa+®³Ã çߊޟ…|B´¢WW’OQÅï^y±…Y|©#QŸÙ}2½ß*œÝAج¦¼·u„‹Å×Q¿¹·â¨UkºÏ=Ìt™kÛèFBÎKÓ‡¼oöúÓ VUEúTüCafbÉ:ë6k\D¦”]„Ó:–Ol˜}ƒîC¹ö!Ÿâ%ñ —DZ’} ®þ€¸4ô¢$^.M´¾·\µM{Î.Mkò´BÉHV¿AJlß0 ]6a†\Yf³æ¹ªø^åúðVϹ ©$·ògÆãTÆÛðý.X0tEdjD–€‚pWnÆŸœ©­„m]2:…aÒwÄj<:æE - kÐÞ¿Ç"»ð*šýÊŽ~ Ô“²M x™´³–¢ìhºt#ÒaÂ<Š˜¦vMÀÈqˆbü=]k¸CS/Ž!¹üþò:'våÓE`úÔ&…ŸNSEÈ~eT«º¹£  nÞ—¶D[ {"®Ø7jËòIÔÅ#ÍG#]Ù¯œË¬Ý€79Ô¥÷.„®îu{tþç;õp~ó´Hqr]í2¼ôÆ,Ñkº!?1Y‡§DŒ)TôÔ}÷½6JFšØ¦;0×FéÞ«þ¡C›®{°‰d_LJeüïcgÇ3©å5šÎL<®†¶œf‹Ùód€‘ 0Ùþ&ˆýáú«iö‚E?Œ®’iê^ô{ÚE åǤ©Æ{ñ¼ð¯ÛÊç=Ä}Ü›>èÚ|Ix¥.Å]ÃλG´`0nît.ËÌŽNa|’%G4ïMã¶úµn*¥–7¨œÖº’[Ÿ%AðØ¿%†E2d¶àÄGm{Š´O]ëÄ&… >GHæ°± Rbœ0„ÉyÏ­è®;!2¸Íï¹û4Æ‚ÓlÈQêIæÂNµ}hïicG?eü`˜hIÔõHÅñj(¬ £–VGµómnãÛΪ%5dž\­¤ô‘*Øå—½ŒêŽ‰Ž³Èžx-‹w¯òá\ÀÆlwÛ†n»l¬õ.ˆýaôê&±o#¡pÆ´«ª‘qËÂTܸüd'¡9±}ïvÏrwÔAp½FTÃo Y=yZcëF>²üÜÍ‚–¥Þäp>Y‡…xºY Ÿ´[äÒN}ÍÇm2g µÛpòoyj¼èVŠÌwˆÔèá_gïɪ³‹0•ÕÜ™¶‹¶¢—Ãlª%Õ¸TeÛý•ì#‘wquÝâ4˜G®ö]uBÕge£ÒºØª°::£‚æ„3ÝÕtÝ’vC¢;1—hÜ™ å¼ñþ]KÓÜ ˜l¿MÛ‡k]Sšð:ODLÏTáÜ©èÝ®ê혪/Ù’<Å›-[ì(7#JG„Ök?uÄŸdz‘x˜‰ wIÕª¯ÔDnéšB>AÃNÞÄ%ù‘ Ù„r ®ïªiôéƒ&-²Ãשêa pÂoÏàŒñÍ•’þ‡Óï–ª›ù.öÍó½ ,Á]ÁáD]ÝícÄ4\Ú²‡QqYÁž ˜G†¹À²_gKšÄ~~BõÉŸD$ÌŠÔR#:–ž9Ñaùž7—´÷ør+j;0ÎéOØÊº/À(Üx –&?ï’AW5¦KÔlä5žÐÐ75Íû^4BŽN Ë›Oãcôªñɼ„…RXo“¢£vì`LõÉÓÔ ê¸yÞ±¹¥©ºD^ ßÅ:Qk*´Q/ÓDv‚èÛâðÁ;à 9q›ÚœßÍ™‘Ɇ(ÇÙzºÒD¦<"bÐÌè~}áÄrÿn,ÝAËYžîûOAó–'•Ⱥ鶣´¤ø›ËôKYòÐý.5/>äm –ÎxÅ ä¯ÜÃ×〆ÁniÖ³g‡Œ‘WôšuÅö±W\Ðïe×Ö ‚™Ðà-¨Ù*¶8ñèÞœÚNŸÓÇŸ’µŽÃ€Ò¯—›´ão¬~§Qäo$c%ßçOƒŠ„¾Ë/J²¿®³ºB޹ý@EI6rçÒ[» ššô}L»ÔÞTó*ÒdÇ«Tà xNß­ÝçûÈibƒJì‡&÷ ØaÚ–2¹,¦æµÜ#¡ö ƒaPÖ†øª¬ØyKD~ÍB~3¦rþq¤»Š¤S|EÏÛ‚.-+£·J„祇f)øÊɦ·V~Ó›17ü õë(ð1¨òýVý›g`‰›qQFtï0ìX¦«lÏÑj(Ò×x:ÜEeºjŒ(\ÍŽK~»‰PDÆŽª—Æ#èLS@÷tÓàÀÓh'7hÚê¼,#Q™mÈø”?y%I§ó4ç0½ ýGA4±âÒêöàí°ï“ŸíÁ'Q³?‡ÆCqõÕì×Ñœ°) 4'k6®!ž5Ãå?ÊXÞI°ð¤{ŽéÀe,-P£o…¿ïåÅ{;MÎMîDÝ}¼tÔ8µlµšfüJqx’ ø&ÇÂ`gÞû¤¢ƒzÇÞ¥9àürÊMVÐÝ[ÎOpÀÉWù‡±.ûÜ,Ö-ï.š½ðúáÆ©ÌnšŠÉEm•?1i¼ø¨ªwo{Ò ªOo¢„ P÷:–ºï÷H,†§õ62åÆúTÅ–•¶[ò±ÒØ´jo¼aE>Ç^˜ðrÞ½”_æ Ôý)«};}MÜ® ^Y÷EãÞ.뢈`}Ÿ¡•­YÎÞÅÖV€¤+œ‚>ТK7ÝTv¾¦†Ææž’1zD:ë±²Ø+"F`‚^Éèn8¡&M#y%›Ò/ó"m€Nù–_œ§ˆ-NFhp}ଘŒ¼>Õ9TI|›ìv–#LÌàå8Fù&oÞ‘žÆ àãæ[‰»%®²cåù¤æwÄ ^$¸y×¶¯DÉWLæDöÝ_îB»Ì&8.Naò3ËÍgknÛŽÝš;O…åb±+lFšvø×oÄå•l·§ö¾­DN09¸Tfzdtyp5ÊøªpÅmÛ»«yrµNUÅ6”X«€™Êx”ÙmÀÛ…ru¬­Ü'zúå ðÚ©à1"…Y“pœ³4¥7é„·–š¾ê-åc§ùü÷¯žÿ_çÀ~ýµÿ‰/¨o÷ÿôÑÿ—„8XúÇý_ß%ˆYCd$¬e¤$$Äd¥¤%€ÿ¬áp[)°½µ„4±ý_·ïGøï†?Üÿÿ_P¿çÿ ".õÓþùÑÿ¿Oø%ÿO$—Iëï°ñ°[óBûÅ=“˜Ôª7 °¤˜„Œô:‡I¿}A É˨Xœ”Qr½K ßôë‹ Iƒ$Á²B`È:B’?»,ÈþÅCD\fµ‰’’âë›(. ‡Ã–ñ+KŸ+%J~¾ ù÷Nkn6ô@:¯Ï,!MºŒ$-+#$þŃ€"1Èϲ¯¹@ú’,)$.-ä—]ï8É^ægy×\.­Ë ’“ê'Á¿n éŸå]çj]ÃI$Ɉ‘Hôn{ã?/à“K¬¯À&ùo"Mòßôŧü³Ü?¿ùÀ¹¬D Ô.%Ë®ó3—]Ï‘ðõ•B$ÀB)0H"õGZ’v¿ÈÆ_rŠI­ú“”¯úû_÷Æïþ¨üÿO|Aý¶ü——ÿ©ü—“ø!ÿ¿GøÿO2² ûVý?É­x’<9íûèÿ‰HFöÛžŸâM‘ýšç'=ŸÎk—w–´ë×·”îxY2î~OwR†A4 Òî‘R¨"29ê[æÅ#›ä“dgþRà—ÅãdA¶ ešý7)/1$‚¨^á§È÷oÇÏøll;¸âÚ‹!ЉÈ)T†ÄìÌt¼±]Ï6Á"hÜŒ/Ïž_ ‡ ¤è?¬*ç_á¾NÕ¬‚˜Í7žSÍ‚]öç`YyN~kóˆYn—u„:Fnh› d©­N³øtõ “Žà• ub|ù¶]¼ðÄ|ºþ”8*3Ϙ×(çjŒJeïÚÌÂiÂ;“1Ô×£áe§Žq}·ìN*ºÝ~ IôŸZ?^bñxiå¸ãCºüÚ¶­íö"j*Ò-+®KRPRå› w?ÜTäª]™[lt¸2Hìâ¾Y·âîcZ@A4‡’ÒÐÐP9 ]rÙ®2ø²Áš ÄzåwŽWÒÉ é (¥¸fߺ+†¥„¹¹•7w*í=Iƒ–¶K.¸›*ìU“÷F\Ø&TÉ9r$~óã€c7Âw-Aº¨Çùmç÷Ëlæ½ö|?€.–À÷~PùÂÙã‘zàveeÈ›Öna¯g¬q¯:Þ` ïáçêÉ›F¢k#†|ˆízw©YT[øBƒ)yÛ¥´ËŽnÓ~—îé#+Ä‘Ról/$§Íá]º¸âùÛ#M»ƒk¥€4$ñ#žç7ê°=ÖtátMEºøÆ˜3l·°0S6CÌÔÓÅï()bâØnd×lØSÒf:ÞÚºßh¿Ee5Ux\MëÒÖõêj´œ”éy˜¼×í&”™ñ»2éMVôh3é3¯Ï»™#ž„ Xò)3Ü“ þ6¡í/áC®’Ø\eÀYöŒ$3¥[Ïߨ#_°U•Køµ‹SâHi·Ç37ÈòîN8¢ky*âÅnž5t -Õ{ÛOqw¥W9ôÄÊÓyèŸJ²­˜ŠÓsUY.¦qíW—×Rœ÷˜Ö\xHõl?äå‚Íôîp~æÒ\ã’û«\„z ëí’ûü,%/#Jx»Ý Å Y„Æ\v¤fÏàW£]ðNعƒÉ\&Øi‰í1÷dR˜3Nx—ž”¨ß¾ñÒdQ×±¤ŒŒÔÉc‰ã/„ĹöÆ”­@ÜÂwí«êÉ—¯çÙ£Yh»¨5v+šBãnœµC,å‹i›ÂGsï‘·Ë—¦í¥uÓC£)ÐíWÃÜùiÞ¨dÕõÁ¶hª‡‹¼8_zeO&?7;íÑÛhsBðCµ[šPzI/°sÊY²š(Èqõ]û U@ÇÕÃÔ¬®¸-!ÒÅýüÚ1¶g‚“Ý!V–ƒúíJ)u`¡;E” eEa[iæ£ÂN|GÔ»:øÒ Ÿ¦”ªÊ™…ú#ž.:ì·…©ÐÅð Ón³±t»¹¡sA#Zë©ãxA)FÊÎã”)›B£Q®uÜjž "ƒ·›?Ø=£ŒUˆÚÒ 1ýJ0ܧƒè39 w9ÑKê›uÌ!àÙ—®ß<¨ÊuKd9EÕ%‰/“^8*8¯PW•ËÔȇI(B]SòrŽkñžV›9ojz½r¾ó®¾e5rŒÍpÁØM&ƒ—[d5û\)q<¬YÆJ§Ê`,Y´ãnâ¤ìÃ8m¡í™äâ¶ÉÙ‡#6æ]ÈØv¬°;ÿ<ïÕ]YîO²Ô´üîdñ¹—SÄ G%r(R0W*3þ8ì:“™éM•Ás›Œ—ƒKÏg¸k·Á{ ¯Æ åžÈp¿ÞªåÝHï¸3…šÃ8óÞu9ÄãP´qQ<¿ñ… ÷7ë]}¦[$¶ó8mÊñ$æ×U^OŠÒóL/žÚý¤Ù„7‘O'QþøÁýòMÀóéÿ+üÔCo¨!ÔO÷Uy@ž‚XdÏd*ó˜3fÖ%ng‘\àŠP×çt({9'.Ác°Á¿Ÿk"6Å>æ äúÓ§ªzòï_ÐÞoCœ‹ç7˰{5ÑuÐ2F½{ïcx ù÷áËî››Þ2=w¡1¨•6,6Ø“3Ò*8*¶Ë¤?¡±Iº}ß'!m2¶sáZpkþh5“ô€ápB>nÞRšuzf4zï ųwa~ÇŸ¾nN¬C0Æît e­Vw‰Úˆºfuü)][b%¢õÃ"âI—aå"ã@• ƒjÃò¼ZÌËÜ?ÒG—˜p¬Š‹µeÖl³™¶ý‰kÂÕépJm'Ãß”³¥<{/´'fCåeƒV¯–Ä<£Áý;Ï(ÓqZ(‰Ò·­y ×úBYæTæà|,÷ÛÌ©S\ ßò6óA]Ä!X©Nv“äJ¸KCbæ6:å§wK¢éÚ­œC^¥'K82ëɱÌÝ Jã /àH9rUå ´ñ¥`m@ãÙá8„GR¤ºJÇ»QÌ‹0„ê¹] @öÊ q_Fí™û‹Ú•éˆÌº‘ÂÙçZ²—ž“'‹¹zÝØ™è ±zâžn{ó‚QMQ«[«m†nó®Cµ ‘"ï¯IZDl~“I-àžir¤U ÃËk§Uºm¯Þ€î¡òkÆÝͧmšv2q‡´‰¼× €ð Þ H€°zQJÃС··´ß&"«†ž Ú9ï6;Ñ/ ãf¶ÕY_gÎD“lÌM¼s\žE<¢j¬\ö|'ý™7Y²Ü3û›žZµ”{G䄸3×W'ˆ3z);x‚›žš»iÉ*ÊNÝyöbß‹K76ñfògôyÕɸÕ]kÜ!ã–Øƒ±Ýr‘‹E¶.‹ß%:¶èšG+ƒˆcE â-wxÎ=G:ëܡ9$2ã“7¦(5*ÞSK:S¹u=g.BÝè1âº,‹ß™Ì¼‘©Ö|Lž#MÊõž‘m™ñçw§<+ȳK7Äí‡Ì˜¦öÇ\IÁ¼ñq¶yÈÌ“ûØp &çR¯Ö)ŽP· E "’uüç#x4ÔŒÌYœ,~;Ó íÌ£ÚŸ‰X˜©7MB›.F.ÕA òzÛèùáB󾩭Ì1r/ GϺÞ\lôvw¥Ì2ÔÌQÝå©iu>ºë¹ZV‚®©ýËm£3É»ºWº}Ÿ\nv{+ÞæÃb¹ ¿Ss Îú‰f±ôZ¨m‹–Ïê=œ›Ö“û°í´®ZÖ]÷ðYŽQ0ƒ«Ä [£J½U ÞŒ/%s¤ºäÅ#‰m£¦A”R–ŒÎ)`¹§!ÏØµv¥Ó{kÆ©5\ 4ÌêR¿½%&]EÎÉIReZ$ÉrEˆöÒtP„ÐÑÊdß Ïy”ÁÁŒÐÖßD[÷ìv/%spNWçÞ—Õ!m7•ÂÚ% ï÷°$„ÕŒæ¨ÆÜPY² ê`„”Т”ÔŽ¥œæjô‹Ìjnn:»E#¸ãn?&}tiÂ%eO鎶À(žã;j@) jÍˆÑ gYS.ó'è3ëŒ7ƽ.`Ô;F`Äj@ü¨ÁÍmMªe›Tðî6.W#fÏž2…n<ÊN¼°Uï•§–ŠÊ]ð-Ú©kãŠ{TšF|  žŒfrH±ÛÎr5Ùóùƒv cKo{j–ðk.G;±6,è9ü•Y×§Ô¨ÄaØ•—³¤åY2zøUÑ«tV ½!¦sž×°6Þ—9uŒ!ƒ”–†iUº¼Ž™gy†êéîÏ®ÜË<6UÝ t¸hÈ4¯ßá“ݧrxÇ#v •ûËM8Ò´*A6¥Ñiš,*ºêîç2LKPÞ®Ç<©¾UÏ\$$îRæBÎ%\›GM½'Ç^½†¶XâÓé—¯«Cý“”mò*Ïk%0¹ža i ½D&?G®Â$ÈñþV#Ñt ¸vÇû¡Ø´¼ UïäøŸi åÎæ§Fh?­»åÈxÚq¼€”º}PORqàD„ºiÙlzüŠÇÁ  š—Hi“`þ…ý×îlÛ£gÑÄçWà`1¿úÜý%yüaæû6Ž,÷sÚ{͘šŸæ1•v›ô,ih_?º9šeœE»53žq¬)¬G«cîèµ±±gÂÿä…šÄvf|„ºv÷Sæ–eW5ö¹×•™ÖqÒÞË2νn½˜ÔrÖGöThï„Ïàìi˜}vr"3rÿ])Ì-éêí1!‡½‹ÆÑá¢Ëa ÍûžØ§[1¶ô<›ØJy°wØ»Œï¼×3åïc–Iˆ¢´dHø!üÉQÞD颋¡å£ÓÅÔ‘¯=¹óL!íu~V]ø>%ì™×Ÿ&ý§Oð‹Ïå<ìˆsxòv¾*«á]ö‡ùºA<˜;£èÄ£çuøö¢äs,ÂŽëL Ÿç¥6c ùW‡”n°™‰¡ë/o;¦¿]/@iÇÖ¤KôZš k`ðX ÉàGl–æáàfÏÆ l-d q5ç3 ‹ç£÷.t CÓ*—õNãŽGº™O-æ.¸½3…‘78ƒÝÂõ¯ËwêÝé•SÓó ß~±îÖ½s£-+¯‘µn–;e‡…v¥feeqÜ`_‘Ú’a¾ãšÚqö$y ÷%)Þ¤ñ'çV”«õodlOûðL»÷üü‰¬ÂQ?” Öy[)ˆZ8„ò]ÚKÈ.I`:eÿä]6%B5KÝ÷Žà¹ {è?N}¹õ¯d"Ò—r›Úu¯ð§Üïhߪ‚ æÝìµ%þâmSEö‹!&³·§°åÛÇ2B›*ðÆ=*ÁT×n0Ø©¼:s,Óxµå^#Í]$Y6]w«çR5Öž‹Î8ôB9t>Ô^-àxKô}…¤ý\ò¯“b2¨V$üC Ï…1]{¶¥yßœðÉð{жõ×iæµÆ/æ´m‹9Þç¸0Ž7ç {hÈ äGèî·n¸&>c˜Bâöo¹åÌfÑ•zùÙ||^0V½á­ŠÌ Þ@E´P*ÆžbÇ_¼$ÙÐscJ/^—_½J?…bñB^4ñQù•DÊЉ‹1Ffp°ŽÀJS®èÖsgy-Ú¯hl2É\4Q½~±á–Ë­adVܶ@•uaÛö˜Ý{2¯»ÎÄ·6ð°60÷Ï ¿lW^zÄÙ·Û@°ç¾G·i'/Ï ‘âô‘Æ{&R—x,ô§À­ •sÛT¤—2öçàÌÒöQ_?ÍëcÁ›ªÕ®ßEÜ~DË.×Fõȧ“¯ßnnòP¹4­–„£Í¢;t\.Ç¥uC®†@tG=íØ“çWú :w¥ÅLO?kÍß,j„¿­ðPþD’~"÷€NZñš¯éI¿ñéövÚ-ÄþãÄí¢ÒÈòým%0PÐŽ´“n%èk‡Ò€Q@N¹‘è,ŒPÐv•š¦àrÚ+—Ö‡PID¤&Ñm^N/Úœw·'ãÆ„…æ˜ûgÚwÄ꼬GRåJM•ÆßÈò8sB’>ÆÙµÔàâC~í»ytø <öe9î?¸É—\zÉrŠÇKü ³bG'mÖ(ÛŽØÍ‘á;P¾Í.²›ý¡ {$+«ï©Ìâ)ž9¹«…¢LYÙDŸÅªò4Fíq{²§÷4kïÛy3Ë·UY.—Sf¡aÆ÷XSðȨZ±¥@²ç+d±ê]tt D¿â’å¹IÜœ‹ËmÍ”m±uTäqûÆf[–G«“GzÍØSðN[oqûs»¼ N\<+»ÿÊs |Tþ:'Z×éºÓÇ{Bê(YÜ¡¸q}zW4> Þ·œGÎy«K³oÁM™;Ë,-´Eð,°Pø¨ùs7÷® î÷õò™¿l6yåêÉÙ¶ÑÐ’rýðôxlUð[ØCöÞSSа†Ã¥U7öd›BvìÆœ7õ»Y‹ämaó·®—ž3à–o®t¼oas­Fƒë}øæºZ4ÎÀ4ëƒ3Cïg˜ñYz’”4Xª)æJ›ŸB1W ‘‘fmãƒÎ ûo_7×–b1„*höœäij¿Íú`NpqÁíUHÐâAší’Ám ²ûõ#Ø%³¢¯õ»Ý@\o½Ó±Ô`z&áˆÈ­c£Ë!{xÞL>ì  &²Øb€ÙŽ[¯S{»ÂÐ=I›Lã–û·µ4²öû 7 H‚3f{›¬&™^³ÔˆÁo¹|çfàå×*:©)·®ét½âSì™N P7V6õålןŽÙ&¬r¼‘½‚ÅIl+} Ž}çb¡¥e`ï‘òy+»Ì5"ñèìü)÷Ê}W¨ù Z-BÔ¹2#ZÍŽ+¬i)z_ë™à}«/Xò°T'±dÆ¿ˆÉÒBo¼éQ´x¾™ÜöJ,/¿Í¿Pb»žµ«ÕÌ¥Ðýæ7Ïïϲ7²+y$ñþ@Ö™Cî „QL¦…plÎ6É¥¬ùjÕ¬k¦*—;.gešŽ 1e¨mŽ­¡ß¼_ßdð_w½Þ~¼l€ó\>7âú‹½û!/§ÓÜw¦á´õôC¥û´ó’²Ûò ÎoBr”ƒÙÜgr¼/…¤ÃrÒé˳ë+YØßè´JÙõ½Í<žÀÈqô“Y̺æßª ™Ö¿¡na×¼P Ê‹ÕïÚmMÙ‘«÷˜æjŽ4×q0Ëu /Í«obÂ"Rò¹X©«<Ñìy-@Ÿi½™InË8ªý)e󇨯ÀÁ.-¡¦L*þTý³©<×·"sNÜ?äÁsÑ!2UÚ\ò ”âUÝ¥ÿøa@½¿=UØ ãíz±ÆJ4'´»,T¹ 7T%ðF#¦wú×Ù2œÅš†ïTM,ðoº-MYå›.Ä(gÍÙ7ðõùÐîU5Î.iÚXí[Ù2Αr26Òa‘ v¨„—¸…o¥o„ q ?`ŸÙÌ"E…<ý¾Øû¶ GÖ|&ÕL³TÝ#5{Ïåñ=Ý );×饸‰ÛH†Å zÒªK¬Wå0ô"ð ïºUI!UÖávöcASòêËM<)“®äœ@dx%Lÿ^Á3™çÆa¢V` &,¼`=÷À¦Æ,¦™™úšP¥´Û²’Ü‹w¢Œj׳–(Ñ[È0{–®¸ºˆÙ¦W–ê±'9nô¶ìÃÞæ$gids“ßgi?Vt²R˜ö$Eå‡ñ¯Ò1Ë-)‘ê¶IçÏ„‰©è½ Ø2¦¡µA™¬îk‹+¨P¥ïª>Æû®hôâ*z«T¸Kà!‹m,ZGHI)®5eªHWMGÎVªÒoK—wŸÔ‹HY` ´N “âé xÚÎk@)-²Ç&Ü—œ%+aXèÙ[”s“cé1]ÃÐ@ä"ÛéÃt‘”R )[Â"fÉ Â‹à5©ã#ô1”;ø¯S¯x-îæÙSt[ëmb:I5+Ÿâh´½Z©MKëý‘ó*¼Àb=æ˜[z–­ªv½C@/2aaQ´N|º³ù­ mÌ•Û Ú¨å8Ä{*‹ÖÕÌæÇ”Íš¬1çßñXíȬ3£daYd@¸Ù¸\IH#tj)¦¦”I=WË"èf²§œóh⛤±ð¥6æL°ŒW4¿=ú캨ç¬J¢¡KÛQrU®¬“ë¯[d1ǨOÕ©Bv(g ™z“.Ð.eœÉßc!¡~¤qîÎ|9÷3—|’œ›®ëVÎ=ʱgV…áü+s³§”+MªÜ¾/Û óÀΧÔ9öÜ»ÎpËoVCyóýFnTMRaž¨ó¶½1OnEÖÈѤ¶§Jm‹9­œPÒvÒçAÑmGµ$…HÍ%jSz™{s M¥¢üÅ[c®¤dÍU5eåyÓëeh_¶ß””bÅ>1Ÿi¸]Æ?ÀQ=½.%Æ*ûzïX õ̓vÍ&7Û¶ëe<ËÊ3Í·Ë ê!òŽÙiASO½’–àÔlr½Mbmß…·ùd(ÑâtŽEÀ‘S†kM.›ê>@ÙqíoÆë:ÏÉZ.\ <¦ˆâñÊ©óíuU›í÷AÊC©Ç—èÏ¿AïE¿~¾™Íå¶/^ ­%Â$Ý8“,uAáå½Ú å§!úsV7ú>ØüÂæËJj9­“”…ˆ¥—m©³F`@‘ÒŠ¯m÷,º|ÅQ—à=UÕ%-e혛ֳ\cQÓ¨ve›˜ëîͲ’£å©evgT$÷[$û!*šãE Ž1%ž'M…Η­@öŠ¡]u É=Õ;è笑…Ø}øü6»ûÀ·×í¾Ä •IÓ”*¬LÞW Öób¢¹(÷"]kÀ±oê¡9`%Á*ÅN{XŠp¿Ù©Ç,;-‚¥„YªR¤³ò¼ZCÄÄ´ãö˜zu½rŒøîø8J–Äd‡ùó2¾Ìƒ÷%7ž(¤¶²T):`ééBGëâdíØ‘=˜E^_³nÿåîÊ¨ÈØbg©4Eã€x« E¢C‚…’EmäË5¿B'«XÍ ™u¦Ïx)³ŒBßWcp2ã§NÑ?¸A]xøÒÕ[jÅOfÉ Ñ$['j¨4!ÛÌŠS#·h\‰Êf”æ¹yõâéœèÛÕõâ·ëÙVßnu SÛ®WèO@KÒ43ž1|­vW:êž4äþ¶ùÃUõ|•ˆœB ²˜Mì+Çj/wݪMsH´¼möè{ïÆwŠê1Fá©~­‡³ÊWƪNJóG#//·½ô`7õÌ ¦uh!%h¥'Zþ |hg¦a–d¾ýJü a ? >Œá}þYãlÛͼ¨k .yÀü}µôa¹áÞÕ„?ÙgV¦ é˹H(UCA2 ³ïÕÔhØŠžY>Y^^dH¶ÓbKƒpL wTÊÂnI¹sqÀ¼„4ç¾i@šsß4Oà(’,9gšµ‰4ÁÎ{²)”Œl/Éàí)1皌Sl,7¬léôâ•‹fy:`¯j–6?‰¶aªM7.)…êîÛ+ˆ@˜hhU E˜ð_-<iØžéx+”.bm»?nÌà´‡s°gû«Qlóî…° ýOœ’BŽÐ¥]¥yPMKÀ"a1ôˆç[÷p5]`–"¥¢ˆ‰—LaFDoÝ£Òta·TXº¸¸3i7 fÍ3€GÚ5éâ¢ÎÑl­^]®yˆÿ˜$€Iò›·*š¤ Îg*y2 ÷Jùc* 7]»²# ÑJõÕöã¦ÃÌ£›”!ïÏ…Ú_Ž·©féÎ4ݪïzˆ ,,ÑouB<רó²B¿©HŸâ. f¯Þ)¿¾™¶Ú=)ó'—¦Ó/Fgi³O]î‹ñ^-CN… ZÏdñ‹Ñu½É/ p»f¸ r·¡‚U™ew­pÊû=Y,Þêç7«m¨Ÿ«¸½)äWˆðm“pD«c8O‡ÂÙ+n©9…×ÜùYX„¸4ƒ¯1[·"âx¶¿Ù™BéÒðöb¦y€KÃöN–˜éæ·7¿¼u±!ñVS pZšoòÊ[ ŒÙ9Còž´«.“²a¦‚ñhØøFú¹þýkV€nJý1ú7ÔÚ¸~úµ Mî‹Ãtª5#I*¿m¾þ#ü?Ã×ö_ÿåýßIˆ”´´¸Ôêýß©÷ð5ý%ÿ:ô—þAÿᆭ¿Ô_†þ@²ôÿákúKÿuè/þƒþß#|M™¿ý%~Ðÿ{„¯é/ûס?øý¿GøŠþâbúK¯éôÿákú‹ÿOé/%‘‚ŸDðú—ðSúÛ:[{zÚš <ì¬á*HW8él£³3 æàaí†øNÿóùÿô'ÿ‹ý8ÿõ=ÜFÒ··KHÙËJɀťÀâ2)àbö2vbðÿuû~„ÿnøƒýÿ?8ýÿ ý_Zòkù/¼‰ÿèÿß#üÒùY€d¾â]¤­ÓÚ‰iq1!8XJH\Râ_x\úþXÿÿONÿnÿ—“’úYÿ‡Hþèÿß#üüü7Y¹Áêùo“Ó‘8àGàãùoff·ÜÜ\yyy333 …B1 ;;{ZZZoo/&[=þ€Hø@öõ)pª’§ÀSO¼ÑÜU³¼óù4åŒÀ]]ÞëÑÊÇ$s[öÅœg½Í%ÜÂÁp8e»p§{çíÙÍÛ3ï=•uÙ®<'ˆ4ÝÁ}<¿·MVÿÈî•#%W—&VDê| ùSGõŸi]Rݶ—­NÁYV_¿D:[ÊùTeÒ”µaÙê-±Ôï3©‘YÄì·À–täXv{ôuÉ<™Lá@Í‚Y©ç V1$+Ç Ùõq®¤÷)þ–#çíilÛpû¸F‹ºÊø}tÞ_º“C¹ò\3%«¿C¹Ù¹ê}“\±7ç>ÄÊ5©jÖðèïÏàx‡¬¥»L>êlaZˆ]ùÝÚZG­Ùš—E7Fߘ\½—ÍN©™*sóܽì»ÉvL¥Ÿ-×Óyp’Áˆ•íå{EKcý'£+ žFBFßc8hÓö.œÝ„>«ÚÞZ°°,¯9Snà½cB?Þ#6Ê=gGà£BӲߧ7ıû½¥‘Å3dó9Ž:‡kèôÉM‹Ú¾˜]aþÊì q—­W6Ds&œ +9Pª‰¸?¨Ò&6ôÚdüT†zBãÁ=cõʼnï„6ïq½´u¶1D-´!¡(éTvu‚”S V9®©o0]p†ù=ÍÅ%«ï´ã‰V¥~"ª×áZZË‘,Çã¼ô©WŒ*˸T˜ßûÌòœ9g3{­€Ãc»ã\ù9ú3(ìN:íCw¸Ï@VŽÄhï[û)—?•“–oØ9G¥‘=Z+)Ð:ë)y|ÙÑ<Æ*5>‡½ãÚÁ–ƶkãÙ‹w$¢!+ÔCSP·Ô]:x÷®‹tzLï¸äC- ”ÉšŠâ¾e˜A*t*[³%ÎÉäÚèðñÖÊÜê¶kÁZ·ÔYQ§¥YæúL¸)|zÌz”'Hp&¹ûð([˜¬x'Èä=Ó²š81RøD‹‡×¯FgºCkø¶Á^¿kn*û¾’uÇc'+£™™ÝBÊm?kÇøG ý ´Ó)L3±}m­ÕÇúŒþ^µð›M]/ãGØ£ŒÔ³‡<ÚA‡êbïù]? Þéî¹9~ƒëèe=<)²÷飛]jÊÒ'Œ&„Í•3¿{ÉEÖ<|ؽÏ,íðÍéÁ®K#)BT6Ï5Ý]õÏÝ;~RÎ*q ëÕñ®þÆáwªš…YÉ7Œø5É¥}¶ó÷½ÛÆÅ®rün£ö5 Â:ÎΈãþåšXWîFâ>Åô9 þ³‘S> ÝÄÛ÷­ö yg#e…÷³èH¾¡N‘Þx™[¬66±áØ98?}Jâ´½ –¨Å”Û–~QG(;AóÞkª”‡O”âM²€4Œ8’|-Pt 4yûº·`L4¹ãßÇ×'Pç…g ÈŽ¦ž=qòðl..WK¾Æ,^š*žM±$|_|'GàNêÖbžf…˜Y>„ýéåü£‚¹vû—6Gëjš_麭‡ Ždùy‡²/yµôí‰b¼+qZܾ£°Œ·ç®+újíÕBÛJ&‰i»„v¶$`é_ÞÓ³Ÿ3ɾØn“ý8’oHÛA‹z>èH'w–rÄ ŸóK7¥.8oÈm0‹n½õìY½c~³UÌM󅘚]²7%oC­ÜÚÿ>Ƭ%e‡gÉ¿ãʬfd·ï‚ÍåÄB²º7O¨4UO¥)úÙ]”0|NÝìDÝ,~øüÁK%oojHpHyÚˆ¾¾Û}gÇÆì[M)Rî6û"Œ”lÝm Èk¨4mÜS^ž×8]–ÎTà>©IqE·Ktf¼ÛŠ €RžÃNbb¼{(;@ƒz¸™5;ËQ|â2¿ÖäVÙ=FTд#Y´nþe]o]ÏÓݬ“=ué!‹hí‡ûê©Ã®Ï ó4mçÂì`QW­³2™ü&jŽ\‰ÌîGw{h­ jì¾Poolå¦Gq¥T<9—SO 6£ö]÷Ü%zZ÷½4Ÿd}a<ÙM>8¡…]¸r“Ÿ·[–?Ñ9)Â;®"БAYIÃ|¼,ðaê½êƒUI*Šñ{Jµ,·ÞŸ¡£š&lw<Þÿ~(Ì"ͧîÍÁ,*Û°¥sEÒaK\Ì÷mµŽ‰™k÷‡•<¼æ¦SsVx:p†érc©ªƒÖÿ‡®!{ŽCš¢áñw^ÐJ¾eçÝg½­¦µ^Ø¡åõn qH[0ÒuÐÒiòòƒœSa,´pë×käWyÕ/ƒ¯lˆfn…PKÐ|Ü:ÿ Þ’…Vr‚UºUã Æ“£°Dü]Ž†ÈÆÀ»ÁúnSަÙ¾‡³éáÌT9fcn}~4Fû°ñÝ7Îêš7aÈOƒ¬„ }*éüc„SgE s ;g©6?wú„5‹äÕñuï~“/ ÷ìn½æ’k‡K}ü‚íl…ÐHÔ³ðw‚wÚ÷E•Ѿ¸"qíÙ˜7êסæâ1¯_9ŒS{¿iè´ãy!MxéIÄ4þ®tø n1) /÷·=F™Ì*ºyÆ-æÍÙ¾â÷!NŒªø”›Tšb"9\îñ¸äuËð… 9ÿ5Cñ}9†"£çжtð=Í˰° H&7{Ï—Å›¯®åZ°Áí|C:Cw@—3RÞ”\ÿ4‰3Û¬!q^Hóº$§õÙ>e´k5SÍNDkë™Q†ÈLe¹á]‘Mš¥A,Î}çB4?ÜcÜe@%p.”¾íºÞµJ|R‚Ì™Gg#©8glUu”IÈ/œHUÚY§y¨Ï†&ntdx—ù¨æ˜dÆé›÷Ýݰ3Š#Ü3x÷èÊÝD©'£çâÏ=»=ªYÙÍÈ­w¿ñääÁ¢Š­ófÚÊûÑ+ÒÙùm~nª‰ùu“u·èѧåiz%Ô ª ú´åÙ¶8Z𪘇ÃëUµ‰‡_§B<"LööŸT÷‡¿¼Q + ÞXo^ô0þîS*¿b¦3£-ÕÆt)Šñ‡]ÔŒç,l™¶n¿’º“ïãac¦—z²gã #7%>N‰°ç…Ýkç½*]<½‰·.  w‘s¬2$»ç…”ËÇΚ½4<ûV6&õ÷d7_ÒeºÀÈy(öiƒUöˆ ×ýhÍ»“>örvø 9¨í`•%«{ªE—<+ºqùÑù»º$mñ‡1Ö?-|=ÿ“øëìÿü°ÿú.ákúƒÿ:ôÿaÿõ]Â×ôÿ+ØJÿ°ÿúŽákúÿì?¥Ø}Çð5ýÿ öŸÒ?쿾cøšþûOéö_ß1|Mÿ¿‚ýçGúÿ°ÿù.ákúÿì??Ò_òý¿GøŠþ!ûÏôÿ.ákúÿoí?¬ÿ|ÿð5ýÿBë?Ö¾Kø)ýWíôí|Œ]¼I¢¨¬]mrÀÕÚé ìbçbàaÕì›ë ø7î€H}¼ÿG,!^L,ñÃþïûUóƒj M=]ÐÁCʺZ* NaQQ3°Š¨¨ª‰êZDDLdâaíêéè刘ATTMŸS‰ZÄ J ;k¸’‚‹—5áåå&lçîíxB‘“Ī ºúa-^ÔËã?Dœ­(,õóvD—¸§’*’$9V‘õMÀÿN¡_ƒü‘ _ÊýBôXAÍÛÅm°õiuþ´Jm8ËO-€n󯢺,§Ð½üZ{!¾á?Âêè Œ¥v¨€ œJv^Ƥ¡é‹`PñòpÖò±ÿ»…)f5ñÇ(OÒó?J8Ú þÕv~ÄšÔ*ÖHzÕ×H#}ùˆ’²ó͈ù %‰>#Í©¤7öòF¹¿uù]@e~ èGx×òT÷ðþ[Sõ[ú²© Ìè¼0’œûºUߩ׺y ½ìlÝð»&·³ÿÁý{l½³Ýê(sû8Ì7æþþàJ’Àu„Ê Ö¯F{À=Ö­C­­P}ž¹}ÇÅ–ï·<÷ËûÒÿ¼­®ß­aZ>?CêÂçŸ+ŽþÛ b¿8*|W÷¾y]ïº!ðû[>~û²hnZ›ZŒPF"M@ޤe¤_Lì|½”½ííí¦tü¸œö×Gæ7É6`$Ó_›ý¡µÁ?Uª¯­ž ¾û~0¤Dº‘>¯-ˆk“ödAßoåð{à !í\“ts-øßzôw“ý¢—ÿmý£.²ñúM±µîüë[c?‰ÿgoý.ÃHr*}Þû;3ËïŠ|` Eýš>û·ßúûÝåWð°NKýwu‰Ÿàã“rõW ÿ¯š) <@žŽþvŠœâ$ :8Ðñ?®žµ‘ðóñ(¦'Èé|úóêZ%鬨Òà äãè…y9ñ'¬½´Ö®pºÑ¡5 OÐçåK.èj@½÷ =ìDDDH£VpþV×[¹>Öâqö’')‚àqð’ÿ´kãñó„îÞH Á¯/ ÛˆÂeí>> „×væ>¢ík¬¬Z·,y]Õ« ÕúX1ÜÎÍ …«­hõ’‘Uœü ¹r¤³ª¶€ô°óPúÙ¬¸(\ê—‡.ŒßÚ’í—UY Ì]¬Ý<þ¬ðýãê.iñöcÔ Àg«µ (~9 ÄÚÃÎúk”Eáöb¿€²5\<Ö$ÉCºu‡$æx—‘’”†B!ÉÏ-dP I4’ÖÎ׃bkçììf 'òýüîéfmûñ”Åã§6?u’’º*rJp®F!¡¤þ©;ü+ñ‹™>ïUhyÙ¹èÚÙwEú¤û´ ¾ºjÏIbâÕW/$€žµ J’¸ ¬õ©O[?)ÐèëÌ6H//¤ çoíWüŽâò3KuïµýQä—ÓT ¾ß¨à7É/É©äõK¬ ¿‹?C# lW‘¨ô+h!%XC “¼¼=\¹Z;N±ÚU¬A@}k"B´NDÀ^Y$ÂþYdÕŸ‘ÎPJ\±ÙÑÕ ä%ô‘Ëýiˆ$»ó¬[¯Ij8РJ€.Ö¤ó5ö%þ!Ø}`,ùK`uœüUìƒÿ!؇üïÿU(°Êÿ$å·IùeR|ÜT)†ÖÆÖ/jÍj`R]ýÀ¦ ´ÆÃÑTþêÈDýçªVkºÜyÕk‡µ­—’ø³Q:àí…f ¢6$Ýô®¤ ÌY@fv^þvΫúÕg`¥ÞÙ )ç Äû¬Fï_5ЬiH@ƒìD\)‡Òï¥XU›} ÔIÂÜùg d@ýºub"â¿“ÄE_ç!훯˳êÅÄÍ èc.$o&pGåm¼½Vyl«¤›ð`írô° °‡I­²÷v)AfZ&š‡L@ôÍAfŒŒ蛘˯Ò ÄÚ°[+ÇÑÅÍÙ(ÖÇÚ˜\zù‘ü¤è©©hé(kéj™˜ƒBªk™è«ƒÔ Œ@@™h©Ò=`LX«‰€VÛ¼Ê$Ò~j< “œ-ΨÃP3I㥲±êšÁ§(±ÝjsTn~«ë:Æ‚ä ÚPU5j}AÈ'FÀvþX); 3º¬ºWYåRׯŒÜœ½$­µ†[»‘PjïtYC†›‹#ÜqõƵT$°¬]ËÉý–„#Í×íWËhéÔõÒŽ“4Wø¢%d&¤×Ÿ¨Ê¿ *¯ã~Hë¡Ò‡sí3)b­ìßV»×›€|̸®ðO¯ëªø<ýlÈýz@ëŠ# ×_/þ«rùÖ‰ü?Ö¢õØÿ†BHñ© %‚‹ Û€ÿ ý¤¹ŸŒ¡þ¢¾©•~”߉þÔÀŸMO¾,€ÿVûÁú=ø¿‰d_Íè~µ)Ÿßõ|óÓqù ŸækÉŸO7¿æóõÝçSeM¯¾fÑÕøÕ1÷ª¿6P´ä½ x=¿Ú¨?wÙŸLš?C%ñ3¨>µqMaúŠÿ?kI_ýÌØ_ëRJ_TÐWF¸ôOüõ“òÝŽ¤ ’=iùˆE`´°YUŽÅék[ÃÏÔ]ç‹ü¿&Ü%þ¿Âý'‚]â‡`ÿ)j@ëŠú!Ôõ’Pÿ!ËÿB²\üÿ!˺ŠúIž‹–翸&ººúÏ“ç_–·@¿…%кR¿‹hÿ/-k£8ÿޝ„+±Ú þ3Œ¬5àÛäçÇZÿ¢ó÷×øÿ²RóE"×V›MZ×!I5ÒšÛo‰±_€ë#F¾ê#r>¯Ì|^Ë‘6ò×­eý'rüÿ‹¿´xþ¡ãþ5ß]þÐqè¸ÿ}÷ÇzÅÿJÇýsOÊÈA$þ§ jÿù³cŸk^Èÿ³‹?>†ß¶ÿ„H@¤ÖÙÏbâÒb’?ì?¿GøûØþ¸ÿ㇩çÿÈÔóçòð¿rñ‡„(bÿkøÎÞ¹ â¿ÕÇï·Ë Ì›Àá$‡L'€~¾êq‰€‘öú½@«?üŠbŸuÿ &¾”þÉÏœ·‡ÝŸíŽè[AòH ã+Ç5¿êÛê›ü2üHù€“®zAØÙ:é"m¾ÝëÄŸHò?×Ë·À,& 3;kWo·ï ñ÷ §ägØþ}Ìüùž?âcëoÍÊ`™?ûzž¿ ©Á’Ÿnß1B"ׯÏhÈl5_/k[/Ò"ÒÛë_Âíâ2$Òõß8LËþäkz}ž/®5×:¿Û? `é_@š›Ñ_´à$?¡ÿA^»XJÓÚîlçñ/“‚ൻÈ>M`>ÍkÿE—^ÅÀWý´UåøêõœJùû_£ÕI’@ö4òvuutuP÷vqü—À Y·ü¢ÖˆIþ¼akë³GLÒíiöjºàðÕ V?­Å Öø~íÆâ£óõuîcWË1ù´\ó˜úÝ}«OQvÏÿ¼È¬á…4¡õøM¤üó@'Ý)K‚ï*Önž¿Ã_˜(Homãèìèåhç ð†-ýŸ‡éÏèù–.ó~V3TE[oàÓ¯E ¸yØøÕHW;ß_ÌIê¤ßõ*|¹QáË%Ên^«)ÿyÄ‘øL-W{ä¡ )=€Ò¦ü?-Ïhùâ+üwð²v'‚À?TÈÉ®!Äà„‡½3Òç_&âÁkÐÿavø‡âCò3>HËZß‚ŽUµU3ž¿6~‰$B]½~¶Äµê¶F€´µûOšä‰“ õ´óøw-h®ÝçÿöËúþÌ5‹?ûF¯owõú6øê˜—õ7_0ûw{õ7»µ{˜×ÿ7À¾zQ#I\ý[^½üÓ õ¯éÚÈUQæŒXŽÖ΀Hó´Ež°óøžÀÅ~ F˜óGˉ kמ;®Èÿ6y%¾ÊÈß›¦ÿKˆeI»XGzÀN¬¹¨ù·@.¾Ú¡]]ÿ} ¯ÝîãúQû·€-.±þÞhÏ Ø2«P¯í«Àì?n(ý—^¸üß2ŠYKˆýZûþNÖŽß°f$öëë5ß éßeMH¼îÎØúÚiïÏÈÎþ/²K–]ƒø«ó¿fq)Ð.ÿ>‹>éÕ;cjãaƒD:ƒì­¿í–ë¿5å¥Ö#à“±Ç¿~ @À™Úy8Úûpuõvµu$¥øÿ¯‹ Xÿ“:€„ô'ø×߃»>ùÇï ÛÜ`ñOp«:~ìõ_¥>‚àÿ(ˆÅ>AüYÎ}µ£åM‚Øþ±Ä'ˆµ\IÚ"ò£Êú Ÿc@ÿ({M ÉO°ºÇø«ñî±j ó‚òâ#!õ vc;WÏ_ÀÖ>ƒþYPË~‚ÚÌÚËÿ8á\ŸþSÄ?lô"-™š‘+ÿ‹æe¤-U˜ÿU33 ñŸ\Kÿ¿XCúÝûéÿ›¸?ÿ·¶ô»XPøèXçOö«#+'.õ¯ð«ów ¿ëÿçËÀÿØÐoûÿ—“ü‰ÿ I©÷?~—ðÃÿÏÿ??üÿ8»ÿŸu¢ÿ>€dDáÖ¿4À®õ—†øÏ‘¤vÿ÷}}[W÷[¸‘.wüìPaõ()Ü÷›Tÿ?&þ´iÌ·L:Rïtùr7ßúk¿\Èõ|íÐøÚI&`k×õG‡ÿ¹ô†|›4Âý @^3X´[ý sûY#þI þÌà«Ö|ÛtíoµøoB½þ ðç“®A¾pÅ?9œJH7’v â?EÂÿ†+þ+‹9ßÌ+ëðÁ¡¸ŽA~EaúèA†Ä ÀÔßOHkšŸ#øÇóOňøŒ(þ`•/ˆ¯-|9qþQZ/_HÊ…Éêäõ«ÏºHÛU'ã&€Ž¿¦týS¹Gú ’~I¿ü—bEò V~ª~þ ûü1ñcAù/¹ üÕú/XLô¿Qi•WZRòWÖWÃêú/,†@Àdbâ’`)2ä£1? ÿòõߟÒß è(Öp˜ ƒÛ¹Á`¤µ$øÿ‹¿½þOº`=ýÅúK‹“èÿcýÿ¿là²p )kkkII;°,ØFÆVÆÞZLZFVBÚNVò¿nßðß ßÖÿ­Ýþ?uüNÿ—ƒ"ÿ¥% ?öÿ¾K°±ö´#ÝRfçaçA½zóü>¸”(\L|ÝÅ€ÎH‡OׂÄ%¥…$À²€ú%%ü}Ê"+ ·‡¯ËB:âëü|⦙%d„ ²`„¬”¤¸ì§ÌpQ¸„ôgγusû˜ZJVH¤–„IJ‹}J ð©Ìúk I»y0˜·=ÃçšÀÒB2Ò I )!qqȧ¬¶«ö#_²’¶³Öî=\W­”øjViI™õYmDá6ëü¸Øõ¹> 5X$).&$.%ù)D.ýK¹ÖU4P Ô—ý #¨Mü§ ]—K"$!´AòsÅ€N ^_Éôã#ù>çKÉIÈŠ$ÁbB`qéu“þ)Í¿d’‘CÄð$„ÀRÒëÀ“X—ÉsÕ2o잤ózj‚!’B`Y I°D\f5¥mÖ@zyúX»­#äËHJˆ­g;TÈ/eû‚#1 £€#)  È:Þ–]Ï>êÖUp›,¨"$%!¾ŽþR’¿˜o]@N)Y F€»e%ÿf"ß$ÿ©Ïÿ§Žß–ÿâ@ìÏå?ä‡üÿáÌA} Zj³Òjiª‘‘Ql&#Û൑ør¿X9ø8¨k¢F ‰dd¹¹¹ÌÌniiih4ƒ™™™a0(ÊÎÎÞÛÛ ¤Rõ¶çGOä^FúÆdûß½²'#‘i©0ñ½4~¹ÞµKó|ØòN–»ïŒSd7 Ï·í.=W/~lˆkÖUlw©„ÏÑM>¯ßü{_õÖÆmŒ}’Jˆ‘}Ã}’ìKT Æ:–f&[vcIe)JÈš¬E…ÒBRÙB)I+Ù—Ý7#÷º´¼uß÷s}÷óÜÅüÏòœå÷<çÎù?çsnßá ›ƒû£»áB#¬›"¢Ž@¼<ë‡ø•Ì˶ó(A@"BH@0žD H"#HÖ(¢EH嵩ýcŒn¸Ð¬óÅ5 ‰j ¸s8ÅUWp,Sxqî Wù@°Ñ}Kñ1ò ôYU#->w+w¨‚’½q‰øMFdëMý ¤GeD‘45 åsH‘Õ=@oYÅà@ß5/ÑK:.*Ÿ cÜXƒ›A»?äc9ÚxW…ô)¯ ²&E=Ý B·IÅž®¡kâ1Áœ2h¾ÖÁÂÒ8ÁqYõ,[p(üÝX¿%bŸ MdN§fV ¹kŠ teøìÎ?caǧzêÖ?4¶vc R |Æ| þ¬å2Œ²ü©ÌØFùlÏ{º0Ø,ÜM…7¼4Ã}´¼£ƒ¡%?{¦©ú 3€œ‘p®¢:´åàNC&ž”’£PË´e zØDGy ¢õb­õÚ¼ÙÌŽ:Uòô)DCs(,ŒAlŒ}þBðr¸JÐhþÒ8¨ÔÆÉäW ŸŒg`˜/ÔÍDÅ^z ’‹«…k s„ ºÁÑw…“}`ãAG wu‚ÅñÑ1YÐ)ÊãôÛ—² s”Ç!ø“rq=p :ˆÍ‡œ}åÊV÷C”&à^DL‹fõ?Ô;Ÿÿùa¦jÙY«ÛU1¸Ïò›g^`ÝÆ/4\l¡fhÏU5è<‡;ðúÆøoÝ6“tÍ—±¡áÝÙáéÏŸ3í©>‡u§TÏ ²V׌<¸(ï)Â3úÑš¤]8òb¢R~sÖ6Å0ø¶¡É…}{}@…Š1eI¯8ý¥?öY´]r+82Ypîmçq¼åœBh!õ³n?¥ûíF?tdÙÄÕ»ŸØ¹h76Õ¹“ÁJ§±öWeuÕÓgä]Õ& ÿ‘>˜Év4§ð¨mÞSkÝöb3P 'Ó@aÈ‹² TS˜ýî~bÆ_ÔtÏ˂Ҿx`Le“*Œ,þ,{šðXû`²ãÕ=Hô+ã϶ÑM¼åƒ; Á?ú8s%ŠùU€¦­ÙNE#¢\ø :¬-â9ÕyYPá¢Ò85º”ÞË+u"u|FÛlê ô.O;JEvÕ”d6R&Èò:äS};5ÿÒxë³;"…-HÞÑ?þhÐxÎ̾¡‚(˜w7†”©~…¿2B ‡K à`Ó¾SOlúÉV—!,£'A6‹6ƒ„Æ÷\bã1Û­ßP¬vš‹<ÞPxMœ›å”Í[2ü­×w+6Uë´  F)쬹cä[¢g}ðhzsÖˈìF³‰—8wŸñöãîÝ$ø—Þ#»yDë#oƒµŽpn â ~¨°c|;"& âïjÑÿºÊÖM޾E~çôÀ—cæÁ3mÛM)ƒîÐê•Àû:]–(dFôßÊtÈ1Ì…ƒäŒÈ¿ª}ÞÿÄÿÎ\Џl'GÊ]°8×ß;ÂÙš|³£Úé–ÅÕ÷ù6¶7ŠW3AiÑØŠ8E%6ˆâ Rj(‹|ð¶ö0m1ˆ[îÈÞƒ>CÙ›|€`Õ.!Ìÿê%3ý9 ô2GÚiêSbSèMªwÊpÅ­Üd„ùÙQF!ª´8"˜‰Ù^d\ÒAþ¸mç-{}ü«\Ï&¹{g•„¶AôF/qBXŒ“Ž J´+^«¾0^Ô€†{{ê05xÐB 1ÔR$í¬„)ß»'IŠ`~yÂô‘O;åXwˆ&n¡ì?? ‰çdrG¿ßF"¸/òžöÎ ;Yš-„ÙWè‰2ß‚\ħzV€8Ãñ¹ÅK-›}¨¦è дÉ!ŒUÏ¿«ÂÔÚ1•;©vê„ØD9 ~á:ò$GÅÔÆb!›l€xÇi›ë9Q¢sMoÀEGTeqÀ½5ÌEhõÀ÷@ÌQüT¤ ·Ÿ<°±©9£kÞbž|ÉM¡'òt+ê±ã î"{2ITÀEÔ¼íø„z#'m‘Sc‘.’ãKÖx‹Õhæà®½íz¢ûaïËÅŠA´i7ók‡¤›bìó“•»§ÙЧ8Õ;~WgŒ‡~YÚ)p>N]±±YI%zðÔÉøÞǤBä¤ÚÅH؇Wf$ôÊéÁâjZæþTÛyÚg7q(Ê­d9;˜žÜn{Þ QÕmÀ=åµ^D§Üµ<È}Èp¼B‹4zÉæPÉÖ¿´¯C!ã(BïP"GÄÚh!z2~{à3j7þ.£- (õQe™Èî ­|/<Ùæb¶E.07¬°gL(DõxxÞ“Þ÷ÔÔštãÃèÈÚµóØQô ³d^š-´n R —È<žÍ**–·Œ†4´ˆƒ#‚T@Ýó,4ddŒ•ò‚xuuAï ¤S=TÚ ³ñ¢&5º áÀ+tÉJeSq‹ãÈŽš˜Ô0;ÎBÓ.žõ$£ g²^ânluȪ|…ú8‘Wû¡ír•à “¯·—âæµ9Íc§²ÜÀèöÀ×eö7ìzF“[”ȧ®]ÐC-bÌ-7+[«uùè“•èKðz× HMÙg§_³Š‚Þde3uè‰ã2" Ú.mÁå>qË—NïUgãÐîr™8[·™A4å8? EìdOm»×Ø'ž§Š‚‡gŒÊD‡A"ωӫ2Ù IûTgP‹%œä%ýò»9Ù3?ÎËy‰8!âly´Œw¤ÚX;þb4qÊàêHøèöÏ»ÞÉñL•¦ïnÊ8÷éNïY=KȃmÂå‡F¶øø"ÏÄÿm_ŸÅad8‹/ìý²,ÄÒV̈?4™ŸÍ3ìKÙ)¼À=Èþ§ÿ”‰=”¤™N¿Å’,ðõ{Þ¬Í#w%|Oƒ«ñQŸe³ |±Pà[-á‰Ù‚Þ“¸É"ÊVïéþ 8ø–ì.¾X`»É•kQÂÏ”ãbF|ƒ*oîR~þúÈÔ—p(Šuæ]Æ1I~s°µíYà%>.Pë&2=ƒˆôØZ7¾€Âˆw$Œˆð§|î#r'o—¸€ÂÓõ™ù{OàºHö\f³#U½eò¶0‡6BŽ¦ÎœêM±¯§x£ÂrO®˜žÏ\‘W¾À¼[©QÁÖå‚ÿx2‚ ¨zˆoÑŽØ™ýiòò35G)è%G4ðæ@@!™|ÍÊúŒ­¬A1ïRÝ®zÑCd¹¾Lvø;UQüb·Ž?Ká/ì竹Ø·þX¢³µekPšæûzhIZ 0›íÚmž´Ð>ùv¡›&¯ýê‚ABˆ6U`uòè¶×ái¤–cñîQƃy·î‚Ç÷ºÆj¥äŸõÊŠd6n)r…¿Ô7´1L8ƒ>q‡ƒ<d–3k„x/°™ƒÝPñêóÜèdâøáö*Ž[ç¯YÌÞ|±ý#¨òLÞÃÓb^3˜ˆÌçî%ÝÑeÊ'Ñòôœëa{ëžÿÒ©@S9LWúØÓ9KÞ<”í¦÷¢ ÐWNm§ÕšüJ;w ý&³Ñ¸FCÅdÑþ,uS=¦6‹àÛ¯:ê îú¨€§)@7Lð/ÄF;PómœêèƒÄsîV–›wç®Æ3±l¾Ù.^SÈ=‚ž~Yÿ%)œPÕŸùØ'‘½r¥‰†‚@Õ£ü¹£¹øÆýÇÛ¯Òð¾Û%©<Þ.ŽŸ?'„ß]0 æR#@HÈì ÌŒQ£œgnÍÖãBðmEè áS%Ô4eHÒ¸eñ–ûi¦ª^üE!ñüøÀDe¦™ÙºüxŽZ  ü‚) $ šäÝÉY`9Q© ¾’žÿ¢$ H hü2„èÒU}ù{¯õyù Ä'Ã)ÔÁc·ù¥ÉÒ:µI!$Ñ‚ ïÎR²´çÚÛ¾.4õJŸ°nTˆ¨»›n‘§Õì8­šn‡”Ònì8­òn‡ÈP¤I;™\>¥_J‘V¨Òkz˜æà®¶ƒ ÑXàãNÁ9¹0÷²Ö%…ŒðÜÑ?Á&<>v9G|œëwç‹mµª.7ŒÓ’Â7ŠÜö™œ|jÆÎ£LË q=s…ÛqgX{=‚98»jø1ZUçJYäl“í£gC¶®÷3ý=§öIsŒôÔT±$4Ö#4ÂB•½ç‡g›=²Î4S[t²k³à›lä¨ù†ïWé|¹—t%ÃBV·»Ž¡WFýÌî±k—ÎÔt—†ôTÄ]ö©Wí;ŲœrÞ´§ÛÜØmêye!tÖ®àð\HA¿W\Ƚ¹|ç™CZa€´ly7 ÛÞࡳþLó—žáôŸ1¥JbðE<…âÈÙ8.¯ÃÀtÿsýqêÕã ¶ÇL`äÈKv­X×c–KªÐ…6â„ìÛjwš’´$d \ˆ,嘧¤sZ@ ²š°ï8ªÜex†!–– ŒŒÞêÙ¾):ü\ÞCGOK€q3hú5'@‚!CtÎ섃Çîðƒ$dœšŒ# ³#’‡›€sƒQ 2ðs1DÔ™6ö]"Q É­“Ó®]PéÓ"øM5³ò1«€gN j|~©‘&¨Xk”q‡óÉÖ¥mjHìcS<èQ±xÜ&ß6ÄÃp>‘|bê~›”+B "ˆÞ¤wæ@œ2% Üçåx,H焼~)IųËNZ,­ÉÓ,`€doãgP5°5ùY«¯éÉ·LgnµͰµCxúVO4Ýo_øà0ì;öb`sŸÂ‹ƒx݇S—›†DýlûH-fß¾ã]ˆ“®9s"‘¿]½<¿Û¤¯´ÍÃ"êüÑ´"{¬¨úY¶›@Õ³'Þe8ߊÿL?vBC¥ÿ˜\ú2¿á­´e"în:Nï ¥v¡EÎúpúŽôE½’gꬩ¹Î%™MH/c&߆ IíÂõE‰ë ú¯‰%CÅ&_k{â /+Åž­P&° #AßÝ„“€ÂŸrÙ?W4Úut‘Ûü”º?Ë’“¬ÿu¶AIÖùˆXöø=÷¢#¬yê \‹ßùGŽ“ ^"<é¸ œ€°ÝfåûžùåO?ö¡U˜Ö¬;|_Ì©eÈÆ80UȲÀ|ø©S™ßŸûd0†é#âÉ:ê^G€ÒäÕd˜ð(+dÄqïc_gç:=»¬´gòñùÜ<^g–￸!V·Ó wŽd  I壧ã)A tŒ¯L©â¼Û£çå…ÚHæªè]òjc ’Œ›Xõ‚¨æ^QNÑUí=mF5zúªJŽÅn,Ý•ó:tå‰bšH³ã‡R#àE›Ûf'Š4žPûhp]mL1•ÞÖD¥œn%pF/?³_…IGÛ¯|„3Ï'äÜ)MGQxèÇœÚ(•6ãéà ÀÀ¾è'õ±t·9Û·£ @ˆÛåÜËp´Äç¡Mâ& •Sûï¦ØÁã2u‘~¶¥÷ØuZèÀ†‚QÇã8bwÄ óѾ½x]¿×ÂQ–•qáBT Ï``ȯ•/8Áˆ¾âèƒ]¯Kr~¡¡¤‹MÑE/¦­H€‚ºÞ¦¤tŠÖ[”ËÜ2?HÁ¹µ3Ôš2Ðy/˜ùµR+›Šüëù›6Tr›ÃðÏíÐÍý'SÞ–'%lºýBvºB3Vã´mpbqÉYS?7páÙá8÷ùwß¾8óq¤ç¶N9%aU¢‹Ì<è@WE¯ÔFj}DÃS"3§Ðh¡õþg÷uö£oû9%ÎÛ‹´ 0•ŸZm#ÇuQÑT¢eÞ/¸Î¶WMÍœ©â¾gl ä‘èñ¶æ# l½-ÍÍl΂O—+0æ,L…ïOW}CÙ vîÚB¬I*Xˆ_%“—‘· ¿;Eͺrk¥òq bùSÀ{ŒÇ§ív /Ì[]½3ÓwœSÕº²DÿѨcŒWq§ðq•U‰ÏuŸ…=EøƒZÙÐнæd²ÜŒH‡Âó. :jZ©Âæ--¡‡ Éx·yÛ5ø—+‰¿tÖôª7•rúÎë|xÂx|ëbON-#§Ùl@x¹:})k—">Ú`LÎ>Äm8ñZ3(åâüvyñéûVçñÔ²†¥óÕ¼:{H_>è3¼/z4¼ì4úz8˜.Ñìú fR6HRVHÐqšúr×­M®gMv¹©èïìÜ:=“ᬢÑçÓ)…רl¾ÌÉ:% %…LpcÅ.Šäl¸ûúÖ¥kŠ"Ýìñ9cW¯Ô“z[ŸÌ%ÄË; h> ×m; ‰î‰îÃÛÛÍÏÇŸ?`h鱇/znHíX;—™Ú.8Ìt+âÜÂD!çHš§Ó®}`–t¥G˜¡X{ꊓç^Žö¸•ßÊ,|UdôúÌX¶¹#m]H‚Ü4F±ƒ°6¹aqq"ü0NkÏr•3–jÞK¦¬HQKetÅC‹°DÊR²aÄ%¨À/ïJž¦¬¹5ƒËÙ‰g¢có²Îp”}š/&gSµ†#Ù¦®çAŠ<½µ Ö%I{s¶b ÷õ\ pæÝ#p‘ŸÜ;f*ÐÄÊP¶î·Ô¥JktV¯v@0%H]°.\š€Ô–™­€ÀÝ÷”Åñ,*tÈ/Ø·\&öG;ƒA¨ W#eËp°Üá€@%å†s0%Kùlº ¾WlŽÂ wƒöþ¶ÃÓýHñKa72f^˜¿o¸B¶0ìÈ{G?$ü]ºr<Ñvðàåî·uc3'RzSÚþšsZÞ ÓÍmþsSí>©WiÄnžƒÇñÍ¥nþ§)ßÎ íy“ Ÿñyx—Æáš/E•²(àí´Ð‡ÎÎù‘(êW÷£uî{)LÚ„ŒmßS²gê´[ñ„ye¶žV£ãAò‹ÖPÒ@ÙC·Ë¶YWê½W¾²™„a7ÄgnHæqÊ}vp›‚lBó™Ðë;7ÛÚ–Èîºzôa¨J>Ÿ©ç0;õ»qÁŒ¦0Ü1r<=óKŽq­½†·,§àË€èÍBÀƒ]Ê÷Â,íu>âu°`"óI€°ø)c%)°Z½‹Œç¶w6 µ$©¬‹¢¬¥ %ë¸e¢7ä®Ç(æ*¡¶Ï|[ =³4'‹ž× LE-!J½Ä™l­*k€÷Áƒ›HZ¶¦w×È0?nŸTfÅ©s9êûƒIz£zwžŠ˜Ln¾ßÞÔßï7‘6ÿa訢Hõ؇$ÉíWû9gòsáms£`ïŽa¬oh½³ã˜>c.=ë6Ò<×§ƒVìtÇŽÔûÏyÅ^üD žÓ󽨷©ó Ûmç ‰i—™ê˯ÛÞFpxÀ^NâžH~ùvy2àóÃî¶P£»…w°Á‡\1»PZs…i0!ÓîZ%¥Ybáe·©}Ö+Á™˜v]n>Ø„›msõ«®ˆ×K:P>ð¬¢|d à–f þÌ w®Æ8¦ù‚RÛÁ¦~{ZeûŽNy‰ 5m]Oúí#A·÷¹ FM‰&Ýân=B|*#Í£Æåà}„Ù¤CíËHŽ­‚g 9~Ê$1†Xࣦä6„nò~ÊÐ+—n¿È#CŸ&ºzÙ°0 ·T·2òÊ};B´þÐTÛ¯zaôÏÙŸlÐ?K+í¿ÄÿÉó0I˜._<ÿƒoœÿX Z‰?tÝàOH¶ÿÐJü%Öþâø¯­Ä¶~ð‡nà¿´Éõƒ¿ÄþkA+ñ—Z?øÃ6ð_ Z‰?|ýà/¹ÿZÐJü¥×þçÿׄVâ/³~ðßXÿ¯ ­ÀöÞÿ±±ÿóÐJü×Ïþ߯þÏÚÐJüÿÙý?)(LJ‚0ñ_ÔÿõÿšÐjü¯ý²6\<NtÈ¢|çjaaíŠF[XØanöã2 "À¿pÿÏþ$bPq)øÆùï5!k¸­Œ•µ % ·±…ˈIŠIØÚHŠÉ ‘2¶(˜¸í?]¿ ú¿KCÿû2 ÿ¨ÿpÉ•ã?TNÚÐÿ5 ïÝÿ##j#.ý$|½ä ’‹Ã¤…Ä%¡ÿoÜp²A?£ß×ÿß¿ æ?è?LJºêý%„nèÿZз÷¿ä’*.ÞÿÂW'ü[ºÿ%DðúëÎÎxh]VVVCCƒ‰‰‰………¢¢byy9''gJJJgg§¿¿?Éâ-0oŸP’¬¼†¸t Lbû»=¬¡X_Ò²àþnkORȵ²v=î©Øaº+ÛÙásV•ÅÔ³DQ=Ñ©Sö-ÙÑ{]X—ó†š|eÜÜ{«,…c>6.Ê¯ÉÆßÄøVC 8#ò²*»¶Š¤lêµnm!ËŽtØž0X ‘$Ü:äÈ'7½p`øÆl’þæA¤ bÎüPÇå~Ñrâƒjká;ŸÌd7FsMÇJyt\ ëí°ËÜ’o9JN·àµEèzhZð ¹SÞžzëÌ^SEÓÞúËm ÓÊέ- Ó~Ù%F ö%æ^âURT“íï”Ó3¶>ÑŠóo”çlk?÷Äۜß÷©ܽ*{åa1ŽQÏ?5Ƨ±ehfCû_ç{‘v »Æm—Ó29ù~$!pú¬lZ‹^ضÃB¡Á1^yg8¹‡pT7:*4to:¸…zKú¬ö…Ô!þ¸çž£7·y0aÍVÉ.”u~L¬ïìûrK›G§öR¯‹E``²£›wxïí²ÓâS#1W (FÑ¡f >¹¡ rü`qpq=À+G©¥e{¥u@0a¦Õ:Ø'^sÛW .F¾»æ1Öb›ç'ƒ·*ÝÝ&¢=ì÷L¹±–ûºFã¯^Ÿ*œFcSDzs$òæÄE]èSÒîpÎu‚~˜u½Ùn8¬ ¿¤í¢þÆOZëÔÌõW-ìTÏÆvætT4z?>—U9ev=g·#¿ó­„Ë4F/1gJÖvÚ„÷c6›Óݼ{a¸Ì5å‰{(þ„g”`Vå™e8z.÷î£uíMÇÖÝ»u :)Š[##ÑS¤ÔÅÀ41uŽ»µ—\€X+CÞ'zŸš¨ü¢µ;@]²÷Ç[súFn=¥ÚK>5d['‹Œ¼“–}¢—‰Ýbp^€ee—$¦ž}bÆ¢©ƒ/&·‚|ÞNÞ'oyŸ”ʸè $¹wbx¡W%öÇgÄ€­¤”¯Å怒mt«d߯¾?9È¿E¨à+|áÈ}öS]ò–®ùÜŽ)I—í3úùÈ÷¿$äj÷å #Uê?ÉÖÕxçþSä‹.3;…Vjì® ³›B —xëçÞÛ¡|3 UOó•ïò$´ÿS¨Œ»ÅÂñ ñ&Jj'ŸÜÍ]2WXË@$CjÞóýñŸ ¹±o´.Ö3å„Ôðç÷æ8¾O¼wÕûtÒŠ­¥±±wû¬ë¾Ú±{R{[ÚbÍJjPz›aR—ɯJí×nlÓžÞKÙdšª )ÑØFqSšU+yŠçù&½SEVÝŠÔ†´·(‹Í‹ý»öGg\ų>3éåοš˜}·A;÷ªRkÌ~ŽìöS<-…Õ/ ÿ¹4šè¤>βʰæed ÍÝ"ÃÚ§ŸF¶ð§µ×!_©œè„&kÈÓ){Y-"Ã"9qf">ÊM瘯îö°Éô$=ó³6óŒZuÉ’G[úœÐq†Ö‚FÛt¬¿¨P;õÛwÙ§… ‘Š.±o5…ò ›‰3°Ö{åüÙÿmìÿ® ­ÄÙÿmØ­ ­À_ ¹ð—"â/ÝÀMh¥þ¯#ûÏ û¿5¡•úoµð_Òÿ üׄVêÿ:²ÿݰÿ\Z©ÿÖë)è†ýçšÐJý_Gößø¯ ­Ô›õ‚¿tÃþsMh¥þÿ£öÿR0 I¨1žèÿoÿ5¡Õøëö“èDhŸ«°3ÊيЋf ¿Wàÿ#ྈ¿¤„LRJ’øý*¾ñýMH¢ª£bx@W ¬a¨½¬k„ا©æ5‘PU5Týb.X¢s]$ZTTm?Ñ[ê¢S9{ÒFAÎ…C‚‰>V…QGŽ:¸Ës©¸ºàâ#Lô@ËEôãL|’ç"ºìZ”:Yk{$‹ÂÉ;`]…¥¥%e„ʼne›e·æ®ööH4 c%J!XÀ~ñ¯Ð’w÷¯îª‰| Á‹Žë~ÉWõ×aÿ3Ý¿Ö/Ò_ûEBb~Ú)ÿ¾¦‹‹}m»: §‚tÃþ‘XBz¤•šðÚAa ²aMÈþïëøŸÝó+*³¢3hÚ‚­b0„ E ¸aPî?Œt!¼¿IÔFâߥ8} !cƒùãÙ ÷G2Œn1å¿èŸàhºØºþ6Äô„®q üù÷u ìÏn1 6ýWúáêŠ&ôÇ¿t“ùÚ!:î(Œ-ÚÕãÿ³!^âkë ~[þ¥ý!ùg:8ÿRwÓ‚‰®“ÿ}½!öãšðýûZKXÅú­æZ»Ú ÀæîÜQ$úœèbÀ_zðÿÅœ=Œuð&,ʼn Z ‹/.žå¹h;—Ý`Œƒ=N–u&¬/–WÊ®.`mÂÊn0T ,Û-!³[†Š‰‹-.yV,å ëê¯K-Bû¿6š¸g°[TÔÃÃCä¼+ÆNtqݶÔT9g;0c½z¥ïæbÇEXîàä¹–BˆO„ê0u°!èØÊcƒÂÈsdpqmøu1/'úµ„ ¯%öÅÒ>Àâæ„Âÿç›Vîÿ­Ÿû?¤6Îÿ¯ ­üþƒZ/øKIlà¿&´ÛõƒÿÆýŸkB+ð—\?÷ÿlÜÿ²6´ÿutÿφþ¯ ­ÄÝÿ½qþcMh%þëèüφýÿšÐJü×ÑùŸ ûï5¡ø‹¯‡ó?KöößkB+õÿÙÀMh%þëèüdžý÷šÐjü]PXg ¢­ñæ'Æm!m/Œu=бFýïí?a0 øŸöŸ01¢ý§¸|Ãþs-èÿûO¢dsQ.—ÄRÄl°(•`¢à†Yè†YèZš…~_"Aÿü²¹$~¶¢6pÉŸ ®KEª»‚q®‹¤„qù¨3AYÄŽ!Zâˆæ¥Äl"‹µø‹¸ÙbvĤsྊ» Ž^n¿~]ü ¦Yû3*–ú!]þàF`ì†qµFa±®.…¶„®³[XìW3±0ÐÔ¶Ø£¹OÍBEg¿¡¾Î> 9Qbn…Uü—ˆŠÿŒÿRîŸÕ€P¼ƒ ê·k]®ôj°*·Ärn‰Ÿ÷Ï¢. ¼ “µC;X‰Øï²ÃÉ~Ÿ)l™)l5 ’Ëq’+ tByy¸bl¸ƒ ã²Äze,ãàB(žI..®?’[UŽÔr9R¿Ô0®Eƒ{®ï· ¾Ìö])½)½ºÁ2Ëq2CõUõˆ½Ä²tKüTºAúþì†åÑ„hW±Ê†ÃzqGuµÒcl0Ë ¿b!ć¤Â÷{UbY}$~ª>;Q.6¶ß籬¿¯Ë ñ`5ükŸŸ~^þ‡m|~lRòß|Âÿe ’¿cÚóÓ‚W˜šü¶EÏÿ[C5SC „Ñž=jëÉ…ð‚—û‹T> «£¶¶¨ïX?,Æ~ü×¥üºUÖJ“”_6üøŸZeý²qÈ/Ze­4Ye•µÒÞãg¶¿l#ñ7>€ÿw;µ«vZW`üÌ‚âïÚ'|£øjû 5 üØnã7­þ{·"üû×I=áeá€óúVÛ¿†ÿÔjcYêa×Ü ¶,Ѱß7w‚-Ë/ þ_‹á ³ýVÔT]ÿ2Aû6â{b¶¬9°Õš[ÖØjÍ‘”ú#”ÿø¥åÿ°÷$ðL÷ÿo®F¹ERÚæ>³=ÂÌ]Ò*J96E®•R޾…Ö)%¬Eº”’ÈÓRù)OJLÑEHJDúoŽÖFÇ“={üþ¿½_zY>ûïóóþ|?ïïû=0W‚O~ëR‡3؃-N‚£E'Cì÷®ƒC)^ ïkôÛ@̯Äíü• ƒªaCv~v¥8Æ»#(T{Ì‹e¼"}Ãc›1Hä0I“X'ý cž„‰ŠƒÓ$òh¸ ¹ r4.̼¥ŒÓ×pA2qažGCƒ Š­„DóKRŠÕ'{Œ–-nÀª=BWŒ"§¬ÆAó1ÖÕo"¤ ¡!¿;2¶‰ÐƒdÁ²qw0ä·0æIüI>!$ïà°Q1âŠ2„Fžü1ŒÄÈјÑ-„!}Y\à¯áEȤAçu4¢°E½ü(BåGá)¿ ‚2&49ãB†v9Ít‹`†èrX)¦eŽˆ9à§ùÿƒª.§PpFýpÂðþ4dÀ¡ƒ¦‡-­¬OˆupØpfÕ¯ºÀø;yá€ÿ,¦ç“eÙ8~Â3z´ÉØV2¸Û`‡­Ñ?ëAµÕ=üƒŒÇ¼âo‡ÕÔ‚B×Ê3f*f¸i0%4ì›9—}2ÎÓ4–^™Çà^‡öʾã”A¹@L4“˜LÇÌŽÿyìüGõøõxlüÇŒ£ú?|ýç °óÕÿáë?O€ÿã¨þ¿þ O€ÿã¨þ¿þ O€ÿã¨þ¿þO€ÿÈqTÿ‡Ÿÿ…'À®ÿã¨þŸÿ<vþ£ú?üü/<vû?ŽòñùÏ`çÿøÉÿÅÏÿÃ`·ÿã'ÿÿþ7À®ÿã(ÿÿù/O€]ÿÇÑý?Ÿÿ<výG÷¿üçÿ<výÿWã?0h”!Ã8øóŸÿñ8ùÏY­ŒìãïC® ‘˜ùfôüÉ¿Ã&ƒ¿ŸÿÑ€™9èþ3ä‰`|‘Ÿÿ‘`ˆ2$c±(„E{R(,ehä‰50D )¨{}|øgáoê¿GÐoÌñ3ý7d8ûlö‰@ øù_yž!h0Å›L  ¦x…BU™þŒ,I’Ðs(g¤‹Äb (Z…@}Óçǵ.¡(#¤.k540ÔE"ÃbçMᜌDöõ`õÄ0§BB (] ;ÜóY6¡†X¤.ƒ€b°8Æj¿vA듽P#VêãÇê‰Áé2ßÇ02`,…ùf²V'dôCë"0Œ~Xš˜ÿ–hù¿§ÿAËcŽë?‚±ÏŒÔ$ÿç ÄlÄŦ2ÅUÜÎÖr$HÀÅB‚Œ¿Ä6®;Îø¥J´w´êÿòå ¤¨T\\œ––fffI§ÓI$ÒŒ3ßb´ïttŽb|‡.pX¿¨ñfth±³4w\›ÒzèÞšÚ‹«KéÅ•—NxwËD…xú_¶+|¿…rï";“r,Uådo•‚þ!㻹 '—šÜ:ã÷4ML…w+™é]Ó¼qžg<\tWwƒ4Ü¿3¨eÞ:踅%ärœÔjiØ8¡Æ 8½ â¡ ý§pûohðCÏGˆ˜ 'kš[}†uUÄC5õJ´Z}ë[àð£Çog-ƒ¦V9§à—j–]¢Æ³ßtæìCÞ¶·ÌZrwÕ¤å*ñ$øå¤DHµ–ÈIê¥ÍÖÀ‰­OéfÓ§HÓÎÎ:/é(|ý4ûÅ&ï×/=d¿tTÖÔ=Ÿ†žc&¹‹êl¢m^/å´yn'øÜûN¨b~ûÚæ鮹î7Ñ©*šIÙI=J™§úá=X^r//¼µX„fBk]WäÖ©ßù&iɧp<àç[‘ >(K¢V+íÄkÃV79ÚäzpÚFrS½ô$³å6PyÛøÒÊ}ÊÁS€7Ž~œ-zåR÷NÙ‚+Ýt òù}Ø9’8!¾À0(È­I‘]zVA”v#¶1%#v{Õ÷R^‹¦VëWð$%Éb‚uYA9jË•D‘êšÊhé³g:L¢œµubëo¿ú+¨ÒT¹¼µx€Ù\¨—ï2M–©îÓ®~ôÂí IÅÂÏd¤5ª5=Pm-–[P{îÚ·üCÔ’O¸¥„'Ä— êc³÷yëÜL–íÛ˜°‡º2ó ‰lÖÿ>¨ö‚›q]¡wð;a|Bªß¥JÝÏÓT`ÝW&ª½èužþšñ­·ñJ21§ýîË„G%5l">*GË›M‡Â¤ŠStá_ºÖ´mµ´=¯|õÉ‘3=ê æ”A¢»Ÿ¿™û*mµ£¿{Âë1´U—0@\X{2·±k?Ä<\¹ÍK.†¸Ûi¥äÆ)Ò0ƒ{DÂüû ×T„þjÜ÷°©P¦êP^h(°”®šž;K†@½Ûþg\õó1@9ðÅ-ù‡íÎjr†¤—TÈ%#Ífõëw?ÒWŸ+ ½¼qDæÜ™kc ©JOßy»U>oÐ"]µ²_Iæ|*IkÍl éêïLêìé ØçgæY“ûR¿½^ìÞµÔì+_t\Ïe<‘ik5÷!.gUwLhÃÜÎ\SÜÿüý«÷qí ‰2„—6UAù¶qª—õ“UU/<êêôNÞ"F:æ¶ICÈï`W»«rWiï ßÏ÷߉Óë§wF‹‰N}Úct0;+@kJAoÏz]Ö¾ü€o&ì ï-ÎþP]^žÖÓõ"v7Vtp2䤱¨ýãUÑ’ÄeŽ÷»R+ÎÜ ýõEÏsõmÌž7ò6çE_¯ št:á^ÝRBazxغ÷;Û½OÝοza'³J8qqÑC™ÇE_ kµ[~¶ÿë¹ÐPÔòæÚ»‰‘›êÜBeªò?ƒeß!㊤Âú—n˜´nUìHQÔHo%šµ„EÙÕ>­‹V%ÎêBŠ™9RAaRg‰Â÷Jˆï¡êã-!¶õ Éçfö‘T £áèòtš1,q¢‘üÙÔæÇsÖÊ»U›B §eÖtßI‚`Ö†"fÁ÷Òí^ ±sJöXT+an ŠØ”µC?é¶5u+O9ÕpâÆöT¾·ìAšß‹½A7íË:ÑrV„Æ/¥3qOv—F^öDMÅZÑŸŠENYšW…•òV¯À³Š2½“<ÄŒKºò(Ùs®Áä@•¦«æEeâõ—Þ±å%Úö‹8rs‡RÝT1šTT×*#Jåµ’êÊ›všt]e“I襢•+¦‚nAz.Öäue'ˆ˜kJ¥_|ûTÍ/WZFLHs›]Y»QENŒ8»ì> ~úˆŠÜ$âÔ°"½¤Í+TÊŠMˆƒ,Ñ‚Bcû½Ý´74‹áhÔ¨By /59Æ÷êë⬭45¡÷’SÂ(ʆ´ô¨¦êYîÁ“Sx:©Ýþî…ܸýDgü.*]kÅ z‡”ؤ²õêFhàøý:û¥¢Î¥8vª…{‰Aøj{=1ÜG×é²´†(rÅäàtˆfS ±ÂÚBsN>ª ªnÂK˶Fö‡ªŸ@Ž&2àͳL W@'Ê£àéé66Y xuÀ÷¯ÚóMEj ³îZéùbßÏ×¹º”Ð|ÊÒ ³q'ì%’¢Öî=èïÕ¿ÿ9¯ ïaëôËOkõÛ{'šÅ/Aæ-ޏӔßÚ{Ïs˱ƒÙùi ž îDÀïÀa«Õ\O¯úVtèÅžó#缬½¼#E-d½q£l’Z±É•þË^uÕ>,vßZ^ñ.]ýŸÓ÷£e›Å‰þÒÊfÉmjëW½_Û5#3¢ww Ñåî®KnHÓè¦ñ^DbiÏ;ýÖëªWWhTM“¦L4yè»t÷g˾{)­z ¡î4¢G„Tä÷´'VÜé:З@4ò^ì¾ogØi*µÐôK[ÓQV®ò,²Û1Ò.ÔìIémë#o7èuJû²˜¼¹5L¨žz5Ãj*ƒ«4µb•Œ>>+= ‡¹¿P-î`è¢ìýþ}¥€g`ÙfYâ5ì3Æòè‹Úk¦Ëʦß.H!ÄÍK×j Ž˜‹À}ŠùraÚtš)ØÐ1F%½²ÔKÏÍÉD@,²X'rýØs%ª¬WôÜ,ƒ‚‰àV-Ua9°Û²·À§•Ûeµç™"¹…B7ÓdÏNÈ VбJvñÇgðRÛè ‚„|^›éQ ã°w _ÙEq†.ﺖ:P†ÌBÓg4]§P’oû¤Ö$7¹ +:?~hûZgàÉa(©WääuIÓä`¥ÁP¹¢Ãfš„Üx…ÃǤ\-àM)—ÑÒ fIÜ+rQè“ܼͱMà xÜÔ¶§ÒÒ¶[èñÒ²lÈ*ÊZ/_·ç­ Ìß|Ïà‡]L$ÒÚÃõ’&°¨»ëÓµuýžûz§ÊЬ£«Ò0‰mʆËËV5•×¶»ç¼ÔØz &í+c?s±Œo'v°«î]™¤nI>1B<ž¸)ÊÝb ù [E›ÑZ©~–YîÄöxEšw¢…Ey@xÓä|üÖi…šuâ5OÜuKÜõ„^5r„u!hæÌõ„ʱ»¤è3"šÂpT 'üÄ”¼³;£EÍ/8ÉÀ$üíõd}»°~ïL· ®11èð.½æ~ªÖÙ6e¢%ÇœO»ê‘Í”WÏ€\$„‘ê€ôÝZ@!¼ÖX­het@žípê™Ù5QÃOèÌ®¯>% y™JÖòkD¤c"šœeb´b§ºƒ"Ì‘óECJr{5@àpa£Òä¤7:0"¾*æjÌÊðm]Du˜š‹ˆy’ìIñé•w$°¢Ñ&^Ö"XŸ5yVÑîâj0(¾Ù@¸¡03û’T%Õ@F ü¢ç´è¤†º°eYÛ'Ã`Q:ûdÊ3dM¯»9£ÛzÕ›Þ, ’¼¿÷ñ‰Ä X©Í`íõ½èÄ2@UJO71zœìÉøl1iÂŒu‘Y·Jž”ØŽØÛªm·,ú>èÇl§Öy½ŽM®Ï¡d€aJ²Í%—T.Ÿ}-ŠYóÇêÞe)î:Õ5“7úxYïµKE7í¤¾ný¸5öQr!LŨhËÈü3š-äJ¿Qœ¹yžù>u¿ Î,ˆ}uñæDíØ$Á;‚-ŽþIú„O'5mß=¢oUW±ò”å-ž¹•‘¼X'?*ÝYóÖ tËÚ«E>%Ý\ ™¦ì£ìßÞœ}Ã"냃`"Æ`gˆ½uÛ³KT`‚ÓlwhìíuÄœŒ—§Ý¼ŒW_7j2uiE™¯—>0u—t}ÅL…ëÓ1¦êS çã!Wzl£ÒÔQÏ¢½ Ž!ë×/Ê«tùÜèð1Ò^È!K²ªú¤vVFws…í–:cZÕ¡§¹Õ]„ÓîçÚN[í–­’"]½_Z„ øŠTñÆÉŒfÉÿ#ξ»awDÆ_¬¼Ôð7ùæ e:ªšS ü&J™ —Å ’²¬µmø…»ùOHbzO´óœj£Õ!ì‘Ew­5Æ&=lxúæÂ«=eÎrLÝJê–Ć3GJ­ž$ž û¹hçîCÄŸUQ…o½šöíDš[÷>°îmkdÎ.ôzÕðìßÞŸÞêy«&§Yw¹ôíë³ókêÚr¯Y› í¹Ù¤6fƒ}[r:¦ ç„â—„­(Æ[¼}cts`4¥LrèzRz9 —ÛÓ³éP5 …а·ËiXrm³QcSùöšUoæu†q8ÛY;^wzo@®Ü†ßBx¦-¨5•ù7-%nûæÚ¶:ϲe:&*½D€W¼´!ܼÔBÁ W­º%ìãµ6†ëÜ®Y,s„~{¡²ç¶mÛÜ1ŠM¤@[anW÷ÔdùÞn$Q œÈÇÆ§MRCÉþÁ…Ä $“EêÝÅˬ‘\o‰á?ºÜiâ’•ñ©D›`²¾e®OÆÔ³º´U=t—Y{z6pR ÖV5y{8ªãt¨3À­ÔZç£× *öf/Á…Üîv«IÈ üøSÊ._]{Ñ¥kÁâ…“ðdöÅ%÷ŽœðD]7u¯»ž?‡rrÛt떩˘jeùvsoêÎ)). >Ý{øt‘׋¬¦ðÆq(f•D.×ó|Ç éòÂÂ‚ÂÆâÅw«’m/œ{´=3ÿi„ï–ù9³ÌUŽñË—>àÉË ˜¶¯ÿ–jþ«2 È#õè¦%¸Ÿ¥7ûØÌeµ=¤ÈQþ{ >ØlÕi¥¢ é)gTG'k”9Ô€]œ²bÂÁZÛ »Ž'PÖ5ž³p¦]Û9ÏÊm÷ñ—ðÃ÷ý‹Ž|x]órËnÃó7k J’—”ŒÿàÉÖkGVt·Î樾"N_j©äXc”o^Ôq€@Ä;Kºš–.¹*Ñ1ßSA’÷–‚ŸËêÌýÌd Âöj(’ c€nv†æDk‰îŸŽ-#¼`L*GäÜøOpþªÕ¶ÚÆkîU ŽÎŠ^'¿*­‚ãŸUêæøkÅxAáŽ^P’‘ %“;(GíUcŒ§Œ‹[ü9Úº¡.T•­÷Û)EôÙö®^àR“²¶{%_€º˜ƒ¿Ø¹³¼=Æ%à~ÎF§’-//ä•0¯ÆFTº4Õ¢Шªê‚ª39‚ûLyj¹rOªWeœò½6ý|lPF’zRlš ¢l÷ªGd¾ûúpÿnYŸ¥ˆçqÎ{÷-Ôž*غqMׯK6Ù7l=®.ס‚0:Ë÷½9€óB¦¹õ†ró¤–­tÉ@ܱ0aþæ¼µûÆ…ýöE³Äm¥øtm®:ÍøLå¼öô„ÎK‡LÜ—è¾S_å{ò`°Fv3·ªhkû²G»fžÙp24Ü«‘ß2![¹"ëOêæÀò›Ùõ8ÑXø_¥fÆMŽÞ|eߥ¦ÇvæÝ•éˆ+È~‘}þÓ®SRšé?º‡ìñsQªZ$(^[Éa¶îß(9‡ Y$+¹¾ë@^…™ÒߦÉÕ gÖÿŽ)8ŸPv“Ù•)*œ|sÂÆ&¿Öôê³”âi«ÿ_Ñ#ÅÞqè5p¶Ûan“ë.ILsI/õM?þmÜÔØ™G2.ô8 ²¤wb£5pqN‰-Û‚ 9´–a‚Ó[>GÃê;e³6w%eßqê>läâHãf&1².Gí“þo–»„VÁcÅ£ÁÜ^ãyXÀv¸òÈ[ZíÑ”àf˜b|›†–½Õ.X>VÝ­­©æâ²ÐIkç¸-¼ŸÀ·U½ìx·rsxJîYùý5Ñ?\Z‘ƒ’À×^€ãZŽ›F¾u÷95Îv¯ìºêkÑÈ1YˆÄ„ˆ¤ì[[¶¯{‡IõpÆuž%g\2¥RsÜ.>Ààn;%z- žÐY*©­‹i­÷Bà$¢+$É´™rê¯rÞZMpÐ¥êÉ®ðr×ñ,ËÛ:^35m«š_Æ7Ž‚Ãj_v­òÊíÇêu­Fm©Ä&¹}a»8ú¸CÑ1ñF㦭¢_½Ëæ/“Ÿ\¥"%8^è².,ýw¾òr–ÜO‘;ˆ¡ã-’æz'”1Ä…jwóo/Å;ž49;‘ÓYê®*g&8„•NZŒXP¾OßÕÉÖqoAõ…r À•zÆ>H_?~ásÛ £“Œ8W:§k¶\s‘Ôm¼}™f·ºç”c÷Ø”nâ¯Kzú<™_ÝÆžæ²FÚÂúÒ¬ë+uñˆˆb9"½SQµŸ¦ñ‡ž}f¼Ÿ]ÍTý‰óéÕŠÿ(N@ÍÇ£öL¹–"¯Ú´õ¤5Î{.ùüË)7×h"Ó; òuÊ;&Ë£åÂCš&Ï ¿ðâKo®™užÚ=¿üjll‚j¾†´ùÄK òov¡†ùÊW½ünOÊ×{I&[4—ç8Ž‘DÕûœ,™jv€´Š{v*ÂsÏE•©Æ:é9«ó/Lž«•"—'Ý”ù©€‘W~WgÀ)ó®ÇįG2í¦ùæê¡q4ň{G˜—çÙ– –ý{ˆ}¢†Á] S°SíBK8ñI n‘ñ I(IRÒƒ„#¬ùçì£ÍP÷VFy‡Ç¶ÕÜÚ˜œp-sS’V6ç¹=nÞüh³Ër ªÃЇúO¼ÄWþÅuì•ñÖ³÷höκÃOó>å„%Ðã=’JQ ìæO]lì:ŸÖÀYáâ…à/Ö“+8Snõ@j¥~²vq"Å”?µ¦ÒiN„ú¾¹ò)mÒ’’ÿaúÜËõÍjyÓ§¡nx šä«©Ÿ«ýA}å"e-”‚Rb鯏T¤Üââ®ô©vŽÑ‘ZɯWñO¼ÎH|ò3ÁO›·°“%ø]¹N+ro¬25Öפ½1Ê6Z®ªPÆœ®‚‹<…ŠªVQGµŽÕb\kU=ž°¶pæt}”OÉÞ­‹’Ù2ˆ­ay~nªÓ§áiyÁ{^Å®d;á÷:É(±ðÝ€ þ.–-†D¼±^ ™{º Q] ZX"Ø:áá~]ûí–¶FÃGñß~G翌îÿ‘ †ÿìïèü—ÑßÿŽHÇÿ;:ÿe´ýHÇÿ;:ÿeôü âøG翌þþD‚8þßÑù/£ç?ŒHÃßð;:ÿetÿÿˆñöÿÿ2Šÿˆñöÿýœÿ1zþÃÈñöÿÏÿ1™­o„1‚Û¿Ñhû‘ð.þCh=Ì üdG§0Èð^—OÍøÃû?0`œ ¼ÿÃØPßÈÄ#¡Á€ F÷ŒD°DámÜ<‰¶€½›ã€èŽ[@°Ð:zz‹ môôðnxa„‘®¾àÆ!1¹tÅ$1ôôl ˜Ä’F!‘±–¾ €ØKt(~þô+´ ‹É­GbÃDC¬rЕšG äÁVgáM#q¸žËÒ1556Ó1€dòè<+F“b|Ø(ÈhWx¢d µdЙ¿‰“×ôѤxs¹h€CaX¡aN.Bá¡a.â>í 0õ \°>"”Ž0@óâà…âú8TttÀ4dz€ˆlÆflAb«ë»#¦Ò V3Gð« †H¢ ÙrC€áŸ¦ÑAm8Þ´ >pUeØ‹¢>J‰Édñ r ‘÷|” hË·ïy;ðû§>îÏô†Œ‹;TGНØþ>J •Áò"1†êñ)2Ø`ý‹$¸R "#ò0°!OhÿØO±L09lF!òHTs‘–†ìJ("â SÑ™T ?à%äê Ù°„åP[I[#š±#‹CÑÕÕ…´–µdƒˆÔ «íèó'S o;!…1”¹Rßgо@º(×þ]š:bÄÏPJ(á@:(™.L¨A³Òƒ³jBÏ z‘ÿë¤ã+²/?˜ZŠå @Ä#y1(ƒèŽo ƒÁ&‘É`Ýõ_sÙ$ï¾kÈñpÀÇÀö®'üÃé¿ú.()Ó qRy÷h,&ç„v؉¬ó^ u$ð(¾ (> Ça²VsHlEÌ(…ú.y,ö`çAbzÓXtÑIÄr*fM ΜÌ͇35 P4@âPÁ,5µ`ë“Ú¾°LCJâ*®µ‹ÇcùV|ˆI}|WcO½x¸-kj ªì!µM¦p½áºÆ~ Pa°6-Çß”¯ À(u ¾Šý(ÂlŽ2Žvz‹o¬Á#û^Å¿Úvþ Çðó Ê]õȃù\ðÃþ}Ì»m¸ðwÅ¿p[ÆSFMÃÏnÊþ¾"Ô Pë#aOÈË S¶ÈnßJÃ~vT _Ó/…œ+Ì]<¨w3—C!`v`EŽ–FŸ‹¥p¤#ÓècÀì÷nàƒßQ°Ä _RaŸÊf¤p4þ\ \WpäçÌd‰Ð4þšoê7Ä ,ီ_=Q&€ƒD)M>@øyˆð3y÷…øNçf-þ†@š@cÕ>¿ð»°@-8X‚{R<0û²@Š|Û7n³ÑØ…Þ@U~ÕŽ$˜“X…ƒpRôW©cˆüÖ±é‹8 9ŒÌÿ‡ø—vfÊFÔ¿¾–èLÇ— áÅ!4}?„zðü4ÄÁöÓOLºÀÐ0`?ºŽ/À©7‡Î†äÃ3²9§#œ(¡ §Þ™kð,o_ðҀغRÓÏu¥P•‰¼¨i¿}µ¡ˆÁ^V^8Ó†tùÎt æ=Ó1 PM·ù`0]Y«ÑÂÛP„PöðS;ƒI¯û$\t9(‹þf(ÞðÀ7Ì<´°¦€A"!sùpb²5™î§iõUšÞGh™•x)úôÖ_,và—Ï«¡ZŸP-X¡á §7¥}nryß„£¸a#îÿ.lʃU|·•ØY¿]R·³Áæ+ʬì]¼6àx¸¡œ{ú2,°/¨ kI?^X"‰‚£p¸æ–z^Ð5%,Ï{§CûË‚R‘fBW+nq"ÿ*~w0æâŽ;w ëŽ™Z¿+„¨1cx>äÝf®wëë'ˆÜì˜5ûåÔ žÚ°N­¯‚Fܯ‰×ÿpH>Âi¦‘ôHÿ§}Ñ»ýÚïÖë ûŽÛY\`8—óžb GMÇñ§š`‡ !Àb£2$õ¿üØs=yp‡ îüñht®Ðr€Õ$.@í__öá°|aoéÃb0X«¡Þ!¼ÀjnéÏ€×¶‡{óÉU»ÿÈJ&Ž&+o6{ø\ÀÂ%U¸`4¨C úthmD4f…—éA÷ !oÀ£" 0šëKb0°kò`:‚Ÿ¹l€1 þ‡½'kâÚzˆyZq_H2I& ˆ²‰ S6Å  $HL‚¨UwQµÅÊR¨ÅJÑ*T«Å ´uE+.OqiQWÜ*Ö¥ÿ„ ¨Å˜÷9Ÿ|Â̹sÎÜsî=÷ÎY.Ý™Æv¦±`”B¥(:[-¦ŽœÝ4šWûxð‚3™œ˜˜è¤ KcÈ qÓ;˜ÆÅÀ2iTë˜I| °"¹ëà¦+ƒU›¸8!‡‡#R±ÒR† Œ$+ß\R¾,®6MŠ(‰Q°˜¬züŸÿd<ÿC/ ÿeç?¡cþ—A]þpþJþÆü/½€úüo@çóõêò7 óŸŒó¿^@}þÿ¨ç?©ÏÿÆüO½€úø7 úFû¯P“?ë#×ÿƒ(€2ÿÇ8ÿëZËÿÍg< "<<2!:šß|®ÎûÑОÿCEÁÅæü?ÿ…Â@1cþ>à'ÿGõíP¡—JµtÀxz‡1óǘùóq2ÞN'"þéï#¸)éFsaÜA$áK›¾ýã_§¯`ð,Å£‚ñ˜3Xûg~ŒÚÖÁÿæüüonâoãÔ"ÔåíS†f$ˆµ& E“y|j c"Ç´ëráÑŠì åS›\dø«k$«è%'A[l§¾M¸<¾„¤5Ž-Pt°Fy9Äýt`bâKGµù¶O!óШö­â›sÑZ~݇±ˆãJ@j$î5y pG@i³‘àr“7»ýf¸‡nãìiÛÛÊn†e.>·áçØáS0` ¥¢‹†ÐP*B¥Rš™Ñôp°.  d9¸Æåéx*~ĆÐéT„ÁnñP0ÓIšÄŒ{»”‘ ĉ28Q Œ([0Oˆ?O4¢CSõ—Jü OŽ©Ub¨¢Ž‰Íx/±áíÞOrª–ûWË1†í Ž"L„Fgƒ­¢Ó}Üa{P6Â`!4 h C+‰(@%ºÍ~?ÍDè4 ®ƒ &S§òZ)¸Œ/KuR@Q¡2@7ág:²0­$Ø@ÓÛèºá„R)EAPS³ê·Nvs$Jm_QÕ'˱bX.Vxƒ•—a|ÚS†Ó4 =%=*L3¿ƒ“•&°ƒcYÿ½mì¨˜Ó :-}ˈÓwb_³Ín/ÜXƒ< *mU³}vKð…·XŠg*ã?móTÛ FEš‚Q5w¡OÙ”ð¡#);(B[ç6]‘5ÛºÓ>pœ¶ª£?è€l–WGLq‚\’ ‡U}Õ&â_yò¿½x.÷9±êqOþ`ŸOàËçðEª‚J~À&V$;‹ÀýDÅm7Å—'¥™/ÃwŠ[ìQº0TõàU˜ MAïªsGq¢êhæ6rêmð˜ m S‰T Ö¦q°_‹ÊäRad¾ßÆ+,¯¨ ø…+‡…r8Q(Á‘||Í B`€ Oð ö »„ÁÜÝ‚Ã\&èNp—?“¯|<†g'r¥Rn¼|6nÆ?èéðÝ=|ý}ƒÃð°·opÀ˜  Ø{| ìs܃}=CüÝaNH g|Ð'8Xeûan<¯™y°¶EB°6• `$:ç䥌¡RÝr‚ƒø|;žbÉlUp™JMy ®·Çƒ}”Ç÷M‡¨×¢ñüiåÓðæ`%'sR®ñùøN«E •D”:pËåq%jÁmBIœP¹ÒoÂÂ_‹+Ã×;Êa,Çqe°7>>FÈ—áÓ¶ ”+°œb›±Ü¢£„NQøtÚî­æš :!_ ú.ˆ#NàJyÉHdªÛn|™ØQÎ(‰´s£™Ddžµ±ŒamFèPÿþoõ¿›ü¿tcýW½@kù·ÞÉãßì¥â›ù÷ ¡ËÿäӚý?t”QÀvEþ}ÀÿžÿG¡—Mj‰GŽ]@F¸€tª¥F/¾~³ ”€Á XJãW•Rd®èÞòÉ< «ívçÁ³‰§¶ûÁwßß–Èø¾ >ÆIТº›Fï @ŽŠ—‹Þ 3!hï­PcDÂÈ·BTyŽt`êrn¡dkc)•ßí5»¸áü\Ú?1ÚrÐl«µq¡RÑâ(ßž‹A 8FGñÀ<0ZzPøJºír Bè@qPym\8íÐî8- ´"«Kþ,z:X0¢ȇó„1B9W'*¼ŽâkåHkÁ,JÊ—·¯oR"vGT {ˆ PZ<â*<%ZÊ‹KÓʧ“€ÓrB)šøv„ÏÕÍŠ­£¸‰ÿ蚸Q|X×Å Žô¶œ$„ó¥R±´­ zûØ…Ö ­ÎpÐ×|-†4[Wxk²oï ר²=g²ÚxiiXµ{’éÆB¡cÚÖïíg1¨ŠQ6‹ ,–V"ïîÓ§Rh „ɦ!T*EX¨v8x>ƒ§Ùâi#‚ј`Q&ÆÖJU6¦Ñ¸èê$›®è$6JÕJ!ZqàHû‹] 4 ü`ª= ÷³óµÛ)­†¢FÆf ¦]îx*t;¤šMVZT¢³èS{À®ÈL­ÆE;%6¦`à­X›FÓiZg4í‡!l&‡ÍÔäÁŠÒj´¿ ¡RØ@ÁÙl0ˆPí:fTcç5ÍúÚ߉`l|±&•Õ&Ø£ƒb0>€ëѰv›F÷£ÑýØáîÇŽõ²1iìÿß^6õïÿpþ§Êÿc<ÿG/ .8ÿS•ÿi<ÿK/ .8ÿS%cý½€ºü àüG•üõôjò§Îù¯Æóõêò7 ó?ó¿^@}þÿÈçëéÔÇ¿Õÿ3Ú½€úø7 úÆú/zuùPý?cý'½€úüo@õÿŒö_/ .ªÿgœÿõêó¿Õÿ3æèÔÇ¿Õÿ3Ú½€šüÙ¹þŸ1ÿKï .Êÿ3úõêò7ÿ¿Ñÿ«P—ÿGõÿñÓ) ZÓø7~ÿ× ´–ëpÜD®=*:ãE¢(΢0è›?#|XxñÏ•¼# ]ãCi­Ç?£Ç¿> ’+ããÕÔøR¾ÔLQ…g(ž4ÄnYÓ±…(ÂXa”†âµ!a‹ŠÐXlU;é;0J§ T¦1iJEU µ¤ËÀtŒ‚§ÝÀ ÃÓnTMhd^tË$2÷÷Ù ùQdYŽÿärÿÝ.gg™vùÎÕc{ï-½\]è°[Ø5<J·tOÍ^0Ü¢G£ÝŒääßVÛ'G?²‹Þ4!éì<Âd²ŸÛnÄ䟈òrË ÇóGþyŽabW“ðžwí\ÿ8,ýóšù^ ®ø•Þ{}y‘CÊÕêõƒùE_±¬/<:OöÉ›rg-µÒ™Pë—A:˜ÑýÑ–#>»(ßK F‚r ±îñ—,DŸ¦Œë\pÆý¿;‰¯öxpp¦EÁÔFóA1 A`£ù÷g¦t$iIZÞ"ìü´€ä D&Vî›MËžÚvï.ßÕ.x` ¼êåYBxô鎉$çqPÔD+Sw;S8íæµüËc‚/íïÌ\ UK¾_½Fp‘D´ÐÞ²óÕUÝËæ/KŸ»™t­t¼û,á[Bñ…ëY XÀ³¾µ'”Јû¾98Â},É"Š6­Yö[±¥<4NIõºÏªµörÛÛPÊÜ®õ¦Ã»Ž m#Þ´²/rË€§¾tc“O¥_'¦6à¿H¹DÄêSQÜ3ÏÁPìÿaEÌ—C"[Ê×e7^IH™0|á™»ë×]0õùª÷Òc?vú5]c 1»>ßSÔm%+¥ëß[w¥!M Îr‘ø‚õ‹ey×D¦¯ÛÎN¶‰º\¥ÀÓ» DRú‡Ì´k°Eö¼þä%]_ô¶ø{qÂØ͟‡ß~<½Õ¬ÌœÔ„Cp¡Oá_–±Á„XšÛ&æ¡ hßp“‰I³)׿eÿš½i0ûŽõd¿<3¨ôb¹`nN}jœ-Ç$ÙìÃgÚ¶œ‡/Ê¿8PižÌ¿H`lÿÝ :Õ7@¸(Ok—²g÷z[(ÿòuO¡iÙ×߆ZLNÏ?å¶Þôü4’@ Ù–FœÞ›a’þj’O^cBžnq8k—MçEóˆ}§X³M–«p&|攚 y­úqHEM&b1 /Ö¡“œ+$ºƒ×ÝméÙmÇ! ‚obÊIô=›ä‚i¦—Çä…õ™nSÁ:7³»`¦§Ð¦âË©n¿Š“ŸZ2c³Hôý=]‰™¡ °î‚I¹6¤ç®c†^ÚµÌía«DZ~þŸK6Þˆ½Ù¯p ±ï³{…Ã8wBÉÅS&Ü8ýÓ”›X¾eÊYïa7ʦ9Küvn¼ð*ÿ¾MÅ«äfóïWOº½)q?Yz쫬5Á±$ˆþ]-éyl¢dê&¸þ%·öë[ƒ®GoýÄ$9Ða qÊã¥ãzçDöm´+)¥¬lΨ;ž þ¤ž{”u¹ñP~ƒÈ7O<Ì$}éÓìw—fÎuòH:^U~jâÅnxGö-+·}¯×•ˆæÐ.ü¼:özÃXÈ¥.r«EòòPR´£‹õž¿Â]™ä^Ä=~O.ɼzú«ÀšqÂ~Ä}1–X}€s͵¯$f·Õ·.ÉÙe1D[UÄíÉ0Ÿñ‚lm9kO•ëõÐÛÑ$w¢ëþ$8äÐ@âôOÖ¹Û•È¥0éê7¯rу›²Š¿èJr »ëåüå'’q6)]1KâZ«){úì½gýÿ¹£Ôµvûª“Ÿ]ªöú{±÷‰úÔø#î—M“G®<¾è˪LóôËý>;Ÿjí ³&ì™%Wß®AD]FÜ™e'yf¯u‚ülXÑàq‚¸4ÝcZvéžµÉThí òW¤´nçü¡ŠÃ1¾œ •ÿyûô½†_úƒ*ùa†¥ø/8Ä<}·à·suYOÿ¸ºÒó©e2²m~õ åg–;å¤<\n³b„ÿŠÊÎ/ά¨.ŸÓ·×¤õYÅ#L8+Ît?caR›ðÃbK“cï-Ü<1¿fKQMÐ&w¢›xâ ‘‡÷­¼î5¬¤ŸT¿ä~ÌfÕ.2;³ª|ÎÜjn7“Ê~»rs6žY+˜Æ<ñ çΔS'-úùÒëº97’._L¯ëÕ¿èµw.ÂðÍ³Ïæ¦V1z7X[I¾sX[>Ü® |§:ëj%ùErCÛ›T4àØšâðÏú5°}O­sQ×ë²ø4©Ö’³dÕêð9ÇSjÊúýà"_É­=Y+—v›µ2iÚ‡Ò’¡&Q7ƹ­XÓç[4Tpb-9èPíZ¢Ú 8ÿ‘ž8Ô=iÑÑóçê^Ý»¶ªêÑ”ížýÖðëC;Ïæ’·ZT!Ïx+rk¤uüŸ²Êç¼x0¥ÿÊ$×Ùóè¥9~äCY%L³7Ý *¦[ÏÌg|ñÓáY}wuò#oñ |¤’0ÈíÞ­ŒÅCI«p¸ÒgäÀR—å̹!×fȬ¬Ò§Ùšæ`Âï— ·Jî?Z MÎ>½ãV/ò´ºåµ½JK&Uýï— -söO.2ÛJZéÚsä€ÑߤþÉåÙÙ„dq·gýCl"¦ïûüÑEû×s V=2n]¿—K¯¼Ø?eöë"ïˆKÝ~‰±IÙïdm'Ì?X‘6¤qÙÙ¹£]ø‰H]Õ±œµÉ•'ŸÎ*ue1ï[aÂ÷Þ®Þ„x/Ÿ¶ƒ¤¶õDJ¡Û…Ë’ú+)>£Ç/±„ gü¬í~žó»‹ëî ~ÇSGÕî?N‘w&=^Q>ÿ¢Õâޒ̘G¿§~ùì} <”ÝÛ¿SfˆIei] ƒkc—}ËVö}ß·,ìdÉ–­ É…l…D "Ie¯(ûÙþCõx¨§÷}þo§ßûº>>3çÜçœë\ßs]çœû¾ç|q–o¡{4ò´|1†UuÅö;1? 6#oá2Ol RôèÍL<‰ã%ÇN€ŸðÑÄMy§…Õg/PÌÌkЦ ŽV-B¬˜FÃóSËF@¦O:õºôýüÚ—cÅ€]‡Miˆ{‘ºƒ%›ìÏ&V§Ø ;YÙøÒ¯¸‘g½æÓo¨CBÜRÁçkÒK0³3~Gù¦YK¬ ©¹,ê3.Š{XVNyz%¥W^\ÍgŸ KõͨÁr8Q“*Û£~,-é© pO¾Úqñ%®:ï`&™»*¥¾˜šùŒiH6rßÚ©ž8Ë÷š®!»ß$œ?¼aFdŠßêäÌ÷V¾ž’\b æÕòÄŠ¤U²>_ˆv4:(NáB¢© ê"¦£÷­?b)S‘+p,×’Ù˜†tCb]¯U»¤í]•Á®2ßž!a‘i0¨góýÜL£ô4βžZBO:ø1ºÀðÌ0ûe(°é¬DÜ’Ð÷C¾ZxhR63?0lj÷‘&PÖ‚.Š\$ýÊ08³Â.3SÁ™€¹Ý÷A¢wTü°¯ZéûárÝ7^ÀB2Kác¡EIh°"ßì°ÿTׇv~Yq®ôÐ뽃¥ÃAÌ*ÉW'²rCCÑÖþ^°;«JU&IJxKÍI*iÖ·Í ¨f:f›ÍbAÌ ¯,8Ò]‡î=àAÓ¥áÀf¬Åuô/<†¥¥œH·â3W÷xvÏ$AsÌ0V` Ì(èHÁ I8°Ôáà²Èp4ŸÅÀg÷²³f|à©Áå|’ÿ=Ãéò*44ˆ!ʼú! ÏÅËÈ*ó é÷RéøòÀ o’Ë÷E÷†8Ò<#„àxu%ÌÑ•*yGŸA"ˆË]ÂqÆgvƒl¾ò¢·½š"H^–QÑbÁϹpúÞðËâ`+„'p&ÆIÐcÀOíÜ-yQµ+†s3ã3qÅ™d“ù³§^>‡^¥Ò>œöÜHqæqèÇÚ©—Üìï(ô]W‡ÖÞË ÁãJE{Œo+ô•_µŽ*±è¼¤æ~ÊÆ`¿Æ-|eLèÌQ=*O<¯ÅÁ…••³SARE.ËêšéUxS§Ç§Ï.Û¡\ž„÷ß}ì~jvÉú*ÕÄœ ÿflÔÑAÄ ¢¶KµÓÕYö¶G¡bÝV^Ò0Ú{•y¢.º`Hû’Ý'ŠÂܼPկʻªº…–'çïLÚóZ|s”qÒ~)/z>O|Å$!®vØrËÌÎqÉujeÆ`«”ïÞæÉ ôš ^«&»ûº%Ÿ¡¥ÝoéÖOK/G£’3íz¦]¸¨Þ€:›3zœƒ ’Úº{¸ê/.¬f¼Vâû6Œ.†5¼"çXe‰·Ó«–&%Nn`(zÔÈ1ÏÐbHÚpén¡²F‹²Sz*úsC”*ëÅ!åò9ëýÇB߉¿épŒÆ “åW«ô´Îß¹UWÊ_‹ “7$Ÿ¨qéK˜˜^òÕÆÓ‘=nˉ“È"Ú߉ Cz0ðÙ÷~uKDñÞ[•à¤wÏPíËpÕ×0VÛ3”GŠ·Yx‘çVM¹÷ÁÃÚSá×Br•FŠó&÷«•ÎcºØú'uÆÏOHŽôh\•?‹¶ØÐÇiÅX„Æe„¾r=w¸¶€ã}Cðà0#Œ¢1;ÝÙ’žøhiŽÓó0p¬ûññ¬xˆ×§ÆÞnqôë„pY=ªÒr·Wx…¢¹D‹"ïTeeÖ×u@¢ƒ­-Œpö,Ó•ÓÔ§¦hCa‡¡àUïÖØ ÔÀN)Ø~x8Îðœ€Å—|4&ì%¨ÙëT”yȉÔU¦ëÚPý:ÆVV«€bp¬“>dV XYò–Û•hí YPÆ ¸¯÷ûÖØôvöóù„^h†Œ:éÛòòÂ.£Qƒi(ª<1E–u–%ÅÖò4ä¡![ÊD™ v2Hì©h~|IÁ#µæJ7ùÙ/ÝÉÇÇ|_Åì®]ÔgCVäÐ (è3K-3c $Ëò¦*$r͘ÄŒ“¶àÎd$£õù¿g‚\ óÊ"§O3sŰñ (ö³%LKÁç:<È=ŸÓGzöï?jf@5yÌ”oñòëá,Âr"´*Ÿu£ê˜µ²>˜HmN”Ÿ6ž»VäÁqÚc…y¸  ¨‹%%™_xr¾é\°k­ªYµ3ËÐwP¨{÷ÚÔÜC!õn_?0õ8 |ò:+È•LÚyùÞÕ#ú½ðz2àüL*MãýÖms ix Pm+¯¾«¯ÒÂÆIš"uÔÐR•ˆv¿°Iv~ ¥BU僊$G àƒD1ò—hyuI½ŸCo¨PwòÜÂÜW‹ÁÕ± È$FDÉHr#×ñú@Æêb8µFplÕqO Ïüxt “Þ¾¾ù³Á¡Óo)鯣uJÏQ'ešƒ™û³ùvŸÏµU™úÑ+Á À½¼¸ñ˜ù<~‰Zq:q)ÌUg0¤Öä93áK:àÖE’4{Z‘«,ÚM=} {^I6“EÞØÒq14iãO}=3«d žUáÇäÓÜq›BÍM>áQôiBtüÀazq œõD€›ã/ Å¥qʃgïš½ˆ¡OH'69çeBE³ÓårŒ¤“ŽîÐÒRÃé•ä'_ Oâ”F™_ ¾O¯ <åOÂcÊÜR»W†#›v^éi +ˆé±‚³© 0ÉdÂÞRÑ õý ¯ÖÇ@kïªB€‡ è_“»$³]¹Ûž\¥Ç¸Þ0¬ñDË¥Æãp0wáb£k$­&q<(IÐÛXFùš#p„«e¦Ño1x&dP Ç€¡¤hˆdÈaŃkZÉeÈPQœ‚X¦,¢Lìzbo,:À‹àXæ=|€yR:,©É/GT sJAMõ¡ )N*yÓÞ6M#pŽñx³á{úÙà+8£cª*±1šV°Úåµ+"#kÊO#Yܨ@ xñÏ€l×4cÉ0Z@+ÑË·øeãÑ¢%{¥›¡JÖ˜L6_Í#,8·@†é•,4²°Øüi»Ã¾ÊO?׆­1¸h1(¿NÉÒÐÚÁϹï9ëpäT´nÒF¥7$ôC[Í|hGèàg]¯˜¾×ÃsÕf«©è¥ØƒŒÙ؈­ßë{­ñ©®©ap(¶€ZX½êÓ-'WW>ÂÈ8Ké´ù¡iÌ3i}Ô¡µ³ÓŸÍ}.=B:ÙxýäÄSȭƺ{ý˜7O®‡Mµ5}ÄxÍ86.-}l´ëÁ¾÷+’ËŽ:­Öãc+¨<¤øòißÔ›tÍêþeé‰\"úãÞ'„ 1¤eúkø ͲÕ«£{Û'5Uä6ÌÞ4á ®cÞd¡÷)CE¶š…'á°••‚®µÊ+ø2W÷$(hÁ纂/-«Q Ä3?§i½úŒü™ŒþhQßÈ”5[¼ŽA€:Ègj•ïí˜_îDý‡0qªlYœ{Êi9³Ð¾±Úº±eÝüJ%È(5QþùÙT}74Æj—FÄ„€ÇÙ¼iª@=- /©–xŠ9Jh ±Ž.ÔÝI-H5½nXúŒ\û ¨9ÉTѽ*ÕéE™-eÇ€0ãÆÈÑÕÞlM/Np¼ú !Õ uqË=¾|¤oÞ±]sqP7¦ ~TõäÓÙ+Ú"iÕðRÒïî‘YbyP#7zŽáZÚ¨¡EË_á©4W &4mE±ª+ó9®à¢âý"9ú4Zø+èaÙ4ø1}+h/©4¬Õí ¼ —¯¸SÞÛ‘fsàe´>/`NUF•äºt-ðöƒ@ÒatÐCgà‡Ëv¦AÝ–E/R„)z›ê:é ûúS}HFªw€>wÞÙEçÞÀA]kn²O¶ƒK.Ÿ¤rñÅXÙ_å3Ì%iv»i 権#Áõqµ"G4ßÀˆ5€3)Ùw%ÑÒ°Äy{…*:Ð31ÑTâéZé—@ôY¶ûP˜F.T8T *aµdœÕVÄq‹•_»8…ßYc$-µx„ù›¯aܱ4ÿ©Ï— U)RãѸô•Ÿ%åßÔÒÊcwzð /fVd#'&%Ç¡gô&OÅ8Ô›7 -=¤f8Ú•¼¤Cå}¡q€„ °!Ë·Ñ ué.è{Œ †#b>U¡÷ G Ÿù …XwÝøZ†œ8­Ò²Ð¾v7È} »‘ƒÿÂ9²Â6EOë´ú™b/³ÚàP= H¶ë8~Ý» ]æ¼3Ô«¼G‚Æ0ôJ*¹‡µI˜Àƒ¥¹¸^—Žùî1 ¸»ÐçR e:~ Zš®s¿ ^fÉp/JÀ˜ãIŽ™¯ßdÆo>uôÁÇ>ñ¾ª  s‹üÇÖï8Ÿè9ª3UmyíbjØ÷Rr|Ý\¼bV×J9/¼Àð³É½vå•A»øÓ¤â1®7cñÉxŒíÍÇÄ’4òêúØÎë­¬§´HWWÕzñèÐr‰«Kû¯ZF]ªã—Òׂy}iQûm±³¡&¢\>Ú ñå°‘…ÑTØ…^jË?îË´Ò)ŠG«Ä9Ç>PHM»`£Séö°°Aw+…¼ÀѦ̡V=¡ —h—3~\«¢5·ŽÞÀqHH.V7¯`û²šábØ G0ÌQ9CŠ®ò?§k¿r@‹ÆíÒ˜ €KVíÁ‰‰Çf¢«Õ­ÎV`%-ZeTÖr äêµO-§› .3¢• ­©º`G“}é •îcó…Šš`í¥Å•MË$>?è#öð‘´ûðq ÃgýŒöì=_ïò𠏝ãˆ/¨óµ0­ßëYðìÓ'1 OïÌ EhÃxmNC K#Í2åS"ûº’çšJ=… úœV@›;•ÍÇ%;ŸŸGgêú*ÅýšGkß¾¬âÎ<“˜xš+J¼þò¤„‚x¾¨þùí èÿmÙúüÿ7:ÿg÷÷ß;"[ñÿÎÿÙýýçŽÈüy~£óvßÿÞÙŠÿotþÏnüßÙÿ£óvÿ½#²Õÿ£óvçÿ‘­þÿ/ŸÿË„s!»þ¿ƒ²ÿÍ÷¿×9á\lLlLl·ó üÍ6þ‹÷¿±~Ïóÿ#õ..øúù»ïÿóòŸÇÿøçqÉnSÝ–l{»Ô»ÔÿõãÖ¹Áô(ø=aÏ_ׯ-JÙ­“ž¯³`òËzžÁÝ)6ñ+×ÂãŸG›©£Ùú¥ØñfïhòƒÔoÜ!ÖÑö {ÀÆGþ–ÿýø_vÏÿÞÙêÿ¿ÿÇîùÿ;"[ýÿ7âÿØ=ÿ}Gd«ÿÿFü»ñGd þ¼¿Ñûÿ»ïïˆlÅÿ7zÿ÷ýß‘­øÿFïïîÿvD¶âÿíÿw×ÿ;"[ñÿö»ë¿‘­øÿFëÿÝýߎÈü‘¿ÁúÿËþŸ—k7þïˆlÅÿ_]ÿåàþ‚ÿîþoGd;þ"G1qwÖÓ3t155qÔCÙÛÿÓü_ܼ\ÜØ}ÏÆï¿8wÿµ#7â3FðÁ9 QHnahŒâ1å1ä3À¢nÊG"þmýv埕ÿÿÿåü_\_~ÿùÕÿy×ýŸs×ÿwF~ÄÿµÎÿË‘ðÊ‹‹—ηÁ†»ÿÄçüSYë?цa  ãAð±qrÂÿÔœ‹cœ €ñòð±ñðýÎïOü§Ëß÷ÿ_ÍÿçEps~çÿˆ]þ¯‘ðQb?goð%$Í5`ÿ1~åÿ"''¿~ýúÏ)ÀÊ Wõp¶R€í3ߤ{õàpà̉ψRë§Rl¢©Ceyn³±«–ó”[“©í¾Yò!íåËÛ=´…tL¢õËÙO‘e3À>Iá^O(1âP-ŒúI@ùÑê ¦€Y猘P&úúôXâ QJÈúåêU¦P”qp0Ù-æ(Zõ}IHXQCØ$1JGñúP">ZÃâ J’"Ã`±é²wšMǬµDÑAói‰öˆŸ'Ãu`‚ n®–$PyÚŒW&¸ÝêÁ]ó.é­×é0?_aƒR¼~¹Uñ²ê»£«×§',+4¾dg½ò®ãÌNéH“"zžOQ²w1|Cýô"²Yª½§9åæ¼¿DTO£:¨;ևʖ ºTöÂÿ6E ›ÒÛ߯ï$©]9a#zI[¨OÇzÖu¸¿ŒËî]ÌŒð…¼}õ4§AµehêidAƒ3å?Í÷ûÕ°”r0iµ eyWfÜFE„f8IJío&a G5Ç)âR°’VÊ^¨Q•Éè]û„_Ø:?’á´j•™"+ —R5ïoÆ!¼jT»H” îiõß!øä¾ ^É1özeûk8qP6—ËÛ»ÁMuEÖ F˜’Ö ‡ (‰-_½,F2Ö³4QøÂuïò™ˆNÆ1‰+ýúZº$õ4Š>cîÅ„fâÂ. #]¼Â”Ôœ”lXÏ£†š ”lu2¤ÔÜ.xZ"(£†D)§ÌSùÚ„¯:[òéõEe²FàZ[9£ÃÙ ¨‚3€ôö…Õu‡{ô¶¡)Oº¯ÖÕ9˜ô´vÖ Ò:œß/½æŠ…(É‹1‡Êê׬¸ñ€Ðæš=R]£:0°X’Ê܇Šþ”âkàØrßANw6þe¡öÊÁµ˜sÏ l×LW ø¬ŸstÝn›‹y îþrPØ/]o˜\쬠G5¼ñìå÷=;îÝ{ráÝ 39¼¨|Å#IˆÑª÷O%mSã«"(ìÅ\}1þ¶áº‰nÜÝ·Ü)gÚ 5'VÏXu&-s¬Ýn²/Ij|B]€gýj*2ÒLw¬°fµó½K݇•…¹¥oÓUü£zKR‘Ç]ìK¬>_:R.TìqÖütâ¶Y†QUe•9‡²üžõ#„8Üg´2½íJàfÁ d…}/‡Ïœ}!oÎÑ©IÎgÔ+, ª í OÅss<æ¼§‚D4^žÑ]éòÒ6ÊÄÁ.4¨îùØjô º}ÞsÃ`j_ŽuÅóˇo‘V P ™RAxÊB›JðRDuä ë+ªŠh‰(ŠYÖ†”Þüi{¥;uOìí[1³÷Ì ÷ôp“gù?;}ú8^PËÙ+ŠŠÌ’½gh:aö)• ¢ÎšÁ ïÕü‚w¥ë¬Ç˜ýqühÇ ªQíÓOì\¤IÍó:ŸGܤ¹-ÅõŠÖ‡í³”ÊA¥+»Á³¸§ôé8¥ÿj¿r¯ÃËVþÞAK™¦½÷°áΈ·˜QÐ .Û7ù9½?eŠ\޼Hà6ºa2Eð!<Hégv{,lÞYÈ}^JÝè}Ä`™Y᥶«øy‡ˆÀ±È¬Õ^Ædý`IufÀì2rT±YÛÃf¦ýR>"ÉÏ÷«®÷Zu²xÈåÀÊ©jÚú"Ýê9ôÆèÊO<Õåã5Heèí)“ßyÏ¡Ü__¨35ãÖŽÑžæÏ É“9ù$¾=¡¹v¼§Í» åZšOaHÖZÛ]”Iö^”/¢¸ ãw.âÀfñ–ìlù oÖÃ%ÂtVòä¿@¤˜ÐâÌÞ†5VnjT}Ðj®ClnŸ 6E@7{NÛ;æZï±qé;ÇT³ ie}’ hà|Bjm9è»-3€»§ýŒÑ•9ÚVW•çÓQ]«•î”ØOá}rA”qÓQ¡t- fU͵Êôû#-mï- ¿ˆ#œ¹çÕg€l½§L³ßžյìvë +€èRY} Ça)Á÷Iš"Ûû üQ³ðkJ‰úÂî“dý}®E¯®¿¿ÝùîÜô­ž*#‹¹)<á°îÅ6óƒy-X¿H0sñœ¼­aÖnØÑŠÃyX,¢È¦òõ™åž<«(W žÀ örþW®ŸF’ÜK:¯NUÜ ? çü(S§L™kˆxâñ¸öD¸“ô]ÂqÏéWt …K/öû™´fàà6ib2Õñ@åö+“ÅÍ’Ô? ºÝ{ù˜}íír’yª¤H\9ëÖ8ƒ4™zeH$¾C¡lΚíJ2…‘µ¶l'Ñí±ÏܺØ?¶ÒuÊ{°ùè5û×ys4cу ¢®y†ÔÜŽóTrÐ|wµàºrïgon?:gëNw§qc³tó„§W`¯7¼8I1‚/‚ufïã”h{wçG+ŒÑ*ÓnAe2‚2Wêäð¬__ žueÆà :˧wäÊ4*/,wb¿ÓEÊ4^œ Ñ @©”0–ž…E ;áW.lt·9A¹çªFDÆl¼»fáãstY¸–RÍž÷ÄÓÃy‡„&ÇìØLî„ d}³Q!ùµ‘¬½™ã¡(™6VŽ#éä±9…o ázëK¤Þ˜<Ï€mšˆâ=B'iKñÒAðÙfü¯çŸÝ¿Ü>Ùû*Çä‚„¯M0µ¬åé¸ïn¾2¿œÆJ0e_³åùÐÖ³w÷³JΪ¿ZFéË@À,mqû™ëI-œ(µWBêZ´¥S5Ã4‚ÊŽš§V|ÓuÚˆ¤ñÿ±w%`M[‘ZÑÚŠ¢\À¥j„$7+ Ê Š€"¢b6H @aSD! âöêFYôT Uªj#X—Z«â†¢  î ‚–7÷& 1H´¯yïå|@¸ÉÜ9sç?3sÎLæŸè7wpÚÕ. ùÌOøeGÃBŒÌAÒÒ– Û’;YE ŸÛ¢m›êà*no½³w»u¿š\<ñæ#I:ªÏEQMÞ×mÎ/þÖê F´N;€Ü¸·ãâ®ëÒz¼?·ôûk–‡ÚŽ1*¬ûøgß="Õ|•vÀ°æƒ Öþ²ÄÖˆRñå4½Ç«¿òYwÕi…åä‘#kÜZn¼tpzÉ‹ãniØ‘B%¬|roÚcÝÐIe«Ò÷þè\ï²uÆoí·Né`‹)F Éíâ?µÞà Íl-5Ï~ýÆÌ=;‰uë¾Û0W3Âu°ÛÄeÔQ+wlšblàä5 ˜_ŒÈqý%ƒT‡\×àþbÓ™'Ki_­yfå±½`b§¯ßéø7u¤éßH¢¯hß6j^ñO’Çÿœpad ß9%óèè=þÇã)bÿ‘„¬ÿRÈêø_9òßÇÿ&µK Êùy¡s—aL5û›šýí‹°¿}ÜA"emƒ¤üO‘´èvFé­‡ÆFdeÃØê@Ý7‹ºJs‡ºö8š°@3ãò€¥z„ Ø(#œŽ ü"[SßsMá ­Ãùì0B85&Hhmc‰&@µô”–%ä"u¨(qDT¸°Û¦6ïƒý° K-°ÛX‚fû‰è{:1©Rä1¤9ÿªq–,*³û467”-/ë =A’J’è³J"¥ó’Oâ&MËbXÀ*â  ÏAÑ—3 +p‹ ôl­Ü.U*ø ìqx~?/ß}‹*¬P:Ø‹œžð¾t«+²“UªQǼ-Ý Üó-Y¨ Ùú†-Y¸ –T0É¡#½+²Öƒ  x4"];Â’`Y;ê*KOùÓ@þ¬^ðìM‡ÃâI4,L¦bñTr¯zzZ†úXñ‰’lIàd³Ý:_ ½BØ(;’ Åp¸LÚDB,.’#/fú¡Î«NÓê"{ìÕ"ñ`pŸmÈ=ŸowõX©tOq76A¶¤õ)ÄŒ%ñX˜„è”^qcÄžjÉç÷®äGt°0LíUØ ¹›E6ã°,²Ô {Í› ÊOø0oÚŵ!*ZG$^aá-Y,–œ0öƒ¡—‹Œ2 k‹Œ‡±@¼(Ð…,ãåt!®Ÿ œ§X‚Åã‰X ´X"^ò8¢œ&7”«X LÂâ)x ´dZïà€©rj£>I K€‘§Á#X)ˆ@‘Sà ‹m0\÷ 5‡Ø3KÅ!öÜ;F&y]‘ì°ÈO1L& ÁTš¢Î†åÅÐ…L ùb€B«£a‰ˆÉþ€÷® Œû,9âRù 0–H†±$"ÈŸ†Sô($v]™"% ð$`Ò$T¾çÑâC¾` ø!ôØ·Ëú/ïƒ%oCˆÒ_°ÎNh·a€Éæñøt x]ב|:Sza`È‚(ÈRòGÐõÐ$ }¨êëØp¯ñ‘Áÿ=Ý"ñÖBÙ¡nBv¨;;TPXx ;I6PN3(Zz) çwR‰J\pI¦rYyÉÞÆ ÃC»_r"RŽ«8ÚÞè€&Ç×"ýDâþw=™Ü£瞉>˜íG Œ$×ÖSÍE¢®àõ#%*(¤áƒÍ¡Gs¾ô¡¡|ÂÓô0 ÀuÊ5$´¼§Œ~'z ÀÖ}ÄÁŽài\>Rxt¿/Ô‘´Z(0I¡­ ü2lí¢„œp•%‰Ã·Y¶îtA$äË.bóЦ«~@€Í†[ñÀç1èÇSÐ I;E b[„ðßVQ 4ñt"µÅâõX¸ÙàVP²¥ÃYàÜæ‚LÙ{²›n÷ ~$_\ÉPˆ‹¸Ž;1# ™‹à†Ií„øŒt!ÄB1\X âçFñ°H ùºù¸Î˜åÙM÷ƒ|í¼¼ì¦ûøYƒ” :Á§l0Ä ùpCù<.È6†.ÐÄqH?âáäåà ÒÛÙ»¹»ùø!«³›Ït'ooÈy†dyÚyù¸9Ìr·ó‚-D\ÛH!âLK;OÔgì%BEzb²¢ž¸‡@U6ò X©ßŒøÁÀW„âØvg?ŽL0K#?\ ÝÂk¤Ôf’9€¿£¬²|ª¢¾'C×E¸- ŸÿåŠ*ê½6tò—òÎÎï\Òy)ÿãÕDFl\‚Ð.e&ÿ²uÁ Ý,ûKT !§ö=ôŒ0ž”P_5ÌãËU NQY¿œ¹(±ð k]˜uc Ðw| @äåÿ¡f`Pª¨PÕk+Xè v©Îô®U¥lãË8ÈQÀ1VÛŒL­>8-I•zZ…6Ó9ÿ7O{Ò¬`5ûÿ”ÈÎÿ¨ÿ—tþÆ«çÿ”!²ø«ÿW'þjþ¥ˆ þTâÿRóÿ)EdñWþ_õúŸREÕYÿEöÿ¨ñÿçEàÿUûJYüUÈÿWûJYüUÈÿWóÿ+EdÏÿQ!ÿ_íÿ)EdñWÿ_íÿ)GdñW!ÿ_íÿ)EdñW!ÿ_íÿ)EdñW!ÿ_íÿ)EdñW!ÿ_}þ“RD:NeðÇ«çÿ•"²øãUuü§‘ÅŸ 2øÔñŸRDXuðWÇJYü‰ªƒ¿:þSŠÈâORüÕñŸRD²ê௎ÿ”"²øSTõþo¥ˆ,þTÕÁ_ÿ+Edñ§©þêø_)ò!þ#…“á”üÌ#@€?áüO˜þ‘ó¿ˆÈü¯šÿáŸf L`° $“F„a6‘I¤âXx6›D§Q D†Rš Z¾œüµöÿyG€*jÿx ÿ÷öOR·åHOç–,†…kÍ%D€)X “qX˜Øy˧1ŠB<Œ%Q!˜JÄRIêx* ©ýæ  Ú?H$ȵ"¬nÿÊùó?ûˆÀÿóÐó?cÊYCÀ‹©ôüÏÞOþ¬9D©Ñ=ùSk¿ôäÏ »˜ëΘªçC/"¦QZÆo3í\EŽ6_§å{Xd+{ìð·smΦ¯(É!ÀΚiq 4 cÛLÞ–dÁ“c&6M¨ø3~¶°Ÿ‹çW¦«ÆkûùØÝõt¸¤2}1UÓÌ„_E”Ÿ9I.JxÓù•••!~´;°¿Ëò´NÑÆ„)+ œIù“y¥±2jèù–öuÃÒ›ŽŒ›Û¢?=û Í—\ä´Þ uÔ¢‹×+»·íõLobr­ÏÄÆñ›u§´´qþ¼ üœÛ×úêàšÏ-˜£½6®ÈhucúëMµ>tM£u“ÎeÄ7—.ã–WLzŒ&:m³cüÓÒÊþÍë)Sà}5É9fs øÚ¥¸ÉÔN2þÚýWͳsÒö]ÚxÌ­öÒ`Qí^Ê!Óß÷ž>:FÃ̸-°&ýMŽˆ3ÕnÛµå§ÞºÙ„1ú!áÜ„Ôúq}·û¡ø`ЊÃ}µCf”1q¹«cל~9|eJ¬ë3K·Ñ#÷ ¢3¯Å½~J–nÝ7³m¹YÓ~TÖøcåÄ—ÂR—ˆVúçºÝ÷Åúk¬w._KýÚñYËãïŽq…©7á‚y˜ŽÌbü¤9ù?:8û?$vç™]t zõrâI7»Lýç/9šÅõ3]QàqZïŸa5³yó÷ëÊò8ʪ¬ãuÑËf‹.ºe='~}‡"c¨Æô»Ù¤¬hQâ-Œ.%ƒè¼ˆÇ…X =HX¸ëZ™FŸûc26…½­oxŒÓÈ<5(§"&Ø3M\´05ÕñRôâ§/B4ûžZÖÜ4Lól?4Ê,t$îîæ¥Ô4æq >Í8vwÓå`ˈæò‚PêQvu{ˆö GŽÆ¢ýýÝ ïL_=l=”ꀙèÝ—·«¾¿5B;÷éÔSZËþuË‹hÄ©ºž;×p­m€¡ëÍ¢Ö ¨ÜG…yg=`µÞ ý^v=ë‘_ß¾ÙÑcKÎhDga\Vü>G¸qÄΉ^w7°fu|[§yk¬Eý¹G·Š,ëKÌ£Z³&2›ÔÒQr1Gc¥Ã“%ùKÛ…ö©-¿™àm›:?¿nì›ÌÙ³f˜Êše×¼‹I)½àÉ̹ö«ff3³zâ8qJ™Ïür§ä)CÓÇù<ÜÌ× °.À{§óµW¯ÞÒ?Ç·Zf41²}äðó ÖNl7Yãr5¹:çê¦ÆçßõËݳ%áUm™^MbE¬»fðŠ‹ÇÅZ'1~áý?w'y&g¢W2¿½~¬%AçÊÊÉ)[ŠšŠ|OÛwl‹Ð.Mn!»OÙÛ–ÁØH¯7êç~ ©ßð쯛Æ=¼•Ï€æÔˆÌÞ³‹ºïݬÚ$m·g9'oNNºj½bzÙKÞå¼4}ç"Ìö¯€ÆW"¬vNè8ðø`žÍ/üS=¤ù¿,„ñ¨l;ò<Œ™’{ënˆ¦æ±þW´Ø»G…h ›÷%³ËÚIײþÀpÝ̇½Ê´;chû€#ÞKéÏ7qnï†úö3K =u“6ÕÿàŠœ\ÝBNj^AuÞñ‚YÑž¤«{"¾oú|ïnˆ5ô&}ët?ü„~øO¤güÿ8@Lfüg¨Ð÷Ôó?JYüUçû?êï(Gdñÿ¢ßÿ!aG¦¨Û¿åCüåxŠœ‘ƒN¤Ä‘è‰FŸ9ü‰ó¿RüÉHü‡têøO B£Ó($:‰Ê„)DÆÒ˜4:%Á¦ÁTBÿÒåSË?+±ýÖ°Âù_^¶ÿ'À`ÀP·eHOó¿LKÜcK ™Å…ÉX*„§á°DU=‰ûß-­ýÞpïíŸ@!Âòí&©Û¿2D~þW£NCC+ÿ­;gÓ^Æ¿Ÿÿ¥P(ùùù¾¾¾“'O®­­•Ì›˜˜$$$h Áï’õ8²Á†t"8ëÜ¢:×ê†Zÿ-º÷jœjO`÷Ì›º‰öÛiñ‘+ÑÓ755 ·²ã>œ=õÆœ¹ÑÑß`ïo­Jt:ИÜG·iÁýLöS¼–¤Žî4鞣æóâu©ÓÅ´ŽÖý /¶T3<ö¦ÝK;Ëúá{Ó}å®y—Å¥¦¹µƒ–L¸¾%þá« _‹ _X¾Y}T¼kx7í—Á‡_¿[µ­Â±¬@ë«»þ°x¿·ã”y;²ëÅôVû ?çÔüÐÚEŒô+ŸgÖ­› ÷½ºÂÏ­îb9©àŒ£'Ë“}]Ü3ûD v¬Juœ\šÌ¼4ö·¡ÙU Çkô²,í03[“Rx£Ÿårxv“ÍÃåÙQâWIø·ß.yH¶Ï½|d9³ùf…N†°ðüÜØÂ?ùƒº$=Õ5¯~}—T4¦Zœ“m5|ÌŸ'‹ÉÓÊ*­o]Ë{'º)*4ª¹ñxò±ù A;õ5š[ß.¼cË/ Üöô-} åZ±];÷qéSjŽÍãǺÛUËëû=‚3­}¸rÏàÑëõ Ëcò~°v^oëÜaà12¹íÔh}òøŸgë”:›X-8·ór®Ç[Šaq[lqÆlÑKØã샼†r®V^õe‡'âaCô‹Û†hø­ø¢µ%!êY®Hw§ª¥¤6‰±ek6ìvöùÛÖÝìídûÞúø=k©Þ/"«´Í¼‹'¿ÑÝ=i­_ü€Œ–±¥OC†}¿Ût_‰S^ã¦JâÓ’£x³+Uo0Æ¡©W‚F¹·øýjå9J§Þåüܽ®÷ÒÇåâ–Š—²w3 |©ÏÖ'·½ ]5mtsRKeqüãŸÃMÞ„Ó¦µißÇÿû  SG œþèÝŸ;I™Éû/ŒÚ×XÿU F'aÛ–gŒ~‹™z‘aS¿¯wiŒá/7¬8Q6t帜Ž×夾M†›_è³ð¦I>)U‡â™âÑñâçC íÆ÷]:Ò¿%_·Á6 [W)¼Tçeôäßì} <”Ûû¸V%É’’0c}û2 Y²SäšÅn0ÆÚ3#LDÖÈ’²åÒF‰Êd,E)$û•­ø¿Cwq—ß÷~—ëúß;ϧÌ{¶çœólç¼ç9ç¼î~ÝaÞÉ^OY'¹‘؃M­\ûNZXØ‘@ZbÐ@˜‹…N‹»‚:´Â`WÖÑ6t4|qnl„Ø3népó9³kˆß„‡ùËÍëƒbÚ©×8ª­…ÃÂÏÎ_F‡&µ“󖉨Z’•¥¼u6?zX «PÝ‘i©èdÉš@µþúÉÏGÝRËŽÏa{‘¥`ÏWÙ¡lКÙ>!~Ç«ëbÍ‘ø}¨ûÉgv°‰KôÅ7’ä[AÞ™&#ýŒg$«Á ƒ'9 _±¦‹Õ‰¿ûŽ+›dÃŽ$©HÏÏnbÑÞå\”¬¢›:ËÓýÀ™4jé‡Ýþ,)æ?Û÷rd½|LÝËœ,öWùu]Ôï/ˆ*UÌnb‡ºÍ§ó³e:哊÷£ì[q¸£¶ö(«uxfƒz1“­…±Š‘½H|_o^ÍnþÎæÔŒw"$"R(Sm2®˜tžÏáØxœúqqšÄ¿ý¸šý“¤Iæg4©rsãv¡LÁ¬†ë³+—û®=ðò 5_ÂJº1ïÄNqM·ãdGo5pØAj¾¤ÒA͉:»Ç0u¡šþqWâ‡ó\²Ió ©ï[ê« ƒÏMA7;l?YŒ@0G Í@ŸU³+%…¡Î5 Qlìè­a|®hÒ‡“e AÌ»ªÀh‰‡$-Œ„VÀÀ ý×6=W¿k¶†ˆÝ1Ú xÀŽð¦¯Âv“zÐ`‚Ƕ7û^ÌqµÌ]Ó-˜.~¡g›‰ÏŸöùrmMÜ+ùðü‘È3dG‚K64+FÚ¸aoncŒnOBÀ’èuúC°SµVvL©t3Ò6”¢Ë]¶Èz^9{u¶S€÷ì«ûiWÌn'¼ }‰¢8{V“ÿPZë쀊¢ôtÚÀ’Â5Èú>sgÝûÈOÏ™d8;ì¢@Fi‰Ó1pË&djÔèÆFã³¥Ù12WbJ¨HÄr4s.1±þ=…›¤Óvã¦nÛaŸ¾@eØÑ7Dbî«K6ð³¨R®gSÛÝú.|=:S¼ýÆ 5 ·’_ÔMãIº¸ˆD—¾êà Jæ±aÙÛ˜·É8½ôð+Æ<—xTò¥·´?}µ…Ä¥_p´hÖq:<ÃvF‘Àà‚ƒOžÙb¯»húX{©€ÈÐú°•z?ù<Àn3±ù*ÓaV T5Ì$PYK;V®cÐ;ÐÐOúx=¯ý%¯ý‹&scïMsH ¢ŸK4Œ¹Èò<…£Üÿ³‹ƒ¯07x×í¤ ÑJZÌ ³93 N¤ÆÊ•Ûš¢íÁSlOÉßãsLuù¢†ÐÈz–,nˆ)¨ S¸©«Ü1¹ù“gé`ÎÃ\}®ÖÐ,r[|ì õjNïüÅO¨X^]ÝÈ)håâ™ñ /Çõ_¿ïÐ)Ì#kA=}Ú1\Rum3`ú‚¡”™¦;2'rìÜ’òÃE6 Œà˜w ˆÒ„m=î j‘n'mZ€")` z%- 1¸Ó6×[)ñ»ÕåRy"ëë·ðoN¶*±4c¿E|¥Õ{Í õ,¥hýb£õŽuÑß_ŒCXf‚Ø¥OŠÜz£†‹‹CØg¾ ã͹ &$dÃ]tûäÕûüWê嬬Ø9IãІ,Ã\§ˆ‰’îR.·“Ð@ûÞë‰NZéë[UÆJ²GØ»ù„!nû¬Àøˆ˜0é.⩇µÂ>²±M Ë‚©ÐÓŽäÜh墓´^¤q¤ŒÜ {‡«_dKvÈÎã /vÃLµÀœDB?s®Œ¾¸¿W¯ ø¶H`ÂöDœFµâ¢EL›2òÂÆu´ËŒ„ ,4^ŸŠ*xzÄX ¬@bZŸÛ~áɶ¾OîT)ÖâpWÇ7bžO\c`[þ‰‰DÖ½[n®{¨¼á’QáE’Sø_ÌÙp`ݳm÷ RÅx¤ºÍÔñ›%ˆÍù>üþÅ7C<†ªª\Õè>K’µ‰¯¶ž­ ‰óãâÞÉc³ï”åPmÙ¶TW猧á½Rü—´/Îqu ¾U`h]‰æ Ô¹÷/OTöVóä¯çN°Jb¶²…Ø©ðîÔ½LÁÚÚ<8qô æû:rž, ùˆW§;œnåÅÕÁ[‰Ê•½ û³®¥eb«àµ2d¾Ë[×È+¹à:39ôöè)Uc½‡p¡7_ó/Ï:·ÚU”ð…úÌÈ Ù3êdB¢=`Ñ´‡c/…«Æs),ħ½eÏéC˜pr%]†/$¦ñX霖.w±-™|+ÍÉ*Z~£‰¿³ÑqìxØÇ—o¯2MMÞdžÖ[Žc(¸£\Ç¥j;')'ËÀµÏÒo€X ?‚Њ÷:!£?zåë=Îèq|dXðE‘oD D-ðDtúq|O@‚xÜKê Î]ü¡'“‡ NÖÉ×®=N{\,¹Uìˆú˜rË5K“qùöµ'&“É;Øë²t2ŒëØM>‡ÞÎdew‡eÄ[ôm{¬µ>ò¿ŠØ_³GšãøL±0všíýAçÍ’–šoá—­3Lö²/Þý.#­êôhª®S!BB·Y‹=NÞ!ÁìrêõcÕ\„ #¯úŽpék¶Á¼ïÑ0ùìÜHæ(øø uržÃÎg—;üšKzÂõ½•|×Såòh)!Û¬SO7ñI–ûoó3»Hìb9Ò}"Pg0¦è|SÎ%Ô¥8¡†d#QÏc‡ucJt“cxÁð¡íi{«ºÞNHQ~J¾–;öLÞ¸åˆ"Ñú7Þð ªW­æ,0Í»çXYTKÀå–²4ÓùRÒ\t·%2{ƇcšwèRե΢¡–ð0ı2ùâ‰9–©†î#xd"”1xð|›’i—Ö¾O(œbÔ è©=Í›{;c.šÿN­â`OÝL^}S»_ˆ%ÊÅ’TªZ!½)v ’j¥`m0g­°¤qç²ð© G“2,Õ!QYD¿äN5å Bå*¸Ù…åËÅï„|_7ãV@&D²kç æý)sÈAS>do~ <íí­%¤vž„'üЛnDàÏqdÁ„vþâ ­»7³É¹ÒÇl/ŽÔK‹¾°oÂôE MÁ'§Š²G­žŒd—Ã÷‰Ù×}÷<žªÉ6¨;B‹BƒW>ä±>>7ߪϙ½_¢šÛödëÉñU×h+aKÒÉéÜ íE¼ÀN¡¸c"dñå[±°þוÇL“f®jŒ1˜N£-…Ì"Âô)oM‡)_ÕˆÂçøijqçg4.{ÆÍ|ªu§½‹/½8&ÛpüXDd:à/4i“:îžlê>ÿ›Ý ²ïÊjÅ/ÕokîßæØ°n'ûý>„éÞw’l&U»+F^× IÇ /$CÖ÷€§y„ƒ»·™—wX!Ë]G©oçôæ\zÿ1uS.­ê“Óýî‚ ÝvjŒáŠ [/¼¿0Þú|Î☗Ñh×Ýðí£7†¶ õ Þ>„.¼þÚ¬’~šòømÐ[W¶1ðm* õë—Š3Sm*݈vl¬Í»ßÒLå ¦h_Ýָá"¤lñAÛ‘³3OÕ>EWe¢å5CFÛྠ/½ÑÛ?ŒP»‰æ»xÑH‚!k'CcoUˆ š<ø¡K‡2œ5Xú܇À§Rü ª… ý"UŠÚ6Cþ*{…俸%ºøØ§‹·† õ¾hNöZ¢Ü˜îæXýÕC=Üõ§(úrA©¾æ^±.{)}lÃ| 5ðÞÎΉ*=5u§KΟÆm'¥m…zÔá¢M?^'z[Ǻ¤qEFÃodøÏ*½Õ¤”⼟>ogß; ƒtŒVmóT?Ò Uµí9]œ’“Ô=ÀžrI¢xbr‹Ò´mf{Ðmµê¢ÖºöÛ¬Å}²·Ô]¡ˆ6ªWä†Ô:MS  È'Ný·×%eG@ ϵwux[Oíôø\€ ªgG‡vh;å†iøuù0¥ž;|©vÕ¡SOÆ`äÁ{£K¥ÍWsI‚8Mù|ü”Z]ù¶Ì[óùÃuz;¡…GïMS•¿ 'DF¾¢ŽÂuäƒ"÷ôd¿²Q!# FaÀ{¸[Ú;’\aõüéÐý™ÛlÚ¡„¢„Ϻ%cŠÍlåw‡ö¨÷b›ŒÙ²¶Ÿ¢´îÒϺð¦I¸zŽè6Þêû)-ã‹JUi³jõWóöŽÛÑãWÙPÙäkg74–•‡fõjrŒ"wþ~»:ÿ‚üþÈ9ˤÁãf¥õ'ÝÒýw|Ö2\à a—›ãbË(::s˜± Æ|Ï­í}ÊJÍ¥¦ðG€öS¾RŸõ C7`®‹ËÀ 95Þ›¿ ß>Ó6’ô9>(>WÌxZÞä]—ö©Ä( røì±{,gžÉÇ_AŸf!¾—ßYçF‚y÷‰Æƒ´3 .Öl šCX޶ÚçÇßñäO~AA¡â ÷½@¨÷è¶7„ä)ŒkD—ÅPÖŽ]öÇ nöÛ‘ã+ûX­XâÅIjLͼÆ%Â}Þ;ñX-ß“ŽD I`¾›wÔœ¹O§^ÎE|Æ×1ìcqûÑ`X[×+í¤Œ“>û)ê`§ˆå×:Âwoh&ÌÉÙ¿G\Ü“»›MO=ï´>-Õðôî ¦r©@u,i²Ö!gÛrîíõz„;/µÙ€£2ˆúœï;‡."ñÜc ZÒ»(º9‚èeÕ¨&!(ÏñÚ™û3µ¡¢›™H¦@,9ì6W£—Mîè6~ŸÑbC(«pÉ5.ùÇî­»6¨ŒJ{Øíûòè;é€ ¡œH½_?Ô•×cL*ÇrHý¯£ÙÝC1·àylî¡Ó¦¯µº…Óõ1àÍ0àÅ«×¯ÈØ¨ù£æ1‰Í5 /s™ÚEcνµkÚÐ9¶(F£–M¯÷¬¦AN ŠB–¬cÍf¿R ‹Úñ¡š{v· dÿ5÷²®D7ª#åØ^ç-ìÐüD¤Â„î‰ÀÙ§'åÙ'«Ët+p¨³ÁÈz·¾3ñ‘â/mÑzTSèá4y|ºúMYJî]ÛLÉc‘ˆQ ßâŽ'õ%ܤ»ÃÕܶʾ¥‡š‚£æ§[Ÿ¼#±N¾¥$ž+¾¨üI@4Ñ<Ç_ÇÚGKÚJKš ç1½×ùý¹íT‡ÝoJ’ß×V–(IàÔ ê]Я®<—Ø\]bš± Ê¡q1ŠÉ’ä34ÝŽÕˆ‹\~FÔ…‰ìáaÓÚÔwv½©¬˜…`NU¾ØÐâÒ°GORŒ±¸¦O,@RbM3öùðTG %öpæ±o*ÄX¸œ·‘“§…““*ËÏå'Ÿ{j|‡Ý„`Þ=Þe®8¦Wq f#Ÿ—OQ¶£h èn*€]”ÉŽ[š-ro–ª ÎÓpå;¶wTfÑ+—ª¼ÙÐ,ªÕ26”9¨¶h„ØŽÒ4ûž8>gv™¼Sj³«QºØ¦s6NHÑ3¯»ç¸ÔÎZ³ìØ•Rg¦IñŽI×›÷ÿø áqb7¤:z̉µÞ“Oõ5‘ÿJÜP?¿±ù¼YÝTŸS^ü&z7‘7ÛÍ‘|¾#‰IÀw:†˜±µöL®L $àÃc—Ì$09 …ò&}{Ú£ht&fv.1ñüg÷!|ÃK*å4•òCêëœG5v¡Sì±Í¹2²Ö û”Ó}ݯ-¸lo'øŸ}Ñ0<s…´Ò^}szõJöm¯\LÌ¿1ÇRòÈÐ’]¡Èl»KñûÄS7Íq%là÷µWrí– ‚ìAzÎ^Ýs½æõ­ŽÜåjêºÒœ´¯âæ(É{ Â{}ýö™|_>›û…ÅAH2µlnË—.ÕOÙ÷йC‚™$ßÜãSsªßê¬5¯ŒsìC2NGû –_e›*ÛÝ9Ó\UÃÊÒðVuž *<˜ØÙ›Ÿ}æ8¬Ü ÈMñÙæë7336ä»ræ†H˜ª¯F£Z®¾õ¡{ü`l³õŒ˜kwËûþì3æ•ñœÆ¡™Þ¸3þ£ë} áŠß¿|²L Ie§Üšªø|7É.ylnhWDÏÂI I AUÀu¡ã)·â1Òrµƒ|x0ý®gJe&n¼µ'8”Zág˜f²ñ¶ H8Áæ2¹|Kû€­r³x¶ýMÌÛçç»xî/g>J¡€_ϵŒ,þVúô¶‹·ùºõ‰Ä/˜H¼:ò8K á ˜t:Té MøD²‚NÍÔDL·órwÔ'¶Ó²š,Ú£üÊ;/2´ß¾òõLsÎÇñ˜‰õðö£6Í]版-jy/?›^ï‹ÅlÉà ßp9t¯¯ª8`ÿ¯çi§¼Þ1m(ŠGÏq5ça)”£âTɼªdëçPV Ÿ°VSD‘e Ö⨤ݓ½Dö½¼"›Æ¾¤ç†q´oqëxïEöΆ<•a&ÚFpòFåesêØQНoNç=`ªè-mÄqì”´fÉcfmác©~íjÈp/´ü–šzóõ²;r°Ëw5dY`3×…A²¬Å ½ÍËgæýì–Q³¼rŸ/eÒÑŽ‘ÐÉfB¾‹4&_‹ÃàI%¼²×…ñ¡©²þíÓÅëcË/ùt| q³´VˆÝó•hÝ §|0½¬£}_SPß¾íökªlãíëÊ¡íIéz/÷%d…©­kölü4Þ TÚó¦Á†‰°¡£ý}G6ÐNisî_ÌWôå.°IHà÷J†-žjµÉƒ aóYÕ‘ÚHèülšðºKR&Ê9~-l'§š§yö¿»&|#bz\}n³søÇÌåm‡•;ë^šš8ÙgYEªšË2j^øŽ°í¯~Et°lþù6äNu‹&™Å»ó²ÅRœ HÛ4r©ø8Ï2òÇsmo3kž®{Ëå¸íåvƒo•4÷d"’&¹ia¦éñÙ‹»žã”šyŠ,Ûù2[jé™ûÉ;LÔ“,㯥Õ2´›Ô±6vêdkÛ„Ê$?Jñ:#J…Oë3ŸÅ¡Ù ÍzëL]ë á¥äZÛ’–ΔiMHk/ñÀ—”Š{–§Œˆ€_¡˜yôc Tµé;Ï›º·íÉ‚fØ:u[2¿§«| ±ÌáÙ Í"×B‹+8iéÅÄÄ!´ayé,Œ7|ÐÔq)Üëˆ8í~ëØ§O1ò掴js°pÝ3¢zF™â²`ãR7„4úELä_ûÇ%Ök¼!½x.yj'ë…YêiÎðE­ëìÀ#¶—ç á xÓ¥G |ÝàÖüRî{V}"©§Ï¶ÈºàÞO?–4r 0kçÑSDv«ð›yiÆ}"`©F <ïõt­k”ÿ;Ëà-ÑPõE¢\r`¤ñî«^GKßa6Ó4 ³¥éÚÐþ-¢J/ƒÄ3ú¨ó.öüÄýTÜžl-%Cø¥Ä©€¸ëz´·Yël³n9úê¥E²Q—©Å­n3Ó‹ÝjcÞɯ¾WÔ £XIŠ´Ñ£åÑ»°>´]jpßÇ{×àCÕ WN{ËZv:ª1ŠGBAýΛî§>'xÐ2ä0 ‚Ë¢œÍ:µD >x_}ä‘}ÍáþEdºúá½÷ÌÇ»1KI\øDêu™¦Æ3¦Ï^}£|$±ØÀ¿ w„ÅÀ[jî¨hFØñ±JÃWÍ6®V°¤ú¼”„˜ïv¥e¯*Y™Qº”@àãtСT…êæ* {x0÷H´zÖ!"…iMp’¾*³7·½¨®Qw„hî-5ÿ“¥a ÐŽ|¥bàëéÇúŒ|[jÚi,Ö¤ 0äk‚nL’Ûžž—~­Å±YßÚÌóýXÿÅP±¸PÊf¾ÒÃ@n¤a£†Y »'3xW¸Îêœi¤}G%Ñ ü1ƒ Yhf;ÏæóK¹5ë4ž Þ)‚¹±|ÏD|5«WnUöcrFÂsžï,Á@RÞT_ð†‚ü÷4 §Ø*öèmª”æ9ù´p¶¦Uïs8N ãû”Õ÷Tï:~dò Þó°ÜƔÓ1ùdF£jïÔˆ{dô§ ]CÝÏÞ :¿e4#G-´†|úéu§çàw¢ß0R›ºxÕï–%5¬Sº{õ6Søw¾îpü´Ï3ÌûMŸùuåŒKO¨’N–9mQ¼3 ` ¯s-äÀ=xž*òC«æü½AxÁ³ƒlJaì¦ÊK­)"ßiÚD“Ùk¯gmä&¹Ÿý΂õš%†¶¨D0¸lâTk™(žaˆýg”‹Ðß&!Š'9µBÓËBBí7r½žƒû–Í•Nœ9¾`Øî,e JѤļö$^œü>z:t?ÍêEŠ3$7@‹ðD¯^`¤@¡Hßn8€Å.²ë«9cÒE+SsŽgœKkfß„¿ ¨+óéú¨›ÑÒïM^û —PDö†É?«{{H§{¯€ªnjæFËç$q½Ó&Ó²!ׯä¬K„?P6 ¼†û.±)޽µ¾zà SŽ _/õ½£[¨xEþwfraq§#ÍqÙ¸ù-ÆwÌO„œ·§„å^Ó4S £¼€ô÷õ|³g·‘¾•ÌZ§eÓÓe˜8•¬±·W£çêœR •úcðuêùÎÔªc¹.´ÒBÂ)¡%)ï>:ˆ%ǶDN(§…žì­vÖy—]ì"å¿]$9V^×ÐnЬ¨Çd’»æÃ¸>+ª«o¯^èÞW3¦]ÚzŠa-Ÿ›b¢@ÓêÌRô™ÓçÚzüa-S+¢ÈÍœr6<š0_óÓOÃN…^ª7cüÀ¯µS‘þ2&ëwîLÿdt} W¦ø Î;‰4¹zÒ`r¼—_Ä%¤ð$-ÌzrÝV›  #‚‚Ƕ^+‡1¶2»pyyfû*n¯Ý€zHb¡Å~`#°¬û:~§Lň®JkæÝ'b1f¸Lãó¸/;¬IÜR¾ëC)q{³Y×ë Ë3jî°ªç:Q¡—q]Û0òÈõ±ÞAu˜îgÞކ다ö8ÿFy;k¾Êr1ðå麎3Ô™×¼b~¼ûQf‹Hq¸hŸ†,ŽåmCÇ=âRZ¿5:æj‡w«@e`€Áe×û¦ -–˜ˆ×‡ã{òßë%¤lxÿüŒG™Lk$§£)‚|9x§LZøÃÇ1å*O©•‚ÝÀÎ`•ùCn¥õ¢ì@À‚XcÔþm(õ Õƒ™ã¾#õ)ÌÓJR&?{Âj$S® ?A}æÝr€c9X¦Á€ˆÝ±»4¶5fGÍ’PìË!ÖxóÁž§)6pFþ3j^É6 B8Ë!þf´Íf'+f 0Ô´¨Y·ñ8ð"âuQ:ƒUOIÍù>l÷gJˆI8Z¦qñ °ïù–*Ê&üt3LÓÖÂæ‘iËK1w¥o#RÂŒÂ%€Ú´“¯Ù?ç7Zš’|HÏr7IKO×^P¹:ï3Up]=(,Œevð£”Â{¿±ÚÉIß&ðü>ïO•à¹ÑÈ—i0 ðy_¤PÙæˆ »Ö‚ØçÆâÎÄš›?æÆ7·l¡ý‹©¢ÊpòÝO}³³*}éÚb[)NTÝæ–[ÂÒ5Z‹óa3A-$Š6Ï‘ûL$Þ³T.ë ·rÁRë€)¬Æ…p'»õÄ÷>m‘4ÙÆe¾)õ°¿ýuñ6Šìœò‰—7=wåFXææ9ÈÏ>f1±ä&š„5JÂý'¬‘ãÜæ”_¡³ÎeÙŒñsšç ÷öUû×P:Û”%š™‚>wzp‡ö·ò±C¯dÂ+¼î'µ…LÅëK]P~i뽋ˆ‹mòA-âU†'š­÷•õÅ'ÃG«¾’žê9œYBjv!B”sÚž2Ð µs“…ö+ºPY&|½ÉÒu„·»¯ ò—Æ¥›kÆ»rÒ˜ˆÏD ׇfÏó¤¯*ÍpCR·HT¤ñ™ß§ÆÝìhu“¦.ÒÎû6F)íïy¼ÝJáîä>عÚóOì &N§îÅ] æfzœ~@àzbKÞÍŽxMTƒ:°U%ÚèlÞdŸeT‡<ƒ¯qüÅ{ì.Œýƒ—ŠXfÈ?0 "sÖݼ^‡·^ S{t:uMîªDø>Àpܬ—ô†ã¬ÖÅLøî~ºÝòü‹ò»â¡CBÏÊ­t±Ãý<1ƒ«7 Ø­…ÌT¯Xž%>Ѽníaðni´2'€îáκrÝ,A~ºkFñ€’è3*&´ÏºÓBq½“2“[ÿ\/Y§ä BÚ~»(þ‚Š:s­þuÆ•Wd‘¸³…›¤’P™qá#³cŸÓûv0P‚>‡[ìdó¿¹é|JìNöÞ韚Sl½”S{0¬õö‡æ"Ú××êGLCE§»Ð˜­Ç›õãµ&L8*2™‚“Dõ‹áû&ɦ û°ççÍ=‡¸úsÏq‘™?p¦So¬À?‚.Ëò8Ž2ª“ˆºo‰) å¶?É<Þ—-Åæ¹®˜–0ÛÀ Beœ4±Ì^`›+Ù·ð®éÐyǪ°Ýw+¯bȘìã‰-Æ÷$¡ã–/?Õé^g7Ÿ&ÛÈï{«e][‹<ß7MÞ©äø ÆÚÆÓǶ¾NªF@ø‘bÙ™)¸ Š!w:˜Ÿa`•Æ5`)¬ÑäS‰é+‘TÛ# Þ÷N€ÑÅhɪyšWq{qØ9>°;KÂ=Y³Ëdý¯YŒäÆÆ¬w§`™÷y¤'ˆ}fÁ²fÞ‘ÃÓ1IéªÕ¢‡^ÜÛ –0›€.ÄHŒõLÎìé‹ièM,â‘Jà}U‹\Í=–MT+³‚š„Ÿ¬• ‹IH¼% ´'÷Õ“ ˜±®{­‚NÖìrBDiÏ25nå¹ä4hkÚåG8À6~ ^&ççqmŽbN«Ï–ˆÕÊJRݱÎÇ’³êr³á¥pMµ%”™ûiKÐV¬%ó)]9?>÷*ùŽM´â!‘¾Ç«If_óbTwˆfƨ’ ›¢/?U}xðì³ýK.px ^1µd¨zNµîGç°™>ã±là¥B0-ÝÈ%ÒãýÉí ú90}„ÔR5©fRáÈûÞ‹’âÊL µÜ÷+æWúu¹îÝP Ì÷:\QbüÅtTjûåÛºB`TeÔÚÑÈúh ÷õOŒÏ:üŠ5/œ¯ß†>8Ôó}JTƒ¼ðqK§ålP‹âf›!å§«B(Ý­Ö Yä÷y…þ“R¥Ï7³²O&߆—7mçÒL»æÎ 6‘oñ·y—e‹*$ß‚çq¸‡v¿ &ÛhRæ-»Æì9±“UTÛ!/p~=d`H<»`zbåˆÎ-‘’÷A¿"kp°4îyÍ›í± ã™&1cé‘£±EB9_û½7Ç ¿žKës'é/ˆ¥ŸèÓ/¸]!´.昚ŒgürÒ&D½ƒŸ¨’‚!ªõ³ ƒ‰]»¼z-'éìÆ 6[§Ë@­ÎÙcIæš©þ•jO+írW9nÅä¸(Ö$3Úˆm~6ã£UvüušÊ;R³;çÕòG@¨ð¼Iæ‰I2ö¸l´ ~'kÖ,õ£¹P¦ÉYE]ˆÞ:(\WBÇ7ë¶³ñ:¶JÞ÷SPÁž –Oõ¢àÍ;œ¾f'¾Ì»íÜÜã&ôìS}Ì>·£H6Ò•wIÚò]þw—oé|Â÷nZ ˆ(6)‰;ðßÕ(y~OðIs¥ qΩ_œø”Š™eaÜmÃL¢…ÄWN%!Ô+¾Móò£Åä›­böÈ%ÍÒ/Itu« Žºtpƒ*ï|oÖpܶì¸2S9PÚÐa|óït^³ÇY¶AgÛåämߺóOö«bÙËøp½†QSümÛ²¡º ±ýjÁ,U7¶€ºø-a#)ñÛ*x;Õ¥m+6¼a»ÞRõ²9¨hçØ:Ü©üsf𣠖£Í·ò¼¬®¿|’{:.ùkÞ~d®¾ÅQÚËö‰Ä!NÝ '©PkÐÕÎö!ù„Šä|2Á]4“?e:õˆ›jÃÕ78$À#Pˆó ¢\(90=h çUTÞGgp8‹Z-™fHi:m”GÅ kT/e3~ÙõSÏ{„†Ê£Ì¥šŸì)M¶~Ú÷„øãuÊ¿…’\ÚI‰ºlÃQ¹³g‘Ñîƒ& 5Ù@ÛÿÏ8öÿ#¬<ÿ±†î§ßÿ½*°’ÿkèþwúýß«+ù¿†î§ßÿ½*°’ÿkèþwúýß«+ù¿†î§ßÿ½*°’ÿkèþwúý/«+ù¿vî§ÿyu`ÿÑkçþ7úý_«+ù¿†î£ÿmU`%ÿ×Ð÷éë?«+ù¿†Öÿèë?«+ù¿†Öÿèë?«+ù¿†Öÿèë?«+ù¿†Öÿèë?«+ù¿†Öÿèë?«+ù¿vÖÿèë?«+ù¿†Öÿèïÿ«+øYCëtþ¯ ¬äÿZÿ£¯ÿ¬ ¬äÿZÿ£¯ÿ¬ ¬äÿZÿ£¯ÿ¬ ¬äÿZÿ£¯ÿ¬ ¬äÿZÿ£¯ÿ¬ ¬äÿZÿ£¯ÿ¬ ¬äÿ_»þ úŠr òtþ¯"ü’ÿKßÿ@[¸à±ŽC/´»–ÁKÒë‰z¿ôõ—ÿ ƒÿïÿÈÉ-ÿ]QANF^AŽöý/¨,”þý÷U?ÂDÛÂö iad>h¹ßP_ ‘”–¶–Ó––FX –ä¥d ` ¼#Îוàê…sô–Ö1†À™`4™€Ã\qÃ<±G° à-‰õñsõW‡h{áXAÒ"È £—Cê6°$ujhG¼/– îêë%©¬¬ " ¥á$¸<°pcløÇÏШ‚–„lèêK€I/ç`‚y¸âÜÁ€°:©C¤¤¤¯À g,N íë ã±ê_BÖ׋%@À ߪ§eH/·å… Bü’’`=,‹w$`1`T±Œ •’—’KJy0®þà%-Q‡ø¸â0Ø@æø‹˜MòttÅ-©n<îá|½Õ::caÒŽppøÿ.íâ ´v ú†B›–uò‡¤?„ȇó"ÐúõkDË4ý8hß„÷ýV^xþw‹ûáÐ4éñýu–¹ëû‡Ð8{x¡=~ÝŽ‡7@ÿ0˜a=htù‰1K(`Ò§i…ÿ®E ÝÂÅÕ ü#¸`!÷ôöÀ°` ìåþf<ÁN^øŸµ ë±²=´n)+ü¦ùýÖÊ_ÄÒš(vÅ¡=ü0®8g°£‡øÛWšÑýÁbüá0‚#Ц+`0Œ€ÿ¡z Ö>@t øÞ*G™ßl˜ÈÏâÀû=½Õ<€'Q@o1ÿe¿YÝOxÑ^,|ج=Lz)¼œ,MÀÿYDŒVØoQa tø»Ä~˜ ìë X?(Í^a0x¬¯/xÉ6ªC=\qª`¼«³ A Höõ¤ þ“!ô€ÿZÞx°¬"*¯*§¬ª –•Ê,‰õ K ˜ÍeMb:½ÜSÚ *- õƒ}öÂ;K/©å·N2Á\=Á¾xô/ ¹7Î70j|‹¡…€æìsÅ`<€aå…Ç`ñê@—TÙVä—{D-w–F‹of~iìÓ?]ÇðËùßòÿÒý?«+ù¿†ü¿tÿϪÀ þc×ÿ—ÎÿU•ü_Cþ_ºÿoU`%ÿ×ÿ—îÿ[XÉÿ5äÿ¥ûÿVVò ùéþ¿Uüwt\3üW¢ûVVêÿ_êÿW”“QT‚*)Ò÷¯"ü’ÿKëÆØ€—ótý<]÷;âÜÿ ' Á¿ïÿƒÊ)ÈÈþèÿS”äDVVVŽîÿ[ ûÿèþ?ºÿï_øÿ~Ëþ)N@yiŒ"ö÷mð·öþVÒê¸ÿHû¡²¸cèåìŠvô°pÄ;c ÚE¼p€ö/9Æ~YøÇT°ú‡Ç?ä<ûïöS ÿ¥‡ðÒEf‰.æ^~x4–N€ Ð%‚Ð%äG‚(Aà?Oï_‘Ð¥e?:H¥¤€]YÍîó3û»â ~Žÿ+Ïú£Š2®‡%|3'ËŽõ¿ŽÿÛ­P,NeuY¢ƒ¹#ÒÛ•–ù[­Œ>ÎÉËbYXx翟ŽÈ/ÑbÙˆþ#…áWøQ –ã~&¾xôßO–•ágZðO…_àGø'è¿Ìï·äm¸úÿª·ÀTÚØÏsmˆ¹ø/þq7ÇŽÇß·vKC§ô;ÿIËÿ– ®ò;ÝþÕÇÃùoÈt¹¥Þëc~껥+Ž lvÅüý: ]îí/ç2Ø@Â~?'',þï<¡í^#Ù¿|¹û“v«¨ÊÉÑwÿ¥°Òÿ‹Z+þ_%ºÿoU`¥ÿoíœÿ¥ûWVê?z­ð_I†¾ÿU`¥þ¯ûéç?VVê?f­ð_I†¾ÿU`¥þ¯¡ó_tþ¯ ¬äÿ:ÿE?ÿ±*°Òþc× ÿ•dèü_XɧµÃúùŸUüwú‹Ï*l—•§ÿká—üÿÕb²>΋~ƒ´ðXÇÿl8ÁÿÇþoy%ÅŸöCeddåäèû¿Wèû¿éû¿éû¿ÿýß+ì៲ \Fuú†ø7\{+ÒWg;ønéò®5- F×ëñ3×¶>¿óÍÍëD{þCžÏÿþg.߇ ?‘bþ?*KÔø1å' ùÍ‚KÉ`±i”Ò!$0Dañ|[Àÿ¾ËÊnÇGehûâ±4cú ¢ƒ#à²/ „þß_$hG&~F ß¿R*V±×ÊÿësšŽü·HþDR¦Í…ptKú›$·´gú÷¦ÀkÁ7B{”ÿ¦mùeô’Üá€w‰“þ‘ã7íT›þÒDëkŒT&8Ÿ‰Þß¾ûŠ@ïì÷?yŒ–ù-ýû‹ô_Qà#ñÓ¤Îì<ÿí)#÷Ÿbø“•ä~žáß‘ÙߨåþKÑpYzøÛKíx£ùïÎàÆ8*Ó&t%ù‰$ ¸•£‡ëòR‰þ_:¡ø«GWÙ_X3Ãë_xv@™~v࿆•þ¿5tÿ+Ýÿ¿*°’ÿkèþWúýŸ«+ù¿†î¥ßÿ¹*°’ÿkèþWúýŸ«+øZ3÷¿ÒÏÿ­¬ÔÿµóýWúù¿Õ•ü_Cç?éç¿VVÚÿ5tþ›ÎÿU•ü_Cçéç¿VVÚÿ5tþ—ÎÿU•ú¿†ÎÿÒÏ­ ¬Ôÿ5tþ—ÎÿU•ü_Cçéëÿ«¿ä?àààëêéà@;­ƒ÷òB<ÖÑÓAÙÅÁƒõvp *òÄüqîÐüûç¿_濜’’TIŽvþK–6ÿ£ŸÿúóA`„¢£, ª"¯Œ•A£d¡(G% R–WUT‘ÿ«ÛG‡?þcýwôþÃuü+ý—…þ\ÿå—ô_‰®ÿ«(G_,uÂâ±x&<M b¥1h…ÿKÐÞÞK›&À²rÊJ`y99 9ùJr¤ ýYiÚ™ÁŸpü¬¬‚Œ„‚2X^*¡¬°vBü3á?Õoœó®ã_迬‚â¯ô_*G×ÿÕÒAc½íLÜ4ýÛ®D˜10¬» <ÛmÜü¹áy øá?hh¡³°¸¸gweeezzº††Æ±cǺºº@ eqq±ãŽRð´Ž`flΠ9ÐæÄÀ°ñ«>BË"0u,YË÷µòNêÎÒO¯å9”ßbà‘3gW~Ÿô}9ÚÛÀ¢æÝn\ïùPñ¢´­m.îKÍÈ<|s˶¢E¹Íêµ/ž{¥ ¢úïgè¼H)g[uçe«ÙÇ ˆÓOjcT"Âcã¼Æù TM+FÌîú ¥¨ê×¥}tï Xî öEØ ÃÈÙ¯yŒ¯†J°ãÒ~Ua­Ú× nÙâ²sC)„ÿN\Þ‚áb¶¸KçS…cÊŒ‡·ŽNÏœˆT¶ï¼žeî+"ÖD½´õVüà;ßë~Õ+y_;+ïúlOx%÷Ò4ôù¥{\{‹Z÷º˜C≒۱i ¼jé¶±ÖËJ'‡Ð­"÷‡r õ6Q´+‡®ÙNeŽø}Póè8د&óá¼ÔµÙ§}+³°³3AlͦNÚíˆIIN¦ ÝáÄ0ÓŒÍK…äG«&¾zeË1vã˜ÛV^Û+=ºNÇ?h¿ëÐGîÝnFÎÅ÷xËÙw=we™¶¶÷º–a_•”qédñ¹¡Ø¶Vo'Uùl‹”g£ïûÏñ^¿w¦ûuþ.²ùñ;©œÃEj¥ÛÛÕšåZ¼ÙµÏ¿1^wçÿcïIà›(ÖGŪøò°°‘J›Ýœ-Pè”VZÒ`©€%Énš@.’ -"ˆT@Ë}ß"ðJEå(HÅrˆ ˆ< …úWÁ§êäF9”73›¤ÙÜ„6 þ÷ûµÐdvÎïžo¾¤rCùË5“"gn›ýÖáA]Ö>vuÑènï̘ҵù±Ù–ÌøâíïSL+o,%+ÕªÖ fèïFöK_7ýœèr»»‡j/Þ2³ÝÃ3;÷_¸nx1&iZùÕ®ŽüãE†±äÛ7vup~þôs«,Ûª/œm|~ý™ü¸±ùšâ–OÜyèø¿>™ hskëõU;Ÿ_}nôµïWœúS¾õ‘͹}$å=•òáÚSG)Gã;¯î Ó~ü牚±-\Ùóƒ™íª'HH¸¶'±tUMDOlÝŒµ¯}°iTÊüˆÏ·§$| {*âdQj×—7·:ÜB•²ôýŸ=6ãàí9ÓfH²²+bã⦨óÇë;ÓÚ}»›/ÒMÉîõmÌК¾òó¶7gôëW6e÷;Ѫ¹Ó?œÎç·Ú»7vU†âÛ½‹Û>=åãÒŸ/+¶ˆ Ÿ\ñ¤6>‹…·ë¥mWu*½ÝÿÜîŽíó..Æ#ο­=”ºmtÄœ¯ß‰Omwœ>óײšøÊ×èdÙ‘ˆ¥ÍŸêàªù™/ËÊúJ¾º3ÃØ¬2òÓï[Ý9¹½úç.kùåÉGÖâoŽŒ: Y2àÃo ò\øÕâQ²Ê…Ÿ6‹SiZüRq÷tËŽ­'Æùü†4úõJeß»èµÏÿí“ÍK¿9ôߤѕ²ÉæuÉ£޾~¤”¤ÊRúÛr¥æBÕÆ'µËWOëöNâ¥)‹Wí=VÑoáâAÿîÔääÎ'†d^̉(o®y}ˈëá¯aû+Ò*œOŒmûË ê¨)A½÷Ê¢ñå5¡Ç®ÍºÙ±üdö/™9l~øœ·ôåãF¼Õ"÷ò¼pêÅÔ£ƒÂú(³È¿~5ip»Ù“þzšþŸÏŠG/U?yflÞ„ýÒ/Ú6U5›õ]ñÙ‚r‘|GÛVÏ-Ëø¾û·…kF¹U-HI8€³·uö„ų¶ÜR:úÔî½swñ»,HÞTŠÇw_ñq‡!ƒ;$Ï¥vÉLÑ»2÷=~sDRÒ¼ÌI—U²˜¦åÝ/=nÉ[+‹-åæÀë_Óõá%i-în;5­dͬ'ÝŽ_Ýùæõ.£ 1»¦•ýÔ½õÖXÕûkïý=oBãªí÷—ÿö$&ö ?¹z{øðŠÒI¯¶ßò†1më÷í;¥-¹2ó‹7«úMoeÌWÎõyõjòìÛš•¤T\Õ>¬¬ÑÄ£´k¾‹ZóFÙ¸~­ðUóÚìùZ\ðÝå)3•ü3©¸¥`gç‡gŸ>š¹2|ô¦«{ÿsù4½e|Ùs§ çýÑúXNæS¹ý+ZîÉm^3ô1bÕË Ï«W½·¼ ûlyEï°=ÝÂÄOjÕoóâ©su«~Í™öÝSN5_]tü¡°>YäQÕΨy§†v˜3µ¥®ùSí¿Þ|«¤bÖo¥"ÙÞÖ£x5ÿH¿4">åQõ_EEÚÌk|'þ]õÇ?*>=äÿdšq+—ˆr ºŒ;•ñdÔ®igN|vùÒùÒéÍ3ª´ãÿ¹,»dê‚MÒîËØqøŸ~ž×xÉp:ãdi#þ‚×ò'XòuRÊØbiïùMÂN>Ó{ÌÐ ßÞ¼áuÍ­¨K[©}f…Ek·öõMÓÎá›ÖL‘Óé}kv·=3½é¢åƒ·, ?7ؘòPË×ï·Ž8ðåó½Ò¦kXeì ÏÜ>gIâ·ËwLþmà+a‚âÉ»­ÞµòUå9z&A&FIsÒg¿Ð´½zñJá†I†òÇ â á·//ï|ñÕ±—OU-{#õÙÓçÙs«GI‘b·=qÆ(’ {´ÓÒn’”’æã«O®nϪâ_«2£#[øâ†N{D¿ÿ{Mnû¨Ï”µØ4 Éc×ö7Ùs÷jÍø„Csx%û²Úuïp'{wU–™øúVKzÂÙß®ÿkZxuÉMìÔ²Yw¢gË?±%ítRï)å¥/}jY?«ñ˸øË¥+æöJ;pG°d¥*cMrDÌG+žkúQÉGó«æï_©|Ät¬•ô™EN?÷’Ȱ®YÉà›AÊô½Ÿ¯4*/ïë£ø©L~óbåàÕü45l÷þ¬/Õ{?´oÚ¼*§¸ºgÉÙu£6ö-ÅfÿÁßÙ¿äÅV½zu[ôÁÞ÷3황í³úvŽbémªfdzyÕŸ›~f•,ïþüNM{u‰þãðøì;u1-L‘M| ©PMžú[ÿ‡NüçÞÿpÆ¿ËÕ ðze)i ìæw¼Û8.à ì÷¿Ã»àEˆ ¹ýŸ wÿ;wÿ;wÿû=Üÿn•‡õró;GŠäE°›{™¬%Á¹íÝÑu4ò"up£€V³¯‰ªŸI»\Ce4hJ f]WWtù5iNÚä<¤uÊ*` îG7ˆÖhmV©Bù=oZv8, d;ßsꀚ¨¾9Ìz`]¬ ã×luC Á@º»¹Û°ãßýsuEA™-îe¶¡úš¾02p˜’2›óÕ¦¡ÇÔÞÍ™†>gËiµõªk#øóï·¢ÚPSEfÚ”+Z„‹FOc:yQ¾–ÒÇ`ÐŒ”@›¬ÅÖÔ‚ÃyVÆ/HÔ. P{ù´a$¥G 3Ú ñï¦ÖHèñk' =…E¥bT^”c%(JFE G0=H˜÷o5WQ~í2X%|èAZ¿èß‘$ì´ïø¸”2,&%…u1Qæèž¼à[…U×7÷úµ4¸ÓEµŽöQ%ƒÏkië‘Eœïê 3©Þnáp·ð>¸À~ÿkåpçÿƒÎøw‘99”Þl0¥t:ƒ>ÍÿF¾öÿ ‘PÈ·ïÿ‹¢ÀE€ ¸ýÿ Àƒ³ÿï‰(1´‹ŒIÑ6½’â‚\p ¡‚Þé<Œˆ’!-/H° ÁS ‘¦Ø5¬»ún+¡Ç™N¡1ffJa<@É ÈŒ3ÇbX­IÖ1ŸL«ÑzÑ`¢bccáôÂzÁ/2™;2a {AKw÷b²ò‘;d:ƒaßùu7Æ#².+|>g}LiÕ/°ó @GŒ½ŽÆ‘ÎÌYÖ#5ò“\g³6Ý.[ t( ¡L‰.Ö¤8¸w-Ï8¢óóA_F5czÖZ—P:¹¬œ4OçGCày«õê8Ô<´V­£ ëžÃôrC÷Ö6¨*7Qr6JxàÇMDŸi†ÁfVˡԃÇx¡€“È…W2Ä?F$X‡Ä!è ’…uiU@œ[} àñ ´4iå»ÁèÄ”p¢ùZ HK›„a>@|ç 6U» )­VÖ[ÅÁý£.C¼/”+AŸ¾ñ­@ïÈôÕJ-²Ù3ñŠnÿ›þ[ẇÓ<Äq$áY¬£(‘‰™Ö+ zÚCPD#‡×JJ«5/ˆDûg³Q®´~††‡ÉÅof¾ËÕ£é÷P€ïÔDb¶E¡Õ(m‘à>6ý=á¶ û^C:Mé2)À‚ÞP–ËæÉ"Ç;mý—ÖÁ|"C ¥jh5:ôc„ž,‰–$XÜLÆÍã}±3agg+X·ÑŒœwÔ]™¡Î°ŸJÕ“L¶®!0H ·| u€íHÛ&µ“é4=mcÙ™¬ÂÀQ0¤©Î: ŠŒYl¬Ò˜k²³”šˆz9dG†­°Z¿N}à(Gžf2L²Ó 2±/E³¤­ºœ¤0BQŒÊ$®3ÄõËNÇl›5˜Ùe<`ÜQÑlT êUðÄAƒ¡Iä…Egô©Uèn=—3 nT1ø5È 4ͨ ¬ÎDhñ³ùØ øÖ:䣲ñ&t7k(1¬‡ùoŒ2ªÝGBU€ ”оü DªÒ¤1Âö‘oæ×&³¥f\-' K5(-:@åòÚF=jI~`ZÒ.'mZ‘o׊÷,3™<8Æ)µ#E?:y¦„ÏE«áð¤J …‘Ì×°€iÛ»—ë&µVthÜöÑ¡ ;3²Øj1ÏÛ1µ‹‡9´ IÈs/¬æ£¨øÞæ7~4iÅÖ`"ÖƒÒ%šì1øã4zÛ‚{X>–,Kô>3Ŷq:QZ`Ó„†ø?àùùšJ´_¨dí¯x9¼áv„v‰äHfΪ–;ìÜ tÝbs‡#ÓÙ:³j`S4*G+³UD :ŠVHXI)G•clßùp÷DnܽÚC9'o4%$dŒðmgyb,O¤%/È•tbü*³å&@3`Àæ„q ø€EÌ »Ýa³¯.Ჺ¶µbTÛDZé+ö·Î|ÈVn‰IÖó+f{ÌaéY§}î½_+cxéÒÑì£Evª‹#µn—UJJz§5mvHج†ÈBJi`2 Tv€T&ƒÎ%øÞÄ r·³€hÀÿxR¯ÂÀÔ+4BlšUèvûØA®6ÐßO“BÖ‹&EÆšCƒAQ¢õbÊú©žpö,XÊŠDÆ6ø#°aFàŸB²u‹ÈîÖH^Íý°PûvT{–¿pNZHaž%o}‰PaŠPA`"Ôy‡À&NlG%°Ý‚¿Ÿ µmêx¶Î+tÁëaÙöˡ_@3E4Ëù1u¨5üÛåCæP ³ d²v³Ç&£íÍhôf I1ºÈH)5*’9´.ŠÁùB‡$/×Öá=<‡Ö¡LÌÏg^ò㣠¿Q7B‚ç³øqD>ó~1_Hð\:à bp‰Èk¢8’çx‰ÖPà£u¡ˆY%‘XâÏ*ñˆ8Z 7m}4+&À€%1âxIŒDè’_W{ð‡¡W³ÚPh¶î°"¡ „lO;C[û'›¡=Gø¤¯¤×x¹g’fÝëá7]ÃZ¶­žÛ•U¢KèFꋼÂ$Â>!Œ!pÜ+âHÀÞ®ÍÛw6=P†„‡èNŒó|Ò|‡•öÕˆ@”B8QŠk' ?ËM-þÍE$r½1|¾Äk7|0– 4@“Å“ŠEŒÀ Ÿl˜4žïa>:á£YqÓ,ØÊ9³àžzb¶Þék€‰>(ÄÁœ)ƒú†‰fYÙ-H¦È¢ê8£”±<êøÌüý$u–Qéî`9²¯Ð ·ßðݛHu~(>ÍDO§ƒ’,´ød¬]&ðä°\Š~•ÒÚÞÁŒH -mHЂòBTÜùÒ± o©P±zà†%úzÂörÌ!&èfp/ªøNÇÑñbqÕR±Ï®Nuž6š èm¨šáAèjô[jƒêd9i`f V £¢`.*‹6Ob¹é²~YƒdXÒ€<,7I*M ËëŽN@) ¹21oQ #¼…rp¹é1Pö¼˜&MéžOJNÏL—åAƒ Oºl@ZNÖ'KŠ%aÙIRYzÊ Ì$)pã¥ÙY9i±˜Ì&°0@3öÁQŒi5@]ÄE‹ÆÝåXrN* ³Åb0°‡c Ç;’§Ãyæ,`uÃãö±EDÁ´µÖÖP4Ÿ2é̱u'.40°÷ÿBèþœÛÿ Ôâ_T/¸‡poøçCü£û_8ü×?8âŸäñB…ÿ…|ÿA6þñ†Ä?@¿€'fâB>ÿ 8ãßÅWÈ•ÓJ5i(py+šÿwÀ{ÿñl÷¿[ñχ÷¿ ÄB.þ PIp~¼X$‘ ãU¤œÄ‹•J…˜O"’“JECƒú…ûà¿ï€÷Åÿ¸XÌ–ÿ_ÄÃ9þ¸»ÿÝG:1&‰‘`¸ˆˆð$¶*çÜ{?ó¹ç~êÿ¿Ïÿ)å3ç¿“,XÄ:sþûòZmðȇóß+++ß/X°v­›¸¸xzzº‘‘‘¥¥¥¼¼|ggçì¹ð<<< fŽƒ—–Iµ_0÷8xØ‚ÇÁ'Ôz·áêû®"b«/)$‰ýÁ#Ô'81{qž7Ú%Ãì `X[Uïm öÒ'eJÚ=,·kq‰3ó?Ä(LRTŽ€¹£x®4â¥,€(¨6« Ìåªf¯¼ïÐÕ§¶¹ïoN.AåIõ1Œ\}w3¹g-9©u—Ü3/ð’ŠŽdm »p‚Õ-"W–‡ßNw~éº=„»rã5iá¤'MdÞ½^»¾4i7y×dyÓWÇdü•шÓ«¯öÕàÑ“ ¡…QJ”ø=‚ƒÐ"O«¡õ&)WHðób¼m”m1bxÂbP#ÑÌqaùäS~[TAùŽÃ½ÉŸ>ðáÌ`y°3ºÊ `ë?‰0>…ß_Æ0BÄXÜyZùúø]n2õ@#¾+=Ѫ-t$µð<ON÷¼3]çê° ,ô¯(5uÚšoÈy–%T2ªñ2fPà”5›ã8%d˜ºX¹†‚c?â±™cÉÏ®ƒ…*Ü}hŒ¼õ]ßæ.€ àî30|Ÿµ…k»Ã8…qBá_…ofËÜÅžœ&œN,4ÏëXZ*vã&B¨ÐfcÍV³ó:Þ^NÞnª†·Økž¿¢V¶«n­z2@V¤²h&rc”ïdÏQ üt_ò ë$|Üô$¢ÃÞ×Þz9—X°ÔªÀòÂÅ^üRèóN;•çíö SeÃQGÌWÃu„ åî8)/¿ªQä÷tg¥”ÅuÓIÅÚ$ «óìVoþ#€:8¹ÃFdô1,°³”olÝBòéÀ¦¡ñ\-¥ü«´–ÙOû£±C¬âXó],­Š,Õ)ThMTà=ʼnl¿ºˆ„P„¿Ì+5¢ön\­«²2/Þ]ö,ãø¹ËÜW¼lU¿ÌZfÿNÐ"©Ø™#Ba ïGkcÌxéYPùú½j)•§64LàØ¸§äÀ¨aÛÝÐ)ŠÒþ¸Ë[ƒÒ˜ —·Ê±–DmˆQ9ÄÈÐ>¸~ìñþç òÏ#L—‘2 Œ²¥ÊxF¶¾µ!zÕ m†Ñ Åñµ³ÍH‡‹Ê´¬lDX!Q~x«u5Ê…Eæ“ð–Lþ§llê>C 7ú÷cXŽË¬Êcˆ&iðžÕ®Ÿ­m×:¥Þ†÷â%AÓ•¯¬½Ï è@òi¹\ÙgÏ<3L/ìæ˜`m4ÔÇK9NŠþ6jñ:Ì‘®ŽYæDžv«‰Öç Úu’šW!†Ê„†rB›ÏkÒîÁÝÔ…+ú÷< Pwnº²Íˆ¬}ê='Q'ɧõbu`ÀïXÆ8øGyÊn३%bƒ>5J ëm¸¡ÛƒŸ5}ƒÑÅä>Þ,äÁ$—«;Æë©§HÎi3æ¢ð­2ØTÑy1ÏŒ©\7u›¹WÞGåUîþÚË«nt°ãÝ{d1>ÇÌ¢=o3P,•ÆàzìÎ!NÎÎÒ>ài?D”Yùm"—ŒÍ†ÄŽ‚·fp §E®'ì’˜j,Ý Õ÷*°½F2$ÃÜeë^DöîäŠô\vÔÕƒœ”d‰Kk]Iefy‘qÍãèŠf7ywÂEÚ‘—5Nk–{ š?²ýê/l‘hͽ$+)Ç}1Ñ©õ"æ> ÑZÃL| …Iò„Ÿ=~ú¶¡ùÅB×=™ØýìYEC8«ÆÞ÷¯ŠT·N§¶á¼OE¬ÊÎFÚ²ã7×&£áü7W(çíÜǶwX$.l8´EŸ=w}ˆèš¹F=ò|Ð/•µ4,W+&Bñ8ëöh·kÍÚy}¨Ü“‹g^Ø8åW£Yýö]’Ú¡Vû=°ç#1PP gŒûÌ!FgwH/#=kB´›u.Ù%º÷¾¡ÞÛ0Vx’¿‚ÍN]>³ ÍÛンàN8Ò;Á>©3ü²9B`¯cÙ“ŽÝ×›„×\¿à ôäûùp‡‹FUÆÍO±t¾BÞ(Õ¹#ƒˆB˜ð$¤=ïW‹8ª-èDßÁ¥:(6=@äË8ÎÞbÊ“D\(_°NµçMÙƒ{ÎnSB ë î·"oL¬7ÇTáFí ;¬Ï-Ùâ71%„ñŒᾪ¡Ñ—–]š×¡S)vÚˆ“\½2a Íõv­Ç”Ðn`h{JâbLçó>B}UvNËíWãæ~ø1pLËo ±aߣxÀOö–i>e É®‡¶½$G“^˜GŒ´îÙšV‘ÿtyrjøñÑGŠD@ô¥Ä§‹M®¦k¼öƒŽ,Ó”çZ‹Ïk»V©lOü®Â1²²úœÐÖÉêüUÉ^Üv™WÍ‘Ð$ÒIHïâütumÐÓ\.§·›°tDÖóàg±Ãb›×!Ö+ã—x[ù“]Ì£.>£¨'qîÕ™ ¾˜êž÷§$³'y[òå’¯ôŽ2~èB^'ß§l̺àQ4ÌKC&kºU«-=à¡®ÍÐT/“‡„äk6濌,ˆÐRgsäÂÝÏwì ÅŸP ò_®·ßáÒ.¹ð¡¬‘óÝ$áðz×Ý#Ê= ƒ»ºßd}¼p†P®“ò@m5†e×û„©Õ\]ޫޣËP—¸Î.° ¾uM¾õœnùrvÌÍÇcùЦ¸¶œJwƒ€ÊFÉqßc\‹Ûÿ(Qõm”4Y¿¯£½P5Håî²lUjRê3í…Áª ÷8?-íŸÄ1p…:„¼Úqb ï ƒÜèºε8ØÞœ.^”©kU'V™©{D¥¾Æ/˜ëñ@S6× Òu/c(Š1°ë–J×cÅw•TB÷Û'Þh–s‹ð~*b;6Á­¾ð&þiÁc¹Î·ƒº”œŽâ£c÷çò8#V Á—žÛÔÆ(ñxúmãúÕëß^yÓáÀHMõjMßíí¹f²®¦·ÏvS@C%ž›@2L?»ì²QzûF²Ê@U`2 rt¸æá£!â¤ßýöÜ%È$ÃùC”â¦å¡ŒE[ï9Ã_z±j‚q²€5u¡É‹b¦­K×X°Ln8˜Y£ ¼jª ñ×A|žÜ ÒPéÏ Ïa}½RùúñŠQ»¡§gÂÄkØFý¯—²ïFwô‡-9ºtëAí×îqíé,J¼&—¿«*ðMad¹f3SmC¢§¶Ôêm¬o£ f§Êµ›¯ã¹åYö2ÝH±½$*mݹ|ÀЉ_‘Çç†FgJ!ÓV Û«#Âíé‡ Üw9ǽ’]‡ï¶î=rþÐÝ…|!-+Ä`~¥’3€§ûMÑòÿÖ´$N ·Ã4Nyüƶí@rhÏ¢Q¥+¡lY “"¸‘'cc •ë[{Z÷ž,}°wJ ~=ls<>ÄúZó W޶úŒ\e§WV;®1ܶJÊ`Ü’h+ó@7"ýŽ06ç…kæwsdPtÍ óÃÏÜÚtåàFrÈ;è¾õeF…L‹ør¨g+˹ 6+—é]–z6\ÒŸ‹ï‚£ƒrîne©ÇoïŠ+/ýï××Ù¿Ax·Uø¥­yéÅÙÝ ˆHxò"ã»&¹#27ù@fôÕ·Ñšc$2ÇaÝIö@âϬõ)Cb¤Ê Æûé_½1Z6ý5³52+ÐyLPÉ›à90 ÔŸâð»äß=l™ŠRô¯?˜ž‘<ù°ØÆy)éþŒ1!®ÇžÏÛ3Á¡?åb–[NÔÐ{m޾Ù½c58~SÆhM×QO¦öHï8ñ˜”©[ø”-0ÊaÚ,µõi€¸ÐZhŸpÀ®^ÿlœ|dÝÆðŠõµJ\vƒ)ë§;ONô^~.é·ìÑ•“ $æw.f( g—¬ßi|uÓi]|ux„j÷1;ôi]|õí‹3äMÉì1<¹«qÍ$Œ»(¶Íã)ÀnyFõ5‚]\‰«Ú;²c5Aow¼^8eg wØîòÈçR¨+(Ínr¨tØ:ý#ñÜ„®jŠ7S³mmU†×*Ÿ:|V¡â΀Ne›våˆþ= ÔU\J³ôž@bjϸÊÄpÂÂVš¿ø磷›…‹? Ùqu0#-‡lÑHÛB1°°¤«Ð|¦Õ`jÏ9Ý©Y¾ø¶ûÜ0GÌ\«_ÖðoÍCØje¤èöâhŠö.h <~;”è!»Ê×GnPo1{úz4ô>¸r¼Yœ^$3mL®r`j2IÌZÕ‡M•c÷‹4;AÔ¡IÕ§¹[),´«ŠjËùIwmp:ÇŠßas38w‡ÝC !œy[»j1«°"¾'ŸÓŸáÀûÂ)+GÜ‘UE‡;XøJNGÇøEx¹ÍÜê·¦&ðÒ0—F#‰&µ¼»¦ÍÔÂq Ø#*Ùsn¹„oárû¹ä{mÜŽÆB~ ê^erÿðH×ýô˯MѼ!õ5bEޛʰ5¯@&u€±ôqôÎ>ÏHçæœÕ¹EhÖ%±ÁÃ372ûŸy Ó‰—éò¤xU“¬ddwlðòÏ[ޤ½÷^ˆßËÍ& ã§ö¿ÉçìJŽºÃ‹a^/õ²c ÊÓrT\lÝ×7Rõr¦b°P#}¥ Ø£=øÓÎê;¬Â·/v‚]àkè½R â2ûÕC†RðÅÓÌ”1Ù‚úXV=‹Ó‡ßÂü7l6¨ûvÖÚl&*œ÷\¬ô÷Ä?]½Ê?o÷­›7zpí%+Ä•••ÒCðnË&ɵHØÛwÓ%+D Pø5 㥉ªG1Q‘*ýl¯HO­QZp]X¥<Òbs²¾°oùBŸšäc™[:§$8XF Ë ¡w½ö+;²J³ /!“õ+ì‚w1ï—S$뽡ÑÖºîV÷I-ƒë–'õtpZíÜU\ð” ¨ƒ”ÞêØc&JèšLXÎ{d’–I(ކ!tGÕzN@&<®™ÚêΗ>Kø•Ÿ Œ”AЊ_ªÒÈ&×ÔQ^Q •â×ëNÛrMìÖ½ýAxæå%Çš°ÔñÚJÃX¸’¼Ðù \kÕÙú”.³û˜(¥3Ê3YË ™‘]yÂ|Ýõ¬£šG9,Ö4mâhßþTçŠ ÂÅÓéYÏ!Q——c†bT1½¹Xœ-¡,•ö¤¤ ÷Á3z„NgÍ—zýZöDÁÆ;pÿêµGzBÒÂBÂoˆ‡6¤òWTL›ïS4|}nê翟ºuG Å’åI}m#®¾.¯!à•+T{ñ;1Ï,I90È®Pö莑¤V¢3å0MäŠ\»˜>" ráW»|úí«ù—y­ùêÀºSƒÙÊ-£7“‚œ#sV9’[âŽÞ;#Ê`Í'1Å?¹E·0*õ>ó‹UÌë"ùÇÃ6ì'"&Ýñ;ÙñåU'ù޽VKVÎ: P--ŸgÔ¶ /ÚÂËÚ}¼4õ¦73›È“w˜š¸°QñöAÙÛ¬šè­H¬CúCÞ¡^udð• µŠ×/âŽÙ’û|š1 \‚Æ‘J‘Íž¬afÛú_²>o±{„*†sݤ#A:6{¥¶·%Mþy˜½¥{m)tìúó’e™Õ!xq 䆷ƒP¥^ŒH7Íå] k±§ý¡Õµ$wF‘H£°j[•#Ú¼.ìøíµ @& ¯h¾Å+ÎDÎÐ# ]8]ܤé]¥-(ö1ªÇ >ÒÌ¥D‰€üǚɜ2áçuºx­¯|–öSÖy×ÖôÖXìPÑ`'{ [°0[½ŸÑoË;ªÆüÊ=fK“…+¶ö<ÍÅuá’q÷Þ±Ô¿³ÁZÝ’\9h-m’ÞK¨¡†ÔçŸtFWÁ®ÅWßbb‡pGòQ³*MTdÕ¢D*ER'«Ùq9‰ ÁÝXÌbµ#J r’Û–†TÝËMÔ‰,M—ó¶ÉñÈæ¥áHxÄrN™‰œçg¶•¯’$Ÿê}Wg檸¥r¼A|üW1so‚öãe,–‘N¹g"Æ,%êFq=¦Òr^ÝÊ™ø$¹Æ` ãG÷û8´ N ¶<DºW8:>…oª Rd÷^ U-v†ÆËããÀ›wæ9/ZIµ¹?÷‡-úð-a¢qw儯myóU7òóCU±ò¾ µ•̀㛥ˆ–|+WH®¹`<”âtؾÂÅyö Xu ÞÑ@$\©.¤¤ÞŽ'bžå_7UbEÙt l²CÏ—6¡.¹\L ÇÔ4¡C/ÉÚ‹ÌV“s£¸ºÎD„¼+#Þ_ ñ U;ÞJwÚü¢œhÚέ5„¹hɘ 6„ñ £™„í/{ruUDžf:vЄ³×Ýù1¡çÍËúx/¶Kÿ@ÄIàÓØåê¯Ö6 ŒáyŽûÃhŠÏ$ä$ÞH[(Ä™Ø#9‘ºØ™Æ‘!"dùÙl'.«ÝäS|)ÈXeìr7Q<×+}Ôr·xoT7ÅÎTk3YÐp5y¿Ük™Õ*^꺸x7Ÿ¶ˆ*ƒ®ôsګठöÖþyÃ,äWÑç´7- ] ggÊ1Ø1džœ>'¾ï‚ªh‚Þh“¯÷›çhÐH±u_†¢6«A M4ŒwB&mÝ+œÏsr]YÌo#¥rxÄÂÃÆÃj½ÐY{è˜jrÕýMã§žGQŽbd€x´ säÙ ÞH‰‘TS£Ö•ëî@ ¤‡Þ×&·Ã-5Ƕ‡ÓH¥Âý³ÛÓŠ ¢›çõxÁÿTë™y6ŸÓgQ%W0Nz…fã g‚`“1¬Ý,‹‚’ë§‹öð‘ 56Þ¾†ct»k4æ„óÆ™nÓ$›×²G)O_ÙÀŠ<00!¸:¾Ž2ªœ‰»T¨±äâö%M#¦kŒ/ypË>C /ðQyßÈ6­F,ê¼·sï$k¹žeÖ2Rï(ÝL>Ýл¢s+(G0Üw×ñC©'ooó7Œd¼Px=¥:‹²]ëI—¿ÁØ-\ªËEÞ0¶Ý?œ¬Sñ?ÉNzðʽʼncç^)ÃæÍ䈆*Ö‡÷·E†\€츆\²y[\|#䕦ÝEñEË¿æ³iš:³ªÝ4ö*ØíäÙ¯ð’rŽ[j)ó†m@8²ãCPrÚõ>«@Ûbi°ãUò\¡þ ž -1ïl–ÙÇ&;Ú&£niÕ»NÈÇ©LëºóŠÊ”Ú=®7` îwĹˆCå"÷اú7Zíé?ÚyÁÑ=ÒyCm**˜l&î奞Ýq§‘˜ÜÔýd‚ÐÄÓ8¸á¶œïÎeè_ì 5µ)lCÞ©—`7[EÝ\ÁëñøM’VøÁíŒdùÖÒ‰¶‡qÇ=næÚ$¼M%Q"U²•<ÒL´xØ6ù¬!pø‰Oü¹‰wÕ··½ïW~÷jê†M’ÿ¥5ÁÊþ™™pI©XÖ—ÒÄ©×A‘9 R]… ¹™)£µÏöîRؼ¥Æ$áò¹t¢SîÝ;ÍW”"â‡_6Ë=+–ãíÍ8ÞËãÊÉ4yfd’X(¢æ*øÖ`½ ÷ õ1É·í¨>M¶7ÿ™ÛºüþÑÄÜšªMlJƒ·N.JhØ,@YÈíi˜ƒŠÕ=‡HyÜ »oô²CËhI|¢-»1U¦žßÉÝ:²¾·‘b!Š»¡sùl4ñöt¤åÑ-qÊëóPk¯øh•6{ç2©S†o´5'"ý²žÛ0±g>¿Yž8)½ˆ>îóv€ocl}˜š4ïH*on3Ù?buó•fí#xÅר[´û1 ˆìñx·öÕ]Æýf’˜£ð‚wÒ†w^4;y˜±FkÛè’ëzÖ÷˜j‰…Ncýã ‘+9Ym\ÝQ¬Ç +"åo*ÖûáÜ žýÔ[§rS¼³QLð…x7äÈ-A¶0c¢·ê \°mFœŸMd}#·Fèµ: ¥½¾v“ nÛˆL\=Y¡¿Wû–a .¯”Ž”›î/$MJ!Drõ˜¡éù¡@Ùè%w©Ñ{ Žs“0:eügU»sîÌuj0Áe=Üoï‰!Êýl´µË/T*»¯ 8Õ!œŒxÚ¥4‡GdHÙšSÊ»Èln"um)f´›Fg+9H–I m‹]Ö?„ûì=L$F¦òg ãUô"÷‘€¾ ¦!rLP“^dñ15ÞS//Õ=ë“«@06àÞoÃ׆4¿b^®€©7ªUë¹xÔ¤³F3|¸v;Á ÊÐyqñ&yR‡ÓJ¾³kgEL®XyÓZjb/^ƒÊ»i ~”ægÇ£½ ª'ªÖB…øñÆI©E›ù𸤧ýÃCO·À9‚ÕÞv!|\]CÀDáórÀÊÚ¿¢¢«¡ÙÓO©ob3JÒ\“ß¡.È3K]ïåƒ T’é6л”ßdo_N*Ûh‰Ú­‹}ZJ—=.ëB&ã©ZWÞ0“I~qêùGIêÍém@\ˆ¿=#U4¶ñ _l—sB®ôþA1žwo–k5§Ç‹ZË›Æ;jWÈÝÞÑ ™”ã\>º6(Õè*¥n[ E–±®„ø?ñ»Ä'†°Nº¨-ì"'R|,“ß›žswIDÎË£·Z})šK8uJñÍÛCú A&Ýt†Úi¼ÓjØFÍ›¨eƉÉEâ¹L‰Xå –†ÓÞpç{vÆOüzdáY°¡TN€ä;Ž…Ljž“ò?óv›f¯ƒb…Ü}ñð@+h™æ WøkþAÜ`ˆÿ%M$¡BN€ ×¼çaû j‰0^AðÏB€D°$JÎñ&¶Ú™ÿϸöã þøš’&6Ÿ®qèènh0X©ˆ;P™,Õ’¶NJ>qðÓx$ÑìÅ)ÙuµÈä“‘—²{oªC&û;åÈ9ÛvÈö³„Íþydõ$ƒ ¢+%—1LÆoöï+ލÑpê ƒ½vZÅšì1ïëÛIŒiŠê[{î$uíÀªÆM¤Ï~Af?«V@’¬÷¯ÈäJE‰ãlÂø5aÎÜ1D±ÀŠ>õý½2q˜¹ó>{S^œ'ºÜZ@£UO’–l£}¾L;FèQˆ¶àh¼DÈÐé&{Ìô"K÷µJžQ—¯ù1 $Œ$ ¶ÙQ©f¸ÓìO4„¶î éì‹…¬’4û¯X•*Qn•ª&—,Kæ§,9Sν¾Ð\„mÊw@–ã€r¹½3(C/Ð{÷µÐ#K`mø5¥¼8Ð)IþuV½ZœøÜš=Lè¶Èa!²‹;Ç\ù ðä-Ô*¸¤û»2{Ö›Qˆ£ ž…ELoeÕÞ_,{üp)Ç3@:ƒ¤D÷_ró´ù¢¥xd#©¤Z%H¿Èq’:®M¡;BÍß e!„Á¦ãRó÷¥w”]iÁ“{Õ¡Xî¤âp-ŽÑ¼tâõ -pÖz­Ûòe‡R°*CFs›f¢•”ª±»¾ªxZß 6Ät©`™\ööu {aBûÇx„œ^%†g¥]#ûªü¬FVí ÈÊj!½“2¸vOó¬6C£7Ç<šê€11ßàÇ÷ÀQ÷^÷Å"››ªÇnZ&bÊAAä3Ù-8î#}mùM6¸Y3Ÿ…­]³i§yåpõvö?¶|¯\—&' 6¹ÍÑ×3¤ldR¤aÌÏÅ5-.)ÓòÔ{ÿ.ÄaÀfˆqß…ÄfÒéb™î–T6$¼{‚ñ¾W®,üYÒ¹÷c7ò½v ã(“>ÖîBA«¬$EHb¨|Øžh|A eÚ4ñB• & *t÷MÀw–CõÕS«`ñÝÆ‘Èë)Å#½üA~d™kä¥Ôàvó‡Ov(¦­¹ÛˆyüZ`ºp)þôsõD+I4é\ø¢Pþk½fÏ« 'Ï_õšmЈ·Ú„$Ì8îaÌë˜[RˆPÞî\øEÇó~ÌEœ®’B¨lÜ=U† ®C¤¿:ƒ»à¡·š¶ \üá÷ŽÑÒ ÖK›E¥¢ð”Ä&=Ä>eûJp„Ä´y V9é¨åÕ`ó(“¾T:ŽjÒQ*dIò9Ô@üê£!jIOo/ÉFÌ~éš@ÜóΦ*·Ÿ‰¸±Ý'’Gi’Ü´?óñ°)8wÛÞÜÈ‹†Š˜¶ÞÖ×Òž¾t*0½{Ñ«Íÿ¦<¡@jÌýŠI¦îÌuy_™ú}5¥c¥Ï¬ñ5Tž˜Ô…[{ÇXǬÚÐÍ-»Ç"¢Ä=cí]kf¨½Ù¼Ô]m FÍkqE²õ^çgî-úyšm_-6ánŒhÒØ,ð¸x4ê mC–9ÕnË|RRRw£ÃBÅ…÷pZ=‹åûT×2§X˜üĉSkÖêIí—²é&Q£%­ß‡©£x^]cƒí® Áد±þ#„¹7]Ó*–­Db|EóÔI p”Ã((ÈæÖÀ× ËŒT_²ÐSÜįëð2ƒ¦??uí<\¿ð}õj³+>mvŠÂ§O,¢ø,OÃ%ºŽ3€]íÃ1èŠÂBIÔ깟ñä ´èsÍp^r½çÉ®ÉÛi‚MéøEÔÁ_5™-5)ŽòC^|¦Àý} PIl«¼n·ŠÑCÙ<ÇCo6Æ Ng/>¾Çø¬“:¸ž»}¼uÿ>ã Š`‘Óõû˜H-éx6êPIu*U6+‡¹…dyßwjȵkšÊŠºšøã¼%ÐFña×®+=º–ëãbDKVÅ‹¦¶õÖ¯ÑÉíÖÜ9:«9!«_j_¤Í ñ*é 7kí^D‘°³q¾YÅ›/´A ¡+m)¨qtgÝ‚T’µnŽŸêÊ@UÆ>w ´Û¼–Z#²Ô²–ûmñÊëræà£ ȇkk›ÉQÀ/< \!tŸ¶þÎqÆTü=R­ì'µœN‡0ÉÇš Ší."ZHFh uúº[ÜΪ~˜ðöØ=šO¢AôCsUžî¿Õ.k´èR 9_µâ ¹HÙuÔ0äPåË“·¶0‘#‡ôª;÷3U.¢ê»3•ᘡñú:“ZˆBd2ë¢x ÓÝî+Œã¡ŠIGW¹m ¾öÊ~¡ü%cäÀÎn|¹g ‡â¶ÆÊ|©ç ,ˆAÏûFYìÓÎlËîn·Ž*è7×W³´ÁÅåEu™É,-?Ά²ÒÛɾÉÄ2þ7›y©.ÔKGpy¦¨l%ò ‘¶(¢=À_àÝ”¸ ¨¦½';ú~áͦº›:a°õ´W‚ñ*ÚÊ•¬‚ÿ÷’—ŸUæ¿ÿÿÙ”Yÿ’Ç7ÞÿE‹ŠÓ󊣈ˆb±¨ßûÿ~Jù¿—ÿÓ‰vÒØïÌŸ¿3þ™??o‹_ÌùI´³wtqü3=Žõ_²;”fÚn§rß¿Hüùõ#JìDééçæRóü°ûïóé;ç³rò”öð$:º í %zúFKZn4wÏO›~NÐü¾š:ÑV˜ˆ±ÿdTüÞt‰3ô¿?K"½ù¿M;)Š•DЉ!QbHŒä˜vR\â3ºûù&g4ò·2MιãGç8•Ä"QâH1ŒRLäëÙ A¯°ŸÝð[ù±($J…”Á Q(ɯ2MmÿIúD/OG§o³A¢0bH Qq$JBäÇçjE‰¢Œ8hƒh$FýUhÐL>Çà}@cÐHII1¤ä7RYŠ€¨ÿ5ÓäÌÙV òlD%QH,†9‰ýFbNI“ø|ƒÿ}”¨Rœ–W ‹ûzvQôLøôˆ&ZH}؉øíÞ€qA ¯¸8Rü¹Lÿ~¦a4hVhÐr1 u´ê[}±ý4ùç¬õ~ hV4ÁHŠ|ÓEˆóÖ4ömÓ¢¹7h¹’4 þº{€˜cl¿M¾ÅMK- -‡­ø7m˜ø ßN°à8@ 'Xì7ýý×óÀé!8;s¤Í¾ÝÐx1"X$–æbb?>/ô@Z<ÁHH~3žü‹¼h´è XZ_Ä¾ÎÆfö^ßÙZ4¡õã[Ñ5“kƒïï-¨Ðúñ­ Bœw -8ººGF£g‚ t•oÐz±¨ÏrùΡ°àhòB‰"%ÄÄ¿/å¯ýÌÄtþäw®ß™ë÷Ÿ¬<~|†ß™|«VK4¼>¬ <>“å÷_‚߯@§L[×ýhè¾xZ´È×N‹ž»²‘"‚¢Y{9yjÎ*çã Ñ"Oˆž9å™…ofaj÷ƒÍä+ùh˜'ÛÌqF‚9ÿÏ,Á[?®ŒgYÿ¹ì¦©ö%Ä,|¢>¼›³#¨wW7mW—?ñýÏñ{1_¸Ï(ò£ sq¥å/vWü¾? )Ô?@Jß“Hðòüˆê?Ç EÇiV´Ï£$ú£PWð0O"-›õÏI쟤âîþ$±ÿ$±9 ¢}$ÔÉÎÝý'„þ ÿTÿ2d¡ÿs”Ðt”>Èöy˜Ð?&kÚ5û(ùç@…ùPý'ÌŽ†ŽÓ—A’ø± } ÏÌ ?¨þ³æŒØ¿*ÀOñÄÎÅó/ ~¦]€:˜íÚ\ÌNýa®6;i‰géÓV#³ ¯ÿóÍÏ9uäø¡ê÷Ñ#¿ùáG¸Í¼ËœSBÜœ¼@%‚ÒZ­Ýh*µwwužU8ŒÌþøõ¡­[Ö.»RÿÁ±HH‰Jü>ˆåÿZ™ûþê8ÿAt&ÿ?ú÷ù/?¥ÌÅ_ì×ÁõÿŸQæâþuðûÿÏ(sñÇü:øÿ>ÿå§”¹øÿoÎûGøc~ãÿ3Ê\üÅüŸÿõSÊ\ü%~üÅãÿ3Ê\ü%üÁf¿ñÿ eþ¢¿Âùüÿ7þ?¥ÌÅÿ?=ÿñ÷óŸÿ ÌÅÿzþ÷ûùÏO)sñÿ…žÿý~þóSÊ\ü¡ç¿Ÿÿü”2ú»{>ü7÷ùÀƒð—÷ÿ‹Š‹ˆ£þÜÿ/NüDP¢¢´øÿ{ÿÿÿ¾üßÛÿÿÑ.…vÀôgwl̾åõ;Àï ??ÝgöýÏßyUIûÏÕOö¡ØËôë™—X>Ýô+³w·v 5íÌÍÝî3W?¾ æ4agß‚˜ùc™S‡ù³%“¡½§ø‘HØÍÝÕÖÎÃÃÕWŽÏÑÔ˜=ÌÒR[ÅÈR¯ei¤h°§LP³ÄYZÊÓî”›G›Î%ú5Úîþ÷Ù·Hÿw;ê;¸Ï»[Œ~·Ø|¡éuè¿§3=e½/ Œ¡“ÅüKu}ܧÏK·xÚ¶6ÞO6~qƒïŸîN;õ™&ïç¥ÆÒ¥Æ~Uv.DGûÏÓ§ÓÿûPIÐï–ø{pl3ÀkêI:aÉŸˆ˜0Ñþ¯;>i»¡=>…dæò×@£{µØ×½úË ˆÑ½Wì{¼wÞÝtïûª÷} Š^KEÏÒ§§¢¨üElÄèþ)&öS°‘±ùk–OÚÑæ³[ïÿ’ãOŒf«ÿšüä Pу‰Ø×ƒÉW ¢G±ï‰óî¦{°Ø<Þeç»ÇÕÈ+ÎŽìÜ]>Ü>· í½K'G°5ØÞ­û Û;ÝËžêåt@ô­qnŽB;¾ 9ºß‹IÀüçUÒ}WLr^üFÜâð5¸mÀðˆþòièО¡63¹ø¼Þ>¼þÁÿ=¿ÏUͰ—ú‚n^6N޶÷5 lÁøƒýT=Züÿ„9x•ÆùïÙŠ€lÅ?ek@óƒîó û¿ÔÎtž©¡é&þ’I»¹;zƒS¼2JÍ#@·-´ ,3–øQãzv¶°ÙN‰ž–îv¶Òs `è#ò wÿI€¶~>zÅ h-¿ªEQa"úƒmiÊù ³™Ï3ú´8[ÒV¾žóÙÒ+FŒÖl^5=Ô`03R}>^¸x9D߈è©O[dÌG CG ƒý ”6A[& AÎkJñMuôThCa›ÁüÆtð0h óŸß]zœÀH~Ú],}ĊҪ陯IO»y¤±t±3ΧM×4VìKª¤­Nyå¼]‰ßåLßEøl@Û4pwtp°sW´Ý b-'ð—®Íô¶i~è#ýýòêƒã– -׃À\˜e=Sc}Àzæ;r¶‘¾·»£§/(‹÷§’ЋùŒbév…ý²÷»zÚÙ‚+¼Ïû?–noØY{û<oGwO/k§ÏŒs4bãêêô¿Fð5ÑýûÑæµ [?Vò{Bù<5‰Ó£œ¸È7cÔwu–àK£œÀ·0ÛÏ `vsò}|®j&Bnv·óøÄÔÄé@\ôÿ‡~p0pü6€K;ä<‹§-qÔgeÞhöqûT}ô'.öc´ ðEõ}Ÿ³ÄÑó»ŠýAÓÀ™ýÛ3?Œ´_^.Ž.vÄo GÏ/hj{9ϪèónN{8ëáùqªº÷³’Ù;¹îá•s·óô¢¯þœ }d 2’ž?—øaºFÏêZâ—Õ5( Áî¬kÁ§:¦sñùK z –™¯5[WçÙ§†ÂÂ0[pJíIÛ±ÓSփͦKƒA‰>»“ ÇG ѯÂñcG@Ú&ï­3²~X‰|˜]è¹yª¸xºƒ¸µ³›´û‡ð÷ר7[Atÿ$XIÐcŸêkJRörvƒ}^ôx'!ö§t´½Í4©¾c ù'»qguF¤u{Ó—Vº4“þСùz¥a ô's údNó5­Ó¶yþùkÁçµOŸøI`gF)wwp±ø# NÕì>äÿÄÀè³J ñ,`õÿµ|ô £„Ä–O’ö›Š]ÂÏ×ô&!ùÉZM’Ä$EæY‘$=IÎÿC’î×’_9÷›0Xûá'Ÿ¼U+…þ½UöwùÊÜ÷?~¡ý_¿÷ÿü”2ÿ_hÿ×ïý??¥ÌÅÿÚÿõ{ÿÏO)sñÿuöýÞÿósÊ\ü¡ý_¿÷ü”2Ô/´ÿë7þ?¥ÌÇŸþ‚ ím]wW'ð›§»ÝÿcïLÀ¡\ß?ÞÑ!YêMÍ F"Cb63ck²¥‘˜DÔ`Œ6I–cÉRDÅXÓÁ±Ëš6)¢¢’YJ–ÈVÖì²ï¿Q§?Óáèüçºæ¾\×;ÞíY¾Ï}Ïû¹Ÿ×äÔßÀÀg^€ÿFÀ(þ.G3ùïå°ÿýe\~–L œIÿó8ã˜üS|öE¤ìŠ@Âa_'aa b¯ß¢›*Zû x-M¢.¯¦´o~°v±Ðùÿ _l¾N_.__:<|±ÔùÊÂà µ/„‡/1ÿ{pùüÃy^IKž/™$hi3YÔŸ„odùãÀ‚Ò,o_ˆ<^,hþ½ˆùÒ’Ç‹‡ÑGÏÏÉã9@÷B 6rúåm‘ €2ýöY›Êgµuÿøöù?4¾$hòw:ïñ¥‚”‘ôļu™¿J •ɘãƒüª"9_µf‘‹á‹Ý·[­ Ÿ5ý}~²«bkm'“>ŸHø Àêû ;5KšÌÆðù5 "ÑŒÝ&»´m†}n³ì7mþDª~iõ–öÊû'Íþ†èf8ü5–ÉÌËB)qï%j#løS.qø€ù¶ ª(óÕEe‹¹Ñ7ãæ“ÔŒÕcÜs×}ôŽ#š}q#ÒÀ¹/Ž#^"ña ¬ä·êSÝ9 ýÂ\ý’AdŒþr±ÖßÑ“ð¥ÇÍP_ ŠgaÌ;XT,×ùŽF#>1Eº_"dè£O|jý¬cÌ—)ôçÿ‘ˆðéêy²²+þ™B~¢Âþ«‡æoþ÷´!3dá<Œ¿é-‹¿£[dV087y„‘1››;²PRÈB¹LƌɘýKlîóŸ´þsý·e±¹ú¯ õÿ˜ë¿-‹ÍÕ­ÿÇ\ÿmYl®þ+hý?&ÿ»,6WÿÄ3ùße±¹ú¯ þ›Éÿ.‹ÍÕåðßLþwyl®þ+ˆÿfòŸËbsõ_Aü7óÿÿe±9ú#VÿÍÔYl®þ+hþ9ÿ³,6Wÿ4ÿÇœÿY›«ÿ šÿcÎÿ,‹ÍÕÍÿ1ç–Åæê¿‚æÿ˜ó?ËbsõÿGçÿdàH8 9»Ÿù÷ß²£þß 88ËÙ%ZO[;‰Ç-Í®ÊJ$µ6±:&uÊl‘Í <þ'Ýÿ­?bŽ@Ïæÿ2ó?ÿ÷f‚475C¡Id¸)™$‹Æ˜Á‘2”e‚@AÑpø?]?¦ýoíïø¿‰ÕâÊø+ÿ‡Aasã? E@™þ¿fjbC²&›“­ÉÖÖd’­È_½ @Ž”ÄÁÐI$ÃDôþÝö7üßÊòèâÊXØÿápýÿË ˜þ¿vY{¿:7߬sãö¨âéÛÂU«Vçü¸šþÉYSÕ–¾Ù¡­IP›ž™áåµB£Ñ‰‰‰òòòD"‹Å644äääDEEÁ`777úé333fìôO?Øâ÷ë®ÚÕúÆ|Õ*¡U8U%‚CxwDõûçù#‡YKZ²óêÖ´÷;‡¼8rÖ©/¾˜b˜UsläxFf¸´fõ%Þ·wï‡GF ^zó†}ëOjÏ2aÆÚйææW.pp$I¬½å¡@±ÝR»ÒA ½:œu54pÕŠÛïpÔ¹#Ýl)gýL@p¢ ¨?X稂[Å‹i¢7[²ÉýQÇv¯EP_Õg”:=o½£a4k8^¾%‹uç°ÂÀïÑ>úîq>Zx\q¸× %¬ÿÜÈ{6Wнì(朧¢+¯]‚ÎTȇœQùΛj½ñ¯)´¿ñÆMïì´kYØý–K´­”P&–kÛ–ðGï~˜û/.Ò"§z]'Ûõ׋±¯­MÁªãÂùú]mÀˆìðØ¸½z‘6|©½”œ nœüܧx#›w^ÌÓ7Õ½æuìõ—Áœ^WoC5²õð IãÖD½¯Isy ¹–­yõàÆú©ÞQÅÀ!Ï‹A•*/ä1Ý )ŠÒ±œ“÷yí •Éo…¥Õ*€£ýE:†ÞŸŽ9U»5:HAeô Y]5O;öOÑ÷ÞªìU¢šPbÐÙ˜B|ØÎùgêëq=qeâ6ûpðé_o]³ë׬½}¬;8kø{§àÆÏÄ ü†Öè¤q÷;,ZrO|ÅâØÖ=(Té³ä{Ôã3‚ÑÞ4Èš íÀCƒJ• ÅžÚKMZI64í2( ¶©-åÐà kuæ°Å¬«bO¿2ÅR…Ýù3 €OÊâ÷‹3µ#*NÁüd%â.½Vú>G©3Š%j/]ÁT|®ZŽÃÐ/R…îÙç®7é”nÀçæÂÔz +ªz¨vÜq^§ï7sFŸ+ì7¸CÜu⥃lWPµó€FÍë´#©€D¹öFÒ¿ÅŽøçeyôPYgÞôm‰>Îúc«s÷=Kuƒ>î&¶L;cay#ùÓÕ:›&I*” <€œ]…±nßkãÎSÕfÞ\k)ðÕ ýó†R¨e¤½ï´ƒƒH\â÷gð?Å' ß…$gƒœžÕBÆj5x×õ6м®ßÈŽP/(QE]pâýO9e!>ãÂÞÝÏOÚ÷ÒTN¶î̪a¿ûø¡ºmªzÓ®Sð¢÷dE8UÍåWy©Í£'·Œ¼<–­Wø¼k²+CÎ+Ñiú¥Ú÷N’´u¾gÓ&7å7)ŸñÀÁ½½&û‰oKqåÁE þ©[q(«æ¤‡¸¶Å¥;í)½Ž’¼ð‘®èO#îvµÎϵ:ÇOpÔN!ÁÚwõÛ¶C×EàÁîüí°­­rX^É»©Ä³bf Ä%<<ÖŠ’œ¿f:N5\Êš¾8ZFkOõõ®-ÆC\@ +*½“Í F©ûgFqö ¾¼LþIÑ\½`p¯KCbùŃ/œ)Å»t!C&åˆK‚iYGšó,[SœžîšÞ‡—0¼ÚlA6Ç d6U\µl¡ÐÅã!Fò7oÇA±*¯D«¶m/Ò´î~ŽM« C²šk01EA'K*3?³]4ÂÝä.ˆøu[Z8)Våš– QC !äk"U^Í% ±‚{·cŒËè7âgHŠ_]G/ :)§‹ܸíúkxÁ½˜¯:Å|Ôñê;z¿WNëf1þGPex¿B&Š^ì[â‰åÌ 4 Ó6³¾ÆŠÜ«*<”Oy¯“C¯Œ¨(îæÆ)eªHæðÉ©ÝÀ³§n‡(ànÆolÕ÷Ѽ9Y*G´ýÂQÕ2,žFKÙÖk·¨í‡A4&Ê!ñÙÔq|‡w|yp·®†Kµ¨w,,ÿɃë·Û‘lþÅ24j챢ѴÞk¯A ¨*®†©q\÷á9ß'$_Ø+ ElÂ>™àÞ‘n†8ò‘Bs¦Ü¤øÂBMj¢ÎÆÁÚ-E}3»¦Ÿ+¦Š† &òyà6]§…hû¹‚hÑüFÇŠÞžÈÝ`èv-Øè×¶\ß4>R¬ô ïyú1ú]Ÿ€q•H¦D xBSY³Ñ%>K«2Pmû>qiÇk°.tÉ ŠlÞU×-¾c]C¢1f›“iÚ9f2´p8g·Ÿ xR"'P{(PŒÏƒ$™{nÒÊ—¶¯Ðˆ”.g˜À7p·µùp 4]û®ä[?ìu翲£bN÷ÂgqßÞpÀ + OÞbj–Óˆ¸M„^Ó¬J11|Ы@°Ömæ&³V€d%¼C+²†Fîµ9XßšFÝ€Ê_¹*!4-V*ë׸©ç;½:f–s.0È4)뉑¸wvc¹ššæ®åUm*Ü¿ù¶ûP¥ê"ð$’Ÿ‚çñ& uFÛ&”í$Ò‹ª·Ùâòs ËIP¤¬‚»U£ºœ€~“¹Æoa¨àN—ñ6˜xYÏ%ÐyArÜ:\>9†PÁ¥&$•(Ð71‘^ÿWÇüW*æqU_2&ê é‰ p‰æyÂo¸mÍÝaèhªôë4Ì¿¡× W’§¯]fZ+ø*Óª‡_ÛÓÍËixo c× q‹æy¦7¼ö¡iã Ñckóf·À+ŽÅë¸31ÍQ|žRC!©ÙBÐVjÕåçvúðÒŠ”c§„NYóÊœƒ÷Ô5jÔ*éÝél%u+ÅÑÏØâé4#wÎaÍyXZU,Ö¤¦mÁJë2êxϯâÝ& 5Ùm Žg÷ Ñ?ÊÒ¼6gnþ‘fâuæ'ÐoÇ÷‹~f°U¬ñJI-Hq/÷*ÎX‚v-Hï‚zx‡--Dù ©p’ƒ0wÏöfÛvææi:¼³íÁ¡vÊ+.W …?÷Ä»ÒN£ÑíS1ˆÝ‰#òŽ ù'>ôÕ%™Eú–€>ìí²YßDkE­Í¼RÁ9–kÌ•Hå—€õÐ/Ó…ÆÔ(-¢š*WÞ½sÂ…"J0%ÐO7ôh&¥¿äUç%„u½ ²¿L¬ñåÀ½ÉÒ~T<ñ#=Š8²hfïz›%Ì4õØ„nÀ. !bOÈŒ»Ë sd”ßÚ%£Ã%üœ2Ezoßå³&vö%@;áÃ!-•ÛØÊëßy¿eïˆä”¼Æ¾¶˜À À®>SÖõQ=þ¶ûoS·-Åß²~¦ª=‘P ­ÌybE?nà­Nrp@ø_v¨f6l û·GÆßÑÈÛ ›¦ñ6ë=K £¶ƒb†ï3÷xßH?Å¡\Ľè6ñШc´ÔUÁ ˜úlá›e. ¥E™¸,y”Ì÷ñ6H ÒÛ’–`DØäR PŒu †$‡‹ì3òjºÕ¡†wºw°ªƒh×—Ÿô A„UJ¹îOÉ(U‡ÇE61ZðëS÷±+Óg²…4à†N€hÕ±»ô¡9<¤‹Zœ‰Ï½µa/0€‘¿LDyð€Y*xBH—nÜ<+UÚÖVÖh}Xã¾dih`KÝ­&>vŸhçS®{7 \>ŒÃGJX/¨ig·¹mT5¨Ú?Öªì2&ž%á¿ëvÂ_ v:Šü,³ifÿ3É —›KQ”µ-¶½¦' LŸÁuÖÑøíh>rIöŽ¥…@„ÍyŃ®ËÑcñm~ÿ³hê~kFÏ™’`åònÕ×l.—M–ˆ½/»<Ìý‰&Iºn¹qº’—ÄAîk:ŒyI¶Û{Ц”¢;)—³1Ødn˜2oïÓŸ«úJ´@išk6‹»NÛ<©ŸÁ$°“rªw5EDÑÃà®ê\X†ÎQM&Pí¼Þsë Î‡Ê¦«4óX %Eg5$ßb}ïSX‡‰6kÃqJÿÅBóˆlî9χ:G9Bò§Ã ‚ç?ö5bYò¢]NDíÝNöhöŸ·Ø¾Ó y}Ú½Q³¢ºÄÂmf9ô²©€;ÄôQ”̉X Î’ço½µÆ¡…ÿaï;ÀšZ¶ý=( 4‚ô"R!ЕÞ1Tš5)‚¢齋Bh¡w" HU DªH”&* ·£§xî}·œÿÿ=ï¹ï²¾/ÙSÖZ3{֚ɞd²~'c¡×Qx?ùŽjbê¦é˜¥ñÇv}Î@L—eêÇöÏÕ-ëÓZ#æž.ÕñÛÏß)Ÿæ¬pgÖKØA/†¢;Ê}ºšáV ê;è¼FSC;ÖWIGxWM²7‘ó„×C[ØÉPVaªo¥‡øh!§cBw&Á®{ùk"DÓú(JÈÝ úÉ»‰| µš`Ë’ŒAS¾2  °ëŠVxpu‰Å5Sªê|xy:$™²O˜ÀÊö³ÖÍšVùÀjkoÖsì"“ZAµ¥µÜZí«e¥ûÆãžê[kÍBw¾!PwsØrdÐ8ˆ‰^4ûÝÕ³|±Ð7óÀ^¦›92±‘æùb n~–9â  l{)Z{±Ÿi¸¬¬ùLžÛw¿k¾?¤·ûþ%ô|bsÑé™<äîšh>Âç£Ñ— °Gá0×–" (øºï‹A"5~΀䃻·1EYq x˜}…Y”l°7[MæFAÑç‹ñ· ÉV»×7FX WÒïÍ Læ'|Ò›ù0> +9Ò¡Þгñ¾Ëev2/ïU‰”²^'ÎÆª‡U’[h2ÔheËZ뢓ɣ·—Šü3D|¶Ær´÷ÑøÚylëA;ömrÖ‹’zÞ«M/º%9ëb=gSÜî;S'ƒ¡³$¤5×nã=GdXÉœ¶/•̯B®ŠLHmô\.ª8Xmí$Ò4b&jI®êßSOIØq: ’’Åq)P4ŒRÜ&Ù ß\4{)€^¾Ÿ>_åWºI¸ã‚Ç4—-//;íE”É|Ú`]—]ÿdtƒjo‹ÔÛùLxt_óÕÄUH._œ÷É»†øT,Ë%è¢8ºŸ,ŸÅ¸FÇù¿Š*³ºwŸrž•„àŽØq‘|a¸·P#yÄÿ ÛËõžQýH$ó¥.ÅT°˜Š0àø6Ñžl}6¢„‡÷ÛÓÚkW­ÜXÐ1}Aý޲ojWTÄ[™ìJ»ã¶_´¥+ñGÊK×ݤê@žà}K;Üã…lca¬ùyiRÀ_54”®¼˜MþÏë[ä/XhC¾ki2) Sò…¿¿oRÓÃTl“z•"SÔ„ž–ôUÖêéíÎú5;Ú¸¥Œ'ã÷)®ú\¼ :²þDH¹XÙL¿íá®G {ˆI(‰¥ÝŽ_\ ìsSå‘Y`/[T¹wž‚LeÃÁ¨)PçÅGè›Ò©ºÑaúþãsóÕpéHÛURΠ)Æð ,°¹~ñsw—åô3N0È?÷îÀxe$»†ìF6¿àÍ„ø!»j…ôè¼hãŠV4UP‡xíòã7‰~H£‘¹¾«YiüÆ¥MõÖÔÎçä9õËÁ3FÖ;©§<¯w»VÌ–.<~­ôºœçµþe:¨¥ÝÞÃF…¤‰Ì§W ”uK³ãÌâïõ…‘®ã겯^X<ôêä©r}$ƒª•³áø&á §þ2ÓˆÆ-ÁÍr9ÞEúìʤŠþ.?Ø Å©¨rÔÝ嶇Hr d½ãÍ´äc0Eÿe#ÝRE& Øn…TÀéa©·™‘WÓ¥f̉Y,BßËÌxŽñÊ  mjQý½¦NÓÐÎÕÂ,Y†ÂÑ~oÛõ¬ _”Ù-›®hºÉ3‡ˆÜ=Bg’eáO~«;t5.(”J™Q6És“›wk;ÊëqLßSÎ~útp“ÿ­=Èã4²£È(Sqf¾&ÿåñÇ"öº^Rï´htDoÓõ#Ï­XR¼ÎÂÛä [sFjû“OtëÎH‘½_:Ow%•{n¦É_oÂWÛ\ t ¤xÖr™«AZÃ|àÑi±~v£ûb{]¦¥ˆà±lšÌ ZžÃm1oäÃÄÀw©ˆ&ÿ¡e½ÚÒ¹ZG8´À°ˆíTúަÙõð}NÕ Í<Ø»ª¸ã«²7H@àãÜ2Ó8Ð!'6ö¹’¸Œ¼lª@J8D¼•8Ä&´‘ØtŽ¢Lf>EY ü®…hsOVÓ›¦&ë¡ÁFøÆ²a©e‡Ëˆ3ð¤SˆOD¢4¼œ1ÙÓŽ§uV—™Ó̃èáG±bq ½òùU|Æqù¼®øŒöçeAzuL!t¶·å&q%£çG¦ Ϲ SA•F·Šs0ÙRµ6›®€mž»wa´ôT’üZo‹îM(>3ïžMaÎù¬*NVóE ½Æ‡ByÓ-à9'µÌDV l:ß]Ck«e  WQ¬]÷Tañ)V@7æ}ÈuNSkÿª³ãš±Fg¸úM'ëxõÚgJ8YÍeuôÚPZ.¢œ¥D›VS§id'hêp=AaCåXÓª…JfT’\@§ÀšAâ*ön“µQ­w>SOÄCMiÛuBSB§QE‹cé£Í„(5²÷‹¹,1°'j½·Ås>ø$*EÒ´ÆŸHÊ % —׸z&>³$8TÔ-êSþ\ne Â'×·Ú‡ú±¸^g´OÆV³ç‚‡›±_Œ3€ëͦî‹à’@5ŸÇ¦˜Ç/;R±žÞMv €Ì±¬§Î2Ëk2ÒJeZó˶qÁ-^Mç ½È™µÐÒ Q.s)«¥Ñ}tÕºW m…Aáq¾•¢>‘²V¾Ú~D©Ü_TøñµÜþÌ&x#TÔx9©jæaû‹Q€do©´{÷6ôÀLðÏ5à³WÒ¸·Þ‚MU!æ.¾Ñß©J«R*G”=x¸§&"* nx¥ºE )SÄ[©ê»èê~kƇ‡â2A±çÅLЛÉ=çÑã‘˳£Ÿãc?a7Ð .^k#ggâjgOñó›X=B*Òsåt†…,JdöØ;rŒ]©¿ìBþyg‰D(|Q¨¨õ{ô¡õ)×f¬º®ožK¿Bº>ì‹K«»`Z†(º|[Ü܆KºÚV»·qÀÑaM%R^ÒÇÐ’€öÏñS&ùëáMô‚`ü–’®Jœy:«’NØÆFkî6.eÒ6¦Ëñ~Ø&`힡؛ÕÊÿöa%{®–ØÑé©î œœf¦Ýƒ\ŽíÊåŠø)mY Ð;Çt3ÝÛÚd„0”S Çü9í–©S kÊÚý­) ÂHÕÇÚ1³‰—Z]£Z@?:ÕJ8sÐW Á¿´çô¥65í¶лäÃzÉ$nè§F¨· .QǤ~Ù' ˆnúõ” ÐïøòÎQˆ·°'›Å+ïÅç9ÈXí®™˜Ë&^_¿ðŒv f®U¿?ÎÝ"ý‹œLbB“XxâÓ Õ³ËN¦šxLʉ?LFè¤ ø²¬C a­¸œ÷”£Ñµ¾t­IƒÁÌd«ù¾ð Û@¨è"Ua2 ‘W%Ä×Ä¡ÚÊÝsƇBv yÆ¡èQþ鎗3a,¸!-îÖÜ䶪ЅS³vúViïÀC—st×Z–ZXâ{‡!X‰ìÚIª§;·t9ñAvO¯ÿÐÄrð >Ô—;}•z?†œŽÓZC-—“L#ÙŸobitç çÇ<&v9¿r À33œÎœÐ{Ë¢——[i‹ÚQ&´%°Ð—Ærx~¢Sa¨ùPGý¦*Ôó=û‰òk ÍżÂHá9E³Æ‹/'„CèÌ?­Šˆq\òFŒÜë!›–må]áðì¹â÷ò.öN’';™]N49÷S,±…fƒTixö`båØ*föeB«Ùò¬–©£_›oóZwA…k½®W©XšX'5M–†7À§4j‹E86¼Â;¤u–UK\WÄ‹íH¥÷<=™ØieÍc/õF§•Uië2r¶‡ê ’NÒê‰ÞÈÛ¢ÑŒÎÆdš½Ý¢8ÖRñû½â|”Çr>q;vš @d(æÈ’„Ð1Œ†·Eãiù­€"/ù±±± ÏIîä5Üt„.™ $ŸX0ÿ\vX¬ yEÔîñøîr©þ•;ê¶Š÷­žaÁÄü3f¡·-ne±Œ—:ÜÜ>>—ñpÎ2èèì:¬PËþN¹´¡?ádŒ–b““ŶEB×+0÷;)Už!/µ*ßQÊ åt¼ª<É*(œ8jê§J‹ PX] $fl.»iòÎÄB¦¡¡£&}íl ¨,ˆüÊ EP©Þuár_ÕUpQб}µ­v_th‹›©6åÔ·V{!R1-Åg~•‡JÔ^!¥;Öô|Bš»]È*‰-Úâxð&Q‘}‹gˆ8ØŠÉó”—çêvyyMžKžô/éë­Z –SHT2!Œð»Ç){%Ãy™«âÅíʽ>ãœn±ÂÛ²h·Hª#¦1Ë0ö£ ÁI„ÙK½‚ïÑêZðAËbHÿ/Ü]«ÊH§°¢šó à‚‘›[YààM´ÃxÓ(®žŠÃ•™D3´.Ô2X³ž®ösñÚ°Ëá®)½¬Òm|in»ˆð¶Zxº=×"m‘q·OVØt!áäçŽéÅ|g~µõî… »A[„°žS -”Š–ÍºÓþÀ¶`oŒÁñsMÂÈ`™[ÜûÑºË‚ŽŸcOv‰¸Ûs¯„$»¥Ü<ÍÜÏp}hȵx²7{†qÁ‹9:ìbç±h¿‘ma+v [~'¥CèÛ.õAtµv𠉽ÂnÞ8 1òi…8ѱ ×ÊÐ €wF©,‚Ý5s°5¢V×d8BÛª4×)zŒžfWÇq'븷s®ÉÞ²“J® 2›>åã‡zH¯ä|P™Î™kQ‰ ›ŸXù‚¦2ÏÙtD‡êI³7Zä¯\ìÞ¥UN_.=øé#äÝ®˜çJǼè—£Ò$Oîa˜Aê+Uk²Þ‚h oOzŠ n1œäáet/E¬·¤‘lN’y« BJئᣒ “D´Pö¦­fù+ ÖIväe¹¸°ÌS>¶Ÿìs¿{ůq9¡&^+¥½\µ‰¹Xœž4(f·ªÜ]„× #–!jã ÀVWGƒùVÎ<ª1:š»n11%dí˜[½(HôaÚzºn²œðeî64ð(õbò¨XX´\¬‡X™õ'=­…döœÁ1ÁœzþÏîÙ'^ˆÓÚNbá™±¨/L·˜jÃsAùG,“ËAgùüŸeᤆD:ã²×¡´< £:ÚÝ åÛ[#ƒ¹Ê¦É:Õt–ÒÞ…ŠòæíÔé€&†Ù˜pNzys¤> ÿˆòy€±ýgÆÐû@M¬¼yð7}ÔÝíîe9@’âi¹?9ìžVŽD]Ú  -®¥R »o ¯Z¾ÑužÎ{ñ8¾ñ –ÓΩò¸›˜ Kù [h©¾c^1u5R)9e Ä×ĺ|ª8à¤ý_”+?Öä°e'b["öЉë›:6¦â”ì@XÍIMûˆgô ˆœöùÍçùÌhv\an»3eoXY8oÿ;Ê–Asi‹í‰ØëZÝneGõ ] ˆ–åuçгOÔ¿]QÎÀ[?Á]Œ7aÜ:gÞøFRåmÔÇ6ÑsÎïÁµ"k¾›®';NL÷¹=‰©$´‹ÇÄ{oÈS‰°qP}5A> Þøáryá`üe+&@cˆWzy¿½-;®aJlo ÛÚº7ÞßvÉ tº¾MbáÃc2é–!¹jŸÝ=KeÚ[[RrSc—Íu }½rÕ¶>(ðÃH÷H‡Áqr^®øà_+8¯Z>ù¸$‚-äåϘÄíxm·¾#f³3oÙ÷ï6öA¾iS˨¯¿[ž±-`n’³RvvêN(^*»üÕ÷>F:žR¡³ ÌŽ2¼UæYOZÌU"c?8†¦v3qÛ^$o.KÝ›ã›èÜTò8çÖµÛ ÷˜B2ê3¥´ Hñ-ýC±_ÒæøJ¤y}[$Y-èKzÀ•»Ç/m¶H?uIÆÎ|èo¹Û¾¥ã» ¸žôÓ¾É{f¶’ÆuVK›]{Rqñ›1C>M qÜañk¨7ðP%¦S^í K´‰eY[¦3„µ;e}‰×ö,”½¸Ù»“ÕÜÖÕͬé½9gC-LgV¸Â;æsdžJT¡þUвÿ¹° j{}öi× b§aµ×"KÛš´ =gh5yO<´)jèÖÝ\’a1ÿÔb€W•bf õ9›=­6ñê](’“/SD¹¯È’b¡oRÄÌÆV~Õ˜Þ:|‹jÇu¾” @¹Šhx%…ÕŰ-Ç¿¤Bˆe5If.YË#]è%m ÐÐ.qI¿8%Îbås¶ä¥ 8eg§A!³—±{×ûJFoO‚æÖ–G€ƒòØW.¯Þ…³ ,;µBKÄ+µ¥‡Ïž Q¬skKþJ†s²ÙB@«-GÅqþª— ëÀ8ƒªòy%¾„ï Ä)¡fº½Ð>pÞÞD×ñÁWH¤WpÌÖÉ©GÒ£Ÿ¯¬Ä]›‰r’ü݉ŽÒ[9 2z—~ik^ÞLˆ@ 1|¸¾ß‰Ní‘Þbcó³ÎÂVC·Zw1!8ŒÀ‡ÈÑgЙƲ’l!ɾ+_½XC¶ZÎŒ{ Ç£Zį ÊÀÆW‰kêw8±Ýé™m+—n©+ë(+˜úýë4íӢߟÿûÅÿØÿðCè÷öÿÅÿØÿÿÿ¡ßÛÿOÿcÿÿ_?„þÒþÿ <•…­+ÚÅòšåÿ3àß?ÿ ƒŠÿþ€ïŸÿþôï‹ÿ÷‹[î#î#þyóÊÿPXg-ÿÁ"ûPI]O©¬¯ü¯ÅüǽØGÜGÜGÜGü·B$þG÷o£±(ýú)ô?Œø‡šý;ûx€ÿßãû÷aýG˜€´Áÿ5TÀ?Ô‘¿ øÛ½ÿ¶øï øGîêo ~?IÿñóŸO„À?ä#ðw>ðø‡FóÿNàºíÿP¤À?4FÿIXh`öÑ÷Ñ÷ÑÿEô»ßÄÿDñß÷ÿû!ô{ûÿ‰â¿ïÇÿþ!ô{ûÿ‰â¿ïÇÿþ!ô{ûÿ‰â¿ïÇÿþ!ô{ûÿKã¿Kˆ‹Á¡b°oöß?ÿ÷Cè/íÿÛ/JW‰§PR6ÄÀhû>Üó_‘¨è?ÿùgûó؈HÂöÏÿü‚Á VÒ⢖€E,ÍàbR0´ÔÊLLXÍ%Ðèuÿöé—þÀüÿgÃ=ÿýƒùj¿þÃDaûóÿGÐÿð«ïÏOýr°€ &&)“€r‰‰KÁ¤$‘A,àVßÉX££PöW­“„J ‰IÀ¸Ä$$„Ĥ¤‘´„X@ž“üöKÀ¯Râp1!q1i.¸p•øE ±‚þµêš‹¥«ÍU{‹_@¥Å…Ä¡b\@“DE¿(†XH¿S`æèèæˆ¶%~ãõ[ÛbRBpQ\¸Â~•Da߉Úþ"ùWAq¸tZ*—’øn`¥¿¤ëf×Ð6ß ‘¸¸˜ÐW¸4pý­¯¢ Kóï âæ`ûÝI IHÀ¹à’’BÒÐï‚x¯ï¦³í_ÈÜ_e ÐýoÎþcéŸ_ÿÿépßEý‡‰ ÿ_®ÿbÐ}üBÿ›¼¾Æÿ–Ë‚¯þŸã«ªªî8ÀÌìô-à÷Ù³g}||ÆÇÇQ(''篑¿u^l:ð·"k^‘Jh›­¸vµŠeÀ±r^æ ³æüœtubž:ïÇrþ÷U…:ÂŽ¹“˜[b³ƒà'!;QÚE Ò Úž¸&ÿ£QÜj~ÏHϱì¹ÚÓz~Î-Ð<Öðpq:K}Ï|óÐýH6Œƒ ®ª=ƒÀd” d`‘7w´¤ Þ®{û©çù·-,GßMµ€]‘`\•b‘¼bÇp!ý„eš|­añL*CrJ[†‹ :ÒÁ‰õvÂ1`’te%WÀ˜iD’"±fn«ecrÁÌY‡íùÀ$(óu½™4¾”¥Ò…ˆäŽ›h’Z9Ó0È‹+±Þ Õ}!W÷,Ã{ ö­xV ÜkÖFéQY¤ òc›S¡P‚íU>ôþ [Ip¦¶Ðñ¬R3xª;±pÞL3Vƒ ª+ ôÛˆ>˜¼àÚ¸)yí B2᮸† ©eyÞ—á(xÂö‹i±yM•)o'&¾ãÕ'˜ Ž!?®R±™ÅŽ tÅ?ϸ˜ç’éŽÈkƱcÜòE1Œj9ZTv<EÔuà‡ÐOeq[•Û߃£ÿ)Ó]%­5S|O–ŸòbX ½Æ`#Q^Ü&‡ 6y,À­X¤…KÛ{~øX•Ø\áÝÓ™=DQ)@túPÐ0³›Ž).Mwö-ÂŽžinx7S*KÒ— ›g]ÍÂ4Þ‘”Ï(öÑ»§_ô‘Ø™ñšîØœÌîɧúE³ˆÄü]Õ±tþ óÒøìü ”µÅoÅywNš&Óóm7ðPªÅ1Üyž!¢ç…ÚË#²±Ç“Mã&wKÓÇ#\bhEpÂÍç5_kd.x]?RËÙC‚¿ÝãÚ\e­‘ÖÐ0[r‚ÿHIÂC[ÊKó.®rÉ/rÑÆ„U¼ê#ºF3D¢}–`ß61#/7ÄJ«;ºÎ0­ÒIãè2zø@²Í Û2†1+<’-1Ó¹OHƒêŒHð-ìéü g¹h1V4nì õy…Œ#;>°Þ’§?Ò°Í Zjeì}Y¢yÝxK´kq67¾yúTl‘4äaÊ4pÃÏ/„öjUÏ4¤ît1²cÊ(‰< ûnŸ7¡4U#»™ ò^ȪÓAF…Âøl[G¾ õ®¸–áó`ñ¼á4Ea|B øªgŠþ⋌ゑuXe7dÕÙ #œìpÈñõ]6L†‹MÁz­üµY%\Pر4~)¡ˆ26,›Ã-¢ˆ²"0bìMÀ°‡…†åܧ' š0&øA)ào…3Ãù¿:ˆ/à Ý€3¨2‡‚•Ý\Ï4]k¢;pafÏ–û).†ÉðÞ‚s%!&!ÀL}‚8½Í<ΘØG(ª>s~M#¿&á20ë ›Æ4UMéîÅuç¾%v3‰ iüð!¿áÚ9îo‰HnC¿›E=>>Ǹ`»'5"Œ|ºe †bq©CëðQ¦¹êµ!¹“Aç.;8ùÊ(ýäxÀíÀòü’«ðowOÞþ\žð™^'k™@òÖÉøÎ1Œy„Dêæ§ ¤ûÅìâtgRÎnQ^Þ¶™ÇSg²èá??g@XínÕfH,ãi/5>`ƈIâGeØ•p‚O8&·0H題#X}w›2Ö;Q—øv¶dYÌ‚=y(ë‡WüïD½:ˆJÊ´ñ̶•DdF›ä8 ç·Ù]ƧÌ÷“š7¼[7Ý}_ÐM]ÇóöQ½ÿÆ æã}êãkŽ>Íž3h•t:ä+° RùÙ3ïGÃ0V’ÑeF`¸¨ÜÞ9_,ÊO¦âÊ+¯Â¥:æ¿k¥‰&»4VM­NïÁ‘×\ƒ(qÖž6Bë“Î[‡ÝÔ#-dŸKI­¶¦©ÇƬÍ$z/#\šD¼z]Yd˜ªü¨˜cN­ý¶ª¢¦ŠÅÿ6qýFqõÓy5ƒ}…?!4§-_©sjVxsàòÒ Oãé0Öšª0£ä*Eá“kÖBeþ6ßúÀºxrh` Ù †a aj<*taf”s­ŽÁ/n6©àºX˜ª–ñÏšB1'ç$¬¨}ë0 1RO<¥,Kòפ´ÈÔòÊ+ßp‘¯Ï¦á¡–“»QV"SÜfÝÇÎì.,yU1Îyö~OîÔÐâMé½ Î~iFóicÈmAl}Äü]‘ {yÛú¥yˆNxÖ"†ò«–£XF·ÆXVE)ÕÔ·ݳçýZ c‰–ògzÊïîf±`sí}ºmAȧýd޾`|·®ÖÐNéòrˆÏÈ%U\^É™R:7t!°®ôªG™ßYº‚xTv<Ž5µJßB«pD¡¦-ÎXdí/¤ÀJ?þÌÜÎMï(‰_Š+koÐ:$>7yãÒ¼aF UyÕ»é:ByþeaUúq27z7Å ‚¯‘=)»òXW¡ÓqZþ »ÚyË#˜âa3™GÔI…Šc—.½›CHƺáTiÜx/¯Û'b®ŽábÕ. /‹tŠà´Ç¶ãå± lÜ9ÆånÛ¯ÎúËT¿ÛÅ&\'ÜÆµ×JáóÎ!È_üTµ’Ý”±´õ<”¬ç o‘ؼ×À[Â-I1“yÌAÀê8fPþŠ,@Ævd¾„ ã³ÂeJó,£‡’ÉíüIǤÂsì<%ulsJ4n®À‚Åãq’D!­áÉ…m{³6å„›í(×8ÒixDsYÙpÙ…ç´ÍW™À†xy´æÀÑQ|&î‚Ô¡4ÇìTÜÁªãÌ6?½–Ãw{©„³ûßÕVH„ËÜ–8£6,‘NƒÁŠtµaML+Oß1B1V3àüYpðK?ÙŒøÉDl1™¿IV„;°""óóÎ}¤HãÜ8£*L¦6ãœÍHä°Ò-å]ª8ÏWÕ™Y5ÙÏü }Sæibã¡üxI­ÍᘂÍ{ärÉݸ"nmZõh ¤©Ú wZÙ¨£ÔAq Ú§6¹Ñû_ì= <ÓÿûJÇ7B§JaI¤\»7rß9I¡¬±aŒi6B’.•ÐI‘r¤Vè Ñ¡K%•¡K÷‰¨$EÇÿóÙ0›#úiù~ÿ{^¿¾¿ÍgŸ÷ûy?çûyÏcUψò ;who¾yþÑI'ijå±PJ.°œ¹ÉkrîBfÁÇ:;æìâÜçú5é›ó2q/32 ªÏŠóÙå²Ú(Óž´è .}aÉÌÅk´Þˆ×l÷öc.´\1V2‡¶éhÊxæÙoÉ{ôoæ:­¹~\±}½ù|Âä·ÇÍRÃÓìñcüb/8…Ä»æÄÚ¦M<çŒsW‹ü¬{m%kâäš½é6«Z¶¬²ÄK$|8I{\:ÎÔHéÜkÜëù.ç}ÆÂð6&vÒ×q1Û]RLá3‘cn½0N;þv¹Ï”wž;•òU‚kÓ˜Yb[¿í3­FQÅq¬$©ÉkñÝ ¡q—Nm¶>x÷óNJ¬¿m½•áó´(Ó°´¥ØóíhQçÛê{e!Þ¸‘ˇ:©…¾]V{o½ ‘(Us{Vý›4£¤ qâ…WÍÜØÆ|jJõ¦‚IB2#–T™èܹq_%qó`tz`Q©SQã\+êCHÒQ§†»FÁŽÎkƒío9I¨Ý-~y~ÄQCë-ú!óWÝ’·ýaæ&^sûxÉ铱•wFŠè(4-ŸX /µ§âŒ›«²ì죺2–$ë¤ƒâø—Se‹îïü©«>¿bWî”søê¾é÷lѦãn[`á¹s?\9ñtìÖ‘R†úHX5'Z—Wÿ´©îËhíÑx9y¿ÇK($ŽØp0ÛßÐtãñI¨}.R)ýêŽHœ £$вöí˜%ŠyÙ(i£)f”{cÌQëî1Œ)ü‘»OéBõÁ!!ÒI’ª Î/NT!ó7NŠzöó²íșǨ×ퟜh]ïÔXûÀny¡Èݪc"ÈÛVÞˆ fyo‰W ¸wãâÄ$÷ Ä!^Åó_ßœíÄûOºÉr ‘ßÌT[¾/x67òáþuö©rN,«å™ã#Q÷S0O®Ö´/}H}ž‡ÍµÒðšä—̈ÇM$›v4C"´Ž‹4q¬Ñ»åpd˜$#>Ÿ©äÅšUpÖŽ•‘XâÂ*ñù°#Lëq*9ÒüˆH|þ›UË£m³÷¿ñ/yü~íñÂ3Æ}o¬«Ø›¦Dž¯¶Ú[êž2›N`Ý¡YFi3*4.ð[keyÛÊ>*ß Ì„Á\;ëK±CªÜÁù‘»ö¾5˜VÓ”wqQ•‘lθ©†Ö ·ëÈäûÒ*dS3o/–ÉÙëxØPö¸>$Jkèô"-ÃЯ“±[K~„¢qÙò;/™Ê&ÛxCÆV¤6¾¬²t=µ6EòFrt>Æ»Åõ’X¥4±±AkcÔ}É;ާnc?8,Í´¸4ö®MÚªây8³EpÄTÏûvÀŸP#­RNšïØœ:ÅP¿gÑfÆ\Q²>©vV–—sGÕ´`Y†Ïë©…2“g‡ WßA_„-z(Èß*z28·dBB ~EòÉù»lX*仾˜7¤âfá~ÊÄÕ[éyEkliÝšy€d¿uuv63ÈÒažÓ}ë õÔ^l¨×²±œ¹\ktÎ1ýq#'⠌ж³’ôa)G I˜{iù¡>éþLgì³ÍKÓÏ<¦(bc•äðlãõáßïzi{‰ §kû4ÄT:Å÷³Òå½™]t‹ú„‰+*4n3Ý}îºE±A¹â¦<•¼šК„¡¬põ‘¶³e£\jlÅ­çR.~5N&òŠh©¿­ýQª^#F=Úºüke+}’Ë4½oMá2'šUÎhŸº2§°9Ú·pÿ7ñü¢˜Ewi÷´—­¾›Zž¶¼õj¨+{^üaºÊ1IhMjñ÷âáêß›J¥žVÔß‹ˆ¨m­=Tqûé³51¶Ù—>'U–»ï+2ÎüYJcîÿv¨âY‹Û—o5F#?O™ôÃë„‚ªÞתé.-1·®¤W4¹ïóž«7ÎÛ NÝ$³àŒþ¬o§²¬üîaôÝøôc[VÞc¹e¬é&ï¬w*—¢S³«AãÇ´UãMÞÉÓ˜z ƒ ²&ä½F ¦ø û£¥^³ÂÏè¼Ä])ŠO)Z¡MbRÕŒ23eö§ £^M¹ÌØr©Æ“ñB¹u2c‰h2“Š Û³€u÷”afCøaٚܡ§ ä•ëbýý3½“ÇÖà䤷ÚÙgMÌ©¼õú©ÓŸ ­nNÎÃo¤ MÉ“¸}|áÈËNÖç×âr‰ëE¡†Î­×ÄX³V5^Ž=öC£Jšeµ²‘`º”?=p-b7lùŽ'¸ª£ïr6ùʸGg…ž7øh³A~–KÔö¥{Nk¿1M”hóBÑüÉ’s»E“Pô©•QZeùD¥—Lë…+>¥Þ\ˆž·aýß,i¢š ß™þnKÅæo«rð¬þáŒòÙ˜*˜ÜäºÝôàÒ “ßçzš*áÆW¾•°ýíU¤ k‹’ÜvGUöíæ²± Ô=範õ+¦ ?»#L’¡ªAûªc¸¯lû7æø–1–_)G¥Ði­ ­ýÆ/)Âï¥:4&H©ží¸FýÃHdž·ÑPåÐ ò Ÿur}òçøÃÖÇË'`et7È_Q†ÏÐxꢑ[³ßãØ£ÒG®¬¼Ú™yà›2ž›ï’Ý첨\›]ÑúRÛNRê8¢"îygè™Ï>.߬·J9iËòdȆWrÕ±va§•Þ9j\>³Êšsro뚺—×,‚¾¿š¯úuZð·Óóp;2×g-¿ 7+Ý>j¡<Ö@VáE¨Ë÷(WçT(µbEI}à ·ÜÙǽ"âËÖ9¹VŽòªÛ<¿}n€eKʱ_1¯p ð¡Ïd¯ÕÒŒˆ¿Þà<²éÕ‹JñCÓ3­Ë˜o‰W Z²MÊ«‚ª¼1=\UÖëâö) ¤ÈůMP‘oᦥiQSuÜõÒïïz‚p=õ(©ÒyeV»XÖÍŒÞZMo~âòç”z½§Ù.ÝW(ã^½?V'•‰Í`ЧI6i"½oŸoÝ”_ï=y=ÖÖ6 ˜ó{_ÁÜÙ ¥9Maòd³¥õ;rîåEºÛJ•ãwI²f‘Ȇá[V±N‰mŸ†÷£oÔ‡}Ï´Nµ ~þÆzùâ)³;ó_‰ÙJ­e­%£ï’«Ú*+/{±!­"îª^1Ó8Ê*h«}ËÊM¶¬!¢>W׸óÜòFŠÜò›÷ýV®¸¿dâÅÑ^Ïå'jú3UÞŒØä˜<̹È5S.GVNQz²O*ó­È+¦Å­ÅC)oM1J;@º6·æ¢c#U«ÔRxík«ÂvEIì„ò£“n]²ø°"òEºMƒt@²©—¼RšwÈfÛÆ›2Qª%Ê{v;¿w-b½–Å;JÖË¢%^7-+ç˜Z'æ41·»8µZëê£IjW[œæž<=9ÕiÑá_ß½½lvl¼  ±Ì˜œ’ tN…ÒÕd›÷jÊ@ï®ËN$x=Z¨Ã¨¼l;uÅó*+ ‰›½på4¦Ùéûr°Ý¦†6QVÚŒÊÛ×s*éξ꠸ësÌîFšF¾pÌ‘]×fLP±Ï™A.õ¯”d˜Ò.•}uãzòM‹Ë'xdÊ3n…²Ì/œ3–µ'W'¥>ù(õþ 7fÞœJfÓ¶Ô©fVKö´¦ƒ7ÏŠG¡wgŸ%Ž]ã´Jñ„áâe;inñÆÌ`§ÓÊeŠ52«Ö“›nÄ„—2Õ¦™{NFAøL‘JÅ’ž¾Ä0懊zyÉü´¸ŒLq6*ÎcÅ”û­RYRY£CO=¸Âl^ÅXKtnÉ3+z;–¾—^é$2áâá†íÚÌõ™§0j7ÖY²í€íSü±ÛW&U©¨åã¾”èЦÂU¬õǯÚÓU¥ C d'¤H{Œu­ˆv³‹ö†ÐËÅFº˜zA†náñ³ª;ù"¨´I§)‰ÌWLê±nôß–…yžwh†—ûË]~—˜Ï73Âl=œÌ¶'‰,i’‰žýè€a²ÎUéškª†Æd¥äyoMKcîm»ˆ6Üèä ¢HŽ×[³ÄSu¨Q“¢ŸJ®‰o`UY²N\—Ü`±ÄµÉOls|v½²×+“»UÖ‘ ù¶Êk¤*¹¬[±eš×‰‘CŒWl}”½wļËþG4½'³VÆÍðc(Çå~úbj{EnØÜS%“L&™ÊÄhµÆžÞòÄù ÞÓ è°–W†$™¦eì?º&7aËâ;¸é¦Ïcö|DW„,žñ’Y¾™Qí+.¶K ={ä¦7FÃjz|wΤ+ Õ9"¶fN‹†È䜖ûþÖZ,{•$Óº9$zu³4ò§ˆÆv}VòÈw&‰¹¨=ï`c>=6…å¾ÔÜ„tlövµ¥êÆ¥V›’}kŒ.Z&¦ó9x#eߺáCRl´‚¦T|þZa`ígácÂVZ뺱ˆÍZ¶ ÀkYs5Ö:¤QÔ‰úíeÃkLeuÎhP™ ¯ï‚¼\_†þ‡µüR¼ÿ´ƒŽUS¤ŽÍÚžyYsElJ…~eÃQ”â™ÒæïS‰šÈ‚ݤG†P3 r.ÅJS.mû¢:né[¹äÂÖŸs …)ÅoӚ̵j¬ µÓ9¨=°—š|Ù¹Iq´òt#YçiÖž#·mÀ§›‰éðÑrÞ÷]™òø_‚u±ÏV6Žb™ÊD}x¿Yá^ÍèµWî™ÿ^VPQ8‰,±N<@Ô$1 ‡xrü<^‚¸O:ÈGgãš$›ËÇ{–¿$‰¿ðfƒš×½ô‰%—-åšÈçgû1#ãã?]¨ a`½¢ŽïÈ÷£NµÅ²ÖÄ|uz{Í>ƒi$Vc`äò˜%Z3HÿìÔñžlä>4ÌM®ˆ·f Aâ6|ù1Ï-kr©.åR‚÷ž1cLÐH]CÕVÛªàꉣkEËPYß·?Zò¬|öhÙµ’ŠFSXMøóÆ®®æ™{ø³ÜÆŽ¼Sáßý‚,ú³R%OÝ<%}ÆqÝ®-Êk !¹OÖcð•9ÇôùÇFd§=ÌmK'pºCr}ž8t‹L¬ðkˆOe@r}Ž£¥NÃ…¤W_?½‰ÙNÆ®5«v« ·Ÿ1S¤‘¶>ØX{OÕÒ©C¨Àñ0ùy#¬~9äpA¾4K§ýÂPýSR}ZäîcjÖ×ofÔn#®ž&âUÿÎõÈjò¹¢-ÃÓ$Å®~®¯4ŸeYx´|C>5Ïô>Ò°&Ol]¾¥ì!òzžBöz]Öw×Rý´£ÿ mª|î:WþÉâƒÆÇæ«g Öp)þ°^ž©´÷m'Ûæ ÈÆõÛ«m’pâEï÷¦ù]­^ ÁMÒ-6®^‹ùVîË ]&»0Mq)rLÍÝæÕ²%Žkò_<=^›ñ¼1îݲãŠã¡mΨ$iâ‹5ˆÚ6»ã÷0‚k²l¿h2/M¬5ÿ£¨1ÆCQÖ º"W9ú$eøÅÉ^Ù%dfûß H²ùxl§ØÃM'DwTÈgßVËÊuƒ<5~ʬGøÜÔ85fúˆÕ9bÒŠ0,+kÃЈüØ9¢ ÑK­×Sb3D“%kRF´ÏWΜžxUÿÃüh™[›FOh(³a1&*ºLýç³¾f˜únù9q’³uÖ:å;ù ÷š¥s#Œyë+ÕVõQ8ËýY²L™«I•×W\ðeTRl}¯ ú1FñAè§ùxß[3Uªeo E6«F6<ªÞ©øiæŒòÆ+W|$,?ãX­±*$?ÁبJùmpë™s‘£¯êm/lŽ»WX[‹dœ_T[±Ò?;:ëË£Œ8Å‘š.dSÜó’À쪄‰%w ¶D§Éi³ÖŽâü£<æMÞ¦x¯~Ü»hùèUZŠ/çËMW–ng÷9žµâãèï¡Ù SBâ>Üj²Èw™C”°³AòóêîÛE zïêê¦mýxóØxɦÀcd]ÔqDâ’í2ÿ€]ûqp“µšiõ,Óù„y‡†|5ÓϼõêÛ§g¼µ2ªÆrgÊ£[%ðOã ;4³¼ ÕÂâ+“V¬¶5lØ„ÏÍUµÚZ÷ž^iŽÃëÞ±¨I·¸ìò*ývá;æZ·r•y—ПÿÌ‚½ø&áÚô“¨EFË›<ôX¯†7{SV}Z.±ŽXjé ÙhYå­R“IºÝî©ÙˆÌæ­»J™ÎÃíGf’¥îû¥=J1-m”3UË^û°®NóÓ¸µw̲¦äl>jjíg†®4hMõ¸˜*ùbêýL3ëf¥=î0™+¡I¯Þlª3.õ ™rÖüÀž-EñáRÇëLeYY\.ΚU´+ü™›s”Ìq¼§»U¥½õöƒ•c‚¿KO’ÉÙ÷Ã?¨F&ã¾ëFR)}á–;'¤&4Tú²Üƒcͤ>-ùòðšt²¤×Añ,æË¤iWÍ®N­w¾°Î\2•a({q|èÎ]ÌVre@J½ç¢-vÃ%†ÚžÇ])ÓdÆ©_tH«ŸwKDd”x€¥CŸ>£wh]ëkà “jíI ‰®1óÄkÔ›‹Ô¶—2C^%#Vë0³U Z^f˜VÏ™trEn›:+”6=7µÞ6*¦ðÓñIŒ°‡ŒO³Ë”X¡¥kä dP³Ÿ\‰*F¥Öo;¬fëKJzÖ4†üb4uC„ñÒ'šùeZJ”ñ5ψ‰K=ª]WÚW3µoj 8„U}ÔÅßç½C²úÁû/kzZGL˜ëß\×k´IªW÷þq¦ ÜiF­ÆìTœs®ØTƒÌ˜¦¸š…5 ³œƒ²ÄsNÝ6šä½‹é_aŸ€‹“À$Eæ²¾F¾íe½gÕÄ”›û©¸Ú _û­°\‡ ý#¸ZóÒ££›>g$mÙv^{lrë– Ã¥"‡—:­‹·ãk [šÙÊLNÜxëÈ¡{ݸ éÇp¢U-2˜­3ÑK7ÜÝB´¯pÓ®E™·Qq½±rþP#sþe륯îÈÇ_õ³±Û–l/_4kïÜ–C+”®Ëœ>ýmÿzI®UàN¬O:n‘ƒ‚ÊMâÕÈä"G ù½UºÓä£-°s'»±Ê¡×Å,hêÍ·Ô[HŸƒå<¢. Y޲Ý^2”•j“2âÓÝÑMãÔŒ¨¡¹ÁgWš]{:äóhŲɥÔ¡HåýŽYWg•Ûø™1/ïEÀÅôtæy»Åp–baBñ›.Eßöí¬¢º¸ãv줖¿¼Ü Ûáu1ìì ü™y3\r“cW¯OL’ûQ÷ØÓó™·11Á¡«6:xÙ.HwI®nÀÍ·-~(?žuwÑþzùh sì޺׶©?µ“ŠâS”Š‚×ï»yÛÀW•þn¹]X˜ŽÊY)n–N´ÝùT¢§'WšÏm€^3»þnãŽuþ[H½šŽ;ÏÝ­·7öÝU]ÖDZۼyúßc,îEË,‰g0+.<2ԹܴÅÈ@%µÉçmtK¸ÓLÊñX8´Ÿç6ûó ÕàqªËX¥Å—.D{EK2ÔræÍ›œf2ÜX-”,jZš=[ÙQ"ƒ{Œ+O|a·|¥‚h®µÚÉvÑŒ’i‡,Ù¤…÷ˆgf<¿ïr¢æÀBIçXë µ ¥øý¶ð*«òÏ*íV½1N}±]~Dþ¾ Q [w1­›®ˆ„j?TEâm×^3eÕ8/~?¦‘®jRm$5Î1ÆHBÃÛ60W/—zÃÌç|j½¼÷[³)iËb’­Çû×êWPÿä•Ï»l[Ÿ}pÉ; l&'2[/ŸDÚ.ˆÇ5G0‰ç˜åãkÅkmÏÛë2·ª<%ž5‰¡W³2õB‰ÓMù#3¾ÖžÉ‰>zó¸Ì¨ƒµÿLf”ÙÝrW½BcÉžÅF¯[/s'*¿ÜæÀÒJß™çµnž÷¶·;;„%S¸1g«ã]°fÕ¶÷ëSr³ôíãϨ„Ü\jYÉ4Nü©0"G-uáíuñ—+†”;lÒÒ+>šc¿ š¿õä®–š½ùdÎß `6ß "ýò²ë”u›·{ú4¯ŒÝ5‘¹IßSÜöµ¿A'èÍž$Sµ²‰ó.‡ßBˆ%šªλ6 ý؈^¸Vî{ù¢„©t‹k!#Ñ•!ñC#g–Ý/HP¿)'}EQ£²˜–è™(¿¶ÌUË›So•6¿Æ2_1ýU´«üDóõº¦‚¦¦øøÚŠ`šÛ‰ ‹¥A•¥ÁS‚ÜY¸dHi,Ò+sÑùö~[’ûé“›µö\¿¦Ë¢¤S”‚>$.wü˜^ý¡øöüˆ+'¾vžÎ¬BÅæg–Ýz ¼ë?WêØÄ=Õ{¹tåBYêÃSû•¨F]ØÓÐ:_[[{ä3µŠ&Qž3\4Jª Æ?S½í~ÚÐË ‹¼¦76-ÑZvk÷åPÖËÉ3L¸’1>f§òÅpE&ùc†¥qf‹2¬UÕ­¢l4ãÀ»G›Ödž8VtÖåñí/ubâËî/Ñ5.’)³YÙtèeáÆÚëCÍ$ÆÉ8>²Þ9~i“ÎŽýø“#¶',ÉŽ^ÒØôñ¶žRöió7:!¬Šg™ù{*å0/¹ú”ðªÓ—<íjP3Ì¢i[/]ƒ<ºi‰ø¼ Ä%!KJ’¥-–ë&;ÿ°î©m–¬ w¦õg­¡FÕW"’P“'~­Ã%Ô2†­Ï¿-µPÜË­¾åk2겓}| Žµ©TM㪠ÈmR±ˆFºmófFöc&Šêê£]#wÂ7`GÕÆ|½ŒwfÕ/‹¦œ‘q8t2¥>xä1óDýj©J‰cðÝã¾-˜ƒSW´ÕÇ!‘ÒXÉ—}FÀN ÈÃæß¯úrC"¹Þ7îá+ŸqÒ;Pù ÇgŒ«MîªÝ¬R­¹yÞ·U‚ðzsB}BzÔÒÝfQZöe¾M›Yb¬Äðê‘,ý¥Æ Ó+B/ɰþI‰dºæˆŸ8> ¹F.8=óþ”5$æ&‘-Ö;Ë!÷,¯Ÿš.n;£érµRu«UBDÛvüa„ïLæƒÅ÷"er¦È •'2ÏÉ–An‡Oa´Æ¥T¦*yÝ-›»k(ë]ØÒD}kÖI¼Þ–XJ¬öÚø#*Ô±^GϾ+ž©ç¬ ùiÑž.ŽÜedëæ‘åÄÙ{ßûû3w=Ü«½1þð«ÝïWæ&Ø™~žA²M?ü¬I¿bJ“4CñÑhјé1JÞœR—K6=Lö®>\ü|Dh“ŠE¥ñµ§D½È`Ú¸Ô¢@æËKi˦A)çÉYW®{&c¾¹å©¯ž©õèɱö­TEg¾o‰‰/I®<¨ÆâìîqÄæÙž”Ø[úÖB¦Ö¨ˆüy¢ •Ÿâ‘“j§ÕÌ–°O\g´4-üÈŽJÌ]ÆèV£¾Ïzþ£Šœ/Ž|âvþóÁb+ðh¦@j)ðœÿÕ$ –ûŸ(˜¦ðþŸ €÷ü7r°ð‰ò_ À«ÿ®ƒ…ÿ(˜ðþ¯@€WÿQƒ…ÿÂú/^ýw,üGÁ„õ_¼ú?ˆê? ù/àç7¥ ¾ö5^7?¿~~iƒ_ÜÿFAÑpný˜ÿÊžÿ ïÿýyø÷Öሥ: •ìÂ/;ö%v_7a a ˜¿Z¦Á~mïIb—n´Uð‡´aÂμÉyÒÖÄ“àK„ØCk®+MW¬Ò$J7‰ð=f\5à Ôc:|Îsp\êŽ,Ÿ3ðD@ŸÉ@¬©4’º:»ÚŒØ\?à˜œ•[$Ai9ƒJ×î;M "”Ømµ 5žDáÝ­hk]ƒÝ'›ýíªADÂzsm½£ÑÎÑ®ADC»»hß=œÇ=uÎf‡E[×D’ f_· ˆàçÉ©žÅS xw®`‘I4Ý.éZ –„_L¸™:gm…®Ò‡àPÏ]ã´¥³¼¶!!6øs[žÜ_¼ &§‘ý+Šñ÷$€&L‘º#e€A4VÎλ¡ŠÒì@ª»ö%sëuŠÔk?0$˜ D×TÅ {í¦; éµy4\ª‰UEh‚¹=P:| ¨³t‚+`v:ñÉD¡øˆDÀÀt|÷÷#¸µ}_ƒ8@ Î@i°›-[MŠk)ضѦkÌþà&Iþn4²hØûÓôcሠ€tݹDàŸ«®ƒî LDæj¸‚Öü3Q× ˜¾@‘èÁ$ D‰ÂV{VÃ(tªxÈ~¬Ïž@ªsT©Iݘtèþêlµ÷ kC€>A&)Ý"ç¼ ˜;Muè/^3\ï;`èNïØƒ¥ÆühTÀžø@€D2XlÇ•΀ȾìòdžT?ð@‡é@2…q%6ÀAQ…¿„,²°7Ÿ¿Ðb`ãYd`gg`cï¨ ü 'ðÌÄn‡ìãG!ÍhÀ<“V:³6±32~o`haeaï$ÄÔÂÞÆdÁˆé|;ˆg`goa´ÐÊÀ˜»Úáæ/0Q‡Ø·—G¤‰Ø< f °4þ@ ÀLÂ1\`ÌIšÝþH²€Db£cDõ $GV‰l¬Ùç¦ÖgÁ%X› ”``Ø”¶ÖÀ×»æã¯>ÀéºÑZšHaºn!üïÀ»þG,ë?(˜0ÿ·@€wýgÕÿò_ ÀËÿATÿ[˜ÿ] ÀkÿI;ÿ3 C°í?T¨ÿ~þ“}=I42g/ àñ˜ÿ!ïs;übý¿sþg€ÿp€ÿ($ .\ÿÀˆM7늆k’H´& ­IÄIX,…ºÿ6~Bø³Ðýÿí¼Ïíð+ý‡j"øì? ¸ ¡þ ºËÿŒÑ Â`]—ÒŒÉ>d{’?“B«Š@QpU8BÈÿ‹á×úÿûyÛáúÕ„#øý?J˜ÿ]0Ð5ÿ¯Hðo6;ÿïÃÏ™êÀÿɵåÿÝ¿ÿÙ³gåååõôôðxüãÇÃÂÂDØi¿ÅÙ>áMû;$¼êg¾é]¥%uþ‘e?×Z¤z´®v³ðú°ØYæô¢õÞ©Äæ%ÎfòªucYŒ×V|ÙòéÀÈñJëÎéê*oÅ…G§-??Ë+“qþœ±çÈöBJäɃÓÉ_GC”/ý(ÒüDÖU0‘О÷3Fâ­œwP^}ËÆ¥·ê|kª‘á¤*«U4 |ÅÜ’–ÏÑ&ʾïÆ]]¼+ûÔ5­}ׯÌ?þðܨ+xØ…ºç‡((¿ºK¶SYAu3ÙüJÜÑ<ôHÅ“9úãc¾1}õÜõà~bú¹E…+)G§×Þ º6û ­É¢†µûOßÜ¡,v±¨Ñ.·ÖñÈщ¤â’ÛwǸé]ñ†µ\C½tñ¨aŽ{}iWU7_[,)±PCÕðv”áä \3§Ì”*™2Lqþå; ÇM¥cÎæF.~C;“ú!‘¸n*Zõ¼Â›Ùe(RæZʇ F„±«sÞ¹•kbZ‹k¢•7þH¨r8 pN)§Â{}]üóôƒ›UFÌiE ÐIrÕ™š[~`ü°U’þÁç$‹å†Òm.œNÈšïú·Š½zór‰Ù_D_}€X§‰›&€2!‹Bð+û\ü‡D@ÑÀ59ñBhÿ$”»+F“Ç"P4抅P”;‰‚iº»¢°?!üYèƒþ þCñë? ‰ê¿  ‡ø€ìÿ™øÒÉô ÞVD F€haø¯†_ë¿â?¬‹þ£…ç¿ÝÄ'EÚã¿71˜ÈoÇÚã?ÿ5š“Gú]«~s±”™lFtNÚý{q;Nß!ݲæ#l󏯕t§/Ûe±/7PçÙ“—O÷ï—‚ÒbŸø¦Úßþ=ÑLÕ³kù,Û¸æG"ouù§qSµ¤Å£-h¹7šÑ³ÍÅwX©(Z+?wíÖ;¢cuRÉC¯ëC7,¯{33˜nèfŠ%Û«/ßA"_³ž·÷²ufð£'ˆMºç^-\^p .4xE•zx–Û»½—/TmJQ(uÝ[%ûÚàŠæzÌ-òÓ5KZ ¯¿½{+ö©ÖèÜDåÍ'ÓjŽŒ-wyã9#u~pŠ·t™ã“ Õjên «—ÖÎ.M%ï_0iBÓ²Ug N-™e¢N¾6,*nÔ%ªÏLs#o*áéÂa[ÎÝï°)\*vi¦Cºïkt“Hˆâ#ï–Ûå”§¸è‚OJU‘XmòŠ0ûÎ søó‚›·æ™Ð&Ÿ2„ãëšdµÆ4¹;Í{°Írw¨y³Ó4Ýç /=OÄ$”–>yÚü~¸‘Ù|O/Ô ïÆSF|5öìåƒ#›–ÝÚ8´„°ŒŠO ÃH»4)}:³\Cëá‹ØŸÅF9Ia닟=¤µFýMísñ‚çá¤Éê1'@IF…ÿEàµÿîwÿn?Á…çüüﮪ!žH øÎ§÷§Þý?Àk$‚{ÿ <‡ÁPPaý_À¿ïþW.A±T÷„,`K%û®ðê—ðê×߸úÅ/“ì›^s ]/A¹öj`Ûº5£BèTö!sÀ:3|€ا˩îÀÛŽ¶³ïbu9wÁü) t~4R7m¿«Aa›_ÎamöGˆÏ3¬ã ™ëïGðmo hØFu#ùûSi º3ÈîùÜ!x¼É"ü k¼…ƒ‰ý|;G<0ó7À›ãñs5À÷uùz€s{€÷ÖCÛÛ½á @ö%ý.ˆ>àÀ÷6’û6’Ÿ~(î3oËÞ¤ @*¨  ØÍ·­iÞ߀· |=(dà@ŒÚÂךۺw>µ]SX@0÷#«{*t?& ·= $”ï!–ûË7`¸fÇ3¸&ÿ3® Á¡ý&;c»¹çÊ(¼WíƒuP‡kÀëu|׋`D8¶“òÒˆ4®Â¶›àœ{zÝSΕ{x¯r?ƒäK$»wßWnáý—[8WnáÈd“s ÒN¹_áÞÍAj'ÏÖõˆ€6^\£øDÑFµ^1AjѨ®˜X´›XS2‰Òîߨm²}AoèËøûÓkÏ?`£Â§Ü.›Ý£êG#ª W-¾6¸DE À6ØêoA¤±{µ‡@|ðîà'>^ ¸v_ã{Ì5L/˜1\)d·ã–ÝÄÀyAóWtž¥Â7Z$×x!5Œ ?CØÜ€tÁkB‘О @¦ÑJ‡O¨a–vUiʵÎHXW B"T¡gàlF"ØŠÔW±ioâK§Y¤H\l>²tùÓÛíKH·ØºS¨ º4Á%´i«:»7 ¢6¿‹F¢˜¬YQý'k‡HQÕÒ@lñOl¿+e1LY$‡²˜Þ( F¤ º®TêÀ«4н…¿ÞÎ÷¥ý jÎêÓ€T:¨ÞŽKWÊs=ÛÕ’  Ì›1(h;cø ´ÁÇO{ ;c5‚? ýØ.Cqm/ªÛ‹âNAQð¾;ÁÊ'0Y@¢w¥onÅ1¡z™1õydT2qÀGc†gX½¶êüÛµU«n“XqRpä“tQéin *tÛ°ø È PHH(ÿSîdÅ?CGqgŒ(4ß3t_œ=¸2ÒMÑAB‰À¼£2yïG§=>ïnêŽæÒÍ¿6€æRÝÓÚ@¯sz4wöÆt2P 2æ€%Ñì!ðÁƒyEðžì?ò1Í5«hláN81Ð_͈ D,†CE7оÉù¦ÄèY)À´KÛfÍüùðÄp­Þ>ÚŽ9[ÛKx2ƒáš ¢ëð¸üÁô÷½`¸<Ä ~Ež> YÏñB»œÍêbò0\½Ã ŠIwbÇNcÓE®¼b0îï ®lb°íôcä=;Cç –?b5»  Hë×é`amó“tú‡É‹s:.u°Ën‚쀺•öX‹è7aÛ” ‘Nÿ°ùsNgêvî`ûHöc4œhÛGþy:q PÈĶè¸ßóé9s:¹“.éKØd9aÓ‹´õszÝ¿Îù£¿~Щï¡]g9ë1ÀÃr­=Ëg=¡š} ïú1r4Hv Õ΂ÈçÄ~áõ¯?nÛ”æ¥ `DÙ"ëÑ阩ÿÆŒkªÙÉ$kóQ²#*>öà†»ƒß²*üL†j¹½ÃùyŒà>Cð÷èFõál^jh@LɾDv>/Ì<ÖFmN0ØÝ^TÉm9p »¿\ÉŸ=Pâƒ×|‰Ý- l,ÝÆÚPM—´(0Àd%YÐ\² NPÿÛv˜÷×衚.®˜^qíóBHp,»1‰B¢“8Ư{±\{Šþ 9a=¬BñÄ<‹×E Qð‘?*€B¡Ü§ÐÞlž‰îI%rc‚¹;ŽÉtkð \#…±ý› FŒ&€!7#Ñ{ÜÁbO‚ÝÛ?ªòMõÜ9S3U~jp½Þƒâmˆí¤}I+è`cÝ-Ñv¯žP®«"þ }lÓÔó_oØqÝùg°Cr±3 ²è?†\«Eý Qlëç)ʵ»PôŸA Íc¯:áÆ/Ý]‘ãZ(¦«)àÚ8h—•8(ŒkF`š\Òîeñ’6Æ5´0(ÿ’6”{Ð øÈOy®QêýˆZÏGu Ü#fÐ>1ÓþÞv¼p€Æ¢´aÂX!tžóÿHÍA“ÿ!Ìÿ(àå?tðð)ä¿ €—ÿ°ÁÔÿ‚^þÃÿÑBþ xù4üÖÿ ðð:ˆê ë¿ xõÕÿò_ ÀËÿATÿYXÿU ÀkÿQýw!ÿ¼üDõ¿…ù?¼öÕÿò_ À«ÿ·þ †@k"`œú/Âõ??ÿ9çÊ,|Éôß«õÞ€ î%ÿ‰‚väÿAÂÁúH”¦0ÿ»@àß“ÿ‡-”#öýa­waŸ¿’ð§!³ý€Êà¡Õq ü¹(-à2BîHåC€Ð4DuΩ_×\çK'DÔ Ð쵚gÐmCYÁî†B´?af`Ê@sþ¨4øS_ð,…+]úǾ<áðbÊ=³<ë® ©-è$+’;@0_j à×~p€}ÎAÐö•Nõë¬h_7O*M¡íà¡íT/;8h㇖V[ØÔ$€%¿i@C³TØœãpŸƒiüìxqq¥ÒéTŸÎèt)LÝ­_e_²beËè,•N„éB"ÉßMÝPÀAL×< Cc¸&SÂæÈ§8´_ÅCrèß!9€èª?AscRÏ$ÿŸË¥÷f88vhÙ¾K®0ð˜;YçBl ÁâÑáÎÜiTv~1w*…B l¯r­5—Aa{ÒÞh ˜Zƒƒãæç×foÚpþÀ1™ì¦öF bXàÿQý_áù/ÿQý_aü/àÿÿjý_Þõ_!ÿ¼üÿËù¿;ó_xþK ÀÃÔ :ÿ+Ô/ÿÿòù_€ùšœúïH¸pÿG ÀÏÿ.×sìI+è† wwí·7z_ÿG!5èŽõÈ Öÿü{Öÿ»JᆀpCàonôU*{Ú!èþ}öªè"ÁÏh‹³‚.y±oœreßç­ð6&7Ó9˜•­—>w " Ú)Õ9¨x¼+»K¾*0ÜÔçì¹¶ù °cNr7vÇÝn_€¹ÃÝzs7ÂýŒ_ïgtO9-­ž¤J`;}˜ItÉ3Ç}þßù=®q7M8©¿@× ™Í)¡Ê5 œ$ tnþ+‚¯°\öŠÎsœÞÊÀÆ obcfe±ÀüïJ´w Д4¹3 ´œÃL"rò°q„K@²xÙ‚ñÉ¿£á\ÃÌûßX_Ä¥gÜÿ3ÿ 0¢ ‡ó»07Ä_â*œí¸ ´ÕÛdïr’}Áj;`ÞÐ6Caç™VZ"’Ü ˜ù ˆ‰ˆßa"Õ @º™ ¶3Áel[ŠÈ¿ª±À {D¹ß™,†íœÄt¼|oãº`øŠü¾‚i¦¬H¾tÏvF"{`$›Š ¡aìÿOrÑýãLäv5°üãGü%R¢3åIró6ðw#“»™ó ˜1´ãœ1qJÉ‘ œI•:;QR[IhÏþ:Ä´ý%sŠ ôDàÁ2©Pd3„í‚: %<c°ÀÈ‚—Gèÿ0<©ö ³ºLáÀúˆFkS2…;à¥+æÐ`æ_"+–­¯³è³…ž3pUÃ×è‘fS¥C($ß6âl:ƒBMdD¢Ý’cÎã ÙbÏË ì`EÏáúo­²´Ïltt:btM¾@ª‡åAvHBwåõìQÁñsGÓÙNþÏ÷²ñÑaà||ü4²?`n3à×ûrØ©ãº#Ø_ü1î|ý‘ÓfO"áú[;è<“·6¹pí´qÞ§©[|ØÃà[ê ¾=ø•ï쬛³K€‚ggêÌ=;°(“X[Õ¦¶¶{?Õù £XGÁ§öÆÛ¿vê¢C ù­f«|$ë\V ”œž»áiV'yífŽôáuP*ڛЅÌ%ùè¶ëðQ•[ŽÀ÷‹^¾»’Àkä yïä~£óvÙäë™ÂÙ¦ºwìçwî…Ëi "¥[¢rö@ù(JiÛÅ&‚-/ö&C=ù“ßÚòç™^·ûd·‡ü8s¿ÿ‡¾£ÿõ6ô—±à 5œþ½ÙLªo§Sb¾:Ž!¸ƒ]¸±içÏžÿO6í·Ž§ñ®Ð´5„ШuK¡UZ5ÞõD¡YûÓf õ?˜µöŹv»†Úµî $4lÿ¿ [×’…fŽßÌýVí·Žñ h7jPáŠf/†Ž—f‚·sÂ%Má’¦pIS¸¤ùÇ—4k×”çà_»CÑ:”ÞJg’A:5+ô'¿i¦…þ¤L…þä/øª¯ÐŸ´ßˆø­uîÝÈö Ý/¹øÿ—[ø®$þšDNÍ ]~½èò¯°•¿¸·;h£€RÚiÃiò4UØß1Uí-Û V8ëíeÖÛN-ÁÛ,á„÷ß8áýWØêþßw´æ[¸VÒŸµ’ßJÇÄwÿ¨}µ.ô½ø >¢A:5,t¿i•ÿ¸ÿ?ë%}¼&(t<ÿÇÓ‘¨_Žg_¤‚þƒyEÿSŽ Ì§Ñ£gZð×"šþ¯Âð­»´Å̃Ö1õ˜©­ïcÅv°°CŸ~ÏùrVÏt g×U!éòîœÿÞ·™Ù­7í¤Úý_ŠëwoJÆ×Ÿ áòôÔÝúéöÓ‡Ýôð›^z hu$–믧hwÔ˜GÝ}~¼ÿ¤¤S‹q¸½ÜýîÍ\÷¶õAdg>î~t»¢ÆÍÔ8hílÿz²|ízJ#¹˜€1 ;û4×™ È&A꣙°’Áþ}ª<0E~Ñ Vƒˆtë±n¡âîÚÿ“U‹±ZŒ°j±'ðÖƒ žúhaý?A/ÿ჆ÿÀÏ„üðò1xøò_ÀÃa°ðƒ ù/àÕä`á?)ä¿@€—ÿ¨ÁÃaýg¯ýw,üGÁ„üðòßmðð!ä¿ €×þ£ÿaûò_À«ÿÄAÀÿ6ýò_ À«ÿ˜AÀÿ6ýG ù/àÕÒ à›þ ù/àÕì à›þ ×ÿ¼úï>øß¦ÿBþ xøÖü‡ ÷ÿ¼ü‡þ ÷ÿ¼ü ûÿ0áþŸ—ÿƒaÿ&Üÿ ðò0ìÿÄû?þÃÑþ¿ÿ^ý ûÿmú/Üÿðêÿ Úÿò_ À«ÿƒáü‡pÿOÀ«ÿƒhÿ_ȯþ¢ýáþ@€—ÿƒhÿW¸þ+àµÿƒèü‡Pÿ¼üÿ«ûÿ( E!…çÿ üüçÞŸ¯÷â1žx<‘ä‡Ç“}Ý(ê>Äßb È`‡ßÝóÑ™ÿÀs˜& ð_s Ûü?ç?…B¹¹¹’®îp4Ü G»‘H†Õ$±XÒ߯Oú§ÿ¿ßéãWúC"xí? ª)ÔÁ€+ÁŸæ—!ÑH41ÉQ$Â5ˆL'I R}d_@Ø  U18ª GtzÅÚExÚ“.@à(¬*A`¡ª(ÍöwˆDwb7Ýt¼Þ‚jb®0ª€x“üè—þûùzüN¿Ð¸&ÕEÿÁù¿PÿÿÌ80~ÿÜ ÝŽ8Ù{ù—k{6¸§ ê¾iõæô‹é¹“«tŸÕ®ËÌ{ÿé¼ðËgËn^üþ ֢ƕ”\z`SíÅO§lñ4Î_{ôƪׯ>ºtÓ¡á{F½ütßõóóΕ×ì:°aøV²ïƒnÖœ§_Z»uãòõ½gÕ}q‡®áÇÞ,+I?žôœªJú/m×e){S»í}JÝÈGŸ;ìì¶`Ñž3#åªL1–óì¹]%…ï.qžYqf¾¢~nÃüS½t쿟˜ðS¿Åc]Ôu߆nCô“p»~Ò^[¿íÀï¤d=¦k¬fçN}â¡Q?ϵKF ©Z³7K?óÎagëçþÖ¾w×1©ïLȪõ\êû‚£p‰vÚúþ…µï*=zšjËvÿôïon¼wU½!eË»íç×RߤÚ94¿¡‡}ê‹õX¬w®ÞRPŸuìó™å%îSþ÷“чwZxOj㜵˜Øéå·Óõßï»ížŠª7 7w)•Õ­”vqŸ° ú÷æ‰?ž81zïm[sf#nŒíP?nÇêC‡·n<°:·¦póñºOÕÇÔK.¶t]Ñðëóu»¿Jÿê‡ “Û«ø¹»gymI^ãáÏ=uÎ{þ2õ×o‹–óÜñ¢{ÅÊúu›F­z®F»½û—H†n\}Í_Ò ›÷h·y3¶§Î›5è¶YÛ_ùä}é%U;ÁM»­Oû×<šÚ}ðþÌ~íÄÒ6Þs¶í“ß¾·ðlJ×%ªo ÏÛ\©Ù®º®{Ýór6¯f?zé‹¿ÞÂí6Ê:ž8üî)¥oæ¾^úfÝøÅ)m®•}*i>óŸi7PÝË>ý/vÖôÆë;;ϯ(»£bVû®ƒ—m{µ¾×õÂÿÏíttz|ù+mú0ÇWJIs-ùVÇ|óŒ¬Ó³i:íö¥ßmNYqç¢3Öϕϻ©mÝw›RÿÑøÆŸÕ'«}ø•í (çËùÌ#ikæ§ý¯¼ÇrÕ¬¬½ÿTmî)sC¯v«=;¥†ü¶bðÞ¹[Så¬o{î½I•È·}×î©UY+d9÷Ì…EN9ÅÞÒ¾ãukeýt·¬è8{Ô)ù?åyã¾IÅ)P·šKŽ<\)õøéåÔg5»‘ªoS0°0å€ûúýÆ­d¸pö‰©¯—KÒ[*Jo[ÆêVÒýØÄœ–h¡‚1p.W©þZ Whý æà„%Öq.>·¼«¡(EµôÖ[Y¼ž»šd?6š(E4á9Áøë˜ÇGÐÏÈÿñH  CÁèÿ+2¨ÃÁáwÅ*#ØM«+Ÿ+7ÛðÒ'%Ž«‰4±éÍÅuF5¡† !Šô¼ÉÛ|¼šTgl‡‰›äsD‰Pá6Ûx`ÕO*µp6)¨@+páR€é3F³:ÐæB͹š(“ñ¤ „Ó…RÞ>³aÂTÚÍÆ?šµ0X EÁÛnˆš$’‰’]MœªˆÔq-hFøÃÕD…؆ àL_Ì þ A?'çJèØàTVš¼[oI씚ÚS#Î)ÿTˆI9†#‚oj™@Ýxe(›’P„!Áï=Ãô9Ž¿ìžÑʤgôß7ïÿ·¢ï¿%¿ÿ“¼ÿÛŠ¾ÿ–üþWBB0ÿ[Ï÷ß’÷¿‚õ+úþ[Rþ‚ùßzü¿%ïÿ%&ëÿVtÿ7yÿ+!!Xþ[Ñýß$ÿ‚ø¯iE÷“üOHæ+ºÿ›¼ÿ™ÌÿVtÿ7yÿ3!!˜ÿ¿ëý_ï÷ÿè¤ü'0ˆù/úþ£p²ÃûåÏ–Öåþ‡œfTþû*8ñ—+`4•¼ÿ‘ˆpõÜÿ@ÈDÀĸ4â M€6®@1þz­ÍÀ%¯…$¯…$òZH,ˆÄC8€’xogp.`â,λŒ÷>P Э T@G A¹ÓnÅWI\‚@òàBúg—¡ýç+v @ü®i¥F(Ïf ˆáv''“ÉP‚öÙø‡7ÄÓ¼½-|V…Å\&3õ®à³|Û娡â„Ýv> ŸviñK“©£tU•i¤˜À/H ƒU†p~ÄÛS—¡.Ä_±V¬+Ñy®HµãNt!| 0Y ¼õ9±i3Tƒ §Þa ƒ¶þè>ªTΩ Ùú¦!4‘ÆsòAçÀ­o9«ÞY¦²RãÝDG{äÞjÛgßMo… 4R&˜HïäôÁ$4dá_ï²—IT2úR87` !( #U°j©’RÁ?¥¿1Ч8­%£R,-¥å´TA)¢Ö)\Ή»PŠÄ·©JÔ¨ )M)¥J%µ5e ›îÍ*¤ 5%U³H®è¥C 2„}nÞliªáÛìRF®@ßfoª tà‡ÞÞ^MV¡’Rj9¬‚…, ¬Ž¯Èà[w‚¸Lö*¨2™ &¬*]P¢-ÕŠTö¾7Ÿ˜ó(¯ T£È–D~9 ú:zÌ„rµDž|ùÂÒ9úGø#PY…‰(„ª¨\ä2rU:4Q¥a¥4+UÒJ)K‡çc¶¨6 üW‰êÁ*v°ðva¬Î "­Š.]úù‹.áâc ƒ œÅâÐÑ}Iÿ»Ë¡7xß‘!ê 9 %üë@Im~¬À³M ÁnAV|—Å\¬€ç¬Ã¸rH!›½ b×w Ÿ’€Jï+o‡ŒŒÁñÍUœ­ÌÎóv«äJÄ} é4o ¸kÚMF „k‹œöJ3²‡\v+4‘|V`E„ØŠ­"‡c¾†˜E2ÄŠéØeXó3ôô´ùœˆ¨‚p’œ8 dy>þNòafjÆBû«ÌÒhÁטõ^›m„eÚ\7o‚3±ìÌ2d£ŸÚa°Ý`4Ç×plú¹§7ÞÞßã«pô]x-dv¹‚“ÙàäKÛT l/A³À:KŒ–°³B·N.£šÈ–Müà<è@b@<À8œv8ÆXÑõn£]f(s£™ Ù†d²;Ð`¢ç™Uf‹”qHû—»-RS‚Ѻ!#Fê@ná0:·¸8·P7& ¦„䄱\%'”c¶:,fXl•Þ 'Ú|5ÂúðÅyC`úÜà tcÐH6¨@W8°¤ Q rAQn±® oä°Üb8y/.Q2Pt>Åô6£¿ñP¥‹Ž3.X‡Ú—N Jò…œ¾((á8Üœ<»£A2¹FÜj=Ú¨CŠ A0@aû`·-ÞÒ°sN«Kv™Ž2ýUÉ££—#ˆ×ÿôªECl¼uD_ÿSQ*9í_ÿƒ†H9¥V%¿ÿ’˜põ¬ÿadÊL D0òЕ\ðK.ø%rÁÏ A¼ª'67áä ªPŸú ™š@=ë¶Bðë‰49 @S¹S_’B<9àú«Ïµ`E*Œ:ø´ŠS8´ƒÐ|ÅW,Ø{ Ëî”hÓÌå2åÀ˜‹›;ˆÒjE¥)HiŠh¥ysG«Ïˆ.sMÔ§$õ)c¨O”[Er«Ät¡I. œhnçä}KœáªT“bÕ¢*•^ MREv»ŽÀ¬`·r¨aáüÍAmÀUWAÓC¢…S@B®·U‚6%~÷%Ó Vuä„ÀÇÉ–4ZxVŒƒ(A@©¤@­(’`L©è@¿~ÖR,TY¢”J%L®HËK´fïë±µÔæ¶Š "@Qªb/ٲ⒬”tì%AÛ0LYKÊ,1$މÀ?‡» ZàÞJúçWQ-Æ"þþ .À––AÐÑ'6:9A @_QO\T.0ô^¼ôrÐW*°ÜÿŒ(íß-.–`K…°%©Š F¥Â• ª•„E –/b§Š@C… 1EM¸­s›n¹æÀ÷)qW˜[0Ìý¼ŠS_—Ÿ1Åœ¡‰ò ©–ò[Å}ï!ULÑŠPæÓ´2”“4Á°!Šeãà¥Bà%/ÑåÒfŠ»®!ׄv]-÷G«å˜ø-ä |œÞ{«W$)jÂa5J_5áŽZ!¢®Zu•˜ºjµº±è¤–V”k4 ²‡7^Œ?5Ñîj& XÍ LÓÔr‹½ 6µÜ×Ò>‚\€œ¯P„ÔJX¯ÖoUÍþ3ràhŒ¶qUz¨ Ãëé79@¿û„¤ûäoœ #6hÂ}FAZÐ ˆúÍqf” 8X9«Áõ êœÔ§f¤:‰ºb÷Õ†9 úÂ?o¥â>-ÁˆS†  ½­‘C_™ôÖzß8ÞVbÈð¨ú'$†|C=ç!0d˜À<=é9‘ †à“a}¹DB̰1Q÷Y2VØÌû0)ÓÓÇÁöò¢JY‚VŒ–`†U4'Ç»¶ k1ƒ×EÆXÂZVÌZ6õ¯Â Šõ©°–SÌY›ax™“ÄBÃþ±aÆ a¡Fd¡²…”‡d<Èãÿ?Ã9KiÑîjÄÜÕîj>uä¬9~ØÀÂÅ*FCX¨Qz1†X!NGx©óRCÄTC·DËÅTÕ)ÕHi¬huVŠ[O$XÈ[O¤Ty Á‚ Óv Ó'ýý|~}"0‚HÚ)¹*ð±YTÄj[Û6!)²$Ãe”\AÒŒ$Þr¡FÌ¥W’ôJq'T$NÕòqÑ6N\'MÊ¥ÅuªI\L` ¤’·ÛCHÉRh€Î¿lƒ!V%âN²¤NVÜI ‰Ó´°“áF}Š"°£äQ:š ñw½¤SRÐG(2Õз_3 î:EpJ‰ôE|RMX:1ZE L˜:ѬŠ"ЦTâ&xRM*±è+Š"¦üž"JCJ1âö$QͱŒ£… @ ĈÕ^Éõ „ƕÉ‚ U!uš,ñÂÇøèOÖwác(éÉr,|@Ü&Ó†–àR™&ç^èyqM¾hlýäZ,a¦¿”‚HÁ† ‚…¦YcU¸¥ JI¸ªôë Q•d­>^-@VX)eÐÀ‡°  ‹3¾+ê Dg(UðÐ.Q$J¿"¡¬‡ÂÇ0ÑD/(™pÆµà©Æàô/x¶Ôî†ÅØh?Ñî¼o\sÍïð ‹n¢.«ð|Ëû"БÕOJ%0<.ó"Ë¥ðQÌÂzUSV´xrɼ§Èj*| ÅŠŠ`E%CèxÂ`¤ÐH¨Ô2U`D½"h³¤I‘%Mо 'k ðQL`Âpú²1œ& §Ã0œ& §Å WÇÃp3\Ç^ˆoÙQS'l,úÖ¿[Ú"hÒs"®1Rd>†BM¡÷J'‚5A‰ZÕ,$D°¥Ð†º7‰¸*:uèî ¥&ðQ‹v_(&žÝ ÆÇîË寇†à## >È,| ÅY†¥˜ÈKja5SN ÷ (t¾ÃLd—bBU´î3¨Ð<€âEXŠ,ÂRLsVwjH0¸÷^¸)5Yº…⎗ij’§Ô‘U^ø*ud¡>ŠZé[DmVð5,ãŠoå š Ý'¢Úh~K«ykÏY!4#°dÅ+B¾EÙË.ãÊÓ,H’åÓló–¬0ÃÇfš·d5>6!åv§nþö®ªôý‹JiIµ’j3ÅÌœ¹«4H.¡1Z›Ü†Í$r/·(݈nˆTn?™9´¥ÜRQ,-Rífº(‘ ›k7dsù!éP±Õþ>ÿÏ¿ó©Î{æ¼—sžçyŸ÷yŸïsžÆ¦â·7Ð 6 +55¤:€ÝÖ8ê?²ÞZBÖB?òå {·qT$¤5VñsFÌeØŽCzÂq°'÷IOøû£ ]Å8ØŽ£ŽbÈÁmÒ£ `?Çà bëP_ß!Šéæá5‹^í°y‹êàdA{á0Cg@è(BàPØ‘V»°¡â ŸÜ=Ý„Kä;gî ¼ŽÇ§‹A©Œñ TG­ˆŒÙÑzÂÒDDˆ¸È%€]úÀ K?q›ß&"ñ³ô0~Hÿ= ÄtF ¿ÓÄPÿ£“vÌ9Ææ›7Û -A¡•4^ÕÀ®{¨8>ÕÀw¨8v»õê…ØG¼õÑ#îÃî­Ã}Œú]HžQ¶ÝC¿‹ì»ÃÁ2‹ñ» >=Ôùð°¿õÞ#î“àûC«ÉBhLEXPµ÷•¡wzÄõ›’ S¹ZÁX0.¬Âq4ä€Q 7&œìãË0p`Àøà𽟊#J}XLä‚ᨈžIÀøÛ ÀáìQD) )š¯Û ÀQòPñŽpp;@ú2x>C9é=<ÿÃQ=Œï¤÷ ýÇö0dÞ-²% c-Pùú°‘HŸàî?Z{‡#v…+ð Q8¨ Kuu¤pÀaö‰<‚n?9«á¬EƒH‘’ ‡áCEäkÂr÷6–þmè2¢8ž ¿ê<øØ£:00 ƒã•>‚ÊŒ¦æ†¨„è –òÈ0gO$x?'Ì7oõñù Ùgbe8~Ň—Û¯ñíÓû9¸múðW=(hÍáÁ2 #.yd\6#.e”`[xÍ¡“¡?®n^(;”‡£0oÊ–m¨az Žêœãð¡âÐ_ü !臊уƒóʧvŸop ?T9A`¨*¢‘aMHAÚóX3Q‹$V;ÊG¿\vtå¼[ ¥–kBwµ‡>dÿ‰XHZò·D,ÿw÷ó¿þçù¿ÉXÂ`þo·ÿÿï_9üɸç g³tØ2œäp3gü\2øÃù„=‹òúË…ùß¿åÿùú‘ÌáP±'{’“ƒ=ŽãH âñ$ ‡D²ì±Nÿëçûv|ÝcÜóßnË¸ÇøÄüjû÷õ?€#@?}›ÿÿÂaoçéøÂ|åR¬­(%a*#;Šh^c7aêªá¬F(f.& ðD †HÀ ·Âjrí‘ò3܆@ a(ÐnX˜Ó—B%·þŸs޹·-ID†Š£¢(X †J ·´×䨋æ†v.Î^ÛDž‘ŠÄÐ:‚ðd‘ñœFäí~÷ŒD,†@ÂCÏ©Øá6ÂìÅ¢™h…é½ll\Ü~†[ⱎˆ"R 3né¨ÉÁ‰fött…ŒsøÍH$ ‡G‘©d On…ƒh‚ÙÊÆ 2¡=7º¹pàa!’àq8 ÓHw@Õä‰"عºz»:8 Mrªh|©øá¦d¨©hÖlgWá˺yliHÁqdˆD ™€!ì{éz}í¼6rDHD"’1d’° C¦†Û}, 8ŠDÆc(8 D ,†B þ6Ó¿Ú1^ýíÂÆ=ÆÇõ?ÀØúŸôÍþûWŽ}t3i©¹Â¹%md¸Š!&&B['J@¿0ׯ‡Nhº K¿`ÀÀÀ`@L,--MAaKaaaBBÂÊ•+·oß^[[kcc£¨¨Õ˜®—² *Mðb˜1Åh÷œÄÄPbF«tX[·¨ôyH‰izóãß×Iµ¶1¿_lt=·B{v®õ´´˜v£e·+´ãjœÕÓOx`šXÔŸ¬®×·Ý=÷½Å¯§dô, C|Äë$_K‹w‹£öÐãœhØ[¿!µ¥ÇWé·•}'ÚfMÑ¥'6§ˆ³åxóhƒI vùЦ»¢ë©©¹ =Â?·ýúñP)V kD=ø¦3FóÒMœ=‰ºªÓ=šQsòY4m c¾"CEà¢L2Ã÷öí{z­¦¡¤aÏ›ŠðNŸí]TkíÂÇË&R猽¯æ•zõl ðZ×÷êÕ}¿7Ï^lnÞu´É@-‡™¢*XÌsz€ŽOK›]ö›X†µùq¶òý´ò¾gíå÷Žå„Íð°>Lc[Ïæ/Q¨Šý¥Õ°9d唜¹<îo Jõ2”—Wž“u/ûÉó¸esUÏÃN§fI÷6€%-BÀÈVº)/âp†q„¿¯4K޳]hný,:Ï÷.­cÁÓ@orï(w`è¦ ]‚½5.íØªlÍúG5ìI iÕÁsyEÁä*šÜ†Sü%•gêI@Ôˆ;UM@?íæçÄrcMÐ,fýdBœ²Á‰ŸÇ•½‘Ñ1†»åŠ'Š‹eëÆÄXpaÜæš¢LÒ§¸Æ!àÀH±u€þqq)Эã×Í¡[f¥¼ÉL¢ )sçŸÕ‰K†nýGØaÔáˆ;*z¬$PX#ªa.äÔw‚ºàJ4½Ó\ر‘•î$¬¸XX1CX1 ªh'¬8ªhª6TâyÔT0)“c5x7{‡K´`q6céÓ w㘛s+1^½^ÄŸÁHq$K VÍ¥L¶´Òû˱ù†ŸRÏTç–ã½#%ZzàâêbÚqˆa:9}%ëé 5ã#;ß”Xví¯®Sv®s:X …%ÿŽí’ðWO4?sV¸¾FOƒá½M¬pÖ“õÃc¢´bëvî!uû–™¹w‚jÜîé>{›•bÍŠ%—éy/2)S 8«ÆZJgízØ}Õ•~âŽ-·;ðì,VÚ«ƒáA“¿íש \*ó:>0C »¸øaÝë]ëoÌKWƒ¬“F‰Riýö¶Y}·)uÂ÷j.·÷Å£šœY Ë´èŸ3e?Ø¢qOƒípÚ¦þl袔{Ì,z|à®ZUWK›GaꚊÞt{C «r¿±³ñyž=«#š¯Õ¾c3ƒ88O™y^Pf®æk=” *‹ºS&©ãÎõ=*T±]S“'Ùïµí$#0¨¸ûpZsÞ´¹Ë©JÚþ\ü€’]üüw»ÎÛ·Žjî|jÃ…3U™þCR×LÚ«íJ1MW<›tßÜô“šŸ¼ n"˜Re%žÍ ŒL¹gUØ]ÖªisòiËkLï‹öÙúr¹,púwaØ´œÅ|É~T57L$¼Y·•æ©itéίw õë´ôÈÐl–wÙ‡ö5Ñz,u7©n–Ø~afõ•[¿RœÖiǺrÓÅ0±š!¶WÿpÖ¦àÀ‚ò ™gÜL c/Òó䋳iDÞ¢X®LVîY 6M°°ˆ öu]^K“£gÞ­vÀé‡ê’;-~ÍìGý’ÌùF-ß½êÏ‚ê*¯ØÄmSÅÖ=€.ØTîÑÕ¾Ë|ÿ’œÅ÷Ž™¦>ºª7IšècƒÆÇ¦ìŠ™P&ð#ÍZãUbKQ>ϲ.ÈÆ™°/¨pvÍ•9ý3!×0agÖ¥&ŸTÐh¤e”bß¿W¹[-Ÿ–}AI½§.4„»0—95Ó5?JBÐx¸Ê=¥Q-¾àöVüš™ñ;]/”¬q|ua°]îÉö®£añÍîyžeú Z3,×–Â]rëlLΖº¶M¯T2— {þú÷î‰Çœ)‰1Íñn™Û è‚‡Š’àÞWyL#2·ëlœxD𥿱4{h®ÖÂ=urÇ­0§©Á‚j]OùËÝ‘-ó32hÙ9·îé ÛÏhCKÖ¬;çSN¦74OiL^ÖQÊXy±¸æM¿Ùà¯Cf¶)Ïî>u‘”׆‰-Ú¶&MvS M?Ý+GžpÝ/J³f¿dv@DÅ“k1¯eeÕeâ &÷®]žU['“,5ÒÅv˜ô“ýÕ'lO×¼‡:¬DcʤXj°+¾rÿ~áov.¥1œèª7§8­+¦²ÓÛÈy;y4öë#SÑOx¬ûN·#ëyÝðáDr³e¯l0Uz<¯ãRÓ„„¸0ÞÍðÒárÅ‚ïäKõí·–$»¦h˨ª]SXrQÖ—é½ÁüÃs¦8ÆöEœï8v×HÕ+-õ$ü±_B±ü¼óô™¸>Û ÕGožüe¥õɃçóe“ç³÷\ìŽ0W#ìµð- K ;_tV¬­BþMg¥kàÀ‹6«½·ðÊÓåº&å׬uQ“ѹdãõ“ÞçgzçÀó õU§³¢¿Wœ˜e,wätzã“ó¼­8k'¨JkÉÒ–¨F«½ ?ðÊí,zouXEØ«=º  ¸n!!x6ýµì£âµ.%–k3;~ îÚßÜWáÛrš5¯ê/ð‹®9º©ÝS*<ªjÖŽ¡ù¯ŽÎ Q­§yg%·®¯rÊ>ïô2>Êm}­îÌüXÃD-]*;ôb³b·?÷ˆ•ßB©Ô¯³óÝÓÑöM ]K,ëwèÍzyÃðêò]ñU/ÖdÊ''Ÿo‰Î«~¨³ÈWÒ1}æ©ì‘‡ýΞ\Cü{MÎÌé©ä<=}ÏSs¿®¼¶_}€Y •<LdÛ¨=sQ:–½uYäþ=‡î—ÿ•Õ²ÖhÞ¾sšùÖË£®Öɨ߿ "Ázpš{¼9Wm[5Q¿ïˆíŸI.“}çüV+—ÄŒ˜Üú³¡‘ÚM—ŸQº–Gݯ“éëY¶Ø œ&=ðà΂™ì¤9¿Kú¬^ýrâñ$ö>z}ߕЫ±è²È}œ©©÷©Š‹5 ú&©ƒ¯ê f—ßcËï7ñözãûÛS‹™g¿ç5¥[¥· ”cšeh}]å×õ3C‰vÒ¶ Œ?Ì,£¶ü©ÕxM‚¯À0]—û*g–›\Ê ŠÌô¨š´˜ÑÀ¶ðNݘÄ;'Ë‹)J)¿lÓ4b¶ù¢(•µÊ¡½*»V_†Y[ž6Šj ÷l*ã6êG?ØX¦1flyè™óz×|[%ðRÏmR²tÐâ(åÛs$ìXžÉù¼Þ’zÆÜY*§£9¢1gwë¯H«v«´å󢎔†é÷XµHjlÕþ=e…VˆÑ…SXÔ*޹ªs]QiÞÅ9SÕbž$g1èò•[»Ë3ÃMHÒ¥:“ÒòU´K]¸uá }ë¢#l÷[ëBøK”«ÎµH69û(e•f ïf•<¨êõ™¹)tǽb»»Só›vèðg³ÑªNW“"´føS0?…û—JEG{:L«7\„s~Pj¿l`·ÿ\yVl“.V:Û¯–Sc‘‘@³¶e)½˜¼dÇӫ嵜Bº5ÞB ¯ßÉ×dTØ¥¤bÜ“PmG×*Vȸ¾Ê¼4‡]éáú{ÎÒŠw¦*ÖG2ÛŠó[´UVSfüòÔܺ*!­šÌþãåm)–#+Ðbƒõ9þ/è¥ôhó ¬y—wíÐ ZîŸËªÁ bÀèŸÜÑ)ZlK“ìûíM¹>íæ}ë4NØ tåtä&êz×zÐû­/TZƒM½‘—ók5zØß?Þë5ëiªS#È9 ‚ßß4ì½öÐ9}i„[Ð⥘vŸélËùXfÉ´—Ïoˆ üÉ<)?—€b>©°#¥ülä³+-ËÛ»Vñ,.a”4éʳyAÛ {VôÔæv?ÄÖvÜÔ~¤´þ²‘å72ñåËŸU6×<îë¯ôüÛÈ2a{Àöܤ>C±$¯õG¥¶›6f1K%ý¼¡%Ÿîô_öþ,Ь[†M˜0’Å„‚€ä&«HÎÐM’¡É9 ˆ MF‘%wIr•$ ™&7B“³„†¯ÃÌœ'œyÏÿ~sžï¿f_ŽRU;®µîµîµ«f³v‰$Ëc3FlÀ³Ê£¢zo™·ÞÂ9ƒNŠ7 ¬©à3”Ϊ– í™­öô.AN¡yòX¶·¼vúç0\š^eBOªªkk*§¿¹H£ `bc5î®eò<‚V3_§u½2C;<ÝE¶”e½ªã±mV¸åý…$]ºj!ýL›'áJ‚¼zÅ=Ì_g[àÕc´*í ª4×8µ2[š0g^É : Ç{Ê£t’öa§ihSžÝß°sß.sÝÞ™þÒ]Œ 2r:ȘºceïQV•N5ûuza:Ž5/jýà<´Ò ¶(gºá\¯Ç™62q—PµF´<˜ÕWbÆPºIëÁE¢-ÔôäQMÜýÈpl¬À¥‡ˆ&S†«  /ù¨~V*Hêëþ7tS‘®öàO·|EGÓz\¨kë·ZrÁõ Ø'>ÜQ á*—V- ¡7#æ¡ê4b˼Ä]GÿÒ%þ9.Þøîe¥Óì–~Ø)=ûÝÙ/ÓßÂr½äßJl¨¤íp£Y-®ãdT½h̲8…øè³„­Ƈ^]ïRéa&@c̽ám*øÝ +ÉìµCdš\²\9ªÂK¹[ç>EuÀ]!hÛÆJkÛuÜþôÊšŸ×5˜†»çÚÎÌu~ŸoTÞŒYªöÀ—­ÉI”‚e‘w ÛFPVíhL¦ÛƒDëÅ/Qª²´ ^W¥tËϯ“’¬&–z:¦®õŸÌ8Ø-ìȪköæ²r¥‚dJ•vF,%YÕj½*tè'B`YÁ»è½ö ‹ã„ÉuEkOçØöÊ.𥆻ÑW¬/MH i6‰57wšQB¤:6°ÛbüR¡åJ/$Muùs¨&]£- ¿*¿#ÆÿZè_·àëSª–«…Àª?î‡fº…§–ˆÕB¬yùw&”Їö_p­½‹‹j“eBÉlÄ…º–?'ÉB…4M/ Ú&0^˜<=˜[q„³°ÌMóèhïF+ˆô^±ˆ–‚fß.S ­d)ÓúŠ9—“¥Œš +½dAÌŸD^dº5l?l Ô`ɺûùß^Oýø†Ÿ¼î±ûÈój Š#€»ä~§—©Ÿ€ÞjÚÖjv*H–ëÕEïåÇŸædP·h–ÞùJRÞ12ã™Ï>.– š»þ†—¿}zìÐ%qƒ7¯ìë82Tò'BÃlëÚU² ´ïm>ÔËï¯ÄÞ2êÐY•ÄWâSÅ2ù֟dz¡OX6mîݧSu¦y{3zÏ£Jdƒ [øÂC©yaÔäðþm~­œ eQû÷H§è¹ÔÄÈpô]4·½ãÀÑIümcËôíÖsP¶n®ou§ÀhØ™ßêÓa‡|•6ô}€† òöxFJÄø³6åœ=m§wÆÈh67ò¬*»3 !?™­ÀÜÆ¥ jÆBʶ]õIRH*û}.æ#AÓaÌ@LùIàvÛMwè¡®ON À9OÐÁ²O)Þg!M×/†³œr¹{š€Kec4š?^†p6‹êtÎÂÄÞ:߬É"ÀÕ–r—³ž ŸZ¸­¢ ½p®•)‰9§(û$kwG¦Shy |äÙ]– ?ÅÁ:E«b'j¥a¹bÈ[‰Ê޹vDP4´uˆ-ûu<¿š9£×|ö"ñj&²m|Šîµã".Ž Rh˜Õ² D"æ^ .Žôs›Â\3aT5{ÿØ®è˜ö[³Š¢RË”Eë4 ¹rÉÅ|RAûs+¿b3©ßQ"«É®Z°¢¨éà#Ç׃͙´Ǧ†áŒRÑ{|h˦Çaipó7|bPK.‘ˆ±RX«ƒ\±F±bq —MêhŽ>´Éô,N­MÑg‰Þ1h¨4^:Sõ±ÒþE›ï[W+×½ÊͨaîÚ¸Â7nÂñ½ÖW 9z °39ŠÈ¡X:ôÔÕê[Þ'/‘Ü™µáÉ©ýž©Ð(†AJÞÝøÜ¤Î — zÜÎʦÙzUýÉf̈¶N'çLÉnJTjã’pÉjá+‹³ƒïáð¶Ó3ÝìŠv¦ÖÑ$•s4šEÃ,[<••Ž%›`@Ýsf©y²kÝφó¬–wV«‘(M  óô Ë]0o¿ƒžW#œÞR¦¬Áó€¬:¸l" ¦v{›Kû Ü3b§“KÝÄ^ä©P¹«”³5«ºÞ‰iªc“~n5¬ór=3¿#–'ÈB@›Ç „\W¿Dç oKßUH7k‹Ííi¿Â :‡ÞK.©\ÒI3Ë(qTɃ+{;b¡LéqÊÚé7hGG’rfÜdmpi󟷓ꟽV,îd*Æ…)£]ìÉáMïA€F˜šuK¶xT‹™±Ål,Fz¸:2(Éö›Vã[äðêPÀTòÇ:9Ü6Ô¢€m¹[¨šá*žYaƾ“,ÈU_ÖBt6Ñ'IƒpEÙZµ.n›X±®“:sJ\¡è«° ÏÌP¶t 4´pr5h4!N™Å \±=õÚ¨,b~‚ÉWÁÞÆíky¶@‰ 6bË^œkÔ VÌ>‰šÖsŒ³_g2f`9a¯Õ‚‹½óÅDdÀûÌ™ž ÊbÛx ¼FD¹Ãb&˜h‡(k¼A#—œw_¤Ë71< gi„¢á!Œn“…]ö|úûNœ<£„æsLg7Ï0*MéÍÚžxŒÜŸÄô‡…}"õc”[`£š%O‰’f‚³´xîÝC‹U)éAsz2ceâÅÐØ£°òU‚ ÎútaŒr­—û^UBœQ×®d]•5¡*Ôª¹u”˜ÈTë) ¸«åši—Í;Ñ2kuàÌ›`ožèéŽ]ò£ì0:K@ ðÈ›qæô9S:W ù1Q’’#8é!×.Ô=Æ)±µºm2í´†D a¡¸]{)=eeI3p–pÔc‡‰ˆ¹B€—/}¥Rwÿë™t7Ï"}÷ä³Ù:ÊSkt¢šSï+“º^bZÑãá Krä®'lJœ°ù[ÑIô]a¡Â€ž‰÷•Qœ†<ÁÛm©MVQûw‡ë.ÂÔ ÐÈ@8›øóŽÈ¬!Fú¬x¸qV$êÃ(&úMl‡ôƒ”!º3kVõ57óuÚn.°õ¾—>“ èÈrh÷=¢Áe#ËÏÅÀK”lœ­#cÕHZŒ€yüV°OÌk¥F‹9Ûeò¤÷xé}|KC…wP‰ª5^ýÅc6}‚m žÂi§[ΣCü³;;,Î#?¤¥Açò¿8£àSY¹ 7y/ãÍM²ßÊ£Idlç¯~ðå :Mkîü1Ø [µûw(ßÄ&Ü™1˜~¸ý)¥bùðMÀ2»Jr3¢™yŒ´«%¶wý‚=œt9èc6¥¨®"—Ðuª.UÚ_y®;×”¹„¸ˆÍB’j’ÏòÄ™)'=Ôò%‡^ê|пú!Fùœ ;Bñ²’K‘¿HŪ/àzHVq_öØæ/yuyJí v¢Ÿ4ØŸ"¿„„…|¡wx½ñØ~ã,`¨P$€m:©~ ”ÉVWòTÐV›yö2š$'ªÈ·uëÃ3é"Œ¤ íj! cÅ܇i#C/uo< ?Þ4MÚï‘ê'ÂÆ»Þpí!uÄùfcSì›PÇ:øÂ{—ßRâzÑ_Ž£O¸± Ò|ïÌ$¯k;¯Þ~¡@ÛÍpvoxà £5èŠÜl 7WB†£,æ«OáÇhSY³¸Ä1KKÇS¡˜órŠš†!ᾎ¦®?Åm]è Â9÷®L¿jÂn œês©.¥ÎÕ =8{BVþî,§Ê~å¶Åg(,QmôáøÛÊ0æüû0uýHõ#26@@—#0(L½^ˆNÂ뼩h]ògR4H°½Õ‚ S³•¹à…Q³žWQV\ètüËŽ(ì{Weál b ‚U˜‡'—]E$ó¼ZØ¢½3ö’©boÓ¥üÀa{rJ²DLÍïÓ¥ ‰T#Û“u<(F 0Ðë*šÎIŸjîÂFõ¨ Ïç:kV웕j/Z;%9ÏY,Œã†·xf)µÓ^YN² =yÓn(¯v!LÇáNGy99?!å¼ÇïƒdñX>H ¬¯Whݬ+ýfÁDÞÍ5«k]°Œ –ã‰k›|Í 2»óº¶þ¬¢d0{–OÛðÂd«Ä3„÷ŠK>ɱÇ?qXQDz%û•,Oï[ˆö`½ Ù!ï—ÊräÊšDPMö#obOï+ Mjœ]—¦{K¹Î¥Ãè .íÔ FíÌ@³êŠê¹tÀÎìuf‹”r pV.8c”uXâ^j&'Òü](Œ§´`…$0¡ÛKdsŒrÆ œh&-}¡\¶Æð6…$ì©$Í͑ۯ/£µ‡ÈjÕÌûU™¿i¬ü¬®H "Õi±‘éô†w„<•¨”¢œ–ÔšÔ‹Šã …™.±Ï¡—ÒNDÁ¯Gš½Jy´0jö}šÛïÅžªýözáåEC`£÷8xÌÔãVBô@1gûñWä­‰03@M‚¿•ÂbÞ“—OÀã `,‡£X]‡\$íEÍëØ¥HS£Õc-EÎ)=Z3$³Y䗑ƺ“'¹9e³Í—_3f¬ÍNÞ’‡ytò¬>–GªXžBoì½ìaˆe|áõPó«&ò¤S ³0ŠdfÃH¨Ï ¢û\ãOçR14sT°uƈ+ìè¡Û«¶71´Ä§ëqM‹ µHJo¸…’Qo¾À]Vä´#*F•¬‰íh‚ø`b†6û…tŽoä¡mWßÀý°)ß? âý|VªéóTÍJ‹ª•ç¡7V‚‚­±çsaÕh†£m²£‘F’•3¥toF¦jÉ|D¢ú|=š[µ^8±"c‰ç‹îJ~< x<¡ éƒiÁÞ0Ô«ëoøQÄeNµ¬Ì$HbhpÝ~¸›Ý ÈUbn?ÿ*Ê’y ©i —4“DŒ–¿W ]…jÂÞ/>+ŽöEEÆ´¿‚—Rx+r±]¦Mž?âšè˜¨Ø:’ '4웯ÀvNù0V—ÎVêßTöXQNå--Çuø jh¥Ö°º; ÎsáÚz öfd•§ºlöYð°j2ã#ÙÚk "жsæ¯ã ’¼Ðs>Øû’Çó㵡 ˜ÍB¸7C[ÆP÷Ô áQ%’x«[‘ëgaq &’ŽÈ3ñŠ Á±5£™Ðž¶G§#OZ\áΡP¢±¸k„oÂ̳AÝ̲¦>53(/d¦mª><‰¼ÕÀ@†]ÂWQv ¯@ù›- worùÓ¿;Û–Þ¬L¨¥dphÊòBQ9Rǩȇ=²S†Æô¶ï×q%¾¢áÌS]Ò@†ðQQ÷8†ÁigÎ>g$,ê•,~âeëÕëòÕ»¾RšdJ>ÞΞœ ‹åC'’ÝcÕDÓÖ ÞVÓ\ƤI¥t>Ú „çÇNqé´]`±ÙhR“ÐL–wXËØ|_¶=SLPΣ{)™ŽËk,Ý?Òtüyɦ˜ËDæ¼12ìt ªmùªŽƒÝ°¼=›r‘¤î]*Û7ÆGØ4ñ10£ˆ}¬ Kc¥~˸ñˆþzQ&/+ðì87×ÛKשf£,+Ÿ¼ÒÙdF RmÝHl.ÁÞ¥¢~¼nXUëI3ldv¿ø,uûj[}Ru­7+ý87_.­yìØdͶ‚ìÅ£†„É8ߊ귅P„ï@¨Š­œõäE—mµ¯"Åߌ¨’ú_DéE‘Ë1zùµ' n¤E}€¶…"›ö(Šuƒ+¡—f´{y>Íê%‘]ÆÉ’ÀKVŸ~…2±¶Âœ—ZéRI G‰½t kÏ·^€(ô>CëOŸ‘«k6÷yŽXÄ¡:ža¯…j›žadGO•KsMÕx±TB@Zéß÷ËCÆ0H^0óV#R›í_柧´,h»Œù“ê¹û§y y·×ÏFÈê2ès]iy§ \%Kùf@Êè9&Þ]1}¶ázËgu?íôs?îÃRpÄ!h1|!E¨ÿ^cŽGøx!o™ÜOËÎÒ„Z«¯”ÏA!ä@“¥\©}Oví‚ Å÷»†ãØ•«Ä \ËÈÛf,'K¸¿37r3ŒsåˆÂ•£ß2tÅBºI ¡šú}(Ã>²\Ë¡»UaÝ2¨[è”&¥‚{aò¼Éû OŸ¼3®k‰>sÔ*€b• ÆØûÌ—NÐ1–„ƒ$ ™®ï3{‰öI™CÒL lMHE0òê%ƒ¹ß•Þs}Ö^o øÇŸÒ)ñP/… c™ô¦2Ôe_§ Q©Çí9ì¹–òÊ;ïÌÞÂ8Œœž%fP×oW6zv_“jt]óqh‹nßErßaDz¢g» k,."ž±ûÚƒÌ%NƇñõ­Á¡ûKQ›¢}ž·Ä9ßr¸ªål†3¿­î8öâ¢8²eKd†óXДޕòB`v±4&i¹ ’<µhU)G~ðhr° ºmvZyÝ\¸1%Gç+²à84ÞV©¹ÕHxUè¡$X]Ѥ­ƒ¡:lªšíxØ¥Íñ ¾Z>6βöÄ…(k»?ˆrjôŽè:r™PƒÉ 1­¿üf×µžTF õJF$VH?b½Ž3¥ £ƒÞ<…&ÄîQ? 0¿Œ¤¼üñ*¹¿w›7 ø^€0Ü_æ6ºj’é,4ŽÒ¦Î>ûî¶5ã[[ßãhsN@sî:}ôñÐM;f‘¬ )˜#_£>}ö£!e§û'¨±9î¯× Êçé\nlóDv}à j7_‰®¤êD?Ó`²áêt½Óp’u64Ÿ mm™ìãÅ_ÿnKH)ý‚wá l¿uæö‰ƒ– Í¬å8¸?üÆ RYÃðw^R *Ò¨Û‘!Ý´òí`÷‚ueRE^¤MO\¢%¹)>’kð(Kx‹”¤ªC¿í’7v±’\@Œ}ŒŸV*øÓK «‘2¢$Vcmîº(ržÞâÎ[)1/ªª­Ívïcéñ‚9{Ãó.žÒ~+ÁÈ%O>¦•]«µÂm#Å£°ð**”æwªD¼ùòƒ’߈ý{j¬°Ä" ‰EÒMtÃ1[Htl}ßÅþ.ãBWL¾óH’š1{ü%XEÔªâ¥û·DHKôe¯!´îeɽÆrÄmÀŽޣ˜«BòAó_s¹í@ÝÚ x øS‘š+S‘¾š[Ø”¥üæìÈi§T}ÒFºÕ¹i-¬6rPòõ ôÅ]¸To÷\Žp©¤Æ©³"A†íûK÷ÑE6ˆØŽpøV_÷y×ýwÈc¡ECZ/8ËKÓ7;íÉowrÝÀªÞdÜ_Ï9£H`Å¢ž¥Fô©Ù>8A–ŸxóBÎõ…Œ‚ÎI­•†žÐYÙŠç¤èŽ¡ïÝ£²¸^ß¡" ^·P¬î\J9‹!ÑóPwS' Œ¡ÊÈiTlË«©ºøê5pšôaõOàwëÊ•ÒéÝdƆ¢wIeýoûÜf“E?vZK‡ïô5NZ4B‰jCc£µþ› ÔK‚Kµ‹4Zb4uA(§ê—d¢ÆÕ¸4äÊǩPÍ“‰Éð>¨¬×h )i9ˆ+S u)ô§6ßmr¤xÃ×=dwç›3NÍßâz$uàÊÉgM5Ï4Ž©Ï,…L¹Ò±f²O#^¤hÄPn‘jMx1Ùås@àУÚ6bµ+ñÇåÑó4ùo•™­mß¡4Ø¡ÀD_ãM`£\Ÿ™Ê¦ {MÈùr4|÷¥2£•å­¤¹úÌH²¼dï48é ÖjFuTÀv°á‡ç4G•ŠùÇBd‚ã seÉÙ†Þ•Ô»Î~µ@Í®@²ð×|m¹Æ®êìð謡‹„kr8v‰nÔ0ù7‘žŠ<‹î²ºJ²ÛÊ 8\žº|VþØ~Ë8‹óìNÝôÞ0ލJX'±“«Â‡zâíCÜêq½÷:B¯ ‹¯<T°|- 0ˆgéÊéâÞV޲]ßû¹GÌ¥-]*ÀÐ1CW¡kœEÂ:¶ÿmuA#èU¼ï´Ü1˜—Qñ­ŽÅ±½½Ø\¯‰¼×ê—@zkçwPÞJåØ$¬N‹,AZ¿‚6 ‰þ×L÷&Ú£bjÜPö S­šm´ƒ °bÜ: 0H;ßÜEðl™0UÐ*“h À+ŒœWb÷/ #K4`žÁ‚Ñ_§W»Xç•ìß+VïV¿‰U‰sî¯ÔÜœÂ繘‡žÂÆpÉtÖRŸ³£&ó¨ áJ¹ë RWy«ÓÖÜ6"¬x ¼fvï è"Í3¥9i•:\M‘QÝ~ýe§"Lí“- ­%kffh¥`ãm÷Œ‚ =ì°ÛäŽQÜŽyü}e-W±&ýL¶Ïµ¨ ï×[]íï(ô”ñS].pm`œ²P&°{¿¨~Œ i§îUsv.¤0Æýà ðP¯”þ…íûEE£cYðã°[î± ˜2þdƒ)tåúP®˜?gl :§möÒ!Zð< ÷¦Å÷þ0Íè&ÑåÔ³ãÏEHyßeJ—()¿ŒÔèV+pÐ{ëœg‰V,¾$£"Þì7L++èè< iäS Ë #-N›7 "•#ž\AÈqͪ‘¥-=Ë”ð6bqQ’jž¾Eˆ¢K»Ó1} æA>Æ~„;K-Ýâ°ÓØ‚ÒH ;ýÆê-/,&ë4A™\í,´›€ÿŒêT&œóâm@ƒÿö5²'~ÚS>n¢èKépÿ+uÏ”;£&DŸ·y0 ±”^;WbˆOd‰5]ZÒO“1CÓÑ}ºIi±?ãAßõ|þ$L¶_]iãã)ŽˆHó©ÖGS;QµÀ";âÊÁûîåæSS£%obAGo-ýÅVκËÚspKTNÃÆ‘dèç¤1¢= ¸¤Š‡_~Fî|}~ƾ®Á‚6&†.Dmÿ¤È"ñE¨šO''{a±V2`” tôe¥"›ï©Ð¡vü`Ñv l»í¤€K™Z@åãxSŽÁË5³]{\žÃ ]LæI:|O–ì©2A4åÁ—:²úzz€¥L½Qrbœê'’à¤*ºŠæM“áWÌß ÑcP¢w*ÅÄ3 %÷ŽTÞ Ã—ãïK·4‰¢¯öƒ?†Û.¤ ÑñU]|YVà.ŒÆya;k0о2ç-9E˜Ó{(¾ŸyêšfMŸH„.AæÎŽN·«–.N^E¹`]?;ÖtŠGèa¦*S½z`ðz­¦¸WëùTp”½íÉ »°ÅG"wºv[·v0Sy¡¥+•mÛ«êZ'Ï[§J±z+ R_ £mB&zV˜ÐB„9oY)Âß×AÏp«Éó8|k³JÈÍîI»ƒvXAô¨î.Ð šÊ‚ä|aÕçüýª8<7‹™ªÍ&Øÿ6¾¾³®*Æõ½.•;À Ò»™CT|OŠu—zĸ´÷îïÔb29®÷m韺œB‹öÅ-ûÓ:XpgÎ&Á=Me–Qb‚æÇùC?‰0Ú D»¾SjQš„î>D¼®Òè!­¸”»¯ÛÓ7‡9àÕì*ž ;œácSËÏqF g6±ib ’ä\Me¨Ség…©iuï›ä÷¿@Ý"t_…a™=¯ gÒB„ K¤NpâJb‹ÒšØ€ò>iX›Z“Rú±ë•çuèÁ™{9ê*T»=ÌÖÑn´.p‹!R .pÛo2Ùâ¶ÑnH5#¤ô³µ®½‚Î,óÔzF)jW—?†Òq›Q}ÛßD„Žrß»p̯T1=3uàè.Ê4üîC2[ Ì3|Þ •ØH˜hV$Ÿü!4ǹEbð‹Ã34ì ç½_U{~¾££?þ *ýšCÕ¤®hö#B±e~½6DζÀØø§ã0ELfYœ ‡ùœ»…~àŸs󾫘cUþ­]ièl’«b΃՗Œ—›æœ±a@ƒ¿²7yý Éih¹þÄq´@[ýôú¾ã}ƒ.ÈR±“ªlן˷š&¼¾p‰¥⠄r„I£+DÃ=ïå!w ,ªÕ×ÓJ{ë8S%õ·_ŸçÈN±-W5?&ƒŠ¥ÐºtZÉ|ëW?€—çr/Ï|东Ðtèúöœ! p%Xv~…½Í£qcÖÖ¶Û¥BxùÆ€(:Ÿ#‡–§‹Ôü’_zFçq/0“‘Ûû”qÌUå`7ÕÊ4qG}Öä° Õ×òÏp~’®ÊÙ;zC¶¦Æ¯a’žF›˜¹t„ÕBeN{kì<á kvgí’VùK”6Î1U^Ùºã”Ïžó@åæ¡«¿òüžéÛ03ò‘èëÙ{R«+üvýS·a>Nhi— ‰fd.‡*ª…ÒÜù’Y·õñ»áº¦ŸÞ l€“•ɱf|ÑôÏŸÄDZßIBÉjµ®u0uãH¬ŸÜõrmŸj ¦nɸ,›UʼnSè.ùá8ñKܪ+Ÿ á°M, åq %×§Å$Ü”­Á"t€’ëÑ2w›`TÀˆýsøš/jŸw¨h +afy“÷`1 F»žD6T5¥Óc¯Ð@+´©½;F#MIy’÷©7t÷TåñÓí*qº¢`w†ÀÆš5–©QzäµùFÔ9”SíY]?èk[ó!Ê4!ÎÏèF29ÝÏ“ŒÐôû`Ÿ_"¹œO´ñ’h‰LH Ãz¿D'•´_Yø¨˜€]œà L•rqÙ0ñºê ·» µå!ÿmÀ§Lª ;‡^³Ö¡óH›C|‹ãƒ­î²e©RÀ4ò¬š' x“)·Å‹—Î_‚îöqHÎwå3œêK™²ü̈æx8j9Úên¸¹^‰˜O§@O»‡‰S¦Û%“òUxb2[n±‹ Åê ¼ô€îÝE ¹# 9A¦5ÈQ,¾|ñÚìé OÂKt³aE»Zê–JSý³äèÅçÔÉŒëÌ×ÙÑ;þÈ÷¯ŸßïX©4ù¥(ƒ¹Ÿ…6¡æ'aYù‘o‘·êåíþžs»=jÇѯ°lItF¾¾bðªÙtâBÙ›ÈóÚdÁ¤vó5·½P%týÑQeGÓú^[|,B‰1g©PÉ\‘úø-7Ý_ÁrKȺ0йz›’ââ3³kPM‹tl\þŽL1ú„&ÊÍ8»ùÛ[C>èpˆE&Võy³5`IŽ–C³f¿ƒj/¼Á’öÝQ@£ÖcNЧ™øXÇ9R§å“Y[P*–2À£¦ÎŠ4€Æ9&Ëé‘Àº#3£Bàa2~ØN›øÎc£¨ôÎ{4“B ë–“d¢²¬›jœ™ÓjeP/.]Ùˆ&áý|»¬¥°Í÷Š›,LÂn¾Nsäô{¯çT${°)éû0 ½½ë®2â#`0]Xc»7¼[m¦=gÊ”ó9Aº†‡°ØÆWGˆÕ$€ˆ[ïî"#Ÿ·ûÚÏ)=;íÊKø†j*„j…K\°–·òxv’P3ï¬T£3ó¸ õýŒ×À-؇º›³Ir÷aò’Sò“»¶JD’ƒñ¨gŸž5'ÝOO¸ÿf!mˆ4Ò£–Y8‹¿ý5¼ÉâZu‘c°³RÂH~£ìÚ*T¼æ[¨Y´ÒÀº+ÝLªõa£&à ÏàÛo¼¥`iZ$<}«Å’4öѶ]ºKe'ÚŸ4FÛóv^¸`fNÀjwmøu+ÉVÔ’™ÄænkàBe/o¥ÚšAŒ±TqjÆÑy- ÆWv¶Z‰Ô9ž¼u‹nMAË=VÒuk3s[w­vÛ¬<Ôp6;¾†³³… IrµÕ^Û‘JSz#&ÒÅ“5Ô©­HJÚ2óDY¯8€»‹;…©»<µsI«ËùáØKÝe€î£WçËyòYçÙÅÐ϶P#ÿOðÝKâ{&Èœ m)±È©`&JÆÑ±a™\X7ÙÍ9fõ ÎþùRiÃ\è¶ŒÏø¼ ÌèSMŠáß ‚Ó%Õ+ÙáÀíˆ4¨¸#CîòÔA“¥„̤[º]±9Ýn‹nέ}y‹N«Ý}¬P–jO^ Ûf'7ÎNpÒD!ÅÒÒv¬ÖGÎ&Y~~Æ8¼?Ý¿T£%h1Ú“çý¬Ç¥¶‰áÚx—çƒ&®K·A`GFÕçXKBÐE ª/öiìx}Èe&‰Qjhy±ùéVì1XÙ¦Ò›¡;kÐ÷A¤KVj¢ÞŒX2q;E#‘­¦ÈWà±gQ² €3 Ð8$†N$iL¡l ‚ÏQÕgo?  HÏxHÚ"[RkÞbÌEDñ¤S¸…ûÇWáy?—ã.óòè“0dòí…™\©¶iÃmã/\–Át;X.û1P͹üÖ#ÒÆx¾a_Z½)W1Í÷E(' ¿ëóˆÐW §aoé÷hÎl?ãŠK¿w°)DVX%î½ãS´ÉçO©x^x ¦j¯Gž¼‹í˜? ;m°‰=Þ?=Ô/JúA-uÿEU»*t—)§Yy¡ÕÐÍv‘‘±Å”J¯eÓ93hðl…@4˜@]=õìãìfe§:£3m¯°÷¥^sõ#$•úÇÊóÊŽuSF²_ÛOÖ«]÷·PSQv¨›‚µ½I] $–a$çº aqù„£¶rxìrÆ„ÿ˜Ì Qt¿õXºC‘í"©ìZÃXìª6‰ Ã_&r¤ó]»éð}…ünÐñ\›x20Œ7¹ÇxóË·],â,”Édæ :¹°‹E»Aˆ« ²pšµ_Ÿße:}Ýølý•Zâ•gð…Þ[b°a‚,å›Ë]UåG},æ#ö¡ÙJhn•`b›[¥K&йÐ]qذZ`+Lî c¤3‹%ÌFý:°Ì¦ìà’ò®_m¿IÞçÛ—’âØzǷχõ«ù°Ø´…¿éliX× »Tc£”:D» ¯u †},P¬;ßâ£æBÈlÛð»x¸É¹%™×é€HꎋúuzÿWC½RŽÙ+µÞ¢"}¹ùpqøV@L„@ÈGZB/+ëÈ) ±±§¤NI½+á3<¯0]ºótìI ¿Œî›tX*Xó}G^>j •Õ€UF;€§‘ ÔôÊ!wàümt—²;¯ì8B™åб˜Ø­ôò3`¬ÐÇ—r-+ä‡rÑ&ñe?U¢%Ÿ#†ц` Þ1S{-E»º`Ÿ¡  ¼ÔªmßS^_ÐJ¡ *¾L¯æ¹Ü¥Vêzi-uw¬ñt¡œK33p¯ëC˜«U_„:iбžMÔÊ´h_¨Á¨°êM@#>qkÅÙq8-¬Kk-ý„z«PQƒå^A¦<,¾1Y<›;‹4樲}Ïìøò”4KEWËf½{v!‹®qˆôÑãðø4À)ž¼4{AØTÉX-`óž†õô•ב4ÀKžS’|„Ôí€5ÊR*–Q«|Þà"óiI³VßmŸ EÅ Öœiž«“hª­&:`(ô¤‹D~ÎÎê^š,o mZEJ#«Q*aè’X\—j¡„:P(Vq*Š>CI¬„(¢Íý¡9~>PÛX`^“¦*ÐÇ>ôÙ÷J q-|˜îQèg”«D³µHÚ3/¤3¾Ðö¼8IÕ‰ !5╃Ñ{g׻ؼǿŸgÅ«ÌÜ0…ñ}E˜Û5~ÔY Õ¾{(F1/çÀ³6AÊäD%[vܺj½i8S³`:Kš^‡ï.ú‘`bm(Æw]-ÅÀ‚Ül–÷W,ïÔK#RÝÍà•¦ yó#°Á@¬ûdº t«ä•+]D™’ Èv|ws„b«Q:Où&ÍzŸ4>jš®à«üXËUxqÑ{w"]9e—¨c-}ðAíu]\¥»•¨TívIËcáØÅŒ#|ýêCA cïË>£§u– Ћ.³æ«Ó)o*T¶Þ©­FÁ”§¸oY±),\ÖŠÓ3”:³õ’÷.vIþY˜ÔMn ÀG+“‘Ž5ú¢Ì$i/ð…mÅ{ä2ª ÒRjIõ1æó%­¢À›ã]1U§ÓÓÛŒCÕ3oÃÏÚ(AImž&Æ2ô•µ{cM³Ð[Ø& óÕŽŠ— Œá_¿ CêÏò9é&ëô÷É ‡,*¢;4söÞ¢ô?ÉÎ i}A[é&ªgÃUù$Ž| @á{`ànÌmS[×ÃéU•»Õ(¥â‘ËÜá¡Xš|°ª˜=î64;UVÖ‘#'ðßt²Â}¡–±YÉnÚ\Q’ÊŦ¹bo£0E( NÕKj…Ñ|0÷éºqAD³r±IîŒ0ÃÆÜÃLø›rÓ,éc¼šDîËÞ3kОy,?LS'Ú 0àdi¾D~ŠÐeWO  d…2ǘ_L&¢è+§öB±õ߸±§.Þã‚=§×¶ŒÎ’{‡2ÓP…æD3]ì»{¹=xéL‹€}µÒZ0àš éiß𼵯ÈÕÆ‡ËæX.ËͱJÞ–ˆ¸Ê%­!nÕ}£³S¥4”" H(…]‰z¥ìóÉ*k8œ 6٣߶õ —ÎH£–z -–>‹³Ždk"-ÑA‡…¶qÅO‹¡7[«?Aßzf1Ÿ‡DS8.  =‡+¾Þ@ò-·”ØZ³*(’û·+,Cã±ÖOn*ÀÎÛÉÜ=sq®‘'¾‰«G9¿/??Y½z/úúÃ÷™'Ý]ó=<ÝW]¨2“ô-¾ÝwÌ~+©LsálâˤD¡áÑyÓ/Ê;wê}“NÂx´lîœ{=ñŒá˳ù’,AŒ„°Ï(Дw²Ü$îÒœMìËÜ] Óé ^Wö»&DÈ•Vºw+±º“?ŸÙ~9„%–>»ws'´ª0IìŒý²€Þvë)[[«;FŠç,já*Ô¸O„@ØÆúxíöÿªG¼'­Š7cHøLëä‘îGÈŠ¹gš\Ø›WEÖx•üòûиÈ×CLþ± ¹Þ Ëâ³äy•DPYÔ¥‰ KG}— öFo@µ¥jí.JnŒÀYrÞçˆÒl€±$Ú€üþ@=Ų‹¡ÝÉçÃð' [,7ñÇP£??k»£°¡8åD7DÛN\V˜Ì ;L Rž9½ôyÜk¢ÏãŒfðMl­ÂkD©¿¦ó¨£¡üd¸8sÀ 9IÜÚTáÁöülfëkÜà×p,ÙAì €±à—;=¤x0:çÀn¾­¿­ïU¨)\õÄýá¦úþÿ;/ANÓOÚÁÍW-Ê5 >â7 ®æI¾îšCªØ´G­¹ãnªwcÚ„ÔßÁ2F)äTúP,ú%avŸPvšDP.Ã$ÆÚÚä ¸XD_–³7rWù&o±sÜ/lè¤PüI€²@‚K9»\‰ú~ðã¯óþx&Ç`&¥±á»V!ôU—¨µ/ŒaÒH”|{fމ¤¨Ü£Ü‡Ÿý/¥òÿÉòÇó¸þ7Ïÿääâäæáag?<ÿ“ëïó?ÿ’òýséýèŸ ¯nv®¿õÿW”?ê_ÿ?Gÿãÿ/)ôÿÜÿúÿáÿyþÖÿ_QþˆƒÿýÿÀÿßúÿKÊñÏó ÿïøç¾÷·þÿŠòGüþ¯êŸ›“‡í»þ¹ÙÿÖÿ_Rþ«þͬLìÌtuMìôlLuuÙÿG'þÿ±ü7çÿ<ÿÿwúçæâæøûü׿¢ò°s@ØÙ8 Œy9!lFÆœ{l÷ ïqp±C ìÿÛóû»ü¿[þþÿ'þÿ±ü·øçæü¯øçæfûÿEùgçÿƒ–Àføã÷rIZ™9|?÷.ä*ç]οÏaÿÿ£òßãÿrâûˇ.ŽÀ?ÏßøÿKÊ?žÿ~Düñðü÷Mxb=øíóß“’’jkk………øîååuäðÌwþÏn)Gþxæûwü»]H°A´?Ìã+Î;<>•`C)"Q$`¾úáùËg³ÊËLO•gζhjfpCÝdÌ{ê3WøÛ¶†oJ2ÓBd¢3xE Œ¤ZeâÏ»cNêö×<ÚùBªêìU«w©O|$L@¦æáMÄx_õþm“ñ£uŽâ¾ÀÍ¿¾j…_â߯†þMùcþùÏÉÿÙþÎÿþŠòGÿoô ÿïûëÿ/)Ä?ï€þàŸýoýÿåø7þÐÿüÿ­ÿ¿¤üAÿÜÿ ïÿÙÿ~ÿó–?êÿ?áýÿwýsü½ÿÿ—”?êÿ?áý/ûßüï/,Ôÿÿîû¿?èÿïøÿ—”?êÿ?!ÿû¡Ž¿õÿW”?êÿ•ÿãÿ'û½{‡úgûûû¿¿¤üWýëóÀÎNÏÿ_ÿ2àü%^Áâýÿýƒøg¿ÇÍÍý÷þÿ_Q ¼†l\÷xŒ ¹8xØx !F¼÷ô õ99x úœÜúÿÛóû»ü¿[þðÿ?üà¿Ã?÷÷÷ÿ¿ùö{<<ÿó—”öþ_ïðMÐï,áû»œ\ÜWÙ9ØïB8ïý7uÙ¹¸ksÝãüµ¹Ø¿÷ÍÃûgú†°}ï›íÞŸš Û½saãøS“aãø16.¶?UŸ‹ãG}¶?5ŽóáåþSõy!ßë³³s~¯ÿSÿÿ'øÿŸ~ ðoñ×â?àŸ OþÆÿ_Pþñýÿâ#GŽËŸÆ¿ÿÏ๊ÿPôÇûÿƒ#GƂԺQVV äáá¡¢¢ÂÿRø”#òòò™™™yyyªªªºººÂµµµtttIIIccc¿>P<ñaóÈ?ÿÕðóÿg©UaãØA{7ÊGÒ‰/^8y÷ûÅ¡¯P\„Ëõ/o÷n6.ç9r~a ÃödÃ:q¼ œ8räÅuâ£GŽŒû‰9ròÏnë›{~]T:úÅrâ*÷Äù§õGêŨ½k?+\§>vžÊöôý |m°5xa1<ÛPtëöÔå:Áˆzú#lçÁV% :E*l‘(  ÀNn,²ÞOÄ7&æµ$·û°ªàŒyiŽÑf|*€d3Q#ÈjŽåÚtRé F×Ǫ’ÀÑòyÛòû+Q¢¸¤_=¸Ë‹4ÊÕ¡‹àzœtð›a‘U ©bêÜVЇ¾F1dÁR)Mð’?íч,•.Ê_&÷¡›— ÷óök1S-‹Ú·aA¥®j*9%›¨šJè×kÄGý‹Ö㜃*{×%›p詤ŠÊ·¹–·¥GkD|ºç4ý¬r/ßÏÀÏDsŒÏpÄSd³§@•º€ÿ\ùU(ÒÊ?Öë.w¨HD—íéwއó%dÆÕˆàJ[ZJâ'Ð ôQð¡YØþ“)ªÔŒs Ո߭Ùq¸†¡³G¶r÷ôÑ÷ÀS‹ª÷ŠiLË™W†’ü '>S‚"η̌bÎò¤؃oÇO gÄ­XPƒÏÈWašqg¸ >“£Ç_[”€ÿ|»ðïõ¶ö/ü‚AýÛ‚G®Þ¶ ùo-à¿¶Ì•z#äߚѰ;5ô°´ÑÁ+CsÌrþfú~Þ¢<ï]¤9•X1úPÂ"àB*v•e4–%*›eoz¹ïä;ž¾Å“Ó@O¥ ìw¼ýÈ’“!ÜsL›»¥jì8(zŸCq¦G¤X¢Å¨ÃíË”,4低Á _Æ·%°¤)Ø=åjkª¦€}HIªŒoEè/‹òü$@LH™CÞ-;¼;Äg¨ažhICIƹñŠ;öÓx®¶gßÕ}ßß«G„/#Í“N|o¯ ¾•uÊ&!“¾Ðå^_ËiA"q»“~ìã¥ÿCá*K£É*¸2v'YcBTqžàM—‚j¤QDÆ'~*KñRu ìYໄ’§.ç¢ÄÜÉ‘ªWÁ`ß%ªw|ëäó’}A£bÁ׬ΌÄA àx{døi5M( ö‚÷kEñÚzéV!ÿu™|-áÄ~©TÇóbî6xkïœd»ñ¶çûOWB\ƒmwpFY}tØ¿€ýò¹M°ÿÃ.T¾ïÒà籄J‡b({p1dŽ„zÂwíu«û1a–æ`?ºøÚ–ÌÄ1,›½˜¤YjjË.ç"Ze4´–2ük’} …7ÕÉ„”QÏæEÓo€8Š¢c–~…X¸ú"B*6¨û8¼²e¢œH×ùïŽ lÈᩦbZÚ‰™Øž÷9ÒŽ_ómâb#å"\noºæ»‘#žøu–¼pzf;•¢b[< ƒrÀÛÞøÛÏ_MS9G½*ÿ{õ–Tï)÷+‚·¶1›†_3Ñ?5‰„ n´?Õè/“c'æš^ƒ‚Ͻ—Þ ÄáÃ/{ú%0Wæ;Žƒ"Jý…ס•yãÃ…C[­àô'~É Ê ®‘Ò2+`dÉ–Ø^œÚæ½õË)—!bx[·XwUQ–Ô”y½e—9ï2€ŸÿÞ€è·T½pJf°ÍÀ Xæ_Oßæˆ°´•yqáe7/‰oã¥ýa²³lIað²e-“ãà§ÈKà@À%hºPó<~žV¸ó.\K¼w ¿š£lÓŒÿ?‰î_¡é{ü»Ê]ò?pbB®ôÄ&HgU°Ý´ýá‰<üîid%HÃÐP÷(pQOBñÓÄP.6Ò´ÔѺ ч ßË4A¤™th—¥¥ÁKÅ`nÒÙì~¸lò°Õíaå¾ÍçE) múFaá·Af°ˆ6qrmö[‰ˆMyg¢žpK˜SëYŒiå˜B:¨P}¼Ë·ä"ŒW& –Z”çÚ›ä^¤Ã†›ítt=«wú…3¦œÛ[…»U#ºËD3¤ïïöpú(9:›i+pÖ'/$‚FUsˆæM0þ”á|ç3ò ½‘,á3v¯†øN\eÄKAe²óí’ÂANAs&êhûq ]ƒ\6u>ªEj“æØyR¼P³@ ¹ÛVPq×#’3s÷1þ¦3È/wtÔý‡Îµ°ñýV:;iÅÜyðîC£—‰Ø ñ0È8'4ÿÛ])#þoRî<ã!Åÿ?WÄ¡ý_;TP7˜]ZOÆ ð~^5$ÄÌ‹íQ@,|É\ÌÒ¡Å'=JFxoª›¥*hãáY¹Z³ ØpªÒp¡cÙZ¤#Jâ@u+Óâ,Ɖ¾+¸[’½pÊLtÙû·(¾v¼5ÚwÇ>’+˜ežB«’&µ›Yé›oÂ^øõS¹—)ÒôÐq‹,mŠN¶Ã uIVf“û]Úb2¨ƒ9†ŽŸªª†â¢É–ë`YíKÛ@™5>ód(F[£Ÿû2‘ííõ²^çÈ3Wui5 {ð°õGOÍËÙUyT YiµèˆR~ Ñ.ñÆ#Ó°]€Œ¤ 8vq¶x¢² Çè( [QiQ#ÎóTÊœFËz¿Ñ(%ã0ý RÙ U¶xso=r Éö¿DöL‚ùns´ÓÖÜ: wöÐuL¼ìƒ/éøЋ¤ø®ëÝ&‚Y–;t‹%WàÞßr³¾­²g¢M¨`kI¨É–­pð"­X ëݜ۴ìÝ|]41yÔï÷ »ü|h(iqVO%t¿ÖÏBŒ*8ÈâÚ|a¼é`䳨ñmˆ.%œ¹ÝaHm¢G_?múðGdá”å?íÔî8E1MÊ٠ײ¦ñNyn ±R9]a_¼È‘Ø[³›¥,²d›“‡øBÖg¿ý¦ºkʲ‘ÆCaf÷†ä‡•Ì^Ÿ`ù J¼7Ñ:tzHï¯WV¶Eëb˜65»ªos×°eV°tþéíC¶,"‹)q„mѽù¥»¨a鑨–O‹Þ”øØu¨%eßA“‘Ò9LTKo“òð/&³ £¼àÄÊœSMu¿‹Ç iÑtÊÙÐ,Î5ó00ÊRóÍüëd¡¤ Ð,“µä”Ú|­±n¨ÂÏQ‡ókaÑÏœ‹n¢w×ÃÇïC«¼^µäMxnA†ha!D€â#ùá(û}éR9"Š+L›8‹)BÈR[f lÛÛh'ŠežW³R؆uúÖa#×ÊÀÚDÙy¼!ÍÙ~ôT2>(ã(Š\X¦s&Ûàˆ;}ôË Ú¸ÆØp{졆ƅ ¨wžÁƒ²¿¸éS‘+tuž"‹ul•ŽÈùÒªØÍl<_ úîö¾û¼¨]bTŠæ'|ìÇ ¡ nÑŘîÇàTbØÚx…-iÎMM#ì—Ü_âsº×"à>ð‹tòÇšLÌ7þvg þãùâŸJ×),±Ÿ5Ûh¡.dž;LZ«¶­…qE\ûIöÁ»^ahÖWÜgk}þGŠ“§{1âfÚìŒæ2[™šC¥´ã!;¿ü¨ç㘦ä–Ê •­ŒÈç›?lke]b`©ü yËëļS烤Úõ­q1–¼ø»¡?××ý5vr׳–[tv*+Ï•ÇÔn> ºð]ʳt=dWK‘±Mô˜%cÑ/““£¶{e2âøÖ—ò3îÄNÔÿNÊ—r?òq¿$áKJK°–Á|ŒÖ‚žÿÈÖRÖ…ö+pH÷Cg{#ªÜæ5²Ô©•`é`‡)ô‡)_O×9ØWCG. ö f¬¼{ýóÊž©c>{cÙ«½xÇÁ<È)) Ì{9’+vM.8\ù-uÝ{Çf’ùô&&1f-,dåm+Lƒ'^² ŽÃ@¯ðOœ†Å¨íZè¯D¸y¶Ø}㨧/¥¿3Cß";{UõÕwØ g™Í)(—ÉÞo ¦(­ÿf{ûËm´sÄé«Ö‡ ± ‰Ý¤± ¬â2/=x™(twn À3ÿò°½l©ó2bdQDv0R„ZÉlj—Ù¡)– oÆ­åˆ8ØÆr‹PŒ*æûó‡vŸXvsØIžíþZWMˆHð–7¿ó0[¶È;o~ó.N¨Ï:þä,ÿ˜n’‹&–I•…€•Œ$|¯íÓt KB–¡÷¿Ë¥J`_ýßs_jxÿ¤Â®åû=>ÈÄ9Žä#+Ÿ(ÏôÑ(›~Ëï5êaîΘÝgÌ4w l‚@‡'•ÉçšèGÉÝIa8 Ö-Ù½±o¥Þ˜Ï5 tb¯t4­PᵤévªM†ã.ÿ‚='¨œ¤´7V<-FÎÌg­¬oNN°1ðã½Ô9üJ å[F:רK•Èíwò‚Õ›2À1Ù9¡±)r‹ÆRexÉvþJˆËƒz›ÀÐ@ÞQJÜ6ñr÷ƒzCßUZ [ÎóI‘Œn¨)„¤ý`aßeÓvg´Ø¤7÷Ò¬X±Bqa.Ψò¥j ÎâÑ!!b1¸}V˜±ë ¤ŠÅ¥Ÿá±BÌ"iãw ³jüÈ•ek 1QWælØù Q„Äc•ÿQ)íEK ßyX1^&k¡›[Q‰5êFgdâéV¾tÒÚܘk–±‹yýЍÊj`á(*pƒuæö8Õ׻ʛë9wÈ¿Þ#“Ï´)Þ%‚Åžû¾-£*ÒÊ1TëiÁç¾Ç1¤šGÒºÓÑ I|:‡·@îÝ´O¸y0t··ð%Æcó†’ S§­«—ÁÆòö_ì‰j—¸©Ìmœ¿Ôy—øÎnzA˜¸¬Ã<|RôÍ8f×và0X[AwwŒï—³FP€) ÅaÀyÞz%àC¨g#ž!{Jý%<”bípoA§$Ζۮ NMÙ®ÞwY6¿æ7ÂõìxÇÖ¿!\*›(¸2Hï´žâ§Uh+n=Ï*X nŠ×Ô‘CMMvî˜5ß2ŠòÁ>ûé·ã½î†HaÎ GVXTˆqbtó@¦ÜPHUI=~ VÒýåXua“˜‚Lk.ÙrˆI c5•&÷UX òï2NZD¤I‘nº¸O±5Û(ꕉkh›x]æNHð’ ¿ ã¤ðò$Œ¸NºzÓëBl×Þé²Úc4F×ÜiòŽ<ókEÖ£#®‡‹²˜{Ù*áA —v^y2×9ѸXW€Å…›ü¢ÉÁˆ‘¾7lÐù)‹Ò¥ás Ã}7j'…Ÿp ön)ÀãÐÂhî%>¾ƒÍÇðcä æïÍ\1„³ëWð|5¡``gû[„©Yë}ûGŠwC5=~¥cäÞ_‘ÿ°òËá¾rSÌw\‡ÑŠÊuÝN|– ðnºO~õ1éµjJþÁËNàß7NX¡ LUâ© Mg‰³zÅ-»Õ?‡ìuZ‘± Ó®ò’<øEÝ„ßÊøãâZkМSàcŠ}Rá¶Ønaý‚Ê ‹ãÚJŠ“Í´^ðò<¸²8úðè—ÃeÁè0G±YÜÆ$ìÇÓ€ie’«q?£/•œ:ÜòkÊ¿ ³~èn÷`Ëö?&ú0 “^j?Ñ¿rf“?œÙÍ{®Lt.>6`z²Ôtó—g~H —é _ú'À@ŠÂÌžH±ëÄþÒ„ÜÉDŽ 0À—å5[Ç×Tʹ: C´<$½aÒÅ4( ߸^Ïšô+-x1BÊ]ïÉöNâûÑyS²]±(/;M,Ø«²ø­·Ñt—^ÃRX‚Iîɩ߫¦jB!1Œ-È©†\/ÿ™,Àz–­h(ɇ¬£`4Ç–E~øpùB“¢’°eÿK nÔðy½+ ä­#fLiË'ì ÅÏMÐ…ÇiùcŒÊñ]´ßN'Î0+sý]VF ˜øò»|â0+óù§YYßki£ZÓÚ]Yµ û”àƒû}¯¬ý{AI“/X)|Š·A7jlaûbW&H7ìf_›’͘äù§¨œ¡ØŒaþ¬!¥(±RG4®P³X‡‹v&û-²º§‰µµÎ"ErÇpþmÕ Žå[xNÛ}€³…UnHnV9¦@ê@VXøÝ»!÷K&zò›¬®a;LÇÊÖTCÛ„aãûf¬–Y D trñÁ/‚®Ù륣²çWÑ9Éé£T(ÒöÒk ”`!æs pÖŠ–V4v+>tä±%­óK?ÊØJ„ößø±œQ[+J«$›Ó²¸‰«Áo<}:Èð@ì€<Õ7 ³ô”ɼT3 ½u÷†òa`N‹ò)R¬è¸ cÃ3¢ÌunüþÓa—¥0¥PŠ9Ë׌ÃL}¹¼Të“/ËR8üÒàµÊ[$¤²Š~Ñ —}–‘÷û‹¹WîGâÅš÷GüË™ZY‘6:×Óï΀+º°`I] û¶¿aó(ÙwìÔâ÷Ù»ä¨m˜¨¦E#½ûÝÆ:3?ŸO€ú9mÒÕ¯ÁC"?ùÑ)|ïêƒnCŸSwå?ý¶È mM˘Šy_Æl¨¸Ç=âWˆ#Ô ä!¨.93èµñ•Ù\¿Å[ P·OR:¤àã0ë…CÃð")Òüì‚4º™ÉBâ7#H,+\ŽÀ»Öš® e2¸¾d– åxß÷¨±êèÕy[¤Ýe ­¤2¼ô-KLÒd>ý&:r¡œÆUÇL´ÜKŠØ9ˆ”Ê*Ømž•ÿ¼ ‚‘Á€¶ÿß(µÛ0'h»jÓ,€ŽíGÏÊl¾*Ǻʧ©Ñwê|Wü gîb½ö#ç[áÔ±ž vG¹ãU1Ï‘ðVÆ1?“KÖLÞH¥-wcHý#A*§eìA½Ú äïñû7DØyÁt „nL¶Ž5%N¤Ôï3¶íˆÛ0ã]ƒ Å‘‰ošþ"-ÚB¬ö&ð…Ùƒ¤Å9¯ý¾‡(kæmö½}!¢ q›Ü3:â7¾dÍL¼`IcGê´œeI´¦‰Å<óö ³¹óîÊÇOãMòýØWHQþÒË@>#²]b.0Åoz•ƒÉâúGO‡ŸfÌ—<(ÞúgÉâ<-ÈÄ‚ýDòÚDœIŽ>}‚×÷ gžÅÁ *:·…Ñz«+JsM7àºî6•GO7¾8zÕ·–[ã Ï!hb'ZûèœÂÇžÏI¾›“b¹ƒ0ΆÆmþ‘­S·HŽžÆ{©÷ßÔÑM‡üY6^ÅSOãýë7ž$MOj„8ÏdüëȯéÉ•`MFGŽ£…ßÄo×FiÆ_›Ì…<¢=vïˆá­—|1dˆ"G>àóûyæç#äˆý}¶¦£§ßA~f?ˆ¥äÛ&È{]ª!äR+—¹Hø”úÓÅ#5ñ×>¥SùîG’'V ³öï¯Õ–èVÖNÝìÄ••P¶TìWŸ8ôîø2ûÉÄ÷ºý=×~ïJšÅ6ͽ¥ ]kêlÉ’óò&î ÿåkŽÚ¹¿GRÇì>Ì‘~Ä– ó*½ îÛÓ¸œƒÖ‘ Hòíé–ÝÝK®­o™òLº_Š[–®§¿jIçìÛPë6OÒ¯Y.ÐY¿"ÁOå”A_kLTÊ3œï~цDÇí]Î&÷Ò“†\µ¸·T–õ!„ÝÎAü*ŸÓr¶·7B%«õÓGßÙoÅÒ¬Õçt0™ˆîdÔúÒ¥ÁÞ-ôH­Övzl–V˜£1æ>iÏ<ÊŒVËÝ=j¶z™[å]¬„>¾ùpNeåy=£Ä—ôèYëðöijßZž»±«“àîâÚz© n³!÷®«JH±žj÷W±s¸~E^C`Ò鮀ŠÁȘÛÔ5m¨,Z;;®˜°ŸŒØÙ,ŽûÇPp…©ÊÉ„^¦–ýy1ÃݾeîFK‡.Nt‹ù¶ž¿ŽŽ8£î“Â.-só¹Úsò#s!M^9B½Ø¹;YŽ_â~Û÷íË×ÞQeÙ›ÞÚÞ˜{K‡.E«²/`µåœ£é‰µ—B¬•¸oîTÜ!Ì©;°> 4É‹ƒÛNŠ™aª§U¬D-ÙT¾Õ ¯îäm7ê°_¨Í]Tû?¶Ûœó6†nИª˜,ÌBSç•|3"y¬Ñµ9…䈰٨ÿ8ZKânèºêÜâðxc Ïú«(’Á(ÄäKRO™ÝZbŒÏ¦ÏÒâ륒§¢Hg6Œ¶¡WMóIÛ™‡‹ùî%aÜ>–+Åý²- æù:<­T•I»Ú:ʳIGÝ?·:¦frOçêæYŽ?¶÷ªÞB3ÜÓð_Zºg‰ i^ož ±5½I"êU¼X«›Wóì9«û!¡åQFY¦ÚÅcÎÉnY³#¾:—†(äñ`´§wÜ«lgΚtzøÔPi£’ïfÜ*Ø%ª²­-šäöµÊµÀlðFËlŒµ#Æ ^Š.Þ•.ï0=»ûlvã\æ®]ž¾è¦<éè;<œåä¬.C‚Ó@åÙxw7YLÜÙ  cÉ[º†À4Ž¥‡xfbo娢pÖÚ8Ö.ß-džÙ'ÉôÆdJköʲÝLíí›=æ7ÚHÊòçwܧ|ÝúÔ77vù¤ t§åGÖ•î•<36øhbí#ìR¼™ÕÍŠq»¹c~«Ôs½4Ðjv—¬K·bœùŠ"ÖÞK,Znr2XÀ†*¯ŽÞ0„‡v.8wÇÜf¹µ´ ë!ë¼Á™0iÊ–C"ˆñØÿp¯pÛ¸jty¨MèÒD;Õ&Q…£×»ýÂÓÃïѵV¬FÜt¸Òw2Ì úpsÒ*å<Ïœž`ÊÒ+jm1¦¥—žáÔ©vi;ÇŒ†"¸óæÎ•.åÂ[<Wm+5"]ÌêµÇ÷O.æV:ëy¬ïl,X«lX‚¶æ¶ksÐ …{V–˜IûsV-XìÇZ͆d¬ŠHSÿkáöM·œ¾à¯z+a¡#ê†ç†‰v9Ù8exŠC×JÚ½$7[çýç¬;q­P©,`ðʪ™ç·†,G5RÁy‰¢ ©'ŽïË”òÄ­pVZ«Ã"$Sæh¥Z1ã²æÑ Ï9èF(eµd¿.‡¬ æÂ]ãͺC¾°.÷OûmÔdðç¥M²Ò;-ù(~š¦\ò¯K}E;Ñ©x‡Æ2…¥uÜùE.Måucã¼'áŒÎÛŒ.\sK8†*ijÞo<6S66½?$R »³¥J2•Ë1¢³5Ìî ¨3‘›&[\Bî4BÚ‡Ë$ØLaˆ¶õÈð œsβä!ˆ*Œ“Ü—" íÌËa¾Ù·¹ÆD¬º2ù’g¨Ç/«¥²p|‘¼8W˜Äs¸ÑóáÐbf+³Mzï‚ÃÆ ßÁÍAÖB+7»¥:#SÎÁÖó|ZÝœ:`¦´Kë[©ÅÓþ륞<,´Û É_;Œ¶ö!‚yÓ#š¡>Å®\ûï,«ˆuS‡ÆÔä·àBDKJç1¡”>~YçÂYCϧ‡èÁLòÆ9o2ùå|^õúd ½"¬¡×Í#´’ŹBŒeá "*ÂÝÞœËpß õxNb ÅUæÏ-áh»f=­•Ó6¶{ćåH‘­SûŽ+ª.UÞîÖTK®ZeUž[„!ÕÖ“¹F#‘y+·/ìo•8®Õ:†[–fŒï¤*í¦ jÛ?i$±ÆË@ç`?åy#I+Ooa-ßœeÂ{nÕm—jF¯®©¾¦x¿v¬Z‹¹‰P8³á&¸*FM‰—⫚R¤(?UŒÓfQn^ÓnW#YªƒØ|XÉœ^»â2«0•_ Ò¢…Qº\>ªW¡IV%”jÛï¥W¥Ã´†Ø·âì¾O}6ì‹^Ãö·Ùpþ “³"Ï{çZ‰ËÊ™¹û¹ºKÕº×+ç—rów)X?í“î}ÈV­Hôl2¢˜–ï¢]¯;¾rZg¿æ-loì2•“tk®ñhåÔú»¿8àÊÍán;è´õuöl䘗Òvå¡`íÛïKN.ÛÒèO<%Üvö|De áä’S·žÛ ›¼Ô?vŸW£ÓÃR šÁ’I^ŸÌØÖÔȱQG-·÷¥fFDFmîb¤©sµ­¡ñR¸æ\~ | “ãɆ÷"zPĽDšu‡p¿ãF9.^þZÖÂÙ8·ªû“òsÁ´&› „“\cUMÉKb“VÍÕM™ 78;¾Å½°ǬçÑnñZ/é—$i‘¦Û}Ôª±šOLusÑ‹k«÷ÚöC% Dwý@l Õ:î¥íKE£Ö½>ÕØ©/ûSÎøÏÜ:Wz—óU¥>w£É7ã²–Ên‹â»bê#Ews?ß0\ÑøFáfsíËÖ% X‰+Yì$ß’”½[³Aôó·ƒË{ÆûîÝn$ <.ú^ôð ¸Úú•£5bôµi¥{»Ò­tòÑWž2Z˰-ýáÓ°Ûéí2ºÓ®¹‰¨X¢¼#yÄcz®æÖrtO¶¼´vö²²iF[Â,|I²hª€ÂÌu­¨*Àº^M³h$0~L¼þr¬¹ó׊Q÷‹–O|ù’¸ªÏ.É ×IôXÙ?k|&¥5ç¶$ÉIlÄÙgç©w:6b©Òg k|(‡¬ñ0¬œpWbfLíD®¼J‹ÙëᎻÀIö,qëɘÀªöš ÊIG,5¡ Ðût´{1k¾Æs¢úŽç-³ëœéÓW'ac¯±i¯»l¤c³n] ÜÏêÆÖÞ¿ûz]ãÒzý×½¢éªEþ°…šøFþLÇêsÞ· uc»üù[f…$Y9t<é“7ïcª½>¸ßjöÎ^£îcöŽI˜‡‘˜Xû¦%ñÁ¤­žØ­¡%‰’ãö”+ñ}|)ÆØ$éMŠ¨Î‚R|c!GãšánË÷ñ¾Z3íÄ'R\ Â?¥cUnÆm×Çlc—$JÏR®9 ØÕ/m²JR«U4_7ç,ˆ]¬ wÏéXøô‚©0»HÛ„L룉{gKª¶J«^÷ mx>Ÿ48O8iE7Í5ãš³àVˆ©Ò“u¾Vñ¼ˆÙèY"n/ipi ܬ€=¬ ;RKo©0HÒvÝ’ó:î@šÿàlIú°L°›q–;M¾ø ™ž„Vô–èݧª›Ç¥ÀöLÆÜó19‹Žõd´¡Ùô².Äàã/¡K—tä‘zÒ-Õуe‚qQR›³×jE¶\ÒˆH·¤åž‰â..6Î7 ŽçI[Œ¿2ìßþš?üR~ÄF‚ñÛ…¼9ñËù7§¬>Y}V¦ý„ûw ö¢ ž¼ÄC›rÖ³~n炨…TÝÕ·§8X<›k»{¿µÕY:‚™—c”WðÛ•oÎË;ê[­]ú9ëX\åÚ{žÆIa–5gŒ¶ÏYOߎõ޼laÖ­Íy‹OÇÇJÙXLª&:}œcSÚJK“rE–Œî{V’5_ìg]nÍDŒsbf)¾€ð¬"Ó½8œ9aœv¿>ù’iA~Ô[ÜCáo~"fáƒÚ‘ 6=çnݼ.&òÙ8°¨_]ÒEˆ¨,’"ÝüFOÌٓ㘇Q÷û‘H{ÇeeÁ£³—Ч[´jNîÉå™¶ºJnKYð ×:W¸¤p¼»Ç9ËõŠÉÝaRZ„•×~¦«Ý×ê³¹¦ÎÅÎ*MÖí$Y ­iò[Ó9û’îîe$u67ˆ1ê;þ[)y{ŒÄ0…C0U;šù0)²"ÃtÐÜ]á.ôVØ”¦.jLc 1[3T!à’ž)~Vç‰;]v¿…†¶ã–FžŸ·8G’çl£8©S²—°º*ãÔ³^WÞß4 Ö“ªMXôÜ×]û³½]–‚A'浯º®Är(QWà\cKGÀ<®tÉÊ’™änmáú¥%Ñ£ÄòZ™óõôä»±†Ø‘µNSž½½bÙ1¡f…ì ³=ÃR£><=8Ç%Á/SãL‚å™ ‡¦TŽÞƒ¡áò­ì)¸G%f§íkÔ ¹7£ ˆ?‘ÖòÆäÝ&ƒXÖ‘÷¤ y›OG—¬ôâ!kÛ.›7Jû’5¥…Wt.^®wlÑ fÞ­n[n¦è»L>o”]vSCK1iqÊvEbXÜÕsVT·¬¾9ô`¼gGÖŸâœ:q™µ=%»šfΓûGw±© é… ìþä+ý*/´ž#bN–‰b:‹ÆèŽª¸ˆ4X%W»ñWîP¨Âkº'%Αä³]KÊŒxÔhP¦îÕ0›á¤˜Þxª¿ð%ëâ¾ö·¨¢…SZªDΦ̸"+Èž î© †ÄD‡n;Öø¼"Í5ǪÓåÓ5Ñk“lÙæº²ÂG-Â×ÙˆiòL­‹‡ûÝ:£l‰šH*\Øø÷9kTÖ{Æ™Öú^êeR‘†ÖÙdÛX»žM¯¥­öl«ŸÆåTêb«Ý;šš—|P|vÔìFµ7óâeú3¡8]Œ†£|a[ cÅnÎz _å»3Åa§ÉäØî©±ÜÈ‚¾ºè¡aòM!cƒ¡1T¥£ÝÀ¹P#kƒùžþ±t»yÜF¿k°ªM“k¢šÅ¾”ºY£„ª¬­©4߯i“îžr×öÒ@mK…^gªßñ{¯¢DAb^1ᠼ˴b®ÝT­;Â\ ünþb5wl“/CÛŠm©[åøòâRµ'm'^.…Ü”yc¤ÉVÄ!MLJiì´8^hjŸÔÎeDˆjQåЂEµnGk™oEŒ òfr“Z>©t‡Á’[„„Ï[ÖÓ ;s]ÕØÑÑ ŒÒÆ]H.Ðj ¸ÞDOUç°Ð§ç2LÁÝD|°Àâ\ƒ6âýÒd¥Wjx%¦Ïx²ïŠ&Àô.‘X°IŒq‚Î{v ˹I#²‡Ö)•s]¥ã°–¬ómáb˜â2BîiØÊ\ÅÚ ÓTÎ:äâ¤HvèÇ&³›Á+6î4í^ fºu몵̊E“Dc‡vñ¥±)PdŸH—p¯_¾g³¸ÁfžŠ‚}«'Ÿ\ ¸lÔ‘'FWm²ªÝ™U¦æÓéZ„—nèTm9mj ”VM­Ez$-~ÒÌc°,˧]BÏ ºµ½íßµ$ºï8m±¬µÄn, ÒeŠòXÈ£_Mv.¿k4©ëcÛRåñÔc.cì'Ã*’|…fAÍú#fŪsKšÊzlÇ÷ÜXšCœQ--¢ÚÎ4Ký¡+è©„ö–¨ÝËs÷ÝC˜ev+ælÇ]¶]pžéU‰búOü6.lCr@µ-|+[ê‘:07F‘[²Q¥—úª‡L¿—´Ò‹%ª¶šÑ^8¾3þin-–7Wi”'A¡Í“xÕâò©Ä˵öZUÔú< œ‹‡ÝXu^žñ’.¥yC¾=ç™îg±SdÉó•Ù=ó”}Ä¥B…wìÌò· p±ÙÑÔŽ,ó(kÌBø(yž¾³c-UI&ö£íG~ïv šËÄyòÁ`ÚC<ÉýÆL•€¨0{n‰Uö¡1[›ˆÛB”ª …­ò’ë[š¤Œ„E¥âžÆ}!Q¬ž M“×?ÇnhËIœ®´õmlÅ·2ѹao§.¢*‚V<%¦WŒ×wÄŠéðJ°oιJ%Õµíìê‘ɛ֩®.ÝÔt[Æ´aÄY¹¼Q޼Pu*Ù~gþë2üE¾!Mús Ç&»òæÚˆ«#.9ÎØˆÆeaÚûv7ª>Mtf_´tV™=Õ*²½9«öe·ŠKÀÌ­j…éÞL¿-›Ü' ³ðÅZòêÄŽ­ÒE§>N¼0ë"VvüéõŠï÷rË¢ä Fy#}U€po Kc¸96ƒN}Ë[wAȳè{bÖ§‚ÂŒ9?ÙobNÏ“Óíh0;…ÂÐ6‘\Å,`HG·h è‚Nz}ˆÖÁôlì6Åm:FWè{âö¥ö¥ä“*ˆIò…®ÑeF@ë¶‹VwRªÊ¼òk—økÖ£ðr£JZ ÜŒ³ýè…xC'W%4½$g¾KLs%tªFd+TüÙS#2‰Í ¿ fh¯œT+r¶æ\cš’Õobv¿rZ‡ÎôÔ|,vmõè%ðÝõ|ñ,åWù¶ 6\Þ™ßØÙïÃÔ,ñ¯Sþ´ü—Ãéšä¸þ(¦µ€è ”Œ™³u^V[™pdeoˆEÝåö…øQ¯×™p E;Uåæ²àÓ±ÝÄ÷L÷Cg= -Êp÷ÆHš’©öÍy2r¨ýo½‰¹ˆÚÝèÃÔf–WÒ’;©&yÑ”uë§#"(èô= É1¡‚k³žÄu3^æÉµÆêüKÛ?à¿ú&Š'¾þ`£G5ÞQ8ÞÅÃ¥6[¾ßË£pþݨ°'èYháò©8LȳpÞF´ò§=LvV…-®ì<ˆAG8&ñe­©¤Àz‚Ml‘c%vNbRÉ]&yý¥‹b»K££mÌ[AXSˆHRôFj|sZŒDÁbÓ†«†ÿfgí›Ú'ź܂Et¹žÔIq»É• I>%äL²ÇÎ ‡RnúR/ñ,öƒ½ÉÞ§­¶pCÌWUìœÙÍæ•è:D7mOÇ<¢U—nÜövõÊ7n⛊]»œïlo÷w;c¨Ð×Fö*b²w#vœ4$ít̷֣>y®|ô,Û߸@¸HÊ:©@I*X /ò„QÀìÑ¡‹4š ]ʼn}¿„§ŒK»$­au ö·¬ÄÎ>¢æó6Ö8ÏŸóâþY($üV¾ã_ôà2± ¦ïq@ƒË怂l0Ým‡ƒy惱ÙèâÕ;⣣C§Ðճ¥®„æÄõÉܯW çC†Ò`r€˜PØEv;‹†ˆ8ö„oÖ2hD7Ú—9h)\ÞqLçô°Ê0髞,ºf!@v¸úÝ+ˆUªÐPÛÛˆ°úM3pðÙÊÅa>CaÃõFµ7@E•Mºþ7l).hnt½ÍZ]žúÇÈ5ƒ|á3.O oÇ€-g5,ý–¶Î"¦Ó|,¦Y@ ¾éôó× ¶»ŸC^#Nç£Õ­Ov§¬Û\%=æ8ÖGßÍÈ6¾`¯ÖI¦š«|YW’d‹‰«ÙfžóŸÌ¿š«;sjŒGq‘&Ôº„ø¦rØ€ÎjN¡/}iG‘šïÃeÝyJ°µ€ôØF*dýî©XI_Ð}Ü:DгI!È¢B{}›„·ŸC§ ¡~fĽC¯pÑ}£D¾|àI‹€ö0±>ù¬Ëß##tïñ7›êú‰HøŽK¼ŸÈlX[¾!Ù$¼&0G„áeù¿óåÞ!bh!òïÚÂ@$&©$rýðZtˆ0ªÐ¥I…cxã`šPÈÅÎO\Ì›xr+À¸%Q–|/rùSIÏrDPÁMšˆEV°gÇÛ`¼¥EØÕg4äS%Ô⨠aôsƒC8@¤•Õ½ØQ„ÔT@;Æíîë ™ïÄf”Ù8Nœ±Î0AWßqѸÀþc>MÉO'ß)¢zmÎODžéÐæfsgöeN­Za3WލæR:+>é+„VU ¢eOe^ø)KзºPƒ²ŒeIÊ2¢fÎÄö#Ëf»ywð¬Ëƒ9ßn4€°Ÿ!öºµõÂóC/nv3臅œšPˆkvybÛ^pèÔ~óÃ6çZ#Ø`F0`ÿ˜rE„zàâ®mU¥‹Lç¥ÕõP‹<„Z+I«ØÐÃÖtH°ÚFsÈ!kaqVýѧ¼ÑQö\÷žž–KM?Àm=¡2¹"K-•‡Ž6uKź6¨­»71†§U wÌX!ÄSÏ'‰§dF‚.ûA޵]uÒ8s?4ímYý](ø`櫭Ć{ò–{Ž V†C0yQ–!#B<ô‡@AwŠ´=«*èéI‰Š;,%Ä ÷KtÎïjª|ßàûŸûÀp%êîr renGë 'f¯ŸØi!mcr^‘ªMÉARcJÔð¶¯Y7ƱÆ-é mDFà~:ÿ•¾äË“9"[á á°Žñ…ËÏV†ˆ”?Vž|6ÜþS“uœþ ʶJoèè1½0™­¯Å`@qSñ]cD¹ÃØTafãBã¿àÇÅÓåJA‘»]%ÌE(’A•‡'7Óc场{'yÇù"$q7nƒ,!º•q¼'Àï7ÇÚb$2‡ï¡³Pjl£bHÞ!ÿ$S;¯ ðé ExïÊ÷¾*-Ý|àhÍw/§èâoÙf(P1QçÃÃ]Äé­¼Ö”ìñŠ®¨W‰€‘C0×”Û#°ö‚…‹²t™¤z?­­ >æò$H„/¡ãÊ`¼ŸìKž­€-”5ää®[¸¦ÔìZzU;°À–fÏÆvPü4ñ!>NÌ¥É4Øà‰{¨áãÔæª=5¢‘ä*Œ\L³T8nÒzi7¬™vá¦á:ðCz[ŽÔRÖ5!"wÕ²­Èš¹iHÚ‚ÕÌN±»ÛxIѬ-8º—{+8i]y&’Ÿ›Ì7õÛÞöÁCë{ŠDÁVoã0zW’?£$I8¨Ø«g8{ž €NáЂë“j<©‰½ä:ºTœˆâh[QÁ“­B+øÃu%ø‰ B›@O®ƒG"”ÚMl¶r€ÏáØ ÛƒykõïÖc0§[H×ÏÛΜˆ5{0_tñ»wŸø+(ÄCÖ4Ÿß!›Ì—Öª•ÈÚz½±ò-4^p‚‚ì»Û¦š´;©‰ð¬ ;sáÿ Hÿ/>p§f,‡’ç(‚n0ÄÝÙõ§’ÈÿS"’¡Måp5¼,¨ÝîƒDØO[ÔÒÀª,i'>}Ýî‰k—eê ùa#í ÉiM“ZÔRÙxdr ¾Y׿Áï8‹Yëó.dFL¤uåÆ-µ‹²™ øéÛ2'†&m‰ÓU𾑨°“ûÍÖ4 0~–?2ÂiÒ·ŸyÀç€Y|ò‘Î8ßWVQfSœKÞ+C’í®ü±èšÙwEè/,.A-UƒdZõþöÞ‡kD9eT:üé^æÑ%„ €¦Šª¥‘ð“^´O–cõc·Ç˜¸‡¤’?€ª+AÝb!ðpBaó·õ É³¾ïv4GtàºðG…Ìíwi'sZÖ²±,ŽTW "eÅ3HÏüÄú+Hx³ µ¿H3>Œ†6$‹GÔ0ÙQ3b\»FÄJWDÄ'Éb¬®hneF©;D‘ùÐ êÉ” '˼ûjìfŒ‰’cúðÓí€IIíÊ·+»Û`L?YŸœ "·I!3'ô¤(nDÇ`è6T¾ÏÓš‘á×§=°< מf_ÝÏ`U§‰è¦ ÿVº v‘8À·~¸""ºû›•Yb²@%—“ ­}»Ø=#«Hø©Àúææ› š•?c»ø„­I[ý±äu|DhšèLýg%¤—,#X=㬚÷‰I?6ƒÝÈ(¯“Ø=#®ú¹ f©sxO 5^Ýû™èŠ jÅc·/5j7Ð…N4%Û4gsTËì®5½5>)‹WH„ÍöOS¡·½­uqÒvA’ÏŠO®OAwr_L¼tÒí5—Åõ¡Ú6–SÊ _ÍŒ8õsÆQÉœ“ÝUüXpåÙÊn€B¬Àj®þÒtz[¸"&.7^%ñçì´))B™&;-ñª7ŸTPsb£/XÙàÁJ§ÔµÉïÑna$ù9h“÷Ïu‚k`8æ`öKPùpøLœZêõ€é¿{Pq8Æx©Õ¥Â4üswPf°¿zv¤huäg¨±ä&ª/j“ÉÎãRcŽâÔ`÷µ[©ÔmiõD¼EÆüܨƒ•†ëâÏÌB|Söë„‚>~ê…¶3GA.JO<+¶ßÿhpå.¶U…Ñ×¾-Ü ''ËDBû»r ÉEM“Pj©° ÉÄÉ%²h¤Öh¥JÔ˜g<“ tÑ껟Ë‚„O»$jöÌ?Çód§$Ÿ>¡ôã|¶H‹¹*g·‘¡’öý.§BÍÕƒ±ÅÕ‚À(\_ç–ƒðææf©²ÆfŒGje…}+(ö9BÌäÄó÷Fd:²Ý{šÌD%ŠlÄS<´t œñÚ~ YïCŒÍ\çòxêðãëÆIVå‰N-õùc›I`Œ©5:ókÞ’¦Å@ü[ª°Õëïq)6—²xïHAveƒºÇ×™…|nÍž#ñ³eH}²Lã$HßKð A¯FGÑZLal ¦g!w¶±ˆ‚÷ÏÆ²™ë•æn1诡zmë’žŽÖgcT„Ü:“­”¹ ¯dæå§Ý•‹¸O —ÍYåsz/Ú®‰c‰Q¡ýéµ/"º)CÍÛÕì7>)î4u;§ŸG U´3éé eÊÑÕ³±fS¼?åÏe{µR6s9w ¯€¼ØWì ºh{›'Š«GY‹3G âpîä Éá6b»ñþÿ³·4÷ˆ7ÄË¡s¥hQsn©Ž|c79tÈ2û™8ˆ€P]\FúnÚ yF~ÖÉ—ÝäT§,³Z7»í—þ„ÍãØ‰7LøÔ1—´ñL’PõVÆskëP”{O¾ÙÔöÏeçCÂ\¨EüsžÆäS ÙyRÇ>3Ž],H1 °r™Ø2v{˜ß"J²íy_<ø³˜™=ÅŸ14`Ët6§õ¡ósTE~±É#[ŸžòxÜ¿‚ŽH¦lñoÐÑm¤o"N¤Ñ†•+y9y¯p?56J °AOËÚÏD \tà „ qñPbÁ"$Œª_ ÐÍÝ´-é…2tî|·:ELˆÍŸåˆ#\¨Õ«ÄP3ôR–ãxK½Ã^]¨ H‘–ž"~ú4„ð]i/b/µH}¼uÕ#ŒäïxôçM¾¤*]9þщ²§{1&×nûÈjýððu0™z¢áºù“ó ߦmšTx†7dÛzpP\}¥j$FmÕá`À¢-‡+9c`Â6ó\óOmÅäˆø‡67ãwÍ;,iÜ ûªUÇ:{T]]ìG:‡Ðy&`ø[–ý ›"´U®ÛÖ?× Š;•`0¸ˆÀÀ8ȨƒX(0›¢ÿ9Œ‘íí„•²Åx#¼U°Æ¿²còPe´Eæ óŽp5â˜éß\F„ÉO@÷7$6N~P.ÅÃj;±–ìuíæúäx­!y›ñ¢ÕGß!y¡ôþüby½ÒK7¥d920Ðó~ЀªŒueöƒ…6ÛѦØY^ œ9§ù´†dÆÉŠ…Kÿ€"Í&s€Ñ]`ÙVF:§5˜éÖçÏÃà‚,4\÷*è.±mÓ„B ^A©¶3@QcI,Ëk.UX…ó·( gT)56è\Ç?‡E0þ(CŸ$|K+F”ÌŸÌË¥4`,Eµ…[e°1WxõÍÒ¶þ°ÂÀ—!½.—z+ í’ll´'Z2Š};ë}¨þÁ¿%á…+'a!‡9ŒžíÌ«ÃÅØÍ[©8‡q ¯øSþ?ì} \Ìy¿Ýåñ,vzHr¦ä®¹k¦Ñ±Qtm:)™f¦¦™š£Sµƒ¨EŽmE*Û*]–B(E‘º¥T ý¿¿ßÌ”!ÕÚ}fçÿÿÏç¥cæ÷½ßŸûûѼ›@o(}¾'ÅÿÔõ0K½¡¥½GýY;ûàë¸é™ÿí¦ïoJ@›ÊÀ#÷[=Q_ê%o§¾ÞQXHŽ¡B{@!Œ~ïp3y—v²ï–îKëˆ5çT4SXkÎop<Þݶ؉Ïßô`wËt.×^ŸÖ|ÿ6$ Ë3Flj¤r/« îûYV{EŸZ{ŒéCºê–µ¾‚ÒÖÙ¹ rØñ4G‰Œ¢^*l#Ǭƒ˜ÿFnG¤´Àrf°9p)Î ¯[žÒcè1å­þ¹kèë¬HO/:ä”'×tjGŒpži$½b]ü›p~[|‡]Ðs§¨Qó¡hY°¹Z/ϲ J„P4Û²I›,y=¡ 8äÎÌ(çyõÝ,è*·Ç„øh;õT²ÃÅBô– KVEÞ‚òŒ]Rä!ªÉ³nÝté,‚tjî´¯ÄN¶ËšL[Æ>–Øø`²Ïê«©³7EÔ2#*0É÷- þñö˜àú»T‹ˆ{–.ÛH§ ŬÐö¸Äçóƒ/»Hj6ë—ÞºRýÔwUÏæh‘Vr·->õ„$Ùç¥ÔÌíË«ÈG U7‘c|áÛ„=çUömÿañEÓä5n§kžLq"­B ¹Ù«¯†I/.Ȉ£ØYê… !α… WÔ챟¹¾¼Ð²]˜ò&‘uR3AXÝ+A–œ™‘˜½¾ê‡¯7k8­ä|ǬlÁè¹¥¬1ŒdÑTx.óØŸF”Ab[¦b–,d ÊÞêô1ìµHÎnŒ+?Ôûße×ëW¯ß·çí‹ïæ fÅ|b8ÄÁÄÙwìbØTQÓ–ä]Ð_8¬vñ}Yå×F>–Ú^?÷ñÝû÷ù@y¯žØŸvÛF Ú^øˆ¿÷¨óáWæ­Í.wv8ôiä´ž« ‘NÎÍuƒñ±ú™/Gt‹¡f€¸î¼Ì2ç¤ ‰s~@›¡ÇÙTœ0äTãÏZOÎ7ßg•çÕ§Ôœi:#’*àaÆWC·ÏWÐ+áÛ>âl£ß€@o§ÎÐøö¬®ý†é}_]éÔ;v´šà6§ã‹'陙πå,ÉÐZ' É¢—S£u"×·¢t³Jm‰G— «ö?8«Uûά/zú{HpïôU ü©Ÿ®¡»6s59­Ž=ô ÞW9’OB–ÀIÉMËâ/oÍWmd¿*qFÔË3Qb)ùöþl‡Èœ‡Ë¹Ü«À’ÊVK§â>.±)¬%ù͇ eœüæ_¾•1b“ÊMÁãÝg91“ž&gfŽû¼žñ²?ZñåFCj>¦yö¸d6ðªÛÉ£“ö×_µ¶\´«¿ü"’PùlÈËÆO>˜_G&†ŽJŽ(?¾¡¥}ÒÎø÷²I—:¾”^=¾œ°æòlÎÌžï µà?sEV‡›Å¥„k5õë+ònŸBWpy)ñ b³In†§ÒÀËm¦ÈnjTDm‰$Eµ¶ÆG[W,Dè5Òá{õ þé#ë´MCtŒEÎ`.~s|áÿˆ…eþáyŸ{º³ 3Ò–ÿ~R•¿G·ò^|÷û½…NkDMg&CüdJ(%¬¬yU@Îhû‚±¡påïÇÚL¾g»ÓWW•9,ÑøvÖ'ö”åQ“ÐÙ'Oȉ€±]›ÄÄ2âž)gÙks’2!-plÿÑþ°úOé$ }ë!aX73؆gÓWkn^†úÅ~únj¹eþ¼ÛPNÊ%°cÀ™™b§EðʰÓ.žË ãËÛlàš=¥éãÃ::÷ºVLJN=!H¦z;ñV`¦*Ò‚nNÃÕD“tB+Zkm»ZÎ3f5žµ^@avÇ$Šjã{bß¡¦ÿfhmí¿¢ÿ|[xf5»°ÔMãe£çŠ£-V&‡wiHæ›) ÃÍ2‰¤úA@™ë~I&Û‡Þ­¿6ëiý7÷ÉM¼Í¢{R­ŒtOØ@§ú’,¹‡×¸éóköº »»BŽ\äl?9–z1§‰³nsëÝû™—·Ú¬AËN\¿¼ò·ñŽ{fò©„ã6þÞêµý7J™‘•ª±ÆG¥ê 8ÒéIçÉ[Ck¢>¡Í7 —õÚC‡6¶ÊAµ‡C®òÿíÑmNí´X»–l¡Ë”·¿ÜHÕËñ Ï ~Óè9T5Jb_̓{ëH‘µßv}Ù£Þ~[mNá×符G/øúÛG!„ƒénòïÜþéÚ™%ŸÆØŠN®H}ùðNB`Óïº-”&›¾Sq}ݵ×+Iu”üL¨úÛnOR\Úâp&ø‡/™¿nh°5œ[•zq‰>IûÂÓŽ¢j[œc½ç$u“ ŠJ\ÿï¢ýa£^÷ÆÖ8UõÔwŸo#ç–Å#«Íœécþˆš•8ËÎYh.ÒÐmA޳Yùã¿!\v­­»L‰©>”o²Ñá:6ámOHHI˜]®^¨Ëôü‡¿½°æú Ôi;ÔFIB»£‰ Kkˆ¶·H3`–k®,Mquáó³S¸V­s6¾3¿jÛ˜j³ùô9Ó|ƒÚ ml7 Ln6yc¬'±­‹-µg—¦xŸ ÒöýkâõªÁªGr®äÑÍò%ͫֈ8mµ(‚Úww¢ö?g©µ“Κ„ÅžÝ.ê+¹4GwžæJõè‹ Û€‰×œM_ŠÏiò ¤ÝÓ±G[cGǯZÄ/È»öJøüí/im]߯¹í³±4é°~ ¢x‰¿‘榫¿´hŤÿøD²ÍJâõ¨)!{Ð`ц]ðž¶ùº-­i­ñœˆ×!­_NáÕ.níð\0±Üù‹’©‘¥ W®Ü æöDžÑλvIx¼F÷&;OÿÐÐ{ï ª*Ï4ô¶`[ЬRϾ¹òº«¸ðõ̹ñÙg.Z'9‰—éˆúöZ:²–ñ3…á¼gl*ˆT¿ Zx÷Òõ°Î°g=¤øcOrzÛ⬫ÍòƒcÕ¢¦µK¸–Ÿ—oºaq2çy>—29еûîQø¥©›ÓNÖ.¬ r÷k¬=XÿS´ *(‰´8;"íò¸ï%, øa²ºjñäC{ûw´C8?Ç(4¼ûD\ývjÏ«®ÎŽ&¯Ö€c˜•N½cÆ“m°ˆ}Â+»:VT$lßít£sqYˆæa“Ò‹1¦‚W±Íý(ÄhVGWFì_FP½º¥cáê[çcXs—œ‡—ËâçW›µÌXDysåû¢ˆgšuùA¼Fׄñs€¾¸IѶ ÞÓÛXâB?†µ`Å%Ysÿ%P7 8êôîü"V½˜zmE»* ˆÓ w‡R¨sÎå!\ÚÇéð=N¢Äm¶R´‘5·Ö|U·n©HP ŒÃ¯+÷ ¼¡\ÄÕÑúIC=¸²Cè]^q:RWµ‰ÙýŒðå£MW#[´N¦ùP²Å“”ÄGä®…àë†EðžÅ%¯ e@œúнF_4ÌÛwËíg’c“dÕãRÉ/~rý¼¨´LÄ4 ÒnRn›•½k®ÿÏá†c›1OWÄ%‘Ù/.o •ˆà£;šja/¢mʨ+פŠåé’ßÁBzøîз? ¨ŸsÝ‹[»µññ,‹«Gg`§Ývûï-9ÙMv¢˜×¦ÉÔÇà`cE–+Ry¡È`çg,K#·‹iþ÷Ïó·p4ŠœÖ?yîOÙ¶—Çíê×…Ñx“¸5Y×búÅð”p~ÇÊÇõ~/¼¨UgÁr³’H‹²#°…Û‚¤*·\ó›0߀ õàPš(ŒåÁ{"mÏ·®qÜßx¿’qgUݧÕnOj¿2z”Ðü°†Fcô¿ÀçÜÖL)M© ÎT•¼lçªV­ó¿ÛÚ¹ã9úbh,³Z”YN¢ÉÝò(Úv€+_;‰®mÊG.Ó$'…æBK^~¡Ý×áI ˜ØéŒk‘ ÖDÑ®QñGîš8¯!Z X¥ÓTÚÖpt#ùè¡XÔùsÞ”ÅSmv—~)K*FÑMî Í…î8Õ0\>bçÝVËÖß!C¢:Æ >»¯gKÄI2UûI÷-öîÈyàà3ª—ÚÍËÛM™¼wÁ„õåhï©s²#ˆ3-“ tÔ¹«vyŽQÑ,pØe›U-â;Ú5ØÆ]L5'ùÑ¢sSGÐ( €€AÙûÈ©eY+þ´Úé±ñ‡ï‡ÛlÛ‹F fTV 'aú-BccIïw›Ø,j ÑŽåGlð[9gpK¾ñîuü@Ïu:÷¬§ ,4g·_ÍŸÐsÕ/÷¸Nhïð\0ñsz«dÆ\JâE•µÈIÐÑTQæ°ôáy&=I-*]_µß_e´hMb·Uµ™q¤Vê:9‹:^·¥#XÑ@ä– Ï,Ì»FÕØÛ¬R»élžGd{£¾pξ³—»=é0{¶®Lr<ÖáÎSþÛã×SpeÙ‰î4ù±kë®R:Þ:sXŸ«:êu]½Õ©­šj!R农T_ 4ßX:lhòÊÔ— dpÍ¡Y\+÷R½o–¶¤ P&Zÿî”Z(‚2¯Œzô’i‹F_ï–h¼£ˆ‰ÑO–±¢ÚøÚQÕ"¡c¡dLË*Çܸ˜h°sýÒv‰OPw½ñþÝëÞpÜ•l­úÝkÍ–!Ç•%&ÓÎŽß®6[½Cm‘TN ¾~yäÞ”Ó6@›²r¶&Z«i ÍÕ¿)`üäI¿4W<` •÷—„à)ǵ0üõƒ*]jA…ŸA.öÐèzŽ£¤ÊÕA$è¾p‚j)W‘pÿèȆœ Y=MúY'˜ÏŸë{æ>qÜ ¢#ã™V9‰"æ¶«éÔ~iSàéMÒÛ¨éT0n·fµ™>æ‚g²Ð|«Æж#d‡+Rt-`][øªðì¹5œöÀ©"?¤¨D·°aïú‘ ñôÛüe¦ê©iºí•*Ë/mï½pcçà^•Jù\¤Ý€¡#ÇÑœ{îºRص¹ÜŸ'õ‘ßy4þÜôõ7†3”MXÁé“É24ÞZ5³ú|cÅ*³ #’ˆN"ÿŠ_w›¨µ?[—kZn jílÆ!8vLÿ”)TÊ›‡­Þ[訜¤Èô<êöÉ;¬‚êò"™ôÖ÷qר3¨86a±ç}wé¿¿xìöÜ$3©þ–Ò”y ÓçúÄbþàŽRnˆØÂ‹ƒ–JǾÀ Á©õíËWÇÿj ©—×Û‘’í%ÜN(ÞòòȹHç°ŽlMü.Xíká|²_Ö7ÿèH+=–cŸîQ(¿ò¶æwaÄÊßš\ãøè휼"UëWÄ&–Ýlü&‹}Ày¿¼mšÔy·i¿¾µ~|ÅrÈÝ[Z ÐvJâv~IJºÇdxÀÕw4M»#;÷ÿo¾4qð‚˜/;zÃöXh>7Í`ÓP@<Çã“×€©ËSìÏI›Ð¼ÖyC íÌ‘œo89JªRõ/~r%®x/»О¾wÕÎ̤·3Ÿæ¿Ü¡R0~÷p.'p Ò&í59„¸UÌYßumúåÃéÒ+ŸÒü f\äxßvÊöüéjÇEÍwýGTÔÍ=×8m„ñǺö”õϳƒZrÒΑNÞºæÜóöJ® ReG[A¡K‹ãüÄÁ|¯ •‰Ô@_–6D[À!°&ûÁ¥CAìˆ7|Ÿ½­ñ~lØÜ7íp5©DmcìàÉXn1>¨Äk'©{ã‘…xµáIÖó³î¾ñú˜.ú†¸žüûFß`T£TPáFj9Uuϰ÷nça ½»¼°Æ•ftÒÛ®¬ÅÅf&ÕŒÛÔÅ©Ä7Àe”DÓ^̆ä·üŽf2´„\X€ADU¡RÈmDj|{3>©¨¨¬kl4­+#Ê'#xvïH"q [—¸-xÀ7.¼_öìF‰_}aÁ•Ú+QI½ëW ï%-tðAéé‹ú—qéêŰÐ…¨6ë♄'nÚ%€bùºÑëßöŸ¾õ‹D uŸR¿Tpþk¸˜§jAlbŽûéáïãÑãwûV›¡§/’¶¯û•Ò‘¨áÔìâŸ5×ßùdeªÖoˆM ,œñTHÛu*çŠÝ,Eb«\D³:jÏ躶B[ãÜ]õ?—kÞs:÷ «¾#{ƒ0…Ï 6.¹ñ‡•¶ÖZ‘õCڵˆð™´Q´Uï¸8Ôàu¯ ®µ_{”Õ²7áQÑ9„gÜup(3uJ÷è$²ï¾B]©å5¢ °šÛ_È9”$\<]]°¾›wú'õ¹ƒ„„@À ®äÕü2M,‘ÍçÃ3;æØˆn”pÖw£‡ì…oŒžSïp:•ÚZNž[ö´æ’NíY߯©$ÃigçåÌ™±z›hÐpb¾Ð<·_@•°æ›Tzûî44ÍùYP³¨ÂÓw¡ÿâÁíÏ͹H~ûóÒ¹-ä ¢¶œ”¹<>ÉïѱڨͩÏðùä¼dà½qN¯—t}Öílr³BÓ°oÒ ‡ôî³ Í2…çëwÅoŠß¹˜ÖЋÎ6éÓw¤.`¬ ØEs]¢VŒË5CÃ6ž¤N×¾ Iˆñjî$îMÜáÛu¤½¥=*©Öõ™±KÚƒæ¥n?·£Ç÷k$'QL÷…Ê[k¡S{y±OœÆzsöAÛOrƒ²ßVÚôš‘ÇŒLb.Võ®›\!lx*˜²À =gˆb/,ÎÖ1Žš*pÔàpEÍÆfÚWá ƒÑ}K°;2 l2£y©Ýœ¼m¿€p…U’îoZ‹M¾å–XšW«Æè &•-.Ñ`[ú‡Ì÷':í´]$Ö{Ç*H4 Øy–nv^‚{Æ)ªÖïÜMÈ© ÖZ°k­™=²tI;–•Ôæœ.pGcôèÏ—R¹æÅ{ø™Àþ3_\d cзÅQ&«ŸðÖ°ëwî¤%Eeñ ¼š©¦*õ,ÓmGhÈ`(_®éVš²%™Ú{Ù7>¡úö 5·¥#éEéýø>k“üÜ–Ü}·}ƒëæ¬ü:ß©¢æ?þ“]çüÐŽ2¨µø8R¿ …é¡nIÍE­-óÞúÚ_¿QúÃÊúÁֆ݈äP%q£·BØc0i³ŸÉԵšfê~;<—L|çœ.ÍÔ¼¡h?P CN‚b¯†è‰õ;â '5¦ªp@Ÿ¦¾n€În>4Ë]Vµ¾.×äܬœ?Þ/ **¦IιR˜þåSÉXÀÄ›qùZˆ’ÁzJÚ„ÿîUË|›üº¢,0¢çä/‡35t€ U³”æFúl£[ÆBß¡ô¤×iĘ¥)†«Dåš–­c£S½¨&—ù~ã~Ëì€qÞ‚ ·'MÎé ’i½£×™Ü,×üLœH±Ï>JG¶QhdfÒù…ž¡-Kœ÷nN}®e}øAL#šçÒù•Ä2þ&4OÓýçC)YwÑm8¢ñ€#XPº° |õj@P&hwß Üé Ê«¥v€ŸŽÃ‚’æoÚŽ]¥Íù;iñµÉêV—N(bÒ?l Å Ë;®¹ ‘°³œn–#”ÓÔ/ßxçojT…%L+yçZ3gdé…1´R«ötñ°BÙ_‘ð¬í³#šãÇ©|õ½ mÅo6ç\Ô¶ ØyÛt‰Æ9—Œ¨®/´>_ Ž"ïâênHN§'Ñ_ñãzÃM^ý[,Ú—éfyÒxí4uÒoWÑ¡À>šGu,üµÁ–V¼[³çžÕ¼ðçcFš®öu¿‚¿ÞH<Ý;nLª¨€Ü´Ò M륆;¾ù5"ÅÍúGG½4¦Åüó×;™„yçƒ2Ñ´-½ ×Ãó»T ««]J6ÐM»•N;…¹ZÆ…ö<{‘Ñ2³F«þXÀàáMË!¦Ö€®õC68u‚øÆŸoRÛ|8–Öv.¹5§ ì|Í«w~í­‡µºGœ06’$Œß´«væ”?Û›Ú±ò3/^:6À/ÓÂR³^µÝì0-ýÙ/‡§ÕìË×ùƽ>v„/Ö®÷[-[Ç„~úâÅúäbm›‹—ãTÚ¾‹(VóñÖÜÇõs^'Ÿ·Iä6¤¡äTXÕ*z/`½œ†èoëZR©^×÷]ÔN¦¢äM+q{rÝ9½Iª!¢}MnÞÖôƒ40ÃÑkë:)ŒVÑÎ\ßšþãh¸Í¼†hÁçÛ y<¨¸­ÙsýçKo«NÌ;Ü©ÑwgûÖ¾q86.ÿÀ#“Ãç/ùÍ,ÿðkEðÏ/ £kÉ‘µä‡HôÎØ™©ÔHèïk…Wà¶¾ïÆ¦ô}çа¶b 3륧—¬ûq”’þ6bpéoÃÐÇ0H4Ìÿb, ’žôGÒïqD"üSB£p8Q¨O"áñ£°8¼>; ¥÷¿Ẋ$ä h<j”—ë4d;&/É—dñ÷PüqJüåA²øÓ¼y,þ ÅÁŸ Ä_$‹?Sqð'*ñ—Éâï©8øë)ñ—ÉàOV ÿ_éÿÉ…dñW ÿ_éÿÉ…dñW ÿ_éÿÉ…dñW ÿ_éÿÉ…dñÿGý}Vb¥ÿ'Gú3ÀÝÏòqw÷ú°ÜÝ4Íì†Ú|îÀúb¼Á‡ÇÄøë°D FañX<Ž4 …ý;7ú)úÿCÍ¥6T{[3”¹½•%ÊÖa‰¥¥¥‹Á8¨ÌRû¥âD4‡²çÑ8|–€ÅåÐØŒ™µ–ñ8Cˆ1Œ ½™4†±¡S@Cy ¾ºL?!ËßH‹Ê嘮}/S E¿2Ò00×-¦{Óx|¦ÀˆÅçê’Ézº8hLKÀf[3P«X>B6MÀåQPgBŒ ó%Ä–hoÔ2›‰²cz2yLiˆwgÈfq6 ¼yLO#-4þ1¸A^LšÎçk¡xL¶‘_Äfò½™LJ–'YÔ €oȃ˯4uuQË™&&`2PA¨¥âáP84MDéê‚6 –?ŠÎ¦ñùFZ~,ƒ¨elHûà™%ùÐXX¬´Œ­À¯s9|ßŶ4/° š1j#jèÞÞ,°Ý;H2j*Ã\úhDÑ8®Ú×ÇY²ø‚á `àKúCüÙîBb*þÇK°búx¹Ñ0^l®ýñ:þ̾àü¥#Ø1Ùй aˆHC|3 G‚föÞLtB(‡Î2˜|”¼/üîÉå¡ P4À³4ˆ‰/—å ^Vö¢zðŒÇ½·t&[vÙ "ÐßL üˆM¿Ô,/ãJv4Ø#øX†™Žaà<™*]è'†ï͆&<Û‹ $ÍŠËc¢Ñh¨Á8C_ðEç2˜Æ³%'…šë'ä ¯¢™û²ÐÞ↸ |"ƒ¶b/z`/Œ÷LÁ¶M—ÏòèLÉ&¤ ‚ghoh]O ¯ÔB2)ƒéË|Ä¡¡¼x4_oÐA8ƒ:ÒÁa0yƆ,/ŸGÿŸ²½îîÐѾ/-”—Ç`òŒ´°Z(`|h¾à4™Ì<ÑBÑØ@×5„‘L;μâÐ|€²ûT'ЈÆcÒdÏ a >:7ñ¡øÞ4H{ò˜t¤âÁÁÑã±:8ðEÀéëàzýklt€ ûÞèvw÷z!fà3ÀÓèá±ÃNãþ½>8– h¸ È8œ˜KÔÁ‘õ‡œ8PXÜ{°¹^ÃŒ®§/>%}y$§„Åcà=c˜aIx°`²É€¬C~P`r|%ÜkïÍâKø•ïÍ à£¼YtoXMñQ 4;8èHé+©˜  ¾PË!YÚðŒÞ§YˆÍgð5ÔësX[ÚoГÅbÌ„oìMÖÓ!àõuð8Üp|Ç0øhxº¯ïœ‡øŽ„Ó–ï€tb±Ÿ8éá¦Ñ'ÁœB ÈrÊÇ“ åI~€ÿH÷BÂ=€ÓØ’@ 9 à½? ƒ ¹Ià )I,FzÐa #FÀPà?±a&!Á»ÐÑ?ØÅ{beøÁl8øNõB kw–sQ.ìˆßFAöÅõ7ØJ hÀ•xO^èL6Û—Æ`?¡ÿ5ß—F—¼†Üi žàÍbÄßxýo9 ¦ÀÐZ°i3ôÆ‹½/È׿ÖEl[}˜>¦%Óœ‡T 8–‹ÇòòoúK^ ¸@îà^(±+%ô£¡ìd»yp®ÏûNôÿÌ5yo—m¸ktx“ÆŸX<Ô@¼tñÉÁöŸ/ž @ öíú]:>…úIF¼Áý&7…Æé¯9§ÿSth¾÷ ÈŒdá#‹-6𠓪žp oKá7@Œ¹¬›Çò…¢"XÇ)ƒq!V³ 6¼A]`lÈ_ƦB7—G1Äx@ô6ÃØ’Æã£œ˜‚`&5— GâU›Âp)lð<~ü-œÝA‹5/8L/&šÃ<3\ 8>ð,F9!¬ìAçº$eW‡Eã†é¶„Ÿ²}ðXö½>°çËãGÎÅ‚7¾€ÇòBY æo®/ä±Ñ(–Àb³QLÈÅò²uP %ÊÉÂÞÜÆÁejí‚r2µ³3µ¶wY Z‚ãO™þLñ8,_6 @ãñhAd™¬Ìì¨æ ½é K {È]\faom¶jj™ÊekjgoAu°4µCÙ:ØÙÚ¬2C£ì¥æ fSéâ¡F±YÀ™ãƒ9„ žâÑ\²j) NÓH¡Q«˜Lx9T®o¬]ß ¼jø± ˆÉÌm-œ¾DHÀ ˆGƒº×чB tB0H¤Ç h xf#-XÍQP°²\ ó}hl¶ñ@6 l¾L}y(¼> G¤È,!Ï(“ÅBy‰Õ€§¥Ë(L@@Zš¤Ü…s‘÷‘s-i»Î°"yGKªÛ}X ›ù¾_ ëIÂÊ#ÞxK¼YHCIr]p^ÎxÜ?—T’|H6ÿ¯@õ?úÊûy þ Tÿ£¬ÿ Éâ¯@õ?Êú¹,þ Tÿ£¬ÿ Éâ¯@õ?Êú¹,þ Tÿ¯ôÿäB²øÿ£þ¿žɽžÒÿ“#}ˆÿÀ]EM@÷f Üa~þÃÔáˆXBý—^àO"Aö_Yÿõ¿§ÿû꿤|©,ÿR–)Dù× 9hõ—dpvXÚ÷OÜÒx`xâÇw)Ný«øèEúèÿ±2¬?;­ÇN({ÿäÄðÓ¿kj,ükÞ+qbù0yà‡´šgð%ˆ[‰ýõZ´6²nÇàáwFZ°30ÓÈ‹u>èów•¡ôupúX?l ì;{ 5>‘ÆÆáuôôHÖ¶€ñCðÀÐõFz:x}œDÐÁ“‡žç/”Óñ8q! ªÚú¸>«œŽH Áx诿¿œN/®Îã°Ëÿ3åtdpø8¬Y¨ƒ'þ©‚:`!ƒO æŸ(§´?UM÷q·¿¯€  é@ÅœâpL§¯7è SƒFÔÃêõuôqÀCNAÂ0˜Œ Ä> †>µÀ&pÙ+™8l%T Ib¢ávD ëàðx˜é‰Ã½a‡0?ÃÌ„ÇêÃüO “?Íÿ–ÎéÅçVeÝÛ_¬§úkàßUOeËãú³ ¶ßÿ¸¸ªß½…9n «‘lå«°ú‡ue©“²ÔIáKˆúÊR§ÿ›I&ÿKÃ*Ìý^ù÷_äB²øãåý\H¼â௬ÿ‘ ÉâOPü•õ?r!Yü‰Šƒ¿²þG.$‹¿žâ௬ÿ‘ É⯯8ø“”øËƒdñ') þÊ¿ÿ/’ÅŸ¬8ø+ã¹,þŠƒ¿2þ— Éàï¡@ù?%þr!Yü(ÿ§ÌÿÈ…dñW üŸ2ÿ#’Å_òÊü\HÊÿ)ó?r!Yü(ÿ§ÌÿÈ…dñWœüŸ2ÿ#’Å_òÊü\HÊÿ)ã¹,þ ”ÿSÆÿr!üé ”ÿSâ/’Å_òÊü\HÊÿ)ó?r!Yü(ÿ§ÌÿÈ…dñW üŸ2ÿ#’Å_qòÊü|HÊÿ)ó?r!Yü(ÿ§ÌÿÈ…dñW üŸ2þ— Éâ¯@ù?eü/’ÁŸ¡@ù?%þr!Yü(ÿ§ÌÿÈ…dñW üŸ2ÿ#’Å_òÊü\HÅÉÿ)ó?ò!Yü!ÿGPÆÿr$Yü!ÿGPÆÿr$Yü!ÿGPÆÿr$Yü!ÿGP~þIEÈÿ”Ÿÿ#G’ÁŸ©ù?‚2þ—#Éâ¯ù?‚2þ—#Éâ¯ù?‚2þ—#Éâ¯ù?‚²þCŽ$‹¿"äÿ”ùy’ìßÿQ˜Ïÿ&a•øË…då_ò¿ÊüŸ\HVþæóßIX%þr!YùÿGóÿ~"V«§üÿr¤ñÿðó¨ ÏlåqÙð‡DI>ȧñ'þôçÿ"þö¾Ê­œ ER Ù‡DÖ±ïc_’­¬ÙF–±3vyl !‰ÆNÊ.†¤BÂL¶d+ëØÃ Küg´ÜºÛ{ï}ï{ßû{ÿ÷ù¤yž³|Ï9ßõ|Ï9Ïóý–þ¸tAAÑâÿþ—°µ5ÌÚRØ&b%,n!.(d%Á/"fm% ,&fÍ/ø—ˆà?×ïú#òoáúûÚøò/ $$ô½þÄ™‹äÿ/¸,-<` ÷݈Åî¤ø¸ 6k+°µˆàO8á›h« a!aa!qˆ¨°¨È—ŠÂ»¯þ¸">êךâ"øH¦ |PMqñ/5%´+H€_H„GLB$ ,È#.ÈÿM%‘ïâÃ>Å,ûZSTHŒGLX$&.À#&*ñ¥žØZâ[NÿÊãßôQ\Bx·‚_ªÙ€­ÅD~Y@>WÆÇ² ‰‹ò SYö3mš[ÛÛÚ{ZüP_ÓQX$&!Â#*úAü8ý…úVî0Ïo- Â#.,çÇ!KLô[Úˆý ‹oB«âªKðHð‹âÚç‘úR]×¾õÏU‡Ãœ¿é»(„?®®„„Ø—ºÖ?Š~üµ®‡§;Ìâ›êâøè™b¸ú<‚Âß0¤àÏö}7¶í­KðˆJà©-Á#& þÿw\¯ßzýýïêbûûÚøuý/*(ò3ú_ìýÿ—\gµTÉIéðÂB®vZI‡€`–€€hï¾½¸”2+5ÜÇY =åí¼¼¼ZZ×úúú´´4YYÙ   ááasssfff\Áy´ã¸;BO-]¹‰×6 5%y½‹©sHͤÑÄIÈðhŸ&91óXëróKxèßþRB‡OßÌÛ¨ÕwŒ‹;Iß}Cé~k~bâ—vž÷INÅÈó"ºíÍï²ÔQ²-ºš^_ƒsŸhÉþ°­=òNqLi‡×sßiuª UR6…Øc§C™8¯ï‡è€ŽÙr¬ØÓÁ¡$Èa .σjéO.Ó—L(â@ë”?WZ!r(wÃ[:ax?Ò÷!0ÅeÁ<ã¾™´5l¶Â!f˜!6ÔɪtüxÓ¦er 3 ²ýÐi¸P$šÒ$Ö÷1£öÃö†ƒ*¦MÝ¥Þã?úqÎÂgëÁ_{E¸¾ ½yÑä–¼J µXâ ß”ñ©j2«èsÒî/pº‘UÙºiÄÅ ´å>é/ZG€w*†ÆŸÕ´±K9û¬ËôœÀÚÜKÇ~ÖKXîñ·jcp F<B‡4¨#=õEé ‡ŠÐ~뀟®ïPÜùeÀHë퀭©­þbRìyr\çôP&^>÷ýÂý»1]Íû‘ÕœÇÈR¿¥îq•’´'#iÕ§ÐÏo~Í\LìÒ—ó `ÿj¸!Ë|’ÎÁ‹2¹’ÎáV:4rl$}›˜{£Í”Q)&§í€ÝÌá$ܳTK)x4 Q7è!¯^)aâö´È{·Ë„ñ_ŠeZ79Jƒ§Å&®þäÝÄ\büa|â0>‘ OÄ1zÈRe¶}"K•KFƒ«åàI·®»Å{ï(¾B=¾‚þn*|cÕ›&{XN”ŪDm'1Ì2ûW¸+¦·V¨cÓÒ ùÓ ã+'Lj&“†à.>O¦ÑKË¥7ŰÄ[¼æ{¤ùäëk^l¿4¸CƒÁgèŸÇFêß2é¾6C³è 3ŠE¥Ü É4,z>`L"] ÈÈ®‹aÙ”‘š=’ok嶺¶vtœ'DÓŸ'ñ÷©zvuse=k|ÒöþL×Ì%1%L›fªz-•’¢‘‡<.„òºB±nÜ_ÿ5”É­'é¶Xùp‰DòÚ(_†qîöVÏ<$ÀóË>@±1¯ÇŠð0àqŒ^Ð,lÚÂNä`Èchs"ÀÔ9´†-;^ȶÑYÉí§M(õs5õÄ lóp|žt¾ª8Ò©]E ŠçÀm{U2N²ðtóÏRÝNÔÛÍ´Å×8³.ž `á…⸠Hkœ_ò ¾äV&¾d  6yCi) Ç?:¼øv¡ø‚ù8ªô/Vº&÷ÈdžY: ÆäRT³¡9¿W),TEM¿‚câO¬y]1Q€Ûï22{Ñç4.+ô(  ß©GÑ ëd?^ º^ÏÛãbo©#žÓfˆÙZÈÅ‚Éú|ªœÂ¸àu»¨È8 lo&Û߯oL†kÏ,ÈBZÐ~þº Õ«‡õãÅÖå´_׸a«Æ)1f©fLZ“¶}óóÓÚ½¼½b¤¹|ónü§4@ä[ÞÝ8T7ˆw´»c+ò ÅÝçdòÙ‚–® Ƀ—s¤£[ݱ.A; …W¹_à5Ä ÆÙ@(&Ü*ê²àMá貂Ój\§ÿÁu½cËû€…y" o…ò\ϦN!¢¹é°‘DJ£/¢Òˆ_r±ÍÄn×>A,Ö!¤~Í<£½ú 1ì#ªùÈ*VŽ‘"‡Œ_âoö#[ðú§Œ¢’?ÝLõ°‰ìæ˜ri§âô¤#@«î~l6#=¾øȔܞÏH>FY?N}ûƒ¥ýRSá­éf@Mà4ƒf‰êÈ.!˜q’ÌÆ§AïÁfÕ♂mŒG{6<ëv™A 3Ušo%©á£?¡²½_p©àa·A¬†ï)ÄÇ %ŒW‚J¼[þ?nºqîø%KŸ«@’n‹}s’„¿}¤:‚N©¾IOŸ²z™©Dÿ1ziøŒÀÀÇW(ušCf9ïs;À@Æ‚(9bèê±7XÞÈ÷’¢DšGŠ1aØÊŒ4·lR ÉV:?!°Tv™tUPë­ÞÈc4<þÁ?“¦—wÇભÇ<æÜmÍ{;ÖKˆŽ(éÂGµ²YP”®Ñ¥¡àæ·S-ËÓG Û‰;Í‹¥ ±{Ì&@iW:N2m7Ž/ÆÝ9 Œ9òŽÍݻ»™cKŽNOŠ):CÊ·T^±„m'‡ú^ZúÐ~wÿ´¸¯ƒwãê¾sxS± a½AÂ9Y½ž®ÊËõØ}N±6½éžNrŒIÜgTlBp7îÓž¶ÁLÉÒ†îÉ%C(ó 'oLž?êCŒ‰kñà²Õ Ä^•nr÷ÌRmö‹Ù3HJ 5SÍ)pØ7p,³äˆ. ,q×I)š)nRûýì³k¸_Ý·³ë ò¼—›—¹1*‰Ñ'–jÉD[²”c›É@(¥X*+ø*ˆÞˆŸÀöøÅ0öBª”¿á!ÍI@ *¬ïޔʈ{8O˜Š9â›Atc¯Ì„©…@˜"®øzdö-W•±¼ž¨¥"Xriàþ„ Ï'ÐeUomNŸÙ[(ÛgÚ4ðv¿1† b®[oDÚ±ÔÎGžÁë‡@í}äs°Z‚OUž ù08ñr“»O ñb1]ÈDßý[¨Æ9+#ÂÃñ²®– =Ï÷@YîZk‚Žd„÷ >'B>½þø åºx”mö°Ð“SqW¦:µã÷£“ÚÔYÀnµo|¯1Cüç½åÇîIBõ䇫BÀi‹Ïš«4Ò\سT)ÌdÀ×k5Ú°ö>Èw — ñÞÎZÔ’Ã žDÈñø&áñ‹åGI$€×‚@ßL7ưUç­ EJ™´¯†U®6GãÙ¬ð¶Á£¾ 'rµ­îvaXZíY‹{®O©w‡wXªP$ל\2¦ãàw»vÝ8áQ[” >7(^c*¹ÿ|•-ýúÓ'œõCQ4k#Íyƒ"&ÿ{Ó­7/¢»›3/Ÿfü ÓÝûÞ† ‹!°)«‹˜h#îªî¬îwÁ%¼ àšïŒË!­ÓëµT¦0„žð;ìš lÆyÈY%’©¤–odqâ”ÀÙØ”r»³~EŸ!úDZ~¼b(ŸÐ‚õê ÿ'cƒ‡˜u·C)‘UŠ…>Ö;8ío¼º† ŠU …¬›î°?4â»ÄJd¥ ¾Š¦Ÿ%(!h~—Oewr~Ýü …\4b§–Žpß—ÇÊÉ[ކbB¥é‘Û.&/°ÕF/ÛcÙ?²`=ÜvÀÆ„·->®sz$Ë¢Ô‘‚Ö¥Í%qÞþ ‚ª‰"Ȫh?ü°À'¸ü¼8JM0]ClXžŒ9!d¾µÏ|- a:qhíãJ ²I¬-M:#ïFm{ÓUL™÷‡ãµqEpóT& jKv×E§Μ.õêµYÒ—ÌR\àÔˆê‡Åâ ‘ó(‡?Fëº!´ÏÏy<™,5ŽÈ¼fֳűŠÞ G1!$eUÒui-wNÂ3@¸ÅØ€B(𽆦£ÉØXÉ-î ßÜZ*?5óñ£€È~ôn„+ãðÕ”:Uc³Fˆs\ÖäÓö[EÓ”îcÙØîËÏ÷™›wú–ûgæÉ¬6Ê»§€9¨Äú±,ôƒúV¡¡t$ê±±ÊLþÆ÷­®¤?êK§X<špÇÍ¢ÍáùÇí™íÅSèËB¢d¡“Æ3yνáéî>*¥Oqx\í\é~‘IG¡ûN[&±EpÜB‰BØ™7é ²%–4缊”6Åú™sÑ:J‚•…½ùÊ×Ûx‰làoõ#@ªBËÍÙh“Э!Èñs¬ynïö£÷¶:_í®~H‹,ñ_žÃ†ÍS­tftqPÉ`/¹Ó[]ôT¡¸ë³F–“¥³,¿µnOˆÛ0ŸU `¯”¬h‡uÿH#wÜ\ƒñÂdÏ3²åü·™ò¬•ÁøÁIŒÑ­G ÏúÐ$×ûϾÍX×2’Bº.¼Ð08DN¬V“~l샜öKÄݽò"R# C˜†ÅöÁÈûû”Àa.ùöR Ï4l£ÊFBc.ëùŠY…ã ÚµÍ^k.¯-ßè-°ºŽ™Ö,:’ܺ;N|ëDN>–b…¹E› Ø­ðåÃóVÌÈásfôšèW¹”3¯”ÊQËŸ£Eê+vª¦U‘A–¨øãâÝ/±—‡ô¼ßÀÄìÊ ‚Ñ3#=€¦µ^𾙨z¨ŸÖŒÿæòJGS#nÞ´¶µ2=Ã=qÁdé,øA#k1Ï8AVÞ›×ç2|^”Ìi‡Ëº§º”–"º[ƒ&T™Ì2Åt^íÞ/¼ø Ð æR÷ùׯúúL*Œe§2 W†ɰ2Rrðû:ëSÊ—s‚ÓH^£;gŠŠQRuÛU³Ô‹…ú]®&˜‡i}ÚàÀ¡/nßÒNz‹‰¾=u %DÔ,¿|W5+¢ñ´5“JSÉT‚¼1ËÖÁžÁsi3õŒá&F“ÚU¡ÃÕ€”¦Q}ë8¤qÎsgnmÓöUá*˜<ÀÂu0ñqn#„£3`ƒ˜Xè´|ºj?}‹¡¯L1,M¥‡¬U5fåéy|eè´¿ÆÒ“¶óZ½*îǼì°Ç¢ÄÓm¯ÙÔ¹9bï‡/„+kKlLûÐÒA>n¹ŠÔèbg£öË£uc…1Sô[øÛlåáN%"%ít÷ŽÓóÐ>7[ì…3ûP&«JÏÊbÈU BõŒZ®˜v aßÔNI*6¤´.Üzž—<ÌG³àF%\ÄI[n•µ9`ÇÀD AnºK ãOd…ÙŒy?`ÓRΣ:[áyÕ˜+KV³_ÞhñRǦÆO>ż[*'¿ç¥^g?H®MˆÒ3žçð¯«È°ÿðò ¨$–¸ ‘×ïïy{vã͕磶˜2f옣€ãÓN·.qv»çÂ#áÓ¶É)—0öoÇ.ªYÛ=8·ùÆX1Ôèøl_Æ$ à‚™‚_Ç¥”Ø>¨FWöfæ!äcJ¾Æ<³X"]É“|0›O¾uÅÜSíô‚>‰g¤ò5ëâi½—ž—ú®=Ü5ä 5­oá«k^´ú3,‡® ܯÔðaè˜fG¶´"‡°zVS©Ò¯Wì]Î-;ßÔ#*ÌBgMÖVì¿H8Á]xé¶8J7:ÇCh6ó$E>äÔ!ì1x7rï寓Ð%÷$G}‘ü{2ò>øWqÒÏ“¢ã9$E@Ò|g°$îS«QTð»øˆ_2ŸÕ¥cȵ,Çt UâR}gòôÂ8ÆD1}ôa|ïTëC×0…’÷9Ÿ¡½ùRk¡ºˆÁ¬»S !éyÇT)–eäÍXµ–² jÉ™ö‡"^|\¿Ë¿Ÿ46ÔÍÞwBNûd¤Ló^Aà\¼Økg›¸÷BòªºD/E,Ùà÷t¤"÷£t«Ä˜×Xaq)#7Aº«ï³ò+‚×XbYÙàîW#9ý<ä:Z5æA4±Ò7 )® w<¹ŠH:{5 t¾AOסð¹Ä%J¤MY®%&\z¿C&½@ºÌ`dËg±ˆ´-¬ìéSUžÄy·Ð@€ÀHíÃ*à¢Ä<¢U‘KgP†YN…¸ò¼U?¦EóºÎî1/U\4Š¢‚hçî^Çé|Ê”|"Zn@ø‘Š {­©°Ö.éªialN‘N8Ï p¨RxaÏÁw+M™V‰ö¬ó<ô,*=O]Œö@RE«^BŒ1¸UžFlIå#zÈÑ”@¶Ó÷¢I©ýF' C|•"»>åË®êk¼æ;2d¥Ô‹Þ[Mª4ãìv?"%öò¢ ½ÜUÄ ÁEH´¹šSªÀª':3m6T€³UØÛ-ùœ>U |»%à=-d˜ì\ÌP?f=YÂî)ßéSg—¦É‚ë àÏ#zÛ¢O_œ·ê€zb|ØÎ8 èô€$ÆmNI¬ÿû±¡‹[ÎUÝÏ×¹Eñϯ¨Î£ÈÎ6~lL—ÎH:”>y‚¼¡(øéð³mOÌÈÃŒÉÆ˜ÇëìÇ0aËåÏVDÖ(¸y&AÊë.ûp¾dy1ëaZ@†:(´•kŸ2òý[º—ÓdH¥+ˆÍÐÐTb°8L§÷(žÃÞãÛ¬~ºj¯I**¬öÌYx) Z|DyÍ÷Àmy´"®lÑ8¾qWS»nÏE}JaÂú~âb¹+ô΂ø…sÑÅT{€’ À|éÑĹ ‹¥r…’J¡ˆMÎ×ÁšÊ§°¨`íÈ«(—¸ðæõþËI­Ã)—µê}P›k( U.AO¿Ån=~<Ì9—Sx3W’šÝ_ÐèS3‰ƒ„ØDi¶3øä3 ·&+××ÂWý“ G9œ*œTRÁ{”b Ä7»º²iiX€p§ÊŸLß 7oíµÁŒ·'26uо¸Ó³µôÚËŸ–.ά'íÎàB?ÏàÚ«ºk.Ë—$Åe‰Á9×óNrKÅ<|2pÃÖÞ·jÿ1; šwß0ã0y.æäE É@ÃKk £yЂO«6—Ë¡Šûºc6¯7óJJÚû™šÁ%ºy>b¬%Q¬d7Çç¸Q2+˜õŠž„­…AEZR1öýÅÍ V:µawÑRý kÙ&sæcO®ilðuÕòÉžÒÁΆR íi œÈÆ0fd¾4 y@Šù½ ÈªFR«—÷ÀcX×’Œc÷.«À‰Ë£b޽¶R= ÄdÛµØà¤Âq#w?$\GnV››ûZÈ4Œƒ(Ààܵ޾$Íràí3–µYÎì™k ­ì7Ä#öBúå!G%:V[<ï˜Ïef-nFí…Ì,Z !T}WßÂ(g“ye&h!¢ hù·1}ôä‰Ýoêž¿c bP­CçKÚ«½Ñ¯ìH90è½Çë!lI³ä3–[Ÿ3Ëa19‡Ð-Cg›Õ÷€éyçi «1ÃÓÕ.ÕÜÌ&&0¡¾ØwÞB¸‡›Æ•/´èzè~£Â ÂÓä¾ÉЊZÜÓÐúüµ‰$óz¦ébò[؉0º.Ì¢o-e%FÂÈ0'é.™}ó L:+éQѱGw<Ÿ˜ž/¯(N3ZoŒFDGŽg„Òºà†ÃÏ›˜Ò˜‡$›ÆÁ¼ŒµN§Ü ¯•’ž>qÿYŸq<;Ÿ7ö"6µ?š Su_Rí€4Ku«Èi†XL„xQú\ÌÓ,¤qX[w>Sä¸YŸV&§¥NhBa».÷N³4åa—lÔ+Qïü3›d?ž‡¤<5AùC",]Có¬…ú„û¹¤•Ǩ“˜Õ…K÷ÚÍ—K´ ì£<Ãhfü„ֻŀSàz"ï~ݪ—ZÑ d†Gg8½ÇÞ~«ÒñjšsqŸÉ„ZYƒb¨©Éƒ‡Ó—EM°:w<¹_Õ׿ۤ ÿ€µ÷hêÂÂà݆ÓfA˜B ´º×¤0Íá×gÒ5CºoSÊïÓ%˜%æWÄzV·rQN‡õÑl%lQ!Ø1ýˆêaÆjHOŒòõ;úNêtJ–HÀ/TC/xS§»Ê’im â ¨és·â ØȰIpF"O]ƒŠ%ê6gÏ*åWsïñÊR “Iî¾JŠ¿†ð,ò )6|{°+Ñ6ȇúg§œºˆ¦lÔÄŽ´Ôû¨TÒLS¯½ºˆŠz6hÓxÎÌ{Í%yõ|Ð&«ó$OÕ“ïJVy0k–Ø‘¾ñ—¾ýú3£ò`.õTž„:vKÕâL>®¬¼„LuOdÛT£œ¨î ýbÉ~yõcÏ6õäš¹ã1cå$)ɎȨ°X4—½g%gèP¶Í›üxOâ ç³Ä©wTåIxsâêÖn= lj³è‹ñl©ÿQ¬Á³(uœ¨œo;øäyj¦@:á~™ößc$7¦o ÛÊ],<ˆ£ É{žJÆ¿Q5ÞzÉ”VÂiƒÝsó¬ÕãØ——F¾žÈ;˜1©õîŒùkõ@à¸jÑKäuôóp4ç} ­gGÂ,ùÙ!Oqfص0DV("óU·«À y8ÕQ$øåÓ ‹ÖÇš‘RôP.m.·,rÚ^uäݪÐV—tÖ²xBÝ3ÈüÂâ–Öâ÷k'' ¹Â4üÙ0öÞÈ[²Û.å¥É²Ø£Å˜`Ÿ'VòÚ59ÏÏ×öCøŸ‚{ÌØTé™S¤~ ·…«Eý•;‰2&楔0SíÚ˜×ï©t§y!>B™ Ú>.yW(ÄûD?ëÖCÒa>ÍÕT:™í"nìÑ^LõÜnò¾šúø‰±¥œ¶là´ûеK­£t/Uçx‚/ö?³D/£€HrHÀª©¯Yi¥ËD0"ÉÆÏCû²q¡ùýbI‚ *m"Á)àKw6´ðARòƒIöÂÄHD±—בL[Ëg¦ÂqÆ4¢ò¶6ýø*¢Åcòd C‹Ðn™Ä˜ù‡!ðËŒ,ðÕÃøš=e: œzmIÆF”:B!)# Îü¦|$‚ÐÕÎJŠ%Xè+(…=‰„^\}ZCq;’²Sœ›© –ök A‘-B¹ X×{‘–Hý3’ŠOck¥LØŸbhÙöcJ£˜!wã2å›ûrMÏȺ_Ÿå%Fò½Sé°æ!xÖéþÄ’ÜW,î«B 6®òÔx–Re¼½M˜Aã4B?† »?1RœÅ„¥¸ˆ÷ZÁ`ÂRgɤöƵtc†ƒ¹‹PÙu¹tR·ÅK½7§åuCh‘ûécÊ— Uqûn¡Õ)oô]• uî¹ïjnOn¡Mú²h…wûQB§æØ2‡u©Ž ¶”1„û®Ts¿Äœ¬Àq€a±'t6dËRwZÁ‰Áù´Ã¶—Fä:Þ>s½ZÐ~²oL9xTñd src¢X»{ÏøÍÁáØ.'t£<” 3•µÏÕÜéÅM‰ÌðÐÚó¨N-0A)ŽVèd‹¿óÍQĹ«{²ßó ¡Ò{šµÙ…ƒ`@9ª¤2‚s´ÊÌî"[•£™Ò4Œv”Hâôq…8RV.ˆ~¼™ÿ +<¢öª3º °O1šI¬y›‘0ÛRA»²Êrý(7pVUó ã¥|¥éÐZ0Eñ\)šIpiDA[¬"ñòEZ¨ž¡D*QBœÆ”¯ KÃ#•jfSJxŽ½ãº¨Õš×§>Ê$¹”©¨-DTèB¸±ïãhGG*ÔÜ^b #aºúa±µPJ)›êص‡™áùœÕgqÞ´_Äv›9†j⼈Ëñ–¨Ã œ”ð@#ÝÕ ×0öYoLI8)®ny _Ì<ûÕkyS”âhÆWÐ0žôSs&žÐ—§àöŤ–Ù¶½ZÚk¶ÆÀ\VnDZ$‹Rlyá{¶[Z$¡š-9ïŸ;i´CV!4Hýü«L–K¬ÊÚà7­ÊB¾3óÄŒ›g鮢¹'XnGÒ9,Y*w„÷q£:%û ´5œeƒ™\–2•;.÷)FAó¯0¹~¸}h<} g{¢h “6±±#hp†çüÔDšGSš;Q–V{ÝyÆôrÿ5:äþæÆþ6AÞB˃—U# ågP^²‚Àز[¨²ZÌ8Õ€ÖvÁ܆ N£¹U²>å!]Qé(ì+@uªÅDÓ¬Œ€ÀîXOKYf쫲ó¹†LO7G1@/Ù­T"†"qLÄI²Áç™ø9û§™,àK¸Mñ4X.|È¡Êù$ÓR¦ª6Ç=Mh浃ȫÍQLF¾‰!Ôðs%èÆ~ ¸%Êé\ •o\¯à-ÓdH†|£ÿnsÊ^€N® éR6 §ÆØ¿È£tÒIËŒËcBq›¬H>Œ¼Vk”>ÙŒŸ1Å‘ÇÄFK+À§Ïûc«Jçý©Ñqb—I]&^ŒZ*ÃËãkIh™}—å:¢ñøö—h”¦ÎöŸ kÛá"=¡¬-zÃùþi¥µÖÖŒRʽi“ÉwÃL)FDfËær½ÐHU&óÐA?Ž€  »ì{=z› 8$ͧ…wêN–ÑYš¸Ì䯜P¬V·In‹F߬=™™°ÁÞBê6ëw3௉ö5|ËDsH­Q9n'½röé¹…ý£ìÑÚl˜Bq§òúèž>Á6ˆki82¡|Zä´k¬íd.&•‘”4ó*»hø¹IÃacV RÌŒ)g]4[ {t5h.`ÀïÉt¥OÏ5ù„O{^LRô¾’°Å„ÜaŒCŒ4‘˜‘ÐÏÔã¶Tâ>t1VßDuÜråÁ…ý³nnÍ­–µ 5žZFÔ®áô ²çc£H‘!Ò—=‰²ÜsœÎ½?¹ÆäœiÈx™_{¬$$N²ÂqÔ½YušYöllÔd™°'§QcMð‹Ýºõk$ob£ö#…9o¬UN Q+úÖ&úñ×¾"™r[LOê)»ù 8Ëbø‚Œjs™¡à1Rez¼Î 6ý‹‡Âq+—ÞËÊÑíZiÿadà–¿·M6Ó+‹@Lùc]ëŠ'-u7ÑÒI0nçÒ{Ùá™±ÂÊF¹ô×øL'ßß#‘õÑ?˼ĂVOy¨A2z-ó¡’î¶*…8ÓÔè¤Ò<4vhÐñ™õ„$ébª¸&çc#&·¬ðÊéü»üìo,âíÓżNA±™E‚a}Þ7øš¦b”]fˆ\0˜Wt Z ‘‡‘A/÷Iå^²éGŸ2:Œ„Šœ€12-äE1 µó¦gÚŠáô&äI,ˈΰ¥*¯7—Œ‘4"ªÃCͨ~3J@¦há$¤ >Ç­ b…"Òö?–2SÂ<®{¸62ÕX¹¾Ú4›¦7üø.æã£€†ùuÛCÝÌ2æ;© ޱšú퀺5ÞáÍ´5“е–Y”"J|ß¼§×z)ê=È ŠfóÅ¥¶¶âÅiãäÅÕ±>18~ýã`AŠª¡övýΖ˜·BÝfëZl´vÜyx{’"m)(±W^ÊŒQ]Æ›g@±™šMÖ†lÁƒ¡ó–Ã/¹°Kib÷/­ÍåõRl?;/îªô_ºŠ4§øöÍz dø¼‘­m+él×o1;m6š{£­d Çe&.ÑÕ¥°&‘Õº“Øý Â¥™Ó{2|^/ïôNí½ÅÌ¥­Ü‡n—>À·¸Q…CkÖ+¤ñ^¬Ê!—ô^„¬÷gìy‹ù¶¾RrŽÉ~13¬$ ¹r®Ç2Z}OêrRnõzÆÚÔÖòÊ»gïžÕå¿«@YÉ–¦µ+“‹É¾,®®÷_0u¬ºˆºl­Ýš@ÁlÊ¡åÉté|«ùàÆµgÿàÒ¬=¬Õõè¥â`.âë¾#”€ëì;¥£ºGÝÛ9QC”‹Å—¡ù‹òWI!ü«Øø ÷v Å…-%PŸÛ§ÊN(PDB5tÒ’g°€ú΃ƒdQͨ½–äÀt†¥BqáéSO—öëí±Ð^¦;ê›Ù[ÛpE ô ¡µ×B›™Ñh Õå>>¢H‚¤ÍZ£`–˜È±>u O-r¼$‚ò±3-ƒK¢ü›™‡ãiˆö»Ñvõù†85YNæüWÎ…ÞUÈJXzd„¸Ê¬P›DìxP “ä1Â…`iôrV“aËùòÉHp]E é…ƒç2m‡Çö^†"¥œùöHò>ž 4P³…–>_¾4fæªHšb=N¿cd(≦O'%ü¡¥¹ äÚ”7…ñbŸš]ëH„ÌÍ^O»Dyç™"ôÆ;PEÒË®’2gÓoFTÇ€ËÓ×Ù~@Â@5#nf/,ÝÑ OwñR ·ˆ¯ ú¯™nWõ W,ÅZQÝf¼5y–b%‰ý5åOE_•(q̤å0àó Y5–)å†?ÓòÀÞϯޘ<Óñ8áúaçdê%ý¡ûQŠhßìSÕ0¨G%`0;•ÆÕÖ!ŠÃ½äùØ3Û°Q{ÁÅýJ!æÃï¨ àËØk†ë×Ùýš*˜ƒ$‡†Íƒ|*êvª uÛ·àæÒþӃݱ›b{ªd!}ÖÅACÎL2…ÌA.`4¶ÇÓm;ŸZ^Ç–èÎ0,©Ô‰TÝ÷aÍO›U:g®÷ Ü|—¯¯‡8ňU2Ó%j67ÆS6‹Í·ß±¿a”½¿ã¾.34ˆs÷ÅÖck4]V–˜i‘k/÷A¢òŸD·rÓ3äm¥½ŠÈéƒË™a_‡ËÁýÞÌ—¨Úú€/>¯ž¬qŸ¬E`-¤eáA&5'67¯f­¹"î8/1Ký'TáIÉY¶íB dK) Ú¢óè•+ÉÅEǬ^;!ë¼Ö;ïǓ̥sàŠ"´”saã° ÓÒÇLË”…a§%YäÎz›V JȦãißéö†0&¸ì„£ÀÌ “Ö–u‡vÄÐêuÆóäPÉœˆGyOÃ}h0Ôy¥‡¼`o¯\GYij1a5ã Š±Tkñ/­™üÛÚ³0ã0d³‹ìâ1w+p¸S2{9ZS³5:@ it˜7E·ጿåZ0Ï¥6»iا¹ÍLYü.+V&OrÚìf™éu-…÷‚··75-(«_¢„îOÐå¸îdÆ DÕŠÅÀì‹]b´PïÜê)ò†ÃÒĹ:,§êU&«XÕîÌ>J¢ÀC¨VÆy¡¾@]lzþAv[ %°ÙÉY£‡ƒ1i¤@¥¯æZãcÞÕ¥-¡í¹•ðÂYç˜d¶ÅkhÊÑì‹ÅWœx탻éã}h­$S¸Ü®ÖŒrc>\ú¸ÀïƒRÇÀÓ™4â.öË”è@ Ýéô,E,æÎë*²FUMEì#£ˆcHNzC‚àÅè4ópò6AqCm9LÎ &Ç~=ÿðýblDšaáýpf‘­@[\»/#6Áê²F›[ÕKþ†"PÝúB@V¨3Ñbc|ýô ÔÉ2e]ÇÎüÁW9V6£pmCxþ,»• JæXI±+:î6¸Äª®áCi~ÕØHªP~¶£” ÃÐyD±q¸‘…™Ïº¥UlhZè'æ ¶¿üø•ýéÙgW Î« …\¦/¨¶Þ<” lÇü‹cl´ ”é{šÝ#ًƬVÅȃè‚a…øœž®Ñœ¸'Éh­#/1Ý|½?ÇÂàvúeçfŠOD+»6^P ‡Z=¶óaOÚר±¦÷"úF¡ÅpƒIJÿ½8ÚñàñbæãuhG(ÜI¢9¸F +èw˜`qÀžß9ËhD¢nLAF »@Ù\‰hC¿V7+Érö2¹7&uû:aß½Hf7O/©­Ú¬Þº·J]›E†«l}LÚTì­>Ý•.ÖÁi>XIoGÉ¡;~ºV‘KRZØóKå78ž¢¤·¶²z«3Ïd›r>÷®ì–¦¶È3¼oJ¿¼ë³w+$+'𣻩|MÔ¸ °¯¯^›odph®±)Â"Dãy9OµßmóÀ Ü$]°G¼(QVRꆒw\Q3f:M:ÜZC~&jÈTéñæ™DçàÇ{_ÕdÛ(p¾tˆ‚¾Y7¸Æø8œi­"K&Ýzéh aæë¹ÁpOå´rb¿ùõ§Ð£j+$"þÊÙó™X1Û"^œÉz09sà‹èÑßíóetï(H€72•Ç=%jW•_×ìÖi8i¢±è;ïÈÍ3‚—|÷c­%ìžV1ú,lãÔZØ}æ{«¯>y@m~½YdfŠÍx’öb>-K„qcÇÃ,±„‹„ýFÖ£4l¯xº¬‹}/Ö )ànYMù§ WõFÃI 5kŒý14™Õ‚öþo•á÷p„ª;Z¯U¶u°œ‰º\øÞ¥K5ñˆÐ¹7_cŠí¿¨K)óÍË\û!µ#Ñ+’ŒLŠ1öø ®«hõ+)†÷fEoV¬s .ìûxh>ÃGÿöz\³¡ƒãíS$±ŒH="ȈúÁ ¢–Dz×ò,âY`;ð-¦›‹P¾ØåeÐQ¯ì€L±®¤*™·ïÅO0 ¤»¬áv²‚½íôà ½è‡7n|‰‘¯ Øý„Ã_æ)Ÿ¿‹¦ ƒ<³n$2ïwO(HP0W¦…ܪÖç[õ‰KzG«‹èSú b¤âöÔPûí%1$:/ÕixsùlVõáW§…•Þ—³š …*iŸÓ t|l›„Ê)}v z{:#|¿ŒQv8JÊûÝÎáÎM{ž{e:*tgkæ³)MM ™Œ±î±}T—öÉ0bKÈúÚÃyw§SÑûÃElÙíñ숡9ëÎýÅ̇±%J54¤Ïì“r&]ûèrŒ?lHJg–‡wLS­±m>š4Aæ¥ö0VG[!«60(½Rl1ãÎÆh1MJT§äð¶ÿÇåžþËó óTæ‰ ‹šÞå¾X*óBpïJ÷Çí¶¬¹Ñpí™çÓËÆžÚl£f#Ï„§/˜íào8%í?C†uqñY+†ncggûh‡}¿ìå¥À!õ[WÀ*€[ÄYLû]Î쩊ĩÜ.+ùÝ“"èÎ,\.1ûÊ{7±(Fd׃~aÿ˘¹’A{??¯.k© ÒS&÷6» f;üLðöÛõ½x‰ƒãòqQ,tO/œny qD²ô‘9Þ ×<âz/‘EÒ³h¬ló±ô;¯n6vwæÕÃú+ëƒÞÈiµôÓ½¯Ú¡›é±W<#ÌÅLé‹èi‹ªMf¿8ïU9A>+%|G¯Þ)ù8õ^õÊÙ»§½6Ià,fsLS=2Yþ"ÇjíQÓ¡´óRuz̽Ľ™ `¿ÞZŠi#î Ç¥zµé07qó_¤·ÑB¯ìƒ’¡jrÀxÖ+–QJ¿ÆÿFÂåRe°©‰úN>ÐÔË\™EYœIç1ôÚåº<>_qÿÝöÆ|ÓÇ‚¦¾Ñ¹Ê™Áã@gDŽn7†AŠ©Âf]Ó5+©ðUW §ï-…aຠ¼vA>ZÆ[ЩГoÒýI$´d˜lÄgói ‚ vìhkYUžÂÕ˜¨{‰'ñ¹@Þóša}¹b(´®^ßÞÎyÃt³ S¥V82ôx-N¨krôLä·Ì¤ŒÉÁàp¥Ø~æØáYˆ¦Èn¬ÞÜ[ì«}¯Œ}EêrÅb‹WŽ2Ûð^>òëi‘è“é“ÝØjÕ…Ç̹=O¯ñ¿UmZè"f­Ev# w–Ùó†÷¬<Rœ¤Ï‡â&¹™3Þ ?ÃAWmÚ&ö˜ã†¯ñêƒÌ¤ÇY“­ €|ñ hÆñÕˆÖn„ÿV.ûwî7M '.!8êû£«(±¯ô+‰²Í f[ŸŽÓ½ô¸ýf~ÛªWàD¥4T‹ óÞ”óS²Z„Üá¿$ÉpSÞ!UÇž-®ï1§€§=Æ%dض ø~v{¶|Þ.T–¼ ­BFXd ½©iV„8Zë…,Àg–eÒ4sïdžþùxò“F7Šeº°jt!`Î{º¼³¾*àÊ×ó/U—¤:'ÛfEÄ骒·_§‹So•¿s%^»… 5gÈ Ëuxz$@ørèCsnîN·WµhׂÎéœ{Ó'YH_ži#Gnœ¹‘l'¼fŸyté)L g •xO®+¦O>s«v­Ý–v/Iàã¬-V!So‰ˆ–|/2Qº+“qdî™ê˱NjB~o á7fÚ=‹/ Ît—J±G“ÈwR‡HAcm:Æ"#Ü×TET#ïBBÚ›3‹‡.#òxÆhB³; kg^!†Êd¶ØNnoܸ‘roiIí£Sp•'é¸áE8>AOr•÷u^FÊ%›äùI\ö›w÷dL¢g#Z÷ '‡g§_ÉN¦3k¥\…tZÒB6àÃ@`¢JpÀPbˆèdù@ƼùãÕîçoXT†df g1¾Æ«Ùn~[ú‚Y¶ž§¶ušMî=á{9{f‹Þk=µ<ïÞ:còj=Úã¥Â=­!Øo¼6)‰$sm-¡ Êk–ºÉÃùý”9½_žt*%íë: OxËÉuæ"UõðûƒáPP©¡Jã1ÙamzHy¯Ä±çiæ^Ý<†Ôàäk©G!]mН³"ÚÛãzp®°10•¡Ë1Γ ½åT‡‘ ‘蘃",Ò.Osfz1_‘=ò„ë¥ðcS6`aæÂ«¹% ô§öº'Óéµ j ÞŠ.>&›wwœz; ?ü|³‹—S†ñÎ!rîíü8Qý3¹ºLb§€Ó/¡,Ý¡k¯Ël¯"FÔJÞ9{/lÞw3ÉP¡ˆë£<£ÿjð )tàóqË^"¸µR¨k¸Rçú$3¼uö€&Ga¬£·@9u"Úí^ß}¼8÷žâèäÍ£ Ž„+Â1æ'Ìwfê÷NEmæ OëÛlœ$1'AvÃIÇÍwÆÅa hÅIwÇèl¹YŸ^´ª”ÔÝ*ÅÅgøpÎfzeYðî™ÊN‹E…¬pôxÏ™ñÝqÞ±ˆ©Ò{ñ"Áç\£ý:Ž£VI[¦ý FÈ÷åa`ú²µqÇLËá-gsÊ˹©±®)HAUN‡*Õé€Ü AM=<JGŸ…0–Þë“7nWÖ.›¥Íë.‹\Xhîp^4ÌlºÁA‡å÷w¸û¶ø½ô-tŠwuOñhnÎÞ"”Uï5bäiSu˜ÇÔ N`¥uëÊílR›×ÐAn™y0k’IÓcºëÏ’Ât6V=,‡n>™:›®r-’E¿³³8€¨°·Odëþh)V(5|t[¾À'ãXäQ€ºEÈ+¿Oónfÿê> ¾n£Sl¶T)öäI¬¥°ÿ¡^@÷d†3ïö;kýü÷ ëHˆe@«‚eöSfÝÚ”©Ûÿq½¸Ã>lÈ×Ué‹…÷—ø›o÷¦°Ö‚­iÔ¢U£ èd{gÛ²2\_HÞzäy$ šÄ˜ÕÕ62ºøÖÛ¡ßÜ”ÊX"d6 \Þœ[¯s÷}Õ¦[a`_ÞÑdˆÎ²]¶Ž¡YKG„k<¬ßƒìè­DðµW0 )’p°n®E‘ ›ñÑøTF¡à¯‡co‘Ÿ¢† 9EyMõÁsÀ Ô’%GgøÝ»w”É×V×7OÔ4~ JæU-®5WÂ(cÜ«÷Y¸ú%Vˆþiç#{·m¸Q¶)D®,¶èzêøŒ5‰V¦ íµÞ'Óã•|UPQݳúr°B½™%ÃrÀ“igwìëGØõ:5싸LoЉã~¬}…Ìþ´Àúg­™ø37ÇÑQ]Ÿj¥e5½f8jïWÞÉ2LXÁ9©7d&Ò£BYs0LçLºÏV{Ø©L‡ódÅÑQe¹ç2Äj÷ÄàÝTÜXæ;o0@ò}äžðSÇnÛ_0ðÞ+®ÓÍûŒó©e£Y™ñÊÍ-g³Fç0vijú£ý±öõ'¯÷©Íìeß T5.ö ¡Î=2m–1µ—¥Ð°pz“°ÐaL4L(&‰Íöƒ`¨3’0QÄûö)ZŒ?Ú‡3Ú9¬„yf·zAµK’Ð þ4nç&“Ö–2¢›oê¹ y+¯‹d©D„ Sxµ.| ¦”‘ˆ#§ƒ…0÷PÚáì ÜÈž[H—æÓhz³ã‚2Id2ze7¤]1äU1Tõ‘Ä oU9+o¸ê!\½q¡xs Õ>û,tHnÚ8é›Nc–F¼õ”ƹŸÔr™°·» æ"?ÍÐòÖð(ßÑi¶¡¦tÉÁ„),­Q¢G–*»[ñ9aŽøÞ¿¾ÌI[‡¸àAý°í]n.©B8ÓÃÞ—­JKmg¬à°äddÏ úÛç™R§:09¤Ö¼¤Ò*U>±èª`þ¹bSùyl·RÕhOQ¶ÅòÉ R+º½/Ê^|œ{êøÂô8ÚDÚO‡úñÀyöþÂ!íUò9Oá§Ð&’~^Þ’ÉXëç'jûåWüO?̬ô\Ë?P¢EŒže^ð¨5¾®mÁ¥“áMEæ‡gDï9/;ú¶«è IÛ /J†¥n‡&;cß^Y-Ó»¨¯³ÖÅúÖS„ŸÆUVïŠ3öŸ‘¼ç)v‰˜c©7»æ]½IŽZ¼Òµ¡’>î’­t¦·Ën®zk9éßÖ*¼|©\*v‰é탃iê)c®?W°÷Ò>]“hÂܽÀþÛ ‰Ë À¨º¯Í1…Ÿì–/¦ãDIžTkJBÐ(DÅ÷QžÌ«[¸lSœ¯ÁûèùJWTÏ Ü8ÎRE»Á~TÞ0KžAÒµºª[Á…ÖE*Ñ;0§=HÏÕ^‚æ“wZöQêj´\kÒ£=£XÐD¬˜¯C“*Ú,ûf1¼‰H ¬ÜLutÜg%¦’Ü#ì%¯ÇNBrŽgªÂÎ>tbä$,é}«!—Wzü"k„ú‹­âëÐ&\~þÔã¯-*,"/I6F¶xÖ¤–j9¿O$ˆ~/@‹­œ;dp,ƒ‹^³%QdîËYT$‹w'²XŸmìă.Z·ôʳ«ñØK\ôs O•à6˯e°õ½¯[>ÉJŠMlø#^óË qèÚiÏv‘¥b¬â²ÝT h>8Y’dCé¸LHõá¸ß YÃ[]1ñËt[¯v_йÃÇqé•J«ìèËŽf¢)Jòމ꣉!U’wn”§š;ÒAøW£¬¶ ¼V0v(]Þ q´J}“CEÉ•±„+N—2’šg˜tž]fïmTVþxÛÁZâÂYBHzŸëçz‰Oâ†#]fÒŠãžñË-‹;&H§ÃȲ¥ lhîÆÃÞkÁó´Ï1°؈Æj¡Irv™ È·Ÿ¥DNè)µwÁø¥=Ê…³, =ã¶[ÇËŸ½4"säT)N#á.ã´ì®VŸ1VÖ5ÁÞÊ—“Î!`´gÍe²´?øP7íš+kjÜ¢™%°Uqñ%p>±ç,Æ«|ºÀïê+Ë Mì«iðl~Ë5j¾ñéªðÞ=é÷¡œ&Wè ¦aÅ ÀÆ7Æ%é"€rFÂ$F¸‘C_V¬ ë¹UÀ÷d÷Ct¸|>ÈÇ®ò0Mn ³-E©s¡ƒxN蜌ÖV @æR>avœ<] Ž,n õìËÍô@DN#oV²AÞØsWœûÉQaý·נݯR­Ç…ivôf×mÃìÁîT„Ý”Xý =%LX—¸ß#JmGhM3… 4¯Ñd¡äNØÉ#Y“ QO³Ð#áRX‡Z÷×ÓÎ/NŸ²:eEŸî æ`þoÀŒ)é½fât,€2x˜Ô5£XÂ.B‚Y©r (y_Ùöp³¯*!ŒF8=pðsÊjxJ}¹ó¹9‘<Âc<ÚáD­>~ZdXGroVïf „kÎKø‚íÑK™ { 19j’%ey vhîùØ U¾Ê¾ÁÄÈ™cÕ‰ (åbËì$q±SP52ÿU çu½Ì¦uÔB‘7LL"¬‡¯>IÇUäP‹éÏÈ;ï Y¤ÙãõÄ´È ‡-žæ‰Ì0äe½k¸×Ö´HCœƒ(J)lç–¡ü(©"ë \ÊT÷ü¦ 0æsxwuè´á³±{ãaew®g‘¾÷DGWÛ<~Fß6Ÿ €­H]U?û‚»ú”6_Lõ¶n?¥Ÿ ~Ÿd"°<3ë(d.ãCIc–BìëùÖðƒeÃã)4\²Ä4˜=r²5Ű-Iábs•?Û[«•)Õx%µ¨uÙä•——ÔÈÉPy‹ÞÚk KÒŽzF]cdÈü­Wfϯæ"âï2viÒŸž/ÔíJJt¸Ó£ï¬@5Niq>ê!¬v[Íê·Ø}àÒ•$&æÄR›Uàú½3<5¢ „úŠRå‚\3=ƒ!%eGµnF#žºÆgjöw‹xö¬ÝÓ¦ÛfÄÞ-AÓ¨¹‚ðê|P–Dßü<¦0%*l/$ß ûtéø}*å"wTÑ!À Nû•ÿØçMM—¼ih7WBR¢ˆîz~Ès}÷ÜÀJ¹ÁØ(çû;©WÚQ£9Rû¯ Ý ¸Kw@oãe¨´î‚„Jñ}ýìtÁD˜Îöñ-t±L%¦ÛþzÕʾ7˜h™ýú“æ©eA××0†,CäÍüÛ£† Åb‰#=J’… Í4€ý„'“†ö9E !päñ$RÎE Ù­{)ßÌzä®Qzx]‰ÔÕ!›ÙûKMÑØ»Vʦ{‘]À™{ªÓŒ½UhEèðq¥­Gk4‹ç2ze¦-Ze÷dJ˜åd5…R!Ÿ·qB5LËmŒˆ%Ej]0ÙfQî°ï;a¿CÛëÉÝáj=Hí´†ÓÒ‹šÞõAË5£š«1β۞uuõÛó!Î;n~þ†ë.~Àv×0¯Á÷¹ûŸœÛBÕ̦¨ÎlmÍÌ®41 ×FjE+œ†ë¯Êm)€¤îh?4Ÿ>E…1KuÞÖÛ–û)*S×*ÃÛ'VGyKÝñò=vVZeÆLjFÃWÌù‚šÐ55+W7¶–RÚ:ydwÊA+KšÞÇ&aÎXÓ7äØcÆ3{¯EO\= K…qÖî7[ÅÌÎ?£èx½ºéo8/ê3Ð s?v2onìäècÄì†ej/-%—Ârm.Û´z§-]p¶i2c—©3BnÊܤÍLbÉ.–K™Í¯m†ƒë·–RƒÖ+½¢™¸œÝV¯/ÐPõûmŸ”õl êèusj&½ÑJ D?š{*’,çWÜ4ÊH²È*V€§œðØ™_It.Nnt>$³Y!Å:TÚ€eq}°hä—š0·V(bªgžê«h{Í v%g$ed«€ÁÛ®›ðú͹bž™›˜òV`=ãþý¤nÒ£ Ãùœ€h{=Sç›ÕÉúWv¹úH‡Qxq›|ÍñTÑú pnr€ÿ]óñ)ž›‰œu¹EÙ¤â3yiR^c¨,š {ŠóH·÷ssûq‹9”¡„0Uê&æ8!­q¯6[é9áì"l„§”£„šl7Ò@œò^ívDÕ;hIÏÍþx.ú¢ ãì52ˆ{u¹Ô`B½ãÞ$ën鑬Së´‡ôN÷£³víÎPï¸T]-©Ø>€Ôà¥y"ü Ò¥¹"ï¯;âx¿³òí~1¯›Kêшg›uö¶ŠHBéc8;’ãpâla'ÇóKWæOÎïe{5±•YžØƒ·#7ϼVo ¹àïbÅ/µó€õÑh7œ3,òvÏÉd084rì`ä fäÕÀxq»(Ê^ÝðŠ~*>¯c±XÖC:o%k‰·gzŒ­‰hóS¬Ô2%qÛ¬gS2îêZáóLÍŠoW„W”è ïz 3ð|Ÿ§Õíg!L9 “íç?nLšB"ó¯Ú^†ÂËô©É§Ó;ù* "G¢Žl+_è\Z +_éŠVÐÀ¹‘îå&çðìÜYª›olÌžYôŒ5²Æxö2“¨MßT>[ÛÜu¼ŸÇ«*®¡u»íbfEKCðNû ca~t}CÛºôF›g{VYw é¡x±¶K qY½~Ž¡‰‰÷ÒNµIν¬a ­Ùr¼µÏj‰÷^W„¨ßBª ŸrË®7â&õOHa·Ë7"CwãP̳‡LÙ¶+%Ô4€ G09ÒEi ¾ŸÒÏLBµ£ÈH;1Ê-Suv¥K“ÃC{Ó;»–Ý(ÕÌË£÷"äŨ<]¨~$6û<:‹¸®HrÊ¢–)‡RPAµ^fw›pDžbÅò:K—€ßó™sO²8ÀL*טzA.¯œšQæØÄœTÁ´h£WÞ¡g  Q Ê{˜ßšêš‰½Ò"Ý-£|ÍUµ÷ÙR3:*;ºcð _@c×ö³ º… ¸×r~1è¾µ9é=åZ—/¾k‰"C~'}®áH& ¡ Ú‘/ö€)ç’ô˜–ØR é\V8“Œ6†*¢7µyáq{e³2„ÉýCm–!olN=Ó¸V$”(’hÔ´ê^8š‰µÖ/z2r>X WïIù¶RX—DÙNü¨ÚŠÀ^ÜœFy±Ex5n-·éZ0}— ha×J!h 6®ðß•:¤8p:púZÀäph›il § Vå üfªwB>•ü.1/*Ìi²11èTFïj%0áÃ2¯Ãúç´IMOOwÐf4…^“<ïabsq«•ÚÁ—G ûÜ=]Âvø%ªÕÝ´|}-ºnûÃ̳‰‘²öJYói'¦aÿŽ„OoñEòå/[aÅ—²¶Ûµ^ʺc—öÎËBúy– >Äî5a* Í\­œ®¸½¡6Jv»ác#TsPB!·™Ò?ø± I"åçýÜ‘6޳«H‰þ “pý»9ÛþNïe=áʇY|í|˔˱sWßo-õÏɉq뾩c—+KŽçr8®ý¡79Ø#<Ä×§¢Ò0|Á»c½}yÀ­Ä[lþBq‰ìòP(~[̈c¯w¿i ñ°Ó¬$f×›A´˜{t8ïÚÐÅÛ½v×T¯‚ä^ú ’Êì˜?8»^§ÔZÚ) Ša~p¤?%ÓQ¤w2(( 9íV“‘É{›¦È%ƒ¢W*fº]óÓ5LkN¦‰Ï…†^C?¢Zë‚$·â<&µÝ:0ª¹Ñ¡”fŸ²ÔkHÖÊãÐé)¥=yã9Qg;qÆäiVõ­L’71F¹o>ô'N¸Fx³ªv¨A“oè’°1²_…–¦Õo¤L¿þ˜AÐÊ«Ðq/Õ õ@“º¢,[1É =:“fäwެ¢¢úGÝ}]«¼ÊE‰žçƒžíAÜ/eræ"¡Ýƒü`{dÅ ‡û¾Î£änޞ HAÿ“èÿHT÷lÑÍ3=Nº•¢ý«N]mæXLÛãñGÔ=JgÂf­B¤æ›uaý}C,F¾:pšÔ`îdâž^’éεÛW>8^`îþ$–©Et@?ú ê‡ùÞÇújNŽþj“QÉ@uÁJ¤ g½åïÕó³ˆj'õ@ÖÚ•(ÆÑœXiˆÞƒ3¦—ÄJ½€ lg×ÛŒ—ÛÞÍRÇ ë)á;‹òDř܌±$EÕ3/üUâ ]tk³’í(qé+ž0:Í¥Ï5F~‚‹s9ù4ôd$Ö ‡kà8¿×‹$>÷' u¢O>“=Šmž¾wîøúHÕs?ÿÎà…ÛñitdÀâZ^µžñêp ZÕÉ_ŽÝ&$‡ð:i÷)ÅšÎW÷£õõhP©0§8úš°7÷<÷Ëë˜s¼>¦Jö U–݃®ÞHVa‹Ý±„›r>}ksñŽ7]§ë•^vìU¤ÛIîfµÊK6t«o}Õ¨e§†oé °Súä/3¥)É0aï"¤2êCɨn9ÝŠˆ Öî,x{E5ö5}¢ûe‹â´—W¶½ý¹¬ôËs©ÏÛÄ®ÐïÞº1Aà¹sf%ç†ÞˆNv u©úì*ÎHë—v¹¬éÜ>vœû¼¹óVq,  ‡¾y¯ÿ„ƒFÚ±ã'‚¤5ã2UoF×YçxŸØ¸"eê%‰òÅ7ù±;eSô§.c n)˨`ïfö£¯î¼Ê„c’{Tµ-¨}u§‘q&*¸Y£iî$Lѳjç¿gäôúí^q¢Å¤ÓõÄdÎxøÎŒ1óa›g ŽÚiXc5.×cdÆnÐRJc^ê‹Ö·E5GÁw£³sØÈÎfÕh&_³¢wj²~ª‡dï“Îôr9¼a:%ÃE΢¤=ªß¹žpŸVv¯—2¾ˆVÔn lÛ áZºé[˜z3>Ïkk½¨¢rW6Í-®4ùo޼ð5p þÈ­qsÁº4æ¦'‡_Éu|ÐÒu[źœ)™‚ F¨KO—w3BC†/É-Œ8mö¶ÂÃUãý pŠ”Ñ¶¹&›ñùºÀõ‰í™¤ ª–Jï&Š™zÓm­ô¤ jœû«ï60ÑÖgz?Ñv‹õ®ÂOŒ­}éöµŸšÈ;xhµlÛ>Ýz͹¾Ã‡‘¢Ú†|çÀ.‚ÜÈCï‡ `ÝL]ãÂB:²&1já³¾ÜÉÕü!÷.§'Ýá[ÛüؘdèÛ^Q¿ÕÿH%öHyKŒT]€ôئdV?|‹ÄäPPbJíÄšÙ÷Û]ºç% ŒöLf+ÁýšcÖÀóPxßêm‰+Ý5wïÓ÷?Œ¼ï]cJ?®Tœ|›¸Gø0ÝœJ(i×Ê‹¤¿ðzìóaЬ¡¼Å>ƒ}ƒ¸ ¬î© çÍïá;ÕúÎLEû,…¢¶Sq®Ø}n…¦éUA7­3_ì:¿¼‰_œ_r±aóóH3äsªwý{˜/¼3Óh@EùP÷g’¿|Ö|³(â²7ù%žJ¶·—0Ï6ŠœÑeï2(h e46/)f†7N9ôe œ¡ùèÏð ï8²îÅÓB®Ÿ,Èë=°ÂZœmhàñ¥:ŽîžvCá*®Ü™GQ4åï2ÅØx=Ïš%‚Ìíï¥l뛯ÚnQ•pf.æ*è5Æy4PÃæºen3r¹îÀ¶–Ã,Ü cD¬Sñ½DôNOtK–Ï0*M¿Q¦«3 dıփOQBµ¾\KÁÒþEˆ êÙÓmý×ÔÁKa>Q'J®¥r`_ƒú 4ý¦4š}ÆDX oÿÌž £/0Fá3 ¦z‰ä:n¢KõÒÞÍ–È¢Y"@\zåë+Ô›5Þ . ’ÆÈ â¾g ”ü;dÈÏ•¶[ªP€Â1òlO–j‹Ê‹ "”ÍÓ¡Z—UDL`ŒˆZˆƒ0 Ò—È–%bÄþ† EŠé¦ ½åµ†ªjD”NþÞ3oúhºT:8×m“l\â8µ4¾Uˆò°Æ¦Çq×Õ.v¼isIOîaf%îá†u “Öëµ&l×c²K6hMyn‡ì}à ¼âßKrU‹šóÊÀ  B!#1áòá¥/ã‰(&d5½ŒÇ%=¤S}ñ˜í`¹Mê—kLÖ7hežö×3t”cìjrŠwöB«žß(ºô<óØ}Εkˆ‚E+•G¹ íÏ3Rõ¸^TéèÛ<'Öq…ãÞA „6I*ÛÁšfä^­f»sð˜âWç»)!Èšll;$s›z òvïJ B½4©­¨Äq‰MBÍ‚$¸™Ü-¦aÐìjñÁlß4#¤’)ÉQÚûVË’L´· ¥Fúo¬½{2!…fz9äÿ¶³ŽŒƒ¢"¥,•ð¸·Ë»õÔ+!žuCúVý¹Äç^g‡QÐÙçò ¦'­°lSÕƒ…ÅÆ¼™ÏÌ}'¦=Èí¶ûúÚÝŠàíEMÏü¤¯pÛƒ )ÒïèR¯²¦AëT•¡Ç±€ ¼ÈâüÌ ¯ù¸eBªÆe4ò²È@‚;—‹X÷8öE§ñŠô ìÈÊ#IŒ„ïÂ3ù[7÷dôr*Ü×ïR߈RHîW" …räôŒ'Eoa*98À,údBÖ ðq`NÏ,É| ƒ&§W’SféI†á@òé¯êN@0ƒ¥3 $/?% GT‰½#éõoŠÝæ­™€íôβ]›7ÄØvÜE ;²ü(W{ãvø©{—cÝǤÖaç¡Tç¾Þzh`©ï#ß>¶BèÃ~jäëÚ"Và\<Í1qÈyÒ€61Ÿ¾¬¶Õ²Â:—Š!Õâ×ÎÑPS¨áÃÄ#¾h+ëjÏìæâugQZÛÙªá1ßÚ³–0?Öré‘Fù Ô«Ó0tÎOiÈïÝsòì8òbmÑQàa|ø^ä“CCÌŽsÏ`?u<Æ(z飢¥aNFÓ¹4¼ŽÝ4d@ZÒqÍÂÄqÜE,]47éEpd¥X®Õqß 47õ‡!¿M¹fþrŒEi§xP†^òðQö½&ÕŠ©^’4uÈb†×yìõF±`hè bccqàî;úØó³cG€«)ë*}‘i…ضBÃwë½.Ȇ„2Ѩ|xŽò8×ðÞì=Kúî2|ч*âS^oå:ZžÒóÖ5À<ƒÑãÏžtR®p¨­@*^CGµµŠ*a’¯^v÷ ˆCþÌ:Ž!O}M >Ÿc ~§{&vOñÖ© dÝpýºÿÇ5ék Kg•ÎkHbÖ«Œž EDìÄ*k6 ÁA€÷êì5ç´öw,_ûÓÈqü’ÍŒ14ÕY»¿­s÷u ³ Ï*úÞ$åE•¶¦ôÇVÖHól‹éª€½d#ªqÝ?€õî›/C"%ý+ýÚ+´'«‡­Ï»‡7?V›öH«òîølª3™LÅÃ_Š&…oµj…>S4»[F „âäÀM6¥ÃÌE™¼ýu?v5€‘GÅÝiö¼™Ý¶%'Óv>z… É"»š®óᣗ‘tc÷°rLÛ§ÃÊ ­·£VüÉ ’˜w+ä­¨@º×¾dÐ0SÄ– »T2”ÂÑÑ>T2×¹¡¶Yrß0Ý0i¥G[pº³¼µ¹ÌœtR*:–a›IЉíï|Ñ«¥L^©´¸“oÚ¸ÕëS}ٹ˵OÔdrk¾sÙ|PCŠL6OÆ!!cöt”&®¡ýGLgôBù_`Yî÷_ ¸~òênó4áU”Б Ž5B™.áêp#QÂü$£:eÍ’y£g+u‚èè/ÅzÀÅýŸÿø‹ lÔïèé_½8‰Â‡TQSÖR*R¸ò_ŒêòÛ¯ïã¿Zý}â¿ ÿÿ󯸾ÿ$ö7 ÿçøÏ"ÿÐÿ¯¸¾—ëÿ&ýE……Dñ±`ñôãÿ‡þÅõcú[9YxxhÁ|tí½œ,<áîJöÎö»ñõþx¿ÿ §êE„wé/"„»ÅéA\yâ¿ý—4‹’¶¢žÑYeÐi=M ÐY} 5E+/l(¤+é)}Êæãé¹[¸xØ{ÚÃ],œÀ`e-VRi=AXñaw¹NÊÊÎÂÝæ ±÷€óŠ‹‹Hð àazÚ{:Ádp\úʆ’ 3%HϪ ÝØ¥.V0ið§j¤ÒNö.Ž ;w˜ „•Œûg ¿èk sá³òð`¹Ãœ ¬ž¾N0;Ì“ä‰ëÜç>á à€? Çní‹{báå©Â\`îž0k¥/Hé8Ÿ0Ÿ0ˆ—WÆÚÞ´+:V7{kØEVi‹¥|×%g {—]±b•ÑÄݲ»Xz¸Jµ°Å ÃBäúõÚvö¸Þ¸[Ùù~±‹ŠO0NÉúM€,\\àžøqý†½‡ço‚éñ¹¾ îþ÷V÷r±Â³”ÇO»  s¶ÄIÝocë·´púi?~ Wþ¿@Ð9áñòavAHƒq”Æs½€Ì¿æG\¡]æÁ³Ÿ§…­ä—¦\“ÏCß—´w±ƒ¹Û{þ¨°ŽµûnÙO-ÙÀÝAŸ²ì]lA»Š"Å ñÓ˜N˜[ãäÑÞ ÇÒšpw~¤Ò®¸?+¸5Læ>œ§—5 Äîä)õf`Nßc:VàÛð«Ö¸–ÌÅíx?EÛýŒ/|6>×z×^à[b·ÅAï¶´Û¨Ú§1Yàp²¶·°u·pÞÃÑ!‰+,m…S0wi{g[‡»Õ×¾ðƒ­­ÄÞJáÓî¶`nŽƒíj‡TÊ ²„»[ÃÜ!¬ü¬ œ w¶pÅ!ÆZ7(kð¯À•cY8átÕ·½Þ‹“lðçÞ‘JãÊ\,œqúã·ÁÄU±p‡Y|_+°µèOÇ„£ö'Ü‚<ì,ð*  ¯Eq#‘I€ŸGœG@T„G˜_üs_wu®?ãg¸ŽxâL9øÓî_“pˆÂuÙ¶´%.ÍNP欗¥“½è“É©|1L8M.ø³ >éK\Õ84áúno‹ƒínok‡KôþüˆGé7óœN±ƒã4ú'¦³àÇs£Å Á'üÔfHJþÔŠì¢ÛOlw[øSßñàçØè .w˜ç®!ýdÛ> ì'ÃÑù¾ë–pOO¸ó·½ÿ‰™øWÄ üœ³k—Oý T¼LYýŒLÁ¾³>?—µ zw¸ßÐî'ij†yXí’NæÐ/ð 8çâáéîe…k„´Ë4ÿq¦øs˜Bà_3H×â´«=NYéÜ­Ýÿ[<"ðßá‘þÏb/œsóÂaÈÆ†×:_9ä á¦ÎN ÜÒéÞÇÞÓäi¹â½"kµ…§Å_Åh‚¿Ñ‰Ó¿rÚgò¶w÷Äÿ/g$Ü€~ÒÉOœô§W öW«¡ß©¼œ¿ÐEèº|âBÐwäyá<{[ÓÙ»xþå´Â ×ÕÏÔùܽ?‹H:0O/w—]÷HÍú¯¢“ð*ÌSÇKjÖ_¨%üc)ÚÕNøÂør8\éýå4 ék7ÿd9ÂÁYìöÖä‰kdÿgÊÿë5«Œ.ÌS §Ä?áë+ u`Vz ëO7qMíÂÄqnŠüÙx€~XÀ÷g—)ÿÏ#Vtw´j.6ð!Ÿ¤òpýO ÕÛÝù³»ûÜŠþ¯àVŒUFÞÚ/æÿrÚ%¶üy`øú?3íú’õiÚ…õ?N¸Nãtä÷„ûæ‹Íü¯H燸Ã,SáKêçò? ÿô§QåôY5ЗEuÇÏ´‹ëñ)Îï‰"ñ¿Dþ]ªèzZxzýv¢œ…¹ã—®áήN0O˜õgê¸â’L>/—O°?ñØ}ø è÷©ÕŸ!Ÿÿÿýp*¿àîôƒú9þÿÔŸ [à Ý8OÇYîž¿ŽíÏB óÅõ@.^x_æG‚a`án_£=kánጓ.WüÍ_#î? Áÿ)* }65Öö.0ߦ×ð¥˜àîÿ#ó¹‡?§§„þ§HòKüS_ä—-Íg‚xâ=Š¿€ ø¾ý-„ÿ§h!²K‹_ô w1þ ü—ýŸð½¿¸!Þp{ë¿á8WÉËÙõ_z‰6¸?¥·ý—º p—\Ö8ðöj ¾ËŸ“ùô?¢×/øóàÝ=HüÝÎO«}?œ³Ø­b'(£´›€óƒ”p-»Û»âØÝE$ý•£ŸNfØ}ÚŠüÑ$H nå匛žZüêÅ~ßâãgwÿËÒ£ØÏn}Q&Ÿ½öOGVðýý´)ûÓzøÇíÌ þÌÎ,Ûx„‚@ø›o(¥÷aý”ŒÏøû×wy¿ÙþRñà_¿iâ«hýd±å§G¾ ô ,<;ü2ìú†!_wþƒË.¿¡OxFø~,Ÿ{)’†9Ëà áþÿc8ùÔ<çïÀŒÌ÷¥>‰â×ûOùm/~,«?°ÑW¶ùéáïÙè[îüÒØ§.×Ôçü]Ñývê“,[;á´—3®MOikÜŸ¥ÌîÌç]º{HJƒ-ñÇÉðYŸzý³Ç¾öXð'=þÒþ'eø=÷|рߧ~¥Ü÷zRÆn?³Âé™ÿßyÂA–0®û0ëo4ê7$Ä!Ãég‘öiçGót÷‚áðpðÕ~þ¿¸·þ;7×ðI¿n«ÿ°¯þ³êÿžšü2ÁûUùzþrmùk»cTÇÙ[ÿ£ä~ªä~ËRÉnA]NØ<àŸ&[?Lƒð'»ðI_Ø»xØ[ÃvÓð7ö6öVŸ6Yps$ü9lœ^Ÿ0æû»jÔÏ|ò#•jo½;Ð]å÷ï+;<ÖÝ?ícãÏÓþ›zOüwª½/» _´žø÷Jï÷ì<üï)Ä_˜7~EÚGþˆ&¿Q~¯Ý¿ž‘Â=ð€~Y?ýF´}çÉÊüúÈþEö—~þˆÃþØ0ñÛh¸ß?<¾5”ßf¾;º{hdòÙÁ7û|Šþÿ†…øÍ›‚»¥õìpù8ým·Æ—´²Ø-iéû%í_œúû•ÓÖŸV¸~”#)yáO¯XÈüm­ÊwÂ÷#Û‚s4pÙxó¥Ø7øþÎÞüþv?Kï4ù-uÿ3ù]¶ÐÙã·áð+8v°q‡;ÿ{œ ðNØ¥þ¯‰Ë/z ¢¿Ï|âWœ¾ú ¢?»¸¢·ýéŠ×ÿž©Ä¯SþŒ©Ü]’ûÐ{}å/Xþ ^‡õî’ê_éw|b·ÿÓ&çWuÿ¶ 1_ ýËš?"'<ý²ŽýôbÝUéñï)I¡?QIŠü>%ùyëæ«žùéºÊ÷qþ÷ô㯬­|ÆÏ_®&ûÆÚÊî6Ý?«+¿muå›=ÅÿÌÒ Hîê‹ßˆÂ—Ü] vÁo+Z8yÁ<@§ìm@ üéü7?‡ûÀ¬9ÿ¶篬õ#½jñ½^ý‚×/§¥?­NrTþ~+6¿ó½oŠ|Õ©B¿ºVý«§FþÓµ_‘÷ßS¸¿s%ûg×®ÿÆ‹6?æ³?¸B…ð·[¼ù?li~îüÖ?«ùß®æÿ»Ë+_9öÌÎyà4Ñ' î È·þÌßÏ2Iüô{ý‹Y’ø­Vé—ÎÿÿgvÇ úä?¶éO¶M?å¶?º‡òéÍlÔŸk£¾}‘å õ§Z¨8ö·Ø¨Ïå¿®WYàzàîõ7´T_ß‘ùí¦êÓû6_(þßcªþí׉þ³jŸpúâ?Fí?`Ô~/ÿШñÌüeÜ?–²?4`ϯþcÍÿLkþÝkÿó?јÐeÉ]?i [Ø×–­¾hˆ³ßÈÌo™O|*þ`:ñ?ñòí.—ðï™P|÷ÖØÿo“ƒ/¨}óŸéÁÀLþ;ÖÑóëÞË?ÆñO3ŽÿñÍ¿ÿOM£çïØ(üÔÞÿ‰Âßyîâó÷©¾X¤Ÿ9vñÝ·ªþ÷ÌÎ/ßþŒÐ7°þZsƒGûŸqœì¨ÎZüTåþü÷Òþ¾çž¡ä4Ög~ù2П¡•ð‡rA§qíß}€¿(NlO_ûŸEŒ?}…ßýŸóˇeoDúGM|ÊÁ7ãúÿîöÃWYúåŽXà#Ù€>E¢úBÂ:ðß[`±s—Ñóç·ß]Úýn“'þÕ]9ùXx€l¿F†Û}Kq—áx&Ãf74𤴾·Nö¿öÒÙŒ±õ/ ZïÆôý1T+WןˆKþâl·»vîŸÃá?’òeMl7ln³$hW“Ká²=œqb%óCŒ<¦4qò®î AQ€°¤„¤€0H_€ÿK„¨"û,}?땯ß߇”ƒ}||ø¾„ۂw#¶}î9éO"I}.¸'j7ÚÑçÖ/†ÇÙÞÚ?úFÏí¾º÷)ŒŸ4øÓ(pIŸ‹g†ÏwcÊþ·c5þ'®ïãÿŠÿ}âÿŠþÿõ¯¸¾§¿Ä߇þbÿÐÿ¯¸¾ÿ ûÐÿsü÷äÿ/¹¾§¿Í߇þÿÈÿ_r}Gþ¿ý?éÁèÿ—\ßÓ_à¿IQa!A~¡]ùú‡þÅõcúÿäûøîîp'm˜ó÷ñx­3yðýD¿ð·ô àÂ=€øÿ“ÿrýNa ! Q K +Aa 1<,¬Å,`0A!kkáÿvÿþ¹þ³×— ×ßÚÆ¿’1¡ïõ¿ ð?òÿ×\–øw¸l`î0wR|q~-RXè9aw$(È#," çþRó_|c$$Ä#ÃÇ:ÿŸ\Nû?wýaùwu±ý­müºü ðÿTþÅþ‘ÿ¿âŠ8«¥JNJ‡FrµÓJ:¸ß‚½ûöâî̆ªèp?üg5ô”·wvÄÄÄvhi]óòò¤¤¤ÌÍÍeee‡‡‡ëëëÓÒÒ˜™™ƒ‚‚p5vvvæ µãpw„ž:Zºr¯m@jJòzSçîtx÷«$†oMÉ]»!vKÓëšðzìģŒ´¯5³+øFÙ"«¦o\oÈ™{JÝÁ³q:ô6µ%dßÌÜyÞ­{{8’ê_h¥æâ Þ¹¥Çó °ªÒep“¦½šDg8ê0@:°ó1¼¥‚ɶDHn0êzd€œÅeõB¯¯âýÙsÇß×c6 !¬–ºO×EÃýÞHØñ‘V5ÛÄ>¿3˜!3ïÎÑ„^K#_Î;ΧåÊwÀ, U*ÞU•sÿÜ@Í•5²â;±íͬn·:)ziC£[]¥Óï_ò¯u? qhþVÕB$‡Ôà>‰º¸›$!·Å»ŽM«Ö~ õ;N‚S¢ÈšìW\$Ý­üD÷ËíÍEÃÙk·*¼°ÈReŒ„øÑïS°.goçÇåÍYíUÃ'ͽëäMgÌ&9S…B¥Œ¯=F×<ô:¶ön~~¿Ûê%2Š—oY˜–ľÒöY­U^8Åû´!údªPWMlïÛ»Tí§“VÚ3«}L|g,pÄßIÉP½<ò2fpJž°r~Òi‘WQO„+r°Ü/væÕ ÜÖC¼Ð`Ôšîü½·ÍGÌôsÜf°‡¢Gâ$‘êήBU7J׊³ 1@ׄj× ¡Î}€¤“íe2ï{;Ð|ã»8Ú.¤:[{I}X• PˆÉ=¾CTÓfî°G¹|7q…†$C§ž’\qÉʱR};È…´:ªºðôê"wçÙšµªn@lyñHl§ƒÈüð%ʾîç@R/ŒsGè¢ÒH£cž]’þ[R€¦_uL¼vº–#ˆJüÜ‚¥ÔteH„ír”ésW"dÔ\Kb”ñä¦OGË8î1ëŽdÃÐKÃ`Ê•˜m¡b÷Y%dJŒÚåPì‹P¢Û\®êssúf‰Y%´ 5.7BÛ4ß–G×d>2T_†¹ÌÕè F:-êY§<.¬X€MEiâºA"¨Ê¬4dqéUx}SÒØkz‰½¡|Eé>üú¯HDõ‰d>;úy yØ/¼^°{ ˆÑ+<&¹‹e‰A”*>î«6I([¸û²aïÓsSŠ H sY¢ÆJÁ“+1/L¯d½JZuÑ8øN ÙøPÝMoãp%r'°–?”råõ!¦2н 2OÑÜË#mËS¯÷Í­&¾ëÙFÐ2ܬ#uS_5«Œx>è"‚§k¢‰·‘)Ö@Ú‘€cÚŒÚAÌ kjChPŸcÅM9ˆ]¿Bæ£\ºÊ‘š3‚{C¨Ed¹¼ú~1©iCšZQß >‘Ë\y×…(gLϹ´¤õ©Ëj<¦!&¹ýrQºi…î9Pà’Ÿ\·+oM9ÇTC×3ûrºÊÖ!R5?¢3fWöÂèhŸóântѵ%@Sró€DTm=##ñ….‘öžxõi³’iEõ³rc ¹4 i{ÐUcý,æBs$L7•qaMA·*sè$··õj-Ë0Ëy¿Ddàq|5KU~ë“ ´³fçJÎܱ®Jê¯yl-ÖxõÿØ»x(»¶_²‹d)²4YË2–1Œµ¥l!Ê>L 3ÆÒ†BOBÖ[–¬•‘}K…d+²S"kˆJôÝ÷ÐóäYªçûÞ××ó¾Îï—î9ëuë\ç\gûŸ%ŽªÊlÍ@éüç:PJ§àñî»Þü;æº/ßxNÌk$mÒb`Ú÷çüö ð'=õœugj»2sÕÆP§ðCÔEi<ÙJrúô©}}é3”¾\÷æ{yÜô ™¶ž9èòÙDÅè-D¬Ø]Ým¥ŠO©l¨b Ã-„E`®Ñ:ÉDoG_'ì:uµäêœãi¼­§ŒÛ MM…c:m-´LòQ ;øí†‚ 'ÍäB²ìÝÃyÌõs§M­·¦bœ-ÐÕ<áÌê18 ô×So/äÛ ´›á„÷œ@DÕÞ~¬y©ç°K4ͽýO„ô«N?ê7´88™gÒ3b»kã¥JΊBýèÛ£q~Ö2 ƒíGóʹ5òñˆ´zÌqIîâ+÷fm\,ïtzA¼ëp­`0½VôÌ G¦gîÉ…£áГ³ LçöðEéû ‡Í‚˜»"ýq³Њ@Ççã®vâxhj7«Ï?µáã%¼š Ñ ¿ªÌ‰Ù°=Îâfg3#´©ÈEÀ)ºq¡¢6yø^kM çëNbàs”콦1¦îÈûÀ 1§< Û@Õ^Ä=¢~ÏÀò螒õPHG;P†5"… 9` ï‰z+él‡abT-@½CT8WÔÎj#fÆ÷ÍÅe>Ò0õ0}_9Žk||Å ‡F\!:¹üc¥•Aî¸ ÈðógqB-‰¸3´ÞUar:üüÚt([æ5ŽÝIªŽ¨à_Ò ò²q… Çš'^f2¢ŒšŸ†Sž¦â»ø’O{Ëöx¿Gí‡â¸™ø”{M\d…wÞŒ>ó_{ËIýæÉûqÕè~Û(¾ºg|‚NƈÃÁ¼[ånÌvX»V{sôšô·31{õi*ôïLZf'Ñ÷Ø’&«§2Å‚}á´]ÌæÅs4ö Ÿ :6èÇ¢þØ'Õ¾·jy#°ì=ylÀ£ÚÏ1 êž¾S`l@­Ë} ’QAÍÔÅ4…zÒF¡cÇ$¼ËÝØ%å~º¿•bRI¸òuˆ¯,ßf”ÙØ‘áѨ9 g5J}v÷ƒ_ž+ºÆÑ9EWš¦]÷ ò¤2ç¹P‡§4˜î:iGž&Ì‚×qbÚ´“­¥ñ´$º0x\‘µ[¿óa²óôC5¶ûЃ˜[7Á„KuJÌ€ÊÓkR¬é¹ñùò¾¼rrª’à—®ÙÕíʦ¶þ&˜Éôá†,Í uçMÏ×Ëvé6+vklÖ3Ú=œeÐ7z8š0ÇBŸ&üÒu™àŒwO³žÉ['…ÊÛ<ø³žéo_8£·½ú±v ôÖi¦­1'ˆU¡ô{y½*ܸªÄÄ•µZ+.Í¿ÛÃÿ)z,5–3ç“ç…ð O Zå5/nŠâ,`ßoP×sñ™| ‰«'0Û ìö3úOMæPìšØ§$H­›´€ÖÕh÷ž–»)xI§Òå$!üÔ¸C¿Uþ2BrãüTA€(5‘Ãû ª}úÙ«ì@;I8'J½Ypë4ù1¼³)þŽ×vm}×1…rïw½Â78åP ?Š•k¨ÚŸÐ´ ¶í?¯z>…Ò± |"k"ë„n‡=-n šò”ô¨Û±`>¹dN?1Ucmâ~y\¦·'ƒÒ.íòAÑV>¼mz“¿ë|²T…Q®«-ø!h¯Ê–(ͦ]”ùÖËž &äþ5FìUü[/ЩØyS7µäÉŠ}ç(­é°uûyhhüÑãw -¶ÏäåªÕ˜Øm÷÷_Âðì‚Rs ¤œ¹ïîY uYT²õr’Jу¹Y4¶¦»©²¿µúém<_ÃfÇ¥Au§éÛ^9<ß+¬?v¤Ü¸¤áîýÔótgÇãfg¼X6ÈÜ}þ&ɱ™î‰•¦–B{ââ¦<Ãù+³Ð7Ê~é‰Üåjܜ׋&} L¡T:‹Ñ´Tál=ÑÇDÛsÕn+ Tn;rîúÜTº ä¤k6ù“ÐãŠâZ¶ûŒ8˜Tê?Þ×foÍ:Pé@Gè,9C³o‹eY'Õ“éslc\¦BæÈ‚n6Ö0îòö ò y³kiÆ4ä]¿äÀÍm¬k›õ›a =8›°3 ¢™no‡dÑ;UÒY§6WE°ë.8ÞžˆŽ«ž{dÜ 4™xiÚs¿Ìp~â.Ï©gÄc ?œ!—¸vìÕÂÖó]Bm“Ê»„.MÐŽ=žçµtd-¿qÚˆPÛçQ±î–ôž°òéÀ·ˆ¢œQ:›]6BÓ=÷’ Vt!ÏeœZù²ÁZíUé‘ÎÛé}’£=¬¼Àso¥ày“9;!¢äá¾ÈOÑ´YõLDþ³)>ÂúôQ`°ßæm´YšpÓ!ËúY†ÇêÂDI8®žÂΚñRf¾…à{˜>çG½¶ ›é `äž=`>€°G¸.Æûç“3|ŠŽî©ˆHë{lP%*ƒgyT$©ÕÇb}!rŸgòqkM8P” –õ_¾ŸšN8µÈ§d–’4‘öÆŒ@à’’ |Åß½_|øxA}ÖÂÌ\Óp¾õu}Ä«W£“ßL[å m\=$Žwë×ÞÈðzC$EÈn廇á­{“°+.s"¢òön14¯ùã[O˜†é O >£oÝŠ¶Y¸ÙUwh`éÓLþƒˆOR‡Jß×;½¢œ /_Ô–q¿F>A§7Ý"° |§¡_ZQí9œe›‚“ìm¿þ@ϰ¾8»ç“cÎŽT–ÌO?Ø…¢~™”®£9r÷ÅÊ…íÛlQ8¥2÷âtKW›ü &½æ©|¯õA Î]}ÚЭӼ*=ÉÕÉN˜&§(2:ÌîXÂ(3§êΕ*š0–"%á°©’l„EÆþm^QÛ2CÂÞ´í*¥,z×f%oáÔò‹ð¶L†pKb’%üY¾’k "Œ×rÞ2>²¼ÁÔHäXC¿¸‹úec´æCsAˆ‡7Z!ã"o˜i®¥kÐaZÃZ½ÃÉÓÞmo5ÛErå‚þ>‡é k-Y}â±äÒñ–u³é¢Èh)©Ö¨x3ru\Œ¡söd¨«‚5G¸FÄ}Iú{¤Uˆ’Š´.µŒ; ME¤róì1èù%Í7vVGæBì‚îhp÷Y¢wN8Á!2mÆä‹÷²´¦ ½œÆÔd‡Ã¯È‹lU¹ç•Lfz^¹J6Ô ˜w'¯ÝÑ€“5IËÔxË+îÈk<ÚW_°8ÚŒýôd—bÒÉâx·u“¥£r¿C׉’ºÒ¿é£÷‰>=Êf.rùc^ÏŒžœK¨QÍF?R5Užèôê£Ì7Û=¥åpu.Úq+˜…å-Š›¥)så¡+H"··¹UÕo©Áy1ÈpŠ­ ôÜÞÁ:¨Z¢¯Í–xay^luõÈAkÙÚÜV 8«Æ¨µ—„€¹O°gïy"»Co)0'ÍUì°2tŸ¸ØùnCåuà‚…v«üÇF²Ç¹ÀÌø±É&¦q¤w m—žW‘’âueSD;cè“‚=Ùc„þí¨3Áí%•h?‹Cs\U!Á“HZ£;“DrjVp2Ìê}«UûÔÕ±1(|DÉ]pšìÖu‚î$uÊá1.ùÔkއ[„ö sµ¦“¥Y#¿Úè\ô˜îºORaCÄ}N*[.¾¸KÛ÷Q”ø…¸úõ¼³ŸL¢ÐUž¬Î­Ê·­h%J*¿A˜:£ÓõN¨–ög“§=´8Öí[!Úøùè×½šËTùB%‡L¥7a+9$ï….=\*g—KÛ÷Aèd³i¤»+PM= Y¶Þm•VÚõ‹j©š»-PÊ#B›‘ÜŽ’ßfhtÈ4jöÀ…~´ïÈÁÀ t¸¯ïú–_ðŽ÷ÉM¶ð<Ùm†ºN¸Ù£Ývµ;‚˜6Êä@L|î,ÅZkÑ P‰ëjß5Ó¥¤^¸KæBÕŽ8²,Íj­t¼8´ ¹ùhÛ@ä!#ô@$ŸãÐ *Vá’Ûh——Ú-§W¸-{Ì) 5g¦“u½“ßý9ç†;kæ³_"]Ò7œX|2ßM_“a9IÝaP|HÎ#ÈÈ[8|É¢6cxà{D#YÁËO†oý…ßt£#ˆ¨áj`â^À3‰û¤s :cgÕíx0âñæéô›d4ïi£–4§®Ì¼#Ž+ª4$º,n†cç&böÉ[9\WÁUéÞô Þ™ Åºs8Ætô]÷àš¢÷j ‘݆SkX˜<%ÏBÇù°îZö$WÕ‘†M½ŒöÜÂ7ú¦_ì+z[Bö¬ X$ô÷{`R}{»Ž>§Çîçŧ„MÊɨ¦§_çSß>•¯18sœh+å!¸ÐÆÙš/â ?þ%ú`›2œùéC‰ÁùÆíÛOFIU¡WþD=@ÍÅ¢]Ц¶½èˆ¿êh!hàà˜üíæ¡ D÷ÊŸfâ+Ô;…”Yšh.ÓÀæ!9DÉ\ŸSÑ’=¶ zÙ€Ï1½UÖ"lÅT´¿S_K-è®ïÐÊëcaÅÎõ—vÛ»ÜZj7úbÈM{¥Ž +Ù 9¼ñ †‡}‹s§ÖNª½8õ{Æ}¬EÑ…Wñw5^7ä¨ùïÀŽÛ2Qq7ÜàºIÞà?«Ç^5' Õgµ¦)ýK{i’*ûšÊAYÅë;‡$ò‹.d\ñµ9=Ù§·Ñ%$´"´ç‚äáÛ³}öN[n½p–C,/—w[¨Ù¾„­‹ÍLsÝÜ‹1Ö/ \š•ÈŸ t©”G°_©Õ¸ÓåÖI p"íSçPÐÐwåÅþZï…<÷+ †—å48ï‹Ñðå–'ê»]lÜ­Ïuµð1ó90橊Ö>œ}o…‰ö§Ø9Þt‚Á»¸˜—GÃåh8?m˜çÇ„:(8ÓU4}z2HÊÐ¥±ËÅMõè–í³þ'ô ¶ÕÎ2tG)±Hð%¦oï|4gÞvµ‡îáMª]êÁ ‰»ån%Ä´j ”Ÿ~ô€!¬ëR:7‡<<-¼Ú{IRR«Ö½uâH[•éÀ= N߄㠽Ôýp9‡¸˜Ö‘ÁÖNßÚñͼ¯C¦¦Ó±úJåmÐ’<>Gyb¹ªÊZB¿ŠÒMÙl˜† ëOóû: ö zý/ÉØm }r޵ñÜÁIÁÇ¥Z¾Á씌™*vv"W6 «lBõ¦lv|K|âoÉzBãæÝÚi¦ôÒÉcE­·|-Y…¼t6͘±®œ–ѹ(Gmxc§À¶ÆsmÅú$?B›+c&™“ÐöGíŠús‡:&l‹y†fm¦;eæÐâõ±Î֘깈ӱÆÄ­‡sêNÇ+%K|CäNùø™¡f´µ&åºC›ïåy¤&üÞ±IL7“ã5K-¿ ¯¸Î| ¬PÕÏêe²¬ia[?kÐ/Q‰ü%¼}ïë~ý‘ˆ€¹Á榭Ìkë„[º‹¥ügp7UÀÕê˜Á¸m}ïUýÎîŽ%hu ³ ¹^ËUêŽ Ú…ŸFÄjÆVž|LÏâÐ/nV“q¬öÕymÚ(bŸxu(ð«s!QR%5Ôšuñm<94ÄHC©>ÉyìÐ0îødJƒˆ9…§‘úðK§)µ‡G-Ç€¬žÌhlË&3²e¿^)*³™|÷.ü¢¤ŠSÝç+Œ÷/ƒk'ºýô;Ø0×K ý«ìïØiïµê ®?hCЛâú©´?–/HO ŒÞ˜š†å™œªÝUªB³Ý‰øö-6ûÓ§W› ®}ÚÓ› Ã1[‹ãþ4·…¿K‡3´ôó½©ÚýÁí¾£ÌŸSb•˜“˦˜9°#='ºÐò¸¬Gæ{*¯QÎ6Îô?Xô9“Òô´—V¬+ç´º¶g§C/¡x©+¶}¶kf„;îÝü©Ïy£ƒas~äF¸3Jgß-´ •Þ)sÙ=aõÚæ5§SpÆ…¹—©3“Tím£‰T ¯^à¶Q¾Î£ª Îøp”ÏÛ¥tKÜÃÞžBö’‘Fe:»C6³=y»áÀ5n¹ýsF î¬íØžë¦rÀø|÷¤—–c®'y±™¾óyõCM·¨žáœO0—àôY¥³(nÁ7ñ{•·ïÅ?=i þèõlbˆ«;;ÿ†ïI&œáØ[/M¼…¸ZèùZGlc;÷Q¸ÛM`R,›Ðs¾Ì¤/\N:,£¸›Ùô6>~Î]p|P‰®Ë§,·Õ|DÑ«€ò@Èg΂É2€%eäÙârX¸ä€/œèUuÛx„þrÁèYÑ“ÅR±à¬ß ¾HD “e*9F1ÉÏ{|ÕîŒ$t>1ò/éw“·I«mC~þ80ýÒÐôQt'¶d:¢‡›Y‚O–ÁYâžÙˆvz_ËžmŽ|“3xOñ$½ã)‡°WD݉erVNCËš;14gÜœòšÝŠ­z—ƒÀâYû\J›ëK=)°!uEŸ‰%ÔzîŠ6öv¬â/™9û sèT²Œ‰¬­pI&!7§™á˜U×oZ[t—°Çñ‚uTö¬Ÿb&’9˵ñËÝßEtºë8ö)öávCÏpÖ)|2Af>é.7[aþÑÙ¿H¡°ÈjWêñ¬½òäìÂE/]ʼné·êN*^WÊ3OÆ¢ŠŸjØsó`{4Ò= úɼ\{ä ÷Ö˜ÂdÍŒ¡ÌÙŠv ø¤4g¶Ç¬I}ãf¦‚Vã©ke×_¥Æš¼~cèÝk¥=䟭Z® EÂÞ¤ )¦Ší¨|”ýIsæÌ[ýx`ˆù–#3YaT‚·ýà÷˜‰XwØ.?7…+tˆA{ê„êe߆8ez.´µÛ¿®¾:Œ¬º_±4²õvåžWæ_;¶ûóB¡}ÆÞöã˜6¹0ŒùR‡‰DÓŠX©†8Ù$8_©¡ —Ó+ «ÍªpK¨ÞÊíä´Ñ;´õvy2÷^1ÊN¨ÕÓs‘­ÝA›\BC¸8Pãå¢sÆ=dw’Y'&Rø]ß DÓ„½[~¹Ï„È4?ÙN8 õ«Aì'¶<Ǧ¸ç„4ß0Up°ôîÛÕAØ í‘ ò¸Ç(´ʼaÍô„áXý4ëXØÂL¥UœFÇ ùÔÈ¿ëº@“‹Èf·ù9¯}«ZŽûÏ®Wó™°|E=Z[¼PXbaÊ7!%´9/-ÛV 93'Ý×”ÔÆåcÙ]sÜ©FÝdµ;ùã̱Jåñ1%saý4‹Ûeì”RiwCŒ >“r’ÈrŽ#²)j»˜ÁÚÉÍÍðØ/¨ìÕbsƒŒâYCêîk„Œª&t.ãÁÎæ»£Ž!̜Б<9óBõgµçYEQWù04þɼWãË’|2ÐÏ5úOXŒƒõ·Ü5¼ì1[¥jzq ‚µ/¯§Ä*wzrÎuü~nJ­¼¥º¢ý´À¹3ðÐKÑUVú¨Œ†žßwë%¾ò'Ð¥Þw‹ß11txуgƒŒ³;Ÿ`Àó# ƒÒÏÁ%ÇkÄÏT]Cx·« œöàù# 5mÕ,KŸÿ¿PÿÝnõù?ÉŸæþLbýþÇZ¸Õò‡ý<ò—\—ÿZ¸Õò—úyä¿~ÿkMÜ*ù[!ù¯Üÿ]—ÿš¸Õúÿ ä¿¢ÿRëò_ ·ZþÒ?üáëò_ ÷{ùÿ†bWY ìI·þoe|ûþ„¸Œ„$éþ&.%% „KȈKÁÖïÿ¬…SØ¥ª³ßฮä –&D÷¨Š¦Æ~¨˜˜l¿˜˜ªêr€T\bàŒttAƒHhHŒ˜˜š6ÃE‚ÆRÑø”Px$ïE9¹¢ÝyÀËc(G¼¨.]þ¥ÈƒG¹ãI­NÞÚéì‚Â+¢]°¢\VTÌÆcPJ«PÂä _°ÊHˆöuà?ˆé⢣5JAl9 ³æxr5Ú 0˜õòSØEŠ™‹= …çàÊV#À¾H¼¬@è°¿›Yy@T—³[A qèÐn_ØœHe<_a²­ø¬"ɉv\Á1Ó>—áÏt‘v(Ù)È·SÛ£jœ­í=V²ØF]Îãà— ÊéèˆÅƒ|ý1#M´ þ‡ò !Ü­¤Eòw“¯@=ºü‘-¯Ëec‡ÁZ!1¤ãïäêÿKz( X/¿ Æe4Øä%”¾Ó x ºmˆr!A‚’_ðp@ëG;ÚÉ)X‡ßò“³‘•úãåLuRñ$’ïM"Ì ùW×ÂÐP4hçZXg c-KƒÐˆJ¼+ÄB0xy; Ú j/`‡—W#…’²û“ˆX{ W<¬þïEvrÅâåI ­@\ÒïÆþF¥#–,LŒ ù¨D’ï2Fâÿ½ 1)øWC£3j¹¬¿hüá_E õû±™TéI) ã¯h ‰]c…¨„£µ„t½—Ô:W7r9 ¾øHÊYéà‹0 ‰ZÿÑx°°Y\Ædü 7K8 =®.Áð\Án¡WÊ¢U¼WP»ÿ$>ñíŒB®®/€ u|iË5q±G‚}=xU‹r€ª–—IKŠHɈ‹À²¿ÿg¹J·ùófð­"$¤eE$aÒ"0 ˜ˆ¤´ä7‹³±†ý• ¿YˆŒ”ˆ„B&.#|³ 9Ë~méY/_ñþN 0€| q¸¸4ÀŽÌ7K€…X}U‚=ïB@â¾WXQÒ"p Iâ{% Ä¿*Á-,¬\m>ø»ÅHŠHHŒHU…þª``Æ­(†ˆòº¬ .öX‚ „`¶¶_t…Ø Á1 10’|ùõEI±`Ìoª Ð{Áþ Ó Êºø÷ôLð7UçK’¿Ò$âkÔX,8l}·ÂE€æ'!!ûvër·’øß¿bÒþuÓ€ÁD¤d%D¤Å¿™½ 0±ùâ¿S¨¤`_ ¦"Þ(~WRÌFü¬ü®C>€ŸŒ"aX“¼I ÄËP×+Í„4 ÿ9ºô7°ùA;™„ƬôHò€æUàá@o¯`/¹l[– ðýgIV ÇQx”ƒ&ÊÿçÈí«až—m™ÕðοËJou2+,uàùlñÿÒÚù§?0¢Œ“XRú RÁË„’Lò?ÚhË\.“M‡ü¾I|ô?7ÁH"úJ$_£P%,kðo)II)ª’<€y‰êo ê$ñÒþDÖç_½[¢ìŠ·æu« º5Š F(¼' C²,­]€r +‡ ¤à}¤ù8tY¥fìPPG`>§ô½$[°R!_Á€ÿ q†@R 2WS'•üN2U`Ö°: ˆyýUÒ°‚sÆ#‹GoL”œÑV®àä (${,Bx! 1ð¹9€[WŒˆ 1Ò08¨sÔ¢¬}b¤¬§§¬mp\žôÌ E¹¡–óŸnBÙ@3Èïv9Zjzûñ•U445 Žƒã—º†¶š¾>D]G¢ ÑUÖ3ÐØTSY¢{TOWG_ 1øÒOAŽ6¿ô¼ h\€2\A,~$DE_u#üK‚ýƒä|èÿºU®<ëö'Ôþk…|[ØÆ¬äFÒB”³ƒ ô_ŒN.#“þ/E'_½ÿcõ¬ÿ®ìÿ¬¯ÿ¯‰[-ëŸGþëëÿkâV¯ÿËüò_Çÿ_K·Zÿm~ù¯ã¿¯¥[­ÿ?ÑûëøßkâVËÿçyÿCJ|]þkáV÷ÿ?Ñûëú¿&nµüž÷?$ÖõMÜ*ù[ÿDç?×çÿkâVËÿ'ZÿYŸÿ¯‰û½üÿ ÿ[m‡Æ#1¢Ëd»ü­S €¿ÿ-% —úõüNzÿ.µŽÿ¿&îŸsþoù,dùhÙúi¿õÓ~kwÚï¯ûÃÕ­’tìínì{Zàæ …7Ã\ðàöÛJçIÚeúÆv«µ˜ Âú{=ñŸl¼®Žò òÕÃÊH øerFƒmûK?žPùõq¼óW{÷ Õ<Ë þ´ò"%‰;£€ªÖ³q©ÛM: ¨‡Ã«‘= Hœü—CU"åPç/6Î{~}@zMjï·ÒH§æ &nhg¼+cöåݪǩÿWu÷­×Rx‘â(w¼ éò8࿲²öóWæupÀp¦½<1û[Ë„ÿÒ®}y!M²æhÀ¸¦‹ÅÞËkãôÁZˆÐÚ-"®5ÏRà†6h£kØü£—K¿Ë( dô7ûüŸÌè½Ïú_o‘-ëó_o”ý.ü?}»ì»mΣôë>Ù?µ½üP¯ £gþÊ®ýOØüaù‹ŠøÚZýoSÉßUÉëgV /þÅ7üeåÄáÿ¥7ü¿íVŸÿý‰î¯ßÿ\·Zþ?Ñýßõû_kâVËÿç¹ÿ·~ÿkmÜjùÿD÷ÿÖßY·Jþ6?Ãý?Øúø¿†nµü†û°õñ Ýjùÿ ö?l}ü_C·Zþ?ƒý[ÿ×Э–ÿÏ`ÿ¯Èýý·5q«åÿ3Øÿ+ò_ÿkMÜ*ù£~"ûÝþ[·Zþ?ý¿nÿ­[-ÿŸÈþ_·ÿÖÄ­–ÿOdÿ¯ÛkâVËÿÿÕþ—–‚Á%Åa2ëï¿®¡û½üÿꀃé}k,caAzê`ó£òü×øO€“úZþÒ þ“´´ø:þÓZ8Ikk+iÒ ÐPk [˜¬-ÂÖGIÁe‘kk›ÿoúÖÝ¿×ýô‰ûÁ2¾§ÿ2°Õý¿$Lf]ÿׯY!]PgÒ˕δà“X¾9ú‘‘‚KC$d¥Ed¤¤¾¤üÎá0L\‘@ÀE¤Äÿ–ãLëîoºÿ½þãí~°Œo뿤¤¤”ôô_fÿqM\ ®özÚ 2ÒkTÕþ¾aæFòMÀW²Òþqà?q]Mµ¥ÏŸedd>oØÀÎŽ«ªªJMM•——·°°Ø»wooooYYÙµk×vîÜyöìY ÅçÏŸ'6êü|mÄëiëoØ7Ôn»adƒ†ª²{Üx|£sçƒÈ€Éüz:Ͷ®Å—ZÓ;B™b»4#²mLám,e"HæÞa½œ‘¦ze3Ôáõ «†m4´d)tL|”RߦnÔS‘yjiôهe/¼¨£L)µqd‰®ÃüCoYkÎê럂›/oZ0Š8ú¡ øy¥"‹&w€jaHþfM˜BÔÙƒš›?†©7«Ñ sŽ9½¾Uø¸üT¼bŒÛ\ 9èF–8YÊ& #qŒ±Rdà8 ùì\©–µÂNtb9ч0“Uß8tW¹Ö¬9¬Ó=$W†K÷òa¥ÅñêÝ òüÏ0¯ûŽuN\nyÔÈâVÂ&&rž"1‹{8¿Û7Œ¹Š§16£¦ß)|$ÿÃCÚÙšòEÌiÈË£ÙM:<›‡¶†T·Øm‡„öÏkµ.ß™,*ßÞé¥òÑFö%²® ¾ûPâmŠùÈý/Χ4½´|éÍÊxs¯s¯ÉSš.¶”¦°&êʘ Å”·ï¹JéðlìnÑþéî·G`>ì!¡ìQÈØÂ÷–±>·E^tÏZ²\|Xÿ)â|ND÷(Qx¡ §ä×sžŸ#y.Bžéß–³w§aã…“Çè‹¢rP3ã¶‹ù·+"ÅGø^Œ¼K=é~P° –Z(Õø¨´%ÉEÝLÞ5Áè©Cq‘~ýÚ%}l³•#á]ΊûØOÃÞ)3tZA–ìŠt³¡~ÆCˆ‚°b5àg"«Öºº©­ªÙSý¬élÆÉü; ©IÊ /8iªŠ˜Ûű޻Ï7Ñ<”¶Ôl¼¯5ψ‚c¬;Z5òèú§sæ:ØÙ?x~ŒÌŽ p¸×˜éЦ{\%éI)©¾óý\np³ÿF¦TkçaõOßäI´çk¦’ãúpäE닉þaOdSLîó+çPï0ç“OŸ?‚ÞÏV’굡›gÉk¼u±bÉo<˽i,rÏ¡]Љ’ÛªnÝQƒÇ2ñü!cÕÄ…¨;?!Ìöx'¿Ûl³™ûN¨ÙéóM=î&FNs»™x4ZfëoLl6dÇ4(J7!:³É Ó[ÅK«ãû›Û§0ècÆ×ï¦qfÄ•5½À狈Œb“·¥~ÖSŽepä ­È[Rw®Q°Š”‘h­’¿îÜÚ“Èyo«ð±ÁRÜHÓÐk¯º“·\²‰Œ<~v]~ÑßêØ³Þ‡ž¼•–‹š¢šG [r6’+^|e Èq0X½™™iRz+¡FüiÂ/zí÷v-á;LˆHƒKïÒÜËvŠÄL§„:Ñ$»þ7tÞ—wΘ~léÞ¤ÈÝOØ–|¿ŠT|ålßÓ©Öò<ÏmYW©iQ¤›+7n™ý4$ $ b¯¸t‰1%Óö¸bpgýpMÎ뢅 Ë㊇=yѧë,ïçõìÖÝæ¹´ïææ{/ºé»wc®Ýf?˜µ¨ŸŽà‹ÖÆ[5ExŽlÕÔl;ùå‚™”ÓÈ"‹¾ŒÂCáiÞ½÷Púªâ$FŠ«®ûtW…Qûó†èiSúkìÁmtºÈFí3"Í=Äzœ¬)¤²ÅGšÊE‚KŽ9P¡^8ü&Çáçõ¾@¯cß0ÈAWA”Ž}²{ótÐÉü$™Ëu.´¾Å7#ÙÙ}ì¥×6zví21JJÃŽÏRw/änδICÂ3Y2µÅÒ‘p¶·–§Y ÒwmÊwoO9µ`o^ÿªsÒ3ÎŒÓB¨¯Gìôx¢‡Óel™=ó“­üÔ¾{ÅI-·ð¥Š.U?ÌáÍëURÂO-lç6ÞAyÖ}ª…12ùÃ)¯¡ÙÀ™qÑm’Z—OyõBj,?†]u{òªF¥‡Åæ~à‹Âêì ÚÇ$}`‹Îõ–^í×.âÒb¢%£°[ÄKŽ5ØÒ+ÆcwVTžò2„U¾ê\ÛKîãšð¤` òH©âIгq¡¸do”§\oBÅÀ©…È )¨ðS‘þ¬¢=—ÆéÕ—rí·Ü3}Óé 4Þ» ¹gO*±Ž¿mw7&ʸq ¬üdÌüSn'•{-Sæ™è‡2iùò©˜·ðùg´½oWÓòzêQL¦e£ƒ7=u“ïz¡v}‰ûÑÉrL)&D·eøié>-“SD+áBeÁ·­'v$Ý™Ž¸a÷^BOk´|€ÜþÅåK-,"hCb:çÝ|Õ¶‹'vˆhŸKñVzc3ÎÓ$uý ®µCN¿M Å«‘û€¸#èi·$! Z,Èàã7º7#=OŒó4K…ذŸ|±Í?Cµåž„ôƒ˜{ôÇ2ÑÖ²k9åNsµj¼lºÞ›îjwzÝ2 ›¼ƒ=•ŨYÆÿìÝjŒ;Ÿõµþáîsõ gˆ.<˜ZqÊØ…ñœË9¸¬ÏܰYÛ‰‚I÷ ^(ÚW–lĤ“}Â’:K|„*²Þ-S¬Ô•ï.ŸÉ"’×øpíç¢íùºI…ɽXá¾Ò›ê7šœ g+ÞÚ%Ï|¼;ÂÝnÛÂ=BØÅ‹–:æÊiJYŸmc¼4C‚È|à‹.m߸3–‚\‹ÉŸ.õR>­ÉÄA: ž?{Ffe‹ð95¸uìUÞúüSÊá l»¬Y‘-ÑG÷=M²<‚åë;iú˜Îømú¹ël¯(n“kš?xsëìY¤¸¹;´®¢¡¹ÃÉ,Ü_Ù4Q'ûò>FàÛï8ãó«;˜ùñZ‡Ë79… ;㊠µä ¤1 ß‘UnDá‚°3Ël›ð¾˜¥Q«›6º­4üúø6ê[‚‰'õ<)—j”@ý—Ôi/7ÁÓbnœý¥ü™ë®Í'†‚Gcð±Ê¦Ö›MÆ'ê†cX6{òVÃ+KÝë:/5ßu®bÅTAnœ|eI¤÷%fEp^@rP:™e$.-úµyî0&;vÛîònÂÑMïÆB«Èjit.?àÀlbj•ö¦>PèÎȵôîkðã-¡×úŸ ¡²$ÛÚ¼¤>—ÍjžÃÕË(Àø?ìýTÛ’8Ü .Á îî ¸‚ÜÝ šMpî»'@Bpî¾&÷Λ›7oÞ¼™ù~wîú¯Ô:ÐÝ{WÕ®Þµ¥ªÏ©êÏtøК;+ÖÚord ªncúïxŸ¾ Éýè,ºË"h¤Az»´|0w„¾+üø…󚎭ƒÃÕÒ1f[uD_¢ÓÇ~­™¯_Ä%d¨:I«ü&äEZ­3Ñ^÷#x‡•ê5Dì—Žñ$HC¢ªomù»`)‰×†à Št“›»MïØûºº§KRš(~Ö&pO&I°"ºðv¾}•á[šV½»í2¹ G¹ÆÛ¿{·{1/)|úx°pI¸º ÎËå†oOÇ™iª¶ç¡D¿ã¾ÐCŽ…4µãÎÝ™*ðxèïIáýV—¼ÈÍ^+£‰Ÿt‡g‰T‹}àzMè½Hm"¥4Š×ý!§JìC×£Ïé>kÖ<½Ü0’É•>r6x[„{WÆÎpþCž}”Ì%êB‹–Ç ²ÝÉq9B˜ßVåWÊÍ1÷<9-‡|}†XêLuÀ¤yfMï·!t½cŒ*šYšæN¹è5ló?bãg #3rÖš}lTK£ãtöÌ,GU´3úiE…ìfŠCg±-¼yV”ï#–1êóþo^“ªÛ’@ˆc('ºGRQ‚4Ó»çþˆ·g4½Ï¿n§r)`ÌÍ«1…=ìÆxpMú+•÷jp3E¼Õ­vxI(Ì)ó™ªè «y‹])¡ëC†Œ×vlCÑ ÝGN·¯JñÂ6›·yJdpšÛ­{š¢8TiˆjÍâ ¿¿Ñ7h©Í½m …+¾©`ˆžUÞ÷Ðpjõ·vxMù9JíŒp ú-G¶Ÿ¦S«È74h¶ºQ§¯Mܱ…žø¸4jÖâÚà­ ™ q÷›[Ç‚§ßÇG°ç ÐÚ=‡Wïx¿Ù…šÛŸ^ÉÎK´Šh1ÄÌnÈ“TÞÁuÎÜDaUH[Í¥v¨vMÓ¡éóʽ#Uw°Ïpòa‰e0Ï«3 ˜X½]lët“ì­ÒS´èò—¨¼ÖÐÛãOy{½á¹ã¹åº³vú¼áíh>[LJÞóؼgO8ç-^ý®´ZH¡kZ= Áõe Ñ $<žHzæ$òNe;5-ãv‡`±BUeöëIY |wµ*8SXôŠ/ªè>½k¸,¢W5ˆ#yÄKÊM]bstHþ(:kš»ßóõ°Œâ«íT&ÛUUõœf”EÏ{\‚Š™r=Uuhìézè*4E¤í’SÀo»Ž3Úмy»Z;È+å_L¾#ú¹llCûáÙ°p®U+ÔÂNŠÔ.ø~É}ß?¥am‰ƒót×ÙFøˆ¸›mQa7!¯BÛt÷KŸŸ È­µí1wdJO ]U´6½ìña×+‹wN‘ÖÉ[|vèëšÈzQ#OñÖ5àÞ>²Ç +Є>άçds/±¥®BHf&vÏ™Ñ4ºŸ¨AuÔW¸Y@^” i±È¢AN” A~‡0y•-<9˜-ô}#t X”ÒXh*äÓ xž+–sëñL¡Kæ‘øCA‚s¨ù?Š%Œß†B|WeIé_ß‘g[è"FI£ò,BNžFÕª"wNx÷Z¯Kq›Ì}iâ¦zÂúh©pšsÆü„ò[¾œ]âýlȲ8¶J–Ð{´¡>Aîˆà^Cÿ ¥Ø¬V`)Â!E…hmªk»!³}ÑÎ^Ž]]ÓZ{pÓ5PäwR@&ï¸qlµlv %_9kK:jÙÀ‘¹’ÆIIŒÂcFî'~§a¼Hª ªÅ7;³I*,§†¨3¼àï,þê;Fž“Þ›ú=AœÎ™úŽyeã¹ìj4u–9\=í¦ðîø"é®”ëÔ&ÆZ·!~½3aQÖF:×Lú/+`«GEæ…_s¸ˆ=õLR BÊ ¢brÌñ†«"aÍ7ù)}4r%„ø¢5ZcKmF¡™çϸ¡bÐÂlöÑ ŽeØØ™è±§9çøâ—Î9¸ƒÕ£ÞÃ)F'ìÂ<4t¤G³xÕèW;ÿ]‹€¾BbÍèÙ¾þp;òÜá› cÀC§®Þ±Ð/•-‚ãDŽ.¼ÛS7­"«›´õ«bYž\Êú–½ ^~wÆ {¢zÕÆÕŒ×“Üò;ó]7¶~{ú'cõˆw—Rßµ‰€»ƒ÷ñQ&§a“œÍÁ³»ãYĬo Ý«•ù摘¥œA5Š8v·ÒîÙ©o‘„_]D=OmÙL Ÿ0ÀQ=.̶Áô¡ê" b¢îž¾fîj ”›kq#Ù,.K®Që. ó£>$gÂÌ\ÙðÚ†mvYNqΜ ÕKðÜ2ÓŽšÖFš¹ºü}ð{»†(χ»QSX¥«âÈÝÛž¯Y5¬Ç&ª›T¥‚Þdm–à‘óÍ|.:qø,pÈ´,óë1p#îŸÞ²½¢;ãõ'â ÍA>2" ÈýüYu Ïk­Hv7¶?¸üòÑ燞]¢ÀõÍ'Ø÷%à›¨%:˜àTÂ:sÊ7ä^U‘oê 1ÔçÍ …s¥ ‰Y!]Kt8H±¥YùµåFÕ tàØÀùaÓ€›þ Ôm=ÇMæDé°/ü¥íÀ‹íÅ2™Ÿz{[å‹Ä$²O“Z»UIm?®Î+ÕÛ¤ÑÆ˜oV_éÜ@ ÌUüß«àqç\ùy^Ï‘¬¤d· +¤ë,çN©Z5v|d߉_)Ø•mo 4fhÄ8xøõdc±{*eÍCM&­kJAPð‰ÏÙ–IµØFÊ69{|}’8=^'0ì™k£lÍtuEÄùúž­;s o,® 5*g–%éqAñNä«»~‰£ÖëG{z­Ý¯ü¿vsÙÖ>^ ‘º<÷täÎtˆa³­¥-þöCOçq‚™tŠÌåÙ» Ë®,ˤ#LË·nÛEuá/J»Ùq»5;¸¨N™»ÔÖvÂò¹ì–}ûTḘùoÕa'êúÒs×`ŽÝÎŒj ¨ûÂ;=s—çãi) 'ñú3½¼áḣˆÆŠ¬´à‡zr³k)K­^áX/°3E8÷¬£i%-ÛY­`‹) ¦W0Þ%ç s£M(H(vÃ~»Ò¾æ¶&ºpJ.h³>­ÿ°]UV ­Xdõ.~˜ä.¥Ðâb4Ùœ:C;hŒœ8^w·¢ìø&Cð–³Ò|×Á﹌ZnÎ<&ª¯ŽŽ¢|lÆe[&ñ=üdÕ°Êd» ˆµ4[nv¥nìHÞVÓªh#Ê _–çñì­ƒ øüÄM{ZlÒñ ñÎcÉ]Sh5;ÿ­ JÕ׋QAÞíeem¹Á—³ñ‚½êX‰³kчñ!ù»œÖö ÈVƦ¾×iÛfR ²£¾üÈžQÃVî_GÔlÊ`0Ë<¬â˜×¥<Ó©ÁîN…?HîÝ{òd•MÏI½•ƹÏ3¼›'^’Ò#Ò‚~®„õþ@°5H²ªƒ®YáÛÆVi|^۱ʇM…J®dËŠ[ÕžY+ÓŽ.Z˜~cŒ(_„âû”´ZV0/’ÀÂ'!$;m³EmÐf+iªû3t¯ ~,c]~n¼h5,jã÷²ÖW¼¨r+¢õüÔæŽiò¢,}ÒöòQÃHeøº±¯Bò‰`ÔüVœ2µ‰{OlåÊC£Qî«8Ÿ—‹Ð{ñ×iûÖ)™}É9’ö[߯ˆy°*’w.öV¼$FÚWxõ-Bp…²ñCysý^»õ¦9óÚ6Pgkâ§s£Ú¾n¸Y*ô*ÞX0çš2Ólº´= áÈÚ¶(yÛJæÎ¯³(0ç&g ¾LÔ` 6GÖ® ϵ]¢ð´øW&ç9¡Zo20­èƒ³3²x{Ûí:øW” ck„еVžÁv$„j¹Ò)ÝqP¼Ã‡ùø"ÐàV}ð©zäa3>I_ýÃØe\q¾¤ïq9Á(œanO…ë73ëKý;!€@ç-D#Ë pp|ƒsNyA¤¯?\ø±JM-¡¥í©œr^|BH¿¬Ž¬vàÑiWkoÙ3á:™bÃOIgÂë Ë¢DÒŒÙãjTÆòübºÎRB!äC.¸È©uûª">ð‡äíŸöºE$á³ÙW§¦ï­,íÅCT‰>ÆNË­Gí}¾Úƒã: £_ºqoŠ}>'ÂŒÌ|ÊŸûáø(¥ÀÏOlsµ«5̽ü¬õ»_M2¬éM¨¬qÒÞ³khãÒWÊ6‡ƒ=¥Ÿ15?o› íÏGà}„››ÞÊ:Ç»5{|9ÀígÑè'ì=ëFÓ1J¹äJ8T÷@:“4Uòl»Ÿb©zÞàù¸Ï¼Ku̸-린ƒC%»{Z:ÎîuÒAo gÞ¹n´‡«­¨˜vç7µ¹×íŸëY[¶ßšFU\ÓÜ„£ÖÒÛ~{ÂÝž#>,¡­Æ¹hÁ gÌÈóˆ•&ÃÅídq‘§ãèÅÙwkΙÓìaJ‚eóÊ'‹C„)_§tÆïÒ2Ûž!rÊ\×™çnôE›ÜØ‹uL=z`.„–VÄ;áÓa½Ú½%D¦©qÿX<̳!ßyY´PÛ7¢Ý¥Ò#¬t!m#C#¥!ÜÛ,—­Qm¬³ïÏ•rÓcä5Ä Ì!¤à2šA$m$WÅB³Q†@źQ#©âøgñîVó% ìh“Ÿ‰£añ:¹ˆ¢cŠaÝý¼6óŒ\‰üfjX]–òl'ª‡®Ê߆[ÕÍW–ðjê}ƒEUz¥c‹¢)[l¬Ñ x²²#ÆÔUÜÂ.‡Õ†p€>=;†Ñ{å2hc€ g:cç½>DhÓœd7é±ô¬„Xôœ’I/9¹ÆûrˆïÀb_g»ïnš×ïm_ì°‹î{C§•4œ÷=;_ãTÀ³8éÝú¾pm³?^l­Ý³¦Ôi-\jlˆb+¿ÖɽV~ñʤéT£åœAZñ ¶ÁÊ;µÿh§t\Øßït,%5˜x®fÂS^ÙüùíáoÅÓgÄþ"™Š‡Ü'àâS 2Úþë¨Aíc˜Ò„²Êm„îOšÞ~õ«õ·ß"}x»ôCöøøÒåf´üÒ/Ž_•ØtAÊ马œ°š{§cxšÓ7ãl4)ŸM»Sêß:ôr§´Ê!¢äûChÊü©FZ/UÈj:ó‚NiFËkîœõs”“j‚¡aOÊ©FÈ%?·ËÒ>Ã(-›ù+†R׺†pÚî~Ó…7ãíÕæ˜¶/íË*ê,ýêï뤴ÍÛx¦¢G!-4uÅÌ?~µí:‚§qy:½å»i6«5ƒ1åû³ 9m¼òtÆh6Šöcn —ÞîæXp>מ~ÀŠN{7Ò·Îð›óÍ#m¹ÉgÏvO+8«ô¸‡o‡;÷U[6×f:þÄÇëÌ^C+ú´òD¤Î Yq~·Q4zb8Ë%àü$õ,þ««ˆü[ª žåÆ[c>ý¨%T >DRqQ»D­ –àþ·BylS\ðƒÖD$Ø{*“›ŸäCÆ!§Û8·_a¢?¢îøwH(Âh˜¤žåŽpÐBƒ¹£¢ÏÜ‹¬ä%׿ê“ø š+ŒÌ2dp§U'¹öDa2Ã| ‚îÆi¹8‡Z›î­¸`ãòÞŠƒÎªI…¯G4v.‚žõ.²êŽâ^5–´åœª3ÌøvJ©]êPaCT§ƒ¸ºh{…´°+%$ÜBè¾×í g½p‡ÝUÑVÐTa5öHR±6wé)œSß<»ø¤ˆC˜†êHZܤ¢#¢ z‘à%Y²^HÏÚNмŸƒlÂk©AãàËK7yŠÝÝ“Y£—¯¦¾ÑG1¦u×¢Ø-_ýž!䌹Þ-ÁÑEóI;S®Ke0­òs‚¸ ްŒ7Íœþ7x_iô®ktàYÝæ |).²¼ñ¾7Yæ7ønª’D‹Æ6SL]Ë*ÝÀ쪃æ™vN¤'Ž Ä vá܆Ûh8$MF}ÄÐü¯Õar«PC MÎMr²rˆu(JvÕœ9‚ çfz·Þ’ ¼A&V™æ;s„9ó‘:UO4Kì!žVxìÇÚåÉ#Œ®Uò]¦ƒŸ¼q²Xöúìm)$í<.'"ÎhµºIXûðÈ ÒI<ø,4¦R¯ÄØ(Òñ³§‚ŸTóÖ¨š}5!‚kFîé< Á6á€k€¬"ã»/3+•áò@ º€/´ÜÇhÖÿ Æ5S´5|våÓµ†½'¨ÃìÞ}÷ÕKÌ,àGFo´FÐ;yŽç5jà %ìCù{P+Þq_`©¹S¡±W Gâé;ÙPçÙbïž©I |5¦Î+ƒ*{û<Éè«Ä5*Þ¨«èÝJ<Ý£½ZÞý9ëE – vz8»ª3tjãj¿õÕ/„Ç‚aAš ú×ð×»¼ŽøºÏÞ¶s'p$ÆÎ h%­rÖ½U A•92>ŒœAšÄ0®«ÓýîœL™,>Fw ”Ýr¥pb"‚½÷ÐÎt,ã!_Cå(éÒ[ЦPžÆ‚Y“GÕ°Ä?3MjjÕΉL¦¨ÂGXTÙ»“4Ì×±«~4ŸÑCg·¼Ù=ÝTVõ•õÿØÒÞzº—gÄß3s±Vn#˃ó`ÞN‰î æ°ªÇ×==.öHeÉ0óŸæäæÁo…žž° 0õûo–å”>ïáöé7ÍI%I¬´Ÿí›ÃÛ¦‚iÞN(ý¡Ë¬š *xéB’¿e0n¼:uø[Й5P%Za5™ÀÀ6·‹ÞÕ¬’ɪ;©•“I»´žû_'ÉJ)=©0 ú¿û}Ôÿ×áçßÿý…â½ÿýOŸôoþ׉ÿýÿùçÀÏúÿ ÅÿþŠÿüSàgýÿ…âÅþ)ð³þÿBñ¿¿â?ÿøYÿ¡ü?¿ì¿?~Öÿ_Èþçþ¥ÿ?þ]ÿ¼ÿOtÿ=ýsßëŸç—ý÷§ÀõoÆÆöŸÿãGþnÎ_úÿSàïõÿŸ¿àÂÅÔì þŸä€¸Wð¿œÿá^ÿ\œÀ2ð+þóO.^0˜‹ÇÔ„×Ü”‡Ý”ßÜØœÃ”ÍÄÔŒ‹Ï”—Í„“óÿZ¾_ðÿþ—óÿ_Êñ_ÍÿŸò?ü6ÿ¹8~Åÿ)ð?ÍÿÀÉñ#ÿß'ÿÇ}þ~Þ_ùþ*ð¿›ÿÿZˆ>ÿ98x88þÃüçäù5ÿÿ øùöÿ–ÿa‰(êÿ}þ‡á·_¹‰©yšRdj$Y¨8ªÉ›¦h/(á8»1bRË/¾bža²“End]C.´¹åBtGò„k ªq–ÞßšgN4mr#íöѼÒõrÇô ‘~ð ÜÝÛ)¨[/ª¯wÖŽh·_:gC>ûݨvÉD“dƒ¹®$)|Ѧ.î3@È=7Hø‘‚²ê[×Ãæ(Lfû°ï5ü ó£Õ˧„^ ¸­µ.ù32ȇg±þ'WV‘é[ÏÕìŽúwéiS‰èÙÍb>¹'¥)-©œš´²=Üj.)qÇQâ r¨€u+«ÅlPu«ãÃ\×¾Ö*o—5f«’ÄA.PÎ$<ùRÃÕ¨Ü΀ÔʆÚS³ YZž 4&nýÞ.^LbÀ×HAFnbþ!5îºU£/c£þ‡®1K⌈a¬øh)ˆ´0 HÕ’̘†!|åO‹C_:FÄcŸñæëÕ $Z­Í…õ\^8¬´¶nW9Zt™€Ä.¤ÃzlÕ/.Á¿S)…ô@Œ.ƒ#¢<˜ä &L]ù#﫳ÒJúýN/ž\›=lžŸó)Æ{‡5yc|—C¼uõ¥|”VÐ×ËÈpŽé«„ )ö¶]yCz­UOq÷EnÒôµÑ”é ¥'y[_±7q$;½KääI²,[ÛàcêgÓ÷rîvuí´+8fkw±UöUè&Ï®QTú:JÄœB`¾n)N$¡(mVf¼V·˜ðB_ ò>i]C`ëD±%BÝ׎¸£N™ 6à†a{+z/õ’bç$¢¬Ÿ&ßzŒWšGz g(Ëó”„­µ;Clön Kc;OÂJ­Ù&Wíãø†­!¡ºh#hJ-±â´=[g‡„„M kA“{¦¦©ÂM+!¤Á¨“^¶¹\¦ä“[Éi©T~b™¯”6ÙÆOåp‘ó Ÿeï’FWàÃï±ûD=vT‹Á—D¬gK0‡t)1:]Ìí:cO0ö|nÄ0ŒXtñ¶ª}-±¬ŠTJÅT𢞀´’® Üc,ݧE8öFå@ÅÐíã‘ã ÚÒð»OÁ€ï«ç3ÚùÈ ùMX©~írœZ yr Ñ<¥–‘€¼~ʇê›î´vYUÇ‘ àÖX¹‘…óxgWÀ€ªtUÚ{œH4ò„?í@+Žñ,O\±W bs»»Ìß0WyYZ¿’ ïHY£ÅÀ·U™ÁBU5C‡™v¢U[J©ò×'ÕVk‰[‹áô.Z D©'bBÖD pIšÇ ’Œ‘dÛ\+â:h&}a„©ÈRÑgkÅtê2ûýêë|î;§öCº²¾[kÊÀ×,’ó.¶÷™ ‚±:‘„Ï´"‘Â\éàJ—²×? ОβÓDú¼Æûò¼¾¬èí‹–*ÒkÆ^XÉf_Gza¥m'`ȳŠ.b}6µºYBS^I¨Í¼V22†·½ŽT†s`í`ú.çÚsXÅ^aŠã^Ù,°x:8ôÒ˜‘›ay4FàÌû³v³^Q°&ólˆÙÙX¿Í-=b'ÄA§I÷ øZës yýÈÚìeë0Jïq¾ç|Ö¨_»¦ž"¸HF¡ŽO7Ùû-°WEm…‡g¢nÙ½¡hÖµŽ!¹(âŽ9ótqu3v´,äDû8&×Ë×\Ò¿Æ'io)¿Hl`pâC¬ ‘BÜãAŠªyxÇ5ïDƒQÏäÑ ¶9ÀP¡þÄÆf7êË ¡Íðn¥I©“Dš8MÓ†¦ŠÖ¤ÞÜ==™ù-þwEÔݼéT¤ÝWE3C9Š&#ˆ.jÛ$½ûgSGÚ³fPëiµKž‚lÖ{^¶²À†¡{‰¢SìR=³ ã¿îÒå„—Ç¥P-'Ô¢zÑÙÆÐÖ¥Ö*‚î+Z–£§S³ÉÞhA ÉŒfNx|±~ß9”!†B¥ißi}H:JÄ`hCu]o®#[6YÚ»/íL"¿f3|±4üÈ«”›s¿Ï®é£‘sñQ½9_÷äÄiÌçg¢óX‰µóôŠJÜ~ŽÀ'Ö* ŸâÊÀu¡ {ß ¶‹wǽçi ¼"ZeKX…O8p„‡lÈr¸È©j÷µ"Â8¤M«Rúsß‘0aî.*í³ï[_ŸV'´MÇAûâ^e[Vd—?FŽã¦Ø•R5Þêæ§²G‡A8cçïaÑÝÐüÐNþv*4bÝRs+k”EScV•Þ„¦Z&U¬Krô¡ë+Sjm hÿCSP^Ÿ%°Ft=Ãy7pøqç¾ýÖj’Þ½Hi& å¸ÌiæÀÚ:¢4L`+QñD’af&IËé{ì"/P¸Y±þi‚’FÐÕ?‚Þ©&†¿d/±}H•œá¤ŒU…ê¨{doµedÚ ›I»kC<Ùª§Kš\ŠZÅ?_Ùú@ñ¡ ÑPìÔjÃÁ7ãW7GOäÒŠ@©y\õŽ|™Û­9À(¹øÑ—’l©Sw`…ygD*¨?ïÖ„8÷üµ}4ÞØÚGoÔ ¡—¥3 Ø(F?صXWþóx¤vù—¥am›Ä«ÞÆeîO\ùy ›½¦·%… ûØVÌ;1Çï)o·Dz•®o­‘qKaé;®@Žï]óÙ5 ST§i ÏúÖœÁ&ˆ£†¤>÷Ô1X ‘,qIùÀ ¡÷HjÞM'ç©ØeÎn³ïìÔÖm ð™°¶<Ö–Ów°hå3«Û&åð°>‰kûÑ!´ÚìlS먘3—«M ‹­ÆÄé¯$¢ÝGö„”e(—¥óÊÝ¢F–˜i]Bø8FÁŸìõ¥â(à-d÷CN‚¸,^V9ÜÂ9Ñ☲þqnC[ ÃÀùD{#f£ÙµáemHæä=KŸ ã„]üÚ÷Cýö\¢NŒ¹g‚¯¿„Ì+=– q{#›Ù Á~ýåý}ëÇA1‚鈻µ–Î{÷­ˆöÒ<Ò[’fË㾃[$W+Òàt¢” ©Ç90vzhÌ Óª½<åìrj ^x€¾ÆkkÛ;w×f{pXû‚áüq)B 6õñú#ÞžN‡PUe_EH–ɰáC“" ó\ð@&ÊnDH°,›ö1~Áv Ø—ñ*èªÌÍ'¨MàòÞd4¨h@óM­ö°UÍEO¥ÖIðŽÎ=—P}P%"´Üävœ²úNv¾ÒÖb„@Žý×Ó½ŽwY'Ï‹•B ƒ4¶m*x‰ë¨Ûš_cð ›j ƒzÐÜ|ŒžËÊ"{bl‚ÃQÍi¼íW³J•dÂ'ŠfCÐúŸŠù!µ4:=¶ûOˆé ÈÞXê1hîÂãl0^_SŸW,*›¦ “¾«‹(´v«‘c'èö¿ó!0ÈŒÀ"íƒ40”5…h™"(¾Š‰wÅã.òƒž ϼ¬-5j8|Û—¥|圥톮I/Ç‘| ÇÂâM5ß«2ó†2EERÆñ•æÙvVbóOg[µ²hFîKÞ‹LQX<2ô£}wþªÍ÷<¾.:„_†Ò©a§~í™Ë’Ä &jÖG÷œ^.¤~õ$ —e™ß­ÙÃ(¦4IǸÛµ¶Ë—¶‚G+ã`ûãûÔzPP”%™Vò~H}Tä™S襒ö[yPFÒþûmp/Äz~E»M¡, ɨ±Ù—¶l8´žý>Àif½k!y3¼ˆg™ÞwC°G7ÿRéPsCð²ský@Ëâ µC·Sñu½ÏQcîÅí¶JŒ1 +P÷Ìq“ýT{^˜é]Iþólž‡ÍeÑ‹¾F#†$ÏÇmXê)ÜŠúÆLï9±ù¦K‡±\ð¡ƒ;¦Lß•ÀéO{AvÐÒ½æ ¦!ÐÖ^F“YZJuIù”ïí$áèQB7þÒ>J3#Í \–ÙÕoDÛeÍi†1 'Ì&µÛÎþ‹[׿½ip‹˜+kÖgÊ`ÿ8!Ï`ôûq›Ö,e«iÀ­ô‰’§”?cVø¡Ž›Žp[h‹ùV5i?Up¿ã?°øès&šç ú¶Ú/áN %ðîûñR ŠïLh§á'IÇ[ñö¸Ñþ³ÎK„K¥ J8‘Ê•ÉExOJUÀGD«€üð8Œ¿_ÍÉgÝH®ÔŸÑT©¬ÄŠ•B¸/¡|]ãßk~÷v–#µ2è újîúÝ”išàDZÑk·Øßé3uôÊ ƒ­êÐøŽ1Â"Aò}Nó0<“=\¯'Ó2¤¨¬Fø>cDyÃq0@)ÊDƒ"X­Ñ*Áfo‡óPsöÁ£WC“§?ÀÁ×Ãí²5}ŽáE2û€‰:ΙõF'Ä}®Ó¶Ôóü>cÄï•9Nß…Ô:*‚Mkk¥€º‹ùµ’lš†p-DóÈšvcR+PË’iƒÆwç6Y“RÏH¤jƒ†zW3:޾g$ JåVpwÈ@E@©ç*´mºh;µƒ’Äyëû~9‡b2‘}YÇÚØ÷£‡úWfM.:—›€y/<7—:BU†È¤ËlÔBs†9ã*P A|UåáXÃ2u¨A\7Äw4ŸX¯4i´ËÜQmµàŸE<ÅÚ=ȰqÇBÕ”¿4:×|@cYÎ’ý‰ð ËDð«&zâŒõA¼Ò´©ZôÈÅ ,À‘%V$…¿S¹7!ó;wó1¾ƒDf§wSž{fF#Y•ÍêŽ ­Ÿ¤É 3. «]‘f¾V £Çv¶’· ! ˆpÁ»×“i§ú…צy—]¬tÚ|è¬%Q¨Õš±…|4z£“žÕ§„ø,­±º/¤èžn•@]ØÜT£«ô*‡Õ ðXÃJ‰N_bó:!0}ÆÄdƒýÂÄ+C*ùÀÝ{Iö„À˜¨N&3Ò›¹—²Âš¡‡ÝÑQ󅬉±¾»J9²#8¹êƒöl6ù„`ñƒ`YV’ÑÂ5Ù $~ù ˜q;Y4¤?ÉæD_8}ctÓ÷/»oϾeG!Úî`6g«À<µ7Gû•ëo)ëîh/SGÁU…ÕÅƒë— gÁ Ç.ÒÝ=áÀwšÊ§“r*±î qÓ¢±ƒ"þf¼sЦ1ZùäáhwWŸµš­\˜2Œh¿WIÛ^èßí–‚ÃiG**­«øKy# ùÇIˆ|Ÿ+ÍM‰’¸{‘„ ¤}oJÔŠw!îi¤.Ný÷76»²¸ƒ3~ÿ˜Ê°Š£Çf˜/æ £$¥c{Ÿ’.à‘žÞi—§¬¤I¬§¿ Þ·GÀW>£°’ôr6i„þëËE~*Oô;Bäuëa‚¡HDëáMºv’wº xtÍÒUÌF gi¶oܶiX¿Ò–p›f~†­7 Q¨ó,'dã×&‰}ШQóÐS¤k‚Aµ<%« ÂÐ^ki$rÅ¥O—ÓÈ™7 b—†ö±Ë‡ÑÔxEZ @â»^eÓxüÌ~Ô¸œÐ_Ë>›4áÝu M™I·õpé¢~9!T-i¦Ó2?{U)ñtê!D¼œ§—GËÂ׫ü®2Àü°b&23{*’À›¬øô_êÍŸ¹èQkñIâ³›©èÉßËì‘|¯gVêñS[+;"”‘ ¹¼p-kè’'¿þÈ ñÀ]ãŒÜ Î#]ŒE â¤Xp ³a°PÖá^ÔOéŠÆÝÄNSÔ¯u`>T_˜ÃPÜÿzbËæˆ=sH:›&B!%i™¡¨eQ\Q$½5ߨ“#(.uË¿Ætöƽé|Þ¾£IZþŽdò«Vy;–çTÚ”ÙSÇnBI©M‹oNû-H‘ýH²úPñ[ÜÚkZ®KQSútb#Ö¾2 ÔƒålšGæ|ßÊ*FÇjëC6l™ß è£ÈÔïǪœP6hnq¹uxÄœû/R™ÐŸnvÀ(flu`‘µrøl7Ó\¿Èê' ®µ KÕß‹ßB•T¬ð¬¸5ÿˆîÙj„i?ô³9>cwJoL„Z¯Kš¶]$‘‡r9cçö@ ýür¡O.WÆlž‰ŒøÇéƒþ†OÕ¨lÓ_Š^¿VÝ ÇoˆY]¡ÔiÊ9sA6èJšÈµ_i°yKp°á!TšàF>‹âÃÖIÆÚµ˜n­hˆ.º÷M@ò2«ËÀ‹X†w'2½¬+r‰ŠSÖøƒ1<ü[ÃI›¾‹îíbø9š]À‹’• *‡ÙÑÂfIz4jö ñþIZucã,Þ :Âíµ˜ÍÓÑz¦c3Ë”ŠF1é`²Ó¯BÅkÂN† âÏÈ9@žºrTJÏú}šù¼¡-Ïêót¢3%#>» †ÓÛƒÙ!¶˜Üé¬ß\?x ÛëÙšÌ73=îÀ sð}€$õxÇ(r~©—jUçB`<¦y:„ýŒ)›½AúŠŸ¿^ó$ótfëÒȯNÙGÈÛßÖÊSCoæ¹¹£Œ¶Ï¶ŽgâëÐh­S\þüѱ 7Ï›-sGÜ{kp¡²?ÍÆ4 -¥½a†tH߯¡í±8‹„tàÞF¤Íô rú–H×ÊïÓTè }¿X3k¹~üœvÀ¢õÒc¼Õt]¦œÈþMH;4}ƒ’-•¬êÐdkegP2Fýxµ üÌÞ3îËŠÕà*D#ªúP/ !ør¼òKIE…Ÿ“Ñœ¡S5šãV9¼ `ë+ÐÌ Õ@l¼mWWÝb²Ì7a&zR£wûç÷KÛ/óÍ~ó3³mR±VR=NW/I¿OTt„C;ÕõçeàÕ»o;;¤âý€ÓQŽç?Å,Øó[%7™úA7CÀ§Å[ ÃÝ_kF8(‚ÛÀŠ®¿ãŒÿKˆžåùi.àè!·†/?݈P$ Qî<±…†WŠPDüvµZáoHöæÇJÙF[óÞ×Tù=â¡àóp±íÊÀmŒÁZ¡oß}Þ¡è8þÑ{ F»9Œ œŽG\˜à[C׬§NpÍoNâÓ«“(Þ ;Ø}mO=šw–úÉâ¶AåÝ&§9¸1ŠY¹2šoÙ`Czh:oŠQ"f‹m¡”YÇ]_š`t¤'5Å6B{õ¥ §L¦I²JBÛzŽœE¥ªõm'‘6V¢ Óä/+†Ð°0÷˜ž,‘ŠA¸AÕH–Áï²:uÒ‹…ü¥')ÂsIúê¾(>,É€^((8Øûß„ßSt™`wÂ;Qˆ}ãpØu‚"ýB4)Â÷RÑÈtש Ý;Ì(´j.Ä1ÒPå­#öÅBý»9Xø† ¹­4¸ÇïM± ޳q{hV4†M°W¢ê oòoI¸‡ía“æG6qjpÜVewU(Ç=ßQ³ÍZ;Žñ)Šheö…zÖÒLz×ÛÏ~}Û™FÓÑ:·Óƒã^K³¨àSzœ:”ÁuI㨷Åô0Ó…Ã’C8™†Øy·éiÜä ‘5®êÔWÂVB— qÏéfšIBÆ13 ÏØT·TëšðR÷74…Š)¹¼’SfÉFªqxôÜ)q© –“³fÞgX¡{¹R¶¹Ò+·vø•`<: ²i‚_r(ÞŠÛ ¦p¾¼ÇÕè LzØ\ ÕÂÃSvE¥IS_Æ’~òœ¢~4›2Ç•š»$‹Ï“Žè þ‹¢šIΓ›-—4šÂÓäÓÏ8ªSføKLP’*fjqÙ}"|›‡uø–G½­&f]R}9=_ÞÛ““mÏ ìOOÝÃØÏ ¶‘Ÿwp,9à^˜[ ¯Øà'ΫÄUN‘1“ùîqÝã”.ÌšaWZK(•‰Å©*ß Uá9ÉÕdâ˜×¯ñ¤¨ß0íþ›y™.ÌMa›A“åÛãMÙ•ÚIC‹q*š¼ã—„ÌäO±¢z3ûÕZäs¡+¨°ÊÍ36—FS«0rFa{ÉKÇEŽPê-åß|º?Ñ&ÍxAØÀ_6úQõ´ÁÝlþÈþ³×®³HU×D±#ØËjŒ DÛÞ=µYNõ<àKÏL!Ý ¼¯šÇ·ü¬&+íVU6_Û>±CÅikœ0<3Þ•oê L_¡½^ x‚v¥¡ªP£HEŒ¾¹Tž¼2‡‚@Åa+¶n<Íù—*ÇÏp•Öï¿3‘¥e/¾+^~ŽM±Áß¹ZÝNR•¦œÈŸ&tDfØ8Ì*ŠqHGzM)îýb½*B†'hüË›Ç=VFS¦­7¨||á=íúýo¾p±)¥¡×îÒÝ<ýòb„~ÝËDZÍÚ@L¯ô€SXÚ… Jç¾vÎ9ŽØÓA1ÜùYçšR6Ühj0õLªYcó.¤Ù’»™`лâCóõ‰{ÜóÅHV- †I&Üå9uêð.«ï5^LSRf@ÕãzÐõÅp ?)ñ—/ìq&†¯löÉ1Ï€……”s#—õÄš¦}UL@­ã|£";(\GÀ'ÀÊÀ ì÷ÆC}>–œ‰t²Ýd[`hIš±VZ›Ê§¥ÊSán6…“È!ØÌà†w®¯]5¢'rk7kÌÝ÷Õ¾º˜·Ct n¨<®î*–¦.h/)¬ÉJ‡èÂzLµyÛÏú<’ãùz§Dž¡³5Ø´¹yŸ(X¼ ^qÚ¿:šiD[ìK 9Š9ï;³c¹1döþŠôF^åð’ÁÏ™n5ÖYË:µ™Âl&#ìqWNŸ— {¹¢­côæKh™œ•~ïá}î—żY ͱq2#–j†d«*„TËÕÂG²ÛçGÆ$ ’ÖcŽß\#>!{ûÒ²´£Eö˜»£@ØzYÍ Wò‚)È#zìTlïÿà XY;iýµ=³ËOk#jƒ1/Å*‰õ5ïz²¢.Iü8"ÞD LnIZ–cßÿëÿ&×ÅÏ¿ÿcÿ«ÄqsýŠÿüSàgýsüuôÿ+þóOŸõÏù×Ñÿ¯øÏ?~Ö?×_Gÿ<¿ôÿgÀÏúçþëèŸ÷—þÿ øYÿ<ýsÿÊÿô§ÀÏúÿ“à¤ÿ_ñß ü¬¾¿ŽþåúSàgýóÿuôÿËÿÿSà'ý³ÿŸæÿøõüçÿ~Öÿ_èù߯ç? ü½þÿ³øoq{c[ CC+{K°³•ë+̽‚ÿ…ü/\œ¼¼Ü\ì÷ñßÜlœ¿â¿ÿ `ããäã11a3æá6613ãa31çå2g³™²™°sóþ)SðüßÁÿvþÿ+ `þ«ùÿ{þ—ßç?Çýüçù5ÿÿøŸæáàû=ÿ ×'ÿ 'ßü/œ¿ò¿üUà9ÿÿ¥0ÿ|þsü0öÿ~þ³óþšÿüƒü/Ëÿ2< ™Ìÿžÿå_LþÂ"í õŸ%v^”nèÛÐ1õŠóB“‘U°·Oø·Ä/-o*pM¬hÇ_–?‰Ge¹aoÐv+-xzS¤§óš\ü„ó£Háá4ùc"´¹ð1Yò§‡…æÁ7}ü~#[¯·ïnòÃfƈtq¬í‚TdÀ߉t%E¹*½ÄæãZ~ÈìýÕ™µn¯Z<À2ÄAMEOY,ÓU)õ-ÎÔä|®ì†c²€uŸŠœÚ—B‚)Œ,<'f •Råå v]ôúl…ÏŸŠ/û‰­ßïóÙ\9½õkdw¦õCñ?\Ý•ä —}U?'èýñ[CËWß#Z¹ ¡*sÓ~~Õ'þ¶Ú_¥\&ì­½›‰uÛÛ·3ËNKå1n‚Éu©ArÃÌ .É¢ñM¾T§ÜZv·Œ.v èOÚ'GS7Ù¢QŽy±Äxk#¢kSÚ1Ñ:žš(3·zãŠE4ýf³™‰ »üyèOÉýço—51 NX_T|^O±Ü8Žqñ|úIÿ­Ö×1û Ÿg‚×ý©NÒäèµìˆÜßd!|UÝxµ¼[)¸Lu²b°”¦Ž,¼ˆ ö±zÔã¹~¾"rŒšíù $!lý•&û}~æùöüƒ¶îé‡È¼Íöá$ûi«Ü±U¼ Þ°ìKgûAЇ’^„¼èJ&Âç+–$˜ŒÃ9[B©xf­¦²Ùµì"—¾Ðä¾Å½PA¤[4­ÂO§ýq¥Ýyß¿IWXŠ3 ˆ Y^Yr9Hβ Ã~Hxj’suu:ðѱX¹ö§@/Ù£Ó#x,¦Ð‚![Ç›èiQA°(z¶–YþÃÔâBíÂÒö+?sŸÝSARñQÇoY5Ê~4w“([27PØzŽìeÙàç-feuêê6f{=µ¨iH•_Hž{È+覢ËN¾áûdÄB²V9SFq‹^¡é$P)>÷YöÆcÄY|›ô®òÂÒ!‘äñrŒ[üŸàè|,Dò91ÊåãfŸ¨ùßÀf=Áð@ÒTt š!J/Õ€»ã+ ¸':YVæ‘ËnÍŠì ž)žWñ>]jõjH+ ^š^âØ™-Q³b&igº¿µL#MDbž².Bäj¶´Œ´H÷Ž b§½L¶þÞ¦9#«1VבÄ`s›$°µÌ ƒTpÓf6 “(È3\ð8Ϩ+ÚÒ$r\ö9jd)y1Tbú·BMËÝãÆ¹¡rQ‹OÞ>s?¥Ä™Q d°>G&Ú.Îz¡…V§RšM©uÀkÒ%“ãM$.~–/ÖxÊ´>>eâ=0“öa¡õÈ<@TЭ“ÎNï+þĤ‘[”ØÓØ|’wè~Û=·oL,唃qÕƒ(dS•²›lßYg[ ŸÎ‡Óë >w…Á/ÓP\n =áÒf§&ˆÅK8ºní˜'=·Ù&–ºÊ«¥Iu·#YÍG¥ZYå'Ÿ°ãœ7Íï->¨_»ªØEžÖd…ê¢ £ ×>Ï"`À{UJÀPPÒ”Í$þš„‹=~•X½Lÿþ‰yï·Íg„t4ˆ]wÇðÁšg1ËT8GpÌOU€Ò8ȃ÷‡&äXÃMɬ–HOÎ×Û ¬h³Ð j­Äƒ²".ƒÅ\+k2š‰Dö¶¾m.IŒ½OVÂÃA¾ ʱò=}ˈê I¬lnüpΕ’V~އ¬¹uÇ3_ýú…\Qi6wše:¶¤MÓ–a )Ò ÿÇÇšÅfYšX©ø[G•§àæ=°ÏòPOv`¹jYžzf’ÍÂéÔËvA’°‘*®/šÉ‡^áÍÀeŸ_2ÁQT ­¾n ë¸{ñ „ûñN­.ÿ½ =âã ”/„_߀îH?2öTŸ±¦áªçnsXo,±òôǨ½‡|ÓÛQ ñ?Ÿ_znd¡@«´i+㣑äði&§à*Béò–Ãröš¥ƒs³K¯DÁën&·UÍaùP“TWš—õUzhÕ„Ÿ®Â yÇò¡YVDVüVü:A²¿Ckx;{§þ™p¼ ÷ ºey!{ÝÌ$嘮²pùi+P`(? :o™g£ÈÓI ß TL¥ávk:ÿ.K™J%¯~¨ŸW\3–W0aEÞÄ›_ìÈ2Bî1„Q4˜Sœš²ÇXÂåænÂõaxLHË­aBô1R‰djJ&öÑØTý%¨Ï2Ú¼1N;"œw¢8.•áA…žäˆšqjjº…^ïò\ð»n|/®ÚW 6»ð¤.¸¢«h€í<">™j 7ŽxÐa¦LoÍÀÄX0Ñ8AiÙzß^Þ ="9n\¼·bêø£™!cïuAeÅ|HŠ ajŠ¡=4SSûæÃP%.6ªÙ_¦ågÞhò¡õ¦ê®}|de0öT}?n@µÈa°ÒhØÏöã•>ŦÕF‹Þ²Ã¼Õ2pA—>r²¸´‚ˆW­¬ÊLôºx…a]Â+s®ì«Óº,šmJcò·¿¸ÑžQmÀTˆËMI –õ"6ô¼ú [šä¤p÷„Ÿq‡E\ò:>Íôl©_úádm…xV:ªŒ‡Ì_™W3z´‹?«5R0Ä%‰rÊY­Ïµ¦—=«ä£B&òûÁg8{êî§|/àµ83|ê$qÅ=VóHtq]åk½é.5îPUÞhÛ¨ù=N3ôq”ËC¨ù¦âÚÇf¹lBo"1¯Æ ºÂB2',À¨x,3;gBGY(urÂ®Ðø.zŽï€£f™U8« ÁÊ }Vm`ˆÿf’ÒÛz'Ê¡ÚnÌè„¿±‚XVûȳ=7Æú2ˆò[Üp%ë¿& <&R_*/%8‰—¥3ÛÕÚo¦§, /_*×ÃŒ÷ØÑ„DÑïÑEkƒñ|e®Š7–£rÞ4-+DE“-•ݺ£«"!¶ˆÚl{'öá¬ËYγ¨;«r…4Iæ–(WM·ÅºŒ`|Ñž2 À*2!ðÚQ¬ÒÔPAb-ÛIyô™iW ¤¾8’ƃӊF pÔ 8×ϰH>6ìHÌÐh‹„þ:÷…ñKd¡ïƒ¸r‡3Ö¿’-‚¶„Üwß•ÀwyÚ\RŸ4C•üì8%º’K8 "¢µmYÄ’x?dþ÷x ÑüÞ¸,¹Üä¸=EQ¬Š¾Ñ bO:D=•ü]õ¡çÓó VL¢³x»@•ÙØ‡ ¦|ŽLm¬ 8´ÊgÐíKnþâÌ"hrˆ%AM¼Y Ï×ñ§®s80¶wñ‘ÚÆL°•ôµò³ÎF¸)¿øìådªûpEFu0»TÍ™”ãå÷5H­¼˜?¤†ƒßUÚÖüýé•@Ȧ½†çZÆËU9\Ï0ÅÓÕgkÄ>|jfÈ/\YÞ3Þµ_ÙÏï.§ÕOö±èĉIJ Þ ¼AögÇ›%88Ï^î„ ¥/}È/µ.§cŒ“Ôš«.‹|WÁz}\ÂOðâS1¬<­›Q§þ±¾0#¶åO{ë²p–f{ˆù-¢»Mä`—=Ķ. ©ÔŠEöë®1ù>¹¡í<°ÓY Ké›Ó¶[ˆK\%—Žˆûò !B&(H« åïuµ,ÍIHCëz‡˜.¥ïZ×Ó,ûGßæŒÊáÉy¾‰’Kõî‹1ó"6yæÛT·ÑÓ™òçÑžQåÚÚ—6…e=TpÑÏž‹ä°yC«™±é…!>¹ðoÅ<ÙåÎxŽCß\`†»ûT‹]Þ¶"@ÆÉ#PÈÖ xèRæ—dÏ‘Ÿ\àeÀóO!".w­žäÑ>ü¬‡Ó¼°„èà²ï§šò&ê+§µ-ßwš““KóÇ¥U íàú£æžT%10³#FÚ„ôP­hC ¯Û­73šHá‚…FÃè·B¨~ÆàØlñÔj±§Ü¯y½uO°’&'§ÉëÒ˜ª11ëÒ?«(4ŸR¨â ]_"ö™û±(&JNö`ÆKº³w³r«5†:…Ôfsa"L[nSpþ3þøï×2âr›W£P¸Ü',›Ù~õ§ÝL¯¨H'L81w\ F9YÝíJ?!‹sSgÆñ_!yã•òjJŽX í±Ö;Ó\e÷í.Ðùü³7FOËá_K q²h,¹n‹ôC«U4}ž 8#~eU%gt!5dŽª˜…ÅÊ*ª[à®^³If'µìÊ‹2rúÄ)rØv øÈ¼|÷1Ó‰¹>Š­sN„ªÉ®È¿(Í>ÛR2ÐE#Ko.!mÞÚ›šÆ¢ù¾¤dÐÆËpl”åÛ ?_xã® :Ö¿)H‚,á Æ‘WVM°÷h–!æÖ¨é•–¥†¤èhˆ¡¤%Z9`ºýð¶ÿvqÛ”T±$tûÌvÄ@%_ioq©@˜Èö°»ª,4ÿŠW€§ß“ía{7´Ä9w›2ÈÜÊ„Øfzmq–!>ô IÏ7~Q4`¤ÖÚ—¶!`&ˆIâãíåù‹¦«“[y£ Ó ÁJ‡^”–’õµE”Åâ-á&-²‰õ>øE1mt"Û»Ÿ>¶Zäˆæ˜5ïP¢Úˆx>C[¾Ó¨yow·›ž–v¢¶(j[‹¨"ûZàëv‹R}Ý}eë»y.×Ìå[ªd©W!M¡NÐ…ÚÊóg£;‡ÖÒ÷T,˽ÌCFìµmuËlv´†€ŒÉ»ßÙïeR4² M;¤ äuN—ÖLÿpœù¹FIü3ÎÖNôÿÖF9´½2æhžði+"câ«DØdœ5ñW.AÜÙ¤4@ ýɰ¹Òjòc)²ñ¾ DG¶M€ã¶kI. ÆÛ-Ö –L ‹ ¢Ve™òYRGÒÅÊ—·4r×’p2†2¶¥‹$ç)Wb‹üm6%àç^óGÁìпc6Òä¸HâåDÜývðò"@” sb®BñÁÚ)1—xµIâîÙIdšä63Î 5( T_õ׉2{‘…ïèD1ÜQìãÊ B¼Á®±@}bMÿcÀƒücåOˆÍÍ?¬^ó´KÌ'Ý4VçGˬ8_HfOžožùz…©­˜ö]ÌÛªÎõiu:9Ô|ßô ükɹj%_Ž‘ÒBK:Q¬ ¸¸äóulܹVïmI¦Qk2tÉùš,Ã÷(©Ø*›ô»t,U^§ñdêBz½É'ÀnÏdéy޲ë—_ê|f…¹±¿<‰€ôi&>ög‘m/†YGYçX>ôÈ[޹!;@à2I.¡ÉÝXbbd£âØòÚ]‚XlÜ?¹õ¢_£!ªWò캧q:³ô•2nÄ¢lÚàû[>¬Û$\f .ؼ…@Ô_ÖŸœvÖ—†‚ñ}rn_~<Û2Ý(ïÉ0}Ǧ5ô¹À™ÏêZ`à£ég۾ќL‘]I>g¡p*Ÿ…ðÀ¦ÈB3lŸ >·—·œ “ôc‚))›EóË:|úºþyl0n/D÷ÑGB/U Ý@×ei”ŒÄuÝ„çã]úú'ŒQ2á½uú–½WÀÅŽçãµ1Ò­Q´OºjÉs ÉÝÀ’'S¬d©gçÑ®µ•é7$Ѧ¬ãO(ß<ɦ¿v%ãÉE‰…¡ Ø/¼uQ§³–ÂI=:'²Ç t%à: R›,fÄyõùÓÑ9ÖK)9±â@ë'ØáO°B nÚ¾±Á…fÕR¾yš3ß‘e…¥{¯—x¢üA$´ŠgÙO«Z"íE¼pöH) –H¨¦ÿà‹«``eØè ùî&þ±/ vJéÛõ›{Ç–JyiÔÊl^v ‹ÎuJI¬v;èâ¹þc¡Â7Øö¥ ›X·ÕW8÷ꞟ6þû]IþPY²sbŒí çôÛÌBë r¸ÏM>ûP9¸¨Þ+Æòn=ïæò9"»áøPÌtQú“bÿ‹ŒˆEO„8vC!%ݶUf»`½¾»‹âž?6ºÑˆù¥¬àµÓ‡K\1c¢÷£c$^opïnkc¥JrQ Ë >ËÈÞ< ~_ý˜‹©‡ðu3BLí™#3Ø[ [SµïA ë.Å7IYË+ü2¼AÞ—vÊÜ*3Þ~yŸB? øÂOœ)P¸)S!á´sà W¿é".ÞYIŽ äÞn0Æ؇~Dzçÿ¹®òY½ó­>œJ`b•pi0í(rvõžŽ´E i{+‚Lº;¡¯â¸ß5*/dâ=>ü5nBhìC›Íç71*\ÎrÅt8§8ˆ¨Ì;ßÌ–ÈÅ—°ÉÅ…âŽûA†c]Tkê==ij©(Èß Èvª¨T4ŸFRå©n.ÕÛõuQ"hÔMy^uX[ZÖ7¡_x3»ç—| ²V¢†ƒ;gy¤Îw䦢A<ù;ŸƒÓT>]%1 cÚÐ67zÜÐ¥O€8D–Jô°Ã´ùáYX¿ioõ™ãÉ'ÛmÛlûZs"7ëpŒf.¯ Oä`ć÷®‡í2u "ß f­ŸÝ¬W)gJ ÅòîœeÙ¿…4ÐXG~0yg_òBº€R>è%™Ó#Êä(a*€ñB[b[£7oþݶ½ŠsϬ‹áÿîd']¨ÑcäžòWbÆ~Âû¼/ü¼!‘jd°S&zØ]ÞÞöËè×SfÒô°TâÄ4“`V€ÙG’Ï"RÌ«-:q·zØéj¡¼.×þÊÁßÈzÈÇëýí†pcnöËûøå€CN´³ç¹¥,4b—!·Y|ýqûñ³n™o%¡½Þ©º‡ý÷¥Ÿ"ž`Nõ]«# ç÷õSÝ|_/ŽÌ˜X}‚ bìðbÈ.„RÄ_£òПôFp„ h.UØÓâ'é:Ù}©À¡ßŠ (ä¨~£‘q–Riúð +[JMQÔjq+^“b)ÝÕ_a+ s"Mź"áÉb1Ÿ+¡ØhŽçcë¤b>.ǧ5ä ^ßÞKË=gú{$àª[>ŒÁño ±Ëx«¨Šå}õ8\¦+cÑJ‰Î «ßs¯ß«&í¡r[ÙNÀTsÚtïö‘$¤`FMÀœPy/‹h…i9®yÿ%N*mý­CÉÄÁq]¥Y@5ÔIŒ()*èê˜êfû8á4CüŽ<A°èõ ÷Í­ïZv@¨&÷ɱÂÅßøÿv‘råå;÷V¸°RÙèu:€ìZœ›ã‰ ®ø“ȉæùAh®Ö†ÚÍ$Û`]o¯å½“ ¼‰[70f‡¥/†œN‚”´à¯ä¡å–Í2÷íH}ØÚª60;Q Ùô¼9ÆM•ú{”k£Ú\‰Z‚Û†¯ÑüPŒö›x›)ñƒoníÞÖ.y7Œm5Y RñÉßEãóøµ Où^•}<Íê°Š¾Ü9ÄXž#ÛMÅñžl·4¤rå<³¬ôoºµr ú”‘q*ú¥i¾ήôp© ’7ýÑÕ£“ye ?Ì¢Ë8Sï3ßÉú>2<9eTë(¹LÒd˜³íCöŒ”êZ÷EÛ·0“ìg+ …£îºœ–>ŽŠ£:QoìöÆžAw6"œèf¤‹Ÿø†\íî¾~ýÈóf3À{ößâ}]hÖdÆÖbí–ãRn@µðË,NdƒcåC‰‰¬Âñé~âÊ_vô”*2&:¢£·,¹Ý÷¶ú÷Y%7·Ñ̽ø vaL‰$>3‘,b=µD foà Z<O[|t•ySëƒ)6ü™boë §ØneÚfÑO€¿sEe5Å¡{Þj¶Á°sgãÛ ÓÃR-§Go‹+mpÇ.ç5‹>é¥LKN–‡Í¨Ô…/J^{ÚnÛs(Œ"éP>Ik¢ÛaÕÔGÈ"DX5ÕlÙM_×o‹>žV¿{^ózJ`¿\”Â&¼w\ ÊàZæ'!?Ø­wD¨éXZææU„î£Û£býøáÇærÐæ÷õ¹õ¬h;Ãs^Á¥<׉#/K\S뛥µì):6°aÛt+2²`]yIX₵e³0XÍCŸÁU^™Äw¨GÒK¸þüc˜?ׄ¡¶½ÎH¨ÇVqÁ5:ߢÂèíéXp$öàšãw_µ—Ôîèަ-g¡j“â’·uãÁª] K,²Ò̵2zM¦€‹¤ß·öñ&+Pë[+“¥Ô^DÐŒ÷ý—¢Ÿ~ï—ÍL¢fÙ¥M<Ý1†~ÜŸÐÖfkg>w }ðõŒÖ{“mQ»iÆãúIQ (O‡z­ÿcÔiçÓõc½á'äôNÑ%ÌPçÒ¥™ƒ+L&C–˜2ÍVôJ2´3½B~Ÿ¡fxŒ©]¼M|§Ä73¢Z_ðÞÔ:’,±g»OËUtO.öb¿Õ{QH‹àhî?s¾™éÑ#ÐÑ»ò$YŠHÌt"!q0>nBWΦé@wèÒå6­_áÓ³Gû·ôÈÇSž¬²›6{¹Š¥vöó!q#º²!ßsNœ—*Çß2:¾0ûµ¢“•«uóœQÏÔ{@×ÞQ·š1a#x CwTXu»€"ªè®e?mró ¡™ý\¹…ŒÇ#š¨¯äÎmíI2Ä÷Iü‰7‡¯¡ `çî Pc±ßïvw¸sp:>-Ø\%ú ™9"ð]¡v”!ô‹À÷E§®ØJ“®nãÊðš§­é ‹µ®"¾z艩o¼Ô2l[|°Æuºv é‚kÓS/ß «½E·TSßò(s"©ö°Úβ³ïû4†œ_8¦¢îcóˆÛíAÇ ±E]~±ë÷)áM~à ¤9ûMÒ§þ6B3 '"âvÒ¬¥Ñkü¢bŸÒ}:îñÉT9‹9¬â¦5ân>ã©WŸضÞW~Bßó¯WÌ¿ÊfW¼Y²DMž ½G®7ódøŽ•~ÒÇ4Ä<5Eõ(£ú†‰nRÝ÷QI1Œ7w½q zêÄÔÝ™/ÑH` úzˆÑëlk¦,þñú”iõ³Æ»íqë GÖòâ±I¨pázûÝó‹+õìBMœçn‚®ÏMÃS¯kƒ#.l§,¦"›‰9)lÕ/ú¯Cv³ï¥Äõ^D³ƒÇš•‹ŠÕoŸlß•;žÂ§"ÚnzàQíJ(†–z¸²wô‡$Ng@´m°kÕ6_Ø,\6*ïÉe«K8K/k ¬-v‡x›™¤(Õ|ˆ6œ’:•´ÑÁüEFáqÒ¬–.Ôš‚"xÌp‹:ÃNBQLŒÎÁºäyNé¸G¡œ,óf›òøg¨ë€ ²«à›Â´âbhäIrÿ°Z]Ϊ«ŠUœ«õ/7µ~Ž&NºtºEœñâÚ~9•–$ ¦dàñ¦››ÇY ÊI®xg‰ÐiZ‰Þ-C¶ •϶/8¹qÅtÈ6Ca­Ÿ‚Q43‰ ûØ…ƒ2Z‹‹Q‘ ‘ó%‘J•?'ø«¿åj¶˜,>vÎ_&¢˜hT2‘áíyz Í0æ©^K H® ·¦0\’ÕÜt*`â'NèeEwš Éõºâ$M,f½áßþü&X¥Nç©ÞÐÛfТJY`ª«/W›Å‡ÄìùBæU2z黸%d8œHVV¾p´/j©ÀÞáët«Ÿ‚nz–|±1cÏéœ*ñd¶˜œChÿ@/N4; rÞ‰&]r®Ñ["f>¹÷®t¯'˜6?)Ư¿`x­†déDŸðœÁã‘ÀN9ô5žrS’ ‹ÞÚØà¬C¢§cdDá½™·çÐLii–éýÎs€Ø;0‹A6ø]È ÉŒ2s£"&HNgÛÙÁ®E/aìèý?ž²]L>K·-q‹­üs"Ø(5 $evFz¿»É÷Þ×`“3>Œ÷²³;¹ØŠ7Ãû bÇ‘;õàÁ©ö6ínzþYñH¤š¶ø™OAõ &¿«yÙurŸm¿;ëfGró÷H†{<¤Oã&Iv¡cs`=j.çyM$IRžø×®º#»™å5Ùƒ;…Å8Áýn¶téÏÔ, XïNèeÅA…Ë[”|診+îeiƒ#"P±} £cБUSñž7haʤż«ä=ËpüáÓÏ}*dÓÃìòÁÒÂ~ý&1]¤¥ÕòûA]Zð¦1‘M¯r\£mé(ãzHàT,9LÏå7Š5>ZÊÔ/©–?ß0d¬–ïÉ~éc¦ ¬UÓcDW´Ï5?Z›dߨ^Vc•k΀÷ýO«þoºü7áçßÿý…òüÊÿð§ÀÏúÿ åÿø•ÿáOŸõÿÊÿñ+ÿß?ëÿ¯“ÿãWþ‡?~Öÿ_(ÿǯü ü¬ÿÿÓü<\œ<œœ\¿â¿ÿDø{ýÛƒ= ]¬ì Áö®V®^†|–††f`ÇûÈSÛ-Þ÷ïá_Œÿý]ÿÀüç`çàdûÿógŸØ„Ÿ›— 6çç2åä›qò±MÌùÀ¼¦àÿkù~Áÿ[øïÎÿ%Þ÷ïῘÿìœÜ¼?¯ÿ윜ܿæÿŸÿ(þ—ƒÕŒ“ÿ#ÁÙÌ¿Çýrp3ñ‘jbâü[Ô/«™ÙÀ7utü‚‹ƒ‹‰““0î˜xØþÄ„Xuþ@bloïfojupúRv~6&v6~rN&`|ü±«™±éˆÍ¬ì¬þ@Œ&v6rN..&v¾¿QwÅõ÷T†fÆ®Æ?µÈÃÄÁÐò°3qpòþ!"š×ìÌo“Ÿ‰ƒ‡h“‰ƒïßè8YÍLØÿ@gne þIR^&Nv€Š è"¾?DQs™ÿ=•¡›«•íO-r3qò´Ü€*øøÿб?éÂÜí?ô ;ç¾áâbûƒÆÙØþžêõ ×¾áâgûƒ6øŒÿ@keïtƒ³×O¤|LÜì)7päbÿÃÀááø‡¤ÿ¡m>v&nnrN^&n~Ž?´ÍöÇþuÛ»ü4‚î{‰‡çG/ñpqüŠ9ÿ{øo®ÿÿR¼÷ßÃ?_ÿÙ¹y¸þãúÏý+ÿßÿ1þšø ÿÿýÚÎ8Ðþÿ-##CHèxõ[À·¨¨h@@Àòò²¡¡!ÔÈïT´U[¨Ÿ#¿±ü[䷢ˢ@bصæÍî:«‚—½ÞÂÈKß +mÓ¡³@TýîÅ,váî0hž·Qú™b “Uþ›\Œ/2hèÌÐ\àÏb—@fÐy–ÇÅ00ž^·ïÓï&+îž·ÅçæÄþÝÇáî¼r4ö“è„nIJw1nÂ?ga&±¬>ý2ó¯ëxAž¼†¶8 V¥_³9ìØ½|#Zž%Š|ßôþ”E5Óö¶ç½`ó'†M[÷Hß8Êa¿”ÆÅ§5+öKªü·£>ô‰]áWj¯ô”ž‚?¼mÉh%kvvdòÖ‹Að_‰ˆÝ¨ŒöZ<6–ÕœJcÜR’`À9é]í?L >ÚMJÒa0 ôyÖï;˜Q¦Òï^”ðÜånçë,E¼EkznÍöKíϧà ©F-V¥…FtVgYGÙŽõ¶95/ à í+XÎ]®Ø‘ᕉ_q™A–­KOæF+ÃdýÑqqçôHC€¢”±zÿ)}t™§Èx<Dzu½õ“Ðr-!VͯnNvE8ûÞóA”Lû9 8,¸=âB†Hû9ïH8Š@3>º¯—ð2Qi$”Q¾ Ÿ0¾KG¥Á-(ù¸îMãUB͹$} ððMxÉM2© (.‡·ŒÅŒÕa–·—×­È覆˜P†ú%N}’TÝØÒ‡åM ¼ˆaF’:÷& 7¬~yBõð¨ç4°éd0*‡cO} S²´«nüôºü±W[W±a›îÇc‘øé¾¥/çí£Oðov¼öÍç:Ö¿¯v_ìË•5ÉuD>fc©n5Ü8l8, Ãsê´¿Ulí¹Ù5†ÏEŽßXU~Ñ-þbÔ0Óu¤ƒõýÝÉ wÁ„Û×d …™JY¾´%+ôI °ïa£a&NÓ:ß5liÐ'Y©TùZÊ‹^#cŒô /m¯¬¬ txp€ŒŒÙqÁ‹àE%ù¾°—¤Îþ¢|aâ%Ðq’ý1/>Û™ÙLiºœ¯mLçã§;ß×"è5&xþiÅŽèz±XÇç¾³+ÜÅì‰ðž.g,ÆÌ>üï/j…¿òÓIˆ«´Ö¹¡×HK¿ôéfôg/[i0VÄ™¾ÎÍìó¥# ôZ|õÕîP !…‹:»GãBô†7¬jTEæÍ 9pZ…QünÃ/Ϥý€õ»Prº° Fq2J‚E æLâÀIÓ1Ÿ§¡vm7YFR{d v’=n£Šì¥z`hÍÒ}ÎxÏá–É&oÄ»†Õ½žÁÔð®–§ž= ­OÓn)¨1d¦M´b°Í-/ô™q6Ù‹hç`WÃ×u(¸Ë€3SvÃü9Ù•B5æ-—SvC–8Ùó%`Jl—ò™Ôçïz©À‰È>&Âh4îů-…ÔðŠUpì“åt%hUÞ 3ÈUŽ- ÐáH¢„S3¼ÏšË–@ Weh¶%ÆyÚg— ¥·A’€J`"‹à‚×ÚQÞ"ç3.€>€Ü…Ünš$ rŠrÈõžHÂ¥ÈU‡…¡ªÑÃÃW$®ªe/ø;³¹\70=ap•ìQUE~ƒÌÙh³è Ÿ®\‰wzN ø»êÚ›oFU3ΗR»¿.¨IÜBrÀΨ*6º9—{RüÄâ± µ–3H¢Z¿_©Ç™Z†g0!#+Ç¿ÒPúÙå¶·šŽòˆæk_‹¯³åô rá]t †µþyRŸåÏùoªÞ E»¸ŽŠŠ\йùÌF ¾ýf÷ÆS¢ÅbD•^qÏu±.-"êq‚ýõäN-cL„ó «a¦ßX3–²{Q<…žãèù÷}ÛÇŤ‘/s«·&ˆzC·?,AÚTyj©i{‡ûI¯AÛ¾XªŸ ûü9Cbof€—™Æ¼ K‹'Uö’¥`4W{üžr¦(þ±ÅN H€ÃÖ¬£fs4×_ê¼á©NnŽòY[KTÑ «YXƒ<BºÿÝš Ùˆxs£Ô—~d\*†v|Le {fŠAr#j‡@;]@_ŠÒN€t£b³²8ÜFµÂACªôjÆßt>êŽH(D#ë1ŠÍ«_ÙªF‘©vMé©>$Åå-¥ÅÄMö¦Â’È•˜Ùp¯ !ÎIÜÄóô¼(~L<܉tf¼„bñjÐSÃncÕ”æ%U¹P~†bmó@«FJrõoEy&)™ -¸ŒURÌ­TU‘V?1]f1ÈHQÃ2|¦ål2½Y]™OBf YÔ¼æYx ®UÉsl_ÙªÍ{Ÿ/îgçÛкñ–ɳèðÜØq.¿“÷ÈŒ$¸2Ô¹CǺšÚÅ‚ióèë¶òÅÄîŠ9±œ‹Ì4ÇŽÆsUª 7+¬üXB“P·£äa÷ã¥á÷Øo[j Æ5eå8® È; ùæ-1¢$È çµl‹¸vn'Å8…¡ ¹aw^_žÃ¼c¸"[7î<,šPzÞE´ªùF¥¹rà`¬×&`ÈwNµ/U"´e Ë¿ÒÔ~‘CÂm›gÙÕ¢dÒ3(/z’€”€U›.„  ohP}µ“á¢à£UôX#ZNŽºœžX®Ö`ISëCŠNpT›‹šñ–€ uAlzÄG}†­5Yj^ñÈy¶áRg':<¯†'aYõÃÎù‹(Á!Ucs;uËÑ/=L®!2¡ ¶ û]¹&î}î¡Ò=^ýjÔ §Œ–T%yQ-Ú p-Ƽ'÷ 3aP÷@ +€'DR2Ôp(QGcËP«> u’¡¦’‘Ê-çK”Ãè •éÙãû“Õó¡ÃO5¹±áü ÈÕ_Çó~?såPk¼a{}êDê ÆôC—@qis0CTe{ˆqC ¢Ã%&ͦ>©Ê®Õ!%¤½‰0Ÿî³Ñ€oyrRôžJ\Y½ßk³uÎb6jP?³«b䬃¦3“_UІûA¡ñ[Õ›t92VÊLƒ¹ '„‹§ŸããÝe0ð ÐgŠ\oy÷̓S˜–‡MÓé†*ïæ#|Ý7âŠPSö ÉD Vkm·G *xw~%ºÓŒÅãIeZ•vÁ9 †ÒÕ÷‚ÔÅj¾#ûùlÏÅ5íÚ6–©~†4½›7 !&&–¼\9W’“:!{–ˆOQk°Ò]¸û¬Kß½!ͯø»];c¤ÇÙ ‹‘ñ“nÙK³ì»÷´ï媡oVxbnúPŠ e‹Ä€€ñ%-24–5X;¾Zv±Ú@gOØ$ŽW ˆ¯Ç_(;.Œ‹ @‹S'Ø­éœÆ§t½ª(g,p¤ŸªVM¼U«QH"€çr>„”p‘â>(,»²2Ûqͱ]8ËlW£%ƒS™3(‹J'óÅ®4›AáŠX½Ô ±Š]æÀñjÀˆ²ÕÒÑ5’q1l]c=E~…lÅJ3SË7aÀ,Œ¬Ê™PÉДO¥nÙ*ÙKÏ‹îÛ8=ìÐþL"¸„‘½ &îË–h׃dQ.Êé­+ly0€6yÉQ†vY<(ŽÏ‡¢åÄ¡eш^çæÄz$n èÁìëápˆ~)ˆ÷bPhëòÌÌÍÁÒ`hf\ S/³âHH<Ù²eP¨-Õi5è20Ì&ÏÈÎ0ôÔÙ2ŒÜ©8(Āñ`Ic²½qUvn^Ë5å+”ÚÚ·Ù8p_'Ì™,µ<Ÿ¿^—¬ÃO(ÓR1€9XfÄx;Ï/ݯ=—_…C.=öO“>äé¨ß×’,"ìø×ËmA;W»¯© Õ¦:N”eX"³¦Ðz›Ä÷ÈRm\ÔY®h“ü%Ÿ>¡;“Âg±è}øíû´ìœúø~êìšf¯2ÙŽ‰ ¯À3AÃñ?¾m¨Mƒ½uÖá¢Ò5ß«õýx VXλX>Vî¾Ôîú5†H…žÐ˜E…¾1þPgʲSüŒ¿8ÿ)X‹ÑœÔY=/gÏV¯\Ó4ó±å~PVs5H[ž»¿WZE½XA#ÝKD1¿+¤ku¾¨ÂP”O1;Ì7Pgtò!³à-ÎÀ » i(¯””.‘va8=ÃăÉ$¤Á‡¸½Ÿ?Ë©=FïyˆKHmÕ(ANÈ€%W gÜŒVü*¡HTöÑíhMk'YçË7¾YX’²D/•B”©M:cáAtzj¯ÈÚ_U„‚—F$Ÿ-ªÈ’=UÒwÍð›’;£°c,èšZT›ìå|ËMhÁµ•Âø¸™'i§ 5¡ÝrþVdí¨„^O;o?ãóRNQ·×é¢G•ìùÄĈ(MZ±¨J¢Ä¥oÇëÿòViì§ü䃤ÃÕ­ô“*3äRG¯—$j»ý²9D˜§| 3Ñ}4H+,cJßÚO¤ì 'äh…Ë̓ŸàF3\>S%d¾™<<4½;9s=ÒŒ'û>š»rfrkÌssáÄ„ÜÝÃpF¶Ú¯×ä%‘¿×!Är0v8ø‚Ì ò‘ë“Ëjl°up}›¥xû¢wtˆá²ýmóŠu/îì•ÐÜ ¶øÚÉפ÷aÚÇ8Þ¥ªl[m¤†‘21Á R7sùE¯nlßµò]3ø+êi’6æ*؉ÄûŠK•µ/ˆÿàVzh=ñ( n_ëŽP ³ü«fþ¼É{¢}M&9†îÆ;Þ˜";–ÚÒæùÓ¯7éeBëªÒÔ™2 hGÙùÑñDIj‚Jûž}A¾ ÎxQ³¢N"º§ 2ŒM^O×ô¨‹.ư™* Û¿?Š·èhÕ/„.õx«(æ =¿Åú.IúÍÈ76 ·š&›ãâãˆÊ<—f'soÓÛQiÜp, pŒ©TÙÒ½¸^ c>úõÊB^U•€ÿ†¥N˜iøÌ¼(d4}n²ƒ)š¤/"l·Uû·F˜526/ªyùÓ?ÄÉ{¢‡²¹ú#]‰öö™L2%œV?‰ÂbˆDÝ„?â BX+êÜ&ùj)ÚÊx`†_ñŵæmÓtmQäH8¨ä%_¶êìL|Ö—P †=Ëý¬ö€Xß2t¨ ò*ÎæWQ$öùWŠSl_.-Ï6[”€ñ4œÑ‘gŽŒcœ’Û…ºkehÖk¼a"•ýP.ªŠ OŠIºH!×>4en^än m|ÊÜ"麄mcT¯e½7Rõ4„ L‡ET׋õ‘mÔÍÏŠefM¾¿|{¡EIè[©þqz*Bœ íJ{Hµ_¨ÈìªÜ1ù’evEï„Ãcxª:Ùw5Çg1A¢ óõv7Å5]Ü>Ópð‡§–7䋹ÒÅeŸˆÍéR×rYž”wìà3LæÁØsàö\ÛQ1¡äøú^$Wôƒf i½õNâ{IŽ»GòºI/W@Õʹl“SWhP¯ðd;PîU£ýc›;l±å±¯P·^ááfž)cB›ÛÄÌDªLe5DL` ³ç=š‘"¥¤ëi±µ/ñ1xïÔ€(3?ÙŦF>Æ-xö†/¸Äó·¢Ç²¦Zò ­nUk”Q ,7Úã\ÙŠÀ8€PÍ«L¦ã'yI@ÛÍ&e7+³)/}Âüí¶¶P†ìÜzÑ“’¸eË€€óùV»OÕÆQ½¸®2æUUƒõ•Uóý¶ó5É ²5‚dKk-sÊ3¼†{…|hÉ‘¸!Œ@Þã ‘u}lÍMhŸUéë(`L%Ìï´ÛPÕ?2ìÄd6Öžù+)0ØDäb1,×ó1¼qÖ&NÐÖaŠ–ËAM¤Q7¶±øŠ#O-šR£êW”çrÍxÙªßÚf¾­Š Q¦>ìÇ%TøÏdž ¦L¨©¼2ŸþnÆ–I.xü&0R4B]íÍgµaeø»lÏvF2ÂX¸—æP‡y™LWdiû2ð5Òù%™L’`^Ž1–¢ø«þwIQ $ÄZ²Ô¶iwô{Aî_©`k…Q…þ8nX†Õ„AðèM ­ú<èŒD|‘ÙR;f@½iAìÌÏŒ<S#!Õg”iCÀj†Ÿ;e@sßÈK"y„”a ÎÐ "é"Çp3¼º15ˆH0§Ä[LVÏ4ô5ÐÉ÷ý‹ú¿ñmíŠüæ‚Ï¡ ع6©üßOÞ>„ǽ‚|)*Œ_ì{ß0O Õ"Z_ðŠ"Œ{€¾Ï‘ÒVX&¡‰Æ¨½®gbb¨ îáÃÅc~ƒŽÇÅ ƒ¼fÄîn"hÅ»è“R[y"ÚH_#Âò”/TÑX>;†ÂDíU¯qÂ÷ň® Üš3%Zx²è…Îl&ž ¹Ï¢åŒ_7õÔZ]ëjŸ•rÌQS*KqQ~:žìñÏæÉ;zqõö¤”šËÆ4 ?UãÎÂj ßßÌ`íÓªÄ;76"ŽŠnë1Ø÷ÃB/W6ò~-5´Þö¶¼¨…Èí=-ën3qÙ?zdCÓmLWN^CWìû}ËÑ™Uß÷ÈcÃaWÀ¤Lõ&àßmauCt¯°p`¸÷ƒ ‘}Ÿã —w› ÔU…D‹Vô?Δ£££Ggûø† ¨œ0Šv& -ι-¤ ³”úZ)ôdô¹úoI6Á0ÓɃßä;3›ä³juÒùS3*«`þÍJ¸å—:aì¾õE<=þLu迆Äðã¹¼ Çý91ïTÜphÇÞËÑNÃhúÌà‚WJÒ{Þ‘|¡º2ùÈ¿?´i'Sd¨ŽÅfèù6£ê ½¶m›Qý رrÙÀPÑÏß2}ñÙÖÜ9©å*C¶pBÊÇ5{³x¹ x®û2LhÜl-J`PQ¨‹ßtä€1 `¿·f)~Lb`M5b—¥&QÊ'eºK(X¸_ &ñrapœï ¯ï]艤”¼œÔ÷Êê– §(D¸ ™Pç*‚üØŒ‚¥ð ‡Å!&Þ\¾W-6çÔ“2âo则¢tCA¹Å8´„¯ÔÅ9HÕ ±¢C¹ÒåЪøàêOdÞ8{¥*Æ«Y/©ùÄÔðìŒe™[ö¶˜”ƒÓ›^]ütPα‹×‘€ã¢›áaV-±á«é¢c/ßúÍ»sÜ‹Ã.»ID©ã‹©¢¢}Ä5ÕxÚJ˜ÆO/ÉŽ€¡ÓÉûõÎíÖšý¢q±o‘/áÓ ÈåùЭ 8FÎêH@¹â›/®â×ê+8U›ÜG…5×’Sfg/ºAñŠtyj©­JÞ¡‰Ÿ>K|Ä’¤NÍúöv£¯x7,îBAƒ“!Ç+=£…s‘å1.!#¶ÿgŒúZŽ!‘‰Ÿ¡x‚ækQž3(Þä0(7V‹)𑪢”‹Ó1ˆnTêe¨X><$èþßý#ê Œ Qm•"`§LA`xûðŽ£ØìïG“D®D3R¶* Óý¨ˆ¬ RÜEÄ7rö¨ÔFQý9/…þùûß¿Ðû¿~ýþóOŸõÿzÿׯ÷ÿü)ð“þ9þBïÿú¥ÿ?~Öÿ_èý_¿â?ÿøYÿ¡øß_ñŸ ü¬ÿ¿Püï¯øÏ?~Öÿÿiü/7;/0 xÓÿ¯÷ÿþ)ð÷úÿùýN††Üÿ³¯Ÿà¿ˆÿø·ø¯?蟇›ýWüן|<æÆl`n^n3>>66c07˜‹‹Ÿ×”ƒÓÜüWü×ÿÇá_˜ÿÿ“¯Ÿà¿œÿ¼Ü?ÿy~Íÿ?þQü«ÿïï4Y:ƒÍLmÔ<~ ©á¿…#Ï}ü×ÿµð¿à ÿõüÿ…üüÿÕüçeãùóŸã×üÿSà¼ÿñðÇð#þÇF^ 8PüÿSXX˜™™ÙÑÑñÛk ûùÛ;Yô–h ~Žüy ~ùóôÕÞ´¸|7ÂIÛ e´Ò‹:y÷/Þú˜3“]‡ÍcGxãÎéu5K\ãø1!"tv ;«wÈ{+ŸO'¬ÞZÞÄâ:‹=b>Ò{j/}F'jÝo3ûRÂÌ̃v*ûÅL©ÍŒ7È¿Ú ¿ Óóæ’Ö¬‘é‡3YÆsýGCˆþ¡ri ¨ÑœÚ0e”ËJbê’¼îƒIÕl]e öR3œ³«ÚB <ñ‹lg’Y«Ý¯QÕR|Î>Føc4ïÖF`e4!i¾Nhݰ¢Ê V¤!~œÜv9?×ÚøáýÇ“=úG,ÊlÛ§Jn] ï…`]N ¼†uøJâð„'%þeÿ{Z )¹R‰O7Õ¬,&qÒ$=¦rä‡â®kˆöÂVYh ºR“<çpCíµVDÝÿÊß`”á]N~¼ãb‚µÒ:¹×Þÿþ롟çÿ_(ÿϯü/ ü¬ÿ¿PþŸ_þÿŸ¯ÿÿ5ýíÅφ†®`Oשþ´ñ_ìÿ<ÀÖÿ#þ—›“‹ðîó¿ðrýÚÿÿ ¢x¢, ÒQ‘" RT WÑP•$§dfeÕâ”de}zò[ ;9ÈÙØÞÅÊÕÊÁÞØ–•UJ‰RYè~LˆYN‚ˆØÕ˜ÜÒÕÕ‘ìäfå.Lyÿòp°½+3ÈËLInúÛ•0åýˆú1êM-]À®ÂV.Ì||ÜüÌì÷<]­\mÁ"J`ò¿½†\€ü~dÞÌ—÷LX€QI.me &WûáÂØ›‚…X£F²µ²·!ÜsaJVàcæàée¶g1uq¡|[aJW/[°‹%ìJIî Èø»h÷ÖßîÊÄÁÌ ¸¢`f&—Ûƒ]Áfä&^äO~cGÎÎÂÅÂEÎÌ à˜Y¹“ÿð›„)¬ìÍÀž”"BÆWò“HvÆVö?¦¥ˆ"pJcoââ(¨bl܆±¹/ù?§¶´¤q6µôú…ä=êo<žþ[Õ¿ÄÈØÞÞÁõþ¾þ##+׉Ç}– —ßéïUòß%w³7½Y.ÿQE° 0ùþ%6¶&ƶÿQŽÿG ÿÿƒØö¾_þ]1?X±š¾üì"ÿò°pA–`òûn"¿Ï¥àfv!ÿ]rsgò{JòßÙ[Û›ØB@ÈÄYùƒmö>¯‰1÷oÞ:0cþ6a$cºç·[ùOjïï‡å¾ß¸Rš³ØÊ˜ŠÎ`–{d!GàÏÔÁ ,Bõ»ðä4Nn®‚ÿD26V3v³°£ðY2»8¸9›‚ìïºÅò¾Åß¹³þhóG'üw›7>\ÿù†öÏ…øMÿ’„Ø]ÿ˜¦ÄÌá~Þÿ§"üVýŸ5þC²¿7mvØÞÔ‹ü‡Ãþc ýgCR 2V`°³ˆ•¹‹³é‡ï?Ýþÿ=%¹‰ƒ³ØY˜’’ØíŒóŸ5kTS’Û ?°²þ.²PLnol,ºÿ”À4vÿÜ£€±ÂÿŒ•ßÓQ’»Xß/ç÷O´î7@\@1\\LœœLܼ÷©ˆþ&Ò?âo Cÿ¤7þi+÷Mð1qòs2ñqÿÓV€qaÌ÷ÆÅ?eÏÅ}Ÿ‰‰“ý>)Òv“ûYêjl,1Ð)ØÖÖÑØÌ XNþvíâhlúûõ= 0 \­Žõ·÷ÚaýÁæ~s¾ßÃ~SÔ¿¯ ?VAK‘'? € ñ ØÅÔÙÊñ~ Ö:ä¿ðb÷Ûjff `ôƒ«ˆðg""îæj ˜B¬&÷+ü}±™ˆ` k]½Á¶ä4¶?¦ùoª²uu°ê=~T‹ý0Y~›ÒÀ=Z€YìÃBä¿Âø1Í-\É6ï»ßÌö § û³tl,ìÿÙ`ûú™†ƒí4 K+rGg`ý°#NÍ€ÛÙÊÄíÞʱ²'wÔhéàNŒ]É­\É=¬lmÉMÀ÷óÞÜÍ–‰À$×’=UÖ‘‹+ék‰«©‰+tL ;Z°;ø7>Vv޶V[cgÀ’tõ"w0'W”R“| à‹ÿÿØ»¸&®too]ÛÅZïú*`«S\©"Bf&™$¨PD(&VKiH&Í‹IP©­ÖZíµ¢øX½âcµÚk«n¹¥º>Kí¶_(µ¶ÕRk[­¸*êµ*^Á-{æ&“„ds~}„œ™sÎ÷ÿ¾óïûÎÉùFË’di/A@6diÉñ ”"‡b¡ÔXyš,nRR¬X§òÔE|D™. 9ƒ Òi~1ƒ>òZ$€ÈVŒ(3ÏV)pœNœÑT¤Ž#¥jjÔTu P­‰©2€>%»€lÓù:Ðfzs˜'Yû˜$0iô©ÕDêyTˆR§Í1DA„6'×2T›õJ.šµ&AÃÀ¿±&B0F¡â(X ‘œ¢zä˜ÂÀö¤Í‘€FY$mî¨ÈÈ™3gFØŒ\ ]‘”mÃLˆ'Ï’~¸·~§ÙBzºŒò¤:7!Q¤Z£t¯‡]Ä8ì«Éч3-é / bÎõ©¶ép2ÈÄx h¤…° Ô“#¡#Bn£»MSã¤F8H £€Éz9 !`öœ…B•zÓ32¢Ÿ ƒP­íÛ:4Wm­SUhê -aÉWê2m!V6Öv¨*d.Þ@2 .WiÈÁãÉ»¯)¤†z ‚VÒꩤR¢6‚åjjCÊD“Vn²Ä,DA-NÆÂ!ºVMØ*Ô„Gð3s|AB¤!dÜN™`$ôJF&Úgvh `…Åù"]©F1çNÛf†NÁ=ŸÍ4Ê%•‘¿v˜"@Y>£ íM2æÐR®µ-árç‘v,$šQ„B÷I»”¤›¼d?UiÉõ–À· ©p9,zxž%@)yú 9°Á¡Â¨ûJ5ÿâµu’ÁÌD-¸ ØPáP;Ì @(!,£9F¢ óLO¨Û¨ïT*ÂÊ% å Òy3?R´gÃ!Ñ´›ì×çiá‹[èÕ•5¼G:œªê(‡G4KišÉ9CnvC¹¹3‘ŽXÒ'(ÍÓígUC~¬ÙŒ죌ÓåôØ\É}°£àå¹e.¤@ã( 7Wz„ÌMÕ^fòó£å­f©Ë±øµôÃk,$$:‘<…ƒGœDÚ†ÂèÃaÞF†g8šõ‰€'S+,„mvT¨YB%Ž„¶À¦ëˆô'_fN ò;4W=цhH´Îo³><~@êü«ÉÃã'"ñ›‚FO1|¤à1kOŸEÛ´Yz`Ïr‡è]¼I·ˆ¤[?‚”Ã$å´·§î 47·ÔšPš`*}«‰ -{mÁm‹)ŠI_ŒJܸì ÙH#ÙæGJÀ)]¦Ug™ÍçŽ+ÞÍK-XZs–†¶;.¥žH4FKÞ8ôHÍc´‘js¾Éd$,ðf¦©V 5˜Ì[¶›%V@KŸp騴z"ѹfê†Å„HS 2yÈ´cs¸Ù`ŽÀåÀ8aK9#ëPz»#]œ4ê®ïîiþ¸0Ø6‚¤A´éÎTÐ;VZ2tÆ|CþŽut¾Fƒà{&„èû`z45µ›†´£lGy´ÐròíÏJj"Üe¤§‰ý*Ú_¢6¬š¬Uê]ï 2¾–]--§ŒÂýŽz–©é(üò|ûХвt­]¾w ½‹Kaö–Î)Ò>ÆGOÔðJ’óõíà¨}ödü¦à>@½÷Î^ C¢S&òkzûj¬‚ü] æ½Ý:oï6 ÉÿÞ‰LÝ¡÷%›%% eÏK¨G§ ÀÔUp½Ùm‚uê£oBSîxôÍýÊ‚FPöœÓhc},õsD¥ÊÒÔ©®ØN~XΣºämðæ\£N=×:ÏÚè ù`©Hc;ƒèf× ‘“‚Šb!è  H³T:ÇUP§ÃAéM¢íBüÀ¡ç«k ì¾D»£V–QgèSó1¼fyߘIkwGаqº²Þ‹3Å»KÖý½ ë“Ë{-þQT»¦d[ÐéÖ wŽî4×wsåý6žtâfðå…Ç6ŸwcO7aúáÚSqõUûpëþìK7× ˆžz.vhÍaá¤S ÷ïÜ(;s{ÖU˨ŒÛõç?WIEQeû߈.ÛÿÏÓG~›}é`Ln=4î“îÖÝÅ“áC ƒ„[ŸØ¿tÕÄÛªùå™UczŽX'}~guqàéÌ 1â±Ã7”ã3Ò¬D.í¼˜Ð=Sxô^_qB}©²rgÁAaÐâºÒ#7oñjøü®ƒòTgNö¸r:²[LF‚5qüúa/½Cü1&cJqÿãÖŒ97W|òÛª Õ÷÷Ç ªO™5FÙ_ -ª¢ û½2`iEéá‡6”½òÁ¨¢OJ2žùÓ¥ ½^]pyèKdhèÅóyCWVÎþm¥j|}ý‰±/¯,®êR]PùꙜìpÓîE¦5L…„½Ç×Ü™ýû(t÷ÿÉ%«wÔÞØVZ¾xMÚìS£„«¿8µ'€br¬*5=ÍXô_ék5áãêÅ«”?}Zqv¼ê›ìm囋cË×Üí=5¦2èÚâ 1.šº·¾¼¥ßñågïDèÎõP-¼\X¾îŒÈºêK] ¼[ñuÀü§ ‹Åƒ>f¬Y~ûÐ…þñªÊº}çÕ§Ê¿úxG\°xxCÍ•íqa£O.˜;=êÛk¥ÚûwûÔ¾;áDÿÝZ|¼µ°ýRxÚw† á×W'WØxöjÅç©:±ðÖñ]‹y핢ÕeŸï[¦,œÒ°7óÊ€=‘c…Á?¼ò¯Ëõâs“®î0|½Jµ²:0“lôâñ7¿¦J+t¸eëõë=&dL >ï'4?Où+ü¥ÈzR»åç(öÂUê'Òº¢šo¯¯ž~'zg®nç…¡bš´ÇÊ’_­OíþyÝÚ×OŸ^Tºo]^^E/ëϪov•ë³TZ~Z´wuNEÞÍ+÷Ò?JŸ^º·ö½hQu°îñÙª›®_è#ûaÂÊÏLª¹eëÖu 7T ߸"T¼j/üÿ"ãaÝKþUwrmÐÂUÚŠ'Ÿ=°£vG·Å×j>,¼4yå¥É¹ºµª»“—Ž’*—Š.›uK‹Ÿ_4qg-øfÙSKNÍÑý|÷õß߉î‘mÝ<'ÁÎå¯ë·¥<óQ~}釗Ÿ(š¸R3ãDáýžƒ¦‚·—>-ÍK¸3(),”NÊ+QçÝ7õ«\•¼¯dÎÈìmé™—_>Ú¯·êcxšõ×—eW/UïÙY<ïÚLÝ”sÖ|óE}òºÏÏ<˜~áÊœ =&?]xj‹ü± îß8*¬¿ìúKª¸/Ï¯È ¨Ï_°m{NEÉÕTUßKïZ?\e:sgÙõ+2ãºùÏΞòÆŒyÖ^/ªR¿ ìC‰árxñ¦]êòêA%Gu÷*—ÊÁ_¤N}ñ¤îÊê*ýc²Û‡k‹ÿ4³~KRÕßN–M Í “U•ì~÷оïfoNºZcYT_5@> BÖǬ@ìГßÛýܯÁ?¼S’D >3`ÈÊÌákÎg½ö.«}útÂþÒs/?Ø~ùÓ¬lõÄ"æþ·vEùÎ'û(|Ýbuéé]Gªÿø|Aúê[è$bVuE;Qƒ?;rõJ×þ˾ßùÞÛ;’Ž>XôÔÆ˜~ÉC"þG>,l{<¾ìJï6íú>òn擪Sè¯ÎVÜZ[³ts`÷ñÏÏI¼X€‡¯_˜Øý[zCTèí»—CoNG»¿eí:­¦^ªR¾<5™˜—¸|É­sßý,ûö›MIß;u+óúûs^[•p¸ï·Ÿ^^%üìOú\ÿ¤×«±-¹;êÚýê«ãã´CŸÞ Ú¶çÝä-Ç·¨2Òn?=rXjß }ë¦|³fò„mEHú¦Ùú{ç^«¼°i\Ï1éA‡Éeï̺±ëë¹ßF>4Mž¨J[X-1H¯_R~þ¥ášŠ u_L;ÿËÍá™éó[vÜ­Ðra¿ÿÜ<7¯á×+L̶VÝz¶û±Ç‚{[scfLÕ ]<Ÿ¬ ¿zx/üѹ>Ö… Ä • _ÛÔí’´~Ø Õ©}+ú÷ÿþæCáÖ)ó–èÁ²#שNGýXžTŽÕŽr\–Æ•þþÖÝ(e“û%\úê°s¿ë¸,>yLÉèWßjéúϵÿ|áü—ÐþË…ÃÒøOíÿ`ˆŸÿ^)Üùï çÿ„þó?^,ŽügýÛeuY’Üáô'*ó}¸÷ÿE Eó?£BPÀ°óûÿÞ('ÿ3)™¤`Úä2"Rз‘€GúSBûSB{1%´³4R  ˈ©©]+U¦§±FÈb¤FUœ¯óCIâA&Œ¶Ù¤I|#¨Îí¤LC(sÈGœ™ÜÅ·JÈ Ô¹ÖQº–þÝ,õ àÔ!¢Æ:D4›”[k aaTáf³‘‰¤ÕÄ4PVVr|F–B6!K¯H™$‹ÏJÌÊI¾íÐ6ƶ¹k›yÛ]ï k­oQïb¶w±½;¼-aß–´ —¸”ä4yJRÓ“²MK[ ã‡BXÉ&îð›ôfösB…™©ˆ nŒq9zTÐ8zTàÜ Öj\·Á $ ·˜5(¾´Œ5‰)iŠŒØÔ&Yƒ¢lÓ¨WX#ÜɶcM®Ñbž©49³†©pË!;záò†Õ¨[}àúmvÆ£ng<ËšX¹<ö¥¦ÂNbÔ“IÜz† ‘j5©$eËêO·Ð³êu¯.Ü@ÏêÔ½À}[ÈÎK¡ÀAÉ ÝN^]¢rqu ngû‡PÍ‹©Õ”3ÀéxÁL#¡‰¦þ†lÜh}®ª¨î£ ·­+ʓЭ«biîQíÑ-„ê,#nc ͱŒ€f;`ÇrV(qÄ•å˜PÚ ¦ülVÅÅ}_ÄòL$€@á4¡2êéÅ<25¤„Ì&\¥ÕhU佘.¥@ÄjVLµØ Zz[ Öj®RW¦&ŠlW븼ÙœdMHt>ðAr dª 7Oj ÛC†|=4t„ZìJ"Bœðç´”m4êûk=€M±j–þ6àgzÙåM„z•^„´¨õ^§—]EB‡¹+ÂxÒ‰ÔÝŠTƒÔ@Ü¢j'm0‹Ú Uh¶K’4:ãÌh·ä¨r­“é«VIBh*hFBo8°K»„4»$Þf—ºN·ñ:±6GU`w}¯ž˜€7i™#Õ¬®#ΪL̪+1êXÇŸ¢ ±¨yÀÊãàP* œ‘¾ÞM6ê"ÆáâÍn2Ñ뼸evS[É—È.¿”¶r¦"",ÓÖCK ‘ð7õ0 IãÔ£ýY“h¢ _Êé y&2ûhÜ…8HPÞèÓt¡éD ü;7Éf+r¡vÙJ¦ ~ÍnËdY”9®0âO‹HhŒÚ^‹ð3V}–*Ÿ Èì%¶]:õž#@üÙ5R 1gr¤gâsu:JIMdÛtW”ñg•À´%+‘rHK4Ë j­ŠºÖ×F O5Z[YZ[.(”ò§Ø`Ú(•:h6ÜŒ[lWçóÇ<˜I o’{RÖr"L×O°Æƒ´I_ÇMPVʤÂÖ¬s<8­@×Ç8@‚¾ÚæÎÛ§2ߥ¹ nJù pÑË€ÔƒWëT?Cn~­ÚØìEžûðÆµ±žutë¥ì—TìBœÙý©äaÄ™µ€¤R§æaAãøØ,ZåŒóâŽ+l«€³MlC‘é@F8PŒð6/¨• 4ØÆó‚J-ÂÏpÙŒVá帋òoö®Êíý«H)-Ò¢ÍdËX2ë;C–ÛÍ2ÖjL’Ê4cfPÃ0â¦Deß“hRÔ­kk•©$‘VTRѪBÝÈög†Æ Ý[}jò»ÿy>æ3¯÷óžsžïóœ÷=ÏyÎóÀù›ÀÃ/™©” ûÒsþHi”pZôíÂÍDò›‰Å¿†úÑüòè¯gÈ\ËÁæS½¼™ ÿ¡Yð›ü³¡qÕò3¥8c7¯aø§;ø†V ç!ä<Ë7±QÀ ß±Âßb ‹Î[+'!x“䀵r&“Á$üc¸ißùx3Lü¼™$'o‚«•áã=`¹´ï âÍ;y%ØYþ*ðp°¡y(ú_·Žql_ ߆âÙg. z  øƒ> .ÌÃæ{DBð&n(äO,×.øuÃU¯/J tE¡ÄRóe©á?EPhaþ0g#‚7ßDa~ŠÔèr^=}À§ ŽÇQž)l€Ðà¼ú­c$î7*ÔU,Ÿ Øÿ'âj)}¼ã±«Ÿ?ƒ%…ÿŠ~aEÿ0×&’79FƤpnŽ/}RÂ7i -àpG®­QXNø[áhÄ¿IÈCN„—j }Œ$ ümŒà¡°€ü0ÇN’7¯G£Š€À¹c(··åØð_YpÓ彉 èÒ`üøoäh@¿g @ò hìOÁÁÇÏÜô_B³àvM°WƒAäÒháQø£4oø9£4o͛û¥ pþ뿘äîD¥ÿGp5‰×^ß¾€#Û x8ÔcEèçü±ø—-ägÓ?,W,?ÛtÝiŒÔ§ &ÕË<dÍø/ëJ¸güTý%3 Óu÷ñ4”àO¤Ì?³f  „³~îÁé1U¸±üWE+ÜX¾ößyŽáÏu1ÿy‰ë !¹S ý털x¸B˜ŸÍQƒÃPÀ1ü)"þ%Vü:“Ç¢Åó«(AŸ·ëpßʸöÕAÄ߸Ç|ƒ9Pd8!<”†4†ñwÖ‡á«|õÀ«†¯áùxø ÑotÀ«}1Õô]˜/×à 9¢C¢P@ùò‚pãô(‘è®Îîz¦«³‹÷Bð²—‰N7äå§Öàg‘‚ p”ÐgW¡1˜›!d^T7Nx<æD,ÔÓÑñõõ]Ð+ÁtÖᆈë3»É軺9C¼˜NŸéû¡‡»³„D÷6Pê;Ãùl®’›+…Bq$ƒhS™J}*×7d·à)^g9üè 9È h(š$'‚ñÉà þk_ü_qüW‘`ü×áÿ%Îÿ,BÔ§a€Ÿþ‹ñ ê?fàçÿ! ê?eàß§ÿbüEB‚úø÷é¿8ÿ·HHÝ_ÿª>/ÿ»XÿEBÂø»º»p\÷ˆDg&ÉÃ…H„£¾1ÙóÄø+ó?÷á 1âü¯"! H4 …D&Q1H2 À8ÑHX*€uÂÀ`Hò¯nŸ˜~.}þS²ç!èßô‡ ë? Åú/ *ÿ3L‡ÂÖÜ}Õüö_Ĥ’¸vQˆ®×Ek!Qâ”Ìÿ›ôúÿmÉž‡ Ñ86Xÿ1bý Îÿ,Q ~4$9ùŸe'g;‚_óúò?›™™¥§§³ÙlEEE###"‘X__$ÁMþÜt&ó¥„`òç‘8ÉŸíC›n_e¤Âä%ÞõÀ³³žŸ&Ì)Ö¦¯tÒ}åELj7my…† *£GoïŽÈBQ§¨o×¾I AcºélÅHùäÙ¬Ù>VeEz¦ó7i¯¢Ó¼9§ Ά÷ÜýûÞôßNh«¾n“,HTzXªr$a­üÞÑ¥ŠV—R’Û :OF¬ô× c¼*Þ¹™ì=ΖaÑ´vë®)]5Ûl–ÿ‘œ9wÏÂí¶72V?QÓ;ÞºB#OêRÇT—˜ù#šJkC?”žt^ÿ vdÕoŒó©ÉsÃ6oD¶i]yØ*‹ðø‹ýÿDBøÃIñÿ§(IPÿÑñÿ§(Iÿaäÿ+öÿ ŽÿÃÈÿ_¬ÿ"!Aü‡‘ÿ·XÿEB‚ãÿ0òÿÛÿEB‚ú?Œü¿Åø‹„õøøbû¿HHÿ_êÿ-ˆ¿Øþ/ÿéú?€BH²oüÛÿEBÂø»S}‰D/W7"‘Ë ~¹0©$ ëB$R¨D¢«»ý·pþ:ÿþ Ààbÿ?Q܉„FbÉ,h],…±Ð…‘Pp2ŒLýÕíÓÏ¥ïÔÿoÚð/ú‡!…ÆPÿ1±þ‹‚†òÿGƒÂ@ ýÉg°¼Œx«‡éB€®[1*wqˆbN¼˜TÓBc!XZ ‹î/èPtiŠù’¼\( çÕ¡´H‚Ä µÀƒþrd €²¿>ÐB°B]-$V·¿$'|e@ÉÏ)½úkD¡àÜ¢±èÔÕ¡ ‘ÊÑ\éÔ¡ëEƒ-†Ã Xð>$¦¿ V°6Ö ÖŽý\+¨—TÊ?ÔÚ_öŽ€0˜‰í/âFuø¢Vn2 ™ ‹ƒMÇbÅÛ9þŸÐ÷ÿß¶%äŸÇ8†Àÿ¸xÿ§HhðþQàg›»ÿcŸuç"ðK¥oÿG¯„„‚‚›ÍNOO722 ª¯¯'‰ŠŠŠÜ- Ñû-‚[@28[@üö4¥YûÖ·Ë5+é…my†±/s öš<>pÐ|¦N#6ÍáŠ+}ûê͹‰6U¶þ˜ÝÚ–ñL•Ô.æDGu9Ió³Qç¤t|zusÛG *’ãèØ¥ªôèqu¯Ä­mJx{cÖ_a8Òäè JJ¡&Æ2aòÓ&Cµ†ëž“ƒŒF~ùIeª—2žfÂÿ%ÕlÓœåèœýú9r*øU—“åE;ãµ´o©µÁËÂ^€k–À–$$°övH>QÝjì3«eñíÞpÕìÄtª%Nžá#×x{“¿¢õQGæý«Š{˜›´‹Ç×O”¦‡jÏl+¯y÷ɳýåës³¶)ÒfKz$«Ó²ÚœC˜2¹4†5Ú ÷Nþ‰²ü3Éö½ˆÔµ%ô‹vÓºž4æßÉPœûþ¹ÙÙýŽØiÒvg>É?1îø_“4ÍÝs£¢×Á”¡æ»—Ô§¦ï™ÛòA‡>åð{ÓhZn\ç*µXqŽŽÒÛna™¯_Ì?î4Ï.æ>9c^Ÿ)>† ¿×Z-¶qºŽãìw¦³?LÅÓƒ»?þôw7É;À¯ýzÙÛ׳Š|±r›üñKʵ§Æ1Å[â{Púi•:Å Ó-,îUk½2a[õÈt>º•e3¹Ž0e£O*´©Ó$mcQê®Ò½ufiqôƒŸŽe®0;;ëXÒ½ìQEM„›WÝz<%U/}µñÇ7Љ/:©¸Üâú;«nŒ¸°›ÔøàìÍ*I§z—xüCÚŠÙÖ£´ÿ®~s3^6KþÈéó²9=ô8VÊÊgª¦2RuÙuÕ;?Œxkq[^ûh\(å@9+$K¡ pZÞ5².:÷}Eüö©n›¼ ·š%³Õ’mC{¬ =ÍÙ—P6S¥Ÿêˆ?+“rz½vj¾úñªm·ôjËsnjÏNú#‡fhM¿÷ºéMÁ=äÇC3È^–sæç?i;ÿI¥ðY ¡!,ÖóX„DfÏœ kóé#ú¯FBÃâæŒ]?QeÞ+C_Ö–õ†‡Ýi°Ä=Êø(tz“s'LíY˜¼ýUéGÁ#Ó¦³ö­3L’^ó›Ú³yÜUéúr9·Ì—ZÚlI׆¾^¡÷ÎÉéPÅÄ=qnKžœ]»}”UA¾ «”d>"6o“ÒšÊVÂÔ¡‡§ïKmŒÖV¥fØ{&-ºÞ a´?Mã`Rd~Ù¥&j¡õïÛ¼œÎiJFÅuàw,38xýã*óŠ"s©kD[É#]æ ì®û¬›}*3sÒ¶‘­ p ­¡u ª;z×áÒbFÄÔ»gU}ì JÑÅËû„cÛ®eÅýž¬\hcœg™Ž[.7 ZhÕ4Oê^ê<|ê!Û¢S»XÕˆÉÙ!óâ³o\±i1%©V£qn3Ž# ìz¹ ¥Œ5¼ZâÓ²v]°xŲÓÓ‹¿W½¶41|w ô>;Ÿ…ÿsŒfvtÞF£Â?Xy&1¡ÛâŸÖ[æÕ¾¸¶‚²¡’÷2ß'á¹"¯cåiÓÇÚë “wÞmñ+Rfô*–Œë©ªvòÔÜt•—ð|kÚk%כŶ+&¼~ñòq‰Žþ¬âkyP“£}g䦟?Þòd,~{™3£ø`Ÿvá iûìE8j„ŠùòñšåìéÎùçOå§}Ê_¿W–è¼ß¹ãòå¶Òà ~3.,ª`ï /Xc"ÊqÓ,õpd›Z,ôú¶cùZËñ7CºÇçj·JB'ŸŠq³¬©Ýg\j‘Åáë‰,Ðx«ë/¥ˆqû/7Ö¾óI n“ï48ƒd;WÙgNZ«Ûœ…æ²ßs,ìÍC«?}¼#jÜéÇÜ_&È3Þ%ù-¬aSX7¼òœ½;!Ô¿ü‚ ÷§×\KœöÅÍ`«ŒBå;<놥8ƒÜôÒã-áe¸—ª9ØÖD­êSmìÒ2w[’:<‰°Xw ¬Ú®b¹Ü'èCàŪˆ~•[iqÛ.öêMstŽ:.õӪКÌBó­Å¸ÛIó“pnw7¬“Æ=·5†w¸{ßÙ?c+¦™u쥺½gªÁÀg9flz©?òpk]†¦ÑkÓþïÓX7 G²k÷ªõ/™‹Q'ÚÔX•úÖ´ìŠsÇÛ?%0'$Tϰ޻î?©ñžÅ‚„è[áU[ö½(œJ1” ÆÇÙí¶88ü©V3a©g·4q×*Õx¨åo¥wˆgpT«ô¾‚‡zIZ1ï/Ï‘¿šr<ºbËïõ+j|–v¬T‰?õÆA*|êŸÖ,„]u¦i¸¦Ç²Ä:¥Â;·M-.›L%í $XŸyUlWK¸qmaö‡jjNñí`riI½åtÕ¥]²§µ_§+|hq7’¼x“M³>ýð¬GŠÖwÛÉZË8æó xÃÎNÏÄ“Zê]‘¼bjt›ÎýÄr½6JÕaÙ¸½K^µl/(ÈPUª\Òˆžß9rEó´C²ò㯨I*î›Ö®&53[6$räå°2âüòMÉ 3™ ©5Qd…–̦0ö½5òÑM/V^ñµèý˜1aÕ>™íÝÁ•vJTBn‡/3oÕŽ¸eÉJËoè2[m”¢²3}Íf™¾2]9·qʃ§wª¬Ï=S¿iÚb]ˆ›îø\Y#Pñ ‰Õ\U;Å­Ñ%,‰ Vœmª±;/%F#ÜsÒ©f¹‹š>î©C˜X[,÷”xG ÝŸ´å¾ày¬ÎÍÃA;cmî&{ú#[ë;ï'™F¼]œÐ Méú0ªîiPCýIÿ¶æÏÖ†t›@ûÕåV3ÍÖùl®êxWåíÙY|Øp‚‘Ù^8ž;fELuùÍwA½íìfš/¹ûå‚"…ëoç¾Ýªk Þ3‡Ø{6(µc8nö÷ï^·‘ù¾£„axe«Ûº¹Ùñ-ÖA]‚>½^2Q©`öE‡~Å+—ºívÖ¶ªGmO¯ÞìnðZENµÇ<ö‰"{Ç´x­î”}Ö»¡ª£›ÉTAºrocd’­ë<3f剆Ü&5…¹ÖsbR¬z×^Ù_RRbYØžî+Åò“«•}Ú$ßTRÜûÎH³¸Ö]]Ñž¥ì—cÍeŸyOÝs¾p22íbåꘙÛb[Ïwckßú5%ž€&¨X®ÓKðm›=¨!àŸµX[ž*ÓIÚK¨m[šÈ²W~;³*̶ûCF¨ù–ßBŸ6÷suÙÛŸÇhD2NÓJBÿ½+‡z}ûÉAtœ’J2Æ’Y²fiÁŒ%3Ò&Û`Ĉ²FJal3f”½˜0£ˆB–H%5‘a$‘-k²„wF÷w9缿ëüÞ?z»®·ûŸ™yž{{¾÷ýý>Ï\ßç¹?ì‰N+¶\µf1eiV¯ž? VygO^I “Lr‚ËкŠH­óï}jç¯4,žûÝ^NiÐ:9·ü ma~Þ$‘ñXSqâFU”§U\A4ÁZ”¦Úçc£7Ѿ ¡W9|ÓÅrXžTl˜f“AœÏÍ ‚v0.˜[ËøxXB²]{ܯd—Rû5æ¯\`œ—Bðn¯Ë›á)º%LcšUßo ªÜB¤°ú´LéÂBó !–‰N¢ Z‚R7X-¿..ù`f%kR®ôÒºïë^ËÔ¹«#þt¤9¶ÇE{@ɹÓÝŽªRx3ÆH<$2=ôÑ_hD)äMkÓ4·s¼}VI(ÌmFø*°ÞR~ `6%hò¦ùäáJ§£r=ŒhÕîÂRܽcÄYn‚•Æûå&5)soy@Ä'’ ;(Ï>‡ ôô7ð}¢HB½úé‹j’q{ ·>•g¤FÞƒóƒÏ T†š¬£àâ"…Éù—Tº6êxa5K~'ì5©_ÚžxR Ÿ./´L¡`j9üêÂIÑC±Œ F‹ý9Uòé,ÐÍúë'•îÉIÈÒŽðSÝo¸Ì6…ȳ¨Ç_×l€W Ût<…$X\7¹sJôù¸Zwü"á„™w{QC‰ NÀQ☠äù£µ)Ä.Ù¡Ò[À5˜¡}ùAó‘÷’Ë?òúü~ýCÀƒàƒÆ¤M+­›¾ÏJ>Þ[,ì&²Ø[b›û>Í) eÔwÝÒÀÕžw\¡„æØnÉXrhN„Щwª‡6Éj¡|Û܇/ÍŸüb @_”F”¶¡V˜I„@ûôC+ðá&Dà&Î(³®@Iû½ßÃXÖNé÷PC`ô†û»hG®š˜DìçKÄfl…ιê”4¶ñOúØç¥þ”4—ó$‘ÄS¬Ô]mS.2Ή„G¿´ˆ¢g]tR{•­bø ¡©'îÛ¿Uãv Ò†|riE–Më –Jv5}Ž’Qn¸Ð;P—C{âS–ýÜJz7žà]5m‘¯èÚƒ®]ıR=¸h†Í«³cãScX¹7µ¹zÈ‘GEwMmp÷Ô:µ >á–óR\åÀß×á7Ùâ€Y(«ºÓü.-á‚úYy„¦U^XL›èŸVàI±& í¿€ÊÒ” 2+ÄÊøs}¯¶„±:ÍdÊǃWÆäšº! Qi³Â\-E€h¤[Ò³þ…z‚_Èr½wh\+0~@úÒÓ%²G¡OèÉ>Û=+…ò@ûÿó¤üÀÙî&S0F– !/iáFsûRõÜsæÖ®¦+Ƥ.XG+ÈÊ7£”f³G38ÐsEÈRíŒXZℸòm„n}Ò^ìûƒ$3Þº0ü ¥‹ö+{‘½Éñ0XÎR5!½cë)Ör u«”Ùß?óù”w–œ˜^tËçÍ¡5M†=ÍôYÏÝg¨#§,·¬Â&kÂaGY¹‚é‡R@B^øÁ i3ÒÅï“ɵ¦8]å¡£( vX³þQÝ;ÑBôçáÊê™ú¡ˆn@Öžã×á;ŠVcœã™FÞ5­®ˆbÖÓ¾ÓÞj¼W,Ý®×Qýª™“åÈ6K0±ê±Õ£ù_ÈÛÜCûl“TwÎ=É+Ù‰8KHND\^t²jgµoõj*n Ó銲› ®ØíÕœOW&™#L>É#bxά 4SÜ´d³|äðm«a8ÿe| NùĹDömÚ!G’òJ³¢S‘ç„§pÚý2ÒBõ¿¦Î†_Aô®‘ûrÒ (’ŠÅÁn¦ÄMyJŸw Æ¥V½ZZ‡×>Yʯò÷üë$¶!xÀþÇ-`¨¶*à{ZJá°íÝAb&ÚúÕe –ð,ä“T«]PŠÃ;ç£ J)·Ó;?Ó9Zqæ¸Åà…öà­ïI‘:aÚ]½Ñ“ÛÝœÎt{eö)Ù²¥§Ï14@,âv? Õ¶R%f¡W£¼þ•úôA}µçm>úÎàT½ÆÌtâ±Þ‡òƒ—Û»·Ù¤yl‰\˜13»{~³t–$d¨LžIÃùA€hã@Ä€Rìš}K ™:­ˆ­'øÁ DÜ+êc/k:?õLó6ë½ÜÔßËAì¿ÒÏU½&^moYëÚà-’žD/$åí>㢡¯[|Õ¼Ndo >NGr›¸wÁÁJÃ4_–Ø:Ü7¹CP†€®žã>÷² FŸ6t$šLït~=shY›k˜PNu© gf¯š}X0éliªI~!éùjf?Îíå1„ÆhLÈêyÜ+öÊ‘Ÿ=o¤–qž€'O»½^R2¸«Æ §OÈæ'«26ÞQs¡¼r6]VËuXÝÜ~)xÛD+o Úì¹Î0”^æQþ€Ôb_Y) j[¸HÍœ?Ö¯*ÅÜ,hF?×)3zñ…ÿ8¹ïËB°úKÈÔŒHÃŽÿŽØ]/_.+ƒØ‘Bg~HzL¯Ý8?š¡oü…qå³~Œ ¡ët& ©¶wü³²dvCïÐpÃTAÄ{ ÔQ(©²iïÞ»/ üqéVÂ)íá“Ñ2„ªs2ž1·‚.[‰I>4œd-ê?bóëBÈe±,9pÖ‡ !«b{Éðm-MO†zÞ¯ºiž.±ŸáG&„AÎ”à‘­™Ï}¸‡šeA™Pēž±¦ªÌ›‡Æ‘JJDUMÛäšÞÜÉÎ jÅœFLñ§Gçæ‹•½Fî¾Í­T܃~‘OŠeíÒ:³b[‡èçÙ+‹ê~ï<Ž•­ gÔbê8ɚ8xÆæ«Ü¢rRkßt]VB‚·]O `àQõ¬8I/¥¥L\Â’q Š„ÕA¦ü2ìÌO¸"¡ rìYð›Æ¢²7 w4%(»¤Å«Rm<¿Ç#Ƚ™AJFW‹YôÛü(²bŠ&øöBq›BT@øÇÅÀv19@D™ 3ß³‘ï0•Œ|õò6Jˆf²Ù5vT-»B.Ž,¨ÙN/ö˜öû3ì´7à 7Í)j)¹Qc,7…„ÓªŒ¨;E‰%òwLx‚ß9YoÒ–‰ìÌ÷'iÙ•Ã6øëBÃÉd)µ3ÖËãÛAFçR »=ÕGM'©"íæG¼?ÃRŠ/dëW€/G’Ž#\Í6Û/×ñ^‹¸J&ÞÙ,îÑ~‰%ª¶ÐÂ3Jë^Ý/Ã!LÇÇ9švgÈ¢ 3N¨+FÕÖŽ¸Î¿ÓmááM·—ïÐ" &à;T.Ê,Kt]S†AÇåÀ§ðé’• ¢êá~lI”G׈wä&‹z´pµÕNVF?—BùuìM˜Ç—¬“2(ý9B‰çÌ/®Nã@óÒ5RÉBö]¦Å¸­òÆ‹í²F³GÌ1LKö T;Ö~›gï^TÛ²ä¦oSôŸ-?ð¬©ê3* ¹k¨gUP>672ãIôNNG9‹€ ÚÀ÷æeT3Œ©Ô‘ím—¨ä÷1{ôæDÆž9D±EPaC2‹öô¥¾±À™çŸJ¡é¯i±älkÃù-Ý[hP{Лš´I8+zBìŠú ¶Ž[T^jûmõ¤óØM„f ¯|lºü¹3z"I™=%B›²ìÄÖì% oé¾¼2–0Æ–3³x(F<&Þƒ©uR$¹oéV‹'Àý³ƒ7ò£N$VÜ.Ìç®Íñlk6i`iž.Kïí´‘Êr¥r5˜·‡¦d*¢'Œu))Ù04²”ÆH/c»¡SCÔŸÅMÉ,B?ûôX­u¢DP™ÈP { KÑ4ðìi‰-µÒZ¯[ÅGŠc!¯½ä*Ûáuþ+;aô¾Rú¹çþ³ýP*åAß•è1þ6'­ ¥žBs>ëDh³›ßÃÏÛ†5É >z j^ï›Õ-"xè/‘Úž£Ë¤(ò£(öùe[} ±Yãz>~JŒÃ/‹º~„K¢ ƒ{y?™ð<æMbK%’˜;E«­ëNŠÇÉ•.nÐeKýŠ6 Ú°š4ü›_båvõRËLÑü£äT¤±:´qk®ö0“¶Äñœ,ýÚoí!KS4rLc—(Ñê‰4à324ƒÒï¦Ô$‡Ç ðÑÆu{ób6ÓܽŸÏpE <əȬœêÜæ%x~¿WË`…ŒÜ)̸ ˆ¿Ó:×í°…‚ónV¿ Î^42¡Œãu²ÝÐ``J9Êea Ðol~–Qƒ¹œ€äQàŸ»ùˆ´`ÕNeÚ߃£0!ª“ÕÁ@Ѝxçó~Kê4ýM^×;ÁéØh$œ9ó`›¢ýªí ªUbT`N5CåõòÏY”cH!nÐ1;ƒ]ã Ô‹úöÓy¬%q‚ îc¹¸‚1róLZŒ4­ð©ˆ.-u-2ÊÌžSˆ§VM¿PãÆøGé<éíkTíoÕ†íÒ´L«BTÅ8#xáÚ |+/â_£³ l ÷@!Û¬'óÅ>‘aàbDä‹InYÓ붉ªHžmèûÅpDA6ýEî¤iq7œÂžâ­%ÊB›³ºåµJ/’5lé¥oehl«EBB«;0D¤éë§›Ùf›fHe‘T;Ã×føV<}ñ9«'–@¥w´bF½b6_EÙ›§AͶYOʉÁQwmôHK]´»î˜Á(¦(A¾^€\cb)Òóf°& œwÓ#VN–íª©Nî+'Ä¡£m Ñ-…H ¹+&• D¶U'‘bG¬ñö‰Î ðÎ°í§€;Í‹€b—Œ©tþw·£èÎYßgѰ6™½@”»%”ëSSŸVÿ¸çÁ''O x.I¨ÆÜ5¢Þûõ5óË3T(ûI[¸˜§øÞqXÌ‹*!Sš=Áç G~O2# Û¥‚¹FÝõˆ§Ûáhä§­íÚ× ?Ê+‡ÿ¡c1,<~Þዤ‰ çuÐϪLÿÏhýûߨþÏÏý¿ß…ÖÅ_óªÿó3þß…ÖÇÿªÿósÿ÷w¡õñÿêÿü¬ÿò]h}ü ú??ë|Zÿ¨þÏÏóÿß…ÖÅ_õªÿó3þß…Ößÿÿ§õÖê¿«h¨}Åÿù9ÿúsüÿ‚ú`‚ñDC1^˜µcÿ;ÿ~ÿ·šš†šúZü5ÔTÔ5´8û¿ÙY òsÿ÷÷ =)¨•òèac ii8Œ:h7••¨)+C‘ЯêJ*ûH_G,ƒÇxc=••qp‘×°ŠõÜÑŽ.=/4ÞÀASVDûøaü¼±x4¯ˆä ]œ¿þ:Ä£ðkY§ëìîè‹Cã`pÞŠû÷kh+îãèÄcðžhÈ:ØfÀß%%Àˆ“®ÄÚù%,ü«¨€ž'{z=„ö7ÀfgðE{®¡KãÜÑh<Àãþæ‡a „ymHß ™¥ÿœv @¿ªû†æ¬¨ÈæqÁøÿ{í³†ÍA²þSË:—8§¾áK[²¿~…¥>ìè¶†Ý ü{iw Û_g÷Ào*Ö.ÅW°?ºþ‘"G,ÖÏ×_Y`pø¤ƒs( ÷MžœÿTÜëÌI+Ü_]°D{9±ï¼¤ÆÍÓÛÉÑó¯~ü':ΰ¯ÿh’ºË¿³¦â+b9;ó÷AþYN²×ˆ“‚xG7?Ìÿ4“K빿A²üÂÅwÿ°¯·?Æ༽Ѐÿ¾˜kàçÿÅÞ³€7U¥‰]ǎΰ>||˵ø!`hrïÍ}¤Ô`m íg¡6ÈTdâmrÓÒ$$·-õ…ƒƒâê¸ßŒÊ ‡ÑÝõ5¨uÜÜQwðIëê8‚udñ3î‚Î'Ÿà¬À²ÿ9÷ÞÜGnnúHC`r>IÎ=çÿÏÿ>çžóŸ(X$ÖAHa‘"ôR"®%â!ü[Jîý‚˜XAÚÅèSýAÐèHb~<)VTT ñ—U%à/º¤Þ;ê ŠÄ´¨4[£«5]_ï1ñ“ϰ!tü|x–îûr/z=ƒ bǃ€NëN Ão‰"aXBGRèTïzÏ i%4¨ €å“ÞŒ{ÜÝ€ŸÝí¡Oúqä ßµ;Ý ð Bh…ŽMÜÎÀ³Ê}ñúà®Ñýð –eUð:Á( ¿_h&$EÁHú ¸uÁz| >2щTX@öDfF\¤xESÊåvЫ`m $„sG[Y(E¢¶P<€ã¢$ïÖÁ㈥LáZ\ˆê М*÷.Q¯Ý!"_O˜Œ¾¸(*‚uV-šü‰Ñ’*'êJ£tM<€²ŒU’X‹k³4fVn1‚n8> »å42bo+EÃë¶$B#¡*ÓHXgg³ËÁ¬NÙ)#‰l±j ö2’Ðõ"£Ñ„ ‚5OO%„€òÅM€ŒA‹Sþ'™þ H…á¡WµÃoaÊÛÜÕÙ9sU¯þвìB¶í€cƒ$v6Š!à@,Þ¤Ü#Ðw2Ò†»•¯ˆ¬º ]8þJ–GÁ…U0¹:™Öž±²ÒÚ_bÒCwpÀLŸ×€ˆF43%˜}d™ìÅåe §Åˆz{\’âzì3\Úp¦KSÑ(­jq$b©ŽìtÿÀT÷f z@XµXJJvdù=îü$GÎÏ[ìJ¦ªð¯;’”º„èqa# ÎY™yc[­8N\ShGØ"à ÒV+mས_ñÐgn€ K$ã1•òKñebLæBޱ,Æ&"O«*y”I1•77£ /Äô)Øq.GÒµ óü¾¦«ëøë«Ô6Öµ(ѮÚm¯º¡ÑòIݵÈ ëc>Ũ=?>úGkÇ“IT&–v\çAÊ"¢@Ýú ½×Õ*™ëA)ÏL‡ˆ:'BJ4òŠ>™xå¶àUP„_in#ËÜ'ËË ®Hyµƒ˜Þ*Ô'"*©«C!ˆ½Å`z¤×GL:³%AUB 8£ÔKÈþ±+iR ædâk¡@ ¦¥¢¤.byÒŒ*Sµb(˳*Wãà "˜†iäkÍ'žÓ ¥3LËn^žq÷×VûªKÖ}¼­{¼})Jû¬7òDOD Ë\ƒx¿+*¥ŠÒì³y0ûÚ”jüYë•”ì fÝ®@·²Wh‡0þäcI%Q²ì9bö,Ë»¥ÅüŒx-%C¢‹ÒS£7ÂøE¼jv)˘[}§.¿O?ù,mÞ7Wä0Û˜ä7Ôã¸Í"ö=‰^ZÔÀË›4+;l–(ìD²ûã³ÅÖ_äl=*¯¡¾éË1Š bn<©(ëÜ÷þ&fèbC¬[ŒÁç^S…§Ó€u@@ÑwÑ:2UQLž¬Y›§ ±«7ã=áH L(»ýSÚ;VycÇØ]Y³~~{0‚èN²WçÒäÿ‰¨ˆÞ̦ìæQÃØ²Œ·ÝXT"[Ta§œá¤×‡Æ¯CŒß@KaÄw|ú£GHéóB¡d¼Ó,Fã=è-5>0SYÕÅg•ì¬êØÏNä :ƒ.wêý@V}C|"œT6W£ j@„XA@€„¯’À»,fCuª”ë§ú͇¿Õ‰$A±鮤=•MP.Ò¥nÅ×N‚í½ŠYKo8@GÎ*Ξžž õ˜W<Ùáħ{ôË2¶ë+âøxϸòK¹º)¤3 ¢HDgf±Ÿ’|U9åQÀOò`‘ˆ(§ÅðÙ6ï q‡’ñü'[ç¿K÷²Ïÿ·ÿ•óÿl‰ÿ…(FþЇÿ%ý/H1Ú®ø_ºÿ½Å¨ÿÁ"à¿’ÿ±Äÿ‚£þóEÀEÿKù RŒú/ÿKù_ YŒúï)þ+ú_ÊÿYbÔÿ"Êÿ\âAŠÿ\å.ñ¿ ÅÈÿ"Êÿ\ÊÿWbäÿqÍÿ ìw»Ü$#ç,éAŠ™ÿÚk ˆú‚ÓχÇüqB®ü$é‚ÉžšÿÑ Ÿ ½ø¡Kù QNœüê È´\V„ ôʶ”ý±”ýñødŽDÂch³¢¶}BA¿ÛN7&ÂB,‚ÛQ‰ŽÍ—Ùính‡?dæî† ŒVé:y{ÃhR<.ïŠK³ñ®ÆŠ°üEÝì„ðµ|Úf ¬3è Yº¼…&ëÞí9|þ@N9flg ê°I“Y1H¢ $Ö`•Ô”2Р˜AÂb^93f·…ÌØ& 8ƒ!‹WFßÑì©-`érfI˜­‘eÒ>­Ý–‰¶yû\nË8hžrx(Û䀔3H{2Øc×·›¦¤›w0n—ƒäܶ½óy—®wäüþö®hq0 ïq¬ËÁ¹Ý’·Ïpˆ´V/còõXã H€S)r¶J‘:ÑxGŽÞ9Ñ÷àä‰öè•\”S‚ß„`Žn= tëʸ(è—f3’2b=ñ¡íR²f¤Âñž”²É ;"A]F{ l"ÓßT…Æ[­Ð“¶Êçè¬Êú9 B­F£Dj;KÚÒΠÀë ÆQtK}(—ƒá4Ã:xÆ–uAð,F$½Á+›Ø‘ÆÃ;ÜöÂçÂ×Ù˜‚\Œ‡s°$ë )ÚP‹§36¬eÌW²ZIÆã 9:§Ì“`z8;H9£á• ÈHZë9¨€7bYK­Ñ#Í‹££^8¹¼My"y¬¢J%Š#61Ï©Cå)Ï)˜Æ:å+£RM:TóÅ: ]6¥‘ nÍå= S1F´eYvZWwIa˜>v7¤“X$J7ˆQ5s¹Œ Xݨ¯ŒB}®¾Oû+dõ‚Áuˆ1˜1zs=¡¦,'tÛ—-»šUع*ÈÍja^blƒVLtm°kM$ã8™uyÓ””Œ´w¡ékDÞÚŽ'$""=‘h…±„º¢ž$5øê›úˆêmĢꖖê¾¶Ùø4ijE >î'Ò™ˆFÐ1S!™bR/2?óëZjêáùê«|mȇÏmð-¨km%æ6µÕDsu‹¯¡facu Ѽ°¥¹©µ®‚ð©6‹©I#6™ˆFÀŦF„ÓIµ«Zkå­ÅjUÑ*Ê'jâ‰^uµ*žêX¨n‚¼¾¹A#ˆºw†UzÃIÄÄdgª"Ï›šùJÒUÚÔ\*ÅT²¯ÿ†ãRªGH˜‚ŽÑÀ°_ÿ…Y «ÝÿC»¡&!ý*-&‹¦JªF*ÔB¸•[cÎk˜ó¶$cÁHȺÖ‡gÄFkzGPï| 0·òûê[êªk³ò†Ö”«ò 7à~i[ŠtŠIøÏ¸Xœæ‘\-×Ú±ŠÖ™¶UdVÑš:Ó¶êlÝZSZÚ¤´ËÄÞ˜D•{!v“1¥¹ñ4ÉŒuD#ð€ã/¯QÇIÜh‚£é0Í Ë8”+oâ²PNÓ{š%n6UjºKs&ƒAkÚAóY,/õ¨Âc'cË1Û„š¦t´g̨…à'µÆx‡Vð«BnMÝ®1#äZq™ù®øUÉ@LWk… fÜfçïV„À' b1§ú¸ÔŠ£Œî ‡Xc%Á°ÀYÔ`à•YÀ'ð5Wiõo˜5Û­)”;›B%’‘nˆ7+0š”1.”—+>‚ï’|ºü/èuLR%l^M’Àh–”¡ì;s–Ö½hÖqã vÔ$A·BÍ‚¤ÐÆ”Ê,~4—Ì`5cư¬ÑDNÎv¦²ÚªûdW,Ù @ãç©SŸjE³#Ÿ?ÉLVãëÊI–1fÉ2Æ!¦ÌHhºÎ’è)Sµ&¬"uÉ$H/Lê# Áé¹ýtÓðñ‰fxš_ei{¦tÇ#A•)­à©ëн Äø“Ãô;¸¿n¥Â„€&Œ¬Û‚Ùi.Ö])±)„;© ±è5€~S@µŠÝèÍ^©ò)s°š{f¹sÓšˆ²¬EµæqY.«ˆK8ߺµ`5ey"ÁÓW}Y†#YUe¬Vyj;¨€"HÕùE‘àžAF̓³ÂŠŽœ¦J\6—j0è&*qšpdNUÎÈÌWøé\ÎôqUt”%-C9M9êÄŸÃä‡d†¾:LãÖ¬ G[*{¦SSî-Ó¤%¥VK»Æif…sç…À”éò@=…3 k††3Ïå9ÍÆp¬YÿñNyõÇé$j»:„å´€ÓìÇ ÛfÀ=„Ô0„j4a¹œ4ˆF=#[ Š.ÄTÆc&¹'?0¾ ÷§øi£Èå¥ûy¢,µ²ì7ZŽ6E“8Í–ÊB5p1Oy2_ƒgðàyR?ø´*æ¥{|¦ÒÐï(¨`n3ˆ¡WžÊpM¼f‚xÚNýpÒ;BH'O³ÔD^33¼[ŽT`&0 zk;ˆ‡ýè½DÌÌ´y¼fuxÆvh¢„W«%™ròÑ”õ5kÅgX«q45`áKEBRòØ­œŒÙõ(’‘IÍdò\¦PhQÏÛQm:iW,[L ŽxO~%¬A÷ÌG›ã9õZzyy\ùïÁ,Aqa·h [‹Ú9ý¸ü-;Íîxè<‡ÂÄɉ^6Ì4æÉ³ 3û:“3Åô²ž—z4[æaòL.ÀJžÝ´ˆË»”œûiÔä!Èfà¥ÙC›aG<š•ñpÄÍæ¶š•ñðæ–šÙðxŒu¤+­ÓðqëçN¨UÞvæy [éæK[ Š¨÷ÿÐÅsþ›)ÿ-D1òß]<ü/å,H1🊀ÿ¥üŸ…,FýgŠ€ÿ¥ü¿…,Fý/¢ü¿%þ¤õ¿xò—ò¿¦õ¿xò?—ò¿¦õ¿ˆò?—ò¤ù_DùKù¿ RŒöÿ¸æÿfÝ4Cr\)þ+d1ó_ÛÃÝ#Hp¥ $ÔDÁÑð18ûù?Ú=«ã?ÊÿF¢êÒù¿:ı! p!˜D)Xå¡]!6@‘êxãW*ã[F¨ÿBb0ré?͘ì?ERn²¤ÿ…(íè&÷$ÎW—,CÉkˆKQ)Ãsš$Èy·‹wðn‚a8IºÔf¶´ž"ExhÞááÕ&Ã:7D X$EÊØãöèàÙ$M"(Šr0â/¼õOÎÄ¡ÈW[_y"Ê&Þï{䱦>´íÆ ïÙö¿á›þið¼‹ïmxt02ó”3ï½ýå¿N=öm×Gô´ú§ð.yàzáÈÁ½÷^3ñôisöÞ×å‹îþê ÇÔIÛÂ;'¾üYŸk_ýæ¯v:~þÕë·mI -뿸µûàúâ·\{ÙÃ[º°ýçG–½=·ì¶3·}=X™ºzßCwï]ÝÛÿЋ+¯¢v¼Ù¹hÛÐêï|ÜØÒ÷Ø9?_'~úøÂ·oÀ™œ1È]qàâgö¼|ÅÖîùò±Á¿¼uøÓ/>=òþœi‹ª×ÿòË-óö,Ý~Éâožá¹·Nüï²%»C“f÷þphîÐÑÏì¾£ºç…Ó¾X>‘ýø¿>ˆ|ðöê·WVØ÷Éâ­-Ûöú[/sõ®ËžZ1{÷7ˆïÔ,ºséîЫEaçüë6^|ÿ¼ƒw]¸ø–‡ÜýÏlå~ùêæå¿¿ôÌ%ƒ?Z×öõªí}&M}ògÛv/<祾ÁŠƒ;Êú/ÝrÖªëoJ$šÅg<¿(z¤öÙ7Ï ­¼é•§k³ê™¿[ñÐý9Úùoo¸þ=ôÓW^mÜzÉ÷ýb펵—;¸gË_ÙÚДþ³þ~ë¦÷Ž|vpñ[ñm[šbk×öÿöóÿóÜ)·ÿdè™ bÈ9eî¹ýïu]ý;çÞÅÝ/M^÷ûý óoørÊm»~ô/¡··’ÿ8ôõî…{.êûÏ®v¿³¢.ºdà…7èÃì¶$1³oðÖO¶|±êݽïóÖЕû^ÝÍ\½ìñµGŸygûö~9¹]۲`M:Ü(õ-yý.£ýàÐÀãÌì>ÿs—mX·„|mÍë¯ýj-xm¢áš·_ë»èðŽ£Þ˜»cÑ 3¯ùî@Å3¿øƒë7‹.Iz¶=õÕwŸyÏá;nῌ}â=w~è§§­ñ@㙺¸µŸŸõøä­O|kyå¹ýëohª:aVǽK×Õß<­o òwû†Ž„û–6TÞxhÓÞo~ãÔóïøö®<Êíÿ·Ü6%Ýú¶£II cöÅzË*%!Íj&Ã0 Õ·Ü–«ÐF–$…$M¥ˆ¶›-K(²WT˜”¶«KøžgfÜšˆzý~wš?æózÆxžyÎùœsÞŸÏYžóœóþ{ccÆñ L­CŽWŽüQP0òÜ­QMqKõÿ jÝÚ]L9T’˜ßBÔ¯ñžÿ›g@Õ#¿C‘j×g¯¼—n.Ø®}9–Ñ5¬Õ>ù¢òs®kÑò”úìºÃ„ýZtËÊ•^wW¸Çŵ…RJ“XeOŒEfdµÏݶéxcv(eåˆå³¾æò£tt*ý+f£B?Û–4#bôƒ ­èÑïpâV’ö»]l’“¥\Rh¥7KO;@ì¹æòÄLÐE-œ©Öì6´à¼ê3«„ \©WïnÅú‡M—Qxã*ýl×WvpJ§Î, £k] ,á”>Ò ,(Êã]ÜþÊÌúE6eQaà²t3ÏcW©ú‚x>!E¿ñè ú•ž—å-m±ug÷œæý—Ù¢-,9ý«_;»kE[W^f[C™­IȼQ1O}nèSo¸2õ ¼÷±Ã•޵›(&ÂvsÁAûº÷3ë s3èÊÉs^ã®+UÅ™¹G|cXž¨œD>ƒÖo žU_óÉþ|¨»³M¢ya¹{v#œ Ÿn¹6esC]I¡÷‹«>¾Ý›x«Œ;×½v܇׳¹íƒ†®àe•Û´ÛóÖ[†{;gQ”“cTBn»êÖo3r£WÓŽ²õ¸ù;ô T·Ô¾kløh=c3aËl´“û*¿ëDCPWٶĆ]íÉ'ÌØÇË.ýÇ¿±? æZŸéRóè¾ÞhãŽY{g®ào$ }–Pò0'ôÑÔ˜g3§áÆd«­=KõS´Ž¯ŠÊ\Aw^ž¥°9e5»` õ¡²ù¾JPóŒÂÃÌÊΜ*²¥Öxý£AÊÉÏcs|ÅQ þFsc-ƒ:N:n¨H<7.ž~ֶͪ»Ðݲöļˆ­¬÷çÖošñ6<¹¬±³ìïðd'`Í3ÖåõÜvõ_×ý6DOpÙa€\qÝ ‹í]w2açôÀõC á©ëÞŒm”þiÚ—Úöü‘™` òôÚëùä[®V–÷“âµqvìcáŒãqwÜæ…oî(/ëùH+rihù¤é[|?- ¦Þgeå"3¼ÉêáÕÏÿ¬Uz‚\65J«¸âEkÜŠ¬ ¶ÝeF&¿Fî½:¶1üÓû'Qþ¡k­c_´½Ð`céúh’Ïåb»ßéhbëŒÍä“g¯ž™·o "2nú/OÚ\“å;bÜGp–Ý}þÇ¥áñ‰QËG{¶z›2¥°Êt÷ôÇnôí ï&Œp\S„[Ä_SÔ;ºÐÓ,lúc[-zÊÇë¦G^«ÜfÕlá,íRQ[‡/7IªUb¹ü®¹+ÿ/ôMAsØÆjUÊ ŸEzìNéãíò;iÆÃ»Ó —ŒøÙdzžˆ¸{6üÖº'PWÛÒÌÆôü’ ;^g¿‘ÿÉÿŸbþG&"=ÿ'Gü þ'™ˆ´ÿËÿŸ™ˆþ9âÿSà/‘Æ_Žøÿ0 üe!ÒøÿTþ?ÅúŸŸ ÒøËÑú/Åú™ˆ4þr´þKñþ—LDùYÿ£xÿ_6"…?FÖÿaïÿËP¤ñ—‡õ_üïÿËD¤ë9Zÿ¥À_&"íÿò°þ £xþ/C‘ö9Zÿ¥À_&"¿­ÿR<ÿ•‰H×ÿ?uý—tý¯À_&"¿<ÌÿKðW<ÿ—‰H×ÿr4ÿ¯À_&"íÿò0ÿ/ñÅüLD ¢Íÿ+ü_&"¿Íÿ+ü_&"¿Íÿ+æe"ÒøËÑü¿bþW&"¿üÌÿ+æe#ÒøËÑü¿bþG&"…?ö§Îÿ‹Öÿã0(ñþO üe"_ãÿyÿ[Œ«+K´ï‡ÌöÂa¢ýŸPŠýŸd"DÚ}’aƒÆÑÉH2ŽHBÒ :•H!ÿìô)äß•ôÿeÿ'+]ÿ£($^áÿ²©ýŸ~vb"sù1ÿÿWöBañÈ>þVø¿L¤ïþOCõÀÿ!¢ýŸÂU•ÔÀ×ìÏû? °ùSM¾fˆôæO#FJ6ª.äTT‡´e-iÏM5Üͱ)›¨£*DcÝæý±µ¦2Ïš0/Êóå‚Ò_… œl-»÷zS—1Ò;lÑÃæšÝÈŸ8ÁrÛpZ0~ÏÈ#»KS÷ˆFmFËýñ§Ë.»ovÄÓ¶ 8¿öx‚ûV¤ÇDe]T·PÊ5­<:­Îó׉{J¢]þzAXΟÁ³˜øèãâs¨æÇ»Æ9¬:‰Þ]ܘO>;7=öÝt£°òèõ¶©¯ˆC5=î|“[3¬)Ž(¸™­7„Vô¸ª›ö^mçͱP³QèC'¹”ú¾mê&¶ÔkãÞ_iç—ÚÐq‡ˆuÛaª§·ÿ†UÚéæ¹ç­U×;¬1 塚Ùr¨JhR¢—|ññbžÑ­¼-´®éCG¨$óôYT,¶¬öI}îÕݳÍ÷x](в4ú³iKžmÙ„“”« Þ{ï#L›yãéx}â{xÕ𓽮ó·e´øóîE©Nvæ{xûƒ3¿•þËøàô0ô°QÆ.ÂÅ£ˆ-é7½Ëø;â…#s,sÞ^µ©êFèÜ[‹_øîn8!l9÷´ÉÙ¡ÊÛ©™šÈÍØ·2}ÍëíÓæG—.¨Õ=ãd?!ãÌo¿¼´öíé«­O»6Õý¯è,݆ô³ðî_”n Xe^[7z¦ptŠÅ¨ÒÖã+k[î>¨-Ù[Ž7/Ž)L\M­geyZ$rº‚':gå˜úªØ†U_›\‘|Ÿ–˜]]ý‚Uûß’-£]*Ÿl4m͜ڌ³¹ªZ§¦2/`̶Wµ6lbŽYk¿÷Ì©:\ÓÄÞšòZWç¤OЇ»xo'Fo]~¥ò`Ñ/›jt†‡Tùé–Æâ ïE˜mß=5u¼ ¢úƒ¶ŠÐ.øÍÖ³§gTOti:^ä\­Áwåw»®zZ¨^bFoS¾yl|©ßk³ô\e{ßò×=Á1úK·ZíáŽÕ$i¶›¬oªiQkº´#w»“jfø¥ëm*zNù¤µ7T\>el±,X?¶sü³cÝA‡sΜx­‘–ß/›žjsÇáŠÕžÝóüÈÜPµâjECÓWê¡^™—{ªù«ùžµÉâﻌ?÷ ÙÜý^™!ªç)1ªÅ«u{L³¾‡[Ñn>0[ÏÀmR.O>LkÅßïm“ÙÚäc¼háIýÚ» 93Ò禗,¿ï`XlAøè{`é²;,§Î½±kq…FKKþ’æ#6Í yj#÷„*‘®ï¾EÚ•d¢òÐ,¢âõ‰÷˜ úê§±íÁS~ë9Ú9ùÐëY¶åcB^t³:uìÎûU'ׯýx|ÝçÿÖ¸-|[Aþ8†p¯ì)7 “8ß?îPDŽËQõ¥4¥n­šO[^äŒ5¹ùwÆ”h-‹œG›ÉÙj‹l·V)Köíºñ°Ë)ÌÈþò?YÙ+7_Ìžá`—ž”š=ùÜ}ÜÒô±ܱêu„êÂ5z /9¿›ØÒäÑúdRVªªÖL¡z³]ùS¸/÷ÚZµÌdÃYá¶C ÃߥœR¹éw-¢–°îÕsNªÞ§êýÖܱ^•áï:^‹ºw·…S]S4¤²6;eÆù}£ê_éä>í .Õ•ÔÌ h{{„™i~tŸr ­¡è^½3|[ÑÊ­§5ü^àxdWÇxÕ•—v–Ò‚4W\IÎtZüÁ¥|mƒ’ÕQlùUè*öü ÞÜH¸ý^—³”â)*à¸Æ7r 9‹Æ<üªpåléö_ŽÞÿW¼ÿ)‘~þ+Gïÿ+ð—‰|ÿçþ?…íÉã°Y½ûéþt ÜÿG¢‘ñþ¯X4 ðC »À0@Ñÿ—Ì6µ5±w´3ƒYØ/·†Ù­^bmiÓÐÑÕu@›èêšÚ›ŠÀÀH˜=‡äÉeBô¶$–®®™ D¿*¢D5`ÐHT#ƒH[uhÞ|¦¡† °!0ŠÔ±‡ˆ¾añ™¡¶‰'²:} ƒÄáÒx†L.[‡@ÀuPœ<&E3’b‡ÕƒA– ¦Ä.á ˜9“Eƒ­=»ð„hÎÅÁ” XLOwiz_ ',…ËÕ€qh,C -—A£ñ4` ¹$MÐ "žWQv$¬¯³ut`Ÿ9mÉ›a¦âè$„±::à*Ó§—Y×[DO ‘å~uE*IÐVÕ Ûåà_1ó­ÉMDw ó‡ šÁ©áP›%Q˜@·Šã°èýé»""yz²!ej߈¬™b‚ãAã ¸’ð$?¼—½o–Ó<ÈÀë¾+7›LbõMÇÄáÊ¿7†•4T.ŸE!&EV4ÜÁMö  *ôø„O¥qa$O‰ÌsÍ‹’"bB–Dc<©À|Ýô È#¥/’Kc}ÅXº/cµIojD™èç(pØ?Ës\©Ài™,`÷ËÙ‡nP2ðˆ'ÛhŽ$å°yÞ|6O€au©È/7çP9 ñÐá²ù M’ ÞB¿Á&I¬º"]¢L÷«Vı gô½[”RKɽTš  êIÙ sã¼¢¢íƒ“b@cÔ‡=¥KE ûm??û’:Ú’(È>z\Áu 5Ä0-Ѩd.K8ºûn!qh¤>åhbŸÂ—*ŒË AU´/>TË‚Ä|D„6AÔFñÚH4öŸ”ô;V´÷ÓûðƒÊÐՕ̧[D ƒ©Á"ƒª!ƒãK %ÂämLÚÇ_CÀjŽ÷v¬Ï”߈‹—Küž2B t¥© ¾-‰€’ŒÇ¥“ j}/‰ÉÚ3˜\‰‘rl_.Ì—Á¤0DuFeBñ±6Àù‚jª÷¬×%xPXèÎÁ,™‚ø†%Gùas†Âü¸E÷†ú–Qc¥j š¸²¤xQ x¡‹ÑF¡ñƒZö—6ÛeAñòH4pÚ8H=¨qcû+ïAt €ýá‘xœ6ƒÌÂ1ø~t¸’@LBÕ0`~Pm4Z‡BiãjÍ e@MƒÔ=hÈÐxÔ`>‹V€éO•éÆä‘¾"4pa4ä |ã*£e´• ’+PÕá€%à@mAÀ f Xbÿª¸Gû¬° ío 5 60od¬WÛÀ9#}£DúÐh€ºˆ ™ï¯^qeÓ<¾-œ6ƒ…ÑÆàÎP„£~SÑÀ5B äÊ@P Xz~ë :i4Òwd ø+v*,a`¯¢‚Úˆ2®Aìh‡Æï lê`4êo4/nÚ‡ òÚE$Èv`K§MýÖbMƒà*"$N„ƒê¿©4èkìÈþìâë¾æR6ŒÐ_†A½F›þ¹ýõu x$2è ÑRh,–‰Jýðι^$Šä ‚ö–Fˆºâ?œ.Эž k¢ª%Ñ@ãðAÄýiš‡%æaM£ƒòdû‚¾(¦ˆ‹Ãtc€‹>’S´§â±ƒxx"Ž´OT+¥ƒ‘Ù<ÛãËéÿë â‹œõÉøPD3úF‚¡ÄÉ5ZÜwtÄ«åß;PâÂa°¯íâ;ßÿhG„Ó¸èŠ,åq Â÷l>‡PšŠ.Ш0SxÓ ÄŠ0V’×QŸØ¨, ØØ3ÏÈ€ >d£Å|ƒÍÑ3Ð%C\è2õì] XGûÇ¢µÞÁ‹-B¥°¹6 (È)T A´jaI6!’˜üÀûB«Ø¢Öª­GQ¬Z¿j­·ÖrUð,ZñÀDÑ¿·x ~òÍn6Ù„CËéÿÉ“m¥ ^".F…Ì8ªAMuCÔáU jˆô)fÃ>Õ€†H?brÞ^C¤£1¹õ ‡v5Ò‹±³e‰Mÿ‚!…iN€….ÒÉ™T'gé¤Ö %b.°L) !&D‚¢'bêmˆí¦pÝøXÔÛİÞõ ¬LNI…uhÝÐÈBˆéÈ|Lw‰q)ÀÎ" ˆÅ¡Šš4V}æ¡TIS@4¢£×Û¸6 Èl‚ bJÀ%ÀÇ„HWtޢ„+`“Æf¶ŽVbÂ0¹X! Z«Á¯8)øImN›eÔS¥H…X±œTz‘¿Ÿ¥öCº)Ñ÷ PÈê8 ÈIÕqªŠÙ¤Ù\jXŸ¨—ˆÇÕêSè¯R¡úZû_¤ZR*ŸH,ëášD$àë”TúIgbó Æµ©"nŒ@±kÖÔqJê1w¼Š ð“a˜&Rå/áwÜ´‚Œ‘Ê5\Yã³_©Hï îÆr^Fè ½™¨&­a˜ªƒœq¦i-iÒ«)øAñG„œ4vck ×ú£°yhskµ„fP 3Ú5W¥Õ„ S› •ôQù3æ¡5/€ÕÄw€OÈÔHÄF88¯fÍ EªÒ$£²&Í# Øìt³1Q‰w5tGH BLˆCo†y½?Ê$¦v]‹ˆMN½nœ,WK%rLÔø“šIÖ€ƒˆä$­tÍ“/T©5úàdŠYªÄ2Åd_¦I&S?·ææÔÝ`òöDûP39 vUá$Ôq˜õ¨J;b‚BÑ\† 4#&}­CG$bí… ¼pHÜå°,E*› s(¤’áúx4ØhêèÉy€Ã†LŠA„£J’šÂ-‡„[b)y „<ðI8º4Aä¿;éãá”)ó$þrêÃßfgžSǼUI´ï&¼æI|çp-Å<·Žùp…D*Deï{rã˜Î`\2”æÂTÙIÚeP//H¨Â@Ê¡?ˆè23›žsÉ—Kÿû“Y3jÈ!`B—UêЉ¯ÔË5ªTäŠ&)}ô¯KF5Ú "´¡0KN\Ó¸˜KN\“ÉÂP¶‘b±T(Eeþ†Hݾyñ’¨ÎÕ&ˆÁ*•Ðø7…CvÒ=L׋ބ(p7•‰Ï\vsRF'(ÓNTºL'‚@í bJ"9p‘æ$‘A8»!Äk§#à Â@¸cê J€ýK@ü ˆ^˜*3²$ášË1$t*“‚tÓenÓ¾Hôãr›“i–ÖbšÂ4¡+âAC+2Ç8 V\ž!±`¤@E’R!>S?óºá ˆ×רqD<lGP"Šº®’å@y,ÕQdÀ•T.6áŠGb"Þœ*@ή ª¿o@ªF%1%•D4£>h|g°ÈcZH$jòš5¹ 0šçëHÔÝmŠèIå±½®S7³Ò®Wl”áH0ä! ©ª®š,ÏxFx­AU HNLVš¤å<¸xFÀ¯È‰0Uˆ¯u1H©0Mx$ÆðŒ0…Ó`½Ì\¿u÷D˜Úd~¡ÃuÐ. {©/*“5¯éä.3¸¤˜—&Y݈—Ç(%*T„iŸÕc-ñÃt,9–‘·ÂTRqjý~nÚ“ì‰Y_Oø«T5ÓaÙÒÈ7Q¹“é¸il²+ªñ2Y0´*ÑwFd‹Úà¯5í!ûC(XoõtÅ!»2ò}?¦rá’-ŒÌß„‡øö…i Ù‚g¶…!2… Ñé¤Ó 8P†¡rà£MÑ4`:Óé¤ÉÑ??HQ«Öw bPr’² ‰èLÌ3í  ¢™ Ü%Ò3ÂÐD`Ƚ¾ý;|‰LÇ U¨¤Ñ™Ð4j-éCtUà¤SÐÙÔ:ÒÀéo³›ëju/ï4óËÙˆ7‹û9Ûøû/-èüOëù)Æïÿ¶ ó­ï[¤û :ÿÕª‹cÿoAçZÏÿ²H1öÿtþ§Uÿ)Æþß‚Îÿ´žÿf‘b¤佞ÿcýþë{(ÆúoAßÿµæ)Æú¯ÿkÍÿÞC1Ö Êÿ­ñŸEбþ[Pþgÿ,RŒõß‚âëù¿)Fúç´ øßÿY¤ë¿ÅÿÖøÏ"ÅXÿ-(þ·Æ)ÆúoAñ¿5þ³H1Ö Šÿ­ñŸEбþ[NüÏ‚­ú·D1Ò?·ÅÿÖøÏ"ÅXÿ-(þ·Æ)Æú¿ßÿd1AÚOgZ¿ÿiÁBÕ?ùý%‘”ødáa1I¢wR ®àÎÿ†aEÿ ˜Ã€­ßÿ´DaÀŒAD [„‰ÃXb:*‰1&œ€"Øû¦ÏZþ·åíüU¾Ëù?‹…PüŸ3¬çZ¤$ j RgªÚ借Ʉr -øŽœþ+|ƒx°¹~^—­o#mL­GÌ ÄäâGvAl:ìÁâèÛ ^"&‹ÚF÷Å?²%Âðàq 6ƒëAg0õM/ir¬—Îdõd2=èl “…ŸÖ¤o‰y‰`V=- £qÙ`T ›þÿøöoåÿJ¹ä]ÆhÄÿÙ›eâÿøúÕÿÿ÷å˨ˆaíÛõÄ-¼}Xh߯æƒສµ-øÿÅ}NÓÁ?¢ÂÁojkœ”µ66999ëÖ­óóó›1cÆÕ«WãââœÁSµµµÁßúW‚«V~D´ÍÐ[Ä66"aAþ‚­¾¿¦X} é^TãUy€›´í|O—êC.ø¦m±¾<â¯ï”±’ÃOÏùGŸ¾Õ9¼àÔ¢õb¦“ââ~6íÀÈ1NÎVܸq01D±oׯﰽË^t¹îà|kØÈÜÕpùI›×˹lä›¶Ÿe2ýv-Üüð?·«ž¬Ð¸ß»„Á_‰ÜXœq¶"²‹°$§rݯ‡FÄ}S{~Aí¬ÎÙ'òr‡.É”P¼iû«­×½låWùžÙÔ»°œ~ŸIc=OèP¾ôúÞ§Û«ÝüÑ»vuwì¹î×±ÛŠVxÅõU×T(ÚN¤í(:*‚§Nçî=3|Q*-ñÅ5wG¯N(“Lª™ÉYv‚ÙAµöññ”!ýÿèõÕ‘ø_|˧X½ˆ£xÐ*#»8~°÷Šäš¦û— šs‰¦ðMyçØe]CTì%pÂCtÇÉ­® Å~EE]ßTÁ¶©¹ºÒš'è[¸t|ÌÝFýôõѸ¬Öãhýò<Ö_{pÔåGzÒ\ _|:kVÙxûÒV¶9O±âÅ6vÞ‹D‚+vÅCÅ;ú†ï‰i¿{ý²ììÍO@Û¢-Ó¸ÎCþìxaë‘ÇE)_¸YÕ37jPNû®î¥ÍàÖTŸ÷ŸqêvÊÔË‘K_¦žxõèäVÖ ~î5¤¦í æËAÅ终ôs¯>°¶cà¡$çÊÆÐüxö¢CØ£²E÷_®tuØ?X<þ´ÇʈÜk{®ÿ¤zPñã¯y¯<:"Á¥Ëe²ÀÎv[ï¬\“_qôèÕý‡¦ª?ˆ¹ÚqfÞ}Eœšözùä>Œ{o¾ÜÙ'$|Ë‹‰6Tv[1¦³ß×O¶ñÌQ~uÁ)ï7Çԯ﯑,¸‘xªG·…¿²q,•ü…/匡JØþ¢×«Œ5óOÿ2^ÿÔÇ«ïáõO&,ÍÏŒ]Æv”wô;”¥ 8Ä.AûáIõøÏ}¿}Ñý³Ï}†ÀUí§§÷²·I²-Üp¢}=£ô«¡çfîâmÖFnµÙPü'…vKÚRé²¢\ÁÌXõ™Ø“Σ¡W¼oŽ}óÔf(Z¶ûÜ×óØ¥Y¯Â*$%U5·×í—o·Z46­ê|õ„Çó.INW?{7å¡Ãü—ý¬,º—é*TÂÕ—nç¼XÝ®íW{¦æNìW{‹N+È;}9ke(íúcZ—0‡¹uÎ_ÙzYÑásJ+£ãr3§Ý*Ÿ]𨸇­°Sø­æôÿºãÆn%<õ\—~ÁV%Õ 8ðöeßê;÷{Úm­aÏÝa¿p-å~ãðë–O÷nÓŽvËIS|$~×ôÌÈþgïŸT¢¹ÁÛ:#1‘[4·çü™%÷Œq—ù‰iß|¹¸`å9ñ^ôfAÍóËYs–|ïîàsßéõ^»Þ—Îý26üØ)ÿد½žî(çN ùDlæO ñóoþ1ß?sý‰y/ïåÖÜý—¾ùvÓ¯Óvûv÷î¡n¦l5ôâòÝÉÒñç'LÙ›5ùðÎ kû<ÎÓÜ`ÒÌóVVÝ.†6î÷ŸU18©\nۿײݬL~t§öÿËÞu@5•­ë”^ ¡(*EŠ)@€` €€ÑAEj0€ ¡…*UEz ÒAZº”…HG¤IèŒ$ÒDo`½™Ñ{ïš÷æ¾w¹®·øVVòïòŸsr¾ý¯ógí/{'ƒ ;I%9b7oƒ‘.c=àóHUý5!§`<'3cn”m>“þV4jpÒ©KÅ é +JcrsÖ³€ÖfíllœMÙĦ„â O›HW),,Ñ{³3ž>€Ôo°Š8†E9Hò>{fƒj÷’ÇV¯¥õL´&L‹œW‰Ô*åbÐçn‹ŽÜ¤7",ïËu¡î»Àgƒj¡F}'­ ãƒÜ—çeª¨“N@­¢wÃò)"ñVKnjÖ)–ú½ÐÜyh¬{tC®ßÅx*ÇãgËü´Òb¨ô¡xãN»“+Þ-{Iî6^èêÕd }ñˆþAF²bÕ¦ë}¤@þsB ck’"r_›(d‰`ÊHªó“f :E›€92 ÚJÓ>²†æ=b7¼ØÒ7)¨ÃCFà¼n &` ²j2'3vzJ˜Ð>À_Aá}«ZãÔ‡¤Ÿ%6¤j Æ¡Vï‚ós¯Ï°îc·¸BË`eÃõ–'ù™CK‰öÂÇ›.›bŒr1ÆÉ~Ù¢VÝÉYÒN`hz¨aF’Q‡a\B(°étùåÍì2#“–ëV‰éG° ÷³¤ÛGìi:y¼6øõµø|ÙYe~>17^&“|Ò£qOèRªXÈë+Û-¢ø©çV IY𻓣H]¦Œ²Æ&½×ÍÖ*Ò=§<¼F 8Nào|ŠáOûõ­I¾fïu>(5'öi"ÆT@›“ ý¡pþŠ‹ ÷{_8lëà**Эƒÿ§9üßà/Çÿ¿ ýóø‡ÉCáÿÿJ»ñ¿#øGý'ã”ÜÖªä@xéÒÿ¥ÿƒÁ999_AÁk¢MË~bøV JüMªç:x2¾eƒ‘æÔîvy$¹ÅþŽîËñ—øàæŒü¶Çø9c“ã#Ò ×¸ü¬¦™¤Án§r´¸ò¡žÉþ¨—†h@©ßÉÃ##Øð~¸Æ§%‹£ñ>‹¸äÏ¿V?^tÿ ¨ºÁ@ab# K\%þV˜Íè©ÏfÓ+d¡[Æë¢â¢E‘Û:öOÕ€UBÐ@í†Ð~2ô¢ ¹ZŽ«üy2¦NÔR= ÎââìÞMë5×{Ý›ŒcaQິá,#E"«±õÞߊ²Ü7èp8¤Ž÷'Œ¬Ú@¯7³‚9ÎVOï±<î—z‘53M#`çQ5ã/ÇDì‡ï¼šë±&ÐdÜyLQo‘º‘Kl¥·j†çzæã´—=k^~t:o,°nûÑ›TQqû¹J_}Ô£Ì÷Œ…~Ÿ@ëM­^*ꛓWð Öò-b ¾ð±ˆçÑ8Vu6Äaq Uãg¦ÒØ«réÃ'Ç›úo ùÛ×ELÊkÆË´L¥ "²b–qQü*c^Ÿ½°˜£i½/@ĸóœ1×PÃ]‡â"þÕÇ÷‰ÙgÄÚïWº’&BßY‘•(ª«JÜ, ëHYóyìxûpÒÛÆß*͘ê¨ÿ¥øjoÿºò3±íë“>¸xàùšÏu·kKr©µ¨}Ä. | †¿ŠGÿŒÅ-m4¼RÀÃO‹ëÕDCk†ypÉ#C'$'èìÊì4<ñ’‡/@Í^Hb"¿o$üñ”-òFÃ@)˜Ùct»k½É•YÂά´i/è6Ë$JÊð!ެDê(9}&–!†ÂîÖG´€ˆ+sö­ÿ:‚*¦Îƒ‘éNë|è³c· TÚ/ógÌzãÞ×zBškJrYÊÕ ±ÏņžùrQª$c­Œãí‘Vÿ„ :³2ëåî£EXܾeH*|½t®WÏc"ÑÚ õñˆMBIŽÝ××øºC¹¢d|#±àG%cÍÇ/®mg~N¢PÛÔ•ÞPÅ Á˜¿[¸jZ"å¼7  £Dqœ2žä÷98Y ƒ¤lcD–Õ{¥cÜ;Ù ·‡÷Þp•…¤“ž0Râí튵p¥i & Áb4x¦=}kœûHh†5pmž¯Ñ[K½ì5 ¨ŠÀê·9¤³¤4îÓ bÕ-‘­i¤ÊÌ ÙGšÎ¼³^{Ñ;~)þçº=3JP¡ íö…ÓµÝú{Ú%: ¦ð•9çA-@ò^-çÜ£u¹Ö~: ¸†ŠÜ7f4éX’FrˆØdr™Y`úÙÓ¨ÃØI*"løå䥼£ÙиrÏxº¾’¿8㣠ͭhót˜ˆH¥Ž(i#.–ð)õ‘ÐTÄ(Y¸rú˜Cm|^ß@¿#EólnR7»Æ—Ú÷‰y„Tÿ²ô°LáS¥¼A´Ó^þ-W(šõÒu¹ï7`!0í_úH7¥ãÚ}â6Ž[Ër¢”ÝÝ-œq³[d‡îè}‰½çÚ•šÕôCÕú×yO¨WüyˆJ…Kgô5†1rMÞY ÷¢fF€„²V[.²wžã{@­°´GÍÿóHyggþ­ÑK×ÏìûÂÿì'ðam!ƒ—XðzcñÞôâTmGL*ð˜[Awgc&»,³Öê/ê%O&]à§j¸Ëa‡o6’½nñÉ8ëÚÄæÇ'æøˆ ¯nù”²úû¥j4\ ײ“`"Û‘­˜„ôÂUŸx+¬ßÚÐú”ÅaGÇÂÅì‘2GöAÑ6÷yԇ“Œ•Wm«å“Ï5¼Á‹kØ]?F雫ááÿ ­o÷ÝML="ˆ”‹Ò’Ô>]œ–Ó×n­ï®ÝÏ[z6@$âibÙ1| xáœòH!ï:vÒÆôÔ䣋ߤÉúlä»í”¬u¹ÛaœÍ¾#^Í0liYçâêTÙbšå¤µ{è~Jæ ®Ôý£o-æ‘·úrø°˜f5 ÁìḠ«ðÒem"G é«k[®cÎñwï³<*‚÷¦ µ»¢XL ‰ÜlwJ®H—»7Ïqä‘™Õð¤5E †Í;%Ö¨c ¿vJMÛeÞ®ìšN¹Çâ«?Ê7èÜeo—¤1U) ØÌ[;@i¼_ãð©ºm†¥ÉÃwó©ÕQBWŠ¢áŽÏZ‘9¯Ê#' ›W¯S­ä–Ö''Ö³»nVy4t¾ Ñœ³Š+³Ê̸¨Ž˜Ž—ÂG.!ý4É’,(ZŽï"¶t½ª±¤Ç¸oLû)^îzrÖ€‚è;ÔˆØ L(ÑoÇQÚˆñب‹”Ï ^Ò_Ê“é+–Wºp‹œ¢Š+éq÷†­©ø=­Yi#,©Z'âçGQû°½Þ-’}ÈÚ;œÖ¡õ »©;,„EúÍÅQÊ›‰+ŸiJ-»©èÇyŠJ‚z5eÈñOh´MÊæ@ÞäT€È‚+°pñ»÷§Iû6æ„©sm‚¦ VιÀ@MâÕ+éUÞ‹Q%ÚG6¥ kr#‚Ó|×.;?óì<Ôæñ1¢êååsR±-\ZÜ ÄcÆ–¶÷­Z¾<Çì›íš`8×±žì"Úl sšaBUK!«€*»ù§;MG‰çôfaÇl„ O.‹¬…tFZY ñ’¹q-Bɰ*”ûóñcsZ(gõ{)i…o_…,hŒH¡"QNçåÕZ›´™[¸s®„8üBnz#dÉecQP%3 GÑ“t­&ˆ9LÔr=‰Ý„¬\«ÄcüþÆÎ•€C½¶}E*©8µH†9³"„3–¬3–¢p¬YÊ$CÌDŠÐM);Y†¤ˆR–†“”Ý Ä8”Œm¦2–ŒågùÒûžï{ß÷|×Û{¾ëê¾®¹þó¤òhç7»(ãŠ4`½åa{ì…n§pn–5rJÂypz!ÒeÛÚS: ;Vv~:pkÉ¿A»ÝõººáÆ!ézGÅó7¤©žÙôú{†YGÍ2Çš¬m9Úxõn¬æl©X˰aèOéåAØú–1ZoÝøßIù³œÛ†j³Ï‡2 Å§BYZ¼”Ÿ/O Zé)ÂÍyXµp Þ*š0Å2j¯n8 ¶*Ó£À¿<å‡1@€Šå#Ù”¾·Þxó\±ÚfÕWWµ Í œïÙ#¬ö¦ÅöúÒ½i CxDØù¹Ëz ù#ÕQ—ÑŠ7Â-Ú'ûÒfµsnJ»‹vˆà?Œ‰JÍ3ÍH¯ï½©†m?®•ÕÖæU|•j§oö3UnàX/å9nx4ý£Úƒ˜Ìö¦ƒ›pADÂM‹s34g• ²êQ¥„àð®òÊä•xBøÙ0ªUJ§#¨]"ÇÆ`çx«~‡:•Æß1ø˜ÝÙŽ-}P'—JˆÌßݱÿB¡SÛ«SîÔbÓSBTS¸Ÿ}ÏfOŠ+ù.6KJlš6 ÷м ¢AÒ@uyÅ{‹S»„}Ð4Ö÷Á¼—0t˜J†M¤ŸÃOÎÒu›Û¶2 Þzm£,)eÌ3‡=çD‚6ÙìÅ>³Ã7™­øAå>Ä›õçv¯”Àñ·ôPàâ™â‡ˆ=I¥е *z%š?æk·vÊ!zXˆ½t&kµ+'OÄŸmÃ;(–‹Šp»”Û}·Mò±/ªRÓø(=ƇZ(œ²æ"Æ»C% ÖGdý½sïÌ?Ô,†Ì+](ŽÃ¯0Â2n%59vXbãžn+wÜ×þ¼úH} Y1Ê6ßá‚ʘѣ/·t2<ùñÇNìIZu“¾H¼‡¯Íƒ¤ ‡Çî %äÐF“™æ´(U‚áL”ʳ4£¦7z[Sƒ˜Û TçÌ¥BwöU„¤Ð“DS ù³›~ wec.¤‰Ý½Õ\ç³£j ß´2»hÊqC{¿¹¹^ÒÄV?»û{T–ãú@‚ÑÙvmóËï!!xÃVmª²Óîx4´’¥«°=½”þ@Æ2ÓÆàHgø 5öHô€‰ØÈQ&o£œè·Ü*â{êQYadñD´;=O.áÕ@ؘy¢&ãeëôÇVÊ #ûè™É½#ó¦Mó=wÓLU3M…Ù³°üÍP[ùÐW¤£=¡!í~ŠQ¼Wµ`•!ðR5§4–iV^»¹pB×',2}uÜÊò–¯AÚaìHÅæöרªÜΓ¢¶Ù¾îƒÇûƒs&@8ÊTZáîçþÒì”´ A¤Â½*(ã˜Üû7Û"*.çmÙTø`Òô™ãaÛxrÖþ\þFW¬«ÎjòÖÁjòµ—A× ntÑ Í~k1É3z¶ýÈš÷ÙØ²ì›Ñj1¿ñ*“ššõFv_l¨ú^ÝÁÌtÐŽìÜe—wôtÝÕ÷fI:½„ß'–ùcsã-“ß(Ä÷êPžqJ ÆZ¯&]åÏà•«ßxÃé×í¢‹äž<åþœ4½Tæv-`É%ÌÄ Ç¢äîà±Ò–Â*=V2 r¹=‹…8K8r^ZêJ|òvç= #ŽQWòêâ¨åÌêÂG¬;¾*™>50íD™-ëÖ.û±íiËò¼šà-;–]FŸ¤g­èOHtxŸ=(Û® 'Í7»0µ}åÓ”Vì%ãòNNY+2†ÆÝÛðVµ-iK(d”?_ÀœO«=Ãxî<$t§9"«uÕ¢¢¦&¥Ó{1dµ#Ââ]k«…8»åà®Å³µzý§»»GcÉÕn#O½+ ïZKÞ¯¶'çC÷+]°X)щÆ^¤kÔ2M"™­ßÓñÖÖZÚ8çˆÖFÝ}èýxÚ§íûš³Ïg§YæÓ¤ÙzÄ^½Ò¨l´ûéÓÇ8üìÜ¡ðÖ‡sý²W>õ GxøðRbí]u²Vú–±Q̰0@)Û²¹S›q‘\=Ó7µX´Ó6UhwŒ›vÕ-S‹R>H<ºø‹J Ù—ŸRdØ ˆ°èg/7u¨§¥Ú—áƒÒ§hØ¡ø²ìΪ!’\»IZXåyhU6M…»Ý䜪ڜQ>n‰×cÝ'A¨·Úê-iÔgŸ†°£Ã¢CXfCaZY”¡0J=alf¨9ànPp~#c2ÖèuFÅÔÇôyz(C5€NP 9c/PÎîÓ÷á´W÷…ìêî:Õû$ BíVg[p-3(ótbó•6ù®ìŒ!ÐúóÅ”­9C®d!¯ð" š¯#®±ë(^oöyc ^8ð­FzûÜl,’ŸQ9qýØü¦vH·–܉Œñ‰\¤P|øø½qݧ.!væì ,Fýn!¡D0ÛS´»©gÔ­çwavßînÅ7´2ƒ··£"ÀáH¦ç‚°íĈ½ƒI† 4O_¾"ÐyP(ïÈ/Ü`¾ig'FòMO(l—¼Û”|e ³ù&¾ZªÙþøÝWæ‹_oè9ušàƒ|¡Â‹Oªš2VöÑ9fÍÖo†ù[Þ;ðÆ÷ò“>yfa _õ£HuúsíòLÝÐ>ÁЪ]’·f‡_ pÆøC'0B,á`…ÃrŒÌ%Å%˜Ën|³¶•ýâÓEÍK‚ÝIƒrŠÒOÇmÃw\­;˜üâ”òk7Vy§µñ{g`kgÁÿÎÿ}“¿¦|ùûø/ƒÿRÿ†ÿÿ*òeþÕÿÃü00 ûÿõ ÿÿUäoóÿ Nÿ7ò?ž…ÿo-ÿÐ5þ?uØ7ü×W¤›+ÒÅÕÍ@ ÕÀHw¸:\ á ñTCº¹ÃÝ]¡ÿéñ}“¯ü ëÿÏ‘ÿñüÃõVÿoþ¯ß꿺ÿ¶þ¿†üþ? 5 •¨ÃA0(øw+7Uw÷?àû 6†‚p D„Ô€­Wyzü €¿YrŸA`  Ò€þ³è/°¤VãŽQ ¤A¬ÃyÂÿ–üïó‘ (ò Õ TCmæ¹>R7Ö—Ð1ˆĽqe`Pîõ3(ÎCÕ¼ž¤0ÀÃ/ûׇ@AP0D‡ ß­ÀªîHðß[9¯Aм°'?£Ð 8ËÀj ù» îZ†­sàâçèçæí‚[›;/p8\†[ôAp È:b} ðö[û²Ø3!ë á ÁM„€~ÁǸ~’κàܼÜ×MÑZpÄ/iDh@·SSu÷p]ŸÀu7  !ÁH BBÿãìþªòÏ×ÿ?IþÈóê?T»Ûû»ú«ÿ_CþÿG侦~Áÿ}ØáÇóÿgdd´ÊÃSPPð¿ãÿväúò|‰ÿ“áùÿ×4€¼9Ʊ_dÇ~¼ÙQ=â÷q!T\ÔVZŽ³Ô„PÒ_LYøöM'j¹:ŽŸôo«.«zëØd×+œ¦)HÖxÒ$Ä£ûV¨BÌùBm‚ÁWùŒ—FœÂ÷ŸþtvÿËóËÓ¼1­òÄ/ÊR…À¨[Æ`>q_ãFjIƒÇJøRÒ&â8£?#%b‹)Éu `ð¥ª}~…3öS]Ù’<Ææ*Џ³(}d.NA%eŸ|MDÉbºH&ÄØÈe“ñ†énNÑÙ³GX¯^/SÇRÎáŸ!ˆ÷Ä‘‹þfã‡Ùoï/ޏ>;·B(RQµ´;™kŒÖ‹¾S¾“žÕî»÷8º›i`á’]ÜpÏ”/ªfeîµóí7r,«÷7‘EJä%‹Y§ö’rkvcº®jíë¤|†Ñ´úÕÁ»>/Ä©$"%íIÂ"'°ÛHû.w¬)ÙÉèÝûQדãý$J‚¨°ìŠŸ/ãp4nxCEÉBî5÷-¿¢§y IöÉ{ §Éd,7Ãíc´„äPÁÙÖS‡â×ÌÁ“a7â™B@¥-i®¯ÜOöYO©Èº½N‚XÀ©ÀY»p粎,.uG"—ïe| ”üNžêEÌ4§æ¹)ØBrÅÝ®4æ6ÁÃh®–E0W+u—$W‹_%%vdKD¹Mùµ&ˆÛLµáf窢a´ 7‚~7zÍU4ו§È¯)¶Škɱ_ë½ÄíZ3¬y²ãšª­™:|N´šb}ëo®.èÂ×§#Ê#µ ¯äAJKPÃ^+ë»pŠÜr#ÚZ Y+ÜŒ¾Û ìÔ7$«DoN?©T»m•8]ûa‹b+#bqÂ6¢ÉÒ¬³.‘DR?½ºèäúÃ-FüLUæ|G¿z6Ól~P¸Uù(Qr¾{陸"ŠBÈ¥»^Ë™[>•¤é¥.pUö9D  '‰wbˆÕßRô O8EH´ˆvåç$¶I[È.—´ëÄ7¢ø"AÇ"’Þj£öGÚ¬°O/åÇÄ\}¹;n“Ç›}?ö#Ù›MÊ©tÉ«^‘F7ƒyçžhúƒe•™-;³&¨Ísa 6bŠžÍ ™Ë÷ñî9M|):š*M)vö©O?[ßðÃ÷}¨+pÈcl6‰°,7ìÈýPÍäØ„â™‰‹~³ZÜüläþÿ±Ñ9û°U´ãÎ/CÜê ï•U݇±yÕ¥‘Æxõ~E€s¼B4\„-Ý<™w»ØŸè©Y°Ôª)ŽzåxÇ›U¬¶Àû±xw®7‘?:$ºý0g6¨r¨“ìñÉ6yLäׄ§¼ÿ±r‰éBU¤­qäTrŒ³5 øæ÷Òvq²—£0FØýÝÔþÅ…-;-Æç&–»««‹æ»rÞT5u(ÃÇ^üb•#ˆ>gX—¥p8švýÙDAƒ¥"Õrlõ†õ“ƒö¥0ÒHLT«¸„«ÜÓ¸Ò¼dB×¼»°øÅõô"þèwÀxŸŸãÀø´Ö•å9?8óÌÇqôÐ1ݲc:ªcªï¥#[ˆ/LïŒ+=›áKʉÄ]áÄr)OêO¶î¬^ÕÙÕOj,@=v¼&2„L×”³Ï^ŸGŸ¯]¼=iŒ6 UˆëUTÁ{Òyti2$Y§×fw£Ck_¦”Þó—ȉ™1ÍL}nÇ Ò³nò)#0]VѲ^Û¡¬€ɼÛÙ-úŸh~»‘N¯2˜ôäàcâ1ºÓYGaN夜¨²Ž¸ëàîAÉàîn‚‚k ‚Kð@°ànÿç9»{vßoß}ßï?Ïîõ]§Cæ¾»»ººª««º«ij¦êÝpKÏPó£#MÁƒþ–8ø+ší|j{8_xÙ¤ þ„=´>è\Ÿf.sÜlZp¤@P}ޏë"ªÄê¨o¥{ŒüÝ-L8ÜìúÛ ©Â§#ÁJÆÑ¤qkDyˆùub@õëñA¦˜iꪑ~ØõÇÇÎ>T pÇp30  17¨¤—Jgj ûlóútØÁÿ|õT÷­À îóR±÷ÆKÏxN¦Ó'Àv@ÄN>MsUÓÛØ_ÓŸ·dµq ]öáÌ ™øæ,Eƒ,Ë'ñmoM²Æõ°j ô°—æ“hAz=• mZä,Ën/kªa²ÎªØÆÎÝË5¤¾ÏkMöWËígΪÁ2NíáŒEª£S«ÔUÑÕÍå32²×¾GÍÉÉÒÀàà¿Z Ø·“æ¥u‘ñ³©–$'¬p)hœÏþbçû¸§2I¯yEµn“\b®T<ùbÙ¿óTvõÏ%KýôéRsœâ´†§ün‡ÖO[(dåv-~ÌšJí)מüªM´p‹¦‹SúÁßôRRÄi»Ô4ðé8Q‚¹¨ ÑüsX½¬6±õ‘áñD÷DíL¡¤6{!·„‡EÙÙª5,xNC8­–=ÌÀSH£sUÖÄlÕ¹O¸k²1¤}êíezY¬Spà·?G,yï[šzzô|êã8!~ß·ÒnF~Rö%²—j,‹ EÇ*‰ç{y"jžÖ&2žxðŠõ[µ7uY^³*YÞ¥‚q÷¹n o؈ÈìIÀé{çiá•’Êfum¨ÎZMbdq¦½§³` YßKέŽ2ŠØÉô:LeàL9ç®Õ°ÈzB¢§úŒŸ•¢¨ÁP¸c^ ¸fZIžjS5C`-‚Ûª€Ý´¥©ÆE…5SÁý×ô$dºÈïTB䞘Ð4m©®0Ýõ~Õ±!(´ ûU ! R[ï±÷›# ¿þR´í6^$^oë¥Ò&t¼IÏÛhl–?~ Z´Ý}¡¾uVvØ?¨k/´¥jÂ|Ôš•1YÍ/DñɪB£8¡]"NÒ.;GNöüP¢,þíd³Û)-³ËÛ &Üe¦ŒwMðu,ŸQ……†Y‚‚nÅ>}›¼ž /RðêάyË·¢„ÇvÔSòHûC#ºBßµÎyŸñÙ¤+Ò%ßH`(Ò¼Ó8;­^œ6Ó¥M›ª¼À dŠ5åCið[’‚äŠ.Q³‰‚TO‡Ò§$u öØ ƒû²«tÖú´¸–_>—ƒwŒoæ¾å5>®d&H^”|Ê&7[%5 1ellª‘%J†½Ö…ÓŸóx8ý€·']+÷dñÑ*DbϤ(®‹œù[Õ N4ú¿Ôôës˜æøA\GjPÀõ„?íkBZËZÜê̢Â?!ÏÐwæ±*Ýø^i¼¿‚[•r~>ÈR•õãõÕAQ¨nÔg´öƒGoWÛ-KŽZ|²Zó£KD® 烣º÷Ý5ÅVh\UäÇ‹î(ÐÙ“zXÝ ­%Kå:H‹ò™ZOùÑa"LX†—¼˜æ&câüF4oæ Ì þEœvîÅ€SWßÛížò½sï«ãmÅ_RK‹·ƒO¸;'3zÂý¨µªÞËܦÌw,Veÿز\”ŽšPž±¨l.&[¢ùð}ÒÚwM9>Ù`¢â»X厢¹9øqx¶ý½j=¶v8M`àò^á”Yœ*âµZëýÑ®Èù{ê*¶7_ûs/Ñûb¢~~W¿r” ³[!Æl†£6¿³#¨éõ/Òá¯ñ½’ðÌÕáOeÏÀÛKù»À`Ó»u€£ÇÎõ§ªÀnñ¼­ž­WJ‡»¡á8#Óúï&}:D?dÇ–@î½?mx7*ÅÅÒ½¬Ý¸ÏV½q»3’°Zì=F†âe„ïM–L‡SSßá•ô ñÌ—³]XK¼fÖ)~¦—/GÇ#üRH$™«é½©ßÛæïñJê/Go™Žs/Óñx‚9 .bzø6½•k(÷™æV…k Óëï“ ‚„‚L£JÚVQ‹^ñÜnÒ­"tÁC_R¬›Vß›JÕ‡¶¾Óf?~²$x7ÊÓvý«éE\e†ôáÝ^º½áT¬¥©Lc¸ë”ŒæKwEð‚ŸÖ½ÛE^äêFÑ‹C÷yâÀtëžEnÚr£†û/»ýï¬".Ó¡«¿nåƒL‰¿o/<>Ì{&>O¥Ç£ÈéH’cݪÏűd„ ðnÑViMcc,Ì—Õë°dWûzBëϨÙ3}wsz2Aͳ™d3<ð8ü¤w èÈ\4´7‚ÿ+³ywÆ‚âyiVÆÈ=oËoì¸hÊ|¢½ ß1ÉCÝpýî½®¯y›úùŸäþÔ®›i2d©âÙ+û=,¸?„NŽjÚCÕ›·©¿u@ß¹4„GæÏ~2•\h{)ö^¨]†‹§ç2-Ѐgb™«€@{5O ¨Ã-Àhc) »P:zˆeeû¯`棋 Ü”tØSä™ï­?+åÆpa)–ä"aˆ.b…ŨT„-ç =¼P–›z†p?ßBZOz$•\VœÛx:X\›p/K„R”WªèÀ§È É,‡ª'+¸\L£wE¥â´9â5#I #ëÔ-äÓT+FDúP“Xú GçÐŽôÏe=¶ã+®8Íš%¿hÀÖÃ~ƒÛ—m3Å4„È³Ú Î$•Zß²Þè¶m¾ºWé•ϧÿhÙKƒT Ý·ã8Îö¶2ûQˆÛHžŒ¥v"iÜŽR:]¿ì¦>]¯ôá ÞùBèùú»(ëØ_itR­#x³E#²8\²P˜@;öùº…ÚgnÙsÊg <âT«Ä§»Ûžš£øa/…¬ q¼:¤ ÈpÙ2›’†£~$ò­6«k@‘çh x@ÕÚ°“(æÔŽoüî‘¿°­b©AÐÁeÄ D«X6!õjÒ»WÉËírìcSÏÀI[È µjyë ˜P–'£Ÿk&‚.÷@ˆËÚH%²ÒC®¡yïmc„Ôû?½ÁWOÁÅY‘f£_n´#Ÿjt½Lú E§Óý¼&I@¡Kj­y!\#ßÞR8yŠs—R_>' _ìxÙïÓ Øl­p¾æ'mr8`Þx|¸øùµéÆqô´F8¦‚sÐy?õ Îh“ŸT'˜ŠY5äQ>"¤n}Krçe†ù¾]£ÂðC&´¿ir-Oà Ýéí°ÞS²OÛvuèpÇÚ_Yàm5Z«’«”L“(mÕíøg¥ä›bÙ%÷wn ?% ÛøàÏ®¥3ÇÞÚdf”ßÝߣ¸ 8_:OTPáƒZkœ,˜£'×òßò´Î`´®n:¡%©&ߟsK;wRÆDÑ)õXÕ_™„c*ãW˜ðØb¸ŠðA´"QEŸ=¯´îá‘ÏðɤdÀw_¤Æ(c"MYòÕ½¡8®n³yù*Ÿ­IíUC‡3Ìtßå>JÔðõÉâ3êɳª1¶ö€iU qè%*˜‰7¼"ø#³T ‹è>üï*AP׬Zo^rbÅä[ t•È ^Ó¦ÍçïËubΟ‰2‡6°¹CÀ/ï@„nSå¦`©÷Î;€Ã‚‚ò/LP¾~Ðl´éçÜ·<#K(Ðè3g: †¹ðl_WÞ[¦I¨Ò™s53ÈIÒS‰ØpP42.ßn%8Ó–²†™Ž‡ú—Š[¥³T^ê™z3Ò1ænOÓZ•Ò{Åá 1¥Bæ’ʽ¦PüºîWBÒcE¿K/ùGŒ¥òߺ÷šž‚X’Ë ÚŸ–õ ~*¬‘¿$gççÈKYñ¼Qeó}¡t'j¶6|]‚šI5‘ÕW×8ðƒG³Ö?R.+(kÂŒ±­^ÎØÏ­¹ÞŸ„°ŠÎÂÕ´© @ݾ·Rø[yaå{³H@ƒâ—4””]ÉJ«X°g /ã É×€#q^ oQcì•uV¨cÖmM?}gºìüvU•®ª­ñ¸öŽíÞ¨*]fl±â¸¨hyJ‚ â@}–°@8VÁRÞ3’Η'a Žl³K±¶éW?Üšî½N×&uâèHrŽOÈ 6#¦÷ª¨ÛEF:tÅ^±‹%Ì—Ÿóà5;øzžŠ•\ÄíÏ_¤ÉÞ1ï=ŒÍqw©Çy˜šˆ°Î­ÏÝ^‹²pò]ã<Û9Ëh‹{\sàõÕžbv~»áý`Ib@Çâ&KÎæ^ Óà`‘Á'ø•iZS… &­aÎÏT‡Mš|dTVúex{_,¾aôCÌYq ´]=wû¦¸ Tv*výÕ|í$`îýÕ}þœá¸áŸÄ¬ÛEŠrX²ãË¡*Ú’ TBò|œý`ζ*@6ÇV™Â`ôé»ÿ¹È¨lª"Â’Ù¶›°xåœ4}s[ÞA¤X2Q  8žŠuM/Ž˜Xœ©Dù}·‘Q²¢²û.lá`Ä…oZ|ÕÀCó°yåöÝÁ½8Óìü=:ÅqÐÜYM&ôƒBΘH™Ç¡zJþe†€€3ˆ ö«ó–w8 Tÿ£ ^¢f¢NJ¸¼ã,H ¬É÷Ÿ‰)‹iž*²¢¢7¤ž€€ª<ÑcÂPÓó^h1爓¢¤qðº,Uõ£ÒѾї¤…1ŽÞ\æ`yfã_HX¤‡Ì¦RøÇoóÁ‘‹`€AÆ8@Ñôsþ[±ÑçPÔòkP{éŠÈõ|õ1pUÜÄ-+¿Æ×Y{”䳦õîµh·‘ÒShqºt <5&ë”­Ìü5p”3…|¶ûE= σÏ"]šмižÎ £ÌÇðL:aZ¼f¾g>ò %ÏÓÎ 1µ–N—Vª¾µÈL:“_Rà‰Ê³°ñ’JIj™½ÚÙ·#Pr½ ó9ü¡óž$<0—JuSÇýUÏ3z‡õçô˰3€å¥y$9ó× é%fâò´—Pñ¬º.1M# ª™Ø–ÚgrÑÂ~_T¸³QbCÜ(³Ã JPK¨…¸¯PUæpFç†ËðÜóø¢dñ?•w•äµIùΆØ$/¦Ês/Vx¥Bb1þó)hÍäqm>äVÁ nyÐCéLÇ> ɧ…¾à±³ê‹ôP'å¿Á挤À† v}ÄAÂÚŠA1ÖV‹fz{ZÞ¨E0ƒÀ±#2¿”ó 6!êa$/W«N¨xôMçI.sZÖº‡ À9]øå»4Jñ î·|¶Èâ1qhÚ&€ówñ$ÌÇöB=Íä©óKUŠ£÷1+W-”_zÃLXhèÎ¥‘ãg¬AEgŠ®û†;¹(õÑÜc/4&h„3Ô3|=ñÈ& $@æÒcçú—yꈡ`}'!_â’‹x}¿bÎ(ëÇ«?ÆG‡ Ä~€×6T?ø.§Æ®~.êÍ,_½üy³cìkÄ`]‚+yÎ,0 MazÞðæ ´³÷íKN X”ÚúñŠ”Þz×»œ¯±Ÿ'W2aL#$Þ¡f ox@3$Ã=šŠ²€ˆ£ J¥p4&Ão±ŸyŠ9cŠ› ޼2í°ä&Qðé=ðf3$ž£8Y’Ð| ë&fU m›;ˆ5uÄz:4ÿxÿûÛ=Ó—q#JŽ£ë!29˜Ï†Ú¬OÀÖ²«ñt;•{j¡CÃüÐI‘¨ÞQ ·Ð©²3á÷À¡<ÒÈÐÉŠjßAç:c1U»ïØ;ìÅÅ^³wÃ_=ÆA’KÎAåT÷@\Hh@qÐ |6ñ} îéŒh.ºçÇaXô ˆ.U”›šˆ­ByÇÛ£&EzŽ|ÚrhªY‚úßdQ%ZLõûµ æ‹Ü·Nb/zòÂj„Bèb9MU?“z§Ä|PÂF÷ 'š«RÕSã+"]kçMÁÈ6ÕùtˆRÎ’HG*fWv¤Ñ׌5Å›†%]‡:mÄ"f†wÀ'Ùg2Çê–âÖ"«ÅS0ò{FG`úy‰•ø“[ý ã©‘”ø˜ôU,MÖYsE–꿞20®K&ÿ½/Ÿ¡êHP  8Eÿ¨•}\$KlhœáS¨¥± (—:}ßžäWM$Ùfõªðk+d&;BÕ}ÓStŸ¹Z)ЧOÅ)µ¨"g¿a,Ý2¡»j*Lj¡³RÊa¬pcìá®6=ÌÛœ) ?Ó„cjšB7'ªº l&±R"7NŒHBÉ.(}/k›~⓺ø_¾ûVpgc zyïkïÿ”8×O5nõC­<‘I\;ù‚¦¦Œ|ÜG¹d Á‡­1ô ª"'aJwQ~šºh¹,X×4V¾‘,›Ò.df­é§3¦ÁÆ¢L£VPaÈ™ù¦I—rcÝNÑ2,aÌ !ÛØU1œrçV„žæOºr¨£jb²6¤Ø³ˆS\1’ œB Õø)ÙéÛCÍ©“P«Ú—ôê:h§ynO·\î·ûÊëè@Ú²]ÜͲX†åkžÀgdf…oÞ¯r„.íBNw.?‰ïŠí5ðÜ:2øåè‘ã¹Cç~v:Ÿ!"±.­öôŸ€OÛIUu\<Ÿ{x¼NÓE›|OåÓïR?.Åóê©l< ا+}ýj¿¤ D©ñ°P«ˆu§öY;**Q7¹ñ˜»LL€µMÎ8¿zGv@ 9Æ]HéVZ?HBñô`%UaЫít÷¬ÉßJô™€šf =vQwãü“Å3e¼¼ Öü*Nk5h½­¿îž2X‚Žö$ëèÞê™Gbþ—Roç®cÍ!]j­q)èW~"Ƨõ°ƒh¦øòéÝ—8k:&3Œã’˜ÌI…Ó©Sns/D«ÜÙКÇW™ø¬õþÓ èý×Ç™YJšÌ`Që–'v{ZKÉk£e"LË`Õp¡1ÚÙ/ žyüxEe¸[$m;sp×§§ •ÆÀúkÌ+(³D°| á§*ÌŒ>ÒTÑGnáîÝGé Xê…l,°ÁUÜZeÒ2ËÜà·í¬öYB@»ÊجGïr´B`Ÿ÷ .VJô^3NŠ,,þÁk§ub6ž„&tÒ…9c«|v-VŽðÞr0› ©%‹;œ©£q{ž%šŽó©dŸã æo©"å¾µ+­Pƒòë's~ëm#@ñ†Dk†ôXQ`âìçïë+%ü¶W a 5¼6Þ‹•V€-çe5¯¹·À† ¡ùIG¨4 y$›EyPj®gňÜJ«fw§žOFÏ)°¤±ë=:7f µˆdPEÉx³éšç}I•´Ï­“c¼UàŸ»€ ]JA ¹¬ Qj˜ÙùcN,1…–¯$ÚÁ…UŒ_â¥_½ç²V¬´ID ‘ ‚ÆMÜk³Ÿb\Ê:1£kô†Ðó^]|ƒdÌgòÊø"U±¿åAŸê¥b:3+ñD”ÑK^q9@+Á…hA¯œˆúlï+ª8>~¨/œà†¾¹bNç‡Á1–np½ tËA'¯ D˜¶ZöÌÙ_R¾–›z`©Ö£÷\®ð]£ùÄq‡æ[ÁrV&º‹Sö.ÔV1aÄPy f\Rà·ˆ·Û‡³wµŠcÄŸ¯‹׺5˜1Á¹U³7RÝ•%€IˆŸ‹ÊÝ`…"ß Ïô˜ª¸ð¦PàŒÛ SðBÜ/Š×H1ôë(”¶ùeÜ„ò*'³’; ZξÎ4mOGÏË4.ýN+vG0 ó£ÀƘ¿Fš¶ëbßêÏ›Š&TL¨2ÙÞ&ŦdvÔ(£¿Ž'M¿.¨n[I@Â^?ss¬f®•ìʘdù"dÑZE TÕKDåa×<ÕZÑ1.‘›ªA- @ÓW\Áxíçz6„¯~(èâ^Ö¾àìœ'DËYà¨nv=BÐHEÈ(¾Ð–UBèlid|Þ·²iìwNz.„éõÕd.µF­VKjD ½j5œˆ8ÏÝ3ûž›Š¾OKÄÝrȯ¤ƒÂÚ<¶r±³WM ÑWñ´}¢[VÿnëæÔ}ìEÂMšNžiI«:ãÆÉ5ÓªíŸÍR@ÉÈabj,z5ùZˆ§‰¤ú—hJf,¡“1~KC~î2vð%itÖzq•¯q–v:·@*ÐO½Â2ºÃ7u° ´i!¿^¿ô~,‡ô·»Ø£B×µKüÐWܳôá2ƒ.n¡¦ø€ôÕ|üŽÎκ Æ—Û¹–FWRœž¹îORÉ ÂœÏ­…”µ˜óΉž”•…‘Âd;D¦ù@Á/Áhé||ºK»Cä¾X &îär¬Q!S×ÚÞÚ‚ž“6ãÚ" HþäS”úÔOAd…÷Ò}öfÃÓ¤¾7?0a…>ýèE,Ü*usŽ3åB’5>"(EÛW_ ±É2Ã9Âäk®~ç …h-Çj “¿™–É"¿VK¦S×D]Öm‰Sx2[|ÅC¹0ÂJGìV4}P€Æ²g_è¦QBu-Œž6IÆ1¼6+!±w»|FœNÄK¡)²CÛ£*¬ça®xñ«ù­Æt\°_Ö‚œk’ߌGÚ1•í°èCÔ ü&j{ù+i»²”Ðu‡hæ ¾­ÁÄ¿7”œÊpy%òFîÇm:ò}Åǵî³ „ PR×^”ñdðÇEkod y§¨Uj¾/Wû6Fƒa²oî¹m"ë³tž±Á7„ü±âÞecGúA"é°ИɽãÝIèAeÙ^ª ÛU‚„xŸCidz{‰òIŸ½9}C@‘Þ…]þ¡ÎPg¡aÔ#–P].Þ™JhóÌ0€ÔòZÉ žè®èøv¹C»gaâêvÀº×J*Ê=è®1`uÞ³¶¤ìxV¨§iþ«¸Ìå |QÒ»/HV±`aÉþF öc ½6êMÏ'ã3ܸÆ<.—[ƒÜG®iŽ'ãŠíÛvæø¡Ç8#Ð…Ì’~ä ZÞÌV¨Y\Èþâí<Ñåø%ÿ¥t SyÆœ)ŽÊg c“U,£b|EÐ{0e哜’Õ²19ÕaµîDþÒËY…!Z%±ã×´õçißP™Hïž–\ô9êÌÈË9ï<åÚMÚC{âB¨ULj«^=Ìâ>áµMüA ëêïÒh‘f-” Þ»á9´¿:rþÄÁ#í,àâ4+cÞp±ýi_æþ0`·™þ4[¤íñ±Ö8[¿âzÅuM µúÖâÍ0ÌIûK-1’r!‘àNÍ)w¥¡¹H ‚^ÇÑ•!PË;+Ф‚°çbIµ)€ù˜³© €FY|ee¦…2WÀ+DÄÎ 0LÝxm™1½Aª·£|•† ÃíòAR¹YìîuoJË@°¤¦AÄ-âmý"ý¢ó¹öˆbÙäI÷rS£D ¹W®ëâG ¢bíè»ShÊEºø •š‘üË Öį=7áJôÌP:›Ã·åþíÍÂË ¼¨#t,PÞÞÂ|õ“pÄû­“QlìRƒÂgœŒHÆ^õœ~:m¤’²œl½®ÁÑ<¬¡—Žþ¤Çï¯J²MÙ=©‡_‰ã†frXpžé „ÉÔt¦*dÇá'HóBj¶QB%ãÐZâ¾`.5­®/ö’ÒÁ"3ò!š#DÖ¦^;o% û [ÊKB½p‚!ÛÃ=î!¦¢AXŸä3z›¼iã>C¿ÑPÙú—E«„úˆäÔK4r¾&¶•hRªæ”ÙÌt2×ø(GYñ›¨ ²B®ùýƒ%ßYD®†L3KdÕO<]S§¢ac3/‹|ý–´‰ËÏ)c·O´êe^ÅI¢óÍbÕ¶ÐåþYsãÜ$ƒÿ+sK˜—湊 .Ž¡lcá !Œe`y©$/”`oQ숫zý¡«´c–9NX`òñýcàÆ©ß  ga¬°@´Ê‡ÞÊaÁxks嬾§óA{ß-Î?f~‹‹ÜºœÜ‹Ð>{éRª8 •µ#¹Ûêo>ò¤æ‚açr«OH]ôe=X·w©é7DÞ>ŘÍÎ!D‡ ¡±§ÙÓ%IÖü¢,-=æ/à~:ÙKµ¡z‡w;e°Ú6dIN¬œüÅœ\É÷ÚlÛU?™°A9c‚Ð\1Žñ€êG…aG* 2Eß{ÿ´èM?dÀ¬•€¥úâÉŠÔ5³Ø‡_ªÛâ¯ÀfÓH}oê¨Ü’L\_²]@šd‹4lt¯gþ¨©ÛRvô?e;ÿIkß{¾ÒNF†Ùbåç» Ü&õ²›·8ˆp%úùcê ×P:tò‰W[7"„rÛŽ À^SHW†ÉúXwº އÇKwûñU܆‹âÃd¾“ÔÔ½{á|þÝ•Š>Ù1Ké‡tôëüòÞÔ‰mÕÀÀ%ôÕ*hf'€¨9ÚÝõ³ô7òš8™µ/œZx™òL•ÅÔr¦µ?Ýat,f£Ä­ àöLXŒCÜú|ÅàOgWÁô«I÷úé'%¦)j Ñù">ýó"Îô€E·`µ»P¶Ž&^0VZ¾í'Ç/àG/Fy2‹Ðç9,ÞI²%ñ†ë§õ†~;œÔ¹Œä´ƒâòF©8¸8 Ýë9FÍ_mH÷¤j„”sõ—|Þ=Ì —:ðDv_dÇ.1œóÄÀF¢5aÁ%è¾x#W®Q8ÄÙ‹)B å@·äq\;ÈS€ÁS>ñiÅVÕkyVWª=Ëí·Ìäî9ÝÛ¿J}/ŸÓ¥ù óUG’·Sæ  BF!“ø|ý=lŠMâjÿ|+ØM hÂÂ\*çKgõVQnLasé+6a›ÛÊS¢&Y{Èçbh[©Š\Ÿ Ø?.?9]Qst1­ö¤à¥•šBÖ&Ûq‡FÑ ÙÂèEŠ®Êº#‹ÅR§/èÙÏŸÌS)”ËV2: ÷Rg@]èèäâqüžÄ2y&`7o$l›—4PAǰŠR°ëì%_Óû| Wvì—Ë**,΄ÜXüæ‡_c#ó‹âV„ êÌ¥…í7AÑë‡q¾ç2Ÿt”˜'Ò¥Vm«ècƒ[)¾¬š€è`¥fVìgÅ¿X©fÚo˜ ªŽ€ n2 Ñ7TQ oRY¿½9Ït<ã_O/Î 4ø%nxëå.­æ†#Xx.Âp2)ÜldèÇH²?m*õS6n¦ÈË£öêôfžÚ#Çc¨_ìWÃàíð¯cEµËô’uŒ[ÉOÏíï`;ÔF­†øyj,B¥³5ªC³Z´Ä; ·bn܉m»™7lq·ØÍe¯š|¼¶m6‚CÓƒ¸”ðËL(óeq73†7VÆ dJxnŽZ+:çT5‰ë‹óhZ¿tN ìÈßÙ¹(Š£«QtþøôúZË“äyºR©L…§Qï}ü>óTƒ6X=`'ºùùh kHÙµôÕµ‡;ˆÓñÌA|¯½š½Ê½$?šV›b›è´\XøÏ7À¶ ˜ˆs©9ÿôsïüÜ­t¬³p‡sá=˜¦¿:'Û|Az‰ŽJb`»(o Äœ2§ VlIrš• ›¹²x³{á¸Êþ2lõ÷ùòcMÎc»ª‹˜$f/Z¦Ò%Êg6¶ä砪껫üŒP~îüFŸš·ç¤Îü|chcµ˜„Š9Pk’ènP DlR÷dV Jˆ|,ò˜ÄÛ1ŒóIŽ‚ôË|ié_dÁZsžËWÕ0…–è³Xy÷t:µbPmó¯”g(GïLÞ[®n#-r†Y‡w»¹ÚâÀZÚOá_äâ Í¡ ®—´úe2€R€l­®¤…?.Ÿvøé«OI¿ ÓKÐWTÉ@Â]¼î‰ÃØ+€§û]:¹èƑ٪…ñ(ev^Uv`lfþz ðH¿l ð »¡RÜ?òUÂIQV1ˆ…YΛpj`ƒ@îÏ7I¼žÏ}ï™™ ´A GÕQM”k{¡ú:žm´·½ x)9¨£±Šbb)èžo¨†ý™´Ô‡Î§zñ¤HwâI™™ïÅòñƒµÔÍ–ž©6]¥¿Ç«ð'èÊ…:ÛÍ Ì0Ö;ájf›æîtÓbI¥t/èãHQLÃó‹q&!G¥ Eç˜-d^pòäÈ}ˆe…®•X¿ËÏfÃ6ÔJµ«Š_9/¶•f+?ªÐ¬{ ± ÈU¥töÔŽ™b©CÇ/x,$eáà Õí)$eèý`‘¢h†dú–ô P‡ ®Î<áRjÝà”À Ü{‚¤§”p“¾¸qá^¥Š¨\cmVÌLS'È*å¦2 ÷‘cQp.5€÷ñ櫱Ôg,ò>%n“šázHéAïܹÌëK¬ÈŸ(Ï;"Ié…tÁ÷w¥Iãæ'Š)|½œª‰º‚Ò÷…ž’”áÌÑáÒÈ{;1%çû£‘ŸK=e¸;º{éå€$ƒmRÐ n˜4Ìê¦H!Jeݲ xww¶Ô^(å!Ñb~F±&¢g??~¿ãbI×ÓøœßWâ^ð !£Jßy§I(í,Âs4Îné½Ê²ô6,¿ ÂSËñ|~¾|‰ª½Ð‘/eÉú MS ( |5–“m§.ðº;ÜŽ÷žp™Nœ)z¿­Z$°‹Í\µ²ZÏø.¤üá8jó; ?†#‘lO¿ÙºÉøáJûÂ…¶@)›/4|âå÷£ç²äx‰GÒ©¦ ­JH1Êb&TˆG'«äÌÃsdÓ±¸q) ÷å/¢o®ZF=õŽ_H¼^Èi¾^¡ÿ¾_=k7rl@ö€"T1îoB#Ž¢D€˜<íæpžWñk3ìæ>ýŒÍñþ-N–§ "ê®áƒM-nÜ¥ýê³s xvZ ¬Qû¾ ŸŽo)eÉ"»VS¥ÄˆòS´ú6À;Ïô8Q™¡ÃW‰œ7m‹ÿÕÇœÜðÄk–)‡¹.á[€s~{j:¼Êf­õpNk6rqç`×›÷g¬ß«H òßC"ŸJzãÌãeßHœÎ{¢À&ËÏ#Wo÷ ý/WzÎ?ÄÈ…" ø¶òˆ÷Vš ¯'ýÕM¦)‰@í)»f-ˆÄQn„V5:ÞO}§&a~Ö4aJÍ }£û=¼I˜ñìWA³,ø 22LWÔ [5äI_¥Y6n”H%€]Ϩð³-”´§[Ê\õ3*ëHfþ&g*¹^ì.ž ¦Ö'¬Jõï2ç±K´ªërïbƒ"Ü®$ô°ä|§`º+ôÀJ›Pqê%á^ñ§l*™¶‘ˆ°Ç–¹S6ßÃú¥q{+r~P-šã§’Þ'ž+g·ˆBñ#ÒÞº!5£Ì%Íôœ–â@Õø=gsÓ²Q@µ1U‘âÔ¡¥YzÞaÇÕGŸ°–M°gƒ¯é‹bGÆwß1åÁ{3W¶‡š\M° ´ôe $OJY g@Y©8Éq_Åä[²7Åá‹Ò×DñöMa@¹‡JQ³Ý½Ã舩ߨ¼kž,ä2;Fú${´õ1Riï)EAüÌ_gä99"w!?míg¾œ,vç’¤ ?(0 éEÛð-)Ç7°¯ ?+…@tõRsíûréÏ1Hƒb“xŠ4¼…ǰCôƒª7ÁɤÄZÌ#Ãã¼bã]ËÕ¿ß%o¥Ma¾Ë?ßЦcùâÃlÉüåIuµ†£äÏ‚˜h9\°zóG¾b T,£ÀkTÇ|áž?Ñhãíë­²".*g¤›íl{Ö¡+Ô|˜;6j²—f{…ŒB1°¦çü‘yOƒ2Ÿ¹®f·M ‰²+,ü¾Bø››EÝOX“«k/¿ *štM ЬîVòê…± B׬éy9İî'¶UA¡'û¢oˆk?¨%dW›& ƒÙ-òv˜JÖŽßaÌzàa0<É´›xBW[™e¸}Ø×Ì\&y¤Àè²ÜÄÍ‹ÂW?è­|慪͗«2 ‹ mä²fkÈï]Œâ'÷13š¨) ª6…¤Ë` šH\³«5œ·;O™UÍuÁË^Ä­ÆÒq¨ñŒ$9âzÙOT% 0;–S”Lo­n¶êûiÛ–ô7ŒŽdǯwî=_U^f+¬€3gòœ Ói/ÏÙRœ¡ü-§·óÓ­"ÞÞãáã ™«³xhŠkÊU9ñLëÓÇŽ)æ…[·%Uâ 4×tîoLÑ”oé–üM©¾åB‰“ÕôNM>ú~ºu¾ER¤VrÕzbX["ß tû-•-~c©íú6roàxGeˆ` ýkLÃù–æ0{lÑ?>ž.êuó¬Ý¿\éò¡‹‚ú4,:òQ\=àɺ¿wo2õ=ºi\¦ ¿цîÍ©¤&óiæ#û$/Ní2'x¡fïž›ÕÒ3ÙC[ÎÙ’wÉ@Ý= ñKúw€AV°ƒgLè¸þ[=†ß¿ð;;Z‡SúÍÒº^UòÁ°ni|Š·?°…û5kIÍ(vXPübxèí. \MÅ´_À4||dqœ0@§¸¹ôäå­wå÷óÜr˜ìJ§™]%—rœ|=ˆ÷»´”½»öTqýþ>ZÊcÁz½ú–³Y7ý[N¨¬è€o>;š*Ξ¼ôFä¶X 5ðÆ—ÿñ¶J¦ÓO:XWÏ>2Nµ~”)0]­P 2¯MPÑÛÜ•ŸÇÁŒû$;BÑ,ÀÄS­—’¯hö9?5qü­‰€¢(m 9ýúŒxEew©*Ü”ù¸ÓÖ¼ŽÉúq3£è«ò'”Øæ» mhVpÒNãôç+æ¹¶¹*\®râ _ÏÝ"ÒtÎ0©šéÏ>@T‹ÈÙ µÏPß35ìòBbX{ÂÏRâ^¨h ® 6fAÀ¼âW¥$©[֖ú·ð'¸‹”öêœeã ¦´‡'4?˜|©K[-s²È)uuâűÅâKcìld p‹­9A \ÔÉlQ0ఘ݋[®ÁóÖlw=4ÐêÏß· Œ‚ïîR¼¸“¢ ¯ŽÏÈͼID8 Ãßç½O7öê´X©¿QÁ‚=ZL7ӼÈ2]S‡ xÙDÿ(R}é<õªQ±¦¦ãÄ)Ö#SŽ]½ã†EJWJâ#²®-ž‡“ŸÚõ!O§ÿY—µ='23±¬ i׉¾ðÇAd[+Ê#.?¶çÆ$>5ú#UqY»˜9Vœé”éM¾£#OrÑLä5ð ò‰ Þ´/ÞTT¶¬Mâ®Y@=S¶æòù`3JÛ%Çtêj^‡–É*¶z/?×.¹ô„“àgÐ~)Ù '@‡±O¢æþÅ÷gÃb° Cøñ°ÅñÁϱµô€“ÍúbYmÊmñ€–âBëˆFÄ[ùdÁ6ÞyO— 1ÔoÝw)…qò¥=Ÿ¡x¿ýË4<}O"¿JçлI ¸­4‰ XNQpÞ§\ÕÖžˆt˜GÔÿñ‹ÄoÓŸè@äá>þZõ—Óž•°'V ÝpßS(F)°}¶õ)è9¿õÇüþU•Ž«½–¥ª}~Ç­i êÓꣷt¹ò{/B¾ø{!•º¢9|"`£ðÏEÿ©š•×/æÎ¼AuZ»›'P7õØMVðÐ$ðô6:QVw¥h']©yÕ¡:£i³”•oÏèãèôïU)b ³Ýì4År`YéæK4eo~XØhÜÕ7¨ÂKÍñ±äEÖÄ䋿@Aœ™¦ûï>\ªÏàß}Ô/BÿqvµdnV—Í+D”gd…ìÒ[œ~£6l :/±¦›ø ½C¼I_á+¢ÏÉ«ˆ%-I¹ÇÓÍü̸óõ£5qK¥‹lÂ>ûŽØÝ^±°ñ/Vº*ó‹„„tÊ›Ñ.m v ,Εß=GÃ}Àoµ %ï-%:¹*‹é”Õ¸Ð$4ªŸZƒõäÁƒaäÊjî\ßÔ֭åIØ­LÓÅ GÓãñ«{Ȱ1Adí pùY]9–ÍìêÝê1…‰Ñœúc±×ùWqéfî6—ôôþïâJ&'dâ²ðmŒ¦+9·e²Ï2ò•ö„¥âü=˜³íø2RJ“}˜-ºKZ?¨L4'á$â%¾¶c‚šÒr€<4_H*M¤Œ»¡Ñiùaø‚ª&@9%f›A³Yý>ùöj€V.8“Âǽ]Þ%2_„s¸l7@å6ñîh[Ãò¼IÐ^+ƒ‹Âé)‹™åx Ð±·%ïÝGåI¥ÃLEN¾O^ïq-­÷•×=ÅG|¢:ñVÆ!‡®ó»ÂWË¢ìùäW%}Ê.Ї»ª¼EÚ(¯ÃòS­ 鎘¿Àê]²óÒso˜ YD©®Dg¬ýä¥k0*^9‹TR¢¼“´Rteíx!üäéª-”©êóðÞ熘߱±©ªûÌhO0œ¿/x”»Äk_“/`ýŠŒ ÁƒóØÓ9>?wj:bíQîÃDˆØÏ›bi(·:ÙkŒ°Ã>ÇÛ§Çé•̸h¯7ü'‚Wu¿˜ˆªƒëª(¸í}ßÜqóŒ\9-Z‹¾½Xé÷]ÑXH«m:º1A{½hꡳND ;…|ó/6É)ÃRôm‰§ÕÚDZ©„>Qè2ÉfOo~ÿ3N¥YÑYL:·äso4­j¦=‘ñ蕽3vüêBå³å·8”I_ܲW"sÍz’|Ò1óÍ«}„,PNnã¥Óõ.<¥`4)ßuε Z4Ø}Ü>Y=4ÆN_­1VßÕ¼ÛØ„)£€j^ C5÷VBÔ¤2ÓìÇ(qLDP¡|Ãc eâjUÌsAé.:ÈTwxdQžOgYöÒ Þ Ë~]He ®†›‚ٻġSCømÚ§9L BÙTRÞ€{CÕúΜTO@z†I)P·0òY¹±dA¶2<§-7æÖ"«ÊWñ_¿ LA“‡8å »e†Gµ,-½ ¨’úºœ}Ø–¸™šÉ†jõfÑjd1iùQ+aÌ„ïNm†=¡‚ÌÇÐÓ£ãœ|ëh˜ÛtHoÿô/Yía9¬ |Ș†(áæ!õ‡æ9 ;¿ÈêªW€.tff[ì 3, £­³µ¡Yƒø1ˆ*àK" Ðæþæ1óœ_Ý›¦hÜ÷¬ÛIA®O²¾uubñ£ãèš±(óHçšë\tX_½ÑËCûBZã6ÑÁ¶?9fÁ~Aç¿ËN”ùîxý ´ ØZVÅ2÷b`Á€Ã(wdŠú½:Í\Ï «’uV•eŽ Ãk.q›X¿)×®ëák…VUŸ›¤2”Ð×ó*Wi‡Ú^½Jö{Nü‚5Ç #Ë«ð¾ŠYR…ž$|Ýó2tPu,ÒDäz•-óÁòrâò›¨r$@`®$UûGb÷­î9ùl*dúQŒK5ùÌdsͲðíœð‘z •f]ä„ÕQID×R=[Ë„˜†óun iÍ#íör€(goCè4G}Çâà×EO‘úSí÷;²øŠ{ç6¶Ñ}Ä¢®¥uŸYyUOôæ©P@÷Û¹¡å4 hƒ éQªgŠüd¥ ÈíjQOü$ð·7èXÜ $ >`–N±Qzˆ!PHjPÆI«Ùkõвû!û;:A‚©[iñCuxrUx ¼ì‘ ÊÈ€Rà@@¨(ÛéFQ£  0xFj&TÓ7qõ¾²èÅ™5cf㯮5héMUÚåø(VöÜ úÄLÉ#U—z’H¦¤²ëfz]z 6XQ³ƒ—óåÀË“A+Š9÷¾G3ÌuˆÙ(02'ïß,~[´é«ÝÎ×ûÊ—n ¡¦bÑJdgIÎ3$Ü®­Þ-l“n›]Ífãmp<-t¨ühF(÷6Ž.±Î®WOÉf‰VêÕ$eñ `3Á¤Ä©õ—úD]âÕï;üz&&ðQÌòÑ™ßêfYâÑ®‹rXžªÙüzç H|êâðä—6¤¶>MQoÀÂüÍãOu"ÎZXxbqÜP({ý>üX,‰ $–ã–q'ú—0̪Ø/ÿ}Ø šcÀz WZ )JÕ¿‡úz–I&2>û+ý!RÉ?£Óþ#ÒßÇÿáþoÿþgnÞ?ârqÿ3þç_‘þ½üÍìL\]•Ì=Õ¬íÝíB†Iþñ5RÖ®f.ænæÁ ¬Ì]¬ÝŒŒ,]Lœ¬þ+aAÿ«ßÿÌÍÏÏËÅóÿ‰—“ûŸßÿø—$Ns^^n.„_€ÃŒÓ„CÀÔ‚×ÔÔŒŸƒ‡“Û\ð¿›¾¦lú¯ÿÿû° ÿ;ýçäçþ7úÿðý¯¼\ÿÔÿ¿&ý¯âò°CxþŸgŸ±'¹Xxxùh¸8XøyxþM Pn¾ÿØRâògˆM.ß±9y8þÎñBú­ÿÿ…°ÿ¹þsqñqrýýçáþ§þÿé?ÆDØG@@ýÿq‘<ˆþ`ý3þ#???™SOOOII‰°°°‘‘‘¸¸øÒÒÒ± ©©©~‡€ e“öBø 9ê:ßÐз¿ärþéþÕ}Ô„=ý¢‚ SRrƒjøBÛ {e£Ý\ó·m%ÛÙ¼äWsŸÓ½¹=¾ð:6Ç2ƒ?/8á^`Ìñda¼cJ `ñ0„•AW'§¼ÚŒ£Àû÷]¼¨)X …ĪY«lB½àÙ@e=‰ÈXÞ]2óÊó𖯵Œä·yÛ×Qõl°oê]¿é?í¬üb¨(.™¶ì,Œ¨öÍ”´ Ö™Ç÷Ö¬™Ég°×KLU:ÛÉÓÃáDùJ–Ö°Ïð[Œ!µ@T ÷Òƒêál—âG9„f ž'…ßí=.×™0Û "IPƒÛÀZ§³wcáï,bS†'—ßTRÊ–úA¼¶M¹ $Ë«¾*ÏÐ`ï>~¼5O‚y>ÏdJB6$ 3Õ9[^^&ÛJøÁk0Ÿ«ý¦-SW4‰ùôc öÕà6áuÖ£'ý¸]˜·ïyG«83éÊÇÈ呞í6lf0ÊÊæAªžú9õ¨¨åk8ŒéæKF5$«Ÿ/[질K»£8ìz^7]£µq½â‡ÙFnkg\•ŒÌ¦kã„SÙ…‡¥¯GÀéåàeóãŒï¯-o#²^§¼VJ<žùtOÎÈ]Þ4Á>7Y8:QærÒ.óSpÖx•u.‘›¯åÙk¼þ‚µª¥§Fîí’]×#jLOüȃöÐFwPmO‡vz¸wÉ‚']Rö£¶L|y')~ ;FºB® !¥*ÌÂÙVCV ‚=A vÓ‰"¤ŠMqRºè¤!ÓÞ1¡°ÅÁd+bW"X–´ÝŸœðË[Nûˆ¶Yò4Éã×·öùE”F•Ò.X—ñeHÄpӵ˥O$[8cÙÞ‡òB¢vêU´ŸG•cM=L%¡uU´K^²Å‰=Ê¡IýÚ£‹Zy2~2“b BY¢ fàЈÁ±S0ëТ8ÖJ§ A.  ÙÜ…´Å«4¹–õ*Í>³¸O!xKX£%ÿìœ ³² ëÚ?mY¢5°×Ø0&ä]+fg+•oR¡Ï<*üýiÇøÞF}'‰ÑÓÈLᄽTÌg$C;5%Ísž¸©ý6~‘jÝ,s‰õ’UªØËúêóSì?pÒÚ4Á1n‰kÝÚÌ¥N¯]&ò¼•ôåU8OÂ2|¾ß j˜„\Œ§¯’Få™ñÙZ‹MÝÆÉÁIM5 €T2ßGIL´ÐJÂRúån}¶LèƒÍ¥`Ô¸Qõ-2HaÓÌÅ!úä‘¿$•@^‡Ô8É3 æD‹F‰YqªïlغfQ Nª1$’èU/9’,Ç]ËŒ=¢(¾‰sa³?V("ëªèðÆ4¦ÃÏœ0{ÖC›*ÇlU"%”:mf·†ðpÝG]ü| ÎÄ˰Ð΄´µ4ÇÞä´cÎh‰K—g’'vë©Ð¬ñ³á¤×Ó»k„Qk=µ]oäpˆQŸléÊ{k=ƒsÍqàþ¬7i³Šï›Òd¦ÛIuïë&¢õ­åʸ2­*Fþ!= }§n#E‡™ T^2y”ªËrå€iÒ6’Öª©àòN¹wË…>Í‘ºRNߌ†}xƒMîEª ]Ø»‚¨,OT‘Hžñj><¾[a«£–£ 7þ:¶^vÅí¢K××™] ×ÙN©¼ü1[Š#í¼æ²³¤¢s;+…Hkæ²Eé™ûšÜ ÚÜüó\€´ŒKº/JúaõÞ¾vMÊFg9¸n^FõÙñ+঻šŸ.›¼ýKªí†QFÔ ßêr½>w(þ oÝþg»ÙÖå*Óå‰ß%?Òuê_ ‘¥!a6x*P3]êsÍ’¬§ç!ë=#ø‘îÍK'NŒØƒ·MêÿÙu˜ÃÒ(Õ¶×X$›hÛ;Ùïì\}õ¤ÑµÉ"•žyˆ×¬zsO»’ì fÕ½,ès&’´øn”—‰Û‘5^P³±}ÿøŽ£3 ’LÓŒ`w­ì°dlÁ¸OÞ¹˜@?oÏ\êg—á¡kg=6þTýr¿J2T\×ázžu†/¼uvñÊo:½#¸®…%ˆ“ "ïÎo\9±¹¬c+ZyÚ8µ¦#2í£Â"¨èA•Qú¸Äš+‹· ] rà¸DÙ Ìn¹)¡È†mËõäÙªš˜u:ö&âHißEyîwù»ô…½ž,pš«CcOþq#ã&%—Öšï%xs “Ç»T\s»hvïóÆb˜ù™³âF6»ýäÙK¬‰uØ51þŠû… ÿk®BÕ·¶.J¢½FEé ™­Žâc]q3' =1¯ï±&RƒJ{ É­¸Ú²‚ ?É&Ð&Iè'`ýY|´» G Ìpà!›(xÓ©ž`¢ŠÃ{Y3{ÒõŒ“ØŠë̦›·i•–ûÛzYß¶JB9jxºõä–Iè l*ôXjþÂÐäÀzó°×wDx/jŸu±TOùAdWŸ|´ç–Bò ¼êÀÄ‚le}ÊÆ^½¢¯:ù¸:­ZŠŠBüEÛM üLWâ8)øÚü†I†¾#ÀnD#/§ÚLNFÛ8½ e ÍyªmåæýÉ Ãøéb/Æ<¼ Ÿ!RMkÔ6ŸÙ!º¾§Øi­zÍûÉ•CMEåÈ–ÏyèÃ#Ð{âƒÍ_g‘H3)ña$?Ú08 {ÚÈÜ8ÜYÇx‰úuôƒ…4f™§¾ag~LV ÙSm‚Tì êsC> 6Ô³ÛIÀìVg÷㹎6;}lÊÉ‹]6ìšw à`ó ïò}Žk‘,X"u·oh}áÊD î .ËDcã«V¢ÌÆ®øÎçD0G²<" œ¶µ#!«ÓY[ç—lÈÙˆ`b’u‰e'E Ü—#öÔ=é.H\û9ª!¬á4›|&jˆE4&oÜ—l½¹HýIÀÓPÁOþ‘iÚÄ/á×"c‰f†ÓÝå.†œë)—7üÝÁék9ÆEYÊj0‹eÿm|¯óËddxg×ÅJxx»¥¡XΓ*tãœ-l$ˆ’ú¼çOP6ëv\ð«9O:ˆŒTô-„4Úø¿x:Û8&Û.û"Å/m¹%´ÑF¹(Þn-rò.î-Û&êš&¿xýUìè4'¶©“”›à'ªÀ昚ñöŽt › gÔ˜¸"Íp%^9ÖO—<¾°ÆíÇ­s‱ Æ?'ká\úÍN¼”Mù“ö»›Aœþ`ƒdf‚Øvæ¶%~w/cåŠSRùŠ>ó׿M òA˜ê޳»qjw°èà‘§ŒZ7! ©kúÎÍ¡þ³·I"½Éõ¬öÎK´Ê/M ú†Èï JD,cãO]®5Ñ<¢ØõXK¯J‡È)3Ë_1ÞS J†ºßÅRô³¿Î# }›xÌÊâ|$ëÊñPáUIÑgìÛ¡2â'¥¼ÛCÀTef,Ý\Q›)ž=詎tò°ú3†–p¼Øöc¿3TåN&Ô‘Ç&Y$~s[RÆç]ÕŸßqKio:švæö²Ú[Г& ß#=P¥6¤ÁíL'úpàìòzè± +R«öÒ„‹oè©¿ZI8î~»Ï7v[}ÏÎÑjÕù´Ÿo\Eœ}0¢š™^ƒ=–PáÜdGç\G¢­ãú1‡rêîq¤“„’uv˜ ær¾xK+í#d;=ZÕab\AFóšC+¶ƒ‹ui+âÆ‹J+]A‹ç÷’Ã/ëf÷Vú 5ÇÛrñƧUùæ‡ïc‰Dä²¹+ï30Óƒ=¿ƒ‚žÝ)ÐK™{?ùÙ4¾õÚþcõ®#Ñ}§ÎÌ»ŠU¢àçÒ³š‡è&ÞOhÚº¥Ì2"6Ñ®õ`žZÓìóVëØA»+ÃpŽ(íJ † žÊJJW«ä‰îˆžÝYž¹C=Bé´+¿˜=-Ëó¹Ñ<Äì"*øàÐÍóbBRÅ9ÿ,@P'•¡F£uu nÐ ÈênÅè7FÝV¬:nþ‰ž1yb;çn“ܦkQú0*âÕoŸÒªŠ-‘ÿ¬§!=v&¼œ€*ª…¨ lÁîøÎüIÄ ù&cÓã_ZýÇ_â;éH‡H>ª˜^¼3—R»-t4v´éëô0_žüÌÐ¥D´ÜdÁÔeü1ÏèžÐ8î#,|i{ÄÎÒ éðÃØî:,«‹Fñ3Ëú ½F–¾ û`WHÛN‚:Gyy[ŠEèS6Í$Èwš’]ƒ½EQ7ãrê3X`ÙøI˜`ð17NIÌÅò8«Ëýû’g-µÍ’Õb’h›öy!˳TluZSv] pÏN'*+·W ÝP¿¡¦7ô}<Ü÷5£Pµ°WÀë6ôŸLYèm¥’¬BÍV¾-ò+Dió{ŠƒhICŸÅpP¯>góõ¡-5¶T¡‚»z’wvŸÒ•qµuK»r(à%Ûp|XOE€p‚R÷¢ƒ1~>Ö|÷W…1#¿Ä)'L¢Tm‹!>áúL˜÷.È[Ô¢¥à5±ÞVÄãAÓ§8AäóŸ$™_ÍžÅó)ýäüØvåÄjž 9ÐÕá…^¿zDm ÷¢º1§%iýk¦Nsü³Nœ›Žàž±c^žÒ\_@®ÌÖr¨ÿÍØn`Iâ¦n‹¦ÏÌ"h¤ /6“B5ÛëÆÈÈYŒtõ1ä¬K8†JÑC¼BщXaU~Á–»üÅæ˜ž©!‹‚-áë.¾Pd¡ß >‹ï‚òz«[¬<ùQ¬ÍÖÎÁYüZ^ èë|Y5ÂöõܾÿÕÐl(sú¼¸¼µDô“3ü-E?ˆªn5 >:ºPú}·+Ç L.WŞ΢Ì%¡³‚Ó¾x‰åPªO-{•Ü‚»Œ"äIË’ÀŸÌrâŽíô}Z«ÅÉö9oÓ·[ŠWƒò*ϲԺŨ()EB5•O Æåbã=R&ÅãÅL;¸Ig<Í¢µ6ÚÉ£0í®¶C–½(ÌØÊÛÕ$bÚâøüàØj´èãâžû÷û}¢¯æfÆjeë2Àjö;È×!þC¶A}®+ óتš”£(®ÆÂT£( œz.`’¹¾¤>W“¨Ò§úÞ"Z3½?BÔ6bà™>×$Ìʵ&*b/{!)HCUˆ‚æ#Ãq³*r¸K/ªyärö”RæÎæàÜüÝ:Á#8…þ3êߌÐɯÊÅq ¦åûIub~Ü8¡­}„´ÏÊ;ÝœF×$õ°$ ÖèsrðƲ&1ÿ.yø‘[îu^/y…s²,¾S·Ñðœ.[y¡BÔêe"Òu›C zc¨‹cg&•k±óÀƒN/ÚyšÿpTù¨=JÝLwζìÒô‹É‚»»]j"Ó NJ´ÇJú Î5ìÌdÛÞcÚCx•à›L'½§–È£+Ôf/ºô+ÉBÒð_V’ù#” #iE¸ ¿èrqYiAïfŠt θ‘j²Àæ¡Ï¤™Ž,‘8Š{G<ʋĈ6(ÉµÜ GŒ8*“ªûô /áºÛ¡ëðòÐü|¿_©¶¨ ¸¨Ü³ÕþµiË…ªôµc#µÅ‘Ïéz˜Õ†ëb?•ñþëöó pœÎWŠa(ÑíŒfïÑo‡DµÏwV|~”Ž}'<±.¦ƒ+è$‘pÿ¼¡0Ä át:ur%î¼ ‚ä@üºëSÚĺþó.ò›‹,B´ç3½ïþ<¡U™æÔm 6Û¸UI€u=Gºõ„ûò·ü«!ZÊÓÀ<.+.Ô>–Œªé2k»iÈó‰e̺#Ìëšz§E„£kOŸÚú£IT1êò W^”É»b S8•ð}93©©ÊG[^+³¾^>FÎy-¾ë44‚¬ýŠ¡óžK€þôBh[:KF¦¸.€ä»ÙöÉ`³GØrÿY)ËoΔ™bn¦%TY°QÏynZ;é‹ûXJãRÁ’çõA2TÁc~‰¦øÛœb<½•¥]qb¹e 1¥ÏF?j#GJ26–tÅX/ã'a”}˜ef†uÃQú¦v¼}ôŒ"HŒÀ-*}^o>‹Jåýì}íJ‰Jî}Ê#Ü >T£]Ñê*æ™*ĉ¦&%:=q%ÁÏÌ(°äj8HƗˬxr‚Ÿõübð•ç?Z2@.Ò¦ÒV> †jÓ È”vyÎ÷%´žÌP:k=Á¼®|³»VeT[øŠ„tV8C1Yrg»žé4fÛ8AÑ™ñdµ¢îxíÅ6½{FÛ‘ÛÛ€e9`Wo—Œ„;¬ŒJˆì:Ö¼:eÌáÓ’^½¯‹½P«Þ çzxvW. G­Lôë6ø¬Æ ÉA‚²æa’û5ûÙn q}ŒïóÙ‹×8 ¤Ìõåp"Pö̲È`‡PœõŸwDmú›,}LõënëÑ3«{uÛëV*•`Ïèn·”,æœÈ“—ß?<ÙßøOŸKdQQ |[£ò"0sÁç‹qÝ®9îþù¹r…¾äG½¨ÒЯ¬·}‚§Ú®»:,³û„ÎÇ%Tãk^µKAÞ™Z1[Î,³U´T›f}ñ·Gqã\]¯DQà°oàj1(åÏ®Yd~dú(tÕ@:Ä¡}(aCÚµKfÎÇÉ»)1™ldCO¯Еȣ’°ò^ŒT?{ÞôA0æñ&‚²pàù1º3.o ™ò1z ©×¯Ñn/¶MéQ¦Ï¦ÆKï¾ ΆÍ%ŒÌëKè#+§l¶J° Ÿ­5ǤWã|LO•Cç ï…/„¿ùeÁ[Û­‰Hd"ÙéòFnn¿¨¡ÿlº|<šéª)󘕞+ü1 œøfôEµ,yXà€Â,j{ÿ}ù›ÎÀÛÓåNøæ^b™ŠF ~IþÀâ¹|åÇÞe‹˜ãŽ ž·‹Ø*÷þ?nøgÚP}é1`eªÕþö³>Ý7M|žá U’ˆµRdº¡,î®z o]Ø"¢÷·ݳ¨¯'冥Fœºn¶gwùM÷íQî)‘Ô¾‰iÑ2³ù:×9´t ;8=õÊêl$ë"aÕë m£Jâýd¤àØøéª:?'G¸þ,Ó¶ÇÚ ~Ñ)°Ã\§yÖ(;)ÛWL<¸îÅ,[WyvÆ1}yGáô’qãß#´âÞåô*fÀTÂñÚ0sÐüÝÖˆÖ‹×y«-°ýÊÄ+x²CÂï³ëF>Šå#Ñ–±»µm^QOW±ŸMÄm¨Õw!-S×' ¶Šw©`QkîjÄÔvщðÝíÎlÎÙÙÇvOt:Ò¾0b¶' ,P޹övu½4³Óñ¥¼Ø™F8ü@+:];T—gÞL,ê‘ì?‘0NHB>@þ-£…ñÕP’ÂÒ‰û(—£ô'ÿïS+ûç]Œ(£¹½3M€÷5x¸¶7éÁgq§ÉÙuÖâN¬>-,Æ /(bHûš/oݲ—%](ê9¯…^R ‹`1]?¥íÍ~:Ñ;%ÛÁ°9½³¼]?ñ«*ä¥jùȳ;™Ì›‹„~bƒ`;*Š5JPûµFk)Öõ ×ß(|gôSH9óoywà{¡ýÈ ˜€gî º–xn$^-Sãø3-3ÒºFÌÑç¨W7¥^šøk'ö1Øì>QY´©Í|Š1EmkÙ§}$[ééˆØxÂ-.ÄZé±ÙõlW„$hìæu‰<Ú’!µej:5 ë±Ï "4¤„5Mk²·w߀ {C¦jh`p¹ÛYݱjJ²üMg‘ÈK1&M¡ÒÙ=-ßÕJ¥Çzó^ÏúG¥­Xñ²‰­zÜcjóêp¿S™z#JÅÕßq†ëÁe—03ÞiAef+T\v3B‘”Q¹'ËgÿÓëwTH%0FdåÛÙÐeÊ …¶iVïN»ˆj)jfĨ2gÎSf8Ãö ½ )OÆž7Í “DEpð½ .¿ŒƒšN¬tMôÅ×›j$ŒU1,j³ˆÙ†[aŒ+ê"½Œ”|È ŸÍ™µcL ÃŒßTÏ W¿Ô'Î5öÎè$×&Hvs{kJ¸º\e„„ŒD°ZƒáÅ©HL\ƒaÒHšÛ©“UÊÛðrœªˆ^@¥m‡X^ÓcD€Â¡RQÎMïîu›v¢:Ó¾X™áâŸ@À«‰*˜A¦¦üÌXÍwÖ8ƒŒ^ƒ!Y-¡m'1Ó[õ^±ÇoGWßIï¥]·ÛâC×ã—_áQ­U7ƒÜwÖÚ1Ñ‘W<+í”ö#—VøÑ_6ÌPHÕ'ŒèZ„Šöf|]þÔ\ÿí'[®¶&÷OŒŽˆ®é7WÛ¹$j3{évâ÷·LYÓ3ÃÂŒNgÅâ‚~C¹'ÆéNý5çtŠJãfÌïÔ¥À –NÜ!eîŠÅôš¹n‘R:!_ ÍÕÎ|º?jÐ ¸X½ù¤sÅØºÙV=ì²´øÄpÀž|*³‹‰Üò83hùÕôXŒôôâ-Aª‰pñ¨È3Êί¿¾—…/:ÝÏ~<òãÀN»ðæê!¶˜åˆÌ ^:Y:c’Žˆ;tym;ÿqJY)æ.bpÖÓk¡¥­ýØ£©KZú¹äõsd½ýlûŽbÀÁÅá™­Ü£Á缤˜ÈC­´Ž†2³ZÒJ…ªf×ÓHµ¸ë³0ŠN5êHµ7,]C {:_ê"ø_ûD)þ¬AæŽ(O9{‘n‰a–?„bÔñ´<ÙísE¡æ U—Öc'¢œºàøŽiãÇ2ÊÖŽ9`JãÕõµ· ÂÞõ MòqÄwDŽ“mÇßÝì ä¸³ÁßL—ç« ga³]oý µpÙÊ'–ÉoøQ÷s?‘ïÅïîªÖê=ÜÀúïý»–ÿåý?3u+sˆ¢‰µ«½¹½©¹‹ëïû›ÿ—}üç÷ÿ89øyþøþg^n^nþßßÿ ûçý¿¿ ‰ÐJ)Kªë¨€hdÕhT4$^IÒб²³kqK²³K©KýQÁÃÆÁI£îbâàjífíè`bÇÎR¢Ãy˜b"Vðé"&boîfBcåææÄjîìní!J÷pyÔÜÁUÝÛÉœŽÆìœ(›¹—ÛïY'lfeââjî&jíêÈ* À+ÈÊù€ÓÍÚÍÎ\LÉÜ“æ_®¡ Ñ(þžˆ4 Ö®n"ì@`ŠØY;ØÒÀ'«…(;üâèåmiîÀfæêJGãbn'JçêæmgîjenîFGã§ãÏîàØÿ ÜÔâ ÏѲ²ÒȘ;˜»˜¸™ChL½i¤þ@GÃÉÆÃÆCÃÊ ‡X{ÐüÖQ:gkˆ¹˜ˆÉ¿+ù;’ìájô[}èÄ4ŠÑÁÔÕIXÅÄÒ\„ÝDŒÆæ?ome §ÆÅÌÊûO’ àý[Õ ‘‰ƒƒ£Û_ÿÑcú_Àaa Ê?ÛKÃßÿO›»;˜=Ì×ÿHÂÒuý/¡±´s45±ûtüŸàp‚ÿß0¨šÛ=ŒË¿ æ7 v¸¤&8§Ø¿±‡? áuêVÖ®4ð7+sø·w²3w3§±ƒ×Ò8ZÐüi]ÿf©EœÄDÜLLôƒ†FÄÍåoÝÂëè‚OW7ˆØB ;„Càï¨ùM ½ Ç¿ó@3®†ÿKd‡é_ñ°ÿñáòÿoÊ9ÿžr¸!‚ËÇÉíw‰‘ £‰½“ð9SGG;š5ú[‰›úƒ‘P{PׇÏÿyœÿ'3èßÊío“è¯ÿ“iý¯øÌ!æb4zÖpÛnn Âþ;ÿš¦ð™ò²þm¾˜=­!4Ï\<þâý“)'G7s3¸²²ÐxX»¸¹›Øý£4‡ _ÆÜí«¶r÷03¬ÍþÑ™ðщ½rý—™üc篙&¼쨺;8À-úÿ'8r‚딽‘ýPì”.ýÃùázàç·ÙûÿC ¹ý/(ùŸÎѶ̙¹‚«Ñ]…þÿ°<±ÐüõÝ„›N ¾»¸ýƒÅ_ÄŽ\lÿfuúc v2q1±ÿK–á¿hÍâ¡Ó2ù»mÆï×?r¯ñWMG¸u ø»ÿ[ŽàŸ¿+Wk¸Ïùà•C .æ®®4¿ODéLì¬-„h\¬-­Ü„áÕ®öpÿIì_Ý}G¸sÿÿÒÉ…†‹†“Gˆ[@ˆ——†‹ƒ“ã·÷wç4¦Þø‹˜p.ÿ`íáàCˆÝÓÓ“ío§Ž.–ì¿Ï?¹Ã±¶·¤qu1û÷ÇN–tpwÎM”îÏ’‡œ\¸|¬!;s:ø¦Übî"JW—ßî'"ìp/úƒÙ‡±øó0ã÷ ‹ØÿæÏ¬ÿþüç¿5þ /??Ïïø/ÜÿŒÿòW¤¿—?ïÿùsþSþEú{ùóýÏ‘?×?åÿW¤¿—?ÿÿùÿ3þ×_’þ^þÿsäÏóOùÿéïå/ø?Gþ¼ÿ”ÿ_‘þNþ¦ÿcäÏõOùÿ%éïåÏù?Gþ|ÿ”ÿ_‘þ^þ\ÿsäÏÿOùÿéïåÿßÿ÷Ÿç?}ú{ùÿ:ÿûçùÏ_’þ^þÿ­çpñópðsrü–?ç?×ÿ¿$ý{ùÿÇØ­æ®Žî.fÿW¿ÿLþ/ÄÿþCþ÷¹ù8yÿyÿ÷¯Hp¡›òr™špóñ˜òpsð™pB8yÌùx¸,Lù¹þ»éûgúǦÿúÿ¿üýgúßê?ÿßÛ.î‡Ç?õÿ/Hÿ«øß&ìÁ¿ýrþ¥‹‹ÉWÏiÇîæeáäúgìîÿ¯¤ÿ{ýÿ/þþ3ýçúÿð½/œÿ~ýççþ§þÿ%éÿ{ý!þ÷pã½?üÁýgüïrreeå’’’{„OŸ>iiiõõõý'QÀi|Ð_ ü?D7ˆ®gŽù>{ëÙÐJÓ~?^ŠL' Êmáþ~«á T¦M7s¸ç½§½ÑÚCê—¢Pî5P…? wÇÃ3±À[Q‹ÏòÅ­]Øh\Ú Ã|šòyèVÆú#Ë/øÔÝU\(zÉOYeEC[ ž²€v é¡—+¾>¹ýêŸìÈXK]€ùiJr‰ÝH CG†øˆJÅ8bÝr~0{>_@:á1pEª¥×3˜½ØúÒBõªn×|ÛÂ7Ûæµ}&gNÌ%‹È#Ÿïòf`ýÝÐ÷z;Þ.]·ðñs´ñÚãªÌ_ÃÔ-ãÞ—¢'Õ5·/ä%ç Àaü·LЃ¥ BɨÁè¡ö5’V™¿·—é2×xÔ¾.?[MÄî9çÙŒzr‡ñ(mùÏd{íî9¯!»J&;1—ËâƒvÜiã®´‚ÌßÇ‘É'êWhÌÚƒBc8Ä9¦ÎRn[Xö‡°I[p;Î~ ÿx"R8ëWu̳ äWøÎ%ò¢·R bµ9óÔõBÎÒ•òÏ.Ó6ì>ˆS†Gx ònôY{gÌìq®Ò|w€¾cŒÉÊ|Ú}òBsÁSˆpÿ¥wÔ§•>Ëá™7)qiÆí©ÇC c¦Ø6úíGíÇköÊ ¿6Fë#‡ÃÃ0cœ@Å}ãv¹ü·ýŽêóAU_¨¯¹ø¨d–»Êdy†8e.ý¶&HÏy›¾ ³Ó›C"Ý‘œ„;ã8NÖ† dÉò <ÇU¥ËÌ´Û”åMì'‹\àé:Fw^n’¤;³}ÎÁ0Hñæq`ÝB H4®&™¤pqQz¯bbGü9;i%æ1gÈ{L?~]N°!K¨!»¾A7pˆÝštjUë3™9E­l~بêúsj%ñ›I¯k¥‘±§iÆ[ýùèUzy"¨r4*O¯l÷ü…T¯¨Rѧ2oM›œ‡ìÍ ·C»T8czg:Ïníày‰à¡÷¼"ܱ]–¥gq4¾=b5a¶ô!£ª¢iËïìyõé$GUŸ¤ÎË5òq]°LÆ m¼³'‚´Nø›f¤(ü`j(éÇž /²ìK‡XPŠ"ªèZÁèëÿÅ[jJÁçÇØ—£Õ?ë¾°ePúôÊ䜺ðŸbLjíì4ÛýÚ!£òŸšvŸ]ç·|ÖlGU=¼Ýd—ÍÁSÞd0fs‡Û AÖfys?¥ù=ÑuB_ÐýjŸKP^ȱ6nÌ™ ”Å/!:îK„tþØoë9"3¡òøõ§w àͨ¯™—¤¬­¤,ƒÔK‰AZȯãœmq P!G¥ i˜17êY¼ª%ó$òã.Ñ2ìÄþNNÑÈÏ€6b&µ^†F®6±÷è2g  §Í–Œrûþî–«¼œŒ7QhnÎ3DÓòG2ÔÎÓK°â€Û­Þép†¹Ž \t^mÛò~‚¦D"Te7EhÂíÌ®zò7!{d(êJ×p¤Â;æú’“!Ô§ù_³¿qÛÞIøÊ•¯Z~ùÅNðæ,1»+J€eþ»lç_*¯xžã?T¦i•èÄýÆÓJžF¶R~õz¸ŽQ.ø»ñlþ ÀÜo¢†tÆcÜE~‚Q¥2„§Ã˜¿‚|~ƒ÷¶n­Ã0œ&Ыq_íÖgw ‘eð˜áÎ §5ùœÌ>Wû†ÍQ½ÿ8-}ÌrvøáóÒ¾:f‰Gš~š?ú[íoÈ\_ñÑ2ú~êa\àQu.NÎøñ¾Ï€K±Ñ:"æT“Õ,Êe÷A%¼ñ eR4«»Ÿwï"§RQI·%ß)³îQt}£kÝZ^Üž!MîˆZ¢³tÚNŽ`C¾ÿøý~qœ‚ï#=E³ú•büx ¶á â—ûÒ„ä¥Ù[ÂãØ<8SÙVÝŠ ™pL ƒ|¶ð÷á¯v]ŠÇ šÇZË$è¿p˜ÓY º"ƒÅIÜÞw؂Ƒ‘œhß—Ónº¼•ß IËZ¡Ëeòxy„a Kû”4ý%£BÉ Ô~W§‰8:y+l,àñªŽ0ìÍÅÈ&öt$CDXµÊ¢õ³Îó ËÙ¡4b€¢Øü‡G „±¯ª¬þ´Ž#Ëì'ãnX·<ù9ŒöLWÖwRâŠeùz<7 Å–#ç9´ñ¸9·mˆ)'(Õ=|À!›ï$ÄÃ;¾*¯í•xãüë³æé1÷Ûþýl¬7àp™È¹öl»Ú)J¯XO]‚1:<ì7±ÕŽ;¥_jâƒâÒ|¼ûßÏ“ýýö²÷ =é}/Ù8Ô•‘•=å*}ÍÞ5šæ0[n„ÒN”ÊMÁÆ÷e´—wtdÚèê>Ìîö³Ü§‡½9ãð,—'òå‘Ò5‰ýI¦áŒ~«À1á÷O)þùøÐƒr3Wê/p~ð7ÿ¦FVÄWTû@+ §8ÞGá«{ÍC!fô—sѺAI¥ Hü5%O#²9ïyj-šF.ý¿Nbgñ5ê¢piqr 7$ŒîBhrÛ¬Ò†j²9Ïé;tÁ¼ÇºÃ{«O ÓfÆ3ùëÎ  ª>fç O²­?KÖÉotН}ódý ¾ue¹ #©ðM\òŽôS­âwÿ©3¡n±´ú@élû<¹$¾Ê+˯Ԓׇ#é¨{7pY^Ö(oô‹‡Ü‘ÎÅЛ{•ç Å26¦_–Ȧöé¡T Ž?‰›ý™Ö€ø5À BÞW†þ̃Qž`ä45ŸbŒÝøW×–€$ò¹õÑ )ÓN)¸CF3韫w‰‘½ dŒ/¶@¢×†iQ¿Š¤!ÝcGa³8æ(̉ץsg•Áû« » èê÷£ HUÐ;2¡¦Jë}°ùðMi)Ô€ËZT2†;-Óyÿ´sEó+’ÈÙ_öŽA>ôïž%p³½AÝãƒa’>—+~É…7ãoA8¥Yd—È}€²L=dˆ—ðj›LKh9¹§Åpç"ë Ë—„W;de˜¢d^ÓQ ‰‘eð9ù¾a[n¤³ÅaDª_ú|æ‡Mkž¢}jN·ï¯¦«|3ð@æÐ+Q5Ý»›ƒ~žhøt”ÛNóÏRÑ}ÉÐ/{:tWQuÂÝeÀ…vhñ¤¸Û˜A‚¡¢XiR&a‚›T7l€óî:¦h’Å6ì/o?å’4;…«n4#ÁæY,þ¥¥>'‚Ïü/HRk\Yé‹Fªvã•d…Xuµ!Ñ×™:qñ66±‚Ð^ p†t(ÁÆmÜRjiGÖ@ßx¿Ä²{¹‚^pÊ4=W÷Zíí¯‡|AÄ…wiIÄøýäùæ1@¹“fë ÏZA ÁQVŽŠËnšAÃÛ¥+÷4~CÁ=Å.MIð?xiÝ!ÁE jÆ/8‹†—]Ýr… ³ùõ®Ÿr;-Âÿàëyž|4|ÛŽ>É{­CkY;,–&)êZƒ·ˆ `Ñæ¢U·9VÚªs¦1Ði|¸Ò)ÈÅOÉ6¦(£Æ½|Ó~¦âqY{:þL—®‡Íîb4!¥9íÚgCåeèóɾ}ôXW£QÊE¼M.ßýBÏO2Õ÷‘.ïÉéùîÒœBrpªè–?Æš½T¤u‰… ½¾™’l§b‹îÊ(—îp[Zºµ9wm®¸Y”^r1½"qÁ˜0·øÂãÙô*#ZÚÚ· iÚÇÛ=¥TšÚ—3U½›pϬÔ€Õ ¾'㵦·Ð ž¤‡dÖc¬¿?öþ,¦»ð£¤ko_ŒNFàZÿÌYy×^v6÷€·:3KÀÐÝÜ…¥&Ň«ÉX¤ÍËòÙó•ðÌ)ns¤‰U-ÈÙ(‡àabãKƺ@ "öd¸pÎsœÉê?lE¾?lâ¾øp홾áÖ›Téä ‘mÚÈ™ C¡ä®¿å*9¶¬Oá«ÇÚL]Ñý?:ô(þ~ˆ/Õ¨ÆÙ):íE¹ÈaâåÛ¡7iDdºÕ“Ï@™£95U¤dû©õ_\S†oã³ÄÍŒœ¹ÄjÂl‰Z u06¸†Qrçi–rZ²ýEæ´Xä¬{V$³uØ‘ª-4oþa0_åâ‚a1ˆ¿Ú09­…Ѧõsû 䥀ÙSú)‘3š6²ÈN]ÞEF¿#[ô“~óA®4…"ö͸NC ;Ó41ˆÁÊM/ùáËûȪk/"s¡!WÜ;ƒa/Ú×\Û?ÓXÀÄËZ»È¥¦çŸ%!ü–6Ò}8seO¸ÄºÈ W»vúµòG‘„T/Ûµ”] ö ÚJ‡KSYe y ýx)J“³6×ÙNg5ú¹Á3sH~³VÞñ$h—€Ì‰zêç纵výÀêr'g}®º çñÜGÍc_í€\¿ˆ˜C#æ_¿±N£c#öH{ñØ)_Nôr …i\„€-:ƒ½oµˆ¢òÛÌSn$íwQØ­…NÎ-ëãã ‡xÅÏ.Ø2-¾%íä½<8\#¿å⥚ӧ'"ÃÑ¡ç±LžFÊtIãM;Œì‹Y{c÷ìë$$Šiˆ¬1öLJ Œrr2f%;F}[ÊÁ!nň7ôYtóW /.˜Û”Ë_ÁJ©ÈKÿ´Nû¬<¶u2Re4U]U6¸çÚ/ÃFÚj„+p›WÇ8ªŒŒ–Ì5:Zþš—¶¼D8'=éqjµ±VîïŸy®ÃïY#8×õívðâs•EÔû4¦¡4› üùÉéÞ½_?ZŒ?8ªTd¶ØŸyå#ߥc¦KK‡í$¯s1Ú<³"'#«Ô‹l|¬²V…hÞ‘i÷ ±Í0»u ¥?ši2)˳f؈gm'-ˆ‘ðüú¢nà£J@Q£?#=¡P$[ø²¹nX~/Ótò4O „ïŽlüC& ÇS®úHÆÑÝ«gòf?PR·X?Òš-Ê€ÍNÊŠã‚ÌÌPÉÞ š5pä· rsÉ#¯ô3òrW '}h-Æÿn9Ò£?ðÅ6=¼Ÿ%¿8¸Øy§þ•'&®4®qãj½êòcã¼×†1ks×3¸[uÀ»ñð<¼Â¯QºŒ7L¸1Dᘌ /åZ†O?)ˆ]õl4 öÇ£Q†ì†€œ@Ônò»ÈÀâO§r_.\î±Å6²ä³ÜF'“ràrŦN{&—£‚{7o"#›èÎûòÑ7 Ý ”¼ý*ÃËßõÏdlPZö\qaÚd½G÷ú²æ*ª¯(eQnyAµ€?;_üó.çèBOK>Ng‹¬‚džxÚË¡ö[Ø×E™5ŸÕvh‹ìoT¯†È‚-òtXC,ˆç]^ -˜{¥G¹°n¿×öO9{@",Ú3  f~¯>räK>t0ôÅ»bìy7\ß·éÒ8Ç–V‘­ƒ­¸ó­ÚÖTµÒe9WüVh8LwbëÅY¡¨X Oòñ5k%xÜXõIedi?%uF˜øUÌè©/>™§5®‹•ª˜eo^]ÊÇCó•LZ._ªœ:®\Ëå`äèÿ½/‡òkÿ—%‘Ae—,qÏ F‘­AI–‘ݘ±eÍZ²$Q#Æ(†É…D£²%f˜±dK)²…½,é7ôù|Ÿçóù=ß×ó|ŸïëÛóù£ëŸ¹ïs®³Ü÷u®së:÷¼Oäõíz}¡¾ÛõÛ£¬AÑEE \ÿâV7=:ˆ•KzEt~ù¤Já’^ BÑ¶Ä ©áðÃ~CÓΩ«‰¦ß©%dv¡öþäìn·—ØK¸޶¥žØ—“ºrñbø•vU\ÃE•ìºß¿Êl¥Š+ar6A›R‚¶vCVïF<Ë’C)“{ñÈuŒáô³×W,Ò”mNºU|}¢á$;ŸÜÿ[Ò™£0uµ$\Ü:†Hþ }Ç®‡¶|6º4KÖýÞ|EÞ%Ýð‘Z»].nm›ËåIkÍì<ÅæØ”d^A- ß™k–‰€'3¡B.X‹à·"-¢bL7^Ék¬žhM&`gUò…P¤c''‚A ,Ñó’玎ÊD›ï©{-ìn6ÈñÒ”³ÚXZÀÈ ×^±,bН+¡ò§Ç$Œ“âȽF¹èŒ{2Ý9&=`íXV³í0â­%f_Æá´ºÂmCnv?»H²£7ˆ­†xçí®t „ŠbÀ§)RG6Yäߥ,k·TÄL]%ªkæÛ‘ûyQ…ôKí|þ- —é[€¥¢c±S¢ÖŽzyÝÔTvQ±+¶\1¯ÏÒRÙqb¤›*룙Èk×Ì[éyJ²»Íæ0i< Øê1–À-MÉ Góšö4¹ø¤pô/¤-fö'Ýçwiwh~§ª/¶nB°í…»úÃæ`´v,ùkºÔ¦÷ƒc€ÖPÁ¢©Ñd‡ôzó¸H^1Œ ¹òÛ…¬­2zÃwöÂU¿P=øÎOP^ªQø.ÆÖ!%ÑÅ%¹'ù#¯_Ç20€¶¿ ¾ÇáL;û¦ÏÅ4;_&D…JŸDÛ>$h·xê‚6"Ò*ý‘ ÷ÇwÍ â`#ÄÙ.lÔ­ÐÌþZ3ñ>ë0e!qÇ¥àZ˜Çm¨» …À>ÃÂûJú%yï÷MOÂÑJ¹ïöz虞MÃôÇ úƒï›l1áp‘†¤ë¸Nu]7QÐí³f ¶þNmÁ“ {]¤& ¥üñX“ÂÕ§QÕ𠙎jUSüÝÇ‚(÷6;ÎÊy%M¢ë}ù»Ž=5!ÝÞŠˆÇá­1¹ÕNc<Ò@èŠõ ZYÕ}ѱ°× }eA³ÝAPŽE5 LoEóq XˆL9Ÿ³’æ&'ˆ=ohž>1Øsá§I»<]kýNN'!?Ò»Û‡'zQ‚Á…2A·»ÛÉ÷V7/{‘MÀé݇#Q©¡ô6¸ñH[Õ;Ãìá;êNÝXÒÉšùÖôžø%Þï¡7.‡²ÞÚÔŽ%[9Õ V‡ì,Ïi䇣PQ¯¨ÒYgU¼GÛý×ôàM‚r–%V{Áaßðb¤…ö:mû·rÅóL‘K7RC‹9£½t¬bíÒ;­9Ú'•Á˜îlÏ“J@IHtÄ¡GŠ ÏÂ^€\¹·‰Ãùv ŒÐ,øZËýÉ Ÿª8ÐëÁÔz°çĶIÉ &oV^Û¯/O@˜rÂÜ3ºN wQk_“ŒS ×¼Ãý>uºí,¼ ‡}—npO {{UâûQëa*{Î0µÕòxêwÃçˆÕ <Þj–—êZ{™û/@œÅG.Ô«Ê;3é½5NÖ†î{¡YÞŸ¢Q„kfèÛH8¡èš$ïÕVÁ‡cì|M ¡gH€Î**¿â¸Ö¡™,:»Ü¨N«äÛéÀ˜ÃtY„Kþ9L\=à`¬N‘Þx¤j9+96Añ¢°õe€o~{p—¶DäygÜ<…ÇM2‡¹8-Œ9~{ƒÅÂò¸àc­ k.ñû§Ûë)2ÔDùÆ£«joS –[A@vøÎ3éõÅ]MPš@Õ½K!VÏmÄUsûe>²:¬Å´¦\[¾‘JõÚÄtˆ±4Ñ^ŽÒ+<‰€{£gF±fŠEp°ÐêBéåJ½c2©YDíñbûYœi·òn>o/þèžO)`ÔBŽæA#À²àº+)D#!_‚Ðüã6Ly¯ß~LBóì9´"MQí|$š«ò4Ñ(ìc3 øv挶¼áºhבGÖÝ+hÝH#»¾?-t…–z4æKÇ%»¢"¦Â nÆ j´¾c6„ýÒȬÉÜþlWÑgŒqo:¢3¢h5G¥:޵ïN³¥›KŽýòZk64×$U{7ÎB³ƒxœ–êÊþ¨|ƒŒØßà̲›- JuÒa —”´öÐ>²Ð ãòREx8Tgl8ìGš‘–ÿxˆ–Ù+å‹6É‹Y2§ÆÝ¶1º3É:ï’’&7"kÅVÛ×®—gfœõ&’Ú&üC›6v-`–”×<ØÄ%ËøI)crVÁ_OÍìLé<ârH!3¬,`¢&Hæ>ÈÒ–‘¾[ g´î.yA[kÄ2ä5 /–ûÔüll3]t«ƒ%Þö.†¬6±™àcõ.å§b ¢±ûï-§í'Ì=š¤Ûª;Éd‹å4N­ÂÞéÈÕèV®@ Ûtц²JÙ«pL5$m2û°k—VµÕÆðr´¨áŸï®’Æë6{ˆ¤³C‹ÞÄçÃH÷{m ÑÔœ; ZÝ9 Æû ×¦LˆFë*–ÿý=—÷-æÝ„æÌ¯• 72ŸíŸÖ±æ2‚û…‘.Ÿ.ËfʲÇ{xòjÛÑÓ¥f2ûY]™ñ)Y?„¬ï±þ  +ßGX_¦Í):u®æïò˜»{ŒVZÆé2ðÚfÊe„n›^ÅpM¥—-ž(拨"× #–Á¹ìÙΞ‰>X[ ϲÞ1Qgêõ8‚£$:ó…ñVÔ£nR€`pµa+kþØʦ)þÛ>þ«ÉÔÊxv}ð¾wÌþ»‡î,YLo”Ïác‰Ñ<Æã§ÂÀô%¤K"Só³xNFº%ûˆP.…Dpwqxl•ƒêd^CfÆÉ:¼ï0>\ÏÒ0åzйù¤ü žÆµfß’\TÜö„¥By5¨ßMn€ªø}”x+5ˆ…3—â±÷j‘ÖÔ &i%Þà£û1{qðî©ô± ¯è*é8!bÑ QÌŸTKàg‡Ò­§M¿Õ†ÌŠ§Æ­¡7‹öt·î+nò Ï´:ÁMN|§±nÚÏ<-w“é¬2À—Oé0%Þ”wY ¯ŒPè'«Ú–ZRãè Íb‹·XŽ›cnJþTÂú‚Ûû{)ßÁü-¨DiÿÂZÐ&TǤ?’*œXó?쨔›.í_òd‘ µ¢±N¿ ïtßäßö=mæÚ£#]‚Þ%ã*§2Ù™:~®’÷ï9AÚ¥ëQPÛÏ÷z„ûÁ5´åZ{1cç›ûÞwé+,îôÆS6ÀEšå×Ä;_ôKnñͤ…¬0d7 æ"Ö:Ë4…¯‹H×ðüZd\Iz#9y¢ yY’ÎB9žðc¡ÕTÇ¢ägÓ²÷å‘7 U2EÐ9ÄÅB¨äôr$“mºÁÍÂOƒn¤÷«È %ì1Å#Kí¶3Ú¤úçÊd,¯z0–F0 m2g/}ÿáüÔœ“íÑ5¥Ã{?¢Wâ±CgNYHÖ©14ÅÙÇÍÇ©AÚr¡1—T—S;vËè¨âñu=8ïhÞî:P¶ªü5 _¯K¤·êX.a?Th¯ú0Ž•¾§ªBònÃR¯ƒ>Tô‘µPÅ$Ö'µ„0ñªö}F/+ a]l S/+Sºv‚2cýe×ó9ÂÅU¯@ÅpæŽÄÇ“Ã-ÂÅœ¸QXªËw„•¾Ãõ$Š¥–&|¼$¼IT[Ê™%ráø&ˆi—R—\Gæ…ñbeLÉfšKñ%ödsx‚ÈÇŒB1Xn€}Æ:^b‘”ѧ•EŽº(¿U ƒÂKª^rH€IC,yÂ3î±ß©©œsõ¼Ÿw"¾r"3R¼€›ôšH±Ò¢’mÛNÇÐ{].@[­´4/d†ìɲuKãË¢4é‡9·k$By{úàXú;x—ÂÄûlFröjom……“ƒå&™<.ÜÆÄ[m¦¤'¹ZJž9EOÃZ½týèóÅkK iå‘‘ ?ƒJ͘,ëË\$Ö1zõ²é=¤±]j Á³ý’²UŠ*ür#ð–÷=ƒƒ:è¨öïŠU ¿çêŸSÑ¥€ÇVns9Å*ÇÓÙÎTÁÿâ‰lx ¥x ;In=Z ìÅ»Ãý‘b3Tè$Y.—ƒu×ú'Ôô€'%ëe¿ÛVÎÝÑ„TlÚ7âNh'IJ‡óDs‰KN:á<é—^EÚè-ÔE£RÿÆ?¡ÑÅsfáã'rÞhûœ9ó¨ik(«žDÛ÷I¸)Ùúߤ–Èã’¡èæøbÕ¸Hiqr‰®ŸMí¡‡"®wR𨤠ŠÚ{Áè4«¦©~Z`•T2ÔÔVÀ䇼$+vC]¥ClG\è+<ìÔñ5]…vÉ9K-XX|yÓ}w‰‡~¯+:×ЫÚD™b¸ðL:Wç©dK2Œù OCÚŽ$­„É0<0íÆÁ:¶ê±‘<]œ]7%ØIV,ú²ž8Üe #ñ¾ó—Y«bû+uCe‘¼=ÐJDI6oßVwµÃrݾ膢oZãT5+`€ÆôA{}€Ã¿eϹ7ÐŽ$Éç{¿ÃXk#ú.ÉRKV퀽¶‹¨'?ì¥äºü[wyº%ãïìŒ÷yÄ'»};”õÔ@Ýtæ!‹Ñuê‘÷XÖY„o˜ëô753*g,dƒ<= ”퉜HÖÔB˜ë hŸ|‰T¡-‡Õ»7¤ÇñŽÌûì–©Òä 9"Òk³þŽL\ùØ^™\aè?îi,HÔD`9ˆ¾"¹Œ˜]ËÙ¢Ë8IöñÒÀÈ$/iÂqE•Db«zrhZOÓ¶ïQ—#®nFÂIiÃÑzíÌ÷úõyEÅI¹ÕBåWºydÏeìÅDš¢U{¹»¸‘š1¦ÃS‡sT(†œ{Œ“:ð ¼9!dòÕð”s õfF§ vQêB¥,<@(Œ‡LªžDM¼¢ŽÔÅr´ý~?„%µ>¶ì¼>þÐGNÿ¦;Hs!7±G¸ûoôy}Ó±Ò§ËpRà „üÍ<àÒU$ùddžKãkÙ÷ëÏóÜypÈRKþg¦o/FÛ 9ênr3¦kœÍºÅ>˜ã£©Ri Gªêö9í•÷6}k8T%ÍÍ®cûÀŽ€M<|fr«¬MðÒ#½Áåñþ#§Å…`è/ÃU‹KBG"šüݦ×Üz$Œ…KËtýÊ¡ r®á$tÝ%LHäZ½ ·?ÜTÑõBj?7öêuf9½oýÉ2àpÏ Í&7¡ˆ¸éÏë”j_Åq¬ÞM_ ý[é„´Þ¨U‘Ap5q(ÿ¾G9‚=¡®CÈnDjŽ®„©wEAûõ®Î‚|ü½L$ä„Akž‘ÕhQÄP–Îy]|äDÓØ«!·ÛgÄ€O€Kp ÁÿAnê#‡¶º»HBìYÌP¢è¸§w[0P91¤ ¥ŒS ýŠA¹ê;RæëSŸÞŽŽŽ+Õ+]²~#§© 8VË–tô·G¯r{r¥Ü} Üz–Σ’ '鯖``\ æ‰ígŽÅN5ß²»î.Ëê7…ô³Ðµû 8?^=eWÚ#ÕY8_Vïoë-OT\:ø÷jé¨ÌœîøZWn£ñÁªCŸ ZyWÆÇ© y0höïö"ødG…‰ê>ˆçaôEt¨J2úD5ɤFI‰à÷AªQŒß±wÖä|ÑJZ#\ž’®9ô,mt3["–ÃŽAÃέN8ŽMpóÖ-­² d–—‹Þ5ì ¶Òï}¶£Æ»KPÌߨ#Ñrª#–¬‰¡šrj´º¤~W‘rèábŽß¨–rØ*HŸ0¹“¢Æß’%Xh}8ö´Ïâøºßx„ðìê´F(Ö97A,¨ei "˜¬?»žc³ }b^#{–=Ë–¨ök!¿n&½ør·×³æ•^§ü+[˜jåôíTÞlÆ3Já<*y¿f`ÙCѹìS|#‘k±÷(Fv,îÈÆÏ¶È˜ºPL#¹Ô«Xœ´ÅœÚÚ¤°e.ÕŽH°"­Å"½Ë®ì!δL–€ÁËá!ÏzJJÎ4¦z7s¢í´ÛáS–V6š•#'€+2?”d(U;4’]¹D ç-â…@³êkc"pk%j8¹_£š|7,Êû é*õZ¯œÚù~L²eàšŸ›ûþuAÆ<Îé#y ©o>ˆ;¥Ð;(í vy»r 7çÍ*õpgíÚ¡Š!j¼!€ƒèÝÂÀá0VÎ^k)IúôÛШé¯{¸5}¯X‚?ÏÍ»_³§MÏÒ_ÊÉ/„Ã~ŠoLªd?¦à ‚Æj´¤Ìî P¾åUùÙIw‰üÁgVŠ!o®yHõ´(é¢r6 ²I,%Ëó´$÷1í) e˜©o8ý.áÌÖVã-¤C5]}ª`qÜùqjælèK{0@•ñÏBÚ ·ÉXµ¦š|é®c|nÌu~D³3ö%‡?i_)}há•[j>—sá‚ìf)©¯ª&¼›¹‹Qã¬}ÅlH“>/k’Tåw¤—]Ç>u{œ‡ ž 1Ii¬%´S¬|í—äÇ›×Ýš6ÀéE„€L è=6BVóÓúÄñ{^˜I?°¸Ù¹Pn ƒ‹¯Ä÷o9'‹š±m‡Jyñ¢z¯t‡ÏWÊØ+sãâÆÚ… x㞎å_ê×Ô–º}Â_ÂHâýíê—+û¨Mj$$îâ¹l¾S%Å 5Pdõ[¶¾‹–Zõ‹GÈ…k¦M‡œ¹} ‡‡µdÂ¥|½o¸$Ö’)©†L×ü­%ò Þ:f¹$í#ë.`¸ò(Ook¶JØ—àâFÛ…õñêÞ7ä#oÔÅ!³-)œîI•²öÊ÷NÓ»–¥@ n[MÂîP©û„Ü·²°‰ªAи-‡/PM‹¦ò©“LÐ&ý(ne h‰cî±’ÓDî|˸ýQOf#Œ«ÌÅDpÔz|–¥í2ÀSP  Ð%ïÍ7Wíúƒy§ç6ï^H¡©ët¹¯~ÚÿÆä¬ñkW:Ÿ0jI]½<¤ýг¦¡PÆk2Q®ŽŠ˜{OHYh/àã2Ç!ÍÄ-Úsã×úi(´˜ázîcúˆó-‡“Genöî"ÈýxÙ„ƒŽAµMàânê·È2Ï+ÇP7‰(æl—ÓúÝ"¼‡žÃŒco¥vyzݤâü㱉s8´BÖ³áµÃ[½ ²ù±½Â«ëJ¸Ñ(ò–6¶”žû()F°ÇAhÇݳi²û#¬YœÁ½ßKÏ+\] ­1;¦†ñ´84 ìyv„µõä]–1ÆâwèÞ$5?JîC~°+áá §b)u~ìžþ«×phÖÉÔͱ’!=S4`t:©¿×#C2Ûå¸#Ü##†ÖÂ|:WPHvøà­ñ–Ò†WE“”.l<âx¹\qñƒå@””4zޱcýdÞÐÝ…˜ W*ar²]ꉑ¦¯Û@<à n+¦ns2oaâ£D k~;Z9×CtwL×u›3xÝÇÔ-°:Ë??ÄlŠL9ßF~ùùBÛû5¿ÂÄl8Ô‰í¬ŸÂ¦Ñ¥R¸WgœL1Êÿ±s+5~£lç –‚]Õ8V¤È"(}§V îØà%$ éeÖŸå]lOŒ ß$´Ü”kùc€3XÇÔH¶í(ì² ‘Y&©c,u[‡sè/Pé;‡€J1œÁœ‰ÍgdN2Oñ›­œïµãßK×Lç¾/PÆ`(C¦äA5to†úÆ·s: ¶Ð^w$¸ãž·Åêzä#_!Òôæéï:cáè¾ îÌsî µd Îj€<êÓK~¹¾9T(¨i…e8éÒ,©k7àÊ1ú´Ódú¡{ŠÅ ê’öèʇœ½ï †"×n䃘 d&‘2”ãK û±[öçÔWôÆÌLWjRŸ}qµh¥{Î@íLªºyuú:µð`<äÅRkô<¥ ›Ðñ‹Š…™žrEC!Gƨggï‡ÜÆ>õ¿ÅuÁ`·:4ˆâùiÇ=-dëû’8c¾ì f5à=.'õ2!ÌVùRA¨‰ÑÖîzí*ñÈ¥¶îÙû2b#Â2ŽDGÐòÓå‹îh(ÆýK7õT~  ­u„~‰ÈWØ–ÙNþø‹$ÇÊH­·drt™³¬"pëq<!pì £¸òm™ÞӚúŽs×Fæ­]î>Ž'³_+} ;GIëÜNÂbë‡ò°Öë<®×=Òm·ÁàýÇùç맻ȟY@X×SF¯Äõ‘}p¾ ‡¤>^é¿onaý–(ÎkC«Ø#eWT\þ¤Ò©­¡´Å#½™ÜÝ¡œB&s=ªyR©ü»Ï-¯SíëþöååÆ‰Â˜JÚǃŸ¶þˆù:ðÿÿý áÿþÂý)ôGùÿð¡¿ð?"ýQþüßßäÿ ÿé§ÐåÿWÀÿýMþ¿ð ýAþÎü_è/üÏŸH–¿—K½½¿Ûy{û­Ózý¼=íí·ŽËµWuµ·G¹øl¡À8{þ°ß¶è_ă€UT J*[ø/€²ò/ü·ŸBNJ*ª*Gˆ³¢£²³#ÀP0Ug' HÏQR†ý§û÷‹þoéßÔÿûm‹þ™þŠÊÖe¥_úÿ3èá¿ÑG üßgŸ€p€’ªœŠ‘C~/ =ŠRUú»²['†ÿ­†¿+ (ÉAUé…9Uè/8¹ÿý{úÿ¯c¿mÑ?Ñ¢þ“þƒ·–„¿ôÿ'Ðÿÿ¶#‰~mü…ÿö¦PIÿý ÿ òùòvâĉðððÁÁA{{ûC‡1l£½ 6ÉÐ<Í|¨+:"AÞÅù¯ÚW²²ÌÊ^«+—Î]8î’yYõÉ~pDiÖe°Ý¸Á^ãrRÝ›Ï`?™¹Ï;„i»x–‹ELÛw%}ã0>Jd¼¬`¡lª·\?—8=˜[üÛMÑθç»}1.–œ<¸ mNêòºÓWðl׸ƒ „õ7ÊÎ'n^pK…[í w\Ï@†¸ªw¼¹õN<è5cæk¦Åñ“á-Óõ‚çTîñP‡2zË=‘gC.(õ=kÃØvA§®A9õ9h¯¸ƒ?W=¤ÌÊΙÆRß<ëÚ[-Z}'ÔA,žºó>o½ñš¬=OJ…hÚžš/³ÇŒyÉÑÙØ!"áuÞݰµ MóDÍû' ‡ N¯„g´YM ~ ýðåÓÐÊŠåTûà€”¾MoÝh­‚ᣄíWšá›X刘rÎg~ÒììZ™Ïöx.·ÅÝn¡dÊIGIàx¾nÞ&˜Ý"Ö©•V—*Ý.bOr½Ã–´¤†TžT»/C2ŽxùÙÄÔ5zÚ#ú³í^Šàâ³ÝclãåAòzA–¢|݇«KeÊ‚4¶Û³Oœö’ôÔ_ãÿœNË^È£>ýÊ׬ÞGôl’×_ùljaCH°ünî#‡G,Xâ¨Ñ™:î¿`Å#Á!6kÓ(ѬñnßÈóÕ»º ͳÒABÒë?<Æ@ »&—Ô…Ñ]˜®bãY@ío# øgfÐ.6~§¢>‹ÕÏk÷cÏ© „ŸM—誑ˆÛcžJ¤öÞ‹÷¸aúÖí"ç\Á„¿Ú3sÿ“‡N³ â| ®¥¿‰J hʳ~z±dphïY¤Q”¯ËÜ™.èõ™Z.‰óÏ »š7¿ ‡lì¸ô–tçÓ<-KÒoaqnµâ•# ‰`”Ôg^Éã­ÝóÞ'U‹ã–Q×&ëÎsAžS]Ïñ Q̧0ï”ÅÙK%D¹„µ_´-/'tgÖT'ι ù Ösq¤ã9&gbäë ;z>çw!8¨ßÂÝ–ž»ýÜÒ\<2àÌcÈ;”³§Õï"=žP›,ÒŠä=ΔˆÝPê]@<[Š¿ý%ïUƒzõÛYQX>ŸD³t'û xëB-H‘^dìw¯,ëÈ7~ˆÑ3ïM&îÌûé+|ô”Ôø|Š4Ê®^|b“˜pŸ}¦ÊÉÔÄOA8S7CÚ`Í5ãW¦ %æîž¸Lt%‘¸qHŸ§ªª‡WgÒLNµ<ãq/7ʉæ։¯ ˆ÷X(¢a-q¿ÝHÁš»ºÍÎiådðILõ%nìž`±ÇZ,émM™ÿ¡šÿú£ýÿ+œÿýuþÇO¤?Êÿ¯pþô×ù?‘þ(ÿÿèù?ʰ2 ~ÄÉÿ§ÐŸåÿgÏåvÞíüeø—ã¿“?(BÁ¿ü¿ŸAÊJŽ(e˜²¢HwÀ•]ÀÎh%'4‚Þ’‘ʺ¿èÿ–þýÿþ¹þ+©Ö%è¯øïO¡ÿoŸú§‘ð÷a_ÈVجòwa_—£(EÈ3xþ« Lu;æ ÿŠùþUèßÐÿÿYð—áŸÇ•€ ÿ¿ö ýƒø¯;ÃïñßÇ9ÃÝ ÿ‹ø/ÓàÅÍþ{W×Ô±õµZ\ªµ­‚ˆ×XŲ‡PA«, Š‚—äf#›I ²**UDÞ§OÊÊ ‹àNY+ u)¼ª¸F@±Å¢‚¸! €øÍ½ä‚Zõõ¥ü¾/ç'’;Ë™9ó?gÎÌaîdç7_¿+kÈNg4nkåQS¾ÐÉ"‡1½}àý{¥ú¿Ö*„ jój¶u{±kð¤óWÿ¨ß’y¾º!¼öÎaõ{E*—k¹;•¸L`XªêÙ‹·]•ݧWh]Gm[Üø0íüŸ’ü$b¦„!1JKáM{°ÔýÔò‚…ùWÿÏfÑÞ­ó\N\Þi™MWÝ»Zðr6}¨ gø-ûȲi„6ƒhƒ/<8Í#/l¦ÞØenу^”=¯¹µp× ¦Òdïâé++SÇìÑ¡¥Ü­³o룔êÝ„‘ªIõ ÉíáeIk ˆ£uÝ'ïù'ï+?4/ˆcãæ1ÂUê{²Òîlð«Ká›ÖXþ[šg2ïùN]Á}ìéyæÔ‹-ûm:´¢Ö„£Þ,_»ô­£—……sKúWnNÝ&˃ö=ë ¶%ëd’HΉ‚¹Ã`G§ë@À$zö _f›ÆïÚžñ¯šFÃzÉbUÐѲ67þ§ÍªI”⌜í£×rcõù€ª ÂÈmKN™f¿,Ò^ùû‰;;ö6Ü…ÌqZz´ÒÒZÏ0íéÓŠ½ŸmÏ“e{µJM=Ëðx…Œ¹›îGMTÑ—¿0Ø›8Çþ‰*¶dIAi/w¾>Ügµj)=ÌlƒE6iý µöuñ51ñN™ªÌô€‹÷OŸÙðóºÔÇ䎮þ™c.Œ"™¸ÖæIXÞË«zÔÁíÉ_9ž»ë·ÈI¯vþõÝúGZ“CfÒ¼•ä»vé¸ [ŒþѺ"™>÷°÷f®Q,ýIø(·3S¾Ká:ªV=9ë¹öfÖ3÷èœÔIw®XÔzåʽ‹±'v¥¤=™]X9ÙEd¶àðóTÊØì3kªFоÖ W?w¢–ÆxØW w u)zD á¨}ݧCTJï8Ç{ :ÐŽ>zÃÒMS–Ô«K«´‰šîòЄÿGôñÙ‡,WÕΜÿ[ÑÝú¸糞RBœ$c›êƒçΨÊ>dTÉ àº™Ô4Å5u3žág»_iœjú­nÚµëÌXÆŸÉr~e^wÚÈp_ñëK™|ô£aûØ¥&Þ1ÛGÌk¾]Sdq€Vç*=¦{×%÷vóL½ûòPYùBIy¤ýýëÜ¢#+N•ϸ÷+ìTü,E©(¨;Ït¿Û\s,é÷cC†È8›jx»KT‘‘Wœ‹¬öGMoj524Œ žà>öY 9Å·22²úØÆõªOm-PÕï8”«P͹Y0ĸ"6ò\sMÖ¤Ò׭굩ò—: v‡xÕ§y5x<˜¤ýdGa%oMØe%7Ù‘-jט¸˜´¢3Éÿ©°èÿÂûÿþðý¿ íù ÿ¿õûñøÓµøk‚ðø÷‡÷´ïh’ðø÷£÷´ïh„ðø÷£÷´çÿ5BxüûÏû?tíßÿ5B8üÙýçýíùÍÿ~tþGû÷ÿ~tþ‡ªÅ_„Çÿo=ÿ£ÿü „Ç¿Åÿ´ñÿ~ÿÓÆ4BxüûQüOÿÑáñïGñ?müG#„Ç¿ÿÄÿ´ñÍÿ~ÿÓîÿ5B8ü‘~ÿÓâ¯ÂãßâÚøF¨7þ,!,—{ðEBX!‘yJ1vxû?iøíç)T™ÿeÐÈtôâ/´U{ÿƒFÈf’ƒ«½ç·9Ð\OçÛ¢Ù æÙCSÉ‹fO"9x:¨3èD2ò”Áb9_Á—ˆa!‰4Ç…Ànƒ*Ó†‡Àl¦QÀO¡š"+ùA¶{‰Xˆ¦žÁR„±ÔO¶ôFLë¬YöZ°Pß°`Ž‚Ð=È]¢$¨“Ñ 5ïw/~z¬“º*ö`ÞõØ£‰n“Çù»‡ êÁ UÑ·óÆ1ÖÃN>¬;8Þƒ‹sjNLÈ1ÅØ4 >˜ôê²Ú¼>h¤p“#óÝâüIvW{èÔG‰§PÏYàÓGK÷g‚L/ôpëë·v¥{6ë©B½'º×úޭߌ¾‹¼¾÷4£®ÆÔýÆ5Õ™Í?¾JUO[l!Vz¦`Ú°Á?Ó –j °q±²!ù£;F4K-Û71ÝrQûÈÕÕKµËÁ;à.?ƒOí©äx‡„­Ap2@=<ËG´óZÛz5´¸Ïház-‰-|7øÀ)xìžó>æ¢<à²0…Eq»Ã3™D„µË‘…%G‹OXÙ ±Ðл–ÿù6øO»`:ç- t]’ñ&Þ O}À„àÉ 9?89t¿”E†€aÀ"ZÀi¡ YAجd ²å"°“f¾_ñs?³¤2ˆjQèV4K+¢’)dl`q!7È?¸ÓlºwdhlÏŠDR*•Ä®¨šDÆ%aÁ”Îî·á‹¸\Æê~“йÀ£ ¶„ÎB×$*â³Ù¨‹ìaÆØÒKa³!©¥IjaQé ÎaAD¦ö*‘'|ü¿ÿÕžÿÔáñïGçµç?5BxüûÑù_íùOþ›ïÿd0h ìûÍÉÚó¡ÞøckW° ì^: €ù-ÐÏ öš¼ÿæýŸ(þ4ôþ/ªöþOÍ?M¦Ð8d* SYƒF§±) s2Lñ7gQ4–þ>úûÿËïÿd0ðó?•JÓÚ¿fèM÷²HlšY_MpgËÔ÷xZ˜X@3ª lÑU&±--ÔUX³d28¸óÆO 3ŠD'£…ÉÚ}zÿ£°ÿ¿øþOƒB£ö±í÷?j†Þpÿg€ƒ$CÑû?¯{pü¢uÞÿO-quuÕ×—š››ïß¿ÿÕ€^^^~~~vvv•••ê«A'Nœ1»´ÝlkÕü Ð€ÎA £CYŒœÒÚòì¾þÃÇ®¡—ëD.€uge5çnß¼výÕ¬óç·u䯊p­\s{èl=Ÿ¡ á$Õ± ng¾R?ü‘þâdØ“äÕF{jÍ·ø´Òú îÞ¦ë rF Êg§ÁèƒTP;/¢¡Ùé8ç‡â&ž¹1q¾ÙÍÊ´ËÍÏ7ý{×jC}o±»*˹¬I”iâQEå=¡œXõ0_œÂXéÿ¹“²9+ÑèÖ—ˆÛµ¬ùÛ X×ÂoM(_&ÏèÈÇœôˆ\ÖâËö¸SHáÒ.•\u9H1nºâW{ê‡ ƒÜQ+S›NRšn¥K"ƒoökkº¿ÿÈÃÚðzÓ벚֭Œœ”ô¢á‘“q&-_z׫bAÃÕKu's¬q |‘ ôÕ„=ŽæAqeA…!uªqIá¦6A†mG&Þ%ް)6O¨ì¯ñH 9׺h‰çêÚïù ùólïÄ… ÊŽ$¥S¸ÄÑŒ]«Å?½zÉ Wyß·(×ç×ùzìŠñ%’;¢[Òá2ýh"«ò@ÄÁEMÂ÷(ÕQ…÷RE}«Ï­àè†Í'Fç_ion©þ„QŸ¹ É éZë²¥áÕ&âÝUÛ7õö±+ 9+3×5í0‚Cör¢gª™âfÅÒ¾¥Y…‰6’ôûeÃì÷oCnneÌßCßÂÐ7O¸Î,I«sž`ÐRZ‘˜ÙA¿Ð1:1j¦Š§[o¹˜û{\p@3ýüÆ„¦eŒú«©~•¬ümåá9Ï}¯mÐ_ZÃÉŽe…¶<½ÓJQ*XdP­ûåù] F¢ŽòU6?׺7ZBa–Xlð­6áP"½õ“èG0ÒàÇ'ñùçŒÏ† ˜•ãœu#θnauuØñàkLjVçœ äìYîKôŸ£wò¶ïÑŒŠöGoˆrîD…„”lFYó„SñIHÌ"ä›­cÆ[Ô»úVmæ–Ä!wŠÕ3ÂSLj,2þ¨í¨q>¦ìçvr)–“1#)¶\5µ+#Âîa=ÃwÇ’=¾c.]Vóè¿UP0cŒ§ËΛ_ÿ`h~K='|3'Äm¸äÝ(øârÀžÕs/\¶¨ŽÖeL<56}Þ 8²ã×â—Oؘ–VöÏ/•âûŒ]e_Ù—¸\†¿“4'L¹5Kc,=û}šeiÀí‡{Séâæ„Oï1f;/ùb_Ñj°9ƒ¢·Zá4Zð a»—‡<µìòIã'ík= ïLÉ Í{6«éG‡Qz!è\, ‰¹ñd…ü§ìåû•_–—oùž_ÙVû°Ú¼Ðñ$54Ïj,âAøN§À¼°èÙ{¸(²-qAE@@A”&"IB‘sÎYI’hrÎ YB$GÉYE…&IŽ%çôuƒïÍsÞìÛÙÝÿº³ûy~ÌXuùçžtϽ]UgfÔ±t?—á²Dªíþþj’¾ñþ#¥„Y˜Pél¦²‘²q˜y2ÒôÞ£``,¥]6ºŠ/fë`çg$:éæITp^YU JÛ¶Sõ&šösW+ §°W¾ÔŠ¥…¸2çáb̽¢ Ün R_¹Š)i®ž½ëiÎô°±¤Î‘œÊISŽnFЯàJ¿—¤*ÃøŒYU'£3 ö„eo £½ôOþ·¤gœÆ¾j7!°áíÖi¹g Ç»µàx«@ÆÕœ‰ˆauäÙ}ãmÌ>—&Ü4/Xù™œ‰6N¤×YÔdÚ™‹÷kî>'{γÅT©ñ caÑd;ز›U(*‰‚V62f9„Ѭc’ ,}X2Èè ¤ÉÓÇ‚ªœƒNÈxU2Ygnè!…È€¢æ¢U ™ÙNP¥mxAeœ¹Ñ¤Tl`ËÙxx¸s·¨s‰š!ãÅ:³±Â™N‡'<øhW %bv\ ìU÷’󯋆òú´*__·P´x•6QÕ½x!57Ø­¥ÒdPËШ‚E³ŠçÉbçþ5©˜•Ø'ñðFu¾©ôè bTË]i*{¦hØ+DÛ@/wY¿ ¥h_§¨“ªÝ…ÁW„z”Xî?„ßb|—f¤ë!_¯h(ïÿ­ 'B_ü’Løá”øº©åň+ÝQžûî'ÚÓ7{®ô ÝY¸"Ñôh_Ëš g£Þ$á<ð„Aÿ~%c¦5]{Z ±,52î J s ‚ŸcnkÁíζ†@Z{µÎBárø17¤Œ-4PŸ;ñD¬,(é,çÎÔ~^^6«n·Ö_ï‡=¸½Q{ù¢˜Û_4ïcíó¤Éåú¸,ÓYÀó|r„ŠW|ü÷;èó9®F5ŽgÁNv{æØµZýRY7ì^ÖcífÉ.NÓ§Ø>ÙŠº-ëJ'Ý«©›pëD ÆÑ¼ÅP©Š’׎H§umÎ(Ÿ×ç‘=ï:<´°'¶WT} g 6Ѐݯ¦åï–%”ªã7‰KÝ‚"͆^i~JÏIî¯W«U †‡£ 3„D»Í+lé>õÃ5X\°¡}Vò]Z»i|ë"ûíI9Õü\maʧ%ÏøÝ.s j›A4£‹yª©£D˜JçëÙÙo„J5¯pS¡¡ŸúïCw¬ÔP–$ÛþYsýàšº8¿x¸ÂÄ%éýý4ºÛÆü6)Ÿ T¼Ós–?Õí¦6ƒ8øß=¹g(N6¨ÙaªÏÝ{Åß'íªÝõ—ªÆòªÂJé}¦V›SVF Tî†ó׬@WÍ×Y”¿-öÆÊúåñ)„Ö¾ðk¬Y³ øšÓ£ ™ï=¸ õ"4$Kp7Ê!ÈU’á÷ÕUÓg¶XÏ"¯0;Ð ‡Ž‚Â3ô+fZb‚0ÝùüÜBƒ¾Níƒý]©OÂ?^«‡¸Š±_0 ç]¿›j}þ^]{UþVôRÃýá;£üÛÖ«ÈÀ ³i£5É¢UìÏ`¯íë>Ž„œÑG hÔ/7@÷ ·²„¯Å²z ¾^æJšÏöÎ~›êN‰|¥ŠJdTcáéÕ¯AÌÓ;ß1}¬2Y×|4’8 Å×ùÁ…súx,fŽÃC20¹2ú\hH%ŠÜ¥î<:Q¿è'_?Øœ PùM¹óyã­µæ¹Nƒ‚4ž“߬¾äV.ç¤(ÕÒý)áó-\tƒ†´ƒLLè¢ÉkМjU<3¥Ê3¯`»DÑ ‹ÔºYÄ_<¯">ÿ‰k /ÎÚmžË #gx¹¡ëbœu[¼LÅxþ W(ÜôøMe ~œuæ9Sò”E ™^Æ'¯F**wnÛy ‚À®Mv›Ð?‚‘YR4‚ª {N©:R0réõ½ðãšî|¶8¥‹@–Ù( سúd6ÏrÅXiÑ® ­×ò:—™%a%s_—LèsñÓ¾ew …Ëá9RWå‡g"@Ç»€}Û—H~þ¹gó~K¯_ +&å«|œÛ"Ê[z`¨db$æ¼è©º—–iã(;në~°Í•ˆÏþ«¯£@Ê€y”B‡[ᎠSRªÄú°6”UËê-4û&yZgÕ¤Zù1«Ùú »g»¦RŽìûg/‘íXý4Uï‹._h Y°"_Î|-¦?q#jXÏÎNû!Ð;€€½2æ/éBYõ–Þ3-;ïËúÞSú€ÒE`!ó¢U³UNù(çQ€ {—UÞÜ"þâÔŤLqìm~'åTÈׯ—á‹\ÆYÎăúÊ)•ÈÙÂäÁgÉ(ÝØ .6F8|Ó×Í„9VÛê5)%ðŠpÍâŽIl› ÎÓ\­Á Ú'屎¡Š× æ­Õžö‰ ´Ï"Pä‡ÉY"ýå*Ž3úºÙços>MóÙC^‡Á9¶'žë_ÅË}0Eª¾$æ6œÁ¨Ëãµg}É‚Ô j&0"|¢¿lR¡å‚ARLRJé%6±îæÉÏ¡®ÚDçkŒPE¢ÂTúy¦!¬ª¥Æ®€¸v“CŒÓ)œÝÉÓŸ¼ _ÒÊÔ¥·yÛvFèyŸ[„_\½”}{×Ï„˜ &bðÖC@ý8Ø;žˆ×¨ù=œEíU=ðué7‘ôX5Z`EvrzzÝ- =ÌÁç‘ê^|MÏAKûŠlZè»0¸¿~Âb_ï‚™b)6+ôÓ0bûª‰f£æ¤EÜX7»ùžÖº?QJµrÄÊM(×˄դƧiÁû¯ãQal¬Üa¦ý{0À”i±U%(±q¼=h²ÀuT8¹ŠìmW—@V‘Å9“ ¤‘o[8¸³NùÁ¶¾¹Ö(ôE¤næŒL%Ê\_9“»êZ½U¥ÒćD1Õ7SÍrÑ}uÿlío…%xa[Ñi]pÑ=o0NW|’T±TºW †ÿ–°¦'‡W£mM2&*½4ܺR£Ø9­ŒÂm¢j°`cìtnžK©Bûµúuµ€Y.›ÌþtÆŽ#ê £ \B_«ûPƒ8Jàg žµ7Ô~MÚPߙɽ"i² s"g<;|^ËE\ñ¶±‡X¥=ù{gòôó7äÕ2Éãׇ¸D+BóeÍ”g¹ ´»jeë››Gª’LAމ ë©è6ú~ÈdS…Ñy.ÔN&Ë9é± VoÏÝÊ9<-¦ˆšw^_U?¹<~_4ùSdE”¿‡bKdNþ8È¡)8©ªR„3ÐÉ èŠÛ$¨•J‹ÖÓ™HcÙ_ï±90CùÝúó&Ò“¨hâ©.ºj4dÈä¼}2/ŽÙ­¯ìqÝ–\Ê"í[o¹JoÉ>U_œÞ%\/4¦pˆ•F$ÆÚû³ˆ×^Rq'®{/öŒA7.â9-l>oãÃwÞ¼ƒp?§fi® n³¶-€E/zN  TLŠÚÌHÓÄßH¹÷Ù4¯ºî#Ç];fÔI/*¼¢+¨àªÏ/ª™rèÇAox]\êÄëÌþg¿®‰ÆYv”Ù÷§ÇoP9[Æ‘èv£]‚Ž•ˆÓ‹Îa‘ZêÞA¼ºn‰[s±<_›ï8æÑD»3#W„³ t^Ä?Û]å‘pTçÀ"nåâŸP5 =7ŠÔËc˜e¿’ QRo¢ßÉYÝçÏÐ'îËÝÊ€9ÔwñOP^þ¶PV[G2¤ÄÝá&1øÈÞÓ¡Ë_󯉽֧Ÿ˜ÕöRNÚÎ]·„#oT™¡´ÿ!ãy=–ú02‰¤€ëöäPR&Bç§³úò¸øC–­rr½á–Ü„ÛlQr*É{\0my›}Da Tà’‚áH+ˆ¹HoÿéXêE¡ù TS}ºnwx¡;gGQa—ÖÝóç?õÇÏkì¿*‘ÄOKJÝ5ª‘ aVšiÛÆ¬­Ucmƒ›évfèëé4Mùj”Ф:®{UÇ­_2™ äéFmˆJ%ܵ°ôY¦΢´–‰Þ$ a^£äp=2Õ&Íóû@°‰r:¥Lù%9!`|—‚>‘»Í.‡ ÑŠo ôzÅ/ÕçL-³ÌS=ÒW߈߸ô+ð¥ú™ò7¨–óɆŒ€ç¥Ý3}´ÊóU*®Ÿ?„`tZ(ñ×ðAyªÒY<æ"!åuß’"3Øô±¢ü¶³§T™…moŒšœ´é½÷qÐÜók#Œ~bæ n™yúléåúØíèÝ3bøKÀ!OYkó]ð:V ÈÍJÁy;ÈX We÷ÌR åæKy/ñ3‘RE§h`|•É"žš9^ÌXÂ.:©7—pˆòk-ª“’V¢¯å>Bò_ÎA=ö)+ºwΔoÂM'Ï dzÀêÝìj«S:oÝ„¢¶‰ƒu½f²ûD@ëõzÈ€ÐçOÙ;—wc0·²¥©T­Ð(gü¶¼ž–µ"óT’¹éOËrúÐÙý\V˜‘ºÎ•~½=·§e‹; ¤M*“®6ù©WÈ¡PÔ8OëKzsD‘Uï”8î&¶~ñ@ÜP6“­ƒùäç&ø|}Jø%ïf˧RábXÃg¯"m¤ÆÑ#`Ek‘–©ËÚÊ÷Ĉµf®b!²DÂóØz,̯«AµÞõ›¨—&¦çUðáÌğ÷?*a(VÏìW™Œ¬ä Òcnqõ€aG‘&Q·&] Ã÷ÓŸ|CÓ<ƒâÄ×Y DsÝ-ŸWÙw‘¿pf•4 µœ !-ÜÞõëÞw×Lm”"Ì8êªòžüÙ’ºpf—4é²`Y¹O ßæÍHzþÄÕK³À ÔH,jÆ#AäZÝy“WUÂ0Q¯6AñŠMpÝêsšål7Y¯MóÏöøñéŸÉ×o¢n¦sMo¾™¢­mŽ];ðî9×3ç+N3pè~¡~U3]<(~Êê½|ýA>‹ÿ³…„úgåu˜Úî[Ø\«¯±{î\­.äñ£÷ä/£¼L^_ —™Ðæ›`PŸå¼Û9”^=YÂ+¸c¿ ЂüÜQÝ,©ùÈ<Þó’úÆfæá¼=c_Ú¹Þ««7VË!šµH.†ùãõòoÕß3VÉÁX"à9Á!``Ï/gÄùjÑX†>ÇÂð6ònç›O»ð2¬fñHQU÷RÕÁ4d8HÿÍô´"L©À'’G?ÈãJN©ïn“ûnjŽ˜"½b™ ÛüB&”3cïJùµörÅ~Ê)A:±'Õ=–m Ç9tøåÈ•hcÔÂßY)`Âô÷"ÙEƒˆ3Z-l· û(ü(Ä6@—ꃙ%Š Ã;æºÆ73ÄFßvæ$Ìw ô×ÉßUª¥<›e"Ní±|ìk@?â-ЩM×ð¢oÖÖƒ±Æ¾Ö«Ò÷ïpÐ’Kõ›Ç¢¥ ^.Ó ‡ðei-ràÀ ] ×cP´Üˆ²ë=Æ,ì’­oP*ªsΩÈ]…bM3ÈHw\ŸiÃÑ[ d÷y§=ÐZ÷BuR-•õç…œ‘yÁQF?ßq·JóMmÒ̼ƒž¯õÝÍzÈ:‡y/ë>ÙÁb>Ôô¼Œ(U:·@MZ(åËXïïYLÍm.øê¿g˜”ŽÓ÷DÓýêôJÍ%Û¯|99°'ƒ½ï§ô¹¼Ÿ¬Ñà²Ø ¡'îŽì×ÍSJÄA&À¹Úa³º 99ëF^8Âbèe-0ƒ#ꤘd û8jup{\µ®iMøUXåwÖoɸè(ÕÔ[¢Ð«š,EÀ•Õ˜üÎ=€m7.æóNê²?ý:Ƶ¸× ïT7.]u/²ü¨ol¼Ö'~Ì Åݽ|-u\F³ER=s$†T”À۽ܗ‡ƒ*Ü Þav@XCk.{ó¡˜òrhßO'*ùmªgX€ÃäU–ðË×®A|xÖ Ò’$½h:tšÖåÇ8‰Km)†î«u!¨Oº—Zv ˜@QŒ%Ë,€˜£Ço¼Ò$ù¬êslÛñ´1;²Ã¾Ú9ØïO?øÄ1ý¨^êeuFŸÕõ*ä*…3²îä>ï†L»YÀJ¡V“Õs7‚÷½ŸG¨ûtµG4ÏmOˆîh¦ãr=qhMb±|©†5ÃïB½ ¿QÿèˆvþŠú6JâÇŒ4abÄÜš+hßmi5ÛœÓׯrUÁÂÎýäÇ ”Òu¼–·{¡jŽ8 „yÀ„·r×Ú"Ÿõ͒ѯY•àâ§åD~U+ ˇ_/|+¦x½#=P?–'ÈÞ¥ di~W Ä`¤^MWepØ_D Ý½[E^1ÐùœÉ¶w…§×Ò ðó)¯o·MKùÔVšéí<ížÙ‡±ÝZõ®3§&ÛŸÒ…Ò ƒ®°Ïüì6Þ7äŠÕ ¯V¤*|f»•…V1„¶–§ê8s9õ]‚ráæeÜ}|á ÂæØ¨ÀcG.€jð*o®yóßž¤‡˜_ÿ´‡_¹óa†´“lñ¿BD>•„ôh [ ¼•D Ôoä#^„FþjTÛWÀa#ºÈ€Ð£Kþ¬ìbu6A¨>zTÅféR–ºô4_êq¿ºŠW? ±) ”;©·wµp){tÒQ~ƒvî’†Ð+c­^¯4yµ¶H(áóIs¶6c_—Jñ×÷æbêI´ã¸×8¡ýÚ­áwˆnŒk·Ó|fEnÁ,W¯¿{?»Ð·‹r­$)Æ6kV3)1¹Å×-‘¼¨Xù©šOÓ]h2£ËFú%$V±Ç„µÌ±uÅ©fÓÁ",®vµºîv¶djÎÙ¤A÷nj·?À/ŒµS-:ó²ŸÈ’«—{’"^R§ýζªBëë>9¢9ð ªÝL&cCO"fÍÆ‰Òø™–«á‚%—8_«fAɦ5†‘ÄÝ(~-p`J÷Î-÷¸ù…»WJ€o*h6N5'ï»[²”zHž»(ºðb˜.‰þÉ5Ä ±.É"_”¾JXúq(òÈ+¦u¢5i±É澆 VÔN£’:Íëyš–l¬(I¤€ÞÔ5@6œPk«ˆè–d W[{g^y šWa5â#nT¶oi.1Xõ²¹/t³ûîÈSÒÂ×kt®— ƒÞšó¢_­]ñ,Šd#¶zž˜‘Ë—’B­Zk‰2½Cá0Æ:Foþùçµ V¹TÀòÔºˆmÔSgIÀ¢‚ÕÅ2à¦í~~^‹Ó¨žÉníWÒ|cº¨J56†°°"i…p †H$]»)ÕšIGCyßš;}G ßó=z‘ªÁ>[zßl|Xé±]€ó[˜â‘~ÿá¼Gy–ï:æÝż⺺%»1ð÷Š"ü”:êŠh3ã¡ü ÊBÏi=} µ½²„Öâ £¹ŽŠ>Ë-õAEpf°¢G™ÔK¨ì™>ÊÁ—N )ª-¬º2‡õòpxÛµ8ïóyI¯ífI3J)Zs£B{,"µ…Z\#~i'ÿ–Í$ËTì%.`\éLüÒFÚÕÔ²M†4h¨2×jöWö(#,àwnv×S*(Á!Ã=;,ÀÓù5,«*–.[B4ŸDÿ³Yºq? ç÷ÖL;YÒè(O¶HÕZ©`îpDÊ•dß«+óêgK‚iÃÜ6­ÒÀ/évÚo±`(ì^õ3*ÄHƒôbÇ8â"~À5î×eõÀžOh®sm~”àzþFgöfRêœò† Ýô T×êM2 ¸GàuŽ<Ëà~czF0 á`‡u­»¿84­èÿ†üw£êz8¬:Kº¶"˜á ø Ò«|Ð;Ú×úExXø;¸t2e>èØ¼"»ºFxÎûœ³Ñ=Ý“ÀGH*‘ çn<ßàOf)·ÀB.ÝI„›q×}[¯ —(|È)ÝØÍäÛ…£Þ¾)|ª Mòtº¯pÛôG„âãö5d€/«¾{C¨ïQþºg¸hža¸° äZÑE’âW/(^æòƒXauÛu-Ì’Þ§ô‘³>ØgÝ4àl»ÜjÉí¸RÍÌPnK扊("„—mšüAó6™cµ:+i3glAÇ{¬qÃÎC[ª/CÙÁHЇx@T[—›xž!Þ äÁ ‘]é`kŸ1 ²èg‚àÑÝ`ä”?tct&*é ”èC컡;î}_Qbˆ 6jyqÏ;Õ²÷¡ ugu¿=Ž#g±Ý£Ðý†ªôkÕûÄŽ Ã×±K~œäz‡¹rŽ:[%Ë^ÚaG™O˜Þü õúÔª“¿ïcÖñ0$‡ý®­S8£êÎ…£[@úQí¹£¢y$K“={Õü˜8þUîc/¡Ê›9ͦ9¸Î8_é‰ð€ó`Ž'ùòæ #‘KÆwÏ‚°¢?õÜÔ@&›TfU©²¸%ƒ¸{j÷ªÜw/¢j?)´:1‹%¦“}¶kš»žêß {¬Ò4‡ŸÐýLHDÑbÊ&F~`åA•p)SĨL*lůtõĵáfD¢6IÚé̓ÍìàÁ$AìÚÚÂøµÜž¸.®:±pîÂs€*dñ{”Ök[ÉÌ¡æC(^H|ÁãÙМd8l?ƒ°üT°D-/žÃ?[Èvép©¬YŒù­B7O›îÐyˆ’,Äf®7Óx~„æÎú›Þj±<Þ;ŸÜD…#Œ רN«ïåkõ¹óšwÞ"‹.CÛóÈö8æëø†‹j¥Õýy<lÔ ÅéÅûÆí†Þ‡e÷½Õ(µon–0EÈw3w—q'3eîõ&`ì•÷¤O5y/ÝG|²˜K‡DCáJêE> {ÕzH_ëÝ2f û gÁ±´̆‚¹èÐc““ÅÛÒÖuMW)ý€<Ï-0x"Ùcæ“’cšìèÀ¿iÙÇ&ÅuQiþEÊUDoÉ÷"òÝ5”&«–úd=™ns×|á{û8ˆoÈé’Ó[X‹åô Šq?:äžLˆ÷Ó|ýLá…õ;…‡•Ô£©ß2Â2® Ò>Kà¥óãqpûUcX;Mß¼€V@»Wy¥]­©Ôp{·KAâ›)í¼o€/o="%r'ýÓ4Å ,¨Ï±¶™ÔÃØd =$‚˜··VÕ«äñ¾ÕæyØKz!tá¾1ølóÉóKÎc¦Ÿ÷ÿW;K#W´dŠþLÓÓŠ19X,¡¸7JôgŒ¡,V˜Ï¡KðQíÇ졯Sî…l†¼Ô&à~7o]ê‚õ’ÏUfÑð”…F6º>Ÿhñ¡‚äÒ‹JÄ~•‡eœŠ#%t¦¸VYü “zí³(.˜ÐHæ’Æ6yz†ÿUŽƒ…2bÕEQ$gøanËe¨ÏÛP¨~éVàº~fažÁ¼¾ºÍ7)”^Ìm†‹CM "( d_¨ÔàÃÁŒÈ!)6šÞ3WÛ×@÷ÈKWÝΠ§@%ý=ã2ôøæ©f¢§³$Ø„¯<¿Ã!¦H°¶+o.†Xð€Y‡T+ÂkeTõŠJ–hI_ƒ~£–Dxi­†*‹‘`§Ï°ø_µ™^ N ]†~3²…¥n€D`p±–t:ñ"?d‹–úy^¤É, JL"JEÜ‹ùdvZÝÉ>óoÈAF±Rg~´‰ž™]¤èm\¯)Á1;½€B¿¨óv~ªªìy·‘>.PyÑןÜáÁ±Þ5;µéQØ\wz›JQ§'޵ð±¢7 ;‡=õt}c RGA×zE\àIqe³jQ燗-BÎ}µ¼ü@+èV)Á±Mk\®%£Ù,r¸L¡¼åb!Ëí¤-–ߨ•B^še#Ec½ \ùóXá‚¥äò%¦¢ëi€\˜^ TަC„̦¢ò´4YüˆjkÕ󮉰ܿ¥PhŠÁɹ};Ýz¨fWÞàÆo‚”aá¨u4 Å_«úæÔo¶ðŒ–Hª•iA¾?´ËC‘Gb¨4¥œûÍ‹ÝɘÑ(J¿ìøoPøƒ{;­I7¬ˆÖÿ׎ð´¢8­ÙÊIŽ›åsê1èÉÏn¨K†lñö~0L!ð³@ Š 4@ÆïDÞ®~"7~¡­axµºlÁ9:<­µüÁ]à3‰ùI3q_Û‘j¯ºbËhÝñyÄýG½Ñ‚YÀyúüUÊaÉ{¸È^d×¾ì2…F—nÅC{¿A¥`ÌÍÂNBhúá+µ² ù …7´k€5ú˜,ô@¹µßÉŽìXêZÀW|qw‰ ´Ny×KqR_ìU1~åüáÚ|½šq eʈ¡Ò8I\÷”r,Èè‡ ¿äÔF¾ZY¬Á€^´›¸|Q÷)|VÌ‘öÐ<E؇¼¹ÍŽúLÈ¡L€bÚY.4)wÀ¿%Às–Cn)׿áRš3@Wg ')_¤Miú {æÄ]Öv«QúôdPšÏÌóT¼ã-¼Èº¨´5¦Ú|Îê‹Õ†Lfs@ºíæ”»å¸Ë³;ðW.)\ư£'6ku™9¶3M¼”'Kˆy¿õ¤Rž½Ä“VÞ6r¼"zWذð"ùm¤ò=êû锕×^mNYÉ™Õä¢t–ÄŸacª@9÷&š·ÒÀÑS%í"ŽÀÀBAoË´,Jʾ1pã–¹ÔüŠ› ‡"¦@Þåzº3– €þK~(KÞz ›<éÓ I)¶P.ÄQ:(7àÌZ;@Ö¥z:üû$]¨pî€=qË(tÏÿNÉÎ0B#“Ôè¤+Z¹†ƒQ„¹©:æ &âÒ®A(UÈÎq¡G8œfxF·‚!wÝ ¯ž®¿sŽ‹ŽÛãäœî|~aañʃ„.k4ïß‹!Ê.ê?wúûï7øœeð3YNÑùÃ}l<†ù“mŒ{£ÍòyÎçT!Á5ˆ£·q6â(0mÀWD8j`±Öþ6Ä&I4ÐKÃ3Ñps« 4OëÏ«ŸþrC×Â¥ƒõÍÏååo¸#A…ƒý%t³è_n˜ L“xQ”©ÇžRvøòZ©§oThÅa6Ëå U«ÁGs{ÍR&æ¤ÕزÚió1BõØÏ'¬ê¥Ø¿çTiÂR©É0,Í3G G:š„xÓ|Ý.aí¶H<`}\ë—.;’Ð ¯HX=õXTÔ3LRy h JXþCìÚ<*ê—Þàb¯ÒH «Ê+Ð0*®@ßq'Ð%îÉ<^¼ËP܉Paw`™2â´õdÂüªkÊÛßžÕ¯Žñ”¢Txì)9þ×TÄÿi=¾Ì[’õ®«êgÜRƒé‰8$á}v¯¸Ë&Ïj«T“J•Ûzqœ™mN€¿5"8QMÈçØIœ~7^­m#¨\8/z±¢N¼ãõ¼økÐu:ã|6f>ŸœÎ%‘C§”A…¼êàþK[ü³×mJg†lU¶ë6âÖ}‘Ö®§•ÆÐ8™1,K  AR¸bÈ¡L] Ãš©+^,–Õ—€ƒq¡`¹ó´by‹È>z"†ÞÛ±¶q¦ñÒúúŸºœ'ä<[v8¢iÎ<ˆšäkŽ23V¬u¨¼nùFx·ê*§÷…UCv–U‹NÎaˆyö{ WŒ÷DtL±. þý"ùû¤ëžÁ_ý~Õ| ku©(í²»‰ «NG‹¹ceFrÿÉê9s‘ÌÆ4µ6´rÙ¥Aâ—˜òز«i2Ï ­Lk¯|EbVwÛx3±½­ÕƒM Qz³)¿#$½ÏŠýÙ@|‘ ZqÏ,ƒ‰ÄfFP‘Ž•Wr'H‹?[ŠUp8ª¥I öÊáØù[ñ, Y<¡ €ÿ0±ýKÍ)Vj|¥ØPê\[}‰ã‰‘åÙ´'ódÞ% 9;²£`¶eZž@ŽŽÆút¥N/Ýn§$Œ=CžÎÐ?^Mç÷«Sžì<`Èú–¿9ÝÈ…ó„3ŠjE8H‰qåÛõ.7áו6@Ç™¡ó¦Ò™(Fµ{ÀdÃÏ[v‘æçèŸö(QqL단…sÒÉ=ÿ^$ŠðÓçð†ÝZÉù"…bÏÀ²a± XPå¯Ð‰3áú¨^P¯¢¹fø@ç)³dëérša€Üóüøë04³Ub‘–FС‹ŠˆöïÃø ®æ h×/šŸF3ùù 'mõ¥Cm‘èp93‡î÷ÑR‚ ³˜ÕõO›ƒörœ¡E Q4INÏ ‚ ¹±;ð5ž;«Ê|ô.ª8Æ)NXÞ³Kì )œ3O’hòqD¾Ž0¿_³Ç}„?nPH—Z3bOfÎØKq¦ ÊLX~¢VT´|žUÅiÆ28@áô0úr!T-‹é} {›SïÎD»©ß멸0¿kù唯ÈâgÚLù“h.€ é“Q3†˜-uQ£ö4Ës¾«á¨òòeZ3sÔ`7gd¼ÏÅ•¤½ëÓ¡"–óRt{•þ®ïŠô9ǧ¿FÎB‘UM÷oͪLêµûOàŸÆ%Ycú]CÌo#šxœÈ¡¸a§ ÷>™¿TLC˜“S7ß§?a(mwê*×L-©îpr‚ݵ:+ÕcùœÅ-º&1E­<Š™ .¡¤1¸»ºÅƒäój"©újuhã²A¦=d;˜½Jë/ZÍ':é¤o¼Õqx±·Ȭö9—â×!¯¥tµífÐgÉ«–VßJÝuz ú^» oÙÕ#T™¤ïH3‚µzWœžZ&~Íø>/©¾"U¬ ZÆŽ© ÞÍ \GÓfæëºœ¼ tõŠ¥Mz–Úˆ–ssN/(ÓrÒN. Òr(~¯5n*™‡U­ÔQJ\6rúRøwýžw¨0Ž‹~InlO'«¨Û™95Í ½}½s¨õÞÃÞ[qthÍ$2÷ qd7»^qúÈ:êzI&åhà+VÁ Æ/¾?ó.1º:gUN'¦oÈ!ÊÔ•ÕyéÄÉ`Ä%v†sè¿fóÄÞB¶9–pZ e%S4p‹C)y32´h@…ØßFÎüd%Mïë·!fä0,(ö™K‰ÀpjNIÑR1Þ€³hBĬàä–N^°.ûó¨õúïcáAËô9" â‰w!× ¿9¦Ãlعò¥Ô3»ršÅ,ºN¤fàHyÚþtÞw¼ bЉ'D­AÃþi#… 0ÔÓÝEÒy[W#ÍOµ,K2ü‹ˆvÎ`ÔæM¼/§ë²š‡â-(V|óV«‰äi™q}ó—ÁVvºþ™ãjæYÓ' t:®ÀÔ^K/Uòz™k/'íl©<ÞHnŸ„¤µX1~$%œS,Æ|ÞW•Á…Šý­™(¿wõ´/è«bò§êož‚ÐEŠ(g·*i]†9`¬¯®•Ú…¤Ý súêv¿è»¢ „‹Ñ½uÿ3Zóô•;ýÑ\^ñÊ‘”¡ý*!j1ÿ½_Èûø1Äåþg© K›É×óf»Ÿ1€ç¬if¸ºHx!çóyo›Ó¬Û—ÉŒR ó쓯|R¾p”s> Á¿XņÓjÌb$Þ¿œFOªáÍaÊ«ÎކnImƒB‹ªñ#@™­ZRƒµö«ÀCø­±ækšñ;p š23â¥5åʯò/ç…bÙ`DŽX%TCx'c= [Ò]3Àò„ùœÃý"ã…ðÎÊ?³û¹ŒÅ8_ôÈMô7EXGÄ™Œ;MkµùÏC8ϘTȪ­Þ×Èôñ‡-²fu~h›¾³ëG„ÝI¼ôÙ²ËC‘âž±i‚ ÐÐ'*õ·˜h°¤ù›'tHKús^#]Ø‹öè¨Ê$Äü;9x9ä²$P‘‰ÿ²Ê÷¶^à˜ èˆfL9ôOûBèãUàÁØCÑD9ÀâÔóu¡ ä–§ çPø v³É,N|–QÂñÍï|^bë÷ãUq\ä¶àÏùP¾A–$ð"Ù¬)Äß«Ñc‡^Ù;ÎR&‰ì'»÷™TÞ®az³pÓóyN´OZA¿_½N‹HK>köCÍ©J]ï÷Ê|©+¬y¯íó¿æœë3o<¾Ev_o½.¤äB®éN^ãw &·l=Y€Á1P,³\0„ÝzËÙô$,O†{ÛáÏ/³íjÆ“†(/r«ê¼Êä}1YxÍ+t# ¥èHªKœgÏœF«xŠþÆ2°?ê·Tg–ͤ4¿{Š,®g§hTÀvÓé÷½«2‚¥Jê«XøãôÇœó"§½IUq¾O|¿¸|GB â ë´BD¦üƒ×0W±Âü,?Ó?ÿ2Ž~£TVRIâ¥Øÿÿ¹wZÁŸ‡¿ÿôÊÿù+ÿãOßÿ7ú Èÿû÷Ÿ~Éÿ§ÀöÿÊÿú+ÿçOíßø/ ÿïöÿKþ?~´ÿ¿Nþß_ù_ühÿ&ùŸÚ?Û/ùÿøÑþÿBùŸ}ÿó§Àòÿ åþ•ÿõ§Àþßô/ ÿïþÿ—ýÿøQþ¿ŽüÙÿOäù åÿ%ÿŸ?Êÿ4ÿ;ÀÎÉÎ °sœÈŸý—ÿÿ)ð{ùÿÓ÷_ѹ”ï:››ØšXؘ›:X8ýÇ>ðŸøþûwù³cÜaçäàbÿõýן#v.##SNcnNnC°AŒ9ÙMÙ Ñ!8Ûÿ4}¿à¿þ‹öÿ§>ÿïÙ?ûïý?;''ÀöËþüÑ÷ßMXM¸þàKàhMøû7àÙ¹˜Ø9ØÁìwØ™8¸¹þÖÂj°ÿqÏ»'YòNºr3ñ SÎ1±ñpþú$üÿ0ü×ìÿÏ} þ_Û?:ð~¿þsrsÿ²ÿŸÿüýwŒ) Lá³èï¿?¡4÷DýCÿýûïÒÒÒ¹¹¹ddvÿâ›ï×Ï»Á0~üæ;IÙ÷o¾?Söý"Uù!õšýè{½‘éîiõJ&Ç%Úâ2ÙëdµTÅV±{~=‡œÍ‘eÏèŠÏú‘.áb¦»«n'sìqƒEÞúÓûBº@ò4s ÷‰Ž BŸ•  ™ ¶€Ÿ.º)ŸO7 4©®:Ë4~ð²£ì ]ãœi–‚· ÷Ŭ9‚ Ï:xl°-3S`±ZîQûÕÍÔëÅŒÒGÛÁ<¨•u»p ÞeÉXαL‰¤p{{¿ýÔ1ÄF¹g]÷Ü8â ×5¾òL05-Á éWKþº5ÝνeÖÝw|×Ó‹›¼-¹zUÛ¤HÕy7E[åÓ²eG±˜^ÚÌTõÓð‚šo0wþˆ–“Æî¢Mà½5g°óµ˜è¹Ï^Ïnl&î>0ñ†c ¶ªÊ¼ƒ·ñqt£àyð¢â¤(МŒMCsxü[Ví­9;ff±š‡kÅqTDJ½õteÉ!`½`g^Ê6+!^÷# ú§3× õÖ$ôXøVô<.ä³ ífæR’Yµ Ǭ~œŸy2¬O*m~ù¡7F­§—?D´T†Ö•å5YÇÇ+G)ޝ/·H™1‹ ¡æ¤"Êêü•Ú&'¦¶<~hLÔ5ùJ…cXùÝ7!¹ÆùºYÌ:¬3aξÊpóçj¹ÞƒMs­~Á„!‰#·É Mò˜W ÿM®"}(E{ K'õ…­ø÷Ôõ_{h‰î/žm;[|AŒÝO9•×á¼µ£–‰¨,J dLÁ·²Ä Ò‘™~V)Çv“N1³NIvA?rÄöÆX–gjt_•ý¢æ:Í~ÏYvkNaŠåˆâ.˜ö“ã<Þìn~»Wœp[Ul!‚›Ï&™€ÿMÿ­Èš®ÒãAg:Á#KZo­{¬×¢ft~®M^©©Ã„ðÐËTåúWà^ØSeÒ‡kn(”RÉ#g&ÍW¿L„v\5^t¾ºXèh Qm¸P¦N_þ¶úàÚé…“ÿ•õæñµÍÖÉ΃Kd3áj|;œ}W›ç?²ª¹dI9“EÍ`·Øq ³c)ÇnîªtSeϬÆbðæã?dîb~lê<˜»¤S€ª5 ]N×O{ßÞz Î2Õk¹6‰E³kPº–³^íc>Üê³ “/ÇúD߆1»K>;>.NÿvVAbî ¾ŒWã=@}QÖ|&äzôcˆÐK½¸kò2Ê„Jˆˆ˜8³«-Y·Bm{—Øö\3ây:%ã ý®¹¼Ä´€¬DšºçvD†¯Ï!Ð[Eœ|;g­‰1‡¢4ˆwfô3=cø`YŽsÚ€-v6- áÕ2okÜ¥€MO,b´Vä!9‹®ë#Åñ Ž½Ê°ñ؆ɜnlIêPÄ©.H}zXö8~X_NÌ’AðbÄ}[ ºw2& >¤5ŒÐýD«–YC‹8¸ñ<ª.¬FA;U&تY]| ÷"àhtðkê­ÍÜ x~L]D)Ɉ'ÓVp@äû< =^07ÝMnäåq@˜^eÇ•,\<¿•e¢ErñíóêܪbYv¦pñ`м´ ã=ùÓ˜¼xp)µý§O¤|gÄx¸m>3ãk§ .Õøœ{åÖ’´:èü%·Ç@.ØÔ…Ö§*à‹çÒYc6'Ì)>µ~~W2Šy1 {#;DzqVè_&3ˆÑŽÑ+½ÆuÑÄ(»äzbÑ>²xt%½×CnÉ)™&œþTå‚™²òhÿhÚ½gÈ.œhê1.&×[7¯e{ù‰ñLâ_̺”h½­ÇË”-••€«ï™T­/  9¯vÖJyYRoKE ©f =l(3IÃ@AD:18Ð><»x>“ÑÇ™ëIø„EÛUÇÅm‘ïâH[?Åš4­eŠÛBu‰»{ÝpQ5!Lì Y]­jùìò Oôo×]®ö £ËŽ7`dßé­&$'d$˜›Ã£z¦~h5é÷žjÕð¶QÃî ÙYÂ>ù°öFc´|Çë7n߉õ5¬˜Á ¢Ôœúó8¡w¿ÞãQ3_ÃÏ¿TOkJ›Õçìê:Y:?îAv›†Š^ZsŒóVNœåÆã86‘v›çŸ­¸…cð>Ë«5c|´<]Ôé'«e•%óöæCŠðÉSì9·,´Ë($¾_P&ð®±›ÚËT6íf:L²[0ÅŠ²l”ä¡Õ’=ý‚™qdò(Žì…­„u(¡WÑ:Ó5¹Iý¾ŽI„ÕBJ'¿ãÍÛÀg)Þ¼º”ÓÔÃܵê×’¹¿ýŒªzÊ_õ.èÎFí}É嬄øs³7YœüôËî šï³_\‰^ŽÆyªÆ‹*?ßgæaP(?ýö÷Ç„·Mkô©‰:ß¼}÷ì2‘¼û3#}’´øGïj$ðˆ]¤ZjïËú>>-’(¢ÓJnjÿdúðɾe˜{µ´ñ2‘ͼ;újJoɳÁMgäz¢ÃíQ+%Ò¸Wo3“”+]c›I¸²ÝaD÷yZvtÉc¢½¥ñøˆ.štàY̨7M‹ã:žØâ˜øôÊçƒkCi-õ1v·aÌq臱ÛYÿô7õ5°íÜR W;jˆí­%jåÀph²r¨Æõç~cy”œSÝ+U;†’néQÓê…Ž“Ë—«¯ŸiÁ/EdÆÇ¨dd–ÝëóÀ`O°Z²ldèà*âu¬ê·rô—(E< ²7Æç¯¥zoµžú h-EXF*Ÿ‰4ªpx¥a'¬ß[(êxèÌn¹þ±frÍj>épyâQ)"&2K—‡Ž¬$–_ñJ #kãZNN_³r¬*9Öéj˜Éˆ{cµ^mÑÙ>ºHM~Ÿ!¸Š®V4 4KÂæ&1K2ÖsI‹ã§A  YnÈ‚@x¿ôEH)"»ÆézAë³£ŠêÑuOyiío8P8Ï F5¾ÈPÑ=æ:Ì9Ȉv÷XpïúzWµ:©¶™kÆŒYEA}j’ì­$ ý’¥…màÆvP²ñq|w-®=±‡rMsëÄÅñU¡è¡Ô»é½+zA|V¢”—ïmðƒ#â ïÞÆ8'cÑ@&^“ll_7¼€´ÿf%·±ÑsCòµ”Ì|.Çy=uüV™£ÝÄ-O¯ÃoM§DÓ“F“RM× ¯íQ‡¾#Á Á¿Ï¤äþ…Xâ{¶'Â¥U–ü~aùmŒäÍ ]×öHÜÇdÕñØ", ÓG1òù=I”Kš/·]§¥Xæ²]^Í p;Ô72 «õÊ+n©‹Y8Ô«F5“UvX2|’¨Î |Òãö%?yäÛ?o=¤6­?KZÑH®œÊÍž"FòäŠÕv€² Äø°ZÔCÖ}ö#žX{,LÓ…\å\víoŒ¬=2]Rffݽ¼ë™8H XR²M^ë_Óò4þ` RâîV‡½¤ãÇ}f¾•ôíÁR{6¬Ù÷FlïÓ)¹5Nßô­ Ym:Øp@7ˆÙ|‹³ò9L£/”ÜZLRØÝýãU|ŽÜ€8•U;…îadëQ:øÝ}Ë ÜE‚OÄjB=Ëõ”¼Öñ¡7=ËU‹”¸ó†Fz˜ìÎõ›-ŒÉÍ$xÔ2/Fß3sS⊌P;¤TŒx4/OGÞÈEnön‡+ ¨¤Yã< Ã9VÙër³X(ô­–[³WBMÒe”¿’q¾R1Ⴕ… eÄÇH…ß DÂjIVØ»×åå j,‡z})ƒÿ¥>s“SšõÇáèFÕ: }³¦Y1¤Uš4®"/ûZehJXú S-›d´ç©^ö´xÉ(ð¾cÔ£ÙSèk9hYò ËÕ€µE1q2d‰ù-¢¤ÇLth”÷lúˆ]¥žooj,|ðdÊ}S¢GíË} þhéÉ# iãXÛ/žBmH"œjÚØÞâïÃË'¹ÇåÍ”bvŸÂ!šocz¸iêÏ:¸m~»ºÀBÕ€•:2¶ße'W“ŽŽ§Üåò ìŽ$vŸ¸­o—vYo¤€§±”ÐPßgÊù=›TÝæýâ|õ·Œ Òáûçt[8bˇ>áÛ&~¸+2³îHì|ùªzÙLJ¿³vq„y0º[h“|ü™br{ðåùR¿Ñ>ÐÃEM1–ó7⦖–,×ß^né¼› @§5râ¸_º¾œÁ²õÚR¢ìáOÆ$3Ynì¶XÅ÷­Þ¶øMØ0—&:&ÓÂ…ÏS{F橹÷Òôl{®À #á·QD/Ä” ÌÄ4:ýfÏ’“ãö"®Ë¶Pê¿Ù³ÓáÉY8|T/:®u/¾öChìR9±’Ë å1Yág&%C­Nò”]‚/‚lѽ)Å™Pn·óC”nv`#þü+aò*+§Õow%G t§D6Õ˜„Ö˜,±t§ªÝè½ Î¬©ûh"èUΪóZx«ÙúœL¦+nöb}•‰"´„Ѝ‰G«úíQ}ÏÈ»Ñ/Þ“ÀÏ37¾wå„´pÌób3o»Uå<5EcÇ·z„¢‘Þ¨¦<¦²õÓ[ÒoZÖ˜üh×_ã-y¼HîýÈHÊ öØÝŽäI—Ùöä’í}‰Çî—ú²;¶ âMnˆ„o&]õ;køn»Óh;Eˆ’ö¼w¯ÕNuGVô{ySM“7‰ç´‹umºä½V66¯=Õáu¨µdU¹ÀŽ”÷ªã~>Þyé‹~Ì8Iv„Œïé+#˪z{¿±ìLh“ɾ˜QXô­'Jç>æq¥ãËÈ—vq€Äø/é,ö¦Œ< ÊS#Ý_˜4©8¨¶Q+b¸È .oqnMªF¹)êWÄÌá @«£8·SÖ瀸QõŠŒÁ¢»nôéåd ÷Æ}!˧{> •ƒ0D‹;ŸÂºOHÃjÿ>þ¹äÊf| ƒ Îþ"ËñƒñggÔÖ|<‰cG`u£{‰Ã)ƒÝ¥¯ã,_ àðíÏ®+ñ1UÞ`qy†i0‘×ê£îtÁý¬ÌÇý%æóë~f!#¶H{ø)Íž~ØØ¶·œ×¸µÜ´ÄHÙL`4vXq{ÑÏ¡?;½ )›Sä-åC½×oª?,gÎÞqm>z~gqÛÇp§;Ù¹…nÓ­Îï븊æâ¡uúÂ7Rº&oœåJmÀg¼&ð\’ßo›<¦yFíÕ¨ {£¸ÉØ!IvDôìa…áŒ% ßÍËÍ2#G=ñ,Yg2ÏF,“ÙCg2*†Ç†o ò[šj'QʺœmòBYÚ_ìÞxîqÐÈòø«@‰eWßOR -䫌t÷­ß J’¤~Þ·¶,ð¡uo<¦(#xD»ìÚhKATý¸Á:++‘{/|ÊÕý.‡EÇcHX&ܽòƒÅÌ‹ÁØ^7 º%í®6S“úÒs‰Hë´›kš@ì“Å ‘ÃgÒ'j1M+¯²WÁˆä±«V] ²Z= ÄÓβ6v_,Þ¬ÄCÍÛo¸Õ*t)x¹<†Ü@Ü8ó˜St¿“fº­îâ{µ7Ô{ Ò!ÊÊ7[š ñNwÙð›¾QçZLœªú‰‰t`/ÙO?+ãDH]PáPÅ–å/(’ý{ ·,é„ÈÏ ¶Þ 88ðP>¸,”œZÑø.‡bÜ=:K:êŽ µûªvÝ(¾ÊÂw·æd%4¿4£·Ýq¨ÈBU/BÀ…̉ ÃGPÌ —b𺴢êá´E¯ ÔìFû…öÜW«Si9Í).1p®ãðƒÕÌg2¨³³¢ÔÄX—z‡÷&ÃDSX©B¤Ì†Ó%©êoNáàݵ3£¿yÁ¸U Ù\#â Õâä|‹>ß…mR/˜ÿŽm¯­u×yZ¡•Å%¼uLc›ÎFBå\ ÓXѱã·*Cö×]“†o TZ[7õpÐ08ðE±Aj{ S7j!Ãß•ü@’µ¡…͉ÍP )¢.élŒíøU ÍLX …À^àÝÛÜEƒ±¹ûwâ覧8dþVõ§ÚØØ:¡çõψNyú'p@PÎÀñ{´cøvw¶1Fkã?“p*]Ç?…ÆÌÊÖÈÐêŸéøà°CñÿoÔL­Ð|ùM0'(XQ’F+8›ÐûÃ5ÕLÃÜÂŒús27E麵•©“)Ø U ¶…€¿;O0Õñ7ÒL­~$ËÄ”ÕÄäοòÂßiþãJ4ÝL` c+g 3°¡•øû#{(}þ›ÿ°p24B,àäð7bPõhjQúìd"ô/hüÏ‡ÒØÝ¡²601µs2?e&åí?ÏUó#~c[S!°Žƒ­“©1jÖz¬'E§-Xþ;'͆ž´ÃïIúß:å?ó4ïwA;£Ü‹éŸž÷ŸÁüÏGWýu„mxçßÍ-iõS~€og ÃÏÓ†ÿâÔÿœúÃÙÿæƒþ“ ø¯;¿ÿgløSºÿGLø›’ÞúS3þe?e¶lÿb¶ÿ9ÿ¯š>@-„r4Æ¦ŽŽ¨(ÖÂé$캥n(cg!yr¯bèd®¦3´¶ã·C]þßã×o07ustr@Å'L0s¶°q[ºX™Ú0ÍÐa=Jœ˜À'ü¹‹ªæÑßFõB“ó¿‰3j)`ÿ1¨ÕßÀÉÖÒÔæ„1.¶&ÿ{|ÿŸÓŽß&‹ÞI9C §+ÿ­줪;©:µˆÓfÿ›$ÿç¸ÁùorãDócÃwÏ€nô¿‰ 6øøMýÿ±‡š©£­³ƒ±)ø¶ƒ©ãO¾GŠ.NΆV?5ND-›>ÿV ø}Ãþ¬züþ!^ü?¢Îe°ÿ/þ§ÃFÔÿONÌÀަ‚Ôlès-”±:‚OÎЩ ­,ÌløÀfæNü¨jGkC++¡ßÌlmÀЍÿDíÀì\`6N>^>ö“w={üp¢6r?=qÁEMôtvè£C>VVWWW–¿ãÙ:˜±žß|Ÿ®€…µØÑÁø÷~v6fÔ`C+'Aêï%è;¹(áY˜˜X™RƒlLL©QAûÉÑ陞ëé,PE§“EóâûqàÉ¥ÐÿéwTÿÔù?ZqþÓ§ÿÿîûß\œÿpþφ>ÿçàøõþ÷O_çÿ¿ÎÿÿÿÏÿÑþð¿åôÿ¿¶®ÿ÷Ÿüÿÿ÷Dø×yà¯óÀ_ç¿Î‘ý:#ûµíÿÛ~Þ_Ûþÿ ðãó¿¡üO¿žÿü)ð£üÿ:ù~åÿø9ðãùß_!ÿð+ÿÇO„åÿWÈÿüúþÿO„ýÿ_(ÿÓ/ùÿøÑþÿ ùŸ€_ù~"ühÿ¡üO¿äÿSàGùÿ…ò?qü’ÿÏ€ýÿ_!ÿÓwÿÿKþ?~”ÿ_!ÿÓwùÿúþÃOäoü×yÿû×þÿçÀòÿ ÿüÚÿýøQþÿ£ç?\w¸¸ÙîÓï?üúþËOßËÿ\”r¶¶øOæþBZÀ"ÿ×oògçàºó+ÿÇOt¾/C^vÎ;†›¡ § „›bx‡‡Ó„“‹—ýWþ¯ÿãð_°ÿ?•û ÿžý³ÿÞÿ£ìŸøeÿ?þ³ù¿8xNó±qþ‡óqð¢ó±qüÊÿõ€ÿ¼ýÿ¹Ü_hø×öϰ\¿·ô6à—ýÿøƒü_˜Q'ù¿j jˆPÿÜþ}þ¯{÷îý‹`>áÕ ŒS€Øÿ–¬þ¥¹âö|r%O)‡ { àзwÁ#Ƴtòâ®¶®xæ^OyºD—\'_ÊVºt¡§6¹\S6ï,&ŽÞëz½'U¢×62{–zÐ9Ûƒ´%[Ü¢ÜcÓ1AM%ùpÖªp‚¨ûì‰úÛÞ¸[mRxV+†/¶ôË“c­4KW˜½K"òñØh"Ñy3ºÃ¯ß»Ø8^O½E+@±,÷…ŽÀvBŸhDw×…}¢#)EÈðÉ×öÂz.¢²…Õ\¶‡ 0Á>hëKÏϸ¬Eí W²àí®ùr RnÒ/›$ . ôœµÔ9¿2£Û8R=¬v™Ç9˜š- ö0hë_èX ¯ƒ2Õ°ZzmùJo:)9c¯kw#_œé6“Jß ÖÄ®·ceaùâØ^D³c‚AÑ`¯8é³ 4/Š­ÆÏ´gÕòôŽW}!ZÆði ÁvÛ)þÆ5^Àˆ»|‡b÷dõã¡2æ´Ýîr„`|³=žoªä¸û=ß7‘;¤G“Q…aQ}µ®Ÿ÷¿ÕšÕÉ™ùìÕÌ„—H#èÊ[Ù¶0ï0`]|»v¹·Wñ^d£zJUbçív§ÃgMß^ë¦0~Ny©ãØ«|ºxzò«-Aب‡VPŒP¢qpqoËë]1+ö²2ΙrÂñå²G†BUØ+OÝ8´®‹¥ãªË¢ýlÀܹ>]Ø­s ± (þX/öÊ6(0Ø6Ĩs\뵸WDìÍ%ÐÀ°Ç¿teý˜Í‡eF¿ÖG!£¨X€×?éâÒT2ц¢pê4'´ÿëëp$íN(ƒüŠ?AdL¿’K£ã(–ÀÐųnlŠQ~¦Ÿ=Ù°|ßæeDw¤<3Â$—í¯å˯_š”dQGw x²xy5“'¼¦õ lm”ûì óP®VPm¾ñ!¥ÕxÔÊ3öuÓÚFéþ0ß;[èQ' ï]Ö|wóÒÚJ[.•tßÁžÕ#3¡°F²)v z\CªåÃA[ž¤ñ÷)v63È·‡‘n ¬Jr±ž+ÚÐ/Põ@ýÎû²[ö6¼Ë3h{¤ñ-Ï“(WFìåy<ªCõC«…Èé±Õ –™—+K¥ya=žð'N‚3àí—›C–>_Ÿ`®ÊzDÝÛÖ8ÛQ7Ñ7+Éeù¯ñî²ìÎ2Wêä«z)’Û~¯ˆ}LöÞ¼ÈX õPþômÒÌà9¬d”xsr·ë$ k®Â}cÛ驿¢œJDlWø}m¸$PôßÇñ|íØèZçØº›q]º9ïµmÙ:Ì‹ÝÐ’³ò~¼¯ã“lÝ»íì€Úê­Ýú†÷ ¸—[ßK³l_c›ñF õOÁä¥5w?¾é¸‰ZÅ s¦}û¤jyÃìÊ€$¥&¼}Œ(\dnyáî!Ws«ÖrI ±Ôfç[ÛÌjØtÈC›H˜áÕ‚í„+ðI„^¾»Â7ÚríwÁ»n„æ†Kç›·žÈ lÑt¾eE"T ;1Úµ™{2R”[Ä|@Ð1MAþž›Àºo$Ûò¶Éƒ·×|o,ã7=bõ)¼Å{qÔfT™t〻þ’WŒâøUýñÊ ×„þƒÆ÷Êþ#Ùޱ˓¼«¾‡›w'}öyWG½¦w¼ŽÓV}WÅ'×ñš}›P»+ÇKv;âò‘oëþèÏ‹ÂûÚ¡ÒÑAB´ …1ÄÁHÝ-ÈWd‡ùªrÆïVIaxX‰(ÝVê¹Æì‰P•U­"låw佤çÆ+5´….F–²wm¯—‚ë VM¾t{èsÜ_Ͳé0¼ãFVWS äÚ3~G·$JÖÛ)^–HºÚ3Ž–ùvÊŽ›êê”ét÷ô^s!›ûuyn–¾\£ëæïck–ìbè`W•ǼÄ4üJ‹Ý?˜åTOWY¬ú¼ìîÎEá9Ûpà{cAô=q§gãÄÇ¡;¦>("¦<÷ U9Y Ü0 |º»Âè⣮*Û-Ú¦oI¾Õ,4,Ðȼ_úûª2µñr?Ϻ‚¸èë¦æíäRÐæÈ4qnþÕón3ײ3œpÌöõ²Ñôb× ©e”D® Y%ÉÉĦÞËèæºSÜ%‘¸#»O÷Ê%ôÿcïIà¡Þ¾'E’¨”¢˜¨P¶Yí&${ø ,µ6m‘>±îèûÃ8{º™£uc:›k°0ðh>TôèeåÈ~Åž[Tªó“Ý Ù›„wY»çüaÚ¥ ,>Pœ@ ïLôÎv¼RKÌ>ßW½­ûäóê¶þÔ»½¯Gɺú·¶¬¡ÒjÒkZB¢ÎùŸåž»Ùõ 8¶OÈãlÉÀPCœ÷u7!æ7Ÿjw_°\–šÁ½ }Á÷Ÿ X7d;ß#]Ùpï¡èrZÆX3ýéâ°d3ò­×ÖœÔ T=Ë]›#áâµØ¡äl¥Ý$9Žáãa…«¸!Ÿ.¾·®"¯WùªÓ3¸!ªÉ '.þ°“¢cÉs¤koÏRûP¥]Ç•–ÈÜMAÝå5³Ÿã®dg§±ü†ßÃvvcáz1òZFËÖþF‹M[tM* ‹Wumlý-\œø–÷îãU‡N½¬™‡\·1¿ìÁÃö¡ºžOWµõD¤ÈC9¹r¶­mùÓÍ£}èõN õ¹žHòæçôÃÅa½£íòÔÚzÃȹù\áâví^˜ö†\pñg'|vuÞKÔêÌõ W2½j˜ìÄ„nÖß1t^è²õÖëÚáu¦$Ú©su`þÍÇÓ€©}Émj¡Î¼…p¤¸uÅà:INÃ\û#Âè&ÝÐFlaåù°\«ÊAì°¤£z£VaÕ_s{Âê•I÷å§U-g?êZ¦¿÷¿¹;ôjŠ"8¤&šÔÌSNõ^›d’¼<³Ó¼œJ TºÙB .JT+¥»½¯®¾ä´ãe¯9ÙWú׫-„‹¾Ša4òN Q>¨Y¾ -rhcÓxÝÆó-eMNØÂºÌ¾9ÀD¿2&¡¿ñŒºÏ‚$Ç,½°Ü¼d…q'¿íª8uû½À³ân¾ƒÄý= wÀ+|’žU=‰ˆ^Ƭw¡Ÿ®k¹XïE=§ž9¤æuµŸënkP„??5¡?øxäŤnžÝÐ0Tîqµhß½È0µÍòÕäâUï¥îÎS““8PëT©øŽ# =h&ÚA½*y8PÛ –$u)¸êˆpšÌ}匓ioš1i­ŽoD9 ^¼Yz5ÒgûÊBç«çžÄ¹ú¾ïó;§ƒ*}úä<¹säÄâ÷g„©s¯"\N5EØíÏÝ©ªü¶ýÑó%/­hyWùèl4ý€…ósò(¤…çb¼Œ]{ÒÊ#œ3S‡jûLŸ… '¾ù€³,‹9ïâVF¨s(ËVsiw‘ "º¢{,EBœ>¡³å‰íì¢÷"¥éN‘=ûÔ*n+æ-¦J%­4àóâJw0@V"§Î÷Q¾½›ÔækmÄ9x„§ïVH/Mw+~Ò_lvïºptB×ņ2<O§E¯ŽŽéÓ,x" SWQ×  ã¾* W—ðK©•ƒ[¯•#”ЯÒ7gòÁÎyÝÌ+½,:¨ÿº9D(ziö.FtöÖ&r£Â»!Ó&°—WÜ#‡|t± îG {†W ÜÈs¤ªScG'§z½€ ±µE²g©¢Å‡vŸmÈ‘?õsåÁÆg²\ù´%HɤÀŸ(i¿g2,ÓÊPô]Œö¹¼:^í+Ô4Ñ£ö<ê ð÷õ¯º^_º3¢¶.%)™šáüÊ’î%žËAˆ <;·¶·ëÖéÅY†ÏLë_Awû¨· Ye(kì‡?C¾+1¨}—cÓê°ÝÇÕ°ØrÐw!¢Q&7§%ÔíýÆãþæ §«­ê†kàŽí¸ÞGPë—Ô¾¯PÞã@qÀoïéÊ~•mݘq{{0’UîEõOÚý0í^ÝU{‡Ó êeìÙDÑĬB~ÚÍ¥T}OºÃ›<>ËÊú—*ižy¡»P'»†üo«L¶´ ÎLí´Ñ ¹ŸRgy6¹ˆVͶn˜Bý“ëÕ~4Õî3ë:·hxrägm×Ãzߥ”mß{ýM-®º;ßïߣ¬jÙùÈ=`Ã?ßW[!Jý1ê~íæï3“»· u=E5Òèð¬ÀÂÀú'ÎÌíú²&¾Ê¬€Zæ¤kjûÐqÇ¢çfç85;ÏhoÔ¡»ËŒƒg=+>¿gÉ™­6NÉ|Ýsü¯­Pڢ˿]'±+eCõî©×L»<ÉÒ §ûþ<ÅCàê¹â~¯ÍÆ«ëˆ{ù÷+£ëe*œ÷¼qÛõÊö}þœ5]‹U¸;V$DÍõ¼u»ºù\¿ j½H|$ì6ÒA¹FÔðÎp =ç¶\lÐÑà|; áø+•‚n‰úyÚ QRIÞmOŽkè©©:òPçö½ÁH^4Œ›PRÕçÀ"[›µ¨³ì¸ÓβdáÜÐíDx;?¼¹¹Ñ¯Ýtnߎ£'ù)µ<Š~´f,¿Ê‡.Ü@½¨ˆËz€¾êË¥C¬V󯸢¥ÿ°o J«± –C(<ôl°Šz<£ïE—Åm;zý¡â§Ÿ¥{´%¿ùÈB¡8 ŸedmYìæ¬ùâ…a-G(p¤, SÞ!1Ò‘oEñÉ^¡‘¥{†Œ+ÝU9˜F]œâˆ·¸¶+„ ¨‘up= yâs=óÄ«N7ocTV´œf„h¡`ÛU'?ˬƒ¯l ´Ü2%îÏ~¡·8 ê¨`¿Ø…þgÔãEéÌî„q½xd]¯5ïC]HIêwëªP|ÑoQ«]YÅÑøBÔødŸÔâ:ª 5âRgFãºÌÔÝR›3ûøUé­y›×pÑÙÄ1^:0!>?®öÀÔ£'ß®&„ô8 |P¯àóàG+§UÛˆ*ߢD ™ôöVµ¦\{1¤ß´È{¤L'íXNÞKõ¤ä‚ûv÷ÑÔÀDJ 5ÚA®„‰ŒqQUv×¼Õ«–&GµûÅéX€u8Åw8«m¡wãKŒa¶eõöG ›¬SuÜÁ³#îVZt¿Y}N-ôÙ€‡äkŽíèçõOòC*vˆ«:Ø?¸”ìð¡jÇFçêÓÎùÆ$s n<¥Yî‘ lïÌ#„lÊÕxœ†ç…öØÂ³ÑR›ÕÔDjdQoxõ×¼mnÈÏ—Úì«C \«~Ì+¨˜CK‘¢:Þû=sõž¦þ»œâ£§?œ™CŽî¤«Ž^]·ËBÛ3½=¾·/¬ƒ»cáç·äÞ*ÛuÏÓ}8óÞWE´†+¾´õЊmÅàe_:7=QX¾æÁÞª{&”ï‚ȲèþpÕ¾¬(>jïöü»kd…˜yÚÞ92¸Ö¥ñÖÅMg]gÖEžBU{x¤pã‚È‹|þPkŒLì‹EH0’ÛzÌÛ|p…ªr›ëÁ ‡*¹veö Öz<Ë庬“××ôr`CbÃK~AÞárõÁ¹ªG3ó/$3ŠüDNä'³€Òãî>6ÞŸ’u`½Ÿg‹£*ú&–hÓ à'Qï¡„k®7èLm¢5zX¢w[ÑrêBëœÌèªÞ¢5G‰oærm²Î siû˸Zéû1cšíÒj*ê^²‘ì”ùò¿ä ØéÓž½å:Ö)˜¥!Ù¹/'ûl=Ûã‹}¸žyúôPÚB~ÏJ/'îE{-½ù¶@Ïò¶¨pÌ­E?l ­Sd#µ©í*÷Yør ˆ;,Ó˜ÈöºÔçÖ'·v)¢èJŸ‡MUŠlÚ2»µëk=8u=U·ìçˆÙô Ähñfð1§GÝoh×}-SÆŠ`;-ç¦ûôù> ã[ýOÊ|‚öÕ¯=‹Œ÷ 3æÃ÷ŠSZÊcEÈ:STdGûòùÔÃQW醴ž·pØ:‡GÿN÷‹¾Á×ûè ï%4ßvñ\ÿ ¥Ø©ÎBÄ"¨¢¼v8òÈڔ͌& î•Þavùgª6>k)v¨@ËUÐÑ´­¥ùðkú·ú»Û|-"ûíBü[ræP÷:ªëÝì?²ôeZñºêÁæÆ¥.ÃÕ{Ézˆfdz/õefª .–ÈèZc…¿ê4?õÌ:\ÖÅwoJ}ÊúUÚë÷2Ÿÿ–{ý¶sæ' ?¹ÐW·ûTÞ°ßög±Op`LI*Á²Þ¡ôQÐ{ÙÝ~ëYΣK¨ÓEWÛ7Ǻ Iš]‹ôòýšuY)CænCÔÞÌ€|M“Ö…ÎáõîX_¹†d~O½¼‘W^þ&\Yß·D„ÙFÌå?ñMŸÖ­¬b|6”=êáI¥ ‚$ ½{“¶ÎÁtè.2̉ríê30x&gNËÑNv²2Œ”_®?wÉ »˜ù 3§+ëE—„½vdÔ'¥kÉÁ•W¨¹áÑ‘ç£Íh›ï¿øiFË»pï ©¤¼^{ò¡ÿ=Ât6¥E"¾õMÙ@ Ù”¾8²?Í!E¨±‹ h/pþû^ÑߌžÉÍ鮤óòZ‡¢òh¿Ÿ9?Úíëo‡>œ_™tö:ÄNÿúaä: ÙLTé(êêλ<üоÖ9 ?ß‚‚h}Z¥²°‚ j¸|·J63Uõ¨íp÷@oÏéÁ6⪽ѕŸM¸5¥͹Y–ÞÛ¹T÷wB­¯æud÷ùð&žËá¼‡Š»“«NßÛþºøbß Qä>Ÿ•›Š³´ué¡Í»e];·Ewþ^Ö6|â$òtmY¨ä[ú}½\t*C³£«›]¤¬_¦k_s qâ™´ý@‰T‘xLmάj¯õž›ø·Ór«ôxÔ¥¨¾…©54pÜd4¦ï ÞÎU1¤Ô åËÇcz/FÊ7çr@0ßãC¾ýóªÇFé~ß=‘š=73¿o¹vgò–âÍ„C²KÉôMµþÜÞa47¿; Ï þRË_Ú,Š~¢ÉÈ%.Ž:¯íôSDžÉôÐ/ñ‰(z(¤”Í_ÔÀ“9´®U-Õ¡&K'Ó-—3ÊlÚçÕŠúXv¾é¼+ý±÷tl_#YìŠ(@ôúâ§í°CÞŹ„) 0¡ïlWlj¶A¦õ*Ê­­è{<° ŒFZšyŽ(wð-‹H\ö8]‹idôÀ÷ƒÓø÷¿?Ñý¯YûÿIãéÿcï 0µÿœ¥ÿŒ¤‰ô§àHX[ JM$2,>ÐÎß`ç9Uš¦ýçýÁýà±YûHp\I nokoÏ0Àaap[ –ñc§`¤p6ý§Ó4äÚvžS¥¯Ê?Ba‚þG(À!³ò?i2ûO¸Fò'àF­6Á0Ei(+H#ägÍ6ÿ+éëò?};Ï©ÒWä&€üMþ³óÿŒ¤¿Û²3È]ôÿÔj3œ |IŒÙ®\IŒŽŽö÷÷G¡P;vìÈÎÎF"‘¢¢¢uuulLãO:;]ƒm¼ñ'×ÝÏÆŸúd!þü¡e”?µë@:¢K$)U5¾ýmY§ UW~U“iAoAÚaÉĸ?L«2×jöºÉ>¾™Ñ{³»>™/WºìiÜÍ‘›k—s¶½¹äq¦£ÍÕÔý±#Ðq¿¸¹ÖS^}ø-é6ŽÕÃãc·—D69â¶>/¹ •.ºå»vQgöí¡«8b—–Å4ù$:„t<‚ ÙÚÇÙ{¾ sÈa¤Õš_pº¼4óÁk·´ö—=—bûÞZ!ýæ«E8¾3œD¸çå³ Fí!&+êàA‹Ž…ø*‡_P "é]™oÀÑ+"vGl’˜¯}rèâí Kê†1fÑ;h,÷1ÈÈ!ìùQÍüW\oŸ,;§Öû¨äA¬-üÖ I ­^Ñ0¦¸¨¨(Ä¢9j«[hÅ‚O*EÏ”5¢…_‹[„ß\¡V#¯>=Šˆw _~¿YU5ÿý¢ð¥6Þ<чжŤ>¦ïÉC^àôTR»ò)Ø|S4öXØ1*î½Çñ¡¼¼{© Z5e–²íݤÎNy-ŠhÊ«çW¤Ø‰Ýêé¯uÌOé*¥ý°h´ž/V¹¨Î 6Î.AÛÇçµöN©NžÉ‘;%mäU¹moç/Ó’ñÖŠçoÚ 6òU¶=uª·$Ñ_òãµ: éòF<ŸŒj€ö˜‘^Ðr+=³‚;WͱÈòyšwºü7êna~‡×GPv§Ù”´%Zã{ÏЭjëQÔyž¿ dñc/§e¹tŽr/‰jº”')ËsT/8IUÄÃAÖéf‹}#V‚Ò¼Lä;Þ¶WE“—Wæ5)“M·Ui>,ÿúÞuÁ£R§Ú .K¶AÜ–>~ç}ð®ÁÊV‰A’§RLÖúRã¡3ŠÔPçÏ—x*ŒÔ:Ö$4ܹê&«9ÓJéX¶±E+¾õE«úÂ%‚±spÞ]ñ ZÓg¾ºï±vBLŒ­fÑN‹V6­‘Oòn¤Å@8ù7Uš5Þ_‰Ïïç$‡ò~¼¡ëÀÓR&ƒÃmÒ‚¶J¤êÅ–½@ßh'ØÄ°óÊþpƒ]ðÐ=»%3Ñz²ŸNáÍDݨ]ÃnÓÊÑË‘m´€ò¬$Ç!_tÿ‰%˵œšOé‚•‹¦¿f|`²ÊDÒ³ "ʽU#ëÛϳS^d4Epîªþ¸I¼µÔ#ã¹i‚Ÿk•Þ*áqÚ¼_ÚšßC´¾¶!Xµ‡¿õ$xÁúÆ ±Ò(Ö‡#Xõʪtªo~ þX±gÛ‚‚ÆÛؾ«´ùOw= ¾ÍÒü;Ç×—ø,/âÕ=†Eã—Æœ´%çÇ Vo¢Y ]wà[‚‰Má’%?Ž;ËdŸa¡œ"È›y9ÖÓè·XýRÞÍÁNÉ&KÔ¤<L-mIàpä±¢,Jó˜{+°œòûÚL‡°öåOÖ÷.Pn*Q!¯Ê\³L¹A÷pÁ¥GOõêóÄ $‚–'qŸàã5µ_&Ú·uç¶Ø‘ío òÏüí6OGKUw¾²¦O%§&×zMÙ(w°?‰¬3Ê©m¯® V:4ÈF]:Wò §LÊ “»^÷É8ìÙ»D¾CÈŽ°³ CHëÀJ”{`èàcÃìA¾¬æ-©ÃèFÑWïCzè‚YÆf­k^~¬éw°^$]—ÝõJR/û݉¬w×[Cw}z8Wà²qF¢TW[R¯ºÚÀiÍ0“‚¿o°CØc^ݧ½¬ðýQ+-Ñ‹Z·.xãU-´4>²þâÆ}ræ=Y^¾)Π{99&5çj@q¿ÞúâÍ‹aË ÜK—®€e“Šä¯›<̽À–~¬É*¹ç¤PëCõM·×[ŽéÖèqìx* ñæUúî&Åm%J\—+ί¤ìšGdÿ„¨Y/‰X»6¦°Xì#ßñ²Z%s>«›'wîÎEä†ÃöÊFDhÊ]}&üûBa×ïwEsd€}áÚiÆ&±ƒ¿éš\^* Œçý”°/1iù5Ì’ª B}½ºFà‡k4´âptá¤ôÝÊ+„Ö-2ºÙ§ÙÿDZ˜Ò}’óÜm÷L{ëXQr’¸àÍý¿Ý³+Áñ‡ª7\I<-Œãêã.åP&8¶ˆä¬OwòŠ– P˜ ξàp_œ”þ) fîVÜK‰¿uknv¨•퓸Pîͱ:ŒOÕXŠRQ.ܪA»ßý»¦ƒáµ¡ aº­GýÏ̉ß—d\BpzW–Ûk>á;²Zj^²ŽXÔaÉ»ÍBdR‡ƒKjÅÛy¸¶•oßk¡ìUÊhH-í¢™Ä2×C}W·Ú8ºá°5O£"tÜx®ž6g‡o>¹1¦‚Lz°/bý¶J‹€‰Šö]÷9›Vcš/Õ°i_l©¾¿k÷ùËì±ÍáBI×ñŽŽÜkøÄt[»µL¼5 #ò¼6g¹ »Ö°)kŠ\‰5_4/â­†¹–ðÂÌ>{F†Uû-ÒÊáLyŸqÇ*¹æt/V•W­Ï»Ô:·DämMhG½¥PéÈ< c¾ˆã©ݰÕŲïðÒIKw*çYj™éŸe ñÐ8i¤²eSݧ(8¬íÌþ‰žïµM«²¤8!()6z+¯•RÜ—òÐîĶÑÉÔ^s„«yŽX¸×uÆJaö þ¿˜Æ¯ÿ"ÿ/³÷ÿg$£?æ'òÿ2ëÿcFÒxúÿPÿ/p ‚€)@gßÿÌ`šHÿ¿ÝÿÝaKAã0‡ïÿ ÿˆÿQ`ÆCÀfÏf"ÍÆ›ÿ6ÿíâ¿}Ö‡ß%þ››ZOàåsÑÌÄ›Nÿ˜±´HX`H?G9fFù1%R´])$¯±?¤±pÐc¡€G?`¦é«ï &‡‘WíÚœùN…"n,cúq¦hl\KÿZ0£){ßs@›¼M{aD‹ÜÄü% ²#œA ŇúœC1ghZ3†‘Ÿ?æh9 ñwŽú"’7@¼ÍZÓ§ÝWÏ¡ Úý?b4=yEX¹»ÿžÌÐrLªb€R)Ð(Á}Ñü*™•ÄÔYüfŠÒc¸â]% ö{k!;@–µ=ñÌY[rm íù91§4h†Ô,T,åû*Ú1ìÚ þ·0šžÈ*0Ñûœ©çjO`M´ŸsÇæS±Ÿ3:©~oð×&“¿NþªúUD'"ú jøWĘ‹ôÈ[Hî¿4U§\B1±3ü¦õÃÿK%Í:p:¦î®®ß$†?F_cC"”Âz4ª/Š8¶ ˜1fü׃W˽Rø{¯Ìñ.XÒ—%0#wcÇÓÁwš-Çû‹Ò5ˆpzx Š©ø×¥éW‘…1‘%£ìG•鯋éTê‡f`øy7öý¯3F9&^$,š@ÂÜúkï«ÈÊ";zôkã:]5;†3kÞœyM;ã²ÊD™2IO~yi…01ó"þâÌûÕ•¹ü¤w`d:&Æ  €@q° Ž9óÝËÏböõ3ÀaÆòX‡Læ ÑµæX&àlÂ3öAc9æXOЦ»½= Í üØ~ðçÌé*ĉ¼5AmIº»’ñ®X ïJ¹Q œàN™ÖüT+ÔéîÈO}Â25ŸýJÇ;Óðÿg¾|DÂÆ~²ŽÄ<0Æ–bûß.`Ëjäîò͇DÿòYýè>ý_?çÞ[cìO236/ƒ¬MDF6s "©cÆx' Ú°aæŽÏfú ŒñÒž±?Òû†ÃýŸð pÚ$”0KùûtèŠõø¯Ï‡JcÈ›~%þU~%ï_[àÿñ˜ìÇ­¤~Èòi"#ü Ûà“i^­Š#Èxo¬š˜q=ƒ!aÉdó*‚š˜­3°}SS Ž¢“]lÕY÷® Cà¿‘‚ @`˜2TIAäÁòLòq#@v^£†ë DG±cÜÀP–“óððý|‚@rcZÁá´@ïâ"“ÐïM]Ä@¶Î5±±Æ/ »ñðŒ3V dl»±$51`vdZÚ^P•ÅÈE–1c·*˜W=Ôg}ýŒiüý¯ÿ…CÀ±øß³÷?g$M¤ÿø Ÿ(Xñw9Mÿ_С…ÎÞÿ›‰„UR€ á  † å!p\UTR²WøÑý›Mß7MGþÿW_“°²ßg¸}Ô=ÔQ‘éúPžŸÍ¦vÍj›E"â»™®i]¨‘´)ÖÞAlÑ[Á[éRl´ê¢$eÎ6Íd®§ýƒnɼçÙB"’ÚF.”u–½¹®x­í]œ™ é¥øÜ3v˜Ò7××Êœ¯ hØ"C:¨õ›’Î-Ôy¾²~¶—âégýÛ_¦v{ ªúØ‚©I=Ã…_|z´·G|YX:ìŽ7%b$uDËIrNgé)„ÅTÎùý ß¿WÚ´νE¾ù…ät·@ïª}bkŸõŸµí”«7×¼*ƒæÀ]óßV^$¶«2W¤4ëªPwc[ÔwÛ5…¯çP´ÐN‰}*¯r(Å;7tíO[ühÃÆÇ Jùûd³‹?§ ,ô<BÂöd¼ªf_‘Ýz–]Vû¤é]3Ía6%7=¹x¬ ê"Zù\²ÌÁ*=û…|¿/¿µ©šÃê´ò–§Kù¶ïñTÔßö|…ªö“÷=®KÝtï»”YÿPÿ£µVVe°ÜÝÊs™o·B6ö~š–¶0žß&œJŠPJÝyº›>GÜ]K Ä‹s…óæÎZKjÍaœ‰m)w€N¼$×GkÓ¼vÉé­—£ùš¿MÑá}L>™õþõßLãõÿOÿ6»ÿŸ‰4žþ?6þǬÿ·™OãéÿùÿCÌÒ&Ò8úc"ÿYúÏDOÿêÿo6þ×HãéÿCßÿÌ®ÿ~@šH<ÑBaðd4a–„RÄÉŒš¥þ?Ü>þ•þùü†ÁGãÿ@P8„M"—Ÿÿ1#é×ñÿÈäÌÏŒ)‹™^úa¸ÿSý¥üA~i‡1ër†B~áÍq#17~IE{’­ƒ À§‰$ì$¹¶ W[€oœ™ŠlÔ †ù'H•L´uý\Mp­ ·AUŽQ ¾`|U«*dŠª )ªBYU¡SViˆ^L+#$Z ‘—‡1xx‹±©–6PæBt§0Gg20Ø7ö Ϊ ŸºoLw™DÁdëÂp› „BÂÛ¹S˜÷Z˜^4q"øÃ–ÂS@xggèa{wgéÉA#X Sƒ€€vè™ëo3iííÐ05Õ02ߥ¡à@)vv´ x¢3葇- Ð}/Á~rÈ ,È SC6Ô6ÕÒ@ihêè™ïH -zæFÚff ª€4@&¦æzZÛ 4LUljbl¦- bÕäPYP§†ÊR­+æ¯á¶%1<“¢±®d5w@žH [¦ÙæQµÏEd3,vrÀJ,ÀJSfŒ ƒI™õOÊO` ™ÅÆD¬«®‰‹ü€6`¹M ,ÿX°ü?àë°Ê( È“»e'o%½à©¤w 6³¤<µô‚4ÜŽ"‘•'oƒ%ÆàcF2Ç\lÉ }@i;à±ÀZ´Þ™¢BaæÊ:ý•»É—ê®w ¨L’%Øà©[nòº,ÉÃAÊX¢ž z€%“ $1uq¼=Àpö Œ †7^gâ&È’*°Â?5:VûŸÀ0ñ®Øée‰Xq`'ÔfÉXiÂ(AX ™ÀÀNX/ #¦Îü kÍì.Óå¨Ê„¦X¬ O»)Ã1K˜ù–ÆlÉN›bñ4:}óA`ËXÌ™jÚ“ÃBYÙƒˆ%QðØÉU$„Å—æË/ä3=W`µkëü™_@`Ð…ÏK0116wâä YÜ ù7¹÷sçLÎÎÎø=XC4SE@#™ 4ohQ@µOÞ3ƒC¦ÃàÿŸžm¾Ç:‚Mè°îü§Þ±¢ôz7ê›ÚP4–½C33%…ìaKõP 2”Ÿ´ƒP–Cå¿Y?@Y‚ O(K¡SÉ!cÏ 5Ö6ˆyoEr‚Xl °äSJrÒ†͈©3jnic‹Ëð’š ÓP–LC'Ê4”%ÓPØ7ë!òUˆîvÀ þ¹kcOO€ÌÒP8ÈgB!K©`ð{˜—æ™@”'4À’^¨À%_hbhƒ 3™R†² ª8q Xl UœQv0¸ÐÿÇÞ•€5qmaP¨7ŒŠ¢¨‘ŒH5@–ɆˆlBP°‚HEИ ˆ†$@—²‰¨DÑZWE© ¢qÅEÜ.Q\°Vû°nˆZ­}wÂ$T[J¿/÷#a&s÷óŸsÿ¹sçÜYvX¡À( aÒŸËo²DÜlŽ(2a,2a™0Eoiê·ÓÕ%¶¹ùWÇŠä ï `+„⦪e 6*@‘|lŒ0v€Q¸À4l 4‡˜VFELÿ‹zB$‘£–?ªåJjY´) 4_WÄ0Û(Vaf[´£ 0Šg˜…Î?¾ÝWà|³ù†‰¥q6.ÑBùìh Úl Lüí"h(Äi$Lõi(Xi-ñŸ¦÷&›o Å4­%LíQ½ÛÔºµliÀl‰Ž~ÑP8Ó°f”†"—Ö’Õ' Šnš^t#äŠñr)ÞϯrȆœ¨œ~6! wš~¸#>ÿQq"bÛ¢‘†E# E#‰¢I…o;ŒõUÙ^"&4^'üÕ 1W˜ÐQ¸ÒIO 4 …†Ò°é¨rб–œŽ¢žŽ ~¡vWëd…‚–Ž--½EÐê×A:Š[:MC ^þÇ`k„"’NÇÖ…ñ jDGaHgêS# ~<TOK•šU!:ŠLzÛG~7@Õvx 6§,’ØÏB\¡œI)lÜ•CåW WF3pýlÖÈ@AÈÀ‚‚¡cz?µŸ(TÔ¿¯Ÿ?Cg¢°0Nd V¨1à¿C¨Ž1°ó6 T™:æ]SÑÂHpÓ«”Ò=aÑÒHåîFÍKUC£ÍƒF€0R-‰Ïn2ªÇ ,g êÈÐQG­¹±­œ¥T·ºÅ3Q]b¶Œ{ ¨šŒ<2ѱ½LTƒ˜X b¢ÄléV±ÛËDõ…©£/ZdS=ãáçÑ|ëQ3á6·^=«Ò8ºûÅ„ãG„ å0VÄ"~º£cdøÑx’Žt™( ™X@3Q@3õZ=¶ùV¡ fê±f«”³2€|>†™(†™X 3Q 3›È÷$¡3c„bLN,,,f¡c‘õÀ'õm¹ÃX($Yúï5; ÙJ(þüþb¡pfa™ E( A¨·ÊE ©± }X†ÁBñÅR’7BnÃñê$ä›Å ËLX(šXmG›+ˆ…c•%ê˜  , ¬¶sâµRyŒ¡l3¶Çɤ&\Ã?Y[5Ó¦YÖ$¡$FÝx?"FyJlK=Èh=0v’Œ>e%cŸ²¶…’ÑG­àðÏŠ¶÷"Œ–ã`¯ÒЫ4lÛèè5:ö½¦wö™ ”ZҤЎàjãÓòÏub1ïFPOf9Q©NdØàâ£íõ_ÿèûÈþÏ *8&‘)t†aý_»¬üw¢œQ$‡ƒ<°çpÔŽ9̈O^H"é[ÿG&ÃÜ´ÿ3 œPÈd˜lXÿ×áß³þA&L%.ãš\4)‰¼Á.áÿË–¶†þ·o ÝVT*7ˆj­‚ŠÁGÅ2a£w4¡jshÐdÑ’:+¼òVG9Û‚LDĨôA¹H dåäÌC|¬éqqÆuðyº¾êéqs¦yi°¾‰˜Àý¹œ+ñ“F æÎ2ðQ:#46O¹@)\,â9D¨V#©\Ã!ÆFŒš-•Rº½q•'­ÆÖÓdº£€ k dC˜æbv›&Ù¡bCšòù € ÐuFÒhv9½6z¢Ñ-Õ@Ù½>å „2@Ù¬æâ•N”¸i‡NÈŽß|`t…Ñ.:t™æ(`QõøÒfŸF)3²3’+Ph¡P¸ÚHÀ~ÝX¼¹3ø¹ñE_BdRÜmëȔּLU]‰‰à"qa‚Œ4 ¶@4*…H¥ƒ“ >¬¦J5Wt¥©é-&ÉL‘Ê )dŠÞ22¨,2ZϦ“ˆ:™H£Ó‰&SoîTGAI#÷Ùr ¦­äO‡iD˜Ê$2@/ÁtšÞüY M†ˆra¤¯0 ô’Dð¬žEQÎùØàcOåR™z‰—Š'©£b² ÐNÆ“ÊåÒH}þYÿò¢ÑFFÆW6Ñ¥…ª#Tw™-!´-F ˜œš°jÑ6D¼MÔ-FØC)dòæ€Çc!ÕÖ7O”ÖõE xj4úÒ šR™`ÀSù¸©ñmÉT®ÎÁó5cUé¬@ t h‹ÜÅY><ÕŠ|'gGÂ㑟.¾  øo„òyB±’¶6ÉÜ ‰åR'1¸§¼ìªœpP©0h~¸ÐAn]Z‹¡äu€ãA™ˆ€âf+’‚®Ò®ÉÜJ2Op“¢™hÕHó™oÛ|æ+3ŸöÞK Ú.~Ò»+“„ÂÏyÿ¤…—HþZ·Î 'Ã0%nÿ`Оÿí@þ þ_Ú%hË¿ùÿaäßAKþaÈÿÁÿK»mùw ÿ?†ç¿í´åßüÿüÿµKЖòÿiàí´åßø¿ÿµKЖÇáÿ’AþíPù3ÿÙ#áÏÉ_¹ÿ™nàí4å/ ‘:ŠþÓ`ÿk— -rÇ‘¿ÿµKЖ?¥ãÈßÀÿÚ%hËŸúÊŸN´Fùü·KÀÊ]Î"”ÈEò¹è*ÀOßpöl”?Œøÿ¥Àÿ¿ít˜OáRx\ƒÌcòx:“Å a“ƺÈý§ëgoøúÿÉÛ@¶¦ÿd óZöŸB¢RýoÐÂþ$Í…šbt5žÌ¤É4žÂ"#KlÕIhJò¨½O…A\ “A\*ͰR¤†¶ëÿ§oÙŠþÓ)’ŽþÆý_Û%èîÿØ ÇõÊýƒçãÇ‚Ã÷ìׯ_~~¾••¬´´tÓ¦McÆŒY´hÑÝ»w9Î!CŒ”Aä}äioÙ­²äœõO7øÅ<`(ÿ9¾®ül ½ÜÞv üÎZû“dÚÊ~+F­Ý•P´¸Ì%nk× !õâ¢.K’ìu»‘:õhÿÂ^^ôÕËS^ï‘$EÛ/ü]ôûã¬c SC~{tÓÔnŒó`FHOÎò:É&p­¥¶?Rò¢Ø®¬ö€#…òB^©’Ý_-ñ½]yoW$ŒY0ÜysVÿÂ-Y ×û%}ø/;ˆ=Oj¹›™Þ3Yàü8“Ý‹R:bK6¾¿òÇsbô¶[ìÕLJ³}¥_.è:²øÂbË<?F@!AÓ _«XæPKçšW+&ì«dg^Z;¸¼ÀIA9bãÁc«¶°/\1bÂ2Ÿ‰£¡ð½K©äµ&“=lt›:Ë•§X:ô)bT'ÜÕÀ®VUb§û úàÜMp6ÌVÇ[ÞéœödDòCçâ.¸«“»¤ ¼{½ÇÄÇ_]]ð2sû8ÏÁ¸5›òò)žU3 =Óy †ú¸ÅöÈ-Ìb»ç©¾ÎºåîW}±Ýr‹U_g]sKT_l×ÜCYÐÎ2‚ÿÑð?™à¬f‰wîäGO‚iMŸä²êÚ²œN‰ç³N›áòñNì¯>ѧ3û§güTÏs~ÜÍ î›ð$ÇçkžL¾ö¤$Eà¼bàž»?†¼¶|·õ¨¥{¥dÚ 'o¦~^¸þ‹K÷Î,Ü›¿¯"€1.êúuwQè©Ëwª7Oúãõë»IÛ¯Fu­¨œî”TÁþêå¦>fÖ~ì±náˇþ6.sÊ›»Š‡ç†’æ¤ä/† ùO+SÏÄô¾±eB¹=”pÔÚ½¿ó™‹N½_¹lª‰™KRÜ—Š(¾bdªÉl†`ñ¨zÓ¾óéCåû…&f¢ñAì:Éž|W¹z"´Ýžìºnÿ°‹ ØÛ.VÊ™3ú’9Rèñi¤ßf2üúfÁ.÷~7ûRPz!¿§ÇíÚ)>ì¢ÇùW¸³K*zxQ쬰t úúæ©.»¯¹á6D6¤­;„ûúäÞª°ƒ=×ö¸|‘Kvª&r:q¼×4LÛ»sé¾Ëü(ÏûÅÙŒj±ïéwQ•«æŒ›ôÝMÓ<×#Ua½3Vž1þå×!I¦Ù)ù}žÎ±°ïjßí÷ŒsuFóíRwõòvîþ1Û„Ű\wн«•o¯?¾ÙZ³üøÈ4OÅÕ×v&fÔXé4[F¤Ÿe*´ãå¶Õßù³ë&Òn½ËÊ|z¥í þ¢Âú‡âG×<Úí:çÕ¼Ïô߸Ãqó̺É2oYp«~krE6ô¯8Ì]Ÿ£6$GUïzýâgóŠÐùÝ#ظ‚ õ¬>}o|à8zn%8±c×ùìì=xKiº(âÙ‡åËÇgf qyÛóPÙ£u.—Ä.sbèWu­¨ ±q-N¯sïp¸?ÀМ×Ç|Çg¦%:¼~/æexÃùÓ[÷Ul°N×ýöâé‚«õövò¸{)„fEf‡’CcÍüäWüºU¸PÕÉûîÇÈÉv-ªnË^u#2í§Q7i¦þaAâ¡ûІVñm¿G½ð&y3‘Ã.œež{azZöª¾ƒAâ÷Or(ß{W+Äã3Ogn..ó^{¿8/x:TÖél,ù­£xÑÁeõ̪ÕxûØÇ ›¹EYXIùÞsË *_£AõÖèyŒúÀ´°Nߘóóò6nV{Ówd‘poŽAò7w0Óè͸¨ R.,þ6>çìÒ•½Ç‘']4þ5…W­8¡·YèÑúa¹›vÜ™uúÂíʪãÖ,¯9–½K _oG=øä’Ý‚·}&ú°!¿„xY^èc»ÔüÅe£Gõ¯¸µEî Ìœp²ÎòIŠñíä¢L6yeh¯m9µ&²Þã>F»#B(#¿0sîO™úðñ|×â§Œ¥&¯™Ï¿af¥Ùlµ©˜}ÀªbØ¢Á%K_z‘ÑîmË\êYæéš»æå·ûTf=„{ß_¶®³Ä|Çè ¡k⻀_AgÓ¼Ýå=‘ÈÉA’-«¯'wºÝG‘õpQ¡#E]ñ««Ê£H{øÂÔX’ðÁ§vCõÖÑmŽ×t}ßí gàÁcNìŒÒ BÙã5ˆÈŠõ ·ªxÌ…ˆoŽì劧í )Þý2 9¶d‹äØì­'ÙôsßB.b[ùµÓ{MͶÚ×}Ìø8Êúþïgö‹ÞÖž¸ Õ_ˆûPÓ%ÔwïÒTbM 9ÒÂ{ƒñ¦º…gf”ôQdäMbŒ‰“9’æÝP¾‘ÿöÙàî£_m8}‘ÿsN¼4:ñ¿¼«o6ÏžŸÝyá/¿#÷wHyH w¾š¸æõÜ÷?ZÖ ÙâMI¶1ó•¾]Š‹±_œ©½âžQ,>!û bÖíÐã±Á?\ÿ~NiÃÀ%6C¯Úòöœ°Ýfkݳhüþ»nÁÞƒ. Ÿõðó¾ eòÍ¥—ãmkº”<¨+Råz‘G"îœè™xKQU¶N‘´%¸›Yäøy¶Ãû_LïqÂ#Øó–))ðKœµ¼¡Ç»•µâÌó¬AS™µ&S„Q¥O¢ŠLOmh%yìø€*z6Ýjƒ…"õ×üÇ’ìQÎ×^ùÆÖýŸ½+j*[ÖÌc *ˆ1†I‚!3‘€ DEIIFNy•AQÐ WVTPlPˆ‰ˆ(E0"ƒÉd°måm]Øöë×ýÖ»vÿ°~d8IUíSµ÷·j¯]ùbøs¡ïe}Mk½O5âÇ œÄd³gŠ.ÃNÕUm)ÎXn£EÂä8i‘Vå„j‘ôs²µHËs.k‘´r:´HðÖµcmŽiGdôoŸÂh“Trœ´IŠ9¡Ú$¹œlm’TÎem’XN‡v1EyŸ8´>áø‚ÚóÅ6ðè—äÁãnr–‰¥è#ZHÛÖ»èÅ[™ÿè.u6±Äë(j]þ4ÔFS‡â¼ta–; »S¡ézÑ(6££‹™Wß Ç¾ZV§V¥!ÛÑѹ¡:©lß9ãìnž<Ü*Ó‡9m> °¯8²mQyšÎH'çRêðÖLò«ô=ºåso¦¦Öy(¥ î½]È­Bº¨¶üœÊØ6­DpSMÖ=:ºEÃZDL2šDÖnÖ¶À˜÷À8 ìP‰¡…‘·ózL‘Ä/sàµYV^ÔRŠ÷¶ó˳ß}.«¿¦ð²³‚µÜ¬O씤õ—ø¬t ØÝðæÂ‡]Õ÷ÿÿ{äËý?îsþ‡G?ÿùòeþñÿœü?ÿû&òeþ ÿœüÿýÇ7‘/óOü;óOÀa X¬ø?œÿÏÿ7‘ßæÿ÷ùoæó‰üõ>€?yþÿkþæøÿßùÿ¾hÞ$ïÝ4ã…ó6"¡=H8O/Oák4Í{7ówï»üwåÿ°þÿrÀÿ²þÑD,áKüÇ ‰¸ïçÿßD~ïüÿ‰š¸9B5 1Ç…Åc>i¡Q^^_“RÑ‚‚ƒ<ýæ(-æ›ÀàX,‚ |"}2€CyáIlàs ‰7F`‰¤1~^ ‚ñW£Þ5Ç90ß7Ö),6#M@R÷Fyñÿ³ú¯ž1F¸9†1–ðEûÃî{çß*{ùúÍwŒ# 18’Ð1‰!æu[ü ßGÝO^ј98#û¤é‰òò6þJÓ;ü7^…Y"ÍÝ.‰Ã ç›ô5ÛÝGÝy^±Ì¯XcÒ¼{ÆsK$gž€$’pórŒÿzèyæ3Cð$£3„€&~Òž£¿ûz†|Òþk‰¿]ú ’”,*¬åÂK~m/ˆñÔdÛ¬0„>‰ª²S(RyüË[ùSl±ü»¹/¦ öx [;ìÕ·gÄã'xŽ9ä,­Žn=!%F®Ü؆TDEïÛwñyXqö¸£i]4#¨~Ç Ðh;öÌРz‚Pñ2­ÿXªÄ+ÂúeÀp{Ø9]ݯÆI4×;N”¶ÝÁñøt÷|tQ=¬>êúµÇà8ª0¼özoÀU¼aÍøuNFÄxâÀ3Nvt|ãéÔŠÌ]ABCÖïCfú^eU¸6uœ.¦hðÀ¨Êp‘IÁë2é×ÁýõûFt§mÍV™3R£cz&¿[M ØõÏ™Hˆž=“¸³8uÔ#l[‰¨*1ši!27w‘é‚'×¼åÒ$ûö{7ĞEÚßCí&ö¶ôW µck¯˜‘³~ðoÃÃ"ÐigÍ\¶Ûù–W|λф“Ë.{”»}yj õŽb{ËþíЈÁÃVA¿§cÛ€ãó_üÃî¢bn”7æ„S#ßœ‰‹¸žÅ¥O\>?þ0ÂlŒ¼&Å•e²-ÁX¦Û3> <7Ýíß¼®y‚ SÕ¥ù¨X^pÏdPãED}`4+l•KäÝjMc²})0 RÁ–»Ê]Ó}¦Nî ô;4eµI|Å–÷ØÒ”ÏOi/üø )å€ú}>%—,%“‘4)ë-ñÌ'‚7E±Ò¯€3?©—޹„‹þÕ¹–sSŸ²°³×¦<5qFÒîáÑßÀkáJ"É#"ü'‰ú¶,P°O®_ž¸šÉßtšâ "Š”Mƒ× ÈÁÍæàÁþä¹wÑ#àÁu®ù=³½Àî—†0z{œ¤lEÀsÀnÅ‹U‰É@ä0÷åÙöÑAÓ:=\‹\Z¨Ç'dú›”‰µó£ïŽ÷Tu-Ó§øg-uÉ9¯5ÙRž(×ú¼.aÚ)qØ[@õ÷OèS‡=“¸6WÕhÕ¤2EØÎÛŠ³ãíÈÓnoJ*@ ûG ÿ ʧêå½-†1KöÔQQvb›†À¬ÿà¶¥áO—®‰¬Æóè¥ÒrÐZàVùhœùÖ«êˆtX&ˆ”m·_C”aD¸•hÃ8³˜ß]–¡—z…¤ƒ)+ï¿·T‹©«—=^ªÃª²ƒomdÛ?2%Û(h“åÓ53CË”ÉÇ–v ½ g +.Îv»ï»¿X©®n² –íÛyÿ ?ü¶w|IsU]d)£|)ÃùØÔ©• ‹Ú[˜j=óR+M]juÙF¼Ý+ =&ß3¬8Þ3ºDûŽ6Ûò±Jϵ¶žùÔ©âX °²ÚJ§©Ïtج™xÏ/ô Náö¡LÇׯF²o˜£b͆o„¼u^Ôé"` …¶KƉR}ê'„8b»^X…BÖ¸¦ö`ëï°ôöhæ•î`—wøE®ž.]³"8âGw–å"ûôaÈ5ϽßéhTW+œ|×1>•Ùè>ܨNq–ÕF Eö¿rd=É‚9|tO6ˆFVÈ2¸œLIfPÌèøj{–û¶g'=SJ¬Ÿh•7ÝßÓš9¹Â¯öWßàw©„u™ÚX‡ñ4ݘš¾u€éh¿CýÄŠ•uT'°WùJ¦×ÊŒoqí²ŒjÓ0¬pÒ¦µáCJcyO{ÑqçC~á‘z € ñƾÉ=á¯y[/ Àf›JÖÆå·;® ó~t×ë–œýê ù%q)uQ=YÙ°ig‹„ü®§5“Y8;ÀDE‹ì¹ÏŒä¬Q«éR[·Ùƒ@¡‚;S%Ua–ŸqwH¦L€c-Úò Ïg”e£³AäpÑ¡ #š,müšç £ãí kVÕ‰ØUkõí0ºfÆùÝ­k¤+®§ÒLf™Òð}KºÚ¦Êl ¼µ\e³ ÁÅË©RÙ;ïÜ1ÑwZ]Í<¾yëððèÕuŠÕйC©Ü„¥“j\ó¸ò‚ŽX,ʸ:%æ«zÊ÷»øvö ½¤úØåÏÅa¦LÏ«#¡Æ À;óg¢“•(½º;Ï}c£x+{äÅ™ŠàÈO˜…š[™}ð(úB­y¢xÜÖÏ…ÀK>×›<Ä2FŠŠKø26§S‡Q¾9ûÇÏ~"èC‹KöÅ-ç‚ÕâRäLø¨&Ÿou8 ÈmÏq/)•W¢¦äjÆf4žd?(P4^¬b-%‰ÒÞºXðtRI^42½ws%òv¨B&·¢"Ku™‰s5«Ö¡ûÒOß äê:¼tçù]XužèŽ®É0X \ D]Y^zшG ÷Ö…ÚGo¶L‡ÄáÕ­(B@X¿ZˆgüÃu.Cpøž‘b¨ƒGëÑÎ!8cuA‚"˜sB!!¾,|¯ã\އ.qàéšñ+úeí¬Bl’d †ºáJGðò§Sw Ló1&’µä¢;¨<ÉŽ¶Íé"ÊTõÓúc[l“¸nŸË*— 6åÉ´/âŒÇèá9+ÀEX­äÒÕ!éàùˆ„hod ñwµ8~ {N{5¢¥Dÿ8‘¬®Äœ*y}ω´'£ÏaóUS>fkV¼Ô£„µqÔ$ÉCÝ©åʶb eH´x¡jg1Eiæ|ÔK®¹8ü1æ6¥¿º'XòlÒÈ  LHöLI½úÖö-ö¬D³4j–cÚ8-±}¶Ð7’öÃȉ )¦Ç²”`Àó S¹»®¼gU“kõ¦'‡Á«‡ïU?»f|ìE´†3j  ¹lC¦ ×7„c/ž2<ÊëáM¦¹¼¹vfÙìh…×¥g ›Î²…2̶ûc1SOõ’‰kŒMŒ©ãÆv=åö£÷ÛÆü’Ýyø5áõ¸’n¹Š°+µ™^Uƒü‡û ý$z])±£é©}»¦-´]!½1§u€.FÍô w“ìÏv÷Û¾%i%ˆãâ¶›Ç+Q‡}Ãk‡®¿v§g*Qk|ÃÿÕ¦ þBî¢ó@ýôSŠ`-¥\5ØM4¸ÆýÒ³½Oª«ã˜þ<¬*yúÆ…E¹êÒÔÓ»F€kùª î;N[-3aÚõÙêê„G¿Oeß(O{•îRS8¬Ê~pЧÛDÓ+ò–E•óΊ?Ë125¶öµþû²¿ûPVˆÇýšçší`Ê>ì]÷ç»r’ŒŽk ÄʳR–E«˜ñ}¶¦êS[ø ?{»üKŸ›¨ )a1ó\ùJá5¢ÎäžÂ¨·bò°/Ìöβc‡ÐN*+qœyüôÕ~È 0KŒËïâïþeù‹Òö¹[{‚Î8 4˜o(ûI«,YA÷ ¬„ã§=L ºÙÎ.zºçJ³DƒÁCÕûi¸ ˆ„lÅŽ²Q:¼ód“Œ4# ªíÊFݹà·^ݼèiÎ?³G%²¢¢Š•øg·…vÖ¶wì¢Ì¨×ÇJ k‚õþ×Õàä‘Ë%µ…òŠp %W&V%@ÑÅ&ÝÔKΧ –õ*¥g[åÈnŒñΛ})!‹²¼“‰¼úFÁt «Â¼•ŒV‹Ï7îЙwáòrа%R²òÔéŠþm–Ê0ò†Y1üÙÄ÷€Xr*·¯õà²c ‰ù§Ø–¨š¸pø˜ùz§ó:äV#€zÇ´ÍhÐ.³‘ÛﮫôŽ Mkª¹ùE=’Å%½óW…0“Ú-´›7íNã+ÚX°,7×Á”d‰y·£nöÚ„|IQ”Ê2PÆ?3+IÚ5aΧ½Æ_Úµ8$[ë ¦ÇdýÄñÊ 4|¶radH0°XzCQn7=–WŒe.~áÿøÀ;sPž°Q¦,õ•«0<¥©Þ‘{Aæ:™~å ¼õbóÍö2z¹y¶àÌMh®?&²Ž2È‘kÁ»äÊ(Ê¿°E\¸™€lNàVª Ë`ü‘e³ËôÒsAmë$ÛŸÜuñu™TQãO:8ÑŸeHÁ{BŸÒ,3Þ»-8W·U÷yºQwÿÃÞ•ÀCµ¾É–µ”DÅ ¢0ÃØ£E¡ˆPRw˜1&³h -WEIBÑ®RéFT&k*¥T’­2#´QcIZýÏ™AˆêvKýûy?–3ç¼ç]žåû>ïóœóLhÙšeßp; iÀ¸g¬8SÕaËÝró>'¿õŸõiÇYUøŽ ¤º;{_ã•X;&^I«) ¨QJâž¿_ðHól¦[u|æe¥ùãb…Üö¾njŽÜó|{~ʈÓÁÛBËo÷Tô9/zÖùxðL7kÔ ŒÉPÅQI"˜{©þ ñK›nJnÍ6Gsè&¯Èoa»ç.Š.AìÐ`7ù?Ì,W‚ÀÉÇY’ã¬gg´ümšÝš}‘W;v“kX»cB%KÈ4â£R¡{²?L¹AÏËõi]¹vä6gº·íä5¹c5×Ûa´oåêN]æXÖ˜°÷õ¨³oÂJê+¤o/­Ç®S«Ú$^:aÞâKë>ƈ~¤=ŽLô~ã?gmlÖcïWÔmÊH:L:.9~êâÝÀ™.X»›v<›6ðpLi Úw]}ëƒÅœc“—#žÔI^&­ O¨•9¥ïŒÚªn¤¿YÉeÂu{ÿ0¸o×ð±#v¹ïJ|Mñ²QÂþ“º4qû so¦;97ß1½ù*à̵è³é™Z§¼'+$sq1ê oUÖÏÑèö/8õ3 ±ê›Œ¼Mäê¨HHù…»ì\|ÉÆ>–k)áºLà'fëX–\Xó¹ÖèwŸ=˜P\ï*Íõx’«z´óÜz‡½3g»My4á¡m6BQªäÔöÔŒv|ÎY,CŽé¶o°y©vÔÕG/Ä^ó¼tiù£Ý#ŸI‹dre]ã#¶iqòþÓÓÍ€¸=Ó.g†«9™Å; GíèþܰGHô$üÕP5€â‹Ò{L‹Ìš¸gjƒ×ßi¦%b2åÜûyrü/'="i¼ÞÊšypæÇ[îN–íLPÏïÜ5 Î1ȼkº^}É‹Ö1€g‘n}Õi؇io7#³ý%Pw]™.°Jî”sqHÓ))‰;þŸ©_È?»Ý<ïqÅõúËšýÇ%îà­—[ÈÚ˜·'7asSÑ«§75ØÇÞ-òIrZ9…7ÅFÜ ßðþµoT,š6‚º¤CÏf™æä©tý¥Ñ»k<¸uêùë®hƇ!®U—ËrM­¢å¹Ú"öÁ¤”ÚÙg X¶ÒBSÒëÏ&ç‡.¦æ.nÝPxéý–ȹM :78Ì-ÓJ؇װ÷Û• ¤ÇšOáäoLÌŒMŸ–q9Dé—o‚§½8ø7‚­-;&ÅÝÏ<šZ®ÿž²*äYšª ‚2Ù”B©ÀƦ}¨ÞšEè0 Z]p}®þB¢mž÷8-”Ì;­ÕNŠbÃÅî&4Õ`]n¼:íÝÒ¢{öÐ<û¸Sñ›Å.îPXù¹jG(ê@þ]yŒ«)!¿î®“^–´·™ÏR]¤2ưT‹¼ë¨–/2@Âo‚R€ñßÇÔYµò±…™ú‚jY-R—í_ØÄ"輨dÁª-ß[Ænž8_DqKÁ‰9o¢±pnÑTv“ȉÀ޽^ì’gŠbS[Ÿ ÏÔèܰæYaø-_àÕ$¹†ÐEþšÍGç*´³ oLF-ÉJ™ž²dŒM$•t S]¶Uú–«æÃµ;)#à3ý ï!Pøt‘[hB éøÊþ®J7sjÜŽgRüßDÖ‹RZ³·÷67 .Ó¹ôb¥hÉy›ãÇ °‘ÜqkÊo ”$¹¼hØ«¡ýHø.Üâ~jvµ“¶ÚþÆ–gím-íØæGµRæ®×g¾QÌ^¾§¼/³Fƒ+¹F_HÁ|®‡ëÃúùÎWÕ!ï_–5üd±¢ N}™úâT6ízÖaîòÇ"õw½ýßà˜šÔÀÔÖ-7Sn±ÝN ²Omø•XLöÚdµcÝ]¦¢—µàæaNPêoœÙÞØîßtâ’«ì­Q +¨¹¶pºYHókåÜ ÜþŽºr9Ïóµ™Â,énh $î—Rh}þX¾ñ½èóúÁÌBõÝëNœü¬%ñy:ùÏÓ5NY¤;fU® ›DZPVr[L©…ÏYeÇòZªXÎëB 6^@vWS.J+3ÿàÂ"3FÃÎ:ƒÕÕg|ð{3 ã^%HTˆ4­I¼C@3&BÐG±âfµ9êÆþªÛ ESW³¥ÜÆY_p=TBÙ0o6ž <ÙZ'íUlaÄXÄþp;+­íÉã·É!²£üÖ^™¶ÇrµÌ@¹WùŒ”6¿¶—Op¯·[z½õÐ®Ü Ù‡¹sמ±-ò;S³psþÄt¨eƒwâ?NçH¹Ž3>zs¢ëK%B°hzmõ½èöü´E×_£&µç??’ñÆD/Òaí¬þ§à‘Òv¯ÄkMO8Í~9¬ƒ¢íÖŠ•6d•Ò.•‚bÔ}À>såzC!àD-váš[­ÛÃ"¢/æ^Ï8þ`Ã?qÍ.p¿óR#%¯DÈ”Ø'U1/™#¶Æ8°m,P’Î[ØÕ´Špõ¸ /fëNXR‘k%•ü—F$Dû²ñ çëGÛúW଼ʳ©…2¸ócñnúº£Âãì\ ¤¯Žð ô€éôîÛ2e @t4Ø`Tƒ†ÕR'’é´!Äœ=ëŠW¯ÏË] Ër™';%¹ªlþ<EiY‘˜*”0EÆZËþ´°`¤áòÊP$ïE¥3—=Fé£d.oÜòÃRO}– Kb¥ì+Sèb©GÛÞšš“[Ëräá(ôé3ò‰yO‰e¥OS¯5OaÿsûÖEî8íå’”c“ì…1‹ž¾b^ƒ—ä¨e85‘?¾jç☻ÐJôÞÎm·?Š3ÕFCHNnliQxËå< ´Ô~©|¥æ0Â0Ö?vйÙÒMÉ$íŸz¶1ãϰg„¼8W`Óü’xö8¤øÓ%§õbs˜~×űOWž­SÞ÷xúÉÆàýNwJÊw›ÂbM®.:=‡õ¦ãï`{ã}u»¬®–æì0"-²Éê &=p¼³}OY@íÈ7Rc"ýÇ®MfQÞ™šËÅÚµ·mXþPæ=yÁÕ‚øÕº˜M–³7Æã62CŽ$㢘{êfÀBù8Á)ÜHKömÃ<3)ELÃýÆ*€æ€ÐhS\qRâ“Íc8¯v6˜d®8³núLÀ#O|D+г]hB¢bí´IMTÝUøs}µuT\{P¾Û”µ‚2Z#…u³g:«Ÿ;õó"L±Þ¿øH^´KÝ“kç8x1î&A„rô‰PUÚfåÈÀÓ·=ư›c¼¬SÛ•Î×ÏF¶ãHí&¦Ž‰iŸÀ?Nœ>?|µÔŒ 7B•¸$æBªd_B\û»­6×·óÖê ,3ý¦ ½ªÜ•sîc&‡Ì NÔ,‘VNŒŽk§·ø]/1Œ½––Ç.zá¸îž­aYš]·êÑW%séQJŠ/ •äÙ¾3 x™×rîýõ(ý"É’à#“Ïßtb«œTÑ-HK"†,ÝŸM^ ca œÊ7ÓÓªNeœ–¡t³¸¡ÐŽ<˜ˆÚ¹2µáÚañÊ‘½ÂŠæÇÐ…•D.^䮟¸çÆŒ}y¥’‰÷®ŽŒ,”G¢:8ÇVºèLØ—å Q=*ݘó—§_`¨¨O0êé9ëjûôÖMJ”=?·î̲µ¹MSލÈ=ݪ½ýEžÐY»Äô-Vçoà²Ê$Kœ,EÕA'=½l88°Ly÷WÏ1{eQÓè¡Ü]‘ ×Þße*S[1}{!!ž;?f“™dKÄE”J¬ÂŒ¬1ì± ¢‚ˆî†ë¢(åY¯UQy¹,VqÞ€ç Zˆ£\îƒå–ÀxqaÌšÍ ë ë;Vqê§?EÈ‘r£'çÿÒ5ÌÈV%ïúDé1*^h2Fµ´Pîþ[Tð„£Ã¶IJœäÁ ”PÆø°qšÀÊSäH-)8Ñ1"õ½ØŽ]”LZ…ˆ¨Ìí–3U#vÀT5[“FaÌRuΉQÿ |;f›½ëã7cî­#JëÃb9¹×e ÛKnôÈuªR‘« g# t7À8ûkçoQç‚[QÎ&Íü‰ð‹‡6É쿹`ÙÍ\aa{ÜÈI˜z9Ý@ °µî´ šh>^õäòœ[\XZô݉~ØÜèóñr•ôÆÚ=\—òsaš¦‚"†"IÙû<-ù†—ÔÄ¢½Gθ°¹3gW6J._h%cïfˆÔ”Þ[àsßLQE{¸UÎ=³9÷‘Éß\Óc"‘ ©ÔeJ(w©Uâuç|f§Éâ›ñÎ@gµ‚a…èD‰%æô™KÞ­µÞþ@B"¶Ó?Šk*µ°iü!MT´ç¾}ì˜8ή+{NE—&X4< ò·.y GSÊŸ¦=O:§YA_B²O*"d–(/!4J´Í Ë"ZhÜŸÐhì ”'Ôlôï brŸ…ºÏäܱŒj}°.ÿ`fIÅIDÂ+ÄD¥ü“a ~ŽóæÈ(b0Gsw¿{UØôáQ‹ANÇûB³1u{ ªmîK“ßK”lf”bÀÚr˜PYî½°7÷¤ ¹¦1¨õCÄ –ó±Õ-©TïΤ¬IåZJÕõÝw­dÆw®èT~uQEÔ´•*Oܴ˘¤dE©J‘нá2"rñÊšlÓsuò29'ó¯?g•ø³nz¦ËäÈQª^ª²šžÞð0ªinØ T¯äVý"²ÉöK”+ä[2µØo?&Qo.(± ˜ÇËüdž\o[ü(.8yÑ{¢Ôƒ-ÇrÓîÀ#7TF¸<ª¤Î‘ÿ|ŸÃÆCgäîÁ 3„ôòŸÃ˜í¶õF~À(YÔ<"c®ÔÒµý¸ÅùÆ*"XËœ¦¦Ø:+s²ê¶ÐˆT"9ç]ýøCy·ñG\ÖïÏ-X„.‡/h»ÊQA,wœ±ó"å· ÷Ü<ï€g»öˆ¥ÆBqnT̈́ɜWËŽ8”Ýåý“›Â²­¶ym͉©Ê±Ýß¾µeô¥ÙçÓ€Œëã^ Чs3æúVÿÅYì8–«;….š=C3†ÃÙU=Øu}ÜÍ¢å㋳ĞH‰Û×DT/%†ÎÛb‹¦UWál“‰Á”K†PÅÕî»6Î/+ñŠ\¹×¥:s›ïC~øKrJ™™ªÑ„‰Ù>6zçŸ%¶t»³s%ôJ¦)VðîH?”p¹Uîd¬2_#@†«Ã­±ÔM6»°HN U~{nJ$e“Ž‘)§ ´=޳cö “³¹ìU Û_[ç»tÚOÅOÝseB>:Ãî¹@ê=ëG·…-ÓŠé§0¾f·OÙ£ ɬÞ`žŸæFØÊV)3ö5¬¡†’(½y+Ì\3 iRöŽO×*  c1&Œ &Ø¥p8Á€kóú'Vì‡úµ¹­²ÔòÓ¢6:JŒLÅ&SEU‡mLÍKOšèlnw+_͘~v&·…e ¬©“HŒu”J³,X‘Ÿ6f4ËöÌŠàù'=²{º²(û ¢ÂöU³ÃÊç”åiZ0ã,h„ῸéW¥sÅe0x[ÇìùÚ“X×H"‡ׯ:o[ÄÐ<ÊE®Û‰ nKWØ´°V—•*œ§˜Ù¹u%\UÔÄYùsV•°ÿ¹{!Ü况à^½C+˦8lé5^›K%$dPgZ$Q¡””yRú‡dw χžH}á!çršÚ¤ê œ6Ýí~k›àQŸ@øë­2ÛÍÐp÷T¤ú_À>íQÆþÙ“…¥"㔊9eUFf¾@£âU óíÒšF6ç¶<|4¸ËËpÓGqR'J*Ó³$”0"Â%ffBNdñãÜløÕì²ÕgÜ"šÓ樼mïi±tJÇÆ²JÿjŸ•^a«7ØeºÃƒY»K£S3OTÜ©n”Vý¦ð͇Bц£>ÖªÑ5,´€Û(, vä6ˆF¸osÏ~¸‚Üñ&ö†é •bx¿µuG@ÍáÌJÝN±Ö’l`Í{Ú n©‘}¹ŒÕË`T`¦³ê5{ñ‡™Kwô ±7lß½Üú[œ©p×iÓï~ÜNÚý®½F:sÁÔï±·?h^yöíÛº¢èÇï‹r¤5¹w.*v^uw‡+^¨N_‘–:þÀÊ=ÓX…ñ$å‡÷“àoT43.Ôß®nÜR§ÇÙõ:qMÝŠ4Ö±üƒ1UÊvÕ¼ rY¯þÕ¾½éñj×Ç·#Ç1µP.p.Q¾j0†ºàcFçŸjÛF5*zMç•Ç¢œ£nÕ3ÆÔ' •`•Nªç?ßÿî`´Ë³7úòŸWÇ›msœÊž–Í6—‹”òj—¼×r|Y´×Ë7€¢ëtù9·Cî(¶ƒóâèdâ%î½%J nÞÅܺ#B„¬¤ì°wÿÖ¹… :+h?’6Ëh;¦·¯<àÚ3¹Š%0%”CÜìkÙV‚k Žé=Ïo BVÛî¹™>1m¬÷ª’²Oš„šû€ÈLLL‰ó[ÕtB¬T\°ä–E«J²^ScUYs²êL®>Û$ž(_ž8~ÿ±ä%·m³Îí?ëö,¶óªì Õ`ƒi>ì]åmÁ\Ë’§¶fó÷–wÐ^ͳD>fOÕ²¶´^H$:Ë/ñÈM‘v=põ•­™ Êó q¡E¹^SµÞT S$JPñNÖŽbc«¯™Wr;ÊÔô#©ÖÇç¬ÐαU?¢a \Êþ‹ù7fò Öûƒ »7=kkÓÍo}–h½8Œ ²/Ιo¾˜@“.I!háø3®›ôp猋üÇXî$8–ç¸^5gŠ©æŸ`Û%߉à=Ù"&ðÁ«:š;͉¢Â¶»ÜBýÚÜ„ùç…×É•®_k4¦¬*4’ªZ?^졾­ ô—ÑãX6;—kÑ:æ:€“ÔÆ_Ü# µn—ÛÆ†þ€ ȗȹ/˜/QÓãS¡HGØ2‹N ÜÇmÝuš+ˆÈÿ™ÿ`@8TÿÇ.÷?mšDM Z·Á%þáÍJµä‘©`7ÔP8  ™‰£9RÛÉs¤vmWeakÂÊkO^¬´iOg7¯ó>˜ç«­ÃÄz,uO‰£»(PãOmzZš³"hE²½L‘½QD[¥]^SÉИ’`ì½x6±;¥¶Mø¼E ÿ.¥ï3SÙ׺F¯ÍZðâÅIs7×O×u;^ÙäGï*¯\nvðêÒ–ÑrÓ+áåkŒñÀd°°ó„dÖÑúëu™¯ï%ÊboüÏM'³üиWîaé±²váXUC÷íôü”£‘™íc9{Üx )^•uÎ6Ñç'µ½ì½_³c¡MôlÖ}q¶ïó?'øw½ÿ5œÿyHJ_þ›ü>üÎÿ<$¥ÿu£üïÃü’Ò—ÿ¿Qþ÷áüßCRúòÿ÷Éÿn0üý/CRúòÿ׿Îÿ1ô¥/ÿ£ü/Ãù?†¤ôåÿo”ÿe8ÿÔ¾üÿò¿ ÿ×”¾üÿ¥ù_†ý?¿ ôåÿoäÿÞÿIéËÿßÈÿ7¼ÿ’Ò‡ÿÈßÈÿ7Ìÿ!)}ùÿûøÿ†ý?CSúòÿ—úÿ õõ :úz<þë ÛÿCRúóß“„¥Óâýˆd& JºdI$ñt/ÁÌ÷õ1xðü/z:zHÿÁ#}C$ôý?¼ýÿpþ—Ÿ_P*–ösœ]æÂ¬íla‹gÛÚÌ©j#.zsKgKþ}¸Ž.Ì™†¥Ð‰ "•‚%!sª¢ÅQX QÞx,"ãX˜7ƒá«_Å$ú™«Î¡Rx CÛ9À¯ óä2WeàOêÌ<½±4:žaN¤Sµ L´u¡6D ¥Ö#†¦°„6W˜#/ÅBðoG‘ˆ˜7 ïe® ‡#À à)pO:]FÓÌU錞îÇ3Ta p€]ã‚*€ øSò âÀO*ÚÚ0+<OÃ2ð8˜GÌ’ßL®ׇikƒupD?O}ÌUW)8< ŠFaûé3$2–Há©•*Ú<œFñ ûš9` à4°hXìËw{ÁÑÐ<½ºšà‘‚߆u÷¥ojK¡Pм>oÈ–Hg|SP²(z×ýóÀã{;“â ‰ýó!ØáÉ æ}S3ÕKú|ÿ¦ _þÝ-8âI]>1†× r’|]ô·É$X‘'@2°Óîîº[’%~ ^TŒÎ¿N¤`PF8‰a0qpüA«¹ã@¥#’@™µ£Òðp8¢8Êüõ¤âðh5(i‡‡M#1Ì>MOê;m„ÿÞÙÍx èÜqXÖÝØ[›NeÒ<ñ]d*AuxU po¨Ói°¯S~ÿؾ=€ ^ðF›ÌçRW'ìÀ¨^0,‰ë¾Â£>ëAÂÃ<¨4žf®ª žDòÅâp ‘z>Ó}±ž]Ÿ!<¡·ÊŒàÿ¡õœ! ªJ1WE‚ÊêžóF¢˜$¢'Œ/4°yÝ¢ ò9`|‚‚c´aàɶx/‡ª? ë ŽHÛ¦ ÞàI¿® ªoodÀR<½©4ð,„ ,8`Þ4û ŸKŒ©éÀrÄ#=Ø K#€Ýh8a­}‰Ý—2ÉÎ0"n:OÜÄùΟÛg3rì;z*ƒA%÷žÀg¢ô-–„4Ñ®ò”tàÁö"þgÔÇáéž<Ú£™ T?4¸*Ñ4¦'Ø+ÆãúOçªî¿çjð—ØªÛÃÖ.úi &–ôK8 NnÀÁòYùÃØf‰j®!¿C™än!?ñ2}@8ëÃ*Øg2þK˜Î컋U]ãüQsÄ3˜4 Œ­ŠžP¢Y"î³ÎƒJý52¯§ŠvÂ3,ÁÅoÀÑŠâEýa‚vÄ£!„Ðz ÓæuŸìhDˆ ÉÜqé0¿³¾45ü 4uÂΥѨ´_³Ž©¢­ð äiX²¯ã‡Â²µƒ ¬{ã £÷î8é}inô§ÑܘGsŒÐ<ªÿX˜œê=«Å¤7þÓHoöÏÀÒý¶L‹‰†±3ŒÂ„lT­¾&æ,í°4,Äó¾ÐÁ0†7Ðþ1ùÓ8¢ nhç€<éÃúà„åwן²º:iuy@ʃ9‰â€§yâ)Œ9T²/ ÏÀ㺀Ç<ÝOÀ…—ßJW:ïÃÐèØÑȤ«ûÇq Ùµ,|Õ¢ìZ~¬Yù¥‚×Ó@L@þ&tïóý¨Dܯa¸%´d’}ù,øBs^àÉçÍÙR ]ÎØ~gy ò˜‡›ÿÑ^hÈ0Ëno7o§K#c!vöcÚ ;^ÏC 9èi ù¾œOnrÞ-ÞH´%ï³»¦}¡x>^ñ¯¹ßùÞmo¾·¸Ÿ›fIõd’A0Â~jop¯àw8{ù˜ßãÔéçä ï"ï!­3ô±ŸŸ9€Ÿ¤.D@ :èÅGª¿*ÿ4tßö—}î½ÜóÝ7öj¼ûc¯.zôi@0ö×M X¯&!)¼‹>mkôÄÁnؤÛ÷¾®q¢¿¯S~ŸÓ¿¡ëžŽúÖâ‹xÏ1_Ð{¢¿|bW{ >™ôeWo)èîŒ?ä>]u]çi÷Ø(¼ŠNx<ˆ™t*Œá nú?iêNõ4B¤Ð‰8<ïÝïIô"zbùi0(4 êt„óG1ˆ NFáÀ_.×#Ý…ð€vÐyoi ñ}’P˜ <Žôeª½zÿ^{!lëÑ]½Ý퇯Ÿc럧ÛЪ8ˆ^󀟧Õç§,ÿcPx2Ç[ÀÁƒ!C¾Èñ£Ç°å]VŒ[Wd÷ÿ}É„1xÛbp÷@ëâ=ŠÑ/æÜ3äg3èßê+gÝ–Oß³½9Ý×DBÏÂá@™Þ$HÀz¬^tÿ~$3ú÷@ÖåkëÆ2£ÃÌ}ün†}Å>é¢ÑCÙ@,øHÄãâÐBÑÿ´ù&GðZ?¿Ë>ÉJ?0Ãö3Fó¢4¼'8$ƒ óÀCswf_‚¹_còPòœáÝHiü9R~î,ÿ_„J~VöfÂK?(2 –ß–ýã7ÿ[ˆùI`ALé Îð§ÈW–^víºßñôÔ'·qÏ&9°e9°ù7ysÿuÈù9;~~vE†ôß hïÇÿ~~˜¯"(ßàìºá·ÎïxX¸':Úƒ›ºãæ•þ/B,Ÿ¿aaÜ7Bm_p…¸ÍS-Øà÷¤ìEy–_¹Ü=Æ/ŠáwM˜ÞõäxøÝþÚܾm¥éóÂÉÿóå¦Ï3 ÿ[«M}m©ñå«-–€çÑ€÷\f· Ãú¬=ÿz ½„ú[¶ üê=^d,´2Ã}ƒá¿_ýz¨í^ý ÿä¨8ôèò kU!`½ZŠÿ"äüÚó؃E¢T2‰‡ƒ”·Osd,ÍÄlOÃÿQÿ¾#ªÝõ&L·öé  úCÃ@_PÈ.ÊüDuü–Ðpðçç)ùà/gý¶æAƒ3Œ~Áòa@¸õIÿ»©ÇÜ KúƒF^þÔ Ë—©‡@¿øô· -<õz«ñ·Å¨AÃ!=ƒ‡î å·€(ƒï„¨>±ƒ¯„:þÜ(Ç×€ê7Šp Ç6†®ºÞ æoª>¹2ÀͬO¥Àø+:Ͳv°q·´±³qžëäìîä<Ëy±“û<›…6NÖs-ÝÚ»Ïut´wtêz”öûbß ¡Œ^Æ ëAeþÐ0ÆÀA“ïÀÁî×»aФ/ ~Ç+@~%FÑCÃ_ƒ‘|}—gžÏÖÿ/ÁˆÏäíûÂ/ÐÝÃÁˆŒ ýÄ@lü•Gå¿„çBi.‘ ÁcS~ ¹^°k )£SÉŸ†Ê1# ÿŽ«T/Íí·Hñ¯@¤öíäŒu|R™~}ùRAì:×C =¥»ƒ\àO? àç:~žt|.0¼7‘‚ƒ¬ ƒÿ^"ƒ—à›Vno2¡p½_Sä½ëÈðí)ÞˆaþX:ŒÐ“íÒ‹F%ó•†J"Qý!ÒòÒ=š¢˜$^¦Í/½;óßÓ ~¥,§§?Hž¾¾ƒ¶ ^ãÓš7 oè]Ï@Ђž½èŸñ„‚ $‹¦0Þ¢b^¦“±$úS6P~vàï,_ iÓÕ7Õ31ÕÕ‡!utux„í“ÇæÐq=o²B SMxw’R*€àå¦ì¾8ŠH&Àè4ÏþÙL}¡˜–Ä0Wí:£Ú½’‰8dëô‚\Þ{Iü„¥(à)þd!éÊuÊËÌŠÿÕ™i‡ËP”¯æ†²¨º`žÞ8*ÁÝ´HîîДñ†“qߘ ûËùŸÁ¢ÏËÿm€ÔG õtzF:ÃùŸ‡¢xy =<ðú8O#}#,Xt½<õ‘x$i¨44ÖýÕã.?·üýÇú~[_Ó¤Noýׇôßúþ—aýÿùÅr´Ñx¹ªiâ4¼'6²Ù ±K‚#ŽÆ3I@KG ©‡¤–ž‘a÷^œÁ 2´˜A$uÝj¤e YGZºÆúÃVÆ/.ÿAÿAÛóÛúø²þC_übÐý7Ò1Öÿ¡(›ZI‰+Bz(ecméþ¯´ Å({¯ÿ©;Ø:ÏýØÙiee•œœ¬ àëîînaaQSS““““””¤¬¬Vìììœ,lF0: Ìl¨ðŸnc9ËØÓ´×>¤j^æ•$ùU5…nëKë2§kÑ›¦œN·™LTÈR9MŠ~»¶ìƒþåmé'öN;-´vB“¸àþ€E¯÷è½5‚ÍÌ_§âuGqÚÓç·%ßÞˆ£{µÉsÛd­Ë׷Uß™V|mªû9š…uΕ5æ÷}•+ÍË7·è?yy^üÕ°±l‹òí-tØI!Z`Û{Ý—Ú*©ëG"|Þª®e5\tÛ^£å»5PÕ~ÅqéKe­}žÂëf&­Y“­ä¾®ò[2븟ÁGã ËsάN|€ÂãO>˜ò°Â1)êq{ýM£vBiyçâÕAF‹÷œo¶Å¥.¢Ü3ù?ö¾ʶo_J¶Pdc‰dŸÍ¾ï{I(!Æ “iìY‰H–fìdI‘ŠRÈ’%Æ2 ÙE²T–ìIÈ7ª÷ùþó<ïÿ{ž÷ûŽwž9¾oÎÃq¸ç¾–ûš9¯ßuß÷ï$"]|%-é*: @"nv˜ÒW¦ñ´„?‰Oyko¤uq›9á$TëÜ·Ç䃜¶y‹?Ó*bq§R¿Éß(«5&”]¯ÔÁ‹Lˆ·ÓfÝî‰zô§‚ôûتÛ³HžsS·S¸O™xáïŸÙžOÃ×¢2j¼ðpv 6ƒnéÐìÞ/¹Î6‘ûêTäGâ7Ù ’ÑÚ<ÓúÃb¼ÉØ{)€.!ÏÖV.¥]Z òè×RL§²Þ†ÏUÓ”ø÷DÞœÉòÌïq0Š€_ .¼8·†–ó¡æÏ ~zð¶ÉcUEjÇÞ¸q^†Í±Ç46q-‘wbf/hyº„±æò/í¹†¼v0§7ÐhÎùñÅXõœäct.ææ²˜+‘»Ì7]ô¡»ZPI¿#‡9ó‚BµÆ™öåîÏ ?¿f§(™§——›Ê`žrñfÆ&EåT žc¯Ê|^×îË1•†Ê‰ÃFIqÔ Æä°Â=£óOß‘ö…6rD¿G^•c÷nyÜטÈÕÖšàܰ0xÜuF•­»×ŸP) ÏíjÓ±¼¿4O²?Z=| "PT4/ÅAøµ÷ù$ /‹ó§OŒ‚™'¶Pã¡/:Õ¬Oqïaé3¾þª–ÇcÜñ]æ³|Èûå¥ÝØ¡Öì»Õ{é£N~°V°p]bº¿¿Z.’Ûáç7^:=È}TXPLßêøÈÝD·•øD9Wè¯QòêXÆ×ÆMT-îC›Q³¶ýÜš2†Ü—.)½ÑP2æûæ3†›ye`’örÆœùR¥ÇÄ*ÀàYÃúí-¯q9šøînµ†ª b%¸\̦@Jbdü{"»ÀCÄ!3œÚk…o{í_zY%©!ƒÔ³½ßQWž™uIqSý ]˜ù­¡ï'®œºl_¹ÅPÿšP”¬\ÞxUvåùiÝùÜÔš‡¥}BíMŸÈ¹~î[ÀÌcè“- û÷öËN]¾¥,Ç'& |¹Ír^i/ÄÊÜYWߘy€Õ8 ÓÉžãVʵÆJF¶ z¸ç§ CâîÒy$j“ªÞðª~¹‘cÃíz@…>lž=°³5a7w±ÆßväPš×ÑQ”ƒWâ‚ß%g,a)]’КJ=¸Öá$úzÒpt.ðý+\íöwQŒòè@&vô’0ÎNb™Që;~›íçVp³_Més¡mÚnGìvTs¥ÖÑÜ?üM|o—kLwSé=ucX®ÞÃpæQ¡òj@yTÐ^‘¯s£ãâŸÊ>…åEÜŒv ¬ìçé=7ÆkQvbyŽ©'{ìö'ï¬û©€©çÕæªµâÐGŠÞåc(ï+:¥øÌ«ž0&åç‚/QËÙbÏ…µ•âÝâÌwÅ9= ¸|°ï¨nßûPÓ{ËW~§JÜrKåøj9}ÜëÀûk¥ø<€Õ妶ñ¹‘…´²ƒA©ÜÜíÐùŒ •±%”wyñ¶mWÃÀÔíÄ:Ôr²óÕ[ a#;CýåmÕÅbS—›´ò.7avn%* `Uæ(' ðtiAd)>¯ÒçPa[&ÖéiÅèòEcÂÐ^Õ×€}î"¶Oüiÿ!,èÎeÎæmL@àL@ׇ“F„³ó£]èOMÔØå>¡C‚ãÜõºÂbsnH÷𕵫°í”îç žlæåJÂMmï÷-ªa†³Oæô.Ø]UBi °^Qæy3¢-þ²¦ë›±[ñþÇÊÚ!Gº7žŸQF++ X~ÝzÓù ½v'˜f¼d ¾·t³á˜“ã—ÓLfaĸ0\‚“•ÃlKß„¢9#4˜NKš ²!sJ™kŒP›'ƒétóõXÝÃWÏø½Šcˆç®(L¡Õž™üŽ5¼ßsS`ΪhÍoROúSÞ…’*ò^Õµê½Æ¦kƒUØ™-» B5Cs¯9Ǥ´2ÏœÄ ÝÖÀûžÚ¶„àÕ{¸žöo E›gËsR"µ8’Z®…Yî>G¸dÀË «ËÁ1™{–âÕ¹±]oÁó~ýµqÕ£ßásÇ1R2ë Ö/Q§Mo1«¯ñ>¿R‰KNÙˆÓ9ù¥ÃS×»eCJi!gm¨ÔSn÷Ç—Í#î§EÍük'‡<^lØXñØ©€]ª§_x}CõnÍçï-W×lí—Ä„-BôâFÃהϊ.GºÅVªÕdØül.˜ÿÆvÍW–ÁyÞ:jÄÝX‰Ynˆ­~oõ‘õY‰pƒ…™Qåì36tÍ61^¬jÔ2¥~cg´ìŸ€v_‚iq¯7¤¦ã}écôW"`R=JÍP+ñÆ) ~ô`Ãü³ª‰M~Â[§Õl5þÎ7U,-µ¾&ÙßKSà›…€nÚwÅÒà 5a÷ÒVŒ‰NøRyœçD«¯KÜO0ÇÜJ㢉H/bxŽÝ†ÿhl“ò³1 +˜í΋c Â;Üå¥PWŸ ·û­Ì´˜dO}ßÏŠp¹°3|0›-ÊÄòåE4dù,á½³¬ÙÜ/—Z±^5‰£+¯^uÂfÕ„›ØºWÛ8¿ŸLI´è³í¸—2È®gÖ°2{'3J"zŒvæ KÔ~7O¦’ë3¦]½¶__tÇuÌÓâ[òagÖ?ª¤+–;”²¥­ióùÚõ·‹íFvîªUùÆÙo¡o¡ ‚\]?+}õ—´:›ï»Ô•¬Õz7EÈ‹'Xf{ù\´(¸¾¡+æWÑ[ŽçxØÝ]OU’ÒEo4 -ˆzÅwf+®í{ ñ´Û{†Yæš‹ÒøÅÔjéCY÷ÚÆ†ëzæËg¦½쨾ի…8‰˜Œ&F!ƒ‚Ñ—RÐ1íÂѰB!¯¬§#Mó“qüùoV{×¢M£^o]§ß>ö­Ë9ó0¤Âhé<àÙ9çóÜà’cÎÐØöÈáÛ)X½ë€FOK…®Œpl㋲2žŠÝ^Õöz<âWö÷¹:óOXUïƒÄGïTª°ïûÏÅr…—[ ûiõµK÷›`Æ­r#Eö õà‚ L%ì„×®›ôá6qsÜù–±í7$Áâ¹ZÁœŠ&×¶¤èYaóoè>6?½«°µpË™æ`ˆAYðlfÔ³,¸ðŸzrµ8"ÛAK'·1>•írõL±CeãòciÆ.æ&ØõäXU„U}ÂfO˜¼põ/ÿÕÏì3Ò‚a»³Gx`žë@^³wú˜uhhxw[Àû£ö·Ø*Ô–²8ÚOø¾”Ó«Z´|ÿD½Dª~ôÍh;T6ÜÊäžÖ|Rã}ìùŽ´Õ¢’>¡ùà`åÎç³#RC˜nµU `û5ßøÚµÀÞÒÐÑ>žË³V¶=¶ZÒ{ù'ææÜ–ëà:OæCÎmMZÞM”/ò+šÚíôÅL G9{:SÒ`¼ æ?[®ô¹Úýq]$=À1_k€ƒ2)<ßeÐÌåzinòã«|•'õú¬Zf\´¬ð¶ý.™‰ßbâìëVß¡ÓE^Ÿ‡N<Ú®Ô xÌY@¥önÿM^I6¯7Ð ÄÀñ§¡.z¼˜É@¥îÙ€†,_q£õÎægòÂk™¦KÔyËQ>‹ŸO^ˈSéΊk¨tŽªtž“îζàï= ¸SYÕî¬T&cûBýKÓyƒ;~ y³ÕåΦçŠYl*ê5í/ÆÄ¼äHß!UûÒ{ç¹u×ó¬ˆ[GŒ¶pJ‚ÖQ縆»î›¤~Þü`zá8n¹A¸º,€F°åà œ ×L~‘­æÒÊ>“ˆâà2‘tê½›ZSu[ݰãF­4ƾô¨aÞ\ 'TU€‡QVO‚¾è×á–$CE–_0ΰdô¶HpE‰kÅxp$u¹œf¯mèÄìïËëøââ̯½z“=tO‚cãZ§ÓZ–š€È^”|/j޾¢#óÒnå\ç•Fsêñt—qÐÂÊ*g²­¢×s7™ctÀ7ÆAUJoŒuî´ÇŽ8òº¢¦‹!†2ÇnÔ>ÙÕ༡åts$ÉŒ¦™%ÿ*4‡É Ð¸´ ¤Â£¥LÇj;Û¿u "¡`òÔ|b¤ûC˜¤• Hp-pFŒÖà‡^Ò–·¬5šðÃOmñCl:çwo²uãËK¸Åøº«F“dðÔn¨¹% N}S8‹Ç‡š,GÖ,öo0Ñdn= vœr#ô7"¼$)}ø‰“·¸v®¡/÷ÅÚÝη8|¹Åãë ïã*ÃÇ “u1"ϹÀ\ÿŠ&  –&þêÈüØA[T¸Î¼_H«^ ŽwQBGô4ªö¥ÚC]Žì×çÝ ƒ5Dj·ùž0_™÷«uçc­ˆ¯9Ÿ››&ÿ-zÂ/à$Ù¸~‡5=à8rª`(¡×Ÿ^):wª«î\]J“öÆDáü­ÃKV„/’È)V¯×\I؆…’Ü´…Y>ã;ªË„ÏЦDŽmÒׄ–†ìVÌMÛ²:Ïï_=jÒet!Áçß>Ht7ê ݨ“LA¯jª/©ŠâŸ”­âšXÞew¤¶ ¹AƒƒãÁÇíÓ ÓDùA†ÍɯMÔ™bô莎Ó‚Œ þVÃ?W?25û%qzúô(%ƒtÃs¼B¦°“ ÓDkQ7Q¡Ž÷§{t>WÃôõ/Ÿ %t¬›vn» WÇín#˜¡oò4âT¯Skãù>©—R)^h#”§‹<*A;6zʳWd‹€½]ùö‹ƒ—é•®Sw„òr13Z2s½o¿_×Ì’ŒÔsy›£+X}x‚žñ¤‡‹Èôa:X›J“«eL•àìøt´½]b+(öÊW÷^÷ó•A{EÔfæ—©aèÎZfó|Kx‚æ»íúcÞ‡ün¾=ªòìüù†°¸—RLÒep®˜Ã¾µ@%îÑg rº2ºàï:ÆJö¦pÎN\Å$®3ú1j¶Ï—²65Zç¿êñâA!ëˆM{xû¬ÞÄ:3ºÇ×·%Þ÷”x)RýxÊlÖ4+Ff²fô•ªøuϤÔÎhclQ\Vç}ÝÃßqZìÃÜQâ+9 üû¥U‚íuþ–›•ùpVJÕH,ï5j((Ÿ?¹ëØÓª€R=#?í&PœVhävÍo/Vúc™Z,ÓáõøR*#_)ñ)eä§ê6‰âŸ§®¯—ܨëºÁÔ:‡ûIu)»Š 78|T”ñ= ²©s:Ubj\{­‹:†Ög(Å6q»:]±TzÏ-6ÅY5Ÿ‘ç “v ó¶Ð1ǘßßgj‚1²4áh芹Ó#g}<ò©ù—Ï—[.¸:1øX«tz* é^ªä5õ\nýXQꛉ±šœÅši÷¥/%ß3Þi-úžå%*·G®ï–´jkÓ­èþ[Ãq*Z¥ØÁ±a 6ºØEè\L‚Ð8öfâVûÖ­—{'/8O{òv·Æ›kV°L6ŒBа]''L¿…òŽ‹¿>ƒŸ„í’12$,•µe—™vÒž{×·câô¦,­w’䆺f:EZg¯ümYúˆõÐßýüw9úãùï`åùï¤ÀïùÿO#ÝÎc¡}Ñ0øŽKð‡•ÎÁaÇ[ù×m?¿á/ú~ñO˜'@B50Eÿ#Àp9,* W„ÈÉA`„¼¬,€N0‚Àÿ«ñ߈ÿ¿jûù ÿrò@âõ”…€(ñO ü3ÿPÆYòÿ ®¿\<YIy”ÿÑ$ãì¨ðÿz±ÝÏ;"ÑÿÙD$ Q€e% çYà_ÿ¿lûù ÿ@°èñRâŸø£ÿg×3Âö™þÓ))Â?‘_þnnm*ªŸžuuõÑÑQªæÝdÍTÄæŸ=I¿Ì?éšÞƒz›—Ù>ôºe9KÆÍÑ(tÅÙz·7ukäÂ\´hðýºJ‚O*éX·¼æ¥ê©9ã-­Ò·.6U=›•Þ¸™)«n›óvÕ·Í÷oÄpÇyŠîuyè&E´™«Oä[‹E^Lšéå‘îc›(/‹h[Ý£ˆ~8楪g+ÁÀI‹v…?³:h–9ûåØþò° :Î|'VÄ»ìK kÚÐnÆÖÏ4" âŸÍß­TE/»‹~‰[ÿ‘]ªéY­ë gVÔh•å”êWùÉ@ÙL»ß™Œ÷>–1ñÆK›U~L¥£uô鬨*ØÌ|ýž?æøä„P3_ôPéó…ÖHEw í]t7‡¾=FµMÙ)¶è*Ð%œ^x©æWü~Ù•NŒ“Þ÷Ý»pؘ]é:hªt4»|]æo”G|xÓþ‘ëÜ0VfŽ1³#tÍW«_­ÝHíÇ†ŽŸD?ŠzìÅqLtpñ—–ÏɈ07o[wn驪Ó/Nõ\`Ð÷+l–­ön ÷‹»R‘îñšî<ÚëÛ²ès8'Íü0;ß…¶#÷N$ýNÛ›à!kK‰xÈwmëVÎ~˜+ÖŸ¸Kêq™ð†»’ø™<¡V[EËûcGe–7»ëòPðÂ3““–½Q%I|Å9É¥V!7[û`A™YÊà Sroq^]$ü‚ LÖ ÏÚ=Ƶ5‚ò¹cDð-‘sš°š|’Mï²uëyø¶¹p ?=[ý(B™5ƒVzh`핇/ûX–Y²|¼~r³g9¶ }wc½F¥;%Éü]\^Ïö…§"´5*Í´¬fçnšß=ÊÖ¸öcÔ¿ôÛe|D '¾.jU]Sä!bh}®\ÌÔ'©{69¬wÐÿ@ký\°déÝ©rƒš{L‘µµ3Å›~ó¥­{ž‚yÃdE­g“`ñaÉSîƒ0úòË> ¼êã™Õd¾' !mü7±ç<.š–î–cìd—xøñVlö?êöŠuÙT:µh'7š&Àõêç ø¸„>ó`}aó®ŸÏÍNÍèåºW†`év¾ÆW„i¥NJÓ o'E(‡f½8ä”.µoX°ËC ±‘ ¦Ï«9 »þÝ÷6oìúQ&kË$ÞÏÁK:ê0·?¾Þð¿8»óç >ÿƒÿÎü†ÊË!?ò?;×ÿ”üÏ¿ÄüCȇ0…R€˜(ùðOÉÿ’ÄüË“ÿP ÿ¤1ÿ äÿ<…R€˜E²á*K០â$KüÿÔ!rþIbþåȇ …R€˜ ùðO¹ÿ' ˆùÿ[ý?ÄüSîÿIbþÉ!ÿ¥Üÿ“Äü“CþJ¹ÿ'!ˆùÿ{óP  ƒ~ú?)ü“¿çßÇuçö\ÿÛnÏ?b‡à¿àÿüÅ?À?TJùý7’@ÖIA@ UE(Ê`QòÎ ŽÀ¿{|ü{ñ§ñÿ/»=ÿˆ?9ÈïÖ(âÿ$ ˆüŸ÷`( 9þ,þÿu·çñ'ñ¿såÿûó?òû¯¤Á?ùý·>ªø?YDT3©ˆüŸÙÙÙ!!!ÖÖÖµµµêê꣣£T?üŸÝ®Oô¨ˆýŸÔî;þO×йþ:ô ,Õ»-éç TÚjç'é7^_’ê;-g?™9Î|h‘éöþ¡”«&âQè ì8p:f3ùô:§N,r£å{È‹ï2å5_}eêI>Gs elFA©u#Ò|µñ õËul„­>Ö/±{a8÷õL,"q‘‹ º~&q76š¡mWSÓ–áž!æü™¾zjÁ5ì6©Øïrõî4чÇh^e$(gÉ)2_–ãÇe°/îΛݲÖzŠ/ldxåÙeýjßžŠrØRÃÄdÅ¡ú³·y²…®Nvïw®i9—ø  xQÜž qêb{h³ÎÇoožY~l\ioïzsŰÞÌZP…s»S÷¡ÎÆÆ£킪µ=»±dNúóU²Æ?+C“ÀXÚ_à¢:±èþŠÁÕZdåÊ·àˆ~Ô«õE/7ý×£0š¢Õゲõ‡ESŠwv¦6¢?¿¥îûvo Z¦"¦LíÜ|ªòI›'½ ŽH‹Ô{MùV¡ fuû²a[,»G‚³9÷‚ú‘³,“öÖ’È;Ov&÷ÿigß_ñúOþ(Eÿ%!ˆù'ÿÇ/þ)ú/I@Ì?9ø?~ñOÑI"þÁdäÿ ðOóOFþŠþOóOFþŠþOóOFþŠþOóOFþŠþKñ/ëHüÿðCþIâø'#ÿåû$qü;‘ÿ¿âŸÂ?I@ÿäðýOJþ—” Žðÿ3þAþIâø'#ý‡’ÿ' ˆãß™ øÿÿþIâø'#ý’ÿ' ˆù'#ý’ÿ' ˆ×8ðÿký§Ä?I@Ì?‚|ø§Ä?I@Ä?„Œô ÿ$1ÿd¤ÿSô_’€˜2Òÿ)ú/I@Ì?éÿý$ 柌ôŠþCñ/GFú?…’€8þÉGÿ§è¤1ÿd¤ÿRòÿ$ñúO>þŠþKóOFú?%þIâõŸŒôJþŸ$ Ž2Òÿ)ü“ÄñOFú?%ÿOóOFú?%ÿO¯ÿd¤ÿSâŸ$ 柌ôJü“DüCÉHÿ§ðOóOFú?Eÿ% ˆù'#ýŸ¢ÿ’Äü“‘þOÑÿHbþÉGÿ§è¤ñóßÈGÿ§è?¤qü“‘þOÑHbþÉHÿ§äÿIâõŸŒôJü“Äü“‘þO‰’€xý'#ýŸ’ÿ' ˆãŸŒô ÿ$qü“‘þOÉÿ“¿ç†rôö><ï‹rôq÷²twƒ£½¥w*üޱCðñüT¸Ã? †B PB¹œ<,Gyþ ) "¨c®myê˜.ÀÀÒÔp줖‰¡6@HJFƤ-#£c©ó³,-+°ôrD{#}îhG”ŒŒ®™ƒÊÎÜPSq…;:«©œ‡û8\}|<¤àž¾È ªBÚîh8ÚGÊ2À.€ý|¥*ä÷÷ù1ë”a®Ž^ÞpU¤·»”‚DQJn§O¤ ®f÷ü6•¿›”í™ °øñè*4 ®"ó³ƒ ‰v¸zÁªBÒÒ2„?gwÿ8Zæí-ð‚£T…¼}PpoW8ÜGàCÛ¯!íT t óóÝ8¹;^ JIôáh¸—£ÜàÐùÙ@N, HIê8#/~DŽª'í ÷RSqüÝ¢!ýØõ#®„ÔL‘hQ´“·‡ò1GÂûpTþëæ®HÂp¼`®¿ºøñYüìÃàE©#G4ÚÝgçý±#¤·Ï_ê$|–¿Úë¶ÿÕæ¾hØÎ”òþãLáçQ·ÓŠ á3Þ™nrj:u~°¶Ã»£‹Ò?Žþ»†B;ÜYºÂ\ÝQÎÞw4ð£X` üçH…œ S‰"LSw/¸´´ôΘT<þƒ½ç€kòh¢â¦"¯8ŠÍ›‚ P† îC’hBbò2´©£Ô‚Á‰( (N†XÄ‚{WE –‚8«@ò‰ˆ³.àoÂH~h¿Füÿx~@È{÷Ü=óî¹ËÝ»Æ:u¶†Q6©ÅatœHÃNŸ¨€ ±/Ä ¡ú5§ËGÈ…|ÄRW:Á~à %,GàÇkx/“°ØuïQ‡‘4`²xÍiÃ#àshU¿ –D`’>àŸh7ÝßG(`CéBSêåGl± ô.WäÊõNã'”²$€v´-ðøàa@Ý[D,Ѷ–›/––8 ¬fSGC4SƒÑLgjYƒF –”·ƒ #:Ž@cÐpæ Ï_à‡@Š5Z­iŒÆ¦4 6cËK—1‚ˆE¨Èšš›-ÞÇjS¯Z¢ü·dIø$Y·"LBƒ0ÿ‰¤hä -›¹ÄÇ"‹á(MiSV•!‡+c«%h× ½h µv“¹2DêÏ͇Ônð¯›9ñ“TãêÕAlªžÆÎ>Ó~Ѧ5F«‹$}Ûê×z¾IÍøV;Ó(–Hb󙼫Ûo‰y¼zEç)Ê‹†øÆA^Í '«€iØ[* ã¤z˜Ä|dÞÐL  a´ˆ¯ýE èa¡¨¯X !|¬5%ƒx ¡…¯T,¥\PK(‚ÑRO­ [¡:¬ù˜qñ2ïÇ d2e“‰b2™þˆ@ȤóÇÉÄþR6·nâA+¡uÔUÐãùj~?ÞtàÛJl‰¤Õ¶A™fþV3Á—B2Á ktäSš” Ä ŽÆ€ êc@js³Å2˜íC/ ?o.4…ë¨fP¨ †ˆ0V V'^šÆf'h40eàñãë#B±”§Šal"$“²›†Ž?°N!ˆ]ëžXÖ{‡HÀáï6Î×jë©‹mñ.À# ³hxYXª#`»/ü¥«ºû?_ôü/…H&Ò(õ÷¿;Öÿz¦úW»?ð¤GB#úÙ,„Íçˆy:lÛûøøúŸ@¤hôO¥`2ºI0رþ×|=ëÿºåŠf]ù5­õE`}ß±ÔoûRÿ¿6Ê}XÂæt|J ÿú¼¸BT.ŠiºãÐÚx¨k“ ¢7Û4Šc‹E!áBº…~Ý੎U>h±@¬åóñq¸ŽîÖŠQêqúõÝþèžz‡AàÇçJ¨U7ì5Hê¶ì0VZA5J±¥fG¡u:9`UÇj™N/ŽT³²“€hHÂj ¢ 1ëâ÷ØlsÎA‰nûl1‡kÍ—HÅ— ¸^h‹W?ÒZü{LP¦¥MIúZYöUç…k‘º™êÅC£¢el0ÈpÛÌw[ZnÎ8ZÔ~”ngµ¢+§y@cê3ZÖ ¥·Ä{½v¬ÚÄëÿÊôÂ-á#Ü~žªÛ ûmqZT¸ö¤ó™bøßÌxz¶Š¥pØ`IÏ1­QaV3XÎÁwê÷ÓYß[³{%ÿ~MÑ6 P%ÀçÉ)ˆ5ÔBÐìÛ‰XAL!×Õm_‚ 8H-Ÿ™ ˜î X(9_“dÚ4%¢&¢Ù„‚  8ÿßæR#³èºÊÇß×WXi#yƒ"Gu‘Æ#4Õ¾&Í·MäV¥¡¶üF1Ô h¥¯I mŸ*´œ Ñ´q¼¸š]ihŒ”+û"óD]Ü "þ,¡^£Fô¯ÖÂF=ŽÿŽÚæ*ÄDðUFm÷‰–´®?µO7¨ÿ´ìŸ~zã~$RˆH…dÉšAêøôæKƒîù¿v”ÿ§ãþ¿^@÷óŸöÿ…ª9ÿÝqÿ_/ £Z;ÊÿÒáÿz]ý·£ü/þ¯ÐÕ;ÊÿÒ‘ÿC/ «ÿö“ÿ¥#ÿ‡~@Wÿí(ÿKÇýo½€ŽþIí!ÿ µãþ·A×ÿÛQþ—ýëtý¿=äÿ vÜÿÖ#èú;ÊÿÓ¡½€®ÿ·‡ü/ÔŽüÏz]ÿoGù_:ô¯ÐÕÿÍÿA%“€Û£÷?ÐýŸŽõ¿^ ©þ/ø Å<&ÏDOo3™èaòñ"ÎçiUðGòÀ0Y[ÿ œSàŽüzš/—@à$º‹M¥R­Y"ìË¡Ð}¸dáKÓ×ÿ.|’ÿ³$ŸÕÇñ"Ýñø?Öáÿú–Œ‹Þ¿çJ¹RŒ”ËF  0XËÐCŠL¦æ,#0 õiˆ`MÅitˆDq$˜RKÂs|M¯‰7\‡¨t"Ž!:LÁ‰ÖõXm¹\Qi0ŽH!At G¤Ãõ¸> GŽ®æ4vDG¡Ð ‰Œ£ÐÉõXd`í-a5ô¢Qœ5Q¬I8k½Æs($m¼€Yç, ¸k"ŽJAeCÆQé ²±Æs`ZSk@"` ¶„Rq4U‹P˜¨…$ãúÉÄR ¾”+Csh÷KµÆÑ¨0D¢Ñp4zCD°²³Öj=”\/2*¦@ÀápdQ«W6©µtõ¢©UI±†µUÉôšÓ«-XÔ`Ȇ#‘`-áPØ­]#6Æ(Dˆ Óqš¶Z8ÍXÔ±:*‰¤¶:*UÛrtr&°üüüýØôšv@˜ QQC"‘´ødiÓˈ:\ÒÕfG¡[k› ¨‚Ü‹Éa!, 8Àà‘ È&k‘«Ã£¯³Q£C{Ô2: |nŠÕR¨í¡=jÙà‘ÎÒÂø¡Ö.–êø ™¬¶9*LÖ¶9Xým"-¡6ë›HÅÑ  "G'Ѿúu_|Êü/ñã}VŸÿI*¥ÙüO%’:æ}ÀúéîN=1ƒQ¯ëéâ<ÙËÀ  ü1잸üp‚^¾îêý]Mm­““S­Á A’S§NÅÅÅÙÛÛ¯ZµêÞ½{L&ÓÂÂT¬­­u¿ñÎü× ñrŸa0±¬È×À2p™ìàó$Ö-°„¾½üýÒk™ßGÇFöÚ.#þ);PN_T¦š:3'Æeæ…y¯·HSâå'vÈb¦ºgKÍ‹ –X]:º®ÅàM·“!†#owï}ñÔâ°©†k-ð«·Së˜SñÇ©¨ñ!³Cm±Ñ¥ª"œÇ%ßå êUEúÜ]òëÏad2;£A±&ÛU^üMó‘¿6_åüe0’§”À/ª=gHWË ]’&‘Ïâ§Z ‰óT¬ï–”²ìÙ Bl<8åÁäë‚£H&'ãáìM”YŒì™UsÞ„oÉ­<ádû‹)?!Ϭ0~á~(Õë°¾A^6ôÜsSþÄ`Œb‰]ž.36™½Ô›µÈ6sÀ ¾2DžF–“.œ>x#·PdŽôÞ9tìücžyû­‡Ì?FÈ;Ã8üdé)R¯§§øgÄ™ún+.üm®‡ÑÛ2»GȰ¸ªHß&Zr§"‰´§â ›‚ñÇí±/ ++Ow8ú^¸th/ûÝË_÷øgl“¿½ H6Ú²¹vnõ¨_@Azgy× C‰lóAÂDvOó‡A¸DvsEPE{€ù¹ C ìAæèËó„ a{ÅÖ›£d߆sEWþ–ã ‰Œ×¿.u½XUôÝ¥‹®ôzP9§8eÙ ³ì~ØÇÝ«¯m½>Šavްö’%#3€±Ã•œý:/ý˜â ç~EúOòë±î£~°-ÌK·w²ÍÌKÏQ\Y»pê4åœ{*ŽãE¶I,áèÒYAñ$yÀ†î¯l¬Îs‹2êfúÞžÈ8ÊlíÜyC”áÓ1C»+Ã÷)\Ö…^²%ø3väU L&¥¸ÛoÖî ŠAÃÍÉkhn¼µOãÎDåZ•PÆo]=$‰=(æ‡3}Öùìxb.ãu¤ƒWOŸÇŒ•/ÞzÇ ;Ÿ5Y?ÔÎ8@¼U>àɼí›ÌeÆ+“\fQîâÓÕ)!ÙU¥4çK‚Ü¿ß¾ÊøƒÑÀDö`¹të"•ÀÐ϶L%ú³Ûáa–çÂØ-I$d9f.ÇDyoq¸ÜAQ<ª*èýìøUk Œ‹®¼«ñUO »}ëšO0[!z>߯‚¦¸äÏ€y®»{öªz O¾äœ¹ôæ>ªmšýùØ~I ¬±f¶ã ‹óö< <;½‹7Ey?ZžòÇ÷ƒƒn'¬±;“Dpe­é¦ŒÉïúßùOü„5%)¦,õ'£—Œ_#`ô~cÙÐ,G££Ïï‡v¦”wÚ%‹B 7£T—±ýÿ¬él¼ÅôöqQHÏÑ·¨4åÄjÌùÝÝTª2Cl”IæÀÙ}Hµ§D˜žÃëÊšìtª:zi>¦ëÙ±kó”ü“©ãnõuÜæ5ñÙaòr§Ü',³`§à€ÛÈ ah¸Ó{ž}ðçÛb)ª÷&%-½¯:¡ûÏ•Jb,k†  yÓkˆ Ö­Ô‚q]¥²r™ö6ÔÃaxÞú+oT|~Qæñ PB¿ßOn|J߉½>ÂbYDnå…{•…Âs{üÈ&ÅñÄZï„s¶i݇ögdG—˜ Y)ò,6;¿ç•â¼Ãfgîë~Ô÷¬Úm·ñ«œO&uK_%ë=Š™»Ê.NqþÜõðÊ’°×ªnµþG,ÃB£OD_¡˜üíûè•ÿù»ÕÒàC3ÜC«³<Åû«²]“ö"e åß-˜‡S m«¹'0[R?¦Ð"ºî~_iÃÍ|ñ×ÐÇb.T‡Ò’Ȥ¯®Yþ¬rûÁ‡*„Œ5ª zþŽ‚õÔüÕnOåÁ6þåaÎ6Ú¢Š‹ž—Û&ô;lÏC¨ùï,Ã/ŸÃY/~Zà±÷²!·{¯8løÞIÔKWKŸ?PaWý2b‡ó·¬~ÑNžwŸŽ wÏZ§]ÿ<0Ãn? 8§¢¸!=Bö p©Œ¨t·ŒÜ•é–†ý ÿö¡wZìˆ_±Ž–˜µ·rsSÜyÙ{–> £Ì;YúzÉÊs÷rrì~²ÚëµÍ©w·W›Z+ŸÓ1JvÈw}¿«k챫½­ŽXQŒaàyÈ=»âˆE¹Æ›"bÜ¥ŽFK‘‡‰¼kƒ¡¢Ò}±ùÎË›ä-“†d%Ò·ÎG2á΢焼ݧ$`l·Ê²ó3b)ظ…£÷ŽY1MSf’¬ì‘*X™b™ÚˆÓ?u=t‹›ù®³}Þða· véhÑ`¿ JkL;a½Î ZÂ<<)mÒrFìàYK6<Ää+'öì>QÕcìQw§ÇdžGò´5æ—µ1ËÂóÇd±:ˆuàmuã?z#®Täÿ'M^ûó_ƪ}ßÌ-2°G| "GBØW}—WaÞïØåYà™2â:i¼ÒÓéÁmé}¥ÕìÍ•¼D[l×ý‘³ßw*{=ûvÍê|Ïq)ô7¶:9;=ëQX«ü¶Fv’0's:ÒÿÆÈjIÃg¡ßŸÇü"¿µß°jK[K{c ·«1ÌâTw¯Á,›•Ø¥Oõ9sìÏ1?*÷Ý´qæ›õK·¿8ÅibïŽ.+#ÞLß)œ‹b²ž;%OTîÛÚoÔÅ ;â§tò.ƒþ¿˜( Í«À‡üŽ]-wýã¬I0›ñ]æ­’.$$>òìêô}MoäÝUcï°¤Y¼ñÁòÊÎww1Ö_™µ3/ó¨qˆ»ûã¸3ì]ò²¾Qñ] m.›~¨­ñœàyuvèð…ª&“SŸ?È•ŒÆö¼\î±à麈’™#eªÑ5$±¨*ÑþÆ"ÆÊ¤NçTÕ®]õÛ{WÕé®]¢”€Ž,ý&”ÝU-tG˾Uè®ßò®Dž Û É5¿<¨­dY&œ`—wÍÝà4 ü…Šô;÷Ÿ–G4”Uº+¯§íFÚÛ„Ü\ߊ  è^„¼[€®lªAßË’U¹Žaœ=° ¥/þ&>W.³‚¿ö¸«˜ ú%-iÂåáGOžª¶Ý„Ò„7iÐ >¯!oŸžž]ÒàÇA“GEoús]túeò¹:nØ×.N@ñÏPRî.àCÇz߻ Ó}Ýf ѼRÜiò$·88[µoß^â«æ«+ÔË•åÏ">Ñ5©O¾0“?äÀð‡À žh v¬Ko cËËc|„® }kcw&_4ÃîDiü<£WŽGJIŒ7™`<™¶¶þºô0ö}w½ÌKô‘; +mb¼´O[è”Áž- =¢çµªÌüE8ãÆ”Ù¢/oޤÄ<# mÐ /˜ÜVòí+*eî² ,Csxçun›F¨â³`»r‚À Ã"²ô—Ö—¥ÛÐ×Tž]l×wŠÉ¨ÎU?À!¼i´Ô%g/‹ï‡§' ôxR¡ò9pfüÕB»—¸}÷fwú|Yù¢§÷ð­É|ùÛžvø@¼øè‚ãSý cÿXp ‹wÍÇOUœ{Çfî{¨7Ñ•1ê*MÉÉUC6_ôòá¥'hdo#‹Ï{•Ð.î´A‡vȲ–€YN c{-¿Ý=9Uà ÔAˆDl)­6Ìöèx åúÛÁ­b~E,(`8‡L9›¢yRÆÖ‚“rä"B9\,–Ð+šÞKGQé¿ø¢z3ÓƒÔa,JœCöêE¤8Š¿í"^5+P‚‘{òµ‚Y^€aN€k‡JSùÕ“ñ÷»ŠøPªñ—™»Þ.`e-œq¦–f7¿–Š´v× º,8õp´¿³[Ì ˆÔš{?¹`Õ+¸z¾dÍdSƒ'I£¹Y­É¾ßç`qS>;0CšXòf‚)Ï~ÌW˜SZ½+‘ Ï/•g ÍdèOqwÖ±Õ9.øõÓ"ÅŠL¼ƒZtÄWëI«ng›D— *æ3‰ß˜Ô<ªã.ȧ‹å|ߤ×[û©8‹gb?¶ßbÃnÕ_N0ðñ o#& »¿±¾ý¨¯Œ–JYP߬†˜åÄDêâÖ¦}"+XØ…Nà VÃdzU´b"µ×bG^ì?ÞÊpóËþ;#pér¤twm]­ÿû\³2ï¶üPC•ÄÛ-·¨Ô_ï‰é/–îsÔ‡–L£ôS)ñkjå¡mP»±q¥ùa½/uü)žUÒÆ;o4/¾Ü î{zðªÊ¯]<¡’¯~/¨V)zB½Î›~/Bõ"Õ š}°Ž{ÏtðÊ~Ó}_£ nÂô&Æ›~Z!2ûݬ )eí.ôeÙB2e¿)øÇ-M~ǃ¡Y×lÇB”öG·˜!7`˜]>œ§­¾:øB¶Këq”ùyoq—ßrb÷iå, å{µ‘J%Е˜R wœ¢|DrN;ýöå^Fpô¸UÆçË,‰+­SÞ„ªÆ®³¦Amuú€¶é;ÐëÅOÕyÜà¹aKCJk“«í½ú–¹ô­·yJ ¹Zñ:ãG\‹áÒý˜GƒÔt¥&­d¶¢Ã uN·Š°0NCÑ:Oûsé7{.sÉ´'ÃDÛУ8 ù ’è°»hL¿[,ºÒ º9ÛMÌ:d´ÒÁ‘›©†áp(*O@ÞȤïð 0YÄr="U}Y$…pÊ ÕÌø‚(&‰hqZÉ4zºok:†;„Y™2K\; lêÃ=D÷1ö»Ü ­Û4Tå©ÍçÃÝgPëìæ3ÑVNûSÜó…)7Ë<þ0ñ8ö…&›–E¦‹±oÊKñæÛ=›úEÉЈP¾ž-Iýøl®1 m*KÂèoÎ „z段dj¦i±õAïjX™âPRÀ?&»¸Fà*‹™¬ç›½›ü˜ \¬QE‘x'r‚ô¡$å<yu_I¦Wý- ˆAN„r©C3`s]ñuFdBÎ:#}{¬%Iz$Ìé>¹¡_a~ˆl/2¦ÎT€Û%æyw^ñPó‰tþû>”8ˆ[ƒÓ†–ýÛ/=Ô|£.Îe Þí†#nm‹¿Šœ]AìßHPµ E²é0ñ]®àÈ7ká'§OK_AV¯ü´€Ý´¬&m (’öš¼å=Ú£gPÔ ×Òt¤³38ÈäÚÞOWï5‘Qÿ>»Îæà¥XšŸ+<`LùI‚ %œ†#ôûy^ y‡´8€IŽ1êàub”O¥R³äH!±hrÐü&Ûá]PŠ$¦µ(å3,s(¾¥µxš‘RvÄCÕ op£m~ ³c 2“(eîÁ…VIT j@úm*?ªx}mó/¡ï,ßÈæïh’9¿f9wN¨̇瓀­û*'ÔÛÏ8‚îZ[ìBO†r¿Ý®Ï‡ïÆó×òìGWAñ阑ØY<|¶æZ¡©[‰»ùTøYõÙxݘøå ±4# t©ˆAù"OTE"Êy­pX—ñÐWpc‘ MÁ«uÄþ­¬Ê9D\e®aAaí»šnðFÝœÓîçò HŽÏ¶ï^ÝTN`“ið9TÕ;P/qv ¸+!úZ싆{4îáç§HäP´NüâbÑ>wÍ]oA*·e‡_þIáC åQ¿z\ïä"ÆnüE{k»*¥ eN'VšÔ´©Dzä³8…¡À¶÷ñÆ_Q?ñ¯CkÈJ wKÁéZýI·óá‡R޳ª½É‘Óeô,ãu¶íª"ª ž$Õ÷ju7³CUñ É¡6A@L %+ÊŒ/ÛŽøYÑÀµFJ~Á'¹6Ÿ-ý*3å1†ÖèðfFÁ2ù'¼×í: ¤Gn±¸õu& w¨ÊÔ”Þœ /.¼Vkƒ£c¡øÏñÃGš•ÀÀö^xaòJ¦¤ò¤æÔ[L&âv?«`üÓÝ#Ü.³%ÜÁ+nÑÎ íûÑoß=iÑàö+ó†FS…RÇn|ùF@ì^Éú|tð$‡LëžT~êé.´¨2WC8û ìv)Á øXT£ÕS%.6KΩ ÁõÈç#¨ Š… S€Û¸(ÛÒy¯Ž¯{¨ã€Ù®c4üàÇÝ$áSÙÚ‘Ø( 3dusóÙðä³@žþˆ<ÌóA¤yéÙ>bÁ_É|ûæQ®™+FKûŠªmB>ìfµ‘ˆйˆµßôz!B“æ¾Þæa×ÿÕˆ÷¾ˆ!{\KÇÏ40>§'‚ Úf:4¼j¶Š`f-8fCã^(QPX:Žb2ónÙi(¨eBsËöÒ# Y@ˆŽŒGOÖ=îg£ goz¬ &:EZ/ Å¿VŠÊ žŽz‹ÜyJ”µÒ1°<=°dê‚#^ˆ=âÔPkY1ðN]›,OŸÕó ‚„7ÐV²VT¤«»µx`C'´T ó ×Ò#•Y¼û‚æ÷,±k–µË(Ô¤MКeÎ#ýá^I•Nž¶æ#{–:íÉì<é|„ê¦Ô¬}á2ܨ}>š­0R4-H¾¶A‹M§ftGô†a½.Û '2ÒÕ8ypðrÁ$"3•÷¡§°:F{:Ò1× @lí~úd}1 ý"n~SEË߃!œj:¤¬•(Øü ª£¬•(ÔLNY,kø ‹²µ›‹›Î57›!* r')‹ò³6²‡Yä¢ÏBéPû?SäŠ./# â²3ÅhÖ~¾¨ý%VÖ’GNk•=Ášn1¸n¤c»cŽWä¾¹¨Í4Òÿ1}›²¥)3]½¡$Ûì¡æÄ~qn ®F¾>Â¥˜ñ::rœKs—m—­ãC:Í–ZÁö€jÛN2ÅÈòZKŽÕùUO±Àž-Kî›e—$ý ”!,l)ˆ‡›"iÙÄ鸱Яp“Ê õ¦džôCèK,¦Û{PV}Qdª8´ˆlÒCU’ÞKrç•˨{®ˆ÷1û´8'¸M›/¨±I6¬} ÕØ«ô~së¢âbÈRÊ“#øÔ¸ó|w?dí9â<%ûØùbïXL­ÇÆT]R6¥ }òèet‰CŸ¤øÔçN–FÒ¬­ ÓÑ s¢È{=d«B"2L‘^Å$iäÌFùûÔ4îí'°ª6••N 6•Ýâ¯È¤[BW–Šç©c‡ƒýl žg2G©ø'êG_§S¯ø¼@–œ–ÊYrÃoxCÎ,îÝ“¾ÏÇ•&œå:i³RöeRq§Åè.õ0ÏÉN[nHÏbæ Ÿ2QÔÑ®!^Ö§kQ,×¹;çA;–<ÞÜ—ó=Ù’—qÁC´âs9c ¹Myâøñ“]Ý¥'a…NG°û ·hó›$f"Võƒ¦ÎàgôßÜ™Tú ºõúßÐ3¤9¦¿˜µîœ4¯•y¹q&h:É’ÑÁ­²<£ü‹û]Z,•bzóŽmåþÌžÚÌVPUNÉ,MÖ9îýçeÏ#_xÇd3ZÜå½ á”Œ.ß—d”°d³[^k¦­¬Ðå» —µ )ú·¸Ž_Flfní‡ËCÚןJ+<—¦íåö· [‰Q2Š®ð7¤És”!Æ6”cVG&×Oo䛵j) åJ¤Ë§æP¡SÆÂ>å1ï@ëKê§0UNç’WnSi&úeÂ2»æØœ29(±au”wy„™ f«ÔG/¶¡¡7¡°‰—QBZÎ=ŠÜa3v½7mPlwÑÇ&à%ÔÎ{jíæ-Ÿ¾ä¾2ãîz? }¦€zWRT•óãC.ʪiÜ:`¸ºÊr#_Ú`'å»Nw‰TÁ· ¯<ÜD‰$üÍ("§¡Ø®¢C–ÎÜKúYèð2h4y­O¯%!1åí`3ž´ÛoLº-‡¾‚¨óÐW8©pÆU1jLž{ê·`3¥Ü{Îd©Ï7o"톂BÎpõ[±Z°-úÔøsvu ˆL‘JêXø ÜzÝU´áزìˆÙž—À±–…¼wÓ!+'—/×d27DæY{(Ó8®ÏÈ´Â6t¬nþ3tPÏž;©É3ú2˜.Z)WRf¢T\¾•ýÌ+ZÙ{wÞ ;@O4‹ÛÁíˆhWU¨H®®¶;Æî}ý¼_A‰©aEó¬z£¶ ›ü´2ƒJÌH»üuŽÞ>#ðn¤ê‰:ßÈhb {1×£1ç)m€òÝM™˜K-0¬,`‡–œ¨×Nb×ßIˆÆ4W¹~ , Fd@ oÍpÅÙ?|9¾{ä´·•¿O´>_xA¸‚ý4'æ`-Ūó™ß‚À —Â~îÄÒ+N¬×T$ˆžšW4Õ7‚æü]¼l+­sÌæ¾î‡ÆËq½>^]ÍEþÏ,iÂbÂðâêgàŸªåËô6õ·Ã/Xê¥Oªü„AÚ$´Ž--¿”Xß}ˆë5Äœn!dI›m ÅØîrž”ƒ8Žð§hfæà#%Iƒª4w:)‘¤ÇôÎ|“ͬêRšœêGô˜èU¥Í< ~³žC´P%{MÈàkÌ'²…suÈòÜ<ÒÔ3:i&ëìܵ:WWV`È4¡Y[y­òqHÛ† ¼kèx×RyäF“Xuz3GçѸé㇥|kÐÏ ƒZ˜Ö`ð:£ÁIo4‘ç ´kÚF@ãñgAü>A>qš=¬qùšs–8O±êg3=­:^V·Ód™81j?ÕP=rò}p å¹Ñµ1¼õÎþ…€¾†T‹´Û@á¡y·ÞeíØ"6™T¯Ö=¹üA¼‚ÜRùæø-«cû¢÷ïášìF³…zZ†¥†›$op¼è¡ÎÂ"i~ÂyY6oO,Űûæ3µ+R/RÚ‡ Òü˜ú^Ÿ€\=§^‡¨ßT· £x´¥òÍ•ðÃdzhºp­oa Ћ† Ü—B¾=â¢pš»!±{žì3Á©z—E,k§PMFœÕBWw=Õfɤz‹ÇîÝédçß·]çrOA,ìe¢½µæ`¥õKj7ãJ«~>¾ùªÛ¡‹ÂãƒGÚÄm\Ýñ½wÅj_àö9µ¦šÍ{¨¼'N¹ÕÐÓ^pm‡4pÌŽ3°ÖeHÆêË´ÖÆ×¨fôà' }kŽ­æÐ`/þG$”ĪªåœÒËK`Cª)#ª¥Fƒû®û‡–.;s›‰ Ä »vžÛ‡~õDˆ—7ðn½ôe§ énI<¯º|I¥Žw×ËÕYAA)!*¶ ½Xθœ_›!͉m2à$Ì}þ¹ì!*C@oË®‰«ßåÞ^Ë¥:¢_ëc›³k“2BŒÝ˜Ýh†ŒMè«jŸû\S. ì¹!-è˜.qîžÐt²Y¨²Ù”y/¼·Rº}ß\ySoÃôèkÚ°³çuÊåÞ;C-]?h¶º@ÒËÕgW >õüÇq£t½•m¿åù–©öíaëWÂÞü3c(^=­©½=7ŽW­Û¸\yî)1‘W•ö¢OVÀp“¶ß) Œ„•õ>¬´àëaf¾ôyÁ“r¢R­Dî°$Üöx¦€´m$·.’»¥vïÆÚYZmÃéJ4ãÓù2R±(qÛ{¶¶'î.4¸ÏĪMnB߲ђ’Mty´KЀ`Ž£" gnœy`xû)îhf¾ÒuV’•—Ð\—ææ`dœª¦sgmïc7”œ(²ÙG47k—˜2ׇۣ«mBc«ÝkÜäªmŠGð%å'wnD„õFïÔºkâ¥~ X§Jƒà(çv1ö¼&ÙDàê´WñQâX½Ç%2•ˆêr·Õ¦ËÎyé5ÚÒ›ÀÚ\E™ùJ òÁrú“#¸Ó8ei,Ê$uxÈlù{–<8écçbf/nµÉȇ5ÆoíÎ?cÌ–Ó²¤õ†Æ¦öÊ ]¨‘RÞžRøfSE¹¥¤5R9lÿ4o[ÌU)£•‡ Ê/;DÒ± –M]@Lîi,œ…7.¸oã2^…PQúÕ Þ)ûÈAá~»ì&Cè+½†ãÊ-Aow®™Ô`®™sg×3ñÜ8\Eø«Ü¡§»ÜhÏîÓÃ{Ÿ„ÆÚ$û?mŒ ¹ëŒ/¿Ö·Š yLW¹þÖ’¶Á[A¬õ‰pÚDXÌ)þã˜|Ç˽ A“òw§˜J•‹D›U£ ƒ&}‚/Vr|ÿhy‘«º-ÉG*ô-E]ä&„•Ü»|),ÿÄäày'77‡ä1¯JHrH#UÁ7QЧœul…Ì,%ÍA­çÂIy[F|ÌËo8gƒ-«âpà –Y$}#ówÒ“R5ï×g³Ù†^Äê Q®¼ŠXp”ˆ]z’‰|‚G À[š™»w’©¸(fÓˆ§ ˆyš¡ª¾'kÕJ¹ÁTxœk¿K%%Þsoõh@ÍÊÝupÀ/f5“ˆé¦ßåÝ`Òe¦DÚöKcäÙ˜­òRk(Ðòƒhh¶=6ëVWp°Î ÚáîÜiµ¸<–SNg>ÅÕkoÙ‹Y”E … AyçÇ{r*ÄR©Àj)>vÑ7`K7 YÅEN$†YæR¥1*æMlÛáÒíO×7²ÇvÌÇÚÒe¬gd¥nq¥¸B5åáhÈ·[KÑÅ,:ÞJ£y¾g£uƒjiÅR`dRÏH%ßåæ.ûáø¡iP´æòÜ{(]Ík]U±® ÚæË`ó³D(àÚeɨ€jÒ<œi',9frí|_eÁcLö’ÏWrk[ôÖ™Fg—æ|ørZ•dL7I¾Ùc4+–S!PsŸkDq«Ñi ’©®§HÖT^^óz|9×óËKeøçržìÂmwnÏ™ûÚ÷$Óê=>ê k@Ú}ÚcæØÜÊûô$¹Œ*ö—ž˜_0˜HD®à O~dÛ oʘ‰î"¢Ê’vónP÷âêúñÞûªý“üeZÊͱpúIò ÔC<«Ž…¨bÀ(W¿Ê¹zgì8òvûQ8­™‚œ4 ™ON¦±J$ž?TÃÝpWÏ Tç2ðâóÖËj9¥¼¯Mþ,Rk¾"FÝÙ™Ò~‰Ühñ²4·…‚üneÓ«Z?0é­ØO±ƒ˜NŽ–ŠüPÆüJ[¾Û”È'ßi°ÅçA·ç'HH-¡@˜•mF² :;ÿB½œí#Û–ŽzdÐi›§Äì)9$œØ997óeÔÛ¥P^•4‚&°Ý¦‰õRà®,h4WrëdÙ üxj÷sbÅ»T¶¯ß„*v ^ªô‡Y¹~r·V{f;y³ºŸ€ê@‹¹u ¤ÊZZmÜ2˜Õµn5­4£a&›G´ì‡. ±ªôí D3´{3»°¿‚7hwbyTû¾\4÷=ª}VlR”ô4ç[÷âþÉÀ¼ˆÈõÖ9ÉbÑ#ºIA¾“ßͳpnpg§€È±âÚúæÚ Z)7Çòi&ÂAãД­—ä(Ár¯”žwÑZß"L+û´9Îä½®Ña&A(¿|Ñ–’aü~çÂê‘ö\%ma”|~èÎȃPt÷Á/¯;øµÂÎtu — ÁXaêúÛ '•uIVþc˼àëóeö«²A[]Sæ7ä:7að¹ŸJ%'ÞxhKuU¦=hóM×XFsFhƒ<']­ÿGï¬×NñSéêú4¶ÐJU¢§¡±r×¼$yîŸXBòÕxv¿DíÓužÌÓœÒõØ- ÝœìÔ[ßx×*3Ø/×eÕ¢=‡Bs?Rß ‘¹ûr®®òMÔñV]Ñy$¥' Iç¢/dù¡Ç{3³ÖyésèÂGêñt¢ d—‘“kÞ4Üd-ä¶4SKA½Ê»°b±za~øùº XZ w½%;Ì÷d6¡WªBµ»»¬þâå!.tÓèø¹2t$ÿjåÃÑN{ѡ㥜~_îŒëÆ™A½²2° =¹ñ²èöãJ ÊÊq7ú˜°ƒ‰Þ×tcê w>´C0: ã4àVø‹ÎëàcºÆtõƒÂò¡)3™t ¢é½I$I[©âˆõ%QF–´©ž×wu&%¼§’ûBÔAè­Kéø;P¯øË2DùœóÁðÁ€®0įg1ÔÖùÒnB, wÂ$(ƒQ2ЯÜnOä!Úƒ#¸P0Ì‚p ‚½2|ùƪÛet‘BTlÛÊ>¶¹§¶Ÿg òã¹mÆAò£+&mñ’×ãxtÜù¡ŸI5DòáqPlÙ>r§2zS¡XÞiʳê4ØxÈ7Mé,ËO\™¿Êh‘ZÒtùbüY󃜖#bÈtlzMú¤ÖskfóŒr4r~s;¿9i¹~¢²^é *ÊæÜ[з#~Kç½Ñ¡ÁÒ‡ Äfd„3[ìœ[$ëç r.¶Lˆ…[ùJ}}ã/ÕÄ‘ ö•ˆsÈɹ Î5«ÍÑ|‘Èw2q?È+©·…àX>öl“2\pCQåç³|ä]Vt Øìe•ºBíá^&²’ÍÇ’ié/ƒ#òß°>׌ŠW7¦1Y.@»`µõmÛ†ÆÁÄ,ˆˆÒÕŸ‹Qž;‡E:Žƒ‡øØ·¡ÁÝ àkŸCߖߞτk+kXÕo¯¬¸¿¸Ù†à_wû¬]Š|n¶fD›H§¡À°ufóH#_—qþ5¾F¾ÆR8SNìuž]¨á0"üK§,g –³âñJ@>Ý žù(±y*î墺û~E Þ˜e¡ê`'õÚ4—w¸ú&Tµµ³BÕ€ÑìS¬hÏ,ž†£ö'íþ0qÊ7ª¤¦{îÄÚóYf]AVEb”o°I£òsù>ÑÉ¢@Áæ©êç&ŽáŸr3"“^©…ž´¿÷imMš­Bpö'9Œ2µxÁr„!¸cã+Øi»=´$·w æ3n» ¥bi¯ì2cÝ®§«këõ‡S÷§e1 ­Ð³Æ3÷w¿Ç9ì÷²‡>c–¿ö΂÷JçU¶Üˆ—.SM™–©r-V·ß«RïUHA±‡:\ëhµúŒŒ•îI[ìCîOh‡Š‹Øi› Xþ¶fHeA´ÝÇô”YX2Ç‘!Ñ J=þþØxý¶µ§ï^ …yÚ»Æ5lñÎî}{õo©÷«h32®~rê”`Ès±x½ž”˲{ºÅÎJ?y¶¼ƒ7çrQÈ,–Feܳ"±kÑøpŽf¼©¡ê¼…­À2õ†„kú,£±Ë{>oê é> ñ$š~ïÁ‡—±õÂwñ(Ñ,Njó ©?f¼Ô‘[¼9ì¸å‡Ý´5÷Dµ¡YëSîsuý%CÆ·§»~êÝ'I·<[rÅ?ûiFùc Ä£)æóuЫp$ª$,‰D+] ‡¢?»_Ề žÍÓ¢‘!‰ä]ÇRWËgÛ77|õvÑù#-—¼Mnç)ÚWãÈØH±zµŒd'046-¡¯ ¶£N*½U<åfY¸Ñ¬ßboPYÊ‹—>󭤿½¸Ù­ãd>Ëë¬ûñà dwÌl½æŸ6÷U9Ç]sçtI{7‹@V©¢@vU2§ß/>wŽKãOUÐþž‚‰Ò3ºšy·ÇC~¹Zׇ{ã¦R»] îÏ=}á®'ĺCê?•¯)}d):Ëyü2"š(›êÒÙúÓcLÉJô|"É9Œá‚óRDmüzÈ[¥‘ê 8€+A±7P!µJ„‘wâÕ5V”*:òJÑìbcã4Ú¯±K#Y@TJ‡,¸ãŠ¥©{‚“ÓΆሸü¥ô^=Ò~NðÛܧ÷ùžzë‚5‘XÁ+1ƒ{ŒR³c¯£ìAÙcóͪPçÊóÍRºN³Ó#]Ÿµáh´óbj0xGXHêÄ(»é%ÞÍ#Æ^Líÿ”[Vcü¼BÕt±5=Ò« žßun×Coo…W¨Ä'ôH¸5òUÒ#{Š‘Æ[¬“7JYL®`^Êún6 +6Op×üØ8Ñ ØŽîÐñµ½#¡B¹×jù¸j7m½%F%»_5½À]ƒƒ•«ŽNàJá8ZÊwÅCÐ&ó ¦eÉèöÿc'>ï15ÎË-²´¹·Sï“22¦ÓýM;ט§¬^°TAé‘•æP°ŒqåXìsßÊÄö÷ />Å_ú=ö†|ÛULÃ] Þ¤ûõ*¹ÇB»_•ŽÀö%Ý®úæy¦B•Õä~q &6h׿ÅDÿýçö@Oó®Fþ[ wîö§ª[­¨Pemø5uÌï÷g·Ä$X¢ ÇçQq½þé²È53˦®D ÑŠÔŒªsj¤Ø>C~K³Šå—öäÝ[ãVž¹Ý*T!εsµ|‰ã‘ùðR\ðn¢ ´Eo÷(Ñæ}-õ¸ÕÝ÷±÷g*n—Uå¬dæÌ^k„/ Sz®tÇõbvÎ7-˜ÕÞ|£¡0o÷Ùm‘ï˜è.Tι²œk&¨‘¯@žDlêTÒç“)ƒ3%°ÓÕÕ¶,c(Ó{ÝîdæŸÄØør•Þm¶o+æ*ºO°Ñöi_3 â³1­ðsz<œ|Ç-V6`ç³-m ¢‚± PÀî]¾žö)3âCÚÜ˹¶©<4~n©Ì5NÊÌX ‡lr誖kŠã*¡ƒ¬A"å6ž³ªÊOŸb +:½ˆl¬šo_Æ^”¥½Êi iŽ^ÃJSŽ%ª~ßXµ}ËÀ)5²·Š’:2*KOæå#ÜÛÆ0y²Jì»qã+cÚ «¯¡9jä)”B]öø´ÂÄÎJ¡ê+)™s`d tU& mmŸÂ}Š3ä&~|9•«½eëÖb†ÝK—Uïø@q•ê&Ö SŽ î­§H ÚóX± iÒÇŠBߊRUÞL»+Ö»ýVp¢ˆçL~ ù„zÒ†s=ÕÍ4ÈM‡úî9çPu¸üu~½W œ!+Pµ „;-|<³Èì² é0-ƒþù\/¨õô·íŠl­yä´Â.ïud0XðXDNaõdà,7?¦}¢òò§Ëd¿5~q¤%=`Ië=øzÑ’ò-Þ¢âˆûêêë p„õ³M‘¼0ë%‚TãLî\+俼±CÆÊV’kßÚÏgyBPþ [x9´ONQH$-doÁ$"hàd¶ž§° Ei¥BWC”tÐÞçÔ·ê˸LË•¿µòZœý#bÊß`{†)WQ?¾ 5ñŽ\|õ&å{#£ö€ÛJ:¬¹ü¬J{SG‰}³¶Å+Ñ*~#aæs:&Ôã},9xRùa¨ §-,€'> ñ2QV-BǨ<ާW'D²èÖˆ$-[¾$¥Ã%³„]¿ Pl˜ÓØÏ× Voïsâ1°ʼl̃ªï ‰S‚ŽElÿÉ~ЦL#ü¶_tíM€£1rðûÕ]%9uÙ2釰ÿý¿¿ÿgþW‰ÿ&È÷÷ù ý‹¿þŸÿð§Ðoã?ü…Îúÿ?…~kÿ¡óŸþ>ÿãO¡ßà/üÿôü'A~>ž«ƒ?®ìŸÿïøÏ ýÿßDÃrtu0³°¿ pöô?ÿù3þ¼¼üÜÇÿûSÈÒ„Ÿ—ÏÔÔÂ\ÄŒ×ÒRØÌÜ\ȂیOÈDPXÈBØ”ïÿµ|Óÿ.ýÏìÿ¿ô¿²!¾ßÛ¿ïßöÿgÐ?‹ÿ)òý$˜ñ—°š|ÂìþïÕþ¿†þ;ýìÿ¿ðßÛ?2ñöÏËý·ýÿôOâÿy¡ \3üÿï­:¯òƒþçøÿeð¿:OP~üïfÓ?‚ÿ¹Ìª Þ»᧯Ò7òLewÔUåëÎðO†¯øci+dI f*³bxjnÈIôh˜a²—oömžÐ]#¤?Y{r®~wÓeZJR8Ÿä´a¤ï¯Ùˆ&n¾b’r7˜Ê’Ôë¥ÅÿÚ4±gö¢ _p:¾\ó=îýÖÎþv¼*lñϼûÜÝý-%ª^‚å$Øâ»r…&òkê -WˆŒûHEŠ-‚Ó…Ûö×áT¤Þß¶Z¨RÕÆU-‰‡ùnt½Ö¯®±M{}ËÒ¸¯9áž{€•âgB.s÷4 š«<Ò÷DY¨> YÛð溱·œ¯gïê±Þ^[[OüP×b´MV½†ÎÙSÿz°¯ç[8•š‘×'÷Ñoüž}‚Á¼¶Þ9xÕë- =ùÆØ>Étž‰Þ)­‡Öïry‹fïK_<%¹ÆÐ¼"’E>h^I˜£‹·ÐÞ™n¿ÊyW$NË+ÖÖ *í GRAëñp7é(Yµ¾=ÆöövêK=µÓ‹f‹Že?Õ›ÑrµËÇáTvfæ2jÒ£½†87eÃÓçcîS×Ptèté]q U·ç2ïÄp–r3µ†ÎQÕ4W4êîÈ$ ¦RQ¾ žÎìÛM3yf4FÚ³ò±~”´j:eÖÿpÊ,,™ôÛ’a’ñöHêL©»‚×>uhˆU­¾ÿ‰pžÂrjîEGŒÙ§]#c­‚Ppë½v†ÒÀ —g Ñ¢ÐÖç6KÑ+J0Áجv…Ê7m†Y·úfBt‰úuq3çüÚn^¶õm¼ïyˆ£¥*°Ïs)(b³êªöQÚÍW6h#>ðz‰ä‘ 3îˆeÌH)8e~jNù æøÎ%ãjžÔ—0²Šý> H)>ÝI¶í4 #ÙB…묃fŸ•L¡¸¹ªG$B;ºÏŸ/Ô¿ï嘛nC—±„Vä&§×îo“>`³œ¹Ò]¸œî·¯yÒD¿õÖh›ì{ç«|¢ÆkÎPÙ·Ç'&Œ1ö^Éýlh`ÚÙ}h¦>jTÒÊöJ|ëºÔ e¾©×"h?d€­M–ãX!'Üh¼ÿZ¶>kT’bÓ¼ŽŒ£¦´[ˆ´£¦DFgî—‚\8`¦3›èÍHmÁÆA²tBx¬JyjU¼¬E¾¾Q¹Ò°zÒ¾2NùúþBK7å`”‚™²ºšÍ¾ùGHçôW¬Þéoºa¥&b£‰bÝKhV†“ÌÐÂõLŸˆ¸—T}›ñv×Sص"æã Qp]*>(—Þ³›jùmp6;z¯‡÷ú+wØxÅçöŸÝNT–+Ñte`{9ãœ/R[ýuš©ñÁ5P³`b3%‰²cH΄püAWú„K$î÷uÖ¥K1ÍÔ*¯Î€ÓJ 榈܅Q®‹ý¯LvuäT–úo2ãù_ÖÃ͸š8ÓB»…Dj"p뢖F½vî^6M9°±,¶ãmòúT9ÔŽ^¾ôÜè2w»ÞÍT4„¶ êøZš+I+¡ënoÍRWRÙS®FD¹`1ƒ…s‚Kéåð£Ï7šöõü(¬Û6%ý@Œfƒ3R³ˆ‚®ëY˜î·Ê9ŒâuíSSŬsQ $,£QÖÈzåÎ)DQÔæìÖ±ÏêßA öB^Ã&X1Å´>§ _¡ªâݯv«1Uè[¼ì«,×–¬*Oã²xÒÕͯ™·Nî’òž·Vг½ÖÛR4g^ûÒbßhêh”käH u §TÌK”X®¿ýÖ(С|±! W~9’2øxkã)CþU´mi=\ù½òN ÉÜÊE}(tÌU_ 3ÕmÚÛ¹q¢ßNŇÏTÖJëÙBÞ»bokŠˆ8±*‰'ù,²¦A= †Ÿ[/¾tÁz¼ÿ¬ËÔïÝÏ[_æÈ ~”¶+\lß’Ÿ­¸ÚÜ~ÁvS¼žÿíç‹Î®é©®[p mê˺ûå,àgÒ­º÷Ó÷+ËmVvˆÒ˜È&[”¸Ò¿’{ÝF¨•÷b‹C÷Üö[Éã*îVŠz>r±TrvoòÆ7YIÌ÷r3B¦j0êÆa!M©gÆÒZ$D:½¢Ú³ÒwOKâ'F5‡ªÙúæ¶}B¬9˜â³ÄâøÙöÐ ËŸ”¢çE¦“yðö¤±‰NÌg [ Ÿ0÷¸nnõ–¥û>³Ó€¤Œåྞ6Žüvízg]’˜7m£úNŒG{x(Þñ'¯Ö{ã(x´¶A¬]S¨ïÝeÝðeߌzv5…3pÊqî ,Ä`®âyê ÷¸ÿLŒžØ¹ï*³H¢—×w£Nìùøn%=¸ò1˜®ûc‡Ó`—ã{¾°HÖôOLVˆfÂI¤šéNòñ´q%²fTË=5#8Â!Ù;ƒìÁok«„ sÈácÇA¯'QO?g˜S¼Â1¸ö(?õh¸K—Sé“{(‰3ª7ìýÓU\úyò‡ÏÅY?£ï¤µ® ˆwFc{uø£ÏÍ𽎄Çb+_Ì >¤_‚£{æØ•¢¡×87ù¾™¢Aݾés†á}³¿8¸ˆzÞ<_¡Yâ)Øn+o9ù÷zDaà8‘Æô,/JÜQů3lkŒÓ—ǫʹÿ‚Ý«ûS¨‘`BN#†|CÄLÌNXVN¡cåžƒÆø0£ÕºM^² 2¥œºpÕŠ=æj ûKÝ—/ <9ìuwW8ÈŒIjm ê Êá÷Ÿ>0^¸ÇßdšOcÔCŽUD’7(Õd¶uá;FGÙ‘qøÈB[¸WÀ uNõ|H>6çðÁ Þ¤F¬ßÁHCFQá“¿BNtgeÚFôQRø#Tã”[ú¡‡Ç‰B¤šË¯U•}‘6x<»±o½[äIp‚=Æ )4;¹ŒxÒÒ„«±Ò™`è¥. IÕ‘?HQéxOˆÁg±ŸÚÿôõü£[+ hÇ<û4·¹K7gwô¢âVaÅûxÜÍ¢¼ç”Æ#N( Þ—BAM= ò?»' ·uzC(œî‚×k_òÖR*>ömçZµAšGà ùš ¤ýÁOByËGô£ »ºÛ©|^”¼ù·*ÐÞd¥W‘1Ô*`‹‡Ù—æ)´7š­T5÷rËáeŸª#\?±w~^§ˆò6·^QÒérí]™örÏUøšD—âÒkW~±Ï“µª/ñÞ-%H±_ÿi^Qû±“d ÑÍ}2cŠ^Wn5™í‹cÆ•’ÌFºKìèûõ'½‡¶»¼”Ô 3ÛXÛ«+[<ö}•XW0±èÝ<^å§¿ U ù&œOæe*½‰9Ó(Êíg»¶“ÆÞ; ‰ð}¶‚¹“¶õµJún¸ãñY úÊ£áÛ~E+˜Éîêö'RG,9LÌw–±' S5zòÑ[ªÄ‹Ëù‘é Ù7·»kΈ‰ˆÑÌiÉä°a¤'zhñ/3”½¤}–“µ³ßÅ }¾«ç§Œ@Ö¶Ö꼫­¢¡=UòJ¹CƒGüšŒq­xbT†­jpŽ@BÄOWË2oŽXòÛgÝ _«ž Áç7EëFôÓ©†¯.]†ô¨£ù3ÛO+iFÇ5qýÀýóbû‹Õ‹¼Ûp•ÕlR"–ŸŸaÿüºèßÇ^ 9³=ÑPÚU‹ùŒw­‘öHxSN]i1$Àèšë!á1r•„MýâS—bKê(C+.~ `™’Ò¶HÄ¿Ønõx*l*þ”–\­&àéÌL_¬Áýo´V‹Á3•‡©÷|¾Ñ#¯Ÿ¶X=žy~?žÜ«xâFF›7×®ŽÃJéÀè7ÏÛ|¹œ¯n†7J½ÓKü—'Iµaݲù¬ß[$öܨ([«WHfæÆmÄFd_3uO,åàØ 6ÎÑžkò½Wu«|ü–…à 騹ÖNÃð3½G%Åõ÷úö¶ +¥o*bZ\ä{+•¬JhâöÝ·«¾DùNÐ}÷Ï9Áò®åãs*§Úäv&ƒ}J·ZbLNÃ8­?\ Kæ±}*Á‘¾_\7ã;æù°¦‡•º¤ãÓk)ñ܃“‘×äZñºç·O “\vk‡h½#laß0 ƒp¬“nø{ºÚ1;HA)Os»”Õào{‚Û“Wm>R7h=ö³7º>ýÄu]åˤ —ÎKñ7ÕÚ˜°Z6‡¨·Q¼ø=‡ß} ×ë–—N_ßc8ômKÒÃÝ®\ˆhw}_“­dÕð©àPAë=Ü<…[|$Ÿ÷“åŒLùÔ7Õe ;¢.#?!…t†dH¸§hì âNâd ûÛ1e§ùß!v䤹”~ž™Ñ‘J…¬8zLÍ›E<Ù$,Ááöp#¶?â‘ «$xB*Ê_äcàeg#ÌG‡®_“رge ­ïuf–œuÄ€KvF‘IO°©¨G-%o!ÓQò:“‘—èƒm )t! ‰2ÈÅQÝ*ac4gðþ¶c)#†Ƚ¡-g¸.ÕWé™-NÉÛêÄ‹Ÿ¾,™šqys÷cûž…—›OU’ÿcéÓÇóÄ·ìƒIZ>è•(%CϯŸ'ÌpºÜºq!•qücDz^«pK\$ïâ%HOÝ#c76ƒÚØS« Yðàüëe Qt׳¶×2KûÒŠw&sö¾à&MP]›|×rØûËû1œ“’×|÷³ýÝj$rô-,;>‰¦†{_p«q ¾·óâ~ö@/†Z·/Á0ÿý-‰ë§hóy*b¦yªÂxË)³.Ñ£»Û'ë# tâ„}$ã©./¨Ø_‘”71îËŸó­ô]wÕGÇÈñn?IÅu)Op ‡HžÉVv—+Ý…³?)æÕਰU²ƒœðÚìÜ éAÀôD–RÜ¿VÉnÊÜ?ÆÕ_k3Ïßùò*ÑeÓ4lêiIN#EßÑ]•ã'êœ \ž«8Û¼Ù-Ô[ѵžN¼º\KlШ H6¢Ú«’­ÍÐ}sA“Q›œÁPypU:uⵘ¡rçêzjb]‚ã…š•®ÃÊF¦Ú’U˜p±³Œã-{nIó†»HËn`Ù[¼¦b^üýšµÅ÷™þŒfŸÆ©ØcFÙí祩 ʲ±+I¼³O8oŠ ð1¼?»Ïëe›£¡äøÎnŸ×K=uw@[à¬û„wP»¹Ovr޹óŒøÍZå`l—ƸNá»ýÜí£p^xìG ûøV!ñ¬àF&øºžñi3'ËÏmω†vuý¼‚ÖÎÙ,ÀSê` WP÷Qõ…W˜Ø+_ ç#%¾x¥ñQ] W»mvK¶‚ÛBG;6ñe%ÀYM šœfŽ!*çZáʸ TÖ-º…¡ýûýÝ¿{Ûø¿s¾œ Æì׸zWü¿ûKÔ¿éÿýöûž¿Êï¿þþýןB¿ÅŸ÷/ƒ¿àßç?ÿ)ô[üùþ:øóüÿŸA¿ÅŸÿ¯ƒ?ïßøÿô[üþ:øÿýûß?…~ƒ?¿É_A¾¿ñÿSè·ø›þuðçÿÿ?ƒ~ëÿÿ*ø þÿŸB¿µ³¿ þïÿý“è·ö/ôÿ$üüÜ<lܰàPÑ…Kõ¸ àiá YdŒ«Ë¬YG €ãÒÙÜßÒvÜ6î±Õ8h#Ép†Í.a0^”½¨Î‘Æ\[êaœwm8{5¼”h:¥‚§3Ì1˜f8c«‹ñÊ!wÅ%„¤Â Œ(¸ÓÙóµ}Õ`™¥ ~œ±:Å(À®)’X@˜ØÑ]Ÿ½¢Ö¸Hг3ÄÒºÀ$ÓK$Ü©zxJs&— ³ÌòZÒÔyâM§&'RtÖ>€½˜$ìhεb¶Ì&û@õ‹,à)ó{ÀH­ÃôŽur™è“-#LåGuŒÃ8SÏ}­Å¿ß=6)ÁŽMQ:½Fï¿«¤Ùˆ™í¾÷¸“ rÀ |¦B…YÄ!ÏGËÌ{LWð1„ò¢“‚#|¦:´å‡ÈjÞß•×ÌÁÌvÔ›á‚%«á³pÓŒ^|%$­Œe‚u„ȧi‰†ÈiBU5ýB@¼s‚«Ä[W‰ŠFW‰tÇ db†,àÅúB ÈÙÔ7Ö8P¦ºJd›#’e,0¾‚·™)4Õà}:~Rf:f’“8‘ ÄvÂHjÎdwÅO­P˜:1d§¥!ʵ„ΧÑC ô¢s„¹‘êáî1ýOU¢MEÀ<3JÒ·R±BÒÔU-Ò? 3¢ËG7‹%•Š*­`Ednˆ%E鯕šŠ9'gpêdÝÅfí}£¼ñBÃ&qRÛЦe6G—íw2HfÚûºÞÐÐyt°±wžè’LÇwß„pH»kI„}aB3£âçhUípô¢'@媱_kévönÐÁšorBJÛ2ùSÆ™ÆÇy,d5ë±ÂA½š´ oN“#g9—ñn-÷}ëtÿæhÜ"õTYÓ›‡™Cõ &xB2½÷p|g½ïI&ÖÓL(_»-­$6ê]±ŒV«§¸Rå§‹J|7âBqb@Ÿ0 ‘îAMDÄ,9—S©ŽšØÊ|}ºìJ\ËÝ© ßW}aÕH{ •öåÒSÑ|›ÎÈg¬ØÚ·»ÊBgÿ®³ rUÓ®z¿[ò°Ï«Ù ªt+ÀÎÛÛÞ\«¦W)ÍôŠö1-¹¢ÜOe vU4 ù R¾l¦¡g7!¬•{vOå-š¶0²·Êà %±›ˆ‘Ýuå'zd”Üb!{5H1ú+}È/7ÂÁwãA±…ÍñxÈlÔµrá˜Í×ßË oÄŹ!‡XÆö°QK7ÒBžUöë÷=þYwžƒ®4G:u>zÉ‘'F€tBßõH©GxW†O'³vHðëºq¥ôÔ€˜«±ý@Vèˆhˆé'mù®EH=i$”¸* “¿ÌõN_GæN ŤõcÒ2ð]¹ "YõGé’ç,ØËÊÏ4~R¤«,Wÿј٦š[A šü·™Xli®òºÿ2òHÓX‚Äîœ}wS H7uù]Ë”‘²RaÅfÆW³~á³ üÚ¢-‘f-2'f„è$må|OÌœa£tXyÐŒî»4VbÑд+¯9)p /yúåJ‘Ò¼ŠÜÜÑ;ði!,A èèŸð †$ÊcžàÓ"½áÁ ¶t@ËâsÍ>«!hB(;ìÙ>è°  \ »“Cb…„™Í(§_T+ö¨ƒŠ†–Ùùn?E>'D‡40ÎÇÂö\s‚V WHó4pË'‚<î”ãÂ% ËT\( Ä«Zó WêòFË@G*ßrÔ#kS•®”X¸Ü ÍDy¢ÎIN‡ôVyÄ)i÷I¾=bÉEß„Úß½M£ »C[ ·‰µkEV/;|\tŸ,ºÌ‘ðòsyp—¾!½š$qiæù’P0°9ñ”PÃe;âAxy°™X]·˜.ødú“{0Pšðóshž8ª°þH†qENïÓë/&]ç÷ád]¡™ §@<øÉu»oÙªÓh¬®"°á©æž÷Ñ>sRÙh4O¬£x­a>ì|›äV ö‘IÃ9ìó&€QƒKNíØDØÑ”,Þ›ùbr=ƒ”DG¾c}’ ,ÞÜRò…9>ŸT`%ž÷¸xõàÖCJy@NõCBúWÞ›7 Ms&$m•X@ˆðîz þ5ômAy¡àà”WLD ºvH´RY±á±…› O³’†©iÆáHÏ<ÿ|3À¸›Œ&v™<1˜BŒr-j1…Mƒ†P}6"ÿ׎ÒöböË&>ä ’2¡=þþƒ¡‚} Ùþ2é¼öøk14V˜‚Nf²šwç[¦HAYÕÛÅ :0Tj~ql;àÎõ¬÷àfæ©,b™üö<Œî–Ä÷øÄcMö¹'M²uèéúß‹s¥e2¯˜ÔÈe¾¹C•žEàÕ h“Æ+æBÅyÒ|Ñw&I›ºbʼ•6&2_ùdDáh!{.…–ùE—BMÙ( “öÑ(cœÀšsv…GoVdyS[«ÈÊ=Pˆ?&€<aŒVß" °$îÕT#™eà瞆Ò-jÕ½ ¼Ùú3MN X}«gÈi ŠŽy‡]2˜¬úsîô×’ê+üˆˆ->Z?êÃYýÀºnS ×ôÇ|Vý¥J׌€YcLŠ=Êx¶2¡ß}ÏaÄx–:-@îÈÁ°§ ¢€ÏÞ}Ñ~µÑƒóuééü6ôȃ—`-lÛ¦®v$h˜€5#[‘ÉŒ`Y£LËY©ãsaˆO±o.6‡ðB²?·Ô…9÷1­ðpaPòãçn}rÂt†÷Pê>VW qÍe”tù ’Ÿ%ªî]0ѯ!«ð`°‹n›a ma4ä7‚=™}þtëmòºj7©í)†^bnÈWˆD27ëFž¼¤}b%x*ó¬:ŸRI ÒyRÆ6Ì/Xcœ.(áòH[eRªf«ž6ˆ /½E©WÌ‘9ÿ !XHƒ:Üñ<•‰*̰}Ñ{‹-S¸`s+è+-3p4 ²¢¬î­âAyV ¢"!€4Eh`-“åÞÚGaÁ‚¼EÏ2îÚøÜ]XTCažÃø7ï`Ž÷°à‚“øáÀC‚GOAÓ0ÍmÀñëæ«”é¸R£¹sŸ µóXWu3TwË)] ßXÜF"é *ð«5ÍoNº^£—\ñ¶:*=KjÖöá)çªÆƒ}¯ö†FƒF˜f(`n"%ød˜ƒXT0ÞË;-³ŒM¦­]RLZ…rpJ°³£·P¨Ü`¸9ekû¦â °™ Œ! Y iˆ\ëå•þˆ$Dç Œ|Ä -¥0¬©à6ïA’Òï[j¯7«áèr![aža{Í)÷(隸3¸’þ(AžÑÚÿáhѾÇö×£O¶®S/a÷g'P(Gõ‚õƒV,FŠùa:‹v¹õïÐS}LïbVv¦d2¼Y/¹)(þ9Ûýú'aØÚ‹€››Ñ °TÒÌm„‰à´·æ3(o ¿,¬Vኯj•:XZSðN§ª1à ·TEK Š4¶;}ÚKioöÑtˆ¤"Á@Ëú:!¤Ð££…κ^]ÂZ°U¯*•»Øâ?«ÀWoZ ;yvNÈx/ˆnžò½jØUÍ }î{Oú—šçqäI™gΠôáŠ2é‡Õ”rÙó1ŸS?)÷صÕ|Ãf?É+o½’ÇÐ$A$ë-—êýºWh¶°è>³$òì6uô–êsš3¦í¦Ÿ^¤Ÿs5™ɕƜqS’–Í†Žžð·$R5­Ž¾b$ãß"l©í^Ö,D¬_F½œÞN~ÝåÁü <—Ùë¥¿Ü ÑQ/ÍÝгØ6îŒ*fð‡Ð|ž H3ldÇžI²BƬ›ûoød¢432W;G–ã "òùð–6Žo« Î6R~ËEáù:kÑS ïwd·F‚Z½Là™M8nOª^K\dEÔœÆø ]rhõ]C†(X:S”-ÀB¾JªßŒP(R±òhSîãµêÎFvwâwc¶ÍÊ‹5V@'3 3š“"Î+‰]+º.X¿P†-@™ÜßSFDéaû× /s.l¸;%<¯ªH”£±‚ÛùŠÊYÞ€|}ËKßœ¥èk[HɯN½£ä„L3è/…è6óÚc~¢[qãñ=9C´ãR¶¬>Ì ‚Vû¿•$xD¤žJÂG§XvëU‡]èlhxfTû:D¨ýò#fWó‚æè^è6&[ÙCêTÈÙ…%@ ýÖóªã:x”©¯+èY#%Oš‰|t*I•l¿å³Ïn°Ý:2+;v`re£¡úžN˜ð-Ó™îª:ÇKæ‘[³ïJ éóÛØ ª“î—ˆ©Ì”-ðhׂ\+#ç©— ×ÓÊ늳S‰øÖÏV·Ê`Q{’J¬$vþí×ÃlxÚ^t?€]/}1<ŠÔøËNJ^³­ÅPT$†ÎøŒ½'^+^P‹ÏtYAÎÌW /2^Q@câýü¶Õ4µ#θž‰+”*"Æ‚A<[‹«Ö kúw”ÈFq¸Q¦køq„O1±àÓ§¯Ø>ÇXŽm¶’©jrõḩ`ë®Vwæ³wßof®eö{c>ÁÚyIG¨cŒµZxÌ¢CÇ¡ZW è4.ùfJuù¶­órž€¿„ÒXü®ê«>îa‡ŽNg %ìЪj†iZt^߆--SQ2º\b.è¬ (ÙÕ÷r–Ò¦PªÍZi€¶ƒµjJÔ êî/ñE&ÚµVïã¹1 FŸ(ÝjOwó¡ /B'OÓ¦¼V=GêwŠÌ^²Ìó̯5õ^²¥yöv¶‹ë;c„ƒò¡Ù1˜“æÀ*`é#{¸š¯~ÀmHæåõÝ[{ÿ—$³Å^G–5(^@ªÏZ.ØdÂï`µž/aF^22妨Â{µè÷´Ñ2¶Ï*êox…€ œÖ£ßjÉÓXßsmçDÍ»=D¼À›ð5âúÞ›;j«.Ìðù)J¹Ðodâw|x›QÅbäKß%Ïüh',Ó¾wåÕŠ£Î­ìK«üëŒÁ›˜†§7,§‰ø§¢çKÒZù„SºÈ/Û΀'ñýŒ+Òž2ØKEÎe`浸B*¯!×z {qÖ½Lêpââ MŸQÑs±LŸI1s;8µ²ùÛ)R€e¦Îd'.–ƒ”p)RFáGoÊéêÇÛÄgp[®>8-Í’»ŽÛk¸y FÖ@väð‚éÉx3\ú¦ÑåEqdU0¾!Ë®èjîüÄëW7üaµIà¡Êw6ª ÍÖK]kcÛ×–5¼0»”œe5+Ð’ló“A{"UûkV‚‹Ô¬®RëŸg=Ïw›Ìh‹L_éGk½'ç²’òš*0aI±øè 3.ku¦Pàë¼ÇtäW®“œfÆ"Ÿä¬ùØÄÕ}Áœ0J†Z6[idQÀW—¾Ó_@fTA– PפIæõs\ïÕSÔhr-¹W J-7[O¬Ük¥•—¦³K ù5ÏÓœÕ5/×{å Î9ÚΡEÅ ŠRA¬¬ƒ:Šñª"nøýWDn8÷&™”L÷–wü -Lóéõè›’]ûî$:²€¤BtГ©Ô[´¼n ÷;ˆÜHt†”ûÝvVR†-z–÷UÅl«¤ØN¿ÔHQsÕ¢†jCŠƒ 1ßNs^о+g?H¼¥ Y|#¾£ã)©¾¿Bü¥òÓ>ŽWËÇyC~_€¼R‹¦{¬Y79 ‰ÔV£ë=[[Ôo>μ{óÎ?ÙGTd ž·mêS'ã(qvnwqñ®–¸Õ7žÒíîïÓ¢ñ.íÝÒäÌ}?¿.eðYæRâ3œJ‡š†•í–6ÉËK¯ªúkBÅݧí)!ä6¦é["wùþùž½åñ†µQ«òcÂ:Èåüè¬qÓ[ÒÙ«Ë“5Éi.¿ó ç­Ä–&Â!×ćÀ˜ •F2tø’ã`D©TÛÙWÏÃÍ–¾ÓP@—í¡Ø$a«»`'bïÛ¥‹ßã½Ä廇ß6wM«N‡6‡Ôßœ7,§´a`Gb$éôŽ)jeH8¤ê¸ÜÇóäpc’¨ââ°o‹ 0½7M ñÙ;˜Ûc0ëÛEiòëTQºüÌòÃêÑ·b?Â!7ý*_€EFë5€è [ëbu΀vÅT á½Ä[ñzüµ­§·Ø&AMÞ2ý=x§{ãë£ÃŸ®÷Xn]| ŸÌÌèz® ÚªÉ%|’‡aµxQû‰páìrXùOö’ m}]M¶ÒÀçZ™âpHعt«“éEA/Hê¬éö„cçë!ž»ýbfV$ª/ùäÅmóÑiÅþy·g”5DCƒ<}spk~oqïÿ”·I  ¤בMdÊŽ´YV­ Ÿ}Mþ8ÔVÔâÅÖÁÍHéÚúâAð³[)¼#ÊšÌfòfÆé³‚»¥Ÿ6È5âžÔÚ+lwÚÅH¸$»çVù ß@Ž‹ŸùEÏm=»qpG×NÑxê:뜽º–½çÚŽ<f¶¸z—çÍEÝ_ÇQÉz³¿×EÉ4žñfèe*4ùÕÚ%9á§µË\[½m_©c»îÆ›=íŽ7\ôWá8ôÌ0‡£Z¹ COÅ’©ÇÓï“zzéhe°J½Èù諾²s¼ÜÙ>Å3=§ Ä3ÒïÒ[ù)¤óEŽær»/¾ct"ö¬…Ô8G«rݱ¡ê½¯®ŽroAò½×ÁªTÉû“{wh¬“–#¥”Pt_zö³A’ÕcwbOŸ–tTÒXóZu練džhìá|m¨¢ë ÂÁ‚LüCA·îxCtí´ˆ;°Þ–ž¯FeÆâëøÕœ Ít()Ž K²ø&xj8o^;·te–O±=Í””g™í¢ÈœÕ­{¾•r5š*‚w¤»„ ƒg j¯SL&ñóüèªêðè¢/ ÍqÇN3˜]áì8¬äo_<oH<«ßâs>fb6+àº;´A©æ\;¬¡|k$gƒTgJþº¼,~KÉWhšV[¸®öï‡oÓÜ*ÔÞ€çhm?ÃŽÈS?²¨J²›Ì-Õ92 ŸÙ@£Qô[k,ŒÖËÇŒ’ËÕ7·âe,„ˆûðÑe4•ΟcÉ€Qòž)Oß+–â•Ãcñfžç—6Dy×0Y>ΠÙx1Hk‘ei¢°Æ/M{We'@Ät9›÷)O­÷KëÔüÄ9äðÝ[eQ¶›oÌ™ùa²ðè‚ø6Ë j‡§ífËÎS<ÄT\-sÇö}i°[ŽÓ§h·úÞå»jmäÍZ:òŠ\Dò€ÌòÎYR(Uÿ¦ )?$›‚8š¼ÊîòoGV>A.§Êíª‰x=éFÅ}춈»ïö_à·»Æ Cl¸Í¸Çü‹Ö[^&[¦¿eâs"ì ÎQ}¹çε9vÜð¬Ó4€8ewþ¶q]\ð¶Ç­”Lü·Ižl,ÚçÄ”bˆÏ>ÚÀäH,_m˜^çöu Mð®1þîžZx ¯F[ìS ÍÕ4þ†fÞ™Íjò¡ø˜¦M§“->Ü_9pÜ_IxÀZ»u3}â–+Rbí—\ó$QaïÞòdÒà‰«{XPº`HËjgn¾S`³¥v•¾N…šÊ¤©»±Zõ(ÃõÚ“úÉÝÙÜ·’2u „ÍÎÜÎ$ (ÍÖ¡ÂÀ]~T´ÛRF’—þ=,ܤ›„I #üÝ;¸èEA<}(×<û?ñãCÔ`ÏáßPè¹1mål %!6«sŒDÔgQ 7›Wáègó‡ûÌ-7:u4o~œˆ ÏYÅmI9©aº Ñà îê±4]Œ&hjó«FÀ˜BçÓY­uïï{-ü…Zà˜Q@­•z@íИ9db½Y†aû$èCçL¯ þ >à`ó£¿cug5,ï}Šþ}ÿ'œèh4:sŠJ.ØØ”\‡TÀõõ¼ò,~0— vrf4¥ç6 û‰ÆP7úæÞdYqmÃTq<7â2™L>4¢c9.†DÛšñÐ̽呡™¥´_1†¢n>—Y¿{ væ,Q6>åü ¢µÓ²»ÛônÍß1÷#cæ™ÿÛã;Nq‡[åcõ–UC\O-P`šàÆkÏõ3*-CkUµŸÃ ؉«ÛöUot'²ö=\²æ˜S ýBÝüô²N•³”_ѼDüãÍ£ƒS½Ñ¯Þ<þ<€ÓÏúìß¼ÇÀänŠ8–86qÏœnåŸÉ(3úÂî”8\rÆUIrƒED‹‡.mˆi §±‘ï/êëïvüò27,‰9½»š/¦7YzkdHú.©L]??8*Þ™l[la ÏØÔ¨|"€é<{w°¢€Þo/ÚŸG@ø›!Ý0“×J»–!t+Aóø“îî¼må‘EWåûÆ ´€wè((·É¯~ pîF/Ó‰:b6œÕÕL>ˆ%½ÆÞ[tø¢M9Ú÷YV-ë—Q†èû«°8Ž® )¦0j?$Ï%Me‚QÜtpÍÈP„Žâ‘ÙE›‚p Gì v¥5W×[ |$_¯Þ¯£0<àV!',¹›±E Ñ3ÖBǹӳ»VLy]ØÚÙ Ù7ÈK¿5?5+ Nð~äK«îÝ{†|¹Ç~MŽ€kê¾D(Š6Ý7C7ž’ÈÙãìÞvƒ®¯NÁ>`Xí¢ß!³;3¯ÝL~¼f=Œ|­|H` ý@…’ÆÐµúG ’šÛ[Zã„}GHl—Vþug (ζ1k‹®yWêN`È¢Œ, D÷|[MÓ ò®/TŽ7g’ÂC@tW^qmm™Š0È4H¹E ƒŠT×݃¬x¶¯˜nõ9(1¶é¸è r©¯Ù>9$õ%#†VÚ0ÐîƒF:}U¢Œ£¦—5³ ‹7y—³­Ýqß™6H[•ª´½G¦çÀSŒàÿº=ÒH -ÐÁÕªg$#± P/ÄìQC…W†i‡·2Az?EâEe¾àÎËï‰1-›Í—›­»3ædV“G©-¤'Ñ6NTÙÄU(_•m›"# Ûl¨}Vê6Nc¬=‚¡‰I3 xÂíél–\¦\£®×C›ˆ§HåÖ[§,áÅÔ¡dœÞw~«^æé¾©9îºÈÃ’³•œWJÌ`õêòÚOj)6Ü›2#`óyÈ4I2{ ‚Ýtá"´T2©É0•<¹|´–æh@¹*Êëp1”yÌÒ9W쯿2ÔÊ[ÄÁðÖl¾5!@Ì—\K–%ŒI ˜‚ WDÀ^>Ý÷¢³0¾ñÈ^ëºl4¾Njhf³‡5÷5ÛOéç\9Ï5?MÒpÐv2e|íœÜ¸r]œ6Ʀî+ûè_Q†¾e¯?—»ÞÓdâT¥unñ¸¥ë14é 7&ae1s±ÅÎkÒ² w¼* k»ŸSà¥f '~ÝÛ$BòšAŒü¶X¶ïª+‰\b"m7«Ä ÷l¦LåPÕ´zïÞÆ¹¿§­çª=iŸ“ôÑÊ ’“ëד¿ö@0Ûó ÇòHNp®Ü7Ìçq tô-:öŸ‹¦^ñÚÄ÷p¥ffz%! ÏÅãôÞ–hb%"ÇÎË‘Òl†qGlûâ0:ØW…/«4=Zfe×ÚšfY¸Qg‡à{(ì+»²»%¶Ó§áÀ8{ŒVǽ©¾³Kán õñÖ7…¯—¶1=h̯ê'Uß'qÓ23³˜?ïŸtŠ;ïžlìe,òç=‚½ð‡ÉËj6;£—>ÂЗ~‰s÷l¿54S3oÿíø¹Åkg„µë‡±–¶¾˜ÌùµçÚˆ6#«ª÷øˆ‹>&™…àÊÜרØá YB¨ËYý ÔŸÖ±¤Ц—¦ßMÈd°©=òh$vq구šg™Œ¨9‡$ å!fYBvMÉ[ÇÖBüE:íúï÷Nw «˜ÂX²E¤°¤‚pPo—G| /lD°ƒ ²K'H[@¿xöi±‘ñžŠ)ä©s?qêPZèpë[~Ô7j®:׊az ÿkX(b¹ ‚މ§w§94%×,: $oTÂZún[µßÆB¦ÙŸž78¡ÈƦ™¢è+%§I1èÕ¨÷à\Z(蛊■!­b(UqO…ž6t1I `1x4•ÕÔš˜•ÎvÛÔ¬D‘°à® ,ÓÅí?]ž“ñÛYß(¶¢µæ¼Ñª¤mãŒè}±ØÙu‹¾‹›¹j ÒàíB•…-Ät…”ÉFS'-¢ôRTæ(g(AŒÌ_^ÚÎK”di‘Éã¦d²ã!¯î¯ìxƒ e5 xÕšÖøWì²µH·» y­aŠ| ’ø`9Z 1 %ªQ›ÃÑQu²ˆûÀ”Ìw¡‡1˜•·G,’Ýu‹øÁbA)kΉ¯ÞŠ-TKÈjZW*¿­bñZVjÓMkBê+UÞäðO’¶±ˆEcv•#ÚÍ“œ˜llo‹ ê†G›ãìß>0¿§ ±Ê½MIÄ2iÞbuoþËpV¯Ðe%fezÆ5±ÉäG†]DI4DÕ›µA;<úNÔáãÛ×Rsö´;BAü×>㣥äÖ¾¢¾ƒOÄÊ Šð ±ey”&ì Ð}¢dëøH¯´‹Ï6¢° „%-`³+m\Wl#€£&3à±*=àjàWE§-°!1‰²xb .nËàKq«ÝÇŠ ·æ1‡É‹Þ¸ýâ˜dL¶`¹‰¹ÊÉâWné!ÆŽÎvÀûšYƒJt*²9%.T‹-œo ÂR‹§唯3?gÔ„ÕŠl›QÓÖgxåŠöömExh;J¥®Uv È¡ÅÉÉâÍö žØ9—Ö2A[²¼x²ù‹îJ‡õÆ>¹V©Ý+»G×ø2ä»ÞqffSÊ6àb*-€fþ„ƒÁˆg%‹oK¯6è½9 ã«DQÛ3+kÒ`xiD?wogزӅ=aT‹K؉ |23¨Ô0j€axw¼Ê­ó22|º®¥…‚0x߸` bëZ(îœ( ¢Ñ˜ǬÀ7Ê©zΟÜMeñߥæ©Ñ‰|€ íŠËáóƒÁ¡Y•— /ôd¥ÓdY/1ð"Ö×'¥>˜KI)«²q˜/2¿>=ˆ%fàä} Î(6¿y3†N£ÿZ•õ®e{Ÿ×;RíP°ÈþCéé°ŠE+ñÁ²‘¦«lŸœ|¼·W)Íu[&Ÿ·8C°0XÑ[²]IK;Yú”Z§Q‡Ò¼¥HóŠÒ“˜¯|j—e%ä~Ø®ò,a(0‡BE³žÈ®r“}³±QÂŒ»¤pý¤ÃÈšz@L·ðH?ôò^0ׇd³ÐÌ&±¨/ ̤?…Å€r <}!6 ™{Og“o`ú±»ú†ðˆÝ.îcÍD… ¿6oóÐI‰¾g£Àû´êŒ•@½ÇƒsFôåÚÛ|ƒ*LŠÒš‡VhСÉûÏž¾ó°\J’B6˜¿<ÐAéjsç·Ägd÷辕W4)º;Ÿ¹Cö®;i™V.gBîæ1cta×ýª`š` ¤MÌ9&Õôåc|zÓ:àZàJ¼swϼ&?†…2Œrsu<Ò=OÓ5Å È:Û¶+ ÚH ”J)qÑÏd+mSŒž¿‡ºñÉ §ÿíVeƒ|Xµk¶ þÂaÙK‰Êk]^ÍÂáÕ†¡¡q :¡ëÜvvh­fPk?5~ë¨n,çVÏ–¥Ô‰¿»´Ük¶:AÇ:2".gO?kfüÞm|Ëšƒ//1û 2ž‹ôÈ(DŠñ!5Eöa7â3»jj¾fÏ@ÃE‚9®.’b°û·ii ÔÞLaÀn×ÓÐÂl‡œð¼¤£ùeð¦Ÿ.ºµ×/îo˜Lì¸ei‚z§³Á’ Ž@Óè™’N û*6o?ö:‚¸DùSf€·ÎÌžX!Er[LûZjæ§’ "özZÂÇ/Iîav©æùa+YȨP•?‚%W hŠte# @࣎†×ïš„Mýõ¦qo{¹ãû†›Þí¦ßôíâÅzÔ?-Ÿ.„Œ#vW/Ó+‹×U Á°…ÅÎÛGžáû ­'R€ÓR±{Ÿ& f]œ™Pß ßKŸªØ™ñ7Ùµ¥âê]Æ»%¹çañÆ`=:öRu…4²Ë’­}ƒYriµc!؃ù™¹9îE¿Žò੟ÌT@:EÁû‘G³ê3ÆFjc÷£ý„‚Lší5ñ›rŠšÕ~ár¢¥ä݆„ &dþè8u†*'Ì ~›î¦/ºÖ'yM%±˺™f0Ÿõ7Ow£„ŠÈ>)iêÈsWZWѨõPY^ÚLƒÞ2c®Ôg™EÄgÞ¶Ýïr Òääu˜äoØFbMEÙ¼ßV>'£sÍ30ß—´”P)æÊ°ÜqnÛ ’Ò|)|i Ͱ`y2WÁ'N'€‘+,šÃuïÊ™{Á@Ìütß¾ÇÊò h_™™élyµë>uxé‘Ãá- æT²ÆyÄ -ÀhõW) Vk” ñÝ/,¨˜\^0Ôm³Ð­:« ©q$ÌMèXPzžÿÁÞ\¦?,¦£œ`w(ÔNW-­á“XîCà®ÁËÃIñ–Pڕ渶=r\Hþî%«ÎV þS­ê #)€'„9—Tº§ÅôžaUÛ‚ (MÅ3â!~öÚ⣒®LAP¸fæÙ—î.¦`9|Ë´ô£»ÝedëˆGŒ:ÕM»µ;UñÒ1äñ ¥[5 ³‚ðw´ãìƒ1¢]‚B3*íªDÅ`S´²g:æç‚,R0Š&Z:¿¢Jÿû2ôºUø;UlÞÞÔôu|Z?[ÀÃÍz Í×|u|¹^)LTùУÂ[²i :0­ †ë#! NÿìX÷ xƒtdC¬ÚÂÓ9ª£ÎN:²!М Rf¸‰T¿™9aßÂØÑÿ´ÿ\Ä< Q+ ħ/¿”¯ý°O@ú’†Wræýíö5ˆ—eèç¨g(§’­RÑòaÉŸ£’Q\XpaC÷I“¨u!‡;üíY~dàë¬(ì8½çžƒ²NðüÒ|®O= °ÔÓXX9HΪ¦ùuŽßû¸t—!}†Uñ„ZÄàIýxµ kÂ’Â¥úE:$“Ì(Ä»Ä zi9osPìÇ,|5S§‡}a3£÷9&#‡˜õ/.¹8û^4'¤X‘„"L>+F.ìÌÐ!5W7¢`ÍIýË w-Ít9uDeuNÃWãA»fÎÖ›„²ò@%Îî~˜´tA´ùèêì0²Ï8¤4€7¥Œ¡áÑ.ãQýœ}È*œ9–ç]r†ÚwßÄŸ^›ñ%’•ï(ÄãÍ„Ì(cR}‚Lµ¶ëŠu=¢»d©¾íÍ HBÚ§€kÚªb°d €ë†§ (4¿š[/Ä+ýº™R%*³V ±Í™}ÙLõŒë`ú3Çr³ÉÄCßa? TÔL)§ *Y|DŸ'Ü Ñ|¦ËÌûùi$ jÖ‹ÌÃA\[›‰‹t‘;ñVm.>Œ´·aýMçZ<‚iô]쇄C&–S³£ü¬^nºµšM匷!âÝòñˆpn­+\oÓ¸çÙd·§IÓvHÏÝ>3ŠÏT—DÂï‰ûbXpÕXÛ_x7u#´ ÔÜy†4ZX&>íÖSsñ;âÖ4¦­§Læ°¸¥¤ºpØg¼"TúŽM>^ÉŽfFÅÂÊxÃÏ´:c–¦·™"Í9`H‡¿‚=VHœOÖ^r&H=ú¹‡«[?'Hq¹M®Î,»n³é©F´žPæUª¹´æ@Ep™‰ Ê´¨Ò* ¯ÇeÓFzòõ¡—Õñ0Uï*B0¤ ²ŸäóËŽ 2ë,]i|Ò,ª«ý7 Ÿ¼è%‘®FáËÊHþ¼äMÅLRq¼èŒ¯Ÿ_ýÞ‡`è˧&M]˜wM®¼']Á ¡(ŸZÑ™Ý0Lž%{`·ˆ¦¹•91ðŠp¸*^$Af{níU¹@ß¾«¨9 ¢ [}Ó…CÑÍC–Ñù^&>ódÂÂeâÞQmJìÄ9½'rˆb8ö§e&;f°^†Ñ_jäèúº=š´~ LîÝkÏéÞpgóU VÃí‰ ;D!"Ò"ŠaGž^ß³›$ÚoŽŽáË)\Ž„F“n>âÈ3¢¸±þÉ¡Ãæ;ÝqjBÏ»mšÂ8özd5…‘£–È'• ˆ íH{jœgp—‡`J¯'‚i’¾ "«ù+ijk)a¦G«÷ôc§Ö]7v`— ä+V+ãLo*Gìå¬#+¢ˆgÁšµA€Ò|Ÿ¸§4Z;]Zsϯ/¦„fn“@öõè$Ðeû_Ñ—Ò^µÿ&6düÞˆyƒOJY”Ù·h§›X7„ÛÈD9$r²ÿäŸø6dØŠºýõF»õryÓ~øH ²{µ5ñïpÃývÿ¯ð_%þ€àßñ_þúmü'ó¿ þ‚|ãÿ§Ðoñ·øëàÿwüï?…~ëÿEþ*ø þÿŸB¿µË¿ þ‚üÇÿSè7ø‹pÿUðÿûü‡?‰~‹ÿ_çü¿Ïøsè·øÿ…Îÿøûü‡?…~‹ÿ_èü¿ÏøSè·øÿ…Îÿø;þÿŸB¿Åÿ/tþÇßñßÿú þ¡ó?þÆÿO¡ßâÿ:ÿãïøÿ ýÿßÇu±ppq¼ ÅËñSlÝïjÿ›u\ü¯ã¿"¯˜#ñàãæçãÿÿ©/Çý3HŒFVCF箦HQGM¤©+­ª$¢åàâÒç“áâ’Õ‘ý)Ÿ“›¤ãlâàbµqt0±ãâ’S§•À»Ò 1k s 1{ ¨ È uâ°xìjã&N+ãèµp€rèx:YЂÌ~º§…Zx@¿k¨™µ‰³‹TÜÆÅ‘CXX@„ƒçŠ'Ôjg!¡náÒ¶±wµ3::ƒAWšy¥˜ßõò'µä´i×J<ò¡×Oå°Äìl¬-,Åi99¹æŽžVœf..´ g ;qZ¨§…‹µ…”EJ÷³PW ¸~j©£¹'òކƒ¤`á`álµ0™z‚dbâáäçäqp ó˜Û¸ÌìL\\ÄiÛ8˜[xÐJˆ™üîÉoD²7±qønL´jÈKFS'QM+d3L$@> _ÚÚ)³™µçÏ,d®²þÄCñ—¤ÿˆ‘‰ƒƒ#ôª]d¤jãýx\!âòsù+ þ»Å]Ì®tÊå"¨YØ›"Íî?bceçhjb÷G9þ;<œýÿ ‡;vWýò˜ï,ĸH_©=Ä?UH¤êð\!ÿíá2·ø×®õç AP䟵é”]í‘–brÕ- GKäCÐU)Îï2üJÙ,M¬®²"ÕÍÉÙâŸ<59˜Ø#ÕÛE>@2ø~ ÂúM/÷?Òx¹Ab.N&¿pC2vrv4³pAŠK+Agc‰ì8K±±ºœ¾±¶’š±¼’ªœ±¶œº¶ÆcEcc1®«Â¿cÿ£j^žÇþçÒÿNdí6ÿ]xÀûð»Ò|?JóýûÞq0³s5·1ÚAE­ìlL9­­ ¢ÿœ)ÿ¦ü¿‡CàGšÀo+|dáéîèlN+tXÎ?³þm¨³²zd¤jÑÊÐþ’Íûwõþ¨Gð?j­¶‰¢“ §5í?o“Ð~B ßß% ÿHþ}ƒE~¤‰üôïŽì¿Æžï‡nóý[Ýþ”ïÝðÓ˜9š[üÖü×G(ÐþÖ} S®|‡‰Ä?ïU¾ÖÃ÷o­‡ÎÂÁÜÆòŸóøa|ÿ}àûa|ÿ…üž‹ÌàãÿSù7MüÀä¿‚ã‡qò üOáøax|ÿÖðþyéfÆ'ôß„CN[C÷ŽŒÜ¿Æä‡•ò ÿY˜üÛƒ<~ŒÅ/˃ÎOÂ÷ï=É¿F‡ÿ‡ÇàÿO<ÆïJÿ0Wþo®@ç¿Åø1ÿbÄÿçØXp™óüú¬”ßÏZ~AæÇè_áÂÿÃ…ðÿ{òopùá/øÿñÛÒ?£ú_5Øœ›ë{:ròÈÕ„Rûç6~oøw~ßg•ÿ|tþ~ú‡ÿ5þóÄï"€ÿ…N®¦v6fÿ˜"ü;)̹ÌMþ¹wÌÿ•È”ïõÿnV!ðÃx@HúÒ9Û¸!çØ?‹þª.À{Åãû¼ã§6ß±0ÓýL¬¿èÒ9˜‰þŽÇ•àûsäé;Ÿ°¸:†ç÷<~¨œÿ?xÈ]‹£}µrúEð°¸J2v¹Jû=«ㆀÀÎÊÄÞÄåÑïYý>ÿsVæÿŒÕ±D@èw¤ƒTkG;s¬ ÿxø{N?Fáp’vt´ûZ¿ÊÁÄÔÎÂü÷l~8p‘ÿˆÍ÷¶ýsf‚?<¹ ÷ïæœ‚?ÔTð_ªéÕÛZ Sdí¿˜ÑÏn滲X::Û›@‘ˆù×}'‹L–ÿž¬bý‘—å÷þÐsAÞÿ!ŒM¬,~'Ä«g?wÛw!~Êô!~Š ß_ˆhÄÕ`öǞб6—µ°tø.ë÷¼Wùþ ÃCäÿïËð+ 6†:>²p@Êð¯9¸9Ú˜ÿÂá‚ü0SAÿ± ?¬ä÷ñä~êŒ? ðøÿÇ8ÿäàþ€Æ¯ëOyÉúA~¸Áï®áwÉ?ì]ð÷ë9ÁF,(òo†€_P¿„~˜®÷wÿç£( ÷¿H™´ÍL,œ‘=óÓÅï»Dè‡Ïú7C››3ÔÕÄî?yÿSÉ‘5ûýÑÿ éÇ"ô/ËORä²–Oð’þóùÁ/sÖÿ;­ç½š/üìn®Ìû{›ÿKiÍþ‰´¿ú*ãw"ÿœô“ÜHÓüCŸþð“B|¿Óx¡þKˆÿÿcïÚáÜÚþÌ<Î3rL1F$3ã0†Á`dË![N…ÌÇr É!šqˆ$T„P’¦D£T¡lD:8ŸŠC…$ÞÑn·÷î}¿ý]ûû®·½ÿè¾®™yžµÖïY÷³îu¯YÏï^3 ñ5ò·A§þ5ò7Çý9 óifŒøO“{ªŸÏ/ŒŸŠÂÿDŒ)¨|™«°®û™Ë$x ½ÂXª¬÷lŠ«+ë¶Ÿøq$ÅÛËÃW àåá¤ÍÊô¡x{ëþF†ûù"ÌY/}ÿVQÓRÕÐRÓD`Ñ4‚õ­„ø‡p ý…MåþB® ´TT:¤ü+Gïà¡ò‰šýln‚—"0€ú5™ïïëDP¼ƒtŸSÖÏXêê }¼\]½Y½Á…ÕÁÝtŸÇ‘Ï|=«>Ý+é—›]oÏTÿ§¨„îsÃŘüqý‡Æ?%þ«®ñ=þûMäñ_ê?Åþßÿõäþû[í¯UÓPUEÿ²þÿûúßo"_Ûÿ߈>çõ‰…Ÿ¯³¦ç¯›»þU» Ñ¾ÿ7Zí+ûcYÅÔ¾¯ÿøBQsÁ¢q®hª‹VM ¯qÁ»Q5Ý©8u ¯Žwù»õû.ÿ]ù?ø?Åÿ/Öñ¿ù¿:Zí+ÿÇ¢Õ¿ïÿýMÄ…è†`=й¸üºMýŸ‡|X5ßÕípð¹û.žæàKÔ©ÉàÓ½ÍÁSL󜔉®Ó¦£î¸GUf¦Zi×d–”ÙR„LæØaàcÈsk[D¤!ÄaãË-çTä["®NArƒ•HµaÒ'ÙÃGVœþàËAH·u ñ »T–-9îy€X¡ã%ê·Çƒ^@éHƒÀ›|:Ëûç Ä¥†aÍÈ »Fuä‡?¬÷`àݳü†>̼æ´{ûÃ=ªÈ¬¤Y3±VcØ 0“)þv²ñ…á×JC™uñ5¦FñºÊ»3üîP³8c¶í“„¬ÜƒI2)kÍ:I´Àfí¨Ùûp±•,ÙÝŽ‹}&P꛺î 7Ùµ}/ž_›]ìô¾ç÷\7éLÃÜá ½0n\ÜÇ4„ˆBu¦°sÃÈ5†¬žŠuê]Z‘˜ÈP~í^çÖI‚ö“&øk.ó¸m5FÌGÀ€dÇ3»âì´>ì«É&˜Ÿ‹êB‡ äyž~ -îÌ !ûS"ú$†"Ñö¬†–…‘›™A_Þèß¿w\yѦ›AéeÀÕ]þƒ ËëN†'H¹ÝrÈ·Ý&=nÍÜ}< ãÊ’Áà31[µs[{…sÌ©*±µ®Ë™>áÍÍÍ¢0ÝÕÕ-GA1½½z^\o®0Ê{\5QzÏ¥O¯U)%è—Pç7¹_>rxÅ.Ò¿<‰ ã3ièýÍå…áK%£ë•oKE~Äz²/¼ªPp•v#£Þ$¿5C4‘}&†Ú:’Õï“Þóœ+ ‡ ÔrÌt Å4v+2x÷Ð+mLj&е- Ï¥.­ÍÞ«;8 t𻹠sOöa@í¦0íÕÍB0D_‘± â/¸MõÉD) ñFùã$”B–†”“@Ä‘öa5_½¸RÂrÓY56pÛ%†}Ø•óó}¹¶1}ìyˆêPpŸ—¾îYVâ…)ٌʩä~!hU=¾,ÊÞ£½9wŸ• C·Óü.¬F?í鸎¼rj?$ìCWêላk©”ÕŽ¢íѯ²50µ B}·“ÍWÉÐ7íF@y1dÆjÃÆ®ô:¹›Ó0Ø"W%)/È€½©Ršñ#E"¤Ç¹QeÏÀ¬OsnÓuý[âe|† ßÊ}·|Íñó+fñ Ôx“ËCG})gÄ}§™5æ†ä†¸ªkÓ“ «T}û7aËô¶ŸžiBtnnxðV¡ÑyjWlŸ¥*¼(ÄöD;[¬­Ma¼+å»Y¹u©h.”œò ¸%aù2éCxïRjÆ ˜8g¦6j÷ó9û.˜eD´bA)(eSµÍëÃNãÒ y‡»“•1„…»3)k¯£ñéQ‡¶å÷yÊARÏ \K3ö©îÇï¸féæÈÝ_„ŒåŠÆ‚3­ãk%¹á “õ1ñ4…hàžV‰x†m3‹äó   –¡—T+#¥µ3æ;rˆeœ9þÍ+a‘9í»Åé6™Ô÷&Õc.U …‚ õtuK¹ºÇCåiXÀˆDÞÙ!_ b°$X]Ò‚:A¬¯ãëÚiI ]/o@c:ÉSN”glò!ÌÎE#àþ82™ØZÇwÿ¸p­´6§mdt>«Qi¬mnˆ9…òå¸:>µzØÌi‘¹ \<û~±Q2ˆ#¢Êo¡ëcŠÏ,3´«JG£TöŠ•‘Ò*»ª…ÒCo2™“GdÒE´'L4™øMRI²æN²] )׾᥹ôanelªÏ³©Wq¹‚™ÃŪúf¥VâdÆù3fÐ^vY˜üBîH}²ÔÀ†NîÄö#"W.«äAQ*¯âCB˜õJ–—†}fÞ½?æ0œ½uhðhæìøÇNþ’±»¯Ÿö îÙI}È…ò]À£|É`z%(ìmB;AeügYNº­ÂrZ?.¢õèŒûfðbŽ4Œœ…ºÏÓà3Ž€Z9Žos­ß“Š põˆ´Æ,>.Ø~iw o—7trþ06“ ¾PÂ3ä±&=×Åå«Wãõü‰¢qÍ…I”S/nñÂUÚH–öº‡+ާº=è© §:A`ÛÁÅò¾:x7=×zêœùÙ$švÁñæŠ÷±<ȉ}¼tÝý삀РH¬dP/ç³ÅU·áA‹Ê\(tØ®ôîS“L»RbžCI±Ö,d§k7wïQД݌qfm~Y÷(‘½ð€®ˆi¨sÐ:ŒšmÛ‡š} -ÚiOsN 9f6ÚÖ+hß`¿%ïX¯=¹­Ú|ŠCݰæmz?©uÔ ¬_`7@ ïeºXÅ׬½sÌ£e2*èÚÓ®²´+¸ ô…=ʲnüPÙöPÈñ-j®…—àox©Aºw¥½Øø”$ÍB“w?±,„c­Â-[ÇÞ½]°BÆ£ A„©Äƒ÷—îªÌçîßi¼‘^ƒÕ³Ø;ÚgzLH¨A Z\€íæÞ"…hvæ®üÍiHdX€öÅ€D”NÛ¼¨O"–ò ^¨uÓnŸª+§-]5:¼—9¦¯Tß=#)ì±Y9“^‘+z+éÚ=f £ßkd:qDµßás: &Ñäú·ö+°Qö¦õЬ=I Ñ™zÑ»Ë5XneÌNÚ^¨È½Ø ÎsBÃÆ.RÒÔ}‹oVéÉ9ªC|6ë¶ûwV·$ØÔ‹Å+é\v‹Ut »V¼â£ kã ‹ãé°í®®u0ô” l¸8Z'ät¯+Äï´³ÉLí䨙t],GB”…ÄŠ¹#B¢‰qÇtHˆ¼àöªËÙ×'®‚Ùâ‰Ï$øgy¯«½j…Ñ󫺅‰ºG%‹´&ô¡V ç Ѽ×ù,ÝŽ"2/Ù§–TÞ%9?ùÕW1@~Z‘¸!/ã.ôI›þdŠm€¼›ûÁ° ¨ü:øIjɦ Ç$î€Kn$£ðqâŽÄgm34LiÃññµ7Mð[¶óçùô.š0—R\ƒHd§ý8Û[Æ>ãÊEÎ(;£-¯Ümç!µéΧ®QÉÀJÙcî#i øýާF-*ŠoÛl±úÉ1»â‘©>´é>ÀÊYþØëWšHSé1’ܲՀ -çJìç–á¾,¹Þ[ý¤ì1ù° Ø8ï&‘'vàØ†Än#ðÂDhp¹µM,`Õj^0ƒc¡í,œì¼Ùó4³²²[Z k·-ùVî,„Ã&AèR iJV¾ zí-¼ÈE#èøþBuàk>¹È;nOaä háÕ/ÂÕ 8XÜÍ™1¿\‚CÙ.ÛÄâañÏŸv¤*!)Šªüö$¨kê ÞÙ¨ Íláµo~Ê!œX yàBâ÷r…{ÆÏÊ22£'$ãÇ:3X ã€ÌùܘV‘ÛÌ‹íuåËTã‰w`ò› )/ß?ËäTL¯úè?–²}#Ý–V{íÅ=IT²wdNï çr ´ŸJ;“–ÒÕ8ŸCíç&¹Ãè·(„ŽìÁX3óà@Ǫ¡ .I·-i`I‚í>£p{ G/í³³ÏÔ‡r§öñPn§f3¦ÄY=9éV€ÑÉ©9CÂêt7&<´o:ªñã$°r x¢×„a¶Œ?«×Kú˜ˆÉ)ñ»Ç"}Ff+{¸#<”'çž™{ÑV.!Vl*ŽÇtQX#’c#W´ÔÌ£ .ËRqe[Kª¹ëÚÎÆŸ ;ŠÉAI±qžÎ9Kåê+°*~¾¼þè!ž‡nblo—Å'l!÷CÙJã£÷‘pŸzße­S["m¹vÕAáNQë Ûijg$ ¨N{³kìa½zgÜÞùªqâ.· ¯aóMvâ™zHjå튚H › ½%j+Iå8ìÏ&ÞûC8'w]¥pC MŠdÄÆs3 d›hXÏ2ƒ3ULYÃt‘,B$÷­×y:49<$–s|Hã™bu_lDãb ¦ï’¶¤|*ˆÎºó‘¤t ”mßy›ü}å‘´UGVò½¿E«Â¡ùE>pÚ Ø– w—îÖ°û´ÁkÏÅôxÒ¶/Ù6<¼¯¨Uì<øù[¹äòƒgEü¹­šM*„²ê.Fâ“ãZÏU˜¼•4 ‰ÄwiG…®—¾¶OˆÕÔ€üÊ–õü­‡¼p•e䓤Ÿ~}1Ë 9¹Y„÷±üEÒâiÍÿ'Ëïü­çÿªÀ‘pU$Î|ÿ¾xþÓ/)¿µÿヌ©G øÐ8ðÜÀãÝÉ(’Ç_|à/îÿ³?‰P[Üÿÿ%«â†TGcÕÕ1ªhU„*ZɣЂ#Q´JŽÑø»å[,ÿÛò_Æÿ_zàÏâþÛüG"Áóÿãÿ_~oÿÿ/|Š€ËÃp(\I]¡öuƒÝùµ÷ߥ´¦âðó¤yð qUyeuäÿé½óÿÊÿí]€?ÙÿGÀU•ÿà+A‹ñÿ ÊÏûÿ,#,,lÎÌý,_¸ÿ¯0¿ÿoll|ñâÅU«Hqqq¶¶¶ÎÎκºº===sïHII…„„°0_€W¤¼`ùñ|á€&¿'wËêZ¬ºÊ+²6ëüÂãÞés"U˜ÎYÖV†ŒÝ߉ò £TA@‹ù¥õÓ„8Î]}»§ÂÃ1Áï?²édÕq½ÌãÖG¼/™vØd2]Zž7cäo53B‘§‹8ˆlÛ¾±Ã¤¡èÂ;cCktÌë;:}{èñ W¢¥¡¾Ñg^©ÐÙ²{2Åð´¶ÊrEœ"[Y.CêR ËÇèÉwa™\´¢ 14Í*Ô‚¨R6—µ%Æ»"vœ2õÕÏ#)KÀžVx¿ «q<ÛjzåUJÓÖ]Ö01–ZGÇÄè‘À ŠíìyÅv©cÎ2Ü:ö]`«x”£zlU€âLÍŽ¸ž ܦ‚CÖ1ã“ÅŸ¹üŸ¢ïk´=~%L æÂ4ìJ…ù/­X!X¨šüÆL‘§ËòXïò‘´ôôÒW‰N‘´[UòCΜÉŹ3\œa²+ÚÏMž¿‘“SdXÃþ”Er×}WÖÈ¥—,–»4årÚEª…‘`!Ø]µœÑ[m9Ô«ÿ¾˜-¥¨9j›,evãÍšÇYèÆÎ)Ö¢ù~—ÏÖ<ÛqwT¢ oûyS%bßÕ¤ñX¡I‡éh‹©ì: ` ú-³'7Xuý¦‡î=ÈŸ«ý ÊS;x®Lô‰d„¤TTa,ëápª&"ח˧5Ø’"'Þ”ßR§xÿJh„†Ñ Û£›÷ôÈ×Q³Ù{]™ôaFÔÁi^m¾Š“è–ŠD–'Í=9&©8h4ëÁØp?Âêô¾0\М/¨mØÒŽÚê·‘k[~˜2„~/ϻ߫3pïÒðÞœŒÐxÖiÃk;«¨SÕÚQþc=tso’ µDèAOÀгÏ ×p}‰# І5ôP]ÎqÑ|Š…|Ú¥¢)®¨z\>hOŸbY-Êg¿Di†?T q©íÕ*šUY¼ ^z9ŸrʵQ×5{ê ߣ¸éyú±O™e*÷á¡—öŸpÞñ¹X("•ooµ~ÒÌìk¿V*= 3­|e·ºyЉUZÃÊ-Œ:}~¿^\ŒO7"ÓqRˆoŒ6ÚÀq]acE¤E¸""K"ÂqÙ.oI –£ a»d¿×,Ä%ƒwˆ§Hœ¯Wa’¶’o ¨Á§«ÝstLÁµ¨Nß¡(êШÎ$­³Îÿ•»5WFYD'ŽÎ÷rÕ”·•0_ªàXHhï‘yæ"#'Ãvà?cª¦c`Æ‚ö¾çÊmüÚuqRŽIÑCtnÝ®¸ ’¦Ú‚Ësëž²Žæ rF~š±as?dm>ùnà LH=¿ î]Cÿ•7Òl‚¸’¥~)[F¤À]¥UeÈ6öA•ÇÜŠÖÙõÒ»R,âY&è¹§ÊÄ‘žj±ÎÝ}éTþ™`DQâAt2çuÓ½Þ²<»>@ÐíT°ÆG—ìúÕ«Û1œ;† 1©2O÷š~¤Ü†yh_X¯ûèÉ’¥Í$ÒD)þ[±''R†=[§ÙõÞš¶2rdä6ô¬)Š¿PÃÏ*V³¹J±O«è\¡gIø;ó Ÿ m†ÃWtÔ™%d†w.!]žÁGÐ1€ÊÜS?§Dˆr5°˜gxܲ½©´÷MžŒœYÕ΄‹[9Uï›ò²;?ï~Æ›2óEâ™@À ÊØå² ‰Õeͽgn&î¬A; ;ÍŸp«@k¦ú×cbc¸øŽ:¹l•çï¿êò-ädFÔXgm¶õlº×£Ë¥ÕWxGšÖ 3ôöÅ‘@zÒFÑýZu…•!ý;ÐOøÒ&sÉÐG'é_ê%ïÞ* ¹-’/ fÛÅÇ"ƒø‚뮊~ Sã4 Öoš4_Jƒv°5.ûÔž2³ýB–¢Ô­­#g[›¤\DøÙ½ÃyfGDÇQIkÐi×jË?.?äg$žÂqg/ÿȰnÞ¹š%^Ê ‡yÅûÍ\†ÐbCýn| .ê+»w¥>X¦Jµ)7sÔf‰5sŸÆ)B¯Îìl:1ù6ðâ¾Pœçr÷­Ïï4n»#Qžð脎B§ñÞü(/NA㫸+MŸó±¤ ù‰”ýfo|TŸËÓ†ñ­Ö4Ϭéì¸hØX‘îµ*·ž¹ÓÚÊk-…òAá?¸Ë÷E ®‚ˆM2V>»SWêÑC‹Xm˜YœOʪØMY[ Y¸š5;®ßr_µ–j‹ ŠÍµúèan[s(ÅãÅ)ÌŒõ–˜þ‰•ô•Ö\‡cù´•Ê>nª•Í®ã©Õ1:Ìϧ=úª?úó­¸úóLÔpgÿÎiS€É³ìŒ;#Åu"t¥t/Äĵßd¤´NÌèŸ)½•«A7„ð&1Œy-ƺ^õÄ ÍOLg]£…LO¼¦iLúÂFŒyš»ë{ÖT¼¾™4i1£ïð8¶?{ÊÙε;ÝM~þKºÏX^~©­ëò±î"'N÷FgvëìÂo ²Òy4¢ -–6Ã+Û>ÅL1ðm›7zHµé¯ÓG ¦g¦á‚d¿´¾*€HhjK¨7¼·8ÈŸ®ê½Á’ÃzMø‘·“>¤3^<ÀéÇŒ‡µí9xKj°?˜ñ¾m3*ÆZ+o<4Fœ=LñÐpi§Þ —Ù…¯ÿX:=x$¿å¨ ‡ñEÿw4ÛõYm›]²H˜ Ù ¿þ¸á ‰ñàêä“ì‚@‹¶—†â §2P7¬tæî;¸÷d*¡³öóÅ—ïÂJ[ß[˜¾âzzEA• È}oñÚ¤½/¿æBø¶Í‡¾TìÛÕÊ+®lÐÑ‘²”Q¯ªÖòc¡Ó9Ëyaù&$W’õv^§t‚)£}RÎ.8X¬=$Õ Ý¹Qjuz_ëÍÍ·”¸š<žõÑQÚ\¼UÙˆµm5׫ç× q ¾ß£|=Ç®ÐÍ~`û Î(’¼Ã§•WÎ ;¬ÆÏÞ;ul8Zm×½ ˜@ÁØÓ°A²­%Ù74µðnbJõJ•m£-ýmn2coV­LðmG!–…›`ƺÞ-J好̔nHÐÇt6îfð·m¦Û_«§,KêE!¼4²ýO š¶›ÛÑ^¤îICÉ¡3N ­REH¨O¿·Poçl1â?*˜v HVuXƒy À®«{#Ž ii)ç\zú“cN[?‡{j÷/¸•œsB[øÖSi¤ ÙÂzþ!/òRÙ@ºe‚ðêÖçÈ FÕÞA²^g÷®1· ÜkÔ©lÃM¼º½G#u€õ.4‚Ún74ÛÞ[Pž‘ŒKÝÚÊRÂf#÷wÑ!Ü*Ú x¿ëz’ƒ@²Lx¼ÓüU• ñCâªÖç ™—ö›wÃ;=1J_§n©ŸªZ·ëÈöqÛ1©{×9Š„Yëtý¸GÉ«¢*¯ñN½·à|\«Œè?\básÏAÍÁMi²6á†è—€íuswÙ6;dKíëR¿sÇ̘hGó$q%¬-¦rŒcf6÷~¨)¢ú ìcw/|ºSœX¬mð؈4eÙû2wëôiZHÝç•´±­öY/KÀÚâ@ÖÍ wUÃAcþi*F’º‰¹¶èrñØJ•( ± Å[íu9|ƒ2ŽŠ9°©§r%³XdÓWÑN_ô'«t¦Ûº¶QE Š/Ò]Ž˜·m’rWLàzUsÙ‰’ûÄä_žìD¦ì Â)ù¾úú¹(å¡¶?“2Q&ætv›8Í#ç&:ų oÖ!™ÚvþþTåÝÄÓÈÛ&ã^²5Œ]*çJê·Õ (Z}+È‹!»û˜³87ý¿i,inä:éèõt‘›ÖEíë“dºS¤† .·¯ÍÌxýöÞ˜´ÛøËÊá#Ü›YGGßÅ}8/ΚY±Â¹Çíß_û´bØŸ½tY¨.mË“¥ùý.uÀrÀ¡ÈéÑ]íšmüUyöO¢Ê¨Šb<­IO?w÷ù±òËîó{Täõèê…‘µ|þ¾û,îŠfñä F©PÎùÕ½¹pmèÒÅs~Þˆþ5ÜœÅ*‰Ód{p,o;öNˆs9ñ¯ö¸Sw:saœœÑX-g¹-B1ßM¿@Qm¤égC×Þ=ùÓx½áéÏrõ¸œeX"A¸½dÂQ¥…ô‹â,eWÃà$.AùVª“Ààêøž¦ Û¨Méˆ.©>$’åÀ²Q6Ý}KÅßåöÃ;\%tt²©a|Œ˜°ÞºÎ›Ù+×JB½½·5î$vEySŠx… .1BM¯Oì]Ї âôLzÚgà’à*õÁýtlóL€"­->ët[ñk4k­N¡×ù™¥¢üíBŸí.OtéXpÈh›¬áûh¬Ó© š?!x¶¦²òS—ËrzøÚ¤ð̉ÙÓÅbáÆË½)ž6ôñ"r³˜+v¶‘3ZŽL/åil\RÅ2NççM. ¾ÅeÁ‰ß†sAʉ’x÷@DÚ“ê÷ˆ¥0ÉßÜ2YÝKX:]¿…uï.® M¾ÐûÁ‘gõ_ïî[íÎê"H¢{èè»P7¹˜nçÎúÄVÞ^·pã17Ø‹¡ù"îÕX8À·Œv 'yi·^`þ=áR+„o¦f"!O´‹T…jp[)°‹9´òÔ—Þ-òÏ+„Ù%¹½ø–²‚ZDp}a:&Ë}ºmße]Ãa½ˆ)²b@TOÚZ–îkš ¦óü*í¢‚8’_¾çQ¨Õ¯hñ+òÜÇGÞühꉋ“oýø>:„}„U}9Ÿ$âMÙP¾ú‘hú û&Îþö‹;¯­/vi¿>±C4=ÉùÆ¥ÌU*äRV­¡’ÓŸÈWÓåÌEùoq9E Z¬‰:ô°ôz‘Dþ)7ÇöÆhç½zko«IqJäÜê2µúá ÷‰›­uÀ²ã>êý†a®>è论“NÞ~1=ƒo¿ì1;@1Ù‘¦ä–w²gÝQ_®aG«à}]ë}-8XáÛQðåÖ7#è¥üû§.må²b­õ¬vÝ?ÔÙƒ²ãÙ_Q'È[£¯žew—m\Ê©ö¨uëÅÛ@¿“:j³ö<Œ¬Üû|°’É=“ZŸÑA MW•1W'Ö˜WՊnmî—¼îþóqÚó!”V1cÕ0þýÛ×®°®~ˆQ·æOô—gí¸i³þÁóë!ZËUReîðƽã(÷†›¿,È‘ÜУgîÖ~î©ñ³rF‹ÔJgßìú!ØRÏwÝCœ¡©2`¹á«„‡ÌÏæ‘OŒšv¿åVËPH‘A¤cOMeÛÓåW0˜m­;SŸ¿gwÂ;§¸`×û·Ágd²šáæ…Ç«DØŒUì?ɰšû]á¤*äÔß,[Æ=©(l™°XmÞðœ-ß Xe|Æ=mìΖM-V*¾àJE·Jǃ—TPPà ì×Û’`_š#³u…-ÊŽÓb¤ke×¯í ¯ó³ÞÛŽ‘x±ïá¨JªmŒüáÛòÚgv¤Ç5»#ŸXО·ØbÔ31a•ÒômÛ· š:^}\Á«s$ôðžWUy5áé<Cyö7ñisi×4Vy=¹]$Æãí¬ÍanzzÒ˜ |RhbÒÙൗ…R¼éqSîÈkÎ+Éa EÖ¹ õ.õ{c7¢úùbsÃŒ«wwxëH¤¸OÒýù/Ñ—ÞܨÔÛ(â°ƒBáÔ+7©Õ=¼RûeêþW¦]ÚS±«o(+íýÔ “ú®hS®¦ŒBBôÏJ×Ì=âxT®i#Ìh´þÔГ÷À’Dd¨ÏI³/a:2åùq¬S°àéÔe±Æ*AmÈö-ÓY{ÖñŠ9ÚÅ2^1EMBn‰æÙÿ àXzm—+ijã.›@a+•µ› ÃÛ’+ÐÊ9³y'9^ª]Ñfм73š½’Bt_Ѹ£›~ú¡ý³¤˜ýÍUÜ/! ï$]‰ºôùÍÆkšF²«»š‰Jº™<ì±í„áM;s£ù£§µ6~ì[+o—~Ù%¸U'ly–ô²$¾; {¬bhºiR¦"¿ÒC1©é³ï÷7¦j,é>ï´Ôïèce£ÂÌq×çžwµó×k’]®:M£BÏ®\±ëÕÆ/ZM=ÑýµnUgâì^+ÿ˜óüÊ©E)4\0G8P¥D;è[Þ¼k2ð”nÕŽ®¾ Oû``“»1·É¨à¢cŠgküåuWºà}Ž> ¼§“ý)Óà­ZëV)Åmgâô¢wÆó6£©ttÔ¥H¯åWêÝ߸kÒþÔì K!w…€¥Gå%Û]÷¥¿OtÎûÂé,Wöµy«ç)­t‘'íOÜo6"ys[¥ä꽊”k@׺e¦NX[ú£1qžW·»l]=§Ï¬ç æš|^UR`¼üï‚‹»5’9"ÇÝÑ•”漺)­õ©k»`=°QN˜»ö²ˆeʺˆ÷—7ºòúûíenè÷¤Zð[œ¯sˆ©FPúô“<’ÎÞ¸ÁtŠŸ¶[¼ÅXcšW²B0G‹ÃuFi³Æ%É+}-¼7ð½k‚KCÜ5•Õã%ÑR_À{’Wž»Ì6S]IÒÚµ3JuiDü™X’ÀÅ™ôj†o{‚èlóû$:pužá´zÃôDó'Ö¼¶µèÝuì'§2”;yFˆo8¿¥í'ûÅ®õñk$Óï;¶ |QÉ®)r7=§sM]»vÉè‰ÔÁÌÖ-½WÈÕ~zÞ÷~¥ÍTÍp‰œòô曄˜6t>£(N1ð¹»Ky_ô˜E\`ŒîX—Â`Äc ^++z±Ž®#c“'¼z¢¾f@Ù†V÷ØþmÒ…Þæ§¦rŒHe“ V†G>?/ËÒ¹¦¤Ýýñ½Iµ¬®oÐqÆPoÚ×Ô XÍîþn¢…÷$u,.Ö­T~¤%UdvfîaùØ6³ÌĹ+ÙY÷Ç¢æÌ§Ÿ_»mÒ6MŒ‚ÜÉž%Ų×Ç:*Í7‚‡¦¶Qk­ß©ÓÀ*ïû¨.«ü¸,é.(r™9Ó3ð·–}Rг¬,É"ËÒj)6à/ªß/úŸ”¿ÿùÂ_Äÿü%åÇý¿þ÷"þï¯)?Æÿ?ÿ[mÑþ¿¤üÿÿ üïÅóŸ~IùÁþªÿ ü¿Åóÿ~IùÑþÿ ü¿Åóÿ~IùÑþÿ óçÿ¿¤ühÿ¿õû‹óÿ¿¡ühÿ¿uý§ŠD¨©¨©Àãÿ–ßÚ—¡ž¹á‚òú¯ hà?xÿøÿý‘ÈÅó?Mù¿ƒÿ:ç™L¤Wè.æèEÌ×EÌ×_Šùú/œÄ|¥‚èCßA@ÑX<ž„€À*_¯)$zþôs2@øœâÜ2è…Ìf@fäoØ­Î °pxÊØ0†‘쎅€Òù³ ¨ ô)à vƒÿ]álR@ø¥S‚)ÿ ™`§ià˜"O|O ¨ä›ùQ4 éy­âT20Ã6ðŒ/zN‡ ¹A=Úâ¨L0^Ê\ ‘xIx_wÅQ¡8 ”D¤Pp Í©D(Ù—À¬L$a $ƒÂzx"…ÇBýƈ¾T¨Ê„Ù’ÆEÆ2!2ÀÆæˆ]Qh/w2Ñ—€i¹Îd?À»˜@.üI¨;– Cùþˆu#½¡(&b0Ð8… d6Fxž=“#‡™kN‘ŸƒIÑ(Ô¸ëâDa¾Jª‡©ÁšóüQnT,è†2/ð6XÑG˜“ÅA‡Z @1@di)2ï¦Ác4èËdí>ŸsÁd(ÑŸðSßÀo¬1GP Ö  H”@ ‹ÞP,ÌÆT)T>…JžW–/0ʾxæ8¡CÁb¡@Ö ~—°øß`Çü4Z 2—Ö±úQÐ_æû¾û›^çð'ã¨À`šv«œEÀ@Q °¨É‡Á1¿47OŠý½çe†Í’Á bjÐ(˜hÍEGTû ’±ÀjT,ÀÒ•h}ÞUçdÓRz­¥èû'1×Ã%¿ÓŹ{ø*SVĨ!~þÙïÀì0óò|ÇÁƒu)P Îè€Q¿ÓÓý=phèàÁ€ß^h t^ ð(å……bÝÜ€Ž,ä(Kç+Ñ‚ÚAÙ°( s¾÷Ìn¸™`ŒJ.çãök:œgò½Yçs- 9&¾¸È 81¯Ì{0$8Pº2}áß|]höÔõï$¦¹TàøÃðb¶³äÏñ[>ü90æBâ«åÁ˜ 0³M¦jåÿX}ó:ú-Î=Rpûñœ0,ĺ9óöwN;?ÕgFב€Â Ã1ýlÞ¼‰œÖ—vˆv`¦Åbp ŒtR"èÝú€?NÍô¾E0uæÊoÞ„bzÐq`©1—€kð°Gƒðwh*à© ¦ƒÏ ‹ÌÛLÛQ@–~(2œ›-Œu_'Ø4–´KæH n8÷¯†Ù¬È%ôF‘½(òP0hZœçÊÈ\7¡ð êqAª¯l›Ëæôj…rc¢±/˜€©} ß9¡Á| àDê 8ßÂ'¨:PùT¬;Ð)ê X ü.]2Õ ªÔ` àJ˜9›0“†/iÏ\Zùæß [ UçœTøœ×1G`æhíëMúi0Ÿ³­KýÃÇÔ!`ê¤BæXÏT6Š„rf&Ô@@T,ˆ¶&<_ èÁüô È7TpÝ LÖ)sL©ßTD" ˜ ÎÐò°4šK_Àšï;qçÒÿ+͈Œ›ÃJC@áÊš*êšä"VÚbùË¿ÿûíÿ/žÿôKÊöWûíÿ/îÿþ’ò£ýÿÖýU„’ªªšªÊâû¿°üÖþßð_À‰Ÿ³3껣_ÔÑ$Ò÷Çû?J_ÏCª"•T””Y”ààùâþϯ(H¤«²2 wƒ«¢•T ¸+\C ‹PE¡5\±*¿Ä‹åï+ÿiüÿ; pÿªHÕïâ<ÿ BB-Æÿ/(¿wþšyŠÛo=á{D7W P‚ª«¨Ë#TÔ‘Š4â'B_*ÿ : ¡&WW‚*+©)Éþ_ÁáÖ8@£¢&TQÿŽFå{8ò —×o¯ÛlþÎü´ýLLÕëø“½»¯Úû'K)êšeО „uïO3-ÉxöÜXÖ.¹þrÉŸî®ãâù D‹ªWb&¦ÜTnÍN•œ®—ß Ó»ffSnòíÍÌ•îQë߸S6UöRË2Zj¦”íåJÜö~Há¸e’”º!þ¤ÅdCMÒƒv)'“’ê ªå”m‰Ò¦Jö ç‡ÓŸÈíÔ•ó)Y+Wno ܹæRÒ¥5³Œ‘»×g'/~’HXuüdùdÄÚÁÈ[Ž/0¹×ÏÞŽ­?“ƨ„úò4{ÚxD_Þjh€¼+¦6l’'~^-¸=ˆ%&Êäx;€úH¡û0w‘G›=n¼ðü`S[l¬7h^gœà9ÞÎIXqy´Þsì™MõmÙKMeû±%éù6 5˜9jÉsHÈZ‰ËEõžjöù‡ÌmnÔ»Öȼ‹)F¬Î?^ïš b×{¢FƫµÄîÀASÈæ;½KNʫڳC6ÙãK¸äÁÊ)`å%°2f X¹•YÙ¨¬ÇT¾‘*G*€•=ÀÊ­wÊ$TÉ ï¾Ö–“03£ñÛ«VsQV”ÁnT’arøCä°PòØU¡©ÊŒò?—çÀ§Ò¹†©Ùƒ~à…Ûÿb´3€N°‡"2cÝ>D+½áw© üÅè?HÅÛ_Èæ¿KEY¤Ülõ¯Ñ.æµ¾^,¼_"ÄÀúDÒÉZH¥¡´Zë!}­sòøÚkÁ«œ|•ÏKr†5·‡CMšS„ÈYê%ʪdn0A¬ÇξK[QÆ hvÂQÒ"£RZñ†;pêö½ûÜFIsre ´OV(—v-doá„}åßÈ'ÓÊ/"·w®Ä¾Ÿ >îÇ™D m ~+4á¯ÔF‘Êxö¨8ôL$HŒ€6fq³Àíæ `r«ë0l#†ð´‹­TÔW9+4šõÅÚ¯c ¿òlŠŸµ|þlžÞTÂ~‚¯MHYX›Ó@Á¤oy¨nüj\BðÖÓL“sÑ.×oLÀ8Ô’ã^rÊGo•+¢þÄ6ùÁÍ&¬šI,¸<4u/þä ñõ=Á•‹F¤rɶô²r‡¼CÖ+x¯2‰jâˆváF/Svp ¼>€Î$/³R,¯ãôô¼ØTyþsYt»á§Q(¯Wå³¾(ÿÔL0“Æç¾éÔ¾“W·¢z¾Ð3Lè3žDTû<ÿÌ&ŠÉò‹·K~—šª2)ôôòCÔíAºø¯Ü×ü¥á¯ˆÐð—¨ Š¿ŠJvˆÔ«Óòø–~c|&'ÐŒË:ç׸±&òKœº~§¨ªÔWbçß„ò7ú­8€nnYo}H:µ<ï-à–ñW—à€3HÔCx_~IÏzlߨýíoƒ°ú·Ñ3¸_s\È«€J’üÂÅ:€?ã`dÒUâ…ý"0ŒíÛ.7~•ˆ¥{¨_t_„“çzDf håˆR#‹Fü;ÊC¸¤YÃDmDPÓ<¸Z½ŽE(DHýð]éò18¨H˜€ÈG„£-;{^<” Œ•àBÇRõÔ"Š¥ 9\¹øZ²-ŠÂkR.Âr«û\^¶0i›ólÎ €TC)­óÌûÀGºÓò$£×g¢‡$Ò«çAyÖœÚÉ+·ˆ$¼ˆÌ\=¿ÀÈFIkéñβ̷ý[j9õvÍ€žp;–Ða{\IøãBI xI$츣’b¾ãu³Üë´U€#»}`X÷™®ÂF̾âFuPy9)µÜõ®üÂÆÄa“,’6L~ã>¢âê®u• ãõ͑ωPÙ÷a¤]n9 +A\[¼ëáxú’GzÛAIQòãúCÄ;. Ä rgE *‹jj9mÐ5M~ø<ôŠI¥*=•Û ;<ù†î"×õ• ïÄ&m ½ [Çul±£b¹q¥â;v°rõHã}¯¯¦ü…ƒG¬l2lÜO_èn|:BËç¹u[fÀHD·âv`ª:Ûû§T<@þ©˜QqÃÅ€ßsæÀ/̾WâM¸Ælߊ`áäÀô¡/Ò_ßqþ™%­ÊÅ÷wGGÌdé<'?ñ»NG¤¤§cGлZ³e×½õö:7^Å&mGü}Žåð Yv׋~ø³ H£ñe±¬ãHÞG&9—”{ãçÅžo …ñ]î|cœgLjE]H£¡¢,!´~:øíSòñæG õµ9^Hµf¼¬8TE(/P¦™I%©¤`Ù C<„N›*HD½IcÒg—=·tä…¼X¼þ¥DiðpÛÕB!¹CCvV 9@™"íÛ‰‡£$Õ2>´®Lr$/5²Pš «æ‚-Æ3äWÑ  ÷µ(eù²a5N+S %òfµÜîk’–Ÿ«®_Çãó…Ney•ÀG7ýé†ëVF´‚楳ޔÔÊ-á]€½¬úû­•u×±°{¢’íý»¡£*ìÕv=ݪ:Ôû6-ù9Î2Ʋf€>ŠÝj[Ê"Q‡ÏeUDùáªßÃNûåìü»\Ùä ^‚·ÈKÞ¼/µÎD²féó:|üÍ‚çIZ/tœïÉÙN5©C6cŒåwÆ µÅiÊ2£¯ªìl¥6nC¦á#}F5îÞ[C%Z~ùB³Ê²Ø‘ ””ôœ¬9o|bÕãè`ݸÀ@¹y¥£ýŸ30O€Ú£ñ;RFö®/¶…³èÛH@›àÏC6 ¦€IÓŒ2ÙYŽ|œâÒ–2¢w.}yÏŸ¦cHe’kO*5=WgtSéÔ ãU¹„ã]²RjåñAnaÌ âŸK1Bó-³"é "ʳ°ìú¢‹òC¡AÀû䤾yÉÉåØ£Ó KÀ÷•÷q0mÆö àÛAîSϯbt+ œoí¥:øüé]›7D}d/Ûªbp€KOR6ÁÝ ÙûÍa¥œÇå}»—žE­ÂŸ]P¥^ ”ÀB2N …´¤l’Rš5qš"% DKcî:ОAUÌ7•#hÕĆœ@2›åT?¨»@aX!8N˜àAöQ˜÷Ö£ÉÄÂ1þ¹±&Úã¹ X¤ê{²óz]pÔ+< º#pPuunwb² Œ?Ò¥â»á†lñT:‚òQøFH³îPN„¬“X:ÀÛ¼íÅÕC0²T¨½ªS7ᲬCŽ™‘ƒº[ÙÊ ŸÖ膀ñÜ[Wª+zʇùÏ.·>|GðZ[ƒð^ ûwå¬=—‘à¼nEÕi(‘VÙ¡¿F°¨JÛ0Ø5piAÏvŒaÝ’íø´nRatU›MXyïlKY¸ë¥ï|õÊ?aá‚D–Ž©ï9¬šÙÝî}ÍìÔxÉE’ý‚0QÔzî˜eÚå¸b‡û 'I†/»¦nù)޶î?Ëykû¦›º“ƒ&'¯=FPà—[޶<›K¦>%3ã ûÓÅd2Ñ`7%9¹Þ*XH$øn­×ÌÊ3‡Ü±Z„}?m ãê[Ùa"}½Ô‚<¹D?=¶v/®¥öQ‹º~Õ¨^(Sxfãò™c¡3Zº*5<ð%ÐeçÐ9íh u± Ä7Ü·ðZõ¹;ööìø°u¿¼-¹ß’¹ü˜]äÞòÈ43ŵO–b”YqZtoóN¦9îSyØâ.¶ {øÙƒµ§a¹àÛ òpp€¨kt×ÐbBÄè` `„x¥ãîFƒªJ~úþÕ<Žwñ½xΚƓó·ÛI$ë1Ê^/J$å$;¼î“Ÿ½îó“ì†èL‘–tÞÜڭÇچÓhõÔ‰“WÇôË®GJhleò§¯Êpžž«h€ÖßÅ¡o«'ÞoUÄguøF ±gñ… @Wڽɒ®{;Ò]Aõ/ž*´d2¹;§Og}‚eׯËsÕ¡É©‡äÁ9[w¦e3ñûÏÍ?töZÖÙÒ•ìd/Àb-9Aœk½HÓ²•VzÁŸŸ.^,µÔ7¶ºLKö}fâEAH5ì tÀ(ª(J«[[E®”e+°|[ ”äúqfˆª¾ãC¦ÆÐBrm% èq(íèàä8;æF>}ëùjÌÙ*â¨!(-ZP€($“Ó:Ýœ:&®ÛËm5IeŽÕ[GFýTè‹&qc òµ8»× ¼…åCšÑ vÞÎX >FÌí.fÉìÏ=¨—·Ç?2B\Fϸ¾'ý¨çÐüA†~<4Ù™³‚ßÑq;¼^Iþ‚ŸY~žÃJÐÑ\Z¡Õ]"² ŠìÛP;ÖòPΛ…s²kºýi¯ÿ"NR éTOî!mqý´ÙbxGTË^ÌSßØÔ›039ž±å×› Æ8wJÂ{àòë}T‡ %)»6ZÌŒ{mêKyî<[3XSîæ†Ã£91°ž‚ŽbÅ4»jìô-¼pãîÍk-M¨ÍðIeÕ&3áÑÎ4)RFäQ}?©;öõd¢Ü3ú€8„"ê­Õ 7ó-(µä-¦;É¡_ 7™®¶ôqƒÚÓÍÄÇU©ÓÒÀÄÍ,{Fæ[¹£gp)á©ñ‹†®µ£q Ü7¿‰­¶™áU š%ž<“LcÃ!˜áF‹Ò”Ó¯Xàþ>Š–z=oÒ€6>†šÕŸÐ.1ÚÝ45ƒåLæÍMeÌãë á4»¿è¶>R5¬!RU'̵Ó1‡r’<ÚÇ­ôÈð‹!¡×ƒ t2ˆ‹òÇ °qM°€™qÒ Ý#U&ŒMÑOø7É-c`.×m9òÉ*¹y*ãQ Ï™s0ßsê>&@—dDyEëˆ%¡%„Tf?w`kô«î¡`É~v—ô²ƒo]8§µ’ÕåJgÙW䪃ޱÇ^ªï¦íU £?Õ6s͸”q>åýH؆KfWÓzÈü†eIqhÚy»¸QžQÞ—zwy?ãQönÈÑ1dtæòÃvUœlûºñP`=¡ë î·\ ‚·û3ÑMõjÑ@O¯Î[ºÌ—çŸzxÔ%‡nY¶Ä¦«c‰ÌiUIœ‰­3™ŒµÄÛѬ.=E}Íî¬^®­q黇)Ä}—‹«+tÓÉaó— v§Ñt Òï0*˜e^K­.-Œ³*†—›ª—«Ã™z=¿¦ï–öÎŽÖY×½sõx ·²ííù2ýÓ*â™7tÍ·ú/û®dœú ÏsUºí:Åôeú~WW)µd$Ã{ò½±I ˆE~ÔÙ Úº-ØXƒ-:ÒL>.NÏ—á”2¶ñ}}™tÍÚô« O4œeèÇó‘ A;NÇËžûEmÐRlA]=…0…äÔ7$´NAåB®²’ƒÅÆôÛÜÏå+:o§†áŽ?Cõ3žiÜÑÙ^«QšAÚÞ‘ñø¼ãÓH'à³0ƒk/¥œa`B›ä£üë¨éØ“U˜ExùðÈÆÏË»‘ý-¿’6ÃyÓ¡åü“¡û|¬U:ß䕳m–F¾I­/Ãbù¹^¬e¶mo,Es\yý“™>£LÐÍ!àýÍ%€¡µ>ÓSñ'• V~Gyå^ÈjAlRJ­@;ßjܵr:£îh|ú¥ã쎌·•õû;Q"Rpù»ê«/éçÄ¥èbVyÌÆü†Þóâ Ò0°dY™óPð™›êÐôI/î0Ø’³Ä'ç¼l_Û¦ª}å„[_&ù ‹%œ²•ÝŽ ;7©|R%Fƪå9e ‘÷Ûû“Å®µ„E N"z»xCÏ/q¦}>šm/¦>dH‰Óµ‹*ìT“7žiËÚÛHÛ¶>[S«ú¾:òY”ÜîÎÐuÛžKP­*0²Éyl&®ž¾,‡}nUs´6UÉS×#4Y¦n•…—ñ­×qŒ¾·÷ûŽ÷¹L°U÷L¤‡Z¶Ú3•I7α×Þ5·8Ä,  vÄš!3s)ëéVºÂ/9ýª.Ð t%›x0#bÄIû½»µ?Ø|¾ÄGŽ­ÝO¿žzøm-!•0F!“[íPá9YuPk·¹à­J6¦©´8Åðä `”ů/3Ü8’lôôûú&adY»ur4ˆòÍ4Ž¤Ìøà”‡P rwÓ°~¯ œ^¾>P¯Ò_&Œ­§7{£;ŠV$;«g²Êì¡0«Ù¸!ñ¬2éÒ˰l¸Ð›Ašá Ø?’hµHs9 _4ƒ(sæ~n'ýÛAÕµ¬ÌC,ÿf…4–!wlõSxgY‰ˆyÒmÀªŽÆï<ãÇÁÈÏ!,%Pä4«™ÄkáQÌKQìV =hQGY˜À0™€  ï‰ÂÙPÞ‹ÄIUVŽ'oäÆ,e‘ñîü+–.(D9ôͳu!ã^†` -Ù4¯Oª¡GÒAˆ»ï!ty«’ÛÅ|Tw×Ƀ#8H€0bLWYci£#45Bøk*v»oô³‰‰%Ó˜® <æ„@'d†ªrðJa¿ýi] ïq½ÿ1¢œ-¤¿HÓsj!Q6—T&ûš6Ä­÷Ö ›Ýcú&À(ðÅ[¼zmÏDåÿ¼7qÓ-&ÑvˆéõV,àw·G„k“ô’EQfCUŠ+èç÷SAÀÚj-°T<Ãl«ÀXqˆG¸ÚVæNWn?”jìé5‚£ŸK.Àgu@ Œ)_;u[[“ºb^„¯PmcUŠÇ<u? f£ Ñîž­»q£¬(O‡+?çÊž¸2xïq@< ¬`W/Ï5HhµÚÀá2z£‡¹Ó|s&–Ö¶æ£åTw¡˜GF;˜€ròæ Ű0dµx/Œ¡ƒK8¨ê©Avõ _s\RÎöeÀ"v.ŒŒûíWã6Vjm[ô*mjq·òÅxdžNt#*%ÀÒŸc (ì$4gð¾Ûhž‚“$vß"à—%úÃàýÝ¡'> !\óþ8‡ýŒÌ›ó‚ ÏÞâÁ\ÛêDFmQ¿Ä,hŸŽB3/)‚z±6—4²œ&™®£‘×Ó»k0"”üe*HŸ‘ËŽìœödXó‘TøÐW[•2šÇR1p„C‚à÷@&ÊmyöeåCž®Ðݪó1è_Ì€ §G.$9-Oe°ïq¬§„|‘ÝØB-jiY¶Ç/«0ùÕstj±ü3ÃíÈÃ+Xv¦U®(^÷–à‰HïsY4fûµwã‰óß";?s9S~.‹±³SµÿÕ’ómÖ>nn}œpiPÉöíˆ0¬èwè2nï ,nõ=\ÏÀj 0«¤¿­¦E}‘¥i·+ÀúJ†=õË CLvöoŸ=¯îwg[:> ^6}Жm}·`s`äwCñ~£õZÙ6s¤OŸ¡ Oetÿ L_“UÿªùÞ$CJB~÷ öãÅÔÇ¡4r…“1_ï‚YÁa9¦¶×oµaM!42²ã#‰¿vV¤8^Ê>9ó‰ “Ú“Ñ_¼¿µF‘W7Sóú(»A!#Ò¤#Êâóp,Íz¤/‰­On¹XîlkåÝz“F×Ì¥á"ÚìA‰2ÅW:n €ú „~:êM¹8i!+Jd×™ü<”Fßw¿~ô¼,[Aõ ?Ù&y©"™sÈTaV•Þ÷­ ´ÝgkÇômYõ¦•©•$—¹ŒOx®¥¢-#¦«ö¬¥‡SXcîg©Òÿl\œ6µð’Ð2šÉ%ÔÂ9ô[¾Ppîn—og@Ö~Âå~*?/6¼ññ¨™})~ ½{=µQÑ„ ¨Ÿûݼi¬òjéô©ôÔüe>îTâ3Ô§1AýËŽ#£¦lù\®:XÊO›Æ p’«^=¹=Ž(‰»·°èû4u>ruÞ“¨ªÈ¯——~.ÀƒT0ì8š‘zªãØ+¯J îðåé”ÿÊc·naYVMA ¼i«Ô¥=eV¦8;—ï• ™ûyw#OsÿàZ§.ÞDPˆŒPb–ÎÎ0l¦ Å®,XÄãiȯ¿#óP‹ü˜´ÍnW’5 CØ|&¼@ :jÅ`ôþÞê ´Ú¨VÄ”ü¯³½¯VÕ7UŠmɃ¢zaI†â–ueö#çX“§gÕC“E’_ÔäpÙ­Í@ °¾²."‚Ày¬õ˜rpØcU­—•êfá¢â@«=#D]ñ*ã.Þxë.^?þ±„ܺL˜lòîÃâÏ/HUQ´Ëӵߧ¡òm"±hÏfcG¾£0àšZ J›zü/i•uÖn8\€þ1@¹»¯]«ÅÆFñÐ9àç Áeû#X™1Í"óP'2.w/qˆöO7€­ñ3ª]žy;W}Þ¸²eÅQ9^]+JF¹ž~ú‘Õ”‰rmû<æÍƒÄ},}ktA‚žj]R±0¸ñÑ54 ¼ jø£â­éBGYtÀ÷qx­µ˜°õhw3Å.:=¼=¢´Š{á2qS£L %wÆíEè,l:Æ¢OÉ3·’BX{Å=ÞÏã÷=BtÕÖòty¼¢C Ö^æˆ`´çÀÚæYŠœ¡X¢Ò— [ŒÁ3àZ›’jcŽ„Ms|ºDõÔCyY¢!Ú«‚ÂÞÈ"ožvÐyæ~DÑ6i…<°Ö| <Ã~•° ·¼Žc¢¨SÞ¹û`®Å§H2Ü*‰¸l¥ŽX=®ÏrÛ1ÙùÕtPèñóãp/ˆ3$éü*9|q1A‹-íÝp­¤˜ß¥†|t•#qö2ùû{\]LУ§_ÞŒˆ’]W©BÞ˜êŽá®üÒ–úzt…Å­(B±ípÞAƪdîÖ®/åÓÙÔ 鲈˜¿ð:Û°Ô ÷?ÈåÃûhœÛcË„ÓňâÁ’ ¢v/Mê u~nͧbú¡»è>ÉŽJj‹JÚ©‡ÛX1Ä6pùÙs3•ç%|Ê@“á¼ôÞøÞàݹ{Í®žn÷¼ŸTYhÕ&- ¢ qÝÇ™Ÿr<Ê*Ž(=6¨W‚-. ˆ1ÿO‘ýd䇨9ãþ¦ž÷)AÍõA×m?¾ 6…ÅâðX,–ÎhFOÙßw•Ôâ€øÎ¸°vù]ÕR‡mçEd€È> I®rwðs3¾¼^Í&ºå hC¯lB„œ¶ÞÚu´1i°üV9‹ uú‹!€êôSIuçÂ!ñÀË™Z*&Úe1Y˽?_¾~KÃ$F²_}9ŒœTð¹^ºÞD£–9ˆã›¤Hr Œº•-îLˆ˜1è[DVùìw»‘ƒc²ÔrP.U•õâ¯éÆýö7ÒXIDÕƒ4[Í`ýÀ$Ln€.÷ #’~¥™ eYyÓÐÁwêÏŸŽHèhŸÍ€/›?už–¿ƒ<¤k-’(‡"D—ï Òãè1qpíO ™¾2É\f  7îAƒoÇA¸Ö¸€øÜ¢ƒÓh:áPºå¤´!–XaôÄ›iL­|VG‘È’îsùPË­÷žW¯Ù|¹Ò€¸zÛ2¥Mºafznd[ëãîüÎ#°p¨¥ãpý ,t£ ÊeÌ“¸ôÊ]´¬\ï֧ɸ×hê|ïS‘›¥sûn>²‘e¹RÜò¾Ë\~nýnJ½4íÉ ÞΊ*‹å‚Û±ƒÐTN•RkjÔò Þ'›ºx‡žw}¶¡°ú:þ‹pFêšzû°Ó?ñRSÉ<?<,Îeýtéù„ØŒ”Ýá×{;H#åÑÖ TJ× ¡,#¡,åð¹ŠòÔŸ…YÃPG2‘Îûc²ÙL?ðÐÞ³¤dÃŽ©åŸËÕç·ÔÞ&ÌP2ÁO€3ÃúŸ=ÃĈ¬oÓ”²¼Ø3¿výÃüØÞÖ& rbPýÓŠïcL½þJžŸÏýÛ³ñ“…L¤Ïog/)í0e™„Ï€èyaSL‚+`zëÂÃ[t?Ä ”ÅbæÖ5­‹¢*`¤ÿ\îøiz;™ìé&ÑiØ!gZ1õñV¹:êjHÜ$E"ôdÓìÙrØžqíG-sª‚·’°¼xT3ÑØko^0Ä–uI»q2¨OÆ‹¨02À4©Iɬö é;3Éß–ébÄűŸaóe"%›·¯2é³Ðs€B—Œç[»-åP1fF?`d–p¡Ø[FÖ6„{«m|ÂÝAbýNcU÷è%2ñÙÃ@G\N}°•¡,S‘­–íd9VÕµH‰„Öü€ª ÛÇîÒÎe!èKÄ×¥Ÿ¥âÓB)|âDqàˆœL{S3j‹iÔ‰Á³{ˆ1h0óõlú˜8Žzþ£úºù 5ŸdµÅâZÞ ãíÇXLdú 4«æÌ÷£Lª½ý3h*«Éj,xú À¢×ûìn³ÂØBÓr`Hi%íkɲ›`h†¹0 _ƒÏ‚ãsÃ2@I=‡¿K%B:gcV‘”–@«£Gbmk&¥6œtX¶´ù¶±?ѪºÁgŠomvF~‚”vpù\LÝ (éZèÇ¢^úu¶Ùå«ëž”ëØä+.“TH›íH£Æêº¯ µZ’¬KYµæ±†Ê•Wß´ÊâytßœïwäõO~¬É~‹ÙE!²š§v³…DwÊ7d©RñÐ1oZPM¿lh ¢ø¾Þh©ú©|LPc/96qñ»¶¤, yPƒ‚«8+¢MVZ¼7Nì­@-¤`ú@v“ÛñÁ‹éÑ%gí“Vy> ÁNë9­AÝÁÂkHüÛ+¶tçÚ´á¤f¾=‘8 l}}ïF=Û­Nç)‘v…Œ@¸SSž6-Pþü·!–Oæ”A3À!qÜùÞEÎÓí /ÐB¡µºo<1H« ôœÌÀPã8’H€Ú{›¶«+‘ܦæt~µõ|4 aùT»”ok½slzx§Åð-è×ú ÛÆkGzI¾ŒQÐ[gw$`”‘LÖ´•ûÉšUÛ'M»¸±Ì&¢¼ùLRŸ¿—R†öx†žŠ•LÆš+²o3JA~æ>¡“"ÿÙ¯#ý°•Ž´õÒ\šök~NÕJ—¯}kÚÉ“XýÉ FG•ë`žNyl%ÿö dçÓ5YL¯Íz©n_7#¾n÷{]ý­?*0º,+ž˜SXm âÕ§s#Ž–S–L‡fzì4œì€..t<Ê Ÿ–4§ª[~ê’2~Ýñ3óÆQ\ؾ®.V¤D¬l#?»o’ŸÀ¤f·ÎÊLJ-†#býÀë(sF)PËÃ~Iõ½w—¹8‹å¹ˆÔìõnè‚í'’Ú§‡yØ(õ® »›À'dßÇVqQ¾tñ•=¼,0ÀqÞ€¤:MàXȦ(=1î!|e ]æ>×ÍWȲŸºùû^Žó\aÚbåà8ô«¹áðLÒMéåÒ驪xĨYàò(JåDq}%›S05ÆÞ€`Œê¤!a¬àéqG÷¨â2ê?<í4œÐ^¢â—%5ßí±‹D‚Ê»o{¿K ºø{ÍëéNxƒ–Å2i­ª¿œ £‚Bëú·l’}†ba·MòÃRÊ!…´Ä>Ç[öºòïsDÔ¯$«ç#€^A*jì¶ \-¹Šœé…ÕåP%çVvà`DÃvNY\Æø!¡$,!/@é^tj#Ä1Å)½b1”–ÃÏÜ*RYgs[Þõ جû²Êj|×OĘJå. ì3ªóôjX먙Û‹.R&¥…Ƀž}O‰$¥QõQ'ËM˜ã¬ÓðöʼÄPZßK1náy|ê ^¦®ñi™+ ø)gwñ”ÊŒìð±,²xþ<&“!ö,TëC¦Aò]Ygᤵ/Œax€«Oê{ýN¨¾D¹tOæþ¼[4Ó¦‘ZsH„Æ ¢¾öe’wÆžõlzë Œ;»=­¨þɲ‹9Û‹ÿj®´G ¿)ÞH´F±C´Kš Ö."Ã÷®Þ/hIû} Vt6‘;¤æ~Ý‚‚1$Â`ɬÑ|¿ ³UÕƒG„0Mƒ«·ôuzÌeœ‰~Dz*33ˆÀeά}M¬LsÐLSrŠD"£¾Oꤦ~ª…õäöé¨M ÞìÇcV¿"ð(¾ ¤1r¤Ï¿Ïä€eZ~B G6—¢Š}fÊÈÁq’ô‚ü=©tÉYÚo?—÷ª2~\¨~2Eëv|+Úæ ¸ym]¨Ÿ¿‘Ã’¥åC~¶œ¾*¥[ìo1Ÿ¾‰í§g»ó.~ÿë‚Üã+g¨4«ŽôJ¼:ñKT*¶ïù­ðIæçpÀJаW2,UÙÊe "ÝË *¨iÿ]9„3g®vý«ú;|)§ n*Æ”&€ÂáTÀ«\d‹&ßX2ÉЪî.žëU!›ñ[ÝB§å"è8´31/ŒÁµ€‡A !Op|]ôÜjÉ«¼qbÎ8²Hþ\ìóh"€uCWÈ3%`ùnÞþ_?¸Ž¤ÈFI3°ÔE@W«l¡Ø4ùˆ9!oÂÖëĉ BQ›¡O›Nx.pSÆš°g‚°yãц|H’èñ~Îlõ ƒ¦HðÔ "ï†[`߃!ågî+÷t*XCH1@žÎ$웑FÍ›?‚EÕWQhJ“ÎJ…âgd¸€U7ë‘¿G-<ú¬¯…ˆaáWtÿV€8Bc ý0GÒ5ÖLà5ýò/ωë;±_ë!‹Œš­‘|E6ü ™ô–^ì²Öç_È ßœÑã_‘E(^‘ýóyO¢s ƒÄbX×…ÒêüBÖøå[;d䯥ù.¡Oªº‡òYñ7äôr,·Û¤’x{a,Àˆ-3RÏ­ºPNÂŒuÚÔÛO(@h @ԯݿ¬'ÌpñkáùŸ”û“ ©'ÊÊŽq Äb*b Zž……ïßõ " HÏLC/•)õ­7é Ot:q$e+Ä”wú”´Ò$´¢´C/,¥@=+åÙÓÉðýåvó vÕóê lýþAÐSTÀ½†ò`w}‘óåÞ„}.Ònµ­ýùžG)½½f”“À&Z(ùýX#×—£v†Ñ‰y•¾r÷ŽòŸž…•·K~7ü0=¦ŠV÷ýmÖe®Iº*wä)ð˜Ò|ŒjöÃ4ˆE‘[ÿ`ž’2²I*.I®ü¢Ä ­^³Ô1X•[&.ɆÇd‰^œ§G¯Ï¥ äqTZ,÷FO׆er±Ÿ»ÓÓiLPD®â÷Óç¥ÏRÕ#û6ZÎoóPȇ¾=y¶ýzu¹Rê•P¯/ôWÈÂïA¢ëžÏÝ(E2Ê‹ÿÍàºgÁ¹d9$¨vÒ_ñ„Ó÷¿ þñ¿.6ú\æÿ•„ÿÿÁüÿ”ÿ嵜™““ó¯øß? ™M8Ù9Œ˜¸€,@&vSVCn.& — «)»)§'3çwÿþ‚ÿ»ðÖÿÿL€OÿÙ™™ÿ>ÿËkë_úÿgÀ¿•ÿƒãULþQô¥…ý—Ìœtì$¬,\tÜ,ÿ‘¬œœtÌl\$l\ltÌœÿ’ ƒýµ)¦?üJóª¯oäbúÚ¡¡ege¥cæ`"áàâ¢cæú—,FŒ@£?¦ÿ0±u¶pöø7 ó+'  +çþ8&æ?PYÛ™ý-í+ço q±qü±¡×N2±0:›ÿÊ=ú/¸\ܯ¸LÜ$ܯ¸¬ÿ[Ó`þGõÿ?•ðãàß9ÿ……õ_é?ç_ùþø×ù? ÇÀÀÀ©~ËÿaBoÍñúCóOù?°±±ÿ#)@2  Àþ>FÑ?§‘qZ¬¸ µZ~^Þf)PþªG¥J–7å›d™•e(â»; §œÜ`ت9oÝO(—V“JØ_¥xêÊߘk €¹, %Õƒeòå*—[û²j‹tc· ¡H1ž '¤M fVGñçÞäVú‘³[?|ä¡ f¯¼“™RëíE ´]š¼5§(öw •«G^“/UoYF1´|sbŽ "âÑ@ÈN¼–±?nôè§[&0G7*î«Æ·QÝcÛSLKt§ärT†!Šw݇²I$£ª«‹ªg—¹l7µ81)ÖrÐýÞI ör/:£õD'©>Ÿà ´>3[*ÌÈëÙï9¦Å¼ÇUaRõ`*-ìö,{ÝD\ùÖYP^Y_´‰eü©Kvfìm%œóبŠhÞx;/ýÂ:¼Ð ëôõqt™À^y-³F±ørPy1‘n¯ÀÞ[]Yð–ùRÖ ¬?ƒª )—ò8¶¼.±eUÒàBÀQ„è=^ës{½É¥¡kÂîC˜·µtLê"Ç*äÖRÃp¶çpkãÀ0:yÖDÇ•¾wøÔ­ƒ|O–Å„â†oµ?ÞþÙ´é>àƒ`χ®säûñgotáÍJŽYˆ½ùZÞ̬ŠÓ¬þï>‚­§¦ sé§Î%?ÑF(-ö MMóq v¯ÞŽÙu.8Üðgdp/†í7N½Iý1ýc3ñÀôÞ×'ýÈô£÷ETó'ˆå‘~-¨v%þ/+OÎÌ-ÞNÂB1Œzz²©’¬ãΞOMÃàrŒžÈž,Ž~ž>Íž:5ûa3=óUŸ§<µáÓäXÆí¢°€qaûT®¶’ œ8{ ³¤{ËÞŸ:–ýZhaåHÙ Zß M}€O+OGðdÚÊ^n?\O˜0}ì…Îð%©¥Ö¥ó7M@¼òjÓjÒn‰õE5Ør«ªÁ>ÝmUÀ9]%"| $"6 Z ËF¹€/EÐÖIzx=ºw5ÁH ['¹°'ØQˆ°Oµüc[Ò‚Ä|©.¬ýóX‘ßÂK”°÷}r!?iH–‰à»¬tüy2¼ñqmÔ+Âó=¯†X_<”Û 0¹…½”Æ<„°UÅå~á¬,èlAì"6Cñ…½ëMËþäåªÍìÓ,ññü¨Ÿ'œD糄`Q­S° þ™E‘ç×ÅU¼OuíHB*E£r/ÁÙ«#Uçè;„泇ÑB›ç^¨lÇ.1‚ÞAc¨wK­`ËIp•†pu]ùŸ`–£à—-mÚfþ$—¸*˜ÂUƒ-1¸*OmÊoö'¡’n[çÚ Ë-øÙغCÐæ•Ún0l°öøžî„#jvA,ãòÓóÞÌM·ñjs†g00"šHŽÃA_¿³¢ß·éÁ—æ Ã^D±×ÚdÍ»ñ™íÞäþŒ±] "Ãì ºââê`iÖ"/ú>¤ý¾|½dÌ)‘ Â"ËãW AzÆÞ-ÏÃH7{ÐÃáøÛ²b} =i¦kN;—ÐÌ;MmQpÎ!ø‡D_mŸY V%Щ½êv³!c*á=cjd>=}ü,™—Ò^s»w&µ«±Úé:®iž77#<Å‘†“gsµ 4N±ÜòPÃËz16lêz÷þÀ ¨TC|ÿ؈xõs§V&*N¯ñ³Ìus¶Cêîp 2OK‚<:ùGxLmVw86Pq+A+÷jyÖ{zpúÈ–¼ì”t”¯àèJ‹‹_U­²)”Ü]ˆanÐ)AñBËïÇßWÔ<¦“»'& -'ýÈøP»ƒ6T¶×¿à2z­ ·w&£‹“t„–öÞ±oüýŽ Àø=bÀ¸`ÔægÈè*ÔÜë¶[O—aøUlJ˜E˜ÖÃH½¶Qê6³imZ« šF›©¿—it«† £ Ä }øQ·è0*ž!ªçºOc^ɓނŽÒD½¨VÔ€î¬ò©âE¥¾3|Pb<ŠR ™‹öáMˆ+G`eƒ{Èq éxRÕ„o |GïV0±‡¶…â´PqøÒŒ±’ ðæoý86E¶U7?t†"ov_‡ü n‘Ýäøëä µêýÌâ@él‘–u³âtJ¡ï(?ž>/skbl ç|䪾çé3(àï«å16g÷âÀÜ‚S“jFáɲ1”òE#½õ´h”ö¾ köf/|Äö,³ر¡Ýiå ÖªgŠõîþ§‰:dºš Í“ѳA‡kY@öÍŒÄ(+Æ.Ky{Šõ(ôXYƒ2±cµäÃr»çµOûýN\ZÁ“Cul>zݤq¤Û#ô¸ôQ8û&dÍX¦¡EÊsÍm«d‘†;d»è×<†=áþGžˆTRNÿÊì·lr­WFWá#bŒÆÙü¨¹ælØýËC8!ZU¸´BÝ…ŸG?SoZÈÆÙ K³lG¢"Â_‚¡³£ÔfjN¶ð¤£²C–Á÷àKf ùTHá„ÒË‚8HoÞaãªÌkß•I¥(ù5™$Œ¿vŠç™#l^ö<çVÅg7®ÖP‚2*›Ôºƒ>¼R?RÖ€+ /M“—”-ÙvÄQc2Aòª‹óÍW`”áô¨Pãª9‹‘>=á¾ æóí|{îõ„ óˆ(`BØKzïÎwïŽ5©N ‹jY͘ž\¥ùM8Eóá^ÒÕ.‚S/¶®,yâÈ_ﬤN …5c~Ût»Ôö¾\A¦ÈŠvÌy‹>Õ:rÕÞHÒHr›­é/?êFIv³[6—R6€ÉÛˆRRë£å£Ç\tÍøéí³ëu5'¨ÇøY°–×csåþÐÄyC¢û–ïyÿ ldÎŽ¿FGf)A¹Æm• Ë=r·jUù;ØÞ–7ùÉ¿˜O]t´ÄûY ÇUèÄu­÷{A…âÈ)HmNV¤8+Øè-ÞЛ—ÎT¼u×_ߤfç‘ÒyÝðëy xRÃnã9; p/kä7vðòððäMIv’ ^%ÓõsšçYP¥æ#·¯Ï"Ÿ®3è¿vpt4/ûe1õç£<9³p•¢£²üÐÆªÃxïËÆçfXöÛºÖ®ÅÝóþ‚©¡¶ÝyC cÆÆ@I»fIã£~¡]/çî[ï­ ÍÙ¼ððv/*wç,¡ÕÛl=ž}86‹°¹˜2ÜôýáýŽÈ…½Ó“¬<¼¬‚ÀŸ°Bw¢ýÊ›—åQ¾»B°¸páor¢¨ç 0÷Löá®ZïØ}{Úæ¾y.¿ÛsKÎØP¹!0œ=ìß¼Ad#´¡ÊüŒâ‰sT`î½rê¹6)¬iXõ0ìóãð÷: &B… Ç ~‚7Ç@ÒˆŸójZ…$;I øòð›ÛcÇ}â ßeävw§HÁ©çïþ¤fO"—¥ó–Š[åkÁý–ê†Ó-ox6»3q—=¼('Tô~—l™6$EOèF&€–øªÍ% zl9‘Åk¬Å žwéMÊ,4O>Øò–{cËÕéA0]ö„øe;KUU¸¦ÔiØw¹Zï+Ë}oJKAXÐ)jŸß£ûìTÔ“7‚Ñ›á½îê Ò¾­ÜäÑÒB-ùË„a«ñ‡‚86…]L¢Óö“"ò5v˜J*M6ªžù“3 ¿aYC/‘åÅALÂøY²p×€å¬Â@ø³y˜âû³æÈÇël—Ö+åÛ¼†ö›äú×ñ³w£U)}°ÞÂK˜ssR†þ¡XhAo|¤©îE¬‘¨ÖȼG©ã‰»šÀÓZƒ+dåb¡'+Ú›”K"Àüæ!¯¸Íàl¿S!œúÌéßߢhpâÖòI[qH>)ùýê´eñ9)iþð£DvêÕ¸æ,Nz²b ñkúµ™M7Ñö˜ê«:Å&z•Nš)¡ËÚÐs&D¨S»ÃŠzBeo&´”¡x2%Z+MÀƒi%mø6ªÆz(#%Xqÿ^4)„rPU ÌBƬËV{?¿y¿ªEysáã¦Zá¯^ :~}Róóbs¬Ø¬Böà2* ÇYXœÌÜ„’P®ù›>¡Yö1Ýš|4R¹Z²Á2 |O9|›ÖI`ãM…"Ê)5 Ù¬“"ø=™t™)Œ0Ê.çðëÚ/Î@"~œÈ_žšÂUC´«®ºgÊÖµíóÊÓ§‘pèã‰lFèEµSóçO½–|ßõZ¸@(÷Îï$¥X§Æìo^8EqÁ¢œ„v±D >¤S‘Í-2ü\æ¤QM’F@Ï-byø:¾}Å»ÞGôï/©ÑÎÅ`,¯ÞÍvÛ£Íùȶ×ý¶&6mnµ¹Þ-ÌxoK¸U"m±‡jI#´I0~×÷VÓšøê²ž ¸¢P—BA$í+Ì6ÒØ{4A)ø«—1UüŽÁ_gϽvaHYÁðvƒFB»ho³5NƒkµòP‘–ÌO&0…VcÞՋ˃ía˜ïFÇ;¯23Âͨypº¿8èç/óôê<DUÖ®‹*„sÖáή|wÖïuóè~¾M´ú‘‹\xJð£\l& s¯ð”^£F_Þqǹ×òéÎÜ×.î‹W"øIî—ö£Y 2cÙóÀ"&¨RÅka»SÛ(ä½'ryó$šÑE]ÅrwçôV—†ñî/»wsäþêïûÞ,XÈà •M ÁŒó'-È>RdîJü‰åôp?Æ,Îß„)IšÙœî DG£.T–4pÖÙ¬¬íØÝøµS­-^EÕ\oµ€*C}ÿ©:»äj‹IéÎÖÔÜœÒ'5HÕßt2)yðËRvs k›ÿÎd2å$Æ$ØB Qh,ÌxÇÕ9S›?r>〺Ú4Ù¾ñ0ãa¯£¥Àë¥ÅäÏ: ¯|pçg~Èi¼×âwºò„ ÛÆ&Ü &dÐã©“ÛÓ¾¤ò|»üùÎU`<Ú÷÷ÀDæ]¤l¹Øª3Ø:R”×ÚGb;vAOˆª` o÷['6šŸÁë˜'·¦}/„Àl¢¿M릤d!_¹u_¹®ŸA-æ2ç;ûi‰ð(R!Ô[c¿­WîìX<ÆÁ,þÂiŠNãcµ)ä΂²vÌrGcØï x!Æ''Ó‚:Úx≫ž³üw¸ŸÁ#ãè(^ ȼua p時8Be-.'ñÙümFí¶a ` ˆïM26^ J øßú¶·´µ¬Û\…±ûsÈÖ"E³•ª¼N!Ì7U«˜*¸ â¥ÚÆBJåQý+‹ª¹wIœ_œ› J}UßCŒ_«µì8«âÑÂ-Ÿ}Ð‘ê«  W2âÛâEäð_Ík¥ ïqé)ÅÒÎç#0sÿ ûÇïuŽB–ÐÙô¨þ b` hàæ2PÙô/*5UéDbå~}ý…+Ãßÿ7þsþÓ_ç¿üð÷üþÏá?ó_üÿ3àïùoò?‡ÿÿö§ÀßóÿÐù¬ñÿÏ€¿ã?×ÿ óÿ8ÿâÿŸÏÿÿÖóÿþ²ÿþàïùÿ?ÈþÿËþûSàïùÿ?ÈþÿËþûSàïùÿ?ÈþÿËþûSàïùÿßjÿÿ~þ+Ûïöß_úÿ§À?òÿoþ¿ævÎNn†öÿ?úÅàÿðù¿¿øÏòÛ1 ùÿþ ÀüîÃÆÁÂÎbÈd7414âbaf}e³!Ј…í¿»Áÿ]øÏèÿ5èßÓvÖÔŽ×)á/ýÿàߊÿaešþ1(ç×¾N;×–™ã·À—ߢrXÙÿp$®é£qœ-lL_þ>j†…‰‰Ž™›„•ƒëß°acû—‰û7ÜÿîWõÿ—ðŸÐÿÿrп£ÿœ¯…ÿJÿÿ:ÿûÏÿ‘õz}õ[ü£¥bäëùßÎÿý?Gþ”«¤xƒý}ä2ì?Gþ', bÜÔÆjsQ& k³÷:€ܸlÛ¢×÷@¸2ª–®ëuìè­XòÚˆd± Ú]$Š~ÍW‡ÉBhh–ÂÓŸîíðßMxzÞß¹4B-+¬ÐÇÝ?¥ƒøÝ '… e 1éT«Ù»_oÊd³ý60hÆúiЩÑtäßXdÀ'ÃÐhâüÓ‘n=Ò=gû—eŒ=eH~!s70 «lÕ²)è@ìFNbXŸ¥tƒÍ‹ð¶cœt­mƬÇb(lun!+Œ÷7esÄ«Q­úênÄEßé7¯w‘ÁŽ9eÕ ’Ö6ºi¨Q!·S/«°:H"s =u´aÚ(„䯀}JoˆÊÑ@vsŽÕ†?Œ ªßfçS´·Á|+ICï–~›ƒ“®((®(?sPÞÚ# ¸ÊÁ®(0b9!?tº=d„žS—ÒȦH4Bý¡óNì¹¼j°‹9ç&INñ¢®6¶S ’_±VË™ðN¦‘xÞ¥³¸"`ô 飓䊣t1W6/ûx^ݰ $¿D½n&Þj)…ØÞËd‘>° [ñ/^¿_ËŸj¢ôqë ß³¨A#?o—Âe«m ÆiÔnIýÕK{°Áë´ø¶!+ÔCÁÌû TyÆK¡‹³Õ‘TëÈ!+t¢RêÁipͯ!TYÆ ‹ah´”Ô«û­²s)0Í¡­Ú^ XÔk~üâ”l6@nOç…!K!Uˆû8›ì‰Z-ÀtÖ‰-ëw~Ó^‚ô G¨^ù A9‰óL‡Ï¯/Px4|OžmåT@yÈ”Î><‡h¯ð½€™Ä[J éÄáÛû„Ì»}¿zB+è v- 1mÅá,Fhâ‡ûÍ_ë¶Gaå-D„Ëk„Ë» Èhˆ ?¿ ô·GÔ Á0BºÄÔ¶æÙ¯ôð6Å(Îue|-ZæÙÌÇÇ šÒa6Œ§µV‚šcd³Ã^…0xjXŠÉ®Á2{îv*©B/]ð„§r4¨æüÛR½ ÇêÒäߊHÉ‘Ì=³0òm&W9¶•i÷¢MsäßkK}’ì+6ÈöU`ËC@b‹‰÷·½wI&–„ÉYxïúU`Fȉ™-³öM~ÀŽby?Õ¶ý„Ð%5Ó{¾¢ˆÉuµûÊ(òW¯ïSöÑ­2‡Œ0 ùQΠðFè0iç=Ñ^ù_d…Fz‘}v}Ä%’³ºKfnÀlÙ¨ Ó¸åSW*uZÓjŠF„øÊ9¤3TÊ#ª¼k†ÇûEɦqf¼=u<óÜßyüKÁ äÛG iús‚ÆÄ³'ýû‰Í ‹†G—„ìòP†—+³¿ÃÙœ‚=•¿Š?)ÒKË=fç0Ì7Ù°§Å…£`õK°e°ulêV¹Íò õ.CÆñ­!Ì ,šh€jöTÒ|Cz¤’×WÛÁû¯mž½­Û­ОuE#!Û+KÍí²)?/3‰VèŸÁ¤Ã'kƒñh[_¾ùôiv~á@ºq8Û#EØÙ®*ÚÅ’éæxXO†ræÍŠÀx~ãõQÓñ!HŸÀ1øæ ÇÞ™[OPoÅoÑœ]«úäJ ʼÕeLäÞÖdWu<óãÁØ+ÿölÃj1“¡ßJÜ_DŒ9;#ôNåfdñÎ]~Žx7z]`„Ê 5û© µ\ß:(Š ššyÈ?¾ûŽ>MoîäÞ”q0}6õx}»+ÌfÌJÌ!1Ž¢rzX«=õ8x.>T±Mc&>^о§ÇøS"¸Vkv¡™ÖmnµŸe÷=Ù0¬8ל¢¦1¾͸FÕmu 8õÏÌ=XŠÅfUaÀ33¿ëó;µ+¹ÉìÏë0üÃûû–›,Á*CÈå1X-¡ºwE‹!0/GGˆÙëµ/9PÙl˜°ºyi©ùYñ=e¼tü›`æ)0³= Š °«ž/¹þý®´0‰â{#?¼ŽøØaLjs2Q¥åçºOJÛR«£³¿Ù´(JõÕôÕŠ|X¿E {òĈ®!¦¶­ºJ.{”„I¬ÏC·c!nÚ¥Z•W…ÐBYPtlÉ÷Ñþ´«r?oŽ Ã£u§F¤»nŠ5n0ˆñ\ÿ&ù¤A(ÉæRúþ<`ÊÕ¼jÄóŽIñ¢$*;¥1eKawŠûêb´ê,¤f¯Â',‹i¸PÜëŒ:£‹Ó—Ñîi°0e€ß²$$Ëï2 ‡¹œ-–Ú÷<+Œ…á¨6ÉÇðåaOüšâ\o¥}¬Ú_9 iX+®k²÷ Xzgÿ{+%›+Ö訫F9ÃýªS´¿ŸË`…• Häcz6×cãÈU*Ö¢xEsèÞùhÜ}çX]I¢^ß&û?‰…wë,¼šÍÒÿ#EܹPÄ_:ZY=±M6{[2µDqsû{>mÈ^¹€ ‰ÅÈ5]¹nê3ˆr ¾1­OÝøcgùþ²x>18 cžh •ÆOþSõIÇh ψƒ³ÄÔ¯âmëÓ¥½*¦iï’QtïšT7Þ³£b½¥ßªm¼Ç¤~K¿¶#YP±ejVn¸ß8÷þ.C&aë1g²SIe}‡št×Öį PÓÝh_ÈÊQT•?T<—¦[Ìî.váPŒ+Ú¢¢‡й­àSãs3 µÒ‹–Á¸¤‹í•tÊ ”Äe˜{«ðN½üsÑŒy¶äï&BiT1ŒgÛ?M“/ò+ìÝújµpÖå¼>ˆQôÑ'\> ùðRÏ ”Q,×ÉΩÃÔw ú¹¾Àan£mºÌA]Ä¡GƒÌFneé†1~ܦpJ=¼à^‚6ÞnA;;ui3ûÆ Ê ö¦:Ì!À½ Ç»û´Hã»Ô iZkl'2ÏWòüÚ¦/®ÉA°T‰3¤èÔ?„¿¿¼9?’Ò!m@Ó 4šô—ð,8ªÃ<óëâYîfGËÎ4é-ûyeô= @[ÃÏË&¼P¤çl½ýJ.Û盦}:ÆøEQ=Ò:û+rîsçóRä&ºöáÒ€má•NKû|çÝx_ÿ.e>‚ÿLì[Hª»./‘(ÂT=ÓÝË’iý˜VÙ΋·Ô1åiû7˜oœõ"©{ðhÌE׳ G7Z‰¸‘‚ä‚Q²h%[ÍEÃ]° =7£LîlŠûì(¥Z×yœmùU»(Ms³‰¼W¬NZCÃH€e[¢µñ/,¬øÂÁ± YŸÓ­µ®…r}“\‡d³Þ²ŸhŽÿÍM»C¦ @ó«ÎÝÅrtĽËà.^èNÜ>¼äº4Æ ÔÂ3“©K;Dj‚Ö§m¯½í !Àâ—ô³xŠïƒzòìÀ>¿"ç¦ÔÁ åÇRw Å£ˆmÆ^?F}Žqû*ŒVhò-ócNF8ê9F8=Ûæˆ$HÕ`1qj¥¯J0VÙ¾¨Ñ755!—1†œÂ¹¢C ‘®¥# û¬_ÞÔTÃཥPopa%#³©î*€í­”<¿4Ie£IlØGå ™Q¶;)P#S×^ªÊ‘RB Byz¢È` ©BFí¹ç²dêe`ÿºÙÿaI¹÷fö.o Õ*›—'ºX5› °C^@¹‡“ëiš!Q¬“]„—+ù6 ñJUôÊ>7> Óú#ÑQLZ®¨]*’žÇZi^HS …œ†po?´X—s÷¬gÏ»ƒ]¿a7ˆ‹š$(ê*¸‘/ SÛüÛÒ~BÊ“þ™ÎcCípÙEºûN¦ùÔ{4îÛ>¨Àƒ§iísÁDœ1êúÆ£dêïÌ#¿šŽeW1ôÂ"„C÷…½»]eÄñ:é*q0‹ü>¹;ž# ÿ@÷IlD¶Ô½°m‡<óìðF{¼=fé½T¶WU&‘{ý™¯À©‚?A.'ÐC?›®g,rÊÙ!N¹’ƶÔ–Åóè}³ŽD™»(l’͆ҷ  f÷¾5ÃXþ­;võXŸ%d„&XËPÉàÉî#U#'³Ü<˜PkL@Å…p”jµß{‘3#ÅYÂ¥eÑDèiyWQl¾æ§¬Â9‹Ï{M!H“äÙ=O2Ø`÷lˆRë©5Óo·Á‘äîo2>wú8¿c´YÔLZ ~ÅD{”yˆdÆD‚bÖÿZé »Ï“7Ÿ±W¯5ƒyØìú]õøh:›Þ¶áXŸ´ƒQ“¤H’³à úâ[õŠA≧ !Á`'Å„Rïªhéúù?Âåp8çP+N I"t"Ù”BÖ9nìZ_Y{Ý)îÀ¨Fû9¼sÈWá(N Æ•¼“†Ás ÍÏ@t/~+ÉÂ"cžÝÌ"S _G¼èï@®B]œ+äœÏÛM‘ù÷ÿGÊþ†Ò÷&ÿ‡âø\Œ½»å«/(…)ë!Uí ¿ÿ¯ð¬þß÷ý‡û¿Õÿ‹ƒ•ƒ••ù÷ý_–¿ü¿þøGþÿ!ÿ…µ‰¾¾¡­­‹­±…¡³ãy'ð?µÿÇÄÆÄÂÂÆñWþ¯?¸Œ¹9¸X¹¹¸YL8ML _u…ÍØˆÈiÂÅÁÌúßÝ¿¿àÿ.ü×ôÿ?·øïé?;ËôŸõ—þ³ÿ¥ÿü[ûÜŒ@Nö?HÂßËÀ?m䱱ѱpq°1±Ñ±2³þ3©1#å_ ѲýJÈÅNÂÁÌDÇÂüÇÜÜÿЦÝk£&6&¶Î£eg}mŒ…„ƒõµQV®ÿHÞAN&:f.&î×þþ #Иõ_õó×Fç¿Prpqÿ¶ÏÉÅÂò[‚¿¿5ÆþÇ}NG';Gc“?бýžD…ëÁ¶åIÿÿ“;ÿgýgæ`aãüGýç`úKÿÿø7òÿµ€wþ¶ÿìÞðìoûÿnæ¿8UM°¿ßÿ#`þçý?9¯Í†úLÏF-]c[ž!ÖYP{$.ãrº¬i²åM¿^!zÑ$OƬž'Ïñ™ÎÁxõ¾xzïfÿ|¸;wd¸ÀݬO}±_cvÁ »W™â;ïå©„D0&®bsf¨ºYâÎ>Xÿ‹oBq£Æ£Åé¥AßÇߢëÊÀ;vTq¢MÔg MqtË}Þ#•I)ŸßÁ$mùÈ"†¹…=CÚÂe©£Qbª %ì1—mÁ#†­Uí²š­d)†­ŠÃŽOÞboijFÁâ:.†-5<1…FÕBÂ"ŒÔþm“ô=–q†!¡§¡\Kw‰@÷†Z¬1qâÀ:a™F/ת_¬1\ö@ÉÅ6Ì:!t‰{\.`o8ŸÈÄž÷ÈÉ*_ÄÉD9†¥R½ÈYrÁÆPlN †¨y~ªº¥Ö—r¢‚]>¥<">èàFñír ËÔä$*RDVĘóáPu/ÖÞ^ÎÜG<~u} KçÃÁâ=ë“Ä©¢·‡n}øQyú¹eŒµ–¨Þ—N‘Ó\÷-i,åÜ&j†W¥îAW2ÎõÀ]‡û¨AVÑom˜?ù\‡âÍ`[ÍìÀr¶SxÙÏ$–Ýîq¨{31¢²9®†`OÖ‚mMº7úÃIÞ­%ã[Ȧ9znºÚe5ÿõ k’ËN8µ[¸m3‰È(¤ÿe±zô1Ú²rÀÕ.ÔGÃÈ Ç::7A·ËÊà×39½j‹¥ñ<—®ÒΑÐ3(‘§)3®;UñEKb›{){ý£5k)3¹E@Nœ×?ˆcéÐ ^·ÞïÆá\Îõ·Wöð£æÉñÑvþãýG6èùh«Ãeo„Ü-¼Wl.˜ç¤Ø¹‹)"ÉÎö"üšæ-x• ÏJ[rþYö²n/ÛAB ¤-˜1š²{Ï÷‹;xƒ‰Ž­¤âužçŸòVõ¦B^ =b’Ô Ör¶G*R£Zb Š4+g?*ÙíçÇÑÒ‘ìaÝa§€=HcS}"ø|’m=A±^hõ½ØÙ6æ˜B·Ü¡·|b†P« ÆybÃh:½ð£-N:M}G&µ“H‚îYétö­Ô+¤ôRa ¼ór6‡ËEûZ ¶Ùóc?x[>æq╲ñ]º~Svîõàoñ”ËäÏ‹4oòpæäL¡::z¾Úòî\¢¤s E¶Uï¶CξšÝ8S¤‡\:f)å’Mh:yô„º0މ¶¸•Ío>¸ùy9í}·CAáZNb*õæÝf»;pšLº´vêL·@„GÎ_N[¦j)vÜ…ªé»x˜×fîäÇ`¾Wuð/Ѫ×b,›Pè#ì£è>Þ@^ìÛâ¦?ÛÜùÅÿˆ Z§T%kÛÖí¸±þ ahÐ0}HíÈ£…ŸM±C®üúèúè˜e«s¢'êLüÑÖ&ÇËD]ÊÍÉUp9ÓÚ„Ÿ«œµh/bÆhæˆW¾ƒ¯ŒýîÖ¦‚û^²$§rÊ%{0)^4s“‚˜\²$/zÊ¥‡¡›“±hZ¦e´«¯Ðê‡æ¤EËI—ɶ~Ž9C-U%ò”Kˆ@(`‰”mçLXBÿS›ä3÷4ƒxž¥¶Ù>4çægX¡}J;¶«ˆJZ‘8 /='°D[Nƒ§œCÅ8ÚÄ÷®°Bonâ+íYû tó´<¨ö[`^ÉÂ+kt<Ñ"ØÆnÁ{ÚóÕM4›Ÿöw¼wy$‡À–|òI–Êò[g¥Slb•ªÏíñü$ÇxÅÂ÷Üé˜t©4iÖóQ0ÛíÈÁáùz'Z7òû²whgç‹›åyç^1m,ÅfôdÛ=ÊÞFš„T#Û§G >V}úFïçíí°í­;®7$T-ý='h{É!q‘?¦Þl–m'K z_{ss+C †W–Œ{!‘¶˜n½ÓíàYº€ÜÜ+’ãž`ÇðMQk¤û¤3¹|6³žÌJi@û®_lN+“ÍÕ9²wPtq»¬—ž1øuÚïÇÓ#’)¤´Ê&·¿i©¿±­Ìx›lkˆã!¥Qž¬])ž‘:òÑÑãonfK/Q[ël³#Å˺7PcU\æ\Qb²‡‡’( ¬¸YvKªì+VÏÈ…+Û&z”Ÿ¬WÙ %ð7b@ý):¿}@ª+Óè·'Õ»£ZV¿Ç+57›A,1ÜÕ'V¨‰~B¤keKj™9~âáÖ)&̹^9Q¯‘±±`«>Ì+17IN:&: ]žµìN©#8ϱ¿P)¶ƒ1Sº¶Â†JÓ–o¶.?Q¿ž„®¾Á"ó¥§Ö>lo»y_äí®}‰ Ø÷F^ç¸H«ãàí9püÛ%Ü–ÏöÇ `ºoÖšCˆt`v8Kîu×ÿØ)+¾72 ¨®¬Ɔµå5OÝÙû¢Ë¹gÔeƒTkН<åt£kÞÄÁ»~Qà#5Z‡îlø¡²¶ˆ©kÇ»UÍöP¿L½#=ÓùIX©| ú¡ËùáYSiÄ›“×éfb¦øËÙ@„åj-¥·äè “Ã7sã™ÎÊlT®ÕÎÅÇÔ1æ¼(åµé­C¾åP{ÝËÒOòå³ÛMòot¨žjHk+åÑë6Gö›¬ëâd³ ¯îv|y D~îáõ„¼~M9?.ž³h¡ü¨ã6PŠÇ7xxî’jë#MhÿzÇ>e~Æ~÷XIß¾î:dnÌÞŠIÛû PV ¡J>°xŸ[CçjÐroÏ+­^ì€àÙìåšTY™pœË«5.¨¼‘ ™G–=5óIû¤z¢?ë¥GÖ>¡R¾HQƒÈ‚ÊÑ «ÙŒû³èñtì¾zÏq¯:ô´KÆé‘D« K°L#D%ì‰&ª¦ˆ|a°E«xã§ I |„#ù‘´ÓÁ#°Î2{w&u5]Ÿ8÷ñ–{Z@aøobO2#•]Cmlî-êjHéMm'FØuü¢8°Ž¢Ê~t2ù`´Ž,7ø…[L ¸Ä8sÚIh¡½Sk>âÁî™Î÷Àñ펠KëRœÁ%ßc­Õ·0ÚSB·¦—´rN@c6Ãë7µš|´îqçôàwÖÆ ¢Õ•jûðžá|–n³%Ey7ÓŠ…\·ã£FR&Ö›_ÕŒakdÝÕeS­Ò?ó¯^ô¥Úí(Z¶О‡’øZå¤)ÒÌ}a€í+2“””43zÞ˜órîƒe,0{Þ8C×ïv‹u¾ÛJ(f½ìKñfõPø8í)«¡ø† F¢uÀ«€ßAñ½ cyøØÈ×ÉѺ¹ +“Û¦Õ»þê{UÊ›eZæ;Ûó8¯¹áA×p|q2?äO?£oXgªV‹ö/¯}]ZãTVÍö$¶Of—ç&?™4cKnŸüì¸q¢†ò3¨s«Ó 4pלb/Ú÷5`Ä:×\|]8±éÖ¤Ú^.듵¸¥; ß„žó°êóáó\ª·éMEå)ÁHð†ym‹Í!e'K‘‹g9âÓÝ|Cº®Ò ¤j‘ŠÐå`Z%½I¶Ç„lMbfeèn̽]6'fÄÇ(ÏÌ7ã¾y]fPd(¶[¥"ö°’¯¬Cm×ñ5óx0is#ËVLœ#õ«>åK;;°¿Œ'?67G[±.wÂFF¶oR¨¼M|j:™Z; ¼'>4Íùa@"Fd¸ª‹ak@ž›9:2==ì—5–-&±¥Ï8‚šµ—«L_ixŸ×Ëvk™ƒ4=‚6‹aô~5zËšj[ÄúóÑÀçq ŸÙ¯Û“Ï8þä“AÙ¼¬üHb;<¹VºË9š.¹x Ãkõ= E|T™™ü^®Ô;YONåã˜èéó,iÒ?i¤58]pPuÉ¡¥eÈ‹xuA#›ç÷Ö4;=¬´ÎŒMdzټˆd?؉|”VÈð Ì®*‡ä&ÓÞí]8Þ¬»²§VO:‹7·Ã<óì|µsÓ4®cí²ùNá[WjyŸ³bË_ëz½Æ¦™ÛÝNcWFG šíÀC#Æ/‰qŽõ4A壇㚧+f–.ãYx®ªÂÖ5#^¨ðlÎþ¶£¬€‹>øS®Sköæ­$Ò )?m¦s¿ªï9š"ͲîÆ+[˜÷qà^Fýܲ3I`qœÊû긌;îjwØx’˜,rª‘Š•Âjß"RÞ¸°–xì§—…Ù,IÊöÀé4îôJÛU7Ű¢|¦˜ÛjP*Û#sÌ*³ÍM®q cÎÓÜ¢ {¬NôñçR‡Šˆª,Ómõ>š&štº5Lui:¡™ã°7®™ßŠ¿Ü/c‹ã±"äÙíÈÃGi rŸ‹sŒßô|ƒ¶Ò1c(õ¯,ÂaÅ'Û5;— \‡Z†w¥þ¡LM‰ßaÑÃR_4ŽË#ÚÈ$U«ÛÂ$‘–Åö(êcÔ»îô‘×9òl¡(Ò¨x>(¸süFNuÞ WÛK·zRUFHv,©)°šÏ-ÜV@Ϲå‡z•l“õ®ÏRnúaaìž–}GŸHèðưS¤íŠöD]Lý‡Ó¦E>ó( RïÕª•æt¿ï&\ižQœLSMOñ3¹+ðÄç ‡Ýâ5®ªÜmݸ£²ÜÒ‡{* ¾ÙÀçùüôæZÑWKíÞº%5̧#.˜Šñ‡>Ç0Òªœõ¹7 ’Jì+õœi‘†ª™^{;ªÇ» W©×O©r-©e(ûÉ!ûµ/¾½B}JbÅîïŒïÎÍT˜9SƒßËšxÒOÕ«4†—aõ\ÃÛbZM〟­vmÌËL>zTΜŽO_ù/ÝñçœB++¨˜ëG¿3z“^ˆLFÙ4R´<ô·æiúµ¯L´û&&€–2>Åä9¦¬v؎׫ç)g¹ÇøzS\¾w#^ÈkMäm 1¼?ºÝlD]Þ?‡ýpãÐ}øýðn±l4ú]ƒKxN/ŠfFý:æ®y02´üµ;ó­fmòW§CðKù‘´EµYƦ©¶ îü¹‘€½q9„û Eé}7 ’Œ²šÇâþÚ?l¸éöV—¿œÒã°.:«ôFÏâ‹”ÒT”>WäXÕàFLãO ·aÒ,3­Å¶¦;«m†¦G×M–®"Ú*®ùÓN ¶,Ê>f‡Œêõ’áˆ,ɵ”Zõ_|Ь¸ÍQ½^ïiû¸N­ÛçÎ<¼\mŠö,Np)NÌ`¿•™çŒ¹ =¼aÈVãWL-ˆj¥­ÆY<ù –ÏÅ/¹Â6-d­t’#9†9Õç‰Îp ¾à+CGû%ž‰“¬÷Sµuk“Wi‰ÆjóÏ}Rö¦Ý¨´ öŽ9½f·µã#>Ãë"à#QƒuH‰Ž0¼m-\cÝZƒp~¤n¥ —ô ö~îuÊö&}¾6&–~~>/Ì}N¥H`¡rž¥“XZεË.¥ŽT# €‚ÂTÃLH9§¯dk=äúûbÞDh0£ÖùÜ×ñ,ÔÙ¥wc~,Ò ÷¸—j.åt~¾ýÇ5ls­¦kI´½]ŒmCºRÞšnW~¹öÇ=ËÐ>?î'­Éßž¿ÃÏm”jl{4‰…w}o™n0»Õ›=8Œ3Á^Lƒ•ÎO"úÛÂÏ”cg ˆ‰-ÇÙñå({»pÛh¬Í²Vl¶ÜwgÏ+}5É£{·Ê(#û”'1yÃ>'1WŒ×ÄXÄ|Y®>;Ñ¿Š®T×ô6oÅçöèöÝàU-öÞUßÛI®L›™ÄÚ7Z_î¼®”×l£s«"ÞêœHç.%¡‡qìcMG²×süBi½ ~­„¯ŠµvÅQ9¸?kY²aØ =«Êìçÿåž©N™sŒåJYMýÎEÙ5ôã@×}RµŒ)U¥Š,¼ñѺä}Òu9Š´œE6:T¢eИÔ^ãÕ«¶ïQ»<éÖ-O’ʬ’hEª4*³f{9ãÇZm¥@:3Ÿ•ö/²·`f@ºxèdGh0¯ØNTЕ¨ª~ÉŽ<æ/­ëæj?ÉUjeÙŽ‹kS4O¶ð¬j—™ÀF‡ÜŒñGß2@ÐéÒ£Ìʵ¬­Ì/Ha MFv”aÏl 뚟Z;í5îLF•—»)!O„pèGörp$¹N[X9F0T·»ô¹[qU¤¥laéjž.!mV\nØN…\2­xgTzuòHbOzgp®´cTyµ¶üº[|’I²ìÔP°u‰c0Øþ¦Ûf’µG§|líÏíæŠQ5/©ouºN©+tºtAe}¼U.tJbÈ¿ãé›ûJÆÒ´šQ€ð¡°IoœÓÌþs¥›÷ȈúàVƒ}šmžš¢ÈÕøžò§ÌeÂ"í—€NM› –P%.…ÆQ•4ýLV®‡`º0  ;HB" ä9÷ °º\ï ¢Ü€ îs˜-þÐÕìöâûIna ¶€u®Ÿ_Î÷_>ÈKç=oaÉlÖ×µŽ.L²ƒû&Ï"º:-ÿåå‘n!«sE2Ä­0* ¤Í$á‡ÅM»Às¡& HN¾²Ö¹Àÿ-'L§¯]­P¨íT„ˆµÜŒ½ÍŒ/›Ú˜ÿ\ƒ†M¹´Æ"hÊâ³?£sDõwùñxùæø4â^ªûà ãJwóî$4à2«}º¡ˆî¤4àAA Ù­S-Ê lôÕ…«öá]Æ?®ŸHîKªÐØßnYÅ>eÓÎ "yFðçÒnµdÁ4gN$9Î*ÅNK¶(#£…2rzÊh –âW/êM™œ`ô‹4ÝËk ‚wI™ 9,\O˜»aODͤÅHðÑM¨Í¾É[QsSPë< Ü35AbòTrv2¬1ÊÜÃzƒ[DC0AJd 3㔫Í𠇾‰S°L̹ Zú‡eÆ—½ƒ7…Æ?N6±&* LƒmòLÄ[Ÿµ…†?V¦ZvXM"kI8ãS3kŸlGîq¨v{Û´y$bN@'Üó×Ár>VŽ‘¶DîÝÓåÖþÏ»¹÷Sä·q)E|£õk{ò/OÑÿËðÿ¼ÿ´øÃ©¯&öÿÕ< ÿAÿ¿¿ù²°üuþçŸL\ÜÆÌLܦ¦,L\F,F¬œLÆÆ,ÜF@.fvSS¶?Å÷/øïƒÿŠþÿgó€ü»þ¬ìÿ¨ÿÌìléÿŸÿ–ÿŸ1#ðõß?HÂß2xpýæ¿ÇÊÂNÇÂÌüÏ4@F á¿¦1¶·ÿ§Ãx¹~ÏåÁÉÌôǼ†Œ@V¶ÿ™û- ; ' ׿¤1a2±ý+oµl•ƒ‹Ž•™ù•”åþ‚¬¯}åúc«v6†¶8ªøŸœ0³ü1Á Ç«~ük—Á¿{7¬œ¬¿µÇÎü»â7sÿð_ÐÿÿtÇÿ…™‰å/ýÿo‚#ÿÇ*ø§ßüÿÎf§~üãÿ‡þýŸýÿÆœ9°«Zî4õ碼m͈[§Ï8÷%xlÑy·Ìå½Ó2âì\èæ§ t†°ž›¡¥ÂI)”!ºnˆÀÐVeqHÉÁÏóŠÂˆ¡ˆ;ŒôïŸh§²²M.ºÂ·Ї!©’aåéP¾hqÕðÙy¬}ýo}` }Ön³PôD‡KD%K!?ï€ö% AgÆ;¼˜µ) ñ&ËsÊL7ɳÖR=@sÆ"È?(ÝäSwÛû.c*°±6Ü.%ßg¥ÒÕŸáÙl¶0öùx¶Ÿâ º&ð0ˆÜSIìÒ¬–}P¼U\ìÄÛÒÞ–Bn$Ô]`uP¶n¥¹ × Ût(ažÍ7ÅÂMfdo’+!b’ø­ËÐ+ÄæÆŽÇú§œÍZd#_Jk1š,£ U`¥›]"å§òè2 *÷äÙ`hεŒAîf‚{c(÷¾gá^qyë‹9\<„Þx°‰œA¾Õ²ÄË×ħÈwêäcwÝ‘k{®I‘]IKáϱêðÞ\¸ü_:îò½&1÷ïR OÝ[Þ)´û\$BËÛRåA5I]"4…DÒ{ùܹ:Ýs»?çd™ì“Ø×pÝoçwq·{p5tâ¶c½’++Œöz ªdý†$vêzo‡ÜG!k=OñþrÉG¥H>×Ò¬ÂOƒØe ¢ÆÓ÷}yZ÷¼¸x 8‹Ë΂d˜\íxÛÕ§ÞäèËÇ¢pJb}£Û8—žÅŠõÌ÷¬¡Œ.¯É ûè8Ò#~¯•ÿùÇŖ׽ΊÏ1pÈ߉Ø÷ü(ß‹bò²×Œ{­E|wâ:±ÈÔÛkŒ˜á¸£¾EÜê›ÿ˜ÀJèå3_@rƒrr×”ú7ø&©N`ò+‘€Xt£rþû@D¾çãä ”΂å»ïék ÞP!¼¡3'BÀT£â†«¤ ÙéÅ4œt!Ãÿð7Ý™ë}¢Ñ›%s2g-XŽZÆm+°§‚å®Ä6HÅ b0êAŽ5i˜“€¹dՙ퀠•×5÷˜Î`߬Ùí›#†!Ãâ·Äægla³Ç9 SXí߬ ›áš`jöuQðz5W¨8|cË¢†Ð‡R¼è*x8¼›âaÁ†2yÙ¹™ãô‡•ýùV÷‘ d'Ы,ŽVÒè6öà'!ÇÓrHžˆ•“„VÕtä¯úìµÿQnü4´óK‡;s*¹éƒ 1ò+úÔ°Ê??© ÁRŒätdQ'C  XÿO÷E¿gBxíDL˜B§)Ñ­ÈdP^:¯˜#±¯k³Ìóå½,ßå:Äíþµ3øcÓq×6ñz"¤`äè|,E7þ«d£¹ÏJ k»¹3÷žv]›„Ñ{4åoDkj ðZ#‰÷k«'¼ nT·¥QV³$³¡ÚYéÏgÙϹÕÞK\Y£æ?»WN›Ù ˜K™ ~‹ÒÖ¸óÓ‰$ÁmFÇ&Í`ýÈ}u¬M9eÁgg,4Mx•a-âÒà†ö§•O0ÇH¦ZÝäã¤d±\fÃrmyÁ‰´ VMýÒ]¬ÿ¤Î5ƒÆn¯§˜Fa²R€/½«]Ì^…p^WRIƒaïáw¬¶¢ï°ó~äD¨ãþÎðryúV¢Ñ[¼a rS¨0}UéÔ‘9žzKçOƦ4Fñ^éÍz?ÔéµB¯…PQ€fvޤè¤\/ŒÙ¥b[­›ú&˜Fæ¹¥·ö­¹gÔˆM¸kZÒPmqݾõ¶á_ó²S  šVãÀítº\ÛWé’$Q-ÄCynôZNçâ§ þDx1@8Æ-_«Güï:¯&39ÇFØBãTbíÒx J…ª”ù4›—¯u‹Ù`…FVÁ¢!-P1Õe…ÇÅ~|ãpèš>Tö]mÈërÚt°kJäÐo¸ßÿ‚ÕlMäD«©¡B‘ϳXóÌ(»(ê‡ü6w,Äܶø“Sz©´§TÛ¾ÝXZc- î²4$ҖЛ¶Ê|èÖq´ÅýcŦÄý5>®“ ;†0Õà®ú° êÝ—#exoì"ò†)ñ›DbŸ{Ò×añyÇQJV{å“ȇ‚.7hOéÍÀïÐg2?UÞÊW~]ÕA.Ùó·âMÜêi’@vI‚X%Ü{)€Vy2‚pÁKp«‘Ãu‡ñöÊ. éä´]_;ƒ6E^J ¨ò·CºJïlì ›s¢¢…·'–PÂ=«ÈdY»<{Dz"=á+ßy› §ß3D;ëkÂapWÈÍoO¯ÅÝ)‡ÈÇЖQΚl„Ó´"[ÖÞn{42Ã’®Ë€¾·o}îF‹¶¦Å^Øtý% ²Ê•ø$ ë€;qéxS‚øÇvIdå¶âÅ[û•=žƒ n^X¹ µá·Lº]ÙJð9泂ë‚÷8K †<:Õä%Ò2´²h3×”ìdã\0Þk÷Ä^•úbÔ‰}s'ßU Q!4ܦÔ"ºÓóöºXQ¢‘ù¬\üßE ¦åîuÕÆè`ß&¯$<Çp®õÃvXæNCé9>Øgæ‰iÒ[¯•)袸#[!ss@6kˆÀdZÑ* !¯­¤÷ïÆi„®5ÇTòe˜B¬¦ô¼8ìò¦~›²=ጩ`c¨ ‚oBŒ±*gÊ'”§R²Q9RÇp)`K(%MAa/35;VLŠ)±a{ðÈLÓ%ÉE®¹>À¡»;|VüUœû¬ñ‰Ú‚UuÍJWt{Ÿ £+ü·!${ÏDôÛ{'Ø×'M]Q㦻8ûÓd?…i„ç÷é2Э¥{ýãd´z÷zݘϚA‰ImÔŸ÷Æ}H`¸.Å‹Š|‚½Þ H/¥B×»·ïg²§5g%XÛFé•…h á×;?›À°ÿ>À‰«w]=7݆1U¿•Ö q¾ò áqÿÝîšèê¬6ûÿ°¶@â\Óg§Våñ®a3Ûƒ•Çž®¤u€Åb‰@ O¢æâÉ¢TËKE3õZ‰I ž:¡UdJ×6Ž–æ‡J8w˯&ªW#¼JZfߦ¿ waA@dÊO 4Nkg³ÛÇ^ŽHNà¬ßᬠ=íx5¢€ ?ŠlØ0ÞÅÊÐáÎÜG 6ûÚØü˧rzz,L»á!Üßœ¶?¥uxɉÓ2t€o%“øW-ó÷[×ùoàÏÛƒÝâA'²g8.¥+ú¬šÂ>;±äkc¨!¬Õ¯Ni½©cv”Þ èšE0 ÿ"\§8k¹!NŽrÓfþé|Ã~äQn˜t­•¦;òÆ¿™¢Ëä~¥Un žò²-Ãy«N¦ëJ»C#w½kVf×gØ"¼]n‹m’v«”FÖÛ°#ìœ=MÁæ¹9HYÌ!ÄZ¡#.äíå;CIï’ UwœäíÙäÕ§mJ 7Û@ZKñÆÈJá9Pwì:%êÑsöö[n=ˆÒ?¿²qïo¼»°0š]ŸŒÈº <Ò¥ŸÚ­]1ÿaÇ}v¹qû-¹[е&½"‰ïld3%oø´…j=ŽÈo½Ë‹jL†ïzsx—àöjçy‡œaòÂvÝ_·À “Ž@Ç*8ÃyËcíËŠ»ý¥íóÎ9ñû³üL”~ˆm€soÀ÷F“ÊWЏû€pI„Ã&fØ^áW’LãK7XX?ôýt*X@_ä&©—Ý*ˆ¦möu\é zKN[V]Jl·¶Ïcù”máòŽ]«€WÄ÷Êq?*Á@írm£ÜìkKa‚­{™Pá2.q™÷g˜ö™¾Nƒ*nÞ^­à’κ¿j:>…Ý\iÂ6©H¤8«KA0L>Ý(äöjxóá@ž¤‘5Ϥ•1Y±uiåÀNɪÀ|{^ª´ãdÓaNÐéÚXl«y¿âC,nÈŸ ž÷ƒ¹…4w5ö‘º¹ù· ÜÐlí'/æ· <Òs$téâhø1Ï’Ûè¯é?IdÐtz£,†“Aq e µó‡‹%¬uM”2†{SF£1Š· GˆéPj—…Y)‘B„óJ2$•Œˆ~ù¬±êfîHMO{„ÔDþÁ+.êê®¨àŠ»¸’\Ï]A↑ééÉ̳3‰]êg¦º»^½³ê½ªzµÚ8©ø½m›ç«¹ø™·Ê}<ò‚”q5Kgïýå¡ ¿{qlͲÍû^žûâ—ëï]ýàS“Ú®_7áÆóW¬Ý–þÄ-9¯µüÕî g,[¸ùÔœéKZŸÊú#Ùš:¶fçÅÏ®—rCƒÙÄ;¡qVÇe{ÜLÞ´æ¶” Û7ÜT´û“ÖÔ15 kLĨÆùæÝÇ[n›szãâŽwG_pÚYµçìÊÜM®J½8ýZåÙ–£ßî>¾êÀÛol~鈋ۖ½ýÇÏξ´îH{Ãw{—Õ_~ONþÑg²/yÓ4±éÈðÖý .ÚwÁ+Žd´îö£g6´b éaÍù‡žl¸dÇú÷O?ºr÷gß]—±}â³…¡?÷cgZO}nÏ›“v;'ï<ýxyÊõ¦w~=s§çv=?ù†úõG'¦^zíäÛ“,\°ýøßgÔ>T‘ºûÌaû3Î:R½qÌNÏØ]Û~)%»ã¢›‡íÿ¡´pþ}îþöP`Bó„9UÓ²GÖî[WøíøbêÈêU “f?±x줧Ɏ•ô”/É´NË>³ö–œÇ+ÆÜgå·ïH+ÝÊ}Õþä¬òSÇ]`åF¶~6zaJ¹çˆã”ýéëñ›OüéÇe)µ©ç­_k»òÏv݃i“ÎÁÑ_gòg¬§Žüú”ý7ø×l,¦G²g^µqÅšš–e©µwŸw_5Ö|ÕËS;>¥§ìÌsì±+ïØ‰†Ñ¡Y_ün¸ùS~üº¢ÏN©ùzÌÕíã<첯ž™¾eÓâö%³ËáÌðÍ7ޏtùåôû©™Î?45§Õ=«|Ô”ùi¶Ž8ËÐrhCûµ¡¿x-玻ÖU]·£ñß¿-ÿ}f¨~Iûi3Þ|ÃÕñåîÙ«*jžÝÿÈ–,ÿÞ:÷‡PLJ?¼>«£ê´Û?ªOgÉCV#á6¿úÜ?&´¾úá¶%»nÿtØëÁcvÍ96¾™µã£Þ~yÔŽôŽí÷?{ø²¯‰£õàæÏ•è¬Ï;aŸôÕ¾ƒg»ã¥Ç½óð¥Oyj·¶~Ò±yËŠ1SþþÏàŽ±»¦;íèUÙßøŸ—?{íéOßoº­Ñ<:¿ÓnôFΨ«.þüèõ1ôŒ·;Q”]fýøñ×7°¯„Òš#|â?½QÞÁí>'Ê1¸iò{km>úÏOã6±S©©{Æu|ÿÌôkË/«8œwZíï·Ô?έ¸§—¦ÕÞxbXΦ-Åþ§™eÙ9{G¼0uû±™­™¼¶xwZÎòSn{÷ª»‡¯]4êš?ÿnù™µÿL™7Ü9eÇ_ ™o-ã?)ÿ/ÆC÷^rÅ÷<øHZþ²ïV}a ºøÆ†ö¦²Ñ=ÅõG¯ß´×}¬ä»?ûîªmg›ÿð›zEêÁœO|i·ãO8 HÜØ¶öŠŽœ¶Ï‡µt”´µåå³ö “Ÿ±~kÕ´ŸR[Ú&q,ûжÝ:âo}ü¯ýlí§ìW?óeù…¯ÿ®»òŒ1ç¶ÜüÍ—÷V·—Þ<…4üXE§¼zup¹;¯ho¼õþÃ+ÆäL冽O{µ`ý¾Ï?øÕ¦öo½ßQ–ÆMÈ™ÎýÖE<ýþig]÷œçšSïª~Ï[m-¹ßŒ^w ýNWpÜã×o±Çþ·s¼ldVÊ®ùÓ¦}`;cùCç¶ßy]ÃÚm£÷¶YÚ—¿½¬øý/´e¤œóËÿ+~ñ½=þùw ¿ò7ß?²rß–Z=lgÖ1®ãßý”2qûÄkŽŸ>ñ¿(r¨/Í…¢Žÿ'Ñýoúý_š5ÿ“èþ7ýþMŠšÿItÿ›~ÿ—&EÍÿ$ºÿÍ®ó_‹¢æÝÿœ¥ó_‹¢â?fNþg‹÷ÿé÷ÿjRÔü·$ÿõù¿&Åh2šæ•1´¯Œ¤ú †Ìã8ÿ7[Ù*Y0[,YÙÿeýÔU‘ùÏ1 Ÿè½“=¤%Zÿë¬~&@ÔYu¨³²s9áåƒuV†%h?Kf61\¬§B>’†Õò~Á%¤´ÆN©èeÙL¢ °!ì”h¬õ"-ø”:Áþo›ÃlGößæ@ ð¹Íf…&Aßÿ©Aq¦/¨(t/­,%îÅe rÉü²ÒB`È4™jl…&Ó÷ñÝh¶7‡ÑA’'£L¦¢rƒ+͉„Çåôîr~ž‡ÊÞ"Wä š'h>ÓÝÂàåx¢™¤n®×qA‚Ï'ƒLfNNVn¦µÉ“ã\N+0ŠôÑP*‰ÇcÔ—„¹ÓÿE~×UÉÐ"q)‘üšHÞ/T@4BXF4zâ1Ù$¶g‚ÝêIÿDaˆÕ½çÈW¦`‘rÓä'½~$:EàJëŠbš ±`OÙ`…PGtþÙ-œr¥-Àx ç|(Ãh_š”|k@Õeíãýù¹ÂhÊýPÄ L‹Ad´bÃê9̇ÒtCtXŽˆQ u‡Ô 8ýPɕІZÕ“0,l¾A MàHŸŸŸ E¹s î ˜ð‹XÌyvKžÙ¬f‹âÎÕˆ¯HÏ4h DÝGCSžÉÔÔÔd”­<ÃùTæ5ÍI| Èy£‡–öFÁÑKªA¿NH§àð¦È±K°A¢ÅwšD,`•ˆ,"½4Xc k@ ©çÖäñÿõõMŠšÿ¶ä῾þ£IQóßž<ü××4)jþg%ÿõõMJ4ÿ…Ù[¤#QDCO¹¥ãý=ŽÜ%ŽÿØP:„ó¿Y6³=Ëë­øÿÑ¢ žøOl¡BT  h/1¸;(ï€×éøŽb<Õ¹Ýiƒ…ô—[¨"(D…1Ñ!¢®J%|U!$„<æË“;û{’§cYèî‹Áäß €EÆůV‡CÍ#)(¶‹Ž0¨—i‚£îepÂ5 %náÈ ø¹ ö¥Æ]n…EÞ¤%¬ËñgŠ—\IT‘ã[âc£AËðÁ–M40¦n: ¶ž›hxÉ ˆ<’` É"ä'íc"‚Dê ’Y°'B@Æ‘c4^½J£`ÔtXç·º*CŠôQd@±,˜‡Ö˜Mˆ´„},å‰@Q Í4AæÉ!žaˆŠü„™€Ñ^?ÃÁo° Hѵ°ˆˆ'-yyñ¤H`l`œ‚š1S¬4uœ) ƒ*uo= Ï3Èw’š®Í¦!Ôb?ÔrÆÌâv¢.N½m]q:^»î‚£NçB^îö׈p–Ä„ó"|A5VÂ’Ê#7ÈÀì\Iƒ‘Éèú¢Ð)ŠBFD¡…h$FG+ÅV!l ïKÆÄU'kOÔ‰aÑ0±‹¦©¬QÖ$Ñ(ˆ]ܾö±RqâÄøwIe) Ä}«`+ ZÚ ®j‚‡Õœ8išAÒ< ñæ9‘”EY·0WTU—1^a=Àex(‚DŸÑöIÒ&®À1¨oÍá% µfÙúA³¢‘ îØ ®…wP7Tê3ZW)2ŽXŒ¦’ƒ„WVðf5Ùíý@öT„,E:‘:Ž2ô©´‹¢.2 Ù³úWÚÃ:=@lp(_*•þ‘ú…ašËÆKp6âÞ1´ä=[‘÷˜„ÖÒÒGñ!¡üg-6ä\Ðߥñ*†áûGÒÅöáŠ6svÉ´çô= C s ®bŽ TótŽ#‡³à¤®Ïh]D£X@”#€Ü Í!x5¡sµt ,=r²å™öì|Ù °(žµHÆ8Ñ Ñ|0Ñ]è5+:„¸rUÍŠK2;?RÄ4À™èS7·Bö¬Ðâx´(£¹8¬i&ƒ<Úq#ú¹ɯ¥7ò›¯È¯¥Ûò ÄE1@K†H  4 r&‘¢ÏÅMˆô6¢gÂV:Ž ¢¡ ú"|£Žªh$m½Š¡¤+Òf¼ÒhIzÒF£ÙP¯$.~½€‡£½'ÄЙíòZ†(•– î¢üEØF~ªÞŠ R}#% …–Q„¡îÄöð&R?‡P)¯,B ]‚Ì^ T8XAp$‹æØ‚¤dmK\Aò‹‚n5'W,`¼!´ÍSÚŽoÈú~i%z=y^%=q!+Ì7úµše±š%n0–vGp±Ši’6H‡wVŸde,rǪôaDãòÏa½Tib÷("ÚF– ÈŒáí^÷1¦ "Ù±¨;#q´}[¥‰ðwÏÐ;2³HºÔo)ÛÏ#öxGö"Zs KDVçµTµ„D ž LÚc­FXx.(qÖŠÒ’õ$A4«ão×ry=<ÐEµ$Ú’Ÿˆi’EŒZšî–Ìé‰T3²áË >9H3ô  †Å™¤F’Ds‹)Þ† òL7X V×b„Ik£d®FÙ&:$X hšd Oi/Š@?hÒ‚!¯N¼êCâ×ÁKá Æeô–ä/# £18êAO £'†.z%W6wŽŸÁ4*æêiW ¥¹ñÓ'Wýhóº´Õ i­^ŸÌ­ºjã¤A ïHè•Ѳ÷Æh‰§7Dƒeÿy,q‹SW¤ª¡d¨º±P7WæŠ6 öÊTÙzbªä \²™²E›©îâzÆ-aPK&c³ØækˆoWºH%ÕZ£+1'y,w1ÁÞ鮣(ªÔ`À1ÖŽÙn°2<Ó?zŒéÉêÚX¥ZÏÖÉŽ þQª—i–Âj(bàê%•GAQvôʉ¾Ž¿f÷fØŒKd'>õq2šn ¢i}¼ì¶UÖÇ’¤KNvág?žtÉÚ‡×þ“ËÅÊêÍX Êꢛõs’<04Hdž>ð¥ô1¡ÇcB샙?ûñ +þÅ~Î…R㑻ńõÞOåyXøÂiŽÂ™‰•̲BžŸ³âéHì&íJ“ö¸MÆþ4Kù4+~o ¶EØ7fxg+U§¸¢ª°> °!^`J,€£²€¢ê à&¼~š¡ Å26ˆlDv7ÑÏQ>͉ß;áT8Ë1>  Óá8”®ÂÅ)æ–÷3(+”ãɃ&t7¢‡p¤©QsbƒÎU@çÆ €šRwIÅ7((_ j ªª ÊÝKç 7.2ð)eD¼š'ÀR$ìQÆAëŽÜ×Ç„l1‡![Ìñ!/.ª*,  æ—–•º—†Å¥îò¢êjÄxP* ªÜ¥…KÊ ªà`SUYQ]d©bCUÔÉb‰™€Ñx˜Ü‡à{ :Q AKÁ ̯^ îj•AÈÕ°¢«–xº # ")”3cIò=ÑÕ–èqKÐ%•¥ û¥¬[±Á*znI çP>( áº^‚ Äs‹¢å–nj¹EÑrK-/A‰Ò»ÅjCQdKEFÅígX,‚ÃÒZȱ ŠŸË µÆ†pí¼z/i„ßføø¹±A*Šm‰¯ØÈJ8NBA©ÆhÂ8 Ù ü{§%<4%‰*æÀߘb«è³%7j¸°*gÒ88AIG—^1œÁ5íÿÙ»€&®­M˳¾J•ÚÖÖ­8j[-*f’É$AQQ©ŠU«Õ’@¢„`QëŽúë«­>µVÁ÷~Z»PZ·¢HÝk}" ‚[ÑZc‘ºQqA}w& ‡Ü™„a‘jÿÜ·xÃdÎ=÷Üó{3÷›suQÈãu( ÿ¡öè?ܺpçþbÀ•˜t%Ûv·«ÖQÓºXM­Zp‰ÅZÇ%¸ÍÀÝÅ” ›¢°7Ý™ž€±´žV²¢gÑš­‹€1íRM¬Zǩű¬öÖoË{¼\Æ/Ü\¬h(C²‹fÍ®Œd[vfS àHâGÎm*¼H„à»ü]"Æ/u9qòß ^/%yó™°Ý®rÐ7X§‰Qc R1¤àäRÆÉUŽËô½_1`!o—RèöµùPµ‘U%œ°ŠP•QÌgü^À‚Ç‚° u†…¸øHô{Îf ì~ðT©ÌÞ5GCuµg0NEª¢Ÿ¿HU,HÁ«¥rÂYq”Äö•G¸«TáZT•ÙÜVyl"Ì‚4xÍDX~;ÙÞfµÇƒwùlÁ‘ žHãÏähð)Zì¤UkbþÛ›åöTc4©tN–‰Óîh9«rÑh0†#5j˜þ×·&K|þÏJæmZÁYÍÉ þÊD˜)eAeu˜ËÑt„ „°+ãLå2n2þŸÄh¾´'/âŸ2e€w™s¼Û‹^iŸæp›*eÕQÉthò"&—Nu1켫e/à’?2?*ö¹ó¸‘gc5VS‹}b„ËÇ—áŽ/Ç—Éë°ÞŸÈ˜É;˜üË ÜßäàQòºÎèlkÁàŽr|B—ƒgÉÅåYó¾ÁºXµ=xuuºLaó,aÒÁ5å§ëî"Èq=¥Ss°)‡•Sx—À åÒê,DcvÙ 68í x¤œ¨=ä¬åàrY-ŠEÙ‰hðgy ëV˜‘@U®­Á¿åøCwø¬BÄQÔ^¯|ë„jñÃÏÚgÆS€ï+HÂ1$U­û§‡«"ïJATˆ g1>=T¹Ú€øæ0¨À1¨ * ŠeU@e »#lŒg#Ú_m¹M" e ˆ/ ·& >{)í 9g•¢ì*0ì’¢*ì¢jÝV)ög‡„¿y“gfÄ4"A#[æ@AU¼+¸æt ä| 'ܪßnï© ©œÆª už©¼ªUN44@ãÆÁ5™{®ê’ÀNAU?$HP³3PªºaSl€ã€ªØ…U1;AUëÿ €¬TŤTÅ{À¡ê - */pl`9 j= co”#ÀCáàŽªºÁSx€µªðÃU1;ÓÄ™BÀc%»b"Áý¥÷&ªV{FeàÛž`6ÀtèÖ%à<,硦]›‡ãR/,íÁÙÖãB¶ »,ž ˜$΄ AÖ… A‚äaBX‡0 =,í¡.v&|JŠûðH–ÏÀ5&ácPY¡ÉOàpNg2ópšH`:8Ó¦ªâ×À‘œÒ „Åƃÿbq¦Á…²hælKÀQ@U|€T,=€Ï™l›ZÕÜÉa[€q)Ç“CÀÕø´¨Òø´»î$¾ëN®;I F¶£eu¢ª hßÍAvc á,«® OÜN>iŸ°ßªuT´Ú.†3u±F 2ÒéV–CáŽ$+½j8±å2±°89îËYýo†¬Nû U[~üâ ìö}-Ídßfb±nq\¶öQw ð}v³¾v®¨æÂеSœd5nÖÒ2ç[§ÂFËI ¶ªb†)œPeÈš˜š Y =4@â¤H¤Ü °¦X€mûq hBA T&U8_€ɲj­3ïæ> 4Ò A`N9$ÐH¡ô!\¸ ¨Š{ CÎðhêF\{U-bªbЧ€d9µSt”÷¯¢€E¾N…Ý{T­µ¢ÖxRœ#Uëâ¼8.©¨’¸¦,á[î$l¹£*çÇ1lº£*~'¸1¾å.†-w1¾åîòݺžèjk.†úž>®'†F Š þ‰?I¹^óÿ.Fcf²»˜Ì„!а…-v%ÐÛù)‹(ðÑrÞÀgÓû+£bw[¢&û šÌÑ'­Æ¨cœÆ+{Çõém=^Ñv²dd´Êc@ËÎQ"æ?¬§4Fö C«)´`ޝíj}u“ÍÔÀ :p².‚k{¦S;pd#“X9ÀL” |™Ugw+8:^k&ÌÌw« ¶{óÿ#G±µ-ô(ÖTbÝ~—G-aG±6Ô7Ô™«áñ"XI4AŠü¥´¿È}檻Ծ8®ÿ¡óÜç¿4JqÿGèü÷ù/RÇÿÑ9ÿÇ}þKãÇñ„ÎÿqŸÿÒ(Åqü¡óÜç4Jqÿ?õüš’HI)%±Îÿîøß(ÿXÍ4¥Ò¤Ó+•L†h³Rcˆ®×á5=ÿ'Å´ØgÆ_*QŠ}þ/•ŠÝÏÿ£<>ÏÿÏdÓê—È-ç³ôºX÷–@ãýP£Œ8d»„‘šÆ.00øÎ;ZOŽˆpô=qOµ4ÊYXµ5b Ìv…ãx&cx›%Þ…þ¨3±™åýØöƱµÎ™­T†QŽ ª ®2,D9H©äÍÙ)´my-kÕ¼Ð|Úüw;dÒÆ®9Ï“ p˜l¼Üp›®4F‡¾< Ó{îj<–àÔÙ›e ˆeGqLs]sHb-DæƒVoÖ1Àtš?ßElׂµ±ê&ï·sÑÉ£±k.²Û_OƒxÁlQtâ [$µn  ©ªj¦ b>„‰,¶YiløðZQ´Çw‰mó+ǤÀØ5‡´¿Î°é¦¢ÉŸAÌ13p‰Í¦Î€ˆ¸ˆHò}ÆN¨ìŸðgŽ)„QÁ.;äï­}–3Ç¿QoÛwŽ97?'‡™cÂ_TÆБÙ¬¤c`|3üb]€zh]¨5¨­ñÌQ(Us>â`‡4¿ÕÒ5@ï‘èШ ! c;6ÊÀö‰ÒĬ…_-ûowG§µ¾mâ˼f±–z¸!–X¥12³p«YãþCL8Áþ…£)'ÃqÃiJU™¶–šúò«êP¹aU•V5\§¤)ó½pÂŒþŸ£§Crç†Õ“¶ê¨V³üßðÒx42;»åtË5ÝÝ‘Uyˆî`zÕ"wµ­Õ*δ*ÞhDªS k×’}Ñe*®*žÈºN‚™70…ÓX×^.3äÌ¿}±ØäŽT3¯}úÕFŽ0,1µaqf»~Æ83«bÍé›Î+åV¯£a^&uá’¥8)›N)…U©aS5F&Çaíôâ¤jn8½˜a6 £Uœ©VvÌÕ,Ämоh¥hâtKòÌ[°[( 2vÍ!£±ð7!d8O|ìä×j¾G1ý/0ÎH ßÉ$å/¡ýѪØÍ(ú«‡çÿjÑ#³ÿç>ÿ½qŠãø“Îø»Ïo”‚?g0J‹¦œè×¼!–9žå¹+•ÑÆˆ8­Ÿ^-dŒD"—ïÿ0'jÙÏ—Še‘˜B¾àÞÿkŒ¢Ib)«T¤‚TDÊ©¹„TI#Ät”Fñgëç.·ÔÿqÚ¨ ÿ¤ˆÂñ/¥¤nü7F‰Œ0i´„×5ÆfFÊL¼‚VjQ”3O`Wó„˜ìŽ~ˆ%Ýišr¯²ãR?ü£ŸnÚp±˜¤9ó¿”vó¥,Ò¼Y[ÃÍC ‰þ-÷ðð4üÍÕZú-ýÓcøð û´i’––öÀãW¯^J¥²oß¾gÏžÍÎÎÞ°aC‡fÏž¾þàÁƒÄ~çPí óȰQý~=åáAx„ Oø¨lý1ÓÉàU‡.*Ol86û«Ù{Ïüzå„*uIŸ—·ˆÿÀÒõ;}çäV×åa©-½w¾™ÑÕ«÷Áœç4›®xa¸ôÍñ¯Üò¼'»<#½Ñïɲ\BÚ2ñ5úÚüÊyGï_Ï®¸ã}Á»Ufÿ1–óT¤}ñÁÀòÑ¿eþ;ÜÒ,kF¹§jjB\ÌiqçÞ×OY’†ö,&;[^Jþ¦8²I€luayê•÷ViߺóÈàöeëB ÍËZl¬¸Ò%`ÓÅíIq{¯&D-Ê.Éù¹ãø— δ3_m{êûeGšNULº±ò@îêÿú\Yß»ï$i‘æAH¿¾C®¤Ñ)÷&æ—½¶çð¡w½Ò÷$K=sš§ùõ}뙀KE»e;6”y/»7ÜÐîªV0ÏGâÑ|uº>ó©ôÌ„¨Åeýºx¥¤mÓË—ŸTôžy¸8¦ 95ZyÅóûw>.»>9®óÛ¢cg¶Þ:©½¹°LÕgÚì&Dùÿ=«ÿÎÓp;µÀo¾v-O¯Í¬Tn™«Ÿ°ÓÒÔ¢Õ£·zœ.6ì.ÍùE_ö£tÒä~ÞQH™g³¾JÙ¾öÝcW22þðzÞrÀ²¹Ä/¸CæÊ'¦F­þ²$yñ‹»ˆq³?ÍEfíÛʬ™…Œ9!eÓ«dKžK}wÒË”»‰!–5çå=(eŸ€Ü”ø}Úm“p)Ecšܤòéô¾§×U÷.HNw7¿ó­_&~S@]ûä´ZIMܨðìYÒ%ö˜|ÿÎe¨E-Â&UO»áÕܲ4ȻϚ’a3úŸ÷>ç%Ž+^6ž^ô|~Eô£ÃN¥›R~jÊ–åå?¥4:çÐÕûݘÿ{“Rϰu·žV4.³èâ·m‚¾yÍ´&D[ðoßfÔXEZôCÃâÍÇ×¾|§ûïÆ9^p*35©•E;^ Ÿ5ëÅ •wß©7¯Ê-%O&ÎÙm)‰IùÏ¢Õ|ze>=ë–ö^Ö¨E»ÿöŸÔ#¯·÷¢~ñƒÍòiʨ?2gš7O\½|b^é…Sªc;öOñÚ?>Â2²º%^TqK´5y~þÚ¹ž™{ç|‘41o2Y¡MÜضɹ/ˆœ7,­²Züêsv÷W¡kFìjµÿ­§³R ÷œ:?gɸù ÝÓÖÿËÂÈß3ȱøA_ºcbSÓ{Ó¶§'x7½æ÷«—Púö¹~iá–yÚ7è”M?[üjЬ¨ðÝO-ñY—Ÿð¸=iô±ß6J÷»øá”VY÷7÷*Û«œAi/Ñmº½rþÄ€Ö·ü;¦ÜÎ¬Û¥?LgdǼ”÷ŽZ2zÐÁËïœëqÿ§ŸµÁÞ»æ0W+ŸzPÜ™*>ùù æÓ‰Ù_¬œk)i¢®¬ W¬š–W:O|ÿÄä )­ÛzmÊÿÃÿå/ÄÉë§ççöéºu—öG°\»¡8 kN›½;‚U­+§]>¾léÒ©g“}ƒÒ“´ÿøÞÄ;s&/õÛ¾nÁÁ¶»÷ëkÍO¥¦tKÔoÌ/\xhYþ¶ÜÏéÎÔÓ7· 6]X›ûYâÑáÿ`p1§¸m—ï[ÍÿÙrYÕ:³I+1n¯\5»øÜÖ§öÜ|»çèÉzËŽ‰û.ž3'”úÅ”|(k}¨x\;dç«ßv=°Éû´Æ;zš,Ã'gì„aÞ«»ýSyö26.PÏ­ó\æG#S–¦¶š1þþ¥ñA?-Ê›=±ÃŽ-)…é†)^«2R7Ž$”Ó'ºŒòJŒ¿·¶çÛMœè¿ö¶fÃ]KÛ¥ž[‘ \?ªï¹:£ÉZ¿ó[;¶?µ&1·[bòîo‰¼ñÔ’ sC*J×ú”ožuºÓ:ÿ·.O½6ÎËg‡,wº³ü¨~ÂÂ#'FPÛý÷çC?tŠ:³iäRŸ°#'ÞFmì ˜y&¾ßÎÞSÍ_wœ`^U™QxçõMš1×ÕM†¦¯Ì+•œo‹¬µ~ÙÍÁýÒ-Ò¡Oü~öü~Ùr­(l–’!ZœtèÔßCW¨×e\2ì£gŽËy&¥¨WQéöO zÿ<(óó˜Á¥Ò0ãù_¶_*ú¤(âïÍCFµOZa~«hUÁäfqSÚW”yµKÛ;âcݤÞó^|߯ÛÉ“Wž’ßx‡ž4uéò¶äÛ—ó fÌ_˜¼6¹#ú¥ïèÅ´:=+ÉgùʳÈÃz_u~eàbVƒ¶ž—ÂrÛ}¨Ø^X¤J_x0uOÙ$‰¿©ÏG›LÓÑ%÷)Æiæ n½´Ãò}íÚç„ôX—eùüv\ûã#RôO=÷e›õd‡åO.o¦—Ø.¼®]7wAiPôÑE+çÌï2fEúg6xÚ¼p[ÀЏ£–e·ã.—$Œ5Ì]09˜ZbþÌ„Ãã sæžÙ6[>~ÜO ÂŒ}º%­º&ëlŽÛØ|}‰!)-®ŸgFðEÉᘎFË3³%»<Mù}fÁ¦[Rdwו¼ÜµHkÈ_°#Øœ”ÝæÌ¼÷›Gí²_š*©²A{˧Óç—Ói–Oñk;n6í’õîgûv?»töF»^x)tC—öýç•Oßv5§å¥¹ôž­}ÿÇÞwÀ5µl{«ˆ¢TAz€‚Ô@è-ô¦€…. ôZh"R¥WéE”. TPD¤K ˆô"øí Þ{8çÜ÷î}ïû<~ççúéfï)kÖÌšµ×žÉÌüïèµ$q÷k(jb[“„N ¦Iò]Ï–ë [õD¥”–»Ï+í$J¦&Îj¤ÑL§Îß7²¡Êéj6ž­^®tËܹK÷eÕ%05»r„„>F2ª v¢w&ÓîºßЯW ³ R(yìö§UOÂH¥ôËN­º@*kLuûÞ‹nƒ‹Š6gïòç8Ö€òKÇÙn¡¾T ®ieÆu']Æκæ&•«”TE½9Ï…¦Í~S~¢öµ¾òn‰Ö)çð*1.}sSn!;˜’Û}¡#èñ‹³ºJyõÙòÕäîüa³» Éc¶¬×¡tÓUûl¡×8Ò›oå…=;γØeØû–*Xp>—õêA¦6”ÎÐv«íT¸•gwœnƒbòI([GšïLüÓÇ3XÊŽÈ §›aXåêjÿä1GúàL‹®3uá@¶Â’å‹ã/µm" :Ün·ž/Ÿ0 ']˜ÀÓ°E—Ms”h¿~8Ý1Ü=@ óòÞÜ–¿Æ~85kkÚ®Ùîæӓ1ÜÚÉÈÚá+tŸ¨ÂÓ(ë°·«KStïΤß'ž j©~·@ ©1¹»ñÇSoDŽ~ðÈ$5¤d`" ÷i{ÿÁFHB¥Çh ÛݨÐ9©û¬r¡?âÔ‚ B[¼½>!«!7ãBA[†ùk"]¯µ¬ìuWJ»Ä¨È¡A¤*+ÆÞZ¥%˜ ˆ]Ÿ¶'Î-l=1wŸ|$Äšs¤€®Á¨Þ‹²ðKp Lëxi˜éšHÑÈ’ÔYj«]Ò0èÆê¼#´&*iWz±`µúÙž@…õ-„iæ$ÖÊÝmÌáµé¡–Kk´L–Ëd¶ t»vs°¬&é¶ñð=¡5Új‰BØ•!ý~D—ƒxÏî&ÊÄ ~e¨Ün~-‹Ê»¦ªxðn‘£Áð#Í·©kØcÈöi­‰jšªQÞá‡ÁºéÂ/Ÿ/¸ôíä:õ?K"útÖÚ:-4òzÛ©ûeø‡¹N÷‹÷5@j®]Y9KÝ­n±,²´ë%Ähx»BkW V­¨ÞÁFÌ$4¯QÇÍ‹rHvYÆåmuïVæa«Üm¾1ÝË:{"[¶C¦Qþy"Žá~³ÝH¸Ñœ¦19Ùrtpi¹&ªo"í9ßËz¼d¼Ö‹v)܈±ÕþWïý®f_qº•óvøOÝw;oCéš—ÿþ6vEï(ÝÓäìÙvy—·õEêZ'7ÎÞ¯AèGI—^(”`œv>"w¼Ã?ÝìóMìÄÙ9Û¼¼÷ø„½+Kd|Ö÷­Hw3?åz¸Žh]\¹Ž-cyc¤ÞÁTæ,¡ŽÖ)‰x´¸º®h·=ÊcêX€u ‘Ûq ÁœTÄ'¶¾pzŒU_£-ì>BPn´2ÕW˜¿@êNJT'á—y*jów7h)Gàð1 ÏkCF_^œÚ±•1šjwjÿjõöj€MƒÂ˜t`øE~/Þ3 ÇŽälõìsëm^t–Ï‚°­EŽhìi‡%mù®àsáoPÆ¢ߘa¡ŠC,b³L‚¸+k%m™U|À“ÑGßöðÀ|” öʽne,¬AáËR?‰ˆÉ×u£~›e’¦÷%儳2úòÝøcýªê ´U°lŠ5Z‰ Ï …‚æržªÖ]uAÑ %=Rw.)„­Ü?y÷*ò.¡Ýi™’9Øv°à‹n%'#C•ò;Œ 'R³±LgåXs¯;w½1¹a˜Öø³²ÊêÏás=ÝŠÇã­E1±Í LÄÞD8ºüñå£ç_%꛷̦Í&Žˆ;<2ÒÝlY¹šQt5<éÊñ>²ûÃG@JólËýëJ`¾A|ƒFPÕ{4"3-åkÛk‚Æ+Ù·0f‡û;E8x3ãhCTÑ«Aõ.“䉅 åx²…öcâÇRtÄ>Þ©¾áíÑ~ÂÈtÇûè|òõÒY7"Nœè[šÚa²¨ÁIIÙÊ•áarÌIq¥,bE5[%”èôÌФüµ*ö G Þ¢DÜ5ÄõK&ÚO!Ї•ÒÂX#¢É«&äæ3kõûí"Å& 1Žb3â.à/ÕEã3Ù¹Á>D¶ß¦ŸÂ8é0Å#—Ç›BŸP2·/³)¶ùªºrZŽ„vÜ…áîøñ”ØìwÒ‚´’½Ý I¾cv“é@ÀÙ¬¨#«Óxg+øó&®Å|9ÉžVÙÓIØ7*»k±‹×j˜=`»ªÿäVÞ¢ë{ vÞÇ«•¯mÛÙ«DÆRÛM~®âÏ멺é]Ä_ Éls¸“~éA9à}ª`G]ÌFމ¿´}3@ýÚ~©í__ɞ̟'‚g=6Qé+“&Ų(5VV[›mçOƒú€R)eO˜ÑÒ˜ ô¬¾Çª·] ì¹o¤ŒíbãÃßÄÓçÚVèÝëÅz¿®: ‚ú8¶¥Û‚á­FÝ`Ä›K™6yÌfc½DšT0ž¥ãPû6¶JK¨5¢Iì`žÚàÁ%ÅlÖ œ<“\RŸ#œÁûÊ<û ­Žü¤Â„îÕ鬇ìh€ô$çÙ~zCÇ6=ÚÔóÇyu©e¼×ò •é`ÁL)Ç[¸¶°P£“]Á‘w=aâL¢‰¶’ Õ—ÁSO>ñðe7˜dˆ0hj%_nf˳ôy}'ÿ¥U—¤ÌTYeźº…þ^@ …¿¿]¶<ÏËYTlo=-¯“F …Éö)¢³`e+£“I^oyTú{3õâDÔqÌr»æOõ´?Œdãì(˜ÐÆÈͰímÑähIÍ%€;Úèä 3“ ×g(ä[›‹ª’ùØŽU½7OÙÒzâhåߑ$»øV|Û=bßH©EæS1^=fÝHi!©ê l|¼&€pXñ¤þ9ƒxáÚ¥•Ü%GY9}\\m€ tuiØ~9¥çÅîZû ¸^èŒç2~ñ‘&5š‘mR°“=Û¿—ŸZú„à¡ ›iÍó¢üÁ#KUhP{a õøâ£¯^2Xß™ˆ oÓ-n—·ihDõLºFq(ËT„´)?Còi®íEDÜ%Û=Bze:c{ioš¥êŠ1Ë?Îóü$±ìÊ-Û3C~ŸžÜ²ý˜–~ÃæfE-uOÿÒÔâһʇïåRà¬ö΄Ÿ¬„ÉãÆ2äÇ@ì^ž½iUâµÔµºtŒgàš5 ÜΪs0Ú>ãGtŸðû“[‘+¹@ìudi&ž˜óøÛª] wø¤ø¨kÌ×hõ¼¥ÛÎOÈ_S(OÔkAr^°GÜší Ó›¦oŠ|ecÛñ˜5o®&VMý HÑ’„çyM´›?ذ³¶‘ø°­ÑFÌÖ^ÍA˜>(¹L(0üXù¥áq zÍæ€Å>ô·×I x¨kÚi•îZil·Ë/>è^z·?Íânµ\6.Çwãæë(Ýš4°è"“›ñê¥Sè·LÜ[YUÎx_–Jß…¿Ñ’ Þ›0ÙsœZN›ÞÒÁ=½­HÄJvV¡ËÒët“}YbK¾/ޣυ ñó¸%Eo“*ˆ9G˜¼|óóÄЀH6ÀµÆ¯ú9S¤„¸åj"-¦ámTË}Ñn *,+êS”w¾|žj ‚ct0X íKrdC‡ùìªeœ6|’Ð͹^iâ\‘¥Z Åø,”kf„ïBnfîîã üLeB™qcEµ1É{»—C|‚R˜lŸÙ”Û;æï*J|°x¸ Y 6ù•kï¿Ý=blôlzÉ‚ ÍÂ’S}¿œ6ÌÐÁ"VËV  ºyÝöøía·g‹gÜWi\ÊÕ2ÇÙóyÜ^d/D¹²…H.’24¾\—ë¶) ¤½¤h›š6yfèéT©Ï«Å2m9˜ña¡Å eݧå Ý9ˆ8’צåj«”ÂÁÚI­&ÙnSGÏNí¡€V¦—>ÙòUØ®¶L°Ø…u@êòßÈ1ÆØš ËÉ×=Â~ ‡LoU–_ªe[%µ*Óe÷ Ó¾J½n¹Im8‰V°/‰wâ[¶åƒ5¤ÅP¥˜Çv¡m¸òö|lm^Û¸Hï¡è#*;q’Ϋ2÷B,S2½4` ^HÇd—{ê7s¾äJª–9èE˜?ç?ÄŒOà%°…J"ëN/8½I׺ì9sÐÓÂÉa#Tn†@ÇCj=NÔ ®´ÙÀõ[¸Ï‘$ ƒnX$·þ É’V÷üs­UrCÐ#U£’ާJõ1 БMÜ>p¶ÿH=%0(Éx6ñö툿áY.JgÊq8Ùaä¢ÑÞR®‘v‘î[{¡ýh¶ª=·Ç¿M‹ø ìó¡MÊ"càÕÏVÊমa¼¤o/^‘\&ô°˜Æ$c FbþªHžØ¸w[«˜1ˆršfÉ FK7†i@3èS;Ê Ûµ);Ë7DVGÁ‡ˆ¹~óˆ)cŽK_~52?”|M;Ÿ¯]ß9ÖàB k±™ÍÌߥw°)­gãh;½&:)úý-å\ „sl}¸¿p%®xöä\fVÞÛo=aìÚ± ú«CÇ È¯•°`n½¼"î¨÷éžyߨC™‚ý[“¤† 'o‹1ÅÉd­ÐöÑÑÀÕí‘rÏä^·>©[ñ*oÞðf ®¯ “ijX¼ èðàr²òª‹62V‰ÏCoÏuÏ7]O€6Ö,ž[«oë‹×pâE]àròôª 1rg‰ó˜?^«›´Ï^~u$Ít`x½jæÉ%Oªª‚‘äp6®mu ¼Æ7†„m-4Ð$oxý†ÕÓ²ƒ|·åE4w§ºÜâöžEE¡œáRÇÐðUQƒñ—âüà¾szy¨¼µ¿t°˜M⬃¨×ùbÙì®a¼­Ð¾ÎäJÈnGË:#u# Â)SšPÌÆ­}U¸yAÂ#Œrü]¦ÎÙî‰Îdóí”­³âYØ$· uóšhì>>ÕÃåÀqsõº&«I CI} ˆ2íðÐ=í°.&Ë1¿6B ÿŒJ™N,ݨ$5$“Íîƒ7¦Á%,±²¬•Ö}îÈm*1×Û¶>6¶øt€ûqºË‹fÊó‘<Öðæ¦þøÙ¥>›×÷nîÜV=e1v±È•,qW½æÃպµ¢²Ó¶¶°†g©µ gDÂ^(ʬ֦&)¬J:Â8J«ÿÅ d­Œ˜+›}DÑU³$þè#Cæá±Bn4(eºýO9‡^›M|#á§v²u^w…a+;Ä-ñ‹&}/!JšLÊûõ ªÓ>¡*Ts}âÏ"ÓØÓµ—µœ¥Îe ÞÍ3yKeh ¯#ɿԮ®‡(‰òr°ºÉ+”3ëè-͵h)¿ºíºÁf×ó´óMê†qélÛF¹,f¬ H4 Û´4KØ/sëCÈC¬iÀíÞZßy•¶Ý£”!»y‰;c¦$—¤úÄ£ïW§[)ÒÌ&’ào”+ý¦È%…„fµýè’޼봓Ì4¢Wµ-Ý% Õ;“ì*ú"•Eœ#y«5œñž¶ÄÇJɼ›¾Û&W޶_aöO‹3ZéæNõVʶ|ý$uPoÇGÎûù™dsêOGº%¤ø¡'âbgUå¸òœ5¢pIzQĽuÁÐdÙò €Q/ðM¦ŽJ m.ïÉ42ë¹ §c˜ƒõÝ‹S0ÌU½¯h™¸Í5 hË…9y‰f b(‚-³äì£=;Þ~•åF…ªE_óËéÛ¨Ó§EœZ£}9»³ebÅeP²Æ~* áÒ07 çYÕ³™tTF‡æÊrd–ù%eôÓ zmð¸£È+DñÔ1vüuÄEoÂßcì^*Ž‘)=%'_ª¹¦ LOñ>®í°ñª {‰ ©?ZÔ)g„WK¼ÿ—®p/B˜K\”ˆHÊì€%¯Ð£2Ôc(É[XÞ›T˜ùË/u+ºmòÌ«ÁzXë<æÒ(»h·ÍƒbX.q’|óÔ¾í-G’¾pUòµõÊÄ‘ »QdÁÖǵ ÿåf½+Ã#ä+FSkrïFlíB·Ït²JQ¬îó¬¿Ì©Ÿ žÙ¡­š‰½MbY~¸‹Î. ï©’HŠ÷±[½-l0µnY™ø`k7xUo?“qœ­¶¤@ĨKÛË`ãÝ!ÔR=ð½²c¾ôåG×JPsºZzQ‘xô\ye«£ÝÇ¢z)EÀX»@ö2vœu[óÅôxÿøò]0:r¹•Å÷ÆÞŒT:¸¶›‚ïÆÞ…<µÕ¿ «Rü=ò´;Æ”»Š—°¡Ô2_èÇ2Ü9™öé;n˜yXÜý›ß9”åüÓ¢îÓEÔF§SÑÛ««ÙîÂËÍ6cØ»]A'ã¥×XÏ£ÕÞÏtÀ·¡ÎvEÆ{Έ=Îë2ïh»(JB—˧>'Òùº1×m›T8²óŠ×ÇŒé{'üá¾—ã *{úˆŽ:¯•¡Ì¸5 æ| —M¯gï-WNúÄH´Êd³ûy¯Ãa×j¼I¸©ê;Úu5­ûæ½õnßS­¥G‡?¢cç˜Ô$Ç=3b>Q÷Ï7÷ ¥‚›57m+Öl:R²ƒßØõÍ~"€ÞA‹ŒÐ2ÓòºóÔ•,K2ˆ*£çè&¼ÞfõK¥Šia³½à–LŒŒ‹ãbFÄ»3ÂKÌK[cÅrƒolC÷¶h¤fÕèï®k¼“Ø,îy$G2šø1<¨!øá´ž†ðç[dÞÏ[ˆ¬ÞÂíÁ.-š¦Â;·ÎÛ(¯†˜èkî¤ Š{m°Kk­,¢–I+`†Ùƒ¢\ça¾±¯TÑ5xdVWøC¯î£/w˜Îù?Ä´žŸã>£q7 °÷ ÅfËmØ{î¼jNB}†S ñ8µ­~<Óò`^ïM§Ä›V˜:l ÅícדV«Š”àm h9 6ç"õh˜>O¶Ãø`/•7¯BGVW𺆞«SQ‹M=qÉà÷#º\»y+ƒ:«‡¾ÜJ?$úp2cÃñøþMÏëq/ã(.Ö¢7¨:<Õ(z ][Ë6!'êƒèËæ õ.*òu7Þà¡mûÍ5l8²¯ö?­t´öÑ#¹dX뮘Xç‡èûh¹jð- wÙœé`ê<ñêÛHª3‰¼.’錅µo Åy³ðƒ8¤ožJD‘7¾åŸÑÞ4íǧ}¡.Wu¶àQ½Tú”é ç~¶°½ºÍcáä@¶™®ÌÆ ½óî Ô!7¥oÊ!ôSl>‹»›ðÖ+¬]²ÞÜ©˜“EÍ„ðU^$·>üðô®3{vÝ«ö‹Ôþ§.zèïLÜ?áãÛð,IÛ~š»üXœþƒbY6¸†BßuÅqÅ•Fm¢R:w=iÕ±uöQ4ù~²ú&gÉ»Yí<¬Í5Cd#[•~•çVw*Ï¡ u°:ßçÑ/cÊt0»ØøùÙ,³d3_j†ǭ׃‰ÑjåãõRõ˜+23ƒ”«ná:„7[  A z˜Ÿv5âyåõd‰×š’ëbJå&h–…Á—ÅÝÆ„OAòåχOhŒ¸v sv'†¥0]·7f˲-4,ÄZð‰]Îöê³¼ö~[KÙÁ¸áã›Ö®ùÑïŒ<—6*^é:Ñk«ÃR<<^±^×. r±¼Õ ¦^¹{LIø&*qŠ#³Æ¨oGº¼.|+gx§³Lî.j}b^T*4yw¼‘“3Ú“I·>ž£·â·Üå/U*ŸÙ¤mžùÌ›5¼ÖØ¥kÁñ*êeþl­ªzòn_AsÁ!Cý{É5[ÊÛÎ&S Ý“Ž¥ããÝô»×C¨¬Ö»? yxu¨ôÛö4ûå²¢œ<üÖ“Bx›ÂÃý+Y+VæU-/cw,Åä‚se Ù8ï•Y¥BmŸ* „G“9š¤Õ7 µÛ(´63m¾":ƒ­Ž)$QǨ›£ ðÚ4GNž _Þ%\úÈXNÓ¶Ý îÕfPŸçç¯CÁ³ãD3J$E—ê,Ý^*ñâ©S­?—¡ ¢î;4»ãA‹­šÇìÌc/&ùÍ=¾«Ó¦ÒG>‹-FÔãyôÅFqeûê™Ã: ]EÙï°ž§(¬¤Ž…ejÇGQN`ºŽ`Þië‹9±ê &?9æM9AøQØŒ_F›ÎZâ.ãbKÒJ.[I×6*ßþn!Ë5á8Cü/®UÑa÷# ñ‹Î׈Ôg^c竪(0NÉôTÏ+Å|<»ÑÀ÷&ík@pIbž #ào?v#6¼+•¦ïêYW€}Áö×R’I¦ñ©ÏˆcÏCh«)š(×õ0âÁš$<-³¦%üª±µ™#X*Ö˜4Ž üX·ì…“Ö¾ é]?q]eÍs9…Δ͉k>r¡®gì§$ MþÒ,Ö3.pŠq–ᢚŠÍŠ|ŒæsgïÐÄØ9Çhœ:Xxö6cwò2¯=Kž‹ýj>lþü««ig¨BF" ßYs¬ÈÊ Þ—ïu. ‰—•¨Ãé“$õ5ÐÔª0·mà™ºÈˆ }þLŠî§:¿B Ï/ËPßÁ·>.b¨3K¾ zkÈ=áLÂ#ê}·ení%¬«³¯±W\¹ò®/V\Ío{OlóSFkN¢¢üöË@ý(å†Ã<%„‹!ž¶ɆY`ô•yaï"Ñüµ{ìq¢ƼzìЇkÉjsjÐÏ-U›z°¬²`¿Ü¶œ77ŒøVSfôâ”Sñv—rãôÈÔ»ù 2ÚÏáV‡­Ú«¯í&‡Õ/x:›…×yk`p댔å5ŲW¯ÿu+~ÑŸÑÁõ¿üü7a¨ð¯óß~ ý^ÿÿ<¨Èeá§1elŒ4wÄ-ý4³ý77|üŽþÍýßô/´ÿ"ðkýç!ÄÔ n"`*`n.3†šš ™˜!ápa$\nþkÿÇßœþSûÿ·6|üŽþ;û‡ ýîý€þ²ÿC¶ÿCiÿMO@:àŽ+ü~\ á†ÁA08Œûžɇäø“Þcæèø5—ŒŸ[P$,"Ì-Äÿ=—Òö›\¸ƒî~Óó¾í5ááÆA¨ r À…¾çµàC„ÿeÞ” àÆ– ñC¸!ï¹Møü”רìëF‡ïe ˆðsC„@‚p 7þ=·`.R[c4ÊÙÜå`‹ü'8 <¿À^Pè§Û+óÚÿ¿·áãwô_Û¿?îÌßßÛ?Dð—ýÿúãþ<ð¡C‡9ö÷ÜçK.þ€ÿ¹ÿãË¡C_w{HIIùùù311Úßö!Ÿ(ƒ=tpÛéÂo¶}Qµîð¡Jàv% ÅÂt³Õb -’µúw{œ„•ÍÜ Íï¹LEº¢G4¦µ[¥q—ŠÍ)¾¼ž·U[Æ'›<—ò>T»&S“4ô0©ùI»½8YÓ“ÏòÀ¢Hž‚cmõ¼çªbàGÍä>%/P2nÉt„¥ÊOò‡ŸœÖëèt&W¾‰*l)BúÂhºËG¥ƒfËVwßM‰7z]_—É"ÏÔ, ºÒ±a»âÕXÇ€Ïg?œfv!ÆEiRhòX¸|vj¶-Ø·j<íÜm®D0æäÖZmPMd|üž¤ÙáºÜ¶#r*roc³Yžÿœ̵0^q4–3•={ØsÕb›¶·í0ݼäðØ¥NÆRZåtÌJÀUèN`.B~deîÀ¦ ÅB5c?/-Ù(u5JÄGKsË)­Ó ?ÔNtF5‘ütNeCB%‘XN6I»¶R겂l]áÐV“”«l”…È·É -<‹Eà\¥¡+7Ýù@©«ëÓ‘U]­äJåêgT±þ^f¡Lâù7¾nb*DMôd‚Ål䢫ÎÏžªM¿,¢¹¼³S £nŸtY¾Q\¦(]/=©UÙMË›b°vBËÓžD¤ªôBZì6N)!HZ,Äú©¨U/¿Aéó|Y~õ+¶û\‚áàuÒç“ZU¹—LïµoïºàoË~Æ¿f6+£,3‰¿¨ó$¦°vÌc·ì"]ÌÐ|E<³òÇÈ÷Ä ð²4º7õbclŒÈÊH~Ê?•Óá}Ë;ü½åÒÑÏHG©­Ûõâø]f‡hèœ×Eu磱ZŠ-î]iŠQŠÀ;®ªÜ ‚©ôüýe‰J}‰.42¦Kü ¨¦"_±ÃϲßÍ)bRÊ'+ó 'òÞS”…p–_¶[ÝÀã–¯‚2i£‘§n—ûß°––ͱkÞ=6¬—uº7´ÅQjò©´l?k ÿ™ŠlÆ!X„,åeCî%Ï¥ g0x 2hç? …Xe²«” ÚH¦dÕ½MpAß)4¾øÒÄ5JV ‚ÙcTzÊeZ¤Au<­|J¢ zv·©ö’mÎ×½ba¾ÙEAÎw²Koݧ¿I›¨ì…÷>—’H×»ø™B˘+æ]88$§QH¬iu$\iN•9¶~–Šå_ ÒóIíFx-÷”ò"L¹‡¬ ÂÃdÇç~¬¥ z"&>„[R°J‹ëixû`ß±¨6F5àù¸Ü”ˆÅ*ï•Ð÷®–ðvãúÄÞ6‘k_ÏÎeìͺ’ŒS/Gêê|83èY8)1Æ“ òºÒ{Q„|Í`´q…±!YÝÁR;mÃq/=”òü©JΦÑû”_ÓÄ„Ç2߈òÒ(ñ`ÿ8{Í-÷šsظÀkj^¸íPœa}bX˜F!ZqÃC0‘ŠZ Pêi'U.¾D/Ähp1„&©ÎƒG=Fšq¡/UËXEŽÐÊÃ'{$3°‚“W¿>1Iä_ön9U7’m#$Gú5»–Ô‡SmžµúÌo&+3¤xñÉ y¥ÜqR>›¾F;µçëÇ¢5!å»{BUóêÊǦ½5S¾úº&ßQGKÉRÎ%ÞxÇéÆ>ÈÑ–r×\hV{,[}cBÛýXk–}ü)>سQ`!á˜(÷¬ºÆúúÁì¼¥9¹RÙõè÷4O‡ž×0".R)SÅñÅù­Ly3¬›ƒM¤ÔžˆEÞ°»ž8ú.æ62¦´ é÷zðóÙ&Úv†Á&UP‡ 7Q½ì$.þ5Ãkͬ),\ÍÒ@lš¼v¤·†úÜ")¹ßKÄ4+wËC¿k\œò¦k±t‚mнwŸPð] iY¿XÑÿì´Êí„¡&f›J§@ë/+±:«Öé\Y·ÏFO*^¹ÄTG®ºÀ•ø„fð…·îM‰$öÁZu› z6ª<‘ԮȪ«NІóÓòEú¦¾vàчVî`'åO›d7YØ£7MØ#Þ\üð¼YQYùP°Òýû=t 4àéî§}¥G!¬X_¥ô¿~ó¬åFˆ¼“y1'%W-ô)kÆšª4€dìÉù‡†¬—Žqn:ÒØñWó@hYtß¾ z°à«}]ùc&39¦8ÏÄîØ—¦ò†™ûÝNlÙv&p2eט¬%Ò{\7(ïÜ‘kuukooªó n-  4r´ù,Í„á•WšKgM’”q>m‹yÂÍ*¬³ép~$ŸSAë%ÎSœÈ|’ÞM~ÏhîA´rDôuü üA›sµB°ê¼l*NcŸŠüñóvll¯ô:»´ `)EžXçª27޹Ê;ÙaE9w” ŒkJ«=öDî×N©n…ù*Øäš5¸ã1ãçNH êˆßÉWx¢~ãu먥áÖ€¯¢™ÃcYÙ±Þëàôý ·¬8lxB'›Tó”n^IYΉ, A²±ì:¨¾Ô#mS¹ñÅaç…´6ôµ‹î#Ðýù"Ί؄ɗÁ0æØ„Dî¹°ù{¤¡9³ŸÊÏžåJ,R=(µeTb¼”’„^Rf.óN¿§Ò ëàM4”áQ4M •>Rì5±™²uRèE:#áJA[ ‘¸…om@ä‰ÄCy¦cµåúxç Ru©ÆiÚÛ‹n°Ã_Ëò+” !º ´¢Ô)ãÆ4î͞údùÇŸ-æw!ê5RÜ£J5qLpÓG§ »§zÚFç}à¢" Œ{â–_E<ò,'Y¨ŒŒA4lÙœ>o|à{$³çÖû ÍT¨•®]}‘úùÑ=·ê#­áÃ|…ϵö–>zñZÛI‘«ÆÈœCi‚L6+ªªÜÍ6¤cl”6ÉÅ‹mùk3U?’fMWPmr2xïq­…1ž²ílÖJëTp9YŽW·“yÑQ j¯ÛHîl_%¼t¬´øKmˆ¢¥äçN_®<>yÀ¬Óÿ¾Š†^úÉi÷äkºã5ˆ;2,â=ç"?ËçÚ‰ÅÀâô•.Í=çzѽ…÷¡í"˜æâcõå±FÝÊ#Ê•u£Ëä¡ÓïéÚ¥ÀvÂä$1Cv†þhP&íá¥Ïr²¶BňFf«¦àWlõc€qÕ2q(án"˜Jó¢OAœ±’7?9b2­Tæ† ) ºxt•D{ô8ÌʘÎÛʃŸ²èY»Vê>ÆcÊ$äb!L»‰—•B.%¨Š­*ÙsÓdäšÛ<†J¶ôŒ¦™ê ¸”ä'Z[“|OÄTs*½d™ÖË«/„ +d ý7€öÚÎ9:[žxÆ^3Ý[fR³)—$ôqŸÐH²Û¬œébý%Â絣¦“dÚ4Ñ’àg§´_sö×»ö†´¼rê=³Þe@² °Üã´È:û:X ø°{~ëÔ_5¡ÏZ¤¤†6„MzU 01g°µõóUPÖv‚€ûɱàO鯊ñê˜?^C)f©5v4áÏ*díD3ÇŽÈ‚+•îP°8i„´ˆ ËB(Ý+…Yî=‘Bic±IÇ@I¥€^KÛ8F 6=œõöi‡Xc$wÔΙHOƒ!ï.¡t¹{Ám³Ü);‹ Ü…uJ¼\ý“^‚jn«3ijJ®ÖíòæÄðÊcƒ:Ö˜ëý'qù>›lª;Ë5"1–dL%ö¨a6¾âCß³eš`ˆxð»ÁcêJå帥Ç*5¥âöµD¹³~[jÎÛ?§–3(Îj??·¡j]ŠwüÜÛ4&Fß“³ÃUÁ€ƒ49f•&ƒWÆÂkésA¤ËëÛv†üÊá ¹U©XÁ‘„˜nÞÂøö˜RõRòÆy‘]É.Re¹\¥«ø¯w}7Žô*;/Vcv¼¹ý¡£7Ên|¬¥W½¤”؆‡è•æØÓ€½³ÀûîÚõø,0ù¸}&ŒfðxDD|ò†°Žõ  ¯M)ÕÚ:÷ó)år UÕï­Ÿ(ja&Ÿ¹ñ|}ˆ³'ïjJ)‚Ïîþ~š`öËŠ™œ˜>ëûaÜÔÊÿ?yœÿüyÎÿû…ÿúCè þ"üß_ø¯?„êÿçÁÿý…ÿúcè þ"üß_ø¯?„êÿ'Âÿý…ÿúCè þ"üß_çÿ:¨ÿ¿ÿ÷ þÿýCè€þÍ¢óÿéÿ‡ÐAýÿDçÿÃ~éÿGÐAýÿ¥ëÿÍÿütPÿ?Ñü߯ùŸBõÿ—ÎÿáÖBøœþ!¿Æÿ?„~¯ÿ?œÿް²³Ò1wAóØ}ERß_ÖüŸ•Sð±þW*Ù×?Lÿàw~",ðkýï qf„¦œŽîyy’ŽºèüEY5e9 ßeA9>>„âk”—_¤ãlbïb…Cî5±åã“×Àºí­‰£ÌM’âvæh ŽÇÜÉÕÊM‚EÎÁèÈ£ãéhÎ2ûú$Á‚6÷@ï÷:13”‰³‹9ZÂÊ҉ðàx¢­Ð¶æ’0çDAêûý¤f…ƒ3ýšâ¸¸­•½ÍAÃo rf.., gs[Òº§­¹ ÊÜÍBr|+—`(n_òo°qÌ<< ‚â™z‚_Ù}CœãáÒ ­Ü¾ƒò9íãÛ±ü¶û[È‘p›'¾aà©·_¡óΛXîÏ‚¼Aÿun” ³Êó 9\Ò¯<”¾Gý[ŒLìíp°ŒÈ?2úÚ¦ÿÜ —où€ûÿ4ûwÜç?ŠðU».ÿK[SÛ?ÊñŸðpÚÿ;-s[\»üS1û,¾¢*\@òÏÞ‡û#Heåþ¡Qæ@O·s´5G›ƒlXƒèÛËsKñŸ‚™Ûþ„xC ÿúü'ïߣpsƒp{4\‘Vö– [[Ð7° 'w‹;JŠ£MLq¦‰£¿ Äã$z2)ù¿”ï+H¨œ‰½™¹íWPqÀ\‘ÿ78ÿëšÿ³¾¯çÿ·d‘D¸Ú9îWï·éÔ,Aì&vŽbH –´½ ú‘ÕÇ»J‚ô¿ÁÆŠóíü˜Vf‘ü-®ú>’ë÷$:_›½Ÿþ·ëðýškžÄó`Õ÷ƒ¾ÕÝwÿ÷«»ä[å]\mÑ.Ôü·ˆ4ÂþÓß°ö›Að°®Ò çÍÍ€O¹o~ù­9àoóÿh/Wû¯L¾%qÙøû5ÛÞ¨¬=à­þ¦n‚ÿ_Kr°wh¸Ú逬¿Þ @ݾª÷¯ó†VöÀ0Áœô—xEàSAÛ0A›ü™Wü{úCè~qÎhw—?õ‰SwûVõÿÎþm¡ÐhgôÁ7ÝE+{4\düÎã]2q¶ÂIΛ8›ØMÃ刻ùûµ ð…àû/ýÁ­î;J®û£Dq”3ÈÅ c.Á"€›å@"nëÚŸQ‘`1±µ²´9[Y¢Ðb@´‹0è”üçô‰ƒ=Hø/ãè ‚ ¢‚"¢P„_€|`~dêùuü}¨ÿ×Jã&’DùøÜÝÝy¿Ïê88[òíæ¿Uõ¸¸•%ÈÅÙì÷Ó?Žö–,À-Áò-÷ˆ èÔ ‰´5g™:8#Í%X'½?aðu†Gœïk-€ ¯•ŵŷɡý+ÉŸî‡ÿ˜ÿ51ùY~ÿø5ÿÿCèàüÿO´þ÷—þ´ÓŸEÿ¿Öþ:hÿ?Ñúï_úÿ!tÐþÍ~ý üZÿûCè ýÿDëÿéÿ‡ÐAûGþ,úøµþ÷‡ÐAûÿ‰öüÒÿ¡ƒúÿ‰öüZÿýCèàûßügÑ¿°À/ýÿ:¨‹ŸGÿ¿Öÿÿ: ‹¿tÿ ~(¿Dèëúï_þÿ‡Ðïõ¿ÿã’™ ÷ó,îÌçý„ÆÆ–Î&ލÿúÿÿðMÿ0ÜùÏüÀŸ_ë¿AáfPaˆ‰€…©??‡B,`&ü0!ssb‚¿è¯£ÿÌþÿ'èÿ½ý A¾ÿ!ÀÀ/ûÿôgøf@O@è êß·0€àÜ‚p(Hç†ÂÿãÀχþãº+;sç¯ ¾!À Ü‚8HPˆŸ&ø$fþÇìJhmw“o00!nP0 áàøGVS>$äO6-]6A›¡–ß$„„¸®‚ÂàÜ"Bü³_ðÿwôÙÿÿýῳAa(`ó¿·è/ûÿ!ôGü‡Ã½‡á}ÙÇš:ßüáù†ÿÐÜÜLCãx÷î]11±Ë—/KII555111¥§§ûùùÚ‚`(Ò=ttè;D‡ó”ÂÙå~[§ß“YèšëS%õ;ßËÏa 15e©]½ð®·ßºª:^Åâÿ°÷&ðPmÿø·ÙËV!Æ–ìûš!„bk²Æ`dƒìm”-;%K2Œ%‘¬•ÊZ ¥I–±“}ý}†ú~o÷s?Ïý½ÿÿçñ¸¿ëU3ó9Ëu®ëz_çœëçóùh4|ö²á­ódß=áýí=9%Õƒ¤¼DýS.¤‡y~S¸Ü0Ô³©˜º1ðTÈâŠ=d Tì¿õ%®\zñ*ßDĈ *fëydUŠoÛ<Ù%•Å…Ÿëå¼`ƒ»Ù«½±‡¬ä:¾é“õ¨Z%ª™‡K‚d®Ç9À¬uÅk8䓊¶I\¬•u¯Â:ɨÀµÞ§–À.~ÿÂLÕ¹>ƒM÷–÷qSŸŒ ÍakÕVÄ\ÒSNLÀÀ´[Á›f«%[ÒnÞ\Ò‰c_ßðO8TñD/¤šzè⇄bÍ7Ï“ÚæóW(ýF móêý‡SL¾Œ¦¶¬Jb2«Õœ¿ 9ù•]^Œu¢èMÜ”^öòp{·9ðz½+²i>ÃW)z ^)2Ò~|U×í]­ø”½r-Ž2×z]&ùoc± 6GGƯ¼B2“é¨e›|q3Gu{:AÊœB¿*ážz&ëZŠJ‰þA2æ™gðÖL±Us’,ª÷½i³­âŠï$RÙØç©F ¹¹ÑÑ®¼|‰ëš]ãéþÍVöá©vÊÝÒmèsR†¿ÿv7~^ÂöóâÚ÷Ÿé€•š$ëîŒ}&–n_‰ ùeÍ.j‹ý »úì +òejÛ´»In?2¦ôÐFÇ—§ó|£0Jò í+*ŒŒ É}Ÿ‹ä—Úé)Z;BÄÅýeo; -é^­6çý[Â÷ª~rùN÷³èÄײÜ‹#%˜´™ö.¢ãZ‘ñ¶·ñà2ßM½íŠ /o…¡`à…á Ž&œÀÆÆ 8›,¶ßÓ"‹5Ùñ]YŠ ë& ¸{hÇØ¹érŒ¾+sÁTJ.žm±IE?}psíéäY 1”/&ãÊÍk«ºC»"ÛF6©o¿>®UYƒx í$þÁÖ¦—KÏCÔåŽ+I~|Û”©% q¾µ«%oD‘Už*ÿé-CîÒO(‡ZWú¥² òŸ\œ{Å ¯_ãN7OýlV ÁhUJžÁÆô<óŽÓ])žX%\_]è5“ûÒ$®¯ëˆ `Á ÕšÝöx€¬ñ^íqc ‡l›þ—cÌ«ÔáÅ3Øp?:‰-¬!OA˜º–ÚÕt`bs&Õ”5p—*lª0·ÍÝXÌ‚ ™á&ñõÐ[hÜ08ç ßñ¸*ç)Ði¡‘”F=‚5g7賸ÿ֞攥Hª}Wmû+'¯~æöR?üŠ“„©‡ÅåÀü ½éM„Ã=áÿL1BjÈ©p–eqG̲è¤-VPùVsIËpÎK£OòTD%Ù“X¯žo¼0Í×é•éM3Y×±±QèàeI¢@'Æ­6~ß>—ÅÂsáJntñô”ΠYEVŽ#eÊý*µ8ŸÁG9ñs– ‹Y§/›öôŠà°üpõ>…¦ä4øƒÂŒt”NûJä†o¡g¿MÁCŽô̶ ÍÀ³ŽC‘m+ïuÚ#)$·oŠH‘”d®è£;Š0Ÿ¿\ô·½ìt7aû1ânâÇÛ¾íÝ _˜¥}OIäBR¯ãŸxåZ:QÐWSÓ;×4ÉÃDŸâî²TÌ  Æ÷|yV÷…¸uU½ñ ¸Bæ‰ãŠ˜¬½19î„ PE%€´î(.ÅðDнhŽ:õl¨\Áôžò&^ál WuIkï¤@•¿p~k#´¬3çñDˆåD_Ó±€l.ž•v˜§áÂw›×•'O §-–p6|üªÀ"ÈPÔ6ä$ñpq®I.Wßf½˜J"l![Çé^$½ð.•Šj¥oƒêP&²63¾qrÓ‘jƒìPæ9ïäò0-JÈ”TæÓktAë<’óHMˆóñ¡jÊC™‡Š:—{×wÊjkya«´2-ú´¬Ì3ºáƦ¥OA¡!¦ bJ½¨ þS’ÎF¬¬£6®Îò¬VÉ›÷<¥‘}âÁMÿ/RñR ¨ ®ãÉhtq'ƒîՋΜ}­¹)2•瑺+ªúÐÅõ&¾6ŠÎw´µ>Xs¿éûDð,u2ù(HHóË·g¬t·ç©l$@i ¦O([NqŸCº-(œûÌ'$”éœL21´?ev›1 “Ufè*?ÅýBþ§Ä‘²o{7–D!doͶEÖÿ̸åïæõ‚à\ú\@Ùê„.Á j´¬Û*$avZ™™½ŸðÞ.&Û¹rìEª<Ú^£R{òyeúv{¹%¡ñ^ÄH8Ϥ<š¬|úbËo ×ðwe‹–Gé™G×5Ç…·¼ž?Àû#+ÅŠ…V}cò§Ÿ57ææ†º/²ëÔ§)ñ•`Àm©5íþ‰ó@Õ®¥O½ù´ÈºT3ùç‰àé¬gÃÒrµ¦nt%'×x#µ<®”Þ°®Key· T€8 ]¾½Õ›x‘”Z%ÛMäØwUoV†2©nu­ ¹…ÒÍ .B—Š´¹­u[ÃÖãòƒó¸%í)}„YYySLŠßÕÚºð±{â5±‹9[˜B7-k^ñžÏ—ùZEPHß+À‘8Õ⃲4:ÿªs+øa°i½aY"“¿e×J‰7JŒ n\t ›µ*P¼¦èÁÍEÃ)t[î–Û€&¢ä¿Ÿ7–Aú®No&KJØ>:0¬OРiUwE:1ù©“LæÞ«Å…ÚÛ‡F{¥óyT6p±É&ù½ ~¥ÄØwÑÖ㣵ôvƒ)sãkÎÞ}BXÙ úÝIe™ÁŸ¢âÎ~_n'Aªïª‘!}-K®®ŒÿÌÌSÜG¿or¾z+iScH0—}Õ 2Ž¡)/ï®÷­–`_g=, ¥%‘Àu/¿LS{Ž8‹ÞZÞ®¥ó+N’œ™çÕQ—L ì<›Ä˜Òg·**¥å1ž]†ë§8'”î <0Ø 9g°e‰V¶Š…”ì9ÜÄ`Æ;RK¶´±ò0I2[4ñy`¸ºÚ‰XDÏ[”D‰oñÒ!Rï~·a€ê%§5ã~ï°ê抹,E]íØ £Kí´Ÿ^C²æxbd7:Þó¾H‘·Ä•ŽÁZ×7¨šïÆÚÀR…³Ç`š?6ÖBjêEXؽŽØgíï)›OþÊÌ~åw[¼¨›šØqœÿ,<ì÷Ó’Š3ÎTXF5rd|nç¾Ð´Æã—1qïìæ¡¢íFJp-ò×=²ò;€-#ެ†+„‘Ìxùf˜•4­¶ßÛ¾Ú†~ç•®mûVh&­XmãÀbL¾g7:..¡§nø&?ì]’«Ùv²‹¦ñ¿Å_úìyÃ{àÇÒÖ¶ˆmÃEÍ™Wö‘ކ¿à›¨ß›ê)˜Î¦í`J}mH˜Îªæ¡H÷¿­$瑸´~ÚfM_Blµ§žñÁv­sB{ÕlýG`òîÑ:Ïl¿ÁÌœçÌ»êÂe)šÇ~*+Ó_:­—TÌ¥Ê;‡ç툴…½·uιϙ-ŒÔˆ{êl¯œ˜¡Ðp‰*ï6ó#àŠS«Éâð ‡àÿv^A(¯‰Ví±Ç°Z¯ñ‹™•9X½Ç”®ßBˆ4•¯›‡H¡F^ŸúÖþÁo¬e×åê‚\Z>å´ßÑ…›z£ûÞÃ9ÊÜžþl§cÌœ++`m¬â_Ž”wRt„ˆut}s†ÂEp7¸&uÈYžš,2¾R(O´ÖDu;/¶iuÔŽGä=j«òäáµqöZ½kÅqKZʼ—(‘9/¡º,Õ”ÙÙ*öÁyÏ„OeZ5žÎÙ0½;íìZ·fp­ã+äøYV󨧋,Ï&Åž¯Ø…I®éX¨E^pÅ%0óT¿Sž{ôýh" Àãïr«x÷ÍW|ö·Gƒou¶±ÖÈiS(s ·ÏØw=ï®{¼ºÑ¹qo¼—Æöõò!‡÷c>³ïcÒ—1µ”ë #†{P¥“µyðåÝ“w#ç,‘ï|VPsªÝ/.Ùù^ùçLŒÛyº;R›uLb"Öë¼J•?ÖPGŽ:;ô€n÷´¶b®ù x­Q£ ‘¸2‰ä¨¶¯yB$mT=û7ëØ»æ#ч†u‹sÃGtÑó Ýý‰‘?~Ãß6¤£¸#þ<Ê>SÆÍã]„ýa³üÍB~Öô¤!îä©Q±Ë­Î’Ïæ†~ S¶×Á‘ºNñÀÔIÑ)tfÝ`ão¬ƒ)¥ð^òhãÓ±íó=(õ!Vó LLEÚŘðKZ^p~,3OÍd\Æ1£ê8'—ÔJF…2ËHÀ÷gÈn¶ÎZxpµ×&þkQw‰‡ó¡E:3çÌT’ˆã@qÃÜöêÛž‡^B:Kb ?Dfæ°ij{o®ÿ`‹Ã)äCXýÝ`÷GÏw©û•±ÅåQ1%²J4èî^ï¼ë ’o}‚.iF毫§ƒR>>˜A†¿±1&ÍÃ9Áv¬èâ¦ÑÚ·h=0ÒÀ·­å•äÊoù¹4Ì¿Göè€xi¸‚rYïÍá@¾§–†Ÿpýt^7ã?æ:_ë?Ï IKªñB ’˜³K|V»-ÖkmB¡QÍ¡†ƒ˜ûiQ%HJILŠF£]|êp>w/·#Âï¡äbqÜüõ ½ÒœÓ­wÕßrR’èÑÇòbj[nCY?qV³Ö‡Ô& +­2Žà‘Z¾öšw%.GL®ZQD¦¯¾þWiTPù€ÉkøÈú4/ëŽ=!ÁPk(3yºßI“™RÕ &Ìš¯Ýypìp¤â5æÃïOÑN¼‡ü ti€¹÷§–•÷P/é2\z©4r-ÖéDÆjlHL|6 æÁÌIÒ(û¸×UX8ôxõÅ;ÅeL u¹®<üè€b$Z¬úH¤üP‘!/2ó®ºT\ ~ø}3Íð!µÄ¯°á!ÿà×9£^i>%¹eáÇzR¦;È,îQâx´ùåðé¹´§Ã“Ÿ\®e[’ü¢ËÕ3ç ±¨lZFS´ë»–¿{kÙÆPõš'T/š‹B °ÏýЦïbïcïî¬ÌÄϵy÷;;ÉâÕ#Œq³™ZÄx‘eiS•²°‘è‰æ’KX¡3ÙNÃÜáWúã§ZG¥š’ñ¼¬f'…‰^nH_u›#z Uw O7ì^¯ºyïÁÄD¯Sö$'Ég…GÚ¡¦Ñ«»~1ƒßë$J-twbïôÝ8Ù‚æE¥UYÇëzV6µY¿hÊÞè¹Nt˜þæ{LéK¦àƒ7*› ºAh§ÉÃØÜº— WF{Ò(… ¡B“ß Io'›"Cø¦ÀÁ—\`y•1•ƒhÑ|üåçšßmÆ<ÐM¤PÂÐç²iêb ¯(spkHàF;"3GïGÅ߯œ-†äVcmÓR3x³­\4#‹òÞ@÷(˜jú ·?õ¸*='­yŽ—ø)c‘F¶hï «fØ8ZSR‰°ó^‡Ú@/s|i¦Î§È{2ØÁÁ5=‘¹ÓUM>úéôƒ•œ­~Ωw=[Mƒ%…°áBÝn[ñáK;ïVlÍ *VË#ï›1²eñ?*°Àè*ɶ‡¸}Ž‘Ÿö£@І´÷U¯%ûäuØ6.½â¢óähå¤ÃbV á¾rl 3ÒDÉU¨‹MMÉõJ©ÜWld¶™Œ¬q âAÒÊ0‰4!‹lßP€ëžSÃÔ ìâRëíŸ}«œV‡uéò_Hc1×o}#~•xÑIÉõÒmíøgfÂiKw‹Ò{NõÌ'iR»]¤ÿ–qiX'-òjç¯äz³¡ œ´Á‘&z°»~Jö»8¬‘Åé ¿U|³ZíN˜?v¦-æò.ròÓtžž_‹yÂUìÿ0séi‰”]Œ­†€ÒÊ5F9élÅÏ©¸¾Œ‘=–øz.å :÷†ã¥4/]ªOV3¨öföI+¤ §àRiÒ|Øð3X¹lÚ4ÒA´ˆ‰¶–Ÿ¸sÓÜÕ²±(´Uä9%WUõ/·¾…’’/Rž¦£þ¢Ë­D›R=¶`ß*^ªD®%cÄ9E Í”0ÙÈ-ÄQûW|Øfó€Aît­4É'ø³Å>W¡¦èçSÎ ù]Oé¥Ãå{ï’©‹‡tÖ¢„¬#qŒÞ'ÌÓ*t©\Œ…ýîUÚúÜ0#Ste`7{È×û·l]§P¶ìõv}¨áÆ(×Á‡í'k}€º† M³Õ‚C±Ìn¦<:>eÐ=Ÿ% Á·D佫â!T:Åä‹ Ùp×Ôü$¼»‡|íDT¾3¨lø’`˜dÆÑÁ{ÓqµÔ}M<ßtúh:ÓŠzV§ÝŸÕ§± ¹¬buÕo˜§´|l«©· Àwì÷Ü9Ö7]2xIhç•EÎbbçšïÒ•âÂXæ×& ;o‹â Ô®HËõm/³qÁc:q³¢$¬,„B-r£æg•;“ÙŸÒ ¯&¨e0$HëWö'_8†»{¼ç7úë¹,åB–Ã,qQAr¼F&ßôðA‹g ouÔRMgis¥«^™‡H€Gu’}g³Š‚´âü‡Àå˜ÈÄÓ\w×ȟɤ6§—9&—åªy9(}ôŒµ°êàêæèËOrGp¹„²xâaù4µäÅÍ¡•w­sJÞzªŒ Y®É¼ëÇ¿ywbîå6]“Sø^¸SÌkJÛ™ÏÙ`¢¯=äÚËÕâ³ÈW@çCƒí?ûUäœÁc%£ï>«4¿ža*°–6¦£´Æ{âž-›jLa¨|{±ò8•!üx*RüìéERB>6ÉâÍàè¥6*bH_OÆ2zV}EÖNá[Ü92Ž„yåü7 \Ùœ!Í£ÃýÁíâ¹ã•圚¥\BnXÇ3¬tnl<î¿þK»Å/‘8zÆÍ¿EOK碑‘ƒ·ø°õUGÙá·b—uUGå}\ ðI“ÔzŸŠ¤îW 5k<ú‘ßzUP“Ž3£¯÷fWÿ:¡Rdìx/>[ãù*A v¤„=D÷C$\ù—ùšÄj‡61µë©§ñr²H?ÝÑ {H..5 ³¶Ï^ß}È1¦´"Ö+ô$¨˜}ZÁ|°kÆä9àrœì•Ã78?côýüÊ4ºš”ßk:BøÞ§æÉaúŠye–ã›ñR÷çñRú%$e¦©÷?O:ê£Gó:Eïç¨ ´G’d^+íE½1ÈMt“Â|8syʘjÙÉPÙN H ]‹Í*í~þvñ©·3À÷›ãઑD&¨˜¦dÖï1›Ö1zè´¾ëBP1˜gÐKm×fÂñv4­Ö+C{سë’íõ]V‚ŠJ`嵉ì!Í~âe¥®œ‘"™‘P ]CgÐRã\ô4qêÆH 圯Q‘á<ê W5V–át" ÷T9ùIr«h<¨‹¬¸8YÏE¢KÅ¢Ï7ßÃÞkÊ[òiy© Æó-2E† }ëÒXoB¡î¯Ø [‰æÈ°[»à¡:*x}"š±ü»Å“›jó÷0àK©MºXf—/‰™Ô²œ.À-ä"§pWn›‚€%þŠê¨¬ïU\~4Ë«è É‚ùãé†åÅë•›ÆXLÿú(k|AÒjó{&Gê)¼ï¦½Ã×è›K^+¥D¹÷¹NÉ©æÝ8ÜË©½îyÛ¹:8ìC.–Ô¦Wv-¶&/騮´uýºÕ·a|wü1õž‡ÂHC&#&]þšo¼®Í½à;ÔÌõ„ì.TÔrÞû§0sTP’\ö£Ãág+aFåÅàŒ÷rðæºŒ‰dŸ&Ègpàùh‚#à83m"ˆm £BßêRWr ¥IW/pì‚ï _–^lTÝ mô€%¾”»O³›*ÛßÍþ+ns󭙪zjõœ¿ÌT¬3¹¼kTñcv¼YUoôU”¶rH´zƒÜUoŠ9Þ÷‡Ïó®þDÍbê§çÄê¹ð*^[¹XÌ&D7_މf…Ròä°Å=¿Y†IEŠË7ئ©èÓqS"”Íe^Ð ´5Hç´5zôî~t¡Ã#-x)r&) vÛ­ÈQóîêktŸ½·õ—ÅZÜ:ÚvCŒOl€æÞ`ï ×àÕÁñ†‘8÷N·Û‰a·z`žC E0Ÿú Fªhõ1è¥IéôëŸë/¾õØËUóv="Ê,›º›u2í"ÜÈZvó¾›\þ¥åˆx~² Õƒªð¬WÅm¶Àn  _¡ÙâL´èAo{5Ün; Z’ádPKa޲Î<%*Áy‚ no—øBwq¥n o´‡x•p¦ä³©G’å§ÌŠC +ký^yÜêœiÒcß'*9‘ÝÅØJ&ãtö0¬qrbÖ<Âzå¶Âbr\¥7Zª§ß×fQrø>=—û:Xì¯d?RöùòÁ•´ô[O½ü!Ö7ž6*Сóz¦µ$Â=쌗²Cª†¤^§þ~ÖíÉkS¾¾§³ŽÔÄ!‡›¹îQóæî&Ùäòߣìeˆß—ß<«ÎÙœÀ¢ÐYž2²µj ÄH®S ¨›€/]“FfЗ¹ù*ÂÏ9$ÑäyÒòc—î_ÔS„_Y\(«_qyÿÆfÅëŸûüˆåM¿ ÿ¯Ð¾öœ¶š8Ú¨ ñ™ƒ4U#Ñ“5|W–h-Î]gݼÆ#Uãu„½•úM¸“¦ÒTƒ,¥ T3™#n!~·Öè-ĶüØö;4º—e “Æ#öê)íœGo©”Q Å,'4ÜÊ{ðYYèSÉR×&J ¿‰¤„db¾¬"À¡ß¾n*áuQà ìèZIíM++óÌãGk|ìÏ·é_›ãŸ+z }¬ÈR`FSWJU;%GßȯÞT˜ô’œîy‘-[Ljõ>Âá®ÂÞÇ|1ɘ–Jw¡òSÇæ·5Œ©@ÃcZ¶†'D- ›`sŠ€‘ÂlÙûº`•‰÷áçžÐì\×µ‡à«ž•;oeL„Ç ×ažš¨~Å#%dzD–tתåÎÇ ¾6ºîüØFaÇÜ‹×mAÙc° Ë–[þ–ÅÕ£“<^–×t–,„$_q|)+¾ú¢èäÅõ@;çOz§ì%¾*çšá}F½î³™®?·ëWxpNÙ„\ýöðl” ÒÙSüy}>¬…õýóÌQßWDj“ÌØ(—Ú#\„ùr ’¢Ãó—¥ìû%”pà€j=K·ÕA]'f\ëÜe þÓ{ ´¢©O³eú¯ÝÓÙø<C³´ ‰Ã …«µq­LL˜=T#¬óüQ}”i4°T”ÀÌ‘+Cßßc0ŒXëyöjP®÷¾‚wüŒˆA¢»K„OzÕ@ë<#ÎÑ´N—]€î#“‹ x^tešV<^%g,°—t‡nÛÕ컳tÀ5Ó{œ¸DŸ/ô¼_a%à–"ÑÉѹÍcß9–é&ng¼›ü€æ$ꦆò(tZvò¡Ê'xõêRío ¶Õ[6³FŸqhüÀADÉû >És‡;pœƒu½ùÛl¢Èp@9•LCÝOha!XüÒI„P–£ÛÁä†SÁÓ¡vò¤hå±™ÞIåhÏ*ð¤Éà:²œ[ùûx”£¤ ¢”¤°ÁäÄñ{aÿ§©RAì“&!%ĸ{Œž1ù^[×¾©|{¾`©‚ŽÝ´Ý9LMÝâñAbVfø[¢äÇ/6@åyÂô êI®f(rÒåU¾nx›Á¤¸ ÆÊ©Ê¸ôMÛø*‚‘6PL­vP¿K¥í=i„-w£?¥ `ÞÊÓÅ–гôät~U ÇDÍèF©»#Œ~žmW¥»d¢ò¦Âî%F¥¥WÀ²Gë´ˆÏO”ˆ&³¥üyi¸º<â~#d—ÛáÉÍDê]æë}ÏÁók<Ñ y ô*ß—u9ŒCù ‰ßaÀŠüäÇocÅèñìa¸Ãšxcª¿Œl’¥Õ{tC[FXs‹E“|üvTÓpÜ„,*sY÷ˆÄ cæGød 6¸v´8s1ö÷jvWôæFl¼î¡+®w2ù<À%]JµQ¨²¸éS7UãþŠ[¯a>nE”\<¶Ý€ØkÙ¥$úuê€O”²oн>J]Ÿï½(.篾ùò+<# ìôŒŒ¾[Ð~0wpܵ[?ëO¬î诎jqÏÒ¹q÷ž¬¤DܘnY7Öù¢ümª’™:ÝÉànþ!UIKÎ!•kùÙ-ÛVí1D*GéÔ:;¿K­ñëT–’MüA÷=faº»»h &{ñí»ð©±ò>ïÃS*.R6§hˆàÈÞf¼²§ŠÐZ,êq„§h¨àìÛ>D DêÃïw´– ›xA!ÍCßø.û¬Õë®#³›{g~DÃ9_ ¼÷ øÄC.:eÞÀ*ךú$œ&¾ú”†m°½æ¥à‡ÛÐtrQ!ꡟnb—uM…ý<£¢¿²^X¥1мŸwå+À ÓïéÀqëmξUN¶QªkÙ‚÷lj)²Ã1ÃüR•µ ±Ku¨ãÖí5ŸfÈE¯¬vè¿e¼EÝæøzàØêï…k8±Y¾q£E«4ÀSÑFjBãùÆåÍ#EÓõÊÝ:9䙟…»ê{9 «LmRb‰’-»ŽŸõW´ùdE’©18‡íæÇާD_z=4M&ºßS,ä±v£Åfx”[fÿ¤HèºÞ …'µ "åQÁ_¢¡*O¶7!i8z $(ªˆî'»S~ùÃô¸i™ÔÀt}z·¾Ýƒ<Å,·¼úcÇrr>6Ô¨K_MžÄs­mHôug×T¸ªÌûĹtåEjSŒìF1î.B—Ÿ©1~ ©—jÀÙ°† ÜúA´þ3…k=¼À2p^.­|3¸Y3ÿ >~-ûÔý`3“èÑUÒ†§¼Ô1“—Hžcà±Ý©]B2¸O·¾i]\¤ éÁ4šõ›^R_Ö­r0Ú丧¤öŒ´©â‡,-y‘’ ]PeIÚÀfœZC‚,²šÕØ*¼d¹)Yçi¢äÊ 2ÉE‡¥¾öžé‹'À±2F›ÙFýý¢äª¡ðAÙ«¾UÑ£ÎÓŸ[¹èݹ7^gÓ¼(Ëј~#†’ù…ý3‰¨QBñÛšgښŋPêÐj”7’?¨ª‡†k»ô£˜Á’w¦‰2Ê„=¯Q.º©¯E K¤ Çcd4δ}:gK¤‘M¸“P‰ïÖ¤^&ƦWŽâ\t:‹YåüÍÈPñm)båè –ù¬¹ˆg‰·'ç,^§oœûè¸ñõýÄìsq“M³Ò›¯ßv3V-¸%´Ù¥S&§©y„_þÆÚ~3x@‡°GÄçÐ¯Ìød^¶ƒ¥YÃ{º¿ÞTÖªNÎÞOÕ±äìþU4ü\EJ–lð’nä34±wÛWÜIï—éwíT§xÜ ¥Á÷¤Y>L§ôF­8Rzâ)æ’ê3Äæ²Ô|È´°$´¯ÓS¼Â]J Ÿq'GtnjØŽèD„ Ò%ñkQ{€G¯LEåå( 0Ô ÉkO׊פöz9Ÿå>•Ëtþüê¡006 SŠEƒí`„ƒ=ºŸ7:Ä_x¥>fõFœ‹›ÇƼ‡¥}Å7Œ\‹ÊÆÖ[ÚÓ½—jžó‚ô×y¸ÀÅŸf‰ÍYìz>djýH(îkÍÙè=ž¸íÞ=â4—ÂüƒÞà@ö( ?#Æ1ž ð6{uRÁ½¶Ò“_@–BBI{Û 'g‰ÇSRâZšòyy:D+ÉøöN®á˜Hb9û3K<­éöi0“Y¿f/(RCÓ3Aª@mz|=`q&?s!Ãv‹Ô; ÈäÕ[t<ùôÙªôP¯¸8…±QtWõõ,Ó§E·KßÃoJ¾?MáNFu“!žwŽPN¹{úP5Oäå,]—űs¢#𮇱Nz7š!6ëÈ¢f°rÈŠ'”SKdQ•‹±ÞºÌ|D¸¯ÂvÙnÁ«ºÝâéÍ ¦ï†ÚN±WÈ_àÌè¥{­~]\h·a-ÛOüùm*Ïr áÏÄœŠbW„£~rpf_`á0ÏT³v‚´Yü$ϼå“)ÈVtÕËå.Q¯¼î껾hÝÞ—¦Jï]tK¿£¨P[ÌJb§B¾¥s’’â&ƒH@Èâ,ÑÇ)Ÿwó+'=h8xv=ç÷=šr¦qÞRW'lgIÿ;Œ†=é£5:ÍâmÑè,˜­+rÍ60òÝÜŠ6Xˆv{&õŽªóˆG5 ˆèmÓsßö1åyˆ€]­| >zÐÞ  kàí—Å›=C ˆ±;eö6®@…`œd’[ÚÇ^pâ,îêÀ6fÖ‘âØ±­Õᑹâ¶÷Å+˜£‡Àœµ(qË2€±@%½§ªs¾nçs¢Ìì¸MŠqS_xpQr´QÁÿÃDï÷áúTœw°ï5Ùû*óñáÞ³æH”ß½wŒ·Hî#’·©'%(³b>C.|Îâ& &@Ö×ëfÀ}ŒƒKçoÈÞÚ*˜” nÔüžÁrV][&·î0ü1¢ ‰¹UÉ jù-¤6ˆÚì›°ti+wíRr ¤Y¼LÒ ¡5ôµU/‹>>Ür‘hè å–4©©Ï_ÒP²Ÿ‰ä]ö•EWey|ZE‘+ž÷Ê­óÅ ÒSÖ†)·Ë\*Ûtš÷—q«Ê*-û\kÿ¢&IߢÁ¿h~©b¸d½Dl®s: †!ÍTÕÒ8¢"qÍHvx#gqO!0˜oƒQ~®Ûçnvt_͘Œ ¨üœyoù<¤gÉ,ôÒ ’fžrý–¤03½t÷‰ ?™Üsú?u’óyš¤õQìu(œ|8¶hõ‘‚Gs¯Ì©¡äñ`¶mö’,*ä|.~’• ÙÒßûÛ”¬<±"$ò½1»æzÇ[¶G!Æ7ãptfz2Xo0‹ø ¹² :¯w ÙÆ+Ü:ZŒÊì£úNÊJ,»‹(ÞÉÊað¯2KŽ9Rט½¡Õë+ *qïüäA B/ "Ï’YgÏç: õ>¯%z¢.·]+V{ì~MyP9¥Í±ÍG³Ž9‘=ÃÓ’®0Ù!“—z^¿ šÿƃ¿øÜÈp¡âÖ:>Qòæ†3®ñ¼’_Ì0É0¦5¸½&÷º±<ˆV5‹a{´A知㉉à`¥§ž×œÅ>LSžWJ)X ² k&ac× c"v ¾½Âp…’ ç(ŒÔf0PAúAÍ *z+ìÄ•#K§ÈW8æ t¤*EÕûŒ^0¯we »}[^Î^?Pɼtú¶Ê£Ô—ëi€Ô‡kíïj£uE†@‘๑Ï4oÌ×[Iïf2J‰yb î…v$òFh%­‘%Tw5{Z éFlô7i¦Ð©ðÌ÷BœËBRžâˆe’×Lõ{ñ•@ &arñ ,˜T&m€ïüè«EÙ>3îzsépÿ~7žó£=í*ÝÛ•}Ÿ¬ÍT·[Nk®¼öÈ‘8}S©p£èìO ÕH%ªÖF³“§ÿ3ê(4ÂeÖ +iÏsE%ÉÏ|óIGΑCou„NÍß"Ê"¿TcIŸ½‚*!ÞJ~™ÊÒ.FÓR¿z®æ‹’Ò9ÎïR‹4l{OÓFåI!ßD#oXT¢êu]lß ¿îy&{þ¸Ã¢qÑÛtÃæzo|~}K?KxKýóÅÇlT–Q…¬ZAo¯Š0d¯tü5óŠ»+sÕ‘™]DóPMõ‰C9–Æf³J¢g¾Ÿ%ì%Ð̈ÎϹM?)våÂbxdÇ3lê›~vø|¶:Y ÅÐW.IC-<“™ W®.Èe–˜ÿYÕá†Ù¦b„y eM²L¯’½»]óÔ4N•‚ü«û$Ï‚R䔯êùœšÃð1g5)ð'£õ!.…ç½ßàL ‰@ ‰r$¹¾)¦w)<Íʦ/Ç“"覭/Šw‡ejLcsYžzíëVX ™{’Y-TÖQp×õh\M™Y}?šÄæ+÷ý›9(h‚p·æÃQ ;Êo`«›"f7Ì.;,ä{d™Öß_ÞøÐ¹Îr›Ž#Ñ›etwnKbRj.ôdUÆeL%ÏY°2™–‚.è¶eÿ£T‰Þ¤Þ®£d)J«1Æ&¼/-ÎÞØÎæYUL…\±}סñ.t‘NiÁâè‡Z¬ØbŠ UNH$j¦šð—¢³Þ3'ÒÞI®lHÊzkV®~œ¤Ôe\–dæÑÖäP¬Ïè¢nPûWJxôò±pÐu½b5j“Ÿã: ˆÃ+®k:;}ýŠ™Ìq-–I¡ä´ ŠSà[>ÁlĘ (ξÑÁªÐÃ,í¦aã|§§Y79ƒY®2YùÞÄ€d‰,^ãÜk˜á ¡ÃÃ…‹ÜPGVC^ip>Æ92d+F¤zÌ >p#»øÍÿþVeÓÀókÙ þÞV‰VInêÝóV/Nê œà +2& u üoÃIÆEƒøã¹ é„ý‘.2S­$”ºVPAþÕ0í–ÒÔ¶i®“Þ“LŒ‹B®µ*RK6BEGۮЮóÖ¾–Áª‰†n äðŒ¯*o޼°œûxAx½ÖSL ÖvA´Ùž’!âXÈgöy¥kåë7ÜE™Ú˜8•Å(Ô[ÖÕ‹.09,;a8ðBÐëEá¼ҧX/oŤÃQv0dF ß@Z1ƒÿuè !Õ|»ÐÒu¡gRõÕG¿å— dÜfԷȶ£Í<ŸOÅøSÍ_–á*5×ò4…ŸÁ‚4¬ñÀ*qÕÈóàãÑM<±*qOZÔûtzÉæc-j”r>=ãÇ8Ÿ%TÜS„:Ö²ÐkUi?’¸J&Ò6‰‚=e¿Tô²nå(’II/ž}#ø¸zäe”™Öý-Þc¶ˆà(;e°Õ=(ý…*ít1?PMãÛ5Ýh8¹¿[ËÛ89m¦ý¶ùÖ:2>å{ãŒÙŠÝ»…7x›ß”Å¦í®•oм$ ~y.{Aåz50zTø¢ò³Ww`FCh$¿ëzˆ+ÉŠÔõ\Ý0tÃG…@¯Ò£…äéÄaI*RþÜÉ ŒÿÆ‘¨g †ØÔõ\—ðsC-ÒïóôÁ×iØæ_ø‹ûëJ常5Õ³alûÍ l²ÔoO˜Ë¿Š4omìá8qˆë£˜}Ìw ”烙÷•é;výgz¯½¼üðü”¿ºÕüsv(_ù@ïIY$\½$AkÅkN”¹)Òˆ"r%’IK8uðžüñ©‡´ £Ûœdy(¢‚Ò¯¢ ÙÿÂÖ.9Ì•Y¿Œ"¾DЇÀ›’–ú¼éÔë/´y°O ªç!ØÃðв(ô ±‹¯·õ¡ÀðmÜ<ªp×Õt¥ñ´¶”“Àã¸ýÎYPDË»cáþÛ-•P´5VPÍT 'pIl• €¥]>ÝŸ2ð†âÔû¬@1±nNõ-gç ÌÉiŒëÅD¸X{¡(½³kBÌ'3ÌÉ L"2C6#çÔD[”éÃü»TÉ*º4N÷´[XÓݸj)»bñ íÐ)½£|'Ö1‰ Šõb—nê[Å7,òK+“xžðr›üñÚðšr^2²0Jg\'¨øØÅ©|™§L23&Àb‚-ÛÆæxXAùõ)æ£aÛr¯“ Ü%Ë”xžúíÃÍ«ÛyŽýº[™ê@^XÇ)÷ÓÅK£ä™‡ô€1é5ÌR‰œk0æÃqu’,dËÏ\¥÷V=½¸mù‚¹r…©„SÄË“(ýyõ|B#W°à{ïpx¯­¢aÜî«q÷Å¥–ß« ø4#)4INhŒÎó‰!Ó> ødÈ©æ*ñš «ÅjÕr*„ß‹R¾‚ЧÊ6š.¶­» Çš{ _çÚÎJ=Ê þ´ëô¯Ä½ýb 9º&~_·Ýc$S™¥õ¤ÂñtkpޤŒö~ÔGK¿“ßæù"ª¬!è¾~’•¡Q ¹Õ¿'WåÎ~ƒ&û#¤NÒ+äi¥5´BB?ô*a¢ä;oIh»zÍ`©PoÈ`öø4ô9s¹¤L;UóöÃ]óCžq†%Œ/0Ì`MRǸr»J…º™Ìx…DÏú=ÑÖJ>f¨åóIŠàc¸8=‹Zio{)Çn±!‚Ñßk½8øáš¸mÜ"'Tè¦Ð}¯µúÖŒ» Ÿƒánœ­Lܱ|Ï”–¾vëPáÌën †Ñ6Å™^WXZˆ½9çCÁø–ž;VèÙÁ€é žskÊ ã¾5‡Ð6%˜^?»Ä7Ò&lgR4é}ßUi¹oš¤/¥špˆ‚ç]wkm¡Âð+U "fA“ÛºµpàÖ¸Égúò›Î:Ÿ1D4JÈ0·*ºô=*„¯]ß‘`Èú4ä<î±tšû“q²/õegž~´0HÒ®'#%É7ºŒZ­(äãd®ºLZ:]ôí a‘½Zb_E‘ÃÇ.ˆæ7) Oùê…&·~ÅuÑbU:¼'eŠW˜dË>WI4Ñ ´¾Õ6ð…Vn€¹*pg4!…u’ÞÖ#bÇÍ—c¿«—=G‚rô\PP¶=$ïÈxF½)6κÞð.š\=ƆëâtGÏ æ>”Á½¤¨—ÈËéˆ|äÛÉpÏ;•]&ú–a‚N\‡éùðÆÄ ™hæäà|ÁtÞìgwi)Zšš›ªêÃ=I¤D= In€áŸÐW¤1ù#ù;#!Ù2ÁÅ?°®¾ “ôÖÌv+=ŒÅ)š**Å[U‚9þ…ݾŻ5Êï?:¤Øvb”|¡(I64냆*ÌYìÒZlÙ¯ÖŸpª6ó|‡ ˜ç¹ÍYꣂˆ¦Ç™¡mß°ä³ Ò'‚éüÈx@~¯BB¹‹ðþˆÁìòm·Ž‹ä•Cr|©š%ãÔù$0óºÊÆ `VÜ&µ÷×Ä…7W?ªh¢dqãï~üݦÏÙ+ÏÛÿû.ÑNüE÷þûïßÚ‰¿ØžÁ_\xÿÝ ø‹ïü÷ßÿ²+´ÿË{èýOûïÿØÚÙÿ÷ÐûŸöñßÚ‰ÿzÿÏþû?v…vŽÿ{èý_ûøï íĽÿiÿùß»B;Çÿ=ôþ§}üw…vöÿ=ôþ§ý÷ì íìÿ{èýOûøï íĽÿiÿWhçø¿‡Þÿ´ÿ®ÐNü÷ÐûŸöÿþ³+´«=´ÿ»¿þßÚ‰ÿÚÿÙ_ÿí íÄíÿìÇÿ»B;ñßCëÿýøoWh'þ{(þßÿv…vâ¿wâÑýó?»B;ð·ÞCñÿ~ü·+´ÿ=ÿïÇ»B;ñßCñÿ~ü·+´ÿ=ÿïÇ»B;ñß;ñÿ~ü·;´ÿ=ÿïŸÿÞÚ?bÅÿûñß®ÐNü÷Pü¿ÿí íÄÅÿûñß®ÐNü÷Nü¿ÿííÄÅÿûñß®ÐNü÷Pü¿ÿ×®ÐÎóŸ{(þßÿv…v⿇âÿýøoWh'þ{'þßÿv‡v⿇âÿýøoWh'þ{(þßÿv…v⿇âÿýóß»Bàÿ?sïþ%üÅDø‹HîÏÿ»B‹¿µ°ð^éÿûøï íÄÏ<ÿQBb?þÛÚ‰ÿÿòó%¥„ʼnŸ€ÿþów‡þ+K77-„§.ÒÑÝÁ팂:y œ€o/G„ãeÀ‚„âÿR€%·ñþø‹JIJHð—”—æQQqIÉß@ÂÿC:ï ÿãøË±‡)ë]ÔVAô4/€´õ•.@•AìBB†bÊBBçõÎogˆ ‹€ôP–NnH4ÒÙÉÒAHHE‹]žLŽà òrvKky9GÚd‡F» \Ý‘`veg'4à=z^.vÕö˜¸ŠÞòº³Vv–(7Œts––!ðD#ÑyÀ A¿»¡,HsËý@nh9¡ídrH§+ ;ÂÌ.((ü³v¾êe‹p´rsc¡`v7´—ÂÍ@³ƒÐ€?›'mK~ÙÙÚ ¸b©!œ(K4ÂtÙ t~›HDP\P$ ”±Fz€¶z ˜Ýéd¸Ê./gùw);Dr´D:muvyMàçi§Ën.gµ-mrB–ò _Ð]Û Hƒ²²óúÉB™Pt›äWÖŸbdéääŒ&èõmÛôOð°A¦üY_øý¯Vww²"xÛa]·?ÅÆÖÁù²¥Ã”ã_ááØÿ8Â`—?€Ùb!' Mppù8îtH ”žÒ üCÛ!Wwtq@   älú9x‚lœQ#Âa§TÖ—"ÿÅ üSâ˜Gš„t²rp·F:Ù‚,€+; Ipæ_£·œ‹¼Úò2¡÷€@rhÔ/Q€|‚¬€3£­åÿÿJÈa)"Á.¯hm­ˆBXä:£k qAB­Q„Âh ·ÕùA[é*Nh”ÔZtÚÒÑå¬ÂjÍôqëÿYþ kýцÐöêØ(’¿E Ð÷_0 ò/j™-ƒ¨";­±•òÓl¿ÿ’ê‹ ÿ¡þpˆÿ&Øv€ßS/þaB.ˆ×øüKÚBD˜åи5ê_€» ·ÆŸ¾€B¸9»£¬~ @Ñ_Ö¨]6‹•³5BtɉB»[:˜Ê m%ì–µ¤ØåÏ#“ìÎIæ¯>fŠŠþÒûï†Íß't¨õßO![cÈ¿ÛÄj%d-&ùœþ—CèygBˆ½eˆ?¥Ý?aºS¯Ÿ]q×QôrwtùƒágÛíîn äòÖT@€ùWèöÿj`ªœ‰öÒ¶DÛíÚ?uE:+MÄ.pÒ„ÅÓþä¸ÝÑÅÙåÕh‚–`ÉŽ@ý Ñó?.6®¢ÏúÉh›ÿÏv[M“Jo™ôOM#¿¤[F¶ùõó?™dþ”©ÿo¸"b[Fô…:Ù8ïpZBÂOý‘ÛWÿ^ø§#6¡A­uÑ(¤“í¿õxýO•þ{Eÿ…yyêû']›¯“•¾‹5°bQvvwBÿyÿÛƒ‘]\PÝMåþoíÖæ-]áÀ4srðú?± 0n;š#¶Ns—Ÿç®í‚rF#¬Ðë]SW‚ .ÒÚÜí÷Qì/¬¬ø–²næ6Û=ø/¬©ASÂÊe  ûWVx[Ùíý±¿¸®¢] ‹o=ÿä$ü_L;–ÃðŸèƒx?ø÷ §ÿì‚âÿ“)þv·x÷7ŠwiÏì¿Ã2¬O·—gH'sä_oi&üûûŸ²ÒïÛ,{³õŸoÿ7˜áÍŽŸ{“z í°ñg†’³³àG„åÂÏ=ÄU´’» a“ ùsݸ÷ù'{![i¹;þËËàÿ¡å?h··© •ÚÎ.„ä­¹ùŒš.ለ—w÷Ö‰»­³8á !Æüù7ì×ñ?UTŒ èñå¿­¢6Ö¦ ]ú¼%úoOñü*@N¿€Òêßkvü³ñ„È–öÿé锿ð¦õ¶æÿÉŽõ_s³Z‚]^ïçrê¯Þ­U ,[Ñþ•{oéýIí1Üÿ?_'ü%ŽÐüSgý;ü |÷Bˆ|nO•³CÜÞ0»ስµ5»¶ŽsƒÙ÷µu’¡¶vè³@¶›£¥ƒƒüg·@šÀEHT$".+&#+&Þ:ƒ«õ·‡ËA—½¶ÿ’Zo«J8Å.+$äéé)øëH¹3ÊVhë$ñO-É䎶 7”Õߟ=wq²eY: Áì?SW€¸~Hkk;è2*!P`v`zÝ:­¼}¼\Nh[ i[Y‚-~žLß:./Oöß~þçýb{çþ¯ýûw…vâ/¾wðßþÿ®ÐNü%öþûÏÝÚ‰¿äÿ&þ’âb"’?ïÿßþÇ®Ðßãï„ð47wC:š›[#‘À'°ô7—¶rq17'ÜY$èhý¯£ò_ßÿ øßâ/ú›°¨ˆ˜˜ÈþýŸ»AV6bâ—¥¥-Ål¤ÄD–bÖ¢R2VÀþ¢¢Ikq«ÿmùöé–þåþoéò/·ñOú?a´ß9þ‹Šˆ‹‰î÷ÿÝ Ë–n°âE (2 â´²¶”þ[Oغ¿Â\Únká å—‰IHóKˆ‹üªeµõþ ¿óŸ_uÄÅ%ù¥%e@’âüÒ2¿êHl=sìûÜÏš’Rü2"2 iaI~qÉ_5 ;0ÖSóçA­?d”á–úb¢ü¢bR¿jIíý­îgþCF a~qI1@Fà[FøWQ!k ›¿m‰°cnîàlûGM1a~I „4ð-.ú«&BÈZDìojº!œÜœQh&)É/."’’ùì½XT½Ò8Ž"EE"(eéeéMé–³ôÞYzï ¢( ( ½íz—"E ,½RDšôÿ.ê{õm÷½ßwïûÝßÿ1圓Éd’™$“L’âàù–Š—ÛJ˜÷·©L=íÜ­=ì\­þ‘-0?//ƒ ?¿ð7˜†,ý¹³³—³¥=v¡ã»ZåãÀäÏ Ì‹ù/Âÿ-©&)ßwIí¿-Z}—P˜CˆWÃ(‡ÿw+ò}%ù˜{ZÚY}WEX6 °QHDà[:ž§ß1Äë;¡âçæÆT‡°ôß¿øñ3üËý¿«³í¿œÇŸ÷ÿ|Bü¿éÿ¡?õ¿¿%Dhª+QcÛ‰’¢, Äü¾?‚‹ùÒ¤md„ùÑTäöö÷öqp ¨¨\›››322¤¤¤BBBÆÇÇMMMééé1°ûûû'dr0O‡Ñ`tø nàTõ2ãž WœÜ)†å‡®´ÌŒg!?®úÔh0IÇ!nD2@.u6#š”ÎJ€ –à.x—s63%Æy4Y$¢ì4*©••ÏA`$Z_Rܱ68õÇeÁSî7æ“àê^—táä"²ke¨E¸œ ŠëÔ'–vú Ý$]ʺI öÞk75«øD¬毸ª-šø<[¶57W¹¶¾<\[Gi’N_üD=¼Ê¡Ý‡uI|¼0T\{½(£îu–/ȳʀ¬µ5,™Ðé8Œà›ÄwzE0ÂýôsSÈ5µ+dêšÌ¡0ø- Pÿ­ëDh¥êzä)5zd¹¢8¯‘dg³K¯F¾×ì*‹ÎÎVVSð‰Ætò@Ëøe‚§g¿"ü’’‹Úan¶ K‰fWŠ&|—Oªb`š›Ó žâS¯Æ…ÂÐÜS€ØA”t!8!†Ž¥üD]‚’·¬ï"bQTT_äç’ôÁ |êB™%¯ ÍÃÔ5U.5m/æ¯úîs-L”ú Åb ä ¨±Üº©}| SÃ"”à ¼åË9ðÕ!8â‰áªu8³ņü “³¨ á•XÀ“X@,*M `ð 0ŸünwAèñ¼ÈË×¼ c„÷2Sáô'k¨íbôllNáGŸtIÝìBãÀ…\ó!š¥uÝw £ƒ1ç—âl”j%ÞröQÁÈí¦¶æ¯Ù*Àß7µks‹óƒ“Ù&Pi4-73ºùMeúIø dÎbƒÁ½~G$dwëº3€Þò~Ð&J vî®qA?û à‚¢é­¾}§Ž§%ïò‚ÍIRùËZ(§X¦\W”F¼?Ú‚èh“{^)¶,\‘‡M‰‚AOœ-QŠ3¿ y˜±ý¾ƒ0°ÜÂ7[ˆ2ÍOI°ôTèáºÙŸ¢á çÝA Ù-u¯­ªc3y ”¨zñËc'èߟ…_°Øœ£Í™„q¼Ó }Æ.òË6»ŽôoíÅ@ƒkÜeä,c$XAåÅm3!äôîPýû#ð :÷,Å»SɼȆR–GÉ1+R—l¬îÒœmÖ1éô³¬Ö@+&(óGköÇžWÝž ºÍv7˜ $Ð`û%÷\PÃPÛäÛ:£Hï7.3; šWEŠÁšBÌ ÑuIÍáÒÚg»ÜœÏJáÁ$ÚP~Hžmï£$ò¬-5´¥ãmð(²59±˜Nç*$˜†¾)y£’_£.J kh®o¬÷½_ÿˆîóÚO}m“s4*œâ ƒL<µíã˜Ó{ü±Âu´†F†9(T°Ÿ -!eÇ^ÞRÁ9‹°¼vÆA ºÑ’dwUòªòÞÓôÆ3Ì&š±Ÿ¼ ¹EÞcÐ9Ü’Qš,øQ– U‹#½ÛŸmËœ0c+È ûÀ†ÓÂøÔÿÇlP“ò§“ý÷‹4¯AâPu@(ï…<|qÔ³ªŒ éëñ{fŒ˜·„ª¦O³}YSö ¹óžOﯞVèà ÿ Ï©ˆƒŠ´Ÿ¾ûñ T’Ôá*æ3O@†B9eä©Ê9YG ˆ ú‚Jž;v À/ì‹TêX)+ÎÓ¤¸=qç9Ìk³¯ƒ>—ýæ(‘ƒpUú«‘GVwA«V9 ~£çqˆ T`cy*‰®gÂ'Âp§õ(ZÙY›üh¹sý&ôâ©~·K+ jãö²àè…˜œG3™4Üo«OK±LPj*€7Gr!Ë0·c‰ã>\uŠð¹e ç#Jfµù|É3rrà5a¢K|éY×cb5‚Þø •âsåHÌ ùUOiNš gQÔÜ„×Ì*â2‹šð1Äô/ŒSFªüêXñi×Ü!ƒÙÅìõ1·„°‘žrÉ«1/˜p·XÒ†\Ü tâS.$–´Þø“Êz+¬§Ž„Âs#ÑlxÝ~Dµw©’Õ?Õ…Ùu$ZÅ‚%jË'­¾¦…¬Ü*¹•cdmب!vðmâÞ‡'gÑ6çì ' pWÒñ™ÁlIp§“:d¶¢‰‡ël;…“aû¡¡WJÕ ¹¬ÉùäÉþ3ýªì 5ÃÛÇ«>7êA0²Úxj.wdÖã3Âò¤2c;ýyéíOƒ=k É<½ël«¢´¼0µp]OX…ÿŠšKßp+¿;yâTfЦ{sÓh1}SP “7†Þ><:ÁRCr½e¬4çÃ3tðùî¹à.Y»X`3N¯èÐÉ<¬óì)¥Ö2¬Qõp÷Ó(>‘.(Ù31Ø4eÝçìÏ^Í +œ¶2‡«(bÃh = ß’ñÕ*·6•kb94D žo2WùRj¨ÁCŒÖ›®tu$§œhVÆ&s£9Ã\K8½(Ó»ýZ aüm`ÏúXyOûUFø¡àÐâPjù*a}ѨúüÜ5ä€7ýïým öFÒN‰£‹>ŸXîác¢Z±r†-pšÜïvÖyð!ˆ¡Å ;Uù¸ŠbO‡¬[suÍr·+‹&Œ½=NÒ•Œ8<"&>W»ª€û„ò:»Ý6 ·ey•Ý.æj%š°úö¸D]«+HµÖl Z½{§ê6ë¦Åº@›Juñåí´(>éêqðQo“1[3UÆ‘Tukþº6Ù½Â{>s)íN?Šá¡²“Ÿ^£ž3ûœy1NªmÌúy¼i´°¯æé I[+Oª‹Úy à#´Fãٛȸ"Åó*Æ)œðs¾Ë»Ü´r(¥Ê5;JêÍÌÀ‡ÆÙ †´r ˆ‰€ñöÙIè+ˆ—`Έ“¬è›—ýÝÄŒužG>‰U(°Q„2*ß.“½ç,ƒ¾¸µ%";$ÆÏU.¬_^Hä}¥¬dyVŒ§àß—J}!û›VŠò±M-⛈ òë%q¬O³–ûãÑÏ£ Õ¯r)ó±"ÌÏ Üêæ®„"_ÏhŒßXŒú|©˜Ïÿ9#ëõês[`) B-³J§^½ÞŒÜÕôòé…ù¼›̼' C^èÕy×0s¥€Lb+‡ìî¨"é„K]Ññ}âÍøä–”d6íñF:»[¯ÜÊÉHg¹µ9ÆTü©ÌrDA=Rr0®®Þã"ó­p}ó-?­¹PB·`ðhu%‚«UÛÚEûÙ°ò$‘ã‰ëÆ,³éÄ}ÊÕ L J|ܱ÷èp›ù Á¿N $"4Ó€sÞâvGÍÊ’"–¬³bDš›%¸”Z4¹Ff§B¿RÖª´ºúæ„uß}— Sd U!5fÇ{fž“Ëè–Ïð!iN‘þ™úø¬eðI0rz$çƒb"A™dæú#¶í|Ñp/¡@M"WF`O˸*£`H.ð©'ðë Ô3ª@eAX`ÓZ~U4®ÝÄ6ŠƒÄŠ£<èt0ÁÀ%·3G®«Z=¼XP뽨µûR¯.§<$…ÆKstã,¬ëâ‘„Øöcz`YŠ\¬Uñ'‡ Ož~/+<ÙœEìr\`? ®>·+dIs V`9¿¸N×=Ë£ÕFܳÜ} M „ì­Q«h"ÏQ.#ò}ãEå3L’p«²<åâð@ú1)GÉlÊýíEóªÒæñŒ ûF»÷k6K·Wdšž5Kjž¸Wb°Û¨ÿ =cs~}}ccs‘»eA/wÿ½Òù‰,^ż.Ê?x›Œ¤0hý¨ÂÀžû†g€×2»h®•O6< C”Dd|GE&@¿dro«ˆ‰Šã‰ ŸOí×Ý»¿Æ-Ô@S±çëñÙuÃÕ#då‚i]Ðv?\}­k²t_øôÂðÎåä{##’ ¾ËƒKRö>û]Aì-ä.> 7\Bü‚V·nÜ{¸¬¥¾ööF8º»öÞ;öµà= ™¯özœÕz\Ó ´>eE/ŒïºnIäû{l™ªÎ~<ýþôP$›;ÕÅt<}Ç[ùÿuI~½äpc7j†ÎGïåN¸7RÔÜ,¶íêµB¿¹| ¼3OýØhÌØ1Äh_Z}⌋{ˆŠ¸sÓ4nL™2X©ù\CÀHAL•ÓÚaN^4Ô¿ãêqVõËYõƒ{qÜ¥¦M~áý¦{›Û)“`3Ô䚆)ý;`™e"叨t¶sh£™’é¡þ ü¹rÇò§i©©µQn*ЗØä@?^útÑ:ÂÙ½ÏÁSø‚Ó› dVC¤è¶™Å©§xíÅJ¸ZŽ×:BMǃ›Ûé„÷ÕlÉ¿Ôq ô¼ªÓì¸ýf(‹©Og…“=:íŽx¦3Šà8·žÅ÷`ˆÎª-Õ•úà¼~äù;cèl“bääÚ‰ñŒ·Àò»dé)™‘ ÓFÉ-iõsA­šÖJä»nï‰Ñê4÷AÝv¶†øI³›3çöu«CU@9šûÙ‘ý.û{7¥šcD†[Î\’ó Y·÷¹ÕÁé„›,S4~ÚíùðÎÁ3qIT]ލöh6ìu2cöô%ò¦Ûò?&Õ;ªÿ€TfKÈ;ï^ñ#Ú{üÔ^.ÁÇ}¼s%í†d”Å9L>·KmÂÊk×{š=…òÌl_«¬ágtµøÂ9T˜Åv0}‚ÀEr}ÞÁ¸a›®¹U>vhšŠ ŽßVw_l’î}ד—™5ï¼ÃÈ­ëø¬þ÷ËV»<jªó†KíA|¦å׿‘[Ý›…Ñ–ó*µº÷–wºÎ8>h¬‘RM0í{³²n³®W’wqìZ¬Ù>-’Ø…yuk 3¨Ž¹‡&k:ºMΑôIhãÝȆßóˆ€\Ñä¼ni]FÉ®JÞm6êÑBúŠ-êu˜Wë]¤/>)þB&êŠl|—â@Å‘U÷iä¥3EaùDdkɧi‹ˆó"=iŠ¢ò‰Îø„|Þ=#zu§@=, ~êѧ+ HÆhü…lÜð€ ºá£~íÚ.Õ)wÒo-«§@ÞF~ò'ÿŸ€šw{„}§iÇC÷I“Û»>òÈIi­7“à$}jǶÔ4)‹¢ 0>=!5òÕÝBbEK´"¼iú-õ° îshÀ9xò‰[¼ ç½éëűǗ¨O<Õ"8¶kâ!l‰7[JPWWü.ß¶ˆ”6>ÛÙ7Ðz½o`L{eΆ£­DÔ̤¸Eˆ¼NÀX[ÊŸ—BÒˆk¨ñZšÍ£ÁÜ––G~?’¼ì\ǦÊ=vôHz ½û’ št^xY$¹·ÑéXïƒkùD³W²Îjx¤ñÂoôŸ';¤Vb2êÕò8dÌ#ŒFÑ¿½‰²1ãwÎ|g'Þq¿~Ლ&„ Pýxõ°ÎŒPùøõð¾™6p½{|Až¹K,(ïÕbôN|f¬Ã µž\ØvüÌÁgöQS›\¢¸’‹'T+L5¢&ÕenŒäGUÛ—péÊ#E(Á.¯`¹G˜Ò11õn®WP†<×¢úbB]|6ž?µí5„SIDÑ㨰âsצ÷Ûžg~‡¤’µ8ŸCaxö\ƒ9Ê_ôs•§˜„9È€ÊÈK7^Ÿç.Bt gâC£¿ÎR„«'W²Ó%g½árÒö ¦É&zEX£N¾÷ápßEòÙ>|Áé«‘´íˆHÈeó:iô+ÁÛç@}$0êÈ/ºƒ+Þå]V‘ jAàƒÕLõHâ&Üæ$žõßi…FLp‘ê ïc…ý§`ÒÐéQ?&Ç—doOÃk‡TãÀ{þ%Y‚·O‚VÖª¾•g]ë›Äý>½=S*µéЩÙîÚE]:Õ~ïÌ…k èµSÓÃ5 K&3öEOj¼´J!šÕ¡h0ú5'ªÄýT¬ ]·Ž¯D;Ýýì”RZRÑöß“ÃL"U™).†^žTsl`¨åÑg!¥¨šTrt£ÉƒæÁQÌH¼¤nR—è.‹š<òb,ÌTžG¯â©ç€º±pTÊ’Ñíù†®ÏÔý6F§7‘§Ï§ 9‡ZîônhEïD‘;ã¾³œÞTCà+z$°k„Ý=2ä°x Ú*çuH.A ­æ—§äôá¡)¨6üPס:æÓ’éÊ4‹š§/… ¼:‹>ÓŽ¸Ù!ÓIBQ·ÏKÀᨔGˆ"’cPê‡ô ~Fö¶Zµ—Ô0Ü#èz~úàš4:ý(ê±Õ YÀbF¦­ËÕ 1_¡«¡›ÛúKÙF‡oñÉCq³:G†¬ˆqÑ·¯ÝLF„e¥È@'ÆâÓ/<=‚3-7P˜€‡[Ï»ÑÔ„ðcè›ÚÁ¨œí¶“„"fyìwÉCWÉßZkÝ`>•d5m¾£ÑÛ+N#ŽÆ¿ÐQ†;¹Ë —>ÂÎq"FT…‡©?‚Fµ«ÙÜB´jO#2_@OƒÉ­w­æ¬Â>äkŠÛAª¶Ô#ï©s‰&} s‹u÷§+ÆÚq~f(êttœþÓábƒ eô*+âuZÞ9ÖkÒèvÍøy“[ðB%[UíÖ5¡{¶rÝó-¬°„8 ð2¼¥7fð³‡FŸÊͱ8"¶DŠ4¸Ë^‡ ¼à=R8Â{\Ž‚ó„¡àµþ>[EÌœD€fs1Ê”ðÌζ—“¤ ð¦ÐކR‘öäBf§úq Òùq]ÈwÀ6ëC¡Ú‰%PÈ¢ç¥ÐÏ=@҃ϺühïÌ“x‡>›ÝÌ ðoׯô¶×©·èEkr¦ó g+—‰ªÂ›Ë·4 ÉSQÍâX“‰¯ã–< Zu Ý]ÇïGru $õòÁQ‚Wç-î@â3A¯#áÎôï%ÐŽáL=´/ýѲ¤‚m†ës—³¹›;dË-/ì{eN‚Ôúv\TdÀ³¸Di€ÅÙ‰âÚ¢£cA[4Ç9ëÅEDÛ—šwcÉT×vìäÖËdà•åøj Ý!VN øKÁá2Þܺ׵O5‹™æžlyJ7¬uÔ½48§Íù)‡¿•“º1 BÆ{êÿ{o¥©ñZh‡¢1mµp¤Ž‡À¬c]~1cEQƒHÇh0dø±IÂ6c$õú ñà°Rº(m´Ä3Û‰«JÕ¶\ð’›2ÞI€¯SØÝX`ÐUi8x[K.ªN©Ñ,ÓM Oë fDŽ€¼u¤ÈÑ¥­J*]¨)D¨jܳ¯>àê*yì!Ðú.» @À\1lƒ+ 7õoÕ¢­—ùxljH}‰a†ŠJOY)Ø)"Û\“È|F]´G¬ŠþÜ+œ)á-0µƒ>Å;Á€óhPÄ«qW`õ5§ÕåfÆîßyMrbë+0š ”2&xvi]«kÈ /Dßö®–Q¯õNŸ>ŒVÝ0‚©«ÕŽ¿Tÿ ³aã×^Ò’²åÒF?â‚—IÚmNFèO6ê—Þ–²á€ÉëgHvü´'ø/óèÍ}" ó²Hѯ³oèÜèÜŠì’ÞÊÆ”¦Q…ܼ¾‰z$I7XÓZýX$…æÐ–;ŸÛ|G‚LGÊ›÷¨Ã×AF¸}¹¾Nª3Xq¥ÕUAx•¾µÞT¯¾_à†ÈN­â®]B?t}C`Âެ %q‰ì·J4Õ¶&ß“ûßUDÜ︒ŸRe®e]ù¼wÑ1Õ™¼<{7ÓÎ7¨ u+Ûxܵ)´mèÝŸ1N˽A_Ü(ÊÖGz4Îï ¥[Õó…(QÉÀ$ðf¬Ÿ4(ƒ¨‡ÙsrjÄè4§7m™ûTO®Å6|piØ®2¤tˆ]ojîêÿÈã˜Ú·<ÁÏ.ò}HtkÕBѺ{ôÁý7fK«ïg'º^”.o=Þ)Ü¥(~U¯—“UпfAKßôøú3#ýÜ!8î˜b÷{"‡Â?åNñ6Åœ“wèaºÆ R:о›oª; ì¦]Ôúï ‹¼µhÅj\€¿#ä“íˆò¡}rfm~·k1Ʊ¡É5ãpß Vª[»‘Xsu€¹y¨Î7¹ˆÍ“þ¨ì-çºQÆ¡² ß ‡u­1°ž¾:¹{MÐ<§Ã][Ó)w  þH)$ãíœ+Z×€Ÿ)køø~¶1+65];vù”Oke6HÂv¸]êŸ-2‰!dE×þé¼Jäî<׺–,!×s/7Å^.Ò åm‘,Jt¾]4ίü Ø£½²®!?€w]ƒ‡ípþºÌIÙÅz¨»†É0”©¬R §_·º÷ z7'4ÙµúixÝ'9Æ·–§JÃeZY9È£.æWªt¹qNÑË€hç\ÐÊFô¤Ã@Kx8*²>œuIÔ4^Òñ“^AЂKÕöb™ÝIo îIÂ<[Á® LùC‡E@ —NB´Êt†±Šà"ÚS¯ È6B朦ñ¹¶g¾e%ó˜f&LåÝRAîÀ„y¶o9ãI{e$Ð&'%ºi{% ¼[nwñÝñ-¾Û*ÊJ0r‡\ÑLIpFÍ« `áA€Ó]DÚÜYÔñÔ8AY^ÖkšýÉñ2’yUä#ÝÒ ÒoÄ'O¾(+rÉ©£DξG m0ò#ÇV>|6°-½d"Röfæ¼÷*Ôн$R¥õ SëÖH>­žÒWOOÃùqG·Þ2Ãä¸Y¢¯ô&—[ˆÞ‘Â4R“œw\·ë]åöÀ}—z’ òà"š¹W–†8L (ää—nˆ ù-.å%µ^i¸Ø¨æ°Ð¨à¡_!ç®"š’IL†O€m6‡Ýé[‡@ýµ£r^UlX»ó’ãÏñÑÝDÃgƒ•ÔlËd=ž€ÚhˆF¯§Eá¦M"¤îlfQ>*—Pµ§Î~Ä-A}¼GŽž@ÎY?ð—Ï:š©ö+Ö™ì„àù—¯Ð[»íSZ=G14Ñ@v]ä¤U¨äSÔ’æ”ÞÝY Zª­Ž-Ð=œHñRNˆJRÕìê<¶×[ì¢L؆W>×)éç <®'¦|žvÆM^­¸4ކðÛ^€Ú;¨L¯Û·8€Rfêw|@I/|Ûëq;¹¨<ÔroAíþø¡ž×–†*“©ÊW«Qw*ô&äËÞÛªÕExQ:1%3CU“ø Ìð;½&z…[ªÕ|øëAš“ó1®¯tCnøOnj9™ØkøÍÑX"+õÞFÐæ¥´jv—ó~ÌÝ8.;åkV\,qHƒc„Ä<¢œ‰dîBÓ‰ˆ3…%-4"¹¨—yމS÷˜^sM«úHRx0=™è³¶°9Æ »4à™²’Ý)l¦+v®b"x°Æx¦Kí€Î>þÜÙ±Šë¹ÞÒÑ,@˜LYhúÍØþÒlãð|¤ À® -¡c-}åàš‘~` f–35Ÿ53|Sb1õšƒŸFºæÔ€‹Ý±˜Šâƃ2p[;€÷VUøU/I Ð´fÙOÍ•ê¸ßDѲ­ÁŒøÇ^;Ç‹ð|D°¬ÄÛÈ}ÄH^Ê\ðìÅ}ƒ»ÇR¬]¨"‰Õ`èM²ÝieþR|›è)ü¬¯câEÔ$¥…Èa‚þXåo*s]î•N´˜^pØy¾2³žÕ’Òà ‘ju€þ"¬«J«ø¡Ïð¢QÙ3¯$°$™EŸÜ~×Å7)zi òÝ>ImÏâ9:ö|æ(:dHq¡¹Ð’“B±óä}­Ï£[ IìâÒF Ÿ¶ X2?FÍšÄãÆFV,Zä¤ûÚÞžçV";“|î}šK‡µã[Ö=•j›4U› ¬¥­ü®yÝ>ý6t‘þªf'…ü'”-sUó]MB@íZºÃ ·X³dÛxãH.Ý—ÁÏöZU’ñîÜô‡èHeuG‹×Øê.­…ÛÃäXÞÞÎBÄZ¿bÕ¨çwKEt¼ M 2­qB×t(ëÕÛ÷Åë L9‹&™>©+Î+j,ÛœeiK®°ó3âpFZ;ö†Ñ|Q ýí‰Éº³ÜãoÅÒè‹}„=­š¤†(Ck㸈ÓOkð7¨yqT¬'Yz^Åu˜ú˜qˆEMo3J³º_…„H]Ufb°;-ˆ.2$"ÝX‘ ì¯F^õkj›`rD/Óò•5¢²DÏêo«tÍC‰®@D¤;¨l£ïˆžÑouyÑ= ׯ̗;y[ÇÚÕEEZ9еhcŠŒkB#Š›6?ˆ){ÑŸ“_½v:€zÙn¯á–°…‘É™†}¤»|Ÿs' Æê‰ìòtw0¢0È»ÌzE4RàØõ7“)² ~žõ-âÇ-3˜O«âÄo#,fYÑSì@CŠk›GÖ| « ‡ÓÔ1°ßЍíS¸DjVB´³úxñ<>8w& ¯2žUcðcWÖX¸ˆ\o=TA'Ø’ªØä:¯/ç!mkË^~mÍ"w´É1åêsÒàsË"¹CC»µfZ‹ÉmRÔä¹Kj{_ïwÞÜ+$LEDCçÎ粧ܸUµgËöJ¸Q©E‚ÞíCü¼â[†!&ôhó H.\áx$Gyãã›ìŒ{ß]¸ŽÖ:a¤ç¿w¦éÉ9KN>¾·7ÏÙ”¯ÜרnIQ5É:yïiVX5BîªJ¾á¤2ÑU[îX‡(H…w皥ñj2„öQ½…ø}5ŸL'xB. áC(¡!)¤úH$ýûº¾¤yV¸ñÁ“%]aÎË1Dez\ÏÛ»®AÖ[+ÂK©8‡¢“Nöt€›2ñØ:,c5 _g½5'ˆª|ºJ~¸Ÿs 6xyeT~Ôö&üãS]PNLϸӮõfÂÜn1üÓ–ƒS[ûÕCü}ŸÏHƒ¬/ÛçTJçå\h½& Ú)µ’•r!yocP1 o¡Âê/ ç“9ªêG”ƒçÌ׿›‘†–ꚪ‹|$ŒëÌÓ…ÈŸ`Û¹ïKóäÁöû¦mÑxž¦¦ú1÷$Pôè-bçH„Ÿß{á …šoJ:Àžµ0âc¾§fû\½rõI+-4žU×PÆÔeíÅM?û¬¿Kp–ëŪ9óæÃ´Î¹×n†üì`2Œ²4pVñGÚ¬ä€ëoä{ØGÊ5ÝÏÚ'àCÜóâðbI~í`×%’†¼.0Á¿µ<¼ÅG«á<µ“±¼•µÍEt²¨xïd½Eà—Šò&C§«Þ´Ë¥ÖÔ_yGAÒújÌvx£¡±Iî÷ £FpÇM_³®s²‘¹ówˆ;:_ÜðÖÓ4lçu{«s&Qä^ŸÊ¹Ù=µ¬EÎ!B à–表éÎ<.í84CœŒ†iøhÄË8Ã8y¯hzuá儌Q–Ïœ”ñÚU¡fJ^LSÏ ·QDÃ-Õ†œ¨EbpVñ*"Þ÷"ÜEêj*P¸fì lªjæwÝš”„ÑÂg2‰mPå3Ë“©ÏÖÞ9 áwÏatY÷;`‹b¤§E@¼ßE8÷µG”ªY{LïÆæ­ëÃŒ9p®‡=pâÔ¢uLíÇ (˜Š°^chÑò*@…fÍ%G k:Eú“·ˆ™Ñö}6üYž:’–i”ðë> é#$7¨…ÑE2“3òí)ð04_šF×Ó)8=á|¤A«œoêÄœ×|®2·«:@9ϯF“m#¼µu*ƒçÛkÇO÷ñzÓ'à>`‚÷\¡EHjƒ~OçeÞlâîi¢Å»_"<ŽúÃÙª¬Â¸¼s;r‹-Tob7µ.r‚{jųÁº:«b (Ë 8¨ú&s1ßÚ·3§ûȦu‹Ü-ög3 äã¹Ã~FÙàŸ§Dpþäøå–ÊÜzÁ¹{qçJ—NÂGwI))|(IyèuD:ˆ:«$ùhPLSÛ²‰É¥zÑÖº °lìœ!G3c‘wË*Eýܹ Pºëx¯ë.8¡ë•ò¼Èy¯^Ö+SAɶõüTi@?WNŒypÝD‘˜±rlŒ5.Ó%p_HCÀü2ê¥veÐH"„ærä#flÚvˆ{oÏ{n³§ƒŽú9µGKѤ‰¶3¤‚ŒëÏ-AÁîŽÎIu¯ç'ŽãÉVóBÙƒ"ö‹;ۻ߰6#ž­xð­OÑÁ ÍÒ ª®tDPTNxA¦tv2ÊJg﫼'Gsdy(@µ?d(Z*£‹£)5x9z* Š2‹ Ñ[! Gø1%¿2S F ¥¹\Ì_àÕ"g¢HÌ ³\ûìQDáèÈI¸ãÚä'“SÅê/&Øk<ƒÀšŠe¼xe×ÌY#¸ÙO£ˆžÁÍ…4ñ8§ÏÂÅ#_ƒCF<2Õ¤åð³x»n{]{ÆSkï|?Û}\H_ªþ‘zìÊñ9&’¬`¯PŲþJÙ÷î]òš±À¶UÜüÓWóý=ºRï½þ²VÝÿ‰óÅ+þ‚%Ýù©Z—õ)Ñ™ÎiˆW„ÝŒpe¨íwk¹¥·õ™.AÇÝCØd”À‰ÂQú¹àƒ ÍLuÛEeÉiÕ…R»’X4ÒÏN­±„¨9€ÛϦžRï·–ûƒÏv¶ÉÇL/EVIóˆïg¹èÀg‹Ÿ {mšÅNÕÙ]ê'HzêŠBs™ <•X}ht‰Ý8Ôø…_ŠÕǼ(]0×$¨¶Ée±¶x.êE:ò`Ñ7Ê. ±*”ô}Fµ¶±}Óð)œæntæØzḚ̈iúÙ)ä¢Ñ€«7{ G†/À=íÙŽ6vHÀ>ÌN û”®-÷½¾T3,#ÛN¦³8w/5ïÞz3ÿÕÞ°1‹g{WZ}¬åWl6Lb„;j¨ ª£i]GÍ»¶^ÓÌ* GœXáÝ’2HŽÊbùJ×ÝJò³¨!JJ=å„ó³ÂhG³ä¸zâõTÈäa£EÈxöRU‚ü  N<•@»¯Ž d[LW¢D‚4ìyˆ ål|’0NÔ'#ëÜù{á-™÷¸Ž‚¬ðœ8é‹èá‹q·Þȼ…p °‚¡gØu49uïpóiîdÇE±‹pô“ٞdzg KÄ1tVBHH}w BZò.Òû‘¾ˆóÄ(®zÂ.œ$©.f™þ|ô­@­9'vpð*|&L‹ê]•œ×m8#¢fmšq¼VFÀh…tr€ë$Jôè<ŒÎ÷SºÚøWÚN‚ˆ˜Û1‰œ· O²“¥„ÛÖ$² 7«• ŠEú]|©Ø•JÒr>íEa›ñºKð§xµ¨”Ç Çg·¥3oÝSÞ÷ûü¦;K²5QÔ!·¯u ˦mÞ1'†½%…“SŽä!üϲ £/5ÌÉhѨ>êP„$çYÕ„Þ„ÂhoÍ÷f¯ß1ÎÉéa„—H´¯Ìª?<#Σ¯*?®}‚9…·4ºŽŒ¹~ÜåÈyç÷’ê^û>,Ÿ—Ìáס%ÇÕâ´<ãgà2˜ãáǹåfwLJ¢5ót/¢‚ƒ÷ßé~vQ"/˜„Àí-i o/¤#è|¹nj]Ðó™v~ñq<Bt ±Lèü¨¯uœO›KH°O|é½·bš‘¾Ëó»Á!kÃI «£3›Ÿ76´Ú“¤Qt1';c™ )“4²Ft)ŒµÈÎú7ö !5Gž(µèŽwm·nߦzÁ]DÓç¶¹ÂÝõ[ôUò!"»6›ñGÆT BºÊk{óºÔ!;®þ[4Y_P³SÂ%ÂhIh›†J76-šÈ²R¸M2CÆ]66ͨ5ïe”öÒª õ‘ |ô˜V0µË>˜õ µ/øôÉУî+~®xÇÉ’ žç1B•½8<…·z ¡&­bæàæ>ÔùÁØþx%¹‰!×I2DÊQ…‘ÓƒþÛgËÑœ›s½×óŸð‚î\÷…#ÅΞ5eñ±x«¡äuÞó3D->ÄÛÙh™Ë*ƒ?ʤªE\ŒÑätBëƒîeršA¼¢§¯^Nl/\œ_cÒ?¿6ϤÝ[8‰€õÆrïïÑëönpi'ðéPzg-×>ŸRºéz󿇆+óó]²¶î?n9)ÜçôªÐ“dÒ±It¶Éî‹@£Q|›ãj¯ŠP¯s|é #?Û·lœ©x@Zdð@› –àÞÚÎëW§0e0¯o…eBdä Ðjݰ0’ž¦Œã´’\‡ÀwÅܰӧá7Ì·sfçi9† lî1à1*Eð¶…¡ 5ù¸›eØœˆœ”Zɺrš¾…É$ž”°=B;|yr‡@؈BÉ66‹ˆ\ÑsZêšxqá]O2{øüßYå>‘³;:5IÜäÝ‹uj_Ÿ 8&eiK@ø\½¹î\¯k yÆ Ë•”ìEêÙ\ˆM‘8±õ"8yFΟíäÊÄððL¿Œdž$ÈÍ÷SÿèÞ¢)Ž?&Ìwb^|4Ã÷Ô{Fø¹m’[¥ øÉ€M’W·}AG2_‹Ä£B}ZPò½µøèPð¤ýS~[.õiÿˆiéû#ws€:ã8èËe¯ÙÙ/}4NÊ. Áu¦8[Qvç¬/Û–À¦¡}Ìñý.¸E€‰ìÄe‘¨v889ªi<%@ûœTî#©ñ¬Vç ð@¨k' ‘Жœyiÿ¨–½R×En¾ºŽ%ÃÊ\“<øáظø§£A~n>6ŽlêÖÓrç‹ëƒcäª;'´×zŒ }Æ-Ð` Gp"v$“ú¨‡ëvtLû(¤¶ßí.äEwcP3þ}MÓ~í¢¢i+m f{wøœ°AF#4¢ãgÞ#A/·.Rç¾Ði0½`†ð ×ý¯M‡M)à<…¦{ϳhm¥Wt)ЪE'º=Ë̃äcþd„¬ðO×›ÍßÀË‘†‡‹³–y_»Sgw‘¥Žê7Yê“#èëÔ½!ú áÜ v1»B4LÌd{éù§3h+àv+yIouJÑUþg–%£Æóò‘|Q¯s œ/5\àh oV$niNåÁÖµë§'ÃIÛ>m~Ð8or!¦?ø‰hnlêÊŽ urPÈî~÷+¨D©ŸUN%Kì/–ûÚã«Uo§[eiåèukÓò÷Í0¯(=Äž6‘Abé±°,EÿY æ]¬}v8WÔ¢ˆL¼tÉ ÷Ü•ØO‰‹ ¡ÕáÞÔ…Æàªh[¶hà-& ¹éí¼&y“1^þäÉ:wú³âc]óg´x@¥\„Fx7¥HÉÆkѤ;BAS¡Í£gg‘|l7¤â¯{>’X6µ^ƒ¯ &Ï"mÒ®MŒøÇàóë©Ko"§.*¼È9ÊC ®eV΄ß9t•°O±z³0h—ÜT€:ìÒ>uR­o/Ö¥²Æ0  `!¸…ÊÉ_¹*Íh³ÂàÚ}Ÿ{6MT+ብðÃ9+Í:m©ê_w{fÒæŠžN j.–Jë¾=ßâÈX]o“:sºnýbÍúÚgQÓçØ'   ?-ºóêõø•ÌIêP‘ã² íÑmKÄäùO›œþ#÷B*›åú}w7Gy?ÛcŠhRŸª‘j««÷½ï+S!edì<îÔýjp:…NE@Ä…Fwt_+:©äiäYzå׳&a±è¦=éÉšñžë襮Šëé’Ã{Ó«©×]Æ-@›Ûލã#I2žTÐ6ÜÙç î‡x¯~œy‡!Ã’J’B{4îþ‡Â õµÃ»bÇŸ'‡$-í]-+?Wû2I¸¬:‰×˜ ™Ý6gS¹ùéíÓÛ–{oKíÕÈ1 Cü«;ÞºE×›äìúG%ŠtAE¼åN%³ÃEµÍEÅô T·Ky’9‡¤šü„ 'ÖN¼‰„D Gß(Þ»ÙÜd70OouçW…ë>µ RÒ§^zY7*¿ødkMB…ü±Ó¸©Ôé5Äž¼´Épü„V׌ yÁÔ)ô40î4–c(;\™Kb¤uÁmx|g}ôÝÂ㮀h¾d‘x>ø ÏÖŸP“i‡WøÚò¾!om±$ ={%-KYŽœ¡û ­’—õÞÔFÛ•hæÍkŽN;M¤†V×t;ë<7Ðúh„´‘@‚z-éƒç%5Ñý&‘u:(hy­&Q+—(±¾=nDxú2è¿<5ã½ŒÝ ‚i —å‡Ä -5ùê ‹¾À²1*ªêÀ,ð™Úz³C§Ø™KJ‡t‘ˆ€'D~RïoØáê­ ÂÀ’,ÖÝ#»)¯„ó¨`×≯^ª"ÀL´å¹×˜OË5Àè´Ð–êaNm˜¡>Kü¡Î!tV@YÙkÞŠtM´àÕ†,Í2ŠÊÓâY  úe—ö½wÊ^³WÚZ”¹Ò€¢F®‚) „zÏDÒš4ÑæES€L‹ÁëÓM§ ¯3|é·šÝØT.7|JŸ×cÞk¯s@B˜\˜ù›œ¡…Õ‰S”|Ê¢Äòð°r›žºÏïÃN¥0¡#î4Bûsm#´û×Ö@ È«mÍzÓÃ6§],ÆQQG²~b œQJ`ºð"7§CnSFLQ—}¼Èôù ¿|T@†z}éÃíÖŠ¤·ÏVà%]=§r"ùôÖÅm•á \ÃàT”F'Ž8»®FõÄ\ü¤ÊG…÷š–CÑT¢ò^óŽwTt+4H¸Ô˜AµÉ;WPß6t[‘U£( ±Ð+ž¾¿2bÜ}ÕˆÐtJë{yÿÝIý<бˆˆölLûx0\ð–nmYÌ¥+zÁ¸¼Q…MûÃNwcäa1mŒ¸1lÈ)iT9ÎGÃ.Yù ‚å|Æo"Ùæ.¨¯ÏY7;Á> Nî䀈"Õãø9|¡Ì×ÚiÕ uoä m»²-Ç‚Ùöù7¤&=VXw”“£³ïÉHÆÒJÇMkŸ½«•Š› ×¥¶:§ßN÷y nß±Ï#ðø…ÉS1&§ÖIq)_e#÷Ûvõs­ ´1±î ‹‚€‰¬’ކ(ðRHÇE_ñÈL¹ÜmÀùuR÷^¾JÎyj‚CcÆ·ÞŒjwÑrÊ+Ýs¹H^jÊIÃzS…ò¥Ùiö¡ Cg¶ÏÀزìy/¦âòx\oâ,hxªQ¬±!© ¨ÜLö´à•åVfT:ÚqC¼(ÜKìØèã´ÕH.™ÐÊ2ºàä(êž LŒ9¡¿ð°¯‰T.w ÐS?¿{ýJÄBÆý2x*ÚÑlðŠAM½ÔvckƒÖ ~ Jrä+ʃ$$Šž™²¾vµ·]‘¤MŽx*»ë ž"Y×kèéP Dàl¶²¤‹™‡a÷D¤Ís–æ{™`/´”Öøµc¡¤6I›^„€vZúF?‹<£ÏwßB.|ž>u=\>Á㊞aŒ&ÚºhݸÌÜá v¿†àé FUÄ?Ž#)¸¥>ÔV'‘º®Í¥÷âæÍK0²[2€U¡e‘Öë¶´Ñ,ðãç6K4ëœ[ù¢&üÍÄg!—µ„J û PFv&«¢çëÊD ‘—ºè?ë>už V?Æsy[ý¡ W1Ç-äa¸cw9ü´¶´å­yÙÜ’ËÈN XͲ]½ ìyÕu4± ¸ö…«SÐiNGž^:¯NDÊ¢;÷n**’ >5¡Ï±‚|ùÝV³ÂðPJ¯«rðlDñ‡TYp A÷p$¬ZÔóÎ|ð°žþëkÝífÍÝ’¦…áG"Oå´âݾ(ÀòüSð¶4%Ý”òU¢± jTD«¨j¹Ãý[À…œf1øƒqõ|þ+fj„:WlÄͶÚÐÓÞÉKŸ¦ÐOOñꩆÁo¼£g„'wÆ;,F°ƒ9‡zBü·8 ü±[s,Ax‹§1À—);¹Øòé¹F¦žošŒ›ošm¬NþØãPxy.xŒŪÂúê3»NÍßÄÄ—òN¦Ìë$Îg³-ߦ«§X– Ì„¬•U³êχ*`R 8Ug‹ÚÛS‘vx N^÷½ï6XØF/_ž«2áDÒÕ:U_+a“¬:_q(tP¼â{”B¶êÁ(Ì™õ‰-šDIàç ‡|G¸ùÌ*?6­"ªâ¹Ó/qšûÒuùî Þ{"?¨Ž_ ýL.ˆ~µl ²±Ì(T=ê/ ïd¥"*ʹ`h±ËÚ¾kâ¦P/²&ÔaL÷+¬£¶Í•áƒs¤»@£‹ßÁè4|Q}­¬Ý‹K}H­p`’Pàà•#h¸ÑDº½ªH°ÉX_©£ ^²“‰ºô\­Òœ¯æSú xCšŸÍJ"»¤ª›`¡ÙWhUùHl8f‘Шè‚2pâOî4X?~øäjpÔ ‚pá,jH@—_äÙžãƒ|D‘š‡±wºvµm ³ÿýÜÊi „ǵ»Laû@q2»oÍ')]W’ÉS!œüÌõŠ* ψ{ŒBK4Ï J#‡øúåÖ²Œ!$ñfH¾~ÿø"gÔyêãp•™” F]zà"gÒÁÖ[%:Ï¡aÉ+È;VšÀ‡»ìÏ>Å„®.qÝ[3ˆ< jøŠÿ-¿wˆ¹k h~‹­•‹æoÝ|ÎWXd]SLàŸ/a&¿È¸§doˆ64óÇtÌo²K&Ï[6™¡RÒ5_ÞíÓ©~r8_¹-'9^ì”RÀœšô;ŒÚ” ‹AfRa¸IAVõž;7“|НÅëÆ¼ëçîëê·xpJ“A|ºÖ/u4îZ ž7~œÑÜ“ —/[>_'þ1x¸Öä‘ÚêM—ë¾&¾mÅUP‘Õ·~ogñí3ã” cœÂ^|x˜O3êbR¿8ñĉ<$ûÂ(ñæ%ôIJ££­Øà¡š=ƒäNiTåd)ÂMêÕaä„xýû«DÚí„K =ŸÂ@C®ûñÌ·óìÀO¦µgÍ¡1ü£m.¨AMçד!/—ÀAoj*õÖa{geL äª7“·v ©_m‰„ز~¶ØírÏZêÙY)‹ÌÏ+$I§ÇžsÄÛ@ùsã÷ÛS2 Ì,Ã5nVsÎT³8µ¤mdVÅÒžÀ“¢ –„Aóלæ9Wªá/ŒÊn!/(€æþïôakãx'"箽ÌUD“wÅ#žpÝe…‘hùÛZ±vžA¿1.SÁ^EÀ ¶6˜%F…³z9Ä‚Ø{ r¨ËD°—0`tÈè§ h»¢,Äm,öŠ„ä\ ‚A†A+’§tTür¿B½?µ>F-MÕÂ^‡ ýÁ­ÕTƒ~ñ šÎR%æî:Á4þÕóñƒg7ö»ç´ÌOsö´‡sêù4ª£¡iAˆ@—YöUùdˆÆ;ï¯#y3 šÂ®ï)lDp«0Äf:@ÝÆúaô GâiR`*îÜôbïqe}©úºmF$r@•Æ¿jˆ<Å­j©•gµ‹™rÉX‘6¹v•ÅŸšB²;û±äq+y}°Rê.¸Õ¥W­­Dû>¯Ï]0}ö!áÓ1#NÓ4Ïýƒ<ä÷ýž:¶ñ¯Þ^žCÓà°œšË¿Lsþu„’1˜ô Â/¼§Œ»¨ß,àBµW_ãK)¤\¬'®£¯ä!á6—Z® ¡mÃ÷Ô8ÓHÜÜ?to*¹×Î?û°OÿÝŒAcìði×äσBD­~w¨—>Œs”Ѧd,ßwXt“¼ß2%ˆwï”ãI×¢ØBJöMæ17ÞÃ\³S®±4ÎDÂÐEy¦7# éhñ½ µ›à¡û¼'s •Í5z2×´à÷Mô®2ºâZÔl%:ÜÚ¼LŠî»¢ι8§˜N ‹(§P9*ì5V3ÉB‚Â)(q¹Ý kŒ|ßJrÚxñjíË©Šf•»¨3±T„àFÎr5qlOíczŠðÄc…è µ s×óNí‰{Ÿ>ê¹{ &ž—Dô¬Ärú'µvÅfûòPÙŽ™»Îy£ÄŽq…2×ɪþü"==)üðÙgxÞujQS) n­ÊçÞv} v<¬otx‘‡€÷/ªÙ³¡ Ï;ËôõhŸù'ßë— öœ*çèk¨ÅÏ0¸“·äûH¬—S\hó ð~#Ÿ¦ÔðÒ7®ô-ûŽÁä˜Q5¬è²ÂƒúùàúýÐÁ|'A9yïÞNÝ Ü^¢³¨fnû‡JÔ½ë•ñ 1TŒ°ý©ÃTȶ4-¦¿†ÖЧAýÅ¡Xê4ô¹î^ëÄiï¿ÏO_à )Ô3 ?1õa04õV„“wIcÔSöЫÕÌ7ÙLâBž^½'¨V6ñ`¥›@¡%¼JÒ~,à=.®mÂvHÕ:Qk—íI ¿@×p[½UV)ÐDWø”7Ѥf#›zÌè)YÁÖ †Ã'iHQpÛß×!Í&ÂædI9šÛÛÐ9|¤ÁãnÔåÔÇÔÌ…”n»­ï™mèŸ{°¤rHxü ÷¡E© !7ÆD!M®$öдíw¾D1=oÊ=ql£H2žŽ‚oì8Å€8¶dMƒÓ\ÏçòM¹Ñ×=Þ|s)Ö²®…™nnØZlÒ-i…N¨€*Ö’ÒAÛLjvt9J2<Ÿzù~Ê<WíX±ð|„6á“Z¤¦)°÷­§™:ÔÑ¢\Å4{zÝÌg‡DÉû ënÔiW,ƒFʦVëF©å[ð‚Œp¸ÞOéq•éÓû So¾ lYS‘é)‚ŸŠÁ´ArL‹14Õï¹y4«¬ºÔ´¦~9µì•ßÔ¢>´‘8òš‹œ‰‘ŽëêØû620-“*/>5@z«4Xœò ãòz×6ýÏ¡þ¹®ö!Ÿã±ý%WȆ ®äKCQEš´ÞCº§K¡­"Á­QE(º3ÎZŸ=ea¿´„/?Éj¡/)2^XÉRw:¾Ž~}Ô„µÍÞ¤AŽëÙ¦›˜×pÄ5ª¾„šŠ´NÐ3%¸¢ÓÿxY¢½dAÿ˜ ×ÊÜVØÍ"ŠVÆæ¢°²óJÏ;r-8“ýØÛç[Ófgîp4ôžîM®ê-ÒEŸRÊz‹n…v€vö›ëû,ZÕÉ­}·µkˆ¯æ#ÇrsÔœ _§tw'ò©\d½:ô AàZ‚ á³BtO]{“ém®ÿ¾ð„ç¤DœBGÊ*¼èù”3QÃæ¥èNXØÓ–§N/Êtß<Üå=9R¯ìLœ"›ô¦©9€ðxêü–è÷ü ÒþE'ßkHŽæ6·lFâ Uêù;Ãë2ζ÷=œþLè£PQÀDžÕ%ä .÷|ùøÐýÔ¾'º—\ )Tr ÷ç{ê¾äKqåöé+9'Œ9$ذ°ýæõàÈum†õ‹¿bdÆ>mÄ Ï^V¬^ðÿ«EΟáÃëÿ0:ÿÁì•ÇŸëÿ¼<|¼Bú?”ŸG@@PÅ+ôSÿÿ[‚ø9Y @_SŽAPSeЄ_RU’a`ääæÖå—áæ–d¿Dpñð2îæÎöžö.ÎæŽÜÜrêX˜~)Åí¬Í­$Ŭ=Ͱž39­Ý¼ì½%e0sHkgON¬c]F¬3x웣§µ¯çÔ‰YÚ™»{X{JØ{¸p CE8y±8=í=­%pÑ)Ê€•L¬`bä’ #– òöŽÖ °ƒ• g¬7î/‰ˆÄí~ôWúÕ-§¥‡#ƒ»µ£ãQ;kkOFO i_)¸Ú<(ÌWÇ›ç89þáVÔÂAö º¯>;9910VöÞßœ¥ºxeüÎ}ê×/?„]ÝøêET óøÅù¨¦¹í÷a†@†?Omg¡ÆÝÒî››Y,èŠß¢þ"sggOl¹~‹ë²þ/áÀºPñøšË’5¹—³%V <~K‚𵓦Íý%4¶Ž.掿¥ã_Áኩÿo`ÖŽØzùc<¾8±Åp+ó¼’ÿL1 €5¶v°k&^VÖ _³?p@kgîl…U[O ˨‡¨¸ÖçïŸ8ßµÁüˆüÖù®*†Žß:ßÅ|ÅÒÍÅð‹_[&S+L#µwÄHºš‹»5€HÜó{àˆ—é+µ ÌŽžbžVö.\v̶žbßüôbéû=H?nlSòøËИ~×󯣶w²þkÀžî˜JýK ^Î!µúK 6–ΞŽ ò_ ÔÊÜý¯Šaµµû_¨+7/ ÀŸŠŽ5ï¯Gx;N/wKë¯Òó½\ÛaEã+ÖÿE¶¿ò ä剿?Ìø ö²>S¥¯[Y»ZcZ±³¥ƒ­»¹«ÝA³úU»Å$·Ä :Öî’¿q×ÌÏm%`ñ;Ï?V9¿÷ỒќÌ]1MèWy˜b¾~õ÷Œuçü57"qÌggs'Ìèò{ 0æîÖæ?V• Fû-‡¾Ôƒ‡9v¨Â.™cÇR a˜Úæ†r@…9øD°Ëé¿Pñ{¸1¥µáù6ü9v^~A> za~a‘?ÅÅÐÎÇõRenõOÐòØ8øø~$3.bû¡÷ßß×¼¥µ££«¹•¦eÿòîájnùõ›Äý‹sñ(ù„É ê,ÁÈÇx Câv|’:æîöØ<0:æí÷ýân]ÉÓÚIÕÚC¼³‹Fʾyò>p<ÎÈàýõÕÓÅõû1ßÜÙÒÎÅñ+ûÍ¿ºù>Ð%°Úˆ§¹­(ƒÓÁÐôáÅô ˜g¬ªbs–ÓO`p2~Ñ5þ½#×î›sö_•öc-\<=]œÿÌ3üŸÎ!˜°õð¥pÿðPí¿©wÌ`iyPëD à y’²Ö6öÎÖ .¬-é ~›¯Cí¿$ÅÊÐoÕc”wlÍ|áø?Ùƒ’b„LöàFƒ”ÅPînïŠÕy¤è¿IMø¢X9bZ¦}yJŠ[a~-$/zybäYTœÛ«a?[Iªb4w]kOkǃQê£Ü:zºˆ:bâ}¢¥æN\_º{L¡l­¹œ1ª·ä?ƒ8P̘ǀÉ[ßVŽ¿Kœ&)¦6¤Ž‡‹÷Ÿ$“Å(x?¦áÃÌE¿KØÙ{0¸º»`'Ì£•=V¹°ðÂÎìbçâjy0÷d°÷dð±wtd°°ÆŽ6^Ž H]%@Q0\T×gнƒ]TôÅ0˜êÄÄb] à±wru´Ç õ1wÇL±<ý°ò«&“QÄÀ_¼¤¤ªè3`„A^ P—ÓÖf×€1\dм”dàªa˜iLSC[Ž‹á€æiÂÈÍ/Äc:kG{ÌÀäÉà 3fºcdì’¶,ÃÁDè[ƒ¶µõ92.®~X™û^,­¨>ˆÖÀŒ»ŠšJÿ¨Lí+¦ØŽ_±ˆ¬µ»“V¤°2îüýtŽÁÕÑËS‰jÍ­Ì]±Ujãîâô¥2\ì­ì,Ã_ °Å2wvð`ðtaø"ø€‹“¹ƒ fcko‘ß•@Ï(.‡_ ¤m,í¹,±}ØF}“¹/ùhb¦S˜ºÓ6w¶uñ2w·úÝl\=¾EK[c¦±žÖ–v_2ùƒˆ_²°sgð°÷Çt¼ØNÕÊÊÝÓèX‚é÷±}®(ÃÁ0#†‰öp2wt”üÇDSãj˜ß‹®î |‚ ¼¢ü¢¼ X>`Å“gÌ´õK?Jô íØYº(7·×·ù1¦ÙqL‹¾öD¿Q˜¾(Fƒö×/ŒßFE 㬭¿×š:À¯seqî/¥À|úRXl÷ùuš}° ùÓ²ÿw‡×ÿ„ÿ/÷ @…„ø¾ìÿÄÚÿîÿüχù/òßÃÞŸüÿ;Âüçåù¯á?ô'ÿÿ–ðkþÿÎþ/k§ÿ!èŸìÿäåüÅþÃ/Ä‹õÿËósÿçßþß³ÿ|“KŒXþ´ý´ý—Øþ™TþS{&!ÃW$¿,úüóen+A¡ß.óÈ|A¤!æ·«=ÿˆüŸÛ†þÙš?†.^«ßÝBþû«þ_ãÿ]&n+sþ?Ëþœ†þ›èàç¶âý½}í¿OÁ—èÿ½ñãWÂø§F> •Â6ìÿUkȯ2ýëV‘ßKø»†r.ጠP~~¬½{ZáO- Hð÷„ö«ÔüY&|ü ž¿b†ù“£„S^¬ {â?e2ù¯eÿßuq?×µ®kÿÛ×µÿ½Ë·B¢¼ü?—o†¿9ü8ÿçýïYÿáû¹þów„ùÏ÷Ï~žŸ÷?üáGþóÿ÷ð_ð'ÿÿŽð#ÿþ{ø/ô“ÿGø‘ÿÐÿþCÚÿ–ð#ÿÿ{øÿÓþ÷·„ùÿzÿ×üÿ©ÿÿ-áGþÿßîÿää‡òÿìÿÿÆðkþ¬³Z»øU],þ÷§?ÿéùO>Lä/ö(?öü§  ¶ÿÿiÿÿχÿwìÿß %Ãuø§Ñÿ§ÑÿÿÆèÿ§¢ˆ‰ÿñ Ï×\¿Ktp”GÛËÕÕÅÝÓãëÉKì¹E¢ÿ‰9ÞñŸY¡­yÿq2ëGÛó—Ï_mÎÿ8`øÕØlgínïiŽ)ƒ•½ùÍkø®(j[æ=0¨þzHÁ”𚚘®ÿØ´l%Ìm%lÎýûiÿa_þžÌŒ`pþ§èþð\Ï…ÀôjVf­æàãááàåæàçþ­­ö[mÙ`ºÃ¯$>FIC 1#‘­µç—Ód?J8¶T¦ŽÖ˜®ç[sýò‚åš±87Õ?Ê,þ«Øp[Y™ÿ† œ_ }zl£Åšç̾ňýü4ž¦—…£½%×ÖÊ ÿ­Oø›ÎæñþÙÙ¼ï]4ø‡üåtï·Óy¬l_ÎçyÛ»{z™;þûÏÕý‘nÆ„-Á÷¤tw¬lÿ¾ãužî^–˜!ø·gßþ3áûËùž|À o{«¿“òÿlжöd0g8Èæobÿ_fÜÙñ;Fðÿ·0S€/”ý›Yñé¿™ ß*ÉÂÅåoí<%w¿ÿ€À*y(5 ®.ö˜£ÚüC³Áf{ \P…¿7J¸»xbFYŒ~Ñóëv•¿iˆpýÓãÛ?´ì)î_Z‚믎n»~ÕÀœ0¤ûšzþ\Æ–à iÿ΃×åøÂdï¯êÿý§£_Kþ¢Û}‘Œ_)˜9š¥—F2ÿ–?ìäþ2k¿¶’o½œÀ¯z9ñìÂû¥ªìë¯ô%¾ßÑ—0-[Y ؇ïªæâÃøå36â î?×½¾ß¹ó5áwÈ¿½~—Å/í⇖€í„~¯ô ß¡ÁrùÑþ€õ;aú£$X†ðþ˜î+m’ÿ³L¿äÉö²þ%£/Ó*ï±ñ·Ý·?$þ"Ù¿<‘ïï‰ûµèÿƒs¿p ú[-úGÎ}/ß2ûºìÇz8ˆÿ2YûM‡ûG»aÖž^îÎ?nÄ(yÖØ½x6˜™´õw»ÿ¬d˜ˆÝñiõ}ƒ;˜ zb·ë}ÙøécîÁ`ûËÊ/‡¼m\]|¾mÆÃÐâåx°|óg]Ü_žÇþžŸíÿï ¿çÿñOLI Ø+›x„9x¡|?ÿßÿzûÿ?âüÓý¿_ïÿú¡ý þlÿKø­ÿGWãÀÿã}}ZÌ?ίþ¯±WŽßåë*((ÐÕÕ555•’’ÿâ’žž>$$çÀ¤lìÎŽ )_|u™öÌèIÍã ±µÆñ7éÖ™çHÚÆ¼¦³Ü†ÂÍß]2»«>ÙRf™ªØæ\@{÷ýŠYÞÒ½ÛKgÊn¥OÁ㥓â8$¾C!˜áÍ»éìù¯ òà!>¯öt`*óݨ\3Kíb |Ñ k­Z Õ¸©«6Ò·ÂIn2~¯ž¬¬Æk@O]u±Yu°®_ßZ´çŸÕÝйã¯1„Îvµ^gÅ'äu=¸¹ʲ£.¬ÒTÏË]ƒº^HÜ”â»íoЈ;o¼“X£Ë7!È®S8ý¢^¼–—:Êçä¥ó‡¦¦•2»S¢*I¤n‘TвxíeÞø@ŒBÚ}ΆÊ@‰Œ·Òü(ÁsS<äi‡ïמÝ×¼:\‘zÌÐ¥H¾€pí¥So¦i¿üÉùéVòÇÒä—·³áõAp ó£rwÐŒuⲿì…5Íeö)K)ä„ú¥V•϶³×_ôõ¬ÏÙ÷r£†)wÓÙO^CÑ|J¯@}žâ½Ö›,éX%ê“ë]ÒBæ—~EdßÓt¶Œv\‘¶˜9Zf£¡‡þžùö–š<ï:%Ȳ,xPd>¯í²UÊÒ»ëüû7¦óƒñÁÂt¢û —S·H`R…ùÁ*q÷Œ²¹v¸91í½P{¿0w1‘ú(Ý^HöÞ ÕýÜlÐijAªùº9 I;êuáj‘ˆ:2©¼twˈN¨£²£šQ›Î­”oï|½zúÉ‹†5§.Tç{ÍKv ÄÀ6ìzã·ú5 fÉå—œ•F@(C"8)7Á̺>ÓÎâ‡B_¤÷ìZOÔ÷y‰ÛYMGÐñd½9eôrÍx›¦8T”/‰c´ôÇ‹²˜Àݧ°V^Í®1‰¹´³½ãÔ‰{5û“S¾Poù.SÏÌã1 ƒ”cÊÖÔöó–O;¥U—HV—ø"·TTjŸ¶.~ÎRë _ºLDÀ ¦*^+ ¡E%JJ¢U¹æË_]·¼ÝÖÖ6ã–òÕ­Y<ž,þcaë…UuYŒzõ5|nˆÐtØÅ–g¥HßjÑa´cßñí…h<_Y°dz¤·ý¹àóvñY] Ú5¯¡Ò~#€¯·t”¸"\êíZÅ‚öÚÄÑQñyQÏc¤Ï¼hF,¥«¢½ø·¼/ôú-Ô§+û³ôú²£”àcë%ÊóéÚB0ÇódÙ’épé è+´¶Ã}Ñ®F‡`ÄqVòæ¹™.â°‘ÙÁ»Ž†i2—‹oX¦Â& ý>–ï?¼[9 ê˜Ý|_MâK-ºÙu&2™:G°ü®Â ¢±Ü›ïF{7ßÜ4_ ø¨©YB–…¿«ì©É²4|šLliÆ÷¤Ã ¯æVilQ©Ö `í-Í.µNU'+Põ:] x$öôåÄ‘ÓÝ¢~N]½º÷ßeι=†SŠK]¹…ýÚn«9#jš†VY^“©í4³¾äéë*˜H/KösA,e ØgèH©d6ô nfEhñ½S©Bµª(‘ kThSÊp%塈QË®­Ã@FäEëíR9”ã~5,[ç éÒÓ•ÐùæÉ®á½¨A¹¤Ð™æ­Aüà=‡ ®©Y:cöÅëg÷ÉÏZ¤h ;.²Çžµ+ú€³¯Ô ó±d4Š5+‡‡’ò—CaÖpvÓV rrA R›{»š9[¢út~Év§käwu‡_ÈZRTã@›ñ©´Åâ)óä×¼dÚß{BŒ„8âÅqJGo–Ò Êƒ1ÿÒ˜2"íý@Pg~7ß]Þ‚ :8Z?ãÐc 0“­î¿ñv†îîvÔÒÏB•À*”àšcôV);‰ºùxu OçKS{µ3Ðá»L“ú[ˆÉ+#Fm9ˆ8òaAõ]ž×l—œ˜'q?ÞŒ¡—(Y§’ @ÜòIt~s—#èšʤž¡€»ã­0_MÊ,æþLÓj:MÎb›[OžüÐu±¾èõYÌ´ïr¤ååçaŒ¼¸·ÿº<ù†ÅÊ*y葉'ˆ<Ù¢e$锨ßY1Tô"•eU„û½rZ¹SScÑ´*Í"¢™/6ÍuZî-Ю·¥+ fPŠžg Ì>¾î@êÙ±£KIWƒ¾•Õ±ÓßÎÚWj N½bj~L•2‹÷²yÿÍ"j8|;r ’8Ò™Iáp"z ožRZz Ó ¥MœZk¦·;Uc3Ë~ïµFtÁ©š™¹BçYläµþ3îïxô·ˆš2ÏCULËM§‘ƒ[þç”àhå  EàÂà“«M,æU8^uâ¶r(5½^¬y¯U° ^uòs¶LæCòéN"‚¯¹:UµÙCxÓ Hâ̼æm½íÎLù5r]q G„¬Ö ViÐï;=@ýÌ¥ka)µµ¼Ó—«¥Z¾“˜W8Ûïì*ƒ¦ÃzJy÷Ñ̈ŽËÙ:óJ£*à§ M˜ºñõÊÃíŒ%ûO²ê'ÜYœ e?•_SâŽÜø@šç`̼†œòHŠÔ*øœaL€ÈÕ»ª6š¬V~Ãfôýhj”(¬t”‹‚è.‰ü(Ê¡È]œÆj°Tü¬æælaà á½B»I+}äS£ÏÎ{J÷‹;Gɽ”{#IŒÏÅÞ:=£x­ÿÐÉÝ“,ÑCYËäŽ=ÐØa‹“æó9”‚\-/?¼C0€VÏÙª‰¯õ욪ѓ•^‹’ó­57d‰s?ê^Üö2äxX€ßÎØìeWNˆék׫D»tù èjÛÅ!G#åT)…ñÏp<¤ÇÍY ¼¥œ€Ðãxè¨êU pLnÐË(ÜASD *MI±;Jýj`aÆOOo*y¦Üms¶ƒ«7uäkµQOITœ¾`j©¿p\J׌~ sǧsÖ¸2¾w`°"ßšµ¼ÞL Xº¢:ç2aÑkH¥èÝ¥YÃhk­áØ>LILA¹”ҺMmÈR%Û–í-¸ìЫg&­Q–&„¢ÊoÔ fð<ÓQÆ‹n‡ –¼öY“p1¥h9ÃZêTu¨]3,:ÈÃs€é‹>.c)µ°¥cÙƒòH-i½ a–D7 XPåÂø5Ô…ˆ:óêœèÿ½+‡rýâJ)¡…,i1YÚ fŸAHHv1öe3ƒa,’¢”E‰nJÙ+D¢’Võ§h³Ü¤"-DJ¦ÅÖÿû†¹™”nÝ.Ýž9žÇÌó}ç}Ï9sÎû~ïöýNYVJp[é|‡Vz+¨® ?¸¥5óù‰­’ÿÇm¥&¡ë>tõ½yå™ÖmÕë%Š—’»“›®Û¦f\x®†¸£àUâJcI›šæ¹‚=i¢øýy‹f¤•´&ß)xúÈ6'6×Ç~[DÅÿú"\1óC嶤æÔñ»­u:Ùâb(îXRuÚ[à}Ë:Q¹° Ù¸~fd„\…p·xF鮳Õ–â×5m%mL‹Têƒï›vBªø®‰ÐÇʽòmIY)•ÙZ¢yñ†"Ñ=­ït¶Ÿ}¹Õãm|õµ"ìCê•̽’¥ zw‚ÏàXJëgèg„7[Í÷8˜“fsçЉ£)b=QK•uEöÜÌÑZƒõ¿ùgÖ¥. ]½Ž8åÊYضctX]LíkVÉ5,Üú”Cb³•'.ñT ¶Ç8V„›´¿y묠%¡åÚÅ`§î¥ý²k_‹:ÔqB½ð¦m¤ÎÌéq ʇºí{õG»ô/3ì1}8Ѫ ]-zsÏ+çÀŒ¦ŠÓ¬î™l/]’(ÿ²$M¯ke†ûî¢w‰†"â&¢ïœ-›r &ø˜£ îÝÈ‹“/ýyW¯T†Í}"óøa6[ ëÑ¢wå:âïêÕ5„(ÜA'˜lòÔv»pr[9ÝÒAvI…ÑΧ9€§Ö½¢—·Öz TŒÝ‚%n-ø™yk7N´&$Têk$–îN»ý^Aĺßõxföb˜¡EWu%p“•ËqgˆÕ2Š]aMÞí¤ü<Öæ){Tˆ‚N‰ªZÛ:`röl§{¿áV5ŸbÑ›¬$ËøT£A™J‰¥z€ì=«ôe—œé0,šíQçP|ÀSý`áõÂu­EJÒÒ«Ayk­q¢ˆ®?´u…`_¢˜ µË0L_û†¼‘¤ˆ,cþ&õ†ü‘VZªÆ£jãÄkJ™×[k[¼6Ø‹‹ˆ-K J™z@q³$³W»o 7 –J¦­1×—Û0 _\Ø_bkín½x{é‚ Ã¦Á¬Ýï³w±†,¡;™ÛJÇÇ9Ï4p÷’§ËöGàC?xÚ¼º0ß{ s9{Ÿ.ÿ´WEÇòÕ^ÛÔŸY´ûfð•‹  ªzø#É4ÅÇ9”^«‰Ì ÑýØ.yGÛøc}ÏÍS+ÞíKܧ1}_2BjD ¶­±ÜcZF¹a-=35ieQn ¾I25,pÎ;sQnü¡$’âä£;„’tô6Åùý2 ¹r‚’˜²ò¢Ü9jÆ‹tsÇ: ›‹ æn^¯l®‡5RmDôô¼e­ÿS9ÞCýˆå\Õ7ÛMc];ÚƒÝÛ …‘ÚhÉæsê>b‘¤¢çh’F„ª«L75X"Óqÿ“8á—J ¶_:áÚV@¤ ÔM™òbUfÝ:#ÁµM¹PŠý†€B½-»kžá¤{ïQ…^W5®Ffüè¡A.‡…UÛ_ïÖfÅ‹¾ºL´»ûg¢±„pÖ©=N­H‰’°ÝT™ ì‚÷Y<ÎlŽ5£¬“rF7ЖÈl,÷o/}¹­õ´¢RÿéöºgŒ¼ŒÈ~&ýˆÏŠÅf)‘z'·ïÓ¬-u‚nH=zcép3µ ¼3è™Bªµ’>êYv¯Yg¯siØb©ƒš ¤úÌgôì¦n¢¬jŒ‘8R¸++VÝ1'µDî€z’–£m·Gì*þÇ9˜×±K›_ý/9ûæÁ£WbŸ»¼ãKà? hâը࠻yžTr ÓMuB¼I¶»/b/8C¡~~º•ôž'ŒÔ:ÃÇ9E3&—#IA4ìµ¶+ÞRXJtlR;û\4½Sþô['Á–Kâñ¤£{ Uÿ¨Ø>ëˆetwŽXÎÜ UøfÆ’ýî­ÔŽòÈY¹¬êè’[‰,,ãÎ\¿Uá› ú×7j¨½Õ½bÏúÎêa'#l¤çISuXŒï¦*õ –<_ªÞgýtXAd©õz –âäFÛÎ(E×ó…ÕÑ¥Õצۼ¨mo¿OÎõ|Úº×6rÏm†^ÙÚ”ãÛš”Á/~•O­pœ¿xV’$r×ÝMû6É£ºæv¾Ë(V†J¢ÍTkÞ¤”ÍÉ^/Ÿšc«WLnäªI6‹—ž§vsrCùòª¢R"»¯PyRëžaþs ÿµ“Ï••å0;Ûª¨Ùį#ƒ=û‚`b8ažìágVÏ%]žœÎÞÀ2 7¹ZÛ»ëlzýƒC¯«¤Ußǧ>)ʵ+¼­Ô½Ñé¥ð4ßÎ<»^“N¸°Âëù;EçP–bq¿] "¼ÖáÞ½2³çª <šõfÅB™ÊN§º=¯?ôÅt\,7ãT7³•ù4‰îTWºËµ]ìäÝZ ‚Ñ%ð¥Á|ð x¥AäGnÅ¥l]e¼æâú,Î?y´còôŠ[3[lá<·$J—ÚͲy3-Îê,Ž*m¶Múš_q|Æ1ÄAËŒ¤î-Ûoß˼{PsþŽqûš¶x5ÆOîåg)lª¤-iؽ,GÄœ\Vàa§•}4Ùª¦jÉ ·0;-£¹ÕL›Ó!µoà{îVÙwå`d–²fVWIë÷è¬êƒ¾¿r!°¥QAýܰÕ͉Ù(ÿÖéEyÓ™¡ÀÊ#`Ú˜¹uïr¢Èx=VþSþ©-kÿŒ?¥½#U²P-ôÒq]¡¨Ñþ‰‘ýáíµžÉYG‚%œ¢N œ…/ƒ¦²òË’–m+ï¶cÔ/ï8|–윳‡•7oŒùØ"Õt;Ñ0,'j–ŠŽ“~PºÌÖÞîîù…EÙE-Ź'26ž¾«zZ‘ö™Ü‚4‹ÆUâd–(öœd¼µóqéòh{uû.ÞNôÈ6+¹¼³¬cŠœÑ™›Áâñ5ø%K=m’šo-¾µ%5.r ô˜#žH}rØðä†toVµg“tRj޶½‘# ˜À‰×Ö oø-Á:5Á3u›më¹V[Æ£xyF‡À„ªÁn9ºWoÔ´]Œ¿ p§â¶ÊÏ›Õm˜i[­VsÒo¤ Ýå$?·¶d„t’>úø_cÅÁܲ—àØ#¢~MxâÍJ˜q+Éxi£ÿý oë} ±Ý)Aõk4Å+w‡ùo%®ò´]41òð®Ês`’,W'š›TÚ±Êù½áÏi4îåã·õ.ê—r3 üñ Æ{‹îèˆVZª™rwAµÍý¨úÛúUA Ïõ³|# ÿ˜ö*¨:MnŸ¨—É.e)âã«îm„-˜ŸÑ.|)ÅôÁ©ÆûQA§T´¨ú*"…#Ë=ÖWWü·6¦M˜LâÜ{LwvT™D ~È…nyûl*JBÃ.('©¯ø˜HµDÑ®ÛðÝ3ÿm;'®îh™Õnq3œò<ûT,Æ\[È~/¿JÆâ§—]hãê«"ÑKž^:ÑUý0yv¦üäó`©=~êOˬ;!à­¸—U% û²XÙœq•¡Û5œI%¨x®Ó{CÌwk{{Jâ 10ÓE“†A] o`/reu‚ëìÇ¥Ïh¾NíÈw ø ôLu/_:V»<úQâÞÿ[ü? ……¡Ï!yç¿Fƒ>÷ÿç»þ\8?$ãç?0ØÏñŸ0 ÁÛÿ úïà? ¾æ;.ÄÃ{âá= Þ“Ew ²ó:QýÀ<àk­à›¶4 Ì=1§3Øy²_÷9ɉ*ò ï †\×@å ƒé+ÀhAÄžA# hÿÂîñ„î|xÀ¨›ìBÏj$GÄÞs§<9ÈàˆPéÌüTç'Lk\ÜH>4º†¬œ+ ü´Çåó:\Í ‹Èìñìô&?Q»Q6ù§:p‚À ño™2ø^½/ÃëÍúÍFŠÇb*Ò¿£# ü{6"lü„tó[Z9SóÛ;Ë6ÓìÉk;Ñ²š¿¿‘˜A#ó¦ùüÜ€Ncn)¤„‡ß12~÷üÿÂÿçá¿ qûÿÂÿç­ÿ qûlñÿyø/£OÜþÿ…ðxø£B\þGþBø?<ÿ qûÿÂÿáῌ qûÿÂÿáῌ qûLñЃ„!ØþGòÆ£BŸûß›@ øQ½p¯@ 2Hîd·O8©ß/cäý8 4vÎþ? ÅÆA¢`¼ýÿÑ ÿÎþ?™``²ã’– X/Üæ%ƒâ›Ã?.Ùg(lÀëÁí{Êà©6R6¸¢ì 4pO¼Ê© B&2ˆj ²þ”‘v¯‰*d’ËpüP ŽV&}í6h˜ò, ß•ÊA¡ù݇äb«üVW’7ƒö·8™Þ@ôÿ«êò·-‰+}©ßæ\Ãô1©‚.÷óÇ%L†LÎ Ã`®­ÿ@àMé=’ÅéOÒ…¢BFQ†éÂdPi#ërü,°€è!:Ð)r¿ª‡ág)€B‚î îCÞnÅ °’)¾ ;õ&$bc÷i_í GÌDnxû⎂ÙÛH´¯§ûªà!¹ã¾’*nä¢_ÌGñ•a¤lq(,ŠDb¡8 ŠÄ †ä‹.ˆÞä›ÙHB0X$Ã@q0  GŽ(èÙªÃÂxÄÚšQH«Š„¢0èoÕŽ&¹•Ž(ƒƒ"€pAŒ(è(ä‘:Æ‘!PÀ/„ÃAQÙ@ËSuýrËÑãU(<Žƒ¢1˜áNʽœ{ç?0XùZŠm&Ø4pe81Ô…ØPë(4NÆÌ€18á£Fî°o/cOö”°Ô¢ì Ì4¿ÅÁÉ¡ ’?å ÊYE™[;˜2üÅtq(wð Â2샨¾tvžNà+™ê7˜)‹}òt“»/øBd@¨ H•Fƒ¸PÀÓ•IƒBNˆ~¥™¢mj±Ñ¶°Ð6ÅÛ©œÀÏ Ü¥øSê¡zùÒ¨@µD:0'd‚G]Mô,tVüÚË Œ ðv`2™xS=KKÈ 3 ˆ6Ä\Ûo ce¬mÌ3-ÌÍ,õ”!lÙAFô&ÿ¥<ÐÔ 4*Ð/û2˜À…!B–[êÜàÜR†XR(lut||9¹d8ÑJfk;m<•Vš|úA8yj³iƒµ±™B÷òSþÉGF°jhôoud„G¿q¯ÿ)þ7÷þ/ÿ{TˆÛÿcúþ…Dñ0 oÿoésÿ53½¨8œ†³À g¾õÝð#¯ÿÃ8øïŸü—¼õÿÑ #Q€Î…C¢(X…Ç(8‚ìJA ‘¨±ÖGÿ.ýHûÿ^øoµ4ýyû‡Ãá¼ö?ô%üw˜ ™âòy$ .i3U(‡† (à&N`ª:¬ gςơ¡p´* >qN)„ ûJÌ}*‹ÁBÑ8‰„âМ’$²+nØÏçR±p(‡`ªP$Ç)‹T!‡–%û€»pYˆÄÂT!hPWä_Q@¾¾ÇõÛ Á¥<@ŽcËkçþ úöÿÝðߨÿG шaíÁ{þ ÇßÌÇ7nÿ}õ•¬^àC~ÿý#߬Y¾hïZZZ!!!>$222|lØ÷¼íF>nØ÷™ ì{•_=FâjJ—™­Ì Ïü}†µ ›>Õ Ø©YƒÍÓ™° ¥N?½îJ!Ù }eyÆÇûã!W² |—ƒø­GZO=OF[tíû¨µó_¨ß!¬~×s¸BN¯~”rô§yª§—ÒÍÏ;¯Ýz2–7NŠ]KJ*ˆîõºåÈ×Ú:I»{…Ò Í¸'Û®”Ä]›ý^hÂËc:ÇùgAßùϯ5˜Òvñžl³e{¼êÄC$šaŒeå^“èRn%¼¨x`›¼R}—ŽS«l‚lƒþñqk¯4,vh±É÷J˜f3ÞcáéhǘˆGùâ>O<-ÆkŠŸrŽ>{$s¼oñ‚d}ç=ëóÍ»ýOHîR:à_á)«¤§áXsYá¾Aš}óÚkW/¯½Uݲ ºšq›jõ•3®"Ää„d‰yú¬P‘—u¤æ 6.R ±v‰Õ”š+Yßÿ"8zAüát1ÄŽØûy×{’L:ü€~75úŽ+Zئ¢t[»aJ¹×l°,ôl­`ˆVP¿‡?öñÛ õ¤ ‘Ú‚ËD‹V_ Ü-ò¦+ý]E{äs*LºÚÖh>{œYLø*œ¼óiz‡©mwüq—ýSUÍèÍÉ×h¢Ê¶ zämšKµqg\C¨1Ççï…½ÞzÞ²Y^mvôÕÿ³wÞQM¬ï¾Ç[AØ‚4AªR$ÔЂ ÒEÚ‘A:„ „®Ò{Tz (‘:B$HB‘. *¡#% ED.î½=ëæÜ»Îùs×ÉÎZ7Ÿ?˜É;óÎLò癙盼t åqWnÜW­ãJaz.¹?ë›ÖyiTþ-Ë‹÷ÒŒìÍžò´y<†ØÏkðÐS•ðtPš2Q‹g‡µŠÈ•×yÉ…˜;e&ahÓÑ?Îú:Íä:e4©|9©<ƒ4_jÈdý¶³Ú–з™î†Ûr××tdîgÄŸ×04TF¢ØºægÙ Né¡ÚŸ¦F¾°ÅKùH6ÆWéÎù×/pÀ®}~ÏS·¬ Sû|bø ‘Ó=>øä™Ói%:Û ¶zÄ‹] >^7eÄŒ‰q“õ©\üÙÒÓÜMü}Ò…Tm9Úî´Wñúû#éO }J¨Ba11ð”þQéî§Œ0ÚØ#:/ÂÚù•¯ºÙ‚Œ †Ý0‚ø9O yLîó-A¯ó>%H#-yXR-éÊØWFÃcï)yЧ@Gq,¾¡´ý‹–„±¯p¬u¼Í³ŠÃÞ612z•§ÑWðnôH.)¢¨k­æbJ|c`þøo©CüìÅ päJ™${å$üqùäbo’ΑT ±\‰ñ¹lSóm€†„éÖ’~ï=~æJzôˆSŸà°HE¤:Uçƒé‰AÁa¡Ö¡[žÀ䆂£Öc‡±ô­iW‘éw^‡q¸}O «e튦™IÖØ¨çµ;±ç=?k¥Ì^? Æ ²7ÇöìËæ }®ždßš T“\x·¡±ßaæfø°*EHjýüùRf£w_ÿp“Jò䱣׆øØå‰~„»£«kScL¹÷õt¢ÏÆ5 £—"Î%5l|ß4ç‰]ðSg{«U‹êdd5N”Ò¾t®M$ÇÖÀŽ \‡c§¾kÚŸ¾§HdÆïÝïX±H ˜õQ¹£˜½$[+â^ÄŠâo(çÙœ=»‡{‡b×ڻߥ†mkqЙ|²7ƒEò½e&03µˆ!u""x…š×žÉßuò7¿µF $*5™¯}"Æž>8­Ó{ •†gýò§SʃÜςΆ ÌÚv‰9Õº¯Ÿ±¯ÍŒC,ùÁUŠÄ¹A9ÃÄd—æNøûÉæbG;'¶Ð³É6׌C&ä%ßX'5˜I¤óÛ)ó7¤–èGGè”i«œ‹ã "\½·HK@º¥Ø(ð%7  u) ‹ïÝ*åw\yýz¦_eÒZOí^#ý:¶ê¤íh饨JÛ›ëc‹‹ôu&*^N‹™cv¯/ïÃæC?s²—ÚâüožŽ|åôÅ0ßÛmnpzj#Ë5 ÷âu€Òu Ä&ûºê‡zØSBÞ™š^f¢¬_Ø:¯zîÿa}¬Ä I+ƒb19°÷n¿nøòø…A½?Úftt×Z«ßÓ1ê—h||6àaµÍ¤)θñÄ´jïu˜”«—"ð¼;Öšë•Ñs»ßB#Ÿçˆ>;tüÉŠ3üz©±Hhä+ îå#·¯JT‚‡¾u©ö•²ÞÇüS¬åF]œXE²D!ïWìXpÚ” Šå§.Á¡’…àOo¡lq¯pYUÌJ°ëb‘aOªÊ/ÎÍÜÇLë]Ö)‹cøŽöx Yù,›®w73ǃµsµËÜŸ}¿üQ¥Y¢ÐˆÛf-kTIGб(@ 6ø|ñ3eËf g@>£²·Äªù{Ž gNš––± j Øòk›Qݤ¥µµåa˜_òͬw×¾ðËǰƒˆLy"ÇÈL€ñž[ômáL„¯QúÊñÝ®«W"¢mr‡¼?\ !pMéb $ˆîê3^’w§¶T6ÓSS~;‰®³ÎÌÚ;NL\{ÂLè"%ëãÛørlQÍ/"4-°\߃¿x½Å²üÜ+u]ÛÞõÞAGz´RÙöÆå¥ýƲӈeѨ‹XkDϫԒúTÇžF_í<þòda-¤¿¤–°:h-Öÿoͬ‘ë}(V¢HƒÔȵåšÊ:8„1ÿ•Ӟ—a×ìú%œ"%ó¡u »/©år›ÎsÆ[®Ò^ Ñ <ÞÂMom?ì†Õú¬›+ævþŸ¹ñÅgEÁ&·Ü˜ #æT V>¹ã&_ljBpV´T$ÿ%[Ð’‡ÖÅh›Q¬ÉéÀÛE#›3ܰ©7X n§Þú˜sk4ÁÄŒUòšÎaÃbLoëYùY&ñƒQ­Ãž/KÒÂÕû EþOîÚ~i?¸ûg¿}7®©j{”pFÍYk¡™Ëû·Ú-šÏh4+v^Ug¶@~Ù0¸Ö¶ôIÜ‘…SRÄ¥Wî1Á_6y7Ó8οÄú*ä½›ðªL)`¸ÅeżÊ9 ЪÛ5`Ü9ÝZÆÂ¯épL+/¬N`bOHãÒ±­e~Z­¼ý½>?ÿlë“"Øx춦]@„ÈÄÔG• ZGÎíá‹ã̈OçR—CYŒ¦Ó–³¸‚¿yI+üö;b „†oeØUÀÍ[Vb¿_àbDc¹’·ÞÊöÑ)‹»JætI¾wE&t«'Ü:w¹[ÐÆçõ°Ñªç´uí.N\½é‹@Š2Ð÷Ú⎠v¯üõÅ‹žs—±˜çWl5/I’éáWU™ßŸ*çÝQ¨ŸÚÜ `·MžñgòOIŒÊÁ`n߬*nTÏÚWÔýÐÑ·_K¾ËDçi|ÈßHŸšº¯¶â-XTÂ1ëóç]åìTý3UHæÒý•âtx¹ËÛ˜\øˆ0Õ †#àpxë;}úÐνoÄý=¬Ì¨ðH‹qÄÃ9ñeÿŠB™” L'ÃGìè„oW›¡Ô°ŠcóRÚ=ÛÚSƒ*Ë,uÑKC¼ý¡3ïu²µ=U}÷¶•Ø„Æ2“M[cÚlßhž¨Î]Vf»¤È‡î5µ¹5£ÑboF‹±qß–pÅóÝÎÛ¦3lŽ«Ã ŒP¨1cß—%'FN}®;èÕWq›NßÖž§«MÐÅ9ºˆù~ä4LÏT0žé5¹8K˜<ÌMÔZuÙ[+‹I>Z]q½Ô8Í÷>à”VÆ ¯R§/C—f8€ÜJ«^•¼LÑÂJÓ¥w¹×Ç<âFpšpê:³ûrθ‰÷K ‡ÁϪ«—•]À~$EÚXûG_Çõ¥,º*=㯉 À p¬££mÜ,hž™â¹öIq6ôýÕRZewÑJŠz<µ|‚Ã- ×Ü—ßè ó¹c|Då-!£ÞëÉI :ã´ÑII >O³ùkZ ¦½p/æ× € á ö¹\‚ _z ø¼° )ãÄoD(NnUf¡Ïça{.•¢ªÊ¾¸^8ù0“ßëµÌ·sš(´l“r&ñ&E¦hE¥ø”†B´ÍD¦+ /”‘­QÖm#céÆðÁüàJÒŸ.²ßǦ¹5¦ÅzÌi#Åš•†vÅSNN`Zþeœ Ê‚l­²Fûš 6}¹n ¾ú ‰6‰ ˜²†B’ ^7<ãܽ‚l2øñH)_€†B²M,ˆÆ­QCƒfö}ùQpµ×ãrõ4é£í‹ËeïÜÉjßШ9‚>쫌–‡ë¥”$ˆÝf³üåI‹Ô™›g à¬:v°Â•aušÆx9,ëoê ³áêîïïÚ|ío6ò òÜ0rÀ¹ Ùka§3Ý*_—WyGNÇ£Ž£eÕ >§#»gͲâFîáÙ’mî2‚Jç¦óT`â÷ЄÀs­ IƒÙ[N¡,ŽÏû=Cãšêcn»!éF?Ï÷ëfeMšz\»Ð}‰ÀŒsãÒ%´&Qß _jG 6Bʼnˆê@Ýk5®ñÆ>lìÎ-I9¯·©›BL3œHrÊ‹åñ˜Jÿ”//Àí¶÷ÜUùì—²oÔ"U6TÅ…Z[?âç7Ë3еÎ]]}ýÇ9‰€e FZi9TqGÂHTòT˜íî¶2èàzãYùnã“Þp'aÁ>Έj[ö®”bmQ¶ÝL<Š-²Î±sC>øûöf›îì“¶w}öÑ+~ùõ"Oƒð3©<°4¿7)Ö/! 3±º)[JŸVœ{Àøeè÷t®ÁáÀÝQ)QY>ÙìvÇX›Ö%ÕÐ Nîæý¯ËK¾MŠ‘ô2ÉH¦N©Îæ÷‡ÛÌgÏ2ÓòŸØ±ìFö/¹¥± :[r#2¶o—÷צ0àmü;Ϫ!þ¯ßÕÀYÅb±.òübåxð-öh5Å]`ç+n4Ç:¨M‘Ǩ,)):?ÿX†È—Y_<hÞÿâzÌ,0aj-`‡Ðy_#-”¨SŒT>pÆÐ œsöR€˜Û‹Â¬ÒWÛ I7´•ÜÌ Q–lOQÏ.7 ¾b© Pίž­ÃUœ.ÍÞß¾yîç=!¿{Ý–è¼·ôÄÿîÚ–%'b¦Ë‹ÇË ÃÖØ^š°TÇk+‡¬¿ŒR^Ÿžˆg%jÔƒúo͈1˜ޝ¸“­Ç€l§“óE¬°å#¯_dˆc{:x;ÃÛ ¸?@DœG¿ßüó¦’ßC݉­JEà ÅÜÚÛ ²ßEz9-·Ù†S¼‚ºšÞkX3 §>‡t§AŒKùóû ËL09¦³§wœ*ë‘^.¥Ó¬˜Ñ¤`Aßdnm®ƒ“ùrq³([`tê+ö“©ÃèañÉ=1o:Pàïû 5ÏÇ š†‡²\'8 s‡ÎßzˆZ7+ }0)±' Üh´å¨âÖ [xÛ|ÏÛêsƒ»UŽÐ{åc˜1R¢F³,‘i±Õb wŽ;:nK,0R³Ž<Ž·a‡åþúfȉ€Ï¿óp ã¹\é9ê)4‹da] A¥ Ð4?\±­jVE_ôrÅ¥žÇf&À?ôMµ~ìïsrz·µµ±³³ïÓИ››×ÔÔ€Á`UUÕÉÉÉæææüü|^^Þ°°°ƒNûœ£÷;˜;764¡¹<3¥¡á£ÑÕT3 Èù’{gÐ]¸Ÿ—‡ÑkßL:Åü[B¬eÄs–’Ý‹©°¥“ýwÙ~8ïG/…å}¸µ7?h'Ýø^¬Ð|Wã6úë…ôî‰}‰Yÿ´žWFõz7§>ªÿ(R­È¥ÿ^•1Á~$ŸûÛö 0¼4pf$!>sûía ]¿Î³T—ÈÔ¬‡Í#FÌfQ{‹‹|Çжd@Ã/)èdØœyfõ<ÃîK>ÛºäH3Â1ïC¾À¯6V‡“ö±‰4Ê.~íî½^*'[««®Bp%§‹oià”Zi¢x#ûú“9a0Þå`/ÌÕœ(QU³¹aº¡q÷E—ZYÿºk_ËyƒðKñg\ÎJDõE~©çà⺙â×w&K¨ËPSÔöŠ~ÄE¼%ñç8!=5&…Óx*Kp¶.Íè¾´,⬌»z÷ÜÑ+wðçÕ×Cõ!ø|bvÀƒµB ¶ø(´}²PÁ^õrþ®@¥Š¿!>e~ËA¯?;¨™ë²ü~díµÀ7쒠ݦUÚ›;ßõëä.Â|§ßôâÉ,Ú*ÂþÝV/<£4ö*¤nžhYþûTaÆ¢Myý|á?œoÕ=´_ê‡~+ߘï¹à•“í©ÄDDs8ÄÄIO†ãåŸdWº÷ûÖ=Ï÷p½•úÎÀÍŒoâô:JDMïüeFvggÓ„¼cö›w–Õ¢ìmÌW,«Ÿç{Ɖ"nÃMû´ç ¥ˆ~>ã¬wG +à&y C…¯•{p“3"*EÙŸ/>x¦`È l[†ð9f{VÀûé¥7ç²ç 7г gÔŸZÿø²±‰ìûsà„lϧìoó…Ûèƒ}¬`õ‘Á-»¸„繉Ö©¢ìÀÑÂкçhhGÈ:t8áÛæÀ¨·ßzƒ¤¶s‹ö;tÆÁ{I÷X8Ø÷,í;ƒÆú̺û¥ìjQA=™Œ ï s—. ×zb¤ç ¥ì@jaÚ  g£Äf?­Ä íÎ&q}(«­X™îißy}ÍŠBÖásq%Ü0rפ…­Ïq k–ÌU›–©½8îsr07¢Vè›ïÕËù×:îå^¨Ãà ^ÅyêMgEƒlŠçÔm|pÁŠÄÝ·µ´¶–ÝrÈ uâ©n9;‚䫬øËÐlmˆ7yPOÖÜ鬛¬ioå’z¼ÑG"=µ¶’X¦Lû,Ë*,Xž=3F ñ½Q•á/Óeo+™ü}>ï2éë🭮{½Ïã¹Ã¥Ï89¸½Á{ßðçò7ˆ;«m¸Û,3-ÿ™,Ua!èÏðÉãP µÚ¾Ñ=¹ÄÔ‰ê ¾5¾“Þ–ÊÒ=Q'I›÷ñ(ïD?z¿Ód–éÇϨ­ÙË;Mùß0tˉ‹Áv}–'õ×:œn<½§…y¹0Vp<÷ ùØÈY`i{`ƒ`f´XÒr•^º{uië­Ê”+Xj‹g eµ@h3Œ´`DŒ¥’^²¢$dB™*ý»Ü¤í‚…àø_ÇjO¡ÂMÄÈíévw°°áP8K|¸/›†”h„›Åüü1~¾Ö8I/š1ØW븛š #¯8ßd°†ˆt0¢Ûnc½ë¬EÚ3³Šyîâ-ïŸ(R …0þ‘8"–ú"7Ã㯙ÄÏœ²Õn³žôÖ›^Üw’½-krXÙá±ÌÍi¯´Š+ Lo5‰˜«âj¸Ñ\–ÓâxWZû„Û#HÓZ‚®¼¯7mz«$@eY†|õ,Ã+©0ö­÷0p÷$ÇðÜuÈ$~R?5émmïë4ñÐ?h5N•bÆ?r²¥öqµ![¾±³=¨(¹bo0ê ïÇdâò‰ìΧIY$t….´•s¢ÜÁã¿Ú2¦9ãÞzçHwAÿøLëôyòr&iæŠÇ´hicÆ•&‹ç*|ÚÝ?“…Šô°2KL2ìf<éçô8Äó3ÏуcÅmã.³°ÞgÏG0ÞdÆ„‡Äþ\> ©œö2èt¹u6ñÛÁ‚ñ?ÛAøômœïeßIÿÑÛ…j—¸{•ùµqíêøZæ!Õ¹ý(Õ«²‹KMõk™ef'T¯j¢º™ÛÇã{ܯ9kÉ/.‰]rp+AÜ /Õ²4Õ7 ŽŠ¯8y˜‡uÊ=wh—-¿²TØ}Âx ç&^Ë|Èá¬`5árðÌgì«ãÁÆ0ã1=© d—RÚÔî|ògnSàè ÔÈÁZVñ§ðJnÚïþ::såÇiY»úë R'é¥Õ•_ÐJtÃc´~!¸!Ïáå„3²]µÓ * ¦8ó¼k·…ZfŽXÚ+¨–š™èÜçÍÁ«‰h³°®ö~ {úiµ¯pâû+ˆ~mñ¾‹<ÝAÏGR]@WÁ°Þ‹aãx#«äÁ¾¹…°?;úŠÏ0ö¼xÙíúGËÚ£HéLÖÏV“[YŸ¾>r±8Ëù!Jëìû{\ß¹8„ödç›e[`í]†î¾Ó;ÑP†žçŠ;ÖÖV µ˜ªGXëg8'E.+r½¢UÁçL4H ½²C¬6d§ØX}“ož`Xú®ñ¥•µUvÎåø…ùžgæ„ÜÌçÕBëï°‘?Šáë ÐÜôòn`óÍvfÔa© ÝØ .ö°Ñ›ñÉ?­ï.žäô™Ž =)ÊD5»(·ºðJßÄÃËú~ô¤Å&¯ Zˆ91Ó5È­¿©:ÃØ­¯?!ûY› ¾¶3Î¥÷àÅËŒê¿?ÙÌÅwûƒ Rˆ!Uš+ïYâ‹q ¡6å{4†øV:ÛÅzÞ–OÖßPÜ€Çm2´Œ"Töœ“3KktMndW Z¦ W5Bu¤p4Ƙ ²ç‰Nq*á [–¤E¢â¸—ŽæÀ>eªçU(„÷/I/#íY¼7ǘZ>dí:Œ»ElÏK•f·wÃ9™_Zölaæ³™/tÞ=ï㻇ÆQÂí1£Þ*±åƒ¦³3Ÿá#ýº€ÁZöD}©É¥†Š&Ä›à5.–bÝ tÛa¿dÌU j¨½î§>—ël¸¸¶©Ë-4¶†2%â´š8µ<žÍl;ç«\’•YpuïÓŽo¸ ‰÷DñsCîrø„ìâ«óéÎwöð"®êrÝK^ë þ†{yk’)ªx`|ó¢dÏx…¹~ùß7öY’ÚC?ú å {_T=þš¾‚ü@5Cî•ff°¹ÚIÇnòn–?«b鿌Âÿð äwoç¸ÿC¯üq¦gy†cæÉ˜˜ÐÁ£Áüfœnµ¹~]ãÁfXïÿ—…Yàö‘•û1!0Í„ï5æÿöœ|óÜC©x²«úEñ{Ñ—–Þü¡*ùWo×T˧§…G´'´Éâ§^®,¦OXŽ'ÖìŒxZÛö¹÷½{=û{¿õÁÌêîêêê®êêê5kU³1þV…sÖÅä.òÀ¿—(sÕÝ´ßÞ°·´¹ MàoS*mqqNÑñuv{Ž!9ÿȲ”7Ëvóyß ÆpÉJÐæN¯Eêò‹7]:Žì¡ËZmV¢‘³úÞ¾¤ÙDéñU×öÓ‹'Ù ÚœC28_Ü–î(Ú” ÚÚHÙ¬WóJh÷à©zæˆÀù¢øý nã[«Ãj†+æxOÌ©xÀ·xWHCÚ.OÝ„HW‰bïºá›³¨€½o'ÉË-L˜3ov²zh¶å­¬w)Ïx>]r.ð,8ÍžÀɪWD}yÑþe½›íñÞ ;³Â»Ð)F:ì>¥2ú‚¿i˜!ØÃÉq¨–l)Ç“Ð@PvïnÁ)e«éúæD0·¯^Ég¦·/âÊ´ÏÇÝ«X9S0P}žÿ¹³ö(…“ìm_®;–t¢oÞ±ë?#Tà>õé.øìöeªÁ!¿þÌ F!>pýíäËO!N·朵YCo缄£fêíØEŸ¼ ¤v×RõV¹§‰õiˆ]6S©¸&MžŸÙÂCšÖ0 u/Ô<›Éόխ©ËÝZíKêu9 Þ ûÂkTâ™süW\ÞÍÇ0>p޼7(– ·m˜ÐO7Ä9ÝeãÃÕ{Õº<69YäfÚ1Ê+Q±©QW•OÕå.5¿Æ*±ÇTtŽcoUn!w"¥ï)³Hâ,øTb­!g©´šÙŸ2…„ºs$Ø6Ò—M¡¢´‡‡ºÜ¼÷̔˳o݉VܨÐÅ8 N6õ.vlÜÚ±x]Ó7Ͼ:\¡œìÝJ¸?@Tú¤Ñ\«ÐhX6ò^\º—’~ÛØÄBò!ð1˜2OYß3hЙa¦ûך€Íò¡ÑðÕGG‚z›í‰Ùº·: N1g—=ÉžŠÚZ4¥u=WÚÖS¬Ò¢9Ì–HuÉé€áãY`lžŒB…‡'k#pÐϺ«˜ûÀÀÉÉö†ß¹•ñ AlKÕ6ÚifΧÏà÷ž°»Vò4(ò¬3E9¦€K|9ä«®NÛx‰U]#pEþª[ž#Ý©‚UÓö‰:ÒI¼¢ÑYRè r-Š¥ÖЬèsØÔlù.¨š¼«~N­éYI'zf ßíõóf™#Ë/›Ê§¡uo¬æ§µõ: LÈÎ Á ÊŽk¿ÚÄÁ`..M3y¢›^ÜØö½Gˆ·ËO`ŒŽ°'ö›È™pÞPº95X~Gy£bç(ñ8+ÈùEjœÑ÷̽FÅD‡0áLÙKMJö #“ñY¢Ýgŵ7Žôè´£&Uää¢Ý­óí7ss—•ÖA8-ó;.Yl$.Gµñ{9î|.x;­Ì*¤Èb£ö ò¨E Ûù ÌwÂÛ «Ó¥àeHždUxîùyt°s®Ÿ…Ï×f£ §'À=mÂ¥&ÆàÅmH[W3éå—éËèÁ»Ööjmvra¹y—„àîS~z6z‘7î°bðRÜTÅ¡ÃÑDƒÕ\;ƒˆgƒ"ÒÊÂOÇ݆<'Ð9*Òà¤N?ôKâzº©ø°Í뽯Àå¤Ü ?tÒž½<ø:jRšøXƒAM‡ü-3èÌQŽs=Î †7NPY)Ç&ª­ß¤”¡¾Þ«qPþÜýI]!gð˜(ž±qà†„¬>«L\ã{ä®ËT|èma­î§mDcߘ©Aî^¿GãÓpgt:>Ä9éKóÑm­èÚ„«k̶æZÖA¢½Hî½m‡ Q†OSW)ǯ¶?Ë´™7b"vM‡ÌÔï~evÉ%L°PŠTbå30Ý8¦Œ´ÞÏ’ju¶Æ moaÈõÚ³èmÜ…Ä‚2 kNmBr÷$„¯Ù_²rà‡ö¹i—öÉQkMƒ•1„ô‰¥•V³=µ ¤kÌgß¼jš•ð-c¿“l}‰N•% 9o’mà›FÐW~<_Eš-t©»£HŒÜB37¡ÑÐÏ U³ª!Ûb ûý‰›„?ž¿55ûb GlêbX÷)ËÛÄ…yºoâÖ¬¯Û„ÍÀG3Ø„ÆÆ®w©õ4Þ¾cÅä‚fŒ|• /1·8 e'‘ ¾ËD8ûÌÖz2ŽèsìüN°Í'7´Õ’¹ Ìíof—çÀì…®›¨ƒÇ‘JÕ›{2ØU«-¼c¼6ö¼äâ‘Ï*gd„Õ¶1ïž‚šøh«=¯t÷44šSéµçEI4,l§ÒþAo³¸e‹UæÎÓÞÞ6'îKÏ†Š”*ãÅï¿Èc@KÑ6W)£É?†ûÔ‹0ÿÎ=žœ+ேb{Å© ;1ŽVëœ!î$Õ˜¥çžŸúB"?P'¿6Uèäœ)µQ­Œ?hï ³bðO\ªÛ%ήXù×fëéâÖ XuÚŒßïÜÉ™!jnD¬P,Õ 8¬=ã“¥uQŠÈ&D·µF¢ý‚™ÅØ)*ÜÈàê|%9P•·AÛI”$Tœ3ÒîÀ)h2X6ÍD•=úh§¢ÔV{IlýCl¢þƒnµg÷ã|Ö˜”Æžéˆ`ØZÁ:ݘfßif5Ú÷ôS±ûÚ|M6ÜW€-K Wž*øö \ƒ ªÄªrœ;Ì8\òé¾%_Ó5uvµ²8‹LÃ-›ûõ:ü»Uïô xðCA4×àæøÜCôu&—l{|¡F§ð¾BªS­©=%:hAM2'4:ä Ým¹ $Œ„ò¨ì¸ÒÄÐmDE4Ú)6zࣨeøejÜ4h-i’Ü‹$œ’Lá©§n…´l­[‹ë¹ÆŠ¥¢Ð\*Ù'Ø>Az³ô*ãûŸ!ÅöÅZ삟oÄ»Ë%æQU¼~FˆÆ?%2¬ñN¬EœoÒMn÷Z>µãV’iÏó{Åô¤x¦»‰0Bexƒ8µ›ì‰»9øËz»Xß³x_›Y%‚«I+ˆNªvSã¯Í#­â– Ë7ÚeLd§VÜä5)êGZć‘AVé>yeìëÇèFƆmÙ¾÷E­Ç™´–xIjY»ƒ;}Õž·D«(ÖCEí£ñÑm+®9ÆgÚE¿vâBky„ûH<åj+7ó„ ûÙØhy€‹Ê[‹ó¿ƒ¸¸3>ËÌ=c:Á¼;œ2Ë,0“2Ÿ¾Ä€çÁ¢m‚jÉ?¶¤3Šœš÷Û{&â«x¸_±_œµ¨l—³L8!ïjUhæ‡? Ø[çËm¶…­³(Ñ s3m¡&ñY 9zwçTU¥™hNKAë¢ÚHx{n¾4:ZˉŸ"• cõBsVd‡±·ÚÁtKîïB½+õ¥ã‰—v#:;ÅÆÎÑw榜‚vóDpÂÊ6WîëŸE™33dè×Ôä@‹w"Ä]²úª%EË7Ùh°…·Cö¬N;­5n BEƼ5ï•j˽x!À=Qû‚Ÿ$ýEFVázì Þ—áxXfRh£Ñ* Øt 2cx MŽóÀ³}î¯â6á ŽÑH«Ç¢»cÞQ÷v8·Âq}J}¿yáÌ`4‡ÅËÊ‹àßî7ÜI‡*6uêsàœIzp%»¶¦Æ ŒiWðUìTj/a"è0ØõþØP½2JÁ“–ß õZ gŒÉˆú0jÒ~!µVŸ‘ØøÐiÂ’uvù-“+óµ¬qõo%%¼oêB"…¸X‚¨§^q`O¢<;φ©WÖžÆ=ª©”lßãr6¹¸Hÿ\ã½úøÃv…¨ð¡“¬pÚÁ—Üi­\¨Š§# šÑÃ' Ó©râ×^¬²ÆvHH¸׎ôù4ª6Ú¢7X~ßc%²,š$=Ut£½Í—TÚû±kÏ7¸îyÕ²è»*þ™EëÔÒ°¿£(3@ÆÄ¥èÄׯ+—p_Åû2ã\ØONZZܵl¸â¢>#Zp1(}BñÄnx³Ÿˆ­” âCi'xúfwtœÅÛù«jG»µɽgiïs«ÄF_¾¢ë0 §Ñ”°=§$;Éè©J0;§„dJ«T#²ÓQ .PS¦ó¥“f…7«9T‡Lwˆ\‘hÝhç«é¤wÓm¤ëñ-w,Ëgf‰ö;fa#B™äŽà;V SB—-¶06b¶CC$°¶G×mãHÚÚ^®“ v,š9¥«— ú&H(+ÑEŽ"\Å-qYn‹G,Íu4ó$n´×Óu$H%|$Aü¦[lû4jr’Øc„Μ%·@Ë\•Ýê¡{AHÚŠø4¿s˜GIÔúþ>OZ¶„š¶f¤GÃøÛ /» ï‡ZʉŸ„ÔÁèk(Bñ±+Ÿ‡¸¯$¶FÙ3`ªÕ(縞„Ø„#Cò;&–L‘šœ¤¹¯@–EJ·œ¯éY»æ·7ú] ï¦ÇF¶HÕyh葇aB[´^œO’‹p‘‰Šðs}”ŽãTOØ­^G×Ö/ER—_#÷½úÑë¦0å:½™&á¾èÖ®[¹,ÃY{3§ƒ›µ™ÒÎÏ0*xm3ŒCÐ×RHTršoÁr[TûŽLtj´;âÚ•Èø›»xTªq ӅԺǒwÄJ=p·Þĺ»,û.!«»XsÛ?æçÍWÌ «Óó‰9±˜ö¦§´ö‰Ð³])kâçH¾Å6_²K`¼û8cF%n¼<Àíy©Ýî Š˜ÄØôCâo¡¦˜ëIûC_ĺ%ÔßÃDúÃ.YÐÊÌz…„ÅkX0Ö*Y\E6Þ Ø”sÞy·'ª˜cý¸èc1¡£&º¿FÎ4Òü8#MÕe{Z|öfþ¢ZÖGªw¯¨¤`¿(®®}|/ÞåŸk¥g²Äê)_$8†ÏŠ5ÍÆêtMÌü…Ö$³úÄ뀷ž”©<£äwiÐ.$TÕ²`Y|þ¤e­o¢-%0K˜8ƒ‰½? Z0@N‰HP“×0Ì—v]ê!ÖÄYà”3ˆqž STÖ[µ]ÄŠM[¨UÆMÝÔŸt í¾t²6.C,2®~Ê›á^»Ä>z]ˆ[|–Y¢õŽÑÆ™»Î« "Au"xEŒ.ZòYü¼èp–ð²Í‰Ï\Ü@n sx;ýç—g#˜ Æ*l ïJ8¹ÐÒÄúÕØ?G ö*h:æR+ÝÕamÜQ¬¶€Ð'¥óhä9£a—âÉÎŽcÉ‹'÷ tí±%¶T3Y~×vÀ»¸ÙduN"šH4 £Æ%T} FTz™2#ИHiëJ¢@ˆÁ5,9:©>éûUI³4yû'fÉ·XÔUJÌü j´ò«Æ’¸ÖC$ÉÔAìOF';÷D[·vH,F"œ Û" Ƽ”Œ¬}Úe†#Âò"Ú³%ûaÒ'^F„å¶ÞמÆ]_o˜Ndš€SºcµÀ.-Y´LdeHºË8”|¼8é¬â‰ßì"`é:³—¤+rªÏšâ§AÆÕŒ‰E&RÕzå*–;(·óü¶˜=[[Å»—ž„ˆŠôG²Á#=¡Z»¹sªgÁïÑÌÜû6vÎ0½#´«Ä©iK¦âbõòú±1Nó 4N@ØÝÑ6ªV,W÷žY ¢mÄ^ Ue>ï#•Š8/Z*kqVïbid ìï}¥O…Ÿ,:‰ňƒÃøæèYôµvŒ!£ÈÔŽ@šP!Ÿõ%h¥ˆyÉy5þ ´Ñͨ]HbmOþU ‡5ò¨®àÉÓ“E‘ÌPªZuó[•q2ˆ×¥’QøÁ¬çqÄèêg§ú?&{)Öî'¯¨¹_Pã'r­40¸eÐÉæ&¡Õ¸5lâŠÞê¶x;ü8€ e.»ÒbÑñJðBJ·€R™¹«we¼é×|W’ëàO‰Ñȧ••g†×( ê¡´¨–æä¼W‚˜O«Ä¨àÙÊРZTPW‚Þcñí\Ææ[ÌYŠ^ÜÉýy2—𴓉~Er @¥[ù¯ÕÈѲA½)ÄèÏ/­ã?žyËܶæÇ>ÓSɾEyŠâS2’ÚÝ“Lã80Ò#í00Ò×Eï0°×mâÚ0í°ÖvÿNˆ¢—Rbå 1ºÓF¦dfF êûŒjˆO@)ëÅz'•‚b&R Ý8·”層—ÐLÆßíè4:åÀZ”A!Îu}k7Çj«NŽk£óóA·az@Õ4aô5·ˆµ溿¥RßÇ'?%L“Nw\ F °íøµ*©„Í:0Á<íå”Fmt]T0aÊd)ÏU!üMuŸ üHëïݵyÜ@î$wÝV,mñ¹Vdä·êÑç¿ÃîœiÝqŽ“.Mű´ç†+ç 79טñœäY¤Z\šb[ýnúð°ÔÈ+B ™qµ¨–È¢Ëoç•*vKhå™ ©SŠ­N4h=æf¤§“¦üÐ ´URj®¬ ZúfĬFÛÚO²?|HF½:Èšç=™@nµ¸i-0£Šž±Í<ù¶å^’ü:y…˜\Ñ•”;¯uÉû¹°‘áyJ˜6o?ðþ‰67‰4›òÈxð…EÆuÂϬž)">Y§“§ÀÚ ¥Îj/fñ “4ô•MEød \`…“ Ö¸…ûLWb=Š¿x ØÄª³¿7©pRFga¼_ÙÖÓ§:ðÜFo@éS×&›Šè^3¿U‘öªè|61-°Ooƒ$!¢O3²“Owz3Ô‰fXl$ÛÍtŠâIÃß2Ç!ºoBo—Û¦Y”pë’omÈ<ÐÜv°ú$º2YGuןèíìh<ÀÐlƒy¿(ͤ$Ü»ÄЩÛ!N¦O2Ç¥äÃ;›H…ïFûBæ)¶ý„¾”ÍKíÇŽEïù;¼”!¤#äm6S¶þçN¶‹QJ]!’'êWÚzòÒy\Ü.Ðý.‹Ñ­mGj®Ð<©Á’˶|žNA\VÍr·öñ©ª3§:ø_úXpŸ8Ø^—é )nˆÍÍ%;›¸b#õ$¢Q\XÒÖ„_ü«[É,F¨ViJ'-]½¿µWÒ?’xL(ÅØg¯"Â&TÜH Ëâˆ3àŸkªØñiû¨ÃëKJ!äš^• n\ut<—3O—}ŽÛ´•N,”õ¿Oé­Çp%‘œ{ ÀÐ • ³ :¾ I ¡úˆÉ óÉë¾Ð¸«a·’ïeD¿î‹ˆã=Úõ¯‚¼˜¥¶–\‹GŠá½iÞ3(ß…f*ˆ:hºHÈ‘…Ì¿½¸Pú¶,±A¾±EŒ7^<û0Dýñ¡0tXvµ>òš0š¶ñ¨ŽSLÍ1Ú2h¯Z°ú[ÚJ®aÆ‹ÈdÕ´Ã.r߈|€æþl éÿ-ƒ¼bóŽÄ’sšÐ4ý­•KzÅŸflƳn5´w[¼Ñ ¤¥¹óåÛm[kln~:ŸÜÖÝmžˆ =æ @AË××ÏZ"ÑÖ_®ÏÆnjËGKB3’}‹¹e!·Àž:òÑ'S&ŸX@­fy­Ã5 Û…/H\À§u;ŸDÌ¿L#òL3$P§²x£Ûév&M@Ý‚÷è·;äÌt¼­°w­Aô•ˆAS™Ƥâƒä†ßC"¹ÍŽaµ­\é÷Ý>ÔÇà2!y9…êßžBLÙ~m¹S :k e ²4š‹¯ÙB¬‰éD¨´š¶yLº5ËâZo·{{æ°M«EVåø•#=tj¢ùDnB‡j´ j'áTžíÓoÁg’‰ûƒyÆ»³X-gsöwò͆åK‘j%qŽ7-CÒ9oÒ½)ÖS6IxçÍ {I¶Ä¶Mðw•Î÷Y>’¸Þ¿ß}6|jÙs¦?î\Ää©Ñ•N÷O1§ J «EΜ Ïgz›§?‘ê€3^ÂíÓ8"{žï¦ÂuÆ:QFÛ›à4–êoëž™¿%Ñ£ 0æÈÊ»i™ÛÈC·@ˆ¹o;‚ãg{驸_2P¾gNýXuûÚtô‹L4žG¯‚FšÍuÙö2W†x€Z*ÃLbÀÔuÇñ—Z[Ä^Jh@.>§k¦7ìÀ,Á&.EÁú/¦u®×3Ém«V¿Ì›®Gxññ± ÙØ!•­f-x5@ÚÖ õ:IiÃ9® €¤®â8_Ô·ÀûˆƒrÁ¾ðÝoŽÝ”…ÖlJÆp-ß­‹Çÿx†ª2Z]W=ö8ìúüÝâËøÛžëq‡„,‚½>MÃÔOɘˆýn2–#‰ü†ÃÇýÛ[ŠJ²šYÁë–Rˆ›U¯½9£(ìnwYýZ$͵‚»=·GlWn¶)Ë 1®,Z—ÈÇÌ~=ñ2<^ÌXhñfפ¤z“àŠl;è´Ì®T}žìaÄ •Q™nfºJêžÉ°D¼ÔÝôŽÛ¸Úô½'ÌOχ=Û|“L¼Xæ(vñyR;4ß5—Uòv7È÷#¶ý ÿÓ“®Y¸]|x2âë LÔž}>@¥ÜVîkGûæU²‡®p=9Ydq§hÝf;õséÖQÞ܆¾"³r[5íW}nÂJÝÑøÂ¶nAÊzÿݹ¯Pá3ÙL5¤x2rÇN?÷S„¾V‚ï¥DdãõS6¨3`õç"¡AÙ8Æ Š6øÀ&^·L$ì#ñ:¹¨lÁMÐéW4Ÿ™õ¼kËÑM KP…ûh‘²w÷€âÈ «­ õ'Jm£vŽô¯l ©v¯´ËOÒN£Eî}Ü{×?R¸ÿ.Žª°ã ?ýÞÇ©4šþøúÂ/ƈjwè©8-ÔÒ#Êý6m g2HŸ8BW³¢Ð;ÄžsÇ»ó{Öeɾû@–ÞpÔ;ôÀm³`H}b–U%ÇÔ•µÈv%ˆÅ6}¢¡ÚòQK©·qfº,’΋ÿF‰A»zu¬½'¼ð‚#Û}tÏÛr¤˜¬véúÌä¶Úè‡Ä”­„÷E)Œ®Aµ»ê#ï¯1Xã{5¾tö™è¶ Ò PÉZòÚ½½q]̾7@éÂî.…£6a&Ncn}Á‡‹Ú)ˆ¬Ù¹wçëÒ B§ÚhѼxê~¨<‹^é°ø¤#Nš”ÒÄÃi«¸Á[ôïK„;‰1‘¹Î®‡úÉ n256’P!ç áK.Œ ¯Ýˆ|*¤ô¾‡3üRlš{ès™ ÌM6tf sÊSCÆnŽf§¶#‡ kÉCª"ª »U2ºçCYP+bãÙP­S˼8–ä±L‚!nï? ²Ê·Èu#£ð($B^…A¾îªEÎ÷gÝ.ìoÓ=j0 ’=Û+]¥_eµ™9º÷ÜÇ•pqCGnÊpÑMø’Z„¶CÀªVÉß‚MFLôeÍRkˆãÏžgòâŠi°]À¶}X0ØKÛêO'Æå{ÝW¬ŒwѤ§(,J´ ¥]‹×Õœñ*é<¥+’‰Sg>ÏbìÿáYEÐG¯û8èsJL ‡4I¡§âÅS2Éä½$Öò1…{çÂúÁXO]#ÖíyʬÍQßè…ÁgN)È`oâ È[ÎTRä¶õéîj3ò2úF[|/+ÓÆëü:tDíV<¢Õ™Þd¯=P3/”ÆõfÇ­)}—µÎd$£k¥Õ1c£-×'»×9£îݤÏï ÌËÓÈPñóK¼‘ýn5§„ši=Æœù aRQ¡ öû¦re Oa‹+å¦N ¸SÓª/#ÏÅ“ RÑïBWË-®kìÇD-m·üS¸¨µ í[ázß ),µÏ®Ï~`¶b¶þŠ»t,Úݦݰ¤µlPC€ŸG÷cÈÜ?¹”ŽëÖD7G4=chb#ç`¢íH%—ü„-(§„A»¦O»ñ°fDi+Ä«ßãÆcîzˆPì»]‰.!ΡÏj‘ˆK£/“ÂÖÚ²Ò«dk"aÑy.˜'î‘ w äfÛíõC‚ãòò›áȼ+3ÌĦøfJ¬`^„ŽíðGõ./¥(Ü¥ãË„õH·è‚"(çÈç,0ºYLr×&§Ôv×ìéŽúæuµ-{¹-ãš’AŸÍé”Rß*ÂÅ{røSyM~µŽ›3¹,ÝV¢úÊÁˆ×xw¾.ë/lI yÙCYG¸‘g(HŸˆ1Ô­¾ÖÆqÐ rWôjÜŽ}V¿èª´ÍžØkvšÞÍŽÓgòõH{¿:•ÅI›r”UâבdK(K­÷¦FŠcù‚Õ@Û«Ô²j)‚‰«¢ú顾 ·‡Ž!‰ºfɳØö6«é¬o2]´Ð/”3Rxñ4W-ô‡¥C5·yæVÔ½®‡®O‘„)^Ê—“½`pú¸¯öÑ;ÀNîZ¡Ütäg÷Ç¢œ7µ%Í¢W:Ì å¬°ÚZrt/Ò%f-JÓ\ª¹ Èuw- Èj'xRŠÅïh&ÙòÚ=F†¼Ù_Îwü\:ÌYÀ¢îo#èï¡àbg~³ÕDÊÄln1ð(µ¢üSÂÜDpÚÐaŸ(^ñ q¿ÀN8¸÷ xÅÊì–©` ÐHZ™t´ÛG zá(U÷Î/óTîŽ{N©é®3xPÚû[ÛÄ×1þ8ÎÔZ…45l‹ÎNÄŒ2úO“©Ró´•²`ïFm2XuØÞáѹ#Ñ}ATÊmÌ™ÙÁÑpV‰\öPAhª“Ü87=ÕŽËÒx#]§áy*)-<O`Ö˜rßêS?y‡zó#»úګɧƒ˜6V¾„ÅMãCØÚ“ê'Нtƒb+kè›—tfWkÛVº"/(¡Õë`¥@“Ž8¼ŠA4§4#e„Ú¼D¦ÂòÔt%æÁêsåvÝý¶w™ýÅZFÊ{mÒfÓp…Î]LÚÀ¥è½Œk ã W ô„œ´‚&\?}‰ÀU<èîÙ{ÚƒÉç•'hëç5ÔH>õ0j¼[§™mª˜y°\Ü€/Ôð~¡ð½S×ãeáz¯¸ç¨ÌhEB[òÙ&¶áf¸êeqç·¥"ëÐéÒ´]á7qÉwjH|À_@%íOh*\p!iY‰d¨³zÚe.¤'ÉÈ"k{˜š¢xT0oA­d'¿§GŽ,@y_äA¾~¼’:޳`×ÂkŸ\FÑÞÝXßÃR×F]@¤Y0zrªmWÃÉ9D R ·¸z‘|•gÓeÖVéÝé‹+¢–³»5p%™ƒüÕ™fµ±Ñ¶Î#®¦|!]8íØv®aÜwhq:;"ÌÔ7o¥1BQÔm©uïVð'H#|I‡ód ؃‘ó²èÓ)ˆD|d sýu~mݶöí¶•6I›‰×“×\gz„],ÞNARm[íF–2à a¥ì)5”í¾Y)C¬˜H¦^h³P+Ú Ak'˜™=¿Rø­7Mˆg 0’›[—Ï¿É`=ÂçNok×÷RмſŒxùz†y\íÞ-6øë™ï¢˜Àd¥p)å­g–¨õÜšT÷ðmôS‹ã ¹xsæ}omâ§íH1Èkæ{­¾…·¼¢YRâ‹’Û#[\;Xö¿¦“¢Ž5t4F K;wÜô •£ èÕAÖæ0@yRP YÒ?0 ·û‘QX&bñ[äÿÈËq7þEéQ_ŽøF•ÓL_;@ûÕ]àG¤P'àßÒ—åüÎ;ˆÛÙÝÑMZÛüŠ“€õ·Tðå˜çŠý'ýÖñG€G¸=`+€•‡ßÕÑÝÅþ½/ñß‘¬8ýa û#.0—Ù>Pö¯š=2•ïÂàNp@É,‘ ã°9Çòþ§j#TƒZÝ»ÈBmì WËßYd-ò/ç£Ø<–vGy8@Ž.0¸‹ ‡X²ìÍÉþÓöL2¹`C%ø½eR( r0·Ìá¿® ™»ÀÍ>a@Ž¢ÿZŽßäjm~djBM­·€(„Á|b¢|"BB|’¿3õ/HþƒŒþŒ¶ˆˆ$XD‚OTTŒ,.ò§Ô úõ£ÁÔÔÂÝ ˜Ëÿ¦1!Q>°˜Ÿ8ð–ûÓf,€¿?*0@6nÈ×€0˜O 4 "Â' ÿÓÄÿ¡;GÄ¿¡.!$y̾$ ‰Ù–)§ïJ­cmãú]]­=]AžÖ6–ÖdžÍ³9¢h‡ ØÕßR¿Í>·£ºG˜ªç€M³°ø=¦Óÿ‘²Õû?Ó÷ßjþÓq†ÂÌ%þÀ.ì8DÚ¿SvŸD\’òçÚ¨‰ü_ †¥“ÓŸjýÑtãó‰Cþ´@íÿ8£ŽdôO½ÿ?™»`@{DŽ&äÏ/ öçmý»~‰BøÀ€µ¾E$ÿ¹žBÿq …Ìÿ¥Výhà•AnÀ°^Ëv£Õßøx]„º™[ËùÐngçdƒk÷ïiW'sËïé#·Px7À§üöáò{ÐÆª0˜ÇkÔZø›täq×ÿ¬Ê·EÌn¯â·Wƒ[ƒäàè LN`Hl-„5éñ=éæ(ñ7Ÿã›Cóè?Òú±š…£››£ý]ÙÿGä=ü‡.î’åqeÿãGߨþ6jÇ‹¬ë·–€áý¡-WèïÕã¿Èÿ?wŽÅõñ+Æ‘{èr4fß,ËßjW$ªxœì%Þ]lœŽ¼ßcQ“þu]Åos f¨«= Øn²Pðo!+ïîf ìР‚G¾ñQ6LV Ø×nÀݼáv n»c·ëG€´ss”²Ê=‹/מּÍ6 ‹¸€°%“ýwÇÎÂM´y4ú0»ÊœPÛ¹ÿ›jŠ€ãÿca!°ÐꯅN.ŽÀrh²9Zþ\Ý\l,Üö‡6ÇÄÚÑéhÝ3wÙ¸ÖpD‡Ç„-Ùn‰B d…3¬Mšsº³ú/¤1o¿›6Q ô]p+Š£S˜<}‘¤í&–amáïЀwþ¬àJ9Óˆ f=9ÁÔI,ã^{5H5¯›c¹(v§I޾]"F`|®í “è=cæôô ÷ÔÙvúÔɧ>HÈÃFPâÚÁ!7.]°½»¶áfSÕÕûnëu§ødá•f‰˜±Çåâ>IóÌM}z°1/ _ÕfG£ŠëEú1 Ò½X«ðN ÅÕÛs;©³¡(¹ã±E×MD¼5¯~/É3‡TXŸy3Þ1I·QÞõ¢eNÿtAxºkk»¢,^rO‹ ¶uzo›bdãº.eLj‹;Ýrš\VTé¶og›–DŽïááƒ+s0'š(Hÿ³¶»)…\5ì‘æ^œâQŒ"©Œ`Ô¬ý#&Õ!'ß…ïMlYàž9LðäªÂݱ§ò{œ6œõߎG¥Ëq'44X§øÖ0†å¹mR ²|ÚQ_â3¸xÏ]yåZ?RìÕœoN›`7vök‘éÓ4Æ…7”ÐxÏ©-ÃwÑ#å¸ ÐYíÙÝõ ÝØH¯)ŒúÆkl ‘žNp!lž} Tà6ÞÕm?n)®½˜yd×D¼¢»„Þã§µœ·jéïãCΖmSœ›Iä^Òñ¥(8ù †o› Ñ}ŒYiZü™fÛr´sgÌc[s­BÇvõ ´ Wr¿øý+l…𡺷,,ëÕ—{ªlÃâUm‡øÐÁ=áCL:`ÍŠ$©¶#ݶ.ä=½YUž|#¥[…_VQše«{öë4†qîÚ6 J÷ýIð° ãl/yàå½"“6ó³Ûõß2|ÓÝÃÎ|ÊH3e ŽYŒ-FœóâÞPÍ0“õIÁÄ B‡oÇŸ$CUG=ZŽ-Æ.Ðùòœ‚~¾°cWUî·Åµ]ÿJ‰ÄWú0i9ÿÕ!6JŠ Õÿ­ìÝcM£¯t”¡ßËF…±ÐF»Ç…=Ã&}ùˆ@Îi‡ÆùùÔÌ3·‘Ò‚r¾BÄOµ:²I(¨Þ*— ÁÀ¶¶G›3V™ÇFÅùL#çH˜]Û;©÷3Ô¯í!,ª^.Zë|ê¢Ç4Òù¡CÌkñþá(ªd3š˜âz¥O ¡Þ6Ââð¼÷˜Í2òK iË©ç­ñ[e1¼C>S!=wî­”W³ª„ õ{ZÂ0Æ]4•Œr¹î&#ØÞ½éU…Š™÷.7A«bÝeLrf_í”±åôc×ñ+ß6ië¿A¼e·æ!ãRu‰õ.c“©‹Ž~Œ°Qñ6IÈY|D•R €pkƒÆÜ6@gõož;·yZê…åLÞÆ¢· ªÈ)[ֆɴyÝ{Ÿž¾ÙÚÖ¿yå#öãsi7©2YY+ªƒD@ä*ê­²Ö&:£UH¥Bú‹Å)Ë™ùy³ËÞ&Cy‹ð庛HÆè<æÜÜü|Û 2!¯æ›;­ñ_•Ô6iòê‹ÞFEÔûs_>>É8žÚݵ¹ÆnlœŠÁcM–øÖމÝý?¶ËVè°‡­ýtÔÐõÅ&9A>)+6UA ïéÛwýMôí€^™¼½‘j[9Ÿ’ÞþöæøDyNÏÞYtTsÀý¨Y’'ûïnn¡µámÅÖ$¬üñ=zÆèºž¯­È„öüü•û»|w¿8›úJLé{—¢Æ­¼Þ/¤œ¬â’Ò;]Òþ©rÛ ˜OaƒðÃò¤fë¬{øh-¯”‰*DŠr ï:•,.ùõüÉ—Ðð¨l¸å²oÏfdïF^¾ÆâŸukÕ7PP6ÉÙÛ›Bõ#Ö©¿•!¼'P¤>8jq‰ùÛ`RYŸ.þŽ˜2óTn!·D1‰!ùÆAlvœ¦>Oh¡¨÷e.JôÏö'¿>5´jæ§MLÃnÖST¬^‹û—ï—­rì›ß.·ø¡ýØñ 4–³Œaï‰?ŠXFPóÚBJè]å;}¯͚1a;fzÅ‹;Àˆ ¸RÝòþR³ÿ8ŽÊʽ uƒúîòœc£Cn_F)h&È@÷á»õÌWHï]<<2«Þ~ƒ,êBO/<@ÎíÖŸbÜJ¹iº'cÐ$Ú½ëzc`dÝR˜TÅ5£YÙs÷ dš½g¯[ÿ¦<{²:Ï:æ:¿ÿî‹ËAàqÍó°ÇŒ}•–ÌŸOï€ý›yQ·Ã7÷“ÃÎZKúË·±ç‡§+gW é±<2*èØ°è¬•ØdæÜØÿq¯±÷X¡æ<2Õú`·À{Ljµi£Þ°¶ÕHÕHÆÉ5é7HHïo/³:¶äqï•ñµÒ/õy±íà6˜¡ßë±::Öº¢u½Éصö¢º°ÞëÆ|0§èU#=´ï,XâÕW"ÄÊñ-7 ïÎz£ŸÃSȽRW7Å„÷òÈÊ6D_n³¿˜%€î‘Â=Šž'€:ºãJa|e¬Žz§âŠê›«¤`Æ(^½I¢ÙÝ仉`-{&ss½u9¿CÉÿ¬~xãæèj²ˆט0HN9î·Ô[Û°ƒø¯]ló.ª‹ÜY&7)Ú:Ó`jŒNÄÄíÞÖY9N³`R4Æi8(¥5g;s‰'Kïjª9й8qvåÆ^ïf9.{x©ÿ›7»³$ù~X«OHÕëYw²tCÇ#WúÈÐÈä°”\kó+z3%ŠÐS!‰Ò>”Œþغ µµUã_]´ûLe…1½ÎÃŒÆ$íÃÞ,"_è\Ä@ b3–F4Ó^½¤hA,îPhàû‰WÐñÅb v[Dz±¯¾2Q›ò¯Î\ÝÎÚ‡ - ýfP¦Ö;¨þËt“«ÛS=¶Æ™eÏP¦g´p÷6g4rOÉÚûæØz}zRÞ‡½âÆlöp¥¥wý:Æ­i=ÓÓ¨‘법‹ŸÁšj„α(º_JÇÇ[æÑ6$‹”)Ï:f³éMNhlAŠš»ÌjVÛ_¦<ò8{V'e!è3žmš•›cF%=ªFìÌ.WöÈQQ„±Ôú9”õ«\ŽØÇ’%ôÁ›7!î®öå Þc’ºyþ%çùôdñ½r:ymZžzùTJsGÕª P³¾ƒù^Ù“ªûØLÕÍ/çvòák@Ï­àÈÍ9ý{;IºšŒ ѱ ‹†½§Åïœåé«p]€v˜2ÝÆžvÄ ”œö¯ ™ØœÜÎ÷Š ˜M¬åH›–qGYoGÂר^ÌškؘGÙæ­œöyí=‰iðIDQÅߘ­Ò@‡¶¥cÇÓgfºvÐÊÝ¡(ôáU4QÐ’+ëú Uÿ´Y›ás(ŠÐ.kèÞyع}„7êqă 9ôi¶—”Ȧ²>lbd·b‹0O³,ú̪þ¬· y 5å*I>ÚµÙ¢¡Id Y-^#´K«Á䣩”/øƒ³’Ÿ+Ž-ŸSK·E쥖,¬ÒC?”ÂXâ‘í#«ëž-ó½Ðûž–2ûð‹UêvKþÔrÇðûk¿cõtløÞ÷Úå -6gÛ$uý×yÆd›ŽÚ‰¹ÞÛ¹º¶ÅL‰tlÌÛPõ6$šZnAL-Åê•WÙ®m™å×\C”>›IœÛ¹°¶õÕ/~ß„,G¿]¼ Ë­âP^ñbv9‡¿¿Ç×H%ñ´£öZòœ¶;¸¯ö‚.öþ¦ïíòŠìÙk]»Y©+¥ÏgŒwF¼vƒPãL¼)F© }ëDŠýoVžÍÖx¬‰ˆNdna CPd²B{÷AÄ–ãßÈH…ºéª,ݘtáª]›];ê·û@Ú,÷¼•’gusP^mé…ç§wŠ2dÅd‰=›+ز⃠¿Æç2§Ù©G“Ÿ£î†¾–:쑵ìbË{%Aì—Í¿`0Ç,+UˆÖš3ÅIeÑÝÄ´â±AîX‰ÕX®óþŽw¶JY†L3à u«‹£o-oÑ·­CïµÚ#›ur™&»ÚljºÛ1™cäßÚŽCÔTõHJœýd;éXäÐrرª3Ú¾eïõXSnB¦‘ÍB­4ø+ßY–Ïz!ètªEäPK*Õ&µo aiádÁ¼¥·,Žé;yõmÿ9f7³a7Qµæ{ÞWÅš³)STÙ»±K‚­ˆêQâË,ŸeiÇÖ™­Å/mE?—õåÞÏ@¥×*ùÌÞçwqe% -ÿ,>F¥i÷ΗµÒ:hds(Ôºó1u2J ñ( IšBÖ±¤†nÕx0 ¡Î;Ä—_Gô®”$øÂè ?h¥’°4ò¥úäÀbÿØÜ Íq)ÇÖú g|a5ƒÓGáÉîÝ3Û jk>lÐÕ¦ IÉ&AÿpÓYÌA¶Œ£Ù[ô{r!Ù£¦`Ü,QödS55Éÿ´Ø=åUă±ƒ[ F[AÏÛÕzRºê72C̦\³‹uãÇ–%½µ¢Wûïº\ÇX\H¶1ÙyÑñ{ù(ù¼'+úEÐJ/kÕÞùÛÉu醒üÉ| ß°$G›¢·Û¸¦íMVì—Éðw勸žÓü9Ø7¤)Êì¡Ë#¸¡ÉÑ^*u–&Eø‚•z‡4ßÅÖ²òï¹]£õmβ¦)Íñ;/Ó€ºè|/½ï4‘Wcƒmi¥:­‹_HVçv2áˆARÝŶƒâ§·É7Œ·ù¾Ò銫—}¶QO‡Ë=µEúm!ª±’°òm8ú4ÅL§ì&:zÂü>N×Ö*¦;ýCÌâ<«lÇ#V»ŽÓe– ­|9ÍÛµ.•Z;t‡#j_>¸;™#òå\¤:°öÿÒ¶NÖ¾¼H \ú‡ôúê^H?ÜÚ7µÿŠkÚ{uòP–\³TŽ}àõeÞg?\Æø§„Äæ\çÙKÙ›À˜-œ|mE1!øî {hέýÚ~;¦Ð¾1¬:!]R˜m´M¸´_[\’‹k:,Kazé¾ÍÝ¿ õòŒÊ/i ‡”v¯{r ¨Š«AÛ?k´† ÈÁ•õC×Z܅܇ô(ÆNæ`IÈRjØx…UÔ^…\Ô±Ô}·¢*›x ¹ôÊ,?,£‡:bþm¸žUàIí sïŒ÷¼†ñ2$&š¯Än\Þ%,»JñèKãëñ;@1ÔŸù¼½Û'›Xy÷Ù2C%Å.ÞÄ 9]1LÏ×`G7]¼Ê»ð.æÊÞËÛŒbtËîÉ ÓÇž*Ì}»jžA²Éîù*òñH¿jñ|ܳe›êâ<à"'Xó;FÝÈÙ¹!2ÁbpÊ÷=¥ uåPÖ>û ¼ÛÕTÛ¬^ùuUs^øöds×?ï¾§Q{‹øâR–¦oœ€jDvÛ]ÁÚD<òKó]þ­ØùbâKÍ»¢‹téN%${µŠP tf:0Ù æ] £œ Œ6>TjéOžQil‹³Ïàz‹KS6CÉbC»MëïU¨?𠑸ò~3ù{ÇÇuýõóÉšÕ}I÷Ùcy^™¦bºO`X*Zûíg/¢“ì“>°¡5zÎÀŒyx¯^°ø£ãê½,ˆØd/P3oŸä6ñÇzgç~ñ]å"w¯ÔáÄïð‰Ç<$ƒÕÚw¯F°ŸÛæÉ# ’#L4PL“ƒ{ÊÄOÝg8e"ô¡lô¼=ãÕgRÐýẆ'Tsì.zxÖbºË¾J’£ñ5W}/ù°ä¹›òúrrú>Ë;šÃ®épÁx®@¼¨z{¹E­Ø³ì±éT5­SŸ^f[k¯/!nBúÚRsÈãtÿå ûñzÏvAå~Ô&V‚Ci…þo+ 7A´÷MnþMJ-Tß2ZíªoÜòa¿mEqõ¶œÄ ï<±â ôýþ€§u­#1r*§È/w¼«æ£§èxM™ÍjR ÙWùXÏ$ìg`Å”ìoÔbë•åG¹‡¹ÀOöåj%J° ׳’Èdç¾øù€ëy¤ÄEU“í²‚ {eþy®U4®Cš­‡´+‘ &MÍð¸½J­ÛOíÜ»z¤TC¿°]‹í°…˜órUNÐyª,&ÔcO)ÅGw1sñD—ʼÙ.ÉëfÖãiÀŸ¼þêôìåV}C,´âbß„òn'%­p\Õñe[æ[YJÅèd¯–¿Žòó©ŸZ Un$ UV¤–¡C V3wb­î$í[à÷(l°ÚnÕÉåQ¨T€¿S‹¥afÃ0¨œ¼YW U%C[þyY Ë™4“måâ­öJU««ûäl»ìãÒ“Ø=%¹í)Oè«•D,¼¥mÓâOrÐÅíW¯·(ñ×ö1§c)Ë%NNFY v>í\l'Q´‹Hß]¬cO¦Ý*¶ HÐnªßhf†{-I-,±•ƒÉz’D¶­·Ï/%ÉU\lpëR®SU½€Ü~i°>'qH&J=ÔØ~Úv`ðìyáÉKUD)û—·Ãwªðœ;ÐãAÅõ§+¿Ð/ýp•(“pÕcBj®óôG9Ï*»]dÚ§R®dÑ(}O¸lt| ÛÏÏO$šÎÆÆ@e‰YØ2ðd½'_/W³,^Ú¦“‘ˉà³ê°·úÑ”‹°CûŠ÷³ ïØÒëéhòÙbl¾ÒB—åßbá ¾Dëûf''Sìñ(·SgÙ­Ž  |r¶/>Óȸž¯—tTÊêì½ê1¼©sžÕ¡Êí/X§QIÏåYÜP!µ¹9u¡EXj/’]$k+Õx¯kI‡\]Z>weL]¦©¶ã¬s~JèüxfÔ)¥ÃYšÊò®§øãîà¸\èLÓ`‡å°ù§Õ `꘲“£ê.´¬Ž‹Á—F2a¸Ò±aêÒw{b ’‰Ú̱ã¾ÅÕËPÅgÉžrT¤Të8OGó¼Øˆô»¢1Kç]›fÛ2ÖÄ^F7¦&,ùt¶±‹ÄŸh¸ÍV?ÚQG$¨±zûÒÎeØV‡OG¾ÏUÀaQJ(™ãê¬y 0““d‰ <‹°úµ®À2 íØÂæNŽîCÛ¤ØCbÝeñ£†‡‘¹ÒB˜êR”£Š нé!É¥YçŽ:2´&{ÈÉAi!æöO¦“)Y¯¨Ô&|ä c郇q‡' ¨´;¡Ûdù#UöKÎv“ÊÍ\\ ¦òàÒ„û]0Öd÷|û¶Š®Ò.±C©ŒM¯ÔÉÍOrÏÜ­~0­»s3}Øí½±£²·’[…g¢÷¢±±)eÎØ2ŒN5ÉpØÍ"{Q³x¾þ|ÙXøFäœ÷¡Xò^hþj%ËÄ ^ŽÔàe{©¼ŒEÍ¢c„Ç„4Æ‚ùžn2‡ï‚®:. ý†‡‡Ýnû—©óhtmÃ'#IªK>1vKÇáol(M{Ñ›ÑØ‹Ëq÷ÞÛbU6JüÞä¶±¾ÍÖ‘×DŽÝîûóbÉ—û04Æ«ãi®w‡·¤kŽÉ“eôUìß-žëÚœÆPA¬çN2{ñ.æe.Vái¦H¾}{H½×E¸wG0$ö–Œ“ÐgÖÕj‡;7nŠÛ/×oël W­ót¬Qf±šìÎ$½j̇SõÒÍzéC¡Rèé¬/íôé¸fì­ÑÞ¡7Ün»O΋o–ë,¾=%Ñ$ËruŒÏéêA½äXÀ(Ž`oYNGÊqþÄ+Ãâžëeͤ©Óú’{ñÒûG8º!rÎ<ÍžNˆ:uÉÞÿ{G^9UhŸkïXzVÞm%bûùë=YøþiL¹Ë­žÔôáô,ÁPñOË“¦[Q”^)Ÿ¥¯í$øêâ¥:ðìtˆ€bµ´)§J¥Â臯Ò5ú>Üï’ò”h}x^äìúèÓ×J¯mÝD«¢%Žpº1£î›+纳w7ß>ª¯±Z%ÛˆŒ})5ž‘U•óÙ½¼Âz¹A:m]ú)0¼’}YŽx@‰#>€ëH0þê;˾Þct“c± u‹§Ã‚þp­à=vò躖Eš6³²‚’‹ÑˆÒ‡cd7ÿÓãÒ´dr&‘˜rÁÚ Á wû¿¥‘¦®\o°½,îÁ¥ç=™">!½4¨rYÁ™§;ûw5ÂiµõêäæƒúF rTa•Ä_*³èMV¯d9:rÞFUl^.ù…!™9Bä­Ý=j.ƒ:Ââõ]› ò=_žT+Ûä#"íÌæ‹|ÇŠ.¤ßÛDÃ¥©+ù^lÓ/ÙF”'èëleRFB__,H_]Þ?,ð¥áZúwAd£Ð5‹v÷ñäÝ×·î"]êû¬Ú¬åï|z Ъ²Œ9Áñ.9…±@»›r¸¿£,vþn…Š÷ê$…Œ`¿LÐ b… רû-KPÒD4x–=ž¾|-¬/ç.& ÕO<-âþœq2[¶Š™}»P–tñ~{|­:îUÕ±N,ã^êçI V†Íd˜Ü¨ƒñ5RÇ9$Jwî~ÿN;j±Ãèk|[€TÔ0Õ‰'µ,ÞcžF>2ý~S)éÓ‚3ÅØìˆeãùaJ ,Ônfyìæ©ÐnÔ^%ã7v´Ìø‰pWB_D.H¬i™Qá:„ú?þ›saú÷P—cZ|íú'n59œ7>zfàÿ©Hÿ?‡Ÿÿ·üË<ÿ|ýzþû'ÀωÿUä/*öKþ?~”¿Ä_Gþà_òÿð£ý‡ýUä/ù%ÿŸ?Êþב¿ð/ùÿ øÑþKþUä/*öKþ?~œÿVù‹A ¿äÿ3àùKýäþÿ÷—ü ü(ð_Gþ"¿äÿ3àGù ÿuäÿ+þ÷OåùëÈÿWü‡Ÿ?Êÿ¯ÿÿ»üÅù)ð£üÿÃñßÿ ÿ_÷ü ‘¿Ðù¿æÿOåÿ׉ÿõë÷¿Ÿ?Úÿÿhü¯íÿ¯ûÿ?~œÿ¡ßÿÉÿ§Àóÿ?úû¿˜D(ÿ6ÿÝÿû)ð÷òÿ[lW¸ƒ«£‹©©›µ ÜÕÚÑöwØÿÇãÿ}—¿Øqü¿#ÿÿWüŸÿ}‘°µ„[XÁ„Å$E…$--%D„EÍÁ0. ¶üOó÷ þwáÿbþÿÅÿÿÑþ CDÅDÍÿŸÿ,þߟŸj; î'"$ÂùcÈ@á?Wžßv‰ˆ ñA 1q >1¡ßX ÂDÅÿádˆïdþVWXTèè° ˆ0øè°‰_¡ÿoáÿ|þÿOÅÿû‡ùÿëü¿ŸÿÿïDp…ÿÛW0øâúÿ™Ùéç[„?999ÿññqSSSvvvœãP—cäçp~ õG|å·PhÏ!%ê¦]A'þbŸìÅÐ’"¢‰+¦¬‰–¦‡Xµ‰ø’éÖ'î%–ß{àFB£ôlVª€öµü•Î S¹ÇÉûgwën1©´®hFr]Jñ×ÚgIzMœ¢Ñ—çÈ T4#«&¥ `xi‰»«zJk_¹ÞÏÌ_=5JðüÆ£„¿Ãû˜Ô[|ªÍõÓ!øDâk{3„³åi¾L¬?É’Æò4éÆKµïµY³LNå—Ž"g(ñ†^9_þòuF5:ª}Ñ9^t™R§ŒíÒõQ×\٠Қγ¹*¤Õ}¢S~S;džëæž§GYÊ8ûOXöùÙçßG\ËxÁ¬Ð"÷Z RÌ™FZ}ªÒU&^NfcMþÙã‚Kë_8 ¯ÓÂ'Ë©í¶öHWñZ“|W;žÏ麙äJ=$ÍEî„’Óß½lTdŸz_eÆ €jš*ÈþÀÇ ¡©®¼íû"ËÀ…¾žDZ8z£~Ï,‘f¶}v_…õi¹ 1ãòX›N¯s‹!œE·ñ9õ&÷g‰—ú ÎX§F]f‰žSFfSó}ÉkÞ¢Ùøà¼­ÿôË&gî0â.~*{ž¹õ ©Y³3uÕ¯q¾Þ{~‚¬–¸ðzMpq ¾ÉÇ[šì›¹^7Œ .V»?7[›š uõ‰ªøŽgQS¬ÛŽK]¤«öàPå[âñi -¼ð’éiË1à–¯}ïõØì²lÄX‹z:±Ø`Ë«îÅ1žZ’@uw—°qš² :üDiÖ%ª©›*²ú¦=ƒn·÷¤•Ñè÷,LÉVÝØ0eVp¼ÉžE zk–”M Þ¬8©#t·Ãò 4—ä† X¤øÊ©·ڒÞWèÖQ»6âclmkºlåz—Óç.{ÚŠL—Ž-èuž]¦Y4»‘;@•8r‹oض}Iö¡,j0ʺ¸ÜÃ*nrJ<~#ÍlÜÌ…¼¥É¨¹¨\µyÁø¦nÚV³µ»þ Õ}î;ÉDö±Îvz5c=mr²û[_ªO;ùÈb|¦ͤôƒõªzøÛ«ka©>Ë&œŒ¼ϲ–ÞÙV¸´× öNÜ¡fóRÙåb ²•š©­|M±È.ò€6f2ÑéÒVsÚðº0™Á€Û3iû1¢˜u–±dç±E3ûYº—Ù· ‡”ÞýÊKÈÈßÈhmIûlçQ”ñ†Ý9,Ñ,¢3´¥•15êl.k‰Ð×MóÅ]Rcy|F¾¦"¹Ô#}qνfE¹tj«¦ÕaçÞÙ\ÕÜ Kå•ê)!6eç\³ïú2eVU±`Æþ(Êžn€xIæÂ d;ìy ±5)††E‰wàÓY"2fn%‚Nez>â%ðX”ß'À”>!gä .1Êzz‹/Žû’"§Þÿ³³ëÏ+iQº‰x‡GBÃÔ§¸rŸ?i £9Ôç×tú0žp=3Ò­Z »=­½#NçÕõ4CÍo×(M¸Ð$@ ~ë.Eü‡ž!᧺‘0^íE‡4½ðè µlûsÚñ†÷µÓžd³'Þp½i£Uôiísý¾]£\l¿ nü Ù¥"zǰul‹Õõò°¨‡ о4É·sþ~AxxŸßEÚ§“γi@àÄ{Ëú¾OL“hVûØê}9‘r±§ùocbUt›pbV—>²Éôm–™âûÜóy`rÊ o( ܺ×/xÿ‚ëû Šg´¶C§+®Á ¯b•ÈMoâ{xÌbû–ß'èuwn]8u'ÛötûÅVœÜ’CÆMãY¿)I±;W—ì§âMàK—§Jo;ßh:¹ú¤Z Æ°m¢x±üɳ埩ĚÌÎèLD|4ȪfÑñÒ å5ÞÊ¡œöÖ­Î?«?ò¾¦(Ù¡ðëÉ¡¸;]VÇ’úl³ûáFÂrÚngÏ“Ž›ŸæTMÕÌ,Íœéb=;ä|¿öÄô¾þ¹ÆçÏ%Ú¦Ìâ•ùêhvC”–B8rç[E³C‹Lù¿„žÿ’·­Aß:Ò”~gÿ2@âdÕŠ«°¼N.!cDñóÀ´ÑZÂÖ×8ÅÝyçyt cßIE,÷ª˜‘d ùxøYÆ–º¶ÆZmêãæ©÷«7×H¤ux×ùˆo©®à+•ß»ì¬îSèû#¯å׈ÿSð£ÿÿWxÿüëþïO„ÿù ½ÿóëùÿŸ?Êÿ/ôþϯùÿSàGûÿWxÿç»ýÿõü÷Oçÿ_èýŸ_òÿ)ðƒü%ÿBïÿü’ÿOåÿzÿç×û?~”ÿ_èýŸ_ïüøQþÿÙ÷Ä„EÄ €áÿeÿü½üÿxêŸúѯþ¦6Öp·ÿþ±¯¿Ã‘€ÿ ÏýMþÂàãû?¿~ÿýß!0 ›[ZÁÄ â–¢`ˆ¥°¤˜•„ [ýzþëÿqøïÏÿÿòc_¿Ã¿ÿâ࿟ÿb¿Îü9ðß9ÿ,Â' ƒù„%„~=yõÿü·çÿý±¯ßáßÌ1°è?Ìqá_óÿgÀ?9ÿ57çøù¯ ùá>à‹÷oÏ};óõ÷_«ªªØÙÙSRRÆÇÇ?ðu¥«çǧÀÈZ¾?–Ôî2t•±iõBÛíun,iAÛH½|k¤%QŒŠ³Œ5D—DìQLéT)ž*Õ£˜’¬4r—î7 |8*¯ÇáóŒW.=ï=q£Q§G·‘¶YÎp­gnKÓîp}<…·9êDªôSŠ{ïUjI×ý·;ƒ½Ä$ß¶<eZ¢0×›‰ºzIv|€¸TT©æ¥Ì‹ÇrsÕ©çô0äP?µK¨Fß_ÂëÔíÙ«ó÷Ò‰d‚©•0¡¢xVƒ'í®“ÒñÝ¢£-Á݈>ìOP¿ZDÒ{Rêñ¦®gÏê䎑ååÎâöV¾øv®ëãŽuÌòé-yÞf‡ $úò¡úëXß{927§¥å­*4Ö’AÖ$smeI·QŸ2ºB¼"í Tõ²ÒÆO‚#}G_¿*´»N—-Ê´Xð¢RÌø!|79õ„€²þl'%ç½Ó”Ä{&qËÙlÏ_„^m²!&«QÊ;çîïwõ’Q¶y•·%þÛBžH¯2-õperÀÅDVõ˜ö‘ñÁm<'h«Ü·gâo­>á'øèÜ_rR´4ý¡z&¥Ê¢ÊM%8ÈFæ<¯7åE•')ŸÚ>î£sƹzâ!¿2É÷k굤0ÍzÜs$ã„®j‚Ÿ¿Ü f'¿¨òAþãqåòWc®jRR=0é`¤lY ™<`7æxÓ륷…ÝåBn–-•Q\{‘ë:g€•#Ñ>úd@˜ý·–Ÿ(øˆ&¨Æ• p:Æ #?!s¾ŸÛF&`ÌÜýôLVžî2ƒV¾Ž·–¼G€ŽÃaK„‹Ÿ×óØ7*O†-°5!ô£bìóbí¦Î¼'4-y O?]”àM?­t¸JⓉ_cÊN¤iä=ˆ¿çR¥¬ù®ýíÓ3ö[ŽŒ—Kù¥Ã]L¿lCÎéÜiÛ¡{˜5\yÏÅh.9Z{Ñ0ú ˜ (á9vÝ« èLJöáÏÁ¢OÏ@¼ŸÜQ¼î°”\¼”I«høvpþàá´Ü»ý3K),T› ¥t¼ßøžo{Èn¤™ëfžu`3%aÌ¿)üpâ43,è0]þ’6½‘’á‰Û®—´¹¼ D ÎÄj&œXA¾<_p]K›«î6ÒuæÓžÜézŸnÇðn–M{–8r1Í IRdÎ|Ih>)J3_ ®ŒÖ?{—zoš…§èÞ†¢¨G]´íuÃoÚ¢–€:•GÖ2–ã#ŒÛö€¡—‹ž°=˜äJ#ïõÀ¶©È—Q Âza´Á2."4óxWŒè=LzœwÕ#–õØÄœ ãiÞr¡~X•{Ö<†í,GŽì2þ|þÿ”ä £±+-Ï'ãÛ,ž¹tٲ̚R;£%¡ÊÄ©åÁæþ—¶Gºdƒ¿â“?`BQRUœU"…w?ÊRÇ}–ÖxÎS¼f1{¨HOp&¥!‡¥Æ Ÿ¤ê´Qc)Ž X(ÿ ÖÄ„[÷c¯Áýùγt¦uŠª’WÒðg|¹ôR¤«ª>\ Ý®ÅUÔ£<ÁÁæ%äµY¿¹†ÇwFèîÖ ^É1‹/‚«é/+±º\Õ2ƒm…ÝoaÚ$j¯Væ¨Fnh=Z¥Ä5–×>[-ªî÷˜>Ã\ŸwýEâ·:µK0ßEZ\óéŒ+ãïúTŸâ|²Ðº¾w®Wñ%Gžz=¾ícz¦e3^Z6éUù˜ô\ç…´®ôHÃæÝ´©—’_V/‰,tº 0Hr¢¸û i›]®XQô Wj-'jpÄi¦êG)r QñZ|WÍn`×djcK“iô—9·lùÎ %¯yй¥ÏŒ\©} ›±ýð0åvâRÉ£ÀÌWC|hµó=tëõŽÔ/Ípî~Þ2ÍC‰ÌÊÔÞ§×a¨]o{b!³f(6©DzIª”l*|¶u ç>}p’Ð4Ëyƒ‘çÏî< |X|DFr)ç¨1Úü¥éøóp3A´š$ñù–f¢ÄöÌM’)Ü¡˜¥‘öëyEW@ûüÈ‘³ï\Å•†8°žnŒs%ЬÓÅ”' ÕFnÓÙFÀ\±‘MfË=3ç"_O(=Ó7zùPò,SÃÃÍ㜙×úF0ïÙW…Y߇ µÑ0¼cZ*slã&<þœÃÉ["ÉÛÇHÂå%ZÂ團%®l®H0ÌÕÇ_Õ®œÎ”¬©•øbÓYJÖ7ÚbÚÊ+Z +„§”ôÅÔ= |'ø [ަÖ«(±i3Š‚-;GuÚµäKÀMÙÓ«ÀŒ¾x!.ncbŠþ Ê$ð†jˆ(q÷1Ë]öÔ•'èNyÔž –æ6z‘g2¥ä¶Z=r“UÎæö%H³Ž¾£PÞÖ÷Øh ¬‚NÍŠõqÇìkùmRµÛdud”k…Ë]úÓæ)³KÄ*³®w_®K¾¿ôrZr®(¸×øáóË‹š^–ëÖYj¤\e1­*¨ÜËM«˜£¬ÏÞ'”©rÐ^"zÜ<Þ.­ok¦?è„%ÑÏ‘@/´jy׿ÝÀG iâ±ÝÚ¦£ÙAˆ·•TvSã¥÷¥Œ©ÄƒqäQÍð:ž7®Ê¼ˆi—fõØÛüL< yÖ®ŽÄûB++T¥¥à­ÐúéÛ LF=7š4¾XÚ4O Ÿz…Å’ÙnîÔ[dž”ß­Q3Gye¢£Î[¨Ê‹TNCK&Óý»h, ¸'Á—›BÉY”Ø•­$›¾òŽeºÞ›<¥Ÿù˜:ñÓ8jLÿº"ÉK<áÓ&ݺ‰q¬.É÷Eå¹7*$uf}‘øL0b¡BŒ¥]K h<•êqöÌàÇÿ½'kâêÂŽŠ¢ .ˆCPD–„’°„(" ‚a+ ÒI2$Ñ$“‰¡5X·ê«µn¿ âRÅŠŠ¬²Ä­p© åY‚Öò«­F¥ŠUä¿3A…ŠÚö{úÞÇýdî=÷ÜsÏzïÌÜCvs K03p¼À.Zûã—š=ë¬Aè šföMÝêãuÁ­W‡%㛇¾×0ÿÏ—îûÿ÷'ÿW_þ§Þ)ÝåÿåÿêËÿÑ+¥›üïOþ¯¾üO½SºËÿ=ÊÿÕgÿ½Rºûÿ÷(ÿWßûÿ½RºÛÿ?œÿ‹E÷f±h}ù{±üQþ¯ò?`ˆKMå©ÒÒ.8þÎïxþÇb2‰çL†·/ƒæƒ?ÿ£1úžÿõJa;OމKŠ …Âã¢"¡˜øI‘!Ù‹JMô ¡R'ÇM64øR¼iPœ–)Ř•Á*5t:™cÍÆ•‚Ã!°€Ã–" ‰0Lî…ÌS‰ç‘CP†È0¯¸ 9B†ø†« 2®Z„ÖòE°B‰`Ab%êåçÇð÷¢á811&A8Ó‘t(V,UI` U@¸fâŠIè¥A-)@+¡)b q‰7d|„M5t¶fKIJ¹H¤‘)*ø ê !"£ð•J2¤@$Ad%–!A”"ÁÈHì¤ ¨†IñPA¸röò‚¢€1Dñ2 ÉtâKñ…¼¼Œ@<" ‘ç‰eDMæ°á?Ôt# Ï«C˜™ƒ?lw•ñ”òÀX¦s ,èí½Eb@‚/ÊèD‚ƒp„¿húSˆ`™ Åðy½Ž(R¬Äþ¯Û?½/þ÷Jé!ÿ{“‘‘ñLâüŸï!Ocðg\çù¿üü|‡áÃåoIÿ¹ƒŒºþ³Ûñ"|â†ß†¥Oƒ~§ù»¨pwæDÉ\xî­Ûç#[ŠNÖÆþPD®Ùô“bg}í£9'(ÂõÅÅcg^ßéž'è7q$fpøäpGÍàZ—i.åߨY9>ËÞ™|;u¡è÷!etgù™IºUK´£úe%¥{šÞý€Jj[¸®àVô‘Ú•FÓ«™ËGeYFuK8––ràøz›l“ñ·-¯ONùYÚèuò·@S›]{\–¯U=ñxºðPÒJíñÓåuAŠ w®­ß?ù”œå'š[å¿?ºûãC›q­óütùf»* ÑM¬ L![?ž7ÌóÌ©‡æA­Ï/\¾vu˜Î|ÍêØ5Òõ™iãk4 r+Ø{Fca—½%<Ïcý =«ræjIËÅõ£v|³ÌE¿yð‡éa š­Ù ¯±ÆÇì:.gîŽðBçrViBPeëS˲¥+`e^¡ïÀüöµ¥VòÆ©VƒÔñ¿æGÕæ©ö–V› ÕÍtÏ‹bi«Î¯¸ü°r_¨éìÝáŸ0SJ¹ Ùì ó{CM+Rg¬Š°“ìIßµ%5å³£)×|?¢æ…[–ÅlžM®ýt×ŵElÕÙØSé:4üêKvôúE[ª§¨Ï›,g;ëSâûÉ6'·ê\J6 »–\}ï“ îî«¶ŒT{üæ¨Id Ùð”mÁX¶tË÷ÌÕ7´wŽX5\s•ìa>»&J”9 Ö1N;½ô’§þhsÃÏFè`uƒ^¦Ò°,ÊJ¶~Ÿ`¡ækïÔG3)¯3on¸k„šùtkŒéì$×ù“fÝu‹2bõ»·ÁBm¢Ê( Ô6˜°n6<0J·¹¶‘E:0FÙè•nwF{.ÃEïNÒ5Ì›gí¸ˆEªsX>¼¸a†#iY†ûR­Ê¬Õ®ÈR|mÜã°©ç5&è Fæï ¶]Lªì嫇¸†êŽ.ºž"j¶duk´LŽ–Gõ3-tÑʸþŒªJ'Ó {Ai1[·ÈÔdý€Çvð[((5®è´icš}ƒ‘SSò£ì‘#ÕÓ+V}Ý6çÉã õMí‹¶»Ú»¿|^zÀ(ÿÀHu¹ujÝŒbqÑý­ÿÎIªnׯ0žóÝ€ðýÑNû!;q þ£[ÖÌ{²x[î6¹îÆÃ¦aú}¹Ô¡kª·iwKL Ó]|¾Î<£2wÁ¥²ÝNNß›˜_K}ÂsÞûÈÖ³†©Ÿj’2m™ÍÏ$‡~cõšÂó¡§o8=‘}ÇBí/=z¯¥æS}¢U2KËXvzƒ1аuN.ܪý”<Î>*I5¸­d}уԱòÏî§Ÿ¨°S»>\cw±°iÉW$ê@}õ-Åœ˜›7ÆÝuÂö—w=}cü™SwŸ£;WW• -uªHB¢Zéo‡¬~ø±6¼\_e¿wÁ°}EVY¨¦nøý”þŽè…KíÆ³QÍG6úÅ,RþSRÙ]£§ ¡¿älùft…÷·%WLõGùYEZd%—‰ RúòÊÇ‹·=Ùº¦ÉëD˜„k¦°´ÿn zû‹3Ç ef«xt÷ú‚òý F™°nÙîz^U¼¡4H—±ŠÇ$%í=T^¶•ÄrÌ.k¨?¸sÊÍA~ÿm)8˜»"ê»ú­éÈìksÏkFº®Žq—<Ù>d–Ö烳[¬gýÒ”,Ó˜äÜüÁ¾¤>ÆÑØÂqP½"äEò±e£Õ¿‡²´CülüŒ¾i/edÑìeòÌL_bÆ®Î&7MÓIGûõßEIŽPÔoLH6MŒ¿\Ôßq}Ý’}â$Rã¹gs]Ïÿ:ÌïëŽß™¥.+MÑM¤|/~p¹‡Si¯õ@ÌfvÈË×wܨÿÊÊz,6ÊMún”| y»Eùé«Fg<ÉõâE’ÄÎ’skÊíµ·~+=ÎÜí¯W-:ÔÖúqÕã-çÒZÊ*ÎIØ~.µººrǼA…ÏÔ¦IÿÕ—c´I×hvÑhcÙ­‡¶¤V m[³¿ÙÌê™Ã…¦´ÀôÒ_Ïík9»ûç…ëlV¤æ·³b?—Ÿ ùäk.{fù*î7¦w—aOÔ%GZ36Ú1¸YrnhÛñôêº+«ä%å¥d«¬QÍ*MlÚøº©‹'dê’®’„ÓƒFŸ‰=¤—’Zœ*ŒŸc>ŒÊŽMŸ®|v9óóœñN³1N~árúäqŸ~þfÏ3æ‹Ëm õ@Lrö7/AÓ‚œ?ß±0ÿÝúɶËûN·bÅÒ¼¸sÖÅ⼬cõÅ\­O¿ã&MóÖUÿëÑJ†ò•têá@Û­7JZ/5:¶9p¥÷m²Î̘¿úôWQtŠÛ}³™ãmôûÎ’¸3#dAµwÜÖÛë6åW¨Kclýô¢ÒLSR¢©MVÝŒAGÜGj·‡:BéüW]ªCF•a·Ý|õ9F¨…^´õéÁé£F¤|ñÃGŸj²ï1Oˆ=4a{ÅÜëvÜ·ú!^khÝáÚ!»R»¿L¸##±ô'×~ Øl’«X^ž9såèõ°MUA4Ýð°«›òvÍÎ{”é¶tÞÅaúHÇÅ,ÕÅÑMz%ÓŒYí; ç3Iº-«='Êø^Ú"Ú"+ùœú„€ÝåÏG’r¥;'§l7j) ËéØ(×ú4T1‡­l?ÐmZ™»gÍøcñ¯ cf§Uæ_Ö8ë#5©¤«»_aG0ö%ß:|sšunL5ibÂò“qUñKë›éQÔÑÿnÆk\œ•q)Êv¨Út›¹[¦i¿SpÁ:í™–RÏ´ð¨ïßš3ØbBEЇڵˆÝ05KêS[°è€›ç½ÆÉ[ǹgòXq[né·Î©2õ:ë‰Ó–ökšÄo3uâF·èÚ+Òë=^­>b¦›QgŒŠ®øõ^[Šæ€Ûo÷Dr/ò5k=Eu<6 Ê ÙëDÑø ¬<2ë?ì] \LiÏL‘"•ÅZa¥Œš™sæÌL·$Z•BK›fÒPͨd()wV!jkwI_Ö®K|,©!Veå“Ûæ’É%–t±Bß93åtær´c|ßy~»¿Æ¼ç¼·ÿû<ï3ïsy {dúw5òÄyãz“?ù6ßN a›÷øË.ùy±uÂGÕù9,#oðêÞ8ksý±eѨÂëS×êuzp-åFò“˜ÚÂÓ£Ã.0EÙy‰µYFcê}Ç÷}Õx½WB§Š)”ã‹g|[dLÍ÷°±öX¯ç·èxQ˜ùöQG–7m»’ai®'âÚu®MNÌovŠûãòÐ^fzÒGÒ|Ü~ß°ûä¢ã‡RŠ8¹¯ö~QíxêvúÈú¿ ‰ÿ€_Èée‚¬Â=•6{}&Küú-=é>5m&÷—¹5~—g\ͯ}åIݾxß\?–þ¬î/žwóz×´ÏkàmcÞfË:»g+«益·¼Ò«±¥Àÿܾ ¯÷õ±»~«ætò ¿n;³wIÏŠ½Ñϧ§þ¼k¹Ý•8éæï‡œ1šÊh¢E¥vë‹NV}o-:œ¿ï<éöTvúùŒí ÓâíEYù’AuÏÌŽöÜðvÞ±mKîÞÿîþýW›¥™õæþ…FsÞfOÙÿúíš0z}òe;/ž¹ÉÅ՘dzI;·ZHî·ôáYO[UQyÏuÓ˜“;3çø5<µþ!ÆÛÑöwRsÔ`Rtyу†» !Íù[²H£šØ¯/Õ6¿¼6ß©÷ý³õsÁ™ë™] í>ÌieáÅjA5Wœ[pР¾vÔ“üŒßº”.ó"ež>y÷LöÒØê%ÕkÊjéÒåÓî],Èlæ××xnÜåõ(ȬjHZäšq凯¿Ÿy¾iòÝjû¥IfpíÈÉp;¥ßñë¶CièùX–Îɬ) Î .8`P;¾ðÀ5ýº$}û§Ð™k•=Næ¼°\]v¯+k\I÷MOªÖRÉÇXY›½’k¾+uŠsšáUë‘ùüy­ÿt»ºé/FŒºW__?Äa`sÔAƒÒÜ’ºeúo³/ntà·zk·kÓ°®>$q‘éàܳúúÆ<‹¥lß„sùœ×?þ6Þ–r7?No~éuoYÙÄ­ÞÆ/DÌ´ŠÖo9dŠ<ÊDZýs ÞÖ,C=%̳âoplÊ«fÃf×(—5‚}”S£½ù“,øµè‘±™Y¸;òÑjqÞzÜI~[-Œï’9ð«çuö·ôÄÅ4`™¬°ÈŠ7îÑlQíù×®ËG:—>n(êÛ(ºõõ޽‚Wç4 /¹—ëÍ™'®¬¹2~r_e]tͽ²ÏŸý¤y—ÎÏÝo~^Xî^NòœaÛ„|qó(#iÞäŒ k{E]#ØS‘õæÞ„×…·bb*oÁ©•›§TgX_]PW¾ï÷ø¥\ùÑ{Q°íÀ+OsóROy[ž1’O™¿ÉÖ¸!m9ýTUŠýÙücå¹ú³<ú4Ïqñ¦…ÆÃÖþº¯üæ¿¶7Uþ~»ôÔ›º¤Ðàr_g³ðu7¯’ טÄ7]Ù–µmБW§»„î]’ñUƒh³¿Ù,mx€°aWN¬Mù”±#ÜLJþœ=¶íدº]cžûF×§/b\N«þOí›Çß§{x°ÿÌõÎÉíg¶ocqwpý]ÎèÕ ¬òïso˜ŠÎ$:wáîœ(ï÷ÂúüØ#£óúJ¯t~ö¿:õ¨{òijz£tÞ^;Éî–÷X6aêÑ¿ü6•l{z˜è«Ž“ôšúdqHý}·pëܪî­ß kÜõ‡Ó½»”vÙÿ¸²ùâšQý“ ûœBóOÉY›i}ű&}è?¦íè±fßÃê’ª*CZ7ï¿GK—Ô¹Yˆcwsè}7ÊJë^W~ë¼ç‰wO!%¾Ëëâfî–žÇr^Ư\ØØ£âÎÁz¼ßKiÞ<óLÁä‰wïÎt§W\Y÷ÑPb{Ç«n×t‘Gñ=²åg/É©‡güòÏÁ/[¥š¿¸åT_—¿@ =;ã“-en¤€‰‹®º›õ<¶2a‰ôpÚ¤Ý&)e9ÛclÇÚ3®;{Õ^xèüeŠè,ÇäÛ=t“d¿Nß 8Ÿîxºöê`‘MFòV³£ #Ûû¤:NØœë&M≬~tqG¤óñc³†‹~]÷fƒ¹4xij"IXâíµ§÷áØ ú€ÁX騩–~6‰æôrÿšP²ønFrr¸ÕiS1yæ­/ö•¬gXK?s÷èºÞK†ÈKGZgd÷ä~ªÂÜìïpvÏ’¢kÆÌŽ“^3úfèö7º½.ß!θÚgÇJÉ%`Òv£„Ú _î/ õ,áJ~ší˜ñGΜÎòñछT9)<ÔÌ>>£âÍí^•ЋäÉ2¶™¿ÿQ£øBN@ém‡³+\Åsí™ÞÓIá|;èx²äÍòäErâÍòþë·ËWJ®%K bž˜ôWZÀíÒ` üÌ î¥”Ó3Ì_ôï>ûú]nöØc¡f¢Ÿs——oJÿîA¸ÙÞ"³ZÎnúÎ+шd³¸è¦A°2”1“vÙfðhiôåGM[g¾4ÝÔÞ”½â©ýCð\W\²ìY(ßðæÄE}ý±ùïÊÄm{×û·þòýÅT<¼9uÒé©6ÖÇ*a §€.õãì#=ì£Yöͳû<¾…xt/E™þÝ\¤Ì©±¾&%޲ø®¸„7ìLÏKÛ^–¼êóóïñ—2¶í íWixs_âwoB}ÿuWé*»ØÿX%ô]—ÝrïjzôG÷ø>Æ ×z’.ô!-¤Î“_€J2çó=Htö`缺½k%û&<0‚ÑâJ]¬“fÞ¢v1¿ªd€¨:;™øÞÅ–ðÄ;!¯tµàq…a%¹z›Áµþ,¹èÍïÅ^õâ×jÒYÓÛ›fJ¿¼3Áµ/Œ«ïÖ„ 5søýØ«Äãÿ|äõ‡?΀+ØKvõt;7®7¥šìÉ÷¸¸-îñÊÆIóõ¾aöúéÈYãš%÷IG',’Óó×ôèö£‰ õçÿt„LbùظM^.éß)ûÖ„`&eqš•ÈÛ…ÁéNZh;)}°Ëö”`ï:†±ÙÑÉ>¶ƒm÷H Ê:‘ºø%§¯ìÒK¼¿´`…¤Ó½>a…÷ï>cK…Üc¯KÎQï‹®g?^ih1yES~SÑÕpÑ"“µñ1/–X”ñš&®­KÝ2pi÷Îìû¶CI]zW:de¤v~[åwŠk‘@þ®®Ï€Ê~Ò ýÉwLüM+n^“géDZz4ZÌZQPçë~*šÎ}ê™ìë/©ti€œ¥_[.N$ºéÉ 1”–hŒ~cvâ¼);eME°¡…û8! o2ä§#}I«Í/Þè–àÜ5f§s’âù <«oŸ5¿>Dküéu? '¢ÿ_I °ñ?:tÿqÿ‹VkÿÑ¡û¿ˆüßZ!,ÿÚûŸ À¤ yü'ÿ«RĵÿFðåÞÅû‰P;þÐrÿ·,þ^ 4 `Ð û¯6èó‹ÿl]—Dð'ü©#ÁŸ¸KRuäg›€•ÖHJk5‘Žxá*A< H9\Å‹‰•TU¤•ˆOÙ£ðxfkôèM„Gˈúø€S–dªÜåÔ›¾ÃVM¤éûv€ûÐÖMŽ'Dä€ÚæåÅæÚv‰âƸÎV;AïßÚ¶5̓[•ÞRÊýNU‰ nT+EeÐiT¢S 7ðÆ(­ #ü°Y:•ɦL•Íü§BPÿ‰(ºO'Šþ—¢çèDôÜÿ`ôœ¬ |ûÒPûÀbÈó?ù_µBŸŸý¯u]ÂËÒ>„0@0â¯Év-€ðk”–*Þ/oÄR>}w–Wä‰tEéü-üpc Ì å8A$°ùx{ÓGǘsxê¿Âee†£)4ÛŠ º¦[Ê?Þ‡Y*¸–8üGý†¬©-Ó æÆ8å×ÔYãŽ|¸ `i•N‡¨L:@¥ƒ \CKv'…*”ð-q•Ae¦8ÐnŽÙ͓˄²<¹,: Ƀ‚Û ~Ju °ØˆE‘E£c-Š‘†—É“ü²YÌv;ÿyx9 é2‡ÃTe5’g‘-|"\IY" ‘IGÄè…Ôº1?Á¹õ_­lÕjojÏ„ÄÇc˜A?ˆ{÷>ŒZßT9¿°æM§©ío«÷ÚÅΤ²¨  `»+½íA¦± GµÛ GfÝæpÔë¤Ð èÀ ÔÀ•³®BÄ܆Øãä_SÙŠØ%ßA.ÛþùLÎ2ÕƒßÁyœå[}g0þøý¿£rÿ:£Éwå !æXOT©‰´§PW‡f½W­–h#·°N¨g„ƒá ÑáëÀr¤~Ÿ/aÏÿ>müaÿÕ>añ×!û?D௠ÂàÏÒû?°ÿi‘°øë‚ýŸNØÿ´HXüuÁþO'ö-]°ÿÓ‰ý_‹„Å_ôÿü‰û?´BXüuAÿ—ãÒüµAüÙ:¤ÿúŸVHÔ\#¿G1Û„… Ã?& 0žÿ¼:Úä€û¿™4"ÿƒVèóóÿjY—òeI$ |ÀtĬýuÙ®˜üÝ÷¿Á”éÀ Twƒ©³¼Cêî1•¤7~¾&Þ¶¢Æß ;›º˜{Auâ °£Sd¼Gâ ~DD¸fíkœw#,0*DùAÍÝÝ”¸×sˆÍÁ×A4uÜQjXsÏÕ¯ªtª TpÝQZݸ>5Jgs¨  2èø>X–’©œÎ¢‚ &ñ݃øðHå‘´çEF£Âš•Íÿ‚øžv,¤ Eÿ£và@Ê„8TX3¤29øÄ…¯¶ñ°‹†ÖÄŽÉ© ĦB,€ rð'‰®àCÕ 7â" m÷šzŒ8R!ä 5þ|!¿ÇÛ&b·hx‡ ’»=T@& CT þÛ¾‡%‹Ñ¦A82oˆö|YL•1aäÙT¿ yN[hF…ðÚwQd"ÙZaÀ9n4xÏn»¸„ 4ð€D˜ƒÍÛeŽ ¯íeñÓ„0ŸZ#! (w€b;4Š Ï“°ç:dÿ'ì¿Z!,þ:dÿ'ì¿Z!,þ:dÿ'ì¿Z!,þºcÿ'ì¿Ú!,þ:dÿ'ò?i…°ùÿtÈþOèZ!,þ:¤ÿúŸV‹¿éÿ„þ§Ââ¯;ú?¡ÿi‡°øëþOèZ!,þŸTÿ‡@€Ig"ßúŸÖHÅü -–ζ2ïÝ0Žÿ'Ìõ44ÿH“ù2h„ÿ§6èóóÿ”­KdYÚ‡P¼å¹bG;Âí“pûünŸm–£ÌÃS1Ï âü¨«JÉ`q¼ æ‘@™ [9ýQ›…8y^j¢¾Šo[½ABeRVn–}¤aÊ´we ŠɈÔZ\±(BÄŒFXŽ´ÓL ˜ìâàí6)`¼ÛD—€qn“Ü&89 ¯ŽT¨m˜AÇ«¼åm¼æá¶áü÷kž6ÏРy…·ômfÔøVªªD+¡`¢eLlƒóø‹ #x–#aAÅo©ûŒÜU4T?/+KgËÖÇbÚÐv fÙ’ðÑRõ˜Xh},Ê…B6ZÈV0-ã|ÀÚóç¥{]×îºÖ`é½›T‚ Þ°Ê÷a1J¼Þ6%"Vl¼Ëg©zV”w\Þ±â‡óÁªë@xPÚaExp‘AYµ‚ ^šJåô¢jà@™`~((㸌§úm”ÍÖ{Âáâí9ÕËÙE=&(—lma‚‘Ÿš;Õ ƒJ_’¨GD%¨‰ÄPxeWŸ]•ÐÁÝÃ@”…AMX¸Cä˜zwW4<¢EéQ‡ˆ _xà ‚J PI¡ð6ʱ >ǪFdÜŸ1êaAYÔ„•?Ä©–¯K/0*P58²"\„PyâË„P¹j"7°o3[Â7 Ö¢™ÊÎĈ’?N¶e#—Õ&ÓóUëMr§æV0>¾=UE²æÕt@´`v¨ èâ†×žì.&•=ðB6)•€Kdí+èzLt2! Ljz!ˆ†ñ´tÏQ¡d&©C¦ "#öâùPZÈ®eÙEðƒF(¼ g&y[ ¡r¢©ë"ò;Ýräl¡0´u [ºÖ‡âÏ*üS,§<«j0}‡§R?ÅVaH*í!ºŠ!¡BbàÌzÛ5¡0é*?!@VÅÇ.Z«@šúu;ÔÕ;(0<œA±‹”P2*Œ!Pý˜¢Q C5Zèšõžê8µÝVê%*ô!fÇô¹çRqÏ­JVleC»Ž9aLù*ÎãË¢"†¶Û׿“—bëZJ3ŠJH­QfÏ>€_ÆäQ|ù©R;ŒÎ†•K†jF÷kPÃì>-•à ¥ÌîèV ±´: Š9@„Ý'št'€ØZ¦Â<ÈRè äçrCÑ éý˜à`~PŸç"˲ïC± ˆ ä+Ý— ŽVG©@U÷,ªå¸RaL_#…‘ã#0Ù |ë¨DJƒb¡»)‹¦°-±Ð]‹E§,Q|Ý´X Å7Ñ݈¥6OQ¥õ"Ñd²³I;Õ‡xvï´D¸Ö–óÖØaE•Ø‘ÆþHÓû?ƒÈÿ£ÂâO×ü û¿V‹?Cwðÿ/{×UúÿE¥¥¤0.éB5eæÌÌ™3¤ËFº Z]¤LÃ0”ËŒû­HnÉe ek’R±•Í-JI¨­H’.ä2¹äaÕF~gìVsä»[ûÛïÙóû½ÎûãÅù<Ï3ÏûùÏçƒÇ¢$ÿìðÇ¢$ÿTÌðOÁã?Q’vøÇã?Q’;üãõßQ’:vøÇë? $ÿvøÇŸÿQ’vøÇŸÿQ‚+ é8ÿ¨É?†ô?\ÿAHþ1¤ÿáú*@òý×Ð’ é¸þƒ ücHÿÃõT€äCú®ÿ $ÿÒÿpý ùÇþ‡?ÿ£$ÿÒÿðçT€àßCúÎ?*@ò!ý×P’ìè¸þƒücHÿÃõT€äCú®ÿ $ÿÒÿpý ùÇþ‡ë?¨É?†ô?\ÿAHþ1¤ÿáÏÿ¨É?†ô?üù øgcHÿÃùGHþ±£ÿáú:@ò!ý×P’ÿUÿ£T$Ó)¿ïÿøó?*Îÿðäµ"µÚÿv !Á’ÿÈäaùÿ ‚çÿGÿGóÿ\–x ¼Fj|^’#Ö k±mض½þ¿¨°i¹ÙŠUzë þÅz=¼&^¯ €×Àkà5°[à/ïcèׇ•ˆûòÓËGvD? a·>ôÙçYðn5r>×MŸÞå§ ô¤$ý×÷ùŸþÉLôŸFþ»™è?/åS&úïz(ý|xù±ÝFÊBÿy³¦Ñ¾°ý=½ãP"ùá†ÃSèû÷ç-˜ö ¹¡?æÿýäEC)ì‡góý"õþ_dÖÿyæ¿È¾ÿO,ÍsÍ‹®Î¯È7?<Åþÿ>“û×~¤œóˆá1Ú¯ËøÿoçÿúÀFîyD„?«G0<™5²ÀŸe´ÿ§“Y‹Ü¹ñ„Öh'´ÆñM@êÿŠÿÅ¿ÿAHþ1ÿ‹Ç¢$ÿŠÿÅã?Q’ ÅÿâñŸ¨É?†âñø?T€ä;ñ¿T<þ ø·ÁNü/ÿ‰üc(þÿDHþ1ÿ‹ŸÿEHþ1tþ×P’ é¸þƒ ùÿYXáŸNÂõT€ô é¿8ÿ¨éÿVXáŸNÂõ?T€ô éÿ8ÿ¨éÿÖXáŸNÂõ_T€ô }ÿƒó þÏÆ ÿt2®ÿ¢¤ÿÿ«ßÿT ,|ðÇõô0œÿÏÁýlgáU&dÿjÃe2…G9²ÿ)B‚ÿóùo’ð`…ÿ1@ðóßèÀŠL¥S@¦±*d3„‡ïi†5‰Î`ÿÛãÃñßÅ·ú?‹ûí}ü…ÿ ŒÜÿ2…âþ¬X®6j.6¶6.6.\l¬ÝÔf €"#ÿ8Ü¥ÐèDHBˆêÇK-6Yô ¥0™€»“µ02ž Ys¹˜’" ¶eÀ-Ð>ÚZi±©6H[ØÔ^¶.jJ&É$†¢á5"blE1æ–pqv5@"$©Qè"úd½ÒG0„»g9²! IC£(ô P´Øu¤Øö{7b$Ép T"A"c§1FnÁÕÚÅÆÍF¤ 2ƒA¤¸ ø•ò© ØYɤ‘šp¶qDL‰Hak¶†"[4yLW7–ã°9 ’)Cs@¥’>6@‡ç©a aäQAêyTÆ'söÔ ²ÕØ;Ú‹ZQ¨D¶iD•,2j u¸ÕС)Dt" ¤Á=Â+ŽˆfE~ [´Gˆ’A¸G2¤"D±E‰²uÿbœ dPD|‚Dn5Ò8édúÐ8éÔOþd/ Ñ÷hçìæêÉâ"–5l¾D‡`PE¦b‰Ú;yÀ.èìâè“A„ÈBSø•úÉI°»#š~1hx5@ ãw?f€" °¿8H˜[@š[YÁ4›OúмUØ‚.ô`¸]ä­’D¹tµqrEnBϦ—r}UÔk“ô‡%Sx”ÇÙ áuðfC¢jTøûϧ¨pßÀ-¸ÙÁã·sv`#¡Éd@Ø< 2•!²¬@ÚˆÇhE¨‚`:ìx¼ý$Òë|Ì7Þÿ¹NœoïãÏïÿè_ÜÿéøçT°ÏÄØ@z‚¢pyI¯^¥·^Ll_LltÎh ø/j‹Ë6Ã/&†fú ¸ƒbbyyyÇ_ºt©¿¿MM “ÉTUU…/<"-&å¶Þø{±eOláVÄVë-7óâ·3ò|~)ûÌëšæyÉž¥>Ï ž¿ÊJåUg:Lr]w0<4ç{w+éus\RºæUfh\;äzнý„õ݃+ö§}kpŠí`²¬kÛ´UIÍÉ3'ø\îË#]èÑÚ68ʶBЖáÃß¶1:ón ¡ip ïñoª÷/ºG—_·‹¶Þ¦kéCÈ|3Z㇇õç"« —G±×n²1XÅãkjªQ=²×T™ {½i…ÇîAë2•×¹½6´I“:–T6yÈhœõX¸Ï5'~q®þ¯A/Õ¾Jƒ÷Î%ÿô¥¶çÞêÉWÓø.wg—=6ô¾ã[ÅTíZ"ŸÑë¥+ßÄ.S.0òÙGáÄpÁ£Ìë>½ª—òÞ¾ÛB©1"ôÕŸWP\2xômùtÿJ•â^P\RX×õÖqA2t|I™S}ó æz~Å»/Ý­ûÍ KÄ91Ð3ϵÎ.êí ÓyêÎÖ¶•ÚfZÛ”Ë50OÒÂ@‡¿úmOÁÖ[{rcJê¹Óú¸;®ñ…LüŸ¥oxRD>¯Â¡Œê3¡…¬¾þXà0Wíç¼S*œ©æ;AË,vé떌ͨ®ôá>uqÁ#AÖáÞë+÷KÄÆ-¨d€M²¦O~œj]¾Q¹‡¶¢¸” –e3*åSîý125°é}½h‰ËípOrg^ ½.Ûmš ^V‚~Zá2k×9•“Eó^ÔÅ·;Ä´œá¶^ê‹ëR&fiçqfZD§õ‡¾ï´ªè÷ »ÈÑSžàÃ_©ú¸|…€:?_,0WI/L°_·”BÐìO›ï í¬ŸZñ]˜›~ùÑô„¥6!åÊù如[÷ÅÝÓ4u 8ïÔbû9:‰¯ùÞg4¾‰§úƽsx•ÜCFÓ&D‡Ý´JI9‰Á¯¸{†·ÜQ«¶Ä©¦QÊ¿nßÕ¦É;¹µ•_RòDyj‡=#ótªë›Þ¦¿7úµ‰©Ü(ã[žV¶·²ç(G'hˆÇÐ3¿‡ºƒÂ¸¿LUšqÓª¨1Ÿ)±–R•j{Á2ÙE•Ëœ%¾.×Ç@ú|„DÜ]ÅXw~¢ùÞŒ=—Vñà_"%Âï*šEgØp/FxÁ~†÷ú­Ëô«Õ£ºVt*HÞc&®Ô5޹± {¶ø²\É\+j OÑì¯Æ±Y5j]ãÅQ’N+¢y7¼Ú¥Õó÷°•z íôÂ{½2 )óVÎZC.%FQ@ËÒ 2YŸÔ-¦q¼)70sù“•6^EWÛj_öñ¯&…ôŸPË(ÊDÅÜ4\&Ǹº€ É÷T¯æH‡Þ™K7Ì06sK7ëÐW¶³°î’Si·’¤[Ã*½½åæàÉÒ?Õ‡?vwqg¦»ý/¯xбÅ]ù¥OÏ ¬3]j”ÌÛp‰¢ÎSæD©FÍcÂlUGªßêºE®`åÆË„I“,Ý3›¹¹Í;ƒ íWåÕ ^âëâ-,vnvU°§Ÿ:õñ*ÂIgi7x;YS¿¬.¾2c6ëEHZ ôâúLByïϾñMQ(`§çêí—8½ÂvbÌ•è¤ØÒÓiÆ »Sõv^d­™WÄ”³OK¿!èáÞ# ¸{˜_Ð"Ö(r¤ NÝöA_ÑØ¹»Çé)Øùmc÷…œ¤ òÜù¡Ù axe|ç–SùEâ‡ýö²~k5a_{Ñ*󇡩¦Ð”"8oæÚ hyÃÇ!« nyy]Þ>Í5•’õX›U˜›nA²?Þ¯&{”€ÅÆ&åOAŠ¡ÕO =ô{5 n/¦]åï¸Ó¶¼.¾ì.ûRÐ;Ϲk) ¬{wϤË,)ÉDŸ¿Ä8Öz…ˆ7¼_W:ñ×hŽÝ@8ܽÕ`èç&¿Äu[>O§”Ë»ñj]’É‘”®m·gª\=Méó¯Ejw€DA@ØÃó{ÆìÐäzgIœi½pØžŸòDíç+ÒE£ *èw¨2rªÉ¤­¾Iv¼ÜöÈ^‹™ŸG±wKVòÞÆß…ðÜíx]ãk *ŽdàÇBÙöµ—^ƒð¼–}þSñO²µk#{žOîœS4*‰–kÊÂø4Û±òià%rCˆªáf¹D{9I€¿^¢Òjº4^ñ@Yš±·:W!yG©+!X;¸š»å©ôißK–‰-µ³HެæÒ¦Ÿ©çJB:÷µ-î8Å÷Ë…¶ 4·Å9:WêÞ´Üe€t ÷/,*óI÷lUx’Kú*~j[ˆªe‡Qãkƒ×+»{½NÙ¾I¼Ô=(3®ºSʰñ0Q¥2?ôþ‰¨4ÕpÚ5•µ­¬9v³Èƽ†á™—«;Jí‡>›Ç?{¢\ÒèQàÕÆŸ•¦²q/èš\M:ötwÕ¸VÍΚ•>¸›QxmrÃÿ‘uüm•¨›ä7Œ£g)Q)Ð NŒÌæÝhÐÙ¼´TŸ?Ûpù˜b»ë¾qçëG;íö+¯­eyòNftÏèÛZdú¶»?_VgÑ¢–¹3—L€:ŽhÄA‰óWŸQ18§¹ûŽrH0äåRd—Ú@99îí½ŽzûYÏI<ïýcw:ÏYOÈ©y[)q·. ÿ—çû¦ó|-c»µ/‰âŸ³&6{®•­¿Ôrëõ¿#mv·8PV(Þ×î]K–‰?9õ6wqZSï»0U?¸ÜHðCݲR—º±2­_¼¨.þjˆñu=(øzã³ zçU’W7~u´Z…ãê¹Ç5Ã|4ÔÕç”jÁ‘hbŸu>’ë!f0/Ò(ÓëÛY_¡XBáÇ\Õ|Ï]š{ùeÞ UyqÉ"¹«µù.«2›´5¼Ëà_œ ·h£'ªW*$l•8¾M³µ~£n“¤¸èg C=±óo5¯ù/õ½g..õ÷Ϙ’stÚàì1Æðíæ´ëÁé ©¾ª>ݺ¦îx›g-Ü@¸5§äazRç:øš)œìî÷e„IÑ5ÒÆÿÃÞ{@5õ5ýÂ*ˆôÞ£€ Ò!´ ‚(D‘"Az“@z""R¢¢Fz“Þ ‘&"½†P¤'„åKÔÿSîûÜû½÷®õ½÷]ë{Îb…䜽gÏÌoföÌ9;;Ô'‚¼zc‹zOR dy^Ì~yÐìñæœáZbëQ ïÜÝX·µkw¾òâ¶¹Äs%Á0ØA?rD*ªEîæ'yN㇓ˆpvMôñ ME(ºxâù¥8Wðø‹LY_Ìxb¦¢ïàqoŸ’¿”æ}y.xµžÖ„•r[ó–Fä`j×'d³ÆYI³ Šghªî‹‚à£l"téE QwbœzÐ@·~Û­”Çñdö«n¹|p½ž‘©h±Ž8¦´WN$ã:“æ”,ÝEbûÚì_ø]²¥lfÄž¶¢2yáKüúÕáþ®ÇO£Q¯›Ôå}FŠ7Ò>G³h©<ŸçÔ“Ór &ߪzf]<óas®H]ž]aä99d&XÔI¨mÌê…(´“¯‹·%îNÃf;ñ RÝo½6·³’45{ܺ}ùapóÁ‚Îhh:ðpûÈ /à-¢¢u¹©µÝSÿê®®}ž•£C•iê˜ØK˜ˆ=iJ)¨ï8:cF&ƒy·³ê–ñƲ1zŽêèŸó*ÛsNZ¹„Ì‹ÎÐñè\ÅF®¯K€A¼çyB¨Š¬ßy[ï®T~>2/ÜÀÒ:Ž2/ØÌÌ‹êæÞIˆpüR tQÛkKX4ÛŽØOxì€&»Ní·½Ì_TŒ ^e'=p|áì•õ¤×¬äÏ8(ï<˜¹ðº,e– ì¼ôE[O£+b)„MÈIoX8Á+³O±_35ÂRÄîÕ»çØ³¿\*OniA,µ$›C{¯Ég…·Ê±ÍYÙǸçÈã³®ËkD&N•"Ÿã}?oëªLq™9%žÒ a´lykvZÜ<ŒŽŸ²†V¼ÕöÄËš§S?ìl­÷{„«]êÃeG¸òm6Vb6Ÿ½àSöà]öl) i¬‡ömžÊ¯z7ÌŸt6Pyò3 r|eŸèsô—Tm ö éWˆ¹å‚\âì”.˜¨Œ«H|žÖüLÙ©Œw:mó¾V§Ê‚‹çøªé—ÂcøE‰(ÇφׂØå«c/n õÉëÝ“‹Ë•=Þ–ïȈýŽÓùèLÍã Ímks¶ô åÊN—>\…”ÿšò•iD&µªQ½Ò¥J¾í)§¬Þìè– Û—)%j·yóÆ{„<·³—ݼ®Ô¦Õ  u}λų¤¨‡Ð€ßI^~M-|Á=ûÝc$Wâ…ÐXÓmàØ¶š)% î’q‚ԥͽÐRÈÕCS5[G“¹Ï^â1¥÷áÌò!İûdHF|ñ(€¥…––É)©®¾a?K7ïñлœŸŽá‡¥€oûñÛVkõgdäC#qö¢$ÎŽ’Ê©„•1)Z)öèFÌà-Éâ!hýv‰·l—ô(Al׳èìÏ0eiãÛ”Ï)jÅF¿ 6qÀCV Ÿ†y¼sû.’‚z‚öneìß9ˆìÐÍTå)W‘àE1<Ì»'Áª÷ í"|˜ìlÓ]§LJ?×"‘õF®O†÷e}ô`›zƨ0šgôìXË9ùý‚Ù7wÖR<éÖÂÅf%ÅûŒè¾Â—gC°ë¨ƒ•ò•ÌÏÑÌyU^wãÅšC!|V«/-§æ\Ø S`ÍÒ©îßéè^Ž|²Í*âyÉc׫Ͱ閲AŸC¦qâÏìÃÃWy”l´ËÆÛ%¹¤ì|÷|Z…,?=åýî6„œLì ª ÷gÞÓòh®rú¾·’ý›’@f/-ìÂd¼âß’ïwvBùòù¦[çwÛZ¡ç7¦õÓ<Û÷ŒŽg¯-”S<âþd1üÆeö0±ÒyóÓsþÆW‡3h¿JÓ ¦ùø°~~Šnš¸›”ÍAyùêV9b…ƒÀ';?¿²i¤ùŒŒeh$–#æÝ®ÒÀœ±ßÓä9òœÏzóp´Â×xîSÛ LΓŸG\¶RÕ;–CUóhM›çg Í8ú3Ü%9ãÑngeFº;1ŽV1x’]ÑÿΥꩋ•!âüqØJ1!J‡0Ó:¹º"˜bãM«5¾ ,z€Û›|½Å3º 1½„½ñù^jUœlzì |6—Æ„§Ðe´‰B”§ŠUO½²ØhèƒêŸÐx—ÅW¼ÈÿMÐWÞü}W9•§ÓÜLã]Ã!Ùz-%·ôÝÎÄ|îÇÁeè(È”z-7÷“_÷ÕÐ%½¨tŠô^3¡váGÃú—[ïZµLœx}ˆt÷¤Üa&wå×ÿZ&à¹,ÔÍß~zH;u=Sû¥—} ð@;åQò,¹RÖePM¯®^«Ícváç"Î:ñ÷®Ó{¼{èíÊwÓ±\L4ë“,X+ªii˜×‡.û<«M=×Í0Þ½ùÉ m¸AŸ…èꌯç­öø†Î™ûd4A<±èx÷¥‡“þƒYAÕžj*  c¹0ýd´:ƒ ü Àdtƒã‹ÌS>5éÙmºÏPj`Ó(w›C:N‡]Õd4`Ÿ3ó † ž+áýâÇ-ié—òØ£ýÎ7Íh½3Y§p&åz\1—¿ƒæð/@¬ósÌ%µQTó¦¦Â‰7"ÉŽgÉ™ˆ%ìäÍEbê=2B¬½4·nëKš»+g “¯(XÕMûò·-*É@žÎÐ{R)®ù”ù ãŒì+Ç,mS9 y¿HÚðÄ3t©XõmV$¦Ãø‘ÜgdÞý» O&auÚȤ¹§‹ï½ÉŽðÅÂLà¸/¯^+8v‘êí]Ïr~›¬º¦îÙ 09¨jL·ÀÒ§¶ØÑóš äòD~EªÙU/sô³Ï€±ÉÙ3'ш§›jƒã\£ü}vñÑ!ìN¬” ¯éð¼[)ì¦îI&Y—?­:KõMÉE…4„6HÐñ­#«Ú¤f/ ,5Ï${27gÓ;o'åƒ|½ŒvÆ ‘¾àT 3cÖë¸{¾±ÝºLŽÚ³©ôLJG¨Ø;ù¹+ut8øï.9ËÄGXÖË?zs`·† NZŽ:úK¼€ÌvݨÙc°;#¥¥'Uש$®‘·êY—  Ã/‰óN'~o¦oñ¾êz{­X%ÝÆ ”»éÝê7£UmžÇÉìôнØg>žEùÑ.üñ¼}\2÷þjDosWß0e…QIŒ3V¸‹8û'˘EG„-Cí7)ï×йöº„ÝèóŽÊ½é<(“Hæsi1VèïÉÑ­Ï9Pü€]®øÆž’™¾0ùCŸ‹T’CQn‡£ÝѬ|BKò†“C=9?I¾sA¥C{¤î«O¶wÕez%UT~r~gs‹ù³?áâË[YzêÏÐk§Õ³Z$xÊýtlƒ•nòõWÓï ¯èÎ( f)_ÒqšûøÕ/1»#”¶×¢WÆùANB Jæ–0ñPóøNX1\‹¾á›:…€…U^VCŸõeq lÍnÍìA÷ ž¡!!=žzIôÐüt‰Z³IèLýaiCpMðk¥¹m@’xóBßàšcˆÁó¨{0T‡gº¹ØW xܯ˜S#¨¢;>V8'!€I*ÀC‰ÆÅ½ûËüLM(aK“néV©.Œ¼ï¨™×3«²%c]²"_°·sÀ¬@óô!!«=3½Ù-(Û%ŒÍ %{}J“N˜SùÌÒÁÔݹÉMy:X}ñ¢0.ÅD©â°«GÈcÃè„“šgZ»>÷Ї†ÿüêb8mžgRÆÃÃõ¡Yúàóu&«õ!ZÉB3î©0‹¬þt[0WÆL‰õI´F½Ë'­ÀéÊÏò¼ uµ#ï—T5ÜÈ´p1ɾ|ðbïûýŠa{U^äðcWYg?>x;¶öÝú×å϶À¢p¹œ†¬˜×÷†=Ƨ+*©†ýÑÙèkÝmâ}€¢ ½ÏRz®¥p_ùº1錮ϧ ×s¯ö¶rI™¹Á/ÛwÛ  _´JdйUݱ—vΉ|³ž¢Mlt¶OgrBÞDH†³ªj˜Ë§ƒ8í!÷uÏOÉ á†æVõòJñ*÷¾êºíŠVªg†‹‡ËQóü®¦»qÁ’9]1H#“Ñ™`XxAÁCRv¨ÛÊåL$Ò£Öœ!%Cºß/t_|70-jÖ«ÃÍ©ÇeÝy)‡§õ½šÍ`¨Só,wÖ“þ¼>¿ Í’¤ýÒ(ÖÁ0Ä£]5‹Iݳ? ˆ_yÉC¾;#ý²{6ϧ$ù¡k‘Ì®iåVÙ†¼º˜)×–¸‡¢^?«dÆÅ”dû¼ÐýÎð²,˜é¤+ÐeNcý½‚‰ð~³ ù#—ÓˆÐrêU ¦PeDJé¦D¸82Mºè­(–ÃRíUTûî­Ã´‚·ùnž+E)Uˆ×§¢¨HŸ>Ò–ÒÓ [U¦Wž"!Ò'Xö•­°–÷ ™n¨ªíRo¶f£¢*Ù¢¥ëæ8_}"×Îßž€ö\MªC޾òä?ñØvWQÕ«çúäa,ždP× ´ãGäõn^ºÇCSû©Ä½ ìg£¥³¿i;Ýž§_‰g­b ³Þ…¢4 '÷h„·((ÛmY›fÉ-æ~8 ß2¸®7w/+›ÿ¼v¯Ñ¢ŽˆãÂÑšn¸O1!·O+&M-^Dv)@ƒŠ €µc-ž\«ÉL/¬KñQÐò”ä»M'|¤3MŸõÃùçy½4mÒ!W½fÎê‚î§«üožËñ\žž›…Lñ÷Wj?TõÈé\™ùO¶ñícEO¾fÔkôu_w¢t°YÓùÚ¦:‚¤ÑÔìuÄ6µrE-©²b¸Ô[Ë ¦Ú (V¤>FL1çuw7[ÅÐ;–c[½È ¥%–Dvá1ã"`tÔYpªf¦N È#pÄå ÄUXH—ï÷áŒÐŽûÀsW6†ëèº<4¨(xûL3—¸ôÛ «4£ÇO…±¬fK#z¦p6-ØÒk4MŸ7èÛÖÚÅ…=ƒÖq*ëTFV±^éˆÖ WÅàÐ#4…¥0Dç³Z…zÝîÛ–€b'×@ ³mx{^¿wcÔêsj- Û°9O­ÍOGmqé~@ÆËÃ4æÄ„Wy˜©3K.ÊC, +ÛïV]~ZwÖÄQ)³ÉX¥8íx[µgŒ¼t«ž9âm}öGÎÎ7Y…)7ÕƒË-ÊchÙ+­ØùsÉäÈa þŒx8OHGôeOÑ‚7Ûï:°m9i(FbþI+¬côÑeO^‰gLöÚÝÐÄOž*’àEÏIp|*ôW9tÓd‘ör– ù#ޏ‰þ‡1Hgç\¤ÈV Ô€´zÚ"’>ætüÔ¡‹. ß$:sùÍ YÎ%g :jP]ÒÐÒåÿ:B¶XþBU4Ù#w¾ÇÇOM€äZi=2Yíw¦›A­c—påPáj&ç+ܼŸß´.VÉ6c¾•Pj|Ü_PòÝàOiòãwyu^g¸µç~œu|ˆ‚†>³(A®æ]2A%{@ä(³ÚÎG¯õªs <Œ[.bŒÿfSkƒº Û¬|cžåóíwŽ˜Ç4#hb‚Áa*F„ÄäÖµø4‘È88÷™ê;‡;fؤ48š­{Ç*û³žAËM®¬OœZÜïõ]¾”Éí—ÑP Û¬}¦ÕŽ$«Óº™!O ª8ªAÉpßHXð:8æÖ³?#ÿ}¶40«7uZTVø¾…Xlµ¾±ÁuŸß|å}[žÜå}kÜ™)¦oJÿònËëðH¬ÌÙ+ýlÛjõ„nNV/kö|aó2+öpcì›À êN/n¶ªª­×©J0õ ¯¡O§7]+ Ì ÔlSÎ@I·§Y^#ñ¶ÛÀ­‹£4Â3*uÅ?x(¿÷=™á»*ÕËdznÁ#Þ'ÁÁ§NÑ1‘Ö¨ó|šµS ™}@Þâqtè¾²Ï5Áœ©•P‘í÷ý ÝÍã{‚Ob¤_Þ~¤*–“·s×´5/‰— Liö¤Ê”þ‘°MYDÂr3»ýòKµèÞ}ÕƒË%W,í‰MÜ9¤e}ÁÑ”{¯<Úr“¥ƒ´Y•Ó·ž]ߟؙ;À®¡Ç¦lÊùÔšö4–ëe?T9›öU>G’Åæî+ Æz:5¦x«ã€¡ì3Ïušvæ=C(ç*>•¾«øVøòìß²ºýföïÉxëÀ/tbS;@•š~þLŸ0ƒÌY®£è²*ä1G£¦ò;*Å꺣êÕg!ƒ]i”êïæ–‘î “×Ù«gàò­>—õèCÚJ¢}58w7·(“$îøõvÜzµqp™Å­]U‡çSGž®‡¸˜Ñ?žk½Åó eè·©sÞœ ¶{½Y"äØÓ™ä1r†R<Ê»Š øÎgÑeSX,a¹xÿÂk»åâ˜úoJä#ßßìYjÙ¬Qñð({ïnŸíž5™6©sæ¶ÕšÓHMWIµV¶+:¬=ñ¦œ‰Ëpíã[„ÊLtÀ*žŒÈÛW™f­nø–E…S`í›…ð=Ö3nwl¸ò ì‘=8g±¤®Ò‹tl‹çvÍö]ñ|:÷’W‘X_«ŠÑ/ÏŒxêÀÔ¦ÚOÏx¼‡zóYv}ñœû„7‰r·A…ø¢óÌòãJêÂóQÒM±=»ŽLE‡ IO+ÖjÏ%¡ÝäÂæig"R«™E’&Üí*ëW’&»ÚU²QÀuùÂ9â‹álÍšüÂõã¹Òã’7Ozrž¡%/Ï×äefkœsîðYœ>­ÙµTÜàxBÈãƒSq6R¤jËgÂiíã+ë_7%“D‰î ô”1ôºìÿ°Sÿ¥ÚNÆ«§x/÷»´#«gà[ȧ¨ì{)= e¼ðŸ×]”ã:ò¾_–/†vP%r îb©rYßQÄÓ¨-ãˆg­õ®¦jfµa‰g¥L…\ü»BÎk6Ü4§i1¾Q„¡má,¯nñ¨0[§f­ È~,G”Îv]{Ù&L[¼ZE×ýt|T$ê‘´½94{êöƕԩëîÍÇknöu8xf×ÀæòºçÑyÚ¯Ù©VrïeÏÉJ0¸8ÁUù0r¬Óô •'NNð´…±u뻡dåÁД.ž»÷ia rHÔÁ;ºÂp6Òƒ…€èŸ ׉wÏ霴:Ü<GQ]v`«ÇÃê%©1þeê‹’=vâKð|Á»çÉDŸÎBz¡í9YµT&4±«Â‚†þ<ÁpV“Bòap Õ½wæ+ž+÷ãéïŒXJ8‘˜\_p#=»|ÄCôè%º þG[‡\&E½²€;K‘ÖwÛDd¡!G^Wîç ´äy/á)«n³vS½ª<©Ê X2a^RVb¹™CyXîçkä¯W…¹Vô~|¥NÚjºky°B'œV]? ³¬ŸEŽ.¯¡½‰š>©SB´ö„ä8¿Rõ*šK񾆢yƒ„ZãUÂp+G?ÅùV/ôûÐÒÑ‰Æ Îf´Š>LU¢oïr3[Ó-ÕÞäYw×^\wÛºcƒ¹åIS”’¾Ä5h–0á°Pìì9wúÇ|FûlÊaºKösôÃr°a„ Ñ?/}ÎÃ݉'& ,¶}žseƒê9Îa¹î9,ða™%凪…íçh•¾>Œ1e@ñÙ¤°ÙýMe_æ2ÏÏE^GÃ/3õz÷Ú}tþ–õdSHköçk82/EœÇÜÝ›UkP¥xîñk¤Ï›-`2ú’²ú¢h+¶Å5v‹IF|¯³qŽt»?”ÒËU’n7^!=g\¿"º@fÊî9v”Ì­¿VhÜ’"úo`"º! <Ý0!Ù5Â}þÙˆe\]“g¤7åé¡Õ-¯ŸOFðgW~ e?E,»>IpqT€–ÍËå³ÞçÏz}ˆ‘ƒ®?,zÒ·‚µË¶‹TiËIgžó‰6uæ~_¦?…šww•ÏWÎ:Äx–W¤Î¨T ùµ¸¼ìêœ_ÕÐíQŒO›ñpÙwC’z~Ù5t–ËÞf~á)[Ä-ݘvߢ.¯ßuŠV¯Ôo£×®nõ‡Ï§~×lvÖ¤ÛLYãjªï±Fà”ÏŠÒ¥ª¾n!º†OšÏo~æê\.f¹8H:)Jw¦òÜ÷Ëp™ä ¥ƒUo³¥Gœ Ÿ¢¢òí¾$£«ª-¹þ8›EKóur8`ýT_ÕŠgÕÝ-sþÇ}{@§ Ù§®m‡Þ¼pRqµbÕ§‰È¢×yÀ<¼ÆYB>Ž][o½îáQ£±â5õ"žZp=kÕ°K±¤ýŠÆÏ:àØ‘”A|¸îdC›:Û—ÍQCè  æ««±tðÓýó?>!™XHcS6m–)Sä^O´Æ^2,ÌÕõp4®ò0tî"_ñ4=gì Zõ¬ÒšE;üÈsÎGȬhÄ¥ÀΫütaÍr|!-‹Vü¶°àOÛüm²8úIÒ\–'TÔš½ˆûö ê¢Ó¬˜šË¹è‡üùA¥ž7ØüCˆ¤h–vÜŸ&ÎwÞ>[¸é-´ZÓiós˜p^¢Zg*Ð×SÞïvùÃðUᱎ“ÒIÑ{/ææ?V±8ܨd~Ëy¿a·zèTâc̬½¤ß5ÚåñbJ ÞV+ª"ÃŒ)ê-§§h·Ç óí{ãc/,mñkÃá,Â ìø¤Á¯âµ³1î«‘ ¯=·—!«,š )´9|Üsv½žYä/ÌÕ<¾O/Rê«$•„¿òt‰?ƒ¼Rý¶RC+CJ§Qþ òvÓsøYy»Z£ÓÁœ\;ÀÞ­®äaÑ]¾(ÉÞ˜%µÃ¥#õ´&ou¯=ˆÖ‚ji3,wUeè”»]d°/%hõZUnyGå{T¦ò!MÝ+"lãꎗ-:â©<] ô–FÐA#qÓá‘Ðûç}F•z§»àe7€½¦›Ôzc—ʲý¶V^L§Ú$­F,[–Ò¡@’ª…‹ Uñ©~/ªû:Žú>U,n–ÚKˆV7îË-UÞÏ*jHIGª¾Žå™Ñä›dœ(ùÓ‹ Ù(Ë®Xlyˆ»d:‡á9É.}{ÍŸ·ëSæD{DtØå|î»VÕ'T”Û26©œ1;;ZÀìÍ#I¬¨õÛB&¶£–<ìodÙÙ,6u”Ùt‰ÆmxÊ?Ÿ¶¶ûªlò5`Š•.UÛSÁ2ƪ³â)÷ûD`ÖºFBʶ¼¥ÇÜbÙ|¶ ù^”1ëÅ$‰ÝkÆÕ7_›Fq6ÑèU‰daâÉ”¿Mÿí³ï+¯h$ cT%R~auÚu‡•GÉ÷·ï¤ý@»JLFg¨ °m®éÌw-ß\ð"E:Å€hƒŸ®‹#Ã:zY\:­õÇOÉ|ÄR4;ÿI™õç–r‰o÷Œ0ú÷ÄÁ“ªJ[ùÚ¡ÄÉ'Ü@Û¥à[yàOÇ_vá:ùŸ.mSå@/|lBnÆÓèƒtó8± dù |Ñ:`¤ÿˆ(¸í(Ìsµ¤©ìÀ¾vØ­a-µFE98.ôkËN‚¥èðÓ Ì˜P«Í‘êÜKñ€CŒ—û1t`u!ÊÕQz…G*D°#·ã¯çáB×YÞ=H,‹Â$=àÑ?'l‰—²8tlñËgClxgùrèš.b—;صjNæ`41çÔæÀî±b[按×Ðqm6£éÎ3ea³ŠøÀ¯–l'V·=#Øè¸áýȉ„"œ£ƒ©pÎ C 4;f¢Ã§!à ú ÀÓ§â’N-+){DCDo\é' Á¶MCÜ¡ŠE Ïn:>DS¬Gz¸ÙÓÔË’O•‡ñ9*<ý”Ù¸•Ÿl³ +Óô»#çlj €Îkž=æ“DÕ¤Ú„Ì’2¤”Ÿ'Nn¼k¥?’ÿgöÍÒ Yë)”Üž\vi9ú-M=âëVáÿ÷Äÿÿìøçïü7Úÿùßû¿þ—ÿ¼ÿÇ£ÿ.ø+Hýÿÿ’ãŸñ·ÿïƒÿ¿÷ÿý/9þ ûÿFû¿ÿÛÿÿKŽÆÿÿêþï¤ïJKÊÿÆ_úßû?ý—ÿ#þÿ³_z%}ÿ÷ñ#/Ç'––^Öÿwvúߨÿ‡ˆ?ñº´Œ ±Ù¿¿ÿû_pH)JÊËËØÛHKÙÉZK¥¤íd%m€Ö ÒR2’ ò ÿ·ùû÷ñÿíñîÿÿù€þ_ü_JRRæŸã¿´Œ,©þû·ÿÿü«ýdˆ•€Ì¿¶õ¿ïÑó{£ 19IÙ Ò2Rbò@ÉØÅDø¯ Üø½SÌ_; ɉÉJË^•“SÿÇÝeäåþuw GWÇß}eH[ÊÈ_W”!ý· :ì%ì¤íÿuß›>õU"öJ^P”“SüÛ*¶Ä¾ÿâç‹I}oýµ'ÊoŠ @19)é RR@y1yéÜNò_S0øµSÈŸAHûòÈÊûËJɉ)ÈIÿãÆ<ÿ™g&v”Q#zË)y¢îäåeÿA~9éMáþÇ?zWU^P”–“Êþû—wÿÿ|üÇÿÿ`þ×ñ_^N^VáÌÿˆÞýïøÿ_qüÇý_( §N9ùµÿKèI2ñŸøß÷A œœîîîp8ÜÒÒRMMmffæ÷v0 44ôÔ¯]`´³­MOýOviìõB߬ª"L}SØÂãõv?N]õô zÑýýî¥zs¥Wo'Ü‚ïµÇëÅóây|këÅô|]Î1Õ½~&ôùˆ‡WQ»S3¹´úãÆ©«a§bɵUîØC¼$nò';­„.ƒN39zkâŸkWþ/^';W¿ËØX tã‡|þâºT µa™jà·oDBÙAG ¨\ÍH°šþ1#jþï—:0V=Ô<Ï@’þ íOK] #£Q'‰xß6­J*€x<Ê6“bÁÛÄ]þà ôƒˆÅ/_ù­ØþïAÄ¡õi`™G €>„ÇÉ¿æ£TP3 µ Â@ÖÍ˺̨è>‹SnpÀÜñU;ðn_åÜ󨚥÷νí@謭ÿüT8Buœ¬ÝáÉ-z÷×$’<0{U·Æ€ÚÐòÐ6=÷мJû"ÛZOïÎd2‡\ÿ†Xê@])Ù½‘MÀ ¼‚ÀÌIm‡^»ðä2Ø^_uÂ9}úÕ“™Ã6›ªàóxãµtÌr4I"´Lµ¢Ê!­¾~¦Ô»ŠC krè31Ÿ%‰ ÷¹KV¹2ƒ¦Húò„ŒžO(‘´ì;îz«~]BsŒ‘¬£t"Z]âê>*ל¨ÂK©7ë2À 5Ί’¤iZ$z"FÆÖß5¾ ü”þs0;EX'Âr9¬ÿ«W•û¿9½QôO@ÂANU9«è# öû†c›õ¶r/úIT'ðK"~®ÏÿÔÿÃy©âÙ.éšþúÿ ‘ä)ü튘K'aýè}Í¿}jw°žØ}Î §‡ña~Æ×I±çÒ÷=n{ m€3Š¡r‰ãƑٛ2öwô(„…”ÔLÖ8kRR1µ2¡fîUn1¬t·ñ—Ùˆƒž¡‡È¥…ZÄbK7²ÄcújÏn¤Ï÷nË.´i•!»yUÌÝêpÈ~|õ¸.ˆà ÔETéh0€âIæÿ)ø8²áÁEÐZäˆÙïçÓHwvõ7÷WϦ£¾íJE€@߈&S'Ö¦•@bß4&ü ˜h’z0eçõíÒ²I,É®¼1‹Å,Ç‡×™ó¶™Ø=>øKùÁ‰¨`!±ÄOmðhÊùÇK¯ßWÿºæôÿÚò÷¥ËáPeëbÎ%Ž`«›˜¯qX«‰Ý™É/3-'›ö¾YËdU*@©a<´ã¡ŒÿÎ fÊŠµ ÷™þã–ó9= ɦ_ŠÑg•¤;H%pž5º³èþûQ¡7 x5Š $_?âèÜ/b_”<^oË×3áqRž1{Ä‹B|réA@³g 18‚,ÈŠ‡^<ºßºÛrró¤Ã²Á.AÝßø78[˜°‰©£gÞ+ “jcjÖðêf/ˆÇœ~;2;+°‚1³M À7! 6ëÞ_,J ß3cüÃg–Þþ›×ÒJíÓÍ¡%#жe¶;’×bØÝžBYm£1ú$È`ÂY~ÈiÒÁOˆ±”@«ìàÉë°¬ÖMPÃ+•ìzºLøæâ5>bCõÎxWC‹‹{-ápÍ<‡¶ÅÄ(LK2UB¡ô¡)<ñ¯’[¯ÚdOü˜ÄpUööpfžç¨Ê‘]ëäªþ•­úg`î6ª>µŽ1G@Þ}Tö^óܦ_DU¼Îáí3„¢U×ÎcK«GáË‘ªGô¡Øób´M¿¡ûT¦®ì>–ÂÙÄÿ›ÃNŒIö G€æo_è¥åT=‘Û ÿ-ïãvŸÿèªÉ3¿Íèð·ËÎïý6§æß^½ÿÛ6¿lþîòÛ¼¶ÿù®ÿrÐK˜¸€¬xж˜ìú~™G"w`ˆ]cÑoM¼l^Ù?Ø`Í$ŸøžS»¹ÚrjûIͦëAúýÐÖQO;³q:oL£ªŠ­úc¤í›­8Ücúo8o¯¤Üó-8„zYÖË¥µ×É44Î702fÙ€þííúvßúVGç8º)r`?¹SÐd9°íÂËûeö’}ãHõþ~36>èû»DÞ51¦kºßp¶ehÅÀEÀfõgÁS [ýP9ï^ťļqkÅ…ßaKó„ÿ®"Eç:a?»o"éË…øEÔŠÞ+Ÿ>ü|^0æ’ˆ}õì¾§®=9ˆÁ¼ÂbÆc¤˜UÕbû5%+Y“û€ñtyLĪl„ì}E.m0žºå¢1AIj¦ æý«™õˆÞÿ·ódekaéyíEÀ™b÷ÂöáïÛ¥%0›ß­d"VNO¾õ™U¡Åÿ8P.¾0„Ûÿöo¶~¬=hΜ>ó›æ@ìê :ùñP÷“©¢¹²vP΋äÝ4«Á`=cŠ„w±¿qã©ëÞJ‘:òÁþ­õå¹=)=÷¬zâÜ\¦¢¶ö$°‰Ã¼uqàR¨j³qŒo JauÌi>§tíoÿÑçgÛµ†#´/¾·ØŸ­@ÆÑã««]®aï >š[ÿæåFrm1â:E‡Ž 6öWyqÔ±™eùtÁê8ägVDòRŽ;ˆ=(s°NyŒ±/³Øg¬º¬.þ¶²Øäµ=¹“ùýó9„``hcBõ4,5Ê€@Æ” Ýcÿ.]ܸC§ÆºÌi~P¦Ì&ŠÖ¢9xa”ô)˜C9ë¡ã/Ex`7£L{bÉMÊ;Æ¡†½*¸‰ÕFß7eûm7ã›Å÷/Ó–h½Yr%Pà#UÝÁ~‡;{莾톲Õ+íÄÑ+Á*eôç¡Z÷.ÝŒß T¢ÒÁLðÿ v°qçŽB7”5ZÕ(1#Èr{ ÷ß-"ÜoGBŸóF×þØ¢äꨆq¨oÖä4ùïÜ1?º`ºHX“¨UþãêŠÍôÀ  ­”…íÇò¡”kžm!]ªr†T¡ågUŒ"]o3·Dg÷Å Ì ?“Œèêc_ ²òºÆ¾Õð·ø>¾ö¥(ë:€Ì柴×ðûfD= ÝÜÚ£¼/0ÿÇʳf´€A*WÖ–³x—ø^ýVè×ýàÈ ¤MV¼ÉiF3 «ý3Ϳ㊎:µ8<Ö5ó»­Ó,Î÷ËhóRÄdðšu3!ˆ±žÉ?.cbÍÆ˜Ýßyáß±¶ÉQ¾ØEBH,RJ‰ µò?žyÖ¾yû;”ÿ[UPσ¾õÖC©Å+ZiØÐ§'1®–&Ð”Ž ÁéeiOŠBx1ñ`­câb¡l¢9" ݬ [aØëò­ÍøO¿üød¥_:*D›²­cô£øi\,bõ[,ƒàô Çòf&ÏJæñø[!í¡Ëˆ¿ã…DfIÅ4wDã1B˜°qG`‘~–Ìæ>CgýÚï´Ô¨”ö~ï"Ĥ>¯@ËRË´é3vvÈÂ`v ývƒ8ÅßäýlþB1ÔûóïgØ@‡(Wًؑi¢¾Å‰Œ woV;—G 6Ò£rMÿg1í_%R.y­?ØÜªÿeæ#SÂ×¾²¡}‚÷?lÈ\xY®£‚Ñ%ÿ5½‡Wo?×€ Ðp?Dé*½j£Q$©‰bBü·“QW¬,ÖG¼À,—RÁ’Voß»O±¢=‰´‰T]ƒéŽ/úÜWï쟾Qqá‘‹ºO+¤ÆÅ ˜ÿÿüˆ—O ÜÙóQUøÏÕ ûÎAò[–wB}Šán¥®YOÑžbò[~]½‘Ð@Ò P¿”ÆÙÐ =éjқŠO`w1ý«{ÍL ’®åœˆ‡ÓSÚ—ëbʶ}#U 7wý‰#±Ç, :¶q—¯spP?Øtá¦ât/:6ö¼ûÊ6¨»¶*«ñНüô¥~wvV¦âă­Ú¦•Kª§p'’ö¹ÍÍ'Ë–Õ8³½ÎCÏvlí´ÚD(_è–Ö°»¿~Ôö“ ë?Z^s‘=ÚCdÎôb•óƒŸÄ`TUí @Þt\™@ŸB/¼»Þ̧‚,Ü™•y}Áù·£€(|ÏÍj KHyÕú–h½"D;žÃ¯Agp>û‰®î˜ý~På0ÎU¥ªqÜ¡‡CëËtø.øöÆïy²ѯU¬ÚSÉ‚>;A.uí:° W„›Œ3t„è]F$%"¾¾Y÷–iöY#ø5ŸÌ£qOšyÀ0¾Ã*(ú˜0jëBtjÓ_Å7 HºÎ¾Ò<¤ˆÃpêÒù¯Ë죾ðÙôgBû·!a•ýTÓT€"Ríà¦õŸ½×ð/. Þs%]¯üÏVµ¿/umSæÊ€§ý66&?‚åFõ¾áDžt9®þˆÝYép ïB*÷Û2ƒ[FSTƒeOd=õðjYaÁý}f绎[,…_Ç?¹þ«ÏÔÔBQÖÐúÛâÓ˜øsGij1+ÞçWxÌ8½VÝ ½UÚÎB-¹TœþloØX/MUqš¨*wß”²gÄW…ÄýüKÅ— JD01ö¡5!ÜEÁ»þëèq}¢Š¹/þ:Ý<á-€oŸEöß$E­†±¢0?Þª‚U™×]| åÜæ @\ŸîLWdB$8FóoJxY³î¾Ÿ_[ ÑÄ»$å3%clƒßøá°|ãäµ@Ñ9€.ñŠöäú­fzT…ãÿðžÊ}W½gS&8gÅ'›fe {¶Oñáw–‚B¦Múö¨`½ŒDü+G ÁÁV3WWi| Oâ~qÝ›>CÉþ±»’Kí·D*Mn"ا‰©0fLðï'Þ¬ßÀ»¼ø…†êÆêü7ÜÍߟMcˆÜ+ÿC©=¹«ObO4»ž6$FçÿL¼×~?þ¿Uf{u—¬i .—ôùØW—3õu¢]ìh„çÃzÐEBåIó6<‘?™}|œÌ‹DÂn{îýTŸÅmÅÈÀ`*€ë¯š½Nðwð¡Åfìã[,Ãèït ÈÏäŒ63€ÆI·SŒ\ vÒî­­-- y튈tb/ß —¬ªÎrÆõnC¤‚Éð-ˆ‰ý3þÞÙWü—2 ¿¹˜ŸZígƒ£67CFÖ‡¥BytÓ€ØO->õY‰P µÞ=ÈX¢ÿÕnŒÌ—vÕ‡õ1ö?"t,mp} M‡ËÜOv¨ .mÉÐ ºÈrO5™Ÿáæ·ÍjV#ÔŒ`Òu’‘ষ~¥PÿPo_ÔÙÏÏÐYUmƒ?\óÀ¤ú@+C ÛÎÉÁ¶˜4´TáöÄÍ?º(x­Y"à¶} Z0æ«ϬÌ^eÌby1#^Eê2¸Qýð½_æïÌÃÿ¬ì_Ĥ†*ðSbLºcîBõ›(VúëÄ£p¥ŸKFóéVJú2b ªŠ³•ýó1¹õÂ?‰õ6JâÍ® 1D{ÛŸÜÂ?f&ŠákðškW •«Ktq¹hèQÿ„L›V&©Œ¢ƒef2þ¹¾ó¯bXÜhq¿V:46úú` ì¦ˆ¹ïìþŸRƒ$ÕßÞôëçc·«¨ öÕ!gúé'¦Är90ÈP}“Tï `s-ÂÛ‡nVÕLlB4ˆ¥nSéGygGvƒ8Lj4‚XZñÕèÿE&ÀOùPf‚CUMò­ªš®DôsŸ/¨ªfËÁï±´Qvû»ñWÍ wì•À`©úû«ëeÚ5â˜[!Vôåûú»tkf +ø'únÔ %`Ú-í6ûfÉa¢IÊæÙRʱÙý°ä‘¿ñ é Åì]"•§wðøgZŽýýkꣻd•àö¿ÆtŽî«n÷¿~d·Ø :³›Q7ºçò§rŒêG0AT~î×*4W«Bø²Z/¯ïsæªR©¨âذ©gêýõ¿Æ–‹ÿüKáöØs*¢Ì1PØo’ÿìä_™»v™qÇwúAL qÒ\æ™ÂÔr›ÿíã«sßu‚k›V5éΕC z@…{sͼ¬‚ÇòLEa1¬qá× \~±uk™Ö²Šgô‘ˉ”’å(º(õ(Ôªô4*×ä72’Ò¡'|öÑv²s,ÌÑ#?1] p7Ÿü¼‡\;ôQj¡’~æÑ¡Í tç!WArô)f€dõüx±õl©;>¥¸ÎcÊÃ0roè\­«#`´ºûÆBYï¦Õù3 ôBén7Œ l"&äÑRÇçeØ1ºÕZ›kS›»qWí”~‡¡}-läl°GO¼øÚ´RH1ô¨êS0èiòÒðtõ^;"Ó¹U åÎ þ&R†LwÖ>GÒ©²-Ëu…5†=A£È\1µšˆAãl! >RØ$zÝ,™ª{UpG߯˜G¿ª{1­ªûØÛŸ l‰ÒÝý„#]üO’  x%ȯ|8OpÓø}b+=Ò ¼ôÇ’0·(ÕÔ«!ðÚê†þp‘þñãט«ÄaòGä?ü©{ÿiÂ7<Ç%Ú‚>©Ö€¿DÆ`HµóW”ÁWô ücb W›¥ƒàëPzËìeìEˆ,1óâßt«ö>…!)!T€Ä_a\5#ŒÁÏÂô£ÿ"ƒ±—Ø"óŒÿÖóƺÀÞÿpŠ 4kAG¸” Ê)'Ñ_z]Ò·gq‘ŒËù@JL[•˜oÝ$±NÈûk~< !øz—Ê_— û°üVÉ2]º<´$ 59g¥Ûä=JØÒ.ºÔ¦•w @QUm¨Ô€¯—Âû« ×s«¨•mÜ„‰+’ØGgÙ@¡ñpjÏÀmE ]71Ì$èIM¹ì(Ícbò!ðS8=aKÆðÚTÇ’÷ôàÂÍàäë™ à9Ä1?¢Ãý÷ýk¸4KÃÀºü{R§p n úT×—>ÇWž91cEŸÖO<=>ìphy{†V bµIgðè‚<ùÛÞ6ø¸ÄàRñ”Öa$¾b4-UÖ?¤tFcW{›ý¸öê9îSßg VÍ> U^P—%TÆÑ—Ìû9½Ù iSòbg ãUשԧƒ·3F@C|ÈüÔÁ°‹æƒMC9ÑûÙŠ ø'Ø›YPhqtšv d€V¤¶z¼èUɈ—Ū>^׉=¦ÁÁ«À¶¬°é6„³ A.®xÖÄãz ” ©sƒ“­%ä'ó1Â/|\Šç.Ù­#@^‰ÊN‚a¶;ÓFûÖ…Üü€Œ-êT­Î>P«Œ ¤ÐAŒ}TX“¯Z̪ñìåÖþù¨=‹ Þ¢$b.XÕy<ÕVÌ«Búqö¸ÌêN×J6›¨SWj÷L7òÎ3?LÃ:âÈR˜_†Û72¶:žr~¨_tÚ¥Ì Trîn€ùìÄ|­}ã*¨(ÐõE»÷nè j_Ý{8]˜³Ñû8´ð4,¿îKýùŠ((¦ðuò4k>ÿþ‘i« {€Aâ^{ }ÂðÌå“{¶j*:ˆÛæÎg|˜ESNŒïò©’ÝJv0úƒÁD XÔaÝ÷?O_]¹Q1¾Êrx©8OBú ¡D÷O¯†Ýe,OHw}0¹‡ó63Ëv:ãCÂî]­ß,Oº¿Y·83ÿAýÁTðzÂJ¥¯mþÍd’R t|æÕ¨îÌ—ÞçÁ·åL ±M;2·–óž*!À#ý×÷¯ù_N´ÞßS.Yoè»êžktÀü+6Ä¢ ½XλW™däq{ø¨Ó z\g×pÙ8ÉRÕ Ü ÜËŸ6½´[VŸRxåï°¿Ú3a ü(pø„ða›%øø‘{Ñ ÂÐqÝHº<Ü0cì2s½UêÇLÏÔ,ü6þÓ{ø$»ÅÜ˽ðj“˜Â“áÑ”‡…ÎÅÛ§Ea“u+äj¼mZ(…»;¯v°F\T~}ï]Sa×VýD?•<­kûaô·m³éA~›ÅŠôgM½ùD?fzygá2øO¹ZȈè{¢Ùî†GKù0Xñlîs>ZؾievÕ‹+·S(¨ñ¶Âg¶^û¡çWtˆê+`–TWïŸv>óf7Æ­–Ý¢…ºQ‘6s>z œh“AÃÉðŸ\¼œ8/6L³7l•àw-"µV9-KvÖ¿¦]_}ŸXÇjðwÌnl©›Ö =”ö‰Šý éYe«áò%œØ\NØñ`ÅîT3ôõÊÔjyiQÅ8|µ2,Ór?U-«lŠÕü4=¡ænYâÜŽvœÓõ?ÍÚ8Ú¡Çò"¶1¹Œ€ì…"‚ÈÒF¿d¨EÔ›œW;Àè߆æÔ5ÊÈÅXB—Z¡ò2ÕÄß ÞKÎúGš+mZëœÞÁo°ÆDÇŒ,ÍÎ GBÇÏÉ•ø °}K,A±Ïsbr)aKê`ø -o°ðÑ’ÖyPr“õᥫŒ?zŒý.AŸö­pÁʽ'ƒýGN„xRÇ?Ï·Š~U´Ó“Ɉ TF]…ÄË>Y•õpÏ1(}õÒâc d ?ê€{WvÊä…¼”}‰N©©;žüQ=:i^òá`YAí+öÖC3wì²Õ‡²ŒèĈ·±oÿZ  ÇžÇ›ÿ°ÃëÜZt£PEòzÜ{ηIœšØˆ¬ýxÒ¶¨äiß*/P•ë:Ã=ÝIF5Ñq±TÅ?Ùú8sià#råž(o5m+5²m©â¼¯îz&î¼;2÷†÷%Œç±§¿ïÆz…l.A'á܆FÏêÝAãW ÅAËÝñh«·îÉY‡Y`¹îëå6‹30äi³õŠ/NÃç ¯ GÎ[FwÍ{âý¯/»¡3ïAwüy`Õ7F Ÿ)g”è×úT)¯?ŒÓó°t[Á»¼”TJ);±q]œ(çj÷Q¯/é简£?¿As«ÛèÁÑ>;¹´€ûj,:Øä‡<°Mdñþf¹¿©â¶õ‚ G¤Üh_²vÃŽ/ ÜÍG4 |ÕÓ4 ¬ÆŠŠR惣Á“2PpÄ Êàr—BáOûsõï ÅêbÇ2tÊÐ=Á囃F<¨;< ÁÛ#ž¸ÁÐè×8©wüF['­ÍÓJŒñ?ô!†jË­Ôüv-_Ís½g7¦™6ím@ZGi`ÍsŒ°<Ù°õºíèn¯ôÒÉ®‘ÁÝ RA%·â’ø¶æ` úšN- ¯Ý\G‚N,>S„ޏÊ%3Dã<0åÅ„w1ãr}¤uÔìþÉ»]Ç­çݤfGÛµz%¢” ój”ç <Üã „‰ý—ªžý HgÕ§Îì¢V‰•ïà+§aW?+=´~ܱtñ§Ò‚Gpì6Xf¾Ïü¥dZ†|ÍHp_¡pîÞJ ù59hm\¥´¿Ô£¶\'£àâG@#‹ Õµ€ÞÓB§ûÚ•Å"HêÆû3`Uä›fÂÚ“ÃÄlR̦¶ é'§xù¤7µ|¯ˆÞ<¦-¨1|„·{xG‚r]ö ~cþæóÁ­Yï À" ŠÐ=a)ñ¸Qžùs¦4üöýhpgå6#Lo„]§F¾DiKXt´¹3‰RŽ% À,ú1‹ëáj¯î#"¼ý­¿@UÇÉ(ê±Íd—`ŽLRLœt“õÙ´|jXáíePïñÊÎ9˜=vw¥û(åˆÙ7p¹d"SÍ`'ókX> ­öˆQˆðT8NÛ|\»$Ì¿–&&´ÊíÖ| Nei:„<Øß~Õ¾ähS»ø÷U Öó±ä :æ·õûQ.6L™Õ(ÛLâIT:àÙV*ËòôB÷š#µ&ÞÎB›»ìïó¶üàÖœLµXìùÆF¢ŏ§Ãû€Êˆ£§ÌŠ÷ˆŽ†b¡ÞÓ\Š>Ü)¦"\Jݧ­>6xKëYýyDê8³A]­E-«K«½Ns† ‹‘Â#&Vø>C ø ÞÉÄMÈhÜß»SÀÖº/@â\Ð<&Ðôí‚;× rýÈ0Ô.ª‡Ã"ó±‚&æç£´ã Èefëæ÷åͨª’û´ ±j¥“Ò˜eñ¨þ¯áÆÙÿñq4\™T‡1\Xë; >ßü$ü–º ÅVÆŠ÷Ö®ø½>Xc«ª®{W8«ÞÈ”ÜÈ*6Þ ÿùCfc=¡·žX_ž*a©¿3˜8ï$TaE”pÏ®TË3Áhë‡ Õ"ûE7WËþÖÖrã¦zÐãójAhÿš`²‚J` ¢ ÞXWõBÝü $É[ÒÅâk²yå$ˆ‹bÜ(ͯúüª:ÖçW²¸\$€ÿ¼g;pÔay@a/ÒäÑÕ´„7žCéöÔ/pºÍ âöɽ’RvVc›jYZ“§ï¹×ŽÂb¬g7*¥§Íu¾b—’\– Ü;zr6"6ÞÇ~¨ì§×‡´L‰$`ôýGk¨`>†sW^Ì ŒƒNƒ¸wÇJ ;Í0Ž«7\XaL3ÏÉaZA ë¼gñOëÙ†^‰BLë‹÷ Õ²[áEp]ÈWˆº*×ç kü§O!uàÛ0›LüËýƒˆþÎ!&Q,c ¶íûòv–ëLKV}éåÅù(Þ«Ö:Ó`ûD*X¸Êu3¨Û» 2Ñâx¹ ^T_&aQiŒÂÏÚ5”>Q‹i6{îÈÌæ©g1Šòŧ§¥Þ77¥5¡|›rذ";;ÛðÝ1 „ÅPí"x‘UlêßÙôØjvkÊ;*¥%¹xm5Nª*œçWÀ»X]":ÚÙÐ*lÀá[©kV,;‰>¤õeC±IAú½+&ø@ M¾mZa¬*·œ`(/§ëU¦Û:èd1ã÷r9Ú„‹h¹=§ÆÁ «CPrXýÙªàY9±¹¬›ß Ð:$ie°Q/‚Úcä$6} ‡% <™¨›(ÝÅNC V:ÓëUÓÆÊ&¸@—šw˜B#4'EmZˆ·QuÌ{ÖÜÑà®ñ-‚ØÍ¹·“«éçÎø¼'‡í†|™h@N‡(E¹v1˜äƒàIóKÁâþãmÿ¹Ö/ §¼y…ɶ¡ª(ð˜Dã—Mtnˆßðq¥à"+þ³? *<vÏΖ?+‡›Îïe4OûèöLø+<¸ÎŽ1Hn-‘"ÓE­Oxí ŠCLñe?)@jgúfQ®T™î[òŠ´ÀÛ^ÒéhâÛUE‚¿%‚60=ršÓMtÕÁ¢w–ßFU»wƒÝS1·¯L£ 4ˆm†³¿LøÝܾŸÿ4µW±ûÄ‹–åOlx!¦Mà FÍ){L Û‚Q6ƒ?ˆð¾Ìo/ -4“Öß0Fî‰íJ–<$KýÕð'Èõ¯¢3¦» à×ý‰ÿdrì¼µÚƒaï_Pîâ…Ä‚º½}Ï T2ú¼‘ð6“ÝÓ0™wïíþ¾¨1œ&´tm u1“£ÕæÍ­Ý²Û³ƒ+ƒfÍPgi²¶ 6ÂDÁ.ÆñùŽ"šeG1ñ¾ù’´à1$­‰B6WÜ­Ic¼úê®0æ4ëAð«¿›º¿ º|B«\9Õ!¼s÷ÞÈ©žÂÛ!Í–BÎ÷Ëô0¬»DÔÆÈHÉ–z²ÔµZÍ^:Ø÷|¹þšÞ½Ô˜ºG¸6AÙôÊ»:po¨ˆ¤Þ®‹ïÍLmï™Søñ÷¹’rb,Ê!v…k”Ä º‹ Ó¯ŠÉŒGÏPN_h¨Vh8ÆÔ9I±6¡¢Kªh!ùY6Q‡ Þ‡)NýBx\ÌúªC¨)€“°9ɰÇ5'@ÑOQå:s$éõJ‚t¨æg‡®Ž¾áÆùRž‚jv[ø o>9~f€~R—Ô?YnÅuØ=5å>ªhö,?keb [ª¹N&ãD^I/¹v¿ e_cÃäm³,îµVZò†–rð½¦ê‡?‚èð¥ìlw"N¼vÁþM§/·ŒŽx¤I6ä‘\  ¹‚}º7#VT@©z¥’ÍôÅ ôbhŽË7^J¼c-‚BO»ÂZÇŽ»Òƒ}¶ÝfÑ2“ ¬¸ÖòwaÙÄYµš» Þ±¨W<˜ …lmb•Û[f˜è^ò7,ÈõÈx-ŒzÚoyk±¹rþc«ŸðF¤jÒq« Äh°‘ñG¿$lõFBá:jÏÔzÑë—“gíãK/¬[Z C®»uz­ŠÆ@ßÉ|Ñ»G‚%‚ù›é ] ×oàµXì jB¸Ç±y7ý’g´ w§³LŸ2‚ή\±—E½S<ήÓ5RKD`ëïª<&ˆ¼Jxõ8Þ¸ììHÏL&ÆQ?œlZ"Šæ[o­îáu›¹öÉ]ñ,3ÂæÉ¥CµÜîÃXËJpuW+,ÞåÊ.$Mtò/›dGXø‡i5ÅxH 1âDFzÜw˜@âù°ÀW™ÜƒâÎI ‰­pâp[!Ž„y:ËëvôÑ"ø§Á2I,fl~YÞ¿ò)8¥õ¹WÅ‹¡¦-%ÑNxÎÂ"ò¼{µÇf<%¬*ö«ó6°uàö7³Èú>ËMéí“ûv° ¨—·8ëáò»ðïÒñ޵"¯ˆ Áæ^X™6® 8v- /éï_o{—0óP4¤ŽÖÂU6{°ƒ L7ÎÞynØôùÙí"ÇZE:ß”+ñàVÈÙÔ}§å墆J$£²ŠGZëIs¤Ö[œstå8×;íáHN\¡ÕÍËUo=—&ÖLo¿gÍ0FÙmÈQ ª§ÊΞÝ`gÐuÃI9ž§¶þi^¸9‹^¡@ ~4c×â- ™cÆö>[Øæ “5Ó2Žììf ú½¼ïàeïæ,ËûUò¶!÷-?å%ÁgšéÓQ\8£A/\¾þóö¶Ñ̦€YZÊ@˜¢­XøÅ 5ç.¬õtº‚Çn$^Ò½]îyUÓŒðyØÊ+îŸ5B®+¡â÷‰Ñ®~œäcsa­q-ƆuJù# è\34¥…òIx:£U§ÅÛM{rQNvªó)§ºôR?$a…Ô©Ï|qòúñ46µ¼#vF˔Тa5¿—L‘ï¶0úÁ—Ö™3}ÿ#.¬pW­…ã¾?3äYp86Ï:{5ÍK(¸a=ÂÙÌðù=Âo]ôÚ<>µï %ÞN¯òÇ%ˆSûµWK0¼Ûá’®Ú.‚.²¹ýq³•¡Õ¤tI< :‚¾Ò ,L•[wÉŒŠAÞ;†¼FÀËàÕ² 9› ‹]oÏI†A—›x•–nJŽoòc]F*Õ•ÅE0Ó —X«=JàÈCþ ŒKê¹óD´›Èè@fHäÛ9†Ü£Cý°·9R 0ì#EÕp¨ÏŽ-= ÕÐL"ÊÅù³þqf)b4Mmü¬8kL'R|P=þcÐŒ‹D‹ÞŇq6bŠ™a±ùl))*yWT¶q¬|2¶ÂF$zV­øË'€-;_¤ÚðYSŠ×ؼ…½Œ,žø=õ+³‡íÁ²çÄàlØ<2Ԉ :⨠niýÔr­¿v÷Eè9H[Ž;?R²ËüŠƒ™¯p\„ÁA Rœ {ÇÔÉ&…9ÕbÍhä&ºEB¾‰ÞôôRVë3Êi®§`w&ˆ(ò_+ö$`/\툃î§E¸0…‰€<Ñ·©Û ²ü_Û‘6ÅËÍþã÷o=oAéxAézSy`…ûÊDlw ˜á1ôîg{,7•ª9å¼·CD9³š_Ÿóðqø–ÿ]Ɉô„̪sÕ:/ÐÌá!C[σ’\˜ñþh /È‹’ˆriçý`ƒVDLõ™Ågj œ·èoçkGYJ² Ý‚H‚VÓ>ûDöOÙžžW_±­‚ñœ³(¾‰ xtó!›Ç8mª—­¶™€sÇúqV§n,[­3ã‹JŸ8™D:‘%ƒÂ•I°¼¥°þ® ÇuŒ†˜|Rß@žÃAÞiTÕP_fQfmÔÍÞl…Іei¨NwœW•ò‰°yӜƅ*êÀg"C{=&¼~R‡¶ ÊmÆÐ¡Ð‘,Ÿ^G(ñ.º¶ØIÃVð¦Ìñs¹‡ûCœ§ý`¼mìý¡Í”x wmÛÌZ¾‰÷0ý}´¢ï:ÞæOI(o›+[r„R¶{ oøƒ`x_!õ9ýõŠ¢k„å‡ÀÈAC³µ½à%ßð ÿu²Nž¬÷ÑN°Q/Iªóù‹­8÷§}zøÂ¾‘«é“þMïŽE£ûÍà3°”x•ªu®À$…+3‹w…‘µQÇqÞü eBH¼A5|´°$–Ç!€îL–7/f„«šnú'dÓŽUU÷r×1ªº‹ê¤ ë2Ù-.M¾­¤Æ°î7»Ëá3nBuW©lŸƒÉa!UÁ/w|ùZ²°Vö;dGlÏ69@‰óB'?þ¯…óÍÚȺ(°–L46:t±¹·(Ct§v.÷ºÄÍq[¯þWÄPC£$þÁ‚Ìha xŸ5¤Õr¦Ÿ¶§³ÛÒjO¡øÅ"¯LñË»´‚]ÇwçñH)aÔ^7JðPò½Ô¨cGNBjÿSŒcîrPÓ…=ZÎãµ8Ji&*æ{'ožü‚â¥Ø ÝG³Ì¼ÈËÙ‘3›³ç„Qô3O‘|ý9ꔘåÆa?Š ,—зgã9Þ­Ä^õaVˆ© æ¢-„)D™‚! 9ŽLÚë§CÉÜvƒ»Ø"ò¾&:u-,4vGÉàɹHºýÎÅ AUø.$,ÒÒð Uðpx“MOcùõ€»Þ÷Û‹_êßxõýbûÙ8¥=:EökØÝl˜ç3ì-|’ïNÛf¢í³;mÐ\%ˆp¹KîwÚà ÷d0acþ¶øíòõÁòxT®Ú3[Yt F æ4ÃüÒv onðt´C¾… {e4È?À·÷ εˆzFÇ׿ã7¿Ç‰oqi‚¼¹ÑDÔmŽ(dWãzýŸ^Û&­Kw0mßã© yº‹­½4Âþ”B‡ò`-Ü~øÀ<Ð^Δ–5Ö:–“#œÔ§À£æÏF Ëzñ‚‡| c’´v5ëhí• þZ<ªHo N L[üô¼wm¶_–+c µ>¼§~Mêóå ")Ëðú‹[gAkãÏÀm˜sB¨½N©<Ϩ١*ÂyHˆuÁ¹+" °½ÎŒ·e{þ£ŸºoVÞ|Ù¬ÈâSw?“h;EöeçœÓ, Ø ùù˜æ r©=É·Vçü9j=‰Îr¦Û¾º›º˜³¸ð¸ÞkašžM€Ä„'ŸvµÝÇRLvh§¹¢uÖÊošëyA¨@¯È²ã9,ÉéCÃШYšý ? Ð×áè0†ÞþRRïÚ…žèÖºë{ßšHŽ¡Óz¦}¡-1ch;©ç¯†™!FKjF ².¼ŒC´ÁJF¡~Z ̦™þ㮬§Ò¬7p^ËÁ9]qF5‚¡·»d_–Á9ö ëà‹ÁÑÔÜto“ zMÍ 6sßeJ—ë™|ŒBô…A(˜6e˜ VʈìŠ@töƒÃ'#3Ø Uñáî2ó„Ô«[Šhœl«ÜÞҽ¡N­‚¬ó6¾ä>°¥ðõ¬°xu»ûϳ3Ï}VwÉa\Š‚Û_ù3P_OYØÃÊ ¥íßU" ‚gib¶1¯DU51Eâ_thô“<ìc.ƒ’UÅœ=kÈÑÌîu”ÏÒZèÜ\Œ(Û„›xZµîä!¹|YgI„š¹žVÆDg!Ëeþ µŸŽúè±ú^”pÿ…‰ A; nR­Ó¼‰Á6:&Ÿw½œ¼~ì;z—zlzqÌ›˜  “(ø¸i’ÏjñÅÝÞ0yź3…nx‰æ³4—®úÝ{dÆ/W’Ž+wAuÉø‡TÒG|”¶lIz 8)õ®>·jŠ5!: ÄsGu†öY‹‚»wÿuÐcoYÜÒUKõ±¸ÚîlñWÚà”A9I]W 6Órk_*«èC—RÍ™{ßÏ¥Ü7¥)5q‡g¹¿¨)‚À qj~û<ÝIýæï¿Fçà÷Ó«ïúÙ÷ˆšùoÑä°‚Þœ¬}i¤q‚q>Ù·6*Æ.Ô‡ÅTcèäqÔzs8•‚wšÌee)¿ÚÑ ¦¼€Æq¸QQÈ›<‡È„¡ø—³¼µÖŸÖ *>û¯“P‘¥ÂÔ^Övå/ N·”·ëŽ(ŸÂO.èå»Ü~¿xÂSðKMx+­«íP-`iŨ™®ñˆþv²t5nþ'Ö}ÏŠõœÁü,ó5¾gÉ/%†YüC¤±y¨ú°¤ÕS0wj/Ö%zvræ«^I0º PMíCU_ü竜 _Ú~Ú ‰U߇š{öÊzv°¬îÄT}§öWv˜WØ’03Œ«‰{úØê4¨¹TíÒ¯(=À˜2è/!÷£Ð‹^D¸†l|´Eà€ÓKç¸s[© ÿàèùR æíOôNKFmªÎ@£E¼®*˜†ðsˆXÎÌîwÅ Kª]„ý‚ "|ã©Á9aÓãpCbõ.×?¢\sÒRÇ7~å~ÂÈ7ìóïã§?æ1Bœ‚ÜŒ­/ß×pŸ0î“°‚dÐxä-Ù;ÉM“Â'r¯úgÂl%;éŸÔØ×A“¯÷CÑðKÊuõí‘Ëo—àr£fZ¯êêx°>Q ßž3AÑ˯?’¡¡e0f¹û ?fa\9™­[‡Ì¸‚SBÂjk-ûÇÓ̶~ŠÏ¢E¾§%„Ÿ ¶ly."¤BÞan½‚ªÝ3>k#•³SÍ•Kit¦w²wŽSœäa‘ìÊ&ts#Sp?°â–+ ìÓß‹oW‘Ú—@¾mÎüU€¢¦Ó%ÄÐ\¹6OÖOw#mmöža»§avûx…ØWÏÒ^ÝÑHEµrT…Pÿ¸ bís¥¬À'm¦? XyØG8ÁÇs2'rü+Lr„Éä)‚l+8fž7u>»pGÔP<¸œ¨›Ùýý )Ÿ¬·™F\€ÜëvÍ?Ë:yÐO½Yǽͫß <ÿb$§¢uâ™%«W_—9··ÈfÿyB1wÛCäÒH¶Ó=}y «E]Gг‰t<í û†»ÿjÂð4Hq?x–PŒ1ÝnÀŽ$î4tP–)\R¥ª*œ8–ígCé×:ºȃ¼_äôåû×â9Fw[·¤8Ð(™IùÁ4”Å÷a‚ ±Û=§ª¦ø+@L\¨cIt¸dH{\ %‘Kq2ɾó*/}ïñz Ø'·®SÆx^±¡vIdcñuº`ÏLf¨b‚:ÑZú¿¶ÑÝQØ’ƒ –32®Bßsø‡hHµá"TÝß. ÓÃL›27›ä§„°þF×S±­éFÛǽʜPÈ–¦‹*ÀR›ú0çAwãâÔ×àƒ·D¹>£ŸåZS³ê6~åĀUgtîÇ!+˜òŸÑçÜ&‡Mæ¦é³Váñ!iŒ?V£g(_ßµa¨O+Ê¿(ÒsŠeϲp©Ó˜Á ´"OÊÜü'º'Ö=_ØÖßB“-pÁª¼U÷ÓäÆÏŠ­*b÷7WÿZ ÐkÄnñ´÷ó‘`«ÃLóÚW#á¦îÁÈ)ì# ‚Úñnx-"S½ÑíYM4&™£ÝM)3¾ßƺ󼞄¼ù»ÍýäY2ËUbXìžçë×Ñ=FŽ(û´ö„Ý/´Þ\’Ù;$ßcZ¯ƒ~dOëW ä¼…iµ86% ±‡ÞçàwMÆOH)'Aëž‚{6Éxïcy•ܸ¯îì'Õ¯×3âc§Ê,QKc­¯HÁ…yÂ7—l$˜Yí.>ÀþÅ×00¨²PÁ¨>(ëZóÇ…½§¦.Їòª+gH˜ @T²_¢/@ådxwªÁ}#UAŒ¾_Y­¯—ôÎPQBöDzè\‚;j Ý—£ú•Œ„G>œ¤E, ]÷쎂š¶"­rKqØÖ®5+å'“ò>××öç*ª6˹~·uÿ§ÿºLÝR…"ŽoZòã#sÆ_¢?ùê•vcg¬LfæÜqG5{Ÿ!/¤^û`Âr¤b«u‚D°}T>¨¨1Qê±Bøµ¼)N¾NK¼}q»%5¾!…µØw…ÕŸm¶ío_¶špÛÛª%öˆ“q6l!Uá«dlsÙޒ禾^Ð9Ž ÿ¹X ²F U÷rqdðù òGçU3ÜË}uEØI‘{búœh^ǤoJX¿HdÑ›%Úyè“(U÷;«¿!|4g ÜÁ°¶k¡Û‚T{PÕ;7MÌ\?‚f¤ý~Òg!.¥3‘¡WcŽÊ“©¦ÚàIK_.i͵ˆÔZªÿäM°Çt=Лtpí@›œëBƒXù^P‹›¢ë‡2(ÕhƒÎMï¯IouÚÃp¥_g 'È‚µ°ÓÜгå›p{^Ðò½”À]Þ~Ýv\Dý%U5ÉZb2ªmnûÞ…gõ Z$¥ ÚåC¡„ýÄF 9Á.ðc{ZšQm÷Kq…wÆ*WÞVb»ˆbˆ´ kïøCçñ/±„DZkK€Ê‹jز1EaLâ=ú»ÂN€CƒAo`R|yt›˜\îù~ýªÊ„ÊeLMpH[CÍœ ¤É$a"Æ>úúŠ[_,'õ9Œl¿ïûLWCnZòˆ…؆ªÊ`|lmÝ>aÞ'­§F¡w­sýà…8ºÿ†cå9Ðã>ön„¥à!W6ʪ½MnžÙ$2ï¡ü9œ#J?©“žSBnÊ4Çl´œ„6+/ $jg!øI 5…ÉÜ@™ßx³ˆY$׬åíC.uÙön1¡9†P^üG‚¶S¦m•“©1]XBéÞÒ讵1Œê^yL¸³ò9xüeáîé!ì/jÕ‘K1›â>³‚Î!'3›]úöCÁ­<óÒ_¿õŒæ_‘;P•¸ì1«røø€`꟨ê^ZV¯êÎ r[dì§ßxµ}ˆiü@—e7£9BÈ,>bÃÍ1ÀT Þíë6¨•b¤uŸ5ñ3`…­¾ah^ûtôéúûÛ¾·þÄëY'Á ]s¼|iÑSmû0vŠ)ÐTý#Œ¹ƒÒxÆGhƒŽM«Á¸q¸OPk’}b\}OÊÙ”¾¬ ñŠ0Ó²y¥²Í-%e|mŸ0£C¢¡qò¿IŒbo—(ß¹3öƒÉ3ÞÁþÎæÒ”z,°°mó­™Bœå¥ú¯—Z‘€ áâÍ›ñ` îÌKôG7ïаvÖd˜I}¿¤ñóMöüŽl :vIø0– ÀzÎÎú’ ÷™Id5̾RèeçJ/½e3yèá4ùŒX:T+©÷èú‡XuAŠÇç É @Ư?½‘-+üê—Òî Ï_ÃÚAiCÁ¡ÀlÑÅeQÂZ5Í&fI›57 ##H”XƒŠ^7!|^­ï* .7› ¬Ù=+¬+IJ~WIŸ£/^`@ú2y #Àñb©MtÒä'VΩvÉR^ý—àëƒÅ›Bë)¬“[ö]8,Ê@ÔÓlKÓò‹lu.—l¹×Ž« ½û‰,’<“røÆ¤èáýC?—M£ÆÄ üûrÃû-Ęóð>Ñ~ˆž¨4¤|UN{VŽB–½nâù„>/Ш³søæ¤‹éÿ¢õ#{~³XÔ;IcD(óAù½ê»—Š!|^¨»X[ë™ÎÞs䯿š`(&Õ†lV´ö#á7?êCò[,¢ÉÍ ¬ƒ*½ï3þ¾¡šDæSêjþ-/¯¬J¥~•z ï×X(öH)G©W—¾n¶0Q˜Þ¢`¾“‹¸¼ùPã8ã'ÐápaJŽsòy½èÿ@×+Îg/hÍVnwÍ:³I; àùÀtYìþ-ˆéÖ$‹ùÕ+±±˜.ÿ–]ÜVV6G÷Û|úx·Önv°)ŸnÜq‡f;©ÆÈÈŽÆU›¯ë³Ì‰%RJÿF÷Î}®øNûÉ~­r¹V¤f²â°ýJ’gkÿFuBY«.a3]ËÊ[: ÙuZÊ—Öëif™CU\CÒM§Æá-Ö×>Îz©õ¶?AäB{¯ ”îž–àïVfÿÄêžkn¢AT^‘ibž~ÚÿȘð¾Â°k$îï5µÝz”€{2±t £Nê—¦„÷§;|By#ÕêÁ}È÷@^ûÍ2ï0Æ\A1+‡‡ºÜ+-¥š¾¨ñN&Q,îþ¬DÌ2àwùRnÞGÇúW›)ÝâÂÿˆ× ? góÆz^5˜ØG˜á¯¼ô»Ê™MTô:ްí=|¦@3§'™:µ¼ýD©ií+ÏÝï›…€[8ºÍ«)v9RZ¨øgÚLê«ÁÁ)äšÃ]"ä€öGÛjÏЀA‡÷g S÷Lò_àiÒï8¹Í½°psãY´›u§GKOTÛçy'Ï¢¡ݱ2­V0,ÅtTï{E¡å¥ábzõ‹@S×í±@B…ß šMñ™D;¯Ÿó‡n…Óï¾þ"B^Æ¥öõg(Gý ™{aôÓnyb÷ûƒÚ}nf-Ç÷6Ò€@ ¢?!b3is­$öÏ!è÷]Åô^ ¢ßšËœõ´Áu Ø@r^Ôê…Pé@´ˆ¢@åžÁçOK±à·3Hj&«ü©h÷j/²;·.aóVöP™’£ü5ÛGõžµÕ–]ÓØ …ì"ÓlâÔA̒ʸ$¾r„p,ËðC~¼|U,=w'-oœò™Ô ÿ¢: ƒu‚ñBúŽçgïe žÇ„Ù²p&{9Á† õ2*ÁÙY×{0¹ÏZc.*æêvhù^Ñ,î rÊzÔF¯ÝNMKÜ튕‰«¢O -©kšúJ+y)ulWd™ÈÆðb£Ðưÿêz2£1~¾aÀ½ô.Æ‘Oóo"¬^È|­…9Íçëø‡´[gÙÛC¯+ûÉã&¡;uh˜ày, iÌ‘\Žq\!ºÆNÖu†l£¦ºÂûùg^ÂõÅù‘KÂq`±Û÷™éÝ‹9ƒ£:â ˆ¥‹Ì§xpÃÓÒ—ó|[[‚xí¤»÷߃pñ"ïÑŽ%Öl¯ Ÿ%êxÝTÜ3H|xÿ\?ø ÌÿU>¤x:¬ã'YûérPÌóÕAZßQÊÁàV7bð|GòDÉZBƆâ{wÑÚjâA®8Úÿ˜þfZé- ‹\¼á9ßJ(8™Ñ1’o–=Þ©åus™àHŒïžýôäÙVó§K¸¢–¤¨tfS˜º‚x’[(ÙöÑx6ßQBÕ9¡›¹q ˆöyß F™çhƒM²¦éI_ÍEÝQA 2˜W̰½àzéíøþkuÎçš¡O‚ÃEÈ`FEzEèPîöQdèÊb~|Pȳָsèi„KTìñ«|rÐØéÓ1œÏŒq:VÉ€ŸÖJÙ匵™µ¶Q™tBbi!§¼ ¢ÁL½ºšî0ž ÓÝÚ"FsËû”ëŸ)ú=Ú}¦~É193»–¤‡Úψz‰gñwc b3xz¢¡}íÕâ„HœËƨ¼¹ñ:¤ç^šrS`NO1á«›xLj•bêf`ÞâàþK+ПðÖ AÖ˜ö«ü'Äɘ£î"ˆ"š<º0j½ÙAm%á1 :T¦PgÚ7ðµ_'&>d/nïF´jDž’ïêøuWà<>Òyež$ö)XwénœCžNu°ô™3¥‡XVƪà7PúF·sê5ÈXhTS*¢§ ÌÚL¯q{vàe”+ ÀÓµM0ÌX.]:}è.I¢ÉýŠ·ñû3ª b]ß%òµgî”ê}¿¬f‰sn4»gŸ§³×ð¨ãúG€„ DãÂ%Y˜`É)vHj &ô%G¸$`ÿ| gÔµ‰¨V»~ç?™?õdžS¼Ý~°Í@øø>äëA°Šxïuœþ¸Ë6a‰wB÷ùH±ã‘ˆ {NiNÛØ? áWuÇŠÝ?yÐvmìåüB,0 Ç7 êñíIVç1?¸ãØXÒCóç <©FÄdCþ·gѯ1îFä`_Ó±GÄpj÷EU­ì|Ú4X\Û?äI¾i‡ÃÎĵº&%S3x™è0-`GÕfú’=ã±,åŒ\:¥½±¶kÊŨMœEé…z½·ûÚñà> LÍöcrèþÓñVdI­ÓK8n«xôvt '…å ͪx(æP£Â°›ÇÄp¹bdFw9ç—ç$k›æBg4¢¬,²Óñ2f¶æÊÑy°wšªZa ¡FÒ´É¥/[4„#HÎÌq¦™9´%ŒùP÷j‰@¨õZ3LºHD}?`L$àwà`iªïÆ[üç`l·oƒR@ ž6¼7ì†Ap„ÃçÅÁí]±)WdF@[D6ü—KÓ­¸’ÏO*€¹»­º•^ÔDg½ØWÓÙ\)‰!VÎŽç™G p5LÆÒÛ¦2¾þâH0Ü%\KhÉô®X7ø¾‰®öHœÙeÐ+þy9µ› Lhç÷?N}å{4?‡6ìaÙ9Ĥ°¨¿þEñë‘!(\øþm¼X¯FuÃçÙm› Æ ¬µ®ö«(°x3ývCjom ÑZ¿o’1'ÆeøÞá˜a,ÉÉ=¦ê¾eÀ êþ[{æjµxÃ~}Uw6Þ¯Ò2¿Üb5„LõCµ ŽôL’ÈG IÏhŸ|gO}ÿÁƒä¶ün¢Á—øÙ[/™÷ïXc.™ØuÕÆ=¼ÿ¢,Ò ÅŸ-ÕØJ/18fî°šº<&.!¬4&Å`I:IÏùÚÒ:Î0¢­âY^C¹ÂWÂ…“©!m³·ËµÝõ5‹EÏ‘nÌí3³7ÂPçé:5˜¦¶¾‡$°‚Ò¼lÚö¿x—ؽd3/^Þ‹™9ü•¹V~ÛµL&1ˆѾª$@$Ëa+;žcàëï3‘žilR^ L&kì»øöÒë%šé·QÒG­º_è¿×ëÌð5UXR˜«#öó„äãƒ=Š])S`’Í|hƾ„°_rÝd| y)·{6y…ó#h½à<þr×ýK%ÁñG c°æ§&Æ:‚½}Q£‚]`KÍÆb³@Åȶqá ëÒS°1ászÎô®È.i‰dЊɷ]ë§ýç“:䘧¶.]UhvQ@í1*OÞ8F&/Yt].ÚvÍBíIéœ} ¹ß!¼¼gr~`*¿¬w23Žû€æ—ÃÆ±™ÉÁïêMÀ;ÞßÊ©¶i¦wAæ꽈塂Ði\ ¯'²×Ý+¡¼°×Jd«ë¸E$)¼¸‡õ)³a«ùA§{BÌ¿ü€É›ÆJËz¤XV”x·‚/Ì6¸L{å}ÿ&/ªöJû–‚¿“p.x uq];W üE¸s;zð¥zúªï—¢vÓ«¯7Ów·ó¦¤´i[hS_ÐF¥7õ£Y™ç“ÆÅù² xÁæ‡g?t`òæöZ*ðŽ›2„,ïAòç÷Pøô¶×PÁCSÀ§á!v”Ë…­ö>Ôÿ9Ý@{ýˆE|EqÎ`l½P‡Å`w}dÈt›^à‰MOîÌF ¾´N¿ÝãôÀðÉMþA°† mÅÚ›Uø“‡‚Q`‚b@îÃ%gX9Ñ@W;K‚Û›:2Ü¥a/B`T  .gtí¬ê‡” »PT€Ñ,¢w!?¯ùÒ€ð9Õà“ž£Œê–׫Rß« Wd“I¹$Q1ã ÈÌ\B†+¬|?ø:Äêµ4%â!&‡¤ò‰ß„5_0u’/Øõ‰FW”uÝy <'¯{¨Ôþî®âÞ}3|;¿`—I[¾EqϦw²i ëë/mð†d·b÷8b·÷0ø¼ÌŒÝnCê6AÓêøU²'jS$ó‰pýRÑèfD™Ü( (ëQÛ¿TôIäÁ¼0+°QÖ@ȇØè?›³¾/1"7¸z:—ñ6îYM]ö6Qð÷xY©¤O¾ó*‚äôÞ Bÿæ$¼ i®¿ë i[žŸU}d)‡Þ ãm3éò`ºk|P“»®²aе魤ZWϤ«R=`'õ¥áN×Ö¸Tq[BŠd ¶xÍ-~Sì«bTþ48„ÅUñ(cæ³?·å~î+å†ö^µ…¨AümB ªÐNm–å‡ pP®¢¶Õ]4»&2ÂÓ$*R¨‘õMƒäL¦–™ÑÆrjû‰gÎÀ]–eŒ7 ºˆ¾&ïM}¿vx™+iì‰Û"[õú~ç¯1j/JœÉJ#Ô®d,7ul+ó_矻§t?¤–è;’ ¯#”¡º%ñ'²Éa`B¾ÒcøŒ¿…@±ÉÆÑ¼Öæ8Jíy3’»–~uÉ­6 k‚Ü$SެxÁ™¢eì©Ñi©¹±`´ChyéÌP3+¡ºJ?'@¯ûWiN½!¬/´aÙH6Ãá“V£¨0OŒ„+ø`«£òj„öºLÊü~×aååU’ÐþXÌ÷ŠãùH!*دLÒýø,BôêèŠÚxLÂÓÛíËíéݼ?¨‹˜aÅÛÆ‹N·šéõj;b€a¥ÇéŠB¹Jøùù=‘{òâIOßlF+€¤Hø.¶škRúñ«ìc9LäËÈòmѦžü½€&³+ $†ÂFÖ¼n‹Zœ|žÖ°T”4CéÛ£½ì§IŽ`#Zªt1dzúZ)09¶]¨VœÁùúSØ7ñ.,ï[á=VØûaÆ & aTNÇ-?ÑP LYLgÖà×ç:|lwým·úËž÷7‰ªéÜ aa“»ÕÏív¬(1©ŽÑqQ¼~èåM¯Ÿ5#,#«Oe<$sH$PûÆfÜ'fƒ³{q ,AlÂSy8Ì¢ekƒ—ýýê Pçè7íRkz¸öR ½Ç¼M7‚?ÆÜ# [ó:&Ë»ç÷º¨uµ1a° Óýठ-2TdØók’ST×ï>>ºôbêty›àß'ôP¦@šö5 ,K¡qÉñ\Hd÷-»C‘¦žõc€½û!°ðËšN¯$—гg„¯È^lE"ï+6Ó?cgÖã :G>8aí4T4q14´½ð…âbQá ¥pyýç;FcªCY`ž‡©é˜í4qº´y2ÃV˜q?ƒB7 ì›aÍ‘¦2–\­mAPú˜ÅÒ~‡ rc¢Ú>0h:x§AëჾM²ÜÔ(fŠëgZ·}1”Pß¾ò³:XR¬[»Q»¹¥¹#Á¨.šõê±4/mSWè¤mj¤ SÌíÓµ©nˆÛ,ÊI}ïïÇ<ÉpÚ„?Öïg„Ém®•ÞZ_d¸ãŽÜ»Q@ÚܕҴ¾%·køz¼ZÚ²¶¨xò¿‡7ĨRÎ:“`¹2¸û‘[©íîíR8»ï--ZïAˆ©˜¸ Á°o3¢J%Gk.“>t¢N¤KÒˆ áå*†~dLuÓ:'š­ïºÁÚcßÇÆ$L}×$dîF¾e“r,jÑú€n;\Oç¥vërGeªçMEWØ×ýàYN‹?l ƒx:Q&Dòc»"ë{ê1ýÔ轫Àžß³×ªÀog„‡wóHÄ'´,ìŸkÿd *ãŒ|ô Þ’‘ Î~y99|0a¿íùm1¦ÔmvY¤gN[«~îè×-g™ï¸Ç$±†ôãö$®WèØ÷›ÝjîÌöÀ_ëçfk»y³TD’£ß¬lÙ&²MW¶TDô@bÊ™Æ+È~÷¼Eô?åà>r§XÄó&§'Ì”µû%+âY`+hã÷Tw=I±{ü–HÇ 2ÌÑDìkÞ*,Ì6·4ØJ0j(|Içýì›â‘Ÿ:þ§:-½#SrÄÃOÝéäÌë¶1r¤Ȇ§Þªd‘ræÍu¯Ñ€ÆÊÔ`t¾_•DôùÏÂÙp‡ Cè%²éSÊ„TÏ“Ir:¼ #¦ØàèBùß ù;´Bž>l¦ï±žÈ.'ñÀÚ ´‘XÑ;BHxi«…ývHùPÜ} ÁŸg‘F5Cd-~Þ«û%m¨Êf”ÃU&g±P®ò àúµgÿP¥ÛµWÚ¤îÈ÷Ÿ”ÞŽtÏOaê0 †…—£  êŸ\RË& O»t¾_'=Cù!ÓAù’ùü¹­e«u„ÂЭ¸9‘ŠÝ®ËÜÇÆüò³ ‰éÛb4-vYŒ¿jö~NO3ÝbBÀ“¤TyT\N”’žât[}!cJNÔéôg2ùaPÔÎüÔùd·h›½[oòñ‚G ›k¬Ý«ë-âWxÖ‰!®T äÕøà÷ñN­t÷üŒŽîæ\æÊ{ ìË1Ü+}ùCõÍ(ª¼s’ý±¬Ý‘l4mÙ¿1S+ÃZ>ó+Y•²)9díºµ‰ùŒÑ0oÈ}7P¢Û&<¸)p_ìì]L¦Äg6/ ô.§ƒ!%`lµ\(óÚ}ì-ùÉ{0ªbÞB¿8ñŸ#B(b…\Ò¾)` rö›ÐœQÕðW˜. €è,ËöêvÅs7¾z)©d\*ìÖ'Fóh˜tf`|‰Rb†Ô`ýþ¼ 6\¦@”6»…òsÒLÌEP›ÝÎ0ÔapŠT™š¬i¡Ñ@ûÂöZÜ,šûžXWáh0ÓcófèÈîXg4ÍØ|µéâø®:d–vàç?Œ bᡟ޿IÙO`ŸÖÀÏ‹¦Î,ñO>ÿMRlâ)SRáýmëó{k sŸ‹g„×"‚5›x=NÇi³Ïœ2¨œføß=â%Ý5, nØ?TÙäu&Ó53s§°4œ6cìÁ¼fdµç”r‘­OŒˆ6ýa„Ípôãíe¼ì¡¦=‘Ró‚ Ž G¬gîwبÔõô4ñ‹†5³¦²b„€øBî»’†R†œÙ4;ûÜò2ŠüûÛ0*ëaöM=»{Œ›ï.« ãÀ„ÿ…)ÇkŠeR¯½ðæ!ê;ï ¨Ô=¯xóåT+±ÐµèÜdnV™!°Ü>ýž?kp±™ž+i:Äꛥ?ôÇçÁgursuÈ5?Hþâž:b€ÚÊ»¢¼D0A[¢új[ ÆÑ;w Èò4wx•—|‰¿90¡ ě髂›¢ªÀö$~x‘´Íà;ßin˜ŽÒ¿Ùkë—”xàç ¾ ®$­HœP˜²³ƒýˆÊ²Ó|BšjagÔ/ßye­ “ª U~FzÁYYÜë"*æÊ;4þ%ŽÀBuݺœD6RÀÙØ¼É#¥„øÂXºÙЦÊW¥%¾ÓcEMž¦§K}‘¡qÔçlîgz!¤‹¿YÆVÜŠÅQ·†¦]þ§ÎT‹}A¥4è6ƒ‹ÓX$<^¹ÊþÕ›¾ÙÅÃh=Ðuv±=ª¶¥–5¥ü«ûØ?5+À³ñÕ 2¦pV ’Ô*. Mƒ*]}S³1›4&Y÷m{˜ý"íö<›R’yŠFd¿=»þe•ûCŽ.kÅÙÀÀ­¹£ï"Œ ›6ÝŒ‚=øRæâ±W#EÒ©Ã'ÿõŠWDé *éZhn`0B½’ï5‚@ iS©'Y# ç¨Ž=7ë8˜u‘s…TVÑ߀4TÑãdhL¨Sq|';(c³x?úÝúíÜ~pxTœʩ6×f¨ÿL ¹`ûs'lœòÆ¿nVø bOÃŒû¹-×_'¨çôÆcD UšÁ¥V¬K¤Ñ÷ƒï–»n[ÿH·¾ø[¿é3Oº¾aq!Jb=2ŸÇðvÁwï}~Ïýù“b3¸g&…e × ]V ±š«<ƒWc8µ«G0„7ï[¥£/Š;µm °àö5ñ†½›¶I€ô‡ïf¯.³€œ†8!ãCÞH81I£ñî1²±É=ƒ¤'ídî]Ø»µ´×*I $Q §t&mv{u¿o3¥ï7ÿ¢ì üãÁÀ…î¶ÜÕp‘c*Xü~pÎ ?ÆÍ¶ÈÉùœwN®Æ±š0Ç|«…ÿ¾{/Ý!3ðQsŽ«ª¸ËipÈÚÁŠôÈhàíä˜Ñâ’qÜr°Õe‘g@ªAQ©Ø¬kŸ‹Oë ]P ©±3±àø*óãÄðàÙuJâK‚JÅëÜÙ$+°n0K7ŠS_GT+V@¿G=¹‰b %¡¯þ¢àåÌßÔèÏûJüô…%`bËV=H&î©"Gä•/j TŘæóy¢ä¨P•’¥Ž9)¾Cµé¥«ÚÎÀê’Ùõ¶áÙê*XïÕpÁ"¤qR%›b”¥1rØjEL8gX†Ô¼;%¤¤ ¹—Êge4Ÿ¯ä½œ‰9Á6ê@.Õ¥]û¶{nP´ìÍz× ÊBÎV"àâ{ûÁ6_³Ïº0¾—'Ú âÄßâRóíLxìBS„1`·¡Œþpý)Ø@¥4§dTH…R—–k>¿ë}6î×p:ÄTTX'’ú8rã¤A¤…•«_4ǬGÔ»a÷&®ùi–¢î÷ñ”m$ôæ1tÞÚ:ú 6« Ž7âÄËj "ÒÛ}~YÀâ^ëìS*V*HÏ¿6—þsá½Ø“€!öîé''ì4iÏqÄ ¶pê:YLPb»`gž1‚¸*ù@ÑóšÏ}.>!0€Þˆî_8uáúÙoGDç€È:ñB^Ùƒ@ʨíHðÔ!HÓà©T›Vîp+²)ü«ËCH91XÝ9ÝIH4EnÊÔÉê²êoKS‰<‹$z„ºäF5=Š,?cnE-yÿø‡‰1=:÷ ªçÍ ¶ÓVb<¡¼uÁT0]‰pÁâemŠÏFáúÓiÁPºÅÃÖêH-aˆ|=Õ‹‡«øà7ëlÆ3ÛV}ÿõ×É& ²_3 n8‰!† ‚É-ã”k‡>?w/B†¨»EˆÊÆðxÿ‹×Z„0#o'b0"oýC`5¾^2‡  qâì»´¬7‹Ž:uö¸ßŒÔUçrÎŒðÇÇTVÙüÚºšˆë¤“×R‰Yþ´\ÖÆjÿÏH˳šÏY t›û›ËG¿º° OßXRB=Pgìpúº)0ÈŸ5 ÅäeÍPÊè(7=º¸‰LÄ qyN•-á;R÷º")EÍç²±DŒ>‚ˆé'®LaêÁ“¶’p~íxM" ¤'dÄm­ò›ß, ›xÂåÌ!()ôPúâ>âõð÷ï’ß*ãBÄèjŽ1;"¿„e¸æFb…`ù݄Ȥ&.ú”W‘a¢¦%6ö‚_ç(Ê`.–&¿K¼öë§j‰’9ó‡}73ëÐc*`÷þâ°#ð7(Ú7èd¦s*˜“~}“s‹Ô™äs$ÉöÌ}&$ß.õZ]µ|Þ¿¢…wñe¬%‚ÀñEònéP:¢+¡OŒÔÚàïîyÞ+k ¹µC T¿¸šéç°r,—z_€E)8&ƒÁot]»ñËÙ ³ç(­í©‘ɦ$ú/SjÄÉ`~å†j‘Py9gãô̾;JD?\Ý 3>}(š ƒkÕЇ𶭓mž¢ä†Y|½wDR¥é;JÁË$…ÏP椡2ü½lLé6p”snŽcŠc?Z?‘Û$þ !°u3ƒ?„±6gîyzÀÎK€Ï³.Ú¦Îg]{µ–"Hô·›«‰~è¾½Œ8˨†Cé#™Å¬ONCzžýÍK±¬V*×fSŠIžíqÆüËÍ>FÒ²¿®5¯#ÈAêDg#¦É.þvb¢ðIž‚ì&y„Û‘›dÂß$~KÍ/`D\Sý÷&¤Õ×[ñDØPƒåNøà»œŒÍ™Dt»]ÙGy!òµTßeXQ7ø‡Øþg/¯|!<¬vÌë°“å#éã ÍþÕˉšõâƒÃ©¢¤Ÿçº¥©§Q|Ý*üÿ³ßÿúçß“þïóûß2ÿþýçÿŠãŸñ—ùì¿ñÿ¯8þÙÿ>øËýÿÿŠãŸð·±þï‚¿‚¤ü¿ñÿ¯8þÙÿåþ¯â//MüûØ;°˜Ò¶rYr©q ­:;®­iî3M5MÒ¤"Õ?•&«Æ\NÍüÎ\š9ÕŒ(‹eÈæ²¹$–X”„( ;ÉÝb‘‘¥%·ØmõçL%·¬ýŸÝÿùŸÇy̘ó}ß{ûÞûçñ|4îÿôOþÿ>‡ì+Œ`ûòJ18 .h³|ïÏÙ$X"‡!l¤PI‘X¬ƒä0¢µfNÀk”Z i€/(TÑ$oŠÒª•  ufO›„#råJ´<«v²ÀÈërÈ`ŠLF}÷}îÁ-œâB¾{”Œ¡7ã&’ßV À5&©µ0™LÆXq5à#UË`Þ°Á ‘ê($dùÈhÔKÁgqfß\«F݂žX‹¿|puâ2)26»]újK\N:u¬V ·HÛª±Veabü÷ÄéýVîÔÊÞO_¼|kýZèË` ,U%5@ÑZ±FŽ[Ë;mÏ€q¥ ÈÂZW¡¶¤•¶q)ŒJÞŸáE"L^²FM„$j­ Öº©D$>¥XLàE`މÕA¸£´¶â‚aH%V‚ ú~0°L¬…Åo™-ñ.=š7ÒÉÅX¨ÖÂRË(€O :I¢³i$ÐCèç6†ÞE@J‘±èïÑUÇ4$‡h°It­CÀ.íh|;³EöA €©KoI‹*¡ÒH4ª ‰Å`’h Ö‡D`ÉÚ‹›íø$.lH0©`·ØíH€t§i±ë¹B×bÉ:¹:^ÅËR9×tLaD °qŸ[ßZ}Å`ͰSgkwéÈÔKý%{ÇàþšÉ·B¾s· ù¦½É/GªÑth‘ g’3‰Á¦›ìP—Q`Cœß»¢ìžÅ!18L‡õn}rß Çô:4¯GD5„ªÍ)†° ©£^iÏ5\T,ù³¢¤0‚hÄ2H™mï:XÚòŽÕ‘À2PPÄQÌ_Ú¶!@[ªÒñxË•ÓÍE–âÁïw˜c¿Vú¡°ÒŽ{¤RÇ+{¢ˆ¸´Šh9ŒkyEÕ@Ù8d® ÌHßB%xL¢FQµ²}íø7¤övò½% ¨N¤¸x¼÷°-03Í ÒªãX9£S+A…ÓZƽVÎàª5—4:Ÿ7k÷­š† AoZÒŸ“ôÝÕ ®×vz¤à„nZlsÍ®ú ªçã Êç1µ ÆnVÿ§EœÙEe0z%p”Ç•„ç‹ÊAcÅ¥H°’–ñü÷PŒÎ€¼’kÓèUT튀ùx|z,Þ“Í> †É*ÐIñ>´/w@eš˜jdÈ;™› @Á6½Î•LûÔë¯ÃЩ4j;<õh´j}”Ë6:T«ÄbmB…+I®Ö`iFŒB ŠW $±¬‹ ° ó ñ <¡0OÀ3 $Ü ¬Û fá8ØŒG¡Ô €6^¬}3jÀ¬~’·Àˬ÷ççïŽå¸ñ~!ÞÁÁÐø@ä y Bü¼Bý= {“¡Ö@‰U²6æA˜‡È>:@#”‡ZH æCx_Û:E†‚agÇK­1`†ÙÞ‚e8×øt (1}ƒü^mn¤€? 6Ò‚ ÷fX«Ô‘cžˆ†E*™ ”:3ew"È\!<ºiRŒ ¼Wí3@< |<5ZˆÎ†hLW†³+‹ašÂ)¾ÖøƒfÛ†^eì„Á•B‰'·võÀº(x3×âVoU- ñlç°–bkôV*d2n_ à!¡¥ÃçRÌR€!³°X@i9À2xVÿ룜¿ô¼ÿü;ñV‚úæUw ”}ü©lÇçàa¾qþK§±¨ôOçÿÄ;Óé4N”ŒÁfÑ$Lqva³.b›#s–þ¯ùûôü½ÏGû¿XóÑ4>äÿLšó›þÏþäÿÿÌ#ë`H‹ŸUj­°ÆÞÑéDgp°#;i¡1X­  ßæPÛ`'é"‘$6 nƒe¸0qXÓ¥=¬ô¾íO€½)PC“FÅN ;a·B±)2jûŽQG·°\ÌL:Sß`’J§  ˆËÚÖ:ƒÞ–Å8tgÐÞþæðÿæùXÿõÓGÓøÀ¿ÿј ÚÛþïüÉÿÿ‰gaP€Oo«!˜á÷öóå :uêl¿ïÒ|çØ<ýü5*È?Ä»©¹ÙÖÖ6++kð`MqqqFF†‡‡GRRREE…H$rpp ›››HšDà—*î4önYT§N}7`ÿ«G¿öẉñ·÷ (mpIû9b/22û[xÍEéô{#×禹¤Æí€]kVO­Î(¬-«~áé©=ß1qÕ“ÌE=9òÆ ÞõMŒÌ(£›P‹¥–äDŸͯŽWŠ:MØk“[3Ît¬'ÁŽÂGþm/;²š†^dŒ@˜ÈÞd†reF¡è}ßË4J—Iö¹õ"ìeÚ‘2\c“›Iܵ«Îaòíu…ž¿ŒL=õâæüCv‡›</‡uxù¼¡"œwúóꥉ® E7¢µ·g?,.Ï+± …uÈo¤¡÷…ìØß-ŸRå^ðYÕ}i½Õc,{&³²2Éqe'eôï’ŽŸ "TS,{žKv‘¸n>Å Ïè÷¨ÄXÖ‰ ÔÇæ.X}©d ËØkÂȲçå[JÝì+­S—$×\ûbÏÖ¡|dNwÒŽå|£0š „$©ÞÓj2™€Å UÖÅÌú‰©',Mþ¹?…^/Œ …ÿæïÈäš„Ak¾¬øÆMh;&MèPKŸÔeçë+‡¯±òùO ¸¸|âO!ß3Kü/:|&¼ô²Ë”úζ§Ìkà=!Ø×çAÜÎCGó~ë«°Úf¼^,=jÔYv¡ÿS›d.UÝ êa‚ôq}%ùCˆæ…]ÏìT†õûG”Õ¼ô†š¨ûo% mZÒü¤_~€ÏÚGÃOíÛq’P¡þñÊàA‹Ëjð>š–s.2âhE§‰i{Þd‚zó¶óÆ¢-Ö_wíL³;:aöjÕ\ýu¨òViɯ)ö3Ý#ýíÅ ·ŸJ8‰»“ví Þcµ0ûž…tÿœK IÖü¸­ùæ¨y ]é‹8uª{)Åt¦ŸJ»YÝ/ôÌpè7ž[oíj™ºH“Ô2wíjS<«¶Qή ¨gN±.M>?sÏœ%òö䥿QŠg!ä]zœÔp_Õ|öNû'©b}nÒòïŒß ëw(×ã¥]Q†‹}å¦g<(qµ¡Ođ䫎§/к!‹‹®]]7~²lX”frê¦Ô†¦3ö>§ã,NöÈb Ê9†\ 4ÄÏSEYs—±d›Ö ÞL£[D¥rÖ¬ò¼´>å¼Ï^ZJL:àVÖCAÔƒô³[– ¸ju±¢¬@§×ë-®-ð°/µinØ> êdßî¿^9tÈîê›Æ[²%µó2ŽÕn–~p|Ø’³ *Ö­Ý™\@¯tìå>7ûÑŠÁº? „*Ì ª®xÞm׬^]cõ1»í§SìŸÖÖ8>Ó,!¹:çžìÅQm[Rö¼RIð ‹?¹8"†2Ù¸:4Ë:ïürµÏd³Äá±—)ÈÖãFÍ¥ 仲LòÝ1¶[†ÕÕW­ sPÛÖìÏw—L¶¥|GÛšœð%At±ñÄœFÛ}[½(š÷ôƒ¢œîû5wI¿=|£ü¹$޾£œ—}šÿ`üæ-·õÝŠ/\\ãœ;poðКÛÍ\“ÃH‡#ƒ€s„WïeZV}7.eb¼âò®#‰u«·°ó\KïÍ×›êÎh÷EZU¬*.X8Ç5Í©­J®ÿÝëóÚÙ§–'-^‘îi:'Pű춨£ý.?.©ÑYó…„ì©©z 6䎉‹ðžQc¼>GbÞÙÿg•ûqÊÜ Õ#mª·’óÉÙ]_”³+ mê³kSÁƒ»“?ß?²<¢Ù›·ýö榈ºòõ+F®ªØ˜•Œ0N[iA¡O™§ = I9ûkÏÄìÅUÕKÞrî¦ê¤yDŒKÒôõ„Û«®k_<»P“_Ø?gVDîî ò0œzãiÊ1'´:^ž²x!oÓŒ?ÖÚäŸM1³{ر½]~_’ ™>íɶ15 "—é=ôŽÍé7^ÖTÞÏ ,"Ýa‡ í”v²1ýòËû=|ä}cž}û°ÀYñí§-ÓÙ½é’:þМÛ¥vÞ壥ôŽIS–Ïx¡J›0zšï̹ñ…Mþ×øåƒ¤WõŽ£HWÞ26»í60‚’#*6#Ž7«‹j–^[»Ep¨¦Ë@îâ‡MZW‡©9dž»(Ç^4Žp²GHG«V… “æ¸f^šAÜuÓØ}1V½Ä5ù×=ß[õUÆæ_ONwÏêõ,Àз÷„û¾B©nˆMÞœ+ײ7L'Â3·5­0 #ý¼¦Ý*±‹6F«ûlË °û‰+ñ~<¶ÿÓÞÆã§ÆV…v Òx’»Åg¿ ô4`Fô=üõÌÛlNZ&ßy˜º@?©ÏÁý º¤~qßuÙQKÒ/øßÏrÜœ8´‡h}d‚1<9ÝÞ+y†2ñ È®6üP‘ÜÍöË1vºöqœt¾¯$Ü£×OÝÖ³²ÊPô=Ó{¢1ÿAH*ì3åÆ^–»µ'÷®Lœ¼ç›ý—7g†\9ZãÃut9‘$¾ÙqŠ÷ÔgϾœð´ÿË*MV7z,½ÐßérIm¹°F·<Ão¿›d€z–¯bQáJ½ûÁ…;*¿ó=x"Á]¾q眂Êî©+†X¬E_:÷¯3k¾ƒ,”Ë3­9Ù…À¤@Q_~ù/fž55‹Âv,:µ“8pH [¤msÉË¥3¤ÆüÓ›§-¦:rsõ|ァ¾·çFu™gtžg¼ãkgÊ]ÔŸÖ—ØmÙÑ~„åt—q&íŠøBAÍv½Ã“­Ãô¡¦{þ°ûl`~ò5ôìJ‚Ï•ÏOŽF8~«sÑCé—•“¼‡¯ÍIÜ¿o÷í1_Ÿ`…÷KJbK ´ßÒ¿!Œ mH¤<÷¾ïïEÈ YT–p}ýÆ”œyƇš$‚äüT!küK·ÜžT+z?1}jbþÁ¬ƒûËžï¸sýægöì$CÂÞASÝòÃr9/_ÊU¨×?øjÖ£ôgGjµ'wëKR¬³Ër¯V½XºóÉž´Ÿ,¢4¬ÙKI9[,ýœ×M¬a¦ÙZÿ®˜9-­Ksà≿8<~ùh`#õÀ΋ٳñ.¯ÈóXW”èfw¦¾î:òo§ÇÑ‘eÜ1¼v5vüð>ýhºîÖ5§ /ë›ÒR‹RÝË"Ÿ× ªlZE7S™'MË8»°ªdSžÈéÑÓ÷[® ûùG®]ÌRŒnFÊçë‡^q¤¹_?j¿ƒÑ뼓x Ù•¿v¶ü·-­ðHŸë׿ZÛ„Z^‹Gl­>¥Nóʹw:Fr¾^g_`/ùlFßsÙ[<8jqÂõÛËn4îÔtz~•s¢ç™Ý½mòB÷ ®¥žó|P%˜y&øø¼•Ýãüž4ó{êVœVXm½•Kç%:õ„¬öþ¥íöHñKÊ r÷kü¥™ÿaçÌá^û?n©¡ŒŒ%3˘JK³3#„L!¤tСŒ™a, #2´PÈØ…ìÛ)kÆŠB[*RÙE¤’í™:ç<¿ãœßóüÎ9×õxº~—÷sÏ5÷÷óÝÞŸÏý]®yÝÝ>Ÿ|¡ƒ0ú½¬<ÝèŸÜ;“+”õa×(|{˜A R¨Sœß{‘ÝCÆDœ¹¶e]²õÐp7ßåÖ2t„{Á %t…w÷aÃÑéQW‰…½rqíS ‹V.²zB'f¬=²qEŒÖw.Œ•‚Í{ƒº¶ï5T4¿jLŠß‰Ø„&O‘©Wç]Ê;1µL‹„0*¥ræ|2èö#¢ÎC{ÖK~”Z©†ï‚ÖÌÅ‹ï± 'oÞÿT“N«&ÅÀEPó÷Uè]]]Õµ„›€M.jhäî¼æ½0ÿòÌ“év; ª8+³Ðv)ŽÁZV²pózjžf´_c‰þ8tù ~u‰—Ÿd{q’ÞvGŽcò1¡÷ëîùˆºéNyõ÷è‹k+¼·à‰SÇ$Ͻ§@­ayÑNK$5æ„éKv·»”’÷9µ\n.Šú®˜!ÇÆYFÝð2ùér,â'‚í™5Œ™¼;—(Än#g±zé<÷hYÄÑóuÄxÙ-_ë’Qz·D\šÌ.A˜Ï;« ÚÐ. Ï“!á~{ìCK›l¯Ú–˜÷Ç{, pñìD,¸ÿèhå)]âW/à÷×ãìØáŸ®š¨àª!~.ƒ*¶×&aÐ…¦H€vb›ð9s±#T¾”¨bDHë«Þ‰­zaÝ×ùÍ’T5j'GMêfõKO ׿"·Í\Ygª¿süñéveši½8*·¤¬XSÜ醅538²)î.ḑól<­39úQ/xV³OQç huï!1wQfË<¼ÒÈv~…GÂÁ7úÚ$o½õôˆ\m4/¶°ßÇ ‰MNúx0qŠ«Ä='G&LræZiÙûX›´Ô4çtÃäc2OA8“ïµö™4&©þxê¾ôQ‘¤­bîÛ£³2ôEbÎ3„­ÑõyMfE+ù;n¤I Zñé´&‘éÆwƒv —†-ƒö$ÈÚ;Þ0«‰`_Üo\fœ@Ëž, L9kïŽÊÚÅ/˜™Œ/?Ÿÿúî|›PÞ+03C(¿"ìýÚn|qÞçµÔÅ€´ƒ!`Ç)7bþjqÿv‹×}-Gn]мÓRZÕÄÛÓFô¢ï·Ij½ œj¥åMÓ¶ª5vˆqË å +-ù=ö;E·Š æ˜`a•¯Úãïì8=ž¾n’Ço8Óƒ˜)r_5°#0OÙá¶ugÍVœ”g÷å‹rÐ*ü“²§œ.2NV¸œl—Ïò{(ýåë’‚@¡qb¿Ìôæf”© EÉ.8×]—*ˆfæ. ½`2wU{,?8VqÛ¤jŠ_ª”ä oˆ<œ|ì|œ¬Å1­r=Äs+ãÚ*|ùÌ@17Æ:ˆ·³IŸ[Tµ·'D9­æÙŠó&øŒ@³íSKŒü!<É{ïàQçáaŸ3Tª{À¢è) •O¾-=H ²P=vf~Þ”¦ˆ£Ý…^`\<ÁkpQýÌ%WÚìßêËYÃPYI"ÎÏÅÆ±ÒYã ¡}܃ÏD ê^0»ÚîÈYÝ…ÅÞqk¬Àc|/¦A`¿¹Ì> §$Ùs¶3LÒîÝÒbz^E^‹ˆ½¨!þ!"Éu¸'ž_ûz8_”6_›K™²ãºX›"¯²U)YEAóýsW‚’;ªñÚkh\åAÍå ¿§yá]Wøåî;\›*Ûöÿº±ƒ¯œç‹nƒ[F,ì;â÷Œ«³Er›Ì£ºø<ö‚‚Ã׿†Ýh º›Z? —ôH“A§}¬Žsòé„gb°ÏCGÝ“*qÁEYB"´;eÚŽ+k†~¦•2-’‚Ô¡¢$IA;ž8×>»ÚÃ6‹_÷iâÙ™ã¬4ÑKå! ]Œ¢#ïo#àã–fúƒ·…‘'œ…8Í¹ìØž ¦DN4÷•Ï0S8E†ˆ$éÌÔÚD½´ÓÙýBð‰äÖ–fÓú¤‡®pËC°§|Ú‰õèÏŽ¼^vö: ŽÁ E_ÆÎɺC¨Ž½gá”7™Ð…í-=¯©€'p â2Š¡zYA…R³3FÝ!Ö@:m3¬CjŠK29Mæ)÷5M¯`¤IѯÄíà¿wÓ,~§ÉöWYmÈ©ˆte²õ‡6 ,ÓM›¹O'ÌnÃ}¿ .Ñf"E2¤g WmÛÛ®—}ÔfhœÅìÈF‹yCrÞã¼!bà&ÞÚÆR*ìpýfô¦Âš{MݸMæOìYí=œ³Ññš§ð>q&?”ÿ 3Ô¯/8ä “Ùš®D)Éå„»Q dëíwêƒ ´˜Ì‚ö˜BÆö£™@³éºVN±$)ew“Nm Ùiͯ eÊF­€¤ð½Š‚rrÌ+yêm¼ ü ×oš€*µèUˆHâvY‡^v8‘À%ˆ“9yz!Xב‹Ð›¥1§µ+¢w£ôø£”xd¬ÿÕM*Ì·Q<áÛ¸¤¯½=rþmHöaùníÚ³zºW·?àc˜ß¸šmµ…hqJ娱Iud­»E¯'¡7b“–øÊæM‘<µÚÃ1®£ ¹Úµºû¬¹øxµø]áû–O–1J¥Ž?pô™èUÃ~TÕ9>«l·õ´íP‰.#>Ì¿ð©Ù₇:º6ìö¢;ÛzÕRux6¤ov¬UÑܳ5’$µà9èÿNi6;Ù3”ü¾óÙ ìPÛ<dÊÑö]Çä¿–™*-³Ö¿ŒˆØ2·h>ï5Ë "Ý Êï_š–l¯ì3*Ô=…:`?RÞ`yÎaÄ#üæ{“8z“øx¤Än¤nµ /Ýc†Øž ¾ÔŸí4ï0½î´9xĶ´+¸z Æ£›’:§šrá¾›dZÖg`ìtÀHÔ`«§&¿Ã§ù£Ù£ªmÜމ Ë!Ûò¿sÉo‰…Þa‘f„æNvF"÷êk½¨UÚ1ÆÂyR–5®aÕÛìÄćL+T°Þ® €±ÃŠXp†³’w >˜ß"‰ç»Û• ÎÔØ1’‹šA^vÀÛ¢ÐIäÉù¤Ã !•+Øy9ä2Ù&ðµÒ[¡òdˆW˜°Ï¥¡é®ª6½N’â¸.$*-Ÿt캙rØD$Ǥù@PwûÆL–¦¯f¡ý[U{éóOt³ó4wï<Ï‚t Có'ÁèO$êïºGXñe¢a¤\†(É;³Qé YYžƒ¨äÅš±ЬÁÒÚr¿.¯kÕk’KÝKvνÄd_ë+Ø¡e«£›­z<O¡Jx¹UKB®Ð‘‡÷ã¤oy*¨QNÐ ÀXµ6 ³“2§샚îAb]¾zÓ<ÁYyŠT…û! YÆT?wœÿSxw½Æ©­/y>Ûƒ"Ø ÞÁ½Ö²÷™]±PûH‚ÕÎ9³×ÚÔç-MÊdn´é·ýŸßìM~s”©däÞ§°çñ΂:;;J²þüI>ùۣϕ'O•º‹Í2bËtxtKŽ¡":»U&‡ô ûßUÂØ, ôæ@.5t>s?ã>«:jY`¸T"Y‚¼ûjïÜ™‹‰Í. æÆ<>éTÃa(U“*œÔìe|„5¤Þ\ýš>õÁˆt1™5Øe»ùݳ¢òˆéÔ aZ›*àŸ; Î'ázXG¯£%¼F=6ÜÆÝ©{z6³÷ñ`/Î üEèY—n] å‹ žú-sWp4£‡±¾ô‚[ª¥Â¦É…o†¿˜Ç^QkMý#5Ôüø¼±û bR[UP6!´ÌÁL¸/{N1ÏuW˜ž­ðã€,.:&,— 'xyôæi$ÏÀÒ_Æ A`Ž„hljՙò±}`Vo~̦»¥ÕÞgźÏS½®OÚ ±:µCç!±µ:ï$GoçèöP‹æ®Æ§úoõ»ŽÍÓ+÷ú@Õj­ø$ r®¢É*ÍèÕ(êŠþl:×·¼3%S à©]´`U{YUÀˆ\ÂÙoÁßþ@(!:Ô}ÆSmDÿžß…5€þ+~GOíÒà‹;(‘±â.•£qÍþ6y{íçÈKöè9gÉ´¨Ï¢‡B ÷šFÞ$öF8ã– ñUõelG¼åoÏõt€ÉèØÃf$êcšƒ²®ûUÞ* ¹ÄÇíÑñüÑf¥²,™è–ý•, ë"ŠóŧËÅ}”®8øÂÍiÉ-†Àª†€€KC¹–ÓbCP–&R³(*»4¬y$ûj¯1R÷%È/«†%@†ž«NØw¥FÏØôÕĆ\,gî2zìQü¯³‘s_'ó30„ƒ%jAÂû½]3Þ¡`9GïÅ7x/Òú? }íÌ: ltÒ¸Ÿ~õº'çKÔeö!LCÃËÙçÝïÁΫôÀ%Àîdãîi¨È®Ø?8û︦¾å_›–ÐK$4±Š„:DAQA@”šÐEªôN*ET$‚Ò¥¨t„&"Ò{ ô&Ò›Ïø9çÞû=çþîëù÷^kÖ¬YSÞ3³w’š\õý—pØf9`:ûwGV¬F0¤óÅß)Œƒç®L¦•ˆó|°1Ôµ€²jkM‚"Êʬ)eþ‡Ñoø3ñÄ3pÇpÇX¼“H Zñ¿¡ÚyxÄLómËV#^»ê% ÚÑCä½ư)þCçE¿½ÓãAA@ E·uïPKåväÏc 0¾YcªÉ§ü>§ó¸Ûþ¨Ye×þФ2küc$ü†O_\ç6èPí¼(ü Bóôëfˆ…“( ´bÙË—p÷’yÁ›’ù%Rý›°7æy GÓ¥W,·Žz´§s ‹Çä4ŸÛÁ¹·$ƒh9ð‘{>߸ä|Û|Œ„‘ÁŠš/ +×ük×.äÍ¥ó+/¢vÔh"q‰'*þùLÁëI©2 ©+ž%Çu¨X|>X‰ÅÈýëò¿ é­çOÈÎx¥‡S¹å$Ñà'Q0ÀS™ ðæ­ÿd.3Ø"~ÚT›¬iÁ4ã×§½AÀÒ„+пz&éÖ÷|/ûâR¼â²¡bá’ûÁ:Т¿¹s»¾ÅtÑX¶ë¦„u­Ðe¬à®^·¼èmukÄRVЂ˾K :ÁñÈ…þPÛçç<±4šzõµjÝLª‰†jí• ð¦¾"¸S¿ïWþiçEÓ;P•ú1QL©“ô` ”0?à£ÿ–ùÙEl"?TÞˆå“-Ëð§¥JFµR¨)·]ÀK3§ §ïeÿ“Yç'¤êëIûÊòïîz¶ÌëÏ‘/Þ§”ŽZQ ˆ€»Ë± }œ˜Ì Ä•WõBðçËÑ9wɘ| Õ4))-}w`…#·`ýjbv ²ßJ>Árë'Ñt£.ëê>KQÔªÔ[F«Ó]x‡|{‹Æ`Kcé®”ÁGÊÙmYZ üîì1 ˆ9)Õ/öü›t‰y×Ä¡‚ÃÅ*îl(¬ïDïXU=ê!-hÀÉ3wà†oþC¦j÷A†Î|m]’ßÏký²aLK‘ñG(}6 ïúÇêÏZl”8`€LÏæ3Ož¢¨>0ЀyŸËÊé³@×|ƒ,<ýMdôÜÙýüÊÝÜZø $µ+qÓÚ/еœS¤/i´ $6‹½Æê€dU Ê€û;zQëõY¶£ŸeGFT¹!~5``3O·XìšL-±ÿºà$ÿðK 0ä…ò«ˆùAæù;û‘”1d&ñiU±³ýÌ-µG ½hšŠÐ¥u¥fÅbžØ+®Ó¬VA9'SÝÉ4–Ñš{ôÇŠŒ>pF¼ìB¸E„܃o@ºÚü^DY{ª–l6r’ÍaÁNK‰›ÿ\€{K!r˜kSeS?‘Gs>t} SÀ†f/a ÅXƒ{’3Ò_cîÿ±þg¸¤95ü‡*Qw«…-c ”H¤Åš3OÄ™ôFáºÀWárdtÄëxNíKÉ éA2"/a,‡P_8¶2¼{òD:”ÁŒ.6ßý¾ÍôÎx™ûÈ51–ϲþVü³ë©õ¡/ ;±aÕôCNG½¡*«û†õ+Yn(›ò©Ï±ÇÆù…ÅÅV)ó"È+Û+c_ŸUûgÐÙüòDM4OBÙzÈ;Ç%âs§òë«ê}¦ wcÙˆÓøãùäƒÈ 1´õk¬î£GŽÀÆÇ¥D;|_ìõYexÞÆùÖ•Ëáå¡_C°²¹k/…í£ZžŽûé| }WÑsû½Ûòäpê <ý9Y„[-•A8‰óû ŠÖÄþ{Òš³}§²HÃî|t„Ž¿Ë <¨d¨xÐ/+€šuj|e¨õ 3 ¥:µá ÿÀkP¦K\Ãþ#÷÷Îã/» %|"µšcæéÍCoK*D`yâÅ;×–°ƒ–_rIæÄ« qÞ¼˜¿ì ½CÉå¼ ´32±êò‹4w$‘ØÅ‘C`ÙÚ;>_â• u©öâí—¦g"¾6*³ ÈFÇœðÞŒÂ3¦J£’¹@G˜nÌÕ› ”åûË™K¬!ßÏ?òòk‚­ w+ hR2à™¿YëÖQÝå®þ[;¸s®Dè0égM`mvˆ‰ŠË|'ÊõAv+ônÖe>d=Àg;PíC&F‡‚–ÌŸ1§ú­åù½á¯PbÚÚ÷B1̺Ò#šÂ…CÁqžGŸBܰäoéЦ}×-üë!ÖÞq›}’gí¼±b¬{wI®²ï»WÜÁB01XšÁêåOîTšk,üô3?”h ã&-O–7ÿœ$òÏ`a’Ø“ ÈÖÂ"ª=ÀÏ‚÷ñ¼ýÝñÎê©u˜÷ý^(˜§¾]qî‡âÝGkýçnpê¹DšÊÞC•8.¡Ü¤Øfbbïè+Ò&Åf™7¡pyù™|oŒøŽUŽÍí)û¡E‚!ôäwá>¥CÜiÂbcú¨Ê­³"iÊ'oÀ “…ÇÊÂÝqGá’½eDÿQ)‘£ÿë2hÜœ1ßKã*T6 cûÈKáfs¡86Ïåk yªÙT̪”Ø}Ì tf–m0áâ#s ]W2Kû?ô°„%Œ0ï³5á[\gM’n]7:+_NÖsð‡)['sÃ,[÷eô¥“H˲æÀ‡À˜nJò|g](M–ec“Ý]4MÊ¥3½ÿA#íÇÁ”³5R©T!š‰9ìÏã§eqj$¯§•··!J…9O®M5•èX¸X¾¾é÷ät›Uê?‹„¡³Za—(ïi<õ.•.‚—ï¨2öµ–H·ÿÂö8YßL{Ò¢áhdÐSJ™ ÷ˆ4Xéu<¶©!ù¼èM§½ð7º;‹ØkD†×L7Èù¸$!ÑU)qè!}q Éfx?”o¹àŸft&¸‹l÷j¾sLÐѸú¹ÍJù.úGW¼µ=ê,ÒXøb 2—‚gè[À0f‹Qܼ®Ó‹ÒÊ– T|Ÿ5ïÍ}³ªõôÓSƒôÄg^jÝV°Æ£¿…Ñ$º£äµ] *€³ë˜Mq |J«Óž€œîvoÕÑ?õؼ€Ñ1C;€«^íË_~dÜäÔÃ;È ï3á»ç³ÿÞecýFÓ9Îô_ôqŒÈ~`öDÔÊÌ¡i¦¨žô,oÂò¨ð^¿Ûw.U/xÜM‚#ø+58FëÍzÎ9tàq‰ÔòìÍm]åæ±A¶.Ž_nj ˆM‘Zý…-ë‹ë}ëçÔ1 øÖE¼»#)€rû,™² ÒoÂú#z/ü㬿';È®‘²÷›ÛTÕ‹îUê‚Ð/Ôuœfº¤²%’”87]õü;ÁDõèq(‹ÆÉò* ‘o8Z«ê]tFFT¥é€íLÉ?·ùBÒ¾Gà–G¡ÃåbÆøwkÕåbVbÉôÊ#N – Y?=uIvW—ï¿Å f^¬jÄ’Ê¡kp²0'û¨²ê_·P[öQë½xw»¨ú3ú‡‡o”"Æ%žˆ: ׄ׷«œ<Д4ÍA‡|8øµ' ËÐÐEh‹´éø8Œ$ÎÁoÖÞb1÷­¾øð³Ý …c¯Ta0þt±ÿôE]©Ã¡ƒÃø>5{…Ѱ†@ܧ2êSP$X±å‘›‘…MgƒÓËpJ"~îø=¿Ø'9îPþÒ=lhdË›õŒéœ¿S? tï.©ERÅÃ~ ¿/#ñàŸ]šc€h‚Ð;‡Ú´…‡jϤ6ÀV¯êÏÊ8q(#a¨…Ëœ¥wñ¸¤ ‘¢#÷·†0ãÊtÕ}8äÑ…cÀ¯‹^F! ypaÙ²êþïÕzó‰kÆeúƒGŒÄlW6µ´o3¡3?‹¿ørxnY®`Ÿ-"í°'V]¥¬mh.òÇÇ\s³ÖëäCðù9D„Pìãg_„¤õšH.7Lý2' >*Ú×%Â- »•{ô£ÿkÅ;<.ð†³Ü@ÞïÃyyàÁ6Pë=ìS2–ÛL»žÁðJÎ=žÅÏrEÕ¸ˆ—ÞÛUr±¼¤gl±ráá4ˆ:ÕÕÔœrP»h\Ù‡Ñø<'Â+#Ó=kÈǡއ±ÃpÈA'ƒ¥}ÐŽºÚFòzm³ïtL ¾¯þ€¥«Cæò<)à>'.´aújÖF™sÿE˜òµ•–†ÌI4ŽÌÁ¹òþ³Ã)3ÎCéîμXð ÿv×euYú—pã@Çd‹ ü»×T<ƒÛ ቘ•¦ø÷U"Ð<Ê9‘ª¶![šbO!®ëy2šžG¾Eì…½1u0ÎÕѺz9Umã¡ N½Ÿó{©UFœ…,ùÅrä:C{Qý<ò¡sk—ŠÛT`N‰<Åå>R±ñ¬iP]°a1Œ±v+¨¦Ëxß›ÀVÜF{;€Wæî¨ÑÏ,÷GEû6褨9IJ3âëRå6Ýî4éäýˆý&ú'>ëÛÃfc-fåòåc3œË dë±%«³^7Mñm¨,Â%"Íq¿ºóS…O izÙlÃ?»n_ZMòÎ`X|˜w`d ê‹Ù9¡ Њf|%†¾ùèÈáoð=h¹þTÓ #¥ÿžGþ¿?¥ ‘œ/|Vðr¿ËW/¬"WuFì=D¬–Ü%Õù‚fù¯n$dÔdø›_·aÎ…“>kÁÝzL °ÄHüŠœ¨ /Ô£‰@Ë6+t»oý,EŠZ„ãf³²—/'BÆ žì@EÒI2¹í“÷jÂI­ž)©Í®?oêCDÍR?S=ËÊå .Ž@²‰@ÕÎÖjˆÚŸ€Š³a‰†ã„@v09ÿ?*~O°Dñb‰OCVðJnsR>Œ Ñ…ÇN_«ï&œÝf>𺺩Êß°½Õy€§’¶”ͼ׬/}»¡%Öy!M‚ó³—4áÂXâsw“I¿½6§-ܤ–±µ·ÛÛ$û[ý<ßD±Î^2{Áu>œºq¥7uú§ŒPï¢Zb¾ò5"㞪õÞ§ê`ÛPÒ<ÿÑàîSQ­!N NN8³²ÿ¥Rhº¡bNwb»­x;8O¥õùàäqêxpüµüº­3ba x'8QòÎ5 òg»EKÊ÷¨Õ1©á1áèãìÀV>0·±õ¥s¤þ1'ôÇSO¹±Zað 7€{§¤V§¡*Ö`Ù.…£å¡,2ZÞü^L¯`Ú!ñK/Å¢Äj©ñý|p ™ÏœØPkúˆý“nÝŸƒ{ @ÌÚbà‡FÓ+h¡u÷£—×<¯q] §n½¨‘êÑ‘¦ÎŠÕÿtžú{^y~I«a‡ÿõg|µ½C¥öÍû®íWûõfýÅŠ0-¸ìÆ…7S"ЗÇ:=ØoUì3å øÉшU³p4~IÓ_¼–@òQ寶“•ã^Íþ†“ƒ¨Rÿd1÷öý‘˜ú³ö¸Â&hÏï·où'2(NÙ•z)ì¾ÝÅßßR‡Í΄ì~8{KèOùÕþgõù°µ_5P¬Çö¦%àc»±’Ë9;õôZ8uÚìœáZ±G¹Ì½¾   óÏèÿ×ÕX#ÕžefNAVÊæ5˜ýüÈþšáfä£ÎïKA™Ñi×ô¸ßTžÜÍ´áÂ.ÓqãI·ã'ª­¦•[íÛ°._•ÐKÖù›¡Ìï’¾¤0à%¶æÛ¤BÅí¡6…NþÁž*ñ?Ï“ÚN³–zRpb×¯× g /½zͶ)ݬJP˜Wøýi?s®>êïgó†·o•@»„¥Øv§c&1Aý¾Äò NÖRéóÂrbÚßmh¡6oÖ‡´[ïĉA'½ J÷?óC1éâ¥g˜c>¼êîј' ^âפ&OH.&ƒReñCë¹1{Æž—~™·Nùae¸ªù'ƒ«Ž—½­EÁ©DZn ´‹Ž…œrñ"D{åCCL$R£›˜Kx?ýBX Vµ9æžvCsîí8tåžعmqõ2±AW®?_¬‡‡ÇÁ€›e¯kƒÝzúÚ¨ƒE}ÊVÎsïÔ(-üÂh¥d°¢æºì‡T8ŽšuÚoÕ†Çá…f·©OêlÀ¡f!©¬£aeÊØY—nc˜Â}dá¶,Ð*$’òA{oþfqÆágh˜¾Ÿ=˜=çEcÌvC+—{q`oÝÛú,·¸Ïl”|ý?ÍžÚH¥\î”’SÍó<¢áÿ¿W3_áÞc_SÂÎjô éŸd"r zúÆ‘ÿ¾ :Yõ(ø?Gÿ?¯*†²øÎ® añA¾§è&¾D§:»iÂ?XI¹uŠ·JK¤¸ɺL{GÕåÀ@äÝÏ~à•c¼A2`Aƒž9{ÃoŒº“ð~ónöÔݯ¬áèßÍÑÜ1Ãè=¶Ï›\»³†øäÞ[Û ZJæ?±z„Ù;î‰`ƒÕÓ—M¹ªŽFß—ù·;ˆ×º.k‡£çÄáø7Áø‹"Pã/p'®ÃÑæôÙ´o4‚Œ‘]ໄËMЉ£–á¥eØ <ÿ)‹ð1áÂçhÐ%Ùƒñˇ§ÔÚ„Õšª{ÝŒ’þ׺ÿ„ƒï·aašpÙ|)Q½ÿ \.zçÉÐ6¸øx”Û^rW¯pÆÐúså/õ"+N TÃOïœxÜS›Yÿ£1Hb—±TÓÝу˜»át{@3– žÅýÝL:xêy¦AØ~_5ÂmR•Kp¢Œº@ïG¶­ÌqØHéu¤ €Îþ®®“ ÁãJ˜m8)ÛZÂz¯~ôÛè…ô.§ÍÙçÓ( VâdHe}h# @Ã3'2›}Eh>{5=ªðÄyD?ÝÊj]#Ëè: Ä£Æ¨ŒÂÑ]ÍWô±™ÿ»%ÿ·«µ7Š÷ñ_gPˆ“âÇ4¢¼‡,e"‘&[Re+†&{lûÇ»Ön3(½­étèý—W(ä1¤·c¶§îEéÎö'7¹!È´¸ 3üI#ê•üíD-ÁÖö3¹Ó• Ϋ¡äÓxÛ)”àj;“çz@SÆ—eéîrë`—ö~*sжa ¦ÿÅHM®z9ÿö´_©E¢óŸæÿËçü§Q Ò øûñbÏÇ‹ÆÈf¿ƒëlÛ½ËÀ#€uðùȸR`üõ˜FO¥ÏÍ$;÷‡ÃØN°¯>MQPààG×ꨡ^òoÜ9,nhÆvÀ oóгm—¡Ü|0n'¨ òúÚ˹×ißJ×’_€²©n šv„*ëú7RjC…±×j/üXEøæV²îQ¸À'ù5Åí®˜FÀ޾d}u Y{Gx†“d‚Øñf\*kˆÄ"•u”Ï üÓ8jß'vQ¯ÀpຜÉw³ÞÈ®–`n«lÿL—¥UdÜ÷6¨ƒ!cGçR …î\}t0~kõFéÿv52oxmÒC™•\L ãñIÄxÄ«ªýàò‚¥D0hØá»+ˆäfó#••—y>½¼ÿ˜Kƒ,[Eh¦¼çd`%1<%¤øZ%î/ѽHX+IaÎRE͵=õÐqˆê啵âÞªu¥‚‹*“¤£„+ó­óxGLÂEœó;Ë5Ƕó²×ÃyJóX­bcÂ*ƒ!ÓƒŽu4ôG›7NBbp¿A k§Ù9”þ¨=À¥Op;[(ñÓ½ñߊc€ãµÇߣ‡(8’Œ‡d•Ð[úÞHUf¾ðk Ð\¶aòæ7ty;C°…ôÓ1¨KX\­Á ÿÔa×ÙÍÊE×ôßJ Þòy€5Ð…kö' rŽg€Ð™ó¯øú÷•ø“1ª"l{^TAã #²á3ÍþC¬Åç¼}/À¼Ÿ8¢žíŠùùøscå>‡ º¸Û½BT(ÔŒ¸q$¯ Èm>ø FÆšZdÖ H¦ùç“üCÔØöœ("U¼RÓWf\ºpÉ„Œ~`£, 51:7Û‚=¬Â„¹†¼¨0N ìsÒ<Ø5‡¼ {SEõÄø4´ì¬%Á§®èïøÙ= ÑùnCŽb4D•È–þÃ4ŒE&Ã%/_Ghˆ²¥îx¥o¶*ǾÌÄÁºˆ§y´#úÆŸk4æfoüF岞þ>°b6—C¿N÷æI"–í]ÃU0ìº÷¶•TÊ75ÍOÞÙŒ¹"M‚8¿ËG?9»Qjì!WášI?TAdàÊ"õfÙR }ÅAß-ÝV2B´£ãH—ºÀ6Èúç%aè«(õ±Ü&ÝdääùÔÑ6®ÞØW´µäìêûèÞßïþGÕÃ'q¹î^° xy#i€îÿRÎuÓõbWÉÉÚÝãkRЕW‹œ58_›aÈøë»Gšþ ­Ð­Ã«Î¿ä)ýÝÞÑàÒr(Ù‘ªrÙ®|Üѽ‹¢Ú.WBéÍPßi¢¿/½ˆtšRIΠ¦4üçuâÎXÖ…ÚEÕþ·`u ÂÏ ‚i纖õE5Pç7£Rf'EÜ?ÛÔ.Åãј |À¥œ£¿'æŽk%# b–KªIo=7Gî°â’t{@lV±µ­|û+Hæ]ô©ç¯£À½øù§}åå>0CJÁw—«¼ìÄå4o‹.ûiŸaß9dœ–§œ¯0xük»™Ü%—ÜÅmæû@é3xÂÜÁ(e¥ä›ÛA„­3^w³°´«ÇK‚vBI*HÁ/ÎjÚ'˜ÂJ¾D†F/ ¸ …§‚!Xùé³H6k|ëÌlM ì…Oä˜F"¬‘™òö«Ì߸FzK‘M%RÊ=D‘³<©QH}– ¥õÅà' ‘ã}õ‚¾Âëâ…`¼Â*%¶¹€òk%‡Š~ViOßø’±Šh©Þêè3[{|sÐ{±=`ß(,`=ì¨a‡óš·dÕ"zå×äÁ\ÚÏ,ÿ e¥ÐAÂÅ´<È‘þ|ýÍ*"K›9@ûktÿA„ŠƒŠÇù¡kÉ ¹Þ®"¹8Xˆ`‰ xÐ{#.ƒUÊ›R­°&$×ÁZC5<ÉÀŽ ]A<Ë‘ÄÆ&Ѭ ¸Nƒªþ5ú7ìXÖ ï”÷:À{˜¦­zß¶’Q‹Áz>.k~Šo4[°•Q?ÿ yTŽ-~ÏÌr&ÈG?º pýÙžYÇ,B,ã^½Os®Á¼ß—ÿ&^›eú\÷%{÷£*ZÑÞS?d¬þ¸Ø™þ´ÍSúnÞ¢?жV2Ft)RƒŒ2> Aíhߺ‡E,䛦N¿¹Š=¢%hé³1à÷ÓXÂåÖ@%ö—w­ vk·šŽ‹¡Øh¬…K‹<ÜæNaÄ[þ•-uÖýì`O½qYèY<Ά$þ€={Ûæ>§ Áb}†—r›Ô÷Çh¸Ú|>ÐÊÌÒÕïq¤è Ò‡Òj] 'IRŠ©qT{\'$ÕDzÁ}JâËC˜Âðɘ¯Á>µäJ5ó ‘%ñ[úÛÞÇÛî–ExS¡_á|üöQ ØeJ×~#. ·kÜÖH6àÒÚQè{¶E¼ä4&Ûì]Ñâ‚xšÿ§ÿ¾šõËdJ¦|Wã|~7“Œb€²œ¨!Éü\B84‡äPl¸µ¼\Iõ¨Á´…îŒñ5®±?Ùjˆ~àJ;{7ruëÚZù±WF¸}ùïÚ¶=@wÖbqÜp¿—±›¹=ìJÆhãÛÇPíÏþžßÖÙ·`b!cûA‹(7)p¹Òßåk^9Û&üær€Á «p‚Aws ÖäÊößjØ_¹xçàM…-˜j èø{¤{c¡H>dÓ5’y 56ôìa²ð‡%þö  oXœ:sR – Ç}ÄZƒ{Ä&B*u¹‚v={ :h@m¿Mt%¨ÐÖ:46Æ?[.$ƒhŽú¹†i¦ÛÕu.gÀP»J—<©ÁÈ%⢿/ße8$ !òÎÛÌ÷2±ï²Ce‚Ȩv-̉PóŒ›å^®¼}˜P²C[qohZ?ÉPcJã:µ=ßWWÊÃq9n·Œ¿Š¡Q¢¤Ðõ7ˆ¨S —îÑt¿§(Ïz‰(WÔk0éhÿ=¬Æì2¨Â¡`ˆ(V¸/Ζ¯ÂœE©’ÇXjùþ0=€:I Ç5ëˆ3óÌK?‰Rµ)ë® âÒ%•ñC:«^ÜÞ„}}çí÷.iø®ë· -ìre5.ßÃÄSÖÃä)ºŽ­ñ±†ŸüÎ7{¹i>¦a,KÇœœKm×>]L™6I%¨˜{PÈ]½BâC˜f•z$)ØIxãJ˜ÍŽ@/ÃiU³] ¹þzó¨å³‚?,Ž×ÙF¯Ð6õF\:wÄ%cÌýt­p<$UàÓ^/n‡óë³MÓýÑ€Â9-Òwý…”üN@Q_¾YgÒÊÔ^¸Z˜S¾¾lÃáò/!³XPç/&_½qkzÃêDÈ^#o¸Î™ÿ¨rΣß/ï[ìº.¨šR¬ †®žÛ|éøæÁÊ„ü“‰ij?÷›b=½åmßýî"oþ Â$6®Ýyµ¶¾¨9Ê‚¶ça5¾>¹æßþ‚z ÔŽô2MÔ£ñ#¿ÔâF±ò}ø|]è]¹ˆ"Œîgàn¬ÒL}öóclîô­9¦:‚ÎçÉ ‡„—º» ‹R„áKù”$lÍal^^rlçLôhÐ ºHéuÜ'›î}ÿ=xð l–"ƒ­¸júîÛðwNËmÝ}'f2\æ½ ÕÆE·ôbV„slZäï<Uƒãv‘“I_Î[},¡µ{$úVššsC2åÌ”½#m± Õ¹“¿(µIZHãDbY É·ªñÈê04cwpã?ibçáÜß’tãHßßG¦QȪØÁÊÝ€€ì3/Ù_SØ$(êlÐ8'{Ì\ª[ü2Y¶PLvb¤NHKË@iˆÊ1,Y¬ÿDpmg òã%í¹T!Îgƒ–úHÇC†p\¦hçrÖû«K+Šv×ã)_á[8ÙN×Òí¸â_Å-ö¨<›½²ê\n |ÒGùB[í)ø5æõÁЋ{{¿L%^5²"ßï½Â‰{I>}•=÷®ŠÏ©ëè\·CåqûØk/Ù¿×ÁüHêǾImRI|D ºgü™5_jÌž6Nš»›°Ò¹KJ ÅŒ^~«DîØÅ–€É®6ú‘2¦Òý¾»êrD^µC+Òmãî«"x}™ 'P‹côí6ÆŸWû|&‡R]Ã×”šÓ]¥± ¤È”ó!ƒ ¸¾E€…ðõÑÀGß0„Ë#sE8ÿç;RýaÂÊÒ*GÚ(“ú““vQ6çl"Ñ5”/Ƭ‰}ýøÅ1CÛöâý½‰#ì ‹5Lë“­S7OŒÜ”E†Çk1™Âÿšµvç¡õvÇCoÌ©n+û§ùJuÿ[l«MP@º£g¼—|¯RêÍ7²rV¹±JØò±„ËÚÆ°ÞWÉáÇãepq5hÁ1j,ù9"sàñG>ÿj®î]jµÃÂquðàUUE_ô[ÝylDK—°Î0LL·¦ÊšgK-œ•e¶XÔ’ÊÇ4\Bk=ã›΋v¼96°ƒVܱ)Z7«Æ¸æ}û¢›k0ü ,¢¯yÅÕ*Àúe³ýåÝâ[Õ¦›­ÏŽ‘ÄW‹¢UµTiGñ*r\…eï¤S¾ïÈLý6¶òg‘zÃIç÷ÊĬ8»©e}RÜð´ÆxÅ„¥Pd–v¼5gFíIäPÎ}=%¦õÏðKá†o 8k*ÿò»ë—ŒÑ')çN. ¶ÖÓ>xUwö‚ÔŠ©o€øÐÈO–ùÀ] ÷C!šßC]ƒè±ðäV½µ9¤Û1±”—CÎ>Ô'v|9}ƒ½7ÂhîM-jÀùW £âP¼î°j2Và·Sû¢÷ÐéAßDò·å¹Â²ÇÖ±e 3`—’Íu÷jù V$WG[xùb 3½{‡!cx2©öú†ÀD·¾F)Zvk‰^DŽFlºË5 èWPp¸$)¯¼1×çÉjÙs§fþb +½;R¯(éÉQ#ÁR¡²¢šä\úÜ™ÎÂùÑInÌeýTOƒðü\ƒ?cWÚb7z 2‹fáÉblw:$VðΟT,µ¦ ªeÏÿRÞc?°yÕëc`ÖøÕá©ã€RôÇä/²GEOŠüTN­ÁÈÇÅžw陹pÍ\k· =èý{/‹3×ÇCæ`ìÜ1]Š€¸ÜÇòb¦sÕ0'=xÖ™ÎÉ ƒ D#$ù; út¯‰÷ÛuI Åa/nY6[àeîYzC“ßæÖ2)F¯ºX ÜÙÙ×Ï»æ»x­ÁÀÀYn++̘ÌËSeB"Ÿ\ŽÉ©ÇL¡Øþ4Oü6Þ™»ýÕûcÖ«È›ŸÉ7¢öêC%ä[¬Ã㨇•W!:w¥Úã^ž”û¨,O–­ÇãšEœÑqË‚øèm@ibeûôðìÌW ;#A,2¶NYŽ%9³ø«Îû:ÖÞ½Uö9ø°cQÁ¯ÑS Œßä[ ½]?ÞßT›cù.,Ý ó>ÏkaÿŒˆ!_NX¨ŽŠó…Öàªþ“’ȉ/=vfÏ_où¤=¹Ù9+¥×éèõýŠnÐà¢CœûÞC¦7·Ö¤£=Û¯²Û˜Ý?ú>ùu–­“p±†z˜‹´¬´˜´ãpGLyÿÑGýÅŸÖËòÑž €]F–%fû}‚ñ–¸‡Òƒi1Ä"HŽ-ò ø¤•ÞTb]N­ÔÂ>n¿»Í Ïúž2»P]„n{ï‘*ë±²œÈåņæ[C?}¨iáR¤c~‘æëu)îïÛœ]«AãàšzŸ”{¨x§±T„ñg²N8Zkû ÐzS$…c ÂÅ øñÚ=[¤wZžÊ(l#©}¢‚ÏðM…”B4òÞRξS̪ï`nâÌÄàýog¿—ÐÖ'P¡l¤D›ÚE‘¼÷ÊæÊf÷/º G“õ÷V*ZàK#"ýÑ1ñ*iÏéuC63¶5þ‚$â¯Ëaè'E¯3 M³G„ËPÝ=`V)·4©¿r4Q¨1±ÐâþQýÿ37ïÖ—­‘ðXÆBƒ»Qí‚ø°OôFVn³(½¾[3/”é!}0f Ï¿4p+ȲŽËÀ"±™l¯l"“Sp‡Çhô(¾Y*öîüôAnH= ‰3Ù}ߺõ‘p¡¯-%[âs4ÐÅ|Ù£ï´é¬ *ël]¨%Øu{yËÈcŒáÓ¹Ô©ši‚%yç!Ö—B¿}/ ï‡7½‰>Õ Vº†VÍ‘Nïv%äÐ壿UDæ‚Hɇֳ @Oý’^ì'ß“8*Ì"ÖJÏ'"}ó/ Û½Wtâ¼óR­ öQ7 Žáûÿõ^€z-*•ÙÁ'Ëï[HªÐÕ7 ¥z%Ò½uož·d7äE·Æœô›¨Ž.Ð †xžØÎ9<¼ú©ðÄp1ïF“í‰ä§ú£[ÙyÑÛMkQ%4…—Z#®»ï\1ÆK‹j¯©»ÚÑclX&ñ] D½ìνäý«áÃÙÙc?Ó8?|A,ý´Û2ólµ ÝŒ%ãB‰ïÐú&o}ƒk®Èòyúgþ)Š`]õ‚vŠÕöP½ZÆÞƒ Œ®ŽjÃU¸A¤\’ê?ÙæïZRÞBM þ¦3ZrIÎPWëÔ\šÚõV.Å/F|f¢Œ­ÚowÅäPmnØ „,*iÑùngÞbo5l­÷!8åN \eÁÏüÓyÝœ¾£ÍœžQªßÆü =Þl!‚ê,yì¹HÑy›å\"Ë«J–sR›UÇÁCííŸ64¹0A>´|Ê.:¥C.çšÄåÔ Wa“2‡ÃT¼Øîì»P«-X·s“üºöŸœ I“ù;k"Ðöø~×Â>7V€õ”0#>ÊP1Xmu%cˆ,pÁÎQJ÷É@'¿&ög|iñ¥”󳦬ÚñOÕ:ÌËüÉdü䛉lvèè6lUàñ»¬) ÕSÍÇæôÏ>¹»í¡jПì©b‰VÙ[A„bžLÍ‘‡Œ!¿¿©]ë´PÙˆ»òæÝïõ¾/b.¶G™’ž>Ê|l½Üå*¼Á·åÑG*•j·g”éÿ`*ÙùûxWï—n¯»Í&·"j)[.b¢6¶gPT1»ås¡H¶0Eì4Ïo^ÇY#ñø§œç¸äO \³ü,œ¢ö'“éLo~îÃËhNÓn®Òl÷¾]úÌ ÚU¨1t)øÐÒ}z1ê à…8£‰õèü¥ Ã~ÓÜ}î{ƒÁa$´ð`‘Á¼P÷BwùÞ]oëŒ[_—à~ŽH²4{ÊËûl'÷OÒò¤‚ZÍAà«­ÜÞ[èÎgö‘1ò Ýòl!'†Èßž´@=Í>ëOž ©Ÿéß ÷àlZJé·ÞÙHØ18ª‹¤»y¨ Gè±–òç|¼IƒÀ¸-irßåÒ”°|oæÎú÷3ªmÍ ýÖäù—û?ßEýîÿ4ÓÌ¢ÔãI£Ø5‡2‡B†œÒ^N0¶ 5ª~×–ÛA®9Câß·vËû½ù}æÎÈ`û¥Ï´µå«2šøóïý¼žŸÒuQ¶·5Ë×D§¿höD%^«M.?µ”¢Ttdi_îÂñx+ r:©$öp“®§½ê·XS_érççµw åX^Aö’2Kp—0…zI¸š†êFW! ãi¦‰j k²gTæ>pÁû‡½Yù‚ÎjA•\:q<éÖ¨òfÞöè_{ŽÑ‘¬y öŒéëÂà¤7Óš,3Õ‡ˆÜÂ)¥;_ZÈÙΘ(DbeîrdÊgø´íq¿³wŽMÞ*tl{ò¢Û¼’ìî\‚¤Ï¼LˆKªzÚÅØrÀó‹q™Êy0È‚ÁD)Z qßÿE͘‚@ äA™’êI/G!-=¾ýÊÚ‡K¼[0—È]àÚ3¥E˜ÊLœÕ¸P &}GkHqcä8Žm œ? Aûn.vŒ ÒƒæªÁ½ü1Ú øâìºòâþ…轘)å@×Ö°l#®ne|ËÇê¾;+Ã7ÛHòPAûå?yד/ ïÅðìð…¨Ägì—ûJð`{S!1ŽBÂN«¹£° ŠS Z}þ/q¼˜Óµ¨ï¨vËÈ!†Éû>>ˆ?Úwý®Ogå¦Iå,¼BºÃU–¶ô„-X âòÎZNNY ;_OÆÁñÅ0—ú‘#YÀ!¿v®+òN캀B d«­Ñ;ö›X¸¸ôÊo ø,“·`½_kû£‹•g”Ýœég…ú¼Á¢8vÍÚ™cŸæ‚øˆÜ\:w×™~Ü‚x¤ÿ{Rû-«5ñ±}v }þ‚lÄ|-öG±—Ãq§åûûYZòJŠl~ tÇâK‰:q%_-ibhQ÷p$’kQMv(ë÷„ò´R»òÃh–«¿$4¶YäA O"(¼Ð?áf¾ÌÁVlŽÇ˲§áó ´»Ó¥ £¦m»¥”eH¡ÎízúçÅi€AÓ‘aP}`9Uúdôñ/@º–õˆôËæ‘.í›GH²¿*W™Û‡þsøÉ±ºÒé‹XfÞã|Ãú'*³fHßš;ìqò¦†š˜±fÀËêû…°XåA+Œ®–äŸ|{ª˜»SÞ4¿L*¬s~ËçûÜk˜uéOîÖWÇ•Ø8@?}5a—*”)ó KÁBX=îk6‹ø]šøHà ª#é7Ü~˜´2Ck^úu£æƒçS'Káٿb™Þ¬£ú$ÚUð¡\ïM•š¦m?¿Hp^å€,½çÑJL›£…,HèaŸ:J]0s+øS÷æ†[ï(Á©;D[Ï%–ND: ¾`Ôhv}Í›Þû|¦¯èüæ!œ·€‚«Í©_#˜ž‘L-8ák<$D`F"½}Wªqwï‡åµ«WÝšïãŸßë–mž¹Òš]v:bÿéÈ-ÝÔÍÚa%v~P4º°MAʸ÷WÌ#¸“:¥Êâ †ø2$%š<ì0bR1†Ø^´€3ž‹ŽÝõŽ}Gá)ä»Ê¥F]bÊ#GäîïIG·G8³ÒUCÕ‚àÑz¯BùàüéonÍÚ;RA6õÖªdÏ4öá’O?† Wœî×fëk“ÒǺÀp>²Üâë-EšövZþêQ”rýø™X™çÅ ùŒ%[ÅúVo¿à#j°ü²‰­6yâ›8Ù¢•ë‹9Ùµp=ó¿q}ù72Y¯+üfÇŸ½YÙ`d–¬Ç¬Ã}бd%(?ôz›±ºA<\S¿0ŽœÖ ³y;”’ZÙó¯¶}w:Ï[u>]prïî[¦:É÷4¾”æyI&žS„vÇä”[^UµÜÓjîÖv3ÀÂ5i~Î ¿õ{^ì‚%ŽÊ )n÷Ç_̲dˆÞz„ôšúX\§“-ñ`œÊM<Œ¹”Ý,¹HçÉ÷ hœ!ëŸÿ dƒDÙ.ÐÅ-XÉ÷)dûÝ3ú¬R =n^^ù0βØÂT±Ë9â­Ý¾ººAð´·Ò­ÜLrHUA£¦,+gÑULÚÿ"XFà¹n¥½Âº²ôËa7úî·\Ñ[²Šâ8T XЖɱìNõ¢À0É4ï÷‰˜¯œ6aþGL¼A•€-6§Î¯!Wr¯Ârëu›H¸ŽûtDù}ïëØ¤añ Žî¯äçcÄwî…Œ(¹Iˆ«BP ˆ¡5!ž7rHJt«/œž˜þLò+ÙµF×ÂKSsrB¾u3éž§3‡FÅ{ˆÎÕž^½›xEϲ–P‰ †ø}°ö¸ V{±"W µ/ÜqHUzzšüãÆ‘‚ ÖM.3%÷%I†qûŽ µ|öYÚ,#ô¦‰c­ß•,ÖSèÁÿK»ˆu3JEÈáÓùˆäZWªšþœ¸E޾Ý]E¸úV1ÂkÙ—wÒgÑ#ud+]ec,Ð+À_æÓÁ>5µ5 «ø‰êo»])çìa$£…¤:ÑÄÏ50ÅÑý®½b/¹Ä´Kž²’½y+Ê|¼´¹œÖ‹?’\"ÓzIúšÀÉZáx5~¬¿\æ‰Ú`C¹}H=5å1x(Ï9¯uPȆ(¶ÜöÀ£ó‹F1Ô´¾Šä¸m”ïØý²p.jF¨4jè<[ßIîè»1 &þ ‹ìËxekI.‰>XÒëóá9 Ìfo(´#ïúçm½–:è’á‚ù0”~j½Ë Ó̺ù,ÐyÖ ©õw°“f÷VªÙ¸ËŠÿQ´Í*J¾½¡2âZâìlŸì<¤£ŸA!ŽÄÍœîú4jE>×î†ôÛ‰ß"†ÿø!êºÜí*lL“¸i,oœñÙJ«øÏÅ#,Çæ`Œôh¶íÊ;ìçæV er.C„uOõhõ“Lºç§|jïb øÂ…±ÙœµÅ¢¡`1¬¿ÔÑüéíìæêË(¤ž=m¼·h±Öˆt»+À°Im~Ñþæq+Q£¥4©·.’F¿âc« ÷ùËÅEgu±¶X¤FBˆó…ŒHµç&ö«Duïۮ΄¾«ÊÛ?_ƒããêu-†I¡ˆ:j¡ãô‹™`U)£R,XÜÊae¢u§í•9t86¨d©-”ûG¶oqüâÐöè³ï¡•[z4SAEUiô¨!]²œ¶ì¢jÉã¹s´xµÆÛGÀ¬S„{éÒr}”ìnµqÛyU©Ñ6©ˆÔáFð/‘åwÛèpqŠýgy;üÇWÔoÊé†+Nxá­*-3êµ_ Ú™¢›ßª_~C¥rŽ}æß2€Z‰úåb¢œ±4¾+©/×ȯ ºî‰B¥'“üÀ>ÙâÝê:Wiö“…«ï^ͰuÉÛÝOÚKl‘š¯>7þ¸æúçÙS ÓÄÐÛmk¾H๹‡n ”aD’ÁÓµ_«*wFÁÝ>T¾àŽã0Mæ¸-¥-›Êw]›Öë^ì¾SƒË"&?IñaíÂìOIgµƒ©t°„ ç–¼ˆg_{<º+§ýŽõbâèbz}Ÿ'~ª–Z¦=I!JIšéטz~3u‰ÿ~íx­¡ëà6ÌpdðÌŸeÇ,Ùþ{Q'N!õ2Ü஼f[”ö‘êÇó²d±œsá¸ÝŸÃ®ÇÓ‹u»"çkàµ{OF*fB5Bèeju5Ú®’ šD@6%ºfèAÉMæ—7Ã$a-µsAøOÞøiבßß4ë4$ÖÎP§~ZÒÃ6ÜUs«!Á OÂ'u£šî "„ žIŽé¼6ÆãÁ=‹÷Ý‚NÙ§˜5xWÑwðº°Í"ʼñ!ÅCTß\b…?ž5­~‘fu–kEÅÜ´CÉåoo×ÂÎAú\Ç¢–ç.lT[ Ž¥#ž•ùC|½1€-€‰þu5îªý×[_oH-•å÷`|­ÃK_‹½nÊôwàpÚþ¾=XË/sƒUpœ¼.üA€\¢ùzõ"|È!Z€žÅ]؉)¼»ûG¸ø°I©·až^^ü^?Ñ—5MrX¸å¶ìQŸÏÓ†ÏÛãÖ6xì~áÇœ%ñx6ж.d+‚}ÔüõG+‚š–eè,Wò LÇ‚I¶}Ê£d5°‚ˆ\r¨ 7¡…¥¶ëXs,¦ºñ…בþ³ÛUOXN'òÙyh¤*Þ¤Æ ?‘J¯ÆýžFBµS™æn ï±ä¿¿äúü%Àc ùЖ Sˆ^X{à³m`½ƒä«ÆÝ»(ÂnSó¢Õ¨ø²-²êT/I`©¾ŽR¨í~Áà-aì­dlQñ¦®¹Åa¨Ê êö<>ħ@:MŒ¿Âå)Ç6Ô˜àyÓ9¶ 5Ù¥<­¥ò”–'›)çÉ[C\¤4$‚õ«ûèÉé_ªÙòÛgóõwð¶ÂLïûž dÆèÄY+µ³œ–’›³Ü'ð¨g! /&˜Ò\ÛFI·¢DnŸe*µw3¹–Â…ò*eåÿp ÃñžbiÈYÛüÔÚÑqÆÌP'èxø|Û„h;i}è:s'ÙÖ™×éFZ0ÙîxsüyñXóC÷ש_º›ŒÀÆXG=äÈñ°t]Ò0¢U¤Š—ÖK™évŒµ‹@å®]Ÿ¦Å>½kÜtªûÁkK9p'Æw_Óì˜G]Dãfr³c¬ÍÊ!a#ÍÏ÷Ï‚ÏÁ·Þpž„¶{=a¾„±ýÍùI²î׋Ϲ8ÅÒï›R}Ž‚éÍòPbÄuÚ«GW¨ëìÑ`›"§7A3#ÁϳVWîu».Î?VÎçàq®bþk°mÈb qx1!ØŸBþåH9íÐ+.HÞqe#káÌ÷m—c`6&6ªò¡n2ò…“á”óa1º?œˆ$U7ÒD?•mÕ—Õì1ªÓ_t{àž+œ&Ñ!M_f—Z¹ÊÿµÀVÝàGêÝÔ„:ÚÅîaýu®fðd—k¨Mž¤ˆKigFܑѸZg/ôz“ŸlÁ¶?™gLLs¿Ü§‰õ¤kpì ±òH.-K{ÆÑ´w=áVíåêµá…£ÇŸµ¸®ñatö9€ìÕï ]¨`ü/²1q÷ôúL|9:׿þÕþÜæÁgr£ú}az'C–< 8ÒÄZEt”3…çaUR"*fM~8Ýnßíõ¡újÎÆ•#'~#à¯O d#ðÎ~ËkMß²Øß\ø üÈÐÜ ½Ñ—.Ta `2y×ñd¾;†ÚF÷hs©”/HYB¡ü*?°B?µóz ú‘m¸yÉ;§ž8•ÝÀ#×#Ì{½tfo¤–>厦ۺ`y€þó-ÖÌïÎØÐÌ5˜ÍÆsî÷Å’µ7î´—^±*º4ÿ{ÉJ·/çþæÓ|ä. Mᤱq|G`¢žÕ¹sGy”žöB!èCi3ÚA&ûšÃ…ÇKöÃÄŽM®\â }ŽrËá4œ° -qþs9ü¶|zSñÍÆ˜/³&mÆ£.ÔÑ%g‰È[Pxˆ9œ,ÜÍI˜9ÂKú|ÊÒYw¡ƒ¦’J©ÓtgÄ«ìs/Ì_ dP–ª¨qEu|­ Zy¬Ô¨ü€ðF!—ìŸ'ƒÿ }…ßúmkIßGœÚ‘Ý_Þ|äù*©ûóHÿ›ÒѰ½„ŠÁ¡lfá Â¡i®–ê5Jk8@Î †2…¶ôP}³/tÞa…^θc„’ ª¤'2Àe4Êòz·åäc½¨Wû©¼ï Xð¾8R¯ ìÏ‹zz¨æyåkeÚ¶”Õ?Åß/\š#·ŸIk#ÊWÕü¢|¿0q @ÆàwÉoÝÖàǼw-0…ßGÿtýdݶí·ÂØEµC%j ä—U7Œ¬–Í \y^IþÀÐ@·-¾Ù¼î¡¹åÞ1à“ü?ÅâïQs¡ ê@ß¾;]jWÐcŒôSuöá^ï;½Y‘Ð2í¬‰Ó7‹ÜǘX4«ïÞÚpÂ)Ø5ô΋@¯G"ckñÚïˆà¾^Ön¶By|ï=¢.!«oAš~<óUZ11wþLïB@z‰«üκ ˆ÷‚¨:LÈFžÐàd¦Šás:ú“ —ÒA Ù†Aèîé}÷fª,† •;¤%e¥_ˆn}p=Ãk/?ÊúH’÷îÏ~úáâ#š”ù¾š ËGœ¯ ©sR`Ly‡hw¯Íd¹²¡ºqI÷„ð»xxéÃ’Ì×賓_ÇÕ B“/F—®ìÀ3‹› .£„-ƒKÀR—¦hìjÅOy>Ѹ±ƒ™®ï e® ´¿æd‘\³_ÿ{Öäº|~SæÓTXÃŽ›Î ÙËPVÚ)lN•Û€Îîé¾ûZzûÅD;mm[Ùåâ~}ÍÒîmXá!QÅ)ÅßPqAmKXk Àƒ7¼±ŒVSõ7º`± HªU‘%ÆîÛ} ¥ãh¾t\AëÆ%AÕuDVbÅŸ“5hÚž¤¢jjOÇîMgY·® o¥øøM>©!}÷úâÊ–àÜ&tÕÝhLC3J¼€èšŽK’é ö<è<· ¸gQýÆï½RÅ]ÀBÿ}5é£÷£‘~ò°9#æ²5Eè¾Í…ôÏÁø½«ú¯ƒ!_z¹¿sÙ ²ø!Y®íRRc*=éþDAñ*"¾Þ|§¨ôWÒÅ‚fæøTìÕ‘ FÞâ°yÀË*VÛýÃEP«‹o*dú˜=jN À Æú”A*ñ ªqG½'#¡È~Q»uÑ„èÀå;¦›×£#eŽSR{ÆbrI¾M勹b8|\OóŸï¼¨Óù@ЍÌîd&ïŸÏëÅôÁ|Ñ„‡êœ0E•>$ŽW‚­^òT˜¿µRćœ§ü¼ÝÕ(ùöx§‘r © Ó'#ä“ÀVºØ«Éˆ†]ÉV±o[×+1QOæbk·—̳ñ3ÂÍ9ºwkpxô+¥!IkÊNÝ‘¤3=ùBíw_ßÚ<ž =Ý…”< Cؽ9 µWÜ¥h,Wáâ>Ò…c”§é"ux Ñ«Á7¼žìÀø¡+Ýûfá·‹(bvf@8ß3–B/¶áäÊpûú÷‹fæ:CƒÀ´‡^8uEØ]4)'FZ$t†8¡¨Wðgë{Œ¼° zË€7Üv Ïs¶Ó3¿tRÅGªéýû¿°s jgŸß3_ðTè¢u¬}¯qÔAIa³82ÝlÝWÚr—ü@.³ä®`ü<Ó2yÀ¼þÌO¸¨˜î~A`£6(¯²h=¦SɲîÛÔ°Fù¨žE¼¦Ì.šNºÔC¥¬©fkyÿxÀ·hó<<Ôå /Y!KRÒ_D-„µvéõz™¥ :¸Ý#ê&*™þìðøìôé&x^>8±Þ“úÑ_+òã`ô¼©O…EÅŸtŒÆYË‚B »–“¯[•æ¤û×.ùR¡§]ÀuâR¢y£Õljß^§g&¼ýýåsWÏ ¼hµA«ú€þ±ìÀµÕ÷-qÞy¨Î<ltp6…3U¦c¸zÛ ú^o²ýªíö£%â3ͲeMqSN 4~Ì]ï0©hQnÔ<=†c’x_ ¹£L~äAl ',ߨVý¥åÎvú«­/¿+¢z6§Ü^A)5Q¨0X—K´5K‹Ÿ\í¯ŽFlZ€&ß½#c2èƒÉá‚ኒ±Ëu>…§#ÉgZï:IU3àä°Boù¡ª!¶Ê…”]û­‰«W;XÇpSŽnw•üù"\7ÃI5†Ë¿Ž QØ@åD¿ûh czöÛ’ò²QÉI¨Ë¬ÓõAÆŒptÁé!Üš|ˆ4ªˆÌÉ%IŽ‘J|3Æþª¥û’Bœ+‡Ò ݶÄM§Zb¶ìÔwÝ—ˆD=ïÉ7×2r⟶ƒ‰U3.óýZ©T!hùã²Ö"Y¶ÖòË׌No|ýtf]è´‡¬Öw¸/EÂ^eÆws ³Š·ÿ®eAŠT–SÐÚmòãÈ%Óï¶¿Öþ.ýë ’ù€U’ª› ¬lî;íæjÉÑ!žQ¶GkI’9>vçRåu­X½s‹§²ªhü.·YÅšþñsŸÿÝõ-mg¡%uçÒ¬ܦ/d¿|²£Åqbè¢ÄÞúp’ ;ÐŽD `˜N³g²(þ^ÊOüþ3TZ¸&ôˆˆŽ„f[;=»¼Ä(IÏ… }÷Ç–år=_ÞQ^CmÅ’åÞøj…Ü|¼uê-S-10%÷‡®£Ä­Œ„®z›ŸÔšÎ\ P$ÜņŽH|­V¤§Ãb?÷þr¼üõÅ8Dš÷Iä–ÝCƒhª% KÒ£íÙ™F¿¨K`ŠO®‰L‚’Ä®¥~{l#N‹£r‰ºÙætRÔ4#ä—yÇ[x‹bÄ YócÔÛ{¦¢GYÍ”•;p›ŸÄ%›åæžC câý}Ít¤[~êÃWÿ6õ/WîçÝø6’åÔŸµ`.ŠC6¥?ÆQ–_RÌw›åáÐ.Q=)kH1³P}÷“9 ¤Œ¯Å®¦ï^eû80B[~rµŸhEoSú݈A÷4o'ç40ˆ@å·©€ÒÕÕ$ÊÙ[ñøÀ.†5Ø(l?ã¼S¸7| fñ÷¾ªHzý®+°¥ÿÁÕ gÀF±¹Dÿöº’‚-s"gJ0ð¨yíGÖ}ШÕx¬†:I©±ñ'‘ôQöõŒ…>Œ>m÷v‚€„ºt£BCçæÌÃi¸ƒQ¹Ç$H ÎDãHº‰`©?‹‘A&ù9Õ&¿õÍÚmÌcýÓf“ uròŠ@â·}Üf>Z¨ž‹‰Ú †Dã>0÷Á‘öžK?7 ´*–USsíÿѾƒËv-ì×P©R|ÿŠÿPñ|T¡á+:kLwjãΉ8Â?àFBïäæO’3£U˜Ø@ø÷à ³7~“ ìIgù@aĉÈÅ$^^BE8ƒíÏÝh$Ã/„¦<Ø­ Ä?Ä;Rîêå(w Êx­¢=®kP^*\Ɔ%KCß‘ÃI÷Þ¯k‚Ê#ã×H#—Ús‹?LY€pVsÝ]@íVGJ"‰+Ò Ÿ›ÛªÂÑÁAŠ[ã.k$·ïÇRIÒ~Ê"`dëÕàB5¹‚®«A~ã=Ž\;úU å©E¸àë Ï|ï•6°2àw]ÜØLÆ44¤¯™í@[Xó‘¡<\Ï=Éøîü 4WZiiH»ÆÚk† v[¼ÉBxúXú8£t•Ç-†³Áp.BïbÔ¹=@FÅÚ_¢¾zCŽ#4)­z)™ª›·µÙ4Ì æý{Û0|^ʼná1QÛ°ÞÍÊGŽ­@€¬% ej7FRº±šø¨oäÍ‹U<ey¶k-•E8ß$ð4X½ÐëØØ¹7= å“ßËÉ‘‘öO:éÖ\kÙ;>Ïà-DÀÆÊ=Ksƒ‚*¢]¸ßÕí-¸’x!& EÞûŽ*ëô 0 S{„Ž#_~LQã¶Åo¹^S~[Àç^÷ø0Ån"P]M¸Ù¾»Ž †gßdÐC œ{ëT¢­—fح郩‡z¥y3’’$Ièh²0´YÏ€ŸvFõLKÓ|¨êyüSžO(íͤ…ÎhS-«&µ<¸Í–}Äþö‰X $Ü¡ç+ûΘ9ž”ÿôt‹ëœ[Ã9éJ*l ãÆ44­|ÂØêÝ ‰x*,Râí_dû ׉f ›2ÌZOò䱘â˜;;xYøU<ù­=¼•§ÜdŒ›ò Ÿ‰¦P½\‹ö†¾Ú‚½áö›7¾ù,^ã³þÐÇêemEæÞ„ÎÞ°„5=¤(•§=üNq$uÈÙ`,:f.}‹±¥GãbJó¶Ãç\Ò×^ ¼ÕÌ"ò R ¯Â'4L‡AœyÌb )s zDš$fùC5‰!š!¥˜#4jõÓeWFKrÔÞ[Q:ú·+¯ƒñè1æ*PA84£ya¸¼ÙÜW8팜ÁpŸû@Ïo§ëàŸ–y¥fE–sF©±zQ×1z†H­/µîûzLµTFḋ'ôô¨10Ì\@„¿°`ÆrnÑ´f{-9Kœ~§QßM¢–—{DŠÙ¾ol±ðœ¦Yâ§ë!J>œåêv„sµSßíÝ*œ M ÍÖ«!ÉGè*AíÌÇÉoÓÉèè§Ȳ\»Æ&P^U@&O4‹ƒ^R€ŽÕ$Y3œd2v­Á=l=q·o@ÇR‰Ið£Â½fB(’h˜5† ‘#_„ZäqÝqáîüÃt»ñ-&vêŠ(˜`¥0àÔ!=ÓLÈ=Ù‰ëß(¿*Bêï–i‡òäRqp§‰ïÜ»|ûóÛq0êkvÙçöÆmØåNýeB£áåÓo9ð¦ßQ¾3¢eyQCj¿úÐ5þÍ@(8ÅØfÛB]v`þm;¨¾¶e‘R¢hj© –vºzžÔᔡP¤¨N‡bÓctèR!ÖYcÀ×vKS€ì,°Ëf›Òâ˃u­Õ•àUF7ŽcÄv„AɨÐã‹‚ÐJ¥ $6’3Ç4®& JM¿î6ˆ·Æ?Í¢ÃOósÝ#]«Á­Šü> /=kqÖ€?ËXG–½]âñË“òÚQh}Õ‚¬F3Qyà'­ÙLéFÐï€çË4V–»n±µ®ÈOü3ø³ž_ÍŽßî™”ñë…gÝ(Èë5‹@6­% ÙÅgy ÷Ö*k_zäÛI•M *wS0ì² K‰ühŒL<ý³ÅÂ5A¶8Š4´ d¶}^ySKøèblÐÚÃ<Þ:íˆGGŸçøüvÂ?½?~¿†•úÄud|ÇóŸ\DÅÊC€Ç½ïîWéÏFv^“áÏcþ®¥޾Íe޶ai¦ìG¬7>MÊó.F¼(T;sŸ‡Õ•8(âDfC©‹çζ´jŽf×Yù²wbôøé©3j÷€ŒÏ_%îÓCäØÚšRÀ9üx÷Y f‘((Y:]D‚'Qžçª‹U™™Åÿ,œ’xð.R•/c~ô“› ·?v‘8Ç×`ºñ@ìÚ@–‘W ,¹à\Ú”iMÊtÀí (ŠÕ‹4ϯ—OŽT?c€X8<>ý^ßlÛ@<κ!•È+ó.ÛN%èÈ &錗Û/AwfÁúÏ„c»\Ýnq Ë¦öª$2ö$mÉìüZC…ûpˆL‘Q_Њð†—.ùH•Á+´o%|ÙðçvL_SÒ¿ï/˜/ŸzZvúe¦-ï^†ª$¬Uk¢Ö‡­œ :BšI-0Й\££ƒ z÷Ï„”ÁW^ý à ÆÐ?6pä€tàBØ´Pgf²œ.ÀE Æ'5ÞCׇÑI‰WÆæsjý> äaîÅ_½/ýèq‰1Äå­“Û¸r„ù2×ßaˆ)®Nrgc7dæz4öݤÜòŠÔ-^•ˆ‡èHw.Â’U¬râ9#Å+²gêÞQë$ZlR¦…¡Q†x¸çJ¯Ã”]”FZBêßñfC–»Ön¦]Ü)l¢ÑE”|vŽ(|—©%è±ãí«”Iø,ø³+£<¾˜Èth âvÑÌ%踻|lú²«ù“µ½¿v.…«kÿŒ¶ïÑ´6>¦!¦ À¶‘hÐ „`í Uæ]­Ñ mT Ë’ûºt~ý(:]+|ðKØ£ þFfæs*ÐæEÛÒÖL~›F¢gÀ ÈÈÛYÅï$] ð6‡jFùú(b‡¸ïHÔªQ{ Ûlu.lÀLg÷cØ>~ägÆwVÞšYø-ÊCÏ ÖÍv뙂7‹7¼?—ÔëTè˜G¾º‡â¡¥¼ þ>uRoÀ®—ö×àG°;|Ê2Ö g<ìts'†î(аñ~ákxîÖËÜš8’ÀÍîJT6ø(G9C•è 1¤ŒVá¯:0doÄ`Ü –`ñ®gÜ‘¢ŠÏE!5 ¡£-ÜåŽÄ_Ë_kw&•Ñe~€%ãl:{F8šƒpˆêg¢ §üYŸTD=Z îëD[é^dvW­ZxÖJ_%‚уP‚_Ù?ÀPŸ³”Ç’¢Z1A“x—S3Ͼ«WÈWê'¤œddÒUçôØ›³>×¾°/šC …“S+Ç\ •¥Öü7]£7qe&c0úsfd]Â|× gMù× §ˆWñoâÅÎ šMávQH"gü’²;½lRêàU¶‚W$Ûèó†—þä¼y¡\|÷ž]¡‘ÚN@&­ï«*°€Dª_Õ»ýÚ› Á¢b/÷‰Ý"=dun-r lr6ñù2'TêmIï<©°o¼¯ßl« †I…±ÄÂpŽ?´l##bIª½‘FU~쉜ô?ù '=‰‘ÜçÞ‹\÷ðבzò4¬@óM Ù·¨ý+OjîËQ£«çK™ síÔ¿îHz\s[ì-•Ñjü?i¨ð¦/CtïEÝJO½îÿ­š’ûê¹Ë*;´UY×JðX¯L4RÔTJATÿ]›Ý /zE²(@fe¹uwǨáÐÁUŽîÌM”w¾ÕD˜ :ì {Þ€Z¹Å¢kguƒð Ô_±¤3qsd:@NŸbë«Aøoì¡å`;[ÛÔÎ!àRÚ?•>Ä)îÓ®Çùcyežž£QŒö´C#áìßYrç=Â7†ß²…X¨'“öºîO%0oßã'ÙÐÍžD¹ðAX4 m+ß©„N¾- ÄS¶SM-´Sm*?3ô³Ÿ(áÛâf„ü)2(ƒÛŒRœ¨qΆqD‹÷¡…žµœY>§n(¥F„–ÀAE[}6ÌÇ#¡oÀêŸV¥·Å¸™al1/w.Y“[¸žPÎ5¾&™Wî÷$qe›Ñ£%ò ¯õÛH€Í°HZ;úÎüu¹’[‘H·xÊ[îžôñ GóÑ},k4²MgÀÿ6óbcÍÚLÍìä|蹃!D¿ÝËî´»Rõ“À5õü±&›~1ûβiÑ<ýc©,‰¨s”—&Vm×Oº§dæ“®i}Ri \§(Ѽê x[<ötƒîâu[Mª%R–Goö=ÛÛ 7YÙçÚkÖAœ¥©j <Ä0ñBÜYeGKóq,ò|}S^€ž¤äŸÐ^âý¼Ì†7ËBàKù¹Âp˨ð'C?¦@/ùÂEUiø´•ÐÄÉ /®’ 4ç-XOvÛAÌK1Ø“¸âwwΫ¯Õe4ãbTïÅô²}û°n‚£ùJkYÏi¸(¬«`/Q6†d CsINëÑvê¾áè*®@dþCM$ÉΉø®˜êŒBºŒ<¼lýíB#Ð1&8»nœÿú3œkw+ÇH>ß#3ÜØa’Hy¹Vƹ‹—ŒP¯ gvÀäyÏ©õ^hØÕ}D {±—ˆôªlˆßHoNúóòCß¼Þ=ã誎kG*ÈÍ­…àáæS9–ËWPRYU¼F!4$RÞ³KŽ>r–w·S긤 K&fi&RQMKžR0è‘Ü|k 7{À§pÏQª 6«ÿ])ñÞoªàGa_ÑZ‡Q4élb-ìHÊkiC¹›®÷3Í÷Â,+ðèoh.Ê«`­òâ’hCéü‘@Ç4û™ÌM?€T؆ '‰¸H‘ýFï…íH¨pR²gEßêH£Fa%ßЍáh <ú®×¿¶[ŽÍÚÝ/l²ßŽD#¨WD¢¯„Y ·Ã³^¤®1Ïð1zíT€«‚¨êÇÖaú·&ê&ÃLtBŸ©¶V뤴jÈ xG°.™ËÌgû$\îSJè­Ä’óhfx·Œ‚3ž§âÑ æ©sðãœX½Ç x› wfÕÏY÷ž…>™ù4ZtWâŸï4Hxòçžl=™ Ö·8—ípÍ{© P+ †H”! ÜÛ’žþTævÚ‚ãx #‰Ø:/Á ÏYÕh„8ÅÕ‚^×Ý4>FïìÉg윬_œ€¯á“Ê*hPׂÛÅÀ ûÈèÝÙ¥5ñ;‹ªÅ8´½_[ˆA:ë¸`ΡKËAfå±jÂmž…r–ú¢^në„£Õö.³[÷ße¼~ÜÃømˆ[@Og+;0°šé!>c/+Ö·òÌhn¼øWãF§O ­÷ÔdF4XÎÃÇo£ö‡ŠÊ¨«$€&qùíçϾhaêî“j¸·6âšãÇÀWKhýЦ˜‡°±á¤b5jj¬Ü,gu½áº2œìw’çRïû.æSê`’}¶¤¡ÿ±I²mF˜V¯·¦k¡ÍÕ¸¸"ý¢*:lìDôwWÁ76^´íþÑZMø§>õ?©-Æ…ÆïShÚ¢~¶þý§¼pÙ­lù‹è¡JñÉ_—ÃIÌtÒÂâòm+Ÿ0@޳è°3R¯ã¾­=ÎGÎй-c¡ûúýtL2m¿·SGz%®d¾ºYó3áöÍí‰ÍòZ[7Öð¨Ö9ƒƒÎßt/‰@ÇKÇK–éÓß}-ø£lßÚ¬œ7âW8¶nþùæØ—S‰[/-û‘‘j®¬óGLwÔwH.I}b—±lD´¯ÓÌ£ýÇqÁ««oÉ.¬yŸø5„”ªêÀ3qTÙ¼MCâjê\æ7¾œ Ä?ìÂÿÛ^ê»Új …an :‡-´8étêÁTƒºõ˜DNžþ?Þ|¶’èÍ ÔÉ®·âf…/0‡S—z€ÎϘðI6cÖÄÌÛž,Ϭ!%VHN ?gæ.ÛÏ”‰QÚ…Ÿ¤ÐÈ"rÓ¼Rǃ—]ÜY e´(/—|ãs kØö“¼‡à}μ8¿tB’ÃWÞ…¾ÅgÕEùe²÷9`¡¸º …Þ½ï0Óæ3<²Ÿ«À—ßÚýÜ_®>YKÐþù7c K´ßôQR“‰yøamà‹OžOz—ýƒ}?{uãɶEma@#”MÎø36úÂY1ÿØ­’W½Q³­ã´aþ¼½ ¿Ðú,9œZ©ÄõBY¥æ—<Ããá;;è9÷)Ûl`d¥Á ·;¯=Át—t™I‘ºƒŒ‰ô–-Dø*fòåYè¨ç¨U߯ôu r$TôºTÔÉÂ*„¦$|e…füky 22’‹dötNùÇmuöã3¶–nœö/~9˜_LÓ.ù†þvù…Zyb§wᙾFoC³Ð]ÞŠ-Ÿ5öë)-Bƒþ;a[¯±ûé°iôOþÙ)ãÇÍÉœ‰B=òwvž7žúÌ^€{¤ªº”À »L­ù@ŸøGÞ´`ëLß„Bvœ‰BëÐÌ'Ƨ€÷¥ªvrk¡?™ ó5s÷ðÁ¥ã¼¿øD×Ïç0Rv§Ê&íÆ¹”Ü©¼Ù·>©Þµ3¢¢º$Î"ç°ìÆÔžþ»rógËÜǯ%K“)õŽìƒ)ý¿é½ªï§¡½…åY/·Œ†–h«>ü½OtYŒpx‡»K¯å<ÌyF}¶Xåæ:à¨$-šI½k,LvÐcJäËKFLßo…¶°7·—z’<ß¡•S;Äý {&¶‡5.—£•k[\cn*G¿Æ8j˜Ê˜7鯿¬Ê´sI…ù¿%}rêë¯"íŽô·Õ®TV@¬½w-/»þÃbI¥¨¦ócmY6‹fqüõQ>.FŸ_íl°¨pÐ\€V­¹Š¬&^äûYA¾4tœ/+¬ƒ ]ýྃÞñá†óçeE9Àe¿*ùjƒ!‹¬«ê¤ÿ§%ÿÚiu¦þ!ïµj:ð&´pdµ=ÙÉsÊt{Ôð‘kÈIX6Q`ºõIÍ¡ÍL /*ß·º§_<íy¹¹ËeoòY68øÎÁa¹ŽÊ“Açxûz…§n#;xöÅÕgÉ޲|¿œÖÄ Ñ¢ñ%]Ó²íîï%juÞ¼iúU’°+kêø‹©ƒLOÝNHÚ ‚=y1ËóTª5dØ0f“FzLCÀ p{¯´vJ ø*\R޾,"³Q¡ÖŽñpaãY6‹¨„ÚÅ|îJ'M^Ö7#^íå£ % ïý[@ðÎ4§íí¦;?©Ð=·ÿ¡\>Ú…¼¢~Mº4ŠyGš ¤°`€é®w`+£'”)Ö¡rp{‰b¸EÀ[žTÑëµ¢bñ™Eéß.ŸÙJ»T=>XÑTGvó(•¬Â’+aaÄ:Aé‡÷Û‘·ÖPÿ„Ž_¹6y™½e5öÓƒšë?^ –5€MÆ»y*õö…}é%àHGsî<ÒÄ[Fø¹O¸ò6Þ¯/åÙ`wñ9èïÿ#!æø…ì%…âæÉ{ GiPìÓÿ]‚DÓ!,ÃÆ‹}SG j—ªœVƒcùÐÍ.¹Ý{iôDuX©§/x–Ž1↠sRwÐÎbâëÓ¦ö`êøBº Qœm(°3S‡ÔÐ5ÚѧQ3ÚYG¹íAwyš(›lÙ¬+yûȦÒ¡}-K¤Bãs÷èÓZî‹ñîÁ†Lÿ žÂäýðmÁOŒÆzÿÅ5Ðt ü>px€#›¢®z´”CkàïÍ A,ë|ÂnDS%*Ù²i×öÓ¶“®¥/ÏicC7²áeOÍC9x ?Èï„9a> Z!aJ ¢ÃFñ«B%Tÿ¿–UÔàþˆ@ôØd³Øþ-ŒF!Ï—ô6S‡ý'[ü•œú5î,ÜCX6öÎ%˜òƒ¨Ûšs€aS¡ÜÒ½H”X|îæ“d}jù9 +¬õ7_ŽæÃ\51(@ sˆ$®ü¢¥ ä7J|%»Y† hU›½šñÛ¤òD´Á s¤ÕÀw}ÂÝq)|„hO—Šf+mû¹.É·Ë@Å—<3óÀ ÕøÖJ>Ѳ=x&YÐOyÀªƒª¿#ô¥£4a@¦Äç­7ꦹؠùŸQîÿ%mdñ&¢š®‘Åùijø¸Xþ[zaãþ†àÜØªª›tè‹(W·@Î3óæ‡FëúDmË8ýícÁ]¶‹{Ì›hïð…¤ã†*Þvö½ò€>”"L3GKˆXOÌŒ}µ€õ ºÉ#&:ÛCž¦Â|6ÿáõOúgˆË/b/À>“~!öÓá”Dº@ÏXèþå“›^Kß-5øOMVi>úMÛX>Â#…#ˆö§¦°Áü/R„0PÄ8sããOEäɶ›'Xçð*ýÖ(ñ¶†q”§PõÀ.Ú—´û° Ót×òÑá’ÈmÌw÷MߤýÃ|;ýXVodûè‹0„ñPÓÈÍ«}ÚyF†àÿ]_ŸºÇÈ l4‡~þvd9;~>S°À áÒÙaŒ“ P»ôÒ¯·D_a,¤;9íx”;×Áö"6Ù5«û¨¯šóÉMeNíÝÝwþ–MºH ÓÄ;‚8.íJî¢Ëµ ·€Ø^Lä°åš„“Ô`hŒ«k7” ýiaµãŽ[­²S®c¬Þ´³éSL:rx: ú\ãÝ´ Çº’U¬úýŸ°±ó°z4þë'´Ê­Še¸œºI8ÁÒk9—®Œ‚ÿ/ƒáŸg^«¶”ðÛ?2Òïs÷mÖ]6Ù&\µ+f‡UÆE>þ|3ÅAŒðê²gúƒf?v«û¼ÈuÈ"8ê)ü‡‚cT¸ÜáGõÞ²4Ç¡æ–üð_Ý¿Òuƫ܅&Þ±ß@‚OcÆyØ#AÅ壧Á°˜„}¼ÊQ6ô5)ì´8cÉvŽq5Ð)4Ö†»v]ýeRWú˼»¥ß J†Ð•]c˜­0är“šŸðñ[t$…¯Þ Õ¡ç\ #à–¼ \ Ñðû9µˆ“¦JþáÃp‰&·œYCje¶%Ñsv>¨V™Q`]AI¿g/‘kéŠf>—ÔVèr#L·‚\]1º§m\õdø’ÂjË©ï1§CûÀWÞ<š¯hˆ"*‹ƒÖº¨]ÂÔÑ]bκ‚ïa~Þe0€ê½ü"yâéäæùW$¢ž¤ƒžœ(ÿ+…e}ËjÐÒ;ïxè)æ8‡°ƒ8>VjÂX¶ÝF´y‡·?õ:ÌSEô2X̃Þ U-ˆðÔÙ~EÔr ìù-EÔ&÷Áp™°9n';õ†qÔtœ×su †êÿÌÚÃQ07OùB7n·!ŒéÁÿlIG“G¨Ë)õ‹›véëL˜Ä—+ï ÿô$ñPôò†„ö€ÈðÕ¶JLëØo|{z– V†ëÄœrÂdž(–‰©2€­¼aÖ„¸dÛ°§ðBËø?rM„`?V΄Ø,˜á Ñ{vÂ\˜Ï BÀM=­Â­ÐkÝê¤K£F‘ùæSý ùl.óFáw }Þ6i2ñ•¢þrèÄ|-é ;(¶ÈËu)‘ñP»¸\óõ|PüÂbÿ‰¼xíuüÊÿ[·ºi£ý._“K½A¿JþZBÕETë™X˜qj[^ Ssdµv٠ㅙȥ¯•ùvg<š:uÿ¬šÆêåÜÝ®Šh Ý…Aie›¨÷ Ê;j|K»?Û£ø"î5zSãqRyJ˨db‰Df/<@ãªs‹]Aò;åt÷ï !/c]æMz¼u!r­™4‹Ô¶º\-É1&?_¦Ÿ6Ç=íÀ÷Ï¥þ¦å3|õ¹þÓÏJzÃ亰ïiœÖ# Ö3…Üõ+P¡1\@ÆÌ®â¹äÖ{Xµ;Â(*¾i<^d;Ž%`ðÇ0Q]£ÍÇâÉ0Ež0ž)`’äë‚ü3ÜÅþ$±«2Í—WÀ•íûV»2ZsbåäyžCùÆÎñFnïfih;M¼Aã…Rþ§¾îJ¾€‚Ô=ÿI­]¼Ô=¢ºýtÔ% Êq]„¹Z·.C|Z'ÈÊ¥]VÏ`G1Pì´³0ßà<~3Nm}pu÷÷FÔW =©]x¿]î÷óü½¦×çº(Kˆ²È‹š“¯pstHú% >³Ó‘ÊüÏNW­cÄwí/þ-®êr·îÂh9Zñ6('ê&t½ÝaôÔ¼¥˜øñ¿û.a®P¶c‡é’/^´bþ^ü‡*Ã×.³|³eÆ¡„iâwãaa—…uš‘f<.M‡õ t.í²Út™mo_ãw_@Ü€”SC­ŠÒé"Wð?ìžV³w=a0©‘ÔŽÞo¡4kÄvŒ”_úîèoR+¦’*Û/ª2ðèO†C?Û²,,¢—±Ã«QÜATŸ:G¿¾Ù´ßC-žAVéy8ìk\HkêqïÜ2ô½ð´ªþ+¬Ù1À¤;¯R!_â?{jt‡–8†¸ø²ÄQÈ俤Í©‘7ŽZ_Ä-ĤՓr5·d*„óxuL>Ç_q:ÈQEئ¿—Oîžü?=Eõl;/õ¼O,"]…<Cú<Ÿ÷}¥dÍÛ…™àäáF£DÝÞ!½fBË?#=¦\Ü%¾¬sÊõ­ê ½ÀÁ=ø=´È%–Ê¡ð â”iÁh¦¬@%ÛNO¯µjýZ€…²wpÏ[÷Ó|\ƒÛa–%œ&Ad2~9ˆüäºîƒÙÿø ;Y±é‡L/Fo#4Â2H_ÌvŽQñʲÐe«(¶ç‡Ø°–Ä×~>¨¸·58 ±]øˆÎ÷Œ<>íµdä13ì#HÉ&{ó'l~½*·Š ¥mÇU‚êBŠÓ)÷´z¹8à÷ÀÒ#äΡ[ÕV…N[Å‚ë p¾]ê×ÐP·{«(* Ù2ÍmÄ®Ú º«.úWï’òsaÀŒ8ãU—†×ùÜF±OÊF†íDJN”…ON%:þZwgGCjnœ»”eHR…ñv6ïª |Óõ4è{Î%ëFá…Õ~ô„OZ¿::»Ìȧ@Ñ+°#¬å—p–XJµ}fXÿÑÿ0Ûƒ™›GÖ˜T0Ï•×.×â’\›™&9I×_n-‡¹è]n'Ær#a_²Æ¶ƒI§µšù¥‹OÐÁv™˜o‘ÚÉß°ƒ„}”¿–ãP 2ü‡ÿoÆ’…µxu.úgñUdWz¯æY×îÊoW¶ÐBû¨ZÒºêôxÉp[tñ^ ³–½g ]ß’43Ew:xçQá‘õÚ'WÂHŃÀ^)’&Oõ×3‡z¸á¹úõR‡Ú–…/€Ê&~‘]`ƒw5ÔIpšë!ŽçY‡Ež L¸Eñ88ŸÓoà™˜ÛDTÖgœ€íÔE¾oIw¯ùÀæ!ÍÒC­®R‰“ÖŒ ÿ?öþ®Éd{‡…H@  Hˆ€bAj ÔЕ&ET¤w…„z AQ±€Hï"‚Šô±¡(éTz“Þù?Ip-«îÞû½×»¿÷u>»KžgfΙSæÌ9gfžU+Ê&ÀTÜÍõÍzoÐÂø}DñÆ%y¶1Þ«Ô5Ò»Ó§o†‚?¡­8:ÞËŠÏ-ŸNÜW®‚Hf²u‰“ëëùµ£–P] Z­Cü=% ¢¨Îy)6±ë=äÙ‡Ü÷ {§–Ôvx;pÑ@m¥öLzƒÊ¯p¹ª,ƒÏ‚R »—&7=5^˜ßüÙÀ “'¨ö©«Î(‚˜ÄP¤ünßë$êL¡Ú]³µØ°×;.ê"f9T}h¢Ûm”Ž?A·gîW1Æ%]Ú„¹2Iâ|EmÀ¦"µi}k,Inh‘O"a‚§Ôu[±üh5–o0Í.Ç¿f¢ìÔ>Â*ÓÂL`—ÓÞM ª= î^OÀ~Þ/ÅMž¨nKì;Î1¥fùù¤¹É‚{³ÄĤX kß@Õ'I»íIñ3›/j5—Ø“‹ðŠÂ¦.›ÌèëNª.Ñ¥¡sõÇ)㬊*Pc‡ùx×ÔSi¹)ÈûBM‰©Æ¯µ+#ðMXª’Dn[(Òì„læ…òÏÏÿ‹4¼'t©‡.Ú`² MV™ÖÏôÀ‚˜êax˸Уb‡?ÕÆå<5¹A!v8˜lgù<ïòPþ(Ó@\£*)|¼@#…ðç…Þ20ÞKJ[‚ô ¬príTA‰8oy+²V9ë€6ëS]µ¨©â¢‡Z•…­±P›0æõ;Š@Æ’6qÝŸ>yÎÞ¸"…þ"øÝ§šèýîG ×ú ±´L>4¤ì£éĵŠtåÛ>Ó‚.ÐÖŒ0 ¼îª€äBvlj00"·Ãæ‰á+–¨{E!,óâÔ!`F0 ’NÙ™Æãk3mñ[ÛvðBeˆMûÚðÀbzSf½`·?®ó—ë#ú]k¡ÀPk‰<¥' COÕ·œQq£ýÇ@yòãQ}+c«‚Æ9dÆç ¡ã£»Aƒ¨}Ö)Ub!3ºÙ1±é8äT2-Dtìøt@7Ï&úÓDàC —6ôç}¤%ë sAº–o»aMŸ°Ø1 FžsqÀ ¡¬öäö¤ÝˆZ¸ÏV±¶¥./ 6)1‘ľ¹¥—ŠDßåÇÛÈõ?\}ŸzN ‹2’¸,^q¡V ·mR_níà½i"µPª{çãIÊA¦bÛV$=#ËÒÞ÷Ç+<“!O_Ó¦îŠçô„ëhÉõhA\+…z–‘¹_µ«täÚ*£Rñº›szŸI–/îЉ®×¦‰©¤—Íu2Ø¢…,ÑîdÏÍêm9Ý=bÚõBC<‚e@)Tó/‘“vyåXž¡Ís;íÇÁoG+âØ-QîëËz1µ ;¤í ïµÊÍ÷Úî¬L¾!@ òŽ,óVì(¨{˜XœX’òÈ?¡q–‹Ú¯ÒuGQâ“[ÈXÊ•&ààÜí0/)b¹%Nâ(|H€úðûW<$¾UÔi"ò&ìIÜøn4YW;uó+ФӵV "¼ èÝDj°èô`²Ór7ªÂµeÏž¤Êu÷î BèPà³3ñ©7¸©§nÚz­nÝÉÙ~ǘ«Û®¬¥-ÂS&y$Ø …–z/è©úÜ#¬ÖA…nŽ€Ÿó†=×÷m¾:Ý*äÂá2JØP+Ÿ= Î2Þ±µ°üÚG탤ÎéøÆ!ë,…Lê·„ø‹äiãš®sOÍIÈõBwüÜqK‘šžòº ”|1L€<^& ¼ˆÜïÛT‰ vò5Óqª´Ð¹ÔLƒ²Z„ýì»m¡‘—ñO!")mv[´<ãÈâΩÜUVÍ}Ñ[êó‡"IJ§/D§ÜàC<¹$Bã5b?ž† Iä3z‹Ãw¹ú‘{ ÁÓ§jÃe;…ö41"}„"ý4-jM‘ÞÛ½½ºûÏ'è¼y5ù¬kí£¸'RAŒiñØñÁº Ë0©äÄ~ã×ëywñˆº.û–= ĸ-áæÅW 8î!/;GÉM-Ó;lü€qÜè*¹äú l'ûž4 ßÞp3ImeOŽrÄ:ELbñ·qì-X9D|…l¹7ŠPÄÙßõš¨;Ê‘Iy£ Vƒ §ÆäÏî?ä$É>ì%T£Ev dԇ͗Ç?l!MÜ *Œ¶å›B“W|dëÎbËì^úÞNC*~Ì×0c.çOˆ?—¦K’¬È…§€ëÚ饈ýH3,jáñD‰—”+‰ýb‘åÜ_i¢ÀÏ©fÛy"[ð•ëU Mg^0M›IRw•{cXÂv°±í8öV_¶5_k|ʨËtV(÷—=Þ˜ÒJ_xQÓ×ýjÍ"»½jÙé>¥ØëW‘.”å1”×c“îÁPÌa¹Þn–Ì$‰T$šw”Ø>ïêC„Jô›Sí³„tPº!6?¯ÚI„§oß@ÜrTZSñMEnÚ‰q@¯ž9u¦¾ÈÉŸ2(yaWA÷»wÔ‰ 6ØÆ»3^¸Zª°Ý—˜ü Èû(ž\ûøyé­Ç%(BMŒ— ‰fS1µ7seÞ*±K‰øÜ…Ýf¢²E(Ö¤ôƒw»M85¿â4a3¸tÁáþ|à0£Ô÷.ìÔ^Zºé÷Túо[ñ§vyI¸’•pþR1µTß¾:2'GÔeÉÃß>V“cÝuõnG}zú®Ð(dEOíxÑý‚«¤¡ ö0f€õL¤:Wêµ(F^œ ç÷S« ¼9Eu†v¿*¡x«‚¸bñ¸bF8¾,ý10Š*‘Bp;”‰}º”Kgë0*€é‘xK(kÉmA&ˆ‡BCEíyŠTa3¦¾\ÍIj»Â¬mE–`œp—…{(ÚŸTðß¿°Þƒ¢V}0rˆ A³ ÄÊÌsÖ°ÞýႬŽÃ²°î;ŽŽDu°yË:’ÅG“ör9oÇTÎIŠÝÒ¡#çi§W÷„ÌÌ'Ì֣˜U0ROÞ¢ïÖ¥1Þð)'%j•)w\Ìd眈¶pøåŽdéµD•oÚ¶çæÞíÅÇÅÔUL¯¥‚Rk_U@eÏUPUõý¶y7¦QåwÙý£%‡¼Ùø'iÆ©Žï§¦ ¯@êµ±\F£àãÅ÷¨§KÆ­ ÚÙêž• ²æšE8&Pfc[©y½q£VL³à¾ ;QwÁ‡Ò+ÎäH"Լ؂\@S‹ë$Ã1í †ò–âlV„ÆàBõp7ã²ÆÙ·RA¶Äe=3Ÿ~õŽ®ÿúQVÂîáN1~é5ikŠèðõ.Û7ú¹ãJ>½ìÈIHʇ_Î/IJ@œqDS`ºú ¡9JYá¢)^Ó´Ø\ SrÕÁ¤Išv±1³RSM =}¿/œC¿£EEŽ`‚<À¥RÔ ¥gMG펡«ž¯³ËÆñwÜ@V­qέƒ)`‡·ÓR£Î—÷¯ÿpz²ÀEI¸„÷0­Â’çFQGYl¥[zÏÔ&Y¸_Å3Šš¸øÑCPB÷²Ãú6±ì »;¡Câ ¾É%RÔ…‰¾d&ðƒÈ@ÔÔ*˜:ráDQ%EÚØáå§«‚žö9­ƒ°€soçØÕMØÞ9,Öp…Ú/‚k°¸Ì&ŽàðJAÜN¦½r)áJ‹—L[ð;¾ò%Ô¸AäÆÊ×4 ’W@xPN¡q¨ü€.%¾CSïø›Îc9[ÊÝ“ üô«|k{(€×Ìç Õ{”d拾»‚Wày<ÞgVhvºÄP@òMþ¡³žl)Ö§PøU ÀrI¯ZÙ:=¿}²Üê o‘Ä•q‰×sµbBînK ­çª·ÏCﯟÀ1>Ÿ„¿€«Fž³ðlq¸±ö-·M(´ç¾Ö41á~~/+A5êÖÞ¬×Aã^§oFn?žJw¬ä¯ýþ!Øä<Ñ&ÓF4òñ%îDtÿh.âíTø’ÛΜJ*̯C°žêù}KÞ³í•>â$»ƒUyZBáYw©´óøs'‡LuõãõTíOY ä6 b0¡@OÓRŠõ¬b*ÊC¬‰­èÙù¨2Ÿƒúp‘[a»d÷ž›MϽY=Œ¥¶ÏQg½ËÒ>éX}÷.‡haŽC®ºàУT çÞÐé§ÂŒ…:“éXB9bÙ} $@™Ø#Û§û¶tv “}Š4á÷þ€C-HÝô‰Ì Žóç…Ï“ŒqÁò•¯Î:Ãl«ÍR rˆV™çûQG¼MÙ úòì¶µ=’Õp€mB/ÚèsmÇ<I½ñù+Íäjò´_TÓ©>™6s–‡§SÐCV;º+J‰[ q»©•qPÀ”Ì—”c£–Ý…$aÐÆ àši„¶™Ì¬ME]<½´¦BÞ ‡[$H ÁÝÓÀÍðƒÅÒñˆÈÕý*q»ˆ¤G? € ‚ìOz_áNvè‡>½þÁ Öý"à »;ž–Ñ#µ‘ìyâ^qÒ¤&)ܼ-]ŒŽ[ƒ2’, áU Þ•1hbŒeËáy¥Ýd“0!ß³¯ŸvA_ ·8“}otUôè÷Æe„W÷F¬;tÞ]sòŽrÑ w¦Êð²vÆ„Tg„4½´älœÈ&²7ÖZ‚Ç2«rÍ› ·Ô™úÅ´ê×¢ú—2õKR*Aò8ÕIpuàZÔŽ ¹Š6TêˆÂÙªÞò^Ë{Ûd€8âü$Xjôd­›—ŸšXŽV­J’œåf¢X÷¢È¸±ûQ¼¨MsOì´i\¼öc.2â£8ô$8ZqÞó‚œÄþáF¯G…‡§Ï«“#'_’}ý ™ eÜù£÷B&[–w­?ÚØñ•DøWñþÌÒ÷=Ï~f¢;â; gEŸW®ù‚êØd!$x±¿äÝ=°ÿ«íü~1—·Á!«mݰœ$<—(8Ô„Ï’J g³È¾úÒ|Çí>ÞúÆzîíEÀ·¤>ŸFä …Þ¼ÚŸ†õ}Sã°H~ üÐ úR6Í¡gñϘSÊÆñ&¢àD ® P ´]ô›€ô÷n)·¢W!5 ÿ?½èÚÁ^ëòGã`¨Okw@Þ‚gÈÇB8¨.€QR6Š6¼¹}é!vÊàÂj¤0dà£õöäõTÙê a5ò¶gÄò^‹Ë?: Žo1ªé(m–Þ>ÒµAºpÿÁò‘hšÊ2ë › a'F¨¥x2ζ6ËxÙ5¨‡?–Ûn¯>—Ÿ†÷¤Æ)ãfBË/ Ý~º…ì¸êŠ?Óycxië—xø£–Íì-¦AÂ-BNùâ†Cc\˜æãƈ#óRYÖC^ÜÞê ÄT.cã0`ûLo›šÂ·Û•%4¿~;Ï9 Z2GlÌ@¯1™I„’"D H5CEM Ò_QËkŸXýØc7!šwYƒZ‰X}^Ïû²›”t’Á’=Œ—ìÕq¹žíg‰¶ð5»Íˆ©c<6 DÝéìQhÇm]¡F:èÈ1oÜBd¸Sw?hÚÓ_(èÙ8“… …µ¤ãÍÑLðùÝŸFMß»~Ò¹hÜ4§¹B•éT£©êëFµÏv,n­uå.Ò'HmçSã¦?-¯A5S¾[uû›ÞMdž[’LV]@x„9³¹]òÒcá;x§1ÜíòR~H[LbG•#TúÅ irİãà êVçõhAãÅþ>†‘Ò®Héàû ˜÷ Ëa AK7ÆPŠ£n÷1ܸëì çj`ËBšJgøâÜ Aˆ2¾>óy¾Bœ.³ë}ä¦tN¨2dÑM,×AÊhUÀ\ÒÊj8 î¯ÙU£‡\°t';‰~nÎë ‡±Ÿº†=³{j#6Ž¯Ç¶×OŸwÕ3eçt¼y°’Ý.‡±kãk+‘'¨ÝÉùd^`iê†cv:4} ÚJ•3çC¶âX%­ÀUì Wäî±Q„E "(_ØšOÒØpÐt%…ð9vã{/}¸2÷Îo3Œ‘|ä°o£`dûY{Ñ@‰³Å©å}F*‘Ã+¡˜û¶Úì¤äsÀ9…ht½õF3™ŒMI®au}wAøbò¾Ñcª+Q ˆ;B=ðFýµ_Ûú8nÁЦûƒµZƒ6¡ñ·]²È™èçÚ6¯ˆ”“ø"kËÂã»ÞíœmŽ’ôBØZÁ:øYd—ëÓ#lÊ‘g¨ƒI퉣²ß‹£!/p0ôåÇ7E‚ÉrÉóÄ =BÕ?6]Mï–G‘ÔŽmVÀ%ŸÅûYÅ~L¡ç&2ÁÄa3,;ˆ¸ÌNJ@ãºäÑðZáË•"ÁÄ€ iã.Ø "§‹}b½‹ÈD0ÁûÁ>ŸðWÔ¶÷ºÞVíí]â9°;Ís…õ&L™˜€VL$uÀª>ÕˆÛ¿þðÝxdÕVŠ8w©¡næèÒ1„f$ûœáš‹ayƒȰIž¢!žk«ØÚlË{…·&©íÀw tOGÍÐõÍÅT'º£$jÛo§B‰„ßÏ&Ú:‡¶<ÊC³*_å:¦ÊpútSà¸B¥¸¦îz¢>AÃΩ¡e³­~®\*N}xõ’ˆ˜´ã÷ £e£ÕÝ ”nˆrËõò#‘ÔUBó´³£õ&ŽWNÖ·<ú ¹iÑ”~´ºS¾o«Û]+–?ºD _ó\ðlŸq`‚?ÝÚØÒì ª‡Yn_ξ¾¹ª"í5š®žâò~xdbR}s![<¦ÞkuËje‹¼ÔE +D1¥pTïa“érö•"nJ„œØP {Íw»ÉÔÆ攌Võ”…Ìm H?hÁ†Q̱ü™ìÃ$|]çéK;Añ ‹Ú!JÞ )áçý<4¯J±Ýšúý—üî‚·<'”â=ŠÁåÏÆ ŠK—§>mÀÐeoÉTΊjá¦yå*2•’çj]rµµ>ô–BCï¾ô ¨‰‘§zn¡¯õ½š‚YðJ#ì£]_ M ƒ–0sˆm´—úЋTy^Ö0«QMÇÆYj4I' !ºLJ8JI-1²mÐ#ïa´HûÑäÀ¦b 1­h° «„i&t)4eÛ$±+š+l¥œCBBm‡ 9;d ¥Ÿ.DîŽîNFnÚ±ã"¥—Ìzê‡&ºtÔýnu÷ì3°•îM;æÙË_U`BpÙ”Ô«ˆSäìÌ9°™b‘¥ÞS¦ç Ñ Ëé‰ú/C펠nG6 ò‰}*œìÅ]Þ S\¯æ‡K@väc`ÚaYŒT9©QÖ6l‘ ‰žÞçÈ»¸Ïpða–ë2J8£u%:rc¼ 6¦BaQåλU‚ê³M‚¦¼GÄ‘¼hwúÜEÆUÜyßaŠpdz¹eãݱ ný©õ&µwH^Š>¥Ôµ|V ƒ ÁLµH§ #BÅÚ¹W€ UÔÆ+k‚ȦÛô¿#Ùš#5)žÏîKåfœÐÛßúžÕm,"CáHWüÖZ¸{å¹âÒréGIx…pÜ:Öª© £J—qÅIðÙ€TlLÉÇ>›¥Ü4|kö$]q¶¨Šýå9ðýrlgúkwᥱáÅ¥²±£»mí/Ñ·¹<©ã± TeEÆß¦èÜ?¶"±+î`<Åö{U J · .—(ìbÂÈ—aÖïâ|ŸyÒ9§cãÚrëFsÛØy0Ž4L=ëÒì §ãŠ„êX/¹/œµ|reÊ[·82ô"2Q„´)À¥Ð•tÕMòC›AÛF»Žâ”´³v”l—wŽ˜`ïÝ!(^k3:õÑ%…Ä¡€ï¿uzøÖ‰ŽÂÀ†Š4¦¶²áö]0 këZ~[0¡°ýd?©#cAhùÐ2íV¥ÒxŠZùl† #áâ4òçw»¡MåRv*…<Ôb|WRÕP`'GÙ.@¸³“½%øÚaØiyöŠ]åB…Ìè‡. %Œ’ 8†‘kXÂM$$ïZ5bàU21‰åð½§1ÍÞz6ëÝhL›x¼bñðÏZYâ‰Öí©Çµdj ¼Î½ä†¹¢F”Q^r®ŸÕkÂw€ûÊ{­Ü´^>< À¼7 /êgFúÄ$ û»Þñ-°÷ ¤,dk:ž!MÚo•WÃB6 ùåxÄ•@?í¼üµ p¼9©Û¹ 6Q¦yt‘gÞoÕo¸žÍî_Ë¿áð†À­Kâ+Õ·*ÊF=oÉÃ÷·è•!WSÁ¬Qž¯ÆÙåøy °]ÃÄîf‚iã4üAsàÍ@õBöý¸Sg@Ûú34»z$4`Ðk`Òu•ÞÂä ¼Jj¯]G!Ö[`¿XÜYÛ  ö¤É4"¸Ý~ò„ß•½4§Õ°ñ-9EÙо©_ú~ÊÅX°OÊ1ÍÏõŽ´› D#;w„ܽ³AîEÛ–…×÷¢í˜,(ý\toÖa¥;iW¡ŸöƒƒW S¡T¬uØ•5TUC‰dd‚Dâ?–ÉœÒïN j©“¶šPïÉ8©]"7«ãTÔaï)5“@ª´'2zì1†A…HÇé&„±pVGfŽ–ñc¦ûÈï±]Ñ-(7Žò‘9¼J§ ²®€Ócßwd¤³äu+ÓÏ÷R%RˆšBƒ"^QEWxb醸e ŸèògÄLj¿ÄÉ b^ÝþiçÚfÞðÓÎöw“>Wň—çê­ŒdN™¼‡\‹dmk³@=ð}ôAh­C}"Í„=žòëç½n–PD‰ÈÉœž³¼*3¯EÏÉ[…£\ ÊßCÔ@sé+›UYŸnÉxÀ<ȦvžMH»/n2!ìÉ„£E,/éï#{T\SàÕi³Uh\nûZ<ÎÊWN͸}ˆ ^D{â”AsmâŠg?°Tç|ò5dôe[BÜ©Ûìz?éðMÄ1ɨEP3’ =^2á¤á$3ÍìY_¼›êÉíñ“ÿnuAÕqñ ›év+¡ÖÕû|{¤“^e¤!掌pcmÁF–[û²<]L*Ü8âÞÈ (qEòi¹Žá»aé X^¶š|4ÔÓé!óz¢ÞfP¿/Œ§÷ZÈ¿OIËF¿*6%noÒÃpÁþ}€øZÆ£-ÅÑ;U®@´n{oª8¾›@}`^÷ì\Q¼WtJcÒ¼‘Qr#ý5“n"þ§î/:ư+f-v•Â+/Tì„fC»ºwo>%gD>xV­ãξ“ì¯ó‡Â±¡ql[>,:Žu>Òòvú%Ðmâ naTOw÷. ÓN»¡òzFóÒUâ.õh²'.‘sÓÁ?Z\&!í8Vöhq-×$cåR"åúW&ì¾Òþ¬÷¬ÁæðM>Þõ³”ÞÚ×F '½Á2§VMiî ‚Wdox㄃ {û·lÒÄ1©ÃØâ¬yˆÇ(2¼PBq»jŽÀ1Öµ ÕøÞŽäB~?iOŒ\Tl0õF9æ“ÐTa4'Œ§ôN ~ƒ ÛÆŸ½Õ®´Dç=7µ€½ck» ‰—¨½Ñ*BŒ]AëÙ¬sÞG_~|x´i/uÇÐÒ)†;KŽ©Ï¢Ã˜ÈGc‚Šî?ÊkxÎí½þæ»çžM³oRèô¯»+d“Ѭæ²u"ÆÖ$i:¹ñ!§‰}f•Ç(¦Ø?þ))V®Ì#–KmeÁg3õý³|'wüqÞêÉѸYäýâÌ»Š‡+4†[….Ë×/t=ï´òK&÷%Ý’„dÅãWñÏ% +Å•]b>‰A']ã´s"O "jV´«O혈ùáŠ9‰ã}Ôõo¨«"›TOî ‡Ô÷Ùk­Ï,²ÏS;¬V| Kš„•H¨/pn¡Ï•0Mg…ß MCé*x:À»öco—|a–O×q;¦Y°Vîº92ƒ 9D„ÇžÛFýrö $¼ÚA!ߎQ'¦î3éOïa|†ž]®8 òOX¯WÂÝ•©ë%‡É5Sò¡ä½â’ŠnÃ?öpñ17ºÊÙ€Wɧ ¹Ì mÃlu… yP·Å¹ÕžQÈ^a›§##Éi=pãV.µI*ë€é­œž¼¢¬ä)µzÞ융ÀÙ[Xæ†Ë\]ïe€“Ø­7¨‚"d¬ÃÝ娠^Î5ªÛ_ÕÑy$îý2Uê-<ñpõÉ¥ƒ÷U±¤nÌEä|¤ŽsÄëXçS7â·DaËÉ"¢ £9•z šïö!|9&®)ek‚ ‰~Ó8j?y7‚zY–ÜäzËvéÒ"#*RØ’‘>(Ç_Uõ¬ï×ÚwŽÖQè&R¸Ì’M<Óû|Ôw*0ÕpZh¢ô’³`‚Bu½’èFÎøÞŽÇ¬Ö‡…žÈŒ8GåÀL®Œ·3Pj”ÏòÞnË…Të¥ÙÑ {ÀÄÆŸa¡¡ê'XÀG^®u®ç'ùLë4ñ®¨õ}Ä„,ý©ù€Y°µÂÓ«²äœ,)2‚@o ¨ÉWÜž^OÌ=¼ÔgÔeJëCr|’eÁqi„lÅ ™vGȘC×ÂCRGCœùß½ŽOZ.—ïã&Ç#ΦؗŸ]ööZõíÅ^Í¿ì¯õ\®nÃö…9ÌòÒ ÐÞvôεX†º l s¹ËKsW¨uòºWe<Ã2Âç\Õ–IÄ>=íè=|ãÁ Ëä¸Ý‚ ’ Ò{ß!Déó b¯Éd?¹cH<^ƒñýÖ…|&ýÚ ÿNì„h0øÜ“oöÛ Ã`0VKÜ¡ŽTS&R$*ÈŒìå^‹¥¨ÛÀº0G .xQn#ÿâȼ^OˆÐQkõ£û\¯PY•u“ãl ñ,d¬<\æÞ)é›X÷„ËÜÁ­ˆ+Tƽ F€î‰Õ&*¨ƒ¯øÇp^ã|¾îŸÞP:”–QW”ÀY•ªÿ §ÜýÆŽ´7Ò‚mí¬¹ï–;–ƒòäÂݪv¯­Éöl¯ƒMÖØß[)9;Û“TÒu?~°(/jZH΂km–¿¾‰çì¯öŸ»7s&Í»I2‚›.ñ8¿Š“{_4@³úžø ´¼ûùåª ¥íË Y%Rix ¹Æjÿ"eWí#¥¼° éÎÙª® WjD÷""t|ÜØ·•ë€:Ñ©óúÙiä«4§ÆNµRþ¥û1rO᪴à0•¢¶ƒYÕ#µžfÝüeåÞ®ý,‹æMgÝ74™®j‹·‹ g”‰­½~.„Ù.JüæÊö¶<'CiY©òPßZÀÛ~:çž=Kç{è±tÀiÀ͉*Å.Ø!Å¡ý5gÊ]‹yc¤÷ ½‹­‡¤No•leŸ' ï€7®W¾)¾¡§Ã:ð¢Óþ†F{ƒØ›Gà‘Î:Ü ü^ $U÷¾£¢ü„‡ÿÚiIÄ=ÈȬ­À0†ü¡•1±†Ã8Ïbä­¼yœ+e¼÷–ÎÌk&‡“¡o$7`{“? ßr‰ NÁà…Á{àã׊‡Ê/Øjöe{¥ƒ©t>Þ1øùãKÆ3ÚÂÿŽZ­?R½JX3\fUÆïÍI±àJªóYj J6!^d2¹Üh¶V„v \t±‡yŽ`Ég½£#è’›æÁ[¸:ó2±ˆÍ)hÓ›Õ‡gØ1í¶¤/ ~½u+;:÷lŸe‡ú›bP¾e¬>«1•:n¯æ\!ÂõpÔ¾,”ìBqÌ—y(ŸÓȵGßž›ºé0#Ü‘q6ë´·\BRé>L*Öd²SŸõÁ†l¿".Ä:&õ<Ú–@Æ þˆ÷ërx₳+ª̾uLÆ6{ká&Ž,0œ:ÉjÕ-·(üê]6eŠÂ½’¡ëÜЭjO3÷ÆC§ïÉixÜí~Ó›¥†ˆ‡^Ó ¾OTÀ~ÙŒxè‡Kš‰¸ƒžœ¾Ò¾¡Ð‚:QXœ¶ÂX Öö2ûHž'ˆ:Ðϸ P¨­íå¢ÔÊ/*؆Ñ%Õ Aš=ArB¶«‰> ½yq§6šÙ¦'tÜ'^3…ªg «ì4ŽhèžK}V5…2ObŸ|Έ„ô)ÇlÝs{Û¨‡ŒÌRC~÷y@AàØÒR Yä8d àÙ™øQŠÍ£gË$ˆÐž%·‹ýàkÏÓ:+?*L"Q ø3¦J œˆîÍ9ÚÝ.ÁÉÏŽµ†Ê­®p:¡W?{k]¼ü>ã™ÃM„Ê }¤*mÈËÔ/ª˜!´É_=»Ö`—7OGQÜ¿Äü~Ä:G…¤.Òž i}Ž]´ö/L;[È´ÚO‚ó2°l ;q 0Qëì„F2Ì¡a³‡² •N÷®ëpš:™ro½ï ˜Ä Bkƒéj•dœmMJ³ö y¸üF#ÐÛÕ»¨Õ_˜6´Ph´¡Š_È‘ò…Vw`q0¸¢)Þþ»D\ò(Ãï$IUÉmáL§ƒã>@nyâo÷XþD…?=2’u5ƒƒˆ@ÔP—>jW%Þ¢¬'~䤽-¾®¨ªàÞ~’X;»ÊnÝ;³ C¼™ŠÇ´vÃdº3O)R )`Ü4"7<’9B\‰€¹ €X:p ÆAÿ-Rá­iC70!™H?ÊF«¯s·²6üiªùƒvRéáü}ã—@ÞQ]‘#]àlEÎ3ŽP#gHÄ+`n ^ÀÏaÃX ÈÕ0øÄŽ×¶£½TÞáD6˜^苯ÿ®XvxGåœBÃò§ !? V¤M[éþ¥Mþô¸œÞVi$-áw4¶m>öïÛdM´ä+ÔÔ»{ 7rBúMJÜ´î¶Ÿ¹±úúÒà­°~`Šhá„XŸžË,êšöÖý-Æ!âºOÙóšÁ®xÌôv>@ úptÔÎ1„Ì ³¢áñš§mÐk^ר Upñ¶LHw×´S ãÒFÒõüÆ»ÃÇû÷a¤Jcè„¢A€P8f‹ª/NÇú^c™@³tw—Ýêjá½µ€7ó\µ÷`Üĉ{Å ‡Š_Ýñ꬯柚meÈ;ä!Rj”H!;äeuKéV¦«XNx›À«±×½Kí5‚ƒR.õ¦ö#³s,€P6ˆEvœ;Ý':¿†è‡úÙ÷k9%á·¦æ¨Ás.ð ºEtxœô†nÉúãÊh¦tþE#ÛµC’:\•ŽÍ/[GKÄ=]z¥óÂSe½Ú¸öLlôè›×³æÀcG‹Ž$ ÚE9âî„‚[±µ¦'Ç }•;Ûž¼ïô¹ˆô7F˜Í&zÒuž®-Äq{o¼6Y6Ôl8&_×öô±‰}wîªA¤8w{©ãµ‚WÃ,&Ì%KA®Uëã%¯`Á ê d9ú,à‡0ôƒ­×\w"ù\¹ÂK…Cçn•f|rÌÖ…; Û÷ï¥EGÚ›Hµ ¸0ùÙ ªõÖVo·B.ìÜA•©<:–¡‘¹Z Ž I½«åê°À4ùa†¨QÇôy3í¡;kBß7”iÄ ð€ªuÉ· {ˆ* *v¾ §až 3€¯WLoþ\-Á:Ò&ŸnÈ“ª6]?Vl áùòÏ7&•üxrÉ…:í>NË…ÚÝœºAÊhß p•xú?¿LêÀ«èvàK[ðäw*87ûû:bº/ÓßÇí­â˜gåîL=fýà„)»täBÐéãýÄ•ÐdôÉÁÔ|ŒÑXäÀ…€íÒ‘W;îàõ‰Ï"Ý( êÌì§âJJS†dqFt`Ù?Fõ1øŒ˜~Æ’=õåJ ëˆéuiDZÛw‹&LÐdOPx Ç|‹ÂU:!-ÝõÃн-ÏŽâJ_!™”H7sãîsêC°' ÍPÌjü7ñPEÞ}œþ˜üƒ‘—-ñTňùú©ŠÓ¢i ¬¿s«áj¾y•¸Ð‘gÎñ¤C!˜#ZЂÇð¹îm­£ŒnÁïs—g 9VH\J÷@·ž—cH UÎìPèÉ\ŃՃ°N‘Í…¸Ç+ÔÌÈàBœÙÉ~Z“.åï<ÞûÙkš—/@È| øºù(vÛó,êD h6à4.Íäzm¸Ú"{d¹÷¶´ nª·ëmTpÞ‡Uɇ¨$ŠfäY‚Áƒ…ÃÍ DVï©ãseöÜXúÇ»ÜVö§Æ24Þ íXÿ û«ºEw`:ÞuËO¼«ßp)ܾ¥bî ôT>ç‹@Ò,sLû„åŠ4y@ÄÞa'{™Šèƒ|WëÓ°Q²)ÍáF˜/ØåÉv«ŒÝõÁÑ4#šúŠ‹¾]ˆð% ТðÝì®mgaj×|â$È4æ´6(éÚ¬v¹íŒ¿A•·°Ò¥!wóS­#NâRäTÄÍÝF4#é´í¥°AßËÒ¤:Ül:6†ðVÓH6‹µ ñ^dµBK°²’šPöd#šêÙ±"Ö»,UlòdÖ\ó¹Ö®û~§ýe·Á+Ô#ïPWª)6´9B1§‘]q5TEÓ0ÌÎZ£ãË±ì– 0ÒwL‡Nа³Ažt(b_áŽÑä6ÏNþ¥Œ3|‘>C0vE,€Ä»ïêÆ¼å{KñS„f uqòj\û\}‘õ¢Ä"Iš¸ÎlTe¦t0T=ô|ñ›ê…v|wd¾0b2ly4‚è6ŒÏž‹…U%%‡öùìÐ'~;o³WkãWì¾³äÅCc1”:˜B`I¯j öCª å…亇¿@PÚuüaДÀi­¤™}ª¦çMå6Ö!€¬˜@×c )—`õsÏÀƒ×¹oòä„¶SuÙ­ÏÒ›ëÔÖØ8ÈÊïÌÇNžß]¿$ n“à8ÄšñÓ02•;Ñ„ø¥r.ø5 Úðsô›‰«Ó˜ANb`¬}7è|,„—Ä2Ó„ãQŠö‡¿†@&Ýí± l;î‹Êâ%~”„öDASnÀ9ÎÖ­îÄUê³vQkâTºL‘'ÏÁ8BÕÖ+q¥%ØpÚ§ks’ã·>®Ü‰[!ÅÄøÜh„œ«7¨¸âŽöÒÞ %ðùLFâPQ$PvŠâ–ŽC—*ì˜&Áûäeé¶'Mo¸\F¼>²<0”¤«.\pËË$&ÍÓi‘éü¾ÇK î[L+ÚÎz8ÿ-½ÆM™\—Ì‘˜'X’5µ÷vô£°« ÜÔ—0*è¾™š4%lm+9kÆr…™ÙýÞLﬓÙ›N®Ð¦2 Ðà»Ühr·Z4(‰ Y쿲Ñ×´ØÛÇë )µïöÄ-ø£„E¯¾¨¾°¢ÓK “sÀ‡\@…~TUŽ:ÒÒfRk5‚âþÏߒƃ«MáWQ«‘ãõ}à¶9i—8Gm¸Æ¡®ø†¼g³u…Ò‰“îå°uкҔXˆmg¿ˆ<{ùtN'ûž~üñ2ªÛàž@»¶Â@G@‹$"’*ÞQpÑ5©°âb,l·F²åÁ¡ÇT¯Jñ½‡¯Ú¯žŽõúDvÛ`ËP ‰gu„ýRîK=1ëì^£ˆUƒÍä”Ã÷ãâµµˆB"/[oÝ»gRÝ‹Øì‰YÞØä‚àçðtàl¬wkî¤Ï &}Y¨¼\!m cYÛµgç–iÑx’Kq{±½=„ášý­ ñaós—uÒvg‰Ö Oe‘ôh¢ ‚äMñœ«®»EI5…ª<`SŒ-¶lºC7¾ŽTÙr•7}P|)@…+Ñ—]v°—0â>…êó-$ø¡—A¯4hŒ¨„‘ëN:Àܲ®@:<Ô¶*“^q myøA6€Ð:2èäݺ2ÙQq–¶Ãy÷É M.“ï½=qJ7µ ˜˜QSñ¨.‚6®“ÏøôéËd16”P@bsÀî/”«pú°Cœ%ì2äeÏ®+/N}o«ÅÉHm7Iè$çÈì$8÷Qq6<¤˜TúŸ©¤¡BÊþ\GLð~„ö"hÑÖð½ÛÆÁŒ¤dˆK¿Kφ ´÷‰g„ŒÞC6Cì@q2Ç72Ö¿ÇãA$oa„øþTîC!vÜú2/c„“lCùˆg€ÝÏM™‰gÈP~ÁÖiãú¼‘Ö€§¼ÉÄa]²Iø‘oU8ÒzܶT‰xãMöòkÊìBÉ&YSÌ1dùJ¯¯Ë ñÐÃ6|¡çÞð£Ó; )ñî\²/¦·`ñÀêÙNåA%ï ìv„°h¯o ‘ïÀfó!aÒSùaŒ‘ÚØî‘¥…)oí{x…ìE•ÅŠE¤¯Ü^Ñ,ùZ ÷~ï8ÉŽ+â¯ü›Ö{®òÈ,ð»+±xã„›Š:”æâõÕ›&¯¾°¦X#zÓÐya/®´-D¶ž6»#‘òP&\«é`C75ÓAÜ#°nKKD¾ˆ÷µ&Ñõv¶—û UNö§rdÛ}oä}°Z$hËùXY<ÌÿÉ`h<ĵ*¾Ftêà4ë’·™½äöu|°îH¼žÕ7üí»§…*~ZHa$$vñÜ%i˜Æß': ˆZäÔ§¦êFgt@}Î~#Ö¦Œ§·ž§Þæ~5MaµÅMlm•½5êfTg؉ÕÌ<²ßGè~YݕڜˆåÓÀ’pYŸZî-ØÆ}íÁÄÌùmâÝÔ—ˆw'±¤3YY¯Í)tt}ˆ. ^]‚CP3ˆ.JK®R9¡ÀƒÇ|¶®n&âõýA½p”ixî8wÙÀ‰xßsñKw9·ŸA®–°ÀàH0$ˆ.é¸À~W,R |4G+­œ…äÿ†­‚/=,À'€©pÊ 6]= À<¼]ð§9á"J±¾™ú ÊB¾À©%'ôôŠF`‹H žBö8L(tTð¯é“Þ^«ûlCžU„H‰ÂÎÌKA¶"&O ‡O¸Â~`^µˆ›ôÞ;ƒš(ãÒÀeª$SPLú‹4¹;zÉ|ün'ÙÍF3)Ñ Ľ÷ÞÂ>/!6!K’AÁš îô’¦àö5] ñ¹ õ8ÝtvN¡ŽPR®@³³v€&ZDš®ŽP¤¥ –%/ùÓ9ƒèš'äÐSî¸K[|‰ȹ,Ƶ³c:àL¤DæÁ" à6òè ¾µ»°;år)~œ2 òÇ1)Æ'c5Ø’ûÁ}ÈÊçØ´c@ Jb}“↖kØC*Õú‰áº -²‰_†¸\x×X1G6” ët‡Ù:†÷L}zÿ]wIr°´hº°TØz\Êÿš‡È¢ Ð¥Ô*”òÈO¹‹¹ß,<®ÙE´.»ÚÁU˜~ŽWN±t𠄈ÿ²%?$›§k’àÅ6¿ÐgßøT¹Å-¥"Z·5Ô‘´;JH=á Þ"d#iÝzR¹æYÉÑôžo·ëÔõ¶VU£JéÆ{ì{•’.z×y^ºpc„ˆGÂG,)}}NÂã¬4àuM=¬ôÀHYÁ Ùâ¸#ŽùѾødzcroEèDÆçÉ íÑÙð5÷±P®ýÊ5cý›;¤H|·”O}醴0éé((‚o>n*Gáø½´ŒÁg—…r¶4Eõ¨ ‚™ˆC;];Ëj†ËéXÎЪ ¬]8 -PpCS­×Az­{OOi¨m§_me‘ƒ¯í,f µ~^{¦›Ñ&yac˦Ríõ°Ó‡73þ›BÀ|f8=F˜L ¸a(~ Œ”31…\ªW9÷ÉxB“Ày)ø7…øiSR—ðs3Ü^ÀO>æ0_Àhp¡‹žL6Àz²Íp²±›ˆOÍ„3\'—›D×q\ùyȬùáÎü{6ùî^‚“sqäÒË'ƒl¨·%µ5¦aÀ@ø!m©Ã‹nþÒètç¡—cLÑÑVŒYa3sò©P“‹Gž¯Í ™ óŸ!®åv„gç¡,{)*å!GqÍ2©ÞÅ—M^n¤ß£5á#‡“â¨M7ÀS³õV¾r~/R7lr/½¥¿0Ëæ–°WÒgc·£ëË bB@#™?v¿©RjW¼­üm9ΑXS †ÝŠK/û€²08'Hj7´‘Û K9XH!I`¹UŸâ#±³ý݉€Z!nHHŠðMTÈ>×,˜[+/+É0ž¸»àRGG©x /Dz×Ré¾ y~¨§Ã”)ƒŸZ¡»[4±û8T½o6ª°6Â’®ºy4{+³õ~4æøÛÚ[/4¦Êá rh"ÁþOOíò*‹ÃCIvÃæb%Ý }3Én -=Ößÿ`ég“•P=z÷Qù©‰X@º0(ÍcÞõ«×¨¹ F é”C¼7劦ò=EÓÀ ÿÕb‰¶´Å8Ø ZJ ZZ˜ þ7p!&Fü+Œ"= Ã᤿ëeƒ°°(\ .Ž@ˆ oA m€‰ý7ómquÁ˜9Ã`lÐhkÏŸ¶³rvùúµåkù[üsä/ü[þ¿¢|-ËŽüE~ËÿW”¯åoõÏ‘¿èoùÿŠòµü­ÿ9ò‡ÿ–ÿ¯(_ÉßÒìŸ#ÿßþß/)_Ëÿäÿÿöÿ~IùZþÿ ÿÿ·ÿ÷KÊ×òÿùÿ¿ý¿_R¾–ÿ?Èÿÿíÿý’òµüÿAþ¿ØoùÿŠò•ü­þAþÿoÿï—”¯åÿòÿû¿¤|-ÿÿÿÛÿû%åkùÿoýqàQ’ü…~û¿¤|+”•»‰‰‹ƒ‰‰…qFÛ›˜XÚÙØaÌìM$lMLìPö–ÿšdˆ'Ëûûò‡)`þ‹ˆÀ…û/ô_¢ù«òÿçò±0l®¤°˜¨µ¤¥µ˜˜°°˜¹¥™„%BÈpÂÄÿ×ãû]þ»åßšÿfŽÿŽ¿šÿbBb_Û1!áßóÿWs3+˜³•µ•³•3­³•Æk)"h)*ù…&8[: ª . çÌLLD˜_.ò© Ðñï(ϧn€Yç‚ÃDÅÅøED…>u´”ú¢ÆÊcbbîj Œç¾b!~a!IBDŒ_XTüS_sAKó/õÕ …±Ãx~î%!Î/&CIòKˆ}ê#.h)$üE{´Í8 „„è—h€! ‰bl­Ì,ÿh+) '%Bÿ_ ñÿPþùù—pü|þ ‹ “ý›õ_LHô÷üÿ%D[SB %ª0䚲Ά  é (ø6‚€73Èm ÀŸ}Úêz*«kk¬¬¬iiik6°±9–——ÇÅÅÉÉÉùûûwww›˜˜pqqm×ÖÖbSóM_MÝ ò}-Ö6l{J¼Šãq{4FÃ¥]âV@ÿù‘ò–‡Z™¥a—Æ^|úN¯æF–…Û»'HëúÒû—¢¤ßòÍZeŽhJÕ[ݱŠÎó8yôo9ý?ìV9ùÍ0…Iß}»¢6oñ f%°vuïŒO[¾7Ùp‹²qŽE»ÛPÞM1SJµþPzzy'Çýý”3wRü,B˜Ó fص»rÑò¾'£oHÒÇ÷½¢pÍNy³aÈð©s…‚Ѓ£â:ò}TSŒÓ`™ÝjÚâ³úª¥g“È 3 ½‚¹8ÏÝZ ¹´;¾L?ˆ¹»lz³nPN»›á𾂡Ò×3Wü烛º5ø¦Eµ³÷¼Ú×E Ÿœ[œ¿}Gn&žwÈfÃ̾üy|׺ᓚÄõJÍjjŸ)ÇUö`¬{j» ŸžçJ7`¾ßuT'‹zfw›4mÛâ‘쬸‹ ¥z#ow%Õ½Í9ôúp™»KÍŽ¯ó¡I7õôâ<-)©—b$åKiÕÒ?–y…iu²K»,ö]Ù2D=ÒZÂ+ïÛÀÿ!÷£-S±s>(½ýãy?±Ê…]Tvëõµš¹}Ÿ³f;Ó¡e¸˜Úʬ¯!ë_¼ªF­ËÖPì4Ðíhú8õ¦~—ú÷ƒlqg»?¦»‡oàŠRØRù~éÁloèRCj<ò åÐ[é8û0±ÅÃkûÒc‹Ñe‘Meü¼)†è"j¹ú[/aK˜Bïðf’·ŸÛ<Ä¡mr>³Øò:qª¼U&^2 éŽ.œCym^†T鉔Öåkù=s¹Ü•â⨛V0dÐ`xª¿?ÂYX$Ƭ{ãÙÑfNϨU.c/Ñr|ûÙ|̃خ“fû¶iǩէ°¬XZ.û|œÅù¢¥ÛëŒy7c7úãøÔŸ×^±«9&šlNo=¸£ãŠˆÑÌ PÏRa'OÞ-´æ/ë%^¶%=E€´wœñ(fè— Ú¯žB9´åZâ\ÃÁá‡\ZUÓ*çK¦yçÙ¯fÝQEÔl‘’~ˆaÛ“QæµcÂÕ¢wRMsã“k)NשÒVièØKMÃê:± MÖ¡˜ IÎ|.×o~¿el|<¼jzUðdº®|ç–{‹q®¸jTÁ‘)ÞË©SmãÆæâ»„o庑â´Ì8û‚Înøu˜Jï˸Š=™à&¥Xÿ²›g®+¤ŠmžÀ /ßÔÄåó|hßÉa8m£÷£²\¯Fï̺jO2‰Vé…¾i*]Q–»}|&9 Ú`W#ãJž±4mc„úžÌ}CUn¯ßæfqáÕ7£k75𠓍߻åÛ1Êi‡­qሱdq2P—mýȉÜ{OXÒ]ÙÉÉeFÙÖÞ‡‚ãjŒÝg¢’3+‹ê7ÙLuh™GiUhÒ†bf¯±é;«ÇPƒF3Õ÷´½ÙQ<ò¡`6AýÎoÊ÷åÖ‚pù åÍÝODlw¤jÝ•±æ·]/î.rv¿;d³>W•¢>4t É¡Ý ;ªZ¶øaë„t ±ó¦¾~~l%O½ÌÐYÁ×åI´—`Gh[tZn±/xé#ÔËccÒ¯ØLº£1dÂY²Oó®¿½ÈæM 7úí©; é‡Np£l³O%ßKYNÝèu£çMö ¥ª±›g5¼Î©•ÜœZÖÉ[špcì(Óø¥Í‘*ž;[¥¦h†Ø"M4êM¥” •ÎðÓéyi×l¾sS_²Šs—SÁ¨âMvy_µã ÎZy5Â2F(úCxµ¹DÔçÀ1sWßÅ^£:Â|Ì+êõGífZÛ(•ÇÛÒiüÄ2·É_,ã¹ÉØé ÷݇GîÅw¥ÅÏV8üräp|WRêa®»j¶.&û‚¼Â‹öùæ¤b \¯?Û8dD¹i2ûÞÂþíÁEÇE¼ï9µ*6c*ÈžxgnQç¥8G|¬ŽIͱ<~ç˜a“o7ÊË&ä!1¯^æÏØÅÉËšû—Ÿ|  Þ¿ã)[˜NëÍ®:s»Ä&øNöƒ—‡}u´kf#NÞdxÌ÷Nf[Mzö‡“×Òëw–÷öz¥¾}4¥{¬x ©©Í¿åTðj÷Íýcù˜)IÄT±(vñ®Òâi­Î'ŽõiO„F¬^¿Q?wQk¼é|ßÊlÞ™û1ô¥žÚÝV`iÿœ:\aóñe›+<ÉVðµÙ]¼â×îæ¾ÀÁµp^ßî|³N/Ûn·²ã5o]Æ“Lù½é'ß×ÚÏ¿ƒ*î„É<_¶—QøÖ£3Nk·éd¤h–Û–] 0®õ»ÂU§5ÚãT1¹‚$Å š¼w-§n’œvµ?¤]s«ªBí"`·?•Ñ-õÞŒð?°<Ô¹YÌ¿ÍR|C#ë‰ ~š.ª§d‘ZÓ›²^fŽ>«gäBÖ'8§!楗†OŸ[‹Ÿ2Ž pHCè^õ7-ß$zœ7#ÍÆi𤈋½ýÝ×M<^žR"‘ê,UCv!PçP Ÿz$’cpÀÙ)ìñ.ßfû=»«#ãÖV0)îÀ 5iDYÓ>¯è6Z[>ärfeåi¶TÖfëèëRëS}Ï|KQܪ¯¥å¸àóþFV>pD·†¬ÀQ%cæ¾Å>´.Ç æ#øì‘ÀÅ»)-Ú#»ósÐwÇ_3Z¶±Yl+âj¨Š–]š~J7¿[j¢©ØSø1=ËÞ!j%ßc—ÂÂTŽòã-¨éËm?ýbÿãŽKuÁ—jÃÿ*åôÓÇEž+‹å/rWÆ\•eP`‡Ò± >6Qµ)(½í˜Iz;v̪UR|bQœÅHU"Çó´çª«é©U‰ Θ­­¢3÷-ƒr_m™ÜÜ´”i-!ÿb¾xFn:íaÝž“ÃÝãº<2N{Ôõ:”ùNMÆÌ Iñ–“h§·^§‚ ›ŸìÖ%v?5$»÷=ÏèBÝ íÁTŽÑ=‰±>s»í‡ËÚôk› 3-gPr5Å‚¢Úq·,*ÑÃÙ…Ï{•GŸ5m[t2iz®¦[®Nsû=_%‡}e”Dîù‘Ù ß™—åε7ÇLâ=¿==ñ¶€G³,ÙS8’ž%d÷Ȧ¯…Æ{Þúž×dê‚Êí YŸ‡¬C¯õ!†³B‹¿K>ÎÖ5“œžÈ,×Mó¶Au(ð—;æXœg<&Û×ÇÕ´·òÞ„Ä^IÂ+éó\²¡5Å7YåRn°ª¼âOke¼¦Ž µo°¼ä¶¹‰Ïù8fB÷^†QASÚ‡;ÒˆíZ.^ʬAj?FóFom8ñF&…çBú¾>J†S…[(k°›‹ð†²/WK¶Æ ÈPÎaqÉ o*¹e}B%ÛìeZp^;ýênpi ²jkÕŠ°Ž„,Þ¶ Ú{䃯1-ðîþ£²Ž-G÷>á¼=fD'ã±Må®×}eê 5ÖçFƸå}R.T"µŒde,9fîò3×LVÖÒÒàm¾zÛc„e»ö®dË,Ö[ü[ð•¹x¡Ã{JúŒSÚ'˜+Uì¼¼ËzúÆä˜tZ™¢Ñf‘3dõåÅ û ÕÝYLÞ8y.>«ê±Éùxެ»K÷2²O]ŒÔqnî) fg¾ˆŠ9*ø¢$Ô~¡ò…¡ëa”A£ÁŽóü…2f)O?šçÜS‰ºZ”à'¹çÖû0:Ïśՙ—'/×ÇwùÊßÓ¶VõÛˆáÜš’Ýûò@OÙÊP)UãK–S4 øoë'Í á ’×| /¯Ø¸G{Ö{#ÓÆ’>e7-C3Ÿæšü´cu¥¹êî¬c5/_¾f~ »û‘‹†3¨ÔÔú,K¦ÉÁÕ¸Ê[à‡so˜So§¹7û´H:K¿üâÊ„˜—M^‚ù2W°†»Áˆ¥ò‘¦çOß^Ã^¤Vto5OHr_ó×Ð[¼<¹HM9×ju_ô–ƒ^Ütù™c² –ïä˜ÜÓL¯ÏfhudE‡Î1¿<¥ä¬"i½'w5/Ck!|obWŠéx\õPçžË.k>Œ¾àWøò©m 3Þ˜©HM,m°MèE稳¯ûíÍÏÐZÛuýÎ4ÿ) ˜}Ò£Jï d&íÞÌØÕSåÓîÌòïrÞ©¹3ôt‰Cde q˶ðé´¦¯qR+åÌ5øÚª£ïIÔ&YݸvCé®ç‡&Æ3kºÏz§Ä¾ ‹q|ÇÌ–kä¯q¦4.TÅaæTXÉ‘âw²»¼¸çÂù,,,® »©wæØ,¢¶{Ù“ÙÝá†tU‰k³MÎ÷÷d•½¸~W3= õåHj)Î7ÎJ«Òr9n©xäÄÊÜõûk¡ÖåÞ›sŒ ³ËÍY‘Ò ±3»ÅeUc½²›YÛ^Jh½vWáˆa#kÉ£<†onÖÚ`ÓjÿÂ-‡a÷«7HuD-Êì Λ9¾xØs† ꉦl?ºÿ çê«iÌìކÊîCÆWC7kqY£ãxÑuuS·«ž&&/>îmç¯|ç%¨»í¿®»ÖûLÝÆ3#!KjÇ߈MÜUöÑoŽâRc1FÀ¢!FÏDÓ§½1íT^˜M¼f nèÕ´nIMÿ«ëÉk%g><ÍW–í—½url‡®‰JÉäDzÚ-ÂÀSŒŽÉ¡’ÇCÔTÉs“1zõ/ΩÜöžžè*yÙÛ¤cÒáiˆY«ÛQ¶²aºAù$sóx&CË ¶±³õ·½˜{·i Zú„í®F¤_œ·~WºÇ¬GÔýQýE¯£½Ñw¦Í©ß«¸Bª8R˜gzÍ G¯WϺ29à=ÚSÆ!µ¿Ôv…W|õ!ÑmF‘ÇPV.’~…ãŒj¾k<’snriõ=÷ßÅ=î°6O]^h¸.'[iXVò`!ýh©íÇûJ탊À®¯‘3½•Ñ”×5™Œ7>zÓkS¹­ rÌè&mï°Žàƒm IþmA"]Ge‡>è¥~·ùíÝ“Là™ch×Óº«=eojËö›oa-g&WËŸkñÜ|.£G;Ôi:2Ru£`ÓÁæÔ÷Iñî¼¾mž‡ÓÔ î)ÿˆRŠÐ—m Ümw)³¬(”÷î5W©&DtRð3¨+˨Ç9†;‚N†É;ôì lEÉe…]Þ”¼UcŽvûDpªd„JXÚÅË‘|º=B±¸‰U}È€zŸûH¢åÿ—RôSå>mR=[=£¯ãâR…­Z YóîU¼Ï¤u´kóâÞŒÍ!®[ é^ç߸”{stüX°ÞÌð­ò"4óÌáæ,qOÕʲm5>·Óbi÷oŸ(u2÷ÈXøZ›è¦&¹Òí6¡Oû‰K?Ôœ˜NrZx_Ìö?æºXùô€Ôãºw>n˨çërÛoö£\V^ ¿á ãÊX¬ÆÌ$›t½È FDSÃùÎkYøº Vº8ègß%Ý/ôâUªDÅ¿F °¾Q»ÿ2Ãà]_¨¹ÐÐÛ¹öâÊèò‹šªizM{ù»yaß™ZB¯ÝŸŸÊ—ëÌ‹íæèðIò÷p/qíòo(“ln”’^9ØX|$9ýùõJ]9669“’ÓîvÌ3r¤)½}dq~yñÃü2µ”ÞHŸñÒ`/DZç®ù!Ë ìö™ö§Í·ºâ¤»ÑÝÅCNó±=š< ½oŸº9ÉD_µ›ôZ ¹S~ª3õôbº?7úøJãK=¹‰FöKf‰¸ºÅ‘çº"¾çå++™‹ DÝè—öG‰ n¸O е/m’;6oÆâQc¾x½·rS„°~–è°=ó4àc¹¿íy7¸ Ê0W,»¼0UÙ·Â÷oÕ Û„¶>_|_4|,£§€kóûpq MCCçŽ;yUN:Qš6eç Ë¦Ý4L›×®{»µ]f²½ÂÄ÷’5£ÅoÖé•G1såÁ ÿ8µšÑ6æµ;Áó*׊d0×z¦ø{c€‡}‰¬ªÊ™Ü^Nð|e† Ã!›ï”Âors£‹›S`´®GõßÎØQöèê¶ÖLߌ°wmÞŠžn:‡iš9°ÇØðŽN~ü .µO3Ø:¯p°SóäÒ è.æ`K'ØÜTJæHjËÎ"¶=YKGÞÍjÙbôn3E=™Öó.î>ž´qXbëqÇpeÓæC^•Gk·Þs“€ o šÈi]Vž½Ù'À,ÖÀ¡²•ð|Â]ZjŸ_p|<’°?¢Ùû™ùFk(O¡„p"{J³kóñ3#›>Ô‹÷ݨ¬Ù­#ÛjÁ¥´z‚ug¢õ†’ÀÛ®k<»–}¹¥°ÍòU”i\ÓÇl'ôzÂÔ6ÄnöcYž¸d»scf–£r¨A]QÅÖÓüÐ:îå åà8 ÏIûÊû-ç•pKM¦ÎVr*é,ª«Ö8+rï¬=ê4¯e¥¶UzãMÞk—œš®_‰íZØ2Øž¸ü´a.'ú¾‘7$غ½—ÖuFöµúÜÓ´U¾»áiÊ^è°Ôd'¤‰’¼¼lZv bÈýݶ†„L†ê»|p÷fÔ‘#'EbfƒáÓÍÏÁôÉÆ;‡ÜrÝß½5´›Î„õ N=º?NÓ!É„må;ÉŽb|”:cÆq˜))ÿËJXÂqÚzvŽ0vnÈÓ®Ö“\W˜ëTç.‡æ)›Î†Ä3çË™¾.p¿²vzZ…‰bE3q*µÚ‹GûžD¯ÚŽ3½ÆlQ˜Ê *¸ jtm‘ -™PNö´E^·Ùì*näZ·+ S¾XÛBg¤=ÌÚ{‰Fü‚;ƒwâõm<´³Ìe£ ¾ïÝã—h.…K‡J'2g$‰MjíwkV I—„]­=uòÁö¦–çk+¡ZÊÏÏ4Ó¼})?ÿúÀ ‡Ù®“DO³e8«\»éÝUæÍuH/¯[u×2Ä™8jT{(CÓÙ„µÐ·ÚüŸ™ócé&Bטü¬Ú¾—±¶sÓ©Âû%ŽŽøoùxîJ›¸òÐz°˜û°M3¿ï”6øQÛºS¡{™‰ã°×µ¤ÒS3TÝ;˜fÔëyŽt{5»k*‡Dpn:c\eù@´ûzÐðå<;7Û‘êˆ=fõ<£ÙâÝ’¦Ü§~ 6( sV ãiÆŽñ8ŠÜèÝ{ErË.5/ú`ñÈŽÎY»§ï‚ø|7k…¼ŸÚsåÞr¾¥YBÈ턵7 (h ª$(¨¬§L®€  ÃôœÍP.v;4ÊÌ^PPE“I+CÔ ¤Œ- #H+ŒÌƒq<`åäjç&Ë­„Fa€ðñ€ž§£7Ì‚ü$ËM¼æIÒ:i [3g+Œ¬ ú€„„˜äa"LŒÆÞ ©iåÓµspµ7âO)Q3‰ŠIÖK²Z ØÂa*L‡”À@YXÉ’ûÒÊØÛ¡ÎÀ€Fֲ܂À?–hO+”€…‹ 7ÌÙÊ^–Ûãioåbke…á†a€®ŒØ H¦Émé <íyxîvöö0 ÀàÁ öɆ™Y+ÌÊÃш5€0ØwéïÐù}?Ž$Ö¿'ye+k;ÔZòŸåg†²°E;s¯¯sfBÄ1Ô"k3)˜ÉsÿÑ*(%¥§¦£¢ l¢«®¢¢­wHC…ÚY“€ÁÌœm$ܤ،ǒDÊXßþVÊ„‡HØ·Ã$ù¤Á|ù_ab>ä?¥€®äÈ‚¬tD3ò…Ú¹Ø[Y9¾ÕA’)!6ÎDªÉbù¬C$á´‚øˆ‚•dÎvŽD%%©í??Æ!ÛeK{@Ý“ˆAÊXÿš#\1€*JÉš£;âkK¤º™³ ÌÀ ãeeÛmOŠ=È#–<{ Zʨw'UË“’Cd; jc%€²DðW-HZ`ƒ‘†8‰R°´ÿîàŽ]=:!á¿è¦ „®_÷ú¢ÉwvtFî³ÌŽè.»öÈÜ•˜ádCÔ[´#ÑO6ÃÀì0dÕ1·"zµÖ®öü0 %Ìàžš–¾LAóÌ@AGGASï„4Ð`'PkåfE†cçàho€u7sv6Ca<‰ë˜†ŠŽ’Ð^Añú!½D'ýà!=M]]ØA-˜L[AGï’¾º‚L[_G[KWE¦÷iñƒ™¡,ÿ<°¼ÃìíçÙÀá DkD‹ª¨« #¥x>U Àt­¬HÃQB;z5ñKeµ$šT­D|jÚ‡>3„h—‰* m¿Ø0Ô.Àt¹ØysE˜h-,-Ï…Œ0DDc"#Bi ÚÅÁÌÞù9“ÖþUpt†‰ˆÃ„áR¢RpQR$Œ_%Á`æžäyÿÙµ fÛ¤ÝÝÝ>%¸í$å5Ö'íŸBšõ†¤h…丬¿áþd·ì,-í­¾ eH³=Ù%#H¦xE&–h;Öód¤´ò÷¹žÿWÊ×ùÿÐýŸß÷?~IùZþÿ û?ˆßòÿå³üÿ;wˆå_“?œ(Ñßû¿¿¤|)K!¡Àü'}ÿ]ü÷ù_S¾–¿ð?Gþ¿ïÿþ’ò­ü¿=õÿURòßÄñç?ÄD„Dþ8ÿ! 'Þÿùýýï_Rþß;ÿAÊ|ÛÂtÉIqâNûïC¿}ü/}5‘tºãÛ ½8L‰ÿÙ˜þik0¿®Àœ eú¿³¹ó…vY;›Ù›úåèlõ·Ÿ2¶ö$«JÎØ~Âh¿ªú£ND&CÌú‚vtF[X¹¸ ¹‘ÇD?k¼èO5žÇ eigý}Ÿõ^ô§zÿýÞŸÅ"*ù¯Y]-}¥Ïgøg±Â*Öÿ˜þò”ÆFÿSÍϤÿ¬EðŸjÑO¤ÿ,aø¿nÓàŸe ÿ ›ö]¯¯wHýÇâùlÛà?µmÿ1ñÀ--þ|Â…h*ÿ, R±ê§úlEábÿ®„>[[¸ø¿.¡Ï6ŽøÆ¬Á?ÛC¸Äì8y_õ‡ÿB·áÖÞ9UFá‰þ¹‚ˆ_ú›a}žòðo-±Ø:Cÿj$’ð?ä É"ƒ‰ä±ý¨þ \ß¾&¡•úbGWs{;‹?–ÍŸa¶l‰È÷1ë“Ôò»Ø‰U¤|³ÖŠ}Ö21qP~0>g;7Àk] Ô70>ëšâG0ˆÁ7Ò ú ì›â`âFÞŠ–†}+þÏ+&ñs v(ÌÀ“0§¯4é÷7>+Ÿ˜äÿ ƒ ²ïaÿ¼êˆ ýŸ0XZ9bl¥¿ƒáóº .LÂð3=24X‚¬G d‡€¤9䢻øùœúŒŠì2ä`‚!>»HÿyŸq‘ïŒïóª!.ús˜£ÑöŸX°nêˆÿÇ(k;Wò±%òöìýƆˆ^;Äáÿ: gGÌ:àÿ’Ƀí#iüÓ¸?/âbÿÞ¸íPÖè=$?Xg݇8¼Ñƒí*‰uBùyæ‹ÿpæÿ¥¥ó:«~®f€jñg^éX}uñ{Ud~ìOCÿlpÄÿÂà|oèVŽÏ?«Îg#.ñåýl Äh ¾1äߨIÄg €úËùùW+ éà×÷™=?XÛÐ(Ìw³¯FL™}jµh-‰ãÿ–WˆÏ–ñ×–æ¯)Àù}—”?!ýø<î¢$W!JR±ÊÒ åêð·–ä¿…¸.|oF|6YøÿÇÞ•€5qma­Ö½ZѺàA\(’L&«ÊQª¨HI $Üž¨u}‚ ‚V‹¨-.  ÔªU«eqÑŠXwDD´wžúf²0Ì$L‚¿oŽ~0&Î]Î9÷Üåü÷¬±wótó&Ù’(V˜wsÁ¤cßñ™êdïíŒ}íL†ÚžîžSfxbÞ@S>Èbe ¦–I¹é(ÄžšÍ80œJ³² C–©eNo»B’wJÅÐÒFÞH­åé9³¨K¥5† —&2, ÞѺzÉ ‹°Ñ¿!“•CiôRœÆ†Dâyfv¾, 9‹R­Ìb-; 1f,@MËYÈš†Ež‰,hX ö;dX³ðOèä[@’¦Íl 8LqøJ¶ÄTZ’w}d¨8åñq+Cã í!$èã íÿ¥ÿŸÀÿ„ÐòGþþÏ „–?ÍhäÇÿ äßö„–?Ýxäò7aåßèciä—‚(<ü•N£ ñ@ ÉŸI¥ñ? BŸþ‹€~ЯOýjõ™P»© 5¼—îh, YÀ °ÓÊP¯f+EZŒWAA…>õƒkIc¤dø"3XKw˜ª`O(Æ+UWà¶T|ȈˆºCÖ 1¼b‘£pjѴبpÈ”ððŠEÎËAVžˆÆƒ-Ôx§)“íÝ<›Ç‡!Šê«ø:ãÃð"®4Â^xÊh̘Έ-ÌK ‘Yš1MÚÜÞŒ¨Ü™&/B¢Ù ðšOOæ I”ù4&PX]?Дæ·Ù:t ó˜ úé9‚~¡±[ý‚_OÓZ õ¢‡c‹xA¬1À÷dDAËÑ p>O»×TƒÏ#Ì? Ö Œ;Ž(]ŽûsÃy"¾Ä_ ¯š/[†©>ž˜;:]«{Šé;]kÎáв6f*W¬sÈ—J´_þ¿D,–aƒ}4(¨©óÍ•/›Ê•pä£I®®4Ø[~ÈRÅ"DÍÇ…Æá!{Zîµgè=Ã*Û +}gºqB¿úƒù¡r³¤r”iAàøÑ5i´J«I¶¶ZÑEÍ™YuË)çË=yše(“D©€eÚà"zÖ$€öÍU…‘`Àæh‰f½r°†¡ô PêG1:þm5ƒ¦¼$5%Tƒ訄ª!%l´“m¨?j@‡¶Ó,d£?,d}ÄÂî2Ðnìæ0-ÑB‰,Š+Ò>£E‹…¼VPhIæ&p†£Nj„h ½ëÆÒhn´Ÿ­„¤»ÛÓ!ÄŸO&‰#øáÁB7@HÂüpùaڤ׀,dògÑõçV+YÌ­FNK¦m2 ±F#}:ÜG‘XÚŒô£ÅbêÚèé\g‰D,ñÖ§] ¸]ÐúÈN™ÕhkáX2’¥â—Z[ËÅb²­L¸­*Ü“ Ð)ÕÌOÄä±°s"±wlŠ!ÛÏ‚Û?/S5Ý›¤zK_¬+$B+’ÂëÍŸ/sˆøP7,e\õ¡ÃF¬=[gkßœac83Ò< ´?0{$|©’=ªJ½IR~´:oI……l±ÛÍñìs°XF‚ck4ÄlÄʳլ|[r (Ùo%»…Kù„P¥4 åQ|âM’B„žÔ„Ì#lì%O6b“Ù:ÛäVé ´oSÅóø’é2ùuÖÐ`z…Tí­À**V°jüC¦¶A§€ª¿‘ð¨ö ³Û ³*UÈ-œ' „¿hd‘ÁØÃ‘¢+ÇW$dîc³ Ê)šR‘ŒŠS™PУA™DWªÔ¾ìÓŒ6yÕöò=ž&ˆ‡z4(“È‚À(˜Ô ¨0k€"ß©­ Ú”wòe2ŒbˆES¹’0ƒŽ?¸BÓ¸j›€BCØBòLïÃ*±üP*HuX…W*LuWQoÙCªº°ˆ|¢pnèÕ¦0ÅŽÊ_¤,Ë&Â&–),ä;ç½6ßÎP«ìyò âhÓKhLâÚçJhü7ÃxðÿTÿoBËŸi<ò'â„Ðògü‰øß!´üÙÆ#"þ·A%Àˆâÿò7aåÍ¥üph#áïû\Å€ó©0Nüw  4Þÿ£S˜í xþ'îÿµ=}v÷ÿTz©PK ¹Ö‰ Ä…@Ãǂצ•ÐÅÏŽ©x“¤(G †iÏ‹I'ó\õó­éòr•ÍQ;ékú5Ü#k$Ǭ欱ŠÄ™ðùZ“{Z‘Qb™ NÛhdƒ¡>¥`3£y¨¸Â¤,›,¯QÎy Ü”Uóø|Hrá1Êäï0 ›‘nvw™ÇfâÍzºfvÇTª{^wM/6—s5q7: Î!n2ÙÚ®SÉ<Ý46O[Ù4¢ÈQ2­¿tHMYMW°¡õ÷#è´TCg1äÕ0á”èZª €þ6ã­¼ƒ_ƒBµèPTºÖüä L–‘Ö¤äL¶‚K,6[.Q¨dtþàfŠeÓá„êPÉF²MË“¥*Ƈ4XY `7ÿ¤0©Ðf¿ÿ BzB¥€ À‚>ü§ÂGR 'ò4ȳ‰=D«¡Õ)”¾pØ ûÓE|ì?–Ê`µÒxʳø` EÍô¢£gÀŸÀͲRºŸaw2W$‚þ GZƒÔUe©a¼–”A"—IHAb‘Xbkf. ÀÌØœtÑpt…ÑŠàérw~+5xŒ Á¢W£sHy E·Ž*"´¤£-‰k¢SG[R`óE`L°¦™éQ©<¬ªÂÑmØ9—4[y•ßO…ìÕ³g8zc!¨¦5­­…ÊžEHÄ2~ 4[«oxRSôM¤Æå6’Z«÷ On°FN…ÃtÕI½$×Ê:‰;ÚhfvÞ’˜ÏwÀáv4³ó }¶}ÃUJ¨o3¸BÙç©’¸=ƒCaÚóùõW/›ôÐ(Fž 4Ûê@@:H j ¡ÏŒÿEà Chùþ‹Àÿ„Ðò7"üqþoBË߈ð_þÇ „–¿á¿üA-#ÂøƒZþŸÿÅ t*¼ÜÿO؃Vþj7f•Áï„ABWß%A?åA¬Ãx:‰H‹ÿN%ÜDþÐçT üÿ _À(Ü…@øÔ@z` ȹ,6CÀþÔí#¨mI¿ñÏÐ¥mã`‚hûO¥Äø7 p¥|’D§JÒ @B‡m¢i™®ÔùÙ0‰Ê°¢Ñ$H^VLMõ&œû„¡!÷ Oo2­X$€ XÑ(,â¤×H¯ñ¤KøãŸJ¥3jãŸFÄ4­šêéúU7Sx0~åÆqò‚~ßo×®ÃÅŽ §‘oc¯B¿(S=¼ßøÀd2?´k7p`ÄéÓ§wïÞmccãïï?a„[·n8qbûöíÆ [¼x1ôƇž´Ÿ’=µ—yyNo7ñÁ5A»v¤vnNöÞóÓêÒÏGWº$ýÙàû wæ«tæׇE”gíÚšã8ÖbõàVNàò9gÝúF^ÕÛ"Þ}ñý.Z½]ùãï§Ø¿ìjâ4ùïÙ¯-L~YòE€óž´•¤.ÿV|S»>®öê¾—ŠKüCx벋 ?4ôJwî¹÷ФAvY.W M§Oª{]tüÅ ÓgàÅÉþœÂü?‡ö°LÌ ÈL˜bãzÞ§SÍÖÿUdšPÿÛM÷„µÙF’#y_›…=ªˆMx¹dáÌ{±vTû§ì.Ͷó5ï4d^ÑñàÐÛôýÇŠ–<›ó¶” zÆ:'î.ßV7x|E퓨šš×W¤YïïÏ0‹ŸöWs¾µ·ßå]N>åörþã~û«ð:?¸½(çÖ´·~GÅŸ^Î\3-~xEI5£Ö.£ú•ð/Jwóþya_ßí=o{©_ÏË…Uõ>øÝ2iÉðЧóï‘ø/g Sî¯}ü;{grÕMÒÑ,ÿ'>k¬¼C2,M²øŒUá¹…a±«:½å|+Ù:×Å®ýÂÂu±9ÑSÉSb‡¥ƒìËê¾0÷FF2%ëÔ€£ÝoösZ4Þ®ôèƒN¦#ç_ø:ƾÿõ„A/ÊÎf:ë—µïPƒ¨Ì=SîþOÚpÉÙIƒ^PCÜgyÎ/s·N|Üs}RY }s\ü¬äîKþ:˜·ÃË|B‡Œ=ÉÇ}Û{•—§îõà¹÷47|kæäëùÖÝSJK~¿c÷ÍüúN#)Å«cnYô4´—‡h[°ûøÛ´ºk{6/»aûßjWÁó >Oz…ºíõíçUîþ²:Ç?zöêXööK^Ì\¿¼hONBhU]^åà:Nô½éC6Ôò¸ø:ìr™dÆŒÚ!zí0÷¾ áß´ÿ.˜>¾jë¯ [ëÜãüÆuð+\;w©GΨãÒÇ;e—Jjè¶Q.W—û±CJ©û€Y}6îí:iÔîáž®——Ÿ):0fí¹GU]N\É+[ʼn¾ð¼ðæ¢í^¿çQ»Nùº(£ObVÃñEÝ mÂ×u{h±±h@QøsÕ²§Õ±«ÂO‘™åD½^”S¶²ï žÉ¶Ãëý6y:å {ñàÍ‚ÝcfÄ”$Î>pù^™/UrþøcFiþ r/ß=å…G#g< ›ïÓb'++r§Kùõ¹ÌôòøsoS¨/+Ìûœ+º½¿4³µvý.æ Áq÷æú®tóŸþa‚E›—Í©ÿsè»ë÷8G¬î§NÈë¿0{ɹ?BBï²7ò—>¦O²‡ž~ûÓÌä¹dbˆå«Nkvetþ®sÎÔ½‰óÌ¿²¼9×-Îru mGŸA›—Ìù«dÀÞ)ÎÏ7\üpiWÔ›ÅØÑ'÷ˆæˆvõ¿T‘´Æ¡p}ØãXë¸~íÄo©?%ßYkq&aØid=Ž—è{¬GUÍÝ7ÖËÄ}fúà¥`ìŠÿ³ýë½I¾ÇÖVæÌëgîŸ÷2×ìPlÊó™×ßÛ¸¦¦Æe9ùn©ì<ü|¡OèâЩžö ’ó—DkÏK–OZç=ñçü¹fU¾Ðï齋’‹ŸÅ\19íî)ó^ß]xã)Ž“e3I.>yRºxÇY?<íÝõÛjѪ•“¢FXXÚaeü™‰Ãæ8=¸SÌžm6î»g.<òrYdLroëÍõUic{ùeoÒÐÙÇ–\‘ÄÉDíy?®X¶Yjq„_XsåKÇSÅÑP-¢÷·ø´œǧ&YÅÂþ ÓKÉ;éeÊ{SÛÞ²4e…ßoŠþÉ]pôšÿ.ÁÚòÄhÓ‚1•β‹ÛŠ£Kÿõê·cÜ¿%}%ykn³-ŠÎ¾öÓ˜i&&ï÷ž~tsŸC~?ÌØT·ôïCõïFTž9bþv¡ço³×‚.ÜŽ5¢þ7î|tô`L¾Ýä¿×¶±3; ­[5Ô«Â:㈠ÑÜú†Jï¼î/s;$HŸ‡9²¡PéÜ­èiÅ3k»Íu_$g]0ÍÜRgæ°¢ÂzþX¡eårqæÓŽR’mÀê kTó‹Éü£[^]¾:­çˆcÔ3¢þƒ ~5?цº€ŠŒí³ú~bÎìoÌkÄkW «Ê²L êN‡ðö%çν;fZÉ,r豬~¾µUAkz”¥ÖØF»ŒÙq##e¾õÕs  .Ì›;~²³§¨Ìc|ÿPoX±ÞÎvZ¶xgÎΔâØUœKç w ¢þIÙ“R³Ã äF†Í7wþíÊ‹ì5©oöÔ˾L-8¼-e»ôq´W½Ã*Á)“»‡–æÕ%/»Ð7ù‚.}ödÅżÎC"çŽ.÷˜ÙsÛUþ±?ÈIBAç‘‹&‚É›¶u+Ì\¿ó¿Ååï‹sïs2S(Ï:¤vµl¾Q^{þ,Pj–"8õG¯à¢Wg.wIIí?‰Ö§’º+…èrïv¦×g_I!÷Ž|9ó×µôC9íÉ¥ç½6üÅñljŒÿ¦û×÷èRáw‚du³Ï*Ψû‘ÕÏömg<ådÜžæš:ÏÉkØ´U›‚½´°tèðݾ§Óö%XV™Š<ߎs ±_Á(š=çìPÄés‡Ï>ù9êÒ2iüá!{{¹vœ‘ó÷í¥Œ.éÕ/ç™ÓIæ ¶Ý”÷“÷aÇ^ç.­uè@Íûí‹9EWgç·ï•¾Ä{ÌÍ.ÒKÎý^moz-i£EžÅFN¼KØ3K ÿ±¥ÇïÛösÕãáÉùO z¾,ÈœYW’ð˰­>æ5SUœ/sæÜ\7òpû>[¾_Zéc.ù?{_õöþŸP”P¡ÂØÃ`̘S²DD’BÖafìÛ˜ì"¡„ÌØébh±’--ŒR²f—De/Iý?£î½uo·î÷ÿÿýûöÿ¿z^˜ùœí9Ÿó<çœçñ9Ÿ÷sÊBS÷â g…šœ:í™gû©Ís3"ûp«¼†ŸÕ'GáF`µÊ'±[JfNµ`O•è‘*4Â|}Åfz³­Tº¼·<ÉßEΰàâæñëQ²Ü“ìŸÑsd-°ª“1UÒ¼V2~W'R ˜+{Rb½³äuóRá bxH¼Ó¡hs$~Ä`"H⺹´ÚY—rpOé6šÙeÊö‚]·²ŒÜ)±tkÌ«Ð'ZÕ”;ä SáY‘׊ÄÇ´aúc|öÚÚ¸´&JÄàÌŽÕ×§×XQþæþÓØ‰.*ß[¾ʃ“þ½ÄÄ`r°Ë£Žì÷¼.5iáÜiƒ¡Î’’”;8Šý^¿É]-Ü œáÑ–g +‰“5Û8FD‹¡DwÝá\k"— ¯Iá#z”Ñt]Ø¥€÷fæPa‰ó…vV¸Ì¢OšO_’=Êkº…?mŒZ?dÇ{`©~›ÚÙͬOšåN¶n²Æªˆ¶¦ÉN™P݇ò»ï>ýª;€^1Þ…¤_½˜‘‚žãzW°a¹ˆqéþÞˆ $¯.ú¨-±£%Õä^$Olï6zвó¬hÏz4ª"³2–²k†’ñ[Ê.r’ð> T)û™ñùêTŒ;°Àˆ•e¾Zü¸é Xm0&8UÌ5ÛhÎ ö!ú»Å„qí”~n;FQ, rP“˜þ:1¶œÇ[›ÅL~©^Ê™¸3ä–ôĤK OÒÔy×ÒjÎ:ž–ÖËëi‡…÷"‚N£ëÝxVùɳ¨M¿é`‚7ŽðÇž!ÙÏEîò/`ÖLŠî ß íBrº¥€{ ;g¬ª<´[ë—™î^ ³Eò3#ˆ´ 1Ñ’œB9ç”^’¸hu"A~FB—ƒ¦»‚XJ^d…± ÆwýA@§dò’©Ü\œÅ¬”Ó]ƒºÂ{Ëx‰E5ûºÖu-ý&ÊÁÌ×dcöÆ5ðƒº}˜'Zwp_ZÁoÇõÚh³Oßn‰¨6©eÇ]JŒ á³¶ÐÛ¤M7RµÍ ĸãsý®½Y5K Öß[³Ú¸OÞ,ð‚&î9¤·fïn™”VD´…leÙæ”~XÓó¬ÊØåÑ*¾®.J†çh/æ %$"øÒ†½átKß‚z%ß®ŒÁ6 B ,]c¤dw^äÕÎ>7—£‘´Úi­G§ÍÞë£ jÑ[Œ^ÄFL6 nãî]ª¬8‚ЧôÉ/91£  ï==úÄPó^2)¾ø˜7÷ã¤U3g\ÚuñÕs~…³½ZFVçü×n¼¯»ø=+~J‚Ôõ(<„‰ã)ÒÜ8½!÷€Ã-¦\ù“ûÖõ]Cýfz.ÑÆþ¦æ¤ÕF™°Âz–­qÞI|R2.Mà£}e˜LÓíØÍVQ V¡­vê3*$Añ…ÝÄ೓ÁªÔÓ\[ò#o ‚òwvQs‡ÊFüT ÝðëŒ~Ïm`]óRÌ{þ)ÚYPýŠàQ=ú85¸§ãÞ§I9.Ï5óßš?¼TØ×%åõ^-ئ™Á#Åiͧ}¹„Ê"&´ å4;õ¥â˜yQÀØ!ÛY-NcñX²Þõˆ"õ8vÊßÛžf"‹çàðègj+°ÞzºP×딋ûôÍîšQiš¨d|ž„VüÙDZ4ê´‘Žå"¶üÎT:"07X)AlÌ8{dýûNc9l«Qî.˜ç¹z_PÏCékÖë…+zîß’2‘È’2˜jÐÄÌ­ÍqÎNmÜ>!öÈ nK 7H%ÆX.]f‹Yš25Ïå ´{”¿Ââ~ºØ«³í¡†nwž«=ÅÌäóÓ•²4]ª¤2Ç© fŸá}å®’®k=iÎL|‚=WT|º_.ª¥gÝÝ甑 )åœqí-þ6“õÎ,øãðh‹¶OyÕ´OYô¨•å‘%^•»4=ÏÖ¤åº<ÕtéÔÔ7`, èÛ|ÉÄÝÜï/Öo`kâñéOÚ¾¸ôŠc5u)¥%êÝÐIð,òéž½ïõ>¬ÃõÕWí§ËÙ½tEÊÍè_Ù÷žó–/`ª­øˆÛLDV<Ä‹h¡ð½‹)7K_¾ÀdyB–+ÝÞ·ˆS¡C¿ãcW08lÖ(…ÄÐ$Ú….wI͆×4^àéïÁ]Í•ÖÎðÁÓ¤s•†.ðî‹Sɘ3ŸÓÖ_gÏæ{„p™ë9åÀëÿÝ‹¿ø*ûq]æ°Ø‘ÃioØ;–žîM’Ê‘(| J#„5 ï` 79æ¶<ó†·Ÿ5}•÷½ÎÑœd¡1cyÔ¨B—ù,oÔS’²îÜÖMÎx“Ä}bMGÏù1 Y'3ùµÛ— 0 šÖ Ð厶Sçtb£&§dEB¤ŸZeZö.Ijnãì]wómáËYÊ«Å& «ƒÖ†ßknà,¹âø`z°ß{"îdMz{Â=ÖL+ ¡ËTμÝ*V#õþ7;2üœ‘›ÒjO†‡·_Ge1†Ð§€,å5!5:{ÏV¶ '©‚6™³©ó­Òš² É±†— *zƒ’½ ¿iïm³*jÀdº”8(a¶nH U:¹ªºaóÁBÎŒhÜêL—è7Sß6*ìÅœ¼O3â·»{Óñ”iaÀ?|Û45Y|[pŒ–o òaç¡:’µzñ9e&°ÖÓ6®J˜ks4»µŽô ðRŸ,\3 W=WF”‰l~6š{|•Ëî‡a-ÊÃØMÜàý¦[÷Ÿõ™\R„-ˆ ÁJã±#ÉC»ð¬/ðíò ².%V%hêˆhŠ,îÜåüÞ¦ã¤;†0‡äÒ`Õ =÷m­”OF€™ˆWãÝGdÄ* ]wKa8i£(ŒšÜp”éb×ÜÑüm”ëÚQï2Sè-¨ÏÍ3Êèó6¥ ¦H¥«Ei¦Ñ†YfwghB/ñôc;ЂqÕŠ‘¶)—,ˆ e°ï}³¦Ï+ß—ú-üyÜ s©8•ý0GËl.Ǹægb“ÏîÐÚ¼"Fm_Sµ€59–G_uH@“•÷c3%–ž5aJ3§ò3,n Àñ;Âm©¹ª÷l|˜Ž<Ò‰L±2 ‚ërChâ3«¯\J,\ËÁg'ì9ªcÏÈ.’™Î}t’Ë‚Á³ñ-û0Us0[daêj ©ËUŽ‹ä‰ë‡²-¬Mò|¬š5âXK”ªßu§´…»Ïx¥…³Ý+¬[[–'´Ì›†ú®i$O~QDJ‰»ÿvk¬é.æ2ÚÃÍóÅ•×}+lôìÓ'â÷xó®VLŠžÃ}Çùùç…l4/°rÜ«‘ÆdÚ6®F˜#z–ÞÌmxtά@_G#­*AäÊóQb•ÛÎýÙÝ\”÷Ýe>” ‹6ÉóÂ\ðCu gEgRã_ì0—s4m‹6ë‰Ñc&ê ó°Tz¼Ñèž'¹ÆÑ4·îW¾í-˜´!ã8ILÕly ÙR¿4 »ëÁ‚ÐbÉemÄûêT)íê]ï —d¤#_Ÿhz_0@žð¾ "FlI/lMOËtÌ·ÉòU<~2}~¸±vª´Sp½²#ˆÆ=®Á…yÚ4bñ^Àe¨‹ýÜø ÅÎ'±'~ +>|Ž¢ž¿h#™m¤Gˆ.½lÛ¤ñ–.Ôñ®H޹$æm`Ô™)ÛL~ÛØã|p©ž†Õ°É"E9³<:«™=o•iR.,› §ryî·Ó·IF³‡äɵ—˜¯[JćæÉ¡ð•g^<ì’½7¼>dYG”2¤*Ïä¾!•­ß}]µ··›Ë¯¼fs‰ù”éüΞÐWs`ì -9ÀYu™_&ýÒ²˜Äqm>+éEpÿ•†.Y§…M9;•Våó{šÉà—–ÂáSÀQuÏ8­W|0ËÖ% ¾ÆoŽz/ÖC†:ñHŠö_d¹5|óÞXl~f)‘þ˜øʨ³&JïÚAPØÄú.ÙUᥛ_ËQöùÞzBßÙÃêª#…«\%Z–u-0cAµ.[.²ÄüjQƒPkeÞX—ìíe)¾)àï>›Pà¯ÛR¢™öŒYí¼ºáÞÎùÙ„û øì³WÃò¨³çyŽïF QÙw¸X0 {L8º_¡íºZCÔîi¤Â!xeÀÞGÍs}á„¡âr}¸ûõ· ÀÛ¡L^Wö<\•|À} Gf< üüÄ’Ãu²ö¶ÜÖZdŠR8¼mY¶ÿõ€ÈÖKÔ/”?Åä>çë67OHhrxúÚ²©“^BcEW)”0+Cî7‹e]\ Ë¡~ˆ‡ø 3mõìÍ'®øÄ·V·„ëy©“/âíÅ×ZGK•¢µ¤>e¥¾¨ñÞ&t˜Áœ Á’|‚)ÓgmTàö7¾D>O8£Z]-ÜÂÎãA°Ž^NÓL6é òˆ´ä²W<ߟlò¤°/Za¶ähŒŠ lÓ¤ÎõÚçñÑ›'uºgìÞÇܪ¡Eì9&zF½®&²„Ö¬9·d@) à³Õšös‚HòƒŽñ]„`ûÝõ…aΖÙ‚=n%S7¾óQ/&;Þ=!0UµóÖÅØãSÅð]´ Úûòyz= É¡=œÏŠduöïÁ„Çtž‹âî)‚½8zÚP C³¼v\ØéŸ/φ!Õ`‚÷½ãµ<£ÍŠ9Ájºî°ùƒîg“ µ…Ô„DŸ§d#‚D² ò˜ oŽÆjk‰*-mIPb芻,®g‡l§0^EÜÉNVLGÆjKŠvèj¹öËtqªÃÚÙ›Ýø®9@+®Žâ ™92§­Ì»X^²«">UíKðÆù@ø˜^ÑÊZÍÕ[@F;)×ezF_:†ÊpùxŠÕ–Á .? ߃™79ܰ4bBÂUsæÏ¤]zKÀ¿h²I‹¹ƒêl@-Ê¿;ïePrvAÌ{Úªk‹Àp¿¾?÷jÀø¼ª@Ssí1æšô #*‡Z¤xýz7´Df ?E@™‘ú -w…ÇB¶Ç‹³,A·æé¦nGI;[jjŠ)]!œÝ.´h÷$6Ý¿b%¸pg( MñÉŸL‰/“;¨žÉ¾7&åÔd{·ÆÄ~‰x‘uFñ‚ja«ÿMÔÕ“]ͯâJB×V©ãû°#Ï혷±&hƒŠGôG…ë¤ÏWÙXvUv4é•ÛdË:H¦$Þõ¥Rý¸D, Á}É—CR­Grdqšr]îRBy¯ðPŸe©¡ïÐöÐÕ´ÂHnâYJ/Ùñòz8m¹tóØ?¾3QEG63šDʼn29&;OžEága<ÀËN'êµgÀd&ÓûTõíä9”¡íë²¶Žgö”µ@zœæKwÑ0ÌŒ·à°Â}mõr¡08p•y\ñ®HÜ"Ùß¶5u¯dxäPÀM9doí£&±¸úµ„YÂŽWÌ¥Í"q€{y{Zù~‚OˆÁ-LD=ðÝfv]–±Úê†ÆÆtÈ +yiJâ´þVÕ­`¿yoO–Š ȶ­«Ð^~µÝC$ðòØ#°¤‚b©´é£µß?.x²¹'éõºEÖ–å–§ûÞoÑ.¥«X|Íê77¸3kš{ ¸vмnt»4CâG_<÷í‚ ¡å–÷—'%6‚rßô qÕ©^ò¤]Ø«§°/F¿5ua¶_ÂYMä5‡Öú{ÒûÝñ¦ÅtÁØz;P|ÐЬÊ×e1¹¾³.çY,2æÜq=ݶ- óÚ>•=xïùòÙêÁþWwºyæœ:JAE©ïÛ¨ÔÉÞÙE¦TV\È¥ê)ÞJÀ,E.‹\Ë›?ÿp4‡cøŽâ5d-^^Õ½»§RcÄa²äàòôLå çÑŧ¸)ÎVt2•uä>HÙlA–¹ƒX0àÜCyì•?û¸4—­S/H`oÔ»¾Ã„“ãȪõõ?c»ãRC€,æ÷&«½Ü ×…öóò*w×¥Ÿ z× ýæM{WÒ]/ìö4³ÆšwÖ&<,#óæFɨið½»îrcÞzÌi¡1Ñ+bž‚Ì|ÂÃÇjÎ:Ž—™£iêé2<6ѽ;–ßJí½çú.~AÓ¹1Pô~'WëÍh–îb:ÖOô´¨ÈDpZÌ–¥èwçC1ŽW[о>|;m@|…é«|!`¿Væ`[Isclôùæ‹}§ÕA´„%¸þ‘ wn‹6íôí¾ˆ™Ç€ãFÛˆ+e (dÚ·ÄUYÐýN êŒEwšàµtá@¡uê"Ó¸\ãRV_ fvB¬H^}“|§Âd؇§¤©ÙÆ\‘Î7!a1Ñ„8fdÿµ‡žseg°pK£Ëë.é„£V[ÑÕ»DW·‰T½0{²ÌJŽõ 7¹ê,uäŸÁ¡>­í0Ý·I&§û’)¾m ’£–?.ÆSr‹‹âè;>äQ«Øé¸Çßö7/t£ {.y%ZÄt%ù݆\xGZ|žÝ ØïÍ÷Y5¶ú&ÜU;ë«åiyõañ\½rPv(k,C½wŠQ® bnóGcÚ÷6ûÔ…ó€uFóפ“ô½Y8G†ãYD%P{D*`8Ùua»œ¡V®ÏYÍ@:´Wa‰ÿ‰åEÛÚLk׳ Ó“¯­Ö»tËôDå`ÃJN ¡¶áÉÕ'5½èÀ}âÍ'–¼™[O¤¬…žTT)ìiœ,÷:•w½µ¤g%0©ZÒkf~áÉYg…úT‚,uyazM_8¡Ö|}¶Ï‹¹ITå%a€—›/̪£ò1[¡œßf=‘Z>4&xðÝÐ$ª9ífœ—ïBŠPnÁ¾óÌÕ7Ì õ·×ÀÉá>°¥óšï‡·ø+éùœ6SZÚƒÛŒ+ÊáïcwÔ:q³g·°;íÐXIUÂIèÒ:p™?º£`z/¯4’¬îÔ$hhÙ2ÌØ…í”éI”cÓzU‹âœóVm¼®Ž:°ùJ™–ŽU«X¦g¡K-Ñäå´æEF·ü`‚1@ýÉ¢Xte7(¿5Û¨\¸4Þým%)2üˆrL@Ñ“‘®ÛˉÚÛ/­—ö!._cy1Šam©‚Zf‡+ Å÷Œ&nÈ,W´¥úÂ6+̶¾ìR`XŠOÆjß[ îÎî…#E¹¥Ûš{Èö-¸Ú¹gBéÔI+®ÆøÖþbá–^Z¢·!PKn;%þr.œz¼—©G£¶v¥¬B#ÝX¶u[¤˜ïU‰ÅÀQ¼3;Ô5§<¬ãsxzoH^=ƒ@Ä…wu>In¼gÁÔÒ‡cã,ëz6bhÔò“À\}8U“× ^ûÖ{è&ŤÇ6’ re£ü&tõ:PlŽK%Äþé&ds‹ÙQ]• 0[Ë,w ­ß2¤ÜÉפúÉ,Ö.I\ØS¤x“´”îfÒr,Œ~)!¶äZ‚‡wvÉ{7ñŒsxòâðì“’u]/M'’AÎ|Â>¦ÀðXÛç误~ï)úðhÒÚÕ-UòµBBÄ爼ã-!Û²OíIhã¾é/íjWŸÙ®PÒÌtð~³—=ŠQƒ_ŒÂÀuø³¶8i$/òI6^ùU l¼Î¾¸o]•TV*Òz0*ÖzmÝ=9¹ÈM>C¤R‘@áõçlo¡£Ñt÷Dÿîp_ŸÊ)’B%Ђ.þ3 µ;Y{¨ð–¥™Q4D¸Ö( ŒÖØÁsXÁÐûÉBý©Õ}laûĶ6©e„‚àj¼v-×9œ_ź¯j¥3ÇLŒ¦Fµ'2'A¹Göþ†¶Ü~ ËBNPýðºäålÚ‘xw3KÅ&»(gŸU¥!þ:Þ®L¢ï0¼1¡f–}Îã, ¸¶ŠÃe ñ¹ª5oN?“lfÑ}jåp3€eÁøÚ¡%·ä¡Î¨nÎ;YB=îE žô Ç܃7Š•!úæØCO4*18½)ºmš{_Ö ç¤÷Ö{D˜ëEøMƒ P¸ox9˲X ûàÎ-*î‡ ¥PBî7˜=¸&9£ ¦¹C³fŽŠ&ÅZ©.Ú¡2¸5þîL~¢¬§­!Óð]ˆ)P,r0‹;Èy|6SôDF¡aßY˜r±YCl:£yóº²ÉRFó‡ŒÖ_Ɇfð›Ky€#´ñÞ¢ÈÙõ‘4“= á ‘V{ÞpJ=µjÄ€í)x‰É—\0><"æU|[wCfa´hïçÇ~ƒÿʤk ÖípÌzgç-²‚ ¸\…z¼ŸípL]`_fÛéF—úbÏÎ ÇÈÐ;kØ£´“ªF6 î31J:ó(8òE“8JÊ<"d%É]Ø@$¦+HÁÎÄì6ô1=ËMÙFÑsEßh¯¬^àèãóºÓç‘ýÛM`$AXOãhðf á56nJ;øxÜéˆ þi©±1Ï Ì#¡¸F|¹NÊJR¹kò®)9vSøac¥;wš•DT& ¥]Õ›.¸ IÊnM”£Ú9Jg‘CLÌÍñ)lÕÁ¹;Â0Õeb^ Ù]Ærº3íRÂi ¡JrRþjk¿M çżš})”M…·lüVö,Hó{ŽÊÐ烽ÆvMj#Fæt¢¤YËE8èW6]®eücõ ¥=0Š^ñÌ|`B뺜ô¾‰cœºÒÚ§§‘¿×*ø¿vìëúòüßO„ÿú+þÇ¡/äÿ‰ð_Éÿ‡Ð—òÿyâ?ýÂø1ô¥ü"ü_ø?„¾”ÿO„ÿñ ÿá‡Ð—òÿ¯â0Þÿgþþ÷£¿ÊÿÏàÑ8{g{à/–„ý3Tõÿo¿ÿ#…£þÄÿV€Âøßˆ_ïÿýúÿû÷@ï+zÉPKY@+Á ôg°ÁÊû‹.6ø_Àà¿€Á$0ø¿ÓÉ”ðo9gT3ªÿÎWàúþöº¦Д!Þƒô•àæ¿g} lþä×üŒ{¾\)ò©Ï+1Í=H8{WY;Fòßq-=ýzI'{ëY”Üó¿*Š']þÛÅÝý¸ëJ öf¸%ÿù®èʘµ–Šv2C³ç?Áõã¤^ Ôþ±íÿæ +!Ùþ²%ÿ#k óŠ1n ìë¶À7ØœÿC}€& ú³>;‡=ÉçùÌþ'æ+ê¬õ‰5ï†&¾‹xå=æ•9øÕ©¼‹¥o4'*ÿ -‡ƒ"ÿÙ`²´dÜêG¨Ô?ÑPÁ€áŒu¦ÝWZyŸUÀ©ŸX³)É`¬3°Gýs5 –ˆÇþM±Š_ÓßÃö°Ã2v>ÆûûŒ è'  AÈ+@àEBAþ}  -6×Ño5¯ €„("ÑR¢ˆF|³y„Ž€ÿ'Mü$AË£!ŠP$­€ü&kà÷5Uûö ¡!0y(0H0 Žú&$pŸ« c+øÞ ! $$à ýfóÀTA>ï¿'p––N®¶ßc‡BòBøT€}“ ~%>ôŸL<ð.®ÄïI‰„(ÈÃ!(4 ¢G“<°©Éÿ% (åaçê„ûÞÍ@!pyy ƒÀáŠßäÌ]Ôç `&ˆ=c›ü®^Á Œ»R”>ÑðorA?°Ï¸Ø»0ãJüžj!y‡’Gº‹€ ¾ÍP-ôç²÷Â’lìpß•]3ªÿ ãwmÀ#2lí+äŸöÌŠµfSÖXI w ¼‡ ÑÞajfL™íç³Ë>^8§•`2X’²ŽÄa¢vœd¸AŒð%€ÊHÆ)œ'°žä‹wZ1yþ°é€5Þ‰äºË È÷ZÉV]q_e?îœÀ­Ùâe]¿Gù{%VvSÀ„<£ŽsújçŽU1ý²wPYùïTÓ¬ë/ë0ÐË?«³\Çè lÓÎŒ ;8{†©h}œô1p #掫ø‚%íI`/{''°5ž±ÉŽ;AÀ@I°‘–!æàC°šž ØHÍÀ@MÏÐd7PN —±T®´cïìæd4ë…%^.ɇ¾GwŸ:(¯¶W뀖¡ P M-C½}‡ƒ5€ÕÀúj†ZêG¨ž³þÁÃûdÁ+}^Ñ)@gþè<0«ÀNöÀ~îð8XD@ÓöÖøˆöþ{–,ø0¿ÒuW7FˆŸÏ•·Òë•샀ƒÑ×ús@€Ñ_QYà¶>µÆ¨XβÿÃ8ó¨]°_8óÿŸÐ—ÿÿû‰ðá¿þúRþ?þï/ü×B_Êÿ'Âÿýÿ÷‡Ð—òÿ‰â¿ÿ:ÿóCèKùÿ<çÿà¿ÎÿüúBþ ?Ïù¿_ç¿~ })ÿŸèü߯ó_?„¾”ÿõü ~(B^áãùŸ_òÿ!ôWùÿå…%GüüiÖ¿Düÿ’¾}þú;þÿŸò‡Éà ¿Îÿü’‡Ba84Åãp,mƒ‚¬ „5Tk­‡ÿ·û÷‹þïÒ:ÿÿâÿ—ô½ùGÀÿ:ÿI¿æÿ ¯áÿÛÈáÿ  vŸÐÿ¡0L †Ã‘¸<ü³À6ð¿U»ú“•"‚ñ<`…f<þõÿ¯Ñ8ÿÿ%âÿ—ôíù/Lù¿Ï$â×üÿôwüÿÕÑÀ¯è þ¾|H|Âÿÿ°jÕÅ‹ùøÜ>¢ý«¨¨ö÷÷[ZZ ®ZýçŠ 9¸êKؾç¿Ãþëx _ólxeD?QZ‘À}Ðh{ÍÀYîü¶×6ÔdêÕÒÔ9GEMGyoNÜ’žíH–ÌÄ­¯·Žr:ª³rh K*¯šÙ±ió”×ÝM`÷Þo¬̰ØôvéÂ[åà=”µ Q.Œ€(Y ö!«>_?R®+¼¼ÃÈqž5†¤gEý˜<>9¢¶ºñK P~»ªøl‹ƒ~²ÕºçÛG<è[‡[F¢Ëµl){0æœ5Þ©þT3V9KòXùêw\òä‚—Å 5¢Ã`Ž·UnòäÄfáMðDøXZÀXE0””b¥úœIô¡Ý†˜ ÏMâ‡42mcÜȃÝáƒÃÏ¥†Áç6‹=j‘dÖŠµÓYC>E eˆÒ9'Öû^e¢£­½|Iq¬{Ä›™è³ é;>²%Úz¼#ä´qÞrƒ.[LGwꕵ—3¼o;n·Pޱ~$ܬ4'Vh¦©FïÏóœç¼Ïó+䟪‘ »QÊàÑÌ™5ÛÿÁ$K&×=!8íN•©v7žî6š¸Œ«?Z‰ÀÝg®:rÁ$KhƒtCJÖ¡ª8òó=—¢îÂ¥}iBj/°š!ErïúQ1SšdR[=‰dâÉ•&výŒ×JºB6yXýRƒ)nŽršŒìÄnÎÒä/[ÑëïBnèî"gÃ泌Oò6²; =3K¹Ö´`,31ÛÞ˜¬¢ö ÙšÙIH¸‡ ÓÒBÓ¶©ÑÍ)ÊÇœfüÍÉ^wVª!ɇM·Js“n O—•M Ù½I¦Ž!QfvŽmEL,Yi~ÙZ¢aá®MR•ÙâŠéóH&Oªµ!µ,¿`R¡/Wª+Ì=ñÚi0d£)£0B<-Ez½ÇþÓ”2ÿ¤¸ Å}YjUb-Ö°v&v£Ú£ÁC+ã®@ÏÎ[Þa‰ÇΨ_ú‡Þ Úx©c;Äeë·?Œ[ºl¯Ÿd©q^>~uþ4.åÁÓò¯”äc/)«ÿëâ8øUžŠ¸J îä¤sÄ’hYLÁ`ò Ü3ò"–s Ëéfõµ•‘xæäâ^¥ûÆ×ׄµm®>&Q:áÅEYùô<ÿió+4d&AI*Ü›J«õÍ?=÷,»´¹AãØ‰K‡¬”¿ìÍ<êŸïßÒøþEÕÓwMûKÊÚÎiÎ 5[À%içC—ïÛ~jz³òã_ ^SNÏ­ºÞv†ýŽ9fLû?¤<$Ù‹ýŸÌggªk.fÖ=Ûæqß`Eãˆ<Ï›<çßÄÇÕÕÇ¿dÙHhÝ9;îmxÁ ²?æb­Ã1îY,\4w_ñ¾;2r#Äcê>™ºmž3w®AøÛÖÇGqõ\÷Eì^œ“ß¾Jfünçg-ù¯dÛöÇi¿‚&gVŸizûœ~ú ë˜ÿcý«‹IêG­*ŽZín^kÅ-¼¯E_ýà£×ŽÁÚ+ï6G-Üo]1õMúÆÙ×ú‰×+½ó+ ¯Lq5UL°Ù´äÄ ïá“ßÏóg]¦¿±9û¬Ñ|â-¶´×ZÑä¡Ç¼³§]Ø»3/pCå<‹5Ïä$ÃO¦¤mÓ=­àùùð÷#ë[%»&œTOßl:n_Sܵ[c[ªœÖ2íš~§¾ºÐXR}Aëý»·Œü’#˜²“ÓJbNÌYkÑ‚/‘¸Ré図ÿ¨dExH¤lvIåCC1’÷Êͪ0ǸRü~ñ«¯'W%)f9îÙZPëb¸é@Á©šEGîÕÙûDÉd4ß—}õÆcW« åŽæ:çØrf”ÈÇÒþ7¶íTõØkøŽÉÖbMw£š4ë8î#¬Ñ)oU Ž.ýíø²O^ãë&„smÿ–´»©5aìŽóìî´Küh»Ñ¥ÂÚÖÄ…@Å¿ÿ=ڜҨši‘ÎJÊ¿zT:í¹Ë?øH e£²¶Ù‡NkÄ:/ie¾n_—¬^•¹6:¶ëQ%ÿŸW’KÇèÛU^ÿKCïuüíAác^lzi›ÆdŒÜ¸ùtñŠˆg¼ ‡ÕÞ9gFy>æÍ†uk5MBÜ*!ç4eküžÍÓ“«¦RÊ•| °žiZÔ± ²\³ö¤™ë¸µ¬ê}ôŠˆ¥r V’ܸµË\[Gp—í¾²º":“Êå´-Ƨ˜«¿ûÅ‹ÚûqzÂɔҨ´Pèðɽ)¹WŸZû*`vVÕ7D„«´Öæì:B£o/=:¼slzÝqfâ]ž#Õq^Bø{fÏyŽTocÆË  #Z­ƒZªcîÍw¹ïIX}õ¸3GN܈ÛAò“ßKK±hf37%¹IMPp¦ÝÐzIʳŸA(T’ÔMn#_…xÔ¤Ô!ܬOG¦5 Oz¡ggvEw—Ü ßÈ÷RveZ¹ç7ãžÞ¹9fIøûÞÚõ®`XæŠß-ǶUÿÁ²<„9ðÎoÿ‡-ʤ%4¨:<æhØè©â-wü†'ËË¥eÌ÷÷»Ïõ÷=w±mˆ·µm7sÔí4%ë!e×^þ¶#‹«gtɤC£EýÞY’uÄØ<Æw•Y§1¹Ok*µOdÜøï[h<û‘jÆ=ÝM§%™i÷¤›Ø»ô7á¥Óg|33uØc+Üü™§ þÖó>‡ÝfFm›Ã¼ö7ù|°ÚMF˜©[åôíÍIÖžsä65ß¹`p,é•ÔµP¼>>¡\ßYuµìˆ-Ú“S·’‚š5c[3Ÿûd’¬…yàKîaè+ùXèå´I >T G0ôoˬ³îﯛK†ëºÏÃBñ‘ckMÕàÚ ªeÄ[o^ÆQÝ‚·‹­ÿxJüQ\ñÇÃN.´^Lej3aÅ.œäˆëGçØYå¬2pš0 ×±h JGÖ˜{c='þBþĈø|J"4_Žš•%×~>Ù§éQõþCÇíQ–^ÿäÎyÒï)êw\M1²#–xûÚùJŧYS©öõóźž13v­»©ÍÌ^:|¿ißä–ûóÈÝ÷.¬ð_®¥ŒC—T]Ô^xÓº5päê¿–ˆ_a{°jÿüíÐpÿ±ÞlK;•ûüúàøŽ¿É»àI¥Ä7÷܃_Õm#>„µnm<=kɩܒ˹Ó}¡\y»éz ÓÞl¾Ý2L;¡ézáËÇ5c¡ð÷ö9¸!JZN’{˜¯ýé÷êv§dQ&\Ç_ s²áyÄÖ¦\#׃¢ôjqlÜÄÔÅcX± —«'s TÒ,«ÚæÏ“çJ»Xx›ä+NIº½oyœ‚·“TFÂÄ©”ÓóÆRy”«µø²Èae†N¯ªfïX« ¡llÆg+ØÅ{}šì 7Ù‡tÐþÒÇU-Wi±«þ ¼½P¹æÆÊ11«Xâi yVnךXÚêf…þ›ÿX;«êB6cý¥>éó¥I§ &Ý4¤d{å~°¹öÆFF¶æ€SÛµB£ßÇþD+¾q>ð_÷œ ÛÖª=W ;¢£ˆXnÜÐÔ»ÓFOˆMÛò±ÒÕûæ°û'è}TK!M]îç;BÖ÷=F}—©~÷™†ŒÏÏBM+>ÎÂG#WL²KVг*´>rë ¤³p‚K¼ÑÊo2åo¬~îÊŽ¬·n折mÛŽ€N…èÆ šÿá–÷Þ)šÍËbNsòîºu²ñº÷Æ?x)j•² #qï͇CšÌ)×7§î2ú³Ñ“´#¦4ýc.“•W\8T‰ç]á"ƒÀ&–­yì%ÎB—{RíAz§¼'Ô“o¸Ö/Í/И•IzmŠùWi#5hH&Ç_ˆUôÜ ¹CY¦n´gmI™Ò½üæçEÊûÂÙçÜß·,J;qlYGð¥­ÉÕ£ÌJõK[µr^Ö4ÇÝS{ùâiýºèqêe²#&H–ý9íURUsΊÝZö ɶ§p”r7§THS5ûô¹ëJžÈŒ_´kÞ½M'Ï9Ÿ0ÀÍm˜¾9AÛ4%FæØ ãýó SÊÿš3·#q­kÎ(ü¥ ¿~f„i}¡L²ä±?q.~(¶òx<Èüv.8í,FŽo 9H•ɪ[bsÓì„F‰÷†}²žQÿ!w·hŽ£ãŸ­‘פéìpõœóº‹ßkû7£Œ×·oqM1>*“ŽDGo]Eöö1ÿ¶Gu#2ž®{7ð]ŒÉßç>ÅÔ»ÔŸõŠ»Rô:VP~§¾ôYÇÛÉPdâG£&œwúi\zä§Ôå7ìbŪ ÷^(Ⱦ÷WÙ¾mqÑÙM\ÓãU´¨ŠvóO,‹•¼výýPL•B&WqŸ¿¿:fÅ›a·Û×°hj«#Òàeܧ·¹z¦æÛHaÏ¡ã:“f=±ÉÕøÌ µÒ¥åÉM;÷J¹ÜY§I|”X„ÜsY½X š»òí[×9bÅ`)î0‚–ùþáàéªW·Œí˜LZãܺr)t'éÌpî÷Ko[·½u¦ð–µ¤xÂæóGnüTQÝs°Ö?¦·ú牻ԬÓ|Ð7¢ÀÖ•þiÑU·§¢Æ5eq*2—Úâ¡Ì±‹ ¹'6j•ü¹Qk›<ÝÕÚ¢ppÞi-Bç…=ÞJÌ좢7„Hn:%†¤é:jJ†çž“_¶#ŸªõJ{áÈ›¤éÛé !•CKŸZkc¦ïp—,-¸GÐI÷×NÆÜ'›¤J?(gŠ©l}‹—(Å[ÊAŸêö†tº/¯Ä÷åOÀ¹ä*jE<Ë­\Îþí°êš{±w·´AñcjÞ~h§2HÖ'!.vÕrÝõ wÞ¥Î[¼w®ã–*(bù`¨ö$ÚQÀñ“7yè©#nxgŒüˆlŽ­|‘7œ^VùÀ[¶u KU‹”²áé¥ ×^›((i%P Šæì#K(Û9&Ê);À~Þœ¿0öðµ×[ªVü½è<ùôá-3à2ñèÆˆOÙ—­²ÝpÛeª‹Ô8–Ÿ pEqúãWkæ%9ïsI³…2+òŸµÇâµ§\NöSôyz }ÛæÝ‘Q~”äù­õ0W²,HaFi—V‹MLn>KS,õ;óÌ/¡za°VÝíß—‰W_×Ê?.—À¶,¹\]caØ&™—JýwNrbRQ]±ÎÜš?Ú™½jÍ ›™î [<Žå$qƒ ã'Ë›eé„D½×wæØä6H±•RîÁ1YEîš·@?MòGÜ¥²)L:žLŸðŒ£ýÇPhÖÚ¿¯ÞŠŒnôN`@Š&QzêCèÊiØUŸô3ÙÑò-§èsòëä"ìOmØz³U:/1d[lÖ»S ‹R.ƘM¡±Š©±Ô­³ŸÜÄ5ÒüðdœçfÈt;]b¡ñOUã«7ejEµµÎŠ“ÉlÓöŘ}^C×=ªŸÅ ™¸vÜ­çŽ9ÑQ¿%„B%6µÓN~ò„ݧw¿[´¸øAÍæDðŽ‡ ÜD\üX_}Ê®Y5“K_Or‘Á,\=<2üYÇ#5Åûv°3yÆ Òu+önÐN°J}ðƒÊ#ZãHºL¢^}LZææüêÆö/^¬Z«ØaÚgŽ(¯:Ü´hË´T3kÕñ”A3›lóÆÐ‰û˪Ú[0õž§ÝM%[~wI3)].qjùéæõGœ&ÞŠª·”œ­¤èUWN¯e ù¸u†BÚy©–1MwÛ iåSŸ¨m©k_çj*™póvÄQqGîÁ›…>ÜÀ=¬ƒd¿Ì ƒMµ:Ë¥«wЫƒ@¡ÿ.°‘Ìp?”ì@šº É<{°có–ùM±>䢨—Ú$ÆfZ|¬xuÎiXÂÎgŒŸ©@wÒ¬°™ŒùnbyjTCnÛè™wM)jÄÀ);"MNLø+ì·ë>cuIÁ$ò —E.ßÇÿ~K"O¡¬FýÉk§cDfEìɼAeî‰&g*6¥.Ô,/™Þ(^ýpÒàœv‡EnÛfS_M•RL û¸×#T3Œk[n÷I³¼a½äÆ=‹¡N})aûΘ9Ç6@"cîˆ%븭ºÍ¾K¡6ª×­®V¹Îzwè0U.;4¦×nûaóÍqôâM#/’ügì\´èÓ°áK?¾|í(–>†“ÊkJaÙâT¨ù­T>tÎÈÃ%6-,öšæÁ§ é^á³ÚßìÉS9Q¨”SÄÌ&ëIeÌÊkkÖÞ°îQfÃÊ+Ç­´È»?šü ²Öm‚2Z”æ%~TÔù½tåý"sÙÄusg+ª}hRZprйÖêÌI˜¡7÷I][qñý„–«±›ä×킌2Ç 4Ï7­ÙÙo84>mßrÍD-¯öÇJk•TÂ1RÜeÖëg%¬{TUßñ¤Å£Kh‘±ƒ&O¡æåOÔ¦zPô;ÎkQà äÒâVj&h™ºYlÑÊUM‹›ÿ0^k&UO&Ã3iÙ›—~Åú˜•;n)Ú¥V^¬ÝËÝë§;)Bµ@: I‡‚\’—L+Ì>¥š.Uý—¿å6ç Ÿ|’^.³¯Ü¹U^:Ídæ°Ô¤òö‘ãRîdqÅ£l2^QöÙ:¯1¢¤IKå\]É™x!tðÕD=îÓòÑ×MUG³/7y“DzÏÎÕ¹ md±-yÎÈñ˜k:z£á¤%’ÆÊÌVgU-Jöþ]®;®_ž*±7α.êlGÁþº£¦Go\_<ña›y’5ÕÔ«TDx»ãõݪÓà…\}ï¬ùâéÖ2éJ+ŒPfì¿$=tÄPÆr·$U3ŠX’IÑzÝÃ2Ðñ½~ëý›•ÞÐ×[œmޏ]uá¹ñ¡·Çrš›’Ï¿ÕñSý7?l˨—¤-\š”(·Kíê³w¿ª•ýäuqûÖÕi‘Re¡óF½Þ¤K©ë5±Ýs"¼ós˜ížµPßó] ÜJ)ïì<ŸçëŒøÅÎÓþç'¨vö´H)âvæyyÃQBgúŒ›í‡ßP;3­ædq[ù§e‡§¹­Në¼{T3EËœŸÉi©‡ Èå‘iö'›¿£ÓfäMX%žÔÀ¥.Cî@þ²xÓ[¼¿GrÉ&´¤€¿É&uwxó`T7g;/ïnÜ[¼Åfv%R[qnÐÛä‡e$´ëE òcHåÍQS‘JX“ ÜáMŠò²ºuéýë#5¬ã¬×þpàyúÎ+*Ô|û±Ã¯ïJé ÙCù¶oæÏñÞ=ªBŸ9âz$ï< 4ÃøÕ˜ù5VÆ{ad0 .o¢:,áÝw)šŽO®È·© ÆØÔÌžY×”Då.6ÉO=3žî–>rTî ¹ÀÑÄeRí³²G‘lS• Mmÿ®då¼Ý—¢[XÝHvÒÞÚõ⟪êµ{ž+Å/(z GÂ#ª’®hÕ —u**, ‡(yhª:%j×ÌHääËTkV—Äo;S­·#?a~ÐCFšLròî;/Ý™ÓØ\v¢L†Þi¥¤Ùë_bb“Ræ˜Q‡Ÿ|àÈ™¹1{ȆلpîA²úˆyÓv“§"O‡‰{ÛZÆr¤ Eîɲߣœ¨ò~‡º>±s×Ëã¿ó^-ý<‹œþ:„½ßÿþDë¿añÿ~ÄÑÛþÿÓõß~}ÿ÷?8zÙßÐó§±?á×÷?äèÿŸèûß_öÿ!Goü{ý4ö'üúþó‡½ñÿ}ÿýËþ?äèÚOc¯ïÈÑÿ?Ñ÷ÿ¿ìÿCŽÞø§ÿ,ö'þúþ÷‡½ñÿó¬ÿðëûÿsô¶ÿO´þïïÈÑ;þ3þ÷û? ÀçÙÿ«ÿÿ!ÚþÌ`Þúº40F¿jÏõ–¿ª ž…ÿ…Ãpx>þ±k„áíÿ@ üÚÿá‡ÿöà{&â˜~9Õ²ç»%µýÿ_û>ô\úòׯ?hㇻ6 =‰¿CCO3z³=}OE Ìf8Û½Ôp?”u.=Ê!³`Ï î4V`gƒ)f¼ ¼å•{&Å€¤!I¡)}<_p^XVh^‚“â@Rœðjð–¤å¯ iÓt ï^Ösí,­kÁ¡¾ª` 0@FúÈžWŠ•ý\ÈAó b°|˜ˆÇ .ÊÁP” ¼Šß¸ ±à¢‰ h¢ð¢¿m-cÁ%ƒ’…—üUË óU%°TØðs©°¡ðR¿z eÞÊ‚ H……!)ø–_\,@9ÜʯÜ,0Cux€P‡Ôá~ Þ¹Øxˆ‰à<šá~ÐÌ;|Yž!Ð,¤§á¡±o™rÿìTÿÏgIÞ4æT$mçf-‚ŠÀ†…›_ä<¤ DÅÞ3ȇêɦCü"ƒCºÿ'1¡ %ýÂ,<N ð !Ô5€8…8¤§A<Æ a±5,4™Þˆ‡{Ct*ümiNƒqÁ¡…1ì/Ó®Ôý‹”É bˆV,€¡XTj€ ¥% pp Vd-Ùó÷‹ °8!K<ƒ…Õø?÷ªêÞÉFƒß?wíVáÛYüT_ Áåì`Œúm¢y¦à¨`Àà®wàÙÂuëðy'!Úž!~í~Þ D¨~¾0ýãK¸~±NXQà„J Pí½â#D§X€,æ?Õi`ˆ05b±ý°5¨aE*5 ¶ ôT£5;”äͦJ¬(À]•ÞìP&R°P}Ðaû]?úàŠ.Tj ¬èõó†5‚5ŠPÁ}kÏÓ[£Ÿ·Ê¦RÀ®œ W)` ' ¶P©Hp(ø3—°Øt ‹Î½dº’Ó:;UST6'8ª#ÄàŒÐ×€7ãð(¾³OGåüG€–£.ÇÑ–à¢B8ž&­«(døE fZñ·ÑšÍ¢yòÆÇP Ghsq(1.rwÖðQœ1ªµFÀÓŒ …T!8Ô+àsLPé»ÁBÁ› Ò°EÆß>A zwS„ßÉ âtßèèêíIㄲl&Õ4#àiF˜ïQ<â¬ôPG@ÉÀK°ý–Ì›‹ëΰûô ƒ-“܈†îèÜó¡×8¯‘’W/ÿÓþÏUÐ[ÿz¨º°á¡>Ç\` t5ÎŒ¢U± +(„óåò{šo ÏjÚXÈFè#€=#c¡U c²9¡žÝŬèmRtyx€Y¼!ª<<À#ž‡GÆÁqäG jWÀÐÖAå`…çÁ ¹ðÀ÷ñX¡ö`-Ѱ`3× €B…*]]tã€çãqHΑ¨ËÀùñèÈΈǣ+æ OÞ®”­%o¦É›DØáSá ¢šN¸y±XŸï¢19¶4ínèBSiz¢x)­kL Mò 6¥3˜ô>ÞˆÞˆG{#x#¾7öÔ-€à>âíôÉß ¹ÍÖR šÀ †ß®¦0ósP°ì¬JS}ZL>O€Q-&O&ôé z¶Ø‡Æ€:g‚ù›Õùò¼â° @2Ì çOO…Ð…LÄ Â:ƒ¯t•y£%{:»K 3ø;"¡ˆÿW¯·ñÿAî ¦ð*ÛWU]t¿BÐ"}—F ]ø<†¦ #R½/ázOToAq‚  Óê:zDNÞk6þ;­>ú1‚@@ë‘Ðg|× lž¼M=½9 6ÄfxòöjäÎ~†ÏiÈ)â|üGõ=þë>6+‘Ç#ä7„ Ø)Ø "w=¢ÙÓ’_%;ÄÃþ §$‚BD÷gD€mbŸñe/%vj©{µZ$°³Y<Ä Ô „¢°qã·é¦»_RP×âº"é D"­'l"®?=y3ƒè¼7 (} ÖˆD‘#¿Ý͇¦X#åÍe÷VŠ(NóþLzØH€(<9º­Å7–Æ‘‚ˆŽD)ˆýF ¾ñú7=QdÐ 0ÙÏf*c#Œ ¿³©ŒAÌ1F'ŒAà09p|›~QAÀÛ³ˆ]@Ü1Æõ_*:;qŒDÎ<Ùt?V ³@7þпèÇÆ!æGžS9 ç³~Qs&ÆîÆý :ctçãJ¿°7°7þZØÿ”16ü |Dìßt‚Ì(äa@6AÄîäÎ5Ï“ãÛÕ©ƒB´ó_ϽÐ HG0^¸Ûöf2 *q;ïN¥ @HBDTk 泑åŒæPÁ€fóiF+DKÜ ÿ5ˆ€¡„ˆèfc÷C7ê­DÑž xl#¡-n„•„: òŽÐ‚ö¥" Ègl uÐòPѺ] Å1ƒ£ QV\#Düº®P’àþ)I¼–7äÐÅL‚l-w€€ó H]“àóÖ”þF3`À‚û2zÖÞ9!½Eg)‚+¼žÏ·éeF^%»²A×Í­·¿ˆ€÷åÆôl!›áƒh’ÿI$ï%\¯ª l, ³ ¢¿îÛ¹Øu£ÝG9a}ú @‰AD”^¯îËkéٮРÏ-¡MÀ»ˆýs{¶Éñs?–” . LøxýÝhÉ}mDD?œö Lì÷mŸõá‰ò  9Å'-öT„Ô¡ëÛ^^• ¦@j+ È(ˆØ‘¼)¢m3h¢Ð·M?Ðn >Ñ/¬6îwÈßÙß„ð©£Ý‘’é ±8ÂYÇ0 Ÿ b_Ó Ý¶ `¼ÀÆÂ^ký8Ãú "¢ pÏ碠T×=k®ƒJ ʧœ Æ¶€:wQGD`î׃!4ÃìDìóHˆˆØ»ý@•@Dô5\Èg]ÈU‹Î5>Ì|ÙPs’!//1IÒ¹H€¹†gbfˆ¿Ì„)r9$µX€%^XAƒo(dëɆpll‚ÅšÀ8Ã[©€G/ïµ& ä޹̯ Ë‘ð¿110X²dÉÔî…gXlŸ^+¾ 1cú@!lz…šà  d Å1×è:Ãû©­¹F “N`h@^ˆls.ýu-Bƒè€ßäTg[yêèZ¿†¿ÊŽÅáëÿ ×B!Ì@ÎÇE"-8ØÃƒ÷qÞÔ@ú×­ÈehØßúO¼¯½z¬ÿ…!ðÖÂã1¿ÖúkLð‚1Æ4Æy#WÆÈÈÜ‹îåièí‰5Âÿ¯ë÷ëø¾Ç€ðïüUe| ÿX,Ü{ý?Œ!Gø…ÿqxy†ðÈõÞ dL5„Í@†âZ§1ÂÃzXá †zX,±; IcØ#M(‡ 2$ê!DXŒ‘ öHãIàŸ]‰°œé¥`C= –ÐO—÷ëèq ÿÈå«Êèÿ0kˆéƒ£_øÿ!Çúysl†¨òà¢@¥Ì°“Ø/&&î*%‰œ¹jЈü™H’>(ÑùÏ•¥ÿÇÞu5µ­k=TÐKèzIé%@è"½‰€T‘ŽA)‚‚”€”Ф H·š`@¥W©"H{xΙ;×ûî̽ïÌ<ïyoüf˜ìý¯²÷ä[ßN¾•±ÐWs·€eméçó"d#“„é_ü½.Ï­oTëÖü™¼è+f(®]IdàAaÄ8\ãÖÉO‰#.@6öR+ssrT:ö·]Z]úÜÏ|M„#Ý[=£2Ò(.…9ñŽ»ó¦ÿåäÀ‘ï;¹‡6úŒÊ¹a xëôØ^ÔM¡Ù¨ŽOŒKÄù±D·ŽbÚ«‡ìðFÔ‰Ë0çqý·Ób¿JÉí“…ªÃù¾òŽ3€!›`diY%'Cð<õ>ePµ~êâ…Ntø&¨µ¿ÉtpëqãçCBÈ^©‰‡pfŠÓL¿{⻻ƅ ¸áÀŠáÞ[¸ûųŸ¹¼Ž†"Ž%µ7ªÜDÂÝ6œ)ŠR§ð·½YBèqV”¥AÄAºv ›ÃÉ ­{(à#†,"3ƒ(Á|ñb9d¥‘óÏå=ºà1vâ:Šu£™wÓÊÒˆ)üŒl (ËÚ@~O‘Š7…V®åÀŸ¤èµ„0€G¯sÍÌ 4(éËJ|/²CPhß‹ëŒ+Q¾®ì'Ë›ýÛaÞ¢4¹ÐÛŸÇËÌ0gïšc޹ÀaKÒñæü„ÄI I«[;ÒóºË… "*ßMƇ €gQ  z3ÌWÞÂ)ç‚|æØ7 ‰ÝRÀ²ÄL<˜'ÅÛ*#-_¾n«bÆJ®Ê濆_ å}0pH ù||ì«„in<È×/ètëLPXr³EÚéÕ”…\F;©ukY£ n®n@\FT‰ÝÔ9ü0ÕÅæÛN*ÛÝ1†‚f¹\0¾#wEÊ h_ïÉ›oò1Ú…Koé+-s©)P¦×‘dÉ<‚V¹¶ËF²ÄÇ1W›ò›£²®à»ï/˜µàä긽…/àØQü,$)xé)…ç‘ËFvë_EBâ¡XGY˜èPw3`¥Õ£qhmò!|b7apÏX œæp›ÙèS=JH.?Ê6ÿ%èµ$Ê‘B|Q>$ðR"¨ì'o&V;ÚìˆIîEæè!/ÌåM  +¬Õ[…^Ë|s¿žnex€žòô ¯:ø$:¥ |ý·(Q-EÐV¾. §Š5ÖùÃÇ…S|ÏKü»Ž¼ÈyS”>†waþ£@Ü;­˜6&ÌÅ[p;™Ê­¦a hf!ì¢ÛÊÐt+¡¿æ!Ã34²ª1ß '‰²l.Á0bßEæ¿j„-+ÛÌNMs°¢À=ú»;ˆÅk‘)ðtSCÄì ×7¤z41ÂÒ„~.Å>P½MÒlH;åú¿|,#ÆÔBÜ®%K0-l&…Ü%€$Û¿’y”àò–:²>ƒ`Æd拚»»"ùêC‰sÌ2„îzIeoÍÛÓÍû¨‡ºÆåYðQÙ-Ž1nó‹6=²#Ƥ‡ZÇåEª# ˜|QLI––àGª#2»ÕÈ/žGnùÅ«©°™.gi4ШTcÊßÚèÚã`ÞDZö²wø|L–w°#2`yNt‰• Ã"*$À%®Å9qáÞPc€ÃZ]¯å¸å3CjÚUßÉÜ|’kqøpÞv5œD‘ãÝ '£hÄ!|.ßIw•ßYwដ"|æ³ñW5¿9ÍZ¶P&ùy´ü?¿¿7¹ÊKb²ñ²ŠòºPÕœÖs=àÛ$[‰Wdãy{‘ c­ú>Ⱥb¿4qLÓ¸Z>wmZÏlg'>qì,;}Õ&»z‡ “¢?“£Ë¡ÀHž}ëéò+JòB¨·ÊïˆDì%1¹}4nl| Ú îUi %}¨¬àôU®G¥?sT¯ ½ànLÚpða<¢¾½{ruý[§ºh÷Ô´HLÙÍ‹&Ä ¹©”mˆ>kT/];ÍÝMdLËЦ~=ÆémÒ_³JÕаdÕ®ŒÅÁ‰<¸{R WJ\¸ùª¹!åüéBD~x 2Üî »Ý.S2Ê8ï<ŽÞØ Ð§ÀŒì[¶0ÆãK:rPfLßy#zyõÉRB [¥m”á)“ÛÎfJvµìÝõL•† z´u_vŽW¶µÑ +ËB/jBh+úØ…Q1ª>{TLëØ„†;±—`¹%(óLwôÂó:nöоÀʸ¨ŽÌ@™/FaÕPeAØ«9{¾’¡Úú–bÊÍ6;J)§À‰ ¶˜<þrÞnŸED 1ƒûÒ=ƒËô¬20+ùÜ ¾Ùظg¶0½¦ùâÒ³wužÈ¥/3»¡[9uÜóQ_ïšn4R°b&æIjycÖS/Xh’’R#ïJk˜å,¾•ÕoaÜÁ[Y> l£0š~¶?Ü.û,¸®erJ©¹dgx? »êôpqä“hɾò dSÆ~ÌþÇÁb‡oO¾w–ì'kü­$w÷óö^åé·-w ÌeKè•u3ÓŠüâ(µÏéº<¢¦¾ˆ&¸³3zàWÿ¬~3Ì-»R|«3oˆOÐã¾Çu„ŠŒæUj$M'û¾5ÕIäÛÆAj&ÌÝèÍo)ðÖ0)rôŒñÑ)¨ÛDuþ@4Ó½ð‚Ì"µË¿g€ÂâþÜÁˆ_öüâ‰2'Êy~³wõµˆqsõ胞޼U<ÇL7±^O*½·Þ:ãÙè»+ZâÛõêfP<)Ѥž?°hìïnÛÏÉ!¡ä7!C‡Ù6—ˆ|R½qJê†;¤ÃV]ŒXO¡¯Ÿ6+bøûˆˆ ƒŒBtk{ûÒ97ûJ¶½ÃôÖÊ ‘x÷À!¸^O9y.UfVåX%‡dCOÇHö&é©1(»ö4· {… ¬ÔU°©_ëâlIT=]î±*J½¨õÔÈÜ"¯xb¼°—äx+ZsU$ޤ}NÎ]^éæ®~s9´ߛµËï]>4eaF¡vªÏ_I€ôW}³£7=q%‡Ñ餀 µ™2»”òƒa’gs¡Œ¾è´Ó&ÃýæQ0d‘‹9Ö4*f)ZM¿¦ Šãº{ ²A©jQ!{{èö´hÁ†º#eGoµ^Å•ª¹egñøýø~M˜dj›XPµ@ÆŽ,Ñ R~ÓÓ‘ÙS~7By±¬û-óHŸQ@Û‚;ß=ícµs»É³5 @ýØ#‰yúÖ^ùÑ[rÑñçcŒ$g©ï-Žˆž{•¶?¯¾›QÐT B¹ß?ޛբÀ%b^]¯åôVˆÈ2YÞq<;Þ ¯È¢;Ôîÿžš þ’ãÕz§÷w+#,‹hË`½¡b[¼Än òBŸ8KcK>$=§ ù*j”O€±Ùãñ zvc°w,w èçŒXghX²™ÜÐäÚ½áæÓ* ®žôÒäÁUqÇ>7êÓ²=²0EÞ_MíÔ(KÍ;' WgÒöÊö3çTȇöާ¹Öæ_­B¶Õ›ö,¼Ç ô¿QR»=cöÞ”Mv§”»Ý¼ÕËbÉ‹”´èª-½.rƒ˜LG:{üñëðrïËj.󪶆{Ö¬¼ç è¬20xC†c@œƒfóûÖäÀ=%"9í\÷c—çKѬÏ ÅÄÒ±!èû;è†øí 鉺“fH«˜Íð=þ‚–¥b¬?Q}ÿãK6+Eõ8ù¨tƒk+º>&ûy6bÒ©BÌú™<æ$k®ŒåáüãZ¤p»<Æ“ O³Ud–så€]ųSÍÐ$©ÿ]“…¹=8mš7ÚŽIˆ°è~ÌRÿ „c Â+´AAô¤®SV/膖 ­ŽH>¼%P]Âßn…éÏÇé´sÞú ÎhÝp“É‘‘¬¸jÁí¶!Þ7ï$Éb¬ºqûå}b‹ôÿ€`„§nÑì§ Dþ ¬[‹¦&©ô¬ 3`)XÉÀÔñ«H¦«äMUÏ5¼`×ÓÒ;³vãÓ¹§XÝGËìnÆÂÇON«?©†hš:ÖïIÉ9íR× 2¼YYñÜï¨À²ì£ngn )㊩Ðy{D[\é°²R„ç뢒“<ÒÕZˆÐ^©ò£LS$«~é}ýߪ¤ï4œäð’ƒ—Qgï#¦¿cwì$ß&»vÔ¦ sñ ÊCÆlÈdšá£T<=[Ì0ùZ#¦O]b{[U@þxà6¤a\)[ݱ ÈÏÛ†t|¿Æ\vÙ„h(>/4èj³3&’ºܦ×Ô§l4|Á?BC˜ËæÚ‘ÈN9/h'Ú&¿R™T”ñÇ@G”_'G:×ä+jÒ”±û!‚êÃ+œeÉx¥äo.h]Yæ)¾®Þ…ûp“3oBôT‡óöÚÒTb·ô}v¼ËtÄnEðG‘Ž ÃjL•œ­(fW.=´™I?6pmL"ÇóJ?½¥¬xÉw«:a*„TîÆá6"%LÚjÁù(`À¹Ôoì×ГŠî`vW{|={Èz—àiþæóŠ­Îîñ#"¿wyæª= 2jÛŠΞǧˆeCÒÁð)Ô`‡¸+!I©Oåý¦®Ý| ŠR(qø½ 5JŸï/°þ +›²~q*v T}á• H<×4Lq6q|¯Ôi<ë!¹²ôÝRb¾¼,yû,hð9XÀ…{Ÿµ0É4‚âf<ͯAV޵ôˆbÜ”Ù1!Êøb1}ïPTÞ²xÅÉX°éù^žVJƒbaÁ$ˆ™ ÑVfié%›#í61ä~à7 J OM€R?GnÌf¹‚ÞN˜•†Ó´aÉSN ÞPCb ’åäûÓ8u‹¸PTð…EüesX4öÞœ© X>ËHêi‹§Éoz!4Œ(Y~ñ~h¶‚šEåï|ÕCÖ¯Ö¬RéÌO‰wè]»P⬷'¡aM›µ€Å`;uÝÂ(iëh×V€éQÌÉû®•{omžÄŒWZéI':Èy×Ý}ÃèÖJ¼lŠ•šÇ6Þêªs^¾ý%æìx›G"•iB>Z­xk%åûq˜¹W“ ƒü Ç@äÇ&ßÓp#òd6êÐHÉ·/ô_2Qm$G{"è]{°â̧JÌï RÖÝΊ,ËûjÕðeä€è¬}2¨´¡¢¢H”:;¼·D úz²×‘ïs£Ï”G†´P40ààG„b(GkÛlrÂùI€&è¯;õk<—?ç,êHÉ¢0܃ºz5 ãÊ‹ »Ý1]Þq w.ÜÐqnVÆ››iC‡â˜êÏ]øª £QxIÒ=ÏwõBt"ió17ÐX7®yÞþ‰¼)¢ðü¤${RÛ#n·Í¢žY[ú öߊ·ˆŒéË-Ú?Ô.:Ž6sXd²(OÜ=ìMWP*ßáå7œÀ ‘½ Y÷è·¥Ô0©öo-z  š˜ ¶F^ƒÅ`¡òHL™ÔÀ¨‚T6OŸ2·‹êŽ)‹^I‹…xOÙs òÇR˜Ä؉'R°”Eb!EÇÔle»ÎB r¾ûpí±2%¦@"œ¥Oæ·¼þí´„ŸŸ² ™vøÍR Ñ›8¥‹NHω4nÏÿ"LÇ4¼dÁ$¡Ö¯PâŠ!sÚÖQã*6ÃO"Æ–so7Oˆczjã]S¾ß ŠyxúBñŠé±$òöŰo<0¿°ÆΩöc;¥ïñ<=ŒóÛÞe@ >|˜jñå-üÃ[ÃO# Ç/°7=Û»\Þ\&býf[ƒØKø½ÆÍëEHk«;³69ÙG%Ò¢úµHo©:xÑÙ×5&·kµûÇð ´ëãbâ÷g°+˜1WŽÁ¡m~…•ï%Ò  ¸ãÇ]Ê;Zú7NéQÙž¬˜q[cÐk¸ š W:+³“JÏCP¯R\üã|Ý÷“¶xäö‘ßOvOñ ¾ÎsI^Uú>s©uQ_í±ÊåÈÿàäéÿü8ÿïôWÙÿMZLü×þ_??ðû«ð/%þkÿ¿Ÿ‚ù‡þuøÿ¥ÿŸ‚ùÿëð/ñ‹ÿŸù—øëð/ù‹ÿŸù—üëðûÅÿÏÀüCíþÓûÿŠŸQÿûþ¿¿øÿ)øGþ]¯º8ú¸^·µuö±»æbk …ýé´ï¿á_åþ]þ÷üKIC%åý ØÛI]ÊHC%d$ âŽ222²²R201G¨ä™Šá?‡Gÿ2íûoøWú‡BÅÿAÿÒgÏ„_úÿøgùß0Qi)ÑßV]é;üm¹ÓßöBPwuôø}Ïh°¬° * –ü•pýÿ†þÿlÚ÷ßð/ô…JIü7ý‹ÿZÿõSðßó¿ñúÎþ ¿åSž+µ9{áú#ÿ[CC#//¯½½““SYYÙÖÖvzz:,, ï·Ìïõ–‚e¼3¿xß3¿ÍcÖGõ¼Š1‘l†>Ð5ö±.£š6-ö¿v©þñü”ä5k+‡¼w•;PQ™}&Ò—ƒ%kö±…QnÃ.eÕÑ„aíG3Œ©l6XÄ«ë}·í¯7¿­uô—£›„²ïÐÕáÑL4Ëo¼YOKý °$oc¡›H2}·¡‹u#È~kx@žVç´ðä%Û‹Š\­ÈükúÂVZ®“ߘ’ ºuNÄŸ4 Tr)-Þµ˜*ê•à’¹ˆ÷9E³˜ø¬f€o(~½«ÚÛ!Ꟈ5õ¦/ŠÁ(ˆÒºßY´g.Gœìõ*‚NæÍÃvu§¾ÌêĪ·û!‡7õ ÆIíg_ùiCîHŸ ÛJð‹NŠÚHÔͨÔõ¥SÏp|\ŸŸ±$3—ž7¿™ߥ“5¥ÒƒôQ:}N˜=GŠéßÁ—é×å'Ô3^Î͹/|,WwD?N¯£oŽˆØÎP“šéüÖßA·n”ÿUKFkDJ‡¼TÆtߢ±O/ò’dAù{”®?[8¡#³<+Y·YµdÚb¡§¼Jí¸cëÓʒظo"ŸrYk)S rõËÌuÒ´Ûöûi­F ¯d¹SÅ@Æßj„¿ž¸¹éß"Ûbׯ¢ôu5ÈŠV1MìŸÐ·½/î–x óUÝëtÐò=)#•[hwØÛ©òýZd/ç¤ÜǃnñuÔ~ý`÷Ä?>ÿûÔ·ÿþOxíô¾¯ÿ±µ÷òðøããàOZÁÓÿIJ‰KJI|Ÿ'‡B¥¡¿žÿ?b’P (ÔÎÞÉAJBÚ•³—•r’qrp„BìÿÓ÷÷ ÿ»øêÿOYÁ©iè?ê_üûüß/ýÿïãŸù?IQ1™FÂïf*ùÝí‰C…ÅeÄ~Ù½ÿøŸéÿÏYÁ¡)¨ìõ/!&öKÿ?ÿÄÿÅž™¸ªßü_bbôìò‡ÿcf¾ÖÝÝ]RRbffvfþÎ,àï^ðÌþ½|Ï:4€÷£$ïùc pv¿Ï¸6ë ¡¾Ðmþ`]߇çˆÞD{’ -oE 2©”Œ¦Ù&:ꔌƒ§dÅ>o˲„ñ´0ÓŽË š*#³—(œÉKÚ×Ê–Ç[ï–ö ÅßM;}—¥§Ý@†sxr«Ã‰õoqÐ3õä¿áÏPžä¯àÖ€?^>pÉXga„€¼I^!3GøÇšoï„ÄU)ê_š}/pjÕßÎÊ»-õ5g‡æÎ”ÝR LŒô¨Óq~®$ož}›8dSTïaHW cZ­{Ô&eìx˜“pÑ0_|CÅÇNEzdóÀþŒÃ]® ýÊ•”¼S½æ¼_ØMm«J»ö`*ÂÇõ‰ÍFzcжœøC6½ ¬çpPftŸ€¶CÕo!Ómãžð4Ñp¤÷»§Œ°¦’d½(*­U­KêŽ`WEAaH07\ ÀH•îž:Jç§ H>¦AöÇ1ÍÖ ƒªÁsüódðâß:£Ó£ ¿DsRÀµ°ˆáßcÚÚTÔ©#t"”6Lï©zVÈ>1ÞðXŠ÷ºx‡*øÊ5º‹õü¬{ZUD0|E2OIC×ÙµÉ.á c1÷YÇ ƒwð».ЕœÝGQ÷¾b„¯Øoõ⧈EÁwü®ŠSv~ì»Jº‹ £ZT°Â?uõ„š¸ç¶•p`Áý2-ý{Wv:oÉÐOêKa=kî{ÌrµEÚÖKÞ1§ŸoÈ ¦ŸW?Ý »QNØiËIb`q»“çÓ®að¤ÿq:—çžÃŦ ò >¶_÷%ΣÂûè’+&¢;Êã|¬–rÒôvà–i_¡¼gå¦ }wŒÏÆ7¶b.–Î%|/\ÍðêZNãZ9­šåã÷Ë'ÉóÊO޹ÖòX©¿¨¦DÊG ‚SÃÏî{¹g*™ÓÊ úº]ʼnë¬âmë _Ä“?²3;D– TŒé¯’¨[B}UŒyƒ#‰`D\÷‰³Ÿƒ ë Œy»Cƒ|fޤOWF¡Í)ÅÁgÑä&[Îübðó Âkƒ,(®àZÊÕÈš)2:GtVx´A«PpÇÆÈÆº“6/¦ï[û³íEdâîY/l{†ÅmHÎ'^VÖÜ|ÍÌ÷¸ÏœO;ù`¨¥ÄôdÕ¡’–4qµ8,‘­Æ\^Hi›ð vn¹.KOcМ/†æhžU !nׂɹ÷¬MÃ~ ÷Í =æ|D4ùJö÷¹‡¡ø=ñw@#¼ôÄýÑdš/!†‘}wòoÞU7§Vô‘<·L iý½¿äìÔmÿ‡ŠTk0s¹ƒÀë=šäöj>» >î*¥uÂåÚƒ ³²+ç6õåŠ!¯•Ê×.Ú ‘#·ÔûnPk}dYÿúVeÿÃRô7BŠÔÖñ\*êVvp[øá\$"’æÁð„¼~@gôþ ëåd5šZ"®¼U¬„Ädíì7¬^6á±BUI¢¹vlløÕð‡G,’"ÃÞ‹t¶Ýj:²šÅ„ !«¼¦yòíícXdì~û$¾š)€›#P,ðËó/[Â\b1É=!²ØŒÕGÑô*¤êl>ÚF—öâ“zDÀ›}²"Y]šÀ¶êq"-`ân„ˆQÊŒ ßaÌ×3.¹™Jÿ@jpui4xˆNúÕµæ²J«ˆo7_ª9ýdT'o抑áÑùµBî½ zB÷Tz¦ƒõËZù DF‰¯ ˜‘&NÞaùº1ÍZNaÇšäã5!­ˆ÷d€Æ·šÀ¾«tÕR i_£k4ÐÛìL)ywª,s3„µ/›íl)vÝoÊq.¦Wyɳç.|^Ôâ¬#ÐÈ/ÏõA³Œ¥[pÇ&Gç^¨SÐQà²è ®,©àSÖ× Ås$]ñL!²³É¡ôSØ\ûÐoXÓ  –Hºô´Æ‹qî€ë KOÕ°.%RŸ,u?„Ò¹ßvóÝI|uy·p>óQmnU˜,ËÇJþò[dcnå ¨Ô#f}Ù/Öuôtv¥f¯>â‡c©sµx<§²Q2Þ@ØS^ï‡ÒvjD¼£ ™íoK4J˜¢r Œ>Ûì—XË1·ÚcÚ«iXïwÌ#{:šÑÙ}£ÊÀè€ FjÁœKÉQY¥3ñSáFTùs #ã@ì~œ¥¿Ç{vVNvVo¼“„ ÿxsw}hÌ“¦ @ÇâßÅ-Ïoõ¨Æ lãWÝë2žr]I£’?„¨Ø%-\õYßhꕳ Ä·Òé:±¥,bû@ÝPònrª­úõ!óy»¼Å5R­E_ÿ˜ÂmÙ•Ây0XlÍ»µ.î%v®nh¿íR¡«Üåm~™Ñ«‘[}ñÕÆæ÷Ð\0@ƒºj0PÒ”_€(ا÷qçüL*>›~‰LA¨hüüñ.aî¸GRzO<Ê`€˜`/»1þ’~a°JéìÓé ï-ºmDÊ|5 e4¥Ùl·è?ñ:"GËâÓÇçÎ +àkÚäjÈ’¤¥y†Ò\>i=óõ/}P¸«fP#°5j"¹ä»£@«ÏûÜÊl¨§§Gs—ײôœ—õEß1Ñ&T–/ÍÍ-ñÓªT–ñ7qÄç>OvY…ìé_Í-Y«ìß¹—+”;œüLa¡‰ jÒ‰síáLoÌÔÄFÓƒ§Û&Y5?Ÿ‡s|àÑ4|"ðZÚ_:¹@ý@?™¤b34+¬£Vtî*ÿe¢R0¨0• üþýš’,`"³}û!äõ×(—Í—yÒ%­oM†ó8ïïp ¸o|èƒ+¬ˆE¿É§ý/ö®®‰£í£ÕVmµVë}°DË%lvs Á" ¢€âQè’ÝÅàfñ@ý^¯ÖûÖ ^U«ÕÖ·ÚZQëQ«Õ·ÞXñ(ú¡B?ëk­¢µZk¿ÙMÂ’M¡M#úËü‚&;;3ÏùßgfŸÝi´?äÕG¾*“¼ST¸yâ1¿¾2V©l6ýþ€5E}éu²®MýmEç{7Ÿ´kqSúZeùmbÏžÎã‹ŸŽ¾|»ýFò@Ó·§7nq³xhç´]/?zèn¿9Òf•ú´A€Ï”‡å- ßûû¬õŸp¯RØõÉœ›ûv¦ìzy¥ÏÔ¶Qï'¼6&HRq®[ö¦÷ϼÒ~妷‡d~íwÚYåfmëë_.ß" xþˆœÑ+Wf_Y}÷ ÜQÒn  *¸Ý_ú{N8Çôéÿ}÷çË·Uó3ˆW­oý©2®ìâ¨ø[T¿¹Mç/ P”ÐÂ!oãʸÉë#Ž™µïÄŒø_ÊgbV­Gî$—Å%ÞÞ’u;Îtòx×+-n^Ÿ0sÖ’Ì{äíÛÔwÕeé•]Z„vÛ }ëŽ.½J ½×ý”²cÞ¡tg0RñÝÀÝÓôa1ßNšp¬0¸l\áŒÏ’¾›·ÐÂü¦oõ?Ô¾UÞ‰[ýgÑ–i[ RÎûwö& YÕ}F|Æ}:¼ÑãC3ýŸ^GMX–Ú>àðáÏ´FC“?D?ÿüzQüëŒoÊó£Û87ôÛćjòèõË7TV¾:úÁ£o´Ë¦ïv0[5vË©yAi¢Ð}e›DìšRöѤ3ú7Ô;üËàØ£a3^ëÔÇ·¯FqôÂãà+[Œ3Ë:Û²°eÁŸÝFÍ»2옦~)o¨_wI)\°¼3U8måÿ`~ôÊÓ[Êo4þ!-®I^i+ÉÝSŽøÍ[›ó–ßųSÊvÊðááAø›\ú0|ò¦ÅÍÀ¥S9 qQÉü?,Žºnh{åHfòà]Ñî‹mþ§¤þäJ½ùž(¶ú—Öý˼ú÷D±]ÿK«7ú—yõï‘b«u}Ñ¿ŒYÿõêÿŸ/¶ø/«/úg^êÕ¿Š­ÿãõEÿ2‘÷ù_[ÿ—×ýK¯þ=Rlõ¯¨?ú÷>ÿí‘b‹ÿD}Ñ¿÷ý*¶ú¯Gïñ>ÿï‘b£i=zÿ‹×ÿ=Rlõ_Þÿ‚xßÿàÁb«ÿúðþÄûþ[ýׇ÷¿ Þû?,¶ú¯ïA¼÷Zhœ ª1F"A’Fˆ‘p;|5;ÓPX:s*°´,ŠppƒôX&°l ·æãÙ¯P3›:1W'†¡c¦·ö:΢ jÂh4P‚Èn¤ÈL¥¦&ÆMMŽKHK›¨˜ônj¿ÔÔ!Ó4’×¹˜ë\ì¬sKkgñI=Q·ánxÄ…áy­Q®5Ê—š„«“Øö<šÈË5P¸ @ Aé-]Ûžc¤)RŸ®#Á °A´ÀzÚxÞ8Rn©síèÕºlœ€ÉX¿,2L+pÌ“ŒëOMäUʹJ9ŸaW§àÕ!¢ª:DT7JŠIªQ{g™ˆSËtÁxª¤ÃA€Ú€¶€‹…8RmçëT §87µz<8Èø:éXÂgòˆS“ïFèqRã¸În‘ºÛ-ÂÙ-‚þUމREÕ¬Îú‰G4#b³SÁh*ŽÑ˜½–¸˜z§ ã\ qîbNƹ"«»Â8¿Cä5€ û‚¬­ÅŠQýûûb Õ¢û †€p]œÏ#|ŸG-RsJIøÀNÞ$h!†í޽D;ãÝÖ]ÐaK@ÏHÈÊNÓ‘ê*,wFƒ€ˆƒ×'&1°a7:8ʎ˃}”³'TÆ—•œ$2+£±zšÊ‹ÃU–6©$ÎoÅiH"·çó*‰Âsã©OÊ©O*ªM6.9D7LäÄ'k7wµs'ª­ðlÞRÅ >˜"ŒPO€RîÊ/…_C̦Ü]žcΣ¤âƒcƒœ¿KÈI±‘¿.²‘¢µvRHV²—:3RI ]ñZpÁ‚TÊèÉ¡ûæé\º\¸¨L ¾üšµiLJ[RþõCÊ¡“Ôd"w]×»a({i—‰Ì뢬œÄ,Ñ"³õF2]OൟIêiwа‘˜i–³c˜¥-#mPÆ;$M£3ä ")‚Îææ„îf7ˆ»d‡1æ‡óçx2Zeü¥â>ÝK̺G,º·½pºi€!˜ŽÄ™ËxnÖäºè{ôà®Þv2â`FÆŸøËÜ÷väfIø‡YÃiƒ[Á gL"0| ^—WgѺDhPµØ/Ì:–½¨9 ’ñJ¦pŸ¨efQ+juŽÄÝ)j0pœ^=8 ÌB‰hC¶ž®w5ñT«îÑÃNFr.à“‹ì[Î9´泦6dš—…B¨©Ç!ŒùÃqˆñ‡sQ9ˆÈk DDlÎpÍ2`Fq6å2SÁ YøÕãv½×ë¸ Oìb 9øÈz9pŸ(¼Þ‰ƒÃV9êQqÀÀ’ :£-bp0ï%qÈªí‰æâD¹Ä³DÃ,ÑL[èªÈÖüÅž`.L•Kù€ÁA®\æ 0Ô@4aPRL" À¤cÈàJ¹üïÇyn!@´h–Ëb‹EˆIY4¨ ,3+œ²L`ªÏÔ̦krn/WØA²‚l…È™„j4¤šÄtP¿AqPÕ0‡BVp0¯€Ù€*–¢ €F÷È€T_`ffsrdi¬(j27wÑPˆÝOÊÇK?G”-}Ìq泊½• 516<äÍ#&+jŸŒVõÅÊ@OŒr ±ÞL–å-ûÃNDî)P÷‹HÂb=ñ® ÇÂPnn¯Rò÷Ó+­¢·wž%zw‘f'ó ªÀÍŽR÷35†Ð4Á“ÿߣ™ƒi…Ìb8ÌUØanuˆ‰ÃÁ7R“ÇÞ_ξ㙽23¡ ÓéØ2ßy&,§ih‚ÊÅ(¼\âP¡p¿hå¬ë³;9¬Å»«L‡=Ñl;ëW[߇EUà ¾ºäölOU£8DÞ07\Ë •™bsgì@|C€Eb®·\ÍQ"_®Q†p”!n§L,â(³ ¨C9êܸbs`V³Üj JÂå~XeÒ-ÌHäšÇðMÜž\)G®”B°HÆÕÚA,’sµn Ý=1grCb²3³\˜iÀGaßc¼!ÝÁDe§?¬eâ`(¨¦ÛšÌ¢¡…%¾ÜœìÐD^-ÌA,âIæ°†ùu’ÀuIM‚ZKîS„–‚Œä8Ð!3†ã l6Bl>R€éÈt}Oˆ"Óµt8¨6f‚ËK$—IÏ+Ë`æ#;¦n0Mêª+Ú¨C¸Ì·+=Û3ÎTy†sýÐ.ËŠçŠ}“Ír‚- rE:î@nؽ#1Xo·ü5¸Ç1' 20'=ORp9ªæœý;Jg“ÄŸA0d -÷<.¼×É##F©[DRó[¶wÉw×ÚÈ–jZl×Ìûd–ÞÿDØ{'6ø| ú½N¸[WÐ95Ò¯+ˆM^øZz‘öׄÝYï竵oÝýø½Éú&'ÚCE }J›˜Z†ÅWžn¾¦é‘¤Fš´5O‹ gtúå~áÆ%Û¾¹ÒôŠÁ4Æwið_¥ñõmäO¥ÔlûZéâ”åÆÍ Ž^…?í{éú´¡ å1Ÿþ¶¡uIƒ_n2mÞ†.^›ò?Ÿt JšOåŸU}õUäŠÔ‹Ko~±¸xï>ù3ïØ*áš0¡ï{þ¨¯>µó™Åùy9½ÉÈým÷|}£åCrwCdí£Šÿ“|˜—}¿WÿJ<ýˆlú1¿“ÅôËšÞ•‹ã;œPäõ!OžGöÁñ-Æn µ6·G^»s?è;Ùën¶<ÞóòýYÓ6,¸­yj z5¢í£Šy¹«Î¨¦’å—GIq|YeîãqmbãÏcm÷¯®Øp|$vï–(!vùK¸‰*ý½àÃIC_o²(u,M>·q¶1H9n°RŸ_ºa³Ö¸³XQ߲ū‘%~›Ç/Ì™¦U·Ú×µk‰áã¤í&²GÏm‡îíÚ9¬èœz–fíveE§½™ÇM'Ö–Œó臰õº1¦ìzddƒ×7Ÿp$ýN£rÁzÜ´¿áH™– l[žÐK™~nÑ6<¦%Z0ñÛ|u£óúÍwK›Ç#ÚKkêþ#”½|û#6l¾tç’ÒÔñjé¿Î¨º´; 0õ$º>zù“bUÓÓð%K‚ÑØ¡%V W›4sŠFF©·¾PÔ'ùÍÁÙ2+¡Ãg†©6v=~MÙÌd<¢ÍÛýÛ¸§Ó?Ù–»"ºÓá£#ÉÁù+ßÔž5.5,[“¼£÷¦¹þ:gÝá›ß-Ký÷ƒò¡ÂïЋú¤5Eú™v‡5GK¦ß—údQëá ?È<[úäèqƒþÛ2¡ôƒ«×îvHX ï»pY‘~ëÖ/±+4&CJDSn)ú}·Š ·?¸ú²iËõ‚‹ß;qµøZaÊšc9;Fý~çGßadþÄÏßG(¥ÚŽÁ›J?¾»¼píææ;èE¿j3¾9ÞÆô¸yÄ(4w]à¥-£zü¼àÍs)G{™”;ú§Ûñÿì}XSI×pè*6DÀ©Ò! Bï4©Ò[„J©Š¢ˆéH@ŠRBWªØPºTQé*M@àOÀuu×uwßÿýÜý¾‡ó’{ïÌœ™9eÊ=sòêÈĖƃ jÅ?ébÁgy~™’LÝ[ ~†5 #gnµ;Ά[ Û…Œx?t– +ù=Ä' b: Ê·ÊäPhlx&NX¹cö¡8Ї;´ðèÜ»ŒÄ÷Øy¼Qs³Ö¡]ª]™ Žl)ÖšŒÜùÈlž=÷lçßû¸¹A2U¶„*ÚÒ­#YË a ù»§*{é0«cµ4G㇠Lì'¤"íq–zŤ‘´k;mÙztŒxDÀ'¦!|fŠ*œÏ MSv»¼ÍÙ¬9¦m)¬ß§QgðÔc?¢# ¿–âh4®!TŠ{›ïω°P\‚ºÓŒß—>)\—åñŠéÖšçuýt„âÓ»)…êÐ×åG¦ßM3#ÏàM×ÂBöûî±jìò"Ì:æÌbN\ño¡m¼€ §š¿Œ4z¿ãê'Gw¤p×ÒL ìã\§ozp{ {àY'£ïúóY²HS"_óK¾¢—8“Ar\È3iÙ)çqÞ7ÀËÍÏãqqúÇœâjðîU{8‘yŠ 'ŸSî®{ͽȭÞÝÿ@òPèCN‚ùè»!ŠåÚÌü+Ñ6R ËkÝVãñ–÷9ÅZÙit÷ÄçYÍ}àUu[ÝWà±xÏ¢ù×ÂëÁ­AS…öží]÷ø ©œ˜-¯ªªjè([cW‡°2(>(=á:|ÖÝp„J{èÀêJö9L_¶X[=õ¸£úÍ5ùhE…2—ã„6ÓÇû{¶úд÷b wnöcñT!^Nï9y×ë½<¶Ÿwq¸ ˆŒÚÌm¾¶¯qúšçá"_öG)“ku´i;¦ñ0FšC¶vKW®c‘©ÃMV­h쥴®2Êbz4¨˜KtföîÎôÊÇT=tÖúO†¨;sÝÛ4ï}’5ìï×ã—ZÌ| i¤ª·s/–µ4ä§O?Ò% ƒ®$Ý¢,Ây#œZŽsÐ(K?+s…]³8³Ëîy°ö½|sa”ýd`¿¢FËñ׊f;V]˜zY“…&ˆ²–(þŒ£Ñ‰Eÿ€.Op¬¿–Õ2ÂmÃ’n ³ªËg[Z¹Cº¿(FÃs†3ÅÏcÞ_ÌoïpÕ!™FiÕ­0Êa)n¼¸Ü‡7=YÍ{[ã£f-Oãv…©Ïòô …ûjK’~w³5&çòúí¤áKS{6-&ÖroyóÜÁãðŽR„g§f‚c¸šöòöHFmb«þð‘áÄÀ‘D4 –'Š3†|cI3ûÉødEÃ[Žëd`Ó/'e&]æDj—´J±uåýXŽÝûê\)–¨À€%dï;ŽåIßšý*žUùvD^jNïR‘ ŒÑ–žP!ØG½!½DÌ ðõ¬Â ®½¯œå¯^ãKà‰9d5oNw £ ).G÷+×'ïB3"]ƒ3‡x¶¼µä»ÅØÆMðÒ±måâödzÆ âw½˜ùI1hv5ÿx‘%Q B&Fçíð‘ïKã;Êu¡qplê9í³®„þÕó<<÷£óÚèhM\ƒ2ñÕÃÓÅïy,¼$•´ïæn¥ð,r`d„ó8g=èçÿT/+Jå~>3©É1pÀb\žVÒåœ5üju®€Îª«b„l_Î8ÕjÝ-½òWS Î`'Á*ƒû”¨Â˜E8é“2}éæe¯1;ö?’7I­h¿±]¨}yb-rИf>ÖkÓ¼gÀFBExo. .fjž×5ÇîPD[s´ÀAù‡-Æâ«ð^E§Ç(¯³²Ô¤u¼›¼Êg(태¨Û^Q‚ðÍ{éÚ+çyœ¦x.¸ç6yr±1ÇØ\½›0§Èi\¡åbl[¸®{ó~ D7ãYQ NOñ4– «éžq*=;kþq>ÅtÛ»+™‹ò§…¤#­/ §†-ì3—±gÛÆÅß%µ òc‡eïtÌÍôÌ?(m¢ËÚª}Ó¬AÛõZËÖÜ>Ø‚Û9¿ª4Èø©úÃãû²ìÔÍ’TšžÚ?˜dy-‹ö\ö˜žo^`)]jœ¸Ý3·x{7õ¢ÿÅác£·=“:o·¿çöz ‘J§2]2£_ÈéM,ƒ4Hӛ갥©A¦ Ф¤øß-.+®MÛ?}‚°ì#2ßTî¨EÀ/ЗŽڭħ¬=!ç>½ºX<ãh—øêþaìÙÒ‹õÒÇ ±…œÏ}C²ØèZ¶m¹å§!& "åi ½Vû–YnðŠHr«RSM€R µS~󩽣ȶ\.ÂøÛ÷Isƒóó)]Kí­“ ÆôŽÆøMKÞwç®Í¸%ã5wWVÈøªíž»PÉѨ²çªßÝÕZÎ,ÖI]‡è)ëÛ¦fùÏ…H—.=ûƒyîl† $.=G³¾®k:¨ÙÒÉ‹!`ï.^Iܾ6¾;§*þúÙ­WÇ´ò,.A¥¯‡@pžÓM{—CVŽød±ØõÕI­Èx5i¨ Œ:¬íƒ8~„×ÔÄQÈòK¹'˜ ¸/ë­h¼®Ï[ü‘÷Wy|}L?ø¶°À2•ŽYù嵄—X“1áZ}9þjÍq×88â6”_´†íž )öåZÕݰüxÊÖÄ jÊF3A¿<]‘²ÐŽés7±Âg– ÜCÌrÆåOÜÔót6â«z'½{žšj¯\+q`6±ùðÊœÀ¤·ˆ,Eʉ{¡ÇVq1çÁmw¼­-MMÕ/5hÿð ®ÈñuwYy7×}ΨÞl :óg½CyÃL S¢Š”SÙ&#CÅÐàš|ÃŒcη̹tu„É{?òÆþVXp±¡©Õõçy^cÌ`Ã6DñHŒå§¼ÒË9ïmaÈdk¹‰•G”-ϵ” ±ÝïœÏdèÉ]¾r4Õ#¬e?‚~™”‚Û\õ$ŲIsWÊ ½WéRVüµ¸6'èÍr\W²z°µkü$3!LT¥¦‘iúî›×ÚYº@È8g§xFîó=ÁÒ(ú"噲Fxà‘tÁÖ‹ï\VÀô>B‰„×ÑH¹ýÐÇ š¡‡‡‡MM’>h§ï`>ÛoT¨ tGÎG.kpxw+Ý5’…ž0n¢8Õä?¹,ܬqJ]““%*à±’:—miS´BçÁþwogÚ;¼o×?œ<ñ”TRo¬¸QáÍÊm²~°õ¢¨/±S½<çkÕÃÂpR­OΣ¯Ü¬ÔÚJÈŸA¡o} ÎÇ„|ÚÃèÍ]KsµódcOQRs0dMõÙþ‚#ü\Ó³o˜ée.]ãô¦Ð‡«]`=*›úBR“Ö(äÜÈ&dö‹å}¿ÅŽnÈèZ³—ƒÃ×?x50ݾžð¸ÏìòyGá»ëIM°x,q<¶Å!÷\AþV¸å¸Cd·u@fŽc©É9á$­ÁgÛ Õ±ŽÑªV•Œg­í©žçí³Q-öJÞ^ùø²´i/önEykjÂÝóÝ ,'ïVDŒ l!T3ÓŠØÊÞù4߀-y“èyîK®÷#¥ wZ³rZÐr #з”>Y"C‹âg‡U†#‡åz“{î›Fµ†-½z_íÒ¸í®6™±àQ’ÄßɯwÙZ—ÊÓ“‘pä-³Óˆð3ÁŒ¹s‰#u¶Q²Èû˜æâ…aVIö*¯U±Cñµˆí’Aô-Ý‘™Ùè×ʄ̨cµÖ“Z†G Ãõa­½×{÷Ÿu^¿v«ãu]4ïé®%<Êì²aÀ’>ãÄK“1énY¤ùÈ@€×ã]O§ØYÏðÜš™ŽÐÞÎlëqH€d7I§}Í'ÊOB„BwHíÐÌ–AhJA©‘2Möí<>ËqÍpí*[`æU…%‡×Ç}Êo<ʸ¢Ï¤ÔºK#1[fܯ¦ðúɨ}3$Í»jÂÑ{ÝkòN!ĵdd,Nm«Ò[tokbÍ,q`¬ühàýÚVÅG‚0_¿zph2gyZž G½i¹X©Ò®á”Žõ;hFÅ™/€ª„29‡MÄWøìp<’¸pJ”ªu¿5&û¦ñݲôÂ,#T ¿X‘¯Ëºb —nL³QÀyr8 š/Älm’eÚ—Ùí÷”³2—Ž:q„³ž>¾6šçÅæ÷ñòÑV•H¾2kd¦Û0vµDŽÿtwºΘÀYÎÞFOÜeç@~˜ëz0e¸Kú°}¢I*œCóeÜqÛðG»{éj™ Õ3:ùÅ­‘Rº7X*n—a”´PWÁóýg²dbÉ<¼ UÆéØÆ¾v˜ú+$;£*U*WA õ0|»ú+aäæº÷xŠS‡±Ç÷Qrdaãh'ÚÛž ž 4O I”Á…*4£Qñ)3Æy)F L•‚yÔ„Sl·éÒÚßVÚ¬>?Îåþ‚]Š¿âNÆhzÏÿÊ¿U¦ÓÈw×o­ª¿%op"T4” ÍÏþc;¬ÿnøvÿßê_ÿésüßÍøï?¾ÿ#þOÒCÅ`bçÅ6ã¿ýø-ý}ÿgµa*h¶nÏj&aåìüŸšýEûŸÏô'Ûÿ€@›ö??0h†IˆZK@- –PŒ˜ì§Ð·²ÃüÓõÛ„ÿYøOäÿïšý™üƒ`àoõ?Þ”ÿŸß³ÿAÃaßá„/¦5  „ŠÃa¢_™ÿ€~À>¿˜Á‚P ”øb“&1ŸÄWYÑëñH~Í®[ò€%ÄI\òÝ"çç ÿÛèOä ‡ýNþÁ›òÿSà;ö?GI¿/¯ÛÿP",!€_íXY×€Øÿ¨Ä)×Ü_ÛÿÐ>ùlÿ“ÔìÖ­ºç̲È32S·F.ªý‰ôÃj=\ÎO¹°/»$Ã3ܔ蹼>)I»#Jøõ–[kÆ A4ªÀqzq§Ìhcx‡b‡±4ý~Ë»¦^-kz­ÑÒ¸)äÔ.@ õï癨cKo¥ùªÒy³!Qd*—ünLìÎ"-7÷ NŽÃ¹¨(gþØmpD¬òüÚöhåh>(Þ¤ËUD‡kµ¼uö[*ü|Ý[QPXôÒ²Gî]¯¼¨¤'ËÇòoú”äúÎlá†g×U´ÛE úOŽG:<×_ò?÷Øm²¥8vx¶:¦ª²v(Ú]ÁêZXL÷Ì`è1;sqâbÂR3Ï…÷$V>¶s^ª0šî0˜(ÓѺçB;;?Á¼82ÁÄ–{7ç–¾ˆæñJ%*7}ûJàdqXzGµ~_äJÓ©Ë{*…GΛúÀy/XÁîR½åü„©ÂÎyò w]]Çe‰ ‰€ôn¥›‚>mNk-Ü¥8ê^Òáгµb½£Y¯]‘º…!{xÌfYó\p6Ór4.íË¥}By×d´°F¥ûÕÿ×\|Ñ”ˆ;š„þÑ&lqäƒMÎÀÂb-§‹'=w¾ ‹çõ÷¯Ø«ººúém™[³£Ðü/;w-^ÚÆËǤâÃÕ.Ô0öXù&R-j艞Îý{”Ô)†\¯ÒçMPq\e~Àì# CC-ì[5å½I÷ÎLXÍ9Ô.g9Ï+T÷í|ô.æAÊhËt¹Ÿû+O¯ï-ç{*ÂÊ áj1{üx˦0j¼ˆc£óUiËqîȘ‡˜X€:å™(@* .j–‹*Xä1b—ŒCRºÞëù!>l¥ç´—ŽÖŽ“h£ ÕX·˜På&ž‰È­åÀÊÓ7ˆ\Ö£þñFhs÷Ý×÷S´pžË€òð6?Í(1Ÿ}lXÝ/kþä¬AB><Ìç‚·‹7B£œ«züÖpôLµä–GÚ‰KæN7žMWŽFè*ž‹u?¡h_|Ø0B0»³ÝÔXÎìÂ+mŠôí3ÖÞ'ØÚýmÌîw²ÅÖ±òªYa MÄ)\ÃÔØý$OU…Ng÷D$Wö.5IsóXLË=›B½s;›ÓìŸÄ¥¿èîö~quþ^[WeÃìèÜ#.Ön¶öÑn{ó‘óŸ@Ê üú‡ßxØùµcLKï;{?g¼^âšOÕ¸lªt9Ý&O“ °œÎÿB­rà~N„òrzOo‰kAèˆZíéíSDèëí;Ù{jÒh°/Œ6Qã±êhaoEY~[wkE$þ^€®GÛ«^ûg\È’VQ׈˜m•Ì+GîÝuZ¸½3j–{«úa¬âB…ØsŽÇò×i/û¨S2äU>˜. ²Ä´À\l„TxÒÒ…¾R) ƒÃá/RE=÷¢¥-8âGweGϵ±/¶–€3‹Ì .‹]úÐq0:V AKˆ~•e}ÏÐlà ίG+a¹Pè×yÉþÚ¿>’¹áUë×\äm_òLQÈúÌϹ`"hQ±¯r9àl¾dÂ6* —øM%EA"x[WŒúKZqœ¼#-— ïHÿÓäøéð÷äÿ?9ýù§ç?I³}±ßÉ¿øæøÿSà÷û¿TY¤ß³ëû¿±÷‘A¤/ÞÏû¿,,,YYY?>Za¹jøv x—ü/G@›Ýz`{k—×f‰ý9¯ xí{›žHVöpÍ»t"8€³w}(o­,‘zý©«¾¬$ôþ+"NðÕeÃO©ÊKÔj;½ª z”Ðù ]ñ좄Ÿð ‰Ü’ªwtw7ùë·i·¢®~äuKY½·‡’Øþ|ÛØCb©- @츨pu`®ÀG\cÆ¿ÿÞ}¦røÄSïC~Kþ¼yA;÷GiŒ•)ujUNxº·£úæVùÌL\‘÷»rÊB†•ËÉØ^]KÃŽ—1h:õU,ìÔô]’•ÏO•Ð9$…G2TÕØ^x8óÊœª‡z¥†AQ…öÉÎ;u©ÑccÊ3AD4²j¢¹‹ IClo«_ö›p#ÎäÒ•­,rÏùcw’ò4@uyÈ˜ÎØ¥I´ÙcÉXS óõ‚̰‚ÚaÇnÂ(‰º;l–Â,I€o1¶Êlé—ÌË^ÊØ¡6¤w6ÒøftœK˜c\}[X6ûÍœÐ=Œ|Qú[÷îJ ç;NËlüŒŽ¸+–"–“!ÈžBÊÌ +Ä*0Á¼[^W;U;Æ›‘Hƒj×ÙßÖíÚÑ(|&'SkF^7ƒû¾GÛÊ>ÕL^`Â1QŽ}Z8LßMo¼$·öÍ\<¤§H Þ¡iÞbto W¨™R!rªgœ{ÿa’~És+³g‘üЍ-¿ÚC×ô$Sì‰7¨º4¹ÌÓú(—½DÓT¦“Oa¾§Ìq-4æPïúqURUòÍÁÑ»LNˆX}§eƒ»IeU‹¬/vãÁöiªng÷>ní·¡-ñé¼mÝŠ›IÖWv5Ú>fùú¢®ªÏô´+q0Ø\E¼í…¹KçÅ».ýY˜µ±$yÇ””¤µÑ¹†ê1Ñ‚ût y¤""ÕË®™6hÑ7\‰­ýLNϰåÛÇR—ªœÊ'”¸ÊJög£YFbh­v[É Ü™Üª‡WâüÔÿÒäÝ{ÆØEUÿæ¬òþË´Ôvò@Wâ­Þë·Cßzàì_l+Ùë}/:ä6Üøò^Æ÷ijåàñСÒ8”ÉÞˆI §à›LB½;òÞ^P¿ØuaàÀ•sqtÍáÔDzõ“gÔ֥Ϋ—q^VÊÁçq%sŸxÖÚWœíµŒ þ­Jqøss˧.‹;Æ9¶¹»L«wR¼5>³$,¦…]ŒŒSÅ È7d­ì²a+Ȧ–?CÉè×*VÌxÐõ¨‹î‘jމ5e*œ’¤–dnïMý…žU¯©õÑb‹š<7‡ZTó“ô[~¨àh¼j¤Þ©cZ­}”mÆ-O>¯_6Q|ӣޓ’“cOÍùx(†Y8#WüNɰ›öªö‹°» /o¯›t!Ú˜‰}‰lœý…æ/gtTÞL·´ÝÏ é’~ÉþŠk±KÂ;`šVàÜ)í.ý¹Ôäè6#õqŒTj¸xxÝÇY[¡¶ºÄ3‘†WO¿EÔµ\Œ¸³M^H11þ؉ÄÚižÃ^ÌÚÌcjø¨ÚKÄ6¥ìÈ;—ZÔt':p´ˆž¬¬OðŸ±%¾¾U Dú)Ì££vO²ôV™G1f¨~àÏÞÏM!p™W‡ñˆÜ"ëKãj”†«0ªeÙÄâ½\›À¬Âš#K…Õ ^`.†}Ò 6—*çuiˆ!Òõñ½Lܵ1ÛûUÔ,×àŽG—mÇPcù ½éì|ñ*qµŒ»Çî_tLgëÄûËèjz”M'=4»v½Ð™I½¹õèH ¸ n“.™r°ZÎL í—XµMf„ËâsÍøDÎì«”+Iâ“X@‰«ô£b@ÅŠè²Ý-·Í1hR,ËÍì i.{ÔÙq C7ÕYð<ØÒÈÍ3ŠE‚jœæRBm®û‡š’wy\ñ–(|±3ýÃ¶ìÆ“`ÔÓÛíÖŽîú§æK©C¨3QÄó(¨|Œ§ñ¸|~>¬âÖ¹sŽºïïÝ_ê-Œ¿èˆäù ªÑN}â)]¶ñul»ï¥Ô~Miºä§ûH.££ö©~w¾Ã~ÉN-¢}¶ŸJm—Ž¢dج½f (¹?*µÖžÚç¶“á^0Û½ð¥áÜ-9šiýÕJû:œrs™žã¬¨–°JÅ¥ÚŸ‹C`d~>*épàfþèÐÉÊ=–Pʃ_b>¬ƒ¯I›Ï$tó³ñ/ —€%ÕÞ_ (}¡Ÿ[ø$­éï~þ÷þ‡–Û–ç¶Õ7Ýv_i=n¦m zÖjºvoˆ~I [ù(œ¾|ö¤æ§F¾Æü25ÔêHáéšÚKŸ£5fîi¢fVböˆùðûô—÷ ã±Ó©ÃŸXöžÑ9“š!´2S/«Ðçžu)ç<¥0'ýü-kóü.9¢—ÿᎮÇ], Å…‘s§SR3ï4N³´Ö;³ÛçZ¾Tæ‰E” ¯iŒBþd),ÄÔ?¸ê$a"z­¦t ÷Ö®9Öœ+¥D^ß –y^J«eJåá:o¨]2\c*‘ûðÃÊU”®Ñ‰ ¶{ìÒ¡ÕÁC üDs¢àÄDZÁ›¯ñ”ØœñËnØþ{u¯ZÍZŸR,=1ÿ‰…Ê¬ÊæÏC*W]ü›ƒÌܺ\Õvžt˜±¼øÄ¦Ö)ú޹û!Û®ZËSÒéÁMÛgyˆ¹z\~§v~»Î{,A¸ŸIéø ‡æ”è‚ôc/ R¯¥õkÞÉjð¼—,ÞÄ>ѨwnªÆ9^vO qœOSv„Ÿ/§Î‡ ¦4¶)\ KôƒÀµ·ƒ§#xvY3E7' ãF.}ªÎh~œ]U”¼Mì{š°Qä,ëZËŠËü§«$œMBÂnïÅO>½2"'sº_d¢ ¢Äqæ_˜>[õ‚Ãm2¤~×uÉ©kçÙÃЇ(Kö*ºc‡Æ]¬:V“â¦Eâ4ݘm~ÿ鲯–ö«¾[ÓZ”GÒcТ4K9FÁŽè€ádAŒdY¹÷}ÊêyßîX<_³D‡NœmQ<+KîÙ‡¡7Ø Àó¶Î¦Ìí ^BW䆄M(<<Üð–ïìÖ`Ôȸ×#ÞžßƪÓMEG?XÔÖÍ7›à;AvÄfZÏÇâ^ðÖ½A“;¥°Å>Dj"¤ñcáªæÄ) gNZ÷€'j5ïi´ÐCÍ)ÝÅzžêïË*^̲·HoZTã–¹¨Ð'£Åí®:Ö¤üô•7ÏÉýóvézùMžk4±—M ñ»¤ä5Ú¬m’á©Qîn’W¶TÈ…)q§ÈÜ ïhë\ɲEÖ±¶U¦¼ ,õGgÙ[=Êru‹½]eÌä6~ ~$ø žrø”«&HR~¶NjЊª×¶ðÊÇæÉm ×ù^®Xxrg€¹ ¬,kÿ*Óç‚茿Ë2ç9uyÕ.Uâë=´c•™A=ÞÉåÍJ‘„ÃÔJ&™SV¤4c'¹+#ì©™v˜W CøŒ}»Ó»^:é2Ù´ï¹Å5@/É XŠîIk œ1RïYèž_ œCñ;F€ÚýMpß®Èeß+ßX3’^䬖‹’¨p¯5¸ø™å‰vòat®T:ÁþXG”¶rùéÛÞsY´ö®*;,‹qoo;®òV W‚ˆå ?»[¿Ày¨R·Ù–’¯b~wŽ„ù¶ŒÊôÈe ™¾:¢ÌyIáà±]vMËÜÚ}ÚÄ›Rûè¥å….Nû‹DÝU ;ûŠå€hôŒÆë,°Ø±êpÒñŠ·‚²§ÄÚvÝɰMSË×ë~}xž5ç”%j{;7 Ò »Þ{ªEV),RðÕÇ< Û™¸¶œShzD¿ð§ç­Æpv»ÐœÅ Š| zZåŠÞ= º0Ìt;ÆX¬×“¨Ryß3?ÆÙºxUƒ«|‘íp§#ù ³¦ûtÚÞÁ0$4MîÍåe&]éýª,GºÃÆi¼µ›t)ˆ4&çö±C ßœÀåÚºžb¦ZŒú†ôyÖ¦©°:4Ä›ˆNk€ÇŸ­p‹Äæ Sè+W['Œ!à…9êòÈGyÂýû&‚ÂcfÆr¨Û†ËMöþû2_p&‹ó]Í¡€nuÎ[äzPŽcS²¥, m›Ó^0”¹Ó)ev_D<óÃJ/*Î Uç>pUyì×a³tÙ£º4Õ¢mÛêžÅŽ©±Går :Yž‰™]ÿ ¤k<‘G)Ì/y°g)Ú+-*Aß1C©hZR*Ÿ?rN3r W.¥mï¸Ê°R‡s3`hó³%ßi€ëØKj¬PÎ…„«éQ¤fvÆÙ3À³ÌævÝxÌ݆Þåù¾ê-8¶PyËÁài•Q§QEê¶>•ž1b.UÈHäq©…Œz Kh2ÄúÔqã;)æû¤u´ß;Èdž¯'r<@UUŸ¯ô"òs)×B*¼güÅ|‡œü«"¬Mvòg\:™w`L™Ãíñ;õêÕ“8ɶáJÞjÅV²a#+kŒ‘æ´©üÜ.6ÁæR ‰Ë>¡‰Šw]b ¿åy’Þl¤{’6/\iS`~ìÿ¨Ðèá’9£š›ªGÇêŸ(ôI¬‘ÔµS1ºøïiÉPÊoß)ÐûÜwà ±Š}?IÛ¯î&öåt…‚¥ŽTô«œ í5Š®( iÞ}4er÷„¨>8Ü![ieêüQo5ö0Õ^yôðýT§¤ÓÌ»®Í n««uÜ’y0û¢Æ½Ã:²Z`ùI«Ë³Ý×F_2íËLˉØq•WŸ)한aþvT|m¥\Xª)¾°W–8³ú”S&½ô-Aá#˯i{‹mV­™c;˜ÓZä.2_¬UêL$M$ŠBÛæGâÓ–ýñˆíI‡™R/©û%¼Ëºåƒ«¼öhVpõ†|ùñ+Höá[¨qÖUûicüé!èõŽ »n®©°ñ«>8CŸ쬱 e[¨á¡I˘˜@43ÀN•B‡[—~léý½,§gJ m­Ü‡ hÎtígpS£úÌQºbB,Wª’4!Xg½â(%ÝGþAûEÜíû-èq:.ð¾Ø8ö–‹ütí(áËŠ»¯è½Iek0±ÚÙ>¦ó¨Mæ+÷F5f$ð ÈzèîÈ©°ÂÑ·oS„^YÈ ¢ÕbNc{:cT¦ƒ Òf!x^ª+žÇ¸—åle&N騤Q¶›äðë¤V*Åž·{gçøFÓ!‡¾ýåâÑvÒíí½ ?Rc‰ èûRÀt¢½*ò.)A‡…u víilRŸtWÝK–PÈ«ÛR ím{ŒMr`òPèIcíŒÄÌdû¢[õš.Ê“»mâ¸QÈÅcƒ{îN],<ªjØÌoŸJ œ5˜•m.§B…ÄßÔîöŠر‚Ü]w[‡Ð3ÔVG*‰K‚Á_*ñ=0´5ì·ÞÉ\À¹ÑXr‰^@’Ž"©¿\ý¢Fñä¼ä”¦¶0ðoÕI þeÝENû×Õ×/©¿Û‡h•¾®‰•³óu—XPB$AÒ`Ò†T®5ú;šñÏʇJBÉ<,.(ñcâCHÿšøäñø³Ì“Íÿ IÅDá‚`˜|¸þû| ý”¤¥¢(ôkª};òÅý2Ãùé<Ü‘'_xb}R±€ük[aœ-Ðä¸å_®Ýœ-¬>_“W®¿ U¶q‹„ƒœÔI†ı>²JÛ‚6¦”ä é÷÷²| ç†Àcc¬Iýâ„ó$ñû/ÁÂÖc›q=>_âq$æÙ˜Âm̉ö›¢´¾Íf‰ÃãqŽ? áö7gy¿¶åw!M÷¬Ö›"ûU$'ب ,â˼ô3½p¤ù‡­3–<3KöUòûóÆuBü5Z)c¬±NÿmZýÚãNV¶8WŽÏ*ÁâsÔ·õ5y•ˆ·°‘:®/¾R’’诊´°ÁZ‘’Öë%-\mH%s¬¯9Ñëõÿ/³Å÷÷dÖNÿ¾fëÌuü_ÿ=•ƒþ·¸æ×˜}Žd´@'wr·‘Ö¿!ö炤E“+¹=ÿ+›¬÷ÿ:áÉ7H+le W¬3y…²ÎÛþ·.¦6t&ÚÄçŽ$í…—•F“>–² îxJJ‹X’דäÛhÙã®n@} Þã°¾Hù"s¤Q“t =÷\,¿¾%¼¡RI Œ°†DŽ?K±Î¤%„“L´Ãw+§GÊJjηµû“lʤÅò·yÈñ¿Ê³>‡pvÅ‘¦Ž@,yÚ@^²Yº“÷T°N뤳%©Ò <‹zb€–ò`oíî $¥ê#tÔ4uu€ @}-- )RJRw’ž’çêœA" –T¬§…««…Þ‹L¤Š–’)½‚"â8BÇ€R³>—FÎNâvG7á醼ü*h¦³ƒ» ©Iµµ@[8“»ÔÚç¸ÑÎŽØIÙçTäfY8Ù¯ ÌgëØ’æ"nÀc¤©» ãFÑüį§¶ÿ’JÞÚ +lEÖ\øèžÛÀƒÂb\I}§mádƒs·pE³Û/å1n8!<ÆÊvÉ<øÂÖ Nh/ Òz`Òï•kájE~öGÒóÃÇ_šñß ƒ “„B6àn¿¾}ÿkýïyÿ»yþû§À7ôýмyþÿ'·ôû÷кIÿŸßÒôï¡?l“þ?¾¥?øßCÿMÿß?¾¥?ä_C°è&ý|C°Å¿€þŸçÿ›ôÿ)ð­üCÿôÿ,ÿ›ñ?~ |+ÿ–ÿúoÆù™ð­üÃþôÿ,ÿ›þ |+ÿÿ¢øO›ôÿ)ð­üÿ£ñŸ¾•ÿÍó?¾¥ÿ?êÿõ[úoîÿþøVÿÿ£þŸÉþß@¢ëç@0ñMùÿ)ð[úÿÎ6FyÃ^ÑÌ çà`f¶n úwÝ“ üýÿ’èOöÿ‚Šƒ6Ïý …À–Ö`4Èdai-!jA£%ÄÑ0k+ &ßôÿûþ3ùÿ{n€ÿLþ¡¿úÿÝÐÿ ’þ‡lÊÿÏ€?ðÿ+ ý='¨^ÇÙ|ö›+(! ƒ‹ ‚A_bÀ‘X.±‘ÑJÁÕÕÂë³Ï`˜  ‚á _ÒÂEÐb¿¤ÕY·U?޳²ÿ`Žì¿$„Â!‚ qÐWõ‚C~_/ò1¼|01 A( (‚ ‚!_²‰’²‡IËs#TTÂÉ-…|å]&ö{T:˜SxÅu§Æ™ÅDIMƒÅÈMK@þ÷YEýGòÿ7ÝÿPþÅÀb00ì·ò/.¶9þÿø½ÿ_ê§Ù²ÿ_—éÀ-¤/¹ÏþCBB’SR®€555×VV第¬£GJIIéë댌˜™™ÉÉÉ l8>tèÐéÓ§ë~ùbî_|ëØð ±8§ãéé>=#“õºomÍÈh*õLêÛ³èp7*Ý`«Èõ,ѧõ€”«i¦À 4-àã6 p_@¸Kùd;à³¼5àL!Dð¥*^[žDáÌcƒ Õ*J¦™É¦3ÛÅq‹óÍtò´ ¾Ë#T@ª'y˜»+3èÐÀê"à dŸ€[ó ß¹ãá“%– Òí§31ÝÉS,ÑwéÞ*O.d‘P§.ÂÚñóÝç}ž Oµ.(-¼xúÖ«%îÅÐ]oÖ%ÿÝÝÓš *Ï“wiÞ»ø#­W@§VðèEÑñŽ{+Ù(µŠ0¥>е›šŸVøä­_2†\,ýMhlýðBä™[.¿?3à4ë"ók{kGޛĈÆÍs³Í6²öâ¸B¢VÃãÒ5N‡“¥’Y>zg´Òï€÷ªå{úó?Ʊ\.z£êñ¢Þ?ª%¤¾=¶a4vÛiY@QÀS¶‡In Ýj¥ÅÊðç>ØFo··»– õ}T3ØRLwå´ì¡ùnä¹ê‡«¯Ç›Ö‡V­V÷WG%œÒ^cZ®)þd2GGŸ:f­2ïoÉÊYì„ʈ·Ê…6MQ 5(Â@éJôÕ’¢¥Hë—ß¾¡Iùäés×JÆÜª³ÎºsþåüE–únÝqi‘•§·{a=¯@»C Ÿ¶%âÖ‚YÁ«súµ ïiªZWš”쿞’U]Eõd{/È~‹[QCxN¸²é®"‰U²ysŒ¬™ÍæU–­ãCÞZ%]_Áio×&qÃ3 #c+RË~fL(Èé•òÝÐÈÓ¾þ©~4îöí뀄)yk†›ö wذ%]³r¸ò8¿®ÝsØRÃØÜ•ûæ!ñF£ž‰ë»”TÂÜЉ÷"gOIÞ’PYÍ…§„9-kW÷v׳ùŽóOåáÀÿÇÙ4ÑumÀ¨ŠåVÀ† ˆQ@ºdèÕŽ@¥‡ª˜LèHï`Gém¨ J/B(ÒUŠ„ D¤†*]!€ôgÀv?ßû|ï{Îùfö^{•k]k­MD“ŽEè™ÐÒmæ|x¥AðpŒvõÈØL­…ÞóÇë<à±¾WóZc°j¥Õlk±e]{L¶êèmƒ¦Ûg÷x™ÂSŸ-÷":^Á1 å—é᥄’p‹'â–U…û_hQ>hp­ðÖæ1°ÙJœ-4(y&'|¼»SafïŸÂH \—6Pf–0‰­íµ8&Ì'÷˜N‚Ù%8°÷Kq ¯‰°5÷›•VêQo ÏHzfnö­ÎÞÔÞ Á*ÚóÃìÖû4 ‚>æ©þËh§-ÔÚA ·cÜc¬Kú@½€@®]Ôļ‘{ð{ÖTóã—1§#ÃïW﫟ÏågÈõoÝßà3µpÂdzÀÄcCŠh|›ßqþ!ü^P ËM+hÛŠ;xÛXërÂv=rÒé’lcX!LIÀ?+î!úóg©ÁüZúMáF›êe…ï…Þw“`·‰åÑ{°þH—»kM_"8E¨yÃÇTJ¨¨â°)Tõ€ˆ\g¤D'ÿ½ðÙöÂ…L­(†©võµ7ß©í¶·I‘`É>ï<„4Èö|€±™[Fã6Wêd}hLЉþ`&¶Ø÷á#–¤~±Lü°Ø­T4&0qý/0í}†ìüm•hæüùMÄJò“£¨AÏUâBL²´O±Ýó/—߿،qz‚gµÈGþ‡’@aÛÿVa$V]”@Eë=áÿÇå²"Å’û/€‚³ÛËôÿsû)ugþ]‘ô4ðÉwÙ—º²?ú—Ï:ùš_þ™ÍKØä;Þ­—Qƒ‘gýîO¿?ÿl¿‡å^„âî!ŒÂCpRXVÉéeÜü¾¯P\4F%ƒ“¸»¯.ó4L”¢=$¼X‡ Õ/Leü>yTÖ3öÄÏT~ú:‚—ÄP¡‡èš;Ê‹Ò#· ƒ¤Ïõ`¨~©Õüª²yºRƇÈò½M$㽟h9ÚÒ¡4ýMšQš¯*Æ6ïnQÎÂNyï6õ¯‹ÆàÚ—7œ‘ëé°}TF‰ˆŽo¹ «ŽGر#¢{ùv d’ †Š][žI»IG{”0¥"²|†Ý 6¿ß¸Ó.ä™r½ìÑÛë馆&h'µÄî|+Ùwh@K2ÂtA¥}±yô|ÿ»èýÙI›³¨Õ½HE¹ÏÅŠ£Ç¢M+<°žœ}á–µŠ!ÝØ ÊñÏ-£IñÄtÙƒ9ñk`h±ò4Ñʉ›¦¾0ðeÄSŸôé>ðdyMþ˜K«ìu_>· „®oNG`l‹à¥Ð ŠL¾Ï»ó±Y±‚<ÞüÍûôNWˆ<@^|ö˜B¦N´ÊvªzU$ëˆ?^Pzó*-r}ÓzV eîrÈǶJ!3¨üʪ¯A쟃ž_Æ-Ý„öø™ëûˆ ®:ªqjªYV&|8ðiÌÀîqøÂë.òØ›´æ´´pÕWë‡9  Øb eUˆ ´ZhÍ”æðpƉ;}Ùßø8:fó®KHÊ)j›ÝõM.¬8žŸää"£åvAr04]þµ‹±'eÊw’]1y¯÷;ŹÏî›D‰¨Ëäú¢f„ã÷Brµ\WG9û0÷É]¹#…)ÎÂ…GŸœFÖœžÁÖ>7ã ¤¼; Èw&´‹æŠ4ôÀ¥’˜ ˜sÐbi>±G,gXVÌóŠ£íµ+Âån¾¾…šCZÇ8Õ¡™š.€êvª •sðí^—„bßÇ럌Z_”ç‡ [‰èÞö#ÜÔB]²ç•|~`ºPØûe ‚õÄõ*A5Í„©hXÏÝfžçÜ*MVQ˜$ßž,İw°m12 OÍÜ<Ô*ÐÍnS4­{œœ`·±‹^ñ<Ž+Ë‰Š“u¤útqqWÖŸJy å‹®ôªU~ÖiEiÚ®öîK>lp˜}Ô׆>¢ú(Y-å9ªKh†ä¿žodݸUŽ(mOt’ñ6ÙDÖjBÜŽæÂœl"™z$u”]øÐ,F¶r³\5ï$¡Í^PžrÛ_ÇN{IÌVÝò±õ'eü÷A@¤DA¼ÌGpÙ6(]MvÚ{½ºó€N†ÊžÝQaкÌ|ÆÔÆ}|«*Øwõ¨ŽE0³÷°³ôNÕ[)”ùH”ø8­Â…ŠÚ Ìü _©º+¯ÈVG,Äw=ü7gžì¸N0÷Nœz²m¸8°Þ1ñØnŒ‚pþìðÆRÎÏ6©¶Å66í”V† rôÏÍ©Ïñ}uÔÄy"ÊÃbì£Þ!ü"r‘ç×é…CE’HõÊ`ÔŽu`qð ŽéT÷]—±K ͉W8{Í~¤à4ÁÉðÓ»Ã_p _[÷ö탸þ‚^Œ“ ‰¼hiyLͪ.7\>æñ¼Õß^ç{ÚÃxî`¼WÍñCE`^C´tÜd–ÕãÕ×iYSo*¬Ý_ÐAr¢N§ù+ée¦kËÅŽ^J¹·nJ³ÄxÓ÷èb4SB ò‚‹ï´?ìàãØ£±Ë`óÒ©¾ÁÝòÍ$f`¶;ßد[Bß]¾Ä-µÁ&%ݯ¶MÁê\Ú9B§ÉT‘%˜¿ïG¬•€1 €&çÛrÕ( œÐ¸j>•{y UÀCbŽw(`ß9Âåö‡£6#ÈûàÔåxfÖï¨U!„·˜³OÙ¼»€ ò£‰Î Ä3ÏÀÆÜ%y‚“/„C1Ya0`¹©¤/‘Lé†[>ÇoÆ (—­?ÈKKêå$„¸‚;~I©‰€Nu:0ÑØsm]sJ£6àžYXwïm ¥¯,Z½J…«å*ò=J^¨aåp'÷Ó•“k”¦–QŠ[SÍFA¨ Áí(N^L:E+ú­_µ#HPòÅ50ïìÕ²XB†~ ®`Ëže1(8ëú~$®`œÕûxxÒ'iŸ×p‹ÞK›Ïb]¦ç?ËÒ¯Ÿg†0¹ÞkÈ —š¥àÙwÒêØnd´«ËÜyW«þ5'ŒYÝçæÃ§©ÙŒ¸*—ê*Oºê[Xîøpá¾èÛ ^¶2[ãPMbñm».B^296Ã1g‡¡ÜºÝNÆ)¬;Z˜àUøÁ"œü¼ñ(p¢n ÜYwņ§'ŒÞWj»•Ä¡ ´àûm[¾D´­BS$ØŸaæßvÌ›’ü1_91OŃ{¤ŽlDPÊê¥=€µN:ñ!¼„©$[ŠÎÂùðÐÝòî ÀàÜòÎ]äÄõEˆÕt}èp‚Û—¬¢VĨ³J`e¢c†æõ0di³q¿‹I»D€ ­rÑÚñ²$†øöÎúÜáó¼³ð­¤ÃÅUPþÚ?ضA ¢Ú2#’IÏÃ.Üqg޾“vÜ@û ÙpE6Ù?ÀZwŒ‡ôoeŸ2);€l+FeÈ(Û¬ AÊ<ØÛÍf|±æ*ÔÐÿdv†É^?ÓåI€+„È耊Ãç–zhK©Â@‘â¦/¼b¿bF­©×m$Ô™×ú‰N‚- Ðt ©¡÷ó¦xw‹rÛê>eW@&Öï¾J:Óåd1ÈÚç çñrBô Í \W—døsºsW……ŸÆ9^^Á)®}±‹V:úYr(6™Ì Öë2Ù¦0·/íÑýŽÊªYoP·Ìüƒ]8è2k ²(xÊr,]üZoöùE>¸Ö(1žpJ{ì81 šÇÂ[uU-®Á .ï1t£÷’š¦÷߃/ÄC'½NÛÜH€ÊŒú-!"ï¡ýu!…ÝÁ¦|s³1»Š‡é„4/‰a_$öÔe2…¬ÂCô(ødÝoìxLë/ïjÄ­M©mƒ0{ôð ÜÂS+'?&ð’­”êr[}H$Ê})¹…»ß&¹,|ë´RhƹfÆ»ÒgúU§ä²  ÃÌcúC"ê¤˜Ýæ+ ¢n>ˆÀµAoN©Ú.Ëáò„‹ìù°V†fþyÄ÷ásËúPîÇœ<wßLËÜ1»šþ°pKDJ*$úšð‘ÔSj—½nEÈü$ Œa8ÞðÄH7Òv! u‡Kw½NñÖŠI­> N'ó0%#°·ärֻܽÑçlO§xA³p¬"vî]ušMæHQ½;wîÇ7÷`½= Ñž( _ õ*"2¸!ÖN¬z^4tây{ãÿ•’tÒ†p(dcE¤`,U 8yL Kþ÷àKߘFÌ‘õ¯ÈºÃå„ײ„Ë'ú?¹^/r÷“°ÉÞw}d4³žÚ£½÷e%WòQ$‡Q2,ƒ—º„‹`­§¢>Ï+êÔë`æ¥3õ"5‘ø¶¹“Èôôcµš&O¸¼OûË»Q”à |EÔªÝÀ­²íüËÖYLá¯$ÜHoC¦PŸÀUp§ 'V\84³÷^êû°‰ÛbtO×Eç Âë/ls†ÂqWÁâÑ;*ãÁft?º€Sç™ö-'žBá~Ï:“à!ÜûÕ´Ÿ1‘iÊ}mµ˜ >Ø®+$Ë–‰¾çVõkÖ̪»é“Ðyà|ju@–°€]ÈrŸK¬q9õ¼†]3‰”nÃÔF‡Ýï÷SÕ¶œ[ÉC`¯žO©RŒõ6òšWkú<œ×F@`éÉPë&‹·ÈS_ê¡@8ë2óxÞ÷-adÖšÕÃì™"¢çhÜ@|Ħá†7W@c1ÌÝÜI×=~`OÃ4bo³*©ô” œ2ì¸àõ)–Y‰âd¦0çÙ|¸¤¼nÉwÇ%ãå; àíÆC¾ 2^°‡Rl‡¡=‹É%#P,n>ù§^›Òˆ8XZ/ÐØ M›îýõ J[o¤Â,²fšæ÷Ýu¤îC­NÊ>ëó[ñ£cÁ»¾Y™é7´ãÜ0rÍ‡ê¬Æø»÷£bÜ)›ìaPür]IŒ¹ªª(c±å?дïrᜉ•gËk‡ žª%GùOÒ4»²^]÷û‚ä‡m#@k}Èéq–|ÎIš4߃ßù­-ïJøTÅÆ߇-å#(»^•÷”»èŠ[mÕ„¥¿ÿ ‹ˆÍM¸¬mðþ豯cW‚½8û·±Õ®Û¬n«ãGä§ð? £V^œ¼ÊÔê}YÂ×ãù´î\´Úq3‡''ø«Íüƒ²øïŽëóGW Þhè~mׇ%ç²}û¡”À‹ã*+bÀ6—øƒS5q·Ê£L8'üߘŒO_H„—x§Ï%×/ WWòxñ6åUnƒˆ&à™¬¡éŽªr¸û6[·—·ˆ­³2ñ|“më4\›UÐ~¼fþîMp7—Óœs7½"ëÒjlù‹Im㳬ì³ë÷%¢š»Üú)Æk^Ë&ÊšoË„’Vútݼõ¹b‚ZMJç‘`ʤ®¹¼ µ¸ÉJž™2ÑÛÍû¦ˆv>¥r“Ÿ°0 k¬Â:g|‡ßw ´á[fü÷SPVé]£>e¯1©™Ïû-–ò" ùï¥7ËÆÄóÒªec›©Ya&-‚g¹€yùKW¹9­»ŠËv)'L§‹ã·.øœ¼}KÖ=æ.h+)Éoè–>؈ (»$}3ÍݨÐG…z¹7.09Ì]ž­Òr–]lûb¿šÓnW}í¥TjF*\qš,0·KLgõÜ–nÅ1Ä(”G2ÇÔ¾bŠY)Ry*ç½*Ð`2˵¸¬²›Vu—Ä¿8ØÂW¯ž€ˆšÞ«Ša®é÷Ö€b}¦·>¼°Œ;‡6˜>¤¼öLt‰¥ª{º)Õ÷‚Üi€ie,Ð$™dÞP2ˆY)3Ì3é,<Žb§:0&ºùIóýèx¤˜T„G–«‘¬ÃB!<@ÑMjlÙ}‡è3Ž/™n&•Ï ‰¢4¡Kö¤¬.¸ ||Y/ ­Ÿbƒ¤š®•e‡±+'>Ô;.S†‘R» AX§)8“îa º|jãNTíÃ’=G*wBæº`®<UZW g†öʸX}–*?Éšz53rOhu«ÒÖ:Õ#œñZ€V²²3ò8u¶á#¿J Í·VF‡©¸6 þÐÔ|~Ë]_<´Ê†+´…j4Â8€Hg\òèG2níÿòìÀÉ:êÉE}*Nú¦¢›DSð”‹p™äïC(€]'Œ=IäÖTóà}Gè™ÁÌÌ%Ýã¶í0MåñÒHæñ/SÃô9n.^‚…ŠÂ–€«Tä$`Ð-oÔI`&à®~‡rA±Ñè!‚æ¿aIÚ³·‰¹ªåÄæŽ˜'PL{ðµ®½¨ÁÉ9è™Ééy7#дG«1…O¯×»yAbnëÛ=Hñ•%²[p¤qŸJkš@}±{†&Äû¼‡‡‘–: Öj„MØ,u²™±×”®ƒŒG—v{C“`º8ʃï®ðúàœàÙ3„õôô“µǼF×6’0õ¶Í½Jýò‡dš›Pk5GLxî±7¨çŸ¢µã,äP´ÇLâÈmÊu‘°sØŠŒÆÊT0™¦¡ÎßÌ»#’v–py\9 ¤Ð´aïFÍ31ËF±Õí&âÒtmÁ§­¥Œû|5ÃB°ÉÇ£#«é0¾ÖÉ„–ª·ŽØ ÝœFñÏ-–z®|»ïŒ¸—8Q;ÌhD¬:ÄBM†&4Ù,“³×Ù WÇ/€ažE°þÀ'l««±ZrWHæ‚%gfƒ+•2€è”›NS› Öª@"L:%ný)š“i-M:P„]Ì|=ßN"ýÎ –©QìymtM€â´b:›Â=“xÚÐmk¹ öh´×+8b*3€EY´NÙmÈœˆó8yeìô,–[ ~¯ÊŒ@æœ~XC ÃÜ=S´ –gK€ÅJψâÏÄÆÇ· l+Ü@Ž*¾/Rîüÿ>½ø¥ØÆ»i¸qNƒ;ˆ³v›¯p…åË?ruÇ»ÞÁÜãWö=å%ÜȆô–oUÕtâ•  Ü%{_.GBí”YEuB˜šáŒwƒ™¤÷Ú'«ÌxLnÚO£š×Zý…¡o«o#Ÿ¶^ëý+³â£ø5uL z±©ðAe±bp 0™(ä‚ }#nžvôúúüP4ñþŽ\Ù$š",÷‹F1Kp|c*‚y¡¨ÞÕÆ2õe†ë,‘zÞ #„r®1ôâ'ç´³çŤ[åÖzб-‚Îü&çuAgþê /Æ7J+-áü).a%õC é;YŸ³ ¨i«!™ˆ—‰vÚÜípu4Åo EÏ;Ÿ 1üx`ï¦QÁ›|§QAì—øƒn3Nw;;îZÔ—pr¢ W V”FMÓyÈ ˜X"ÖѦnú‡„ñÇDŠü¡¤ù %T³‚@g±sÝË刜p¯’1‡P/Jc@Í!&Ud€{ŽêÖ ?T圳!?1Â!UÐëZ6Æö9ÚFrÚÿ9èGï!‡¯ãÊ1Îù|@ †äßçßoÛÎe©é s†(iY¼vðÑ•Ù߸̞V©µCÔÀ3uñ›6Ø–féeÙ¦ì}`¼ÛQík{@Õ[X– 3ÎéÐàÈܸåùÓ[VK)QRQÅUÊ6šûQJ²O²Jà&Ù{# ïÀ1@Çq—‰céùU0ž¢?!°.p©ñÙ% ¤û溔“­òdó\mJªçE^`J¬ºv>ý$£ mîêz¾iG$|”–è‘;9u›_QŸ„VøL2¦ñ_¢Ÿb¬W“`w' ¶ ¦Tà˜ˆ€ôh:àù E«(à>Ýż0‘a ÓÚÖƒNÁÕÚv²a“·ŽÊì©ê· ij8*|"÷ì êΗ|u£Ù, n™76ò|¨·vËnW»)[Gòµíý ¡g·» ]pÛ×χ™Yÿ‰£ê<€º¿üã‘+šü/ª ÍíkZ;ä­ÄPÜ¡"^àjU_´Ê5‰>tÅ­L6”&˜.Z%í4_dñ„eÕ±u4™‹ðë(?1 ”nƒ—eø>[ª%׉]A–É“àµÿƒÙù?À”˜7"W%#)©îºžWÊÖ4—zPN*[4Åã4àŠQãNš'úx1;¨¦‘«ôä°ÉðcŠäà|¥6O–GIº¡æý«æ9‘DTÆaFK& }X²›ºPs"j~ƒ+|zà¬ÉÍ㫟Né±oÉ×Å^;ï²Æ>øû»ÐõØÉÆc¾èŠÓ^2NÀû­dý)ú*¢îîûZaIÝ8V¡RóÑnÈZÕkyßLÇÅ7%P+š6©ã|(¾þ´å²¼à`#1kìZ¢LmeÎý~4êzA훚Ÿ®Ê¿»Bb¾KJ³]v¬ ÓÞ£°ë4pòã|Ð!,-1Ñê–#M‚jêB!åó¡Œr6·Õ5Y8_á ÅHÜN2^ræPÃH‘ã tºêƒ-kQ0Uúdø-nÛýÅålÃk/‚=/½gHV}øÚ®ÌÅ{° ÊòiYÄOi%oG[¿DqžEz`ܦÏ<(àäbQâqè*ƒ¾Î_¡›ð¾õñ“Öžó¥Ê½}K„“b§Ü™e¡Tó~pUž°eÀ畻Ʌŧ Õz@sŒ›§ášm6ƾ×䫳3¡ñø”‰óìK|¦‡vÕ¦,]'r°‡²Ö4ã¿Yßž˜ýDM1ŽrA©€Ò¬|$f·ÔÉç"äœ,}]G‚c,#bG}“(ùØ‘]PùEc:Ñ¡á J3å‹P;ÜŒ’iØòàl!ÜBÛàùÇÞUâ"¿8€KþøiHbmd¢Ú£Ö٠̈€¨€Ç^¢,´ìç *¬U>È‚eŠ“ç±ÂÇq¦Sª4è—óPÚ‚gk¬ÄŒVçpô÷ݹþ†„–2…J¸û zójkÉ–²%^ ­®•ñw F‡5¯%÷]Û¡s„(×(~Àmuø…€áml*»Á¨ð6#êS~„eNKaÕ'cãX!Æ>B$6Ù¡!¥‰¹o“ ÉæÙ7hÌn¬¡ñEBÑFŽO_Íf¨$¿‹IK²ð*6ø!e"SiÔHEK¤ÔO3 >‡e~¹òªòGDÊ‚°¸‚mxÁé ¾ž¸êa¡Ý—Ýá© ÚÂ2ÐYBOÙ½5±6ªçƒùéïìEKÛT^LMï[åd86sA(ï’þ f^: NcèõöÝÉX±¯ñ@yÜî%ž…¤Úå²»ã×ÕÃZÊn"F=ÁôR\“ÑM\š šŽÇq ê¹:1Oòª®Ö²œAŒšÙˆ7huá7 £Ìbëý«¬í|ëB]“ø²OõÍÝ, a™î?73$Œ­T‰§]-2m|„3S$ª‘7ôuÛ‰qx`FY´í†Í´ÁÒò)ØV'dl=L<„ñTn3V»w®·p-þ1lÑÿ c7®=ßurí¶uTV½UÏÄ ò'>Œ(—fú¯çÆÆàµ¬¶ 0]8¼(€Õ¡5G¬Üˆ‡RwäMËÈoêílßaÂå ™kÚ†RÙu"Ê*Çí=ØŽ÷ívÁWÀWp¥ÔnÔ¶Ùº §Z›<Š+#‡œ¹ß ™ù¯HP^¼ˆ»¯ñäñ”£'NÌtÂŽÛ ŒÞôhÒˆÁ)8ïùüY1R,¹Þ(¯Ù›êÇÿéMF?¬íû2coÜ2jPù‹“NÉ–SœR<ü½thâXºÂzY.†—pÝiðçžIfÄ TvŸ,}Ø’ðz¸/.âÔÙf'x¨zñŃ6¹z¨3eñÅ.¹óÎUbþû9›\þ{Õœêà©‹ PseŒKÔûB-$"%÷V æ± vYgâgC=;£V„v© ̯¤Í¡:;a4T¼ ŠÌ¶@¢>‡ÑNì˜g<ß×úPLæ€bkóœ(ÃÐ~»ÙÒÜよ¤PâÏfÕM–qîfcDÛœ™ˆGÄÎ_¨4zeä~Tsº¼ &YžE¡rxHÊi(û‚g`­=A¬ødöñ%{þ{+Š@ ‡ôD¡ó¢Ê °úŽ(¥Ø1$B´g/VÒ—.kŒ|ÍH‰;Žc*‹ð«¦ hG¢¥Pü…*ÂðÊG™g°×´AÇR—‚’!‰ž˜1u¿±=(Zé2)+Ìt¢wArŠÉ0ç5Bm¯7Í*å© Ú7`Bã,“ïÖ›´ohÉny8ágÅñlùH#£ÅëK:,;«T_yÖ=âš%ßuÍÅc! 2´˜6˜Ô@F[„.­ú±ü9H7bp]kZÀb{ƒvËÝ0LŽ ŽØš˜ö ô*ã±(ôlÀÄ$ž²àëä£òTè3õë— wºä—”Š¿Øƒ]þÏ®XE2 {éÆHonŨÁ\0ý­h´%¸…w½Q‚&ž˜Slޤø#tÁö|Vás¼µ 93Aþ²‚pÛ¾—ô¢¥-¨fF…6æÄqs÷èý;€âf”Ês1™HŠ]Žq$³nÈïV>òcxü†§,cäé+ìòâ$ \©šÁŽ€;– žxœIn ý®ÅFÌçŒbåüÄC1$ø»¶À=…jni¬=îWtC±×®­\‰§ÃÙ¯}qDêvüî[Ì6.¦±øÚ}aYr›ú—_Rî <<ÏÌÀÇøÚÑõVa„›yõ˜çÃ׬ÓâNhÁõ_xfàŽáÙÔ”}óÖÓüßo+¡ž@Ï î=*ÏLI¶]CSdM·œÆ÷Q v(€izãРÅüzö¼‡Åñ‚7Xîx¹ÀÎt#ð+'½N+Í´)øB …„Ép,›e› Mhþ‡$pšŒv^¶Ñg6zɼÍP)‰*S»<ÊŠ%Õ´#X Þ¬6éºUÞ\;æßù>¶ìª­Çº<ŸZmÓ@F'L<䥩[­v¥4RE' Áz–g|žx)²ší…Šm Ø;fS.‚%L¤3ùpâMƒ­ÑªÙûfŠ ž[¨ ï»T¸>÷™¤‡ý¤%vP <»\ã1 ÖºÍ]oœ*Ûǽ… nnâûñòNTP][ßíÕ' µŒÔ,Zt’áFÃxç·è<7p¥øvëÁéíH¸¡f3Ž}¡¯Öé+ŒÇ·¹dšù:íÐ=b¦£–Þ°Û_¨sãa0FÔ¼ ¦o©©±*/fÁ¯®W“ã~€YÖI–õ#д-èòKSXP×{õîŽýƒtîp‘B~Û c zCMÇ[¨©·$Cñ9#Dt¯Ë«ÐW%/²_17:rÉ (‘Ë5²„}–…!ØäÍ’EîÿœÀð{Çj5PI©”›÷aY1%ÐÝöitõ Ì•í¢&±+wá×¾rü„ðÈù•@„{þecƳ<¥ç]wEHœP!úW¼éQ2“­[¿œ{Z5üö²Ešé‹bŸe䨷¡Óä̳n(†Å§îÚZ¸õÿü>ô1¬á³Z ȼöãK>|½!õ1{(¤­xGÑzÉo§±ü0×ufýÌÐçt˜šÎíI-;_gÔFŸæ è/‰@YÁÌèöïôµ_"¡¡=b2úáPyPÅί]§µµD#ãßiUP…½iÙ·+§/¨õšleÔ~á|D³K¤¯Ö—ÐÀä®#06Šîÿ¹¯.’–Ë´>¥"Iû&ܰËBÍ&3ÖïÇÊ8cé~]eg3n„Ì^c#Þؤ>!ëЭ\$šˆÑî¾Ã»†sçVyÔÁ¶S•ŸXóææ­U‘I Ž­íAî²QP‰°†:CýdTUru3 ¬£JÆYÜŽ•Ÿp-Ôÿ¦‡© þSI{±ÏÌ|0#Ïç]á‹lb9ÜísAŠûýf“6¢hK”*¿áð£<ãÔ”ÈõT2Ìâ†U®{vN5ŠâÐzIøg€Œã¡IÎïp²\¤.þŸúúLD éÛtž¾›©žÞÓŽ§ß*òŒî-.¢•îò§æ59#)E±7tTͳ6­Ü8Þ[Z šIq nä…läNÌÿÇg0•œ%̽Èù† Æ×±4ž]ŒûFvYtB/Ocu4¾$ó:9Š¥ñ5¶5x#ß%`?~\H1ûý†r¥B¯6ó¸ ƒÔ+ËOtÒÇrrî¸SДèg(X˜ÕÀßO™Œ7 ¦HÜUퟆ ðDd~Þ(>GyÇ ô®‹þº´þ[^}$t?Ÿo³åQÞL"Ÿ Es}4Hº q AngËPÇ]ÓõÿA9ˆt ¥¾q Y!úqñçûpc¸S<øõž+jfeht¬¸V¼î$ŒJÞ4¼`˜dq‰âô-YmQfÞ -ì1…Ò´¶Å0³„ží‰ÏbBÆÇÀª¢c±yÜHð‡‘ºCm —~Ž•ŠÙò'®ÎÌ¿TlìùfèQÞøûö†F½¤cqMÐ&’˜©øaj±Å+_Ü—èÞWìu^:"³e!Ìø`‘Ñ4ãj ÜfnÏù-îÁi;DHE{Í-Ƚ&ßMIñÆ Ê ‚Ì«lË8ð1$§+¨¥öAøä¼oC="š \wˆÊ hè;3s³ëjÿX~Œ#·_zªx×*Â:ÜY7†»œH›©ûq­=è¸ÜäçyUv&¡øÉ„ÖKop…K8£|â~4×¢z2¼$ØÒLª$(f<Á‚Ò’Áø‘WÝ[›' •ÖúEµœÝczèm—WÌØÜÜî®T¬‚aåí1ÉY‡…öAÔÄNœR<\=qz’«‘ƒ¾Ÿä6J”|ËËWƒZl#.Òh[ÃÖYÂ"R>rWTÁNnͪêÊ»¡i!<^¶iÖw@­H›ceT%,œ˜ëíÞà¸S4¯¢-LÕ‹bo2(«ÞÔúäý“]¨®3ÃÔ÷kcoÇŽ ŸâúÍAYeËã³0úáÈKšõ÷ååa¼pfÏ/ª[À„½Y…Û,.GÀ®{‡¤«/Ø }l‡òz#)]ÓàwÔì¶ÈB¸ÅÞ"m]Þ{éœ:X‡à$xxðj‚×®9HhêH@»2´#M§µ3± Ø'@6uÆ=¬/«,³1–ÍꑳT&QïêO¹Êô \ãûÑq6XR¦BEïÈ«¯Ig¡‰:^ÉHT†þøi¨§[iS.s­žVËä ß_Ò¹ÑÂM諚CqŽºl¶LáóxHMBcV¤ô:#v.¨¼Mí®;ßÒ7.Hûx–Ù¿¯û«‡¯@ÓJÓw-iñZcwC0œê‹ÌV޵GWag¿ãËióv%¶ñìÏP¥Æ¾Å>]íƒ ‰(w|¹ Ù¼~<ÁÕÖ{ÌŠ²_M}»Q%)FæÐŒ¬k€¯ã’Jr#ã#1¬«§m%›=72=ï& ‹V±·>›­Þ¸FÁ$Ø¿;è@Ÿ!TÒ(;ža,}&jÈ¾íµ¯óƒfÍŠºØzÃæ>™ôNl”£t8c„“—p9¯.”²PTÆRtô6³ÄÕŽ2¼.GP°ÇEùòòX.›äÕ}O#È¢õ@^7¯ç:ýšË†‘®ÑÁ× ±Ûrƒ ç¶O~B*ïà¡uz# î1ΨO%úØ»’éFiìÖîÝ’©uÎ88û£;|{ÒLßÒ1ÿù-ézô1Z9FÏÝPñÒæÀ˜ÛI˜qrÒfŠ«^mnqêV'Ú £æc»‹èIÇ)ÊÃ8P‚Åà“›_ôí‹ÂWr?# Ù’ü]£/¨ÆÃKjcòð‚—èvdêC)œÞ7‹VUlâèœ^G²Ã(¾º ékz"F'ó,(¾’'ˆéùWžr½T„WÕoŽIë=èðgqm‚ã¾Îiý¸iµê(2 3¡'Oî ["ºWŽà÷«×öb ó”«G"0¬ßqŠ(œ¸iÅàÆó6ÓæŒÙñgëÁüª4,—ó)æ*naç‡ï(¿ 2²¸«/WA6“oÐд‚H7*ãl9µÎy” ¦„êÚü2ž08ïJˆÄ%ß/T,é“)¸ rª/GÒr¡Å=ßU§r 3T&vù¬íd¥Èð}/KŒÛb¦D,çB¿Î]ÿq3n\Ùè$Úhû2žûÆlÇ…Y^¤ÁQßËI\‰Ñî,§ÞóÂÕ·²”I~^Á8(.Žsöe”®H(0„Ñÿäò@p&¢±ËkÐJ5'—`‘Mu;Þ`?¿÷g+³¥›ËÊåÒч³êá,oW©´w§o3 VˆNÿjb¨™µå°gi÷• ”AO¹QÅ£¥yõ9õ{JŠaùÎíëž;¾‘Âd§VçUô•Û åv„ “B@ZÊþ,½a:±ËÖAÑ÷¥¡àT}Ts`eæS–Ñ'ÃÔ@½6à 7}p¡SCkO2 Å·©'¼J˜h6ÓM?OÓuÇÌbû¶œÉƒ«}7Áz,’2<“mÑÛ·LMÚŒðkf÷¾ôŒÇøÁÙÔˆ/¨®ʶ¬íîE ýÕfPL+E:ÏO.ÑÀ·i°ª>í&Áëø"ÕÝM×8ŽÂŽ 7ÁAP)}“/|zQPxVûþM(nz–˜ï3ì£÷Øø “YÞº©ÎºÕ¡Ð BMph¢SyYÆÛß&YMãžõ˜âcpSHåI­Êoä IŸ ÇVÌÜ!Á ÷Â?a± Q”Ûôgà€Ïjˆ´Sgq ó³Î;DzƇÞàtÝ)Á3nàsKÆÒšFqR¯ Jf\3 å¶þ%Ž´pŠOgœSUÀ¿Š¬‚9mWœ.ÒËdaêQu‡jM%ƽÚ×mk„m š_‰³"t÷ ¡uŠ 5x¸¼`ýå-|tƶ+ô-$Ÿ¨ËßúªÇÂ{D×.¯žeÂd,ªß .½ÒÃäb?¯.{uÜÝí86¹®0Å8ŒÅÇÄYG”4✲Uý’½ö×8ÚæÖùíÔÊ;8ž~Û_ã ¬íú UFŠy8—¬™ŸérìMHtû3¥šP1Vj=Úö󯾿ÒkJé»ÜÈ4ßìÌ*§¶ö…2$íßõl6%Ù1kÅPz6bËéϯµ˜¡Ž!{˜¤™”"`€ßɈ^å[%/XnJûàYÎ÷c›, VÂwLS^¹‘Âoirè§PYBô—›:ÿ©=¿¶ù¡“PîµËžÖEå' ßwî„XŸŸU®æèhîã%4乨ÄÃ3ãç³T¯i0žǘ³Ñ$’€=ÑD»¤íE?z–ÒÐÄð Jƨµã( ‚e¯†œ­‚„&8Lø4/j0.%o¹Ç€§¿OÿRMÊLPŽtyCBOÒ`2±ÇKÓÎ"5Å+ŠYlƒë¤–X^¤jÒ)Bc©T¡ “L¸à4{so°p¨ž‡a+%k¡Ô šÕ‚ÆAázÿ×|?®Br§ÀBîzj¦:‡õöB$«§ô¯´·²0˜¹oŸéV—agìåÆV…]åO»/ëh'¹6FPíwñ(—£³låªøKZnŸ>>{Lé(½hå[!"5=øŸô]&1DËBF©Ióq³K¢±Ñ¾O¼ +ý¾ÂßÄf@¥•u9’’~SOÊl—i-W4ó{\-ü- ?Ò³!átÏ~nfš·˜“pMOZó! hÛÞôÈLLòÑ•¬±IܰøÆÝfºY·è’>Øí1ª„:£7Íf>BÿcYŠ[òà¢cÃí#çBýº§v|P{C»D'¥9·pÍÙ¯Gk½õ}hCË–en¹9¸¶ñ£-—ëÌ¡¬ÌÂߤõ†Ü¶¶#í’•Ä“X/Ðê[¦wñ‰Œë ”“i?ÍÊ(øZ,JqãL2cGÀì  øƒÒÈ‚s¦)“HßTgâGˆò¡ñœDøŸ—^ÑÝJ¡¢ùœãÄç{áPèÝÓïƒ>y‡ðÆçO”œ^˧ÿ‚!ã«Á‡ªæ*'‡M3e¡žèãoÓ³pÜSà ;ÕT‚)1Înbr(§´\´XçH»º]ÇÁÀ i™ñ··ž»ùÕ}E‹CÞÁ3‰;5±…^0îÕÚ9ÝæÈ¢¬ºfLSÓïèQX¦“¯¯A¬n¥'‘YF?=iS¬¼9ÙŸvÚQaÅ÷¸³±WqÌôQœ„‰‰×JËÂl‰³n+¸YçÝX®à""ð…õ•žÉœfÆWqä®=áúÌtGÁ:«CHY~ÍxW F¸qPm(ÛO6Qð Ã×hâIVùB'SáMázj5qâ5CºÌy>Ç,ƒåöRžè0[•宽£Gº®•ú@AÀnÆ)¼œ%‘ÃWw¡ÌÈßI ¤omzôO}ænŸH¨,ÏmõV-»S«¯Ëâ1/â«ë(ÉÐ0H)ô9OlšCc¤X$ }Ô”ÁZ ÆJ½ ”Q5Ïå¶LÇKi;)Mu#û°—qW_²©×G¸õî…PƒþÆPZÌ…±`ç>‰‡ü¨Õ½lëž>>¸¾©qçZ1(Wóòkb Cc;#ÃÓ*°¾¦DY`ÑŽ|)IÙw°_œaËÅ,·Ž9w“üyøB—‡_×ßj~àÚ¶™ñF¡y#Û±|-±ÀÖÜc&¬N¼BõQ™,àUy}[cëf#ü›è7 &£¨g9KÓê:0T¨Û»!›Y^g¢áw¡üaŸõÝQ”fώíÒ:aé#G Õ>€ëgu;A“" »îpáû*qwÄúžYÜmöþQ¥M@ÓE#ÜSzÚ…q+ÂÕ®’:œ’SÿÉGuô¾½˜ {ºy¢—‡žZ°U|±=~g˜ˆ>V½{C£å˜®óìÏÝ‘c½Eí8nšÄýøôSõ?ýËA°ù¬0mB͇‡ˆ™eÍxñ:™—3ÿq\ã‹>„Ëd4cC½¦¡J¡A „z.öÅÒ_fø¢ÂÚzx!à·d![™­mzïÚU†Æ–´b4éŧntÙïïìEQZ26|0¢2‘ÐÀ³Noq ¯-AŒÁÐf3Ù¦sdÑó\®V¢ÜÔ® ›É„ôírqå1ÞPxo‘Ä .™„€Û^ˆë÷éÝXO0Í< ajB[+?é“3£À‘=bÛûßÁÊ™zñÌk ök{…ᣒ¼Ž‰§H gùËmsH§U'•™½OD‘L–?YÿÈ„‘@(‡@N²jÙ0Èö£Fh-cËV%Èz“¿K”?_ËÔ~ÆÒE3¼S aß,Nà ®7ˆJŒôz ®Î†9‹¬Á…Å$«Öò‡¶ºu=ƒRÈ ÆBL®,`Ôh¦}'+ãûWœ­¤-E!ß68ú&­7Áhº{ÁW𠝼¦îzlóy|.¶KL`“ûÞ2¬v™¯¾Y½h·çHØø©I@Ô½Š?ý„ ‡‚Ø e¿̇¯HE¸2ø¨LÔe2}ÁÖÐûÄC±Ì¤ËwwU•Ñ%ŸšÁÕÆì@Í×G`´íp)²Ü…E•#~ÃQ$`Z0CW#‘w¤ï󚸶þ€Äs™~¯ú8ËèaƯϤHÏÅ=>îD&ÊÈɪQç! }§lP䇰Ëð¾^*z¸ê“õôêiQüx‚©x D½ÈF? =¨‘•Ürœ5¥9¯Fª¿<¶õ;Ání[‡Åñ  wR÷ïÃÖÁ@¬RæQ¹ó®áÀ½šÝœ@‘ô­xPWF?Æ•#¥3õ_VÅÕÁiº÷Ç #…ûX¦ ¹<´jÀÈg47ÔŒ°ïÔápŒi<¥c‚àC±Å×Ñïo¬½ uŸ¾:ƒŠòŒ¢9®¶=P¯vÎ;Wf;;gÒ]cLáIE» Ö…g¦uæªx§\ñÉË ´oí04e+ü”±— Õßî•mxz~>­‡‹9eÉ:8ÄWø„ç¡1rœ$¤:ºè îm~|Èák=Ñø¦!…·Dµ‡æëýÑyy«â–’¡¹¶Â*'k¤´|¡<ÑèýÍ—Oå<ŠÚ£KÜ\!£×Ü,c¬ÍßœБ›ƒwÏՈܮ0z ¹ÍÂÕá¢ÍÙÆ× ”Ý‚Fd…åh÷2©3mr|*ð4ºQà«`B ièëσьA ©è8Yi&ªÆSÌÝð²@¸ÚvT5çbÏŽo+q0œ¢¹Ùc¬/Ão,Üö=ÂEá“…€í(ò°I(Âßæ`]M˜ù 0QÎ\oÎÌÀTº÷­±@Ivã¾fžÀ•ïO!Ÿð]«ˆ#KdKÉ!Ð&AmÉhËS°ŸÌ×F\²Í…×,Ï “®1rYAÃÒ©Lˆ}\¾Ÿ#ãã¼õŽ7 $ó½2L•÷¤ËE\|¥Û„V„6;dÑN=Zš(ëGÂÕžŒ*Y#Û@ÅM਼Úú¢ ô….ÞË8÷îçbXòzà–}ä¹]OM€)ñ±‡¸ó;!ŒÞªCarЧÐK!uÐÆüI ÙŸöý~À Ô½?ÈòêÅ|Ù±7÷D'¯‘¥û]š@›Êåƒï¾àÁaJ¤݃<4ÂÛ2”@pÚÄf;ÀFt4›ÖdyT¹Ÿm'Š0 Ãù† ·.ñPÜÎ:õ£7•F÷†Ÿ3¤²f.ÿ>Š[·¡8¦8]EI^0mÊfD¾í#__F@E=‚¢ìë ®ŽBï·Ç&p›ùlžç_NNô£ÛÕ_†•B9?‚hz#1[ ¢„"<=Q1ÝXŸvÛZ_a¿:êìß«ÍÊ⨗“ó¹’qØ… š°[9ÇZŽj³­­4q¡•Õ;°øÏ)óVÛªÑbêu0ðÇT×qr–s¹¿ò,š·ûL>AŽ©Zœx\%|/*cëv¾üóE°$läƒÆ;E¤‡ôCF‹lØ1-BûF #øšèÏzdC–0a;ÞϬluà†f<Å‚}­„LÝÞa²õ/ßœQ¡^ࡽ-^90ç}llØnÀÈpõã•ümšòzÒ›>f}R›éÄËtY`ô«® À.ðØãÑNç<ÙŠXvÞÚ £V ²‰‘ãú€®xñÌ ÀŽ07¾N”Ý(-„_¸µe„0!Ã6b­~ÍX… ÈM¶z±;äE^?uò^ènÂ'K‰$” _ÖÝØ$üš!暈ì…õy­ÐSÈ~CdÿpTöøEÕ-˜ÞÇ–©„ê–þ`àsnp»?ë§Ëøâ£PÏ(Í[wLçåu*Î[Öq¾âžÙøµSp sþ#9CÓã!!JN÷ýL£rñ¼G¯¦FƒÞ…ÿ£{2¶å5„1"wjªI†w µíJÓ5ê÷®ž˜)ȶéyH}W·øcùMPÄìÛF~²ÀÑëmÂì«(Íø¯“´Ýº²z£.K§Ú‘QÓ!ŒV%ʤ‡÷ë3Õ;íiPwÇqÌÙ¹[GŽca¡Ø¿å€(n`ðT¯|“˜÷ËâžIúÂ}ãkMã™m‡טŒlûvDµ]}ŒW±S0®ÞÉíÆ2½ªÛ·’qtާ`8˜…s ÀIZQÆô•^‚W<3ÿǨG´ ¡†[抄<·ß£t"@«¾BÑ‹¥ µÜ3`wcîäUíõ³¦ã¦úV Ì©$Ür€mÕ&3è  ä<{7Ô¾½{aª4Ÿü¤Ù/R™‰5¾ïy÷pLjáãêâBÛ(Óª3T.rd‚å( Y·³8}ƒB“[õc)³(~©Ý/Íâ!¿—ã1Ï£ýíÃ5UÇÐ0æÃº‡ËøfšpŸ á82ÒQjÖªOðhsßÙe¦ÿ°Ôga­éÂæðܹ±¸j­Ð1UêôèžÅ©†¬Í”ÊK Ä2²‡V ãï­ci6Ô£íäÈ諟'°`§i¦„jù³LÿºAr£×)šÏ_rÙ}q ý¡ÞÞèfŸB[áFêcé–âüÑxpÎ,rXõS&u&Ä‘cðRd Ö¹|":Ä!9º™ËrÃ[äç~ì3cÃíáÏX_ÀôË+…c¥P[—õêç’˜b›ˆ|î7ÝjMW‹¢àºl`â~¶1|š2K¼•"æSÉCp@Œ[Ý…{¬îF\?ÒÖŒ¨PÌ‘C¨ÙÏz±ÌØ%ʺA¢Ù†A÷+o2zEñõÑô“åY50·Hûe|åÚBGw˜æs«zð­üD1HûC¥®É‰¥ Н8±Uò)ËUÆ~“}¶!‹aH z6 «ôi%™ñ5IéöF ;Ô¸s¯Ÿ×oŠ®ŒƒÇ¾öù*úÚ÷ˆQÍŒ@kÍ[»/Ü/x÷ÐÈÝ|Ör¢«ìÊ´˜{·5à‡“Æ¸g,t÷_yØTß¶ÖÊK(Èl¨˜\£ì„nÎlL Ž[«»õDBodzk™° W=‘eÕ`òÅoIØ*»²›Ëâmñ£B ÉA¨>eå$såê  »6P¥8g&LR¾2^ˆ±‰‡ŒM›žË+|ï£7þq¹xiƒå*Ç'r™\ÞbM%ÁW×¹´PwäŒË^‰gr^VàgŸ_„®>lòk[Óæ'„°â™ÝÀƒú -zÅ…¦ÎÊWIÔãv»W8’jP½À±´G+%½E±Ã*æ{ø¯  िNþHŽ1Äh‹‚ܘÜÌ¿T²\eÐ<0méää¾D…E”ÐìÞ)ܫͦcÈ9­Sq"@@@†ÐšM÷¨™Ñ ú‘”Y`9¶C èºÉ×Å= ‹èl´¨‰<摽ٔ/! 7«[+S¨dtÀfs³çÁ•’$š·j’–& î <ä¸kìŒß«j+†L\mt÷à\mviñ<¿ä¼}§Vûau•úM³£{,7ø"1Ì1\Ã¥ÙsLÿÿŽŒ¦#(”‘¶À™Ó9,zúª•ó,KédVpªGwdvÞ#È7Yï¨Îš[ܶ‚´eø^jC= À $Ê@õæû6|{O׊X¬[%imµ»­ϼš&Ñì™Ýæ#½#cäA—ü.Ï@[°õ›Ã6 gV¬mA=µ/$iG#Bæ}Ï£G ’ךwê‰ñÄ–sì÷]GF”ò>3@3¾Ö_;ÿÂÈÅr\×nà1–Éÿtמˆg¤8ïJ½«Â½#Á¹e8´¡ñ L–Ћž-Ö×Üø¾íßÎHJø–Ïvšè¾•ÛêeoÇ· ¥Ó命Ó3F5Ü¡ŽRr(ìTÆÕº6 <Ôå^/½¸ŠâŸm›\…׵ΖN–bÁØT;YÁµ±:ÚZ_’“³0 ¹2ê¡´ióã«Eî™!AhÞ”³aÔ¥'.KÝx<= Õ˜Öµ¼8‰®œœ'y£vSŸÐðÍò”Tû24_•ÊÎ#ðŽÄ<“%ô¬Ò¡¸~,ý*É"X Ð~Ž‹¼«3>Œ”úŒ¹º*NÀœ[ú çk“¨Á‰á×NPAËCZ¾¤]n`î ”fauÆœƒšP7 ½¸Çʲì?F¨ÚúST{QIC1Xp[¡ëö˜öO ]'íøDS‹Ø «†ÎØÃ Ú@Œy”ö8@y; 1O¬ÚQ¡áD{f1軘yàÓyQÀzŇ𾿶D*™Ià}â¶£Î?dœ=õhäò,œ(‚-ÝúûU¹æäf<÷qíe|Þ¯ s=p}îûªóC”Gò‰‘[ç(o…ääåÂÒbŽê>£Sf} †ÚŽâ‡d5ça´A)ì×û¼ójÕÛ ÉiÑÍî°]zÕñlÄkaGY­‚ØÅÝ¡ð·Ýr:«GÀñS¹.òýORGcÏœ0Û¨ƒóçI™÷ŽbG°ÑЭ,ñ]{¢C(wZ*ŸÍÇ:¨žÚ/ÊAXŸ…ž]dñjŸUS•i†±MZ§LÁéúpƒ‰ì¥Õ /z#>éaÂâ¹s„Ö€G%v$ßI†‚([G‚(ôÑ’u fÁ"ë‘È­ŒÞÿxÛ° f̰å7ff ²@ÞëåéÇiø˜ ŠQÌžx¥ñXƒ4šòÈn/…‚0Ãfš­û·–žUÿ¢×¹ÒC=ù”‚ÐõW¦QûîÁHcÆW}ÓÕÞ•"øàRáûž†?M8O>V%ûž•±z˜r¥-ëŒrAzW¿«Ã!eïÍ]ñc”kXg2¨«¾ ¸íÄ;l«eÓf7)…e1ø!^_³z®ã§?è&Ç[_‹¬œ®ŽÊplòÀh0¢Hx˜0sSJÝš¢¡V'pé«þF¸Ô‡{pº±Äµ!P²ùkù½nýü0î€ðm¤¹¼›èb«Ç1úD¼y›Á!cˆæü¾ºLLfxNß™ív`<²*‰KEª+ó¤a­ ªÞãSiµùÃB^F×ÆÎ·i$‡R·rß«X£¨Ôš—ê5ÏlVQ°KÖ:»*iŠK¦¤áÁ@ÛJw½y,ç}’ËÆ¦}å3‹ÃŽ‘¶Íó’öìäËËL‚$ Ø+ `Î&YàbÏ‘$›†º7ÇràQ4X"¡tãbFTÆCŸfLj6ÔÀ´óÀM‘;Ep¦‹+îàûS½!˜\M†Î&Q»é•çóB\D‡$i 0ÐÕfœƒ²FP³?=ba\°¢.T—yTÃj$’2i“Ì r[šê%Cúõ#;ਠ·Ö1…"‚þõ·*¶ònñRý¶ïsôiR˜°:ô£âü„_k]Zõ% wÉŒ¨›9÷YZ&ÄV_—Ü+<­øZùâuõ'óÛ¡¾Rf àÀNhXcÂyƒ®%CãÉÞB7gSÌræ—²œÊùµdh>é”Xa¶ûýbn)˱ÀÓ3¤ß9æˆ`íÀ͉Û£~bXßJÄ'¾QH^Òòˆj)6èèkHÕM<æÄF‡¹òD|[Äù4ûšè\šÅXÆ‹ˆÔ7©s’iöÑÁ4&MSv˜8ÅËâ¯j)›ëÒ±ì&]ÃÙxIJu^Œ]Õ£CeølªÒ}1;•¼`Œn“F³ù”q3RŒð]siÿ«#á{´Ýc[\¸uJ^L ?¾¦5¢÷ÝN£ ZRÓeˆ!w~e=IY¬­6\C¸ÝÀDø`:¢U+Ó‘Ÿõüø²*=÷7±u^z&3fËæ‹ççnóZná¾fûÞ2¥3]›œ}f¢7Y°^ß‹*bòR- NJE¦w‚WͱûºûIþ ‘Új²ºb‹~™n1¤•nþ&XînÌ”H'û‹†tÙ}úiâ¯sÆÎt5× «v9¡z*Ж=L;~÷|¦Ö™³;‚93H3¼ÖUòeÈmvÆ3l~£¡É`¸MêóS;a͆þ(zUÖ)6H;~_Á©rm›X¹¬–÷F£ã ·ü¯½X(Z]l5Ñg ?Užy-lJòÚé,¥®ÉxÎŽg=ã èež8õ`¯s5¿(^´ñ¹¯Ù üeú}ÂZ:‡è©~‹fd³)Ö7blçæÆ[pëë}B}f?TÐÔ†µÜgñbßei±—Ïúnbö|ºüF4)¿( õä¡cNïè3M/ZÈ^µ'©¼`¿¬ÆurË^Ù¦K>ÆJÞÔAãW ×:UJß~<óø}jæ}môc_³8-«|—…ÛP(ú•<xLÇ'{…?ù˵N~™\dõˆgVÃ|N? åúTGÝKÙ㎰Žëëñyô® cí?x‘å,¯ø’Êß² gö’/¦÷2l®é§T6ò™;ªu'4°ÿ@`XdÊÅÔ^Ÿ‚œ~ÂÚBŠðeÖÈ8õ £¸²1š>gk‹¦aÚœ¯ï*ýE›|ß@\_×"i²´Š¦-qUQMªìÖæ{ïð\qCÎ.ŠKM|⻟¼ª{’H!h›ãdÇAH :9‰qëó*¬Œq¿Ÿg>n–tªÞøj´·p×p#ÑgC‰°; >Ú~ó¨að ii>+a&ˆyâfL\å²)û24"Lذ•~»@¸çEb`>ãÐÀTGw˜¹I­Ò¿Eîò ¾ÝÙ)”€[Î_µ œNX:]1gz‚‹Ý™N†”+±Xž´&F-µ¾èþɤ¿0\`{în£Uyqm2 ¼+±M%;ÉÝ¥ØßsÇ-½—ûJ ‚ùßû\1ò›k§fmžÔùÉWQ,ØÚ5&÷$/ìr$–§Ý2Ð’/¶¾Yxˆ}íÊâ}8~hÞ€&¢aeâå©Â$çÏŠ·*a愊)ùq” ÙJÁ©KA)|ß==êBÊ2?¹„U&ã§Þ>%tÈr@Ÿè"™}$ÖY–¦ØRœX¹çW«¥Ç\"IuºoUZ³yËïZÙ·l®ósn+Á3ì\m'8ld9&ðÒêŽY1ê(8½Aä $Œª&A„›êK´¾-»PIÜWE‹ªÕõÁ.õÌÛ-«Ã:B„A? 'lÛl–è_DÝËE´=ÑF¶j«Žž‘+Ræ/ÔlíÞ¤¶Õ†@žã¯kë&;m·N¾”‰3" ê×÷¼,|Q~¯W^zq¹h@ 9xïJ2s÷]!OÐâYKÌ-iˆ¾ù°Nù»ÒSgΜx¹ãòðÒÀ@ä—æÊ‹žt­ 17G­µÔV=M×1¹˜1Ò_–4¼³¼îßßðÕ¤i|MªÛHÅRBO&`3ÅòÚÚþ”gžý£ß}¸wèI­@‘e°éͺdbžKÖ×\SÿQfb£É<¾io¢Ÿ$âjûT7÷6]9‘œÛ<^ õ| Ž“NVlC1ð³„Ôf6œ°„&tDiìÒø n->árÓM%–ôA÷Èe,wüÝ’«ž¹}älòÊÇ'Nù+p¡ŠïK¯H/ Ü6îðhø ,ØØ$Pœ#¦i9Zñ üÓ~ `Ýê Ø$O¨®È=¼AÏbÜÄð®òè¤L·1érdüžŠ „‡B©¡^À×a©7ϼN†0WB­¥.@QRxOzH¡\^Û[ãÆGhÏÌ[Œ.åu–hÞ _;=ßIB 1>­@pçŠggJ>•-IX¹^¥YÓ4¾5] ÛÝ Jûͨ0óIµ6¾º}·öŒ²˜ÒæœjhfÔ*20jjÂ*xÙdóðý΀Ï}¯ó¿x)Ò©·^.…Zçâû#!Öyýjs’7ÏžðjÛÅî.ƒI6¿ÕÐÞé±U¯¸L'-[Ðõ^ž×3׿zíVn}7DZ¹ÎsIùApâõ`9Þ&xOnNëô:íŸæ¡æüä‡ÃX#å,¾l^–ÄäA†°~åõkÑŸù¤õW&¾K¶ ô;¨~#„ÊÙu,NÛ1ÿŠ˜^nóÆR'_‡¹‰jDSc¨8²ÖtÜ=Wî±J}mÚ·»Ûä4‹“Þ¼„7>p »Ühêß¶ÀóÌŠÕUEìÕæL,x‘/ÿÚ½“T¢ 糦½ÊW_DþHÍzK΢ŽÝ;pö’zlfË.ÝÕNDm\¾L}þ!{]ÕTB&G½÷Œk÷#q«}‡° ¤ÝþÖ~‹û³]èûsûv VÝd/eô÷Åd³Ù¯,È\oá.9ø4Z,Ýâ&øÄG½>Ðr»W²tcOòýgsE*÷bÄf•åÜ©8®ŽG§Æ(‡LãëûhJO°Š‹{p¬Ï/êÓ]·åP-Ç|o óŸ;œj©Ü¿ s÷|!ãV%ÍqkÀB—¤sêÓ\àÖC†‘Ì+$ïcutÔâIΚâöåýy&{P42Àgî æ;n‚ÓˆIÊ ÐÜ‘³¾@òÈZ¼Hº”4Jjkï°ÝíîXüú> .äG·¡'Òp±E…”ÔÕK22ê Š„tŠ}¬¦ß¡NB—íEѤÜê{x¦T3&ù²Oþ=U§|"A*®M0ݺUp¶‚l•«P÷iÓTrkƒ’ñ>'¨žw‡¶þÔùZ[Ò·ÄÈðüL3gCgTWÄ„B"®ÐKâPÌ“Öî-Õôûã™ûÞÌU[rw8ËK Ǽ ¯^«º5úðL³Ùaªç×ûÿNUJ¦d¬ Õëë+mèv!ò>|o_]þ>ì^Ù àK9„‰w¢h&vB;Ù7ÅywÔdÁ¡::QdçšGÅõÇ@zäóKÜÞhñ†õ P2 ‘èócÖýõCeˆ±·›÷#b÷.(ü@ Ôö~cŸ÷Ƶ’>§Níx¯žÃC3H/5ò‰·¨ØÅõ"•õ®À¦¤äŽ{ C+ŸOÖæiöA‚¹Rž^@Vd¹€„æIÚ`oÙ~â±Ó_öõ¬©6³…nÚž¿@‡Ý»k W¥ôՆϰ˒6¦ÁÙ—Pî>q#Uv±qaÛð†1_¢·CùS×îÆ¯V-,t‡i û;ôÒlÚ=­³¢©]Ò@ª]Êã%ËJV?— 9²£ân¨êÌ¢¾nŠE º­3¦š†ÆòóEðë?È™Ø|xÕuRÿyjÜ‘”y§ï©s[fŒ‘Ñ&ó-äŒrÐ ±ÇYQ4ŠÀá¯%p”ÍÈ­L‘ç‚3Ññ8upÀN]½t(¶­%!ð“ðž†Øvo¶•o=hççö¨">Eo^¶n",À9 •W¾p¸ÓYü¾o-íÄo'"¤u¹üÑ æK(òDž<  ýÍiw×?-»·Ô\ñeû/+/L$[¥Jœà@eçQƳx Óo¤tC‘hmºgy‰7±XúÁvëe!Oê ¼D´düçw 2bÀw1÷L@R†Ä|}"3ÿì?³ÿ^§²õ :º×[BÚq:B¿·½ç‚‡ðiD«» çÝøÓ¥¼,¿ux'ß”în}²+|²ßv)åÜom[lêŸüòÊ=$Ù~ï>ˇ©9¡ÎcúúÂ/‹o™Bƒ<¯ƒ¸¢.‚÷NÕÑí~+š e¢ß`&1süT[~/^6…çf€ßÁX1ÆüÚ m˹#Ô´üÜf`ì7rº¯NÈÅßršæIѦñ¹Ð5µó!Ýoo >‹ß´~ò7Gú_úç¿xøiÌ12õÒ$E;UüXêV€]{åÿ7ÿÿ û_E¾Ë2Z^ûC„œø‘õî«ñwADµRöÖ±# ÀY•\ð·¡[ ´ŠÁÉd2ø1Æ¢_÷R®‰¾ùo6ž£¤àí@Ú3ƒ$ØRáPù»›RåÇþ8%¨ë<§ï¡Šê†`HsáZ&óïÚsÈb”ùwr¤ö„Ñÿ—K…ô`Š¿ôòÝ ôNü¨¬,¡rÿ?<ž’‡3ú-.ÿ쀘w×'Ê-›œ·)lz ˜7êD­ïåœµÒøŽÔÖwû¶IÑôép’¬Õ¡¼Mnf\²Q›ªQez Uâ0í˜#AFU¡ŽÑééÕ`ŠlH™Í²TNa÷¶öB¹4S2•Êøçl~K »÷Ô6ã œ%£½¿—Þ_ŸJ:.’­)‚+}Gì*üÝgùAY2Z´8®·¼¤¦Fòw*X69g‘þøÞ6]»ÆCß趺ì̾˜ïŸñÉ}Àø‹àËÃÛé`¯5BÍn.€} ¢¶(2pãÄSïÆ#Úÿvíb÷„•¹UøÐâò}eä„{‹Zÿüm̺£û«o\=þ¡ýØÁæ6"PÊ 0ÞÞ ÝùIC×ã)\P\å¿=`“,w5ù ±:0}2¡œ6g=¡-{jÎrÉõs{·]þÏ(¤:Æ®V»yó *¬µ‹~b§¿oµªT‡š{¿ŠÔÈ©ù»¦nZqÜ9TlÁÞCKŽéO »Å3¯*¥„æ²ãü %…O“ì1:Œˆjö¿–MüBt%¡“£¦#˜M¬x€‚ؽ~;ã|þ©Ï…•øÔV£plßïôX9§ÆW÷ ã±…¶P¿ ÷¹­ztŒ±å¿7TBCár¬v×~úûËõnÿÿÚ¸rßWvHþ«jËNÌ.s>œ»uŽö?ž¯¦~øVôêOå—$ã+jmë¤ó@¸y­"ôÜVQg2ç±,«b†‘‘:xkµS°èUáϾL !P–’«$¸Q”Å0 V‰Ò_gßÊÕm4ŸmBÑ,þìšeAqE±ÎJãôI—Ô§>KÑl@f2öŸ§’‘ö‹°Ùä°£ÎPÑÛš3½Ó™±{'GŠ({ê 'ÁˆdÅ<še-Ý´¨Ç~¶ij³°^åD03RKo{¹b*_"ßý¯—<œ„ž´ü*ÑTu ŸŽ|PºåK¯R³’´[¯|ÿööƒh¤¨ªsmšý­ªu´<,E{x† ûŠ[+|ÃfOýMKw„ÊÒÆ05£úWiè_ù. øhcô×0'þºÿÍ,ìwl½qM‰áK®›²dÿšH)a¨†´ý?Xmyø¦8à„fþóì|Ĺ8üHºò4âŸÛi1¼ÕÃÿرĈt½Ò¤\Ü:X/Ñéb¾xïÿãËšY¸£¨Qå—ïߥ1± Æ¿·mþÅxf×ÛÕ‹Æ |)¾U’NËþ_Dä›·¾¼kµ¿–An ôëâûÛ:(Br4ÿQJܰ«Ù Ã×ìŒ8s?Õ¡²t"ybÿ4ÁÆ ÀFn/3ŠÆmkqÖVºUE žQ9ãÖi˜’ jí­–%<¿¼ ¹zo;HÈ'úÛøIC¸êwè³—‘ø³nÃ.8 _‹ãf á÷ÿ$¯£³È Å=+;¿ÏøÙxYÄC¸C?0#r¦~NBÏÜÀÙÒûsKÈ, «#os¶ðøË l&Ó•m1ž¡Óæÿ>" E¡#·ùiXóäÿYM쯟IŠŽÙZuû™ig·FÖ‚Û˜ãÜtS÷ü¦6ÍùURžœ|žÝŽ.‰c7þöF3[`‡QŸÚ‰û1íª…@…C?ã? ýQL|2^â}FìÆn´Û.‚,]ãfi»}¢oᄯ«ÇN‹í”@ªƒ ÔÐmÓóATøÏX+`/œ F6¬ƒE~kïÏ…4Ô-=h6íÚãßUC¿dÇý€É‹ÿu~rN`þ’µçÛÿâ”ÿ—†g»Èfüóüï÷ò?¸¿# -²÷úfELB¬ð‡¤Æˆ{¤´îÿÝÍÐø3,Å™ Ìb:ÍuVߪß6¬ÿ^ôo³pòÕQ03±˜Ë…ŠÁ¶P¼¥êèÂvo7Mˆ¥ǧýl¾9G{ÖÕ¡…'…öA÷·s¶Oá<ú ùÁÒp’9¤ªrŽYUžÂîUþ ,¼˜,œi ¯“€)ò×WåÜÿx9³1<ÔÛ`82±8âThrEõÅ×ynÿ @‡%öÍÀ¬ÿNûI©ÕæÉÛñ•+£Æžèüÿ·ÿ?b÷ñã‰$3µ‘p¾Áû&ö¤nm©<_b>V»äÿÞ]MU,}çù[ôÒãóÕk¡s¦ØÚEŸÁ( ’~»°Üò¸T”ö(¾¤m`“,‰'n¢°“gFdñ*d)£k…i¹g+KîÊö×[å%ßBiÆÎÚ.¿®œ‘)œëvÑlÏ1Í+fCÑ·Ê Ê!Ep”°žî†âóaˆ!Åé;g¸ö\®§ýé÷n Þ"Z•Âݪ«tUçp ÛpTœ(q)=´Ûg½ªl’Ø H(` U©3!ð ‘·ñ¥ÝV" FѯVàü¢º‘Ù‹`:ÙjééêÞ f×Èî$‘*ŠnÍ3mÈÀ\ •Ä'±³3g_YàT«&±¡‹`åv“¥Ó°ö=^ø5\ž›ˆ&Rž0c¶é—0â¶ãÿÍÚGÉñÅ•:ÝM Ì“š׋˜^îÛ~ü´Þ?rY½GZµ9DC³Ö¡ÉoOÜŸ+ÏÇGÂ!æ'ñ©ìâgÓõ>ÿ™¥&öËÑoÂs—Pܧ¥Ž¾/¸¯F´Z5ÅÇ={3ôv§˜Í=a¡oæ¾éGg€`dbÞ1ƒ;UDª¶Ó÷m4‡ì (È ;õ9mßÅÜaÒßSá¸/£äÇŽÄÇßæôö‡™xö§Ž·*Âõ—˜)Qgà°g%¯úôï„êéÍ…îÁÂ8¹;XÓ»;šœwm3hÏœD쪹ZHC†õ6Hs"ü5ã=·Ù,ëyvÐÄ*\‚ Cñwü=«ÝåÜ$Bû^† n;M'¡goªcòZ °áH‘´ÒI¿ç°þÈÝÿR,ì‡ÊÄ»¿î÷÷c‹øß‰uu÷,÷ÿ‘dW¾­dy­ðÍÖíÏ=ÕëEË‹¦â¹Ûÿ¸TØŸwƒ°þ­«øÏ„ZÈC•ÔÚ §wЪœ¼ ZI¾‡S„ÙSŸû»kºÚ´z‹ë#ö«^.zêOpûzæü3û†?A ¾= ÉY>ûî °y}˜÷Jµo0“8þëÖÒÙ Áì ¶;ãõä¶!ϼ€j6sá.±ß®®×$gó¨úí­$@|ÿR0Žþ`Z6ã ÜË“êÆƒØlö4™€±ñ=ÄîÁgØní­ ¤Ê§-¨DC ³aOÝÊ¿_7ü=èÞÓˆPvþ³ûÂiÅ7Îz”Øûðÿà®ÊóܳNé;„³üD'GÂã~ת¯Çk žF~™‡ÝLB•&è:ïýƒügFÈpÅw¾¢Ã|5® –•$¤Äæ{fê‘-{WR?…ã> s3cÛú¡…žõGr[é·ükÉŠáÛn‚’1•2‡Ë}Tdˆá¹{òcdnHüÙcŠýMÀ™Ý€ÔÓX˜Z‡b~úŠÕE8énþL«ZCЙÓÚîæE°WqC]` Úå† b~ºU\ì ânເI¤§¶õùÂŽm5È$4w3þ{)Ä™‡öJ+…gëu cÄÛ˜ò§¹ycä “Cý}ÛŒT¤â˜¿ÎxŸ4à¶ëÿd^ƒ?té^•åÝÉ¥Öí=öC©‰G^03äNež^ØÕòâ§¡\âýO·T©¯*¨U mkjuþôGßñøswˆ얹l³Îð¿f¢±º2ßñçú£‹áƒ,°AVTÈÆ GJáWØY= ýMÎNü°òÇÐí¨pv1%ÿVl;Fàˆ å›{ÖгfD8@fÅ@"SQö«.–aÖÏm'ÍU”˜î§r¿³ý ýrŽ‚áÁ8.‚Ò#‹:¦8Û¶gí^îâsž± ÒÁx Sr]á±TšŸwÑÃ`ÏçCqžž aÁS®Ýª#+š5Ѫü–)^OÜîž!ÛTDZ¾@ÿó7}«E4Ö‡{šh0W8Wõ¾‚dp«e¯`ûãŠÃ‘ ÜQ[=ÙáH'B‘áñ­•Jn×N9–R2õõOr‚(²•‹„ƒé!S”¦ ±'o/¥ŽM'O þõÞ=•KRodŠýËþúûn“Ϭ÷ló_Ë,¯Iá Û]IãöŽx/–tø¿Ý•ÿ«‹Câûx~í&;}“bn8£ÙðOcêÖ¨öƒ6éF<äz¿(%AP­âÎü[ª„1©˜=x6³õ…[÷§;<œ#H37kZÀß_ó)B=0ÐEò—“©ÇÕ|ž¥þ}W ï^œ…—fªlèRVt f9€ ÛUD6_h -c#¤ŽÞûÝ#i•¬q¾sŒkÄ.¬ÛICµ‰‡"˜M¼y÷÷™'‘é°;·s¬§Ðl2]Žƒ—^Àϼ‡?k¯í—@4ÿ0¬PçØ£fY ·OTû ªwÜšÈ&™À¥Ðú›Ç¾†¤Ÿû?Z»÷üþæÇI‡Žî!Ö)£™MèÐ3ýœµco~@¬"NºßëÛJí²'jÍÇö:$å&¨àƒ·ÁÌ:g掗!|~Â5QÁ [\.oò”;L;FØ7ƒ¦:¤ó(ÞûÖ ©Ãí¦È Îqo;Ù¸Éè аݎ’-%j×ÿ(T0þ<€Y¯4Jq–ci’‚-¤6®ýÝð‰a,FU™&gKÑxĽf¬±¨¸è´)­JÛ¹.¦¾N¼•'¾OÕHXü»1.´ü¹¸L“>×ù7cP1Ýh`>N^š³:·,I¨Å?…匸‹ÉÔ"´¸k;éÞ"¡Öæ& 2ÌöYNT&ÁÚ”ü¼']ø[F ŸÍàf‘ h=fXR–}rîÇY?õâ?Í÷WIü±J’í #Wé¤Pùòã‘:ª ÒìøÀ`~‡ÿŲníàÎÖ˱T%°+˜Ò=_Þe ¯¥ádQÂwžÀˆÖï_ž#¼²­Jb>Ô'Ö´Ë㬠N<.i•)ÉËb„EXG‡èJ燊é¹L˜ôü6 ŒóšÅı² bÉ"W ›µª¼‡›ý6É›—§ppóî æeãÇbfÂ#÷[{¥JÕr¥¬¡òp•Ô}{M·–2Æ4GPdþ.éÒ¸ùŠíÄÓ‹à­—ÎÍÖ-44"ÈÑ-6%/~¾¿xó„˜;Ø$ýFúIŸË©ÞçÑûñ{|ôØ{õvË7èñ¡0á¹R¯û¹6Z¦ käˆ0Ï›oðÎy+_´zý¢Ó~ž;ŸÚ€ßs(%º“©ßë29L»þù¥Ð>õ×/NÊÐà . þVG‡”­óçê3•ÉDxjã +æÁo‘üÓØa˜ðxŠóAfgŸ0¨4tY§-wþðCøýWú¸Ø»mí;è¯"½Ÿ‰ûSäï fÿ¬cMˆ½Û ЊNý]5ýìØüû Ôh bl’þ‡W­nŸ˜È›[òîŸ; ¦R9ÜîŸDÇÝ.3‹Œ«§öÜ \ýµ²þ£k“L(¥ëUÞóÔßìð»¤á¢ª‘M}*ñ:|%Úu}<Úly1å[Äl¸sˆÅ°g©€`#Ý›¼lÖ.›HÊׯs<}Â,±0÷¢+"…Ý«{ñ@”§ùιqRÆe¡cEkëî!&TñïUáª%#ôpËÕœSn"ï­fóâeð‰vøc¤€`Z@ÓjÎ7­'ðWdb¡;å{4…IÔ²H²Ã2Uî~¹Îñû¥ävæ±%ب¡éÝ àù¼{PŒà6&ÿOøiàÝ.ÄS`¿ø…¢UU$æ{¼%š›¬]€*¡^¯ž9ïT:è#b¹VdÿüÐRÔPú÷'Ï‹¶Oê…úúÇÕ Ï}ÿ{bà…Ok l!=Æ'|‹»Ñ²Â7;_ ø«ÈhQ㟶žýŒðÏgPq!fâô+&ŸÅÈ‹­Cã,šwuymF:Á‚ApìþýÛBÉLARÐr{y©²P‰*·ÿ+ cÈ0Ñj®Ò*%>ÐŽ@ýçt‘1á¬R÷Öž†ØÏŽðÉÒ²ŽN~ïO>|gRcOúktgªðžÆî Gw‹D½J†m«ŸP¬ ;BoB¤}’ï#(Ï㡾§."Pø¸q þ£¸v“ì€-V' æWFj160hí~nk`h0”±ùí¢ ~ªŽî®_îNíqdùé߇!Â{‹¾ÏQœ1_]ê¶œ~¶‘O’lŠb½ù3­Ï-TPnVíÖ‡>J„+Æ•…A…y•‰ óìüña—³°`;vä(N *þ “½úY§æng›# B–éxg«VÏ—›Bb¦Öù£™öè ‹HÅ|ø§ðÅüK«“Ýc3¸y½>ZbÑ;L&íÖHûK]¡¨Ó@Ý…íTlzH³ô‘«sÆ?ÆÅÏŒé+SLÿikÐÙàE¸Í¤­¬ª0o"ÐBúÈ£A°òŠj(m bö¤ùÉ.YÙSå Ɇ ¯Í‚'6⸑Œ~ÀŒzH·•Ãý¤¥òˆù!TW6T,œÈBÚ$œÏ0< º¿~B­‚€ŒÀ¬ÁÛIïiø2ÙiøTŠ)¾…T¤v_´nGç_>H'Çá€?°WÕ,½å|åùÄô.ø…: ‰žkÿ#PažviøB…áÍ9«6ñ˜ŒO¿9J¹â] PÊIðŽý>ãÚÅ3Ø$~±rœ]~¤²®ì{ï¦üìa RØú/¤[±èºƒÆ`ÆÓTö[5‡ƒ´b³…˜ù?h» n¿¾sÆzÏ‹ Ðê 5¡Óø³ÏJå\BB‹¨®…¶¬Û)ôóÁdÇOØãȱr6W_Œž!ðÚÆhþ†hn!/î4ÑQr9 ¶Ã]™îŒ)¸òbFÂ…¥w`™µŽÜ¿à¬¸öþ«CI²Û-‹‘±??×§»½„þº„/cdõ`þ_œrCü‰Ç—DKã¢ã* x^Âa)çc%="+ñ|­Í‰O ¹|äá^èWÆö;%ÜùAÖ´âo—‡@*P«Tãø]4·Ù½ŸN„‘4¢‡š-Ès#…_… ^B'€ÝK‹¢ }È3@^wµ2kMÖ†n— ×'Âpf"Aàè>‚k3±L¸YÝNÜB¸Á›_±R:êFðæÑTH~3tßÕØ­.¼ü:¤-ô‚˜£NÉæZW³ìèi«yÊE¸ÁSdˆé¯£¡2ŒP—Á·ˆÒ¼õÔ%³kýÑ9\pâi l‰´uth?”ù<Á4â ƒ?úB›žø½¯è‘ê&f¡h“u•D@Zšñߟ¯J$»^þboÆ~O†ÿ½ë?þ8¤}âÐÀªµ7Z®_Oén—é½h œÔÀEÞøåhÚ;w ùHpx}E_é£?ÔíXV°„‹"½óÁ“¢Uå­G”q&ÊáF—~%Õ×gù"â=7ÁæîÚ|è„7¶óþ_ðxÈó¥Vr±ù"Ø_#h½ð¯ÓCΔ#4±>*£¸°MUÞs5~ù‹½ï8ªÎ¦‘¶ƒoU#zôO꼦OЙCYŽöÿ·W.sÃw6š¿ˆ)BË,PŸÒ_å Ñ~§^× ýêÖîöqk>¼U”püÿËš ø7¿pw£ô»øÿ ‹÷7jó_û ÐäMún^ÙTƒ­NYˆ}®žÝ%¶åSœ£‘²ÙÊÁdU¦lö}æê“¯ò:¿êÁK+;óæ1’!x›·yÝz “vÿWžy˜*8G»/ “³vtxckü—G^xÜYU›Íç+ŸÐ_ ¾^-þGÿÍÞè_(â+K±–©È‚;]‚ÓŠ†)zÆ÷Îw†ÑÅF#⮨•Â+­¸ò¾Û]䫟ùÄ>ÿi-/ÓÔI5¬õ±âÜD¿²Ãs:%`ºè,A¤3ƒ²Èr(û øC|;H3ñ”¡¢”‰“”c:máÍÛØ½)ˆ×Cê<@c•ÙŽÀ ¦ËïŽ;8·R+Co—ñž2›7ʲ '"#²Ïï~· ®4gëMCvƒÂ/(Áé÷~E;OA/¦/‹8N´[ßD­öíÆÒßä׉TS”ý\£B๠í€À.­Ò¯5zûúZ‚åÂö tB·»y:3qqbò›˜ÇeþÒA$âù‹ý6`·[¥DôĨŒ™‹2þWˆ$D5¾+¬ vËpü•>?^=—7î’›ýëC<ßIa!ñ=ù„ZûßjÇÇó3Øœ^† Gh}ªª)óν£„ø7WØþìm»å±'“üþŒ×}UÝònˆÄx©¾ß‘!¼=œqFbâyh "adÿeðÇ6ó`Yx¬:G”‡ëÔóß‹¯‡HÎÁl3Ø}кÒý3ÿšÊ|e)¡°wè¯ÍHljGæãJ¥ÈÓ€ë€ ê:’¨Õ«%HÇ X—w"9M¦üÑMëm‹¶Í¿~ jÁMþÕ\ën‹íÿFt/­èE¯öः†7¯}Hµ¼H‘ïùв?•eø4áéŸQ÷¡ÏÓúÝù +´õ¦Ê×¾Ÿu㬰É8¤¸Ø÷ÃЧÈqb<ˆ¢ƒZ5®£ƒîÓü9¾ð¤lvFwL ¢l#PÑ, å ôÒÎ28Îv†¼ø±Oà÷÷·FªÏ€eRr!Å­Î*’Rt ™÷OmOQâéwèV>Ì› ¢œRûh‘*}w{е¢>±³*ÑÖ<Ô¾uÈÿã›G$‡Ù·†S™Ïsš ÷W»‹\5e‰u¿¤J"Âi ¨?³”=¬’þæü峂S³Àÿ¸ø½¸žö鿨»y·r°!— ÝÕùq|+O˜ž¨D¾˜õô‡IÔ‡Ûo~ys¢Æ#М2\z“À§ú»Õêfø^Ç›uÌdÓ§Yp|gçPü‚ºe]QÊÚ¨ …ŽYtƒˆӢÿ×?äQFÅŒ83§ Ó¬P=¬Øð%Q•]ÌÃ&ÚšV´h}m`öä8Ðú«C@9Ì]塦å‚.Ä•ÿ(¿"€„¾\ó« yúU:k÷ Â)‚íZpG"Èë8’>NƬ±¸ÎRkF‹ò,ñÿD¿µl=™Óµ†L·Ò´7 £É&±®…ÿÐÏ%cÌ '[‚ò Ý¢eàH"¨ý»WnÇ.¸J8ŠcGT 'ÄTVéÃÿ¼dœ³ßïÂCPnþÝÅ>0Îsúó^lÍþE²ÚŸ·OL¼ýþ7Ö~t‘L·Á±Ý+½Äïõaܾ^ø <¬<°íø9øëÔÏN'þ}Hص#ð ;øãøö´µÛäÞÏVhë3")›èϼ¶5ˆ†2ËÛŽI}©‚H•þùÑùÈ·õ±ûãÉŸÿ·k%̉ f¿Ù•ÁÏ‚=XÙ«iz›ô9ÙѬòVíäßmÈí¨ç+·O,³úåŠ=U¾Fÿd±²™Èm^-õþÝÜ3Õ~fAÑ–ä± “± Ký?<|¦¿ûŸÿ 8 9óùmÿ 3³üáÜ•Îææâ¶[(CxÊÙÚ„'Ù›æƒ%÷nHТ˜º{XåCZ›[É¿´Fò×Vm¡®§/5ïP:çýfÙ"¦‚ù!l8fu·˜`ž¾Ç$OÕµZ)Áø™Qs&²SÆÍ…ÇÓü¸ûƒÞu¨¸*­Õ´9ß?TÁÑ2Å[NÖEëѨíi±³hï\­+ör·´öïJ1nù}ô‚zÓr *7-®+)tÙ´•«™ÃCòf`]æ÷ÕÓu:ç;FC•'·´´ôÑV`h<°±u}˜y†0¿»Ù †]½¡*Ÿ-†^ è绊`™€üå`ŠÀNï.¢e'â{òV½•á‚%è0˜Uü\ïrߊ"À†+| w·ÍÝm€7‰sf×,–×® þ¸—F4VâU™Â­ìûÐ}™P5øÌ” eP”\a@Ö_,…ˆ+v†•oëG¢^]ÿ}árŽNJxì· [´©+¿ œ-«+á·J? ®jÿ¯íçKAa8_žWpnø…c½aív*®-Ó¸=“}ôSöoá–ƈЎ!X‘bÔ¿”®¥“F„/†=Ú­ÈÑø¼‰ýüF„%®oÂ¥ åBÇ¿/,£"^ÑÄwˆ=W]̦ċÅP!!ãjçMsàóú#ø®¬:ø¾0sÎvk·"E7ør –Â%à´z5úq\`ÊÇ_~X•JÞœwM.vj(̤ôŠuÀX YWóŽ/o‚¾$›_ƒòÅé:PÌ·èš_ë‘î¨ÍÞšÞÒ,Ûj|ö@‘ìþ{¶ ]¥ Gõ “ãØðEŒP•¸í€2ü¯K»|@ÎkAËB—6j.º­úÌ–9%1nKs¹–#¶XyÇßže[ŸOù!b/ùMR'UŒp#\|ÿšF¤ù¿~¬½Éþò§‚ïÒÚî¦N§ØªL9ÿŒzÂ%ê"J#lvëÁÙÆI}i)†ÿ¹Ü£š+ÿê[Œ7Nop3Õ{†Àá5Ñ–Wk„-¿ûãJ牢×z©Ñ âú·)¿)é׋nÂgÎÕââ¿dU’#^Z8GÐ5¹<ÃÿËÜ­ËMuÔxm¤ Çâå?”°õÌ'2KŠúÍÈÛ7v@äYTÊ€ vãä/€>?`ç‚Z­¼K¤ƒÖÇü¼ Js£{þì×°úN xDD€ûÒÿ‚ñÿ¼xXe{—]<K•„Æ~7éa­-ôƒ NÐüàZR/ô¯ŽæÀ1a<ÜèÝ"óçn'ø`VÉÝÚí;å°Ù–¼‰)„)n­;y5ÿ{Rþ6º?u·½·_¨*›oX 4×%³fVU§~߃‚Ñ= ò1"µ0ÒüüŸÒ¬µ¥þR ¤ú~Døÿ°÷%ðPnáÿêÖí¶ÝnuÛ•í–1»uT(’t#RÉ3ïŒÉ,š[Šö½¹©Iè¶h¥2-$´JŒ´’­Z„JH%ÿó¾³'Z~~ÿŸó!3ç}ßç<çù>ÏsÎyÎyŸ.'àu…:•ô¢>¨;o.<9®YGì¨ úM<Ýáê }<†„IÞ%ɬϒ„-¹Á[ ÷v¢¡Ãr+dÎ`¸‹†eX£ÒOFÙ ÒOW…,èéïRÂÁ 2HîM Ó¯"§ÉÇŠ­M}}ÞÆƒ‘ñœÍ.Ó&[üóèÕ—¤úwï‘+í†/#¸T#jýõú![Öü%¿ÕÚ&m±Î2Eºð‰aûýR%÷®½Uº`ù &îœ1%0ù­Žå‡Ê￸Ûq)ÇÚòaôÂx¹¢_8ñà þÕ}ŠhƒcIæÀðÙaÏ]ŸÒISmÄä:Šc·\Yf±f{ÒÂIÅ•GÊŸf3uVä)–ׂÂQ){$Þ#ÏןÊÞGÚsŒ5`”ØìÙíó˜ÅssÓK‚Þ­ t·‚´m1^ÐÅkQätƵ}m £^¤ì*ñ-‚¹ŒµÓsñ÷Ŭè{ý˜Wxa—u;á—ftB§vI¹™9!Ï ñ ß÷»w¥NVÔ0C餉¢:}ñ˜ò‚ :+åüôõŒiHßS¾ ¨YJÕÆ8£Ù°²5w_fÕÇ \Éæ©‹«ÀŒÈ7a¯S%Ψñ8–Gƒd …ÄZI<²»ó:õñIÜÅìðAÛ— KÐ2+|XäÏÒ´îoÿ’?°ixq™ˆS½ÞгÆAI$‹„©‘œò+Ág*:5.«G:X"ÿbÃpa| ŠÍŽeSÖmÖÅ›‚EÄ]qŽ•XHüCÆY¯•UžåˆN?C‚T:³eþݯ`&„á‚ë¯èÄY§ÍÛßJ¶Õ‰gv–á˜~(öýW·"¶ÐTèX®»~þ¾;¦ò`Ë‹§§™ù½Ý®ÙR1ç¦Ã§ s{ÉÃÝõ‚||wß(c«—•zLâ9F)£*ÞJ6Å~4~t]˜slÑáàÞ‚ÓhÏLJ¦(¢~œG§™'f¬Ýøï ÏÌ[ôŠcBÿ9©¦É.9—ÉW>N»mƒÜƒì”\ a”•¹TþžwÎxvÿÑÃŽÀ˜•‚kÉN·äáÀŠjɶd÷»pŽèø¢‚“ÖÞ8w{à.]ü>-™¾Xá¶•Œ¸,¹”{=B’gweéŠBÅcª%+Ó{nd° $K%QÜ$_F&%Ë#7S>œêŠÅ±…/‡mzÝ8Z2¬‚qj轉’Å"\ð5¼Áà z>{»\Ãý/çÄzDì߯eòþM‘G;ŸûEK«Ï5ä,¸?O.‘;¡Ëš[eŒðšß‹9ucàęݧ}äóp·«¬©¨Ï—¯œêNßåòŠñžÄz­æö)&§›VŠê&áï.£aï¿ú“ý âö‡žbmÅÖ)ð">Ì©Œµó½îeŸ„ÝãmÕÅÛKArð?™<ìjzÿ/ ù½A D=K-Ê Î;]z·À¹ÖÅ~ó 7Q¯­"¾vöÉa)yds/fdõè#%@;‰½ ¦8S6×ÝšŠ-M>“†ó/¿à8gýó’u½ÿK퉧ÿÚcÅÔJ&èûlÍ_&Þ:VP¹r±ÇûÜÇD‹åKŠ "‘F}Ü9w-BýÓ[Çu³ÌbT„­{’TíÌyžDV¶ŸEr^ÀÔV\¬mŸ}=¢Ðíú«Œ~ÿHŠ}d½5¡\Ç ¶TÝñéJ¿Ü  3ýé5 s%:gÓ®![§ãd`–Æb|a°3Jgá NŒÌ{E;ÜœÇ`œMñL¿f’#³žä²M'CŸ7¼¸©%ÊÚý›z-`”]fXB©÷µA%cõ¾b‰§™ý7O÷ñZ>$J§_ÎÜ]CdI‡©à<ö=m÷É:Îá‹Ü C”Gf€Ã*ð5°6ŒJ›(ŸÆ]Ø[8ß!xôV§DïÒ¹ïÌ\)¹ßY ÓF\ôǾ>e¢ý!ÏÏ{Â- 52`ÐÖE•¸è“ü‰³Î×%|Ø-;3‚šÕÆIŒÎ¢E¯þµÆýÒõ”ôh`žÈŠa”.>¨j1L+±#ñ}Õpq¯upV¹‹å..ÖvêÕ@Êêû'¦¿Ež•³}?ÑѸZB1PVÄO6®‘PÆ*+f_©ü•èãÌþqwL+ÏLÛ6÷á©Tzc=,„.ÜnxARZyK^hÝ Ý=M¬‘¼?—›úÎ-,šª¤^,•™ðhúZѢÌ•’OÁ²½š9•¢`‘ÕEIº;Þ†Ñ`‰Î[S¯âs`’uuXº›¼L€·¿!Ù$™ÙA«DzN¦°tO¬‡µeŽDõi0×H`Å ®€÷Zá'U–Œ½ r/P½CL°6Ms†Z óTº=6å:ÞW¥¢Òã©ãW¦?›c CÜ/Ž=&Ÿ¬ÍN¹Š·ˆðp͘ ÷Õ;^n_g%=&ÝKá÷ÂCºåÒ%Œ’«~‡ßyžp/ñѧå4¢ÂÝÉ6îui¤÷%ùîç‹Öq þóò}\urã-ÅN°‡5y\Å>öÚÔ Ì?ujWÁÐZ.ÚSý¤˜>¿`•ÝSÖÐgnÈùL}…+këÁwðŽÅÝ/÷Ä‹Ê'1*bޏlÈWN_nÄV$¼ÊÈeoñ8Å(mØQ²_1ÅdåFÙíyc]}RIn¡õ<… P×¼PéP '¿R}´›Â£5y³3u‘Ýâææ3+qñ#¬ÆõŽK½hvJXnՋɳV¬öX0êùo}¢c× pÝ#Äó/NßRš1á‚¡r+´ðÆúÃôš·E‘ 2ÇöÄHÏÜíûáÁ›y1yÛOíñ*Ÿ´I”Õ3åþ\aî<[Iø ¶,¼ìŸ;ÖäiRÛÝ`…NŠäýü—ñË$’D «è‰ze³^) U¾ÙE#>Ùëu5ϼð†x8•7QFÝ‹,ù{q¾Ç ~X;íures(ò.Z]snÐÃôþ¡q9ÿHHŽžâÁ½ï‚ŒX¸î¸¢=iÂ\‰õ¶×;}Ýô½WJþþE±uÉñ¿”’ýlÛ­ÕÀuß8¿ŠšÆ!ä¯Þ ËŽø7ÄýÌX[ N~®OvPžSÜ$EŇR÷¯ª8³3ì7ÏÓðë>XߎƒæÇ˜ퟙ·{–›‰¸§Î%ívÄŠ9 cÂ^G^P tXçoÃÝèkèLcä…¼ÛwѱaŒsM½´ü­6>Zgcº4è"J;n8N±Óà]ôYkðS}ÞÎIˆÑ\ÚZh“ûr<#¤o¹J/4òzÚ„b³TFÀz‘ÕMÉiɹóC*☓믎Z£\¦” œ«%lÍ‹¬3öxÍuQ2l£lUi²Í©èç^‡Ï¹½ßÇÎlÿEæõ½§Vñ_מv7·¶—/Àõh¢X¯r”"BR{}cs‘û+L~ß’9,ñý‡¡ ôH¿WffC²Æþ]ñ:|ŒÀù¥óë³õìêŽÌ4!»t1žd’ù°²0Çqfø[á$þÁÍiƒTWÃBÓãc»G&ìU¬ò:žÂ% TYó¬]^æÎö‚G‡„׆â?G®Ëɾ·4{äð%¥ógm & ²ÇÔßó2åëdC¼3žIMJˆ8º-;Åàå5ngñ[ü \z@´+y컾òÍL0eù8ZLyd×7zO\ªäÅ¢UfÒ#_ÈiÙŒÙÉìT†›)NH08Tb˘&ÝRÁº¸…{ôØb4{îQ¿\É­ìâõ²e3¸˽rŽÎ÷*É ä=Ïb#§TXcpüUÆwc$dš"@æ3G-¼öˆˆ0å‹m—å|;—ÜÔ£IŠ5Næ%ÍÅ—%aï.ë_oóîá“‚ðUÓ°wC¼öoS !"¶îÔë’tW¢bUq~UhéÁ5þlFÉe¸ÜþM·¼M*2œ -S—¦G/¼ãÍ<øö®ûæ.¢º´K{ê½o)—ïðYƒWVÓç™âºo Ǹæ2¨•×ÂÌΜ< _ÅKæôñ‘ìøúã5œ NþîTlâF»;dœW²Çíþ; Cöƃë}Ýî>÷£ç¿­¿_][PO'×&cì&Üšò™]1ÇžÄRb'Æ ¸‡-18\&IŸ¡è¤lõ–ë_Æ£±bÖÛDE¯gÏP1©ùVϵ3)¥ÙKÆm” [üÜH2þåPzM¹.*²UÒÝNjހ™!_§ïˆÞPéªò­²¹-²³Ý©„^y§ß_òZo“4+ÿàÐ} r€Ü°GÈ3U N‘äHÒð§« Ù §Uv\‹ÂŸ;æ^"GÍqˉV9Ã1õ/·Ðò ÕQ+ö~t±)žÀLçä³K˜Ãt^¾£ð}ï“P…»O8´u`Pfõ/ðZ8±vO)ëCœnÝ«b8ÿœظ¬þ÷¢Ð[oä¨Á"³÷>N²:7ÉiDy”q.úÏA;æÙåڋǹËÅK3´Ðƒ6y†¸ªŒLGøuL|´Ë³Cå©éÕ!å!{G<«ÚŽÞk+XšÑQvâj𫆩Œ+®ÌjX  ª°éÄK¿ªXãªÿ2G¦2ò¯Ì^Vó`›Çq¹8ÎEVŹwm˜«RE‰Â|[Q.uÕ1/¥´:§ÍÙ9«Xeïõ/9éiç1ûþ•‡üÚ~æ£õ÷qOWè$‹úfŸó¹ttè©ÒÁ~£S×(ЙK«Ï™4æ@çlîNÅœí?fÓdÎ-6Ægx§ôU:›h8÷%N0C|vsn&l•ö2~í’¤h™]k[Fbéý½Ö'$PÖw°¬•¼¹!™Â¸‘ömÃðë";‡Qþë¸a£CLqû+8Bª…ô{ýËÁ­+¨ðå÷êÂø”Û‘³I¢‹©¢[aroi8#!ÃÃHÉgªq!&òV·ïÙ*V ™žoOÈÆ‰?ž=kö`ÁÇ‘/z°Å ²zh}Zëób‰Ö}ëŸU¾ [íœ1'ËÒiº(vSm'ü½Të§:†ñrØ:CÇØŸÑ† (d"ù‹%MÐïXý++ZX,ž@$Èd̰Ò36Æ€:/(˜ sićÙVza0øÀ°P&e¼!7i·¼yô`ðM×Èšsa>UÓ!ï`ÈVJÂŒ ‘¸‡Î €P²Ò›ÏâÒá =Š%õ³5–8T5+=Šø8’ë-ð³˜Fe‚nP)ÐB¨ù§}X€>Í'XF…”†½üÒ7¢ ‘~5&4…%~  ˆRöüDðù{€"ª%hÌ‚ÌñÖ÷Md˜lž7•ݘï¡áä/§0f#rQƒ’°Ä¤íÇR¾]/Áͨ!j(¤2Íå,4EAÑ))ùðØt— ©5Ââ‚K*"8cêú%툾#‹ ô؉LJ¶»Yú_SôY\ÛŸC#ÙB ¥8`¶º(èD ÝŒŒáÂ^^ÇË‹ªÒº—©‘€çϧÁ2a!·!wQÕ ¤å‘LÐ mYÊU½†NÂ6?úq¤ÊÚB â1 *› ɯ Ð©Þlòæñé0ßJÏø˜Íö£Òá)¾ ü¨4ÙwÄáðÁcÀÒ1ÒøŠ*à³[¹Vz8`ÉÞ ÎG™æïÍfÑ ©FAåz Æ}‘„T²€G!Ì™3°\^ Ÿêxg1m>‹é*d_…ÀGóæ–odS¹$íÚ£øŠnáuKΤԡª+ŸÜ‹ª×ªÂ¯în)ãét> <X‘"‹6¢u ·ªà˜Ý<$Àº tUÿ‡:T¡˜Y£êRS±±Èàó8h« ›Í Dœ.º³fnéÏF75›3¦Ú­ùJ+8 kÖd+4?¿æ—¥Ã Ú>$`-n qSebGweGÐ2‡Ð™…¸,àPÙlŠr HÒ üŽ÷ãC8„%˜ãM͉¦Îk‚ŠXmò–©µbÒ„ìT›c0ÆòaŸ‰A7e=èfÉâ0!Ÿöù²— ƶÐJOV£'ŸqXt:2p¨˜겤»Ä–i/@•´³ˆ²È6˜Ñ-qJ7îÿ«Ÿÿ"·ó_íç4RÔñ7m;ø·¿ÿ§‘¢~þ‹Þðoÿ_“Eÿ6”ÿ¡Ýþ5RÔýÊÿÐþþ¯FŠºý·¡üíøk¤¨áoÖ†ò?´ã¯‘¢ŽÊÿÐþþ¿FŠ:þm'ÿCûûÿš)êø·¡üíïÿj¤¨ã߆ò?´¿ÿ«‘¢ŽÊÿÐþþ¯FŠþÄ6”ÿ¡Ýþ5RÔñoCùÚí_#EÝÿ·¡üíñuûoåüíû?/êö߆öÿÛ÷4RÔí¿ íÿ¶ã¯‘¢nÿ­|þÍÿCj· –ÏñGüÑÆóùÔàÌöÓ¸ 7ÿG@{Šü?`âg‚%’Iäöü?š(ÿ{òÿH•ÉV¹BH:Y‚W˜ã‡¤hiÏÔž¨u2}f6•HJ}Eñr†Ù_€§"?'Á Ý÷A[htBœ*¾”ÀÇ냼‘O½‚è,*“Oå  7†9¸Û’ìæS¦“ªƒŽ—KJØË ôó‘´Vy øaÕôŸNÆÐaFöÞËë ~½*À²Cڪܢt‘CÙ2¦ºY‚ûd/}#Qäí%>Lmô^ØP=HàCEÜ ¦ º`05ÓCghJ0‘1Ùdq€(B˜hBhYÂDœ”c²Y slŠ•rŒ5iiY`MdÂÀâ[ZX¼LX"¶¥Iñ2ÒdlK „Œ— ÄŒÔÒ¤ÍL¥¤q8Âç¤Á‡:%™ `ðÌè;8=Êlà™ÀŒ eog©yrÄR½Ø0båÃ’ô â<-1)¥ÛðØl*ðÒwl~Ü'0t¬‰ºO¢Ò_wHfÀw˜}ÉwHWz#uNû£Ÿ.ªÏ³¯aÆ«v¹=×Ú×s­I%en.º?Ï£Æàñ­°?-gÚ¬Í&ý.}÷]ÎC‹ç>óo¹Ï¾Œ2­™ô_éUY&8ä£f1Áªc"Kð½tÔˆ¨t¥å õ †Zßf³¢Éñ U÷yn ! x U…òq2ºfs•ÉÅ>žNoœ”Ì+”‰ý§¤˜û¢ä»€©ÔQZ,Žä¼Ùm'™˜\úÓaNã¤aˆGgуdQh²æ(G„‡–Ë>ÄáÀ­C³y¿T`Ïf7™åëç$ºù"DTT€™Ïþ$•?˜ÝÉ´‰Œ]rx~HÈÇŸíÙ89—\ÕréiÎ,ÿJîÔ­£…³Íö„ä-At˜Áâ¢Ø¶«i˜È͸­Ÿ“ ï‹ ‘›©Ñ‘g/h=”šÍœó9JV³å¨ íÿ£ù©j,T“@›*6°ú “ƒV×ì{À5R€köÿ ¸fJp~¸Šü*_ă¤D‘æ,Ñ̲÷›bSýSD¬I‰e57IGxýœ”±“`¡<×3¡ñy ö›ÂY\Å‚ ‹U·¼Ö‹ìqU—N- B]Ówì7E \x|eª{œê\dôXÇo "ޱB¬!„þÅÑüŒéÂ¥bRÒc-–´…&—Ò¸ý|S¼ÁF6¬©Å|á`C¨I ¡— ‡de„m5[CS¢#]PXÛpÝrÉ^N@ (àh°Ý Ñü2ûMá6`X=¡×Ù¿(7-¼ÎFi*ÑИø¿)ÌáÀÀ*î’¨¶t󆿠j«ùо”9åÒM•Ÿ–BGÚ†Šy ÆÉS10 ¤B~<é (÷]Å´Kjf¤%VúcUÂ,V-¼‹Òbúf¼ß²:ü'åµôÁS„²3BÈZ erEèx#ù)¥6½ÁÓxÐÅfŽ)Rø¶LÊÊoÊXùÇ~VºHìÿñt‘êçÿÛPþ¯öü/)êç¿ÛPþ¯öü/)êö߆òµã¯‘¢†?©-¼ÿoÿSƒEÿ¶ðþ?¾ýý? uü[õýoOÄ’Xtü'·ã¯‘ò9þʤþp’Íß‹Íc¢)ý‘7 hlcýûQiþý?Pªøƒë8,ÉÿÓþþßÏ/Ž£›âÍðd:ƒHē̼Mhx‰ˆ…IxoSRkó×^~nùnû§ú}w_³¨îÿqXR»ýk¦xS02†ù0¿òN4ùï]ÀJðËšàƒFº yË“q†X¬‰üA†n‚UyPí ·5ðDðO–?Bà0B>L¥+î%àI†X’ D4!bMIšýQþo•ïµ?.ó»ÛhÞþ±ÀêÛ?Ônÿš(k¦MÔ³Û`ÄÄz:ØÛN×Òê¸QK«Ã›N¿€š fÙàϨiS\í>54 0`ïÞ½ƒùeddÄÅÅY[[‡……•””xyyéèè€R¼?yO„Ó§ºh+½ÍÐÒêÓÁv¼kÐöò'Á£dÑâ*ë¦éÉjì“·w*±›÷_´=7yï¢íå¢Á¶¾Ù·Ê’ [D8 Yp≋÷åcûl ?îÓÝz^]ÇÝ>jÐþ_í~îôẓC»éüÙõô»žúÂW‡KnÖ÷Ô^b;o©úÏ98"Ã`RɪÃ>“]¦¼]4pÍÍN*?Ë«ôveô<<ߪöµ×i+o‰£K¸ý­^”OuF‰./·Ùºuöëíh‘Y=a¸~ÄŒs$yƒ¢k(ó#bB+£”ß±Ôvl‡ä­5Ÿrâ¼âÞÍy¼£jͺÓV¯ƒ»õÙßéÕ“Ç‹¬½c­{?Ò÷Íøºód³5®ý°ðKáû½‰Yú¥kÜ¢mÝ:øõ6¨*5 wCÛAÏ CrPÝû<žUò¦YcÖúíÕ“’•'Å>¬‚ZÕ:Љ/êÒ¿¬Ÿýî>GÒ—Ùr»ª\Í-ÏšžÙ¥K—U{öÛÓuG÷^rýßáI¼þcrßMYÞË':šŠ?;1ôͽރ6ÙVd¿ gÚ¿`ÕdϾkP»aü-'æ;?6­ã zj›>ÈìÊšC—w ô|GßìX`›¿Y׳¯Çì•B':gÐulD5lÉ6‹®Ãnãí}ŸÚ'eBéP™‹9s{åEjy= ¿­U–õ‰~a'}Ôš9ºU™½î{W8‡ö¼½-+HrÀ&{ÑËÙ§wǸ‘fõ ~Ûýï¡zä¬ô¾]“Ïh§üñ¼kÄb»h[õü–øÓÇö95áñ#¡pª>+…ø{ò7‹ù¤!±u•›Ü, ˆhmöË?BÆ•—ƒ®²Ò²r—&X’¢vm=ôï‰u’n‘=B¶ü>圉öãíZ„E n´yUšàÏÈÍ×ùƒú=îЯüÅ!×ðË~Õ×îhq›½ÛõÈ–Í;¯5 ÿó%Á >¤öÑ›Q7/Y×u%ÿš2jêøò£G\<•U½o–… sÝË-KÊ<Ýkµuû›mw¥:f^ ýî‘ÒŸÁú×s 1á±û2‚yAÕƒÖHvð¯Í•ÔEŒÓë|÷·©Q¯ú‡öµ::é.ehlÈ_µiAó6Nº­ý°_|Ù=쟃üãÍ*Ç9ÞÚ>$úmbÑä§¿hoO^ÌÑ»ÔßöMJüA&Ís½+Ívõ¿Ëºl§½ñ€˜ÈHû0“¾ðÙ멼ê]"ÙeŸý…ëüq¯Ãâ{=C ´×Ï¥/Ô^\lÒ‘d7Œû·ô1]z½zš®Ó9ù3òïá¿?ï©ÿ·ûî˜W ÏzµØ:½gPwËVèºý;ëÒà"öq΢«¸I“õt ¾$N‹é¿îXÿT ì€aÌ9wþ£M£vºÛoLç^㖹ǥ_ìÇ;þÈfþ?7‡L<kò ahÃ{="sú¸aÒè 3}n×Û$¬960¹¸8M"ë—vãÿ±÷%ðP­ÿÿJ‘T QŠÆ!Tf³6.FLÖ&%™ÁhfEûUY¢†RQê–·TÄÄ­”º…H%eWÚ‰J¢ô?g¥ºÝîä÷ýÏç5Ìœsžó,Ÿ÷çù,ÏyÎót'¼%€nȲKžOxªV}[Â.U"Ä\a‘5øŽÚª% “´3ùò6àöËR¶,[‰¹væÁéɸF+ù\¥™€JÑï­ëpJ§Æ¿k4²"{-…#õ²­õq;Uþ}ÇãE)-ùI…¼…Ü(»1c»Ï*Ü»Ô&m1úÅä9ÞÁm[‰÷÷tØLŠëîÀŒŠ7ÇÍžØé³J'µWåäÝGæÆ=2¶\y°¹‚;¿ 𨹣ëÑ ßbE._u;¥2àV”«fºF±„ü®MåéçM€šE6s5Bö×”•ÿ¼¯¶æèN;²ÚíØu¹zé@F¼&×lWæÊv)]ɨZÜ)y¢š¦­ºT~çök€Ã•‚îð@T«©ñ·5Ë Q­“oSNB7WY#Íä4¹Î¬RNÓ;–ŸSnäY±Šû܈¹P-µQÖÀ×’L·ÈÎ=X1.ªv"ƒê„nôhüpîî™8µ¯‹5›m»4 4m±Îëý%&Õ®|uåª>aòɵžÉ[Úñ©£cL‘sŒ_IÖ¬Ìrlµ¹_"Gã§#Ú=mçøÀ–wËxVla·[X‘5mka€kÞ´\YM‚ø ×Ï\ºæXŒÃïÍ3WžÌ™–¦AN.nÇð6†ŸÑv0}áú§Fèêê{Ç /ý{aSëÎÝT“UÍšà¶:s¬ù1À­vRLŠ¡cñ£<¥ ;ÆE›Wf\´¯O¯í’î(;·É»ãIKõ(ÏõÅ©•ÏvÛuSÏ(¯Ï“Ãß³¯ÀÅe/мº*d\U!íú08ëžýi\Àëh…"Ÿ’ö«KîÙÆ5‚Ç·Æ(ŸÈ{d‡9TÓÒ§œ¶Iz™3jœEËëð µRïº3ÏÉ+ŸmµÓPî¶çWI>wžcžøÎŸ´_:—´KÚgâÂÎUºÕËöŒY ß3ê=X8!Ú¼sdÇJ¹¶SA÷ìÝpI[]SµqÕš³¤.숋D•Ý€EÙ=ÍÝr+5®vçÓ|®åž+X«ÈÝc¯GæÜîn˹S$ÑQ6–ûXkj@“þ ëT›å8:­Ívb4y@¯6yÙ6»„ ‹+ÇÃåÛmR[£”ÞZ§6øÄfY¦^$=qPÒÖ)Ž3‹øÛû†×£Ýq÷aøÜSÛöCEu;%~{W47•V=;3[ÿß.¶Uã´rZ%sL–æ¼Ô Àv³öµ‰šÑYΩ—¡ë]¸ÒâMèÊå!BꜢ ñÁ’LhWoéhS`%¸ZøÅ¸yÄ(j©?Ÿ²­RkÏS.r´ºcؤӰ߮åuÔ¹ˆÓwqÎMN;ozâUÞ²êúCœ±&|rÊ;BšÛñjÂË7YoeœM›ë˜ËÖ·ž¯‹’›xÁi͇X6z·B»ÛÛŒy×YJ!¯nïæ³O©À_†¸;b’Ÿ¿ÝšWža9L“_ÞÖ!yrÍßïdJOÝ[uý°9 N¸¨¿æÎèì˜×­ëºZ‹šÛ×¾(8Ó!iª.ÿdNNŒ^uŠ«ÚÔáyq÷CI#ÙØëÃWïîpáʇt]˜¶D39ô¢ÁÊÙ¦¦¦Í¼SzvùcП2ÏV¬4=~tª×‡åo$8å}Pyâþ2Þ´ Ï펴»:¾¥f­Ù,Û8^ —½³«¯Ý4â‰{ ØzìÜ’ 3 ¯ñr'WW.|Dú8ÊøA0ù}Ð|?ŸmÚZ*„ú¸Í¡ô—šÇ%”AÏSúfȵ®6ã·ªò&ÇÇÓ^^k¨²ºJwžÝ~;Uà¶í0v}h7À|ñŠÙŒæ-ÝÌMÈy£F¦‹Pf!äsk]Õœö\ÆÆx~Œ=b¾ÛTöÍ„ä}Ó£€àÈ©³ä—ú}Ov˜^1Íòa‡ ùÏ%Ѽø¹7âqº€w£¼j3<¨lÛ¥¿c£¦«d†Á<Ú%ÕùÐVÜ„À¦Å0ÏßfÇD -¦¼:¼ÄJ{&E7¦¼Î0ÝD«9ºü®^–!øº¡—5C+=Uö Kú¾åœ;Y‹º=ò¯ Ð÷ <žË^y%›¤)µKÃ6GŽV²Qy¿lŠÁ›ýS€).ŽÕ TLE9£,¥#×ìz!ÉîÁíE×´Ò£PwOÞ©á˜ifÖÇÀ<Õ›‘;pwÊíÌÖøÄjÕÉ»ÀÛƒç­ 2 í[FО™òn{nðžDÜâgÕëìSž¿wQ¶¹¢T0’t^I'ÂÝ¥ ήæ­ì­ .;£q‰[–n¿äö\È¥Ÿþï®ã€ìñ›ª,‰3åÝçÞ‰X=o+§Ðss5uoa5ÃË:SéÕ,MÉ<<9æ®ýj֨ź™<ÄÚjKÊõã_rc ï×Þ‰:ÖR¯tÏgõꋤMÒ+¥+Z¬Å%& keÕÌï¥8ÇvzDO»å>¶ðÙ“zYjåìwí˰ç­.<˜`w©O6ii"%wáÝD%“xÜŸÞ¶¥ jÖS¢æFoÛÿ»£ ³×Û2«šð4O¬úœ‡#µ˜Évf±íåá,R‚,è\“º/^~_êÒQÊ‹B½– ÚM |ƒüãåMÖÙÕ~Úr:æÕns ³VuÖˆÑ[^-|¿~·¬¢}—jhpÁmUÖ¾—OS¢ŽÉg¨‚iõ¹g¶7©j.Ë9Î8†ÇnŠgcf¦cÑñ;(£ßE•så–ågΜ¾Ã÷`Hy[~Â-`ûÜšé@v mÙžœ8"÷òôð¦HÜß' ×{u¤¯žŠpçæ®JQ=U ÿl·ïbò¢#^Û g²Ö¦ÜÉJ¹‰ê·/9=>pC¦ÆL<ç6rL‘¬ÍÑždËÓH‚}…N¨T°5|\ÈIêÉŠ2Sã´&³ÎJ_V1ÔŽ—­UŽ•²ñ©˜QpbùBmBpÀh[-ÖyT’‚{úü‡©´™Ho‚vT!ý‰cáÁêÍJ”UjYíQ’ÂQ,.£°áì;¿Oàw"æj%^3­w˜Ëz¸ ~Ý^t”âŽfÙyæ¾VI&ÚˆnK€Ü¢ :jHõI c¦æu¸5¼{ÝÚØðZ¿~u»Å˜'rÓü,JrTÌåWG¹íÔ¬â¾m:6­®ýâËMÔ– 5Ó£3å™´QóŠwÊ€ê´.itÒR)÷‡´—Õ纶=Œ?óÔë pBÿº>iqåC‹së”O8=àPãÞ_zrwÍÛÉa ·Zëª.µž°pÂ~tu'ïž±á¥d\…Ó}ÝõÆd!@š} þžo÷‡ç¡VäÚJóˆõ£@ßü,üÃÑåo¸¼ÊF Öð1õcÏȽ¿qY #p©`£+3ÒöÉønµ)½T±©ãz®‰i§\­ÚYP@ïsOÌ9·ü©wäæ»m/U_X“q‡¸R'Íèã ™îé©;e‚TŸíRyÎ܈æ0hZ…þÈÇ­aÿm'›ûÜî©næ¶çý bô¸†W½üëf€¶¡î¨j–ëÃÄ•É cäÚàèÁ Ù•²Ü»«º/F¾ˆ>»ù힇´ ©Öã2knûøT¬ÒmÛŒ ؈‹/lî`ìKQJÚ—g‘dP5åÚ]ÉQ¹q‡6uQÊ–V<ù€ žDvç{‘Åš˜?<ù‚jG÷ Û}­~' Û¶ÌÛAEµ¼È¶º) êÒæÜK*·V¬­Z×r±ÁËsääq—aÑo°ŠŒKù–ñ­‘áKËœ¶mŸm@±6¾kl\ºk©‘ñ!Ò=• ÙÓÙþ«Ž»%\±Ñ°-p\¼Ù¿‘‡¼z“š°ðö ­ŒÑAÛ¤QQ·y4e´·\xyºVõùü1dß¹:föÔõÕiÄö­›d(Ú3]Ì‚.Ò•Û/×Û²l^4~Wð%Ÿ›«–(ŽßÒ˜ôçÌ¢í¤íïdÈ—;ŲWO%Dp6e&lÓ:¢* ¼b¾×•¬ªðsÊÒ[¹M1öϘu-šò3’ÞE [i>šR!çŒçn.ãw²Û¨vhkáÄÑZy‹vï´õywwćzôózi‚Ž”|”ŽC戜{ÜIgO¸G•/Ñg Ÿ¡(…+·¹ÏiZ­8Bwù­V†[íp 4·ü}¯Õm©k°µÕ.õe§­t§<§ÉµÍyŸ”àðTŒ\þ6Üñyå4Y esyk@Þƒž5 (Ú\uXùLÚiáú+7]¸A7ótn‹Ô¥Ó—’œCï)kû«8NtG[6WŽw_ýA’rXdV.qA¼KHtÙˆlk0"²%»WmÌœ1C>-Ê72UÖÜÍiÈ<50ä¹±ÿÒl‘ ÇÌÙzóð©Z´(N-ÁÎq‘³°*-nÒI­²7™tçÔîe)v§4£Ê#l¸Œô ®4ccºg:=šcj_=>wüSVbÖ̲GºT·ÔKê#š¢99JÏ <=„™}™¢d@a•Ò|”cØWæ®(EàÛ‹Ò'!}oµCß)¡{à‚ß—é;5¹´+îî5ÖÀíÊcŠuE¶Í3’™œÒWKÐ:øb‘|î§ *žÑ“ÓíRULΟ4œ=~xÔ‘ì×o ÌÆL}©~v;ÄoKˇÓ&Pl"ÃÞ-ôÒW¢þMÔÇ¥F„Ãägž’0Bï»ò­öy©y$¥G4-ІýŒ¼|Ó7æà$ø˜ßç¡.«U=3•J;‰î&|ùXB¤K3Êó ÊëZfœƒê ' ¢èüžYúÚŽé:[È­ ÖdíÉìºÿZaÞá™~^šð‡Œ|ZLü\ÐFZh08GÀÇÛ-°KÕ.ƻϻRU:÷WÍ^ø:\ÀÅD»'Å×hîñtðÞeÀx S;ÎÔ ‚©)Šs–æ¡ø,$1K§¬Y—:?õ–{Ù!»Ã§RpõýðG%¥ñ`òSO^s4ÇØ~1ˆDb–nY.ÕƒÌH¤½y?¼$¯°Ée̱ÀÅ1ë­¯åÿUxöâØw-:ÆåS›bJdöèû¦¥þqìÈMIÖcSGñ…ÎÞGLÊÕ·4jÃÁvMÌ*SöBÝ—¬ßÁN¹8ç¾aKáf%é2eµ3ZÜF]G­°ºöøñc4 ±A‹Ï&(_0úëí0¥æ[O‘χê~ë}‘å9ijLPËÚ~ÊFž/_?­–2P/=rÖ¼…¸G;åV)ó¼ÔïŠ$c†Ï¶OÖþcÒ¸qÃŒž`ë7ÏÑÌ”²÷*qñ9¶qü®;Üiñ¦m»q q Z*4Ê6ÿÚ0}­î¶Æ ™Eï1óÏޏ`ã™gCïñ"×­Ûz¤å@¾m}mÀøñ~C íðÈ|uáqðÓQñQrçaïËç.Ð :ÞÆ wÜjéú_8Žÿ£$üüg(¬ÿŽÏÿ! ã?æÿ ð7ïÿ(Æ(ÌÿîÁ_¼ÿ£HH£_:ÿ›ÿümÔ£ÿÅý_$4ÿOó? ÕúYLš·7‘Aüw“@ÿÉüO´BÂ@ƒâ"žÿ!¢PHŒ1ÙÈØØÐc€"“}ÑH¤CB|‰F†ä_]?1ý·ôcýÿŸMýæüO ZXÿ#À3âý_DB_šÿiÄß òsI蛞id¢‹DÂ0†H]LßÜOœL2úšøôÎEê¢a(¤®1º÷f$(~Æýn&3¡]Q>Ýc„Ô540¡ LtA9ÏýyôCýÿNýFÿG PŸõŒxþ·Hè ó?¡=¿¶ðçf¿NR¿4{æNžøQBâ+“?m-ŸJOþ”Né™ü¹Û’}£XðvVÓ.çÉ©5ö÷ìÎT9Æ™á§ódδgœJgb:…=¦²;ORêyñçÌ|õ+Ã.Û­½kÔ¹ž¨÷>Y»È.,ÌÆexØÁNÙ¦Ãã“·þwŸ¶Íç§yéÇ[Óªj‡gÈÔA€E¥×)ç¿yx!‘±ëís_Xåk4lÛÖ ‹<•äÄö‘Oñwc7×]Áx†5ÑÙò5š­OCSš†ñŽ-JÏiñUv7¯¢Ò€ëÙ u²µ5Y {΄æáÕ.`3Ž&ÝEêÇJ-r“¬cŽ=R·³ª@®Ù¹TuéóÖ„3ôœK=[õ-—m{}>¹~6¯`÷‘'¹IÌ0I¹³ËXa«ŒfŸë¾–šøèm±wR‹Ä |Ȉš…3É>–ÇÀ¶¨=Uš‘¨õ&™}2üõøô JG·ÊôËi1[”(·×æ‚/W5S›3{^dìÇ‚ _[[Û'·tÏ€ŸiJ~©çÛ¥?ûx+®}rìÁŽÊÌÇ•œ·:Sþ¾dã\•W<©å‘zm¼º ]!ëbyôy~È.¢â%¥lúÌÞ‚ÐáÉ*nA´½»=|Ê,Æ?ÇkÐR/‡N^[r1Œ°LúäŒßy×-Ž+ZÕxÓ®îKŸ4¬ÕKµ7qºýHLpJ{‰ó»7%’›*²–ßtÿ’çØYÜüàâ|Ûßîìð¤Yo¿±ÿ³¦Z›œ7sKôºWÏó›ýl¦¯»CûñÉÇ*úsBñ¼ÊÝôYÍSh¶ {HfU9çOxÚÖË"¼1q+TòÌ àÿP?­¿µ4ùŸTWZJ±X»y©홬»RBüóÝåòNiûj©}Ø-Ã{}úÈœ²ü]¥ñ{ ¹c*1kü6͘ž¹¬ò¯Ó ‡mg2›£R]w˜ÁÍi«Ó*ò;éäÊÛ²Ÿ'~$®¬SŸ×|çÄ¥ ¨ ɤü´Õû]?D<>ÆaÚR+÷{GÒòΠ'eÍq9Ô^ø´ãxˆWFPwTPñœWÎ>YÙ÷ §<ôËÍË߀ú£ÒcÚ’›;•>Zztï‹»çßU¾í,aú°o™sçìòî4·°Ëí·##k̺žuëÌ‘»À/µ!³òP•EýùŒs]ÉŒÖðÙc=ŒÕ’SÐçÎu‡y™ÂשºÚ+zต¥ß\yýqœÊôÙ7²UöÖ{Ƽì–ü>FùrµÑsæÚ·ôYnUÇBŸÊ§ê‹[}û…£;÷æ'U½\q5crûýÔ(Õc®!ÃÊrCº³Õ7ݬx\™¸úZÁœóKóÌnœã…S—Ò²2ókån£·i'§•çotÞy!âhä“ýóh(ëäîS¨`}éäõ·>¦/N¿3üL{AÕðäe¿I…_¡-V•<\œñáï8ÊßG%iëÚœÍAٖׯó›®O IxúÌ;Ë8³°k$­ÅZoã5ŸÉ(ƲŽÉí§ ¡ö¨>nDÉ&åœbežœ¼ŽôVÅ÷¶Dט™Ô’šÆ{tuÞ†Ó±ªéMæí<¦óY:>ˆyàºÊøýk‚×ø]oâ–i0Ï4¼º?µ¦¶f=K¢Ò_þ-]é_ƒyÙ‰•FDcªy£<ÊyU$…“u·4i5¦§òÿ¢{¬+ɸÉk>ÎòjdÁ¶Oâ¡Ëf\«Á¤{JÓPQÕ¼D¯éÖN»e>$¿M€9|ì(ÅÓ†ûÕ'`q VI%ᄊ§\tX™ÕëÀ—ÇV/Û'»6ø÷³Ú±'Uëáï;ê_žàÔ$»è e‹³ÚÙŠK‹q«4h¥0÷³UÓ—w6ÄM;‘W§ùfÌ_,ëñX.ôæû̃fÚ3&L)±ŸulCé³Ö²¶ü?ýi žÑâÒ늒f5®lÜ}¨ÞÄ£aTä@U©©ç»(ÈóŠÏÆt»²²Éí³x0ªlö¸˜ä³oèÒ—ï\µ¾¯ÅžÐ8,(áLˆ›/Ñc{íöûÒ—Û†w­¯½ÏÓ*ªT¼ü†¢_5ÏÀºè_F:>îÀŠ„i ¡ãkGÌQz¨¼+×õï„«p;-ÒK_GIJ»"ÁTðy$;sî5B@ˆoe8ãOL–ΑF³Òª±”ë¹è»6§²¶hPlÎ{Î -ífÙòàù‰²59—Z¯;rX³í͵‰Ìpå+Ý ›Ý|µ~,ƱV1•˜ÜbU‰qõ­É8ºÆ@iü+£qS–Eoniêtݲßv‡>ÛV¦h"ÏeÙHœ(ûv˜-íºŽÉFìÛÊYò‹œ•§ZŠ h»lgY“‘n^¥ÞªÊKòªÞÂÆxl|¯8ű-F½5×Ú<4ã"Bï•?ÅQÎhZ¡Ïoø®üQF]qõòÞœÇÇe‰(8»AOƒ‡¾ë/–H"o]QY&¹ë@Ê6è¨ÄìM-)< B¢&l]‰½ÍêóÏUuŒgI`Ç€³ÓöÕt“ÉS;wB¾ÀÿáÇXbúAöÿ‡ÐúâõŸDBÂøÿÒõÄÏ ã?tžÿ‹ŸÿІ„ñBÏÿÅÏEBÂø¡çÿ1þ¢ !ü‡ÐúobÿO$$ŒÿòÿÅþŸHHÿ¡ãÿ‹ý?Ñ0þCÈÿû"!aü‡ÿ/öÿDBÂø!ÿ)Æ_$¼þûòÿÅþŸHHÿ¡ãÿ‹ý?Ñ0þCÈÿû"!aü‡ÿ/öÿDBÂø!ÿ_ìÿ‰„„ñBþ¿xÿ‘þDƒ¡‚?ÆH<þ/Æßpèà/ŽÿDBÂø#† þâ÷EDÂø#‡þâøO$$Œ?jèà/ŽÿDBÂø£‡þâøO$4þ6ÍN”о­¯ºR–sø/ãþ@Àƒ¿ÿ‰D"Œü÷?ÑHÃßÿ ”ñûŸ¢ suœ³µ«»‹ ÌÎÕÑæ²ÀÊo ôàp7¤5ŽsÅ . ô a®,"ƒÍßÕœHƒÃmœ  ¯ù›P›ûSˆd¬9Â! m²õ(AÁÔÙ$<GÏuE €‘G³(L|©3#ùYl g6•ÍÔ36F›èByr¨+´·)l¡„Yó7$'ð_ag(æpÁÝоãŒeÂ{÷lÆMb³‹B› ðwgûS(ÆëØS5(ƒm~«z¶ÛV×Óƒ}ÚLÜg 'È®g§n==0 ™Ò»Ñy_ðþ»Ý÷œªôš{ÏÞáŽàOÁ–ã.D? ð•°¯ßíOkÃ"ù÷nmÏg… »ÞKß•‘Á`r v}ž‘•Íù®< ßÙ=÷ÏÿÓÛƒ$H²ØŸWÁ‘B÷;ßweãGcúiŸ×ãŸäò¿7…ñå0lÁnô Òðb¿[,Á´|‚¤Cô3í­Á D ß@eøSXTΗïá§ mfÏ\¦2ü`üêô¼ÍÏÖ‡Á>íh¯áM{,•J»#“EÑ×ׇ7Ú<ü#1ɬôº0™Ó¢qÌ>1BfÙü ¾´vÔ¼ýõØÌ`‰ÒÃS(”¬7‡o[ ¢µüÀbàü¢ùµÀ ZL#S‰~,"ߺAxf ÞcNU ……5§Òý`l©¯Ž(8ñuû­nÀ/ÏÛ,)ÐZç€ù0Yd k6`À@@'‚|#S@cI;09#Ò@׿)üÜAÕï©ëhs0ŒA¤ƒ èe ÞIdQˆÂ`€ E!m¨ÛŸ©;hý H1ƒmqEè‚X×Уk„BõTüË…àd$æóBdÖ× €ýÐ54Fë¢ ŒûeªA¾Èõ ç Öà0ðv€õå4Ñ~Èp0twˆ“Þ4 ¨‡{u—à’¦%æp(«O|¶fÒhDO"¤hþµ@aàd åEKü¶4!ádCôà 2ù$JÂÍøª0}wÎbIúG’d> `§Å|]¹èѨ'oÈ.˜¾`Íi°Þ+|ËÂ!úÐ(ýÅ„D¡Ñ‰d2¨ÊûŽÙDRÏ1ä.õဎ \ðÕw ä””Áo½¹xÎu ö¡QI0A„Íé5» B|1 ÊëˆçPè_3äXwª˜7‹êçž é9„8ÛÏëž?“ô$Ñ’TâÃ&`À ¦ÐÔtPÉÇÌ ¦#$AÕÍdQغ°ùD»@*(U®0™ÕshÍaÑæCŽ”›+Œ ýìwÉ4D®0:øß¼Ž¸.}Æ‚0|˜“ÞŸŸ™Íï ¹4 ® ’€ïÐè|¥ ¨{‘¾Ð½(B&ùK—øYÿ Þõ“ªÏÄŠLa“øB…„·PgAõÍ`sXÁ$°Žú0¾8ÿçâjøCâºúòjØ'¯=rBeq‚‰´_%^`+«²@¾~„8Ê„`AÅÉüel•¬5hÞ8°§ø&è70é W˜‘hÆêé^ý{•à™õÓøl uT˜€×Á, Œ FT \C©Çô§‰" |  úó…ý¿Àe>цÅb²\6H;ŸÂáë+4$H™ TW| ¥ p] é øªî§Ae炇õ¿06¿`¯ÄñO€½t;I,j $ üî:ú{Jã þ‚ž? \†á˜¤`:…Á!~ÊsÐ ñCrÐçJöF ˆ¾¨á»•‚Ád¨9‚á…>¾»B‡Æ_cõ&Äx úÑ73œ†.òþúxE¿¡ÞûeÞ{دˆ¾.(Ôé ?ÐQ»O¼ƒõË’ŸÁ Ê]§Ÿœþ³z} šïÈ ’”Þ ±0s Ëê‹ÂÁݵtƒÄ=!†ýz˾q¹·žíÇš …Jà÷·ï[M™ñ]P {þó˜G ¶¤çÄà5ìSGýÅl ¦úÔ9ú:úóÁ=áÎÑ¿Ïõ&hŽPQ=×ùúê»?~jWð:Âñg’¡”$"?¥ÏŠÞsßWúʰ­Ñ5`X‰Ì25uaBGhDˆÕç«$2 d?d kNÿ|°.D(( ‹mj÷ž¶A—lýâøhKŸ±´—A‹$l¸{ÍðÙOØfa-Édð22Q½Éúñ»Ÿ•ú‘r{zÃWŠì®PaŸD N¦}‘­ xcOÁ¼À|ÈP>Ðm|± P¨ô@²o 8ø²˜ô¯IÂw<%àG®_¸È‚¯õšÁL*ú‡L*ôZSôÇŒÁèäóÈäÏzBQåàÖ“AõËO$†ó?‰/¿Ó$ ·BÈ@‘ù0øãÇ"¨Á÷¡ÞbùR÷Ú }==TÕ~Öƒë_¨Q4HÄ×¼‚™ ½ ”ý¯U§ÑÏU¨R½Cs½ê%ŒüÓaºÿ=•Ú;|:¸Zíe¡ÈUë—ú!g‚u¨Ç#åí‡Ú3ª!ŽK~šEøÖx:?Ñ| ” 6S¦|³éU¼}Pl*™Â?Ǥ¨¾T’`˜É‚A“6),(ê¡èì™+ ¡(%š¹Á€ÆÔ‰´` ¦Cõ…AuFäÇ>`èà ¥g Ù˜¤¯ó 0NÄãÄaÂ|(½ÁÞ¿ C>‰ÿw”õ3‚H:Xü 0¿™ÂñÈO4¦èŸkL‘?dLç0¦È>cú¯ŸJþÿhXçÿ*Ã:8Zÿ‹æõ+²'6²CÛÈÎÙŸidÙŽh,,XÐÿ-óŠú1óêϺBÒØÿ¡ÿé æ— %²a~}ïßð%ùâÊ„d ?þ (¦æÁ4þ»?_PúY¯+|£#8ñ¥}4{Š!~­ð²à¹*¿Aþ¬žyÌÐCå^!῾úp™ÂøºÞ ¼Ì¦ƒý ûé]%—ŽàŸe †ÀÀ Q¦HSC a`hÐ;ùýÓ‹V0Ÿ=Z¦o¦ôF—)ªßû “åç¿9ÓÓ‚ÑŸÍŽïIÈŸôΟžÝsè5Mt*™ y$ý´àNð:•9\Ð ð” ±¸ô¼‰Åu +ÞôgðûŸ˜¡óþ¯xý‘0þFC´Q0þÆCñúO"!aüM†þâõŸDBBøû ¡õßÄø‹„„ñ2뿉×ÿ ã?„Ö¯ÿ%Æ­ÿ&^ÿK$$ŒÿZÿM¼þ—HHÿ!´þ›xüG$$Œÿÿÿˆ„„ñBãâñ‘0þ¿tü@!ŒÐ†(ñúï"¤øö|ZBÏ¡0Àß+>[!Nþ €_ÿ$Ôü "@‹×ÿQ|ŒÆD_„1†L6@˜)#ÅŒDcHÆÆ$Ò¯®Ÿ˜þ[ú·ýŸøí2¾Õÿõ?e„AŠû¿(ȇȦ@³P), k4´ÄL“L†“1Ä/KBïë0J„æè"0½wúÂÉhÄ—ï\À¡ÒznEëà M åûPâI¿˜þeÿdø}»Œ¯÷C …ÐÿÑÐþâþÿßS”‹“íØÑ*P?‹·ÃÀï»ÃGH‚¿ÆéO ¿´]\mº?~´µµ=|øðäÉÞÞÞwïÞ=þüÞ½{§M›¶fÍ0áÇU¥–Ç‚¿†qNó%~{\é+!¡˜ŽÇYº.ßݼÇ9¼:ç¯ ×7åܽ¯ßÒÆ1q¬YGa–)%âMÓÎÑXIY‡æK-|»kcj;+ÉIÖÞ`ÒŠ ¿ Kol2m™Uµ3®ðJ»ãa‚ߍ޻ðÌ©S+¬:¥õŒ>tM}dí蜉9ÀÍ'Œ¥†¹„ßFêŽÎiüì žú¸sï9ç9ϽÏ9÷ž¹sÎ÷éJ`÷uIïõ“8îaôþ'$éZû…£Ó÷o‚Rت|OnÀFjGÔ 0,M§^Ó=§¼va3àf-§7(¯—9š$MÜp=Þàü™sæÏÙ/bCÊÄúŠ7ÒåxÎ|*&P’»Ÿ@N{w˜Y§3~r{t —ýÅe–?ÂZ´i÷>žêNé¶6¿tͳt ‹{¦™0!lÏ<%4¿d*q³Úð‚̶XãûGKŒ¤S‚„ÈÇYujú¤#'Ó“/éã¸XýùóçWW:Ï­µêcŸùt‹MMè^}º”†µUóÊ‘ý$ð“ «¦ Ø e]"“6gÈ¿5£tË‚Y0Ø=qÃ\:àÞƒû÷0ºÁÇë0‡¿^,Ûê(òznO2</‰(\]Î+ÊU&"j{ýεz'Œß:¨KÀ8o>ÓflŸ•ûOé;ƒ»OØ‘#+QÃâ·Ù[,{ê=hzE·+¤ÁO¦â²¨"ä« NØmÚñGEÒdÓé–ƒìvëÙF !•÷<¹ÚûÉS’ÏÛ¿k»»o¶ÎðöSÆYÿÊü‘ 2±;yP»¢Ø´ûSEزïa¢yÞ³ä¦+õ¬ˆ[5Ï+«iƒÀO*­µ5ˆ¢•ÓûVߺ@Gfˆ;È·© ÑÝngL¼TÙ„•6½Q'(ÍMl€• |ø°h$ÔRÆ!‰<"-·GCÞß׌Ó›xzå‡y#ŠDG/KyLÛ^­i…‘Òys6¾ 8䛨ƒ{ËÜ_AùTÝræPnDjF½'jàtÏ s˶À´­á|ÑO]éú w´¹ ÓÖH †WÉëEK¸ÑæO…¼õÖ>4£W{2­–(ä¢B`žág> @£Šú¾$¨]cÚ`¹^äìcAm?Ôdò(Š­±W Ò]gX©îzûêh¹T:S±PÆ“ Ep9"u¢ƒ5cv6µAÿa¸¿L±Rd’ µ¨‘z+ãXco­iŠ!³Ë[º;ã‘Ø7EuL²¤F…#£g¦®ÃVî/Ð$ÊïTK¸¬M0 XÁ#ÏÏßN1l%ž;I’G˜’:æ’K{û S‡} ösårMi-ø3ld »þâóaž†Cäóì— l‚o>y Uû½x9Æi‡(„7nˆ–¯Eßv¾ß®Î’S¤’‘vHU]”¦9£¥X.…ˆœ#ìø¤W9S5T©¯à0â™êz$›püöAþª´çܳ7’Ûêªsê/Ï#=+ßɽ<ÂT™£]]áÜð4Ä(e\#£”ß°\ò—ª§ª0n6)xº¯¨R˜\/ìp 9,Uuõ+®4Ë‹!)äÒÆglvX¯ÊŒÅ{ꦟ[â÷èÃ0Ζ‡Í,w¹rzz/ ÝÜ–wKœ9A4¦¯fÃ9ö\ü€»wB‡Ü@Y½Hý¡£ü¦`ÅÔ³KÖämuÕ~ו|’ Ô§[ ?=';³î®ò¹°p¼8åUIÐ8‰ÕɦÅ-öصxåqiÃå$Äkn9+GÈ7"I­µ°Uè?¾p¦X §\6(Þ^Ÿv¦}ésø’b®­µ¶ï~—0ŽI‚}•DÓºa·Ÿðn&—òÝùÝ‹Ë؃£b z0 b«™¼rQÞ;„‡À/Ū‰95Þ,bù»LLSši^JTÓ &Ñ%º^¤\opj ©O[% =ßB½ó³­ßÙ»=t%:¦'#r-úI,V«Ë¤´õýµãäZŠÕÄ73z‚X­ÀYéC„þBgƒßà²Ë-†Õ°¹b”Âí™Àb•)1k<•g00ër.¶cظö|˜)}È’ºŠlg[FИU C·ÍÒ-jô5®ÁN.2šFç”–›6ÉWü¨¶{Ä}âÌz…mÅÛç÷h0K NÀ(5y¤'À4$òx¢¢°L5ñÛw=F4”êÙå×o"9±½K‡¼ÆzÎgæL‰„¥¹—o5¶7a@î§(žÄŸS¡"=¨ÿ Û†K #V÷›Œª<õ¾åB8øL“|^P0)æ}ó'᩺#â©&·2b±9´ïްJJYt‡ÌgQJóÓ3-sV=ù¶Í-…[à†Ý“fqìÀóÞER÷Z ðà/'(Ñr&p²]ϽWWÖ v`2ò[o^#ûÑï²Ê]jd$úiFºL¤6o»;ô–±)­0(o…Íeö9ÞÅx– ØD[NÝÃ#—» ËÓ%$cÃÐäpнÅ`ìm™ã‰cê¹îJ¹zÁ¨w7¼T.Ó.Ž£%,Cއ5úÒ’s°2´¸}Ÿ ž”-a_üss´¬L:¯z½c’65Y{<ÑÁ–!A‡¯Èy÷Pã\âæµNP\ˆH[¾€ïÙ÷^Z+NÊÉdZøšç„§E_Š)‰xh1|àG<ì:¾g» ÓS©Ñô!"[‡Ø@^2ÂwRÀîD-ÒÂÄ.«K‡jÀ[®Õ^ÔÕ´=4TÀÈ1eµFÁTV˜©çRËÐÆºË'¬…éœYÏÜtÝcðÅüÕüѪÕåѾÀgO†žê ±']ÙU’ú4Íø+ë”ôù"¬%üù«ºcFÅÚ6‘V×àhºG$<ŽÝ/ ªy>Iø³Þ~³v¿Ì¡+~ùÁÝLîf%Ù¥8~‡pœÐãb=ì íŠl¹uˆ}[ï~\•× Â¥ -tZR òå?ô¢Etótð u€îUŽ.•üÎ+]~oy·[t–±c±À3ÉÓ"wIú>ÅZ9¡`§ÕQ6ÔðÙኯ¥`85r;“éҥÖ3®#·ç¿??±!Û€6ô^UuðµöºF£ëÇÊÈ8B‹.éoå™4õ.3<- ©à¨®gzj½óô¦½° ¡Ø~¤mõ~莴‰ƒ€ïCnO˜.z@yE,`V[«xê­å“›zä{·Žoê±9ÛöÖ¤!È’5ÃNrÞ2RtNRîóõ¨UvTÓ*O¸b‰…¬4óòHϹAb‡â©pÉ%£GrEá@³‘q5â©ï}×âÚ^·jôzéÞüùÎzí—œ>s1ðyÐ:Ì3­Nüj†JJÎiäɇÓÞnkdù¶¯XI”â~ý–1¦ÚÝÔkÌ, Î0ÁWg†ó°‡Ö÷JGÁV^St&0¡&°4ÏVÉ€jÐUG¯®dzA…WÅlLŽ0$(° Ú\Ð2ÒvypëYÜb@2nƒX=Å;¯–^í ®þ…{_&º\ñZ?”ðÂ×ݽ;­>€Ê&†FE`C½Ô cúJ£æ1#õè;ó_®!´9û™RÉœPˆ”1˜ã¸jU¸ƒÌkU¿0D½×]ÿc qNŽ[çµ€!(ûËtP´t ø=Bláí)"hY´k²ž^ FÞë]ŠF¨–»BklÎjy–,ºB“&IŽJ-¼4Q,Ç –à#õ\À#ƒÈƒž}¡”œNWu;w§†¡º°@Y…Æ'°vµÃñe(û +Y@VN•aY“:ôè9¾QKè¸.QÒ#ªÛ þ~—»iGáêïPõ \GúB zz¾ bCC€aV¤ãrÍmÌbÐÎÒyÊr…#ŠèÆr¹X2+¹ŒeÒKAÜ-¹]ƪ‹V©ú2]̇ŒSá7wƒƒÓZÉT9®´b-½oa5`JÄëé±@¿†“º9;Æ‹‚Ç8;®lŽ'øD­*S½¯Óî|ÐÝì1)é±°"UAUyîZZ?é qŰ@Ž^²´Å¶ кzǾ%S ÈgÎr¦šç£ºuáînKÅkû” r¶7Ц!oÕ88Ý­) uÿIg±YžJû'p½—%óÛ‡h‰-Ñ$fyæÓîÌÀÈç^¢„BÁëk†¶w¤r'¼SÈߢ»ÎÛ¦I!oH/¼4 €ý ˆa³ª)*]äBvÅc-ãÕõ2ç®x;šµšÀ…;½Á>Gæõ†ÂèØR½˜Í|}ÝæÜŸ€6…ù8“ïº`VÞ/‰uNƒ|9ôCˆ¥÷Œs©T@&»‘ŒbwFç—‹ûljsDÂ7'†îœ„—·ÓVQ“íä8¯0×u%™=ã9šÓ1j±l:£"ÃS(yÙ¶xVkêPÓL2H£ÈWQC©|iȼh¨¹*ï¸sÃÖüMÖ•ÂP2>Õcôµs„¤iJ4>shïHuU}p•¡êñºœ,1D˜eWD–ŒæÐ?©»û ´w¦.÷`RH¯jÄùû?Uü¥Æ‹Z_ìè9Ba:mÊ*Ä‹ýðµÀ*ƹr¯_±²‹ïjßP ½»åìÑuœ>KÈ“^þè+Õq™­PVIÚVßt tßwriJ²ñ‘úOiJŒr²º-!0çÞ³,åwã|×Ì”|8h¾¾yæ<еsR{ç‹YÉЯ›{4bW:v{“M*—¶íÜ6I-ªÛ1ƒñ¼FZP6qË—Ž-߯2‘ްÍ=òÅO)pa¦7)Säî™'5„| =&[8’õæ""ZÇÝw¦ô,áHO(ôI†)¿½AËìÒ݃´â˜‚ÎÜæ4™mž~JK½R*hRYJ#ºq ɨžÛåâý ‰ïB@h˜¾é%T-ëɵ‹vªwô­pWð«©ETŒ>lV+œ„Æ/Þ¤ê[”y©¦SÆSPçë»Ö¤ûuTMP•*B>€Jl€u&3²ÔS"Þ$ Ø&x«õ¨"déÆþí¨¦B5_ÅâÊÿîýì[ö¾ÿÿqÖÿÀöçÿÙãÔ³þgýÇw’½þÿÖÿì¯ÿø.²×ÿ?ÐúŸýõßEöúÿZÿ³¿þã»È^ÿÿ@ëö×|ÙëÿhýÏþúï"ÿêÿ? U¹{¸aŽ¿òªþí:þfþ§LRï qQa1QI°pDlþ×÷9NUƺj¸¶D÷ŒŠ–æ ÈQ!!CÑBBªª» b‚Â0ˆÒÉÝgC: ©!ðܯ—ž¨ çˆñ@Bð´0Œë[O|¤j'Œ“‡€ ž=º»'Ï7Ûiu²(¤›;ÆCÞÖÝY@JJ\Z¶ÐØÖã°K&ùWHÚn³ÄcÒ ø9нI¬Nø »åñ8'û½H¶oT2”»;ž½ê t¡ænƒÁx…xøàãLï‡Ï°CÛ9¯oÜ1<äõWªš¥DuWÝ7d><—ÚÖógœë í·‘ ¾Ùc’#ÒÖéDMø¸Ë^ÓEZïAô…üui[À7”Ï7;q­vuÀNúGŠNNÎx&!ú÷Šð¡ªÿ‘Žß·òx—ü»ÅEý{v£o¹ÿ#5ÖΖH‡ßÛñïèp®ÿÏô0ø€5è_㾋å~óèÈÀU’°ßXƒvÆßþÔˆÝä?«|àù­j4Æ4f'”dgzöN“úóæ)”•û9 ý¿ò¥¯IþÍp?å°Ëxü ˜xT:"]€ôçUŸ2|ãBâ±ßŒ CkÿMY<“8ð;à¦ô7¥lv¯)Ä݉¿ÅãW+àG€É€ƒÄ¤DøEEù%`ü¿õGúÑBh)Ô_¶£¿ªGD\”_\Š_LTŒ_Jü/ëÝA±ýA ùKõ’ü0ai~1˜?0˜úMÀ3æW ø¿tÿ‚ßýK\ÌÿlèÅþøgái”/xØ‘=d]-`ø1Äx\Ä8@xvºý®U€Ã<œe€t¯d¥¤ànÎÔ#è :þ.ÇN··ö…ü†ÚûÆŠ—x¯u‚°¿)¦ <Úö–ÁSaSf'Bœ‹›3p?qÄœÑÀÓ|7ð-pàׯÙO‰Fz@l= ^¶xr1p.Vø!@Nˆ¡¦\çŒDa 1TÖÓSFËîÄ£sR1ž˜]=ø˜c¶ø@uH7`œéáƒRk«é€ù•U4µ4 ŒñèiuM„š¾>D]G¢ ÑUÖ3Ðø¡Æ Æq‚E’Ï|%ZÐ,$ÎSÅB<»‹+ò&[á1.N£¤üý®ý…“Ҥv< ²,èç|zRˆž;Zt…õ4”iË´òþúì–`³—Xî‚¢E3E•†•½YÎA¨”Ì”p˜Q<1w–­mÃ<í/²>ê5§q·ŒÙg•=3ÁÔ"ómÄCñRwüàK±‰æ‘b æ¶„™­_aǦ’.º™LÞ´¢D½Yã:†+¨æõ:5õ¿8‹dë%<éÞhÊk‡º©™X‹¾ø™(™Ux#Bé.ç¸s‰®QŠÃætSlo’ }•F²n]ì¦=ËÃÕ ÒP†cÊ)qod}<ˆ¥“A§(ØÉ%N©òk\‰:@¼šý’551üRDJ|Üìõø‰‘žLí‹¥^ÛId¶Æ2-×=ú¥[ƒKƒšÌŸó_7‰{¥Iîæ5lšÚ bùöÿCÓ[΢«[‡sÝÊ-ÌíŠ"˜ôÅ3ùe¥íc•ío¢·­­2«eã‹Òƒ4ikJššl5—;Ëáú î—f2„À“¥òâK3Kn)ÓϚѭDÕhŸê»äË ÇÆÞ9%o¢¨´×Kks×K ÂMÕr>9I=¼Mì­ú¶»`uCþ¹Fçý,"=$Œã^Æ|=NîOÍbÇ¥ý‘“iÊDï\‹óëxÎfëÿ;s±ðµÃ,j\‘‡‚/ªp¬ÞHEnFõ ®T¾ôn“ƒÖ=ñFøã;ƒOê±íºG¦[ËãÆùI8¥P-µñûóÆ6š3b%ì+çáóaŸàÅ‚Pæ)QÿcǤöôõš $üˆ¸ËÃÖ9é]}‚ô,v7<?mé=«>¦ºÊ<åµÄo¹”SÀévÀv¹&ž.ôò<ãEÚ“gйCŶL#Orínjd³ÒsO÷/“kdâšÄùº—ÜÅí6l#Í“c²8zrt»Úßä|ÊüR,!¶õDýZÒå|uÇ(ëoíŸÓÙ®»FRˆú ג/sçŸÎÀ+]È„wݰ7ÈÁMØu?Ënx“sU3_íòI–ånp¬×q…[M¬ÈÑG/•s[b¥´hšóœ,ˆ«×äú´QžZìÑÄÇ­Ë ™=ÏíÍ!¶††˜Õ¤B¤mLAH½˜tøsT-â¤æÎÇÖØZ=T-$¯Ãm ½3f’#\O=ó£Ûê[yÈ™æ¨RŸ‡f¢Œ®î¤1„N³ÎVtBØ苪¼ÛŽÒt±¸Øà忉ñαlçÆŠŠA.Ãt£¼.É÷)“Iüä–/á®NˆøR;_󸱔ãäv£I'ÆUáE÷n=Òã…Hzà§9Æ}#ä„]IûÉœZä ŒçãÔ Æ('NnF=˜W9]„·(:lÁ ¢׈šê[ÍÊ=ˆ“Pb9%ÞG‘$ý°eîŽ5'j3µäd|?€¾(rÅJ(u>Nópö›;·OñgÆÂKß‘'UÔ«ðÅd*‹®jèq&xŸ»LÛÆ@ù€+v¬6ÖÎ3ÓKñ äŸ4.9ÚÓ×h){-[S¶Ñ0F’<†]¾2„+¦ŸÓ‘¢»œçµÆjäÒñS±Jwjxq?ec”ÖI#´àÆi#@·uÓnGҼЙ)Ûš«íYaèÖ MnoÜùŒU¾ñi—ôå½5Y5ýQâ šÛüŒ]±ó~t¥ÚVË™·ßZf>;þñ¤µ&ÅJ€i?÷=•ë¼n®çI$ÚNf µFtç·´´Úæ¾6Ì3^l<$'žoqyë¿ÒTìyfM Ì&Kn±³š†+q•ß25®ÔÜWOW L—÷ÁÜ9ý’âµ=Åk£›º)•ò4D8%Ü-•#2¹2öeæw$I¸Zr]×·W@¹Zê4’Ã-]“:oj\©Ž 9\à:§i ÈBB? šÎR–#2ûiðcæ% Љ×l™÷la³©¼šsTÒGôÈÓƒLýîQ»\¬øàt“V/¯Y:0¥‚E¨)QÎú±zò„ÓËÓà¨å`ÌùðûÈ{wûÌ6š¦…eŽúºiFcÉÛ[õc¬®š»hƒÓžÂneÕæ‹ºÜG­J]E†ºý¸:çØ^éÏ ¼ŸÕ\Ã}KËã…Jóƹ:Ï B?à{}=ƒä%³]µ_Eriƒn]ç ù˜#O5M¨ÏQ/“/L|=`{Å_iêcð¹t¯æ>Ý{ä¨àõø2ÉàõcÌQšÂÆ'Gƒ++r\ND6F ,ú}>œÚþTÕA3ñbE†Ó¹ #vbè˜âWÔâ8 Q\HšÆîVë®wL@‚MÎ6uÁ䀮‰ý\ꓬ@±`j1Ñî'Ë&Ù­¡«Q«)*SÂÙÖîWrá²`{6ëm”IWµf¨Ê¹eFõÒ,ò¤‘~IŸƒ:Ü:ï¼ó–»Î½ØY¹d®Å×Àh¡¯Ù§û—ÈIíâ¯x"A,â÷?Eª_uó}Ut„©;Ç1³–üü{4–2¼%dü§â·\áÕÔ¯ÒDrZ”#ûÔ*Ã"Ÿ?L3ZSkAç¶§YÄX¯¿¾Èƒ84C»™è™ÄЩôæùecÝ{ey¡.‘}Ñ#åSAöU7“òÈáÊ‘aœŽc¥<Ê)ù§gx±R¼9§a\Y§qñed=ÇÍ®@Vi€l2K¥Þ,Ž7wå\Õ)Ì=M{êL1$Õîp  qúÕÖ G3 ÛâVøáÅRD¨ø;5n\^Ô¤ Å1„ÝU‘™8ÖÀâ0RŸ)=xH‡œ/þÚQ4ÍCíœg› ±R¡UÑa¦d8U[ˆˆìªg²c3ü̈%å ÜäÍ1c|Z<ãJ^W !c8gˆûU&ÜVIœD=.>&¾¥§ölð ·öãvß9Ý !yëîÓ*\Î[’™¹_Oòr“ϾÊkžkoΧó¿"K9,¢®S§ˆP>)ËNf{úػΨ¦¶m (hŽ(z‰„ЩI  1( ½x€Šé"]@0‚’Ò”¦"„PDz04iPlô" .œã}cœwË»ãÝñ|g¼ç÷cïµÖ^eŽ5÷Üí›{Í3æQXš–ÎŽýÜóæE¡(l¹õRmø~šyy‰B\«à%Lõ6WÎè²\PŠ´Þ@ßY…÷~±ȸÇ},™Ë̈·gv$§!g½øs|CêMY: ™+­±ÆÌ)ÙPÔ¶žr¬î×úˆœ‘N„+“ó3H‹Ð! ±oûï~Éy•¦ ’Iæ‚ß¡vØäLªˆ–Å )óWq'Àk2Žg թЄ6ª6[Ò²r09½†p’¢»÷´ø=¬ÿoøãûߟÈÿó§ÿ×Áõÿ'òÿüéÿõCðý;üü?á?ý¿~ þ³þÿÑ”ZÎŽÎÞ¶øÿø¯ò0ee%(ö{ü§Ÿßÿ””””*ö0¨ÎnÏïÚSTTQEØ*8(Ù«þoË÷ÿ³ø·íÿ_ ÿ+ûÿ¾þÏwûÿ-þ›âOûÿ1ø{ü\ ‡ýÃ3á{G„ \ †*@e”áð¿¶´—ÇÂÛò?¢F” ý¨(WPùÉþðïÚÿ¿Bþsû‡BŠ cÿПþ??‡ÿe`Ø×õÿ'±é?°»“ýÎÿ)++óó»766þÎþ“(r(?†?R€`†¿FìðF•´N˜ãB–XÖ8Æ•„ôðS™³0„;¬³n9—oXµhsy(Irˆ‡c&yºª&ÚI§‘/ ‡€b7ƒ#-o±H :M"2€0pˆ‹/eçñôôt]ñí6O|Iíî7%žÈ/oÜ- ³_£%§«Ñ)#Тׯ臬מ±±±pbs.ãˆ]ÕQGø“¿Òsª•{Âk†ôH/’c{’T 1DÄ’«::à py’ à§§!á÷§Þ™ ×7V„Ê l›ncªÅ¹ëßþl>  <²Üêò ¨V÷õü_™0õºGüPé9^Z»3ãóWdIûpœ6(eM£éØèÞrÚiTN¿ÎøîQ‡J# øÃLðYì0 Ù19—ä5Œ°z-øy¶æ×}å|¤è×}Ý¡&M^ÑNÐÆÊ‰F1Ò,á°d»ãH€`õÍ$ðáu»-Û‹µÖšle}¡ð§²–ªk9¶¾N>åݶ”Z#«¾éõXV œ„ðÖ† EÙ#Ê‚í8<§Ò|ks—hNˆú£˜²Ò¼ÖDT¢ìá$‚z ÿy@poV£x}D…SRI‡j¸q-msQ–¿T|3ª({ÚIÏ 0ëUÙn²s׎»±d ¾PA ‚Vs¶Ô„–'Þʪ–0kª½7ÕlÓpÒ^+«ãªÐ‘…ÎÅdâ81èÆùe‘} ôx£²zHÕ¾«d‘Å–þKù\gI³¢COøÅ’=·ÓVüdŸ>B¿¬öˆ£ŠÊAp¥kä–Ï^Ùgb™'|6鳯Waí{Ûà%@J}Ž\}péó@´Œ±@Ž4°ÀÁAp+3¤êùk³lš÷Œ·i9ÅD-ó¯*-GËÇn §5Èx•Y=JR!ä«áÑ V91µ[@ÒðïýzÞ¡ª‘祦¹°¾íSâ/ÅÔi¢±9ña6ú…ƒXyäBج¾¼‡Ó I‰ÇmIÛR¶– /A—¶"©Ûí3cØ""ÈÀ„®0ékj µ&%œ?èÑFO>¿r_4Î9¾ÄB‘aÞ@ ‹ª­)ËÆÐ²MÔ×,g N—Q‚œ­ÕJi’Lß•Øm/ÿ®6MÏ[dþø¼ªç'ŸM"8[Ôt–fC«&æê„×§xߥm§š*‰œ­ÕmtÑm›¼ÕV§Öhð$x0Ä‚“ã?eë°#Â4·ÊîÕ¢-c¯m3߯K¥õ_Ÿ¬ú«þµª‹dcLåÁklÛq8_ kß²—Œæ¢¿+ÜŸ²Öúå(VGfÊËSãÃ’“⎚¨†¹È‘Xx²_€ø\Þ±GI ±«£§±>ŽDÃ<é#Ã| F=Ï­áE.{3tñô“Ê•2Șùîæ¢G[ÒËÅpžziÝ ¢Â¦Ìú!^Þäq‰/?Ôû¬˜£JÙ‚ÅÅ Ó(âé~RiÍ/l G™‚œ8RΟÀ&ÍšIoY{²Ç¬Q¥;Ýõ*×ò&?´Ø\o^=óxl|rHÕµÔÚt׋»ÂaÈž>¦ ö³zT§z¢|}zÔ-çM&`2¶S¶^œp \­ëL<\⥄"hg¬ .3E-¾Ý·¸¢½/OtNÆÓºÆšUãĶ‚FžV™%ûˆ*™…ã—K^ÑPòâ.ôI‡ì¤ˆ`íW,) ·y>Ýuìµ³D:Náƒæ§P L»`$Îx|§xª9kJ¿îú+GIég‰ Œ’‘¹ü””ËxŸ+ ·Ê²ž’“B¿–yæááj»{ f¬Ÿt.u#g+ZõÔ&™KõÕ´lI3÷ø‘Œ“uŒîL†sŽÚ駪îŒEv•GY{ØPß§hõ”Ô[q\¶‚¦‡³Ò ’¥Ç~qÕ_•¹|ΉB´X|ó†­eµ—¶t–Ô¾kðj$ƒòئžqF§»±ŸÏäŒä_þƘAqØôeÜŠKïÖ)o¼¿e0¹Ÿ­£Õ+lFs´¸F3Ðmu†zFRÁø–F‹—#¶p–ÈR6†Eº€ÎO+e/¡µr¹òÅéI5­v“×Õ“;ƒî•‰–•ÃÉ s6Ï |7±­z2HÊH`t(`J\ÂI“S×½ÚE«ðOªÒZ òzÒ!‚ëm¡?1Ì&øcë}ÖE·´7f½Å1V<¯iŽ*dC“àRU¼÷ÁÍô6-/_©•Ag;'*Ê”ê/;4“{¹Çîʽ‰|Éxy]]´õîM…ídªðWtÙ,%cÒ·ÿ¼Äuª8GölE¾‰ØëÝ»ReœìçâèÄ+ЂVÅeYô«9 6C÷êð„ã‡=猕.KKyÍLÕ•T§˜ŽŠ•zÇè`=FåÎé[ÎjðM«ùXÆÍ…¦Up¥Í+^2„ÐDý4\0Ú™Ø4÷íÍÝ¢ŸJðÍú{…[~jÄxjuÃ8ÕXW‚Å$²T­>én ±}Ï¿01fή:Õ’•'—ÌLj{VÆfþâyS+:ÅÄù8ôWv§2e\jí c½LD޳«Õüm©ò„j¯]]›,éÚ 9›DÆ\nSöç\áeo‡\’)\•ź즙¨•­Ðåf¹>fÊl¨éiLlñƒ±!µ€ÂŸ?Ùçà’kÜx´ì¬dÆÞ µNŒùPøzZ*ÍÔtn…¹ñtc–q¶Vd¥ým¥WÈŠÑÝLûŽnÎ*È!àHèÜpU-~>Ç(æ:± çªª4ŒJY5ö¦„Údíøœ.."ið¸K?38âÌÓ´“åö¦üjig…³*_»èMaÈ´4Ûuê}ž1éÑí;º7Š­C‚ݳˆôÑÝÛ—X°¶ïÎo™*J~FáO;2gP«|m€ ÔÍR#ˆ¦ èZŸÒ¢¢BR`?ÚoùVœ8³µEÖSUÍò‰C¯»@ÚhÂA:“¿6!Õý\Ô‹gÍî f/‚+Wô÷Žì;:Æ—mÍ0»q¹y‡WNP|Uw¯ã©gÊÏ;ÖN04àY%‡*#Äf‡ \ìçå$Éx6A¾¼ß/'’Ù/¶[¹|÷8ö]ÀJ³ä(Ùµ|7å³,MâbBR"–9² ­, ßM£XbevUXKG‹š(´Xð°+C5üëBù×S;çœP¦èa!‘-ö„Q0ç5Ý_vææ¿™€¾Löù‘&Ž;Í›FÁéä2ÿæÀ«'3ñOFØF&$qÞ.q?ò+g“Љô¹Ï#|ÁFŸK§Ý4”v•?ß{3†'NAðFÏiÆðÞ‘é­—ÎÚ´X»­VT&<«†VB§F÷yè¸4µ©§!Õž¶bÛ謳ÈvT¦Ø(\kjÏQ‹§8MqšQÀ V¥‰Ÿ¤‰k\!pØeTÉ»ºD±é3rÏóAR—F7óWß,ÝMÚàäÒ¯+3P¾KÚ>ÿ¶¹ ‡*:ß@ÇQo/¢ô-ñ)Åöœ½ ª_ˆ®}zµ¬ï;ûáw¶J™¼„Tü¨ìKßÚø-K½!/²O‚ì˜N^¿Û†W{¡$Qy°¾î3õVæ&üÌó+àÔ3K…ŠõÌâ§ÎŒä›ö§;?èO¼r?;ñÒ©$žèypá lˆøu¾õó>àaÇv€”„ƒ\³x¨ÚpÚœ5¿¶РDÉ\µm-˜aèPùžØxáH¦ðU`MàZœÏ…~¶¾ž¦£3׃ª ”}Øüà³Ý¦Qr}Œ¶žž||MSû(³a{”)ͨ(l#;£ñæÔ Y2óÍ©ä¬Û³4‹ø nÂZqAæ»^Î!L¢Ï鮌X½x>Ëé!Ii‹:W5Ïþýèï©8v¯­ ŸOBßÌXœKˆÇêèÍh—䚟ÿJÊß6c6Å#Goi˜Ôs[²ï>»7?å Ág%UöÇ„7¥¨œã¬mš›â¶*'½qu2<}—oÈ-µno/¶Þ0’Õ[^Î{Köf“°vVÒ`â/…ƒaèåV ‚ún¿ùw¬dG»ã®6ÿ…½+‡rûÿZ•ÛJ%c_Ç,Æš²¯)KQY©1ÃÌ „ •”-KD‹¸í E…´ÊÚ") %I¢E¥…ø™¡¯4ó<ÏY?ïÏù,ç6˜PÝuO¾]Ý­Þmö],¾ çv,›6çVu‹Hb¹ËÊfµ¬ÔòO>ãIþ[—ôžx×4©ª‹œ‡ èÁmÚÏNfS6ÿâ2í˜NùÕe;ö£Í1Ém6_¶B;Fæ.MVéèî(á’å!n+´µ MF-nSâ¹3’²AŒ·eCRSÚ«2,íw¥•†ªŸÊ/U,\7«âR+ßî7~å)”ôŒÞé}^P ®cœqX¹HxYBø5dï¹ÜØ*Nl„¾^,¬üÔsyï5‡×/ÌU&œUJO×.n!‹ÏÇ;°æ8flé+Ê4ŠMØ}(Åì\£•¿íšÂšP„¼nãä»;K¬Y¹Pïm³O{Nön ÷œ+³W³ÏfÀÚE„2%Q?ÛçmÓµ5s×7ë¶^–,85å£Â“ů¬zWïù°½¡Žñž›*G½ÎÜB^Î&o¾ñxÁL«•«¼?÷¾›Yú›É˜ÎŒ¼ËÎZâÆ×ËÏxÒ,çötÀœß°CVÙ&Æj7öêkÔµíøÞÓMQñÌÝ+j™—MÙ™NJHÊ‘·ÒÂSËž_]]2ÿVÃ’¨øîÉÇw]ÞFyyp<…¥ÌÝÞ5®ùé¸Ö7©²6õ‰§<§i"íªW3÷¼ K¢D7dÝŽ‹ìxR!êS™‚ÓÈ<°# u8mæ ýE=íåÔKw³ú%çŠxßh½™}Å+*äXy›—ë—Y&û'÷Rîpø«åz*ÉùYŠ™°—–¬¸Æ‹§ÂýÒ´×Ê-}Š1ûTŒó}Ïÿ–íwâFB2;fóQc)ÂzÒÄmŠ÷,WÈ-œ¢´Kß,¿‹IçèfÛ«3‰AÄ’IGTÚñRij›Žˆ.[¿Bj»Hñ;„òÄ^2wŸ“Þ¼þȦOx‡–˜hì¸îȸ´Û6áý"ûÆ=í,GLÔŠ,HÒm©:EL½Ýgx®Çv¾v¿íf#ë èOVI)wÉ“÷·U\ÙmZQ³"7'A5ØêyÒ’¦¥ëÉ ÒhOVÍŹÛÈ‚Ðíã®Õ²f¥Ù –·ðilµ‹¶"÷ ˆ=ã&”bõï^ÿŽ»£9†Q’¼6¨]R¾,E­¹ê4ŽHVuÞai„ܹcõÇÆî¹óÎYG Äg¹—ß¶MÁ䔵‹;ÞÖÍ3ÄËÄPC´g@üjòfWæCïmbs—Ë€ „Ö”„“«¦MšÀ~ĺlJÚíjŽ»Ì÷ö×6ž)ž¶ÙåAÊõ êϰ ÎîVGz¼œwÊqU{p”ð^c¡-yR€w—/_c®~?áùlŸ%Û+0¾6z Ak‡LMz·«1ïùìµV‹¦ËK]]oH–'¤ÊOæ·°Ï>”ÚÒ,šˆ¶4¹;/2cEÏ7uÕÕuËã\íÆ1ÌO5üŸvFŸzþ좒U„ZÜúí¯ uæ_i[Ò©bœ›VvÅÇeÍö÷ûÝXm=àÆî2–[qù:ižyÿŸ•„’é}.ND¿¿Mm L¬˜½åü¶-eÜ÷,ßázǦØhýUßX…¡?«}*!"BÛãƒúE§ÌlŠK©”tyÛ]iºÅÈÓ‚üBê;m ’;s’£ß&˜ä~ Hä8Û%tÆN£W›~ªqÈ;Á´<&L!!Bå€÷ΊÿÔäP_­<79SvŒÄ;—4Ki«ìÁ^ŠlA°ò®”;2@l¡£F¸ß:ç#’,¶­ö8âU<£™`*²Ú#·:`f«‡W[†¼ø¤þTKD¸W0sõëFªxÀúgÂ+ÉrGÐ>¡Êäâ‡E]~…1ž.mx¦Ð4¡¥ÁqÚ”¥ʈQiïç6¨¦ eË—æ»ÝKšƒßâ¬[0¦è]hU<ôÂ}å8ò*UÜ*k íÜÒh¼H£†æ™LWü«©Aª{CÑÅïrâ{íýIËΜïÙt_³ì^™iaÊmÇš€âÍNóágcœlü†DWf¿L÷,Œ™$áUüЧ2’*¾5»pÖ{d‚Y¾ Èp1Áª0fÚ;q7ïé1~P–2´4{j޲l©ì“ᕊGåâ„•½ÿª—ð kMVäYë´˜¬Å,|×¥;ÿiüû55ÛµÇpcàP Ñô  ÏÚ¤Û6ÆYd»æ92}ƒ´IzZs“êÛU}s( KœbRÔD¥Sœ-¤(;_¼‘_Óq)xŒ‰…¬]Pä|$픓Jmz’t¾ æI|™—múäy(ÅÚŒ!Æeñ´(7?ú K ÅhW¥ÖNãéÔGã^š\Ý+´†,êr(í·r»ñDw̾[_ù8µîl·'k*A°ÛyÙ¸vÊ’]“Ò^ô$¯!Ÿ;sãñi›0+Ë›¶oñûÉvî ãÒJKjmS5ƒ .´™1VÚ4¾ÖTz¥Ãñàl™%xú ̨ôì´zB)Ü€{(yÒ³ÖDC\h›îY;Ü~"nVMaQ·sܬn›†¾À•¯.œ'¾q[¡°ÕäâyÛülÛkÝMÖ Ñ¡iD«ÉŸ4SœbMÛ:¤D’×Ö8uW«±ý¦<äN5å‡Ew¯š;yH—65û`}d¤ nÇÌéwQfœ¾p|lö¢:ybšn ÓÙs½ÉÝfü-»§êg?g-çú©IÛË_êÇÿQxÀ°ýÔÕ‰å ‘øíõõ¦³*fc.2"W¿óš²YnAä!Å3JÞh[‹…–ë÷Ù?¸g„léyð‡éõ¹­ë5!Ç&{í:SfÕ[«ó²†b®åæ³­ß§ÔW¾i‚ÜsŸ—†Æ>ò‘Þ-‡=@=«2“Á8}åEDâTg¤é¼iBâmhÜâ=OJ4õâßÊ¢æ–KØ¥X­FGܯ# wUÍ ±êg?ÕZžê~>¤RÏ¢3ýjÓÌî<)vƒ¢ïÇž–qlÊÃ×è7lqR™Š^hú~í Rp®\²ˆ%£ m›blá5°ËÝ>Ñz±;ÌlõV·<¿méNÖˆÊóWâ2Ï©¯Ýj±/u_zà ñõG­räD¥o~Þf³Çxg,uâ+±tu­ÃN‹³ú“íc“:'9íTÀZ¬qPŽj¶zá|׊ïxËeµ7·§l<:q§Íj÷‰ >ÌÚ±åy•Â:¯ G+€F°Êz ³e›„ï´û _{vœlŒŒÕ ]¶¤êý¨²w0K!yUü‡Ã@’àø®#rìûâ¯ÞÙ© o81þÙëŠcþx…‰ý¾‡·/(®®ß–ínà`vííËýùô÷Ï¿íWŠk˜ñÔã¸Lë͉²½{•ûɳ·/¤mýýäôí§‚¦^ß059´ ¿"­z‡µXDè…tùµ;Ÿ¶:½«µnJͳ¾hí>³j-y[l˜dŕ󮦿òû/ˆ7Y<»ÒXƒ!µ;$*‘<·;ÂÏ0U^-^u~%¥ŸqtG¯ÎîßOÞ ^Ò>u±±†êÈ.Gj¥RÚ{ûW4[öE¬Ôw8‹­¨ñ~û$ÕÝ%„¥%Nw«i'Ö’5Ö¨îN­ NÛ"*ëá/à ž\akl‡ê].¼ß « eóó]fSN‚Ûërä%¿KÜmU!‘^Õ‘sÎ},zg¼ãöõw¢k:å צùޏ™áÙ~T£==Q¡}–¬ÇQ²c0—ê>Ç|ÑHª­^êÂ4ËykÎ k­ö[Gþñ¡|¬ñáÍ ö”/q1UÊI(^`%“hÐrMGY!©Î2NV9#áZÿÜž¿™ûÕ6·ë‡Ì™emE\ðR,4ïÖ`N˜Ìþ$S…Ó§×I#ÍÜïdÒ'ýþb¡"iå]Ÿ¹áêÌýIæ¹sDv)AIò f‘ùãÓ‡”Á÷xyਇKdW!z‡ê ºæ¬_ñvGTBøÀk¥ø¨²ÆK7¤&ç{ ¡véî‹çøÔGlŸ=HŽA Åæ¸·ïEÓ†ûû#qb‡Û>ª;—€k-ÙR›»mŠ×sÄNìˆ,Ú[P: ëêzÜìåÖ–” ÷ÍPDFÆÀ@yiÌô¬EOÆ4 T­¿ØÝvuLøµŸJDÙ hã­9*å.¥Ù57¹XÏð¦·-M4ßãoð|sfØcµæ´¢ôy>êán—B"ŠŸxÜ{š‘{¿'öùªë¿?²]¢óžQç5³1àÒü2ÿ™éýÎk•Û—nöúìûº£èùGÿu¤°©ê˜s6—Bí½z–~lÛ}KfùÇŽu6^×}3mY{ÅäðâNÈ=OÜÚšp²Ç骾MÅE¾ÿT¤ =ʾ–a¹.ˆ¸ãû¬òG^²íçõ³#¦£+šoMÈ( (<áh³xðÍÔ°õ±]¯ùÇZäŠEFNù¸r𪱸iû¡iíñÚãTY™»_÷\Ø$¥i? ò¢¹ÚtNl@+œ^¿³¾îù:†åüj÷Ú¡ï;^=ÕF1Ķg4úˆXhL;˲I½&Ì÷òJA램ÛÙoìúæÓ&Lo&ö…°B "Ÿ/\M/ÐÍ£{6»é «OßR!ŒÒ7ßk©_•¾~ÿTKÕÌÏRc¢âç„û^.޽ߥfZgŸAæç눡íù£¤  •¥‘ÆNäâ«%Qo¯Þ,ÍIbG®ÿØ­}‚¤T&‹—kt/5¦0½Ô í[ñ¯»µéÕËv}V ¢û§úÅVüvf¾ºø\!¡ñŸÙïÜŸ¬Øtw÷ýºÒ©®ø¾Ý²ÍëúBÐ[_VRÛÿ(hµË¬y¸F±D¯´´DìðqW¯2›k»\îÈ>ŠéɹÑRVQâÔxÒp×êg;ô‡^jÄÍWöî8ûQO5i·–˜á»HֶܶŒòô q‡›5Úâú‹tÛKÓŸ•|Ôiñ«^H ô¼ ž¢¦½ú­:VJ4}²ðN—ܱƒ)’Ú 5þÁVâYäis4(³Z¯dºÏ,8’¦Ùu%ý£hKdÅÚó} =»úÌ_Ûqn } À4=ˆ‰6¯}¾h‚EÁ¢CK¬|…b­NH´¥¢\íû°hzS ¡ÖuK÷g¦p*ñ¾µùe ÛbEckÖ*(m£(œW6ÎJ‡êÚ¦ç‘soÛ|šq³f&mÒ–ô³=îcÑÓ†ÄνEï1¹³ý¼Ë‡T.k+‡^H]ç™@žø…5yÔ›}z{¼ŸºâA+u¯…r¯hDì›þTýƒ¨|ÌÉZbMhãÞÂ+Ò“)“H}s¤ÎÛn¶¼¹"Cظ¶UÆm?Þš’…P³Ó€‡^ëÖBhΕ:ëq&¼B÷áäô Žòô•ò€³M=.UɆ µbµÞˆ9$–о®õÜ–YáiPÖãm±'s»d¯ßÌ ·Œù3{ï=£X >·‰š‹î°\ðj]Rɸ“¯·ß§µf~Ê—ŒÖ3m»\2TyéJ$rjó‹Ëz!/ü·Þ¸à2.ñù“)å]13Ôm3&÷jÞœ÷Áy"eWŒ¥tâÐ盡aQG6i>²ß²±¡>¥ßŦûb`äû”ÅmqããoFêˆÍ*ÊsX}ngO"†ö<Þ®µÕ|h†þÅ´}•S–,)‰Û'£½FÚ!/òàPóL{W‰ºÐp7Ú¥B¡Þ®ª#óW¸Ë¥ïüx 3Èêp‰Xt‡œ¡ÔM{\XÖ1§–(ÛšÊ ±Ɖ íW©Ü•±B>Kùý¤PõŒ8ôk1mRC2q¢Vñ–ÔäN%±EøÔä*ýo»¬1³M-¬"W¨Ü…κ'êN.$-¶Hû0ùÄ1§\£ò=ÖŠ¦M臔S ·>ºAÕ•¥I)ÜÜ>/Ú+„erÊ5iñ°¶ÉÑË?å4gqJrÕXKõ'¯™ ò‘~½g\wm­ßjÒO3ÆUæ EkðƒãÞBbýè}•6/‚cÆ;^Þ´Q¿»z¯ß`]_à˜ ’G^½üýÑ6±„àøè< Ê;wÆ•÷×ÁU ¡ææ¤ ;SìïJ lS@œf—ƒVñëMÔwrë½|É4{ÑÓ£ðŒý³•´öeþ•úªv¦kL7…RD‘gM’‹rtfžù쭸ɪҦ—ëŸîel9Ò>YDÅδˈ¦ÔfJT·ôCäKekÎ\9ÝÁ"¨Ärʽ™'aÝN1Ù¬ÙÆi®o˜‘Çd帜[2N7:uÕÑÕ¶Öñ½…dÀÉŠŠ)m·—\½:Цµµpb±ƒÈ³Mwü/F9F¸•’¸ÚÅCMƤyãȤ´úÞ©q=Ñkƒö‚¦[=SÑ,Ü/Åãùê·'¥¢Çè 'Ü#”ÝÄ;·ltUg=õûãr®“IKX®_ÎC²ÜÅ=.Zˆw©À’VÊo©¶ó²ñ࢖³yk?ß›Ê~ÿê¿þEüý?~Øÿ+Øÿ•‡ÇŸöÆ öå!Áñç‡ýŸ±‚ý_yHpüùaÿg¬`ÿW <žðçþþWK€?O>þùaÿo¬àü'|ü{òþÜñàÏ‚~Øÿ+Øÿƒ‡ÿ>Àxü ðç ÁÇ??œÿ‰ìÿÂC‚"à?<þøó„àãŸöÿÿ‚ýxBpüùaÿ¯aüóÿZÿŒž>ZÿŒž Íÿ âžÿÿtþG Ekk¡ÑÜßÿ æÿyBßâÿÝùOæ*ÉÏ"xé^œC¼þ~l€~þJKÇ9ÿ §…ÑÄâ4þhˆ„àü'ŒéR§•ËÌ K§%¶Ð²åƶV&B‰tƘ ‘¦N¦ÜX MäÄÀÓ˜…NÃS‘H3;„¡ˆ[$ ¼Ix¢¡‰…‡¼Y,_u’Ÿ?%`!‚}x‰ÆRw ò%! ÷j!‚EZÇâH>ÁÏ`’X )LººŽŽ–®:Š]&‹Â¢’ B_ÄPú™PB&l‘…8gØÑ$$7»ˆ•B[ y3Hä… $øG¤¯ ò"Ñ4L&b¨ LV•Äô&‘Xˆ9Ü6vP’Û-O:1\ɨ«C$‰g‘ˆgdÊ-Bi`5°º:HC¤@œ!´áG¡Ië†øoîÀšäƒ§Ð8à a¸|U y2}õ—á½@7ð†Ðzè×¹½) 5 ‚wÐpVp˰yô— ÂÓht»_ßdKa²þRd s8? ¿›ÝŸF`‹óû&,!ùx‚Ñ÷—Šñ¢Ò=ñÔïÛñwÊðü)ÁDeóå+0œ" i¶ô£ ÿº\‚Ä!b‹! ï¥7Ò„Ÿ•€`Ë<Çðé{?Èä@dpÒ/cÐ(DbÒ}HЦBd:òƒBó‚XÞ$(p¤™LÒp :™ó€É-܂؈j@à—=²D0Ä)T0:–Ð$ 63D |ÁN$ÊRhª?‘)PYú_™L¢ÂLÔE‰$èáêóð`×äá1Ò&ou&ÝŸA ƒÀNÈNÇIøÅ±+Wð!9•sÚaÅåp"Rð^ ¼§ï?c²Èd@j‰Ä04 ø~0_š©Íy'ò—6ñG'"" O:ƒHb,Dh" `8|ð¾€wD2’ˆ! ÿBA =ÂS¦ÝNñ@Ÿ ‡[+bÒA4¼ÐZ¯lÏ áá‘DþÇ}9¿1½ñl%É>î“­ÏA/ºhœƒVcŸŠÑÆ ·üÇ•€fj¡\Ér…úËZ´Õt@(5”vT@ƒr¤oA2°1@„ƒAv4Âp5A`Þ½Hl£C÷ýFS°ùéA%>¢ö¸l±r3@²‹úÊm:•аrGÆÿ[²tDôOñ4¨óÏÅ äôWÐsKù*SðžüRªþzÑ‘úû"eðMOØ2AúµL¨ûpÍØpálãÊÖÛx*yÂ1O,¼'•4Z\$*ÕO$õÿåšé‹' _³.Ð ðvÜÿ_nv±“Ò8Ý7ð÷¼Ñ†Ëü=©ĵªùˆ™FýÃ"¸v´ÑŠEò±%‘ 4z `h;Å ”Í xyƒ›×lÖŽr€ô¦Ç•K¼&[`ñߨF.~nNõô~nh90€b!€,¨NÉ‘\"Ð3&÷‹2ǸŠpÝn¿ë–¼ žt‹î3ºß™Á¿sɲ{ü³—æ-Ãw8ÀAÁð'=b'àöh>“Åð'€j5 þÿs|Qÿ ß°?õàa<( –?žúŸÁ :úÓFsqý×`4%ýPæ!ô †üɹàpÙw9]WùÏPzΗA'˜L}-‰ÆEâOúGøAÿH0/öG¸=e˜ÿÎËØ5˜ à8ô\ÏÜÙÈÉÄÒt©…‡ÓR3;K#;S[3‡aÏyT:SS3'#+Û¦áÀ×h€Í(Î8ýFœóÃ8FŽ;¨¿†œ,ÀN˜rn€Xˆ&Añe[Žù÷ƒnŒâÍ5^ßX-Èü}€MÆmÁOUúŸ©&˜<¨#ôuô#ÑàŠ7d7žkÓ¿ îľüư£`Ø`lP ˆýe”Ä8ÐÜÛìܲí$Œò'F2Ž*|ärT_´ÇO´þ¿¤'~îÃÙj&[ZÞlX{•F¹µ§ÿñÚÄX¼/í4„ H>† öTøüg\á6@ùoðÆ«` ÕÃÃmX¥À3sUÈ—ï\E2ºqß꘯¢ûETµ¾÷wá¢;zDŒTÆí ¬ªáçÝñ¿V«œJAdÁò¥S@ÀAaþÜf4",à=k8ïHÓ¬,,€Ë ˆ!‚?O¶±R‚¦žÒ“=-Æ~ÄÅé‡1ÈŒÐßa4Âq®éƒ¤{¿;JˆávÑp›@ÅåÎî!cD¥zSÞÐð$fCF°Q’zDýaÏH,í›nª˜=R t #$a—Î.Œ;MåãK%±móW~Ó_ eñ˜ïCƒaÕ¨ñ«ql¡è>q´íãX–7"N€7LÈëË”7™A÷á°Œ Â~z Ûsæ|õ ü©œéö_)¼oÆïÏ+Âüª"‚¯ï/ëϹ3¼œNy3†CvHdHðJØ«À~³eQâøÄúà1ÓÄá†_—?—€?#_„ÆA(¬FW£ ¡5Qš#G_8 Ï a ôÅ¿b¯¤è!‘#+t†’3a=Ü‘ï&–†r¦‹83Ãw#.¼…Hd;£4"ǤpW1 Ü^€[ÜβEfx„³dc(ò_/Y è_$øú/½ÿ/xÿ—'ÇŸÞÿ¼ÿÇ‚ãÏGï Þÿã Áñç£÷?ûð„`øùèýOÁïÿxBpüùè÷¿ÿ'ÇŸüÿÇ‚ãÏþ?V`ÿyHpüùÁÿÆ_°ÿOŽ??øÿ\üµ¿ÿà Á÷ÿæÿ+°ÿ<$8þüàÿcó?<$8þüàÿ ü?^>òÿþOŽ?ÿøÿÿ7ÇŸüÁïÿyBðýøÈÿøòÿþOŽ?ÿøÿÿ7ÇŸüÿÇ‚ãÏGþ¿àýžÐWüÿ7¾›þþ86þhŒÀÿã ÆŸ¨É7çÿáPÿ'ÇŸoÎÿáþOŽ?ßœÿ‡C ü?ž¾9ÿ‡øiISÒÖ©¸G29Ï_2~MÖÔQÃèè@Mœ…•žLU‘Î>DqT>”Z ‹ù0à§5’dõíÆÐ£ré‚Ztt! JGM õ¥uºœe±¯¹¨£÷™°jZXMƒÖTÓÂÁº4º*&‰Æ¤3`MùtA>Œ¦¥=’ òFåcQ|H ðáÍ á‰£²kéΠÐ6NW ƒÑÕVg¾É> J£†ÒÑ‚0X”i#™qH¢.yTæQ[s†ÖÁÜÙ•cFò½Óúa¾¯ÍÕÕVCcp ¹šjÀµ%ghÝï5Î(æ¢ÕpX`.øÄ}é%Úè^Žlîþ¥¡8 /Z:@Ì4Õt´ÛUÿ’þžþ÷¥yýƒ:~­ÿÑÀÛÓþNÿ“ Ðÿ< èevSEæ±GÉT+KS!¡qàûØãÇ;KO6€¹e¶NfƒCCCBB¾eee{÷î]´hQxxxkk«‡‡‡´´4Hž'8¹°Óa9Ø9 -î¸G‚„¬LœÖeôdÚ6éä_{ªúàt`ËšŒnBaàõ…±©{(Н{÷d+60Ê}¶¸Ç•²BÍwHŸÊ‘|²«ðÕ )93ëõBÄÙ“¬ßí¥XìSZv)n¹P¥ñ£¥ÛëKë߉C¨¬‡›·nú !¢±Ué ”õpÓÿö¢kj”o‘¥[¸*ô.b,ý¥Qã|ù—o­_8Nzn÷ñäÒ‚ƒ3º é÷Öµ£'ë«Óo‹Ó–úT¶÷|¿NYfõÎ~²á›¬âŸ Fu¼]ƨ,Z(½g@MéÁàÇWíTBÂ}ùãJö³.Ѧ­V—,:%;¸nðÒô{»Ý~´ÈZY;º`•ȘÕþ½/‡úyÒ±*Ò •¬³%ìZ÷µŽœå\WI±XlY«µ®r‡E"Iî3*:¨œ¥S 9*T*„(Éæ–ÿû½ÈÑñéóù•OŸïß¼Ô¾ßï™yfæyžyž™gfžéíöX7ÖÆ Ä鯦:lãVÉ 9:˜¼m­^}¤çék²Llqá¾O»Í#ÌG÷D$"­^eV7ºeÑC.T¶Hð¹Þ7ŒÈXydɳ¼‚z¼H©¼«ËR õW¿¯· ù¦—P½†KÇ·±t›½S°ßñÏpãì=êz/GK›ß(9z=0`ô\ÐÄ7Ði«óŠÿ=K_lÒË4…ÃFG°ê#« im]GÇt5ŽCA^Þ3±âq‰4xÙÌmnOo–ôò¬&sdŸ¬žz™Q- ]Ôè1Cæ@€¬-uoœ ~£ldñt;åà¶Ž¼Ã3fª}üW!7WÖr’˜·§¿,T3RtZÞeMŸÇO¹Î±ì\ü¦ûÛìÜíDFã’6RiûÊZ }Zƒ÷-’¹˜d°ç’· ®îÂ(~Tæ©}î]÷æuLæi­kÝ… ?Å:1×§ú´„®Qü¤鉿XSYýÜg©æÙ`Eˆ¦_ÁêTF±úž!æ~+ £8¼Óz±~À~% æzAÐUÎx¦GI"O“}Ü|ë•O¦ZôÐÖl »Õd¨Æ¹Ú ³!7²ž¿F–¾¾Wó1ÜmÏ Ø;$øánÚrí`åãkèj{·Üäæ…úåºó[[?dµ×W”?ÇCǶ×yï˜U×î]^§=ŽØ¼xñÜvгˆ¤ÊÒ`H.:èÉV‘ÛìëûxÌ4 z–í/äªmd’£$C\¥®—ìÚ +ZïŒr¦#7ìZé¹ëã€BåÁÍŠþŽeŽÂÅ®¸ÓGjM“-ÊYõeÏœH^»joî‡6“Kº7Ôõwu9ÙrÇÕÛÁØîñÒ^¢]UÊ{óÚüƒ1WîcøSÔbY(cÅ7{DŒf}iåíÛ—/³“ä¼½ÃR¯›»yÄSK9_RH/džÉJ°(c=«çÃîÞ¶ø†ŸnÕ¾O]ÝÚì¯*+Õ—Ú¡¿2{"˜ 9rBw5ži š¬Å¨*ëŠúÍnRsû;]ÂL¡BEÊ„<Ê3pw7Ä%äÆbº sÌ©U¨T˜röšæ€õ½"˜~‡ª‡`w4P§;÷‹¨™ž6Æä¬–à=ÄoÈÛj¿o‰Õ'¿üC~ÌË×ÀœTÖÞe¨ÙãÛ¸&1=ÔtìpÃFá=ÐÀšJFJÄ£ú-î­hŒ ½ë§ü—Åèb—”ê7Œ2§a_ˆ0VPê¾Á]ÑZÕ«›d`gÉ_]ª—ÛêÚ›)V¹ùÒ= ú¶ŠÎ¦µuësøÅ䆜^P”ßK/³ô¯N¿EÝæ¨ ÷Í"³e‹£ƒsϲF+s‹Jt-¿I£f¿ë£ÑÅ+Z vÙu[ƒøY4S>7Ðå?)6˜Põø8«ÃêÑ‹gŠ+¿YÓläs0+~RBïø£„‡Šwv5ø%ò‹­]fËøh+Ć;Öæƒ³ƒ^Vû¥ÌFþ“§Ó´»kŸÆ®«:›)¡ác)ÑÖÅÔ´˜ªÆÕª+5ÝãØ¿-Žï‰ÀPˆ' âè,\àv’z1wbõìX=ù˜nb¹ö8Í_Mé ~Çó¬ËrD}jD`Ðx„ªR¿ Á™Ózÿ ‡¬vÑh¤mðAÃ5p»¸ÔwçÕºX"3˜x{]ѥ˭B4Ow¨Æ;W!ìbS DgõDMJ´7Ö3$¥¦ø\÷Íí•gɼ/+_SÅß~:õçSà]²vÅ³Ïøü…P­äÊŠ‹tKà že^‰oI7ï7ì¬ÄjãUI4Í}·&ñ€áÖ¢$½F4LwerîÛ†%ozÎ9\ľ&P+1ÍÓÇ+á<£›§gQd<+“òt¹ÄAÚ£)ahßÃ4!¹r´´[Lh»åÁkµÞøÃAEÌŒóéîY—ù¥ë9‡Ó.®~uEç™iýöÔliÝࢵ‰¢µÓàç£{°Œ;HÔ —ÀøAÆvÓóžÃ‚mMÚíÛÕØaü××JCè:ãàÇÄ!×:Þq±ZŒy ÝbºnßÅ%äõì«ÏÝ_C×n| b?ÝöØk‚ú \›} 2• ëüÐÏ\Êl- >©ué-P¨·€_õõÙž´`l \ê€Ï øî þ<Ÿn‰bDn‚"mx®œ¹¼*~Q‘¦y㕲þæµ´6hï¦9Ëé· GÂÙ˜Öê;žE܃ÄÒÞ/³ÕIì-oÞ‚5¸~m!á´ÅM}݈¥1´Ù’Þ½¼È¦Ac°MþÓ^¯’ ßk‹1W¡aq‡ð&ŽO¯¦K©ÑËnØà–¤’ÍÙ°²S¯=`ã–EZX=}Zùg¢}¡|tgOdÄr<Ú(¦œâ³eÈ~ô™(õÙYÙøÑ»x6WúŠ¢Õ‡÷ãcr Wø»`N>3’$û¸˜®9¥ìýPLk)Ö=”†Žñ…®¡+´Ùžu­É BÓ“)­›Øv¾F0àFý¶€÷â"WÕ Žp‹h嫲یŸG­K[û–% õtùÃ*AÀ÷Á Š«èéÔE~ÿMcÊ[Ä LMÜj‘<ÖÕ•XÜž†O»X¡z£tùíOs"×C>¼ƒîOÒ¨b€ô`vÞ.Hôc„ûȦX]~صÚx®ŒÛ"ÓºB|Ñb-¥¼pšèJþ]ï]‡âø(*}ö}HH{óbÁ“ŽðëüðlÿG–*Jº*‰‰ÀK›64d‘6ç†4&:îUt,Àc™œiÞV—Øò£T‰w[“Œ¸%´Ã þìµún¦Å#Ü—FR«ƒu¡¦›Ì^Uá/|JfQI,z ?¤*ŸE’ÞªÿbÿÓþ¤˜²ô ¤_ÔÁ'=£<¢Ú‡O™éºÕXú»ö~<âéå–%PV{íXi*’:‚9^¾ýðLJoT]{‡¯‰€mÿÞÍôüèÉËt»(+o‘ì‚{>DeykÕÞ?-#‰¹ ß!/BçýjI׳ Lq€ïÂ3¶­ü÷pÂÇž•ò¼-ì?änÞW¯g~Ɖ;`«¯NzÍ010f1TTêJ ÜšdÎ8„CqŒ¹¼Ì4‡Aø Q¡k0Ï!ª`;6, ½ì@ï%GwAëååTxž"4ÄPÃWÖóÂéTAs…5ÆQå£~í,….´³lòK\¬ L€ÌœÒj[ø=ÜØ ^À! ç›ÜïGÓ†6 ²jú‚íöK CL”eU†Û÷ÖHs,}~""e Ë -Uè删ô;—Ž,§ig XqDƒ65Ƕ²nÝé'ÜWo5ú•rÝÉñ]?¤¢´ý¦ÅÂf#N~ë$GûÛ“mP 0KE±¥œþÖIcrl›ž²öû«Ð¤¬ƒ³mÊž/M¾žè#z÷RáµahôÄ;Ÿ®º"RüÚZcÚÊ!ƒât5_eš½ù—Ô¸û«àHøKܲb“×ò€”œ>ZÓ´¨=E=º¬Ð^nzw$‹vìZ ýPí/^|áÝ>_Ešž[å¸7"‘7wÒÁX¸N•šžpº¦IG›É°«üéc•÷¾ Ò}ðÇ%ŽËÁ”Þ ’-1Cê4.úXI=EEW_úùÁ3d Ä!v [1ìõ‹ôïI”âé:@¦ñƒCÙ¯÷=]vTùêU?!Yõ Kýà†ek–nƒ¯Ͻ©!¤¤h“¹Þ^»©"n)ñä㥾õNÌ;CøV^­d©W¾qálzV|¥>|µ¾Ý.+~rµH„>\C.½÷Ùø‰ô²Ñnú¬ ¶“÷ÔîÊ$[dN'éÁ¢ÛÀayÛÉ¢l—‚‡9¬ˆ…¬=›[ö@7Æ5‡_ëØ°±i×µønÏc{Þ÷Þl†ðò …ŸØŽ7¾wgŽŠ^ðÞÕ`#œo«úÊaƒ\|üˆ‹˜ÜÚûG†oòô¬G”=#÷T1Ä­Ô.ÚM~?øÁz¤‡r ²%ï&B¡)Ϋ¼¾Hó†e YÓâFi¼ùC4GëÏ)î¯y£c„-ã8 C’<+Í¥8q=cnºS›7ÈA³ÿøýCp»­ú'/(òDÈH dÁ+›8¬á÷ž‘C½ >,Ôo‰Q­–õ†3jÆÕž×Sµ‰ÿ©“W™aÿÀ‹ÌÓýQ‰á‚.ß6û“‰0§!5z<½UñvžØò†RÖÆ5‹…hÝ×­_‘X¡u‘‹:¾KqYë‹ +JÊ$_aƒ $c%eŽÓåmë£gù\|Ä ‹Ì‘v¤‘2V=À" ÀºCïpGc]tŒNË©aäëáC£E0×…?ÜÕ(J#k*ó®è‘é€våºt󳺗¼Š7ZáÐõ6Bä…Ѫ4"rÕ8ã­Ï£ZŸõRôФš¡ÂOv/JfD¹Â¯çy%¡Ÿäj%^µR΍`wf-¹ÉÐÂé4Õ¬²âtÈà€v©Åe½a ·BX"Ïä¬ÛÚpÜ'j_9¸´õÑcŒmP)*ÑïöA¶öƒoWD†¬éSì ]¤†õÙ’øÒ&æœìU ­gž\Q/Äxäl#T`?v“ðÛ^–ëüµGØëåX;ú@”ìÍeÊÉm¨f¼.iÀ× ê刯t ñ{t‹H‘xÛÔUÚ AºpäÆ.±…Ѐ¼ ¥Úš°+áçt|¥•9íÝL–^‰|‘áê£Ü²$ãNÕÝkcÚübâ yoÕÔ½õr࿬=âk¹ü"¦€a«LJUÅòd6ª>°ŠîäˆäÒ;°'æ~Ùy˜çz>È…¼ŽVŒÇêGæ'0Ò¢%iöÈ–á–ª*)0/ãY¸Øaùó‘ËÚ4'i˜Ïë,•/4PðM@kîáZXxsý‚óu‰­6½×ë26*Bœ›Ø;ïÒœ?~hu×NĨòåøÅ¬¢&'Ñî8÷q½Ï¶*@%IžîSæ4Ò¤q e2Ò¿þ¾órÒ¾peRXFí‹*8³¾†¡Ú;ÏË0Ü`b­³VR.ùnœ㑊7îù` º1»<òœ¡]fN¹ñDŸ³<Îï¿§ÿ˜àó¥zP•}—Û:RDó}™I¯ÒÜlè—[t°§å-ž$|ñ¼¼vqEEZT×ë= èM¹îPAJù‘€žª±QJ,˜O²7šåùÃî6®#Žkå¸H2¬ù|·ÆuUÓÀ৘úìtyö¸¥¦`œÐ_‹L{‰ñ):&]£2Hd“­eî^ÓÊy£~º”y8ý^~_$±¹ $$IÑÓØø"ªÇy¶E<¼Q.O*V'e{ ^2ôÄP‹öx»³,Å îê' Ò{3´Øzn×,á_º@"Åx˜8v7ïúÒ®hQíõRîT¨µ_î>Â+– ƒ¶ôë¶Ðp‹%u±= §íf±®Kì¼+HwÌB(ßëð0]±ô;– ¿»ÚIaÚ1KÆ i;ÃKë)fo´V‡[¥Dø y7ÚÙÖqíéi6n!$½íçÈ–pE¾ñ6´Ñ_p_(ÃD{ä7;îð:ÕïÏÆ‰CœÐÆùBüçÞ¾~\ (¾cq(;6±ê‰v÷ƒe}q™}-j×Tõé1K‡×‡ò$Ã@®Ç4/…*B ŠŽBÊ c«ÎYúÀ‰Oz4ÎÁ/Ö%ŒúåË\>BëïWHÖá?™6JØO>ûBz+­ðQÛÒì1?ÝÉÕ+‘Ç´<³RE6ªùºqÒlÁJ¯Ð¬átÑUÔͺµwx¤L²nðŽ£AfWCòÞy½ÔWaŽÜ|"µ²ÜÏn¸æ©%V@÷½9lùÉ¿T1TY-ÂàÞâ8æ³m×ÖFCÓ«rîªß®ŸñA³3\T 9l™Ü°A¾’¥ @zG2h7:},Pò8OP&!¡¡älêðS^[~ÃÅqEr…GŸô¶¨<1ñ¨iÙâQº_4ÿªmèq¢¥¶®ƒTZRõ 7Æ‹»- ti94Ë™ ‘¾¶Ëè.¯>óreh³0Èá|L‰x¾ÄÛDøýµ³kcüríŒÌx¡´•˜/ Zø9+°p_KKÏ 0ϱçdã:wП¯»K UoƒÛ ÌÀÎ;±xé!Ü’­!ä’>ÑGû¾mxx¯/· 1BÙýeýÁ'"¢l®w>5›ê3vz¾-?ÈŠœ!"‚9É´-¨áëâë®ÈEÉ­‘ ¥NóÛ 'ŗ¼ŸHÎÑ ¼þ˜¿vqœÑ¹·ük>Ê•­Ðäl“¸Ï¸áý™ÀŽðÞ«yÎç„Ï0èÊÝlÙ‚ecÎãg<ñH³¢Qyäºûà³ú}´Ü²n`‹«¸Ä*9#eæëpmÞbrùÝ9ÙLˆ¾s¼ß¾ü8ª’¹NM¥”.ŽY-)7qRŠhûŽt wü3&%} /Py5yF´tdóXE¥€óê æ‰¡–o]»º©­ÁüŒP€RßÞKå±~Éï²kOùÙõJ›˜ÐNn {âo ­ZJÇ4k‘ VoÏò,‚iNîmÔ.VÈ«„Ǭí+Õ|àµÔ'jÒ-pC¼bØþžÊn¼—ƒÇ®›çDéSJ<.Ý3MÍËLÔ;–räJ‘Êk~ˆ·ûFø¡##c–—tT¡dæ@¬H@5aäteC©øV¸ãŽhûÄc÷ù¡ñVÑ^JzRE^‡ù» Jª¶µB¿„A©…ç9޼+JbÌ¡_Ë-nx5?Ü:K–õµÀ>w^m(Yº¶œ/À#Fܸ§âëVÓ±2ë3²Š5ˆÀ+ÙÔ  5|"ßÉ- ½Õôf1Jš¥QX4<Ð dÃö¬ Ô©›¤-7`sh ñ”ó܈ºávÐüµ\ ‹ë=d䇠تÁÁòá–ÁÞîh]bþYýŒ-l|ü*¤•X˜S˜Û®SAþð“gŽ*»ßGâèGXú’0¡ËúBÕX|ÉQå‘…j5€,®°|qîò©Z‰cxÙðT ké#”÷Þµ8…Ò²^*»i”¢–¹bÃþ¡»zߥ^/h6é\o8 %-ø¡ùÓ‡¤ƒ¤˜Ò`–ÅQ…š1"~Dx´Á‡–çrü$Íàãú)T¨f¡¯ úY/ã—ÐMX r —…g'§,ÊZpðýN)HOåÀcšr"ðGB®å¸£‹‚ö8uÎÎÀ{¼ÑËÒ²ˆƒ[CÞ•ƒo(ÓØì/d›pÅ^-É"©.g È0–õuÅ øŒXõ‘ÕknIR.úçAÁké)‡d¥+J5Å•æÙ ªmÌÌ %Fèñß³K}(¥c¾Š.ã0„?©Ãl,”´ÀH_$ EØ|¶yC¬·ï=ºü×ê2Þ‚µzwò\bj×HZ‘§V‚TÝ/(´@ïÜ,O¬\`®ë½OFnÜj‡l¤n:J»Fpd°®Ëàƒ~˰Oóöúøešý½¨×²úwòŒ3“‘V¾’±çW®ü,p¿·Év—æ:of°¤ê„‹c„>×è»+qyŠl§¶æ<ÂMV”´¤H¨+õÑÛÒàì÷¤‡E:Wò´¿~aÂrѹޝɹ(Á%31!ñ‡+]Ħ³x|Ë4®ªË„#)[±é±ê¤×$ûUß>‡K !aNó6Ví7ìi PÔÃ[:UlØ` €k@\æ@Ë,NÒCx@ 1&ˆmh|ƒ–Ê ºø€j› >÷Ð$„ ‚&¾¥'i¯¥PN|~E¡·Q¿ì4-Ûæ… ™u…²ðÀ+H9:Ôb'€=¬khG+š sø>Íj¦Å—¥ó à•Àq^Y<Ú€pÒ^ã½;#Ï]®Ú—ÀùÏz}m(ÜN@ÎD§Õ´8ä—VÏÉ$#Ó¸ §L“WrWïbì¦Mw ùs½‚ývŠ‚žÙ %¾ËÈ8SyÝN6=7Ô¹¸Ýžçcz% ü/Ø÷Çíú }~aÏso™”ð…àýÑUGJBÊ;³Þmm´ñ-ukózß<â"\>9¯V2Û‡V.iæíùø¡¥­ñQ_jMJÎ 8dúZt2éà¡­ôÞŸÂSW„:ˆý^™Xó]Eûr÷³?‹ß×cLícÄõ„«Ž´ö¥¦ä¼g­·_–š·ð¨ö»` ¿qMèA’Ã)4w+ŒU¸wäIèvH!Ïç^‚l,½Lƒ>6Ãlye¿¯âýÉYw4øéÄ‘áyŒ¡ÇlvœÌ[¯,J0)Ej@öÁíî Hslz~"ÂøòN|£Y.]ÊáõÌð€º£¾p»Ã€ÄÖƒdÉÀÇmMà#$’VUc7ä­ê2ÉÕH:H4‘-> Üç±G‹´}Cƒ¾ÿë€ðc¤rÈ!º¾fá×áa"¬ô¾€,¸¤˜A¸Ì÷Zʾ!7ôîKåÊ8W”‚ ”ÜÉt› ¿4ÈO Ã[—¿*H™ž và>1ˆ& pŠA–-~ä "à 0šp(FF/HÖÍ¥‡íã6 –~¶PXMÇÓaÛ»¼z‘Å9ÇlÛ{ö _¸e¡\áJ›ÐãÙ…ƒ/úûTúr¶ÑéÛ!êTMÞМÑt+ÉyÊAÒuv#u°{ öQb2}á 2ÐæÛiE!IžºiË÷?cq¤lTœQ:2ê«ÑÀçÂÂ͇0¸X¾6à£ö‘àaþœÄË"õ´—ßö¨>©¼ ¾¶7\‹°Ðà6ÚóÄÇóÐ] š‚¦ÂSbIwQ& *4Š*J›ó··ÐË\+=¼é©Š4ž>‡™¢` @*(¨Ž<þâ¯ãËÅ#üŸÂ9{#ÌgŽ£6Obõ6³Pwiiªê¨œW¶ðû×ö1͇fîÿûƒü¿Ìûÿ˜“0“þŽÿ—yÿsfÒÿòÿ2ïÿaN ú£þ ÿ/óôŸ“0“þÿ—yÿsfÒÿòÿ2ïÿcNÂLúÿAþ_æýÌI˜IÿÕÿ‹8J %!&‰¿ÿa¾ÿÏI˜Mÿ©óVD2‰h¼‘I8,zðŸ9øñù?ä¤ÿ1 ÓK€ÿÀ#’óç¿ç$XIÚˆcm’X1iiÒ +²µÁáD$Ä‘–ÒXäœtÁùðï…Òÿÿ®ˆ¿êÿâ›MõQ°ÿ£Àûçûÿïßòÿ€BX‹N?—O²&}9[/†B ŠˆHÀÄQ‚"b_ŽòK"¬¥%¾Á<“ÙP¢’‚(¤LT)ˆENó …œî°çF67·t¶êó%¯¸¤Ä¸ÛQät·¿ZNw€s ãÉîS¹¤QT'"b €)3ü2ØOso )…¤#%%=½qêµ8³\(H‹!Aà"H¤ôÜÅÀ?èÿÛ Àû¿ ¼ómVÿEÎ÷ÿ9 ß8ÿ?´`ÍFêùÿÎ~Þ-ÀÀÄù–ôôô¿ô—vÅbÁL/Ì–“^´š¥öÝí?в£åY:üJÝÞ'öjõY ·[?{‡NÛ—GFç“›©\ZšÜs N×U­8åñ ¼¦ä–5¼¯ w ÐbSÞŽ-mäf_@Ya„t̶<`²AEáý‡“ÕWz8‰ïó–´ÇÀ™Û7sa›Ÿ3¯ë Å—0P´#M)RgÞ-ôÜœºV~åÐèºÝÞ;i€7_ù£¡ƒ®@‹õMŸî§4^ÑSlbå·í>d²½kô¢÷¢*I•µ EºnÙxƒ¯Êû<ŠÝÎ!ô›HïÚß5è±oAqsv› ë›Xôùí’BÚ =:eGJWm‘_Ü.¹i§N¼4ôàÁˆ}ŒUDÃS§‹²ßtò\¼õx«ŸÌí±Ò¹Å[¢j\É+¸œè(©©{RšÖ{$ „v&Ë?6>ä²`¬Š2Øøj¡§´ójtUFxdÃ[µ´£ùâžÖ­/J3jÖÑ[¡}sÉеê%%¯t8Žš9³¡«*¡U´C2|¼ÒÄJ‰…5wv¬mL_öÁ×ë„XžîBÏåÑ:çE…ÍC#ÅœÀç|Ê §ÁË…£ä¿ìwg^¾¦ÂW·ö9ùÖ|Z¤Ù¸_·ˆb’Þѹ!#ÅÇëðkJ[äå—j(úæ‰ ‰ï œRÁr£ecá—žß•Åcªí#é¶+h«½âTTPê ¨«?Î6éF §o=áe*|ç}ïG\YƒLýf&‰˜Æ]è³J}ª)K6Œ>ïX%âô¦áÖ‹¡‘KB‹lù«û4o<ãçj-½UÁ@dXæ™}À¨fT«”çÛúvžƒ5KNyq™¯2ßí¤«ÛwÕúø£»®ÙÉÈ„Ãr£¾ºñnŸ/´ÀÖ\Ëc<ºÔ“$!´ }ëV­<ŸÑãO÷!ƒHø‘¤ÞAýŽŽŽ[j–”$†oí«Z”>Öùr@`QbŸu2I¸)^_ôüÃ.ýÞD!ž·Í v%ÄzSá‘'®)\=^í¶=‹u›¸J^¾!yZ=3öÏÓíó§0Œ 0mjè‹€'tçŽVSð×îÁn[8ÚÛà1èU“šÖÏÁ«L5^ %Eæ‘ ”aO2S•yü˜}vfUzë>³K^cÐö6þ3ű¶Aq¯; *îŒÐx^<È·‹ãî-a²"³æX³Å݇È!òDƒ2SÞ‹ªÐ'cm|¢¤8ÝÊk!Ö‹æ18.Öñ\¨·•jv=È6-+i†öoñJʆ"2žÕS‚ÚÆ`i^¬ÞÇíº´ªéøúQ^6M] %8êÞ£ ùžµ^‹6µdÒÜæNM`€:³»à³ð¨Û’gÍ{Œõ‡ŽImOÍ ó:ÊÑ.™y²¹¿ÃÄëâÖìš2^?/v¥;?dKðõJ>,úq¤Øoc~ꇅ£jÌ›[ÜbÑ…-yç<¼ëôYã¢2ñ·ãYI” K.Ðb÷íåYÊù·Ò5ÛÊçÞw=ŸU±¾·G;zòÇQ†šˆáë£N|ññ÷ñ2Lj~BsÿQ¡‹zbÅŠ©½ó†XUp5Å×Këæ-í\i;öašQäX§r‹Ýev•žЪÐ{šO1B¡UV§Ü"•W&pIâUT¨u$nvÒ¡„&2~ÿ~UÔ±Ê{ÝãͪY§b¼xƒ—S<éÎ_ ÔÃ{­áÑåí÷(l’Ð….AEBvžÐ½dÜ@[ÕoØÊ_˜£7hä+` žPÙZ[O¹} ×zǼ5Ÿ¦Ê–ôöÚ}–7mDC/ÝŒjUî„JûÏÙõoäd¿ÝcY—¿"Aרòy¬ÿòÑþ[÷Îl3KÐ|ÕŸ%7~d›ÂÑ«¬¦ ?o«Øµxät퀒"Gp󨧂é;ö8C«›—Ùyß½[†‹k/YD¹Ý)il©g÷@³Q¿úEœÞ› Å&>„¦½¸Ò'ª o†|½6T×á_m›Ð„[&iÆDGiLµ<Îç}>Ò¥ŽçÝÃe«ê÷ ¯j‚D5®Q•ýÌôîv€?!¿ÝªÖ̵#j:Þ6Õq«e`MýïWêÅþ i aUOÛ®r×\ûúæÎ7Úv¹­¥§ØëY—,¶6}VïfâÞët,½Rˆ ¡ùÄu…΂!ºJË&Û;-O+ë]íØ¯pé¢ß¹ÜUVötb ‹Z+Â3´ÜØKø})ïc‰K«é76ö¶nOQ}ʼn~||L¬à¢CÒ¶AhiY¾ƒÚ&7^˜5¹ÆFÊÅֿͯ0ó.f_ÖƒúsÖÈ൫ÁÛÝÍ¢ßt{—žƒÃªG„5¯›^9(!»}éŠS“'i—Öʵ‘ÍýÇÔ›L½zۻ϶Þ|Êô{(Zj—p×s ~¦7Ïô•’Dƒ9\bäèwÃ_:°€CQ¡íì!ÝŠÃe¾„5£¯«?{Ÿ—”Œ«d±TQÑXqOäÁÃÛ¼'žhï]¶?NuÍë›itk/U(l{SäM±r“€ÞgUTõ Ùh­ŒQmxgl7,LfݱjHš °‰å» Á{†oÝ­êÞª°FRÿpñu^y¾%ýæ £ŸÓïj?ín®šnVˆJÔja(i*¹Pݵ¬uÃÐ(zEÏ*Êpº&”ÿHññ—J—¬Hf°‹Ý¬;X–^Q(.´¥”)ƨáË9ºî=à]ß›^ßÛ2Že?‘Æ—ÉÍ”K¶º¡ök)nµâ’®î½ün“Ð)„ŽV=ð…Ú0"(K¾ì­Ìèƒú¨¾«”êöãmdcŽ.÷,â­Ûe¯ÑyÒa[g¯•®$QqJ.½]ÏXëhÑRö ÕÞÖ”w÷r ¢ãÓ‚!¸Èä^°´§o® QùU~èíÅvÅÛ£.°0ß—»0L¹d£{Rûª£¹«»œå!KÕÎèúÕ65 µeÛžªN¤’áÝ_j¿6B†-x‡éeEjÿPõGévIyâ€Á¥ËqJì—o ž×¶³UuÖæ’²·¥Â‡ÞDH²nîîŽ,#ŠçClöc_fìJʦX#³×›žÔuÜ\÷lo´¶¹Ç^ÅÛ[VåìÛlØ*õ˜òm\¬³ôì3&ý²¼l³ˆÛ{ÝÈÔ6{Á>¤p‚ È©¾·?âvæ ±µÇõ˜/}®Ô‚}W2¯] xõLð0‹Zøá£^®â¶í#±ISlÏ…¯ß̈ /wv ò• 4 è_>«;·r[æUö$ó¢'º9éLÍâ.·YÝßöv¹çÛa±«öžâ>’ûo¿Ûk¿rÃA­Õª7ƒä/Q6¿*ÍáýàêWÌqà¼bË “;\²âÿY£åÞ‰ok醔 ֿݵéóïÞÈä@Çã»Í{ÏÁž¡‡ð]Úø¡$ˆØæ%ßì†÷?Mõ/òØÔæòHGäñæ—dì{b¡Ûa›#ù §»¬,‹vaɉ³E)ñe/ÈCZÑF×½%èZOupŽ®ï;—PaL7‚£Õ?ðâQ%Žèp%>ÿó&ztÄô™ä“‚fA»èm›EIm®cë•È#Η™lë3 ú,EÒ oߪ}ªáõ@3äü5¹±ÎO¡Ýíæñè gt\¾RÜ"4œWݶÖßrlUi{ØçíVÌ”3gŒUv(j‹J^DqM'´f‡|®&$Fjq) ­¯Ô19¾ÿò­‘šX‹T`ÈŽ8áX\ùNáÜóö{–”ts¶Q0­È¦ÚÒÒYùל–Ûûϱê–\î"ë•æË¨½ ¡€¾F>÷jÐÃKõf±`_r¦õáí‰kâ ?Š©,OîÞ!rÚ+Ñ–’¯?ÆÁ8º ëQ8”½îE‹½gGÑ=HôkãCšª>޲1¬º9<*Qõ³oqU߲Ğ•ï¤ Tóê–wŠÛFýŽ~»ÝZ•Á¢hyáRMö®þʽ[ù&NfÍ#™Á”òKÄežeéúïW=O6(ê9ê]ZÉx_>ieÓÉ“Ÿô£ Ž-Yê¢;êq>µÿÒ)¯½]D ˹?©1–©É®xÁ:dIÞR÷dîZá8²Å¸ÇŽÖë8¥.‡˜×‘e©v:°¢õMu-«§j׺=C2´È×fÝ;Ux*)ûAY]%Rj(C¾ïŠKIÔ3 ®Pg(óšSÌî…ÎPÌjJdþÕ}^¢ìÏ®½R»{öSIARÒç´l'ä®1¸Bf~Ǧu]îÕƒ‘%$î=æñ麭æâûwêSÈNé™{Œêë4Í¥÷¯ð*Yù^.þóJ¦#Ë6ÛeïpþÕf›´¾ Ìàâ•}»_?ÝҴ݈çnˆM¥!ƒ§PצŠoÓ*¬™ö™1xÊwm•ñô0´I¼ë\õävqH±EÍô¤«(›­†¤'¡‹~È3Uw¸üäÞ]†§:Ò9"—gá['w[S3§ †ÞnRþ˜›µë£XßÚΗÉH¨ü{€´ºFo­ Ð0¹Û.)§–[”ð¾ŠX¸?´,£4%c5E\Eó¼æþñ¤Ç5’goDw÷x⪽ïÑÆäŠ>59ùYŠpðЍY¹Öâø]>Ýn¦Í1éžF„H©9äQÛULGöê’Ñ;c*íë7­ÛžAŽü0ÒÈúŠ 2´Ü[©’Ø«p!xª¡¹Ç3€ÂqþIïFQõû>o©yòþáM{+OâÎêÚô:k—|®Ž­žcCƒâKŸ¼×®Ô5±î :p¹Ï>µ:ýášôà;o®4]«8–j›nÕÿ8ê/¤ûùfpë‹Â0Šìþa·þÞ‘ÕÞ¯e&7]´©ä©*A†64Õ´F¤JÖ<¿i/¿Sßè….”u—)Æjcë?¾nò£O×=šÔ‘Þ\°úbèS©A$gÞSÛµžÕ*rCÉÜO²\9¢jxe?௱T–Gñ:;{+¯ÄôVÆÇiÞwIoÊê†{¯ŽQ+q~§™ °]+¯·—¡29[=dÓàîÊ/£´7•åyº¸¸l®±UØåOa«´/¯¾Ä>øÙ·f£:˜u0^á ¥mÃh 抣ù93»ÔúõëOWSná)•O˜ '\XZ†Eºûµ“›Ô¢ºù•½/ÆTÆ©U¦‡<£û4¢ÜX’BhJæÈ¥;èÚ{ÛíÛ]S‰^ÔC[SþéˆjÍ¡}^‰ïBíûÛ‡ MÈ¡s„>-ý¡”&ïí:;¿ÿ¤šÐÝ?ŒMhÚ¨þH¬£?Ô<^~áN9(•¢;4ZG–¶ê¸©ØÔÝï9t¶IA<Ø+8FÞ â³<:.»­Óù¦¿ã¸ˆüºÞ±}%1ôVŸ×J˺qÔk_y‚/šÒÁ°¦zÌÝëH¼ë;#hO›wGÄ<{\|ëO6Iye°Þ™ìs:ßw/ ;ôÎe0ÎÔ;¶„-÷yëþ-) ¼MB˜DtXw¨á#ó}l¼©áuëGuÄöóÙ «Ö³©\D¡/»sØh¥µŽ=´›¾½Ú׬Ii–N'_Ó†ðkpïæ31–{;´¥Êúóì»m#ß´¬¸U»å˜69$@“û­i=Óò3›Gh¢ÑÇ_XTa¼ï i è]·+¹~›FÓq±dKq;¯ÝØœ©Žâ‡WÓ¼­¥ò=í{ú”°íþZ¾!XÕ¬Ø}ÉÇ+þÛǹúL“Ý·çn*ŒÏ´êþüqŒÙö+{¬““ÎÕOp¶Ç’‰$“ wÎÔ…fcþ±ý_ x¦®ÿIˆ‹"ÅÀÿHRB|~ýN‚§ŠîfÃízª0 Cm-˜ž‘²–æf—a"ºP1TFŠÀ IX'<OtÀÚ#ª:\hˆÈh9;Ö-GÀ‘±0;2ÙQ·×ï"ϵ™è@Æ9… Ýq\0«ñ7y.p™Êu²VvX’Ž,w" II‰K ‰€0Éx²= p!ì ÊÀ¾Å”°Í »Â0ÔõK+œb<+DÎï°fGÂÙÈs #€?k¢›»-ÎAØÊɉ FÂÙËs9‘ÝíqNv8™ F*8Q/01Þ$K¢µ;ðÆ)$SÇ9àHX2ÎféSƒ i¬ñ.0j÷‘çÚ‹w°Æ¹q¡å°³¾Ì¨è¶žÚ­¸ÐÚÀ#Ÿƒ¥“£¬Öh ó€ý8·¨ ÉÊÎ}ã04&£~ ÖÁHÛõ5 -¼ù§`€¾ô&ò«Ï7»³ƒÈVN_WAG°zÞO±µ'Zbí¿®ÇßáàgâeŠ0Tr€Ò ç‹ Ž'„TYŒµ•™,þ[¹¹@^š™ï`‡#áɳ2`¬I‚Óß A_ÿ†Ôej* =Ños‚}Á-̆H‚9§Ç;ØÂ°°IWý0êEÂ0ÀÍ82¸Í­ÎŒ·ú‚6‘„›‘sþY­qhnp-ØÙã³'ËN¡g?à’»ˆØ·¯÷Û?l0 ˜Âõ‹ÂKä³ #¨%R ×G@,̵%a Ôv} —2@9+@âàHh9<ÁæD²š^/¤È÷Õ¸ÖM-ÉÜ(ÃÑ\õæ‚YIÖ8’<’ èÖ@xÙƒ¤â/€i¹`X{@øMo4 &µ„Èé`X Œ~. Ð}&Þ­Ö¢_·`›q|Ü찠Ì·9€¢h@>)A)A ” Rj¢ºß†Ž K~ }þ¨)pG‡˜ ¨´xÅ´’™Hå° ¢Ù`Ù}zÀf€²¶Å*„è8«ïƒ¨4·ÇByR¿€\´S‚šBôf¢½= &ìÿ7F¿ŽäŒd”õS\$õ=jC˜b¡™µÿ+&ú °¿”ƒÄÀë]’—ø<„’B Š‹œ*%%()üaI"k±‰’¬@ð?„+"ôðÊQéƒ3åfÕ]à0Ëï³—a\·M5.ŒhTÛ6CÕYd¬¥=n:çYáìí±ÖÖ€&øòî䈵šxGa@eÈÀ1þéË'W`RjÓå,ov(´ž³¥=Þ 6®jaj“JÐ~¨o‚W@5É8‚Î Ñ@Pw¼-›„·µ>ºL¼‚h6žħ‘Ä5ÁæX$ÈÿØYŠsßÖ³22ßÖ¾TÔcAv"ÙÅÀgpþÄE30ΉŸªe!ãcƒñ~Õ,ÌÌ&XÉd"az+¾Ò–?3 ã[û­Xêøþè`¶úFÆÍPÄߊ¢‚¦6{-¿"&0ܰ¢’ý´€ Æ‘H`'2ÉÙ (DFe¢ßÎ$"¿–IDþšIaX G< 2 a$`À6þ: ÈæjM6·Æ’±ÿ&3‰ü{ÌôÓèùUL§æ ÈŽΠmð8PŽ}áA™&1ö0¬Œh¹ÜûéŠ'ÛÁÈv8˜#8Gµ†5™+VEý}Võú¯¢¾ðê¿Éj@«¾YËq^ûeTVÁ͵dý’Å™0IÑ)⌳$lœFÎN@ÙçáÈÿ ½€fÕœ ÎDÕ~‘H8²3ÉÚ¿œ©c`ؾ}™”Î éÄþ>étq_H'ö§’hPÍßN:  ª\ü½Ä³$íÿ,Šã`6AÆ*j—ã Ë‘¬ê@&¹Âø°GÙÉ §«³ñkÒ/jJ †„ 6g†w¢ê+€Å¾è©q›²á€õ§2÷¯$† oý¯CìÎÇ¿˜ØÒ_CÓš4sL¢5¡}¨ô²ÀÿêÎV™J/öA¼ƒ ‘D ÎÝgRKâ7PË«J"“ê…b’\huyò£&Ðîihj˜GÅý¤äøeFCOó‹íæ4£DÐÂTl&ö%ÿ×°/”ÿ§bß`6ö¥þ×°/ .8Máÿqÿ¿Ô¢gbXúÇþ–I‡D$!@Åü^«Ž žDæd°KÍ["¹Ð†@Ålq$%jû~1­6Ûá¬öÀ\íp€ Í&Q^@]Nrvp .Ê8XÃÈãu9’ˆŽÀÖê+Ua‰ü61T3¸6E5$Žq§Vr¨YÊ©P?tfJV$¼ãx›È?Y5_²ç™YœS!Z9pdìTߊ‹ÿý¡ø—ÑÙä€\üË€üoÔÆ—ÞÀ¶ŒK¿PÒ|e1E}Ãb P¤ >Lã Ñ•kü31ûÇÖ×i†ÚɌӀO¾N+âK7ûjÜüí)ÄÁ¦A9éû%Ì ŸÆö¯RߢËOyd &‡# I_ÌIÀ‹à¬Úwˆ¿…º ýã–ýEôd=gqÙ?k&8õ~ÿqûþª)ü?EÊ ‚º Û1!¸wN,Ð~¿†_Ót6›-³¦zÆ—ž þõ:ÅÌž1½ÃM6ÞœEMÄS%ÕOO¤¨© í€x ¹‰Ö`J+,5¥¥ûä·¿0þ`ýŒ+"6Ë>jM’‘Ñ#:‚o8Pý`ÑÂTydm Ÿ …Œ–³þY¢õ°$€QÈ8’“ŒÂÜ’F£õ›K=_PŠú ¥“Wp3­&“Zmæ×Ùo¦ D+Y[ÑN M`2Ù4|OÓWÿ¤Ü‰Þðƒ"§SwFaS¬†°¶ÿ&Z1TËÆ,œ°8Ö 0Û—y gàxœM08<ÁÑj:€=lHDÂÿ3D¾â *7ü¨û|O«Jü}­ ÎY'ªÄ7W9€ió×Sæÿ= Ú:¾£@©óúiÀæDwþ«ÇOj%‘™­˜¡£¬©vàáŸ!d¼?§‡&‹¥²ÜZý…eò§Šþ/Äž%ƒ±S2l•=Ècß—¾ã»¹&…¦ÓÿM\Šþ:q)ù÷Åå,פ䔜9ùžÅåOjNÚ]¾#9g¡kÎ…è·¨ñ d ëCÏ\ÊÁÿ†¨û[,5¡Ì܈ãÃð)ëĤPùïà„·ÆQ¿99â¬ð6x«ñÝpD ܹ#£zœ0l3ÑÑ´[€)ñà+¬=ˆugœÕØâdGt¥F’pà~ljR N0üxãW¬ <'n’þSÅò þû¾hv5|%a–¸‰Я-ƒ¤žX uñ´ó?‘ÆÒ_ϰºNÊbéYûþ’·3ò¥íä¼8üâpÂxÿ›¢(Ç@1DÀ’¾iÖåž š<°ööDW@6|[ìÍ úû2ÀàÛ#2©ùÙÏ ë7ʈùÙCÌõˆ Üî~œ™Áñƒ¥~œ&‚øçÇ^s(w¿¬1þ ¹;cuBêZ"ÿ—Ç^?Xb›Œß(Sÿˆqׄ!ÎqrË€ ì?i“ûEKõß³Ý}w}a|ºI•wVXÎ O„Ùr—ã@$OëËÃrö“G¬¸-g­7LKð—†4;ÚT Óú©›ÈàÒµlêüÙöËñiêòUwAÁâ’z~XFÎÙžztûGvîÿãyÒ¿€n  þMèVŽŽß DŸ ¦Vߎ4q. Oÿ¹3éÿ¯Þÿ;oÿùÂLúÿAö¿yûÏœ„™ôÿsìóöŸ¹ 3éÿÙÿæí?sfÒÿ²ÿÍÏÿç$̤ÿdÿ›ŸÿÏI˜A±Õþ'.&" p(•þÈùñßœ„ÙôÿÑ^¡¾†ÿF pÿ·ðuÚýâàýß’Ìßÿ1á¿sÿÇ„g™ñ;%æ¯ù˜¿æãß¹æcš<œÉ’@:ª³àÜÛîü´Ç‘q0û —쓺ïÿ¾eó‡û5aã—sPw©ÚÛOÞ °ôŸðŽ.á'öÉNs´Ö—kÜóû÷k)TTjÒ£þ´¤ kr«©ŠLúÐúGÀf@š‚3cŸü/¬¹ÈÌš»´pß”kN?”2þ&HõTûµùä²!(H Àž%ãþ;-7ÿªºá©]Nõx!@rù Õÿ¹-â¿¡8$ÕåïeˉִÇ[ýîN]4@mò››ƒw4,î·7Glf|_ýªE?»Áž° Á7ÑË~¦q¿BüvÑá(6‹0Á‡¿_dÌ5Ù©d#M1æÜSîw¡à»$EM¦ª°ÿM¿Û * ÉߨɟޢŸåÒÙ÷ÁÌâ%øtgô0‚“9x’‰èLþ)ûG‰¡ŸFˆè„óݯ›ÞùŸo?xtЦ?¯I¯Èš³Hwª{ƒß<†øÅÍùi¶FÍ#:þ[týMT³Ý/OI«ñˆ#x¤{N&!¿vÄþwN\~åsÎ/üº«#è§s®ú¬Ú;cö9î‘ù7NAçªià}G¿Ùò/K$‘Y7:Ízü{Úçû™<ºüËOêŠIÏŸÔÿ­0sýïOØÿ/>¿ÿwÃLúÿ ûÿÅç÷ÿÎa˜Iÿ?aÿ¿øüþß9 3éÿ'ìÿŸßÿ;‡aý‘Ø—þ’H”äøþ/ÉùýŸsfÓÊõÖÁÁÙÁ Î_fùVú»eüxÿ ‰û²ÿKT îÿB"Åç÷ÍEøïìÿšt»5/…í`ã×Ë€›€æw…Íï ›Ë]aßdHê>°/Vž î“FXKŠW´N”§Ný’¿r¥Gõ³:~IN˜Z…i¼fCÂÚ‚Ins$á¾ñuò@{ªÐ7Qaq¨©8”L¼êkØ‘D´Â99I\hn¼ €7˜¹¹Žª‰¹¦¶¹’ŽŽ‘ÎfM%C]Œ¹†¹¹ÌŒž5õ#ð¹T t¼îïV@tª¢?QY¹Å¦r‹ÍÆœøTœøLÈ{pî®D’5-8’Ãè™iœÈ$¼ƒ­=H€¸€k3×d²ý³Ê‘˜*GâÇ¢nþÃÁ¸¨~•…í¸¾Ý&É)x’0ÏY‘RS‘R³,='=+Nù%Nù÷Ø£ò}ê‰Nq§è¹ó'Øç v¦Dh!že“FQOÃLuY’õ´®:ÙóIÖ¤q¯’߯°èÓ‹þé¹qÖx›oØâ[ѿϷ¢S|+*ö·{µ.ЫTµUu ¿O—)ÞŸ+ºHÏ¥D@–R]¡~M é±?¤ÔTßýqßú¥¦ú“¨äß§ÔT‡•úŽ¡¾ƒXÇqùh³ùzIE…8mØñuXÙYõšê좳;»ØäÕr?ª‰P˯k¢4]iR«CHÕÒ?jýÏ4þ§‹üN,µ2ß©†£³¥=Þê‹(ÿQ=þâÞªoÞY5[ê‹Mq•˜älüOñŒØ÷xÆ‘„w¡nå¢ÖWf&ñ)i-Ž„ÁÆ/ņ ÎÊpÒc3µ3™“pV³D|Jȉ£¾CÀ‹áàm6€)%.Fu4ü#œbþ?¹:ªD"a'Àã/|ödÙYDýÒÿùlɲT 7Åiv5¦D€¸Äd;¨wÔjZN´o=;ÓuÄ%L³b§è#þ]úLg§Ùä™ê{âÒ…˜Ÿdú¯6‹Íâ{ø_³´Õ7X7Ãõò·¢¨¨ áœ`ü³(1Å…Èÿ™f ÎjäÔFBöƒ0ue0x‘éW¸šêm¨ï@˜•cj!! b÷›l8±ZþSbí§I€šµ9`6 ¾jÜ”$˜=Ê–ø…º†ºOŒ s\ü$N¾‘´p¡'7þuJ¼ù×¢¼øÐ™0±Õâ›­˜¸›u¢Øý߬œ=x}ÂøÍ“õû"ï…§• ”%;{ª !õ+)#6N© Ê̔¿¬c¬=Þzì8ò`?™M›¾hƒ¯p1%±%f–$§Äœ$r6ÓY ãv¦†w°¦^.€µ¶†M×`ß8JN I‘ŸÐžbßkJ3†ÉßM«(ß~ !ÄA3ƒõlð!›U~%^ÿ{WõöþùVˆ´Yb†Jd›Ï˜Í–‘%7͈Ј&ÌŒ}DÉ’2*d¥—J(„KŠÛmÓG¤U˜¤d•ìKÄoFúIº·o÷[òǼ_¼>|–™çœç¼ŸçœÏ9ÏyP“æüaøÈdvØ¥2ËÀaI³ª2&=jšçø¼ÁÚSÉì°7ÖEÖâMv÷O-ÆNqóõ&;içQjÿ»ùýñª`õêÖ—i¢S¾fÂ+{úŒÛŒ‰ UŸr›+~æ³?^øŠãFMŽ”Qˆÿ½Ìì…’?¶Ì,+nFöѳõ±ý¬Ä_ŽØfĺezñ&{Ï(ä´>j²›ŒBýSKÂS(N¬¯s…|žžÊûëh²sB{Љg?¦:0ã!ƒ›Æ³(}­:>kÆÕÍÓL¯IO€Âüxñ`ªãêú–|_ =éˆÐª?A4–CÒ#³CŸ§Û²©î|¼öÜ}Ý&dFÞÉŽRþD/‰?éðа/þß™áOüÿ§'ÄüšåDOº4ðj>Þ8¿U½“5ûߊ=iðÑ🠶ڸØ8²ÿ߉>Ù>)¢º,¿âkkï‚wwÝõ¥šô6hµŸP*Ä8±ö.î~®d’ùŸu1½ŒÓžthÄ4[Šž´´hält$0–€zã)â¿Ù{¡°~0Ó?Ó˜¬iZ§ÅØc<ó£¢Ù9è!ò÷¦=â™(Ô—u;é‰Ð(Hà—W'} úËYô¤AGÙµÇLZTÌ?ÏzL}}¬Âº:1£øƒ£#ÕÕМÅè|S×ÿýÒý_‘jp Å^ÿ0ÎúßÁ—úÿlÆsbx3žúŽHdOÏ)»‘þNTUÿiý{öâ3ýÃQ\ª †‚qÖÍ0¶H mËR=iK!¡í‘€=‰„BÚjjhæWËÇÁÏÅwòßÖó_|Ç·øÏ&ûû°7€äð&`gëMfçi&SÉT~*ÙÞ²’½xAújKø¸¾ÀPŠ«o GÂ8êÓsp’-ú³çHã‹ &Ÿ`Š4Ž@)¢œÎÝìÀ÷ñŸÕÙÿßñ þ#QjÓøWåðFpÐg(È/Φ£ Ñ=S..n&ëWnîÖ™C#J÷Y9ã-ú£ccc\\¢¢¢bbžW¯^MNN^·n]ppðóçωD¢´´4ëFÖ-¹)¬¿¸}Lqf\:-µÖç:éa·ø'½=YAmBŠÐzøóß¡@ç;ÛTäß¾I5͈-ðYÛV©áä¢q8ôe˜õ›âü¬Q*à&ьח¿ópÉ/=¢'ÄåÝ4j~öfDô`dž¤dмmé9ÆÉ!A¾ ›Ix=Ï7ÖBó4$ñ” ˆ…»¤¶WóbvÈÈš§‡ô å/z"É7¨´8-yàTÀáã7hNLgAS mtå1ýlÆÒk½MƒíÆ2¼Õ{íá|(÷Ûc ŽÂ„—Ïô÷< ->²b¹î>0Ö:ÉJ¶2å :\j_bo^S%´ÂFººAS¬»¥j@CdWäÙ$Í?²ba…—Tî¹Ò‡j 8ÈÎŒ~å㎌P,m¼3ÿ|Ã¥â»1sÚ-q!Šù ®c×§¥ƒèמ»4Änñ¾2´0N‚<§ýy¥dN¡V^R\ýþ‘Å«ÝkŸ?îÉßÿ0¬ð­^Õr_]/$s‰šŸÒbšR×Y„®•Ãѹ•kçSßÍÀßž¶o Qôhë.:W “t\ “PZ÷¶L©Ð…Ÿàt§~ÿ¯²Ãí«8Xl;‡ó̽ØÄñÛm.—÷ÒÎf°©ëFª¥¯ÌZ÷ öL“I$%\ƒEnÍé%„3q~±RUϬ>l·haú˜(gßNy3H“m-ƒD(›º< OJx}/8&Ųö!CÇpd~ʽ¨nTñF}ÖuŤ?‡AÏ/ÛÈOí²ÙäÆãxî¸âíŠêÑÒõ2í©õЈŒQ°W¿x=.¾O-'çtÚºw ïe Ô„m—Úü®†·9\4ÜØE³yÝ{ fnâ)kí=bui|)}CÌÝmOK‡‹üßÙQߪ¨HßÇz¬NbÎ)hºÆ£Ù¿8ë 8ðû°¿W£ R‰” â~ͼlEÞ ¥ÏÖuJGW/’ÖE‰GE‚]îµ\Ìz|óòº0wæ~û±¨€Ðš4n…ŠKõ>± °`@¶#Þçè}”{í°ß ŠŒ¬øÓž‘®ÆÆEþZ{7@¯ìn[ÊZ§²h‹»Å{Ó@ü$öUÉ@ðªgЂ5LØÛf>½»ë«žÏ)ûŸç¦à¡9í¶ðšS¤¦‡6àwÒQ8¦Â«Þ.‡n©„Än¯Ä+†¹Rš›û1÷<§„/ø½yWCîŽ  E6‡W®­]´j•ô¦•WáÚîª*"¹öüò¾Ì%b‹ý† 2"HP5¥œBÎ>³âjuoŠ™;mÅ‹õÚ„ÓeôU•÷êôµUw­-ÃR/,ÇhäëdÆe »¹W®?¬tÝ$J…;yµ®]·!^ZÕôÑPE™°×mó‰ãôø›óÅÍ#$Ï—f^¬’×…߬tÆZ,«—£X*u»wè_n8¯llùêÊ–CI¹™Ü y&C›¿l]#B p‹¹ÿØò~Éžvú™ß‹Eò ÂÞÅAÚvIÍë/^œXWžâ‰ßúþ*B‚Yer)Ý|ó±¦Þì°¢Ib54µu9ŸŽQ¾“â¹h\ÞAo>Ø”ºÀÂÃU²‹'#Ä•‡4{?±ÕOvkéÅÆs×@Í«×Ú£NÞ|‚Zš˜åÍEonþ#B`ç;n &p+½xm¾83„uúÅ­—¯"!ÒZ*ÚAHžÚ"ŠßaD?éy¼¹×i!à0€ø+Ü;WÌ’©ÖgäMÇ\ÉáÞÎ,©ÜWù,(C‡²8iéåÕ«œQ‘†m¢Ï¡Èµ.M!)>Uc.ƒ­_‘æ}šV•`äi –ÄÔ©ÇoG6V¤ÃSCµêÑ)K@y/£›¸~Z¯³ª}h~bi£î`òp{~JQ^A® NUhÐ!œ¬t“eBO˜`b>©BïìÃCîJON@£Èbûaã[¾nK=¢_(V ™zÔ½ßT1NÅn50¹κ¨Ð=ëíš­Ï8zjñšú´Åuq™Ì„PL‹¤p‡ÓRÀ²Ó7žûøqÈÞ}9µx¡6o[²ÕJË< &MÆ;þCŒÃæ×ôÒG4럣›sçÅ8DWe Ž=OÂá?ØŒ¾(9¡ÿ(â–Š@‰ßnŸ=ÃŽ'ü‡Íî%Gùì–b´ìÀ-ú༆¢UšåÉ3o={äæ1RŠ( 1oª„ó ùÔJãT»O Ó ^R–&Æ\Þ£©ÙÓ·¡q÷̽¡Ùíªš<˜®é¹të,=ÇVÅé⻣–|C"ýÈàІcî¡·›´VÙõR:•m ÉÓ –%á׋dÙ&å8‚¦3b7ùÈ;×+™×67_®»û@ù3z›PæÖ\‰c)KÏ¡N2)Z†Ëˆ.‹K0æÉ]ôWš_XºdIφÊìÀηÌÿ¤ºõÖï“Þ¼Â;X‚XW@ÙÍ#¢+Eè"q /‘+ •ÅjkbÆæ{¤µJ=–HÔN›Úq°ŽÝ°TÇUã~¯£D¬Z>*ÑÒ* ¶°.\ù^U[s„;'$¶ ó¢ ©¾8Ù û¶ 5'¯_Ö3¿aøjìþ~h¼¾±@©?/Š~»Ur¡ôׯ;nêÚ=÷ý.’õQlòc²çAzÜeM–?Õ}‘­Bzi¬7‰œÐ jµY©Ôo÷ÄŒn˜×`pOëðÅ)¸£]zù.+éUáœçˆ9H‰‹œ×’ãO¼*ð@1ï«7¡Õ 3k?°`-–§Ssi!ó±PwÌëþ‘æx«I ÚC Ìzm+ºåŸƒŠ!k^äeBÎé€ÙR$}¨‰ÝsR\̼ íX ³¼yQκ”)s7üõŠ#Jíº".ÖÉq¹XðaDá%-7ðº¹Ç…#â i–wüîÔ%;ßlÒo²yš-Î4™ »lGƒµy’-™½2;²%E2ÄŠÕ½û\Nº33+—fw0b²`—’D[ïÅЩ¼\„ÁÊU6MÆ<Á Ðõ³ÕÚõ B{®7,‚™%ˬ^âñöàa ØUB’s’ªŒ[›¨GѳÅ­IçY¼£p<£Ãö~¢AПžk᎒bÞn>)ޱ$AzþUÂ3Græ<@D«ÏümåsDèí¹“½YÛA«ÇÐ"ì ªÄ·c¼·Þâ£Ä™qöÀÎH§—­»#ôã¿©ñßv³`ÿ‡ñü?(UNþ¯ÁÔ÷?³!ÿ‚“ÿk1•ÿö³@ÿüçèF0•ÿ³!ÿ#‚“ÿm1•ÿ¤Y ÿ þsô?#˜ÊÿÙÿs‚ÿjýϦê6äÿœÐ?gÿÏÁTûOžúŸ°ÿþϦêŸ2{ôÏáÿŒ`Šþ¿4ÿ/gÿç_€©úŸEûsÖϦêíÿÍÙÿyF0Uÿ³gÿoÎþÏ3ƒ©úÿ¥û#5©Ÿˆÿá¼ÿ|©ÿiÁ˜ìT‰D{WW"ÑjëéøýA@lÿñ?õ°ãгþwF€DìŠ* †F’ GÙSU[5Ù€ÙÙÿjù8ø¹ø7üÿÞ  oñ†„OµÿÀ‰ÿ™!|-þ‡2>øjK0÷qrý̓V„Á SÐèOO~}wF ŠPDCà(´"p"fþÿ¿;èŸù ¨iü‡³çÿ8üÿùøJüO(×Þñ±ãˆgTÖ>ÿs ¸‹ÇãǸ¸ÄÄ< ÓÓÓ---‰Dâÿ±÷`Ml[£„žˆ©( - 5 %¡«ô‚„š”)R.bWP@D© Q„¨X‘" ˆ Xi‚HAôM‚ž#çœë¹çïzýßÇúB2³gíµ×Þ«ì5Ú½õôôúûû—^ OHH` ¿ ”vŒ½‰aù»@÷w2)çåÎí,i}«r"êåbA$4#3…7Cÿt͇þáµ·,F82*‹æy#FÝ;C›`wþð™Q€~¹vd:/^2¢A4ÏJtýþƒÄ¡á϶i(vÔvÚÛ*-n/$pâùH¶z(Uu&ºjlƒDʵ-ÇOæséoHZVÐOë‹,˜á†z:¿Ü7eÃ{ÅC+Îe[CÃÀFã„c%'·x©}x(â–âߦgW;ü(äJ²Wªª„›qí¥Ê/U[ŒŠùð>Tyt•´ˆ®49MnÞú`óbqôêEÞXË1Ù9©²K vÐpd²V¹ÙK!_fÊ[ßw[r®øòXáË14WÆõGˆÒ­zõ[wr¡!aßtVQ÷O߀[5·yB_ý«O Ðl¸°¾óÆ´ø±½‡MÃ*‹Ä»é³w”í†Ó¤×…zå43vLb[?+‘wŒ9=;t¯—šŽµVA+]–̰Š×ÜÇq"qcXåçHñÌF9Z‰Å|¯—Q=?ÙÜŒ{±öv@Œ"$ïðЪÒݳ{·R2d4•)N]ûDÜSñ‰OÊLJzç7fW´å 2^þþ³•‚'Ð]%öE­Vƒy6`1 X!èƒã·&aÇS†“…×s½y,#W‰}Ë^¤TŸb”’=Ýì05$"öwAë.‚å›a…´_¹kJ€€ðØ2WÏ‹ý: (›ÜB§#¡Ã×ïØÏÄ@§ÁIúÈ\·¶rüT9)Ò¶§ªnk^¯kÿ¾f¢ö„i“‹Ããmð;n>3Cù9Z“VojêIJ¼ã©m–uiµ;ûNʇ¸ºñ˜àècd?U{ÏãWC#ê¨Ê•A7fwP.àÈXÏCEDÌ3¬]»_ãÌ™C€Ÿ3hãUñ8®Py›4N/ÁÒ®2ÃÓnmÀÓåÕù R¯PôfZŸôènEZ©¥á]Ó:7DqAŽäºãu 6ïžÃt›‘ÕbŒeÛ'ˆPVX¥ vDôªYGÀ*†iÂ@¿² ª˜‰È€u#K%‚™ÿ¨E[QïË¿wDÊk­E³KÖY‰owí0Æ*Ñ?gBÍ%PF2ƒå¯§úÓð¹-Æå±F]{Þ HÂï;£âv6T\Î5W‚tDÚ†¸‘"\½yßB™`Þ¶ú¾Ô”@sëPÙ¢·X¿$±(Z9r¢÷þ>墅 îvîùÏçµÍ%Nq27 ÏqÙ°v£’;f›îe‡Ö!Ì®”̾xŸ s)7Ö4ãð­)Ú.,‘'$ZZÛÊBl!d¶‡ÖožèÖ¥_Ù=#!2*áÛ‚Þt¬#‚½”6a¤¶¶ê܉gQc¾ÇN•­"òc‚Gn¤lÎçʸ“?ÚJ]›zx¿ ¿[=Çd¢ô4‡HZLÜ…Ñ“Ów|Ûv\¨tZ[yb4`Ì|ÊøñìU1ËT£Åĸ ãYÒÝóŒÒÖ ¹²Ôʧ_øÉޱoÁ §žâk–Þæ(šÎ}p¦#õ~ù>IV^­jÛÛÁh„£-wxC–^º‡ò|éFÅ·©ÅäCO´]´¡D%Ôé§”$ÂbLWi…ÓåD|Ü”Ü)ŸÄ@¡˜™þùø™P¿£Ùì†íjuë»ÇŠƒ˜•vóóUÙÂŽ K˜OQÏÅש¨>>ÎH©¶:nýá‘¥rÕX£ñ#V›X¡Æ…)sùäÉ6­µ™ ©€{Œ³^ßš‘mpµ¬Â¸+`'Ý6eýèÚ±‘ý·`jÁ[n„“³ÝáTí#õ ‘°øÆšÛ>“ìŠÃ;ïLvì8fï–¡¬·{yqìªûŽÝ¦·`®bcó–£u°Þsñ'D*ø™¢Ÿ3}õS1RYŽŒôEHX}3ÒÏ9ÅáÒyÿ…ƪa€¦.–“ßJ” –#5Å3^Ž*ÞïÚjR=ËUÎíèöh Qù¾ \luÕˆ tð"N§Nõ»Å`fq—Z„œhçTË}ðvW²ˆQ)kÆqqÄѧ,3;’ö9T>;µÏˆúvàÄš€ÕyÂy‡ïòŽßRÛ×zúKdG¹‰>dÁÅùä”p7˛۷ÔK‡„E.QjØÌ”ž¤bf/$íö)Eë3hfŒC«î ùøÕbÐÓ_j‡lIͤPØS„¼ ³®‰³Ïª>2Û¿1H¾Hþxö,—Ü<Ëm˜4£ïËÕ!Ž¿hM@â°HS¤ #,7ØO¸Q†3()ãuª*ûåi³Ž¾n|òEœQÿ@Œ~úæé5:‘Çð ö¯xýõŸ²ðÅ% ^¢T@žæ‡4Â$5Ÿ悿ߢ9hxí©ƒ ·>6æ=bùmµöðdXgKºS|™F ¥M/ Ü”:ûöI@D¢SåÀ¥œ+<ÆiwÌ >üḉÆD~¼ÐÈ•õ´ËLr×´$ô‘DÛ â ˆêóæ9ªx60ÍQiÀ`¤8ƉÅ’Ÿ$BŸ;€(^XåÖšR­ã€ ?åeO"!“)Åâ@Ü›µÇ… ƒð›ƒ×ôVÖóPC·4ñº[6ìxvØsI©áLþL†èIjüíL“ Â5»;“'v r…Ë€ÇîÚ—|Hê³äMûCE¤òþëT©™ÓX–ûòÅH—^òÐÚCe‰rRizw*‘ãÆßn:NŽw¼»DšQ’ÒWGÚ×í>ÀýƽôíÖ9#¨õnYWïµqížÀRkX½!J‰ êyÉ-ù©b”ÂÁºšV—íÎà.Ò±S½ÕŒ`ÖćêD¯âØ'o>Ît×éúy°®t¼Ë€9|õáú6 lþŽ,cª%Xçö¦+˜ÃÇQ¹aûÞܺÖ;XxFãV>úÊH¯lJ3NF§Aà³(å“SZ²÷.k4ì:cüâ7ðfDŸ«˜w#õ{%â˜NeBPhÔ tmbzO\t~ôðªÑ3aöÖøýV”&õÚSQ©4•ØÉ˜ç–&ïi¬¶¿5ž{@C¹æZ;Øô*%?NVe’döÎ6àZ8^ÜÊsV/ÖË}¼•y›Émæ‡Zlï/c·ïl¸ƒ$êHÆÝž&ã½Åçlu$ûï?:õæ3ÏSF\¥@)Ü—ßÏ‘°Ç=q{Pþ§mOê'>2G @Ý_ ¸mº¿JžáÍìõ'H´öWK–½Cj–#û™Òó[¨g§ì ïGü†ä ·8 9Ë;ã-ùÜn}@HuhÀos h~á¥À¿5xÓ0g دyo:lÒÀ°U[÷‘’{&CÏañ“/Ê?¼P)–Í¿™é.s‡a+–3²G¾ûòxZ$°æÀ‚øá}þzð™×Ô>cD¢Z“:08-ò–:Ò·9´|õóÌy…·tô>ÇL}©{Õ6cqáà‹P©¸ŒÛMÔýt½’Aüsìq»õú`x@c?ûnPþV#9_×fþ¼{N) ;ìÑD”JBU~6VÚ…êG¶µ®ƒsv”¶}>š?%uÿȼÐu#0 §Ø²¤gg”¨q›¡™VNÎíѯ{×wÄšìÞ^>ÏÎiÊRñqº¿#<`ž9-œS>P2ùaú({<™÷…¤ïôös¼YkÙ€F¢õÞÔ?Û½z†x}Šm˜c~Ù"ßxÄ ¼Ù˜,æ+½­û‘Ù¤2uµ¿Sýã]-¾O”]މª·aä1²ÌöÉ}rstœ4¸ˆ¸ríh§H¥ñQ¯ÄA§ êèpN<¯—§µ×¥#-UWr*m»y´Ë0'åfþ¢M–ê“Hµ®ó×wíYÞƒ³ £óÌ~`›Ÿ € Xu›á¢êÆGBäjiÊhž¯¨î.H«…©m¢‡ÁÚw=^õ5«ÂBT¦IPåvöé¤ËñäÌÓO o¥c¡ù\MEóQB>A„·Ä*%‚5^s“{¼¶+:JR^Ú?Y{JtÂ:*ž¼ëôSÃVt¢y£6 Þ-Ö¾ÓûX¬%;´v]ªE—YØk!Ç]-G„Èé{Ò훹•¯Îc‹!{ *ÃÛ‘ÄŠs—³)îï/¿j+ë9â^-VÕ|Ioƒóà$J´òÞøÜLö°Îˆ›ÔI{õTlÝMˆá†àäòΩê^$…apòC¨˜Á[Èθ¤uRa94|l:BÇ,†Ñêº?l½JeXÓ0Ñ5lÈ®Õ$gÝ«½%žPc|R¥¥ ñÏn ûÖÉv‚ÅðÎN½/ÀØÜ3©“jM°,Y„éZ–,ÀöË{°æ^Y2zÛ„á'Û¬N™"4F•f:¾w}D¢Ÿ¬mˆ~ÎÛ÷²PÓ)ÊF™ ©Ôãî…!É­n6™™òÂ|e`üÝø XFiü¡6—çaþ úG$¯ÀÈ6⯔ü „'5a¬,wàŸÎ_^_îÕ€½[©™<¯?¾ŠRŠÀ£î`à·­uH´+†}¶–ku…Ž»ÒÏI0âõªý™3i9ì\„ bbÑl×û³ôãÕ¸¾ÍçyŸ¯º·ZªM½êþõK·®.P5ÙÜÇ™ð4 S]?«l¸~6ô´u«IIûžæN˜g‡óDÚœdws‰ [˜ÕïáîJ¸QÒ)E1B4°h‹ÍUW¾x€Er»;•¢x)3i*2óÆJ¬;z˜_ÁrX+ °â©·üUvia'¢%ûÕÜæ˜]¹hègÄÍJT4‹ïoßÛÃ< ƒ ŠãèžjÌë1|‡Ë™åX•×yÆbz4¶=£µù¥ðás‘Ïp}#† .Lpæ¯Ï)ßÁ$[#cZÎ[“X¨š¤ÝШäFß µu©ÉO­Ú¿¡Ñ¬/Õˆ£šTxƤ ÆhûâÉu2o‹˜¯·rãt–w¥çb­SAê „Êä/µºN^[jÆñ[°ÝF¤ÞRüKÍNìqñ„®·?mÑÉB9ÇÉÎÙÑUiqóÛÝDŒRÄ™ /m)•‹!’ÚT Án^غw×ý¨´D¿\j&œT—§ùÁVzj¶8yÁóäÖuwž-­•ÝÆj ù ëÖ³Ê~Úî¾xñ=g³S¹?KˆQõ{ÎOvLþ,<&Õe&Å<†Eñ5^œ;öª5©&ùÀW{U‚,nw'ž,¼¾T jõ€+±ë–+«-`šè+Y‚ª†Yt“œ_ñòwXWƒ IÌÃùCÁ²g©yNEebD)³ Ru”‚5`O¿=cš‘b2ž¸o”SÒÐ<Öv²ú<üÕð»ª[îwù¥G/XjÎ ZrÝdâÃcAPžgK€çÉÍø]ºRs@ t$Á˜(ç MxþJÛA²“ÜŸß6¼ÊN-X¤Â,vö)Fˆ¸ @j±°‰Ã]éˆœÑ XT#l¨ €LË'ÝùšQ†r­Š¦ðëg¾cۃ˿Ôôá&ldrgÊÀ§›ÊŠuÂF‰·€ÿ8¿1¼Tš²QœœÒ¸šXØ~ÂÁ_-$p¹Xó¬}Zš`ÕXßÑåˆÍKÿp>×;Ðw0$ þe™9Ô”ó³kûÖËFøû–Ígv`öWNÔ<{?- M˜d Ë_øáX¯]@hÍ3DLÝÈ)ùLs‘¿õéíÚhJâ`t]À{½S²šÅj8èÏ-_3çò.*Aág-?@{F›Œ_°fíxç<‚”­õXW¼ã ã*Äkº>Ø‹áÎ\x¢që›mÛ á΋_x¾Ýá0îŠø…¾íü¸ŠC·ö"Tp #û  ÕXo„rñâ¡ÓžÐW‚¸,Yø Û&o~¬?`Ð6Y8ÿ ‰áój›^:¤=ð> ß6ø©Ï³m65p¡,âÓo›¬AËQ^{\Ïà•ºÃïpTw±úÅMع|2Æ9Š•4%У©LöH¯dQ¥C¶Ø©à˜Ís]Á[§·\Â<‘z Q††jͯ‡ÞÀ˜/¢”îrt;wöm‰ý! xg›ðÙBNwG>Drœ®ïî'@£ ÂVÕ³=•}]Ë9reCEÕdѦp, ó„M³uT×A³,¯E¤ôQA}~±ÖËÙ"Vè,¶¸-iGd†ú z Ÿœ/‘Ò&ñÞ Û*.ô8Á6«‡alðˆ›Ñ¾{Üý"¬9x u=dæ{Bù²wÊ­a¹3oïÄ‹=:…oh¡=6Üå{βÔ1ïʦ¤¸#ÑÄQ)§†{r§|xŠÄ;Ô¯ÆÄI¦Âê<%>Í·G #¯4]¤ jÌÊAG©ú5ÑK„£#ñR£L—q(*¹ôƒbãEŠ ¹OQ c‚Ú¸]©­&/Æí˜O§šÿ-QJ¼Î ‹yjü‘—áTnÆŽsð!ÓÝÞgºšgrëT…Á¨E‘‡ª?«óÈWâæÅÚ¹i„jKþ,‡t„7‡¼E°Å)Ôúd™È:#Õûäožþ«K’¦=TOf뇣.F9f®Å|GsÚò«_Øñár2`B!r_n–#7[ŽŒÍÚóyÅ•{ãÄsĆ҇OÍ"Ó-pvÃ'ê[n(_–(™»Ç&oq¡ û˜]×±!kJš¹Ý{‚e8µc–Ïûz†-TT!wÕ"ÍlÍaÓÍŠžVw—m–9,Ý‚CjéœÄêqÁø1ðËÕ(Ê» _àlÐL«ÍN—ÃÉŸKG×DÇ*9 R·÷$¤­¦´«2ó÷ƒ¿5äš³è”ÿml`d7ó@ÌÓR4x¼åý¶–:|ò <ØÍ)´È¸Ðx#Çj™R‰JÌ©¶C®Y & {'_ÉE\ÇrC€SNµ6ÝGÀú§|¡M>\Ä1ͤ]/¿:Õ#w5¼P½£&VžeÞ ‹B1k«¼1i h&ÿPg€ñ¼¨!bR“kºØsßBžó:gxéHNp¦xôbXsS\†UƒMÚÚžÆ*úð* œæ°Ó5³â/pÕT…ë'9§O¨%Å„ê"@ýFp†uH¹ÜQ ª¿kç)âvöÿ&€ Ìæ!?™¹$Ä!ÿôG/™A6‡ßRe_ÿfôüû£Eö’Ð#™¹-N¡å»±&zéxÁ’2Çš6›Ž]ICCMç š* ÜÊ|¢·3lã '26³“Óû­Ýšº÷™‹‹ø[œ-~ÎWâëý`mpðdvîŬš½myÏNq–±ÑãvõŽèf²Ï!kÜ_…:²‰DÈm½»^ lvgcß>[ T¿dSó‡÷q±¨gÚ ì#´\™òJ„XÝ]`Â;#äNõ”³À>‘ùuú DgH=eÞeΠÂVî; t/ÜŠÏ­:êó°õFÏjé5§\ 0Îü¦}šge¹ÚåÈ)›ï¯q8ZN/R%îj]ð‘oçi˜Šw÷qÝðƒcYò5gC\@ß Èb¶ñË[¬>×qš©=Í:V#š¥tÅÔm zó;"ת ðÛåñ¾Y@zãêS)I‘%­Ð‘Bîúñý·`ó3œpu/Á»YþR’êú … ª•sF¤jœgx3c„¿º‚áÕ~„îÔ%ï4n–Hìiis=Wª„Øìñ w!ìN¡1 ÂøÁkCfa•ju$ÃAÍèHBì_¡·¯QË‚r^ ^ðø=<þ}4ãÉdš%ó>{^*º¿@Àjˆ<. Ïf¹üàœbë–ø­XXÙ,ÃNQ4èÆ}fN•j‡|¤×”Ù¥¦]Cþ†SçŽç1¼.0ÜuN*ìõ ó~Ч–ïÞ_×q6„yäÚyï{­²ëh#; uòJ8Õ³·ùÅd8“Î,B ʘuŠ‚¢ŸM.•˜V³²æ}=y !«GçÜ0m@¶åäá¨bÕå®–ñÜtŸ[ØóÉ .F&bº£s·§ÖaÝ;a~ˆÃÑ©¶úcÏ7]: ]†Î¤uZžOäU°Sá÷>7“NzXêÖJ NІëÇÔî ¾zR ­c÷@kh¬Î"3Ó–¶3‘O& Šb;®±ã8¼èâ¼(3)2 ;‚PÇŸ²×žæMØ ÓøzF/oJ/å;ÜqžTÌ|~sý‹†NceÄ£VÉ<,°dõ›Rûeü®Z—M-Ç8žä[ê€,Ñß'ÆÅ‹?¾vqW»¡ê ’æfZ½Ë æZÇD1V€Vbú 8zÇÉ…lËå®g0ÿÁ€tVØ5ºæ9÷[аŠf8ÌÎvc)ê½äzPÄÉb»Æ³·à¤ÆÁ‰¬üi^¿âüÔøã çëŒFqð¬–2<=—#´3wÜyÚ¹öÙu¦ ø!ÐÑÇW…)› õw_ßxu'+;(,h½ð¨oÖíœæ¨ñO@Óè Þ¶èxÂ?ÉK¹IÃ+Ï`îÍëbè”HtÆ?}Ëå§ò…a„¿¬‰ƒäæ}iZ\á–lÌù:rÏ‹†‡¯‡ž„™S²žúô®GNÝ~Í}1|S™2Ä-òz¥:Þ8ÍU¿l ð—›?– ª®Y²Ïý*ž+?^ɰz|zâY'Á´sHr¬ñغòŒý.³ ´(2¹‚k¨ÿå]æ7W7 #÷·¯}.A¹{:˜6Ë˧ùÐ,¢˜< ¾+årŽ3ŽÕWÛÃð‰¸£yótrRÓ³9¢2ÆàS[KvëÓ»<1†]²üÒ\h[[£>šgìË :Ê ag?æóy–…2" ³Òàá—|¥a¼€Fu…0IõO”¿©­ü+ªùnÓ~rr:>ŒºôF<Ý-ëÚÛx&¸š ô›Å ó£·ð­¯y ú>9©n½Ù¼yÏûņ›bAÈ“jc•Üßye‘.‘̽¼7â-¤´sm×mgëQ¤á<å¶êX˜‘I¤–5h+Û àœÓ î<©Ÿ2-ì3:úàÐê“L”‡¼|Õ/HL Ø Ïî²c¬ó»Ôï‹æI$ô€-gw59ݸK¸L"áÕ×Bü9ãÄ-׺¥ª7Mró< 6.<Çì3ÇÿD’¸ÁÎàs·<ÍYâÉjL-.d±"ã­l œžAˆÚ«ÝWWÆ< ­î& ±Ý­J$:ꃜ™³T4D†Óis!ê+¼ @Ôëè/çèg—Ùõ—q’2À©³/ç©ÆÄ}\¸9±,ÃÙ\prO4_ñj§9=#ù3Ó9yÛ”.¾/_ãÑ4|-žl<ðF¨›Óúf€1H©Ê½åÛ8ÎPE¯;*ÝÇBy9iN)&¬Á`:QûÂ8ª+ äýÐg„|«§t •ë,ˆ uœþÏèBg-(‘bµÌ''Ì=êf;$¢µÀ”¥'>QÎe0S¡& ÜDz„ 2r_´‘rÛ+kmë·T »6Ãè¶mÊFxßzg[?6Z-Aê¥x²ÛK<{êñ“òŸ¯•­¿pOnONF=Àõ#ÉÕ`ášú—™·Ä½èVã–„ÞÍÕçÆ‚KÍõ ')Š;s‰TÀÚ6 ±cL Vûz=÷9Ë®Õa°Uj;q}¸LCóãîàŒ(#eÚ¹zÞìxºûÄÇçÅ‘j;ãi¦ŠÅ),ó<»q‰ ›”Á+»€ÃAßyìÖ­¡«„:!Åç5ÔŒ˜dA"¸{ðǩٽÐ^¸Ïár\¡Eç7䢽c1YZwÎoý€j><Å.FplÀnK¿W¿Þc ÏàÑá"ó¼ÑˆÇ]½€ídiçÚ¼Ë~ïYšÊ[]ðàM㉪–^>‡·2:¸>QJ›sŒá-ê‚]¼KEЬ—ŽØOËWîÍâ+Y:læ‰ø,wìc;|¬ä‘5ŽÎ\lbQù¿q+N‹Ñÿ™~>³ªM™¾†ÛÑRnÿÍ•,ËÿF{üﮬÿø3ayþÿuÿ·•õÿ °\þ¿ÐúŸ+ë¿ýXîÿ¡õWìÿ§ÀrùÿBë¿®ØÿOåþÿZÿueý·ŸËíÿZÿuEþ?–Ûÿ/´þëÊúo?–ËÿZÿueý·Ÿ”ÿïûz…“ÂBÝݽýý¤¥@é :üÃ6hþÑþŸÊ*Kûª© TUÔÕWÖÿù‰ -ahi`çle˜Ú™›Vöúf IE$ÒQʼn4´3\º ª„BvaÁáþ$ÿ`@$ÒÈBR—]›¦ºÚ~o]í Éð#‘ˆŠ„ÐÿHIP‡Á$E»h"AðZ:Ó‘$¢Ht­ÛàåçN éø‡‡(b0jšŠhM’?) kAØü¶ …@ÓLšb~ÓËoj©j%@[¥°¡/cìEÐF.Q`×ôÞø…|t$•”àÇ;$*Ú—¬ä. „u$ÃIÑ„p?$ @>¿²GC —zæâ žI(*&„`B˜‰à xF†Kä´’ª’* ¨âxûGôU4t$Cýƒ½ Q’ºÚ(YÆm“dºYIꚃ‡ÒÁžáÄ V¾`7 ¿֧‰äŸVö¢iWøŸY0'y‚øo‘ñ ñôü3ÿ„ÿol´qù]0tÚHPÒ4@ëþ#Õñíüm¨Ú¦ÊÞ„pà+/€OHð­6ð•àçì *²¯–¶g˜.ûwŒ—3íí…ôVñüó.K„ ¿±µÔ­`Ðú§Dkh‰º”»7hÙþ E˜‡„”””hìÚDðÏ+Ä› +õµ#€thDiÃ8DÑï2þ<Ë`ü—¶›þÊ܆TÉÖâWêHz›ôÁø§Í«ƒô7“Üù]¶ÿ8RAzk ÿjÓô¿fcéò¿jœ.’_›ö&  b{Eô…{èÊõ#UÕkk{š¦«íä „‡y}Ï'ZåoÃß÷ —¨Òê„¿Ñ©µ¤¬†Q?ªªj µ¶ÊÀóWºòCòU4JSAU¥Yß5Î<4 &yx‚®è;iy‰ÞÞ Ëùí<œèáõõœVT8-"—¾hRBÒÉÐüam¾[Øï~ƒî1ý”u éàäiHÇŸHs÷ OTÖeÿ_â—¼žw ÈH8&$]moðÏSAòÃm¤'mf {ëšÁ àH Åé@ºXâ [ )D+¼¾~K/•–Lì¯/A) Htÿƒî|I°Mš(¼ÿ’9°*8Ð˹C)¡ÿ¦š!8í-¯£ŒB£¾«cççÃB@ÿ€‡ ”Haþž´èÈ? "õ !ÀàO¶ûžš?ð‰T@LÀq£©¥½€³pq668 ;ç &8œàUB$a‰Ž1Ð$»Ý# ŒBIÑ@ˆ`ndc` âãô7šm´s@=1Þhgadk [Ú8À gc·ÑÀÞ gF¶6V–¶FJgº¢ôó ±þ Ï ÛˆÝf¨~ú¶†=<üvI °%èì„£Aí[¦±Þt®é—-A×kjµñ÷GŸ®Ç`·¿R£U=\P¸h3@¸ h0hZ°èíFÕžÞ²Ž¤G ¿o°æïëGÚ^ò Ôý=  ›ƒ8b ¬ UµT4´Ð(€&)z‹ËÂh0f] cØÓEZ¼®…Dnß¾]é[p j’}5 ö?Í_é~žîO¾–ÐÎ@vA ÷÷ö$|? Ð]À×@Y¹Ô °h©³4ò5Ʀß讬øs`ùóß_hÿ—•ç?–ËÿÚÿeåùßOeòWÿ…öY‘ÿOåòÿ…öYÙÿã§Àrùÿ:û¿¬ìÿñs`¹ü¡ý_Vò ,—ÿuÿ—•üßÿ,“¿ò/”ÿ¿"ÿŸËíÿ¿šÿO_ÿ_EMu)þ[ñÿ?þ(ÿßÿ¹°Ýƒäåçâû?Nûø èI?ÈÿPG«ý–ÿ¡¦ ê‰2JY]c%ÿãgÀÿ¾üoz¹’÷±’÷ñ‹ä}üP%ÿ6ßã[íð/MZ¬ö{õ8~ããÏÿËüvé?—Ù¡ŽôF«þåüñ/R~µÿG™à hú|Ç@ ì׿l~õ—Lâø¤Ô`¼¾kœäD@$ïÉÃÖÒÿ}:É÷ðÃ4 p°¼ÿU”ñïf|ßÚ¿Ÿ5ò§Z™c¡þ-úN˜.‚Â(`TÔÔ4Ðèç‹€Êâƒú =ýyŒ2ZACYAS£ ‰ù!uMº÷´áG­¨£ÔÐÊÊ à]˜ZUó?‹WÃ(¨€ËR]þ7e¢üÜõ¿Ê9ù×M’B¼Cèd¥Üi‡´0[YMR×<ÖZšÄ¾Kêòˆö$á!A„ß;ç±4!ÿ8?d%çe%çåÉyÁh©ª­ä¼üsX~ÿÿ ½ÿ¿òþßOåÏ¡÷ÿWÞÿþ)°\þ¿Ðûÿ+öÿS`¹ÿÿ…Þÿ_Éÿû)°Üþ¡÷ÿWäÿS`¹ýÿBïÿ¯äÿýXnÿ¿Pþ÷Šü ,·ÿ_hý‡•üÏŸËíÿÊÿ_‘ÿOeò×ø…òÿWäÿS`¹üüÿ•üïŸËåÿ åÿ¯äÿýX.ÿÿjþ¿ºªŠZ­±äÿWžÿþø£üÿ‡¾p$!˜íŽñsw÷&|ËÎòþ§r¡ øùŸ(”ê䯬Œ¢åÿ¯äþçAí©¦áIPQÕTñðò" T=5Qªš^>h oO5ïÿ6+ðŸ…ÿý{ÿagÿªÊ´4mý÷ûÿσ§G8£g«†±Ó’µ€µ“Ú€ÞYA ¨¨©+`Ô¾ÕñFzc<þZ{¾½>¨ª`”Ñ€š&FAUã[EýµÓ¿ªèîíAòø¾º2ZASPG«+ •U¾có½ÚÒ’S–+ïW®QÊ h5M@…–Û†QÿVôVÖøQõïšÛŨí£À^ ÿ?Y äŸÛ?1Ø÷¶ñ7ö¯®¡¢ñ'ûWS]±ÿŸéV&\ìB4mæÚhjhÃÀ §¡Là·žtï*ðGÎÊÌÎèó—/&&&kÖ¿00\ºt©¡¡¡  @OO/!!¡¿¿ßÝÝ]\\ÄýòåËÃâA2xÄH²±°eÀ¾éöI{ѶúŒ::v¬5üžÛÞÝi×l]ïë6%¾öüújûäšÛóÎúb¤UΧ¼<#°›dÖdF•` aÉ„ÚtñÛ^‡u~Ù<_ƒ5Õ¿Ù¡gÕÑÚÓ¿Æo—n|ŸbDCü¢èâöþ»ŸVÛ ‰œTÅlò'î8 {’j½)éÄ~“õ\Ù6ÁFèè §àÊÀ“ÔË–únù,&Îü{fM™ÒX#½“eû*Gãø3MjE!Sv-UWÎ8Ê;öíXgÑ|'afòþ“+Ê<¢½¤Ö¼Ý†Á CjV±ŸºQ¸5%¾õúÕäOT ^åæ,ò3¿ÞÙAe=´orWÇ{Ö/Ã…ŒúŽ^÷+³Þ¯9æ-/º Ã_¹ŠºK;¶½îÚéëLY»V±<–ØÄ!b®P,Ú½Y§ë÷d¨ÿÁ¥Ï–‹Îâg6¼i´¼ñ&®òênfW ùš}¢ú9¦û£uâc<9Üåµá(k<3H ÇíZSÄtçÍÔÀ9Êîqa?çÙŠS¯3vß¼·eÞJfa§^¾£þž#æÃ§O¬¦±ïZxˆ³E s¢bÜ=®Û×óSxÍ8Ÿ¹}¨O…ßã’…Þ}uz{ö€cúîLJë Æ3TI+.©ñ…Pª¨ÂÓó FDáÇšæs¸ïùú‡¶¸ ¹ªäòìøˆÇÅPWó “°£ýb[pRÀîª\ècã¡[þTê‡bLjvŠˆníÖ—ÊN_¸-ÿxGÓ½¬_S™ÆN‡¦ÞÁ°¹/IŒ2ÙB÷¯Çù*ÊÈÑØw™: åü:Yf¯/É[Ž?Oy yš•m=£Eíe µÆtKëLÄØ yOUwX)\kb{}1ºNé“Ù5Óà¢ü(ÃDÞ{æ;¡‰ya úkÉ<ÝÆôËýþÍsI¼$ [*v/5½¬´è,Ãí±ÏÄû—>İ “ï»ÖMÛ€.´Pmcçq–”M·ÏÕgÕq†;¹¦B{ú8¼ôc­WÛ5Yy:!Ѽü‰âÛôãªÔ§@¥’fÉG]¼îÃRg­/êPn·Ö«¯§Äšw1h{oðTø<žÅ£>ÑÞ[êQÁégcè±Æ—_´³8H&±Ô)ºК Q¢º«šc'+®]ØÞ¹7˜. F~º–BæQ±Š*fŒ ±×p4|L·oX<Ÿ[ëM•?\»ë‰’l.È’fáÂÌÛ ²¨¼“¸¦bÔ±QÂ.i0òxâG  S'“òñy µ9&ƒNŠÄ–vD6êg‡†Hª%‹AMθYÛ<ðå~£o4§g¦ÿèh•o[¸¼@ú(Ñ1’°ÏÛç2 §jVZ\>OŠè¼z€xûêu ±R¯ò-†ÄíðÑxX/Vã]hwl@ï‘Q!‚ËþG(õ¨ŒSðéâ¹ðÓh>g­]wêgÒò»6é]NÖ®ûD=UÌÞZ5û$Îazþ´ÚC°P©™Ù‰«£ŒŸ%šw,#–K©k/9âuP\ÍÞ± î«w‰—’¼¢>ýq—Êxr´´%³þht€Lh¿¬ïžÍÇñÆO%SWÂn>†»œC¹Ü†ðÃ5U‘cÖ™^ÜÐv4 "~;ÎôbÃP¤2 ÀŸfï}òÅyKÙF|ëM.zƒT“Io4áɽ×cÝ(ú³¶þæçÅ"í{Ú£_MŒœ½­y[Èk /Ô˪T¢vWø(Sm¿¨›K<7‰ü€'þù¹:yZnï«Qm{ ´–ó`üšFEL;¹[~¼"Ù}„s¦Y¹ùCÙ[#U ι]ëH>XP’…š[Ç:]<}îD¾©òAŦ…€µÜ/Í-Á‘/<×üÛ'kI9œíb³MË=ú­Nâ't{Žº˜.íý0oH+s±¦œ}0½¿åÓÝ™fö–S)‘ªóÝ¥nnÐV_v¯çв¾kã›×k}åFZ:¼ï@Ò©Q#ÀÈ36ÞŠ¬œVx_\n±=y¼1:Ž­»O·Å†GÂø$ð Ö,¤õÕuR¯ÑÝ8Ò:1a¡é½­)Þag kÃÐð0ÏÑŠO AAã×Ö?ë~ÀÍF ›¢5êÚ#µ2â›zfIV.V£z÷Ô gv*Ú±W4Ömø”6#Ñ; ®sð5ÔK–(¢;mêÖê<úòì6ë–{#Ao³{N<ˤÚÙ·b=›¾Ä£ü–IŒ3ë(7óMµC¯<™Ý i;}N½bAÌøÄå%ý°»ý²”¯jXtvBo[8ºñ?.ÍLKÖ(ñ.|üàÆûrö¿øÕZûCˆÛNªlî¶Óx«œ^Ö‚Eý=©¦4-GWQRŠV\ô/y,mˆÔ:Á‡âQz~ÉÌJBú¢ÑÒ©ÓÝJýo6!UGl§Ê¿pÖ9é™zÜJârdÕ•ˆ"K«¶¨€éŸ$« []"¢¨Ù()ñ!Û5QãÒI˜É¨î\ÃËEx,¸…½Ä5¬&Ê™gšX_†óžäG(ÎH•çk!É‚¾J8K3‰õœt'§~\ Ý;é~šíqVo‡8äì$Ãww  ;Q™ÀܸÁäýšm*Y4Ò§' ¼}·OLWÕù%H?&ÓÑ<³´j×êtÃÚ®jœPÕ[™¹d½^Ïx„õ¼U“¼7¯*«Fºì|Ðco?pCñë[CWIƒß¼ŠÚpFqÉKÜKU«Ôé ½ñxê=IŒ2Ƕ1ÜÍž5ôE‘ mÞM†ŽåY…lj¾v–Ã{ˆà«(½K L‰W‰ŸÔêêß  ⑯ˆ2ð>ì=`ä*i”L"aDZöËQìxÃG!±ä2™„¼›òôU+ø”Ç<ÕoV{Ea&T{„iqh/q´>RÃY¥Ï­‘»»‚_,M‰ÃðœE^9ÝÊÑšSñ/ÍБ(=ͰÀÝæ¦b¦ƒÓ^GVð^Ï›—æ4ÉV‚ æ¤ZË™ÍB·ñ¶ú].™ ý®Iñüxø–GÂä´× µ‘=³Fúñ-'¶»7‹‰x,MãQ–//J¥0\sJŽ.Rp[pÊ¥AÒˆ’êÙtÝÔ_^¹`µp¼Zêq›Vï¤~ã@S~ì©åÛÏ©},;/”<¾ûɵ4ÂÎ`’úìh¡§Ú«s¥kfDÏŽÕ…Ž óœ#{J`›ai¯Õ,U-ß!CqT'ÜÜæõ»ä+‘Lx™B4yæ™@5IÛ öεŸ&YMu—ùM^8ÿȳkŽT§Ë Ò‚Œ7ûÈ ŽÛ²b=£‚Üóu”“âpâ#ìwÓYDŸÙãÑ_ЇTá5øxÙ‰²‡XœLèÄÿ´;]og°/ä4þ¬ tLGªŽŒ>™pþª"ƒÕ‹ŽËœLlê‚›ÖùGSoøàí] uæÄ“£û”“/§éÖ¸I³Œ¢-É婎gÉ R¢  Æ£÷iÄúV?͵ÛèªÎ8":ÃKCñ(z„5Œ¼v¿6ÀM¬â¶£}u"ü¬g[7ˆ”$ÚºèɼÚCßJC›ù€4±p‘¸¹úêÚ”[J-cN‚4 çF5xÇy°Yµë&Xh}n ’y̙˂ÿLE9»Óôâÿƪäß*(žØ'•åRkëô=XÖýÛ9f¿]ÿÿG¿ÿs¸þþýû¿â??þÊÿ?ö6}þ‡ñž¿Â'þ#,,€ã¿ˆ°ˆð¯ýŸp>Aaa[a;!A[qA!A¸LXHH.jË/&j+òCTðüçàßÐÿÿv¼ç¯ð/ôŸŸOTè/ö_Dä×÷~ üâ?üBÜ‚ü`Q1nAA±ß[‰ðÂìEþIù½ (·ˆ¸XHŒ[”ÿ6¼0á?láàÍg”••Ó?>·æãç óázàÿ#lÿK:O¸‹§«Ç­„žkDùE¹øþíãÿçV‡_GðD¸:ÁþV@ì°a?w ŽS’?$ËÆÅÅËÅyðšñ?p‹âš €Eq¿EÄo*zx¾ê¿Ž¯üÞ7 |8¢„q+ð§ýî)píD¹ÅøqíD¸…øÄþYƒÛþ™!^ÎÈ´äà ·Èa<;^ìÏß!ÿÚFLü°0¿Èÿ#°ÿÿ¶ÿÿýxß_áûöÿà£o²ÿ‚öÿðû¿ìÿÿ÷ðÏñ¿cÐ#Gð†ãèè/õG¾‰ÿ}9r„–Ö­¨¨è;ñ¿4wš¬#߯ÿÀG~ÿu{ŒÖf¼Ý1+vHékø(­üŒV7"¹{¹ê~õú»ÊE„øÔ‚áPåk6À®A¬-³JIIñúe•4@@´MMÜP£±›ìï$Ñ£ÓÌ»,7™}ªíG‘‚O|:Aõ&aÿñ:!>ጇzHª&`a3›„I£BÔ±B€‡ÁÓÆù,~Á‘ ­¬Ä„7{Æ”æËu³@ytPFLP+~·ÜA=áÓè`¿8Ý[Ö9lÅH£­È„º zgvVwž¬©Vòu6ï—-ûÕéÍóõû2ºÈK¼Ue wjãVÈ|/± YU^̆·g0JlŒ[gîíÇOEý¢è#Ôc‚ØÄƬ±´ŠÕ]Çðs¶ZÄ ÓŠ / ¡\TˆN5ô’hÅ9™rLUö]Þ E^õ–êuÔ¸Úì<Å˼ϛkg”GzZ@Àôé×' X¬Âb¶Ú$Y“R CnéNϳ$OMD½¸ …ì¢Þa­òÎÊ™ÀÏÁ´hÒÅëjÜSœ€Ì.º;¡¤‘¼eI‡àw}¶rŒ¹ ó o@ñÈûF®°,£³Azã b²êד^êlhZ‘_& –Õ 8y/œû84#?t36$õ<ÇݾnÜïâ¼”#”·2†¬] ÙŠ/‚•Îûç?”J®£Vd¥S5É!z”ñùx&¶Ö†y£6V=ŠØð5WÁ="àbz7T°¼fU.–ú^”’Fµw' 4îT*tƒWè¤ÏöKnM­r3'ÆŸhúÕžÉ%Œo!úRÎ ‡¢WzJ×ð”N!„ áEÔ®Êij,LªYNKëŽ[£0²8ë§±ØÇpÂÀŽðºâÔÕŠ»c¦/øÑ·û¿$c%²ŸÁ4sŒO¶g‡ß  ŠÜ·û84u¡:< ‹LÔ)Œ[ bDP‡®²3å°Ö\2ö•¼wŽÙÁsðzBÀSƒ‡Î(Ïg~¾Îý2o€Âò¾¦„˜*¿‚¢ý¸Áˆnä<›¡Ë^húšÜcu·˜ Ôâ L&Î…p«ò[Sœ˜GE5~øÃûy˜µ§zî]ÖÕÎD€§N¨*¾ –ˆ 3=€ºF¦ç˜¨L…XE @ó«˜QN§€Oø:¶?χS#܉nfâ[IŒ!  ]dÓ¨×\g”B@iþHŽ÷‰„{ê¸Û Ôç8=N$7+IJ”ËÅžÜQiŠŒ•Ÿ¤ö7ùHxxI„Ñ8n-ÍŸ7hÕå_C„Áke¨YJ<Pôü&Bž Ç€Ö]âýkÖúC÷aYIçó"$?“Go­j†2p …`C¼“ë®SQWš"I€:W(“#?¢ã¤ŒÊ§¢÷r ²;q¬Û/®•µ©‰¢+-µ.n±Sì9\¡óÌÎZïï’Äœ›^b_ݯÊÝìÕ8.k± ¾Eä¯P, ƒ*A¥ü@Ž´Gz§ÆÞO3ΤJ¼›²aÄ+‰™öX´¼ypãÝ]rKÜ ‰)&Ð]1Æ H6Á! ï˜X\±1G‘p˜Ó­<aƒù·L’N‡´vëx,( • ñÑ©DC¦wŠûÄ„™Œ‰(‚%vSyãw#‘ '׌°%´å÷¶æm ¹÷™¼ºY\Ù d‚kܵ›}—‡&ª""ÆÏ@ ”K TÈ6ÎIËq‘¿›JŒÕÿh T aŒ[H$dfaÎë“cn¶´ŸWøz•GäxéGóíÉ•r°FÃ'ÔL"Bîܯïëí¦Ä‰(~&$“¥VõB †kM ä\a¤…¯øÙö4ç)+îœ^žŒ¢ÂŒnf<ž®,Oohˆ23î5´Ü¼F ÄŒ×bºz8eÑïØóö´úÔc8SÆtÚ"LÈÇÀvCÇ ­M3 ÓcΆ;9sRkj±óÛ3Ú'óˆ Ø¨ÕÝÒÁ5ü;—Êoe†˜¨h¢`œ¨e¥ÒP1Gcn¦wõ¾ÕVc.¦ ÃLµtûå¸fðczÃTÌÚ‡>R=·#ÆTêÅUŠÚ*¥†J«ìP÷÷ aºÄB2úÁ¶±\ UùÜÅ/eò³ß…ÆIC nšhM´ÉÅz Orõ|b Ìï`ZÇÉ‚šlœI*N÷ôvïéoT£¥§iŸ¿_fÞUÜN·¼+dË–AT®Ù£·Ó#È¡©l¾'²ùÙHâaÂtéCWïrË ËØ?l“Z\À§4u²+T¿ë|B•M;Æ¥‡Ås÷§"$Ë”7¨‹Ù¤–ÇëÇçt=|Y“zëJËÝöŒªÛµÁ'DqºpA<â¡T¿Åà°7ýi6þÚ0:EMõ¡ËbrÊ®ŠÁB7;&IÔ2@÷rõÏ '¬ú·VT"V)×gq}D‹˜¿~ K;ú˜œ¶`ÐæÞY7í>=…ÆšA9cÐËœ~è³+˜áwˆ èûNBùxfeŽCÃZi¬ÆŽ>¾m «âžtä(¬*c­Cí¯ RtFl`zL,Àqbæ{ÜŠÏ,uu“jóV£t†'`,ÿaê*9+ž7yý¦¿R>[ é‰xkP`¹Y4®° ŤŸw“îKÞdÊD'­‚¥É Ïfã3)‚ξ¤Nèn™†B Ýv`"$ºŒíII>“£1«:1>)™'W멨“f±)TyÅ %Jø¸"6EÍçdDUœ‘9r¥œâÐG-qŽhO|áÔ¼å+Úbš™½j[’rÚ¤®³rÙÒÀ)©:fz7”©‡3ŒªÒÄpø$Câ½:§Gøé¹¯EQ[rµïëWWn:”ZŸt¤(ÊŠƒ)«õT~‘/ GžN<Ç”7{qÒ–M£´EFLÆœ§¸ Ylô'5|´„ñÊCg YöÎqŠ 0vU¦+ÕØzõagɵTXiùÅE_R4yÕhmvS~Ë-·‰+¹w½úé„Ù?¦|&Ÿ5 ”)(¤pé75…¤¿<#îBB= P2gòÞÌ K\u§×2y˜°n@YSù]ZUš9ðz8¦kì=œ½©•Ïi*v»i`£Ì¤ØJDéC•6ãNqºúz‹QúÃÛCz¾J7R«ùØÔ¸×ùw€kËé–ÆØWš¾N¬±èk¯ź/›Þ³É,_|f&D,Ìc»4ì¦÷Î4˜B*z^}ˆßñ‚ŽcÒ[òBAˆã…©1¥V3!ü~¶ƒÍ¤Uúü]Öký˜ôBÅWší\iÛUˆ“%ò=[ýéïÙ‰of++ö­Bg56“Ötïm³f”Œ7qP BÓ2?è.•Œ6 _ëZðE&YÞðê>¡yžKÙK3V? °§I˜i$%­Ÿ¨0·G˜MphxÛŸê±½d¢³0ûÔÅÒn+ØïçØ$UoØ?ø€ÂT'?|Jk™Ì>Î¥ÍÙäö§ÄÜ11_k[L»D«íÿP¨I@‹˜º¢ûµEšzRêrhì=aFÿÅTÁ‹ qoÞÂ9Ï"¨¥÷zîÈ]ªäÞ™ ÍT`¦—39K{uÐÀuÙÝš¾í°¤Û9Ÿ;%X츢ïÕÔÐQjD±¡,DÏ­¢‹µp{`^ ÜË‚¡‹:O ÇúŽ%䤨§¦Î…ra.§ô zþ¥Wa4³õ룬šŽóø]K×ïœ{¬ —r«Ï&Ì»•[]åW¤Qx!©·LXñ¥”PEMWá»CÓmÿ‹ÙÁM-ʦb»Óˈ-–A R óï=édÇî V˜/íùn×_^•’؉Ãùb$ÎUæ–…@ù»Ç>˜_h¦`¿Jš+ M|3‚ •H&{§Ù¯¡éUÒʆwÕË YWS³ù©™ë5È“¼ÍA_>ˆ’[¶¼.’ä¶,é%UýØöYª}Dd"pCª …¡û³7·;ž˜4]ŸanJ‹+äpõð¶ÁG–~fÅ«ž³Ît)Dúîp‘PÇ^, ¬'b¬ßC‰1»O:ßÖ¼9¾èýÞº›rW~ …Iˆù2%åI&H"³|xñ™Ã‹,†©•ªl–9û)ŒÓ›Æ[I9ønuÕÐÔˆýNO©PÂ-'sø¬‰Ji¿,ñï¡6ÐŒRZ40½N"Û8r§MŒÞFÑh´L%7O¹ÊÜ+ûf2Τ2ž'žæÔösdI­yª;‰ì׈߹½Ä`èõb¼L(<ö4}{l­ó8 VGÝôÔjvˆœݘÊä·ê›Î4°Ù421öAò6¸ ظ\@èÈDUÉÒ$}¼à½Œ†éÓZ[íú„¦ÀJKh*†ÐºtÇùîæûþkÔ©‹kÀº‰ wn R Þ§¾d›µÝ³·mÉeÈ5ð% µkPB®Þ‘c;ÎVÓ­íV>ÛÓžM¥ÙÆû ô£I€û…Ÿ›…›ur"„û†;ú|ž[B• 0ŒÐ»‹«! !# }\Àê;k7_XijNŽëóÝYƒé77ÊΥש`°¯×ŸbOt¼W§]>»·ÔYí¯ùÒ^ÌæÍRÍ$IÕqתtk¸Tb\OéG3‘ÕüÊ•ä<×úVM…žøÛPq¨ÿà×J¥>I¾Ù/ÞÊ! biæe7oúŸŸùÌl?g±’ ê­/ŒE?©ö}ÁJ”ü‚ W+˜Ë‚½ñKMÕ™HñSßÕ E0èÚòa„ôJ¥oHÄÕ±òç€ÂGw§ÔA›¦ ¡CƒÇÌXg‡˜ýÓRÌçlj k‘kO]hÐËê ñ½5m® u„tY¿ÄÔòòRQK’“íœÅI¥áÐì Äјg ­²«GÐédn£Y.4­dJ4Dc[‘™­üܪòrêáðtŽëˆÝ­Ú±þLjOB‚æNð î ,E³‚ãÈ$:§`t$«Т{ÂYPo·!kÒôñÇÊÁÔjµTì,†Æ_¡µ2-5½,E;ë øç©_ÔÔôtmJŸß#ïÄísª·òê®ë(V?Ïï‰d»Ý¬7“>¾É#[´>~u\ Æ…~'eÌNy¥ÍžòãµÔöZZíx"cBè®ÀU¢XuO (ÝDÔúÃˉTqÚÄ7wH¬@$Q©ÖkJ(káçN‘¤T6™Î~¼x«Z í¶T?ƒ7ÜÐÔO0vÄÕܾ‡‘«ƒæ|AAUI z3Gá+/‚-†‹Ö$÷Ièû@n¶§š„š“C[SS÷qʽ+¢É©×bAÖœÜ9_¤rR.ø‰>¶P -¦8d§ÜDܲÜO§ïTJ4+êb ¥ÓbRó~á~’Z@YÓoN#?5¦Að陼ì0.mt¡ÁݰßÀ™ˆ²/(F'O¡QÜc}qȃšFN½»¦-pH] nf(ÐÓ\gfήˆuŠ­*×oQPÔ]ÍåZ ¡J¥…^¦³Q×ËÚ/ƒ˹ú‚ÓEŠWê „êÞ»qSß@NÓ©Ëü^(<+WᢘSõBáfÙ,#',*5ïñ°âص×/>‹²ˆ½˜·óþÓD˜U•¡‘¬i»ÖH§¼öÚ7ˆˆ+ê-MI‰¢`! Ÿ=~bÏQ[ôyõ}ÃU‚œ(©»ÂûýÛe®j´¼F¨‹EÊ;:14‹‰½€¶wsšŒ÷Ñ¥QvÙQšwqšì÷)TÉ–Ã…¹h è)]n!¯nÛŸâô©ŠL͸v)ö½Uqo£—÷ Ã©í³å\¶q6¿8J‘ûï^ª«i0ë–Q¥Üç²Çd¨ w‡ƒ²¶OÜ Ü÷¨WB~ ò«›à¶ R•z:C¦Ó¬9o˜Užïyl©bX¼>O•‚*‘·,»: KÊ8ñÅWJ6kfe ‘…›Éûë‚WâäKiæÅ·ß­÷0gŸE,ÒÝÊÆÈÜÖ¸€Á––Õe`¡¹ƒLã–NÍ—šÚ¦Zõ/O¯œ"‚‘D¼¢ßS+ÂïšãU¾ ΤŠý„¹ÓeyþDj«Í¿©ÎwcW¬qoÎ8”E:«Ö]¬öeK?{aoIžÌ‚ Á@QÇ×ÖÒŠ ÍÕ )¬^¿Ý’x¥Eù£ziÖÝÿè…Ø7èÓþûo@hÙ‡›– šVŠ€}cè{V÷:/œqÛ'Œ$íë–€¬sÔœ„X¸8cfØ$*#LØ ågǶAÅñ&²áS3‹~ŽÁ›â2™ô‚*‹áÆP‡“ƒŸruŽÊ½«tÚ¢³JEY&@÷úm‚|¶(ÁÆ£ÀxìÛöѼݜË|åSŸÙMn#XY YÞo:$ ý6Ë<ÍVI¯ZÕšh^ÄG—>â7lëA ñÁùá…¢¡CÁ*N÷ä»GãtnšL n]WEè8̵n{_Ç”l•jl;¢~½þµÀ²çC-‹Qߦ'‚ÝüŽÏXb‘­Py®Õ°9åÚX¥„Íù@ç•dl kjÿBÉG~Û ô³‘}—‡ŽÈ ÍE­Ü]­Å›Ïã£i®gBO,Ša¡*³6/ÝÈôaBõqfO»¹{ºá&wl v³âèzHf*È‘èZ~ÏòËèeRHñ;¾¦"ãYA~Èy‡Û577ËÊ_*¸ëR† xÞ´Þ  Z¯C@Ù/ŸS#Ìx­A¹ŽE<ñwe84\içðí§0žgHçÚèú #ˉ +2¢¿u}ÑëUOZûœ$Ç>{ÿCʼÕK(÷liû…æúôøÀ2êbTÈ©¼È„|á×”§÷ߘ&ð§>üÄ‘ó…>?¹Éy€»®ˆ¶Ì­„8O5!¿ÀP *]š¸cZ¥8sÊYP0xÊCò±ÑA²K—Sð$Š×ÉÍØ?áOÐlLá)ŠûO^„jwI©•`¿»^štòÓ3c(>MAßÌ)™ÕÈ3F2i!ˆð8«¡ªv ,;x:RŸU´¢ÜKØye8®þ2ÃËÁHîãdãr¨ Å£Ö‰Ï‡Wð,ÙI ßÏ’c™Q¼}ÎÐwWL5âZ©R=†/„r@»MØ?Íž9¾@6úÜÖ:&U¢bÙÎL‰/Ò ¢°êŸy’MÃÈd°ÂÖ2«Ar‰1}kÌÐy Vj€JbE·BVâ`4KÆç Põ&ðkv‰`Æ–GI½çûÎqäxxÇ €za<ቔNa nÕ¹1œk‡ñ0Ÿ¸Ú±QÕLKã —Ä57ÊxÈrL¹ ó…„_Ü–Ûß«ïÙ|¨ÎU0òíxh'õ–òé3¯.l–Øy¤°AÂqÒwy‚iOMWd^|Ίn‹?~}>7b„øÙÅ¡£‚¥Y(!_%vtx#kkíGdì0§µ rp‘ oòè@Mú`ô–{»9éÖe¿¼’ñk·/.Ðwvi÷|g/§± *µ%µyÇ®|3wÔMUDPÞ‚Ú\­oDm‡h,Y·Î¶ûÁHÑë§iÏ*¦¼Òj½¯/¤š§ëü´ìü2”ÑŽŠ,ÐÓ¾¢R¡…'¨Klú¦2ÃÔhâZ`ÆVÃæèVþô ìÔ­çý÷RAȈœaÆ)°÷Eß&)3ë/ì­böK)¬á/YŒ®©KÅÇ g›Ãh¡5#ƒx;NÒOq‹–€ƒ*w#9´l²2 ­E0]îʾ´ýP&-bó'šÀ_‚Ùb*W>:Ë´œD›ô94½uú$¯Ô7ï}uÃhÁ,ˆNe‘³ûÞ¿¿ ¯ÿN•s¯_è¦I8dŠ Ó|@2§£ÐCìUÃßaˆõ,]”n š¸0¸c™¥CÏ GDxX×Gb ò\†áÁÞ>¼h@çÓ,Ñ0¡i#¤ÔerÜoÕ"c®ZjÚ P„yRž}§ÿŠ2±U7¬ÂÂ9¯6Èô­våœò;4ÿ(ñ)#¡.J½; …UÆÌý{S.”Î"Ä®¥ƒžø^MÙáÊU)*P‘FWxÌñ­3yÊ*WÎkìpâ&…<º|€ÄµdK5:XûƸ¬—õ@ýO}^KÛ¶š§ôU»@‹Œ•>?y¾Ó–ê§ þâ–­ Qú¡òÚ­ØeSSvô%Oê}©åóèUfi9䌡î±R~(„Ù0HÆJÈ)»åqÍäÃn•ˆ=r¾mŒp_jŸ<˜þ$qèíü{åël%/¢˜÷å{\ ê¯îl€upÞë>væó*ý˜‹iä§¥wgwÝéƒ?í¼nþÀþè§Å¼šm"À„l©FlôXÕ4øÇNï?Ù!=¨Ì¦ë·Éåϯãè¼"¡<÷Ч]0¬lÏñ*ÓTXîì}î!¢dË67E´¼ÎQÖ@*;ì²$újs1Yq~¸©}}áòn(Ç´*Îl·PíÕ~ᄼPß>ZÑ|ï šj9(À‡ÎRMr¦(Š ¼5^½V1–ç^È.Ux›Õ¥”ót¡IKwŠ”J§hêÞ(§m#˜ €ú·¼Ò™ô:˜«æÏ÷÷£L½ž(ŽjkÖ&¶_†ŽÇ†ÞJ'#NiØà¦<´xQÍ[Ár¾õé6[ ©>˜{9ÛÍÕùI"Ù3o¸6÷¢ |}÷ö'\u‚ý>}Ú—B;e¦Ì·-~‘2ãt  4}ŸãgAËdÏ\¼ù„i|?´ø®E‘¾.Ö«µaF Iü¬ùÂÅöüÀ-Þ^œt5lÅÛa ’/}»áoˆ«Ue•¦ÜÝhl˜ :Ù>)¹7 ŸÎ<ÜG>•'ÖÓ¬KécžJ­®£‹¥/Äˤ§HØlWt˜çëÔVf¤º ·º@;WÈž„*TŽî^DE¿-Ç•ìëñíÞ6¢Jz¹eQKì RïAòOÅ"áɰ,Ý !Ht©£vXÈPÇžPiŒ&pI“qqÐÏAþý¤œ£GDª8B»¢]TÂ…zÜH€B(b¹;jjÛ•8Fe~F©`_&®/ÁÝPù2ÔM¬Ç 4ø¯‚ù»ÉéúüƒÒQôÔZo3ÛB>Œý9ºêˆÖç=/ºlž‚³b—W§qoÒãj*„d4…xå:f–:§$˜æ<ÿÔt[áj°Ra…GHªÍ—óÛJÏŒŽµlÜϽS™qU>vãe#©Fà}‚Jv‡Ý<¤j!ÄÙT› ìBê“<æÛî[äΖBX«Ü¯¨v[™Ï³A¬œsy#Æ?h¼®=Þà)„_ŒãDÖÝO³[×B-gÒ#&µsó¿6]óbFϵE•aèq®5»v÷ÓØéwêôL[ÚÅStˆ b½³ÃÓœA^94pjŠðOÉj‹1XÊmpbŒE!,¸•ìFŸÀ#.Ü¥,$?ú,£Áï"ámúj¯È {·ß²Üñ|,²±ú´u£Ðt-uñšC'Û¾#{àè‡ä?§Õ°»:úÂ݈ïpÐdvtv·x»Í†PðºAz-rŠ+0xQSk‘GÐJ½}•ú’€[bG‹ÝT­u«»{ï œ-9Mâíx5ü0|¸[jä4&c Që²:‰6|sj­Íh{W§KL¸A—Dxæzdiajf‡±ó Ñɉq?E˜ÎØcƒÈg¬¾Ø„ß/©ðŠHI§o ˆ½*í»àý„]Ëñæ…Úãh?hÌòÉAVåÅÆ‡Ì  ~¼]EDú²¡¶ "ìå$£$"qB®T÷jpYŽ25bƒp…Róèß"`ö:µÎ^œ£æ}bRx²N¾Û—ᜦ㋅üy³½¾ÅÕÙ^áô¹på9lQ¾/9»¦4Cxf\½Zïú­Ç«UnŽæÀ# w+É“îªcM zûÓŒÁÎ6I…*;°XúÜÙ ÷)›i H;ý¶#±Ãs§Å ûÌÅÒú´x†¤omdì#GCÈÁŽd{Î [ÌñÒ­I¹YaJø8e=(ß;*5’eÛì‹[Uø…%Ø[2È·ËSIe왢@€g”Å*ä(Çù]ç{5"paˆuPqã‚çOàbÜñZçzÚ;•ê.ݽ.\;ßR×Û·ÖF7dñ~¥iWR­›Øñ"W¡XËõ-.›T. º!ëÕA~ú‚ـ͒l×aJIäƒ ó%ˆŽŽCÅv{#úr96ch/Ô@˜H'Ž<ø’á¥80H¹,ãËÓïÑGÿИÝ~”ñCf¡p8}_öw:/íI(–m»  vI,bLLiãTÖ!ˆjYóGMƒ¶P³óú_NHÈ•î Q†ôvœÃ($û’Òi–~Lb|j2®“ªÖ¢L¯^Zõ€Y>¨oºG$ÚÄú.b#“fXèÙi ½A€g‘÷‚5!wÐGG÷èÕ%]Ðb~õ=|g„ÔwiäN1ùX©A0I›•%%œæö0Í)îmž2'C$Þ½INIÛß‚0_ÎUv<ãÒÏ)}Ûºsb=ÄrvôÁ¤•ñ•逯›ÝOgWcî¶íû†x}ü<6Ö[µ´9:BN%tñN&ÛìJ±É~»ýïn׌܆pä”×ÜnÛ÷Ö 8XÔÙ—ËéšUÜi¢¸¸Æ W³AñavjrПÈ*0?/‘> Ðæ ô¼ÑŸ*_¹¹ñú•6Wºüž9ƒëFŒ}oÜ_ö¤ï&¼wb€Gg¡7"Qþ¢S!ª¢Ô§`~ßuÖ¼ø}/£æ8rjŸ Ñy^jôê(¥Z7ú`—™ÐjL¨ôàú¸G‹ Õ—vÅ­`•j¢†¶Ôîð¥  Nd¯òAäBR/ëSOï˜\ÒãÍ‹„AÐkDZWHè–²ïÇš¸§‡¤Jxp§þú)mÕ{%<Ыùð¶3&~\Åû+0Ó7ÏCõ¸W;4 W_êÊXGll9ŸVcSO‡]½Ùoë?å§Òg~/gš5hÖlĺ!FÚ¥ô»W RŒ@/«»þݵ£þªz=øî©•¬pAàùˆBÞ&ãʹÙSõ J¤ÍC¶øÌ‘òlFŸ?„Ql2¶¼r‹JÕ}H6/{é#þȵj‚Õé>k~QÊ; cË{äÖ†å=€\.Hº`6ãÁ»eu®N¹û„y‡Œû£Ýµ~èòÈ“¿#siª©X¼óOy$]‰Kß’>ç½nqwV¬|á•)±ßzHšû ªî'ùÒ×d—ÏÞA -õ6ªÙÅL£´à‚ý›œVðÀö iB(´uˆ ¦žê8t¿•îÈXãõ=à5o{±M}¤þµô·Eœd„é–Ô:¨î 7Ä´ÌfÂà9o}ál¨ðû.ÞÝz8zÊ#Ö¥r”Ž$Îq3Üä Å$Üùáµ° Æ,zˆ#šéz¬æ½Ý™ÄEÀ÷­cºI@9CÎÚuÕÞþé+qET>íPytj@ÁJÄÚÓÅ)¦»~cg¡ï©Ýštgê­˜ŽV¡_»–JÒç‹T\’”Ê‹ˆ³ç³±³° Ya´cA燪•ÍÄYšv\JâM~|î³ ±¶ 9|ì‰BPã#þT,Ý+yŸJ‰é¨²LFSJ—¤p×Âùx’WjÄ7òz?HDÇCÀMyÆ–­Ëu c­ì•ÛEÚ5AÑ‚%ŠpÕX³a‰·M™A¦4Ô,6²t! 4!L’»ß4¤ ª¥‰•ŒÔÂŽL^E*µ3d/‡OCŸÒ'mñœEÆ{ž˜dA³–R¨86Î/B ß&xG”SÓÆ ¦£9k‰í¢öꃮ·×MïÅ®¥*¸ c3¼ú_{)oa©¨àÅ2!cyÓ©+d,p»º–d26Ö*“.~¬Øª™'Š´e€lw»¦±‹…×ä(ÞÜoÝð’VËîÄõò˜®_ä< •Ø“óÓ"¾€þ‡îé± nØk¼4¥W?KàŸðej¯²qce{¯¦bÂúöã­vI5G:ŸK8:]Τ\Ì}ûq¬1Áý“Ä¥ºjf ‰œWÝ%ýÖ'ñtd"o/æœæÌÎè‡ÆÛå‰)E€Þ*“mIÑâÆöê«*U±Ý÷oïåWëÖHe–­´ Z2‡˜/1Î,ßì×(ôöæ F½ž‰"¾¬¸ø€fÜÂ!6‰5XÈH·Ýîõ\ã9ˆQ·yá+¢  »×³™PÖXï€,0Ǹªær"=[d0\ó—ô1Û¸¥š 9z"QÂFžØUœåËJ•úÁ=ÊsÓršÅ9>mQ©EÎϽså4£sšó<ÄYK–Ábö­!©xòʼhgèFû“ú=ý^Ï`ïÞŸ·ŇáoP—¬™\:¬ÁM}ÞDŒ·#cmyLŒ¿ˆÊ:¬˜Ù­ÑAìv]Ý™c JØà5 Î7q€!Ǹîƒt)å]íðý G@¨ÌKöRÓ;EsòýYĬ@¸&¢Ö0ǸãT¹œ¦Š›ŸªcåƒÄónP¬ÀÕnwè1m]Ê"gÓ˜áb•éz¶›9Ä@aÀ4ûãfIsµî²9ý:¼˜’"¸mžß+Bhòøc¤sîG@¥wƒšl2˜/ìŒ`ã!{=BíO=O9—ÛÄ+ìŽ`8¸©Eà ©ð$)=® ÊÃF©¦X­¢ãt†°VrÜËeìB‡Jÿë'H·ÏšŽ—- YOØ64(9.¼Ð¥D Qi=Ö€ÞÙ´™NÈXzå¸Ã.£LOx2ë†9pþËþÀ¦¯“øõøk>«™CBêlMÇù"€}Rœ½m2å÷›ˆ^;š««ŸcL¹îœtS>‹y„Äo2/ú •øJQ¢Qž2E$‰™¦=”çÉXÜ¡ÓKÞØé€…Â¹6èÒê Ì.֦ݱã¼¼fy}z(ݸ¡F{­ÓûЬ\”øÑŠ™X úž¯…༄~~Ä-l—Eläé6(þøtâ'kH.WúóöžŽp“Ä9c舫åƒqλ!/³.@ÂCBúù¡ÉMt³û<É¡à ¼,LR–®ºÚ€³·™ (?' y¦©ñm[¿çc¨A =pÌÎq¥VçVˆŸOݶ‡òbx™kß=YbG³¹¶*Ç(6¥Îm¸¤,PÁ¸ÐüÒ™ÃS%÷RâæŸÈºŸ£ÙpÙˆIYSOgﬖXu膔` õ]ñòØ•ÞBL¸ëDü7– úoNp"ÃÒª†°ØÑWžQ–ÝGévïç5LJ½«î‚B_öáÒߦÈïmµ„&_^NÝæÝK¢¡AœŽæx:°‘w´ÎóAZ*CáýÕLqÖq½Ò`¡l€ŠN×$‡ô4‹ ˆP4È—.e¤`°=î>V¢ˆêW ½Ýì)tjž¿¤§ åêaR5O§®é3¦ ¹Þ‹¹üò 4îú3+gÐFÊ­Ô«±È­oO¡¯AÞçUsÑT`Ô“S]hü$öhêKÇYÙš&¥Zn½y½ ÒW*­í[gÌØË“){Ñ2>QHË1ø›Ã¾´ÆzZjÜFó–‹ý^‘ÈDBŠzK¶Rb¶v~FyçùL¶ÎDãØ¸S4åôâ’ýƒ–± ñr7Dµ.²à¶Ù—â [r-€Š1¹ =«Á%ó”k= ùÊV+?‰•á³÷\FX Ѫ}ÃÁ~ƒwGä\úò®óÆq@Pb¸ùõYÒ­:Î}8_XŸ¾ÑQ|#õÖ1)j8‰w¬tõøãøR¯-}Â}¶²94ªê2´ß®ë ² WšŸÒÚ‘¬\ZhÆx%.þkÉU€=ÁÁ©õyPŸc1¥ÉW½Þ"Ã|¬žöe¸Ôi¿Ipé6‡××áVE2EX±0$…ƒHçþ® mÕ(ý¸“ëïGü9þx7 éIs}oÇ%¨®þ_ß8¨ºLÃóNV2ÒSðà%‰ûmúÿûà›÷m~–ïÿÊÿöƒàÛ÷¿„þÿÊÿùƒà[ýÿò ÿÊÿöá[ýÿ‰òÿþâÿoõÿgÈÿ*ü+ÿÛ„oõÿ'Êÿú‹ÿ?¾åÿO”ÿóWþ¯ßÚÿŸ!ÿ¯ð¯ü?¾åÿÏÿõ+ÿùåû!ð­ýÿyò¿ ýâÿoõÿgÈÿú›þÿÊÿ÷Càþ‹ý<ù_åÿü1ð-ÿ¢ü¯¿ôÿ‡À·üÿ‰ò¿ üâÿ€oùÿÍÿú-ÿ}ÿû‡À·üÿ~ÿýWüï?ßòÿ'ŠÿþŠÿüø†ÿB?Ñù_üÿ!ð-ÿ¢øÿ¯øÏoíÿOÿÿÅÿßêÿOÿÿÿù!ð­þÿDñÿ_üÿ!ð-ÿžøÿ¯øÏoíÿÏÿÿÿý1ð-ÿÿÃñQ>A>Cýýµÿ÷Cà¯üÿ›ÔFvnn‡9€þG8ü÷ù_øù„„ùó¿ ò äÿàçþ•ÿ“’®¢‘™ž2XÍH[ ¬g¬ ¥®f†ðòš *òò*)}-âáãyظx"QHW'^^ef"©©‘BÀm`2RÎp” B¹Aàî^HoifEWÜ1òsƒ3ƒí¾^I3£à¾¨C©“´CØxxÂQÒHOWˆ˜˜°8„ÿ Oå—Ñû€ ‘Î^N"(>ÌÁü“\òàĬ‚t‚ƒ 3˜¹ØÁ¥x¿6&’rBº8‚p{if^Ü?˜«¯ŸÜ…ÇÎÓ“ìw’föDù9Á=p8ŠŒÂ‘øepð~}([W˜îŠ «Â]à6(8 lëVúÚ˜ŸGˆG àêÀÞ`;'OOifw¤ îË,#eó—;ßtWíP¯˜e´qžw±õt“Ô³qÀ=† 8üýÖ$Ž;„ßo](TýÚ‡ÚïEÿVG¸!uE<×?w¤…ôDý[}¤{óü­ýKþ»Íq<=,Ï&Aîl‹Ó½«'W[§¦ã¿Ó‡nüïÁît0.ÿ`ÌaR¼8NÈ>¿Ì¿+•¸ªF8ø`”Àiµ¼`pOðod€í]=ÀꌰqáÄ×ABÊÖC†èOä¾%õ ¡-ïa)N]þÐù?QóõAþ¦ôàix|í•Å †Sa¤Nþµ]=à<<<ˆ¤Üp?v®0¸ Ëo´ƒÏ;¡$=Q0¤+â¼JRŠ÷°øÞÿº¦Òö߬ê{ò«*ÜÃÃåßÃïðoaw÷rÅUøûÁä…‰òÿWy!ž®^vð߆úw‘øZ̃8Âßúþß@Ž›žùlþ6óàMÁŸ…òÿ¼0qÑoÉpÅá€;$nüTú?Eˆ/ÌFüÏ©#]p†ßïoIøZüwÈ%\ý7Ô0¸g\ìüÀ6nˆCõü=—À5”²Ãu÷‘B:;€==ìþ,/0ÛïxTÿH°Ç ¶uõ€Á=¤™ù˜Á8OÃÙÆ §ŒƒÓ WÊ ¶qÂM¤¸ù…÷7ìDR¸Û`gÜ,ö½†¸Š6p›’ìïdüd{"lfǃ$‘Ó8ŽVK¹…ù…¸EĹ……øÿ é¿BðoäÍü,B‚"ÜbÄq¿Å…¿‹'âÂ/œßC#"ÂÏ-Î/Î-&$À-.$ò]48U´…ýW¢÷ÝÑâãÆùµ¸Ñàý.‚ï¥Rý»aÂÑ/$‚cˆ(·8ß¿¦‘uõïñs‹ð äcåø.’ï'hý;.ˆ‰p ñ r‹ñ‹r ŠÁ¿Ëõï†_Œ[ÿàÒØ~׿ÌÝúwÏ#*Æ-"‚\anqÁÅôï¦yý[¢ÜYnÅD¸E…¾â{aÿ®{qAnQ\÷8Ñún÷ßKûîÅpŒ8è^LèÏÚó¼”-Îcú“u´ƒ;9¹ÙÀ`8'ákO7»ß®šàL1 ç¸ó~ýïÀ4òvsà±yxä_­ä?|CŸ! £txçÞ+Á=íÌé¿$Î×7¶ßRÇÇÃÿ/š)á|ñoÛðñóý©é vópÅÍÛÎ`ÜŸ0ä;iëu°dCº€Q8."\Ýà¸?lP`$ ìƒtrÛ¦\{/'n0®&ØTÝHMר,¯c6•70×12“ÄÕÄ '®ôÀVöƒtvsBâºõ±ñÀ­ŠQ~`W{°¶²¢®¾¼‚º–º‘'*êF:ʆ†`]°\³þ^Ä6„ÃÉQtuóÃIÝ7B ;¤ú°XçÒ¨é©ÿc@p£(º¸Çvú­·ƒæ8OÂÙ“§&`O¤?NGøV°0΢z~Å,Ílã„tp‘{ (I\±§³““Ì?–Æ¸Žµq?òn`0¿„ ˆ„°ø€S‡¿YÖãÒ_×VDÈâÁþ/¯Ïï+vœtñ.Ô~S¢rµ~«xèJšßî\áÈÅI8s‚ÿÙÏ:ÔúßVïR¼_ŸwëëÃØŒßþ‡2ÿ¯&»þ6þó½ÿóëü÷o÷¢÷~ÿþ!ð ÿÅ¢÷~éÿoùÿ½ÿóKÿ|ËÿŸèýŸ_ñßßòÿ'zÿç×û?¾åÿöý!Aa¡Cþ ü:ÿûCà¯ü?ÜŽ²3Â-Åm`Z®vަÿós¿Ã÷Ïð ð ý…ÿ¢¸z¿Îüø¿çüÇ7B ><ðëØÇ¯cÿ™cÿBq5%ç@öP6¿ãý¦óôn»Ü<Üþõñ@¢à`'\¹'Lô?<˜ñý3 p~^Ô!ÿ,ÿzû· ù?K|Eó“Db¾7`_ Åõ|®ÁÍl^_›?öºQ;í_£6>6ž`‡?ÔÚÞÃÕùp›ÜÞÕÉÉÕç÷}t ©ÿÅÞ•ÀCµ·m”ÂUJd™Ðj›Ȭъ"´¸…lCö}4cÐU–²$EhxEIÊØM1vY3d߯ZRƒP#†ñÝM÷ýßúÜû¿®÷ýÌ÷3Ÿ9gæœg~çÌó{ÎyÎï|¿Ïq³]<¢ þ?þP%ùÅ_û‹CëúVn-Ö €A€°@ {h?¥ùß?ªÿV€B` 8ëÂ1ÿgë—_úÿ×»÷ÎæKXJvæÚ_Éÿ@èoý¿Àÿ‚ÆÙùÿ߸©‰)aŠ™!Ðh 0ÄÌÌÂÂÍѦ H…zûØø{ñíñoâøgÛøZüC ð¥Ç0¼0þËŽÿ¿¦&.¬lzáÊÅ™{›ZàB_ö„Ï4.‰A @˜ úóú̇@àPEÂe€¿iö[Vf¸˜8ÿÚ("0T†Õ7~¶ûc¦*ËŠµ¶eŲF(°S˯á›ãŸ•ÿÿÙ6¾ÿPþåù eŸÿ—:'Ôx¸……ç{õ£º«fXó%k×°Þõ,DyY)MýcÌùy!!ÇyŽÂ¸¸8ooïžžcccqqqÖZóóóÇ"½aÍ­rÕ=¡Çqðušƒƒ«}áißwG—„€C~ðq§ÑÔ³aû7œ:ýàbø@]N¸#-±ªòij>õBQ˜/òáBóisæªù¢ï|©["Fäê"ª+Â×î|Ç#qpŸ[ë~ÜÂØh?cB·=Rp+]Å®œÂÅÍQÚ³^|º¯‘„¾­‰uU›·Ñ0ÉÐ`8)€kå8ˆñ|*³&c¸ò¹†LÈÃ(w”›°D½c ŽÜnãÖpKB•€¨ÿä>×§4ö©着…éUB>P'Íu”¹Ð…Ï»¾‚/¨w„w« DŒ½”ý?$Tn~Ñ5X@®{jÍL8Ü19œma@e2½D_2æ[$èï‹`j™j&ûLõ;vHŽž«Àp&ÚÔOHÒíø¦×½æ»0~^è1¤=ßœWÙ»u9…éöÓ=W1ûƒŒ¥6Z6¡õéMRÊ" úÔ™ÄÓ‘÷|š¼ä}ìN‘öÒ;/ÙNß³[›L©qè³¼¿/>×Ò9š#ºgË lÜ÷¡Óûì|ª”RÖ_¡ãpîïŸLõHXñu¾¸yÔRã ­Oˆ“²ÝFnO¾ÏÚùJíê#x‡Q6¥Òû^ëtt2µUu§fsf; ÷°øn¼j‰¥ƒíjfy‘þuÔÝɰǨÙ¸°¦gE¼%±NR‚b’™{xçîeJ­¦lŸgJ®£Ý{i‘‘;›\lé ÔÐ)Í÷3ØŒX=)IpoÜÁlÙlY4lr‘§ªc)L¤Ütt:*U›Ü0ø ?:~W¿^cK[Ê¢ÉøÇk5OÕëâ§$ÿûhB^·‡ÍïìâWð·yÛ3ÏÕ˜\ôÄYÄS€%åaõÌ^Ñ=¹–o`©ý 6öÈÓÈ KkœÛçÅüêù¢g+§´¦¤IŸñ p8ä\kCçS"d‚íˆi}4ú•do·¼4z;W‚ ozZ ?13EŽös¨©åÑÐ…ò–ë;YGµÅ&xÒ‹}")'CI}òªÏ<ëÐÀ¦Ó¶†äÇžuæ ¦ŽmmU5;Zæ}­µÞGÖ‚ª²•“‘>Ö”ïÞIÀ¹€# ‡‰e"EY–{³‚¹œÑÚs ûkè/yŒÓ¨e[êÞoNqÑÄÖw*žºC·Í3­~>u·.ÔsáxáÕè'?ß"°ÚŠnëëR¥â³U†QO Fú˜;djZ¾ª9˜aIŒ3úWÜžâtïìî¡“³öÌl5—Gua´V·×JçÛNÿhR¨‹:3€^O& ¦^ûäã«Ëå0grNUvf=Ð*ª|ÙA%[* åV½% ãÀ!uú³uxN?²ß¡¸D‹zËÞì³ô–‚Ú¼z”ÎìË›lF¸îçhë˜3FGÚ°ƒþfïÖ½Ì5Ä @(¡HÓ´Ï”®™™‚BÊ÷Çb¼¼?½ -hœj gf)ŠLÅ1ÄÚ-ãTb±uQ0„•8’ÏØ¿?O‡N8Y‘y‚Â<æ_@®Ül×鉣+‚ÄÅŽ½½9…@WäT=8– ¿Ü;U3üÇ2k™¯yF%kmÇm‡ùGt4C6ÑìÓË H ;ÁöðïòÕè:§4 Q[½nÕuõ€!ûS0&L=°û ¯¤Æ›¨³€½z™ÅÌøG))ÌëvYsg‚Sœ`öëä\Ýr>"l¦ð™¬^ûí™á\y-Šh©POyÆõT\³¯8ç–‰:„4Dð}-á¿Q“iÕÕ.Qa8šˆð˜o⯠”¬·„ôÈ…fr½W ®®Ü~•lã©2ß1c¼i›{>Ò“ÔRäp~f`Uš½ ÁZ8VÔÆÚŽ(wº¶7S|ò¢ ëlK®&¤ E‡CÏ(Çíå8‰2 §aÃD£3/Oµ3‹ÚBG VÅÅ¿@ÔYrööëíÛš+øÁ ¨Ñ‡Î±#¥Â­²ÒP1|™¤éaÈ…¦÷]žÛ£k£ "8ÓÒ “QSÔç5ÅŽœžwÈÀ·¢±fFõ¾ÔÛeB÷á„Ñx¼G}Yµ‚Ü-®ÊλIºÊ+RÂs¶0}}®ã‰Ô’iàÝñêDj»«EDÉm;Xêóf.0eìžÍù`œéÒd§Vÿî¹Fžþ×1ÕA1ÚðOßÙ—ï±w±'¤æn˜ºóÀéCBvyï]1‘–Š…Üb ·8ÉÒ'•h˜öVÂØúÖ™úK!Cоm’Y–ïS·:YaD¯âóó%î"/ô ¬Q&qÔ–Ê„L¿®3Êé y ¡ž‘FÏš"èB#e›xk÷y?–áìå¤Áb¯Ø\Õ,ëkûxІå)Íkô±oí¾–ªI2áê*ë.q‰vŒî W¸õÍt¶‹¤ê§8yžè»¤>*!¹aÕTÇÕwبå $±®ãäsgÏ%bÔ”Ó¦7d§Õ}ø`›Ú tAoT¾ÂpõHäÊ=>&Ñü Ê?ô"«÷ô[‚Ö‘cXAèœT ‹ÛÔø²0j<üšã-ò¹dÌxhÎŒeA*+&loô²°¶žËýa -g˜7ãtÿ‡`_ïQòõH£ý¥XÁÓA5ØGII©MJ•pä©^g¬`´­­ðmþ‘=Þ['ÇCÞà‡-Ñ‚O³ú–†ËÆdչņ_g}ä"茧‚Ч/oùÈËDŽAºß£jU<.ö$.?àîÒÅŽæ•æµ×WðÀ¶Ú Ÿn8Ÿ|z`Ô*ENÐlúØ>©V½4¼QS”ÔL'eðñ¼çOŒé¼î=Ô+‚• ä;yV…Â`>{ªû±þz»”€‡¶ªÏ¼‡Ì5¼¨õ£Ž÷ì»Zó®ÛÖªhgßÁ™õ\CšâN³˜êÞ ºh¥ ¢.Þ× Æ3DœC刀ËÞDùÑî;K±jf‚,“\ò¼S~ýÖ.XðŠgñ)ßD•ß¾4>úÊõñÌÅÉÆ[›7‘x¸ë&¾Õî¦Sî9ž—ÖÈ>•‘ÃJÇ6ûlù(·!{GJCõ däÔžš ¦¦Njvmñ¾ÑècÜý¬Ïî/ðv9ÞÍ)«#'-3l˜‰iq€4‹¢ú¼(­¬ÿϰò ­f±ñH>‹¾Ée¸­)Ϫ<ädåñ+myùÔ]f­Šß;s1Ù}ØH£¨ÇsgB 0£¨ÍvèÔ¸óÐþmy6k4Ž·a4üŒª›B¥›­»¢ô¯nõ ¿žÔä®§¼N¤UÎ-À먣ïÙ¥µAþØeè@]å:CÀÐÒÈóaޤ˜êˆ€÷z¥ ÛD”ŠšÜúñ<ª¨‘»îA¶Ú‹¹ƒ¡9óÛèûâÜõÚ77D c‡üÛ7ÆcÞ%@6öƒÍà±¼½S÷áÛUruþyÉ ­”`Æ¡¯tgï9Z5χ‹k\ÖôÏa¢?ô½Õú7{_NÕ¿]"¡HeHEÆãL†4IÆŠP9æ9‡c–!‘ÌE’)™3t\ÇpÌC™®93ÇÉ1Ǭ¢ú6uï¹Ô½ßýî½ßóø=OÙ{¯½ÞµözßµÖ»<ö^ªÀxCSÌxÍ„;è(ˆé½€߉›0q?Ðp®¢°îŽyZø‰w;‘†F´Äꄺu÷/<¥ÿZ:ˆÌ«¨£ìy°×˜ÛÝÙ”sû#¼îåR§–\ïÕ¾í\N}hÀý‹#+LÄD)™£½×ØÕãmnD1áQ„©cé ($|Ë©@Ôh};>é-˜VÑ÷8œëa¡ÙÆ>úµ‚;ì… ‰{§±Sö8h+‰£Ö€{GÝ{`&±Wñô1Mfê‡×Q¶¸¶+_©È¤S©S(±’5ò° ò¾NCTœÏÛ‚1™ñ6w¾›Ï¸ŽÁ~ìé9:1u.ÄÞ 9¤Í!%1í7Híßœ$›Á ×ÕL¢¿ºù‹œÍ•›AÄ9ŽaӉйZ’¿ž§Lo– 3y"&æ8éÕ 6£nÊùD|I–4rèf_…E0Ñvñƒk‚cç\ðÕÈPmæ!wfåP¬LÄBÂÌ­ÛÐ\­Ç{ßÛ‰¼;–BÄ«5¥Oà“fæï‰2$}ÞoÚ÷¾¬­J/>èäS fÈýhô ÙD‹ÚÅô™#º* ¡5óÞ$€íkFxà¶úr*ÆV ¦#¥‰+pþt"sÉm"ÞcÇ;„¹1GÿÚô°„ý°¦B X£b÷¡zç1Ñ#Q'ÒÃ*"dÔ¹#y"rÈžl+¬¯ ÷!Zl3ésQ÷ôö£ÓÌ u3ýòÙ÷è>'‰Ž_L8s¥¼ÔÀ o^‰ZápÀÃó6{Ð\|aèã²Á=§æOšU‡VICÊœ»Ž¡%gâÒ£.˜eâÞT ï¤s$SçëßÂ0*ÚzwÿìÒ©'/ 1ºÒ‹-ôÉwú¯\ÜÂð± íùô¨@¦ûÙ[æóFZ¯ÎQyyI•¡“EøêSawªÉ™Û|@×$ì>Ùê,3ÏQ,"|´¤„/´áó×9B{ÎçtuIä”<:6Ÿ–w%J!ÍjO‹+÷„™ÐÒ å±ÌN,ÊÜDîZœ*®;KB©±à’胄­}ÇBœMD‚è9-ìL–­á „¸46Y¤Ð°ŒöÂð*‘±Ÿâ "¢‰ø³NÃÙ>oˆðœ×ïi™˜”¨•Z \”g¶Îaªó㺕Ù^FWg2õ>êB!€© OŸü¡& jøV©û(w>?_µ²vÌÊ£;Ë) ‘f%+;— Á¾†ö¾–8ÂcUi'®¦<è‹·ƒ!› ¾V5vùt?|ˆÕƒŒÊ?žØN/5*ö« ƒµ ú¼Gž%êcS‡¬ÞSáçQ”K´Þ£¾“%Wôezù"{OrE¿-€â©™Ôñö(f/Æh¾XŸ¯ežÍÃAmT[=>Ò—4'i‚?+PQ^j**ÇCŒ†$)Ñ î'ú²[´êjü0-ÉþñÇ=Õ~'ü jDÛMMïTd7Vóðs®fú•©!—nÇ“1oŸè“Š‘E;|§K8Ú¶”äü»P”?Z–B×ç¢æé@§X¸PŽU0OÍp¦B±†ÉæÑÈL9:öªTw²†ùÈȪ4JJãÎ 2VÞØv_b±ë€î-U¯JTE#õ]«ðXš`ãþº÷•óO|'N ¯_ ?E<UŸ´¹ ºR/ [•p0“„iÌyϤ¿èþZ‚˜Ô¤Æãùä.3Ùëââi´Õû«© µD1'þèaQæ¹À=¤%c_W¡Ê—ã<ç.=<å³C±RÖßz%ÇÚr^wòë]ÝeôDtð½Æ«åy/-gï''Z£:ªøwèV'¥Ÿ6ËГÆé?8ÂduiË6Åø=Œc<Ää—/TËž7IÅÓ‹Gïe‰b¤ÏåBEµë€ß;÷Òl›¢+›í¿r¯ñ¤°Dûjñã ³)ù/ ÷"ùÃToŒuŒaÆëö8ÊøªEúre×Äd›ŠŠC0 Úß—¶Ý8ËýQÒH<¤‰H°qènñ•¢³{Åz,¸ã?úJű DĹÐ%ßò:nƒígÏݱs&£ù®ä°›WÃiF­/ªC(Ÿ¾ú»™üzñû¯ ¯w¦×¤â"!!}±Œ÷_qiìðÖö4a¢yqedt\þ…J[Å>‹[å÷x¢fˆz lö23Þ*èå‰áàQS'ÔL Ô7Ä,`Q0ÑÙÜr+ˆ‚6¦‘æ,ûšÛ +åÂî-³ÕJý|âž[1çÕ5ÿLãÇìö%ícO‚û¨PƦd$»nCiÙ%¶ îéöq˜ô¯ÌGÁ|š¢}šÊ84t†„ÙPAÛ_.ªã¶j¤26zõÎ'ÖT„m“ªçþ€JûÛš§Iö’DK¶ìî‰qt+%l‡¢{ó)Ôêóú¤Iå­Ž^ âã½ ô[˜ïR–Dc~½úÜ3^bübÇÁàL|ôö¬Çó6ÉcìÝw2ò΀«úpãç^Rà@S5³%E@©b<™.9j 6ƒû>¿ÌO¶õÈhÃ9?ßÁp€‡È”vKÊãñ¥ôéÏ;Î"CÇŽ\F2+ØKÏk-2Ï¥|UÜ@1¤k •@ôI5ͤßv£±ÚÚ·Lñ=º÷¾§~;:{/Oõ¸=ëþÚÈŽ û9ïe^eïþËq’*cñÔ˜7æÅŠÐ ºv¸ihj)¨-´×…Už•íUiÏÉ/¼v<Å9Õ©Z-Œ%¤MÒ¶§fZ/+?9Pãúò­´Šzµ¬ô Ó²×cZ‡z|§õ‚óíc˜cåÝ¢gHšÚ|„o„lN†/.kâW©ƒ¢˜äë»Ú¶U3³ R,ðt‹b:\±×J/½`ì€xwÏîÕ$ÜD,¯·——‰€‡ûí¤R±A:åí¯ ÄçU'¨ÌŽgI¢ƒÈ,6• ÞkãÐ(׉Ïhº"0hCaªøX GNñÜgÛ%Ì– kžÊç'¯q\Àòø»Ü‹¡¡#¼ßÊÝ÷z_:ÑÙ‡àÑVw`²Lp›ƒs×­òÙ¦>%ÃáñŠ×{Óçßk"~KLU÷žåEL$¡/ø‘ªUŠ29×~é òÀÇy´ÅÊziÂ‚Ž¸V },BöÔåTz´íg7l¸§Ì°¿ûƒÑ^êxýK&,ª7~«’¦J+v•rkÐVŽÑ!=Öõ£J;‚ òŸgia¹=æ`(ÍÔ§ÓjL:H«v©ú–[fÿÝ xÛÔNE9nÕ‘šÖŽ•VYØžlÍò¼yB†´rúzÔQÅQÆhO‚[þ™žžÊÚ(ê/£Û>wȺžDñûâ9¤éL><›¶‡qû£ 'ì{,ÈQaÝ=§í«>¯ø¸|þÆ¡ZÂ`½ˆê€Ã4Öà…3ìó¸ë`þd@'»’zšUdÙóö‚ó±ådãiG4§™ñº×åÝ/xÝÉÅüKéö"°û‹‡#`Îk´a-¯ç9óKØü–Ž©°s ‡<–©Þ®0©ÖÝ*Y™{‘²$ÁTÓEŸƒ¾„æà€!'ž1R4ãBÃE”éë*k`É ¬É–ÿQ†=2?é ¬ê2Å_¨ss*T¼R½½|- $'AR†è|FÃ3¢©üôALý#óVÏ`é’„Šë«” ÅŸÇÑñU Í6Ð=Ôp<=3Špm›@²}¬cE •Ýy`Œ-ì£Â‘nuíLͱÔÞÃ)”›V¸…w„£r›{k"LôÝÀ ª­WÅÓU½”ÃÞi28ñð»Ó:ñrD·‰ëw|¨rX©´zRá–¾aYs}Xi¾§0ç,ŠúXÌ‹‹Ï¹6­£–h¥–N ì´íV^UÕ¤íXuPb[í£ îzCõê¡Ù‰ò÷7‰ûùy‰½ÚB†zy·É«›–ø8½ÑDö ?ËW~›ïyð”Wò®¤øilT55µ‹‹#oŽu9± éŒòîÂ1Í!­3Ÿ¾ÇÔj†uˆ—qàBãSFz—n…ký9ð‰ÓÒW™lvç`5îðLÖíI£&Xkðjªò#SlTe{‚+êùæñÔÍÈhçŒ` ë„peÚ/ŸŸªª»F¦«÷ÐAÈÞŒ³mbƒÖJÌjÏûó0¸Xæ1ýH_uŸjä¹)^Ã27ÛB¹ëŽŒi.”|ƒ%³%6®/ZÍG£]¼àlO°šE_ý5axw›dؽ«×ƒj»íuX;\³my§Œã’¸»Î2èuwaÀš¼»:8%1—õ’çáR¸¿ò«$جqW]®áaÕv0 d aï9œàÀéQàÙ¦2™PNÕ€§¦aµ?·•E3\äïž•®–åÄóØ®mÀæ%0ÒÕ|_Èú$W6Û…Óx~¢Ù‹íM­£œÂYB@¥¦Ótg?SÒ rf{kê(3‡¢êtª‹¹Ú/aÙ¼}åIÀ"viŸXƒÂn˜dϬK+°À,鶨Qð™cš¨Â3ðºðqä6ÊQDædç:¨Ç×Q¢ zã{ÇõTöGEL ¦£‘3â¦Ñ”å{E˜t&Eó„L=ê³?& ñIé•ÂýÒ)1š½Û ¸Ÿ¢ÅíÞ1žW³Èf¡Ê:JÙ¤;JWyn—•xÕQÞ‹ï 4@™ù†ÓFD…»q0‰0qV)¥ÇpÝÑgIzîN®£´È ¿¾™ëhD‘ézv(äñ5©ØOp•g1—%•žÅ H{ñxeýLŒX|ºúÙ™æéáàïËWãxö ¥zùÚùÁ¬jí‘tís+éïæQÏ™re#ÞŒ4î Ͷ%FÈtÇ®êÌ^úøIÖÜÊqäQrTBû)±þ9‹Ð8°Îyy[¹>žü€Ø4ˆ¾ñå–$RÌ2èâŒ&æ±þbf×E]™ô]{M9-XEòˆMÍùü…x ¬©Þx¢m#Ô3jüþZɘäÖ<~YÅÅïVTdÏNá]t¨µð¾Ü3l6ärªã¨‘`Ђ¿›€ß¶úsý»[Ö¶n— öÖ§Jng/å¤ep9—àx)ÚÈäÕu:“(Í6wqf¤F¡6ÆÒ`ðÄ–À¨(Õ_·7ú¡Tq˜ï$ÊjH>2 /Q/°_ œXŸhå㢞šwccŠ–Â4ƒ±þ+WcÌMÑÒˆÎfb3vH-!Û‘ñ ™hˆ¢’‹ + 5 âÌ}'Pùè.¦[ïŠô`’\ôÌÜwÏxñ‚†C‡ã¼r·"°„óók®wÝ¡þÚ*e\Ó›õ>»‘ÇÐöܪê†;á°WXPL¯îw!‡¬>Ü12ˆ÷ÒÊŒ W”U *ªæÑ)ỈTŠò1  ¡¬¿‹Jñ·rfÚâ Ëôì›{\¼‹âm~_÷0«2=uìëÀs š=©{*_Ù;¤<ÍÛ~Æ}ÛkÛi/,Ž• ¿$sÝ…qçÝ)K‚´ˆ]ÝÓÌ™º¤,íeE€m„'*‚Wl£Å ?¥V8§¼Eî4ÌçQ’­41§û*e˜Ê!¾¸€¹À¦i÷†^·-àÕÁ%ºÙ1qj„ÔrþQ–„Ͼ(y§á&ý¦’ö»Ls ½ÓlľÄ]óÝojìÂúòBÒ_úqð¡Ü$ÝâòŒE‹bñÏ~e¶rÒíÔ6Ÿ^[¼ð¼¤Éf¼/Ñyª’O8Í>K8C'‡¹³åȨD?³w0 L†~9¸ýSBà×rRýf€s¶þ¥Ì¤n;–ú¶†åIùŒÙ'.×îl#HU>¿1@ryÁ‡›ÊK í‹/=ÐSY \œ‹ËmÀÌV OóáÔ{Ó9î—LÅè0 Êä,OCÛ_Ëeäyû™´HDcf#œËÇíò›é“Ût> N¿U‹’Áò‡!qÍ¡}îÈôh‡Ä7/P>¨v®Œ¿ûv$ð£ÖÔ¶#«;0s;´èi7Ñ&zqŸ¸i"‹:½•#´ ™Æ÷¢Y>-îƒóä!ï\¼ÓÕ((–v$®9Z?XäxÇR±¶ 3TK,,}VOä%%KÏ]?§á/r¹õ£r–YÖuêNޤ³º‰,Vá¡ZðêÎGh3’^Ïý*ÍÑÔ”œàÁ‚Ë×F!ò›ýôe°V„›½yÐÛ|é³ø¦äH5aö@cFëÓzÂ'¦ßÕ¢¾YõÍîÀ>ûÕݳ »õeê"TÐDØ5ÐF{ñ|ÍĨŠ{6¥ÆBèðóÈe7†Ö™۶°ø?¿6ƒ,73Uv†Ÿ9;ƒÁ×ÒÝ@¦;¦ÍÒ³™j¹MG¹ëËSô®Ïè@|À¤c…&÷xŠ­˜ê½ÙÌúReÍgí.FØ»HÀÕwGHR±›rVŸ^?2µe %õòß0åxš%`ÎÂìÍÆ÷Múž¹x ‘T¦œusÛß’œÙ_D!´fNÓD]œ™”fh’`}„bf_ÜV“¾Ýµ2±D°ÐÕ~µ¦}_ï H _ž)ï±ÞSO\{K•ô¡Ñl ÃÉæÂ-ý‡«t±jZ3¿Ø3:U †žŸ™×46$eap˜ö jðczsªÊš:¦ÏÆ9JUŸÇFn »xqSOêÝaO€>7¬/ç5KPg(|_%i@Û ô’Va+íÕ«ï®ÛÛ{Lzr¼¬¼RWºz‰$ 1+Xêv²ki÷—üb|jð0DR t¸çAK›ïb›í×WKÛñˆvîÕ7ŸeYgéÍi©î|;¶‡›š‰å»Ë²®…ýêËÉ,Ò#ˆ&­ŸU*Ù²_qT'f Û*í}U|Æ¡×O•íPÝ{ýÁ@èγŕE‹ÑrŠ·YÒ+WCç‡ó*±ÓØŠ¸Æ”-,¤§ÚÙŒLÆW¬„•Ø0Õ¯žÑ¡¦è¿¼Ä¾F-+èSd ë°l•Ÿ½{|}ø3÷'¿°ª.)"[÷Á5MÑܼO±¬É4ÔóѯÄ…å¶‘&ï+*aаdèÁF¥z­E㯔_ëÃÏl­\.¬ˆðOcç¨R bÚGH­µbð:[Ùoý¥ C•t{@7ÃcŸV^šý˜.Á"ôå;diÀvþÑIJ¦™ŠÏ2× &ö! ‚'±> Ô±ûr€27A“Ç ]ú >\¦ÞŒÑðTdA2½o¬ê.ï´p·:©×-hö¦×«\¢2i7}õµäÖÙ4+ÿú“œ‘°B‘b~ ÕCi“‹ºÑŽQ)ï½õÜôM‡ûí'רÊF—ÿ¢¤ÝC¼±ü+1¦…¯í ù#wñ$×å¿DÚü„àÿF¬þû¿óý7áÍ÷¿×%Vóÿ¿ûý¯Í÷¿×?Vó¿Þÿß|ÿs]b5ÿèýïÍ÷?×%Vó¿ÞÿÝÜÿ{]bÿÐóþï¦ÿ[ŸXÍÿòÿ›þo]b5ÿÈÿoú¿u‰Õüo ÿ¿éÿÖ%Vó¿üÿ¦ÿ[—XÍÿòÿ›û?¯K¬â¶üÿ¦ÿ[—XÍÿòÿ›þo]b5ÿÈÿoú¿u‰Õüo ÿ¿éÿÖ%Vó¿üÿ¦ÿ[—XÍÿòÿ›ûÿ­K¬þþïòÿ›þo]b5ÿÈÿoú¿u‰Õüo ÿ¿éÿÖ%Vó¿üÿ¦ÿ[—XÍÿòÿ›þo]b5ÿÈÿo~ÿ}]b-ÿHC{mm´©…¶¶­©9Zf¶´µÖ7üÁ.üçß…@@+û¿BÀ !Qèò÷_… `Èæ÷_×#þÿÙÿuY™ËÂ\Ñ¥€ —ÊŠ,¹–·ûÜÜÿusÿ×õÜÿu¿íùª»Zw A#¡Ÿ §ß˱䲱\Ùàtõ¦¨–FßöD]nÙ•^ÿ¨/#k]ãå[…¡¬ rõ·Ý[ÍW†Øoû~®®l(KNÿž&æ’@£t‘¿¡À(kK}C4ÚÒúð©#¦F@[qik+I«k«È*j«^•UPѾ¨­-!¸œíÔ`òWÀßsÿUÑ@¹¦Hÿ_4”\4ôo½&7Œœö×-‚Ô7·50äâ6·G;¢¡Ç˜¹mÄ 'Ã×ÐúNYšú–†‡ÿ„tDWÀXZ‘ùªŠ›:Ú[Z>eˆ´µø^9®[–Í?ÁÚVey ù¶%ñªG# ár^“H¦ åââ2ü GÉÒF LÈæËû “C’Kèä2] Ød‘ºÀbgȵ:$¹„×"yÁÿˆpf9ÿJgTf1C´Ío"kD…~Gú9‚,ò²µ¥ñÊ–ÂË µä.**üÂÚgXF]‹ BFù#ÂyCÝŸ=‡$x-ˆŒú3„?<‡$d-‚(Aôç,-,l‘¦ú+ –ä–„® F¢`.ñ5©d%‰BÖt 0¹ò`ПˆpËÓÑwõÿä–eÜ8‘ßîâýËN4ÿØI~Ûgè&‡Oý¬“\µT±±6E/Wøøÿ\?äB/qXÓŒ`2K`ѵÍù÷ãÐÊ0†ü8 ý|X78Ôò[ƒ¨˜:r ÿtø“‡ ðßÕÿœ`;KSƒ¿5þ_ùYÍïù¹ýÓJØþÙihð×£)òwÑ.Ï0'ÿ®tÑ6Ö?rO-Á°5ÜC„þƒ9h…{ˆÐßæþ*ðDàþSê!äÑ"¼A¨­¦~ù966õòYK½è¿§^äõ¢ÿOÝ~ ý"B?çŸ<-@þÒ¤®#ÿ¢?éú_ä²v…ÇWtMô7ô!,h ý¶mþÕ+¼²¾YÉþ–tåœë7æþA+Ç?úN(yšƒŠ®õP²¢ à?©ÊVÏÜTÿ{ÅÄÖä‡þÓ9bùm~„BWÚ„k…T;]ó¿–ãŸCYhÛ|ü5\CÉC=tíPùÇÕÿ>½ÃD¾WÿBüNÚñkªF6r°eº†8™U˜èЉü×í&`c§6Ô_Y\¬iCY&0ðWšírqË¥-#®)‘ÜCa ÕeM2¹“ ?d† ÿsZ¿ÍÜpáÿŠÖêÁŸ.[ýUcÞr÷àÖµ@‰ÛØq­‘ œ<«ÁE~” œ¬&8è?—‹Ý÷“5²“E ÿEú]6ßJµýI±dµÂÁ?jN–²V;ÂBÇýý ñ+S?€°®Úù73Åw5­“0ùeÀáb!'‹ü÷bø¯ÐÄ×TD®öØ~SãSíå,,$J®·èr““Á?ÊþÏå ú&gøÿ¨œÿ… Dÿ•üGˆ¶k{‚ðï¿Ñì ÂäŽ",üßöI.ô“»ðØí¾ë×vmiäÞ" úQuÂdQ ÿö®=6–«¼ßª‚ % H¡åžë@ñ}Ø»óØ™YÇvrc߇Û{o\_Z¥‘3Þ™ÝØÝÙÌŽ¯ãŠ’6*…ü‘Pø£Q@¹@oDQxTjEJ›JD¥@Õ@´JÚJmJUEòOCzûsfæÌk_³³³{íÉöìÎø<¾ï÷=Î÷G(xÂqJr̉sœâbnðLûŠÎ™V]­Áx+Æÿâ¸"ë`1ÊyžƒÏSfÄ4µ\3w¦—vª$#GÚÚ%ÌÕÓp„q4g.ÏÉsn´4Ü(žg1Õô8»è6/.ž‹R®*>z4\C+/ºµ…Í2@pB4KâÀí¨¸]nGù,³–Éíø¬°w”aðùh[>3!â‹éóyv6TŸÀ¤RÈ·á³À$Càb3¡Bá!Nè%*ÜFߤ”ÐU±ùÌQÂz–ëÍ‘º,™Å‘dVŽ,SÅ Ja2ÊnCS%O’Òs3#Ýg ü oÛIK··­†ÛÑY.j–UƒÛ"Y¾Œ¹‘в2TZ²l'òýÓ2BJfwD!LJf#D1kRn§Ëí8b2 'Ò&³Šá<$'2 Ê£¡fŠÈŒ¥&Sc¢’4™ÖC³"¸Ó…nÎf°–°A.0}Qˆ1~&n…°ñë)%ÚÆ(IÄøº¿-Ó¬ bý "³‰'§™–¦‘šA–¨…Û¨d)H¸í‹©ƒºÐRÇ› £ƒa°PŒ¢Cb0”†¨§ÌY›¶ÉNÆl˜èƒèX)¯°†+aàÙ³bÒNŤÈBM`ÙQ¸ 5¥Fy®[d2¨GŽÄã/r^ 7ƒgUñQ Á2™pneòùk*GòãPÄ•¡!"Ù…z+,ყD%œ¥Dy.1ªÚÌûQöäH)Ä^–jåÝTkš:õ¾›Ô{‰­Ÿ!™-ãY •ççä» Ë—Âm¸ "{ÖßP°oAc)R¸ Ë’Âm¨•ÂC<ŽL €"F,h"´ÙÁå y!:|ãYnS´Ùö‚&0” iOšíAІdA ã‡AOH<µ» ±Ezpnó„n)¥Hy’" Ë0ò$Ã|*&ž¤î®„"ÆPÔjJÄ›eé>ž¤ûB"Ère¼˜âŒgW‡æÎ²œܦ/ÃÃsgYÂnÈfâà¤Ú†"ü,LJSpºz»òÜßûã/ÿÕòß>úœµ¡iæÃS/ý´þs_ª~ôËÒ'>õ¹o¼ñÂG¾rãS×¼ÿ×ÏýÅw¼øü2¿0»òæGÿìÑ©ùƒâ©ßû`ãâóÓßúï·>ùê/ÞyhjíÅ—..üé#¾íÓoùe&ÿ•Ã/kZMøîƒ o}Ýýë_¸ó?ïºõ‰k¯áÙ•ƒÿõÎSÏ>sï¯|çKÏL}âÒ#Çÿö¯ýþSŸ¸á™oýõï^úÔÔs•·¿þïG÷^÷®Å¿ùø¹ú¥¯~ó¯þáS§>ùÊ›oþÕ·\¼Öغzî_oû“g/Mÿeá!ôž~μó¶ë_øìÉåW?ó†ßù‡·ÿáöüÎ÷žùð“??ûãÙ-å—¼_?ûoÊô†¹öÛ ×ä¾ÿÄ}_?tî³—¬§nøŸŸ?{èÈ‹·ÞòØŸ?ôÿýÌc'Ïa¾®ž8·òÇ·Üyo7þå_›ñ?—ŸŒÿ²¸‚üWƇÿ“ü_&WÿÅñáÿ$ÿ—ÉàÿÖ8äÿ¥Iþ/Ã+Èÿçÿ%9/ò‰ÿJ“ó?3¹ÂüŒúWôü¥ç &ª£ãøãd^È{çJ`øñÚÂ$þ›Éuåœÿ J´ŒñŠÖI«Qšœ:9 4Ó“@{%>#cÐV+óný±ÿ>Ñ|݉ʅþc]³È»´:<ѵE bz›N§]¼aS5j€ð³¦¥ÏÍ‘3F§šðƒç$·d„Òk¡ÙÊjN“$ßII†[]èÄèiï°Tƒ\'ÝsŒÔIª_¥]T^H3ÔŠ¥Öݹ»QÍÃ,”à^·–"s¥œ&H n¬?ÈI§ð²YºT}]m±p$\WrÝJ—)ÀþN²ñ”_§S ðž3iº‚ñùF–:\¶ßE%:jUU¬Ïp@ë]è0‘)Ç8Y9&æ§ÁDÑA5˜ý9Ë ¥©ØüôÒí€0«m³7#®é ]ÝA?`ß±ÃE1,›µš d¦ÝÆc>§Éœ•ÍÍÔÖÁ…œ?‹`Ü v #{,7Eæ*˜·âm´tÜ¢â,38nYên§B9E‚B‰‚åæG€™…Pë‹9-Ïwàûljz§dlð‘Êj­†Ü'DƒÛêVM÷C¢¤×jMUÓ@uzŸ[Mµä|ÆN ´Æ‡ GYÞW@-üjƒô}a ¾«òKkä1D :éš70|lTÍBWm½~F/æÐÊ]M@?L£ ÎGLWŸw§j‚5 ðSÝí'F„ Ñ™Ÿoc‹õUÌ{«Í ©SMŽXzë0±ESÔVÒ.F:¶ìÄ–iÛfÝ߈éiTBN^‰}L,þL‡ò±°•b„Mذ¸G¤hÒq?# ÕôV‰°s© að ”,  ô,ÓšCHC —6P¸î@9†Î«§›è³ diÖHqÃ7a:¤£“Û íîÚZ• k'UøÈypÔkHm sëý8Û¿cØUr }Ä4¤©¶šøø´ÁÇ÷ >ç㪅•Í p´/€ûU6G J~|@Ù–>cVD,xÈchi\Vøà÷C,xvxÁ°l Îhpý‹o.bjXѳ6{bͳ]wÙ$26QÄ¢·»+`Ó ëðî/Ûu‡ONÓb×:Y6Í hUËŠo…|{/”¬‡qЪæò¯3¢äN4lkwUÛ Ç k¾–¦,aËTÔÐwNû™Ϥ<[m­ëªvk£æiF)Ì2¼ÏÀh8%á Üö ‡QØÆ¹5 rM­dÅ,9 ³¥Ûš`Šões»a» “#¦Ì4´Ñ0 :lcÊLƒÂ-½U"Z"•èófBäsWî@¬Tb¼¿ÀsêކC Ö7´h{:y»éuGÉÒóh¡#ˆÄݶvéߦiP8 ‡WÝMþÓDÈètbqz鸶7øý@xTáz7„…0Á:YÅSd”‘a#£Õx Ü€ÇÚ®3 !.{3Èñâžâ8Þ û¼n¯ÀŒršÝ·ÖõÒÁßÔ8Õùøbé%Ór~:»ûtïBs¤çxüí'´7"§7C"2N[u'cƒGÛ€m©×´òT£kX$[XbÈȤŒØ‰ökÀ¸ˆ³­·ÈËø†i#ó‚níX†më¹!pÑ ›üôÒ2PÉÖ×5ËÇÏõ¦MÆtÇ(Ë‰ËøÃ1ôAŠÂã8ƒèØ{øa´lÃj,Fºø!ðå¼z²LkDC/¼µý)0*IqBFHŸ¶¤^[Eî¼ÔòÕm™9¢º°÷¨.ªc•qL¨n ¿ÇÓ†6ÈÔGÜ!:1Ê«Zø[¦†~·í=r ¢8/TɇᲑUÇLqï1³@'æ÷õÆF‡a;«ÚðÙÍ‹0¢°÷!yŒ¸e×#õÆ #&àfE!í=FÈ8°]Óm=$™ÒZ¡µ¼÷h­Srû¥q”X   y‘ BÙ½ KyУ‰¡åÑgäÿÒóÆmղɩX“Šã,Ì0¢ #æ1 1„yå„áî~ôUá‰a¬:l3uÞ%žÿ° Œœö•JŸñ¸ßv…XÓCI$niKhA¯/av.äàæX¨Ùù}‘- ½–:w©Ëc·18KÔMNÒÏĽìÖ¡Ã=q20½mS<…ã‡SX1!ð@_ˆÎ® _¶ÜÊœ-úƒÈ%ωVêå!/×u`‹¦î4¦ýðŠü•W€ÑhšN¾k5õ’Q6J4媑F q`\Ÿ#*D«½êÐ9{iAƒŸ­¥5ÕÞÚºÕš_Èmáåaø%OìB4|„4nG©i æÿ]{üÖ//AÃC¾'Ëœ&Tã·` jb UåžØµ”Ìæ.µmšKi<íˆ.Eq"½¾60ìä´Z,}餘q1è/"ƒïq‘¸„Nðlk¡’ÌRòÅÙ<+%õi¥Œ}l0á¯à‰…Š…JÔAcb˜R7Ln”bbœ0½6ãt<5ãdÄZ&:¡– s\SäV¹€ ¹xm -R1™E"!Ï#æ(«Û—ö‡ùJÍÔøø™Ð£zæ‚(ë2 JÁ]²Ñ&ô¦’z¯ mÜG8J­²A WMÜ–L‹ìµëè&£~ €“®"ӣʠ±wTKk¡1­žgPÒ9mßa'E«K¸A%ÏW£Âß~b»SÕ\ëâ|·ºr|üÔ½—­H¢îý#>?Qù]H5Qûµ¯ ÝÕ_èIõSjìõL»bTBG?ÀFWûcWÀ^u–Kì=€'uwPÿA"dm²^¼•Ô¦¨¤°‰I ›”TWM«^õ¸R«Î 6¢MYì*ÓC1›„ •ˆ.°µ]ÂGE—·kƒFO’ì-â­ËðÂ'|Зîg‘ÆþÒ¯é2W¬qŒIñ¶¼­PÆ;¬Ï`–¬›xÙјEöÉ.èvg6ÑζWˆaèuy{£ ÏÑ€çeã…ÂÎw]6÷é°-`4ÄOæç×Ì&þ¤SÏ~l“á ð™Oï¾æ£÷`)W:Téçn¶Êò,Öu£Þ¬‘=eˬ†.‚ÂýNâÒÖ’&Ù‚-|ðL©4¥û;Îèƒ|åfg/ûL w0“T?i`gAÎþJÇ'fWݸ—å¥ÉÖDxt¡¡šnÖÇ/pÃ'dø¦‘{!{¾nì<§|¿ªÍ¦nšR£:;{÷ðb .:лÆa3ú[۱דrǤ…O\)9 Ÿø‡ ¡Á ¡;Kiuåø€#¿(v4¼'Ý„»Uà k¯é96n §£%ìÂÒ á( Tfd;FW*û8ÜI·zŽpdœtõ$‡}¨ç;“Ž­fî–‘6ib=š˜ßOÖÜn¤“Ÿ¶Ø¶Ì- ‡K7'ç_2·Áƒö*dIl¼=ô`iì$Õ6UóâïbŸ ÓRØamï€nªé3×Ï“¥m=uðÊŠÃ ´¾Ëé¸w4N$ê®»¶x{L1_ØÄrH1Çe³¹‹·¡†ÜÙ+O Ã_:{Ï€©UÉ—8Ò§Öj掮ÛŒW¯+òã½”c‹t ~ÊÕùKŸÛÜmû÷°>oߌ-=2Çߺ‹øøÅ9¹$ƒvwDÏéSzI,f²!â¾ô'™Ê!; ·ÉÓ•{Ýßõg‚®€>î‡7ÁBÀvKÿ&®nŸ®n[êîõ»Ð1Çî°p‚}lîN^ð°2ì]v7a™0|RŽ“lO¡Þ¾2ûà–Z†~aÐÉÒ=¹ý-è,ÅöIÚNÜâø—Óê{§ÀøÑD;U£Tõ­ÿ÷Ÿb0nÖÔÒXnù’dn;¸Äóú…H¨7æ“}é;¤@¾r3ÌúøÊÔkçÀšIª«§x–ïlI$«÷¹Û díÛÓ8.ç`6ìe um’ýVœóîRǨÏù6QŸqUëm#ÞþO-b¬ÆwI—P©ÆüQ<xï)õ.nèèÇù“~v.h¶çT³Ûn°î8餣îH=UG·G-Xµ–0o4ÿñANPÛŒF´Ì©è ÝR½í0ˆÍ5q°‡R°E…&lã&ÖŒNÓÕœ&I¹†¾³¹ ~øæ¦™M¥:K7qæ¥ãwð+ÞsU¢•;—¯å4E/¿Ôl¶-ž‘Âs¤ U|Óo-À–Àª´ìÝ6˜Åóˆd!o„Ç­:˜ã¥Su€zgáçxÓB¼„8q^(Î 2âó\ž4$òT$ÚÚuÄÊ;_ªjÛÍù\ngggÛ ûœiUrFCÓïvš?µ`Ô+¨e•¼^;/60;5{qÚùfÚMšÖ MÃfÅ'æÄàæÄ90A{_ÑÎb€l™Ú.þ‹ë\š:0¹2¹@ Åék|nuäá’ ü—“ yò™Eò×¹pœ DI–é@žãå|á* £1ák»#„TL³¼Ûñ=PëY4(Û+Èa|ø/MøŸÅä¿8>ü—'üÏâ óŸy2%³a[fmsÓÖï¶CÞRu`K”ß1üçN"ü— B^DxÎóBA<€òÃérðÚçü_8´rëòÆo¬@§7ΞAk·ÝrfuMÏærï–s¹•ú@œËshÃR-{ìj-—;q»†Ä][À‘®¥û€[ å¬~×¶qaqz0ï,ž ƒçŠ‘O0^DÔÝXªªVK·–9«(…â,‡Ë´ Æ Ïu¹N´‹K\È\§ž„ 2È?â1AãA?ÝñXK­™Ô§‰{ݪêº=MÖ¿9­Â//”tÈñIq`†yÜ[»h…縳³³x¤d\p wçÙ¿^Öù&Фºj4û,ÜR¿|M­èÄQþ êüßUZc•ª»NËøUZÆi÷QO© Þâ~E :c´ìžÊ Ã1çÿ1#úýw'–ÚŠ6ž:Û꩘JÍÜRkÑvôSFèï–°®ã35Ƙ²§1î¹¥xDv¸%oxÅÖûóråêTùÿì] XSÇ·‡,jp­Kõ.è?†$wIaÜÀ@E‹6’Ô@bưŠK­VÛªWÜ*Õ*ŠÖ\Ñ¿{]+U¬ jQDQQ”òæÞ²X^š¾—óñ‘|™;sfæwÎÜ™3sÎ ‘kcJ® £³&²¨ˆFÔBOÜÄJAþ(8…RdâWíÝÀ2b¸Õ¬Äˆ¯Pƒ4í•SÄWÈ?ש- ¬PÊq·V¹ÒÕÇM*]'†øü‘AQüˆÐü€°‘‘¼°áüÈ 1‘ü>¬ð@nÃòµwœ_Í•_“Û\ {i‚¨É5еžÉhD Œr3u¹™F}§KC|mZßñyõWÑ‹üÍ.« F¹êT·^4˜B˜£'©J¡R'ŸZ‰Wâq*ðz¹š®5ª«5j¶3D B©Øt˜® ¬éP±t¹Y&ÊõBÂÖͶ$,!31xÔ¥&Á,4:gš×ñú¡uz 7Frët6ÒÁ‰¢©j¹RèêE‘2¡&»á3‰*¥4!N&@Ó]´í„¦ñÑi+Ì4/Zó=Mbºç`†Ã04Ã(Q§§0b44À:m€Q£4DBÒþð‡ÖÝÜ Ð I¼u9 $Þs¦»Uc]ÕÊe³°¬'•¨„g=ÕP$ÅȤ±µèš«þàzëQþFèD`ctø!H}ÕVÊU¢Xâ²H¢æžFE`Í¥›‚®A#ˆÍ•R†ŸmEBæ;®)ŒÀxŽŒøxµH7ˆ",ãã4gkšÖrê´6ŸšjÚÛlœâù‰x©&Œê6”Ž×Ã(Y7r¡õ\²m$!¨nDB™P3( ›UBwó\ð8T±&âP‰ ¶FL%i¢õ(E‰T£Fê´ …!ó¤»ÏL(¨Æ½­SIiLAFòB€l\9ÝPŒ¢-sè¶H(ü‡ Œn’‚b8¢&e¢&–[£¼FÃd1ÅîuªªSfÔX™QÝ”e7#V¯YGxxÔÜ– D0i…E àZëBmâ‰êf(§Ñýcâ!|…®ÙòoÞ^Y{u‰F]šzÑK™ÀtƒF7êhL7‚`ŒÆöGí鵿i2ÐÏ‘*B;º×7W ¢ÖVÁ@ˆ¶ã AmRfrjrÚY·ït#$Æü‡ú ;C ú§þÆ7¥eºaƒë¼Y0ÝX‡!_Oð(ŸÍ«'`Ü $b$6øFùð¨xFh@#$ʸkuƒ:†B3ŒSuC4†w»nLÄŒÇDL7&bf—yF %Zc$jæ}}ÌaÛöõmÔ¬d¸ÿƒZÍþƒnÛÿ³ãoÂʤ=ÇôÁ<Ìïÿ™À¼vÿ—&ÉdÚöÿ,AÿÚý?ü±ëñDb‘R”kÛÿ³íÿý“û&%<¦9Š,ioƒÅC‚˜D•R«ª9ñŠÏèjŠ$‚!à8OïüL®™Ã§Ç:Jƒj§Šn|!P\© Hþ¹RD£[ŒšCÎDôùZ y¿IIr•W~(B“[¦ÛìXÔ”^ño|SÙÃBC½PŽkY½Ü5Éõ1ׄs¯a-)À<`:ŠS 1à 2yÇâ÷ø)}êL¯Aõè1õ¼bñ£Ã±2ÍÔ[ï”8xíÄ #¼ø ¥fžŽOÃk¸¶ñ?×,dêË„›iˆ xMÙf‚%|œÄý•ðÁT`À¤£T†ÙT©­Œ©âAãlSؘ/¦¢ h˜Ce£zŃÑSçËbt¨ÞŒë ž…8Pï£wêÝàlzíP§„ÖK˜>Äà¨s ÎÄoõ´N ¯ÏOÁ/I%¯Tƒ#üÃÁ‹Š©¦‰dP?¡ešš”d*¹§ ¤«‰d.1¢i4 4+NDKoQŸ†ž ´,Nåéy ˜¨Ühô¬aíè4FÙÁXm˜_*ëå!®^ëv ¾ñ¸[›PŠo%Æ$©t×sKä ÜAO Â£z«¥2Á´Eœ$£BàI(*42$ìÓHÈoäX(ÊÇó9Ö‹ð©ƒTÑdQM4òx… ÷ßSã÷}'¨¦âç7FñBÀó~þ¡ÃC#ÇâîÁ¡‘#ƒ"" à0ä…ûñ"C>îdz0^xXD ŠÔú |Q´•Ç}RdR î‰€GRîb(€ü#5¦m Â}ñêh£R苨^8Ì00²ámµ¢õÈÀ#˜×”Fµ)ãiš[lñXžúö…,)NJ× ¯ ©"^*”NŽš§ðf &Ñ‚4 )cA"4 ÌEâ¤" ;&%PEá`fú.B'O(…&Ù(µÉ\˜•ªD± “zjY4¯µ‡å &Ü6kþwÉpýYý‡a³ÿX‚ ñgYþLþ– CüÙÖƒ?lÃßdˆ?ÇzðGlø[‚ ð¥[ þtþ!CüÖƒ¿Íÿ×"dˆ¿ùÛü-B†ø[‘ÿ·Íÿ×"dˆ¿õøÛÎX† ñ·¢ó?6ûEÈ+²ÿÙì?!Cü­Èþg³ÿX„ ñ·"ûŸmýo2Äߊì¶õ¿EÈ¡Ùÿlø[„ ñ·"ûŸÍþc2Äߊì6ûEÈë±ÿÙì?–!Cü­Èþg³ÿX„ ñ·"ûŸÍþc2Äߊì6ûEÈ+²ÿÙì?!Cü­Èþg[ÿ[„ ñÿGíLÇ0ư­ÿ,HÆøëüóÄIñÒfpþ·k0þ7¦ëâ# àÏBX˜ÍÿßôïóÿÇåÒæüosþ·çÿzÅѴ翞70ž³ ®Àb! ©ë Œó¯ëŒÿüánþ2•W¢J(•Ó$„g£|Í“2iL#Ń÷6êQ‘R™Ð8þqânÑÐMeÎò¢±uÞ½õ°&$®™3o¡1c>~/œYöÄÍU¦‡P ?ñÀ¯?UÕ?›&ùïmÐ*®Ùˆ  nb‘©IQcÃ5h¹4>VƒAŽæ‹¤ÀàЩ(¡ÂLŒŠ" ³¡èBQL]q4W<Šfc* 3©lj¶xÌCȮөZ¡3Çc"TƒCe±0*ÁÌ2ÁÝ™„¦¤Ê|'±¨LtÊ„Y µB¬.èì$6Á`*ÊŸºÙâä¡býúãWòù2y\L`›Š1P2øD˜f™ˆÀë1ÑDtm¡" ˜ÊÂP*sÌ2ã ›Q—_žJ”Èe†† *Ê¢ã1FÌò‱L?€˜Ü€¹…6(Wt*†aT|r`³\ÀPÍbÖs¡¤y | È.è9Ä< Z}ìÕU¬DØ ò à,*‹c>K,Xíé¿q„ÒUCT6`ʦ²‘U4ËϺl¡Wl¡Wš=ôJsGA9¶#ÿÏÉÀþ'úgÏÿéÃnÿÅX¶ý‹1þæ§j5«žxa“ 1oÿ„èãã÷?bt[üW‹PŒ˜ËŠåp`1Ëf‰…(!B!cÁ †þOÓ‡é¿@Ñ é?JG Ç&“^ 6ý·ÅE’°Z+ÛAúú4`€˜(“в!˜Í¤²Qm3×B St„"t*®Í‚zÙúG\…ÉIƒÊÔæEÙ"/ Aôóš·î@¥2Àì–ÅdSlL› ¬«éúÖ=c Äâh*É¡3*Igzà: ¨µU@J 1€ â]ðOcøwèƒôÌç›Â£ý_Ū£ÿ Ûþ¯Eh^øÈ!mÛtÇe¸mhH ÏÎŽÜ|InþwÎâ]ÇGýU]ݵk×Í›7WÛÙuë¦ÈËË[³f¯¯ïÌ™3‹ŠŠø|~ïÞ½Á³ÕÕÕ«7í¾Ù«x##ì¸Å7ÄvvÎÇBý"§d>]5B]øKç9ïfí/ñôJŠTˆœÜ3þÆçûWõyS/Ì={šír="ìiP×óÂîSY{Άxn~øÕý1ß—Îàãî\ Ù/±ë{é™WÇw Z†x“iîÎ,òपg¬šýîÉö$ 7ÕΕkç ¥‚¯dˆD¦Ø“æÚÙZÃÏÛz§.}u}:i5ò>kÔYÙƒëE+^ÉÚÙ<^øŸÜå²wl¢,W ŠÇ§äžzÜ ºiŸ>ŽD~L"Gâ.– OëG}EåûÆslAuß•¼‹GÏN[÷èôkÏz¥zo_ŸþëÞ¬Ùüîæ x×w§ŸXÐíQöêÐ/0\¶"·}õÍèÙíç\Îö ÿyÔÝáðê¼}}6S³ȾËfåûß[OA~¸›%é|ícRhZzêš_¿ÉôãAs•\ÅŒ¿.ØXå«î=T™¬štk†S^Û°{‘Ïî¬Þv"f™GÊŒ‚¨!Yד¯¾:“5ëÝíee‡v¸ìQz´¢gú¤'_8ôi™ÓfÖ!¯iOƧÀû³z|s»¤9«ðõÞ§£3×/ðð¾ÕaÛá)‰}ÛÚÚ›|T¯_ëÀЧaÒw¾Þø¤Ý¦¸óg÷ô!ß+•¿u9ÒîÀ×…‡—NÝÅ…=8¡úAùš¿.u›,¬Ü ï+õQ•zÝc'PçVäGÄLzøç¹²\rrFÉÃä”ê»o¦Uÿ2hψÃÓ«–Pz¯$¥MøÜïâͶ3½§'1Ÿ8‰*'ßh¬>æqÌ}äàÕy^y÷ì|óâ–ú“à#¶8]¥RÈOófwL™Ô‡¼j¨àcÐÙÛ¤ÃòÛ;¶{tðþÉÃyÓ ¯ýDõ¿Xº·àвõ¶°97ß¼½vÑô{ì«rµÏÜ+²Q~ùQó¼üªýoR û=›ž¹!!Y6¼pèuQ ×ö›‹z/x9ˆâk½ûÈGÿ¸àŠF›áûåZçEíæôßë6iûû«Ÿÿ§ËòÕ¸ðÿüöÎÕs®ÿ~#£ÅÍ«?íšê0­êÂÝÅÇŽûèŸäéü ÞA©³tç©ÿLa–;ž¼>øpü¯SŸgJÎÄ߻Ѯ‹dC¨g+û‡ã–OûëýÛ´ßêyRÊÜNÏÔŸQu_âóâeÞùÞûûn•Ÿ/ûëY×­}ñrã”÷¤”îvÝyaaËu/y.’òùâo}²;¨2DÕv˜²µ¨dFéN÷ÒÉŸo»õø“z( ½~ë0œMú|½ÏÂ^a½iÂÓ˵SÊ®|ùhø†®rÇbhKâ°ü Œå;æ¥O¸Ù¡ÓìTþñÅ=Þå ‡-¶·¯p<ìäå6v?ï¥ìÛ2GPÁù)ü n%yȲ£'Ïöÿ…îw1³’|0ð÷þ¿ëDG‘x×›Ò ÑÔ_M˹ô¦êׄï.þQ2gÀÉUÛcæLJÉæMî²'xÖwï“Õk¥ª};ÒWìâÛ±s~ɾ}Ê,ÿ¬}~E®$RÁg·n•|vËç§ð3’6¬Å™­#^9~üì»ô…£‚ïåQU­ƒv_¢8QåÕo[°©Ð2¬Kºß×ïfL9Î}7qöàGИì6vÜ?[÷mñ›ê'ûôW?zó[nÏå?(%-q[ùB±óÑ}tw°Û…‰’ŸŽ‡ÓO= ÑB×ÁŠÈå=ƒ~Kq¸wkà§Uþ³æ ËŒï…\µKÿmÙ¨’3y’w?Ïëx''´Çý´œ.”ð}ÓwŒ»ÖÎ:šÂýíLÄöiÜ›h‚;­ìÖmšXTìè>cYøýÜýÝïï†O=^¥© +#"Áâ¸*nvSliÅéþc%7üjø¤;Ûñ‚Ô_Dø$æìÓÛaàºüö[ïŒì‘~òÉ¢U_Óf¶I¦p·:+L_å%¥çOÊÛ©ÝÒ‚ŽÝ]°ÿEÑG¹éùE”#=ìûÚ=t±×µH¾îOÚ]ÞcYRñv÷_û_s"=ŒÏf F‹;Ÿã~¿ëÕ¶$ÔS)>7Ñ»Ë3ñZNå '¶NKy÷Ï“/ªVß}~œ(B‘éë0nÆÆ€ÎÞóhÉßG^b(Ûº¸¿¹¼½ïÛjÞ?¤eÝ^[6ö:%}cܘçÙ)[­èá0ŽŽrzûDghí§?,=84sR[—SÓ._¸æß’ ù®Øu/óÊõ.éw»ž(ߪf÷|ÙêÁûeÝý—ú¹å§å=6îûõ»Œµ÷£âr¿än¹äþ²Ë1Ë.?-ᔯE‡=\r>õª–ýÔ[‘crhC:ïú~ÓÛ½›‡Ì—ES–Î;—š_꾈"9d)¨\ˆìгWK‡=¼èiÅWíI$²ê„]¶pÏÌùzè¶ÕW؃/·ÝüäÛAÅ™]IÛÎ~–‚¥ùC‹#f]øäÇ¡¯_B¡j$F_¾ûò½÷^::5‹45¼;¹ÅÊqK˜Ñk3.ýÑ=c½Ý¶Ùn+Þ¿#»ŒYìœ>g[®$ÁeyßM%°ËŽs'z‘}Õî´ãå¥$ïA‹™ <øÑ~†|Ùá-ûÏÖÓÕòûÃoi7ýò­‡3—JèÙ唫•gÙƒïÑîN>:ø0TQåÚïq/µz¿k™Ó… .Á_t&ïç$ÚTqhØþ7ãBXùnîJ ðnßà*gÿòVíP°¾êu¡¨ªdJÅ”¨íÞ7tÝ›žGÎh%/<²®K[q_òûMó]N}u¹£sÑë))÷’=|3³WÜtãœ~ï²ðnZ^ãW)^Ÿ;vFíÜÍßnÀ‚Ëc†XZvnÁªÀ6’A³/þèE>ئße[«ãU®Q½Ê°QÃËiý§µ?úÜþi+À¤_Ëô`'?qf¯ç;áÊßç»,¾ÄéCÆ›!BJº½:‘8ì:%<|’­ìyú÷ã}þ‡½+‡ªíß3 flPvCÙBÌn;”5[)Œ1ÙR’%ëk´Y²”˜²f QjìKÓJŠB¶l‘<¡wò¬zžÏû,ïïõôûý\ÿœûsæÜgÎg®ûºÏù|Ï}]³¬_¯ßÀZu˜ùª¹/Ø]"w **„sl`¢¾Še—f,¨]ìêXáMƒøƒeoæµE­ÁW"Í3칡Ñ[Aùòùî.©(™6*–‰35Ê ‹1ûŸ ¥³áP†¨Ãêî-|69µU®ÌT›2›D,/À9C´ó,Ÿ8\ÝaCŠs…øÑæð«“± ‰Jö7 ÖI‰ù€F úì·hsÿÉk»Å÷ “ÇHä½И§–É̉S#ðYÈ(¤Ñ~ƒúLÂO8õËæéKù€Î°— ÄITJ-?îsBC'«EÁ6í %Þ'‚Hó ªzgŽ½Ê¬™‰Ž|2¦ •Þ; )oÝÖh1âwÒž˜%óH—Éî!3,ª„Ž¢ÔîlVˆ(§#ÙV±Ö/½Mß¶%Ö*ö¼†=ˆðej–ú° ]ÈÍzv~ßÁ îÜfž[Í|¤r„ÝÉ:®€ØFê®&ÎprÇþ>RUÓàAí5™Pöí¥Àá€ÐúÌ@ ùσ5IÍwˆ´Ì2>&ÜW(!X™¹xÕhÔVæÌ0Æsº,:Ònó‹; :Ä^@ 3Úý<‘äòîbpBµ… ´ÃÞˆËPD’Wõ:þ*04~U×?‚˰ fyrWJV]D§fmš©G<ÐðÀM72Ìst’xº 'Ïÿ>Ìlkx%FjR@_ØÙR«¶¼Sàa]L«Œ ~ñóˆœcôP´’¡Û„ú÷‰8nSù'{zðQ‚-ïNˆ_çóŠáÏ©ö%ïŠà —ÓD'éH – ÚÎþ­ÙDUõØŠñÜÄ6Ö¤9¯Ìe.IÇrD€=Ð)N…YÇû,ÝUŠVCº¼e‚À´Y™ª÷~ISŒžÄýlÚ8$¡$š4ýIR½¤°Ê˜’l÷dFùû–…‡(˜õÕ*ÿEäâ EŽ~I$qÛÌ0uXµO›Gª™AåÇ·´´y¸ormn…À-|†‹ØÒÓthAÈÏ›9Ô) ¶rG_šµ>¬`Úäî×l§Þ‚×0µ¯=¬ Iß diÄZUaã:žZѳºkg<âö°B³œ»€k­'ΈÔÛܳ¢Ìá5Ò—X®:nÑP„J,ÏdÝù¥ ÖÂnº#¬·ª’®gÓÐѯôÀìÝ“÷)à¨~@]£¾{—ÖÌ‹r"• ×^LHÑŸæU¿Pd¹ªCäãž´ÿ8k}g°ê xuÝó­\ÄþHQÚ…„¿‚ª!þ?GÜ#,ÀE´çéë‘€¦¥ gb€ñôªhß ¯Kš„‡Ò«ÛütVÂV¡šÑš«,ª“gÅ@ƒa­ ÅÑ*^†PAmR»Iñ›§µŸú±ÇDÕ틸4¦š›>Sæó%"ÍäF¼ޔz¢OjGóûŸº»,‡t±Ü[ÊÍ4lÄ+‰ScÆ\Ó€¬ò+½ÀàI 7f@hö¸!íð‹§o¸pJ@ætC%îtÒ‡äL[ýÀs-/:{D$Û¹Žâ.Yhi¨UÕVŽ+vÕÂZdÕÎÕ*IÑvK¡:¿oÉÑ* ˜C`æVsGy¦ƒôT—{D2ù®dœ×ôI‹êRA$ç-£úÚòH@¨û½»'!ãA–èSܰ—Œ§\X-Xuø î“¹ü-™c‰9D{ƒ!Ž0qØK¾%ð©‚nÒk“„Ì`2U7.£±'îØWST[E>˜¹J{¨8ÅÍ÷þœˆê¦2ÏÌLjžZåf÷x•¼“.?ψê¢K¤\iÓ5²M$õMê«?Qü$¥ÞhñËæ H‚oHB¡Úåõ"¦ïóèIFÉ,ì‰QWaÑÎ'Äõ˜Bg €Úмý>·ÉÊ‘^²@ØKq¶}¡d5%Å;¦{jsÔK‚v±“VÓ`¼‚†šê%ùP'âÉ †æ²µšN±‘¬ãæ@3Ê™gÊóšƒ[ôíSýQý©ís@R["/—g:´n ö»Ö–Ä u¿Æ÷щ#ËVS°V6ù¹p1ÃÇg‘  MѰŸŠ¶Ÿ?©±t—æ×;94)íÕ1Ö¾¡iOÚÀJÕ&þX_ÿý†ò_6ý_‚õü;ù/›ùƒõüCù/›ù‚õüCù/›ù‚uü;8|3üc6ó?6ëõÿ åÿlò¿!X¯Ü7Ã?fsýï†`½þ¿¡ü§Mþ7ëõïøÍðÙÌÿÙ¬×ÿ7”ÿµÉÿ†`½þñÿ$ÿhä—¥ ´öþ‘›üo¾æÿ+?û¯­Çvvx§ãÇô…à?áÿYãŸ6äHy̦ÿgC (ÇcZAA…B£1H'E¸Æî„Fá ¸úú6ñßÅßÕÿ_qý‘þáXÌúù„£°›úßüžÿI ðß$›ü”C`Ð2XR+ƒDýÔEQDþ›ÁóKgäšuWüßîœù¿¿©ÿ¿äúý#Pøoô†oê#ð[ÿ°Ö¶]óÿPèÓ´ÈþŸoûé©ÄöÖÛ~@é?Ú~.ixeb¸š¥?v;^ö o¾Ò•Jmp¼däxNðØÖ“}½¼^ó˜TJ?ÿŽ^\1dÔüƒªC1¼"È¿ƒg•ItLœ”~æâbL¥Yñx0ѵýWÐ*¡ÃÁ27e*‹Ä1Lé˜f/Pò¶ ðµ~~½~W×A× Ar»ïu_ÉnììÖ9TÎ$=¬é‡,­Ó{1X?†}Pã÷Z4h™Lh}*šo8ÎÜX Uj’Ó?•åd'G'~D-D(ÁmÎq¶šÎ:iPä*¡LÎ4vQJ{È5¿ð½ÞÇ»7|ØKM¼Œ#`Ú.ZW0é ›JÉj’µý¿¬Èj#Ââ5ã…Gú¢2MA—Í0Jª+Üe¾¹ßÉ =ù÷€_xOŸª#Ñ-5¬Î•îy³Ï£‚r¦Ì í^!ï‡2ŸÕÎÌw*}Rˆ•­H ïuoœØÕÁ–<™¬÷y™ueæs‹ñýГÖL–ÅÉG÷Kf$ñ3–¤Yêèæ ©ßšdJ ¦Ü?Z7.›ê§Uz3®Ý ÑÕE´“‘b.w_ µUº1ÎÆçr>³[eýàQ\ë$¸pÐÅFõ¥Ç¢¢B§ù±ìA—|Ë8ÕaLÆ~åòë÷ÝÄ[6áEõš­QÜ…•y­X9ɾ’»ÞeíIô%Ý¥Î!+­ü *GµJ;q»:ê°Q˜Ó÷fŒ¿/*~ÌšgÒj ÈØžÌRÜ­tÎi`Ži©?ªi¸‡a»?¯Ò<Ë !­f£¦8°üœ‰î1nsx£›eüò¥±˜.:y7Ót2ËÄe”¢K:¡mUdþaýã·[vÙ?lŽ3´æ8›¢,Ô0ùÄÒ™À¤2©¼-å¨äù§bätþ%]ùy[µ,ñ–2`ùiO|]ŒËPí§®þÑÑí…çí„JïOðW†tô‚úéäok×8ó’n:À÷õVÎf –6uPnKy¾›j«ø¾ÿı¬#{dX…ôàGgM#mš¶él\’TªÓ¥TqÒWRÄŠüøP眄O› *ö-Cò^?FÙÀUâÌÎúî°¾ì{÷l½Wgt]e$¢Î-uçˆeêË ;ƒwNð/?².Z®yÞi×üNå~†Ê-f· ãÛž9oªú ™TŸš¾seðÞNÊ‘™Öò[@éEaΔŠ}Ó¾°ÂAþÊþQ·^Ó6ÕÖÙ7UßuxOŒš9Ô$¾;u>™—msSU'&yÈ:»LµêøRkM,%>Øø£%y–\…‰OêcG¾B¢·º!I30îʈ¤°nÈå7 ÓÛ_0þüñ[äIH•ÑòÎ÷È{Ï«è¤çü@G»ÈhÜEêÐÕË•"³ ÔÇ<öÇOwwÀ8×X;ÝTÕÝZPš"ËbëñüaWÛ‘°ÎXKÑWœF£¸‚'÷Y?ÁƒZfil6rV§ÝM¶ìŽí¯CZP—A]%d1^\(H<\\'•Œér.Œ8¿Wìð]WúõqbúØwf-Nam¡·Ÿ*®ôÝîþj3Qëºêà­:^r)‹½`¯«TgÈ /Ç÷ÝóÍ|_&Âÿ§+ÚÖ×ÿ¾¡ü÷ÍÿÿÚ¬çÿÍG£à \õÃú¿Íõ_‚¯ùÿùùÿ?¨÷}?[ÿû…,‰Ü|þß8!ðX8ŽÆ9 Ð4°( ‰C(:Èãå𨠡`ÿþ¬þÿZâÏzü‘þhì×ú_{ÿ³©ÿÿ>~¯þ‡—ÃËÿz$ü\¼ƒ+ e`į*´ƒ øß £þ¥Za-.Hû«¸ í+~?{Òå¨ÓY3_rv~éŒB¬¥ò H8³Y0üŸÆŸÔÿ_LüY?Ð?R‰ùþQ›ïÿ6¿Sÿ3¤µÏ¯Õÿ >×þƒúCÁõ¿4#¯kú<Í﹦c•¹ïNu&ÍŽNáÅ…*ã»Z< ¸gi¾=Ï2ËŒÙú¬NqxàÔÇLªVD£™™Ÿ¡LìÄ*‹–ÝÓ#s2îÛRö^s&âóáßå7á¯ó%dÏ5ÌS;vz•]©| ×] “b^å¹eéÁk¤²ƒõjÚÇt{SEkCgE­nä9³¥qòuUç¼û² Y¼¾Ž>h· 2-gQ¡.uZk䣇oEnŸZ%hŠp7]Äà{'|¹8ÙDª] ÕD÷öË”m¡.6™>Ÿ|m+^WÒÎA,+r@qÑÒÕgq®ú©‹yØýîìÅʃá˜AT«T§C5½Ö‡çvéK¤()Ñq©=Û®o ´<[ 4kG-ÒÁ9pCº:'yŸvh¦hݧpšÏøú¤š$ÕaD b« uõ9Y),|ñ¹X>iö”O²TÂev@xÈÕ­WŽÝŒf Ü,ÉÃ)¶ÚïŽ7µk C(‹oo£¦J–áN\£Æ´žFì ¬ê];‹p8‘I o=`×kcMa‰ä’ðƈkqµ("`µ­XĪ "Vk­¶^U¬ÅâѪ¨(ž­h?ñ¯b?ZýÏl {ÄO”Ý™ygæý½s¼³3ó.>à°åƒw"Ä¡îØS©}×÷Éé_[¼÷D ËéÐú!Ó<ù5Ãûé~J©ì¿ëIê­\æŽó)–=|{Ïòoîq‡ê’ôéþ,ߘy£tªN]ê»<¯¾Ÿ&áðî±êˆY=>«ÆæÔö¾#º4½€“þcjU/éWïþ±atl܈Ìk£NåUN..û1ñô`j^ªxO:"êɆû·ŽŽWF¯:ÛOÃ=÷yR`Mÿ™¢Kwu2xÍYÏ;¢^ASê²j¾/Mî³å£/SOüX¸%˜uê<ûôµO÷¢Nߦ±|"^ʸ÷ñuýP/‡>±—çsËsÿÛ¯ïËF}ZúIüâw:/æºdí…ÇKJyIŠÛ]z7ó²dÀ°PO4|N†XW\­‹ħ³æ)ÏÝ]üÅ·ŠYaóホ‡*,øt±~®|$Q¹£èü4ì÷ÈyЇ»ÔêèyãÈ­Þ˳ wñþð¨O·½}†ĽþvrxDFñZϼëw?ÜQôÓ°k¬£QQ%ÎÇfM”Tå*Ðe\Ñ·ä»è ±ýGmí÷q@Ý¢ÂÎ%K5Åo?*q®ØWR8>ãðgEëK«÷¾åÚu–ëðÜË$ïKï»ÓíØéK¿–, *{+ÛoÈqéÍõñËŽMü§lÑšAãËWå ¼ïîËÜžž*"è²i7»mžu2·T$Ù*ÊêÿæJϜχÝL¨*Àê„,¿²ùêNøü/'õ«\rÏoŽ˜•óuïªz^^œ×j×[úù%½6«ÓŽ©Ý»ï}7<¯Ëàu9õŸ¬–ÿœžZùq‡ä§UŽEqäF˜ÈAù˜=#¢÷Ð$Õ.O˜!ÑÔ3~ùDºäv4¤Ïò“HèŠ'gû8ÍM¸7ÇåA—Ú“/•üЭ>wÔ°}åa×WÚ’ñô¶;òÉìîsKbÜ8t˜ÛÑoHî²ùJõZ×orôë5ùÀ Õñ i•{yWã»Ä…ÊóÊåã¾™]… Ьº¨`EõYô[c}¬šøµÛæÊ]Až£.3·xÏ­ÊÝß%ê«·?Ü5·xÛîAw úGÐw.!ÍNd3œ´ã³*¢¹®ãbêg¯¿x›*Ò¿RG…ébè¿Ì¿ÿR6³þ‹ÛÏÿZ…Ìñ—Ú þ<ûú¯UÈ 鋽ÿß~þßúdŽ¿íÜÿ`?ÿo2Ç߆î°Ÿÿ· ™ãoC÷?ØÏÿ[…Ìñ·¡ûìç¿­Bfø‹mèþûù_«yû·¡ûìø[…Ìñ·¡óÿöóŸV!óþ߆îÿ°ão2Ç߆î°ïÿµ ™÷ÿ6tÿƒ«yû¡÷?Ø¿ÿ¼jŽÿ³\êý•< À­øcs¹Äç²Y0üa,ž}ÿ§UH8Ì?ÂO412 ……"‘±cCCügw&sÛÉôù8,i •N” &3 ºü¦Ýp eAú•”ž@ £pw*)Y>ÍÛÙO­Ò=r¥j(gDbxòv†ži­ó’È­ŽÒ{Ëujw>Ÿ+pG!O x ÊÇÌ#¹'5*¦A/=dH ô©Mo]UI(!Óª«P!W%–›»!—ètΈ–Rx;Ó>Óu2ŠÒ;#zP6c‘`Úµ8]££ñaîîH£uq*âo`gôQîîâòiˆDAètÞÎI´Gt蟽Ù³"Á=²F¯éaàOƒ³õH"¢½Ÿ§!­§–ÉAi´Yª‘…Œjàl j#B¥Rëa½Z2 •ëôíâωëŒé!$Ï›ƒ-Û°qŸÁAQèN· [Ð÷iŒ`ˆdrQü:™:E‡¤ÈäìQR9*R h¬¦'“ÖèaZ³UxLåYÉls{û‚Iž,S"‹mÅmò3‹a\ŸÁfÃ3­‚Åb’d Ö¦ƒÏ`ÎÁ8 xA gà¬V¹ƒÙ"‡jÂŒ$ #—ÃN©Í\P‹Ö 6ŽÃC­æCÒ·R69^"WÊÛÌCÙ g qÚÔi ÀižÁ’Ðí¨ÎÀP Ž206¯Õl8@-۪ͮ س9|Æç·šEë×öÎÁ,– K=·ù¸¤Fôjz‚exÀñQKÇzæ#Ôb0=kÒÉK(…BC$˜Ï4<ë4„Äø ­0žèÀ4ü£mxò€QU fÎôÔB(à óV8K[Jb˜Û()eˆžR†RR •:Œ}@òÀK+O—ÓŒz52 “FÃ$ÔÀ´«hódbµ^¯V65?þ‰f“úµ¨ Ié$tõ|žQlÁPhŸ  úJkœÃ˜eDK Íu¢}%·<÷¥qj”&“äï³B%‘©µÎÆ Á‚3 PBhiB[UO$x"JÚpi9ðôTk -ªÖ 9üA›VJ³Am`ÿfSᄪWB©ñSA4ÁuzIJð Ñ((û‘λ¶Õ9¹TЊP8ýn¡=à-m€ÑüÍÚÜú²• nsÑeyó©\!ÿ£-°)VWkŒ0Љnˆ`èéA_ˆ*óFÙ¼1éžÚÄZ“A¥[ ­Ø ùÓ/(ñjåؾèæÕÕêF²a¸!'%èðõ>BüÄ>¾ÉzÐ*=…L1´óákÒ'”Ðê ”~:¥  à†I j£W{*@x <†^ ô0ŒB@‚ ”‡ŠRm+m«syB¡’ ‹…’‘™—Žåµ‘ÌŸÐSæi0Êj’†6Á4Z5°Â”ˆZ]ÐÆ'õ.¹ŠEÚøƒÐ#r=’"W(1m$i²‚€˜È„QpD¬ñ ŸˆLðŽö Mô18A(æ#4¹R£¶)„VK¨€BQ:, Ú/Ä÷"šm½ÀQx@L ø"‘¾Ñ¢¿ØPßh$26:2"&À™†v œdCáÁtQÈA¦y$Û^‹ÈØ„^ì3y 1EÇO­I… N32Z•$]j:´UpdH£@€ôé–ª­0rƒÉù§Ôy¬Y ® :“â!Erb ¡C’Ð@™Jµj¥A¥Ü`Ô£ÁzªDœÏˆdj%H4XU r ¨EåÓÓ±<b‘JäØa>3¨AÝ"å”H,†P%¨“ -i1Î<†Ò©Ýõ”DfàÿŒwÐ1L= ;o’ÔR ]Ó@€ öíž=Dz`’P(|—XœÃÀÏW£E0A9žlž'E âÒ˜­ #âTCÏÖ8„ ОLfJJЇiå46&½àg캶X(0F¤—èé©ñ³iDh‘ ªé:Ý·W…LC-À+CeaÏh\@¦Wº}lôêóï¿6tÿ—ýûŸUÈÿzÿ—þ˜ýü‡UÈüû¯íœÿ´Ÿÿ³™ãoCç?íç¬BføKlhÿ¿}ÿ§UÈÚÿkßÿg2Ç߆öÿÚçÿV!sümgÿ§}þg2Ç߆æÿöùŸU¨9þRànM­Z1eŠšú‹·AC€Ûqÿ3‡ÍãqQôÿ‚á¨ýþG«”d X„TÊEÅ$…óI’À0‚-fK0”OqÙÔ‹.ŸþYúsíÿùnƒn«ýc,n“öÂöÏcáööo ²tÿ³€I¢¬gjB£+7 úã°ØMnƒæ2I~‹=h š¦ЗB ìnà^,ý©öÿœ·A·Ñþ1›Õ¢ý£vÿV! ÷?¯ì`òÿVt{ øóþßÖ5øK©ì5§Þ)íWµ(M1åÑœ‚ßÇö|¢ü•øqIãkçûèË™›ÖÅõèWªzµcõççÇ/™D~9S¶éõS»ÜÖôß$½_ÓQæ}ìATÅ[;E–žä»ŽË’l=É_Ð¥ º°ï M«Wð:U»ó;Á®˜™Æ‡³o¬Lþ¨>òÖ‘m ÍŽeÔâøÇEHø´D§ÑÝMŒH[#½ï˜t¦ÿõqO§þðšòþøóñýf…xß9Ú5kyÁŠò‰9Ò´yÓ§ów ®^ys`í´×Té0·Sq2EÜœ«ï¬úeîÿˆÛ鳇ìzµ†ò\Ô?rZØÑé¨z¯¤¦äÄýàÚe.Ù[“ÆÁRÐlŸô¡Ã+Ý^Žéæv:÷é~¿ HÙñƒ©w¼®ì @nnOÛ®êóùÂÅÊ… æÿ$K›õ¤à¸“úX ŽD»­ìà}ea·—K«3Ö;<í:•ú8³£Ó­å×k{%íø ñÜ{7¾o¹àõü…›—]ç¿Щ*ûôV÷A]½×i¶']¾¹ið6fØ»^s:¦¦¬ù¾rûÁ³‘+ÎŽÙ»w˜óš+ê–:R^ײW(ºD:ªËÒåÞ¼üÎ’Ò›AÛòû„5¼)%’Úi+ÇzŸæwú¾¦¢"¯˜³lˆpµpó4ý´-Áû£‰A‘Kå çTˆ9»w.Ïü¿ÄQï&- ¬ýéXo%?eľë~±øÌõÏAó\Ê+S'8üõŠ3OŽ„ÿsõøäOÐ{-5BsmàWAç~È›|<óÂ|tÌZÆeã¯ÜÚt®p®W<“÷­UιÀGͼáP·vð#–C7ËíÈQ?lW :þý«+WÕl à\˜²wõÅøÙ¿úðÛ…è-gÇI÷ö쵦úÈògú®ÌýîÃÑu_äÜ™‘ÑQç6§øƒe#ž®FëöTeT¬àØïq®ËÐõ—X:ÝÎ+™=ýѦã˜1|ï\8äx‡Àlþ•—)’r£ø¯­{2ê}åo×uúñáÛ)Q½jEú7òó2:&nøe"þíK»ë£ùç¾,Ðü¯Ê±:!ýò˜Uw &Ï?"Ýî~tþ•¯>:2éýîÒ³eïÇlÏ,;òíÈñSÍäã˾?±:¼¿°¶7AfÆÞ¢žû%÷ó%3z—ížKºÕ>½xµ3ÿÜÌíßìí(¯–»,ëÍ={kÈwÁÇ|Šî=òŸqR^øëპûûïçÏX[7ZøË¥ÛW9>½x©pQÕxÞðÍó³È3‹„œ¸õ‹Ø~Ù%Þ¥ÃK2ò&¾W4µgòŠÍ¼{‡Ä[³È-aN“ë‹Ý†D~¹`á‰ü®{>Ÿ>ró/—®ˆ9iüC^Ÿ”y¸èؼÓW^Šq½×6Ç ó6'òï«ØÄóäÚí”,ñýÀ»/•zwïüîì%Ué¯ñwþ–¾Ðïg¯M“‚F="ë†m71c$?çôÀÃ×÷)³“4þƒú†÷Îïv`mýû»‰ªê(¾¶n[XœLæ¢ÊŒsYqöȪsý(‡!+6uxíbhÅW1Y1‹/˜~ hjÏu¥Þ©…»?³úô€ ¹Ù¿½¿)iÑwrŒî7”ä}ÁäfWD_Íe¥×;õ,Êä#û×Ê`øo»ùØ|ü·¡ïöû߬Bfø“6ôýÏþýÇ*dŽ¿ }ÿ³ÿ± ™ãÿB¿ÿá64ÿP®½ÿ· 5Ç¿Ñþ—©õºBC/Úü5/í\ÿ7àÏâûEqûú¿UˆGñP1Î#ؘ€äó¤,.Êfã8Å£¸|ã‘Ò]>;ý³ô|íÿÏyl£ýƒ‘3ïÿ1ãÚý¿Z…,­ÿs™$OlI §«†306Žpq>Ã1S26í@¢1<®kHÄçò|"àá e5ùÔ`æ=²™HcZœƒÁ¯|”ÕÄ…$ÈŽà[p‹ 4ØM+h*¤B/‘‘ÍDš:-"o‹IRâ§ýôÿì½ 48r8TŽOFÓ>EꧨˆÛGWrå¿–”còVãZž„KhŽ:ŒlPGÐ-4çÄ£æ §RªÐœ3ùP>ñOÁ]ªRÓÒÃúÑL°,]\ä-ë>RÓ`âëâ†TpÀÍ'Ê‹‡Äïw¹Gà÷4ºT÷JLÆÆLñú*–”i4ŠÐ¹í f¯2îfŽO¯Ã!ZLØeIçZ€`¥˜ m¹#ºYHh¬2¨ Ï2yÄ2Oz©ç!¬F •‹ {µ‹©ùª)…©MÞ â”# “¡,ѪóÉç-eòw¶i–œ;ݧˆKãÐtäó»Ê'—;5'8MÈÔpµ—Ø™®Æ+p†š#S.ìŒµŠ‰»X‰W0hX|Ÿ92Dóò3¶‰zyr¶»…Z9=²Ì%÷Æ/€ÔD>ƒDv@>ÕŸ7 €hÈï­]‰È!=L© áœén¬å±Ït€+f"ÂË5@þÆíæî¥·ÞZ0Áуsô¦¦üc·Ù6Ä}NÉÊ ±|QÎõ©-E6ã>¦a¹çL‰×eO*㞨q\X^Y7U`ÖÏ|š~½„Ä(:É<ëÞX¨ƒsš‰‘åÊZY"êvöè%2œý€©dmq2º±ùUÒ¬ðžDž[èÁáit…ì} +EƒHè»ÖÁÜ.Ýs2¦ó…{€úñr.€:4;``5n®çªÏx›’0Öí‡Rîœ.wUvÏ MC}qÞƒèp|J"k ÔUs"8ÙÖQûZ‘RVQúÞgÞ]ÿ2³uå/‹þ“¸1¡_àªçfïà³×ëlp–y`;–;ö,O޲H­LÊ1ZvÕÜ +pÃÅ*Øá†%>wd< `D2]¾©Î†gW’Š¢/¤¼ŸÆ\°ËNKw„ÞIC¦t¤Tþ ÷öxë$“ζO&…‘Àäq/ÞW·ì©g†‡Cœ)Æg_ 6 ò;>{™²Pî~lÊI>,}5Œº«ØÊô¼´pt,®x†ç¶ðýà‰V½Ag1éÏ)èºïÃé&øE–mµ¸‡ƒå|ÛÃöê·Û‡­¼.¿ªÁèÄØu…Äé$ %Í'xÈÝ©M§å =Ã3Jܰr¿Î@g»l”ZíòîyIÝ"ïÖ€÷žKƒ³È9ùvg†pF÷C«Z „8N¥þIe#dVÿ—ʘ™;㺰T(¢›=Áðùô)™#‡Âå>êËÞZ2Ò@àÎ~ãïäÈŸ/.e;ˆw¿Ãj@ õ‰×Àë z8‚ž9wŸÄHlŸ 0!s(ÔI˜~ÀˆñÓèJéOÏd<ï\l½%šW&ªIEv÷-SØ B5ÆâRÔ3fdìý`ɹ;Ÿd^±³‡µÌó»+ˆŠQ©ÄïšGö vù òK> ÄP>;‹zˆÁÙ Þ‘šbpÁU)3uÜUª¾f*Æâ&áBSÌQLþ¬G-Öˆ….¾ª$èœgQ™(©©Œc\+û§Ä*çv0ûÊä\G¯.cæKͪÎȳŸ®RË\@Êtë™?ÎïœYuz8ç4e{jBèpš,t"™ãçsj³?ŸKzW› )̼Z2F˵\3h–?¢6\Ÿy²´¬X<êàþÇЪêEc¬bÓ?‚ÖÝhÚ‹ŸÁº9)ÜtC ¼nªà¢6­ÕsÖªFO¸õ†ú¤{ýP¡ !A¹G ð¶ár¨h‚€` f×é)䫆3ÐØÈ®Ù 5ga }šãÏš ã߆å¿r·³Žôpµ¾Çwu>„QŸ¾ª‹Õ» ï2ú~÷ˆNÅ•Žê©(ǧ·Jü $ÇyCÛéRú ÀïíëAÛüüvï™·ÝNæâ°¬š\ø ×ÅyâµïÀŠ–ÆùªæÐ`$:ãÝFχõ/¥áß¼ÎÁ±È£MÞ‹’“™Å÷§ Ï~”`2L-nðGËpbÊ €L¿Låbe ·/4êÖêw­ÏOv4·cÛ+]žR61{©Ìf•Vð„øKbçUM©stP9È䲤Xbë3r«®;MŒŸ–ÚŠæ)¸_½Ë…Æ3¡³æOÅ.­ÜFß ´âe|Äm2Å4þö""çı]ŸS2 ã¦Ä/µ•ÕðSæ½8­° 7¼˜Ø3üºòÖ]çšc‡i£Ü“û á¾íoËó­Xj¡ìÈ)(è ?!‚¢<žìi¦{sÊ€%3Ú*á}qE¶3œÕñ¯ËÈçï<TßcòàÛñÚ ‘6p îÛžsè³Ø™Cói{€µ]GÉƵ=€¸2«jhÀ5«Aùl-‰z/ãL6í¢¼Kï;z{kê½KÞƒý®.1ÓËÆÓóï×Ð~‹K.K3ý,ýŸ°ê…£º]½ú4Ðéë£çªB)Ï„Ÿ \ù2Ö½˜r»Y[2nùò§w‹\!šòrç—Š}Šå¿ö~žZ:N½öåÓB[KKÛBk7¡¥;=&÷Öa+Þ<†ÝTfá+Å>}Rþk_\ ¡üwÎõ!‹˜ç¹L‹-ôpI--CE‹#“ꥰüO¿¾\JæàC:ê-4…ÃUÔÆhŸ!ð÷óÁ£·¤'¯OôÅñÔ‡ñ^´ÒÔ³\s9F-Ð|éÎõJ£+G Cl©Ÿï#œ÷y7˜Ñî ÂBßa"-Šœü™S>þ¬fw–Ê}n¡Ž0§Úd•wU{ÆãbÌ÷P›ªÞËt(8\2Êݧ·äç–úøNµõ sao:q‚ ?T„©9`‰ ˆ˜j2"ÅŽÝA$Ëí/’z©'Õ¡ßR¶ ‹ZáL¯¦bp:³l˜jnïz'׬¦clÙ·dÂBéØG.Ÿ†÷úÛ?‡e¼ZèÕ­h x¬eìâë"3˜.wƒ}»§ì¬«VãCoüZyVTX&€5¦lï¦ë%'„«¦bïñ=ÛoÐYÜ’ß¹ KtejLØåñu¬ó¾•×=g¾=2³BÆìjDx“Ò„ãÏ;sF3ÄœÿŒ³òR§÷È}ôÙð’uä™*L&úÑ.hëM•ê³$øè…JÏÕk„[ëª}CÞ6¨=®ÅÝb³fè ˜¶AÂÍ­Ú° ‘ˆ‰ þnBSîhz`±ìrèüQX‘:sHÇþÉ´è)[æ‚z2¬áСÐþÕ^ù×o‚– +§†]MGŸ°;›Y-FØcÖÏá^G퇴Tm—°»Š¥§Úžáúââ‹0%ëµâÅá«B¼Ç2œ = æÜÂ1=m§M"ßà–} Zù*E3E•(d~1°§è}õõç>Á5ÄI_ BDìH?ŒyèöX…”fI õ¤æVÎÒžë.ìćã§7Üáï-d),ëR¿|îº?8}æÜ|íÝ;œí# ,Aɵ9BýCø7TšÑ}d8O;VžËǵkNãà°Úbû¯^D‡¥-Oy³]+DÙ[ÕÛ?õ/»øÂiìg¨S`ÛKUeWfPIu±ç´ Kwa0áëLÑó8×!èèѫ‰uåΖzSF›1!Ž1@ulÉð/×Dò®bI“‚Þw§ÆŸ5q/&–Ñ£ÇÃä°¾±ÆÝÿ`P/"Œ[hÔÛ»ìn(y”Ú´·þ@G´¿5 _ PgUçò!åÌN=B`÷ú-âÃe‘å݃Wx WñóÞ%kèÅ•‘ó¹/Ãöø`KŠý½ßNX—H~qE‡Ij¨ÔqB®¥ã ’ÃËó¤–ç?OùÖw)L6­´L͹hÏãßgæ»ReÕÌ|]µ Qàµï²¯x5'0ÊKÛ »WâÚCÒ„ÀeÕ8j¦¼˜Ö”…MÜþÀ=^ÖZc1–¹Úí\aY1;ÂÐy±¯*´ÔoðAT+÷έ°Éݽô*/xw’ÀËÀ&pùÛO1»ZX²Ü5—Ïß$¨©äVdfè©NIâ;âñlZÓ­ÆH9+³p~>?ÕÑwï'-»"ÞИ`—ïÜ.|Nj¡9‡ç~þAoÏ„þYü)põZ¼WË'å_Uç •IKµ¾-a¿‹nQfÀˆ­~¾_×s?Ó7X¾šW×u)¦â.âºb†ã5’ÕáqúëÛý¹ÏËŒÈ5™`MÏk¢ãŸÀò N™Ø\––1;qI\m9¿ÄþP¾IjVçÊóž-N®¶O2ól¼sÄà ¼¢Î¡æGfØC¥æ5¤1ž/&öŸJŸ¶|²Kñ –G5˜¸^`pCœ(HÌ]ùž3'þµ¼7SÁÁÑ¥Ô[¥m$LSÄ•S:qwÛôDWur¦OrQ5?ëH,L ï;±ûè<мˆàÄÏç©£bH±JOËö>±¯á¦·´¤Á,Ê‘}rÌ¿_y•O5»¼ïƒËùÌë’÷ñöä~©§`QF«þ>©¯Îxaê(l¤OH´z*=ø^K{€Û‘Ë'q,iÄžò»„R2êy$BQL=12Kê7Žk$<£<—FŠM³k(‘=¤XwV¯$†Up÷`Jj5~“9ð¹³'†]…\δ©àúm"X4±Å0׎:÷—ÍÕá¼w•Š»¼¼Oƒ‰ùÚ{±ëDu8ÅCËOoê8÷ÝÑí&í}³«»yzE—/ÿŠ÷#¿a{š"®?£2&ÖјÊ;ßHkÈŽ¹ðï}‡‡—(¾Öb0ËʱYF.³/Œ)`AÛljLÓ©W;æ\ VZñ%Î\QØjÙŠ7éR[虯ϟSÖUÝUÄKh;S ,7ûP†]ɤìý‚Mx®}7uÇå láêk l¢ioz{µÀnÊ8ïR«î(ÎQtR‘Æ—7Ï1‹Y•í§{2½;`ÒѲ› dq°b×¹{”è RìÚž ¤8ë ~ºÕиiEÔ&Leš^.7—žå[aXËYKv|À¬¨¹ ÍMäÜ´Å«=÷³M˜ñ‡Êá ÷K£Yi Õ¸$ÒÇüHO‰Ý´R:Òèmå´”Pòp¥¾¸ºLßT,«‰`Q=Žî2dž;íW/z}oåDSÐxtlõžX(¥\s9$ž ƒå`¼À|+î òrÍ‹Ÿýþšr”`ISùÁ˜—"·z†«¯e(âäâ\¥®kaùæwƒy^šŒ †öë‡=‹‰D¼*;Ñä6£>ÝÆŠûèzºn°ì´ô›–»lò–ÇuP/ô¾â‹ðk§àõqÊ!åÃæ"·¤èÑá½§çUÆ»$HRËp`Blâ0ÁÍš”ÅjnM¶Ä‘/MBÍuˆ-3NÓ)(Y˜½ém©í¶ŸJp¥f|·û_Þ¦­»)yÌ¡øæ•œàœ;’:±ósöFÇëJ/Û-ÎNGZ¾(ïÄw6E.vîvÝ;ÿ¾ÿ,3«Ø3¢N${##‰EPÅ—ç7eÍs1lc­šMo/óëáК̬Q$0¥Ðöª[½fÇ–¸_ò,I·•H¢47l|{Ù…6c&Ø×@êg!â~œ¦i}á*\¿Tßð¸?,箘¸P3û-å]”ËD«ÆÏó9q²­å»dšW¨^î‡Q4wPa ±>kF3ÜG[z«‰‘½’⸷WÆÆE ÄñÔCap;¥óÉ ¹z¤XãDš,êlxÀ<”?¨ð¦×Pn½Ò tÓ—ï·Îvs«wÇ‹s8©+‰ÅÆNi¾ÝÃ_ƒpg>3«VþÁÔ`„¡N„@’Ýé‰#Q@Z1>(g4M¹I§WÛ˜’é3´žo”úP1ç æè GŒW) ÈJç®Mš6W.áÓmÓ$øDÚ¨l·©E”tÞP_@=ý‰ùþj\Nb¸îøðçbrS˜ ( žñ0Ê«¿,Ë󭿣&VÜ’eÀ~û.ÊG¼‘”°„Sžs6l)Ž{ŠÆÛšëdcÌ™øV”?ÜÜ}šÑÌÛóÝé´ü]…mQŸ¡vš”£8wAÒ<$çâZ\ȹôZ iÊœ‰(Ôœ'xBŸ„®‰b+|A­]zK²:÷Š Ž‘Ìm©êH[x²¶ܱ«ÔÄ»t™½È µv‘b5JUÞuâMh17 ª:ÇžQVR5Àìõû*È’q7‡ÎFfåˆÒ`$¤ˆz+¨–Í¡bòÿôÙB؉îxy5+s>·É.SÄCÞEbÓ™þ &ÞuÀÇw:ÔüL;$ÔœûÉÞËU«7£ZŒD7¥éì½5vîÑL…CO)a^tÕS\¡æ }}ŸS÷Š’2– Ì/©;u~lµÐêw OPÄÁ ð{a«ýˆäs>0ZÝ®`Ù‘‹tˆøñ.P³¦‚%4Å—¦ò‘Py\Ômé0J2³'Bð<݃@¶K6G+yÜ&ð)ºØ… 5Þµ+Å´˜‹—«\’¸šKÁC*×G+]Bͯ‡£4—GÆw1‚„Iu— ]ÏŒ®þNüÝæÊ)a—.}Œ®ŠÕÂ¥‚4AUœòةأј ûôd©jç»ñî˜'”qÊ Ar‡¥zÀ©Ay,BÎÍ*®°ØïÝ¥Î}J¹®íÀRQ…¶*™Iç2caŠˆ“cÛj㉎·^•DŠeÄ\ÿØTëÿ¹©»(Ï« ËoºVÐ+° mÅŠ›šNC–&±z [Â_äF?žŸØOúé.§*ÎÝ`8Ã/hÑqS6yðöªwu§Â+Íeþσ`Sæ#/ˆók` d€áû³éØ~I©[ÎФú´´4›Â€ONWBÊ2±‹î¼îP+~|rÕûVEœY€ügÄ,yÚ,Ž1¤˜k9¢myŽÞ”:‘©õ,´¿Ÿ S0No’Ó»œ/|‚ êÂÏ|¿¾“áäÍcƒæÓ.‹«YXBd¡);2÷…–_6r Kû’VúýOãµòþ§œ'¯ú d)’¦ä³¥+§üüúoùΟ e©«ŽÆ] ´¨ØW5êè:t#³ß˜Pf¡nè3…?ò@?-Tt0a|vyÎ5Óbª…ciœÝH¿¿ëùmç:ƒÆýÊ*¦N™ÏwcR¹«'ÞðÒ}…®Ë2Íœøý˜G­ðuNn5Þ¹*}¯]BY”PW\Iè¬kÍE¿×é6 r[TÆéÚ”oMÉßS ×ç¿æÛ—ú4P›R얰ʳô^|íMæÒÀ”]›\nÀ¨x¸r¾KðéP–1 ž²sïÓ+'ßq‚—Ç,,…Ϧ˜dªœŽï¨›Ì¬ M"Åe\܃[9âêÿ’ž,®\Vët(ÿ»iŽæÑ¾%âW3±l¡-ÖŸÛq-óÊN×h‡ùÂn5•ÏóPZö G¥·²ä„ô³ë*釟¿fšy¶——©Æ½Ô™óã2ÓS¸µæ®ó×4ÜÐè À[Ð*GºP÷uÔ€€O$0'¾Ûdµ…™G__C&Õ‡%þe€MÏCþI¶ `¸X¬&~À?î¾·„®ªahËÍ;ˆp‰Ëºô©Wœûp—:ðÚ›ùHìã¢åÇ®HÒ¤Ä`–î”ÇˤIM29z þvçžâ…‡¡D؇Lox†òÓUîB¾mè¨5ÅwDÊÜV==½ª¸g¤–ièYÐõW0àžæK·½gæÀ*x[×ÖСIpóH$0|A£ê^ýÒu$ãi¯ò´i²Ý+ü‡ù–*#FÏBAùj(VdJቾÎA´Ý˜ê“xb˜ñ“)êžds¿3÷ÀtVäÒq¸ŒƒjÆPLjú,í åÙnåë_fïô—<‰`Gš¼êg o±ÖŽ’b-)ZRÀ^.ºã®]¢ìI>˜èo)ÚgÄ ±ÓÑ*R=É&‡ªãÅà_šíG‹eÑLö¸f Ï¿ÚO?VÔ~út}cMô]a*ÑgwÑJ]è„ã*êõ ÂùûŠ9XaDÇøcÞ×Å'ÀŽè| •2¡…&Z÷¼âÛM`:p;p p¨Mx‹Z{‘yßã§1Õb‚mwB6uKVÆÚ”×ö&rcg4s÷‹}ˆHp]¥ÓÔ®ª“å„ö87Ê÷àÈ0g8r€ ÃùCŽ—æª™°ƒi©¹ú84œÍž<ÀP}€0„lŠ)½ýÏU[ÚR%¿$nåƒQǽ–tH Ë©Ï#¬zqcøïiBrO>~÷¼^%U"“*®ÌfŒ;ˆgi9qÚ³WFò 7UXÏb1v>PÓÆ‘Kf¾UÑ:WÇ™»PÔjœw÷õ—RA<¬qœŸëbà®EäšÌ¹;J5½Æ÷2}a ÝYjÜi©Láf»Ø´$j%\÷©ž*£Ö¼×y Cy23!ýVÔ,õ¯Èpü7½ÃÏJfæ¹·,óNlœ~9ôEÌJIó\/d梨oîyÌ{1¶øè âîÃëDjªÇJ´ŽÔS ‡ådH²ÖäªiªðÇSàôÂxÝ€ õˆLcuß3ÆDF’õ$w 1Ìß±õdÀ$™¼†¬ê±È”ÔÂÈð©ÓZ•“æ™OªYÙÝ÷¾šö†9K5¬é +õovxsô®ehK ¹ÚŠ'T¤2ûTY s­o°vvßm¼Bj”œ¥ÜqvŸS(íÕàœü…ÜÜF:Ñ`Y{U§.s ,ób®ócšdwvä½ûqíèzåNÒ$^jSSö[çr«¿Dðï½Ð¹§3³OðÏ‘?¼z×øÑàl„åËi ¿ã¥Cr8¥8p$ºŽæ¬D½;KÚð‰*ënœœ$D ßÍXÂ;÷˜Cæ –ÛÑ.FýâzXÿÚ##RÓ2\Þ´Œš7•?õz±“kàDzxÉ «ôÆé«¹Ã­˜i a×ÊÎRšî¯÷sßÇiÿ­4š¬¯\}íxÄjAÓø @ßf)œpÞØýëchÁJá»ã¡ýgŸÃ"’­÷|*æ õÚ—Ü+¬_(æ9 ´Ó^÷ØR(¾FàvÒ€M`|«KCÍèPÒ e‰õD«KL²vÂ`ä"#ŽEúZfjV¬ßªYŒx"iL +J8«05·4΃‹\OÈwµœÎõê³ÝÜu¸™<壒ò˜ cfÛM-8è¿6KrNØòâ É1qç Ù¦h+ýP§Yt@àÒ0™éÚI‰Éî†Vfh¿i€¾˜töd¹ÕªâÀûKëE„™OÕrþnÃ鹟ö‚,_'>Bó=M•ÅëI^a¶}ÕSì}‚ Cd[öšd!KíÞ†®œô›X¥ð)P[Q<à¸ê³«tˆ÷÷*ÃŽ0åMÙâÐÔ‹­6)ö™€OÊ æœ„Ni Ì Æh¬¾†\0¥:ë£êrá¨ÉÜko¤I©÷`K󲟦\¯£æ í×&×ÄÞõ†Þ/E]³("«žâ²öú‘â—\µß}¾Z=•ðð9Œ÷Ópmã±4íV‹©J|%³ÓíV°¡ÚÏk]RMW¾Ê`p•²ŸìÝ¥?‘ö¸i3ÞÖ`½ó”Â;ݲpcQS>ÇŠ4_…ŸácŒO‘ÆZ))¦Ú±´î‡µ_T}=CÛ.ÓyªÔYÃKŽÜ}1:»W—MͪqüÖ“‹Ç¬ÆÓ{z‰™ŽzP˜ÜƻڧΥwËÓ– }¥Rj¥tŽfte: Ã^£•!6¡Å:‘®ùSJ¯»Ì9Ê)®{ÓӔؘЯΣXËÜõD/dÏNŠ„uUªú’M§ ;ù% äWFûòîÞöÞß$|ZW­…Ǿ _,/Ûø¤þWqÎùµzè»Þzd{öEº¾0êž2 Ï*V3f픸—lª‚QÒÁ–©p€$`J{åüÌåœÝþW «î]_-Ëêäz?ÎèHó¡…P!¶³Šø!q÷¼¬«„[ ý‰%”¥@ˆqÕ‚;DPŽ5‰>á!Åê[Õ,¢Bû5¹­B6þÛY-ÎêXÇE‰ìazVÌr¾,ÛŒýÕ}Û×ol!À‚“|_*s²ަn’ßLºVRÂràë4Wý˜.Ù³‹|Ù‚ ¹k8Þ²`2ü8í*Q÷ã¼SdxX|g{TE¿é›*¢ë-«÷Â|彂šPŒÈ•˱›K¹ê;0å“&?ž¢TÙ¨Èh\[/$Õ†a† fÐ6°ð§»Ç-¡¤Ú¦^‘5ðàÞòÙ÷äÚõjd˜xáëϽ àÈ¡3úmñ”}ºqo¢oOÝø°ôF ÙX'ò2ª½Ö÷˜üŠÐ©‰©GŒI6?sV}aPÙØ5fªÖ`â%êÜd5Ç8«ñ¶Ù³g1‹}×~t×2¤Åîmsü³äÌä¦R{ùAºéiÔBaw¾ÐD}1-ó£Ç^GU$~¾ãÌ‚„RÚ—¯6ûô”dcmO^4zL]»ÖtÛnì*09kA×.D])ë%‘9v·QbÌ¿N3ýˆ4 ¶ ÑK&ó@PClOOãeÉ«'¼ Î°úYS¿Î3NŽÐÕÌãô5Ç®³·©§¬.Å>)åb‚%,º+žªádÛÓç])¹ÿÅ)§ªÇYóUóê¢Î¹=£Å'ô+£H.+몰ˆ±ÝyvƒóÜÌ–q /ž ztjÿKn™½àÔd×ójàô0ÕMBY+¾K§‡OÌ]-Q‡²tú—æÝŒ—ÛÌ~ô–V K8¬ýî8&ÿöêÝ‘;ÇÞÔÕÝu¸×tg±¡ý@5÷W^{¥6÷±ª˜’׈ì%4Ÿßâ.¦ý+\‡+œ8ê‚Ìž{´mh -™õµ£,Â{^a N'ÅöÄNr2¥VÂx¿L«¹B5Ϙ‡Ÿ–¯Üð3@ð5Áôl ’=\Ó,„¥0´…>Áް°Ú>êŒü¹Çvm:·Ϩ·©àÈ’¢ZZïu½Zå=$RšÑ®W‡9TØP ¯\@TØ (Çå¹b&À ½óum|uf%´Œ`ydðà^ŒH½Ê¹šÓ¸gÓT¦ûq_²i›:4õß ãò2œ|aš«cÂelP‹ß’žs¶@¬ô<ž¡°šJ¦:ºOò¶¸u£½ïYý'7:Œ-¸ }Œ¬·O¸gNúØþ ©Œo«‹\Pæ×ñZû¨ VªñÎløæ„q¸Ÿ2î*K†Ug Zy›¯r˜¶,7ì&•Ñ7_j‹Mó2^@¥œÃïÇ߇_$‚Þç8ßrzøòSO@4~Åm‘íݧ¢éô×_z„qîd9¢HlœÁU#Låñ¬%½Än¯ O™ë/CÏ%¯Óv¤>”Å£à.Mjj€9šJ¶'Œÿ}WÖ‘ ÏâgŽ´¢EÊ¥ìЖœ¶½Ø NÝLø L‡î-Ñáƒ9Q¢ÄÑŸz`¯¼Õ~kM‰{m|Ç‚ûI²‚ç{él Þuï¡zD[ø…†N‹nžÏ9v¿[òº– ”¯"¹|ü©ÜHèM®Ïa“*14«œŽËL® Á¬ìeN†xã¾Ú®™†¦°ˆ§.µ3o¯¡¬Cr=>Ÿ«vÕ<ø5wÚ¢³‰­ÇfšÖý†–šÜùPãH[ %›l.û2ôN4ˆ€„/œ¥TŽÊÓH”PH‹¦ºPñ©·ˆ&.u·]À-™o•Ù‘LÏœö‡ÇÌÛA> w&¸e3%Iè~#;Œ¥¾ú¸ÏЀ]þ+78ÿ¸ú¢A˜VŒ=CTÕ›ª[A”oÞÖey—ssá‹ËÅJ+†M`Ž¥%„y„™×Mh¾J~g_MÇ%;=ј‰ ¾Ü2¾ ôJ6ó¹pÂå¥#NWê x E=;ÞY­•õRšªÔ9&ÝŸÑ.ÔYf?®®ÖûB(^ø2ÐæK|PSfîKu_r <â}öA»çTé+^/¡€&GŠ14°ïhgá’ohùW0t#ð2ýЋJî(¾ð‡ óà‚†Ü…üCkµ ¿9 ÎÓ4{TV"XLеëÁ§*âr2H07h•Zlà¼øâEž#V ÇÅëN€)˜=†÷»Nƒ«¥ÓÃ>ìøB€"$$î¨èR¿H¿ÊZÖÑŠ‚ÑX ŒQ+eƒ%4j× FÆÝ]hI]‘?­×EtG>dAh(ްµˆ:Ã{CŽ1Ï|vÃ]ÆXJDôÜJÜ\CÇ긃½qfþùìÆÈ•îÉÔÚØ¬Ÿp ¡9çûÛ‹Ùähwíƒym-1EÚî´½ù*ÊÔV5ï º#È ©Cã°Vƒ¯_æZ-6Õ²CüúV≉n'ŸÏ}4a£ Ô¡gWTt©˜ð‘)NÀÁ¹AûÁòóé/K™ý˜’Šnå¹£/ŸDx¹<29€j’,¡ÂÍ‹'9ÀÏOa%™[»OÒ!ç#Žh½fÞK ØÓ"¥)?¼]l¼•Ó¶ë¾Ö¬YëDi™<ær&3ß5^0ý( æ,*KÜGºBae&4'ðnÒ— Í“@ÏÊ‹ÎkÊ÷À ‚“K—½%GaÀ¹^êPyá1潚€=áüÍ]À¯b%`å&Ⱦûã*‰°Ìó´*¹Ýg‘zûI±ÂÈ¡ÜV±5Ývù>²ÒÒÒvªÄtÈÂÂîêº9Ø0·.Ƽ,;ŒÄ,ôS¨„O›ªú`NZwÅì§¾DüiýÞ>lBì8Ô4­«¾s‘êqó寖äXÌÔ-õü%B_É2ËGŸƒJfvCÍehPuÝùŽ»“¦L'Ì®¤.x4 ` ÐeRp&-}ÄŽ3@o´¹Í3CÍmãû 1ƒÏ›P¸klÚVm²3S¾^MýÀcS~·´©í¢ˆÏù–9ü) ÎÆüÓšy5¤=Ÿ¾Ú®^{ —`•}ï5ÍŒäkÏô9AÙéùJçÊ#ǹJL7PÒêçÏ€ 8ÓýU%pÕ w‚û¨’\Î85†À_ÈlŠ#=A®C S&|‡D\Á²×~gÁñ X;^<„8iÕ4ÿõ—þŠ”<\ê˜â°Ú0PA‘A9MOåæ#R{®­ÔŒ­,^Ê!iŽ:ä"÷k=8Ëö€‰šê*|_¨yÞê°øSJ^»bV`÷RÎ}Û;Œ[ÎZÞ=ßAdùÎg^D2j‰2&cÂ÷7àZ©¥kõ«B›6îhÁ¨Í· z–¸¬6jæùšðøºéõ0èZõa4Iu®>Nö¥ WešH K.3ä r,¾Æ…Qè¯Û›§s‰y‡ f­ò­¼HÉeÇ%ƪªtÑ;å¼SkûÞ/.^´¾F—xXêx(ÿuÿOã3(à}nûçƒýŸ€ˆÃõÙ w½Ã¨ÂNY ‚ØÍHœCå>ž ˜<ÁKrfžÃ‘<(êAÀhQFS¨s“*\Cæaã§;5qD'qŠzÒ‡&Çö ¬ÔǪ⮾~i“,É#à¿vJËsèzÀ©6ö&±LjzÊÅwì!bÙmR½?xò!"A"zšËË +Ne| äÛY#5Öê:òKI À9ò\@@ÊÂ;ˆì“S}‘ª‚ÓðÁMI¡B“ï¿d&¥ú¢÷4'òžõ4[³Tµ–Aèd"çA¢fðÒµ€s.R¨WŒ0Ñ8ÏϨçWç’Nà4ØO^çTÅ]< þk¶›9>ðüŽjÏͽ€n†ž!¨þ¤—C=e-FiìPo²¿š[`9víÈd:-ÆlD§´)ŒÃeOšÔ^ Æôh0ºj o¶ÇÓÁ$* S ÅtI«£¥Œï…ö+£ÆØUpé´…ý‚V¤2Y÷Þzdßã7—©ænœï%#8£€¶‡ÃŽÝê¦ÊY&õ0Su}‡îtz¤)ÂÞô'D5¯ˆéöSÄ¥ÖQ“v fÑæòS'M*`;¨^JhY©8{êíÌI\z Äa\ÔEÆ \ŽÓ"*ôí¹ÌŒÔ2i§ ¶A`èª7Xe Ü#¨ ªæ6¯lpV#$d…º¶ d1W™ÁcîÃ…GŸoY)ýú ¸¦J‹e%Jx(:u÷Z‰O©+Гsä Õ\º¬—Õ\ìW<ãmqD ´?]^‰Ž÷æ[õÊÜd„WE¶BàCÊ\+òfÓÂò\«íâ§ÀkJµ{±h c2«t–¬U¹Iˆ„j‹æµ•á©á¬Ä´ f¢füíHRíl­þl¶uxÿ´iìpH^u‚*0aדŒMeEÔž,'»H¿|Ò_?2.üå˜ó‹oª¼ƒ6m!ùp´UWK:¬Íé}cIwvÑÞùk®~ÞE¹‰hqºj»q…Dz_ÌÆÉðã70{ð™Ü$Š/ /Âcû#ö…ög³s6 kÁŒ[ š` ¾ÖQÀ'E³!Õ¸`²ä©æ®±ÚHQÀk¥ Ó¤°ÖÌ·Ø6ÿЋ€Æ×BaýšfÍ©9T˜Ï•ÂÉa@ä8±ÿË[\³¨ PÍ“vI€~UDÌ¢=ã[\éFWi0O¬¯<6i Zùt4̺>G¬2ÜÍÇËs§ ³v•#a•*Žh‰BeÞSç eA0ă3ÕK{gS¯>µ~Z«.WñAusëqÊÞÅ‹’´˜‡tÅcõ2ß 2?‹lÆ R£3ù£áÕ}ÓBR»{—®"ÔC}#±•rªÐ7²Ã'¿œ¼5kF©’ÚÓ+¥ pÑ¿®V•ºˆT‰®ÂL¬ð¶ÄÓ`L%•™J¹¢ûõÓ¶T¯â§¨` +úS£Qžs]Q‡†D‚%ž=bÂ(sŸ0 ¸F } ±›²†&ë Û^ öŠ;ï—€‰£H‡å8Þ2¸~¼Çm"A*“WªÍv©÷ Ñü (bé\tj¯óÛ+Yo¯(º¦"]SxÀk¾œji ÐIT èfÙÔ^g°=Æ…5.&Z“âA*lžƒmÏ}q“ï/¿´`mxv±l)‚ÇI ›VË™’æðdŽöƒa{£¯×{Ögö?謀ÁÙÄ;2Ipëlvh+—öBs_ÜöÛ•yàþL™ÞÝÁ]^-³á·Ïúû¦J+Hîºêvsýø€‹Íô–ØÕ¤ÍXbÉ%EÞ"žíüjgJõ¿BDÜÛóaW˜E-1TžÕÜ)‹ Z¼§}VC¯-æ®N4Ÿ¥ÂŒ‰Cj:uÅsͱ‹>¬Ëú2îƒÃ“±ü&‘\ZÆO‰³=î`Øñ:"FŒ ¯ïiÙB3w¶=-VspÌÃòKá¤2œ\®º¯!ñÎ1Ѱ.;ƒU£YMÍç å÷ÀìÓK®òe+ùÇðwiõ%D$7Ï,ž –{îRÙÙ'ègÄÀþdß‚ðËeœ…!šT†w.ç™G¼¹œ;[عÏW*å]Â)ß2;ˆÅ5dËmÔ½â±Ä\¦‚ë‡÷¤e÷M°)v< •¾×_®—qÚ0³Z®>·êÚ£háR¶òì)¶ìrRá’@žjGæ{“Á·É¿ìÇùm^šÄ.¥ìbýò ˆµ‰—æö<$ÅØ|;0ãr.îîå8!_¥UU‰»Kƒ‰«{Ó¼gñk鿽ÑÌFwbòl€äõgÎ. ¦Of!“g(;õKˆ{…U©–?H“ôS¥úú®”¤—«M§ÉXKB{ˆÀï ;Üš|=Hv÷R;'0w÷†:'`I¥La)!ë¥ì!Åf0ß¡´üäF_HTðÖ’çV˜ó Eây/r/XïªÚɪ,E/¦GøòÜ]»ÖcH±±Ù÷rîÚ5ÀqFmFîcZ5…‰…×x,‹`½ê¦ž2T½gA®1øôœÑšä9@¼õåŠêŠ8–ÚTÐ9oá†e:\ÙX–wÖÞxÞ÷ö±*£Ž%krÀ3€~fãläÒ=S¶õŒÇð–‡Ü„In¦¼š8gGhjÎ`ÃxÒ·=°¯è->ØZ9Ý=N;£yÿfŸê€k,ÂȰ)œ¯ƒ}ïôH—É…0eÚÂç¯kC­œ|öÌõ0ð™ŽC×­&Åûm„²+ôɺŽÿÜ$XµIk¬xT´( —ôJêWÛµH=ÖV]öÏ[+ôžÞWí¯;ísØÔó’/^{2T(¦ÞV [3^ «_O³¼—ÈŒ¬-ïÛ`œŠLÁ{sPŽÔ“U7ÉÍgbë!NÝÂxAzvBÇký*fåA2 ÷óü=x™Ðœý×kÕ&å<=L8 O/ukhŸ]œo;âL%ú$8çˆ(Ù†ö·U=ýÈPdÈönòcdmß#t R7Ã艧®¬Ï'«`}{F\æÇ ýµ)bzyY%öµ»OXÌhQ~%$¾Îqf.ÿKdâݨ‡‡òÑþÊ5b‰§ëŒÅ.Ç'âKίÉÿ_½ˆxEç±PÓÓØ#ýåæmŠïôcoËn»q«§4WÛ/ û(d|• ˜0Ú}ÊFŽA‘ŸÊCÛ¹«M,;¦f®é%Ymä˜ìÞ3øðÈ—êýŽhQÔ+ÝYüh†AcD}dã>Û’>)°ðI, N4²öq³>RtnÖ£ùî›ÓõμUxUk/¥÷:vül{,ì&â)z#땽3ËŸ—¾|)V_ýâÁ¡í#ËÅ>ÿìzS ­•T3ÌN½&ýIeáãäU×Wwû­îÖ8*Í^Ö½¿5:ßl±Ï?ÄCÂ=Õ’±o©zPp.ñƒƒëµÌÃSšÁ7&[˜í›jÒ?W>át;ñµæ¢,B"qÖ›>ÿFJŠ+zD-©FÃÙ'½’hxŸF¡ÏÊ(—ÛÜW¦µ8§œÂoHÛIž_ cÔàæe¼We R~÷û‰Q³ÜW÷T ñÄåtbÛhHâÁK>Û¦âéíýv£­óÿOÿ³ÿ±-´ÿŸ(þg'þc[h+þ?QüÏNüǶÐVüžøŸøí¡­øÿDñ?;ñÛB[ñÿ‰âvâ?¶…¶âÿÅÿìÜÿßÚŠÿOÿ³sÿ[h þ"?QüÏþÛB[ñÿ‰âvö¶…¶âÿíÿíìÿl mÅÿ'ÚÿÛÙÿÙÚŠÿϰÿ'±³þßFÚŠÿϰÿ'±³þßFÚŠÿϰÿ'±³þßFÚŠÿϰÿ'±³þßFú=þ¿ÆÿÙ¸º Q®HKK4Üm)é°·ùoÕ±ð_Çÿ ‰Êâ%@ÿODXHx'þ[H–ý¤¶’‰Ž2䔦DÇPQCM ÂÁ/(h,ª$(xÒàäf‚˜€0Äsñ@ ®.0¤  ²‡<¹ìºTÈË:Àa¶ò²Îp4 â€F»ñÃÝ=9%P†à.h~78ÄfóLŽc]¢6¤NÆÆ†ò€£å®ü’’âRüÂë<Ñ4.¯÷‚è#œ=‘0´+J².™ë‚ù].×™8@TH8Do#€ÙÅ.+¸Y–\‰pq‚8 àvr‚à­«·=ÜEÀÆÃƒ‚‚#å8<Ð>H¸‡Žæ€ Á~kØzàfŸ¬]m}À3v~~ˆ*ÜŽ‚¡á¶kÈÉMva11??˜ÇØ arî[¸7‡¼,ìwW¶4ɆpÙP+yMðÛÅÚÃMFfv&ñ‡ü¸´l ÊÆÁç ¥õ¬›Ô`š€Ãz»þÏ«ú]µßQü«ª¿¥ÿUõ¥ö­r[¸.ˆ= ææ°óŸ‹‹4XNÖ´Œp”¼,ÂÙâ²ù¥ ÄB?˜– Èç€X»¢lá(9!8]9ÃÜ@Hÿ¼JK0‘C‚Æ4R‚ß*'—/C\`Π)üA90 ‡mKA[Q©?@¸9€غy]Hd}› Â!&$Ì', å’äù¥9Æ)èŸ"õ£D„%ùD„ÄøDÅEøDD…~X(‚’¿çáµ´ö´•øoª—à’â“áݘVc þüVäÀG }þ® Q>qI>¨”ORü‡ì¡/ñû•=ÒÕþoxK@…7/)!ô·ßxE¼³ý¶R"ÂëM–’ÚÚdpÎsû¦)oºááàêåñr@Ø8lIˆ-bÒj h¤¿Ÿ}WmôzÙõœ§;6?Ö-O´üZ/øoêÐ÷¢%è"&èßšüýù©¼Ÿ¨(òb+íÂxÄë­ú»j6Á•ùKpeÿDîÅ~ÅVƒ«ê Aƒ?à”¹y²nd!®v¿â¾13É¢aÖàŒúÔlàH¤ÌÖœ=9÷pƒÙ|;_÷-A9Aƒ~àæÔ/—À:Ö³º€ÝãØ°ç²"›~Èú¬ÿY‘͉Å†;kÀíÀArqõe„=È …°w/b¾¢]AÜ7§ýM§b“éXém-fíŠF»:ÿÖü¯¸¿éáºz,6”ÿ‹†¯gØlöæ¨mLx›5Ã1ø‹ã!ü^BþÅü¹²×oðÜŒu µ>h›êøkÉ" ¤'7.€ýI°ñ(„Ûº º5ùOì®mê—-l€3(ÚhyY[ð×Zþ„'Ú\(É Z¯{¨ë—må5ÀåÄŽö…#!ÜÈ gh³EàÒ‰v•F‚é^ÉÇ7¸›úöÑ.à.Œäÿ.dž+d–€u®¿-òOgwkë„„ÿ¦ØIÐýÞZFDHXè7e6&7”+88Cëó†…°ö\_¥!\6Lˆƒ«Ûú„CChˆ‰„XÃ×Í»'’æ„«œÒ64€œÐ2ŸÐÓ;¡e`"æ‡L…cà›|ÎnHÈÖ †×ÁhŸu{¤©¬§t ÌBQMCÍÀd}¶RQ3ÐRÖׇ¨hëAN@tNè¨)jœÐ×Öz:ÚúʃïF JÎ/4‰g°OÐuD"§¨²±Lýž$чÃ7š£äêæ³®W¿•RÛVo$kƒîç)µ_ý Ù»üÆm½88g9{€zêª/¨$ÂëVÆÖE}£f9Ž #$ Ù0e2`²‡3 ‰”ÿu5 2ÖO¸¡ "Pˆ°˜´¨„´°$d©·,äÁµó¦ùuŠXß1ôòòø¾H¥KpcmöM!Èÿ0·˸1moL@ß®p|·¼Î[[$ü·sú†Ú[°Ë nö¼´ÙÙu£ñm­¿±5!ÿÿÆCÉ[÷ÿ~†ø¿oû¿;ñÛB[ñÿâÿ¾á¿ÿ±-´ÑŸ!þOb'þgi+þ?CüŸÄNüÏ6ÒVü†ø?‰ç¿¶‘¶âÿ3ÄÿíÄm'mÅÿ'ŠÿÛ‰ÿÚÚŠÿOÿ·ÿµ-´ÿŸ(þo'þk[è÷øÿasZoývû¿ùµIëÿuü—THLø—ø/¨0x]X*&´ÿµôÿŸø¯ß %dó&ÓNä×Nä×ÿ$òëoÅ̳!;ëÒ‡†ÙK¯ùw9Ö%脵³Aÿæ# äi Cà ò'@ ù_¸²ÿ%Þé[¨“…@ÃÀîBl°»Xßî÷ü¶‡? Ñ´µ“úÓYg=.cƒ¿¥åFÈ_Gh¬¿uÖÆZð¯Ëÿ¨ñÛ&opý‹È‰åŸFV ÚŠYÿ±C'\\@AG¬þ(²B’*"Æ'",Ä',$$ùÃ1ðGô/o&ÿ0|CTŒ*!Â'V#ýqXTÐfûÇZN"œ?ŒíZ¯b=¶KJ ì‰ðÊìm%ÄþX‡Šçë€ Kò‰‰Cù$E¤ø„A—áo㮄ÿX‡š ßåóCPÄEùÄ¡’`GÄÖqþ8´”h!»?Ö¤¿ñ:ÝU³Î™OL¬G {$öãz¬7ž×ûC=Æ0´ƒ­«ýk‘⃂C',&)Â'µeè6cx~ÑW;Pœ¾Ýá7M è.ÙÃÑ›¡,[Mðº>Y"áàÜø}>Ù@mƒÿÉ`oèª XÃßÛ.ñ?QôÍ¿Ž­Íý¡éø[Ž çºûmó'=ÿÖ&ÿœB|b hŠŠƒŠ "ùc³*4ôOa=¼Dq#Øñ‡Á‚|ë•|¢£m’袼ì¨Cÿ8j*ªŸøOTDò š¿LZïÍŸ¯Œø7Ý‹o<מõ¨ ùž²=qj:žÖH„ dÓÛ¨|÷©þ³qk¿úàüéà º.›ûZ±ÕÝÙ€?ø;ÒÒp€6ƶ>¡ìAæGÿLþ!<(¸d#â,´¾ 0ØpÝm8Päÿáhº¿Y s®wùw .æÑ¿áù·.ÿgI¬ÿrþcQ{ À Qž6ë. ä÷uÿÁþOŽð¿'8ß®ýj“ ›ÁØß]]‘„‡ ÊóÛ•_m$xÝVµõ$~Â?øý‡†ñ?%Ä*ëÑmîžàPÛ­ÇêÙl¿L‹ü#™ø ¡ùE¨¿IBƒÝÚnA{óû&nJÚ ±“ðíFHô!ô] ¾##ú{dþ‹:Ç sv“ÙnÈE×w?~ÓŠÿÔ(8Úå²Jú¾O²Ô¿þ šoæú×;”«óFÚæ¦ÈöȆØ?” ЧS³ý.b¿—ï¶å£fkùŸÀ)¶çf3·ÎõAó¾M°‰ÿ#Ø6·£7!ÿSÈ~™âþ'½Y¯}á²EmLæÛ„ô¡¥¶î;|‡ ú§pm:ÿ¬À¾l4pûÀÚð¥À> «ÊíLâŸAöÍ­ûŽšÄ?˜3ÿÅ ù?OÜ€á"à}ïö6Ê··I $ÿ¤@òW)ØtÌ!›Â°yü¡HHþA$¾õûÿ>ÉúG’ñëjñ»lHý ñ/î.ÊÿyâÿNÀ1ú]3¶ÃFlV Y¯ó¿%  A[±?Ù–?éú›ûÞLø¶æÙî­!p úkýÿ9Hô6 qsE¬ï+¯?'·®™®^. ŠlŒÄož‚ÝlÈŸ=ËúÒ·mˆ5è!mûÈ sÈ+¡à04ü—]ƒMçÚ ½±$úæ±}_úýfwé[‚-ê?†ÍF; 0ˆÞI=Èæ·-¿¯R¶€ ü_á¯÷?ÿÙf‘–§ó/›ž"˜Lå„¶ìA<]<À&l<‹ÞvèÁŽ­Ý:ëÉ ý§Ðü†Ÿ‹§3ß/aoœØž±-ƒ°oßÚSøŸí'ôtvûEÑ?Ý»ÖpµßÔ[0ï_Á‹qEØn;¬`W×Ûÿ·›ÍvÖ¡ñý¾´üï®þ:)oíòl“äºé­[bpø6ckþ?öŽ4¬©c‹¨OpED¬Š’‚FÀ $¹„EQ(¢DPÄ4d!Áı*¨(.,—Mƒ‚VÅ…E)Š-j]S‰¨[” ¨dq©onHÕÚ”×ù“̽wæÌÌYfæÌ™sþ=²Ò³q à ¥zG7ñq¤‘ÑW“¡vTªx s'©{Ž —B¦0hmf2¨s!ÚÞfP—FA,ìì¸Ò üJ:½äôìô’M RTsZ.ÿ~u°r‰ ™Öî~M!sXÔ6kUE50b"ñ$ÓO!Îht&˜Ð”tNÀéÙé$2RÈr‚Ä”©ƒ9XEÊPP+—X .¥-üšÈ­œ‘†ôOIêÙê‰Mâ¶ê}9¸vp#Óú*787\©Æ÷k¡E¬Ïý‡Ó³[æÓªàà»-Uÿº:@ÙøÆ#ø–ëó×D»¤ZR- @º"^o(`ßãƒÕ%­Š9=;Hc“˜Á$z‹šŸµÃb%¿²Q!¨’´í«ÊL±ŸÎ"û¢ŒQL›R°?e ‚94 “ΤHl É>ˆ"„‹C‚ɾr^ÐÂÊÁeÏN×ÀxQIÁòš_ŽY·™ù¯«z•M!fb ‘õø+O¬’J[½:!‘ õöú_ö|Öé]ÉU†dÍÞÆÚe@ aƒV‘[+ëxÓܳÅU‹©eçÜjõÕc’˜Å‘Øe¶ ½;’mcœ‰kÇ8lv±F¡?r¨s X¥'yŒ¼Ôݹ¡§¼w*iA¹ÊeY9-|¬À¹ÈŽó3»éÖACÉU†JÇ•+Ôj G¢=kO{(éFemÈ*´AYÓØ6­›Á´i½„â{4j ÒϦóžuñZÖÎ6öeÝDô£à÷‹û×UW »…J…¹øžÊKªÔð–9:î°…-’GžÌÚ ¥V¦ha³Ï­¡™Bž×dÀ¤.ä)Zü^,¡:Óö¶úžeÓ¸Œ*²±¤Y,Éå>鳿ªŠùŒeºäxl3­Ž.ä @\ZP°¢ÓÃÁ-ò¤ yË(â>EÙ˜Hæʼn^6é(>mËoŠ3¢þ{ÓOË6]bºV™rsЗÀ•2@' k¦¬•º:ò")9‰i3¦ .šœ#I1Y¸Ò'4d“øì„ºyÑKlÐÁ)`:ƒÑ;^b{½v^v«îvîI‹Ûù“YRe­Ø´ÃOº„øÅ¢¥—´{¦/“Kfu HúMw áÛÁHK-`¡x« P’º„e Ö©æÂZ@cw ¼ï@è¸7n\ â:"ù¤K8Ýõ»Û™_ÚNatu‹Pl*ÑöM—µvuoP|âÞöM—µv릠ô„«½÷Ý!..‚Ú ŠµK^vYµrGUÏ`³üÛò_tgÜMqAqŸ3XÔVû¸N>’ÀBÜàvŽ‘.o:Š&Û{+ñ™ÜÉ’¤ÃJÏÎ$&-ÛÓ6ö,ÿªíÆßdùñùFò%׸¯¼}ApU,ײ0ÿ" ˜Ý[nKý,©»cÍÒ‘gòv×_rõü-ô$·¶û"öï™S¶¾o­WZbÿ}’ }Ńl0þFÆm¿9-CýYÙ’°ÄLÀå ‚ÿç-w§ÆRw!RŵL_(>~4 ÙƒƒÆ€=W›¢È–Ùœ#JÐ |ƒ¸#/Èt =V‘ƒƒdkI&‘|™ˆÇ~}½v›ÝB[mö».­2QJÊ_c§B¡€]t7"#H«Œ*¯Ì•½@'Q ¯"£|[|"µ\Ô¢°X«dA @+BXbL-¾ÈMu‚6õ³XT-1mªO%“…¸©_7 ‚¥dÚ¡/õæ¤èÿ¯Åÿí‹ÿ ”¤ˆÿ^ÿ£Ïÿ¿R’"þ{Qü>ÿÿJI ø‡zQü>ü+%)â¿÷Äÿè‹ÿ œ¤ˆÿ^ÿ£/þƒR’"þ{Qü¾øJIŠøïEñ?úâ?(%)àß”Ü ðO@ðonÚ‡¥$EþïEñ_úâ(%)ò¿O/À¿”ÿû𯔤Èÿ½(þOŸþW)I‘ÿ)½ÿRþïÿR’"ÿ÷¢óŸ>ý¿R’"ÿSÿIüôC¦f8¬ÿ„>ý¯RR[ü·M &à¯Ø^Wl=D¿¡°¦±©=Å ‚àŽã¿Éá ø‡3%`ûâ¿)#Q| :dnéC¡R!È‚laæcI£b)T…B6#SÈÿtûúÒß›¾€ÿÉœÂèŠÿÍÁf_AþãpX3Bÿ+#ù ž$nx‚#qxP“J0Ã}F Ã<±%J›oŽ"˜â0x$+*ÂV0„Ëdµ”$˜™cp”¹¥)ÅËJâÄÆm­¥EðFx ”¹¹9"˜É1S0”ÞI”…Ãàð(GÀÉÊYšPéfÒ¹´,"`ð(È‹°-¤™P±òlS -5ƒLÁ°`1f‚¬”2ý¼‰"¾nÓ g!. áLåKcM¨ØvJsewhä*@®!`1¬y·L÷zÎÿßÒXçü7ś˯ÿLÅüOÀ÷ñ¿2R¤Ë|ÇaƒÇ!´2Ìi޽«ŠJXEEµd@ð¤˜ðf<ø™äâìîðç§OcÇr.^¼˜ššjkk»aÆÊÊJ‰¤«« ¾úôéÓq·¸0ð¯×u¾›ÊLÑ}ºŠ JÅÉÞÎ}uRMò¼Ue¹¯n??7»¡š±òå¡W’RrjçZ;WþøÇי/ÞÛÿkqUîÖù!•+é5[}˜ßYÆê‡åE 2 ×Ò]]}¡ß&´á`•æ'*vœ'•Kî¼§$É_Ï0P4ûýd89j{úÏ #jâ+p°Ž¯M6‰Wzô>ƒ¾wY%¡|Ú‰¸bWŸÃ0Ú3Ø7§F÷C奕»ì…3¹«%æZž¬ÙËg`M˜ÒÎûïãÚ+åg=Æ«¶{5¬n úµä^Ü¿‹öYn™ÚÓo{úðŸÝxëgIª|*¬º.¨æWíJ=_Ä<¤*|xšU?Ð;xA~JV77Áû”a†¥o¤h÷¦;ÇÃXļa ^6Ï=ãÞ dY~šòß>xN?¦63Î{=™HKŒ*`Ð5eÁÍkB.¦5‹êY+“@ó¾áO‹/#Ô¼ÙU 9$®L´øóãg¬­ôóž…T/DÁå¦^ŒË‹HDhúè-ô·´á]Û_½-M'3~v¾íb­µ™.h¤ÙÔ¿Ïì t^ÕA h-/¨wQ×Q±ŒwÛRD*·ì…³ë¡Aß§Ÿ®¨—QJb¢× ¨Šêe;Mä¥'8r» íeú§#…ÎÑÚ‹.ƒ,É î€¬G6È>ŽÚGÇ©Á“\áë½í{@–µðŽszä €qû9xKOîH$›‰dA6L Y|R×ÒçCpÉ"*d¬Ã®h¤«ªÐ7‚ Ñ„Wïq ¿¼5sx<æSQ/ 8ÅhMeÈÍ*Ò åíi\—¾PáW4wãÈ+ÕW…‡¹é¬J¿ø~­q°^´éØk¦ö…cN»çB#œžBÂIÛ 3–^“GõA!&´dÏFg|úÇ"fIÓdáåE&'ègžbj'Ouz­wÇRÀÝ‘{èAÙ÷y‡@Ök3BSjAÈÛ‹Çöh@ay| 4·íH?ÊÌ|ç(üÌÂa†ÊBD Fœ®ÎóZ˜²HÍÑÄ'@°Û?®ºªI˜m„ñâU}Ë‚aV¿ƒàñ‡½‰¾;EÙžKLr4r,Ã]ì!â8;£»œ¢ˆ¦&«yаÑÃø¼( |z,c\ÔúÅ4㈺—¹–´DáË›{ ×® [ó†Óxô‡]¿a‡Xûý±ÔýÓÑ ü²â°™7ùÕ5goÇy6½Ð9yN߃çŸ[ndý)Z”¤ ×SÖ¶±ºjTýÂavVÖL¶ANè«ðyZPêÇØzÝ@ ƒ´öÑšçx–‹ àGL“Cl41Ø)Ë,”ë„·uƒNÖÞ ­³èh«óKü²ôçóš9®‚§ì&<âôÐÖÑ;èî»YϿՄ·š} OlŸ5½‚ÉZ»Éq <‘w O×ÿ\Fp¸|\>Š8⇥ïgNÔk $ã\ŠLߪZT½¡$ºmcº÷Æ€÷PªU鍊±¶Ÿ¿à½Ù@6¬¹œ« >”ÐB€÷£µITÕ4@¤ ÈÆÎDèÈo~óS†!2C±fóœ¾5‚>8äèNè.i– Q'˜4r$ß½)ü¨qâ5—¸Ht¤Ú»M ý—NO5‚"PãwHEËQÛ'abŠœ‹Ñ1€î#Ñ shÇy“Tá3öÙl4òï:ìÊsú±&ì7¶›Õû!©t}øžpQ -gé°ñÇ4æB‘w ÷ލ …ÕÕùwûÑ ú¥F¢ÃC½ý®Zš?:mVM|tkï&‘[AeõÊÓ9Ƀô6Sí~=±•42~·Sçñ°dZÌ­U[ «0ýÔÊX(ϲD§ÝªÑñé ÷g/š<4ï¡ã¬ß'Œ|sî:Ñ.<›sKUå¹3ôíA­#)÷žø½1~Ã|wxˆÇÙZ#듚IOÒÔ£lôÓÿ¥‰S´cškr8%6ðdî ¿úõÖVãà™;=5Æ”¥ÚyG4ÎøýÙ›y{H°4—æT>åѽŒázLĵ—î;·Ð_¬·Â5/ËÖ‚ú-Ÿº)L훼°ÌEazË_²ÄÑ®5T¸ú\ÊÖ@Í"-Ó0ÆÄMqÆ [^†ä'61C÷q>,ÏàÝ8,î}?·¢¤ÕßUÿøuÞg½'xÕÆ­ 9ÚÌdÊ:’œQgw•üpyÉ‘Ê#Åêù¢9öª ñgã̌ו­Ïxr¬¡±­ö7®ša SÎÄŽPk¸%,.ÞSÄ­²ùæt\ÈêûBkÏ«S-ÃO~¨jø=3ð|ô¯NÂ3«Ó&LxõA#7\h¼ß‚ÓïiÝÌ ÑøåðÆü˜Âz…—ªDI¼C–sãÿìïÍM)¤®„ˆóÌ­âž±Û+iÚõ;EPÀÝèØzþ4·èŠ…~šåm×ïP3+ÆB™sGU5¯I×ùmàXbZáNutÅ ìÞºã‚÷£?ñh6f?=Ÿ<í€û3=Û&ãõàó$Jx)9~Þ§æÅ…Ô÷ä´9ŒèCï.¥lbru Q¢9ž3ËÍÐDfœþaKÍørÒ£¢l“IÐ3ã¹#ø ›JWšxùoÎ0¼ítZEø°úõ™gÓ×½†’—±‡BW‹RjŒ(ÍÜ1ü£ ¿¬¹}uAð€õ¹ùCç ê~1h^ OË$¨ÂoÞ—¦T¤â¦¤f°Wù$¹Cù$LT%T64Ëøüãú+Æk—%m8[@óðùx¥ü wݺfá3uÒR’÷©¬Û>eïªñWÍŸ¯XŸÉÞñŠËÛ3a Ÿ·•^Ÿžã°àáú£¥¢ú§Œ†{BÝŠãþ‹ƒ>†æ$ex¤zœ)¸®k{ÞöyÙÄ‹>M±«5V^´Svß³¦ðhÂ26Ž!„G­®XÔ|‚gYvKTÝ,¸”ŸJÚþvEÓ’o÷BÏYx¯uËšR7¨Áu'›ß-aªÜM?voÛÍÛÚï?ü'3÷Žóhb®¥7F›”:cíJL õ+ 8ÖOK0Wó-ó§;ûS‚¦&§GFÄkÚ–1#"‚7µÍëX×Tûˆ….¬S¼#`onžÊc§lc?I+ŒÕ g6ü§bP.´æÂš Y?í²ö%ä0áúÙÈк?b„a/ùO†Ã ™±[è¾÷–»uRæ^:çZyçíMxù?m¦&.N»>> _œN{eŸŸ1}T™hÐ,|<&Æ|_1kö‹RÊðL‚5¢ðÖóŸN1üŸ²q¿€®“ ST_íç_pÛ+Š:˰*yçžÁ¬ñSgÖîß^rûÁüÕäý”Ä’þ³îLÂó É¢!ùžIöP™UÃYx#¯–ª®“ÎwÐÝ.`Zí¡6|Ü9bOýžÎðÎøEëÌ´ñhâ]íèÌÔ·‰oþÄúþ¬ç08wô”É|ÏÓ¿¢’JXg††_;ùf^‹ ÄŸåkþ½#k¹ý»ï;R„ %Ö±í·­uꤴJMÉÖ¶6í¨mÝÈ­ˆ^rÔ"t"$R9+GÒ1I’#*9 (Õÿ÷ÛÖ%ª×ß›¼oÏDZßõ<Ï÷|žï÷yžï7²Ræd }§ÿ+ZE ÜŸÄW)ËCÿyÀ¨¸pì¬Á¡¾NˆúxÏ5åßíF.³rä Ŷ^rD„K„¯¦|Ôáè9aÖo޾|`æ®Çr×:x ×yŽo⦎ˆ­+ñþÕF³ˆ—m¡ûËwŽ؇‡ZÓ€k&k·yl_Õo?ÒÞ|·Ä–÷‹Ç 7=+¿ð‚sBÚu Cf ‰,ñö¸$¦H§˜ù~qçÒ—†|¹²+:"ü„’JÓ|éãË Çi<ˆþˆ€› >§#Ïœ¬2Ñìq´€ê4ÚßOŽp£\öØQki0ò¦”ª§làFùÃë ñFÖ}-§ŒÇ?^ÑÿB¼í¤ûY¹u¦aÇ|×®(³’–Ø5ó°Ï²ûðr÷¯/¼:“¶IÑÀ cMvð&±ÖjnfKv ›¾~þrú PÝ_²<j­o,¨û<|¹šÿ˜W Iù±îöã´׆Ž–_Ò;zb•#JjÃD4~Âé{wPK(C³ÞèË=ýTúK™âH«ŠW®«ÊÄ`OßÉh(Žð1òÊÝ› Qhþ“Áå^M:¹o‰«#Âp±aFäÀU‡-ëF(á—¸4ž©/Lþº/Èžà´Ðá>‡Ó¤0¿*û"¯íÁ9w7f¦eÜ]¾íªÆ]{ä‚(ë?5¥/NbGÓ'L‰,›:Ñ·†7¾QD<Õ¤šóxò ¢gm?ç±ÁêØe—iËó1.9yÊbn \P.•qÅ9g6Ú¤r‰bB‚i¡FÁ»½Ú÷iëkJåîSEóÇÎ:jä¶ÂâNå£ØÚø`éèÂC -(‡vî}‚ºuiQ¦íÈ“÷FŽ*_Wû%ãv59 ª¦>Ãÿ±âå‹ëæß˜»j• å¸~bÙÞ̼:¥Qî32O…~qÿô‘§0ÀïHtö D{ð= ¯òÞLZlYLØËªnŽ­lúX÷ªfÏc÷µ©ô™Ã32Sù Ž]™„O<³µeDÐ~à顯¹´'‡½M-#¦NÃ{Þ¨ö¾Ÿ¦pF߀«$uZé€væSŸšÌXÚ9'?Y“øP=ï|ëÆ†Ox=]ù!!ûP\ټꋪOØõNÚt1;°ßøèÁÜ9‡Ù$/»dÏš¡±—ë^DËežð$„æ<Å4}™½ï±Ã=LÔ9¼úÒþÎ%éÉ&°|ÙšúU \ø"}Þ5,ñ6Òïï,[}á!7ÅLð³9®¶ýÒö÷çú™ñ)FgŒ'ë§}þX“#{ù¶†nUSšêÁ^Ä=w›EHùò©þ/ éɸ‘À§H»3j×·1w<|°‹uÃÜùÙfmMÅ‹¯;_៭lˆœËŒÃg€,iM›x¡ÄêÀ悸¨Oƒ×b+A.‹, Om¸Áˆ9¦¨ß°l >vQžY}iu~CÌÇÊÓð.Õ»â¤ÖDÊÎ <=îS@¶çXÞ4EÉù§kØ@PöÚ•k¯4-kÙÙx?wØAcÁ|C=kåÔ3³Cî£öaøÏK§³3–ÇHŒÖ7C…Æ h04W Ä%V[-ÐË,šI«•°òÀÔ‹³Ž¿usyR´žÌÚ¶ ;_|#Þ¤yxµÄ¼úºu¨÷:·GÎvdíð‰\3ÔÅP£á¥Òæ•ÁŸŠÖ¹J‹øƒ/I8T%ùöåÀ¡ÇÙ³/{/ŠÍ!äɽ̨‘ʱúÂ;0’V÷öêžÏ¶HJ /鯿ªQ§7“`2sR¬ÇµrÚ€ Èúµ³ôëO™‡ñx\3¢ÝY#qHñ´Ý€—86:ûÖ1ûÓf[€Æ /SØrÁ 3ÀTæ†G;Ò\ô ãÞ_ œ)ߊƛÖçÓOŸ•´Þ“=qîJ¼Äš×ÖË[ŸÎ+I5dÏCÐ×øræ#']¹ü ÚAi ß” ËŠ_¾ LY¶&Øé[ónxµ†ÏêH… • ž=§—$àœõÓ—h:GJæoŒÀ~ð?D⹈ .ɾ˸DÛ¸Ëbø™Éw¸¯ŽÇfåLgÚ€P£‡f¢FÖ®dÐ~>Db_ÓV¼‡>`ì­ãFr£ÆE¾°‰K6a=*XNîÎk¿~É+²›&,s¨UÒÜn7k|6Ã+ÝRBÉØêðžqÀ®……ï,øiáù¶GÃÈiž—ß[>w‹F]·Ùf˜9ËlÔ4¼ON¥Á;ÿcÙô7^Ï`5ò¼‚1ßÔ…}òX<æzdФi‘¾Ø¦ê;océ—ò÷œæH?Û`‚²?i´Äºзyµª¢¢(ãï70i'¬ÐHB2œ°@á$“qw·N,© ½ÿrvE2Iþ< c7^0qZ¦IüÆ)*¾TO¡Ä¡˜^æ'-ñ3|UK³n¸~búô¼ ˜«ÁáHŸ _/ª6±ÖeŒÞó&­(ÖÇæSÀ¨g_kLÝmW}©TÖVŠÊª²å9èvÅÝ•øhøžH™ñš'¦ñ|œ†JXäjàø 5ÕÛ±ÑÁûããßäq.]¶ÝßÿP™ì­™M6_^C6¿`™ ÏaËëØ+s²á/ô^oÚ¢NË=Ĥrk¿¾z^”“V—À¿:êœ~ça )Ëß/,„žs¸È³VMüM¨_®Rîhr‚9çÛé"–væKþš¬D¿§Ó®? L2,’Ò3ðz…[q®æEÒö¸ åYË2"™còB&_ÇlÎ×pPæß7A-ßpÔˆi5È(`™ß'l´zâz—+ ãNbƒNa >HDYóÃ9N*˜?cS­ñÜ竬 þbýóô7@Z>'khNä¤ÂMÙçøo G&8 L¿_˜»åb„û& ãa„¼ùÕ@Ï’à;º×B¬ÔïÌ<ÛOOÙ^Pq‚ªª¼âˆÑ¿tvÛ&ÿõÓ·Õ÷i^ÝÁ¾°ÞP¿×$Ÿ²sÃ,#™I!¥2Næþ 6Ô(§n¤†á3hƒî]^M?‰-^¼IÚ ,Ëñ>»g†ôœ¬œìjþòôå…g .5$@›Ë’ŽqÜÕ„Ô†¯w®lÀ£ЍËɹ¿V჊UpÍ´·_6dOÔØH_ÿH1ä«sÕ û˜1[ûwœ*!/C1´}ˆI•ë…Ï”÷öÊ}Í)8©Q”6è>ú|šíÍñ!Q 6q÷—dß' Ø\—6M¢h¯s_¾2îà•+^϶ݪ!®«-¯p®¼f³5ªÄn'[+k½µÌÓŒïW쮬¼œloä5eÝ,Xܸó sO NÙwÆÆpݵ§ÛK“ò6}Éjú¬žšØè÷…÷ɉë]µôQé´¨ÛW$32âòó••Víë:sÄ.Ù¶áâÅuë?j²ŽT~¾²ˆÆ:’ñ|öÊ{¢&gf””ä§}Ša›5®ŸMÿˆw›ZAr¾äï(%yx &i?SÿÖtÓ-¨Éý¶±Á6ÑÌ_ðA—^y;;d09ÃûcÉ—èe1÷R뢵›UrtGI0ûȺbíbí‹Õ+.³ÝütÅ×bKÀöI JðÄȰ˜ÞtêŠa'îb’V¢æå‰o´G˜­¸€oLOtOY WJûÙô:›‹yšN.Yíµ/þSòÎ"Œ?™ô5ù’õâ)vZ•9§^gÎÈ¢¤Üö¾ê6¡¦”ê,i⫪¨[Þ”}äÙâªY^±îÏš˜…ñ.übǼȒÑÖô`J°Õ[W™¥ÁV»07ÖyO°=òŠ*á‹ò¾Tl>Úeö¨»¨‚nÐÓÅfWÞŒ4Y¤©T.}cÓ,—yðµ+Æb¬ü折~Û2/]sgÕ‚²ëÛI¶FÀVrõ¨ÇÓ?<¹L)<6ÄKjˆ„ç:Uÿé×d’2‘¡LױϬ;¦swø†F¸Ç+ýÍû`óøÆL3Ä ÚÅÏ«ˆŸõʶ…C¬÷Ǭ®²œuºdù ÏÁQ³ðãèòΟj#k0gÂeõW笌4Ä€fÙä§¡íÆl`OzgJÆMb*Õý¥ìÄßòâ/¿·éU¹#Œ-‹&¦ô[|\b5ßÚPjþÝ쑞‰+êÃú¯ŸêöiïÃð²\]é©xµQEÔóÓË4t÷GØU/7Þøœî[ÉÎär•–»óÕC4oL_<_—68çv1!Im—­bMå±Í¯Ôš4÷$~"‹˜ºÐ*êÑé:¿Íԭί¤.Ýó6#Wh£{ ^‘Böd?6ýZ{Èæª§~wS¢b³y*fÛ%Õlô-k'/èü¼°ôò•¯·îiAÜÿÀáHþ²É§¦G[<({$é ΦjIÕùá´) KŸÈÌÐ\ïî­´þª›çׯ†#,Ž¢±[5ÀLašK‡Ýlø‚øé{±7!›~‚½ßÛ0(§š¾ ¼Mf€<“ëT'á_Üz­}™¯$¹xüj«·©:J›Ó\¨»õ\˜wQJ|Îå×óœˆÁóøÛö$.{K»ñÐäë†ÊÙ îZ|Œä“.½f° ÷>dÊrÙž{òlÉד+ 7Ærg²ý¸>ú.–»žÀÃ0.@oUaÙ·Œ á…ñ‹5±_®NÊ…Oaò€‘râ]&|Ào4Ðw§®Ç'ÿ«d¥QR>g7ħ”¹¿¤nAiñ·îà’<œ|lî©ÒKÇÖ8™º&†Žx¹þx4ô}ÞÙ¤©ðªk1Z:JYµgV; Â1¦Û²$^¹?2¶V0Óµœt𱪴+wØkwc\Áú‡>›¨9c®çVφœ´˜óWŽ`6/ ³ðšË*d늳ùýÑsÞž¦lÉO¬â)-Ϻ-È>D8ƒÙâŒL.GÎ[Â9^@.™èlZ4u÷ša2!G·‡Ù¾¶yè8æÏ×,€½ /ÒлЫ>á2À(4œU• ølß`yÊÉTÆRþ˜õ[ÚÞL•§Ó]7ÊNž‘g?;É`ÀMIöãÂ8Š/Žq:”}óÜá+¶Mާú¾wã4ô쌟eª9³N" ãŽç„#²v[ö_«p ›› §JÿhÈ ‹ž÷²jÞÃÅÿ^‚ÇK_aJŒÕG½ªš—íŠNv–œî[ÉJ Z3êÙBDÁ$e >£pjøð‚¢ZëÑŸ?tºóðɺ¨XÍTnÕ\aeÕÛiφ¹Í!ÑÈui+`çþEÿõÛ2¤Ã––`ò&LÂ/u>¿oŒ3¯îjb?”Ù"»¤$_®QÐjþlmÕ!jîJG?Nžþæ];½v× ]d¶ÎróÒÄ$ Í›?¯L÷Ÿ¿3yÉ¥ÅÛ‰G‡( ÈÜ­rą̂ ê íÊ#n/O†ÚMÞÈ?4RªjŸ„¦ÏÛ¯´fþ ýÊ}hH§hõÉ0n‚T—çq9Fm«Í~T"fmÒ«@Ý4Å7Š8ÕÝÕ8ËP^H}³†NÛá«xwè 7ü{EÁü©× %OÞŸ¬P:Y±|ñ;ÙP¯±ú·MÕ»ÿyåg¯1¯J‹—ž~©4\:ó\q<αqÏ×Lïwï˜y©+€Â‘«ËѤH‚ûø„Ï12ëÓSMèì­YtÛvY@ÑRIuü±ë‹NÝ÷é¾®®-0ãuôh¾¦ó­SN¹9ðCtãIJ–Çæ©­*=Qê€T\½™š3"Øþh¸Â‹±õÍ‘äúŠ·½žÝw\¾‹uùò%÷‹_U±»IZ±sïߢͣDšœ>ºèU¨ûFóôüöÓõõkY2ik¯Ë¥o2ñî+gÝ—Gr¯ß2kÔ÷=yUúWËŠûbn)3gå%€Ä_A—бV%—ùX)?ƒ½”¸ò¬iÕòjpÌ{‹0á_⓸ðöT2óÁ__™l÷²Ó5¦ 0òÖõêò‡ÇrN•\rãã½ó/%?S1rÊù‚iE‡”}<ǘ>=ׯß8Wh/€@cGâ­9¨èc‚¨ŠI¡“¶íªãæÖӽ‚«çDž6@TÖÄ´¸ë7 ©7/0S¥Og½‚ &9ë“îB˘„€7cÅ+†T™®É>Uqv×ôIrüÃÚ ¨¬½Ô€Ån<®­Þù i­M‹€$ …1úš—MSö©µœ·õ [=<µŸ¾=°èaøLÃÅÈûcË*33ãâ§aù Ï-q$ò-]0`›FÆÔ‰Ë ážF't¥¤Bq[†g1¿:ûï™­™¾lÛg<0s‚ô-ùýªOa“ñŸ _{7V›–øÊQTböäm~$,¼¨*sðy‡¯‡YÝ Ü-¸&T58EãšÝ­¼QܶEôÝŽl;MçþtlºnКP…ÁA¶Ëf ~7˜°çØI#û£·kˆÊ!¬æ”Ž_j_Xj=&¿jJBÙì÷kÙuNc=÷;Pê.wû­EÑ Yõ©yŸÔ“ ˼¼äÛ”7îÞ»³oíÉ=U|) 8õöâOo- Óž×ôñyÖ­Ú½rêÃÍ&ÊÛXåI§³†’mæûx)5²èç†Ñ,ŠSï ˆÀM4àrï>l(y:'Sð&ƒ[N·;ž3ï9mBqê§Í¥÷Y•ÊM*…‡d2gg ®,æ—-D}¡ÜÓÍ™½¶‹¥6xtö9|’'7EÒ>fòδòCš‡A¦µ Ÿ0><‡~§úðÍÒ‹"V>’³W®hút.3BF[ùæÐ;Ê\C|¥7™#—tõj…^r]Ä…MªÊåžÎåïg¦ë¤Ê NÉÛIi˜ŸßÿÄëýç×YÚ&Un6)3¶P¿äÐîI¸¯x,óˆeæ7ä}`4¨g»•uck½{l­ —›¥P‚¾äzð«ë¡†õYO*–>±ÀÄK<-*Ε1^·ýÆÜÄÒÂIy´£§"ò5ù3g±Œ :®˜xê…ïÃºäØ™ˆìQÒÎ-'š}:7ìætÿŠ›DŸ ׯ@IY Mö^‚„=ã¸Èq—ã¿GÅmŽ4’ˆ¡¯–¸“Bœ®Ï4]’³oŸÉÁ«ô§mÚèªgMñŠ÷º6üžD•_îQ‘æão´ÕøW5Ænˆ”Â{•:Œn¨™qPi ßææ³ÕYÊy¤»kTWº Åó×X¾ù8µâfT»b侤iš™E(ËÍO¼H|I‡~´'Ò>ú·pOHñ5vú”óK2Ð(ÑßuôN ßo©o œôAhö£ÎÉ •‹$6É?ÁEMá/ Ñױܯs -Ïâ¾v2†ÞÚ6c¤«ê>ê«—ÍÞu”t.s.Š&µ{C䌬%‚ûé2rÖ»7Ef½ô‹LœŸlÍšu¬\Ë“vˆ{6='‡€ÅkPý ¯^þy×ÑP—X3pÂS~Ê}s› ÈŸÞ¹nÊ$üäåÀp™ÓÌÓ85~­ÆÍÅ–תÿ:A“4˜»P‰•4:Ítݦöæ¬<ö+e¦£´Ôô<~É}ªù²xïëªôO–bî9†Šî²‰ú×ó×fúoð£ž_1ho¹#Ï õ($ù nV˜õ[Ékä2º±²d>+ÇâS3WLä_Ü}¾Ô~n ?+äE˜uŒ.)ÜÚ4¤·ä’ªaáŠíô€¼Ïô1e¦f¾¸Wê—“?¿óýë2ß¿äC˜µ~Ëm±¼‹4~ƒÆM}®òuëp Oújòñ¤Ümn;i»]›¤N™JMÊ|íŒ~];­hxرN?WÜøÜx¯ñiFÓŠôžËs=îêî»7Që÷ÓJÌÄ/kԸϱ::mÖ¦°wÇçÀ¹¡¡¸œFRFœîηUTÍØ4C6³¡TÑéÌû¢€¸%¹/gž™ª1Ò|ÀÕÈn4#X¥UœrÞ=";cX­T©/ÓTÈ3°z¶pòƒ¸¼¯ùƒÙÃ_"ªÇ8Ÿsœˆ«1i¿`áȆä ûätÇÕ÷_*ÐÓ1õéçÀ×£œ»ç»Wî\bÝ^ JúÜæ Ò÷û§ÍÁG–.ÉÓ{j>/cÄ__"6Œ¹zuqlçýâg·çøåMÆ©)nFÝœšŽ— ÔNFÜ]›=œ¶ãòqõ;ý÷É1SÍUû³mFl¹ý§ç9ìÚ³ê+2wwŽSÌ´½¦›h#u¨1æˆÍËJ§KÁ¡‰¬3ju÷MEòtå+¤òƒ+ÏÈpøŸ§U)ÜŠEô$&M<™¥€°p¨k”NŠ|öìùáCž¡Ã÷òüeÔ£fE&VM1ó‹ôšú¤ÜÁWnQîé'NÙdKà!ÓñO·{³êèQ«<Þ®gâ¹sí7‡¿ùÈÖRòРðÄ}½ªkóý/[®Z…?#½"gKù×d)Ùsxíš\Bd1?Vq¡þ™u¦Çh¦vÏÝLûâöf…ëœv§™åçÔ¶ Ùçøö-ÊN{üNÇËî.3Ï_iШ§8Ÿ©}¡œBYS£?çø}CËJ¾_ýÞ¼t-oç™ óàõoÊDz­°óקؘæ_ˆÎŠöH¬ýü¼aûŠËr’W¼›¢‚±×nløõôDƒûP9'ÜñJæÏÛéʬa‹ÃÙá<'¿H{åÓjµö‹•ô2£œ‰ËÓN}äºçãe­Rm‹zü× t›ÆE³Ÿ{u4¿uF>e«Ï½ò'fœTö‰Sm¿n)¿ô”¢$7VI²ÀSÉ;ÕlÞS‡“9§­ 6¡ö<ˆðµO¯ ÿpäUbÙ¸¿J·øWN¿G%iNÃö²øòh[¬%øa¢ï­Î…ôØÌ!™ý ã³.*Óy¨VüxÔ¸@ë—…15wòõkæ­Ä#N¯®t€cDb1þnðî„û?׿H €Œ‡sé°/O HؼHÀW²†àè 5®3ÖÜ®‘ÈTêÏ'LJÕ$Ë­žÇß £”Ð9ƒŒ-[°Ùo8íÁ&»“žÆ¾Õ{­Z²õ©Ê§Ëá fãÍ—­ïÇŸ9ñuæÔÆÑMòaÖ¯æ§ê®Ÿ^>ÿ¢îÍJùeqY¾Å¦ãx‰÷ÈYGq9M[¤£éº«(<ÀqÌÁåãƒåh‰¯hº¦¢Ýñµ²^T´_aðJ¸.?­vóò ª-Õ·”g jѨ£Y=ÈÛ÷¹àÔ®÷#Ì>”¼sÜc¾³zúžãÅS G<Α“ E7!%®@j´ø»žŠ014AÍŠ’>ཀ¦ÈXÃ??Á!Â×mÌ¢7ø5ü%O($ë™ÆüûfÈÐS¨%1*kùIÄŠTÀ~‹/=ÐoŸÜ‡Í'æeghÎÁ箾¸®¯ínÁß"ª?L¢j0~ä…7dž-Üçø@V¤ìZ¾Ñê@x¿ÌëÞ„7'ÍX|’5 ”wv<ë,êì䥅cSsV®óèɧơñPX†×O–À“÷œ¿5OÈÁYŸÐ—°¼?Öy^cüT¹¾¥ÅMOª»Fh(\?idf?³e/ŽÝ6"¨S›:6Ö°ä<ù¸T‘ß6¹”€ý#ô-ÓiÕ-!{ž»ý¥®¡äfEZ­•£¬ÍŸ«Š’ÞÏwf¥­:8y­ îõ&7(ïÙöywJŠ×‰­ü7PÏ„£=9Sê?ãISIMΛY±—qZÅ…ÁNHoô¬Û<ìX‡f«Î¸2ãð“—_Õ]Sø;_'mß©m·æØÕÍ‚Qä@¸Lf¢î¥KËïY°7;Ÿ”ŠX³+³€;~£WÒÜOüø(Ùϯ¸®Š‚¿ž®Ó¤.´I®ÈîViÀ½]*H#y|x7#µîµ À'1c—û¸||Òxɶš¶;*Æ=½\B¿Uù™i³¥ì,°Yk×ÈEGj ì4Í ûzæáÓ€ÂG{OÏÁ_žûÖ¬ñ|¸Âeû/k.Ÿb ž—˜édj5†_ʲv]µÑ)öǃ—¢2íîxZžª2X‚½óÔ 0HñpQ†–ïÖMôÆ>½ˆ»®Öã<®àV¡I^äiÚÉmo‡Æ®J —°¯¬TàËîŲ#øKƒ­væOó£®¾Až•ô°œË?6:`õÜbðqY]v}pj¹Ò¤MTwùù“–h+î™Ubö¬œj+.g¤"sª ð§²A:øÓœ×ËN]ïLŒ½ª5Ûe凨Q:êz n#sxáðÙ~¨Mþ»B)A4›ù¤¾‘¡Tð§ü¹5Ô!ˆ6Åq¼üé¾ ™KÎŽZÀõÚEïÎ}”H¨ÝO«ÿ(ˆ`c`†º7ìê»)»v*˜q5T¾$-|7æÐ Nl„n¶Lÿ{‚"ãø±/d¬÷ÜKT9‹³+7íÀ}Tz¿s³\À×rü$Ê|2-v8¥§o Uw¶w¸žã7ªì¢-ãÄ`Öu~TƒqI Sn+Ȭh²½°)×/th#l%ãH»O²æfj>ðüu’Rä‹êä&¨‰¦wpg‡MâS‡Únd᳉êW¼7ÿ.˜íWæ|ÑÐzÞ>€¾¹/b.mÊc«b×tZ°ƒÝžl²û:¢iz7Ùâ•§¯+XÞÿÙmùóÕ'J¤>§¦äß {EóÄ=.¾Í!È£7œJ½¶ .ê•uðŽ€Èýµlo^ŠZN?·#×Tqs©ÄÍK4Ú¦QGùîG’í‹>4¹ÑÂ]ÀÙ~¤~ÙâMz+}Á/f‹ví‚—[ƒ—áã¤3ɇAûMÉ@@ôœqÓÀËÏ¡aA~vÐ&½¿¨œ„W²áà¥í> À™í\’krFrE8x)Ü[h*Ü]lÿW¼ãx¹r¼À$Ý÷$´ÕЕhCX]*¬áßVEì§Mß{‹.·lç\?%ýË®Ø[;ÔçåÞ¢î=öì÷ÆYR Ô“ªÊ"é³ù§G,ˆ»™_iýÔ‰S¿ìÄâ뇜$9—F*@wuãâæì –û‹v~Þ¨Ì3ÌW)š^yÊ2VLò¡.\<7Fr^~khÁ*—Ò<ÝÐòps ÐÁæVI™òΪò+?ßš|¤É¿,ñaµ†C^©~œí5Úùtß{%eà°Ïò§’>ÄDi›Øáínãc.2Kdº?qa«ñÍàŒ,œ—Öa&µ0­Ü¤¡ÈÈô¥&mÊ%Î=P210ñóråÞÙçkH±Y0'ÔPC ¢Ît¶fÜÏI”›zžì¨cÉ4¶O ”›_f8—p±`%kü~²/þ~ð¦ÈǼ#´1s5ðǽŸ}Ð1´ÿ R=åƒN.;‡ß°cs©dTy£/5¤c]sÒx¼U¥‹vñ»‚|ÛzyþéÛ"¿WÑ2ÁL“È´úf‡ÿJ@°ÜM;ÍuÛì»Gr½²7ÜrU/–< w020Õ?£»zÓoA_ôPRAÀ"‹K‡ÂÊʦPF2a–0 …HÖÒ`RxD”ÇL‘âìBwÕ”…rDSXüTËÿ¿Y¬0jûw£`ý mJóíïw@œªUÔ<™%VyÙæÀ!:Ñ„œÚ‘ïÕ4 äµ(u©V‡•pj¡òƒyEkH©¶*aàXË$:œ×±);ð8Õ%”ÉRÜè ð¶8só¾R=s(ÄöØë:`™,ŒK#Bà ÂÀ^‚t@cUàH ŽUAÁ‘ªª-=ú^#Ä6ûQíª`­8¶‚ÂvU{§aÐ~Њ¿†Â‚(‚[§M€¬­Ú–‚ÐHigGr¡‚z®‹f°P¸7O8¢K<‘À?m!IKçytÕG¨ààª84œBvÚ(+8L› ù‡Ý©Q 1P$€°Õ9 ¦°¤6-ÐØ<®Ñ©+rc0p™ •N[@j£Läpˆ]a@à„µªˆojçNbA'@9}E¢Í¥±Ý¸07Ýž&Jß #Ó¡0PèÁÁ²ùªY7‰’9 G¢NÄ_U™¬‚ý¡øƒ æïë裟PÍŸý¯$Ä·ÝlÍücp G«¢á(4²SÂjÜ1¼8ýg?thðíº5$(ª(8üÓ9“€j 뼭Εƒ*„ ŽÂbàªè.UC´µ VW¡TA¡…ÀÁÁD§-QAÑê¶±{"ŒTÀúA…j"„jçJœK¨Ú!Ó™ô®Á0p$€ƒCá‘ØÎ›Á€º¨ãÈ#j¦sX@UiTºë‘4驪¡ºt ¥qipÙ9i@vÃuôˆšé$C ,(U\Wòƒì¨Gè,WPôÙnðÈ×TåTª‰Ó¦­.†V(N)4¬ªÂ\ç’ rŽø}íØ€ƒ²ƒîˆ»6¡=»R48[€„ƒè|2ÒØª?„Ô£é@9Eã:×¥`3¨Žôq#òìid¶C7 ‚¦VH8ѹsJGµÝÚTœ€cÀÁ…Q‡C}Öè8¡C`~0`¶ŸÒ/dÃxl‘i(¼ ƒfñ06µudZj<" ´?ÛŒ­öÉH&ƒöfË5׉h/¾†<0àHÎ#ƒ#«èNË-° èUH0Y¡Á ACŠ,vÈ>ï‘í¤0x¦ … ¢ˆÅvgÍYê9txÓU|Écƒ£´È4™ß¢J;TeÑþ3›Çc3Û:^~©Iܲ v½½0­tzAÔ]-sÛ•9Zí=‰BóŸK>Q´ƒý¯ƒ}Ë:Ý€îûƼm§,dÈÍÁ°)šQµ~)ü¤µ¾ð… Ó¡ãР¾ ™`Äëõ‰$™ò9”ž–üKÒÒqáÑØ5 eä‚n“µLÀÎÖQxž†ÐõÑB&ˆ[>w>^ ô+‰Ä„ۢĢ€¬ÐÕBݧÛ„ˆCf|·sVà§ ‚Ú÷NE ÑÅgúD¥ý7H„J›o„Ö‡ L2@ÒI.”Î’‡Æv‚,"FçÁÜè ŒDæîT¾ [fDXd¶”Ó1µ†-Ó±°Ð1%X«ƒo‚èŸRÀ!UXéÄ ƒÕºA¦ ‹ç1=ÞÀBoø¾Ž®‘‰Á2C ¦––0C3 ˜Ì\Ç‚`¤·ÔDÇf¾ÔÂÜÌÒ@ FhÖ} Ç‘[:*vƒš \° ¨AÓµÔ‡ ýÀÍ”`–а;zl'ˆ/Ûò0YØkác3' k‘¹Q+B„ì ö›!®M(Ë“«JÈÆž ! åD&ƒ6:WÔ²¦¬Pw©Á„P|Ìe ­Vw3X1ü«ãÄ!10 †Âª8D)a‹í¼ä0’‡Hÿ´Ž*;^MYÙÍÍM©Ù r—²Ðù)†Œ6ñ‹B›L8f‰ïÈ6+l&LfPÚlB¥ öˆk(‹ o‰€…TŠØ™.ôûku+6y_ùçKûõ¿^”ÿ·/ÿg”öôïEùûò?öHiGD/ÊÿÛGÿ)íå¿åÿíËÿØ#¥=ý{Qþ×¾ü=RÚëÿ^”ÿ¹Oþ{¤´§/ÊÿÛ'ÿ=RÚëÿ^”ÿ·ïüO”öòÿ[óÿöÿú ¥½ü÷žó¿}ç?{¦´§/:ÿÛwþ§GJ{ýß{Îÿöÿì™Òžþ¿õü/¥‚Á"°âñ¿Ïÿß#å[úw\7waÒõØL'6‹ÂâýÜ90ˆÀäÿE"Qˆ–ó_èü ôåÿî‘òçœÿú!S„ÛúÎõû=çÀþc‚o ¹âCÑA­¹?¬Bâ*½–íRÍ›¡ )àk =Â÷¸J0؈Ÿ<±ÕÉ^*„2Ûn÷#´§×Ú õãƒUÐ+ÐâF­Á¾»ÛP&cP]Œ:ŠLéÄ-A m"2°æ'=³ÏÑÜ…Ä ÛÃDœ3læ×_»ï±•D–=Í‘o¿#Š÷Ø´g :á 5µN˜KH "´E™ã68WAÈo#~ñ¦ËnÏ,fA0þð¡äÎUøUÛ0Á±‰Ëã¸ØƒÍ(Á¾ÝùÏPñ“\ß% ߒЕÎṿ’ ¬?îö/&¥>¥§)‰üYYta6“ ÙJ2hfê´v”ƒ OÇ.¥³x($á÷‘쳘^â~þ*²YPx.Vë fDî)ò¡~’| )úEèTòòožŽb£Ú“bƒûy±1a;Ð퉌¶ÒƒëJzÄßô! …¨ =(K Q«ÿb™B¨üH¨¾Ë¿^¶šQÜQÆ*ÿ€5›¡®l:ù7bZ÷.L'Ê;©“ þÁu¬¤ÍwN|‚w…Ê™Nêd°ú_-#P—Åç›}Á ;°9LáAÖo¨‡ø>õþï3¸Ýs‹¼²4‘ƒóÏ&LŸmïÂß#¶ÖúcçÖÏz· dµø±ZY߬#±„ÚXØ{‘ã·…èòï/ò;Þ_ ¦a0èG:Z°ÝdE·¡¢º;÷$·=)þ°MåÍ—mšh‘Àö2ÊÚ×¹D˜‚µ©â–·Ð®ê¹m˜öïuêºnôb+D{(ÄýÓ‚iP˜Zd¡ZüBD=PøhÑñh¶B¬ m›ƒ§µ«B$Ã-¿E’ܶ‹ß y+›µ°ºãF{6k˽͉ÿ¶Ç†ð¹PлRL?:þnNä€äàQ8ÜöÆG´HÈ7Ë.-P ;@ÑÜ'‘zmÏkÍ:µýݶÔn¯|µtħ©Å1“µèÐ6¸hïŒ?Ôk?»îbÙÞC´.³tgêðïÓnÐü­3í&ÆW+¸nÏçVSAôìYMõg(£Ž³Ú^«~ZHøú:¢Àߨ@mô*¬3ôpE&Ö7°ò8.Ø\.(Šôãä¡Ð&RÇÏ(6Õ_£×T;ªµ>}Ö+ôYŸ"ëAEÖFAÁÚø‘ÅÞ(€èHaÁˆ\™B%º0Z%²Úk«çxl(ü”Ð í•Jøy¥×qåèS}ÝÀVŸüO(Àv+ÑôDN I¯ŸÀa~^—u\uÇôé²n`«O—ý'tY»]´.ëmÆ(#̈Bn»° \£Ƭò Ì œ ;´œ³h‰Je3l·æ¨Œ`‡\Â3y¨ÿÿ ì]4€T&«¨ü –0Äß©|&:F â׈ĩ¡P}"ûJwJ»ó˜^”ÿ³ïüw”öôÿÍù?1XVDd_üŸ)ßÒ¿Ãb®‹ÅvaÙS˜ßÄê~ŸÿUeÕrþ û© QÐ1ð¾ó¿=Pþœó¿â½)¢ã¤}'|ûNøþž¾mõa{ž&{ÈÏO£Í(hÂâóªbå)œ”wbQ•É€}çzø;»kÚ>†zG­‡Ì%è ,E£pèW·™uŸ˜ÛÉm¶õA=–Œýÿû)<'Þµ ØCk>õ÷k*ï ­-‰÷ìÐY Â ´Û²Óbÿ“PmÝÅØõ¾¶ßˆŸïíiê!eµ X<އYÄ#¿"VÃ~J0²ZF\{GÛA!‹F‹ÿ¢ð8©Èj1¡äu?è]ãÁ‰ÃæQìAUÚó<¡ÒyWE®û¶w "õbï·pN!+Ü#ÿ­´Ñ¡Ëf30¢½ãPv #¿–Whä÷èS¬­'v t&Å’GÈ}H鮡ƒjùÒóc¬4/,übºªZõ¿áAoïÿAöÿo_ü¿)íéß‹ò?õåé‘Òžþ½(ÿS_þ‡)ßÒ¿ÃØm)LÞû“žQé"þ'‰F¶ÆÿD‚Ï‘àÐ ôùÿ{¢ôùÿûüÿ}þÿ¿áÿéÃÄó¯þùιxQ‹ß±›DzÆÛßuß@’TlS‹,êï Nèâ"ÿŽÍýóxù§ÜÝ b…C9Ì€@Fd9P \ÿ–aý+Pаbša'Ô¹à,œxBï¾Ø š«ÂwpQŒCðÕædNaã÷1NʼM4nÈüÛ¨_û¯uJ‚óG¦cÇZÏ R볡Ѱû|ßE¥íAó\Ïr<úW/íýÙÌò„jŽÇaü‡˜'\À¤ó<̉Ç8ƒ©"Ñp€iþœ¤L&µMñ'Þ6ÝÒ[$G"T`(ðk$ ÛüF™LÅ´ÍÛGgPZ;  áC£8€Siþ©LFSÛ¶$\·c°Ú€ˆ†chDŽÍ_R@Qm¾ï«j «(˜ª  pÍ_!”ɪˆŽ_Ùñš]ԭͪ á(†Æaá(”js8$è6Y,–=òû´¶ÆÀ1 LþCµÁ®-¬nDž=ÜR Ç"°àw*p,€jCL éÛ|ˆ­pbáX †ÅÿcïKà©Ú¾ÇÍ27™Ç”Ì×<‹ÈX™§p‘áš]Ç<ÏS*¡( !r…☧$DI.."CÈœ±ÿ½š{ïõzïû~}ßï÷oº¹çœ½×ÖÚkØ÷¬µxПmМýù‚Þì¾i#. ¾ÓF\Xä×1Ð?[þ"ÿà6½ïó´ªÇ/úþ/úKÿû)嬦º21f[‘©ª(hcaá–¡?¯ñpÑwqõñÐx5Oê*n¿{÷ KYY9''‡–(++«­­MOO—•• 233cffFWGWÜ5OPˆþ†í®­®ƒutü…5 –ª‚œ®÷Õ™kí®/Å/¾zEùÀ±c gc¿•hÙütœšºStÏ £ÎÔå#ˉͽ·'3úå%2º Z'ï8dß΃O gÇŸguì;Gu–½èvÙÓ#ûû‘™XÔŠI¨Ãº'ó72K«Ç|‚cX¹üîS¢eZ~ÏãÐÓ,Æ60E=`©ÉX©bÌë³ÂžÍºÝ'äu›Ü>Á„•bCnœlŒåvÄ…Ê_‰$éfÎXÙÜ©G¯Z<ñ¬F®yêº(m$‰T­Â ½;¦‘!XI)VÇvɼ³¡sY]ž=pà‚ï¾q®? †š¶B¢ÉÚAù tw'Ë7FR’äÀÓ·³X8Ý€cM"ôZ_ #É&&nµ"…ç‚ã0R »-·úé= þ¤€œ"»Ñ€œî†òk×4DãQWÌÆÁ&-x:ãüõ<4ò`xð7­žûQ¾<ú£´r•ðz²ŽL Á†‚½ÎÇš«Ži…noŒi 5•׬þŒüÎF²-N‡¶mÅ=¼*½ƒÔ'gŽ ¹4ÓßÌŠ ×SRªÉm6ûÌ@^ˆø ßèuÈõø :Ù7³lÐDOö¬]÷¢½Ê“£9•^€ˆoc¦W»ÁãÞ¸‘9Jèü)8y±ÑãÕñ\ ïggÔJ5xvÃi<|o6xúùž®°®z.y–©ŽÑ¿Ìî®{uTŒËÁÎ¥Ä!À2‹]ú`5ë-d¤¤Òåé2dáz´ÖÓå}z€¶NÔö(SÃMÚ]" %ÎÀd${aØòÅÅ#ø5ÒŒcˆ. ‘`=œTéx}B*0J\¤ódE×¼¬î´ù.W ! žTè ÖÍ(IRý]ŽsÁIWC§·uã\ôL¢PñI±·§$q½öÛ*?ÏqÅ›õ&¸×"P‰íur]·âjð´'EyÆ=jTÜ6|ÐØ#ÄÒQvZ3Ëš€cuÞóœš×Çq{rè4ºï‘õ¨pmmœ•,ö(РDÁñ¸Ûݺ&r÷¬Ÿ|¤ñ¨=–|t²$óý-þÓçZ!ÈR3)_íÑR.E,_QM.héNNQ©Ø¹Q~úaÍ%5ð}°…Öpβ¿„ ßÚSáw¼Ñ8Y[IŠ`¶¤NyñBš ά¥3h9ß¶‚J9º’Å%â%´0 –:¥fƒó¤#•JJ—‚š™¯ƒ™OƵÌ?À%©îH•Z‰bk6¶‹Œ ²&þ¬¡ëÌ36e7÷;WV×N¯Ž¿|L„, »òˆŠ“>ªƒAý!Ôþ±¾ï“Kä çÞ.Œs¸´1÷F7^+I&BÒzuA/{L<ç©gƒÜ’ÑŒyÝ=…b%>ÏÓD ˜gUèLN!wï«Jˆpzæêó¸´½jJ¡G­ œe9"a\¸;gY„±Ši~H´3_>uƒDj ×ëP`/1T;‡'¶¹œÙzŒ\ï©ñ¶»Þïc\$v^É¥&lnWÊã ZÍÙ&Ó$¡ ‡Pù†ž¦†€4îV­ÇöZ¢(-9)‘ÒŒÜÆ£=ë†S†¼­8ÐÐ} f“G¹Ç{ÖCq ·¦|êfÔs\J‡V¢%= ø8êóÒ UuÕx^]Èm<ݳžqô`¡mÖÁŽ!ÿ­CƒfÇ£%Ïyôp´’ÑF‘Üó¹ûì™ó”/Õ2¨™î 9x¸ 4@Ž%º–2ƒ[õÜŠf¶nP)ÚYÒ%üôî½èysðÉyeÕƒ"k©;§ïÞM$ñ ~~\ê‰'EìˆÑC¨mk[„8GµÓªv07þšöc¡§†v„/fó± ˆí“žQrðMYúã@9Rù^ݽ|G7oíü~Ôq¹Òë~ò—.ýÇ(w®¼ä—L¹3¨a#ö[‘H²+,Æ ¼Jß ~®’RÄÀÉÅ&jõDÿæMJ÷IÉÕ7Û©uÀª2i ôãSF.ó½Ï…Ë+Å2K—EûZ¶|†•(I€eüÛ§ü´ôBSWR¸|Ù DVäÈ;kr^FÅ¡ "Hñ-åyß²×>:7Š©9$²T¦êÚO»FÚ,ëº÷Ëâ×ÙšºtÚ jª¢_šs×'RkI+\ˆš"¾h.jiëNV‡éÃJ|Êë\43]˜¢I6.ôHÓäM¢è{§{‚íÎ×ï28ÂÃsÉ-ÃÑ:X·ŸI;Úˆ°Såñ’ø¸~:.“킉ÝîÊâõ¹ùw° 4øë8{ºŸgxF"ïÁ¬_t©¾ØEgbŽ¨Ê¥ë´/{äƲ\?…æRIФÉAÁã¢\§½^«ó\µµ%È Õ²ñP—Kf‡Üºìb‘É4#‚¤ ¾•îÞMœj̧·Ðê>»Nš·š}鈋]æ ë•{™òyô¦R ›o)’w>Þ¶/ùµ³ÿ ÈSÚ“É:ˆ:G¸Èb–¡þ¬n¨–展&–;çôš‘r:¢Úèe¨tºî«¹qºœ…÷Ö;èéœSzu‰¼¼ÏöÝg1¾ÖE¶‹Šðux&kwïsr«¦m ‹)F¸ ™G¼ô´êœ,è3/À(½g…„&*`_;#Eaæg:/LTªh(Ý 70ñ9û§^(…¼H*hÒ!]‰ž¥’Džsš¼3ßÌSoxE/¸†¨x¸•Þ4® 6ÞE½Ûb×#î6ë^ùHîBç¶U_Õ´»úæ¸Y/¶éQSC 3Š}ÔÞô9cZ%‡sˆ-·>YÐÎmï8:Æ>ðö ¨iœK*"õØ3Lœ|µád¡üddÍþLÖó”‡ï@KÞ ¨zµÛ§ÛºEý{ï:¾s!!ƒ°—Ü:êbWÉ›/nѺ]Žß/õäxõe’õ¹Ù<#ýÜpeõºœ À~[x©*öµÅù¤I · :)ã$QŸAaŠòqå¬ ¶axäµyÆ{‰ £qï-”Ö{XþÞäôî#«3š«™yEõW¬È¸µÅÇS§·ÿ!_3ªôq$1@™¿ÖèQÏív¯“  Ô‹ »} / ±)P§§‹à¦LîîJô2cŒð»Â7à0ïÌ]D4{w¬lFÒkøygâh´+8=¦«äÕÏÎ:é –õ7y‰,’8“õbõȵ1ŸŽŒ”²:üÑ›Ï &â•X«Àv£•`n>Ëg ÖIŠ"Ì„H“ AÈQlH þêBãèHJõzÎFs{Úö™êª ”©ÑÄ•À„Û5¾É·%|UýÅ6¶·'Ì]ÖÆ‚Œyj ‘ä C¦&Þ¶QÜ­™£.­Ô6f·{)5˜™Õzz¨‡Z¯µÐ1ÕnŽø¯û¿z|‘AºR—qÂôJ¾¯:Áây }ÖìÏš\ZÑ̼BV¥NøÆl{Ó»·m²ÛÓíSJYépÑäÕx1 ±Ç{g+Å‚ÒOR<¦`vNK¦îá{²½þvEe)©f^NºÚö®ú„*¨÷¥ˆ—ËâvpÒÌÝîê®:7290zK¼ÕöÏ3¤U;ÕlÛ•ºÒÍqœn»I^uÁŽt¯Öcˆ[åú¨ÃN³SÖ¼»*úC¤‚jQNˆ`î>dÓÈË%õÌöˆÛíjq;Cf¸þªÅ@÷±=g77ð13³®sÁî¶)£ð•—º¥åµÒ§B7.0B˜Þ- ºÒÎzh—Ä3y·W¯òm‹iÚóî çJÒšùêÖn%¬¸ŸÃ·M½¢þ)ÅÎ9lQP’ž{‡Ëž"*ÆœœËé=“Û¤5[ok_R;;•­–ØÇLg;³šK.îñÁ¹n´ï`~yzÏ@XŒŠ—-rc.q8ûiÄFNn•Ç£ÇÉaÀt¤ok‡[›ìkë3*^·˜fÕúóè=O5àD¾Ü°äóï†Wì7Œ€;ø<¿>$ë)¹$4©vÎõ”ç­3ð¨¶éÄØÓ´¨3'5W-½_æÜÄA Ò76ú ¤n0(çgó?R"f†‹{x½ÿ(„’ ÊQX¤·ÀÁ£J×/˜ý8èrru)øMy8—iÅ‘º½¼ÐŠœŠ,Šk—|õgý`Úà&Ó¡óW òd=uôz9T¦†¼Wá6t²C¾) 3a f<ñ|âiãÌ”!틬©W±òZ£JGC GXfUŒß L¸ëô…18ȧ©cE¼©ÚÕ‹AlëûéJîååWn›ã¶ 3I„­§õܺîn¦±Fè6Ë.êËš IÚƒ›gÆ¥±ÎvS%¾SÁ…> }‚Ìì1¤2”޽شº[™ÕÉVÞìŒ ¿µÐÇajL€º\O«Ò´7õ©Wš¯Èˆ<Ñ=Ñ’:TD§˜à€QÍt O¥âBo\¾ ]TFh ®yO¿"Ž´ŽÍηa,‘š' qn7°UÎDòì8ÓH÷4#'ö‚óÖä7i,é!½Nz'iCN ’gCœE±“3:=°‰ÉL­øVû(‘évÃr¢<ˆ@TQz÷ÆyÉKÉ3¥èzYÊcÐõ‡OY@B(<ðmî¸H®ÄxY+4¥²MßìŽÑv£k©1lDÄ %Ù_ ˆ›|½òõ^¨½éA€ ><°§ñÞ‹Ì<ξ&xâðm÷#â™OZ7fÀûvö %ù¢­ýîš òŒµ6ª~âÄÕ+P ¯-¦©_ÆU7cà™puJÿJð !ªF5PÝ#ÿii¾n—¼{íä…8EmørT¹Ìö—[·h°»mãVR‰Þ¯xu0i3âäXé1”QÆ4#’-Uƒ:flmº§vt²»§ð±/:õæî©úìb¹1§Ùq«–ž"jÙ ´»§/:)¤J1 +FßMiTcyÝìèâöÔ O}vŸÍ˜la-¼fѵbÖœÑí¥©ò J êOÄÑ‘XbvnM«%À—“jKyI™íc“VÊò-ºHÑ"³ y»=àh¨C"èÉñ*iŸW‚¶ºx^}ãþܘ*5°â"àQUöhغVpØ•,Ì!!âYZL¡´íY ‹îd&ÄØ{z¯†é0ä¡z[É6Êï¼{àp–kÁÅtçgÑÜu3½i²§… ŽdQ—ÑÁ­'ãáÃ<ñ8ˆN"õHÔÅ“µLlÐ7,e21¦ƒÐ°ÅCHKöìÛâx·Qníõ YF1çÚ$l*—¿”«tRx€Ú;„l᥵§^†åõŠà%[­{L=¼o|•8 +öŠ®ÕÀ®dÚ‰/r—LË~ ¸ÙλûE¡}?5Ý©”+ê‰Ì{$ θøäé9÷¼dbÕT#Žd"–šk³¼û6¦q‘/X¯9Nß¹9L% #†(JÏl=¼l`-‘0ÜDkëÙþè6{$=}8}rÍnž=öH Äဥé˜UéšÌvÏ˘ÜцWG±#/PÅ2#&t¯ø@¢åCNT÷<@=­zCUÌ$1OÐ´Ö è[d«šÖݼƒ4åÐw>Sª;lÏM L "õÚ­ØÎÌ|h¯uÔ»D¨òàÎëg-„àþHc|R bX =je7ÿ}:å ¯Gõlkû(ãÉv½öL&¶}>±2ôÐ/‚fà&ÇeF"ž’dDï2b-¥rßãå‡)ól>I/ ¹òj¯g pS– °H†5Ž•ÝÖ# ÊÎU)ÒµbV‹¹ f&´Tô³_{2üÔ=O‰Â`þ¹k–­†óéF6 )lx¡ÿ š2ÐÙˆÏ 1)š÷[ŽFõ÷º¨Ur]ÈhòLjòï¶•Ϋ2ÑQß±ÆB‚4+ÆÈÁ‘,ÅJbóIJÎ$‡…îãñv÷˜ ¬d ¿XÏ+€Ù$$föò*\^¬ÏDÇ{5„èT‹c„¸h\V©Øcfš>XPÈ×ñb’‘"¨#,Oƒb.ܸ#ô†C[ÊÉ8NfTéV“†öY ³ÀwÎbìµor]£a •Ýþëcéq9§'Z;%øÕ[ÃÖa`{#eWc´ˆ—ñ–¤ _Ba›°àú%>ªÐÆ‘1¯/‰äΗ+:&›–ˆ®9ÅÛ5¸¦‹×2©[JFÝ3ñpøA,EG Ña´u{\P´ •-ÒC ‚z=à¼ç¬æ<¹^Q»Úp´èª 3¤;ØH7 ó§‹0Ja¶s¾¢¬ý=¸€dsò.4FTlÄ{¼b?^ËÍ·’*:6½¿kwŒ2¼¿ã©OœÃ»•Ì%z H÷uÅû²)óÈ&[`·Özµ ÷Öf §YÎCkß2Y¶Z"Ì“KÒ<ͯñ¡(Í ŠÝþwÝø.œLhŒØ¤7r]Ö%3J;ä³*Æä­ÑLÞµËʛރ|.´—ÓH·½ÙöÕýÑ¥[Ò¡ýöÌ^’DÓ<ιšç6p{Þúó?½•É¡ázå¦68ª'VǨ+îQÞØA+€œéØÓpí( ›ˆ\¹Žƒƒ”‹HؓËEýºþ&Ÿ÷ñ'à0qBÞÜ;økLO¨»4dêî-œÌE‰ÚŠ îú`Qßnð(Ÿ"ÃZ­Õ Ð[.vF:Ï€–(>k<Ö á;Ÿœ…Ö¥4O±†’”Wø±7‚ÂǼu[Õ“£o¾›9½•}“ãH,â%‰‰„j+ÂЪÒÖu\§Ì»$>ÔH^ª6k£‘<ø¥U 7¡5üÖÃp8ÝF4üñ( °‘µ"-:§§Œ[6TN/†ÜŸ ø4QʶC­H•EõÑ”’&º/#šU¿Ÿÿ`ù•/ã^ddO}lYz$~âÝs[ý»V‹¡Á•ý¯è“™ž«mŒ€ßÚVYN ÇlÜ|9ê+Ý”!‡ó°ü9¦EE&§¥©ªÝgk™àéǤ »Ó—VgÙy¹¬±C¬}ýù7&_æ—å§&žñ©6Rï)˯ì–V;ðv»ÑéâHŒ´: {æþæª\P!.ÒW϶ÞÒß4pUúööÕjioÿÕf1é€k›wM‹%Rs8iŸûÕ˜ð(Œ8÷Òà"CGDSº/N‹©;@ú¯òPż¢æ3e˜_ŠIÏĦñŒK·S+:nËßYÁãÆ Ÿ¹‘m©˜Á;å”e+~‹ÍX¶ÚOúÚ¼ûýWr1U'šÑ¢ª& m·@ê)û×&yQôÓÚí¥ù%÷k]AÕÔ  ¤‚zÁ $ìwvóIáC± 7N¹Ñ¯(±¯ÒÀ‘ùÏf='uf7š=Û¬¨O-%¹Å1<öð>cõ<çÞ¼Ù‡G"¤Âó5G¨”1;L€Ä©Ž…¦—úA‚éA×vH(âfQcb©žâΘë´nDåqßv1²[ú$•îrNC¥ ؈¾ý^çˆ!eúÞG«ŸÌ"iöñP #êÃ*…Xú Aö·¦l @7$¯—edy-ÓrÏt»QÑæS@=Þè›{ûVvåK $M/#5úÎadžåó#a¦loš#,¦#$ek«Wš(G”vËŽtˆçî¦ ¿ö€œú.Tþ.AÎa=ò“%PYTCÇÜ%[Õ¸,9þ¬Ó|ÃO3È€›·ën*9¸7L°Ô¾ÆG^„¹Þ=Ì §d6n÷ôáp´¹(x¨ç^¢üdÌ‹<ÿçKÑ+dìÒÈWˆKÇ»¤¢Lë"¤B ´ PòIÂõÏ—²J@NÎB¹8¢¿}ùºŒFµ¨CxÁZoÆÍÅl½ @'×ú]!»nÔ”Jò »æÁ¯sRË¥Ñ5g3„o|ú¸0úrƒTÌÉ5¤nÁã=¶pCîXšäâT¬gÀÖrë˜eWo–Á }.øYá±[‡Õ/÷î9É)ÅE¶G?™¨F€M®žõºU°78Λ÷P[¡©øùk¸…n>ã@Néç06õ!°‡ zVHfê>¾ àVåè;®©cÓ"W¯Ú·:é#]¯*Â|pÊ:—Ìüè$¾ÈSg°g—oqÕP›‚® Dbýœ×Cû;_ŽÔß›¼d¸’‡ƒôiˆHK:'E2@'=¯ŸÊ›YêR6æðúÌp3 n¡--iÛB@íK×p1èJ'ôj8W'"™£v>pމ6'€ž6ÿùyû”lbY}TŸg«#ßpt/o$½Ã¬KÍݳL•(£êûj”5”¾à“@î#dɘœ6®HÈçp]¶U±“9ë)÷¼Òøö¾Ï\Œ¯£ÜX¦úÄ¢*å°d}©»¬ŠÖh¤Ôžkc¢•{ggì·—†7˜‡ª$P“ír8«o*¥ =Ú ¶L •ª>+9¾´øüÍê¼Ä9x,ãlVæž‹À+Çš+ÉCC KãóuÒˆ3¡Ü¨Ãù|Š5î•NíNisÆæ—)T#Œ ¢û(À¢éª¶ÅžÂ æ®üB3ƒá…nV3kCý“×Äõ%å–6Tj•É ¶ohÕ‰·bçÚÑZ·iqQص”ÔÛ†­öë» ÃFÜŸD@ 5N/ ÉqÖ5û¨i'Êȇqï·{t¾Oo0˜ ~5Õ¨†O‰×ËhFhÌY§ŽÆNµ ºAÌŽð5´#ž\S:Ä\³_Ø|ò:6Ú³ºbÙË&JNn>ÃDyZħ°·›JL·­›ÖÑ'Ø7(Θ^qÈgB364=î•»›¾ãYy `©„Ÿœžm”Yý0:tQw×j â8£¹>•„ ö^†íE(ÅŽxDëQè¥ßŠË ä\Í}@V6^(î|`¬ÅmÍQ¥î&…/¦ÞoRWj¬ãR–sbä(ýY97v‰ç#©Ö ”œš— ã –DÞ+<º#;¥Ôa)üsXðnîžkl÷]Ú¬4B.ÍO 6ñãˆe‡K?ZoÓz4yÈýñÛýó³{4Ñ”É2{ù&w©°UUPW(¡fï)tâ5(¥]M OЩ«”ö‰U‰ØÚêâ¹Ód¨WÁÝd°zÆ­Œ/œŒõ¾Á¤ÖíBï„¢ª*.ï<ùr4¹Ÿ›ïR$Œ"Å5XSÚðREdâ‘€f Ñ’gÃn¨À$®&ï¸iï‡Âú-B'íq³kt¼Ð‡ —‡÷d5S(q ¨àK¦…_5:Ó¬à›H©Ä }ÇÜ•kÔr˜Øî:ýôL('(AnJ>Ü|v\‘± 2D¤nFù„8O/ÇÞJ”a$ºa2¶®àì<{e¯ où!›áâz@§Tàt{å4/¿¾64Ùu7bpbÝfl985Å&¥ÉÕjοd¦Úi¡>ùÚ¥’te|$%<p˜% æÂŠóM¥mÔNÓГ°…žª<ýÖœ#_S?Ø8oÊðÆé‹®U%TPsö0ë"§luv«q×YòyU‘Õ¥I–æî›GBééqŒ¸J|ÈêãŽÞ|áRo—º÷œÚ 3žcâS~·2òZ{š#\êyïó…lpÔ–3{xU üo×Ö< mh9ÊÇ<œ2n•—âÓùŒÖ‡—ÄDõ3•mΤ¸Ùj}eäíðµhâ|[é­¢ÎzÊè¨7±mCF§XãíW|É;&FûðwóçO]Ø$‚–§ Õ¬ÇGòÀ nÒ›Ú&‘ýte›çïŒÕ.`å-Ф7nAÛ•H“óÙ‡ÀÙ|QTéÞt’§ÓåÁoør¤MÁmUÁmëó¼"Ü ¹°hÑ> @ÿUÌT4ª}ûºÈ¶»´•ˆÔ]Sš;„$ìA‘få÷ÖGÇDH¢÷žl:šdS Ã^ßž¹œª{ú1J0{Ù“ÔÐÔ(·ˆj%ÅãÝ»çå·÷ .’LûTs™j1M$:Ñ", 7CóÏQ¿xZ¹@¶pG\£×»F lóÇr.]Å깊Õm´ê=€ÕsýŽòQÏ‘¬žËo¢Ê#¯åë’ŽEÅÄ7=ܾí7J¢iF€ÄáÄYÃçHfõ•°·9ض=mhÕC 8(Ëâ }ÒƒU|„qà•#¼¥ån+‚d#fÁmѶR6Ö­" 9œ]a©©»¯ewf¸h}‚:¬V™Ë:D‚‚º,›Œfäx¾Ej›œÀëZŒ°(Ø}b‡¹Ø&ß-*á·|©bl¢ûXxÜw0ªÞduS°†7‡a(àjPÅÅê1 «w*-‡Ü˜!®ñ­MJÉ0`³l+‰ÉùÑÖÍ=ªµÒ·7¦4³.Ú½C…úøÏO½}ÉŠ,¥yw!ÔÐÅö>+Çlˋስ1ý$[gD*p`+ŽÛnj7²gŽfãBºwAXFogc¬ÖHîéÜýÍê³:ÁR*DP1º¾ÝËÕa YI~lIÕôWS¦ ®ÛÎ=¨ËÀžåŸ÷©H¢î²"?%ù¶Ó|1ëÔÚýNûí|°]ÆzÌqu/$=ס¤S¤I¿ƒƒ k}¥'ŽpáºI¤¶Šž¢ê×K3]¶š>Œ4É~È|X2R»…€-Î%CA¾E0Ö:"ªÇú4@<­˜KVI3Û ÷†“Õ¨%¨À‰ØÙ٘ȇ°»BlÄdWˆgà ½a/C4ð¯Ô)ÊaûéŽ÷‡‰ a_Q‚!9 Áq+PÑY§X£ Û”ïñßWÛ X– À¸Åî3Â4‘áL+’K@{MÀ>RªR^=ùí,RÀ…ô¡ÌyÏàa«i¶©Ñ˜©ä5ð¨Î®0Wùl1ZÒðè1½ý{c{›×.†V…8dÔ:ö¹†¼ˆðW•KBeˆVì…w¾4{G¥QÛRÐw»”'ŒÄqý†È85HñnZã=#§Þ´FJBÉ`‡ázÅ~cÝë`/x9N`°n³M"¶é‘¿âK #sÀC@S‚IM0‰ØƒÀi¸¬SaÄQ’ZT±0 ä0²¶ßz/"ßwÁ±¾ÉѰ¤Ý$Úaé£;ŒbÞ ÷’ï2.…ìfæÇ/Òr7ˆàtMªýÏ#ÎÅÕ˜îuoítkÞõ]Zíš 7]Àµ{O»çkͨƒcz'ä—K ¶ééKOßÕIoߪ³—›š—]}½7®‘Ê<ÿ2æ•_Í+‰li‚W][ùWú\uNIŠ`YþZWÔ\¿Û›ñà1eB"ä(.­¿ŒábÄ ¹¥'꙾[øÚÈû÷‘º¥ïÑ@3‰^ߎƋ…Ÿ5ÿRiRÄ®ðÔÛåU¾’ê5c¶: ÛÊÂU5‹þgIRÀâl±pÀ,ïõ^‹L’e ÙQÆ„'éU¡Ù»¸³ZHݘC òÑÅÂ5Á¨¶ƒÏw%7â¡þ-H2ËæäZêëú¯¯ŸrKá j«UOñ")3#ŒU¨“9Ð3‘|cüiVZµ¯ÐÒ•:¡‡ 1[ܼÀQGé4;ù:×ÈÝøÆÌ½šà ƒ#I$Wç㎪WÞfJi±,û¬D;9ÁAI›±=uMîØûfû˜ÛÝ$Oåòæ°¬¶ŸKî]ÔÊB›fÉK>r=JN—«=Æ#¤M.¾µZL°iC7B8_-©È‰š§‰Êø î<,îÎÃlPÙIœw‡Fr\çv#eií“ ⊕8T…ü*óžÐE¡Vr+"p¸è7”ÄHl¯Ô,°¾%î)y“Ö;d¿Rá«Ù×Ê®–ã#w‡è¶níæXºP¶@ƒMôÚ°Iiˆˆ_JRkW8oùºÐÛ2)(aÖöX®[ŠÀ ‹»AdŸÂ2.8Mi’œÙûr·,Ó³T¶ûÁ.dEmó)·s9Æ€ÈV1Ôúú:kÃVe_ãÙå¤K#ï¸þ­Ë÷»©÷@žmÓ5ór;¼¤©… çž)ðà˜8z ¬¼2Ô¥±;¿¢éÑÔ£»¬Ï'Î0AÞh,߉®¼yl„ëÖ¸Î!ÚµŠÝ„²'Ø¡¼˜ÆÓN–þ„»ÊïÝ^œá hÙÕ¢®x·ÒØfTFedäÞ$r–ˆ~*¢wóíõ©¸LB£Þ ̵›c Q |Lµ›¦gBÌ( lÎ%»"›‚tP»Ëb‡Ô,?áRÅ3ÞÚkµcÃoÄ„˜°e׿-Œ/nI=&xã0l›>âJŽPêæÃ[žé»¤ø¬ÿ8üBƒSlxÐöúòœ·¸ÿ6aËæ²K6Ñ3Ÿ'} MÎÖJE¢²uv‚ãÆ·ÆúZÎâ‰é̱ŸåE&©¼•…ɾ~ãÓ¾•Inv»¼¦QoU’Íï!@ÂeïÔRÑOC”¾£N5·‰Š­I8» =fîÎ6ό̯Y¼yÎhK¹«be^+1Ȱød9¡€ç/Ê·”„ó*¼·Š¼ÇõhÔ~œÏq‰ ‘gæI !­(» މEX1Bß`ÃkeqòµŒÇØž‘C¯©¼Í+‘Ï£‚‹f*ø”á@I)ç4oäâ#¸Tì2pY½qQ[Dã°Ø¼t¡qÆCîµ,tƸM¦þÞdr„íp(;нœÇÙŸùÊÆ9~í’/ö!ÖúiÙùEB8TçºùÇâ\B% ƒ1¬‘”,_¢Ì}âÔ\v±yp£LI°F±cW±àGÒSj™­ƒ=›žP?oX~.ÐìƒÇ¥9ôP \Oxð4«0ŽÚ.¯t¨åùªàÔc±;Üa ‹DðU]AÇØ ±ºö—LÞÀmÆ£=ªÏ¾°Ü÷ðPÏ(¤ÞÉsO·|V)ÊtåeµÞC*½1vèâLUXb¥Eµ/L—×ÿÎ8-2.ÏX¤4>ä¯{qµ}Œ;v†!²?­šdöáÁæD<´ÇÛ¢ûRÜöX!8(äAd8à5}1ûI‘©2ÞTèŒÆcTé¸Aèt„sÓÙ·øeËG=ωX1Õ:¬Q¢žÛ½¬‘Ø=×EÂJ&AVæ„;±iî`ýÈÛ­y”YšWY’Ç6wfþAÛiÓz§^É c:öÁ†š9Téî~î«"¼4ƒF“¹q“H*P¥­ G„(Z˜ifä¸ÚõÅ(IÚú‚2÷%—ªEd†¨þ3Ž=ú:Ñ QfáÆ+ÃÙN¾7csxÃñÊ ÜÏÓùK¢Zsi§ `·MSƒ“dŠ9peÂD [)¤rQºÔܺAŒŒ%h¤T²•&@È48‰3ì¡óImö¡Æ»®xëmÞ»Ãa¼ª}€yXTºm¢ž¹ Ú+²*nÖ§Ðd–L3ëF3ËÙ(o†ô?ö5÷ÃkØj¬~L:;¯ÎéÉvþ \EÙv<%3Bø){ß‚~Ä™IéûG¤ª\æ>ÛU»V}\:,½£yµõPÞÜV[|‹sš©¡`àÜ.8W¬f[÷ K˜_eŠlÀÛmå=«2ã,!~þ,¸mX¬>ënâÛ vx–•N=mh¿$ˆèßäDJÄ_®–¤v™£Jõ6S×õ~¹¢á ÚU™>_’?p †z›úqE¨…ÞÈ'UÒI îE§¢ÁÕ³úfµðÈJÝ`nHÜf˜q%cŠì|åýE×Óô¬Yg2(¥rë®­“mH€÷¢ÂmµSRï–ÛHÏÑpÎ0€v«æ…ÃÏΠŸE\ïcx±¾?<2Xr»¬*bÃûWX÷ÜvCÔa…ioû]y7¬Á:µ°¤"—º‚^׿õóÆº§´kÎvæz‚)6¨9»m¡*PPÅ4¥Fê*ò–9Ãäâ[\e7Œ•©TÛÇ´HGä ZÙ{@ñÁc±3}®ÖÁùœ‰·ä KÉå*(Yé'B¢T Tÿó^: f-l"¯»¸#é`ÜÄRËuGa Ÿ¾§ÏµQà :{˘’ô5¶9uþÀm,ö‚N?¼çÁÒ­+èr"oúU'Éå! -UŒ17=ÎÜa™޼|”ç¾ÚEÙÝ€ÑI×#áÜ»™¯—'¶”ˇ ? kK„‹qÑX8½iÇúúå í2­‹u ö*!ƒ<yûL†‡oØW™ú~Î+€„ªÏ/.°S-¾Û ti×x0 +?xÞ¬OÌV‰ ìtFãe w¹@ /‡»m—):½oŽ´–ŸkhçI¤Hbé‚„M9Uj·¢èçxîÚ^Åfæ~*9rQ‰Ð`nîáioh5ìj˜凉T’jÒ'Hw`±ÖʶEçàv£bùˆ˜Ã™ßºJóTxöI2ºÈ×Þr1ó#¼i‚eìGTâO˜E÷Ÿ»;1cq;`ýÁ.±ÊxD9¥¿kbúé°ñç™áôb½s}¤CØ£IùI1•ôÌóÃÙžë§„†Ó‰çÖñÎäOEiÙ÷­;4 èDé.ÎB[îaQÕœòo¼¡qj)I´s–ˆ½$CØ©ÝÈÝMP›n4â —M„aC¬Åvuî$ˆªg–…m¹62æé=u¨±SIìÞÛ“à€žH¥®wö-79ÿ ܲ+æ£Äú»P+´íD³gø<ôîÕUÏ¢±  µê–+§F»¯ö^n!‡ÖæÏÖ46ùû¢ éÄ̬¡Ñ`©<  ù«ê¬”s<¹-TH-é/Åó¼çð=zÔ†.í/Þ®ob ˜ôéŽð·ã´¢ä2z]µ\f2¢_דéhÝ1a Cjztïãá~È ½;yDz€WÎÜG˜Ï£÷†zp'Lß³ÚÏ­ÈSGô\T» /ÅÂÚ5‡yÌÕë)O=/ªmÐʱðJUj*hFÄèXŒçX"âXé(¡Ï^(ž*Evvì*r©oʃ›ê t†ÆŒ]v‘·o¦\¸VY{7z/âé-ê~ÞX¬’G¦§C }‚¨¢P•_qï`ñt ÃðTí%†ˆ)åþží<À…)zÔ×£dBœSAN—p—)ãô––Žùø×ï8œ¹iØœkËÏdÞ´©y[ƒêâP‡,c ïÍ# `ØP`Fu‘@è•?Â0{±='¦iasyzh~ijº‡ l™Ê]ó-:õ†ù•jÊ»•.÷Ã¥—4œÍ4^?BC=L>§ß2 ãÚpYó ±OŒJK/Ú?;5šzhΨŽRÄ«Åt;‰,Ô˜™…Y.­N¯Ö¦+‹þtüó¹'%d£í‚­>tpÒ»¨ì™…/–a¸ÇÖYޤì]Iš9ïÕ,Z¤—J ž©)|Í›<œ&¸8òîmì/_ï¾!®(ãì4ws¦žò5ë½ý÷|íëfš›K,Z'‘úËâɳ Œá^XHYÅ&ÝàþÜñ(¿Ñ¿óKg‡„³Ž $^œ­ÃßRCFæ¯V*ÙjDxÍ<Á[OÉ Öä< ÏÄo2øÄʧ먒PÛÑ.7ù§õO’˜ 6tËÖ?¤˜f¼Nr¤”–šmP¤lq¹2ÅI;}¡×À‰³ÍOߦæ\8Øv%è±z’ô¨³ ié 6¤dêïóAS¶}lW’as}n(Æ9ìPúØ=ˆöü}'ÆV¤âGÃÛ^ûØH5ÍÒB{£"Mci"sŽ5OÒr\ž½u95ø9ÏÓ BOcΟÈH‹eFUEN®,ÉÔÝ îᨉXÃî‘6MÐróM#Žz“%ˆ-"ìªNç]ßV¥Cô^7;’`Ç‘³§OÊ´9k޽¡FœE?š9¥B•žM;5ž0Zõ»÷»“}·ê 1«€am°iëHÚó›HU¼°'f” E÷"ýyÞ„Fñؽáþ¸PB…î5"``w‹STuÄ´J¦ñ~IVï œA30nm,ô !'Æö…:emyPßÔŽœñD4z<ã£~»´/T>kkt!å•![~xjäprµ\íj\æSe– *¶állve¼§Z¨>Só¾ý%1þ8õKo’ŽðvÔœ*æN“©’¹°RK‰½¬øvK£¹%¥KŠÉò݈€os6ß;’}ØëÌ|2fH OM<ù\üMÎ[XÉòcPž0¿Ï¯)ª˜&I?­!Íåk˜{·16µ0Ù¸Ê 7Xl=Ù6ŸShV|,mµò±DŒuÿ;ÞÇ2‰!ë½»Pq÷ùÄr)]úŒN€¬—¶Ûš½‚ü»z Ÿ 퇯OMz oqe,²“$wõº-á?Þ¸P4}¿ájûs7»ãT»QtšÇ.ݽ‘ôŽ[’®õž9“c¶Éˆ:<ó:>µ×½èò"ÖlÉ­·3“a¶Ö¯TG†ÍÔ÷µ[ö“íV峌7Ífµ¡øígy¾Þm€ÙvRó=IÃq‘äyþͳ )•g½Ûk-°óž¡w° òölSE~#ø˜™Ö½©;Ç™"Ó[D½èªSÛ{ ⣴ê—ëùz¸“f\>:Òåsû¶Á@ Õv™êQ‘Õ®Ä ^!L›Á…Ñ­þ6ç ¯ZÿvÏ`³Iš4ì]C5¾x@õr[µ³…•QzY!364(¡KYÏ5)‚ÞЭ’â$-Ì(Éë[\÷Ç Ì’ˆ#Ï—‘|„ “Ããáõ™d\h¼¢hª•1˜¶S¦Dùòè[+mq\u˧²QµŽr˜`'boa‹˜`'`=_j²xcŠÎ xºèQ=Y`/ˆ ²þ¦-Ó< 3-ÀÄe §ß,6ÇDM9„D%“aâç( £êc—=à+”™>ß2°¨f=<«? ×Le2fdE5 ï&ˆ`4³ê_ý¥ƒ/tî˜)ÇJÖ|0\ìzþwWܲ— …X&w>|‚ƒЩXð˜CWt¬ƒ±>ºEZÜ Uml¶U›ïÆÄº¹5r{7·t# 7 X«ÈaLß,X½¶yx¤óAøZÆû‡R@Y!eÒ…Í7ËÒ1¢¦g(™PäçyANÓó;÷´è_¥÷ŸiÄžÅ2Œ”Zó+â‰:Úµ“{¬è¯%bÞs¢ñÏ„ÒS z³z'¯&½Â†D¾®O$.c&ú%èsT¡Ï„x¦F÷½’½‘ô ¹ßÖz´tF™¨tqæ9&ú’ª¢ºBþtè-üÓ7ñ¿,ÿ›ñE…ÅD0ñ_1ñ…~Åÿýå[üÿ&Á…’#Lõc(¸|¹ïÇxÿSDˆ_XDl'þ›˜¨ð¯øo?£HPÐ8¦k¨©È¢¢«v’ESOþ¤ê1V^>>¡c|| º ïCøXt]Íánv˜|RæŽ||Šê˜D ;É9¤maæV2ÒN0wsLú^˜‹‡çÖcÎpw4åðbrê°b2 a®Ž°ºÃ¼Ýw¨NÊÒÖÜÕ æ~ÄÎÍ™W\\D‚WÓÝÎÝ&óUžI–?$J–cšeÑÞ b Çd{ßžXÚÑîðu—iJ,ÝÜXY\aŽGXwrª¸ÙÂ`î¬;É\? Sa'õÈμ>$"9ÀËËò9ÍŠ…‹Â{pr˜ðò¢ëXÙy~L!㲓1…õ‹¤2î|5$LhÕYUÔÐ_ß'cÑ4·ÙÉAÄâÏòýÖ¶vèѸZÚú|±³ïa¨||ôC€ÌápgLš/«ß¤Hü!˜ªnÚc0ôW›{Àwr•¹ývj0' ôöû!06ŽÎ掿Ç_ ×ÿ#m&]¤Õgĸ½OêƒÆ4†üdþa¢kïP†ÝÍm$?ŽáA°b¨êë&vp[˜«ûï´Ò¶rÝ©¯éêìigscqsv‚±|ZÖä?z¿ÙÁmXÜma,Ÿ"|²¸Ávª°8[ï/÷1gGGs4bßïÿœºøÑ+nõ§Ôe‰îõÏI ¶ƒº?ó™®¾žÌw)ë/ÀþEV¬¤¿™‰ Ÿ•ØŸ©ã¼NïeÚè;¹ŒÑ,ÜÜÑ‘åã“Yµ“TîKб„9:æV˜ä⟮ÝsË×ÌõÛ¬›n¡× S¾3i ô=[AM G;K–÷"–Eé£ÄA <Áßñ)½Ÿª;Ìé$̸³z½>f‹ÛInÇÊâùá³¶_èQh6h댖uï)ÓüC*¹¯ÅäûøŽh•”üŽÔÝÁ0 ¹è9”u,Ñzn\nï¿pîHZâ÷ZÁÇ ßLLûëIX8»»;;±þIrųÁb&ý‡Uvtœßó¨ø .Ðú‚å&dþ`N˜ ïg„fp7wWKt_–øDZÀßÄqàŸ"Yà’?àôCzÆÿj¾IUù;¸ýÇP©ûÂä‡Udù‡S‰²pý÷ð‚fx€«³%ÌÍÍÌÝÙŠ?™àïÀþ˜¦ü÷fùEs.×O©«ÿsDkb m´Ê v”ü÷Úºªº¾¢º®†¶¡™®Æ Eu39u…“ŠÚ”é/*j+h›)(êÊ©žüÝšh᳉€Y©Ýú A}ÈnжšväÝû­ýÙžØi‚– ;7Ð&6š8-]íŒ,Ù%Äÿ¼eóÞp±}/ƾ‘_hûÞÒà ÈüóþA þMõE}äI‚ŸxÒïÇ{ÂxobFÿ^¼¹.æò/ø;2~'Õ.ææË4£íìÅúþ6æÁ{Øß×¾Lêú¡áÀ?^~ÑÅ'òÌÿbßÑÈ¿^w–/Ɖ¡×?÷WæøbÛý£SýO˜ÆŒ C²_ÏåÃ(eX¤aN2®˜3ôß¿·*ïÀùÖæ»™‘‰¿Ã'ŠúÄJ¾Ü·\æ3í~¢U‘ßê¾_Óî—[âcg$½;Ïw¸Çÿ8gÝéEmg¸ÎvhóÃÎí¯´V„[}Õ ½øîÚ*h¢­ª¬¢kvLOû¤áÇá}à—?2‹šý~[SANWîgîs·u¶ú‘ýig库 3|K´e³‚ì0=+G´%â„Æ+Ú†²B,0M×h[ÊMRšÏsB‡yôž2~×úD‚¿¡Š8~/o¿Þº…ì×w¿Ø6_ cMÌê£Å Z `¦îú‘‹{ÙÚYÚ²|8-sûFna¦üuZôOdÍgåø»ó׆¹{¸Â¿™ü£.Ì‹ÍYÐ}`I+ t °÷gfN€# #íܾ§³ý€Ð\è·¶Éž ùÞ~EKa]ô"X})uwD»»-ù;‡©^æn,6ŸÎà­]vÎÚÙÑÑÙ #þw¡%¥=wÎÿ¿ÇhÿÉÈ?éJ­dŠ}¯+Kø~/è ïw&öO§‡ù•þÿÏòuþg±Mþgaþ_¿ÿÿŒòõïÿVÿü‹ üÂÿÏ(_ïñ þE…áÿ§”¯÷?ìß‚1Á_øÿåëý/ñoÁ¿¨ð/üÿ”òõþ·þ·à_Là×ûŸ?¥|…1þ þE…~íÿŸR¾Æ¿À¿ÿ¿öÿO)_ã_ð߃á_øÿåkü ý{ð/ò ÿ?£|áþEáÿg”¯ð/dþoÁ¿¿Ø/üÿŒòõþù·à_TèþJùzÿ[ü[ð/&ðë÷ŸŸR¾Åÿo~ÙǸð¹:;*عYºÂÜaǃà?öÿûìÿ)"„Å/(ˆþöËÿóg”ÿþŸßå/Ð_ ÿÐ?%ÍñýÈ{~h·Sÿ}ǘ7z>¾ô ·aù4,Ë÷5Ýþg|;EѲäËW«>ôfffõ¡ÿ?|¹êcM«Oòæïúw~³†ßõÁã³2úSÙ÷|<ø¬,ø~ Ößðòü«à×WNýï'ý=W9!AaQA~q1aáï:äýÙ‹Û¿ß°àŽ/ž0¿ø¿ÖÅó/?ÿعy ñYY ~ýÿ£ç_‚þ‹²þ#/Oz#ÿÎËþß,ø/?Ï¿æçùíΔü®lýÖ×ó]nxXtÌU;4…鲸Z¹~¸<æîꨃQœ>BÔeqÃ\~ñX -¸tYœÐÿÿ¹þ¨éöÇÑo*ý Ÿ¶bÿpeý þÿú™|¹ÛÞ?°úç<Áå0˜åýz{¸Â0N:hã»éeçn»ãšñdù!ïÐ7:抮®Î®ºÿMü±ÊèÀÜwxÙ{ôXb˜Ì·ll^ÆÃòÍó–*ì°À ]*šªŸ¼fYÜvú{?ôx98¿Æ’Ðÿq, ³Ê(…¥?ÆÏ3ʿŌðÿ f<í¬þ›XAóo'àOÕkô?‰ß=éló;úîÀ¼Y¡Ás~Ørÿ˜ÈAÃÜavŽ/XìàhkÑiÇØúw"ßÇÝïéÜ®ÎîhÍRåÜÝ]í,<Üa?Iáþ¾Âíd†6»>¨$À'Õú½Bòi7iÃ,?ézÿEšÃLsg¼ïOõþŠÀˆÅ/ˆ€…÷óѺ'´…ös”Màï+›Nf;î#þ‰_«ìÿM4 `Ðèö‘ŸÿSˆÜøÑúãöþÇ[üèaíÏWñºø¤zþ6XÅ_VCÿïŰÀØß=%ü¼~?=èÄï¡ç£Eü&>Ä‹}ÁóÍè¿ Óðƒ+øc“ùþÌþäñÇq~Clošó ý÷oÏïϦòc12¾R þ7Êøacq§¶.ÆéÿCœˆO±0¿¹~¸÷÷£Å4þMÄIIMgsÜD˜Ëü›£L|Þ|ß„šû -®>…™ø¼Þ_Å“øëý~Ø ßéòKìþÁ+а`߆©Ð†Ù} Tñ1Äw(á~‰øM¸Šÿ4\ʼnV‘¿-Z1fÄG©*ò»çÑhKæ·VÌÿ=)бB¿/Ew,®/`þ·£6ý}{ôˆ×dµc1ÿÌ€Mï)ïµ4ú¾ÍNüoeÿŸpýÇ|x'ʆÄþ˜ÿ…ˆ??ÄBÅþY*ü·YèÇ#½lTøkãä¯ïýßc­^¿Ï^?.ãOg±¿‡¥¿¥¼cPûo·O¾¥¹¿5Ñ'¿ì”L2üÙYüûx|0š.ܜߛ-ŸÏs>2àO¾ èÀ,í¬í,ß :»²`^.…¹~EzÌðùÀ-bà˜óxsG˜ ‡5‹9š¥™ïØBæ˜`g0+έòió}#¤>†*swf±€}4þþ3³ä3ùÿ@_ÿ„Q‚¡×,–;Óü;aô~H¨Šü³BUèo Uo„ªÐ'¡úÿ²ùÿ«€Õùo Ø?ÆØÿE1ûúû%lÿÝÂVç—°ý'…­ÌýçHZtGÿ»Ä¬ðß³?9Zí?íRñ'ÝYðY‰üIw¿Yû›žþg£Öò‹ýŠZûŸ–¯ý¿Eÿ-þ¿¿â¿þ¤òµÿï5ÿ¯°¨ ˆ€èûü¿¿âÿü”ò-þ¿ÿbÿßëã»þß‚蛟ü¿EÐû__LTð—ÿ÷Ï(ÿ;ý¿?¹å¼oê—ã÷/Çïÿºã÷Óäx|lý]WoK9WWsŒï5Ë7o¯°`<¤ÿØíûãË ÿCîÞbh3Kä cácwh’¸~*×»ûãzý™×­…È‹´¿àÏ ÛÉ+ú'@þ†#÷Ãý]Xs>+‰‰‰ß“Æ÷<_%v_Ex„$ÿµ.Õ?„U ´®ò;)h>/Ü9Q ìÄ;û„¿å=ýc`‚hb€ývb*Îî:^æÀws× ˆaRäŠóó óЉò×sú/‘8¦€úÃ/.þ]¸èñ [ÿvü ΟÝx}‹ ó óóˆ ò‰~·Qô?ßö¢‹–ÝòÖh¦ûý…âGoa?Ï$,Ž^§ßáŠp´†á£iînû½nDDEyÐX@DÑË&ôߨpßzš £ñó;IÌ?çÿ¯.æÿÚ¤¤j‹íxr+¡5˜o¼@­\1Ú¶îŽJËÃâVØmàh“îáô9¬azÆœ’L'öù^KgWÌnØ‹9ººÛÿÇÞµ€GQdë—U×e}àBoð‰!3Ýó“ʇÈM‚(|8;ÎÌÈÌô0ÓCDø|]¯/¸ê·êEW]ŸÜ»®(W¯ JÀˆë.ú©«€‚Šr«ªÓÝóÈÐéééÄ®H˜î©®ªÿœSÕUÿ9`)öƒâ\‹”t‚É“_nÿ@€—–j_Å¥KQ]Ÿ61*øPB…€ øðà@4”Z@f&.Ó' ð˵rÖ¥¤ï)“x·Ÿb`‘ "&‰ÙÔ´`Ì,幘Uµ¢TäLÁL ÁôDX fi ŠBá Ï÷I;  Î¢ÓI8å13çõ7ßµÕA*gƒ$Rõ$-@*éj€ÒÄú:YÀ†Æ*É‚üüyø¹.*% n‘~ÂÍAæTQYø ¥=V.ØH+‰S1 I‚Å&ÿY[¿kK…„Ý&KØÙ3}ÐPNæmRë$\(d mH–’-UØZù‘œ&"Áù‰¤Ë-IYà=Æòd¶RÆ%‡ý‚ÊÔ 4%ö’JA.T:Š„`Bñ¡Ç@F “%Z”8úEº£QÒ'^#ÚÕ\#:Ž_g¼ö9²i_ =O=€A¯@+Ö¼8I öQd˜a˜©g,çðIŒ’Û[|<1£«,£œã¦Yeú‹i}âT|‹ã%iŒòB|€ZRs¤4Æëb ^R"Ê¡Ä ôµ0OÕµÌÄÚCn¿ZåŠ# ÷[›ÛÏÃD‡žæ¸‡^™þb¡õmìð')àg[Z=I±ñ‰Ü3p“TÐb½!ÎÐß è›°­yXÝ(:ªg¢†ª™Œm’fªƒŒ‰KÙ+A€%oLuYP9ÐÅdKò¤mQøu‘“±mÒÐÚñAŠß;Á-t¿³ð‚ž Zž'9í rÏQM«¬ITâ׆[Ó‚‰n¬FçÅÑŠæ=QÌÊ|L{à_U¡“±¥ƒ"X5úxÜRvsnì]Å̆Þ)`3òsøT)ž ·Ë_­Ö¸£nO0¤ƒdœ‡Îž:á­ÅÏž\k Û”ïE§Wð,µ•±¥Ã®èÒ›²ÇÃNŒšÖÁ¯HU@–› ,!cˆû-ic‰”} nndo,Ì{ì\² ùVKÕÌ,!c׆û­•\y£]¤,¥ÙÚ0i^˜ž°VWºL26Ú€B°¨ˆ#,¥‚•!tbae öXÒ‘Xå7_Z~$+“`q!‘U–)\lI¨ ’"•f°¢ƒ'³$2 Uø…(âȼ’bz¢²ˆÈØaäF¾1â Iš=ÆB ‘®©ƒFLpcf9á:£²¤È#˜AÛÞL…‚Þ®Ñ"Ä KžY!……¡˜I[;häÅžA\˜n0]Ê‹¼lÛÆdFêÍŸßEÚ)¡'»àã6¸wIþJIQ”Ba°a ]šÆ’Ô g5òÓl2N;£Pe…@%¶e»«$äbÂ<{î½_ÔA]ÆkKØE"ÿ)W4é¡%rF~àîiÁŸ€ø :®¤ 0Õb°ZéÉ“Jb ã$ì Æ]í¼‹ZÔ$–€BMò°+\Ó”Ä(—œê"%¥b`Ôi•@’Ák»(Þá7j#Thg{ØÔ>%aRÙ¿7*Ã%슣ˆ ® !Ê;°Ì!,Ö¹ Õ»$l"Ze¡f)…ô›‡Q©cÆn‰c“1ʧB$]¥|23Im25Ú«-®Ì’ € ö`¶|§‰c.cµÂÔfL}™½_˜¹¼¿`!C‡TžPE'ÛÈ`‚ê Lä=5h>ã=fK±‰‹{ J¸ƒuŸòÆ‚i@n5Ù§Šïrj4kfJçb­f§ä”䌔7Àž0é#Áã¤9¡ò2HÆ^`ãâ‚̑ـËÈ™±Íœ«ò4 ‹˜Ë—öõgeߘñQݾ¥}L»Ï¡ª‘̳ð4kÅ’gÈ}KµcœdaŒóZ"FjÈŒÉØm”„ýåÌ™UlÍ$!€‡žƒIs Âسäø+`ÊО»¾Ú’Z¬4ªše­LFc¤—ϧ“¬q0 /¡¯&÷I9ó*)Pwvntc­Âó ökÑòãi(ð¶âC?Ô|]L6#·à"šÝqáÁͼá¢ü0ïx¶÷ 9ÆKÆy´$ýÄy»¿”œCÏ‚)~’”Á²ã®ºEÁš£%Û.( H¼K±Ìæ$Ç¡ÙWfïN?—¹6fà&åÞ?nG@vçúëGnv[äÙ4(̶Œ¼ºšµá¼Kl8ê Yb—xoH©í§Ô¬Œ]JìA¥9ºdRÿ ô¤QÆ¢™s)äÏ¥ì‡Ô´’eû‰LPá|iÔûOU °ç$+&¯0¹-¡³•$#“GÅÓÙJ™íÁ PütÙÍ5»h9^Â’ ‘´¶(K2¼õ$a8øõ„Yò*›6&ÇÐ3wY¶à$#¥ºÝKÅA ÃÅ ©¯Tã•=PŒv͘Q‰)K×Ö˜A.z0"ê¯Üíµ@¬² WHäÉdÓH°wó“2¹X{Œ £G·S¡Õ©êpŒ`ÚÐP0Ûœo3øÌC„ìp¹âÁ°+é†fL°ùK*á-ð~ÊøÓg¯ÝbF¤«Ýfª\bè¨ùÈÁ_ì3¤Ês»˜qº+M6¯C;8SÀåxØ UÖó#Fnø[a„ÃÍå&G¹Ù„F܈†X*Œ7U˜§‹i>L€¦£åCGGGœÀ—Q1¿ÉSÏ´¾Ø û±xÌË÷™½1ñƒ9 DW”°Ÿ”pNá ÏÍ»@ÅÐJ /3—™<0½1…Âá¡|]ð'|feq‘^ ]€z"0ТÙf3äãõd³XàOÜf1¢ÿãf3úÉ–"7™-f«Íf²qÂjÆ‹0K>#-‰8í//E~ŠjïÊz°åj4HÝ"Æß®ü 5Š“O+øÛpUŠR;ø›tüÕ(bûïÐ þV³Ž¿*E¬ÿíZÁ߆›uüÕ("üíF­ào5éú¯Jãk]ÿU)bü íàoÑñW£ˆñ7i«Ž¿EŒ¿Y;øÛtüÕ(bü-ÅßJ˜Ý7!ü ]ÿU)Rüј·-#ݾ&Ê;f'D'DxØÊà ë6ˆ¿Õb2š-ÀðûlDfT¬—YÊÏçïjgÔ´]Õ<kh›Ö„5ϼ´©±+™l0Ì2Õ µmµÌs™ÇÚbîH<rÝ!ƒaêtxjˆNòœ .•Î0I»1xÖ8™œŸ.¨(©¡"4¡'Cž|  þWQB“4’º)Þ€;'éŠ`œšl·[“qX'¤Cd¥èP³“%Æ„6k!ÛÉAÇÔè[ðœ82O|zËždzãqÈk U” c×x€$éD§f›o@§“¨7ìY%$Ñ$Ob=]X-S{̉"¹ú‚ ¸£ãùèPUHOc?5Ià›9 üÊœ×6»ýLnEXöo‚ 51o ‹­ SGw)§ŠÜ‘Eó¡ D5ãtNu #zöûuà÷ãý:m.žÚ&]<§jü!Ê㥶ãxꈂñçjh!!SÕ—&Î夡Ðã•ýŠ#¸GLÀbŸ,ù"âNA¢D|8Q8@óºC!È€`˜ÿ|&{DüOD˜›YPA¶t,yæ?1'p#ËÊÊ`¾ " O F¼¡„ÄÎÑS²pL‰hÔê6ó1á8ßêaÉè15T(äöP1†úá ºý1wñ$cPî„Ìfòë*ShƒÏL¤—\./x‚˪ž‚€T vØãg6ÂlÈðå0L!‚è âæ¢J!¡mW±ÜÉ2ìú¯²óÀµ nOé 3X<à†vzx@K ú° ˆR{)n-ÛJd À# Šìˆµ»ÊrKˆ’Ê9J0¥ùIšåy‰ÔöÊ"ýâtžùÄo®Ó«JöÙ)é€ÂgK Åd†]ÈiÔ~èwdã® ýIK}ÊBçãC–¦bš.mQ z1I(K•2ew” }yŠ%z n`œf¡Ú³©ö”„šmõ7vMrIc•4•QÞ…•%‚Qÿ0 (²jÀj"'*d49æã=ÏØ[µò/f ’š"‹3ÈGJWµEtCÚ6…SšÕ’bä˜ /¦ÇÇUlâåé*Ãỷò˜óÄœ¢½ÜbÖˆƒ½ˆÞÿÍn­ìÿÙp£¾ÿ£FãïÑþ:ÿS•"Þÿ³jÿ«Rë¿W+øëüO•ŠXÿ5Äÿ×ñW¥ˆñ×ÿ_ç©RÄö_CüUŠ ñÿuþŸ*Elÿ5Äÿ×ñW¥ˆõ_Cüÿ©J‘âŸtq‡ÛÐ.W‚†’NîòžÎÂÿ±áFœçÿ˜Á‹¿‘·[uþeðð¸ð H.¡XÂø dzè$ TPn2 n„§‚ð&ŒåÜı8&±Š’1¦9$“§3 ‚;~ärvÂCDt(èAX’¿©yd$Î|˜=F·…H†[9695$w ö¶ “É(ò‡‚ž²€€„šæÆ8ÎéV*à"c1*ÖÿÍóTVR‰ÞvÒÏvÆ$AfØNÌ#Ð ÚÍËåA9Ü3¶Ýäa“À+ÓÂàs;í6:HwelsYÁA …ƒ¢üŸ‚aåÓ?–Í,Ç<ÔGFI ÙoCãBŠ•VW³2Ïp´#žqEärÁNfæ¥} €o–\–ùkiIef°r3eä¬Ü2£µ7:JMfc)ŽrTrô²Ô‡XohFIÍö“ÝQj±—ZÌæR{ö‡X >cª$d«Ûâ0•¸±Ôf$J “-kíðÇ—NȳŽN ˜Læ~ÆÈH$ÙÙªµYL¥¸ÅQj'ˆRÜnMeö)C“S„3Xg­LÙªt,'EAÙš@ë±Y$½ qdX¦-`…¢©ò¸Þ._‚^Êë:î'Ë"`ýXÙß=ËžÈí ðU0nâÖˈ~¾V V)âï@^Žà;m~Qˆ€ ~õá¤ëIÐLæ4ˆZ€ŠÂÀ¼n ÒXG0bS«µ'B¥¸›ÕØÖ0cfV=ý*lVuKKõô¶«¦ z®’ H¦ž`8 ‚j;Ü1ð¶@wAè´©-5 àþêK›ۮ€ÀÔ5¶MŸÚÚŠÕÍhÁª±æê–¶Æš™MÕ-à ¤¥yFëÔ2 µId^qz‡…‚Àl¤o `äc˜»´µ–á1q—ʰV’ 3\CE»8R'ƾdLõ`¢hhnLGØÝ±µ!¹&cáx™Â *[¹Eᦗ‚ÑþCCñôý_UŠ Ä0ÿOÝÿW•"Æ_ñXüM:ÿS•"Æ_ñ8üuþŸ*EŒ¿â?pøëü/UŠÿÂÆá¯óT)"ü-òÿÐí¿*EŒ¿†ü?tû¯JÛ øpö_ÿW¥ˆõ_Cþúü¯Jë¿ü?8ý×ùª±þkˆÿ¯ÛUŠXÿ5àÿÃé¿ÿO•"Ö ùèö_•"Ö øpú¯Ÿÿ¨RÄú_Xÿÿgð·éú¯J‘â/¥ß±$ǰo`@€³øf)þ6ÿA÷ÿÈñà6w˜ì ¡¸Ùañ‘V#i2IƒôØí…nŸ^ò[rÕwTþ3úÕ«Mªÿ6³ÿY•âqÇaª_è«+†,eìÜ´Lf ·:JM&Œ0ÙK-õ7TJŽúøå?£ý7¶Tý·ØtýW£ÜÚ<½~LñÙP¡Ç46Ô¶ ë¿?uÂðïî«n?.hnj›úÓ±cgœqÆYgEŸ|òɵk×>üðÃUUUK–,Ù¾}»Ëåš0a¸ñرc¿k¾ìðÛ0ºezkÑ%_~Ü^T4ª®±¶º­óÁo>Ùy¬îœÑû¯ûÍ©ç>š4­ûœgçn<„?c½uÙO¾¸læ¥ÎK&ýвqÛÊÛ–-5úåØuó†l~¨j½õ§Ñ£F]qðÃkþqêU4ÕZöÕ?¸}ÜæáK/|u%úóî ÛwüÔy•»æ_Ò;²¾—œÚK~1ç廾iü‘Ãg7Ï[䳜9Á6vBåæšk}«Wtï>qÌ—O}ñý}‡>žøÃç?²¦oó§¿=òÇù¶†Sþ·{WÑbçÚ×ûºŠîÙyÉuNûûWÇn¯v.ºáÖ±ëðbçók‡užò_¾wz:ú®ß³pßÿ`Mo.±宋*ëÞz ÄþhÅöãþzYÏÑnº±çè£gu:·.zˆXd¿Îk=óˆ­ÿù·QŸ½¶²û×WÿÞ|ç ¿¨zÇyöc–½ÿAÇξüïUÿöÀßövý÷ËÝ£V]WÞþøN¯mÊÓßý(P3ûHß9=+¼Ôøní¦'.ÛüÅš’¾~¿ãŒëÎz¹³êØ;/ˆ•ã&?Y?þêúëxëƒ];óÿ°­{æZz–‰ñÖ3'8¨9›ÞzµèFÇì—}õØûov¾zûŸ¶u~r°¦›04¾wá·ã–ÜùÓ øø}žžÆSï­»klÓ¥¾Å_c#v8ʇ:g—ž7õ± ›F¼ïñ®¹ª³Å|[õÑ“Þ]A¹âŽ®Ó¿ë~—yô’ƒ÷îh|/°û¨õUc~œzåÞûع¬¾÷Ȧ¿Œ»yÓÒwtNx4ðø!§ÁõÝs½;/Ÿpйhwç_^>þùõKßóÈè{o8üâ£cWÝ´ïÏß3"0gø¶ª§Ë;©oØ–âžF^¶w÷s-Ï–æúê_¯o»`Ïwû×<1¿ížû¯.ûésÿªí[;6¾¥ÔúÛµûžùà™+îžu¼yÿ®…«×üsô+çNóͼþ£¾Ë×þÐ>î»ÝÏÒ¯þûúÞën¼àêÑ{ßÿKýœ=…oÞñâÌî?X~r¼>aÇÃà «WÿÃ1lËmëM«ÿ~Ý Ëø»‹×Ÿ~–Ý8rÇ‘WœÏÞwÚÑÍþSç 6ôÞ¼yVç=½ÃØ[nî=Ùõö”O8eÔ/ªæžë]Óú›mmxð–›z¼÷@è`â²öqWþjÅ’ÅŸ4lØ^gÇÝ×ð|ó᎑[/ÞpûêYÿqøæ­wŸÜ9nõòÛö—ø'&­Ûs˰®ÛênY±üÇu{œTYWÀ5}ԢX3»7^ß;öê^ÛΕ÷=1ý“ŠS?ôo[7Üb¼è¥•o»f~öé¶“ú¾9üн_ÿõõ}§ûw´žqâÝžY›;wmøúå‡6¼`ÛÝeë¼6ò锟»ôÜ}kÏSß,øvâÑýî®sÖξýµçz^øxäkQcý¸Û_X¿ó¾U_=mYHÑw–m>4jîû[ç.ß±ä_‡oÙuûio¬ª¨ßÿçg?Û¹´ºª¯fßÝá%Þ»îí\ôyÝŠŠWî\²l±»óèè)ó+¶zûÞú±ˆ:çÿµK{_œå¼xAõ²•n¹òñóÆOxå´Å×÷Ú»·þùŠ)U[×ïœ0cÿÄ:\¶ô¾ûþ¨îM©¸ç—G?¼fyËþ{¶ìûö®Êíý+W E)uµðFTöÙ¬Å-[D1&‰[Ó˜û˜i.E¿tK›v—ûRä*ê EZ®DE"í·H]7¡…«þïûÎ 34CÒpûÏù”™÷}Ïœåyžó|Ÿç¼çœç)^u{`Þèàe÷ZF ½²|«ZŸ4¦ÊEdØ„—•émN&†Î(c<Âën/9–x>Uíi좷ÁJ±jü²/ÏÉŽðô|Ì:¸Wá>õ7Šþï±Wê¯^ÀænzUr;gU.gSxÄÞÍÖ·šW/¿›]5öUûS†Dk…à㥆ÑŠœšJc§¸2Âó.i_]‹=««sµ²goJæSLj]êÓª àÖݺ‰ ©Ÿ§®Ý÷dâ¦Cè‡2®†³¬ñWÔ4Ï©úgíÑi°Rñ:øCþ)zÕKKû„Òë̵õ¥;,G”MΟQ]_ÈÒÜ`¡ûës׫Ñm®a«õš×®šl¯øþÏ? ~Eàc fœ×iMíT4ÓÇâh~µÅ‹¤˜éÓ[Ö«Ny´AqóÃmEžÖßPžÜ~˜Xö›F3>zg¸}QnÌÇ"¥ýy”ÕuÃÎ+#Üºßø Ù\>b§É¨s¹ÿü“—Nµ¸<¹ $Æ€üää„§ÏåÊÅÉàñín׃œÔ?ÞW—¡{³¦žQͪïúâŸ[Ïí£ÞÏ ¼š¢$=}‹\ò’7éŸËݽ3¨¨ =jwðîêk~ŒL×¼ÿ¿²‹Êr<-‹{]ãø>vîúÛ"ƒsu+'¯vÿEG|R¾Ys#€ø>ã[6–K-2­ :àüNŸý§?ŒÖ‰×ÿˆ$ñó­ÿ¯ÿIâçÿ0Zÿ#~ÿ/’ÄÏÿa´þCüþG$‰ŸÿÃèý¿xý‡H?ÿ‡Ñùâ÷ÿ"I|ü7Fö¿ØþIâçÿ0²ÿÅöŸH?ÿ‡‘ý/¶ÿD’øù?Œì±ý'’ÄÏÿadÿ‹í?‘$~þû)>ÿC$‰ÿüÿadÿ‹í?‘$~þ#û_lÿ‰$ñóÙÿbûO$©'ÿ{¸ áO§úYx{z3 ~Š1Xðú? 2›ÿƒâ? þ¯ÿûöé¿ÿA°Pp¸qqˆ¡‰ñ%’ f‡ÅD&ÁÓ˜ÛÁe¨@rÅÿo/2Ý›ùùŸÁùÙõBÇ sOãö÷HœFÙ: =ÀàBîFƒ8‚äYGΩ çT/ðtnFj¸‡fsÎùçñwì>šsz²ú =⟠K"ëõzÐx¸V<' øÈèÔr’n¿ŠêÀÛ'¸‘¾´tAñÐ(=z¾¾£¯…ÔCj ÑBÏÂm ”~ïJ°$ºÐPZ†Z#„Zϰ÷™ø\z€-åœÂT1u%pO2+TZMïGU4W­±/ ÉZ5_*ª›ÔæT??ÈUöÑõƒ#\Hþ…‹ÖÛ·dAÛ3ÐByÏ.§[¬øû#T°¾¤p±T}‘TÍïå‚èÞ—PhSØXÅ)BPè}‚ŸÀ}cÐàĉ`ß eõ‡ …g€bC8°Üý¼‰:+.@Ãá!>WÀ6Ú0É;²Èj H0îyóðñø*@ç".}ª@/*]…#–ÎaôüàÇ&€0Ä46†¦03À¢¿`•sùD‰ÌF&@ƒNfhN„Å4oP¼pDç\š3é~N¡Ä)0 +ž§ö Xá øwŒÅÒlËM®^DÂòÄÊdR)¼4é°ýwÔT! Î[Bs…ׄúLM\*}&÷\ô ‘GÎz ‰Ì Âbf*€ÈP6‰AýîÏ`ÒYD°™:,àß\€àо%Ñ%Á1 ð¦3Y¿!”6°»BηAc§ùq“CGP­R‡’˜ 6!IÇ›tì‘DcZ‚¹ƒp€:B3¡sï8c? ÑÔ ¡¡ °ÉÍ¢“v`?Þ@*$“úÝîÔ~Xö¿kœ–P8ܲ¥bêDfÂJŒÍ"¤^z*0˜Óz<‡ÉÉ+¿AãφëJ ¸>vÀöÎÇÏ$Ô÷Í$´Š©5“³g(cÝ›1èoȘª7i™‚u7‹BëÓú€¼]£ÞeÚAA{à]¸@˜m$°øyœ7hp– k:Î4àíº†عâgF8ë>geÓ©LÐgõéB&'.—ˆLlÚ€Ml t³8¶­Ëšf["]c K&r-¼¡8¨pkÙÓvƒ# òH Ý5»Vúc¢10i60)xX·qˆÀ@>#}Yˆ€XÈàêñÁb"\ äXóŽëžŒûê(Šýœ‹eOµz±5B‡° Y²?“Ð]¬@§9P™è27¹.²ËÅøbÓ“=kÝ˲‹ú8è²ÇDò3 J…ÈÐîa©*ìÛÐvÙÂ'=xcÛq~ÈS8÷’§Š®É7!w@ØL`7ùžr!A\_syöËšö9îô£0H^¸šóÉSz—û^hõh={<|ùTš©ðžõñ˜Ûβ6°nBø9àþõÕ•yýb%Ÿ)¿âÜ86Ú*nlc-ìÒK¼bÖSeu®ñ€é=IÈ?>x‡·2N,J~‰†ŸÃZ«ßþ!œìI!3½¨$('‘çtâÞëcBJÈ °*î1E¢;PiК{ ˜ê ë@ ƒ‚Â$Óü¡T¥»ôLyÖ.’"{‘”K 64ñC9øïö|üàeºkÄ*n6zóÀÕ@êåŒ!Uòr—¯²nQ›Kä߃¦`Ydžð´°X`ÉPèX2„r 8xЩa’аwû™‡ìøÀBF `Å X!ß‹©˜ÏN<ƒîKo×åûÃPÈóŠ¡°—ÅS¤Hàó›ø ý&/ø`Š{Éà—„Ý‚þA·ZXðþÓX$ÜO|È•¯ka¨S~ˆ Ö¿ì%\5Êøjj0¸ =PÊÄã*Q4¿cò¥zߟbåε U®\*Š\Á~ŽI2Ü!Îwߤ§È ¨£œ©±2h¸Ð×ä;œÉ‰Lå‚Ae»,Ý9\õÛU€·?ÛD†ï1hd¢·‡7‘=H¥Ð’Q2ò€È:€9•Í÷@9½¡!þÐ<ÁEfs½=² ùA D $“æ [ÿ¤kðõ€(¢˜TÀÌuü¾Î%éÿ~Ô5 $tø@„»Éï› "¤bRQ…T§Šê‚Ô¯~‘ùÿ^† ^3ì{Y!â'†Úá µNb¨L¨e™¢ÁY°¢ÿÈ¢²^tS$¼/ÛàwLhÊ®$0Ï®=@ð4%,®TH¦ ñƒ7ÁÏgùÁû„M. îN‰>*Cé’h¡•i´>ês°_¿Âó¢sLC/¡¹o§Í HÐŒXpÌ™vïéjþ_H£H}6Fëa¤B»â¾{ïàÄÑ8]«, Mfƺº:Ü-]Tº§.¼“‡Ó é^ëñ9á5öð:pÎ.LQ¼I$È@áÑ€ð„{{×|]v/À[ìÎB¢ÃÙïf3ý†Åàßÿ9ŒÎŸÿ!’ÄÏÿ!=ÿE õP˜ÿz1ÿE‘zò_°:1Aã‰Â¿Y©¿Aá„ïÿÖãÆãð¼D#ô1âýߢHúd}"ÊÐD& ‰úH Þp×7 h„‡HX NC—¾jü÷3(\_ãa€â×ÿH4R<þE“>ÿ­.€4‚¶m‚;Ú¶Éýeës´ž–!€0BC{1ÿƒÆòw˜¾fü÷7(œðñD¢õ‘=ñš„âñ/‚Ô;þ›D£„„d9ÿÍeK?ô8ñß >IH(*ÒŠ‹‹“““MLLðx¼™™ÙÇÙᔕ•7lØ ‚k±l¯ 8@‚.¶<àžÕÁðm³‰ì†Ñ¯kõ5´õ[‹ª?«fR‰S•Ì˪tÜšk¡Ñ>;ŽBS¼’UbyÔhöÜ1.¤…a?8:½s~¼lã­“ÒEfDÍ]ô§u*ôl®ÿýv™som©u˜ž¦Ó¸¡QëÓª4Y<»å0½QÛ)~Ö¶ëï_þ’•4 *¿úûWPmû²KqV,deÍ–9¤ÃñGZ&í6ÙÝêXø§Ã¼ç³[”âÿµØÿc’~ãq…(§Ì6 ÍRÝQNÇ7fuÈù¸ãè²æÕµï\/ÛTÏž¸²–cƒ—lË[H2}5?ÈL¹¼ssgeB%!·êo Í§©"'´êû×¼i~IÑmZÊóܽ/öìozó¤D)ª°0窈HS”ˆ, nõÞc@j2¬ÆÛ…ÕbŒÔo¶¶¶Î—š•<²­mÒŸ Ê9#Xx#y¥ð£»|勜û×gÕé?Þe“2"qéâ:çcV ËOû¥"sGsÚíûõËÜI?^$)¾Ó|P|738寢ºw9W:­•Îi/Åè>¨ÈY}~Uí/rD7û³á,‡%0§.¦éœîcNI±LÉLÊw;:)ºÍ©üQªñÙÓf5æÁ“LÜ×Yhï\}jÁHßMÎëgD9$GÚþ«*½ûùk=å'_ÜYø’Þ´,P6ttãûðØMS*½oŒ>Z±ˆQá%sáXŒœÎcGV¨,nÎé0%ðQí‘ÜCDZéE-ÿÆãµ%#¤}<þ·q,Ë5µô±ÑÄ”‰³’0ï²NŽH¼•#{|©&ËナB;í÷ ¡‰w¬é¦7T¿þpdq¢Aæµ&¢“ã]î3-_qέÒ}åŒSiä–4[ËÀƒ é¡ù·*Ç·o¯L hbÿs kªo[›ª¬uëïBÂÑ×Öïìæ°b L·?´«˜øòióXì¡Îúœ¥Æ!!¥³ÛêFTÏÄ+½hLȸ½¢üW9…¶È‡Å ÷n-^•œ¤¾×º¹ûžÏ ÊK㈎ª9ËÛ^º†÷ÙÊiä…c"ó,ó­ðyJuÏ"Áæ´G9Z†,ÈܦјžÝdщsÄ›¿#ï°Ûy{bTðIéÔ¸yOS—q;c‹ߨ]ßR8ö/iÒkÚaEkÛqËöHc—T$-›"k´‘Q,¹t^Gä®e´ )r³’ÆPjKæÚ.¿e^öB3²ê€mâÁ\Ìï*'+c ªã4ÎüÚ–NXå•Vñ§ÆŒëê£ö»5=Nì­0½cŸêª6}K‚t ÎG39ãn&Îçâ/÷½—Ûh¯˜æ“5i¿‰§QêAÆ—{>)¯¬ÂVw„dz"ÛSŒ>*<µöÇ„‘ëèO]p»¢[ä:åî`ò×Öi[—}ÙêGÆe/òy`6CNijümNó;¹°´” O4R¬ZåµÓ A®-‡;¼áäÖ´ô:mŸ¸L©EÁ) !µÜÕ¹!mbõg£ï¢ñöú-®R,Kü¤´—Þ^aê&5kéÛBõÉ5©ëršåæ&g®÷ØõóÎTθSk£SƒBž¡2~Xc,‹¸àõ÷S¤Blåù‚7Š+è­éR¥óÆýR:¯¢äYkdùYù1k·§¶ß‹®®>‹Ÿ³ã@{AöÉ(ðâú‚ùfKO>RÒqØ%3α=õür+ûVVÉžØ`XìÒEF±*ìÆ—Ý;6·2H#Þ¤k5aúÈhIåOË;aÁ ‹Íg¶©Ÿ¿k4Ã}SýÌø¸ô³?H•W¨>uQ†aºf£ýœ>£dÏŸA»´õˆI”w±½Ñ~T|AèȦÛe7‹Ûk¥³ 'Ñj§lUÒ±.kM?Cy‚-™ÖŽÉ?„sZ›úÄ Ÿ­|)gU²>;ð°´óË 4Ÿt}Ÿk°ºvøMaÇø3Ç&¬&«J«kŽuU¶Å.@™¯:tb6ÚcïŒDÉÙb­×)6þARË’ÚcãL·ø½à'›Æq¡†!¶ û" üežÔŽjl½ERÛ}-.Ñ.bôJ£_Ij²Ü 3\96{©D6Ф"?îÍÔý 7¶>®jï¶dœ!&G¢AW_¹Mò¦ÂöJýö÷3ƒ£~Zì¼/)#A ³û]ÞzŒ ÖG3¨a¬•6vϮٺ¸uúý¾ñx%6ÂgMaÒ5[CÌRç¢öªruÍ ÛçäŽH­™*³5 8ù9š e€×Ù×lWï}æ•ö³ì CG3VͺsÝ#w~ÌW¦nú£Ù}<&¤¦ÁwKmƒo|fÉ=øã<º½Ö!Ó̱ânHÇ*g—jo­ÊÄié¶ è·6õ)‘ÛdV&g9ò9¡IÏbΟàát‡!.ÓÁ˜kýæ­¼ƒi6jGäÍ»»›Vî©r‰œØüÄW3% å@\vÅL~Óæ$Ï,ùˆÍ–÷:—§¬ËÌt ¢·{¿’û[é²Ü똒'Ódv´m:q9­Asr…Ëá¤Eï-ùéØsôÁÄË×½NغíµËKu ÎÒS;ž”í²ír‘{'žÕˆ“ìPÀ¼MïlWvÝ]mÚŽÎè*Vã­‹ÞwS;e>™¹vŠæ—³áÙÓÜê·öñ‹­Ä}gvNŠÈw‹fàSŽZâ£Ý¡œ’>ƒu«Fù„‰Té‹g¨‘ñaÏè÷Ûž¯³¤?˜W“ylfeèæÚÁ×¹’Û¨9Çü>}Úé\IsœT€ì ¿5×"Lˆ/CêÇVnv¦u&ã·ÛF,–yµBïöÊ5‹¯Oºèâéñ7nοk$ÕÁú8ΙúӚţK&5ƽrŠQ÷ùwìí· Îú§.ì‘]4‚u\Ñ‹êk—¸bKè™§ð')¶Ï:_*Œ)p¤hÖfþ«”´ïÿØ{¸¨’¬}$IPr’F$Hè†&眃d$Ù¤&Ç&IΠ’E$KA²‰*‚%J%*ù» Îì0³;»ûþwYw?κï­xªž:u«žªº=èí…»¨¯'¤Mäf†}VO¨̲5=3ë²®I&æ :‡oýÊ7x†È·É4´eR]c:ˆ‚ù³ï'I Ëó@7u _ …V:¶m»Un˜ë™ÅLœm)ˆªû9Öè«>½xE ”‹¬‰ZÍè;ÜP“Œ` º4ÉÆ;¥•!YìóÃñ@ºDÚýº±Zýº¥Wé‰Ho:÷h=*qn¸S“á+µ`éÓeÌ_§ˆ»ü­ˆ+óAKšÏÉH«ÏLÛõÌ€,»åBX8 KIQB]‰!Õá¥r Ž¢uÁü˜9žÇ¥ê+ŸÙuã&®¢ …MK>ÓGb©‰gøú Ú˜<åõ3“ûÁAwôƒ:÷šÏ&;T•7­ÝV´Á¶yû~ëˆ+…„Â; GoçÒ»ZìýŸoXë©it©Å¯¬æ°3ç æ­'_yøÑô;°ö\ÑUÖ(÷¼ÖnñË<ôèÀ'A×Iõ¢Ž( j,Ðìù®&aüni@ó™\~S6Á½ÀQº”t˜_“ðÏÉû©VµÐ‚¢Æ‚Šw¦ijx$ÚY/ô}d+*U0€ËUïA&Ž RJYiŒÀwÈh²jÇhzª¯j‘ß:w“ª-«¥1þœ¥ OªíýåRIË„|r>¶È† ‚…J&”%ëf,OÚ>‘šÓnÜ—‚Æ §ÂLø ]aFDÆäç‹.ð‘£Àµó–öAeTPÁÂì’ ‚°ªI×>c9UËw÷÷·Sò|Rµ—uoR©æÇ~••´|·NÂKæù±ËÜJfAKÕ’'êæ¡;:ÝdTÈ+›LÓ¦½=¸çDÕ©|í×µé+zdanj%¬Qõ:* lx³D"1ŽÜ$18_rÉd¼'½ ÒÉP¤Ù=H9'¯M=™æÝv¾¥sßdSlí‚ð§Ggú/o±Ù¾M1›÷|Ûý€î–º€[xÆ_ìðdfN2¥\¶x˜Ñ7KÑ&x¦·®ËµÖÞ…û2—njç­;,æ]ÚDèW¾ ~5ƒËA×zĺWÓèÜž·¾¬÷{¡;G| ¤³b¶°‹gðçÖ: pŸñÖ1:Y­cäb›ÂÕ{)ú@¬'0L'ß‚â§ØCQ 7¾E–ÈÚFH&Òž÷ï¢!»«àmoÝ4ÏÉÿ SÿH}åCoÊŽ´ÊGn°Ý5¬‹ÚL©‰Õkþš½*¼£ˆê6rîbœ#KfÛ¶WDbRkëÇDò;/?jËôßXçãh$~Z¥aº{¡Tg¶Áòz2°ôl’ø ]õ…Æm¯ T.q ¡<¯üÔø¿Ô™¤eÛ§ªŠ”Øé¢—¬?h&5LVÇaÍe¯—É¿_­R_Y ä‘U)%sL ¿cVzr;¿+Mÿ™8ƒØƒgì×)z˜ÎŽ8@x žKÖ4Œæ=eéo~üÜ—õ&$Í®_Ã#(J°PÒW¾}g™×äLeQðpÉ7Ø'"'Båí*´Mš'“ÅŸZñÚ:º&-RµÉϯ˜k#-º›­cgþ¿­Ô“A^“Q¡´Û¤&l÷t²ÏØÅC‚Nµz–Úën’í/ÃIK•,úSóMzð}Œ?á—kè±ÎXçl<ô1ñªÿMI©øKPF5)ïk¶S(þÒ`Æ1r«ôt È9ã¬=`”;c¤Kwˆ³095L‹(“>î,ô—>wö[eó÷ÏEÒ¼ˆPOÜ~´œŒ1ŸÌØšüÊ ÉåGÃïç°¶ÎÛ¤©~€ÖÞ¾ik´è’¢©*³SQ¼![ƒo5×_!йFo‘_Qô:pT…ì’Ú¢>2<Ù% à*xë<'ÒÍ0-þåÀœ¹bÔ¢KYŽ^ÚZ¨šîn3´Ø¾PàíO‘²ÑRU˜vÞ-þ^ÝAR…6ž"IáŠ[õîm©ÐâÉU­õë‚ä :ƒ±Ò„8ÜׂÈ×m<° }§÷ÎùÆÞ£d ¤:¬c[…+b¡(³þΑ—ö‘‹ÛaˆÊ–›UmœjZ– v ”’©uB÷û€ñVj6éÈíµî/ƒzE»ùû… yGé ¶åŠT÷žJ¿añt‚å8DŒ>ñˆÜfbPÞce¯Ðt´]wÌÆi¼ýÈÙ"ršøËÍ2žÕÛ‰þJ)‹”µvÙªw}J Æ%ºB# RÍñoc¦°¡ývI(T³àÎ`‰`˜ eÝ÷Ôµ²þ¨V·M"©»úÅ01û8øâé»9õã6ô«ˆxÍ+p}H¿ßZ¹•äþò…Q›*›¤2ïœXK·‡Ý8£Ì‚ÇÃÎ0!)!ÅÖÆ«Ù¦Ã4•]ä@õ¨‹AOB•z´ógŸUIÇ}ñ÷︇+yÛÚcl&|ËT€ºÛ'œ“¦³¿U‰Ø™É®Ý†Ió³jã%m¶ K¥U$EfýŸxÙÔ[RK‡ö‡SpΧ'¹‡Wà,?B!~°Ç03Œœu*‘OˆÚùv¹Ôõ{ÉS.›j?2F6õÔRºBšÜûä¨@¶lîÏ.¾Q²¿ýÙx¶ú­´í-²÷Ló ¯×zžú5ú-q[ѯ·üì_†žØÆ¹ÊâìÙf&où˜ÆhùDg]9†ýó¡F=r.çôúÍ: Ë ykMLç(,ªyÎì›÷ôÙêÈVÐíŠälo¨%6»ÜÉ=› iy/-—±«ª0+ìõ7D¿+…‡›ÖÞ Xmn=ÎÒPH[×:/ Ãíq}˜Åî‚¡p¿ŒQaÉ'¬¸‘êÈAÄWûÆïæß¢4]o„€‹Æ›ï¯Ì¶ æeÖÑbÇY/Qï_Œ‰G×´yù`b!ýöömìvrwsN 3š~_~÷á£;`¦«g\õXB²ÇΡ(˜eu“õîû’uAîªE 6Î7ŽùE;4Š>²l¼oú£ùøÞKÔ“WOã@’ä‘1I^ýµF¯±i®Ý?`xçn' “bn®FÖímÊçô—9WÆÏgSÚ¨ÂR·Œ9Γ]Б3êØ·³š(³¯þHƒ¢£O ~>µÓ¯hôn`}[´0kvýÝáLzv½Â^ÅWK#I¤0ú¹Æ=öŽ~.ý¼pÇZ²×Î_)ÊÌ{®(õA¼ÕÀZ ã]±‘ÚíûÏ`q”3\OæÍ~Ö•%Y,×tÙd]R“ËyF¿Æî;ÊXU:ѹȺԆÙqïÉã"÷ç.!v]¡˜ž¾x&‰2B‘·+ŒË$I?¿b-)!'‘|™wޤ[GNÖifƒÄ]¯åòð’a½r\ÜâÚúÛ{·+ÖmUa“½½ŸÑöÍɤ©NŠÞ´G«É}’­×¾.·_;4_öäœÔSý…í­ÚF‚’þ‡T²/ãý·Ø¾‘7…¨–®˜Nˆú6ªåή»•Ô àµ½íR—ᨊßgøMðlTªà71/gFÑbk‚&ÅÎdÒ™ôÉØ÷§ì ðÅ1IA&”mN˜<¸òÃ}{ð ÇDk§­„ר_¶g¨ÄÒûj–ÅI^é§L^—,nt–.Ùï"‘ýŸMÕzèMýúZõó ü2Šmšw½vÓµ±@Þkã›}Ç=fñDpaa—ÕTËÖ‡È$ùéU›GÉŠ±ïŒv¬Z‹QŽŠÛï¿3Ö†çç ·ðiKØO=¨÷Yèô nA¹4q< UFÙ¤Ïî5Ó÷-S1ùäû“ ;`\zpkñ•DÄ};#Ó)Úý~²[WT{¶Â§c®ˆFRî(ç½c¿0¤•ò|жmiˆ‚…ÇX$ž\wmÒ8)KÒ€}ø=ZœJk¾ÀÇâ[Å¿žO¬<ú–D_&/!=¶»ŒÒq¶Y’е5Ü€nÓ6‹—•èØH*ý®ê\Z*ÑLa±Û{ÖS°Zm`Ž/º\ÌÕ²çv[3ô1,ЧCÑÔC‚WOÁÐòæÎ"q&£AÃ:½[Íw§©/m™ò¶ £696Û^piƒ*Ë>æQˆ`‚}‰”¢ËPgLR\ªWñ qwô±våÕ,¥ºßÄ1²ÞZ újÎp~\/Ü4©=}ö&ÑæÀIû\ƒ¯!s=–9L2!óøcFÖó›qV?¦ÃwδÞúÖÛJ„‡Û“^”ƒ%ÖeT£âJý6BÍä[ýÝÁÈYñ¤’0QçOÄ’;ÒUï «=}&ò³æêcƒtœEŸåû.ãyAmË#_ÊÆwÑ(kʵ€[ÑOÔ÷l¬Ê‚7(kˆ–òÕžR*a¢6õ>Õ3›ó~ÒF: Ëœ÷d„>ˆÒ[×ôUE÷u7 `Šfhc²à+ÉSùý敊@J܇¤ýƒ}+1woS>øP~wíZdió¹ù4³ÒoßPJ܋ܞˆ•{Ë.Ív.k“Ù²±ÕNSFБ¬gE‡,ŽÉÛ3íc¾¹ö5=£m³Ý¤æB¹#–,F.Ц¥Yöx©Ä>‡t¤œ÷éº[~Û#\½ïòVm0ˆ^AàÞmÊw+ê¬,6 ”xx„;_ÈYÔ]3ƒç+aŠX¥?ÑÜ!{‘?uÝíIÛjhYúrÑ2«VäD™üœiÔc7ê}³±ç ¦&chÏyµØ‚*ï¤od¤?6·¸Ø/I²¤k}ï–FÜSX_ _LG¦6'Ïä¥/¹õBº†½ÊÓ×ojnp^à1k°ÈgxÖ9TbýêKrã -úøµÙ+W‰®Ý{Þý±ÖSæ^óí|ÛN:¦…\°7ä]ÆB–ÿ——#é÷XðÜ>Ô4UŽtTÎE±_œO|ä•n0nôH.[Œ)u5—±2ÿú‚”ä˜å˜ ›Y?ï;YßÏ}]š]® ¤›B¦Í¸„(´¤†LpŒoºÕЃ¯‡#U0•»J·­J>D¿´ª{Pž'ožÿf ¾‡äÆ×A2ÁNl.ÍdØ<É‚¢7n’ùóÒ·Ûª„´6š°R)_:ÏxÍЪÆñ’ëàé§ –ªn“âQ^æv)¦UÑú>«Æ"m¤O¦ÐpVt“UÁ^³®?ýó&Z»r]…ë8‘I³Ë¹±fó^–ª/g›À;ÃÜ44GÊulL¼WL8,úþ«†©—з, »þÑ%’ñua—#ú[h–& ¯Án•“æfÖO·l2»²ß€Ëï|; ÏÕx«Ÿrû PˆÜç&~}æ´˜¶^JU|¼ŽKU0}÷æë‚>qõKu× a½4KžõÁ%—ˆ´ÞOF¬Ãé¿Âíž7bŽ—6_ON/ã§£RT(¼L2ÚT›Ô6ê4mè<ºŸ r0øjËšú™®’™Ÿ—K\¼Ž‘–€õ;Ù„;:öZ[oÕê¨ìb¼wßÑ{0§TBYï•ÂüšK)fNDñ:àÒ²zSŒwœXÅöÍ_ÍꙀe°4)ÍywïX“W¦;û˜v×*+mq6… 6k󣡙°P¶_ŒÉs>È1+¨Š@fò0sßVý¶I1äW®le®XàÛ­û ‹ü«PGá{<°„užË®PG¬¸¦çùùõ³Œ]ÑÙ=º ¾hþ÷Æ·¯ ûh¿ÕÝ|P_±¯Fܾ© ã íã ,Û8ýÊÛ:r‡þéoŸ=TzP¢xèø>wU‘°ž Áõɦ𠤓ޔÑw1£|«@¹'ÛÑh¿¿àK¶cìY]Ev=Ê…ç"†G:×ròã_uê¸b˜$<ÒÐdL|§!q I¦ˆ(L=R2PnF½;¦„†ð_L¿"1ÑÎÚ¯¼ý‚EbfEe…©ÛƒW+D;è~ù†Â…ñ{mBk—;ß—t‘)z *O=t"`Å*<çV1A”Tj“΂e«À²ú1´‚ºÂÜ:o7W‘mõàYe$ tæêŒ]Â÷ëÄEõwb¦n i ‚›ËêÁ;’¾NZ3ÑufýbÕ 0ëüT/ƒ,ÿß öü 3uî¥n ¸n${¸¯ŸMŸùörâ…Ê8 V~u>>QÇ cVo>ç†Ø^ü6&íÕ~ùe¬²rÚš¨Þ¿Æ{ör,e[3L‘SHR3=dibµ»f¡íË×ç¨{Æm²Û;­ùsöãõ—-Ū”gûÚªzm·vî\‡Pß0h %*}ÚôJudÍîÙ3§\ÆÇÞ¼BúŽŠ“‹ç܇×/Яaø®Å{ªlãîøûíì…¯øPGu'òæ\_Jý\'³€ ~ë¾·¾Þtžww5ûàüâ¨'•MÝã-úm=¼ha/ìÓ/Ÿµäáy›õ4^BÞºÍFŽ»&Šùåo-µF0X|½ ‡¦¥ŠœõÏùÚÚkàÉóŒ¯â¨;ëhú´¦¦Fdµ–=p{ã›øÍZÔǶÞË.Rµ¥TO†í¥ÅXõU œÛr%üe–r½j†êñø°rŸß\›ªœú`.n ð.l]¥@2ùloJ+Q¼!zvº±Fx{c'I°ææò˲îfO _Tþµ¾§¸²ß*nžÒr´j Ë»³¿æwîÿ»‹Ë}•ø0joұ懹Yè£ÍN&‹zM>çl¥ò%㟨å&ÍÖ¹N‰ÄØ#Vß»Ú#Í ¸„ÝxÐõ¯A cã]ϦO?)ä áèPà€ÁHùCu¥l 1©VP•ð烵lv7;4ÍÛb ÏÕ¢…ìu½aZD¼_óûý@UšFý…RWÓ·zŒ¹Cx ³/»½–¶aß[Ø&Éï¿_ê0ÞÌ“ð:‡êmm®Ž¥M0~ƒwz\cw“ù “Öá<ÏϬ÷2hªôä€ÂøQùçX€Áê‚ÊË8Ç2ow,ÕäÄ ˆêí3#Gã,ÍBhA^ÉØòZ¥cÌ~ïS)§WÚ²$ïl§™FÏ^eLHC†õzzþû™‘æÛ;Àä§*œéiáD0*~m_gž Çð¼-P¡y‰Þß°ùú!Ÿw‹¢,Þïö_ó;“0H±ð¼c÷»ºˆP2í€_²ÿÛqq#W®~·ø-Ñ w¨XqÔ´g*°€î‚y—Ey6Ü ÿrüÖ,j·ß+üwÁ䘾oSæ~ލL\šS«¦®îìïäî…„~2÷»9@uuv‡·{ýÕÈP‡OJ=ãäêŽå:ž…"¿ýÀ xªáD³Ÿ`2-#× 2Q#GpZjwLî—¾Ÿí0‰«1)ëô1ÅYú_—¾„NÒnöuì²m,~‘J)Èu,"b\Ã\Ï\ÿBé`UøKt)7~K!åA·¥}T¡<á§Š%Š´iš‘ºÊÇœn{÷Ug]l„“_oó\`\‹ Ôç'’Ãĵ`î]›«+|³”³”‹‚‚žÜ ¤Oñ.‚i‰‹©Ù\߷䟯]½ñn®înÎìeS”D5~ßFúº%ìû{³FÒqr2f¹I‰¹è‹ðJ{â±õ.cÀ Óë3y|6l·W ¤ÀH'½(™Ön^ ¿ï)¥:fêwu©ùmÅ}È‘ HÝL‚S™‰nÊJÛìS±í×¶ÒBxäõ¤6Ó¢ÔD›¥çç¿{Pâ¢Ý¢Ä½-`,Ø‘ç•3]ÒÅsïýõsâw9½¢mÙÚ†‡€$³Ü®g¶‰C£r€€ÓW²fyH_LUµ½€àýѱJe”[rƒ¦à (6ïIzOÉé ï;ñÅïêIÓô †P^×Ù8 ’3eÔº‰ÙmËVž ùäñúö™lD¼_ˬ$¿†ÔÞ̦ƲĆm5×´!ˆ™>Á–-륷HÂg·~ ± ý¦L—‡tÙ¤ø x´ÔI.ò’瞺fÔciežÊ÷Îü½ƒúù·Úü®#—V ×’˜ÌÇd72X<ßyùmwq‹˜f xï´Mô=3Àذ|½{qK.5ºø›"ÉÆFÀõ‡,L ¹˜» ÔÍ]áËrÁ©¹dc|÷ó9.M½”¯ˆk½3Bž¨šÿ啟%^t^dš®,ž'[u”ó'§ëÞãTrN)Ñï½ò”a–®òþT+×#áU®ÛL‘爅 ò*uXl1êøåâY<ùXIàüi°óNU.&Ÿ¡Z2Î8µ"üÉG÷ч½•Ê®«ÄÅYÏuJ?Ë ßMên¼›c·rqsÞeŒ©§-Tt.µÿê†UâCwôhÙMv5ž»;ª*4µžº%g­ëîá̲ìú'9o@Í´‚˯˩t¿ã˜^9#^^œ…®I;N¢ÛÏ.¨dJyäY¢oE!t/ÐdJé—ä@1¿$±Py'H‡§ÌvÃKøÄz¿°œñcñØeÁ–ÐcÛ¼'¯û£¿ž«.ä»…ßK÷x@£É¾×iTçìzÿHò‡:ª½âç iÞ>ör­jѼ-zŒ£e4S¯ùa,e¤„Õïº ©6dcw£†¢ž¿û»guã¦nqzÄýÁ“¶×]:¯oG¸m+~€™ì¿ÃÞ|ózÄb1×÷jŠÌ;Y`Pv®79-ñqZXœà¢REù˜nm­l£/½ªž#¢™Ì¨Üïz¥%ñ™…º›:ÑNEk¤í^­Ý7s1DA¢âgÝxŠÇ£¯#s3`­zZuZúëΜïdÅ©®ŠeÝf}•i“åÀ<Åfc¤åLZÁ[À¡O¥­YýEKru1`Ô¿’5÷Õ˜hOOªê˜;kîÛ ^2ôú‡º0ÁI­w3 ÅG³Éß®ª¸/òh9=Ùâ¼—a¾¿‰ñÎSÄÝ–®s‹+é̓MOÍ]lo6)ì›©Žºr*ÃÛ"ðÛ#^y@J·€ —dY_Tzl+÷^;y„ívž2Ÿçú_ãf ã?°ÈÕm+Æ|ßµáîuýŠŠÈgÚ¹ŠMäò³Qî¾ØE´:íÒÒóÈR 2ªÒÅ’ÆAÿ¹½Zÿ9¾ÿï'úý×Óó'"ÇðøÏþþ+/”›—‹ƒ‰?ÐNñ? ù=þ9 jíàwpuDxÂø­wfvÿðŸßÉ?xþçþ\(PNNäïžîÿý÷ nÂÃeÎÃ555áäå3áåä0å0ƒòš™òCyyþoxŸÊüsöÿøùü=ûçáä;ÞÿC9¡ÐÓýÿ'"íüÄœÓô¯¶ò5¾@{øqˆƒ›—ÄÅe€þ 1çøMd„9â×Ü\\lœÜü n6N¾_O ñ#OŽßDAþ+ fêfhõk\~6N^77'?ï/qM!æ¦æ¿‰ (jíêùk,^6(' ÊÏåâû%/Äœƒó7±ì-Â'Àu˜‘ô·Jr@!®VÈwˆüV€Ë!â䀹xÿûÎ4ýSöÿøùü¹ý†ÏÁùGûç:µÿ“?žÿAÇDAAe:<ÿÃäÇ7ò—ó?ddd¹¹¹((rrrNÏž=;:ö#&&æïï?>>ƒÁhiiQÏÿHô/^@9~þ‡Ôÿ—ó?]ˆiy÷°¹[Ó˜yd_ïq ͽw4¶e‘·ûmlï¬[Q^þ®Üõ®èì½h‡ ùÉ„~mÍþN: ÂŽ[Iâ±SŸjªQâP è7öoÞQ ^™LQ6|µEs–¦f³æù7­4Bq4,qrŠIJ*áÙ“¸¡:Øw+ÙȦè>ºÄǪ¬ïˆ€ÌôõðF×Q‚‚ ‹—LQt±nçhè¤%ÓÛÒkd¡GgfÑž L¼HÈÿnÛ…®`›Îi{à–5]f‘2_k}¾ô Vk§3ZÇ[3˜%¼±7 5z˜N 'p¬þÛ I8á<^£êË Bî3(WU†u P‚f÷ò^’’kIMpoÌ 3†§“Éľzâ”Næ(åf^}-—Dlâ|Õ7BþÇ[+ú´¤Zo.¢' Óö‹¿iÓÌ:`ºÊ²’ƒŠß??ƒAXþ-ÒºP(OÂöõ½ÔáA¥»ç$¸5U÷ÜÔÇ oLp“ÖQ÷È+GyÆÎ†‚ŽñŽÑ…X×–«3AÄœ«#^~ÿ >¾Ô× ÿ§._c¯H-—‚o¿×“ã*“,5úLÈ} Ûa‚õ0¨D·—aSžíµÁ#ší¯n„Fe›:3„>“DúoÖóÔ¸©»Cé&,ö¥fô½¹øÑyÓÞœCÏ# š˜ô⡚æóO)¶€¸n{ù®q|¸6nЭlTö}å6›€ÑdÝ÷/?}Bl~ÝL³\s©„ ¢/½4 ï\›ìYÚÙ òËîÛû”_}1¦žV©ôa|+äLÙÇÙänêÈå÷|¯—öéÝñÊnð]Á„®„ሉ¥M]±ëo>q&ˤÔF‰`µO½ìi¬ …µ³%*³_T¶µõQ¨{±uÿZ铊Êê+c:„Ü\,!tI= w¾l ᥊î8] X?³ï+ê2âM”üÚ8µcP™ƒÙä‡öÄêí¢©²·›?~¼«š¶k! íÀ ».x%Úh¾Æ;PDekÆ”«ÞÓ’K“ô€Öê¬Q–$qPœÐƒhÌ«¹K±ûœC'>tÏ>Òø†þ´#÷:yÐ3篊GR—ðéRE¨RqSKÓÍûE†»ŒM´îa}‹¾6þðãùEo,¯V}¬¸öòàÕyÇ·+˶…#ÉÔÞßÀ!ýAÏ¸º:£T¶‹.㯚{½!=†ËJæÑ-›Åmµ7Á:Ù:{ÙåµEP%c.š •%Î|!Í̧Ơؽ§£´J®¸Q˜pÝü-]Wâpä£w©Ú«#ùE…jþòVJ÷\ôPM`ÚéjÞòyÙc«Œ¥8º„wL‰ð±´Dó_Lj¿ yqݬ.¸ÕƤýFA‹„Àô3³dÆ«‡Ú¡¥Ô3¾Ò­³Yƒ©ÌÚ½Ô¡ +Ä.jÍ1LÕ…œyÁjöÎÊ Ôý(¨‰-5êwó(‹ Þ«ÓiÇÁ³Û‹“¨ØúÏ£õ;nsˆ+Íj}’#¥®ß˜‚AáæT;;bæ‹Ú¾Oã|²*Zƒ/“X4-"ÀeÜeº[5âÁ% Aâ*ZâoÙïéø‘ÖÒÍ«‹Hc\z(JàG¥[ÃR α[w̰1 ¡B˜ò÷6e_ ƒ±J[òÞêj}™‹§Ú€=b*±]YæÎ/Lëz×ÎûEÂx¹‡·ùéõO¨åyo„±„C…ÐÆÜÐxf¶›…¶«ƒfý_4%ZˆƒXY@ؼ Z/s¥Äñµý¶ '.ª¢(Q@3W½Õkø1¨Ñ¾OÏÌsó_üPæTÚµ`g>bJh—ÛÀô Éhz6™Â[Ì—èÞž"+ÖeW|J*I¢{YbzÜ@$èn7hîÆ[fÿYu¨ExèÖÚüjw8pæÂür(Ðg²Ðî<¥rcA Ýpx„úÉ`ZŠÊƒ½¦è•låcts¢x†›@ ÁÖ:'‡yÝa‰%YŒË¶Í7«Zª® r]å°j 6,–­do¸*þÔÿþSŠ|{ýÚ«é<è9™’¸S¨ KØí¨YØ©èBWÕˆÑÈÌ"Èw:ŒŠ{`)ž£A ô?cí²9I£2O½Ž}¯•.ÝÍ4rûžJ@ú9”ŽQ”ÄÕ~뉟ؑø’z©QvÔAkã\XÀã”GVsrôMÉz( Y$o¯bSBokA+ÅÐ{J×!~mŒLÉøiT±MëgwbH‚ÐÔ32ù÷;Ʊal8¶¾5|Íí¼#øX¥0 -ù^‡<ÍõÞ·ôÞeò†žüâ îRõ2\|°”’‚µ÷ÓûÚÅ$ÎÄOXIXåè»}UwŠ¥Ëp¸¤QOÅp÷Ó'‘³Ñ_:2…;ñqï·‘c~Ï“ò> -Óµ¾‚Î/ÄF}]?X°wÿ ƒ§÷ÕTt=AjRê¨Ú@zÄ6¦-}­7«^§­Ujô«’Œ„ M\ëX\²ö‘Vç8ŒÒÒk0zøu—Ô Z”71Ýè:™dTI÷qQUñp£Sru"X`X_ŸIjq©â˽±ÃrR¼ÖîOÙG?†iû£»9"nÐë ·Èh3ç• ä6ÓJõ!øX~ºêŒ§¥‚µ ;뜼:ÍALÒ0ºD,¶Z«Ú²šÀi­Єz $H,®8«³†£PþaÝnsd¥DÀÞ²WîµäÖ¤êY¢ò½Ë‚û´ ›jË*úXrV#{ïp}çŒëÂûšžô_B­cæ¬_÷G ÉÄ}\‰¥R¢ñ‚V¼3ÆÇù¦BT±æÇ3 µÜvóÝçmâóJ6jŸ R$êùB»‰%Ñô€$ž¶AB-i|:Øø U´ïÀÅŠ'_v%¦î…ÁEZô„©E¸Ao8¥î|žyw^²4× „õM$[:ê›|OªôbÌÙï³[pc|Ã3}®Æß«‡ü½^_¨J6šÞ[ÇÛ¢2w-Ä jwºŽ†>³ýÔ>|ÂÚıXlÑ[3ÿ$9W­)ý%QU²ea ýÛÝÞÇ”X™‰®Rj«ùÙ•RÆf#¤k_>+ñ®Ýu=g]@z¯¨µ¼2·ÊR?#ÒÁš°ªuY:KÆ.ëícéÏ¡ +ûAM:6Bè.v}ýö––þ™}_^½ ,]7fÄgXS _¨—ÁdÎseÝQPFƒ×v˜—6È¡ ª|ØìÚÅ|  q‚ 5½=D¡ I‡6D^Âd'ÆCAëX¥KÏ3\¿8¨<­‚Ž|˜»UX©Œé—¶ßôÛ/7Â1¿Ïƒ,¼75Dô›tίÜB‘ ×^kÚÿLï'¥G‡ž1 ¤Åâ÷Åø›º<ŠÉŽ„·9›[4¡^û½‹âƒ)nq$k°?î²þÇPk}ÿõ¯Ú„A"ã#w¾ —Ps*Œœ»«Ó4‰ƒÔÐnÇíN+†x`CÛ@M{ø&X›öìÏÏ×±ãm’Ú‡…©ã Äž<ð'Dëå¼ÉÞ[`S>½øE<Ö¥ðëdÆ3rÞ§#ŽWw×—¯^íÙ¸±¾wó¡ÉH¾Ä=·Ç¢[/Þû>2‹ÿ\.”jÙ]Üä`ÎÁ !¾“ué›Ð×Ü!öúêgÍ vw谴牲jÞÍ=ŒÏ¸ð«¥rD¾^ ÿ&‹ÇØùð2¢ºÚO_2Øá`Vfçâ;çôLÌèu2­±.K7Wíæ{¥@ã9Gè²ÇDZøxñ˜_9°è+k!QñƾÛÀCÇ1?êÅytSOÂkÅðiG·iŒÔ‹f:Q-kß׳jö¿‚JIaÂXV“}¦|ÐªŠ¯RKŽy;ÉÎ Á¼e<ïÝ«BTXÐ%$Øž¿ÄõVõ`БÄŽt£ÔHA ¦¤¤¼ý?Én[v¦W#Šú9’ kþn<¬zêý”Ùµo\Ó~˜zvÏ‹¢Ò-$ DJ¤””Õ¼:ð“ù3¼#èÚÝh—ÜÓ˜[)w”ük®;ëð‘¦òZñcy¢•ÙíØ·U35Þw$2ý‚%ŒJºÞbû!T¸é‰x¬fûŽr5­¸øÔ>rè÷é%œ­liæµDÚÄë˜éW®Ñ}S®a~]ö†‹LÞWPšÀ\,œçˆ«æaœ¿úÛ)” «OmwC<¿ÜÂ÷Áz…WV³ó¾:phöá°<ˆ³´a(Ÿõ;žOFá¿@"˜Nº×ÛÔ•%&x ž» r`YW›¢¢¬4óµ2®!›â½¦}4ôú”ÁÄX-©Ø’ ø`¥ÏØ ö|Õ%¥ôÁI½Øë¥­X$2‚Ãð+ï¸7L[˜æ ŽŒ÷HÕ ^Æj­ÿ®1‹}I¥É¨eÛm¢Ž#`Âê£fÀf" úˬTÜ›Q„Z„(øŠ4t(èr—ý2×´%íÏ‚ÞHµïŒº` ÆÅÓ59¦)k/ëí7•0±W°Æ3bŽÉÜ-*H—ú½hÞ]yÆ‘¡‹dU´0ïÑLŒ¬¢KûUö~“ÜÂÈ0Ïä]t­Ø|é‚7c–*ò)˜æC;Zãû«ž ,v¨ yÂá­15L(tž”æ2 :vA'Éw³`ŸPE|r6 t¼š¶‘Ó:Ý\™ô“ŒKâ±—?ú²¸cÔRTw,G¨¡^ΧÔ`¶ÎBÁ@‘ÈŒý–ßOòU6öP¶ú ÖíPV§Löާ«@­,LÄ¿„ŽÄRóqøt¿{cŽÝZÏl-‰qFøÅG &ôɈ >Ñì\!Ë´œ!ö£”GD(1š,s»‹H^gþ ½6^[ÅÝÅ0bñØKý5]ê/UÄ€<TΠ_A\hPÔ”[™¶E <S»;=“çÂ9¯ˆ"q_m^ˆÊ¥ƒ»¸vݦؒ5ˆ;ã«´œC«´[s¸€!ªxì£ùäq‰ëà8„úÆ#u÷µðq²ôÎÊÞOæ%QЭ‡]RÕžw¼05ˆ0jã,Ói¿ñLþÍüÀEôë5Âè4—ûk8ÊtP° o+ L D÷ͼ•Ãn½TW&®ªfÞé-’M^Îlà> ÷æúëØÅ4Åd×Ö—ä²ïqP$HCÒGù{I:š?F!Ôºt—£ÄœŸö®]”'ÍlòP<ðþ`­q2–ä˜ :½0„Ùñü †„•^ÀD,‚¡‚ºeÖ§)ø±LÃÇ€ðsôDÅOèÏAP«-x+ž$JðCÐ#ÑèÍ/S¢Hàg|g DãI"­ù$fŸ[2—U{BÅâM…šÓhL´gí¿½½òÊÜÍã‘#õà…ðt1šX‘ì¡*¾§#ÓªQ± )fQ¥tq<%;±y½M¯e}£Q‚„ºó¡jÆ¥·VLJ˜Â>á¿~ËîŒÕ>vG$»Ò¦žþ}Ó×t Å›˜h67žP%J•òÔã1ÃÒƒÏñr>Úв³Óðöà×”£F³UMT:%Rau#£„N8Rê,µ»Ø‡³<äÇ\è_Â~‚§êÇe•Œ?”eÙx}¼öiÇÅ %–O)ø“P± ®XAëh<µƒQ˜MSû—Ö#æ6ÑÏâa^D%"˜8?bNÏ®ÿÔ~…ø½ZzYÍ ¨võ*®xé"¹(ø 8œï½5*ÖûÖKt2;èýWÄAà_B;?^XK”ó!#«ocýS/5š `iÄ Â×ãžYÁ@e:1ZŠŠæ¬ ïy 5ö8¾˜ZM:ÖÕF’/Œ¾Xd@õD ±9­9EB[r‡+·Ébô⨠‘¬Ý+‹M^alB-†r1©\a¦ÐÃ6¤Á4N9ær>£ý¨…+ z‚‚±®°eÎaÃK¾, “ç; Mt[õEÓKæj¸“ð4N‰6[+½VÇ nu:YmÆ+’ ‚´Ãçeu9J2O& ¨ýnÁ:|;=d ÷EC èï•õW>ì +Z„ÐOÃ*ÂŒ‚% ð$!áç Ä¾ò´¨Yþ<ˆðŽä³Ç¯ÊJQÐ8+ž‘ zˆQÐ35äYš3ѰBrʤeêаZr¢Ñàa­è„cŸ{Éœ‹òɺ§BøQCè Öj~Kà,JP­Æ¦«±/p»•³P]: ä‹#ŸÀõõóªíMÌ1JŽìJ\Bâ;,–pöinêþí±Ã,âjÊ Ûáëß]HQÐ>ä,ŽÃ\+ $»žøüÛÙZ6w‰3Ù¥í¶E(èQ±—,'x0°îÓ=1<ã9“÷ßìà%Âçˆ&—AW!ž­e\ sµ¡¢{)Eñ5fDÓÑ¡€ÞÝæ˜ ´{äv™:RîY©ÖdĹ|Åÿ$äþ&? þ¼|¼§øŸ„ÇŸóçÁÿtÿÿ‰Èqü¡? þ|§ó¿‘ãøsýçÿ‡zdÿ§ó¿‘ßãÿ‡÷ÿ˺Ù[Kš8Øþß~úçPÿÿÿÏåâà9ýý>.~sS>N^S~n~n(/”ƒ×œÏô?­ß©ü{åÿjÿÿÌI ¿kÿ¼|Çû('ß©ýŸ„üµó?&sþ£–`&@˜xvágãAù l\Ðÿ¾s.§ò×åÿhÿÿÔI ?·(ïoÿç‡ýóqŸÚÿIÈÏÿ ’¡ œñÇBžÿiæ±û|qý8ÿÊútl|< ÚsõêÕ£ƒ@þ@Å4Äz(ë'€"î±D†ZZ¼–Qoùæ?|^…‡åHÞ2õËú2 De/”ìžÂ÷˜d™ObŠ|éœdúÝ¡¤.­†V‡—÷¦WØ Ù¿5ijüâvä-ã”ÜOü RóðBË¥^†ÄVIuÜ|>“DÙé&ÙLME Ü4Ö ˆ»¾£õw%$Ÿ„èÂê @D¸R`D]eË¥Õ•§±]×åîè§\®³|l –Äû(÷AÉTQ¶÷18ûnµ]¥è^—Q®¿jÜ8eF|]šSröBÈVÍ&ùGc¿ÈÙXŽ(`#íÆ´¸3»Or‚=\|r¶õß¿€¸I€úË‚­‡¶Ì™3ž¥&¦sPˆa±{°>WÙ0@4Š9ðéA®û}y¯daG^ÛïßýLô^W?n†÷>åªÆA†_©Ø=ðçw°}+¡Æ7Cøù!~Rþw‹ûFÀÒ˜9|´5´N½#^´¨d5šOÝr¾¢ûÛ6·Ú?¯%qåªéðZY½·¿ÄPlòý¦h»uølR„ÅÙ§"åfa´›ãpÏ’† '_2¸ØÁ_sl<¹¡2‹@³Á•²¹µX°¤jâUF®ÛŽF!é²k«C™žÝfR 57Û®ÒÙË;t÷pí¸“I¤ñ‰‘¦îë ÕíH¸K•¶J¾áî´’X< µ eŽ©nT]éqª+m¡¥Ž6íf|кÌÞ€N ^ë,¹ú‚l#õy‚;JŸØ|®]O4mCiA)ìÑ÷ÖLp÷áD³CôÙoq†þz.ç…ÀNc œ{‰IuŸ«ÙDE|4} ÙìæcPúX–B¨zy}cd=hæ=úóH‘·»&Â1³K™W%Ä’×ïu•¦`…z¹S>„I‚«LÛ[a¹+lÀ×Ó`£¯!¶à.l„w˜@õÅOšÏæ—´ÕTë”»²½ªÃÙc#ö\gY@K© 1ïÅûó9VÍEmNO©zÏ”È=T*5½‘~óâòâ×"ðuXÌW[.¼æÄ:‘ /ýüqש9ÜVë‹ã½ç™÷^É´Oz嘲´ÉŒ3k±­”º ?|t¼i®*-ª4ÛÓ/ ù‹%»$Yóû€EžÂÑ~Ð{UÉrªwé%Is+àÖd¦¼—Ý/ÌþAìþ^­iU÷>c-œöþÔAÜS¼ù¤®<Ús¯/“ݰ²I+Ãp”{ª2Ÿ»F "’ø.kˆq—ÌÇj¡Ê޶‡7=mW˜{cþÍjsMÑû@c#kÈ@±3gYîé3×ð.ã,›þÞêŠUà®e市ï!û¸² D½ŸzæÉdøàc²¹|YãmQÊ‚^å{S ßóV·©.ç»C'Ê"Te¯Vn~!Ó¸²—x¯eïGš"«Ü­¹6"Ÿ ìQiϦ¦o¾½a”5¬V©/´™§¸õÞq"ˆGû"(‰µDõÖqå\–ulˇX¿Ûþ^Ö·¯u«ÁÑñ¹³Ó¶»8¦¹%e«õ8•Æß•8Kd•Íí¤?| ‘]öêZ%/^šÚ9¬éHyUÃSpyîciÃûk¦‰ïkÉE£­öH2]¢]¬û#¶Ø÷e樛’òÔ!³sßÉÖ )7Lý¢ý%^ç nœ=r˜ šKä­K¯˜{›GÖü ¤É¾ ³röÏøÇàw‹ïÚ¢vÍ|+Ë’:ú!Ši±è½‰íƒt¶x[¡n²p7bgÙç¹¾`æËG$;µ3ö®ih“Ä®“Ô®ÒRš2 >ûq÷Չɒ‚x0iÔçÕn9e9.&)}©3³MH ŽfvÍ“®Z}F2{äyâÅGûü«-øáÝeÍÍ=¹MYuÃ%b×5dVÕÄ*öÒª ”˜I’á³ý|Î^ -84ªÓÂåÎ;wÂ"X]ù_™Q}}Ù‡yX™È‚?9ŒØ#Ó_ê÷à°¦šØÿ+^1¹ÖGÍÊÑð•}©OÒxUÊûw1gg&÷¿šLí’çÄãJ¢]Ü5ÚPãÖÓ±|“Þˆ½_ó­œhnqþ4÷&*ô#Ρ›ô„™??„7rïÉÃ/O1h‹ñíÉåK®÷| "p‰ˆi(²#ÿšwatÊÔ7)ï ëÑ}6 æàaŽwM[¢T_M4+k¾~ãá“+Üì³’ÕonÏ@Cáûb™;Ï{é×ÀÓ½|^CÃ:q†’/&2SïÅP±cÞ^‡5:÷ž¤&Ù7K9r¡Æ ˜†vHœÓhãˆÝÝŸw6|ãÌÙüB¢Il‚ÁÇ{Â'ÿƒ†Œ 7›˜»dîr{2_•´òú-lIì½õV#3ø•óÐCXyߪsÖŒ¸ºaÊtYÝÅO¶½/£î¡ÂœÿqEM«2=€¼ á‹†ñéã·L[ÿèi^¶Žm_ägÇ“®Y"é€Jºbò9Ý´âßlWºŠÛ önÝ‚H„%«\J Î µJ¬›j‹b¼×,¬\þn¬Y€Yÿ¦û눸³Æ–ñX¶-Ï?—馘Šî0°»€žØæà=C¿óV•†aM7 /¡2ì¶|¹ÖµTU„x¼ÉéÞ­X%d>"´˜H7Ý õ3Àm9ŸŸØ0rñjß‘‰¢ïã¶´a½ÓWF;À05‹U¢¢ã|½G… Ž iþóá½3ùV^¾Ûå Õ’žâWG ÂíÅ—…êƒ æô<ÄâýW†ä3Sc“^î+%E]ƾå¹Ôräôq:@VÒômLÌ0Ö­»K—Ã^ö!Ûô¬$+QâLý÷†7³z êøÛ†i¶F¡5%g_fOeZÓð¢o­ÁB<Œºë°k×Inä¼¢ Ü·ÿ¸:4‘Tå,žÛÓ1£ê¿%G@äû‘õëýý©÷”†þ[vNÊ»ßåkÀ/¢±ƒ¯mc,>hiŸyÚÄ©¾Kœ×(H’œ+â$)&Alá}uÜ“i`Ò!¹Ñ¼õFæèéê—ìû)ñëîÑí­é²ê‹Œçîù}Jh¸Øó°Ë2Øly´a”ÿb,òêdØÍ^¡}SOIÝüK3ø«†ù7lvê—¶ïÑ5Pvºòeg½PönîðvÍb5û5œ¾ ›ªþZ]”­¼k'D¿R‡¼ìrÿÕ÷³ózÅ¡S­@´hbÂÝÿd¾½=…dŸ°`]Š^·ºŽ’ôöec½õ ‹x`Xd g³ÿ–é¹nÜý.&3ãÕ-ˆjZd`Ç\¿/ô,cÚAÙæuQx}wõn¢ó\O§O²Ëö/!Šj“!.ª­Ÿâ99 ßÏ¥ýšë~¦™ñ a t@“›ªìÈYÈ÷{s½ZërâÓ¹oÇ”ƒÌòf³kûmÄô®-Xø n N±§Â ~Z˜»­à=£ y—Vtfµ‚j·ub„i2µó•lZ‡Ü<úø(!a231븖ðzˆ¨u‰!KÓ÷ùˆÍÎH*1«ÃÛ¿6Á÷–o(ù<7Qß¾¼q‰¤Cæµö—ë:_$7»îãzÖ5¡Az€Ö˜îs¾^’›~®¬1þÝã ³_jckK2‚0X‹V™í¶Öe2[r°…Öåãó¸Éå¼I¿Cô9xºŠ@—Û­—Ý¿…O[ÉÖ ¬'¾f •Y/ï®V·dÊïµ·ň&^#ÎÏ8ôZù>o{K&ÎKÔa÷š©zöoêðæ+s¹X¥ûå°KÕë©„R ÕËI˜QQÃgÃ¥¨ýÍÊ÷!u|6 -Ûï½ÁÄôñˆþ‚½ øä9 =öŠI¦Ù;J…›J—g’½>X¿ ¦W¦³îõ»µë6áîÔ¾¤Ñ˜ÓD5F5m]žÁÑÚN-$Û»%\§~Eö>2æÒ–Ìø@u7ý<àLžöÎÌ'þtàså{žúÎÌVÕ•_ŸYs÷# ¤ªµ´ËzM4}¬â¾µÞèO§cÍDõéÑ)kƒx/Ùb³²†Û‹ÖÖò;Q®þœ ¥J&Æjé)»d·;ü›2!hâ7ÏO›Þï}¾Ø@nÒK&Öçýp\‘÷­ÑLÃ…kë–8DñÓo0X3!Ûk5k]£Z¼o!û™³a¾˜Õ@w½¨ß(òj¬®¨ÓÉzeoN¿rãþé¢wÀ’fÇÏõå{CrålCâNµzT¸á}Üà[Óo“Y¿ôÓ:[CÎ1¾ò zþb|2Ó¬ðs%ÙY"ü¯u-Ý4^¼Äê8’h«Š„Éiqú>]`†5˜IV¿ ¾Á!ZžÚÇ –ýÚøu âKÓ5ðçЦg=£\Ý‹çB|¸”>5Üx,LÎlñÐá¾³¸· Ç­6¹žÐ¦lJ¾JÒ³¿v.Ù_*F p\©*Oºy7H)â–|Qf¼½Æ÷ð&ñÞèõ i¹¬|Ý'÷Ñò›¤³© AðûªÒ·‹‚fïƒ}Íy04€ˆ|Û{‚ÛŸlz«{d˜òÞË«0^ú0‹6å„“MJ§uFßÅøNT ¥‹ñÛ(ªÄ_lá²e#¨Á–[»êÏCs…$18£×²/nj71m.mßNPÃί1ð㥹"šöñýn¿õ2àŸ¹›8²vUÈ——æÓ³ýÌñˆûþÛO?ÉǼ‚¬MîöÝ ܯ@Áó[¹b¢]çög§'ÿäj i"LtB®/îW-ùèÒÝåMÃ[¼7ÃNùŠ|…ŒàƒýwgªßÜìjð' 4—/L®~©ÛL•Æ$uéÜoo¨¦äèÕa7<ãïÂc\0Y¶¯n˜à´E攦Ìnè.†[x¬£Møäx^‡—…,`žG™´Þ%ݾ¯¡mÆb£¨•ŸwEû¸c§ðAâhò*HÈZ•\Î.±&Ö”ëÎ5mç­«ñY¦s/Ÿ)°JW,K¾Éè–·Ñnƒãß6±jÊ09d´¬IºúÑOûC 7&T'·Ö¾+ò²îŒ¡ñÛ”ø}4¸¬F!<Œª'¶ZïQ(<î¬n"¶á ¶¤²¨D¥–ïBU­ç VñÖ Oþ$–SµÛGKýo)ü{ǯ©bZþ8¹Ò‘ùâþÆV3®­rûj^¡]ÂÉiˆéhSÒ. …Ïa>\vî¥qzüv£ËÑûâà³Ø­pòœ¥põüOô™-^ÓÕ‰íb¼MoM„‡Œ¤ãÇ'   {È|Ï ‚²¡$ÓZ½aG:²+^#Ãê‰!´r¢fmµo0³Ùßsašµ¾ðÜtÛŽ÷íë&ßÓÚ¤€>g½Áˆ‹UU$mòßq× Ç´÷Nm¹òf ÚõE¹;µÛÁð™.ên²çÜ7æ/;%ß{Ö6ãOáÄé¨ ÈfpqÑ«bfŠ×ÍpÝj¤ÕË£o9[3)b™¾ëêã=ûBëû3æ™,;Ö×£&M´XÁaÉ-^¶;¶XB¤Å“¯j”C¢–ÝÅvôê! 5¡ó˜{iøoßG$¾rmÏ¡ ãüÞ²Í5å¥HƒèUb ¤ª©ûP]ÅŸ8Cøv¯Õ‡œGU)¦)³÷^DÈtÞ7_Œ®ûÂe»!Q""ØO µZd^-ïšjäzqõtY­·Ñ$ú HMc&WÎ%ÆâWÍf–ôu]!åÅ÷zçêô‰õek¥wò¹YÙ×cKŸvž«ÛWÍK×â‹¶#d(îpuï{}¬Fg]~‘Š¡ —{îpWÑy+ý÷¦qtùÐe+~jÿ…¡Î_1ಳ‰Á‡ çíUi¡ çâ¢wpžÏ!#LåÌd׈”-/Ö§¹Î3ôÓL`+òt6Ëlaš|µ\ZÛÚˆçÜóÑ{“Höü$%Ç̈³Eh¸-qnoS¡ÀŸ;ï£;,gCÃÿ“½ðí/ UIû™ieÉx°ÁD`$4 ©ëHƒu÷iRÅ®>{ )\˜ußQì`H=š¬EDÇÌ_-LÜîR9€÷Á.™Åi.0€ùöÅ\üª?5 dIÖ+ãƒÙo•Ò5óè@#Î(>±ËãW–@Éü¶ÚìiÝxp&#+ñ²³ þ¥! ŠVÌ"Ùî[ Z4%È6ÜÜP ú,5Ð:‡w¼Ÿé>-›ÿ¢ÅâîÒÂ…òW3-þ½ Ú¨mÕ`{ 'ì´ª}SƒC Øö.tèEÎc¢5n`%Ò=ØbÐÙ4£_W4IÑ›ÜéÄùRÃáÅ“U„·–lf´¾6Klì°O¨k†ûªÓšÉ'N4š”›]]cqdÁL¬;¸ ,b`d@Ý=º¤›½ê4´ Ù÷|жØJ /ÎêxçW$çY•×ó½ý%Ó„šþ+ðºÌö°Ï©ÙAë˧7[Ù+ê•› Õ<¶»Bê»Óf.¤ÀÚ¾î¢!/Ë.n™ú&‹5Îhm@dK\òǽ8;»BWaÏ®G^ÿ¡=ŒHÆóG×Á¥ í³`kˆƒj)g&Ë6`†¤(1C7Ç[ØDw Ô/‚m¸Dõ-)w ˜ð $ªKä|D,5T±ÑWÜW0s·ÒñzÒ l¹—ÃÄÈÆ’ïQe÷Â26Gö ]+jl²¬ªa öŸór•«Ðç™!)’0Ùx²~â²£#ÆóiSSfpe¾ÏÊðHÔÕxPÏ‹:üšE7³6!QkSð²PrNE…½êGòKûáñ6) 1lZa–s]娌شx“×—æÊ=Fžw›5<1²O¡vXZ¾f|«ºJ÷é6:[«êŸÜä“¥þê,WÉEaApl’#o&–T‰»áhe;œD$ºco[/ÄS5ëcª5Õªs¯:-ìÛÛFë{ñŸÔö¸ÙRÃn4žÕ¬Ú1÷ñ™¸ü$_ªêRÑÔ«Á äY/K*×Ò!.é3ð­zå®%ýLÚuÿ.Nsü,Uj—ÀŸî·*÷à=2þ§å˜½Ó›+w_¿®ÏI½¡ÿ-q ú™—V6ªï­™ì·™äöïìdòD-»¥ vUò÷#† ò“ÅúF”FËT.Ü‹ÕO~!Úò2ƒoà;™&úyÑör†¢ª‰Û¬àmA‘[ÚëüŒßpsj>ÕY› œi¯fúÆUÃ{¿¹Mo¢ŠKpÓ¶0Î.^Þ@Í:·{{d-BTÐëèv‡áíGBp^"—|­Y WV›ïŽNêš¹ÛW¿îc%Î\ü€=`5\¾ýc¤%°i¢jŸÔ"9bPNŸÚ•AàbÓ|yÓdt,Ó7iÉ0Ú'É…Šñ A°wÄ7“ .C¾dcáO>E…¯ðF߸r#Ëk¡ù; ½y©‰V-A|R„7O™ã¶è¹sñµÓöä+±]ùÓº‘_Mê'›?NAÙÎì{âøGöáù—›ô[M‡ XŠvÛ »Î4à¹4‡+t0¬ÃF÷›ÂsðRT’èÁ¹¢ÝçÉÞ†£R͆ÄßÁÝÐæ§=kGþ¥ù•ÅÎø¶&-£á àÿm*Œ`í,Ùt³±µÔÒwohÔxNT™ßº5‡à o7í,¸r—^•z҇ܲ¹­1¸šù•o’ÓÛÛ¬È$I¾4_žÕ¨žòMjhe ß23*¢¡Aç‡ít)ìvô2a¥J”—Ù#ŒZ­/sˆôßb œñe˜-‹ñ /u’è¼Â™8!Àö¼ã”@›©>¦+ ž¨Yj†:TfîÞé’Øœ@,ntо”ènÑ Ì|4õIô­ê<̉Œê  W·z2讦)Xý9-—¢S5òë¶S5 ðÕé”û¡®ì³¢}ÒÍîÇ×gH•Á`ðsŒËï+}&Uf×ÌßóìÉñÂeä$ûÒPõÚî!ñ}©Ë·ÂEùž ¤©‘z³r¥p™ÝfO24äxŽ1}݉Ù>,ÒeTYœq0•e°¤˜±qið¿kØï.lvn•¬Å4:-§A˱éãTP/;æ\â¯Ñ] •œD Æ‚ºtÞp„V¡îNiÔ`hF*ÍMèì ×7<ç+¿|VI¦ïx’'AlÉu¢\!õ°íLQÀ„2}÷i`!KìõÙ¾òÝŠ?TÔ¨˜×Jq›ëV5?¾(;{ßš(¦üÌ´2E’mH߀µ Æ«¼ –\št›b ‰Î¬Ÿ¹fÙ9X½åS)Ã0íl¯©×0ñý Ùg¡ªúöRƒdht„«¦FÑ{ðÇJp’Ó×USqËíǪƂ½`^Ù|§Ï™û@5°¬StWgà^ˆAÓeY‚SÑÔ˜–¼·a‰pÖ+îÓÏQ<„Õ^ ž#£¥z*Ð0ovgC؃Âg*ÎÝXçQ¤~k[ã]âªÊzÒ„u@GF_v–O¯û;eTŒÔýéƒ X^÷wå‘ ddÐ}[a~[-RÂø\Šƒ·/Q‰¥eJpTÎ䪔–ôÒ •«ö¨œ·ª Û®]“€“íØºÞ¶60W<^BkxŒ‹ls#ঌ–ìÎdNð#Œ^Àlqn*tȽl`öÃc­Yמ½<3%ÙÖ0á&˜·tÈ9“g°å²î†ßcv#gbš¶80•±Á½™†ÔeÃ)_é¨1Fáž?xÛDªË«4ù†,Ëаý{âL¥ƒ(sê¢.ËÅmÓ»¸$™Å_Ö{˜Ÿ:ÍGØËëƒçV 9Íhïëæå *8 ó]ç#ÔM‘®äØ!.Dxuž,u~7„×[™™È.í·ÊÞ0fв•ëèQÌ‘‚Ej ª#ý›¦ÛõÁÅlK9o3 •“ØÕy…ßÉ„£}f® À‚ÃëÉ‹dÌcb[¤QÖµ-Ò$#ÜoÝ\¾7 ãßgÃ}Ù`è86@¢ý3ª™£ý«?¾X,~¨|oñïψS @Ñþ[AGS‘ìãú ÕÔ<(ÌuƒÍw»šì÷7‹s¶k««bW qÍi” kŒ³õŒ*ñç{óK!Ã0Ç£Zšø¤.Ï]\Ä“ ŽM™Wjš0Ûî>3C †Z@d;¤mÐv ›†ïI«î@ãM*£³Á8w÷ыƤ)¤ÛËþLyƒ²‰±²³#²­µ*ã³7¯u‘?„Aê¡# ¿ÖŠÙFüÌì‚K5=Ë&†öhô•öÐH_g\ÜNŒê7O y/Ü•À<ÿ§j¹M¦z÷"§j²LÇPyÓœ>šŠ‚û–ŠŸ;5XLëg抿ս±â²gËžìcâ¼ ´K,¿Ù1º+”$Wa^æ¬ç`þÁê¥K5'Æ[Ñ Ùe9o % Û;¸rÀ<š,i‚h_ýÁ•Ø<ŠXã¶MÿOºŸ[„Ù•7Ô·¬ï®_xFWë£sÞF€KYr2¤”²äŽsÙôìerõÐóÜ¥î6²Ÿß³*U«yô¥\#À 3…:yø3—CÒʃ¥>þ/åÃß¡-çä'/ ZWÐ(Óp±G$Ö–?¹Z²ßeî—öÆÑ©²Ù'{ïœüØ“'qVÁ†% :á/¬ï.…Ueέ6ûºÍw›‰Ñ "ÕéÚ¾@È´`“ÅÙË®vµ¬¦Û¸¥Ta†ÈloEÔ‘n¸4ˆ4Ø=¿d!ŽÈÅöH½žz{µ\´aaYñà &r/ÀîTõ®¡#ÙMÍkÃõÕísŇ_|D³pE€<Ýëšõ2Ol û¾ªÎžÜb8¦¾·âž܆Œ6ûÀÐÁ§ŸÖ¶ÃçNîQßíc(ÀP†î¨¾ØÊLK6ì_ÍÖd»¬¡‘ªz³ñ¼¶}!ªSâN`]m¸ áðºÌòõl ô•—ÛÀ{ÜzEµ6>ÎD¥ »½ 3wÑ|çbôZñc2Ÿn¯ŽÎ™Aì)Ø œZ‰ôȹ2 ˜ÄA,¦(ñ£¡é.´;É@¨qÝîø°quùõ ‹× ÕyXÑY¾cjmzó{2ï»nw=…Ö'WQoC¾²aý]¬ã¼V\”H’h ÷árØ„±Eþ‡*x¦ÓËyQ2ý ©Ë7NwÞ«É‹“åÕ 7®u YY֔᫧±î‡Ž¯sTi¡®»¸žgµ®,õœ–ܬG h£>*ÒŒê <¸Àg|åKÿåYÍÁÜ3Šo„»S¬yeª*¦àÄ}\§!€¦ð¾z´H–ÅþSˆ (dBÔ›$"ß[)¸ÚsîjÆßQŠ<0­^bi•4&]Yìzo ±(ˆ¦U÷]7¨³À:,½»í\ LÒ ™ñ­®ŒSÞó-íÏ!œšýù Ý3—=!%‚<2Õ£kׯ»ÙÜFTª«ýÔwF£ä—‡ ËëyeõIŽê*µ Ø”KL§npGKëõË0÷/4…>€ï<œ¾ÄW-WêÞ¡d¤ÖÝ€ñVË=ŒxÆ\A‹^rYM¬(Óï/óÚ²Š÷Öª§ú­½D•å8œ;1¼s‰«ïŒÎ v.1/>f¹-«oÙã•ËÀ—â µ°©¿3§ü—¾Ôf?‹êl÷Ó¥Œ¹ÎÖДƒù0Ô56ïùj •Y±ç&ÂݽŠ[ Á³b‚œÆ¥Û¸£8b]‡._µ9fqg™8BBlS Ý×hSÉ9æŒ fûYDgÚ0Ú¾WDPr\©Î{cÉŸrp“רå\ÑÞQ6tsÈ”+ç-‡¤^Ã2ƒÞdÔ3øçŠýÇý#¤‡6ë¡¿6{¢ò ’XöËx뀚“W¾|J~j0|DÌÀ>ÝÞG µÂÜßÁ&vË iƒEger'Þ[ÎEÜ)/ôÂ6å‰~cŸîH³ôX¯ÝV’Í}JD[àÁ¨ÎÎÛ¿Ó“¥#Ç⨸`°Eï 範óˆt;Ã{U~ÄsÆ6X®j¼à°vO|’@0¦bwë€ÿ“ ¡ ”8#“QA4#ü»À)ôÝîb „WL„¤# nêûó@:w uö»–ù5F¬ñ¶žB?kh,zyg¢þœš™Š¬V5\@¶ãÕ/÷ì\¯p‘±¸†1ÈœMÁœˆpUdÆ,9·ÅÏ$LLéi!5D3¥;âÆšCqüx´{…B=Ÿ: a4d§̧¾¨Õ«Z ‚)ûÈäß¾¾bWæ4t¶¡(—%èeÔ]z"°zO­ëyHÉ ^ª¥`Ø× ®Zë‹W5£•«¤ z eÈ?¯Ü¶z:–ïðžÖzÏívŒL«#ó—TUÁL¾FlÉsh÷Ú˜fVÐ?Õ+K.dž¸s` Ë5úªä4Fr¸™è±¸„d¶çœlZRÜwƒ»Êîb2 d°² dÚþçÑŽ«Y@7ä†#e ±è¯Ú®:Uç{k’ÔM ùDvÙ†z.N , 2=pÖtšr$Ï.¿wûkü~3ÏÆÁrs䀑úäN½Ï KŽïÿäþyΞÿ?9Ž?Ïσÿéùÿ‘ãøóþ<øŸžÿ?9Ž?ßσ?Ï)þ'!Çñçÿyð?}ÿÉÈqü~üOßÿp"r ÓŸèý/§øŸˆÇÿ§yÿËéû?NHŽãÿ½ÿåôý'"Çñÿ¾ÿå”ÿùÈqü"þï”ÿ99ŽÿOÄÿò?'"Çñÿ‰ø¿SþçDä8þ?ÿwÊÿœˆÇÿ'âÿNçÿ'"Çñÿyø¿Óß89†¿ÙOÃÿò?'$Çñÿ‰ø¿SþçDä8þ?ÿwÊÿœˆÇÿ'âÿNùŸ‘ãøÿDüß)ÿs"rÿŸˆÿ;åNDŽãÿñ§üωÈqü"þï”ÿ99ŽÿÏÃÿò?'#Çñÿ‰ø¿Óùÿ‰È1üÍ"þïÿ‘ãøÿDüß)ÿs"rÿŸˆÿ;åNDŽãÿñ§üωÈqü"þï”ÿ99ŽÿOÄÿò?'"Çñÿ‰ø¿SþçDä8þ?ÿwÊÿœŒÇÿ'âÿNçÿ'"Çñÿ‰ø¿Óùÿ‰È1üá?ÿwŠÿ‰Èqü"þï”ÿ99ŽÿOÄÿò?'"Çñÿ‰ø¿SþçDä8þ?ÿwÊÿœˆÿÉOƒ?Ï)ÿs"rÜþ"þ÷ÿ‘ãöoúÓàÏ{Êÿˆ·ÿŸ‡ÿ?åOFŽÛ¿ÙOƒ?ï)ÿ{"rÜþ¢õŸSüODŽÛ¿ùOƒ?ï)ÿ{"rÜþ¢õ¿SüODŽãÿ­ÿòÿ'"ÇûøOƒ?ï)þ'"Çñ·øyð?]ÿ99†¿ÅO´þjÿ'"Çñÿ‰ÖÿOíÿDä8þ?Ñúÿéúï‰Èqü¢õÿÓõß‘ãøÿDëÿ§ë'"Çßÿùó¬ÿŸ®ÿŒ·ÿŸgýÿtýïdä8þÿáõ_>^(/”ûÿ”ßãofgââb¦emg·‡Û›e#½ÿŸò@Ì{„÷_ÁŸ“‹“—‰?/7€?Šâø•ñOåÿçø ÓI_•ÒÒS“Ék©(ƒÔ´%•¤@—Ø!].)DZKúȃÌÁ ÒB˜8¸X»Z;:˜ØA 2ª—Dq„‘­CTØ nb.*lw5Y¹º:±ÃݬÝE.I9:¸Â\Ùµ<à—@fGw"—\á7\[™• Âî*bíâÈÎÏÏ#ÀΉLÓÕÚÕ.ª ÷iZÛ»Ù™¸:"A*‡Í¤líâ* 9 #lgí` ²BÀ-D.ÁàÏÜñ†§%Ülæâr „€Û‰\rqõ´ƒ»XÁá®—@®€?²G€inêhî Üѱ³ƒäàp„‰+Üdê ’>JÄ æsƒØÙ0æÖî C+¹älí`¿qITØäw.ÇT²7±v84¢K¢*À%£ƒ©‹“š‰%\b" òýyl+k@„™•ç$¤AÒÿÅëJÈÄÁÁÑY®?&tT§ÿ@Ö@Uþˆ/ \ÿ³ÑÝÌ­Çå*¡ëò%ciçhjb÷G=þ™4œ€úÿ% ¸²^þÌaÂidç=ì7@ÀUËÊÚü¹ZÁ¦mïdw…ƒì_£èGç ²pDüF¸Ýq-Ì9!æÜ|¿éthtxT‚ dí`fçfní` 2±³î¬àkdãü¥wvv51EZ$ìŠø%+À© Ð8]ÍEÿY èM8ùðÀMH-˜¯gþJé7eùKfŽæpQµ`¾p#aÈáý‘7Äñ¯-P{§ÃRýΘŒ&öNB®ÿÅåâøÿÍøpþ¶G¹¸"ÜÌ\A®€«»‰Ý¨Üÿ‹ËýcÿGZ!×oKæ ,€¾ÉÚ‘ tìÞí¿¸”œ¼—Dåà®*.p³ÿzsã¿$ªà¢ wý//ˆ#ÐÿÙÃ\ÿ Â¿¢ÿžšç¾$ªêˆ°7±³öúoï´áȲxüÛKÁ< L\­ÍþÝ6<ƒƒ~GÈÿ^'Í ýKùXÿËÇõ‡ò!Ÿ8ö.ÿÍeâþK™ØÿWÊÄó‡2µÀÿæÆÇû—21Ú¹ ýïYßñþ/ö)¢Èÿ`ùøƒ åÿb8^ÀŸBàó—¶B€\€AŸÈ%N$UhnŽ€»¸€iI‘KÀpÐÒA„°¶´r¼]€¢è_8HG ð/á„AyAœÜ‚\ü‚<< ('Ç!·tŒ$™z‘X8@J…dc!ð/Ô¨#ÂrȈý(ްµ½%Èaö{ÕÉÁòÈÄÎUäÒä .€—µ¹¹üÈÔaGˆ\ èu;¢I…!G¥œŽ ‹¬‹ ë!í+ŠóŸ¦½Oå‡_ÿÿ‰Îÿžžÿ:9ŽÿOtþóôüωÈñõߟèüç)þ'"Çíÿ':ÿyºÿÿDä¸ýÿGÏòrqðòòqsžîÿHWd: sWAaS$Qö'd•ÄjqDVÖò«± EjsTŒ¿æ…,ô+MD3l×Úhú*Ž8 FÀvþy-úŠƒ°‹+PluÄ&ñ^HUÿJP 3W»(¤›ÐZÌÿ¡ –vÖ¦ÿP@My'ë¿ÒÙÍð·« 1çäýãaŽ€ñ[±»8º!Ì~¡ 5 Ø Y?2øÐ1ç7ûç?Sá°Mþ‹tàƒ˜óÓáOsÿfÌ ämþûŒaH ùÓìCü à†ÿ7Wk»?â_7Ïot@Àòý›üà_¥€Åoø3 ø'?`¨ŽV08áˆø£­öA ?‚šÃà@—í`æ ²D˜8YöµDî‹4Fp„èømäT÷`þ:Ô…ÁªÑßa¸AÀÐÞÄ è+ÿj†0Àï[Ž$Ãd# 8ƒLìÑÅߎ3AÀMŽW6 $ôot:Gu r±2A[p3Wäè P@‡ÊÆÅÅÁÆÇÉÃÆÅÃ÷«N-n ®¿Õªÿ,>>6(?›'0mûÓL€Þ“Kà­æOSàbãæ‚²ñ °qóðÿ½ÔyÌÿºQüy¸Ù P ülPž?/PKDâG÷÷g™@9¹Ù¸¡Hx€r@ÿ4 1ýcïúgÉssð²ñðñ±ñ@¹Øx9¸ÿ4y^àÿ[}èŸ6'>®ÃLø€rÏ¿"‡‡‹\¿µ3¸“‰9rÏò¯÷.N&f?î‘Q¿ßhõËZ0ªB GÍGó—AÉá¸Ë **}è Á¥á.fk'ä `AEq~ÒÖÑÊÜîp‡¸‰™«¨°9ðo**áæjÌj„!¦Èñ$ÒÙ\TP¤ wõ‚ÛvŠ¿ŽÎ€‰‚«£ àïqè-~8µt t–p°0ý{!ûc ƒy"«ÞÜî¯*§D*ö¸v`οM,ƒ\¦üMœÃóNG ï¶Gîœ7·FŽ$MÝ\÷ˆBcåè.L\AÖ® k;;)ÙóZ¸Ù±€ ]-ù«ÚZ U=®„††„ª–ž¨NÀî?JÇÚÞÉÎHÖÃLZ]=‘{òUd4¤äð’ Ê Zz  UÈ*h©Êhj‚d¯j€$@jZ RÚÊÀDXCíª¦ t¨óaÃ2q0ÿUyÀÀ@vÖ@'ïäá<’ ¤¦ôѲî/^`&~¨Ž”£“'²õý¶…šj}è}x¬É«)ü¥B€Ú?lµ@±í~¤vØxá{ð¿xA™O›ûtAùÿ§rœÿû‰Þÿvúþ—‘ãë?ÿÑ÷¿ýàÿ¡§ëÿ'(¿ÇÿïMŠìÍÿyTþœÿ„ûwë?PN>îSþÿ$*`ÁmÂgÂ#ÀiÂeÎ àâzaNsN8? ×Z¿Sù÷Ê?mÿ&NÿtÏþy¡\Çû('ï©ýŸŒ˜š¸ÀAˆÃµ ræºü÷™'ÐŽ ôƒcú%âß§“@?ˆ#Ðâè—˜Â~°A lÐo¢ü)ñúAñ€~P<¿Qòï°9 ¼ èoóKÌ?£h@?ÈÐ2æ—8Ÿwý`X@?–“Êü³öLáþé<þÜþ¹ P(÷ïŸÿ‡ï<µÿ¿ÜRS•ÃáD6:<yi tb´ô3€KÃZ× à‹IMYKfÿà 77÷…‚©¡¡!--MLLÌßß||ƒÑÒÒ$”ÓÈ+TW UMñÙA Š‚´„֔ϩ¯=Fdï}™sL~öΆ¿fÒauT€î™£™õ§‡ªL×ë§] ôgù—鈾µ?ðˆí°õ(“Ž0ĸ+së{ÖÙP– ïQÛÎ_³¬ø¹\"]ÓF­ú¦“á·«Ùi:³Í4ŽazI60§…¹ô.9ƽ Y¦Ä×#Ñ”: 8‹%aÜúõÁw,‰ÏÆ$M‘1´þ!Ø1oáÔtÑwnÖ®&VBâ‹sCiOMŲ&$ÓKSu7¹p.~Ä í•ßM`5ò«ªMò]Û˜ê›ÑóÚ7‰Ëøº+K÷¡Uæ®1ô q%SügŸMÓ§Uzå_zµbÉ]Óvz¬ÞâÆ£ÀINêá‹y~#Åg-õe’Ë8j'ç-KQƒw\F¬i¡kHMžá)IwE覛à55@õôDb(~›Â2V‡X­ê`!$Û.œÙG^®ü‘£FȃՄ‘%ö"– 9‡±òlèkíÃDJMÙ@µ~fyô2ÿµb(æJY­ˆ ˜ gºS§k1omÑÓÓåö5R™æÈ‚»PPo¦} :–B6óå šHIñK2&†ãMÌè—‰)e‘w™¹#Ѳï`©[Qb\¤!9ºÐ‘Ï”Ê*ZYË™R{R—¤£$ç>‘õ®Å\êuøTǺ.ü„HÜÂÂØ$˜Œ8‹Á‹sþæÑ§ºñ•¸ôÆ}º³À§,ÝYuä''ñ ˜4ñ sËO  „ÄH6øÏÓbsÊ@h Eqöd3ü}ú‰K©‹P3²8¹¡8MÈ{m’ÅÑ_ßÂŒND'>‹óM·Æž3 rnJfùϲ…§Îƒ(ÎØG‚ÐUAÎV/ \Ù¦>™¥°³«Ss[K[=ÓŸX¯ƒÛãcÕç±IX[v×??øöôi‡¡>àî“•NÝâ¯ÊÇdšº…!û(U¯68„úœ¦þ hgíÌåa8ˆÐ$uÏÔ¤n–N¿ÔPéeê„÷·âžI&â®^ö"&Æ®èü¸5ç“þ¥áú BâaH„¤R^)½;V#Þ릛”¡ÙL䡯€sŸXÿ7 €äÍ­œdLðn‘†>÷6&F»À‚ƒGeüüR qs‘D\¦L† 83àØ?~)É!)c2Z“¡Ž%Â\^*Ñt“ã¢,U%‡º¼W嵦[@¥õfüì] <”Ý÷g2hbd)Œ¥ŒeÆ cg앚±DZfl%‘ì#J¥…)K‹´)´¢„diSI‘R””’ðfF¡$yûyõþÝO™çyî=÷žs¾w9Ϲç"ñ"¦â/vS 8Aaý“.k ë·ÀçÜ[Iúç'æ']âh@âѺÑð]í:shœá 94!æ'¹p¼}?/ øLã¥qÒ?7ÒAÊ y-þ#*¹ÝÈ¡gÒ¿ÍJ@²¡¨¾Ç¤ÿ…Ììdúsêü”bªÒ,£°ÅÑpŸËð«ô!r+ÎóøÀåÆdØ‘÷ñûâ"í¡ePnÈ˽Ÿ:×\‡¯ãSôºo©¹vÀøaÎ' "×g-´*xÝ¥¤‚-yèxÜô94î~Ø]VxŠ—J@Þƒ‹«KzK¶í>Ls£ $,úÜ·ÉáËæ^}fª.ÃÈt?jÆ·ð6!%W‘8o.<¡!áŒRä,ãà¯ç^5J‰»Qò } ºx)9îõ쉛NÞª‹0 jh%œ)¥«Æé4[¯N†²x©Ž ô¬ˆÁçüt½]³7¡e‘±¸éq•ïú×^ÚKÆ‚ö–Lšö7œ}§$º8’ãW€<âb/9•4"ZbøkŠ €¸n8À=¿h˜ -0ýë(-ªpÏׯFÔ÷p¦éÎ_Ý÷!†IÀëh³ˆí’úvà:j+’¼RWÒ ÌØr£¼%TÖ/ÔØ’CAÀ#› ƒ(PÏÆ*Ã(@ÊU†4àó ó“–[!½ô“èNºìf2.œI—1/óS¢ ã£ÃFdL17k!ô :jgÑûî”T‡™2dm4 Ðo¬¥_oL®ó5FmÙ°3û ˆ_2=wû[¼½ÓX µu~î@“.ªè7f7¦VíYG8•ITp ½J*@•Rg¡è™·à e_¦¥1¯3p‹nòµunf@-nolõ× ;FˆÖõ&TäßUl6çÀªºŠ¢v˱q„'þ¼"AïX‰— %ˆÐ•»^\f¯ t¡†›ГZ!%fp݃{)ΟãµCׯZ¼Óp'+WÜKÕÚâChOðóÊ+hq¤r½>‹–›Â4ü.¬¬é&H²’VÅ[Æ5ßz¶¸ðº23;ÿ üÓŽH–ÚÜ3—áU\¬ yGÑÛ &B´³oaø—yÒ[¶‚¬%¼‰ú™7®5žåâ5¤ï4Çñ¤…ʘCH[»tÈÐLƒ%a»6$Ä‚ÂYê! §·×†¸dÂm\–¸8YÆeþ=O׊ªi, ØvWÕ­M9ªá;]Ì–¹rƒ–zžÚr;O£¢åpè!‘U{d‘¡_8¹¦=z\á^z/3z€"â™Ö[±ÅtÑtÊA- ô€‹;ÿ´¬Õ§ä7Ú®ö2*²¹ $äïï!Ân†»'´çãú¥‰QEÕúJÅ¥—!‘ÙÝÚ7)ClS/_ž™]J •™1W×äâ^g¸©Š¸Ðe¢Z^þrû1¶m± lÎÔ´Î/œ!H š '$¿ƒÈ*ÇYv‰ ƒa·h+í÷¶ÕœÉmŠÅ™5iU±“Ûá]iHᎌ»võÞ¡M[qh)‰ ªa$zúE¿—÷WúéE£Md®Êê3ŠŒÄ.…C—œ{v]g¾ºô /ú83Ú¬CLåu»‘¥ê‹4NÖ\°¹å žðÖ™;2s1NAMëR÷›8‚I5‹µè7îH/™]Ð=Îk½àŸ0¸ôùz.+¿ «õRž<šËÙ¸Óå¥7;íj¡ZY]ñS}ÓÃÎÀ…i4]%“ú£‹ÔA {Î?âÐàéxOà,–{]k»C*ùêq¸Ðúè[qØçºéRöš …º2}{^j½K·uú'¼ÖàÑ ß–Ð’ySïTÅËš­¡¨{iqvk$|÷aæ,}ÄÿR”µ¯_ôþ¬Tšnƒÿ<ìùäZÇC[Õ»*³ùŸð;ØošÝ˜Iе‰æ7i³(+óýò|µ\ó2(Eó*?NâòÛd|^й£øÖý;< ‹®!4  _®…«|šËÌÅc*³ZT_^y×+®¢ú2þ^pðzT}Pî—Æwˆú{+Wj9XRp«»åõcų¢§u*K Ð/Ï/…³Íƒ¶Ê&íkì4 :döG„"ÞvQÁ§4)4ûzø™j|\ ÉÛ+|å)!Âå¦ÐØpMå+W¶×›oÑ4`ÃÔÙÍg˜;òU5œÙ n€?QcçWIì'àíÖ>q>'Ú™·{j¦2œŸ§qøD^ó«UGJ:µ®8tãP|¹ Ä$a»:îìÞ1çËvGö7—’C} ¿t­Ë*ßg¯t,lãÛPе™ÚëÔfíZ'ˆuÇâ>DÎzŽú°EÏÍT.m &•´'Rü6Z-:¸*A:î¦FÊM'\º™Ÿ½h½ŽË¼EB®×n…_›¦:áÉyY~_ûº¤r8i3MÛÉ{Ȧô$þaøŽ¶‚ažˆb±n Þ¸'båH‹”8î–}Ö¦›(Ž‹¯ÝE*ó$ ô»o§< ~žbCV[§•ás{N뢰ðÏOÜ  ®…ÜÒqÝî}¼F‚_Øš0 Îui¥$QzȰÊe«áÁg—zìOâÕL}šŸµöºäŒsí„{Q§7Â|kvXvoú®Äù4=oÏÞ;v>Ô½8îwìJ&?¿¶)´ ¡É×¼©¶sÿEzÏñ´¶>¿“}†Æz}k|Œ¯<¿¼ÍZ Ãg®š­ú„E¯üLÀÍ3„mBº›Ã;ÒË«Ô¼æ‡ Ñ žò¥Àðs„iÉÓJpVzÐ;Wì$Ò”PouÏÄuÏi§Æ }W˜{Wž¶úlkJ¦]—T~á¾øs‘Wý\ï<ƒÁÄø…ÎËú7ÀZi¼ú¡ÉlosWÕÈî8x®¦ÙÖ¹^ Úd%Ÿâõfx — 1ðÀí‡ášî39Î$€6ã†Ìž5W„K>z{¦”³rˆ«Baf@š7ô]|H…NˆZb’ûÑû]š7ÞܧSTÙ¿!y£åSŶ•‡¹.æÛɧs€×ú6÷_Ð Îã{Å›¿[Ú,i@|qÝ_¶Ëo[8v}Lñ­ÀŽ·í·*(.pX¿UŽÇ&^:x³äŽfÞ‡nˆ-(/Û/ö|\Ø“¯Ûø¹­¿÷Ò<¶„>Ínö.Úu>ç–†p­¸+x\|öé«]]W× OsЊÁàð`šCNr0Ôè]°Ý!å°bÉ^£Sø]o¤qm!Ñ©Y‡ì!+5Åß™BÏÎA$°ä®ëxúÑa}ï£Íê ÐM%°Ö5·kãųLÎ{vŠ\]¬ »ý´ž^6¦KˆvÇ&#ÄgëiQCíël­ìn[utg”¯[Œ”ªtk`§ÛH6ÔÚŽ& ž)¾+|QʈX«eŽÕ®„‘,àú¯UÊÂck@à3lU]”Ä»ÒÌÔððO¶A¾Ÿ‰†h5òóÕÓÀÛ×ç³oŸg¼w׺€SD:!^—ñT#@ÈéŠÏŘ—¯ÎÍ«4Å»|ä™um“¹¨t,Ú3dùz@“,ßÀVç÷ž>uÚ‹À»¡âMHÒ¤ëqì­“;¯×éÏ®T°;çaU(ó2]U¿–Ðà·‹«Ñ2–ƒäÔÞœkY¨°´ïVS:wé@J.Nºÿ’ðâØgÞä¸Úç+bØ"µXâô¸¶…áN_l›suIî0•3ëd¨ì]„èåð°âþV¢DÇÃ[9OÅA[fQé<‰dÁ}¨Õk q²üIwc¾ƒ‡¸—íÙ'ž=‘²Þµ.²´;–PÈê“Å.:Ó-„*ŠR@,Zaµ};U…¡±[[Ý*ømýcc%…E1*O<©QÓ­eI1UH\wý˜ù+ß;¬3i¤×;Ù.Ì…åÅ;Âwª\—ÈÙ î]†GC7%Ꚁà,=–ü7¬r%3_]E+ø&œó‡v5²ªLŸÎÍÒóž`)ïwòD@uŒ3´ËS$NòZo¯±ÑÌ¢t+·eÉ ðFÄw–Ö·?IŽ‹õß{eG(…Å6²ñ±,F̼üƒÜî¯ùi(…䡵,¯}Œ`)êÛçQ¸eÛ®¿j0PæB4ØÚ5>…Š›V.¶tÒÎ^g#yëxzé´i´Û ž‚|& °"œ½tnb¤ùáŽ#¥·oqˆÑ.%úÈo¦½oâ²4猓y¥^wÉ«ïÎÞ›2e7s la¼M¸“û%OÔùo#n~K«œìkê«›:w}XX²ÉwMšû†P'‘ߣþ…½î`œ­©ès™WV³¬ëÌ»rÌóe+¼ Ž”Ú´5·³ún¾žT¶æãê~4Œp£òñÒNîû3,# Ã/ªfzÆ/[Ô¦=¢$‰ªÚæÉk²¥äëû³ÍÉè^9/iNo¸~ ,å~¥Õ¹ ºŒØ©1Í·qƒ¨ï\H^ÂNTtæiû—‘Ëœj2¬ÎÎ6]«GœžaE¨½€(Zí"-­óÑîÁ¡Ï’ãðÑ M ö@ye/ƒW¥zÄdÞ¶O62—0F¢Ámšk2yñŸŒ¯²K”¼Ý}a¦è;œ¼tÙüÁý¼yê¡öç¾VJ–2JÉPác9ej]m‹ÚZ8 ÿéBÿº®GçîåvWû]Ý©›òÁïâÁ*•œœé~\kÚ5²„Ói‰½¥Š7jžž;]à©ñÔ4¹*0èà!‡OöìA¡mµ/ï¶y\™¹¯µÐО»{¦“;R]ó¯º&­:ÞŽ\Õ.ȳ ^¸-Ä}áMÑËy·ºKë7vótÖPÏÌâ–ì± Ré\{ñóú¾øËÏ–úïoxDÞ(VºWšÃq2ß¿ä¢o…­f÷îþ–7ý=ý«OŸ>ïÐÓØÓÑÕ÷¹ý3ò<ä¼0äþÝjY`´8‚z\Äö}ºuúôÝ~ohî 4û ¢jýŠÄ>ä<¨‚õîm7<íïïE•Êüy(WfKônÃõYE?í©ïܶûnÿ±‚XAZÇû6–öÇo¢q~ë³*7 *®Þ¿¹MP'ØN¿q™¨­¡ž·øîóÛêW)Í’ÈÏ_Ù~LÚ´©&Lgÿœ$ _é±ûüÁ %ï2ß®o„e,èl,.=k…=iC Y7çòÓTçS¶yø+*œ—}™åfÈÚIKÒ€,Wz°!¿ü|aGræ6û)^Eåb_>ö{$rç¼€1ʵÞè~Ÿ÷ä`šD¼ºåFÏëÂTv‚¡^PRšWV@¡~ãÚ€p|Dzå¶-[ÌÖ‡ž>°b †bKMh^‹i‡±ÒÌʽ/G™j¯wIŸDµ7èa]ó3bO-ˆ²ƒ¢,d—+)²çS3¶7ß%,yЮ¼8Úåml¸×q5®kù}å‡ï k³R’WnW¥»¥x+íÉ­ðç™l÷´›w½T|»%Ü^"DGäÜò*ÑdPÏ—e§§{ƒkt &÷°ë 3ØÓuŸ¶µMWÚ³±ý­æ¶H2g½¾‹¢âôK^ÆW„$ŠyY ÷_ÆðϸB !s0Š‘ɰåB×ÌÎ~Ó.Ìpg­*¶nú3Kd{¹ÉÍz­c‡6Äì€öɯ¹ :sù~S̾>ç¢äµGt Uг7-eeR—UœP+ôª>ÿ ÷?áÖ‡Á¥¥6«:BQo{M¤ýpÍ®4í æˆgnsø+|FJrܦòá¼ó?°ž(þ(U{óä¼KÍå5/§¢'­Oâó y½ëIoÓu“d.¦¹Y…Mx‘“ƒv«Ø¾FŠŸOiæƒ*+VÔ Ö”¸½´d¼Rîem ý'ì&hõÓk¨õµo”¾Ôa£hO“H‹½ãuº;{71éøS!NB”Æ™Í&H,¼8—J‡0+$rm×ô«usYÞ~^V6ƒ©àA• »Ð1M2¯µq¨.{qvDÌ\ð»\ÏåŒ Éº³ØíºÚU‚Ï_¾p°š|νf²t©®/y% '¥€Š¢[ËLX6›¯XÎ)@£„â(Ò—­lØp ‚¿ô¤J±*-q'çÊB¦«Cfí`ÒÆ(zdÂ9’ Ò¬gMCünV%‡Š .˜-yêž /;šæÇÇš*¢š‹áÜñnGìœÏíL޳—ß´3wÉêfˆšI>@ì]¤¾!1òœmBM~dâŠzYÿW¯•ˆKÝNV2²¥Ô!¿ÕTãué:,7 19®dùUk·O3’Pž±H¨÷JŸG·©ê¢ßÜ+–W« rz%oæ]£—HÛpô£nÃâ…ÐjŶ p6i(H¡ö‚G,îhxçÌ…É%²¾–œB´«rÖÏìóð‚„ÀY ÇmËXÏœg e¹‘€îÛ ¡]„L¯îY‹-8ý°Jh$«·´æ´uÉ^«îh³Ž5Ó Å-0«[ÒÈg9éñý[øi=½¥ÇߟÐ%jÈ‹Ãp3ær’e­·<—é4ôºÙ-jrȰ܈ÒÒ치pù%""„¸"¼ºð–Š_Òœr­BSñ„7ý™M}8Þ~é"ë¦v_i^~®cÜ\ƒ®œOÏß9$x4<·›ÎÑ!£#Y‡“˜ÏY+'"•¹nÙª/ ØÄ›ýŸ»¶¾s÷UPOM ¦þá Ó‚kΔãË f<ï†ë‹×ÕEFƒÌ[ÔV–[£à–íAæ )RÐçõÝ’½NÞ!Ÿké•©î7̦'¶A ð&»éÐÚYùpû÷ ©q1oBq[úÖBá¤óþWjk¯ïzm@Ñé©ÏŽ*ž<~*%³U_ÏokL¥üXV<{Füf­[ö‘æþÇ+Kº,±ÑVôú€!Y¬P(ˆ°/|GírjJæ1ðì§Ûª<ÝoYÎö!êIp±·Ÿº{¾[ÕÚ&´ëLñû Å¦´á——´Rú¿êÉjušISY#Ä Y^°Èólä;p‡¯,þB¡Öã”Ì{i,õR²BÂØ ²“òœ³-²ÁwN%K½êƒÉùóœìþÒ¹;ëþòÇe~þÝëµ4\ªOº¯Zs÷|éý†KË ú­VÅâî€?1ÉJà}VR[¸[òQJœÚÕ¶  g€…äBŠçRóFÌùÎK|UB€)JÖÅñoBêâºÃyµ ™µü3æÄKC–ãÑ+¬9ß—Õ”Ó…ë FzÙ¥•NyKKNïC¨‡Ð ¥zšòÒèY‹ýý—>ûˆ-8]c ¦•º: ˜é¥‘ñ–„Ð툽7ÊÏä'‰YãËiï=xÁÏV—,e£­RÙJ‰r†Â):•çë/©éÝuÁ¥²K$:´¸vŸ-ª‘Íz!’Ÿ˜%ç#9²ö™…žì‘ó|±áI±ž²H¾\Ç,—­SÔ mÁ±°@yè¾ç ¾©ö/$à„P¸ó ÷tc°Ë$ì¡É¤9³Ù9#e »­ªÌ[2¯Xl™>O³Ô;ÓVv²ÇÑ%Ï…Le9˶ۘÿöžu¤à•wãW:* êm=ñáT½+}ç¥óÕGOi¨W8ÝX_9 Šn¿sš´ á²×àj¦õŠýðä2¡ú3ÐaÏg\ç÷ž#ZYDAžÁ.¯H˜‘ýÒV g³®?^ÊîÔ{à%^7ñ‘ˆ^…ÙÝ\gRÄþ¼Û‡…YóI†95.œ3ÈçßäÏݵXV-qK¬Ä‰Åᕊ8É Ûˆsƒ¶¾ŽºÈ-mûX(ñ¸ä*ÇÇiD«i„ks¿h^oVÑ0½=ÑÞÇ•(Jz±i{›¦Z„¬`¥4Çõ;FUjÕeš‹îô|4>§;{7(í›Zîsj{g-1ﻜ¿ªCjWüŒ=ßü–<”åœÂ§N^÷žÅKND×.IUïßä1ÿ*œE}ºm–Һ žu3±á;6ÕݾIc¯èF—T Z§xm ÚJæ†Ñüüêš4–e;/à‘˜fåÛ¿Î’ëíöì¼²nNC­ÙšÉ,ÍÒqøÐ¹æ·¥So‹DÏ+ WçO’kŸNv}ÙÙŒƒ”œ¡5«nE¸Û]i®<þëýïí©Vûä\òì|àÐ2özÌb¶³›-ÚiÑlÿþ`ª"ÔœEäað*4t{ÝÂÍ-Tÿõqsâå %;ûÊJ¥ ®­Ø3ê´-H.>TôÀàÙ»Œ­ç/ììÚ×;ñeV¦…r Ò/ÌÍ]tÚûnc‰œ#DZõñpõ¼óX“<©a&"ð÷+7Âð&òÆ3—U÷n‰¸ÐCÎÙoC#íç³V4à…Çæ4Xy¹&ö¸{Ÿí ó}`vUÞx9å].pËÚàÊ ëƒ4\uuYUmUjë>—\Õ{•mKqœ¤^JRdX±> ÁSsiàÎX°¢bÆ–ºŽ ÃÍŽþ°«o ¼j0îÿl•hnÄj·Ê³aÆõvΫ¶oâ.¢/ëS 6b®ÝSWw‚†ã?Î X´Ù ɦ) }'(e3ã¤ßÜÍW<:CàÔÕʧÚo:ÕŒæÑ.?»VÐg›©?O#4N0‰ðöÔãëßÎót5Û•îùácãUÙ‡«œ4$±¿@‹¿ß£Å[Äæ „pægZhFßÙ”„ %iA>šâ›`ËWJÇ„Ã*ƒ’“ëoW+4ëÖ…³±zvd,K{ä—ãô,x•QnZË"‹2Öjç8´¾µó†>Î :¨ý(U) Í~ÍNý£‹¢‹mliy7€bgÀÖâõÀc~›¹‘„ 0ÄðÞžSvD“£n4×~6ÛZìq[ˆuÑ•i—£ñe7RNàöiölóqXÖÝZÙÓl(–v>„¸` wB-'ÉcDã¸î\ðŽÈðŠd| Tlõ—O¥÷ßgCå"!÷ªÝ©J‹ëûØÖÓSo-þ]ª3“ Û‘‘˜|ôXuÎW¯’”!ðjåXÐÂj=ÓšYFnHlOã]铦LpÑŠw^L9QÍmü@ùºëÊ!Õ{‘&ÞŸ±=Ø•[|èL±^н×Ö1᱇¸YÀ;-¤eÎ÷!|bAé±²çvÁ_G]ÛÒ—¿!nî#Ý‹ÓôŠ(ê ÷yßå0ÿ(vÎRîå`Žƒ¾[*b¡Ê› «ü|,Í~ï¾eÕ½°À¤åXP쌥Û@4úñ£¾YiºóŸÕ…ã¶_èÈ;¼ çÚC„Uõ^vÿ Ÿ.b‰:xClCÒ͵˜9I„sŸàéO5‰PÄ2ÌeÔ€_Û}B`ÿå»X}?÷??,öaiÙ¼8öÆó›¼—ŽiåXÑ.žØð¬í²"“;i[Ù`¬ÉJ ›"öäêÜ—‰,¶‘Ï’®ØAðÚÙŒ³1gët;æß¸ _W.î|ìvךý.N¥ply× ¥Mf¸ˆ€ƒ ~ºÚ¦Ðâ±{÷äp:%• ïÝ´÷IIû)ñXßÍÂíÒ«ØIX\åõ$Sìs"tnûdƒ{îvPÚØnåpƒ”dÙ®y8c¢õRnðQ~AJ¡áüü½(Èo q%hÔw>µ?”‚ <'ÔT¿G~µN‘ˆ{íðD¼Š`""W½ ^n: >£›=žþÛ™†¯Z®^vUÇ`[øîçF5“,ªVÀ¢º ëï= DRƒ"âbBtS.X,凲Üóm„ßÚ¹$ö¬t1˜ à+”;¿¨JG r$|9âAãQv9³­F¬K•nIu ^!•”ûC·àªßM—〰bvÝŸmÛ úÚ›c«#¹Y»ð7ÀHÏÅ…Àüa˜+¬Ss3b5ó:M DÝnñx!žI¸wÐç œ¥¯,à~—ÿÉpÜžöÙÒŠ³Ìúøò9–0‚.¿ôô¨„Å>zŸÏ-^¬°ä œW¾ ¼wa{›næž%‚´jµÒ- JéœÉDãÍ{?o\ ¢mdi?¼Ê!ÑeíÇš§ÛN gêù_«‘?£Å)»M— «Üôê£VîŒ{þú•ÕORñ²1Ƚ"vº-øß¶M 5›cAAÖî[@lÓ›5¹g‚Wò„U¹†d^ª€½~,OààØÆ9ú;z«ÖdÉmÝ„3ïžKÌ|ò"Sƒ¯­ÿ¼­¥È«&K~ H˜ +ð䱞î½U۽ѷôaÚûCi¸í†ºð]Kœøxrƒ¶N2¥§O7 O"úÁ êœYdÏ´‡½>½þ2ü*iv´]Æ´ðÌò$èÓ—¬K{$ø"«ë€eø¡‹a*7@J$«n ×¾ËáöZ‹ã…À'8yº§ ÀënL¯:{/^ÿ v1º±Ž{FäGíüµ}oa»fx×ö‚OÒvûÖSÊNÚ‚;lz_IH?à×fgS”úr®ÛøÍ-+tZ£ç‚¡Yq.'6¦íåó0Þc~Þnî3 vµuP¥›áתöMoÜ߯áB±0/9Þ2²ãMÊéÌ®^»4ͺuË]±GæpCLïÎÆ` õ?XVz|>Å-xCr¨W¹D8˜ÔwÝ™…'ÒȰîm‹6þ2§ Ÿ5´*I?øA4 } Ž× ØÐä;Iÿr>ç-eNNšÛíŒ638ÑöaÛV»h5¥)¬Þá66‹×=FÈ}›ƒyȳ—#Úv‰6¿špêuˆˆD~›nɬ|êw Ì„p67¦V¹9š)*‰A>ØzH];7Ú\>žëHf©,NI­šåo Âr­‚ßì_z´9¿Gq1áÞëÎÜB·×I9b14œ5›?¤ AMñ*ì_gu¿>"\Ö¶¥M£¾Ÿúà^âÑl¥NZZ•°¨ ¤Ä%Âí@¸¬ÎÍp{XÐvéÌše¶mÁ}œË¶™ýn³öúàÚˆ†~¢”ÙåÎú÷Ÿ×4óì~³áRo`¼BÓóÅbruQÅ.çu4úZý_š)~ ‰¡y7x­ºêïvŸVTtºï^©Úì²a}÷¢sv_âu<*§á´•æB[,b/7h¤ ú_ÕëØÚîl[úªŽâ“Õw©bf±ƒ¾L y³À§»fÔÈ‘6ô%Ywc~óÅ7*ì“¥@@í±Ý—uoAÎ$m.|iÔkhÞ<l2[r_ËæPÃâö¥!2çtÈyW{—.‚7%*œøâªIÛn ¡¨agw"ØæÒuíò›ú»O @”;¤“(ï•4|) ¸püÍSáómëYß¶eH<*X¥°{[å-Yõ•}*mF)^ï[+Tç@K+nÔ•l,¬õfõû丶ýzKºJì·yŠkp„J@¼6ùÁoZ¿|Þø^;gï‘b½]„{Ù)UžgŸeñt´©à_~t§$ë¬Õž#;Û,ƒdúRS«zx c@»ˆp|™-ïÕ÷‚ÎÖS›ŠëôÊËy!y™H íÍÅ ÷Ýä9 fMØs`7ž÷L1%P]°giË‚hø{»,¥õ‘EòÛÝÍyïçÇçD\b?c,¡Õ‹OÎ|aLÜŸ€¿·?¤¢ø²ûjá8L´äãùÒyPƒ™OûºêJ­Ÿ¾ñÐÂÍæ†9}åéJ'žŸß@ÌC$p]ìig%8˺˜ˆ@äºI£¢GJµgLÌ«­'÷eöŽ]z}ïìÍ+ ¯TšÕÂ/p‹iÀŽ'õžÍŠº¢§ÁÖù8 wI¸Å¥¯§'—‚ß»œ¼wy`ýŒzï²ënr¸½ú%Ã| õP´ÝÍYPó+•-åÅXβå¼öø*ù¸€‹ú†˜½T%£LÈô{7gêÂ]ìJÐp²G«„.”h\]ë¦ÞÖ zLn}§'Lª¡ ûŒ’³-È nâ[ ÷8ßÐO̼A[cíÍLÔ…¨¥ü4=µméKóRÓM”\÷Úµ‰†Ë‚§Ãuž|_AYb"½*í½¶n74Ãbå¼%ñ˜&¦™Â;>KãC-X¯p‡™˜ÚCYv5ôäŸæ<\eòà¦]¼¬* ßÛãͶÔ%{Fi!éÄ‹¹±ò17ÃÓDâÔakhòrìJ^XªW!<ô,ïeNãPzâz#ÖSÉz,‡‚ÒXÐkë6›ó^«Ó€ð"æzeÃÁ+zÓžT§D°@ׂCÃ¥¸6ŠJ7…@_à_Èd^¹E⽌{Ãg:…é™4Ê6“íKAq\²æ60×l!6™Ì„½x¼R~ÖŒp¾•ëÝ•àBV±§ð®4T‡A³ß(Ed ÚêæZ9d-¸Qàl>cQÜéN~Š8û‹Ù2aõË#ôS¸¢x[žT¨âÒ…vq±'ø+±›í39‹9æ{?½ˆí¸ô“éH8’üŒŸZ‰7’Xöq–‘~ÊK!0>Œci,îPø¶ƒB4,×”?õIH`ËQ©ØRx뜎HÔÃ]|`.Ýbáu‹7ÁBšæëàÙ{n"ãDì\ öY,°Nël¡÷¸Úh3$!'Ó^tœÕàmÌß'ev+µŸqaË_XãtüÎÌU÷»^cÉ—ÿØã:æú³í¥Â†_Rt¯âz®?±D)+m™&Hë[(%ÉÕ“Øx·ë=ñ¬âr>]ÓÞÔÐ+á5/™rAµi›‹ñ·µÐ™`=ˆ0-eýLÿgë$u¬%Ò”4MÄÜ—.- °Ø‡©…ÎR\¹*Åu“uW&¡joS}ßjï 8Š–žà»ð9Ë2‰dûNT‚‹ :$ðtÒÍýl>¡AÐ÷û¶¿Ÿ9Í'ô_uÜÔKƒ/õ-¡ÊŽÃ!=~ß«-é’ºz=†úÕeÊ/$u‹š÷ôH?Å…¥À,‹%¦¿œ×n!†Ì>¸=–ª¶>ÛH‚ºNÉrÝýVž¹1Z °,Z—ù9°u€·q3' ÷ÆÍ{BÊe1ÉuÀ§“ĺíôO*Ýÿ½§IwOF° |Ò”£q·ôOV×í:»ƒº9OöæÉx©ÙœL5Hq›-D»lƒ«C(AÂb ´ëÀrÆ^Ò0å©$ýÆf\ÀtïžhBÙò¸s)ºÄ,7-ïÂõ›VH'@1Iê®7z¾¹4uWD‹0c+îZø~ ÃÔLµþKÝÔ€„ íÕ½…ǹμj•”÷S† Sõ¶ì²†kõ<_zðîæ/ÏòTßœ*,8°iÕÝjð„Á»Ðp¤"á^ÅÝB…jÃŽµYø¼ê-nÁyËÅ!gW«Ýðè^ø¸ó¾÷Eò¬ð‡óÀFaæñ&—é=êtßW /[ Êù’ ëkwûVž€áãò–ºuõÜì"ð5{ö¬çl&À<¡Tt‰ÛEæîˆWÍÞš ùˆh(ô3æë­öÞHA4ñ ˆný0=ÃïÐ÷ôòd?UrÛ’bLß‹dj¸ÄàÎ>üßÛ õÿ/ ßÿç4iâ¨`¦â?LD&Gâä‘ÿTü IÃå?‰Î™:ÿaBÒpùO¢ó_¦Î˜4\þ“èü©ø_’†Ëÿ_ÿ55ÿûÒpùO¢ù¿Ê”ü'" “?iÍÿ§æ’†Ëÿ_ÿ3ãÿ¨*Oÿ˜¾—ÿO"Uýƒè¿ÿQ•ÿ ¥¬2ÿi"MvPUÁ’œ0X IMU™ì„vÂ"UÔP$e2Úéøo×o*ýoÓoâÑ4RuxÿB*+Oÿ6!i¤ø£cD)©!Jj0e¤ ©Œùš£HÂ* ÉB?IÍÎÎÁ× (ø[^e #/¥44¯ãàÑÁ¼dª+5`0‰@b€\Jh«2$°¢rH.Чó`DEf%UT±ßUR ¥Huñ&IƒQ"Qj ¦ª†E`1ÿÿÂÈÿþÇýñ—ç?"Q*ÈðÆLá"Òñ§¾¿gÄŒ¿l¶‘e0þ£  àÑ£GGÿxѡώexüG>ì×øf>õ*"¥=-=ëÖ&Þ²¹àÁsv[»J̆‡këmJgDj¶g{´Ý¨À*Îé>wvñfuªÑÙy›?á7 .dûÀÇf ìk«’œ®­û–µ‰ÖºOìdä²ÁÚ@éÜduxhk2KFÄÿî‡ü¾/ffœÉÒbÔÙðm³t}ñ,uz¬–`¼(ø²TÜऒگÉ’¡e‹Kêa©O1b©F¦gÕ?¶zó`MíÏw?½;¿1ÉõÍ•h±7W_òêæÏmMî‰É®=¾Ì?ô€ÂãÕÌÂïVòpÖö˜òÕg©[›Îª Ã÷¦Ï‰óXçý¬2œg*µ”5ƒöo|/ÍÑ­vžx±×ûÞ°èRËP·”« ד„z6Ì]™•ÁŸÜ…=‚J'-αôþžÏ,ø¶Zﮞ{-xçÝûºZS»ù%ÙÆCI„ºmüú½Rz[ŒÒ¦Vc°ïvpcûó:ÞÂüâø ²ý®hÉOþk–½æ^‡¼åpëÖ#ä‡ö‰+ùçÅß´Œ?y–²/°ÃDbkëžb~-7φPY ¼Zõ…‹N³t­,îãKÖï9Sl%Ãj‰‰Ÿî{"Ø"w9‹•Y³ž;"ðÑPº[)u—u^ÊciqÇ7Þ¾¶«ä†¥ñÚô,7]ß½ìÿb¼ópáü+bRN]XWÝÛ·6Ý¿¼´4'mnëú»)ï·èo¸´®sGß*Ý’$M¼Ž5—UUPçFu1Ù´ë);2t’Cvã׊¥ëÅà=Ž4ÊkéñºžØ\òúÓ§¦þ¦ƒ;“ì»d!-A»Y/u6 fuÚûáÎ}q°N™_é“*+xP¨¶ÝýÍ&ßÂ6¼åîÈôÎÆ»M|oXV=Vv<½qc¸À#|åÒõýŸÞ=*dßÉZ"b zååâe‘gA&)gW±h±VL•QÃð¼T¹¤¦Ù¦Æ^Æý!åc„¸¯­v„ú‹`üi[m˜¦s³åãW>µp¦8¼¾ûJU«h“Gz>ÁS¬›ÿ*È ™ÞÄ;O‚¿¯ñYa®A¾„–éù×STžÞÓôÚ/JëàkÕË32Ä?^5ñXÃZçÌ}¿¯)Jh}Hä z¯ÜÜ×ÜÑÑ1ï‘N°ÏÙi­ûcõ÷m=phEàÚ9Glܵìj™çyLêuÇ}O¿tÊv~ßkó¯iÜvìZrWª×ºú‹AK\>ÊáD7áv$|.[R}’%gÝÞÖyh1‹é¡œ†s[S?§-L:sæctŽe¾|O ŽðM¡¤ÒtméŠY²Â-Ûü}¿x¿Ñ´|l~pkÃ¥÷U•Žh7m\Xjé»õQJðå6/‘w1ˆÄÞùø+³d“zý‚7ˆ¥òŸýð0rßû‚Ž=Ÿ[Þº©kæ™:ž(ï~=wGý3üÒ'ü1`bäToþÆ"ÞêÒbLÖõ€Ã"œçá››œÖtìñRL1¼õ¾}þyÅWÉÜegÊ´R-¼“›çÖv\SÙÛ >Ùm%0»Ê|‘ÅM÷NÅÕss6)ŠïXÀšNvéô’qóéy$-½4õýú œHL×ìV›Yñ¹r˜ nÇ65?HÙ™›–µÊóÈyb=»ïþá«‹o| ‚‡ûnKÞªœ]I+¸~ªÖä€téåë½ÓãE¯»q'ï¹»æõBù¥±M¦¨ŠàÝ6¥Å< äªÂש™Šû=ÈíÞ;å×-OQOX…lqØUàбôr >t–@±)ÆãÅ—ÀŒÇ¯= ±WH·Ê2Îg›]Xã(ºµBÁyefeuÙIÆqí‚Î/Ë×°l¶XÕ«pÞ:}¥°x¨íA[3Á•ëf-L=Ò~1Œ=ýú6Ù-òê ‰nòªÚÜ^(œótÎ+þÇӼd#•VøÈ•/zöTB¹v<§³d˧S‡âÌñG©ÊEÙÞ9yËFsó©:'Ç‹²—¢ï,XX >b™~ÑÝ%¸r¾;B•–móYïQšº˜϶À»rEwfÕï›ÑDÜŸ1=uªy¾tÑñ’]ºù‰lbI±’!óî©;¬H»½üýÖErÕª5«0‹UE åÔO¯ ÍÝû¸ºÝŸñD–„¬YØ–Y[ cD ·~þ|œ­5·¡k–aßÂL߫碞Á…Îä/½&pj Þ'wljò/ÛØ½™eöýQÎ7ÜöõÑ«W7upXv?»Ö¦rtQN„í[;9kxÂ¥÷ôr×Þ”Aã“ââ¥69ÙŸH¯•,ä]ƒ¸©3í\Ôã»eŸì¤ ßU;‘>W|“åËMú˜N £üds™îK§^…¬È0>Ú t¤{«ø"ÅY¶CÜ(/#3©¦îôug÷Äê58pºí똡zyKœVú¢N„ɾ/øž]Æû@’ÍYkE­…#eoz³d°Ä»-M>uMê]Bâ*k÷“íu,åkTÜV³½¥&g™r,¶Çï\äÒ¼0ûC1"CL¶ý??'ï¤ÙÎm-ÄgÏïiÒ9u _*{Qš¼,J6ʽ”KçuÅõx—Q{-§¥ËíÀ¹§Ûr™‹_j®xúiIzÆÅt}³ÓìÛz3­O¼›!`‰²|îЯC}V1ºöÃÆûekòŠ®åO{¸Îäœéû3üKe­àýó×CNïÔñü®˜X€ôæƒ{<;ƒ¢Ë.N+4ÓÎÌþXÛæ¨­)T­Û"½û*G -Yaꙣ@ÁÞ2ܑͯˆÑÓŸou:¿;'—NI÷ßùäåÓ¶7GOÖÌÖXW+)PëÚaÿìqÇûÏf•³S·yF.,x¬]r£?­çµ'3ðRR¬æÃ×õsí½Û_>U÷8¦øØ.ÖFc¦ þŽcG T­!dC®Î»K3I5K }³;…¹Œ–*>ö;K£XãïãMãúšß[x]ãÛ®eH#h…G®8 h ÞÊ™¥ÿáXË+½5}¯d– lý^©ÖáÈRLÊÐéž«8¬ÂT!†'›3åâ¾Í‡n¢wªíŸ{ùðé;0×M ¡Û©$®û§’Ϧ˜ë\Pš»J\¼_÷ã‚Ó[- ôíÖo^j¹î½ÆÁù˜£PT§såÑÛ½ÎâÛ9ãÙÓ®µô9,>¼ÓŒ=>áò•ð¼×ç‹@ÈóæG7o¿úú‘›¢‚*²èKæ4‡k¨ž`+–ø(áþ ﹎WN÷8œ\1Ëõ˜Í'ë…¶²¦*ÅYG;_Î[´j²-½=º:ºS~ln:ÝïÞÒtï΄\eÞ¬{æ1€8ò)Çîè–zÐèú*JÔ`ã1ˆƒ£lpœžûS6YaUqöõot¥ìðÙ¦³À±µ²÷(iq‰1*Ý,•…ü° Ƶ·BþÚ#EuèµZŠD½€%«¥ˆ“f«åi¹óSðmÕ7WOÏ|»ó¸ùSó ð 4ÁOÜ÷¥{RÀ¼Om©ï›^LéÚ\©£”žÍvˆæ©¾ú†á²çëºäèå*8ÞäI¬ ΢K­·Ý‚lm*ÆÕTÍž¾×{ï§—-q.§ +ºôäÜï¤8Ý Q ®x}²Ì7mßó2!¿ÍÚ]cɳ"ž]]*&­çPvÜ_ä»–m¾x\ˆ[Wž&aŸ·b¸«4(Ý’Å·ÔŠÅw#‹¬€î-ä#¢YéÀ¼ŽIÖ|X¸*øóAö5ÞóxÍó=+¬ÀG4ßÇ[‰Õ"ø,*“Û…È×)‹è.<ˆ˜³ø˜¥ rº¶Æbÿþ ™Úµ†–‚x.£†Ó{ÜÌRŽ,SJ°ÑãŠ-±.´6Í9…·È1_ >Uë°y±Ü![»t+¼Ù|,mï2Óœkx¹=òófZ»ä\_ÍCpNºEOÍRŠ6t=Þš¿È7jŸär£^„§KæO‚¡åš™V'Ÿç yO²žY¨oFÀœ³ YÀ`žåîœZ¯/9·7§lZå»Ñö9ô‚«ônH;ÅÇêˑĶë×Öt¿$t[®áɹT^}ÏrögýŠE–!é¾B¢É.ÚN_ÌTSÜ Æ/ dGª¸¬¾qüq-™µÖ²’Ü~{EM“õ‘Oo¦-'M«µ<ºÆm¥ûž¤ÛÐÞyŠ;)¡ûö']sÚÛ:]í´¬\ò©›Û××¼NÚ¸5®³õ,¨µµ—¥§bM°ð‘û"Š­»ÌütW±w‚vÚyˆèË›vnZëç“ëÓ„OPxþöÆ–cA:M¬»È³áVDOžÃ­z( í¬m±–3KߎÃ)Q£«c›Î²µ~fQîh¹6}“¾èŽy,é{sîìyÚM"¤j±šó2Áª{ë„<>±$Ù|©t‰ ßÀ#ý×:Ë=¹–o©m©2I`Ivºëfáþâ‡͵âê’ËA¡ûV­8€¾®óœ»^©X¼uÄ…Í¥;|díb„4ù¶ÍkÜÇ¿‚– )1¬¯N¿!’¾b%‡eÄGj¾¾ã~ç¨ëÎ¥p¤Ô5ê]Ö}¸G-•©…¬[¥Xœh×Ó%‹ba¢øˆ^ZîÅc²l¥è =ÚAÚ­«úä$næJZ.8“Ô•©ô¸°ËfÿÇÆ”mü+ZñõW¸e$¶l톮¾õ¹_X²h†®äi¨ÈÏ6XiŽa«ñŽU _FtÛÃ%FE”PM·7'Ö?å:W›²£zŸùŠªßšìà ·^ ×né=ӥЭÔzŠoya ÐDÕñŸIZ!òFã²XŽÿ ‰úº”ÏÊ øúbއºìÉàµÎEuŽéKÃx·¯_£ôÑ·#øé}cƒ+lëoЉ¦ÒëW"ÇÇ·¢òŠR;Ÿ20¡sì?ÎË›Äa½-e‰ö~fÏÅÃ’z¯áÝbÍÙ6Íç¶9*¢Á'=q_³.Q› çŠ6‡æ¦¿êÓ}8±þ¥xs¨ú«¥Œ'·«½|`d­¥(µóIëöwAïï•îvØãk˜þžÇAƒtmáM¯tjל&×c-W—d5ø7‚‘^á PYÙNÇb»³«ó_ÆðÕt¾¿jDµÝ_„dá’Vµ\9)ªöªo~;¨v¿­gÆòˆ çOù­Î_åÒVfñ ÷œ®–óØÒ÷\fz9Kí~Pú³\­ý\…G=ª‚õ·Ô^™'A×ë5½žíÖrtíº˜³P÷ÊžŒçë£HÓYÜ¡¿Ål÷‰#n–Žuž§wéc¬zg7œRg©³¤(Z &ïs;qÇÜwZƱû'Þ­Ø/º:¯Ì ëb3§¥Eçá \O¨þŸîJI]l‰WÆ›ùÝ\Ðø!kzó{òkø;± Yr {s/ƤN«]x¨à!:m¹‘@ò2i)›gÉÎ,9(áu%Ös¼M,é£4u°äßÐ]hâŸ@k³¼´çDköîàéW(h0Pš‰â¥×ÁÓ ¡¶´ï‹ç¶Ö¼Í\”ÛPÿXàka·Ì!Ó8ïٲ˂7'žÅÖfµO§©¿èÛ­Û|¦ÕíXõõxýükb4‘'Ó@ñ¥2àtò"kmœO:ëÖ\J׫ÛH :‡‹ßÍç?b+«{Òüξd#ó£EÚG‚YÒëätl:´1{{´uOÒ®-oø¨p‰7â|m|èÕ&‹©® ɨ-s̳% â?é†Ìƒ© VÛ•,J_©a·pç|…%»–¼}Rø®?¥µOo¦—óÚ¥A›Ø˜v’aF“Ì× Ë¤ï­.Ÿ_õß{êð–Ärn¨šÚð?IÃí¿ÿªÿ§ ZƒTAª2ßÿ+M½ÿŸˆô½üíÿ$×ÁÓ­þ_Øÿ•T0Lû?FY V¢Ÿÿ©ŠTbÊþ?ISÂ`©¾år¼!ÌÄÒl1 o…[lª“”WT´VÖWT4°4`Þ@+(!a–ÞDWúáÔDŠ¢¢áúQÏŒã—5]ÈD’¶¦;™J„ш–'¯õuõÓ’Ô÷ô ’=¨ò–^dú‘òŒ_Z’ô·ƒ ­Ópt!zû©Z®>žòX,FMÉ8Þ•J!k;‰ZF×LºbÒõRÁF?ffÎxqéáHÖTdæhR\=Ö ?Â}àðiGI˜7™¢%É8)ÛÇ…L¦J¨ô#ï¢?À8PšÑ–ã¥%äåaƒ‡g;À ˜Å œL-/O? ÝÕïëùñkç`ÓOåþîʰ*¹]=ÎÊ6¾2ØÆÉŒ3¯ƒ`£çvqjãíè0P„>ýQf&_o© ¢‡‡'•Þ® ZìêCSôSâ|òÓEò»Ù}=éúäócÌÈîäÆTŒ3ÅÓHù±¿S†Àÿ¯%˜“)t¾ †Q„¦" iºÊ#µ¡ŒÀ–.äa§½ûÀ¨3NY§çƒ¹=H€º:«k:xkC†TL^5úËn"I‘q@Å7P0¨3jüýez}`ßNm—²#Øt¥næéMVPP ?Ñôþ;z’ÈÚRÕ„Í_ëëIÕ° šxE3h*2aÔrħG©9I‘„Â|?ª|}«,Ï<±q  CyÊxBÁ…^É^Œ" IúÁŸadâÀ½Ÿ‘epËt€(‰ìEtÈÃ1æìMôraHu¸V¨Ïk:Ù[[ÓÕÝæãíø­NHE’šÊ£íà{vI˜ƒ§7‰ì­%©$ w¢ Æá쀋’0"èR.Gq€D¸ ó ºÛÏ÷‰Þdâ,r"ÿLLLÁ|\ˆô¾’îLAïËÚÌFª¢*„2J¡†úV—‘HŒâUò“²•²‘h,M÷QEZúXP~B˜v *J,†î`2*™Ñ}U~F­‚@!*j”²ê¨FqkùIéªÊhFõ±hå_V$˜Ÿ‹UCÓ}hj*@±ÊC‹†/¯4Xº¸ú è¿‹§¿ÌßÅÕÑ…Ñïù}½DJ @Ðß~ýõ¶Tz^ú“£âDë³Rà Ùë÷ÀBÏð›xùšeD^*}2vhÍ<éÃú/ᢂÀ`ÊH‹UT@ÇIü±áŽ^^£"«h(zt=# @ÿð¿"¢‚B¨©"0(,‰Rþ•6«ýx ðЕÅOù¤Lwú…þ¥R“¥Fÿ„È/›´€=…ø†YÉ5¿£‡zoÕUrøxbì £ÿ€Ió2Œ>ŽÀ<Õž1kR‰Àaˆö:’)/"‰Ì ¾ýöñ":ü¦ÏŽ˜Pª"óÃûÛ%€ýQ-I”$cÈÒtA1gTôù ð}¤,Ì1ÓìnJ%»/&;Üñðô ðÂÕ(ËÛÕÙ¸è7ð“ê à9‘aN˜…þP”ùðlžTª§ûЉñšä iÓf]ŽŒ&iÿ¤ªô˜eò‰1Šû0I ‡1hÃ`ßkÀ¯j:òl‹!‘!PdÈž>Ÿô¦³…Ù ædd„fÀ¸,> €Êz»zÑ§Ë iB&Å“ P>w@M©Úš$࿃¶ž/ÕX¶i*:ÐçÍôË$íÅÀbfM¦’)°ùÆœY ç¤P=Õ)À}Æm]Ær[‰ 5Îd`¹¦ý«'37gª  Ig4‰2bå–Y6¯’òÙ €EÁð<(%¤Ò<ŒñÐËÛÝa®ô!ЇêíêàK_;ºz0ºO/úØG¤Â\©0W æ@¦YN¾ xfmji²Ôʦ·d9ÌZÏÜ\o‰år àI€À]²™YŽ«»Å(ÖŸè ¬Ê©ô¾ÅÌÐ\ßx^gºØÔr9}à52µ\bha3ZjÓƒáõÌ-Mõ­ë™+}süR C˜å× èÊ·ÊÝ,Œâ Œ> _`¦ë (ÎÂÆX<½¥³ “ÕÑ÷ô  #f¨>’µfÜ^ Ì–M𦃠¸ÏÐR Ù”ÒèÙñØÝG@€Â@HzA"y“¥fPÖ’dt(ê0F·¤Üöq'R(Úƒkt `3࿞—7 ¥C¢Õ•UÕQ(]R ŠÃÌ ÀŠžÙ5 öòtû…º¢¢¿¿¿ÂWÓ ]ŠŒã ?LSdLEcÈÀɯ½¨»+‰D!§0>`FÐTd¶¸Äl,½{°@0 %Úÿ+Ïäáö¿I´ÿ{jÿáòŸDû¿§öÿNH.ÿI´ÿ[uJþ‘†ÉŸ<‰öOÅ™4\þ“(þÓÔþï IÃå?‰â?MÍÿ&$ —ÿ$šÿOÍÿ&$ —ÿ$šÿOÍÿ&$ —ÿä™ÿ«NùMH&§I4ÿŸšÿMH.ÿI4ÿŸšÿMH.ÿI4ÿŸšÿMHú^þŒ€ß^Xz®!{È»3½èÆí Lð(ñÐ(åAÿ_”*#þ‡ÒTü¯ Iÿ/Ó—Æt-òöòö8oßáýápMd¸úºúÐßöÓ_tÓ=(d*ý ¹•þN~ ód¼zÅýBX}!Gê}ê8ü"½~ˆ×ìô׿D øåBöv¥ëí×þšîW7àcƒiR½‡xèÐk'Ét#o¤ˆ(Ií%Dw†Ãe¾úÖŒ¿À‘9X*öÂÕ€ÑÝKƒù 0Ï`*]Ͼ^¡ZÒÇx úج±OF_ ùÃÛÙF™O3 KC.2F¨ßmÆèÞØæ+EDKji:ƒ&³ùl ½Þ¾ŽÀtMöýn·Ñ”ÐÛ“ `˜aýoõÐÏÕ›êK¤Àü<]I0Ù · nsß1ÿ1v›~ 0{]zÿáðŸèH…™ Î ¾îOïDü­y sÇ  SößI˜`;ú~k³ðŸucï>~ tƒÝöŒÊ0ûÙo<¶¤ÿü®³EÐÙ2Ì’ô?ô/Cddîé/ɼL¿Á,{ôŽ{¨l ã¿þB⛾ÿTÃeaß³6¤,ºô^ö°BáCTñgYèAÏ7PAíñeÒ”éo„†[‘ô­ŒÌnàË0Ë2dHµ¾ñù†Ö÷{” Jô›1?ÍÃ%:TQ¾°Äg ã>s¦>6|ÿl®9™êëíáóÝ×!›U‡ñm@ùɌѡ \`î…kàé–ICΘÅ2vÄ3÷-û}`ÎßÖÛNÞžîŒÞà ˜ zúÝ^ª®éKa,õGëŽéqgT¿ ßÂh3¯(˜k:FQÖüŽUÇ`¦ÌïSé¯HÃí¿“Çÿ{ÊÿwbÒpùO"ÿoä”ü'" Êÿóîž~OþŒó_çNÉÿŸ†ÊŸ¤¤4Y𯂜’ÿ„¤áòGNùOíÿšô½üÚù=|<½×Nã§ñ‹÷ÿJJ@Ÿÿíý¿½ÿWUÅ ¦ÞÿODú{Þÿ ÍÈÔKú ~*ô”À$ˆ=ŠBŽÚcÐ7®YÊoìSþ9ý°Ï‚Y›Cö1oŒ?.4…ªáC%¹z*¸Ðì™ù$ÅÕaŒzíÓ£doo±Ñ§Ç¼ô¦ŽéQç±VÔHuùõƒ¿ F­¬HREŽ6ö'Á°=™ÅŸ‰„V$©¨Œ0Æÿ„ø€fÿ!â(EQm¤ØÉ#gÞþSÄIjNCˆûR¥ÿ)mÆÝ?EÚ h:òç¡©G®ã!æ3ÿ<ù`5ª›0$£GžŽ5Ôò ¥±ÇZþ.ÏŸ ¶ŒB¢!¬•ÑØïBXD©<2F#€VRA PhFYÂ(ýùÈá($–9\üeäp€ENJ#hø¨å3‚E£ÊÊXü_EXG)¡z”xŒ*3,Lü€[Οñsù_Ôý÷ÇêÿR€]å©»“#À®SÙ=†½œô¢ø:LjK$½†½uõrweFðxŠÞ,¢Çz”s¦ú[º}²l°¢pv%º3¢RO)¬ùö”®“£«‚#ݹ槷¾ê“Xß¼³ z8{ú½I#’ñòùz[— ,-©dG&‘ŸÜøFâO¿ F©N½ žJ“7 ·ÿ¡&ý5õþwBÒpù+OùO½ÿ4\þèÉ#Ô”ü'" —?fòÈ*þó„¤áòW™<òŸÚÿ=!i¸üU'ü§âÿMH.ìä‘ÿ”ÿÏ„¤áòWûwã ÑÊJH$CþJSòŸô½ü¿Ù÷ÿ€ßÏ×4ªÿŠúoþ?ÊôëHþè)ÿŸ‰HÿÏ”ãÏ”ãÏäpü»Çã ýý·Ñ‘üõ\XO/²‡‹—+ŒèàŠ ¿gtýa»#ž$ã¥ã(¯‘Š$Uå_-ŽðR‘Áú+(Ow2Œþ²Hø?(„ñzy©¤±yÐŒÑçWD†¥bp¤Ù…bzŽŒÙcã—®†±vØ`=FßòÍÝ)ƒÊÐÃè':cT($…F!PXìweP¥—‹TBƒÈX\%ÆáM¢Æô•@£Té+¡4@åû#©qH.ŒÐ0YÌX‰8{0Ü~¨ìGµ[ëKöîÊÀ„Sƒììàp2q 3ÈÏÿ$öËÏ–ÎR̦´‰þå¶âOÑc¨$‰¡¡tüyÀž?­ ¨1ë6ƒš€ú¦ Ì™Õй-Ýý‰yUFFæKÚA›Ašîˆû±ÑòÇx¦ü;øq¤xúÙ¦ümLŽL&p(3ÀÁ¨0£Tñï×|ôx5=ŠæëÓ™7aª?œÚ„è>æwtß™LeΆ™‡™Äúaèÿ·Jÿ?À€Êx1 2 ŒÉTC:ÿ& ?œ$¨þH®>Žž~do;`1Å0T á¥ê$†„*?Öþÿ6°ãÅvl pÒü+#' $?§ÀXnPì\=œ<Yû½•à§Êɘ÷.öt6²O®©<¸šb6oLhKƒþ~Ì×ö€Íö,ƒ,È:ã&råõ=É AØoY!|˜*Huu´Ã!¿·CŒ¤Ìðƒj9Ɇù6° ´îWk{þ~|׮ͮaÁPvK€Ñ9”}OrBðõ[¶ "‰D×@@¡¼‡L¿·jü…c?†6o a_5d¼ÖähÖ= PwC:§' b#ÑœŒý–Ed`õÆÆl ù:«b4óç—¿•0¶ƒ—ÍIÞC~xQ¿ÞžLhV:š'ëþú~5^ûj4ûs:±ýÆH4'¢ß@ý–eÇ‘B&zÛÑqò•¿6æL"Т¯¤™­°ÿQÄŒ×>ƒÍ>£Oç( ¿øªú;‚‚•ß²Ä ¬¤§p rq̦œ§'eRaGyèúÐçÛ)cãoÇߥñÚ]P£Ù]˜‹4Æ1n¼0NsBõûþ? j,¦—AMœT“Hfè$ò71õŸÓ×Ú‚ú…É„£j$š‚ªß²· hŸ#Ñk+Çbn¶ Ñ'z\)€ª}&ÈT‡‚ŒÞÌßZ¨¥a?æÆkAfaêÿ7Nôbj‚¾ß²Äx“fTtg'Чÿ kmŽ™L(cÚC~hÎÿÇ5–òx­Ê£Y%Ìé¬Ôzég' M?%<hRþ-û½“ØiF? ÒÕcÐ×Kù7ÜNè,ñu~ÁœYàw8Æè>¹k†pz\Æ¡_BLò×2hÌÈ£,ƒãcÇ×ü¿Ó㵡é!ô Uft©üKcïpÚ‚çß²ý0}‡çñ›Œ¾c‚#€âÚþã•ÉtÕ‘Çéô?Ì—¿¿¯u =šuÊâ_ìF£=!=Àoï£ü÷öüÞ=f+•>Õ›2DÅé?;#ÒÌb~;*ÏȘŌ٘õ3õ܈ŠÆìùsˆýÿƒ×ñÚº0¿ˆèó¯àõgt'¯¿íåJòÊ3f×'S’÷ð“.¤fÐÛék;Ç„ÈßiÙß¾ñÚ¯0¿ðk`ÜD”ß“œÌý¶¥Š®‹ôs ìè§E‘½:f3Õ÷ ª”F?$ëÛò컽ÿÃd0aPŸLëZ f^‡ðh\°ýã\ùû±>^»æv­aÌ›`Ä@xBpÿÛ1‡¾êô WÇlÇ«jO®áw0ÑצÿQÿgGäñÚž0¿ˆU4Àˉ Uô=É AæoYš†ª'ðe™c¶3U_'4Õ~€&ðå¢ó¿‰M•ñÚ–TF³- °î_Àç0²Q•ß²,‘èY¿=UÆlT¦²“*LóÑÐVþ>ÿ㸯He4‘™2Ñcâ$'oã² 9¹’)ƒ#¢ÊøLC?®³ŒèÅþÖÊŒ™c2Av¸i‰Á¨ñcöÄš¿õãµM©üÚ6ÅàÛ/U‡ÓœÜÿ–uêë|ð;ÜÛ.ÅÔÍIµ(UÁ ›ùޏ¿jÛß¼ñZŠTF³1'œ‹¼‘hNòÆebèãÐe¨Ê¸mD“|ª?‚o¼ëÎÿ8þÆkRùµ ˆÁ¹a¡ù#Ý ÁáoïŽa·-hòM\wÆý‰ñ￉>ÕñZyT±+nÂG¿‘hNêTÇeߎ:Õfà™¼öÕáöž?³xüoÛTÇkÿQýµýgb9Í AäoY€\<©>þD/;/OŠ«c€#PÚ ìªc¶Ñ‚ñô¥N*ô1M7#¶plÇZŽÖ¦¿iãµ¹¨Žfs1arÏ`¶>ƒ×†¸ÑhOò~;ÎÑ—êéêáCö¦2ÎÉ”mË?1ÆLF  -ú±A# í?Ž«ñZTTHà­)ƒ· œÈÉåωO²~;]Éë¨ÞDÇ 5fSËWMTÆÕÁØC#´ò·F¶ÿªUEu¼VÕ_Ä¢ÃÀÉð‰áèÔ'…¿ma…c?2}yjƼ‚Áÿ&±ãµ¬`aYù8:õ‰@ ö·c}]ý ß§…³ÅÅÄgnÆ־1áî-úû‘7^ ö…–W¾+rDº‚¶ßŽ"ô´ÙŠòU7'ÖckÿQ¤×‚‚ýED i?£;!Hû-ˉ7y­/ÙgP‰Œ ƒÜ³‹‰Ï@ü‹É„7ÌÀñ'#µqŒ ­U?êÆk_ÁŽf_1gò{LNà¹(£Ÿüý¶}ÅËÓŸìýý87f» žž{2N,M+C8&ÔýºI?òÆkUù?öά‰kí㈈²ˆÖ«X·2Ú^[+²ÊVѺ„!ÂH˜Ä$l¶ý´âVµR«µØ«RkÝ­¥µUº)´¥ÔR·ºoõëõÓÂU«Rk+|g& Ù†dfÀ!á2Ï£!™å=ï{Þß9gþ99ê@U1ÅŽÍq%‰UVX£­¢²FY=1KLg"Í$ ´‚´ŽÉ™„©v"q ´gäVÙàLB[+A19*à mÅš„†Zc¼†ön“lbå*Åq%5ç\Ÿ?¦ ŠÄ‚b?V“@n™i«(-rHCG±JUg¢Ð$¨´ …”A¦ÚŠÄ¶ÒN ¶l™ié+Æ¥ÍÔ°&ÇWʪJ"8Íùt‰^W1÷ÚhÓ7®OS=EbOO1,†G5ÆÈl²BmõDÿpc«Þ²zBcäØ^‚”Ô.+TÒÖSZ ’²šâ:Tš¤•N*)åC•?Ñn?Ù.T¶d—*iÎ`1ÏQST)k,æÉêL'¯˜»G›¾ÊC?ÑÞ¼­)ëYœ°Bf•Îhk-R “¦ÊÅdˆ)¨”Õ–p g¢¸ÛÏQÊC4¨®Ðâч¦3c9æ\?"¢GJˆ>ž@¸>× UüD»#ÛxPCædstÛ¢mV§ý)[¼)Ë;äYmµæ‚mz†TÀÌÀm—ç—ËT+â:xŠT{±ÛnÜriéE°,Û–[.e©ˆR7wNND,W/™»ßvÄÚwØõYeª"qí©Há²ìvaµ%»¬°JKEÂò³e•²€DžºÎÛ©rùÍ˶¢ÿ½(S%‰kOI —ËÛ‡Ìì²B&-% _[Ì–LÊ:’ëö¢Âæ¥Õ:{QºÆT‰âÚS¢&"Êvaµ%»¬°J]"ÿ¤9*¹®­Ô¢Ì>5<Ø™@›ß }o]wJÅ[×§”©®Äu´† †ácù–ÔÂ$+lÒ_­†ŒÍV IÖÙêLdš­aóXÈì˜\ò˜êE¸ùÖJ“U¼Úó6‹ë·L•*>¥Š¨”æ@¶O“`kž•¶™~¥!EÌZ¦ºI·†ä„°[©Wú´QOîÈe×§—©vŧ ]¥UÁ6´VVYa•–fe•ªdýx©W®Þ ÉÐîìÇO3UÅøöT1 &Û­oÉ<+míTD®+U T+mús¦Rþ6VM'íÇÅ–°[€é·P]v}z™*i|s©Ì‚Ø>Ý9¹qVÈe¦¦Y&.YïÎT_£ÒYÂå̽ºÄè­ëÝÛ:B.ß.˜êt :šíÖ¹;(-…€–ާ™nÈý X–«6¶~çD\ ôª›w´8î 2ÕÈö4²d<Òz•3{ß9·`—Òh¯ eÈD,[ªÒÈ)´m¤Œ¥¢˜ŽÏs*ù–sCLηÁ ³=w]ŸS¦j˜Àžf˜£2¯¶'‡Øf…Tzó¸Ì{ ®2•ºÐÝ6’Üpºˆ@hÛiÜoX;öìSÅJ`w—©wò#@=´G¿je™^iéTf ‹bàRiŠnšÍ%[ãið¶s.—Mþ0U ö¨f&bôqgFkì°Èp—Öåš¶ çq¥ªXŽ$œKOXOå"ÊØF_SòÛåÙ2U‰„Tfs±c}ꆥU6¨2Uðµ2MÃ]akgq9œBQHïlgÿi“=L5"!%h vüéLl>ö×¾uV˜¤§Y§©4F1S¤iKFÎD"ŸœDÂÅN–'dªýíj?dĈ·/ƒ%`…CzÏg§#J}–æêG`¦p·V r&& l³u·³´É ¦jÐîS܈ЛôÙ{–[‹–Yá‘Ù¬$8”\¥TâßìIå¨ÎPš‘ÉXøÁWÔvª{J¡Õd$2¿!jÇS×'”©$¤0)É}¶ï#mì²B'í•(ÐÉX Âs֙ؔX~½Ù¦lvL2ELõ‘ƒÚ…Ì–ì²A¦ˆ©ÆcÌPSh]y®ÈFÖ1ú×y'É1UrD””öykÑ2+ÄÑ[Ç[¦CóŒë.˜ëÊÂȰV·¹g”ñDLõ‘=½&ÜeծͰí $2U•ÄvU%"ö¬£Ø‚YVXd¦-cE«s‰[#1µpÏ—ˆ€1bÍ%¢CÌÖÉi¤äbÎø“/±„dpMãw_¬†Èå[ƒP¦*W(• !û¿kÁ2mB(sÅ Ü?js•:³?å+Ioù€%ÀŒÑhcâøïú43ÕÃB)êa†¶Ï=µ¥iÒÊR)µj\ò,ÞØ‰x5 ÀøûñWõæ4>2-9&N9%2>%6!Z ^’b"“UÒܼêCü4‘MkT?Z( îž¾æÿó„¢¶¢gb37*Bò@­T) -:±)X‡ß<ƒ?²4¸£úZÊŒ*µ†º ’ÿ‘C ªÆ¯Nd„wJe‚]ŠÉ”¹ . £C4™° t*â•Á²Ô(g ŒA(>fÀŸØ  ŠExÙ 87X.æ{ÍÓœ:ˆ¸ÙGDËcrH«ÊA I‰1P8ø—™‹ÉpƒZä=F Ü–+!|QEX¦;F®Ãy ÏÕ„…5&ÿH. k´P¢›‹(¡áJÝhPB}±r@TtªQJ°?ŸØ=>W‹h´}›©Ò(†€Jqt‘ ÝhØÄ+G®$-Üp*(¾eéB8\§M„uˆå9¼nˆÙ9)Y¨RkT œ?å¨ÖжËA]u“ªüë Tå£J%”@À—Ì\e Ž„ÒbR&%¤¦@áñÓ ´ð¤¤ðø”i£Á‘ œ`/ž‡úÔ5‚ËæÃ Œé ñº‹LŠ˜ŽŸ“2 Ri ¨˜”øÈäd(*! ‡ÓRb"RcÓ ÄԤĄäHD”™H=¼š…‡5¤DÁ¸T läbrDÁЄä‰VW¨lÞÅ’„(¾– Š),rXN”šØòOžæ€àÙ j dˆ€þjøé Ýs´<¥p @‹5g"¤Væ*@Aia9¬ÆCš©Qå胡ÎA娑é GánÁX¶çgÕ¼Wå€Þp2Œa ¹Cš:â(NvóQã3e(G†·_-î2æœÞN"Šh@ì’aL¡Ê…5rR3j­q÷x0ŒÒ!²,½‘vXšÇä…PšhI/kdø¾–²»»ÙP–†hé†áCIX.'¬u:¼aÒh°[›+•c£ ÑÀxµ€ªÿÂÕˆ'‚¸‚Q|Ñ(!ÂY!ê<Þ¢Z3 õm±w³Y:zTpp~~>ï»Æå FAš(ï1hh‹5²æ&Íp S€K© fød˜±ÿ"Ç«’A,S6ÌÐEB\Ž€#àë½éÅõ •¼ÅmŽõvkí&WɈK7$¸Õ$ÙBÀ& ñW®XB¼ç Ä«asãrù¡@$ À~.OÄ»AÂÇQë-´!ÈM¡ReÚ=¤&bw³¬®ÓÔ?/¤³þÙØ,ëŸç<õÏí¬66Ëúç·gý yžHÀçêÛÿNþYÙ¬ëßæþ+ žÃ1 Ü\¡ø[©Ų ª“JÁ˜\ÅÉ‘;¬&¼‚Eúú&¯Uýó„!b¾ÂFþËëf BeHh¨\$ñE² ¹æ `¹L KxrI{—¯s{¼[ëù‡ÕŽl8âŸgÝþó„\·“6¶ X‹à²*¢A4Þ„Xñ ž "˜<’äzAâóy|üþ94/ÏÌ – yäg¦êP¥áT~`(8QÈ ´þ¶skÕÖjþ՘‘ ûüsù`´gÍ?/¤³ÿge{=1>º§÷@œÃž1“&&×[nnîR®à/Ägýið”›ÙØÔ½mÛ¶ÔÅÅÅiiiR©tܸq—/_>xð`iii@@À¼yóÀáMMM¼ò’_Á_]tIñÉnãÿ}6ÓÍÍŸ31<¥`}ý†ÃyçØW}4ùâþòÍ£Ç.ü«‡â윷Ã{6x,ÞwbŸ`Å«WÃù? )/ÂdÑóÖ_«èíñþ§ÿyékÿ÷}óo=ÿö7ÃKß<›úzΛÞf>°Rú?{fžžñò÷ò3ÛE+Œá¿W•P|ù¹î“ý6Ö I-\~·á㇞ù"eÇÃ>0;ì•—Ñ}ýÏ?5×_RVýlÖŒw«ŠväzF¡c~;Z2rÐáÝG«ƒï_$‰úÍýÌW?†k°ŒÛ±M?^,­¬¯]ú³ß#¯0Ÿò·eGË׸®ðéV¡˜'¸ólù¨¦Œ¢ÚçŽûw™uoÏ‚ ìÈn¿°È£WÀy#jÑÞ –hëd÷ÝW¼:Ãóláô^ ®lß8U—£Ã*j³_èÒÖ§oû®¼\É©èÖÏkm: {\îQPwéá¶×eC=ÿ*Vùõ­æ².ý}ÏŠ9÷žs*`é¢ÛýœÛÿÛ´ÊGsÝ÷÷™æÒè;¿g׉ë*’÷­òSëëÃ-ùüvÆÐ—ª÷Ü«‡»Wb•+ÿ,Ý'¼q\Ê›®×µ·¤ ?î]´ÎgúwÖÞ”7ý_Þ1]eAéúýOþ7÷­cê¹Gk«'øæ]A—Oíñ ¿tæAoŸ;·k<¾Q¾8~Á@~Q¡ç8ÿ>EMÝé]…`˹þ}ÜwM›;/}ceñ¢eƒ|®5T<és£¬fÎÅS³o'p‚¦Â¯ÖUO˜Q¶tÑí± g«ó¯+R=7î+š× ­ôù÷€¿§öèžü„Ï:¿;Ûñ§e•¾·­vûÆ´g|kÿ®:}£1¾âÞå½7±Š»Ÿ1H½}RÙIÙŽê¤â-OMó뻣úB×%ËwyhÙª-U¾¾ï®U#|uLÙû{f²à÷¸Wÿ¹gJýš ¿ýNWÇ®.]pÖ[½ìãÝ’”ƒ)Ö=,)êïYÓebÜÆ¬ƒÉý¿ ™~sçð‘±^\½-¢›°ðød/ÎÖ³S.y•4þ5äRÏ‚F8:ý£Iê.éC¼”yæþ·Ce3gãÎwú×ýûÚ?å+–{ú¼1knzD Ï kŸ¦Ÿ”õž«’<“ûr—M²Ï”pÜv Þëu+øää7/ÕŒ­ûϯ¯V®ÑÿÖ„ïCƒžœw¶èZÂ]21ÙyŸõ ß©÷^y»¡ò¯COýpð“yßôÙÝSœvR®à¿V8×ç•êOû?xMÜ-ê•°»‡âzU@§ÝúÇŸ§J_ØR=&8à`Ä­MÇŽÌ HïãÛ•¥~gìAýº ¯*[ÿyÕšýú.Ê‹Tâñítß[õãv¾_åÍ­Yâ5èZlzl`ݵLŸÕé¡Oþ’ * ø#q}dÀ‰2îï7<Òýƒeh0ôi㋇ßjøƒsã×㽋g÷UDüï·?Eà.,òá†Ý ߸ã_ ËÖ{}õ°0pÎù”ÿ0¬RŸckçÞ/y5öæœÙêU‘ î]Ò.šùè“}/Ož©F7îŒÎéßsÖÎ=‚Òã÷–õÝR]wèÍn7IÞOMïÕü»X7+È㫘â;»/fo.þûn_÷×Ö¹ºäs•Ù÷KFw}X\~ðÌÆëË~–múÊwÌ9þÅŠÉ«‚D¯ûý‹Ús¹Cüêï+¾¹W2â#Ÿ­âœ‡Ï.=ä5ksulá;7uÛç Òž›‘¶lô IåÔ>5WKûîYµáFЂz¿-˾ü,÷…ã׃GÅ•V½¬„}8íF²ú‡²cÜ£Kš–{ì˜×Ôe²º9ð\åŠÀ«Kýøl¨¼dÓ‹ãΜŒ_Ɖ-žS2`Åó›#°ÍhÕЄ“ÿ\ô½. ž»bGòƒ¬¸ÿgïÊá\ÿ>Ù³¥NñGȉÁŒa03²çd&ЬcË3ö¥,¥e”SÊ>©ât,™Â¤šˆc‰„å(KïÌÐé§sÞóþÎ?N×{ù^s¹žç^>ßûy>ßy<ßÛ}Ø6Oó~“á¾l³‡40+F³á>‘ÈW/Ÿÿ©QZ4—ÊÛˆ0=!ÀŸ8ýéKÑ t0Û3ÞÍ5`µ´áäuî¥8Ä©Rêõx}ý뤤öjzš`Ûìr˜áå²{ù:_ ÝŒ5Õ=ÜKŠ2ÖD†Ÿ_Ê©¬;º4û¶Ng.8™lÆÛÚÓÔ«0¯vW?‡ZRö{Ÿ&ó,¢íBØ{È{™¿MþüÁ?¥ÿPq“Ö}ëlO‰3—W3âµÝN»¸{‚øÜ2¯ÎÉb”p+¨†öqŠ´H÷£é)ûàð#ä·ä®ÓBäKBYØ¥…'&ÃE)]¸ôñ ê˜YË—ÙØ·ïTágü§2ýÍ3¬!i:–¶âØ=™Ñ(ú MC²LÇT˜o‹¼uØ,ãŒãåvq ó¥1K£§ ŸœQä4Ë ýPg«ŸCÓ wÉq»G(Ý HŸ•šŽªO½È!Ä@´½9v®x)ù¦ê b¥äì1Ç‹é¸ÎÆOyCbËÚfPûf¶pʼº­ªµÉ/œ>9ƒz»·Ó-²°ázÜšÞñ…;ÖL\XÁTiÍcBÆRZ[ b£PÌ8…*ø€…{ñ®øC6?ó9“qûèí#€ ¡ÑRø˜Êo¾nÊ2’n‘mÕz÷Ô¹[¼_÷S0pn¾Ú\° 89ÖW'74ct_;Ò®îMºC&BiÌíRæ–µÀRÐ¥´ë ò¤@fºPÖ‘%­â‘i wÝ=Ê`ßàI;¤‚WH8óãá´N¯ôžS¾ ƒ»ÑÉ´8£Œ,|„Rq“À˜/Á_>B¶L‘lÔŒhÖ:ï¡ä{å°ã$Šø¨QCÃξ_¼¿KÇw0ÛÝifžÀ=«ti3(âk¼Y™çcZyZ,ØbâXt7ÀÑ3‡7¿PŠò!D0#Ê2¹Ë 9\«ðû…ÛU³oF#{@/'LÉ;¡–†çnÄhQ…=ošÿiÓY™Gw9KDØçdä‚©?ž¬©ä[œAqu5j€NüŠ |ä¤íä©>ט\%ºö3u¥”ÃYÏ)W&r`d úà…G÷¸t€Fª™â\þœÕošÑr«Ö³òùž>ÐR§D@)ܸË¿hÙ]X)Ê̬;Jý$V7edŸÇ~K HKbºnU}¨Çt1š1•Ö¿0 XiaëV!‘X9ª#¾«ÔÈ^Ÿ38âýŒ¸Ó&h:w**—òc]f^(ÒI¶u¥m5)Í£¸:ŸBÒÌåKܤp-¤’ÕéHq•¡‹šdc«ˆ1¬zððÇ%i_;ÂCY=/(’2s“w VcuO]íT“ÈM“}·“ñ•$ÇЮ=]¬yx!Sóù\ÒЦÇS7+¸SlõÃJ$ïEøÒ•¬Ï¢U™ï¦ñÉbËò$PåN+P¶VÛ”´+¤(ö¤ÉŒÜj—Ͼôöý£)9Ï顚ñS†7º…ÏÎ oh®õ}y¿Dœ× çDšÄdΙá4.n™C¿õE©_µtµäI¨D‹b“Klò“›\š•1üN‰ù±fõÖþ©4¯9J¨ÀMŠpµ²z_{øV§ýD"—AÅÞFýbð¡ôèy©ÛK.íôÅDÉê" uÇO@S|ÿm8ñ·´IÀQÃ+R¿èæŸ:|fw‹2Ðt²)cìå #%Ù:6àpÑb!¡XQ˜Ä¾ŒZJß–hqŠ Ú÷x/å8ìä?l—Hf 5ESoâ4oôkP˜SxYåWü¢òD÷¡p‘ƒù0=“8Zê7Ÿ .ri߆sŒÅ‡?ZžÌµ¤xmoÞßÏCÉ|îKù$-n_ý#Ï@õƒôÙ»GOÞüôN¹jG‹à¤`n}wk€º~6/Gb;nü§ý]iæ«òë“‹*;ꥫ='í&³À,k–¾=èò¹5È/oœ]ëË$^‹§æ-“GêéÁíÉ¢Ÿ[gR(Œ³kt§É]K³­Ù hòœnÖ]ú§Œ£ étNÞ‰wÉ9O¼'šF#·O†4(K· .@rJ¼ö]ETBá›'Ï¿™ ÍnÛÓ×µ}wãÇÁþ±Ýuû´CG7[€8ˆ¯ªß%“hn…ô’$µðA;/—ŠþÓû¨¤p’þT·êhÀ{ Ô¨$šG¥ ÝH‘œmjÑ8TGí²Ÿr½Ï ™±xÃÿ\)wÐäÔ§Á¢ØD¥:¼g~fo½’¾qpÄ/ô±¾¬?~E$êVy…†{Š?’F ò¨bC0™‹Ë+•×!@s‹ì +gJŸ½&—´f¿jþôÖó'¸éä…“€Œº ‰M‰‡ÕWAüdÓiD¡F›®TÈy¨”ñã–´—ÌÑ[¬7=d|¨%#í“‘ÿÌΖºu[V#ñs¢ÚÜe\lè÷ïM•ÿ¿´µÿÑüÖ­¬ÿin¬ÿY[Ë?äûá²ÁÿzØZþµ¾þµ6ø_[Ë¿ö÷ÃÿÆúÿu±µüC¿þÁë×ÅÖò¯óýð¿±þ]l ÿ ïaÿ—ÆÆþu´µüû¿Vùmð¿¶–ÿïaÿ×*ÿà þ×ÃÖòÿ¯îÿÚ˜ÿùl-ÿßÑü߯üϺØZþÿÕù?-M0D¢ ÞØÿ¿Žö-ÿ­Ž¡Ý1A4Ô[uE“ƒµçû`ü7û?45ÁÚ,þ!`uM0sÿ7HCS[kcÿÇzl‡ñ~#k{KÙ½ÖH YKC s#Y9U55[°‘šš±µñJ…&P]CÖš€ÁYòS?55Só„¥CóöÀ¸#`þAY¦RŠªG`06.g€ òÀ©Z‡ã=ädÝVÎàrAaA¬¨ÓsóƈAp,1@ …è¨j01ƒ°A~ˆ5’,º²« a+qÉ K ·ìAVTÊ2÷(ÁÔVzm†ùaq¾k¥¥VuX܈,U7?¸K4†èíá$'ÄÛê˜ XÚ*¬«YUZaÊ•}Õ‘q —5^[ia*Áܱ!_t­Y’0ÿ)-¶Z²fHþ,nU6É8\Q›±Äx­ü·µ(Ù¿ïíeŒ†àæ¾ aÄlº‚±÷KÕ„Á႘×õg ìªJðÿ…ÁTW"®ögñO»ÿ!Ûõ§! YÚpÄÿ ÆË/Àã÷çqü <ãþA8àáǼ/_‰aAÀÔL3ƒ^ñáÈ ÄŠA«±Qs÷ôøß««Î̾h©1ÇÁßH§­*aYþÿ#Ð< /fSF¨á QúEòÍõ”]QbÊn^SúZÒ…1U¿ 1€ñ„7"1€ ‡Çz2nš§,2±E3ðŒÍ‘æhckô^4¦ÆìŠøôôw૽ÿÎýŠÎß?sþêü_¸ÿ¦·æ×ÞšßÞ5È×:ÈZd_ðЂ»‚ñLñ àV¡×¶aJŽá¼ü°ŒFÈÉ}iù­¯~´þž…3Y9–®'Ð[Iû+ž¶lô7•Я•Ðo/XçØ{p¨Ò÷¥ÒU=j•¨mBJÂÜÏ Hn)RH­´3£a×ÜÓfµ’6V!%ÔtYú%¡‹l+Z«)Œnn£U(e!ÿsfpš‹Ò®æ7ÿß3ïãyf|ß9ï÷ž÷ö}ßûy_¸OO ƒîà ¿L…lMmG”ÖLÌ'5sÊ3ÌØèdŠ@B´.óQÖGg™›éÉ3 ACt‰æ0VyÌ'U^âI¦¹ŠÆë-æËõë-;‚nòò1"†8÷¦`]…lJÿhî€0  ¶ NP…`=Çàú°Cx>E%¿¦r0Gê \lÜÙàSl WF7ž¨.îðfŽ…E†Å"@Mžc°&+—>}0 ±x‡PÎ_ÄxðR ÓÈÂÂKBßÏEÕǸ;Rèþáüû ¢€Í‡F§‡Pð’Ÿ b€y‰Ãòa,ôñCpk "€õ‡ƒ.è†ùŒÃóð\ûXð aú¹¸ÓH¢e‰ƒã â_ë"/qíê¸T„®ˆ"Z,«ÒÈC“•¦ çàI§7ò“ûÓ¾~D÷á™ñß?8S„øp‚Tâa-Å#d7\ÅþßÓ„æº<škï£å…9Œ % */DSmÎ||‡_°HZ]Ý骆 Н¼¨‰àZOaxÌHÏÓ':},uØŽâk .±E¨¶=r[BŠ‹‡}~DÿûU¨År©.‹%@ò Çâz)a¢a?…lj•hÜ ÑÙ藎àé}¼0é°Åã…=(ö ø=èWy2.Kp–ñ—ç¢ì™ñ”Ã/ìItÞîLW—›¸zx÷+rÀ~ œMÍ :cL|Èa ·š¢H+Ñ zxøŠ´^–¨±&‹À%Ëv¨b °)p m¼tÐcM(Wnu+)“W¹ áéÅ>WÀÌ ú"L6ì)ÌX“uˆW H¤6°ß°c>6Š+L»á 5K?We†+\/°y¹™°§pˆ`¤…")o¥(ôø°ðcþøèA]†½¤h'9¨ÒÜÿ„(„=!»öFaô ®½)T¯b,—e j›úyxñ„ÿI„®àŸž0B+ú[)°•»ªârŽ €ÐiC­kŸHµ°«ô¡½Øù‰ØÃiØ Ђ}°¥0‚}°%°ÿ0l@€Í„€UØ@l kŽy~u,Aš_]ÒÿüO‚Þÿ—žÿŠøåÿß}ÿÆâ1Cò—¾ÿ-”¿/ZZÃåŽÆb $ò“çÿà;|þ ‰Âü¥çÿ_þÿœÿó4*Æ=ïGØr“Ö‚éÉ¿ôä_œ'ÿŸPD°W¸hw\ðZóîEP‰ždPYwèóŠ'}¢* Ü‘y»"’=÷fkX>jáÒø9dx]2j™¥'m茊û}T°ºd$~JF…DûC³‘XÑI;ùA-£Bò‡€BfìçKFµŽ )$#„Ô6@¥mÀ¨â@œH>„ gàÔ2ŒL1¼3RƒKöYÓî› ¼wÐ6>ÚæÕü]25<Åó½Ô§:¤Ö܃íALº\ü\‚‡r÷5ðñ%Ó@.sKs}æÊ]> ö Œêb ƒá)-÷-¯#S¼ÀM0hs»Ü,ÔÙ·‚$xí (²Da mPi(¯s ”Ö$wÞ.Þ(Bõï<ˆ^ ÿa¼Î`ÃàNÚHŽ0uØ<¸ ¸Úžƒ ÂÊ€†¥Àc?‡J„f#(‘:4S‚t€Da Ë1˜åh°œ§@äÐ< ?¦™Dqw÷7³ kþÜè“ÿ.í)²Ú§ˆ¡&<×5¶ByGìc\®ó‹üäUã„ð yô*D…K_òJe2ü<àšˆJ'ë `ƒþ<Å¢M~L å~!|v~#ÆCøh YAïɇ¬_˜Ï"‰‡¿BUéb@ºøòÅÀ—´ýúEE5b¬›»Tà­XO÷]šÿ¤˜.JùŠé"±Òbº_£˜.„;3!–’4Ÿ¡-6ø&fèDä)¨c|(AÐÇÒC‰€?þ'Aù?¤¿ÿ ðË_‚òHÿ/à“?F‚òHå/à—¿åÿæ ðË_‚òHó?ˆøå/Aù?¤ùÄüò— üÒüŸb~ùKPþ_éû_b~ùKÎûÒüŸâ~ùKNþ_iüG<À/ ŠÿI÷ÿb~ùKPüOºÿ ðÉ+Añ?©üÅüò— øŸ4þ#à—¿Åÿ¤ñ±¿ü%(þ'ÿˆøå/Añ?iüG,À'$QääÊÊ_,Àoÿ’ÿ•ÆÿÄüöï"òçÚ?€”Ê_,Àoÿÿ—ÆÅüöO’ùÚ¿Tþb~û— óiü_,Àoÿäÿvý4 Å“?^ÿ Ê_(ÿ–ÅÓ‡Îpv&ÑÝݹ¿¶Õñ ‘h œÿ¬€üѼø4ÿÇ×=4‘âBÒC»1dCÀñx€Lp$”+…B!ÿ·é“Â×…fÿD¯/ãsö{ö °Rû¸}(7ƒ c*”|¡ýŒƒÖ[¨ì¨* z9"à—c‘„ÿý yÿÛðìßËsÇ—ŒñiûGã@hþ°Òù_,°oÃz ù©ÊË[®1µ?kdd&8O~‹×xü@n°²7ë˜7Ï &“9 #“ŸŸ¿yófggg###‡STTtüøñ… †‡‡ƒw „¥=+¿óµ]o'³ªù¡«Œ BÆÒÔØ>ðèËT–íšœ–¿µnÏîb4¤ßMòq5š‰œY¹îðÙ³e'-–ͽ”Ðzhßɧ9ËuÚÖ-Öqݘh:¾<§^‡šmuôû:­Èȃ³¦DÈ싳B—Ïʹº\6í æHÙ{5U5Õ=ô‹,¬ÏÑpÚ5ýÌ;ÝE¯©mô¥÷Ü­ÙVQu˜Èñ-µ*.ïLmu~­T[œÿpEC55~²Ç…Î÷š ³+uÞ×Ý·ëÞôƒ\Q¿:úB£_E¾µ–}àÊ1ïâdŽá› Þ6ý6>½Yñ3ŒRäë¿ë‰À,aÊõô¦îÂ%}Ÿ˜öaû®ÒønvOù«ªë¸"L~…DZ¼}xçõ vΣÎé-6ýÏî•‘ë´1×{öO1Ò+T¹ö°¥¼çÁª=ñÇÒæÍ¨jd܊؈~º9D/)s=¥†Æd)ùÄÅÅç=^B52š8'äô‚·îF´Y½èrÖ0¾JSÂxÊÈ·X½Æ'ÿôFá"VÓa/úSêŒâ°« tw¼wýû-;_˜ä{ôÙ¶ :Vã çÏÊÞßÛ Bf 4qî$²”œnÊ7¬lÒVŽ÷¥Ë(CçVeº—›ìG}s‘rufJ7Ûš“Kw"çú„(ûe³Šn/š¯×q­^éF|à]ÚþŽ3óׇ(Ï \?-¶ö–L’®Åº^¿Òú”Ôâæ7U×­|‘û*¥¾Xã{õVÇðŸKЋÔJ‹ÝhÛšÔ8¯ei³óÛº:ŽÎI.{öƒœ gÿ£[ô« ‚z£nycsÁöšúŽÈ[Ôo[ÌhìB½U{‚UþÒÓÎ5{p€ýŸ¸SùÕôûö‡úïX¡×2olÇÞ<ò¤Ã~Æ’F¥»´ÏÜzRò&¼¯á/;°_+_&ꇰì$fÐM¯²ÍË+ó+J2÷&ž¦§öEŒG¶”,yKóÏÞ“˜I¸yF¡¹Ì»‡}nvzý6CÀ¯âPW–®úK—HôË+ÃÎBÝþmf\kaü“øÊUëªòÕ°Uíå W‚Úµ-9‘a/·‡­«ѼÒB­Ü@RÓéÌéYþ1yV1mµf%¹×­ïs2Ïytç”1S/*YS©Þ¡Mñ'ývúùÇEÙÔØh¥•¼‘ï/pšn°=ÛÚ¥Üþ Ø¿Çè˜ïôjüãePçf›°æ@:BN±â¯>¹ð‚Í×®„Å´©ÐýèÄq¥êÙ9­LÜ«® jÑëk6haOÐËZ&mMûe'N;kñþ„XÅ7²¹¦ïX¸v|fûêIÚ•a&-÷¯T[cAtQ9r“L:sÔ2g¬¿áÝy?¤åÎ÷ÛbzÒ²ž©XÅy!_­š´æùA¼gQg³ôæ+Ž]dÞ ú¥Å«° úëñõûÆ_AzkÌ›9kï àˆMǪŠcÛÝ'=òÍ`­Z·=¥îì“ËÉKß]ý¶§Ùo¥v..´8l áçÔµ•iP±z+8ˆ[±ÅÊ`õó¥ø€‹=m›v9:Œ?Ó¤gm®¼f%Wþ|æŒØüzWÅ\FÖ©’­ÕöS÷@²ñ]áAõnÔ²~KÝgä]5Éá YÒ®Èî6(;jðSåý÷ñyÔzæY%'uº  îÒh#c̲´¬wKßíQ>‘×~Üéucüã-z£g~wMjºÌ¹_ã,3÷¥¸&gûÑN\· R/¯üóRòúÂîj5޹÷ò6+»<µ^âaÂY|¨T‘ „û7±º=`Pø" €1¸;q.Øö4ÊY×ãüÊvÿŠä`Ž'-=«-¥è¯RÔÍÌ•`kt4Ý¿Ÿä±ó^{ŸCä,¸†ý¹õw—¾æóÞÓQS¨}í`odXJC6õïZyë\¿Ð˜ýe%4å[™¦Á‹Q'[3 éá'Sç<¯ZPì‰ R™xÏþÚ£djöëäÌ?ËØK´¼¦ôØÑ0(\¿« ¯’|xVeüZìm"º£¤½ò ìºš¿'Ä:ý2kcàZìŸ{oÌ-­šµ{ñ’HWÂìk *+5?d"T!qûe×éGvwÚù¶<µ°I,œÞ¤¤wnP ÊQÒ®¢×GkZ+v׺Y5ì>µq-Ûe™ÂÊïZß5Û|Ë0ü]7:Ê¡6¼‡Æú“¶x+èm”©~®vàgXŠÅáüÅ12VÜDÚíèŠC?ÉDÙlU·Eélj´Œ“µÏL^Õqs¾¦¬×í C-ËÙ#N²Ú¶¯n?ñŸÉ»4#/nRˆ]{ ÍRSv-ºõ“ŒÕ+ŸL0“i,‹‰¼¨f&£s™”5€¶¬qY“ÔqNUæå—ìÈ%®wö3îHãóÕ,3Ã'SÞû-q˜€X;Ûæv×ôš²È}{iKëUÂÑ/¨ÊŒcéÊ"ÚYæŒ+ˆ^™r¦R¿šâ1Ô^*‹èƒZ{èÆt«¥tlQ1n2V rñAUˆ8Þ[¿!É¡`ÁžààÜ« åûO…:´ȱvlÖ þ5ב˜E ~¸…–§+z^ºNË ôçܲСÕí~«³ÌÝRùÇeæZðv·7&çÀñLï@Ï“ÞgsO—Þè!4ÿbSEX‘_EP -6W~ ä]U°Ó4zqÿg-L› YwRO—ž¹í´ç¼A¦wë·Kb T~7pÙgt幂Û| šþÆX»/V,‰-¦ÈŸð¦;زìÀù ^åË.­·o²ïŠ5´¬ 8ÝGĶ½Úªe¾•MؤÇËk.–‰<˜çøf2nFüNh,6È–LoçB}O¹\†ÓÞÕtp f½5õ»ñ¸öÒ÷ŧ5^mŠ[ÕäeeŽóTÁÞœø}))áp´üFXñéÍ{/ÄîUõï¨cuä‰m6J*¢¦/ˆøùaúiJp]('ì§–ºìø~͹é»Q÷ÌÞɳl/ä‹Ð쟊I÷wÔK¦í>zâC^H^Ë\5øÀÇzº}¾™ONs~ +^ã^\ºZA·ãèÎ?~U8WÙ¸ùÝ=ù"ŸööC^«å³Ó *èýG&XîlRª?áÃ:êp(±v¾–s“uÓ@PÒÀ·¡¹µÎ¯9>q¸ÆEìC]ò1¬íyfvæ kÛRlb®.ºN5,fIýA jb™áR»-pŽ3nA€IâÉ’.y¦ù²¼Ø»o;z?<¿yº\6´sq)-´yžÒè¢Ì’7ª¶;ÌŒÝâ^œ-P±-/œØuȼ/ª;iÇöíÝ{&Û+„Në‹=ß§ÝUm:»OC]þØå@‚F“ç9¹×æ˜8Xƒtœ;Òð û‰£u†¹× u÷C‡Jk™$?uMÚ^šwËÙÌLÅÚ!5³Û?|p¿Yi¢©I3£³1x¼ã›ª«>rÑØüw… ³Ý-×:ŽKþûø‹Ž”Ô){]0Z´‰ÔÇ…Ú统5õÅYÓc{‚‹À«4Õ&—àÁ–ÉÚîáQÎú––Z&{vŠÐФQ¨LÖ&yu=°Eë‘[2ë¸[L±¬,s}°b´Ó¸ÝvÌy7ˆàÇEÎוizìu¹„©“ÖÄë5ßQÞR>‡6qÂúŸÍ3È«§,¿²ÂŠë¾Û³0¶S$\ nûÉf-UU–i¶·á÷ƒhÍ;oe²¼/gEüöË‘ËS';Mq·[ £unZ݇{?Z'eìñŽ÷ýFyÅT}¦UFå¯så—¶EÇþ¥Aê̈¼sæ™J_XЖÛÝŠkœZÜï æ9·$¸êtí$Ö©·V½ôbÊ͉ÞP¡·XY‘ä|½¨´Þ¢ƒÛ°Ñ`™>3“Þw³ ìžkÄl\ªÝUàµÅïgÒ»é3ëèJÀåtâîÉSíØÀòÒþ—¿–]H_XéYí›ýäöÞ‰ªßøf«ËO3]Úêd©¬}ðÁåwçÆÍLrhK‘sÌ¢'SAwrê^ŸÃ‚¬ûùº¥GŠˆæ®ÿÇΗÇC¶ý[J!)I¢Eb,Â0ŠìK–±eÉ aF3˜»$£ˆ²–}²ïKalaD([1Ê΄’„Ⱦÿõ<¿Çû|Þ÷÷¼ÿôë®÷ÜçZ¾ç:çºîûœûœ™«íÙE8ßQ…EBÙÀ¼³¹R‚hc'7ÔfÄhÖ¬¾öJøŒ“$î †„WZàÕdl™ÇêOóC¼É5CÛ¡úÐjŒmêþ0ÚëG›“7ëð3M9$-¹}‡è0Ç9‚ÃÏrtÎ,³G#:†gn|ôÛå&WŽLÛ¨Eæ¥Õ mNÊVŠem¨Ó?G½á‹£«<(v4R²BÇ~ÈÖžUc&V#¾dvÙç8³ú6zÉm[:!* YHÖy³ÒM蘂Iì¸YaRØ£d!-iÌn§º–cö :%a?ìnb¢·[^2l@¤§ìÌÉѳAKøã1>ŒµK[m§ãÂôŸ÷Ù“grŽ»3¯Ê­êÄ£ëòS¨dr×Ôû¯±—xœl6û%åù¥È—WL&_SüÖÜXØ¡O©ëÙ¼š=猪˳ò< NIn)5ñ%Ïp³LGèOû÷ÐY#~ÿT.|­«¼h„/ïeÍýçôý:"íÄ|·†yƚɴ¡ÍþAîmûHnmënÓZ!'º«‡gœ\µý܈ó¯'ßHÌꄉËÍùŒ¿ t¤¼k/3hI©=HôÝŒ~æ,¸F§ó$T¼&ýP…û`à VÏкÞĈ˜Ww¯ÅVNŒ95™·¥Ó\x+î ¦Øvò¥üüÛ§í=—†ëÌK; o+^¢åº÷zõrV*îÚ[æI›ƒ á78Ýè5ªÙÐoÖf˜ÔšùŠís0¿{™ÈSD¹¨üjhÐ+îj…éÈIšŠ<£\ª“çC‘;Œ¢3¼äLÇáÞÃ3¹¥±VÇ\æÉ±ŸÊÛï&vA/‘Þ¢ø¶Kí±anžvöa Nà°‹úy£¾h°1xzöHÞ;C¢Ö0ñìÅKóèÝνRMeW¡wü¬²96µ–^…üä ª|sn[Çs“;=ÅÒŠGF®xª_RáfWTñ/s1çä¸ÈeOÎÁ¸â_žP˜ÕÉ­E¡ [êû{ÒÅ0]r9ã Rü¶šu)Ž÷¤3€Øý׺ϔSr*@A]oò$SF÷¤Ó€Ç“Ð’•ªʨ uü×T—3ÓÌ(×{è$t-d#â>©ÔQK°dˆ"„œ9ÆjÁb(l‡Œ¾©µv2”ƃúãI*¤ÞâËY™8î ç‘o3~=š~yúÅ­;önW–µFW Ô˜:OëÛ!uœMKê®ýÁÖµ!ÑÖÍÏÖzî`ë)”0móŧٽÇÉ—˜Âõ›üÇËY»ÏÊ-9ÏtµPÌ6^èÎUï¹Éõô˜=¢…Ȱ{N1ëÄ‚ÒÛêÝÀ™«äÌ£(fв«ëh+ìãîOwë>®®‰øNΪ»S¾R"2ÒgS&õ k–OÆÿ]ˆ8HÛË!ÞÕ6àká%ޏâ(¾TøNøÝìÉS7êìûû‹ýÞ}Ûì Ööò^éæWætßRðyªæ¯ã1v^æ…åV”<‘²ødóœ6Œcö%üž#eú Î$¡êvõòFÜCæVåùYÑÁ ï Åí>›’gO©|/X²oš-:k1²¹{Hñ}b¸Z=ïc ÌôFd»^íˆhuƒ6* ??®²Žù±Ñ¨»Ã]îÜ+BͲãÛc®ˆš¸V Š&ÀAÕ§Åh—v ÚJ`@¤‡ïÓùBÍàñ$C%Í®r `ÙÈv9âÆKæ‰;å‚ÇÔÎ``š[䛵µSÛ_©Ï»û©‹>.ËÄ‘ÄÑMù²íK\n˜ý¢­i‹`P~jQ½ù"Ÿ…BÛg\:b*zšÂi}‚Á*Z XpRâ¥þ8âò@°ò‘Õû \ónø®”ý®j/N™öü[9sƒ%§…ʼnäu±Bç<-:Ú2‚¢SqHä÷ƒÖ©í v<‹àÄÌOÖ‘ïË]âÍcÙz  ª>.ÓR¾•Žò=–b÷M2‹Üê©ò+g¨‚vô"€M/îêéu»L³Gáãÿ’óî^N«è>A<[6¼®°~;H ²Ùæ¼ËuD\ÎöìªpPW÷Ó{Fá»›ý®›x¥‡¼%~¹–./Û5v<ˆÈ¿hÛï̼éi7‡Râ¸7K3äÑ‹ãr0Ê;1].F¬ Õ1Fއ‰^rïýZô5•V¨’Ä}| &sÐäSÔÙFÖc#½<4æúüÍN]ß(4ºfËæ[†DO5Òná?ŸÑV{¨Gµ©®À›N”Xo·¸=3rW`^$ˆ«"nÙq Ÿ¶[⤫RŽÙ3ó·s£í _*œbÝ  g~¥‚v`òý~?BÀœc®GVðcn –1ìª/Ež ð2=ë+‡k[öÇoú×᬴‘RábÛbfi¢Í7X3 ‡ÄèÓ½0]Z}byé *üYÿI®™‚®åVéáhNqGQ`ÎOñýŸô8ø„TÆÍ ¡‚îî‰l[JƼb)¬Dá§)ß²ó|Žói²Ô‚¾¨m¬Ñ;R!ÀÓUyÈ+íåQâ­Xdj“„O,VÁš]KˆG>.¶ÐÞ4kWY+ºåÓ”’àèb¨ŠV¤Ijn1ó'é}<Ø{É­URa¬i”_ûËDËwÿ¦M©?uªÉ%"OLñ#½ °sMŠƒÖ¹’Êù¢±ÇêN†ÅØ ÕÐs÷)--ƒ^ñ•eÊ­FÅõz åÑá3Ç`jTMtà9u¢•åcÑl›§Óþ Ñ&Ô›…ï„ä°Þ.§ˆcêˆMꧨÌÏ+|ê³â;ü`ûíô<{ß#}iKEFêN12& Ð*¢¼ù©õc#B 4âðB¾ù,¯zˆí­/WjÔ•Z°¶¢nÿ¸µ ³F'bT3Bá$\\š´ï] ͨjÈ7œ˜°ÂÊÔ žiÚ?#¢D‘ÕŒ}"Å uÒN?Ù7Ç«uõT ç%~M²Ó¿>7Ä\ìÄñc?% ©·ˆÔ9_é ¾[:qË>Ñ<·xiÅPÇK‹Ý'´©óVD>ÚBfZx­"ûÆÐ¸í°~Š£¸¢f.ö˜Ì(ȸüR\bnVç<1}R²,î6Œ8'°®.Ù(7¨”ܘ;P±°rʨ\ô°J,Ç ëQõønÛïÑ&U¦^h8„€’–2,wü:çÁfP^;š |Ôñ¡«Š˜ùt‹ÊÐÞàï̤m‰6tsu‡è?W”ÝÕ©Ðq95¢9gúm~gÖáµð®g¹ÊèOŒ,–¶ ®œw·8k/—ÅòûlW@—­V04ñCªƒœe¦u ìOSæ†^fD@‚Ö0†CMYû?`”k=,]9áP9”^b˜ž¿@óPѤda-þ»qyœ°r,p]‹Hs^Šá)\{›—PSïæVÙÐia•*p#ON‘|`ôÍôð_€30tC1Äü¥ƒhÑ*±ʵEbË7غ*z6kæW9ÀjcÂQ(½ßïsR/°iŽ ôkþ!Ããtd©6ñÒ–ƒÚœ9|4ˆ"òÍÈDÍØJ9ÓtÇŠ':å%l¨tGŸèTGv"Œ¯Àä7–fzá›4Y*¡Ë¯É‹‚¹^%Œà8ÁÔ¯}fŒ~M5‰uJøSD“Doö±´ Ô© îÕUµæ ýô?m¼á yõòþ›¸އ .NV™ R™d¡I(¹Â"i:ñÑèÖ©Cý™]M×_PöafFeу¥s´óhç,t¦m‚hdìJŸÈ[C1çöËל=!K_Ü›¿ä¥„†@à‚+bp­Þ)•Ð)¦|” ®kÊ` ¬“} £µÂólD|æt…UÆ´·x°‘~mŸs“[¯°v8«/ØùC¸w¼"WéÒ¨ÁùˆëšAí>ŽS-N e­B~¨¿°w'ÇW޲ìJxÖ™n˜3¿¹òµ§ÎzŠ¥Ä3x­Y2®C–U!3/ÄsðT !¹Ž•ënø‚ß²ÿwËÀÉy_Ü=zµMUÈÝÁ$žÅ¨ è®Aóf7õ}%Çc¢½%Âw«šùÔ;û¶b•"'³dœCŒo z ä%‰1É6_›cPÖ5Ü|ëó0™Udiγ ŸdN{F œŠ“Úhë8.—œd$à+lJQìŸzˆ/¹¿f%6Q¼N7O*YÍÅèÌIŸ‰ÔÑ:%²I—Ñm[¯%Y3.J¯W¾Ó¦u‹9ÚMU:p¹Ì€üØÍ¿ž.P2 6ç“8wÏž­mú•Sûu2Ê€ÌÓ3ÅFHüOÈD{,³uÈw6ÔXæÓ‡‡&G‰Nè/0µ÷IµT—›„®Ñ„ŸôV¡ÌJ±Ê†UpË.÷‡×Ú ›’¯e m-¼‡^¼+¤fŽ‹¶­­+¿ vH—÷á Aß?߈n^"ß¿ S$º¬cF7¬—ãb8¤ôE[ÖVv‹Îо5ÀÔVF«K›GqT“—8ObÜ௅Goªî˜•×aú´j]áÓå3r÷¢w­{Ž`J]¨’&ã©£â+býþ$sL÷·¸Ía²ò@48‰•Ôü\¹èPÜ%È¡ Ešž'Õ©ÈD„—Òë ä|z Ö¿SW,ðP¡á©$QÀbñ1ÿÖ© ­Ó6<ÔÙÝ‹!–éÙÞÊ´©wXî U(ñúïåR«ïÏ]B¢wf0J3²ž7Í7µç^ì ~™o&8›t×ÔR)pØÅQrÕ{çšÿ\DêÖQì7¼¿õB0°Ãx—ª7Wi:tÞ†•Åù ƒ ‚ëžÈ[\{/§d{|ªl‹²×z¨‹ÖÕþø~KiÁ©4­n¨ÆÅç°mTM¥ŸWdóZY•à×‡Ä B–ëÁ,û´_Ô½kéÎM?KÆO×R aÙ× @à×ÉÌêu7j-àƒÆ•VnfŤéBµÊÔ‰¤ÏÆKG³×ø#¾O/æ¦'µ*{ÜHiï M¸«å…ãj‹¸¨t~rÈfQ ŒM<Œ,ût?FAíf*; M Ùë³lËNÄGº}ÜOÍ®.ùå– Ä~$ɤyPœ4•Õõ´f³±áüÑŽ¸¨6°šµÑÝ]Z’¼E)bâqÒ1l :£7º qù#÷¯×l„ܧ‹0úî6zo˜©°$¼Ò­€Ãf\°Û9wG¹æ6Öƒãmm&`I}ÒùúÄc«±€v^Ÿ#ýhÉË­þú<³Ì”øs»q@Öt>»êyþ.?À"h¹;Õ“ð4 ­F@ ã/vÏÞü€[a:²I—%Qiˆ®¿þÊ÷Cì§ZÒ©Hó²©X¹hðp# ‰·.‡¥‘ÓášXbÐX¹œê°žS3øñÒþw“ã-•Ȏ«”Ö7“™Â¶éó ròö‘|’Ê$•Ý~*ë&ˆG‹rÖÝày\Ñ{$5~ ƒª¬JŸ')wD½åÿ†ßòÀ, 9ÉkOXÅ!cߣ€†Í»Ó\8ŸÖxúJôY›3Ò&ó´ŒäýãdLàB_«žóNpvº%P7éÖw‰v|T¸dD̘mfÊ´cmSµ¯Ì…T²û ¯Ï³ ”3zÁ]¤—ä©z³ ¶éâ Û>¤Î¯MŽ’p0ä‡ó3**FÛïäÇð’?¦ªTM¥ÆÇ,© ó6RU–ýÇáD”±e»fJŠ7 °<ó=ÐË’wçNPPZá¿öÃÐnæ'ñ¬Wð5°3ÐvøVϽ‡ZAYU†‰”ÓéUF®x÷'3 ø‡Õ!vá¯Æcý92µY-GOscòèVᘦ²é›ïMÍ$‹³vFx¨¿fáLÁäVÃý¸4ÍW‰š‘³êbol²,ŒbŸáéÉeƵœª¿m̈<ˆŽ|Ûn,Å4Þ€–íM 4½Ëgûê´ˆ9ß“®§ªK3mBÜ ßÚüÀm^Hê[0N£3—OK¨Ø_éÆn’¬YSj5‹¯N†~jÙWÒÀ¨3\d—…®G§Ã\,_Æ:~>¼µe& sŒ{Ç 4‡Ž7Ô}ò µ”4ø7ßž¶® ú®ÒŸ->óïÏšÁ@¦…ù×ñD¾‡]Åk'¨Ðw(h›Ý&K2 , N¨63Å?Keå=î|èÄWýEp/o\ø‹´KŽDÖã ~|sÇyî‰/Ua|>|¹CÝ®UU.OÙ0È‘Ž?Æ7~À¨-æˆ[‰™…~Ç‡Ôæéßp›¿ ­Vñáƒ>5¤L8úDȯ÷~׫½â‹kýto)…Ž6ßAQчZ|n=ù©a?ßÈPu)¦ÍñçvýY¾c^<"£*ŸfäÛª²}…e—¼a¤çðô®«Uãß‚óT~^Ø'5]䔆w!¼ÎžJ~D®Òv õ”åâº7K :ȆöSgý£¦ç[ï>o=§|H“<õZ6ÐrBå­4oO‹Ä¼×1mÔñ_äû:Ì`C{µSy#ÝÂ;|­à¦ä=VXƒÎÚ"ߺˆqJ’óʱãmtüW/Ä2éÞSM°ê£š„ÔL‡u×dëY±ÀsDÄútîX«hÕ¼4 µ/áÂC-›Žâ)(³»Å»¾mÕàU#ý:ñ³óR­€Æ‘?`?5âH_QFQ= õÞæ\ôÔ,¡T+U—Omâ:§ Õ"“ÿì/,“cÛ†P§¨u§Ñ$³î4-D5UÂb4‰Ä‹ÃŸ' £º'«žžu OÇÉÕ«ÛVk&P0¢ó¤i/0ѦgJq=¾Ë{Ô5<‡kÞž˜£°…EÒ¶%gÈT°À±'s)²¤¿zN“¬ü^=p´ÿû|•)“æ¦ôs]X·å„xTÇáË©yúʉ<䃬6„ÚU¦ ˆra¬:üá9¾d<»·Õˆ¡^¥¨{†° 宣d­‚6ÃǃʯžÓ•»iÄÏu —ƒ³-Ì;{Ißñ»Ò`¹sÃ`÷Ť“Šï}ÚqÛ@)òe-,“Jma¾†p Ù¸ò˜ b(zw÷+ÖäÇn_‡â³ñcÁá¦tå÷™qŒ»n¢Rõ [6²™—ˆe´=¾¼:µóüÿ‚Wp†Jô±;Éì«©‹FåBØÅ'9¸²ÊËœäžCàŽöjM=ú¤TŒž6n͆ÀŠæNpìcÊz½Ëð×D#š÷·b%1‚É¥[Ÿ4(ÃÕ\ñ,ùÐH‰*åzù§$zøó)ÿb#%×5Šƒ@ÈN$tª|×¶ì]¥Ò2›PUJ~”:»nR%°?ÖX>M MŽºÊ¾²ë pmv¬· «SÏÊ ’0 :y£É“[#Â>>iÊc€Pšµ!vç"|IÌÃ…é†1ÕIŸ÷¤’6ÉB’TU$÷}s¾îUAÕç„èÊ56úã}Gdbô¼,.áMü£ú|ñØËâA” ÀÛI ÿ)— »Le­ßι5î ·çLãQáÚ­?o×2p³<}›´ÛëùáòÉÙ8aœD¼ÍýTReÚ Œ÷¾¼Å­—ˆNµvz¾>õê¬A þðÓkïË»Š³í{Ú{KÆùRY3ª¯deãŒ}Ÿ©ôr®ð<Ìt€· 8®-•ÍëGN××¼ð–9‘Áÿyú’¡—ôB«[éLj°²€†‡§¶¥ÍB°j|ã«Ç­¡·ke3µwÒ"Ç&l¨ïUþÑ QðØñËßÄäÜý%v/•2 ZæÆÁ‰¡¬`¹Ç,î-§,?GÎùq&n+ÆÏ¬°0$Ô1˜p] ÚP+å1¦ ±ÊÒ÷õͧ:BÄ?¿:¾ÂR› fCr”´ ÎNEZÛ…Š W¾ÙaÙ³˜}º™ÿ*!|?yÑ7ÑÉåuÌÍKÈNÞˆŠ.×+ æ~—>úšjUþÀ(À:د÷üšöi‹Ô£×1ƒ×€{JLÂuõ#å#ˆE̘r0ÈîUóä@S;¬Û¿õtP ›â9¢î˸—~óÕçÉÃZAìáj®QçÑ#Ý‚’f…¤‘­|VcŸû‘2–vRÇ9…)… Êy²§k+%™bòpAoà lCÚ»¨‘á¬èÉ F ì+̼^™k)t7hÓöa>LY@.”Ž,t 0R°’ât¦å¾7×b í÷¤c!4ÔºôP½.(Ö*,U Æ;¨ £DÓ.-rÀvºØËSA3ê±òBKuƒŽ# À57ˆ3š‘úˆ„¾Ëjçšó•°¾>Yv„J¯Ä„?T¦QJšÖæ$úQ=Š_»4à9\lXc]ÄÐ$ñ½à{Í­¼YPÔí`»6~Cî„éÁ{Ù&~+W1šR^ί¡VŒÔÔÁêdñý õU}ÞÁtÀ»O@.¼Êú*”— ¸ÞdÌ,t9µHȘaš/Ìôõó‰GMÅfÍDÐFË×]”­M óK;VÃCQB­QZœî[>²iºÞ¦·L>#âeßyÔ YŽž¯ÓsÀÁ[ùº2ÁiÞçüÂj¸¦jÍôÓ:M2ó®ÉçC~kßÀy R 2ªu¼ìµzü¶XØLÙ†ÈöT+}ÿš?Ìn¤™žcgË)E°€ßC!´;²T•˜óOQýÝ®gktã„îúu¢.å9eWÃoÍÿ' bk½}R2ˆ†»Ã¨“I¾ëÕez[,ÑÈÒÓ rg4W~@ÇY¥`÷Ð|' ¿2 p÷ióÔñúÏÞìpnGÇWNòÏO‚NÞË;šdhºa †òÏÏò8¨¹Ð#>¶¿‰àD#¿2d‡ íã ©§_CÛ¦ãi䆗O¥H™* ø ± –Ô€b1^n’RÜÕéG ÌéÐm–ñnó°=} Zyz;%Ž“Þj¾°Ò“{¶šE‚üEý|ºëÅûí+yÖ1VKëëaßãeM…›ñ%°¦§jÃiï¢5‹)ÁJn^Ê®|'›-Q l©wÛëmÖ#¿õlqz Hïʼn÷/¸˜t—{Éz; ":RVø¼EMtÝõ¿,Q7o5Ëa×¼®½OlÀwÝjåíÃum7àʳ¥¬õ“À|âÎ_K>#Pkö—rLLàåJ‰äÌÄu…xZbšÔ¹%—‘ÙZhïûó}_umåBÅ›>ÿøþïÞßþAõÿÖû-´7þPýÇ¿¿ÿü-´÷÷È? þ¿~ÿÿwüÿÚ›?'þÇÿo¡=ñ—øƒê¿þÿo¡½ñÿƒê¿þ­ÿù[hoüÿ ú¯ëþÚÿ?¨þëßú¿…öÆÿÏ©ÿú·þãï¡=ñý꿊þ­ÿöiïøÿƒê¿þÿo¡½ñÿƒêþ­ÿ÷[hïüÿ'Ôÿý5ÿÿÿo¡½ñÿ꿊þ}þûiïüÿÕýÿßB{Çÿÿ×ú¯{Çÿßç¿¿…öŽÿ?èýÿßøÿÚÿ?èýÿßçÿ¿…öÎÿÂûÿ_óÿßøÿÚÿ?áýÿ¯øÿ}ÿó[hOü%ÿ ÷ÿÇÿo¡ÿÿ«ÿ«„ú8á쯹8!-1` cœ‡Ý:Ðÿñ>vü?Ôÿ…HŠJîÖÿ•¿‘¤º(&.ù[ÿû·Ì9e%]®«0-.]CE-u%.n°ˆˆ±¸’ˆˆ²òODø¢(—“%Öí‚Æa-íEDT´¹edv2AV…´DÈÊ`.–\(0ÒÑív…{'yX°‡’›ËúçÖnäm—ݬ“¶FY:9#]® q`))‰K`ÑL´‹=RÈB®¦áe.Ønêqi¡]dD~j0ÈØ£±v\('¤Ínaaà»íq ‰¶vvæærBÚ_ávvñ°G:£Hn.À_»ßQD~zn…Cx[çÀ`.5$édé‚DpYyp)ÿ„ã†C¸À`@vãÚ%W¸ÑXò6·¬Œåáìq c‰ÆînYÐa­œ¤u-o!eD,e¹îrýÏÖ(4à“5Êã„ÒŽêOŒ«ÿýG@–X,Îeç¸þèç9ý0lÐÀ©üe¯ ôÿ·æ®Xëìqþw~F×ù?‚¹e³²´ÿw?þ7Àùÿ‚>Ò~ç¼üßÀìBȈ‘ÞIpQÙÿv>Ü›”€¦ íÌü¹ @ºcì‘.H.{@Ê…³áú5yrÙàœþÅ;¤ý^ÏâÀDlõÿ˜ˆyþßÊw@ˆ ý?ì] éþ»sÕµ>fŸ³Ïœ³¿kíµÖ>k¯Ïo ƒHô… |äG¢‘¹ûƒÇQÍpt‚W“ G§}ÜÏ3<±éD³o1R%‚6,møNr&Ò¸ƒ›åB°£’©tøÚpWH…@5¡‘B‚4o’:4ÜK¤}è ÒfÃJOüfúë>>Ë;ˆH2ƒÜ×’itâÓ:1ܯI§ýMÆ}á”ZXE3ë ®åbÖ˜Àᦣ!ˆáã}ÿŸˆ¾b*èÁÐÔ!`¼Ö>ÈwXÚD¸w6×[ÀjóŸ’º‘¢¬dz¸îÇ+Á`%¾”ô­ ~ÅtÐU4³%Ñ]¸®é£a˜G§QàŒèÜ1 Üž¡‹GºB¸íÊ8èýûçÆ9Â5ý!®q×U£™Æ=3ÂîbgLŒÃÿ’%ãBg ÍaáÀ^î»Ö˜/5üèWXÈï/<Ä̧1¾k©ŽE—©0Ò¼7¬¼x®=*i-•D'yÃkCž×á'’|~ Ü_šÖØIC^Oqó<›Ü¼‡«Ç…K&âC~7\?0XÝ!°!xŸa«õý"“öb¹h?†âŽ òÐl"ý— k AfЩ :ž>²Üüþ¡ýýdxšÓHÞcþ½fðÞži@¢aþ}›´/‚‘ópêûÆú³{HÄ!^¾¬ù=&û¦ÍeÀcØÆ„yhÊãƒ)áÿäìg8*é=S‡x¾_»4§ *÷ôp@ÜÖ…»' ͙ûÈ!¯1ërw®¹kóÄï:FúE :\ ×åß-Яðº0d—?nŠ «óç·Æ>éÿ±7Ⱦ8aôÍ~ßû^'˘L>ìC£?·žýî·þ¾B]>Ç?¬Rÿ[  ý ?>,®Æƒ3„ÿ¥áühP9‚dª¨ÅÍ #á5^4”­gªH }!Ù×nw‡(³©yAügI¥AÚú–®±Ž‘±ÒÆÂÿ¸éU£r!¯ðáÜ.!õ0Tn’¢±¦fhhè܃A4_Í¡D±”B8r€/Bóþ4µè«(tSÅ‘3Ü#x¸°üÈD"…¤yÁN™D3U„WúCÉhÃÙƒ8Íað©a°\^Œ$eCš ñ>ÿstþï8ªÿ5‘ÿÏ-ÿqTÿk¢þOh´üÇOý¯‰úO¼¡ÑòGõ¿&êÿð„FÉ_{Õÿš¨ÿ­ÿã¨þׄüyB£å?ŽêMÔá ¶ÿã¨þׄüyB£å?ŽêMÔá ¶ÿã¨þׄüyB£õÕÿš¨ÿÀ­ÿã¨þׄüyB£õÕšˆÿó„Fëÿ8ªÿ6!žÐhýGõ¿&öxB£äo0ŽêMè?Oh´üÿÕý=m]m}]ƒaùOÄyBŸÊÿOi?ÜòJÎDïD¡àñ¾4ÕonñkdÃðçë¿Á¤û‰üµáOí‰úo¼ om]¬ÉËÈPK_—¨ãe¤OòññÒóÒö&hüÛã› –þ¦þ¨_ñŒ/é¿VïSý7Й¨ÿÈò"„ ɇD#Ñ„h$o:4“è3ôK9–ÒÉÃYÁ‘º!¤e¨­®e¨û/¤-NÐ7¢¿§ÿÔ@߯xÆôß@GGÿOú¯Ð^Ðf'G[!® ‹,°³v†?ËŒáC­w~î:OÕÉÞÕæýà ´4ÕÖÖ6++ Ç›››·µµ•••eddÈËËÇÄÄÀ"ÏûºÁ-îìèXüÖ좤֖®aéOö/Žl±›ÏQë ç”´yJü$,û"ͪ;3y@ª4˜¶ ¢"@µ*™.kÃF!ê»pbv¨Þø–Ü@ôi áÈþÊe&q Ëôzó ÖøF{Ý>3ø>Ic‰!¨d•ëÂÀí·/ØïwÀ̓Uaõ†#šq„~8a|[t­îµs.øÛFÎâfOê}.oÇQ¾Ï8"Sp2P`¸»vóôöÕ¶]ÊàËÓ˜*„£ûÜ=õ :þÕUÓºg᳨j„o¶Ôq‰•εû–­«,•¼«ósݪç‹ÞýrÚôäõ©€gº^§,ö4Cª×j׫íœÊB°Ò^+õ€T­à•žmÄÃ"’J­ž§ž¿P5óÄÝœê_ú2€5sºz$vߤ[Fzb_Å´HJ*xŒ¯@ d$¯ØxCQÞsjü†uzù?Q%6Ñ,D¯‚ r·1e{b¥û§øq4»cLÑ£Þ>A@Û™¤§Îžù¨íJ²r'¤¶oE¦ÝfZÐ׈ÈÝu¤¼8ÿžÏÛ&A¶SJÛJ=3ULjýñu¿ÖŸœ[ÁA{›ö!à®ÉyÌgS¨èŸ_å~hÂT¾Š’z„`Nå= ÐÓ¨$Ŷîäu¹ÈÍE‡™“ò〻f#«&ƒU[Ì€*оz'ˆMô·°ÊoGBp¨”ˆ7“@ýk»—ìb¦®-Á3qôk ¹¤çù…{Š*,÷–¨.š¿YÀI›Ã·»C5¬›(©Ü0‰ÝãCîšå¼ñÚ}’_]r¦»EöÝ¥‚çäF¤tZ¾9}AE®@_³||óT:ϸ´аÚÛsäÞ,&fY6dÝG»¶¢SôÀ‚zïSá.ö– Hwø™²÷/‘`ÝqHc›Z[I-*Ý·÷àÁ(*³e^›–[ªðÖ}ðP…¸N¸iC_û  DÅ:¯2«ý|)†êp¢8€ÙäR€nçlT)Í¡Oݾu “áàäd†,®û1ëï,$êà›·ŸÜ(‰È÷}ŽA´·Î‡„û“£ø#¶¼:˜âÀý†ÔšØ0ëÊ-Òë…JDJTp€o7r¥ÍÉt…@6ZÛÝâ‹öwó[8¤å”éˆÐ5&ºHL™+Ÿ~Q»÷„l%Ð@Þ¥¯ºѼ{¹º;ëGsé…&?eàøÅ³r( áÀI=úÛ´âû™ZQ›%WJÝ‘dûo¸€h_ÔS‰2#€dùšuªÅHÔ—“z'×õÇM׋qla÷µÎ ³š\»m6§ÐjRœ!}j~ïâ…Ò¡³Òâé[[¼–8½-í‰^ìY’ìøZ@énžÃÎK“âŽKžÆ• £Ú¨ÛuÐrWÏ1`«œ°QL|zµ]eHr#²È\xpSVbò=³¹ÞKR%¿vKï-ï©ðä Ò¤ÊÑ_êûÃ·ß Üs—_ô5Å ±Zžngxà6©Òzðå‡ÙÕ/¦âÀ-qAHÉÕR~¶zì  xd²ë°‰ý¿Yí;íïn3Kô<^~ÕI`€Òp>:¾– 4…Ï ôßZWLÖ>6P^É Í+-æ*±Éši3º¹+^£)®[„½îX~çøÝÀIÔ«Îv—ÒϬ-Õö'7_©:Óíqg¹X¿cy_êzYÃ*ó´Ö #ÁµÁˆý–;L\Þ¥ŸÖS¢Äf*@×w!i¹LÓ¾}ƒïôÝo¾"›w7­ beļïašfÔßcftžæJQ¡Ló}Ìw[{î‚Ñ>‘f™ëÀ˜K»”¡HßÝÈ!Ça >dʦ ´A™1jëc¾¾it}gPe’Äç«÷zÍŽ¢=*Ž5UØJ`Õ“m…äjwÑ9KŽÝßáAcE¢Ý² 8•3d •úžsþ×XÉLÜ’ãèÆI*:r*áUPÍ>å;Õõ~åËýÄ(ΜsoròÚi(ì㤥 ÉsÐ@™Ú±û½œí¦´ø‡;…˜Ñ§]~~À|tu=¦´,"SÏL+Žœá¢wÑÞ_~ó-;mDoRŽñËlãQkê9Òûàl w=`x<Çó¶ `Ï8ª9·úÈR¾ì5Ë©öš»k.+Ý(ξï_bŠ›æy¥["»Z²N´s~h>wQÒ/ž-KŸåNe¬ôØK«m¾Þ¨†%q‡D6õ]=¼£êJ“™§Y°®·Yo€Å<ýƒ2g-µžŒísï'^¬ºæÚUƒŠL:ªæÈ2·ö[϶¾<Û6§uG÷䑟VE»d¦¸P}âÚèúPáà. –Ýëªë{z¤•,1ŠÉS®Pý„D‘ÀÖš‘ÞÀN¹´MN8­oñ#ŒÅL;…Ø)JvüØ‚’É%θrŒ} ¥h—fSÌH‚Ψ'F£€@ÛS?7í^8û¿¨îš2H·¦¸F°3"Eʬ*ÕWV­-Ý%·7yœ32£u-Œ`žcò¥×mQ›6‰êc†ñÒ„}r¬D™­ƒ…››¿eä³ö°.(]\& uZª0aÇ¿˜)Üênmľ€PÏ)¾e禄hsæˆwT3ìwKôÍw¬±~‘·è²Éº@ÝP@Ò-¾T鹚sê’XpDã‘ _Aï{çÞÍÓSŒŒÌ“ÁäHßå¯\·z­¼¿55tyc¾ǙaÌ_@þvù\Œ®Yç­ÌöÇÚHü“-®Ôö¬älLùƒW^Ó<ïp”SÎØcq©ÇßÚ-Oj¿±k.¦|ÆœÃó+;=‚™’ó×6®§b–÷[&Ù à¢D€$Û(礫‡æÙ4&„Í&^Aµ ÆoZcmÆÊÃlƔВPÐkìåâfL?Ô ec²ù3)ì†axXU—ëŠìgÈäbÐ@¯¿õ¯FµŠË 0FaÒ…“—î8h£Ï¬—8àwã/’XÙÜÛˆŠ'OaO]°ºZþ€ƒC]iä!j·ŒŸ•,t]XX½ÿ± Ü@@ºë‘‡äÕ½Àî­S¸N¿ßí$!‘­Råzj³ÑlÎ9•k=rŠ ³–â"¡›*V€>‘2o¯ø£9eäUuW¨³š·,=Kà–žå¼&›%ž+:6é*ÕE•<ÜËŒ^íWqjÙ‰ÄÅ [ŸÈ#d÷R£CJGÐK"Xò?Ä@xÚ†Ú§/zø´l, e6dcPqë¨Ü5{ùkÀán#üŸփ›”RôäO§:„ŬzÚÏ\¸îjØTù[á<;fpöb4³ÓV*3àár”ä/{S’òRt”ðSü¬æ3-$ž\x¯²Ï="2ŸóìTSÙºÇ)**** JDF) i% "XPA) !@‚!Š„:PÄ‚Ž%€ŒPD:(†Žè(Å„" JM0TñßxæÎº÷Í[ëžÉ{ëüÖ^ë@rö9‡õßß>ÉþŸo‹]QÏ:‡Á«ù¸ãÁÈ·OMæ2EÃ>YªÍ­(57֨Ѵ¡âQßô›ÒìÅ—ëW“Œ44{ ‡%K§–¤=°w]Ú?ºVa nmæ‘;™Ñ¦õžÅ޲¯GìbêÜÅL‹©K µ+û¯û¬XøNÅe#çüMi¹¦´ÝV«/‹™îêOJR¸™TcoÆ=ìudrz¦&Ÿ?Im?`‡êN~ÞhÄ~G¬ñeoDH¾Uä]휿YJÝ=ÃV#©£|¼4¡°A ;¼ ¿X½ÆÞw ºEiU‚M ‡ÿ,µ9_ÙÌI°/å*;1@©~"Î:5c„•%ðƒ®'ñ%0ÎŒåÊìí[/¬SøÅ^ƒ3y ËêQ”+øZõxšÙq#6“ w–áX}Š“o{þxèf~V®~—#;¢¡|yS¨QÚ°ÀVkýšóúâ sìNí!dËñ¤²—çÞè{œK¯IJÝvˆÒÀ´õýñê¢]ì½£»Ëí5v64\Ø4Í¿ Û’ÿ9ÞFPW¿‰åœÚÿ²û¬˜½À1HýŽWõ ‡QŒ®2Îë³e +8ÿØv@°Jî–¶KªEã¼N§ê†·$eë„Ô”ù"ð»ˆo†µzvÂåÙ‹£ä=ö® Öçë\ϽᮤÏߤ`¯z²ae´¤»9\©-p²ÃÁŒøe¥N^j ¿XÁoÍùWJÔûi6{ñÈá§Á¯;¤™lµ%Ü bYI™ËÌéfÄÏ'u—#CÓO·¹<ÈŠ—çúßSëŽ3ŒŽÅ‡y|ÉOâiuïaï´äqJr¦T>4¼öì-=ÝÃÏëaEUfçòR>zÁ.âÅ7uÖ^Ƹ$ho+\=¿©ÐvÌÐW±£#¡áŒœÉ‡Òkò‚Ð}kCÃn8Ø™úQå¼!/ëðé› 'Ï6¾Èw›Ïʽ¢Øê—LÙ°@ŠM"œŽÇ‡ÙÕ?gL¤û‡©XVs–Ì#’bðâoÄmìDrp‰êÜ“0 7ê„=ÆïºiE—ï?ƒ³‘MËL¼ð9/é&ä´à$'eѵ†&fûbCÙÓ¤¶Ë_ð71h×À€¥ö ìæi°×ò¬ôŒIæøÄ’^±­ì½!Ø+ÇzW"2rÙÝV^ɦæç¹®Õõ˜Hþ¦‰S› Þ¨98Á}º­‚’M‹^ÛW¾·\®¼;™,¹¿é†Ñƒ˜^1iö burÙ¹Gx"Ñì uØäÙÒšÜÜØ&Uµ„k<‹’]a~­··×s2ß·ÿB<ï*s+Ž|ù1ôøÇ혧ŠVì盚N¬ê7nH¸±!ŠÃý‘rðcRÃÑN-Æe}W·ÙÑu/3ãF¥øósäÍ…ÏL]¯ èÊmÖû2v_3H5k4Uù6Õ¦Õ¶ åR¾˜a›Kí5/ãÞºU連Y÷èç<ÁÆVÿ8Xdïœ1­ÏNßGW­iJ»z«öþb2MšÇD§¿8†RMtð¶Ö}Ç_:(W‡ÂÍÐsÒìÍ'ªúd\LÞi ;èÃË®|œˆyåàås»uLoËÃO¥±v ÏRžrœ=G\(%¥Ý é«z;?%­s? únóú¼# ¸Shé-ËÂ3Ë} /¬·ºVØF4ŽÒhMúÊMwôä?{'Ö°u`M4·¹ºf» ùP\Ö-^Z&¡+oÏ–{M} µjU½9-v«Øánãu6.¯Ø–éø#óÕ?°ß·½úBZ‹¢ þ:ٺĺ¥d ¯Y?vâ]u¸YШ´¢±)æ™V–ÔoÇ:—o†Ë¬ó›ò:È·ÈúÓ9ŽààÄh×H6¾¯·­­º®°uâ)ÂvØ¿õúDædÿtf<·õèû¯ä¸x ô}×à+ö²y[s€ÃiÞæÁm¿7aÀ£²M*9ìK²´v…Êæ+ÜB)ÃIw|™Óà +‚ÚŽ‹ïVù!¼BI?’ó~cO ½/ýp™ÒçÁ7‰l³ÆÐ¾–7Šì#eÏÑôAû~JæÕ=Y޵ÆÚ„·†¼# Ï«?ÈÆÌ/K¡û¾ÍßO+Ô¾À•r'i¥ MŸ©~¨Áö®°åö%\uñ½}²6™êVÖßp1?ãjì³¥MF§V$Íþí¬ªsŒÂóýd‚êpV®²““Ü—|jLëÓÍ÷Ž–ÕOg>´½°Òå“wÎê©é±Üé}ôòŒGÆþ•†fg ‡.{D•ï±[§6S )xOß¾ŸÇ0ÄÌžèœVpfi¯#ŽÎ.z¡HPɳå5y—ïè+Øéœ3áÇ{^`Òx‹8³tL ™©m‘qª¥5ðèmî>o—kA¥g^ÐFÐŽ‹#Fc´ŽLT¬\õA˜žíxb ]>E¥<ý÷W6{hVMn1ýeÍ]‰µ­WŸÆNÛ»Žé_Þ²d¤|Дä|#q•QväúÕ›½/¿Úš­ÕйÉ$ÎX¦½;Ä0Í9ášž`J~81n¡_:]ÐÐÙS®¥ñ.ô’ß={•›éæj ~*‘…gK£:bîQàÅgç[¿¶Ÿžzxgi¦„Æwó×õ®.C;ÂÜà –ï5±›é’y³û­Eê]î4 ;ªèp{ÅÿV7 2/â¼ìÖÇ+aAÚq˜ªKÊέîåHÞ!ï­Ù\òA^Íh Ûê΋iví®FÕíÁV›·‘‘ÅVÆÂí/ûzj„Û2E•»¡Y»~ªÙú~a”p›µk‡—w‚ì jÔ¼¹vÒuÐàöëG­%ý‡w—»/v;PÌHÇÎí/aÊþDÿ¿òk»Öxï3uöȪ!ÉÜF¸¿°#­¿6 w/{CZöá±dþè"ž}ebª°«û(¥¿–=´GønÎáÁäçÍö÷¥”™ìl%~퉡ôÜÃ]ÅÅö礔¥Ø%}~­ÏÐpÚáÖâŠò–͵áÜÆ*;Aï½fùšYDuì…ùêlM)BQjŸÝPFBž3w¥_ÛŽÐþrŸË¿ò¶oæ¾³¬ëtYš#ßÔÄ×­1Uõ¢ÊXЙ«B²ä¹32ž¹4—­_êpEg›a¼bΔBW©¸«ÁãÉçsé¹LF&Ç/ê†ï{l‘“Œ\öëúü{Sq‰ö2X${<’û–}c>QV¦~Ûo¼ZÑoÛ”§Ä›Ès•ëœ]-ÎO•\WrKñ×1q†_ ôPÞ6ñx)ÛÞýnáO”h³¤>woß:þjYE‹—SEK*·ò—0ìíìà&sŸm›QÇì: ÄÈ‹æ}|kíòªÆ‘I‹ü5%Lºð*÷§ïŠøPwìUKå1wš[©by¤öYæÃtÉþƒ;ç4ú¾Å‹ Ö,pDÃV&pv³7|ߦ•ï*´ø¤Ï~Ï€*2Š&@ÿO„òÿ üPè¡ç¡ç?Aáú;шLæ²ÕÍ‹Fd1ükÏÅú4*ý8ŒâIvÆ«hkÃ…Äð=áB¦k;1™*0O2 ¯Âd ‘™2™¥c ¯ï·ËšÝAxø×¿È‘ñ_ì= TÇßü«­õ(´XëUaÅ¢@‚”Ã*_‰!»!Ñ„d!‚ªxÔ±X­¢B+U¬VÅ žÒJ)µ ÔZK…of7\QÿµÚï{î{ÔÝÙ™ß}ÍÌfŠFƒ§ñVVˆ&Áä<C‘ÐhÄ‡Ð¬Ö ÄÊ ôAEQá=N&" Š-4á°yO´ô" nªneÂñ·f’P…Ìñ3^`ƒÇA#ýŠ5r¾0Z ‚ óóÕsâI$RòÕ·H? ¸ñ¢ÐއºyÑá‘>´*E_|°ðPàxÏ&L, å‰ûÒñ"0d@þü11”K·bl Ð44|ç¹Lô#ìZ Î cub×1ØZRïÎ"‰“‹pýgá"11à3¹4J„b ¤KŒˆ@*GdÀ³D’0b‘Òñ‘ ˆF ¶@ýY#È R¸(ðe‘ø‚TŽY[[CÖ‡°eà/E1θ‰bˆ™wì)&î-N”NAiv}¶è5\{¡•B)çcZiÃ>° ÑC3DiÀS”öi¤d&˜(„R1Úûs‚ç; èYçô8ÿè~ÿ˰¥Sß|ÿû*.z(gç€ñ|#Ôå‡òètžÀΆi'@Qúºé{sý³×ßôÿç: èYþO£2zÇ:Ãæÿ7þÿÏ_ºÎÿ¡RPêS-A{"ÃÒ¡Óíàzoeþ_ÏÿŸï0 þýŸngǤöñxþãÿÿ篾çÿèµêé 4 Îÿ),¹sücÕ}þ‡‡GFFF‡ž^`` —Ëuvv®ªª"O266Ž‹‹Ó#rmN§×û D¯ó  Ÿ£®z¬®ŸüÓP¼2m¤Â7«~Â5lóíøàã»'œøªfÃ’=7LþeKPpROvåÈUSkÁ¥¦ù­RÄDœ§ŒOᙘ Ÿ²tà†ÁˆËo|ô¨×À)µæÔ€·©n탪m‰ÛBJ´©‰»êÙV4¬5î/ŸA‹óüuõ’±FÞ§G7gÄâ?ûU}Y^Wºrˆê`cÝàÄÑKcwòíðß9àžÛ1³šÜË ’j8ãúéyvN1ŽÁÛ[©œ£ŸV·Ó5´]¹»¶.÷ÄÖŽŠìx»á'—UÿY«·Ïæ!å·À»æÛ}ã-?ú4¥©ÝmÎWßÜ}# ©î­Ä{ÙŒÍë}§æ™vømÂÏ~qÀ¥yÔÕÀš‚,G}¾+›û¸Äƒ¿¢†³ÍǵÕéúÌ߃n7´/©ß±ÕX¶N06'oìfœñu‹â¸2®ø¼~㺬Åm%{Å–_/ŒŸ[«ì(ž}š’|7USšoUqâãÆñã~Jd–²h_BËÞ«æ.)g¿5Ú½¸Í"×yÍÞÚ‡·%oáŒhÔ³½±ÊŠéäUÅt-*iNPoÑ8Écs–Pì3m%ÞâèZ¯V#–s[Æ]—¶D ßÖª[__n,Ù¢™Ërθ&Ú¸mɯÜê÷Ojv笼TÔ¢L°³pøÒ©pü-8ÎzGŠ‹ùúæK-~ú´"/n‰²öÎbªë¥“ê›MU[.Ü¿:tL#ò@²™ŸsûÁ4õ!ÊF³:Èç¨[‘•*æø¥ØÓßnߨjå¬ÒÀ¦Ç¬†ó'¸k…Eþ³ödÝní|–âÛqÙtBH²õ¤¶ Ö½9ƒvHÏŸ3Û¿ªrÕѤõ*+Õ¬*ãV×GKïÈ„yÊ…WÊK›TQ‡¹OMà´PW}ض£f^^a©;Æõâ–)+S)žÒåüœeu j7±4yg=†U­ñˬ=V;}}@¤Æ[U”^ý×wwj·¶&û|_¼±u]åÂõ÷EtŸ0ayGQïŽX‘—0gá¥hMòåæÚÔ ‡ï~”[8<-þÌ„qaʇÍ=”¨Ï›A;þ‹"#w²õå»úÆ©Ëî|°±¾ÒH5­ÊåÔèÆ¸húÇc=V:,ÛËg”â5sv›7 ù?1srSsåÙ•~õfNßÕ7¼UѸ«àÛ*—ßwøºÞU~@çÝtï¦óD~{Äâýë¢SfL=R#ðQ­.ºÂܺzýdótŸûY¬÷}éWÓªÇ-Ž9ûX5+önIÓz—ÚÍMÊ …[ ü/ÞIJíš÷§·óW{íBTb· ­—™~ì¤åÒ¤Œö9åc@[Á¼›ŽØèõy,û#üzà´ûî¡ì;Í?@÷ŒùqXVÉõ1ïX PíSãõ ÍÓò¤GaÃ$•›KaÀgÁ 4¦ª‚yØzptÈ·Sú»ö‡%ä `ðÁQ¡£“w‡¬XÀ¸Õ2væ"0æÌË^‹î¾íX2¬d$±œTŸW•ÖN>(X•ó}}­föƒ+0:| çÀ­k‹âŒnñS3ÛÿD×*M­.x|ÁõÁB¼fÜv|û3Uq¬¡fÆ\õŸ\>Ýr79[9=H~~ÂõÌ[‡~ÿø·Ìk~7Nðô7¤*¼C>HÔ˧gí1or:£A¾®¸Ue¬^¸I!/ËÄï¿ÛPÒ5ê×þÃö_’_”ç·ÁÚè?+ÒÉ1uÊ Å¥ù|}Ãc·GÄÌa¿5 Òý¸q¸:âÑóö±ÛÑ™Ã+N,ø° Bƒü–O޾>ÑÑê©:ýê»Ô9^Ü;)æ1?P››4‡Û£Ó•©Ë[ª#þŠw­74­b©â’Íb׿nZ|GcÛm¸¸ë¾E/ðÊuªÌï¯}¥å«§5\ŸÓ²x¨‰v«SÒÉn‘íÑ7ÊìGïüsNF`%gðñKÎ\§Si³K ÕLcçD«ýÇ5™TñIÎ%?qIy^ùu‡¯ïM¹fñë~éÖ³œuk¾ã¤Æ·}¾¤­¾Œâ½?Szs‡s –çíÊÞ_IWù,7Ò0ñ_ý˜BíýÈ`ãjG‡«RڨƉ÷öéÝ‹"=ЬÚTqC®ž<Äð8¶æx‰'ãsÒª2ï´dš±YF©·fªK÷š®0óˆ9œW!:2l¬ZÚ<"&èpÞŸSf¿‰Sâæ®çœíFY’üm’ý'f{“j殦†žÌ_¾'—öÂGªÚ.1S46©æ{Mõ/œÜº¢Ìp@à²V–— >ž!;X_wÖ¦ÙÏ¢u÷Œ2öóW¹~pÓp¶WÞù‰k†dš¦í2€ewÏC‹–Z«ÙØK+Ð3ye†³X-“ÜGEüÕ)GÜë‚?lÎíØ’­l?¿àYnåwÍѽÃ~ç›cÕë@>:_Ùê´?ib-ï°[q}ìL«¯>zDZúrýâ’²Mï٦ŵ °±é¾ûÁ ?ÐOÎ}™;•§A;…Ù’òvíG¿ýX <êQݱÍö¨gJQ…UIä¾ôµ‡s ²ƒª¨²šNýÒ¬™}§í—šã³KËK†‰ûý”_ØûÃ⸫“ÕÍïÞ¸uÃP•oœ”–9Æ ñ¢w‚‚ZüpíˆYN*C£ ù¹×ÜÇ$FZüƒÛªÒ ôü5‡ZÞ¼’ª¥Ÿj¹8>¡`Ê„’‡‡ÎfM1O©–P°Û„u¬Æ»4þÓa5m§¯mÌß%œÐñ]YdžÿæÔ0áÉm37•ïÛs4mùÈË ‡1LêÿЦ¸©N‘Ôr¶vMä;;¸šxS0%ãË{Ù[Ç$NsÇå×y?Ž-w[YòÂ5bºÆd\Ìg›(¾0M9;»êíÇ_.™ºû¾A¥qp‰qAµ$=¿fPQ¼¸ndêœù¥•yF;:¶ü¬®>-Ù˜\6ÿxR²:Š.Fºk–i\õÍβÅÃ8:ß:¿7~dªÇÇÏ×nzOc•Âdº%Ö)ÓìÔ¦EêÛÿËÞwÀ5•lÿ¯²Ê*M‘ª¢ =º4 Q@& ‚H DEŠT¤÷"*(¤w‘"i¡HB $ùßÝÕÝU÷÷Þûûö}>Î’{gΜ33çÌ™3¹ó}ˆJš«68¾Ÿm‰6÷¹¦Þ¬{¤±h’ ˆüs¤on(–Æ0Ò-x*ôqÏm¢<@܈ ëÔUÇ·UÉ™ëÒéß D…´s•±Tì–E_¶Æ]FIžé혤5H}nwL|þnÕº ŸÕ´3@Þ nc ®6uÜDVRn%Ê”©Ã Ç$sÑJ&ÐÙK©ÛªlàÔøšÖ;ås—^:9Êú3=©i¼»ð¡æÄR¶åõ ÇÝü‹huo6<± æMƒW¨F¶¯tVüŤO|ЮŒŒ½~ ©za0⾕zÕ°ÂåeØUï4—æ#ÙGez×+Á¹>¦µk†^Ì:]V%(옊>xëTPÄAèŽÄÇ ŠJ‰àÆ0¬‘`æÊ“Ç>M3AôÍø¡t×¥Þ³Û+8³iwÊñá¡íÄš»‘q }u}®K'aƲÓr@´ìýø«ÖFF¼ùi±]æpu-j™÷ŠË9¡«P–ÞÁøò{šz šn¥¯*Ìq—&$EPt¨,´¾;Ç)ª.“¸q×ÐI(³æÔ‡\Õvâ¬û+‚•ó3c ŶÃ=€"Vîo§ô@…仼ý/pjå”çͼûéÖÉÙŽ®¹•ýâT“Ú æVjWóyEÍ/d !è²ÓʸK+Œ V Ü\ì÷(¨18ÕÛ‡¶(¤¾pÃU% ̳Üp]Fe/—%YmoíKÍ@çVm•wjÝ 7j¢ø¸vÇ>zQÒÒ~êyL^z>jýåøë©¢~âdR>J®®éu®Ú¶3ïá±Ù§•:^Ç…9lï ïìêÂq°ÎRà-ÏèÔ»ôÊŠ÷%sFæ´\ýª‡vbøRæc¾•ôÃ;òØy‚L][>.BŠ7Ð…L•nEæK‰‘Zßrê.už=̯’aªäXÄB5Þxƒi;"ùl;–N᥃õœd^å)vùUгų~£-†§¸:z5MãfNqÕÐ5J,+;{¢Ûõ Zç`„ pÓó>©ÍU±Þí­,+Ìט{bÄ´ÜÁÖnš‘~«ìE¤z“½þ[õüL¼÷¯QƒÇñ[ž,ÞûuìV# ®cf*¹QÚ¹Á> Xí|#wèõm586›5&©»+mCª$2üÜšÙÕòûœSë]<ù]äžÞK“>ß­žŸ®¾Bä.‘3óÜ­Á’ˆLa•…%j~=އ˵‡YaC×éåçêÕ€Új~–9·–¢“WÈŒëHfùða˜Âb'a¤^¿ºFÊi=4m̨ùâ-=Ç»;[ò.ë„.bæìðMVÈâk<[7Üjí;JÂãÔáQ˜kª˜òçÑg`{+0øÖÛà7‹Jª,ð½‰T‡ûêæÌhaHD;sAƃ2£§+yCÜŽ&½æç5WmuãðÐ.¬w–Ðe¸PØû“æ ¯£ë ªfÜe9€Ê-bÈkî›YzQ¯PXð¼tQ>Zk·Ô9êÉ›~³m;ºBeEÁ&ŵÅ>…š>UD¯²ðâ94mƒú"Òi¦ïAmo…,«&ÎöeLÚ÷›IFv=«µ{˜ Dœƒ´õDå¹§c÷<ñCèCQƒ˜ÎªŸÓçÔÕ-£]Û5"# 6\iFç ”%ø„ŠÏE,½xË/ö¶I¸„%e”óAµµPɘƒ& >4qcÛ OU¤µ7{ˆì«Ê"@†(M„ó[´êæe݉2hdÄE—6eˆ À¾©à•uÑED£ˆ\˜¨ª¬Ø~ç§Y,é¼ACL=)XÕŽØêÀ€ˆkûñ“ ?ÎG,I>ûÃù õ18lû©Ó†–2„®ÉâS)¢½=)Ï|%×éߟ"œnZíp52`cêñ’_jëÒ½@ÏÀþˆA s TÖné팄x«ö¸…ÊBÑÖy9j¶4¶•û9%=< @7…J¬¯u߇±øšàðv§m%3Ì´¥HEäáÚU”0¸u†OÍÇæ92f”=ŸÂKš––Y·>#KO÷ÍõÕÍ Ü¹þúJa™:®·h7ôÉX™/^r¯0ò>îR&[>™l±Â±´’.½ŒF»ž13p©¸<­&iL½ˆ{ |¦9æ{sôgÏ xƺHž<]QÓ·ÚSûâú“±×î]–d‘|eš¬¥G°Qöz2·Ða,St( 8J={;üDfÜ*Si4K°sfêIe˜°Í"ŽEÍ>"îZÜO£q«¨1yÄÞÄ2§}Sá ÖçG÷èͬªÁäåuß*S³˜:îtH™xU3† v}Ÿ!½£wè¹áªqZ›g§>BŽ)=S°3¶³A¿þ’,ÿ•Ô‰Wrç†5ßÓÜ>Èw(þEV™ÊŠŸ¤¶?U &dÔã~Š ìÏ’Y,dâ¥Î»XDK3ìD´¾Ù£ˆU)µ…¡“+}ž„¾„žë>Þr›e…sâ•?oI±ûÆažø›Š9g –@­…qžÏ]G½õ\Þkcz,ð´#Ÿ³u£EFò]kŸ oç v²µ§o²JÉ ¹Ç(RçÍÈ•pKDzbŒ]V\->¶¢ÀÚB®nÅ9Ï»·% vê@ ÅÇÊO˜ì'ܰ|µÿU–¹“΀¬êEÌÛ—k˜Sü1ÎÑtzœumõ¹—$/عzë¯p©Œ,u¦þ²œEôòl÷Ö³å±ÇûT?Ó~Gs¹f<­~z—yOò†¡¼|hbØt[WK³Ÿ€*Ë"æ)ñ(Îó¥]ñ1ènE‘™¶"çf ¥é”‰=6ø‚([믗$ã¶É:YÖDfØK‚!©9d~võkžLÆjy6V±Ä¨‡*ˆZõ¹ù;kìÐx¼"LC0iêX^ÇLøGñ’ïì;ôæVZ™×®]<6û S@Óõ¢IyÏ„Såîbþ”Ͳܮ̛¤Gƒ¯sôª[7ct‡ÜLL;>€³B, ´«KŽ8N\Y¿îp5€VÒÀŠgCŸ’ɯsÎä:D ‚ð!býˆ¹yéŠS‡eÅé긇ÎFžæÈL@|’È]Q«+#¤ž¦ôÅÛ h?[{>®zÓU(•”9³Þ¸#Òaº°·Kk´#Òp÷Fváhþé™AÔÔ|Þ­ÆÜ_ˆô}®—úbeçBP+’]n"”³j?MO!ù3ÈH­æ—\g§Ùõ—o$wš™*û•¿èÀ*‹E½¥ã4 …·ÉÚ=)7™¡éI;»™%ÛUtb`$_a-îÖ¯§"|¨JAÉÀ°ªwJîhCÑEîɨ£; Û¡ñ• kBžvÖv7<1¢- -ÙŸP©‹l[T«ßè+žY`P<{ïÑEÏ­ä* U±´E_®Ä œìˆÀÇÚÁQ¤o†^ò"FwfV”Èç§ç÷®XU ÕúúG{9&Ë2øÔÚò«Ü+*MŸ>ãXË<¨84˜ •4ƒ}G¸l‘ËÑßë–ÂdvTê*óì§{ ‚˜{/Šð“³ÎL©$ü,»Ž ½<åñ+Š?iÒ¨NXQ¸òÈóþUÙAÍíUÆióL†Î^ö¼>"~Ó€åæ„æ§¾8öHi`GÁ{¥öÔx3Ìý´åÌ{ŠÂw§Ÿ©~$½ {µXÇ®vÑÍEŽµÙ‹L50¢ùDˆ1*©T^ê":4Ÿ0×÷v\;×y8Í'©¨&Þ `\3g¡ZÕôHš‰Â¢gÑ­8ž¶¨Aoa4Ë“™öRý¦b›iÍ `/ÞÛ»dýÎuUŠÜçU(áÅÉF÷’0¹95JøÂÜÌÛXL¥"6ÛÁ¨8j`úÍ‚‡Ý5OÈôúì.Ky ½"¿6ó¶öp|k~YÊë-s÷bŸ~äã>”$‹5ã-ØLÊØ]#[̳‘œäØþ…žö3ö«(?òómœËg—o¸Ÿ“Gõ-jÜJxOËéNÌ­ÜÌ,Xw v¸úLMÍ` yõU\)žœ‡¥ýNmuï.Ž\…á àUÑô642»Ü&£ãÎÛ*õ¢ÖÖì÷S§Ì¯‚¶œ ±8¼·ØTçîéV÷3Þ¥Œc;Šº:{gÖ·*  mm¢Þ¯ä ¼ «ÙÚ%ð ^ׄžß¡Òö×®WÇ|Œ‹{w[h̺Y/:A)Ð6ƒ<'¹,P Àdªçf»0…1JE%¹Áû VÙ÷õ¡­f Tð½zÌ;d‚,mZP“Á!Ò„K%®5Ðy.ó÷-û™ã ôï¿ V˜!ì€kf;Üh±·lFqN{7¦¸.7vÆtp­³ŒT¾Ó­ V˜ZpRS›¼Ÿ.‘*’0r–-ØCPVïèÉJîøþ`לƱ$‡±ïì-]Úô´Ì?ó@1?q8Vdpm(€Xp G—¦­C^ùÙBùùNwÚ rÒ-Î)¹g -¶^t‘Q&ŠœÖ 3rÑhJÊAx½÷oÄ›QÙ-câ‘=Õ˜:h6zðʈ‡yi·{™ïdË 4/µ‹Ñ~[eB(^ÇâÀL¹ -»>yÎv* ­ƒ,{tl ·S¹8”Ó¾ü Ú鞦·™tÏøÎ!}"3ý®±ïóüôðJ¡!k§½É©0æ~M ±eê¼µ'=Ùß9ƒ2Kx¢ë¢@m„’«|úÉÅPœ0ÎH}ÿdklWz%Í Áº {Ù+:÷1éF™), mQaÈ/㨅~ä~êP³H_œCöX¹Œ‘Í›“­,)†2&¹c^ ء܌Øv[ÒÆö©jEÒ‹ý«žrDà‡Õ÷FÛÌÁ÷c¡ï“em†C{ßÜÒćv@õ¯xË×#‹Æë«1¢E£‰,öÓŽõŠ\@ öò\"©µW¥•/KZÖ¼å~o— É« Þ–ßW0ÌÈÛÖlÇcä Qv³1rsº5L˜!ºvn”–€Ù(WÁÕSÇ‹ @æì¹¬¬« h}÷¡‰eg?âÚí;¢|¹\V¨DRݸé;Øúk“ˆrÛ"#mwÎõw BùéÀ*€äS’%f>D¾·{>÷Ú]*oXù N®u6ƸKmÝp~¹j Ñ„|ŠZ¨j‚{jàMˆK¬]Mpì8Š$Ü·˜(5½ y@Œ²ï:å¶Á{šT´A÷\•ÄÕþü8òyc7™‹-ìÃ.Û§7z†·{ÈÛo\;ÞU™V²p#⇂Gsäqe‹ýa¯ä«ˆ†祲Å&ið)¬ï1®ø ïZ3¿$®#½ºý8"Î︓é¬QBÙ$Í8).¬Re½6Ä¡H²Ùx}Ø›ª*»³:¿»Ò½Ã\®+v¤Ð­¶Í³lÝ)ä%[=Ã|K®ç ”Í”ÓVc·IZÍÑ—År\Ô+ó7vêW¼«¼qÞ¢l?ÍÓ0 ¤Ö'×{Uì‚ÃCˆ2b¶{pïÞrgÚɺJi.AX½»UÔ¤Ó>†yMaÅŸÑÞo%’=׆nÎÍ#WqO_®S'Õh˜´W€:G\ÚjlWw¶ [ñhàÐÄE²I;ÅäÁ|R‡¯Ó£Ö+l¥¥lÅž‡'!p;½÷Aå×£ö•ï.³XXÒ‹ Уg_†1g²¬Òl£)ð^™/5~QçNXüiF ÚˆÞAƒŽ‘ØîÈ#;ÀÂk^ÚM¹x}žÐ¾0TϾN¸*ý´l´7ÿ~Ì¡ƒ 2_ãiÛ^ÅžqËЩ*йv'yYöÞjv7±Þ;>áTi¯âõÄ>ñž›us—Ä^”Õ*¦”ßnšä Lû¹ë£‘ú9dU"ü°¹Ï†‡(ª½ñ©Xµ¶ímQá‚ ¤­³%…·¨Š\5¼Äó®´í×>(ÃȾS…Âãê± 5,õ«g‘³žK{ç9òÒÙ Sޮֱp²j,œ7PRZY0ˆ9cá3— õ;Þ9‡,:0ï¾u™±/Iü~Rêݱ"/´h©ûa4¼öðÛô„![\¤·?"vÚ '`+ª¯Zßì}ȉµã:ÄQ° ùŒ÷ašcV”ÃÈ-Äñ¢ã”—v½]hçVD…3lloC –†ã›#ö:ʆY ’ÃC¿ô¶—Ùì@ ÇÊðieý)"΋ÛËrÅ?fiñýO?Ñ ‘ ÿî êt+ òÙÇ„m‡HÛ=†Ï`oU†'R×Ót{(3¤…u¯<œ^¹£é}6%µUêŒÎÝ9/¯Ì«˜¤Nà||'·¦q7Ô¡Cü(';!Õ§pÇ0üÊNK÷,&A¹Ïœ®>×E%Qw+i\YÍŸfcKñÇ 7»=IX»Tk N—i£¤(œ{ùfÚÓ:o61T ‹ƒÚ @/¶ÙÙ†g"Þ¢ÃÎtù–¿—’¤‚IL”«ä½U¨³èÂMO »Âs°êµjQŠY;g«ºo«•/® H@ç` “Z“3/:ŒöͼBG'…•7I`ײAh¦±ݶû.õaå¯fMêP_M¬ÝßΨD½Y9¼sÊàì|Ù% w!Äs‰‡m¯ü%<·‘ÄÍ…áÀÄ Ú8ÄãÌéR–c$#ÐG–%ÌgíˆÞG¶¶ºûóv·›k£k!pi.¹ O½søLÇÓ'~ ¥ûó/²w—p+¾“¦f ri—Ë ¿ÏÇF’ …€n.l¾Ò¹ub+ËšŠcH»g,!ØGö<^/‹²ØÎéW¼è—Mæ´Gf¼õ‚“8×Ö`æ/.f! S+­Þ¼+ìݬ–Z™ï¼êPWŽWµZ‡¢wíS¾¦´J­~ûP7†—§ŸŽÀŠféŸ8®oq½0¦{“hnFR¿=Ë)ï¤VfRh–+8y[_#Â[z‚¹|s{Ƥ`=ö4l|îfHù\š ) Î¦÷ Nj xnâäížUöâg¡Ÿ/ûÝÖ5×ÕNÔe›}£Ñ.NxÅ9™®|b] (Ò5JZÌjK[\ÕßÕZâ§HkˆNè¾¶;ÊòÚhãx0±ˆk¹U–3cyåh@‰4kWø>U7<<؇-âE§ý…zvòOÝvR:`IІ:éo0 i®K<Þ‰ŸçàaOKæ ä|1~KÍë—$TºÔAi¼OQ[¡?@Ξ©š~Zö¤t{¤·^^Û\ëBUW…Ï­T¾®hõ»š{qE“™BÞÖ…^ñuŒi%®ð+çÔ«— žS ¯HÈkL²'¤1 =/ÎÉ„äU)ž¬ _ÖØŒí š?9•\‰¾§ÍD¾x2°Öèˆ|œMƒÃ¯‘—{Û˜ƒ<} át•9úƒç;‘!SÊÕïóîq¾[ b@ø¦¨F„"œÇ‚xe—׃ºošö´Ë$zT³„AÙ1OfðgÏÙ9;úpÆf0J=-–:_؃åž7Ç… Lôt‰´µ\Tï‘/V³p¯ˆ‹ üM¼÷/\EØ:tó—Úò³²­…઎ µg\j½T #ŒÇkâûžôôvùVBö–•ß'.Œ3cø§Ž^ê®BË—˜ËsÞópà)—ðÁ’<u^dVø³5“ÙckS ̘3ù ŠtrÏaÞ°`*‰•÷B>:Ä;’³®‰M« ò]nÀEœâíâŸÒ€¯Ü®|±³L•+®_|Bwá£ñ(YÝêëgæ +C"ß‘ÌWßÜó-ÏRkGÆ™ÇC_{ûÔªÙª“Åt¿ˆÁѺ•g¢ ôas¬˜><瞥¥' büEôB·ÄÓ<#ÛñÂ4kú\𣣰U©K-ѽ¨2Á1æå²€°™'Ú5  ü÷ ¯mÁÊùGL:¢ëy/ÚÖyìIpÊeÅl›XCÐ?’G²$!‡`†i†vð H«³HŸÉ´7þ¹,mò%zã:8B”#Ì9¢2çÙQ¤>4nÙ;½~@þš¦5\5ÌxÜ$²­}¥·¸[!.}EIWÈÞz½w´4ïçÆ°gMo¼€é~£´P§»„Rnfõ²œó zÏ oTÐFÎÒ–~å–¡‚›U7ìâ=j\=nÓxÛRu[b2úlw9Sý!-ĪLþIþõU=üs·„oÖºØ5á’œ-Ër >x“Â…!*g4 KûŽ9%¡2gËùe¹¬*”{1 áòìubsª›Ôuò]ÏõªRW†žÄº£ýÀÒ “ß8cC½=iY¤æ!‚IË%"§ZËr%ÖÁ[±úÈØ‹Q3~ù¬¼w²t$Ç¥®Ü‰+qxTÊï]±Èck¾zÛlP®«ÎHÆÜ8ÝpQJkU4OM[(`ٜ߱¢šÇÆç•²WÊ·)Jl‡OhvKe’Nß»2Tpߤ5ºwÆS¬—ŽIA;¸l[¢×gìµ:£MRÑ·/J±cN©£3¯L™¸dÙ4GÅO6±b,§Æƒ× £ V²5ÚMýÑí‘ÉÜ¥ÅÈ‘_„6ÆÐŸc°´mïäžpjIo or78ш8:¶TîŽøõaù ¡­MÔÈ¢Eù‚ãrþíÐé;ê•ÿ,Ñѹ7Å3žÉ+åiMϼ«9 †ž VíIÜÙ|HQ£Þ`ð@ùÖp¤ÌM’7'ü[C[˨‘xíÑe´‘2 d[¥ÞÄòN°Ï­Â:©ŠEž ÞóÆóYãRÚaØÈ6Å $Õœœgf;PN÷îRÏ:X®B»¡ÑôÊÑ{U'«ç¯1­ ‡®œ9 É*Ô¶]x1Ÿ‰ÛÚ\ïØxpmÙªÿè=ÇÄõ%­ì÷H»¯ Nž6é,n¶6ƒq½¦•»4mPXÒ¦À+ÿèÊA6᪗Òú<¨ …õ8¨¢Færà»Ä‡XvOF¸:Ýì8wšÉŽ%³¥_\nÁÚ·o©g‹Ëêì,ÇTÙO/ðó³=’*tÛjì×ÿ?áüúÿ¡ÿï>×ÿ?áüúÿÐÿ÷ŸëÿŸ€ÿøAÿ?ôÿ=Âgú—þ/Ïÿ%¥DÅ%Ä7Ïùñüÿ.áúÿýÄJ›(D¿ŸXù/Êøúûß Q°˜Äoø`IÿQêþãw ÿ;øKýÍ.ɧ¥r“Uþùò¿ù÷l $ŸlL9æÿl¢+÷‡BPãý-;·µ©ƒ`ºV²›‡6å€a3àï/P¿þ€§ð—iäZò{t…ZØ8 [ÌH)ë_SÚÙ˜ýMRò‘Õ‹ÔÒÅÅáïÉ·ú[ÒÝ¿Š`)NWû}\´p$÷Û/ž½™ü¼r“÷¿!ÜTÄBRò¯å/ÈÿÝÿCE¤œôWE0±0…š~» ²ÿTiÄ€6‘ù¤4€è—[c3ùKÂ? Šnж ôXMH;JÏüËþU4>2®£Ù§Qä{s»/Ãðý¥¼O ÷¾€³÷ål_Ä•þ+“þ*T'HJPfè‚`з :¥Ä¾`¶_Åé“”–”””–‘øª Q Ð_7ôG»üš$I°¤  HFPZLBP,ùUIäG­Å_ÙÜW›K ,HΉ‰K}UÐÅ.ÿé,úo´XB, hB,–ù:p*Ðg$>íÁ–ä†21±s´ú¦:$%A€:À‚’àoBŒ‚Ä?âJ97ê[Zƒ]‹‚Áâ2_Ö' ? 0þv4Õ7*#*&( JÈH Š‹V°_‰Od™þŽšû­IÏD¬DA›ý–Úe>Õ‹û|Ôo‰ ’‘f¥ë’]ÐI,?í$—Ýìm¾©)A)Ià_Lþÿˆ-ðÿÉƒÄæo±—ISØKƒ%þ ÐùŸAºü·Áwþ‰3¶_€àPvƒZK¤Ï8N +n=K(ÌÒî#F÷fi€G½ÔQÖHw§$+Q–¶Â›ã'P9+Ka`M¤ð-ŠðÜÜŸ|üEát¬@«~^:QaÐ7²©3ïÏó±+>ÉsŽ âäâHÁÍ.-l\?ÀQàÖȸ ÖŽNdd5S(· ”ÛÝÆÎŽ ×Ôå²› 7@É­§qîäü9neÍ ÜzÊgÏ*kž» PÍ ¤’Ÿ“>6öNv6[wS` õ -Q;«r W>¦qZãÜnÀ(ŽkœÓTÓÑá>9Ë­Ì­¥|öœ†ÊùÓÊgUõY-ˆŽš07¥Ì«¬æ·Â“1Vìl€aÝáÌA\[;¦£º‰õñ1I˜[Çr'NÅÑÉã#ØÉG󴠔𒠿1'´4~o@*@µí>p£àGYºØ» ÿ‡QF¤eEe~ Œüï„Ïýÿ ýÿû¿ß%|®ÿÐþÿÿÿw Ôÿïs9²·ÖÅѸƒó>ûÓºAÆ·üÿ¢’¿ùÿÅ¥€x1XüÃÿÿ=Âÿžÿÿ£]nš¥°õ-€[ÿ€-€ošå7w6sr`ôXXŠSÛþ´°TÙd¤ó¡@Z\~–þ¯o P¼ª _aëß¿+!búÔ×ö5@Æß°ÿ}±¢ûQ›_ý!ýßw,ÿÑl¾ê[6±uˆþ»þå?Šýû.æ¿Ìù%·£¸ÌŸTùu£¨ $)(!&)ú†¿QJÄBFò/5öU¯¬¸” ˜(XP\JTPLüënSÀ¥E?‘@LLÌÜ.]úb$¤€ ˆÊJ‰ÿÿà]–””¥¿î&'oß|ê6ý¶×WJZ”Rxii™oh#Q1² Öô[þW°(¹È Q2ë?ûý(]†âÙì$®ÖŽî®ÜîÖd°ZÊÐÂmaCfhçÁMñ¿ýv÷±C?úV¾Ú…€_–ùF:ì¿ÚÈYÿå®ô1ó_¶´©ˆ…¹Ä× þ¬ì—,0A°¸¸ ø×}ºð³o"×þÖ½¾%F‚¢e°è‹J>úg ýªJ>«;’×)@ç”hnòswûüƒP«ÿ#ù#X¼#™ÔŒ=Nyēǔ) yB\ÿU–Ï@î)óÁ¸?8ª\>¾§@doξ€D¿ÉêìçÙÌ¡PGû_C#þOÍ>©åŸª LgÌ)•TøBáÉ›Eßl¹ÍIϬz+nÏæ?®ÂÜÜ´”¿]¿ž¾Pôöýöþó¹?6 þáR² °äÿ½ð¹ÿïôþÏ÷?¾Kø\ÿÿ ÷~¼ÿñ]Âçúÿ½ÿ#ùCÿß#|¦™Ðûÿ?ö¿Kø\ÿÿÕý 1°˜$üÿûGÿÿ.áúÿòÏÓ”eå¿‚þý·ñ¿?蟂ÿ ’ü±ÿû]‚…©¸Xd&&j!*’1•‰1¢’â’â2¦¦RbÿíòýÿÿÕÿÿú÷ßèÿ’RŸ?ÿÉ’?úÿ÷…ÿm X‚ô¦%˜+»¸˜nþ¼€[š ù-!)(.#ö?ìðø> ÿNÿÿ{èßßÄÿ“ÿcÿ¦„?úÿwÆÿÞBýÓOT&¿ñ¿G¥P‡/™øß¾CHd´X ÉÌÌTWWß/**ú ø}»ý­?} œÆ§@ðž¯U¦»ÕåŠýD—ÜÙÚt-°*·ÒY« ϲ½>­-&Ò[ý“¤,£ëÇ_±k5o©ýíÃRfcÝÊmXkä”õ±Oãq15ü½Å*#Þ.;ËÁtÇ ã~Æ´öÝþ´‚)w|C´¨êÓÈ¥e$Älˆ&W`v̹A^Ôµ5ÑÏ„&®îgpOÁm5ô¾s·Ér¥32¥í²râyž‹ÁȲXþ¨ñ‘ëTó¥ìÍ/q%s¼ÄÂØI{ý–ä©J(ˆ¯øLè‚öeî°ϧ”³wò}ÌÔÎún·½Ä>ˆ—–É@’‚ÇžšÓCO}R|–φL#<·\ï>'ƒò‰ ±PĸêK¹[t”;,×»‹^ö·Ÿ'>&Ê/W*ÏCúcgtÎPZht^ñ·¿QæSz›v”¶­å Eµ§ ± ƒj+è-WZé•«(VÌ’ë_¤w&”kIõÛ¼x^C”4äzChUx(·ÇTŽ•þš¤MâcKß\žÐ}Ï©¨Ý²¶ÍøÈ øÞaÞ¿Ø¢ÈÀ`/9_æET0Ž /»·Õv¤H—wʾB¯ƒä…»ÍéÛõ­Ï´Ñà"|®lgÞ:æŒ`¬ýÔÄÕés¨ü!†Ü™¤hªÀ?}¨“š“Žë0Ûžoµˆ¸‚µ§¡Åá2~¡¿ÊÞj×éså Ýqd« œpäfÍeøÕ‚Ô#͈ÌäJN·S탷 ïøpÞªÑæxªöÐ-›§ÌP-C?¤e’{ñ’¶ú}=@‰KS@)Këqi’¹Ø®'7$WJµi™¤ ‹šŸö-/e‘”éfpÐKý´lÓ7HI>0#ý…†$”ÆžÍEš•‰cZ[Ñ6e7üý ذ"û¶ª8ŸyÿÛ2v‚«E2ws /4£Ï &ªô¾Ç_7£ç›¸k¹,ëâ2‹ÁhE$ìýÌV˜¸e"­:œib´!AÞ3]}‘áJL~‰bVÀ.yÈ+ù}hãY¶¸Ê„“ý ¯›S¯k Ù,¨ÞÎHªÔ["¼GÞ‡ùªàÅΧ°½ÔOO”CÞ¿˜âšÅ˜½hÀ^åt­¿L®É[„’3\ DÍäª4>Ò^År7[ŠV[p»c"%M\´n1, Koõ×ñ bY_^£G¾W;‚M¨)º¶R_2¹ düÊœ~‚¸pˆüÝﺺGäæP33Ò–ZÜ–¿£ô¡Q§ªËí`;Ûü ›×Òö:ùñKEÒƒù¬`í*™¬fóÒoѺ"¬ª½´;y~e»ô š(hÐÎA-¾Óô>mŠíöm¿ÞVÖÈ®ÚÏ®EK]aq§è²÷Ýè8T¬l×!ÿ» J”œáŒïJÄÕzýÝ0oÈ·ŒÄ@UøTȺ…~ï#Ù®‘]"|~T¬…¦/SÍæÀb‡!eû(׳˜å;þ>š<Ï…m0ûi¨cOØõÝ×Ì¡Z‘zý¡QŸ(U'R¨™Öø–¹´fÿ”°"¥Mi’0éÁ]Fø]¿!äo8~—6Ñçîòþ:P"vHО›>OÿPÇÔë3•áqìu>‰9Ëû³è’I‹otf:ý¹‚±gnôïZ «J0ˆRP=oïTøùÙ~,VÓQþ™0<À]z˜ð²`!ïhnæ›t†Ezjìþ£lÇÚœV( ^÷çÕáºK±û]\Dg²q(‹±a ¡Ý˜x˜¢1þ{5'»—puµÇw8%Ÿ åœÄ~®æáÅ>…liúngnöˆ®öX Eš¤,Gßx}WXñ… ªÅºXëb™}Ntæ…÷rÙ™ù}œÙ“Ø$NTVråfôù¢¡TuÞ'ldßH¾4 >d¨s¾N¬1æZ –¥«`¥c ¹Äá?JP–ùäsL^&¾O8¢;O·-p(Ø&'ò&].uäØmÂ#Ê÷ R•bëjÎ/2Æ}»ÚÍ k.8³OØÄøm× ë ·ªu~A¯¶ÐÑn $h©X_úÙƒë=¢€$5\Á%;®í9¢l ç!KJN¥é[ C™ÓÁôq3ìž/ýä?ÙÑ»x;;爿p*GkàäO“WæbÇ)ŒÑÝþ  LöÒà«Ò%FïÈqS„ N€°±½mZ´DpÞ1…bJj6PCžÊÊ•©4t߯wg£ßþÒ’Ü{'À‚ô²¥î'ú ?UžuÉíN( ž}§Ð ¾V : Dª!®'TKI×ÍOsø«¦á ’uÝÎ'T’”¬(Qcz+Û D‡Í U¢·nâþÝ*räq‘I/…­CÃIõ0}u•T?­Î»ŸÕ-Þs×°ãw„,qž”UP"M‰iídv•/iñSQ|¹0TåöžM¤‘ûv™¬|É o+.r‘sÌ›ðõ*‹ôhÁÙ\§+©*úœP¼ÒêíŒý-åW¯‹îf°~Õ^ÁçO¿/:lÚ§_Òƒ•Ïþ–ÝßûæÁ³@ž"(¡bGÛ!NªLþ5˜›Ñ»ãj€ÉÌ•\ k©„…ãIò%_Srâ0`è¯ïÌ™@Ù_Î5}¥?þ!áý[ŸVaIŒÔ®CHg¯]`µÜðOí§Ü¾¥²*TH &=æ˜kkäUDI‰”ú½|,F¬q^ ^¶²ŒXäz>êÖ±A‰ºZ,ü1/.™0ÿË,’Tgߌ—ÎÁ]`ýØúðë*, ]\ \¥7øÐŠØÝTÚ͈ÇÓ·§D“.õ¨Óª‚H/W8û%¹ž#Ö¸,Q®n}ÎsvÕnP·yZz½Ý‰gÐ…¿RŠ@»¯ì¦ZÜBJÚYe¥äôa4f®Ý‚,o”zëS±pÖ™}¾n¼ô1‹1(•EÓNWTñµl>’ruã`†È¡L¤Él·‚?ð…Êåôo™`›%Sì%)g”·{ù,ú¦üMÛÙ¯u͘¼{Ôè°×‹þ–F„¹eËìK)Á{½U¿d1xޤw®³ñ‘ɉ=dÉ¿õÍå²Èû*¶;¨E õwO“+šØÂóéŸL.)Ø=a¿ÙF>œŒÀ˜-s S/ ËF3¿ ¯^}6ñÓ"åéòšó°®*P‰«/oPaù†æ6ó™—‹5,'%¥é¬9žõ¿®OOâEV Kšëƒ[#ÌÔÒœ¯ø/óêªN³R¯—S¢~虃< 8w…”²v›ùîÉy«g Oü^Xçèí‡*—8–UØý£3<Že¹Ä=c8ëÏGÿÖIA’mð*ps‚ô2ŽÿÙáÊ:ï[=‘c¡ÿ½/‡ríÿV–A™!D5{²ƒD–”´Pö5c—K…dÈ2–¥Pö-ûšHvC*kdË6TÖcɾ¿7užsœç¼Ïÿù?‹Óû~|?Ÿ¹ç¾¯õ7ó½ÖßuÝׯåRÜu^ÕûËÇ×Xk\d&¦Ó9øyQämQ®±4aÝÞ£iúåWN›Ý¸lô:âôQŒž‹ÿµÄºn„3t Ø vÂ*ÿÂ%1'ÛI$òeèæ$g¡³ ’¶áo“ YÓ2@Kc°×ýwZìVlî½ ¯oÆÀcÖ 1¼8}3#É%ØÁ×’'†Ïl–M‚ŒÊeÊ‚CüGïˆÖ=Û$n˜U„…AòsMÆï‹ÖÑnU±ß˜÷½êïë?zw'D=û} n×쀵™Qé˜tjgè|UæºPÖ¹¢xÿ<Ìá+èÒj\Sg?ìe9á pàÊÉ"Fp_S]}oöÔQ…©Ís9ðü¥ñè€_k©*´Pªš‡×àKÚ¬araÌ+Š=úJ×nTú0«_ ÑÕêÛ¥C3¤†Û}ä.Ô«£I³Ì‚Ÿ>3xÊà_dèñ¹žK¹ÇSP“ÍJš=0ñÔgž‚åmçK"êޚĶŸô<±:ÕêÀì7qwøþµ¨3äŸwRƒ–ޤŒÈŒR»mgºŽ³pø…«Ù£å­ÖÄ£þCöæAÉ ÀOh¡ âñ·Þа¼ây?“Ïah9šU l§aÝò À(¿ô°yæC#Ñ$éÅ4b`ŠÏ}–Š>„%ÂÕZ­dû2æ­ÀÎNIú••n¸ÔÊ?\^u“6‹Éßâä¿´Æ¿†¶јháý_âb(æDø§éõ•g`[_gÅ~|Eü·¿ÎÜwéM=ž`¹Ñhbd<„i-5WÛšqÜhtM1’¯ÓÖÅÄŽ1¶Î.ÚdUX=6 ø?ÜšY\}¦¾qé£*¬ýeê‚ØZd`°¶‹¿sÑyNº >4t6&»¢»Ùá¡X2~pzg$]'‰RhƒWøîŒh»ˆÛ¥¦V<…¹*_Çj!ÃUT¬2G§c±Tn7À©«ÐÍMm¢Öƒ¸ §*({E–8ùW·ôÆM[6àqÐV¬ez!“J™ Šk«x¬ºVBôÑÕܺ¡ê“†t 0]‚;+BŇ̯Ežå8—,­—yy•l¦Ýb¨cklìéêz.O¿¦­w*ÜëÔ7(qXÙ‹îô(ãT+”lÉ-jlû0¡·™‹žÎHS¿šà4˽u¢òfGp§(?ƒ|"aõ§8ûYTõV)ê[ú-0å/ÒM ô-cûöµprAÆŒ©>»5 ‰¸ÍüúøÈàÁu,Á©jà è•lòÛ#XìOŒ8þï2^þ3Ás¬üE‘í÷êÎÅ2ŽšŠ.ÞW¡ìÉIÙz–æ)—<ñ9ó„ÿ«ãìbÒú•VëÇEUü‰rËoŽùÒ«æÙ¢75ˆ©¦Îû^çÝ›~LÜk¥äð¦÷ú啟¸po±s<à¶mƒR»,è”îÉ6[ÊŠ».`ľPÒU·”qM ,›¥—I™›:Ÿ+ 7Ë!úÄ¥¦Œ|b³U¡Ýâèu.@Ì1t>x;QÈm´â\ô»¤+dK 6Å V+ö×5›[£ÑZC&È+_ù¾²IUF¸ÕäÍå3˜ö¶c•½¨ŸÖ”Øh/n‘ˆNxy#§§õkEƒŽ +•ÆëÓe ñ ù¯U×2˜ÚíŽWì2íGKÑBÛ;SüŸ—_~•ýL“p‘©Ó)‡®òÀRØIÐ ö†Cã}_¯ÎÙo= _XNøÄ´ô©â¾šmûJàײ;  !["ï½uÜlAš~9]ÿdÊMp¤À"ž#LsÚÌ•Ÿg“TèDßÔ²ýÖøGL~¥~͇ˆ er\{ºã¸€Ú|™BD›°× õj £žž Á«fÃ(²âC5ñ ˜jVMô Tîø­ðkkd¬7‰ÚÎ+D°äV&¹}ÁæLTÊl¼<9 ‘Âm¨ /ÜÅb “2ôîTª,(n,=‡Å›!+ͪøtoÔPž@¤3ÖãîXT®æn½l’Ès²oö'Æ‘Vh _tÞé„ÞxNú L›H†ÃTb䈵ÃG¦7XÁ-nNéÓAkŠd’ﮉÙסÕJh±ý °öÎ|å6²÷á×¾RÕk;OcÐzÍèÖdÅë‹§mÖ?=ù4gX´ÁÜ–«(á*–‚¼5}’P7ƒ”ŒÓ$;!DË¥ó96ûs?‰ £DÍ^6Ãjyy8È :Ó&P} Êdòž÷TˆW»Ü÷|>ª&®Í9ª‚€æ˜þ¦ÐÑ»LRî'Pâ.Ðr~šîܸÇÉs57`cA™¯–3–Y{©â¤*;¦P*áUîÊA™¯l¹Å'ï”H»H½p¿%Ñ9”‰[) Y;‰íj”¨ò k"Hà¡Ê(TÄä•ÎVËœ¥TŽìY,8•ªNû8ÑØ5£=ø¡* ˜ºÑbsÙüÂcžÚ´éá·LWÀÔ=øvÌûjŒþ ; r ÒU”ÛGòɶ‹lô¼H*ú9­Âju)UøhOæáüG[nШ€IQMm 3)wU_HU¾O—b42 «pÔ#™‚$B]ƒ< h\ N³L@öQÐžÛ úþ?Z:ræœÿ™V¨þ dÂBéöcõˆ´ îî:h.pøÉê»*–~¬à4Ò:- 5~±ucÀ¶ëšA3Jr¦<· ¶];6wi•–]ÞÄ|‘.¾ë207ôý÷—~ƒi/ž*–ÚÕ¾ŽßWÿGƒ;Jô5 Þ ©{jì·RŽfGÆhæ%¨UÓûPtÁüÉ‚©ò¡v¥œ‹Wg¯q‚5"ŒÇΔ¯Ðã2:mòçﱄûç&±ƒf+}¸šv±¸~ÝÊ”®(à¥ÿD?=‘̰hð@Ëyƒ½Œ»pìÉïë±QÃ9Vöþƒ¨œw½C/êÍk¦‚ù_lÕ†‡–3DÑùã]~KS~°¸bÎÉJÓ±ä:QBÜ©ÕI™«¦Ãfc…§5ƒ´œm·”ŸèÛ¼ÌÍÎa¸ûujºl/ eVÌ)}ÿá^•ÌÕù>«½hÍÅGÉÐHc“…E 9ky¤Y&$"i‰_i:Ø#69ܵŽpÓ€Ebf!&cmà×}OÙn$5½92ßo2¶€‚̘ب<@;Ó³æ1|v u†}LíãÜøÛÇAÄ®—)'Â’—%uQ8.7Ö oÆó–áØËƵòôù!HDr§–óÇt¹¹Ž .‚·lBP¿jõ(ØVËGH¼Ê½¶3†Œ#^ƒ|åš”®Té¶xST.PÄ€{àóhRZ<)»ÕÒ…%ÊÛ"Bo±íúÍαXÓ–6ÔáýèŒU÷>e"‹J¥W\Èòù-®¾Ð®%uñaÅ¿Å]°ºjfF,SùÓ¿× Yç¡£$&ò¼”Â7¢kßy#W¨¡“°‰—‘öu25ÅaCwòÐNr½üê‡a_ Ø2(¾Jí„l¸7pGÇo³W¬•©Ù¿ºn($Q ߇®u,ƒòÏŒ@S·³aóÐ#ÛiðÚÜ'oö~„«õkœøZ܃+ò°Ÿ™>é4NLäSŸt!7“ƒ¢ÈíõtW¨Ë©l53»2 ãô½ÖyCŠ É‚ ͼ9kž'ERž6rУ<‹Se²ÂÎ_е yvØ8hi­_4ĶH3¯tÅåÄP®f^Ï€N&ãb‰^&ãIúó0V_¹Pç1¹ÊÄ¡Q9&9 Ý'Å–i3LýEn2(ÇHgîR’~§s= ›…¦\íßá Öõ¼í}6W"‘ºuÒºKÏ®ÁÙ¯{0UÜŽW!.­[x1}U¬Œ»q·õe(î>H(æê=÷ì FÎMÖM}Œ£¹öb÷8ñ*˜=» C~HF <(Q\Löž¥ H}ycÝÃÿ¦ ôA߯×0<ËÅí¤¹›wü`ƒÔãSbϯbFevÚl-äáÕÂÜ÷3r›Ô–-‹C¦Ër›5z5+áë Ïny -•~â ˜ˆ±Ïèg^nއ Ãë[2 Ô÷˜çg ŽyoOön]Ä nk[![q¨³“îÜçë ûîÅAGì2ÇVFSôLü•3'Ú«V!vå$®-X7•‡mYƒ#ë8ð›_&¥çw†7©¼P2+¦.…[2Ÿdw·¾¢Â ˆg©sGÁèš/ÖžŸ *Ïjè—7÷ ª¹ìì=ô®Z¦©E=ÿ»ð<»–÷zþpíc|ULñ[¤`×Ûóè¥ÁQûÚ˜.C/ƃmk}Éf\ÙìàÏ7að$¬H7þëQ‹;Ð+<\i-肽íkd´TÆó©E]ô­¬iî&wë³öSÞ´”ì:e|&vjÆv ¾°è& m¹/¸qKÖÄ“|ŒâGf±ÐGÐ+*ÁÒ[‰IxÓðKl¤ÚGª³ž›y·»Þ;æÇÀ;w™! éƒM}¦Óà#Y®6cŠ]ô£Ô5›ý¿KÏ’³ã)ÝùR‚Zo]‡rŸo@@(=£¿ú_ðiäx÷©!‡ž˜ã›½²uÍkpÚZZm³’ÆTÓ8yWp—yÿò’}‡ð¥‘ÐÓ×Qʬ¾Ä‘X÷nz2Eï"øz•ã‘’©fÕÈѸëgG£¨Ôˆ9B޶µŸnÜS“ ¸yºTqTŸ$/Á ·!]o'¯žrK¤Â¶ÄxÞ9& ¾óNú«Uêq®Ù¨ÃÍZW§«ŠM”¾'ç§Fët8…ZúZzhE¾}Ä—PuÜŒñ´=Ö{?Ó‚:aIvñópnlÎ/&9€,u&˜æËâ·ABªTaõoª°úÅtÔ=¡‚ü·Î«€uoç~gõ`GΧƒqö¢í‡ÃÌÝ=»•áÊ ¤`¾97nÂ!¨¨£—Eí£ Ín;S^¯M.Ï ;9@P aõõX?˜q…qØ3ž˜k áï6.£öaOU¦Ó"â“Ú… Ç/´ Ťh1 ¸–tZÑ>¶weqE¡Ôä%£ç8@@Y—öTF&ß;œì®ªÅIÓ–²”þùìç4H¼Ú)sYÅ>á7 —Ž_ =x@g¡ÔË’…Z Ÿ9rñÚG·k©tjÙ¸×YcµîíjFH`!Šr£”y…Çû,»m}¶3 õ-ÛT†ƒ­Œ8 j–m*ÇN=‘„Î$ZH(É>U¨p;K Å&ú(ûÖØúyñÍó€ _xšÞ$B/FÐ Ž—Dégj×ÒÇ.ô5vÛ™!XÒÉÚºÛ§u³º‡øWÐ+~maTÇcuðI†&޽2=ºa²ÎïÍË5ˇèB.úo'ÅÕÈžî~)ãöÈaÀk@Ñ瓸:ŒÂ­{8ÌÍë7žS oe÷]Ö-'¿M~œR&Å*ê«ýgÑÓBql ¡•ê!=…PNöÅÎ禢òeFìéà§)mg¦ ¦ ü‡œ_0úåC››Êø$.|Õ=ý¦z¡§wŒ0+~saT«¥;?€+þ… –!ö}o.¥n½Þê’Y‡T¥ÝitùÁì›î)®õR£ _j_]è…õšÐ~Ø Y$µï%¨ùÇöfY–#ŠÐ+³”Æó)ßNª7K¾‚8ä5J,UA ”}€Bv}ÝcЏ%­os<ÒlÉÿ¥Ó°T¡ˆå„ŒXýB£œQipfnRÊqÒ9åÁÀ¯Â,?„Â)¯{,’§ªÝpVe˜ò¸W¤1å0,@Çü\j'VK;äkTN/HÖÎD£ çü¼<°äý°y”A1¤ý p/“¦£ ®¯®ª“&‰eXèÙä5žø›lë韥^ÔÅ?YkÊÅ”œÑßšÜõ5~j šå^3 Ö\(ÁåIPŸ¯%4æ¹oñ{³•®èÔ:™ó¸@Në6y]¬¦ŸD0Þ½NúQ%ÂËúIÿ$~ijmçÀ‰ÈJ\·y [´éâ9˧äÕ,‰ÁÁ‚Ä}è8¶„• .ø)çƒ.Úc}¾#Pð,1ÃBGa˜éùA“-õÙá”PÈb¢ÆI~œâ€×Õ«´2Ùþ§ä­Áó›DJ¶1S4 Vëi _/”~øÆé+!ËÂk.\¦•¹õÚe ø‘W3â$Ziq!Sòç¡~%´L¶\Ü? ÿàãZ½BÊᓃÕHÁgÜ_âð†th]]1 ~dsjþñL¤/qÔ¤ÕôˆaÑ`²%ý‰‡/Ð>‘"ÌûFéÖÉXÀ=§µ"¼ã¬ÍÔßËDâÝ_fpüÂÿ(øðØ+ƒ ×¯â•g8Ò”«ôOTÈ<æ?ZÝRîY&•9mšP¸yŠºÂöƒoh  xýâz_5AÜusœAF–¡™)‰ŸˆˆTr{/@œT±GÀMæ:÷ÅDñURb±°ÊðT@,ZÇèt 踋”#dÓìo‰â E~Ö(„†ØòEÀ…vÊ¢oâC¾Û0Hž.6†NçÆdþïj mŽø¶Þ~¯å8Ï^úö¨Hx 9÷!-Ýd ÷ç·¡qeÞéJz$@—¸Y ‹”¤8|Ë-@ü]üø5Û\ìäs±£Øyö ½ íêzã¬Àÿ¼8}?ºˆ`,>ÚD¢@$3Š[+ôkĤmʈÂI}M1ÐÁ Å© Ôég*1«ƒœ1©x‚”â•§½¡…VÞJ_¹g_T ÀìCÙ¿¦šdy¾ª‡ªÉÁ­,þP–Ü S7¢ï>ìà µÛiþqã˜Ô’ösÊ‘íº€«6Tû{Õæ;¡ ñrXÑ€£/æº …+VGÔ> %ÕO‚9ÎrHcÞлOÉúñ º12QÊoq®ÝÔ#“y[Aì#·è+,M5‘Zœé®IÓaÖ¡ ƒ dÈs[G€ÙÒeP©\ ·:ó zœ,5º–ä—ÝI†'”´èØ_ ãJþ˜‘ꚤ&ù~Øx– ýµ†ww#úüº•Öæò¶ãáYdÔKÈ3Žâœyô<Õä óW§¿‰çû¾Ø:„ ÆqˆLgú'þoWûŸ[šs‘±ÒâºÖCA ¦CÀPóÒ¦bòàCÿ—hæd±töÜUnR¶ôO~îõ5¡­¤µ;^1ö> Ò§¿|øÖŽ{¶z±êíZ WÁ„c¯vÄšó±½þ›»í…k:pêä zb•`¹ëpjÔ öÊ¥ í_‚ r|+ä{/Þ!Ïž^ƒÌhßЖeº ÈÚô°ö( A‚é3}ÙÁŠ›c6­/B¾?_’ëÊ9¢žŸ Œ«aÛ:€(y’"2%wtKF5|Çç¹0| xÑgùòBO®@fzUª’gš_6&ÌÔcÝÑ ­Hj¤ÃE­ª§ænrÌYŸG²|W¡,8¤­/·´xÿ¨ Å [˜È[ùyc ^sÒºfϬ¬VÏÍ®Cž—]}内… å?c‹ëE»{æý‡V`üùo E7Œ7AÉï­B.WpÅlX?ßlðù5\È lj ’xFnêî™[¯žËºs’¾ pü™«JNìÇŽùCS6–?VΉrس±*Áõx–šU†ÛL@Gc¡#œ§á“º;À·;è_— Ö³ñ¯W~á‘8ò ¥™Aˆðûöe'ÂT(g;L½,¤£"uò‚ñУòÍs&çYiAÉøqñídÒóÙZãÞÊK@*ÛÔßZÄŒBþ‡Ú‡œf€a@–ÿ£·UXò´W@W¡M›ÄóÔª%e†=eiÅ—ÕXò®ÚžˆT|²Ódá·S­˜êôð‹Þq= þ@¢ ÎÏâ6£t—!ßð2¢†‚¥ÊM«n‘ôK[â·“D¶ò?!ÝÇšoGã_4Íò'TÊH <ÝÎÏ¢°xmÛ§m‰`ø6˜& º;à%éÈÝOû{M$p)k$ýaÿÓ‚Á[’+ŽÃÿuÓ »÷ÿýDçÿí¿ÿ¹'ØÍÿOôþïþûŸ{‚ÝüÿDïÿî¿ÿµ'ØÍÿOôþ¯Ø>ÿ{]ü þ4ü îÛÞìæþóð¿ÿþ÷ž`7ÿB?ÿûçï vó/üóð¿?ÿÛìæñóð¿?ÿÛìæ_äçáþ·'ØÍ¿èÏÃÿþüoO°›±¿”Q!Ðïïð/*¶_ÿ÷äÿû©ŠÖ|·¾›Løw,¿Ç6Áÿàüa8ü7ûï"€;\ pÛÿ/ðÿŽý—ï<˜¿Ù·ñ²oãeïl¼ì´‡» àŽ5 ûís¤·PÞ>‹ÚÊÄaûìe{‡íÓž4ž;‡ÿcãÚpãß5º?$ڹ߂÷ÇqÍÛÇ/ZYOæ&vÛ…ó×ÖyÛØÁsÌ™™%ì~wVü¶,¬ß´ÿ_JÀf(ø;!¸Nÿz–ûÿ:¡ß¥ò[¿ÁþŸ”h9\÷@ä_OÿÛÍÚ?{{Ýã?äO3ÿƒï¯ÿì vóúyøß_ÿÙìâý­ÿîó¿'ØÍÿO´þ»¿þ·'ØÍÿO´þ»¿þ·'ØÍÿO´þ»¿þ·'ØÍÿO´þ»¯ÿßìæÿ'ZÿÝ_ÿÛìæÿçYÿ… îó¿ØÍÿ_»þ»¯ÿÙ{ìæÿ'ÒÿíÏÿ÷»ùÿ‰ôûóÿ=Á.þ~"ýß>ÿ{‚Ýüÿ¥ú¿ïö?vöÿ‰Šíó¿'ø#ÿÖ&w ì-nm[zÙ1'n``laodgâ`b€4L0Û{þiëoÿ´ý7„°˜˜\tÛþ›°ˆˆØþþ¯½€01F › ŠÂ E€(„6AŠÁE„ÅþjùöñßÅ¿QÿÿIëoÿsýû¨ÿ¢"ûöŸöfÿ -`,‚úÇ%ÁƒùnN!Ì+ÆŒ®Âˆ_ã‹#_’¶w þ–Êï⊠yEÌ!/RdóÐ_‚½þÿ³Ößþçýß@ ð÷õ¿ÿßü‰ý7’—Åoôß §I|ÞíÎ~^Áá| «shd·+Í|Úæ`¥…‹D]}x)¤¤d¹Y*FÑòu•¸ J­÷JOÍü=uÛª5:" O·· !FlL/G_–‹R<ÆCzV•rãYÚZèò‡r"½9‘Â’ÔBkòÙEÉf+Lt§¶^ùì}Îrw²bÓ5•¬>C ¡*—Æc]“~é5=¸y•´#ˆg!¼U¥éñÑ0Ïef¨<~놇{‘à|"QøA(Û%;+yÁÇö÷”³6}KìµúÎŽ#+ánWc3q$Êôa‰y5Ÿ†fÊíÉa®v_ü¸é/îÍFÌݯBî3Á Îõ¤Tó|ì?{©«:™èt†Ï½´^®–Ë+µßȆ,øiŠÑyïµ(C>¶8˜ðé™yùPÛeR¦Û^Ń2çIï‹z~,jS¹ú2À4Kr&;GÆÍiaKaÉ®4É|4î´¨~KÇ[·¤ƒCÿVEvÙ‡<€§ý¢|»WÄ…Òáf4?å|Ôû/×Ôku}"äœBôSm¥íšùhbÅ”i]aö!½ûO©3)Á+%(õd}^ͳñ3X–ÐÔ6ù{KúÔÅëD#µ&¼$_&Cå¡Ó…ý6, e®×|Öj?É>Œ)äP@”ØKùÔÕ¬<]r¦FÛ¼S›¶ðYšµZJœXä=ÔÍ3>vnw†©˜nr$ªã³jy®ŸÕ%±µc=±:}&õ,P‘^3¢Ü°±1ÍWíÄ苊+FÔXµjsFaÛ»š}ltueÌÃ¶Ž¥¿ã|²L¤ŽL”±OIÖ½ÒFž RYZ^± £œ:gtĦUæx×õÙä;†©ˆõtÖ äÎP…ÃÕ¬teå­¥«àêgÚ3°rò½†d½bcO ‹qÁ˜À•ç¨m&ÈÊ·’.PÐÜ.. ÊV~“:,Û—Š¦Í(–?œ¡ù†ûÁMé†âý¢&¾±Vë?E¦(­Zå»÷øóàGõI4zý%{ýÏXÐÀä}› 7ûT4|Z8ÒôKçW®œgò=ÂÈìŠ$–î =çG‰žÃ›å5Òæ¢¢‘l9£ˆ× ¿ÈöË© ÙK#µE3i[TÌ~ÃRnJó¨ñ9ýwŽù=:>yï㥦ÕçF¼»7sØï·úØ¥Ú.M+ßljgž ézúáÃu:‡õÝ …ç”äçzÕ fŽœÌ*12RNf Ülí¼,ÆoÉGJqóhÅ jšLd9c àEŸÔ•ã´+Õ¥Ngï“pFÙѱ°Pµ Ò\wSªÁû«?ÎÌQ¥ ñðkîïîÖ"](˜®åÃß°r|%àá~Epø0œ5;+#à4G‚é¡»­QKˆvÿbåDµ¤<ÃãÐn2Cúé+q~Å ÏSŒ‚m‘}2½=þJò=þm¡]þ˜7LýôF2[q4í\¬1G—˜è޼Œ ¼8ŒÏ¿Û®A­fUîlêóö(ÚÁÚñº„¤J/ͳaü5¶òU5a< »ÜúB†©Åïå 3Rè‹'—aj;íd™±ÏÖKë"7„ž^2Þnùÿ¥ãâöñÿþ8þû;û¿Û¯×Èý:Üeýû?­ÿùMÿŒÿ¶÷íÿþû0AÁ EDP"‚‚(´‘ ‘¨ZPDpD#áÆFƵ|ûøïâߨÿÿ9ýÏõÿ@ýÚ¯ÿ{?Óÿ%AÔðÏKÂ5c»ïº8’WHXˆŽB𠋉þÓTÀXDèÏcª9XXýˆŠâEa^8±¯õù‹ñ¯×ÿÿ”þÔuÄ뿘ð~ýß ü½þ‡¨ˆèàÖŽþg’d~ øâû¡ÿ9þüóçÏÃhhhHHHHKK |W Á`0,K´£ Úô±1$Ú­ bRû¡ Šn¼óIáÉ›µÓ_ùLE&šØØòdùÏ\ƒZŠœG³¿ömòÖDgïßa…©];þÜÄ(”s*×)€cIgã<žà …Ÿ½žS¿B.~þ5|Þ{8 ñ}'j%|Þ! M EdÚt²¤OöØG£5¯cMæxÏj.¾W–€ïë¿9?xp¸®¢Lø‚ÓØþwV(F|×TiÏDzxOÙŽµZ>n‹ÛêÈ~wo×ò©@ŒÃ.­…]¯ê‘<½äÙGEå7ÁÄgæpž¦š<í¿pãYvÚþ¤³M‰5îóTOFëuH¶õÑ•06èwßxyèi*WP»*JñED&;÷wªXp[.ƒË9ΔýÁ®IÇ럈Áj§î±Â'Fqx_ÒÉ ³´2mà†p©ØÛš×Yl¨y“ðïêDð®’¥æ™]*ã¡ì0ãìâråÎ#§˜$¢¯Èù ™ÙqP­Dm*ŒÓ/:Ç«X’x3™¨$-fñ•B;W¡"Å UB÷xEt¬Ä‹Ú-r–æâ­÷±ú—9œ>…+ýVÅjvm!/ˆu"üýü6-ú©8 ¼_ç1)ç ÒÛoÍX¡ËVjE>z.÷A9áÝÊâ3Ý\Î!{*¯tÕõØóò&79hGŒp&½]½Gm|ÕŠê6ùQN©ÀÜ35­’Åjô¸ÀŽˆ:İ´:ÓüžÉy£p»x%ÿ]6j”SBÒ2TíãéÞÃÚ™AScV¬i»]Ÿ×^ŠJÊÛäùÑ:N¯H  g—ïj„ѼØiÕºkO§M¶ µ×uôó\½|8J/ߦª÷¶DA§Â惟fœÅÕÚ«ôkUý]<†·Êð4â,¤¬„_èsª sÆàN­TbqÝÖëÉ>$Qš«KŸÉ"tóOUFLºE0I¬…ú|_ùIl&èQo–ø¶¦X›r‹Œqä\‚Rr¨õó–KÙX çÎR kQóHíX‹»ÒC–Yº(ƒbÃ;>´F¨1”}K»Æ 0ç} ]ÎÛ:nØrÅa*Å>µÍñ}ÉÙ镪œÜD%b!É¡â°äÐŽK{³'*0—ñPºë{&,r‡9£W#…Þ=y Ë~¼"¹a¥5±4rîìͧí¼uwÞ¤a»¦=ÔÅýšj nÓ(~^ .Ö¥YeI?¸Yþ®‘®-#C«6_µÉ ɀޓ„H±ÒË„•s¢áÉ÷™ Yë'à(“€¢:ñž‚f¥tÃ`ô£kç¡m]Äòw 3mÓáÑ…s›z5غ÷Õ*¾çŸ²Ew܌ߟkGY]>²Ä=kF d>›2ô6m$¥ {ðYŒì’"ÂwBŒa·\2ÊÒm*éˆT¦½0¸m»l²—ó@ñwE~óqª˜½ 5é4á—OœhWç$¿|Üft/årðZœ " íØ%H™l•kq¤ªô ´=—׎B¼ÆI$ÎML 4¨3 ïæçJYiTùÊ ›'\㺈IªÄy%÷ñ>îâ1x?Î^.vý%Cø02Tz.Áü2³àÁsÃHÊž4%¶˜fÅõûq[—÷çú¡ G£ÕxJ h–vù Þ"å„GÈ>H‰i•/èiž&¨½·l6)Æ6 xövã–¤ú‰Væë"ß&;›~GJU†ìt¢s¯R}_Tr‘²&¾›ÄªÊØŸÔȉEDÄ%µf³˜dÌøÄ$y-º®R\6¿¿-N’ÍÊD.{ôB¾@­Aà€Ã„¨·{¡É1Ÿ’ÖºÉô}!ÖÏî‘R¥¼ê\NÃ1#9uêT„ YÝÃá­Ù.®ÃÄÇÛjëêš÷†æÝ;™¤C0N•QßZw¦yïâ½ÖÄÇK­¹xÔÏI5zî‘ ÔJÒ¡:(¥ã4ÏG9†ÀC½˜æ?»Èß2ÌÙ |ÆmÍæiš"ÿbFPhM&ZváÉuÒ£wŽhUw¿QðMß\Ì?A^ò‚ªŸh±#²7§XÚ©³æLlºC—It2Ê8Ÿ»œtR¦@’dÖ‡Mà@5ÀÝ…úí„ }ŸÜ(}QÖ’¦Ä¦mqSjC WÓFMõŸ©ø`YxUÐlävÝrB¨Ú#ÂÑ!*‹Ðã½ÓNÊKªkOúqâ¨hí‡>ms»„@Í<”ï\oël³nº½%ÐÂlþ˜"ù«%ÎŽê« ’ÜïS:žZs\,–ï»p"ØX’žæ¥=^j£BzõrU²_´>츧ˆ¡úJ“SþÊQE¡ÑxzG‘Î¥^,ù7¼ÆÝžœ{;3‹½lÓŒ©p“&Ø'ç­Ï³¯L–––¼è ååÓ JVÈqïÉ=¤®sRÒM|¬+„È‹âTznG³RhÃI!Ÿ’²ª‡ Õ–óÄ?®ÑØ.¢7É]n]®sh&Õ~àú#ÍØOùhOôçqôÖœ¸Ï ü=¢6¸ÑûJ»waøì¡™ÓñYºú1”=]<3å4É¡,JÅ.iÃÉ%‹*±§[|ê5 Š”´Ý¢G•[X/°(z@¹#[ÚÜ.ôZiß3lkÒ(–Rq)Z*b+ß`†–¢ñXfé g%+œ[Ô˜’žgr‡ 5–Bm¨¥´nÉKŸ±º¬sS¶¥Ž [ä¶îª em9óÊW594†2½ŠlÅUÇS豋SQ'AµóHrÂmõ{žw„û °1µ°^è}ÎÅxdÍþÚãh[mŸ\QB!¢L[â•7x„"“ÝÛÉgüC‹8/¤É ÜÇ—˜5.‰Íì+ÊÖ51£]Dü–vNˆˆéHæêKF @¶±( ă[Ð~ÆÀ]Ž¢¢-2ýJÉ‹rÑS×™¸ª©½àë (Mãtº 5í©OÒ<$d¹¢¥•{ŸEþÕ²Œ—ˆ¼‘g]-±óžžë÷”¯.2<¤éÒ™öL X7Ñ86|˜ÿ°fÖï=Q)vZ¼|M ´F¶¥çèiךñL ~¶¯-‘ôtY˜<î9–™jʇ›¸Œæb#/Û¥ÕÑy2í‹‘Ê!uCû«ÉCÇÊø>e83Fe-$sš1Ï–{Ž6}¶‚¯HF.ä‚Íé~ìµ–=(zÿQÜÂêä[ôýþG.nìËÈξD•¿6`‘î ÀL9+{àp¯¿µ+Aãú>“ñqî‹PXH\7œž¸¢1ã©O¬vwÈò؆:8ðŒ-;ÐLÏnZg@ hJ¸t4Þ¨cz'miBºN¬Ò|ZntsXsk®J¦ÀNÍL´¸E®vNÆ; išÞW|¨là÷Ï–’ ¡Oå’¿ö÷ªu¢ö Ì«"…€àá÷üÛ—ý8yð`°<Í„4 ~¦„<”ŒNÔ:Jk{Ü¡G‡¯? {Ï¿ô¡Õå³uGsq3˜‰=(3'ÛI#WhüõÐòñ$aÞå\3Ü RŒîO2 qœº>\å¾pwqâî’AË>#¾«)A ¦¨G-ŽÏzŒßŽÐ ?È!m<Ÿ9ÅĘLì|ùZyƒ\¡öC“Ä–Ö‰ÔpKçÎ÷—[Äy´¯R¸¿p9oí´VgXÚqßQ0æ¹ãó¹ìk.ô–ΜÕ·BYMÁoìØp‹Ú _›1ïJ€£Lè=I”´ÉëÃÜú´—Ø’òj ~~NYiˆ^Œ”U?)ÿ“£a™7D6ôWõnѧÒ^01<ž¿vV’s$ÔÌkjÅMدËd¤ÌUV.»^ó\4§¨íÜI½Ù­+ë÷LÙ2ΣøˆÜm¤e¯º»¸´{°¦Wû€Êmn<‚å>Í]¥.ÞÒï!äc à$°éô³8VÌèw¡::ÓN–÷T7úÀ¨¬È+ûô5بCƒ±Qôe³Duþ@_Æ ê“ÏîÐäËS.Q LekÞ]‹$žûÙv?›É“=T/hÕ5×Cõ¶á`FëèÓÕ9n.¢r¿3÷mÔ¶%"ß9beÏs@H¸Ho¡QlTT“‚wB†Uóy™'ïéûß[a’¿ÒÄ›”(‹¸É™ ¡›«ï {#Pb =Š:šl‚¸Ây®C`åUê!gŒ‘¬´`#:N£¹?ôqnä+»ž>¦ø6´Ž3åÓË…hBÊÙܽ¤‘º û€?mºSéy[w $áY ‰aË'ɧ´ÃÐ~·Q2òù+.ÇËQ'Źnë\(üPA¯—¯´z%@ºý:xöÿr¨ÖdB‡hè|$µ»áŒØ±.îì.áG—9ò²¦£ÔžçÎwe›ß|.˜æ(¸0Ù•ô ÏîÕáë=ÈLÖ*=õ&}…̸ê¸÷„3÷™ŽUw±G­I)¾=K›(©Ï¢f†Ç{#ì¾újôÞì¢üf¶n¸/SÿÓ÷‚.ÇâÏhõéÀ××G‰œˆ±.¬ ¤<Ù«'Òrol|$J™`aä¬:žI⼋È/ÕèF»ÚQ%éeg”NqßÊCçc~¨òo1D´ë¸4s:<÷Iˆˆ|›°~à N5*cÆpÕ|ÎÕÜŒÅû¼UL©äš6U´–—ûÄ]n¨™¥]ÌôÜ,?Ê®š/ð°¥þ`Aäs3hõ½¦jŸÄƃ¶˜¾5È[”½›¯§.PJ]l³ªÖÎ]Ž£[õó@äŒÉ“‰Li“ßt-†¼Ä"å®Ñ AÅá$ƒ—÷7Þî‡?Ð@ó„9£{ìR^ñÁñš+YúíµC(Ç9-¤˜èáfãtÁWlfŽõ®• 3ÇÌÔäÕÇ;]Eõ›]æÆV}ý ÅÆß÷E¹Â"xÂ\E£æyÜÄZ÷mº ÜS‡‰…ˆï‰}™×”[h¦Kr\5S£_ŠK¸“Î&ù¡ËÜ’èÄ\Þå¿€QÎǵÅàl¼É—ׇ9Òï EÌ5^³$˜ç %´,?÷¨àøBËûI™p‚æàû©+ÙT¾à#"Dï tÒ¯Üw’é€"Ç©sWëFjµãr=qyéO•îä|ÎÁ#v4ˆSܤý å"UŠ÷±f——œÔbǨÝΆr¤³Rnž"ú{'ü•8Î;Xž…Áï6Õ†ë sÕð¡aaES0%ó{úT¿!fJ†õ>^í,Æë§¦{¸õ C÷JäÍí–ó î ¿Çy .±S‡gP']ÿ¼©?ž6]˜À!€IgË0ýóÏöîí6Y-‡ÙÀ6xQòœ<Š´³G4%ÔÖ/Å_‹PmãèM’v¿-µëÌ[öø.ì&(ÙµÐX=ön›ÈÊÑ¢€›•VµCÆÞ'#Ù15¥ß¹vw‡‡€Ñ&3~·AˆZ'¿{®_;ù:õ¾k¤˜¤$2ÌR7ïT.µÊ±~w£6ÃnLb%Õt£ƒÑ ¡=ß%à–VI²%Ï=ö›Û#Iå9ES, É}ç.G¿¹õj¶Ë­œ„Àz¦&õŽ÷¹ fé!1š‚bïKF(ßňþQ:Æ¡òû¾GÍ\õ"üa,k9„gìFÌót¬ªWÜl¡UŒr”S-x¼ûÄ]ÐE gãSê6Xc\%8O{Wo‘P?©ÿ¬â¹_Ò«õ¨X"„F~ëû= OXS¢žw9k'„÷*—ÆÍæx/˜´³ãV>[¸ƒ7LŸÀ;—±j«û²5Ô$edª«6M©^Õ<„¥sưvþˆž¾Ud×áS§gߥSZÚ7ß6<ÒÌP!MŸÝÊ­xÅÿfòþËi:‘ 4,4è"­Ìöf‹çn2¶ Aj¬ƒi·§ïãä °é׌L GÀò[oˆë}¨tÎ`àlP‹nÎ×1?I|<Úh:wÂKûèmx@sJ³Ó~Wñ’M‘]$è4Cç”fðK¼*í•}ò‡ðôNæ—«$*µ¦êÏÞ—ùZΧÁžë ¶!ÌhÀ÷’’Ö%Eá³ûGÝ΄æ“sCÕü38oú„Þ >µÂUÈuAí7¤$€‰ã–A|®Ž•M´’’!™­4ʳ¼ïè‚·] Ç[Üëâ^Öú”g±àÝȈœè"Ãמ+Æ—tT"!<¦LÕÊ- « š»|ôÅôÍÃ@ŽLÂñ.úcnEJƒ­ Å”€Ò&?*Ÿ;/ó.òÉßLÄ%íÈ¥6”½.ìAÑŽG,B~—´[(óàÜÀúl"  cqtaía²ýV{'\ö‹q 0dKòóô,%ÐS–ËpÅø/úÖÅã-uqš¨Î0öÈhÂÏPä Øˆ ]• ÉSO…jVI‘`1.^4Ôl»´BíljTÔ<ô vøšdhÒ|ãN(]Wé«òN×5'Sªîc=ñ¥N#PIÊ‹¦Sô,ཙ˜ÒÛùîÃMýC´Žh®ÊˆW·&Ac¾Ÿ}ÿ2‹Æ¾ã·L}B¤´S;HFtä̡ޠp9¶óµÌë—k‡î|ùÜ>áå.´Ž·ÀŸÓÞ4Ãì!ŠÓV*/Ø›`Ž˜Žè-Ìç&ˆ»…–Ò|*ÜEª‡°FíYJ-õÉoPÁÙP+BkiâMqfx¿·åÔ˜X‹”œ½VH™ËµÑYqqùJ“Ö-ô-íÑ’|Î×3bG ?–™Ì¥éÖ‰ÐFp¡ƒü»ü{õ7ÐÑ|ìQ°\.ªŸ€8ÿ+Ät´Zi>À]¨óÚ"‘p}«õ>îPo@š?Õ†S,Ãǃ—ȰR&+#M?{ä¹R&£Cò…•­÷Yá‡×šDŽfŸÃçÒæf4ò?Ö¸…3ÍÝôñ:{:aÎ9 ~¨À>ăêŒBø-nÁ;U’™˜¿p +߈%„¶Õš²XQ`êl”¿Æ„D¾ÞÔY—vGÁÔ(æMîþµÂ²á+€ÓG@a&­@œý@Û4M‚÷% æÄe<ºïŽFa¯Nüy*\ÃHdW™?^žéT°Æ§r ãÜòlz¬™„Ý:IdýúóÚÛgZÏN,GSajïŒÎ¬KK¹¸¡\ÅYùû.¿¬é­%_×Ñ|tŠB²µº®ãe“F¡/æfû™±ËJD&ؘ0Ø™¼_-dhVIæuIóå¨!ãj©ﮦµËä¥äîªo­&\SãÔF‡ºrjcJ5nÁ‰råh5&ßÜ̸hmèLØžazûpóf9ãpæ±û½4%=Žª¡ZìÆÓQ‘KúZñûN…¾'\®èd¹Øæ[^’ÚX|¢Ìv’ݘª»_ÁÄ7F«÷Ê)W–Ži Q{®SŒl@›äLsq‰æ£íZš)Ø©¢¦É¦·Î,”û‘{0êü†Ì~šŒ³„P¤Séc¹ù§ìbî讀åÞÎ1¼vú¡/®jކɀ ý„ V»äd¨©ê%Ë…ýväP-<š‹hQ4˜ËÊP/n½›\âàä6ˆÇ¼Ëý'+:w¾ÿÿ…ðßvñ¿~ í”ÿ/„ÿ¶‹ÿõSh§ü!ü·]ü¯ŸB;åÿëà¿íâýÚ)ÿ_ÿmÿë§ÐNùÿBøo»ø_?…vÊÿŠÿ&,$(,(Þõÿ?‘¾–ÿר înÖvÿøçýÙþOû¿>ÉÐ,²»ÿë§© DLT)`6±6³043 ˆ˜üÜ¥ÿýûÿË¿>ÑŸØ?XPPx§ÿ‡@ ˜ïîÚÿŸ¾µÿK˜ßÜBøkMµúÚóˆ!`°ø·"‚ÛùºÈïH?BL!(TàËBfۻžÖ8s—ß™ÅÄx "" AAAA߆À€¶šÿ¡ ‰ƒƒ»ƒ™5fÓÒ¬EÅxÀQó ýÛEB˜}jPTDˆ†üVÉo. ô‡âæÖöÖ_–º "°îBè‹Û¶ø£¡Y¸UV€Gt™° Tà‹;‡ˆü¡¬µƒÒ¸mï/ï[ (tTÌ#ô¹ë€†‹™|»Ï¿à 傈¼!õT›qõÜ(-ÂÿÝ@þ ˜‹âúÄä@ëtk‡;Åå£ph |¦•DX—DS÷bÆi»¢þô"–.¹&—sÍ—)¡¢ñ‚ð¬Z±tÈm 軋Çòʨº ûÓlZ5²s< SÓlä"=š€_æéã³áfwe»6Õ$j›±Ñê÷²øàò~ðiZtgd`S²bД—'Üiðe_a¦œüæú»Y&sÁ˜_¼Þ$Ü`3™ÇŽ;˜U6hnŸ;Þ· êYÜ“{Uy_^1ôäùÈm“ô æ¤Æ«õu°ÐIxnb€&¬/‚¾N: Ï8¨Sp@3v}Ò1Ðꆣ ‘éYµwú¥µµhΆ¡Çá5Ð;'c"ÚöÜj.ž×ˆ­çCKÞ Hç*w£ÞÊêú<žËx‘ˆêˆƒÓµ;óY:¨æ„4æëúܱĕÕôé3&xpÉ€I {í‰ázÄ|U:<. ™¶t­ËHŸÒ@¸Ûe>ûe&!ÏZg‰a6×ã÷v¬ð¬ÊGi{ÞÀ£ÑïE -Þàé(fÈìõ»›ÔÖÑ—_l\:ó|–_Ú^»¶¶¥®ty8ÙÑ·"šî(z„ž¡+ÂU]u•€ ¬í•å°[ ^‡NYž©¸sCùäæM’œ¶¦ëêÏn¸– ÇHÜY;ïàð"j¥(O7Y/0Ö{^ŸëiY›Kêxû„4ƒ\IZÔ´Ÿõªó|r ºE‹ÛöæÂ¤Âú|æ@âz9P]µ¢0þüÆ­œ£­{i¾u!'á°Bõ4½6ŃÛOª×¹õ·ŠVæ{ ü³"ìšMsåp=¨6F'IÐã—žnDgžê°žH¹àñÅSÉõd_ˆ—{}E$_Ëc2{HÈdH¯Îÿ!§7Ps}Ån9ý¼®eÊâ|6êXóB¯öM u­üÞÔÁ§eż5õZ3#ÅQô\õV¦ç­uÛì[‡.Æ‹¨ëmÜTfc2Ù¨g¿È4Z™aJ*þ°»oñ̪<èwÞl_—Û]Fë笇<¾y®F£¯ó|moו%»Ã4¨Vð|®êsV§´G{¢T Œ"Qè•Ñ÷TˆÊÈp´Pø]~¡‘³– \Ãç2Ô^Ìi$0¬ž‰DG±í— 3š«ïÐÌGáKy“]ßzÛ JùR^iÔXè|&¶È8joù‡8zÊþ𧩄ØT±—Ãà[5ÉZÀ* ¯©ºÒR i¨ÚÎjÑ– h?¾¹z!²“›Ã NδǾ-àw8ƒ6é¤IsëÇ.0vI8Žm'X“Ìê1RŒSž\”KKOö’~NôŽÕMQürNåI0WÓ")q×Ë™À*%ʍ‡ûhg±úåÈÄiÞ®†…Ú©#b4ÉÖ™å'ÚG…-œË^ðÖaÝ!`/ªõ19òeš‹Þ–Ê<ÑÞœE; “ù¾¶û¨S4 £W“P®²g“Ó¦÷ÌðºLÒ†IBcДë9qšÇßsj„ûã#ÙßÄ3ö·d0Lá2†ù8ÕTöŒE½Sw;VP–~}†½þº =qÌ3kü¡U“ê{RehÊæSŽž±éõù® Ý9-†¤ðìJK[+ªëj]ÜwÓªn{”¡CÆÎƒv‚>þ‡žtÅIÉf§²jëWPS7½Ç²1Q¡xgÄœ*3£/\Ý༰r˜óýɇŽûá÷ÅžG˜æ’'¨<¹“Ó{ Hyž¦Ø_¨ŠD³ÔTD«­±¦Á:Z.Tú¨hž–*RÔ.lqÖWX0(!¨úÔ³)I¥oWÞ-ƒ¹|Ö#Ò“‹EK?¼¥ªÁÑríi©‰ÈY‹_>¼Qp$TГqÚî=ë‰VqÏ–…O’øÊäJe†Z3Òëûuí%—CŒ—± Ç²èñTä ™{aóªLD g‘ó¢‰m?ÈwEvO·ÑußB¦ÿA®küÅyVçU¾4›£\J]Ï#³+Ó˜íƒ,¦B.Ê—”68¼È$[ÊY6\dí½ÔKÇÊÂeÛcüPé©fíþjÓÀ½!lDw•ºVÇ8nµb‡xwÐÂq³ÂOËâµi´]•Ås÷~B‚]„ä9¿4|ƒ±y¼UÓÚó ¶õ8Ÿ&6Ÿé2¿ Ãóræ‚«\9R´§?}- …O•ê]‚ðDuêÓQcK·Ä—Ö¨…ÂÝ^¢Œõ_¥§iiC»JÇh!\/õ+l*õù5$³íÑ?CÌõî %úåSM9~=o„½E$+…"‡Ù83!Ë~ŽÂçæ7T šnØTë1.p]Ÿ| ,ØÐ×÷amôÄáÞÊåTåá¢<#¾§ñ®²xRŸNs»Öž²¸aÛ¿%ùÁ£^P—_ÑO¤ou~õõ;%hq·Õí|x¼½I—ƒÚíDê]œMæÒËo¢<ƒùd¥]Yy¹FžPf zœó–-6 œ×>B£ÈCðŽ/1¿yp8ëâ• Â] ÂËîg>œ8Ïõ-ÂWÅ5$\âff¿Á·¸r$®”K)a4éW{T“lQî\»$.<òä˜3×LPÛ>£üŒÉı '‚'é6#ðÕ06.¬BŽ|¿3¡§ÆQáci>ÜÒXWëMxD’ù•4›¤+gFӾɎ'Aks å‘Lp+V;ønh¤(´|¼ý0EûããIÔ(.:NÕì¡ãRÓùqd¹ï&¹ 3öpy ’¤53 ÉŸÞÏÅ­Ï(7̈ã Iºj¼¤–ZA‡šÊtA I—ç+×;Þdµ(×>{D.AR²p½E^ez}Ña95%äy6l=Ãæ²x*!SƒÒ[·{ìs.¥à² ü9éÞ»ää,-ê§Ó¡…ÓŠ^Žj+ñŒîCôñQhÙ3*h”¸Þìtbh˹Œƒ‡»$ý¤‚𠆣;>ÊH…{ÄÄl¥'r²7Cø=|bY=rÍØÚ Ž³÷a‚FÂm|®‡Ñ¨ó,pÐh(ì{Ø•qÆ·”Qm<+$òµð¥öXuhúY%<—·Gí4—Ÿ1pµ.¿Î%2Œ![íÕðcèÅŠ©Õ+âI©…z¡4ä.™.kí±+6D¡ÂWü^ŸT‘씡A½l '¦¢ª³G¼f­М¯98BBp–+zJy-[ø3WjÙ Ãd.8wâñrš%³înÆ^*9°/.œÕ7]þežímjf®;6y­-'M2¯‘cgåøÎj¸ÕT±«‘µ´Ý‘{×ÖœàC=?ƒ«X’¢1Эوgë… /9Ùõá³þÓëí‚pÖד®g.‚Fk#“ 7`H½-;Pƒå8OJ#äJó!®³«–ê7'±ï\7D¼€CëPjŸš¡A¿fðFžì¢¤)>ü@|ò@Î5”êÕú3\·ìнNTêTöqIG¼lIwê+(d˜Ô©2éÚ¨KÛCM.x³RÕŒØì‚צ¯vh3óyx.úF³4¸c $¾ÞuEå¡)‰CÂg’†rÃzC¦Ø(¦YÜñaˆÿÌø\ߢ<«¹8‘¡¿W¦šK]H(ÚMJ ýöº»é ñÑ»çÆå³žŠí{k„¸éštQƒªÆ¤±Ñ¥îoz¤ÐàA@f…gg·‚g øû³ïË®ê ›ÅÁ'ks-øª"3›—k°Î ¹Þ>8V™©ÉpÏ!w/o%{.Âu«øÄ“³A`®ËM0\lõáDÝ[}±¦žöò÷<׆.E>Nþí›UòŠV·7kc¨™Öô9,|òU> ŠÌªb}9BÅ ’šÔ}8´u ;‰ã©±ù6fŽjÎ]mY"ƒzðÎ’“øÐøû“·7÷SEH,Þoº_°¼!<-1ñ6$"rNODõ²\Ãà#««\ñÅfg÷‘!8‰oî D6·pϪz¼›vy~%šp; «Æ‚•kS2”JÛÀo–^¯Ê"ô­ñà™ž]Gàš‚o¨œÄÿ&Õ;Ö²‘²¥ÒÀKw³¡VðæÂÐuÙ²i‘ÊÎ!Õ¢š*pgY™#"p'”$¼â˜jïš &ñ}|YªU¼°H#%}»xF³5¹ç$YC¾ùø5߸ ˆ¡už4…¶IMUÇÚ˜ëù.³¼ÌŸ>’\s8Üì{r:¡¼=)’[þUcOU‘aÚ%x¾šé1åj¿5?GªÊ¬¯7ÆΞ„Ü{ЦðwÓ~rË7H›d ùãó¹{h•©jöŽ]·zàü”Àæ!û:Š^IdzµE1zÌuOJ—/ñijkRæoŸm–É–DT„”Æ¡â½2—[Š–¦agŽXH¢ìòS‰i"Íq-­~Æe<˜›10üÐu £˼j´~ß«1š_Ì]#GgåeTæe„)È)ZµK*ºk”Si2]I÷©YWqäd²âœ ò†Û‰È,`÷”·k?ÎD²Ïäâû –RDÓêw´O§jƒÊF§S­zJjÚ<è©f_\›Ó£‘¸T[ávõí¸¶gžÁãÙ›¯äˆ5CëR²®Åjli—UqÝ`¿9Þ:rxÚþBN¡ËÚ“%A›UyG¤]+Z#T ¾Ê’(ùˆÄÚ1ûjrZó%rÖá)$’Å ¬°¬ zL]CŽZ¹þ^Ï%o¥ñFUö9Šv¿ÿ éÚëš:º5‘å—òÌ$XËh:ë‰Áç¥b㛃Éfí5é…RôGM”銡“U¼îDÝ/þLž þTMW\szú²ÒÑߺšyHMH;0‰$/l~¾z8>]ì_ý|ŒT5šUD{b™ð…O{Ø|ÂdøTëº ÉŸ~ÊÝÔ17"þ„¶ÇÉ#‰õ^šþV%V¸˜k#ëWjÛß4Žíâz°¸UüÞËŠƒÕaQ1<þfN rú³YÏT«k÷?e½‚ó$»ˆV@¦ÖŸz ?wš£ífþ‰ê>ƒë~$†þJÈö ’ºÊü¡\Èñ4ïo ÉQç]6¡ºùÎM¦n²ˆ{ò‡{Ö±"“/Ú͹ïá>æ×,§ƒšy¤–yjb [òò ¾\{Rp9‹Œ*¡êzÂ55U–âÙ/2!MžhØ›ç¯îÌŽ‘TeŒi8é6ó!˜ó8V6W1}#:· ·KJM?Á†ÜâìݾAë¾EÊ’<©Íø´Þ§L‰sž² –1û/ ã z 5KÈl³ÛYñïß]ªã)~”%Ã#ºìW~<ÓÔÞgÕ Q½‡þÔÊèÜÆÙKT+û/\ºóNa#êìþ «“4¾C…×B‹ºqnžÒ’¦««ŸäGߪmwÓ8ƒ9:Ÿ0#Çpð²Ã`cZs\:Ù4ÙÅ‚Õó\ö}ÜAXu“P´ùåÑæGt÷',.ÙlÅñåT: ÀU] `\ܨñ^÷cÁcx£·løöà^^²Æ>™&v¾Á-ß=˜«*°ëRüá}‚*-cI'Úü³ˆ­ªÝ™-ÖÀw#=ª«”Ù¸®O îXß©kUH#~ÿš‡UÕ×:m¬?ˆë‘ɱc1ŽâË NV`Z¬×ÔëáÑÆÄØˆƒe:†Sñy%¯k6¯Þº|æ:“Ʊ&îq‹^arijìÌ¥ot4 ºX¥,ŽÊ é Âð‚³é ù3£°K¿©jj©véˆÝŸ¢V±áÕ[Ýßo« ;Y›©vDÕ ÿŽJ3í>FD –2[yY[²Ð0Šy*4ˆ ÷&£ ’›©F‘eº¹€bzœú!8öù¹÷wâX÷äEÀG—¿2c¿äYŒö?%/÷Z».õŒöm]¶¾IššÅ«1þÑ;í"ÂNÈNB<*ßæûFÞ×´#›MîáQÂ÷qì±Ed$T¸éàijÖ)ÉõAªÝ'jÛK€h×"ÃíK½Ò¬Kõ@ŽJ‹§Œ|ì]›¥µÉèš+—Š*&ê™bÞý§êWuLéö!ÚQfxJáéñûn5¶©-ë,ÈáGÚժѨp`*%£ýgî™{%òJTj5ØàkdÑUjC§÷N$ëć^P[%¿–Ã{Òà™¸ŒH=¸uNqûZt8Þè‚·ŸÈк»R>c¢¥Ý…®¨w-Óc“뉗Çûú¼œ× °öQR$HÞ&XMªÖLƒ\˜KÙr¾[½>úZB¸iÒcser å톔,“a•&îtõ_Ð-RkŽž›Å‡¢ÎTd¶´5æ6Š©XØz^Ã7Þ±YÖ¶•R”?­ZzS~ÿ–&WÃØõ¯ÑÃA =U1L4•ä¶Áæ)Í1·X’Yè’ù“Žj^iðŒjñ 4-ΉÄIÒÉ_í {‡¾b›ßÅ·ï]D=ªÉ9a·wƲÍe\[~•SŠv’»x«Î4ôøÇò1ܾ\ú«> 3Adè“÷ÂânÏe6ÝêDa½™?’i­eó|»ûT’Ýrwå…—¨ö"Ên¤bÄßùª/ÿžêw¥W3ö˜…jc#ÎF"Ní眕âR¤gÛŸ{8 ÞÃ$ÎO2M©é j¯®ÇY®'¼÷+¨ÚèìëÙiÂÞâPUêÇÖfìyvMG#/S Ä…·&ìMÑ•+ü-Úÿ­.gÆ™Ûg`ŽE˨ Èqõ%b*Uêºvjµ³ŠxoµYuTŽo(0Gg,”,ƒ—‹*K?T±/nu‰ùÚk~5ž¸gb*j5gÖøGº”G/"œæP/!Ìø¨K pc‡ÔË"}ØWŽÂ5 ˆPA|$‰È«ìUG#ipÆÚ3è:hÖ0´Ç̉‹)á-<zÏRyü¶¦œ×žíKÊx­Þû”ä“—%§îæYcã(ã]”æÓgµ·×}ˆƒ^º¥¢Ž-ºŒ†rg< n¶¼y§>­õ¨ìE&8ïÕ`«ËΣûo…e Ÿ»õzû°—êØù.>ît¼“s¨ckú„%ÜI ah<îÔ€qqoXW*¥W¯jÆSEü> Î=£k‚Ç!æ¡£mÙž*š=ÌÅÌûBänô)ª–³Ê]áˆG<Ü®+¨dó ÏžKWe»²œù¯’A}*‚Ðr#Ç)S’C†Ÿçš¡¦èx´)mr"ò÷6äé¼Ñè>…ÎToæ:¤ú¢xŠQè %Ä U5+nP[pÀ"…ñ÷õ]>v(¾“ îQ÷°Wp. ;)|šCâ°¸Ê1ö'u.2†×ýQòNš=ñPÇAnCaäGÿpu.ïJJ•ZöC¢Õ–•lüÜÔ£CE¶^£q™¿§³ŽÇí"Ã3瑞¶žC£ýésÙ¶t‘7N —|bS9©.Sù¶âêÓèŸÞ$ÔVüØBÒµvm6H"¢™‡2QúäŒS&ŰÄËȰÑ{8gÞkØœÑ>xnÕ¤~øXBᘢmñ¡DâY.½“¤¡ÎÛ¬Ôq¹ûO  ›Ïã£d;iàñZ#\º3\ÝÔ ²ÊM`T¶Ì°÷—•áxo)ª‚¢È'ù¹T³ ¤}´³ kÊ7‹Ôta΀Ðs…Aè³p™™dž‰:u›wŸþ8ê@ŸäcµW™uk ¾L⪑t­è—s¯”BõjweC—¦—¥šããEÒrŠº^.g§ã|ÅU)ûîwœÖ¦:Ç&‚j=µ(áÇYÆ\8)ÂÕ’£lj†8b‰ºxjQ¼™òˆe¦š¬KèX–µs«KD³)êJèÞJÕ’þ Ê5 §³âw•ðŒˆÈ‘hJ7^Ö‚±;uÄïžï-¥>wjëd„KeZ}«‘åyP•îqJý峄ÔÚ¢vð´v@Û÷rÓKr¡S^ôëyñÓ]™Óè‘GA•ùÚµOË5tú€t¸;„S»k†©%g¿Å¥ñL—–€÷ ¦Ê޼™£ž½ˆÖõx¸©p¨+ê“&ZÔÀV\Ñ““œkä@—FÛ‰Ž6ð[¼5U:áXóôLÇõH¯L„“Ó»Ëì§S‹ ½|_þpxË}þÄÃõgQ¾ CƒUi³‰–1žücw„tÂ4÷±Pïéjñ™_™x¦Ü‘ydÈK4Z£å†e‡˜~Š2ê\ÿÎú}’ž§7Þá]·]°[Å<ø—9Qíï¿P_)©ÃÇÌuh5½GÔ6ØFަïêßâÈ0tÈë!‡ÛÀÓžó·÷PEݾübê"1ñ˜f©þðÕ"ÙWt2wÊ´ ›¥íV+o÷ì÷W…á\áaû‹f¶Þ¸Ux7ìÀ"+¹×³6ùN»ÁÝ*y¶,¦'×3L—Êäo6¦¼…^½\ÉÕÛâQ¨Pº¦?ƒ(¿HºæŸ,öŽkꂪ;+®Bm&rÇÑÒê@MU"ž|Š©Éžj Ž†} û%f-€…}×p+×5â}¨ˆ ž–®;«õc»¢ºüÜÖ¼}Ì´4rÑ`‚äÔ5nO/ j‘´¾æBqß4ÃEú8-a×ÛK‘¡ òÐÓ|‰ÊÍ%ë×Î0&æ?w¸m‡ß¶5vô¥V‚SÓj^‰z™Ôe CÞ’Ît1ÀQ†7N¾òâ;cþ"³@ClËþl>YBaq~F:í5ýtÌŸhÔùÐ0'èÒ®—ý„d]­ý60$ ®œ„ÂÓÞþ˜Lz­61LÊSV§å,ü¤£éJ³AЇïRaþt…7ŸêFÕ )Ô\xÇnš·,Ï¿ø6ôáÌe8#´Hêø#X(ÈÍR$ÝB…^q^M<ëzÿÞ*øv†Ò­¦Úkñ×u8•Qçqd½³hõOœ‘²œÚz§,&¤Ç µRü8…f–‡‚,PÃÆÏ… *Î6ó`¹÷šBû4ó!DXR„ðåŠ^í+AŒz~UÃö/&Žb§p¥iéE“!<èÔ±Æ×VKØš&KuëÚÜøÆÒ‡:ehuøÐ~häùï7³¸ÕæÆ­Èåì,Ùý¾ÌÿÚ¹þëúþ»ÐîþŸA;äoþ }ÿ}Wþ?…vÊÿúý÷]ü‡ÿí”ÿ/„ÿ±‹ÿðSh§ü!ü]ü‡ŸB;åÿëàìîÿý9´Sþ¿þÇ.þÃO¡òÿ…ð?vñ~ í”ÿ/„ÿ!¸+ÿŸA;åÿ?ÅÿØ}þó? òÿß>ÿ†`þ |ŒÿwýÿO¡¯åÿyÿïo{á‘öÛ;€ÿø Ö_Æù(A, ÝÝÿûS,&fb.d*‚‹‚ÅÀ¦"æP !¨……¨°‰tÿåÿsúÛöÿwÁ_°þÜþ¡B;ý?,,ÞµÿŸAßÂð› ~© _"² ó€Á (X,ô;Š¿¹˜ð7”çwÔˆ D@$á |‰Â"ðE17¤—›‘‘©»ОßËb`HÀb °Xðw@S~sÓ/A`nÖnÞŸK‰ˆò@EA"`QèÈ6_¢¾ØaG>Þf#*ý’ ÐD¿›• ÒÄü÷¼baLåbbPLåÿkþú»öÿ·Á?°þôûßaÈì_x×þ ýÿg ›cÿ£V¹søáú„ÿACC“““³……uèÓP@®Ý(3ÆÚ‰Båñ ÈQ×—¦å³+ú+·.M¤x¿·ñU¤QLÑTº–=rÏr`¸í9šNôÙRˆ›sˆÐ€àk¤'!¹³^œzä­Ùat]îB;aKãânìWaO¸*!gei'Eì±PÄØ¼xÝ%”Æ/´‚NýíDGu+™·{Ï×£‡©EÔÌ÷oÇr$¨ª ÉÁZ’¶f)íªŠÑ#æôdqÅ¿?x(ŸžÐR1¨jÄ%˜ÔÛÂÝÒà®Ñ9™çýbìÅ÷Þ¿]^¶P_×:×”dµ§["SÀ&1ž@ZÔàØ*Aw—ò5ŒÏƒÿ¡ÑPëÃëÒ¦SËûº©:Ñ$.ArŽFFZSù2i#½7±<ºîp \ÎéI3ÂÿÐM'9 ÷¬õ©RÐi¹cÆf‘æT–IS`ÐihòB{%CA.{ÛÍÖÒÀ÷½KpßHö/w;ô^pêQ_Ðé#ªÁ3&Fúµ=>œ÷«CHù:b±é_?£pÅZ*e«íðŸÂg¸gx*B Ë·"Žb` qO{I¸$®ãF¦Ü‰|P•b„ òqqE¬ޱ£z‘CÙÔ\R(Zï‘‹»©ç¨Ç¡óO®`ùJÄáŒD¿Ô§bËã~ÃtlF¤’*3>«ÁSÌ" ¯;ŠíqW_&IwTIœûóÒ8óD… *•ÔcÈ“Ã÷ Ó µ¦ð&9Üï_ã·Ö1ëË&éveËË€r4±8O½aàŒ×»³¯âØQåÍgؾ—_ZÏ€î_ã‹èÔwì&3~v7>‘ü¦™(IöÏ!éî`åÀ-ÏP£b® $ÇÞéãoÖ ˜R}D8¯–z×{ÏÔ>U?zÃCØKå¯E+䱯í-h¢jª¾ÅÆ/‡–›ïÊç‰t²ÛqÙ‹½”5w…­9œ¯eÑÅmÞ—?,!sXwó–¯|ÄA#: K?‚){5!vlß5YtØÕš-’n}xšýrcGM@ÙÌ Æ³5Z·»Ìƒ]C;¼ *¤6öz°6±zü²ÀÒ¨Ÿ‰D{)DÍxˆ½q*wU-0áÁñ»ÝËÔ›I¸'¹‡Œ°—´Ô&<ß…Mœ ­Ü_ˆ,¤˜Áö0=§‰7Epßð¸nwKÁûÊJï_YWˆßª°çrÇì@£áÍptùDMM­ëÅž+ÙD¯/Ó9:Þðì~òˆ(Nt·º˜Ì Ó˜ô­°ÄÁÇyW¼Wír<Ÿ À-àˆ÷ kl>¤+cXå]cxkbn£ìIj›ŸEpí ÁÔY$³¯Tß“‹Þ‚EI@Õin…L,vc£O—T<膈Ú1h²èxÕ{á8ÒÔyHWŠ:×-°I¥ÛM=¯-j{då;Ÿ´øÄђØ:åѾSãK}!OŸòœ‰¼CÅ0xwôöt3Þä:¨–Çbóš_ýmt*Èn’ä•”SfO7EsãÏQ—»ý€Šy47B)Ü?,ç"6ÍZÌ E‹²þloB™¢E¦ŽFä‚)½,c úøMN0i•>‡Yú¢Óã"+{MÇ`-…´ßÎZíæ­|{¿ôõ!a•‹¤• 'ö^÷kÊàz;m+DXà;hxH¢‡¯¿­ÀñfÎÒ±QÓ&ÞQ‹Â€ –7tÔÖ}8SkêxS 5ö"O÷Leù<¼AâQtú¯}_SÔÉ›¤Ïq»eød2 ^{äZŸ¾!çb°£+E•à5†º¥ÝQ׃]‘ ‚'‡UùÒƒ;]ÙLX:éa‰ÞOÉÆMc¿Q<|"h K`4ѪMá(‰§)UA¢öø$e(ý•F ²ŽÒ8‡p)©“~«~ü^È#©¸f;qcÂå¤NWOh) âþñÎóÅkoÉ*ã¸ÂÈŒ•£Å| ˜Ó[|³_bwkº>e¼e r8Ý5Cƒí´^a¾IˆŸ13‹ØOt5˜wëš—S±æ€¥ËM´0MPUíg·ìcº—ÑF#SÑ‹o2Þžê À­9ž’%µ„È|Êx;«szÞí$ôít¡ˆ3øš&¥ïUÄóÉÀÉ RnåçÔò} ´Ý‡î =Ÿ§‹-±Ï”)Q5Š=yÑoÐRFìk*òÜWZúö} øÞÕÀ›3/ì&ñHû*'¢¥fã«ûÀ uBÝLJ}ãb+Ò–g¢Ÿw+L©Õ&_êÆÆïNÑat¿?¨CL.sêQcôBP•uhNëÍKؾüTBS‡84ƒªX¸_ß5™“N‹„¡G÷,ÝÊîž{KzjH|¨oöÑœÉypR=‡ÑÛž~Ëem1y@ïK¼×ýÎæä}9½¦:ö¥ÚVLu2J,ɯ«ë¨Gõ]ñ2~£M‚C†5þ‡jß°ŸN³‘šÊjǵ>~6ëå&qYÈ8Ùe£”=ùŽoZÝCÕ NXv)ܧå_ÇêqŒ’ï&ÙÒ©téÞª}¾Ê7»7æŽæâ€Ì7º>8Þë{nE¹è!9ÝA÷¼O}rÚA*â€opÙ›®ÆU¯–<ìêéÒËlÃ¥´Q1D!S|íׯÆX˜¯§*\²Î¯+݈²6 °¯(VmšYš¨´äÄ™ºRrd½t£—ÖÕx¹Â­·£4ÆýãIê%„Zk‘gV^ýkYß:‡ƒM›ör6fíÞ-ÒM]º¶NíYþ¦wâÌÍõ‹‘R§|Qp8Ò˜rs>Ý}©Ì7FjËÜ* âê`ÏJ'—$M$4RÓ‘&{/;í(ß‹‹Ì½ðyƒÛªÇÂ7×öóž'å?nçgCu(›ÀÛûÅëLQï ›“aÇ|5Ýõð‰’Z6¨äieß÷ä:×Rçp(¬DÁO›Š7ÜM´…‰Œ¸{Çó¥MÔ󽦎Ϛ.,4é'r\»tÖë&–‰=ušæÙ£ÌRÞÀ‰5ŽDG9ÎR¯Íz#w V…$¶3‹§q åäãSh+?6loò·Ó]ƒZÍS£Ù&%÷k¤?0¥Éµް³ê_š¼‚5ÕbsƒÃ`èF’%ìAî9q8/8Ç‹îfŒMÔˆìŒhë ¥ÞlNx ·êÍáYp¼¢3A)2àZ'”x”¤uÕ7¿àÅÜáð£²X(Mo£¯óëàòvœKË{t©†DŽ@1ã_gØwþ 7Þ[§Øh:)¼ˆ¦OÓ“n]`a” \FÚm;¶ªVÆñDÏÀЀúEÊôæZ·ÎÙ"ÅÖrVÒÈ”¦ùuƒîS3D¶Ù\Œ Ge•Á]<”–e{–Ì–µâC¥ x»E¡sNz ·•Ú¬§‚9H×=ˆ”ø ¬TŒ :Ç<ðhØ´õû·’Âr„/KàLðxP¿WsÈ3Wª£] ~ cË%w£\ãZ!¡SßÍ×Ç]6öäQ5Áº„°Ëy˜Ús.*¥7¸EÌð€1lŽDÙ%/sÀ§ü2‘Ü@ýµõ¡^§%®6R\Æü\®ŠsRÓ2¶4š  ™:õG̬u×|DËhFXÐ.2XÇúÓ:W+B¤F®káVäÆUùAr=3k^~Xš;´LŸ‡¿õÄò†D·`Ìë%3?6zÒgÔ¯ä@êL¹;éXÎ*f§^¥J ³/Ò´Ò˜ò¾ÉãF­%z -ª¿ÆÄß5¿o´h™‰LØbZ…ŠÂò@ó,ˆKf¶žQê&òU²iZ)×ê^ëŽ"5²/pí?õ–ÚÝ=º®rqKtC¾Æ¾lP"{7‚wÊDX¡«ƒ¯:ç&7+2å6[ºæ‰?,:*s@ÕÅÏ^E+ëV˜.ô·â²>{HÊ$A|•µzz¯ÇÓÇ ççùr†Xâ lå Srb„6¼¦*týZ©ÒÑ"nÑê©ëõ¼„oQ篮Y_4^TàßdºeO³öö… î‹Ng³ ¤hæÅSIæˆg-‰}«l“¦ol:O»K4žTäº93ÐÝÛÚm¯÷öÊž•Xndر·×´ESííof“Û G&Þeé"šzÿ8íºÙ+þËï<ôX5?ª“ÉϹ~~±/1 1Q2mcÆïùÐÛCŽeàQ±LG»V+zª±W7“ìˆM;ÞSð´\£}_ —óºw5²o Vc É}ÃÙ¤Eäi­h¦½~µ&­o„Ò€¾ìS!´Ê‰MïUÁ{+ —'q|섾œeÁ2ބגÆûRoeÐ/µ·V0Ô¿óÈÏ È=¥˜`˜š‡UUÑÝC4k}Kè¾á>3¿…ÑÈ'9¶Òç|êhßß6yV¾H›ÿ õæ5“|ª£`é7Ϲtógšä“T±t‹]Ï"|3N¶$Þš3Ÿ=gÄKz­TÒœØ9¶6ò:àÆÄWӪŖ6 :D¾Þƒ…lŠ•Tõ‹ê)Ž {ƒn«ÏOÙ+ø€!Ñ­(«ƒUq±’Ú^ïâàøt£—fAçKZÄ»nE9ÇÇ= ìåŠêÙ¥ÐÎSÃú#OùØu40n8H>¹púeð@VqþLïþ¸#„%³• ‰¢-Z¦xÝ?]ŸwÍ_8ü´]³ì‡§|ÅQ~CRèÆ¢·¼ãîö¡|^•ð?¾N[ÇG{Ç2‘8uvÓÛ¿bå"{¿1Åýˆ Y6hðéºA;þX£÷›XUû¦´–PAW›ëO^Œ7¹ðÚ,qDiÑe]ø|ŸQ.äI¬ÝTœ©eÃ!sѷŒ©0{xoÙz×X 'r$œ©à·îf[:Å-YÉl{22äÊJêû¼¤I!!ã±æFs±ý=¯<ûÛÒú|K«<Ã.瞨šGôìz¶t¼Hœ<´D#ÐI,žYm옟x¹áJ¦¡±c;µ›Ñ4Ê r>Ð=‰¶?qî^T•ym{– Ú`ê„w޾5E½svaÓЫ˜û]Àä‘¡î\‹tnJb…Û¯i×͈˳/ÙOvçÏèàVÄIw±¡´.zr™æ¨á{óÏÚô÷Q]Š#0½-?uâÙó—Ê+FOøR=½VÚVWÜ’ü7½Þ>•óXÂí\XâóѩžùFÅu¡AžÙ /SIlÄUÑÇçYeý +{¥ÒÄIûÓ¦T¬M,;¸t‘Æ<ŸYÍÒ©J 0,¸¢“P»ñ,Åèã!¾¥åœ²@ú«1O”¿u=¿1¼>•êµ|=àÃôiÍ: 鉫S+›¯—p.¬÷ñ×,Žùöò,‰užôêæ`yÛ”+2û" zu>`:©"¬$ÅÀ}muaìÃâèuëÉ®º•W“T)ÞðCÔ̵ƒSk£ƒWøøH‡f·^›6}Ï)ˆO&>¾ž¸6ú¶'~ÿ¥g 9géæiØÍ>U¶{mÊäÕw™y©mi˜ÿù cLÆÄ‹½=U…tL·u æ!¹vcˆ„Oþ{¾¦L—× ÞLljªá¨¢iÚ¿$uÕdŒäÙeÁcI¦2ØLkµM›oA nþìâd™MMMf¿õKd¦ž'‘3vâ•®s^—Ôko’,9ˆ‹#(+Š Žoy­ðG:JÆx­%"_v½¾4¿T¿p$¸ê~XŸ`ú÷I¤e¥¿|å@ýŒo…MwÅä8\sªÜ^¦âÐÕÊþ :üŠ¡Rßn { †­S!þáò@ÚÏón^Õ&kö1WK§ÍJ <…ïùFšrx«]% [j¸V³ÁxWÊ[RrK˜…a¥€#0ìøÀ‡T#—ÂKšn•¯Ÿg¼¨ß´ôÚj¼wúÑ¥Wžüô0ß…Rµn ú)¨§séKâšÞÆAgåœÉèÎÅñ™# kbŒ"Í ïÜÏ|QR˜/uÔZ!•=ùärfÇœ‡ƒûëk\‰X×}Èûý±=ÙË×öL…NžtZÆë~×Uür†¨àÍMÏÚÄø2S—è^/n‹#f—Nv6½œ9ÚþXãê™ñLuV΋‰¹î>àâ`ÔÓ«>qñˆëg+øoZ‹<"QþÑÙÂÊ^ÔÙ……ÐcP×eUÇõ4bP×`7Hˆ³Yà~×m(úý¡ ®Ú&sâxžF-È$íŽL7ó É-ùzk=J±ÔŠ^‹{©†Wˆ­yáçšQ–YïÝ]OL'lÙFU5¦KÁs³ýSžèñIÕ„ÙÓ,(õ/¶¼U«z¯Ä«†=×êánMÑ8†6Ή»¨ U’å©rdêZÆlÝ A‹(ªB®Ç2lÁ{8jf¤ñ ´,¼'ñÃî“óÜ¿UqyÏ”aí‘ÿáÉj`ÂËü‡æCœ˜'½ßÞ·ãù?òÚÿ³»ÿã§ÐNùÿBûv÷üÚ)ÿ_hÿÏîþŸB;åÿëìÿÙÝÿñsh§üÿ§û„…¡`!èîøÿékù^ÿñŇ}þÅÚO ýÅõŸŸä/ˆ%Ü]ÿùSHLÐ › AEE‚&æB¤ˆ¨€XTôݾ]úïÒß²ÿ°öCfÿBB_ùX@P`×þ}ký§ ¿¹É—_3w´7±vøâ €×c ‰~¹PÉoü†þ|±p‚ù  äóíþd',ÊhÀ Ìù¢…_®Å|¥Ìõ‹Å¦`(X$((Êÿ­Å¦Tº½P*ù?½¶ó¯Ðß±ÿ²öC²þ †~iÿBÛö/´;þÿúÆ÷ߘÿ:Ûë? Ü™m±>¯ÿÜÂÂú¸ôÇë?‘Ø1Õ}¹þóÐÔoë?å\ûD/7½á>ÖeøÁäžšog!GJ‰Ó€t·´E™ÄUúœöb{&KAµ¨7Œž=‰.â—cŠŽE‰»QÝ /;}‹“WN‹|^öÌáá‹ Åw¾XûöÖiënÜœ ²ºÊC¦y9œó(,ž¹™œ n¯²â~Sƒ…¦‹'vÁ.k”¦ËœñE.´ŒÙñ‘0{ŸãÅçQ=èÃÌg±?‹¬Ç޲}Ÿ r‹!6úh8k#…ɹ3:1}‹ï3ËÎßfyÿú}ðtíÝ;Jt=©1Â31ü'*G;æ]üÌg§ðYÈË FÖúÅÎk0sPÖZ S¸ìêqÖƒcÕ“"dû.^£ˆÅš‰•]BæG<<–õ–ÅÞnÉ\dCµœN¯34ñÈÿFv f}Xë¥Ðt< ³Ò•pj̶¸KøÌbÑ$̘ I²úT%²úc¸×­ÙM#^ã ”ƒÍašD~ ã‰M ŠHz#Ô {"Hv”•ã3¾8±Ž:îåðˆíüj`9…0—3¬¦Y§˜ÅäÈÁíÖ@)¬ˆ¤ ¡Ë*ÇÈ2[h³‡N°ýî´@Ga”ôd ¹˜ê˜oˆGÍ8Hvòj#ù£›l°3ÁpÙÚ\œÌ¾:,ç±kØ»…Ô²BBít¤ŒÓÂá›­/QC"œÅœP›s*³:xñ;pɯÕxFOV²{Opd¬8ê+á!è¹[^¨³2IÊ»Àã(ѢǓó¯ì5ÈNJ³Ëˆ4Ëú ![vÍZ0¾UŽjíè;wò6g2 .UŠh.Ëc8d±iÖ³ûK=yQ¦ÊÖÕÒÌâä¬ák‘!í¦&Ú“üˆ)Ž$q’fÊ- ^>gÿþò[²¶^ 1qß8¯snø¸Áý¡Óݪn2U¯†……Õ²®H+Á¤=Lè8ÚüÖéhÊ U™õ¸c¯øÐjŸ c”ÆdRÍJç2•D;KA^eP.]V¡-u¶eáµw¦n—V•ZØw}9NÅ…ÿÌÃ%>;[ÛJám3Bu z±§;«^³Óhph÷1×ÇÅベó|Úm/ìÝŠ$@Lq·ÌRÆÞaâõ^ æZJó<§RšŸ`k«ÆÚòB·r¾e¹©ØAÏÑ"r-|}WB-ªœûð:‚Óõ2Zäj˜+ûm„(aóË@ï¨eÊàD-¹Ø ïê5Èãñn,Nflbæúðuͪ£§ t“\Ó>p…’½”[.›HÞ=TÅTàxmµ­t,Û™S–¸6Ø2'ââ å›-em8×bßO §º-md?ŸÞ8ç8|5À/¼˜/“Í€röâ-žŠÌ‰,ˉóo=_If®¬9‰E0Ö5µFQ¼í«91ÿlÄq䪃ҌÂxlxÃùA‘³HDùëÑG¬üçcÊXý™©$BÃnÊô yOìh  {øöF8rļ6¥pví¿a¥(ÇMMCìJSGÙ±óEò÷‘-° £S`ýl®ñ=Á§šéô¨gï°½ù9_ÖÛÊÚïœäjRóD™­¥äÃÏ[¾ yèý&Âo.ÇBÚJ¿˜-®Ú©Ä'íÿ,Üë*»ÖIÀ,\#Ì ÃCœSùU¨nž„ÅŸGOÇ¿ää,Uì€-®‡ýäyz¼†3Ǫª‘’õžžâä|Þðœ‡LÜKNý-]Ð3ÃN9ÖC•@%Ò•Ø´Þðý U£¸JfÕù“‡n\È<ûPcÞi¼W·Ææpƪ”=VáÛÃ÷Úè÷ol•7GùpÜ4H§WV¾¼j¢„mp)óìÞÙ¤µ“ÔB2ì''†óùíEá3+0ƒ2A¯2ñòöp3¥ _VÑB¯½ŠØ^@ÊW»«±¬%·$ÙŒ{wfrDÛa*;}ˆ’%ø‚­±säc‘$½Û½½TÉÔShöé›BÈn_Ñ ÇMR¹è€ÍÙ‘˜{ þòÔË4XÃ&špz?R%(bé^$ÑÓEõÚÕU[Ýt% ²Ù—x¬¨É @y³,ІàOÙÃ Žžóˆç¿îq¼—ïÀ|ÇÕ«Û32uoÜÆ9\´N˜„¢aá•)á´(¡¸òÒ~Þ6æ¢9–Š›Ç*>]Àí#æL ï E}8ÿá®# % 7Ú B±‰ì/¨`©°s)Ü^"ò¾'zº2uàø¸_yÕÇ-΂—Ê¢íc½4‘†ŸXU$¿¶(màÓF¯þp½ÔsDd^dv®É ºLA”À-3-½”ü°žR3M}bEÌ¡ñ@’® ÉDYetå •wßMC¥Dlؘè}»ã‡52X%ûá:»˜ÃŠº¯)¬ò2Ñû—ö’y‹T½)/IzØÆ²L>÷¬:'ê?sVÞ|2Kœ‡üÀMèEM=Ñ;‰=º+y¬Zž–‡É¬ÖÖ¯Û1‘áÕo>O3h¼´ÅpÝŽŽŒí¬ÁÑð;³=e©ár5í£ô½½tAau[©ñÄgžRæÑë5ƒÛ±„¾¹7¢+c+áKE¢'¿ÆV”wS¿÷,lúNØ”äµim‰¡ã”4¥ :Üú'Ep2%Sn.W‹¾<—a_£%Ãì©_Žm†Ã ±_:ÂTˆº´÷á#£™µPòà+ÊÔ(>=&²4«gY§²o•,”Sg&‚?WÂuH‹5}~/ü~Ë3Ä@Ppõh?Y0Ñ¡ü~ºÅØûÒüž¦02_Ìħ\§fN“6‹˜#ÄBsòÂŒÃVh»Ÿ•Tž}-©†„Äf48dNàÊë·^Vɸ:zÈ•†Tãªx—hàR£äÚòGÒ‡”aÔooéMì{O~“†ÿY­©wDûÝÊŒÌ23Š®½›=žLÌoûEžÍ$gï‹z{vrÔ† ¶RxÆÒ# ƒßSÇ5'r}x§pbúµ÷ü¬È<£[É6f8ÍŠtèÀ-m9eÞ{íŒcAûÀÝL" €«¢a¬cØùNsDJÜ;u6ßF9“ÃÒêœÊ¼‹µèÓ2±ø³'`µõŒb8¢±ÇÆÕ]FÛ­¤âȽ7ËŃT%*ûˆÉŽòñ>=Á_¼/àìµË!Ç^„Ï ˆ= V¼å¸ïj »ÌÇú°€$öúëhñÕÖöQ¶qÖ¸Ù·NññúQò$º>P;ÄZÇ|ÈÞh“\¬„p=1²¯=£=;—óè;Õ}­°8vÑ+\­7êÁ}6Å Üy°Rpô¥7î9ÚÁ¯Ç!Üb¥n§a{„W„'ü-HsŽç‘3H¯¹l¸I(gn‘%Z–ÜQi~lJÛë2.{\õ„9ÃA OO[ƒ¶ü»Ç×YF:;ºÖrW4ã–7]Y%Ö‘«†YqlÐ|Ì5{Ø*àƒëk© ï}2—à÷ŽH< 9X¤Ãk3èB}5v,QZ¹=~Ö—U]ؙґðÙ¾ع‰N ¹ôT ¯/Æ,¼y(ZRëu¬Ý\°”,7–H )z0ï¡#ý‚&¦*Rò@ÚmåËÃŬB±X¦0“à!Ñ×™ëbqPN¥¸Röež}*¬Æ'qAç–›çÅK³±a)U“”ûj7Ä­EŸ¬0ÐÚÃÛŸ™/®zÔ=äý«Ç—ȱ"ö‡Éƶ·³ ‰•ò“†Ú`™1»°8Û$ª©±È;ÊqìcUsðHí #©m«)M¦Ãy}H{ž^¦Ķç.%¿Ž›‰]®Â¨± ó-Æã=Á‘›œÌZ{xÈd)^žâTª6fu43XEö'½)îQ\OZ°ñE·´©n'l›œëMèÙÔ˜6ËÇ%ŽRñÛ˜dô õãŸS9Àù–›«18š¢ÑqõT$N}9ñþØWÁðW÷ñÉÒùÙ'ÉzpÈ‚ú‚j4<ùæYÙVæ­Ã°=>SmÄNNt{™ß«·hJÍ߸³döT‹‹¹)ùá5„²ö䀒T¬±è^’šv3ßÚc È~dZW³ý òw)³n Â/RE¸0㈳Éœž¾rršƒÜ÷‰Ó30 O»¼M"H LFÛåx}­+“–úJ¼«MDë`—MŽæ9œ²«*÷pB‘ ¢NÁæRƒÎÍ…Q}­’†#lu>ÉGÁLTöÏÜBÁ•Y?Œ®¾”s:pÓƒ #ßIÇ®Ö?ÊÊðšwâ`ðƒà>ÚBa<ò½m}TJµœ’eà ñzÔq:É µ¦iM s…;ñN’D3Ò¦£ž5÷(e“Äê±Ü–RÑàS,Ãqs­£¯Ã=•9…£LæœãzÍæf¢âÊšÌÌqi#¡ã°+CN°'Š·úŸ`imÚÎ_ßxÃZ’ú4ù¦[GàìVi8éÝ”§-š£"ôd|+§«|'“³Œ66ˆ•C²Ø­‹&ø‡Õã(f=•¥é8˜S ¼6,áÇÎ=táŸágzšÃºqÎK]õ8¯ÿ–g{Ja´]x´ŸML´ŠeŠÎKy¼!ˈ‹ÍDcÆó×RDœÌbG/ uíˆ@¾èæAûª±7~Ô\¢°ýr)´©y/V†F‹5jxg«òºÛÒ(И¹ˆñ¦öCu!æRÇíAä"÷y!qÚøäßô¶S‰>©½rYñ²Å—®^3-y¤BBs öùÁG¯öD”¶1—‰€ÈtÏ{Ð%¡¤Ø+ˆ™s\À ¿ë€CIÚb\VƒÉ5 „^Øóiµ©˜¨áÓГŒÆ@²Åi^=ÓBÈ#~ùa䃇{WÓöè{Ö‘“e›°‘æ;/Ó&…÷® OÈî)!c‰Æõ’’‰ÆM VÚsì, 6«¼I’%«,.=¯ñо9›R|Ú}¢d#ç1óo¥=•\±3AÎÐìàpNÃ`Ãu\‰}AwAŸŽ"ˆH ¥Â¡‘9yÕÞw‚kÂÒáïÄÂüAòTŠðѳ{/¨\<í¦),A„ ÔL e¶‡™[œáŠD5ÄJ3DZ|¼z梢¡H†øÚà y8Tã˜ÃÊaõû…øR~UÎýzϘ'‚+tÏ-ø[sÔQ+X¨\t $;lwlB¹}Š„âˆÁ;Ñw˜ûÆÁ–MG£uÆ~s¼J1EG˽»~{ШÅèiÛk—×›’›—£ÂÚd˜§hûçŠi¼…ö+ 3*= Ï‚¾}°\ÅRxÈrÄÄ킊†|È(h¡°Ö+õ€sñ¼À*Œ•Œ™)‹±‡üðâCïÙØ‹˜›ÑKßJÅÒMeÓZ4ÝÓõ„€ DfaŽ´ÿô,ˆJE¼ 7=ù¨$ùM¿Š›±³(Mf)ßÇw bµ ãíÏZ£áÀŽÑU2?ÃfšÑwŠ9Ky ¯ûáK©û°ýBäÛRºŠÕÓ4+æ±»ÄBdïÎŽïøÑ2ÌÑØûà•—I¬´á-Xƒñ´Þ Wu F€0ñ(½{ªŠsþÞ²sžBú¾tnç,¹õbP¿ñg‹ójiÈ™½T:v6ªØël¥!ùáëþQùŒC}"Ì Ga­tÔ îÀ0Oí|T²†¡ê³áðã”ã‡c#ËR.‡£¤Éx¦TWÞbo×êIÅd3ŽHvÊmÒeÖų ™m‚;Œ›ì`¾‡Ý4­O–üLôb4 òTå~ÄAKV@šNÌw‰%É:Îã:!¦òö 3\àW> Ím±Š!ž4*¬ƒðûGCÈya‘ç³&£‰÷Ü+× &»™¤&XÔ&=r/élV˜JðÐû+á~{µó#Trã(blì̹j«0˜ð}N£„pX7<Óáö*+ÃñKúáZ …»ž0ôŸÏK‘B]KgÔLŽÌ1~ŽÏ¢ÝÄõDtð¹iCJëZ¨Â14ú .Ĩ+¿k6­_Ø£}ÅIpq¼ŸŒ¿Žâ…YGÛ½»S@BEIŒ2'cÈt7^”¤»51F«LU¿°rÅçüC|û{êY6hE€ä+iDJæ]¶Ìv7ÙŠ ++|ßAûËØ´&„«îEå³ËK¯)eÝ«ïFz æ„ÓsÛMဴ.Cm’ÝtI‘®ê„\Sp’ãã±¶UKn³és¾|ë<9Å>ÆÅ™~Ùói€£{ ;/H~F ¸¸~ümwâ àd­A¦I}Aу<Ý5Ÿ­è~Z‹2Ú1a½ð©ó¯cd˜x ÆÕ'ÇÝØ­†½YQ cdžˆ|%ŧÿ2¢yc‰{Ó^¯];Ðc]Á¸¯O%"ë-ƒ{ìÞ«ÇÝ7VF]\T·ær'š¬ÄÄüWbI.\lô~õ¦ët¥ÜrÕáÌ79e}[ìÉ3Ôû߈ kõ½ç³õ¬,³Œ%n05Æ”9‘¥ô@wcô;‡€ûÀtWbS4ˆÒ‹y2Äzy>?ÌlîÌ!RyzóeËD‹÷ý¥<³‹[u×¥Ù€Xéo¬—à0 ¦Z¶%öêšJÿÅIUñõMĹ½ô}­¥ €ø{ô²ôT¥'©c‰gd·Ôsž„xÅ—ÄŠÎæ¼¨Œ>†Šæqî4aκ-ê+qe‚XüñÃÞC3“±'(Ü®>gyŒÐÁ ’3c. Ž §ô‹ÙÔo6ž L¾£q9ªÔ›¼8|žüÃK#Å£µ34Ù€^‰8?ŒÿzÚðfå=Õ¬ x«2‰K–Í/&1¹ƒuçë”É-ì¦1.cÝ÷r1ï—v¿ókÓŽ÷¿&&¿ÌúOá]üÇŸB;ßÿÿBøß»òÿ)´ÓþMù ïâ?ÿÚiÿ¿þû®ü í´³ÿùúa°Ð¶ü¡»òÿ)ôµü¿Xõimo½½úo{aä¿áñ'ëÿ?É*ˆY ŒÁÿawýßÏ Éð p] E \ýH!LUÄÌËϯ#¨ÀσÃ>&ñ €ApWk7kG;~~ÅãÌÒ„’å–´Bš˜KKÚ#ÝL@VnnN¼Hgwk)fG7¤ƒ/ÜÛ É 2ûx&ÅŒYy»­ufV&.®H7)kWG^QQ¨/S§›µ›Rú8ÒtÒÚÞÝÎÄÍÑE„ÑLŒbbô’PK’µ¤µ½tÙÁ )Éÿ±¡¤µƒ-ÈÊi!ÅÌÇÇü3wôò¶D:𙹺2ƒ\vRÌ®nÞvHW+$Òä´íS“0€ ø?Þ©£¹7pv˜—¤Œt@º˜¸!ÍA¦Þ ØÇê@`>!>!//ÇÜÚdfgâê*Åìlí`Žôb––4ùêÊŽ&aToÛ³´:pÈî`êê$¡ab ܆‰4ÈôãÒVÖ@k\̬¼?U¡€Éú±•ß’þRE&Žn˜ûúcEǬ]ÝþR€\?•Ljäïww0Ãh”ë› Ž´7Œî/Uciçhjb÷Çvü:œ€þÿ­-¤¦_> f» I~@Ò¥Kÿ©:yàVH¦{@˜åÓîæHWÐ'þ G¦$ÈÊÄÁPXKqISiÂ/ˆ´ÛÙ8 v±‰9ÿv*`¿ Ãÿc›¿¾Œi1¦Êõ°™öim踺£ ’“PÒ øoæhŽ”fùÔL»›„«›¹µ#Ÿ»¥›„$ÿvòv ¿ÓÎÚô/fuîõ/eEº¸8ü5þ–‰»³»#áûÝ+Èo.þÖ¦^WGw3ä§>þ]ìŽMÓ…ŸêþÌ…øÍÁ"{¿Çz[âÿÆÀ ~ÍØÈÜÄÍä‡ì·sü§Ú[ì[[@¾Íÿcò÷˜o«³ê'ÖæH'$`æfÞ K'«m³ûÚpÅ’f@­HiIk{K«‹ÙïmÚùVPôyK3ÈÔÑÅé"Å,À ¢{'ÀÖ¾æb\f™Ø£06ðâG( \9˜Ø#Ð7K9L\&PÕìÏa¹Z™`†4̶Ì  ´èv°˜fS º\ü{[¾ÅÀ PŒ?†‚?¬^¨ZTXŒ*áƒþ°z(¿¹ò{J÷#&Â(XŒ˜%òˆ ÿÉ7}·“D0Û€NÀl7ú!À[| yqôÚI¢Ž‹ÀÝX"ù€9ŒôŸåØ+ ðÄt´¹Ý7§ ºqgëøÀR DÊ;Ë@€YýeàVÖ® 'G`¶‡æÖ˜@ÐÔ3¡²v¹³rtB&n k7§µÈ‰M-Üíx@@NŽ*\å’;® Ò‘ÓÒ’;וrÝ ¤b¼ãv=ÖöNvÖ@µž&.ÀdÕÍähRWÔRPòËÉ«S…ë‚-PR…WÄ'*ªŸ;èým-nÛîSm˜â@¬`ïÊXÈÕÚ00f~inøPל¥˜Mì¬-ÄA.Ö–Vn@²«½‰ôç‰+P±:ð_ÎÉ…ÄEÄ! Œ¤¶9î˜mÓÜ3Âßu3­çç÷ôôäûm> hÿö4ê“%þ!|ú”q;JÚöŸ®`΀ænmnn‡ü2„Ú6ðOskIþw\úx³÷ðiZ¾ýü@úÿûý¹ÿmÚùüÿúþçî÷ í|þkþËÈ_xÿç§ÐNûÿ…¾ÿº+ÿŸB;åÿ¿ýþëùïâ?þÚéÿ‘¿Œü…wåÿSh§ü-~ùïâþÚ!‹_ÿy×þ í”ÿ/„ÿ¼kÿ?…vÊÿ×ÁÞÅÿý9´Sþ¿þ3xWþ?ƒvÊÿŠÿ¼»þÿ@;äoú íÿÙ]ÿûSh§ýÿBûvåÿSh§ü¡ý»ï~ íôÿ¿Ðþ¯]ùÿÚ)ÿÿéþŸÝ÷ÿÚéÿ¡÷ÿ»òÿ)´Óþ¡÷ÿ»Ï í´ÿ_èýÿ®ü í”ÿ/ôþ÷ùÿO¡¯åoí„Ù‹aofdät0Ç,Õ·°ö22r5wùjCÎßàðöÿ ‚¡BÛò„ò‡ €w¿ÿóSèÿÎþßmÍó“^bÔÐJ>+ÐÉm¥ÜÞùkð—k§wwÿ¤]À_láýžFmïÝýRœ.&–ö€æurA~ãêoÛTì¶ÚÇ5ìÛ‡ IW'‡ßJ˜9Ú,ÀÏ%ÉIÀlÍù²(äsQÈwŠ‚¸¶7l¯óqšA Tú~ëþåfo³†~f ý>ë·OäÛœ…?sþ>ç´Åd»«¾ÍUä3W‘ïsýÇÛS0ûS¾ÍXô3cÑï3þ[[¾ÍVì3[±Üï7wÅ|«B°Àï‚þžšƒ?Û/ø{ö ´åãF.Wño×ñÙÁ?0d i®ÚIKGwóí`N®¿Ê"‘Ñ 0k> àÇ=îßâ÷ÙªÁß·jþo—ýlÖ`!ÐWiŸíü•ÝŽÐ:3¤««£ ³4‹µ m sUÀ§ª›io{T%k¯“@Ühõm¶Ÿ ,ü£ª?•þs€³µòï0ÿl_`‘¿Àü«ÒŸ,úu}Öd°Øßî±ï4òY›!ÿ²¯~ۖϼsôã³bþ6ëÏÖÿð~€j¬¿íC!Ÿ­ùÛ½ ù¬ÛÁ¶à“(‡.Øvâ8ÜHANKce^ßiÛgí‡ýý¶}¶ÈWöa‹ôött1g–Æ„–@Ë>•ÿN&ÀGº›¹}›ÇgC§ø§‚¾_•ü¬å‘mgó­Ò˜ö1K».ÕÒiþ£f~̉ ÙË…ÙÀýic½µ¹ÄWÜ?[ Dô¿ÎݘÆ9˜!¿nÃgk„ˆýWÚ€ÙAý½ül¶‚ÿuîßîÁÏö+þ“6˜::ÚýV3솩ÚÅûë ?³ ä<æá€f‹º‘Û×™?Û® àWžRð³å ý—lGð³} ~Ï>¿m;‚Ÿ­NPø?&;k‡ßÚ ²7qp·01sswAº|Cu>›®àÎt¿`x6s ×¾Áù³Ù ~4Û¸~?ûºègkû¨ßV ¡Ï†!$ð•Z}VX!ðwDLÓ‘.¿÷äïl~?Ô?ý5ÇÏZ+ùšãg%úZI…>+©Ð÷”ô#¶À§Ö˜ý1‰§ “»)Ìþv;J~ÕŠÏj,}¥©BŸ5UHøââ²7úž¼„>+™È_i£øWå?«ŠFU¾qïœÿe³áùïÙèÈ×ÝõY½…ľc‘ÌÒÖ.nî&¿ûÑ€ouÊ×5C?Ûôk{€~¶(ø¯rýk>^ÕÁÚMÝŒó7¹ªböíþtÜÑÁÕm§¦ºZ‚ØMì$Ì‘ßè,ègƒƒBþò¨£ñ1ÞÚVœm.°mh#×Gˆ#žMÝ>òºn»$×?¶á³aCAþ_§~6mè×óègƒƒþxÞ³3êåR?=aú·` p+wº‰ Hæf»X »ôŸ¦ïÿ¡ýŸ»ïÿ~ í”ÿ¯³ÿSdwÿÏO¡ò7û…Öÿï®ÿü)´Sþ¿ÐúßÝõ?…vÊÿZÿ»»þë§ÐNùÿBë?w㿟B;åÿëÄÿ»ñßÏ¡òÿ…âÿÝýß?…vÈßüŠÿw㿟B;åÿ Åÿ»ñßO¡òÿ…âÿÝøï§ÐNùÿ:ñÿnü÷sh§ü¡ø7þû)´Sþ¿Pü¿‹ÿóSh'þï/ÿïÆ?…vÊÿŠÿw㿟B;åÿëÄÿ»ñßÏ¡òÿ…âÿÝøï§ÐNùÿBñÿnü÷Sh§ü¡øÿï§ÐNü‡_(þßÿ~ í”ÿ¯ÿïÆ?‡vÊÿŠÿw㿟B_Ëÿ#þÏ—µý‡ ?_FÀ?Àÿ† |…ÿ#°ýügÿç¿OÿÇð~WÌ]ÜŸ]ÜŸ…ûó…&ýâx?ÿÇçPAB%V:¡¥ ¤Ù;¹»a¾ýoà~þÑ_‚õù7¸<ÿ0¢¿Îóß#úkè<ÿi0¢¿Îó#úk >ÿq0¢¿ô7Àˆþпöù0¢??#‚[9Ú›¸‚Ž#Æj‰aЈܶ¯òÙþ~UÖÂÌúÇxDßÇ úSü£€ô}4¡?@Úô#¨Ÿ¿ ç£ú{øüø¡¿ ô7±þŒïßÅúÐ?„øÙÑOZßhúË ?ñÈÅüûXG èGXGßGú+]¼ëçGh>[50öw»{Vϲ»?Ï$¶ðݾßÔóÏú~'ÞÎßíûH9µåÌ¿«Ã;‘rþ“ŠÙaÿ½ŽÜ ¹ó;òûÐ<¥#ÿèÒÁÝþ7зßuTÎ S±º£9òG`<_#õ|•ƒüFuòÞnHH€çÇX7ß*ª´( þ!ÔÍ?Æ·ùJÍ_ñúê&^J.îJH73+Ì=ºø7e²ãæïJt' ΰiþ*BÎïýwÀq€áâ{ø$ßÈý•çûhÎ׈:ÇÅJÜ~G—ùhœÿ4ðÈÞÈÂÅ݃½b†Ä€8}oâÉò>æY›[¼_Û|Ë †&Û'?„®ùÃTanƒ¢ò5׿ŠóGt™ÏôÆd_ƒ_íD­ùšÌåN‘ö?©ù±„s~»ÌPðu™à5_¥}Ö{(,꤉¢‹‹£ ¤ŒtÉgÁ» MT,ÿãøMÛA‰ò|[ͶÓMWöIÝþêóÙ8¡"_ÞÒĸ˜‰›É¦Õ®À”ê÷v;ZX¸"ÝþãpSÀ0ø¯s» þ3Õ~és¸Ì®ý£<>{:è×`¨ÐÏŽ*öW<÷W^Tø³søMûך¿\õ/zq‡{ýÃ] v@ÂðUÓþÿ³cþÚ±v,‚_jôö°þǪ>»á¯cáϦ/ ýË~ñ$Ò ãR8¿ð.·òÇ›þì<„…ÿ=Ù?Ëqw{Î#ßf Ú)û-Ìðýf}vŽžÌÒ.H7÷/ð¿Jý¿ºíÏGXä?ïø·Íõ¸-Ðßi3f¬øCK?Û¢ð×¶(üÙ…ÿ€^÷e¼`¸~7Ì“<L ôûü ä‚4óÍB䳊|/ø‡u Û­ÑÂhçI'k-'7E *)üc¿¹ ?¾äù”jîò[Â7ôWä³ÑŠ€ÿ´‹|6Q‘¯MT䳉Š| )òÙEþÎSƒ]¬¸]¬¸ÿ=í|ÿÿ?]ÿ+,$…€!×@wñŸ~ }- ¢40ã²72ú¹i$jæäô/Ö~`H@àGë?€XB`ûûOÂPA!!(fý‡fýïîúÿ>ýßYÿÑLŒb~ÔK>@-·—~ó> ¤ ÒÁìÿØ"í›Ø]òS×€üiN@ÿÿVƒÒÓ/Ÿóõ2’¿ @.¸rÇ[i×íÒ&¦®n.&fn …?¶I\ÒÔEšð‹&"ív6ÏÂo.dÁ¿ XÇïÆñ%ùS»ÿ˜€i7è÷ˆ˜ë¸™XÛš®îè‚äããÃd ”tþ›9š#?¿mÀ¼‰Eº¸88òY}|óº¼Ýʯs:»;¾ßr~sèçÑeç²Bæßú³ÇDúSeÿ‚›)¿¹˜Åc™»p»ßcú1õ?Ås£à/Xcdÿ]ΘÄï1Þˆê'¶æH'`ö(•7ÈÒÅÄÉj;´ÿ£Še$Í‹t‘þCÐŽiòÛöÈÕÊãš©§føZt9"Äâã ƒoÅ·*‚á?JãGÕC…Á<‚`°ˆ  è«ªø†žý°ù¢<¢@ë!P0XàϪ7ý†Ä~X¿ ˆ,ÀþCE¾`Œ9w31ÜÑb6CÚÙ931kËßÏIªÙ§sL@Ü€‘ÿ㌠ù·«ÁxB—Ïëá>{–m_i‘†m_†MÒÕÌÅÚ ãè¿‘&üeãGÏgnô =p×nÒ’æÀSé‹jÄ™)Æëc.›KÂÒÍi·íwª@uvnŽâv@ºçv²ìvÀÈ÷ÑìkµDò9Á†ôŸåØv€³&Éæ˜Î6·ûfã´¢@WîløOŠÁ€!mg̃‚/ÊüËsÿrÕÛ?[º¶Ýæ¼üì$ùo–}g˜ÓGwØñôÅÉÎÝèD µ&æ&N˜.µpq´ÿØNöÖæÖKþ” s[&¶€U8‚>ªÿ·g}­ß]¬Å,ýݤßtî#Ÿo~‘îk6ßY Å,ý„ßYüËG]êÀ9'D‡@wŸuý úzþÿªƒùpŒ¹£¥‘‘™£‘ÑvøÁgoþ7ÎüÉü³Hbçóˆ Dº;ÿÿ„X˜@……-DÍÅÄMÍ `AQ°‰Òü¿nß.ýwéŸÚ¿‰Ó_çñgöùøý÷/í_P@h×þ™š¸"A.ÛO,\·ÃVs3`æ!üGMÐÂ,:T$Ê#†_a(Tø·B@!‘?‚[Û#]àÀðkòñ " LM ¨(ˆ°ÀoÅÁ@ÿ©¸¦Ì§Ì`aQ Â#(Ù}'ô_ hÿ@4ô×yüØþ… @êì,²kÿ?ƒ"4Ž+Òbl‹XU¦………=‹……Û¾¸’•Ê ükƒ+nnm%AZ¢¢¢êëërÉÉÉÙÂÂÒÑÑ122’‘‘ª©©¹~ý:S`` Pnkk‹»}8ÂvÓ:~Kv¬Û „¥ “ƒ{¥N_8“uï6òDÕmãÆ­­žÆâÃOŒyXÝ™•Ò=„¼/Oè¬HÜVŠ®Q{`·Ä}ø“5}ÓÁ!òw›—“–ËTÖ°mðV]^~ŸUP3å^•¸|´¯™òÝí[yÇÀ³Í½<ô¿æéèps)k6¸rï‰l¸¹ü“ûWQÞü\½ÁŽ~§HN²XÔû~8|# ©qôtOWе V_Fé;FýÃz:ß1¾qH¯¤zsLdÒËœ \¿ê"V9ú&dõÄf±±}l[˜÷Ñ,5²AæG&£îšÑ›â½5£´ÃsïŽl§*?*iy3Ûì\‰kdtýÙ…²¢àÞŒ þw·‹¾×úoV%мI|ðÞpßžû䓊¢RHC%·íwSÞ¦?Þî<ãNé\CeNØwBóçZjrÏÎ3¡Ý´×Šˆs‰èÍÈsœ+å¯;¸ì˜VDû5ÅMë¨ÒêF_ôHÓwœ.z|m'ôï,bætÞ Ÿ½cá®ÿ¸àê²¥;hUš´Ìï(¨ƒz\Ù71tÎSëc âA~›OíZD ^õ^¸%eHœÅ«¶Ê5kócbn—¢áÏowQuõ3Ü‚QU>q©òÄʺ'ÎOk,:ŸŸ@ÌìªùÀ{'{Ív¯ŠA›”XræØš¥õJÓÓ‘ÒùãjýL-š,o¤’ðÞÐufs:Š(¶´ÑCW{OEPGÛÖÉ·.ÔÒCÏyÖá: io'ð*ÞbÇ©|£¾e±µmº%vœŽè*/=ØôÄœs1­ -Fl¢’<‘öÈHoçÚ7¤mZ8£ª1G/¶jS6s·‹ãTöl‘¼Ç|w#°xkC©p‹¡« à´A<¨jºU9§zw!|cvõÁæ)øReɳ‹}W(è›Yê]ÖSØpE¤ÚË»SÇK¹ÒYìÔ¥VjUÿhO–ˆÓÃ,QMö΀œË·¤ö‰…ðyçÖÞÁ³Y'â}a"Ôôîx/‡Ë\ÃÚ°³~ª÷·ô5ñˆ€ÖJ:o7ƆNt<éÜ¡P™@þ9#I‡(AG¿éùk}mŸ €^x „H?Þ"¨L¸K¾:¬y½æ–>Dÿ^~hå:¤ÅvпOøÚr7ºd‘¤Ï¤åàJïôÐãWbSCtƒ's˜ü5f—Îv*~bl{½,©îÝrò²Ë†pÌeO‘‰¾éû41}Ã}ªdÓô¯žqñ$Iö̼0Âý©5µ‚_Œm—ÏÅ:[8´ÝjãžvÎTZGoGèÔëö7þ×ï(j2ðžS ˆÄ9ñtMÚ!*Kº±BSnoã3¸ì¬Ï å…Ù´˜ÌOÖ´k›×.”ŠüÒÞÈ«‚E ª¡“|^d¡:Ó¾í¹§÷3iÒ‡AÏ;¼½«X³ [yÞdPq_¿¶¼ÑGííä¹RgO\¸yõÚ2à¤ûbò¼Þ¾óôùXêàì¨Æí&}íÊÅEïO—ðgz¼€ýqÓÁÍø«©ËW©ï%•Ñ ‹¨µ¬w$:ýGsçŸ|Htó½ÇÆÝwM% M@gÌ@ºÉÈa‡7ËZ¸ÚXlØ‹õÙƒ=Ùßù~hûûjl/ß…Œz0Ô<°ðÏ%s½tˆýÒ}û±ev”-¾³ÕŒÔßÄLÜr=˯ŽIñÓ>T·ág‡IQܘ½Õ1Õz(ØæôÕRù®õ4SÑ“¯ÃÆDß5¾(Ùäê •Lz2‹ØºLÔg‘t›YÖ»eɾ'³]ôýaBEQLÉ#€œ%žIÜÊænQ†Ÿ+X“˜HóúÜ[Òè³¢Û­¿p°ßËj¢s{Æü·ŰPý^,ö´r¾a§u<‘Ð,dªlÝ,CÜÚ+þ®‘¦`ËžŠ÷ o*P_1* (½6äÓ¶¯`ÓÓ1µÃ‹Ì Pã­>{amÜ«Þ#DÝ[¥‘ÔrË3‹5ÿ½ÿ‹jÙ†aQÉ*JÎ(’irT›(A$I–œir$HÉ 9 HN Hœ³„$Ç&7¹¿Ý虹÷ž;gî|ï|gæýÿSöÞ»jÕZ«V¨Zµ»©µ#¨þ[%IàÏÚÃg›úbý{7wÂ.«®! ¨/kÆ)‚ο&;Ë^C÷–½$¾A+SæÏàŒè ^'‘²š¢NƽHz–‡Hg“6<.Wg\ƒ<½÷:n¶#“•q!×—½‰¢Ó\k·{gZ€Þˆ‚zÌù3Ègðœ8„ÐÍÒ˜ÝR´ì4âÿÆòõ`A?Î ?Áí>"µ2ßœC±¾Ûkº9Š\:ƒ¬];l˜6âC&f͵WQí¯‰{ ¹¨!Ò.18¥ñ¼Àü'¿[Xý ¸)«¸ñsŒúÈZi`“=%HY%Ñ „ʆáÝ÷HËH]dbÕ•søˆÑwdÖ#^¤Ý!ÀC;FÞ÷ J‰t{ T¼;¿¤6€ fxZxÂ?¬… Ζ•ªh(t"q\à#¢(ì6 Áj¹Pøtƒ°ÂFéô!R`¶Nã”éF>Z=Ã^¨ýõEeƒèd7Ê,–¼N×K§‰QÖðâxÆ®¡óÁêr ua`âEN­§ÞûˆÜl9èúՋ\:YæºÑŠÜò‚B ½ä­/* &®§ŒQþ‚W¹*…º`¡j‡”ñQ—È»¿$³Ã¯ö¤ú7ö„Zy€õÑò€¶á¥}„ª{Ìsú6`¹Öb%Šùž žCœ(`ÿw@ÄUùo8GnÑNL¥úfë„}f‡ZóÐÍcƒ¥Âp›spêj /ú6»¼ë™ûÄbݲE¥ØKŠùéœÇ{ìo†Õ í·áZ3§ÙȣM•dâé…’¾I'<Ù•ëýàsØ :|³É…4K|ã6Pa²NÝ ~ýI 7‰$د7REJÄ)R‹·b-EkF`➥Ç{§õn }oy½ÕFX)W»½Í©ç µêP̒Űñ¨šE²VÎÕ}±ä+$›èe)C‡#Üá3íëhÐf¢WÙäÜòKfx£pgÙ™S›]鋸Í/óuSáXÅš‘AÇnVþ*ˆÙÅ+ý¾™ÚúßÖau~Ø®¿ºÚÌ® k­#CßäÅÉË0rãäÿ{eënD&ùeqt@NtŒLKbõN7Ë¡në[5`¦RÏ G´ÜuˆéЇkúÐç.ÛÒº6 ¢§B¨HBÖ5 ðÿ|"ò\ ,l¯•w68T8Ù»ÂË.©zCŽÐÍðOÀNê@°lk] šiêÛÿî2¿Þ޼W°ý}†~g’½- !g þ*à®[8†1ݰo¢õ4‡ ¬Ö ñ{øŽötø÷ HôQÁ#‰l„œ9j-Ö8žq„~«šâß™¼s( Oôá‹0ËF° ß{‡P/^­{^þ–j©NÁÀ®gIøn¸ÏOº+5ZcèÅ ¹Æ¿8ÍýÔ¾ á¾ªmådIVÔzp$Í“UÚ¶5>ÓøæÇ…ÓûB|…ªoûàß/«æs…¿ièAFê*Ê¿i&ºöSA ¬,,'Æm5+ßF@ú}ÚÄNƒå»Êîñ† )Íp·Cž=úOçŠÐå# Í©ò†xž«d¤}ÊïSeIõ·zg—<œB{Ž™Ú4Üñí•Î’Ï{ X+÷|bp»muÉ„G•>jz^LŒã)á;ÉÃ=*î×7“u3¨ÐѸ*wkìŸ.Nº[¿êœdf–ìhÆ7™~¸›j¼³®Z Û¯÷ºÜ:á´*ºqb—%ÓØ[,[™E{Ù¢6PÂmަ"˜Û×\IØ+*ëà)€æÑƒpÊ¦çø¢øWë1rlæ°~Ì2b ðóõ !žPøL—šÛꜬ?â|å<•ÉÎÒ) ËÚIuî\•ÐK¾Ð‘²­¥Íð¯2Ž×ÒH`ˆŸ-Uû¡Óú‘{Éq•CBðSm =˜6Ð#ÑR7èµúÏoa]n™"Šøß{ô¼¾¯»2ÃË/îLX¤nÆ ñ8#]÷wR¢‚yIŸ“E18ÇþØÍžM™Óò¹µGŸ+‚î2æx‰ç`°~[Ë1K1Ëì}öÈF"‹GsM»(¤¾ñT>Bƒ¡«–~¾l™sgÅߪëîUäxõ}¸õ^ôÊÉKÙ¯tqT0ŠvvùT©‰o–9¶§ÂÈY£b5´Ø]µªñn¬}Yó†2H‚I´G_gcÍþï·ÞNºÔÊW‘×àM3.„ŠsðWÊ7ò'¾'RPÞÜe‡å9fI{µ%轪‡Ýe„?!mð|Õ]»}Xy—®l}pã{}܉.q›î.úÔ>ÈØlbN»‡‰5ËjeØ Ø!Y@*)lZ™بœfÅû¿ÙŠºõ6n"ìÔÉ%š÷XžHÛ³—1Þ4P™YÂå u:5k\ä-|˜±—¯á$÷„ '|·éÇf6Uò§¥óòû3„Éë@Ÿ‚¹ÑCXß Êxÿ*å/Åd È1±Bwíú7-ÐǦ×$)fÏ[T÷¿ (–¬. ;d~ƒ>Q’Å4†QêÁ öÛy €ÏnžÏtaåËìðsÚÇ~Œe@Wë¢#ïÑ(}M­Ã 6¦¨Ú}½äÃ4”u©î%ª)|úÁ~ÿ!dzn·LÔ%|§P?0ÔEuìELœÓ[fC`zé¯ÝwZÍÚ¸X#¼ øì€«¢Y/a3±ÈRݽ½ÂÒ‚Ú<] »ýD>eÜÝ ½°äs×»×K}´ºñ÷`í›?™ù!Eˆ :%e(;âÇ‹ƒíÂ+¼{þwö0ðö0î\Þ¼ƒ®¢yñÀÛ$x;ps“÷FéÐô Àékk?À"·ô! ÌyîG[îß"…ˆö`k×àÓ6–4à1î=Á  Ý©áÀ$~ª˜†èöw ìQ­ÙéöÁ;ø0b%ž3¦1 ²ηÊ5Ï ï+cÀ—峇½uf™1é¿ÄgYI(3)ÅqÞ¥¡+þ¤ýù‘,rÀAÏ¡çUªpY«Ù m¹Âèç„áÄÓÚvèU‡·N"a=¶GV‰ÅIµ¹Ê™hD-YoCTY¹g Ö[Db÷sÌZó>¤¥ âÞNZñ—:Št‘é&y¡êÜ%\wgÿØfCž'2º9Øqþ}4ñ–ó-»ñ ¤ƒ¯gneÌÁÊ‚N‹MOcž³"¦gPåSjP–ËŠúqz4ÿGÖ$¯ØÊBBs3éÞ›õZnLlÄR}Ï'–mœÅ¯.Õ.]MWçy3 ³qXiŸÀL¥%2ysqr7‘ßÜ©ûô‰Ö<3½ÓE²›ÃaŒê¢ìdîi13Üjt$E6iXL½.Î<ª‚vè…›C+›² ¿8”{rÞ iÓHpiÖP Øt@ŽÒ }åæ!\{Á|vp<Ç2ú-‘wÛ)<›^ ÝCB·ß- ˆ@Ü^œr1Î〕ysB¬Ùá‚€VØ/oFZA€ñ°v>Ë+êeÕ…‰ü¸Ðõóæ„_ÓƒñÕÔ›ŒÉv H"ë®õ[¹f £kr¶@¯~ƒ>ܺ¡å4Ó-þ…ÓF¹=‘eû!ýÐúHòˆß¼ÛÞÒ£70°õnp¼yzhºH³; ^ª ˆ)íÜ-A@ÈÃá=½Á½Õ)Š=“Ýá|hÚAz«mh±rצ« ËΖ¿Ë0¿{·37||cÖ9’­JŽî½yû³7+Ó®.5=${ŒñŒÛ7à}òóž+Ãi…d1°z©»/ƒèš>ë&¥Ï^¬In_¾.݇$ª÷¬9oV²A•‘ä( ]$ôUô0CUdEÛdrCíâÞ”eò¹;iÖ­dû”7[Ýð–l-c+¥˜ÕµR©ëü¥„JIªåEò PU…±Ã㜨”{k‡b'5\<• KN-çµQqÙéiÎ…ÇKŠÑ»YXÐëÕ¢'2‰@q«u€¸ËÊ&+M8Lÿ(HÖÔ‡$¢¶Žf’ȵñé0Õ®MÏË.µVÊÁûÓƒS<¡2䩇ïv½ó´ãén0<¤NKèráeÖâ’W¢w§ª» µæ¥Q©ÁªàXÕM°WX¥Ö…SßAâXîYžÔ•—Ä“©%…hè1©Ö¦öñio½ËSâ»>g–¿©9Æ ‹Ò“1Õ±:ž™þÔS|2ÿŽDmOfEGVk_CþJ\Ë^æ•“,XÎæªSÙ^û–“G#É󲫅±¼pB¤F`üZ64ÆaNsf3 ²XÎ%ÈÍÞ™½˜JÇoƧR1bm}{ôeœ•6µ›T„³‰k~8rÙy³Ä.o¾VÕ‡ûÊ“¡5ßîg2„½¹¶ ;õqqßxPuY|W;r¥gçÄ…p"±òDßžšİÐ΂koÎSÖÕål<³;Ú&;=îFÆ-§e!ÆËÁ#ÛÞmð"-¬Šç ÁqfaMÆë…>)ë:͸¨N<Ôx®19míu¶1–õÈ«åD*¿–Òç8©-IÞ=½8:*'“%Ü»†ÏŸ,—&N¶«OêÌ„;³2°É»[Øx} •Ïöz`þ±œb[¸À«0û¼b7~vǹöR£</©;*T¨ünɸ&)sJ‚Þ@xÁ(/IF}ÛiÙ… ’´¯‡`ºq3‚5/½Nu•Ú`goή²Ñ)·4ú°¬ïôóEu<@yotÏË7˜²x+Óu!21ïKGŽ^ŸÞMV{ÙÛ›o·rXmT#Ïxò×õO_›Tù{.(6wÒÆ‡&’Í,{¨ Ý<¶(¸¸4ë8ð³«ëh°ÝÜîÅà‰4dWc¡2&”ŽX¾xRI¶¹q!k"÷D:äÛ'u(j1Ÿ7qíS$3—~âq.úšß¦¼ã¡.RZJZGÔ?_Õ¢qðÞÊ"VŽ%ëKúuhOsb!f¼”çSØ–~>æ³sZö‹“ñ©A¡¢@—seaW!,¬"Õ|ög3‡nÅ·ŽÎ‰<¾ŠŸøæÅ‹Èoc÷Í,5Ê|€­Øó³¾ †S O«±Ww´Ã2KÐ:U»lœ4]«¾™äZË¥ Ü}¦â\Ã’s¢á` á\Ë!åš¾¼wÍY?–Gn¾Í0DÏ‹Ê.CŽkž]Zmy<͉ù{•F!NG¯MB*5 ¹;—á/ ò´™Š¿ó‹­­iN tíÄ,a~¬‹†ÇðŒ %ÍÑŠ(Àæ|SÙa.¥!ëvzÔ­µ*‹Ç3µ±op‰c^mRÎ%Ýéöë|<ÛMFœÃ{2½É­4<Ï8¹«ÈÍ_cLYÉ)u× }À$˜ÙPܼH—SÑ(kU• å¢8`‰t°7¶¸Ö1‰C~KàúÝ8ãôaCå3§Vš€ Û1†úòt)=XCͦ$`+„ì¢9ñ”çäÕ;3ƒœcî›Áóç%€Iy\8ퟸ[Ì+7æPê¤(¾ÜÙ–ûR`½»\¶|ÅñцBÒ£ñ Ä€ÜyI;®&Ó}ª 9l»²[°Ú:ŸÇcŸ_ö šª‘Él Ûî­Tƒ>{å)‹¯6>üqæl±Òž"mBø±·ûQ"ÿ"gCOÈÌ¡®À‡û»ÞX€Ä{‚B»x‹ïU &Üz_ 9Ÿ Õfj vwôΧ±€ NgOƒˆ ÑÁV#¾¶á|j»l=ôŽ`Ö2\3Âuûй’€y?6ÞžZør½ƒm)Þ%ñà“êÍ=­7Ž 1t—¾Ä÷UðGþO–1TÚjEd.ý¥üÙ‘ãó./¶HÍÔ­-`›sî+[na‘9‘•ÊÒÈŠ½†K>Ù{þ9<žu^ùèϑܔE?ÈD¼Ö[à”úÇgç!{B±ÖÐí3²ZáÊ ™'­!ÏãŽE‘£3¥ª¥g)Q> 9$ˆ™Ä¹ôñÈÛž¾q<Öù-Ñ_'Õ§‘µÂd" «¼R°¾Ì†g«ß.î#€eÕü ê­AWH´‡A!_G§gÄ»W?eÖä¾’ú•s®´ÊZ™ „›œW]e<ÎoÜî@dÎÈÂj‹\±’°Rè¶fb5„ºÕ%“  ?ï>5Ëo;ÞÖ;„ŠmË{Ë1±Ãƒ ’G}Ðf¯›MÆ«uÐ'F{µÉ¸E^h°©E¿ÞÓÏägÏZ]ž6¹èX0QxâH‰»ŒÙyÔ‹ðuMW3òàÞà~üΈÜ)™Pr ›ýãÍn4VJ¦9ÁÊUØÛ[B–Ç_L:íßónsÂúíäÝ*1¼®CívέÒR ‹N ‘wkoª9¤>8% ±£4°-£5#c,‰$»WïÍ äzÓ¤ºFìÉîXÑàxœc}€®áCƦ˜$JKýÒå®ÂÙÆhã>Ša¿Ùü´.˜ë¤ŒHÁÇȲËY'Ñ›^Zú9¯Ì &RMo4Õ&žÈÚ¤oe5`]0ï|𥷠tᨠƒ™ù¥ÀH|ÒzHÎkNó !B|]L°õïjM–<¹ÜÆk <§ÙÐÞ2Ù~;袕ŽMõ£ªÜX—üµ0#cµ=Xo/ArÃ&½ìwa» míʵqíéãÓµû7_Â\å’|¿«©¤Ëó¥ƒñN€/'>ßc‡)çl_p5L-ÛÜkß&aEðÞ±m’ ÍÎ{¾—¤¡´¿£”.¹ë´b[dä};Üdé~óKèrqJmÒ>:?tÙrwÜ5jê6§‰ñ™ªBàIãR] .²ËëV†È;üºî^EÍhÃH‚.ò^·€¬ò,¹ÁÁLpOOÖUØ{Í´°ÏÒLðíÇmÄÉÌ[gÕBàÒ-|~s‹=jøŽ\º #< 8a„ŸœAð¦(~hÕ"{ é®ÈsAø&ó ôÚS‰¢ƒ†”e²:ôÔ¬±“™Lg‰w)µ¹}våâÍ\ê7Ÿr5»™%°ì]GV÷™ú|©9Zé@Ìcò|Øÿ£ˆøÖ¶µ1çÚ\Îв™ê]ï5碄µsWê)™“Œ¾\—Ó>±1<– în×ÄC|ŸæähÇÄèÑ(bjÄfU±kÝùz‚îËG\ŠEKî­f±Iî¢JÓ‚VºW™õ7äÕ1çnöëØ?:Úét÷’—ÓŽ·Î5˜Ç-Ç&ËÂñHÅÏù!åènMý4Šù»ÞfÇKgÌÈN)겄\°¯ÇÛ6°Ã³:íæ½Š®n`z¸öè\£ê >ràÂ[#½wïΣ CŠ€ò°3Úrs›Ëz|»'Ñrb}/='–L>Z5HTÑ V+8,MÛùÌ}’¨©`t Nšöë*êØŽ”Qô釗IëtZ>у½/$ÊA2Óó|N¿˜ŸL ”ÿ‚Bðž× ¤[óé§—É]Y54 wÕ·íîšW‘ …2§<‘lûxû°3èq™· À(|0¥à+u2–n¶´Jýõ4ÈÝîS°«+çnÍ™47ÞŠŒAnŠwÔy›cB”Þ_äÈÑæ<…)„gÉš?Ír'A6}%潺ڵSGÜKë»nÛæU2™;Är(ÀMáŠJÿ½FÙ= Ab¤Æ¢79~Ïi;_ë ¥ w±YÂ%åh¶ð¸—<ÉŒœ¬ž‚}-_ÊߘYºd¬iIHG¹“G$*|&‡T¹åèÁ1yö‹½:!¯>»3¥A-%—KQȲŽCQÈ„n\ɰÐ@覴N^ áÞÓÌÊž"m“³[aÙä(Á\…E?"F~˜_Æéú¼ì¥Ð`Ð 6Ω†zÇ+W¤êì)5 DYµ °kš&Õ mXI†aDt°Ñi˜Ú˜wkí%²"ËBé ¢þáŽã–£ÅÍ'UQ‚gÁŠ{oªb•N•4KW^wºaií6¨Z,ÔMíËŸ®öf;7WO ¸*‹9Ÿ._½ÝífÙt-nWûil«"äsWOçÕîÂÝŒß Ï!ëVEÓæd÷¾T¤g™Þé5QtY¼ã‰ëò¨HWUŽ©t¨¬„• ´Äâ¶iëø–—•kGï ¶Ê=— =©I¢jS!ÆÈ€Ï0LÇê>Çý¼ÎCÈ2®Ä ŠãÌíä€'©¥Â^Í5¿x±nÕÖ;óæœ.ª¥6ÞÈ‹Šøß¸{{™·*š2'üÉ0'ÎèßýÜUÇz ¾ðsh væ“v„9]uEêÎhYÐØ×ཤ­•ðg5S§i½“èL‹u~ÚkáÅ54KØãfèÀN½@åÓúqê’jf9r/M.íîœÆí̉¿Y_MîÒr•áÛ)/…66Ayc¤KÙÌn «÷ŽRv¤»3W™ô0FÃG¤¥4ãknI˜%F 'ïUXöÁìÁãÅwŠå¬Ë„è‘;R° Á’\&«c‚ÙºD\øZc¢ªO!vr“Æy‹r‹eâ-µ©]ºo§_È¡v=uo¯Á·ãhô9.ßì8”uÄ~ý€ÿ´àòUÃqߘt›ö¢*|ÏpS£žê™¶ ¶Ü^o³ãy0³á¼n±dLjm mî6×À…¥4ä] …}‹ò‘=g!hraNq¸£¾Dw³Í|ÑB²…çßÎ&Qçqó¶Óà8B”ž„8΃ÉO°³—Žè@–ÛN'úwœ‡îìù›—c°CªTÌ_|¡’®Èí‹xò–Ú“—V{xV½ý@zñ<ñäÌ-R­·m¹nê%I€ÝÒó!‘ð³ (®bJhçÑÜ4¶Èà¢q϶ã´ÿެ8 ô6ž÷I”ž3ÿ¢²ÜïðeÊ&ã·3ëaª^Ý)n”ÏcO+‹ [/Sx –H–ùý½˜¤IX¤ß2Û“Bî2œíÀ¥Y#¹¡ë±ù]¼S ŠaNUˆpô­”Ô®‹Ê$y˜Êš•ô ©Ë:vf#c,,rH+s¥MQ`ï†üÒ$ºЃJ¶æÌR+Š/Å€¡†ycÕt!²s7–ÀÓù.”¢óm_¿À9ûµ¾J¼»—²¯CýÌM)P7ò‰üìûl'¯åVoòͱäqdýT¢Á×u›g²ãiëFªõfÐ9¼«Àyºû)7®†Mn NÈ<¡éQ<Ò¬ðÍåÇ„yZž÷™n'tÈ÷ÅêsÜ}@ÁÓóý'6lH¤¾âü0¿º&Àë#yÐMAL ›»Í c$°yñFZ:¯ïèï•oVêŒd‘¨V™} 9~â`_Þ~BzÙtAv4ó&,•c„OWì¤Ý±ä‡ð ¯l¤–Ó¬W‘sb‘eƒ›je=7<ËjùLˆ&niÃKÇ’k»AZ9¶ìY¸%^Ô°oË)R¤Æ6ƒ˜Ïâ;©.H@õ*IæFÑk9ân‰ØŒ<È1í½prÌ_2¯…¤|fÝìy#`+È¥¹\Øüiæs­$ˆd•Õdk¾[» ¶G“F½s†¼K&¡à‰;W/Lõ×"Næ‘¡³=Z¤Û¿ód-zäÓ%lì9ä‘þwb Õ‹ôåëphRZŠ£ºç…]!/ÐcgØie×9/ªÜ⼪!™pÊ\¹i¡òâ¼v ášò5‰I© |,YîŽÎ‰Rf׺FOÍä¬5\&ã¿öÞ×õ\ EoNJoð*F¼Ö!ZKyŽS°X°ta¾o9ù f×.àv%—æµ\ãÜ70 ýÙ&“ôvÃMùZQb¦Ú¶æ Äãù|dxca;¨Ë¿¯“ñÂzº¯HzDkª'xÓ¹ya{Ã?WPâih³W¡6ë¨mh¢Þ jÞè±ä•hÜý6w­ uÜG rÆz`þŽ=oÄ{Í `“,<#óÕÂw5¢Ø/ë6øo¹[h+—ó¿ð€ßtVõð®|¼M–á:é4¯xåúžñãf, œ$ >wfQOeUQÏt]wMxZ}|{m6`hY w‹Ó«[³èûu…ã§×sa‡dcÑ–ÅöZ×I³êyö0†± N"Y_¾_›aqs¸P¡kœ>vKN]s‹\ÖÂßâ„u¥j†W®,ÇÛsARÖ¦ãÎR'µRú8•< KØ9æsEê:³9 4q'°a—1¿Ú/:×^Î$º ½;/ÖT~›èbì‚ü[cQš–ݼ!ò಄9Ì ÷!D$ñ]MNÌDœ0ÙWœvÙYE(áõ É-bÆ?c¤ χ÷G2\TýOuØ>â¿Ú=<ž‘—Õ‘u¬¥@œûê <¥H>ÒÂ¥mt ½.Ö½j/´²Öª‰:vÊ+w+ú¯Ø\×­oЫÕÇáÈÍÂKºiíµ*S|{OjÓ„Åò’Ý#¹ºÍ¢¢„›Ù,o†<ÿÉœk<ÔÊ·@!9ÚSݧa°®Óq$ìáÕÃf`à…G3µŽ&_ÊڽϭmçsïÎ×/x9¹ùf^…¿>#À5÷Ã+¿ØNä¼2ÅðÅE~pj¾úJÖ}þ2Š^€:¯Ï–çû©fÝ‚ –ïR×[ž*ËÜÀÍn­5šŠmëÛÜÿ𝿣Ü6ö­ßww¥ßØÃÓ!'cº’¸KßäÏW³øj¯ê¡ØaÊóõK^}–ÁWâôVò¼ºî¢W]’ˆF,t[ŸŒdñ'ÿØzn­]oõˆG¬LÅÍå%ê­l6Mßyp9žÁVEV²,è%ôq›–O…œ™à>´ÈÆï ùÑN!Ï©¾©lQ,Ðé *ÞéCíò!¬< ž=9ü=ϧÎ Wœ¾&†\XÍHñwŸ‚²‘¯CÄ5Ÿ{&ñÌÁƾA»V âñˆ ÉÝzŠ å»UñCvøÓ\«ê¢=œ)%—lÖ=aü½ú¬ØYú®S£7xûn=‘î’GZì Wòɽ){dW7 ðČۗe=¨Žo"-<ä*Ñ’µ4ZòŽª¶@ƒƒ]bñ•a<úš~ˆ`kNø-=˜|`÷ÑD"poÇ7¶gèE¯ïÍžÙá-Ð[.Dã·š¨»OårÂq€ô5CSTõº©zIl8!_²Öñö0̪ –“î;X´âÒƒQnªáü€…uŸó. În†„}Ø‹ù\ÀŸ§ŸÞÿçT‚GÁ°”ÄäØäÂp‹JÏZÖñû¦;p%‘€ºg¬FÅLdzaõ¹ÃN]á VÖq“ó}›cVó{̰›!Nc¸Ï&nAÛÛž*é̉³¬.µžU¨½uI?—Ì»¸?W [F}QŒ7rÒœ§ÚWw&°ê©ª ë3ùàkÂî™|šKBtóy€ö§³œÛv4K6šC!KO.†VæÏwKµp.v‡n™°À™Eb»*|”cä¾ßK‚3_á\9±{>ÙÜÎîï23|.þvn{´u’)_Qz&?·‘и­}ŸES{b[‚³ž©!,„c7ÆB’Ъ}ÞXÖȘ®ùäB,§€©j2õnéñGuÔÏ"¾j6/fß®\‹¸Ún¸ù°¯ù]¥¶úŽŠ×-_-J‘m/-ÎýZu1r1ÿVÑvß¶ÿ‹Ÿ½[ÜV!Ÿ´åË’ÎR S‚‰œk¡‰…ëØÂ[%wÏÃ7¾Ê2 Îý³¦?¸® qëi‡BÖ¶×c®ß ËÔašÒaî1ÃIû4P?xˆ!Á×b[mµ¾;òvzÕëkµWìd¤qÿØ­:èƒ1ÄEæTPC1¹«ÝÛÿ®òÌr*¹a‘ÞÍá }Ì·FÆ­³‚Ê}·‹-Àaq\Ó¯I»ô£±¹â‰‡Uîù#J ¡Q1p¦†Ð¤÷<“'šž… óLç‚*‰N?Ö÷Ò&péÐË›;zxŸ¶Ì¶@+_¶ím½F¿´¤ _žf€ÝRR^[{4þe{ä[¬à <v*3JÝѼ¡!¢@‡Î)0…ï€GK@º(ò¤5Â5Mhæc "ÆËˆKÀðKçîŽ'ŸŒÕVb£ãÁîÛÁî‹ApŠŸÀU¿ fi=·ÞMrþCNii­ôRŸ–ô7Nq6ÃÌä;=™æáu'¾¦¾Ê­rBC‚+=ã«…ûËûOÖ¿ã ePòŠrî²Z‰ô? ù°»Íß¹÷eA¨3 &ò@¢æhis˜ë¹ª¥j¾dÔ³ôìMÆFûè®GϘA‰7Ã\ŒòÆå%-ÖÙWRš¶÷<äËm>¾‰¨„ž±ÖÚu4Þ‡Ru‹Û"9¬¤8…5í"¬.ºÜ‡{O/=¹äU+(š²æñ>ôŠÒ­=¬áx&¬Rþ@¸½ÕS…ÖŠÀÙußÄ;†¦üâ¿@lì5d“ÁvÌ«³/ðµ™ ¨&I¹î7uh4|s¯† îk±±|¶ü(HÛv™ŽA<ù7ò:ƒ¿Ý¯ÍþÆB¶´3ÜX_ä2`¹óóûÝð¨`ÜunÆT§3xiÍnxŒI¯Û/d›Å Qà ¨ôTõâ¸ìöt¹îà™²ÖähX*æb§%Ÿr´1÷aál®úyÇuG´U/“ªŒ}ÎJ«ÑV'ëŒÊ÷’Þ¼×z®¯ïªQóÛÅBÒš‚×JmŽPŠ>(óo߇¸Õ¥˜+l7Û.VÖlvV¼®þ7¬8—ïsVK^ zu9œ9¬ã6^¹‚e„ú-À±[¹,žÄåü¥³è K%w~Q8ÕsÓ wzëÄý·ö~—敟Wé )2—u°¦ÓÆŸU\ÐÂßy„½s¾Øy_ÜSbÞKëw¸mÉæ­(‰&q¹ÎªdÔ6'2˜Îþ”]Ïí aV{®oˆÝü³g”a—&¤=6tûvÑÈ™.M!„(ö¥DºÝJ`ã³PÈÍŸ©§ËÎÂ.°È É oTÌ9|RÙFþã<ü‹xeÅi×Vï íàe¨öšÉ¯uÝC9¥•ù“#À%"ú¨Sß_Rùö««&¤/Nôç-:Dý÷äø«M%wƒv½BŸÌáº[‘¸¶g€®Mû‘½cÖ%ùå‰ãF=%ïn,ÈÒìæýÏ`s*¥œßPÜðC½öEƒ»><÷A,“@Ï‹ŽãÙ”ì‚ÒkM¿ÏÜš{wósgžõlzœÛü{yaBM¯BÕf»Èd³W©Âz±FÆïP£_Ðy7Ë£‚AÒ.䩿vñÐwÃÞšÚõÅÚtõ%çõ¾œj“‘—od.äd5#æÛ}ªÅ2w¢à¸CIH»¿J•  Çlõتúnæùs0íÈÑ1¥uøâu–\§ÝýM»ÆóRü‹•Ú…^„bP­Ž,û¹ .ÙOÿí9P/íØ¿W"zÈÖ¥fá£i= ñ|ÈȧíQ¶9ók”d0~¤†GjÏwoT—¥JÈKžžÝØõÑ@{ŽDúÆ¢Â*Ä›~Z€~ z[=»v&°€9¶œ\©–òè§Õ`¨ºu+þäw_¶æìÉö&&é²±.¼Rp”âpfêrä«o¡Ï¿ÈòCi†¼t*p§‹CÏ“Ÿ ú ÌM3ó [¾Çaòdäuz}g:vèd…Á‡‰%ý½Ûî«{§nõÍn–^ÆFï*BHR⠶ߣ¾“±‹Ã­J®ÊÍ• #çžÚ™5N#*ðegÔ2«>n¿Ö:#L‘w¾)ÞÇ ï59°zNV5Ó)9–¾Œ÷`á§”ºŠ•–×¾æ„ÏôžWÐÇ94ð¾šõ,ÊË^6¾$hqà…ø=ö°béª<¬´k(x ·NÙ€»pÍ1üd6ÛKêp¿ÚýÜÜK1ù£lËé³—¼È9 ¥ïo³Û"Ï©å§oæ¦ñÂÙ4r·bòæ¶íå|— «ll¬ïõѱê[¥#ïìõ¹Ÿë˜ôæövë9ÙÔ—fKþœÊ®¦Ö8„ïnêi®W=ž†ódPay@Ñ`$ðGªKêŦë'ö¯úæëª¹ŽGY^hrx(ÃÀŸ'ë>ʵ˜tt¶¾ˆi»ú« åÓzP¬Ã×E}‰¹Äu»_•ö°·†›Ö?²+÷y§.štq µðAi«йßKæ,Tm<78do©>/gúœÎ%"lu,4;ußs6ç=Ï‹œ4 zJ£öñÜóJïÖj«å×ãæMV¤ÓÀ*ôn«™¢v £¬Ö µÎírcîŒúD1‰=®Ö˜œ–¦¯Rg¤pÄËZsYY°ŠÕÒ“µ­MtY6»+8}Wb¤691Â1æ»b–Ëä%ô®'q²…JHÛJ±þê¦ÕRR>¥cÁ Œò»¡ S‹‚/£;%…É ÎǺ8¡ódŸ¯š;qÂ5û±&­SZ,-Í×µIÝûцWz'*góhùC¦{ vw[¬V§òd˜á)1ù™KS––pKähÜoTºŽÇn;“ ˜©\†xðÆŠL&íU.a› ( ú6hÞrõaªnO-x²ÔM©JáõqA.³öT&ÔÒãCw«hí©J¬ °Ö áçKÂãWâ~Ê4è!Ä\#…Î~«û§ÁÑ<º¿Û‹‚}y¾c¿X8ýù~äëhÄ ìì›0ƒ'Ö‹‹’sÄæóMd,ÄóÙ>c˜5ÿìtù•%p„Ýv6 Íï[aá£KsG@¡ZüÌaƒæIZ;ßž¿"èÝUøoCþé­š¨]$z5q=Üíån¸úî#Å ” · Ìœõ²ÚzRþ +&~¿hÝ€·/Ìx~·xê2¼«Šš¨›ÜŽvhŒŠÏÔ]Sì c†Gÿ|ÃàE„1 ’ßRMÏ*츂1à› 3½Üߘ!j¼wï2ÔÆäykîÁøÞµXsW:”X²+uiÄÈk‡]ËÊX›5ÿDTw KSД½°L²PíÖÌðp++o6€—ÄðìõFàj•r#C½WкV©¨uj{xïYb™ót“ɶ•ØPõ‡* ÂUÇü>,±£ÁÃÒÜîB¡Ÿ÷£N°¥v¯rYë'è6BÇ•v%›ÕZrÍRp×ß-—`¸^â̹î`@½ÒpŽ-‡ª¢„¤Ý\›³X‡z{²O Çúã— ¿šØœK·Ä‡¹x=ÿ÷““.Dl\·–¾<ÅBþ$%&.|úÚçðª¿Êÿhùûóß ÿ'óÿ€¸@Ü<< ÎËü?<åÿùSÊßëßèþ¹þÒÿŸQþ]ÿÿßø>ªü×ôÏ…Ò?ˆý/ýÿåoõoÀÆö¿Åÿ¹98þÒÿŸQþ^ÿìÿ{ôÏù—þÿŒò÷úçøß£ÿ¿â¿?¥ü½þ9ÿ÷èÿ¯øïO)¯ÐÿpþWnNNNžŸúÿ+þûSÊ?êÿR¥é˜ZšþŸæ€ýãóßÙÙ8éÿ2ÿ+7*ÿ+Ç_ù_þ”ò_þ×K»D™å_)`ÿJû¿$ìÛä˜ö’ËÌeÖ€ ²Ç¡pPèÚëþç)yX ¸¹~Ÿ¯EŒâä÷Ikú?Ê‹Ê~geüŸ'„@ô­ì-þ%H+ÀR þ%Pc S½ PQWÒÚôÿjÊ~ûT…ձй×XÓ¬¤`C&£NDäõÉlÓÔA àˆhó¥9kó3rQ&€åyÂÎdŠ+~b9‘Õ“rs²[wEëSsç'’ò•¯ßŠ–ÖZ&eåÕcSÄ‘‚eoÕÜo™kÉ·ž÷س®E°\ɾB‡Fb™ºyåH£zG>¢°¹'³#?wöDðírÝ|Î7¹Y¿Ð˜àÛæµXDÒ¦ÌDºØYWèìçX¬ êÓEÖ¯ä-ÝS1³ÃꙞZ˜PSη‘"öЦQB[ÁZ&~Uz)$X-ñmxUKˆp.Õ…ëVöЪ3&Û‰”;$ £õëp×¢{>ZŽw·}À]tÏÆ”XÊüœC›û_|鞣Œ@5t¥3fé8¢ÎO#Ñ“&·2^hM÷†Æ(=ˆ”²ì-Ñœ1é!ù„¶fmUæ,XIH v®Ty?6fú‰‹\ëµå@"b»¸:2T%{YÜ×ͽÖá —ƒéÎEŒmòý‰ÓÏ<»Hóõ'åF\ùBÏHv_÷˜©œŽ•ÁË”‰n4“’¡ì믿0ûß]þ~þçùŸÜÿs¸Al<¿Þÿ°ýµÿÿ3Ê?êÿwQŸ’©¥¡­’‰­¡®ê»Ñ¿þÕ7ÿâþÿ—þ9®°q€8þŠÿÿœ¢ËÉcÄÃ¥g¨ÇÉnÈeÄ®¯kÀÃÇÆ¡ÇÆn¤ÇÅaÄ¡ÿ?Íß_åÿÛòæÿÿÚ›ÿÌÿ9¸ÿaþçqÛ€¿üÿO(ÿlÿúY…áï-Ab¯è¤kýÛΟ‹DÉÎbb¶k¿õÔc5àý¾§ª®½¾‰ÄøgWÔ¯ @l” v6&>n¶ßú‚ûãýÙWÿ§½ýgç¡Þ2p³£~tò×k†ÿæòäÿÿâ›?ö`ÓÏÁóë?'ˆç/ÿÿ3Êï÷ÿWÓ®\AC^îÿ­óF4 ó¿ïÿ<°ÎÎÎPUUöÿ"""333 )))ÿö. EŸ±æÊß¿ ø™êÍùãfRídk¼¯tãx€dCµú™„N]ÛðJL ÿ¸ð®mœIJxm´àXÇ›t³œ\ôw×0¼ŸÅÓ òƒÚe•Âs?(ó‡ÿÛ*„R’´"±oLŽZ¬r;åA›Ú§½j»„sîà€G±ò)ÉÛ¦ ˜KUm8äã‹í²…>¶e"Úja…3ìÝAݾ˜óN/GЫë#(O-ÒFÐç¾ü5Âç´7û Ð_UxAáÂ}§AêZÚ'au󆛫4žW:ÛA³/¶³Ößîã‹\1¼~ÆOÈèsHñ†ãµ'½Áo€7ï'a©=šBâ»ÁO<À˜Ì/Ä ÑP=iÙÄQ²-ÿ°y¼¬ÀøKÎ6'Ã致`€¼…éQÛËo€”$)˜Oxº¤0÷R²Þ§©x¤mŸ)Tb»\?iisóÑ =VàÓ= -èº(ÅÜÞ1åÉ%{gµ4”iñ4Ÿ¾«Ï=Sy€ŒÇ¼…}–Crx¤Dï$ˆ¬izO yÐÚðÝ\£ÉYUŠvbÂÝú(c%‘–²Ó„k€8ÿ@¡D)(mˆºúP@OR¨ë|óyÐE‰0blþ™^ºbYŽöædÛž!ƒ³45µÂø½·=êTT„”ÁM°âþû%·ÁqXù¥͉È,näÔˆ`ÎТá O•k³ XÛ¶8ÇT®HLé7òt<ÖajÓ&t5zk@ŽDOs„BZ•Lù}0ûß4Zû\UÁ(QZàsÙ¥)i®ø˜*rQî—ûÚb áÎf¥0íÒàÙDª„µSaj€æ¨ƒHi€[4ÊÄxƒÍù©kÚˆI#á a±Wnãò.á[”-p)”ŒœÊЧ©SX~3óˆ²(¦ÎV(7 Ê;ý<*Ñ¡²Nó›§ÒÕøÀšfž-ßq,Ù5¥í솗«€® ¦®I~À×%$¡J 8åúp,‡ñIüiZñê¬÷wbSþ}sÚÛºÖV¯gp‚ˆ-•ùžJèiÐ0 x†ÒÞ° MJýƒ?wÏ» ‚i$\Áƒº0¼ÿ_SÜ“•÷sÚ[JÙ†]ÆÃ’,øü “Ħ•è#Ãîèò•p ~^“äÀO· ê§š• öסé-ëíöÖ¡¤>LqivÛe ¼wku¹¦BXPœðð»;x©22Ýþ9¸¯ç°ÁëÛÇèú±5š>*«^tŠ3£ñÆànbz4|#LßEóèèà`)ó…øÛà£/+ *Çê†ècÍâF¡‚‘o{àä¨çêRñdå”ÀõttýX÷‚’&Þâ=@y;˜Á}ž¡Þ¡0ÞØ¿aQÏ—G\ÒÓ›‘#v/àÀã¸|¦$xe0ÚÎ)„Â%%}'žkWF%Íù—×§KëK·á8¸íŸz¯Ñ+•8BãÖÌÛØ]È–à="[G¯Mö<‰B¾¶òÁûÆÁ€­ó€äÞyxÖ\6 X|#Ñ€2ÍSkÞ)Ÿ³Â3F7·+Œ/Ð#’ ܸ¾šâßq‡¶dØÏìË X“"^ßrgɘI%ƒ=‚6pÛ–LL˜jÖ‡«¬e¨Ó|©Ö¢z…zjÒðô*¤žÙèbZpU×rÍ‹¡5g~‹» ÆçÄää:”}IPŒ<»¤ç º×ÐÚ %—FûÛ¨Ÿkè÷Øî#qI/ÜHK4På𢮺!ÏÖ!–1÷Ïû=ò6ä•¡wEòkêÊQ•%u!¸IdcV|ïýƒÀ#Ia\ÇÓŠ'àO‘ÖŒ-Z„¸ò\ ¯?^³q ¬½Ní´Ð|T #SGS4f­Öm ã²{…Xo©b:‘|ÀÌ)!8ÎCC'êç²@$³‹§ðEÈXz™R´Œ_pàÌGŠœº¶pH%2ÿ þ¨ƒg#-šBIÏ\@ÿ8h¶Pàuo”<¸•e,zç7ÇYu“ÿtK×mi~Æß„XŠ…ZË𦃓ÿ‘qÖ»¬ˆjbìï¬É¢®mà!I<—“›¯Úæ  ¿à÷Ú%b4'À¸ÜOV&†A à¦s7P(-!¾ýš6KPƒ.™ð…û³°‚(…Vw ±,uªô`œ 10ù]õ(³È*¨Ê­Ç4\%)dEÞø•¢¥uíY˜ ¢ÿ¾þðýVaЊ1}‚ø½@G)£4eU€'þ:ÀZ=úÏb0i¥èØûaH’©³ºÔ=ê½Ê=·„Ûy>lŽYs¦tjYØibJ1Œ7ô‰“U>xž­ówoÌÒ'“µö’"²\Ñœbu ·åwˆúá‚¥Ù( „$].ãMw¥RzYQMÏ@C\!¯sï œµ±X‹ b'’$«J)ÿ¤ÞÏFïkKƒ½Æ3師JÜûÊYi˜*ƒ†ÉÈF"͈a_ÁݲLà%HÁóžÇotâJ6Ù. ˜Ï­÷ d`¤¾ž1FP44×ôIsàe²Ë?"¢þ탄zÌ,K….ÑËêéXøƒ·³ƒnä›ÀèÊ^™še´µ&ú«ø› OTŸ”Ëcμ-8»Ë»<7¼wpGôú¿Wpy1P÷?kü­@‚® ˜ø8™Î}syó˜ÆÑ!$Šr©£äÝ{Ñ4‘>ÿ†ýê[¾d6m­qZÊ4¡EfèÐ$Ðd 0¼—]¡åŽæ²9ƒöfKþ­Ä(pЯiÍçdÅ›oàÁ‡…ˆÛà0á—;XbÆ’$8ðøNIÄQ·xÕ'=EDcw’¨¤È¥DVhx]m­^ÛûӺТE¤‡“ÿ.AøìB{5"?ü¾†)N1˜Á€~Å¥ª’QLá”?NV #zRº.šUƒz_Ž.qvˆÞ©0p¡¥Q(üð᡹”Q].ª=´ãG7²‘è·ÞÓRR{ Á6¿îÛA~6yò-u;|[©‘I›J !úª(‡Ý WOÇáÇü.çÐÄëH€!\Â#l¦{ãø«c^)ø·~è²]ŸBÃ-²ùŸßi+DÍ^.àc¬ùq)QðI;  Aþæñ)ƒÀd®Üý6¹ki΄­Å‘ ’À½µ©@uø—Dÿ-îËj›ôjk()úb˜v}rRùi-õÉzábEƒ£ãäæ;“"úNËZš å'yA¶:6ó(GÀ|–ᛓø3ýŽ‘JÓŠ=–nµÒ9èŸ{¡.%D«4­Öd4OKÈ¡Ï ºIɱåŒ?3ƒÉCU1/ŠÆÞð\µÎ9E‰•íㇲŠ@ÇàÏfàÝYç_ »^:‚ø´97D<ÀÛoqhf «x~^©´õ¬/UY•“nÞ¯p¾qóbŸ¢ZÒ•Ó¥:#nÈøÈì— +‘¹'jucµ·¦…‹šhœ/>Õ ÙH”)OdÙO5ÈeáòaŠSQ{/w÷çàü‚Ý•”Jl˜BŒŒJú7“cçïµ%òšdLøvµ×Ùξ¯:zÚ…¼¸W.¹¶HÅÁ@Š"¥O$ÚüûÚäû|oåC/$‹å÷C…/HzX{|¢PõYq¶¾µ\–žžî‹©5ƒ‹çqN~e;מbàŠp“ðÕX{÷‹m¯š+jA¶Ã^‡Ì»¼îkMá¡:ô WdœvÛå V\gäýúBé£Úß- øéò¹Æ…ËœïL p6løâº“?Ú.0¤Ù.Ф-÷èvFoÌ|yîŽ\mHPåVðr¾ærw+tÊ)Ü#”­ %ŸÛcØ“Ï$vЊP!s)È*{ ™½é—ª2KKxÈßùP(³è åA„•¤ Èßë0‡U݉߷tXÑ%è6mš‚Ž»?²æ¢—ãäá€É]¡õð¨õJÂø þr0ïàiYTÂÃ5°OäÇÀ/¤çûŸ;2jd]ŽfFéYvT-Co¤ãõ¥ÜUÐEñò °)ŒèžÇž3B9ù‡v÷@ßä'eJ36î½ýGþþÐÉ\Wù0vë‹‹ ‹@èº`I˜û‰ „zÀ¬ŒtŠ1 at¼l)Á’±û}¬(‘ɆyLú¯±1Wø}°$ö ÍVâW-ã÷7pΜ^â M§¬R¥=y#Y#HÌS€§PJBy²Wñ˜(â0•ŒÖ•ƒä*õñZÃát«V@þ¹Ë©¼ZÞþMíûè¶|@RiÌRix¦ç9´šQR7êëV4ƒL„®’çd×£_ܺvz;±6ú‰ß:ÖIœãLå›Ù4DÇÓ>·Aöû¾ASè×·á2âi­šà"<™‚T¬ÝD·_“Ë&ßO£ð„¡ÆªmyŠd&ž©<·'\ ¤øV  Oð75@.`ãT‰ã ˜T‰GAšûŸ’MŒìf ¤ä ²ñ@…½õmßR 8mÍôj.ùìôh ¦‡Kеû0—½ƒÓEÑCÛ‚U籞ýåg ’O´Fò}7Öøë†Hë…0ÓäõÒ| è'î1»ÙO‡^ Ì+qQúiBeÉ&‹cŸ1*ü°©hÙ–3}‘´¯1aËR _cDí'š â]Ó ö€¯‹×{ù™ ²j=Ôïáp½Íz úº‹î8¹Ê›yDÑþI|Òš÷טޠó»äD΋‘®zB0Íh ¼a<ôk,ƒ×+@'¼Â 4 í †Â0ȲìG€ÇÈ£­þÁÂL‹´!1±}øøc5á8f°¸q—h?¦˜>G/¨:f eZï°åÓ½øã™V4ÃúÈvð&z…½Ü{‘“ܯÑÏ“F1Y»ziÎuž áR• iì ÞÄk$œƒW²9š øJÊ.2 ‚¶JaЯ1Ü„ãbÓ¯àÇЈà <.& ÅÏŒ¥97Íż¦aK=eÁ—lãTûúu—(yjÊMÍ ‡éæ‘!@bãàˆ¢ˆ‹Só™Hã'ûÛ›v47_ºýF€ =ÉìM W g }ø)6C®ulÿ'´%@œ ¢n÷1šY[”¨I0Ɉ/ž@1öDpØáÍwOFªÐë]’ÈQ²P%iV“£®7 3ÒAÉÓ=YKPqÐi®=¶ƒÍÕì—Ô §ëwMi‡y5iêVIy󼈾¢.I¦éQIë Æ·9ó½õÀ¦*ôñª¨×‹k`ÝЖ §ÄXt1Væ™1$À׉±¸pLiÏäX>QŒH:’¿ì($Uß• £1JdD\OD?Þ8L'"|ËE•TáioÞE”ÜN”L?ñM÷MîÉ‹àUxE“ÚìÄx€&?g]Qw ÚQ¹ò[£.ƒ¸¤¡ûš€oRSáwRõÑ#­¤åýlÛ5> Ö[vÉmÛ­ƒÂöS é©=ül»Rr]3‘Hq#ê5ôTҒžMó;Äî߃^àð™-ãñÛ‰7}æÇ“x@zÌÙσ;¯DÁÉã=ôJŽ<É’güü0j»¯ÿºPSŽ:ê™æÅk-Dè…šQÚ§ˆõ£<ØøJ\iÙE…×Y;¤ÁL¬'}97~ò¦¿g´m~]p–6avÄ *ʈŽzP×›R˜qZÁZX þqáÀ±Ý^hME!˜“ý—¯:p#y­í1iY«X×Q?®k»”äõ¾Þãf"fŠÁÁ®å·‹GcÞÂM)Çî”iÌÌ«…C¦»˜DÌÍhSçíûÅ`„³F±.¥0rÛ—« :d‚!Æ—è[îí¿wÃ?Á­6~rgû½Û=°FàíÇË÷áobý“HÖÿ˜.cÔ¡p ³±%ಖÇ[‹ºFÎ/Ц =‘¤À8·™± ‰Œ <¼Nå{¤ÃùZ;¤2jNOðõУEÁn>ã‹&¢`c…>õÜ@y¼A‰ L°ÈÚd¤¸!Þ@2eFxEÒÀ%Òw Ë÷š‚mUËOøZ…HÒ,5ï $¿¨ÚlõàY-‚x*1;ë:8#Ü*rÁL aéÊ»§Ç¥)3A€·#DˆnÅùsI‚*ÄÎk=:‘¤è· š&¬·¼_ÀèjÖ0’2ü¼ç¬÷GïCD8¢šx‘(‚“ÌâZ&F­£œAv–Št9%íJoî7+Nø R5®CaÒƒeÙÐæQvšsá9d*â(èMµ`},F1~Õ]‚:¢ˆ‘˜Ã1ÜðF tóÉ,2ÐÆ£%hJ0MYìÅ»(ÅóôH Ñë’ämµ/÷ñ\kªR™ L•LrÃêm¯ƒç}5Ü2Whä†ÊòVð{< b]ÆD÷­£»v [´ûsDŠ?TH~|ˆâŠÖ§¶0©Jì<]ÆÅðP©vÏóǽ \\ŽÀwÅ¿­ñ&‰`Ó¢…XÄ;éJÞ´Ëý] ÂÌò†Ñi7t:Íû0þ4®¢åÊ„‡™çåõ…“éÓG ïFKq)ðŸ>–½U«*9ˆŽ¿™IÅø0Ò,MépL›8­aón„£Ââ Ä|2½áî.cžÐ‰¹eƒUQ\Tp~ÝX‚f9"VŠVÕ-j 1ó˜v@žIý!÷­,bo ü¨€^ÚØMʘwHQÖé»6¾éxuã Qû9./•^ÚÐm•%?hP œÛ°ª}5h œ{Ù\÷å½afq]‘°HÚÓ›/¯‚x×mfk•¬ 9¨Îº\1WÒê| eMû¢Lj==‘I›EÓ4ëýM7oÑ0~2Ë *™$W}rr-ð3U©ÒrÐñ¦‰kã…S“rï[†óðGQòìÏ’»Qoqü·Ì?®LÔ÷SթÉ‹ÑZ6PŠÕëŬ ^õ»5cþQ²”Õ>Ôþ혒ûínP/ ÿ ¤›»¢ÆzùAçâP6ÃÑDB Cób†]OT07A<&îö>Lb¬¹kI¿_2Õ=#æ$í`ÍJ8$øÂün ÿ¦x­XÞ{w%”d±ýiÚêÜê ýØtZ¸¬‰é*_^ä:V¼kƒ×HžŒ‹¹9 ãzàäÞ7äÔ?JrEÜÐVQÒÄIS_s¿â4'ßÃtkF'ò¾Ã(:¬¢¾m ‡Õ­³Ü¯½w¾+n›>Ëw¤ãøR_«â~ÿÁ6Gý}ÉÔkà!´‘×KûžŸÔ5© [»;hx²…ƒfÓÖç?»”øÐRr80I¸7eIÌ4ض*ʲ·=Î&mä[ŠJ/êáÚvuç3ç›@ǯU•ß÷8¼Ž,†0`'JÖ5x Ö ÈÌ_j½ÔÂìË>Ÿ¹0iüyÝQ´,7~W1ç¦!CZ@¯nnDcÿÔ5-XF' ‰ÍÒ6€ÀÒ ¥aý<*S»Í»¢Jfä#àõÏôVæ"î]ÊÏd£¦ëEÓ˜‰2îSÓÙb0§y ¾ TiÌ~~©}Š2¤!øÔ(÷Hµ+ºÉ5mó^%~(æ÷ñ8EI—”SO·MÑŒ¯]WGõá8òöröý΂h¿ùFFò8^ò3^í2íøô°·ËÖL[¦W–ç NîHÓëñ†½ÅŸ:M¼]ín¸1"š%Ÿ*˜–¯ðæFÃi-îr¿‹ÿ3þe‚xþÍÎ÷ƒ/‡ÃÝÔo«÷Мm%Uë²q>½>–¸ª˜sgÀùÉâçe‹¶eϨsÖåö=x?†îŒ,UËúù¶çh¦Q3} €”›QN¼ˆ& `!Lznz—r¢Ä#¬QˆçþbÔëê5“\"ÅïªA£ƒx–¥”t„jyNŸßÊg”Ùc ùÒXð“†lM(ÜË ÿâÂvÐ{Ⱥ©~i–Êð&!߉Iׄ³7ùÓÎ.‹|§þˆÒ=ɹ±Yô՗㿟óïCyOoà¾3ãÛ,¦¤®Á`•Œ}šgfÌ:mœYÌ둱Þz3:¹é’÷E½dFFØÌZ“ãµù}A\‚X‰\ã¢Àv·¢6˜ÿÞ –v9%“fc/ÏÛø÷"y”Ââ«qchjèuø#Út¿T%‡Þ­H˜Â΢ Lx5ֈ剭ù)K^Ì^ÓO,è4pUR×¹®r/¡yU¡W Ü&öªÃeÂI<Ö¦ˆ4Ž#޼Ôm„4@›ð0î9ý 2~Mˆ[Òë‹‚MÏݦ×=[>½š¥Ò„B¤n`ªX›‹æh‘¥­ï:½[e3fIÈ»ý;û©cm> MQ<Ýëç¸gMtèÖ/7ksé‹Ãî9˾îawOÐL=]l ½'õØ{…¿Ê!íyÖ“gç»USô¨ÞÎqæ`¿s}[ßsýa—b³œê„gŠ&º|ÂÃysoΔžšÕíû _HßÑçéˆ.^ŠÃð¸HÖÅvy+‹ñt¬å–Ž–‘û+G5íÚ͸õ@M²•™7”>!*,,’÷ï>6¶ô#»ªRnœ¶-È>1Ío˜²Qµ íÄ?Ã[±±ÂX‹¹O-A¡6Í­yûAéÝX‰·þd°ØVø”áÝËÙÂõñ„ʼn×]^l‹ØN\,œÚe½4KûuµqÔe*¤2^ó™i’Ub.plá9à¨c†»ðqŒï1·Mœ…Ñ߃ÚÚßé—Øƒ³A(Ó£¯uák˜ŽÏ•û¾Oíª’-ÖŠÛ}­¯ÆX°)úÖ& % o©ŸÔôÒè9…ªE€'5±ih§’g銫&˜88l¼¡Ç{¢…ésƒƒ80}ÄAã‹o±Ôzð Bô j~Æ‚ý“H”ŒEJüªb|«¡Ey·­‚Ó6ÁP†«Õ’:OšÜ2ùÝJUNÙ³u–^›óõEÂä4‡ñmݘKò~fBÆ'©4Öä0i¾Éûœ1mžš)U';œñã:ÁCé#»{*ªj/ñɈt±N$uÝ Dd+ˬÅ>P=Q¦ Ó~O*NÂÄ“ZÓ¡G0­Rý#ÝÝ›~ŽZ©–¬»Ï[LFÊ%2îiŒ=ò šŠÉz÷p–)70Ì7ë•Y¡|xVtÂô7¥|KóÖ_ÛEd Û3I'{ÑN£/^D©¸zÜQùªö2ˆtoç5﫹ûì8*jû«øa$YIów3•_²†ë76’¶bMn»‡‡y¯öxˆÑÛäªÓ›ç-Ö!ã/“l3>1¼-´ú òݨˆÃ=ùÁ‰.ôèÓ*É’|¾=5)Ía4Š_ ÙÚ®‡#[t{±X¿åŘM¬-5<\OV6ÚC¡Æ'"ÈòÆó~‰­3|a®ÐêÅŸbiOéüqõNÊ»Þ ªˆ1ê£5ÇéLÉö;ÀXƒ¿\÷Xè¥0Üɾtfº…¯¨o‘,€ ðcìÇøö$ÄbhªOLÒ¯S;]áŒ`tä…>„<~•¹Ã¯J±G+¯nxàìÜó¼ô_<®’¼‰ŒS‘Ú“°9Y:~û¤€Òu`áyþF²™$ÅôW,3ô`zõ»C+®Ok¼¹šN¾€A8–I3Ü\£y(A\î³"ÉZ0äsrcÿWGeÓðŠX•3ã<ž/Ë_¢ÿÍ\¬wxó2 ›ƒ ¿´¶Z¼¦<ت‚ïáÇYÆhúørÀ‚M‘ô?¡Xš>}!õ–ž¾4¬øðÌŒ‚ÖrNêf¶JªPÉð켑itA8›f.ã@ëå=~nj a´ÉP™4|L襤MVÙYíS‹*«'+Ó8¨Æ# ±/gÚlý/”#7uùÙu²ÜTsM–©rªÐ„•zmèÚSí [•éi¦BCµ…ô/}Â,ͨ²K+·b(`Sx}ì »¸IÍã~gÒùQ™‡oá•+Ä·Q¿8=Ö¥ž†¿~-Sô(SL#[¥1¤˜{5ú5v—!¿—Uó˜‡å¦…)n‰«7sî£Û„d mÅ`âá“ö“wj[ÊM_cÕö¯i P¥³ŸÒû’×ûm|÷Ç?¸½æ÷fNMmÖjaå·zÝå ù†¦‘Æóê¯+”õìЮœ»/üJä¶Étë:ÄW{4Ý$XxÉøàËͯ1+Õ¸E8òÅ'Ÿ_¥å|ÃÏ…äî£W”é§ ¼h))Zdÿ|ò< Ÿ ð<#PÍë\K1lŒŠ}ü'*hóªã6QZ¿È· L%™Û;ÒW½‰o[¬â}÷fv!gÐ|ó‘HKŽ•x|ÔØG„Oç'6$™“q-E—›4ôÎsƒ53¶/™² ×+]€>|ר+I“LJ uÈ[ðÑA/¿dqË·"î‡mLù…ŽÁMƒ;·P_ûu×wçN4“µ1_mù(¼k|r4o£îèÃãÒ#Þ­£ë¾Â]Y¤Àù¾rºƒ×®¹wýe¾Bèu‘QÛÁ-þ®:‹ÐýÌÄb„ ¯Â‘Ý$Å`¥[0¯^ª÷$.>TïGrÄ}HLs2Lª‰J¹^†óç~Mfô?xÅ4l6¯“ü¯­0âÚ%`S<vôf„^…øàµ·Y”iAûø „×âAòl×Kˆ$™MîS†‹J ز™Óö°v©‚ Dé{o{ç"XŒxÛs­œ©B¼ÆQ r„òÕ{)ôKnÁ‹7P˜mAƒæ•ï˜4(l¨ÉC;"9Îø”qd˪AsÞMJ[+ü´™â4„XÊÑÃÏœ_˜a0†zIU&žw P>+kH¸ùŠbÕ•·Þ︤™»¸ä` ê@¿ýÍ(¿Qâ«ï'7¶†ßÛõ x½m KcVã÷¸&¢Çu:]ÅZ»Àx˜”’NÓØ9*A<ïAnF¢ž>*1º§zÄ÷ÙÂc€½*[CóôÕœ|§á: ¢P_<Æ-‹ZP¾- yZSZ:ûoA^l2×…îŒ`9™—)<ý®3·ü…–IFf›,9(©›ö 9þZ5f·T´m÷Š B‡æ­ÿÙÐËÀö½I‰²cšƒJ"µá§4¡ ’Œëöð´ºg&³-0Íy€ãs´P?ª¹MÏæ;öåË"ÅÉ,g±5–Ô'©ä½Øƒ’¬êE&ánÃpÀ4妕 •ÉG”éõÓZù¹®„™‡uÆÁKïAÃÙî¸I ·³G¾vÿQ›é-Þ„©As°òéû|HÂ$'B}%(œ8è#Ã?´Åéùs?ºî´^5'næ>õP¿ä£œ&ûdë@èzq<ƒ‹uÍÅeáX>0°ÛWaLø¦<:t©õzOhG&bÏOö:vÚƒI÷J“„u„FŽRŸ×S°ýáìýÎ#*ùvÃÕ¢jfü'ÍA½„ý.>„¹ý” (€±¯ñ£:ìû ðÏ*>=»ÈhxRTXa²|ŸÛx–‚äöz:¹þLºY ÁÈüɸ9KÝÝçöc'Ë"T+è;Ôþ•ܲXìïܺŒ#}´íV ^¥åz®ì¥àry(>•™'1PÇ/ªÞW©ö1kL£÷‘Ç2u÷•!U-µµºù²"áMÂÜ»„Ât;Ø6šÌ+\±Ì¨(ƒžš™*/{=…`ð#þU€úûK|RÌåpŸ!ÑjY°7…\nÀòD W.ùð§1Í ¥ëmÇé³ V]£·nºö>³&íO5ý4S¬C´Ð#½—AbFCZΠt (yçgõ} I*üjéëÙÞ¶¹AqPéÓèÜš¹œOˆFº>Šã áÍ e ê¹K¥`Ml’^öã "s}ÀòAá'§ão• ÅàO¡&…7‚P,2«Q¨-3ßÅ=‹@öÀËcú&{…Rú“[¼¹Óª©iÕAܤw÷…yµ)ž|0è¥I ÁÒ/¢+cÈu}Òp[!N‘Û¿­ÅŠqžl»SŒ(89¥Œ²¦mÆys5!¨6Ù¤«#|gSªÆSë5±‰˜Êà ×¼9‹“4='%ö{­^‹iÊ”+$%q'£Ó²ã䆙¿„ãaÄ\EïËQ}^°ãÛà,­ª“‘k+4ÏßF>Þg ñï½ /Õ臕cǦÔw3êOáŸÖܾåÂûyÕØÂE9ÈãQ àdaŸ‰Úo°í Ú°¨ãN||¾EAY+ù>ù&< »û c Á?\¹Uî‡EÉJ\À+ÁoÖ÷  QwŠ™ä¼xŠÞ™ã„/²uô~àÄWOÝžÐ}x`C@´oF¥¥^(h@âÅL©ÎÙym‡DWYç”æ´£CÚ,"¿»A>†n#–k\sÖ¦ê&îÐp{ÈÏÇ“ðšç°¬ïà5ÇAFæð£¯Ü¡„?AãŽK‹Ê?~éÙIOëha”¸Ä}°-Ì+ã6¦-cobØêávÙê)`1Ä;¥Mà lß™xyL˜0§4\U™mñtðÀç²°œôïLYéÆ?CjÉÕTÜ{ÉŸBÞEeIø!ÌD± ¾×\Gi­˜Š[‰1»3[µ±W—äS'KæÞÖÊ;&Îù·ºæTïï9òI÷kY£* ˜>S8{#NÇÂÿ…¾þ«ÉLázÕ<™}Ü*Š59ŠóÑš5WùÃ&«‹÷íòµWTžýWÓ14ŽÕMŒ›_‹-‚a®LT üŠ\÷[.c†MMz§¦¶è–©•ÉÜÁ–вc~´9XõoÝ›â¿.á"<8%È B–÷kQD@¦Üg«eD÷Nî´q¶U2*S¨‘‘ÞÛõŸ1üÄ(©ñ‚0ÂÅ5šœeo¡ü‡þȸ·§ ׺?6ž”é \«AG"RÕ47ìãÂÊÞžÕ¯sè>¹xì|ÍcÚܨå(ææ¹ÌË5ÖØv“7 ÈõWõo¡”î^€CÒœ†|â7 /¹‰ÌT[Ç–YlÑBAvžÍI ‚ÿÙÕêS®G´»be½ýs…‰#,¨}[¥f> ·@˜c2x)–^ÍåËšÚ îèÔzî+«>§ûø*ƒ^•Œ+4Äg`Þ”–óˆ@Ÿ,c¦NÂŒðO¦7ð{tÉS#%3e  S…wciüÁr|k³2—uìàþy¬6†¾Õä'îÂMÜißwðS‰}jpæ9AÅ…] fDöç•fÛqSûúFnu¢ê2JÔh¬uµvû——×Ç mʃ$b:M´}NÇÄš¿,•œÁé¹>‰é„˜méa7'tIoºiàà;ÑMÜ?¦;ûî”DVÅ@êÏå¤n¸4ðyî䲫Üã5žUŒ"Š>+þ;7‡ísý‚n˜CÆXˆý¹bƒ{½œok£ƒ—y“~0«öô۷௞PÙ¯§é¾²‹l?(² µ²žx2A(£–¦T÷Éäþ¨&ý „Б8ûJòx6æí•gà›«4C¯ÙØÜ½ƒöôë(¤z‘µ~"©˜!OÖ#‚Pv{½hèm©-ù~£|>ñî!Š…o ·ù×?ë;š>õ±rÙpKÄàÿ~`ôìñ³!… abNǼ—·ùŸ+<ÀÉ6u‹è‹yª»:~K]1±fõ¡†¬hÏv^ÿ\†ÝeuðÂÒ€†ãέ®Aû( dáùöI?¦ˆ´ñ–Ÿ^ILæj ÿ€Îšîþ"½ÌD]1Ö¢$%üxY]v ²R¥-Qãeü¢õþ+³/L²·#Ž'=0qcDª‰L@/$ 2Í¢m}TBePÍ^åS³·ö7¿£¦&¤2?‚“€†auǸïO5ž}Ø/*?Ú ½yM\ªJ ~6„?t+MpÖwÚê â#ž°ÌÍ"ö·÷÷æðákM?þÄh‘bÃ#JæÚ”ØðãYlù\ù$Nò|ésJIó§ê†½|‘â ÛŽÖ碫Œ¥•5Ö¯†nÇ$H¼àdÚ¢º/â׬ÍÒ~ˆ•ð”0ƒÁÂÈšS*/{º†pï7íg¦òÄÕWלùš¬­äøøm€}vJH.{1ŒJ¼%ÜÛìxxÅŠH< c}§¹ã—sßî›Ã`?ù19F¬@÷=‰¥q¢ÞLÎÞ·=Ï’ €S{,ôP„mrI,·’C¦FþXY/÷Ú›í}ã·æÆI±¡ I¦Š„OÝ\—ÀŠiqâÈ•€úâ•4 ¼sÜ’£Q#ˆúOsæ”/øÔøhp™§–L {Lob­\_}w{¦6nycL1µëc曳ÆxÚœ7öç/Mû5¼¿¤}<±À=¤Œˆ”è¿Îxû9¾ŸKËçá;ÔÔ‹žåâGdÅOHBàCW ¶ïÕ­|!eÏYâæ*G5÷‡`0ìlà>ñ+Ïu÷~?#iûó^Ûµ©‘•ÇUt ¶ÙãÅÀ¸n^ß“¨Ÿä6yö´4b꿱ôx0Ëëv¯ë˜Dk‹¶¶Â[Zr_’xƒq'Þ÷[ÐN—×ßt@gJÄ}›C´(¢·>íëjâçk2.ׂi)iÂý!ÈúÝà 1¢/2¿8gô.tÈp¡v®©ú„Õ#þEÀ®œþé ¨–Ë—›Db˜5s†ßŒ—ŠMMÉpÈvɘwÀKy%ÿiºÄ){˜ª·m 5J ØTøÜó’ßì°õ­ Q¡fSÊžFºZ¥bÂK„?›üCßJ\P“/©Õ1TŒß’6áÖÛâÒ|ïÕ©X, OŒdõ‘@Ïí'ôó%“6}˺ahÞU8Ò-Üny;=â‚>œÏVÀ]èd)|8¯?éh‰ÃƒJN`¯$y׿:9'é` u¯úÅpå#÷žSª¿® »Š_·ù^0ÓD{Éxû>Žu"L’é_µúK\äƒÖÎu‡.ß.ƒ=à®^ãö¹àpßSõ‡ ËAš)&ª§Íüó>SwÚ\š*2Š€ýëÄÚÅ—­*JžÙcl³4ÍVÏéÃÃíªO¦˜ú_”Lp,n3Sá¶½À%ËêÎuãXª-¾ì¯Ý/^ ¿!ènf_0?Vø=›Fs†ûhüò!Ù”ô,­o»Ô+9ÑðÆëÛÛáű½”” Õ󨵡kX±að:íÜÒ|m›æ^òþ!‡Ñ½Ì—5ôÏd Âoñ7ÞowÑsñ’–‹*: $kíÖ;•ž6 Ú°yÐ8³ Ü/˜ s(µ©•ÏÑ¥Ñ7ŠqÆÍ–¯×~Ôd„»ë1@-¿¶Y=2%!ÞJOªéhÿ^Ô5räú¤ž½´Hâ<ù•¬T§i3 \î¸FOàP8*^ á´›À˜d?½—€-üÃòÔDc5!¤ä ‚Ç(ë»°lÌf\A¾{Iûá€Ü´AT=@&NÂf¢PUPÑÔ6Ú.!`©ÀáÕ}»+b:£v1百ù ŠøÃøv#‡¤$‰…8l‡éwá©(ªéà´ƒ{¤¯ž7G•t䀤¶Mk蛑s®§õÔ7Ût„™œ’åüÑA`‘t^ÉUã÷fŒ•AõTÆ]Jž«*Ù¶ÃWnÂyn“‰l=Z?»=X ·¨¢Gþ`Á"7.½W]Ä×>_±:ZDÑ•}-Á¤ Å;…a7ð„ÁÉzà‰¡’7’;ÕI£ŽíbÂA«¾lüÞê²ÝˆÌ•2Íá7&ÇB\ìà²Þ¾×¨îfû>£Ç24’: ˆÁæç·_¢¨b§•{bäàù7îÐO ' D˜D¬ÝÕ‘\!®ÿhXmV NË;ûØçÿ=&?Æ},¨Õƒf™iDH¦X³ÜžÚî ù4XiG2€lŸÿ>'^±˜·HÚû UÙF\¡Á?l©ïÄÕe;²TÖO­Ìß&“Uöâ¾ÃéÍr°r/Qî/o±<{Ð,ÓöY- uçÍò3A/_ÄHjÝ•åÏ›‹øÏË5Ë ÀàGÉթʇOg¢UÃ^å-æESÞdz¹Îï {§š·^¬Zf5™¦Vî{ɤZp} F,/9óU¡:VZy°’F ‰Fy‚‰¢Û¸‘K" ?hà=_Ówp/=Þ”LsÐÀëI‡Ã˜!!_¢¨õüä«™.òéZ jcÂQÂ÷gqƒ6zÂg‡ æÙ B¶´¸#J±®KSÜn .I83î  €·?uHª»¬7zÇN ÀWw’8<,®5fâ²J°r¤Ï{âžv,¶Ã®_kÆ5ºù½•Gä8>Ý-V€{"@+Ê×týøÐÎ^ôQ–r{]_+àãöVÝöûÓµöi1÷‹AˆBA…¥ØC§×@– ¡a%0Èü Gà·§¯áWÔÔ~ýf_ø íÑíºû©$¨?Gý븠?¹üýßóþŸÿÃÅÎñ×ù¿bùGýÿc¦ S+GC+{ˆ­‹¯É¯Ü(ÿåó€ÿ+çÿp±³_aãà`çùëüß?¥èòqéqr°±Œôyôô¸@|l|†ì†zÜFlœÿûÿãåÿÿÿWÏþÏüŸ Äù÷ó?ç_þÿg”vþ«ÏßfŸú[øu„7/7%''';çßüÇi«(A .&v^.J.^&vŽß:²±°ëýSŠ—¦ˆÄÁÐã äfcgâääý›‹þ£,S”ÜTu;äÔ;wB$º†yÉmV»Gâ4³ ¼$k~™FéMB”ƒOw -"š¶C[cS3`ò9N½óz~§™Ï£ŸwúíÉqºHYÚCQ*Ù?ÁྔäÃÿŲæ ÙÞÅ–T²¾?6vKiô%#²¨ÄÞR®³Ž ‚>ådmz'>¼®¢õÁ5‚?x=Š>!§ÊuoÐOa¾ƒ–ãiŸ݅!Û÷FŠ­Y éƒïh¸Ž¿™½ ´ TìáŸX¤–ÕŠ¯:y88*Ϙ×MwÞ”“š¤Xdºª¼­[ì©ÎÓx’7øLÍ8éL}Ï¡2¡ËÊx`^åäÍÓ¸6ø™7ÿ‰È©µ¡Dê 5Uur•=91ˆñ‹Ú,ÓÑȘЫ–Ežù‚ƒŸiÈbdIî}°… H$LfêP†‚Íý޵LÅ%í‚÷'°DyÈy8˜êްiS˜ªH·ér;•”| O‰.…ˆD½-«úZÙ¢ZqÅ{^>C±ç3Þ>/fðî]ÿ†A¦ØùÛx ƒÓD©=í~NŽý2Ù ·ÈšwvÕ4X>Ÿf“›ÔW¾(ž»·cÛ[2f‡ê×-Ù ÔË&¿D3ø9Ã2?K·„58UH¿¹ÐªÛ JÙÒIz!ïÆ)” B@¾¥éBoNå|çÄý2ý0úÓñÖs:ŸÀ±ˆôž;¤Ég^ù½Ñg£Î÷^·‚XÛãn·³dò©Éu£º-˜ûé£ÉpRæ’…©ÕöÌ&äȯnJ”ß´ 4]>Ø·¢DS[wÝ“NL!o$w¥¯(¤9jÒçCœ#דÓ'‚Á ¸ñ¢ãDчÚnpóQé ˆŠÜåÕvé.g”ƒWO[ˆÈ© a–Æû·ÒŠžõÇwê{/«ž®T—˜ŠÔnƒ¾?\¼öÆnž Ç#öÁã›gˆˆ›4!“Ä×SéGq#õ÷½?пQ·Ëzб:°áÕMûˆÀ€:æÁP7}¥„û½A&<j•§{î±[žbní%é]Nú@¯Púí×è.H²OeD™¹qëÚ”+ª>ýLÁeëŽàUBÙqt™—.x ®Ã"G†bòÐûêÛ2{b߯eÄG± Û‚Í£Œ¦¹NŸINVq%84­`Érž?[xÚeòNSª°m½ô £U´"¥ì ±Ÿ¢>0ù0°4iv—v,èòYŠ3oUãDth˜°]éÙ lùÚ„÷wdÙµÂêè[ÈûA‡‚=‹=öàÞ-áðÖô‘÷r"2¬€A\lº%¬{|°VÄÇà·Ô€Ï˜¤ïòcÑPj‰ôVBeðìê~sŸ„›„›…«Ã Ó°Cð½=³§«ß–Áý C.•7~ptšŒZa&eu†_K¸ª_VçEÕÊGM Ö[øþê#¹–»ØKÐ*äÇ{£òÛõ‹¹ïé A8ÍÇßææx,\w¦ucè5d^‚–5LG…o™ï—È|©úÉx&#¿b1·k÷r¯êÕ/•p÷œ„O»g™ò&²x|à©};Z3¿“-ò/*,D~:~2ïȉ¥ËÅ;EŽ˜|›WÂÊ2)ùf1°c¸_NÿY®bð³)l´a(EÕãϘ•û~fö±ì-¾.É¡7µ¬}z[¢‰Mñ£4k„’ŒâÜ‹³ ÓL‘Å{ ÄŒ¹$—hd÷”é‰˨žO?²Pâ#FšLäpTÏšÞ;‰Ò*›7”EóqF¡/Dí ¥›æv.$J[:.§\yç®ðBj?.«€1òø¸õåÚ뵞³o9ö`í2CK“wÑlBD»1ã ‡P¦¡%§¡ƒnn&gÞ®l°2½j½R®Ú¼Òºß¶l"ð\"$:Ôý]OÄT½€£úe–ª…_µXrÙ†!àó˜_ê¢1î*N.`öÜ{MOÅl=SZÆužµy$a¡tr}ÚS‰¿X‹¼¿ŒXК‚vM(ê­¦:ܤÍÎ#û¶>~´{QjïPE÷Mì—ôïFÖ¯ƒ&¡þ°‰—¹Ã|w‚5¡ 1¤¯ôAÛÃ#•çÓYßÉel’±C»bîLÒ$LÅæ?cWæUhPç—)Í|Í ãEƒR‡¨Pì7 …×óJA“5œAoAT#FÑ-}¥Õ·Ì(-Åže~ç–ñ¬Á‘Òi((0˜Vwßläé˦IØlyêojÆ-gÿ>ëÛwnþŒZÙ „Ii÷ÍâHK{×§¥çŒ‘:ãèE9 ú³Àlùæ é7ñve‹ódy:âàWe1}ÔRŸ´Þj „ƒ’½âlGè•bwpU+&@¢ŠÍ¶ðdU¡L까¯9“ø$¥z[Ddø$4¤Kg…*Ð¥1H·0eP~LgÎ<~•}špüܨ¶æÉsœ‹ÄdÿÐap–@#“jãÃõKÎÈÁ·Ë3,®DXƒÈkV/drø~´þµï›!—®RášßNk±(î >¸}†è,°P&2©Q2äX$³”±+ã9^\è©ýfѺiÄNÁ !ÒË€/Z´cpfî%k{±ŠÛ.®ã.»¿2`ÛžQL܉È2g Öüô ˜Ž¯•Ô"œÏbi¸=h´©ÅO´1ü°¯y6cpkuš`ô5/^½$:å” ‡^ª)Æò¢Ÿ6?’ívŠN½»Ë×, ‡ ¹oð&J¬²'Øq›0£À­Çí¾‰Èߘʗj’FÑGoáÚ.XŽÄ¾&·l3©ù2a˜[Âýõv}¿=ž‘®}IªÔzOÀ÷É}POÉ!Ú¤¶µžué=öBÜw¦âõXª)=HÄ?{!f;ö{`œJZÆU"vfL÷m{NÝ=Ï~{ü%¹¹P_ï¡~ÇÄŽhl“ypÂä‚&[¨7Äùó'¦ôPKc:Eåݘ¬H6;O•Û%Æ-Ü_)䚺yHo$¼vðÉ%ùÅï•ÓO½2¿òcBª1$Nê¦DprÅSXü{P÷ÃÃB:…÷…‚X7ìîrž|Ÿ—»Í)­µÃ“¡F/Ù¥ÉÅJUÝìÄÔ‰!h}%e]îìÖšQªIÉ;ÁkdþÃ}~v ]ùûx=I×òAE[C×qŒ¨L®Í¼U]6}:¥?Dl ýQþ:¨±ïAHv(eÀIaQØŸˆq&(0×¢¥\Z£dÜxZ±ÞIëͤ,Ó´«9QYQî²âÊ Ió˜5YlQAË÷«¯ß—Ë®xäà æ{¯÷t–-.»-™¢fέء®cg§8Z&Y‡»Æì=ye†1·øèíÙuö¶ÏUk÷vR£¾„€” 7â¥dJ-Õú3‚¿%Äú¥%KbuI**,%Ç·€òcøzè´˜Foßð}œYE-ËõŠ6ÞÏ$¯q¯BŠ(˜‹5Î’ZÖ2Š.i“Åœ½.Û´.k;{]vQ§LnÈ"áÉÓR€Ø ø8!œ)‹îêàpÄ-ÐqbtÐU@bh?þši6ºÇqOøs¾Z˜‘Ë„­ÚM;™Á“ÒµÞÐÌõ›û·éZMŽƒ²MB½Z\0;…$ïŠU¬È6ï„[‡¼VÓ.QžØ­&K3=ñ ÜÀ­úX·?bü \ûlè¨:°Ô%¨¬z¦›Ÿpž~ânB«} “ÓËÒ+6ó4²TÓúΗkFœw“µíèó´-H@¡ü9â*¤èš¯¿ÛP?Mï¾ÖKzv6Åцñ?wï®WŠfÞ’5ø£³iÕG .^1±–ˆµ¶!ü¹4¶À¯j‘™Ò1󝶯iÈ?½#v|r/–iÀ¨žÀU9ÉÑ>­_a^€ßù>Ñçèã¿Ç¥IYHÐnoÚßjkª»¡ö1¯-–ª@×p>²QµôéÙ÷«&ü5)I× uuáVî©¥®û)fËç¡ï­ °H(;»³ÑÎ~|JüÇOÔcq}V¾/© sïäžÙø¥,*µé¤±G[頨ż²úû-÷N…DÙyŸ.ÃÞ[3õÝ8dÆzûé;SóE“ª²VÝe÷Ž©_Â|¨xþbk¿Þð°¶ÓèÌIÇNØËëPÉÃ5dåÍ•ÛòX\¤ÜU~Ø>Îî)3^íkö9h!&w|¬þäæ·Nr×¥‚¹¡ãBßl/È›˲!¯=x.èÎçwÊó|_5•eõôÉ…,“g1!:•ËLF1Ã7n_cWŽ(3+uâ‘kûwÑÕ ÊŠ¦§FI‡®¦^É—óÅ(å.ßüØÒ¨0qâ¬JèzüŸg¡ü¾çÕO¡Å’·Íq‘-óô-È0ÉÚŸe¿î¼s_D>"Ó–Ìx}‘±SÊöC.¿´¢ª²öË™õا™±"elûää{çªh‘KLëSŸb¶6ÚÛËu<Žã¹}õâ ­Ó m+ÝuëʴͲ"çîYWSi]ÞÓ˜¤W'V²¦H_^ßÒ|8#í϶ü%_uW›< ú–›®ÌEm— Í1,Ôîh>ß¡nŸ÷¥±îæÖÛ|lSáæ¬8Ì{g†MÍ^’YY%W‹ã^žf´—²œ3Ã>Ý~U”M{I]Qnº°ßú¢UÕ¼²°²¶éQõ»B©¸»ÎfWªœ4– å¾ýV}õA\Rd„nݧ¦"Ì7W5ïç™í·ÿ¢½áý‡‡k'Æiå»¶Ïi“š+%qñý é—j¢D…H(·9¿®áù¼Æjxë/ÉÓ¶ŽJ>"U@š©·½ÅŸ±Q|C[B²KÀ‘ô=§¨æ¶¯Úòß5omðÌÕd<þ/Ÿ”_’“ɛ՞ò¬˜2+«=òÂyÌ]Hªéüìü}‹<ΛÆüñºÌ9¥£õò •ùÁ ÛZ±¯(ÌyìjVåû×ëX4ƒº* ÉGy§Ž|Z”ö “¿2QZk§ŒÂ$#TÞ>ã$oê iM×Ò¹õǰY«hN´s9GX+’Nølu~;Ž”û¢z ϤêBZ—Kû'QÅÝ›-Å‚çÓÚ¿¦ä`^Û.x_¨X“Ýlµ}EèGÕ#þÙñ‡óÎKY®ÝU´îÂP!ZÝÜB¹²JÛq/0 ïZŽž ÝÂä~HÍi$í§Ð"Ó¶™@~‚Ma!…äqpÞ \/ôB9&§õrÅbÍwÞÊs%Ÿ]mù­ïw›+žGHÅ_o{2ɠܶÃr²¢‚G6o¾Ù‘ÐèÌ»ˆ…¬J1æ5ÿO^úû1\gõ9YÔŽMºk•Mò=6ÜhÆjß·$U‘;5/^×9í/nœt\¿lÃr\þV‡ÃúSkYÛ¦_|ò, wHþ`¹½ˆNà_æïf{ni©32lKËç“zÞvã¾Ø×'$úò632Ç+Í0:ô8Ñfþ–ÔÂýæ‰%꾥ɅJ<ÆþA­Ù½ï½ä刭Ë$P5×*kôÆîy2Ú ðIØ”¤[ËœÜÛÆÞý¯®~Ú]s?‰Bqç02Wžž§_Ð&݂Ԕ»Ü(=ãhL1öT`m²Qfû…65±?÷4e¯ˆnÚœ8>?b÷ѣˠ¦4ÌèÏ·ó7~g»O#–Ê8”o_¶2¹P*?Ê cáêÊÚúŠEFÓ7>Ž8j*wæÄì§9"E ³gÝŠZtåŒæÅ‚âxÊ[ƒ©!²§ÂµHëýB²Í‰Õl¹´øÙ¹÷ß­þ¼áïë.;çìáKu¾§¯V;˜ÊΞöÚ>b·MÂWÛø½©Vâ9õ\«Ÿíé Z¦îÕˆ|çð ªÁ4“R䕱)­QZîÛ(óÍ 1 ¾Ë÷¥uׯè$Ýi›M“ f˜½¶Ÿ1þ͸|ßh¥èR0eÆ•«WRS¶"ƒZ÷¥õ¬ÏšdŽ*¡c確­®sû<Ÿ–É»O¥¨?óÊ•Ýètê-tœ þ»âÄ4íÈö/;½ÏÑ­)G)íŠj“·5.;YÒþ¥‹½º ì¤%;ý#G7°86mn¾=ŽYæ-`¸$eΔÂÜ7^>­ .ܬ}t™¤ê%úà}^e뫜Z/^ÛÕÊŠµ&SwQÅ6ÈŽ&~zóX±Ð‘"«oÝúÖú÷¼°XÛy§Œ5:·½êj]>8{è¿Àµ­¨\ç%e,RÎ(Lžív Y]^–˜\°‹à™m~ס¢¨¬ëüæx}H´8¦RvÖ®WßÊkkçd…½œK-¸e½uÒµk”D}ì§à:=“ÅÌØSöçÔ¤'”ø|9€&„•©¥[d¹ýõ0oVåNùSÈ^».ÔìŽXÉÙÄÓ{ºŽªç°;Ýi† õ™èµŠcAáu®LÇ;ÜM!$}9¬Qic^ˆŽOÞq¹(a¢xÒD§×ŽîŒBúSµÔÆj,ë€|mµîªo’†:)Ôgï²qã™gÕ˜O|×ðæÖYL,-{®h¯•Jé»ÅNòï\|ÉÁ»ÔC/L3?>i²Õ–'r¡µóX{Å£Cd×UJ-'];¿åxjUŒå¾ˆ™#/!³Mw\³ò—VZ4-ʬà¶³y¸/)Ñ>jvµ¬ñÊhmÑvýD}\уù§žJ:hs6u×Û4ï%!¯$ÍF³xÊU—ñË$Õro¶kF­¼_³&­©Ñ };½ÃÈó\óëFv»J[£—ös—yÚX‘;â´·ÒéE"銅~>÷V­¯ñ¥¼¡>WœÑzõ¼¸­Eœ´9Kâú†úƯ7¨^WV6—¤}ºúìøyÏÕÍJöÞ[é(R¤Íz…¾9vbgÿÄÔ¨Û{µaÖš‰_­×c|}³A“'µ%÷I¦¬¿zîŠÉwH³Dî¤Půà±[’7ct"Ÿûâp€|tÅîL郄»¸‰%F›ò7k¼±!/_¸Fœ½qm6*qÏnšx}髺¸O1cH¯1+ÇÿÕÒºš:*gEIdxƒô‰°Sv’V³ÌX»ä1÷cÚÕñ5ã$™øøæ»öÈ«Ü÷ݲòð‡€ÛùÉŽG3Sl|×¶‰'§P³_ÄÏl´GÉål ¦7!¾=¡fïL‰]37ÿø5;˘…[¶¥Ü1ºk/YhO6žQo~*ñåôcd\º½JÝðlÁ˜};ö5Úßɨ¨.i1™2­ô”È,1c—ShLUc²eÚ ûX[žÉS½v·‹ëiOÎPÓôgüUŸ|Hg|üŸ%ÎJ$« ÇTM-Yî†îx<ùÞÈPË£q·ŸBϸ‹Ç•#S—Ï8Sÿqï&‡Ì½»*Æ™»—4çvücò•0 !ƒ1~ŸõÙÖËšÞ‹šMmà¾ÀÙ¤×'DL÷ ®Ø·öïæ޶Î_ìt|ò#?×Ë5åý¹Ã)äÈyfuÔ{ÃMܦàÏãæF—<×,•J½º<ôøÕP]‡h‘­7”"4¤VÝ-‹yÅ<þªäÄèó­52f»©wÆF|¥ÜáÌÆÏð5¨Òœ³ßÿ„Û§‹ÌvßöÃò°ÒótªjŸ)8öpòŠVY·Ê¶¦à£‚ÅÁC.é'i¦IÛ5·ÝŽ|ä]_ƒ5›zž°Ðo×™;×ÅCç<–hŽÌi.xQ6ù¡ìˆåVLLÙ6~sÙ ãP§¯ooßÚ.u1M'm­ U<àÞyÇÉ’³4/×vQ§8±µòåµK×ý‰œ²(ã dKØÑGüRëLÃÈc=öË[ßæqÙ$i¢®üì„W«ÜËK;ôd‰!¡h\zá…­5$_Ñ…r1›ŽæacÞ–¾ÃšÉ¿C+îPôƒRžx‡Ž¹ý>EñXÎñ!évÕ‰uŸwÊ[ÛîñmRù¼W>°d鄾é£2£ï’—ùÑ ;„ ßbî’«ÆbòǤùK’ØeŸF} ¯Ä¤†7¥ÿõy›|ðv½WUÛ^<$±ÏÈŒU3-@‡ŽÑZµÜÞà\BÖ#{Äé“ËÞ-0+Hy ê®ÚtDžö¨Rò9݇†º´>ÊqrK¡,´‡(Šú8ùO‹À5c6<¿´ÀLyÎr%|¡GéÆò³~FÖ‡ÕOe»Ä„íi¿±µÔÓ0*“uQ½ ÅHä…Í­Û1¹EÅ•Ï ŒR.5z3ʼnd„73…,mV˜ëB2J„-ZÐÃë 20Ê*HÏ&094.Å$Ð}s-QMX&´4©dIK“Aæ *—ëªDÞäFs_& ™ÉUÂó\É2QpµL†Köäò¥n)‘J`sÈÜe4K ‡SUWBÂmri\:Y H!Ô-†PB é YñC˜˜D²&BP[T“Ncn„¨l2e™Œ²2ü‘Xž<2S™ÈáÈ@l2}™ ‡Ë£“9T2™+qÁ;‡ T9³H_sü5*¿=²+Ø@@yPiDj·jƒÃW{@UrÈîd60µT2Ý(.•Eâ=˜Vþd’2d v$\W lT@­_…>“$T @Èí¬kØYÅÊØÐï¤kcej×Ef§Æ˜!Ê|5F¢Â+°÷!3l­€¬‚=GCá ûÏà,Ú½î]º‘Fý„tnÛ)<» ¦ðÝSAذjY¼fØõ,g':-NO+ÔÃö_@½W­È\76óª{ô ì&Ùz¶‰ÍEàÖáÆN-†+ ›-NË®°í^@@ÿ¼©èT¯ÊýM>`Nñ€zROóÉ·Ð\*!~Ÿ¹t»Æ)lƒÏ1 ‹NgyÀVœïÖÐt£óÝòýiÍß帲ïnˆ®®ýõ²^`>ATv§³ÞÉ1B–4ðɰÿ°j@üåôRÍa€ ¬õýðÒ |t\Ù !1hu B© UºÜLßÏ@ g^§ ë^œÁ‡-„‡‡‡r×é‹í‚à;µ;)ýÉÕYï^âû@:ïÈt­þ4 ^xôP©|›$8éÐD¨·ÄÂâÒyHÂ?ÕÑÚ<§IøüWý¿|ÿFƒUSàùïÿA£‡ßÿ3I¤ÊÁ5Œÿ $aü‘CÌ0þƒ‘„ñG ü‡ßÿ6(IôÐÁ;Œÿ`¤ñÿ¾%â™V÷{”þ/} ÿ‡D!‘ßãÿT€œ Õ0¨á÷ JúÿNü_×N\ —ÊTö` Çý Çýý7qŠ#(;Î`ö|w$˜Á™ÃeˆÜNßìå´Q L^ ø¤M´?‡Ÿ øë%>ͺs,?,2¾¾Ñ·ÉÅ]jM0r¥)S]ž}x¤½–îßù†$ýôº¾Þ={lØÉ÷û©ÛΨ?A§$¾cpž'ˆoâóõGŒúÎB"HToöïûkïzÆú±—W}DYõZ£×X§~ÞlØgˆ“ üÖBE”ºš"­Úo$ìUéÑ:¬œœÝ(@ˆèÁò»QUAØ3øë‰7`˨,J©ª®ˆÁÁoŒì?" ¦COo.å2@몪.aAÿ€K*(Ü#hV ©¢¨ŠSTSSWÄ©þ`ÆX<ì6ˆ(‡Êòàt5ðµ(D¢ÁíÑy^  º®ºfßå—ìWq©A³äW¥®òËÝU©W~¢ÁDëù¢I ¶†pƒQ‡9« ¤×?\¤„¡‹ünŸ~ï`D ÑŠj`Ú`Uúí@tûãÙðr¹NP@äXÐ= PÃaŽj}v354~Ï* ¿gµßŽ|ÇßO s"² Ö@¸Àê…E*¢q(øõªýv„üáÐ¥«#xj¹@hv!qêüI‹Æ¡á²ö>¿~Œ±Äõ€ím6ÛCÄe ÂJ'€°œ{vιA ´ä¯È¿9°R°ÔøÍqVÿ~ò»b tzYJu1]:WUœž±Lÿx佯~{Ô\ Šöq†¯ãÆ¥‚˜ÐI¶)ؾA¶dîŸdz×s‚q•Nç²4è ߃Ÿ½œ¿VÌ.@“ Y™ ¶_Z•èzÔêq4ÞËàVƒª€­Â£SQFPM,ò…ëÀG¯=êð͵+›Åü§Á€Csvƒ÷‚4AÐ•å ›f¢q!9“a{Jq£+B $dkŒ7²°ÁC:æv­Ž••Ž9Þn)( Ø rÉîdA;4†+šõ °Á>›Ëƒµ™¾•®(¯³ÂØÔo¯ ŒñæúÖÖ…¤YêXáumLu¬ÀÞÝÊÒÂZ_Âw©, M¤îÁÃá#t0Þp€‰X+³!´ÂZOpTÝ•¥ Y“Ñ/º,W^×Ù}—|’ø£æg[€õ¶‘¥ñw†tŲé­ñøÈlGY°ò!󃾟g»ÒÝ\Áh $‚«PìÍ•A¬:KÁd˜9°šÆSÁ’­ÛWHM¯²Çå—RÞØ]j9…HS&ÂZ­Ï¬ni³ûhÀ0kÓ…åF`“zíÁ•Ó•½œÌa)qÉDª ý>2º[ú½!8 ”úpÈÀpú7IØÿ‹:þµaÿÿ`$aüU‡ þh•aü# ã:ø#‡ñŒ$Œ¿ÚÐÁ5Œÿ`$aüÿÓßÿŽÿû’0þC(þs8þkP’þ¨!ÿ9Œÿ $aü‡Püçpüß $aü‡Püçpüß $aü‡Püç°ÿgP’0þCÇÿ7ìÿœ$Œÿòÿ û% ã?„üÃþŸAIÂø!ÿß°ÿgP’0þCÈÿ7¼ÿ”$Œÿòÿ ïÿ% áBþ¿aü% ã?„üÃþŸAIÂø!ÿß°ÿgP’0þCÇÿ7ìÿœ$ŒÿêÿÃbЪ(¤ä°ÿgPÒøÿôÈ€ð+é¤ pßÏÿƒ„é‰?Šÿû?X•áçÿ#©aIª5’„vvvƨb±8"…¤¦®†$©bPXuÒ=¾áô¿M¿:ÿ ®¿ÞÇ@ó…Å ëƒ~ÿÇ $g~í)üÖ¶(ÿqYø¡sL/鱺ßZ!1êŠ($B£pŠH$ ×UUDȯJÄóŸ˜6e7 ê`0Š8‰UWDª¢ºÊã$‚êÏ]éóŸ·$pσB@0UÑXHüSÁ ?,òÛÒ/ÎW¦Ë¯÷ÑïüGª ‘jèŸæ¿Úðü”´ÇÒÜp’¨$<£&éY1 ìÆ=˜0Ü¡l¬ÿé[šâõÛ;:^¼|éïïohh¨¦¦v •?{¶ë7âââ$$$:FŒ¨¬¬´µµ]ºt©“““¶¶öË—/¯^½)--íããšéèèxMr<¾äZ™[Xþ¶˜2b4ÂXOïþ1Sl{²BÁÙ´KsDDÈ'ÏàŽkCßô¨Qã.ÿµ¦,ýŒ2ðf¥þý›>³öÌ<×ñøÜˆø%Ó1³zûè×%>µ9‡…v,ÙìpéÝß…ÆPùŽ™ ~üè9ŠóJ[_ÏXZMüVªí¥¿[¥5˜úùýÔºúôìL©ë‹:nYƒË Wi¹Ž‘E䦱¾}θO/þüêÊê³­i{|«œ=Cn:nÂi{Ú{Ëf‚Â-=KnÓ$4œóœ]¼‰ ±åÀxåÑ5¾¼ Kq‹x[T‹ª­Æû²©¶Îö[\ ¨èŽàè9„Âl "Çx¼ãMö<}z˜­#›±;³¾–ö2ãiüe‹…ÌE|Å„Õå*ŸC†/v¸½ ‡­®’›rðVSÂ4øb¸ˆcGö®…Ž7ç_„¦—e} ŽôL…óðAubèŒÝub•ë“r諟²ö;íUi®°(¼uÁ–0b™4òF®¬;#§úÑ•ÐÖçl^JïAYJÕDÉhÇ›c¤—ïV·¢ÿÏY–ì­Ý_%¬öíîãîeÛy6§LŸÔTh¬~4/uP'±Àq‹íÝŒ¹žŸÕ—_÷dÜY3Ñ«iךö´ëÓ×Ì_ã)þÜ9¾ªÔä) ÃÆšÝ‘˜ÄóÓ–_S¥t •ªvæ¡%f/V§Ýöш?lÅ ±MÙ3Y_Iz“­ú=· ‚zï,YÉ –8ì?±½®>J\fƒµdeß–û(õ¯'2ïrÚÉ›íßK¶½Ykò†^´DQY—ûº³²¢JvWºZÆéÖk>|M)PýZh|I¯a¤@Òõ¨•‘Õ_N­¸ ¸9ÿƒ“RÆñçOTÓ…˜Y«:ú`$b[‰ÖQÛÂËë¾!éj÷ÍÊO|Õ„ ”h9ñ^»ïg±ðè´ [Ö?^‘š7ñü /é~'mùûŒwŽËåZ¹‰Þ{I‘Ì‹<Û¹Ö¹Ø5¡m_ßÇh˜Têg>¼›N<ø±0¿9þ0y±cÆ]-ÂȽ>‹GÖlÍjˆ ôÖ(ÑzVm-׊Ïð ôÞ+ý)ÒüL´ž£Á ß•‡g—á,Ž-œY¢e“h‘ùîï°·$UJ ðϨMì/¥´ÚrJ+þ®Ö²6ãæTó˺0zò¬«*7ü« ÷9é¥X°lÚ¶¤¸*.ðû¥’¸]j¥qYÚåkÛîjµd>zë$bœ9ñäíè/™ÌNÏ \º-VÔ"ß8 3ôõ¥\3ê|øvÎÊèHóQ]³œÐ0ºy±ú\éi 鉠ìÃÖ`•9yK¶ü+”Ãt•óž^*7WŽ^Q{uÑbé}Œí‡´fÍλßt}‘ã o~Ʊ)ÅÍñæ?H¥ëg}Y3émÅöU~_×ïçw-÷NP¤Óºž>g_û¤ÀÝç¦ÔMÿ°}¾£äCÿ´]ÖE«VÏO9³VùÓ×õÉ ;v´ð«=¼jD“ÎÛ!AÞ®Þ²^³-7zÊNšgFx"¯V&±Pz_òõ1­ü²9þÍ×x‡°Ç§<[ïËÕ7­k¯á^,: ØœÀo¤º¾ 8.pùM±ÅðgBF†‡àQçà¬ØøxÐØ ¸µÈplöhéFèšï ¦9ŒayŠìíOö¾)Æz&nØ}ý½uû·ÿIAâñÄônêRðÈ\ü\ øÙgטÛd úìíEê"¾äpØsWaöö¢ ç0жKo 5Ó§Ü^Ì ð–VsPBÆY^ç1­öê)ÔR[ÉíFv¤A#Ò$—¦Š½47áù¦ƒ!?l-4£]–¸,×`ì_Ö|lh;3˼º4§cN¨} „Ýó4ˆûky Ÿ#®ß[©ÕG‰M+*¢–â¨'¤£)~37T{r¾¹*"÷¹º#‰xøˆa6€½S‚;ÈD"ÿjFAó½>³A^+0®'z>º”ÞýûÙžtVÖ/&×hm«Á'Çu¯V&÷•ÊN=ÝN„ûi`šqS{ÄÍ[¶ðö¦¶^¹ÉœkTŸ¯KÄ´½¹õ»öw--ø§&ê•ÍZhëÚæ9G.ÎU©ï°;üõÓ„/I³A})U)o¹/ ýî“­ÅÛy;ÍH·ZVüï*¿ÌµÞ¸_Ýg({K‡§ƒxp_ÄþfƧšReYÿåÔB«±¤NâzŠÏÌ¥ Êô=[Ma~çi‚O$<#s¢qôï5ÔY:Ý€*Ëä`ZZb{W_(Ò´_ î¡÷E\Ÿ2äa Å8å÷ðPÐyO3,3 ³XÜ*"~ÕgýÆèu£®KÛÕÈ Ò½Š/·N4;G¬ñÃuò÷Ÿ )Ê ªb·ÁÃν7*S¸YèaH‡Ñ$Ù0É$ÄDß '·«ª¶¢®ñÏ™üÈ̡Ы†$ fÜË÷Œù)êçL•4EP3LýÖÓÏÿËSœ_#ß|7Hº“‰²#÷ ûЇ•X¸œÏ?xÍ¿&wr®êÊJ6ãY4Ù¯ž‚Û/ËnØÀ¸JóÖg;þÈ› €O3…™@§]7 £ù Гæý^j3öBjÜ+3!ùªé¢ïx–Kl” ëêø!oø=GÏ\l‘‡ªŸ8R‘¡‰tM| ^¢ø…wÃ…ÏYQÕt%Z¦ß+D¢)¶:Z}0X}jªÌÐä±! –ªaùùêeɤ»“ö­á¡ÇŸ/ºSž„X)9¿8UcâZÞ,(¬(û¾U=¿ jíð!dXváõE¤Å¦3tJõTA¸»ÚŸ+YšâwªìáÝOf·úšÙß±,¤ía\ ;|„9`©Ažs‰w;f±Îâý™Â´:ƒcðRêóR覹{Ì:ôìf´Âèá>2N`àû½}:tu(Á~:nÓ›Ú„’4¢{d N!ØÇåŸ?–·W¶£ Kܲwhƒí¹S4™yíÕ&¬ÃH=Îß„`Þ°j(pÎQ˜îü=S9½+Xo:¶Gÿ¤ŸùìmT‚žú‘ФXßÙºÚtù¿²ÃzK›˜‹Ãó;¶·zºafÜâ¿J‹)Èò"3ð@»>Ÿ¨û:ôIÓLºy0É¹ŽˆGÒÜ|ä|¿ëY’‰ÄÓzÝ¥EøölºÉ*Êx ýÞtÉ«G+‹9îÿƒ{9wxw÷ré• åñîïÊ;@Œ=i(†:Ý!ÔÓÅþÿžm4ÏTÌ¥]×@½}};®w«­:›ÅÿÆ `û(Z1)Ù¥™îÏšðþ-Dù…Y£+w‰€7,Î \ÄöÎÈ:pǦá1ŒÁ–·‰Æ¬¸—†j·žMw]ÑÁ$ªK£š+fÀwZ³[œ÷Ö»‰0ƒ7G.{™OÍÅὉTBá}—0Ô|’–çüq‚€¬ŸHÆÌü‚Ò¨ï¬æðݼ0èU‘ô¬Ã ¹¸±Jdœ/9PúÎ̇œ2!½zÄÝÇ+=oÉR ÀDt£ÿ>îæi¡%ô’ìòÂ@éÎ+øøÔË‹­³]7À>y5mqÄ _lÖ±¡ ôÖUü<<æH$H(Â4dŸÙo jF[Ùâ»î‘"1<[´( øíÊ‘mG’N4±/Âcb,=‚ΠgLWQ*;;;ЫÕÂÝ4@½®&b ¤…x› ëîzžJ˜.6T ¡9DMb Ý@Ïï ]q¼zyUšJ¬8n9:ƒ¤•mÙÛ¡]ð0dt:GoºnýDËU”Øž&×Pu= 1ºþ Ý6ÛB\~´÷wê9òéY¡Ùeá2Öà”—ûè9B|„Úmoßìçs½×¡dº[‰î—v ,æm+fšž×·™ÈÍãÙ$û/þ7]ôª²ÓÏe!¯4U—³^ ¥^¨Ë÷Ôs7—B±Õ ©P:ÞmU+‰Ú‰ZVÃÛŸâH[T)žÁ®¥­Uë üîïU’OQÒÌŸkT”fèZË€–Œ_‰Gu>‚á™òa`ÒbòÇVË£Ênx¤Ù¡ðº^)2éù{mÎiHm"¢ŽNÑÚîÌûç`ã½h‹÷3¢Äâá9l #)Ékk+ãgíŠJidΆ"Ÿî"9lƒÃ•QÞYbÏÑŽïåÄÍz„¨ˆKœ¼SPIôBÒ’¾àËÿµÓdp‚ÃUÇ5WÑl¬×Q>¢»·ÎÉûýóFBZÈsb°FC®ááD›™¯ª¯KjNé­~FÄâ“/ $-o$¿œFŸ`móYùT`žjDš?ŸÊç q·%5Æjlûywˆˆ´ãg¬p*zÊ«ÛÂÖa/¶$®óŸ¥ÇáßÍß Ú|³"hݲäóªûÄVJZÄñM2cè úÄ7º@›W(IöqMöKdryum™DÍËŸÓ±6ИÈ[øÐ©!R{^&Š#)Ý 3Úvæ] ôƉ6û`0§¾Ívdm£´µ›–|÷mýŸÚÀºd”òY€ÔœÿÚ ÒQ;÷n’ižÁ|¸úÏõ_Á§ÚQU ¼2*Yß’y3ÇýŠ ãSÐ E2i¢O] ŒÙÙ—à1ÑöM z§‹’—tˆiÆÆ OýÎ+ûÓß#yTÇ*áÄû%²I‹0!2Ó ð!,W‡(íNçï}; 6¯=ß‹Ào÷±Ú=ÖígODGœ»BSÔª^0 ƒ!ˆ~«Íį)éjHœûWEW>é¸ Æís¢ÄÒ¤9lQà2£ü#m&ÁNt/ºyO'ÔUÛ…"u‚®ß9ƒç  Ž=¹øû¼ê™m~É“|øQ^oèvƒH•ÙŸ½$ö¯0¶bH[»Ôýˆ?A £¸Ò¡ÑñìÌÉþÅKˆÖïÂ]*Ãóñò|Áiû€BçÅûcå7¢ßºÍ0:E˜÷)›5„!AÔ/ï<»Ì§FìÆ¥“0æ¸.\Xˆñ×t¸ÎB=ëÆ>«òM‡Ï mòípÙ6ýëïm(‰ÌÖàó°Š+Ûú¶üá9¡óDæµs¯¨Z¸^ ºVàWlIµôä©ÏKs˜ú6 |‘È|Ûë¸È«”³<»â´å‹WäÏ—ÌyÁëC‘w?wé¾Ç+[î €­×ѹßk´b¾œ™ÆŽ·K‹uÿŽÝÄÖnGêg¢ÏWVòÍ>=¶©9s Éã;–ìø"ËF(?Q÷:É?I ûŸ =`»OxG±’ï¹H6~ñ·ûƒñ‡¾ªÛ|. |màfà-Ù°“è„»¤Û¬¹cT¤í™<œ% >5ýßK3¤Õ}ºmÈ«þ CÞ?õpU°Šò»ÎùÀÜ&Xl É^›Ò¢T¶ ¡ÈžSÓV<®5USƒ­ \Ï+ÏEÎBOm¢s†xC[U›‚§£k?S3ÝVØH…tGóµRn쯛¢¡J¶4=@ôCä üïiE¶Â‚Ó8ËS·¥ oð! >WÂÀ¨8CwJ¤‘è΃æžû;R›ÚV_\ú™”Áy0ÖgýßsÿO²Eü½T×G:ÿÜ%áÂ|•HÇóš°àlŒ‘ pbÏ«ƒ=†Š\Ï .±Â}ºÇ|Ó_.8µ›ÿWR!µsìâT•)¦×WYlœ,$«¤%xbBÚ;JKýnèIëH%d›–—T•¢šà–W@ÊIw‹Vûq‚Áß W{.5q 0°‚•¯Zæ:N¹º˜õDÇSqé9ë¥vi^`¯iðXª#ël[q›É¶cÿ1ÀK'Ãf©Rd¡á¥vbjÚªÀj/ññ/•Ž_¦¯g’o 4ÞÔô_²_ws³}oîtgúEáÀÕ®ä*zꀫ‚F^ñÌÂ*žT£^¢ø´¢¸]Kñ 5±óìÅ4h˜h@~!(úyÑ>]ôä“© H”Xª?d4všÌ¤g¢*]íÃû¹…VÇ/–Pƒi¤sÝŒÍaƒk‘4yf:ëýÜî¯ÚÓ^Í1^œw¦¸kŸëÁ²ÅgÓ'ÎÚë#4Pädx_>N”É®àòó}K¼>É ÜCWë>ûU;PtûýJÿ>º¦köG„T=Âôªúú¨Óx¶“ ×½j퇥ËS íZÁ'gÙqƒî_sø<ðJPM4ÌÇSZTêL%Ÿ0÷èk}‰cò§’& 5n«óÉ$aZ4ŸRîÔ'µœ®ô"2-y'yº8¯£4Øj~²î—‡fï ÍžZýiIàŸ1U±¥Ç±¿¿Iy–šHº¾¢ñiBX¶ÛBk kºSHÅ]¾Õ¸ÏêZ-âÔÒãu ®’ç—m(2T`ÐkN“z•ÇØt÷¸sļ“ü§^¦ñ4À¬Y¼Þ‰8×~˜^畚þÍþâ;v?æÔ~GÛôÑTÑŸ[ÐFNŒPƉ/­rjI$iÂ.¾üø22Úž¤p«ü8üê«ó¹:ȪœN½½ Â¥È[ùÜ«¡½Žº(Wߦâö¯Î¢wŽ——Ñwè]}èýЉüÅ8i´Jˆqhk- .¤7:¶ò<“9ì§ñ´šOÝy?V÷J&à œ¬~mY-C‡àZ+ž;êúìÈŸ&Z¯¨~!B÷m²K€?Xl[ò—÷úЊFøÔðk7jýÊÐýŒŸ8Rr“a¸ügíÔU¦u9‹d3»¢jœÍ\~ð¤_Òˆ©<©sÒkô«8‹.8ßñ©vÚ+Å{gN«?)¦`$1¦g i:dìƒÕ®U((÷T¹147DWO§Â†*˾ÚÀºÁ½!ÙÃbY¼k2ŠÉ¨ö€L.§N]À ¬÷ÓÆ5¶ýö‚ÒvP;³jyþ÷ªw«ÒíÄjB‡õUŠœ ¿4PÆwÎÇàw&§4Sj¾1—ûúݦ…Œë>*–¯K/‹‹€ŠÉ‚û§%äú'aHcj^‡fs1(AçÐ3Ü'ÚôLŠ©®<ËñTxoŽâ6ŸÃ¹8³ª€‹|×çÕ²û±:7g‚&”÷«¦¢W¢‰Š/¦¥SeÅÀ9›—+—eêC•i×#Æ„Fô1¶Ó«BÑ‹¯ºÎ7Æ.§ëæ+ÿ=ùŠ6åž–«xehò*Ë„‚ëtwKJú™uÝöóÚÔÎ&ÅIÒ%›-sÚÚ².íÇ?¤®Mß´Ü*)\Y-Z‰U¥4dÒ›_ɰ7‰œ;:Ž_OqÁLêÕuR»| mÝ!JÍÏ‹9êC­™ Tê–3h½Û¨BÐGÊÎO¼u Ç1/:ä¹ìÀõÒ?“O¼uQÂõ3Jù¸RCçÝÛèxÑþû~þÝZ'yÐ>Å-|«ÊU.ÀfÅD¬üýÒMTÎnf€ôøGÊ{ævjÁ/N’ö³¥«ÊoÞ;]ž©5q(²ýÅ‚-¾šoŽÎç¯È¢-\I¼„vGÇ||›z³•ëÁGCö‹Š(“s0Z‘N÷ÿþ‚ öf]‹RÕ@f6mù‚|¢8A®:~7å C0è3 W)lÒÛAéÑçŸv¨5bQçK jÕfl­(|tÕìY—°åfÔEydýÙ§[ZY(ÉÔ$Úˆ‡ çåVˆ¼ðÉi·’ævW¾Ù$ïçeSÏ÷åê¥ñu_t#üGIµÙøýggÌPtÂÓ>þߣ>ÿ¨ãˆö CêÛäDßmp27}³Âã0¶B`ŸÖ%8lù{ÅIáqê¸æ6±¹;¶Ù~™™T/ýÉK %µUDM|/…2%õÒõÕ^1R·ƒÝ@§ÀܨN…{Ü/)Ó©§£»ôêzÅ>€g™ì”ÉU7q]ÿКֺY¨mÁÀ•6ö:ÝQ\mí©™;.DDC›Ç”½ c“ɆqÕóõö¶»DĬfÓ'WÍ»ÓÈ8¯Yl>QÓò‘ÞÖ¨\.üYÍ/³wéILÐU´ÿäÏ‹¤~xñã6¿gþõmm¾É¦þàû2œR\ŒÄ%êÄ>°­:Á X €C‘’ÌÀ5q\F¬ÕðËûßïÿi[w™gÙÕÝ(ýþ çž>Ï*Ó;—ûé¢$ŒE[µð ”zÜÈ9ü­¶ mйÊrí ÕlàM±Êà¾öz“w‰j]º¼]ii¿Nµ<̺½úìÏ ×iMå_-ùÏdýÂök'8ôún|A"E'ðîÈùÕ!Uï†û)0Zí£™›ŒïâWº>½L@#1Í\@øJÜK~Hªl>¿ÝÀº«)áÒWQ›Ñ ¿7Ѭ—Ñ¢—¾!ªó+æsK¯Ó…>«Ñ¢WƽÂgàŸyÕ•[!«”¢'³nv@˾nbñ´Zûذý Ðí?Fy¿±Y$c(]Ùt 2ªý5'œû×k,IÎÜ?Çx9Ù]™Lf„ÜL¼(ÃõádàØŸ.…†Ú ç'ƼteÖ6„Þš:\¡7û{x5F_«Á8‹©µÛ.oøXc÷1ÒC:¸ÊgSZ²ŸÌJ èxMü¥”h.éèÔà×­ú©Aw±2"g=r¥Èô“gⓨæ UÂ.¼Æ‚RaJö;²Ç<Å»&¾³‚a~gμ@'-õúH•Y@qõ~Ý5«§±‡BAªZøô“¶D«ôÒÁ£zéψgC`G$Ö/?N6å›ã«*~1Ì%P$q§‘²#m·Þ¨¾ySwØÃt¬-àÝ;ל¢!“â·Õ6ÛNµŒ•û}a(_¸^žÑª1^j²œà½å(ÓÖ¿‡!éõ%:gàu?ß°*~fÜqÇ£©—ž­‘Núï{l\ê¡ 1_Ÿoå–:jòâù¶î·ºhQ;ô'|V 'C÷c­¼»‘þzé$ç!œ(K ,€{ «,¯VåV:Ò§…ŠÎÌRkï·Ózðc4C¡'Yq¤Î‚“€ÜðnN64çñèŸë邉Xþ =!Öá%?qç:êíìp#V†/†HmL, €öSZ檑“À aN<ÚÿÞ$õÑ} ˲'Ôrü:tLj<ç}þ¤l×ûÛߘϿooý¶ª^€çvÒU±=èâKÀÉhX ‘*¯“î)ÑÄom†Ò» >XD蜻†~N1“Ê[ÿû¡¸½KçØP¶Ã¢î‚JÞœùf§ßšÏ%bÛŸŽ]!¥c†m(¶5ô#ð¢b(Ã'×®{ƒØÆ„‹½Ë°úRCmROž*6 A©À,×Êhºžá´3J„îPC+áíeÇÍ­ÿÈ'äÓi±›=“«ÀÐõ L`ä]°a¤ø‹ÚÙ†¸!Â#bÅJ­ü†K@E¥•ÇÙsÊÏA§²Ó·)>î×üÂ7ê–’È ¢,Ðmý\O§žŽú}©Y"—±¦O‘è1s{Ú{´*ƒÆúŒo2Àª+ÊÑ §öDŠß0‘w‡vOØI·,½ÓÆ6Ž×NÜL½ºýYXô]‚Ë|•çT}a£¦“‹‚^ŸZ«C(ÿ¢êí?ûäK³É¼õ§¶,'­·åƒ•TNç/å¢V¯½Ëgþ½“Ný=È|ƒ÷R…*+*tÓ VQR³ÔC]·DÕC#Ã×.Ä€°ž1e…=-ï2Ê}ÿ ¨øFK[v".áVµ{Ê¥‹:Û”½ét†áŸ^h>è¹ñgºYC“i!ù“–ëk€j¿¯s© šQgƒ¦Î0ë3Ú>õÿ#bÉï%ÿ,°ÆÒ¿îX~kŠ)§’ÉÀ ®õ¦“éäT®PíímwwX¯ùÉ÷H²’AŸ×Ûð˜DÈzÎÜ*b)XKfºršLUç¼›G 3Š^y‡ÊY]¼Ÿà©õqfCoÅfp•çŒ|±ýV¿£øO5qÝr¥¦ÅºÀ€ñ*~Jßx#H*Þ0‡¹‘ú„ÆT÷/_%G¸lcGÊÚ¶°4¶þ=¼³ gOeß'`ÏÄè3úÂÏŸãÃtØ^p(K ÆÛ߯¦‚²IåØ×ýÔïAºCð×/¼ákÝûˆ£…÷W^fØÙê¾5LC[Yò^Ÿ˜ë§Éïš‹ÆÅ>ztÒ˜u|Ðê½Ï»'—S˜¶²4H˜±Ð«TŠK¾/I¦ÝQ„G!QÛ o÷a¨OþòÚ¸Û>òÚÊ®Qž`Zi·*ÛØ¼4 3ˆ&?⣂nÇ/6ç+‚]‡3Û˨…Ëæ4Uñ,3pØÖ–4'ZafÞÞ{o÷Îóë.´]ˆ)¡¢M“?.ÙZ-ëò©œÒ˜ ¢;o‹–ò] Ÿø¡@×–ß$ÚêäãÌ%NI?™ö&cmÊCåZ‚–N—qgʱW }ýk™ÛjŸþaúéõçoM‡Œ¶{ßtä+2ªB'b‡jV3ôgaöÎ$ï"®Æ_ªóK‹ˆXµXýãëš)+â\çT€Å@гÔtÓd È-UŠ™K!_ç£çÉv‡¤ù¢‰ãyÐͬ€´.Y/òù\§ ip ÞNX¼øö`‡BÅ<Òïdï@ÐOÄŽÖÃ`+èj^á„÷¾ð™„#a³ñËtóÉqO5 ¦î»+CÁ}LÀüNI‰)«”µ_¦ª··‘ÄÛÏhn›J“PØêuÏYà»ünzΘ¨#\…ŠHâÓ@>Ý{² ‹(&=ÉŽc)VFîE2uŸÒõ²`Ñ ñ1¦]LæteºØ|Z†š?sÓ®¡T|ÂV^éì꤮%¤ÓLÿ4Ó-;Bæ´7”^²ÌîõØÇ»—gŠj!š65ÕÚit?_òë2¸+¬Èºbp.ç2¥°¥'kf:ï«1•XOµj†Qª"}_wFÝèKÇÁ ËòýÞ­óÌÄÁæ/Î|Dį9?¨qª^eÞÔ¶JfVz»&U*>óM€¬®«ÆU’’ÔÓh¸] 0ž¤eQè&tbÓ+N¯W²Ä\Û­‚¿FZ¶gÿ±Š¿mÏÕË•N>Ìë³nö„£[yˆBX)q‡di^«‡p/Tª:Uk&Ù–Åh«/7¢Qôø’rmj·*¢ð=$t—Î9™TÊ…%Q1 ,±¯ ×B_‰ð…ê c€RF- ê‚÷í‘?- •bn¤Ó¸3&9'åHÉûµ¨õ„7´ƒ®×r;íh¡“ÅhMÄ~áƒÇ='¨‡vb(¬å[㟫ÛÓèãƒO¬¯'Š,¢»lÚ£¯-ØWŽ¿ÖÆFY¬à1ËH1ëËXjél·Þ¦I¼!ß߈¦49{D«Õg£¼å(¶P|Îrm èÙˆÕSGÏ%Szƒ ²HôÉ/$0œ¢Nï·QØž+‹èŒžù¾´ˆ”cº4 >—î”™–’2 ¾V$"v„¥õ7g²dJGÅ–7Ê_˜Nju7îjzM6ÈnSRB¨©¢8ØÑ3¨y³ãj^»w‚£˜¯T­\ŒY¥Ä'7«Pd{P´v¸ïûaÎæN쾖ɈÜD¬Iò¾½ã¦¡éu]•€‹Ì5øòöð @œÀÆ¿NF³4‘—îjIq/…«·Él²§õŸ¾<´ @+xª*dQB°ÂÌ„Óq‚¡J‰*S˜=`1¹ùrZ× Çæ®ùăR ¡Gê©+µÂH[ДLÊóí¶Ê*݉µ³}„tÛ IwèW÷È[›ødìÚ~á¾nU¨ü8Ðà `¢lÆ'¶¨ÏÜŠ†Tóf4bq€ÊM6`'y4ÂYn^8ñç²ß‘60ö§}·» ¤âx)Ìn—lÒÃhÂãV÷»í2ú¹!MÄý„ªÛÒ‡ù1 òžŒ?)¥rsØÇý´ˆÁ6É&(Éö•‹Ÿ¡$гç1Atâ*7€€ýK·*H@¶Z]!‹~•W™0xs–דæ5ƒ•"ÆhC"¤bbŒ0Pƒ‡Wõ1¦éݪ>ÀÍsx| ±9hLhn‰A¥Ø~OQ³ 1`«0™ÝÜ¿¾<ƒU"MOrû«æÉ·«­E^šõ6X A‚Y*b.{¬Ê’íVgm z^jy™OÛHÔp¾Ú­é¸Ï·šŽ—Ü}C¹€þF>¦R õy90—l7²ý¨½ÕöÂ~4®²Ú'B>j¾GàIx\ ±:×,rò×ï‚t²“k»VHHÌç%'Ö©9>z£Q9Cޤy¿=§XË[3=nM¾†É¡æQWbŒ`Ì?iÎ-Ú‰¿…¨Ð9Ç£Õ”¢ØÖ¿—{º¦!¿íi·Öa²ˆ%ß%D·»KÏ4!N¤Ø|ÓŸ¹š.˜­1«nÈÛda„8ÅSÀnÔ:þñ·Dƒ° rJ9ÈUÄu¼ÌF×Ô‡¹/ Û9]z>1^{×cÄR¤Ý>‚ÔA‚ÆÐl«¤•þ„ƒæüî™k¦Ñm÷'bMI¼3è+ÖW”Üo^ ;8 ½SÖ¨/FM_ÀeÌ;Iò–Ëœz,O¼Ñ/ÖÓm9º ôâÆ~ŒØ£å/Uú7æ,ùFSÖv4ç¹XŽßVnVë¢Ôž÷ábŒNuж/J·ofh TD.»ßä“OÜg «@Òg±ÞºZú"rP ”ÝWÃæÍŒµ6”ñéŽÛ2¡kõt‚` Tñ,VZÆö©j’„ìÙ@JÀ`Å_ƒ:Úî»dþ·‘6R‰¢69sFêG“´aç"Ë{A4Ñ^zýk]UûåwÌõÏ :ž­pšÖz˜N#‘N›ûZ§îYR4ª×ú?=:õhgwÞp›>©œÁÚ9ºey´™âìÞÒ·æj×ušï–¹á\¦¡ToxMa1gJ–Ä@tW¸òÛî¿9Û˜¬!ïßi'ÃìD¾qyøê“‚,<#S±µº\ùºWÞ¨¾Aû°ÂANón; .eö¯h6„½#î^þþC‡=*%½jçVwA‘vÃo` o3d®²¯{òÂsp É,E‚ ª§G*¿*£ÜvuµQ3솱o_Ϫ¾¤rðý“Øãì³Ê÷ƒ Ý×n°¼®×¥µ†|"õ³ÌeÕ;B‘'˜hØi\íðtЄUT¶ùÐp#H&©?ñ§uÚ—1çlÏ<Ÿ"ÝÃ(Ð9¢f›ÊàG‡ÃïAH£=$©I¹ý¸BwfhËÆtrNº šÿ(pîÖ—EüÀ@ЬûÑ_=2ü¦ìÌÂq¸†û؇Ø1¤ýxrfƾoƒÉ‰&_5Èlç„ LªLÇ}™ÃcX#‰Ž#$ ùÁâ‹2WNÕ³¥PIX0 ª| ¶ßây¦Ñ+0‡K˜BUB¨dE0.ê-ú¥ƒC+ ›¶€KÑÎSQåH ½ÕïuÓæ#©›ìD< ¶m{i@÷oã ÁN²'#´ÞÄoþܲqToµñÁ™Ý…íj†˜·!Ø™®HWéıž®joÕk¥þúžäªñ·/Ý{Þà;š(ÔrÇÌUÏfDû3µ™#Lœܼ7\ÀK@¤óèI“ «”_ŒòmV[Áטlù /]•[ÌÓ£ž÷r¾Ø<s0 ­!ó‚ ÍZiñ(¾†ý²\Ää|ê®ÙƒÝw!wŽ£dÝB4P|"Žo¨%έô4ú\µšÙOBa§q6¿x× Ýc{²£[^éúÇÄŒ6Õ½½¡|´Ñ°l戧+ßï óÄùtI_œ;qÍ;Ëi–iÒ§Ëpéóbv@…›OÃÐèŸøÛ>/þz …às—˜“WåÚjÁãB˽ï<Ĺ«™¡x޹æòŽJ×·ý÷©\G¸Ÿº7xwÒ€HÃD´7d1Këü(uvж ¬1¹Xô%ˆ1éóÌqÆ’QùÛ.‰¨¾»L(³UJÄ'¾Ð…ôÇv«jµÓnך4k)¶S\5^š9O(u®~$§¸12Û-ç­Æ÷g„6_ EÚ€¸ß>Q ;î»*Ï“Aço3CšH¡ÌjN÷u;›zj«–Û‡"¾o{ü'Ö¬e,]ú¥‚'ŠKSsZ¹@+Nægio˜Â>)Ö'ù¸·мW¬ý¼8'ëqÈ^©4E¯„«é7ºÙS 1H’(ïßz~y€É… ôYšwrEú·Ã^-ç÷ÊÉÎ'ê¾³š\åÚ¼„]§‡ùŠ÷xlVñ“ñ-*ê©ëc‚}ç€'??ûR/GMRž„ƒRŠ.Æã°ÂáåÃWçì¾´f6ür­®²×?Њùqñ¸¯­ŸibAÌ€[¥çÁ`ØŸ¢ t¸—B˜ f€YlV†ݵây, Uã¼M%@¢ÐÖöûé¶öYú4¦Æ8ÿP(l,ù¶+jtÛ*í±ä5NUF êS€.eÁý¸‘Vð'p†7¢¤fPŸcÝG¾ž6óz£Ê–•ÏÉÐCåÉðÿ®+ í¡Ìމ`j´JÀÚ•À`«5óBLdjrÎ[‘.µôÓØ¶²Û£¡Í|$Ùž¨dçP¹Ó@;ÛµÒ“Íÿ&:—8äÏH~ºs³•63³üyåQ DFZ[ôƒ¿)é?-ñ{µV%Xþw€Å'ò¢(½E¯5Ln ñF”Ì8|¥B:”’7"“á+ÙH3§’çäÀ¸]ßö•¬:®qàš§&©;+Kk8y#¾Ô¤¤Š!– ã>’.:·ÐLÈ#ÕDvÑn±œf&Û?× Lܽ(䱆e'm߀iÚ¿¶µ;U¢ kHèUV\mÒtƒŠA?S[qÈ×TœTûá.¸œ‹:­Ôæ°#† Êg‘¼º=Ù¢jº“Ñ%.Ošl脟¿Ø´~BLìÁB r~ òV]zßqцRåíÌŒf—"ú¸HêSPÛ}OÑþ 5âœÔ¢Ÿ®53@j˜ráÖòÀ!‰“ƒ©º5¨·¤%Iø²rgÈ£µ/ã«æËú)¶Ñ-2Þ%V rªGùïæ0GF¿þ Icµ÷f½nh((÷ç~p±ꉜ¯U=È»@·^ðòí·ñz$¾†1ö÷BœîÕãç%aTŸíXpµýÀ±ÑË®¶’@ÕñÄ×!ÈF‡c;“šÏOç—jÎFÙðgœê,-?… P¿£#*˜«dQ9©éíéYDµ^?ì„  Ôž–Å_I»"®™q#¤ÇʹrJZ±MäEäà]ŸáûVp­ÇüůnÙp³“ÆN÷´(ãø©mÛPPáJ2þjÚ’9U³Ñ¯»Æ\ï¸H/z‹ê3[®tl(Rrl3zCœì¬M Ô¶ÙÃÐTtfBVA•$4ga©ûe$>ë÷c2ŸÓ9êàË©Lw|Ñ©žÍ±pÊ€œM[&ˆI1ÿê¸ýT.ô …¬žKéìE¢CiEòU'Ä®½wF  œ)èöàÕÓýC¾(t®Õi¦o* "LóU4±5s4-*1šï/ «,<UÏ<™ÙõÂî°-ž†¿ cAsçrŽ®î@˜OÐ8Äo %½âЬæ)Kyù ¡=rê]}Tøeöص“´Ó1è¬À£ɧÒX’¿\ýf;XµòHÁÅ¢ú)òΕ7»Ü$ަœ µ«€öåæ÷©’MÛ< JãoDt(bžtܺ,½ s!²)÷Šþ2À OSÌuÃóž³l.ð ! ä¬É·J ­ò¶´ë¬–‡ë7ß¼úîÂ…D‘M¥Wô¸Z“tÐì^ÙèíK¢’ªý—»ÿ™çôÉÛ oÆÐz± yˆ¼åòS>RºË—³s÷l Ö—Tâ ¶KÛ·ìr~1ËœÓÈC©~B™OZ}Xo˜²/îyož“²+ø;ÊZo”ÓKÖÞì‡[$ïÒQ©»"]OwW¥÷«É¾r¬å4`ñ}EúOº¥ïÑCÈÁÑøLC´†ÅýMr ½•/Žå¼$ö<6šê:êøR§71ûAƒóÀ²S[6@3£zß#*a¹‹m=;ÞN;}–eDûûsNàç …OÑ<PÛ…Xé©üiOàv×~ÁOv—G"")ûKDbfõ[|9ËÅîùåq,(¶0ÒºäØ{5 —š5¶j¼¸ŠýПým DzïÞÔ.¸Câ%(ÿ$øåÚ$\„…šd½Å`¤6Q7ì¢dꢭh‹œ>!wHaû·SÆÓù£’–8–Ix"Ž:sF%DÿÀ K‰ö¤B€'`9¨ŠÆG)ìÀGs Üõyƒå9à?¾gùÑ^TýD–òŽÆM–|n¬´63û´Ù$ 7lBS Ýý¥j39ÞX^y¯Éb`5#í¼Rïô…7ÃÎ\¤hƒm¢¹G¾Æ<—ÎÅ+6»4 o©N¶Ù¾A‡BÃLI<Ä|°c¶‡¿¸(©ü"±½ý|ÆR¸ §kOìÂʱ³Ôí’•ð©]5ZXž´vßÜ@Ó7…Ò,g÷o…ýbÖxÑ= "è§«R1ÝHjü ß"Ô‹Îz07´-BA{Ü+Ø’V^ T}þ•=d×üWîf¬§Ë¡ ìx‘v;iž”Á ÊÄ›'‡(®£üïM m„O{6R8ù'j\ä¼ÄÌRJy¨’-ê&"`á äAšäO7§tdóðD5©‘8Ò­&£œ+/xÖê ÔÉ[Úß³šG7ã–½Zs² % $@(²šJé5Ù‰z]µ:Ÿ¹ÈËçh~çAl“]Žï×\•^–IŠxäOòSº™;a{ÚÍ4œlà¤&¬#ôF3<ðá qO;‡†ÅW÷û·0B·à¯‘n°¦w­Ï·2Q²D¯ù|¾ ñÃ{&;Ä7ΉÑÌ!ÍÝö*,‹sü?§ÑVýÝhJn Ò»Uþ“#”d¥óDëí€×áØñ¶'’#y¾dTÚGÜObå.ØFoŸá†2“ ²¹ìÍt5.eÀ¥Ì­üƒ5õÔÖ|ÏÄq“ò:tSˆöª;§f†÷?®Eµ)2þ\[™”¬GÜy 6{M¤¶ÉuÉA¶¬Pí#¬Â™`úûtð?Ç]ÛŸƒ½ªIžÞ0ãâg©HÛ¡¤`­²UŽ„l5‡ÚªzÎUïùpL”yáº4‡òÓ­Û³w]ÈÎ*çÚiÖjt_eì·o®4žj„VLê‰ø÷PWRÞ° ‚Øï·Ã7}f?ÐYøòKÝIÔɤžŽ´§M²lÝ\GWïËÂß |gŠJ¡}’–í6©9 ófnÎWH×*{Àóé+6銳ªÂ÷Ð’c?–ª>17KcäÌ4ƒµU!é;¯t#šXZÃæR5Þ2»ø•šhݯ…|Ô& \fÄ ý€JB` 6òo™È¦]‘¼‚)0¿wßê²[ËqšÁÒ«²EßR$_úö0ã„xèqý§?5T‘¦ð[é—•ïµ+¢Óà ŠnÉhµ—Sã3óÕbxN¨“(°ô­ zGè£xk¡ÕÏñ¶…ž•Œ¼Ó$Y Å×ÉÆô%Jpº&×3œ± ’s·µÜEFãÈïîfAa¢{x;ô–‘ÓúqI ‡ªŒ€¼åÝád"¿XŽØèT"¸">S£Äõ¥ß'ïfNÝAé'Jç·ýh‚JN@¨‘éSBCDªAÎíu”ŽgM-±ÍÍ$v¬5ûefÁÅq•RœT=I¼(B7ê*”þ¸Cɉù`²^¯{e„›iK៎¹tðæuì4ziÕ£ù¹$¼ôe2®™ýàeð„gþJ†§B€ü"ö¥!"¦SìTS[Öµj>G¯<÷”štd5;‚å¡Ò‚×ÿEF“Ò݉Õ:¿{7"Spó¹­n`5QUb7©¼ –ŒÞÍçþèâpìeÞ½;"bʾÿòÑ`ñr [E_§@pÐL„öm“(Þ¤…‚}VjðŽA®ó:YÔ: ¿Ú ‡,¾Dòé\ï. ÖI{ Ë<üjÇ!èÙ'I褚ù°tüà=¹Žn¾ÿøë7ÖN|Dm¥§ÛŽâ—•Zµá[¢=ÏϰŠhóÀí ìSôiÀ@³x½›(íåï•LiÛ¿†Òˆ¯é×&Ò½§\I€&‡"›¥Ëw–à”`‰Y¤Ï2Ò¼Sû ' y`ÉÆ¡yÖ,Ð6¹˜IÔG'„ª²?,À‰yø‹Ás<«ºj›t8sš» $ùÔ}±öí:"!—ëÈ‘»Ô¢Û QÕ ä7u¥KÕQ{ß–÷ DºÑ3ödæâ[7•ö€‘Z2 Ýs+,¸¹™Ú¦®(ð}  ÕÂeh¢Ž‡B»IÛ§ê©Y % =|9yóA™T ‘B¹¶mq"z2’~,î¡í·=)¶mŒ‘‰ˆV÷zÇüDúß}Z`iÚü:I”Ô ÔšüÙÓͺ88 ï×î]9w_³»åfðùšêšEIzW½SÀþTà'€?œômF$EÆù_¦¯;{¥ÁQÛGKD¤97³ëîÍL‹zbMÎFÍ×v&áÝBÅ3r -ƒMÙÎ0”hFBf5£!“ ïN+¿@2º-D’Sh0Òz@s½ÑMaS{%øÎ_³Œ+ö´Ÿp+CÃÄsm¶£g¬Or·Pé鬛XõžßÍÆúÕA‰_ÓÌÞn¿½©ÀU}í’åN:®'/tžˆOš²Y·,Bño|´ |,ÀÖ^2I6ûA×ÂkÚÞrÝnýPËöyòä¸c-ã‰ë(3ç ¤“‚Kî°DQ'Æh¸œÒšdO˜Tjµ|éÈ+»`¯mÝU*ydÃ| m÷é`h‰1Dê\%h¹‘°¤hVÀoÑûÉ…øªÆ9ã/Y‚Z Ó… VŒ:ˆ¹ 0$ºoÐÔ 23ZÖ¹·=p•ž¼j^3â7|hÒuÁ5iÃrè´±öÓW’¢\|$)­m` øÉÙ ôØ-¢@“ÆÐ} À ;ýè‹§—}$›I<"mÌð«Ë‘³¾ŒgH){-€‰F‰Oï<Š!Õå¢ç®Žò¾PdT8à©^÷š”˜P'­†¥å«cµ§“ ÅÆ/A>àYžï«­7©¸ká‡@& €Y­ÃþÚHKU¦¦«-‡7õ¾vOÚÖŒW|¥nf“]ð ÕmŸWí4i©xuI°7K‘1©zDfé¹ù[Ó×·.P´w¨üÈßÆÞ£ÊbQ3³ iËÁº}B®±E8DÜy³šjcë‰îM:õæJñ=þ’Á­–ë(żÄ[³†Š—à ™¥˜¦=ww´Ù~›²–‚éêÑû˜^`tâm€ГW-Œu«H€è/#é€~/Ûá×rÑù…¨åñ9;Š–Lýeçg}aÑÖ¦R8½´»ö uë»FRô7•ãO1 k@á6vÆO g£"{(Œ0Ti9;{3]¿h4@fƒÀD%C¢²T˜I(Ì(’Í‹f$8¯54ü§Ô8þìÇ<ôSª€hñè±ýØÔ.Æ!„‚IKÕ¯"}7MýJê5Œ+FZ(´På;VaüàØÖ©‹‘ ã«F•B¨VÕi–ΫV~^~IЫ ¿<ŒZÊ£w‹ç~›Ó«K<4ffY”Rãmæ5(H]GTÊ#ñ=ØÒìy¹—,uëaÉ_ù½•Ðb¡ï”ÁÂ>,³0ô­h2Xæ@AÇCjÓpn3­ø…â‰Ö– •zû? ]&~§q/‹’·)êò¥¤ÖÌÖî’(teßô^u·+޲@üþcƒtiÊ*ï ,´½þZöžJðœèį¢ÃOg¿¯¢çÉ/ÎvoGszÈêÇ ªü«¹ß ½ÕÞg‡S­z©Ú8‚=‚0ÿløÔ¦NË÷0BËИ/LÀe"3ëh#0:öô[Ñúu‘Ù •*d··›‚GÙPSØÆgö|Wïù‹+v\ìusÜ}¼TXýA?‘ÚTÔårSLÕ¼<ÕþZPܺ–=³]Jú…žp ¶wt0¹šµV—X¾ÖÔæ»¢YíŠÃË5/é8PyKÓ—õýE1H|ZqI¿Qʯ¤m÷”T¾ð†û™î„}<ÃA‰çNî€.ŠC[°/ON}Øòï$—.Òe+.ôÊKg”¨= ƒ‰wϓ؈Xû±F“9EéMmÓ-ä# N 6ãê­(’.Z1L†,±Ã@–p<®¼Þ7̦zofO{«^7_üJea’ ªàÙHù¤C}ç;bQL¹ý þBwæëEêv²ÖpaŒ?–Âvñ‡I®j¯éoÛL¤¢¦ uªƒñ:ÊG"µpn º¨'‘M¿©Çek×çRQi †g§I˜>M°3‹¿^VwH×Íþû®ºB% RÒ¶kò5`Õ}Õ¯S˜öÅ-˜ò8*;éÜl$r¢Z(ÞÿZµÊÇtj@RI\U¢ªxS$ ˆ:ÿÀÔ»^)!;Ñ`´ÎMÔlðºp.ª¦Þ7¦‘³ÙyFã…”Ì@q7çƒ'K¤VêΘÚ"zòÃZù ä-EœydÁ>u…XºàþàYìwù€¢•‚µA~Ýs±ÖÎTPÕ/1Ñ}<µxðŒóà÷g®ÁþzFPŸ*…˜ £ªäŽ?|ðã3î«”$:HQbc¯%†ºƒqÕ ©" ضg…æÎÆx@@4%êÕÔo¡ìØã^ÕtÛñÉ-a!MÔE˜G-k¢Fs„UÙŽºz½ŸbÚ›`ã8Ÿ½ŠØ‘Œüä;=ÈÚ9J]æv!BÏ%úÁƒ°>V ÛzW„¢}ÚÇ_u uuÆ2tÇÝ"ä§øóøLoUþ)®½Á3Z ¯Ê}Ò‡V™ƒ  ]¯zz Ý½Ö®ÍÍ‹ ÈÔMÑûmŠŠÁñFÄX…¶îï<Ðm~‹ËÓšc·G‚9Üè™wC½ž ¨ºóvÁ–ë€'\t%-Ä ä4Õ‹ð§G2†'ȑ憂flÖ^ Q$Ù’^CY`¼I :ûÒÉ“H趈E(HŒ`jõ½! ¾ÇŽ{yƒ½‘øb›ìG‡4…µ|€—}—ÁásôyE÷îﱆöîs'ðÖ íïzœÔƒ+eÑ~X°ÕÝ»¿Þg+¨ºx>¹¿×F*ŽwªuáÈYøz´!É÷£>f`P{Ü0×꽇ûbêÕùžm“kõt³ÝÖÿ,<¶Ï#é‚Þ­> L¬¯>?ÞŽNCãó2OöÏõÝNÞ{h<Ϻë”låK¼i)w³;°ü¬÷öt•Ñí»Nlf(ÒG¼·x"!µ' ¡Éã%åšèÚmÃ1R[íÃÖƒ\¤Nx‰Ú;/ñ`b1]-ô]EftíîÝ•ÛLÄ·d<•–sFQȉzêMnb6̆4vM­î#ù÷ZØv¶''dÐËÕVù™—í¦>×ÑE³¢Â E§DµÌ½ž¹ŽLió1…k€ù-¶S¥-Uï e±Ä–” êŠbÍ›o2Û¶ËyΡ  è¾ò|6H¯ZQYk²8W´¸Ÿ÷(3ž¤‘Å \~>,Kß+Ë(ð¡õ¼{þõÊc<>Ý”-Ù¾*ƒœÐž¢[û;ÇöéæÓ7«‚ ÛÑì0‹Ç¬'…?¬ÖʬDTžMò¨Š¼0wól«Ö}Á,€õxÙÄïs±ÈÌi©+ó*—R¸€~jÄ^6i¹]Á¿"]„¸¡(²\B|DPËLU^’Fí…À Ó g³Aó[D ÛÉÓ Ý~—ðT ÊYp®ç~ðzø9ýÙ;5oøñ 3ˆuqI£@ä ü˜óL“ŽñPæºr–JƒP–0 «ÄbæŠ$¤°°Äßn¿äë¾ÁºK´Œ§–úQ¶¢5ºûù.ZýJžý¡ü`µ¼Ÿaùˆ[(ãïº×ß|û@…Ú“•0QýÊ~\Þìfƒ_Å”o®„ƒ¡Û9Ã(¶ª»­ºûíùU«d:Oï²çkº€‡tF8ÏÐÅçÑàð}j® œ=sxû¥¦sl"òÙ=ä™`!—a¤)‹ggiÉô¾TY?#»óÒÙYaP'tÄ×›fN¸ÿ¹ý9¹ ‚†ý.¥Òàbão-­¡ÐÃß—1Ôº$m-ƒ4ê¿Ò<=–,}]Æò†o™j©×Ò½ÅLÛƒz¦ }'TB†Pzi‚¿V@k‚(1•4dèj½â6S WÃq7Dýï”}ª–[+¨1Þwœ‘-Š1(R¹ Ï×m6$YòX™Àú¶ø ñLýúâ–Òò%îï¥1è³8LoÑŠ´^u›»…߬}òf ŽH3FJœ”÷ÅÁVÓ¢ÖÉÑ™_ßtœ,? ȱwÐý1ŠJß+àý~läkädzÇS¹x˜¹ ÌBÏC@VN&Ê[݇?ä>‹{ÓݵâîÁÂMá¶&Û¹WQ‘ŸðõPûŠ¢_Eé˜ZýÂI8=¿åy¶àµ_ð?üfa¦ä+P¦ â‰Ìr5اùçOLÙÛ{íQ…åiéð—µ ŽÞN‡qEÇàNmòUŽ&µ®÷÷'ÃSŒŽìL+õ×U(—¡Û(nûì«k@dÄ畜ÌS¸jtQêtõÿÔ"ÿxÔ—sûá™cÌ[²yêéâ̹˜³¼1;{ ”YnfÜËÿ \S€V˜ÍÞ¹[{êÀàöàv–»$ªèv:Aðþc@™Z‹×Õü˜{t—®¿‡xû ×÷Oò·îºm ÄŸyœŽd>6«²îü¢þH2»R{·.*ΧdXׂ°)i–¯{g[‡ KÔëÞ[)Mö´wæ“ ¨²/(Ø•aÈ2<¶ddΟ¾^WY:Û:x`•p¦«€@¹ …î#­9 qç.V¼8GíâRº­âËoôÎÄ”iz† 9NjîXœÊ#™Æ`Eÿ•LàÄ/‰^¾sÞÅcwêwVQ¿¯ÔV¦ï 3¾Þ sìâú™}ã Ú®/z%£¶2yWp!’M^nl…å½Ûǵ'Ï/€óDq)5ë9°šÌFðx;g¥ÂkÍmá/M>Ͻ>còϾµ˜€ 9Ëÿ9­äý?;j”—oïÞ_ïlCža} €h^>X Ϊñäó\Y\O’ÊbˆÚÔ öÊr;w¡qï¶*¨:š+ ìÚšqUÍHŸ±ýšHöXkñéÇ9¤úTÈ'éS¾1@jàÆÛk‚‰• ¦7;V3ÖdÕUoƽ.­ž'P‡3¡;”à÷›šUk‘RrÛ'u»à{¤ÂX…TÃi­ô þŽé>~@( R#ÇÙ›Ý(%›÷/ zÕwïlµ Éxó!Щ-yå_ݺævAÀž @½j 7zEVOåTrOGc)¾”¶ ¤¨ù‰ûð°z«l„–J·~}s& f¨²ˆåm¥`¾ÿ&Ì:¥<¬•[)ZÚÛ¿UàʾnÞeŒ½ú¦Wѯ™Wj3eÚã™\ûí=«Îc„nuIŽY³ŸÌœs‹‹k^ÒÞQÀÅæÌÂJºv*à/~«5.¿_éCûÜíBÍãÚ‚@1Œ-j±€âb"²¿ÕÞãQ*ZÅ<šãÙeRsUj(È ,#k^×}qä©èµ/Øùù²àúF£ÂFù¹­yÿÚþ—iÖèž+»Í¥~oà"ìªe qQÉÍ<øY>ï«é±1ƒcúvÞf˧ÞUE»hx¨éÿôC?Ø£sòŽL؇¿íݤ ªudKÊÆïO#¹b l -qîásž)%µÝ÷ækî à¬NÙøŽ˜ÿy·Áãùåq“19?‘Šú¼‡?½Ëå®é[’ýXÁôÁ°вûBÞÿ “ Èu¿AÚ™Ó d“ŽšÿÂÒ;¡v"~eåÙw‡§õ¥µG–ºBÔåÌL¹e™‡‡‘š¢SFäH ¶ÙÂA ~n¬ɨM…$ö,rê`BihKzùkòÖøL$û tw$y /,¶…(ð~øFÎ˽@HšŒä'$Í 5KéµûÂ>ÐÎ|Wà¿G‚yžÉû”4g‡nþžYzC±™”Tzi”K63;PC@޹£sj«pmUÓæÖ‡.¤[L´ÿ:¸`¼ã6ÁKWÊ…y,¸vx»³Šz{ˆËü—lÿÒ¯ î¢V”±‘‘ø¾Q&Cç°»c4—>,C_„|™öj~¤î˜ßuz ky ½é†-Ž_î·2 xMj>g÷±—íÒ+Ú*–ѽMWøAèæ}y0uðVºøÐ)Œl„L5%CƒôÞqñú6ÍŽUÌDb¿­“Æa¡Kª>H[ÆRô@æØPL9ÐÃro¾xªÍÞü:ÄôRh|üÅÃÍ ôÊíËÊ£õÚÞ—dÚd†yH{iԼğƒ<ˆ@Í„.ã ŠºÝ࿆“Q}wþÅú ?ə¶Y} Â(PÙKœyƒªä‘ÈÓp\ŠöÈè£; Nó,u¬6 %v*º€ü¶­UA/Á +¦æx^!þˆR"ˆ½Q3¦´Ã1žÛ‰=¤˜4‡'fÔ–7KmÛV¢P+ÑÏÆÖr]m„h ¹Å(§”à¡Gb^Øþ`£VŠ •v37Íl}8b$õä–h‚~Õ}”'ý°Š^»^—õþˆÏî"¼áø1²ÿÎ;ÂD–H­}C½6ý—ÂcáJ.Iš¢aÊý'(|^Ltâp«úúµïhH¼uO«¦Ög Îø$ÅQ`H@‰´N üôðÖ –3azÚ&TÕGN¸ê㟤5Ó¢5ë©J#}™ß?”ÖHˆBìã0)Ð¥wo(Ž´Ñ07È<Ù<5°eh8VmüèãKç4䘌úǦo•ð)à–O´(¥ÕÛ· ªÒ«" ïþkÀœ½½¨U¼MÚ“ó«Ÿz<íÈe¡8PÄm¼áѺ°Š€Œkqà»Úû/ÁŒj¾´·¢ãbyóì!ù&Ä :…eB­°Í&V—I /ÌÆ÷úå'VkÏI1Fý$¶“Xºh±þ-”Jæ¢ ½¢Õ©C ëÕm©é”³­7!M8Θܰó|yÅ”VÜD5s9w¶¹|¿÷{:<ç°d‚N£«×¤¿~B­ðN·_øØßýto"´p6äKI§.°WæËynüÝ"$-ø’”L«%àèžW³ÉÚ!–Tì¿O¨ØÔî9qlSëo¬ ]ÝÏ9ä¡;_êzÝéØŽ X{Þ#Á÷Å€“Ο•˜º=à*£{YpPîˆÕ‡¾s@Qºð¬L¶ŸôÕ×ãºÜ%"ÔbæV½Çt’åb¢^\KÜõB./h¿‹¼³9Jöj“Š_eT”‚à”ˆ›ü+O °ç}ú¥i³Æð#—mZ·INÄtOA´¾ÿîŸÌh·è°J·H#bžóƒÏÄ*1¨é^Iêí í!>ÿî˜,MbbÈ„óIœ|g#úÉš´÷,/@>)M±yË•ç¸/z·Œ[„°\k8Ê#ö< ûkJ>çÎkN#Ae¿)jy)?sèVôÖ©ÃÀ²Ÿëúµ•û¥s)TÿÅš ‰_;uw¶ÁÙc¼BZîæˆýµœÃz!X΃«ñôùëk>uDš÷_ÀÿE±2³‚†N´‹?Éë¸u>¡UÜTg ÷r®„2I¦g(d\Ñ~y”|š ȶä1¿Ò>ËóUWbˆî^2žÑÞæ¥I§¸Ag·Ìš.s[3ëè”ñö°se«ÇL¥¶|ã«Z•`9È‹°«dXø¹c Å:u—x~>ŸÎ„Þ.vŒèî'£ü,"¥2¾ Ó–§Þ,£/:x™”ƒªÔýGÀ:D{¾èäÁRHÔÛH§«CS”4öfY æPË bÛBÇÒ TÒü| V{Bóå‘Ò>>`uA%뤞P¤ÕGßëGBÕëæhe]Ä ý¯;ÏòïÂÿ©p+AéßËç”$²¶ç^PÑëßÍZ†V¬¢Wšœ¾ˆ7¸¨¬Ru=´§OxE­½Ò˜¶rTþ`‰µiå9Å^ƒäRÙüÃ%þÐ1/÷€]ù?{g„²Ù¬“}¾Ð…2°Z<™¬Ã¥˜¿]o×m}™|QìœtTÍø ˆçHÏÇ·!Ç÷ šaÂͨ+P6¼dTü‘ õhå}H^F/>HËü¬„ðaEŽÇ˜dUÉC°Ë<ýióõ™@ha‹ûW ¨Tzfªì— ÆTú àáWžR/þ „ÑG`¶cšµì¶ßî/ÃÜn:ÑEv d$DÇ4<ûÈ6!/v=Ž•i h⨠9ÛÆð}èPà-Ÿ„< \Op ·©ÿÞݬµàQ雚$óÇDþ?kÍFúNYm¹MÄÒÐK?»ÛNdÓ)š.ífZ2½‰~Q‚uaþÉ­§§Í¼E*z‡í‹Óíª•#û‡ÕÖæ†eþëc±ƒÚì…ò(l%¥Û±ˆçø.×õýjÆïÙD7)->]i.RhL‘0§(a1|ÙvÛ–êå·Ó€á>ŽêRâvþãª%öâÛÒ?I]ô¬D9N ÿ""ÌN|§gSHJ¶dbÊŸ¸ÖJp¿„Û*Ù;ˆ×Q¼Øý {n›âaÆn ‡´~®î݈GüVoO'XFxw¹‘(ZI·| ¥ãÙF·©ôqji2iÝOÙJsò|û^iùç¯öʇ´=Ãt½5PŸøžžñ!€”zä8اoHÉ„ô*®Z…½„ìS§4[w}Ï® æõºÝ» u\3lV3vÂ핽8kޱ± ÈóÇÿÅ#)î¯UòƬ³PëV‚i8¿¯”„žA‡¦ö\>VÃktÜsAcHYÌÖ¢·£ã—E{áoQåÑs– ŸLÛQ…dùÿ7ΜÛ–«¯7hù²ä;È ÏQ£MðŠ÷[޲ö>Ï8wÿ\TÖ;¬¸aD ãð4&î\ãŽr'ã_9h#¦}– #^¨Ý”¾Wó‘}Á^®ÛJå§ò½”s¥œ&xŒyÔ'‹¦“Ð!‡’ ¯î! —%ÉŸÎ‹Š‡+¸À*áÝæQ òvµýORp5Qk­€Šaëg›–u¿z!abMìâ@m·¸é{Ð…ä˜.Ƨ^O”õ>Ä‹ÌÂpkÀWÄ8¼¡û7D^¹± a;uA9‚Aøˆa]ð2­sBbD‚¦Fv;†”4nÏŽòœ;ˆ¨éyæç~Ì «¦WIÙ÷%ISÙ„#y ¹o1Ø«‡sêÛâl–$ÿ—\™…PÈu¹º¶¶ ?úà°žÆÊÚ:Wfý®FÑõwi´" Ê„f»Š 9ÒíµitùhÚ¯Dð{ÁPFÍQ1ùc (Üo(‡¤è6žžÁG$gαàRË Ûï‘ôÝ=„\—®Æh€`3 è¿Gމ«Ž¤1Êýp*öÙGà>®|T “wøžC°ÿ:á0†Ö8*kp‹]Z1Ü·eßtÄ¥.ØsÈR…†×ПßÀB÷Q¥+¤©p¸Ž^’8ó7-ÂÿõAž%.c l«™!ÇȦ,ý0Æ_ѤvæeýØÂŒ¦{–ºØ™$õº¡ÍKylzËá=P¯«LŠØ'{HK5:Ž®'™öOvzp Tßkoa1°ž:åå W†9NSlÿ,PêåeäÖ;ÛätF#áö?ht«ÖH-û­ÄÞÓ¬DÍró¾F·´¨¡o:Î׈8¢fü›³Ú1ÄU‹óFì¥Á*D®/ÃЧ1œî!®ê*Ùm8 ìnp;ö–DB(47·þ鯭ôòºAaW˫ޓ¥8÷ò„¯™K6áãAÿâp¬£¹ Aá åUÞ1’”&c)±Ù[çÒc“gh„Ri€o?‚ßx†> ˜`SÂH¾ð Ê&¶:2™¡%Ä.ùñƒóHI†¸ƒîkºÐ}Eç³òô[\b&è"··þZßÅG Lf¿»À(R£ºt~±ÚE¨ùç†@+–Ò [f[?ãþ¢µ°KjîóÉÚKjußm€<)¾¢Ï#åÏ<¯Y,)2/ò ¬Q¶ÑpÛâø;`ë»A)y¢¨}íg†…eæCÞ _h÷«e2£§¢_Øü¯ãIœÊw}¡ºL¥B¬Ÿ^dq¿BýÝ24ùéi²Ò?åìþÜš²~"@q ð’û†Ñkpu‘+?d”‰ÈJòœä-`×9Ãó:F°Š‰å¬ùUT¿ì‹âoWÆ3‰/zξ¿¹Ã‚:i.'CݦÑó(†Û©Â" ÎSZY&8Ú?Ÿú¦¹@ †Óm_C}ʸ~ï©)¬Æ²kú°¬ôEQër©tœÃ¤*Š”·Ó¯óÝCz&žÉ f±r݈ê{¥5l¹æ‚D2E{†!9fÒNî‡(§.EÕc çOõ,»Ïbï7“”®ºšñ'û÷#- GÇÇ¿$á® òáßë–N5“ïÓS޶S dôîwñ¥Â¶Ùæ¼ ©1q­Jñàx­‰<ÚppD‚îlË~Dœ$ÀÀ?þ…³]ž¶·Ý¿«f/£Ð1+ò1í„Õíëæ*¿èr\Þ:¢ôâÒ ü&í'qößϵ\Sä”%ÈÉ‚*xÔg¬‚s‡y*U\ÊZ×DaÓï0¡ô­’ŸŸ¸(,=˜I­Ô¤ð,u¢T⮂ßФH‡þ$ÉøeTæ1‰F­ º§P8í†i’‘0ËìŽÔ„4«—:b±¦Z‰çv®¡úâÓA~y5Øãez„žlgË®FЉ iwPê`æ˜Tù©v§â}àìÞw‘¸¬é×׀݆-«˜«`is’;“Š—ëQ–õììðÈŽ¶þ-wÃ6ÏCá_$¿¼k9mð4OÔ;žëíU~h‚AG 7“Ëþ'*ԩܸ9‡Ií·µk‚œ²Å_>ð¥×ò)9~ê Ý-ŧÛP n–$Tc »ö0å¢Òí|¬ü¾Ã\o=óhþ<¥)QÀ1Ze·Û°‰ª•¾Í2±ÒÂrtÔXŽ®i1?ýꤼ kC~UQ¥3Yenã,gb.×…`%Ú¿ÎþÙin·PT÷€ÀíØÝáë7ÅMÌ:VKï' Ï­„cÚ ‹Õ¶–}wLôš¹ÍQYº+]²î¹‡I‚è/ƒ&5GÝVÅ4Ç—âNý©Ü ñžò7¢fÑêTNdT ±”¾ðãgÕÍmD¿˜^%í2o«¼/©e¾T™Üí³'f³™ ©×ëÚÿË}˜¹‚ê‚ h ½^ùí3éjy‘h¸ƒ¡¾ƒÃKÒ]1ÂÚ<ÔBžéŸŸ±¨@¿­‚¾`¨>Îü<ÚAÜIû´«~ŠüWÅÛÑÂJ2éÅ¥ß0ÀßÅ~ÄmkÅë¨ucÑTç‹+ zdnþ 7I;eýŠõÚ*úQðBí±Øé ÖHq¿©ùä¯wà önO{j14þ!g›émµû¥Ä„S¶é±ÚåÄþ°!kœ€Y)#¸ÃêöYÁáe ž÷œo Ô'îïuíD…Ú2åÁXÌÉWéjÛDÛ†Ÿ¢9³°¡1¶œ…’në¡ÅãÐíÇq‚ÝcÖþÍ@f7®êDzD9$ƒ¼rˆÙôæ„T¹û»ZóLùí´Ó1y”Si PƪúM¹¶ì ·ÂÙ —¡/Ê ÷'ÏG[l­VÚ«ãj{y2à¤eË;È?¼_·õùPè6´™òÎ/ÔÒÈ•íhµ9Ø-‰ÿ¿|H.Ê|%£åPj‡§Ãx÷]6b7MÜíÑéÒ²d×ßÀª+îÛÏ]}$è#p5œgÛ]¶­ú' þf@?âjp÷ZˆéÕi¤µ}$ù Pk™ 8z˜³ªÖþ¨ÌGRš>âw€|ÂX’véß *ä—„ÓÏ,t[[üUð2” ¼Gݯ|›Kÿ¾Q“#)9L¦ê6õTmÅNM±WÓ”9®–kñ Å_­4¶>’Ã4¶«%½MyŠI‘wÔŽN]úy &Í…|¦ÿý1Ø&%+;atqáã*Üy4><&`Ï´ú’ã¶à@8w·¯¨Æ=4žüÂìáЊ =ÏÊpÛᣆÖ^ö“/Íçµw«n­ÜAþ¾¼Ëì‚"¥U~RݳÿnTÜy¼ù7$°LSHi˜üÀ}RÓž©:róJö¼:‰… àJؼqÑæ™DNÏgg÷ ¤båºtvÍšó9ââÌP;dsŸ™Teï2ÛüE™øÏzc¢mÁKvxübóÇ » ‹‘çþv1?ðëo Ê~1ÓOÜü)(¨?‘ßèäh@8îÕÒa¼ÉÇhé ¬‹AHÇîý.hêQ÷ÐS¸½úµ2Wï¹/°þ%&<D~ç÷ ?E½mðVÊ'Ÿ¦NL !ÿÅqµ¢<½-ûm4üð‰À]TA¯táÙ2ýÍOZ«±m‡Z.9ÊYÇ z;2`-þGGBIL ¬Ãw FÇý¦LéNö5¿—Vžúüdx²xæèݦÂ|5P¸ãyL¯cV4{æ†'ÿ!ûVÃÖÑÓ'—].«Q)³Ñ_&‡ ÉsvŽãtíÿHT6w`ݲwø¹o`yìÈ®šÈÞª7éÝ¡›t%ŽÆšu…ÿuRÜMé^\è>Ë–àº'>t M€­7´•óHm— w´ØŠÿ5­x1V| ±5¯þ® jþ½èc‡sOós»ªFè5ÙPáÖAÐ=GsèâÛµ·užßEóê‘êuW8bZú6çŸòÑÒ™ÕxlPA¹æZ¥ ™'oæ.PJ†o¥åœ`Ezn&›>f›)7§ÏöúÓðîý6¿Y{sÓŽÀf¸]¬~éû±wGûˆTT:ÿ •§ƒ}QK¬[€§×–ÐßV¹•„L¼ºs›‡Æ1¢è¾ýVçÆôÂßëúJ$Ì;b¦ìSÇy×éö©*+AT„X` Å»£-?Ió¯Ë÷¥³úLc“Ìô©°²Â?šÜñÅ ìË×Ùb>ÿñ†’D²êêº&Žþƒ5fý•Ø6ÐÕ*'ð?%ï­jIKÒ׿äêëµÜV1;î¯Ä8uIÐ^IÅèÈàJ] TÀ¤ÌÃ÷'÷ÌT¹wû—bf±œSdØî`Wô¤·=ä@ù_½ÚÅmƒi¨¹À¯:?™-rÓ“b¿Ÿÿ6i®anPÅñ%é¸Âð¦ïœÏ9PDØ(ÅÙƒµÛê!×BíÃFh‰/pgrðÄÈGòƒ·¡X÷]ÅD@ž±.R£&äü¸ž³ÃeýjdO¯“‘«û1'é§GyqÍ’3ö j%Ù¿Äh9’ÝI—v šîô9ê¶ÿÍ©\(È/X(¥(•ðþrZòÍý‚W;SØØ½÷‚þPK'„„i/w°ShYüúÌ‚\·í<‘lYt¼LÀÜŒöé^Í®c9£Ú£S6sW‡«…Ó6^ Ý?‘pøÖ“û-¿÷;HOµJ†7»¡ÞÐß*:ˆlÇ\8_Xž><™Å4Üð;ŽzÒá²,¸¿YXd^Ë`[±ŠÔ Åò“ä=hÈÛ„_Ö€ãSÙåg“Þœˆƒ¬9ƒß)pžÛD/†ÄËn»?Ô=Ù`qEE‡¾¦²m¥*Å« ‚ä-gfѶøl«‡O4=Ô®µçTâ3‡‘•»9 WKw›ýꑟØ%—š%Û§uïú­)mZÇënŒ|JõU+í¾øš^YšžuÏ}6²Ô´ºX°®ø5€ýÖÑo~Éj0ÆÚ¬ ‰u:¼mGj>^$$>H†•vðÕ*š(úŸ°—ç¸h¶Y¨I”ðB§žÙqÒ¬kÒ‡û0óÌ Vø ´Û*Í ©«U'˜Ô•»y.Œ9¶Ü  ]74õ5 ¯Y½¤øÏõÿüeçj <ðxü°³ìdä€ÿkH’.99ò§”‚œäÁw)Yكϣ‹BJJFVNV^AAV†BRJZ^Fš‚Oîÿ3ÿýò|êaíÎÇGáèêêûßâÙ»?ýw0ôï½þÑþòÿsì/óûÿ;®´¿ÂÿûËþÇþÿŽëí¯ø?Çþrÿ±ÿ¿ãúGû+ýϱ¿üìÿï¸þÁþ²’ÿcì/ýûÿ[®´¿Ôÿû+üÇþÿŽëí/ý?Æþ2’ÿ±ÿ¿ãúGûËüϱ¿Ôìÿï¸þÑþ²ÿsìÿŸóŸËõö—´þÒþò²2rÒ’äq’ýåÿ³ÿÿ[®ÿnÛGÖOŸêÛ?7rzìùÈÚÃÕ]Ãõ±µ“ âäòÀÞÝÉqt·~ò@â±Ýÿ¹uÈ–?´÷¿¶¿ì³¿´Œ É%ø$ÿ/Êý·ëÿÏí/'#«h­ `#¯`o-+§ kk+i¯ §(/%kk#k#«øÿ4ÿ¹þï^ÿÇ¿õ“ÿã5þßÅ¿”‚ô?Å¿‚üâÿßqÙX?µçs·w°w·w?ånoëÁwÞN °SùgO û Ÿ”Œ˜”´œ<Ÿ”’”˜”¢¤ä_“¤Iî#÷Ï“4ŸÙ»xè¹:NVS$MT“–U<õÿ´äÿ¹È×ÿ§ñÿÄÅñÿxÿ}üËIËKËü÷ø—•’ûOüÿ;®°;úÚ §Î£‘ᆎ†!鳂‚–éÄ1Òݽ ËÆ¤ù;zÆš"Q[[›‹ë ÊÎή««SVV¾{÷îÜÜQWWŸ˜˜@£Ñééé¼¼¼p8œ4H$2iT“ÈQPzêQ\™tøëÇ| )¿S/ òb³¼7<º¸þì€+þ9TBϹæ–L³¶ÙÃ÷ꃈÃÍ ˆkºÿ{_Éô½y¤35èÇ<ígá7¤v­î}fÊ2ÙM–üEEdlºìžÛïå÷xòDÐOÐì¹§û‹‰gö8É•ŽwE¾Ysî¶ævxÆn²þZ6‘ý¬¶wýþʯõ…¨§[’ŒÓç||óš$Xó¬<_žGî«€ÖçÆ~¶¤lë¯VŠí“lÎõE߀ýnåe†x¦h_îž'¨žõ{_uíž÷|ÀF×ÜB,@éD™5R”Wuç±E?üIá¾,_{©ë⑆æØYÓØúnw[ñƆqÿf^p?Dere¿v±s÷”ÖþIÜ×ô¯/b¿ŠsºžEú¹òøÍSYKR\¼ä˜²~¿øä½÷G£-8÷Ã*¥i¤ö™²:õ™fKîGºìkÕÿˆ´÷mžK;ûh ´qìÇ>3§o½ÕÊÛ^ž‹tèÓ}®/þLtY¹&wîݼ…©¡‡&F~1™ïêêz˜’æ·yÚ?·Gz§(øýø¥²Öºµ¥úµ¥º%SuÎ]¼ëQŸ\~\²c¥G—$çê·joKMµÒÕéùì¿Ø¼‡¯0Éݪ¼?÷7îê¢m7ówÈW:Nv½;K]•Puí·žrè¦ÃŸE Æ‹_Ò_¾h+@O‡Xõ]ÿŒæ‘›çU§|úW/£æ“3Ñ9aBživA=+翌Ÿ>\HþØJVKõ#¯W%½µ‡×$gM#òr4«Ådô¬æo˜&¨þn}©J9TµNÌùÊ}[CÕU<ÐŽ+¨+´9wì‚ÁúHç¸Ì¯·÷²ãœÖZŸ1{êÊz«”ÑëZT–­L®£U¥oó7ƒ‰Në,Ï ÜÓ2h†¸E“›F…Ï*ûk=ÆÖQ¶ªˆG‰AÂæ¹öOZåú¤Gv^jNÈ(¶„oÒߪHúJOãxR:NŸm»~þÒºƒ"vqÓA2øûúŠžog½ y)ûá­|Šc„Ú»b\³Ej`¯ºüag—~µÓßNýU CŸä¯Lµ)ÚÉj¼.—=ÚëC•¢×ÃÖ³/—ÕÝz®®$Ê2+6,«6Ú§®¨0ê1Úõ^9Ѷ

nY ÇÓc£±AAÇ™vïº/™ªÐ«ÔÜð™ì:bÔþJ¨zeµ¸<I(Ï,;›ÐÛÅÎè•qŽBÞ¯]žqõ‡Omë)»)ЩVô÷î´—Øáz˚⧦U¸ s ¨+2dJµœ8k«×†’Ǭéd ×íö”û~‹O¯µ·¨ln:ïËÓ8r6¡Ý3·~Õ<úŠäzF!ªùâià»øÄ}º²—Bµ¯¶ªA«~ÙK_wž ÅèÇeV/§VÁ¨ƒëi"À¹Lr+×_Û© ª§¿\*ÓÔÊ*Ksnȳ?ÔÆÛåѽ‘\[Ífîú7„Éœmí%RýâúýfŠcxÖ|ë'Ûׯ7W¢ae‘0›r£YpA_øZ{Í¥ë]ºƒÏ :·$ ¨Ú¾ìàV ™dxÚúÈt /VNóØ­é7S×eÊ­*µþ¸³’™Ž¯Š".ÝüRó¼õí%ŒS Õ:”´içùý`%û%‰Ïv·†ìŽg_r”ƒ·¦J{!ó¡%!Öª¶(é½4©‘Ÿ5ž­ó–…˜ž`Ü=̾AIs÷«G¦Ï“6ž|-^=Uõ·^¿½ðûA\|µ$Ý“/LpÓh~ÎïaâÆF]ªFYŽóÒÉÇò›øè…”©U8žZøMÁ˜ßT.^Ç1ùè+ÿï$ÑQï`=UŠÝkwIóï1öНö -5:@Tý/îdÎò–¨ŸxŠMWªOæ*ê“Ëw¼†spp^©¿×/S-›6mþ)ã‡JÄ sÞí P©*ôF÷+”Ýÿ˜ïÀÛ žÇrí—×ìi×F”|»I¦ZrûóÏ9Žú˜Žæ‡u–r»ê¶êÉnÝï#Ñ‘™þ,UxfLz: (sX×»8Qéð+¯ÆÛaÔØôæ7/a³‰”|£Éôšú£#êáâ×õxÀÞ§4®=#âš^ÄÕ_ILF„ܽ} =ûݹ˜ <}»z×É–.а $ñ¯^©*ÍêñÚ¸ÄbxþðSI&Üi£kJSÜ›ªÑì÷ălïï€_˜„ÇÔìv­zþ¿ø~‘Ë=-ìzT1Ây´Š?w4Ýžu Ö´W¦f¤s±s”¢®’\|°ùÐÐÚ_ð¸Œþêhto¥„B¶L9­ë¾ß¨¬EO`þ‰ —do9õÚÂÆõƒF `"ª÷žƒ¹dÙÍ(£ o¥§~º u=5€›|86 ëJÎ{Z~åc£¡úe_®¼ÖÊËÑ.Äb^/†L©OÝÜzM El! 4þ‰ùÎ)–¥9s—ŸÉÔŠí ›$Û;H»5¢ëËy¿· Ú¶åœ{©”%¹‰ÏÖäü$š@ …¿J­J×BžxfO*üR½KKsÅqçʹÇãΜÃåþkR+ožn™Š¯,î®»ë;c•µuýb”àÂ}AEh°N÷›™ˆ6ØÏŽž‚ˆÐ—A¬óì'ÿTè·ËÇm—-@~Õ´C×7Î×úqîÊ[û5)9뾌KЮ‚s£RyLÉ| Þ—«sä×ÖŠ9"Ÿv ΞͥžJH’ôòM¹¡¾øpÑR•ÍîÚ‹5$V;™ÑeSÍ^½›bRëq®cçj¾ØšÃ,ÄåY·ö¼¼w(ë"§e”Êß\•3%ø³¤â@®üMË7×1VoOšõ§ŒZ™eV\Õˆšü._ã®æ:TŽãŒõÏÍ5½c’î^³–œÖdð…¥Êü|ÇÒ¥CB_t–o„*6 XW:¥V–Í¿y¹ÍŸ:#k8A#„~l Yžr|n^”Ó¿&{û>ÇôˆÚÏ ¥j@¡ƒþ#¸L1Á×ìÛ|Ö‰ˆ1ú(HÙEÎïwÚÓ¤$ˈ ÐaÌ=­_ÚëûœÚªyº¨ž  Zï +·#½µ>:@,kï(îßç ]ܨñWÍ3Ʋ¥t†U`L$ïWÒ'äŠH©NÂ%ÕÌvºëЖ +‰uúN“ÅÆn`¢´9¾â‡Œ"‚^MÍg;¾¡Æbk å?B©²7DzÛwô´}+´/\£÷¿µ_Á’ÖzúÁÑo9­¢OF} y?ØWÒ*=-—Ü  º=¤wú$k¦cçïÓvÏ,›/ŽX³¬éõ¹ú2 ßì:.Êš˜#S$Él¬PËtáÄ(ôôßÑ’ÝYºkyQ?ü~”IJy ß!6j¤n…õéîóWP=Åšï½ój§K#51r‰sŸÿ‘Ï{›5½·öz}æ'´à[>m ‰¶ög=9ük˜úUeTéHlP½ ÓëKd’¡:é³uÍÕ´cÇüIàŠ<½…ƒ¡¨¯ðõ®@ÆÄbŸøÀïcÒäl‰•ñ5°·g=I’QÂȦüÉ DûC—]~ªN‚²êSÂþÓ-Ï%)'´ͬaW{A”(ð€¹$^&¹ëHBÕª©%uÅöB]õµ‹‰‰ýý¹R*t¹Ê?ÊeX‚9ëìMòÌ<ýÈ)sIJÎ ê×*O9]ï’Ô¹wœ_®±åeE`ê±›9íÒܬ® Y ©Òÿvº?ûÅ´¢ýMš›þiC[(G»\Äó®+&‹’w½‚Óß.w†šóD#Fà*œÃFÏén&ã XèÛ£iqä;ò¬Mûˆ“ÓÍSÝŸµ£ÛŽAojeJ…Y„Á]¼]ÍI#8„vo~<ñ¶Ìiçö&B—7-F.FüéõëÇ Ââ\ÓÒåÖ³öÓúY_3Šíò÷áz+´¦¡T¹ø›ÈeÎJý4ÓñÉ\x1ӎÓ¯Žv·,Ú,溪7¾ÛóZýPp"’–RLhÛãBa6ó}‹…šžúuÿ‰‰•s“D¸Äo߈vqU³dª–}ÇÞFâ‘qV›uº}"·›“ŠìIRx¬-"¥2,0l@Æú›ŠuI’cŒäë“ãKÊL«ÂuzµòŽwÀ¾ÕçŠòÞ¤à_$Œˆ^·à×aØ£â)#¿èôÐW^D™Ó\ÏíƒÁÔ½Áœ”iwKÁÚë×4o<Ÿ½ÀDÐz¢–4%˜Æ=õ¬©†8Ž‹“Z‰ý0è#&9ʾãC?[¡Í…å x>u°¦Ë–hà'ʇæÍ²½™UÉüܺ'„óXw®‚ý¯<í4> h~0ÎDìëÞy]ןÃyø€£KèEP×i½É§ç׫§ÓµË KªFD!Ÿ?û¦òÊ›Ð;ëˆ.F£É4ÙEGŽÃ”Ñó)á Ãa¯5J׾2{,ˆï[:¯ÂV?ŸkLO»ç|¿àÃ̪4mK^#´¢ºÝÒQëªUjÒuãÞºËeôµu³öñE´ôhþÚ3ïÖ™æ{SLŒÞ| ÖÏ¿xqkEðÇoª¯Î°¬X¶/€hN‡|èÛmÝ«vpÖ°ËòÖ°.e]§:Qjo V²Ê‡•]%¶ˆN‚FÓê9Þ·û’½~g;ú%w¦!#œñì6àÏ· âVv(×›&ÌyqeÉ” šSñ<ÈŒ5\ Ù—OÄÀ¯})† J„øŠŸ lÚ.‚vÁ¥¢—ª›tIƒg©SoAEë[ñNë´>‡ÕͺR0¾d{¿Ù~dYÃò°hÇMð7ƒiHÎWòÂ~\!šžÁ`˃ÌÛÂ4 QññLNu?‹Ÿög·‘TÖõíÊKY» týíŘ3Œ#{€eL1¼ÿH -ˆôbÐ^+ ñ.y³tŽ›v6«?r_¥w³þ$ØÐø=“,ç²±*ÜìÙH3•xß…Ñùœ€Æ\еîÏå@6èT·ã—þ¥Kk*R…°ÝßHàðg#mÔâ§"!vn)ûÚN.?BÞÝ!i˜ê3“©‰Ór+YÀ<Ÿ\"SÍ/2«7$Ÿ}€JøˆìlÒx'¿‘|.#·â288áõ6ëV‘ xé»lÌ>rÀŽÇ)Ìn¬áÖž¦^ýú—&ÿËXƒåî!ßæêmXrWÂwVxÛ²ö>ª-˜kƒíÚ´öÓ*@”°?°À [X…éÕf&ò ×û†17ñ‹kÇp(Üêbc¬È¹‡Ò€ÉfS;‚™ôYTž4a‚÷oA¡³ŸN¢lŠJ)[Ñ}†bIel©8[N¬<õêwà½øõ½–*Ux­ÏG#¬ù.pìÙÐu凧·Mˆ¾™É£³q½¾]x />tP«ß$uUÒºäϰN’[ê»]E Áj Ì­G M 2†~/ãÙ&ý‹jÇg»ºŸŸ6{&så1mdù v°Ø&tëà”ë«Iʰ‹]·†2ËGv¼N€Ö‡Ò>¬û‘Ï*X/“»>ñ>ÕPûaTõâxc:çéæ 5Ñ XïNñÛ®Ú·7ÿ_ñÍ*üæVî€â^<¾êÑþìŠs+qb¤-–†,~ÏÃVèpoâúYá»IÁó๾5\êZ¼ë‰Äm9›y°«oɲ EúµK3“XW¤²³ »^+½¾¸ïA8G˜ ¨réEYmŒ'5xöÐæÖ·›hà jT~†¬PËÁh-ϤnrðE~ˆNêŒÛ›Ë䕜é@äÐú±ÛuÝ Ëû†ù5T“ŒØ«ÏKÑž(EépuE+¶KéÒ÷! ¹ªîÒZWÎ6Üÿ I¬Öä‡^ÂÖô0ј¹¹Î?Qz-8ˆßhœ„¯Ùœ›xy!Î]f<.{c9˜¹xêŒ3ì`©—9ª|.<@Ü"¾ƒtNy5‡y±Ë¸óü0£l=ø}\ŠAìÇÝ#Ô•gás†‘¶ÓEF*AqëÇ[¤åm”Iü¬:]Ýx„4k³dbÝûªá“,êV®·† ƒ_±ºîJ™âëLÐYípø\L-PÍÔr™£¹ƒ}º…в޻Ò8âÝ<ü Ô*á¥1véÁRýÄîX²î·R&QXN_Ó¦[)gS² Åцuç|ã¡í B°yÌ C\LâÝ\<6ns öb«¬0<äÃg(XÛå¶:J}aSÇ1ºvœ‘zJ+±ÌËn{ßLmhô.(««%KÇvçÙVójü!0ÍlàL×"à¤_UQVV52'}Ase+ª°µ†0Kú¬ Ítè^"¥ÐUµ¡ŒÅ¡›«w ³rÆ÷Vüšëûû%ðòêJR&ÊÄS[À ï3'ÐçJÀÝÅøPË6O­sà¦Ê,8Ýoì§TÈÉ=²¾‘¥]éU;0‘¬“ëZîQWê©yÐZ‘!xº Nš&Ú"‹SRHy*0 ô«K*¥5cõ(‡Z ¡°!´©Sî°k,mz?«‰mz›7w<» ß\˜@Ìè A±î%·{CäSM3J·‰¯'â2Ârð=jÐáÑ£;·Ä„Ó×ÁÔqxµÒʼn3 ©Au´P_®~:éS¶ –K2 “8GoC…—B,êµ aõ^.iÄ-bnÖ÷?&n¦‡Ê°K4Ðg{ŠEÑ»p‹O­d6yä„ÅzK]NkÝü*ÞÛ»Zq ü¼–‰õN¸Ï)¯¾–º¹c°—Èß–h-(i2; êJi r“Ó¤;£E'šEF£%n8¼{.XGvJæ%wZ¿#µG†¦p7dHüµûsi»Ù»,C“ì¨@ÈIS—P—çx,«“zW\´8¹.•šìj¿„I}{·G͈”ÑG¦–d~`5 ÒtÅÒO wW`spºsˆør9N+*‹þ=w%föké“upÔ€;k«Þ\VkXš#'[ªÛKJU×ôèä-ÅšÄçd[0rá`.P¹TBDñÐÌë0M¼:i |,êË,C"·`] ã"…I¢~Éa=7,ÞÞö»‹Ù³NÇ31Žãš®/|ŽVœÈg“‰S…y4óؘxzkpü@t¦0ÌñHÔx ˜_A×ÄTöWGq^Ç0R/Â\f­ŽJâòåË'Ò>ãK±~´JŒ£*ëDO­ë“0ceŒåZG88=ªÎôm®­Ýå"T®Ü…½Ï±õnû»oŸÈ¿À*ó´j¹ƒt^ÃM:¼{mбBtë Lû :¨ÁkK{Vf¹;[Cæ—2$¤°j~ànäĹæ'onï#n«”FX6\ÎGÑZ;L8žKh½%6ÞÒiIî@û>i”J¯öJð@Á!¸謑’>è‰>uˆþ¤ƒ"aÿe¨t’Ýe(¹˜] x¶Ã_÷¸iNÔgÇG¸SÚqYiF¤/pxÛÉY3P4]©5µÙ²«ñœ*k•_—%Ú¨¯;?À¥9÷jìIë^Ë'Éù4ؓσ۰ï[‘1 ÷q¯$ƒ[» c9 º…ðh2x­”u"t:AàºÆ¹P|óÅK“°`î(i™Z•NXôIëHõnýC|õü÷"ÒÝ*©ãn¹„~kr#äv ë ¸|´L_§Y/Ç|ʼn­ƒáæ_Uœ汜pì <9G#ôv7ôH5Û9¯ÏJó€nµEIP Ë›l®6áŒa2Ò˜‡ªZÜõäXè»]îµÔeaV7˜‡-žÞ¬È]R]Å-&|@><Þyù×xï;ÀS˜ÚB_Ž[º˜ ÐÓg5ᛄÖ(i?¾^©hv·¿"÷iZõéðpÄ”×Î}gµlõ[wj½ EYBˆWEp®9=7KóM)½/ÃM%N0¨nmÚ8>ÈxÞèmI ¸S‘±ì(Qfä úU}¯Öi¤síÔ¾Œ†€µ|zq°2~¢àêÖáö¤·¯ÛiOyÝ9ó†>0_Õ.(ÆWaV‰]zñ˳¼íhõçÇïÒµ3 Þça^ S²é /e X"Æó.ÒsÓQt^ïÝõDB=ºæŒy¿$œØb&u7EKQ4tÂ]²S'inàsÓ7DмÔ.°Òç›Ó¿<7ÊLš’kFÿWIt ZÁï[$—ÜÜlPÑå+[ú<~Çòþ*|?ÜØÖøÓøäýU Ž$Æ5üÍFϵ&- I¿ŸüJ>¾ø‰  V¤€žŒŸad‘*I Ñ‚vNû Æ™Bcg (}C#ÆÏ´§/6à‚Øê•C·YC¿Èp"•üбLý øZP 'ãj}›ä\!Ü4å,ó\} §u%0‚ }Ëæ¶xñû2>ñ¥LôÖý¡¤°Ð×ÕXt!æÂõÓƒ‹«ôr·–Ü€FúÑZW`¹-Gs ÷®ék¶øþ#´*4ÍŸª_'·”äŠR¨?PJo¢âºÆ ß!öÌ`Xe¹ÌYÔ’ TzO-WJÁw‰>ˆ.0†ðk*é¡~YQÉá¹/“sÓ1<–öO0 søÈ»R¦o­<È §GÕÍÆëyçñ‘ÙÝßÔæG‘Ožh„+Sv¤´›eOÜÊ"Ëž„i @Ÿ'†âå݉I g¼Ì:6e§ø±…NMZ²„ÌäcïhÂ>¼¥ÿ:6I(Ô þÚÍYÓC?ëRªeü‘ñ—ñ50{çÑ]iÜ‚«Æûð3ì/Zïk„âÃv=Næ¤p )-aÿŽ@$¡SûS’ —ù˜â剶Ñ£æbÎ,çÛúÝúëã'“<÷)DµÉá¢ÕoA<ÇÅO€¡zcF„»1¹½êuÒоÚè²îÈÍÄŒt³"ø¡rÈŠ ²Ýù`&ë–çºÃIXÝ:¥Í¢¥H„ÎÛ°dÄêg+Xp·8æ! ÷˜Û®‹‹Öö{ô=#ÕëÐZ¡‚ ÕfVÓdX­ƒ´9ƒ笽¸nÃüËyðËÓÔ ún•¼„hÚS@¾—ìÇûùò§°Å€—‹N0ˆ {Ôº@lD¦~·Æ+‘e+oì¬Eõµz÷&tÇË,:¤A?²þÉÃÄØ‘3;1þ¯ê÷ ±Ð4~â<•K„$ÄÊ9àzA:+ªïDò~Að«ŠÌ`ÂY²BÄ5ä$q·=ÀX²oó5ƒiLÒc5Xæ’wL<¬"wä²³û20qÊ©uÜ|{_»6“²ÒÁ ¹ôÂdt½®6Ƹˆ¶Vs—Í OûF¼#§ì¨/v¦Û?hà ËÁþ:œô´'Iª6‰zÏKÙé1GËõ§TÙ™v J—´ ð" avëE’€5ôìÑsÎS§ÉT:³:—O¾) zå‹¢ž8ÎGy¥A–”É'kh„—.RÔßQ†Tã’–{ûËåöfoÏŽÇwyº\“´!¼þÝwU¶ìt‘XA—+sÉÑ š‚R»eÐ)ÿg~êÝæÑTÁW6Ö)7ÐÍSëh³Ï·N…­G{ 5Ö÷C•.ulƒÄ‡v\B¸ö:q½˜Ù`Öœ´ O‹ž{«Z%E½ºï× †´è,¬Rù:ßô5ÎHüøóŽF §Ëz_¥šÏ§v×íôVÁJÀi‡…‹AE¶YÚåèn0Ë¢]ËJÛ—‚­oKŽŠNŒéQ¨X[q0t¡Ò³¯½ $nfz¶¦ ¥ä=r†mVh’ ì†îr êðV?,Ët£™"æà[ƒuѱoò£QV;ýF¢4VìªåøÓò}gËi* sqf‰6.:\ŸÄéÃUnTaŠËSãIo±hlà̃šŸb[ÁÚÏðz¯ ¶V½"Ú.’ UI“ã fÚ·÷–Þ†‡h”[ $.¿µcå0¥Ï2sËôõ[¨{fùm)—ØßU¨Å‡æœUN–ã7¯¯Q}±P{˜áŸ'ÀøÍ#, ìÉï½KdÞ8Lw÷¤öõØ cµù;tE›‡]ÖqØÖ0ãªv\{´+¯¥ç<ÏÁ†éVÒYÐ^DCº ¤+”ë hïT{;—bì¤Qêw¬& S|ßwÕê~t5¤W=“0@©*@K¯v%Rƒ¸œ Ï´L×\EÇŸaKê:¾Ï%‚5¸矈îxâR—œšubíÁ% !y¿®WÏ$m¤:æã¤¸'æšrÈɦ;£aÿv²$ÄÖ )÷Ç%¿ðé¡1ñlÞø‡™ÆÊ  ˜O:$hhðìm©áA2Ÿ0O4ÅŽ£$Þ¡º™ÌÑï§ÑĻDžBlÛl@…\;+8 Ú¨nqÒãw•ú(p·ˆCÁíÎõA³×çñMõ—}gû ò°•y|9ð35œQÜOÈÆìû:MY‹ßø P@Ír™ä¢ó«{ZF—"=ÞWli„ɽŒÛV9lèH ƒoÒLÖi\‹®Û|³p’s¶ìb©üDé™àtƒïž·Ln*ï4Ös,J¤sÞnÛg}„ÄA‘ ß WéL"T£! ¡9a7)ÔØq3K—,ß|yÖ hPüŠfÐAò†íRz+½zü¶ ûSã†á 6®Þ²8qvM:ÖAp^áa±3ödF 'É(%¦\½³/Ä^yB©5$z<Ãue?)EºÒHô)©†Úhä£ÜÑÚ»[Àæ\bÛ:¿£#\’/@Éc_ú"E\ä“”*Â3Uöµ‰Z©äܔĨžµx(øÞQÄÖ͹ºÔ[J 6Óæz˲{)Bj™„fêµhòtêÎ4Žù—Qç|_h¿Âʹ U[yyJkh‰/{~“NHÂRòbNŠ«YÛÌÁUÔ{n]Gk "îV'™~›ÎáF;r[ÓN‡î²ÙEûu„à§½Òüýéf•w>s*¶6ÕâôˆScœ‡¹‡€Ã4V‹{…ïè,ö‚Û_ð!³v61sƶgá!2¶§óVq™†ƒ®(e÷¬æÖf²G*ùb|©­'…Æú{dØLfÆçØN9fÁ¥ I…b}}{5¢i Ëéîm©ž‡:?z˜«Xw)ˆº…ÉDˆæ¦”ŠF‰š[cÿ‘[eXåa§ÙÝÒ0gX€¤+”¶Ú-NÎñ<8ùjèv}!'éÅöuW c½™bV72†w/b…ÿ*Ÿ×r€!NgH\”õ"u‡Rn #½ìZÁ­‹]-±à§e6qÓk›sqæ&BðÝ-èÃUKܤ”é1y!«Ðši[É•tò"|Ð,íš± |s Ú5—Ô«aqUýñ5¼üã^+ä=Ø|û¢±¨V"è-0/ò€GzKèsÍòâÞsu!ó«dÖ/Ó-ß’ºCu%SDQðlþšñ›¨‹¶1é5U’´Þ] ¼.¼1sÊ“Ô IiðÌ*„DÜŸ ûb{ænôqò¡è”BêÃÔ ê»°Ï#çÛrΊ1‘ÙV«x×O~6ô|Úó.¾åøSŠvÈ”²Å¦ºy?ëÉIÇ/S7“nC|ŸÕX5ƶûd‹(ú¶/]µ•FIÓÈ:*Ë~Í~ ÓÓb™E:k:—ŒD±QxF¼_!æa½…4AÐAU8mÿg"ŠBðaÔñ«37y rLõ±²¾û‘[.1ËúªŠ––õtu×h¨5óßej„N*Å,¥¨ÖGTlæà,½¨–<*¹NW‰ÛœëCoc½ÍHðõþÞ –œV1<Ò¿Þ«Z7=Šõ­WO)j(0ö ¥J±›ÿxíŸa×°Ú<åC¯M­ê"¨/áà]-)wɽμM<:Óñ¶Ût^%]dëi_r"j¦~ÜA˜Ê \z…™O¹+Ηdƒ/Ñ'ú2~bC‡ûŸÃL6ÖgÌ<| LðåY^]g‰9¼s ¼–<àíÑ’\j “·a|‘˜ isI-i¥"9èlçÛˆ4kØuõq»&:&$b{ß’a‡\ùR†ÛÅwО³+-NÕpÁ›Â¬!Žãà ±'m$©©ãiâNì+ÑEpP]q… €GÃ^y‚tLŸ"vv_Hf~¡ûl½McB+›R\7ô¼Òq_|•Ñ{¡bLǬK•L¼`„š/fÔ«ÎÖÞãXb·Ù2拼è _uR ®ü³ ¤L[”|>§RH:ViqÜ·ÍÜ9ÿÐ×#tðÞwñ÷«=ÀMÅPƒ}™;{hÞjçIal“l‑-Œ8bx(Rƒ ž˜–DT¦{ṙ‘<: ÃòéÚ øÍg›c‰F }ËU«±З’¡$G$Ø“‚ö‘Kg·,,嫾a‹Úá€YjrÔo¶€Øwk@E4ºš#¬éiõ…*ôÚ —¿n•ŒÊbc½ª1rç29Ã%}µùöÁñƒÇo)L™<¤¯"Lîí†T A»%5Ùe-Í@ï¥VqtSB¹Æž%ñ6q-¾$éoêS1¯–ÒÄá|IOàlâ| ñ!Âåk¹•´(àú°€•ç‡á@{ˆåëÒO»¬{%€éS›ÃçÝ8[¯:¿1p°^uqcàúE´ËqµR߸Zz4‘dD@¶Z[¶-Ýc•e»tº]ȰëZ{¿ˆ; utÆ·êóš¡_ˆ˜JÃÌr£íYdÎ…†wC9Ð0Ü—S,27‚Z{ ;®T+[¹»¶y¸Ñ ¹xY_Ч³Çáoy0 p¹/Ea«¬~&#ê’o–×m¨FœL¯¢Ï Ç%çšNÃÿj6Ô»¦'˜÷™œ$ÆÆk9Pe”¶IÓíÝ [׈*Ô e2 x–¶ÎŒD©å‚‡iØ&]ˆã…©0“ô?½’oú†Æê@•ÏÒ<˜òA4  ¹8†an%»Rc1¡‹7É_"LNRñtÅ}8qËÛ³s΃-ì51¯ ųГq©R{×féØž£³ª d’ÍN*Xwšº¸-&ÊlÐ\>¶Ä›æ ±\Þ² G …èô<êZ$±& _dªã%ÐéqÊhKh¥-§RÁêq¡â/ªÔ€Ù.EŸB²$ñ.·sŽ€M¦Õ’ë6½´ XÖä·WÉ=¼/}(-kàciÞÝ¥X5 L )~RHï5ÜX?,÷öfÏg¦þ.ËU†7³úCO;ÞAò…ZòÓ‡V·É»œX6ЉˆÓÜ-þ±«}*ë‘êËQ†é˜Ç}‡ NÉVa•‘Ý8R•p0Mè#š¤<xF}œã—?ŠÊYjóãKÅ!b#»ç«@q²CŒÄ4 3n¨#WDpÅ ê\|oÇU9%_ƒ]F÷VÃ9´^«•>V•¸}á€/H§§p:s$´¶˜W“нKýâÛdÔ@œNó…r«Ù'pרxµ…p2>°V‰EcOfs+Ë÷›G QñT¤ë¾|™Úf†pFj—arçXF8øxi@Ü£tü&,Ø¡/Õ‚×ôµM¿†eÖGRuvCÑ>ÏâU¾ãh9 €ºõÛÄ —+Çu>Ç t½`†æg£ÍX«$…µ²±d<¦ñ"iS æb£k~Œ;´šª» ¥OD+1‹Lpy2"|Êï!d­ÞÃ_L ¸¦بhOè“ëœN;_É;œ›Ê#¹®9 Ý–.ß6 <Ç«í>Áp†M]Ñnæ2îÒ/ë¸Î¯&ÖŠ¼y4ìcÉZ>ØDøZ‰j-‰qõË1äv„º G¨¶ÂQ_^ÝSk À4Eë9”h€Ú· ÓœñŸ}þk.ºÁðn`‡ÜU´áù#¬ÇT4ôŸKÕ#]4Ä€Òóá0’¼” 3;âd3ö6L¸t ¼½@ž¦+%íDžã$+nœMA`{F kïXñy3$KDÖ~KoI˽ӓPƒvÒéI¨WÕQ3tÿŠè¢½ zÝšn¸p¢˜CF®<3p'¹ù‰ÃÅ‚,ÛbcéCÂW» :ã¡L1d‰öf&Y\„Š«§ÄýPø·Å²~v ™8ï/4†¶³;ú³ŠS£i¶äÑ£©]PA7ÌI!Læçg’x dÌñ”|®]9œ¹€yu ¶“C=–²^ÆÛçñ±¨÷ÛçÆY.Y æÆß³\Þ[ÌÝ”U8‹»<ƒñÇŸ‹¾#5žKq;ÊÈqìå½ )ŸhZÆ¥PBºVÔÃÁê# ¥]„±6Ãæi±7§(9qO]‡ƒÔE³4¶Ã[.°^}}9ë5ª4úPêDÜ6˜r©Éã°ø0÷Û“|.½È—’C`°Í:Äö‰EÖñ­ä¯ÎŠdw~`¸Þ’ÀpµÙð.$zwP4øŒ ~*ó•Ìø©#ªYsàrŠûkÚ]±qu«ØCÁ7ìzý­>fq4w¤–ô¢šø!]Š;hé–§˜Æi-Â±àæƒœÙR [•äű$oOžp±BÚÇÇ=³#U‡Oëý.£ô÷Îu²Î=³×©Èl@HÌžÊg3ðržÐç5;>p²›ê½}Cé‚5ÐIr¦2yKãVÈg¯hŽR”Þ!È>¨pjPÖ¾TOp½H,»oåj¦A£Ú²Lô|mAz4BÃÏô¶NaÎÐJ´â Å;|åyÔ›XZ2£D{.> LÖ³myì– êw“øqä9 y\4ö×GSÍëú^åÚ> ¸³BÓq Úñ‹œGlßJ×zï˜5X§û28|n»<v`…(Gá¸Øÿð¤%n`Wë…"ôÿýQfbâHƒþ ·íìQ©•O2t³á5)Åyr¶N4è‘×ЫO­Ý‹Ïr¶Æ‚Ø=´h)¤•ÁW¤h¬_81HãÁ}uÕB׿·„¦ë\Jls‹ë¶ày˱Ԯ§4 ¯ÿ¦/w4fçaÊ›I¦Å'¹û¸ÛÖW¸í.ÞCÎ_:Å‘áß‚èŸã¨×ÔŸØ}%}³¨­Ån \:W™¿E×ù(…âšñºÖÄî‹ZKË©€«áþ ¾ Aù`5õGÍ»E²™;ï*ÛÒÞ¨\ìv^#‰$}cœƒ•„sŽÌsõÖ¥&ú¥«=½|[¤nVm¥ФËO&¼eB/lÓ*Y.î û\Iä%ø‡äÆž·žï42ÚI_$v]ÛîXö@YxE§éØìGÑ»p†_t@‰2o™ºlÞDÂ~æB[sf2¬§}‹=˜|K#+~b¶.Çý`´3~g ·+/9îmÇdˆ]Ý·—ë¾ýt"ý{´‘ö»”§Fþ* 0rî¨û+m=‘K×kHÐNôYRË,£=X!èÕåÆýOk¯â¬xeÓôøèä<èa¦wžÜÐÉâyƒö}zçì½?tÔž4Æ%«›øÆEŒJ-©ßAJž6:“RWÆYÖV1º ÞR¸_`ÙZb9Gv÷‡fYî±ÿRz®Ñ¸dAÕǹC¥e4—‹¿´f'O^Cz· ±k£"Ldh´Ÿ;—æÕjoÀ7×`ÖiS%Xã£Þ®4/ NÂßÑmŽuY:Å-¡C§ë– ·R.´²h/³?J¨`e|aú öö•ÕQ‹*B”UóHÒñ¤µ§AÎ>½w,/‹M9ö°Q¨_$ ¶.>)L‰^¡@w²pŠï³¶ Pšø˜¡V ÏšÜV/8~Q5óH0kŸK¥/B%¿ío´ÛªNL¼{e·òƒöËÐůz 9&}?»|»âaIº ,„»ggØTµ…'v\³®l[¶ˆT Ç×]î—g}x4T¦Ênò}šÓ¡Ïâe“¡ZÃ¥£º…K SàN¶ÐÙäÒû¯¢¸:ÎÚ‚.çóu0$}êÂ…êH‚`éhª=yjfIÙ$n&z6lBáµ-ÀÚù$‰íê—½2dc¢îòm÷…ÎùÔV¿‚çób&Ëöµœ­¿˜€?ÏG•ÛRvñUø<ëåxõC§p°«4mÌ Ágp-È;Y Ñöz¨,øˆ5»N¹çbÌþä8MÓ=ä`N›BÒ±®~ŽŠE§Œ ½ø»rÂldÿ r^> Y@7ZÛÞ¿z¿G&[ºRo¹.é¡%|v,FYúTKÙê¿€\žæ"yØÜ"°Þ½Ÿ¦=µ©â}Zùå£ ã’Epç¶AVçp¸ Š?xü´Oì ¤Ÿ”à5IÇý¬`øÊ6Žq^›£Ò¯ö“Ó ;q<ÁpŸ2tJñ›p—£Mš€ÂT©«|»rNá`âFzÝò‡ 2<9Ç¥W;(y|0›Jš(Óœ¦rf] Kݘ&Ú'Y­lá(½j—p‘ßùýiâ&µç*¡i †¨¹íïÚ­z³¢’5‚nGKz®ÒÔÁËxHèÔÊoÏÉbU´Gõ{¡ƒo³;óWFæ ¤±»«3w[âÃî!HÙ+õùöBvœ+yš6'É0á;…ÊІ§De´ž@´×"¥ ,Ñ’V Íý4o9*1µ£ý½Pv#(ªêÐÑŠP(š”UÆ®o.®ÌnŸzqUD¯ŽÙÅI[ÊÔ88x[, “Qp-N'L,?¿9ô¾zÜ”Ç8b[Í}¥¢\–޾mP $wCâÍÈCƒg¢±Ò‰LC›âWG'ïùµ‡&p—Òj{ö‘mÔ'>–iùy! Âp¢5B´´ã1ãáX~Xj2óRFé®RT>Ð烹äͦN‰ƒçbx󡉹ľ4­KÙ€ùݽ_\ºIH˜VˆÏ¼ŠjäìÇv!¸(½TãJ<ŸQ—j­\‘ݵUxíÅnñ_õ§Æeì¡,Nµ‘¢¶ñù´AçƒoHv7×ÑT…ꢣ/ù¬äGXæA@ZA‰Ýh+œ¾+æÌJˆo"6åYóÒ^Ï/EHöQê‹™ÃãÇ…Êx ;ã9ÕcÌM«^¨ã³^/ùhéy¤n>ÉÚlOŸ}üV´áVòȶ町HÚ²F7ô~|ã>Ã|@++¹îÉänÓ¤[·Íw:Á×µ;';\}îXé -ÆösŽrÌrØ…«H²û4m¼;kþÅñQÅÝKr–xßP‘RõçýödNt7ðÂå(Ç–&êUD¢.qˆãÁYòãPßì½ølšFÞˆ}Žó€Ö¼ëì´®ïs%=ÊY %FÕ¼JýO0ŒìXÝ‘®¦4?³nÀ\!MýXM[lÒ}f¶'±_m¥,U Îõ¢ìšI1k§¤ÇGŠõEš4P|!Ä"'/j»ßÒu¼ÀRrÝù}MFõÌ|söªckïŽÈy»<’L¤Ib܈þJZ/{ˆßQ±GNØöáîm| ê]…‰¹ïcà€Ÿ”Ÿ˜Ä± ÂFú‚²F]Õ×lt¨ã}­KQ¾fÝú¶Ú7©ãá:Æ×qùž~é€×Øô"Þí±¥uÙDV¸û çÓ¾áÀ‘»œåǽÐà­!‘ZE°óKNIîÒcÉiÜ#»w³ž£àS'*Kß³I˜]fžY×g¦„NÔíä¸ÉF²Û¾®Ä‚˜JçX:•uš¿›eb-”VoÄI/3ëéº ‚ÛHÃQåZáÉó¡“Lûç´øòd ¸¾NæìÔ÷“““Ì_|ìã›j<à´rïL‡Ó˜Eè1XúÝö[Iú§®ïóx÷¾µº°)íµMÛÅ“Þì/|è³—é;Ý›½úpË8AAä†ë'@p®h'H¤[¨ß“nØÔº#î¨ä$iõØXБӒÊ8×üCþø‡<¾Ï\*nùšã3äB!%&ù|ï{òGȳNÉô¸ÒF5Ѫó715ÃnÒŸçD§»¨3íC+9ÁÜÙ¥ž¶ÛT»'"¸~|úBëhB>fEábû]Nq6€s`ÀŠ7pÕÏòÒVçj k˜Îùö¹Uëí–áÐ-{¦CO1ˆ}óSÚiZW·ˆÖ¿Š¦6‡š¡_Þs{Š¿¬ôvà ´òÈKi®œIå†O¸É½JdFÉþ¶ÑÒùå6YûÙ'r9)‘‰Em5éËþiÆWï79ã†uÑÕŸ¾ìO9;H´ez]×z1îäíe£·iKiŒ´³’GR®5´0¸uMŒÝÉL·>Ùp7:³Z »ùvÚ2Ö’’FÏÝL¦Â·ù3Ë Xiïãƒu½·û÷èÝcóZÝflh1ëã*Eï*0ŠÅˆO„$Ë´ÿ»¥úZQ§N^*ôa¿çŠox‚Q/}kXÜíÏËñ’'“ü<ïK¡í_ìêô”Q­PIHÌ´òOø†2_ô·z²W‹—970ýÄ‚”=›2%¢eˆÛ4,~²+ßë`#ù!)­el*œ×àÑ%;sžØ³ËQ£K%‡·K@ÏN£È†í%Xšw¹ÒqOxÝÃæÂÁ%¾èÀ{ÔaiŒ6×GHÎLrX&V…ná“™Kˆ<’)x{Œõ¢äK¶æórê óê'¹I»¡•'Ù‡èï¶¿JNkð `gý’\bÁ}Ñ2R//¿i(â¥ßèÖFaù1~,aä…ʾç·Ußà¥kd)+]ü™ùæª7ãnmÏ^Bîã}gŸq)^:i¾| †1¢ié‡f¯‘îµá˜¬|O6o2 }|gïsÕz{\1`<}³˜¤|`$¬Š·SÔ½ñAÜÖ8æy04Î.D÷âaéuïê`õ»TC*¹U͆DØbÏXgÜbCÝn.i(¾SiK~åKRšÎ£9v}©$ýâ cqGvÑ#“#€Rš ’¥›’[_¸Ú7;Ýs‹I÷éT½Ä’ßáÙÂs„Б(a=:’/mË#å‡[ÏÁŒ;ê%Ì*cúÕÚ¯Q‘q³ê‹1Ž‹ÝÒíúh‹cÚçòàâ“Ð (€µû¼˜‹¤A{hEíT+¦k«p¥pÄB³_ÍÁYZO÷È™8;@%€ŒÃ|/¾šˆÄ愉V|Þâ Í¾Ô»ÔTÆ£ME•:3_ñ.e—aLG¤NE-àû¼KSKªãnçƒq=œájÒÐ0höô1™†+bfŽñ-<‰A»x=™RˆÎãåa÷#ŸjLYø&O·ž·×дâ ì鵕¾re>YñOSÍà äBÈ»§?C߸‡n[Åŧá@þ]1ÌŠÑ+]‰í å¯ìC!hÜñlìD|s(EÞÍ,p*` ~ž´lÖR“x «º]nÒv~*ú®Ôý]<Aì²£×e+û®¬ÖäõmLAÈññ°)‘ägÈ"Æ™Èâ«¡÷ÛX˜CÓD¡I§`bÁkƒû§m ò¶±#¿Ð¨ßÍûH)¦vñ'›Uë[Ø%Wù]€>øòh>Ò5P“¶ÜE&³™zÄH%l? äÌ/¾J¶)Þ}ôlXÇc¹#5YÎ×B„r^ÐpB½Ñ›¶²:}hå[/ɯ^%¿JfårÝ‘ZJÖˆ‘ªßmy”N¯vʉɱHòºÄ•óŸ,ƒ%eN ¼m ÍÈÞi­E°Q¢ïì‚®v_þRƸ>xv CKõR»ã¬ŸCÆtPù-øZ§éñÅ7``¡ãŒÐþ•Á–-Œ™Œõn*¼Ú#ñLhnÑyA‚ñ}cÿû_Ž,5F—«*Lµá ÜÐɬöøÈ«Å”Þ6;ÐÂÄ’  Rššqã—F„:ÆÒ¤vü>­¾¼>ðœ;ÿÉP%Ù±÷rÏf™:ÑàTôZ—Ùi½§ú@t£+ñˆ´ö.àÃÕà+Ñ étXèWOûi¤¢×»®Å•ìU[ëBBKo‘>½êNM«Àh‚l^Ö•‡*o¿Vt}«{j/•ýúØúR.›3ßÛ”:ó}§4Ò ¬ž[7àë×$Ç‚Ì\JÅâ®Iš 7Ü¢W»Î¶à÷ID?À@$ž·£ù˜Îh“;ŸEàwÅøvл«§²(ÊÁ ®ò™mvžíßÇ Q4tù†@üåF2bQâE+è¶ Ém°i*ª@伩˂„ßSŽN„.u* _îÅ•‰·sÈ$Ñ]"ˆëa>-šö¤üTY,[R4Y@4*@_к¾ÚôÖãK%œ˜JNº‚ŸK…ÚÁº½IQ$É5žNA¦@Óo·«á”ïá¶ÇÞ¶c¿$‡½©Šë¥(qƒ¨RÏÓ¢ŸÏ­Ù8jÌ*߃S*®ÂÌê¶/ÐFH‘B}ûŠÎGµ¢“Öç G*mT‘ˆˆâgG¢ù‚ÓÎéó‘ÌP?8Y:rüó CÆÙqèê—t/룧w8eœ¹±9"àó>»Öñyl­å¬V­eblÝŠêæë¦J^Kø!ý9+îRWí¦ý/yµ ,÷Òúô^ï+’ƒ·àéôæî´äÚ†ˆ€ž_ À¶J¯ËÃñçšK(,§¿>8?Ìý”SºSt%*ÁàëéB­ *¶a}ÜL '<¶=Mœ}Yx;b™ ¾‰?×ð´A”K5·«½ QïêfƒÆðÜP ¡™c{×ó®à¦H²X>+5F# ÄÅ5„[Ïæ@S”ÒµÍ6qЬ¬‰ˆ]@¹[ÚF‚·Òž]}6âV±©5 >ŸV#åÍ„ Ñ AËšiì‘ÏÕÒLѧ‚0W&º|,¡5ih°JèÇ]á|‹ô¢õàŒŽÄtÐk¤¦GKccZÕU´%Âoô,ÇäéÇÛ1JpO,¶ç,@•’7“&N>ZѪ*&>n;²+Nð1/Õ³ží{öîjáÅ•c.ê°æ•F^gŠý胡˫퉸ç&‚+%̸h¤+ÔÜJºº¢À‹æh¨ïkñ€:½i·¡jèN°žÄõA¤!Ô×A:űçsç£AòÆE›qRd`éʽBĦrñd4»T'´ï'ËLwx —"9ItŽÉñnH¬[X+ ï^ewÀÚ´™šÿÁ²€Ï·ŒˆØìj²[.M¢~irÒçfÇM“\0t¹%a都ªYz89ë¸jd‚¯ß;¨aÏJ}3–;”˜ƒZpP'>‘¡Êú6‘R>M@Šo˜ÚÌóPˆôóÒR;?ë˃õqãqÝzAuŸ$:5£ÑŸFFÉdôï—°xÅi/ÞÐÕY»!•àvöÉæ âB*›í¨+äòlþÑ06Œï•ŽÞ ¼ ë š“ÿ¹2Ýãáx| {º¥£4(X¦_ºoÑ!–¯#¦ÖÑ—Ó‹‰ß±Þ â('}^ýR7¹‚ÉK&µˆfæ÷ê€ÇêzìóÈqËrÉXɤ Ì>&øÖ…ç•“Y@3[èѵí„"·,$€f›eYÍ)”ÑÃú2ë ž“¤(¡ß+Á†ØöBÑÄŽÜúq#¦³ˆ)xC _oCYoýŽ˜;díB©ÁV{~ øMå¬î þ D8;øÖ9c=ã¡éúÄùxbŒwäÇ—áP–мÀvÊA2ËÁ0â¥%ÞĵöLzã¾1ñÙ¯fì¡°ÜläÖîøPjBè"Û ¹é”†þ>‰pßæË•ÍOìp…%gi²’ 5Öö]`}à€,n‚F|@ògç& š«8³=õκ-!BÓÿ Èê©€ñ;Š=lÖˆîyˆÎÏwuœ‹÷²ÜÕRÏTfˆ³ÚctÜŠ'F;y"ÐÀvú³Xõ‰úÄ¢ÓŒtÇßÜü |h6ÕÐyÊ< ´Ëú‚a f^C•ÙRìÉþXv7NŽue¶ ô¸çþ£,B^j‡eŽ/ݸ&Sä@¡¢“øaèšs¼Én k!F{1~¾&†ŠÎ¼wƒæ¦dôês›Ú÷R†gŸ{ßi ‰3 =“ ±e}ùÜ5™êÕqMõû—AÒS²Ï>, 2·vti¾ßÁ»#æ¾Ã7wóÃÛ|¢Bs¹E¼€ßîÇœ §í>âkšË¤tTñún,w¦8>¤¦j\ ïL[ÏHÕè‡mB]¨ãË^´v cÄçaä®Î:)ßWZÁL²ˆç2¼„ìeô¸§°R˜ª1½·×âH(tm»u©}ÐìÝ@´°ÒJö™-`™L™±é×¥3“î9µfݺ4hÃÅøßxQí¥áAñ¸·íéW˯€L‹dÞ';e‘ϵD‚vN/µ·øvXj_A›ÀÍýN™†PÜH|­ýÖ¢Ub*Åcµ±BVåb H2¿‡efpÎÀ»i¼•ûØÛaSg_£—â“5xS¸ñ2¿¬£ ‚ á,ŠŒAÑBûKép”:Ц;ø–¬^,šƒÀòŒ y4”áË|2e\mwµó<8nöh@]ãÕ©(ªq(³9Ô,yãh'û"tñª€Ÿâl¶td÷®tWæ ´cÚå÷(à´è¸wg2-­ÀS($ßCûBÀB~Ýï ¡Å<;yTξKȬ2¢#YÃmw»MßË·»8ì·F”t´?±(ËÇÙe,à(Ÿ zÅ!ÑyÒ>~9‚vT©ôèýYå–xè‡ñ@™k^…avh”ä@Go­î [–Z[‰Ôèöyæº|»×§ÉTœÜÕ”¯`’“KŒ©%Ñís¬ØqÅÈ™ _HËh¹në¹âëLk¬VÐR•ö uª)Zl»Ê”®6Ð픤©!Ô SA‘J~Iö©à ˆæ˜2r\7ìã5°nß7çŒ{»1@vptl (~DrM|j?#$Y˜ÖªšhÕ4ÎOd}F˜pl˜æ!Æ9¶}îÛ z®kI[‡Fï~º\ïj¼—è&DÞL'Y:•ì°8ÅÂu)k1ɬ÷áÆU‡î‡ØWÀ(ÈýÇñ…¡ø¦{‰AnA$«ìè‹.³º6øÅµzpŸ]1¾c)Åî0Û”hÝ1h«+j nú£¥¹!±òº“D}ƒáõ¹ÎÄ$øÐE‚+±j*ËrCT&úÇA"& Œ³Ï“Þ~AºðUOFdÄé-Ü›K²Ÿ£{ÏuJ¯RÔóÙ]Ωðü厛ãà[ XÁù—»-㾓×ð ¬oõîÝ¥ÿù.î÷ßÿø}ÿõç÷?Høþþg«? ÿ¥À?¿ÿùCÂ÷úÿýþï×û¿%¿~ÿòóû??$ü-ÿÿîþwu;G”ÖÎñÿá 0ÿÒ÷_$÷î—ûyÿûH$ EJHÊ@Á(q)¨ ÚŒDJJ ‘Hˆµ¸¸ä¿ŸáÿoøÐÿ?ü˜ßÿþ‹äßê?ÿ©ÿ?"ü£ï¿@DmdÄÿ±$|ýŒ‹´ ᆈI  û¥•¨ä?ø~±•®Í·Ç@ÄÁBP°8·8ÐTüç7`þáÿ^ÿÿø`~[ÿÅ$!`Èßë¿ÔOýÿáï¿ÿBšMB²n?ñû/'Ð4€áoßùBB¹fgg———ýÆg_¦|&ùþ³/d¿|ö¥Ýk¬96´ëÔ*uâ#Ù•AöÄ#sasÈ‚F¾°(›„ÄGjg(Boßcv“î¡+á±6{9ºóÝ«_¸KJyÑÕý(Ÿäða¥b¦k<cáZfª/õÌ¿˜?ÍÛ ÜèÚ}wU£Dš•êÕÄÔ_4ʬ‡H a¶¢ÒTà'táud$ô*Ø÷ öŒ³knüú‡F›#­t·¾¨;OWê#nîùzÇ´¿ŠÌsaâÓçfÖ°TíóFs^(#¦…o* Ÿ}ÆþªðpÿkmMMrOƒÒÈcÕŸ}ÊTõžî{çÄ%¢ ܺ( ÇÎa…³½"E;Òeƒ–†’õrN½©hyG×!é_ã³]¡°ø´|K‡"paPtQŠÉ~ÄâVÌÖÛYÌ h¸Ñy✾=æÔ&3}ëÉFZøVÊÉ÷…‘P~ëýˆé‡v·"îk¤:¦½%ÑŸxvìMÁÔÔT›°r}λIÞ;oàŒ>(«¥e’þb§'¶âK‘c>¦Ð6úzmaé!l¹Ç§CÙüzå¥ÕÁ¡˜w/¶}¯ê9´žûã?¦¥Â#uÎvˆJ1-€†>ín=ºÚY±šŠ›…R:r”ýPjÁF˜)w'ôÓ¾Ïù~‰êaþWY©Ta Ñz¥W‚l¾ŠÌ‰Ó1ŽYºš_ÉTUvÕmä<ò,õK]ÝÚ¾ãL’Ê7·ºêçP¦#ð4íW//÷ÇÐÛOÒ(55‘É3}f2¹ìϸÃê¨~IéSuÖì}¬SðË›þä›Y'IfšÈÉbf>wµpzõlÜQaZ¸µièVG½PƹéV÷XLîÝeü€ÿu¤€m[åûîÌêa" 8u3p#t]ç?ÓEz„©H‹·mÏýšTb WÖ…§åûÛT];Ï \§ŽRé*ù„øgˊ逞Kc¨R¹E>]«¤>¶ zeoÁÇ› ”˜yN^ aVTÂo­~þtGùà«Q]¾±µ¦Â×A ¦SAôrvöñ_§æZ,ÒX>ñèÅÛ[‚ }v»¹ËïR»SvÚw‚+«$Ö鉪—¢ë«9Ÿëž“œçƒÐÔ™PˆéÕÓÔÑ É\ÕïIñgf’a›ç kfÒï©Å\pûµCÞM]e5ñ±„©öœ9׳L”Œõ-“.e\£rü{Eëd®÷ Õ1Ø^ðªW‚ìKSnl¸}å3©„ $킌ÓGBzuR_ôWUÅŒðŠö­‰××SJ‰²Ïk±Þ§&Á\™Ÿ ŸôP“8}(os⎽`·\¯ÊÖβ¿#uÙ2DPùQQ ¦Vz´G?5:'+/ÕTxŸ§‘ž»†Aí“jxŸYœyŽ7/·6Aß\™Qò?Ö­/´ :®+Hƒê…¸¨ m"=.)̽€ß§¥–Fq·‹ŠPŠ<‚…±uë«ìœ™VŠLÊŠá‚5Šz‡²ølóÜŒxøÅ${)š'•ÒRÒ€½ò, H¤ÁÁÑ<ßG#¯DÐÀß2Ä”“ðŸ×“ïùŒdÅžà·°!í¯W8Âw‡’j•‰^üv‹Í¢ëÈã¼v £ghɽ=u|êVKVƒLkÐú]Õ.ü™.2=ˆ’’”øS§äº¼k`ÎìÂ’&'¦{ìy5Ï¡Ž•S•µ/êô|ÑjYÁV}…­/€jŸÉ‚ã ЧÙ$*÷G\>!LÅŠ»s0o¦£…¦ÿ)!†å°æŽ,“ |þU?4'ÞÆ/©3EרÿHS Qwì`¦|^ôc¬î´÷êB¯Ž@tSR6'@-UÕ½\f>Ì”ýû»¹"×OÕÀÓæjc°ÄöíÇL_I3|tÔœdõõaN¯,Ävà“O+eéDŠC^›ö^ÀZÚë¤Þ'ÓëUzPÃ><(3z;P`$U5°[!аR€h>"€hEUfÀÇ׫wLÏw¡:m¯šš¢ÏÛ¥¹Ö¯žîG¬ùP¨ŸüÐlôðŽ gú´gtfÀèý칈º°sªÓ€jK=tø¢^þáP1¶Ê´ú±Ò“LvþÆqìA1ÃQ4/>•aÉ@›©-o‡Æ\òåY¿$læÔI*‰g¼I;ÝUœôôe|;÷´tÉù6˜f5»÷2rÎ+)¨M¥žÝK4[Ú3Ø ¨ÏùMŸY× !o†í*ÏQmÞ¾â·OBVÉÖÌ'Öû¦"Ñ7vÀëù¤gÌY=ÀRsôûr>”…n]rMUÔ%ïè™UqqÛù…á} Ât•i"$væLó1;™®ì/Ô¦Aéiz»œP¹úY`ñó4‡YÓxNIñfÿt¹¢mšÍ4ZmÙîg@~\Ÿ™u8ðAì¡’º÷Ï·ÞÇ0!Lט„ºJnøR$^kâx¦$¸^CꂼžüsÒ E%ͤf@*ŒuH™bˆ=åtI9MeǽO•\26›{Oçþpm<8hôÝ6P “z¸M< ¢>:O1§¦‚Ý¢GÀ»ŸT¡?pød;ɉø\E~o‘ ~e díÑ鵎(ƒù«+ž¶tˆaÁ¤.¯Ü¤×þCU×F3›7RNo•22@]ªÔð£ôDtWqd¥êŽ()m¸_@"rÛÂ_*g¦ö_TædòÞÔCØ-qLX­XœG¼ÐUrzt?•–ªZ¡‡‰©&³SûOŠuL7Ðâ““híò«“’ A¯ËƒûŽA¾0“Ý}uˆ¹Ÿ%šBÓ&M1î媣PZ7Èp!‡5fîS×¶Ãqüm,!á³|fcçøC4•f«ò»mê(ÍHj¤6³šÖÕ›" :~ò£^Fµ?ÆAz„!­‘9Ï q–N æ”hp¯Ž>ØdnɶÛöåd”âĠ⚺PDŒßsfµ3ð¡ì´ç©ò¾äASweÐf£àŒð±â7¼§Ù8³ÝidYöÞAy”:çB s+›[:¸{̘,ú ö…3­ËÃâî§51pòÌÉ”-aº…±æ¾kÙ­û$ÞÊ/[<¸ÉúÅÌÁwÈ8NIæBŸùGŒêvÄ}:‹¼Žw¼ÚÞ{øáéçÏ»\Ù»:ÀýŸÃ"–ؼ„¤Ìð^2‰N»Æœ÷ñÉôƳˆÝÆÝèÔîõTñ;;&·´oéÊ3mò|e׫h‡ÈÊ»·–~´J& ñ@³aÐÄ<én.‰ ž!öËcaaݪyç®·¯Â?XOMo­â¸"žMÌŸ9÷æÀ¯ìî(†? ;x"!3¾Î¶ŸYüîoLªò£çˆû°2v§±Åë­WïdÆÚÞQ Ч,‡!ø…,Ô)ËÔǪ‡Ñëì£=‘h݉èi¶h~ÿŠÜË”Q ÓôHú¥Çz!ç*RšIOð|™YÈ×Jºü¤öÍËåÞ¨®è‘èôh®ŠŒ7WL4¬‰Ñï? 2ºsåºQ?€Éj™~¸V¹–Ê£6kak\Æa¶µùê ™¦jÚhŒné¢ì“[”ú7lâuã.¶ N¨¼JÖc¥›½ˆ¯_Ræ:ÅžTO ¥+¥öÁÐTL»S˜4ªÃOº)J›§‘Wå»ìUÊQF}·ãÏ™Qd<™¾o*¨-勤RŃ.åù}äïL+–e[¶ã´|Ûæ×sR¦5¸ûáÔ«W¨Ê=ÈýŽŒÇi}IQéðú‚ ‡©¥qûŸ{UOd35ûv¾»Oƒ8q7w|S”žêõ%wÿ«ým‚Ã\ýIåiÉõ!ŠÌ:6ALšo1bLyn3òˆ fWQñ€#GQ§„î%~RÉ”•ÿ$í#sž–oÄ•8ޤËoŸA®­‘ž ª¿øâæî …¬È„z,³”~õçr   ›×­( d¥ ÍÚÑðõ”Ö{ŒK)r<'4BÒv¦Ù‡œNéßFå‰ó­3fåÑaÒW#ñTðµ§×öi´A—ø<ýbË ç|FÅÁCU·©?~ø´Œzçw"ðaqþö¾#±‹KŠž±¿ǺL]¾ŒË õ½f>¡À]J.hMp„¿£âcuð5ÉÑ’á¾étMÖé¶:½…´µœë¶—c5I‘*ª^Õ”³ÆP_“j±iöDvS¶wÒö̓è§Tß…øÂ]§©ùçÆWÑ]‘`‰Ã嬉?_9?âµáŸ;tËpµëÄ<Èöyæ½RÅIf«'uŠÔ½‰!O¹mi›4„Hp/gÀýW^9~ÇLOY*ùŽÅs]Q‡ß¬Ò;7ÅÆ0b3H?ÎÓïB­¯çp+ÔÆÍËk0Ùú2}àÖš€Ou$ù„7±auÕÛÓ]×?®õß“zs«%l§ùÀÝÏiþ¦©|ÌÍO æÞg‘ƨ¤R ë¥òžNÊ]åDË¿´¶Sø€^yÞEÉtÚˆ—é¶t¼c»”>™£ÆwAå_ì,M,qIt_Ï&¬N”¤“Çmn«†A ¤™–ë«û¼iò}å¸ `üU~ZºyÛ¯d {F»ÂîCojhÎ#¶O(’#8Ï àØ…2#Bì(=ùŠÏ†¦~ÞÛìë ´^ …”Q™Èéi²{žòQþ3š”’äw{¸øbž| Eæ]Š%i2œdÈ»ãîùÉO!Uùƒ¿ã`푤ˆ<®žþ·Ÿé„(í™ßysIèf*ÙA__iFDBÌøFúq®¬Á|‚‡Ëû âÒÔŽâùê~[=æiBuè‹é³’ûT©&~·w†sEY$öàš#9W‰&‘¨Mñ„ÝÐQÕ'ÕWzôB4znˆaô:•ê±gλ )ujÁDH¥ªmÀHÐ]׃bìà§Ÿ^{‰ùBmÞôÆïŸÒ[ À°ušî$\¢²ŒçÊ02Kfö§2ѳF&'.`/=k!TÉA…Ÿ×Ÿ¦B)&L5{ßÑ;ÒåT"AÖgº‰hŸ4Î4áÍ´ôÓÊM ‰¼tX¿ þV¨ÿµl¿šƒBœùe·.^,‚“î­OHòp¨§Taw¸3Ñû+Þ]ñÇ¿A”(¡ä'깄ô'Å()S—r­RyN ¸6ËË t]¦/ÌŽT~•ÄôÚ*åsùÁ&y­5ÆêÎ=z©¥â…”Nž8Óø:µþ´@c³|EåFÐ{Ñ`Ù<ÿäã9ì[gÇÞ|4Œ¯·Àž 9»­võ¶ÒRtMô>EŸ÷Ïâ æe_¿VÙ =¥wÏ…‘é ïRFÀñ–5YbÅ änlœKq#©÷}#ü} QÑò·A3o«^Ás1)epÕ¢³JšÜò¸‘ÌsT–7SUy ³ÏKו§D™c‘b²«MUÈÕ(o§w±Goš,&wŸ.ÕU‡W>ÀêN¾„¸º[Ÿ(çš¼ŸÝr ‡85ØâMšä}¿ €ZÍ&¾ÔU–j 61‘fØnL->º=ý.ãå‚ÒRŸh†£+ÌõÞ–vÆæLåm=ÈyDûºÎe©e]ÍWë§«·½¨"†3å‡@P>ík²ôjö©ï)a¤ršLQ×˱ ¶^Í&€“¯MÌ[‰3cø";¸2;&~ëMÕÄ{9Spߌÿñiο@oë/m<Ä#¹Û4tvkUøÝÇvÔ“ðq£ôxÁÊ_:ªyY„O{ø‰í@佬K›-”R·yžjd²ÝÖbO²ëÞ6Št-ÜæÓåíÿX¾°ž0˜ÙfË=p£³ôsî;ž/Û«C¥Š¨u “Ožw;JÍÊx´2öW­ªÕ{qeÃrçŒj¶«N¨Ì|èÔ2Ú೨ßìÞh»­ º‰ÈJu%ì{Þ™¡y>s[ëT¤ön³¥éÔÎkÝ^€Ð.¬~ {µñ’˯üîäÐYó lòÌ36;ž©T.ú¨‹s\Ë%ÙŽˆ}±ãZ6‰É –r ll,Çdfú½.±Úò¿Ú‘×ó®jL+hv´d+’N<>¨¿ây²wkΦÙM9&Ƴ`R‹7\@õ‡«L6 º>¾ôw ;aëÖ( º~y%Íž#³Ý’“\§¨©ò°ÏEõ†ˆ„HoݶÜ:ga—'͟דºž¾]ôä³µŽ\,qÀ[Ä™CLìò´&2\C§ˆà÷çU«gå¾tR‰8á·þ\rN`+ˆ8ÐÞ/׳Fâ|C·Í8ì×"oS¿+TµZP­Þ­_ܨ¡ªw—îîдTî:ízŸw~™gŠ˜üz{…MJǰùÏ¥ÊÏoÄ{ç¬V«[f£ r_§RD¦¾./ÆU5ªdnH(‰ô÷®îÕwCL7g—ˆbŸWñÔ¼"n˜Ìƒx“*¼×|lÓSép..É{¨*¶5bqû¸™T«Ua¤×ÊñÖ²›l¢"ïelÖ$6LøNÑÚgæÞI½N±IÏFV¾Æ;ÜuÇz¿àH[¯žÐvGòÑÒ‹w%ç{f­;8m7xt(™œ½Þ;œÍñ䌿¹€8¬€ßyp§¤œL²–+‡ Æ’9gKA[MÍOy§R¯¿ïµ{+¥T¶ÞÀ|AÂÜ£õð2+Ö}XÿÙ9ˆÔ|”ŸpôLð}ßSû™ßÝmÜ x–¼/íARƒÉ¥nI†4ÕáRF rÙµ¦41"è ©§¼}Jjx¡ê„ý"ôoY©À1Ö½¹Çd”ëjØh“š>¹%‚ÖXº“qo¹X8¹õ…ÿØp󤿉Û2äŽá­…Ëå DZ?¦ÙOÒìÓJ¿ª2vöƒÝ‰ª»š‰ï÷=få7'4N.Ý:jW7.³ßá°fÆÝUCA·zª š=MðÕ‘Vézg\ Ûô¤{v`È!¢÷àœK&ÃÉ=$W©¤¤*x­Õîk{ÔQiàF)Èu\5C9M!sÖ©»Þ³…üÉŸî [(ñt†Ô 76ÅÞ÷E`‹ÿ:‹¨´ç³ƒòí³Ñ·´J{m~§„sôÔó‡–'¸á½zãÖù@§€¼æIŽd½Ã5qç , ­Ï´9]_"Òó»gï¼›•Ý™ítCdB)Ïäã¶yKN­fŸÞ,m=*ûŒŽÃÇÒ÷:dÿ‘+¬=æ ˆù‚zÎ6AÇDé1Z{[è~ z¯Ê»œâØhÕ¿$ÜÖvˆ%º‹¹wC_Ó.¾ bàNßwîAö¾CMGé‰Â.ê³E(¤_ÎqòìF|FrΨ8õ醾¦[l¡¸â±q`pìÍûR‹-§sö0f[þÝâ¨DðS² Fí-=æ9Çkœ4ˆà¦húbó¬¥î/X.ÞÌ|¾^åÉÿvŸ2óœ¡s¹ì5‰[¬Ÿ'ÁKšŠ°Ç%p“ÃÑ=¨†Ð€nÚ‰ä7®­H‡“7•Ü3º8™ïÈ¿Ÿú8̳Q‘3ɡܲ¯*=ZðÓ¾³¤(ĺÊi#ÉsïÈKÚ3彸?¶bëÚ *}Äh'Ã]>wqì¡í¦Ó94ìÑÃHN1„>éã3ØÑn£“äel¬ÛSe%®K´ƒü1Mߤ¹Ú /kvoÞM†Mßü°ý.³”9¸®µYòaãK‹ãÄ&«U!ÊôîT¨Ò·>–ýøH9ë"'·-ÇM‡¬r5oqÅe2Ѩh®ÕÖ¨ÇSÛJ€3˜8‹>¦Újʼß"ãȈáÔ0uðqj繎䧌ˆ`kc²I¨Í‡4¥ÊK Ÿ¾i @¾€§J«ë]µó‹½EV€ ÏÙ,/NɬÎÛyöA.¢ß¿ø4]Þ¹«Á^.¯Ù^ásƒé¬A“eÄÆ™‡7£æË…ï¨\q”{}µÓÂL—¶?TâðЄ3#S~ØÔXlÅ‹Ç×Ò–ýâ}|Áq¶ÀÚ¯•înûs¸.? gòä^Ä(¬¦ÏoêYʬ¿¶ÈÔÞèfˆs }¤íY™Ö<Þœ_ÍÓ¡M%æœòÙÍb§(íK“{±šÇ^yøºp”n‡ÞÏ—vz*{Yû]¤µáEM§n½ÃÜ\Z¹â“Òè™»¹‡|5.µë³u?ÚשàÞ²]óUnÍ ÍÊK+j“†§É›N·æqä¨ÂÔDÑ«ÍbÑe 1]Lú^zˆê’ØÇç¶tCÈ4©šVõévï Vº*j¤™Á>õó›¯'E êEiÉM5½-Â@ÃÔR-c¨d¾t¨ê/¸*âטŒÏ©ÝM$Ö˜QRÒ̤>c¬³‰È€ÿ%¶žMu`œ~ãz&µ7„l9"Y“™–ßNJ E g)+õ¾Hûðõj›h¶ˆ¼¼¯‘¶¡ÄBg~ßš3ÖþÊá™òˆ¹s’”kL¦÷¯W'VGÌóרZ<ÔÈÉfP[Y5P=ªºY!kA‹Ð)91×.Al†žY8}Z¾)–ÿ¾hvω=sÏ=G†ǪôWd®0÷@äí hR› Q|À³uGKy¾dhßúXï— çÇ€¦º^ÑãƒÚœ© 3/æ);óKÂïúæRU¤™qbŒó”eajQÏî"?ª|X«æu Ö7‚ƒóá]d b…¦A–VAì{ëßWYyXÈ­áûT úÑ*ˆóÓ5â|IÉLjs¢|*3îU„˜«^’O['|;‡ÓÉùréù¢)0z›’xòøyÜùgø›ðýó¿Öžç%~>ÿù#Â÷ÏHýYø/ ýÉÿ¾×›? ÿ¥À’?ùÿ#Â÷ú/ýgá¿$ô'ÿHøžÿ2þKýäÿßÛÔŸ…ÿRàŸüÿ!á{þ£ÿ4üÿäÿßñ_ügá¿$ä§þÿð=ÿÅþüÿúþ'Tì'ÿDøžÿ?ÿ¾ÿûCÂ÷ü‡þyøÿóþ‡¾ç¿ø’ÿûÅÁ€âïÍÿ?ý¿þ–ÿΨKvN¶.XKHW ikW×½·7ÿ¯û 2ø7ÞÿûËû¿P°¸8QN `1 ñŸïÿýˆ wLUGEß¡Æ}V_ Î0P†k¨pó‹ŠAUDEUõU¿ˆ‹€Å¸õÝ‘ÎvX;g¤£¨¨š6<•Q2äålQHy9'Ém‹Åº £Ü<í¼`<*.ÎX”3VXßÇÅÃmý5ãÁ¢¼±{RwÚÚéîÂÂì<\„¥¥%d„ň0±vXG”¼6ê÷_^C•å&J&Q0¿É¥ –ÜÄ—S¹u÷Þ^v¶Fɉ~mH%çhçìÀmëŽBÃxDDD6.Þ>”³ˆµ‡·;ÊÆãõqDyØ¢PXn,€Þ7¬ˆ¢_ ²r±ñRÇ„…¹Ï œQîH,ʆÛʇ[õ+8n1qqnaa Ž÷Þ˳07;g”7¼òor¾CÉ iç¼§W<òZ@”ÏÙÊÃõ4‰È@Ês_æþíÖ¶v6îÖ¶>ß@¨«~…qö—¢?éìì‚%Òõ÷€àvØ? °Áã[{"KþÕæžÎÖD¡òø{´PNV€Þý!0G+¤ãßãñ¯ÀpÆÿº(Gâ¸ü•1{ äDNå^LþH$PMßÅM!n;gkGO”÷7¸Ñ.îÜßs[¡l‘^v.žî²rVîòT¿Âåø=ŽÄ÷ó%Pÿ¦öY¬¯Øÿƒ"ú"DÀ_¡·°ôÕÎx-w”ˆˆ±•œ+ðßÚÅ%üÂÜ|nž.ØÓ¿‘ðòæ[a€$kÔ7¤þvÄl‰=~ƒ.º×çñÿj÷V¢62è_uú§ï•þ»º†”‹ýªk¢^ÿÓ¾¿ÿ»:‹ÚH[ÿªs¬Êø*!mþ)_k}­ôÏ0Ù“oxØ \Q€ª8[ûpï½ú¿'·ÿ@øeFrÖ€…G¹ËËÙ9a¸=Ü­Í#ëâ^ï°v$Þ(ÀÃmåânƒr‡ñ€y¸)× é ê?èË(ááF:³ `hE¿õJ%ds;#sþÏ•éߤÀF«(À_ÛÃIœ#ˆw]'2I€!âI!TRHBRZpYÿ‚Ï?ê4øÈèoÁ—–’’‘’ÿ&x¼ÍoˆÂou#)"ö$’–ø="ÒÿHÚ ¤“ëiwÔ×P!6î¿ظ |Ýwþ·¡ô»ø×þöŽG¹M½ìܱžHGó_ÎKÿºþ=|ÿàÞõ_îÌ?ŽóÈ«î´í Ø€ßú=ÑßXñW¸ÿŠþ°@HÄy:íí»óÿº6Üó•ç6@©qîTèïexäŰÃú XÛÅþo´Ú9³+êßIê qù3(¬qºú«‘PÁº;j¨|³N@ô› –ìUþVäAŒÿ3âÀ?è?ÅõÛÈIîÑßú~àˆ9ßF‡èý¡ÁùþÃAùSh޼†Ö˜÷þëõæ7 •þ[BÿE[ùßF/ áêîžÿÕ\ý#ºì Pêda (¯ÑÖ}ÕÒZWw,Êð(áP"á6(ôÿ ºO¬¿ÒŒÚ›ë-\¿Mö?L¸<¹Dríl,<þb¸þ+¾G¬‡ú«Õúï¥ôi/˜H­³§Óÿ ÅýC$ïI³ êÉb{${b]=±Øoîæ?éÿÊ*å« »£¬ÿþÿ¶ØøñVMìù.î6€%ÿï6l¿Kì7^Ý—úï§õËø“=~YˆÿÏ“ò?dë ÄAøŸcäþÍ{>Ë%âN±…‹³£ÏÿÊ‘àŠàw”ºßŒ· `~½Sínãþ«}©¯;VYÅýÀ—¹a÷Çìתü3v{{z¿ÑçÞ3C7´xTÿÿ¦ÿßÛà8Kü¡ÑÜÛòûû}ÿñ#ƒß>ù7 ÷¼¿n¨ës]p+PvqqÔç¶#n.}ËÑGyc•=Ñh švß6Ùþüƒù‡¬0§i]£ýK;†ÿVûþuOMˆû‡Ÿ¨“ÂÅ•˜ýÕ6Ñ#žßr þ¸ýÄM³8ñœ›è«kØüWïœþ.¡P"¡õÓÿ« ýÃó/@´Þ¯̾*ô??6û›òÿù‡g¿+6<ò95ûo™?dø™ÔÿŸù·ÿ#Žÿ°Òü“‘øÎkýß§¿•_\­?ÃÔ(÷íEÓó»t2²`©ÿ¥ïÒ}ÿþÇŸáþñŸ÷?ÿÀðýóߢûÿòÿ‡„ïõÿÏpÿÿWýÿyÿß ßóÿÏpÿÿ7þÿ¼ÿ÷‡„ïíÿŸçþÿŸ÷¿ÿ˜ð=ÿÿD÷ÿÿÔÿ¾ã¿äŸáþÿŸ÷¿ÿÈð=ÿÿD÷ÿÿ¼ÿý‡„ïùÿ'ºÿÿçýï?$|Ïÿÿìýÿ’àDòëýï?ùÿCÂßòßù/· ZÝ›&^ùˆüzAæ·kZlþEÆüÏßÿ‚øßð—üùþÿ6+ „"¥¬­ 1¨Dý?ì <”{ÛÇÇ^!IöeÑB˜aÌ$3•’$”±/e‹ìf(ÉE’lE¨A2Èv¬C ¦¬ÉŒ½[Œ1ï8ïÓ9uÞç9ï9ç}žNç=~ãž™û¾îÿrý¯?÷=ÿ¹¾PDÕÒ†áøŸ]¿5ýgõGâßÂõ÷•ñ¿Å¿Š¢Ê/㢼–ÿã›ÈÒÂÝFÒíÇ|õnVsÇJJ¯æN…"¾ nÖ?åú•T†(Ê))Á$U 09%eÈgUkìŸ žÏf¨ªDQYªª(*~6SQ°†™{53mù㊫ŸlUVÓ_+"$U¡Œ¢¡°Ï¶– Ö–_f¼þÇw§~²B¬&µ–TUR–ƒ«|¶)X+~™9ù‹ÄÏ’ªpÅ‹Ã_è¢"Dáë<Ú’eÅÕ“+)*"VÏþg;ñÿ ?ÿ®Îv¿¯Œ_%ˆ* ú?â¶ÿßDa'tµ¹7ˆ¬anÇN‚@,K “,+ ㉅íG›]'ŽÒ\¡Ó³²²è °°kEEEjj* …  ‘Hh4 3Ž¥Óé)™ÅæŒgL—Nê€ömA ~/CNy'Q’»÷Á+ˆîºÙå×£ ‘ׇ^‹²òì Ã4g–õ"uK’çÆóLm¼ 7÷˜Z5EÖˆf„ÞžF³ƒ—A;±Òû¯ S4n֜ݞâÍtRzZ‹+žTTβ?"¶•á"‚!æ?|~¡zeî©aNÚb4)®—û2†å@‚{%–þãïháÁ[% â”Rzûü½f¶Jl·«öæiMí³¨ÆH6 ŒeyÛø˜iårà2ºÝ b¾Eú ً٨×ïÐ Žºè•î0óŠ ÏGj©¬K44 ²W؇ÑXQPû!¨[z¥ëF’Ńˆªñ&£Á P|@F‹BÈ£ “$Œ™p.;,ªËu¹°Ó’KcõbDÁ›©]­–î•ø°‡'À—߃E§ž'œÀà\vïzZÀpkùŠuQU_ П²S¯¥U©ë>[ô ªòÊOb¨ é…Ëëp.\ýeƒ) Ýd&€û€F YjïÌ‹}ýhf²èå”$³‰£ldÑÀì,|=v@;3<òQW•UÌ›×e6¯pRV™wÈšåÔÞá.Œ#í)AݱUpbô y…¡òv Zíu‰KËà•WµUxÅËÂ}ìi»ÇËJEnb.Í÷Åòí½Õ”j}lž<ŽÕeÖÈAu›7@ãÓ²f«ð\½b%¥ÌG™ˆvÙŠÚQ$ Y0MA­XÌØêa›âìÔàyc$QajÚ3Sÿ-¸Ô­Å\£%!òXz¾ÿ]I0yì~¾¿È‰q+\êQÒHMl~£1Dsdl V·—º=\}*±¥³xÞ,_¤9ŠóxÌSuŽSl¸ÔË)iyˆ{á4® ¾ÈÕ{Óú…ì¤ÄEÄaË)zùA!²]̱6Ý\{G§GWÐËO7Æ„ÎtæÅ¥¶š æ9¡ 1ü±¿3n¶¯ ÏD.yl‡Æçs}vµy÷â™ÉÅ<ŒAIS&‚¹vÆû,g\z$„h‰Í'ô±+QÍžšmáÔ©ñ½yVýN21Ž•IdLAìÔÏè²ÜK2&ØÀ‹¯Ð(*ļƒ= þ“™ç>ô’ÏSOØ“¦Tï]¡‰3võª`‘ÈÖ>¬ÙvLýÇ^Ì ø}ÚŽ”Í­æ­|ñe ž3Y¦‡à÷Âshúæêå²ѽÒø’âà*ãaŠ=:‡¢þæ&m›ŸoIÂ5º£ÉžÑÖƒÏhMRݪSFsü‰Ø³¾)‡µ{4d{3ž•ß͵kÜõ ÐÆÓúx×Ïõê¼h“çj=™IŽŸ % Ê\Äúû&S©¨N™\=ÅT­©.D;1"µu|^j1tød¢/¤^Ê%ã¿@ˆœÐXÙÓƒÐkf7»Dì3JʈÄÀú¥üCuúÛhL áRužaf¯ï‰o¢TUU­OF~âÖÔ!!º®Ô ÝûÁ®Õ{ôF.èÅ”–Áöi}9é”÷z›/ +ERpùár #ºR~У^ÆDøE#tÓã¤na ²ŸÛÏôT¼Ô¾© =Ó[ˆP>HV; Ta™ùÒ”<ruH‘}jõ>B+½B»xb*Ýè>­eœÃï\=²?/„;{A¯Ëû¨¢.@É¡e›Eßæ´€{eÝßׇ¬Gj¢ï…?À”¾ÃµèU+RŸ¶(ÔÜœoÖ†"­¤öeùùÏŒË;Íõ™W„:R·ßÜ>§6b¦×„£ 5Gý Ï ,®HÏË¡¥ê-Pb›ö覗o|¶¯#’4ZWŸ>6˜ÊËÏq>¾7fë{x[#g‰fåŠÄxæZÝ‚ÞxŸÚ[U¼gX_ôõXCaí%$GÚV&æaì⇡ûQÓ‰`{²r.Ùm© ›--¾èƒ®ï?ùã‹-%Ø =w®ËåçI`Ùl=·ë+,)ýAêt=y)« ês‰$®3¥DÔÛtt9'óôb³G?´Þò $+ËuùSíŒíÝ“èyz㺅u‡AÀPh:d‡‘;I<#IÔ“$v§;<0ª0Í|Dcz]|¾ø^…¸°igwÆBjbµ¦›qàêã>Y"ž÷e•ve螨ÂF^lTëÄ ‰ÀzÉEïf" †mxÑúØ'çKKæ&Žh/¾×BŒt¢•1tsù‡’w·£°]bùæhÉùû‹nûHQƒË'G왩¼“¢å¢'}# l7GY¾XК»ý>"M*·7OÛ%=nwÍ/Ÿw;Ÿý¼É%y,™›+NÀñŠ£Aƒ Þ0Ún;; h*”±§ÉN3[Œ‰LUî¶:$(pµëÄØk^²û™¼·³qÙtw‰3v†-¦QØ\ΣdOM¤ñí”g&¢ÉÙÔ;gÊϳ î.zÈÚU¹[½~s§×Ð@ý89¤W‘ ®?ɥΌEË›E-_ aþtÐA¡Ñö™L §4›åóQ.»ͧ 1S=RLÔŸÙÄæ^h{*²˜£ñ/™c˜1Q«Ëá÷PÃ^ó¦Ûì6Ið RjùmÌâ”ÀˆîÝ+î¹9Ù2Æh×Þ;bù‚ï™g¼ô½üâ¼kÑ/øïð¯½unL§x. ñt£©ú]&Æ©œVnþQåëñï8‚Q­Å¨˜þð§Ô¶YÙñMà÷ÙJlC‘tZO¾j¬ë¶Oûúô`+†ƒ¹?ôñÞDéP½¸@ÔíÝ–©cQ ùç$!Sm{e\ˆh»ç}µï˜ûýkc5¶\¹i›Ú°k |Ì[ºwn0.¸cˆíïø“é­HX‡_b®×4ÀÙµ™áé;b0 uq( è¬ü æü,eÖ¯kÆ9dñ 7Ëh1¢xAÈ2ŠŸÊ#äDz¿ÃÎ…†âí4ü—?ͶÙîædñ¤])ªI:«,Ã!7Ô”áB2Á”©œNGËõC¡¢i¹8Ò§pÆI”{Å[#)ª¡ïý`5õêf=Ž6<84î´œìØõ†ËN°¥Ú`þ×ÔhY—‚³{ùä"Co $럻î–FÀrë·.òölÃúï¯Ï^®v±C]Œª»{ÁýðŒn«xlµmºÛ²çî[˜èxLdîÚ•‚Ôbþ|rV]¥ 0,½ö€ŸÐjž‡Øz¬Üp¾ô>ýrzuµû©©¡X.Ó!óÝV 7QW|éuá²äøÃ†[,Ê+$ h¬Æ@ÿ-®»(™zámsQ3ù×/Ì EøÙ¦*?ß!ÏT —˜†õ.Ïø/‡^2úİKD ½Mæ)D‡¶êd×Ù-ÝׇlÐãOØ\©;¡nÞÂyÒO€^Ô;=÷CïÄF’÷…!ŒDÚO¯,Å7{_<ᜄï#¨û(©s\hˆ½Ë6[7L½/åÑÍü&Gq15>+afðÞ ÚûrÚr¡¬ã\*Òíq[ ÂÛÍÛ¬ ²V öG¼ä­“TÒ-_íðªMé3z&À÷ÉùS¶-…ØÏ]„#­•XÔ S [Ý2îÀrÃîbàô['ê¯{Ž.û´\천ù»¸k(1ssb x·~RÚ¶O,v¢Ý€u~`SÖÝúkoê©ë/§˜Zž’£.…4m8ñF{Ó|oÍLÀ}:&n´0(.êEüÑ÷G[fNŸ SºÃÛ3»òåyTö›õxM4Öß }¼w]öã #ÀÊ˶“3]íÓ’¡S¦¥W2¦­6Åi¯Çô¦¬t€i7Å9šÜ÷Ñ`pgÄí½®nÇâ—çë¹§^»•;µîm­YÿäFoÇÈ 2†áwùü,ÆÁÁâÕ§ÛHœÔ*¡KÛµRòpÜ#UÆð`mþô×A4ÜÙ(âN~0“òíF³ûG£?¶c¨W¢ó»f®WS©1k…SYí¬0·Îà'MÒ“ö\¶[*¬uájl ¢F1¥ž#Ùf(àdZ¥´Cv/S£ ¦Ô…xëô!óЈwíˆWÙÍðÉ^’¨ci‚¾Ê«‡î¬Ï­2¨çölõèÄ6îrÚB mÔT;M²'tå>o” ìĸº­FÍr_ò¦  Cá6P‡}K©Èí¹YK&ä¡”¨aú†núöWëã Õƒ5¸ð!¥løhiò'a) åí/|éïÛñ×â›FTÄÚ°ávA`-ïù»û5ŠÔ[ª)ñ¥Úy<À"©u!2º›î^Ý„¯^Š5Þ*(|þ‰;w?ªQ3í[Á ØìöOE‘JÊ=÷Å‹Á·h¯Ö§nï§åCï´M½xÓΔӗ—\\dÞ|¸° mجyŸW¢«uc9£’äAr<^û1  U¯LEôµ ÒäÎÏME?ŽáL °gÓ¨ñ÷Û”vç|ÅKÚÅszË/Ç‘GZù®™Ì/qÉð“*;r•ÀëÍÀ$©uãæƒ¤Š˜gìÛ~äûlZ 7Í^½–z?>’cÿf+;»=ªa¿×Ž™±~ÒV•‘Œh »l*ÓPæ¯ÿn3­]_>PE`âßÓ®J-z#êpê%õÄåÑø@M Z«Œ 85‘MÈIC›ùYç'ÌVç½ê:L”©Öaû-·ÏáOšå½,g Cë(H8ýàÒY ` [¿jëé?+Ûc4Œ/JËKCMo¢gši¶;4á ¤»ýÛbÞÍ/ ùTÈS7ðÌÉP²V«ÇâÓ·8îÞ]l½ä=vÙÔ©æ‚vŠ_ŠÀ·ÖyÏå.Ã÷uçÚ)†nR¢h´#ânQ^oùýùK~YÊÙŽÇ{&Í4\^ª‘t'¹ÆeF}%ƒ‹jYÀ#etˆŸÊñ½àñºîHK‚}^`A…pûî³VEuç:¼ÄBÜ6Œ2þp‘ð(É‹Y0]Ü*ßë©&Úz ã4yt“j¼UÇÓL¬(ÜByÌ+®m‚MdK±8c£PIéöºy`vçƒÀs4uÂù660i½Fç¾7ÏÕ(C"’æèk[Qøo¸v`¦å“|?¦T>Ln¸'¨DƘðu²A­}ª95Í„OL%€ ¬­ÔngᑾTë–i;-Œ0œ]ÀÇqvü܆Eú6ІŸI=²;Î! viÜnes¡Ëp±ã°®ÁÖ9µd(m;´¢½Ù†¤\;òa7aéS€}~çÜÎz)û£E~"æÍ2î¾{jÎЈ:V33¾«“ ­ï™§ð’–ê¤Q¢¬fMq€5Í—6J;·äD>I [xºTšfƒq÷õ úû~¬æK((G,,©O%ÔdöLÍ·[7åB“Ñ< ?è°§ÞÜG€Ð:gÁM”ÙK°ŒŽù©e;Û€ü$ÌÖÝ1‚–©r®š¸%Œ‹GÌ»žOÓöî3ˆdlMŽÁÉD›%ùY]Ï®Ðäõ¥…½Åù>@Yü,†•Z6â©å6ÛYU•ú~~yä²y@“À™qá†ÙyÂr|ñàii…ásæGÙ”·Ó ú쎅|/Ê2óy6nÔ}?_å²£€@åÿè£ †çÖç-/$ÕÞšâ+ž’‹ï¨˜\‰”¨@°²¡óí¦âi8²šÝÆ"=³š‚ŠX9ê¡ü ò±ˆ–ëšY¼-Ë{*ØS¦šìõŒtÊé€÷þ/Ë6A¾Œ]]Ô£çS_°~\i˜ÏüaEH›qLãºÑqÉBžÈóV‰d\ 6ÞYBû²’K÷ ¶ÖBç8°’Ë\ìxˆ‹ô‡ÓŠì”¸³é,d}ßrŸ?už3‚p[£w‡G¨ªwù2Æ¿ºoùÒ9#È8‘kÀfE¨k|Œ(~éPŠŠH ¯(·¦Ò{WÊZ‹ 㥴'Yþ©—¨cÃ…é‘n ½ã–§yÁ§ *fY2gt¤Ð̶øi ]HJÙâÇNT¾ŒÚÕÅDnêHƒ›qƒ:õä|Z‰gÅÈ\É„Ùa» )#X‚ˆ¯ÒSdCÆÔV|æ{‡:ž6š:«âÅ€í2ˆ¢çê»èéY´íз¸ÜAuF´ÿøæÕ#…  *"…ÙЕ3,"ä¼ü°_,?¿> ÿë<«{¿ óå7Öò[ñ^þö§'ÞøËq^~ó ø·3^þ_øûÿÛå7„oÆuù+ 5žËÏåŸ4tçòlåÏeç²ÆsYã¹üÅZºÆsYã¹ü¿æ¹üÖ+“ßÍrù\`¬1\Ö.ÿæqýûù-‘½Æmùm^ã¶ü͹-¿ùfÜ?ï¯Ï!ü‡y-«'ø?³Zþ½“УeÑòuæ£eѲÆhù«3Z~óßÚ?…ÏòWølËò·à²üæ@ù½ðÓ¥Ÿÿ·ä°(Aþ¦–?K_¯ÿ…}?ë¿×øßD_ÿÃò;ðÿ?¾ÿ±¶þÿ›èkÿ[}?þ_‹ÿo¢¯çÿï‡ÿµÆÿù6ú:þ¿þ×ÿåÛèëøÿŽø_küo¢¯ãÿ;â?­ùÿ›èëøÿŽøokü—o¢¯ãÿ;â­ùÿ›è+ÿ«~Gü¯5ÿ}íÿïˆÿµÆÿù&úÚÿ*ÿ ¦ UaìÿoÿCÖîÿ}ýÒÿ?óÜmœÝ]ÜÐèUô…»½‹£5nåêúGP«þ ü§øúcþ˜êZþo!„¥•­µ¢²²2Ì®hke«b±U„Y«BUlm¬,-výÖôŸÕÿßÀú_â_IIúõü*ÁÖøoßDÿŒÿ¤¤` Wúõ‘𙥕S©H”ár*ÈoÁ,AàJrp%¸$¡(Wþ‰ÌU°¶€abýc"ŒŸ­`p9( "©¬¨,…#>[­2«¡ÿ³¦?!” ?V® ùEõl¿„U­fµù¹I˜œ2LY¦¨"§ŒPü‚‰¥bû%mÊÓÆùÒ×-SV…ÉA• ’0ˆŠ ÿl‰`ĕʖÎÎÎV«‹~2…!Tå–pU¹Ÿ UΫeº¸ý̸ReôÆjóTå¾jâËšzY\²²·þt¥a¶Zc«üS_*2¦Ë/{ÅÃÉዞ„Ë)ÁEAar¥ŸÊ²R°f<¾ðšÃ/l 0¥ÿ¶Ãÿb #þ&úƒóÿïb€ýúüUQ…*ýrþ‡(®ÍÿßDÿ„ÿÕÍx„üÈÿ"uçR@?ó¿´µµé PVVÖ¯ó¿x4Ò/€¾æI‚>ó¿Žz½ß£º7è9Í™Öï69×Wû(f|Ô( škS\ØnsÝ õmé+•W磒’_=™_·s0 é!TppƒüV é*ÕýƒšÓ+ÑâXuk¢Aàç àMö»–òpå’VÌD¾Í•)7@ÀUVœ¬t úV&òúõæz‡A~?ïz¦K£ù'²”±à>Úk!éOöšRÒl¯Â*S®Úƒp²i•)×Ö‘…+³3‘±š™žñ5 qH÷8÷”×vnºÖÉô̦VlèØ|V­ûÍ1–ïð3ÌËî=g‡òÓ|Τ–GL/òÙm›ÌlœüàY×¥BîvæÎƒ)j Ö”è¥ú{@‡9ïé±it{YŸ}ØÆI±TϬâ²&=eŽmNf”{îúDվΡú”xKô(¼•$‹œ+ô¹jásKZ7&n¹v9¤{Šp{‡ÎTz}÷Ý[<­Ÿâ© e%^Û¾N$â¥Ùý«}@Ç(µÓ4i,C°½;.n¢Õd“sÈ\› ®î·Y³ŒßÌŠ:>ºŸa'³Ý ¡iá²9jâãhG¶Q@å8Å+N\ {ÞUî¥Ær]šÖE×Ð)²<³¹[.Û®Ã]×Yz‰*×Þ±ä0'{Å1bTŒŒyN°P˜é®)ˆ¤nVjb' ¼ÐaW/$˜I´(¸ú‚ñÃæ ÕC\ž‡#“æ{Êš8ºì\Ú¶V§¨VCˆ ¸½½ €õ±ãÚC;É!eÅ‚\@uÿQ.µ½µé3Ch<Õ-L{ÈûB Ó±‹S})®.þÖ›Á~Fl¸ú+ZÇO]VGçuksïäert±|}ȼÇêæŽ[ ?±pÃ}ìÄô¶6ö¤ æÑû4‹0‘•_7– ¤àO%¨¼R”²&¯Ã5´íÚ»…§WÄ\0£-§È¾-aŽÓ­7'ôlW‰s—½¹ÚFœ{í“D•®VbB’Ë˰kw`•¶"øtUÞÞb%žJ·N\O_/+ÒÅ⨜&“ôî³Wÿú*ßGU§@õL™¤Ç +Ìd}•w‡ÊûÍâêëEÌ:×/¸ÔËnô»•ã—<µˆŽõpéHQ&çL^è5¸¦nÒ25²é/OÝCV*œtè V?ߥ~Üï1.¤<Ó 2=+åèæÅz¤áê[EÌ#. ‹ÃN§vxÄà®{3W¶Œù09* ÀÏ)9î‘ȲÔÂèw¾„½¶€¸A}™Ç<ˆÍ^weˆÝžñ*X—= êKi>gQb)5_€;Èr˜ ^@näËHƒˆ]J«÷Ô^ÞI# 2Ï(¡Mª«‡³ã"‹ž–8~ObÑEso3€ÆJÑ NÖ 6õˆ~H0Ý ’g¼ÑÉeºR“,àÈ–S«Q8oomZ"'ös—ÖŒ•UL~XöÛü>øjÈbÁáÛIƒDéM\&øO.öàùG g·®ÁÝ”>}R³oªÝ·4ÑPìRÜmúêÚIµ©¿å6»ïÖw+„Z`pfˆí y§v¶“óÒ G¡º{we.½NÞBÞzM|ûÙa mª}°Y38*þr<{Xv’R¥+€Fî±_Ù3h)¬Lj“/‰ôf" p+’™VÂv:>EçuëRÔÕjÆíP!lD­iò¤{·Ø VŽ+:X¿åçÛLµÎj½xmwçÝz !®g¡-úÔo~ÝuoM‹7/AJW?(›Ø\ÐÌñVN>JÉ Ù+N0—Å´@Ô²·ú2m^ø2±R;X!>ÀB6ûÐÊ)Wµ‚[ uÞ$nÛÎ8“•åbV1±@GRÈ¿Åã Fó¬VprlÜxå¤Ej~ø£>çø•GRR=å‰\Ž>Õ§¯ø®#÷gEE‚<ƒ¬wkñ~Ø•îÙUá|˜_u¡e¹ªÎ+\Üý®…}¢Ld™†Îˆ#ª»ÍÖ›wiÄñ_¥½{ÀLí*Û®¶1Ý1ºó¼~¶cÝnm&Ü„t«I9]-㙫|rÓ;Ã~:,Ó-ðôÞMç¤,®ì€°µ¶›Èúž½³+yÅ`Ÿ“§á•kêìÅ··¿ˆñÛÇD¼2F‡Ûz²Ë?Ò=zvâzd-§ÇL3qûza@è®ëã{Jíòt‹ˆS?nÉvd&§±rùɇZ|{“9P=‰\Ô=&ëüid :¤+XŠ™Èæqºþý™¹Vç‡ÇQ3ù£ÇEÍ_W¹Eæ j@e÷<ï¤[·ˆo©í4•²Ió3ž™ˆZÙ$'ÂÏ®¹¿ÈþJ4â$ð²‹Î³ïµíê¹ÈähvýP}‹ˆy÷ÃH]Ë^uÅÀ–Gù­IÙZ ²Ç™BjOm˜‰I"»¬Èíæ›*Ÿècûf«„õ›1.„ãÔ͹qÙk÷®l©=ÅÑ´Q”Ó<Þ¥/d£èîVdŠ c'òs/{÷dú&ˆ|¶³T7€…î ­l5|Äɵé(l2f"§íò°¸ÏÛÍ®¦Å¨jÉdzÁÜîånqå'‰BÉLŽ"£Yû¯ƒžm­•ßiðŠ]4–XÂ^²ó„t Óá‹V/½»uˆ\§ˆ9:Yø|[¥³Å®B‡jÛ¨ë¢ò~ú´q£e&5,Äéo´ƒ+o‚­XýM!âA`e3š${GRDkèÐôýŽ>…ˆK°Ì8uŽ }Œ¤¶YéjÍLŠ>2¾ÇßKôÝ&ÌÔ¤Ù âÖh/©RyÞJg>#áQm;%A¤ŸWá9u¬?½£}Ù>ªƒZXß¡>sŽ¥Öî3Q x¶/‘>=NƒƒÚúbU×;Štñ0ý{oåÖõß4‚€ˆ€‚” tww7ÌÐ5t Ýb€(ˆ¤4C t((9€€ˆ¨´’’~ƒzO?ïûúøÿ.×…Î̽÷Z;~kí{÷ZÄßH‡Iq’ZzË¿zï(îØhÚðxnŸw[úÂîm áŠHõée—sKÁ"2îçÇ´WÉGãß`à ‰Aï4i̼4³,ÏÙ=4qkðÛÀJž Úºªúêãħq»ŠÖÎ×oÑ?œÆZ2œæP§»pFóá.ÀWr·4•>ÉõŽí’–õ¨¹Ôsõ$qBCž·f±Èܺ¨³øßÙÛ³xbÈ×L¢ÝĨ™rcÜbÒ9­]¯ß&­Aä¾éËu±€Î–K®{ñÓœ åÏÅVÊÕ3¥CXóÒßÛÔ„1¼]x%~nÑÒ‡b‰ÔŸ«,'óþë3[.[›¯T‘›aFÆ5Y»4O'-8‘µÿZª{Â8¯>Fý‡3fÜP».Y¼Ëû›¯Ùõ‘:ú4Ë?Ö|b™lÖ7²°¡) ËêØX¨*D–ÄÄÝòÞÕQw¶@õÀKRRÀñN¿Í`Ϥiõ,ñL+ÛJÂz¨HHŠr¶¤ö®w6- ¢ž.çÉ#! ‹|h;ÖÕ T„‡l §ÔÝÍÑÇk„fk*ŸGiº²ß›§À@Ô˘uÜ¿ï,J¶©“²Þ;MßNDÜT‡TPÒÅçØ¤ë>„A¢Oñ’Æ·î‚Ë_¯uéÅ[ðSS Á Ó÷Bù”CÌÜx® rC²…ÌS\ŠªÀ°éò¢4[ñ¯[tÍ|ƒÂl .úŠ$9K¸\;TôͤØOÛ35“Jlá×%¥'_èìV(/Ò16Öùˆ Iû\Ö/‘ SH3Û­¾=HÏd€H~ñŽ¡ i.f8ëáüÜnÚë¼ÙÚ+ˆÿiqjbßT,¸ kÂhª‘;Ò²­\ᢪÑxfî]Ý!ˆÒW»¡ŸôÐcʘÙû0md8›ÙB—Œ#¢/}F(yZ 2U®¼JîÕ|à—'Äv€n¶k‡è„ @Õ$g²Å°ÍÖÌF[¯N,UÌßDy\ºgw®ý4cÔ±˜ŒÚx×xî¨×ööñ×Ñ j®³à¸.22+ÿG(|¹ø&…ܲþBé´žë1Å%§â²¸y=f5wNÙ0mtpwŒ¨–Ûëj‹Ì´+8ÛƒEM#8pAÂ~Þ¢šDÁdA—7<³(4vÀsÎJ #/̬M5ÎÈÞÓ÷T½-¤HÝë¹brܸ©è•SwÑáÂÄw±fâ—=´Ï"Î<\uƒlªwQ7QÝί6½Á¼ºàEËOIfâ¯MÙq›P¡®qfãAPšþÈœ|5Ä*UÀÕž¨¾Âò¸+úDÇÆ¹7°¼#º'†¶·èn-L¸Ÿ?¸I—àaÌ2‘ÝjöBÌÓŸ3úÀo•õ0¦îx›w¹•«‡b=ßýGp;l“AôºŽDƒhí©pŠ¥Lb?ÉÖùWëàU¢ëO:Z.u^4NpÂ×=jñzÅʃC¾¤>¼À{(ª/? B £¦JüpIGx,â0€Æ©Ý!2!ýÂìʼn¶^} ò±§¯iXàö½1tDëµ)µ³^ø»m;´È Y¹A¨Ç²cŒŠhí‚ÔAóÎ ¨‹*‚Pþ“äf /õÇáÝl…\‹_Þ¹qƒ/‰r”Vòú¯T,Ðb"òû»¡òdôøLi†¤Ühñj‡GlŽòV x1!ùϵQŠH4Z£Á¢ÄÞ' [lë¡/€¤ëƾ'@#Wp°–ï\Q.9í¸ŽmÒF¹¨Á!ÿ|ã~Ö+¡:r3îÇ­A R-çeGbbæÄ1ÖÕ)а4€‰PyzCÃ*ìŠàâ\}ÇUY¶òðöWÌne,̑ȓ›i"(ÔHß½ú,°×Ü5^v9ßÃAÝ-}(p Döf^ÀÕ‰Fœ¤|Âaóè ßG*í ¿ø»©^NßÎãÚÊu¢š`+Ô¿Û˜ÖäBäe´ÃÌ ñ6òy~Â[R¯œ!-ršnqýI–Í />×ûYb…}ñXÕ>UíÈU©HâAò´õÞ •a §ë»(|š/x…/]6‚/6%”ìϼ*¡ŸZvª*˜Ý{½óšôd’ê° ®×ÎKs»}ÓêÎ'‘Ûu¸êÌëæçÙcÄ…÷œl*Ä[L‰̯/,¦Nsì…Ox”ór¨ÜѾvbx–‹¦Î¤äCA½Ï«ö«*OiØ73 ¢62ÈN„±Á{g·ŽáŸòLÂÝíu†×1$*ô¸p¹5«¢ öP,©åRàfÃ8ÜÊÔôÞ™E!eìNzò¨`½`Hìs§ž‰0Õ[j›=®¦^g¶Á*?ÈŽ•þGÁ¦f¶’·×8lF§kàât‰½ HsLå0“dfÐ'½^ “ã†ìÌJO¿Ðð»u­9þüUL/톰+¾7ŠmTPš/ÁŽé±>0KÍX8GćsþÁk›¦‡:R-"²#ܹ~bxV4é_~‡½a…¦:¦|¡Vê‘»t:ÉJ¢ÌÏtæ©¶‡h(Îm„p\bPW)§¢úé9õœš?|"±+_§tqÂU²Æÿìü}ä¯þ”ªh¸r ùŽ=b5¥ªŽÆ6[`Þ©6îX½u_ž®óÚÜdÛf"¯S‡•£:Ćÿ™ˆÓ#Âs÷ŸœO_7ðA¹Øõ_a†Q¼†ïóAEK©û þNˆ³U2¹KÌУ¨…3›ì4Щ­ÖüÏø¡B}¨ÓNãꈖf™ÔÅ'žMR—@v§n -*¶Ü²„sL÷Tê­ oµÑ/Í V|ìEÆŠW@’j/&ââöIœ"w<Ú*®æø.¿áâÚÓ¼âÑ(|W‹*ˆ¯ê3ÔZÙ×c=FEÌ›ußÃo’½ë±EŸqÑ›¼®ì$êÅ¢šG/s3Öé®ÛQ¢t{cÑ\ûT÷ìæ P'Éåcp×ó Z«6” §èãâ(\' DR÷™gH‘l(¤þΨ(–êôÛÌ:ì5m&£[Ê*m±¡x#Š,Ê!EÒœ71Bï÷Þ¤C~o€85Ý´¿ ó¾¥rœËX9è2Ç"ÁÛ¦ÛMÌ2Æ¬Êø(|±&ƒ¬H^lM¼¹ä{*Üø}óÎR'÷«çÌáûxˆ²„ÑZM\¾™úDÜÖ7­ct†Pö÷ gøîã@?$ Fž=¡ââ·kUj´ØF| h÷Àirâe6ÁÛ4þn˸•>RåGœ¶=á••¨^°bCoTÞV~G¿xV±…ï²PxàñΜ/ª?§x’¼âüÄé‰Å¤¥%¯pN+É“µf6GüâOüJJépÓO5 ¯Oï` ße¥z^–ưˆþHl,h, ÉïæÀ®4×¥qù]Å@¹ñž†KðrjÌx9œïÓê¥*Ã’æE±†Ûʾˆ±4që xið†ßÚÜPøËõÍ:Ýó‹Ä—ÒÚzëM½EdúVú(2voNw³$á/áâÐ㟷Çߤ|ð.·' û ë}w¸81«?­ãèGèC™“|åÐU«S¼Xǧ/6-v7$å±´ÏÁâÌ,Ú” •°× >·Ü;·úyP)½…¥™:dà¹@hÃé«QŸÂè>ø¤½û˜°Róüc—3b°Ã,ɪhÁË΢ð¥Õv„K+¯œ/È9@ ^ÊM6–¢Bl¾öu.f¨Ô ™M à-P!ªÂÖ?¨jNv­œ¸ oÊ0 =»XÅÌž™`„cb¤À£¼GdO߉Ƒ ¼ôРóW¯ó6?ÀGTþÌðVN23´(rØ!ðŸß;àNzºž¦ƒØÔ[Ðò,véΙ2ëÈè .dŽý0SÕI¯}e)s<êôâæÜc“Öbï¶%ˆÊåEUb±‰€{-·ÈŠw;„R‡Tö°O¤‡¡Ô:áõ 3ÿ! #èÃñ·˜êU6…ÊÒ\~žËþ8«x^ã%7Ù†nÎ^J·IØÅλ¼D´Pö!æ„ÄY.ÙÉá0ßu竞у»Ãgž!^Cvݹ³‹ïÜÊ'@áCuflÞ´tvËNf×½?ÉWgh²á7¨Î W³ E­œ`|Ð’ùøÖsaÄGøM¸üä oƒÈÇxãʈuãW*W'–´´/Y_±‡2-~¨z%Õ«m%Rà“t“FL«Ä#–¼[¦¯ÔJãÆB´Ý.Œ<±‰0pUìÑúÀFñÞa‰ˆIDð*q+Ëö‘ë´ô:‘—Øõò€aŸ@Ã7žN‚hQÄݯbC‹nÝÎ(Ü ½dH›¨y=nñ¨…-mC­…óþëK!¦)³r¦å6J|²ÎªWmÅ<®jÍ:¨dÊ\õ,ÍËEbúòaqF KŒ‹O¹u²¯—cÖ­ õ‰Å8¼·­Á›+NZeÆUÎp›Ñ“Ž…÷o¤Ã‰Âoå—½6B5Ó‹âš#}q,£âÓâ>¢˜þTŽÁ¸Þ̵¬ÌÊÞ /.޲K#.ßÎÄ.—½v-m æR‰`üèD1=«|·ULJxD=Fw4¨õ–>Å Xæ°o71ó¡Í.lBRŒ’sq¼Oþ#–p5ÔÛ¬ûV_ýUã‘+x,ÛöŸ¿|P}ý[½ò3爬¾^H¬ØnÛü$/B‹cÅ,׬µH°ýóùÞsQ6ð1Ú«X%[Ñ#åÏ?Š¡"z^šT¹ a;Ò.»ùëé(щžÝ"ðJÇÛl[ ¿Q¦ua®¥&>^»ˆóÀ‘ë]£“‚æ, …ZIfU¡ŠÃ<Üßkô9fÃÒô£5(oŒ¿2F77¢°»Ø÷­Ö~ [7È/²O$œD.àµ`o5þXÔÁíµÆ’§ƒæ//ãÊítÇËÈ]ÎÛö¼<¢¶ õoõEH[‘Âh§¼Ä”æÕxŽŠÁRn“\ÚõvT¬eÿ­F\\™Õé^°£p±¢T¾ûD·õLªt ð*H3lã93§ðJ«Ë «×ë]ÎnÝßA…oÀÞäX3TY1/Rom^¢ )×N’SñB/®}xjŒKwf¼ Ï+Rî¤pê¾vÓ¶øB“+ùAO~¾‰^mÎ'tÚ«÷ît¨§áZßR]¸·¢éh;;KZöñ¦t}e1ç¢O€Z­`±®CH‰‹r¶÷”cñé՚ıM_‡µÛCã%iˆ×מ©œult,ï14¥‡ä"Jq…3lœU]†Î´bZ[fµr§Ò.Ç\ÞÉûäJ[o‡óÓM²8¤0%Òe?$¤b†ZµËï Ü…­)š›zX%St0°7˜{ªÝzϨÆþÆ*{ítÝžª[³¿Þªª'"Ý)¢¦É7s¹õ¾â|†…WæLcmæÞ¤ÇzíNchxµ©D°gè·«ÌÉï=¾¬ êàôl㬗kŠÉÅt³(ÌâY™û•—d-)ªæý®×0RršR@[ìR†Ñ&§5¶$) ¥?{–á`û¸@— Wž¿6Ob¼/9d”rëTÕ-Lõ оì2YÝ OG‚æßÍJ0kí|(Lw†2[ïjÑ,Y¶º¨å8Pü1}~& €ÆÛ¥åsîm¢%yTb ¹p R¦ ‹zóxÚÑLâµNÔqn>úhæP^¸˜h'þr¾÷e<-J³õ(Sýíùç9W&ür¢ªª°.ßàŽ· Ni¡È=Û¬–=sÉ–e‡¬1án)‡e8^'¼CéÊÑáéXpRœéò5³šSvÚˆª&?Ú1¬™êÖAmŸK‰¶#¢=­kÂ8 R¡X»¬øˆìbHJAôÂÆä›Žþ+1VoÚÑqÊNfnôøMQQi½+,ò\™Ô°Ž}Þ2l c¦ýø¡÷ë^´EIAVô gH´÷Õ)G”:Oî™-T4ÔôYåed¨ž9½ÎÔ©‹DË¿sÇ\Ëp¡®>¨íÖCõ¾'ǵ„\Z¯C57ͬ.wˆy©ŒËäK6eÔ‡¹á$F>êkG7dÇ99®$ì”ñ¬âdH[õÚ¢Ð\8Åø|…j3¾R°ì,ë¢Itø™'‰®³7Ó [†¡(®Ðü> ®Ú8¤Ho²å]ðŠº³\#ÏV:¯ T¸…SªÚéŠ÷™èàžîØ‹';6ÚðÉqŸX t„c‹š{W öÂŒ²î4ßjÑEHZdR¶U=·s/4G’˜°¡HªáÛ¯®:N3æ.¯¾¶L€¶ OUcð-?°£ò"‰’ˆOÍØÐ\…84ióŠ„Uh4ŒêÞ²>Ç{a{cÆÄý^„ÂV[ YŸ·Ö9üñElÕÍ¡‡ª¨™³^гUoø‹0ÞqBÏP—s7®77~Î`Fîc"Q…Wƃƒ/¡@ P—Êðn=« zùö”YùiÔh3~ …æwD`†Ê»fY($ ¥ ýŒWš™höݵûRE¬pWÕË÷ß$™q"Ú¯ÎìÔVR 4_R‚$Ùwx¦€(L|²nlPVÙ§Uâõ{ªyÖqÄÝþZ>Ÿ‹-<ãE½¨4@M8¢3_ãNbñãrÍý—rM󻵞*“5Ë ¦k#6²÷-ÄÁº÷Vô—šåÎx½Á„ËÍçȳæž-¼hD… ]1V6<}\ˆ1î|)$J‘7goH ­,´ $Cƒ‚.»;KBã ýkŠ1y8u8²xPÏÂÙû+ €|¨¹ØLÕPŸ%¦q…jœ3îŸ,Ô¨üš_û ‹“ÂG§({ˆ ô»*œjµ$Áö9¦¡$%ö¶":\St±b(; µç#S¦–¿‘Ø=nÂf9Ux¾ƒ½AGØØêKLÑâ¾ÆÑ :ëäw/—]Ö }:¸C—ºìÂÊ’³ ™ xðŽ”/GŒ=1n?<¥wŸ1ŽWoÑçËæÒøÒ†Wè×)̆‰bûJe3ú›±½o'R¡Ãί“Ûƒ5}!øpMÜŧŠ‹¶TEÏnn·} ŒÛ«§[òÆÖWÉL =ƒÒ.=ÓTaÉZ^ÖÝ);ëøensc Ü¦ßug´rb“M_eøæ»aÓÎôa³®‹(ÐAœ$ú§gË>Nó´Î⟑íV#Yƒ×eð矘¥sM>}Ÿi±âœ:õ¥”ÕÃ%I–ºú’æö›¾Ýà Z¨ˆ<4¾íØ_""½Ê|¨P¸¦×K ùbkߎòaÀ êì<cï/?yƒä!XtäZDvs?$=ö‹A>¹¦65h>:§J,‚Í"ç‹_/"fE>n¶we ‰ÑÓf/þf¹³ñ<øADCZc?¶YÒ{ëQ ÃéÈS7‡‘±¡q\o§h•=íšlÅWi­’÷G/¹è‹e8t3§ñDjH"µH}VÈ3kâH-£À·"ï­™¨Ò‘׌L0Âñ™nQx¹Ù;쬧 S# Bq)pˆ,N誑4*‰šcÝÒö ®JÐ/‡bÈ‚ Í|cíuNx¹g(TsLŽÜ-$ª 5ù”ÇÏ©¥ŽëÖ9Šc‡É·­t½ÜU1 ܘ(ñ¹‘á²}!ŽúŒMGåôxdƒÄk[Z.FD» ùBÕlWâY¨6-¯¶1f³œ#\5jðé3LDqc9·› 4LCŽMK­ÂC3RäÛ äoÀ­v/ªÉ…—'ìVÄI”;·-¥B ËV^ð£×Wû_]„¢]Lš»?ƒ#_?‹Qq|C¯¼žÁ÷#EÙnȺ§P`7;=à˜½_6þXçÔ˜·Uíé½ñ9ó·KæÌËŒ‹,3>9ALêån/ÔȪVà6r·5)<Ð>HG$·ÅKÖšeÜcq#ò¾¬§mû-ÞÛÝ& ¾ûà>Šæ$}5ÙÇ>8uÏ,97}×Gb§œJªÃz†¼Ê_L@‘"7>~ØïH¢ oj úÔ±pêSc+þABIŒ•ÍnÛö*”rÚ*É»Ï*0õ ð|qöz‰ß2ÀVrßÎYÛ«"ZçÝã½é´É4ãO­M‡‹68?Î_dÆþØ‘äľAGP];w±ÙmêÓܦEWÔp–â&K•½µI¿°±37Zn!°¿øövC²A‰®@TÓ%jF‰Wçü®ÇX%-y—Ĉ\(ƒ‚×÷Å4ž¹c¹øV ‡LÄ0¦¹b +¢”âÉr¯tx èâ ½® |d®2)#Ma¹Ye{kº[Œ°{ò‰~Õ>} ²¡7~søÎÌb_Ù®UÓªé~d·G¼ÕmÉŠ™´>:­œ,?lC…ÓŠß/fè…µŒâU}e1”)b²O8A-Ôz1tº°xûÞYò“Ú!ΩDˆNBÊ(z_ËÌqg¡{ô¡¬•h5ÝïOTÅã.ù!„·±%7QðƒaÀÇW_Ï¿¸½¢j‰±ÉwîŒ)–[OìTô#¥»á¬UhŽ‚ëýtfR½ªÛ-oÜ0*€a8Pu{½¥—y‚e±–ÙÙ U€:^õ“I“ýÈ®ñAkNùÂ{V–Kòª[»Ù,}ÔþdV;êP«à«WCiBÖþÕœ82_¼qL‡ –(x©3n)à•YÑrÉ zFN„”¤Ù ©®ènP¥X³ÓDâ‚àÒA»:œ<›Rú(ß²´Ö\0ë;–ç2ÁP OgR}xó„¿²ñ„åBªmÑ:FÞ«Œ×ìt›Ž;2຤«ŠèÑÒäÏ6¤¬ àI¼õN0ïΑž$¾f§ágµùu4d<üB& %=Þ'£™8<‚'¥¹½÷%sî@ñ*ßVM²™Kç„Huš¢x%×} ‰v˜ˆ¨ùp)6·Êé±êÕuYÚ° ²ôš.Kh‹rºQ!kN!Æ%¥-$~}ywóG½Î›ñ+Û£›2Þ4ŒN<а¦BñÊ´„É}\jqË1ΡÀ7š4¨‘&#€&&`){Ôß¹J1êÉÊNr©¼L? ³ ¤·ZK‘vø0±;§Õp9å¥RñRRÄá#göqŠÑ«¬Ö%e+ÁºÌõ¼¡pÚºâYÙ‡þ¸ŽgàÙ3æCzº†$y/ãîÇÊeœÍËœE™÷ ÈV¯ÏºUÓ¨M¸O} ‰!lvÒòîY¿ßªë¨ÌÙ™Õ ƒdb4gôÞŸ#ƒ;eZAv0ü UÍhCŠd)x¼­M3'|&Ã^¯½\~Éà½uš«úÚMB¥8ö›ð™Ö´ ù€vȃ7(^Q«#ܧÞÇaHJ èGL$]}Yä|h«g\ÒÊN¤áJJ¹^¸þt%$¥›º}ÿNT0¾¤×h¨ªªZ™µŸŒx5M"K[¼§Ò‹Ü 41LþðlCWßÌÔ·«ù‹­ñy÷óP¼ØàŠ)Øä^Áƒ\Ù „ÍÅJ­p«Ž)+Oâò%?g£ùÇ®!ÆàtŠ|º”ø¡ G̵­Ð.’ų×!8ý(ОÓ‹”#ƒŽÙ¼¸f àjsà㦆"]Š«EÏòò ÊÑ~Ä;uιQ|ÍÃL'khÝ%çÕÆEˆS4®–¡×=‡×…Â6Á¸a¨‹/²E<9ÕÏ01vÔ6ß"7aZ){ØòÄL\¶³ãÂ.…Y†Q‡înJ>çîÉM1¦½Iܪ6ã* „d¥ÒzåÔÃû¶Úˆ­·i}⬦"¦Ó¶„Èþð‰ÅPò*9ìf6¦bP݉Á¼çá‚á âÉ+™³óÖu~>û”mbIòQ5Ø †®ÌðP. ¶Óó¡DYðXë€sK:Ì~8Þg½îV- ‡ ÒÞš¹,Íl#5˵zzÓõ²Úˆñ“‹ðçN•’~èW£^Cê^Ü0 1¶, ÔÓal|¹|¹FÞþ\$´‡…ÜŒ`…a°j»kº+Ñô•Ìî{+ÌÝ鈡@*„Zõ«=q÷H¤ÀºË¨Kˆ<*ø¡%üƒíùØ„«K¤pUƒ÷é÷*2Ï•Ì/õ;>šPê"^µ(\e«†u™ËZ^¦e*@vš Óð1ʽêˆùOø·÷m•†g8–A=ü(>tjT\kܵ–k7Ë;ÿ,LrÐÕº‹W8ûÁû2ñõŸ J>íW7Žl¶=¾i½U§­9È@ܱ·dj¥)xÇGØ.Žýô}rÿ† ƒ¦F­Q]ÌÝ€µq¢ȾÂ*u·NîÂëHߦƒ>á²7ýˆŽEÔÅý9Ôû»6}Xj¦âÁí-íù–²É—p‡IIõÓ¶£ŠL÷·ëèÊXFß ¦v¨µKE‘E@ Îà kÁŸ:ˆ.7ˆ½‚ÐÇךN":u¡%"Pd-¼Ù±K3Ø$·mRi)ëàzÅÒ¢¶³˜`³F{ÅzíM¤sûTò1òÜØ’S¶æöÀÍCTá¥rgú~›èpÏs›ÓûÛo|Üë{åf¡BèâÍsñ$ôªN"4”¨Û•úüäõÙ\½3Kô劉Ê]3øVÈnj‹ØQ­“o…’dy‰j½Ì|awi>CÍörV7ÉéyRj¢· s”å̇SÕoz”ï°|d+JŠ¿j°˜WÔì„Cv99U‚#hPÇH‹Â5ÕˆN,þVŽ1ß^T5ºŸ¹Œ<ÚXdׯSŽÅ-¢³?ê²áb³ClÜYšW¥åK§½§¡ÚŒÌσ L¢t®íø¼-#a–¸€çëJû¨Á¾Þ]·áÀ—ŒR"”*x‚á >tLb³¸ßºäý>oP ÛDÙ+þ'â —g(*{OOÄ«"pryûºìÙj+2rY½ŠX0”ß¶á¼cLWÔ¾boŒ ý ÷ò&ƺÆñD_ý«x9ŽZñf6+ì!väwmìM­eÂÅ(v ¼ˆDYõW^WÉË0’ /W1ê‡öÐ\u¿]ØòfÇþlÖ¹\øå*šÑÐ4Ê-™›ÏŸ-j©ãUà=!FØöGgžì<‡xæº Šˆ»Jn»/ ‡ÜË1dk¹ ¹o=j¼‹Ž~ÕNȊЋU÷] o/2®Ã]wøÆz,H¨ëBŒ(ÂQÚ9½HÖ©õjŽÑÍóáxªñâG†¾Çk/2"x7Éœl/ÒQkÜÑa®F21Ç-À[jˆ».A%31ft² ›‘!ٜ͔ջA<øˆÃë,­ñÉ35X"ð@×GM‹+ªÉ÷ìѶFpBW—?ñK™Ï[äž%o Ÿ…H»OjÏ„E¥ ®d>o•;õ|Æ–'¾g}²ù"BOLní-YlaHut’\wáÅ)ï.*¶Ô¸l'ç&׳ËÕOøzf/ñV ùVùpÆ%|qÈQVÈôËÆGÞ³u9 °}H-·\iÏ£SÞ œ`#ò·“" ‰ªM ‰(R®ÆÙzËAŽêBTð@'HÌt¡bd*±áE†(‹Óe@—™Ee•<7¶ŠSë ôd ¢¥™’ÍN8’\.\YükÌ-9ÃÈÉá¥Ã'¬£E|ëÝ\ûf `ÈNeévvZú¦µ$`øÛ¶»ºZ‰pp‹ðjÏiäïW‹m© c‘SiÁbŸÖ]|+GS&/ÍͶàŸ0# …ŽTl£Œ¸4FOŠ—މ4¥ñÌv—ûÊè "ÚfÑ¡×Ä7#¹Î9ê&V4(˜É׀呣(óå2©½Òýå!1ƒéçc<^(£Ãã®C¼¦OX^¯b°kwǃub ­ B¦•‹û±LĤº÷8¶,yf¹È£VÝn F«¤ãÚÞbÒfÊâšõ‘«JÞÏæ1àÌ¡ÐÇ6Q}Ne»ÎÞä´b/‚ó‰@‘ï`Ý^Dž©‰ºùTÛ0+°éò˜wªÂ^' ªiÝþ ²ñ]Cx’¼_¼¯¥©·Tp.i› ÂhÎFÖçÇvÿøSŠ!‹#ûv,Y»LdÌPcxÄÍ ¬¬Ä‰­§0/íãL¸'#2?­ðÈZQ-,C§[¤*Ÿžá,&^@˜«n¡Ï’C?äø_qÃàkp<Åâ”  ·A3 Uôî&FÜßxŠ#ÛIÈ»xò ÛÊÝ„¼7kž|×b M®“'}ÝÄ3ÛQ0{‹ŠØŸ¥^œÚFM™ Òg!Ý=uÇ»Í+i¶¥G˜KÒâºXaß³¹·ÄüVhf7;e{TîuÇçg¹D<ñïØé§Dꃚ^å@(çClÿp]Û]»µýyÖíçÒ§uE;»S•+¤ØS['n$•¡À[yy ¨AœŸÙ;‘ÂbriJç…ár`|«U­QFÜñ ¢uŽõ>¿_s|l&¹ˆ³·Ø/žM¿ñâ²1eV8E÷áóS‹ZÕ^…“•çAw¤ášdi×N8ŒtFްcU>¹ˆ˜Ã8N9\Œ Çzˆ¨Õ%²£™ÜF6| ÷¢u‚ýêêö‚Ò\ž‹åwoRžkûÐ%ˆàñ2•~t½#zEÜD¼ ?á¦ïzB¬óÇw(*EϽMéÇÿ°X±ïYix'…yýJ4å)ƒñ–ç]’*ŠlÖ‘…!Ì|‰]¢½Îí³KKÓz³LÐáÈB!<9Â=p;Í·MôŠà…M.Ü5-™CI„ Í"eÒ:>J~†9DTâV%ü<ˆð¯O«"ßÁw»Ô³¿;Úº?ò ‹À¶¯c;!eèð@¯¢¬šL±”Ù•xþ÷øùoîçþ/ÞŸ÷?}:Ž?σÿÏû¿¾ ßòàÿÓÿÃ÷¤ãöÏûàÿÓÿË÷¤ãöÿùù‰ÿw¡ãöÿãøúéÿãûÐqûÿqüÿüôÿñ}è¸ýÿ@þ~úø.tÿÈÿËÏûß¿ oÿ ÿO?íÿ»Ðqü ÿ??íÿ»ÐñöÿòÿóÓÿÃw¡ãöÿùÿù‰ÿw¡cø ü@þ~âÿ]è8þ?ÿžŸø:ŽÿÕÿÏÏõßÿÇÿZÿÿ¹þ÷]è8þ?ÐúÿÏõŸïBÇñÿqÖ®ÿ|:†?Ï´ÿã§ý:Žÿ³þÿsýïûÐñöÿ¿ºþèÿ‡‹“‹÷‹ÿÏŸã¿ïBßâÿW´ßxûÿØÿ'Òüy8x¹ø..nžŸþŸ¾YrXpð[Cx-ù!V–Væü¼æÖæ\æœîÿvþ~Òÿ-ýGöÿoœoÿ¼<œ¿±þCûçáàþiÿ߃þÈÿ§»%/×ï4ÁÍÒí7®.ùY¸¹ù©ù89Xïí_yØ--¸Çèéa=òtÉÏÍÂ%ÀG-Àqè,“û7î5¹ÃùÛÄøøXx¸¨ù¹Yxøxë‘Óò·,VîΞnGž<ùøX¸¸‘Iqr± ;¿q«ieùzþ‹ÇQd¨y¸8Xx8yþ±wM>A^dÕ°ðòñýè^/ÿûÿWο³.>N^®ßÙ?ÇOûÿôþa€šùÙÿã¦MäÝWÿëù±P;!ø3Ï}Þã5•SS˰‰nÅ5s6ÿ1÷ÓìüºŸòl–õ8øoÜåv~=!Pen'/úç 0œÎúˆÖ´Œ¡0t^9‹áTkÄ*ú囟¨%Û‚kz%N… Ñ0iPdÿÉÞÉR¾³pÞU=_®k±ò(¸‹F{pÚ“bÄ·Ù¤[–Éx½öÖ‚ˆYÉ,ø*ïi¯"ÒíqÅ5ê<&‚ü[rûî1Ády]ʰL×»ŽN¯ús/Ã’E2…º1ìÎÍ®›¯î.®­‡%÷jÁØÊÑh½}/ï=¸Ï1Å<6ÿ潑ºI‘Mu÷èü–ÒÆõyùÞÕQ¬m)Þé7Š\ÒQïv{ ó—é?øñÑ–wتæ·&œØi­þúÄP$c¦’é…›í¥‚»Lú}$–ñýY Åt&Zñ¼[°d€"¾,±¦µzyÞ¶¢œ9#˜ïywòüüFÇh`:ã(Ö8ç\EÞÞ†P¦ÒxóW$ï[P¬ëÄd^­Å9\cO,ônj•$ólƒhT•”§èžð m)ϧ§L[PÂWåÝÝT0ZšûÞNâõ.b‚‚×]ý¸#•3*º$ùR+r³I~Aš,>EïÃèÅYŒ!KºER‹ çKœ/S† šn€@¿)¥a(z®\Yeàx}÷éX÷‘MB‚? †‰vdž(-3 û¸¸Úšm€g\¶ŒW[ˆìÍŸ—ÅvÚçx"nÀn)¢ÂœÖš(Ò!o]Ž•RpÊç“Æ©¾¾koXâ2¯Œ_*ˆ³·x˜ÇúYÉZŽ!DvÁgÔ*•J7NøeíCn+ÖԟµEžDÌ"{Ó~ùD¬ý9‹{äX¹ž×ÜäyÌ3‘0jôÂx—  q¾fq&ÖIF˜bÛ.õ‚› ý¼/Èò#‘meúYµC¶¯È^ABiû+²Ý(HÅy‰Š`8Ô#Ü;öÖ™\ C,´š–$Â3!´Ì‹%_íýY¾oü…¯pR`ƒö–³·÷ã>ì …‹± Yûò.‰ÈÓ- ?ºtVÏ÷œˆ [ à EþɺÐÁÞKìN#7‘ö>c¼~°l…ý–•q1ÈŒ&bÄ‘éçæR‹8Oy{tþUÉÀ©^C-h6$²,FÐ×›×N®Ä»Ññš:l-þ®8(1üÒ -ÚÚPÍ‹ŒC³Õ%OX²O\N»®RùÅÆuëñp¿_io^ŽŽä=¤es­†Ú7ÆK]`¡¯j z â®lRrÕe2fõ²½zþÓV ùÅ•sïW]î4ÃÄŸ®?”TlPtbï¼gî%×'8¾:nxCš=yœץ7uk@ç]¯½üú³8¸#ðV-Q¬€eðì={é$y5•WÈJ2„t§*P•5¹)G‰æ>³v QàÝø9Æ~m-顚iV™·ä&®+žG2(TÎj:Ü»¹j{!Àñ0©#-Hè\¾Ø¼FþÕ¼L)cM•Å.ü³ҦüEOf¯!×øÒ 8>ŽK"†#µ£+ Yp7)¤r™ >@†êÕ 1‡¹žàÒ8l&Ò‘ÍDÅaS‚‚lJZ•Á—^Êß~è²/„„®¯‰Œ2­T-“Ëó§Â÷žZŸÏ3ÇN³ÏÓ™>TËw P4¹S\CtO !Ù Ï "ÛO1¹ðAša*•4$·‘jx†oè™^ëa’È <݈<¤Ê·fßG‡1HåùÑhò&¢ÊûbÌŒ©„.ù9ª/%ˆ%Ÿ€¤ßžÖm\´Ew-!ÍË`6=Y‹¨2f¸ÌT<ïÈ] -}ÚÚÎé™0¨‘ V6Þ¼§Ç£»Î÷>UK•ú<õ!&ìl D‰å¾C:»b(Ž {¦e¦…ÈæÖÚTóÙ«\¿Xx™)ýtʹ^é t3‡üÂóe®²^ðÛúôé‚ÃCµO…£J1a^VoÏEÚ‘}aù;X¬•Þ‡]†=<ò6Ë:†ÙåreQN¯4Ÿîuo‘ÊiÐ:?S6S¬h]àIž"f;Y^sKnbšÁ§‚ ×¶ûÑ(è]…*å‚•™æ<ôF”ÊsÕiJâD—af÷ξÍQï´×N4ÂÜyûjS+¸¯ªð~°’áð"Ï›1Ú r _˜Ô 7+`ó–Ó3þ|žR2ùó‰1"6€ôÄÓe °®Hþ™­NøžQžïAèºÖl¼zÀÜoñó^y²]t ¿1À,oͯQ”Ü™µzò]rãpyáUÅ!^MãK¬¦w –º-Šº ‚R°àZC:Îþ39£Ê}•³³ÂÀ%pLÙ!¸@`gØ5Ï•ü³¯KnèUÆã€ÇïóX1’J1ù« áŽ8pcKܹ­c‡wFU<²œg±„ ®3¾šZc²°|áX¨s3F_LzʰP¨ý†ÚõV#»Ê¦ò“²{_ÞNÛ™|Ä«Áq ÙB9tåA{îŒQµ±=~ûš—AZY¸®[M/B´+9϶Rå<;w7<(»-¦®ˆ}nÚZ(6Éãbïå…ïIú‚vÀQÄ?øÕjÎŽ¬ ¶³ß< Ê‹êõ†Ì¡'-%¹ÈËŠfÌã DCRìc>ij:çù (Ø÷\÷„=Uó—;kr:3 n&7k€½ZöÓǤ/žéÛá݉{s«ÕËæÂf¯øK QåLèÛeÝQ J |ÚwmäBþ®’dS. ‰câÜh®yF9Ã(ÏÁŒÌ$¯Z­¾ŠyÚפ?ãP»ÿjÙ¥ì@dßÉ/Æ©°„ýÉ(i­sàæÅÇÊÞõŸNÒ‰¾ Ëå¶<䵬PPÛxM}02—äÝtqü ÞHe¸º›½[¿¶´ñ:¥X €ú–hýÁ{Ñl¿µºªÞ9±²7·¹Àx¤‹œà´“`>t†\2çWç|ƒàBÓל‚Õ¼5 è"ç#¡¯fÁµìÛ‰Z)¢r ÒµÑAú°˜@eʉ^#³d¦ÑäÞ·k¹êi”ýK¹âr¨C‰OßâÖ²g+ä³ñqBv±…¯)fÁ¦¯fÏ ôÖ JÂ\o¼›öñ$XºægvÙþ‹Ú§¡q.HÛPôÁ®Ÿ*8ãZ½[#Ž.Ì®Á/¸¼ÞB¸d¥dGq9sc~CZÉ3n¨ 4d O5póFѲ“ç;¶éÝ’2Í‘Ç>Fù’ß;ošØtVÙ깪2Ä.Wÿ¨ !ˆ^•iÃØ•·LAVO—Ÿ/ðH€Å”úɱ¯07äIbVÚtW° À‡r¸ÀV¤‹äà¦ú#¯°¼VJ=_ t¡¡¬¥ŒµB¥¥¦«Ä½/ØO‚go 1ÃRÁùª Wdl’B@`#¸:H4B–©ðÄ$$¦SøD.zÝf‰rºIFazQ[†Ã† :ä¿>¶tƒ×YûÌ tGj¨ÚK ¼àÎS&êÌüø±8›Œã¤HVå•iL P¡Þ~ú¼z\ׂFŠ`fúbf˜gB9ÁduÅ|ÎÕµD§ÔObÈ5ΠüŒ ôÄu=ڣꅶ§^6"AíVÌ~ŽAO"së© 7ôûÐ\¯SèH—²v6ÆÜæôÏ{`»^´xœcÀ©ºÎTY— K¼xV†´ÍÊŠðF¸nµÃ³nÑ«”gò_])Íψžñ5K_‰zÀLDL© ~B2†“È´tvBäâŽ[0æœ{MæSE ûNÒÂÚØºïªØõ®°p µÚš=°ß\·M"o÷30´ˆûhŒyO"ÄüC‚d£Ë” ¬ ´ÂÃo‘?ï-Y¨Ó¼{ •_'ñöú­¼1v Ü@aLSùL¡x4‚„ùa²ÅSi¢‰®G]=}l™œ Üëñ°ÇRð‘}ûF:˜âŽ{6Ķ÷8¦©lçeþr³ kòQ–Lœ³²f¶ì‘àP;vYïm²ØÒõHM«Ã}¢‰ÉÐ Ý ¿ÄÚnÒêýš®¹ÇaáY–òlO"I§GÇónU¨–MRÙl_n¹SžNeì—ɲǦx‰Ÿ_d²ÌÔÖ•?ÉfC&¶·öîå»%…üÔóÉT<˜ÕËn/&3“´–WkQX¦R³AÎjŸØ³»çìÞkaÔ2_€xKÆ©yÊé³²“LõL>_ê¡q˰C8©Å…[²kö´•Wk÷ì\f¦•rç­Èø9+,s͉LjçϨ…·4¶¸+¿iëð¼Ùy\ œ1Þíl ÎWû˜yî²=åùv¯§‘P5}rŸV´Óå)šñÀé¡yã¼§é:¶ú~L9B]ùý÷>í…ß1ˆ ¥0̦»³` 몚³×Ê¥2Æó]L”}Ã@càÚ("T“1žôÎ*n¾Ê¤Ù¿]¹˜kÍo#r¤@|BøRè9—(‡6“{†r¼Îc»§=W+|Ékdâ‚TÄ…“³Nç‹Ç¥+©ƒÑr;§µ­¤¹Âò]‚8†J@Ì,7 BW®,ržÙO*b8kUò$/ëuM\Ì ny¬ãh”®4e¾Ö$¼ß±,¯¹‰£Â›dؘrmW[ðÓø•2¶‹H¥[ÄÄaLÁ®Î·ím|ލäéÛEïîû¨bôÓ%ÊüûÕöëÒÁÖÚgºŸÄZ;sáXÅô(Ⲅ™%~$P­ãá£ÕWƒ±ƒ ¹uâ‘ü2•Oϼ9ßE6zçÊ|ÉÆCæ Ö!¦.HÞ •[÷›ó\er‹ø•SŠÝ7°Šû ›ÜFQœgŠ/…Ú¾É/¹ò•”­F;TÓÙ±Î/ôßvbÕ¿'›ÎÙÔ¬P†íÐhÇMn¾…3à\tW¯è"4¸¯‘rBCïè[‘%ƒQeª*kiÄé+JÓOH­6½ð†m è8øNŸ.%§ñÙ›¡¡y­Ô"ÓQ)ãt-È¿î\i×àþáyñú¤f‘X÷•˜Ùœ$½G^å&K µþ’àâÌ!K𼂓¥oý­Û:Ïט|§+´˜s“A µi.þ÷âÌÙ.ny¯û úܼ•S«8^3ß èw*èÀ¸_]]úĦ^¹ê‚ÊÓ±)¥^:©e•€Ãrg£ŒÒ‡3eE+ðnÆNC|8ô­yRjÇ¥Êëº*î,¾1Wæ'¤DÄë›Ä…LêU«›Q­ðé¦éL•¼Ëý€5™`eÎßëIÒLjѥ­­õÛÛ[ kÛ}·}ÅRúFwy&\)ò£Yh0Ò'lC¿8åY}ÃÁ’VÔÑÇÎvàãâáòÈ,™"mB©šX„|ÿF3æú=yõÑvÇgwïÕìPw&ÒrÏöê^9ØSæI)ì jÚ›ÅêË3`ßCg0Nw"†Io¸ÔÜ› @l}´QãÝx¨ËØ+«Æ»ïÓØô âEOINtyµ·îÀã>›µÌAЦƒÛËIküÁêÕ¢™ö ï}C%²U³(®õÓŸÎsz­ Ü1õØ}3:À4TÀòþ¤èëîØ¶9Ú}Q:+Åýµ!Ú¢ íÆºŽžªâpØ~îÉ»4éÖ=“J]°…GŽùloÖæ¨ø?µHò¯eRªŠçP=—&q&}ª= dX5dÁîHÜBIãØ#·Í—ßcmï¥m«Y½h‰VÏü èëù%E’^RÙ?ѵJ“pNð‚†òþÉÙGžù““ê¤7g|'1Ù4³©¸ÕæhªÄÕ3ªçðý®=à J¦ÚÅÄäwk°fiÍw1›ñOA™æÆÁ~7•·%‘I‰…L5°[Léäl'Lhì×´™¨QçØ¯xy"²ýd>ž}=Q´JOx©o;©ûî|÷Ò$ÆeS*md¤9¬ÊÈ– ’.ÜĨ¶F³›»×¹éân½xDç“>zã0¡JÇG’µHÉÀšbdQïqÐ!Æ:ò‰×i¿kÞµ§ÎéaÎýŸ¥]Sî¼Õòsaò8«aö4Ójû· *âûù$Coª³ÆÛ—­ÉÉMj[â9i^#y•Ë~M2¶©’7F´ß—œdpc[€÷2 b‚M®WGÐãÙק˨Ÿv§eÄ…Ájj¾¡VnƒÙH‡$ï@H«Q%»sø ¬¾—1º ÅWç"®ÀTpå¨Y;kóÒÅ×÷ìI*d“°«Y@㉃M¦Æ¸sÛ":dŠs²ZÜÛ]õéähÚ¢VD¦An4]é‰tú)É¥8…ò¾ñ‘3i<ÑÚ¿¸çÃ&'{W’»’NöÌ/*¼© õ&uó°â@Œ”;–¹ª[‘_‹ø )…¸á]©s¥gëe×'1af) &š³üž™Ž–”5°Jaª+dùÅ7ªG^˄ÖØba5+áLò÷¡¤oe’\MÀb˜&Uïm´*+Ö½ê2» H:½:ÅuÛï§$ìÊ;ðln´íí%m8ÚßË7yAÑ-dªÔl,Ú{-—ªœ6í““ßÃ{"Ñ7Æï2õrŸ(¦ûDËþa;.+l1‘ªeUUÜÒè[]¯ÏÕ½ûe¤Àro33FEÜZ¾ÑïÓâ¶ùªÒµŠ¨«Ú{(Aš³ÜYýÌgP,©ýgé¸`.¥Þy‹U0CuëݦM㦉J’¦•«÷Ü:YJÜ;UÏ# ¥"íM%¯ ÖFõδëuhÉÅAÕÞ®mÏ äªÌmPeâ yîpŠ»µ›àr&¢/½ K9ç€6ä#9LÐQP~ÏI¾[vHg zûé NŠ6˜E(2¯oÊIN b&õ•ä-XqŽ÷†îîE _‰ M.FàçÛŸE— Û̲åzP uc(zMýuü{O3=ò•¸ §·ŒžóqLæé<*‡\K¿<¯sÂ9ôUÝËËàJ¬Â8õE̽èà’L XwE©¿vø K#ÝÀv‘n‡AFFcÏNzþMHUÆÙ’öœZ÷F‰¡b9ô2ÜIQãt{ýülsrflðž¢Ô²¤W܉2,㢠½fQÆt­TÔó:Nû!C¡Øb/É€Ô«yÁ¡Bñ³s–³ªuÒ‘>Z FC†´5 "‡¯ò(+·Ãûó3]6’™ÈS®ž,– ¢}dy5fdgq¢S¯;–µcØa}uÕ }5… ×&”’kêÙYº~F×~ªEçÕT¦û¸$7ÏåçyøQú]¥¨Ì¹Æ•ª÷ÜCÎË)•+W˜¯?$;ö¿æj½#7YÚ%Ÿš )ÈXOèì†á´£¼+Á 1³‹«~êþ0ˆÕ‚_˜ œhªÕÄp^ÓªÏ)Ä:Aÿl;»¢‘Ür&=(vZ#nóæ›1,˜þãZgÞS𾟋ïMat“lñ¸ý<xùŠÌНN™›¤Ö‹»¨·«ð9Ökgëu&³ÒJß÷ë"o†œKò˜î9¨ç+É!3dDd] þLšM©jŒ¶•Ó¨w3^@ß´¤ÌW”®DW¼wyBs(­“v.œ7CÜOÌv(òc®s“‰øSñçÒa|ï/-Ó€Ù_ÁX ao Ú´”ö0½ ߊ=\Ü¡u­SYÕ»¤åÝòʇÉ+¿ª»þX ³^Ûjpé¿éªÜbÍ7 7¸¤w òÃ(ôÏív%áëŒRC¸7Èo¢äÖkïUÿH"»f¡er0¤ÄBO­Š6,Á«NåùÓðN­ý.íéÓyÖdÒí7 EÓ(†,…ž+ßùÞ;[³¾Ðk#[çKù6Ä£«?û¾fìæz•6“h&Y-³u…NlÃèÆÅçÊ“`±'§*•?*O.õ‰w{¹CÅ~z‘åš*©ã= Ï·gŒÎ]Õ ^v)óð—!®b¥ç–Z'¨#UK:ÐÄ0=¸+äãŽp«ŸqôêÈ&õÌ©ËkíårM·)§À3Œ`_“&ÊÄ9¿`ŸKgV ;~½¼lî"X¯Pxöä´lÙÇvº6ÎK×s8%åV™ZìË“2/bÅ(Þ4$Ã$ Éó-6*ÕMí îò¸Àvlž{¶9²–ªUj̦¯ž³JÛ3få97Ä”öæÝZF-Ôón´u¨ÊÙÁ¥ÚÕˆõFýb¬ÄÐ˼QTZ ßÍK"]*UÆ—íuqnqögޱñi©Ã†ÛskS„Ìý=LÇ;ŸökL×ò^T5T5P½óV¦U œÊòu¬Ñ¦%xa¹'V+,|–üº¦Ÿê¢Èumƒ¢ÈóN¢œO{=±r²tq OEß!;3ª€ûîp/À=hÞUn®'·dWMË{mdŒ´díØôñeGªÜ5¾ÎJ»Ð]Ûcõ)/†Mþä« 2‡ëM>êÄ9'™P¯ö/^k1§yæ¾zŸOcÖE¡¼ÅŒ&E}3  ÄiÄñLÐd“iVo?÷¤ÐL·w¹ë½lWNpÛdɧÀÌ‹Næ‹ü~÷ ¨¢¯¡Á¤É¢[`lÞxué=¯Ði¿¦ òÚl%5‘ äûÿ=f˜G΢àV3cËÛuÞ\¥€ çÂ÷6²SJ¹Jržî Oö×éå6Ö×Ö“}_’œ‰ò‡½—½¼f©ðfú…+lk@üqRlè=ÍÁý뚢â×F#]U‰ëŸ¹æÅ,éqºX9¾œ­ësº ––ÖûÄ]Ž·7ÙUÆHƒ_‡Ð{†Z?Õͺ ¬¾æÓ ·S.UH”%•Ü#”¡¥>92ñÚÄMÒNè7®>Öêr.»Î—Œé^馯‡½¢T‡Ë–6µzÞÞ{˜Ò¼ªàW£Ñì 7‚}@V©ïh´)F³Q™ÈÑa QÙEãqç¤gðÀé­çNÑŽ)¥Êž²}€cQˆ½L¸@Xìb8@ãÀËy ¡º íÌ΋”IÞ°ÁŽÃ&ñ<¯Öû(›)¾Ù©W"çZÖõÀ«Z¶wï˾²Ð¬›Â5#§uöº8HïÁcí´·/殮݅©ëe«5jU^#.{)I!ùtµ´Áˆƹçõ¸Û¦X™\ÚëÐG2¤ö° 7ëØAŘC¯_˜ß[Éf5ÆZ‚‰÷¾÷ ]%·¯êÐiÒ“wÝzDÚi4+Ã*m¸—Ÿ&Ø¿O†Q6d‡>g4Ó¢¨†òvÉYÊ3ž¼íÔFçöXê}ªýˆ¥o>]ÈÓ!±¡£Ïti¸r&›~÷ï­Õ94°;;KK±,>Öá ÖÔD Šjp¸Pi]–d©ŒÇž¤ÁË«û)¿Ê¤Z4vœù·WÏ£™Â4.ØÏ9ï¾Ï4zLT{ÉNL[Õ€ÿbÖ’ìR‰ž$Ë}û·¹A9bšC|º·e­³è„tŵKò”ŒFðr«V®ÑÑ{ÙõåÍ×B®cŸ»qÂ@AŠ ÙQà7Vsª©ˆ‰“åÎSUù_P|”aĵ6Õ[ègÌÓroã«»µW’1þìáÙ]Ep÷jÌCÞs÷ìUÓÁ*×@ÌMíð†½ž^Rš¸=+v£›7a;¡g;@¼IÓN:@×3„ÝÁu'Šu•ös`¯¯¥hòÎ!úw3„aU~Ù¥D°«T÷‚>埕ïMÚô”\aºƒ:®àÙOc×cf1L¢bRê+wbå=Ë"‡Ò -wÜ{§ 6¯•£ÅxŸ·lä X¨‘)Å®€>4Cg½ñ`^Tøv Ïày1~}[.°XÒê× ƒžx£%RïˆØ·sÞ±3 ¯-‰¾öÃû'è æf_Íì%#;â½ç󯂝ûž¼ÅŽca_Žœï”Ü+à_‰çWn³æÆ©?ÅÖÄ¢moééáâ!á”P®º·¼Þ#4±}0ºöX\­I¿á@"?•êËÓC–Þv¾Ì\5ät`¦Òt_ÙÍ(þ‘"âzŸ\dªÅsë´è…iïλ}˜X¤¸>Â8„»ZíY»Æ5‘@yp¶Èf¯Ž…P‰7ô—ß.ËfùeÚÖá½Êâ™J|¹kÛ{ær#†©M·k5‡¶¥v+xû%ƒ¿1»}“æâ-{q7õJëÄ&ùJz›ÞðNcØáº÷ÜW#Ü_{¿Ó¶eϽ¹9¡Îßçt¡v9Ô€"ã°På9•Z£_ر!bN½£à%ÚíudzJXÃ1žT.Ѥÿ¢ìÚrbÖ:Éù)K±4Öþ±»+öéc4ây§u¬ï`ÑÖ*âq·UÓ¼¾«5[‡ >á+]‰½{î9žÁuë¶ Jù«Æ—í«E2”½»SÑ’4­<ÅeØã…›X¶ÇÉ“`ZމÌ"x!ì+7õRæqêl€X“ˆ˜ýžåÔ,ÑÊ d•\ž?Eüe7Óo>(µð¸¹"gi†¨-w@}Ýõåcð²—tr&ã!éáãéâ'}Wúvÿ¿“­•›‡©©ÄÅÖÔ”“ã_÷ûýÃó_Ïžÿçããáý¹ÿÿ{¯ •· '„Ó’Ÿ×œ ÂÅ/`ÉaÎo!(haÎÇ%ÀÿßÎßOú¿¥bÿÿò¸ßïèï쟋—ç›óß|ü?íÿûÐÿãb·äàe·€BÜÝÕ¬¼µí=¡g7Y/+'g›/çÜY¨9ùY¸y~ÃÆcý{6gGˆÓ×Cuœ‡lÜÇØ8?ûúÛ×ÓtŸx¹¸þÛuõÿGúöÿoûýŽþÆþ9y¹÷þççåüiÿ߃~þõ ò;Óçóçê¦. ?h¾žÿ;wÎ%--­©©‰ŠŠJ\\ÜÔÔtjj*88ø|ø¯?š\8~øuöpÂßöòRbÛÇ™ð5œ ,k!ø%ÕeJQE3uÔIzJ_ã±Áî÷´‹ÆÔ¥wRËt[ÆÑ¹}2¯Î‰2Ón¿3 |s®—ŽñùhÛËýkéØ7~ýO)óÔeH8†Ý¥Ð§ÖÔ8!¸Ý%çºdžýöï®déí‹©ÀÝ$ËŒ½³­£3¯1_¹ÉGt³òl¹@«DÞ•$ô9ç="ê=,¼ü6«øú‚u„ñ8N áziU3êû\ oöñªK„æRÈ«^s¿Å`(ÌàêF÷4‚ÐòZi¼¿T#¿Fš¶Ý†I"^E5&ÛŠ—oëñቦWse §ÀÀ/`IÍ­²¯!H¶5Ø€?¥/€?å’ôäåÈÚ3Rxw]ºæ®÷ffžåÄ$ÞnT´Ž5Usƒ^®Q]øÔû0Rã‰ýÔ¹DÝô'äÕÝé¾åL˜Ëˆ%œn! ëëÔ9˜WÏ`ì_%‡IdžÛÕ¬ÿhäS`ý±¹C+h~è,ËÅ{¹^1—Ék “x!JŠÉø^J-+vUàÇûBoË=Ðʲ¿L)1}¢É^(`óž;××wÛxøuY¬'{pds·åSiѵ'o9©5eçc¦uÚ? TÜ åcN¦‡PJ@„,Äq|Û¦»È¯6 .¾|ø¢vzüT•‚„“F¡ØäzûµŒAá ª.ƺ¥æÙ.‰–Á™YÐnÔ­óFɆÕEx»ê«>áó¯îO2óàxÖÎ7˜‡õ}háŠÆ¿ÒZ"&ÃX­q¯“A¢ô ¼ u“.à\eS×£†T Q o“KöxC&ÏïÐzÚ¾€uùyR1M¡†=kE²ß÷ÝAΞ' ¡³`¿Á¿€j:‡ßtpïÎó“ íËÔ…6¦¨uÎ]Ôý$z†*Ë ñõ?ÏV•}‹Ê¡¹a9­ g¤.ý·ƒKàö:r##ÅóОþ_íþùùo g'7g¨©©¥»…›•ÇáÁúÿì˜8þãáãBþqóžÿæåüyÿÃw!ˆµ%„ÓÚœƒ‹ÃœÇÜŠŸÓœŸÇÚÜš‡_€ÃÂÊê¿¿ŸôKÿ™ýÿ»áßÞÿÂÁûûç=´¾Cÿ?íÿÿžþdü÷§—±ðpñ²pròQórs±pòüöRÁ?Rž£ÛT¸X¸8x¨¹ùùX¸¸9~aãý|çü›‡•rèaîiÌϯ¼¼œ,œ‚ÔüÜ|,ÈQÂ/¼æì–濽Ç98µóð=âägá æçâ`àýÍí-œ¿áþæâ~ÞÏÉòü6d9¸Ø=lݬ –¿Æäá=ΉTãCéÿmÿôÙÿ¿þµýsrsspÿÎþ¹~Žÿ¾ ýÁý/Ÿƒ8úÏã?¼Ée|äÓ×ñ))inn.2ø¯oIÍ©6ŽIä¹FÑ{üIeÇÚå2ÿ…IÎ:—D1sÖ©n©WZ)U¬¬îƒN7•Å+¡.Eø•>¸¾×:y$èú:i.JZ&è¢]E½öA`»[œ²*`êe‚jÇ‹]á“\úŸŒ'ü™FN’f5Іœeš]P€žÁõëRJ̨Àý|ÏÕ Y€ôÄ/ñ ý‰Q9xƺA7¸¥»„Lò?½ÏÜxÁt «Yß 7&¨´^PaîØ¡sÜyÇ'ƒ ¨¸àæÍÖøÖöG;€D7èÅÇÉá±- o-Ô½ý… û `×;D€Üw}tB ¢ÿz懲ÿ:jó¬ÙSë ·Yyt d·0À…° As gÅ ‰ÚÂf–îõÈdœÂbqv_ÿ^9dÞ¼x­…=àÑa~<Ü!IeÖº ˜R!íö³ÆmÚùïÌ„1ûŒ¬o¶Ÿs‘h4ÙÄ(@vÖäžè©gÛìuÔÙ(ÀŬ™Eï¥OX|ê}*ë0µ ¨ =¿äOJõ§Ï2gUˆéyëûl€‹pÍœ#ÕÇmŒr¤6<³µ›ß ” ¢Ä¶kôHL{H|`{ xf4·z°, aö¹Þ?»X¨³H4yÒ>¯Â7XuÖxBø©v‘x}‡{È& Ž¨µ $LR*Äê"§1*à6X~‰PPJKœ¯D>£Üá…ß%¨i7Mç˜ôt€0ž±¦7˜p[3ÕR93n¾Z¸ÍµYR‡¦€X*¦í;¬Z(À¹~ïx¾t´”–9aå$2AicJ€Èïx° ^ 6•¥› V­}:ö! –½>¤Š÷&6 p‡ëÙù-u ‹Á<)ã® Wnðª0J*×ø§¸¢ „GÖ0Ä1¿1ìV—^H¬5I¾ºAuݳ è?S öèÄ» P€<™(·£/^-Óس޳éçA¶}$ÂTaÁ>øü¸W4Q „hŽ9–Ū¥–oÅo²8QàŒŠÉ„>$ˆÀ¢Éë_»£÷1a*Õ$eÔ|8P¸~Ðzäµ·<›ÚäÉwºJÙ-QWòèe!Äž$I9PÉu~Âb3çë»cÓ·Íç†r¶¤©xþ‚TR€ßid~ :1«îmІ¤b£{D&ã<¡-*ˆÓ¥êµ#s‹àÃî[Ë<¸ï‡Wo«5}Œ”ΗL»Õ ,yp>ø„4£Òæ©§j9h©N¨RÁ­<Ñi¦´¹¢Íª±•ØFinz¢ï±îòà†ØÞïþtmJ)’@àÅiá¾\õXÎ¹Š§Dý7gDBÚDnš Àíe­µ;×(n?@ ½Gà´‹r-Çç.j:) 1¶1¾‘¬j*†BÝM9…R=Ò'IÌ èmW®[­Þ© !Ø EKBðÃÄšC§™»èÉÌÙXËm¯P§ “7­3ªZ™ø¥™ý„­Ð3!ê✇E¦iÔõ÷;|†ÚzÿVHü»hTÊ’}Í8Rk(0©-*#&{žØp°„³Þj£”ˆ3°7õ¥\khbkNa$VwRbçöüû¹ùý»'Ÿ]qÕ z6âÍNíÁªWEÒ~ž>Ž4þEßžDCyÅ€ƒíZ:°ªß^µ–6'Î9• º”hK7a5öú$»:*0'Í4vÆ€„¤öñé"YÈ…ÙpôC|×|€d@-ÅTÀˆ!Ó*‚@ˆ!Ÿ†¸'ÛéúLpÊï2"Ö3AƱǤ†Æš<}ÂÐê)û% •qÀ0»¡û±s hÎàåül>†D©TÉåø`" ü(ÍL솾"ê3(õ”Öh§üP$eYP±O‚9µ™TñâØ?·¥–Q‘‘ 93I=ƒ•J­™Zï¿ÌÒÿ Ýž=§‹;1ÃG&üÄ;& [I£Z˜q^þ ô›0¸Ióâ½_!X,Ù! ªK¼ì|`¼xHõõØnà¡ÒJXÙš{Y]´Þ—¼*ö ˜!æÇŽâ4f{$úOa*‰Ì v‰ ;ƒ’'4j;Œ®K £„|ôßÙ…Õµ(RŦnUR…<+ñ”Ïë„Hª{ìä/2øÁq䛌n>ÓNã˜z|Ó î¾ ö`vÖÍ®ÅhhTrYÃÓ?Ù¼\Rø½’ôªÙ®/+õÈгMÔSX¾ \”a˜ÑExYiS| ïCê©Oh(­L.ÒW¢'ˆEïÆçx¡Þ~ä- ˜uùnÜÄ[Š9 ~¯|߯aQË–Óú|x uQáÀ2«HBýÚûD¦» 7d+îm¢ÜvÓáíD¹ãŽ4އì¬nðÅ*8;l €DF?šaE¶æKÑ^T€Ž¡ûf C‡óBî%ÁèÅôE°–„íØ" 5ì,N'6¼Lwî,ÀEûÚ ¥ù %má£KÍÛɲU£·|±É)ßw± 4½tö¸€–wáªLŪú®Ñ{Ÿ¼û (3ç°^:0£Ü>¯°0‰×0a>ðá¿^Bè „LH–%ÑUpŒkJèfÂY—{9€^眄ÂعþŠÄXfÁb~÷‚2&ôn|ê!Ä/©@¶ß&Õ¢JLÝ\Ýß÷&‹<T¿5= L{°ç¿Ê~Q´´ä"±6¾çu0öPvíã¨Ã²'_ ¨ŠlVvüÙý šÁcØ×G PB^+£å j̳v_­ D¢ç“NHt&@“p$Šá`LqBÐ&Å›J@5þÜ®ŠÙ¶®**uB]ô¸Vg’$× )ïëjâË|dý¨gøDrô,óa¯x`I¾Â3ùT‹¢±î¿E%²úðõ†pB¸^8¸EƒX”T66KˆÏs0o€I$¨F„’:c3]X]Ž-fR'ÊykUkjoÛe*‘½] RéÃÖÈ©˜G‘pÔÎ@y·˜ª÷à’¢'þ‘~ÁxÌ>ÿ$Þt ¨ò=5Ï'ª½ô¦„ØØ7šÅO?= =´¸÷†!ÑQÀúÈ|®–)Ÿ^ŒšžÝ¢= ¼vncÒÒ.Œ.@—èË3=uÛf‰Åp(ªj1BŠ©ŒŸ€…vm{6¼÷dÀh!|oÖøÊnkƒÔ#+ù8Àúþ|ž„£¨n¹QS. °3*»ê/OçÐc îïLpvGԨ‰¼“—Ë,&Öð"ŒÃ›×¢¤ƒ•y½ ð 1k°…-ÄÍÝÊCÔÎÝ™U@€W•óP¦‡ÔJLÍÊ›ú×ã`BÔ‡šy¨˜ŸõòP-Ùl©µ?k%µò‘û.¨“µ­›•µè66v䟥³¯•›…»ûj7+¨èw_¨•»­••ÇjdÞ¾fé0Rû—Ò˜;[ú"Ѱ²RË[9Y¹A<¬,©Í}©e¾ˆ£ædãaã¡feEƱ´ó¢þ|‚Mô‚«“¥•Ï1È7OŽeé×#qÄT‘_/9™»»k@lÅ€ˆQPÿ5·­27n¶¾_EHFý"Cá— $âääìqX®ß R±s÷øG2ñpÿÊÄ¿e÷t²8Ô(÷ßgAÕÊÑitÿHŒ ÔÙý}>þ dýÿ"AË zX/GÀ|!ÂŽDúPé9Åþ@‘ŠÃyˆû1Ýû{ŸˆÄä©=¶VÔÈæØÓi#Ã*¡v¶F>´s§>äaûœþoÍÚ bs©j.nVðBíqDª6ôs+‹|€ðù+5α0®£0.NjwˆÓ/Ò‚]Üœ-¬ÜÝÝ.ˆÑÚY#+ÍšÚÔTMV×T[QÕTNQEÖ RT1U05a?dûF8בp®¿þ•û¯’G¦mçdõï’ç>Jžû$ÿ 7Ï7Ï_׌“ÔÓÒŠúÔCØjgÎf{ÉÆCø…ò åý ¾£0¾HVd*–““ÕúóÚà?Ïÿ?ã—_8²) gK«ãõ6x_øÕ–>‡~ <´&ˆØ…?.†ÀQ1þ²–¬œ,í¬ÿX†à‘ Á­Ü¿rssçv°òõvv³¼ †,‹•›ÓWöãqÜ=Üìœj‚ŒAÿ‚ô/å¤öÿ&#ÓäþÓümˆ‚‹›í×÷‘5rsQ~xd+ÜÜß(&÷×êúK°ÿ¾©£…jøgyŸ[ä?©9'OÇ_ëí#Ad/äì`åtØ ùœî7ÕÌs'õ/$­®&§(o RW–U3UT“Q‘Õ¢¥þ削¤6ˆå9Gpñpþ*GKt\È·\G ðpqÉhý5×Z<ÜǸddA’È&ñ/™6ž_™µeÕ´Õÿ&գƋ‡÷·5ÒRÿ›$š6¾_9ÕtdÕ@êZúÍ{ÔnñðÿÊ«+ ’VQ—ÿkÖ£¶‚GàWVI55°š´¢$èïŠ{ÔJðþÊ-£¨ªø—l¼GúÄ{¤Orà¿c;RÞ#õù¥råeÿZxÔˆ÷H¾b*# ’ükî#uâ=R§#xþ^À‘JñòüV€©¤–ìß°)/ï1V9EY™¿æ=R+Þ#µÒÉü}})ï‘RýV3þ¾ÌGÊÅ{L¹Ô‘2dU‘U÷×ìGÚÅûvýmÒ|G*ÆÇqœ$« ’–Ô–ýkþ#]ããü=ÿ?ÈÀ‘ºñ©Ûgÿ{Þ#eãã>Ϋ­Ö’–ý"ŽÔ縤Ö!ö/âHíøx‹P9lUþLÌ7RŽ:Pø›Ð#%ããÿæÊÏ÷Þ©‡ÞÊ9¿ÜŽòëXøó»ìk×鳜¿x—~þMýKî’Òñ‡ôå?*,ÿ‘Eýq¾\Ü켬¯úFБ]ñÙ•Íád5“£éaDá_[«GFÅdT6žvNÔÈæaÞÿ”WàȨ8þ,ΑáΟÒÓjgñÇe8²®oÓ8²#ûø G áø#þDg£q_:`_ký0s,¦cÇâ®éÏõÌø1Ù¬ÏÿN±`ýA¹~—ò‘© ðþ°ÿssDö6?[¤À‹üFqÿ§‚ÕYýR:jÿ?DÂêì}AÌÍÊÃóhÜñ‹µ~[Zþÿ…Òr)-ÿñÒ~V€KGáÿ©ðßú¯ŠüÕÊWæ£fE@àwMµÀQÃ! ø §àQà ÈñmØQƒ øíÔŠà?©ekä0™ë÷`Îa?Ï+ýÒÐ òÿ¯4ôÿ,½? ú£F_ð¨Rþª½wö°²ð°²üãÖPðŸŒ/ÿIÆi]8¾Ô•à/J)¯mqr²r£>NmŽÿ8)GS÷/â“>?'ǯjƒüú»‡óhRùõ?z‹prp‰àúÛÖô•êðUñgàÛ°rrp¥ÏýÒÿL¦¯Õþ» ñeˆç)CÈ:úç5Â{”Þoç; ãû3À×#.ˆ™;;CÿÑÈ?+÷g <œ-ú<ÉöeŽíK௄ó!ÿ8/„!õušîwÅQàg üü"ø’Þ慠ÿ¨:øêø<}vTЗüFú]îŽrÿ§ ßÿIîyrÿåÒ‹Ï9§þœuÙÏ4 ¶_³î‚üJý»¼ å]ð÷ çQ»ÅÉñ]‹ÆwT4[+Ÿ/ó¤ŸK÷µñ1…Z9±üÒ¥BF`ùRn02XDÍ„ä‚Ú¹ÿ,Σ¦–“óÛW?'çQ+ÊÉõm]µpœÜ߆56œ½>ðy"šú¦Õ-œ¿¬×°3[ÖP0ebÿu—)îëⓈ­µ»2‡E‚XZº!Ó þ¼ )zµ³q¢v³³±õF»;B P±£ÕKg'jUä?I7j.>jN!n>!j.¤P[;»Q[r¥6÷ý²ü…óëšÖáÚ®;»··7Û/‹ªÎn6ìŸ×Ò¾68"vŽ6Ôînß®¾º8Ù\ †@=D/|}rø ™]Ñ Žv––P¤¾˜#µÊÊMôÂWíûºÀЬ„Ï¥@>úRØÃúøº6ûyYìÿåûWþÛt|ÿŸà°ÿçëþ?žŸû¾ßÿcýàÿuÿ×Oü¿ Ã_ãÀÿ‹ýsÿÄÿ»Ðqü9üyâÿ=è8þ\?þ|?ñÿtîþŸø:Ž?σ?ÇOü¿ÇŸ÷ÇÁÿçùÏïBÇðç…ü(øÿ<ÿûè8þæ?þ?Ïÿ}:Þþóý(øÿ<ÿýè¸ýÿ÷?ðü<ÿùé¸ýÿ@÷?üÄÿ»ÐqûÿÎÿóüœÿÿŽtÜþ û?~âÿ]è¸ýÿ÷?|µÿŸóÿß…ŽÛÿ´þÿÿïBÇíÿGXÿÿjÿ?×¾ ßïšÿû9þÿ.tÿhþïçøï»Ðqü ùŸŸýÿïBÇñÿÆÿ?ûß…Žãÿÿ~öÿ¾ ÇÿêÿÿÜÿó]èþü?Pÿÿgÿï»Ðqü þÿÏþßw¡ãøÿ@ýÿŸý¿ïBÇñÿúÿ?ûß…Žãÿõÿöÿ¾ ÇÿÇéÿsýÜÿý]èøùߨÿÿ³ÿ÷]è8þ?Pÿÿgÿï»Ðqüÿ«ý>n>¾Ãƒ‡øsüÄÿ»Ð·ø{™²µ§£Ýÿ±ÿ^äÃßùÿàøéÿã»Ðÿ£þ?Õò§ÿŸþ?~ÿ_ÔñÏürýY³úcøÿ8ºÜ’‹ã?ðÿñùÆä?u9ñO‹üÇþ?þ:ùé~ä?ôò¯üs*òW¾AþïüJü ?#ÿȯÄqÇ"ßø•8î®ã?tÃñ'ºwèïàϰÿ 'ÿGÞN,>ßq÷­­»Yþ«“ÏAÈ¿òsòϽü¹Ÿ“ã?þµŸ“c.Aþ<‰Ì‘ pÿå½yÿkÈp±[r þ™?Ääïà82NnÞÿŽ#ÃãþKÃûcî#3ãþKÿ=‡ì×›õÿ“#+åþK§:ÿ›˜ðZþ«/ƒŒ?Æê—áÇ_ sÔ’pÿuKòçè÷óoÑ9îýåßµeõ;îæ{ à šÿ¶;Ö[ùµ ûÚéù3DŽ{¨ù9æ¨æ_#rÌ[Í¿Gä³ï‡?…å˜C›ï r„nõ-,¦–ȃó9è/:æWç?D蘃‹Ð/^cþîêX.ë?¾:Vî³þrA:/ÏÿÖéÿ ½? úœ¼Ð?¹Çû¯/˵ü¼ÿs eùG—. ù£ Úç]ç?pÈñ;_9Ÿ{ƒ‡%Ö²²ýz¥úWµs³²øænýß9ÊùG8ÿì¾á_n þU×þö b~ž?¨Õ?Áô<™å{…òïðüyþú¾³s²vþ›¬ó|Þœù‡Y—‚89üIöƒ¾Áùí÷EøÖÐP gGg'ä€óo €ìsþ‘M!eHÿ"âOJñkø—¢¦øû¢|ëè?(е›£7ÄÍŠáH»å¾>Rtr÷€8Y ?­¿Þ«míýûL|ëÖè?È„ÄÍÆÊã¿§ߺUúŠu¶±³€@ÿëEùÖ½Óÿ (?Š–ó5õ»fô¸³©ÿÈ+ßQCÍ'ðOÜ'üí‹òý9üÒ¶þ­?¾£Wߟ¾.ˆyÙ¹yxBþñMôÿ לàôá×l›Kþ£—ÿŸ¾ þ].‘ªÄÍ÷û\þñëÿ—W?ÓÿFɹ~ãáÈSÔßåÕâòjõ›U£o2ü5èK®‘ã»ßÕèÑ»‰ÿÛ Kþ£ÆžŸëw~|øZaþoݘò5oüÿ öÿñLäÏ{ûÞÛÿÿ _ÿýöþÜÿ÷]è8þ?ÎþÏŸûÿ¾ÇÿÚÿùóþÏïBÇïùöþÜÿõ]è[üÿpñÒÂÅå?Ûùõ…88þjÿ2ˆŸë×ý_<ÜÈç\<ü|?÷}útÿ×áR-R+?ïü¢Ö²²¶r³r²ø¹ìç°ÿÞ°?SId<­Õç=\Ô_×ùÜ©!NÔsw7ˆ…Ç—Ü|Æ» ÁÎÉæóN0w+ ;”)–úpmCHÄÜM ç7¹·‚þ/.±Qÿ:W@kj‰4c;(Ò TÝ¬ØØ>ï<ÃqAþ;œû9¾ÙéË–£_¶;}ÿœÑ?ˆjmáäýG1=šcù¢þv³Õ_Füºéïbºz:{ÿE%s±[ròýÉÖcÓ]¼Óçkÿƒúi³ú]<=ì ÏÏ^6ÿYõålkjåææìöû*û¬ Š_£ZZ¹X!­ÈÉÂ—ÚÆ âbûYÿÈ.„\"ÈæßÊMìwSMd™þdã’ÕÔô0c_&¢Žæš¨‘odGˆ Raÿ(9SdÐ×i«ÃY©¯ ㈠üS®Ã%j7+È¿ÝÚEín 9|‹¸YYx¾ëýÿØ»p(×¾o7™b” ´7Ì0Ö3–Y#Nƒ±™ìËXFI…R E*ÑB%”ÌØ:Z$'K–s¬Ç‘%¼Ïè,Íûž·sïú¾yçû¾ù]×ÌeæÒ¡•þ"šØ?3Ça¨Ä¿‰cËX>Môóe“^ºy1:,—@Æ0ÎëÈ2?ž¾Dx¼€`/ooÀ…À-îÞ Ø›Ø[ì³0{{Œµ5f¯­ƒ|œ /!ˆð5/¢·˜l0Þ&„2Vo›Zëƒá1X3[¬F&¶{ ml# kXb¬mMô÷™a¬Á¡·µ¥…¡"`ûÛ’o°r¹ý^x°­Þ^ óóE®€°6_§~óRl„åâèûCUðÛêê¶\êeo Pl[šüñ@ëÍU¼mï_S[®Á?ÅÿæÉ uÎ什ùýŸörì?°Ìü³‘ýÎüKÀÌ?ûÌÿqæXfþÙhþ3ÿÃ0óÏFóûß,ÿx¶9ÿ]űÿÂ0óÏ6ç¿sì°Ìü³Íùïê(ÎûKÀÌ?Ûœÿ®Žâ¼ÿ±Ìü³ÍùïêJœ÷?–€™¶9ÿsþ7‹ÀÌ?ÛœÿÌ9ÿ‰E`æŸmÎÿåØÿg˜ùg›ó_9ö_YfþÙæüOÎúo‰6Òÿqøg ˜ùg#ýGÿÃ0óÏFú?Žþ‡%`æŸ}ôýkÀÌ?éÿ8ú–€™6Òÿqô?,3ÿl¤ÿãèXfþÙHÿÇÑÿ°Ìü³‘þóþÏ0óÏFú?Îû?KÀÄ¿ëTÿ§¦‚Vel bð¯¦Æÿ±ÿÌÿ¿ì:dl¾õ$øyàpË|}Üþ./ ‚¿cÿƒal™ee%4Çþ+ડ⢬©ìêªIÐTVqÇ«àQ*xuM¼Š€vÑÔTùO—ƒÿYüÚ?žø7óø«ö¯„BÿsûWFsÚ?Kà‚÷'~ËÖJü„›òŒMü*b&ÖÀ÷w‹5€BPÒPCh*£þl„ýŠ¿ßþ‰G<þfßoÿ`«ÿõüÇoÛ¿ÇþKpÜrïîUBëx•‰±5ø[ÍÅÅ?ᯞ¨6›?j–f¶†‹KK’’Äššš¼¼<8¾ÄÅÕßßooo¯¥¥…Ãátuu?|ø@£Ñ._¾,##Æ[ZZºXv¼â°ÞkÃ¥×׿ÎÅp™`lC2G" ¹Å§—¢›FrI_–t;W¯†$­NŽPù|Éwì^qÉMØK—Þ¸¡Ë¥Kas|#Çc"`ŽE"X¨;ð…FóЂ´Ð*ÌÅÎ2±âÃû`ç$¥¦ÇV¾+6ë,¯Y­(Õµr€ÏTÞÈ=¹I/ú¾f /1Ä©ÿÄ™ô·ÇÎÕº“±W)Vçõ}>ˆM@và̆¼qü†˜à¢Èü"žXüº©Ë#%tÜ|¨V¹CDÚÐÚC AóºÐ?¢1ú";òË'JÉ‚Öû¬aûôj†‰ux _w­ß-„™1çÊ鼓A͘<Ð5þfîC4¬ÏǦtA):ª÷e!è“6b!!7;(ûdŸóÎI=ÏZÎñ`"&;iƒÝÍÁe “Êõ»Hgüi«ø¿ìªèÔã á­È9¥†Tåë(ëˆø¤4ž¢"ô>¦(BrЦªÕk¸e©ääN®O‚°ì—9jÍòíμÆH¢ììú–¨9‰Å9XÉaã“<¤àÃê¾Ý —”Dª£á¯=-^ÎWO'ÅèIW¥?,ZtÞ|cÞòÍi¢Í”lÒŽˆÓÝ;çýñ½êû¨)FÐS)ñ\<¥"»èã¡yÒ>ï1mÓY‘ab%ú"y;‘Ó§Šν/ë¶^´@ÇH{ãY¥QhÌágЉz;I–ûÆ£|U•âQºoùªiBý½Ÿ«âe|œƒ¢ÄÜ3ä*Ýk„±õ÷®D=}"àŽ…§Öø|†Y›Ã°¾:d…µ¯7;n{«sPAõˆndùÚÑØè©ºmÙç„›c[ÄCràÛF$‡œÆ!û 4öëéÄëõÿŒXë »;ß]"ãÍ++”òÂBá`Ã.DWWÁ Gú†-Ž-dCS(f,f÷Jâ@–UÌ®\ÛE¶ç/\Zoª¢f]WâáºÁÃÒ‘ÅÓüò¨¦䨲vC™»NñC¨-°°ŠüÐUK‰"ªi³pß”nLÍ6 m)_ôœ5>‰P|<bÆ!·K¿’²[Mhðyc.ª÷)xgFaHfä‚éŽLE>1÷kÂdqéü¨Åm¨‚=/ëùctá%";„rpÍR+àÒ¯FËÒMJ3„á?s®Òz½“"ƒô Buܵ…äR#•±uD±uÅêú[ŸÃSo™S“Ý|&(ŸAB°!‰H1r‘]/Ô&Ý~µöÏT»Âzfª×Àbgc€X]<2Öòòí=ø)ì±iwú­Ñžð¥ !ú›ÛïÆºô¦6^êŒ/ÊZˆ×ÂÙŠö*Ϻç㔂éj+ÏÆ÷ÂdÑ8A§ÖNFÒ1ý&~X gÙwüH»5z( øThÁ¸¼y-KÿzùœÛX{fÈ&è<²( ;7µ­üÜR3Úªwù^9‰~ºžbCß=jUsBï†nÅNï%Ã×ÔQ §Qâ{úËÙÎÍOà.ÃîéOÓ@/=±5i=iXrØöwA ÷Yƒ¿:žÇ:´ÇYµ Ú… ¸eã|Äôib‰sûh+¸•ÖµüÒÖWÑV&îòZF´ë'aWâ I1ÇM…0¾­ë([©E…—ÜTظ¹*üÑ:˜Ë 6[<ñ¸é„ì'ââ¸û-k¥õ‚UyŸÑ°.lêÄ›ã”FY©s=)E¥á>m'd¯¾µBÇw’è*›ÈåcV¿@KÛ Äq*‹Í‰1ï"_¿ë…òÞLzÊC¯^rò–«ž~%>ÆK´è¨£Pš oÍœ ÷5ç¯Ð†VIñßGFr>,TÙ"BOB®¼¥|e¯y—„2Ì»5ßߨ¯Ñ ýR ¨V=ÃjP¢ÃÒã4bm¨]z\}•÷aŠF˜1¯Ýô{¯{} ¤*McFä~Øã‡\ë n0ê'©ã²Ÿúq‹Ý˜ì]S'½Œeiýz3òÓXÈ]RÎá úu ÛìÕÜ~¶Vë„JuµðêÓ­;‹é%Ôì¬Å—uVkKÕj4Nn•(îËö)Ë¢éÚ»ûÚ€ªU£æPc\æþlÁ5¤¡0Éô^ÓÃwô×Nò×;¦›ìˆŽ°ü¡òÝ`cÜü,´(b=ÂüÈ gG©¢VwaÏÈöKÞWÔ¼ uþäˆSb>e·‘žy¸µÀŒþµÉ,¯ —0ò«*Ï*¡!¨ªg twfÈì”ÔOvÁ’d½óò¶Ù¡ó“¨Ñv[P`µ­Œ/øeò“L¡ÈÃ5g»êv%_‘ˆ…Rõ6Iß}uN2PZWÖ©sð8T¬¨çoêæÞvðÙ ái^•¼.C%ˆý\Ìbüœv莎ñN=ïÊÙè™Vóv˜âd–ì›Lй_ÿ£)Ù*Á÷ÝYz&Ò™"?8Ù“õêˆbºˆ±'Ãí"ò®èÕ™(E©g‘z¤¡ë$HT-ع´“?Œ3÷Á•ôÚ×:{éJÕÂÃNT¢ 6çíØhÄc‡\ÇÚB6Š'©dœGôdáÚóáO ËœîQ=ÒºBmrÍy³Ð”æ30œ£¤á˜ÌÁ{Ïû.>…µ9fGÄqÑ«'[ö¸­˜[²Ó)ªkN<‘¿`|©EÏÙ¡q«LÌ´ÇÈ£V>§@ï=-Lò"T8¶ÃŸ.'mBS~Oëã™>¥ÒöãŠáôŽà«4Pjgi€rE`äìÞÓøÂ6ô£X*¬tÿª›ÚOÆGЛŸ®­/™'á3H›åœ$ìÕ7zŠÊëäŽõ# °e]Ð A@l(rì­ÜsXÍ1öãYÓÓÕª8L`ÚõÁsòyËÃÅ-6ÆjDT…u´†^SßjûŒ$wH4NUL†²‡1ˆ‡})v-—éö˘â,€¨v¼é¢É‰êð_ÿ¶]SÍÇï¯ɤ쇴o¾ØJò4”M¸®*ãè@åòz)ƒ++GVl€žÔ²§mÔ!tåçYlvtÁí­^Ç’yveîÚD ·“®‰ :—$o¼ß1* ˦1fú~Ô¨}"¯p+zûlaÃK÷5¥aÓAH´ÐÑÆ¼¾Cf¸óÐyé†nE¿[±é!WÓà–7×uN[§Î>~÷B/!q·£ÀûÖ i6¨’!úcšüÚcÉž½0m|²Ú-§ N!“F›òÊÕôç—8ËðÔÇ Ì?R2ööÕÁ“VŒó_ßòeÕy*V÷üÖ¥qYžo’Ș™rRu.—DÖŸé&Ñ·…ËÆz®ÿHác Q‚e‡/äµ"G')4ÙMš@ìàf˜Õ[/¨ÕŸ†]'‘ÓŒ«ÝnµìMíçïáz2wÏìmÇ5Â8bÿOj:“¡„q]¹(ÞÍd™€t(Ø_÷OóŸFÄ#¥žmV³py2¾zø‰°‘¾št~ârÍ Y.*ç^…#ŽkF÷ò]|F¹š`8WÚþŠ…A XM±•iÖ !;®¹µklÄ^´š°È3[àˆoÍwð¥…Á\&àŇœùxïˆ'kQ; åbGmýä;e†qi‹¯b¸ì‰¨:Ð H„d‰Eë…øcÆÀdy ¤ŽïÜV)=áKK„-&TÀªëিݖLÿeðDwdÝÙ¦D¿ÒjÕW=±{TâÇQ’Sýví 1W.]èÁß…u]uÙd.€±zS}âb?¬þsž…i`4›zÐ/çøeC”“ð­ ¼×´&¤ob³Oûªñ©T¨ys¡©Uõ6vó¸.ʹ‰¬4º¾\þö™ 3J}Iéœ]·8ùî÷ñÔkwÕʲ)TWhóÃdß«<”&Kí†-â1óG×qw2‚‰ôc—š‚É@¥*?<~}׋3Ð,UÝÇòùå?PÛœ]|,gÔˆRs6qÞxÒ±¡ÛæýËù¡cm(ù¬WF¢^©¾9g¹û¢D ŒÌuº Ó¿ÊJóX¥VmB,„oˆïGIm.r—°õ@U}Ÿ¨ËO~BsX~T~ã/Îù¢ÇCÔO·q™,Üš]ÏæÐ‡±MûÞ—m:¥)—ÂÃ-ec?XÚPL)Ú©Sšº 8”ßm§)'ú >0v¦Y$NhN” ¯Ã&‡ó’x°zù2 s<<ϽÅ%×&ìäKs˜Ìu…,h$sšƒi “÷,h-üü>Ágºýª™ ”DöôyùÕ§5%ü ~Ö”1I2Öè3=þ9¤@¡3Èó®ý­¾ñì½\SÉú H „^@¤“„"½£ô.EÐ"éE¥‹J—&UTE"v%HG@¥I¤ úN@ײ®»÷þïÝ»ï=çÉ9S¾ùú7sfæd ¼'+uqŒisF8*'Ë)@9µ ¯©Œ¿3ÿÍ9;T Ó2¸76@ùÙ•E²ª§*šù#ž™ rÇ)ø\ËOñ‘wGI'VùSVí§"«zÂ’úŽÈA\jó&;¡3øÝ¼ø-ØŠ3OyÂ$ÃYR²Q¸î0¦sN D69I“Ñz©ÜѤ‡ˆ¶y×ÇÈõ-šóFÚ^RªÉy°*ìJHOg<¥*Ül[±¹ø¾ä¶ÄðÑÃ$Ügcõd e’QKøššÁŠÛL').]—ÚËš¾i ƒò=èØãî¯Dæ›n*Ðzׯ¤qh)E@9oUÑ÷Ξ³CÜŠlcÄQ²Öa`RF‚›°[ËGÁ}fn2©y‰˜=­ÌMÉj(N2GZ,{ñX¢Kº¹”Ž@ŒP¦»Ë²ë}Æ =à>®\턞×ÐÂŒú¨´³ÅŸ¯CŠÆñ5é†n=Ã×ü¤U’KF+{¶â¨f9\º6Éé køÏ÷¿–«¼wîþͶý½óxËæÙí䛨瘼`Φ¼›çö¼Ø~Vv͸ïþ9&%¢SøÍsޝ;Ý/¡Ubzà&ÉÆQåy/÷Ș:Ö?`àå'­šÉ0Õói#o;”`|?=Ÿ¶ML:dRܹˆ©ÕnñÑa§ß®·©ˆê~ò¢ˆõ¶ûŒÐÅûyttôás·O*šeÏk’NMóC·‘t¬‡R= ‹šhÅ·ÀMr6n×i)ó‰9Äd‡¤ ¸_ݧѲë¡äY+’‹yMn~ìŒp€Q Ÿ"M„ sŇÑbº®“öÉkYã+î–3]+ zt·|ÍE!q¹M%S¹AûÀÈ˲:·…ph;ƒ· æj9/õˆ²CS5ØÍkm˜'XÚµô1Cç0´ôÍÙÇÌèe¢(ö·îÑ$Çø<×Ë^‡$í›[ßw5f Ÿ- ÷|µ‹V;”ðǼQPn¹‹®ËDĨ>Åô8BºèäGÀ4¤ïEd×:ACÑ:Õ¾ P*‚¡x ÃÁøäj.å35å­ xôWlMx«ÝGÚŽËôœ›“… cƒÞ¾WÎöŽÞÞv*L·òxJh—Ùô`T3±pfºÑš(0{ˆ¿6šÞbÆJ¸í[3Y|„¸ã)=öžP›U¦À9áty<}u()ãígÇ>ôâ9ƒëÓœ®Eǧ_Ô ±;x–}¾Ï¨"°Ú²Å÷“SÞ ‚ˆ#zV1 p]+r@Üò®È¢4uKZ‘„ø¼x—'¾{KÙŸ$ž; £ÁøU\£D7=nl<â§öþà/wTÁBDH(ã-*üÀ°V_}þü¤Ôǃ  M¸HÐþŽ€ªÒÔ¦þ £Æa% ’»%à5g%þ(c٬잽ÔiÜ£˜¸¤QÉu ã.`&ÑÃÖxFw—cqÈ}ŒX[Ĥ½£á9½G¡Ý'uOß 8 ^ÓPVmÂæÕc’àF¯À G»æâŠ2ƒ[¬hŽîo|¦wFx:{'Ú¢(ŸÇSKÔ0ôÐdb¡¾±ÑêAKñ)r]"2µX„ %j”?`°to‰Åä,Û©ËÑ À¢_¨¤ÖÔ^$šsT1` Vìˆ+úäé²í©\¸þÆú¡£Ì=%É1âó2'™’;\l˜È ‹â¹Ýã)Xù:ÑòdÓ?á(/M²Ö[r@ÉÞ!™Q⻚^K9¤Uûl‘ où´':§Ô™M•›‡.9í}´Ï=í®t×õÞÊ«ÐÙñ¸DWT8ÚoEa»\seý˜ d"ÔÊÁ-îV2.¶øV-Q¹vñ\C¾$M×çÑ)-»ÞØ4lÄO¾ àæ&gZïVšÛÚ¦ŒDOÔ7ïŠÚ"(é>ø©(#r¿¸€å§˜Íåý¯¢×“ùÏå½à‘!)ÙöœÑ49­ù¿Õð-UäêIŠB͇Jò_’DÜiúÈ%…²xl wo/k¡9hó&Oëshò$O‘ÐåNž–ÍE?ZåÍÈõ×yÝ­‚/xÔš16j²ï¹œm—Á ‘ÝjÍ£¾Âág ÄV)*²ÞƾEÞ£*\t02}Èêéedßø)ÞEç"1›Õƒ¼©l^L{>¹~}Lu/ƒ‰Ítæo÷ó©È'iiàLÉÄŠoÀÝbëÞcéŸ@PL‡»à r ä¨N$©ñ+Ñ@iÅúãc‚¹ŸÆÇÆÉ<ˆe,§ÀM;îÍ<9ÎZ›Ò’\ L®§vöÂÔ¡û˜Ú”“»½÷4x °û­úp)¨½×qâ(R4nŒÁó@+3‘óm8áß=¼ïÙ¢%q[˜ô(2­à”øÃài-‹Ù‘°s-‹yIÜg[‹²ö9€Ûtd–$L8÷|W® ˜û' [*™ÉWD0Ð> ÷¹\Óîb“™îJ}îÌ„‹²zÖ¨ÝÌ«~"ªéy7¤$ ÇÕÓν§(ß ’m’EÏ¿àY°Q…ßí|1ÃøñŽ5x¬:·\îAá=ÈQŽKÖk)k={ý¨;xÊù¨’¬ÙyD¶ˆ8»ìY^ð9 ¿æ_˜FÜÎz G½V7ä_Aʲ½ìyS–i»œ%Üyáúv g²,<¶å1OGxkýqC»P›–a}MúȦ†¸µYcÅëÞ&;ú#QÌ“ì4fP‰È¼±šHdÍ}kCNâ%O¾¬Íx«;ËDå%åÃÛ¸õ##eµ9HÌ´ð€ÛíÙèWû¤K?jñ#^Ü¢‘1.-94bgñˆª×:ÿ$´=Á]¢“|i‡Ü‘¹Õ§ A7%én¾—O'Ÿ ¾Ô« ‚¿\sÃÅ£ÜãYÒQÁf#ôÕ·QVE‹ÑÑì-m:ò‹ØÂÊea"5ZŸ£×ÈlÆ5M4î¡@9ØP®O@oÛdŸcQV[L {³ã ’¸g%ç@céÙψ¥F ÷ƒ5¢1ëyò)¼nÁ’7’ÉÆâ$²»‰EG ƒw¹º@íÙUá{NÂl Y64èæÝEb.ÍìŽ å¢HQááÒmÛWØŽç‹Ä‡YL&6¼A¦·ZÚrw*pGXm³\&¶¼1q+ܹmFÒ¾•γ龜gu¦-a'9Ï+ µ}"·ZžÅpnµœán(•$Dæî)#Œ:UÎs›<0aŒfó9È …áÝ 7"hcpÇÀÒÝ&Œ>ôFáð­ÇÇ׉rŽ|Mƒ\Ï•w8hý–Ø”›bÀ¥Ã[D)ƒ*”\‰wyì²"È^nK t÷pæAŠÈÄ ƒKÖÞåI–O-1¼éÍF_Oi¦ã}~YªgüeJ—à !nÌÆ£WÚu¢-’ A9uf·'Œ‡Û?9Môñ!ýeaÌðDpËí+ã[ÂÒv@|ú‚òž¿m Tn˜³ÙÉX )²ÝÎ4lë8ÐÀß™£ G$„æÛvOj€l3ð#C£’‡v3š>]H’´X‹Lè”›»­W3½ÌºF˜púãÑwzy„ÏÊÚ—¢-¶fOjè"n|Tj/~’I}/lä¶ÉZ!\´j]Ú÷îÈ@Kžk Ét@k£Ó`Þ=¹ãH\¡[ï(NŒç–ZOÕ2 6’|4zјøXSs*^úÂ$j…Þ:¯U3“«ÔŒÈ¿1WwHžO$^31`z¸ÍϯŒjÒSvàí`à/%¿üÖ(«®W!nœ¶ÀŠjÍ ² nyuÐ: 3IkÝuTi&½¬˜(œ~ƶ'ѯ1÷®JøRNqWä‹7GR\§“ˆ6)ltòœ¦÷v>úÄv´ë8ÝK0òSüTë¤z»Ï{šz¯LD XW?=D´•[VŒÖkºÚ‹7ðfå’œ¦ôo÷A/BŽÊ,á‡(J/‘†(J.Q‡("—ǹèîUfup‹½dvÖ Ó4Ä¢M6Çd—É8¦éÄô[¡Å³üô‘ãQ¸>r’£ ?üÌf‚3Q¤MÕ'² '@à·nü`-rƒà%›†K„(ÌN…ì¦0&Ê÷®âû]AA^‚yÚZöØõ39îÞNÏœ•â¹wÉ;…‚ÞXaÆaG ðÞ˜ýã)Q¤m\o5®Depë·.~šU06U7Æ5êçÊö>»Åh­—TïLcS3?SZìM*Ú”g3²x|KÙƒ»Æ›i½e¦6=ùÜa5r³{¦\¢>*Èî,çˆ:Cì›òl{Vf×3 á–£dJ¹#P†¤"Vâ׃ç4@A»EÞÛf –—…M(@´z§¸Ÿ_x6½ß¿jz—!MbDÑ­GCöyZèÓ7aäÃ:áã7j òr %âÞÍ%x.{ÁøóFz[nµoó-²–3E2Zwa7zŸÈêã/]œ£%Þ‚*Š`¡†ž_Þ`×Ð…èTÑLÃnÂp¨žG¤€HzSµ¶µ¿N7ê­¨Ü÷„ˆ±R«QQÇz½E¹àª^}ØÞlŒúC, û+0—•|FP[d0¾wºZ`PÛ™àü¶»¡@Ö'¶]ÎY«‘QåL¶ÜÛÍ}!%É×ÃvÛþ*±hÈößÀ%E¡Ð–cS·Î¹«f!28"º¯T:ÅMa•ÅCíæVt‰ §b0\/e£¡Lœ¬$(íq0}ku¬Þµ#mPPb®äÒ ' # ˆ@‰wàR>¥5î“Æš·ÿR>½5oߥÏÖRŒ¿p}^çâiî“KDS¼3#Gx͹5Ó…£¼ê3hÒL€ =Bnr÷5–£Q½/nø¤pK55Ã.Ôm°IáF5‰èÄB؃¤÷/™ÅQ%G{¹óáQm_ªüŠaî™kC šåÍ ¸Ï2ೕá!½fPBÉÀµFb%rëzÿZ0†Tª ƒ:_š§vû”òÅùQšˆàð‚Ä<*²Ü£n9aãiÙG¸Aà Ya:hr]‡Få a¦“ü3¥R²0ã…ãáöÉíŽûªï³?ŒºÛÆ]µa˾mºÿäÈ~aÕÈ–ìÊ‘È,o©ÿ; ¥žµˆSÅõzßÔl`ˆ:¨‰!U iQš¢¿ZÑ_º”{„>Ï è÷iõâ»·éxçøÙ°ž{²ïèË2¤»gD󕌷UŒæe‘îæhÉÂ+ÊpÂsÁŠgâ ïs¯g+šc⢛¯f<ÎÝ(ζ8ÒKÖCŠ·¿§ÚžYjn¶ÿ–¢&ÎWD$‹©°Šo=S±«ÒM*Jy* ©¢”çæøX!O…0ûf]~uNçmï(¯$0Á|èxôš÷­ä$7u²ùqôž¨ ¤J"ƒ¸1Á>NíÔPb@dõ(„¤Å^\½ƒ¨¾,w‘Õ£Œxà˜x“+¼L\f”¢5"292ÅçL©«¡g-‚夔Ž~šæúºÎÊN.±iÞndQ ŽŽ‹Ñ–”$Ê)+„¨Ò;Ìð|œI¬öPç¾RýbOðr2ê ï žä-“ôøl؃¡ve´šè~XCjU%‹7¯Jvd‹e÷•s AøWFýí×-›GÈë[C³”¸ô:¯É%M©_Þs,‚íÈb_+%Á ’#´œ€z© çoË“x-Ú`Zé‹+®9ŽBSM,\ÄFxù¶·3í©âƒêÊ Ì0 eGtÁt§‹wËj]sYãÑB3Sq²Hu1·¼·Êe³µúÒ¥eæ$†£'5òŠVz¢%\ ·ïL)\YThO"Þ¶xCöJF1-e°Ÿ´YZ€+|˜‰¾ ËšqÁX©§«?—ˆJ½puIP‰ãÙ;"‹«wì-¬ðOª0Iñïybc%5–œO%!Ä0í$r)F#þR;Añ+4¨ïRÂ*€†?¬ž‰üó%Fû ¬itä­P5Žy¥>Fα¡”ê¦òu¢¦™«g ¨žH1Ú¾SäÐ<%'3=Aú4öóú¦èôáëÎØ§5û‰JÏ9ª&& žŽ*¿h~€Å×ÇM38¼!÷’}¹Ž€+î–’Ø_öÈ£œ‘#’3S}ÊÍ Èu\û·ÑOBÜN°q“*ìKˆà;@Ë}E_ýÞ9H¡„±ˆ s÷þNNž ˆÀøb38î –– -Ä­^;¬ÆÆ6¸ól÷ÓÍÐ}Q«º5º«0Ú«¡‡>†C>ð%ŽEbÜ?ÒÞN;¤¼î´ µ´ E‹Cªf9V=ù*òb¨Z£·¯¾¿Fcsi”ccèè=ÔrÖ*ê]UŒ«¦j­ pÎ`8¢þÕ¢KœQ¯ú?­dsgËY]кbs4K`Ì0/­Eã9qDˆ|(.ã}$FBùÓÜrr2™dLBH´ÉýÌ i½àG™á1&ÕÎi×5¾È297[w9dŽÁ¸ y*gRqŸx%&yóé4XÑÑÄ{®ãÄGXÞØu+‰—žìçOlaJŽ‚L¸w{¾÷´…ؼŒZ¿77h~´+õ<ñÞ4çþ*[Õ#™ËÝ—ªª.^0¦aUè:.DI&ñ”efjzq– õž¿Gjº0ö„ÑGÃv!ìà „MiêîÛØ*‹ëº7ü/<Œ­¶RFÓb+æ‚2¯Ëo«¦cÑØAê<ý²ˆC‹wnà‘Þ‘¥½¼¡žõ‚Ré¶ö)rµëaKXW±K{ß =-¢\ßMÜ.ÏÛí‘y©·Ê’ z.K–>TYM|GE?ûe7.n?@0(ôùãÂÅwCŸ³ä@ u/QRœ÷AûöÝ•£ÜIZ?TÑ»¦N®ÎŒ˜mŒ´²9ù4·¦xõ‘ߺîeÆŽ~pË[È‘…Þ5ÍSÕJµÕ=Méë4…Ñy fÔô.uƒž N˜€_û©‘ÈöŒá—÷Ïæ$zšµÐ^G$Æä½QL$8ãÓtrXú¶« !+ Ÿ±Î(˜ ©áô5x1 @Á´Dçßf†…“åͰu[‚”'[‘9ƒa àäÛ=·D\G‹ÖbCb’ýŒ‰[9jzó–Š^nx<}²ïZ¾æ{h½I+U#²_?¹qL}€E¨Hö¦Î†±õIyX3mNHxA@Ò®ŽG‚æ c£Ú½“³¥Éñ·ôÂÂnåâ¢|qU5fcôl5Q2ÿA˜‚¾b,, Poín)~K¾¾Ýs# ZMŒ’)(x ð9]¦¾ÌI„/TÄŸëÛLÍNÁãõ=:Ã*F$Uáè‚í?qƒ0JÖSOðl¹Kw;ÖÅü¦rý5 ä\NÒ+ QpÙ¹Xãê:«ÇML·H`ÂÎUaÂ9S6ÕæWÇŸóv;QƒêÃôwó6{„âx3e‚;”ª„ûÙNNS*8¿!Ê/Ç=3gŽ6™‹ [훉ÃñW;$jùÐRFàï {r‹·¤*j’á­Ï —‹,ÇÉ2ù̼vï†R´6_¬ ?2îiV:[®ÔGÄ…Ú"jç@yä<|ÆeyÂzã-[¸b £nBë8‰Í[b°b¥kRüpFÑÁå«üQâMykEþŒQîÁC"ŒñjbòYLD}ìymg¶¸.0Gï9 ÍB§¹OØz£lkTŸ3öçf‹~gÑÈ5|l\‚uLÜ$ Jˆ*{ØšâD ©Úˆ:-¡kex¶÷ó¦—Û€¨ íá• ‘“øl’ SÕ¼rô–µ… Gýdz!¶ÏàHŠ¡`é™õi,nn ħk“½qí°ÞKµÕ¢ÆE^PõÚÇ/‰ÍB§W m*MK>îMÄ—´ize{†îƒ2SäK ÃÄ-'aGÝ o©ÈÎt‹ƒÞµžXãÞ2<&¾ß“Cì{½ï®|”;˜¡ÛÉx=ëHó yU÷ê>.‡‹ŒãíÄÔo\µÖëüAá ã‡àh‡¡øß™Ø9iƒÉé;«Æ2QІtZq2xIÃ&Qɼ¹Ç ‰%Ÿm\ïcó£ÉÏ  õ€‘Y†Å+Ö†0®ð¾e´E2¨Å!¸í';`b8ô¸ƒÑ¨b¹|v\ú†èÓœ1YOXŸ±­ù49½g´­gêyìßY«@þvH0¤Ã~Ì |âØTÐáýnƒÑéHÈ=öÆðC…¶X™·µF$T­ª²Í òÂŽ‘+ñÓ6ã¾ Ôä)³X¢ûú±Œ$\™ÂPÂx2L[œû«"Jpr!e¤s=i >Í¢ævÑ……ªÌF ŸþÀæhÀµí›iÃÂiÇ7š÷vÞ+âÅæ»Øém9:º†h@ ÎpN5YZE1n v{0Ö$p>÷z¬/ñÆ?SH™¤ôôDRHI¥”|ðvôDŠ“ïê—ß² ä³[ZÀ ^­v;ú5p¼·P’­¯ é¸e w^Š Â¸;A3”›6ÎÎ;½w"#JézÚKdKßæX«Ì™j\H³t,òÒÃz–²÷ÃF£‡y[.[òV±Û+˜éµ'¸AŠñ4Ï“kRñ'Üì–ƒ 7l2¦£ÄH øO ©˜S¯ŒpÃhõ©ª´i•H{˜Œ-G½YĘš!(¤BÑRÕ›c\PÁšVñœ$#1÷®iå9ò$²pŒ’»PÆÄ„.̄۴x¬ã9Õï ·'䚊˜ô7ïa„EÙ5)ˆá?Ý´9è&>ÄL„§´Æû˜÷N& ¢Žá%XÕÅ2EK2°à iÜ{õ>ªäèKÒÅKÞ¤K”mf*‚É43Ýa'É— åƒ8•ˆPnyg#E0Æfæ×rÏg”:Æa~£»D‚=¡Mœ )ŠÍº¹¾Èƒ0\qx;ç&·nrô¾Žè‚vtm|÷5m²ËB€ZV slõ¾šë¨³³¥8á®h¸Í±«Ô‹MÍÉbd~ÒYúzÂs¶ÛâÊ4„Þ†ÃDÝ;×ËÎ…SMÏ¿b Ë<†©‘á‰S P³©'›’¹aœWt~ø3Z» оåWÓˆíò½¶™ÂSɃ{Aü›uØìf2Q&DY•õâó‘(€¹wxön48ŸÍçÇÃeiy|žêm¯Ù)÷9#t·Þ•˺ŒÊ ÖÆŠf}'9LïQÂWˆÛ­sX$b6Ͼ?Dâ š»41·A0!º¨?•WІĆ¼–Àø„!Â;ßZú ­]©6c*T½íC¢J‡qÏp)ñÁî|ÇT‹ÆÌD)2·>3ÞO>™Ùå7 g5àÖiV¡U”šºtÅh4“Ýn¶ ¿|iBþ6z˜eÿyºólPÖÅhÍm×Óç÷Jˆœ,‘¤=ÇfÀJ>q[_ƒ†…èsN*Œw6MnN±„ÈÝc¼÷9)a¬ËÑíÜ2 Þ-¤Z^K{>¤ä+ ë>B7˜ŸÌM äCÈQjBàÖŒÏd€Ó±£Ä<Ç@ѱܠf†ÝÎ4¹êg.—è$“ð¼¥m½¢Œõ†u P ·rÞ±ázØ]‘Œƒ«ïy Ôšv &>RO/PÓkòþ8È^÷v- `q[ŒÝµ7BU†ðåaîZ±^Ý;ï?èGÙ#ƒ†æÇ"Œ±t>'¹-¹6g–‰ ÷8Êúø„ñ)ôkOòZ; ÈÊysÊÐÜ4x9(šŽog1Y/ì:YbÛò(wÓeýÎÔª”QùÒe1ò寮²Ë7 ß·Ï?ËHš%ÙƒM^ˆ@³*IvZw…2ù-]Ót[öÏ,k¥DûÄÙN½ÔRØ«”'»½mKxš¥0OÖ¥ò€ÍIî͸ƒM|xQã¦$’l¯’ÇëY˜Y‘bs¿¥FÞzo|:7™o*÷J²:MDd¾gŽgx‡Ã†™°¾î]a_ÎDbTZ¸„amÑÖu6Í× > – Þ«ÖQ6Ô+–]œ„§ŸÃT@ôÊãb1.;>ƒàm´ÞfDÓÓâ½”óü_Qðq2GlZ .£g2.»¿Š>eó¾ÔWXk(™s9b÷äPƒŠßi!kìAƒ;LÀàCäÂÜ#ð÷ÓPBùÔZÒ½%Æml|ãä­-}†@þ.ºGñ”PŒ¦Qa«…3’:1 Th¢Üó&9È5¦0]K…txUÐæ ¡M0¯A Q Æ×©b9—s«¹ÎŠ:âÁ¶˜T%3P¤Yh#3™sËæº Á@’÷NWœ¤­TÏN/K ;ÜÈM8o¹hŽJá|6t-c¤”W¸«++¹¬¤ð~ìú\ºžKUE–á!K-î NÐr ]Ã}ס5Îsš‡'£v¸¢DÚ„É8Øx¼•â)äÎFÄGÔñ¬áS•ꇔeQMÕï«ÛnÇû•³y1Ü¢ò¾F Ùÿáxôm¼pF‡½ö4š”1¼Ö‹rŸòä©î!¾^nàÉÎO¡‰;³†ÒÊjþ@±Ù8WOÍð$0¥cM£¡Œ½<]'U?®;;c&,ŸñÆ-}l«GŽ)4K–(_„‘Fðäã]÷RÆ{K1äá:2ˆ[K•…zžÆìf •…¸wЀù^i÷tbZÌ*ìû–‚‹3GëEÜ †ä¬Øè=ºb}ór‘è–ÿ; †TŽë[¢•Wc2Ë‹O`ÍÝôˆ˜ôèÂ6­¸I°âFû–e¯蕘jvc¿<¯|¶bÜ8˜ŸK™7œ Å"—aú|´Có´‰ÛèÇËA°£ ‘õ/7´ÜH{)¹—óA èm´ÃÁ«"®óqñ=ïÜ,†®9çQ¹Ñâµ’ëâ Rt²¾ò_ÐT¦‰‚Xë…^µ6Ø\uÉsÐåé%‹Èh›‰(öl¯zc´QfM"m—ÅcJÚÃn¸<¥ éSĬfV‰ÃRÕ`wFyNWûÊ“†—¨^PÆ0Fç³n&=%ŠŒ‚7=°—eÅ"‡-óÚÍ߆ õQQ>¤rñF=a¨Æô é3™úrÉOïiÑ<}·º–hÿ‘’ëÅê¤(JfMÞÖâu(áëXyb·ü„›nêCâ„Y'~¬*mñÝ÷|ééSˆÎrÎ_‡´ˆ5{œRzçRÎûÓº D.Ü/«ð!†Á^0±2=#M{ùXüÂq5ÆQĤpÂê"-Iä†iSsÞ©ôyG–Âlµwš—É{Ì´?:ÍS¾ÆŠtúÓ÷ 24yèÄŸ×ä7èI?]¢<ùÜX:*9{A‹r°+i&txü•(¤G¯Áî%ñªhl¦îE*5X²Ñ¹žðaÂõ_«ÎQšf4³lhÊGª$ù" =bOHËE°Ÿä!‚ŽhU€•Y`.çœàlZÔët!ûR ý'Ñ7Ï•#á ˜±»3µRÁ@wü‹Á g3hð3'r§ÝÆ@5ç ଚ‡¬%…’_-’3E$ãÁ.Zg˜Yê$ >Ÿ:¦a°Χû/عŒe£_•ẽ£¤ñÈäkVÝ@K¡NóÈÚÌ%tÕ2xÑH2ÕèCľG,QÃá§îš-"…ú…jTtaʆ¶$cÆöyXrÿ“JRPàöÐ@X²Ãçø›µbžÎç5ÓE$ Ùû†&Æb.碹­îO&†Uä¢ ­ ÷}›" ÂQoÊŽ>#:i9iš^1z2!e3z¢ä'kÜp8](î•ô%3‚B›íµ+¹å×#é—ºÑù’:ó[Ë+FºÓ*UËtQ‡Îysé>¨ò@/¸ðÃÍ‹  ë°ƒ¯1ÓF­†ZýšÌ>¹E£¹V„X†â2 Æ[a\a˜âœý|õN °"á굌ác©Ä9||õ¡Û„­áMÕZ&b¸WØ ™EO^Ø¢|¬ÓµMëö«¥ cn­i²áä_¦ Wè"Øš9Æ”÷ž¯/µ,#5ÐgåÈH¸¦a3†a½ú)V©àÙiÙˆáb8ÓsÙâ`·º–ÆÅî£Ò½g:ÉP)#0c%±#o]`¤:AJøÞ•Dtˆã1Á"ñBÍì;ëBr’©Û<tB°>†>;üÂ+|çÏ(öe¢ü¬ŒFBÝm5;R`ì+fÍäD]ïFÖ°±ì'ƒòTp•™>’ÊŸ­<$Íò¡\á8X0úÎú€*]'L`6«€œž¯ØAÞšË+¹Ý{H «øžÖ2,«<(rW¯Vͦöç)¹òF±E'Ñ0ˆ> zzθ ªÞ„p—¤“G]O-$³á„äÖâæÃ$cõBüGDÞ™<_Uró‘…^Rßqû–KÂoèfÊæ}£÷XO¦ Ì®á½( ^*²ÇÃ#Æí5–÷Äß:qàý'ï8I·ðhᔥ.Á{î}*ЮÓ!#âdS0¢û÷èûxK}†:ëO½~S6¿LL£÷é`k|L”$8 õOÖ„QÂ$7#.\Mhìd?b&S7ªÔuì0kk‡ºßcÞÙez­å•Ñ"ªˆ×¬8¼–è)'#ÓËÔáAÞ¹›ZiH{Z..­ù‚.P¤4“Yì#ˆžf{Ì6]O‘ŠÒx´?%©×n´E·×PÛ¬ø~¦ì„ý:/ÈÜ$'Ë'“,yÂäøŒ@¾„YUñHÀ|L [Ìš74Áýí aíÕ(«CÊ£VÛÔ#-@æÖ¬´: ŸíJ»ç˜íÃŽ«cjë2&ò~ˆTŸuCEÑ °ðñ‘Úî¶ +ú6m ŒQV Ü÷%\`l­ ³œø6²ý¼(/úQ¦¨ºž¹³wRo|dSZOÙô½BؼjoÇGA@¾#”jR¼¯h6¤ß'“”]ñ—íïêy¡œ¾¨´äÊí0ò‡:#Ù xó æ©áÔò.ýÍ;Þgèçº|-N §çº¥e*5ç>FwW©¥Æ$g]ƒæ½æ9N¦äñŒàê=¨=î†2"}çÔèÞ­±4$í… „r8Âp@/]¢HQrœbòZ¾ˆ§d$D£:’ç@üˆEÀÝŒÑ3ÄïÈäµÍã7—{+šî³t_Ám¶Š~KL™Ïê!â!´,->&¶g’B…%À«—(Áª4Ü2«å>9n†W•™ˆXq™8•ÉÍ©Ì J“7H”àVÆQ‹tïttŽã;·œ²º˜è4X·¶žîb%=¡¢lËu4äÕ;Â3мޏ8C©¤õ!⸂j+„&Ú"UÀ‰Š‹€äܶ¹Äƒ$“q{ŽŠ;&"´ÄËC q–qß±ñoÑBLÊN…ÌÙÛ‹¸ïÜûãÒ`3©V= %àƒJI´UZ‰o7Ú¾³è´—k°©¢™ä¡&xÕÓZiñYzÏ??ÛÓ‰7ElÞ|.ŠçxA†‹ˆA­Dý©ûÏ">°ì‡È‹”œ(ò+ªª:ë‹j&ˆYï¶gH¥‚Õ?jÅ ïÑîxø&ˆx8Zñ|JÑôqE>ÙuÉCiyß»AT#Ñá|Ô¯‹¢½A'dâi QLˆ’~ ZWûæ èsKP° I8M–‹¡Z~Þµd<üîô=‘šþ8ÞðzzæaxŽ}¶ÛFÃ-Ï…M ¥h!½a.c4Jiç¯?ŠxF`&åR¿ÊÐf“Ùì&±o/"ªžO~f@ÎZp„ú™Ö…êðÎû CY ‰ørsÏýlk—s"%h—ÃäæŸû¹­,çŒÅjê˜mmFŸî­ì¨Œ©"Š™ƒÔRòb‹i"&2^E=(ãdšz>ñ¼ˆ$ÅŽ")ãq±yf«T)Íw¹`¦Ê‚¥I ·î“¸ß¢áck«ÝCwŸ¤1Ò¸‘¬—Y¤ÕrLBýèI¦äÑ‹Öú¾¢­‘UAwÔð»sWxÛj\ÕÓW¦UÛôp‰3ðξlåÚèÔñаÖïyó\íRK±ì êÁ…GþŽ«´QÂ/2½!wvÆ„ b.¾ƒ.÷êÞƒúÏß{KEWƒÕ ª:æúdÎxÜíCDY‰¤Ù/ëqo"#àѽ*Øz‹òxK±¨«ZóËTŸîKz¼#^0ŠV9Æ“jеvâ5zigÚ÷MKkš‰ßzÝJÒ¡QÐCެјXk·t»äˆ–:9QògŒ·Ÿ ˜u´K¹UÏ wëÀzÑ(Ïú8¶hPÒŸ~Õ¾ŸPv²ÝBˆ·æp $Cÿàôá°f¯çdŠ!Þþ*ý~úI‡>´L xmÚàñj©á‡Ü±’4!‰ðæWäÅ=$ù´" ÂÑz¡ö·e0Á¾êFùs:jÓq/ÝÑTÕQ©R²‰ø_½ôç«ôíûŸþ ¿ÿ‚øõûcúVþÿ„ßAüúý‡¿1}+ÿÿéï¿ áâHq¸èÎûŸEø%ÿ¿#}/kkowkk/oO_/;kIgkk{ îE€vnÿÆëÿ…÷ÿâä/Ž'"&º#ÿ_ïÿûï'{)G;q;¤½½£#BLD%nk'—BIˆ!¤lQâ‹ þJÿ»ô¯Ûÿ¿üúß?³Q1qÄ·þ_LTâ—ýÿ=éGïÿE Û;"¿ÒG7œì¾ùWLLR@*..! ÿÜÀNØ!ö}k/{¯/­D‘bHQ¨8\J@LRâsCQa{{ûß5Dyxøzعì¼}VÒƒÙ ¯/Âö’¢¿`çéáãåéöuc1„€¨(ŠB ˆÂE?7t^þ»æö.î._·•…"$%D¥$¿"ÚQòwm}¿k+& &ô+)…£ÿ+ºÅ$~×ÖÅÃÏÁ :ðª%ÄEE H1€éŸ8ÿ=oïoy-ŽÛ![\Rêsk)a{qñßµöGùØ9Û{:}Ó»„‘ÞápñßÚ‹b“úÚUØÝ©˜˜¨)Èh$%òU§‡ú—/-n€”Ä‘¢@JÿkãøÿAú—ýÿ¿þúç?ñÿ¢"ˆïÆÿb;¯þåÿÿ†ôû÷? nBÜûŸ-«˜õ€/î/ïþˆ‡·û’gyyùÐÐÐ/^X[[sppàí¼íYõœâÞ·o{f»òémÏ9‡ý‡çî½?€­«yãîY`dÞé³–rÍG7Ûìû½tÿËû°Þ“ÞE±Š®Íªk(žå?¹î ^Ü&T´LVy»à]Ä©APuažh½¹q}[eèÔ¦¼ˆFÖn`øTC[• AÜ`ñkå˦ŸL|,¹8–9ÞËQÆ$Cñ©ìKÅ•¸Ì½¡2!5^W¢¹j•ÜÇ“$|‡¿æ´äªUØzs0víKàÛžÕ\&úî±—5WsB^¨I˜T_Ô«³`=/Y¹&~ÀmæCðêJÖÊpÑàõ7g¯6ZË_b¨®íC»Iœ·áÑysRºpbs>b^W¢äÅ…æUÁUé®w±}Ç,ǯ喊£±òBçŸ?~ü^uãÚåHòZÁÁŽ$ï½%+*wË´yOà'Ð ËåxtZõÉáQi2ʼ\â©©T¼½:í±}ß(ø¡~ä0‚Çɺ–êQÒ»ÜS¢©Iù.h·ë ‰Ø©¨¬ ¥™÷÷v©¡µ_¥Œ*¯¾¹Üohzål—‡×XìÓç¯'å°E¯Û9ÔÑWNI#¤ Î0h³—i><ìåVMeyO$¸K~X­”zoB:`!Oé‘É<àv{úY|ôjÆ€†¶&q)õøBft±c³¢gË-54¿R‰caä¸!W…Ì m’‰«Ø‡ymƒ22sŠc´FM^œ*¶^t,‹ä4ä*­õ/IÉ<¥WÖ?“Ç…Ø—oÀ•~Ö¿ È)Ëðﺈ¯È›h…5‰`,+»®™}nu (È{ÞÒÀV¥×ã 0>_?€©¹q¬®“ó°ñ JBgâæ'拳&µ5\XÛ ¡Ê|zv“§ÄìµBÃR‰ssÁjO8äždg„6×Éw\®;0¹ø-©,Û:"6W~ñ%‡“I6žþ¹äŒÑáÈ7 o·¼%[¥ x0¶çà§G›zíM{÷½5ù-Ýâê9]¦Ú~£Wl‹Vj sä})n÷˜Þ·—u¿¸:¦P³ ×$ï}ôEڭͱ¹á~ác,XyÇk,}ZÈôÊë™Áv–¾Õ$>ÂéMμ’»~ÖmBþ ËnŠDˆÞc6ÇgDY›ü,7É÷Íošæ6@ÝÚ8ÑG!Oð«fþH9øÆó¨c™Ô8Oö‡×oˆŠ͈°¥ODjDÓè”iáÙí%WÕÝ31B«±¥á¿¼U)Š'wµð‚É‹·˜ED΄[Â\Œ•¼¸.:éñsGJZ’:µ–çŽnŒµxŒ¦*ÒU…g¦nïIÔ o×5ö«`=rG¹zó$§z§júOt€ÐsC‰¥5ø]+Nr·µöÚ9Ÿbž±*¹¼W¯°ÄT¡C6@&´iÌŽw𘇹jÉ„C\xò|iö«áö°²ÀSDš°bÜÀþZØ€Ï Ë\Z‹kFoöú¥¸Ùa°SôÁ¹øCRž¦˜§ÜBÛû3•½šbn"öX ͤ)Ê"‡¨<ïºñ¨ŸfûØèÂÂàŒ£ãüÈõ5¬Œ‹#1‡ÎJN¦},öUŸÉŒ"pÛ[¿©UyÒ;".ùk‡NÈ6Ô=seF°Ö±“”Ó=+ñlþ]q§fGSéÔþÚâNÒ_4YÌó+íÅ3°Z{d;±S™DŸåvañxN%³‘Þ‹Ò²À’é#ûd ‹‹'ÕßÎ,Èç»^R.§o¸¢ƒ0M*å;^bîíŽå@ÏÄc-¬Ä˜ª:¬Fß ‡*Ùà/—ÅÞ¿-*Ýwm¸è9}æÛ鉼çô:®[>Ëóeµ±u‘Xx€i‡S•ÒB/Ë®øüÚëë—¯*œ4o(Vƒ_;[Ñæ‡f–®.,~ ³>9ŒõñATצºQõVÑ5Ü@?,}°Ÿ‚÷!cÚ\`àþsôâ(M‚ ÃÚƒ\Îj8k> ÑTPÇ¢‡u KL4.„Þ&ÖÜ3"[ÏqŽCp`$´E™5ÿÝ¬ß êXÉÕpóá.g Îè0ã…_•Ï ©}­I}ž3›þüHÎö•„V—ã Ú¦%&ŠÚÒ.xÜ„f]!Ç"΀†?dñëbù±ÔˆÝ;‡Ê4÷S@BX­%ÙR ï¸DìׯÐSÇ–¯! è7Šð“!x—øóèOôgÊ}¼TÌsí%@Ë ;±âj~ÁŒN«F‹#tWϯu’eâ‚~&Þ²3SÁÕüˆ‡>Ãú-tVÁƽ¢ˆœ7ıðÛúœÄ^¡ôílN¨ÎÞ.ADÁõ|Kß½½éʾ‡´×N‰ò ÅEéÇ^¥¯Ïh^µ¹pù¬WÀ\À™“éÒÎlˆ¹3à²@9ü„%º]íâ <Z1ˆV¿ÑK¶8iÞ³!Ê áùOÑpö®§?UFw¶ÖŸtpÔ[€–æÙv%Þ‘+<ÇìÓÌSn8|4pêR“ÏUr׎xiǃ‚˘3ŠÔÞÉðM?¸O¯·¸ïwÅ}Gêêf+;ýâÛõÏW=b­­+ÖKe}ú(DêÕ¨xx¨û¸JǵòÛùñ•dOïÒ–{a‚2^¨ÙÇ3óɨ)½väñ»^i­Z\Z–©¤]Þ[j{ð Q9 X+;•®_KûõážzÇ›ŽÉLæí§ár ÏÝ•pϼ„Çz®h´—ã¹ÒTVðµöZKµ1£Ì΂\ØÌè>ä#=QƒB2¾·b(œS¨Ñ*›iÞn…ômœ¯ï-tïºU¢ûèô庵´ã£c/%¯Ÿr—‘ˆ½2\ítbZïãã`KÎI—.–¥êÑ;¶—¿´£xþ‰“õí#/*7Vç‚踛"*‰ìUP cW/¥jZS&ø¢Âzn>8E /úvj@CjksÚl@MŠ.ö¶§o¼Ò›×‚ M BÇ6¬œ<3×Êf_êypŽP–ª‘„xæ?aryÝþ:Ž’YßÛÔç½ÏM)Ô{<¸»«›D01º3£?Û ï\¶’Ù¾qê€zNó›z¹áJŽÀ±ŽÖÚz냒òâ™{O¯¹DY98ÊÕ倎ì3Ø8Wbv¢h-m*­s&ól±‚ûr€#Ï~úpŽ\FÐA£‡å”ž ó÷ù¯ÍêÍÀÔPãæ†wÖñÕ–­¤37Ân Ÿžïi³a×zBn^~ã\§ÅÕ–¥*ÌÆý4&:º–­!ù­VªÔÒbæ®èí ØÝ»š‹©ÄFFãÏKõt^›>P;µšâIú^ìŽÖx]åe¬DÊÖ>åªSƒÃCô‡Xš‚‹Z³Ç ã’—îñ]÷SV¹Ã,j˜éá­¦K£º†[÷43ÍäËö¯*~@·1Äìaf:’w ‹»Tõ‚ÆŠT(Z8ótœî m ùc3gë7·ûCe,üuB«ú­/¿h‘š.à1êN§G?UÈYÑŒdf­µ¾Ÿ€"!“a­˜ mƒUr.òÕ®„k¡‹|UçŒ4çô…¨§|-Ðû®‚¶¨M·²ß¬áëYäòëhæ+4;—–ÏãѤ£­Ã„~] Ë?ýx6M öJyñêú«\¡$ùá죪Ž^#Yk+ Ý>¶ì×öàVPÈá$³þ¥SìV¦ËoL­oÄ6¹»2t{‹ŒdûʉZò½uçe“ÎøÖñ§ßø1>;¤78$û‚ýèß 1Ù𹞠ÒB¿ /1ôñG7çÀ&u[O^4½Â®~x;È wwõ¤²$ârù 5¶&ü¢±ÏZJxÙׯŽ~òh²gk¾ñãܲF?» b];%V$dÛ%þ°´‘9<|ûÅà{ª¾¦ã5ç‹ê¢Öªo¹v”‰ÚÞ"_ÆòôpvÛ h&lÈß<Œ®xíõÁôch®0ˆ<5ðÌZîŠʵ7~àýka½sE<®¸N‚HëžG_²>x3=WrHÙÚº¨ ˜#oF¬¹^NbªÍ³>®a°W¢·¨¨&.sH€ véDûZöÀË·%3>¾7ãïvÖbŒÏ_«ÍcWb’t0ï©èÚ­îaC}eÄ ¦ïô²Â2ðˆV¥‘ô¼²…i¾r;V§Ôl°Üù0WíÝ« õÒ‡½ØK-ýækT½S£¥ÛrrÖ†]ëFª…•eSþQGž’1½ï:Orja¤{ûôSÿ…LÙʼn»é&Ÿ"êÎ-ËD$t¹kuðq²Ù¹J•ð^5>6Y¥ß™öat— Mà®ÝånW ”ijQPv@KµÁýâ“U.¤¹ºrP¯¡ÿñc]NÇɰå-”«„wîÚDZÙzgüedl.f˜"+NI*µ±5›²}¢'m»zKSf[Þ—º$þ”I7Ó£øC†Á¼¤7.ÞDXFî=—اpÞÎyºY65kõät™"=ù¥™Š¢ó9¡Drpû’Ú—gîè^}vÎN1¾Óq´¯×&¾BQ™Í¦;h£þáÛ1%Y–ë“¢IÚN¹]vüMÑ%=GÚÊãšø_Éî§·÷õ¨»p1L,‹œØÎ—ÿ˜‰5Dʾâ4/¾,ŸÜt»T»01çi@÷KF¦-MÕ [ŽG˜×i *=ؘJñ`qÒææ¸>fÏTŹb¢•úð©G×aj1sÃêð‰Ð Ý1jCéÛg¤„UïçÊi=v¿³f=ÍuãFmèu‹*‘yüý†·'kYžu ‚jzNù™§co©LÜFöh¤[Uq5‡\Ó /ºx¼*·W¿+dâð;Ò³æõ §&¨ŒGôEïYÊc—àm[ O-\ñoÞ¢£ºu»÷Í› Ošb¬_„­|˜n‘“}\²G½„~2R=„1E÷ p©àT«ïù OO›Aù‰”â¦GlɆv —ùJî’yæ:‚oR]åàv8!·Îr¯¶LdRè•W8}à&¦oxõõ£ó¡±s+ÂW±¬ÇÄ…N…ާ4ã¥àmM¿ä¼@ÉzÁÝh{‡¼£?“ -wq^·b! þU¦ŽwÝ]¿îäÖÐ4SV¼ºº‚7g‚¥1>høv5¨ÒÿQ% ­~dâ›)û ŠÁ-úç̇.×ÌM½¦#Q¸}—cN@†°Öè|dOÃYC;»ü7O‚OÈòÜí¢Eôi+£ušÑºŒ9ñüĹã½*îÇùN°ß}Áa r î?RHŒß²?ÚbZ6ã*A‰ÖÅ= ´2Ë éfQö®ÑbÊ‚¡ËUÇý#2ý„W®»ã×ÜKÍÜ_sD-!”ÅàšzÉ9rD£Dq?ÉRz¶Qªk¸¬ 7ÜÛ}úÿ±ëµùf2!RiüÌ!£ÀCšà1}pîXò)®kõeîXþƒH!6C1r$2‚¤hé¡´YhíªÇ!i¢r‰‰'Hp¿nÊpÑó+ǹ¼Üéä|ÊÎO©o^Åšûxª4Q¸·–ð¸‚ʇY²k°F7RÔܧRðÑäŠÑ,'O¤Þ.-Ãp% :_nÒwíLà>‘IÃS»X‘³ùˆ-áêR¤ÆbuûäÀ\añ»„¢=O5fÎ3­œËô!>ë—PZv[Ê*™ºá®´]¬¶¯9ú¸6³ÅBÙÓ›SëBbÄäáÌ¥¬––Ÿv%fÇ(%œ‹X&“C¹*`™„«ÌÝ ö1øgˆ ÚÏ)FzÖ/oR*V.âI»'—ÂñÞÆ6ßû"ˆKæE<‡·µ ëRÌ®hKß•·àR"Àw„¿ôS(“dmé=ÅÆäCÄ7ŽaöŠÙ só+V}Ê9åäÒ *Ìên]5(ìñ¯¤{dÒûHaİï U‡…•ðK¬^‚ õõ<žÛn+%t*-m¤³Pê5醨«ƒªr6IÌ…1L[¹—¥óxÝjCe¢õ%ÃÙ¸ÇG`SÛ/‡û…-1¼5ŠnuÍ*îÝ*Z02vúè)ý8¹…W·k¶-¡buЧêËlÑùÊ£¡Ë4£°RzÊñ”yÅgT’\{ßéP´‰#Sœ,Õ²h,6Œ‹ˆÝÛ§È9Ïæ6ç>Yãä¶qÊíõÈä=‰ú-k»ýÕ‘*CïIl›û©<Úf©©¥íÑŽ; ñ÷S‰© è:Nbç,tù‘úòÊÌ͈®¹àu$âÅœ¨EÕ~´Æ]ÅÊ+=–Å\ª Ç2“EÕ¾ü2o^ ú ]{š95ib &ž91i‚¿6ùTÒ„@À},Ù0õž¬m¬žÁ”#x¶0F”)Ò¾ŽDÆ.?ž™YÐx—™éÁ ê§/Ρ|)`mgPL÷·Ì«/ŸÏôé5-Ñ)u‘ tåd;P6ÍNí•éávÖ}ÚÔ Õm¬í)G©ZŒ+ƒŸç?`UðA–Ô^1÷U×FæøöT(£ÍkŽÐpð+j@&÷T¢¥kú©9øUµ÷#C=`ocPBìlQ'©¯¶6Ò®§Â½Yͯ›/si«³À^»ØyÖ³¦rSA»w/l›’B$KZUkÄY˜«×ýòâÝøJaì»t–Š=“VÎÜOuBK]˜ï×XV&ª]‹Ë¤ΙeEݼ÷aTv Og™ ÓN€Ô.rÔÅ–¸¾)n8T™“uNÿÀ‘zÁýo¯–¯Ê¸¾.¾XgrXj=¦¾†ð}ôЃ,?|~y´<ßÐPÜyûüVëë­dá‰Û2ò싦îqm¢ß¾ xõlèÙëžœq.Eí ±% Öñ'Åó“ÇE·?,]ðÞ|ÙoêÙy´aãâ£÷º üá{±E BÖm0‹™zpÖm¢9Jökû<¶JÔêè^*æ“Äò"‹ Þ\ðö‡ã[c:À^ÛÑ+øDÐJކ|„aÓ?cQŸÝ ûþÄÝý.åÆÔÝõªâ@¦ž}w'Ú |ÞPòŽ”$Å&bæÞöÀ,ë›ÁfØRŸSo€áTëkZÊ~™¦'B w0ûïvm={½Ž½öBý°ï±›ó¥G£¬Ž ©çñ 7°'§ V'fÕß¶ oÍhêôéI¡ÑàóÝ%¯¼…ÕúHÉ!^цžÑ„5*Ê/+”Ð#à@µˆ=Øx’™0bOW®Úâñ; ƒ×ÆÌeeÎëØ›˜§Š·ï_,<“Ø¥Wæ;^À70¤BXXùsZ¢ënNih«ÞÇ ø>MÉ<•\vd¦ ; Gº¡ý˜’)ì%}ì~UK²h¡hÝ5»¶Ç¦<ÇüÝŒ<Ç 5 X£( á믮҉)uHÛ‰+ Ž8¯Õ]‘Œ/Ù“‘OÏdÑ ñò šàs™ñ颺ÖôÕóZ ñŧ¸ï±UJóÑþO€;¯^çàÖY cã€E3ÏUid©dkC™¢¥_­vwѹdÇóVM‚ àó›Þ±ô˜0=i\Ýp…¦©°ó\ †íØKÕ"¦ë‚Éwfú‰ Þ¨vð÷ —³ +ì–©j+lüÈ £…øk¤‘ï1Ü*éf=z˜jŸõÔô“Lõ¢MZæMrôX±e…„‰^ÃFkT–Ú¹©ßÌõ¾0”bžriÆ–UáƒkЍU E ITôì,¸íK±| Qy”ÛTÌ ÂtDõx劇‰¯zU»…ì³hÏgVÞE7bˆÃV´™ïÆhwèØ±ð³2s„Nét²S.q¼¸Ãa€û í¿qȱËŒBGd†ÜuÄ}pR¨ÑÏo”R£}žÍ œ?ÏÌ/¶ËŸ*ò‹Ìœ¿,eðFÑ7ñÛŠ ¯V¥­¨ÕÙ­2;tVªWûŒ–Ë;=ºŒ"†r°ÌÕ+s{¬,M, G éš¹eˆE+%£`F&«ïf¶-òüÖ^W¬1×T­ä!d¢hжX¹¬pyá1CH§àç6áN¼/SîƒÍx²–®ltT«ÃÕvtz^Ï|éõ§Ê®Ør¥ä|*;‡®ËÃ2¢è¬<ëGŸr¢1Ϻ¨Q<÷ŠÁÁhP©<›-Ý›ˆ5ÂR×fB^„Lê-Ù¸Q\½y§üEÅ€F«¡ùwo8•±w™À…jèCßn†ÒVPÙ?øø·>ü:ªð+ýÒ·û?àÿœýÿâ¿öÿé[ù#þ9ò‡ÿ’ÿß‘¾•?òŸ#Ä/ùÿé[ùKüsäü%ÿ¿#}+ÉŽüÿú[Ò·ò—úÇÈ_ì×ùß¿%}#{‘Œüÿþ{Ò÷ò·sCy{ë8øº¸ûºáNਹ¸9îœ+Ù9£ñïôñ'ûÿ"H±ýÿq8Ð1Q1qÑ_ûÿÿŽ$SÑU6:¢§ Õ0ÒÖ‚ê+ii*C9……MÅ•……UŒTv àB"¢P#/”‡·‹‹§ÊMXXU‡SŽL§r2Î({9wÔÙÇ#èpÌ×ÅO–SÙÓÃÇÁÃGÐ(ãÀ µÛ½“åôqðÙѺƒvÎ(/oYoOAII„” (¦‹›ƒ …ÐßÔPúc¥„*ãj°s‚ÍÃÎAFx·1™Œ›‹‡+ÔÙËÁQ–SHHø³÷ trð²óöæ„z9¸Érzûº9x;;8øpB}?a†«Þ%ÊÖÓ>¸ƒ BÕ<¼P>öPÛ@¨Ê.8¨¨\êØ»øAw H–󘋇½C§œ 껜oPrG¹x옧œ6pÉãaë9¨‡rÈ@ÉAƒ¡?oíì`ãeçø Ä+vah|.úK€Pž>8º~HËÅÛç/ÁÀ!óþÔ'žµ¹¯‡N±¼‚¶ƒ»-`{ Œ“›§-Êí÷xü+00ÿ?C0ppÃñå‹`v@È’Æé¾¨Ü_ÕJ êŽ á”Ðå$ý·çÄéÓ·õ]<œ¼\|~ÐÄÀ~·¾ž—§Ÿ‹½ƒ7ÔÛÓÝúC¡Ž>ÀÌ\<œ >ÎÐÝS‚À×N9ÔÓq7w$.'J!(” `Ó._¸¬íËvqÌBÛÓËAHHÇ2 ðoçiï Ç…;ækïåqó9ø…»nßrÖ^RØaû‡ÇwOœ}â=®®ÖN%ïO!×1ЉðNÇ;8hî²0jï‚ròB¹ïýcÞJMdì?äà%'ãâîõö²û AÜÁLñŸAÜ)¸Þ¬­~0θópœP[O/{/YNN('ÜQ€gööÂöŽâ ¨Í E¹nñk:v€îCø¦d2@=¨ÊpRÿ d !ÊËõ­€öHÔ©”i—ýPogÎ#âNoâ\7@! Q1ÜqV1Ü1Xq ä'¼܉ãΡàvbìãâöÓ^ÄpGm%D%á_õ¸Ëû$;G œj4㔳ÔˆäN¸øâ‰ùÎ-à¸iíæøëÏ>n÷§NV2Â8P_x­ì鿆Dºk ÿG‚ ÛÛ:ü\£ì€þþ\Ä…í¥þPè»0¾èÒ·4üT›þ*à_ªô¯«’Ìw”HÚðìÚe¸ ûn¤ú?qåæý\²|P¶n_+Šƒ›eoxùßî½1(»O÷¸Q€Ž0 Þýðú- `®ªÇñ2¶@ž³˜œž¯­›‹t7pBÕ>G ’‰ýÄ®ÇpÔôqp×rpdàáé0 ÀÝÅ €íåâä dú}ºÅ1ö«ÑàôœqqoW'Q"8eE}wðG1SZúbéŽP@¦@W¼ê†vÀˆ Šß{÷‚o'~’íFù]â~G’Á·èÛzúøxºMÁï‚Ý_›PqáhýqùÎhåØ~Åþßñˆÿv;Ü—ûjpviüœ‡·—¯ЩtGîÿu¹Šþ;r=ñsÁŠþ&ØOrôsñòñE¹ýÄ øïÊó?&>‡ÿ’ô>ñúfØ Û‹#ÏŒß\¾Üw¹;¤óÿ$x5Œ—§ƒ··µ§«ƒÇ®þ„:»PçðÍøôGE»tz9xÿǤ¬‡› £o`h¿3PßqªêêXéVÕ±ÖPÔQÑR5ø4&þª–ŠµŠª‘¢¦Ökƒü/c|›vló;UÞ 5¸ÙÎN8Û5ä/‚&@LPÙɦƀZÚy¹`pÑb'Xý‡ç%»ÓçÝ(õ]x&åv¾î@èE}éþ}‘ؿ㋾Q¤ÏHì7ô#ØÕ‡Ý)õÝÐý›¨p·ßÅo±Äo@V8y@¡¸‹¯TÅÀÓŸs7W° ûçc¯† Ÿ~üóíW]üæ4þÀÉÿ‡Üà ¯¿e:ô+$qjúÇHƒ-ïW¦ö¥óÿâ(þN8eý––OXÊAeÜå¼p$€ï+»ðý ¼‘Ûõ,P‹OQÂê“/ù¶ñ®ïøíz׃|Ü÷Îå‹âþ¦¨ˆßj¿Uܯíásg»”|ÓÕ§ò¿ñßõ¦;]¨8`€ÙpFþÎ.vΟÝîù"ÔÅ{Çã^ÒÛÁÏÁ ˆ±ÎnÀéø8{Ú{N`0Ôw°‚3Œ§ 01Zý H¨zØÓ  Ï§¶êŸšhªkY+hùLå'oû§ìÚqaönÀœÁ0Õ±þmqa PT`Êã--#l‹{B†+Úõç*¿‰Yìwbþ,´Ý ù­-~ޔ߿~eßFT9=+€ˆGßç—}’ͧÇVÞ_ÅŸ¯BßWª ÐãöCº ||½<¾#ú«N€éà\ˆJ^@t°ÝGWî7\ÀòþÙhë/L²¹P⿟F|ò¬B?3< ÄÛ8wB³3 @;}BýQÞP§ßž};zyºï0ÌÑÓÍÍÓ¾wþJËøºí˜L¾R9G/”®* t/‡ä~Þºã¶ãtwW}v.w6ú)ù­LL*ƒÛúøÓV O/N9.G€}ŽPkkUSkCMmk5M-UkMU#]ƒ#ÖÖÖ2¸örßõð¥w1ÑŸõð©õÏppñpø7pû‚ƒØ_Àá»Öâ_Z‹ÿœG_Œprs±rÞ=½ð# ð/@áß ñ¥ ñm‡®þž^öœr€órðòøúÛ:Þ>^.@÷>¸=œrœÊœŸ«ÿ®ä—~‰0NC”ÆEÈ™óÇ4I|' ù®PòK¡ä÷K})“ú7´·Mâd/þEÃŪáAÿ~cï‚Û'ñû}B?ÿ´ïÖ¢½ì?-tÿ˜«â_ Hü§Äåàaïâøc_ @ü_7ñ/ þ'ð½x~*™/& ÿ[$#øåßý”Ù÷2ù3q|1NqÄ¿+Ž/†'þSÃûqë/f&.ñ/ŠCÕPר@YõeòÅJÅ%ÿ.™ ìüKdß æ·v?‘ÎO"þsOòÇÒñð¿â1¾kýÅ\á?7×ßIçÏü‹ÃÿŠÿßÅ#ü}íÌ~0‚ù,Ÿo†D$ ø_ÿ¹/ù‰€¾8ø_qßµþbÀðŸðO¤¢h¤øÇRúbÞð¿bÞÿw)‰Û‹ÚþPJÖö(ÔOdµSþS}ñ6ðŸ{›Ÿì‹Wÿ¯òmkÄ'qÿYÐûÁæ\Ü´@ó‹^îð`äÎôàÇC«ÝmpŸeóêôËw‘þT0;ç²~åý —¿r6ïö ~?0D|1bg?á±órñ¦LŸÐ“þƽAHà`ì #ÛÀÁÎèóþa~@Hìå`wð;_ô!‰«ù]ñgú#4q“}N9[OO·Ïlü¼Á×'NûyÎX[àOô÷Œý™€¿.?Дï;Ò_‚ RäßÃwtòOpÇùǟ஀øþ¸òÏ4 ~O×P‡ý÷hptqp³ÿ"@úÁù‚ßTÃÁø;>“áø{2¾U¤Øïµ ù%b!Åb _›êw¶€ü°ðÿ¯òÃÓ„ßèÞÎ~OüSGþÄÔ?íÿÿKžè_ÀÿGÇç¾%àwø~‰­Hä ßçüÊŠ?:°Æû§ÿ_O¬}ÏÖ/Þ)ñ½|ñÂHIhÈ÷-¿8a¤Ôw-%¾89‰Ÿ?]Ú;@4²ótß}¦%Ìÿ“ç>ü¿ „ПÛý‡wt#¥á¿vtÿJÿïM߬ÿ9üƒÞÿökÿ÷ß’¾—ÿ— #nµÎËÓÍÚårótúîgàÝíÿºt~¾þ»óLeGþâQ$nýW\ ·ÿû×úï?9 RŽp¸8JÒÎÞÖ^\Ü!%!‚´$!·³ÿ_ã÷+ýwÓ¿mÿ(Ì_îãÏì_Lôwö/.òëýK²EyãNÅâÞSçE†{u”Û)l—ø™&|>A —€ÂÅÅÄáŸ[ssIÑß­u}†ñU[¸”B DüƒþÒ¿kÿÀtä/÷ñ'ö/&GþÎþÅE~Ùÿß‘Nêé¨S1ãìBSCÅÿ:pmI¸øäО¾`zZFª>~dbÂܾ}ûÂ… òòò¡¡¡/^¼°¶¶æààª|üøqèºÄp…ïc cˆ§0Ñ爇Gä­©¢h=—©è?Ž„Ü[;€¶;løø˜õõ$Œ–µÆ¸]¦}äå}ÕÏ%BÖ52W+mÈŸ—¥÷õm¦å¤ÄkÎj¢l]‘_P}l–º}¼0%RÌÓìØÊBVˆ¼b"ÿ¥ñ¾¡üò¨GŠ)Y×§ØÇ¼n+“žO:T¿`°û•Ù<\ˆ&~÷&Ä!jY¼ÑZÅ{ Óï¥â­‡ ²k=WuŒY«4w÷R‰Ýò¶ëfNjž<‘ØI½Pñ ‚ÐÒ®xLÁ™€ŒÍì#~_È2{só ÔGL¦Ò‡Ù\«Àº{v"«¥ìZ·ÊbS–,Øìúg†´š½>”çmß“OÊëSïá›÷ÞxM º!)èM!Ï|u¨$ ulíí’YbD¬p[5;œk÷)½©®q-'µÙ»š–­}.-À~ÌŠôx}j€÷üéíUŸLÓíÞ‚G­¢ŽŠÞ|0ùW·µ¸RA^™#3¹˜2,ÿÒÁýå¦lOˆ8ãæÿçÆ›³oíÛù™{’¼ýœ‹í†ôдž3ï\qþ›ÙwÌ\ÜèØì½ºD香…¿ÿÑóÇ{ÃKnùM‹3Úµ©ÿ:±w›¥M”3ºú´‰]ýæÀ»»7tœóíÞÍ› w˜0â»Å+,[¶§qŸ>™[~ß”¦;q» ÿÑÓaÿú²‰Á{Û‚ä~»6ohß«i×YHÚíÆÿJ¸-Âû¦õï^÷Þ˜—÷/»ºô‡YÛƒâÚ/x7ûCSÑ»§œÝd.ú|pÊëž vùï™:/ëÜ´¾SGt,’¦FœIÑøÈý?Ö lõMÓŸŒYm|RôÇCvÍ9a½lot©n²î;¯NW ê׉˜¦ß·ÆtpÇü'{ørRqöí™1M“>ƒñÛ…OZÆ gŸn¸Ó«Z÷ʳ·±û½ÿ/¼ÿÍ ±ñçÑûÿÂûßœ½ÿ/¼ÿà ±ñçÑûÿÂûßœ åþR ¹€?'ÄÖÅÞÿç„ØúÏüýðç„ØúÏ£øBüNˆ­ÿ*àÏè¿€?'ÄÖþÄâpClýÇx€?­ÿþþœ[ÿyÿGØÿÇ ±ñçQþgaþŸbÛœø3ö_ÐNˆðôŸbáŸÀ£ýÿþœ­ÿ 뿜­ÿ 뿜­ÿ 뜭ÿ ë?œ ÿx>¬ÿË„ù‰­ÿŒŒ v”\¢®š)b¦~ÔÑI)ÉA.#±ª›Ëê87˜vÜ–3š®[ ;ù¼ØÒJ;IàùGb1$FÏuY)£ŽŒVÃzù^`¤y(‘X¯Q5G@¯Ä)/OibÜ<Îx5FWþ‚3ve]-¦4[Ûq=fVJ1kV&иs*‚œ¸ÊH`Ýzάͬ-wm=æU y…SÖÏ7Ÿ•»S~ÎýÖüƒ%_1«ø9pžªàEV—mûù5®¦ÖjÛÓðsÚ*«$  jI‡ÿo•O%Ö€˜c¶i+B;7̉׌F•@¿Ž9¢À§‘¯%&$à­Ðþ-ÿ…Y¹fÇŒÀªí©×èhÔá|:øÕ™uxÇ*°IGÛ¹=Ï-£•+/¦Äàd8J¢ìy€³Áè/ÏC×W9§rŠSWÓîfS}áS<Ù%È L™>)Vk ˆ!._;L Å¡„.eG¡ª7+/üò<©Rý­^Á¸úõX·ACHvêóÖçebG¦-Îzeð—Ú¬!³vâ)‚û™0 ø˜f„Ú;â‰ê´jCBhÕr 8mÖ£:]¨m£”Ñ€Œÿ›D,GDÒ I`HŠˆýD~Ô®ÖN.$~:½ÓÆpM³ ·Œùú&%%ùXöo µ/µm‡áÒ=X«W#fBå¸ÑËdP{"¨Ž ñdŽÀ_àq~Z ÓážH<ðp"ÄŒ4¨­Aô^®`_š pˆfÊ‚ÙFíM ýŸÈIÍÞÿY§ïÁý¿"9³ÿW.ìÿæ„ñ·åÿƧ‚Á£RY>õ·«&0ïÿ$µÇîÿ‹áþoaÿoí“L ôWa’±H†K$˜T*ö—IâÅ"—ú×õó T»ô,úšªwÊô_ä/fÛ±X"“ úÏÅ£fNNà„;«HäULÜì»–€Q[A+ |1XgoD" ð–H-—øùb2‰‹Æ£2™˜ ý½eˆÄ_ä ûŸð®øOÏ ÿÀã®Þ=*ѱT,vìÿ%r± ÿ\лQ£†5wï µ±yäððh7·³À÷‰/4ÓÚ´ >^zCQZVÖ©“©ÌÍ-333---,,,%%%//O©Tzxx€Reeekÿ¾5 £GŸ úõr‚›Û #Ã+¦mü}ÃHsÁÐV úšÎøiã™—Þ¾:~ì aŸÞ“ý}ª`gþÑžÈ-=ÏÆ}\ÜjxŸa{ùeë5¿ÉÉWÄ?ß~=æILBq“ö’ó“>ñ³ÞÉY>s·fë£{ÇÚäÍ}Ýc]TÕ©e¬8ëá1´ø`Fʬ’¶JÞ3gôŠÜÓƒnxÎ.šÛ¢Û°­í¾X´òáyñ4ôêŒLS€G»=;î8Òçâßò¸Ì~ƒìùê»CŸ\žµ{|‡¢~mþ³â¶{ñ‘‡3z )ì÷ý‡ÇH ÎͦÄ?n—ØVqÝwØþùØÍÝȵI½Kמo^ñ¤÷7ï7I“óå€î?ÝÑ\:²tQÐ;ÆÅ’_·>ÎU{)ËvÿåðÜ59YÞ´å§”Áçu«¸¬áÙ³í·î‹-adĨðŒ×&§Ö-® bõÿâ¿ñ?8!6þ<Šÿ"Äÿà„Øøó(þ‹0ÿË ±ñçQü!þ'ÄÆŸGñ…ø/œÅòÿpBìü¿<òÿÿbãÏ#ÿ_ðÿ8!6þ<òÿÿbãÏ#ÿ_ðÿ8!6þ<òÿÿbãÏ#ÿ_ÈÿÇ ±óðÈÿü?Nˆ?üÁÿã„ØøóÈÿü?Nˆ?üÁÿã„ØøóÈÿü?Nˆ?_ü <$àÏÙð¯ì!U x^7 øsAöøc~~<ѱ\,øœðôŸbã/æþ‚ÿÇ 9â_.Ð@ n0 …†ÀÍ£{–@`×ïÿÈÀw‘5ÿ\,¥Þÿ•ø ïÿpAÏOþŸ %2¶Z$šzÑ$ ù„ü@u“¨Ò¦ ÊSí¶DUYž¢‚Jôˆý¤`_X•MCŒ: ¤ŽBKQ#ðc¾˜Ü¥$ìdªw®{Ô†U ]‘ x6KB_­ÚëîÁ|H$$•¢ÆJ]éú““ ¦J³&HƒÆœŠ‚e¨ ×éL(«Y›M¨Šù ½Â12sH 5PŽÇ4âШÄxVeÉ7ÔÒÓþ@ì´ k ²H׿' Æ$ 1Kx+*—'2•ù ¥kçh#¢=ÝlP&ö»¡PaÏTa·Dá*GÄà¦l¦ú$wº µ„'s`2šÍP¼‘$zÏŠb£UcÈR.аC!Ê)è[I6•“8l8«svŠªÚ.j5…s9 1ܬ¢`u!$X€03I$ªÀM|ªÕzÕfUÞ€B_3?éúèLNj‚¡$j ‚ £WÀd;¸¡#YÀd;¸Ë³¨5Oqy³;ëÀƒYaóªÌ¬@˸ÚŒ}ŒªŽ9Ã¥Õ¹RÔK`kJч&êtÓ‘·ú Z£CYÓŠF ·tj@ŒñoÁ0Ç*Øéé =À@¼v'i åI-KVid0~ð`…8»ïk¯N>Þyu¤÷Ϊ ƒòæ©è NG…\®ØIu. Öþ]B»}d×ΔV­žÖþ)¹U«§”OÍœt˜: Paâñq¨ BYWV[QÇÿÛ£Jà¤v;ej«vÈ•ª”s\½Z›ê*jj+Z[#Îûï°Œ+}w¥ê:£F§…ÞÃãPY¢NKB}Ù_ë¸RÜÉ„BåuhÌ•â”Æ°Ud ªJÖ©Q¸ò%A¯M~²ÍH9—ïhCâílaîhÿ+ªÿþ×l5ï‚E–]p³ÿ“Ûa3þhßÛ#‹ûXòÎUoq×?¼Ç{G1H²×I¬–׿~R˜­~ćà¿õ_mCqmûNò|žwïõ9BÁ÷äI h2Øåk•ð# XÔøE Ó³'MNyãçgΗ=5€€Å$”R (‘ ðc”(Á¿x)–o6øøÄC×ø ǰ]ÏQ vy6Ø5ã ·ç’}1ÌF\òSê<$[|¥Á¦d­ÚÄ\Ì õ¤ì¶uo×41œ4iMhr*] ×ù(ÕvуiS Ná> ü€õÀÏž–’¹UÉ ê­dáÑ¿Y¿ ìúÉDjm=^<} =GœëSÌKªNZTéSñ!qƒMY‰y¹°Vå:é%§~6M™*ü-¤v,…á˜ÔÃËß§%H…n¤âz Rªo‚Y¨ŠÉ›–úù)¼xâÖ|<î\äR‘J»øuH³z­ó!¡™¾•±áÀzc[vOãFÝáš‹V4E{´˜XVfIm©F¥1¨”(®‘pµ¿t¼xŽêá¾ õFB´º4ÜQ‚Ø9!f{4˜0)¨ñT% rì!Ü:“6Uö`ì–Æ2)Zͤš‰Áá'¯`ØHj’Jïñ]âìV«ƒÖý'ÛëSÆ~°£C+å WØ;ƒM¿Ü±+B¡°Fàt¡î"Ì ÝðĪ\ìVU.yUNø&™õ¸Äžwà9õ?¬® Œ V Э«mèâ†FZz·<Ï·f²q¹|ŠÊÉüµE9çAϧz"¸¢ ˆÐVöMk-`A]%õÔ”A}D´o½Et¬=íKñ’dµKè£]P×NV\?KqûTÅu\tvDc€²K©Õ` ~ˆŸ²°«Ms0Vƒå÷(ã={¸ú]?Ë™z?Œ†¸”ð|Av†é \Ú€­ÎÈž‰ÖHÒK!¯(­í1Ï}#<¥Ã¦’*7 ‰–ˆh˜AãJ-Ôïpÿ†…ó HQcÑØœ™ÓÝ5ª–æØE§Í)tºÚZEð``Ø“ô¦Ð70\†ÜdžÅÌíùÄÁìEþàµ!VJD“¸þëôO„p~|_?áq¸st#"Ÿf’2–+0Ojjª·9ÈVŸèƒÅ63¢©Mè#SA,šÑÇôÄÃlÞJV)•P[I=ìxàƒ< ÙÇ+ ð'mú¬²àÈñ?ùŒ‰ÿÊgã¿Ódú ˜C.K:€L!sèÏæÿ¥Èô1‡þlþ7Z€L1sèÏæ£Èô—0‡þlþZ€L_æÐŸÍÿA èÏePþ–þ´™þ ÊÿÃæ¡ÈôgNþÖþCéÏ ûkÿ¡ÈôgýµÿÐdú3ÈþÇÚh2ýdÿcí?´™þ ²ÿ±öZ€L&ØÿD8ýÙý-@¦?ì8ýìþ ÑŸ÷LíBžÐ,ü ý¹ìúŸ Òßæ†LŸ¬Ñ¤h*ø“”OÍÅ6 çÿåò„Bž%ÿ¯P Þóø"®˜ÍÿKƒUˆ|Øo<Ë¥ãÞÂô©rû½µ_Òq<¤0¯Îˆ»f›}⟬ZÛÁ›²‡õ›nœëôZ#ª£&Ý9·8Ô?¥Asá õÔ.=¯C ¡Ì°ƒ*µ5¡ mP—ÇíJͶ‡¯èyæ£MžQ;SÒ3<ÇÒÓ„¨®`ÉRh†y`%&®­'*Ü3Qè˜öÆnf\O—Æê®ÉAËh¹NF[?R?WÃzHðñïe`¡«2b+3<^Aö{ Ü˜dºb©¾xHBÇŒzS–(ÏÄ•ƈÀ0ßjTã…$•?à£9ãë`ðZ‡ô_ÁîóÕxðàyÂB–GV󀘎óÆ?»…‘“XUtáŠKI1lo-ùÂaÈ%ij3æ%%Âôé`À5©BÍ?Í„•¥ùî¸Û/Bó8ìEè§dû?üE¬ÿ@¥?®Bd2|±B‰¼PÇ6œŸÿðx|×rþÃÀóGÄžÿÐÏÏù9Æ—8[z'!±øZ*&öTˆ=¢óTÈ.Cbg@–¥ˆ‰û„>J DZh55®…y'6w°@Ox Ô냳%è剰(`7µóÔœ£WI]|Ñ‚ý‰4%½ã -ïxB$Æì5×*6mÙ´ziU@\"“E… •ÅF Å…ý'NÖgpß¾a1²~2X ¥”êEDõ"gÕ›¾vÖкJƒÖµb¢b:@ùZB|-¡bΗxç[7ÌEF‡;ì0Ÿc©–ÏyBŒáG€(âA°?Ü©Pö"%Çz Ö&Üiæv5Ìnûåa¿×‹ñ¹N‘j”ªûuðˆ:xu&ŸO|Í'=MKËw)˜¨^cúœ\7YªU € Û#ÄÁÙ|1åÀœ˜¤º‹¸¶û@Â.eb¬>LŽÚÇ*ÌÌŽîhÑþK¬ jì „–0”2"c°œš†áG©‚Àµ@ C§Ù©.'<¤*ÑÂ_OŽŠ.ñ@ôQiäú´8m°A¡RaÛ|'íÕ•¹=qUãå¤x XØ%j,Ãvm`j&ˆtÀ X²¼ ?‰„0HhE"N}Êêà €EBí|iÅ"ÏòDÏ?…„’rhE"ÐR‘rMb XX¾h$´¾º°Ú\ȣşÆiM“SöQLž«TPit)F¤Ä DȧuÄBˈñ Š ˜Žk!¡€Ö‹,#6Ï&ÇÓÈ­#&ÖB!•ãÅn[taþTX•8)›Cw5’,#Î%©c%ôµºùZHèëhM•¯V)ì/¨D„aØ Ã¡úÜWŽžTRŠá%âÒÓ7²'¾_ñ"ÚÚâ0›–…V"B‹xHí€UiQRˆ Dbƒû ŒEG…Ë¢Â##bûÙÌ !ýD|æ ÓþQ;àyÛÂL$ ¢˜ö"¡SAÝ:Ü)é OEˆ•;àabk#¢îE÷‰#èË€UiGîªS«ƒÖU­ÞŽ|Ã3íØ” Ó„æ v©‘ †™ð¼Ý̤nÙÅ7¢]ˆ¡]̱Ö&)wÕ*7Ê#QM"î¡ý< Ü›è²-ö ¡.æÚXÄ„$ó¬µ*.<Ý‚R0#C`ÈúZÖöõ”ú6RKLˆ]1Ÿ:\B¢‰m–g m2n*öñćêˆöÁU f”ƒC̈·c»bQì\,¬én‹`­‹Ÿ’¨VÊø ñ+¹[¡Š ›“XlËÊÄâLlcL!ÓV‡§Ú6'{°ä©qFXby'vndp;a%aC±,q®6š Yb=)áPP%!d‚„ë U¸è2ÀÝ0-ðÆ4€‚êÅ…*X.»“¢EBëv&ó ¯u&0Þ” !䘄*Ç$„“8ßfº¹b‘躤yÊVpÜ_4¾^ˆ&d¶„f™ÍåÈìüb “P’A}KHp õ„FBÈo us-!¤¯Ä×ùð럋Üiµ¥Xiu$ˆßj 2£`;33)»©þ🉠O§»0¶}Yõ¬¸…Bl_BùR5/¡|©vR_Bqø:=õ¤œœú€·&·7»]ŠØü3/<ýÿ˜ÿSÄÆÿ£ÈôgBüOÿF ÓŸ ñ?Elü?L&Äÿ±ñÿh2ý™ÿSÄæ ÈôgBüO6þ#@¦?sâ²ñé2ýÿ“½ÿG èÏgBþöþ'@¦?ƒîÿ²öZ€LÙÿXû-@¦?ƒì¬ý‡ ÓŸAö?ÖþC éÏ ûkÿ¡ÈôgýµÿÐdú3ÇþÇÚè2ýdÿc÷ÿ´™þ ²ÿ±ûZ€Dƒì,ýi2ýdÿcí?´™þ ²ÿ±öZ€LÙÿXû-@¦?ìbvÿO#èÏ‘3€þXþ_1‡µÿÑäùÏû¯˜µÿÐäùÏú›æ?+ÿiòüg‚ý_ÌÚÿhòüW0€þøüç²òŸ Ï&œÿˆYû/@žÿJÐß4ÿYùO ç?ÎÿLóŸµÿÒdú?Óó?!OÀqÅ<Œþ<ÖþG PéO„ú€é&d29‘ü­ÞI€ çÿáò¹\%ÿŸ X‚ÍÿC<ù0¾”[g-d“±I€žu [®´› Hà£Ö&d™‘ˆˆbÄsš}Æ6©M߈È0YpTÔਈà¸h')yˆöyNsÅÔ''ë½ â.ñêžm†G„«ãñãÉ”FÈJT«â½“º%ÂXYö*%âÜñ¨ˆäirkz—6¹˜Þ†œ‰­õ)¥WÂx &Ô1íéϱ¤Àr®RÌn“i {¥WêŸÛtKµ‘Ç)e\Í®ä6Êð0ÿG‚2viR9H9œêIRª§:“ƒ” ªn䋿˜&Ä,åK袉Ð:ü Þ”ÜaPóÖÄ uIÂw.ISG@H +ƒò51]Χ« u\Qeb& \™ÉON _¥XhE »+3(Ë#GdEà\¢8!!>®ˆûYœ½N9Õ±JÝ’:Í©Ü?W2v8¤ù$‰Ô©kr!1iaŽ6Õ8°*·ŸP„š|m5ðT‡ôĸH E-™l¨éNHi_\Žškb8Òô€á«k‰’ʆx[Ü:§3•Æ=A£¶ék%#ÕkZÐ 7žf[žÄamb?mÚ%Ô“P\ÿve -˜úp;„·bþ š†¯lš%e°©s³°"Sò(ð§)w|j‹XR>þ¡¦»©OÆJºç,Tqa“eÅŽÄð U" z¤§ÿÃ& 5ÉŒýŽSé)r×ÂJ×i ;™µ ¢¶”5nè³»MiÓgû"Ñ,{º<,—%ƾFíTƒ ¼Ö.+ìtµ2úRúmz…w,ÁêŸJ‡2ÛiBBˆˆœ¯q±boµC„ûïéÔfÐÓ‡ ´ÌZ~q|þ2àü×tþÏúÐdú'0‡þìù?-@¢¿ ÷?Åìý/L&Üÿ³÷¿h2ý™pÿSÌÆÿ¡¨ô·»»lT©ëèóc Ž3ÿ>‡'ZüDn#â Xÿ:àùñÿ±Ç”æ&‚Ä  ¨Õ(XïÖû‡Vï×xúA‚,h”'ú™›·÷µä¥zí8•5 m2Š$¡jªG,8ÂŒD:0oTšDoÜÀŒ ‹L & J øw€Vz{cîAMtà´÷‘}P4 jŠ%õQ P'…Ð=Š(ÅY!Ó°Qܵkk?B“„êUF9À¢TÉõòd³­Ë~àƒ ³“JmìX(vKÍ¡–’ÉTxK2hC—„¼›Äx²\pÍ\‘O-•€²&{™õ°ª¡}ÌÔ˦ œÉ@éz½ðÐQÊmN¼}öLJc1$É¡¬Ò£ #©`h€„/ŸçÅ㊼„<Ž©Çöpå¼Î~<Ç hh/hE Xµ$Æc&š%9o2ò<¤#£›ˆBÁ¯ÕQf,ĤLQj?øÈD£|`Už©Þtbe¼ƒ±@|÷JÆç½©b( ÷œ\­FÌo°ùl”Ç«Qk&Q jµN®T‚ fùmÐɦßPCÎzðÁÿOoy°‹j°¡ăgI<é@ì8ÁÅÒ×<‘dàÙ­Ÿ– F49MDÐhSªÌÆZ̶ìŒ3ý„hµÒ5€G“´zCÊ͇Ù$„#À¾ òó³/™0ÔË!{éA3ž=0aÕø8lzCîi¼ÖhÔ&[wÖFø¸²µ{Tßb"Þ³‡Rm° äªéÔAÇa¼ÛÒ˜PRŸ¢€Ç*FͧN-®{©ÅµPËöäî’ëŒ|¶=} ôDRUÆ$ÄÜ’J´Q2æ`K¡yu'´ÍÁ¦5¥yŒ˜—<;ǯOab†¢Oi^Âãÿg‚8¾Õy-؆ĉf=Ôí®<¶xsn#Ï@¸«C€Þ·ŒÄóS0­Så¦óöƒrÇ”³ÉY' hCµàEBµ@5ž‰Ú Ía؃rc’ Í:ð§›Ñ ocà #¸#=× ×"×Ièx|¸8ºST`Ÿ,î/$q€®6ê½p©Áàµ$é >Sƒ5·ÛYÔký"çè··0×k`ƒ*‘`#¨0>ňҴ*×ÕcUž,3­‡L*_gYŠã ŸX7= †#²ô·“¸‡ìý´j¸Ã&Ÿ©zD§UÁ¡­ò÷Á6sÐ:£'.;v¬_€¾¡Ø@w°PèU:¸ðÃß´.¶Ü´’„óew‡„ZßÚÂëv¸ÖÈrмZNd"Æ-X×ñ¯çqð'eû˳³ý³"󔳦YŒ6Õ _àu;ßJ[»™>´ªÜüÓª Ëœ³’ömIë¬{A?Xè/´5µùÁšÍÌ™ÜáÈÆÞcÓÑ¡¢ÆÞ†h““ÁÜ4ÏgxÃR‡}@. ¥JS$ÎJà’´)j%"ØWcP ‚ÛTÃeqÑýâd‘a}ãd!ƒc"‡™ìžˆ\£›Lµ~$OÒ*U®W}Þ\Þ lž*Õ@}%´¥Jð/êBÀ  Rƒ_€O<´IÃW8âíÚ³,HçÙ ÝŒB\D“Õ—Y.“ŸZóY€KÍÎÚ+œ‚ZŠE¬µÓ€¾«íŽ1_i(4¤(à|†JAÁSX!üÞë9»¢ú‹]Ë’È,yEÉ[×åÑÿ¤8¶àv‰Œ‘ÇEL¹&’b\ï…8‡.¢Œ´j”:I-¯ÍÝ4ñZ½FÈÁà‘‘fN½ÆgšnØë=ÂÚãšB%mEž#­JÞz9W¨x),L\gcÖVø5&· LÕjÖSœ¢ØÀ+U²\€×‰`,@¿Av—ÄàÈz®Î}0ODJû&qiiÏ-mYO J{Øè9ÁêÅš†Žšf€:Ô_Ö3³>wRöxÿ“ª›ÀbU5}»)R¸a7ÇÄî¦Ë}kë2öb(”rˆ=˜cÆ$­1„ÈáBŸ©ÒÝBeЍ &ö,rĆǞÎþ´e²#=¡Ôã»Sêñ-RÏþ‰é´ˆ•~ôJ?ÎÝ JÍç_¬0uY˜[=BT0åJ$A¯MÆmÞ8ÁàêzÙav%øÜÊg~d$‹4•Æ Râ0 OÈSåïÚŒd¶æ±Zíbv,b&Sf•‚5B£K1B©Š ãתQ?üU¨Ü(‡®Æ|üw¤\“˜"ODyB¢@$¶~ô%žz„$r=ms³šZÎ4˜3¥&©IˆÊ`³„OЪÕÚT¸¡PAd>%}5\’^gî¸`ñîpnN•D‹#¶eŽÃÁ<‘ýRÔ˜¸3™ùä^®µ4  $8h@¡Ó9¬¼ÃÏϰA¸÷ª¹¯Ï—½j΂È÷˜ÿÍÿE'éÏœüolþ'z€D.ò¿‰Øü/4yþ3(ÿ›ÿƒ ÓŸAù¿Øø/´Yþ3!ÿŸˆÍÿC#éÏ„üo"6þ@–ÿ ÊÿÆÆ¢¨ô§Z« ¨Æc9›íUõiÃyü.G,Yâø`þó¸\ Øø4Àóÿƒd'ÅÙZJ±¬?l6òÿ8áJPžm`x¦(«C:«k%ø™Vc„›Î¶œd(9ö¯çÄâ=²…‰ãÕ3ˆˆÉ0É*Þ~‚f[4A¡1ª]*™¢\£t©¨u"§M¹ij+96Eë42  îa?}‹“##KÚSOÐ PÓñÕ´³N˜¸ÓMýpCŒ˜'îƒôAh?=ˆý³„ø(EÖ\X õÝKx>¶Ü¶q™ó®¥¦Rîê ð¡ÐN_Œ ”!I«VÖÖKAW{D‰6I†êõ¡Tib u„U¢:(" „ÉxêÂiÈ#–˜ÙÉÂÆR¨‡:rШUp#±Œœ}h7¸Pí٭쇈|½ø|±—ˆÃóâ‹NæWð gˆ„b/žDä%öåxñ¹|§8Kå v1ÇKÀ—x‰Åb/HX[íÎÓ9ϋLJyñD<§Mø‚ бšpçIäÅ—H¼®—€ëœ@ pùö$‘SjT @m®—P$rÚ€4Àq&mœŽ„'Áð8µ6D‰„[‹(qÞ–ÈKè Ûâz‰¸bÛèXî‰2õÄ÷›½ uäyœbL{@’›Q$è(25¦£js<;¼?`S¥6jýÔà}*öº7¶w÷Æçc"ê­[>im%Ìì+ÿ%;>è%÷ŽãÍ­å³P°± Ýr¬¾‰ƒ^O:½ –þTª ¦ÐË¿s¢ÕAW?¹Q->u`, )j/”D†FÄõ‹‡G C†ÇÄGÅ óǼÀ´à-:ÅëQ%ëÔ*è&׃-¾1 ún ‹ éÊ÷‰ˆŒˆ†Fè‹ôŽA‚‘Á1q!ƒ#ƒcƒcFdžAo@SfRÌËÏÜy0Ûµ (h#(E="GúĆânLæWÞH,Š;.†huif_.3ŸZù®EÅÚo`³Ÿ¶ÚTÆÂ¨>Ùàíf*±Ÿó9P‘íÿJØElülÿ•0€þ&û?ÿŸ Óß—9ôgãÿÓdùÏ„ü?&ùÏÎZ€L&äÿ1ÑŸÿ´‰þ"åÿaéO éÏ ü?lþZ€LåÿaïÐdú3çþ{ÿƒ ÓŸA÷Xÿ_Z€Dƒîÿ°ô§ÈóŸA÷XÿoZ€LÝÿaíÿ´Yþ3èþ;ÿi2ýtÿ‡ÿ´Yþ3èþkÿ§Èóÿ™žÿ y@w>ÿ9,ýi*ýmü·p÷¬8‹5Áf²²V2A;¾ÿ@`MÀ'eä®5=cwY`s‰pïºsÛ"á—¾AN\[[ó(ï’ÇãŸî¬òUtiq?/{t§–¹ÇF]Þöð5Ù¡ÿ2›ä\Ùÿ¡(0Ýä²*Žt{Ÿ¢jî£;Ïßšyóðî%5ßvLµÞ3µèZIƒü> ½Õ}YÔccå©ûdß«ñåw/¯¹{ïæKsnï,œÕ÷HךAˆ~ü}pÅÛ†ßìßB Í|œ®˜V,]: ¤*ðJܟïW¯þ4½tù’NºÙ í÷i¿Ð(øÚ»Ò°+uÒ™Œ¥ógoÎ7\O ˜¶ø÷G•¤Öœ²ß'ëÖãÛÅÇz]ÚýnYç§Ö5îvlOîÆY•ë/tÎ>øMÇ5ö8ôÅú’6[—f-–¶)k ¼:£—8°¡8$7¿bVÞâò@}æ¾É>’ BMY¤:­¤UG¿ ‡9·‚ÎéUUøÏW¿–å/.å”sQ5éäßeEo”í)_³oúéÜÊÔY¢¾ŸžìüüÎ{yvp÷¹§+µàæö—å§–<2ú‰óJµ=K+ºf,>{üî…fï”!÷5 û®ßÈû±<ƒ_þùðÛCs{e¤ï:¹ÿ›e›~,œ>¸`è½Ç=ZúÝ9ê»[6Ó?)·,fËæµ›¯?ltÐ'ªæ×®]Fgy÷|8¼jý¾ÆËµGuÛ4ãòŒí‹æfôÊ\Ø©*äÑ'7tIGRÇûž?—?ô^Ƹ­sd/ïí"­l…Õâ?=÷­‡Ë‹?=°åÔõ A±xÄšî÷:Œþظ»‹tÏ‚ŠË£/*½Ô-ðÛÒ;/]*[}ü›Âà?—G…ÜJýT}¸Ù‚Û_‹ƒ<Õc'nš–Ýw[q€ŒÏsÏK›T}>÷ýîëÜÝì—¶qÝ…UE&¦ïÊ|œ18óVþ½¥Á[ËÞK>~ñÉ;1?ÿîUlZW­ø¼ÿj$ãDæâf¥úv£?عÇë“E9Õ#νžÿðo´Ýè¼£èŽÿ3^q7ç­µ>÷+¾çõKÿ©ùæü+ï¼Ú«eóFEŠûߨÏkOøÉ;=3BƒOÆ9¦¼kÆñѹåIíF¯¼ºu…¡ÅêM‰³ö)ÁÇ[Þ.‹o—µfäèicÿT¶Sþ3`æhñ¯ý'Üzò±æñÈTÁ"¿ÀŒa…%ïoI˜±ï»Ò’ò6è!€éŒ½¥ßÿsq”؎ÿ(Vl¨¾¦œiðïÚëDøÇ²èèþÑ×ý_˜q&³Uyô¨¼ñ§‚û,¾•µ#õƒáú£]äÅý³ 0öÏwÿØpqì «»å-æ­0DŽ~sNƒc¼Ík»ß –{dÐ<ïŽ §­Ã¿¹™šc¸úÉ1E‹V;¯·IðRsØÐÑwË«‹Æ>ÚÖýxÀÎëiZ_Ú=þågamp¼çÞO»âééT´îÂkœýe7²»§ÿÀ©¸W¾µ:mUã³yç*‹Æþ;%¤´U×B¿ŒY“²ºe .ŽZ0ñF¹°:­ÕDËß• †ž¿ÂÑ úwcÁ¹Ew®¼!­œØÌ#»™ÊË¥T§½[¦“´[ymDÎÐËÒ&»NÉ÷®Rp2OÜ)hN¯Ÿb:Ü;ÐóÒ{ûNj©Î?wäÜ߯n÷¾Øã÷MÚ%ûºí›ýÅ·ÒS›üð|9¶ó]ÏÛ×Vl”µ–ÿôÈêó§\æe ˜Ø¡m«9EµH?Y.¼›2²Üÿsßâ^Xmo—yÞÞØbøíqø ìVÔÕpUŸ÷þG@†O (ߕ߈ñ« 7̹Q¹¡kÇ€„ÍóÞÎ[²!¯`}×iÝÂÓ·¹¤ÚÖ¼}ž¶¢Múð­G ØÛíuö¤Qs¥kšûLÎúf‘ä½²nëúœ¿çاks_[=öäòùm3ª Áé½Ëù+º¯ïÚâÄž%Óζj4tê›Ó϶:“ßdWŽnKé̓üŠA=ªÖDŸ øë£!oþÝjHÿ#G=g6ÝÐuÕÚFÙüDw×>èQYÒ+]×þô4å#g[ ö«ìööØÿôz3{{bÐMß‘oU®Y¼#µúè\ÐÎ4ã°^ƒ.ú‡ÕHV®å7j߸´C ²åq³¾ÆéU›y–È·†ž)ÍŒëõåÿ½ê_ôkéÄü³ ^®šòå0Œwö ÿKùÞ¡Ï4£_ËãÙâÊìWJþ§n/ªY*ÜÞ/;÷R¯ü”ëÆ”lÝw|ÇðÂ1›ïíý­¢|ȇ¿ïRp.¿õ;“þÜ;(ñÖ³&É>ÏÊ{ÐýÖÕ®¶Ê˜u¬Ó¢UÞiYösä,ç̃™mf´ê8ïØá‹aïÌIñ~÷‡ÐÃ×ûâåf^ŸÏ7ËS­Û[ùsçYÇ{wÉðãÁͽ»Ïj[Þ|Öñ5~;‹# ¦ôi^üpÿÅùÇV'4™UóíÙ”#1 W$&íY· ã¹k·¯ú´í¯ã› ¡èÝ™n¾·Co~ôãÙ†#:”»ô½‡ŒWÇ­‰ødCVõƒ†/ŒÕ»wHÿaHÁVã1ͨ{Ÿ¥ Íü`P§½ 3~Í öó~/#âÖ£Þº¦}ž|ÝÚ©», ?™üŸßÃ7çL¯Êlµøbߪ†šîÎkumêÏmï¹Q²ògÉØÉkÀn¬éoþ]ÿ;#6,£|]ù7×DCÞXóH¼sáü¸Êøq{u,y1R?Áós½ÿ–yk$ƒ ß¼6¼¢ú=ï×â'¼Ñ6çó*À Ú¶]|±ÅÃåÓ›èǯÿfÎå[Þ:Öuûanîá—}ã*WIÓ/ýÔæÞ™ +Ûšþoζjá¨ðã*k6œîz}t먿·èpinÃÍï'Ä~6ûnÙ-uÕÉÄÂãß{éQÊQõçgvÎ_>߸8zéøÐ²=Û¾ I;(hoYÕé‚ßîöm›ñvv£Ýλß<½pR^›O hÙeIÎW×÷uŸ•°â¿={¹u(qr·Ëo”g~Ó+!vÙìô¿>Pthù߯Ž÷¹š³#}¬ßÿ³÷$ðPní÷v»nIn©dI ÙǾ4#!‘LJq³o!;#[—h³Tˆìû’PQ–±1egH²L²ÍƒÛ0üßw†V-ß÷ïv—_o~oï{–çœg9ç<ç9Ï;O;€Ü8‘ª±exâ†ös7҃ƮGTÚL4÷ºóÄ‹?]ý3¡Dqf•hGØB¢î"Œoõ*tfXyÈìÖ—ÛCSè /! Ï„nL)Å _jïK´}n"†¹Wis3 HЂ7´ D©ÖÝÔ¾kîä¦î\B(ÿÎðNbsÙO)#**æáΪXáF+Îd}­¼Ý¨¾Xß ±‘Ð)ýÏøDŸÕ²&örÜ(·,ì³Ó`%Åͯ>஄µôÚ({å´‚0P!\ÃÛñA‰ö˜Ëp… ÕsjP€[àkšáÉázNªù`gbJ²¢‡øï¦°¦ð\îfnO$)5E•G´0»<ñç¸Åï»-„÷„®q’ÔxP]×\†‚,8˜(ÒÖšxÏO{výK5 ÑÎᜮÅg}ÁlÌ­‚ЉÌñß×3n½ÅÈßü(© Y×Ö÷Rju ’E,³3•­é­K·±Sˆ{µÉ@5 <.]麅h¶”k÷l­u) Ò¸._Qøæìiœ2°¸5‡àG£²í™RQ—ïãÉ’ÆE(KàÕ·gâî–‘öªáŽ+gŸÊC©PÚò7 îô¡üÈ’›„°×'ÒØrÀbã%öE¥ )(zYÒ\êp‡QAqrEÖ€"«7ù ¸'Ûçx±·d wxì"å9Iª©—T´FÏ´V>8{§£ïÆ™«Ýg-Y/ê‚Ææ¢Ý¤p[m™s„`V<NÕ“§’ñ³ç´èæ""] y§4XÈjœÂÀªl}&ú?½Ñ3¸>¨÷¦8”Ã|ÌòXïFíÑž¹^e$zü™«±cï&»ÄG}Øç—1©ÒkÚºïëÎ$7¸çrèxË1§¤ 4G5?ÑAÉòJx$§õbgíÅ`ŸGwúuÇ[ A¸'ÇÙ±òöb¶@3[c Tbzà5&á*&ÎØsÂÒ=⤹ù™‚ÁÓ°Íu º%Zî76¬NhÖ>àݱ JÙW|ÀpåóGÛ]&±43œY=N|¶ödKâùq¢#ƒöŽªt–‘¤ž’Yž³5}ŠS9·g¢9é—©ô÷F¯£âlÙ[c|ËïivÑŸ¬èOF!]i×$ÿÐ…Bƒâ‚‡0%¬µþüJ¬ãÄ» {&ÝÚìClnÈw¬rjÚ’~a«ÿ­ÄH2zµ¬ãe󊰴[ ýƒð|,»ÌOÎþµƒ)ÀÚCUmØ,kWW.×½2»C•Gj/DR kš$¦æˆçÃyÀ7Û&í‘éz–¸Ù3zû^ÝŠÁ m„Å—²ïa)‹]) 9qVSrÝR“(¯Emz’ø{›Še-Ñ­ë{]ʬ[jÿ¸ØYÅ­†$ *䘪x~û¾<˜Æžé[ÁEbñœž“z;Êô“íÁÔD´:LU!­‘ÛMŒl$_à(½P„Á(zzï_˜ß½ ¾A‹^ËJ‡M8†¯T™\¡cLçt:¸†4àÁÌ×1}v —2tZý'^¨CH|¿Ž»8¿ú5³™M©ks“n-ËITç|Ø‘ž"nÖÎYè+r‡½ÊœÇn¦×–žN18è-—³ü'ˆÜšëU¤OAý;ÿ W^J‹jÖïhö¢”ô¦Ë±&r<®3¼Xï÷ùiJ,`:ÏÞ4ÞÍ8ºOˆýuÒ¨]„ª/|ìË“•öR*†­‰àÀBëAcZV‡""x\ÅnA-ÃÁ©¶WV•uynÊÑ6d\ ÁãýØŽ§H](ʼ q ߦÒuL)í&i8iôfbÔ=@O@“³…RøkFÞÆOêë«ãwþ6°w§”ÎÎC21\5ƒ ŸdÇ%w7Ý•{Œ¼qNꩊ]Î=¢$Bõ’ v×_à’J ÙÉ)„¢ËËÐK™4õ¤»rHÞ¥ùÔ÷·5Î'—J鑯‚î‚ÅÏr Å.¸ ”¥„¹Ý¦¦EÓíìæ%êåѱvÍÕ;jÃÒ€æs÷ _±XR¬ô±ÚÒz‰ˆçl˜IÏ~%;\žT|Úð\õš0»¡¼6ÌQ’þš0Ý óy½9êÃ8ünrö¹ê¬_Ö·;µGÉŽân–ò'8ñûx+d)tþî‚ÐCذÅ,9 mÕ™ú#pFú/Ÿ{†Õ íkn?´Â3I횈•LÕp_…•øø‡‘kQw—á¸vÇË’Lx 0ƒ26g@‰¹×“™õ|¬µñíÌ%œ?8¿mñäôýÕ/䯃[ùÈ:ÜO ¡uêÍÄsYiÃ$O`ß-Ðäì×Ç“(Ùè2ÎDwŽ]Ò罪ºôzN#É'<Ë"Ö[ÑËüê2èŽí¿uÌzonn¬cf».q´³`²€œGš${‰â›7:q Õ»òš/bê[“inžûæhh±óz$—ë¡[ÎÖ(A†yœ¼e•æyM´ q9-ºë¢`Ÿe­0Yd€Ú¡Õ'²ä†I@/‘)y…!æEÚíÍ/Ì ØF±È¸®ƒ¨7ùý„"¹»-Ö´Iæ²¹Un0 P:•bÔTèæ\å4}Y·%&WçúÓØ0e§F†Ýu¶æµ8Ž!÷Õ‰ÎSÕÍ‘Mœs¬=%º]Ç«`ø™PeåAë)I±=GØÜdµ÷¨•rÅ<€9gvT÷ŽÕekîÔ¸»µnô¾¨Žå~¤Ý¾ügº/,ärg§o`kRôDŸ¼7V¼Úìºî2˜uŽ/éäE5²xæëQP"Ø~`Ÿ0,A æl÷D{½.LKʨë k-'V!2§zÜL‹Z\Q~ƒux Ñì$ “íê祱AdØ$« õ)uýXˆ5>™p‹ºµ¯£­Y;ÞÙ8uÑ욬M˺fðǤ]"á@-ÿªßýœ”R8åIúZ[ÃÁ'XžÛi™uøc–îëA{ç0Î$öÎq'>N®ôî[ÝÑB“ú:„ëjõQ˜”RúaŠ%†tÛ„Ì×ZÎúeŒL'˜•èòÉØk„“…n¹Ü pë7i—ÑW,£oõT­ž5Q—_Æð‚]VŸ¹3+5ªÑzqþg|¹üâƒHÓîr n7˯õvŒ7˜Š³_Äy{©¡t»7==§AjBèœò’[˜½Íï‹C—Eò{ãXm‡ìÑòœÍ@+éäHÜb1n“b=oº´¬iÝõ6Œâ¢ÊóypN{n? ‘Ë7ÌZ÷GBuUvž8ßã3T,ÄQ9Ò»ŽBœ/VœDÓÅwÀGl9-,Ëà7×î)Gÿ…Ù‹WÜDx³ì8-pq‹UýÆ]nQ賃ÞÅÖùúš®s]±‚9)À.`Ñ770].Ø´|·w¿ï±¡ª[ú bÝJŠ4À(ÏéŽN•Mx×`ïâf;Êj<ÝUɆ ›15ž¤~Ü¢PûxœdLøÐ üÆB¸-æ Ë<úbþ<Ã}¥EÎÆûû±÷«[@(ÖÈ¥S¶·_´áŒÏ6‚ÇoœkºÊŒKY9¼cºz3¡“¨ñçÕÁ e ºÇ Ôx´[žä·3¦Ä«ÒÄ?žswÛñç“ “.›ÉökÙPÕ †É—±bBŠe–³Ýìò‹Vówy­*ËÈ'ÎŒn(um2•ÃDõä¹T6¸£æ²¡Gë²ÜàÌèñ?¸ ®Óè}X ÇI7=úÇ #zÚ«ÌkÒK„í§üQzFœÔÜà\›’÷VÝÞ¨… ×€¶MÅŽëç«J¥U§aœH´«Eø ÃÆQ !ùŸ^Ï$Üåg»}FF±ÓØè»çèâ+T K Í=N Ö3k^XìÐàf× íÁ²I;Df#}“^œeÀÍ•XKKuvtXwŠÞ‰÷ž\ëµ±/ÛR¼e66¡JYOxõ0˜%u†~5}®×ôh‘Áƒ*WÊœP熕Iùˆ5ô„˜‰ŸíwÈv°ò˜5DÐ¥Ÿ¥4Žu£·ÎQNKFÜEõ¶åì#÷Ù5±ÁG+¼Ò¬[3DÝCŽ¢©GËò#Ï\ÉÄþŽE½´xµaí{°¨Mþl\»÷Â5ËZŒÄ&œÅ ±’Óhï¨ý\è¬N&ÈJoRÖ½àÝTÖž û–ÌXÚô¶Õ)r";’çØâCꔄOëíè*j¸á±Áسå 7,o¿JÔ“ VôÌíWØWFÙ³“åÙt“ĽÁ®ïèϤg÷p!Í5 ®ýÑ»ÄÙ·ÑïI6™LèãYhs¸$lѹHyÑýK[#Ê*w 0i9ìÓ/ºKÑ&=¸<̧ÏGNŒ¿üÏA_€œ®S8õz"PÊ Ú³…™Ô—¶¹í9L:W—G‡¦oqS`Ln™¾94}EÃëHbR½ ‘µvªÀ#Ÿ¯Bá¸}hRnVõj]“ØÙ>Y[v@ª¦F¾Íøâ‘ÍQýÈX…|H KŠÊù8nAwµ”ÞYÿ–Ũ:[ây²P­ËØY£JKñ1™jLëáÓ!wËì^ä@wîñI„ ?B¯Áƶ7$Íû!¤ãƯP詘”$µ!¤Ä@ÑnOÅ,`´ 6ç?…ù¸ÃÕ3“¤R©.Ÿž»FþUY ÓEåâñÙ ÄènR^|}Bšž®]oÛåáG„ˆøàâ ÒlÆ>8ý©¤Åz̨=¶'I°Ie&®r[#“BÌeºiøô®µCFGÇ“NÚÆ-‰F;Ø6AÈ\ú>c/.Å]®Œö¾ÝAT/‚“Ø{R/ùʲûÎAÖûÊV–·ÜbùÙÅg¶w6ÐSÚ #—ê®ȵgf„œ4c¿{'×V´-GokK!—|—ôº!æËNr¢é!×yÙÖÆÆª àŸ±ÕB§šø‘uVÇŽŒÔ]·±/6ÀWöY;g£“‚èÚ¡G<„‡5¦ëv¿zâ¥Ï1;‹4=ñ@/ÝŽŸ®÷â™6ÛÚ²¹ÙüpšÞ•GM* 1JsÂZý- göNÑG¨\ÜÙ‚@“¡ë‡BI"éG…ìWˆ1;›ÙB+ôë佤NáôšÚá´ø\‘tgñ„ÕOxÓ™¼½¤XŠÄ}Ƹ¶ sç¢Ô‘ý#>Å#M6,¿ ›ö*©Žd`Þœ„ÚÜ+m# »g$Odt“€TÃñ…jÏìêãŽáªZ‹–Y @Bëd÷,¥9˜/yÜVÓWÔ–àHetñáK÷)E{i¤—ç‡ÐÎn2K VÅ•¢â»$¯­ Dk¯ dß²hd˜†±JYlÞˆv‹÷²˜bhTí] UìU¨­TÍoË=~¤WùVõ¶Ú3í$L‡j¯fî¹*ùq¤iä0XŒó¶".¹qƺv蘄Á#^ÁŸNúu_Yÿvˆ`3¡l'>?QÔðLG²JV*^Õ=‰‡c‘ɧ![‹ßcéÜ‹\¦ÖµØÿ@[5ŽñwnñdnR(× 5¶ûQö¢<½ ¥™å`Oô=çkVö‡›ÛÖf1"Cç[׿<Ÿ´ZMú„ò*zºø<H¬éñ…ýͤ˜Qö[“x.q<è?§Iàñ,šxÇ©¾LTž^Ï V SJQ—U“n óÒ$kšþ½ Sâ{.‰¡rUcÓdþàM»@»gUA§üì#ëf)äi-•2ÊIŠûÍ$ÝSPÕÁ­±ÉL‚÷ 2ÓàÙeòj¥üàc…Mn߯GÕ𠥄k*|»¡ƒ—*õwC£­žØýz²­å²»/b „¡4S§óXóvOl ^¡üeö5Ž®9þžËŒ /~ÕÍÐ oǾË<²Ss—[|Œ[eâÜÊYƒ[‰w`ž÷š¶kÙ8ÚûrèvF¥2IÝ-RÏÉk%íðìO¼ì€ýü“ÊCN•Šˆ¦ý1íwZÛ0~¥ðM¨âë cý,D>ü¾^£–’Ëh¡‰”}ñåv2õѳó†äö*ùHÅ`FߥÙTüâ¡æœ1y¹ûH/d+ J’ Ø[;yz2率‘’K/ûM=™ ÛŽçéÅðáU=§/–>X‹RâŒ~.6 6ééÄKïV8󣟿‰…Å>YN?½æWœmÄF›FkÎ<»kQkÑÌj¼MøÄžªé{"°õÁ#›‰ídŽw`¢ó|ùëω%»‡52‘…èÝfu8oÙ{{‘3RFum8”@ËêBððÍŠXHN“ëï­ÅröÀ ›"ЋµZ¨Ýt’.Å„t -Íü4©t÷„µ ÍqCÏhXz*ô†54N·´À¢S §ö´µÛÚ6™õwaÜ8«ÝŸË|½ZZ°ÙUboVZù”‰'ÇvÂÆižðËó™xÒúésº0íU-H½kt“èÉYƒÕå %|q „#-°z§Ûaï}$ôNÎÙmr·c‹„_úœè¡Â̦䄞ø’ óƺW9€¶ÄH],‰±¥™?œ‚NÉ¥—á\ ÞN÷—ñÅeˆŸ“â1j]­gW93¶ÆUíyl͈9Õ‘Vtcƒ†aùÊçá â‹7‹%ÂðõÅ@9ãª<ëI:Ø(½ðaÿœêÍD¤gÛ`QO¦SU±v²ÐîV$§mÚ,›­öôE“N9L•¾Œ©A቞Ôá%È(ݺ<~óÚœ¦i¥l6^ÄMR~5ᢓäØZ—$fé”MÓÝ¹× ë#Ú†ÝEÛ˜aš¨Õqï@xb{¸9Â0‰pQOj+Q}wƒii2ÄÐ)UЪ6Œ0^ý8R*y¯Â o>žJÈiŠñ-»³h„»Å8ÍiJô­:ôä*ïÆFLNœiŽQÍÂ3oñC¿\‚‚á¼R7Ö9ƵžÅ‹ñŠnvåñÂý™pÌ´^C…ºÅùŒJñ¢Ñ^7;=É1¡‘nMåÇJ*ÛaÝÞ {ò¸[ë¶°cz^z±"^M[.*´ŒÃ×L2•Ý:ä–Æ‚Qí¥ÐõB€Ö²ûÔuû޳ú¿‡íf=3=nÕiqþ4·‰ Z\±IUßwÕcU‘WxG-2–,è¶{.6aâ®^½Ìæ¹q¶‰ |”n(Óúiw):þt¢¾?ŸðºHÝóìE ýdרƒÚxBŽáÕ€8ý…Þ¾‰bWïßnwêZ[…÷Œ›ÙOå\ º¢”:ÿŠqwïÈÓ‚¦a÷„êéâäêö{^eòì¹Ý÷:Ë6Æ­­Ý)¯Š>ÑÉ]ücVÆgÑ‹ƒ/æ™®µyxOŒfïA_¾ºT{ {%À÷\^•TÉøŽTžc£éýRMšÁ¤ØóðÕn;äK°«6Nʹ§5ýtm)r¯BfÁuõ‡¦÷\+S+c=Ã<#4ÛsHž^Ü©i=ö`4ücmÚ¾zûì”Åó=×ìãbU&øߨzmqéÎAuÃæ‚ZK$çãurFC'ò `<Ð[§¶³ •=4“ÖÙ€ÍE#äUÓ¦.uÅÝ$m…¹3yª µö#êlÌ6¬QÄž‹ÉYúµOäíXÃê4óê‰úÛn¾>¶@öXÉñ† ·Ä ¿„†n%lÏÉ3òÅ«òÙUô ŒþerÞðö ÓÂöPûÑ\©&×âiTîjEï=ägÛÝÁÕæ5!3Vc;-ì <çÖhQ>ÃíÇ{TØb¡lÜÔ3*èe<¦v‘5LK»ŒBtÛ wd‚%÷ÌM†Þ퇤¬îkÂÉ5¡ÖY‹iÞŽ1©ï°˜c¸*ˆ•_7 àÓ{cÊÐ_^$¼¡;OJ7O;ŸYSë9Å™Žì—_!kÂkü›£…ƒ õSÐý§¨oÞ¦6ˆ¤æŠã²¡ bpÊ”™Óó‚Û‡»Fª8ºWÿÉaä*OÎJ“)æƒWŒm$°/M8[t-ô3YGÿ;Ò.ŸŽçöDà/éü¬jz3O8ÿ(¾Ë«¥bp-ö—tßEÝ$SÝV×­.œ" ™on'¯^ݶ. ÓüåUÎ2¯\¼pÙ©ˆ?DÒßø¨ ÷:ç}éÇ!5ÿfÖX+e°ärĆÃÚ¢¡¥Õ‡©ïÁ‡{O1ú»¡™r”M¢'•fÔÉDV›ÚcE)‰.»X¢·I>»Ÿ]¦eÌõ 5 Üq„Ûš˜U5Ñ·®Ïm×UÎCˆ?iR_µaiv#$e¡;÷XžCÌþβ¢ÙêéÛÌ‚:CÁ}3÷)çïÜ$X†;ç•SÚê鱫j¶6Ôlë:Í=?TÂx. w_Ŷ=òê¼Nm±6,Y˜æ¦¬”Q rÈÐt÷‰¼;µ¥ <Þ’‘3Ý^ÓDY…fï_zj…¿Qw¼©ÈXÛ,È’Å { yhѯk níH‹tQ‹§ËÝÇË @mUe ¥ì}F>_ËÿûÝïÿF¿ÿûý÷ÿ¾Éõî÷£ßýÎÿor½Ïÿ70Àh}Nö6††fVVã×ÑUþû6>ýýDDBLìuüG1ê÷? Qñïßÿ|‹ëŸÿqY.—ÄRÈò{Èï ÿ ?/—+Æ€4~+öÎRU®%P\–Ævf€[|>øŽ©°™´é‡o*Ò)-wéƒ<ïøßCARã¦-ÇXü§†Õy¯ÙeŽ~¬é¥ü5ÿåÑà>Oƃ“63_©›o-Ô_¿<&ÜÊU¿R05qˆ¸") ! €ˆ:Ò™@ɹöÉp]bQq@ßùd €8J¿ƒ \" M\N#û3ÍHH‰@Dd¤D% ç“͘oó ½Âís HT’ÚþtÐ9I@ÀßpfcoñØ€2Ní¼´´Øg;ÐHDT –fü¹Hi2bâ`—!""bïö™(:l¨q¤hÅÙÒÞÕ™ËÕÒÊÔ’:u‚°@€6n`H*`ö^~[çˆåTŸEbïÅQ]q£öJ`Ýÿ}4-×^‘Ø@ßEÅ?Ù÷åpíŸ~)j¨:±OÇ÷“x/*-Œàë!ö¹fÄ! §Å!2zχÑ¥E?Í–w'c{.„=-Z5™ œ€Áøe¯Å€ºj}¥ð{´$  °¨€!7u®CîQõP;žWªB[tlÍmUæ¶êæ':ÙÙ»"¾Õ‹„Œ›ëôÒ+Âà>M7 )4 €:òn5{ÂÞömµóOTÞÂóD寔Š&ì#Ý Ð:O£uIt¦5†o{Orââz_Z¾“•u*ïþÜèŠ?ýî{ÅïAÿöAEdþEAÿÆ×»öÿ¿Qü·ïñ_¾Éõ®ý÷/ÿ%)&")‘¢ýþçwþ“ë}þ¯¿YЖf<ûsìÿ¢À¸mÿ—”¢Úÿ!ßíÿßäúçØÿi\.š=ù»‰ÿ»‰ÿÛ™øßŸß•EªYÐÈ?Pqw 6æPãvF€:þÒäIUe?±Å6“_yþ]ac&ƒ½XRÝAUÐG¹–~Þå94‚-mk 4Âé-óØCnšãï×vc1n˜’•³©ýis'°K¼oS²ÅŸ‹ÏŒúÿîe#Àÿ§Á• ñò›ý< _ S{{@ƒß~Rü·„± LUCU Ür™Û¹Ø‚s.^3ó“Vv´ÍßWïã_‚þÉn0 ´èÊÍCX-S"Ú:›s ç_‚Ø—@þ90ëݨ',\ºÀ¾an Hºþò¡ËÿóÏ º8h<2£Ò›÷›ðr U+;`3ÿfxºÚv OÚØ aÿÙý<EVî/ š“5¨pñ‹ˆð¿f´®„õò°ú29þZC÷›` ù¶*GisßÒäõOBÿóâ-Ê ívßn‚ú& •à†“½©¹³óÒ™(?ª·2õý°1ÂR‹k—±­ƒœðøOâé—Q@ò ,ÍÏ€Y; *,\¬ì\¶Æg 9K€Ë‚6ƒ¸¨ô9dKkqñµÀîüû(#ö†2à¶Žv(ÿªdí£fѤ„VìßG ñRƒ* oȰ4ZÀB)>ª›Ó8¨×Öø÷«ç§Àa%-å?¾ú"¬ÿ^+*yÿô¾lœ‹®€â_­Ñ-žå£@YÈ÷£À?ïú"ûÿ~[«ÿÑö^Ÿ±ÿ‹KIŠ¿±ÿKé¢"R"RßíÿßâúçØÿWJ.šãÐwßÿ•e(H PƲËͯT›”¥wK/™ôW¨pÄ̉Zþ°“ýi+ÐÙÌÙÞÖœë51©+¦0À¨~: gØ=gsj.ÍEÒüµÃèÝê8\\oVÓÿâ›OzÖ›SÝ×Þw#»óQçzj‘“Ô…gÙElÉþ¹äWO%Š1@`.3+cªÔ’‚ðM?é,%lfº‚gÝrÝ•â]­ì úoŸ4þ 7Áoc@ýá/‡»¢¯™°™¤ñÊø1sú”÷®˜´€¨˜¨€(D\@LêÓÞß_¤M~¤ ˆ˜DZüá×\; ,KZ% ûê¢¬Úæš›ì»“HKCs`v^žÑh/ éïA½¡´¢½1ÀNÚøI°s4ÿ”$=›/#±°›á ½ÛûÏIÑ€ý.Bÿ½½ï” È”äÇåàgn˜úÒ)1xxûúÈö›8¬v1±±2]>ËÞ¿¼j|]ö7‹0ÑYÚëM—öPï.u4¬¼2ÊÊ®¼^RIo ~Áãd4³‚‰ŸºF®ýÊNô_²]ZñäÌ¥j"=Œø þôàq–“‹)Ф×ûNî?!ÿ=??0a¼ÍPÈk†.ñï´•ÂÅØæ/aãJ&¥7|üjlS2ÿ“¸¶D»Ï|a ¶Â¬õz‚‡½—JEï/á†è[Vn{kÚqïgp[AÇ;bþŽæ¹R K'sç¯ÆãÃà†Ðé­Ìh~ø4Mzÿ±Cª†ZðƒÊ†4”Ô•,i»o•9¢tÄPIYëÿØ{è6ª+M ¡¤„>=ÝÀBfCH“Ö±f4£?qpì81±W¤& f$¤idlLh¥°üš-¡bò[NIn—´Z m8ÍrÂgB(”BzH‡èR>åŸ}ïÍGó¤Ñgdi2væ8Ž4š÷¹ÿûî}÷µuuþR>©&'\ªêkÈ®D\ÖG9ЏØáÌ P±lvð‚ÒÇm^ú`$¤J·&uŒ¨A¦ÙEƒ—U´†ä ü˜£§Ýzm Ã?ð:" óä¯á¹ïâ:_¿#©¼¨ë\ý¨B„z•Ä‚±ñŒƒœÐMhá)cs«c±ª®r<¢Œ9AB¥ðµ(³l%Z¸ÁVn.€¿•AEžÀ<°Ñ’‹Ý€eMÓÍA#&Mvè'—+V²d«‘©'ßtÅÉVÏ ê`ÊÆ>ôÉŒZJQ4@:¯ãòÉcõÈÜ(„™žPÔñ˜æ†8(Ö8—Hy#Å…HÄ {ž‹4}ÀÉRŒÒ+ù¡eÎbq2‚½ð')ï.Q^ t-Yh??Ðݯ.S´% ÑPà €* RàÓ¤ñ3sÓ4y”ãŽh8vçáXج)qFTÕ#þ­Ž p5ÚÚ Tƒ ¤Uq,£F;j©©!ôm xðPœF¡…Ž 8)#&sV®™…å â “ÄÝByC fýBu•.fe•áJ£œƒ‡òáÍ"¬Ô(<~Ñ«M¤–ÑIh4&1̦‰˜¶…AjB"! «§ 2 ´‡^LfŽO¯Ä@(GýОô žÉÛ´hÕŽFº™IÄâ>Ò6çÿhçü—% Ç?eüûü[Ñpü»mƒ†tðoEÃñOÛÿ”ƒ+ŽæÈŸÿöQÿn§þ«%-ÿù®Éør¿`+šÿE‘>7íÑò¿¼$¬ÿJ’nÊÉÿ²¢MÐü/'÷ËÉý²SîWåy_fr¾Ô|/y¤œriHP×${ËçŠx°ž¢{<ãKÙ*•dãqEBFi"æRµ" #Ÿ«H¤i•Õ§aêK©K¬o½¿žj$ëÒoßÄ©Rød\‘F²>ËK˜bPyÖBoW”,UºË*"Òñèuçà1¿w€Ê/÷nEv¤X§”ß :­g(ôKÚ#+Êë7F´“e2#*?Ê0ªD»QEˆül(-ƒf‚änØ:­ª(QP¥‰B91 „U#µËš+A#¹§÷-¢‘ÜÕW‹d:aµÌK3BQXû3œ¥ X¶8 «‰²I%`™-¾©D—#¬ÄZEhågÐäîé(ÍmYÞ^ BÊ;#9òõ b‰6)2ƒ*^è,^d*$0ôàÙÇäƒÅ’市ïÌ ‚ezÕB’×GîQW¤Êx ‚õ„ÍÌjí㤠d€!ÁŸ¸p%@€TÆÁPrR°/å¥È$}¦!cœi8ñëA«íJF…Àö¥¸0ü:H¤Á¿UpâæºP" ÄHVyÿV~³,è“P_=#DCf$*þWV<“+^´äElru_Ve³˜çp@—°££íÊ#ÙU[Š‘¥Çô“YB›†9ïdÁœOÃ\ù”s²/\6æ|“s~ sÝBŒË7L,Ô%䉛E¡¿(TM¬#‚ÊFà¶Š+©)„ŠZ ¤¤Å0Q)¤¦TêÝ ùA}¡6èY²ÉœQ-t€ô·äë±Æ ¤],Š‚´Þ¹%gµ.á$Õž(hf ÐC[£j°‡W9¨‘";"˜ÓÜy8Ü)rRžB€— µ\°çqþ²%Wk è7B5©ÐàFÂYoÈÉv2ÃÀ P (2(¯XYZ¬9; yõ`¡Àiªíù™ôò/½ÁÉÉÓ×¶ü²>Œ•½™qB¨•*3«Ò& á2²à.‡p³”¤æ¯‘©…ƒ^˜x=æˆL¸]L I.)å°§+°F6LW$ˆsä~‡ŸbD‡m,n€mX~È_K!ž¨öô'‹y‹é]Å¢,¿×AAc5f0yf…Ì¥Zxí…™ÌW9“ÉËИÌ7‘™L%‡ÉÊe2¿ŽÉ0ß^[½ò­å쥌[œËjážæ²Æñr™²&Ùqf3M™Jó—F'›U{âÕã¬ÂñM“éèàî"6¼:“ÒB›dnlsœ Ö!×@˜L)îÐ ˜q£A*­1`ÙqÚ$RBºJR&QBÔëǵ”&ƒæðÊM8m ”îÒ Ô¾Tª0Õi”&>²à4é÷v%ӛФ«»ö¯2¢žna 1¦•3R&­‰)MtðÕóS1‘pò˪‹>TMÏÈ}— Ãs±ä&]Ú 8‘Žàv¶»˜3[¥ÝݰG”B½•ƒ ž…Ð@æ­²ºÍÈBkÒ_k‡éæ …ê5xsÕª¤ôãQò›–r!‘[ª3ÁÆ4ùs@†ò1äÀüyÕ$™~p=Ürdzt&½–¾ k4]¡ÖWj–Œ6騳Ö2ëªí¨X'Ÿh“>Að݇XIMt^µÆq‚@ÀB˜´åó@kË#"N±Z$g+ÀcÒ6oOpl2ë:Óµ·Í•-ÐZj>ÇÀG¬O•öGf0U2#tmÌïª[ˆ$ã€oQ‡HUE@÷ÕÎÂ…SF9©‹ø] V5ípJÆG&«V„Ò¤âÕÒrT&ÉѸfRt&_MJ˜,•”0 4ËËGá¤Ìºy••Ø øPŸ3û—Re “T­ÅWVâ±:Ï «l™0ß ü­x}¥–R^µKìœßD.yYvöú5º‘\.H )—£„Å ”ï*/ù*'䧉¹|”`³È–ga­n.2϶6¶ŽÊr„0‹ aCjWKâ§æ0İ(Ÿ‡*XgW$ˆ+ÃãÙÍe†á 3É6‘,áȈd1m‚„Pš½÷y ©¬¢ÕÒ´Ý–ÏDÖ>úŽÚ)¥v4^ËQ:É ÚÒ ‚¿ç>ŽJ⅛n÷ÈæÚÌd\w†UÓg¤cap õ¨S] ]Ÿû8ªàF@D:NDÙb?díò’2V%¯2¼•»&†Ó`23R;©£ YoyNƒÁá£MîÊ€;2R÷¨prh¬¢µÂt†êiš¼³söÑ5DW¶sm@øÙäúê<<¼¡N‚¡j…­á4ÇYxÕÔ2zª“¶ŽZ[âÚ¨ÌXDëfk)Mׯ|&¹ñÙM¾Sø¨ìÑ©mxºŽ­uuŒRGåÊVv”9<…Nr;ÚHWꢠ: gk­TZaá›0ŠÃ¤ÞÀë%ªZÃo˜—¤â[){8ù”Eä]F–«‰–¯¬‚ŠÑlÉ»+Ë>™=vU®Gòpšø‡!` '2¨µ GT–‡[ƒpô÷ÐΧKY!"†Y˜Ž•äDV+_„(K€è‡‹‚tf“³MðÅvÁ}®ˆ'ìJrÃÀ€ÖÚ€?>_‰²ÓçQT©Ò⽆ÀZóz §RF‚¯Q—.4Ý8,Mx9P۰ćšC•–FP“CD7H²6ƒÇéA@ð­K4HHõ€ÿÛR"áöÓD76Ñ4á&)è,BSZDhDáx­ðb\’RM.×ððp4ˆ1æâ“î2eæÓZøÁ(L[«òÃT2Œ„„´`–òÍ,U ò‘Tö: „¶i©¦ø—W¾’ ‰!$DFà_8fë´:§ÕºvCÀFå™hÖU‹1HÐ|üKù<$úL1 ú«´:Š¢ãõùoI¹}”»ŽðÔb2¹-“–X‘ êb‚)ú; <¬˜µ ÿÏcüû þ½ íàߊ–‹êªt` ,$%àé͈ô@Ec@{e|àŸ"ݤâßë¡I†qƒïݤ!ë²Êk5lG9þ[þ¥cE{°¿w1±4ØÓMôž¿¨»«˜5ßåZI·»\ÁùÓ@RDPdé 36ár-^­¤©[ ÙÞÚ,l`Q[b>wi†Z0«P°åæGRÐé—?ƒ¤ˆêšÃqVLsÒ>-Ì÷û=ó)اÄKÀ$ÄŒ–&B3 ]*dÙ':ÁG"ÀÛ–K²žò»Ðúæ4f›)öJ8®ÂI,˜…Œ«tœƒ,˜¡21ødƒ 5) ÜAÉÚ[¡¢CîN1f`ýò–?¤†—"ÓIŸ†¡|ƒMi哊yï#‘­²^6&ß0{Qüí8f#†ã#Jíð§rKÕGeuÄ&“‚וßQ7Ÿ–ÊêÞÊû%f_W|ÃtþäŠÜ鲺‰%„pAóæa¦€¿ÚC€ƒ%m#YĤeƒ`’>ÕZ&Q‚_BßþJñÀ€ç)à‘¡©prmòàèÆ(=ÉBÍÍQ+—C¿ôÔ‹¤O+–NÁ¹"¤ß ¼Ü®Î5?£"ûT.S˜-Ïž-¸Þ#ˆ\CCü¼ŸªZž­¬˜“šc >ÔŸ“šÕš—pº¹?¼4#HÍh—ü}(ùë" v»"”7O‡‰±°g!ÂZp-ù3 A*ãG¸&!b"›Š#œ“@x¯% Ëì>×sªÖ.¢jàŠeÏJ·/TÐ ›x0r;²*ñZ°rñwàֱR¢4Ñ ð–D>”Î/Ž )¨rX‰àa n"÷‚µD3‰zü’XÙ\ºâü Ѷ¼ŸXÙ´-ö7£À>ŒäsCœÜLfãá­¬ÜMiR~Ïâ@ûRðû¶E]Ý]Á~¨ï:»‚Ë÷õ+DÑÛvµŸßÝ.l wEßâ"¨ÊC‚MF´ÉyO$x ‡Ò`ŒL›XbQ_‡¼Õ®>j `4 NGAé‰XwåÆ `Âx‡5j–PzC,͉ƒé†*oòûšÒÙäwÚ8¾ÿ²Áþ¯²ÿïìÿZÒðý_¯ ð¯ìÿ3þ­h8ÿ‡m€…ÿü[Òpþ÷Ùÿ ÿ{ü[Ñpüû탯ƒ+.ÿ#6À¿"ÿþ·¤áøç샇ÿ-i¸üo´þùïsðoEÃù?jü+üïàß’†áßOÚÿ2ÿÓþ-i8þ)Ûàæÿ9ø¯}Ãñï¶þ)ÿV4ÿ´}ðïäÿ[Òpü3öÁ¿ÿ±¤áø·Ñùgÿß’†áŸ±Ãù/Ÿÿ±°áø·CüßçìÿZØpùo£ø¿ƒKÎÿvˆÿûœý Îÿ6Šÿ;ø·¤áø·QüßÙÿµ¤áòßñŸÿ±°áø·Cü_Æ¿ÛÙÿ·¤áòß>ñƒKÎÿvˆÿ+üïÄ,iþíÿwâ¿Ö4ÿ6Šÿ;üoIÃño£ø¿ÿµ¤áø·Qü߉ÿZÒpüÛ(þïÄÿ,i8þmÿwâ?–4 ÿÅÿü[ÒpüÛ(þïÄ,i¸ü·QüßÁ¿% çÅÿø% çÅÿü[Òpþ·Oü׉ÿYÓpþ·Oþ‡ÿ³¦áüo£ø¿³ÿoIÃùßFñÿ–4œÿmÿwâ?–4 ÿ^íÿ9þ¿% Ç¿öÿÿÏ’†ãÿˆîÿô3¤‡”ñO:ñ_KZ.þK^J21ˆàÂ÷Æèñï­#Ý¿sÿWíɲ¡h£Ï×õ6Òd”Œxé(EÒQ Ž#¤Ï¤çç´Ú6óüϦ̎QŠÿiË·›tøßšbÓ!¢›ÊÄið&bvékŸå‚'B¹àI}±ô]N„rk¡ÜÚ¤¾Yä‚&B¹Š‰P®bÒ½RôÖ%B¹_‰PîWr.0j¦ù?•Œ™£8ÿS¤¡òøÖpø¿öí†ÞåK¦O;2Çô®¥ºº/ŒÖÕsá”cÁ7ݳþtü™ÝÛ\üùáÇëêfÌHíØ±cË–- .¼òÊ+80000sæLð+ðü–à·®ÿ:F ,ï«;÷µ¢uu'¯îêh ^¶ñ­MϬyé¡»>qý×ÊÛ^¹ï¥}³ÿc÷Á¡®+¤_>ðÎÏVüüñÖž|´ëuÏO¾óÀíž¿>T¿¬i½8{Õ‡¯_7ó‡SSŽ»Ê5÷Üïì8~Ô'¿úç]®ºS¦\üݶo¦>½ôµí}‹F0Aÿûø§{»WÝøè¡¿Ÿ±uÞ¹=wš°txSôº‡'Sß}mÎ%—ï_û‡þÑ{ûÙåm7}º|_÷OÏ£¶^óö?÷4¯{:|‰ûÀüÑ·çéÄgμ«ÿÝÿ>þ®Çþ6­çú3žxÀû̦­' ¹.¾ýõ“öNùÍ®®Õ3nÚ<çóCg®¹eì½w~uÑÎÈ~fÁûS^õý;¶íØì‰í|vß{/,{c-½¸?ÛøÍ}ïí^÷ä[¿¥^ðËïÝ{ð‘›öŸ“˜Ý3Wî÷ýÓK7¥:;Çîàú…ugîÝ:pí«wñO ðcÜë½»:Æö?¸õâ©/¼ùß·ñÃÛ·Ìë]½ñÙ½ÌÐ=¿^ß¶çŽþÍË_têjåœé­zõæk¶Í›ýôž‹=þÁ3Žë9¸ï¯—\~ëà7îwüþtâ–mo´w}?ö¿œ"¼³bÚæm»›ŸîüòþWgЩÑÍËF^¹î¤{>¢£/0gÌ=4Ò|èðWÂï¶%NŸ³»ióó—žÞòík»Ó_"ékßôiw÷×7]Åü×äö~ò©ÔhË×-;mݲ…?êúà£OwOuO]6öÂÁÇŽ¿ÿö-W?û­C½üé;ßûðwó_¿yõ©ÍO6·'ܹù©‘hËÁÛoë¹u^ߘùg%]Ÿž÷Ñÿ>¹g×›ÏÅ®_zô×Û‚?™Ÿü˪9{f=wß¿ù¢¾¹ƒËÖNÝ3㬞3î˜þ«9-˜9øö¿ž´vÛs÷\uÎîm÷2_í-ßÜòÑΕ+Î[Ys]çXòúÇÅØ~øÙýÜ ë¢kîZXÿäçS;ÇNzí¾­§nýt}wûŽ}3o‹\¹ó.¾ñÃØƒ¾cš®þúèWÖG×}6ýÆmçtß=}Ö¹±Þóè¾È9/?tì™üO||ê«W\µ‡Å/ܼ7D·¬½åî/ûY¤#í}û‰³o{þÖ7’yë“ÛùÕñ6œÞÿómÓ7nkß5zBÝ?ö#vLºjÚûfúãw_½­õæ=‡ÝÜýû+>{üÿ¶Ò¼ñ›·6m_ÿâûÇ-xä ÿ‹_4O ?vÊ+/gFNçš7-m¾“o=q`óÚ‡_LoøÏÞuo2µçö†§Œ~í“—¯ÜòÝD÷mùâïÞ°ýéßnúcÏÔ÷üгZ]ã¿|ÿ+‡×½¹pÍûŸoüñ³þxíèÞ+Ò޽¹åóß¹[üíÆÿ™ýÒ9_üö®ʾo?íODÙ"d”H…aæžDd™Dši2Æ #;µ,ÙŠÔØ£!…Be eIÒØ†4öÝ#¡ì»žzß<§sžç{Ïù¼Îw\gΙ¹ç>×}ßÿÿuîÿ¹æ>¿ß5T­ù¾œ¦CE²-'Åɉ¤2…Î„Ä —}<À6ûÖhçÀD_aTo»Ì½½_€úÝÞ-ƒÖT нxuÍ #¥¸þ È}o±èØ Õ„²$íX¡/ãI‹hnªIãžÀ7Gkº€2Á-Ú —ÆÓ¦BÏé¬þ½¡8ì1¦Ô†j{¯{Ã7Eæ|•G­ÊŒŒã!•5Qz¦¤"„ÙM±Q:W AÚÙQcŗ¢Ï.àÅ9Ó‡GÊÞòÚ+ù”ùWD­LçÑW×{#P+÷—;Chreszâ s 23ŠVÉæ*‘iÕø@ öyÿØÔ­ü %"‰LLk£ ÔJ°µq#Jï3­Â¢'œ*€hÜîV\µïi½Ø0C;0›gDRfeiÁ$>¡5NROnu3wÓ»5ßr˜ÎßÀ«íõKÜÔTSx? £Gu¸ÁtY?ÿùw‰×%õkjÃ-ewðiÖÞÆäͺeÔý’ô'mõâÙoÔA^è†Y]µ¨2I+›3Ï?¼d¯t¤Î™!¹ù†­«{ Qÿð|p óNNvéÖ|¨û¨‹¸i›0h ±`,Œs?Q%»Ž¤Æ_%}˜Lè´¶o“Ö3™´¢Z˜²t,îTÉoÒo„1Z¤é¹ƒ;±•Þж³sE‰Ûm:( äY+O¼”ê,ÍÆxiA³| Þ–"šßJR yiá_žèŽóÿÜHcðP¶w)£®¸2‡OxÖIЈEa#E-7Ë™[xolL±Õ€UÄÔe¼Oâ êÝ;ÒsDSŠÒx­Æ;oèÒƒ~¬äÀMþ¸íN¬ŒZ‰ÙSw¼0>ÑbgǯԓB•Õ}é÷ÖÑMgGú&#ÆÄ•5ÔvO–Þ"˜fû•í÷“3?Ú  Û635Î\Û9Çõ>S'§í Úg܆máT㬠ï^}ýÏ(Ú¦œ‚ ö“£SÉ“IÚmsÕ±c¥3Êî°¨‰áÙ¢E!ß›bMï#<¦ÆèôÖR…v$e¾L»j3=BM^Ó«¸‡žbÍáÊîî›A¿TUìT5ù&ZYTÇ;H,SŠÔªµu'¨uÑ>Ë# ,õùb잣Ì‘^#Um4÷’[ Íag€R&bH>èÂÞ–×f^À€3a y®9=2[îºP(ÂÎ72˜¾óüœJfxÍcÞ}$ÿ{c®UïtœÂ9œ©’h»W{0Ro¬¶YÀ½ôÃEIþÕ\(ªÆ@ Ö¥=ç̾sgÕÔLGp:+0-8cº÷]¿-ÕîyUøc”ºhA:@:ã° 0#g6Û Ÿg³¿Ãûa:æèó’ÒŽŽ®n#ó¸P‚ÚBÕd/fö…6Šš?M¼bgë"œü²WT~8’œ9F.BˆÒX½wÍg`mÙ‰·¶9¯úü9WÂðÝ»‹p3?$³"(…×úúÐûIŸ?:GYKÊcŽš§¾=¡œy¡Ç@wkfzήƒ.Éã3e–>9ýhÄPž: 㽿'`aж㱗]‹E­sªÎt9RåþÇ[æíuÄjyµž÷Û¯$qrÑe‘jœ˜ ð\ÜôƒÊ¨ží—'å^ 9”MßGðå%šÇç”|j¼µ`*Ÿ»C!¼FŠÐÀËhíiŸQºqü89³†Ø\+P-ü¾o¾»e4ÿ¸Â©K:»šÈ@£,E…¨Oi›f0¯^¨-¿¨ÎÇ]|®Íà0¥§y/áà|döø‹u$¶•<€ˆê1 ùûŽÈKî𜦡0=ws;šõ=%¿8Û=VÍž!×þA”í_õ^<­šw‘õ%ôˆCJ]þ°T¸Nš˜Ûþ8Ž”š’@ZØßï™9ÆCoH_­T±!‰ã–’ÀmàöÆG@jÈÚ¼ËëL®£Å‚—¶+ÒB‘¦F6aúé$E 5¯«"êöÕ>ò¨ÛD±q¢úuÍ’Ï¢k6Jœú©1!¦5=’pø°zjW“UbÐUr¨©ç”,ÈRž™ì½UÁÙ7S S«ÔÙ8)u:eLrò aä¢b9Éì‡w–œd°$½@)÷gˆF¤ñKbŽD¹÷m³…ÃH/Kë™…'¦Ô–—jšŒ^}ÚbȱfïKa ûHhéÝ…“UîBþQ£R<ñ.ÓGº{žøz/ý¹C §÷ܰܙ¾ þSu¬Ô9ÁSÕ@RwÎ'ò¡Ô]";gÀ¤Ú³D*6f¡›‡RhÇå*°P“ùv§jß¾½ÆÊê~ÓBLZ:¹g´ñ³I -˜i¶ /$þ%– Ár¦›N¿ìƨš´)÷ Ñ1S)¶úÕòÎVBº?`V!Ý&ðU¤s>ùãÝêêå]&ã¦ã„ÇÞrÃZÃ) E)8u ±{Ì¥Ý<2Þë†0-Œa³ú%÷Ø×1m?Õk^O«Ê ­µc¸Í—g|}…H-@9ÛètƒFBM`5ˆ1¼œœül†íãÆóO'­îTÔÉ_£¤ä …Ÿ$j˜.í£§]º‡Wg©»ñ:1yÕçß& °ï&YnkÅŸ.¿k68at—Ys†x¨Ël’_kœqF¼ò©*äM÷f@Á¿Âü¾c`Y¤Ñ´ƒí‚+)ë.gÏæSó3"ÏD¢¥ÜœhóHàŸ·Ìvdõ‚eØa8‰Z_»ÏÔ½“97_ÕI#aÛ-äÄÏ'–hquWfˆ?KÉr6)`Î Wêê›7—Æ×hU'þ¦ØR¼(ÞÈCÍÚªó¨ß<¼qµî²VbXéϦÁÝs¯$U28Ú1H {®åN"¬‰?ßñí4zS´ó5}9Mè홺.á‘!YWëÿÉkq:-¶dûèyøòƒ´ŠÖ‰4¥‹žóügåó¿5Tÿ»^ÿµ*X©ÿªÿ\¯ÿZ¬Ô Õÿ­×¬ Vþÿתÿ[¯ÿZ¬ÔíÔÿ­÷ÿ¬Vê¿vú?×ýßê`¥þkÈÿ¯û¿UÁJý×ÿ_÷«‚•ú¯!ÿ¿žÿ´*X™ÿ»vüÿºÿ[¬Ô ùÿuÿ·*X©ÿòÿëþoU°Rÿ5äÿ×ýߪ`¥þkÈÿ¯û¿UÁJý×ÿ_Ï\¬ÌÿXCþÝÿ­ V꿆üÿºÿ[¬Ôÿ¿êÿá‘YZø×ûÿWÕŸt™hjK²766³ÅYedþ“Žÿ•Xøôÿÿ¤?¯÷ÿ­p0<‡„BB “†šd”)'cB@Êàqÿíë[Çÿ-þÉýÿ¿ïø_‰¿¹ÿed`ð¿Üÿibýþ_ üªÿŸð­ÿß„Œ³³Ó2uÒ#Y:qöV¶ª$²©¾=‰ügw=Jbɱ ËÀ–ƒd~êÉG¿fþ¾õäC¡¨o=ùßyøoÙc¿äéâm¿S¥¿gÀ¤N€‚ñ8诩Ç/_v¸lBZÞü‘€’@ ÃP (ðƒo ÆK#ÍWþ³÷ýß)°%2"„ý #–®ökò ’%é;ù3‡ü<æ¥Y†~ÍUuø7÷{\öó M–¸&¿æ¢/;š^^úLù‘·€ø3<‰ú9©]¼ê~¬J¶pvnÜns Ï’f}6ßïxv·¢aÜ.?Vî6×”„¥t~/Ù‚ÛV-υزj¹¼x¢×[Ü( ¯b™]ÞS$mxacƒÙ ÒY)¹ßÐÊg:²Ê¥.VȲçú°ëzÇLØ+•éÏ%öÆH›ÙÑbû–“Â\ÞÌ#ËÀ ¸"ìeÌñÔIH $ÎW%&÷b¨ûC.ßÄg7U?¶7Còû°\ü3Åï=#ƒä¢¶$”Uæ}l¤úJïhˆõÍñ°‡0ªf[㳛Ϥ×÷e ½ÇΜð•.‚ÉË ‡z1÷ÁlÿØ eM®×_çóÉœ+ñ]¯@mï7k¶¢§FßúZÏVª"Pü{—´¡}æ`õÃ…°N–è¯\²^?b[®~ zrÁ[š [1ĸÝQ>Ð>)´‰î˜é㘟²Å„säW±«ev|¹«,\!s+,´:xï÷&eÓŒÌNxö?ÖÛq³ƒEüÀÃðI?PGç‚hOióŒS{`ìèútg1Ø‹¸ÉÀ¬()¿ý3 à‡ýи¹íqn1ôŒÂêõòbvr”=Œ.‘çÚ¸ ñü4 y}úÚí,E=ëyœÞS^£`‡3úÜÝÁØ´†`8¯®ìü‘ÝcàF´ ²»ùZû.5/,!v¢›Z ,x­$yÝÝŒ6Ü ’Iæ=dzc]†ß—Ó­ƒ}ñ$xËoìNh»Å㛩mË>§ëVô $¯”®àƬ‹ú¹ÁmŽ þE úT”ð²“6WtÔ7±¨§e¸à·Ó$ó²\dï\¢Ÿ‘jEØ=Ɔ+9ÎÖÚ` è–½/]yÖ­rw6Å´¶ºN.J‹ZÉŠ`ëR#Ÿ0ØA?Ãç:ƒÆ˜—Ù“YAÆû±¶+c—\Å÷õ ,„KóÛÍH|xµðãâ-ÌiKàmu/úÉ´…Îy%¥[[×ÏmúAOÝðƒq|Q­/æ@x‡…´h%xà–> à”éãßä m2sWÙ½9‘T0¡lî#$sjZ¡CÙú%Tòë\ÚcÌ£hKwhV¯wNlqC/x€íUæeÍkªú¥ø1&;ÈSIK³”¹;~õIA,_„;D˜¬²tš¤dÇÌ|°¸÷–÷œ ±ü4¾²ÜE`×o·5Y{†jf&:È„Œ=¢F¶Ûnç^ÃÇ¢n¤UŽ_•UMNMÑÌ/¥QGÓлÈe¨ñ«Ll¸ˆhP}$±?Afù×û¶[¸îеù“Ò‚ÉÜ@’÷d©[cï)GŽ6 ŒgÎ\€]s]/€•‚.Hs+`k©d°® ¡zŠ™ÊÚB<‹Ñ–uC³h$é„MŠë7tMYHÏ48j?&á´…$Ÿ”D#ßÔH8óIÜ4i+$A''ÓtE_z+î¾)êWal‚'&˜?«ë"2âËHTýüUýŒÌê=$Iaü륹iæÜäæÃ‹:~=ø£KÛ BáÏ1µüÝ>~'Óý©’>z«ÄÒ[õÑ’÷¾Ü`ò*1¸|¥ˆE7DêÅO FCÌ„‘gÅ;É"%×Ý/ŽéSªÕl(7²Õ¢ãñ8)ÏÊÆV’a'®Õ¾4Í‚'çe×|1àyú9'²ÍSYM¹B8f­GTèÊÕ3ë8¶y¤äGwøöÓ@eÅ(ùúcD_ªˆ  ÒrùÚÕp%«wî?|.•0i¢¶¤HHa YoPAQV‡Ô¸ëPò„W!ƆR1“¹Â¡CûÖÞXVÈÂÁç#uE€­ñž±‡Ã&{ Ö“Gçî‡É€ã×Ð6.¹Ø$ÕGôÝ÷ ‡ððÕ¹€Ì–Åå`üH1ò­…À¤ÍV•ë…ÛÑpþÄ ú~´¯ëe_¨³JG‹RöúT…FOn¨>Z£. LÒ^¬ îHÿÅ3FÖç^<¹L®ãÅ÷¾IqŸ´z`ã¸OWßtBP¨º®ûEr±Ý‡¯uùiâ T¸#ÜÎÔ w{weos¤ØÞjܯná?Ôú’ (,Ê%wZ¢Ë“ãÇ㤪uL9dØJEÅǤ†dÌA™5(Çê´ŸçhMâ#V¢äVÚS ÍÖC@Oþl£xÛ [“P§{²2†G>L/™í%ï™]œ1%©m-®ø˜âw8"=SL"¦?x¿•jeíˆ@S;ö`†NÙ\f*é» :ÌÕ7^ͪEB«N5×?‘´!ŠZoµÝJ0»0*޴ʦà ;)¾˜«À7¿$Þ1p¨˜r‡f€æës,Ç* ×®)9â-ÊÖ7‡ãQ’3ïKüWœFìá™o†$–tôœ’¥NØ¡ñµ²WCKaKT÷‘ð:· §üÑ74ˆÇãÀ‘vÍâÑbÒ¶¦û¨{b?¿sôA_^"ð’WëPPÞç¼±MóõSQeUno_ãQâ¼×/cvA†ñ¡;¢ÞðéêMަ±ê(4ìÄ‚‚ö¡«fí\P†·ká-ÌÞ± úCNÈ}>*ƒ’&ðƒsÛ‹¸ˆ+÷Ì̇ý—Éó¯×;Ëû• úˆþ. EÃÄôñ¸ŸêUoe|ª’üvJÍ/!fIøû}Í(#`JîÏI~jBƒ8`qí¤]oYåÅp×¼XPVæµõR‡ÖâÞ_”©"󢇲ëlÝ;’«…íÆ¼Ê• ´ ]tSc­¦ööޤêköÖÀ…*y£;½òòs\kÍr’õa…·•DE±ô !ýò)i…‰D©àGc:U¯'+ìÈÔN!ìJR¸)Ä `~WD„fƃX9Âñ°Y––JÍ-ÙÄs.áÈ…§i­»,e¢pÒ–WšT8/~(­ÕÅÈ:åÔA]7lWÝ]ûc2ÿ…c—­˜¢–œÒ±% ‹¥k å¿Q©%5”ŽÊW²L‡–]ðõ8ÍK|_!SQǾË_]æ`Ÿ©2 Àþœýny¨WZ•8ý£‹É½OçyVGgð–³1Þq¾ VK­hBz¦XîUš•UUü¤BãÇ•áqI`_óQ¥ZIü³ }úàf''YÅÈ\ÀˆaÖГ\£—hÆkÝAôø 4MÑ¡óipÂÂÚÜ„ž%+s¸p7U¡•9'œZçý„ÊÜzëp@¿¿¦Ÿ‘eÄLÜF1~V·QÕgEÙ¾ƒ1à«WèõŽ@²Å)ÈÞ”ëªÈévD°è¾¼8Ïœ V‘üqÈ@œÊ]ËIOó¥²ádÐðÜôã6HM=éõhæÄƒ¥Âo‹%78ô::µÂ øåÓ°É·°rª\ERÑìü‘K-ʵ|åµFPz±XÜÜõ`ŽðVÙ yjµ#ˆ¥¦YœÃgõ8»ŽÇ—ÜúùúB×q€{ã ·túì÷Õzþ*2.¿»Å—þžsïSñPo¾”«Ðð)­l%()Õõ‘ªŠ63ì.Z$‘n¦a§=Usâ'ÒA|H¡Ÿ¾ú€Ÿ¦jßyŸvîýô±“ðÀ…+áÜ5¥_¦OV’~[½é7µ„î‰slÖ¥bö:Óë·ÔÛÔôÕ¹ÛüJD´˜)]ùIÀÍ3ÞÍ´ù‰k\âÅÎL;&ùlïé¤>õ“ݨ)OÒW5k[)m`!ÖV8½Q>ïÚ'Ò€¼&ØRj$¬¿´Eµ,©I;^+†´0g<©‹oûoäóV1sêš–Ó¾Ò’å@{œ^qK êšçxTÿð€9µ²ä-¼*ᮟpp:,ñŠÖ tæYY틹3 ¿XWoýR­»Y¬”{¦âjŶÁ©åSaSÝ•'´yáö±}|åCŽÙTO³Iôm½3­Š¹èo½t>×uªeŒ)ν;YöXÎ'Yyb8ÎôÏ( Ïx³dNÝÙc9…ÿƒ|C•g'Úx¼ýß‚ÿÿK_ÿó7Âÿ}Ç}úÚÿ#üßwü×7¡¯ýÿ7Âÿ}ïÿòMè+ÿÛÊýmü/ÿýýŸoB_û_þ/ïÿ‚”GnöSø¾ÿú½ÿûÿwÿÏ¿äþZ¿lÒ¿ˆÿúìú:É!ßñß„•ìmíá JvH¸‚¼¢’­L „+ÙÚÚ;Ø)ÀþêëûNÿ»ôoÅÿûïâ)ÿzÿ‡m¦‹ïñÿ è¿ÂýY3ù¹ó ìw(,'¹/T6z¾øüÖÁåG¹O0 „Â& è³’]éË.¾.ŽÞtvÚÛÑÖá7‹rˆM \þ% !ë ø¥E_Ç_ ÆÎω>•ß oÀ§6¡WÈ/¡Wv²v_vôôuñ üM ®ð t…ü i†”uû2@Ü7cã“ †Ø4¤ÿ ãE¿H9˜ìï&¤ ˆØ„d)"~Ü„dý¥þÿwâÿ?ýyüË#òŒzæùÿ߀þˆÿaùÿ³¨6ßDg?ã È'ðÏŸ´€©²[ÇlùüÃOúµŒ ÌhŸÿø §ªµ]¨Ým4óA߀²rÖô”òé‹ö‚}ïâÚKâ.9M½>Öu÷>Læuª¤ÌhŠ…#UD"µQTl4´Å#ÁúËòhð–Žíµ#'Ò WßÍ\f4-Ñ \Üa-Îä™Å :þŸ”q.;¿d»²ÞnÅEk¸QXÌ=>ñ2½¶æ»&®Uz(àÀì·„ïËÑ¥äêië^=Þ¨ÚgǵÜv+Áâ’&yüÊQ–Q‡FB9"ųÌ@»Äa3tÙ§ÆRkièû462¬5)†ú‰gžíºâð‘÷LÿHnóúû.{ýšÑØ›«Gøú’·§;Š0wß°±…W­Ïʼ`ÈbÚU¬‡2óºÝãß}.¸e]§Q‚a»™†ð,bÆJéBæ–Üõa¢Ô¿ËfuöBêiS;ó†ZnM²Ãrñ;ˆó3%ÁeÊÄîíaƒÞËçZŽj‹Wìn”Z™K`W<¹º@íɱqVâO"A-*þc Iä][ˆã]ÝÏ#ؤ¯hÏ0^Ñ1).èhkVnRþމºþ\Ì’•r=F[^蔟çUÅJ!æ«Õ¿IC°gïÇæ†ìu ÒD~n\yKÝ?++Ääyl¯€- „ËNeªÅñ*«ïì ÐöÜ]F©5`V¶D˜õ²Æ÷8Ó~ :[¶ú¶¥Æ°ä'©¾ÇK[‰ ÝŠÓã–lGdMÝ_áž¼xR¦Áu¶³È¥æ,ºÞÆœÝó¨ù§ÜÙ©Ý÷jsÆÜYµ”Sª §u40C®›²ª÷^ßè3|™“ÌætVê‰%óS.wsÜod¤´7?,öŸùèÒìY·þ‘}Çâ¾à«§n`ºóFL‡w³²}p™€ʬ* } Zìàt}d¢ÐK·ÕˆðJÝ:ç4,øÊ3yËtT |áþ••ŸÇ¼ñ1UqaÀ|áö6†ÀŽ÷ØV6ÊH­_þ̱×M^çrzî{Õi ÔÓý5Ÿ±ëo“<¹eÆÄ_ß:Ý Ý~Â’!¤90Šáݪ¿Þ±ÓámƒØØêºÉF?aÔÙÙ]ú±®rÑ1˜° ÈÂ?Øûx*Û÷q{$”¤2rì½Î9œ#«¬Èʈ23Ná{¯©P‘ÈJÙ$œ’2Cö±£lÿçP¯Wë×û}û÷í÷ût}Ïs¯ëº¯q빯û4É„dz¿´zÒm퀤ík¿t&,^[•16Cðö>±ï B½ØqÛ¿7Õ|aØV׸ëðÛ&QþûÜòNÅ\O(ºàƒ¸IÔu–üšu ÉѳNË!ø°†î3`4² –0z4!zÙ¿VŠ¢"…–ÚF/Ä®—ËéV±×-!Yä„|×m Š >Ìa‰ñŠé,w”¶C½öØiò8»êÒ¼ ó‘K»Ès˜`Z:^ñ™‚ù´üû3a¹R—Ÿ¦]å²t l-ìÃPjt˜h1àw5Œ7L DFO¥åcº—5qâÁœÉ Ý<ÞGFçãcÔœ½v¸ùG“Ú½]rfÂ${+`[,Yx¹÷(¸v“F†]pµ·AŸÀjéd똬´:`I´[ ãªQ2\=çàïWeâY±ž•ùN ®d^ $î*…ò´.»Pe‹¤ŠîÊÊñ½<ƒÑ³˜:¥ŒA°¹1uû¼‘"Ï•Ú_PÒc>):f²=h­ýªãÛò¾Né܃ •SÖJv±È… O×N`ÚÏC³Î£\fWšF]"îÝ>1Ùð,º†°8V7 ”»&w‘¹ÂÜÕ¢Ë8šÆóbL²zŒUIµ}.3§ d.@)ÞùÎ{xï9¾x3.«º«¬»í ua·6Ï{™]E¨A‚ÅækÞ“#³tYºgü]õYwÉF®:¼_yAª÷,ø¤(:q¤ë'¡R|8ciHcÄféêŒò¬ñ™ƒkB·ðŠ ñL4f²)¬àõîÂTÂ&ª&»)Œ;QÛ_1>ó¢L·8$‰k ‚N¤.Ôͼò¡ÂG”>˜Ž””Ô¶ÀkŠáª¿çªÕ\y'ºžÒÏõ0[Ü ÚíÆWnµ©*³wõx¿§@ÒÛ•—pAfBЩQ¾ƒŽÆp0–¸kŸöä;ŸûˆÇ†,úøÖ jK™ö];@Žƒ²«s·VÂV¥Wz½ŽˆÓ…`(óÝ3dÉ•{[ØœûÈéiär.;z-7rr@leyõtW@mãZ;fIã=0øð&“‹ûríuÝŽ¢é@²( `£»v0ïQ õ‹Û¹–kîñ6fç3Ïѹ™X»Xo Wˆ?©±¼äøE¿\¿„JOêžÒ¹½n *‘lÇ)º„QÅ2x.§E‰ŒÓ"RÃc{µ°w¯ŽgÒõ&Ç\k;GO`çõ$ΰgÛÅÔ^6fn„Ò>·Z¡QIóQKìàF¾ä`⎢öƒA¥U) ɱİÜc»Ú"—¸™‰2Ó8ýÏ…2º*@”Éw‡þ~¬¤&©‡õQB ‹™S!Ù"ܵlMôêh’ÙyåjÆþ±³¬"SƒQiCM@Ò¬}ž²¼º7tÆ1‡ª|•ÏçÈ!-/kž²>JP¤(°l¿/õC¯2VØ‘ŸøWöòK 4†¤õáèP‹YQØeG'W» ‚™ž@™O8VO¹K2ÂíWºv]8ⲃ?sg·4™sBØ1È«ÝX4IÝäé³ËŽåôŽìpCîsÉ6Þuûˆ®z‚>âŒg~Ñl·ƒí8/ó‚4WÅj,±Ž“M½Hf`ˤqMˆÚv6RDYÖ–~ú¾5„ ^dê”ÜXŠGaßhðÁ¾^]Ç‹n’vîæò“°ú!t#a&Â]Š.™ô—+â' ýé§ô‰(%³ˆÛð¥5o“Ç,íå*Ðá×/k¶øk\K|üÎOã¥ÁÓ”9þgefjh„§ºzuv»Eí0µÌÔßu¢Ÿ ‹ìa×<5ìX›9PWüÃ$§× XÜ5RÉëÉgHß o‰|Pz%É a´Ò®UÊË*ô¤$Há?BǵGsì…¸²ÂÝú¼Š„µ¡:ŒvX"%ÃË+­¨Ç)õk ¥lû.¾ãåJ%jeÊç Ïg".è\fZYæ÷áß–«ãæ½?¤·<±}”ûbRLÒ™œs{ª5.õõ¹.ðIzé7«}éhöBuEŪQäZZ_Û8Œ€Úo"uŠäÜùJ%õYy¸R±áˆeÏ>dGùÐä:þË)tñzJVÕ]O¸ïѳ ÑÑíQk&¡·?Š%¶ºg|-ù±#Eµ+òcõäB‹g¼øZ’·{¡âNN­½1ÒíaRKj¼Oìöhr'æRŽÎÌ«ážì‹Ï”yÝ_Â[|“Ï×"ª™uxEÝw²úÆÈxÿš'–)27Ÿˆmk”ÔÕõ*‡5ÙÛS„ë\8·jôC±Ž’‚ëy2)æ<ÀŒžƒlTä_ÈcsuQnpc€ò\m%-c"Ìh¤K ÁÔýæáIo¢•þ±*¤éç¦ •ˆ—ýH|]{ßb²jð­® {—gù^ü˜wMFD‚ʳî‹ô×U´vŽ¢fÎÐL½ ŽT ¬1(ާ|ë÷Ãäjôb-áüèøLiÉÅ^N¾Ó‚™>W÷Œ“Ôu¶Aä?¤ÆÌ†éœã³£(¿%”“3ì<§hüœØ¸\ƒ”(Ö{^}/*çLþÔ³^Î7b÷ ÜêPä™bÉz«b' ù¸™K3Q¹]õÏzàt <›Ä4À›cGxÚ_c~þ,Yò)ÌÚ±4áÍw8T?«½nsó•Ìш¨“$趈q¼{JjìÉFEâuþÈÞÜn£ i¶¶¬‚L`Õ¨šíS¢;Ǭ%h§ZŠI*ä¸VÇ‚%5)l;§®rEU§F·^>$õK¡ _švK~¼Ï™HÂÏö°ÅýTrq~{¶ó0jI÷þ3þø14¯o2á ®mo8V{Áô)’ôòâ\•m9ÁÞ ­¬#SͧS‘X°¹Û®{Äî”Q¢Pv|¦–àÐAÌ‚c\*ÕàÉ'Á&p5¼ÈR£6õ©§ñ¼Â}ÍɆۀ*5ï §GWåòÕªüUú¼P”⢸ê.ÑÆ2‡œ´Žäø\ªgµ#í¢âÔpþYaÒèsÚ®&Cb1„ SoVc û G±jίÀÄŸ¤ž)¸ì1*äCy¿he.ä]S;ë^t”+!åbÚeéÒ‰¿,j^–ÿZRW67Ⱦ‰'‡v´õTøÁÐjšœñ7Qiœ~½™Ï¡SŠ÷yj÷: ”«™[( +C4jû 5k¡ÃÇ,HŒšÀ ûï Çpô04ûXÕà95/ÌB½`?xVfÂNSµÑ\½ÍeôúŽÑ+yêEŸ‚R=½ÁÎ#ÈÑC0/]½RaŠèµÿj©¶.#HäA gâñäS‹Je®]¨ u‘k!lÛÞ^ß›,p´%E ¦6÷ŒœúË‹Úí¤£¯I2üÜ8/cjÓtL`+!÷íñŠšÞy{9UÐŒáJ¤?Amxw8{jìK}ïå»×ï€i÷ŸÚ=~V¿/{‡›þ.ç·]q™ÎiòÆÇ°-žs†d’iþ´fO[Lzo<ùyÌ¥¤“oEiR£ #’ye´v-Ñ~(õèDSî&ô}zBư*«†Òu\OúÝËn›ÐúýG’Y@òxn¼™1Õ陌LO]‚‘è$¬C²áXì¼µ.þ©íÁ$ûO¡4XË bÆð\O­¢¥˜¥šÂe¨F÷xwKn7¹µP—\ÞPîUÄgäYÈ5òÊÄ{iÐ˰§9\sy@Ö«m?ö*ëÌ!†Õ’Åô¹üû YËI÷hò]"4Ù^>SÞ*Å «wj]–÷Ý«ÄEâãÞ³<™UΠJêµä|ßkoiî£3â ­îo¼ ÌüU¥“e^Rsz>k/f4LVœªýâbø‰êØK–.¥CH¼Ðï4˜Ã•r4;ÈrÖhz‘ò®¹;T*•½ã9Ðc67¼’:›Z鿜î•UºW{vh¹Ò5±§tÕt®>¾|&±¼®·KŠAð‰«-É~ÉÛHº’D›(¿|Fî/á5wâ=e½0"f« ,Mïkz,66¶çþP33°—J¤&%]ß›µçmÒÉŒ3zÁˆDRæ¹3¾mfØÆYÞÈJ²\c=U’z=š|‡±˜ÊˆÜ«l¹å=N·ä•‡ý"ûÌGR_ô݉ܿ–5´Æ¿RpË`‘«à½ÜãÇ$uB­`~CR8ƒx{my!ú Ö‡aU’É-¦»6wûJsS™$±mQùS“{êÅ÷Ð`„2íäV‘wHcR†A‘÷(ãü ÊSª—”æŠÜ…¤¤ËMBÈ0Í›ì1x×T-ETg2`|¦˜Å~Šƒ kebµ|êå6]hJ£/¦Ò8ÝÀ𬷀a±ïY0øQ¡îîÁ’9:‚PÃ÷BéÌ;óiè‰ëš4T#šNix’I:Ö<ß#+ŸqÎ6{êÚ[’Xž]‚^Þ–9IC_ìvXb¿¡ëvbàAßè•‘¢ha_ËU64¤ OPÆÐ„môµb'©ýô‘C£/ŸM¤Qï9ŽÜ.ºÍm-þž8ñÓ¶ªÊ@šeS ›(Æ·¾é1ÞdqZÅÏ•ÓÓ«^x’®b%xH$æ>\Pš¶/+ €‚mz¬ «–¨iïL¨±ÝG¾Ÿc°¢‰A=Gl=‡¶Èa/ÑÈ ÔU͵²ÛB‹™=óÎÉ×ReØÐcˆ”t_gʸlÿmðt+â]ŽM1ížP0l¥ßíu‹Ö)ŸÒJÜ€A”ôD{Ó‡ŠŸ$F‹åN˜g5'WW¸L ^Ç;;¥—þæÙ“ÆÔ‘Ú=‘©”ÔÎäÐæé&e h¥ej®ÆÞ¦j–èj(ÉDÎÓ¶ÃÃMÚäÂd¾¢R‡VÙgx_ÊûRªVbª·/>BYŒ&ќܱúà&°˜NÇlÂQÏn ¹ãh*ÑÞsåg8‹õ‡á!›ÉàÅ;1˹·)Q„&Q¢Liî :‡c(ÏÄ|0~¯ÌùnXò’žDë‘“â¢h!©VŸ~)§ÇJ=¦‰É— ç^¼„N½zR!ìi.ÇÄîÿÖÃ}4)œ|Ç?«ËX{Ÿ’¶îDÄKÎûÃi΃Ê.Ì‹U÷¹¸±£V‰Ä^7=9Žbš9Ë0-lïaüRT½jý'ë*9öN] B L•¤Ù0IfŸP|6›0Zaê?¢ÉED*9ÚìØ÷| 0Éõ®ï1’ÀíÝt‰ŽUÞ¥ç?yïDë6ÉçèìÄ»çñü¹T 1¦ŽËå!våïb­ã˜©;m,›$u}D$—V0°é÷®«i=F… C~,XMݳ·H˜Ò,±·"fß´t^=ùìæ›êÑ¢7Rjg»·1,3tͨ=ÄïzLAC¤CRy´E«@Û³KZ oâ¾õhbëÊLŠcÁÊë¬~M—è8‘Þ'§åüá_Äpy"÷½÷6Höoj±†ê322æµÏŠ Ó0ñ¯ÐâßîQtÜ,xöqÓN7âG¡jŒ^rç0»ø§^¥°MQîžzúdçbPé$öªÆa,«56>—jxòq,è•®1Ãbu"ß7AÁË®¾x¿äÖ¿BýéEc­)LüRŽM(™ÞO®>çRîb„&%æ‘U»B?‡)zªfßcéÜBÀØE”=rçž¾_ÅMÐçc-„Œ=©lö -DŒŒd4z:j˜Ó *ÃÕÌ»‚ØWö;ZHcáœw·2®ÀÄxÓv‹Úú·¥í†Ãí_õ»Ê¾#ôÉ;ÏT˜lºó:úßèÀÐì=÷O‘RuŸ >R½j2<^™l9ZM—NŽÅ(–UŸ>Ø›¡èGÈ€íéñ¹ÂªÎöÚ(?ç]™,þj?Í)2¸RÓÜñ>'£ôðwiGÜu(4»²ð)3Ú¿oB}mj·()ãË,ÒYwà‘œ±îiž®‹!–gÒñA÷w¯ÌŠkx¬÷Ž>:èŽinžðÌ|®{¤¹¯Èõ&¿”þAl6æÊ>°é’iž¬%¤Þ¿íÊ˱}K1ÜLþVÛÈŠT\åš’ý.í'PÎðQFÌÄŠª[Ú=Ü}R{Y0 p­µd!r¿ç¡X¦ÝX¯Hò݈Õñ\°´`€ qr¯¤6))ÅI^Oü‡Ü“7jÛQ‘ãå´ìG‰'&E➯V¼õ¿>m5F’œ+^ž|މÌëXÕdá6¬‚;ŒkS“<ä79¾‹þšûB“)‚}x4¢PîÈ+L®Å"O$°×re#öv¥ç?/‘Àiñ=bµÃùø¾‘h Ø³^?Œ£ESn fvÖÎÍ\¯.çôŒŠ~‘Ép#Lº¹õ“<™Š@¯ñÉÞY27»ʬ5ú"'ÙÎdÿÀ[båÏ+¥ÞÕº9³bïá<ò¢jÏ-Ø.úŒt=t=Ñ âªB`å«t|øÍ÷ˆ‡G=æ5¨wIJh=¦"*S?ÐpVH¶G_­×-ª—Š9M½‘Ï ×{¹ ©é½@îÏ—.›“3ÒwzÖNž—ÒëýCK9"c­dÊþFI[ê©£M»85–½$$Œ òÌNÉPœQÄóϲN÷I÷Wï<À‚V"Áèå¥c*™‰Ê˜ˆ÷“޽g]蟨‹3*‚BU².0 ºöãËÚªïlH+«ÄÞ¸Ohÿ«c ¶~ÿÿ>ç?ÿÜÿ÷K`«ü!¿üÿÜÿ÷K`«ü¡¿üÿÄÿüØ*ÑßGþÎÿØ*±ßGþâ~ l•?ì÷‘ÿŸßÿü%°UþðßFþ~ÿé×ÀVù‹ÿ>òÿsÿÿ/-ò7ûïÆŠ¡b`á¿ÿ÷gÿ÷Kàsùõñ/CÿÖ'àˆÿû›üabÐ?ñ?¿`S 5¶°‡‹˜‚Å…a3( j ‡ƒ!ÿmúþÀÿ_øQûÿ7wÀÿOö€?·Täýÿ øZüß…Ö‰ˆ‰òá X˜_DDø#ëDà"ëׯC„¡¿6þ{‘u1q( þw<_ ¬‹óC Qq8¿˜ðŸ»Æ~ÐþÿÕàß·aðü¹ý‹BÿØÿ¯€¯ÜÿÝ Åû×ñ;NoÆÿõ+ÒU/¬Õ\e·+~x§^y÷0¼ýùF×[ÊØÑÂWë‚vÙ\©&é¥ë¿¾Â{swíî8óûFš÷²Y·G'UM‰2Úú+R[<<Þ3ˆ5¥–¯ê.ÐyY‚1¢µxmü„†¹ÛÑ/>½0ʦ—×’ïà ë+È‘À/ÿ-k½ŸÁ´kàf2 Ì6ÿIBÃ@Yl,~¦ÂöÅyŸQ=úÝÕãoéBãЮÒ]ª½Åsïâ{©€¢ýfEæ Iç¼f-gŠ|$ËA˜8ÝÙL^‡ü:{ž²Ä#œ­P·\݆šÚ(Ñ'í±‚ÖÛkÌú|Þ=³_ÙkçG¨2‡&éªxk:á^„O%(Á²ô>ãÈ¢D»O¼¦¡ò’ðÉ!e.KL¤}`íGÈw¡OAv£;ý®óãWðeè¦ÛZRˆ¦Ur´Óïët÷åÙxp+TSjd“‰Í“)Ü+x5àìÅ ·Kf•$>µtž‹Û]£i˜÷ì†M³{Ðø ñX“0úºDé½÷Ÿ}jÑrñ£yŠGÍNmÈH,ÈÑz±x&õâ‘y­Þ†$‰3bžcÌÜEZw¡-§YR'…*&xç«ÙqfG‡®ÜQ_i÷=Ãü·Í ¤§ä£ BŒÁ˜}öT+Í/4²^÷âÁ÷ï'XIÄå’¶â¿‹ÏŠŒ‘™ K¥¿|ÑxSº¿êÍ()‰—“Ì­ûWš¼ß$ö îê^¡È¹èì_¥ñüUè¬Ê£#ÍþBN»ŽÜçò*Ë.5­¶Ä eï”rµ%*¡¿‡€š+ý¸5+µÈü츆ö£#Úþ¤·/žLhy÷Î@ìÖ®}â‹gð ?¼>sѓү“?ªÚ¸{§yùúðý¦ƒØ°Û•à »é&ÞÇ™Oô ,r'K¢#®(ïr¿ R;,òð*&’£.†¨ß$„¹‚œ‘ÚÑ ÛH$ùä•Ðw·Y?!•%göi¥Ù¥J,~è³Å÷h,4`—94 ‹tåà««+{W«½r¢Lzi‡ÓÄ<©wôa²ÊNb¬Ô¢ŠŠ&Ï¥8õ€Ø!æ~ysRÊ”@V}/ê()ê<õuÚ¤ÎÆæT9 בÒQÛ¼]f¡§üÒ·qu <ßrꢟL&#Eo–a½:íIÙ·šäèc}O\¾9i@ïjV)EÉD zA* /“7fq•l¯&V’`B k5yÕŠk›0Ëü]¼¢tÿ¬ÿò|ß |ô%ÂÃÐ$v\µ¡( NxÙK ÆX– X¸F¨÷‚¡îÑ!6fÒ²(¬Åµ¤âažSØgîgñ»›pf½œ%¹I@š3Ή½_Ý%RëoNèŒ?¾O_¶J%Pá„¿ªr´(Çu/ >Uy|>žÞî£O‚®HÓÂ0»ëô(ðæuVv¼ÁË|úh «EBÒ¨M:5uö)-$LO¢4ü¬gͰѕÞ33Ò^”¶ÞðÓ0=I.<*3 |èµKÊT»Í$>ãW|†˜dbF<…Û§œÈãñêƒðI_'³`*û¢ñcÙ@ØìG¶œ-¦#Ka$Ö~‹¹Ü%·ùÑ}ôjñ2Q¬¬AµÚ½ °ÿÇ‚Sjssæo•§â-™õ W%N -€·Ç)jèˆKV<‰æN¯Ð:ƒ¿_f5|)["›K·hÇÃXЇí—$§m÷¡Ò0SÓéŠ?wÒ¯:´¾M¿èµ»È’ËòÓî‰ÉË£ üB–°Ãƒ¥%*±÷ 4æt^Úùˆ¤T†Þ£ ªOÂOÉÍ¿·§ÕfeiM)uÊZÊ»ÐY¹^&'A™Î§ävZ"åîå°ÌJª÷÷Ww‡©ñèU)Ë‚0»v1JO™V¯zÏy¼»o7í3¤ßY}=nÏÀÉ™žÙ“}B¾ÅöQ¾÷ÐU,¾œ»áöÊT+ö m‹½£®ÇÛJ©ð¥ßNHVçÆ‡‡pXŽß»|ãäˆ/ÓÂÒÐMÓb°: ~ìØ)ÿN(d !wßJWJíÂc£Ó‰$³?8¾&,ÔcöÆæ-^EP,AXA=;멇1Kô… u¢o6Ã(|´Íîx^8SÇÄ5šÊgÇ©Bš6º°q“F¿ ¦»T9ñöí½Ã‘õ=l;#’ºì¨½í‡°ˆŸ?É1/G¾7éÅkúB!c/¹H½ÞÒþ³‰š*š/ÂU=}¶ ˆø‹šô©ŽÐE픊¹qR\2>™iª”gŒ Ôü&°%F ¾Õ;Xª‘•¸wÕcž±ÝÅGÐSÅ‚~P…(w¬~ )‚å(w¾øŒ;hâÎ]²Û…p½ÂÃ,pÞ`âöÀwΖJ2$ŸÃdípϺT2¿û±Íµ3¤“{Ñú+Ü,yÑkéCm|ç0£ô= ægé¥ù-'^K1Ë›ššÒ<‚“@•×Ú¹ë9rËxn©Æº.¥¯<ñ×xpÅ"p)m»äQü)ì Krœ©P|8^¬‹¬ uåÅËJû“"´Ø)Êñ¿Óލ¢v (´¶­ºŠ§!•’þ¼bÈÒfpœÃ‰Ó\ïÇ€O#‘¬1ðÐO=·}JÉßðÆ^8þ~n޳ÊïÁ¯i.â]#ª+Œ|™M¨ÑÇËèt65 CýÌ´£Ó©·Ü’•`Ü1]F•—Â9{†6>I™ä‚*ÕÉà"{i$ÏËA†èÓEos'Ý™<’`ܿ۟KúÁ•2{"¯5ì_[›ÞÖIînx%ò^íªŸ›•š½!Q™û«nWTùÄœ„w•c†ôCíê5O¯Ùž2 ¶úEŠ|¼@~¬&µýÎE»lÇjÔÃI×µ~Lú¬]Ÿº‰×Øå=Jx¼‡[ñ H¤Òõ³¢QÙ%¯<]橬 }8 ¸4è\]Aº1•OÀEwhà¹î¹4ÚÖSîº}1™pÂp'u\ŽÐÇðá4š¦BˆëVY¥›±šæÄvÉ‚˜=%gªãÜÆ> Œ¤,_âæ (»H›s|šý –þ>ˆ±£ðº¸¹Ê¬é/Åçî3ÊCGêŸñº1ÏêDç%ÓûÛQ/Ž‚/1|j*¢#•zj¶Ç=MŒ9ÓŠ!ò”»^ Û¡ÇfÑR ºùzÎ)î;FÉCß•˜ìÆ{L¬VpÐl±Çn¿Ã›ë¡,^Øè3Û^ªC&Ø}BúéÊÙkƒÏö÷ +нnÝc௤æ¯A4——Î霓?T'z;„†8,©ƒÖEçÞYín°ïëk¢òZ\F%-ÑY² ”Ñx’#…û»Ä YÑô‡XùxO5aÝK/0­i­NÑìµ&›²ÙïUh"š¤¤ÁŸ@¢†«Ìh‘Â#sTN’žPòÜê¥[P³ÄÝ»‡ýFO±*{f)LÖx­2ŠÓ˜\:Ò(_À‹¿Gl"ÿªÞ…¹£ÏB÷9ý…»Pôª¶ìÕ}Ùu»ˆ¦B“JŽÈ«]é?¹vq>XD²ßØI„ß%~+ž­› Ds‡8òAhÉR±Dé&OÙQeì5¸E·»«tIþññ”¥d.µýn®ÒìJ|"’Bœí¾ÃJÂŽŒ˜Ü³寲ëÞ3•}+ãMûž"¾kÆaÄêØ Ðå·Æ sî–¾i¼.ð*ŒT½ †%ÿÝòëÝÙŠR’PGv ÄÈ@.T4h•˜Ë8ê¡Lï–üê±Tdð䥎’Êl°ú f\¿Î¶Â^¯!yÏ:L›=h·áŒ¿L/\–ãöÉ3e½ëzØô-+Íæ_ ²äpP¯¤ëQµËš½ñÊ>Ž&¼eŽ;Ô°Æíó☑ɢS²cF×øÂ¡_ý}¹‚+  !´n—Th•û‰#½°‹õÆ“xXüÀö>Rô¥„~(+†@€~s¸hƒ„,vŸœ ‡Ø0+“[%q–nüÆaDêk ‚ƒŠtO¶“ªæ©cÙ/½8uKæˆ{I IæÇsÈ™#£rËÌÏ2o¹$Õ8íâïº-çirÖ.($Í ž7.ÞÿWPŒºÈqû«ò#Šð®üÜóóÆîÆi÷Ü$•l©Ä¯C>#T4ÝÃh'õïßáÏ[XËuPG5¢Øþ~<®«Cç.ÒïÅÒô#i´Ô45ÏrhñpîäVਤ{}N«ûþËî—xÚÝ $Þ­!rz'˜pFvkÁ­ÇoÒóã¦Øï#9}Wñ îÊI,…¡éÕì;;‰3Á¯ÄÎÁ…Ñr•0×iô¬ôã0þéì=çY$Ñ×ÓïСÅÓƒ[ÛÜ«‡oØ—½8ºK@r$áqÚ%¦VìXÿ³ÔIøu|=:=uÉ»w 3y3cÜöê‘jŠÛöŸòOâãR3A‹Ú] â#Í$Z"ßÕ†gH<ÓÌ‘I\D0È¥b¸ í6Ø7qƒÙsØâ:èUß aµåtŒ—zí™ñ‚(A5Aµïô4ÝhªìmoÝëºØ£0î yëÙ7PÊ)þC‘,sYŒPŒ#ý‰Ù;$n™xÝ]å{Ûñ„htòõÖ–…Îeœž&àê;M–ÄÌÝBÂH(B½‘¨ÖÀÕÜÏŠÂO¶#€V¶¯þX˳*>̈»8+ËÏGy ;P~¼v {c¤êdž2KV?ö7 Íäž lô%G;>Å«o5}Ui¿(PÀ&5Ù}h|ß8)H*:[º“!ù84€ËAK{’—¤¾3Ù­ßçBŸIvk[¢Hhs+IoÐþýÁZ’xzìûÝàSò, Á$WÏm/‰°^n ;vìiz ®p =ÿ:ðš.ÓÞü¢ó{Lñs›xË}Øh„ßéüÌ$EŸ^”!G"·¤/¾˜Ÿ‚†g§mßâ|ÿ«fÿ"ØêÿûïÞÿ †‚Å °¿ÿýçüÇ/ÏåÿÅzþíGTq¾à¿ÿ:ä~þÁï¿›òC!b?þß_–pqS„%X , ‡[šƒEÅMÅ-!˜(DD Û¾?ðÿþýÿØWáÿÉþE„E>·¨èŸï¿¿¾öý×\È"ö¥&üõKÜ0?$㇠ÿùIçÿåð¯ìÿ¿ ßþÁÂðö/öç÷Ÿ |ùý¯Pcýû¯:ºë<Þæï?ïÛ‡†Á`)))………&&&222½½½ß‚™™™ÿúýç%ý!¼­Ÿ€Axýþ³G§XdõÝ0Áƒ˜7¡“v g™$D•2¯m>Uñeˆý=DçË|ÝÙ<F‡v(ê”ÀpÔáUÿK®¦šç<£©0BQ4ø4:†¯µ ’,>ø?f†/Lõ.ŠÕ–‹æ´64â?´Óöñõ#r§­µø&‡ƒeÈ­2æ˜öyž:áí*™ æZæûœ”/Ïqéqd7*­¹Lµ;ª]OÍebíX›©*ñV`œ¡uU0fj:'euK]Zk$u)îýÙâÞN+Û7‹O†UÊÐ=—¶å1w%¸»¼øÁJaw+E¬„k<\°‘B=6XxSÓDµ†e6Ùï™hLý¡»i~qº¦li\i9 }Œá¶h&VÊØ›¢#U+qî=ïaÚ·o7zm8røðáu¼¸ý„Ò:õÓÚØãû«/h­aؾ- ˆë;šeo»ëÀ’–ˆ_fÐ X¼²+LŒªGÅz­Á‚Q’|ŒB .‰§Ã:2èƒMÚ—m5°2«Á½Ðå1—ãcÝžøÓac–¢'ÎëCq|œØ™±–0)Ó3W¨´ìa‡ u HlœêXªÝ‡Ñ$oÝ¡Øÿá¾èMñ˜ExÞtÌNzêh<*—edÙàö1>J[£šb­‰{w#oÕõÏ÷‡¼¼u÷(\”Ï닯¯Û{´{kx\v KËXˆºåê¸6”ï¦FÜq±ìÐi“_2q¢dûd^v)z[žÄ{—Ë‚ø ñ/í£›™oS¿¶Ý«t-ºüïÒ3ód¥LД’Yãéiºs”ñþ/kxª°åíö®p¹„9æÝl)Ë4®ˆJÞ`q64 §X+ít?q« ÕïåôÁ' ʤL±Ž[K JLê=.Î i×"¦wgïm“«ë<¸jþeZé³!35U>Ùëï·4ÞÒ[§O×´çr…U¾QÅe%ùž½U3Öô´±õ2. »ÖÆÞ„þðBø…NqoÞñ^Z¶°œ~ÕFß÷Ž[c±vÌ@UŽGïîÆÂw’í‡æÔ2ínW>YŠ›>>·˜aíÞCõÞÁg”å±Äµw­úl&¼ Í/¤¡*ƒ+“ÞØSpÙ ;dÐ+î¯ õ™Œï|œ"yž“?e£ {BTzgZ™Â¸X™šõd‰€\Þ1o£ðæµpèÙ¶$Y÷Ԇ䉥“>Ⱥ7·‚º(;EÕÓué;î$ìz!&¯ •¤OàI‹9räô\0ì½®ê鹌ÆBµ¼¦äF˜y^0j^¼L_8ùP… ¶ª¯X~À ¹/سKêTJëô,”ªžƒ>EEå4£W(DsI2¸Â1¨jô5]SQë•ð*#6Yþé])-ú…FŠfú”fG#oÄÕ*S·è„Ó¤ð ¯G [+¼+ißQõÀ‚…æsPªHÑsU¥sÙ:1Fï®ÐÞ<]‘‡kÔ;ì¶}ѽCôm#…v ö¬ïô 8)Bà†­ `9ÂCª*ºRfÁ/òMõætù È®H¡ÐŽùc;O3æàR)B#DØÅôBèI±WœgØw¾.¦ î$h,ʘ{–]Õ¢t» ­Ò Ó»S»˜¯q=1¸dyb¬Ù¾]êø²Ž8}ÈÛ¶Òz Xxë eèÉÕ€L½«‹Ù—‚X]¦º^` l/s®ï„Sä*P:ÕÎô®Ç•y Ø]Èp'2á‘EZà,,&ââù•LRí(æ×1ïN½è=X‡^óœ—çdsë+Fx8Y$ÙŒ¯WÁñ§“f FÜììÒïí|ÓˆeÊîö°ziWJ×`Q¢¶¼íY÷ƒÆ`.!*º¾6”ÒHWâã¿›Ò¢6°æ¥¹Bï˜×wÉÄ1TËÒ<3Gþkw©àâÃc­0åÚ–à†™9µ¦Ó§iyÀ,˜¤™3¾ÿòyž×»,*®Cîó®È¼f;gè =k³·‰L  ƃŒžÍM®²ÑïHDž:ÀG£%„4¾N)GŸj„âF&¡à2ÖÏ¥õr^o&%·&»vá$–è Rx¸Z4ŠRN7y÷u›½9vúbÛOÀîݺ£KOÝ €‚Ó^óZ^´Gj´£æjBÒõ;ˆ³éÃtÄ®çöZ mf©&K’ã8ÆoÄ…%»ŽÜÎàF³žíqmÊ|Ë{DŸ<ú²†þŠe5Ÿ˜yZ˜îº6Ûy—бªâõb+9Ìù7’Ž%ä³ò)kû%¶Õ&ž#ú»é/+³FYñ·ò•N…éž×͆B5ï¾9v R!‹‘G°;p©ÇYþC­ºŒ-øÓ…¡«4e±sŠÃE®­U†J|,èhèƒ#.R- }¤ß©¹y{t[Œq·G¸|ô1Eìœu‘«nƒ‡@É9Ìhã è>´¡Po·G& ž¿®,6mîÙ{W_œÜîÜo€)ž>wXn$9xóÉvßìlùççs¡ôRRP{—GÍÁ‘ ûÖÑs–^”·šÇŠ…3Ï—)?\VªÏ!áã¼ÐÐ .@Ïa¬þªJB1V§ôHIFí •ïµp€ÔЙSœV*š7ï8[‡,dxϹ‹~½ž”w…ÅÛÞEÛ}.¸$¦8îöTÝï¸y$+7ÂÛÄ}è܃ºnJ·§yнÛè½!ò§ç^CÊ{ëಔ֗k,å{-«Ĥ@Úè£c UÝ‚¤G³)NvI±®ˆ7Ò2^ë˜Vž6瑊zþB.úâY-^n6š»XCÉþÚýúä¯{&Ö¦2tP6²ŽàYÊ献^¬Î£|{2tbÜ._Ãf7i2ef˜ôEúÆáÒɆ‹æÒîé{@;BÒ<3‹;Æ-'¥'z–Ô¾•>Nù ¬˜×ngÁ8®pÔ Ëp²êÓÎeÂÝÝÉTŸçí|Q¹@ì|3Ä]E'bb|•žÞ›¿×ñC¶Ã=àABH·žέҬޑnP¿ G¸,‘{÷B–ã¢mUGѲÙP+áŠÈøDË¡³BŽ=¶—CÛW˘•ƒsVýï÷­Nà¯E¬Yß {÷Œnß÷f2†‰IÅúUS[hT*è1]‰P;̨öÐâ ›ÆL‹!É'ÑΞ1/mŸsŒw¹‰Y¥¢¦(w0x‹ØsN­!6­÷ªF¯bA×=gBÓ]yÌK&È›ÏX„ÔçN…¸5÷°¯™¡ÂïÓGs›ÖNfI Ìo¿Ò0.´ÍY=Ð¥h¶ÂÙV­]×èR!{«9^ªÅ—"k*¸d] É—Ah¯CØ{Ræ+ Œ/^µN_:”]‡œ3œ³?Ÿ¸"é̉®¦* šþX|h´Æp©Ù­æ;š$»¦Ól EÖãÙíÀ i…"#¤Ýx®dX£ü£‡áìûn·™1ä?è;6#’ÄDগ‘ìöÄ¥‚’€Î8ñü¹ ”ß+?×–‹jv…‹y&÷äÝXð/¨w™ÊÔo¹~$,d¾R`tÏqØ#³A Uüì‡A«q&;ðí¹]á%Ióð£º8ò'©Ÿޤyûâ Æoׂú¦{úú¹ò"×€´íÙ.<ËI=+”³ŽÉÈü jLëž=Mc=Ì~Å*Ü{ö4O—Ч¦‚lÁ+æ+¼¸_¬ú•“«{iqASÕJâ^’©jž¨â• ?—Þ÷†¡gþ'w‰- »Ìùp·ëøšèÅ4÷ÁWšTj§ÀÓÊÊÜÐ4W†£Ý‹÷P:°à†$1Êrüì2Íä9Î|$mÜ幌KmIŠÖZ.… ‡ؠH¿;;£ï)±…xXçÐgè ­î½6»”‘æèñžó-;2ú‚VÚXLlÙ‹&!ä›:-€uŸ5/p¤Hiãc~;Ôk¡rlÄi¹få¦MêX̲éÏÖÖ «Ô–×D¤Õ]]ìÀ‰I;`p'Ía->yï®#` ôúr%{ ù.²â%€Þ•\~b µ‰Óq&%¾Ê¨SFX™pŸcë)Æ×q@zA£#}!¥~‚½Áèuóà’=ôSG‘ûlÍWÛ—õqÿ›$èê[®’ô;Ù>3ÉwYU4bÎ[{À¹’ïžç¶ªÕo‘9YFn2çAomu~UbÜö¢·)ï"ÃåÖÆ°¥›7ÒYÆÑˆ"ËØá‹ÅôÆÂl>ó”yA1@êi±âŽEª!¤øcYog¢š¾Fð#Z¡VXgRÜ[2!¨•Ù ÅâNtl;£œîãÝÖ«×®¦l«:'ïé2е~ÌiÝ~ßœ˜Þ³’“KµNÈ?"=ÏæU6{ðœm {ÓåÉ»<ã¬á|¹Ô]Ý)V6ôð×ÔϘTšîŽ8HdžM=1WïBÌi3Ñø”^ÿ‘Äœ4¢"ä˜u›3:€$Ï[ìqú ‰â ã«G‹¼ðÃõúbo‡pÎÙZ—böÑ7 çt{1!Œ|-$ÌãÔ˜A)¡›ÊP5°Òšôx!ÔvOÕˆÈYÂ0È\çö¯3¼»Ý±FÆUPT\Km_ã¼>\îR¦r\RpÊÁc°½šeERAC9ŸcZmÝ`Is“\¢UŽCÊ’óíqê ‡¥çÖè¹`És—|n‹”yJŒZ7߉Œl¼ÈÐð€ë"÷Œy9¶R<ïå}fy´d1ÊWdž^ôZtˆ¨«›³3UhGŸW_°\(‹—•uQGÈÕ¢ŽÛ–Áù‚ñ N¦ö¶ê=z5`†Ì¹§ã){RØýŒS”Þ9XÇÔû “±t:Î÷3®{z$¢]ÞKð™µØÍRÖ–Ú›åAÓ;rðGôÀó¯/67‚V®vÙÕ.yíkŒqˆK¢Í±¡)ŽPèN@ˆƇ;›«JŽïö¨€5Üï>y}„>ßàásÅq΂NÙ’¶]¼Z¥”PڜӋq‡5 Ÿ›Ðåöm3zØ=F„vÓMòàôìåÕ’Jü0ÈœHÐ9Â@uK i[íˆ"›rOÒ½6ùj’r´¦{m"¹ò.hîLD °…¼ËfOaA¹Kí9Bÿîü gÄ tP 4 ŒRxÿhÏ“¦€‡C£ G: “.¼âG9´1ê™û”mÑýrH P1Œ³Ó6÷!y4P´A©iP´øD‘š\ê¼aåŒe^ÿ5Xbž¬{ )ý”ÒGæa./qâ»íov§ß _™+¼9¨ô„#%% Ì§+"Ð!tÙ[)D¾ôða­ŽêuÅ÷.x¨7Ô1òb¶n~#óBÍf»µ“Më9Ì2s©œÎ±Þ“Äë(\ö(>¼÷ŽÛÚ¹§w(©§L—uðòÞQÚõ^ ñ¶ß!ˆ@±=O„v;°ÕP]ñÙyζ—”Y4y—ýü‚l:¦ü:(¯ j ÷!ô ˜…<»#ÐñÂD«D„xwsÂRé}bèá«j ׊b•ÛØ‚Ç¢e5Šœ…ï†àˆÏã‚$Æ=À·Ÿû5³¸(¯x“¥Í_“¼";°®6ÑdVž,vŸ`ÅBka4«{\†‹vû?»ëDÃ).µ§ƒ£ñìaçpKe„êáŒôö²lH‹Z—§Ï€wo¶öê‡ùsÊa'ÂÞ^i¹Å)îœ(*]Åè~,×¢úÂÚF»EÊk¡Q¢ý æFËΤ]Á±µ~Íòg-1È„f>=×h/`S -— ÷öÆëÍŠeÛ‰åMç)šH˜ïòh÷µýŒ$¬xטô‹Ôf ݧ¢)!Î ·t‹V–:'÷úÌ=.e³“Hu*hÓka·{qùb#Vîj»E×ò(e¨Úœd»ÿaé{Þð:º€í×{V–nÆä—GmS¢Ÿ Õ÷v˜5ÑÁIgUÔ§rÚ/Í T;FFÂUtÚ§%êzí„^s)•²Êº®l%!™Îiï!‰:á3zŠ&E™A7¼H#Ÿ:*ây¯ìëD/KYË1³ðÓÖ5+”÷¶g±ÇED—¿È|¥‡ÔO~5hÔñle¼ÊLè }`i9Q¥öqÓæøŒº^ªâ½'/PxÔÉ®Í{¹2ÞÖGž¡fjMC›¥e3C5^·bëÚ•à ÛÎWq‰·P"QßÙù˜â¢ÒgÖäõxÄŠ †ÛzsJŽ]TËŒç˜-\zPÙÆÎmŒC«(•öæË;@ÖXsÚÎwÈcµVŠ—ÂF…rB^XTôø3êÓ^WÐ-ˆòãµ{%qEÈLõîÛµø†Ò“˜ͯCž0Ïã×uj‰íR\67AÔ½ÎëN‘W^<Ù™‡£ÃzŽòi^§ÏMò|ƒ@­EÅqºvÕ:"[\?é8j˜Èe¬™:ßXžiKz5Äi2’+xÜjŸz],ö–é®éäA¦Ò™÷¥„q†„û¡Ó™×ªdÚ¹Ö,â ò§WÂã®EÜ+âêÕ×£=)žgñÁVm&ãa;êf[¯G¯>Ï‘™÷lá¨}tï¯ÒqôμxëÃwÜ÷RjÉÒ¥|÷½r…šB/HIï¶ÖÞ„Aƒ²¨nñ”æŒ@ïó‰Â3ï ×®mdCï#•³’d§š@j,nK58–ÖjXºêÂíD—%ËÚà÷tIg”ŽÝMïî£ÏRô¦èa‡ªÆ§ßs™Åå¸ö ˆ`Ôwá¼5cp£4ˆÖ¬Ä3ÙÈazæš»ú5 Ë ÅA¡sjÉÚ>ŽKúw¦ÂeBâ]d繕¢FäÛï¢ügõŸpÕÇ ]W?Q×JÞ=ÔÖü©:ÜS°’‹Ë­ØB[íÁ °çײ [åߦ5,®)6ÆàuÙû¢Flù™B¥í;4· íKr’ïNzkz\”£Ù{PžßyÚ¦ÐéÂvõ1Ÿ,A¹½„ˆÝ…H,{´L}ã“8€<ÐÂnTß™tÍ9<'ðÐ3I®#FRzeí9‚úÀ?Æâm6Ü¡ñ º¬žé£1ϰ‘¨‰çX¥Ùw‹?‰§S}¢Iký9!µSÝaN`:ò‚‡å©k ŠKHÓ~.ÓÎÆœ[ƒs†AåD‰áלβ)Ï4Pëï‘6œgèT¦jt¢ÉånT„?+T¥p´¿mDH_ ˜*+„uÀ¾ó•5½jó„a\ä<ÑÆÙSì‚Êååy{MWÍxN]CEÑ SYtçÙp‰ç½2‘mT>ÛdV¢Y6¤SòŽiÍ|¤äùÐwâ•; Ž úaƒ;ç‹_G¿Ì¹¥3V¤q´ÛE+h¾o†òƒnÁ-#GM.Dg W›_ jí„G…¸3‰F`&’=Ù¢@™CPHùHM¸€‹fD/€¼óDûúÛôν²#i¡›¶Z¡ŠŽìÑOå© ãôëFœmŽ_Ä¢JÿÊ3°vÎëÖfm7m¦*@xxx²¸³Ï³TÇuqxÔÞz„/]šŽæ²Í¹àRØp;Û¢ &,¨¤ÒpA[°3Iú… Òšr¼¬©@çÆ@å­‘*œIï‡;Áðç”÷¿­ç~£û¿ÿÜÿõK`«ü£û¿ÿÜÿüK`«ü£û¿ÿÜÿüK`«ü£û¿ÿÜÿüK`«üƒû¿qù8ùÿ¹ÿõ—ÀVùÿ÷’ÿŸßù%°Uþ¿ÁýߟäÿgýÿK`«üƒû¿?ÉÿÏúÿ—Àù›ÿwïÿþ»ü…ÿÈÿ—ÀVùÿWãÿ·ÊÿÏþï—ÀVùÿþ¿Oòÿ³ÿû%°Uþ¿ÿï“üÿüþÏ/Ïå¿yÿ³#ÂÎókt4w@8!LàÖŽ(gsÄzø?Àðw‚a8ùC`¸«Ä€|0Dü'þ÷—€$‹¼†œÎ‰£ %5UÐÑc²ªÊr V!!=ˆœ¼ŽüFTPX¤ã`jçˆtB¢ìLm„„ÔY¥·IâtAZÒaj!-i‹p2Y;9¡öÎH)V9”ÂÎI@Ç`™o¼I±â.”_×: skSG„“Ò%‡‹Š ˆàÚtB:Ù ¤Õ® ¿ÂЀpš‰SÌzùI-­AÚëZ RDÚ $…6ên“´AÚY; ,¥X…€?(7w+„ ¹£#+Èa#Åêèänƒp´F œXAN… ÃÚè“ÊÂxcFØ!L 3wüFs A¨ $ ”±@º€Öãç¥Xí‘v7ViIÓÏR¶´ž´nM¬Òj¦H;N;3G´ÄQS+ ¦Ò /Ð÷«[#rÌ­Ý?6!‡+ºÑ†Ò§¬jÈÔÎå„ëØ— ©"~¨ K€ûŽëã$ñO«;Û™ãËñKÔ¶f€íýP3V6(3S›/éø[’B€œpŠ+"ýM•„/"ýwyZ:˜ZÙº Hí€øJª)ÈÎÔÐ ›õ! H0­?‚$ѦvŸj˜£l7*ñJ á2B¶ToV£*ˆ$‡B»; ­¬@Üæ< 00lâTR°%ÂÉaóõÆ!›C¾Ùø×«B7«B¿M—Ž5Ò„v@Y9˜Ú‚€G€£NH3gœÍ í@NÖ5 L@H'+ÒÆd†ƒ«¥³ ÿ×Q‹n¢ý6j HOYGIã˜èú Þ!-­Cê:'$$NÖ( á‚Ø i‹¶A¹š:š“;eùuÌb›˜Å¾YMAKN @uHVYUYçåRTÖQWÐÖ)jhŽÒÒQ–;¦zH _µŽjh+‚ÖYõu¬°M¬°ocÅÙÈÔÎâ/v›ziƒ4Tèš3` S¬¶è˶RÙ4&ˆ0Èó³ÌMý‡ˆüºŸÕßÔ]N¾Ýî-yZˆ1Äë€pñH|Öê¦NC @«_§Ëéàälúiq òùî/lú™!›ª ýùæŠY4 ìR€UÈ\_Ï9m̳¸9vãý«êÙT`ˆØöNÛTÁÁå ’[Ǫ€k}+Kד@¼ëxùòJhäz’ˆÓÔ-aý%—7ûœ ›* ¸Ÿ<m,m ¬üv;l°A·FÚH aôêëìØ´ˆø÷P©™º‹sS`ãë$oêdªàÀm©@‚|µeè¦æC…¿×òG^ƒÌP(›¿7¯má°•Çjæ ^[sþ­jnáâuþáùú$ Ý41¨Ègl†nšücº¦%¯õ‰ßßf*tÓ‚ ?lA_+„óD°Jãó©Ô†jáX³®dZh';'÷zæðѲ?ª PîSÆ:‹>#sÓ¡ŸÛ!tÓ¡ßµC+„Ó'ŽX‚û:?6múÏmP‰ =Ö´Xïìù–´½ÄQðwëÓÆy2>æ9âž¿äÁ¦B?7Cè¦B¿0Ã!{5SÇÓŽJ®Üß ë#°èÛ,Éÿ ›æ ý|‹<Ât+ž­hD7mUTø|ÎEÑM+ùÇœÒþœSߘ¸QvŽN›•ÿ93E7í]üCÌü ùŸø½9@ˆBþ~oZ®(äýyî¦íŠŠ~¦Ó¢›¦(*öyÞ¦-ˆ~w]öÙÚNÈýèJ“´v9"=€qaja HŽ^)VS¤•Ýк³JÈv´5µ±‘Þô¤¢ì€Ý‘Ha¶R"¢D…+çu—°mqƒÌÜ7Üy¸>l¸ýpÞæBB®®®‚Ÿ¼À&j‹gu›$ÒÖ äè`þ¹'mgÅ 2µq’bý˜‚{È•bvì6V`zr°@8H±~4•Î^€ ë½’6:‹ãÇG?ñº[[úÏ­¸[¿ÿüç¿?ÿùsÿÿ/­òÿ Îÿ9ÿûKa«ü£óßÎÿþØ*ÿßèü÷Ÿó¿¿¶Êÿ7:ÿýçüç/­òÿÎÿ9ÿùK`‹ü-~£óßäÿK`«ü£óßÎÿþØ*ÿßèü÷Ÿó¿¿¶Êÿ÷9ÿýÇÿók`«ü#ÿßÿÏ/­òÿüü?¿¶Êÿ7òÿýñÿüØ*ÿßÈÿ÷ÇÿóK`«ü#ÿߟýÿ/­òÿüöÿ¿¶ÈñùÿþÈÿ—ÀVùÿFþ¿?þŸ_ŸË3þÛeõŸ‡|oœ€¿ÿ ‚E!8ù‹‰B„¡(.þ[,ýÿý+à_ü7 —ÿ›c¾mM‘vB¾mÈ÷ÿØàÿ§´68¾l æ[Qã늸)nºUëÄ„,„¿J?¶…‹ÞÄE†c¯3îL½éz|,ÊHD:®ÇÔ ®£ü9ñçÿaÙ—jª‡¿ö£!bÿITßwÿ7âʾÅ)%-…Còߤuk\ØO áÛTls”b«Z[ˆŠr²ÆÅ mjàÆ;NwM¥¿ñ÷ µŽøÛ¨öO%³5 íG8‹«ut²@¢­¿>»5 íG[Ý8Öÿ½f·°}=æë»rú΀Áf hÍz;ë#ÙŽ…<ÂÒÔÙÆIeµŸÏ ´ö 1o‰9ûÇ"ÚFö­k.@ö{€öБÇoE( ûÏy%º{öüRFÛ"FhSG Â_ÿRöŸSÞ LäŸR¦íd¡áìD¾AøßRÙ  üP¦à,AàoPù·”A7(ƒüSÊ€?ëqŠ è7(ƒþ[ÊD7(ƒþSÊ6Èþ ʶ„àýS‹Üs÷Ok‹þˆ&»DKq¡õü¿‡dªâÖBë“ËzC_²åë¡ØÿÕg©ëH=¿tõhk”ÂXò}=àúSdÕ¿¡• ½1ˆ‹Š®‰‹2û^kâB"ðÖÌuÖ'kU”ùé½þ[Ê›ÿ-]¸•ìF[ŸÇ”ýÈÔõ?bØ’Eaõü›1¯È¿Â·7ƒñþ-êΙ˜£œíœ¾ÖEñŸÑű]Tü¿ÐE0®‹À¼j÷Í.Šm®:Å„?[œˆý“gCoL bàÿ¹ûjþ—‡à:np[ïñwb•œ )ÜÒ X€ìmü­WýÊ((ö#sÃÿHÝÆÌ%ö•ùá/Ú6õà—ð Šã—Ò±Á°oòkã§õr_ãŽØÏàÎÆì)&öûpGÇ„¹³ƒ#Òñ5+‚ÿŒŽ‹mtþK-E ×7`gd‚rþÚøû‘E÷ÿˆ¶Þ3˜ð/íìSÏ_ëÙOÝà=ûµ£×3;›¯uê§ŒOâ‚~ꔢ²ªˆ÷_·ikbiñ5š7Wµ°Ï÷ǰÍ5+LìûüuA!?­Ñþ{Í•×v2uX7‡/®ªmº”`°_E°T¶yè ý¡Û¾MΩþ©¯£Ó——€À6÷ý°ÏÝ^°Í]=ì[×)}ï~"øær.ü¯×78çÇW–ù_È ¾é°‚‹|û‡Ï¯_ùW¤(}~ˆ¶MGü·á›û8äÇG—G8@î†ÆokÚkÕM× ÿOTMœWÇ ÔÖ¸K#í¬lNS`ÃÃúÉyõuÜ_kkê¶¾Y_ÿ<´-ò…þÃ7Ý€pè/²pœ›EÎåˆøºŽlŽðÏGHøÏØ£|ô¥À`òóº àü´Måæù|k.¾9Pˆ ÿ”½Ð–½¬àºÃ^·M²?”øæ@#.òÿk“ÊÇ÷9ÖÍ!D|ýïÏò7‡ñϯ$ÿ»ø/ñØÅÿ<õp³³ù¶mÎbâðÿ_¢ø\›ó£ø§Û™6>pÿ|ì ܾU $üù&"ü—ñ¿•ñ@¶ ísºE6éùR‘E6ï¿AŸåýE^ß‚mýJEp*mx*¾7ßþ}‚·F¸}>+þ5Õâ<ŸÊFñý(JàIâ ¡ü” ¶Áø˜€~ÞJÀ©ìø‰õ<_\±åùU",mP®¬Ò'g»ŸBÆç¾ªÏØ»y_5ðø™Î‹ü ç³éúhëWê<€S磷éG•ÞéUþ_ëü_€Ôé •ù)cøß`¬ùy*àÔC:YÿÅ{žÿŽÊænüœ½ðM•ÿl*þ‘φÿóælýƒ ÐØ¯ÔyR­¿;Tó@<…󓽘?bQ_HüS‘ üÀ¨óó´‡TÙq« xþ êÿò\þËñ<~n°Í<Ø¿]Û}ýCéú••ÿ’ÙÀb çÀ¥âÎÉàþþ­7ûbY»y xü?Õog;G¤•Â⟹HÌ¿äø&‡ÄÿOqèoäÝÞ<:<þŸêö+Æ÷´¹±‚ˆüŸb ÊÎêS¿m¾ì÷æ†qý:üÿ;ý¶@9›Ùüµêµø²çÍžCþôü§}âùì= `UÙi¹«HUä,0¤-¤ÉÞGšÒ6m‚½LR r,³;³Ù±»;ÛÙÙœåPA´ ‚È!¨ˆ (^ÈED *^€((ÊÿÞ›™Ý9Þ{3»3Ù&Ë ´Mæø¾÷¾÷½÷¾÷5OÏ ¹Þ@°æ®Dõš#&¡VqÔë¾g rÌÇo%@M¼7Ë®f«èpÜÇÆ¶Ë#”\ðŽ–P˜±ÚJ´šÜe.Ь9ËÉfVËYÊ cMƒs†G±^šs)ÇBÑš¼N6j`Ñé/rX d­DE02}% xF5¼wµŒR­bøÑœ[>X«™~4ÍŠZ= ð#¡ü„Ì{s°ÂÓÛNYˆ›Ýx3¥R;\–¹¼ÉÜïÚ>‰šû][^#æÓ[­¾øqûäÔ_ þô•$œ,ƒ‘îp¬;’ðsêû—õ2ÆÿNŸü~þ·æ\ÆñŸFùÿüüoM¹Œã?òÿùùßšrÆŸe·ÿøGâhüãþüoÊeœÿÓ(ÿ£Ÿÿ¯)—qþ§·ÿøkóß_ÿ›rçÿ4ÊÿéçlÊeœÿ™í?þÚü÷×ÿ¦\Æù?ò¿úù?›rç?·ýÇ_›ÿþúß”Ë8ÿ§Qþ_?ÿgS.ãøO£ü¿~þϦ\ÆõŸßþ㯭ÿþþß”Ë8þÙé3þþúß”Ë0þÙi”ÿÛ_ÿ›rÇúäÿöí¿Í¹Œã?ìÿ¾ý§)—qü§‘ýß×ÿ7å2Žÿ4²ÿûúߦ\†ñOOû¿:þ1_ÿ×”Ë8ÿ§‘ýßÿ¦\ÆñŸFö__ÿӔ˸þOÿmý÷Ç¿)—qü§ý__ÿה˸þO#û¿?þM¹ŒóØÿµùïë›rçÿ4²ÿûãß”Ë8þÛ×þ £¡°jÿñõ¿M¹ÌãO ½u0¹þg °F¤Zÿ3 ñÇÃQ¿þg3®™SÿÓÄ”Ì2ȩ̟å%¾˜ñ«€úU@›ZÔ–a]PÈ;ûdv´[Ãlú°rò1ŒÍ‡uAsl‘L< K‚æ•"~åN†©èÏOq`¦ yÀ­«E‰ïìDõBçô”À˜ÁX¾°Öi>oM·`Só¹Ý\î”íUÊ "<å21ŸgÓ¢¤”1åvTb Z¢}W»ÁÛ=°ðR¯%@²‹ E°ÛO*•R)¶”S Ôr0`].°%@Xì2è"| ÞQó›‹€ÂLj»æô€7Õ\öau‰g-'ˆÕ»˜rŽ…ËÄgd¸ ‚~€q …:Áø ©­Dë@GT¥X,ŸjRˆP{ï `XÁÎ5ÊÃõT,™fìU*σeJ›ÚÊ/püNêé‚ j}î1u ØÅEYìP,*(ÓI… '9dR6Ÿg´'hšÈl:ÏëG)Ãçó%–ãWW/—ØŒú;\óA;d°êv)IÕ[€JðÕ"êuOÜË…zס Œ2»™Úf] BáÐÆA™/¬â³€øEqPIËN’i´3cꯢº%œ-fr¢Ô®ò«UÌ1Lo…–ùÝÝm™ðˆÖ†_°­s”µFi½¥ÍCÆö¥EY ú&âæv#¥5˜ u´PãËD¿^Bsá Jc{—Áü4R%€w2hä¦|d‚uŒ¹|‡64AóШuCš=B„ #Ñr~ŠFæùl6¹tuM˜°Ì›¾l J–Ä@y³VxdÉa›*¢¼Xù»U†3YôŒÐ°aÚf¾ ¼°åRwsV«SÕ”)®kŠ ’%Ú¼[æ…(pÍe}/+Ó0BÍŽH]Ã% m4"Óa4t%^<Œa^fXV‘hÖ0Dë¥Â…6Ñé0†b)Åúbyªc{©–¡’Y÷(Xðb L†î%ïv)DƒE<²yvÔ¸ØÇš¹ØÇëbkT+Cã긙«·Ç–®/àá!S–•ƒ¶:@ ­àm]É •¹å©bmXÙÃÛ‰fòv².ÞÖŠbhìœìm*Öá=‡WÇ©EXÜRaCeti x¼Z¾ÃèZÍž&jë;Öê `TO´–#íö`wLuïYÞ8lSÀ÷äa Õ5Læ´èÕ± UÇ ñvZ±Æ)OISÜt äƒg´¾zvàFÕt ÃñY¡ˆlWH5Í2èZ…oÔwô&òGí®¥IWô™–b”0‰QÌnÇ7—uêSY§¦3€Ê.¡¥&Bb¥«Mcˆ®¹ÌQŸò‚ÈQëºÒz\µ]VšÌ.¼Í囘7|«ò ¬ÕÃä[Š_b$~QûÚ4>AøšËõiˆüQÓ$)5®¥8$Nâjo›Æ#*ÆærIÂ.IT¹Doª+ËRK1K‚Ä,æN7g2¡8Ú4n©Ok§7Ê'±  `uvvnGË‹®²ƒmšWC¹Ad¾ †,#Jy^FæJUôiÕ^( 3Í(d4¸Ôê^‚êå5Y¡1ÒR@ÎvzëüTèú¶ …õÅÄL+ŽVLNYϨ¼š•6ÂÕFAF±,p—Ëa™•duЦ-Ž–Ûa†Âö£Fyí(aêç$3øÂ{yn{,¨ ¯S+ £‰„H(*¢2Ç—ø"f,¤7ž29dIÓJâs’n2¥mö)ê\ꓸ‘®È|“fQ©¾Y}þ«^N¥ê4²=ŽÑà{uwP0As™ R@é–Îá )]j¦¿Z©>‹°ÒåTF¬µe±4Ž'«›=Am,”†y9" ?“ÙXnÒ˜Ô'DRàL^4ŽIh»IŽI­aS2&<ƒ¬›40õÙ] ©\Õ ®6ŽÈv𚀭GMòr,k„E‡^¤-Tv7(<È`pš3,õÙ4 )¹æ¾UŠlÿq‰Àq‘U×-¯9n•sb%Ï1éfL}öÄBJ2¹•¢Ût¢pt$½«‘§CTó2jÎÔgª+¤Ê2—ò¬6 ±í? 18 j³¦bƨÒ{mÎé ·›4DõYËZð’¤ Q|ûQ\"Ь&ÀÖ¤!ªÏTUHóÚè$¶ÿè$àèóž 4ùñ¼PlÖbVŸ ¨ÊjêÖRÒ8 +Wõ3G4{ ’p ²œ§U7(΅.N Ó Xm…ˆµ¨¹Pïrtƒç˜å®$” zéæ,ƒmÒ (ÙrŠŠÂ¤äc–‹™J/Êl &Y—^ßÑ$ªÚô ÞL´N 6@-WBΫ¤¿šâÎC˜¸s†Ãþ?è†fHoWnà lz ».Ü]ûP\ûU‡¢:…,š6Kâ…JŒd2`Ä:ö«¯-zr;GDÔËôð…^uàzºÀϦF+Ì]¡ kM/½C6µfºî"¼ƒú×pïì:²ÐÑø4ĦT×=™—™»WÙ;jMá`dwý,Ò)í6 RŸ£ÅÆEPY”¸<²x³¹·‡Ò½ëX ]æ¥rwOWôÞæ”Î`sOT;²tDk–²x70mÅ6Þ51¶quïÝ(9¸´jýÒ­ä ª²— ¼¯Ãb@RÉ..Ojâ"^ŸÊY¼ª‹x»ˆ+æ¯Ö[°§Äli݉]˦ë4"7,–¼b?5Ö¥ ÎDïÌX ë´æNÛu±6À¦õJñ2ó|™ªÏ ¥‹nL‹Ýרõ–-¼œ (´Öý’Åà McYÓhΩCŠ苘.–Uƒkß´];«ÜkZ:K¢Ó´Ae™Î\ãN¬¬²”y™÷áF“ø<çõj]Ÿ[·XÇŒ±Õ”þªŒëѪlÒp6*ñ!»%”÷–0JjJ8pjöÈÆºÔˆ ¨ ;A(B%çI*ú™±„áÒÉLÛ%LmÓªR µfA*f’/wEÏ¥ÁºÖ˜‘­* Âb=H×z+C,›¾45*GÕÆu ‰®’——]=˪ëßô죃k˜Æ¾m|_|Æî=–¤•Óvã1Mm³]}ÊÈ"´;Ã=Èm˜ed]Q{0゜c´O\b¶2º =x¡j×£m±Š~‰)W2¨^¢°É)¿>KŸâÌ­yå,}Z¸gKíx©^ÌÔAš‰*]0bMVèªÂ|Is£ŸYò|áÓvÕÕÆÞvýSVÝ’ï{®V¨æbs¶ Ys£Œê…wÎ T%EÓ!´ Ûié™Ùzs^Ãi»¼`—&éêóÔ'MWù¥ª„”˜©«‰ìk*½YatÙ§íâ"7aqÉI½#@ÐãôÞ“ª¦PVFŸgËÌhµ¼XV H8ÌŠù¼8e'tŽëî©äQi3w“ú«9ÙÀLvq¸f¦T€w—XÔÔœ¤Ö*‚‡DÍ…Õ]k$‹n©ƒÇå›Ï÷ÖŠ¬*­úJŠ1ÁHw8ÙN0¡@0 Õ•ªU†cÒ“*cV£ra ºî®®ñññN­ö›(v¡’_jÃçX P©/¢úR¨“z§]ÓrŽƒKµn¢ ‡¥\O—Ò pKé,dµ„ªu×;g{×úÃ]Æú¿ü´©ÿøõ?›qÇ?;}Æß¯ÿÚ”Ë0þvÚŒ,ê3.ãø§§ÏøÇüñoÆe‹³2,á+‰yCåÇ:qÐë?‡Bá@¼Zÿ9|n…B~ýçf\3§þ³“¦ök=—ýZÏÛ¥Ö³ºÙ¼3ô‚R‚¤–ŸS-«.žèðJ9lGÀÿa⌉QŸÀæB?$Xóª `=^¡˜ã¡©‰«Uæ-õöTµE=²¤ ”…ílGw­Sª3J< ç‡BÈ ³%a¨$£ø•%º‘N¢ƒQžr’ö€Óòz¹n ‘P5øª®M-îjP¶U•=õ“)ÓÅ…cÖ¶Nêj-᪀ä¨Ã6@UI_ƒë²GŽ>:U) ГVX[<]¨úÓ- 4}”K‰gš=ÔI” R'×±r®Y£MV!O5DÛ{Wòò0Üejs™,åWƒ&¨S¼~Tç=|‚^V•áÏ [„7,†¥##½à•(Pdiý5Öyä†Õ±óhkO•Ô½½iÌÝüî¢dj—*W®î,Êë'”SYeÕš¹=u4{QBÜb¥Ð×Q—7‹ü;©Ë(Õ®âpš’UqsæwÝv*Õ$¢ÄåkfÏfÛΔÎ*ª•™ÝWG%ó“³b ê¦!•ÿ™#$¾YÓ/Jœ¤S;( ‰ª´ÞÄöT¸Ø)ëˆFHéàXß°]U’öJVÈ Þ«iðFEäW,Åü#Àã­zg„Ÿ—V²Y0œ ó§?1Í?°Ú®Q¤Äºtž®<Ê©¾£éj\XZxX‚·EÝÊah÷aŽ8¢yf÷9íbPpäf´îƶ£aØÑšÐ4c;êhƒQÖk蕉LÖÓ›ž·¬¶Þ–KÀ™±ª¦oiç™$A«õí!Sï5¹a:¬ó=j\ç®õ ïZÿN½Œþ™éãÿ÷ý?›qÇŸ›6ãïÇ4ç2Žÿ4Šÿñã?šrÇÅÿ„üñoÆenûÆÿÄB‘X8Vöþ7å2?:½èj´º‰ûÐ.züG Öâ?±¶@( Füøf\~ü‡ÿáÇØÄèÖÃ)‰û¨§`vqéÑŒ˜¥%íó³øŸª&KA§¡agÇg˜…_(zÕ`Gª³zzf÷¢ Eš@ ¡3í_c]˜='­g¸èSØ3Ͻ¨£iï‘&[sà ¥j}1ßš}ƒfS{¶k§HÙžèŽF|e»M›Ëxþ›Fù|ýS.ãøOû¯ÿoÎeÿidÿñõM¹Œã?ì?¾þ¿)—qü§‘ý'ì3.ÃøóÓ(ÿ›/ÿ5å2Žÿô‘ÿ}ù¯9—qü§‘üïËM¹Œã?ä_þkÊeÿi$ÿûò_S.ãøO#ù?â3.Ãøg§üïË͹Œã?ä_þkÊeÿi$ÿûò_S.ãøO#ùß—ÿšrÇÉÿ¾ü×”Ë8þÓHþ÷ë4媎Õ77J&b7>ÿú 0Åÿ?èýÿƒ`ücßÿ¿9×ÌñÿGÎâªûu™YĬÐ 0­âðÀ÷ß×Ýþþ«ªŸºõõwçåïÜ¿3Ž4Š˜ºÕ—Ï;'ZZµÕØ—>ÕÇXIÃz,+ Ð=ÕùÇ|±RP?î?BÎÖSa·Ú£ùè…ÛÞË:n”¶Ó„ôÒí½éº!„õ2í½™º!Dô¸ö^®nQ=¾½×nv[!Äô²í½Ùº!ÄõFÛ{Gë†ÐCȵ÷æê†ÔCÚ{…:'HMöPaž%M22N¡ÐÞ[¨¯‡Plï-Ö !«‡ ¶÷ŠõBˆôJí½¥º!æ–ÔÞ+Õ Á0·Àfé|ÑÑ æ–ÜÞk»íX æV¥½·R7ÃÜkï«‚an·÷Ž× ÁÀQg¶÷ž©[~Q¡d¥Zr.¬[xuÉ«b“g)ŸÃ×µêÀ«Øâhìp#b_9# Î鯯qq±..´æ*ª%0Tšš³Õž#Ücž'# tq¬É0_,‹Ê3 8 Ü ƒ·‹ß²DÎa¡ÀsoÒÚÈU°@²SdzPkÞ(¹u¶pƒI"à¼ìލ!Qóò‡yIt‡ JD0ÕŸÝ‘äTEͼÃãe(ç®Içÿh$òÏÿÛéòÏÿþùß?ÿûçÿüïŸÿ›|þwú§iüó¿þoÕóžÿ ¸ó?LàM>Ù…º¸dÄz²ƒ{+þ¬ Ÿø§º™wªs~UÏ£[Ê¥ò< ‘g?õ¢Ÿÿ‚x$P=ÿÅBqpþ‹#qÿü׌kæœÿVBeV!õ|ÓçÈ7ã|¹`¯‘—´,nÃO”ò`ÀÊLNgd‘ÏJ%‰—Q†7´JÂdo¬Ì°ø]Ï1ÂMp~Y ú*+æóâ8ÌØÆO°0EØŸu¼”•ØÑ˜€›"ÌÝr‰-j·3bA¹ÛuÄÁÌ`qL( à ¨¬IH"éFzƒ $Ô‹D õ”«Ü2 ½ÚùØrJÈŠÀÔ¥f –€=-Nðe­)lZS#&Ç‚í+ðlü ØVÓQÌéƒ=ÍÃÉ›g3!4Ð;@É2ÚXáçe ½ddFÔæTŒç„L®&„ABU¥¯N0O d<„ˆvm¶Šò hކ“R·›p‘AJü¤R‘©&Áî;o¤€B(œèòþÂÕ¸ ¬€Ì ?­ÊVe$Ÿ–[ìûk•fruDzŒ^‘x²àØ8uXË%>#dÔLÐEVøZw:r+IâxÙñ¸0`0òõÃê*¸HhÀ´§‚G81¦*2¦yyœ‚˜<.jK©‰Ê ,ð’ ä"ìÆ‹÷¹e/4}\ªH@À0À¹Ó P\=½À[ê¨AݘTÝÌØ¢n—èdª4†äÙ4Ÿ×RHí1Õ ´ ¼ü.‰•Ñœnš”D¡XÛ•§$6“áËH"6µ~’‡ãgl}?-ƒÀÖä6pdRFŠ-r½I¢ƒÜÅ–Õ×dq`V v}¬‚)±[àehü•¥VCidKÏË£E§¬<Ú4ÐRRü?øæø„BÁHÐâÿˆúú¿f\3GÿçûÌe ïÿáûøþ¾ÿGsü?Ü{Ж4Ž6$05YÌÆ`úžŒÜfc‚¯ØnN< rßê¥{„›>EHÃŒ®ö!+iªÂg+*4”Y0U13GûŒ>%¡,BŽ¥IêÂ샆¯ÉÈ«¯Z0ÄQxŒdfñ¸Áwd¬à! Ÿ3Je)°ãaQêCQqXñ®æ§ëeÂÉ`t£˜…Xû¿FiOI(7°r&ÇÑV)°¿e0û«þcrµ7°èíx9Ž[­*¤ŽÈÃàþR¶H‰Ö’dŒÇ£‚z§>%¡\&Jb‘zZÓ&ˆ›®ú¯ÉÈ«¯àZ0 ÊÃãl‰ºD1}V¿ÃSX}ˆÃç`‘HwqiL\¿y0ˆS‡êÃ> ÁQ¥S _ã{lx…Ú‚ŸçÈMˆnŽQš€>·iz×wÁþ&Ö"ˆÔ5ž@0½«­¿¦.ÖÞ!¾,V¤ŒÍQ³Ñhj,dÊÜ =Æá´[ë¤0÷޼Æ+OÀÄ-ˆù7ŠÒ]P*Ó+oÑÃÔåœHãVÀ3ÌNcúžÖˆêK¸vÔRu¸Îb^.¬Y@ O…/)©7¨#Æœeußâ'Žînû,!ÌŽgÚdMä¶l°¢T@Î*t5Q\KN] °B¿Ö × ƒ˜aT(wgý “ûKH›âdÊs»`Ú¯p!ìGn¢Ó)l³#0Ô³áPT7‡;z„²£ ;“ÈBd‰Œ<ŒN%. pƒÄEÎÙc#¶†ñb+žeHв¦ !u¦Ò1Q@¯Ò!Àµ×J™[*P;ïH±lj¦îÌN€êXMnj¬IA€ŽKI-õSŸ$±Ú,µÝ€¾¾Ì}}u뤭€e/÷D(b&Û¢a²-{aüÿª†J¯pØÄÿÆã¡¨Éÿ/ øñ¿M¹f¨ÿŸïóçûüM¹Ï¹cd¯¿w€Ï_Ãî~®<ý\9ù¹òïsåÚçʫϕCŸ+_>Wn|®<ø\¥nråµçÊaÏ•¯ž+7=Wz®œó\ùå¹rÉ«ÃçáéÄo€—P0&ËäÁÖCŽ`Ô.Baa j<ŠW‚²H³¡ØNô\û@ðg6žÍäÔϺúû ýýÎÄùû©v©vEìA9D9'Ÿ™, ‹Z¬‹ ª ôfMgŠ~­±SGj^ƒÒ·–¼Ù H”tP `ß×µ¯vÓ ØEªé %Õ´p_E¦$\†nQ pø |€C2DÑ$„-(†Æ±†Æ«àõšŽ†?MÊt,p¯=?­Î—ÏO3~]?CT–¹7¾ŸA¢ŠŽ„ÐCçO> —S½¨§N f„'P:¯œ1Í &gLN·Þ˜O."ïÝ11Øí6 oý11  m^9dbÐ'ŽW™œzo6 No]21Ø-^W–&¸÷ÉÄ ÕùYz唉Aktر`öÂ+ÓlM6yeZpzé–‰é±ÙkĈߥ_&ÆrNÄã…c&ÆTï˜iÁé­g&»Å3ÓÐo\3MD6¹fzç›Ir¡£õÌ9“äªwÎÄ7ÁCïLR# Þ™†V¸¬ÅDtÏ4 q矉w^²"ñÊA“æ©`Fê…‡&µê›w.šXÌFM ~¯}4±­°øhâ­¯¤‰‹1¾’ä^9KšúmÙöj ‚1Ň'±áɾÏŸJþ§¬WN 6þÁxÀìÿ‹C¾ÿG3®êÿáçò}AüüOÛßÄÏÿäçšÉùŸÈœú‘Ð2HùùŸüüOS‘ÿI„þ "΄j?tvš‹Os.BÁ‚ÄðMJ,˜½Ž#IWq¬-ÑΛ¶Z¡V+DŽ!²15aÔÓZCÅÜ‘Áér˜( µ”'#îÓ©˜°ZÓ©q×b;)¸ÆšxÉ7ªá>xIÝ‘”Á . ’*å¨fî46”ßå,Ÿã8²*„í©à¸¡æ$8††Ö‰• 8˜iý]Ô@£öý%5)é IðQÝŠ™rõÀèíÓ ¢fZ¥~BÆ m¦@"ÝÅvIcðp†›ãÈ=á¶)«ªc5Ú{%Hì5ÚÈÀ' ÐN8©þ‘S~mE.U(Ö?;ÖOl2¾¾×ËËšþW eÅg?ÈB»,ÿîþìµãmm³R#›_>°nÕHÿÛðjîºë®Í›7ƒÛ›Û6_úä à§YòКᶣ_üu~*÷'‹Yyœ•ø¶Q!¼Ä„/‡n8yå{À§.ï™xò£Ÿê{Ï9¹ý©]_?pÑðã?Ûç‰OíóÄο8ðºo<ýö®ÝÌÁs¯_ûßÛî»yÎGö<»gç#ØŸ>¶L¸û[7¿YºåÜûÿï?_¼ðÖÃV|gÕ¸gŸóŒ¯ì÷òÞ_Z1²bÍÏ=|Ù’;¿Î}æ£W½«¼éÜʯÞxñ«ÌÕÿÙë//{ó¿¯îþÅ…{>ðäÊ[–ÃÎö¯Y~ëÒSÎÙN´Ÿ—aþŠ"Ç{:õÑe7ÿÃiþGB¿þGS.ÌüŸÛ¦ÍÿUç~9Î0íéÀ¢0üïl«{98BY2§\×ùÌÎKåÙ7ìü¯"³ù•»ÓO­:昧žzêÞö@ôŠ'Ý·í»“»þÕ]¾ÄçO^/®ZýoÅÜ’âølÙ+ïzÙÌÿh ³ÔÿŽÆüùߌk†Ú}›ïô±ùº¶øÖL(ÛÑæëÌ mø¯­£ ˜zµO0ôjŸR̼N_[ýÛ{—óY¡h ›bÐL Ür@àaYŠ£Ãà$N ‡ÈºŠüx*U ©TEž„¦:g]ø >BO:«***\ãQpðY¶’‡Á%í)êî@P?/Žb{€Â᪰K^Ñ(ਠ`7°#6°×IbiXl xÐø°ÌõKRC Ãö ×Vä†@‡H õJ¨Õ쨡hÉbÉx ‡è zÂÙA"g¯ì_“\¢u_êØþ¡áÁµk(HÒz²À©JdJ%+‡ÃGà‰†fMÿˆ¥ÿØþ5#«Ö®L†û‡)!+=…p8ôàG†úû–§†Wõ÷¯\ÝO ÏÎrºÈÐóüƒ|_±SUyCV½g§L±ØâÕCýk¦_ÿߪøá›ú¯á@8nÎÿüó_3®zþc1:ÑØ? N—³`køÿºwþuåú‹s)œFο&¯Êü× Ð­€ó_+¤X]¦×i`J ”e°¶Ë©[Þè"ü­¡…¿RiämàÒ£ÊÜ!«GU!–Y®‘I¥6A(KùTA䈧'éiJ1jz€¥"I`X`óე@ì„#×ÀR‚îXHq¼G¥<ÇgÝS/lC=Ž/É97™ÌœeÊ0ÄA‘5‹€Ž~w7âÛGHR2;ê¦'æ„/¦žðE¸8iå„¡¨¥N è^”*±äwF0s@²Ž` Vh0ó)½@ƒCÿ*‘ê—¨Òˆ§8VfÝ>nCx„$/fˆË5š¹&Àe/X‡ƒ MÄ]Õi˜±¹˜0cˆH–ØŒŒô,"Y#çd¾Eèó-K¤—‡Y)Iô­T4]nZM-YHåØ"—ç%Ê.çIÌ ?Ñ0mÂÚäD¹<ΖÜ->æjU–ÕZÅ’2£¯¸Äg»=\ªŒ4²fx0K†ýS(‚“3›ûh9#Ž‘%Aã.Úl¦fTÔ%Ë >fŠHŽò`®k¬¨ˆÀ9Jª¸ãJÙ²F7=s¢ ý°ÓHOË*ª“Ƶ¬¢äb8ô©Œ¯=×x)œ’ÙßÙû[ØKE¤¬n6õ}S§.`Äó‘±ä9²Ú™P@ÏÁî^(°K1ïR( fÐ÷B(°¯àP`[Á½Pà¤ìäH.Å“=>m7í8eÓ†°)J'[Ø1 lÅ=°î©À¨ n¬¾@mÑAô»mï"´ÞQΕ¶òG]…¸RɆ•æŽK‚̧Äbž(8B!£ñ#Ë}ÐwÚEÎÿê]`Ûú¿kþ×ÿß”kæúúù_}ÿO?ÿëöqõó¿úù_‰ÞYù_Éüì¯ïÄ쯔|Àžåõëûõ€ýzÀõ‚øõ€ýzÀ~=`œ5ƒ„Ù¯LÚëüzÀc°_x‰_دì×öëûõ€ýzÀf”~=`¿°Õ‡ÂŠÄ¯\e¿pލ~=`ß‹Ç΋ǒÿ¹j(ôÎÇÀ&ÿsþlÎÿûþ͸f¨ÿ‡ïó1}|>\{|øùŸŸÖáèaÍà\_hó×uäSmº#ôðÔLØœY¥ªÕåÝÓˢǵD¶²áœ'U†iÑ vér£Ä|¹ò\ ¨À£Hö3ç”BµŸEÖw"ž©WUþã'ØBI[ù½Åa#ÿ…Âa$ÿ…c‘X$ƒþ¿‘p$ìË͸fŽüׯ2èôýô+­/û9•ý ^ªÃ]ÛrA#Sèx<à%žÊ ËäAƒ1 6°<£í® .$[+ìJ…rbO…Ðb •$ñ#|F.§B0ÓG®$,¥à~¾2*ÁmMÒPšSûÝ(édJ`B(ÍP;×Ñt!,]’.=Ž.E—*®(º¬r’š,Ž7rÇH…gVði&äŽ@w$؈úrGK_„øO¥›øŸP,¶äúûS®™³ÿô?~üÏô”Z#þÇþÁQÚ'?üÇÿñÃüðŸwzøÏÔÿ°0ø‡Åÿô!ŒC@ö¢º;òt F¨®N}Å?c¦Ä€ÎB>Ç\˜³Šaüh!Rª›”C­`ÔÆEKE´trB6§ÈböÈl<¯êðþ2óÅý‹òÅig’;C']="•7 ì;4P »;?ü01W6¡ô¨¬ )“œ®½} RÈÁˆ;õ ¬cØIXõ^Œó*qTȰùVåe.«}e1ιzgY€ØÖ“ÐÞ¿Ï&é$DbëIè„ñÌK‚1 FH¼£ž9…Ÿ•z^—s3ÄHÝbí£„ÌuÁ`£â3^=F-; %豯Tâ‹Ü(Ò㜔iaM+ˆµL œl<ËñtÇR§s:îdN—3‚Ñ¿ÔsR~+mšÈÖò[Š.æ_Ô!¾¥n]¾Rv0âá*¶8ZaG)K‰SŒ1*Fß›sjÍUý¿Q×è)ý8 ™ôÿ‘h äëÿ›qÍý¿¦ñ†ò3g_ë)þk*Ö™§úŸqŠ‹7baÒ‘¼QÝ„bŽ—Y½RddðŽgF%¶¤0%j“ÓÒéŒä„2£~ÏùKñO÷Ê¢ÙL+£¹üd“®È 30Q ¯€ÌÃ{l¾”cÓ¼ 1ä'm¼ðš‚ÚÅSà’(µNN2äcŒæå@‚ŽMD£ËBCþ’yÆvƾkYÎbumöëîÐâ0¶‡ØcÓPú?¢î ÕIh9.HYúøR²îXRîØ’È’È®Y6ùz°Éz¨@N̓ÉËC†„Í+­K*M]1éçKª·•mf rZ º—ýI•vL¥NÛTä<ösÒFïBҹئ)ý¬ ?gÓÐIð=9òÞžÔ øôdx²"S"Ø4µŽÌ¶i=ÈX¦î æí Cw’žƒœ›ƒÊ#¶)8Èù7¨k­³ 6é5¨ôvÒ‚–Ï‚º®:JAÏál–:Qu’ÕœÔp–¥Á&Eut¦´ÑÿQw‡©ìòPg-Ç6Á]p¦$Àf°ßœXR©VT*ûÙ¥¨#æ§³i¸ã4t69èè³$svæè#ê0ƒœmú8ê\r#Ž– Žºÿ9Kg“ÿº^:ÉñFMðæàÐHµÕà 5ÔyOMÕƒÏÓC=XÙ›U)6U*oØäð %ð°?\9JÔAÏÒA%±Ó,¶)8ìØÃ›s-…ùIhªhGIŸËáQ‰on™9&þ£ê‘ë›øÏX h‰ÿüüM¹fŽýGÑÎûù?¦á§5b>êê˜}Ö ûÀÓÀ>Þ.â*ØÃUœ‡«WÑ®;\Åt¸ çpÉá*ˆÃUü†«Ð WQ®6\Åj¸ Óp¡á*8ÃU\†« 'Ñøl@\®@ó¦ Æ£Ž r޲HYó Pžk ¥€x6“S?ëvò‘†!i\ȇê÷癣9c¤Åýo)?JK o›XÕœ=^—Yu©Pd¥IϺb®Âîû¾£ºþ…½ðçÿpÏÿÁHÍEØÔsž Kž•–åØâ(o“lÅQÇ"ö£¦ðpV9)Jö$óbìc޽óÊ[X¨ùô¹á-lë)@m믙åÕmÚeF#R©:ú ÚTwLâ½FÉKªˆ”ÀKHäeÔY©eSßMž¸èuT’ÆÃ¯y“ÙËQ¡lŒ…Mê8#œ)_ &!œ²++Ëš ¥ú¹³­*Fß©2v…þQÉÊiÄXÈÏbJm9-XU‘c­ñª:«©%Ä)aÐzØ«u²%’oêŒÂ:ÁÈ7ç6jέÚÿtƯmL6ö¿X ­ÚÿÂaXÿ/ûùß›r-]»üøŽ`Ç@¨c Ü1éˆv Ä:Öu,ë_3Ò?Ô1²¼cd cýªŽåàÿÁc™Óæì–+ò¢,[ò“ÝÈb6Æv0}’Àæ;˜>?†rUt0e¶X^ˆ&dÏ9cÂ3²|Ï(‚gk7“  _BèÐ@·H¬¨i“c>L£|ÂB †ÔÇaüã€òxYߺ‘Áµk˜Ó”‡ã<\ºÁ”ËsÌs@w; "l׸ÀÉ9íÓÝÒlfã¨$VŠÜ¢Œ˜‡æÉù<¸²Yø ÍXðji‚)‹ycæ§ð¿ÅøÞíV`¥QÜ•&Ào%0£…â¨ök^(ò‹rjËÀÄ@ ‡M+²cÓµ]2›®ÑÒ$í rÃÔ7(Lah¤áÞ"Im\T÷ÈØ‹3æŒ,·4XÇ(q¥[}5>Ð7ˆã3¢bSëfŠb‘72ªž›ªO4 û"Áär=ìî1¡,ÀÈcz9qŒ—ª“Ì Ç>¸²Y}KVÑ@`Ú…W&ži7²è2±)'VÀ)ž™Ÿ %£ËBÆF4Ô"ZäêPÆÇÓ*dƘpù<ná_ ñY²Ô×™9¾ù=8[% ,ÔšwÝ+ªl{[0Ðl­eu~Uk…³µá¯cˆ²!ð’å«”1Q׉<Ÿ˜3ð¬3+±£ÐbcZ´ o…0ÁsLA,Šå›áq»S2Š–uCýzh¸xºð¼šÂÿªëð"Y,u3´øªwÒ¢,‹ÓM¥7!ý-u!Lè×qõ½˜ážú¢ñ¦¯vË€XYöÙ ¨µé<¸…asóDY̘ú }ÏÁ ­×‹iþŠøo)—úÝ: © Ô­Ib^KcøŸ¶¼)£œP6Zë‚u7«=þ«6s K• b$¤2FZIIÀZ#‚m‚1ë6ЍÄì¯ÚPé¿Á,ÿ:ÜPdžw¥:{àQ­›z !³Ø$"2Љ&R•2ÝÌx,µ]á73燘¨JhÝßÈOa[%(ÜÞf˜: %1óìt1IQ¨ æu…¦Œi«oƒÛ˼¶ÞVQš¨ «·)ËQ*cl¾Â;¢‹qðZ—0C¾€|ÐÂ-ÜøßbnY°UòìòrIÛ«Œr,`ëÁÕ+¯n áVö:”PûZQÀ¯‡×õ­éÌ;Z­NÂÓtÛel˜¦· '¤á-pk†é­l^7¼Å`eÄÚ×ÌèP¯½U’ø’$førY”ŒoÅt˲†8&²Äæ ­œUŒ9VÒÞ1÷½–Îhõ!쵉ü¿×jË>2:~šîÀöM•Ñc¾œYÙî4Ë™¼ƒ^Ž(ÿb¶ üTÁ5¨þWeFup¡tÃÌïÀÿjµ£ñm­&¿¡®ÆÖçÚ Ë@!4ÃÞ±$à ƒ2_PÙ Æ)ðÓ€ú'¡[b4ù©Ö“EÚ¹]uûDi;öl4öÄ¢ÑK,âSé1ÂHz±ªƒ‹æ§úL;¢bŸ!l¦'f± hÚhi,k®„?\Óo¸FøB)ïÏ0Û!3’~ZŒ˜?ËfÔ­c%¶Pö§XÓWE’‚¡Îq,ó0"È"õ‡ÃÉdíh¾bíÐj Èi¦LÇü€î˜Ñ¨²ÑàšuëGª Êt¨3~oPë%–Ç8U ùÊÁce¡8©RÌ­9c Y_û. õÇè¶N_}^ &¢ˆìœ !›AM𩣎;ø4Ï–ÊŸö“õ%¬á4} †E¯ð0[OÈc;0>­šhªíÓ°êøÐ,a+Qu)gø‘Á­{Yìÿ¥â¨×8lò…" ÅþŒùöÿf\¬[³r÷9ûÁ)¾ûàÀò!ð/þ,Úu𷸱÷ÇàŸGûV÷µµ=þë_®=.~ßWî?N³ò8+ñm}œ˜æ™Á;Êñ,7¹é>¾¼tÒºU#ýàß­?|¤ý°›î}øoßù¿Ç{òߟ¹þéënyæ;?~ý¬ßø«ßüé¾û~ö¹OÛòËO}áåó¯|âºÛ߸ñ–ïÝu×7~÷»‡ß|ó¯¿þÒË/¿Ð¿<ùÄãäFO:è€÷§Žë9º{~!·þí·ßþÝ]g‚ƒä¡5ÃoS¯¶‡ö›ÛÖ¶ÃÛƒËûF&žL_¼¬mç]/¾¡»mW†›¿ïyç}ô£ͲÛÑm_8®½ãˆ#ŽXµÃÛfŸßyyÛŽsO꘵+sçq³ç-cGfóÒà­Gú¾ÍmK¿½ü¼|ãs‡¶·ëëàÙ>¿kÏ+}÷»ÏßÎW.ݳ{àúóoßõîìÑ—$ç­›œ½cûÜžrâº÷î^¶ààÁÎÝ´Ã{?úò¹ Î~弋rðŸfÍ>Ö-ËvœuÞ¾?ùè3ùƒ'wâ1'îsÈ#»¾gõÎç/¸¤—Ýùáóö¹øÝ;þ4çÝ?ÿÊÑC‡œsËŽ«ŽY:{hŸë/è›ûàÜ•Á9·¼k¯}~¼`޳vœ{î¼_®Ëåî¹k‡=®ß÷¼C>ð”͇ÍÝôõCçV~üîu»0ßÛùúwÝ2 4œùÞ²‘]÷9déõÏœ~ÎwºsÞ³Ïûâ>w寻áà÷-=ehçC¼{¯>ºïOv=ÿÓ—üxî5óŽnëûé¡?ÙwŸ/þäУ;v^ðÙY÷àœ'g½oö7=äîçžzߺÂRfý)ÁÁó_úî]?À$“›ÛNüTpv³ëìÉeËÞ·ìí³²í'¬¹îð¶§–Œ¬¼÷’7ò;%®8ùƒÿ‰^Ôó§÷ ŸýâÐ}_¼ôп¾ÿè£gÈ<³óU÷ïž^·é§}{îqÑÜãÎßeögvö¯—^2ÄLî¶sñŠ×7ëÁm—ÏÞ¿-Ò÷fóæ|oóæýçõ>ÅìµÃï’¾âÈ÷þt§ ³>4û};£/ôÔSsWÏ]ÿÔ9—\rÎ9Ͻû”àu‡žÜ4pöŠžw…çî:;óá¹?9eÖk;ñŸ¸×ùÌòî=rnç»á ¿y×ówœßëøãû˜E»ÆÎé?æ;],ÀwôM×ì°ãqÇÇDÎÛã…9÷˜ûù)ûîúþ!n×¥ßÚÜ­}ÏÙ¿Û­ýìËžÚfíxÿ'Ï™7°ùê¾ýîßܹ§|6»Ën÷ÝûõeŸÜyçöãÚŽ Ü·ëíß\öîôÑ¡^=ë–9·ìuïgvØ•)-‡¹:°%²Ãù ºÓÐÝïöÙ<Òvÿæ/Ýõ¿ôÇ÷Ÿ•>»cVyßçÛfÿüèãmw1»¾õè×ÏùÅ_Ê~éñÏž¸npâàÁoíñåöK?uïù—„¿2çCÇ_ñ¶|öÉ'ÿö×£c‹˜3z7´}ÌÚ¾cwÕ—¤G†9Šü3GúbBÿT¼ÏRƒ¸…“ Óq¡RÔasV‹‚P«„å.¤9D i6õ‡R‚¾žm:¤`-Ë’HÉåâ,H3d“OFçBWsjv jÉBKL«VµGi6Üv"AîCÃÑñlt|­Íƒæu’pÄœtÈody…–+ÃY6…ØÔfSÀ¦„ð6›6Y‡7Ù° møÅÁd¢„<7̈ázÒ4Ô³Ê$[6W´LLkA—Ks¸þlŽòt™àêòt‘cûmËMZw*}ÉI28«7iÝ6,5'οŽX!»Ln6çਮ s¹™3Fér¹5œ.Äœ{Å«|!Ql®ïò…àá{–/ÞÃ|!xç !!ñ0_…7ùBâXØ^ä 1s½éÔ@f~GµÓ-{ƒ¹|ºŸÔ¯Q0åÞþm¦ý/ YíA?ÿGS.ßþçÛÿ|ûŸoÿk%ûŸ+ëÁxèÛÿ|ûŸoÿóíÛÅþÇCû³ÿ©iŽe‰RÀ‰:˜˜[WABÑôÛWü3Ytù°û‹@Š›\ÇÒ ‹ÎôÎc…zç$Ñþ¡´{H)¶IG*@bÊu²ê‚’Î>dRRêš+QÌdö#HÎhŽ@Ó A‡/^÷ð9W³„lÔ, ü&WÓ'MÍŽÒ/Òè¨H'Ó”h´©áq½Ämq ÃÃÝÐk‹%AÅ2A«¿@ÊŠ›¶fÅíŸ%6#Ã4±bÅåd%×¢ðõt¾žn¦^VýŸ§ª?tÙèÿB±HؤÿÿøñM¹|ýŸ¯ÿóõ˜qô•4*´¬úÏWþùÊ?_ùç+ÿ¦ò…Ê?§üëC=²µ`¦#?s3SaÎ>Ž¢ã!UÙ SŠì€^ûø[õ ßu€Ö¹Ðk©:â¤Xÿm*å@$@lŠ|™™`70% L8(y´œMsñÝô¯¢ñ$xŠèÇPCSÉËz9,û`NOåÅz–¤Žƒ"q)#NqŸ¨«¦6ù˜·5u°¹Ú¼©©CM)fÃPWFL-›*v\BCË=ÛPÌõ°Êp‰ÏÐ÷zÃDêQÐeFg‡ƒº‹å8.bÏ ¤àá{V ÞÃ)xH!!ñ°@ …7RðÅWLs€Kèp N…Dm.gÜ‚<5£S± bäWKË=[P1=À-¨ VÛsˆƒÞa!z<`ÜiùìÞ|0¬ð©ƒÖ²A‘ƒ‰DëÏBÊ,YHUhH„¡L³º%¬ÎÒ (i˜©JDG HÌnÑ*+Újm4ÉPú¢Èàá®Ðmš¬5ôt}ÝwÞ…÷ÿK4Ñÿ/G¬þ!ßÿ¯)—ïÿçûÿùþ¾ÿŸïÿ·Ýýÿ\yÿœ}ÿ?ßÿÏöcßÿošûÿå ÿ_çÿ§8jIÉ#µB¸Qû‹#ûHˆfQ}Nhj#G.4{Û[ª‹Bq*¬Ü!"Ön2"ÚÀ¹ô¡f_à'Üv2iCt…TÆ2¶Ä¦…<ùiŽaóUš j™ÌǪÏ:1/d&—A_;ŠŠÒ¡3M¼ºÚKO‡ÌV ®áÁ"'dà#רh†x_å뱜_UýOmt<Çaÿ‰EMñßáX$äëšqÕ¡ÿÙžêMߣêlæôd% OÔ‰Î0…a²%p€Ê­Aµpw6/RL>ÎP™ó•bP {Ô«°#T0RÎ-¦¨-&°xS&”M 2iMÐÛ£®š l†ÂfÅ$„O#ëÄqÞ%ø üTŸ¹OÜLVñìXÃ`‰4Y[â‹€+ @‹e^²ÏK`C‹GCëˆCœLÞp qJ ×b;‡y°– 2e+¢#!ÄÛpŒ°éŒžP¢q°˜ÉW8¾ C/×óf7s6•8@¿¾Ä¡Y&Vh+žÃŒ¤ªn5t‚K zÈk0¡+Ó±„öQJB{‡sÜQ1µñå¾ÌÆ¢8žç9Z*(ç%M³WBp°¼Bª¸6aSªWR©'™ù$Svç(aâQ½@Q†ÚÝúÄؘ%Lh°:¡=™Ë¤Z6Ydê)A*­[-á.S]ácH°LE* 4ÀvlÍœh\Õ‰§ñÆ—@g‘•æ<:¦\ƒåaZ $)7EBŸ›Âwy‡:Tí¿zÓ‹Ç8èößp(˜óÿ£¾ý·)—oÿõí¿.í¿®­¿5óÓv´ÿ:m”½éW}¿ïöif_íSŠÑ×ÁןÕ/ç³0“SƒÖbç†Vç¶Mç&=çö;ç&3“}¬.[œSS‘ÁHäÔ(ÄA£‡3 Á‚p¼bâI0 É8ÐUäÇS©²PH¥*²8 ¡å |¡'Õ„¡>]ãQpðY¶’‡º[H™<Ï+%³ˆÜxèI”¢ÅTRH"Nü ÝEŒ3@œ•ÅA,U¢zˆQ@'‰æÀø¹[K¨ ]Mø‘ÈèÆ§dœ [u˜KIös´Ñ$2Þ(/»#y€¸T© äTš œ6 ô†Wd‘W*I¤d;s.þT,×éø*Ђ(P=áhkŠ=ìÆ["_`§$zÒoâ2cÆ`“ˆ›‚#á°e›L«´nP¬ªû&mm§²¦;éÈ®Ñòd,Ò©ŸJ!â @ÓÝüh+$.*àjÖ|Jê`a¦7¢IÔ1E¸òJØ”l“C—‚%\/°Ð©IiÃGe'„¯ÌKcB†O 65H(XBTÖR°Ø$r§AwÐÝ-­¨K’‚§D«iAëƒدtô­ Awóö£ë ¯Rg{NÉuâb•¢o9ÕÓaΦŽí„HíË"u ì†w†(´æë‚ôI*é‹@\t)ïR—Õô¼uÃ8Tèt¼uC*ô2ÊøŠF7¶ }ËÑàÃ=ZÅÒ˜L¡±M^ËŽ†„:ÁT$’]}±œôBÎÙ§&§á N·q5}wㇱÚZB £TåLc‡3bDjMØ#6[â7UàY@k>‹<›ÊDR¦1ƒEÛ`!š$L܉øÚè66°ÄÆ—½8Õ›^öòTo‹E@ŽàîP å^u%²jÙõQŠ8±TÐ25ä‹vþ£ÅãÃu”®4[ܘBž¦‰¼T:¹>rPiå(Jm½KA‘J{O¤9jë]K[Ôö»–¶ì +'ɲm˜m¦Q—‡*™æDÛ(©]ð@`tß½ÀHå"¯F¢ð[öNž£.ÈsdBs·ku2¹õº²1¨¶êÆ”áN0À-§Rjl+ O7=|°ÝdÄRcqò¹C‡B€õÎó ÉÓ! ŸÖh[sc£à„JpÑË6F"ŠLd†Ÿ*PÀhHˆSaŒÍ œæMájë'ŒD ú‹Œ\„Ȱ£]\BïýýçS©t%›Û"ÎÓ½ <§zÂ$»¸h†X×G crúqR"»d¨eÐíLL†ÏçË%6#GÁæ«Þ(­ Ý !õöÈ€?k[ ‚œ¶j§R£°Ù©T@ÙuÀÑöØÎ€å«À––´ÏGòF¤KÉ\’ §Á5ÆœàN*5%ˆü£ÊXõ}mϺàL•v¦œcá,”øŒ ×Ðd0ŽÉŽDG0ëG´¦› 9I/B€ ¾z$0BïmüÉÛèìœØA{bCù+¬'Ú‰¼6oº"h2Ywĵö8dßcXr4fíÁôóTß³¢³Ò3øŽ]Ç¢‘F†’ X:¶ï<»¤»Ôœ«ÄÌFL÷ˆïè; ^ S†À7i]MÀI L È<H°ór4Áh Eã0bOÀ€Rÿ¹Öe˜ CDê{¦¥ µ¾m»Â„ëgœ8j–¹ßQû~ó]\:©ïÏÐ8¦×”·ô}ÄI†-}·íq(VwÁdÍ&,=ŽÙ÷,PiÐH_…é)橾‡Ø|5”‰óªcqGËy(Öµ† ¿ª;øÀ´¸;JÕE¡H(jd½ð’$ìI’µôPËO„!‡ýËzR8ÉŽDcùXØ#2$Mò@Üг~¤\ÇÊ9ül·}ÝD —ü´úqHŒxýÄLĬR“Û|ÆØ=5+†ö/ë)á$ ,•)’ämÔ>I² BØalZ¦GÔ‚ Õ?r`ž%3Ö‘s °‚ À ƒÏ^ë¡*Ù:rö/ë)ÅLgíúÈÁ; wÀ )âà%#xðô¡€`àÂIŒò(‹®å$ÁÀF:ÂÑ@G0A‚„*Ã~ò„ì˜%œDÌ’Œ“Y¯åª3#QS²Ó¹1Ò¡ŽD”€ÈH1Ìä„àªM ¡qˆÆ#”q€f†B°¢'A D4¥ )C˜í"0¦'$a Ä;BA€%‘ì€ñÄ‘àx,ºŠ©”Å‚h$B‰#2i<Š ªŸÞ VC€¡ë†uËWñ¨uùqpzò›0®(`X—Bs7V¸²yYOxôä1Q?±Ý8âÁF6ÐfupØŒ"‹ž¹Ë´ˆ<1œ|aâu\2QÃw¶²&àõNR‘¤•,Ž` yãˆÒšâN¾0±œåX¥ª°¢u“ÌØ k%‹ƒ&3I|'Q*V ]œ~bÒ28L ë1eÒ`¢c摃“(PC7ñ2(õ=ÓDK'ë±Îpo³:8©B’…j¨¢µvœúžiùÄ%º%v8Ãy€¼Ïf9¸Õ626”ÜÁz£8`æ†ãÖÁZɾÍÁP 8a „ dF1›ˆZGš*ŸA=EIóD¢¤Í—º“ý: »  …bÁ …è´ ÚDUaˆ21 kùCäóM#o8•^£q4A¢ašˆx0‚‘’¯a°{ÑŽhnY¤>€U€åð :ð$"Pì…d•#Ž;ŸØˆ­a0‹B ÈÁ0™sì3jY¬ÈaÀû!ðoŒ2·˜]Ñ^\…¤'ˆô@t¥ -†:êÐöÙ<ÿ¡œ‰uÄÁPÄID‚úbŒl¯âX.Œ 2Kå¢h2ÜXñ8`ÖÍ@…™U,åŒÄËÔ#i4àG`ýG¢8e@b˜ÅNų–/Ð{P$Šx¸ÆO¥1rW†eðª 0!"I4*¡8éÈÅâu[*–~‚*„F¡q+8€ "á¢Ks~W¸»‘º÷Dpj„Àˆ€Iò ` ’Í-›Ž'æÜ9ã‘H n±šÃ(}èpÓhœ [& úRÅ+3ؾnZVc˜Å©öÑT(/#H°±PÃ*ìdÙlW­™ÐûCÚk&¯öÞø²½ÉÆîÄÙ…\ |×½w¦ëž'¶þ»ZÈÔ+6õ߃Á¸µþ{0àûÿ5ãš9þŠ;–ŸÿÚùüùõßi~ýw¿þ»îãiYÿû±_ý\=³2øõßýúïSUÿ½#ÛJ¸È¶ub ÊG”àPgåÃæÚ‰”c4×ÕÕctR=ÖaI3]Ã!¦’$fÀ)Q +G±™-Â߉ƒ¥î¡ö‹“Êî _¸N|+S2;ég‰•ÇÊ`.¸Ås†Y ´¥~´u7Â%|jF–ã'Ê6uœáÃt‡O⤔ •DÔ¨o;—$KÁrõ¡<)qÕn»‡á\÷lºæÔwÛ?í ÊÒåÌý ]yNíhX0ZòbëÌ- ÛhCåT'žUXàð)®³9«Íyò:qfÂV_ @¯Ã‹A÷Ò”EXûõUýËõUÓÿÊc!(¿Â!÷]ÿD#1Ký×`È×ÿ6ãº`Ýš•»ÏÙÎÆÝ–÷öÚq‡¶¶Y©‘M‹À/u«Fúß~ûí¶Ímà¯6ðOø^wÝu ðg^µ+øg–<´f¸íè…Påþãäa1+³ß6*dC€Ù˜X1B7œ¼ò=àÃàÐ ö«¶õyžå˜•ƒ+˜á+ÉÃì/1Ç‚?¡ÎÀ¾³³Û Ç€/.\Þ72ñäŸüÆœöìÃßÊœù…á ž¹¹xë^¾ý‡Ý\ôîÏ]»ìtÀµ“Ÿ:xÝÏw¸ï¡g¸wÛWÚÎyæììw]ó¡ÒÑ<òµ]öÙ_¾ø·óÒ{<ÇÜý »xçüßž‹ÿ˜»ó–]}ÈŸŸú`î/¿8yÿ3ÿ{ÉW çݾ`Aâþ_¬Z±èø'^øà¶ÿ¹éß“ßüè.#ÂÓOw½ñÈ.›.;ò s'~ Õ6Ø¿fù­KO9gŠÑÅ…±ÿÀŸjº:pØÌÿX 6ÙbáPÄŸÿ͸f¨ý‡YÄè”é¾-È·M±-¨~KNGÜr¶ Zì B$‚¸³ i7i·i7i·i7i·i7i·i7"i·$iœš“ˆ\X”4›•4Û–4˜4[™4›š4Û›4¶F'‡ö 4´¥qö ¥n]¾RûÊRAÒ™KæütШڪ=×4ºKùQZöS›p˜¨ßˆa•¢¸E …"+MzÖ•µ+¾‚ÎWн/¼ÿ§gGtÙùFã‹ÿgÈ÷ÿlÊ5CÏÿþ™ß?óûþŸ¾ÿ§ïÿéûnÿOWÞŸçQßÿÓ÷ÿ$œ÷%xÞ—pçý!5$ùxLM‰|W ·)>1öÙÑæ³ ã![y¦èac×ónšö¶¹Izs3àèxx§¨éœ”T±*µÇÚ¡UÁ²NÌ ÊYÜA®\‹ÂX}hD4B ¡·KÚ º´vGà('ë×k)zÍe9>³Ñ¯5s¼¸Õ!`‹à(JQ¥Òª Îèï@»².$¼U×›•)F,jîjvTÈ4J‡ž¨u(­Eë0ôkµyyž-VJî”С0• ôÝQ;Tt~³ñ0ã!ÀïFp:3ÌZkÃÌ À&ÎfšécY^,»1Ó„‰Vše ;Hµ§`yh- 0L/у6 ¡]Ã8èÕÁƒÔ5Qº†UÁÒ_„ç¥e9¶8Ê£ZQÔ5;cûŽQm[Î Q²˱5:öNÓ)[˜_ÿ†[Þ¶ž®·IXd6 PSr8J¹nݳæâ ¦Š·X¶lrpØ‹Hf»==÷†ÃŒÝÛ¬î tÇYÇIð•Wèìå u: XÌR @N·XÚx4¼O™Ë¯¸µc›ctƒ8¶Zä<9Μl/0Ú](òeÊâlß÷Ý**5“:ÐÝil *)è*yÙu¿0{¿¹_•bQ(ŽB®pçËfÚËŒ®l5D8úl‹‡"ðØiœ--f¯*B©ýL4o¦“ŒÒrúy¦É#Ÿ_ +=äܱ Þ‡À;?<|ÏüPðà=ôCÁ#ðØ…„ÄC?< oüP"XØffµS29\„mÔ5lö"„C|6Q꟢*ñlÀèfp @Õ‘²ÛÔåò˜Ä‰ã—G ³"Sð:’Îâv™æÓi+¤9p5{Íù.ìÓ'8W¹†-"Uå*ŒiJÂ(·€Á3Ì)mœjy‰àÍHMF/ ïâxU¦5~Ró;2Þ¯"%Š@Ô¦‡hÚt™¥Á$út…äx°s>7geÐ9Ÿ£v9 °çòË!&z3‰Ñœ®É ”%¦DdEŠƒ¾ãü:& ~fŒ‘ãqQòD¼r´ËÿŠÇ­ù?â¾ÿ_3®êÿççÿð}ýüÛß°¹ù?ÈœºÒ2ˆøù?üü~þ?ÿ ÂôÉÿÁA@çõs+D©ÀºŒoƪɴc1D²Š/ŽÊÇC§¾M&#ÕÏm9Ÿçe^¯_ò‚´µà©xÁ)ݽé”äýdÄå¡iž„Ð#Ó<-¤ÙÔºû„㑌ÏZ‡¬eYÝ'‡µÉ'­"âÍë ÔÅ%qÆ6 œÀ“*xd3tÛ J¢à†£ãÍIzk¹Ž•6Ó|&œOÍI‡ ÆÓåZ® gêñY=îE6lJo³)`“ux“M Ú†_L&JÈsÃŒˆOºí#l¢±e³GX aÍîfN¼tiøÃD ¿+÷ZóNå±mÐ ÝÿZ³—Œã’“å/L¬áÊk×<[¼1šü¬Üæ 1-Bžûiàá{æ§Ç~$$úiàQxã§ÇÂö«ÜÌõ^‡1Y½Ö6ußPè ½¾ðù?<3ý¡ËÆþþ³Ö Ä|û_3®jÿóm~¾ÍoÊm~~þ?ÿ‡ŸÿÃÏÿ1ò`?vj¡#$ñóLóü2´÷É8{_£#³KÆÈª¦z9Ÿ¥Ø)“$e2BDÍîh›NÛtJÖy4CÀÃ2K38?ŒGlãŸ;'ô0É }œßGyÉ®ˆ¨#£‡ÙÜÑÃqÅ?“vÕä×ìBÛln´ÉŸ|Dš¤W%HvqA#×Ã÷k«»©ƒéº–rSí@…½AdÞð8 85úÞÉl%¦2oÔ@c6 zeŸ‰L½y†„¢jžñ•p¾®•.Šÿ´Iþÿ°¨Õÿ?àëÿšqÍPýŸïÿïë}ÿÿí¯ œiþÿî½ÿi¾ÿ¿ïÿïûÿûþÿ$^ùÿóPÈãôj™3Y¢ä]p¢ ÖÖRP4޶ú;³÷¸NWKúçÖÿÙâ¬ìßi«Ö¨µ{H]¦2—²³u´ÉogÒfèšKËIi?‚䊆JJ {8>Jb×nV!{Í.¿ÉÕôIS«¢Ô’Ë€D:*Ò†ÁÉ4%:m×ð¸^ â¶8P*"—y2T,´ú«$GÚZ«Žd›ö¥X‰á ¾ŠÐWΔ ïÿç™ê]tý_ ,þ¡ ¯ÿkÆ5Cõ¾ÎÏ×ùùþÛGççûÿùþvûþÓÑÿÏ•÷ÁyÐ÷ÿ›zÿ¿ Ô÷Upú¾õÅ|ãžPa‹'TƒYFÍzM!ä„§ýA˜âÿkŽÿG  šã¿bápÈ?ÿ5ãš¡ç?ßÿÃ? úþÛÿ,øÎóÿpïýAó ñý?|ÿßÿÃ÷ÿ Ÿ³ð<˜ÅQœ½HK=ᤵp„“æB¬™¤ÔÌ€ =NùH/A­!5Ä”¸NüHJö…Åè]úG»4fê!Ž’ÄÐaá z®D„ÅI‰{×b ·Æ\c¢xט’X–%¡8ê¾¢©É_ÈTÑÔ×L{ÝÈ;áÂÛÿ=Sý ËNÿšã¢~üO“®ªÿñu>¾ÎÇ·ÿûößþïÛÿ}ûSìÿ®¬ÿçßþïHß3õ=c8}ϱàìÅÁs=-æÂ¡¶"j£­@¸l<+d¬ vÌ „©EhëPŒz¨WŒËKBvR×—QĬÞ5djŠb—ˆ¨5îD0M·K5LÐ Ì…î µ„‚¥:x.Q‘Ã8ª¨¨z2GcCŒëÒ!ñDMfùÂaRbk\â1'€ÇàÑRM¹Äd.úëÇÙx©B«êd‰ç=ÕúÔ.ªþ'¢áªþ'Š·‚áH<ìëšq!ý 3QÈËv#N&“É® ÄÉð¥î<[Splõ§Þ9 £èÀàǺ”@$-ÓenNq,P¤ÿ±ý~è@…Õ û¥}‡ôJ%’UѤ¾®¨£FÀ$:VàÇ«ê)ô °êŸÐ³ƒ-B?tr‚Ägà~Æœ–Ð>¸¨u3Á@I^¬Üçá2Ö ‡<·˜9ÃüY. ¾,°Ò¨V¼@ib±úË"Y,8|a±nµ)™aŒç™_T.±ðQQ—Øæ3¨F8 ü].åÙIø^‘_l„cù®Š§1c¼$ 6¿H]©•P{êÜ•º 5rf$¡$ëéùvŒUîêÈÊtu1Ç3êûYI,0€tLZÇádFo¢¿´“ÝGGóü ð/-¸ÐJÀ!kDŽ_¨¼yú›aÆÀš‘E¯1Kª2~ç(/÷ç‘Ár)”‘nábÝûyðj^'Ø:󨈞öŽeŸ—+é²bŒÊ/ :ò —€SŒ<R0gòb™ç”ÝäôÓ ‚D„L˜¡ˆ%uGZ¨8mŽŒ¡á%‰ÄJyXHƒ92º¸úº]ÿÎÐõS£Ý¦XÉç2&Ügh7ø|™×}Љø Se4øy{:@·[ ˜ÈÉl¤SO°"à'µg°  KxŠ/ÖM¸`5* uô6·Å4|Z JÕõ¨ÏÐý\¥¥-qC[€à%7ÜÃÇø6Õ~ÂÓWŠêÇÆQoÆ€V™¿Ñá,5J¾‚÷ÃYr3œO†S™ŒÆ ÆôXû‹œ¶çt.ðHm¡GÏ‘L¡˜gàת‰½¡ÓXW7uÕ‡rHØh6BÚí!üT=T·*ÔâÅUà­RoMb‡”©EÙÅvf\àäÜ’`ŒÉ¡yI(¤ãG`KÐ}s„öM(büs(ªÙ ˜‚eI{š-óY©ÐnìSÊWFµ“P‰Ò’£ˆÅL^Èl;ª~<\éàáŒœÊ Û͵nEÇ‘Ø;Ç!ŒÎ.e¥ 41šÊH8ê¾W°è†C+(€¥BO®Ó x“¹=ãb],ôŸJ%r$²°ŠÃ•…(3¹ç\HvùñTª,R‰L©Dê>| ¼Ó ^i)°]\LOâøkh-uqA]÷S¬ÎSÐ ?>h9æ€Õ‡£DêØ±Š‘6­Å7é..Â)£)ù²MÕ†Ñj\“ìââQmœ0MͺÓRt¶3=]2Š­Æ¿¨ï¶¯ÄÁ ÃÑÄ–O4Š´ÄÀºÇÐL Xд^Q?i9–‰tq*‰œ²ŽF Öâ 0*å‚!§TÝ­‹…ÔoZއ²€H<•HŽ™H#QkqØ«¢I<”Ñu²‘ZzºÕø(€*ÓSÉT#iõ¹[ŠD0mHG"‘wtâ®~Þo9þĉqDâ8fHšÖâlò8Y9U–%ž­q”OZŽw¸..‘¡‘È1û¨j-'‹îd‘‚fÞºø~ÐrÜ“äÁJÑ yó"Nkq˜X¬~bqBApÄ0ðÅVdÎJ [þ@´h-¾{R8b¦DŠceÖ1w ·[ŽE¢]\–'Æ£(di-n«HV/ÚqÈÙÔ§(N«­Æ&a°®&0±gÕ‰·¥¨éââzþàQL¿#þP^m9þ€úqElùC¥GkñG ‹‹†õÔ€1 ©”S%°òz+êaÕç,0ö¬R%KkqKÅeÕˆ=\ñ |±åX$öÞ˜…¶ÌhÑZ|Ò;g¦DÝÖjôU+›¬#&u7†Lޏ§…­×@ÈOXV˜ºlØè‹V5dgMN&ò8ãžÖ´ió]\ b!c­ z½%U+`›J† „qÆ0-¨eÉ€½;a!J¶R·À·[Ž[À• ãŒ[YZ‹[‚&5¶BA èvÎ2ÕOZŽoÀÑ a]et$rÆ<5µÝ)ÉZÈ#quHÆàå–ã° G­« "‹3~Di-N"^ÔºÖ”Q çÌ¢¼ßrü’Û¶UþÕˆãŒeTÒ´×dPb 3a*²PÇ¡ ¾Ýrý8­û’Bgü‚ÈÒZܦQØJ”q5ý‰sŽÑ¾h9®‰wq¼U¡U#3Ω’§µ¸'ÝÅq5–ãSS+˜€UÒjØ3Hë’B]\ `¦„sÏôzKz.ÄÀÙˆ'Æ£´¢ç8Eõúºœ(—ÇÙ’#VQßm9F•.Ò8šØr‰F‘Öâè|ª?5×§qi]e Oâ!<]l9¥U5,0HOç[P훖܇`âÑ4DΙ§w$p* è5/N`ZÑýˆ, ™¶ìÑz/ÓYǩƶ•µ@¾[haË­§¡ëDT/ÎKj"\gŒ¡•£jAîˆrXªØ³HµDWKQ„3­¡uèð[T}Î|Á0†"¶Ò’:û¤ét£R#• Ñ™¿ú‰òE˱ k ê5È!Ûhäi-Õ%„!Ž ž—sbž«‡ªµM…29e£‘Z‹“ <£½C±™©t%›åíVèåý–ãè Ç–uô¤i-®ëk„¯Î+ÖÙÚ£|¡|Ðr|“4æ™ÈcÏ8zâ´ç€)ÒŸ#¡½ìˆcЛ-Ç*aÀ*+=lYD¡FkñFº‹‹é|êòIhYwèÂÅRÅ–IZÔC¹6›&m/†däʇ'6a'Û…¸‡¨ÅãˆÄð w¨ i¸C6i¸MÅe­Z†êÞ9ÉÅj‘\Üà`L(e¬2}JÆm02Nvº?µÚÞA"±ôXʉ®¸w[Š.`ÏâdÐ×eb¡$1 ´…B(˜ÙB¡QFùdìi£¾ÚRTI£BªÔ%給ŒÀϨjgû$ž­‹:ðƒ–¢Lâ£Ph…Àç‰.‡ä/ZŠF`ÿÎ&­4r¨âk5í´çb8Æá™©ÕÎK˜söP5I„’¨ï¶]ÀÊÀ¬¼ÎÏ-x~„5!1¥§ËÔ°§”QÞo)údQˆ>#µxv§$ª~ÒRTŠÓFÚƒVû¥jè¶=jo·mÀªÆxÑ@¯_‰?Bx½¥¨Î !Œ¢MSô3Û#<æÐVgUÄÚÈ™<Ù§O|®³<Ú„Yµ›åžÄý'utúMê™+8-Xr¼,RÙ1Ö–Ù±|3Ž.–I3MŠi1ªé<4Ö¾:¬˜.—OË5•ö¨™?ÛCh™Ú3.Nl™:9ƃÝ<Þ„¥-n·´yšÁÁ¸€Å§ß®¾=¸ÞÓL!­#˜ûI3ü¤~º?M‚súø¡q3? ̱)ѱ)a'6Mqx™QJL?AÊ£Ó}² c™t0–SZjÉd‹é·‡<ímV¥wj š0gŒH¶C¼…qÚÓolÀÝiAJ6“`°3#h73¦2vÍ:3‚-¶£´rü·?:õŽN3âÎýQiÀk ãÝýñ¨w<¦6ÎÞTÛM‰ï÷G¦ýdŠ#ègþ˜l3}s¢Ô›{Ö÷#·§]üÈmÆG?×ΆïGâÚK¡Ó8× Ík3jPíŠPMMŒ¯I«òõ­ÍHÊ?-ëÅÌhF¸SÐ.ÞiJ+XçHx:j^gÌôjVý\¦kÕd¦o­l¦[…D¦g]Š™>.ÛIÛ7å10ª½i1P­Q_ãIÊ©IúŽ$åTgEœDõâ`ÝŒ¼AÛÄS—0Ìz¬6'x˜C9c&VsÒ˜ÍôQÙBO3¨MWá§õ‚Ž[È~<“r×½²5yü³•bFÄb™ž-l5_HóRÙÚ›íÜüѼ˜fóÄÆCÏçm÷BrkF®ž ]²ž;Êi2Äîä9f|É.ù[0ÚÙßd‘#˜€gÌ*aŠÃC·ÇÚÅ—$>›ÔõåÕ7ð°[¬¶C§„bŽ—™ÈÞ+%¶”2lž¡ç9Ôu­úcOWZä&{çôtAà½sÚü«õ.Àzhx»ª[_ þ” LÄ∩<ÀW,ÿãÑú=¨ü®P(¶ƒáX4ˆDÃÁ¶@0‡Û˜€¸m¯JL†iÅì$õ=°k6£Aͽz^¾vÙÈñëú™‘Õ«˜uë—®\Æ´/êêÚ^ÖÕµ|d¹ò Ò2#[, KØ|WWÿ°ö µ¡'dz\oO—Y&'Ë¥Eü¦Š0¶¤ª§ù¢¼hd²Ä·3å7°ÿqÝâLŽ•Ê`ÅÊâ¢D"š\C¹zdAÎóP¤fªâc7c½˜EÌ a{º”÷çô€­h£¶Ú‹“£@,Í”ËíŒÄç—´—åÉ<8,ò¼ ÖIÐµð´Æ¡¨+ÞÁ‹1+ù"X+áfžd–+à˜`g¤3Â,ZÞ¢ºoŠ?Ñ®[¡Õ;jcj1Ô½0[⇠%¸ 3§3¤ïLÉkéSùÚ°S@°Å¢(×6==m£|£º· éÑöÃUQZX'‚Rp„Yvg_ë„>MÆ«‘]ôÐ>‡GELÝêËç“-­Z‡jìK‚êÇc`ª¨ËJ›ÎóÎ?æ‹ÕÔ×Û~„œ­!§ÂnµGóÑ )¶½—uÜ(m§ é!¤Û{ÓuCë!dÚ{3uCˆè!pí½\Ý¢z|{¯Ýì¶Bˆé!dÛ{³u²Vm×VaŒ¶÷ŽÖÝŠ„B®½7W7„¤‚ÐÞ+Ô ÁÀS€gI“Œ ÓC’p¡n¼B±½·X7„¬‚ØÞ+Ö !ÐC(µ÷–ê†`˜[R{¯T7ÃÜ›¥óEGƒ`˜[r{¯í¶c`˜[•öÞJÝ sk¬½w¬n†™5ÞÞ;^7GÙÞ{¦nùŽ“Ê_=¹°náe‹™œ(µ3E¶ÀÃóž:­1£Ì"åsøz%ÄŸÞQ~ÁÂ9ݺ&ÕeÀšŸMVøJ^ÖçÕ"crè6<Ÿ…þ£4Oa©Ä³@<ã%2JGÆT€0B³ŸªèÊA cr¦"žÏ&©JaUEû'd‰ÍÈ0“›X¡ÕI¶óùl(AIp® U}FÖT n‘Åmq-ge–ŠÅYT’•5IÁ×_„b‘«9À6“ Ðor°Ž`&q9KI6ŸQ“éPÂS”{t'èà¬PhYvI̤1!ªÕly£KD¡€"‡óÌAÊdÐ-ÓB©Ï’¬ C±MÔ.9 7³.’–³wKbÂ~I`‹\ž¶üÚ§›Ï†MŒ^ËFè-ÉpYôÍå2axðu»Æ…¶‹Ü@IPòØs±KE<%‘yòéÚ<ÈΊî7TsêqJ`â‘QÙù”Y§[ÕLE@퉓”™– FŸ$“@{;¯BÐì(Á‘Piö*qªæÉ-wÍ<ŸMXiS_6 òl3N:ÛŒU´#È(á¶—Á˜m7W‹eº;J“NdÒÕe>CÇeÉß«ô¡–²W´È…^KÕ'=â(ë¹³µ1j»4±](òeÊæî`…©Óâ˜t;ýäé_E£ôÎÝ 4¯3µ´™U4•¼L¡—³þÀèUÏ׳$u‰KñQêjïÔ̲*c¼¾qêh‘‡Í^øŽd_lëõ³a(‡+c„¼2Zï`Çŵ´Ü³ %ìlC.ñú^ï czÇè2£³ÃA˜x8 Œ‡Ã` ³šÂ?Ї‘à×ȳÁAè ¼ìE€]GÈ >ÈŒÅaÈ'I5È“€Ãq¸/ E-À—‚Á&øÛ²këýks â~ N…D nA‰šÑ©XP1ò«¥åž-¨˜àT«í9ÄAï0‡=0îƒmˆýÀ›Æ‚>ucpÀZ6(r°Ö•µpçóc À4$ÂP¦Y]‚VgitW1S•ˆŽ˜Ý¢ùŠÛjlÒ- Á <(³Ý‰Áƒ¬5ìB6•œÄ”…Sù%íAh ç8@Ð2ƒ\I–´³ya´ØÍHÐEo1x\.°ù|oÍoD,2«ÁŸ¾’Ä„bL0ÒNtG’L( 0YQb .LzRqP˜ú¢ºÈr©»«k||¼Ssg¥Ñ.dRmùsjŽ„Ú+5GBõü 4tI{Aà¸<ßΤE‰ã¥%í ïÈ„¥8µôt)í·”nB¯ß°Å/Œÿ_ÕÔéºÿx›üÿ¢áïÿ×”k†úÿù>¾Ïß”ûü‘;Föú{øü5ìîçÊÓÏ•“Ÿ+ÿ>W®}uxõa?nÜÏ•'Ÿ+'>Wþ{®\÷\yí¹rØså«çÊMÏ•‡ž+ç…Ý`„b&_í½•ùB ’ mÖx™Q`tŽÔÝHÉ®"?žJ•…B*‘)•Ô&Â{àV'¸S;¡d-€a²l†×Dm±Äs%aÓBÃô„¯IÝ`kyÝn´VZ€‚cÊbgÖ 2}àO•÷ÝPŒíâbzŠåLô2³‹ÊoëÞ÷†ŒVˆ¦Òз»' »æ@ƒ2˜^e±†Þ:vzJ»"0‘ƒ:§XÛ%†A ÏãVµhJA;¬PeôPÁ›àQu•FY0ÔŒwŠÞoCeýc…w\Ñ.%Ò.G£œ™oÁ©4'ƒòh=+n-£ˆÝdS5“ƒñ `0¦7ÍÓ ¼‘Pš/]«ŽÀ®¹U̵œV ¡9&»¡U¬=Q­0ìYk•‰;Ñ,W›íÌ%4Œ ÑZR8†T5ÈŒ®'°“J($G7Šƒõ-†£™ 5ú˜YƆqXÓemÜ^¤¡¸ +eÀ,…ž‘&Tßðba„pꦖ³2/t§O7”mÈP)G`NnfËP4D…7KåŒ$}ù¹aHÅ)Ã4®U_q϶* ºˆWG‡h7䃅y*ùH¬«ÏÌ»€)XÞ­Aôžygî€?šÄ“Kq«§3°êŸï+ꥠãzAv‘nh@ŽçT’¹Xk¤U ¶—)áã< à” àH&ò8Uõ9x잺ˆæ°ž%¢Æ%©b8!T!‰Y!¡0Ë-&CòžEg¡aÙoÜ*UFQW4¶TÞpÏ™ œºhæ¼´= Ì¥ŠlÊ‘¸T¥fA aW‡*<ïyu†’œqC¸3n šØh, Ÿ»gX¥^ež£j[´èJ7ô`{üRèEbTD-Œ†*=O¨°¼gÒGn°2°ú• Ž+á}/$Ó‚àˆ,¶uȰh.ù޳ÂÌnˆ ˜m;·~:å´%àãpÄLƒÇÊ,‰›ÐCX ‚rD'¹ä`\7‚ixp\¦ÇÌj`º†¢$(ÞY5Mä•Aÿ§9ya²z!œC{XÞSüü¶©W åCQìý I¾†.uilC ¯©Í01ø<Ä}î“q|V( z¿ƒ&’VêJM×3²âNyâ‰ÃhçGb¸­€eÆ%¶Tâ%{Z9ËzHKyèÖ†#—™Ub™Ù 4›Ä}Þ;.‡ŒgXé¦!ÁÀQ;ª×ð0[\*E°Ý(O6Û`Ø zs, ÂÁ@»‚ÊsäÌ/ÝPâ?¬A{äëE4K ™…Ѫ3ó÷L’e*öX,mé«Þv"p¥:¬‘ö ÇŽð~ãœX[ûyJ¬T¶‘; Ï .íl†•ðvm¨º¨Õ\Ó´%ä²ÂhEªÎˆ•öX«­;Ël6f¡¡™=q~lVò{ȓͥ¼ "Ái3SÂÎí½äÚ÷Ç8wUiì‚ÎýP·QK±ŸHºsŠé ,Ýs†ˆ8¶¤:eDfÓ~ÍñùªÜÃC?LV hxÊ ‘  Í„‡Æ„eÂӉР®¼‰Ü³7_‹‚3“†ìö¢{êÜààf"–¥IF`¢–ÅÚs7£©dåí=ÄBA’š=m\׈gÞªŠˆF§xÃUµ™öÈW­d˜@!,³b•I%K‚â=›â ܇n?Êg€(–°Ð,[¡ð&|èõ aÚò'tîÁ¥´8ªÙå¬TҲ˹’!•°ü‰hdæOÞd‚4@™òe´Jâ†8tûÑ>h²†)T´ÔñD6­¾á%¯VÚ2+4âaܱ UŒiñ­T3¤ÅwyVMX—Ué°¼[#†9«d«‡7Å«¬‘ü 1òt@Ç$k¡£Ä‘là™—žñú¥·\⤞g [¦æÀ>…I” ‰3Ä‘à‰»TÔºþ"‚aY’ £? ZåXÆTºÊk´6Ó¹!îÝ^–ÿ¨u.£˜D¦U{-*(PÁ¸žRºœžVbÕ’zºtˆËZ`½°<«R £Š¦É¦\lБ»ÑÃ×v‡ ²Ž™©W‘²ê>lŒg‘ •BJ2åª=7‚~Óå°(Ƽ )¶6OLøÈ‹ «0¡ËЈÂ¦h€â 3·ö0€•%l†q5Ó1‘«µ¼^5¸¶ë1ô\Å8"B²’8[©¦ÏâìÒ ‘·*Ìk”Ã2q•neG‡©_™ ¤ohmÞþc’6Ÿ(HЇ†uz .:;qâ±ËaÏ_ïÒÖͧ-„°°$N­ø:š±~ê½ïÝ4&_%¯3Ñ€è{‡žzã{WÓª8Œ0´-)A.'A<Ð:+ô`SåÁ¥þ6ÁÈãa¼g_ÐäOd€â±×¯¾4 /²g4z¼£ˆhQ½¹"§ÈÄM$õ‘ùN &ÍçØ1Œ´ÁÝ®®±¦’KSd<#Œ™Å5²`Vêx ÀûÅZ£¨‰“MdA¯¸ŒªÑk²¨jY—Y}ïjŠ@'3ÕQyRJiR—R§aÌ)ÚW²âf{Š€xÏ:3‡¸0O\âÞ_{ÅÀ¤’vB謜³M)gbßxŒÕš¦G/x02Á4mdˆÌ— b¨< ÞÔµáeÕ‘”…ôñºvè5Ãï\OÒ©h4G£=Eá«To› ÒØôÑ.aƒ{"Öïçq Ê[?œ’Häo«£*@…Þwx²k*=&ýÁFæ±y šh`X*kÁ4˜é‡7Ãx`‚ ™28`­_8ÃWÔ”!jêM^NL‰Í&_tTP+4cÙI«\íÝŠ¥,»¨¡M. í6b€ÃÆÂ\ÕÆXÏ5‘(„WÒ©1RJOb ™ãÜ"ۇ̜ig ÛNݘMñóQµá9YlÊ ’j ºT9Ãâ˜9`#˜ŽG[Gg(Q“¦³¹J•T•+'sžú‚ûÅOS¡œb§WawÄmHúc&ž#5’aBH£´!˜‚ÃûL$z¯µ’IΩ%i)ÌZ}ǃD!¨z¨WGá]Ûª».Ý$˜ýEOCïÖ(ˆQÈóQ˜S@d&CÒdŒCiVRéJ6Ëc7{ô\yüŽÚñaXO€H'3§ê©„99‡‚dH^ñ§!ÈÑx˜( 0ÍR„kÄ&I £$­}!tí¡ë«)…¯Nc»¶*/(ÏÝ­«°À—ÄŒç„LŽ‘*Å2x°¬(çxe¢³œ o†1ÉÖP]u1ÝjO½pããÈ„³°©žl˜DÍ Ê LIº0V’Q!C´ŸTkCH¯é€Þae›¢.|õ´pçj´ó¸(mTе@‚1èë2Rú®Zé)ó®ŠJy0°öÌÌGJ¿0©¼ áMÚÇžrM TpÎV»mØ—!I´EaŸÌ2ôÔPL/bÐÙÜù°é»Rurhà a¼Y(R^yGÅL#NöU#º©Á„÷ Î !+‡"Ь»Ÿ›ýNo3Rà8ÕGe9CIÇÕµ´=º;ºŒF j`‹‚æ"‚~¶ù”P°ÓX­“ü9L’küŸ4‚€wlÀÀäÕQ ˜¾Š,ZAÁ»6ਕ21e2é§cRYTKMT×9¢èc/E™Œ<–äcŸ‹¦‹ÀßJ™8K®Æº#q¿äª9¾jõ_«Õ±áOµêñà × Äñhµþk4l cáHدÿÚŒkæÔUÎ%j1Pf³BcØ¿¬×å`µ¯‘3Žú%Œ©§ŽìL)‹Ç:ªÜöåóÎI–V­C5ö¥Aõã10UÔe%ÊÎ?æ‹-)|?ø‘W²¿ÙÂnµGóÑ )¶½—uÜ(m§ é!¤Û{ÓuCë!d€üU7„ˆ×ÞËÕ !ª‡$q»Ùm…ÓCȶ÷fë†×Cmï­“9kû¾ #×Þ›«»I=¡½W¨‚§Ï’&§‡Phï-Ô ×C(¶÷ë†ÕCÛ{Åz!Äz¥öÞRÝ sKjï•ê†`˜[`³t¾èh sK§ßº!æV¥½·R7ÃÜkï«‚an·÷Ž× ÁÀQg¶÷ž©[~çô”Ô¿zraÝÂË39QjgŠlWOúpR.brÌ"åsøz%ÄŸÞx°çä´`á‚[ZfÕùlØÖ²ÚѨ r> ‘̵®Hƒ¹+ö‰²-=ÐåÊF8ÊC•bQ(ŽÂp+wˆ¢Îmàdwx"T<üuäiž¾óÙPëí‹+ñVËØ›V­ dDN\òÀð'Ény*JË´NÌ ™Ée`ðy·(Ãa[”°—ÃPbvÝ=;\ÃENÈÀG®QE)¨ºÐÚà­š)ÑIúj¦V¸(úŸdsô?Áh$²ê¾þ§—¯ÿñõ?¾þÇ×ÿøúŸw”þǽö‡¦Aòõ?¾þÇ×ÿLþG€ú§ÿä†eI(ŽÒO”” Íùl§‰€g—åÅ2å` ³ý` Là$:¨JNþu¬Thv0NK‡‹c|õLLQ[ÐQ1ô¯êã¸~Ð…IªbǶ¸Ñ|6F®o¤¡Z–çYоÀž„=ž•¼¼Œ-Qˆå S0à•'Ô‹;B5XÌŠn1…a²Ñ"9C±Gµpw6/RT¾ÎP%íQ {Ô«°#TÐÿÜ-¦¨-&p&¥L(úš"­ §!ªFÇ(€«jC›¡°Y1ÃëÄqÞ%ø uä-KºRòzlð`¤dÛuÛ= ×àºgÓ5§Em±ýÓ§$,]Î šc¡×b– ° fB«ÃB^lC˜Å~h¶šbm°œ0À̸²•àójÑW,p­ö+®³9«Íyòj†Wó—ª1´úz¸‹c1~9ðã¾blïÙ+Ðô’o_õ·Óçªéå±P ð·\9޳w8lì¿P$j²ÿFƒ‘¯ÿmÆuÁº5+wŸ³œ}»,ÿÎöš½C[Û¬{îù $ÉnëVô¿ýöÛ›7o¿õœüàŸYòКᶣ_üu¾.÷'‹Yyœ•ø¶Q! Ä„ÀÔÝpòÊ÷€7 .ï™x2s ó®]w ìzö{/>{ö>쎙܂‹O™Ú÷Û{ÍYz<€‹wÏþñ ©Ü7Ø¿fù­KO9g;ÑæpQì?¡fÙbÁˆÅþòí?M¹|ûoÿñí?¾ýÇ·ÿøößþ3C£ÿi$ßþÓzö Ú$œýgH­^@!W@@º+K‚NÌI°R‚¬»¾˜wÓܰ·ÍMÒ››%Ž–ÒÖF¶€y¹BNß8ÄSR+"Ú"”€6ˆ>õäɘ€"n-€!º"Qo¹ŒÃ3‡á˜˜eS…/ËjË>´¸î™MÂL$KJNjÀY¬¦2pULÞØk)†æ*&Í„C-µ­]wq[Ýf¢Ãà°=_”ÛÖça­º•ƒ+˜á+ÉÃ,Xí™cÁŸPg@˜%õÐÎà‹÷k†¥}w­}÷;Þ>°íÛΟ{x lŠoC¢^ûOUUè»øßX h²ÿD£Q?þ·)×̵ÿÕØ¾ È7yiroÿÙ~Öœ:ØÞþ£è5EbˆíHs؆ã£ÈþãF_èŸ>B¿îªîÿÕuïqØøÄà3SþhÀ÷ÿhÊ5sö]泟.›ýŒÛêsA¢m ®€¦(éýü`´E¿‡ƒÛ'÷*­&æßª#‘uw·!?6B³ aý#Y÷ȶ§f˜( ‘b±aØŒ¼lc O c\¯ 3YA.3i^–Ae‘ ¥¿‡<¨v ¶ãÆáÏÌípΔìÏ”$±ºÊÃ(æ2RûÁcA P>e䪦§,²ÝÌr¾ÄCÅ R®BB*$³èIÊ”áðN¶ÊÔOᄇŽa)¼=噿¶¼ÃÆgr¶º¦˜™»Ì°eFÈ2,œ¼ÌŒƒ_9±È×MÔ@Ò;¢&I45xÅ5…²2@V~l&3}ÀC¦OPÇg„¡ôU‡f„Ÿ—¢,.#Ì2;:“G'Tצ쬌‚ÙÙ_}ÚÝ Ö%pS+*¨ç¯õBQNŒ0ŠĪXûB³Ç®ƒ)Ê€Ø(÷‘q“e9N‘]4M9›‡SôH +æ„"TÞ\ Ì ÅÈc½„‰ÔC˜Æ+ù\dʶ3ã­ãÌÐü¢'JCE.á…ên¸åX‰c2"Çspâ8¼³~RY”¸°DßúX´«È§Re¡J«nó©D¦TRûŸÂ‡Ú³NðÁ×õ¦ÀN¦U^{ ª¦‘‚yø)Í›ä"@ÉÿnNþ‡P(‰Yò?„ýü/M¹fŽý™”ýüÓÛ 5œÿüü~þ?ÿƒŸÿa¦äpŸý–AÂÏÿ0Ýò?”aþ‡2.ÿÃ0…‚Š×†)qùÐ4í¤ª,¬,‰IÓkMjvR0eG%Dž:/Z·€·­VôÁ´| àå­øDyxœ-á'êC=–rFÈHbàp)}ZÓÝá»T{®GU‘Åþ Y‡jÛJãã=ž‚t)[ܸJ2,%D¶‹‹ã"µDÂ&•©–DX‡dØ&6߇9×¶Ç+ÒR(ØãˆSq,§&bwÊ /öý6)½¦¢R0©È·G•‚‰uË) #€ú˜éG²~¾kO)p3xÊÃ/—‰…’X¬­[æfÞ¡ °gKsvzŽng:ã0^gL œåðpU˜Q+L <ÇN‚ºß¨“³¿TÔü)Ì@3Ä›\$kéá«Hd‰’¯PžÅdGïGµ Ö±rOûÚs3ªÁbY"¥[NQÆ¢„Ê÷è¢NÐÁY­ %—Š£q ÙDµš-ot‹(l‡ÈáîH:1/åVñ-¸žÔ—7[ún—tó̲T`‹\žV´‚n¶532-§³Ã©Û84EÖ ‰Ô¼‰XÇ|°˜©©”m±´ñhxŸ2—_¡ïSöû‰9G—`ÇV‹œ'Ç™€“íf»Š|™²€8Ûw#ä}·ŠJÍÄDh‡• l *)è*yÙu¿0{¿¹_•bQ(ŽB®p—»Í´—S·Õmàè °-jŠ8€ÇîLãli1GÑ8Jíg¢yë0d”–ÓÏ3uH¾ùÔ øjXé)çX¼l¡Æ^Ás~1Ö½@¡Y f=P?–Á6W ÂW^¡Òb˜ÜZêçky:xðœ~ “[¿\(g$^æ©´—èX˜5¥ `TÙ¼ ôý Áð®ú}_‘ÍWþáQ(¯Ø`Àˆ Æ:B,l3³Ú)™.Â6 ê4lö"„C|6Yê>EUâÙ€ÑÍà˜@®œóe·k[³Û(’vþKQ­81z› dF£7<ÿº¨z” j4 àa™-PÎìÎ\{—K%T˜¤„ýQ^²+"äH'hVéu‚n+~©z rY.[}’¹Ñ&}Òˆ4I¯y–ìâ‚F®‡ï×VwSÓu-µ¦8™ {ƒ$ȼ+àqpª÷“Ù!MVŠe‰ZÉdØU‹"¹wT45t*üI(ª~о¶Î×ÖÍä‹¢ÿ‹6GÿˆÆ«þ/îëÿšqùú?_ÿçëÿ|ýŸ¯ÿóõ¾þÏ×ÿmÇè_šÑ×ÿéõ¨ÿ«àôvåÔ©š°EÒ —‘ùįéäü³ò´;+Sα&ÿâñpÜrþ‹Dýó_3.ÿüçŸÿüóŸþóÏþùÏ?ÿùç¿íxþsú£ [éü7Ïc¸óß±à\ÂAû'-`Ýa„w”`ûÔ,Í—’d‚‚ÌqµÕÁB{Á€Y^ië0 “z¨R^²“ºÖ¸‹™ÜUŒ!Á 25”Ð%"jŒ³‚ƶ¸ÃbLÄaq®Øc©žKTØŒßFTCœ[&0‡ºã8‰Ä²ÇdN€Á¤8x¸ÄCtWðh®F.1™ƒ¾j˜|õRýê%Šþ'Þ$ýO, [õ?_ÿÓŒË×ÿøú_ÿãë|ý¯ÿñõ?¾þgFëÜkh¤é£ÿ‡úŸqœþg+P²jP3¬„-VÈÙ‘ðJ"–¢ ‚œsÞ“$†÷¸¡ˆbb(Èa*¶GSs˜“ñŒškçŸaÓà˜Ç &koü³ô´sÕ˜’«vþ—ÇBY1H“É‹ep^”ô‡Íù? ÔÎÿ±Pœÿ£± _ÿ«)×ëÖ¬Ü}Î~¹wX>þÝüÙkÇÚÚf¥F6-¿¼oݪ‘þ·Ñu×]wmÞ¼ÜÛܶyé_~ü4KZ3Üvô‹¿ÎÂïäþãäa1+³ß6*dC€˜˜b¡N^ùðƃËûF&žüÔ–»çœ˜»lþ'Ç÷øÏKpä³øÂß®èí·?þÚ_?üϯïüäß?öå÷·ôóÏùÜZzè­§Ž]÷—?MNî=X~öÕО¥¿÷—ù§0ŲÏýÁoýö·/ìõ×½&˜7/ÿ@áÇ^_|s÷åÒwÖÍylâcW|ùé“®>ô¡ÿýþg;\÷þ\qÊÎ~ìú`ÿšå·.=åœíDùéqæ?øÅÃi_½ìæ87Íÿp<ñç3.'óÿÕùߦ_ÚÚÞþæþso[ÝKÀ˜²dNø‹k›ux ½iÖs‡ìœ8eSÛý‡‡YÁB;Ì)„f §l:|×ì·ßý›gxâ]—^ñìó‡>8´Ó°pï¥ûœ74ô¾Ÿ sbÏ|ñ‹_Ìó“³qÇM{®f׬ßñÕSæÞȾÏ*í;ša?ç·½þó÷>³þÜ•?€-÷ç¾zUçU,ô‡MýÏ`$^‹ÿ ‡ÑüDýùß”kæèÿç…R¾2 *ÓUõ_S$¼s”ÿ3NõŸ ö⸠ÁM£3€uy©½7Йd¥K.DÑÓÈ’˜kþËU9TmM¨wT‹ ºÞe3x¨¢.3‚ Ë|—ÄrYHçyXà[ªÑËb‰/æJñ||3àÀ:ÉŒ`bVÀF ‹ƒÃ±!0åã4›Ù8*‰•"×Ù“–zç€N3Jqñ" ¥!Ì(/ÃÆ”õ8Ìï¬$ð¬,ƒÉÈY =ÂX84,RÞ¡T0‡ŸfØ"“wslqL.­å±Pòðkø¦ŠŸÍjƒŽpeµÁƒEøbZ(*m×hØ‘ô€I Ú õt¡{`h0h̤XA¨GÕi oHŒ8^´ô-Í–Í ©K0åIÐÅÃwŽv"’røeYR‰U‘ÀP®Òpež S±J™šêb«¦{ÑÐCQ;;R#à†qIÁÊ ÇrÙ‘G2l‘cXŽ-ÁJ$>#kŸÀvêGTmd' "Jˆ€„ù<G­À'áò ÀúΗÁ0Éã<@™™UÞ4pèq4@ÅÀ29UP¹]᩼«¦pÀh±Âäù X(Ž)ƒác T Éa‹K`+ИÀ<0¬61ªo£¡ç ½ê¬à:aó{ºÀÄšLd› ÌÏ£À<*ç ·ÊŒY8'VF 9ƒæIiÿdçhQ,ðH÷Äñc|¾k<èR˜žèçE«”^-V «KPÐ’ˆ¾\,æ8 B̨4˜5hV©=DÐŽ'y¸oÕæ†J"mVN à+PRÅ|'3X›ÆˆDÊgê>ª}f$>\£¶B\Ũ/#&F+êô@‹„ n£ð×êÜÔ“_]¤àü`V¥I¥9Ú<ÐÐè‡,O|> [¦ÐáƒgYHÂNyôT'ä æq`—3’P2°¤„=O@m$´ÌÆÎb¾ëLN³EºÔÎt“u~PéÀ1Uõ+yƒÛ¿ BU$ì3ëÔESw·¶Ýô•Á’•Æ“ŒÊ,pä+mó´@‹ j¸Ôc—ýRb]<ôdÔ4¼·-<[ò \/[²Ú.¤aWRÌçÅq´þ‚iÃÀŽÑ"ˆnp£Âòð4› ðe@£¥!Ï1•’ÆWeëê‹öõ9Ñ 'Qàô3ŒãùüW[‚ e´¶s´_#NÊh-+ID‚¯zWØBÐ…ÌÂNf)˜ÇB-Æ_ʳmÛ,*E° ÆåÙIð¡Úhëb¯NuÅjýBó!«bÊ2l"%î"ÏJyJP¬[áCmGÓÖ‚•¬`”Ptª 4îH°Â¼ðÁ˜R}Ë䩨Ý=˜…è,D&'’ÜY¥QpIC½”40”Žw»»—¡Mº’…ÕV¡¾B’ &I\I¸™¨®‡¦Q­ ŽQÙû9bQUŠÐ§0+Z)ļ¶hèî¾gº!‡ý’avº2u¸ikKî²µkV ®L¬ý`ÿšÔ@ßšå«ú‡´åÞ¶…„q9¾æ2Jˆ °è8¦ÖÙuIf*µëðRäu°ïó`Æ#±‰¿ Ù‡ÖÐh®n%äõ !ÜCȘkk#q/2ŒE¾Se°ñ‚Ñ–>p$çÇX —Û }hõB«·Ò]3í&&&˜ð/¡¬-›JÁf<'drLœ.ÀŠv"ÔE®s¡"DHXNÓk¨º‘èû-›–„ øÈܨ逽 žZD -»°ÕàxÀƒnßwxDÌÂeu6LÛ €Ðœ¯pÕ®‚.bÒÐ\ÝM†–1PWRî\X;((‰8X]—§µyT’Ä _.§¤’œ’•ä–Õ)`‚{Û´lëG»Ê¼»–yõ˜¬b¨žð€ö°ÚGˇL¡QæFnU!É•`la¿ úÆ æXwúîî>Ž«ùë“Öf Å8‰F1^O/K×;™€{x°däT¥@ÈíÎT¡¹¬N=E0-é¬6œ¼9¾ Å ’Ê-M-C€› ÊDSdtmá”­CÅ©â«Jâµ/`ëÀ´u¼Ñq]\ŒÅs-%f¯ñƒ'ƒžgU’Zú¯£¯-ÄLQC õ­[ÍË9±:X¢„B)2Ò*ƒ‹ZœƒB/äuùíd†xp<(2cl¾¢Lem2&œGØvÛäøÄ&øTRYsõlP楪^j¶ ð.¯ãF: U0#LS¦*'f©Ý ÎΚJl“ËÔ)Ã2ëíAm‡¬ÎFM_§½‰¬v¸s)íTÚÙI¢:M`¶–ª…€ª¸xTÉ pwÖéãàO=6äE–C®ì?$™ °k Ù¾J¥ÀæœJdJ%9¼nu‚;7Ô!¨XÀzUÕ#¬Õ ¿¶ñ¢-œ‹Ì‚j“µH;SÈKÇwÜB´L v¯® Ú±Heµª¦P=5BqýX®¤å<NÆÊ®_äy¸I,@š=A‹ƒXE´ÍÂHÃòBNé•/+HeÛ*µ-–ÕÁ¼ ©8ͤf.ÔDm-UÖ.E~¤ÐÍFJq «\‡*5Áf*Ë  ;©ì)Ê<®.1U¥Z¹>jGP‘HÕŽUíæLU…º2°f¨Æs©êФ ê^oh< v0ŠEÑÀÎÁ¨`¥ 쬓R›nPdl%«Â k9¥«ÄGR"_®éÌ••]}ŠÒ#ªž vC#5fª«x5ùÎp¬¶TÕ«ñY¶’—k€¡<­µ²S!Oõ ÔhÜH[ôw4-mMÊUì U…ž„ô‘Å<€R@“¸Š¤íÜ*¯N2¥«¨ ¡¨Í³hÅaUå¨b'ÉA-5""˜ùøNYÕQfÆy¤ÂTƒs^=2À¥‰á³ÙÚš2 ½«id‡mƒê,ÐL½2­¨uX0¨"<Â(&„ªe¦v.©«ªÝ6ªfáÙÉ¡‰£:uÕfñ‚tÔ|6!q1FÅ*AÙ«pæØRlbÍc Æ“šPö/*0-;èôR‰B!›òhQÖø;¬Ö¨Í¥d£²C׸T5aׄ`Â'ªNš-gAÕŽ!Ž)ˆZlAS¢ž V„\‰4êP/¸±›FD¨)¬±‹Ø t¼Ì+,dUÐ:°Y¡E­÷€5Ñ. 9Z¿ À—!Ê1-–HífÕ8ÉOdøªŽ\Ñë׎[êÆŒDQ0}¤å¤Ò ©ðaû/›‡dSOdU”æ…K¡é0›( ¹ªÚ~}ÄÕ²¶¦TŠHº€ÍP@(¨J¤¤…Òì(”g%&ÇOhŸêGDKH·" Z.4$ê]Ó«ëÈÙŸKp„ëƒ(Éefñ¢… UÚ¯ZF„ƒ p"²"ëa¥P²•ñÞ5Ë€g ¢-«h$T5~T±?*úÛ›ò‚<© (êT(Àm¸¦Z—¡«Fªf!j¹F@pˆ(ñHÝ+"æÓmûFëQµõU»§Îà±îHÜwßî—Áÿ3‡Eå=÷µóÿ Ec&ÿÏH(âû7åÂøÎöšþšuùãï] þÜ;gͺô¿·¶9ñï<¾± mÌrÛú<”äV®€"”$³@lƒG=ðEàà7ž8y|°§êš¸kóæƒÏœµôâ¶Ùm=¡¤‹Nl¥ï®9UWuþ}Å<ÅaãÿÄÍù?#Ñ ïÿÙ”kæø*ù÷Ãéêõ¹}>k§¾×g^ŸzΠF@;¨ZóU{~Ð=ªæ¾²b LKŸÕ{•»{‡Ÿ™Yêí‘9­õ¨ñùÉv¼–›íâ’ZmT©]S~§Nf„Qœ°g2gäýöÞ¾P‚Ô@b¶zê„ ÊŒòU—,ÕߺXäÔÖAû»Ö8ø³]ƒª¾U "8£˜V7-"%#’)­êKCŸNp.V ·ðlX)•ÀùNm›+rQâ®-A×´Fˆùª^D%XS9AQµ»h %-¼µ:¥Ã Íõ%´, kkãíÊtq‰¨¥]}Y´¶ Þµ j³àiêL ŽE5ç(º‘ªÓšß•¢ò²ªØä«]t‰á«éGéÎz4ÀæB7a¥®˜=ËZ¸º¶éîØµ¾£±©ªcÐŒª]¨RÔL'.š LƵæ ¾ÚPð³~@ºeeÖ«J:äæ V€qQÚ¨ú™ÃwTŠ»¦Öa: /¢š£‰ªRÓŒlZpÓB§õPmŠ¡RZ®l¶p3Ê©«™þkƒ§‚K¦pu”žrÔQ/4íµÒí{Wlö²†MÔ´ ˜†«OêÜãL­WT]·ã~¤¶¯Ô¼Øö+Ï$=üÔ“>À=3Ô6.F™¥ ‚úBC½à”o½êF3ª­2*/ó´~(o4ÔícOz ˜úÃj;×òr'ÀÆÚ¾ó¤éaÐtò Ë`o¤´^yÞP”O=騨(±#àHMî|ÚPûᇞ´œTXãÕ'L³áí¾àjßMtq¡¾™#@ì$4>jp¡Í…_»i³½Ã$9»]$S=6•mªê‘­•ƒŽæ-Ëf ;Ñyɉ£ÞKLç½V®š:Ç {’“¡šu~u.G7ÅúAåÉu¬œÃ´µöÐŽ¢$¶TÒBOñxô-ô[ιd€®ÙÐgv£×9gÚqØxd…Ÿ2p“¯9—¹k;ÕQÚê‚éè¸S£1Á±]‰Psµ£°Ù6.ÜšÞ°ëÍ:I8Í}®FrsרH%.U/Ì«ÞeLÄ•[:ð5}¹—d9Y÷Ô«þ«{”ÞÏÊãžÆ ™e°/„]L{äUÑn1uÌ‚½³À^ÀÒ„ÂG^u0[™Ò‚(„Ùˆ`/h~†ç^uµæè:uýuàäŽõpwÜGÊr„¶ä©ëXv¸¾kJB^ bA›Ú)ň£°'ëe´´ÂGõu1Çç¡d‚ï©»3Ksî‚ÔªPú =öj¨ÆUxS¹‚ÑŠãdÂâé`áÄà‡.•C1ßÌ¥ÐïßTø¨¡æ²Ê²žß»\¼qå„`Ó–iñ†„¦WŸ7Ô~ÔújH£[a7Š¡ü€(³%LëÕ' .ȺN@NωrcÒ<ÌS¯¸èŠÛøˆº‡¡úµK–³šTv©n=„àÒ„Ç€Uᣲ\´. \Ž€êðên©¤¥›&”­vÒ`Äéj¦¸Æƒ“ªêâR‡[oÔ](.!{—Íl\ÑR7?h¾n•ÊÌŒ$ qÎ8º…EÛÜzd1¢µÒºe(l‹ØxåqC$WÂ<蘀Œd©´Ú–ËÐ,HìCõ†º!k_{Ñ“g0;Ô\/­d³<Ž‹jëWÚ ³%¡`Ä%÷‡1&h2— Þ3„§¶~ 0‚¢\s슪‹Lé’’zL–„Q¦ÁêBdaÖ7†Ÿ( ’k0B±˜r¨[ø'Ê=lMðW:ìNÄ«ŒV w£öÀxÓ‰QY ªC±;µè%–p+Žl~M€– ©ú«Þ—µ*SÞá°‰ÿÅ£AsþÿP0èû7ãšiþßUg`ß¼eÒþÖ\×·cÍ?g^éär¦÷ë)õgé#¥þ´O)…þ|ÍñY ñr%®Ö\¢ª–éVæÀ—TÈHÇ .‹x5•ÈÕÊi©C¥ŒQÀ‰›áh æ³#$5óÔT/JvGƒ­'©â? €ürQäxoc@mã?#óþ ûñŸM¹HñŸ³aý{îù $Énjý¥ìGÏÉÿ×ÑVwÍùZÍæ]»îÊÌsÊyïýä¾Àì|ñ}_ùöº¹÷Ͼ€ÕVØ{öw=%ÀŠ"~Äg“.Ãüã%ÈSOûú?‘¨yþƒEÁŸÿ͸HóÕÿYunð7à—€:ÿC+Å>]wq[ÝËÄaNCÇ…YâQí ¾ØC[Xö ܵö„ÛÞ³íË/ôü¡6Ã_Dl¯Úù_bK¹TžBDÙC6ó? ˜ç$øó¿' gVÎ9mÃðÜ(Ïœçt%µÓŸãe!öwÀ›Hš:òlšÏcߪ>Q_=i1€ %JPË9œÐaJ'‰Cß­ß%™”ûíiqB…¿¤}°˜ãa°g„ã¡8¿$Ðê89~Št`ñfļ¤ètžÍllïPÏàä› ø…úÂ8L§ß^m þõjíâi ,«¢"zâOC=«±g ü²˜Ô›¤Ç€ëðºJ:/d–²eÞ›¯Zµ¤ýtܪVÎ%µ¦µÎÂFMMoƒØÞŽHàÄ̺^ BÐuµ ×ÜÓ0eX9VÚ8*ñà,Öp/Ãø1•DXªç¦fXõÐÍýPú›$¦µÞi¼ÃB‡…1@ý)ên¶¹³Ñ)Ÿ³Qlw×µj%®ðßd<ªÃ›ò>Åð3f艘^ÏÇ7^¼ºŬ]%˜ÛIŽ-ç ÝÕ†ÚLîuœÖë‘fõ9a³‰°tvÒïB F3#U¬]ßx..{µËêz V;}ÆÌ·¢ÍÜ /ÿ7óüçsý_ ÿûçÿ¦\Öóÿìmàçßï ÎÿmÏ[$€’ðüÿ¿·ß¾çž{®=ôûOµýh²ííëÛ.Üo¿6®íí¶¶}÷-ýèG?ºöÚk:ꨳÎ:ë÷¿ÿ}*•:è ƒÀ§o¿ýös¥ÿÑfTÌ=Ú?ÿ—«?uÉÍÌwV„_Z3¾ö­¾çÿ{Ð?gŸsý‡Î½½ï'âú«?³åà|ìÖ¹‡Üô÷÷µ]úÐËÚ¹m÷³Ë–sqö¶ëäg P½2ù¿£>rëýsÞxtësúIöÁ¿uÞ–Ñ5{?›¸w§Äïž÷È<Ëߟ_¹øä«¢×ýé¸Bþšyà×?Êg,~öÂð¾ôÆ¢y{rý’ÌŸ_~íÍ[v÷£½þã¿¥ï=úϾrZâWþª{ɼ¿ùØ·OûñQ=uä™ó·Ÿz嘗ÚSß<ã¡ÿ{þåÿºú~úÙW¯yëGï;é÷ãÿžuò=¯œðÊß(u~ü3¿ûêûo}ûχÝð›[î8í”›Ÿ~àÍç&†/xô•cïýîßaoùôO=¶m≛–}íôèȼ-¿ÿÄ[?^^ø±Ïüî¦áŽNùäwö‡¯îø¿rLï'üí…Ó7}þ‚û6¾5ï;;ÝüúÍOÌ{ô±Ë>Qž\÷Ï ~}ËÏoýø¶{¾÷­—NïùÛžXù§/ß4úÓõá§;n]"¾pGiÞñ±ÿ-zì/ùÃß8ûÍ7~w\wñážÚôß‹¿ÓƇ.¼è—þ—g·lù棛–lyà‚;>½}Û_;ð®Ä™áÞ­›þ»õ߉‡?÷›[~²éÄ-Ïÿî¡6l¸ìñMáƒ6ìrƒ[ÿöð?O?qÕ–µ¯mz<¹ìÍ?ÜñùºFŸ/Ÿxçƒ/?ºéŒgúÇÝßyvi䌟~lÙq¾wÐA[®*'ËO´áÓóÿùêç¾9öân~ýä÷ô>pVèÀΟ±JúþÓçÝõÊá;l=÷ìmWnÛ6±÷è÷×þð·~Ѷ5¼Ë–]vÀýýÒ[N{õgã.»ûÓ×þðß ·ß~úäðwg?ÿÈ#¿Ú=ñо[/ü/qæ™Å#“óv9ù®Mëº)Ï»ä¨O]ûŸcÎüñ+ñygxÔ2¸qáµûð=[ÏÞãé­Ý·^»õ‘ù|üùµÏ½ôð%÷lzfÖ¼]¾ôZ‡é¯Òï'¯Ø6çÿ=ºxÓwwÞ²ÃQ:Þ4±j’?f¯»6=³ ±ÃÖ¾?&¾üù'Ox®û™Äßï‰~逷ŸÛx£;ÏÛåÌ[®úÅ=›Ö½ûÜ…~ð50ÖßOþÛ’ŽÛcà—.\¿õ¡Ë_Y5çä›Vg—ÿ»ù¢B.<Ü?sùï®øKöÛÛ²ó'oˆmœþKÏŽ€·ýè±ÞçÆÞUÜºé ±þÇì=Á«ÿ»mß—æß¼åOÿÜmÏ<üÖ®_ù…Óº)9üÈØ Ðéƒþ´øxé–oK~tìûüöëß¾ò¦ÑÝ@›ž9íㆮÜ=¾±ï‚¥y—¾Gíî×sÙ|tc×ÌÚò¯]&Zøý÷¾1ðgOüÅùŸºnýGr—œõ(wÖ×/ÿïýo]1o¯f¯zèÄù?}àÆ÷^µeë»OeN~*|ô“/”z[qצۿâôßlyù÷ u?þÛýäÈ‹''Ÿ¿óü—>ž¿p|ÿïw?UØé·üå3žôÒÇ ¾xÕÃÛé_™“ïߺñ›s~°^z´ý¶ÿýù]öüË–—¾Ÿ¾å#wö÷T{øþ¯ßô`¬÷{oz¿>iÞ‡¶üç;w?²é»øËíÏï¹$ñÚ®[ÎúçC+zö¾ñâ¿ÿÙã ë”ô—‹û¿ø×;>ñáOí2oküü¶«^¾þÖGüÏÚ­güö™—Þ(†ÿñ̃óÿûM|ÿW²k_}Ïÿ}æ«×]ûíÛúÑS›ÿí¢}ŽO½öÃo–/»üå¸<¼â‡¼rÍwïùÔ“×ã3û×Épá†WŽ œtî-_»ý²Ýßûú{‡O»ùœ×ÿWøûøSßZzì“_¹û«·­úÕšð¿|èë+ç=qÆS[®¼òäÀMW½?x©PI¾ÿÁžÂ£'Üù±×'®úËcÁ§Ž©|þ¿¼jèË·þ:÷¸[Ž?õ'¯Lîqfvî}›|fÛî™ïï?O¼êÙOºà†ÿå^¸îgËS/ãk/_þ·m×|ïOŸê>âè›/Úý²ä{Wÿåk—~ý¹œµÿ÷øî×.¾àñŸ¼» ¶`ë¼'.û̓«º®øåÊ­ë¯\³Kôî+:ýO‹N¸çÔï?´†ÞyÍçŸýåwöÊW÷ÿòa÷¿rÓ ¿ÜáÈÓ:Útúãç¹ïOî|ñÒû>µ%|ÙÏž¹ãÔßÝþä¥Ú{᪗nùœpÕ¢‡þž{úÃ=±_²øëÏe–gzì¶7¿ú/ñÜ·£7 =æ¤cŸúöw>rø¿CÊþ:³åå}bßœüÓ Û^Ümø„§¾|å¿Þïñm…±9ûŸ;çð‡å?ýêØûǺøû_uýEßúþMcIõ×îâßnËÎÝxkûOž¿#0¼÷â]¾ÃøÖá¿=õWŸ=õ­ÿ¼qùã·Æ¶|½\þÍž>^}×Ó…¿_{sâkøÇUÜt꾿»àÎ}ÿyŶÿ,›Ý/xÔ{ÃÿúØ)ßúzQ¼úª‹ºŽüöÁ¯ßtÛĆÕüï>{ÕŠ/>qíÊy×¾þÌ1;o:`ôæm/ÿp盿peö­G×þCxúcÛ¾¹éă*íŸ{òõy_ÿÓ[ºÿ•O<ñ©¯¯_üèg?¿ç߉ÞU£+oËgÿšxúÉ÷÷ßúñS¶l[#^}àÖ—.{øg›_õÚ§£[_xú€%‹½9¹Ç­ÜÜÇ6U®ä_Úö—tï­Çþü÷¾ëÛ÷ìvÛ²·ý¸ûL®÷¯¿ýØð–w½~«póØKÛ.üÊUìóž¸iÕð_¿öæ½ï½õ¸m¿<þ“[ÞÿðÖŸ>ÿFä Ñ«¸ÿ¨>~ý…O>uÃ…W_;pUä øC…_½þé¤/íß»`ßìm—uþ2öÔÉû}³ø¦ðð‡¶>ô‰¥møNhøK=éß}ùˆ/M³þÅ]æ­=pOËÿ`·¼}ÂÜ‘ß,\óß½žÚðôÇ.êZ™|è°þö7ñ_›ž[ñÖ©—=¹ë©ÿìSOžõ®‡?™¿â£Ï±—]Ýþ‹®è_úÉnϽzã>ó¯Å?ôÅC®ŽÿôïíœØsC¿íÓ_{jàšcþ1rÉáÃ=ÏÝtç¯ÿ~Åî¸êØM^ÝñsoùÓ=z©ÿÀ-Çö¼xÛ1‡øÅ±ž;_øcw׋7úpóO]7Þ¸þ©O÷ôݲã%‡ÿùûŸøÑ¥§ðþ¯Ý¼|Ë3o­>öå—/»ìÙ ¾ó 9L¿pÌ+_Ù6ñçk>1üŸ#tFO—ð¡î‡æø‹ÿ·÷GÿõFê‹ÿÞvúõW^ûì¹æªâ£=Å×½59ÿWo¾èµìùïcÞñ÷Êgÿ|ZGpã¾´mÓ»o¼í3çð÷'\rFdÏo¼:ðò¶}$ZYùæ¿;&¯–O\rÖ17L®z 3pæm“ûì•áPîä÷=”I~Éûn;*}ú¡‡îðÑÞwÃÙ #e“ßÛöè¿ÏùþgEæŽ{ºéÓÿ<ñúмi~û™/!Þ¾éÄ/þ¼gË ?Ù²õ;þû¶÷“¿ÞÞ»E.J'ozþCÝ›ï8A<äŽ{ÞôÞÔkû\þþcœ?)Ý3xó…kÎÜrá>÷Ø ×|{Û·®ž¼è÷ý^,që‹Ï_þ™Á5×D…£ž^WúômÛÚoñ——¿pÍÕÁo<;z ?¾ßs•{¿³çÁÜŸï8ÿæä×^8¾{ÍoN»ñã¥ooØïoûÜüŸý¶ÜöþǤûï8äð‡.ûúKKÿÐ}õÓÒ— ϼ±×+;—ñ…Ï-Ýß3¸{jÞÏOØï;_{+~À{O /û滾°ÏwNþÖoçJß¼íÆ#Ö?òÏ#¿õ Ò[û—?´pÑ—>°òÎÿ}xÿ_yéÿ]ò¾ ÅøÙ+?|ü„C‰¿ëÀ‹?¸²¼¸§°@¸ë n¹pâsÍEÛ¸“^ÿðµ7Ü’?´7Ùù`æ{Ÿzþ­/nù&{î©Ã·_Ô{þ…û';¯_ýÐ}{\úù#wßóÝç=öýL ßwÚ=}ìå_ùä?Nú¬ð¿^ûÛdgûˆ_ðÂÞ‹×dßøììk·|Pœ\òµ›¿òÈéݱ[o¾W¸ÿ}/îøulÞËG¸üçŸÿñ«]ò~nÙcóÿõÖg~vÿ×ߖ<û…ÃÝã‘ó¾þëëWŸ*‚a lÜí;oµo]x糟|æ²ßŒm·=ºè´Å·2÷üòÕáKvÉ™˜8àJ鬭;½^:ðùÿ=ü=>ÒÓÿ×ý¯}}Ï¥ïÝräùÑ=&^eï[¶ßš‹+×5400øÇ}äÀS&—n½çý§íxЂû6õ}õÍÉö8æÌ;z÷÷öºcÍ+&!œùä«Ë.¹¶PÈ}n÷žxéî`~ùÖ-/ìrÈQ¿ùEéž{®9ëðcV_vÌkå ;¾qÀ«n}ãæ“;þÁß|奉žùå ØÉËÞ<þÅwZÜyoä¨â÷nÛvøçö¾ô¯í¸÷—w~%rTþ{7>ÿñßîuÉCówÚ{Ò‰sÏx÷©?—ŽÚzQìHæ¢çt^óìçÜõZæòÿ œùõþÃKŽ+½2oëîþÜA·?µìÕù%÷ÆK·œ+¾òõ·–}üµ.?kü­£?ÈL´íñçsüwÑÛG|oüȇ¿ý¯ƒvñÚçþóáù½Ô߇ §ÿ€¹ãžsØ{Ö=ß»ö…Ó¶œöÓ%ÞyÖÿ¹îéþ±uð¡üðÞÛç¿ù¯ëßïcûÞ¿_éÄÏøðNøá_Þxbâã'ücsĶ­»ßØóöGÞ¼üùß/= ð®Ë×ýDâó?ëª^¾ä¬ÝÊ_ßwîéýãáÏo»çͽØpèïwßô•Y]»þïòÏ_¹ä÷ß>ý¡W~ðäEçýl¿/ì]:ýêÌ5oÿ÷õ«Þ:óÀSŽþ¹Ç'f=µÿ?‹íÒóûcßbN~ôë;Ÿ¹ë?~Õ{Í57–ç}𼟽í÷¯ü½çSÛöxûÀ7Ž掃R=ý-ñâïoìûÑ›¯=½×’[·u=ø£eGÿþîw¯Mlɼõžÿ;~ÎÚGNúà÷þ{áY_}ûõŸßrì«gÿû9〿ýö‡£§q÷lºeKÎ>óݧ¼úÔo_9þìE[¿Ñ;0gÞÜßOÿr`ïþŸ½§‘ä¸ê[F;’Q Û •½8¾öfºçk÷lrç»ó­tœO·k’àIowÏlßõt·ûc?²œe d„A@€N|H‰r„åG ·,‚?Al;²þEÄ~À«êé®éªêéž[öL·îc¦ªë½Wõê½zUóê½üÙ—wÿâ©FÿôýçþêþW¾òßêß9çnþû÷/÷w|÷3ß{íù÷}þïÛo|ó7?×ýÝ~áWßùúË_ýÓûÛþ'>ÿÖ}öï½ ´ýØGÿè·¾ô“ßþjï;ß}ùÖ¯üÛÁ·þã_/~ñ+×~狟þÇ®¢»o~öKÎ×û7o}íþ¶ó/þÔèGÞý™ïY½ü—øö7^øíGnÞ:þ×·x{vK_»ùÆð½¼óKÞ|â´|wõc_8ñ«Ï½4Zýò«¯¼ï¯ùíÿçæ3pñ¥×žÿñ7÷¾Uöß¼½ÃßÿÏݯ^ýó_ýøáãÚ@ðLýb'Õak¯§.ô€à÷ÿ^WîPñß»í~¿>ÿ;Œ§öÿ¯ýÿ+úÿOÝ×ï˜ð9|œ«câkSu:ÇE€ÙÆ%.Ls®”¸‘ƒã¤n¨,”ÂôÀÂ"§o-¶æiÜN7V—ê<;éÆÚò@›§q7ÝX_ˆ„8Ó¸—n+ÈD+IÍäÖ%ŰºmÚgpªÉ'9÷± D+8¾Õæ,Œ¦ÎF"ª1ƒ WwÇV¯³Ás²T´îT¢ Æ2A˜ãJ'? !o̦NWZc6ýjƒ*óÕôQwíjºìh(·áª]àОüýÿb“À ò¿õZ­öìþ¿öÿ9”§Þÿ×ûÿzÿ_ïÿëý½ÿ/·ÿ¯´ûgÔûÿzÿ_ïÿ“ýÿïÿ'yûÿÉ0pµÃ+šÕí¸Ó$v Qz` ûÉâ]¯°§t:¼Mëd¸EŽ*žgК=Ϙ q MNæN›NÞô]s8±5µ@‚·ãNã-ĸ.°ee ÌN‰ÏzÜYå„h%5}AŒg&DxFÕG¯-=Mwüm† ffV:‡AˆÍqæ¤ãŽÄLžB'ß«q¼%ä8A2ôf˜§"=‘ù=Ñ-lÕ2ǪȄ’ø*Lw4Ä鎪 ˜Ì0Æa£ ‚óÌ’H[GX†`3â4u6Óv*ˆO¸<ÚÐó]Ãb®Bí×ÍÕ~ô0O<¬£žjï°-Á|·‹)Š«²ŠàLfÃ"vÔd½-@ä GnPmÐ+Ô½‡í¼¡çý˜²Æ+þH«¢H”Ð Ùr‚ù‡û v|ÀÞÁ i–8ê‡g)v¦yôÔô¢…ªô"5Q®ÙîăÍl•i»Æ‰a-­ÃhD–YzÀW9n“J›—–`óbëLøÅdš@±L¢»+¢ÛÑ­Šó\æ ;èR'µºïTÛ;J¢nìZ‚ýW‘¹ÙåOMÇÞ……ÈÿãTãõšhw5æÚZh#L ×ÌFëÊ;ßN'8¼Àql—g¯ Ñp½S0•sÆV$M6K¸ãLÙ ñ+œHœšKœ¡X–uø(Ñ:Ç (˜‹ž… Žže5GcÃWø6zG srŠDíÏXŠÉ²"2¯df”íj‚Ã;®1Eï ²¢§°ˆî0UˆPßv9úÖÕ=Ý_„Š¢í£•”%z3“¥8ï «XGúEûáU²j'j®ãã3/w¿ZgzÂΖÅÙý=™9£Ï;‰p qVÄ*c·*ºÍ®Vi[Ö`Ùåír`ÜÖÚ3»œ«»¹ûœ«»S°žªX{£\$©kî±v’×5ÄBÖDž[lzÑ{ÿ™é! 5d•E½Å_Ô¹ Œ¹?’3û#ÆrQØ(È79gäÃ_˜Q~FA>‚,$ 4 òQÐFçkCÝå 2Ñîsm ›sè$„ÝãÀ³½Í-J­œ£|6ÆùÑ ÓÁ{ÓC7òµÊÑÛ÷{ÂÝW íú§#îï<…v©rîTš’»‹$mËdš…Ðtøh8¿ÓÂB¹–—–V”ön{v­‰ÿ<f»¬ AÓNü èÚ]ýŽvW¯Ÿ?3ùÿwÕÅáùÿËí™üR¿SûÿÆSûÿ×þÿuþ¿äÿ›MâWÂñÿhçÿ›gØŠ»_S¾ÖiÜ‚î±vµòÜc3‡00ðö`ÓÞ N lëöÕ£V*ç`à04IöB©3M:Hª¸ »MM^›6Ma8-Nb˜GeÚå…Ò>Aû7ØðB¿´Púg 1è_̼i/”öhTòK‘ÔØXjì<©±·‡Šz=ñ,gwXƒ}ŠÆôÄH1*=¨´ORu£ÜR°{m&lM«H6´n†çêe@KRŸÚÐÜ¡âêJ)ÐÝB áC9èk"è#C7ËÁîu Á.Kz90*ˆ„Ž=¾&ÆÐ×=Îý{Îlé‹Àã)> œ±«ðN38ºÌñQM]±§‚±‰Ð.LöRC.3_5m¯Ô(H-¦TÆ—Å”½Æ` øWM—pAWøscÐåE²Ï†»G&¿b–ã&sâu¿Ú·˜ª* ÉÝ’r åø6åÅ]nü¹Xâ O~´*¿Ã#¢ kĉÂÓ)bØå•-s^f`W R+´Ügªƒ˜~©É/¯ìæoPEŸËЪ┓\™;5«YG"¢ËÎI‰mÒEË‹’ÌÔð4¾¤RNCrá£kÐ&N †3>"(gapyJp™öØPsè+.”•ÂÒž (º‰c[%GPns§ÁçéêCcâ€Ê.…EæN­ Y(ËA/ЇÐo©âXqURˆÇÑÕr}(»¼¦ã/ez•9+æîbæ*WÚã[=åµÉIv‡ø0\wËí¹=¨¸CärÃ.½2tù ãkT†~;ô˜‹í]®ZM¹—›8\è)ïÏrcÃ…9…7ZÌ>Ä:Ô±MCÝgÊmΘ}Àw[Ê{L²]ýùïbòòR9QfN PŒÁ Æ;û‘iï–³„™+q?æn9Æ2‰÷±«g’î-rW/Ä’½Z w ªt™SÕ«¼•b VK¹ýwP¼™âr™àÚR¬ëCâªUÎäåŽSå-w¬`Šr©¯h(rÇ~!Ö—úÊÖ—þÊÖ–z¸“ôÀRq ¿äW=¤oÙ”[(¹]X€ÁX~uƒ‘;‹e02_oqöWY,Àžcì»+'³©'ÐÃ…!ú­ºÜax xÉ œrK[ÜÒð-ZÀ)w"ÎÞw¤P€áâ+f){ZæÌÓ)‚xi.Ç…"£„•Þ¨Üql"> ÄP SvÓÐboŠJK?ƒö ³Ý˜þ#ø/v·©­¦½_°§å0Šâ7u‚iM½VÈ [Q°>Ž'ÌZSëªLÀ©.䃎:þÕÔ¶´ð(VX½a—ÔNSëçA›9 /ìÛq3aítWªo&ÔûIüÿ5Ýqu5ñ^$Aþ?¹Ó“(ÿÿN¯-Õþÿ‡ñÜ9þÿç’ ŠBgôúÀ{æÀaûÿoKLçØ©Ä.ðÔ”#ž²ì¶Ãic¢Ù¤hÁ{TÃK»æÂ~°¯ oÍ+Œ  §O?îê€7¼Û~9¦ŸØP.:FR¶‰¬`r^ ÈÑa¤ ð\ ä§û&Tãk›ä½m“äçÿÑjîÿÉ’,ÍæÿiÕëÿa=ÿõwdDz5¾@Ç„ñ_Zm©EÇ‘;ýúü÷0ž—®\~â¾ÆýxJÝ·~ñÜUøÿýð÷'î¹ûر».}Fú|ùð•K›ç_{í5>¤_|qã›ü}øt—õòƱ¾óÏ# É?ÿqÃù»Š«#˜ec$ÃT—?÷Ü? o´ÖÏÙÜ{]ýäŸzóÞ³÷ZY½ë­·6íoÞüî}÷¼ðs¿~k}ý¥[·øÄ=rïÆ#§ï>öêõi¾ü·?mc¬ëç/Ÿ{åì'?};Çè½ü`ùÇ'¥{ÍÛ‡Ëx¿ÛeÊ?3üg¸u…÷Ÿ‡CÕ6Íápì*Îö)Ý)6 ˜ÁœøÏÀk)˹#ÕùçyèCW6VÎhö–¾"Ÿj5zˆÄ„Ç÷-4ÛG;Ðgì·(Ÿ’Ñ üú†î IFrûtþôÐS›#¹Õêž„–p«dO¢KŠëAÙ&¾¥q=‰>¼“ÍÒðûgíÀ kÏÚ{§Q»‹ÿÈ­5Ô[íBåyKÃSN·|¯á);:~_Ö×6íq£yÎöϪ‘# ÐôQ#.ÜÂo6MO÷ç’â–„ŽÞhž·Tcý]Å¿öËÝR°G€¨ÚV£±¾ñd!®B-hÔEc }ÝÝQLäÉçF# ¢8¨Ýê¡æ™óÉ7 ¾)jàëI‰ %ªáªÁddê{IqŠ5CwuÏð’‚îL[w¡Ä¤IA |ÃÔ¦¯ôQóqU× ÓTâ2 È8Ÿ!xÛÀuÛÞVø- WׯÂwȼ½dÙNôJ¬áošÒ&Ñ«ø"(:Xzè"ß¼ÆR3üšmÍké/Fú p }ÿá¾’²¨¹„Æ>žÓKcb–.--M%È&š A:ÑÄÅcão'ž9q&Rw¼ð뉟‹Ê¯QåÏœ +0"X“`Â.¼d$ƒˆA %RŠûÑXšJjLÖ˜›š«ì†Î¨0LeK7aõA[‘=ö’Zߎ— j0rͨ_¤†1^‚Q§¢¢]C¸FÔ¥FW¥¾†ïO â‘ Ë[ñ/0! Â*Ìp Ëc ¹Éø’qYZJk…FÜœŒa2„7âibï9®1!€ì©`=‚ößþßþÆhÿ €: u8-|LPÊ'Õ…¤@ –IRÓ {6-¥zœyI5mOÇrže§nš†ãéC\ƒÇ éî§ÎÝKËT¥k& ŒÙ^Ì·ðÌßP±4–öÐ>òñM~¼ïo,PÀj]2m%ø‹-AÅUaé1€,¡– `ò1-§I!Ö#a SÙ×]"¼žþ|céiuR)( À¦ÒÑ Ò`-vá©gb—nøŒ™‹Ik=‹?ÁfôÔ*ü ¿tÒ_zé/«É—g)"À CjÃ,©°ƒæDÙ ?Æc }àf‹KYXÉ ò‚-”`œØÞ36–ÓV42•SZ«§©"Õ܈¹)ýIW¥Õf¶.Ã/ÛŠú4¥™d¡ÂÒ“°)zÑ#³o²8N¦¯Pdâ<÷©¢`\eú™ÂÄ q7§(YLÞmŦlþcÃ'üíú#£hoë°]̳lbØðljƺiÀ ö`æÚ»³¥[\*˜n¬!' ¬Ñ^àêÈÑFØ8ÃWAÁøŸ˜øÞ^¯l¬=¿ƒ#¼ÃxÙþ6tÁß{êœáùxÑu͸õî6¾Nz@V«|”D 𤺙2Q8??±ø#r~ôчliÑÃÁÃÈSF:¾Ùpe]Òw@ƒK@ûŽ¡b3ÉT¬qâg’Š)n”©¸q %(dàZ´}I¨;ñè£'aE²Ð‰§Ãÿc¨×ÿËÞ³@¹Q]w\TÃ'Ä œ˜Bx†5Þ5¬¤Ñ_,^ïÇÞÄŸí® …Õf3ÒŒvg-iÄÌh½kUür !¨ã$!-P0Çò! Ÿ(P>v‰NÁ˜CÜÄ|mJ’Þû棙‘F«5F¨§zÇÖêýî½ïþÞG3ïv¹4£RÖ¨‰L;Z ¤²úwûPÿ•Ï€°ÁZX@ëoÏ.%ƒ’ Ž d©ÍÚ™ {¾l —žj¬¢ dÙÛiþÍ\$мY‹š^œÁø½~?TY>ËvưXB¬[Cå˜Ež5`ŬFU±ò^O[‡Ù@³ôÓ4ü*hËuúˆˆeaÁ¶ØOô93lÀÌú­™òlƒDÔ$áРѹUÙÀÆ  jÀnw;iî`F¢àçÃÞp€à—ˆ¼l„ÄÀãÓbšÓ¿ÅbÚ· ÄMÛÒ¬þáYjM°È†£Ì4].à¾Ø\1”Âúm,Á¬>ðÃÁÆh‘Òé÷†I;é –u”Ƙ a¬.|$RfîĽ \`2#ao4¢q¯áÌÖêñÃ`;@ ÿŸ%=´~QÝ´ÓoM1€ k€vˆ—«2›ö. x#¡2ývø$lÜ‚d… j¼8œªàŠÄ,ã®s´VÂØHíA[M¥·Í»ë–É¿ (6Ûµeôé ÀŒß&:‚ÆÊ†#„€ C12 S©o9} *é W+ë¦7U³Î"¾áB¯®"¾õCÚG{[W0t®.„dv_%æ60¾î5kŒ%Íì³;ë,å6}èã4¼W$H³ÆY½‘õ[sUçªê„Jd5\j­Y9k•`¸Ælö‘Íc5'+e fåfgŸ=j &î[êi$;¦Ð!ŽÉÐBæ©Ýƒ°¸ÈÝhߪÔÃDìþ  »Ãë°\ñV~Øýr8ÎÚ!ã]ºÊl€£!oÌŸŠÏP$Dã6ðÂë1öN°ä­N€Ã Wã±ã#èÕ¼š­eµ€hÁŸ²:–å” 5ùJ1”…±¨®Sôþ_Ø®A¼P/ÆC€;¬d1ϩܜùë¸]Á*ºT»ÕFåf÷á@Èj÷˜ýÐvfÙš ³F-É*æ^ -7/m±híUaC׃U)ŒÚ–Ü…líPUëÒoú¬2*›ÍV_G!¨°UÏhL®X‡ŽKòLL:Ö*vcÒ[^–Ú= ¥£*ö U“ú¨óïQåLuÔ®Ž  Í(Z^[ Z1VWd.㬠v¢Æ#¥nDºÆb•luc¤ßª½àúú1~‚ê®[Vµ. ,:o Õ,·êŒ!£WHWî¶j,8ª±š…9‘G­*³V¨f>ËÜT†mþ’Ëñ<…;³jÒkîÏœXl{ë—­Žû.AØö¸ÚQ·’ .7.PåšÛ†qvKr{ÝÔµ*å¶ÍíÁnômûÑì’?ÚLûd (Û)Ò?gRlت"ŠˆP«4l•>«:7VcÐ.~,e«Ð²VªMIåµú°UÙ†]y^ÝÁò<u ªÅójè!σá*´Tçy”̉çëa¼ìÎÂö9ÐÅÑXëâ\¨ÞÝUlܺ ÌTb§ tÅÎÆ¬›¹L%öÚjÀF­{3á¹ Úˆ¿@¥¨˜‹â`tv÷\èÃB°µ‰Àë÷FAkü^\㙿¦šÛ¦Þ f a.¥…°5£üø³éÔ,›( k{@§Œ"èDQ>¢ŠûiÛ™”;ô_áãçvƬÑ~<['s"þ ©ý†ªýô†e›Åú3Ù,BbÊ}ûÖö·âxüÿHæý,_ß:µßÿ€2î ƒ áûPßzÿ£)òi!áŸg“qØ(„#©pŠM£<—ü¸ék¥6}ûÏóéºpÌbÿÁh4PñþW õþWCÒ¢ÁÞþNÖdmýÚbÂÄO¤ä$sÖY¾UÚsR°j"C¾~1ƒo=øúQWzaùÄ ]]¸@¸,3ýgÏÛ£Ìg»xçØæcóO~ûÿóÔCKî¹&µÿ3oìW— n[~Ô/¼óÄÃ{öüíÉ‹·ïéÞðÝÃö]Ï¿ß)»3ï]z•9qïö®+”ÿüáMÏüôk¯ž¿)¸ð²/ÍÿÔà·Ï?bÁ#¾™Ø»ïä»>÷è'ÏùãcKî½tôð›}ï·Û».Wþ°äȳX~$xÕ:ÞËD×⛞goÈ<}ÚÔ‘;ç½õøëßXœùÅç;ø»Ý >ˆ_ñÊÆß|jÞGüîòËûêÐyo¼³fÝ™qÒ·.<ÏþW×+oíè^³æëŸô?}åÊž/î|äê{Ÿ»óþ¿JnÿBñ‘öoúòú½ÿ|2üöóÿà^fðW/­8êØÏ ÷_ô÷ø2ÏÀïßo»øOm_ï¸ñ£¶-N2_gzÃ'öÝöçœ°ï—ØcãG§¤ìÕ›KûCK–g,øñé«Óï-{û¹™ûžßùéUÛO]sá%û®¼6yÉšµgýảé¿äÑ][î]pÊá!Ï–âõ—æŽûËŽ;{ÎÝ÷fï©ÁÒÊ-;žù—‚ojwåž<ç°ÒéÿþÂËÁñïvýcü/n¸bëÖÍÃO¼v粩›?{­/Im™ŸÛÆÖÛ’çÜôƒ^¹5’½øù¡÷RC›^¼ð×'¼7þÇ-wüõ_Ùøæã¥žÛº"ýnæÅ/o»ô¯Îßþ¹ÏÞûÌþÍߟ·£ø¯»r™'v?ýòß<ÙuUø!é„íßÌ^üþ ÿ}ä ?»ulá=̵»ÎÈwŽ»«û©‹N=ðo§KžwÁºÍÓáër· ¼vÒäá?dýáó6_}ìÑ5oe_êÙûêÙï\±5?ýì«ÉÛwx~‰Kdîø¾çò[Ä?qã÷vñÝ‹'o½æ7/=úæî»øåò«yòÈ]'…ÿbdÿÓ×u.Ì=ðÜï¼û[»Ÿ[ø£lqrKzò•Ñ/âõc¾t÷=ïÿnòO?;÷O?òÛWö©÷]½é;ןxMÄûì ÏwÝõ¾§ûø]~óÖËO^>xÀ³å'ŸLÿzþ•—yΞ¼tý§Ÿ½Ì³àú7Ž¿èñoǦÆ_Þ4<¸1ÜÝXxøÚ–Ý1xÇg¶µ¯;~êŒ[ß¾î´/ܽûWü¶½{Nôdö3ïìŸ÷“SŽ¿.þŽ ô¸ñqžYµx_ôþl»–Ôº}À7´©ˆn[Ѹß( •Í Î}¸÷­x‘[.MúÈ«þxÛ(ã¢Ï¦?´¢ÏcÑ2¡XRR ƒ²”‚=󈬚øðÎkè×7­® g¾¸_¡]úñ©p–¥0c_7ŒRFâX0êÓƒv)$l4Щ šÔJ.¡ô*Ä÷E‘WÈÍ3Jð½D`éÊÚ M8•ËH㈠UÔÁs ŒoíàjÂvué ㎆t(Œþ¸ ‘ G‰ö@XaIãL£GäÒÅ}|42ˈ,ÓÔNB)$u5^R,$1éj!›è×õA)¤öHÙ<—RT!+nÂÎ"|#LÝ63ÆùÑlhóŒ˜Û0{ãš<-‘öBNÑâò‰9•dC¥‚Ú1;C\Œc”«DE-%”,—ÉÐq&`¨=À U.Ðx—(òó855ÁK㊗èm€µ¶þsæ šeµÀeHÝœ‚Nm °Ã¶Ùø5G®°uq¥W0˜rèØ@6H"_? Ç°ŠñÄæ:È@]ƒÄèÇê„nQTI:ÃÓÐcJFòdÝÊ¡¾î^T¾áU}}ƒëV÷a´¾¤2 :ˆ ¡N±6lÚ\÷Àƒ¥â ªÓt÷lØCcä°Ñ;‘).S\©¶”}B‡Ò­Â,“,¨Â!t%º’¤$Õo%؃ÎT(ÂÒœtDªÏ= óÁlõù4€*ËA3O–TøÒœ«C6ü5 ¶§¨mus) \*äÐŒêñjNÄwRžHijtpÈÜ@Òê ç$lì¹N[Ú$:µèA8¤³ýs’{²>Øu$+¨¯/³ÀæS5¬-¨töÈ‚¶´Ü'9¨ÆGaZù9›VÞ0-¹Ë‰¹ñ¹YW¾>ëêG§+¦- ZXÜfðÛ ÑñΉ£Œ•§Å^AÅëfxœÍèý@¨1‡r Í8:ŒšôJ©BÖˆíXšË\ÄEÕì… ƒ…tY¦Ï#%š­táAÂÖU×ø7ZLà½ÀôN½bBƸ¶Ê1_*úó*Ég §²%Û|V{}½”‚uLEÔû“è³—V3Z*ÍMû’è·Yv×–¼1­Ð}&úÓ%,£ËS˜Peó!K/ÂsBMY”"eÊú¬Jx«_£»&uáÒS‘œBÆ…œNL6-KYJ}6¯ÒFŒ½žŸ¬,­gf£ä€õŒÁFhlŒ²þh”Å&JÅYŽ+Js€–Êçgƒ‡MªN;÷ W+ÕJŽóßóùOíü×m=ÿÙÀT!ÿ ·¹RR‡7ryûÕÏB~¼¨}þ?û…ìòY¶uþß´háàpg7/%…΀×Ï,Z¤ßñ¹”8/ù¬yÇgôìÇ^ÚýžÚõžj¯÷\JV”cM´ƒ²åxloýNc¹¢!¼±5¬E¬À;Çqþeh´w耓"l3Ò8ãë•Ô^Œ½ص ¼fŒB- ãS0ìü*˜‰s,)24è­¯/—’í¹=Ö „#„“en† ŽZ?¬†×jŒ*â‡Na˜Æ¡Ö¼°ÂÄh÷Æw†±ƒ`á yôGˆ¯»Ï̱ãR°5KõW”añÎÓfqŠyQ€uލ˜…~(Cœ*÷C‰ HÍ‚ ¨b†/7‰_OJàaÇe,Ñg#ïí«$ƒp}N2X £ÏF d ØáÁ°ªÀb*àÁXlð‚P²ÞÙ ôÄw¾ Iàõ²9³ €‡¥]–ËñÉŒÙ1£ålC0Z®’º åœhC€„+÷„±s6ZC@gAˆH9 a A¨$! œ$„©`C zèíð€L± < F¬€ãmð"€Oɧš%@qΦH M²áŒ©gH‘œ8#0^ÉŽÆ Ù0D I‰hÂ,^»ÌŠB%Np ¾‚gÆP°áŒÎ;<`ÐŒÑ\D‡¡ ¡€°$5ÁáÁn>t+'HNP±Y i aâÿ4lôÒxÝ6f´=™5fѼ°é–øúza“ %àH©Hò° Âÿ°;I E0û”ps»³ÀtmN/F=›žRo§4`0!¨s’È”hCî“”Î! ¬‡XÆf©P9<æ®^¹\Êð5ª\úš—]»×t®MfÄ a7ïÞ¢*n{µ© ƒôÝÊ]‘õUQ[+]¤2'«›J$)j"aŒéθÝ})=v O|èlJÜ„W˜3¾”$É|'Н3ÍeÅÌ ±ÉR\!£ÎÒŠB¢ªZ ÓÔâQ`ƒ,hdúrSÃXÔÏQUc½~ :FÛ‚QxPùYد§Pù§ˆ³“V½hCÚËÎ `Ú ì‹*ÆØÛ…á |±4õa@[ĉ ¬g©ºv•TUëÊVë©RèJÌM)ú0„=)ê1À¨yŸÕ«¢tBÚHŠhçÖr+Ì$*X‘lñÅlX€µ°«Z,ãâ«¢Þ—r\F±—ƒ&$iƒBO3½Š>††P#ŒÏŒ } nBIj9+\3äZ6T¯gk”“òzÃ-æñ'Ð2¥>êW1)z‘LšSOûbÑ6ߤ5#Z3 % —p¬´LïÎ’quÚCcÀÁ_OÙr€lêI¡ƒèÑÞ ×žhï TÆ"Â$©)E˶Ÿ©—O:ÊZ"2"³yp°Y53Š(2­ÇÁxÊ–jU2¤ÉËÜF~˜ÓÓ9h³S³ýˆÖ#ÃÍ25^E¸ñŒ×i‘îH °€‹‘NÂÃ\HÏð%’ÁÓkøŽÂÕƒvÀ7ØzcðOË„¬™ˆ533£Œ…X†5æÂÌ0)°¢/ËMk_ ÞŠ¾ Û‹–Ù€%J!ILŒY‰Ç=#ãá2ÇSU¶x9tOeGj¸¹’.\‹ÿtVYݦ½Î&/)§©L.2éD…Öó¿ì]w\Ç·—‹5£Æè"! ·{{ R4*‚pàÁÁáq€HQl(šØ[PcﻨÑD£"6†Ø‚Q£‚ƨù%ñ7³{[ooï@HòGøðá˜Ý½WfÞ¼ù¾7³3t3™L"¬/>-91‘£+¸¤7¤r.Ñ©[zç"I"\„j2,é¾H?‹RÐÿð1^IFýfP Ãz … åÉ“8ãu&˜ÜÀíøÌhH576Fr£®’FAyÈøˆ8ój–ĨhÎàÜÿñ†ã``° ó'‰™/Ä`CLz<å©K2ÁA×(‘RßN7µÄ¨•‰¤Ã\ÀéÛR DHûH6шß,Nw÷Ä*œ=¤ˆh-bHr ƒµ)Àƒc@ö]$„Iúˆ„˜dÐýôÄ †7¹‘™ŽÑ,d ÕÌá -“»»3‘§Pò“Œ÷˜‡‡•LjV&l22 äDÅÌÿs“@JøËJÁ'‚6Ϧ¸!#<&ÅDÀ*1gp øˆÈ)§ œ(…£$$QÆß‘ކ D™¾ }4qÌ’uEQp‹õ—éi ^AØA etæ£i…O¤%‘‡4Fü¥»¾[æu–,†(Õr \`r²hY`CQ5]攘QŠ"*HM294Ó ÖÙâ‰ggI(çt{â˜gâaú`gæ\cæœbîaçÌÑJW ë°sÁ³†Õ5à[,ÕaѬœˆJ@#ÖIÊ.H|¸.ô1©´!$ãžLÍ;Û¬€’ä4GkJtÀŽuò2d`LRˆðS¸ÊÔ$+æ0i†½\‡+qÈ5vª”f,Z¸†C˼¼E˜[Zá#ìY„e*¾&«uÂS]i¡1ÆmV`/¶%Då¶l åÚjŸ©5ìƒÒúÀõµÕ‹,Ïîò©ñ·|*Œ%_–=ÿýÍR*4,)=“ãEªk~<:r‹ÎZq˜ž-¥š/¤@—ä€+¸¼H/B.ı‹•¸GRòjšÝû©¯ðd’±mXÛFÁJ yxºÒÞ—®^Æ3³û8*R#ÛÂ2WE’0oV]ˆ+J0à§Ò°me |EhÐë"Ó¬Û O3‚¯ÒU®fÍM…GR¡à4hãí¨kÖ÷åÜæJ"ŽŠOH¶J†§)*Ïr9áÜf4&š`Ó„1ô,€Sd ±x`Ü5š;Z¸)"Æqd, ‹-ÊmWó”Ex¤ègЇë¢lU&=ZXáf)»~0þŒhr ×>an›N ˆÚ íaD+¼ìà§Æ…:k¸.xèûªÛmùºZí$´È,¡Tß,༾õJ² ^sˆ×‚‚› J4$BÏo5gcù‡Ý¨J»|¹<Ëòå°øº¾\ÎÄÞ  ƒ¢Œ–@Õ*6e¬š×\%L– ¶lÅØU6^ˆ('Í`›$Š×Šþ¸†üø'×€¨¸Š»“äD.¶‰*ÙíD¬©ÕYP` FCЙãù8º ¢à¥e’žUX a%­ºN›Ìål+ð$ðŒù+Æ(„hâl Њ©aM,ŒÝâ^v ®ÀvƒZØyµµ‚šXxËpóIò6&[0bC!{8 'Óp{+9N‡DĈeyÄhË»<–œ\®9=j-Ä·•å´?êŒ9IÚ@8 ³eÚ‚Û5«ÄŒ“ký0؇x•äQ¶=¨ ²ä¤e‰7:mT+z•ôãdh½ €ô‰²eóR·q'ÑJÙäÀˆÄˆÑ:½Î¤ÓZæ<í4NkÙ&5)œ®ÊT‚'8)Y³!Û'¦U{®Y 1N—ªIv²³þD› S«˜kSàÞ@¢Yc1–f ’©y©Užû’G%äÚ¼‰÷Ô«ïÝTJ~ƒˆ:;LimâÊêÜA-§"¥TX¾²*f Í_U]V&vÏ1ز.6܉X Ww~ ÐÁxs ý“M†j%Ö9W Év +Ê›”°CV቉ڗ•×ÍùúÉÀ–—=·65¥°° ®K x«˜^$y!€YD»f1ìÇÎAZÉ›J#D¨Â|š›ªM´Á̘€ öN¶Y•Â"e·¸2_dlóÍiCõ1µŒS[°üšimX JöךêLœ@p)Æ]ðIRpg~˜%ŸLåTcÉ'AZÎ]§Iï)¼ôVÍ[âÊsÊ8w¥mõ×¼Zo6×Èa¹š ³Ô²¬·æâÚ*Ú²ê€2£VC\1¡_/Ê­ÉQ5»“À]Zm-7¡¥²HÚ&¨dÏk%[.`âÂ_a" ödåß½ÊöÈLaFá÷0H”†º*A´Eá 8cg‰€0Ž;8³ÖCÇãà Ž:2ò­‡ê¢CšA§[Ãåœ!Ž,ã û “P­ÈYx82  ]‚)€£©6^Á¤Qr3^‰„ý²ÆÐ‰8¡ j ““eª¶`êEPœSyÆÚ[75ÅPÄ>ð=&Ó=‰ú$ú©\Ï$:Ì15GVX¶=À7z¨‚3Æ›(),ÆxËÁÓ¦Xr W,X¶O,¹š-Q7Îß²¦,ýAM…×$5%V“Ôäšš¤†³Gƒ1>B¯/’Å&¨p‡JÞÌ–0»}ZIÅÚ•ƒS ‰p£DƒÑ]@{ËADh8g¦S-8qÐÍ©Ïë±²Îç`ŠŸG-h†sÍ©ö4S*øõ©=~ !q¨>?6 ó“ YJÏÚÓO&d)µÈ²—jñcOXå‡ ÙKíñ“ixó%~IÚH[Y}ÒMq–HW³c |‹[ÐíYƒ´–9¶OR°Þgg®x³õB\ÿŸ*çUmËÅÑv2´r€¥ercÿ¼V!ðýn¦@¨$µ!8Ý¿f¾3}F*6C:¨ #È¿T·K9&"Ëé\¨‚H¹Š.šõµrW Š@ªÈœÕÈçþ²ÕDZ—Lƒ0ýŒÉ»T+Û"j²×5a Sql ŒVµ’´bà¹f\fH‡'4ÖÆ9 » »=i±­Ý'ÔË8áÎëYã?'bM%÷³×=Õ‚U*j̱ªåÄD–YV5Ž(ÁÃㆸ`M}Á"Tˆ0ʈéšÚ4U(“a0YÉ$=ˆ{vÉê=ÔâžõŸþ]BÕ„9mÉžú"7'¨Ê–ü±; µ‘“„¾CîÊb„«²ŒæÝyÈM]à~¿ôeóv¿¤$a¾ëàýߎðÿ¢ŸjîÿU…ÍÙÅ÷ÿ?rrÿw9®¡*p`>¥ò¿ý¿ÿŽŸh\ªq­U«Õ¸Z­ŠŠÖÈ#A+iAKÈòOË÷ßOíþT³ÿ'FEÛÏÃFÿWÉT(ÿô¿þÿ÷ütôôvÁ\qI÷‚_f¯–(ž’$qw—&·É@ ’zëôpÓk©7´O€9¢´¸h#â%ã–è¨3tRüú¿?$ŽG~ <ñ£[¿zƒB[¹|çykàÌÍsÎeïñ)]xºqVïÇiú¢I£OG/\ÞáËïÝMM+{Ó[\ÖñXEq†ú«Ç„„ŸÝŠÏ.º<µÕ¥À37³æ?> k÷ň#‡ÞÏꮪ;iné™IóûJ9Ÿm½fêúcm\×­õn]¸lUîüÒ§·VW´Íz¶è«Æs6TÌþâîì»ßt.¸Úïa¼÷ä;yÏc.ßÉk3çTëó§ ½Ž~ëÔ£Þú´þÛg¾½%fÝðå‹cŸuÞ^ðÓÜÿòyIrZÔG©èÁìœàü¿Ft»o|óÔý?ÍÕ'»ð˧‰u꿈½ŸôgÊ“•?øTú¶;Þó¨óó•®{Wž¼;·ù‡»ÕY1þqÝmŸèäÜ m3|BÃŒ•T‰™uÞ„8$ºê£^ö˜™þq幆š—;Õ/·v¹—æ|ý¾áøðþãW^Œyv}ä°õqìbåšÈÀl¥ë¿?Þ äù°hÞçFõ7=mrhïÁóc4†­ \¾0juËAowø½ýɃãL±;ÿì¾¶éóx\Ýà™ò‡ 7îéRO²¶Õ‡Ú%«®Îö}áf¾¾oÏòÄŒõ{)×} Óâv7ÜôXöÙñï¾—÷ñ­´ñW°¦ÚOnôÒ,Ô]Üë¬o$[Óäë†Óüo'õºqëÕ(c—7ëÏkòuÖÏ+7+â2ôNí°?‡JöíÞøcŽ!j÷î§Xçã-<:Ž]œ¹ìÝâý±_®YØ­MÖ;Δ»oœÑÈçÚô3'é–ïæÞÔi]éäüÖÃ×£ª¬€òÎKNºpúAnðåŠ.Ô¥7ÎÍIžÒ*çæéA^ú:n¼q}øÉÆÓ·6ç7L+uµórUv½ÏcŽÃ…6ŽûìÊ×=–óûöé×Føîm†ýhŒ}0×/ød椾“ûÖw›¹ºä·%Ås“¯ë"nì9Ÿq-ûPãŠ÷ë)ÿˆWިϟsôÄ‘ÜÊ=—*Kœd &,®#}nTIž¹íÊ®ïXl<’^<êÚÄWC;Î;ùfù×…Oô[VæÎï2ÚC=MÛuÒ¥{OtWO‡¥W4\9«kä׺ʴEcö.Y¨q_ÿÖðÙóÆ·Qüå‘0oë73~MKÝ7´çƒq]¦\)Û½;9³,¨°³ó„y¯üFí¹–SÑôòÊn9›K”£vqJátâàÔ£kÚΘßâûýÛæs[qXº¿åN}ŸúùÍXš±cù•\¤öÛ¶À5|Âä‘‘aèæÃûßz¹2õt‡ü±ƒ;ÜÝ‘rtr¿Uoaƒd§w¼4õ_øÞ±ö±«î`šnî8{dPS#ö4<{åØÑ²9ÝŒˆÝê0íퟧf­\ÿ›ÊöûOíWw빜ißÌ7-è¹øÀõ‹I ZöXšçâó{ù‡Û7^ëè=eÃá~*—öß6Ú°ÿlà•wn„©›¥×÷mtH29uZ;ó&ÖÏt ØžÜR=ý劂1‹nOo;ÇM=#!/ttö¤ìéÈÖym'Å5qL;ã¾Ï‘€ ´bWFoÇŸ3¶4*³SoüHDFð¾¹Á3ó]—ÕP&ÿµPS¼äy‰ÛccIß•÷Ú¾Ñ=4/¨XÙ¢àÛ }G®ëzø‘<öíU FWwÚêÞ¾ÿý°oëœM:>ý»Î]_¶ïd*Ž|T¹®î‰'Þþ¼xÍѬö;o¤ÌRHSÄZúÅ•¶ ¦­DçÊR›«>u. tüÜñÛàÍ¿÷ûÕoSEü½‰ƒ{iû·P<ÿ=ÜTP4ábþ’SÚ„(3ôÿA¸¢4æĨkrÊ„¤%j¥0!!õÓFé"Æ!ÄnÒÔÆ±ai±ë+‚‚Lj½Îá^7Aà²y% h4DkM¡R™iˆvœ |Ïkœéâýx,ño¸ã:F~`$iÿ„ƒ))TC\ÀPòn±&…/c' *¨ÇÍÂã´ð!=BˆŸ„H}uQIH(¡\$ 'L@v¬¯b\½Á#¦½!†"óX©xõDk$‘ú!˜‡‡ùA ïAB1‰yA±L&\©Obƒ ¨!jM‘yûniðý¡AÿgïJà£(Ò½†ÕÕAPÁUžÊÒJ„!ô1} ®$@”ËEabœ£“Œ™‹91TcL>šåè˜zI“)&„—ŠNÃ+àQi&2¦^†dbÊCStUZ@^÷ŧ:°¼ª'³*ê¶bð ðÿ”Ô¥2JÔ1Ç%B /àð» -q8›ÖÎà(ÅáÈ«’P¡n‡çÏZùšÇ÷L¹rxcêÉ‘)þ-¹Ztv;^É##\!%ƻԂt:^å§,Št­*äZ„DÑ¿‡‡À¢š ~Y¶ V=Šêê$­M2:kåk3eR—«09Cæj«@ý²kUÅ’ ƒ²Cß(éTvEÒÛ­¦#´šJGT:Ë×**Vå®;! +ÔLœ~o…lH•·ÛµµÖ`]˜C·E&FfÐćû™ÂpˆHAu§ÃiI¿ªdÆYŽP¡Ü†\ÌT‰§)¸.2Ü•‚/˜- ަËÅ1&ÇÆJ­P<6#òlL.Õ„ÿ0Ç/›Ö«Ÿ*ð¨@阶žÂµÚ5—ÕAšVv‘9øÌSYC*£ÜÑê;=KiV¤wy)JÈÂz§ÃªØXXk¦_D)˜j³j®„ìõF4n $6^q Cp`7,`‚¦! RFMØz`öeBÿgw¼ƒ‹É-<õ†'L:#eª%kµ%^=Fr$Dsf¡»L›Ä:Ønµ«ÆHc½çpt”È Y,C(ˆ pdžï '›ãŸÊÈ‘£ŽÌÚˆú'ŽÃvÌ*Ówç@·øp…$²¼Rgd)䞆ÛÒ3*žŽ‰Hk™NOášÞLÍOdï.¤Û ’öOH^Ú?¡Œ‘û'”¼BÉû'T–»[\‡)bú Ìðî•V§«¯|­’T]/‡X‹Z¡Q.é 7ØNRª®×é©Ïd¿«ºR¦/ÄIA=€;“j­„êhÆ’´2ýªôzVàžÄÎf RšÅD@V¤Þ;‡í_È€ý Šýó ܱÿ ©‰]ã†*LŠLâ CC+TŸŽeë)\³G•±Fq.xXäê²Ò:†jxdÁ³hLä@¡“÷Íœ´/Le{Á•ÅkõK;ª½çˆsºúf]å§,Ä´­„ÈF‘“„ÈÇy?ƒM ËšPG‘\…+ AkTV ZÛ1¡Y•)-K½ð”¥“î4¤£MtŒ$–Ê Òa„ˆ$Œt~„–ܤ}Š…«€'kÙ6/äx¨´o†)3BŠH϶t®UtT–OsñªùPªÌÇàN™ANS¿D'¹Ò­J÷).V=-”ŽêËFhÝ3ðkê®DØÌ-E;SæÉ< wÐC ?0Ó‡ÒvJÙy#ÜxcâmýìÞ¡µä‘@~ÍWªñRþ¯äñÈþŽÿ‚þBü#ÄÉÇÈþÅÒ<+ÚI²Î„¸N›XÞBò&Îd³ò$m­Â©n_þÊý§ü!_Ø?G±TLüˆÿ–·ÿì_™ÁÿXvÃ5ì}ÎÚï¦|[ÔûÝ÷—î,¨˜_PZ¸gÚµ¿YÐöÀißÿÓÓÖÝsjg·»÷µ›ß¹Ýòô7“ú>ÜçX·¯/û¬ªñ‡¥_ž(ûçúŸìƾàêã¹ä–á쎕íÌœèeìkïºÝ/\Ü|ŒŸ½ïèÉým55ß,[û÷kì<¹õäÌü“Ì?Þýö®… G5,ï¾åÐe‡Úgÿù­þrâ/™±øø®ÞÇÇ÷زøg/94çÀϳW¼÷ÕÎÙeÿuâƒm}®Yõ=/N»zÂê¶ï~é3å]nx {話÷zƯ[¹îC«q÷†Ó}²öaÏÆùMìŒ5ÃúMwµo;s³ŸîšñK?âŽeÔ'ý|çÆz¼ýnË÷•my‘œ6ÙP¿øg[qÛ¢½+f¬ÞpÚ=›†¬oŸ×½[óO÷8ixdÿ“ˆéÕ'þbÚt×ð™—,¤—ßÓkÀ†ýì·_ò·S÷_ìÜß~¼aÅæo½ûÚQï™ÿ|üàÊU‹ÞlðÖößsËÒÞ_~öèôG=×ßøÅ–Í“æ>:䮉=wtqn>³mçúJjÙÀ¯ïûÇoG>=ëµÿ.»õ†‡5¾þîÖköîë÷ñïwv½ðoÝl_/ùé±£=WÎ~pêCo>\=ຩs—OseÛ]{ÿzbé¹#¬±ï\>×öäí›WÞyðãÃgìòµ¬Ü¸`ëŽ#Šÿ}æ7§}xöìöe·Ýåxý¸oO.=ç®Ç¼¦Q6~ï{ë¼/Ê7µo»ôŽçï~Ýç/;º¾û9·íø’¿ðƒÑ ]®;~?­Þr玩sW<Òöd§ðýª–¶ 3üî¼·Î8ù›þMÏõ=üÜMýKÙôú›Çìܺ¡ë¼öµ\½ví[óiÀ³åe—ß9ýÒÏžªª~ýÄÏwvùwS/ó—œ3}ñª÷Þ)­œýR—«Ì/šyï%Ÿx¹çܼáÜ‚)]f>Z¶`ã‡ÿ´®hå+ƉÏ>¾ýú15ý'Þh.ütãÑ®Ç?¼ç“º9寽mÖïÏÝ´ýˆa÷òRÓÁ¡g½³åµ•/Ÿ¸hÊYÃ{jëvôóöÆåOÏÞW]÷Уž{¶}õØþ׉i‹ 6O¿°«y qÁïvžº¸«ùáÿ5bìÊÕ£nÝÑ~ÖGKÆvGß÷— ܼl_²ÅpdÐ+ÿZûÀ¢#¾øœalÉ&þ›žÞᯜöL—?6Q0ºÇO?Ü‘·}æÊ¢ºKßïõàÈùï¯Ûv÷k뇮v=öÅekîr¾_ÙïêÚW®›¾¹¢©|Dp~ïU+fU®ßøÁ¡UÜçÁÞ[‚'o{òê¥öž¶feó€'nž8bÿºvêº5w\j›5vÉ’‚× ^]±ôOäî1&¢ðÅ!Ó¿½éèy¦Æ‚]ö¦’³G2wk0À5÷z¦xÜ‹ÌüßË}{ð=K¯¼â;rÜÉy&NíÍ—Î*¨Üß\±mÒµ×löðN^Ûåq†Ú4bÖÐ[Þêyï—Ýþú©x… n<û£òóº\xú¬ES¸¶^õ4îƒ7½¹úòÀŽòýÿ~Ùæùc–Lý¤zÞ{#Ž>4®ë3ÃÿãÙ³Z?®zcõÃ>8kjõë÷ß·ïÉÚÅ/]ýEÅük>m.Z3aîÎc»¸Ž°ï÷šZpV×vÃ+o<òÕÏW3íëV—õøè‰ÿ<8sèÛû^}{îö«?ßöü”[·w›øfÓ·ã6Ì¿ôÌA³º½U}¸OÏy —>¹­ÿ¢gè<~ÿøûOœ?týòî›kmÌmV_°è²±Ÿ?|ßœóí£8NR`Í3ÆüR_g¾"çÿ¤¥³Äfù|üß\\Që?lg‘?™—N®(û·vùsd^þ¹¸¢ìŸë,ò§òòÏÉeÿ¶Î"ŽÊË?W”ýóEþT^þ9¹¢ìßÞYäÏåñ?rrEÙ¿ÐYäŸÇÿËÍ%ÿ΃ÿ˜ÇËÉÕÿ‹Eþ\^þ9¹¢ä_wªåÏ ‰^þ¹»bäƒ|>Ytû=¾”Eo àÄç¿XžæŒáó_žÓ$Ãñùó_¹¸Ì Í^чXP/ZȾµÅ`ö‹ø{ÏôÔ<(üýÄ9ˆ2x“¨ëDDqo5˜1¬@Kr¥j5cЛ–Ø'#⤵¶Z #­þ@ð¸H ‘BÊÈ~œÑ_>†s @˜û±Š]$ ¯*t£Æ×š¡ðI± ‡¶ •îÑçX =à`ø,.\z|‚‡˜ñw-uŽú Ol6¶Æ §ØDˆ  -Mb“Ëc f¹ 8ˆ´Ã柆¿(¥Iʨi±Sƒí´=àÜ%nYm-~•,ºíJ5p#·ÂPæq"¶{|x 7WT˜Œ˜;ž=&$†š¦³?h•Um@ˤ °‚Æ‹.«è#FÝ8Ýßjd™ÇåEªP]Ž[áeúE´¨t­…­Æ9wcÒ|ñ™×J%{?tj'öõð¢Ðlñ }¢¿X£Á@s Qäsø­f¿Ëâtb˜Ê›¾ àÔ”r*ârÄ©0‹ÒÈ,*ÌHL¶˜õ:ÐS;ÊRMøì>U¢T#¼jÐòÁn XT9*šî¡Œp¦‹øºHÑ’Ñâ²øµd´Geåñ8q·Åêíñž„^•³h× J“nŒ:Äô Åé¨sˆv¦¨ n`È"‹΋À阎@h ¯ÅçG¹‘Ñ(iT“Ã@í ´hÊ_hFwaBýÒÎ'ZŸÊÅŒš£"8èöKè:w@õèå A)É‹ÐL+£‰Ö*1ô¹åá“@U¡7#TÕ1† Ç“@ÓµPŽ €ìzH7¦BºìÇ@]!œU.÷e¨s¨÷øšµÒŽÊˆzSXlÀÕ¡Z3ÂNÍP_§… èÅ Ü"6|N=,àRa£.ćwÓÐ èÖí d„|<› Q¨•1¼¢:ù§ÂðØ(˜îz‘°Y¼«Ãé4ž:üXö¨3Á$!Žý„GW-ÜÂÜÁ¯ùõðGÐm:Rá„)žº”£qØ¥ÍñŒäª ¹?uX/ù™¡^íU6yvm”£·ÆZÜvaÐó¦*å—ÅᎨÈéò4ÅŽïRpݵù¤<°ð!Z|0JÐU'ÏŠa°ò‰(o3áE»h!.YÑH¬KÈ-syw$íèøÄsAs??Ò2T;\^'þŃ`¢bᔹ4‡AÌÐD´F-§U»ö Üøè;Òž°Ÿ‚HyÜJijBisZm¸B ç‡` c'U†œwiÖ£¥[“&h§ù¥åA¬ ɲóÔÇj$"ñÛÑë)(Ô¦r0Rè7RWsNg•æ•Êbƒ7"È|?Ÿ¼4»žÙ}ũȑ¨*¯ QçmŸ=#šÌ«úChd…Ïçñi!ÑÛcÄ@Ì‚Šš'qÖZt“¯¶ 뇟ť¤v³Ðæ©ZB‹Ã.1Ðà±ã•OP›xT ís¹À€’ò9u¦ 2Ó¤¾@ͫ𤧟d£Z ;ÜÅûc& rƒ*,*îÀR§Ä¢D’ŸT™?Eþ ¤®,K”Ñd$eã-þƺb5v¤ßÌ-â¤^.ZbßÈwpƒ³ÅäNŽP`©›ÎOÎ =tˆžh5Ì+svèc"é )suq4ÈX,ãg“ÅI $4椵ð´¬A´5‚› E…à áaßÉŠzŽú8Æ©¢±4+D¢îÄÙiyUv‰º”x=ÿ©¢1;‚Dó6qz'!²4;$² «æASEŸ'Bõé!™‰nxd àsXƒ°\›‰M~oÜ¥Â*Ѧqp…÷UGEà—49kÕ:sñj]ÄS¾ðnkÊó\mì tîÁÀ‹.Õ–´vòµ­ Vú¥Å¬ˆ%ŒŒ,æxi½$Ó!’Ááðë"^ÛšÞHŸ¼Lã'ê|WÖ8Áèå#s‡: l A¯×ã h烶=h¬",bâé¹\K†ˆ7¦¹`&ÈN-ú;´ó@Ûº^…¤R%àÿB%a@¼ýè”ÀÊ °‹zY m#ZfA¨šŒ2‹?(ãŸ>pQÖ‹]Úy m':z© ²ÁÌì&zùtõ€W÷‹©3@ÛBžºa)ùµgÑR. ʉÎòà07(QóRCTaQSD¢Üc †„E*UãŠ,ôÂÉO½ÆÛ1¹¬Ìå·_ZCo‡S.K¡Ùñ 5 PÓb†(Ö8Úc‹Ùç¨oøÞÖÒ ¼Î Ÿ`m®Vìs&8E:•’™m!¢¤ï§[åÍsƒ‰Wl!KÔ| —0»¬ž™-ÓZeoXº­imÕ¬ƒ $ÛTv• tSDÈ>Ÿ‚_8æöe¥¨½%ñž£± ïxÖYœ~q¨º ÅŸ„Ý_œb³¸Ý ªò’äJ©lÙ»HZ²œ'¥r1xOÒRqŽ”Êôµ¶8"§Ž:´q<*o’zõnOÄ¿êà_·GÑ uIó%£Crˆ°+j <ò äsE0S’’•ã¯ÒÛ:ýL§kFG®Oöã•–0O’r=bŸà6~î¤Ç”íÒ±«J;ŒMvPTÜ*«N‹-ºJTw5·†~2|HŒßg¹9Wk‰ÆˆÓ9á­JÄ-៪Ñ(ÞÓôF¦P1™Ÿ” Ý$û¹ÒàÚÕm·­+gA´gihÑl[Ø`¨† ¢¼Ã‰~Ù,€WBX›CiÿÇÞ·À¹QU«À òýÿß­Ý…î&óLRj¿.mVZZv ¥v×e6™ÝM›Í¤“¤ÝeYQAÞ¨€€ ‹þEå%áøV¤ÈãSDPä¡€úsï¼3I&3Iv-™tsïܹ¯ó¸çž{î951MÊììÓ0OkÕ<¦ÀênSLCÙIW»l\+k2´¢h…ÅæU‘´]¶¢Åœ9Ô“NC¢€V‚F&Cm«K°÷µë( ð2 yÏÙæèÝ+ï+57‚ŽBŠ­¨›ɦ»öœy\m@ïDÛ ¶N¨9j×]°iÀBrF]·É-Ä`Ü-6–Q+“GØòBq¬ÁS &-•˜1* lÁB9Ú±4YVÅ]s¤ªLhJ%£°Ó¶”UǪR\$Òg`}Áùx`zxò©².'æ”|ðŒ!õ([–áÙ„I9z:Õ([°*[ü#PêÀ³Ç&æ\õ•5o,bÓÔêâ"`Bô[ƒã,À•¼¸“T$-@"(Ø<¨ÊCÕ1eúš¨ª§C¡ê˜ÒTSvTeËQÕv²ýfEVbe[VŠÔgÙ´ùÓÂ]Ï·¡0Ù¬ÆB;Œ*!¶ÍºÐÓâ'=9šé¬CÒÀÛ.‘º #‘E‡'Š 6”0¤Ë<=WȤ*Ãä•Tf4“¢·ÔÆ­ ¯ž*ÝÌr5?…Hˆ%3xC<'gÍC!ªg:€d’‰ Øÿ¨Û”tgø-‹>iC²% éæÔúvž´ýqnõŠ0€NýXŸ Žõ¨2ÑMß(vÛ2œPµdhj°UÖpšpøÕ¤B]Ä‘ôAž¦«;'œDBnÌ%RábáH…ØZèO*ËÈijTCH„TÕ$!uWµv¦dâañ9SÕä“~æiøY­q1ß´æ4„ÞÙHÍ v²ÃsqýЊ-¦D΃s»4ç UºOãg‹®G’õXqšßZ»š·K)6b—RÜv)1Ï]Ê›|“2ð¨·ö]‰ž…«~7 Uq5»Sì¨y\]ò¦ßQ£Y{ dFšµ1V=YÁX³;cå<‘õÍŽ«Ϥ²E4„Gü$ñ6œuä‡Ä]¬£!øKíöëÆâæ#¥è”±fad`„³Û`4BëÈÔ‘XzÅr­£çÛPH8Эã€]ëXñædPÝ#Çú×=윛½ÊºGÒ°¾)pš=ËNÍžz% ¸0àÖ/TÒDÖ,šBš£‰ô¸jì“^êÒGr\ÝúÈšnªè#ç"ùÜ8õŽÞÚɪ¥B6ÖN–Ý_¯ÿú:¥$9Uô£¢œ5Í&_¯fs'%Z„“`·ÊZ†ë¶ñLjœÑMÓ a2%à´šsX ÖR‘zWÌä”mn5)^c©OWZ¥n·¾”ÔÞvƒÆ 8)¶›(ºÓ4 %×[¶ÉfLÉ)šl;|Q˜jĆ‚á ¼êm[b@•3Ã_S[´áÄø fz8VŸñóu*Ÿ¯ð=¾ñ¼ä3Û>ów¦ÇÿAŒÍvü3þk;þGKüÙ9¡ ÿV<.øssþbþ­x\ðçgþ’À‹¬$ÄÚü¿…Oü- 좇‡³ê‘Ò‚G€ªÿ)Æ \ÜŒÿ$°Æ9¾ÿ©CaQööPNYݼ‹ EQbgza;Q!T5ì2BAa|O_ë•.«Ñ(‰ …;!ÜË8wæÝÙØ-˶{ÿrN×AEÌ6MÎÃ\,®z]„l=/éÛD|‡vWô©ÁÔ¸¬ƒY<ëfk]+Ùâ!.ÆÆlåÈ}Ù¼¦’`hð3)è^ÆÈu3œûq5*3¹Èd0æQ6‹º&èïh)»ˆ’Ìú¾uǬ9aÓsÜf}OÏqë6IlãTx‹1aˆ®#¶Éš&çh`ŒÕ+û—å{Žê[Õ·nêázûÖ·r`€é]ÓÏô0k{ú×õ-?aUO?³ö„þµkVv3¤ÏGðþšÑyYS˜lðC1•r¨Ë“™£V0…âTÖ|ÕÍ ²»c¨øìÈfó2¶hm° µKæ” ¤Q Eë#:BE›(tëW-ôÑñUƒi9ïÐ/ tCU0€ ‡$ç6P·¾›Y!oͤ™žÂxV™*ì´Lòaº3#Ý)U?ÆöÈGì(åŠZ)ƒ`6@G¶–UX0J,ƒŽ8ªô|•Îö²Ü²Ç%ÿ sfÿoËÿ­xœðgå¹)Ö†+ý‹sþlþ-y\ð—æ üÙ6ü[ñ¸øÿÈlßc)üŶþ·%Oü­½o&‡‚¾ªM ãñõpb<  °†þOàc¼¥ÿ“O bíøï-y*èÿÊa_Yh–5¼vWÓÖÀ1·"Ð*A«vë=Z¯¢$V…ªTÌ/q_-“öhFɦ™q ÛÞÅD9UUÉÒgÔÑU”kZÌ׃]¤€¿ºz±U+£%ªªuk¦À:E-­•[—¢Î2 ÑÕñqqžy%]—ü¨ëˆJƒ¡0®n+èÖ<Ä*†Ig4@ùìCÐÅLsW4´4Ï‘q±ÑtºÖ¸`úkÎád9Å|SmVÁÒ‡jtЦ~ xyâ5+¢dYËÿq=÷G¬¡ûMëi¸ÿâ7 gk«¥Ûji_jéÙ¡þ­—üŸšíýŸ©ÿãÚû¿V<.ýO|®ÀŸmÿ%‹þÓsþRÛþ«%‹þsþlþ-y\ðOÎø·í¿[ò¸ø¿2Wà/µáß’ÇÿÑÙ†?/Ä üãíó¿–/eMý¢;Q´bWG6ŽYÚÞ¼¬¡Ú˜ÐVgÔñ²ë˜aølþ Ðþü&`š¿pÀ+”f o›ËÏ}…‘˪Çþ,¯ì¸ÒNî1¯Þ™ð˜ú?°R\î ØÕÁkbl”³êªsz Jü*Äüø ¬ÏYo±ÁFN‹3\p@2ñ¿¡=näœ`à<⳯Ž)€oú Ô“Ý`ך\v*Èø ¬OòT«9f4+5rñƒ=W˜Á÷Õ3APŸ½‚ Óã/¤°mzR*^µ**†?G4-SÕ Cnfþ \(ίg¶3Ó½ {UV5’Yо«N?kÆ´1Ñí5˜¼JÜ Õ˜Òz)* “žƒ3æcY^Ð9(R‡Mxî>…Þ23E&SÈ-,2r½*MYÇßú‘?)Ùà)cArÖí¶¼Èš9?¤?±nÃúe¢CΈ›5¹ÕRCefšId¿z¦>Z¡ Ñëƒ.á4¬?A˜6„ ²Ü.ÑtS  ²+q¤¶²×ÜPÞçðP)µ#*g—Ì:cL H„´rÐÀr/¦»CãbÎ’S‹hÒ¢nU´mZ¦XTj1`‡;¹z&dVÃÀxçìèò‰!ìZÉEÄåQC¢©T`ð}9e²è*áh Šøæ.Þ>ãìÕé10š3{‚Ît«Ï^c 6o@¢}@ƒ]GMéÂi‹f´Ø¼J:3¨±k ™w±oûˆ¼é²1ƒ¢Ö—±ƒ¬{YŽÄ ˆƒ·ûL?k“IÖ¹­ö%5Xõ§Ž¸êr©™v/‡µ<­z00/‡«åZåªJŸC€t b,›6~YnW=Þ¢­2ç«F­ ð»êVI/¶xaH s;=õ#; •}Ÿz°ý&x< íµ”ÝîÔ""º2„Eú  I †µÎF¥„.Û¤'‘¡2¦å~ˆ=VÃFRÇQS}6*ÀT9•x”i µ`ÍÍ¥c-o刾)Ç.W´)¨uT!0grê)…¸TvRª]ºÑDå¬>D oŠr«aš£Ô G$hcÕ=",]åFÏÛôÁþHD A$~0šB)•²-e¯4ñÆ Ëu¤·%,â¨X¢¡a«¸‹ŒcËSiÇcÁŸìa¬/q답š³K ™¡¾4 ¡5ìN¯Aiª–3uq}+zf{ݨǼnz€]Ý2º“´(ÀÊk,ÎCþì†k#9îHo)úã&xFßW‹U=è•Z!AÒ}m¢Cc4ÔP%+a‹YµF<¬zЯA؇‡?nI¤<ÏÂLŸåеåõûÃᦈ5iÂûo. C„ªžþ5Z¶Qõ;­å¢-VK¹’Žf Æ tQ.¥–p„z+y~…à?õRÝÑJQ§ã—#@¹û]C©É¨µBuLSã”Æ¾ìƒ›JG1.ù ò‰ -iœÛÌT9¸ ¹£¯ÈãLg‹[dÞ‡ðßJ›y¦. PË([1~Lx˜z(X€fè8MÛ"¬Ëê ¡²ÚhZÕU 晬C«€ó³ C¤g]>¬ï¼^^aœþã‰<žÇëÌÁ3Ûâ"u}ÕPþâÙD#• UÌ!Ð. n‚¶E@j!áI’e{p¯ZPµ/ô€vAЬB8ÇzÑl@)"ᓘsÄ ÁD¥²7 E½ÒF"ˆiIQË‚Æ3£¼5ÈR@9¶ØÄ"|ü6}¼ 0¥TMï„}fôpjAÙgQ+ç™RÃYgxeò•Ç»F#tÓ䫚òUHáFò'Ü4/´a£væÆ‚† m¢ÒhVãø™;)›¯¿\M{uÕè䯼Îv¼¿Yxœ÷?¥¹ÿ¯}ÿ»% þs'þ_ÛÿoKüg=þÇ’øoR¼ÿ¡%Oü«¯âM¸ÿãEQ°ùÆøo¬Û÷ÿ[ñøõÿ\5œ§,WÍtM<«áÚ#&œ·<éí ÚXË:G [Ö'©ÿFÞ|:N«r&Øgµ Ëð5X;€5¡z»èÑ‘.´ðŽOPgÓ ú]›õn'!ö£â¶£â[GÅ.ùo6ã?·ã¿ÍÂã‚ÿœ‰ÿ׎ÿÕšÇ nîÄÿkûÿkÉã¢ÿ¹ÿ¯ ÿ–<.øÏømÿï-y\üÖãÿµã?´öqÁ6ãý¯ÈŠíø¿-|Êào©‚ ³8<˜ )ãCt ¾€ø=ƒWÀ–Á³9…7‚ÊÉÀú‘SŠXlj£Ö‰ÿfréQ5W$ jÇIÙeQFñi¨›x2ÑÞ¾LNàGÌÌ4“Wóäÿ&3ªd ŠùÍ *šålÖÌ0Y››‹Φ?©’¦S%}>Œï29»™!£ë2J¡«_êalc³½ë+ÊèÜûåQj6]åU…oQ²[¡¦äÊoºÖŒd3[JJ•žm;_Wªd¹ZÒð2J…üŠï=›¶¿¬PA*«ÈZQ%kÓ 3’¡ ‰Ë]¿BÏ{ãF íPÉ9ÞÖÌ)° Å"Ñ”ªjé._ר<‘ÉN1ø‘^À?r)[¬QŠÔDPµ¼N‹L!%gŠÑØÍh_nëfõÊÕØî­º:LÊQÌCäge2…È¿•qD_ÀW¤ ùÊ9ô|¦µªÙLhcã šH`lE£˜¡IÆÕÊD)K¨°â§j±H?e½>•<2+U•Ém&2%>ÏÑN!/Ç y1À.4u³R–;®nc¦‘Îíùö:GÁ¦ÌÉ’c\G«ú…€iGf)ç™­¡ìU–‹a Ôœœ-8ó㪺Yw᥉ÿ®Èa‰æÔ´BOã»ñÂMÙëUÒc5˼®U(§æõ"[„ÿí=¾šQ“™ž·€É0›’*DæEé¶E7Ù{ Ä€|CM!hžþ9ËŒ§ç±tÞ¼yå@· '…L NfBÆ£bªc°£“„—†aÕ©­šìX¤çoråvÒØ¬IxÛ-2×e2#MCL*ÅqDæY”jtkÆ€fZ“·1À‡Çr€Ä*rGty~Lšo‹ª±dÐ˰‘¨þw‡0Çó`–)*ÊéM fÂì‘w¶ÙÄW¶$-oe3IócÆÏ#ÕPÐWp¬ é1Æhæü’y™7ÏÎ"ÆçdÍ)œ1ÐDÌk™ 2Ád ¤GàþSúßÉB慙¡"¨¶Yøi6Éä§àti’¼‰Ñ‘Y”ªÇ…RYµ  ;Á©d³™|AÆ78QmÊ>qÚ¤=åxe3!ÜMp£)À_ÊX"ó&™)¦¨É¹îû#ó Rh…r]‚¶,ü’ ¬¥‹£gGsiJdd‚ÉO;š™ÈGèYyJÑñ”-‘yaÖI–ÎH ³„fbL“†µÀ…¨—Å/ð‹]‹ á/ØŒv'à?šì ÉžH˜‰¡ˆ­ †1ŽÞ˜‚™AR´cÓÑ y’þ4æ$ú’æÌŠÌsÖe`™Bi„1[œPÓ¸gŒÌ“³ªœ&¨lãrÈž,Fj°¹¸6þé~eg›Îwx©9}LVÿPÈ$ R &½``ßÄT)ŸwŒ²²ê6G–Y¡ñ*[tdÒ*Æ ‡i5iÒ¢Y6fˆ>°ù7šÒwýºP4€Ûúl½$ƒ#FXü9‘)¢­ü¶û3Mݦ›¥­¹”Áˆ‡œa.”4…ɧGQ8CÃþ'²Šn°´v ‹ìùó¹TĨÅqt¼4òÔŠL¡ˆ‹®‰_oƒ— Yµf˜iT%Ü|µ‰ ÅRÑ”øõî,\²d!1gY¸téB¦ *è aí³JÙ œ…¾oͤPLÊʹ±_–¼°Úf/f¦Y³  ¦o_ÌÞu,YÒ +RŽéØHÿs[º´B1e @ 2ªZ ]eõßN„ÿY: ,°hýFÔbf­ªãXÒC×qòqÆ`é)`¡†¡UZÜŽò7SH ió-rhµHŠuÇbðÊö¯Egsû–Å@¹È‚ydz´Ŭ½•ÃU³ä_“ð=šµÞé#Âþ' É‚e%Lé« ¦x3³ý¶VìDÕ.4¦*äzNC‚á$£âü—¨š©¦¹{¼3²Qì9†üïÖˆÝ1X‡»¡ñ°|’ÅuKø‹K/ Æú’üÃw³f9ã ³ÜPd’ˆ¸6%GB(ÙÈDû1lÑF@Mžáa€yb‚ZˆòÐþF†,Q4¯‡^Y\²„‰”FŠè !zBý§c~ZЦc¬MÙìm81Þ=^œÈv2K—bæw«2¹Í‘hÏqÇÌ((~ÀÕÇ CC"I@Ä”h¦°¤•ª‚G•Ð5|SUp‰)E˰ æ².,‚”U´~ì`™®¥ E¯N’=+Ì•$Åa–âq þ€hÌEÝš+¤¬¸IuœˆsÅò’+ðŒÀâêM^V™ÚëØ'úk›ÌægGàm€+ÃæT®²&$¿ô]’ømEZ‘ÖVŽãÀ ô…g¦°œ•ªJ)ÎN4ª¡*(QPYš‰sò1ù !©;î&B)!èÃNõÑÇš8Ä“5Š«? ¬ƒ›KØ„ÉÊ ‚šÌ+çb!è#@å~郷-_\œg <0—¤|ùaùâ¢Åqt=ÒºuKï¼>I<Ò§SI3…%­T€u+|SUPKĘoFBu– Ãwó’[š ¹´Ç‡¤=}­6Øp0‰g8Q`$ IªâÍ]›8h-n.:p @¤0kSÊýÒžÐ̵‰‹K6áŠç8Û2Š)KœÂ’>å8ïÕ)|S×'.!Øe<ý†‘î2¿%Æ… ohÕG%‚JH M ðDþ4—J` 8 ‘Iƒ6D†y C%õWî—JÄæR o VÈ»cvFn‰RX.”¶¡À³Ipr¡ hEûþ'&ÿeEáBP‰7´ê£Þ±–ðYK¸$YK8¡ÉT"¨ììÞ‰C3 •Ô_¹_*‰7“JЮ#iòYXzÒ$hL±¬™Ä¢¶dJiDc©­KؘÉÇ:ò6é˹|4Hã ²ñŸ²!b§Ùq´ƒJòÄX))ƒ¡d¼©dƒM°1‹¿!MÕÚ%…t¨v¿„“h.á’˜/À&R.C*·PY²¥‘Mئ ú¦„ÜQÊe@séØtÌ%”¦o˜ÕG- Ÿ€’ãIbŇ‚,Hdñæ.2hq[è r:K¸_ C,õW^“Vô#݈qv1ßГ˜u^ê×ô9zŽƒ¾f¶nàËbMëÛ•kzÛÜæìS·ýÿDºîkÕíÿálþŸDíÿ%.Ö¶ÿoÅçGù¤,Ä%‘K'Òr*‘dGFÙQ%Á%ÄQ9&ÍvÿÚOsŸºé?Ÿ­·ô/Ĥ¸óþÇÆÛôßšgÁÚ½]l7Ypïsç\™£ŽlŠ,Y]EídP‹ÑíÍdÑê=Ú‹¸²BA÷µK—¢L¡È‘É/ÞpÂjõáØÛo{}ýÓãï=שׂ–nßå̽vÙ:~>dN½r¿æ=;~píkûlÿ3»]òÍüq?åß¿þ”ÓÞØGûÅé{çCïÞ¾ùO¾þޝøõ}»=và}õãÓó>pɼóÅëŽß4²ï²ïÄÄ›ºn{ãÚ-W?ú‹òWž³ñ±ï>ýã_<ñöw?}dzÁªÎóžŒ=ùÛcÿ¶oçéu§íuÞ¼/ÅÈnø¬V¸èª§.øgi¿ÍW&^×öK=¾Ç97üèÅ+7žøƒKîùö÷1O¼í 7¿~KôêcïùËWöÙë'OMÞÝWžýÓ—ÿû«çå¿ù‹=‡¯xÇß¼àÈ®Sô¶Gó±]žÜýŽ×–­øèþþŠŸ]è^xá#3=ßúÑÈž¯]rÿ?›˜ÏzÆv`é·ÞØû¦‡w=<ÙóÊ3â'×¹gúï7o»ìåÍßÞÑ¥=±[ä[vßIk&w}ê°sß±ðS¾øë“.x¤ç›×lxÏQG¼rüÅ»è“_Êl>ýÚ…/Þ¥­ºìÏ]{ìèxÿš¿°eê»k žd®9òsç^ùþÂws×ï:îùÅOüAØ~߯¾´`“v|ôÐk.øûíOl¾à¯Ëo?¦ðùÞÕ[þ×.O~umöîüaï¼ì¶sù»žùètý¥kÏ>eü§KNùÞUïÚóÈŸ¾÷W7ïrÙæ¿qÛùçÏ?`Ë“ó»|>uÍÂÂÿ9û÷ïvà™—ì:ñØ'Þ¶õ‚‡9àÀ-òÒã®»ã­ýë>"«ŽÌð @Ò !‹Y‚Eð"Šòntµ’ÎÈG©“ ±OÔm‘†"Ñ~bHÄÄ 1žEÍ`?dëfm¨d­¦¦”âÆ( ]ܾ[9YxžƒÖlÜ6³ýq2oý¶içlo‘„ómÂzy”\P9,K4:̳ZÆ,ÖúÞV9à_º”R´Ž•k™£ÇÕB‘zkcݬƒ 7A3j‚u¬XŒ^ÁbÞÖå¼ïW«éJ¯ôK¤î;¤ƒU/‘v§ÔuZÇ ½H:Ho’vâ¢bVé8ºÓœÅIMÄ–X×ÈIy‘eô<6&Â\“793ODÛ g^,™äÊòlÙ·øuY^¼ü[*,Ë`gîÎc…²¾ ó‹²<>Yþ­ÀÙòŠú6œœØ£ñ:^ÙìWaþ Á;7£*C¹H´o³±ãÐKÿÆÝ_Yý¡‡ŽXpïÛ—|ö¬Îòœ¡Yäe­H&¤2®½¡ß¹—ÿ—ølûÿà9¶íÿ­…OüË|b¢h¡©Ù5ÊD çÏo©µÿƒ_d­ýŸHü?°œÐÞÿµâ©ZÇ‚½Ýù³Û+ª^j° Ê1ˉK× nŸ«¢×ŒGÐëí² ùÄÅórÓl–ÀklØ›-WèÆ+ÝnŠîvõÒøSt'î‹Ñ_︢eŠ2ÞNÂ’èI›ª6 ñÑ›‰‹Þ˜8¹ÚÄ¡f†tqx˜ÔPÍSïr5 ðP5cf6†bû([}8)褱Ø|>½¶4‚ËW+# ª÷ê1ƒ ¦›Ûªqjãÿ°LBñUñì*[m:gªGr56‰å•˜oôØ­šR°©ìO“PZZ³e./jÐ(Ù‡‘¶±DSeeVcL"x‹0쬃nq¸×4¯ÊŠ3ƒ… 9›%Q•–ctf­„—§»=׊öC¿¨(,Eê\Õ±³ë›ùƒ@ñók€¨¾9`}ÍÁ Åçƒ"ÑêüŽŒ›™&;/…àÂŒ-¾W¾hF;Åø¥šŽHåØïÒZ§¡ô ¢1t8xQÎ’ŽóBåþÆéˆaæw¼üÌ4‰fF°†KâWBëÁ÷!b/b< éô¥qø™ïg&éñÍš7zafúhûèkŒ»ù#>ºŽ“Øð~G*ÎÐ8öÁÃÄc,u=><ã‡LïºDàŒì^a€^¡ËœK”¦á7PHOQ÷ Þ¸õ)ë“ ÆýJÊäù>ç«!²¦¤fêa€y‹ò {tË."¦éa$³(äÙò™p®~ç‚Õç‚H}³áo9 q \«½üÄ]ð!G\¹„(f…=0a­pœ®É+§Kª¯¼B—3Xš–M›?­0œžo ÔRYN³ÂQe"ôbÛÒ\ee¦Á7õyÆkÖ‹ÀX;Ç €Êt¬›‡Ný 381¢NNoœÑY-MÍÌÔ…À2‰Kë{Ð(Jq\%¡‰S2)62eäUxÓP‚‡¼›Ö/^«æ1­€@>´§9±C=z4p >#Ó6Rû'0ÑŽÒö)iTˆÛH¤_Áè Ò™àÓŸ"BP¼›éöO©bXJÅ%s]¦Mú´å5ˆ*±.IŒêIVùÀ"¥B,ftÉ¢yÄ("‚TJBS‰ϱ©¬:VÃ#‘>i þÐ5Þt¢+ȪD&X6mü²ÐÖã]ƒÐר¯q¨lmªì(Æân`¦Úv€£2O¡r˜h÷Ž¢ 1¢ÍØ>$ì+xzGf”‘<ÓÅ¥LÆËJº3üâC¦~HÖI¬¨b”$}=µ•¢3ïY¬)¡§ë¥`±!̇¥à“JÊ(Øã]ƒ(x Y<`£àz ×Rg´ˆšyÔܼˆïs†šÑCg-R†2s‚Ž=äm“Žg5 ½.ß «€YåÑèݧ4UCÑ;ëòˆCïªíÍ„Þeÿ›žíó3þG;þ{K×ùb®ÀŸmÿ%‹þ•¹Ilÿ‹þ“³ÿ'¦Ûµáß’§ þ–èdhECÅþÁ§ºý—È lÜ Ž lÛþ«ÏÜŠÿñ Ïñíø?íø?íø?íø?íø?íø?íø?íø?íø?íø?íø?íø?íø?íø?íø?íø?íø?;qüKä/þ„ñ‰7Kü˜;ÖŠ£M°¶@˜ä­¤= Pø¦ªÆb­XfèCç\Gü»—VÃ˱ýELìÜö'Æp:ó†¿BˆÀ?ñh:)EË Zü‡ŽÄpQ¬' ÅúøÌÐŽd @h®Z ‘Fcr£’>±u`’ ÂXØ6úIøè@”â z8ãaè36);\“=g£·Î ßE Å›¾F1 ÊyvÀúý»¶Ñ³'ìŒC¿Ã0«a"¡ÄGlô<® Ûä| éY‰I`‚O“¤Oca_‹BEznHsUéYð\ô‰­‹ž]^»¡„ÔlP´¯°Š =s¶õ5I’,— ù8ùÛTz&mXQ‡Ú¤<ò6=«ß/=³¢ Ña¬*.M§¥(9l! Ó¾›±¿{ΌɶÄdXb"I@$&“d Må÷±iËàLjE1sëCz I6`ýs"йk­m;,‰¢]±G’–&ö©G¬ §5¤¹ r°»Žq,›±G$‚Yðx²|£"ž{r?äzTON¹Ÿ¥ˆ@nÇ&;bEI +ä™ï“ ¢õ% þò Š\,ÛÜ­iÚjIÎ&IUCI6­~ÿ17m"L)Q‰P)HºE¬‘hz$m±”\1Sl¨¾1„p¥Òv@ÂǤÁÂ0i›#…ã•%dÂUCš *\Á–†“eÂ…Gð“kgPÉÙ¸˜¡„HN"R‚b”[|Ò… !°ûÈ@`ÂÍ÷xZFöx(‡lºÉ¡ß‚æBAp@’,y“aÖì€õûÞ£5J¼"ò“!•ˆO$âþMÒ¿ÍmÃ%ÞÄìâ nU‚ƒ"`ý¾yyÃ@(#%­!°‘8.«”ÈÑF5b©Ïà³K¤D¤®æ‚ w©¬}*Q20—Eèq"̲°þºAV‚¢ Šè403*Ñ*Q?úIkTR¡ài)©hšHæ_¾Éˆ§²°MÂìÉ@T ú}[]4N_)YÎP‚s€rÐ9˜uR¤´Éºb2F…µ„Dø9G‚u¨Y LT± ž¨ñü²¹Ä¶âvu ]7Ͳ¤Ga ¨~¿L65Œ6nÉ,-Ÿàí}ǤMé…Ã4¦¹ á´yÖ¡ÔSóJn\?(pÉ“eâe 3“½AX' ZFh\DÃÆMÂ}ø¦ª %.aDOg•Nj]§ÝÙ{Z­gßö DÁíÂ-îÞžÍÉ (êŤ$“I·¬Í5Šá"#YfA(rÐ)Ì5Hå¾ ÜûŠMÃìØâK’ñ%Çú†%}ÒX%¶°M¶_ãìôW˜*D‘ötš#·£Œtâ*£°Ý–IwØ;R(u–DS)1Á’?Iò®¹JW±v;Ë4—4NãZåþ—ƆÉ6¸X ¸$¦ð`Z ÒI“A@„Î.@X³Dš'Ô_¹o8ŒùH "¬K\8K¾òàô³{¸LÆe'ómb0$¬c{,Ç…²Ù ÙPÐå$ËXj=›ÀÒhiÃF°a-ìtδڂ¥íçõ$²×°Û—ÀFê$<þbp‡Ödû\!ŽJz³o Ô‡˜ ÃæÃˆ"A*÷MÍM5Õâ¹8cS]Ç›â:fÃg,WƒŒjéïÂ5Xs'ØÈH.­h—û-A„”dFê£"Ѥ¢°çŒxwÎ’œ8ZmÂÿhQA5#vCzž'j<Žjñ8»ÆH,Îðx%G™M¶^%MÄ-[ÜFä]ÓÕ •×$1Ý÷PÄp21ßP—!ë4Œ‚¨éžc¨ÃtEkfëžhY¬)b}»rMïÎå¡òS—ÿç‰t —Ü@ÜUü?Ã#èþß%!&JÏÅâ|ÛÿsKI`e6ž–Y‰±r">:Âsì舘IÈ©QY™íþµŸæ>uÑ?ì‚´QþÙìËü¿³|›þ[ñ,X»¢·‹íæ# î}""HxêȦȒ%ÑUÔO,îL´7“E¯ÇÑ^Ä• Æž‚}$,ÕŠ<™üâ îËß÷¶W׿´å5æÒ×µ½ö¿Ç¹§O<ú±;oTîã¾ôÙßw}ö_K_¾îS·³×šÍïÛwþ…ÿsè'®_ê™”Ú=¡þùš;¶ßûüCg?rÇëüeü_Ï ½þêeüm7}î×l:elük¿û§ëŸ¹ãç/½ðÒg¶ïGöÙÛ~•ùͳ‡]ôÛc?2tÎ?Ö¬é´ÝvYÿ­+W½rÓÍ?yy}êÕ{·ýƒsO¿þðo÷Þþô«øÝ¡?¶Ï3±½÷¿ôè¥{íù “Ïî2oøá§ÅÞX)9xRá–ƒ¾Åú;Jÿw¸ôÓ#zæ°Ë¾–8{Ã#}{÷®èÄÉäÃÊ JöúÛþšy¡ôõ—ß}ñ=;μëâß]õ¡_>uÞæÿ׫˿|Ö~ûÇ/¸ô™ËŸúů6]vÍ/Ï]wjç¥_þí±«?·=óÌ·~ýÎÑÔØé “òï~íøÓÒ{Ävé{ð–7ÎÙzúö]¥>õèŽ^>øøå÷¼óž ·?zMéæ—:è‡Oœ4õÎëWŸqþŸZó—Ûî{lÏU·Çö»þØ=w»âî?f^{¡oñ>ÜÂswÝ¢[O¸èÔã3û§¯úÁ[óÃץǘ‡¯¼éÌE¿üøÂܸ׎{^êÌ_¸c÷½nx°ëÙ¿ßûÇ».¼ûÕC.äœýÁ._ò_/žÐ¹‚»w·÷.9qÇŽÞ÷œ}üò…ÚÛ?wøÁÓû¿åúƒÿ–:ùÂñ7pÆ•½vﺯ}Uêð­÷¿ò…¿.<àÿùÝdŸýuüü—˜Ü¯Ûôó«?¸ëÅwú¬OÜüvùºKÎZ¸Ëæ_sãöÅ;>©¬ÿæÛõÂWî<ì7ÿóé«?¸÷/”þð[?þÊø Ë]ßsæwß²à˜‹/Ýw¯Ä÷—Ÿ–ûöwž~òÓÏȪ‹z7½cá½÷ï:þï›ö¹cï½ÏÜþŽÎ³ùØï¿uŸÈß:zî;ó¹CÚóKLö¤[Ÿ¼gɇܙŽl+}ãä¥7nà/M|r¿>5ï »žþ÷Ž·œß¿è€Ò·?0;2õ¯ôÚ¡Eç<¾¯´üc×®~}ðCûsî°û¾÷‰Ýn¼õŠý×ï¸ú&íŒ;;¯Ö¾Ýwì)œü艉Ý_=÷¹O÷¢äÿxx×ׯ>/~Îמ¿ø®S"žœ¹íáég7|ýoßsÌG>qëÏ>|دVýëÖÿÏÞµ€IQ\k^ã#ŸARÄEw#»3=ÏÝ5<ö;X²;ÀÝ쬛Þéš™f{¦‡îž}0ß$ň£D>Qш„D¼( QQ¼*\Áë/¼Q‰ø¸ñyQî©î™Ù™šÝ]1m÷öùfúTÕ©SõשªéªSµ~r©}ù|Kiû±QÖÐW}é„7&îúé©“÷µÔ7›Ð³*t°êÁG=¯yzÑûû–ž]í›vÎ gÿ›gT÷úç—nŸyâ%ëBgNÙ×Tƪ/O›yú)]¯ÿmû{7ûº<¾|wÉ'»öÿnsåԋpÅ̲MïÝzÑ– E÷ܾ޶qÛáUÜý›ßÙȽõØÓ{_]µã¯§,_¼úñ _÷ö-.zŸùí­>ˆ•†¦m>ýá·¶íy#:þÆÖ}n±Ͼÿ»%Ã~øÀcûÚÏ{y]Ó^~†?øÔ9G—¾¶hSüòG½kî8pècƒ_mrùüKÿÏ4æI´|I‘o¢Øüø˜è®êçwOYr¯ôæ•OÇ ‘ýí·]7Ó7lÌ#ß{³vø›“·L¨]wSýëÏ5<{á-ßóý3}/¬ÙqèXy÷£O\tðÃ÷›ÿ´í½ÅxNÓéТ;Ÿ´žV¹ø±¡ú÷‘wŸ_›wðiîªí—üà‚µü¸gÕM8§Øê÷üòZîó»fXüjuàûöŒtû&Œ\´òÄ)?—&Œ»ò¤›*F.DîE75µÎß°ïª9o,ùÏëßþûwüÓ©kÝ—ÝóqUϪŽ-õ×9*ºç­õ#.xýÓý—\왣OªŽv‹ã·§œû³á×>³ãذ—ýðKøé™=áqÝ©‘—)w:ÓÜ­@ººne¦vï(S®%™Af*Ôå­UѨ¨È-ƒ±iŒöa×>´Ì§öáÒ>ÜÚy…ÔØj%wKª—SºÒ‚S¥tdJ‰Ôb"µœ2²þ”çdÔbÑ„¶"rœ>Q,+)“[A…UXA ¥E8¨¬öÉ„Å/cõž±DÀ_ªùKI ¿´± Õ¨±„£œ´ø¶ ‰~SÒÏG9ÜÈaNÏ}L&-IË<™†a"6Ê¡.‰W0 \.CÈb±$üŠ‚üç‘{ âFE?)J_·U4µ(iµãí)Íœ˜oøš#íXB3âQ•/ƒºêí9‰1cŠWÁ~1)dA–•ÓÆ2P?¼¤ÄYi‘>ÚÑ_Ô"¿ÌGŠú¨Æ$*.)\uD†…Òx/+I¿aAÕÙj×bY‘âE”ÊPŠår ²xö¬âuЍB5aÙ¤o±C,–#]¬yQas ª`ó¢òà‹–Öº] 68g2á“z yå 2¼²fvDe™oðñÖ¹kˆuñ“Z[r º-e ?Þ¢¹‡X4w¦hCkOî!´§Áo(MÊ“jR2ƒÐÊ}âƒÙz!^lëŒnåÉDM“þtj©)4¥Ð€æ—Åè$rFITà;æP•¢H|{\ÁÇ=¼ÄlвbÚ°æoó—J]DGòM)P$e¤7IrÍ ’ ¦y…E#³Æj/a혇Rw9ãs¢+äDWŽ ]êÁÀx`¡$P#;ªñŽ*¬&ª  —“‰Nß3“>†ë‰j»!Ó™¯¤’5 }†N„ÜT›Ê«%“¼5á'7û©Wò$ü +rK&l1Å„¸Œ\HRµ“>WVf™émÓÝ””ò $ÓHV©¦ÜÒˆ•¸•+[åx €eYÅ<¡PÕ;‡VõÐ5¦âLOd=ôV¿1¾YŽj8 üaÌ'leH©Ni‘?Ò.v'Z’©ŽY{lM&š“€ÖÏ>0r0eÄH”Pd<üDÙ¿qü?Ìý¿ºP.þnã¼ÿ3ÿëBþÆyÿgþþÓ…(üóþÇœÿëBþ†ùýoÎÿõ! ÿoý÷㰛㿎”‡wµµÉ|¤­- FIÚÚ8^HXÁmåá¯å DÀÿÇáv;2þ?0|›q;ܦÿ”³½o`ì³} &Ù^ qÉG*6ùšŽ_F3x÷ãT°¥Ý„H,)§WüôÁè z‘]odßJù ɈMmw#»ßÒ‘QJ ³QN࣡JŒ•,y­çà®&>›¥-ImJD2þÒL°¿4Á_š‰B¶íQ®Kþ@˜•~áÿQ"ÙÄúKëc|Y¸—•Tµè7EnHœôµÓ¦ŠŸŸÞbñ¦’r8†•h …$6Vëo(¤÷ ùP\ÂÉ–úÖôÎÅŽ*X"M³¸3"r˜ìU³S³àrKÏ)á)Ž wLiMpX=¥pàÖÓÖFd€X²0“yH© î…äåT1ä°Ø%£.È,¬mp„F!ACzȆXhˆé§tª;&IÌo¤dL¹]-gåLÁ’…‹—ãš úèöFÐLânîƒñÁȘ¢¬I"ûLk)«”‡ä™1ïÃõ }læ­Š+aQªlÅJ2Z€•ÅX ŽŽþ°„ƒ‰J+ëRƒ¦«CT™,Æ¥†B„pY+Ú~䂱Ц¡ì]ßùÊ̇dPs•­¶2¦@ÔZ˜PT¶ÚmŒ-+žjp1I„Ö!™¡ŠSŽ2` î3‹1b\¬‚xuñ‚€Ú1}ƒqa2‚˜h×Wß0χªæ4£UUs|ÍAL¨&ÅX“ÃGbb»XIb£ ˜qÍ®k¬©‡øUÕÞY^_3±ì^ßœº¦&4£¡U¡¹U>oͼYUhî¼Æ¹ MueÈ—6tÕ%­<+a$ð`x2ä‡Q‚¶SÝT‹d¥GÈ•¡&ŒUujÄXOzótº¹qªÖjpôªÐïÏõöVIzk6\HÉSn°‘˾ÑñŸšÿçý¯yþ».DÝÿeœ÷¿æû?]ˆÂß8ïÍ÷º…¿aÞÿšïÿô! ã¼ÿ5×u! ÿoýý¯9ÿÓ—(ü3ÿ7ýÿt!êü_ãÌÿÍùŸ.Dáo˜ù¿9ÿÓ‡(ü3ÿ7纅¿qæÿæüO¢ð7ÎüßœÿéBþÆ™ÿ›þÿºåÿa˜ù¿9ÿÓ‡(ü3ÿ7纅¿qæÿæüO¢ð7ÎüßœÿéBþÆ™ÿ›ó?]ˆÂß8ósÿ¿.”‹?k˜û¿\æû]ˆÂß0÷¹Íߺ…¿aîÿr›¿ÿt! ÿoóþ/ÍÿË©ùÿ¹Ìñ_Êßl™ïÉõ4)ñã*9¸ÿ?·Ã“ý^ürÿ—Ãé1ýÿô Iç6•Vqb;.µ—Ù,“&ÕH˜x©T"NTP§æóìevT<¾4ábìÈî¨tÀŸÍóÕ »Íæ*”3HªbµKqYžW\‰fÂ×¹lË[”#ñ«Åx”Ü%R-vW"‡‹üylÈÅ8 °.ÊÕˆrP½l‘ÙNLâ?“¹’(ˆ!‹µVTjù€B2GùÂá %ÍT=R,«Œ•xlñ(bPÂa¥‹µ.I®ó1¹! Ù]n¤6yU¢Bm‹·©A“B6HäB! LK¬€bñÌw‹%W„!.C›Y«ê2O <±¸‚3;p¼ˆG‚îΰÀæx,a™—3L0C©•4Ç 2Í0ÀPxëâAÖšæxA`Ó<Ô¨ËQ°µÖå«Á€¸:Z Ô¨ËQƒ5¼¹ò ØÞ>ä2ÞW¨É÷!”áóäA9ùynÈ H"«d8 q4§!¹A51'O7Èóótƒ*"§Ê+ææ esrð€¢,°r8ÃTñ\ÌA‹x~žP%Nçé2Äsòô@ž=¹ò ‚zÒ Éƒ“Ôk :¤öˆAÄ5– €¥#œ²rèd`üˆb…DK€4ˆLò/ÈG¹ UÔíÒ­»Òº¨tôÈVž‘u†·E1p ?BÉЉ1õ_ñA,È8“&I<ÄXAÈ02]Ý‹©=[ŠqI‚NUÕúaÆG1QÑ’T#Z}|Ë¥"XÊ*[V˜WaÉmŠ}V‹7@P?ië±Ð j€í?¤´¡]àÅñ1úÌ;7¸?!5b\ôûã÷›y:¼Ï¬³û0+)¢:6%Q;¯AbIwXsÔ¬$·r³›ê<ÜÉ/†aÈf±DQâJ |¥A6 =(?U ø JXª$µ©æËÌ´âr$Xk-š¨iõF;›k«65¦Ì¦‰UÛÔ¸`cIãgîÆß‰èDZ¤R#ª©rëBs¬”Aª(ðØFK+²à @YQ­„ÕˆÊ%T+ì7©¨(ZR¦¯¤î>˜ý‰â£Ð‰$¬AâÂJÎ)ˆ±JX5/Ý…$vàÙ™{åq9ž ‰QVsù@X;RNÚXQ=´0“Å9¬}O°°Ü®=eËÅ\¨`µ]Šc©(énþekjUûÕL5Qbì$Ä£…H}’-c­Ú—¬Öf]˜ýÀg?Jæ7ÄʪòRÉRH›R§¥cÇŽíµP[íI Ö‰""t<"y*ö—¨Ç €FDt SÖ‹'§ø )¾¿D Á˜ ò"cÀÿ²wðQT[_y d¥ˆQ2Šy¡ÈîNß¡ó HI4 Mvi¤‘ˆ Ò, RDߣˆRBÑš4IB?Hª”OUÞ=w:)lvvó¾ï÷3?ØÙ;wö–sîùŸvgF'XÌp×hDŠ”Âª¤ÊÃ+sÓ‘lM ŽI@K?•îÀŽ”ìqô%C©MM”U"52rM©¹Œ¨W47B\ŠvÇN"êá: 5¡JS¯WOÈ”Ï[eûàfDˆUÀph äÑJ$+ôÅtññÑ¢‚Iþ9¦¡B±ò2IÌHJŽÇ@3ȈBÖ#BÿL阑û¦“È„OÔƒ¤¹qè«Ò%… )}ÁÓ@ƒ™Ä5Vqfê QªctEÅ%¦8AÎõìtÆÅÅ&¥8ÿ 5@Kr¦–pÉÚ’®J[oG4Ëù&–ÐúÅä“Ad©Éö„ðûM>¨QÔ‹ˆºxÙ’è?X‚öä(´Šœrú&8D!ÃÆ_µrªœgÏt&cáMqŽ2ù„!ªãS “ið˜¢á@ºÞ}†–^¼ž }æÂЬð 9£fú'mÓlJ!¤2ÃÝhÃL)q`c,ñö ñ«L[dѧ%ëO™|ôm)DJZ$¡ôŸèŸÑäcK´;ðRÖ À“ ¤2Ì•˜«Áχ«´°©¯Óñ+1Aš“:>02±¢éQØ$]˜‚W_|fZR’n®èT\âhÝ)¥A¹*.UwRl"„iª]*²¨\k•MäüˆX’¼~É(n½ ¹‹åY62"šHø› é@{ÛJ-1›{“ÏŠÃÊoG::%-ÙI$9¢Á8ƒ'V ã?™!¢ì? öù“àˆ^‰©Ãð.=dOƦ¤‚ÒM6Yä_F•N¬µÆc ”„ p¥Ú¢1 q}¤¥*¿4œ€Žðs(:w RìÑN"1ƒr¦#'ÑØÓc£ÀLг'Ĥ!ñ‹Ãjß„®bìRé‚B\“Üet­:vl4RÑ*L<Ê{è²Î+¸ sYd È21Ô •”¾ëc@üSc@pA?d@K/+lOôOLFÀ…x)j 1fÄ!Ÿám„ éQBe+Ê$6©¢ˆoŠ‘€ËJ- tb*¾Ìlµ¢*ͧ*g&ÎZ—E^r&Ÿ¾HŠIq|x‰©¾žh‡éš&ñ§"øåt«ÖI3B£‡•¤‡.IjJ¼R"µUßÀ0*„§: ÝrI~ÎÑrÓ­pøÍ<¼µ)Œ5³A›iðÁš)Á˜iŠ Ì6µ¦ ¬ÑÁuU”º® ñ€2…–äÿaE 8ÖCS$@D lù2ÚÀ†X¯ˆçº‰/îØ‘° H‹LÍLr–Ð^âG«—œÅ­}ö<Њ7<5>®5ѹ3´¡ü0(6a¤ÉÒ­o_BÜ]2CäiHt£) %Âã"§ñÅj±þW´Ð<Ó]%«€bŸAYò³Þ€ªêrÀ¼Yúš­È3“aCŠŸÂkŸÂê¹*­’h×™NycÅŽ'"Çñˆ`ˆü¨:¨3À}åOÉ@„š­"ÙfB²A#D€,äœ %Ô–%ÒU´’þ3sX¯"M#޳‚άc”§igäÜ7Ûw >°@Nd’r¬Í˜]ð!’,c×G%%U“ ODV%¬ 5µqQµ­ñņ,{ÏtWÉâdyºbˑն½Ö(¨º 3žtVtÃE 9±ì]A¦´DMõÏð+öÿ½Ö¾«‚Ìk=Â<†D¾>Ò ò„ÜdrÐå(úêey*Š~µá¢¢_mx‚2ábµè†({¦»J–' ¶ÅV¤²«"Ì®(mcRÍ–j+ÞÍ"/yŒ#ob@²‘TuUõ ´ÕŽÈL1"3(ÎûRÏ‘z©T9L&äJ}ÕÛwÙ¼÷³V‘7Ò8Yˆ³ +Š%Á’"ÑQoi±4ƒ7±A³¬h¨)õ,‡s^,š:˜+"€Û¼ë£Y©²¦¸b‰4àn¶ï*+Ù‡-1ÔXb†<5«Åá´áGrµb*ɰa©zGòì4–Ñ£œ1 1ÃÝUjˆ1å:\𢈪@·¡Ìc¬`=‚B<–ý'¢ÊpäÄ£w%˜Ö’K˜`ÕI˜À’`·ÚwU‚9­#]ÇÐ<Áñ$Á°¼û,à·—P­F1–&£„æ(\”å Š¬RijëLÄØ#ÝU&ÆH31 SVŒå¸ª{²ìRdÕ˜srVUó<¾Vóȸ5˜¨ªyä@ ¾XšÂ–¨y`…ªæÅ²Ì1ùè]`¢ôB¬º×Vq&F@­ö]Nºx*1FYI—ÆIQ† ¾¢æV…P3c¢á­fÈ Já]‹Œa¡9{(B …û¬r³ý*³Ê¨j%y‰â6 ?…XEá&…ÖŨR) ÒpdYÌJHð+~úÉOÆÊá#6¾y›F*‘Tó‚h|Û$ÕŒxo²O‘Rgò6V Ñ£Ügµ›íW™ÕFVä-­²ZÀ#VK§ŽÕÀ~ƒó®4E‹RË«¬¢x‡ (´–J]fM>›h9,1àoamè݈7 1DZMÉ󼎣øYn¶ï*«ÝNdô€ôÀ‘7ñŽBVõpÄ[ô¶þ/$ÅäyÊQ©¨ÄÅÙ+{OtE7’bžéÎͤlý ÙòƒåØQ3¶¦ÿ­ ‚7‚a+Áªà EŠXB‘4’#+!×»Z^ÜSþ&¬£­FðÀÍö]ÅÒªœ#|5ÃJ*Øm@ -‡£ ØÒ¢bá†àj ¢K³’­~R,Ê&­4WY<9]Ñ ºGº«,ˆÎ3Øp*WÄ546œ{ԇ܈>On<¨£ÀZœFñlbXd‡ Gn$ƶ'š+^÷(½üR”N~)cøàVû.ã©Ål8dgY‘B̲‡­LŠ\yEiubƒ4#%"Àá¢âîrxž²°‚-F Ñz¦»Ê°[ÓeC´˜ÀòKy=„ ºp¾Nkà_xÊßÿ^E Y`í"×I  2ºÄë@R:%9Œ’F‚6n¶ï2Pºì:²­Å ŸŒD¾Ûà´8¬L pÄÆÇVo†]œŽ"‘V\T$ÒŠ'©¤¼imÑ­ »'º«4ÃŽš ÈòˆëA«@¹ÖƒÒn4.ˆýe+¯F ÀA`E¯9 ¤`Ó›x1¸×°bÜdhM!4dÁ­"i‰ÞMÊ“<‡%Z öðºmÕPB^kße´ÐmºEôGÝÁÂ8C†h[¬ˆN«n¬À“ÑÈ®ænq†ŠäRš’[8a´«G`„ºÙA@SÏ@„êx"Œn«×?«Bƒ³ ¤h!B "‚ÿ@r`¨ÂƒsÚ ¥ îÇá€G˜qÞÝOòbм"ù¤3bM¸Ù¾ËøÀè< ØUB°e3o ø2ø›îL@]gV¯Gg¤xÿ°[uþñ4ûžÒ”Üò&ŒvU©'a%˜ ‚ a=…¤r{¦­\¡ÍœîÖMƒbt»˜KÂhŒ ý„ÆjUZ¼šÄ€´%Ã`nÛƒü¾w÷™üÇö¡ˆ„0Žˆ¶8زð‘âLH©æH%ž¢ôYBÀ3ÔFŒÆ!ŒtT)n°Dñ‘ ^ ?h7šx,úh<ñMéa‚Æ‘|H|ƒ!„Æÿ[ߠťÆSa\pšü$y;§MêŘ֋1c&Üjße˜àt0úâ`§:Ú 8"‚ÅAÓeb´=5j¸#1¦z±Bœ’¢ý)\TÔ?…'ªÈ1©-º…žè®Ò¬ÜÝ]W"Ø3ØÁ™…Šï(kDã{*tÛg û·ÓVØñd•ãeæß~Âë·ŸØ ooq¯}—÷-¾êMÚ°ádH‚ïÓ¦¤f§ ¬t*ìUCSÄ;•4Æ˲x“lÈ„ÍiâtÞ¿ãƒTo·ÆêD»9ŠFîæv³ý*³ÒpjGôxeÍÁÍhxó éFÉâz•ŒËÚ"¼†Vâj2À ÷Ú¯:/Œ¦hÄ*Êî„ípÇlx¢91M¦î°¯ícJ̪y7 Ï{âUDK#á•[íWWFì˜WŒMÇ+p_W´¸Erê]mh^´d°ÂíÚ8§á]S‹Ñ¯{ ¥ÙŠ7xy­ýªóÊø` œãðÆhä|âöÓ± 6b¢A¸laó®Yˆ¡+¤#,4C2å^ûUç“q»‚×-("Ì6üÄz›¨Š47ÒœÀ[œa¿+ޱÞÍ^Ã3òI¦ÂýŒ˜ŒÆnu«ýª³É¨?_†Mú{OS ÁŠÈG=¤¤xQG±üýÅ&WØdÔaÂlâ­4Qø^qó9æÇéä‰BÃ(ÎV-•hððj{HXÒPîµÿH^Iê5ÉOä5)5âó5&ÛcáI¥âcVŧsÂ{[”ÓÒk[Hhɤþ¶{¿¦ÿö»kþú3þçÒûŸâ†^ÅUùûŸÐ#¾ÿ‹¡9šâ¬ðþ'Š&ÿzÿSuü1 ç¤Niµó6+- ¯Œ#ŠamÖjaÁ_ÿ½?—ä?Ém¤Êåù74ÿÐûÿxd¡ý%ÿÕñçß?°G;ÒL›üw_zÿ ä#G˜:v´‰ÏIG& béo=²ô€µˆl‡³sg°>œöxSÆüœ×÷&œÙÓ0çØà«C:®›7™ÖØZ¸#èbtã¬Éoúic6/ítõT‡SÓz~zzY«ÞMë|55ò ºeq÷]srëŸÝWÿ‰ñwƦŒ¿õcAæ­?îo]ºcC¿Ú~}~~“ðýÑu.Ÿš{óÖŽ¢âmóŠJ¹;7ßÏ]ô`Ë®›ƒ^=˜{ºÞ½óÇòî_=v1;|[ÖEnQÝúiI­ë+}w|óS3ŠnÅ¿Uü[ñÿœÛwm|T›Ý+®Í`wDÝ*½Ñ¥þøï:ßKMZüMIÿʵ'›8ý§ds¦ŸümPQøž¬÷{ì¼KMn×swßwÏÍÌeÖ侟¸ýZúôÁëç4žYZüÙô’}7>ôÛØüðµ„ȹ%Ÿfä. ž×vÀŠ´lŸÃËN÷Ù;ôåÈ3köùå§Þ¾·¶\^’}¿é´œìWÈ3¾©¶nl‹f§oIï:ÐúçÍk?ÌÛ•¾iØšþݲ›ü^©Ù]/vÎ)ès·Upû˜zIJ‘O­œyeÂê;\ð§&ž,x­ïÐÈÌwëqï\¿Ä«5_iwíÅÝ^ ñÙ3qÉ̺ñÏyº[ã­[;e}bBÏcìƒF?“6k` ùÛùÄé¶AµŸpæ]x¼þÞö;N4YU<2ÖwΫÏ-kÚâ4Û%q ïå[ãžÙÙ(ëÊ’nßßp>—qrCÎ3‹»7`ßìZÒrat³5‡¶åk/j9¼ËØÂ¥ÃÛÅwˆ9Y;(vã¼ÿí}j}IýÔ§‡mHZ0̯õKÍ"#Ò>]QÜ¡oØþ¢ö6w-lÝÿk?ðƼå÷§ø·Ëo1óËä1áýûídM+ٶ̓/ ¼P]´ëx£)…yßýÙqô¯æ” {ý¼:ïÂ×µØk'oöZ4î™óƒüè©ýº>жûßúy-óox¾æö:5—ûÍß¿dA×Ù%¦6×5w©Ut¦ÑÏ¡‘%…¾…Çb&¶(©±ý`j濈£öÀ>«Šºæ õ?xp}à®ÔýOG•öŽo6¹xÖ¤¼ö7jÈ ½ÙhƱãOù¼“peŸÅ?mš4ò‡…“.üùóŠù3®\osí¥ K´©S<#õè᮹3–où˜nølèWæÍ¿ßhyýåÅ!K³?׿ûý] óêÎh¾òÇð¥IEÓkž™üÓʳáëŽy¬Oz¶ÃJ„ã¯Ì\{/îüà…¦¨¼Þµd\›‘G4™¾p_+5’rwÙ> W­“/¼©õg_îøjÜãKž³Þý¥Æm§¹ëïÓ_ºþga³Y£‡Vû$ÎÍx£^é²z›‡ô ñ[Vš49ëµó_I9ÝbŸéxvÒÁfOÖúüÝu“üß{7nhŸF»¥úïÎi7a`P›1+šœ?z퇟~ýqÆ®ðZ6$¨tº³ýÔ«køYLÿ×fõHNî=‚||tVN|ÑG9£ºtK–ºÿÐÝkC^³l沓š}7¼MH8åLir³¸ðêâmžõÿ¢W^#¢ï„SÆ}þ`iÞGJ¥õî½üßù{Æ&~²©ï¯u2Û­‹ó¹œÕÞ¾ HHûÇŠ7j6tSýE·‡\Éùç½ g¿F|5-Øï—Ik›'ÇœxwRðÔ]×w…ž4®Kì ~M‡Ïº›ùýþ´y#·o~†3Z’:¹Ó¦èi%y÷Fo»½îÇgíŸðâÁOÎkpÛÿëò§ç楌‹Ø9o¡eÏš¼më{3j6è×" W|iË—Þ^Ûîƒôq=~ùíßãÇÍ¿xäyªS£—³äIÄ®K‹wrÅñJÍÈMýWîÂOÿöáÐ% ÷X~ù¬`UßÀUœÏ®KÑ/ÔÒû4œsnä¶uÍ£.>·T(8w|óÎ[£V®½ó´yÊó{φNÜ$ýè'ñ½J†6/. H;9óDh~GëÅŸév.ß÷ûÑ¡»û¦xÃ?~Û¶aù]—`ö{gâͯïü±pö˜UµnÇM~ž4cs©õÁ={†Õ»ì·1ÿâø ‰m/þ´šÚr¸q°2¯k8ªÃšœé–ÁþdÝ]ƒ– -òºÕËšDl Nþ éoc.t÷=0Õê¬EÝÉ Ã¾ù¢¤ $ãpþóö„£µÎDl˜ºþZ„ýóÐ'Ö¾“3ˆôÛúÉAç¿í~03ÿåGë[³ÏÝAÕßðÚö— WþE†¯ãpîÃoržØ×=艺ٳýDóìÍ\vÓ¡ySQöï ^>[tÕœÕkÇŘz§Ö¯Ym¹Ü÷ÚG^:û`VpÍà“¯7>äóæýâNSÇæÖ²uñ»´9ôkòÒW– ÂϯëñÙä÷Û¬Z9¾ŸUPr?éþó¿™Éu{·F›F¦l÷æÐ¹KNöù|ÚÏ5ߊX'ìû"ïµ¾ó^ðÛøXGËò¯ÃÇ|;&.ë•E/Ž,Œ¢óz·ü{HßýMŽoÞþô¡= _muhrè™ì«ä÷¦ÿÎü&<}êñÒϲ\˜»ÕÿÛ>%m?¹¥4¿Æá[ãÖwÍÜ”>ìvþ¬‹KCž_ûöž-Ä’ã:A 0W$Á 8XΣB²ÖlÐÎíª®~-›µ÷1’—HÚõŽGìnDϽ=3W¾s{|»3ïGyà‡“8ùÜÙV ëD…@ Ä‘±Á?IŒ?b0!1ÊãÇÁÂ62äœSÝÕÕ}Ÿêî;¾àiv§o=ºêT:§Nª:çŸîÿïÜþä7¾úà³ûµù÷ÿèí¿yåå}}Ov¿ýSÿüÜÞsoµûôûÏ?ÿ×/üþ/>¸óŸ/Fþô÷þìÑ|âõßY>ýýÚSâ‹ßz¥õ[_ý‡Ë?ÿ‘þó·}÷ßßõïøÜî~éS_\ûJçø}wþïùÛÞ û_~ûÂg^Üxÿ¿ÞþÞ‡7?ów?öÑÿíÙïüÄÿÒÕÎúKí?úÝG>yðЯ¾óÁû^úË Ÿßxû+?þæw#|õ×_ýÒ·ÞóØ‹o»üÿô›ÿõÞWó£ëµ^ú¡G~íúg·ßµ¼þ?o|þ¥×>öÍO5?¾þŽ7o|ú?sýË7ö¾òØ×ÞüÂ>ü'?øÞðÛïþú^ûÓQ¯Èð e7‘%„åÈ4NfòÅ3GQµ ͧ¢v'¼2òñ“øó¸ÓhÞ$gÌ‚\ä€ÊFQ¢«7(äF?nmEÃ[McXó™èpßmŸØ¢O…TŸ<Žn°„C[š—z½x8¸P·Ô‹«—P/UWpõ)wÕËS/_½T)B•"T)B•"¨”;Í+P?º²e„¤?lÝŒ:„Q Xó—;í»ÕPÕßaèJšÀOy¾+!K8 »ñnZ„]¨Ê+t½î¥Fóú§¿x1É2Rg5’ƒ9¤Ãà äÿÁ†ÞNå$þ™š—à»go^›ç.£ÑÜÂlˆäÈ ¸ÑPV¦‚á«{wtoʶfB1×Âÿ\Hø,HlÚyáL™Îæ3A™c‡|. b jDÑ=i¶gcfŽÁã¹€Ø3{ÄG3™SÖGƒ™€Ì5Ø:”"Gï@öÉ<äÌ6=8g&Ž$˫ʘ?Ž ¨ÍÆIÂ6§#h‹VÚ3™o'd.,E¾“+®2–âptŸ0{¬¼s¡ògBåùt\A]ï=l½=¢™l—n ÃS÷ ™-tMs8b&ûÅ3žGǤoÞšl.0³90Z褨3w-xéd.D3Y1ŸdôÌhÁcìs¡™ÍñP3Ú¼¥#Ÿ³ÑµðiÙ¹ |ù¦GÂÇÍL·¼é7ü|ªA›—ÃA„Â[æmM5㲚1Š¥g߃|ص¢þúæÖ öÄ^<ZýÎÁùÜF\Ï_9hýêyaqË’ÂåÒveéOÅíiIôiÜ_oÇCv7êð²ØìöúSðk+:`Øßöyþ¹ìÙg®àQrçöYøôÒÝÕ¯ß^'¥ãí³ìɰ?8‹n²‡Ýhý‰³ºûÑN©5ô^ ÙE+Æ;,‰¶ X¤”^'}1'$ðûbÞ -ÄYÎeÅ|öX>áÀ„V¬×sÜñ|Þø·Š…8߇/ðÇê°¹ƒÏ®‹CÃÅ8GŽÕa»þxœ?ÞWv€W0 íåãýŒcd,NZãß:r¬_¤ŒõŸô„7L6fé¼;:©…DX(Á¤…úÖÞ‰™Z}4¯]e·Ö¿üÚ¿ýŽwõo¾¼öÍ÷¼¼õ“¯Ÿ¹Ó enØÒ€s,!N·x0žÂþl.¡»žãLßÿµhÿhÓu-Ï~ÈâÂsí‡X¥MçEŸðýŸþ•Á¿<ÅÿI<ü»+ƒçÿ'ñðï­ þÝSüŸÄSÀ¿¿2ø÷NñOÿÁªàß³NñOÿÛÖªàß=Åÿ‰<üó•Á??ÅÿI<ü‹•Á¿8ÅÿI<üÛ+ƒÿSýω<ü¯ŽþïTÿs"Oÿ«£ÿ;ÕÿœÈSÀÿêèÿNõ?'òð¿:ú¿Sýω<ü¯ŒþïTÿs2Oÿ«£ÿ;]ÿŸÈ“Çkuô§ø?‘§€ÿÕÑÿêNä)àÿû©ÿ£ûß0Nõÿ'øŒá崀 @tP²ýˆà©÷ÿ×Lö9ü ˱Óûÿ'ñœù¹[ç.µãíèœØ°gÎ$ÇšÏ³â¹æ™ÇšÏ—ãWêH³:ÑŒv„ðDóyöDfHh[¯ù/Ç£^»ÓÛ½žg¶ƒÿ\tÞcÙ¾2Gt%ÞßÇ[s 4ä„  §ý¸ï6šWãáU´ë„ö¹ÉÀS;Úi¤‘ÊØS£9ˆ†£ƒ'Ãa§ÇÙqƒŒ877{­«ý•¨ídÂqÙ¼ X!Õj4®m]W%¤IÌ"/×»D£þݰËFúw£‘/¢ÁX{tÀlËeÍK›:Ä!¶FÃHÇ´eÝé·Fû;ÝèPGKˆnw¢~4è t¤‘»}ì•4Ƙ>Tª#lˆvºí,‹ÇšWZQ»Óí†i06s`r››ã`p(n³06s`pãZ¾el>ÓÙçnÆ@=Ìh›‘vmv;­)‰—ãn{FÒ”oõýžé)ç®ow;E3rL¬;Ÿ<­+ñ¨ØŸ?µò4}bÕfâ”ZÝ(ìcš›î³íŽBI#îÒËîçÙA?nÁ|Æ`ìÝí|ïn5š­8î·Ï!úÎí„ûîËá €?á¨;œ“‹J¢¡:^¦Å>´Ân¤F4‚Ù¼Ö»»…Q‡4Ôø†¥ŠPŸ§¼@k8ø9‹[8øï²âG*¾¢ŒôU¾/ ÓŽºÑJEû@·î@ó¡Š6ðfdmbDD9V¨eÔ%*œúi<ªOù¤OÝ ‘ÓŠêôî9n¢ùGvœØx$òbMe²q,v/¾ÇŽ‘ÎÍx³Ìm`ÇLälWæjU¾( 9êMŒî£ð5Ûî„»q/ìòñ€€½8þÀV?DCö+Y£©=OÀ7¶7ØV!³\mïrF×ó2õâƒ$KÊá¿ i“ø*ZºdÇkgX‡½À(4h¬5Õc´5_03XBÓ¡ð¶R\ò9g»CÓkd_ÞkåØÄI!ÒÊÜõ@hýöúYF8î`™¬uw ‚ë%ñ/âoŸU XQjvs ç€e™QÕ‘¦RlGc-£Ô¬û)6Ûýð>¼Ûƒ!Ð ·£.Ì>l;ÈáÇ¡NÆé”]ÝÁ[—I ¬¡VhÛ¦†bØ~a$ô¥½‰IFPåÏ"ÒžTñVÚÁkTŒBJB„cYHëëþ¥~Y[3¹B#ýœúPwáýt˜Ä‡ýÎ>5ZpØé¸ÿQò>àݺ#ü I :Xvtá§®RÁj“ØfEÌST¡¨z7—)3ášCgÔívÑódú Ù?2;®h†rIfÊ~}v˜âM…`ü*ÆÒX;dGlØ{\ø7Ö P¨Eq]¶x“%Á°ß‚Q¥äUve‘T˲9:Õ‘ÈGÔÝð(êñ¢6ÖnA¯STÂH r2UÄα6Ì…€.z0Ôö†ð‘›ÜV†_°Ýð០H3àš_î4 @ c9h´`–’”츹ªŸiß‚D?êç£kù²tΣm¦kÜÛ¸fl¬…Ý8lÓP6¸²§Œ‘¦lî~‚\ƒ“L¶™OËá+î%mÊàC!“&*¤¦$ã€FßþÑèà ×VˆêÆ÷rQºÀ4©;ÌEª"v!›™U©iQçµRÑÿ©à“X&V«þD(ÚÂe=šþ˜$Ù¤QYyÞÞíÀ Ø·Œï%Èæª¶4V1'åû!ÌуQ?J½?1˜ÐAøß1D̓7¶ÎÑšÿ  ±¿âá4a¸òÔÕÎ`ˆ“n¿ÑL¿¾‰ÍZ÷Ù1ê’H×ÉMC dj|Œ†ZâOÀyôÂ…G,iÙ£/>ÊáNÄâÀÁžŒîçûÝN ŤnØÛùu)!«›åîs]…¬%Ë Ýú… gaFê±õ[êVÈvñâ”l„e…@…2¥: òäw^ äâ?C „9®ƒÝÒ-ýóìFÜÇÐCeÜ»‘hЃeÙ,eê-`¢©ÕP…füNq8-&PX§"&«S\le”ÖàÃÌEK:èR_fe…-âÙ‹3ék«î¤P2±@ȱtˆ›.Ħy,«ZÑ Cì>LtVÙcX'`“}­LÀ›µáÉ` Þ¦:€³9ó3ï‚h˜ƒÚ-4E´sÁ™àò Ô[Ý Î«¶0ŸëÁ³®¤¸=¬•ø{´7ìéN¨ÆOýTu”ã[4Œ}´¶#Y€‘ÃñÎ3_ÜBƒ3ãÐDGHrþáŽÂ¸°™ƒþ¡Kt # †ç.<æBé˜îI—œ¼xNæn‚;.óÐÈ™ é:‘ôð%;á¡: ç+œ0˜! ƒ*¹£(Wþ¢î(&»Þ©‰tÑïXÀ5Ã,`)hçæÁ¤[Ou%I—ø „öA´¾Óê »D¹Îj2ßÒD[ÕcR2¥ŽnO€ ÁМ ’vœ&+ Ñ@Ù:@Øè÷Îõé½TWŒT‡îN…­læÄTQÅgRÉò%«Éž’j#+É|?ó” £ÎÏÜa0°x6Î¥,EVuTWš¬€ÁùÚ Ûú¨«„v2#«[Òp¥^¸ªº¹*'—@_>Î}@\¾á<mDùúÆÀœçBoËõt¥ê0üª*õàÇ`‡Œ%Ë_”¸&û·ª‰¸´Ã)´üç L€¥ ÔAÊ,«ˆ›õTW’¸\Ø™¸¹Ûílg¤5yP† ª:$ó®Íî4Ó†^í¨¸K-T¥22 ©ì§2´äªþ̳ÚÎ.^Ä2ô‡hóµÑ¼ôôÓ©š|>âsõžSõgISt.SÝ,ˆ™ÝéŽÑ§ƒRoueõg¨É×ç5¤{uèG˰+¯ªøãäØ'v…ÐXbW† §`¤YC÷—Ð!ŽäÄÇO5l‰?.Ï‹?.®RPÃæ)7Êžo¤ƒXƒèÀjp5ƒG(}¹d ›%s#*`é Ë·+iØÊ•¿(»Üà7 öЪ4¾¡ÿKóÙl·ÆMN†îjp´¡©ÜÓ"SŽA_eÒå¹N=Õ•ä:8Ž2ù$®C(©Èz jþ,µŠÖò^[%J*ÊU CH™”bJA¢ö7T (LÄjJ„bZ^ßð-bF®—¾5¬ÿP"ÀãÅô’´Õ`X&S¢:<=Ó¨ñ§†ÒÆñ'+0¥’å/Ì”„)ÊÐ)Ä7à 4Sšï÷âû+ %íLû4 ¦}š´ÞàûF°Œ$TKue%!®hp"OŒÔÁ’h#2ÉâÊJܨê&$*²­EãRùÑAåŠÌG ²ÄZ.C :¸&X…|½JQTa%Ë_˜!ØCàR3ŽÏ$Hˆ¥B«"gª§ŽUà iSÓÍ ry¤J:H™ÅtuÖ|žPOue÷R,²­ä+r‰v= =2Go[.¬‘,Ôª+Ývw¶3Ã)ÌmA:GS2¾—º3c£~3Û9¡`éa+ev…™rå/ÌEœá̆£Úq®4Ùi¶½q.¢EÕÇFæ± Õƒv1hÐ.¶RÓ.7ƒ3չˬnÆ Ev€·Í&²ƒ¤w—À²3Lµè‚EÕÍ¥S@¢‡Ž!¿„j·Ö6—"6ö³Ï²· KpËå 6³}+£YN÷ø4ÍZt¯ O(UþÂ<Á5y.ÝPK·Š¾UÂR#˜íÖn%Ä‹¤½){*˜qÒ FW»•”¯õTWV¼@WS”¯&fjÓ†Lþ“’×ÚV>ªn:N…Ø>íÑÖ’M[Æ®í.—ÀDïÚÙÜoçj|]{úà[Zù ó‘ ÇG\::Ì\«Â Ån¶ýq=ªáÜp5¸ˆjmJÖ®¤`JÖIh²vÍ`).RGu¥)’(b"Ñx©ƒ‡$A†å†?é,5H)°2ذ«¯êå¨ Åň%©OG¥—Ë8rã†G`,8m)Ua¥Ê_øˆ³È1‡tÐxD7ÆJ3¯ÙŽÆýêf>?Wƒo¨ÆjBv)¨ Ù¥.Ðýì˜ÁR|£ŽêJó 9e5“¢¥¶ánÓ¯ÌÔs%îAjò ¼nÿ9úúêÌ›³ta#7Û2;%Œ\«¢°Qªü…y†Ì)2<&APŽMg÷ª,Z‚ñýåÖy%øEÒP­rÔ*IÍ×*Ï –R†ÖQ]Y~Å{SV+ˆ’zDŒT”À¼•/}Ôp0]ó¬…GQ%­=èHª=Ì—¬Ëð¨N­kÀ 1ÕCЫrt¬dù ³¯ÀDà[@Ó\UÎŽãkåz~UØ6TÓ©MAM§ªùÁ’l¡zu¥Ù‚C‚&²DIg9’¼•ÙBÕóe ¨ÄM¿€áás×WPîPAgüpÆEw¨È@‹xËåÙ¹3¨ÚÎ.=âzÁ¶ªqRå/|ÌÊq@ Ãû>U4 69žÌ¸F;Þ;½Uáy¤Nàhè!1hè!1s5µg-Õ•æîÄ3§ o]d RÃñS~µ®&<2ê0›qIw|º› M“>Ñ–/—{ yïØý4öÆ¢*ü¡Tù‹òžÛ!qðrÌP¢€þ+Ͷ›ímSAõ†a­ Í9< iHJ”8«‹ìÀ ¥Rf9‡/°]ZKu³¶K]΄íŒÑ¹ê×Rt^¸ ^UÕÈkØ¢0È/-XWÃô'ÔQpa^}±±%¸Àãt›mÉ„.ïHãj-Viœ—±Í`B/Wþ„¨›'x@¶ÊêÁâwWEû˜4м’»‚­Nƒ(PZUD€:*«pé$Ÿÿ»oQÝX—=^óm[—–ÌÈðŠp)óä5Þ²u:¹-qÒ§ëËæÉî€n¨ª³žâ!¦e <Í·]Æ{ê6­—i&q݇+2á+þƒR9×Zêu„7;9‹£%Ðjj¼ï2k .«ø…9Ln“÷‡xÊ¥e¥¥ÆŽe°¼Ó0X &“¶QOû’‚zÚW-×Ó¾kˬ4j©®ìJÕDiENCèx«Șrªt<‚×°Í™SB #Á+ŒêÆöd&{ Ï Z¦¡›úÄ{–|4Sz´ÛjØÌáÙYI”xµ£™åÊ_X ±T« œd'èzЦ ™9ƒÙ§昣©\UYòC3&ÙÁ„xïùƒîhwl‰?vÀ`d˜^¤ÝÏ|& ÍgBîàZšVÆiÑ ž$žq¢ÚxÖ}z n b mJ Ù*À{µ°À€x”øÊmÌmŸÙ, L–a C››ƒ¨[_nQsæ‚`H~š5 Îcb8"V!P‡+;Eˆö”]µ1  kVî±Äi5AI;Ä fß±-ˆþw ¯´õ¿D¦¥ ü35J3Kœ5á"^I†gÇ•«CaçâR-°Z6ÿqp8¥k\_~YpÅÈ/dXbÁ£ ÄõF1LgJ•…³¹Ö€v…1ˆY…“,[ÿÛyLZê\à_°uLq$˜8ÉC¦ ®d/Ù™"Ù}‹I÷-Á¾TH ­/¿,¸ž †Ejfò(t ¹À‘Ž5ÁÒý8ªç!ÛêÚ‡ X÷é_g G^¸Ù$OjfBF‹¤ÕŒ™@¶}’B%ó¦Ò;Ÿ”¶91Ü,YÐßDÈéÜ)¶¾ü²æl<|&Âù,l –‚Ù íð°0÷*—aŽ¡SÂd”7)”*o¤¾TSÚúßÎÝÒR Èð‘°:x  ^¨­;p!=‹³Ò¯èä§e…žá?úÆjFƒ÷ÂL^0(0IÃ+û>A‘1(< ù%”!kVÈÊn3üÛB©QÍC”É\@V¡õå—5WE²–ΚéÏ8ˆlùÈ0Y<¹4ÎèGÐà$Åøì$‹ù€•„³K;^¤!Í%…ÊMÉÁ—”€Q1,Æcè!$…\Rr ®/¿,9ó_1ÌA<™ƒK Q%\†nMmu5ù¨žC ‚®rs;@QÁ+ÿ…r–‚ë;µMK‚,&Œ€¬`n$€,z¦e…±([1ú[x‚ #2 Ó« – 0DãÍ”˜P$a…'d&ÃOï ÁÿVxL–µ“em§Ð7âèáÉ¿¾ü²n ¡²@)DŠžA–`•Je)D”T`BÄ ” Éò:à> NÚJ%%Þ:X¬ì€*I1SRT%•œ³eŸ”Ê‚ø+Hr x*¶¾ü²nÆ(ÌÁ¦5%€0F¿ l—T‚›4.AJ@X¹a0ü_IgVhýoçj1ha ‡ƒF;ÀôI~&–uC‰¯6„h eHvøYÄ„ PtžB ÊÏ4²™‘L&€>\3 ­/¿,9ƒ¬„×èó¹£ AP–¤ˆ`f°°"F(…Î&“J€p;k-²BžaYÅùeV‹Þ+êEÙ, Ñ ʹ@ýÇ‘œªbëË/kî KÉP\ˆ’à¢RÀM %ʵnÆŒ/rRê^€@â+$¡J[ÿÛ‰”Z Dˆ…öàâÃX&Z‚¥‚@TÀ¶nÈ¥$>ÇVQ:Vßf …lNq2k)D YʦSEœAT¡õå—%gE´NR%I4jU@ËŠ¤;vèì.è¤L)ƒMJ²º0`I˜W–ªH²,Æ!?+á!¡ø"dñRJn#†ÒJZ¼RȼæX úœÚˆ\_~YsQDé%ËÔåà¤%AØû ›@eZœ”€¬rSà° IÎ «ÐúßN:Õr >¿H ²ôßh-(1fˆ.dYªˆ¤jm0Æ•Dµ1JŽ©"àÆÙ.Ú—5)8§˜ªbëË/+î qiù,Lz!à\‰Px+vhˆ™(Iq°KCbŠ*L ´'Á°#88ŠGJãçL|*$¬PâJ¤dKô?$–øô7ád‰*¶¾ü²n%Ñôr¶°!FÂÆ$ÂfiDžÐ3 £±œ±ã” ‡i”„´§ä/ G <*w_¡õ¿…«åb®8BÃϲ‚ 0z!·¬œu0¡í’V(ÛŒK²ÿ˜’«É(¦L…8’63߀S5™bëË/+î1Sf.R"™É§8(5•ˆ•ÝO¨üá3ÚšÀe_Tè£ÄO’ØÂeAÞ Ð±x@4%Óƒç$“xú"û/àœØRh}ù÷B €4†¨X {@\”ØbÕÚc´Ey0­q¡¶ûŸÄÖ7PÄ5 ‹³¬ìZ|áµøñZ|»)Œ7…xž1lÀœjV²„ϧ¯r^Ї®•<ð¦ø ¤!~ŒþHéÀgô 8°‚ëË/Kî ãŒE2²D•"ÐÜ;è©‘Ê’B½5H–`1ƒ,Yl-PÞ%”DœE˜¤Ç†U¢ŠZ@M2­;ÒBL(Âh†9´J*M(JV  á¶0Ë…žŠD¥ßCáL‰…‘’Yæ,%®ù:ÌLóÏÏÊN¬2õéc÷؈8Ï2Wh}ù÷×–Kf¯±âÿ ÇÂÿzVnÈ>£º¥“”f¹Ë¥GGÁõ¿Æ¯Å0Øê0Ö”@úLƒ± -î8ã±™Ø0ଅˆP2ò™h†ÇÆpê³B?˜/Áp¾r=ÜÏ(*ƒ±¤céÍÆç¢\_~Yrvš,¥e¶|!’äaˆ:`°€¾‡*@p† 4Ê4×Xj(Ó÷q¦ #ŒÆHYC£$¯‹>Wò¾pªp‰SE1éÿ§Š[¿—BëË¿8ësÙsë dfIœIå`l}H1•žÇH¦ç±õ1“2`Š“Yþ‘)Ɇ4U‚*¹æû’ké3%s_9 ]„èúX WJäÎpÝqÓçŠ,ÿEI_¸;º8«éúŸæ;ƒýD_Ïðp\àæìA_™/v‚Œuøô…ôexÍ^¤WR“¾×|ª…šÊ?ÿ§%b#7Ç¥Î+œxFNâ¿ÌtŠÝÝaŠœØÍp‘¡Øgðè‰ãð̧ºæ3×Ìç©ðù‰Óf‰“*<`*:¼–ý©ÿþ±Ìs©£‡ŽŽŠË’%ó½¾úïœ=<ÿŽ/ô÷>DB±˜$摤XÌÃq܉‡¤ÀY@;sÎóæ ÿ¯¿ß?å>ä8ÿîNóûŒ¯Ÿ>ŧptþ ŒÞ€|tþ ÿŸóÿw<ý4ÆÂ€oˆ© J£Fèðt–ÌsU311šä¼Ø…6Mh£EÇÒÈbÛRg# Ø+chëÅÉyÔ(0@œ©­Ü}zÎä >ÉioŽ…?Ë=¡z×ùvºµÉ¸¼sñè®CuvÊæVRðÆJóœË¡ƒ‹Xð–_8?$ÁúºõuצÕáö©Wmª) (=gêcÛ¥¨iUz|€Ã…‹žÚ•—n$&äù}¼ot1Íû¼gNqo½vcû&Ÿ†|â„õªä5ØžK~²®Vgk¨fx¾²ñæ]³×òŒLŠ«?¥‹Ïûø}~hð«÷óyac½iŸêÆê*óâéÏ:RUÙÓ›ü_M´÷ZS2uì§µEo>½ûP¹ë\×*B›Eöìa¿Óæ°M—°­£ârì_~¨iG×e]+ÜÛQ`–YFuyöl󥈹yEÚÏn/ðàW¬.|X$äÜŽ#JíÞœIvÕ|}f7/±œ÷4qSé¹[—'ö²O»×4.±©Ö=߯ž|ñ|ο†GçÛb×ûœëØg÷XS"ÆjU¼æÙ¢†ÛeQõ_YÛ•íìáeZÛñ`Ã(—'¿éom¦{5ÅOÍ:`”0aì$óSþþ£j+Z5ZÒ^1>Íöé½£nnØ”žÒ»s¼ºÝºvùƒ Vkà&™Úv06|t;Ï5®ïÕ£=.öRŸqöÿaã&{:ìœðäGñnëü^=Š¥8LV™\¶ÖZôú^ø„ï/$<™ºÜ§ÛÖ×ÁÆ96ÚSŽîYù䨉‰96eĽûcÕ–/<ãfÜPéÚ{Ô=­ùÛ'^Â^k?»³/É7úÊ…¡6½pñ‹2ñÞÌ!OÆô®+ ±«?”´(®{Ô ß_]66øT–›å—éŸ^ºq´Ïâú£ R -ïÞìØñÜ££Q–Ë.vW/kdëp-uî¦Ôá=Ô7?¼Ô;ûØqª£µ¯­{:Ê$4dèàÚãÑg‹×ýi×A³úxbFõú̳¦ÏG&¶Ö¸°Oó¥ÿÈ?R•|§NüI*Ý‚5øÆ&Ú«|ÔêÃO¿P—{ެïvfã¸N:ãŠTCº4®¸É›·²çƱU•ªÝûî9¢j0n¦þî?#ÍÑKþnÿ÷¦¶ª*Æ s‡ÄO îÛjFBÑaË÷¨¬µþ½-µmœÅåÒê6–Ów§Æ–ǽUÙ¢é?úÇ‚áÔb{XÍœ·³¡sàÑr *NdꪧºÎðŠñ[‘êý9§t žÛ¦mŸâ³A=k®yµê°jƒ]7‹¦ÌíÑGØÙ-z»ØìZycüƒýoÎMõX§]Ñ¥zù©Ì”“÷Ú‰ï ;]rWï]]yã‘­ÅöÅí|ôÜ'ùïrÿѸMìôp½û“ƒÂßá&öG°Ò„r¤]#ç½è7.SÕtÈî¤[>ŠSÛ[¦Ø¶ë¢Wù|·û•WÅ^ÑW3õŠ… y™gÍÊÛjÔw´ û.հꤡ{ç¹óÚOúrà>Kõêô·¼ï/ç®¶sV / ¼cðÄTó¸Jݬ&¹û4MoAÓ ª0¢&ìÜI§Ä„!gôª¬ÜͯEXðs~V³d­­ÇžÐa½êÊñô—44vÜ~œýd¹¥uWÝý}ÜÜ/Ÿ:ÓÞVw«ï^«¢õs¨v)gv·±õ>0ÅN£§îå±çÌ®5om-vü•C¾Ö]-Û.Ú~Œèùr˜oß[×8¬r©1äýÀ}!w'È–¨–sð…otZììúqQíFj¨ì*~;rv~ÛÄßÜ3î?u)™«_ò0¯¿‹kn N~ST?eÉ9Ñ¥­Fd«w©è±¿jWÙ ÿÕ­ Û<ìR—ž—X6t›ç„9cÖ¯ ¯IÒ+Ë¥æ”Yù¤÷>sûç¬Ï49jÇE½·å·—öóx?ÌØ/|Ù'_óÒÏ磊Æ6~¶Ì1iÁžÈõ‹èf^y±/³_òwê·{¶>p2§\5䧨ØPŸ1Ó†Znêk[>£êñ/ÔÙÍYö¢¢µõ,Ÿ²kgÙû«¨ŸudUt¥úð®6:m¢ÒDWo4tßë²tÂÏ?\Þ¶W`·v«iÀÉéoŽ?îs-4À0Õ¢˜ï±ñH}_K—U.*vxžCNCä%«UAª݇§©jµƒ.6ùÖä¹zqÆÛŽ•M+îÔê¹êEì‘Þö Ïäœ 5n ‹î;{wž6&«€^)óÆä«®:Ç Ý£ö˜½y«×Ï7º´Ðÿq oö¡u— zº^ø´ZçÜoÎaž…¼ØàÆ<·øF·áo®OÑÚÓeaáNã‚ Á/oMóJÿa…m÷”ÀsÍô©ª§ß7¤¼­yè—¦½ØC ‘»\o¾nÈ*ñÍñí^Ìj,lLqUÏJMµ2ÐxífZ¸3õþ%[nW%¼ú»GéU÷Ÿô2þçwç4M}â&×X[~JØòl»w¯^Á—ÄW„Ô3ûDµúÖYi”ÿðË邸…áóÜ“z®ëS}ﻀ›KÓÌÊgäïÛ|§Ä=Çæ^í‘KËR ÏJël—UîíçºeÉÌú"ÛÔG7ôût ¼f»qy§Aé­JÎZ® ný]ë’Ÿ‡½žTß½q]#$©q`BÄÈÍ‹'F½ Mð:aƒcàþ¼J¿ñ½v4^8o¬í2&é“ï®Î'rbÖÆ'ó¦8ÅëÞþan»BA¬=ö)CàµgÿüÜkw<£S¬ƒ3^5Ä„™L#|tî@^·ÊÞïëv*(È}¸¼MÒ›%–¹'L<õS­¦Å›ì,ŽØï4Ô+;üä|Ñ€ÉÛK·ØŸÜç˜&ò;Új¾MB:žŸùÛî¡O[Õ¼‰à»Ãd¾õ†(£½2¢°¡›‹ &œ­¥eÜÝѤڡþÉðúcO|Œ}¶ÖÏþÐq„CenèEóG,s3~0|×ã^Ѿÿ±_UŽ,±™¥s’*ÒŒ·°œ=åé@osïåŠNÓRo}÷!–á'“/‰ŸGÄ÷˜mY¯3µ×ëw]>˜§>/cÿŒŠvÂ]:Œ+|7ÐÔö÷ÃmgþqÀdÍú ½Þ‹‡V¦vQ³®zo¾ûYˆýé²eKÔÚ¯>R¥²ØO#ó9–ÿ2¶îøK˱K"D¾%ùÎÊ\Í­j#vã͘‘=rz ±ú«ã*·Žî¿{`Šþ뉎[ó"Ç×ÞݳòþÕ{¯ór®È‹ë[~p§Û§ \LöðŠH×É(Ž{™áûbƒk¸Î8Ë›*17N†ùD?¥?"~ôÙò~¹ÝŽ„MU£u~ð‰ò_úiyæ‰ýö¯g3t{fYî²´q]W¦Š‰ïMnm¢ú[\¡AĶ™UûËôÆm½ràf\lc’J€³¾ÛÁCQ×B-ˆvÊ×}LËò×Ô¨9ääåìŽ*ÿÔóŠ~°3Òz g®îÒéž÷s‚#½&\]¸EsÀþµƒgÇ`7 o5¶1¶Œx·I¿Clªîõ€º šŽOƒÒ“-ýžâYY;öµ±è[zK=xêÌù§ ˆ,ƒìƒ7nÎÛ>äyëYAøüíZϬC»Í´ÁȲl|¬–¡ni¨G9›û´Ýoq#Ýβ×.O7-·Qâ'ÝWZÝZ^×Wœ´Ìß²MòÚèŒ=Ý"b¯‹iÍYdp}Ë&+íLWßßr¾}2h«kŸ=™®·5Χyô(ì›^µÂa¯›—^äø;S ô#“wo>–«eþ’ªûö®<Šb[{…´â H@  ˜ôì3 1B ö /t¦{’3ÓCwO2!Ä‹D¸FA &²]6•EdWîc K ,^£€"²)Šr®(ê;Õ=[Ï$xß½<¾ï1¤»OUó×9U§ª«kù:nÅõ““;ÿe]§å?}~qá-V% ù„Ït©MùcΙ¤­g“Ó.=»zmÙ{gÊn…š—D\zjCtË·g§…²cæ9CzÙ-?ÑùâÖØ*ç­·üð¼Ÿ&õl•½k­Ø¢&ryUde«§+>~àÀñL÷æóÇÎWÿ¾ðRóÅ“Ϩ5 ÿéoŒ¼>iø)òÁ·ÛÞ¯ùÄN;ºì‰˜õÅàª{gÔ¬úô¿²Ø¥Ó»XÀ¬šzß—5½L±î9®“£ëbû÷éUÞòâ&3beÚ¦õñ“²mÜ>~FúLºâÈö‹göÿV`èÕ½Ìqú³W+â—üóàŠÎ»m^~nÝý_¤‘í×åêC 9¿«hê'ºN¼ÚaûÔòOÚ?ªãŽm‹‡ÔLFG.&zô4,ÛS?ù»^O˜ï1”G²”­ñQ³Î]½pdbìÔˆÚ¼å;ÏO¾fŠ¡ê±xÈï£]_–¯ÿa÷繇WDµ¼µßß¶þôþ"|°u]«…/En2nm=½ÓÑýç:UOytÞ¨‰è‡<¾yõÌÄk÷MhÃ<¹¥ý}e¯Ò÷j3Žisvá’Ý?ï|pE±#ªnBóýå+&QÓ¾8“½ˆ-»ðŠný,ªm묫]ó#ºW~^qºþBÎcê¶O}úpÇÞÖª%ãçÎù6ºÊz¹kQïnçä1_õxfÔ¹O\ùíŸ\ G/Ô<“`¶Œ¹îÞ‡ŽW¼µ7îïWO~³xáâW´}<±åöÅûNw<|ú‹¥us÷šÚÎZð\ù¨ »?Ÿ¹´Õ¢³qQm·:7ü¹a/»¶6¥`á¼¶ùKþ¶xídÏn™æeó~ܰiÛ›Ÿ¯^Ùaö’Ãö˜=Å5õ_Yw¾Þ¼ýζÇÍoŒ0?ðí£u_.1îx9«ÍáïFo§žõøê¿Ån|vÁØ\sÁôi'×~°¤‹ûz]³Ë«7U¸r–/øgÿ{¶Ñ/nQ}t_M;mÕöe•µö±}Umkwío¿<{²Üó½÷êüS­VÍV=²ñûùy¯œL­ìøø[ÂÒ^gOTD9F•©ÏM½ÒµÖ¸kú­:ì°nZNÛ~6ÿLoÿgTç2/ïH:øÊ°­ÆôJyö»äÓµQ µIO½›~¥ß#ÝgU^žÕ)sÚ:ý¨Í+í9ÝNÞ OŠ_ž)ŸùHü¸oö yìò¡%jçØˆÖš˜Íî™õ“ìŸ7¯ZżòXæú¹+¯—wʼrbɼó{¾_(L³8&çõiv¸Ÿ©·û¡~³•<Ÿõòüq½zxsc~ÕRVðîÉ$Ã%küÊ÷ÒÖ¶OêÈœ,þkÊ/=¨´'ÆZkÚsÉŸ"ŠÞZ¾ºóïsÒ¾wÝkßž²ÇDvÜ4¶œÙ²Ùýh‹ rÄn÷^‡Š»½Y–¡oô"gz⾫c³Ÿ²êÇGÞY·÷ÔÚÝ•«œõüNêÊäçªìß;¢l—ãùƒ‚°á¡3‰#;tºqêË-uËî?ì·¹Z¶.[´aò<áùºª¶\g«Ë«â¾ªv8OlQ¼´c¥X«bßíßs²aõ¤+Skí+v×Gý÷×o=8íÌüœ÷jóª÷_­\ð׋À8îàhÃÃÑx¶ÆR!­IŽ•¤¡p,PuxîLì\”x´jp-:i³ CÅÊ>>åp¸–oEGúð˜äI,&6nHxo,µPH>2´ÉªÑƒW›Þ ëH7×À‡¾iõM™%ÌÙŒMâð¿™F©•Ïô7úšo˜i"LÊЀbžL î‘ý[!#²JΦù%c’:€»?=ôÀh—…á£Ó²2P¿|N Ï:EdŠSë!)Ð'ÄGT¦B‡#:5A£‚ÎNc€æÊ¨ÕAø Žn,HJÊñÑ4'¢B†ðA—š8 ÊŽwYŒŸ£Ñ&h០š‚4*•>;’öq‰ù2;ZúÊ™ƒR¼ô¡¬hc¢ûÅø´èæ+OOø&gàÝÅðö Vä¡éLÐÆË!/ÍoRÓtFhƒƒi:£1˜¦Ráv!8ž>$žÏi‘«n ^|è–„ÈÐãƒÓ‚ixRY0 oÉLÃÛ¢ÓðŠ€`šÉ‚Ï Ò†êOm ágÀá‚ixÅC0 Ï ¦á™úÁ4S¨N |¢gâ—t|*;^ô^; ¼IÝxD¦;¬’ßÈôTdŽ®ÔGV\¢jû?Þwm[^ðÚ̘PÊBúRLñ¢T¸Œj“öî²;æ4ÿCKþdàâeÔëŸÿ¥’æéuP!UFí=*µÆhÐ݃þ—ÓÍní÷ÿ|þGýuwŒýõwí;~Aö×ß1ö7ܵÿíøÙßpÇØßx×þ·ãdãb£ê®ýoÇ/Èþ¦ÿCûKóõÕ]ÿ!ö·Ø(Ax)Êbí.oHŃt9¬#ŸáY1''§œùqŒót!¿¸66ÿ[£×Jûk´(wç߆_Ô“Y±}h.—‰ÕÄ©àÅÜ3Ê”€‚‡™ÂŽ2Å@ʾ8•<Â$0á¥dx€)õó¯%‹†Âæ qüdÎå YG^2çN@Z¼ááBƒQ+/HKáìvü±À ùp|¼„/ƒçl\A¦rb*^×Âå~4c%¼Dy±A Œèr¤DÖ¡F%„âÇdšÃÂa©Ã dáňÏSŪ"ˆô¬Á2oRIÛÁä1@¾²!§ËwOJB´Ë)­U$û¤ùžÔðDY\"ã£h€bay‹Ënµ1nYdšexF`QD¨‡…þÔz ð ÔGÐAdm´?Š‘)†fm6ÊKSŒ4 °-™ C ìÒ‚a¨Fš†`¤+ùA¶Óà`ÒCøA^Óü´@ Š 9J!ÄBðø¦ÃØç1¼rй6_Bä–R$ÔAn©Pt:K‹ÕÊŸòN)°êh€°)\=@`B!èAáL0=eB¡’¬’Àdà`Ø~OVÁÏh ÏQ¢ˆŠ‚dhœB¦øp¡2 … –i€ürJ™N!Á(8Ú¡|R¹”6®P™F€â –i„<¸2 ³XÉTìMˆAD¯@’@jdɧxÊ‚WÂ0žZNÚ#âh%ÀMþažø¿•uÐV<Û?Øä5둽ÑK€7Äd܈웞Š PÀ¡ÒääœÒÿRÄZ›ÀøÒ”"+ÇS6›àsmÁ^LòlžŸÅÅãÉ#¼VÂXƒ!¥RDr(kg„ØLj È[@XºHÙXK#ÉœÔHZß×–ÆCbçÚØñ.&LŒe+ƒc’¹x°~côF…{ÃØ‹¡x‘“Ú¦R”ËÊ&!¼ÍwrOròœÚ3$õ¿ Ù øóAZ8ާc±ùb­”µ#…ý$ð‡rÙÄ&bIœ¤¢ÊÓWŠMH°P6F.Ñ&™î(̤¾”TÔÔq*™@Í‘âB¥ˆÀ…_·þBœH€TRD)•R ´b#W¼~ê†y dDÐà#P@T)F< ’ÝY©6š”E9©º¡¤†ˆ±b…àDJH¼þ•xùKÕ ‘ò¢ýj>W„Jp=¤òÌŬi{(¤biR‰.Gƒd÷½B¨4KåqÊ&(é`€|Ž'`‡ƒÅ‹ØÇH ‚tp´¼™¤°|!W~ äëÛð L©\7ÉÁ9=Q¼nþ"%%¿Š÷:@%QˆEHzˆR¾ (mdAàøVÂ[GÀçU¢y’«QžˆËt„´¿\#ü5`Kžˆøó¶g7xŠÎŽŽA’YÌY ù1ú½ ˆž#`AÞ"p ¨R5“D"_-Åù "ü5Õ «ÔkMš§Šøá<•ËØ õA¹žþ8ܸ}¡"çm2@Õ,þî WF y‹BrQ¤è„‰ =),@›8(àQŽï'x5)ÓU^GHldÈAØà˜®*Äûô+é%""Ð+Þä’}*,õÎíäY»”ÈÛ½GðþÅž«[À_?‹ñ_`¤ƒZ¯6¸õ‰Ô@pÔ ãÙ[^"ù r­ÎSDòoâ¡0'c³±NÉ‘6|q âxwà“"(0ÄNÎÜ^»ÉOP~eÇBD¸Q1yÊ!à÷~"˜‚ÙëJÅëÅ=AŠ·@)b¼ ”@åEpUõì-¢¨§>"ö#r UÌðRå˜ñD„´.‘<Žˆ.èS1(ÑЂ¹pу¢–/Â=6®gÂÜÁËhœ þɺÀCàƒÉ÷0†Ý0¤@ãë˜y«” ¬„´SnùÖ«[èÑ»x%‰ˆPòòEP#Á•‹|íß‰ÊÆQ´T”¼vO~Gêus¥ãøÏà @·© SØ‹sxòäLJ;™RC…kÏLžˆ‚TúìÅ.§S‘W Ù¸"ÉÇÐdD™Eq6ý"}uÑWåíúÀË¿·ããÙ›F~ë÷tвðk=žàØPÏÆëå]~ì,tÖm,\ÀíÁûÏyŒ­–¥y©²ƒÑ{=¤‚6Zpñ rÒVÜ9CРCçßݹÌÈŠ•Þù<#b}qb>dȦþT*+ˆ¸Ñå Ò›º©Õ*E%x(Iê€û‚É€n ’ˇKôõø=pº'&vGðJ‹º'%uGeeçh S\ Ø Y î&Ù(Gž ªŸM ðËFŠ€ÒµO„¬æy}ñ¡‹NLŒÉ¢ÍòÕ ,(ZRR#Ñ$+Ë”M&%Tµç^9„7€ ÂCÚ!JS¦PÇã)*¢¼·á3ÒhAkB^—nêíE2K¿·“ý›¯“ =ûB±‡–æØª8<#&𯿞jLA¯,Þ"çÝ:«Á½§ä~˜‚µZúë«ø ˆõ‡y·Š èX¨¥™ˆž6?hý»D)Bv¤j¿GL˜-¸ð®&ßn‡ÑÁ#Í1„Ùþ]§× |cˆÃÛ/ÇṌàé%²ôä¹Ã'à;m>}+. *¾C¸¥ö_±)–?‡“"øÑ““0øMÒ)¨^ø±È.Ïbå @—`H¨|hý½¨{bàé™2R“4¶ÂuX¹[c߀’døO”dà&Vh˜¿&ΠóÃô2Sö=åc–ÃÒ·Â.oS6Óè6ÓènÎfj?Èž(¸Ðeãî6aÖÇ=xÿ}EP&ã?~©ããï 0•±'z±I4ÒÝ’Q¨—½q•`6 q🡠ú1âP(Hét| &NUHé Ê@}`±‚F.•©)’‚üR|àÃ³ÖÆ+Yã¹—M±¬OáxkmÞ‡¦±zÂðö«$H9 ñVOúšÄdÒÿÃÞµ€GQdk_‡ñ®¥’K@’LÏ+%I#HB^’'3¤ÃÌô0@Šâ ú‰Üõ×Õ•_ìU@Ý]EA¼êÇ‚ø¸Ââ^EQPY‘õ¸ì=UÕÝÓÕÓ=“æÛ;õA’®ª>çTªÓ§ººÎÔU¡Ú2ÆAé"…–‹Y£`ðÁ %Ó°B8Ö2 cê×aVı¼ði±HRVÒ´ˆWˆ›µÂǸ`1äÕÕ‹ª ñ 餖êPƒ?Î5ê¡ä0ž(:\ìv­’\àìÝ51ϸ¸fë÷¤MoöëMŸ.Íÿ„Sʪ#a×ÙÙªe_ ±94"£vZ¤>‘ÅžÓè8ÊÉÑ>M3tdØÅ'пëa%¡!.§™æ•º±ÃÈwèôȇ?èzzÐêˆÿTì =,‚JJ0å^|RÄ”_:q¢¼œë®‡®„´%íhŽ5@&·N†=R_$ðÄþg•À3²`D1«®7y¢Î¸r•ЩÃ!™:b1®-$Ìj”ßœ«Àõ J/ ÈäEbçDÜ£,V åɲâ0Ó*ËOé»a°Rç¶“ âq7sQ~ÌY}q“’¥£2꘎tš ÷±>9µXÄq:æ©¢å¨2ð˜£jh FŒdgžN1[¢¥icu*xè+à„d™ÇBŒ6[ªæ¢Y´Äõ|‚E–áóHq[’Œr»jé‚AÀ:µtÁ²®]ŒüªŸ°ñf±®[R-ˆñšEO’_²$‡Y¯Èo.ùm Ì>f=SMÌîr&ŽCÌþ$ð10f%ƒÏ7êt£ìrid×’bV.ÎPE0GKM°À¡’R— ³\qzjˆ=0¢i·¨ÜV+ Ï‚YµœÌ’¥œç*° É×tŒYväÙ’;ÀÎʬZÊÈçN8ŽšTZ¢ìå”,î0fyÒõ˜³öè®×Œ 1‹‰*é9¡£4[¡ªµFˆî¸Ï à Â0àÐÅÑrP¤; ÏA_ävB!†ÖªeóGo1ƒbV©›ßw ñ÷ßfuü»ÕnÅß›í™ï¿S‘š8ka£s™n·Çîv5º].kaQÝaãÛé–/“Nmêæüï@’ùÃ[hÏpö þGJÒIŠÿ?u¼x)×o㱩Ӿâÿ·õé •[ç{7gò`ûÚ?>±º_¿gÝ6ºêýñó£Í¯|¿qý²ˆéÊÝ·Ì_Ò¼?ôhÎåçm=¼òÀ–ů\þDxãU­ø”í<»ÿ¯?mØTt~Qï½´ùÍ»ÿqNÃϽ׬ß]1wàE#?)™÷wÛôw–-ûÕ‹÷ݾ±ñW‹ï9§úÝ[ÊçÍ)ñMÓˆooºùܨïŒ8ëùióñ…uû?ðõ¹ÜyqÿÛV<´·±aǦue×ì_yÅêƒÃ­¯núñ¢‘—['µß1v™yÔu•e£¬2ÿ¯õ<0vÙßÞ.š´ãŠówL(Ûº·Oï¯v|Á7p{ÎË®îyÉ“ÏXÚÖýâòž?ÞëüúMç¡Ý/ ½÷µÝ÷|»ü|û ?ŸùÕEMŸ–>¸¥ð¹ÁcÆxñƒ¯v~^ýxhÛˆ—Þ75÷ñíßü®ú/áЮKÅßX_°=u|pµw W/}é‹-ëÏØôȱ•¦·Ž}ÿåèCî:ÞsÁ_?¯ý¡¤ÿÓ×õ]*ì9{äYsÞüýTqt{¯7¶þ÷”Ò²©ß7ýOmÙ…ƒ¼Åÿ^ñË_[ùÂ7ßܺàÊ>¯NšûúõŸ»¬yýͽV”ÿ¹ðþB‹w«cá[}§ð9­ Ê÷ ÿø‡±oû²uË“Cn˜µýë¾}ÂÁg4]—åŒýÇÝÿ˜»éØ’ú†¾^ôhß?´ÍîÉ1ó'´÷üŠW312`쨣ó{­<ðúŠ–àw[×i˜zÉOËÎZ¾­cÕÎå—Þóûçž7é››ùùÍWÎ|ð»Y郃vU9(>r<[ÉÓfýî¼Ýs+†þtøÌ–7÷üéÌ*Ëý–³‡›ø߸k^Ö w›«ÎX9îŠþžûöþç^ó„Çö½ñÜ–AÇ\߸aý¾›Âã÷¸ºoÑ\Ã8[Âñÿ¸ŒþS‘4ú?ñÿ2ïNCÒèÿ´¿ÿ³X¸Œÿ—§ÿþcryPzB<°‚íÿ[¬±øŸ62ÿ ,™ýÿÔ¤º–ö„.hæÃÑxÝwDMu!žœÆÁ¥u u¹PŽA<¨€*/ªù&>ˆÃwt˜êH<™¨áhê¨#Î/\ Ñ­O¾£ÃÔaªmá B‚ßíxørù‘«1ƱØÙÎ#!à„·ÎBÅuWЄhÛ¼‚fToϯ# u¹JV].ÎÌC&S´.FuWIìPûvsݕюx[b…„k'磊3º}»|Ò¥Û(æQüí&“SºÓÃxДßÝNƒ.ÖURqù44Ú$4G‚|ÇŒqõ&)ÇÍãxPð®6¾Í'zxS$!*¸C3È'¤#-fK \ŘHEvqƒ?Ar{£‹/$¶ z](Ò(Ö2>Œ7Û<¨Œ§»£y†’ÔXWó¾t£´¸|x.ïEC®R×䛢 oX,öBÙlR4šž<ªn­™Ïóóá¢æ¤µ†” A¤$þñÂL¡›¼Åõf¼Ë›°*Þ3.®Ç[ƪzµ-BǦmúpŒ€Oë4Fp(5ÁÂÐß-b€ÇQÂH£Ù8$Z#Ç4E¼#ÔDSµã*'×¢Ò‰ÓÑÔÒêêÒ‰µÓ¯šÐMPÊ·ñ”Žà x ;Çkõ‡Û‘Ø„n(¯3ê—^çœà¬Ž@uÎÚ‰å55¨¢²•¢ªÒêZç˜ÉJ«QÕäêªÊšò'塞'âŒí8Z–z8yˆÔ¤¸fO]î¸*g¬Kðf:\Ðp¯D€‘ì å™ÈØ„q”Q„Þ(w«Ëã à.m Š>ÚŸà‚øZ 7ËåŸÂa“蘭m9Bã]~³ÀÃøˆeaR#o¦Rct“[Ès‹>:¼Œ‹a\QU„~«qù›Åˆ+è‰cÉE£Ádå†ywKŒQ!?ÝÏÅÿ/‰õÿøôÙÿÍìÿ¥$iôŸ>û¿™ý¿”$þÓgÿ7³ÿ—’¤ÑúìÿfÞÿ¤$iôŸ>û¿™ý¿”$Vÿ.WzèߊfôŸ‚¤™ÿi³ÿŸÙÿMMÒÌÿÆôÐ?ÌÿÌþoJ’fþ§Ï÷ý§$iæ¿;=ôó?³ÿŸ’¤™ÿéóýOFÿ)IšùïIýÃüϼÿMIÒÌÿôùþ+£ÿ”$þOû÷_Šþ3ïÿS’4öŸOýãÁ2úOEÒè¿)môŸÙÿIIbõß”>ûÿ™ùŸ’¤ÑúìÿgæJ’Fÿ§sÿŸÆßÙÿM]ŠÓÜç­8PTPô64¸E¯WŽÿǺÐXÁÆßÿ[lœÝ¡Ò¿ Çÿ³pŽÌ÷ÿ©HÙWTÕä–zÄF>×’g6egK Š‘6TÂPÃàÎ |þDƒ?á ¼8øS1‹Â›ƒÍïÁõYì?Šåç(BöÂ"ÊwŒèóáe&ö'a?JHùeb¸ %æ4:1n”3i¤bå ìvEM÷#_ƒn±;þž¸¢¤kJÍ&“³¦’RPÐÕÍ£­™üÇ6—ƒÊ›L, _Þì@ù¥åÊW þ¼Ù‚QOâðìÍ6ÈÖâÙcôÁRÏÞl‡±\ɰBFXðzbU Pþ7ï¼^—œÇåŒ8 Uy¼+׊Á匈ádéA³:ô@g=h«“¡g…œÉÚj0Lò§3L € þ¤Þ¯TòÍ|Ðçò{½Ê6h­‹¹Ñ­uÅKg¶.-[0qÅî„¶»YmvŒ$ªR „pk:Ü"ðŒvÁÎkE°Sža ã0_`阂=Fˆ£ízààqEWXɉýÌ@r€h"ÃÓtÄxžEÔòt@{E–'´Ad8€bÈ‹Qœå¸+Â꤈Äó,Q"ZžІóx¶³ô ƒÚå°5|AD,â>,ãrãH¨¼4ËÁÈÀóÃχq5  Š¦‰ÿ+˜ÜøB†Ž™(¹zh“cQ(¿ÂYF y ÜpGT9G T«|O>Kàòz• Å´i­±lR’@¡‰ <…ü¼ <¿Vðñ¡ÜjfRµMUæ »¼‚Û ð:ŒSo\dp¯ LÕ¨$·²Ñ+ÌŠð jèòf‹ˆŒ#AоQ¾!s¹\—µºÐ€€ ø—Al–wrØÏb|LÅ Ï3z«M˜‹ƒ[šò ö<ƒÌèH¡‡’_+†bOSÅ…(†*OÁ›þ¶œUá"CË3Kà|¸ÔÅ@Òxðsd´Ð†´7ۤqEŠDÎô=‚ª|æ†éÇ<©Q„4\0h<¦ox«Ó[9½[:™F¤Æ5ŠæcŒ/•À:(€8…;ˆËmgSˆfu¾šf#`Qda€®¾Œ@®Ç2#~Ýì ö½âr=‚«Yô»¼!6Ð"Š3éÉ8`Æ6†bŽ›Ô°åj@s†® ¿Ü°ŽÈܰ’ŒpN»JúÏ+ÐÎ(š•ÔŠÈU¬“?Ô`æ­ê A}ZÂqt)òÍ“nçP3FÊÎÊ¢ÔYYY±™bK ™*üd¸Ê©Ë†ˆŽL¹ÛBô2g„”ߪɯF 0#²"K‚MW5W†žÆ)³·Ã”›©²X²6=A×lv¸ÙC€œ×Ågõ%#i+¥aQ~d@W 8>­TKFà mËFt(º<­gBï‘2Uoâ"Õ%­Ë{’æ›åÎ"d¨ hV8¦…磕þ%ý’•¥¶ &ùvÒ‡Jʘó2X8n´`޼G°þíÒï9!µÿB6˜u°ìðŸ K L€@;üAšÂH¸&Xó$+–Agu3S)¨“÷z…@ˆ'˜m¸òƒíêŽ ÎQ_1EêŸ úlެ7zãW‚DÏšƒÚUˆèY@¸P«›EñÑÍÄtÝ0Šx™+(ÅdÁSUBeaæ©’‰í½Ãëjçƒdò†øY¦¬Ðë$K2$ÁÈQ.òÀ³Ô…‡ µŒ'•+…s†¿`1šWÿè…M}áP_*õ&•à†!FÅ1“§,šïsÍ¡Ê} }$Èf™²XZJ…"Háè=xÍhÊryE—‡ e••Ãæ)fHe3×!)We?µEj³É–1úýR›bòa'“<¨ðìQÔ$U ‘ÑçkL[!Ë+Îf²‚r‘7ÌdR͉›c©ÌE¥®Yv}`ñ/;>ª]õKNQ ^Ö›`¹¨çÙÈ‘Bù„0>¶ ¿ÀìÁú,(Ζ”ÍQnr.50vÙBú\ðŒE‚¼ Šá‚óï7„>«jrÉš?äø¿Äp 4!ÜþT™ ã‡nД/ß= yòÔê@Qü*‰8àJq¾Ê Dt|DŠÇ/‰3ôÚk‡’ËCKJ†¢«‰G¢ä@ø6°àÈÞ&¸±›äuù›#0ý¼¤ Æ1QNaa­IËEºœk¯O$?Ê™AË‚iª•”T#Z¦ ¤*£/ŠATNú›}äÀÿbï€p…Jp ýaμU‰AB;L©LÒ;#« Ùa)+›t7˜PÙ‹2Q’1kGí›â$k¥[h}_—56ÏLÎAê%‹<ä$Ä.} ®N ËvVåXpV*\†‚… K 8Õ¬¾H€:kp{blZ"‹YqVzÓ|RPgu@FÉ] 1:¡;ŠêfãËä…ˆ+dAKý_2ÈUÈR#Þ³@³b$ (¬.«ö2X,®? ˜³@ÆÆB΂õlÀA>:/t|¡Šº•…—kÞO¨v}ú ê ™èЇoUhUœ,¬þD¾‹úãXý¹ÃAoÂŽ0@©5î £ñj¶1ãÕÜLY ¢½Î<`®FRª¼ÈÞÕH¾“ñÚ!O£øÛO9–f!bÐ+á)LàU’AŽÆÀM“¡WÆßë3ÐËw…WÄ2ÐŦÕ®O U wˆÐäø¦HBªAðìœ{, u/£Õ'®™æ•’FˆÀ„Èö“«ôG'plPI &£Ü‹AlLù¥'ÊÞlr…Kê y´²Q‚¦âKÙ{Z.]ª/t}1N«V2‘3fÙ¨B9Ö(á¤80†c,Öx»•i<¾Lnü5 ËıŽh¬óˆ÷:˜Ö œ.ä™ 4ô1–uƒàé<ƒ8cÈ9´\lEöwo0_G£¶‘×3rq4ØÍF^š£ÆB MÁˆ‘ìœ8œ}n©ijœ=ÁÓ@ߪ%$ÕÀYÑrQù‚¹À% A%éFýŽJˆ—œdØlfõ À—'<X´ñÓ†rïÐ`’ŸNAäòyÉ$9I¾˜¡8,²¹ü¢È¸Cš&}ŒZML”ÓÓj·ÑÝ¡A8×ui:åÃ`RŒé U#F¸õ„VC%¥.AÆgtzjˆ­0¢i·¨¼9 ¡Ï‚ñO Æo,'†» ¬F2ßWc²c¸îIjfœI]³îd¬!zD-E§~‰€ÙZOh)ƒIp'Á—Æ„ìjµUIÏ¥ÉjIøøèŽ»ŽrKñ[<² L`s^Ècγ+¨¼¢WžNÕ¦8høÊj%™;ùº#Á¶$+Êcv}c,¬Z1·ÀLÊŒ<^ã~¶vLòŽI)¡odk%Cúbž¾ÏÅ_ú)ÙÒ‡~¦dŠÝÛYDÂLJeêæ÷¿>O>ÎNüý/$ýþÛfµ[Ì‚ÿmÆßÿg¾ÿ=õÉÃó˜w9 켇ãÍ;ßd³yl¼ÝÚT䱞nù2éÔ¦nÎÿ€§©ó<’Ì«ÃZÀžÿ°XÁdæ*RvUYE.—g5eo>¸ä·&{ ezÝ'ÇxæÕù‚õš_ÇJx:ž äó9¿Þ0e¼øÞè~ÿ¶fÚ¢»~öÜËó†=ÞãÌÖ ?ÎY½ú•‡-zï‰Éo.üxû¶9³}O®ÛwëÝÙ³¯}ÞGuüP÷hNÞaËŽ-‹7\ž}Ë:~Õç}{=ñã¿ÕüǾ†Ç²w ?ç»{Þžt´÷â7Kv}qËo>Ü=íŠwFî9lY²eñü?­¨[¼ø²o¨xÖò,ÿ§#û¤càž‡íŒÞy`ÚKgm³~#Úãë nòï=šsKö†«Îýä܆î{kÏòqõ÷÷u$ÿàˆæ‡îpŒÒÀ]|VÅM=ön,´>[ÝóÈù«ö×.Z[ÿð§wõ¿xZµðè|þ臶/œ•÷ŽÿRq×ÄŸ²¾ïžµW.{.ûÏ“¶¿÷îë¿|£gøðš±æC¦ÜÜC[WVñÕÎ|~Ì]«®rºúí^Ø:ëá½?¼ßv¡õ¯E>¼zektR‰?j­?t蚥—ÚÖì¼÷£~)Níqèí’§·?çËQ÷û¼¹à·½<²Ò7m¼`¡°°ÿ´'LhîóÓªå·;×<¾{Üîåûþ½ë“©Üÿ[|uïF*…° I(æü>gâ«ØHZw-²v­Ù³kX3Û̬ü¸©äGH¢¯º‘R!rÅõºr•+庑+!BuýÈÊ’î÷yžùužsžsæìœÙ±ßûó‡õœ™y>Ÿççù|Þçó¼?…ïú¼…cS»™ƒOÞôïGŠßÝÙÇ{ò“úÿ¢ÿúbÖsõ—¼ûûgÞÀmÜ×Mx¶þèž;2øî®é_ßOx¼Õ[×½õÕÌÊ†í¸ŽË•ÞonXPð§¼å§Vw:3õë‡vßÚå'κ ^*-ñ?_6bÌMJïkñç¿7[;hÍ’{N9¿iþáÑí¶ž[Ù`Á =¿¨žšùé”sÔku¡KaÊëßmÈç§}±ø`AÏI‹}Ý¿?<:kéžîÃß›1ãâì3G²ëýñ×»rÚ=~å½g<áè¸è£nÿý?G¹xïž[æ¶y¦pü¥i=(~ÛáïÎÊ}tÊS+×NhÿÏ?ný¶—s×ìæì¶S™¿ËlñÁÕYW3Ë‹öÌøÊŒì‹-ç~ŸUöÇÝé—Ó–p½öÔ]BõZ+õh9í+ñÏ78Ýš~²ô¹ºÍ»ouýg¦öÝõÌM˲îønΡ‰{îºRçð·ù€™šÈ¡åBhˆ¾Å©ÐC×ÞWv¹=¼c‚©æCqEéö<D`£À·Pà\0í½=ŒTøƒ)ÜKûË!v°ülö|yLü.{L 'z}bC‰æÁO`FxÊ+Ÿ³|óÞû‡8à";Ü™áþBH[6¢­ ©kCúúmö>n—ß6µ&/½È”¡ÅOi¼¡à+΀³Â[®‚U‰UiCº=·__ÉúîP}5%=ôbÄ<ÖFψçYÐá—"¡˜/{wð«y½M¼úH·÷‡ß„zýÞ~DÔ@=Ò#ODêç)Z¯h~ž”.áŸJÑ{8ý2œhH°Uð^T2¼EGÏDÆßUU*ûÚg÷ïgë9Üë“Tç˜æA#¯ïöz`Î…öY÷Á¤ Ç4p5)|Þ×ëÒû(t€«½úüV¡á.è_Ûƒ™)ÚqOqu€áû ¹}Ï‘^D™æÁ”gÒ£G8m;ÞVf Ý£Yo ~â‰Üc﮺G9$ZsO¢DÍ=Šæ5÷Dm}4E¸Ç2œæÍ84÷Aû=Æ¡¸¹¹èÝ …'¦ò¼ ¯Ñ*…±íe^\¾½³lCÚmxHØ”7ö©‚™?g¾@ßÜ»ƒöNQ:z˜:}Ô±4ï ’å0«ì¿ÚÃÿœâÿMÊ¥ÿZÃÿœâMÎ…IíáNñ&åR­ÿÚÃÿœÿ¤\ªñ¯=ü¿)þϤ\ªý¿öð§Æ?)—jükÿsŠÿ3)—jÿ¯=üÏ©ñOÊ¥Zÿµ‡ÿ9Åÿ—”Kµþkÿsjü“r©ÆÿZò?£÷¿òÿ’yiÆŸôjæÞ.ûܸèÿŒßÿÓ”@ñ,>þ K±bêý2®ZÆÿGs¬ÍA³)À`Š0E˜"L¦S€)À`Š0E˜"L¦S€)ÀÿdÀ(d’¦$›$Jÿ_(9ÑaãÅQïàQ1ôlE)Z„_Vã LŒ8ƒ3ΜC´I™0it:Hqk%,Ʀá$ =ÇÖkÀÒ5M›ƒÄÐ  D©h~j˜8ŠUœ?–™sP¥*  ÎAbô ÉáÎÓ]8åt‡EsÓ]äõø“ÉLƒ4aµEŒ6èÚ’ä }0ö „³ä /PÂir ãú‰Ÿ'Õ…±úX%ÊA5b,>‰§±A2pzŸš‘1þÔ,W’‡Ñÿ$‚,ÕŠ1þÔ [’CYcþ„uð³O¼|9¨&Œ¼çZæ(ø-á‘@`Àƒz8àÅÍoIÛ]\‰6¡»ÇSå)uÃÿ&Œç2 6lO˜aQ˜„°[aÂV ¬l}^o«¢ŒI·9Š&ØŠNµbhGwÍ?È"ÿ,»1ëà”=‹fØY ·¦œ4˜ÍS¸ù¬àºXÅ!†gB­F´Öð]¬J=¿IÝ0e8^ÓJäT×bŒ5¬„ (šF½P1ãg¡Å7ÿÈ„ÆìÿQÅ)ZÏ5ÒÜš%š8õÉaé± j•æÎ · Ø2¾±›TèÌ([ÕSeá°[Ô‹#?!`A9×sÜd7=.Ãø%­pµQfЉ˜ÙŒ¯ç¨§Ò†WNàî®Êಬ G׸I¤0Ê™Ó_d9ÎX¶k¤Vã‘¥•Sª§è ¶üXìã„m—T5ÅãZ«Vim®jÚ¡œYr… '¢3´&ab§-ѵevÒ‚ŠZ>Fi)ì§ ¯šgËcª¥NpI±[%XCN5]»—ŽôÀ—)®rsùH~:ÔZƒ™Ml–M€ÛÓ¥¡Ã ŒEPÈæÍ‹‘@–wØ8`Ä2˜Ê0]Ø©yŽŠð€Òˆ Ýas6N m’€ }«,¡L¨$F:. çG{ hHõ‰BCÅ*ü?´•ƒÑ¬¬(ÅïrÀdu¹èjA–ƒpKÃ#  ‹¡^ ·?ì¿/+Šqd:HŒ¸xIÑᎠ0qjUÎ&ÔX^Rö ,Z¤qÿªú9P ¬*«PÍfuB"ü=Q|‰`Eþ&(‘™`ýŒATS¹, ÉêewB5ˆøH&)¿œÛŒ (ç6,ZŸÛ¸‹PÛ@! 9]g¶Öä€Bz2Ö¼VTædÔÍ»Hð8œ ÊÀ]ÄçƒB2$UΩ„¥„Bµc^AÍÛ˜lbmLŽöK!”‘ƒ7 ¥É TBäð ¶)¨8hv-·29…•É2,§PºŽ¡â·2»ËéÒZ™YîQî$½`7%Ük\°îµPÃfƒãxÉqS¢Ãœâý˜º[­Ú‰‘¯Æ´ ‘öÖTXŒýìdø‡è]@õ¯0ÍZG ‚°¶¨~‘×Öïö”y«'€ÐU˜EL”iuÞ4( ª(Ú©Rš§5Õé¾q W¨Ô9æèÁcxŠÑƒE“£Çê…§À)˜XÓÍc©CëŨ\u(Ý@¢>ÖÍ*Já™nªoF¡:$•é‘&1…d`3ÕF’°l7 œQå¼ Í†Œ²±#1T¢níœrô»»\°“bÁ®¤."×ÎÖ|Â"$‡Q užì¯ªøÍ¡¤X‹T1,dq4!ÉiULi«6êÓëI¢X ‹ÓS*WGwWTÍ1=^´¤œ ý!±þ|PÎ,Bp¦± ‘W˜Ó6su†Lå䫯ۥi[ ­©jm 1ÖÍ«¦Œ‰ækgᣠš¥¥êPeÑǺ‰ž±àq–= è\D @óÀûáx*øJˆÏc¨ÍQA˜uˆÈεì'L鈩= 0gýÀø˜ÝÅ+< އ\ô\œÿ§Ìî9­ÿ“S•4ÿ'Øp3Òñ‡:øh>OøEE1ßǺ(Ã# `A0d¿v§¿­éÈRŽéø õ¬¥ˆÑ¨,÷9‰‘á0-þ¡J%ù”üöVT”€E™SáÔ ÕÛPHOåh'™87 4Qû†ŠèûÖÁ|†°1¢ÜÍ£ÈPæ7@\m´AèL-"¸Î±£ZôÂ×´ÌîϬÂ6n’m`îb'zã=ÏŠ88ëëîr)¶f]P:ºýÇ:4 7Æ*$ÜŒPSu›GÂy‹H8ÏŠdµaüË9B­#Ý­‹"¥â(do?ŒïÈõTh;8ê";”ÖmÔQ8ÙÛS: b‘(Ÿ},›Q¢Á“c9§H ˆ„ç¾# vyìƒßÕ˜/¤1!+…a–ÀxŽ¡nÁÖˆFœ ÎIÔû"T9«‚¿ö¾ÕŽA‹5óŽÉQÃ…½]¾êE )÷ŸØíÂa=xô4­X³˜äò¨ÚJX51ŒC|ð¸‰ÉizÆáà^¨öd"ˆ˜T.·TpìžÔ¬ØÇíM5R æ¸åŠ˜á®&TèBXÕNB îÂj`D‚SãDb~¤hÕ¦«eÕî:J;ô†Çh.˜—èHc©,"E+cöšAH…ö[ô" ¤B€è ž9mã$Þ&ˆòW-# C2pn[:Z¢~$XÌîH†è€OB›ƒuÒ Êî¢Ê´HFÙãO /Zü'ãCí õ¨ƒãa)Ôƒ°!ÀWÅ8ÎÅ'BXœçh%Ì`Š à ö¡h¡»\•]Â9eŸÀ¢µCÃ(q*.\?jdˆŠØà ´^+Ôÿ3†CâEüh»ìq–€ùë$·Ò SÚÞXÕ<~Ø]†³?–=YcJ?ìW±¿ª²Òë 5 ¡+ä^šÁG&—ÅǃmEöŠG9ý# »Võ:Mi{ª‡_ÁZ2ø4rÉfE&B8Mk{9Z½.Ö8FJ1Jä-2¡ ä:\²t7ÖÁ(7X´¾à¡yÚý®Iñ4q0Ø>ˆ”Óýjƒr¼n,¨Žv få3¡"g-0ÕÁ&†­Õ…AaÙpe络Ú¡æ–¶Öò…è#qH<†¢e£'AfÀg IÚåƒoS%%QŸ[«+M§¥¦ä`¸’ƒ´a#z’t©ôû‡É ø“ãõrÒÐE7?Qi(àGÈÒ0ü+8؇{+\Yr!\Dß! $i¥i¤cXW®LZF‚âQE®ôz9=® ì1£KÈG°)ÜÒqõ½ET­ â ­–áNO¹Œ¦Xõà²Ø+J÷a¬7i‰ªãX¼.3ªIªy$G}Š2øðž¥ŒúcüPˆ}Î’¬’útepðãaO48$5Ü…¦VPœ¹¨7½ÝÌ Ùz[…•é ,ظUÑ®Fò¤®Óí±Â÷Mt»*3ìv’¼Dv;Å”!w»IUªÕí¥÷PÝ×xü‘¨·ãˆJ¯@A›©5÷‰?”b…Vz4Ú‘øs^éèUh¥Ç˜XŠ#ùÑê*%0ªÈ>¯A4f P¥hªd•çz¸šÞ&2ï‘»¥„*QW³,J¿'AB&Ú:TDL#S@Uòˆ~)n¨RR@•¾]€kŸ‚§½,œ0.±» ãAÎ@ép—·%püK‹<…Êt°¼8*¦Ycy°ü˜4ŠaD†M³Q5ÖjÅUs›-­Üë-kø=ÙçO†BɽJ\ŽŠãKËe Ç8i°#ò%e¬‹+)¡]òµÖ/uÕìßú¯t•UC†ñú§Y‘æÑúçYŠh¬–J­ÿä\wõËÊéDwfÓïúÛéY¯¦ó6Êæ-‘Þµ«ý!ÙS-p'Ïžã®È>›=Ε,`V¹änÝ 9";G¥YðuF‘ÿàŸÎ_ðáÎã_þÜ€‰uÇ-ãoÏuyôÐö]ö¼qÌÑçîý¯åppÓåõMn¼þóÿÚÐöº–¹s柗¶Í>r¦dóêËÛß”ÇÙ^ìð ýï–Å ¼7tá¡Î?îùúÛµ“™P¸½cß—>÷rçÉí÷È —/Z´~ƞɽ^*Οµï¤ýÇï÷ï»°òÄâ´ ß>2ë§o/û~:ÝkñÊ#[fOÜ¿©pÇÆ‚¯¶,êü뺟ûÌÉX²l錽Âì·ìgö8>­ëÒS=\oÍê½aãC WìœßeïÙ6ö¾ýjÇAÍ/œºÿ£F³W­pÊÿ}ÛAö5÷gÜ×ïîiù+75>~aó¬_7]þjøy?»by¿­ o«rÑdDá–­Ë>«\rÇß›þÌëí¦öûeÕâ{û[¶»ì•õ#ÆÌ;ÚeÊ{{éM=ùàìN³&´¸ÚºÅÅÕ“ûÚÚ4¸ãÆæõ·kØ²Š ƒoߺkÒ§Ò_nŸî(ؼñpÃã JÛíÇíõ3ZLì”–æ®-¬÷ÆæÝç6=wg¦ô`Vz×O–¶êQgÁçîù¬ñÎÙMz}·ð¡{g×m;½ï‰· ´dWµJ;}{yù„1\åo¹Ð«ë3^=xâö¥V·Í*ÝÖä­´Ã]¶Ot`à#7]ªXU'cÛË÷ÏëõÅ¢K[6üqGy§#íï\êÉ68¸úýV›?}@›§®Ý¾G8 ]ßQ=æíxxÿ%/½¿Á̉¯ÝÁù—-«Ú:³õ#ûúdf|hÕÂf{ÿùÄÙO61þñŽhzb£¯øSç7ën:úêóod4úà”<ôŽ“­÷ÛÜS¦„) ïyaóðé+Ç_8ÖáÒOÚλ§õɽòs^þúzãzÏY8®ð£‘ÇÓß½sܹÂêeÿð]l[ôóS¼œ×ü´ãé[¾pnÀº3¹¦º¯»oEÃfg~º”õM³n.l›ÜøÙ‚ý§Ýµ2qÓ3²†Õ}òË/›¾}àØÁ‚¼õ߸Ÿ~ìæÉSƬÏu¼i±<~èÀìŒæÞœ%¯ðÃN[vî6ßqì«>s g¿]¼þ—œÛN¾7kQóNõæ~¾{ñþ¼Šó•gÓìÊ®å{Ÿx4¯ù¬Ï¾÷ì$¾qƒó-~-}ô©;×”Ôm¼hòŽÃcgÍ÷x3róÓïkÓ¨c·¥çÚ[°Î5t¯¼¸OÑ©ú]ßæá¡Ë§­›$-˜Ûq]ûZÌ©ûäôe_¶²Oê7¸gëü7 xײ¿¬x¥uú˜+·ì–Ùß¾óΤыÖyvÍÄ‹7d7zrPZçÙ÷ »ã¶óæ,ø¸êrK/Ý|zîøŽ·ßùññl‡VLœO›“9¸ãùÏ›4¿ôIöo~ø_ö®ªíûK÷F£P’ 9)%3gÞ^==óŒJ…4fFc†yx$JÜžÒë*néA©ÐC¢B¨ë !%E(=Õâ¿ÏLÔŒ›îÿ~þÿ>Ÿ¿ý1ÎÌÚ{¯õ]{í³Ï>g­½K÷?«-§ïHÌ©Úñ£åèxC¹ÂŠºtlËÉ™«Ë"b´œÏU<—ÙãEbž”?1÷Jç8àœþ¢=~ aµ·_Θ ÝsߣÚÓ©¹af¬ÖnÏ€¤« °;+‹ùgcÙÂ[­[ÝU/R™ÓYxñfËóuíãdïKw'ž[LX³æÄæL“ i ìÙâ/Æe™gó“V‡ŽžU4qì.™wòn&]v]d•TCþÄâhEû¶‹Ì6+J2Ÿ§Š·:“_0ªxãaµ­eX¹Q¥ ^>E°ëÜÚÞ#×&UcÚ£¢Ÿ8ÎË*(.žé$MstçšÆ ûyÁÊNøS ·Õ4ÃÎÚ¹W)MNx~:²Ç~‘JU܉–çðö‘gyÖ–­’ú³:ßîLWšËÇ»{˜¹f-üö½q„¡ùÓ*8…â%}·Kc²6ǶúS{*߯lCi™K|WÝ•¹†'©„$¢ÆWÛ»DªÒ])Ñß^ްÿw¥$¶…¡ù~Œ^güÈUÇö-¹²Ø`óÌí&É vÎX³‡ î>´‰S,š¼vÉ´Ø7åÉ­ï~±|æddÿþ$ûèŽÔªg1Éo£dH£TÏ»5‘9¡»1¨”œKóÁt®n»]Z™º7AïŒJ±“iĘõ7^ë©EÒØnì”=á´üæEí‚Rm¶Í‡jçolTóíú0¨ÂÉå÷çQ~¿]¯¥e\Kü5e«!_Mûüë–ÀŠ­ÅÎ|ùºG Î޽L¢¼+…?/N·fÐ]}šUÎñ8%÷WƒÀóÌš9™–ÍkÕ—£¹ìÚûÉm´[⯉‡.*î¯*ÓU"¯W¡ª¾zxò)-»~¿mcZÏl†vˆWƒ}a=⦷=åÁÛ0ê5õΫ?Fwoy·_œè¸$I=cçI×Y»š>¯^]PqJý¢]öÚŒûåÿù*[àëõdåªoùönÅÂû¸K~ê™ÉZ\É ÕÜ+³zžû¯ž¢)mWô‘êq1Ò»™öá<ÔòG„—É¥žÊªñ£­_˜[ó–Y'^x)SëKö–ßx§†qAû¡&å]IFMþ²†L゚Òs¡·î¼›Õúvlóäm¥OÍeWO[ÌL.¸×}ê¦Z™çˉÝ|Rzl—Ÿ`úæC]Í7³ÔS§›"[r4$=0e×ê6ÆC­ª£×~¸W’$óaGWH&!MÇ®ó9l²øœ íqA¶t‡à|BðE’[LÇŽ˜tc§S—¼zZÌü5l^Y»Û†Zî}`2*5t.û á³£áóT9Îë÷Êrº¶y^ a¼{æž´Ó¯Û×¾®)tØéß°î~í¶õمϪÜ-V¤4=Ž·ojj¹ü¾YAq†½šµ¶ÕŒÛ;Ç­]yú²Ê”U!Ír+ßo*òiNV9”°ÿ©8Ô¯bR˜óÛóû _WÞÙ2Jÿ°´õ´;óúØ keÎÖû­#Ǹ|fÓ"“²ƒ£Û3þP”R•¶µ0ÜäÓÄ´ÌWJlSyUŠScð÷½zcç°ý9óÇ¿Ð/Ý¡"ˆÁ\ýÓëye‘9ñš:+áhGú¡È«Nvã!Ù¥#m¢ŽûXü1éÒLµñ¹<ý½ü¡¤˜ûˆÈGé€ûA×á×M#dq¿)Ó5ë]ÏÈêŠ'Uÿ#¯„yìÆ¯ûpƒo´½$ý9 ý=±¡[/×i›æÚ<|•±kªuEô©œ}ŽcI{iK»~ó©ÑkvNºÝ¾_®±õ­IYó¬â´š œW‰£æÕìíÔÉÉo–©>+'+eêÙ°9nÛ58þ¡sé]½Å&)Ó#½\“f}|·Mp¤,§×5¤I—ß1Éd¾ÔaÁmîÓÑ.=²™á}ó4Ï|ý”òUŸˆEÇæžÈ¦›ªêtdt̽Èð(cVnM½tߌ´fy¤ÓøÀD%,%6ñâçìûw¦>n•;h4ÿÆÊ ûe‹mƸòßbQz—cœQÿ2O÷–| ¾Â::eJA‰G.´—©” >ÇÛ-^”i[7âÞÅìbbå¸Ñ. ÞqÙǽޔM*1üж?ñ7Ótê£ÙE‹S;vYà.4ŒÛ1'm±Ë㯂ÒúEÓç+‡ã‹ën]slJÒtð,¿È{ø”왦Rˆuušö,’úLÚþ„ÈíÕü|)»§ÕÛFÔù"3GiµwV¨v­TŽŒm~ƒá©nIIë½2;W_Æ;YÏe¢®“a¡rÇqï§7ù”kûåj§_,e¥\ÊÙº·Ò§ÁõÊýÙ…g™k56ΫR¶³ -)\ù6sßq¦½áÃåÇýNU¿º4&Þ$²^u€¦8/¡-]açæ+ìË,:jŸÈæ7ÝžRZ8>‡z~vnVÄÒWõ|Ò#^íÖ®¼¨s¤Å~uoÐûSœÉ,”=¢×K©÷ß;6Áô²·%ñ÷£'–¾ñ€|Uíêe;}5ÖIG\Ãn»N혰Ç|‹á4VŸqá´„ŽŒ¹Ì“a¯ßcBëª!5~né½z¶Qþ‰g–ûªæ’î猙{/^KÇOKS‚Rà®ü=Ñgìä£Z/h<°‘ªc̺$›r/49WË7iUl°2·ØÔ“3¦-Vs9”»–½¢=3Ëòr×>íW¿¶*=UîR—v#PŽ2Çò}'/eáºF.õMÏd,É«¬¾Ì{ŸË²'Ø8R”JÍwu,\ýÐüè´­õòÎ3e&ÁKÒÓçªXÉóŠˆOl÷Œ=oÒܾI×pcQ½Œ~Z=7 '|ñ}9®ÁùÐÎ8ÇIažë-»6M˜»dz¹acFxbü˜ƒ…çd¢Õ&žþôhÕ¡æšô‡r†]K3ñ yêH#Í“×Më³Íâ4&™Ê*¨«‡µEñ®ëk×NR5g¾Š½_îñòeÑuë[¶(Ô⧘ì‹VÃÚ:±ºaOû%ç”22Ö«)ETe}4Jžª·£.+`‹y£mGL]ÕŠ êÒjÎéq·OÖ8ìü¸+›£a3åHº}äÅà—Å5#ßšÇõ&h…ëWõ&º{\‹Õ¯s«®ÌèÝû(Q}n„tç 7ÙOÚu†ÇöJóöh¹m¾.Ÿâjh™¥÷~…÷Ç?u›Ž-Û°/sÁê™UÊuk–4µF̨gÄ·qC0YTÅœª w¸wÄ€Ût,ú"i>ÏÅ@H€q¢,:àE‘0˜(: ݰè›Ñ•P©ÕÅýŠABÍ ¡j<kÍd𠌈„nÈÁßT…ÅÛ¡ñi,ŽW ‚„(ŠDök‹ÁÚ;ØBðœ9_ H*ùÒ #&Ñ÷-ah³¾X&a(ø=ÔZêh¥3ƒcDOÁ7›ÎD¿Š‚–0X'´Ú¼_—„qKýp„Íü}<X:KÀÐe5ƒ"ú'ïBþ!x04h„ >D"øàáAÑüðy?„‚ º†DodÈ_^ñC „Á€ $ˆJ‚DûdQEòÏöû!ÉÑB Å€áIhMëàpþÁáb! †Åt\4Œ]t3ø5Î#ˆ‡ü#E8&8~3¤|3F8R1Tñ\ê×Ì4‚ŽXK„€ð™tšH;”öU2J‚¿Öÿ¦»‚á—! #\3'È›Ããóè\¦¢êÃ$ „0æ„Éa›‚áIÇÔƒq8"ž  oËa|/KX•ÃÕapøPÂå¡Q•x}<äªc ¾9!~à…ðCø#CK—,„ð8 uÃcç øÞ ¦«Žð¶«.dCãò} “ÏBt,tû[1ˆ‹xbÐÀL¿ç ‘I$ÐÓ=¡/4"Ra»ÎDœ$ˆ†3JЀ*I‡ö%Érð€rD<‰2@.HX΀:€†Ž[’4u  ?€F% Ô‡PŽÒðÔøHøÿ‹_]Ë\ ®ÐT\ç…W_‹†Ö@¢K0ÖÊrÑIÝ‹XjOˆ{Þ0®û|zò[Ý7ŒðÑ;Ë”D†ñÿÞC/îÿñ@°ÿÓ)‘ÿ‡B"}ßÿ‹úA7#“q‚&ûIAÿó¿NÿÏý?ö÷üiìO¶ÿP$qûƒ âÿ‚Œeü°ý‡"IØßã§±?aØþC‘$ìOÿiìO¶ÿP$ û3~ûÏÿ†$IØÿç™ÿÏÿ†$IØÿç™ÿS†í?IÜþŒŸgþ?<ÿ’$aÿŸgþ?<ÿ’$aÿŸgþ?<ÿ’$aÿÿËù¿0þŸD! íO‚‡í?i€ý:T™,¤ß•éîNç°X}Ë@¿Ô"¨¿¿þO$c‹ÙOÇáõC‘´¦98ÍžÏàx ³ñú8Œ–ÖG¤!$é‰Ô© jš£µDNH‘]XŠú !‹¯+Ku@gc3Ðò 86ºoÙN!D ¡è¢o"Ù@´Á ‹kÑòè²Z.‡ÅñÂ`M9|St­-.ZtË@<1}DÑ\ –‡ð~64>“ C!áN2X36ƒJ]†ÐšžD†h\.-XÈ’ÈÅa0VNö"}Yº] òB‘ph,ÈOÐÿƒg †À"àÈv¾Yÿ/ü¢Ñ|¤Ÿ‚G7Óaré_OÔO&2ƒ‰p“×OÄ"8¾Ö& í'Ïd1¾¡@Ø…t„Ád±h}4À0ƒl‹5ìÌ$aÀ†™ À°çÔ¶ú~ŒÕ~@W+1~@Y*Y tì 1! u³û‹ö^×—Æfx°ú+¶4±ŠD -m :"K“KBh_kÝibX‰í[ºDƒ“D  @@B G$!€PDL(è‡X¦8?“ù7üæ~@O¦?2À s94~? f‹u$2€Æ“I|8e’ޤL2З#.èÀ“@(8>qRUU &ÝÁ0‚` ÂFÙ;pFÉó%ySòŒYÉ‘ÁüåŠE•H™X†¤™xîBP)´Âµ.›¶øj"Z‚’‘YD üŒrœ!\ª6ÒoºDÔ#¼„*•©Á¯I/B0êŒd+ Á¦¢¤‹È°‚¸pêÁTËYðŒÂµ_-†'8Œv÷ÀĽ‘¤7ÒãF¶ &À #>n\ÃÌYRœ±J8/•ø£3¶`Ñ ?Iùër3ˆÄ,N·Å¼.ã™QIª.Él*{´ª§š"uÔ\Õ®G“¼jÓŸæ“—®Ù}ªñ‡F&Û¨põ¸b²3šlöåËÅBÁ×W ©úŒäVè$©–È«˜"v³Ö¤»ݼÇôÿcøØHUüÔoEcx¬Ç÷åY6ŽFäÈ[yŒuUP{p>3ô[Ø"oÍ¡r“p4d^‚=Ú,Ô %°¡ƒñŸ3„ïƒ#c]ìÌ_0¨…ã¥[9è‚•{j½bZ¸éBØ)=‰”íZURÁ«$f€»ÉaHøü(Z®Åo³³rÍš•Ž´deÿJbJYJt ø ›è4hpxŸV2h&©’6U„å§²„ZÛÄ—P­ˆnQš}|q¹[µfÍjØ‘4²j‚:Œ²õ÷7ÉÆ¤ÌÈEÆ/ú€UÑ~öß%ñ¯v„†Á€Ö,öV}Ñ |£Úâxk‚}g”è!ñXœ8*=*Ô±¢^eMÛqýæ ,†f¿Áj€ñ[[g‚ˆâ=²8SÎÁ«;P¼âù@ { Dç«a CDŒºÑˆ72 ‚q3Èä…53 ,žØCÄHcØbßM󂜧9Hâô…z’Gzß°`tn˜\üŸßÓ»lÌéD¾ý¼ʸ =>çå5½‡4õžäÊ":Q:p5À—'Íý+ÍÎÿÝ,-n'|˜ð¼{Í dV︦Á¬ð=ù`PÙ“Ÿ¡­Ç¼(ÓNë8Såš·f/Þè|¨ŸÍÇ¥Ž!±· CRͧî"2Ô(êg(Õ„Ÿ¬Ç±ëâ0hÅ3Üà©Q®¿ˆ¨ô°ÃÆáD“Œ8ª¿–“Rão GåÅóA:ûewÆQuˆÎšpT.:Ѩ7v€þ‹ÑØ,ú7†ß)‰M7EÔEÝ} ׳î&Ø—xÜÛoŒÎ½¡Dщ•ßÕ¢L Vn^þë0õ±6ÑïQÑ`CÒ .ÿ¦9gçĨ¯sâ|ü$Fƒ¾£Èë î”s@”Gƒþ¨ê¶ÃFì-òF8}¾¬u b]àŽ×Èhš÷. :´jñ.<·6w °Ÿ1æ…‚ý5î*4ŒÅRŒíå Ǹš¨©Ìž(K;`o51ï®c_‰‹`>ÅcÑßÕ²a9m¼«m†ó|«¶5ÞW)ñ¨»Óð>:Q_ì@¶µEhl¶mM$qÞn4ª‹¾¯yI‰sèD‰z{ŸŸþëüšIÓh“-©‘ÏS¿˜‹M;_&¤y¹óE6›zìuÆÿ ïS~i4P¸â,Ž{ÛˆÇÙÏ— ™<;ê|8m|ˆ¤%k²˜ÍÒFÿ|÷0æ"%j»š¨sù&z½¨4ÙõÅ€‡àöcÏçtØaj–b5º;˜köæä®ñ=²ás>ì°‘£%þeØB9q©6R‡|xã$æ'Ñ…'ÑÞˆÇrˆöˆŒ˜Š±ã"'þ&<'ÑY¼±}¬¼o,èýßyº˜ýý߈ãÿ½ÿ‹¥ðý_üè¼ÿÛ‚ %SÉÞD2’I‰1›‰&’ÑD*‘&“±H2‰ÔüuÂÁ Zÿót1ÇúG’ɺ÷ÿ;ë¿5aqü?<¿eëõÏEþàâýß¹çÉk:ëퟸxÒÖìÎ?ñG×~{tú×öÆg“¡GîùñQï½²T{÷¨ê¹ƒ=—}ùÓ?}÷Žñm…c·iO¯|ïÒÏO?>öÞ!ûCÃÑ_îýÅ[»/Ø¿oû×÷Ë7KË>ñð’ÿ¸eå­¼<ú½K_¸þþ—z¿kË•Õ×ÎêyéÁÓ‡—þzåð?ï}uâû–Oõ—K®ÏþÉ »ž~íÇñS']}ØÀ¹Çühà/×^¾?±äëïÒš ›®xü¿®¼áð#ö>:â“/{Ú}?ýÌ]ÜýëÛÿuðµ¶ýã9§l{ôäWŸëûîŽ îxt_^>{ÓÏħ6¯ºnb×UWîºëºÍ=YqÏÄi¡«Nýß×oØwý)üKd û›çzFþì ©âÒ>pô¯î^ûõCûN¹æ¼Ò¾³GN¼äs­¾Ã7rèiÞµmôæoeþý™c³ÿðÝãCߊ›»Ÿºíþßݳíñ3¿}ø‚ßÜrßk¼ø‘Ãú7å&ãïO/ùÕù÷^}þ³o\»ôs‡]–©Î ¯wÍÄ-ï‹_ò‡Êgîü«=Gž´åoÞŸ\¾çæ³{þükKöŒÛÔÓ|ðÆç–ì½*–¸aïñËŽžyâ„£7ݘ:c™ô³'_ß·ý&ú›îúÓíûÞ'Ü;±ûÍÞJíÞßüò×vpÄýo¾÷Î'_¼æìCú®S¯™'}á黎>úaááoì<ûo~ÿÖÝO=rÿÒ#§ö_~韻ü'Òþ—¿ðäν='ùÁðõ“çßX¶nýòã—\­•R¿½´û±ßóúCû?•½îî=G?óÁ±÷þÏ÷¯šxíîWþî­®òéwl¿ù¦Û¾ôlä½—O\¿yëqß=îÕÆ—*‘wö|úùŸŸùŸ|ãοîûÎ1ÏÇÞ9~ð‡ï-iŠÙšì‰|ÈVþÂÁâ ¶Š^ÄÖèlˆ­+8Ös-(Æè>tVüÈù|×´@,Ö8ûAÞÿƒÝ9æèÜW„‹µ˜¥o²]Á,£‰¦`–ÑD‹Á,c³€Y2¿<Åhbàc¤7YRIõÔ•mfIÕ—#©:°H˜ëõùÄz L}ái±Þú²ñ¨‡V4›hòîmË.z1òƒ=ûíŸüRy‹®®§€&ÅTT츂ü˜…€ýß>ø?ü—–„€üÛÿ²uäß‚à—?müŸþKKB@þ%þÞ8&SÉ8_ÿü§–„:ùktfÇSÉïØ‘-æ•=¹nH\X(àYîÿb±Xíþ/ŽébJDüŸÎýßÁé ‚)jUêd_­i“²÷f01½#ÝÉø‘en6ž|É(ÍR¼UÒìׄ•fs©šf¿rg !ײ¶aÝÕªPÆs”d± E˨E™šD"ìøÍ~ƒƒINÒdUѦúÒÉïvUú©V€’îrié.Fí&‚PI[IŸl7EÒøkÿ ÒË*Õ1)Ýufxª‘ª¬µ¦%ê;„Ÿø&õWbàmG°¬ ÙÅdZ€“1H¡Ì«Â¨Ñ¸ö¥Ù×£•¬2U4huâÌí‚MÉPüA ‘JÓt:¯ËTHÛl±:•Œ9Á¾F==–ê)XÛ+rOXN53:ŒÎ¨P°T«#v«ÀøxN1mVñûR“Ì@ý9&m“ÈŠÓN-èL'挑…e1ç¢t&*&XgâaY’uÆvî¥Í⤽VN©¬Ã©GͪÃÍ:=_2ÖEóp:²ODàSù§l îMŠiUÓf^RUV{Xç.“ÆŸ÷29ÄÎð•÷\foß*ë©…w 2YOù…[¼PíŽ#öPNð{£¾íx]D¶Pë‹T%Ë×,Oç š­äaKïS!m†%­eÚ¼›_ÓƒS´[£V•­Ä9s-ï_NØ8Ùí×3s¿óêÛéçÈŠWh}ÛñÍ“-‚8)yüᡬà‹“EÄ'P4˜ý”äô.É"ŠEfg`’âoò²EõT9É–¡ñ3‡7“s¶’-££çŒo= rÂ0A*¦¼%_P¨vA4 \–œ½atÝ™`phÓÐøV\ƒ‡ÆÏÙ06F6’220:>´nó¦Q2²ytdxlC7w–$û‰¢Ã¼dP¢*°^Lh! ˜ƒcë9¢ƒ“ÔMÆ(eì¬Ó eœ£Þ©$3®Yò0è8PÅ#Cµ!Á»E>Å` x}X¬Ï¼ÙýQï®íö_ûà?vðŸ[òoü÷Îý_KB@þmsÿÛ¹ÿkMÈ¿}î;ø¯- ~ùgÛçþ·ƒÿÜ’ûà¿wì¿–„€üÛÇþïØ- ù·ýß±ÿZòoû¿cÿµ$äß>öÇÿgK‚GþâÁ=†/ÿhLì¼ÿÑ’à“¿‰´Çú&Sû¯%! ÿƒ¢@þ©HÇþkIÈ?Ú6òïØ- ùÇÚFþû¯%! ÿxÛÈ¿óþgKB@þ‰¶‘ÇþoIÈ?Ù6òï|ÿÓ’ªmäßùþ§%! ÿž¶‘çüß’o»È_ìœÿ[üòÛåþ¯sÿÓ¢ûÜÿuîZòoŸû¿ÎýOKB@þísÿ×¹ÿiIÈ¿}îÿ:÷?- ù·Ïý_çþ§%! ÿö¹ÿëÜÿ´$äß>÷ûŸ–„€üÛæþ¯sÿÓšûÜÿuÎÿ- ~ùGÛçþ¯#ÿ–„€üÛçþ¯sÿÓ’ûÜÿuîZòÿ(ïÿþ[2áïwîZêäßÜ|Œj¦n VŽŠåøÿ …y ¸9þ_ ÿ<þ?˜ÿPü¿V„'Œu Èú$íŠvG„+lìö>oŸ»}5”܈¥8n;‡mG×VÛÞGΨù¶Z“M“1ÿ ^ÔdE›ÔK}$–À?±W$‰ž^î kžÏ£»}{a~Ï1tUŸÂëuk=ºú‚ƹÏ/™f‡Èý a“ZÅÂ&D=IE`Þ9ôŒŽ­žG3ÐMM$ B_•Y$„¡±a^ƒ“DÐWs‚LQ ZÔ˜–TR(ºÏ‚à¯B D.H,’$á nL„˜”)ZÔ¥DÑA©bdŠù¬JK.9dY¡5Ó%F€+pºV:t çb@°U®eI‘𺠕U•šllð±² o¨gÑä7Ù >6D`cÈ_t{¨A}ÀÌP]}Ð×!_}1 lfƒiÞêk$ ú›æfꧨ‘—4yRu Æ¡·’¯`z+Õs‡f¥`³qhDª•„¾K>^ãÀ–äA˜È<,P `Ö³€§AÐ(õ5 ó0¬øë6•õ3J]}ÐOÅW_Z3†.Y.8Ö|) ¬é¾6“P^ßfXуm&¡¿º¿Mèƒîk!\è&ìC9—¥Š~™Åú6SÀJ1Øf úPôµ™‚6Ëþú`€ÊNABaè:‹@(Â4 ¢oJô„DíUJöZ˜­µñ€u⿬¢ÉYôí‚•{Tò¸(t²W n†ŒJ‡Öô©VHA/°U¢d©jR·Laï$Uu ®j j1¦Ùì)誆ñ€¾ !MÑ(²(TYÆð¸’§fר«‡xúæI²$UÉ4IÔUy–¤&e]&ÍSº†'UåÂ"%GöýÉÍ*Y§ ~3zÓÆô†M{›TQ©dX:Û›ªdRá"œíÎq%ÔǼ€Â~ÆS§•/¢o!œÑuCîBñue¥¼¢–‰O~Œ øO*ªÖ¹XMlªÖ×éÎâbf$•òl†‡´é1$m”ØT»#¼:`uË ‹"„“_$´”ÁÉ?M‚…x”bY)ÿXp´HjE—ž°6&¶C÷¡ tñd #²½$Ð ˜³l6-ª[/*6*šl@lV•¢Mƒ©„Ñ7©Ø.GÙò"aîD´ŽšÓgH×¹—î­s'X…D}îL}­r'ãÇK,j ÉÚ^uTY‘¦tMRM?Óõ]6,µŠ,óØJ„°ëTÊ@ZΜä1o½®‡×Yò°y=W&M/ØYµÿ¼œ†™^Eß«¤ZA²“°˜)„ÂüÁ3ÛÂ;½Å)¡7Yîo—Óìâ"™²pN‡˜ËYø ÕV°Í4)Ñw”í\b«Ò«V3”cà«ÎL›<ºêT›¾3@O¯æ Øã6„{€oe°eÆšŽÜUŠýBµ•ê°Uu¤)Ò =<¥Á`ˆÝ+;iÛãðPrS-ÝÙ2`¨ô,e§ ÏfãŒ2ŸŠ’¼“ F¥yF“’[¡“¤Z>"¯b ˆØÍZ“îZtóFÓÿŽácûÊæ§~Û(Ãc½ÇÅF–£¹ãï¼b!Æ8|€Úƒó™¡ÏØÂyk•+˜„£!óìÑfÑ ¤ gÑ8Cn0þó`†ð}pd¬‹ù µp¼t+]°r`O­WL 7]C;¥g ‘²]«J*x•Ä p79ì1 ŸE˵ømvV®Y³’k¯ìï_IL)K‰®d .ïÓJÍ$UÒ¦Š°üT–Pk›øªÑm" R³/.w«Ö¬Y ;’FVMðO‡±@¶þþ&Ù˜”¹¹Èø%P°*ÚÏþ; $þÕî€0Ã0КÅö‘Ý@Gww÷.ØwFpäMÀQÖQéP¡Ž%ð*kÚŽë7×H`q754óè)Dº#Hòü_[g‚ˆâ=²8SNXñÿì=ixÅ•Á ɺÙ\@ŒC¶ 6HÍL÷Üò…,Éö,ØÖJ6—FˆÖt¦í™î¡§G²<+ | 1DzY®MXÇ’äKö°ø3áHâ\,ÇXn¾…/aóå`ñš$›}¯ºg¦»§ç°$·çÇÔòtÕ«zW¯^÷«Z¼ F1ïz½a‡ÙšæÙßÊÀwA[-+_\o1,x¼Q°|M=>¡ÊcÀúP]mˆ†$, ÃÈuƒ Aˆ–Ûîr÷4ws£Q˜åþ°@ðGÄ…j>>Bb0ß³lödþŠÅŒ_A(;bUËYeöËüUÁǸÌDÀ½pÅJ¨ AlbÀG“Ù,ƈ¨rØCrãîÑpƨdDW˜©ÒäB¢ó––ÉŽÁp »¡Â«F挫ú§"[ ÂXÐ !Þ([>>óÀ+ÄHÈs#À¨P}|‘“²(_Ÿ21'¶*Êà³5›ŽÂñú„I‡“°k?Õ302°á,Ì™.Ç t«V¡¢‚®=š*âL  ЩÝI°õ$¡AŸ?!ÍTÖ•uf,`-3>¶2cñ*ǧ÷Y9‰»Rn4싚\{4GWÿT5ç-ä^Ô"½ì×a$:·=0&ÇuPŠâBjÝ¡cŽb'öå‚=bëeì¸N€9 {<“„jŸn•·nìhÀ"\Èw¡-nHÛ8˜h“Ô; O.ô‡‚.ôW¦QØTÌ™öƒœHmŒºä]µØ ¶î8IÏŸ8è®ÌÇësQ]¼%½¾¹Îõ¹Ð¨ˆû¢CÉ‚»Jl]©†fÛ¢c{0÷>7JüÃV–QX{ˆóƒ# ‘1Ø7úת^5Ê6#¯],FØÝ寵õÄ¿u8aüéZ&I~)"º˜2Œ—âé¹l7Y½›ªÔ?SV¶sþ¾M›Êø¹îÉÊ+«ÉLyižð±¼+2Y,?òÖ§»¯z›¼…@Öhg/EëíÁ@¨ º«´ÔtÃ…¼€Yoá›Û/0à»õ2CŸ“M¢y=ÖÔ2…Í}*“†­ã¶Ö4&—¶ìé)sAÁÆ<¶Æo`¾¡ifÓ^팀ÔYv».Ƙy l‰5§Q°l“«¶¨užö—ÛtÚòB†tÅ‚‡Ï&l>›“žÕ¤¾K‹½Ž… -¦eÀ:¾ŒœŠ¿ºÒ÷£Q"D*>…c,37þ  czªÉH0ðñ¶W U!'Šê”ãYY½9²©‚ÖU Ä*À:©‚P缪¥ýRXp_Õ¶êrÖ«eÍà¦2)••Æà±üh{šË²¶Èt`€„-ó¶›T|]c0•üÆó?àµÎÿÆcóùDæíËQ!%* ­³$ÕÝü´¸L o'“o‘ÌP¼Ñ2…ò?Äë”]µÒ‹¶?Ñp£Õ•ÈC°¢¶BiÄuù¢;ô‰b:MÝþV×0æÞbÄá÷5à-à:«>’æÛš¼ ›Cˆ*º¬ÏÌ™4‡akê/«³ E2„¨ ºÃøöb¾””…T•”¹çV3X6N„ù'!>`±B3ƒñ ûvW `œ8PT>0N°ìàó# ®üµW)1ÞnÑð¢nÍ|…n¼yÅoò+Ùæ'ù<¶ÄUën^ÇNò&Í+þ''µ¢Õ8þR¨ÿ ñÿÃ‡Ãø/RLˆÄ#4‹E"b$OÓ`$–bñtx‚ÒxüpÓ×I‡6ÍküôMÆH 5ñ‘NüŸ'iùÐÀºÞä–?ôÖßÞÎá—>êÄ6nåJÿ™Æwr`6‘a?tŒzñ¯Ã¾2ö“DW¯F …Š9nÇMÏœó’úTà#»/ÿû¥OO¬˜zõ“Ž8zÑ{^8æÖ¯ß36ú/cû÷-}à×{ “·üîÉ#÷¼qã_vmÔþíñéï<¿Å-ÓŒ —÷à)¿üÅÿèï~ÿï{î¾fÙ Â5—¾òøÒ}×-yb啾»~óÑköýÍs¿ž½öÅÝ;÷=ÑóΫƒß|øÆÞwó/ûä[6}õè¯^Gô¾{ô®ŸæË~jÍ÷J?(|þoûøùƒ¡‹.~öcà/Ûÿá—¯=éå‹õ‡J‰?\}ÆÇÞõëïÿ»®ä÷g/Ý÷ÄoصûåŸ?ùñµ#Ü ¿ÜpãŸzúwü¿¸ª»ï‹¥Ý—Ä7|èÁü‹»¿[\qÄý§<ñ¹/Þ1qà¡®]3_ØÓý_?»çâÏ.ùð=áWùÑšoý¹«÷ž÷ç=7]¼ìæ¯\ýÀmGMN~ò²óŸ”Š?ÉîÌN¾üöí÷=»iñhäØGF¶ýõ³Ñ'|ö7?öã?ì×C#+V¾_K|iÉkš¶BKܶê[ç_xÆOîßôÁß<÷üªøW.¿æšå—­!7¿þSû6>ñâÐ;]ý®òmûö7¿±ýù öý‰ß/½èšÌO}wrɱ¿=þkûÏYö?ûöMkß90ô}ûº•‹žøç[hdÏúüËSø³Ýï½ôC—¾²{ñ¥Ð‘—ñÿ±DãðÐ Ó·|ïØcì~­çK]}Ãä–{ï|GÞ²ôúâÓß~Ø÷ÑÓÏðÞrâU_þí_ú¡“ßûê5w?»loâ‘ØËùñqÌn?c±¸kdì÷;OÈ-ýÙê[?¾ýšëÎù+åÊýjÓÔÞ|ëËÛlHýãô»êwÎ~zÉ­?ûÕ“?ü×מ{ð†Är1Þw÷å{º7ôÞõÂwÉþaòÇß»èû—Ÿ|ÌcG]ú¾þ&pÉʼncÁâõ»·>}ßKž9æÊÏžÚqô{.Ùýàà»ë>׿Áÿ¥'úÅ;Ö|þÉó?Þ‘#2Ç<ìkgeÝyÉÆ~rêÔ·–¬ÊÞ÷ÜuG½yǺçî^ÔÂ{úõm7>xç˜ï¨Ýö½–­Yu…ríc×fzßÿ§å7ŸvÑõ¯oXÙ·ò'º÷}í´÷¾¾ëísÖø^yzæýk®¸iêÙãx7~ýS÷~âÞºý…S¾¾­»ÿO¯=¼Qºñ}Û¹ã¼gÞþÓŠ}w¼yÞìðª+ÿoÑe/¸ìislÀ/Os\Ec‘rV¨:Ô¶Ìä©qÿF*ÉâZuaŸ;›Ÿ6Žqþaö]" û?ˆ£²Í¯d ÐÈìÛF¨>ê‡Mü[` õwèëGXUž7ª¬ÃˆØžâ aŸ¢¨za4Î2xÄ:<æï ½%á2œIt°B4aTFvøÏ¥eL scCŸ¥*oç@D]̪“å&‚TQ‡|*¬pþÍC ¿zµ w2Ž8Ó]‹qØnÁrû¸0H¤ìª5?'÷÷Aµ­Ã‰_3rþ„FÁ™>Yæ’­ÐÂXŸ˜ ìûxöB46$¦%ïpSj,2Ž2‰["XJc\Ì^«® »Mõ“Wƒ7Ì«bÆ,¾ZßÒ8ôL©˜¢Z×àÈYŸQ z!¥ÉyÄ||˜`!粪 €r»z…FAÄ¢P¾Q•ê™Ñê]Î`õdÃhuôgøûŠ3Ü•4"Ö“FÈz7Æ*êYÚµ¾»"ÅMs0ƒ\õ¼ †Iš˜y`¾€Y‰Rɋᚼ@”wæbñšºYS7«­ËóÑXM^8R 'ðñš¼`¸6/¨­ZòtÓ{ÀÞk`” Ɔ« 6Á`p_Z%ÆüâO Ñ®—®Êm þ§˜ì¾÷á×÷¾;¾ro·KÖÇì QÓ™¸ù˜íx"Rñÿ…‚èÿçÑ Øñÿy’ضi ‚Iª—ë~¶Ä% ”}Õ„ÉñdÀâ?ÿVà}Np¯J†išjØ=Ë%ÙI¥–úÙl’‡Ã(B ckþôVh˜åf¹-J°”ÈJ*[”hèöÖ,’7û><ö R“à‡ð½IÈçˆ!Ÿ,ìªK®›ñD¹Òl Š’=•Âd'{ª>Âq¥¤®“ä§MJȲ•ËŒwì¾Ì²ÕËfÊZtJѳ !ŠŠ\Ð¥† “Yy¢!Àˆ˜ìÙ—ëÃ$ñô£ ’'•fÝ%¯¡“¤ 4§6ªÚ›kK Ø>`W˜7WEæ±™c#šéã›{-èô¯f˜jšªYúÇ%L‰æ)ŒI%5cC³±ÓÂìM²ï#Jiy²¨ÑÙÑ cœ™“¢@§èTN•(—4)b(äTa”}G±*$òúXIŠù¥X³¹ŸSYhÈ­âÀ“`*Y(N”粪£KC"ÔðKAf{ͦ¼>àDÖinÔð^õŽ¡ÓŠœMõ4‹JLf4š.å€]íÍBÙ4+:­^>£#õ“Ô§P}–u‚¦PП‰¿–˜³ Ï[ïXÀÇ7EG^ïúñ,p[2r¿;¥çð IÆYq¢ˆç1É |FÍS<]A'²N¦ñ\¥ Šg¤‹ÙÓ@’³[6lÞº…ôm:—œÝ7<Ü·i˹+Ä¥¹ÉÚ‘sù¬ ÍN㡊>CÔ4Ù88Ü¿àûÖ&ÎLl9—€v×%¶l!ë6“>2Ô7¼%Ñ¿õ̾a2´uxhóÈ 0šYÁ#ÊÄ‹%Y:]pàKÉÚ‘ã«r‘ŒPÊÈéWó3Ø‹¬=MbT³âÍ0ä`VJTE‚NìÀxÖl€Nž+ø~ýwØísÿCçüwO’CÿísÿCçüwO’]ÿÁö¹ÿ¡£O’CÿísÿCçüO’CÿísÿCÇÿçIrè¿}îí¼ÿó$9ôß>ï;ïÿþ¿Îþß“äÐûøÿ:ûO’]ÿ¡öñÿuôïIrè¿}üÿ'É¡ÿöñÿuü?ž$‡þÛÇÿ×ñÿx’úoÿ_ÇÿãI²ë? ¶‹þ#ÿ'É1þÛÆÿÛñÿy“ã¢]ôéøÿþÿŽþ=IŽñŸjýG:þ_O’cüö÷?Áßñÿx˜jôÏâRx=ôœbýÜ*¸~ü/„Áêù_AŒÿ ‡…P'þÏ‹d‹ÿ«êÞë—Jö`ég±/î}¶ŽSÞc§ÿT"ñtlÊ£I‰ŠÅÁîžVñ¢Lú€0Sb¶H >B8·°9{àXŒ¨%[lÏgJCÅ ¼o~#ÍMP¬+*,¿P‰MéWsy1¥'tš“wR3J…puÄ2.P2Žèžj‘)ªYÒÕ]_<É9ðŸ)ôÙd!'f³Œ‚$ÑtêZ/÷3W‘ì5šPË×§–·R›BTÄÀƤÂ'É“õ©†lð-±qaQÌÊiŒ¹±0TÕ3Ã4'æ„úÌ µÌ¹BZÀ€Û†Ì -1‹—BÛøœkÁú¬­¬•‚qM·Œ×|ŸFlÏņüç«<bª"Xø áÔY «Sª,¹+ˆ•oÂ;À²8<›Œ«PK<)ª&æ°9# ã脾7GÂÀJ¼ PÜŸË/XO ·Ø¡H§UËœK sd1,N¨j¶P®B>Æ0Âì¼`¼FZâÕ¸wºŒŽF›pµq¸jÁXŒ‹Çã|5a4fatõ©2ÖŸy23]Æ›°·±¸pºŒ ¢L>ЄU(ãXµpœò­Ù0 Ã#ߌG¾Ê㉠ÈckŽ¢ê Äg]‹ÆFt])U)œº€RhÍò%‰”w †y?_iÔ5‚Z“FÐ! \ s…Ƭ¶f!«9´xØeÞ|†æÇg¨ÊgO«|¶f(Á>J×DsG°@̆çÇlØÁl³¦štíÖL©C!´§lÖz=Žp=Õ“=¡Ã5³ùÖÌ% †™¾vdÅèÑsä&ÚĈG€þ,µ¦´f ±¶Œü9o›™B(${F¨Þ”òÖì›þ Mm'Óª£ PÑ´XÀ‹cê2bɨº*¬~<YN‘vwP´. FÓMG­«±…MêtéÑÖ¬ ¼hÎr Û†(.½LŠsž)µ>Ý §tDN$ü!Ñ4WÎd/Ž9Î_ z1¦¨Ë OJ\NÔ¶sþA%¥"Ö³(û”]G^2à ŽÒÇ%F6-”‹H*…ñ#öé8¾éÏ+¿9ÎÞGˆTÌ“` Bü}ƒ•'žÄTQ§•rR²–*æÒYº£’‚lI¦-È…Jf2'5”J9' 9xT%#ºœ•ª QâïOQIÎfÅrd ÚÈÝúkÉÀ;~dð@Æ  ÈHØÛ¶.í1‰šö€×„­½ älu‚A7ñŸkC$xŽRæ'©–i"[©nE[Åp+ÖR´¢mˆÕšÀ»h£5d‰V„€ˆ”Càa ÚH ´–„0œ:IRjC ýÐ/ÛÛ2e—ö€¹¦=àS¶µ RJSE½’+¶ŽÒTδ£ÖâŒ)ªgøUí8Õ†! T¨…¬XÈTr VÑ®s ¢X‹3 ¤8£ÀCц3 8gìí€fÊ1æl9Ìu:"˜›Oð-1¥ãÇÛæ(‡IÖ…êV‚ÖŒ„mâÿiY‘Òª¢³‡,U&õŒ1]ST¼m³˜9â_— …˜Èl‰äÕ<û–Èiš-ÐJYüªFÌf+•©Í9‹±™ÍL©¢¦Á¤Êh€yËd…"‰Ü,ôãÇG…žaF±ðf)Kè"~.å^¸VÍJ ŠêÔ­Ü,_¿¤góDV¾°H@¸â¶×k¤_-j ýzùu‘—Ë]Q[ ë4Â/u•­M³dB6T•—»aóò·^¼a*ë™q÷Ú”¼–¡çO©ª&õ úzÒbNÎΛþðG,fõ&P¬%ÖUkÛ¬ôâ)¤Ä,5z4’éO(S#˜µNd]÷Œæ€Ôq ƒb1v~žÐ)ìüSÄYÉ(€Z ղ˸=«­ªYY‚±1:ì æbõceqâÀ’+fÙ(¬[UÕu£*ïV5â’Y¯)Y™‚I¤ägß+â§hyQϰáE`ºÐÔí´&7£N“Žsk¾µÍ ì`%" Â, Yv/ž +bc X3‹Šk¶†¶WM®$‹“ª"f ö|P@FU·÷Þzç˜ØaáüŠ*Qãw Ë2… ãÉÚ.•&›Â°~Ý HQó&HyZ„ÿ­”úÙ¼šS“”/'2ÙFØS[ì7~XzÛÿ³wåñQiÐÌ"ׇ ÊÕ‘dW’¾»'„rÉŽ .—8É I aâ$`’AAw!ˆ .‚ò ¢ðÉ¡€ rEXPáCnû¾ÕwHbÒ=ã~˜dR]=UÕõÖóÔ{ÕLôhs!Õ\)Q ß(_Ω\SßÎPÉY¸¦Ã’‰Zf †M˜.:©t?KÃ#")"ãTl“J—©#Q¯.s}x¤RÁž úÂ=À‚ 3Ò5ŒHG)>‡+Ì@ª6¬|MšÞ€g<¿d^ÂÂ̬àÒÞNæPŸÂ|m™øs2©éäà r’@{öŸ ¾ædâñÐ øâu`v¤ÁŸz—,9ê Ç€Á &I ­<™qAAu²å¦¤4¦qn§/--5#Ó7kp¢ÌÈ1—,UæštÌYŽ&7¥ëW!WX5Ê xÆf¢Ýï ƒF¡…uɲeà?j‚ž@¬"ŸÖ€u c½ ÈÈ“?Í8Õ/"(ïHóLðx3}ϸ†Á¬“K*‘ÀÅlüTª=兽ąK–ZJüÂÅ¡Ñ#ð/0F£dø§xsA4d½0Âe¨a”e4ºb¦AJXntº'GùS›[Ðè³ÖK®0k[ú ž¡ôÓý^´]až4¿ÇK–²‰åž "Õh._®‰?ËV™iÓZg‘—¬úLÆøPÉ$¢G“zc&Y}é²32,Ï —Ô“¨ú%½A­*-ËrQi".âc]êXÔï¥5ÕŒMñQJªÕ¯*E hÖ»À\,O³ÑÑÅàŸé©Y˜$/@{`ŸüãUa3JoÚU…`!Ó=°Ggf|T†w*gøµ¤ ü§ƒ¢ìƒÚ›?#àËÂùò«:@Ÿê–š™…›nÀ­½{ ÿ> ¼¡?(Ðê)‚j€?IJTv Åg$¹(€QªQzP¨¦E¹”& ¶SøMWHY¯E†ög‘Û¢hªL¿ œ¹¼B™MmɹÂÃâÅŒ2>²Ä [OÑÃ,M3ä·ürº5êÔ'‚Ñ£SH݇F&Eu_!EÖ(š ÆŽƒ©tÁëJQvË™¸ŸÔÆ#,ßóŽ.güæèH×0!J`)òKŠRÿ¢`l+¸Ÿ\b£dY¹D~oRkÕ{Õ;à^Ò†~ÇWQÐÖ5KA,[UÁÒQï®@°ζ £áõ)a9¥¨Î))Šz‘Ül+nÙ¡·»J\ÙbfÜ€Y^Öů(yQ)DâD¼ $.Š»C ªôª!3†jGU,m}┘Ö'ïvB¶Ú¯*UH®aTô ÌÃ0`eXn´ü€qmG¸(*úQÀë @- o(׺Oe¡bc©è„ìĬ >*úñA½”_m½Iä VÙDÍ€70RN‰JÉJO‹¤ââ°!ýÝ}SÇŽqEw‰×ÜÙv=”Ú´iÏ¢N› ÕyÒžP-òÖb¥,Êî*YŸ<ú’i}ǰú#afË(ù¶œ‘ÄŸ¥Þ"òN¨L †QÀޤ6†%j :eyT ˜Ðúª”>t:Ud¦ïɤ–v⫲Ù~Uq-›p-¢f'â+P²m\óÑÞ$î\ãgØÌ¯†*½ö êœŠ’h¶HÑвu6*}ùC nw6UAf-ƈ…P$Á`„òjЂ_¾2h±  €u‚±LXCEAõ‚Æ4Çs” $M6”´Aút×&‘:¯ïÏÊ*öÛ†¬ýªÒC›yô æW„VYhÕ6o°ä‹» Þ²&à€0Ô'Ô &kø¹IјMrs%«a¥;»„áf‰Â^–0ª§<OG€¥æÐÞ‘ï´wÐ>`‰ê…\vn¯ûÈ&\y…Ùv:Ã=#‰§²`É(öÙ‚÷¡í!V1xXÆTâBS‘ÃE•PÖ¡µ=HœÎ‡Êòr›w–­ØöYûU&Ö¢¤0$í]”Àòs ŽÈFðšÉFMÔùÂ8êcj.gøzIÑ-3̘‹¶T”`tg—qÀôædöNÆQ%b‹v¬™Z…%`h“œÇß«ßUT´TåÑL'ʋɂ ‰ádrfˆh/¼AH¬["'‡Ð÷ÏÉIoàd!ÄÚ öa˜±’Ò¥®]0DžN´[íW™PD¡‚fEÅ‘e›PÄh¯ûN«G9vú[¹3´‡ÑŠøLPÔŠê#j#¼Ù(Úpg§»JV(#²Ä›XqzUð¬—r’«lñƒSÿ¬– ¦ñ:^eÄ?(Ñ$ØÐâ›(/‚n±–‘Q}'ø¶Ù~•ñmöV§6œ)ó$fåÄ[ ÿ |ÿ¶ÈÖC2ò4Fn…öpòðf®*)“!;8ÝU²6q…3쉓Õu±ëÔ!‰!U³­áVc+hcÈjlE°Ú2«ØhS -!˜r„.àý¼u"¡[ÆadI±cx”Ò„"´PRƒÒ‡]e‰+¤¶âtε_ej- %î%pœ3j¢½£|e©a$~ÛoÉ`̈8 bIÑ€(¹ÙA§»Ê"¬\!A©uÆå9/›N—¨Ê›éCTé h·¤Ò[&4Ë' ­Í@4»*p—Õh…U]’‰^P¹r“Ýi„Ð mÔ³k€&Á¨p«û'mòš"ù@™§<´¬da1lhƒ-¤]ä1ÈÉXW]qx.díW™|Ü!Í`Ä3 eJaÕKx[qVJrvd;k‘§ô}!Ÿ2ÒøËú$ËXüAtC–/;Ûj= @c.¢¤c5AWÀ  ÍX˜ìbda²±ðQrF»w‚*mW9-!X¹pJèÝpaŠnXY|•I‚ gòÒŠn(;H4F›9JR£Î!Í a0L¥;E”G}î$-ŽÄA‰½ö«-*§ö1•q$3PKÑ>†ÝE…»žìCã®GS"(àè•&¹_Œ!* Xˆ9\˜Ž$aNFˆ“$kä-Hœ%Mƒ£¤›íW[”Nõu:© mèã,Aj‘œ)v‚'­0‹gwÐ%*ˆÖÕи:ysð^‰åë® ÞɲN\¶Ú¯¶¨‡ÑʃêÀ~DV1”ÆÓtY nbÛ j¾ )oض‚Ä’8™ )6®€ÊZØ ’DÆ`ŽSqFPGÂ9Íö«/K§!w‚E–hÜIwâN ÷ãù?ü /<¥Ì™²8Cb0Ψ(*Sƒ’üí0ÄPýö«œW,Å„¤ñFòžÖ„¢„9+øŠŠ‡É¦ âÁ’O|3+¼) ]I0r¢xØj¿Ú¢pªx(¢Ð-Öp#‰DsªŽÈ™$s]‚ë qØKè¡ ñ ?ÔÒXØeòÜ%bs8Ù­l¶_õ´¢ Á“d8ÑC¸WTw¢$šv#ò\Àh¢ì&»™„1Z.ô²â8ѺìcÙË5 ›íW_VŽqEò›$‹¬@E%²¥œÈŠåL¶®AYQèÁ:&«Žín$Ñ21*Z÷°ÑÓŽ²÷íµ_õ€w°p¥Åtµ¸#ÇnÀ‹,*‡ºhC#ANxh‹êbÕC]¦z²ÑMò´DäBXmügÜ!>CãBgÌëžq[?“Ì4›íW_N‡Š,t²F½÷+ÌÙE+ ï¬é0%–‹‡)iŒ âJ™è!?é@ëê9‰@ëQzt³n'j Íö«/+ÇQ^-ÏEK‹gD˜­Á‡–Äðˆc¤õ—‰À“0)çÄgk³ýªgh‹Ä8Ù‡ä0ÌmñˆtŒNaDǵcðhìC’¢²3&·-nGl11XКêÉÁAܦdr`P9@bÕû2²#ñ °å`ëôà ½ö«/iÇ(-ëD#µ×¥×(ŸÁ98àIÅO3U>ŠUùOüný²úÕ. ¶ä2ÞÛ½×ûûm~ÿ©ü§Úßÿ”î­ö×rÑteßÿ?ê÷?ñ`þsð7Í2~ÿïïßÿúŸDŽöÒŽNn'2I’ øF%1‰R¢$ˆÒ¨ÿöø~ÿ íOµñŸá­öš¨ÿ ðÂßÿFÓ¿ãÿ·ø ЭG{&Šs…z~Æ?]ESþÄÑ®ØØè¾Êç¤cÎâ è©iø­GÑ=p­t½Äë‹‹CÍÂçIwåÌ_7´Ÿ¿maÃö®:³ø4õ¢÷â¥Ñ[k@Ý3¬¨öó§v|]¿óš’Ë17¯n»ºü«cm„qCçÝW«Wã!Ǻ̽ܫ4îÃfÜy‡º¹tÛÈ¿>²ÿf§zóÄ}ÔéÚÙ’‡Ö÷xõêö~Å—¯Oݶaòøýs6ý2ãÖ´U­nEŽóYéã›Kæ^uséÙ n=ÿÿŒ/}±H^×+oî ëÝÞxãrÓU-o\“´þƲ۷JrZ¬ŠkyéËý‹2N»øu‡øŽWü;¯Ì)é]wr³¿+¹x»ùõÒU6·Ú´¹Ã/?úZ≼À»%¾ÑèÝ¿ûžuŸéy,ïÌÁ%—þÐñÿ¦Í«Î®ž°kï§çÆíÚþò¿÷_šS÷LI)s\þ¾D>0õâÕ¼ÖãK†^*¾:þêÀÙCW_X÷ÝÇ»oœéj±lé_¼2,+á‡EÛ÷õÿ6aÍÚc­òÆ5½þff«Sl:y~gRé•s­êÔ\–u ~ÉúÛ9ç/5ô¯lºùHøeO¿‡G®nqèɤ¼Ú£›Õ1eèüAbæfœ?ôÀâ½óóbî\ðMañЬüÇ~–zÏwsóëÎðJ3úܹwïŸôêÍõM¸ÞMºO.Y’’qþžQß¿½Ðsp|£‹/¸v‰-‹êr†7^ÛiF­¿"¬XYré³Âu«f·Ý²µC?n¼ë“¤‚™Û'ž¿Þ]cJÒœc~½è¤üçÆ‰þ'¶ìé³ ÆŽlP¼ðê†OvOºkÅKo¶}¸öŠÜN97¦÷X^ð~éÍõk–—^“ OÞ½²w¸»˜¾OÓwÍíÕ:në¹K‹.ú$Æ7êÓèùcç~{ª[øݵxÀõœ?={Mz§C•É‘S¦wÝóù‡+žZ˜”¼sð–VÏ_oÒIÎ~.¢åZjHñµÚþ‰*øvÁ/w±kÎ}ãLàCæOë”»$þúä~ËÇ|å¿ðFý¿ù¢/Þ(>ÑrÕþ/÷òÉ©·þíÿ´Æ¶±/§ÏŠÜ8¥÷{9¾¿à[ö“-­6ÑOïì:æ­жÖ\tyõí{ßï4ã̃'kÞˆùçè—2ŽíúóuIñ„?zû‹ž'ïù‰kY—þ´·Î–Iß×n5©ðX«ÓžZ¹ôµŸžoþÂð©õ> K—4êPûì÷ž]®~3 ²¼â²KûOº¶ïʬz{‹ëgÇ\ì;ûÇw¶4Š=úÚ¬7;Ûºî§pñÅìÉÔ,\Õî‰×ŽžHˆôxÉ—s žŒÞwÐwÜ[ ýüLZ›ÂOâšÃ oÕ^R?ŠY]šµ«_êòúùMýÏú2þo^úÌMOíÚ&7>;à—=u÷.I­±|Ø´Ò˜ŸÙv¤Mö¤¤š‹ŠÙ¼²CéGjÎÉùÛ`ßËüížoÏïÞéÍ—æ}U’ÑuΩf)ÜSM¦lM|¨ÿä„E}Þ*Ü—Ñ/¿5_°xMýçfO™ó,Û·õ{ûŽ7ºÿvÇAK¯mÛs·øTá©C7ß[Ú²M‘ÿ£ÆùÇä7»öà¡Ú³¯Ä¾óy‹Ï. ï<÷ÔÛ÷Ô¾îÜôë÷N꽸v®7ò­W_ZôÂÓou òyq¼MrBä&­ìúElj­GnO¸·f7ú… ŸzûżÁ_ÝxhâG›Â›u÷XÇK E%E,_оþêðŒ†={Ÿ›='¯ëôغ§NÄ7ßÖ{Òýßm;²fxÛi™¯›r}ÿwì_—/þüè£gâ»Ô+^ñÊšY˺îz0soâÛ“Ǹ"ÖŸþhzÍ}E/¬ûà}ß]ùãÓ¿Ùx uȲáÝ÷Õê3á …µ7¸?eêÿÙ~ÓnÜö¬|ä¹y=û¬»þÌëk÷|¹<}⨽®Ï¾¶êè½Üžyž +¤‚Ü-¸¶,·sàº7¦{ËÃçzÍö^ûafLqÿµ^ouc‹ ?¼Uç碖Nî>S°§I·…M¨¹=ꃨ”&ï7Í6¦a—è§[·Ž¾Õ|ÊÓ·bwß~³Óò¬ØŸôß^÷ð˜È“oõ˜2«ÁÙû.¤´ˆ9ÞµÖ«<¥^¿§'7òÌ8°vW~ãø¢ Óvå÷9Ù¾ 7¥ÝàœÅÍF¤7|n¡ë—³Ï·µIø³Y;Ûô‰àÆœüvè‚!mÞÝÇý%²ÉÉïý|à‘.»ÇšõÊÀEñ[åÏÝ;qÍÿ>Ó‘^úéÍMü¦G¿ÓÏä¾Þk§ùK¼òÁ¸¹s<>¥wòÁú+î^w$e~ƾóÿˆ¹¯å®Ñ‘_ÌÌ»¾£{éŽyÿZÞ·›ëBñè¦îß:ãÉ›w¯LöΞSçÅ&%ÿ‡½§“¢¸’3‡÷m{Ñ Æ3`´ ·¸Øîžîž$+»Àu9ù¿Þ™ÞÝÙéµ§öç–3gPQ#1ù\1çgLM ÑÄs—ü‰¢I ¢BñðâÅŸ“ó‡ˆõKâw¯ª«ÿfØ…ÉúÝö;ÝUÕõ^½÷êÕ«êª÷^ätñüKØMoo?üÒK^]õô¡ K¦-îœöþ»Ÿ¼öWK'\}ëC+<ñ‰ÃSçÿjÚâÿ,»~ÊÝŸJ=0îƒÿºòùo7p÷£CÅÇnüÛéo¶oúʳOÞ0噇ræwµþè‹;«_¹}Ây{öìzvË[gmT>ûxϵ‹:û>Ä´Ý}æ×ξéìëÿbÙŒ/[Z»êؼýïÚèqvòáÖ;ø€¾¿yǦ=&6XÛ¾¹íÆ«Ïýç[oÙ¹M¾sË;ÏM~SýÂ-_®9¶5ûâ’ïß{ßá#}ßý›~¥êŒdQm¹û­}¯¿¸Æý“ýÙš2_XдýÑfåË{þòá]ý »n¸¼¿~æCÉm;\~×·-{]Œ tþtkÿ÷Ÿy÷7ünÓúµ§Ý³uï†NêW&Lž?kÅöž ?ý›êµþøÜß1pðÀ?¾zä¢=Ž»¹kêÑwÔU5µÛ·?:}÷÷ÊS_Û¶ä›ûÎûBý¾Ü}oï»ò®uÓ~ýü/÷_ÁMš6·nïâ=ÕçÕqß:xÃM¯}îñC/ôÕ¾õñþÏÜyh9;ãøÞ³w¤_ùúîsÞùÕ›6o¼uhû{SZ—L¬šïŠ_|nòŽ7ê(*›92é‚oÕ=ñÁýhÿÔçžz?ó£Ó›ôMf¾‹‰ÿºë¡•ëçÉêÞ ·¼ôùO_ÉŸ¾jÊÅm·.Û3óº»7?½³ÿøñ™s·¼ÒW.½þc/?ü…cVÿõ®wî™\?q~V^¶fö¯mÚuÆÇ.Þ÷•…×.ЯzüŸ.Ú½ã[‰5ïø»…Kïoíûï7w8ú/7Nyêàû{î<æ'¿~ï]ïÍpìØ‡OsÿûZukü¾¸}ÓÑÛ^½ïœ…çßòÜÇÿ¡ð­×_|âçðG?qߦ¦Œ° wÇc_ÌlýàkCÂç—ÝõŸ“7>34½õ7WM½èüÁ­SnŸÅ?öüV¾a°W=mÓÏŽ¡U“g~ùà¿§¦|êøø9KWþýWÓûî¯{ãAùJæµïí}oåñƒ×üëÁñOžY;séƒmëß<þêµ·íºcüÍU…†nâåìªÍ.Ý=gû³hÒkº.¸âö÷nëЮñÏ÷?ÄõÝ;ùóæ]ÓýÇïÕnÞó³ßn9ëšî×¶_§<;ÿ3ñ«—þâð¡{†Ú®ëÿîî¡'w¯¹ýOÿöÀoïÑ®;pã3Sùà‘sv¶uýdàö΃ÓNë¼ò«ü‚£~¹ïêÕ¯üÕ†mo l*¶qןzÞ¿è÷SV\®ä3¦awؘ“L£Ž„„•&8†Þâ¾%†—pb •LV¾TíE$Ø’Xe%k%QQ ¥H$°8¶ !Ùt4Q€JZ45ݦèËc`O¢Øb¥W‡÷šzõ¹mäUN2^™ƒã‘q òd¬!ŸWõÂòIàXã‡3~xãÇÆ Æ6P[WÆfC=860­ªÌvÅív!Ò0DZV@±ùÙL-gŒjV"›£âz•£IEd]ΩVq¨„‡„vk™Ø¢–…ˆ›5Ë,˜ò$fÌÓ”ø¼ÙŒy¨f¤4^Åà½+Z›ËrüÈÄÚpYLZóÈ$91i£BHŠ‹H\¬%{b2—2œÕ•D†‹D&iîc"~›„Hd¢<`•Ä‚& O6¸¾\¤RXD»Æ)‰J< N4>bñ‡]'E¢R†S’ÈxU… 9X‰wûa¿Lq±”؆{(‰†Ý{x‚†ñu 2N—DFriM ÐêR .Кd’tnÒɼT.(X:1¤Œ¦á42Nâœ÷]b Ê6SL+ZMS[ šÛ¥ôBZËöè(YωÐÃ=«æAÕ4NçYŽe!žxÈ_¨f²Ìðï5Þèï+"ÿ¯¨…WŠ8wÍ #ü #|-þ«ç”š¹µ6{5¥ƒÁ~v{˜E’(ÆEÔÌ4>É5INÞJX¬¾è4»¨ö¦á¨4ž4–Å‚ä-÷•ã“ _¹xJ|åRœ/-ΊþwñÇ)o>çM¤”/Mò·Øä‡‘LúaPøéæ§r‡¶ä’Fuà1kqDÞn¬¹-¯™°vÇ‘GÞ™Ö§þ&ùÁcµþ”• Y’50Tà9~ì£ÏGí¢×¹öØ)€¥0!ŠáßXòýG8Ibñq,½š‡NøCÓp®ÿçë¿þ§G ÿãcü¯Äåùþ“-üçÆø_‘ËÓÿ3£…ÿ’0ÆÿJ\žþŸ-üçÆø_‘ËÃÿÔ¨á¿8ÆÿJ\ý¯ŒþKcü¯ÈåáǨá¿4ÆÿJ\4ÿ%v´ðŸëÿ¹<üçF ÿÇúE.ÿùQÃÿÄÿ+qyø-üçØ1þWâòð_5üçÆø_‰‹æ?/þ}ÿ©Ìåéÿâhá?7ÆÿŠ\þK£†ÿcß*ryôÿèùþ?ÆÿŠ\þžïÿcß*ryôÿèùþ?ÆÿŠ\žþÿçüþOÎÿJ\bìûO/ÿÓ9¹P¸LYß–í.æðVà6%_P5|ú»KѲúêÕšÜÓU¯ô”M ÌàðóßB\ä=üçã¢(Œÿ®ÄU}qK[]CFmWêøz–©®67€OGÞà‘ÀkáÍ9ø-có·±÷ûˆÁ{¿§£¹Ž“˜¶|—¿T-æ3Ù|ç¥jït„£µšA‘83\ÍÌV»»ñ!;éÁ/`÷<-ššS;™X£ª7bŸ=ÝpÞ“Q:+ÑpäÃÄ Š^ìY ëÙ<‡.,Ö”O«ì% íD¼(!YÓä>Ròä² ÓܶȨÁÊB,ñKÝ©@¢®hëäê)Ú÷ CWÁ ”)ö 8+¡XC“ýÄÁ“œ.êŠÂãxiY-]ìîÈ)½v²É™¬¢)…lÁNd!ºá:çmR4j'Ä!AÏæ2N‘ŠÍN+™l.'[i ÑD¡Ì5ùÑà º&/ ÑD¡ÁÍt}Ðìæ€ú™f_}ÐÖfª¾8¤\á-r[JI|ö oê;­[ÎgÚsö‹´V¦^ µ²;ÀÊ^°‘7¡í2…«hÉn€DÚCpPP(D@Añ£ Á/ "U(  ‡±,] ™ ¨Éúêƒvf©ú$€Ikª¬Û)€qž$ PS)˜Ô£úaJ€Šê…)A{U&´A¥ $ µQ—oižE?Ì RôÂL@ŠÌÀì£ëõY/"Ä0Õ ìtY шCé.Y“ÓØ†börP20€ä€ÚŒ ׉ÿwdó™|è?ä —._cVñ¨J*½(6§¹åH}„PÚCþ¢l‡’+(ö;ƒ¨CÕä\ÎN°U›W‹Íf^领Ïp°0ÈËæŒ"3H Æg»•B]« ½¹ÚæÊkÖå\6’y©šËDd…¼kŸ„ Ï©[ÔžË^UT"J¦³Ã*™­5à~Xz(p+?´;3¤‚tN‘5]%cÓ jÏ,a¬áÎ:c;õhjÆ3D̯uÙ~|¾‰¥UUËÔaöÕuÈÝÙ\¢øG°€?r1§—(Ej"¢ê¯Ó–â$*¤åœbH4F3Öœ_׆“æÈDÔ¸zÖ¨P]MÊB§¨ÂÂÏ!¥7…ò¾ddÀ[¤ y‹¦­/§ Vì›úÆò•Ð|‘\Ec8A!%RÈìYÒ C_UuÝx• zU H «*›_Jd †]û¡Óé^(f¸ãó¥v©ëÑîçîtwíXÀOù%¤ ¡Œ;±˜LÖ°ñåKÍdåN5/ç t:0 KU×°ÂÁàu¬cˆoBÄÄìHƒðäuÚ'w½¶/È2D®KÊ«=fK-Â7¦1¢W±C4PU²h "O¦*fܸ¤-¶Æýu?—°[HøÁm%iæëêÔ±LWß‘ð[åô@›hRHdXðT³¢¦gq(½®`<ÖL3Ó×xÒWÔåR± TÏ ÝŒ€Œì^ŠÛÁT9=ÕBkÐâfF“×#ÐÃyœÜ®ä`ôAí¦A7½v®®ZC:‹Ï§š90g¨Ð¶jdˆ¢œYƒp"P乨‰³\Fy'Á¢¤‘ÎZ®"Õ,0²0Ãq]¸?²H³éKèRUåÖ Œõ:¡¡MÂAKLÔÞ-ÛM-èMƒõÚ¿Ïüí-àS’}ø/T$@¯ƒiGnm¸!ÍdL¿›˜ó$ÉI0zu'UÈqÏI±SÉå²=e5ñ÷ 4ˆi}nÂi½î'*ËÓ-Íz-¾O ¿†baªzQÒ59_À¦ *(†Ö%b‹Ï„bKPÖÒ EŠU¨á3wUÓk(ÕOíD¬GŒ7rrŸ¢‘Î[P®bª–ÕI’©H ±6•‚êPÆB`=µ.î1sÍÝp³Ñú$ü3÷ƒä~HÚ+`†! Û0³º”Ø@¬[î5n-Ú‚E_Ôè$¦Š®Ë.À¡B±Ù»Õ ž32UrN•3D”]Z«'G‘ZjnÐd®Kz³Üj“Σø¥æÍ69øa#“ T¸÷Øl2 ˆôu÷{z¨¶BRN]O%ÙZY9J4ªè„DÜL¤Ýí²¬eúÀäß2|L¯³Æ¬ß4ŠÚð´;(²l,hxðí΂±žË¨=˜Ÿiêz“ÙœÍJ5ŒhiÈnÆèBQS¬8ãt0þ»Á 1ÆÁ–¶:2çïÑÓKÕ»  zØSÙ‚Ž]‰Yo¯‡L…ŒZƒh¯%ÜÎŽ¹Ì@dÈGQ·-~Kf̸Á”]2kÖ%¨ w(HÍh²48¸¯Ë¦±™”“óEè~9’áÀFTÆàgƒàkæôÅÆ®fÆŒZ‘ò¨f¹ñk!æ)6kVH1ÂeƒËŒU é€*gÞÓ‹@8zœ{—Xt^'þ ¦£UÃgÙuÃq3c¬Å%¼@B–ROƒµì(ƨÔÑw††³ÍòlçbMœÝ„TvzÃáäž´XBg9¾nXúrbÈã¦âÀåV шcn™À$Û¹=.ìzŒˆ[ û¤€‹p¸Í¢­Æ¿ú\Ë,·ãÔã©>Á{bÕ;Ñé˜ô$Œ5)ërÍ Nn`@kwÃNÐ&ÒRÁnZTƒpx­¸Ó É¨{uÁXF×€¸ZÆŠ½MPµ›à €©÷. ×j ÏÇ)ðJ^nÙ ìÿãÐÓWµïÙ¨z^¤-O"¡>I lb‡…Ž4âÆASäÌêŒ4 ‚1pSN _$t‰ÔAÁM&(¸r´ ¾º[.¬$-á0Lr ©—ý¬@LÐb”QÊy2€Kq?•±Ãœ&±‡éfŠ'\˜¢a…vrɱ:¹ä„Í,ÑÉ¥¸ƒùTä×[+ð4·!aýÔh1çEV.5Š‘c.ä6”¹«$ŠbJtÓ¯ØN0 ?¸ŽdÜUöèÐ.ªÒHQu%ÜÂÖ„;Él°T:U­ÏW)in@±1æë%ŸºÀª  ^t‹SÑö³u- ;T“c H1„¤ƒ¾Ö†B iiYpâ¢qâW(’)†–¸¹)JKÞ- éæ¨L³Ã%Ì­àncÀ%úVc}Ð8·à,îØ¥æ2JGÞßÈp;#€‘A=Í ]H¹åf‘Ô$×p\IÒ- ó`”S@g„Ó+c| &á†ÙÝ=èÏW‡äæ-ùœ®˜½æ† ±Àz=ã§#H¥{Tè€&´Á¨‹nAi,†´Ÿ¶‚kЧ|DhÍ9¡Í¶a…ëhwËÅ\E7V0T`R!iÁšŠ"e)¢éœH£d0ÿ„q¡ÀCbãHX´ p~õ/L›E4;L¥ÅS\2 ÁJ6*~ã4 ~Â-qm¡dwÚ7\²ã÷4¤(²Á;™dÅd‚É^&*'FvÁ=Eèt›H‰a*'wÛþJðûÌàÜÁœ>!b|Ö=¡Ëùá—>垟)W(þ|2Ná¿LÑÔˆ6ø†g_¥%c²Å™åÈôžŠX°Ãb€£¼­d²Ý§"²Ún¤5¤ñâ"Î# ߤ{I5þ˜ŽUå°ƒx—š7Ü«¢Y³p}v%Ø·*k¸ì2k‘u¸«fÖdŽ´Ç$'n–dGG³i>²‘qóJ/ÁPÔ¼¶s„2Œ¢§lIŒâ©U…ȉ4Kâñ¹hÂ9D‰hnÒªh¼‡QAul½ˆjP-r}h )Ð …²@"Ž2ÂH\© r8ÁýÝ;IÜdq§,–€Yò§rîb- ¬œSc×ÂÛ©ÑdÔbð'aZP:X¨+4>ÂP¡8|,/Ù,8.Žx˜å“ï@ Ž5”òpCÚ`pðx‡4Ìé]ßEpH[ŒÄ°c§ ®qšK±ä›<ö„?‚º#–aù°Ú^¨ÐXm´ÉŠs,aÏê&­¬vZ”„‚®ÇaŒÖ#!#<›$‘eÃl›²§nÌ.{Ù&z-7Ÿ§(…ËX O \–tõ±@7›m.•õµÀc6ûPÇÀ8—٭ײºÍVȦ-- ' Ñe¨cˆ:fj0,çl~”¤=ç|eÅ´w/A{ŽZsŠÀJ™å/#úgE¸=bôw•\{¨å°»'¼A§Òôi«øS¿(›ò¼Ã^•LyÍÏa,ï¦*bb0£ËÄIž•V[dK¯ï•-f!ëLÝ»ÌÝ»Ìu  nÝŸîRÒkmøKä\ÑZ5rÆ‚à­ð§|l¤zÞ׻ùãZF31œ×WÐÓ,'ˆ¢!Ö“#µœM¬p›NSׂ‰é"lÉ:b]ŠRÒÛ½œÑ½n3 {¼V9lItóa„óÄÑ5¿á@ZL@rÇ…‚{Èéü×Aá¨}_* :ìù ïžß€%±LHŽƒ›aOqÒ±L\òOq@EWjZc6ŦKmª™ tÍÝÏÙܜ$€Q&¦ÀCŠkäóv$ój,Œ¶1êl’j)y.ÃFŽã$èmFVx¶Ò›™ü{3ì4[±¢wWÞì·:²).„ÏfðNEÞ…†E9D€¥kòìRTòzVï#ÇJm.ó|™ÚFçßíE`z¶&f «;´bþœ‹Ø®ï8þZ=»³™ÕÆÉ‘ÈŠ©¡Å³]$b©TŠšö¨=¸(Á3Á ?îž ÑB*ö©ï–züXžÐ§a{ÀŒ֑wâ€Qc"…-¹WÊ–ÜP •‘MÀÊÁGpÏJ¬sQ³¨}‚Ú§ØJÔRsÄä9HEmóÁ ¨Ý†#Øé†ë¢66æhE_eîRÔQ\c’ÚËלiÓµ y”ÓFgSWyv%†Aíõ;E0è=€D[·€–(5 òèi©^H–ÅÕ$µé¯Qí–³Ÿ–ºCp­ÔÞ¾S4‰Æpâ#ÜÁ‰ë ·ê wõ×DmÃk1ŽÎ îÅȰ1cÞš€ŸN9,I Ê6ÄÈ#Ž‹ ã&h#þÀƒ—ŒË²å’É=ñ ˆyv‘±)2vŽqâh±-Ó8yfX¾lìdÓ• ‡kbœw?Š¡/‡íÿ©;S¶{®hÿOØ”ãÿ-.±Øÿ“OŒùªÄ•:ÚY%¥ðR&-ñí)9É ² vt¤:X®#Áÿ¹ñ»Ní5ìþß“é(F‰þ/q‰„Ïÿ› ŽõÿJ\Õ-sê¸ú8SýÔ›¿Í¸‚­/0ŽIãå­±9Ùvz›ƒe¥ÌŒB‚?ƒéÖÍôÞqdâaíeáØ‘Õ/}vUî;UCÿ0oÃÆÿ¼uÚ~zîY?X¼fK3/ÇSÒ¤Ö¾—^x}¨¸|VüpËÿ±wåM\[ßÒϪQ«ÖV­  ­„™¬D­MY(ÂC1$ˆdÁ,(ÆØÖºV±U¬¸×ö¹T+.µµZ-®-ÖZ—ŠÕ§V-.TEmµö}÷Îd™$L€P¿~™’¹s—sîùÝýžsRÇˤ_œ¹•YzçÂásÏÍaÿQ¼¯ZT÷ ËÜïkúa½Þò^ì”. æá~wØ·CæÎ]Vþ驯ìÔª¶ÛÐß&Öín_÷¯ÈVå™ÂoÞËÙ;w_FùÎÞ¿µ½ðÕâ=ïfdªÕî¥ÄŸ*‹õ½ü(L´¨MÆð DæÉ×έm¿øÂ/+ʆ|’7¶Û7ŒUC×¶_p}¼„©ÙÖ»\þqüæºLÑ'?ïX5=àå ø/}+ú~|¯Û,ž÷о[M¿1¸fJ»E²Ù‹°Š€¨¬VâmȨoú¼;gܽø7ro<Ý*kËÊôåeá=Û•ücxEè;K^I^TñadòKŠó§ZõÇÊ“ [Ú,ý1¨Ûá^«®þxlSϤþ­N_+ú#60x{ÁˆÝÉaeþOù$ìÏ«ìt÷Ì;ÚþS^¼á§H>?5ý>÷š_Ê©—þ½íæÆ ‰skS—oÖüTY—\òò|íÙo×—þR:ÿõ—Ž?šóðÄ5#ƒ½¹ÓN³ã÷ç†>—À\xm^ûqÓöï™Ëñ¯{NzÕ:/Îw”ÿä€É?w•ÿ•²ü][%|å[W žÏäõþëðÞ¼èY¿-_9½2i×ö›e"û¥ þ.2X÷dÇ‚ýÿA¾ßRvâô•š“{8‡?:0âytMìBÅí»ý^ŠçöðÅ&íY(3.Û1øiú’xMö[GCß½p[|ß»êú…‡ÌQªfÆFŸ<¾¶M‡'ו}pÿð¥ãbCÓv«º5hÓšKÇÝž5òò/m/*© ö¤â“Ÿ˜ôÍÑ©óí@gŠâb|»tÌÊé5« {¯W{ùÙÁÖš­‡â÷w•Nœù8é§âºî¶ŽÌXÿý¥¿í—u•J®¹ÿUîiú£GZùiûç?8úS+¿ý·ëøæ\ãFaÍî½Iš ­û–_Þ9,7P“x+‰ß>{¤ê]þ sŸJ’kïÎØÄþ7CTîÑ:ê§Œ·®Tï~{{¡ÿÑCÌ~K®ox-´Ó¸¸W‹#·¶Z8öOíÞ­*»Ÿ¬sû_¢‚ïnow”?˸›Ó_Öeª_òCýô±²6;oÆÈÔWΖtoûdÆõ›ÛŒ{½"¸Þaø°ãÕ_¾3òëù¡é3Š}Î^ôÁ²M»Ln5k ·ÛøØ¢ÂðS‘iZ¦X?°ä‡™7Þ_Ö¶»_‡­åÓÒêÚíý°ËÔÜ´#‹vׯTe,Æ6ü:zé¢éùwÒFTýçzU·wWìóÝÊ™iêS<ßÕªª„ËQ¿zÍ'uþ½îWãvÕõô/‰û&äýŠ‚€?ã¤ý®»2GéÓ=°ßŒ‡Ss‡Œº­æÌö«X6"áâþoãEcê~ *`(«Jû$}ð©Où’´çäS²—1bG°niÞÖøæZ¥¼²QœóPðëaµß,ýù¿}Ǿ_Zý…°¬ÝjNjÙZÞÕ[y øùÅ ÑŸ1û ³óæVn::p\öÚ‘øÿÌo]Yø¶rÝ*¼· <ó\¿ôß§m?(«4.[0±kuêö¯Ÿø¸GD1~ù¹ßÕ²£omÒŠû\9û~ÎÞn»ŽOØ¶ÞØ/`ߺaª §“¦ö­Ü‘²ä~»˜˜©©d—Ÿ^Ýq¾÷ ŸÒ#%²¶í‹v~t”—x~ZÂÁGßõYÿö°âC[ÔŸmôúç·n}{æëè6hŸð0~~»ê>3kI‡n¬ôîÏwLÔo¾¸é`ï‹ßŸÁæ\ïwsÀûE×3gvŠ:ÜýeÁ±Óº‘}.¤E«ô¹>¯¸»nåèÎÐàÄŠ²áƒ——©~è=çËôíyç^í­8R0Qs¨º=¿¨#’ë/y”=yùô‚Û‘é‹}G·y¨ä¶Ûµ·GÑț̻KÏÑwÎ~ùÓ1Ê^ÕÓ.”ÿ4°¶èô;Á};‡t“ôÒ¯Ì;Õùê†ÅÏUí¬q½rÈUÁäå÷5+°Ÿ.píäӌݯ­Ó.þ@YcèQ=³s‚rÆWµ*#ëî,Z>oì»ÒŒ>Ñ—‡vò=Úõë7íƒ÷­YóâÁ⟕l¾Rº‰qn{÷ÚÃ÷¯pczÇÙ§ö$ûÎÚzhü„ƒ\ÉüµC°laÑÆ1‹ïMªŠœ«}úÒá„ãü›_y#Kƒv] ÖP¦qüƒcÏ4a\A˜9Œc—àÖR(\…&âR¹8R= É$oÇ‘V DŒÐd„‚‚h„á"6Ã@°ikM rIÒ¨%)¸.3ŒHh*>IÒ ›¤‹!”ÿ S"Éph> #Óƒ/4B¥Rë´™"CÉh/'YâBMx„kŽn"žm!!¨GòµHè?åR-’I0—Ì!Ð\,Ž’³åDëÄ uŽ9 ¶]Q|»z²pÄ™”ˆ`C‡š" ì"Œ1LçqÂÃÀê› Vò¨ó9œÉOhH4:9ΛÿŒÐ˜V¡éè8y³CTeÃô9„Þ ‹ãœ wn8º¤ sJ‹‹„¡\H„×)Y®N%]’²’’Ì'¤œL ›ò5Œfû5Ìú1R¬Å!¢­†KHÆ`˜µd„YÓSŠFª—àš a)IHL®Z«ÓJ4ò|ÆÄ¸€ b'O®VEÀEb¡XÛ³x‡-à°Á÷Dµ´¡O&³ÃAöV‡…NÍí³Ð=´ý$$M IÛÃÁÐæ¤NÅ[jq’—A… Ãjxáq¡° 1…a.;ñEecqû0,LÀrã£lû0ÊuˆÇ sˆ‡Áƒ%‡rÙ¨CÊq ÃócAÅ*û0ß1-¥„éL[\Äñ:´€Mò&«Lˆ>n”©Sßdì´ÖX>ràœ¥7ç 57÷]¹\OˆA,Ä!_Àû?º]ö·{ìü?<;þß½öÿ[ä±Ûÿyvü{ý¿¶Èc×þµÿ.‹åõÿØ‚ƒüUøÄ¬,­\™•¥×ÉÚ¬0I~>Üü•(Üqùaó@7¼ÿ ‚0¾­üY(áÿÏ»ÿëùçÙòÿݸ^ï^ï^ï^ï^ï^ï^ï^ï^ï^ï^ï^ï^ï^ï^ï^ï^ïcï–- š¾?X„ñ½ÿ'ž?PŠö<©JoR Õæ õ#ü}4¥§V÷X]ò ¸Ë 7™‰=f¦$?߬¥i«Úc54`«RIÕi2+ˆ:Qu¥¡‹NSh(“Ï4 ´5¹‡V/" ÛâD¾q­ÎS@L.W-öd4_QNè  Z¶ˆW–—L¨Al”£u$÷ 'Ô/&úzKÀ³pX;Càáp­²DKk a5jÌ,ø kPòžÉœ®¥ªÅXŒ o«±@¯Ëj‚!:v¨T†:5å¶”‚ s+a±¬öàLŒ™+Äc5Éð\ ra“ß@šÛl½icZiSÍ7B[ruw å#,Œ°"ÂDã éäÂÍÅÁ`661nSZi#2§o/Òƒc‹F± ÈB)Á‹º0ÍSÿÖÔ‚9~A;7ÖÖ¤-Ô†Z†0;+èVî¦kìf³Ä‚ö/,Ý šEAX *üá@³gm1DJDó3ÐÞRãL#òöªÿºó¸sÿà •_›ÇùýÔFÿ—Å…ú(E½÷?Zâáð01O&F1©ãrX,1.á‡q,¤&H[DÞç¯{Üiÿn¨üÚ<.Ú?ã³íïñx^ýßyšGÿ·4%qä´ÃÞëé¿Uú¦ýêÿÝ‘WÚùùMèQÝÑïŮШקuäÔÖl[镪˜¤¹úÓü'µÛVv^½Iüᣪýʳ%Fõ ¿ÏÙÓÇuñ[ÿÙõ±Òƒ;W É)ÖO”ÌíµðBÕ¨“ŸÍT^<0áHß¾tãsQ\ä ½>ªþ×g=¹5S™yþÖ²G‰oÔžõÙøÕªè¢!Ûß8Ó5²ã–ʲu?œ^˜5æöÆÁì+—ößZEÛ‹5I_>ž>´<=&·hÅÒŽó‹>‰z59÷ëYåµÏï]øÒîÖO5m8¼%ìŒ+/üP²°U¿s°-K¢·­|;þ8k,ïÞŠ»½W¶¯ªéùÍ';Âäün?_>~ö˜ êG%'αy´àäC…é*ÿÁOf¬¸ñ¸¤×eüÙ×¼·h׈Cá~~ÓR‚G_NY}·èêÓÕñ©;†õXt)ý^\áyÙhfå;5¿]°O¨íuå¼0õj÷©/VkóèÖ¡TÝ:¬^ݺ¿•6ô=&él°ôsª%æ|WĺztÄ(¼?£:baVC:bä§–Ôc9ÑCáÒÕ¢3eºÅŒ:ꈡ<ƒ¾ÊÅøttÄPŽ Ì!Œ/pH‹¡Ž:bhÛ1­ÀQ÷ Cë~±\è~ݸ'jW‹|Ö ]Ñ®t̶žÁõÙé~a,¯î׳ôØéÿÈžý¾Wÿ£%[ùóÑgEþ¨Wÿ«E;ùcÏŒü½í¿E;ù³žùc¨Wþ-ñØÉŸýWËŸbdûg{å߃üŒ”0ÁǦ•Üðþ ÄmÝÿã@ý_>Æòîÿ·È#Ì+y ¨‚\gp½ÑÀjqâ2‡zv ±|A¢`\$—áxq×È7É ÁÈ($4œ Ô°p›7£‘adÄÁK•2±‡÷u¹8¢ÎÇU¹ùrDœ-gBÅ,†A¨Ó!ÂþpGZ/Åÿ!þ*@Y–0D+W2sý‡ú ÂV¥Þ(†Z ±’¸µiËà !qòiÉsôܘ+b˜B$8$ò„‹ ð¥ZŠ3„¦‰Ë€r‰6“8!}#Œ›¯¤x¨T‚:rmo6d‰«¤Öüá‹©xF”ZªP­!¶GÖÒ™àðÍ$*â¿{â±æˆ(-ÙÁ?”&F(¸;7㓌E˵u@YˆåŒˆf÷meÅœbò•… 1ûqÒ"b îɨ¸´ù9 #9JkñÓZT`ÈYJs\£Ý$Êš‹Ñ,f•n AQl¾äŒO%Eêe2œ ŽŒ£Ój§±IqÖGkÎÒ†l‚• àæ¯(A½•¦B…ÍV[@ò”Ú2gÉÓâÍQGÖ,=TQJ©©½N- ‰­QÞ Š¶ªYñ@Áluä߯3Yoažã£ôrIPO 'Hµ‚º@b:Ö˜°Í:ÆCõÅ¢àâ/¨/Õ–§ÐŦ +N%•KHž=Yc±ZÇ¢ši±jØ 'ŠóëËßSpãPàöW '«ÏSøãRð¸†?ž¬:S¤–M3woTò=‡7ží¡Å+ÌCÕå)|™¦ÒðN”F­½ªX£ôÔH²¦Ö ¾ñõDff"›vÍÐXb`*!•šŠi†eÈ ¬…6Èôr± 3Aëqšt›‹'YDB®˜Óe¢ë°2# !  ·NJÆuz I®•~ˆØÔM#îÿ:ß(BíñEw»¥µ.ÐÑê4zhq§©Ì`®™Qü…Z¹Ò¿q,a´XŠÆirDgŸL‰>´ù÷!¡ù3StÒô‹Ë=H§%»b„mnFÜ@¾‰>h6‚|…¤Cè휚¯"Í)•Vo›Ž}*ù vxÐv“0л`¾eN¯Ø¹ßÐ5ðbé­jOn :ä–¯#¨ÖZ7\ f9Ãå*)u Jqã¤0KèôÚ=Žò †4…pÇMlÙÕi1J€õ@¡žÓˆN#ÏÖëp—ç.ºu}Ý¡:•KÔ’<£A'^A÷ œW(ÌÏqcÎ躧QÓë;‰m>x|k¡‘90¹Q© jµ¢q¼'*…ýq±º:¶cØåaw@„D«%z¥ÙЇÑeWFCljÔ~ÛŒêœÄˆn ¼ÀJ&Ó7ÃÏiÎ&¨YXʤ$„P‡’PŸ05І‘6Ožo4 á oÒ"\‰ÒHôîv{ƒì¦4õÍh”-b æj¨pÊdƒ,‰“QD¨ÌVO2dMMž|4€kˆÊÅ\È‚=ˆSãÉ3=±’0…3Èr)¥"„ŒF!^DéµÉbt²qD,•âRˆ¶éaY"ƒ§ÌWà„u`§MŒôWœ%f³{lò›‘élt±FÜ™†¯põÍŠ6'qÜÄ5-=ÀFö€³=Æt1{ ¡gúè|rÔËu{P° ž~6tf²-°#Ñ÷werÐ9E\=e“#(LæphBK®ƒg*t- ŠšØÂP·Fœd›°Cž…Û¢Ëñ{cE¤l:®Èc÷ æ† j ÛÃýz‘âBZ&;¸R$»=°}_Aà†DáôŽžHÉI œ†¬ÿ­"mà»›"µ¦¤'Òfž Ûƒƒ:óuŽÆ b ö<œÎ•cŒ@hç ÌCí“6iâ6~‚sozˆ‚3tó\<Ü@}³¢ÊI7‘EMK[ÎW öP±]o8Yn}¼F.mþ9‹k§†*M£ ý"s~`e£dÐJ^ã(Ê<ËveÜ$0ó›f6]0Çà:ËlÉúß ä¾» bkJzv>I²‡0u[ý›O!λ=Ïà„ׄ©·Àœ˜V_pK‚`‹§1Jršk¿7ŒbÈnw˜Ö¼j Ò¨u À®Ï³ßW¦$ÛÄM‚§ pâÓ…SœÌtdÏ/ 6¯V(9å&ŒlÓH-çGö€q8-j®Ã"Ó@‹kNÎŒˆ8b‰'6(ø44›þ—½/ªº·jUFÐÖº~uy(H¢&3o™ˆH€Q–4‰ò! t2ó’ŒLfÂ,cµÚºþÅ…‚u_ª]ë§‚ŠÚºÖ«h]ê® (îеüϹ÷í³½Y“Úy?%óî½ïnçžsÏ9÷ÜsŽYf|¡UIöNܹ1I«$Ž2•ze?ˆ„~j†‰2ݲ/ì£`-H@픺ª;»…H‰†ÙG‘ ð_¼þ€'(­ð{°D’Î àA‡WäÓ ŠD\ 3dB2â‰@Ö0¾8@OD«;¦š¢Â€º#Ê"Ñ‘™½È‰¯åb$ …Ž€²E‰Šíz+¸àÚ{q­û(Pi±@$,çÍ;Ò…HÆ Ë“ÌÙ± P²¸r(s ]ª­¤fm‰¤))ÑHÆl~‘3IKª¢H„-…Ei +Bi 6Au8ˆŠ?ƃÐø©æ¦·Äͼ¹¶Ôã—³ÏaõHöWpŠ2\ÿm\+)ós^ê—öДëÀ`à\nE¹d^¹šZ÷„è’½‰Ð1 U°^~º-”å^ŒÁ±¤@5ÊZ|–@õnœ¸¼É¤+‡ÅÈÚ–þÈ:ÑŒ¸ˆ‰²ì̉–õiç‹|V¬¹Š"Ѳ”&‹%eÖÒ.ÒâD˜-çÆ§çÜì˜<–‚™ƒªI© Ú(|AüÚ–•ŸûOcÓèú2*Y­Ó¯h½ˆçâpnÙè“í?Bˆ³‘Òè º”©d>ôHÿ¼˜´Èh°]Z¡1ÉD¿´ô‡MO²÷—’ôô’˜9E ;l…ìäHvŒS?Ä$ÇöéA|bsl$$z‚…äd*™ÉÑ?/&É1ÚP—”䤰›/-ÍíМ”÷¥¤9Ql°4Ç]¡99ÒãÔ-ͱm¢Ð؉÷¼‘~‹äcJÏ™œàWX˜¨7ÛS^l7Y*é×Û‹á‚Y@oÄ;­FõpL5 ƨ@t £Ù j‹Ð^”éŒFz¨&““¡`IÅL%¤*´ª¤È7Ò;ú™.9,£Ãp qX^’q!O…’1IUn·“6ý¾P+ÌVq‘ª¶º:œ‡ªêÁÚ6˜ƒ³ÑH`Á¥AJ›€ZÈ¡NêgUfçˆKÑ*̓E­@»Ì’î ¿+DZÀÔi$’¨†;5©Ëà̰º¬ç^49¡8t1@6ol×1ÊMÊœæªMfm›œ5v¶Èq¼*L/ +ׄéS¥‰CNßåL(\jÊ;ÌC¢Q-©h!ä©N-!u(‰:UªÈvdŒÔ:Ô¡!G\NäȬmI§@ÍR2òStj’·Ž²*PKJn¸Üµ§eàCЦ=å*TÆ•IV™–†ÂäºiT†>E@´îFHìúÅĶP½i†þZE§¼š®c¦È½èÄgEøÓ¥¢q£6Ý1,)zã´‹¹Ð×Ì9Z¬:à–tÚâ,%ó¡¯E×'¹ )¯¶¸¤VÊ]U\V®hªbO…ÀÚ!°ÀŠýâÓU b-H³rj%[1ÆÃët>e¥,ñÅtƒK{ä̶‘¿JSÈ<ªžùtJeJN¦l¶¾Ê“Ê™*)2­³x",.ÅCc°4骔ŸÔyíPº$Ï‹¥ r­æ­Y™aÅùpnÎåý%pV‹ÀB˜r”€,ÕÃk3ëŽ$B…m4Q?XgíZ±!”]m{–0¡~«¯ËBQÐ'lj”ºl!„¾/ ÍŠKJnR»·U꾜ÖyìP£_Ü’fžôæ?—¡*9½‰[g8-ÝÁUfìJÚ¥¹$ï¦À C;=>Ãý’!¡Sœm[‹áŠlKŠ+´iòs$H-9^¡Méý¦ÅtS6W$¶.ÊVJ·fÅw.’úmº%B F/HŠÆ° ö"c­öËsÎH(Y‚§õH\bjhŒ®¦…Õ(³žîA|Ѩ f*ëïí5•Æ÷”>£†:¬Må±ùXâ? CÿK‹ÿÆUâ•ã1ß÷ øK•øoey,ø/ø³ø—å±àÇp¿$Tà_ŽÇ‚ÿÒp?[Y þû‡ ü%±ÿr<üwø³ø—å±Àß3là/Uà_ŽÇBÿÃþRþey,ð—‡ üÝø—ã±Ðïp?[Y þwø»]ø—ã1Ãßã.ðwUð¿,þìPߤÊùOŸ$øk‡½ br8‰.XïŽÊ±îH(°ÀÓ] %sn,Qx§‚?/º„¿$ò.Adÿ9Vt³;0®Œ7éù/‡¿ÉÐ$3ìÑâDà¤Û?¤4þÒÊ×v3è €i–;å¨öË& ¬ëlP±NÁRXH)c¨~¢> :‰mñ— ûC‰:éTŒ*¨…Rš¡5Pƒ`¸«Ž:/ÈdÔB¾hUkH6R¢hT0ZMˆ![ÛaJw˜6·/úó¶CS¨¶[Ï$]B‡ôË^: Àìö3]Q_o7iQÍDˆwypÞtÍÀÅ—X¢+Ù·X^Ü Èh(Dš#Mý±yK‚x÷1¼×Ûot8²+ 8,À:›­ |Qº@L`‚1eðÙ’˜bÌEìZ˜@0 +/ÔÖtxÕQyS§Ê`É¢Œ ¸22/,TwÖ‘²Ï˜n2®£ìáè²›íå±þìÄÜÔp#FkBó"+šÄrŠËg'„ܰCÓ6aõ‰xw$Z×>Ã1säøR9ÄŒ?¦ ¾ëèAÅ#u!È[B²&’=£–" ºäÚ°§v¬YK™0†ÉlEx"|3W×îªå²;|];çbŽZ ÂõF#°ú{ˆ#”P#¾uGz¹|Ä’tI0R®®t&BG1P’™ÓØ:}ö ­Lý¬¹ÌœúææúY­s&֒诈Ðá=½!ta³ÄúÂq9efCóäéP¾~RãŒÆÖ¹ˆÙS5´´0Sg73õLS}skãäfÔ73M'47Íni@ãYщ§µóèF'ÄÃK5‰0ÚÚú˜I-S˜X¼?¤eáµQj ;9ÒÛ¯ÚÌ©Ë- ØxvS/>m5h›©M‰j‘)õ¬£=±Ú¡Þà y,ü7Ôü¿¦ÿa+ü9 üùaÿŠüW–ÇÿácÿY±ÿ*Ëcÿð±ÿ«Øÿ”å1Ã_>ö¿ø—å±ÀÈí?y—ÿ ÿW–' þIÒs}8œûƒø3/ío6ý//áÚÐô¿Ñÿ .©¢ÿ-Ç“ù¢¡öFí¯Ub(¦hR«}³,¯Á ÙÓe-oJ­•¡P¬–aIº×1ãǘõ¥>Ãjï3aÌ j[»ñ^ºFÂ>¢qÀv2ÌBQÔ^h!;6㼡ú‘tqÁRE&EääHàQ|Ò–s8¬‡%ãuà㲌ǽ´1“Vµ)Ñ ú™™2†g¦*÷²³jYm#€¨=ƒžÑZ8ÃŒëb}TŽUç‚c4xº %0†&üˆé4½9O ›Ë²e›@£Ï§¹î DsœUÖÖ¬NEõᢄ/ìDu¨_Ÿd¼LŽ®à_X½Ð®é#{}QTl|q_ñ`ÈÕ8´¶aiJ9&3drœ;ÎÖÜM‘‹¿ yÃ$$±`W˜è¾ãögj˜•èÁ1Sh2¹ ·5t%¯aob Ñ¹ˆ3.„5,P¢²ÓÈê¶§ª8VvÀð}îkAÈiBˆË{YmÍÖl¤H:A¼f¤¤;z®êÀö¼ˆƒ4Œ½¹šŒô+÷þÀ⨶C '¸´ï1Š€é]óŠq2ILÛS  @GȚƧþ]ðtªÝ™‘° áqqÆÂð ýú!‘r0FJf™"•°ä6UîÁÉÐ&ú÷ƒÍhÐàs¾¹7®¡†®Q]œ$o_˜¹ÀŽ¡t8*†®…Œ‡a6vu Ä©‡ízˆÃ)Ѐq˜†B¸[ûq@,:ŠÚ%‰%~G¢ADzƒ”ÀGGÕ°ÐÃ>ŒßêDÊDd]û&?J¶Çë ÑŽfœv¼˜I!ˆ¬´±¦ \©X¨#CGþ-¶‡Vôµ”n`ÀƒN‘C2"£…t¥Ù+'zÒ8Ôk;\upV¤ÑÓž•jè\j’m„­–N‡g“þÚ4\ªañ Ú§˜¥q ‘SPF<‹¸´J7nãJUשaì“`ì„Ï¿°­fv8Ô_¾‰¡]/Õôˆ íª÷/ G–ÀÖ×%Û\©¦¬X w&ë¸óÛ}щô”DOo.lF¤+™ùÂDr>W¥;ò'»®Q[hp§Vtƒ2A‡¥"‹òˆ™btÉ•Í+[ýLå ÍªÏL+E"hD¬‰–Ý…[Ö’£óêA’“7Kµ;4ëë’¶›Œ» õ„Æêý-»ª&C,ƒTÛP)œ@ªh.ÔÀDP(ÆT)~•}*>Y"ª \†sÖn:`„@£T,ÏÉ—¡UN¬ Mꈇّ¥Èú¼ñ‹x²/¦”]œ¯ºf„^¤[üùæ#ƒ!Å~¿‹u&Bù!€»P ºƒæ”Ó~ê‹>en‘ºVa±–¸A ’A ¢…n ZýTÊ¥ µÂY—½›,{» å¾ FiˆTÙѯ¦e<Þ(œ}ÒéF&®)Ò‹ï2Fà,w´™m¯7…±Uœ¦k#5~3m*mœ’¼Q *0î*G³¬9:V]¢fŸ³§Jˆµ¹°vl¡HJ%wóö“œ¦£­ÍòEBääš‹Íé¥Ò©¤W©PôÙ+]¨-Š·Æ!g޵Éê*—0…£*NQ»vBâµ$ot2„€Åû>7Ý¿åÛ˜ùã¡eÓÅ?Êÿ@HÅ_Çô´báÔ•·7l+Ơ𜷤NÑåõAE`/á>H#e—ö ^îd<Æ}› Eº²¸ÚnT7,.ñŠº°ÐíB,tµâ‘™ö[SôUl£l‘V·µ^{+½È2JFœI>t>2’ˆ+1‡³ØâŠ@Jˆº»C'$ )´luß^m {~5 mE—•Býyî|¡¸5MŽ›ÑÅ’ cVÖ’EÂ+KµÅf½’?Òñ]©˜®¢jáx›<×´Ò…bJ-aÖL41eTK§ln€œ&˜éb×’n9*'c³ñD9óŽG†–iKå-'LÅã^‚wäœÙˆ™æœâa"VW ÄŠ³ÛPìÂóœÑ+Cµ}OqŒÌœ†DDoA–1ivˆ…¡ç¢I›’5Ñ„(ö¾(Y«. 2%Ÿl§9Ø6K»)Ž·IýŒ»d{Ÿ`ïÓO¿¿oØ©«Rh*ºÌº 0iï a®NàbCýL"ìÓÏÊÓí[åŒû«ï?{e 3[€ñÔ§’3ÚDhT$K¹"Ñs­Å&V‹\˜àô%g2 Ú=ˆ6›ƒ|ßAJVX9–ÓGžFe™Eci¬`h14MhÑœme Æ£Y#JšsЇ„X]±”˜š¹ok_•>«&¿%=¶ó¨á÷| CA£·½™VO—pÚN؇SÉ‘Z…±eèRôNf0fäf³ ¯´¼ž Î$Mw©<‚TCA@³àX⣋‰jóKæeÄ#Up¨Ÿ“9Ô¦pP]&‘¾Þh°‡ FÐçò·/\*3ýø/T$ÖØ‚ŸZ“ªåûátq’ä¸èÈôŠÕ]¦BþP$&#ž›Á)‡BÁÞ˜¼spœÑ~ãÄEûŒo¦,cNæ¬O…}ƒõK ‹cDÓÏÄ£¾p å~ǨZ¡T—,[þGNÐõÃ*’Õ Ì (’‘ &?xª%"¡_„|ýr” oL^ä1f$)„è/’©a°¸pé…P¿¸Ø5W;þa´ÖÿÑÁø"_<ÚK»ÃÐ `ÃSo4ÆLE)Ú±g¯þTç8úDÔœäa®K+À2±D£µØ  Ìèá E|²” TÉ“NHU27¨×@?­YF²iÎ3Á+VƤ÷™L²Q!öh`R ÆÈêëéOôöšÆ I¨ø7&iªY¡¸)‘Vщ8L½I µ².•õá_e|è›"õ+LQ ŠõSq6*Et°ø³'GU:ü²òYÏ‚ °YÚššJ Œ¨RÈìÑ14é t"s†‡Àü÷„dŧ@SK ‘ù{£ä ƒ‰Ä»ñri7ðSS‚±8nºQ‡Sýšš‘ ÝjUI„ײ6¡ë#×8~¥;ãÆGžŒ›0aóuÊhÈÝÔÂÌg¡ï‹ƒ~d“B¾pWÐ/D2ô¶SÆà«5ÁÔñEë]ÕøñÕ°#…™ªyô¯Ú1K± Ò#P¦¤ £J :è*«ü6ë€$üO×aÙÀ@+‡6uLS$ „ `Iw Egä<F%é~ ¡*å UêÔŽÒ7I ïZ.RèHœ«u¹ Ëð¯ŽgS£È¢.9ÇØ³‹YÚ?²ÄtYòa¦ªYò¯†ø)šÕó”áÜÁÊWö!–åÈ«²¯W^5¾è;v$c7Š×evSN‡‡a9V­¼*¬Äy#:gT9ã!VµcžX+r ùÇ]«ük]°!ײãÚO’¸Z€?I"ÿè¥Ê%¯¤­H»£ð (k¬‚éE,g²®Z·àMÙtÓÍsÃz5¶Õ*øªL*¾r¬þÊ™^3@×Ú•â6—™V3ÏÃòñº5øw…‚µÝ*À- T –œX¦f“`DŒ„þI’§Ç-Á¿ïe´}VGe™«Hà…….ò ç‚åëFº#‘Iƒ-Œäs^Þ9¢e½Ñi²¦æg˜-Ú'Ö$ÞÙê"mãÁ‘€Õ­Ž¥=J·NJV¿2Ô¬ âKŠR¬—¡iKœ¼i+ÜËxõ7Öø–:ÜT¾¨Ä¹¯a•—\"”‡¯å“hcX•f9`•ËmÚZ\^òÊB},ËS¤ƒ¿*Ö°äc$ø©ØçÒ±Šƒa„r€€Ÿ<”„‘•å  ¯¶y!<=:B`ób!ø–Gåv‘M(%²±’GWzp<²VJGñ…ÓÞ°WÈÎUhCy" @Ów¬H÷-Éô]ËòÁ9ò‚n’PÎ¥]Ž;™ç I9FŒâômŒa›¶C~ %E(V„>hs‹pcY Š¢Ûð–BåS¹]„óg3zkŸsä%Ì‘Wj9É9)E;»y Q_дzjž7~<ãlItÄû{eÆyBs#ý§jL@pü|CŒîÚîxO¨š™0kÒ>Ÿ /t8ëgÍRåÕ|EmÒ”Á¨X&ºŒÜ!¾ØAV±”.es–&+J&†3Yàè.©¸‘Ê‹Ef^á'Ù:a`%ÜFËKŒØÊztä#`Ö±O€y aNó¬ß.z» è¼>ÇyÁ0†i̽EgÀc ˜zê :r´|®G™92*xU¦J¤Š€XXÍÁ‹Ó\†%ʸÅñb‚“Ù¥“›ŠKø‹ó0:´¿³Z¹"ìïî‘`#®»€æÝ Û쥤@àôq_ÂýßCÈ"a€ÕÔòËä‘Ì(ÙÏÜ"¥¤¤ Qã|é"ÐX_ÚƒBë<ë·K+<Z!ðT¢9ªË›VH΀‹5ЊP¤«|$B…2a"gÒ’W]éG ÛR7¦#Åi.ÃÊ)¥Ò&5'ÒP,1ÚS(Êóf)š¥hîR¤edÝ]’ŽÒ ={qÒxò! ³AJF3H¤i¸è­«™Ç3n7# Þ‚0Á¦ê*-)PÒg5H ‚i)¼DäÿüIAžõÛ%^£T R(!m)ˆt8)Ãñ`¼¿ŒhZnœ 猼ΰpAÔ 8Íe’$WJj@ç5‚šõ‡_B-_}ðƒÿçtÁÑW¤ä¯@ÿ–”ÿ'mhl§ƒä$ÛçW¿mñ¾XçD‚uéò­›#¯ª-á/êØño©Ï PSjÐãc“šRÚ¤ÖÏóœ úí‚B*¥êR£t"º$£tB^uq„¶) ¥V`§¹<Õ˜‚Ä™¥ßôÞ !wR­ÛJîòTahx“j9à ʬŽ7 ¶p(vùçX‘¢k`cðLuÀ’Hx{Âã‹:'ƒ7 8`eП“x*Ëòœz`…ÿrŒ ¤ž’ò:‡Ê‹pë¼0Ãk>¼N~õçL" `U%Ÿ j‡$E¢’)‚+ñnŹaª8·IBÔñ’sCO Ú­ò¬ß¶¶ªXXGЂו5HàUàYú±‚/±@03­Z^§‰Uö‚yÕŸ3( •ñTE™ÚO$` è xT*y© #”–q ŸÀë] B¤:Ux8褧 KV¿]P°.ƒ4&âYv „?v»B”¸.ÎïF‡å“ÁÔî+S%!ƒ/júmòêÖ^Iawzízv¬8ÍeX“"ª á;•¡óI˜]媟¡¢uñ¨ ë¡0”T5Q*÷Æ‹DÅ*¢ŠUij«ó "žsè{º ' H áò¬ß6Jڶ̇™%ÓI·„¶Zºæ€¼êªRئ¢"53_œæòdæE·Y‰‹‚‹ñEkY꤆[ލÃP‡¾Š‚òWäJ®‘ mè²—Ä54·/Ïúm£NIMPÑu#6$ðº¾éfkX² {¹Â›Êe`Ï1ØËùb197ªûˆe°jÌ×JªZ/´)T{¤…w +dÇq‰tÇ)±öHD“ oÜ ”^ÉI/OÜI)W!¼¥>UtaƒÆÛ ¾Û …)æ^yÎ,øˆÊŠ‹î¸¨38 4SE/S¸ ‚—õ°cŠ‹ëf8–eOt ð ž! Í 1GÅã®´¸J‰x‹²\×ÐâaW®æYΠ.TO@­«/84œ„Wt@†‰ªºÄê Ú†á<ÀkT/ÐÜBÔyÖŸŠÃ‡ê¡åÐ{Þ­Q_oÌÓëþô–8úÔ’÷,Öäпm˜=5•[ÛÊcóÉÙÿgO g·¬èå3½ÿOxÝÿ/@ÿŸÀ\Vü–ãaÝßÉxIîä;|Îÿuú8É'ºÄ uÿ*OiŸœñ¿7ЙkYðßíâ,þŸ9Öíâ+ø_ŽglÓ”©5l-ïûÈË®sˆŒ‹‰tœì?Þ9ƒúÉVivN †Ðë¥s*®•)2zØŸ0w}Ù×ãè»bõÿÎŒ¼ìùѽ[ælî>äâMìx^ûQ·œ%ÝU³oÃiæiw¾Þ°dûwO L>nñª‡Îmßÿâi›}wý=|‹ÔöD>¹iûå=[Ÿxâ•¿nÿçÿ­ÙþÙ_nû®ýÝ‘ž‡Ö_öÚÁ_¼ðjüÐí~ô×|¼éãÛ–ÎY3oþ—Lþä¦_\Þ³}ËšSz'>¸æž¦£¿Ý0ïÝm[z¶n}ÿÁºU¯=ö¥ÿÃÿ¼qû–m‡®úèùàšöµ¯¬r®ò={oÛÓ [–Üõ—¿lû,xƧW?Ï¿ïú÷mß~¸nà™þ³¼ûývŠëè-üJïÈÃ7þ»éÂ5Oí±îO‹/ù÷3§?çÃ{Wnµî£­[zƒçºtàž£ä³×}àæs/ºñÀgß_ܵÏ;–w\ù›­ç_ûî;óŒCŽ;÷Ò ×ÌŸð¶üüËOí;qŸŸ?åñû>š¨¿ü©ßì¬>òŠ]ywàÜcG¹w=þð©‡ÜràŠIû}ÞŽ×O=!°ãkã[om»n̯ͮzgŒ²“ë§;ÚðãÑdzOw¯ú÷•&6ô_ÿÒ½Î9²ÏóPëúß/ßk×ÿfTÛN79ùí9?9£ëé½6?ta­ø‹àŒ/Û°ç¶ØÜË~ûÑÅí¾ûKsÖv× ?Ø}Ì ÛVwßñ·uÅag®hyÃ{Ö_Ø—ñË…;¿ùñY›®¸ïÍó~ղå{íùö)'ÿyÝnÏ/ów4ì~ÿ>ÞåçÞ"ÔNó̸"ôÊ¥3ŽûJœ{É‘-G\rÓùoMÿùï_z¶aï}Z¾êÖ%®ÏvÞãÅøýçD÷eï;uÿݧsô§_½vgñÌS?ºá˜^ÙcóÊîc˜¯Önãvÿ.´½úö«>ˆñÍ95Æ?þÒë7ø¯×ëäÛ¯Z¹òÊm§-䨫…à¿j¹»Ê{ÇE[Wß;öžtÚã ï´<ÑýÔ_¿`ìcž_¿ÜuǶ½9â²c¶®^wðâ“?<ì¤oGþØ¿~EýWJGo¾â¸š1ÇÞ°â¦/Úî=¸úeM¼å†»_^ÿîy¯N ¾ô§?Ö¿³Ç©oî8cýï¦W­Úåè­ß±üˆ‡xiêßîž?zç{Þ}¿åñ¦oϸ6¼Ë見o>íƒõ3Ÿ¾ñöÕ7îñ?[z¯9âõ£6\öʪ›º$ñÅEÏmØoå['ívçùw¬óÇžv@õ¯·Ý<öº·Oúzí?æ÷ÞqóŠè'77Þ~ÞŸgÌ]½ñ÷û|sݑ犷½¿nÙ™¯?ïsØÑO»ïÞ¤Kø“SF97…. Ï»íPÏŽÿ:î.aß 7¯ÙoþE{Ú˜§ný$´}ÄQ^2æçsëvÚ<ï¼=?êÓ×öéÑÌ´ðË—íÕSŸ™ùÃEgÞ0·ºáÅ Ó|þò}×õúoÚcüKoÎÿ爉ÏÇž´çŒ×nõ¿xÓYWn©þ]×IO\T7ñéæw><ûáöÕ}³~à„£.;ðÁª‡¯yðeÞã{®õÞ´öî_?¼hõä­ÿæÚ­‡œþVï“s§Oï¾ý’+^X}ø›«ÞÙ³÷u7O]ÿlj/^yÍÄM¿¯?}ÝŒ3®»áÓ·'^Ó$úâK–ïÔáÛûúšÇyá¥F³¿¼õüûœ´wç®Wî4ù¯ŽÝïá7Ÿí‹Î›ûøµòëÖÜô¯/øÅ;œ³iÁuþõ¸ßÛ?ï…¾é=êÁOîúËÌ ]rvbí¹Oíµzׯ¿¾lúU?ûåú=êv?ä¹Oï?b‚gîö[¦5/kyqöUú¿ý§{ö=~#¿ÊuÑßßzàÆU·ø›žývÝYg¼7¸þxÇÓ‹jöuú¸çŸ÷·f9üQ°oߟüõOkÎöÌž6ÿÌã?¼zͱDäŸÁ¾ÕÿX?ðãCþøÊçó·ÿîyaIëÎ=­=hÆ…Š´ôýÍ}+~¸¡ã½'VsïÎÿÌ“-¹tÍ:e÷ÙŒ_öð/W½ó +Â]¾f§=&´výý· ›.Þq—[NÙtâe ×­xöµÛ›÷¾ú‹»nÜwé+ܯ÷ÌÛ'=ûOaÎÑ\ÿÕ]kNþæÅhbðˆ–‹Þ{«5°¶íž)»¿~ê3ßíÙ{ý—€È¨lUð ·7IÙæXÉëVÓ}ëkíï•(p:gÊ oR¤!îWcíg3ñƸ ñÉã. Ɋ׺TÒø[äø<'ì°Œ³Uî‹Ãw }ñi-äSV ŸLE¬H^`KubœÉxlž—$°.ú‡¥8ú‡4Öîœ _’HgÚÇÊHxm$  CÆcœÇ1fžƒ¶ÜΠblÜð)kž(â‹ûB‘.µ ÞÒ”Û2iÚøÎÙM3vÂ¥ ×R Ó¡˜å±äº?«˜³0OªIžâôÑYßÐÜhÏ9‚ÃÙ‚…q6S•Wî!æøpþoû&`æó—ùþŸ$àù¿(VÎÿËòtȲ,ºý¢ß'yE,ùå¿ÛàùNÞ+vzCÝ¿ÊSÚ§ü·}0 þó‚À%ÙÿðRÿËñçþß•-3>èyï·s6ïÈÅ]ð“—_¸ÿ‘‹»/yÿë—ŸZÿìÇþzìc‹.qMºcŸÃŽ:æç^ýÅҞܛ¹ºïï'*¬½eü9§=°¨zïU¿šôôÙ׌”žZT»ïÈùÕßÎú[׿êZ¥sæžcüÕ}ëOî»ysì‚ÓÏÝ&6~rMM뚯§¯Ý0&vëMÏ=¶ß«ã~{Y æ‰ß­øã¨G'ÝèØéöÑoŸ4õ÷—»Wöý=ü×MçÞ8áó׿®ü jüãÆÍ=kõï¾YõÚCÇ:ÉÎ…;_½õN÷ȳ?kZºaÔǾbÍã÷/¯Ù2òg¿½oÜÒcoúdòîÏ>5úÄ/¿èÈ÷–Fÿô["÷.;¢só½Î=¸áª'®¼mão_ùæÖݶÔl~æ®ÉøÕ­SþÑô‡¹/»ëYæüÑç>¹}þ¸ç[7·ž9땱wìvù.›z|ÛêÀ?^Xq«ôäÿîã¹ý†k¿Øi^óÍ;,™sÙž57ÞtùÚùË#ç׎_zÏ£›§Î}dóÖ.|ûòu»®|½oû%§=ï;rìß/>ë¤u_ÿuÏ–¯¶_¸Ã~|÷þ=¯þ¹vé^wÎy`¯ýω¼É×綠ð"¸¸î»PåZq®»°Æë.\¦ë.ß§›-œKBÑed¾J’EëSØÖ ƒ‘¢¹Ì·krds¹×’â&…á²Ãp½IÁ{ÒÞ¤ Yå¼IÁg¸Iár É78>é‚Kò$Ý@p‰É·Rݤp ž¤›.wò­ ]ZËyø¤./Fq¶~›âk[òm>Ëmˆ¶jϦ‹ÝüÔÓÞñóc#˪S¥YnD{ÂþKuö ÿçBû"ÿ¹Ü<µÿwWìÿËñXü† ü¥ üËòXà/ø»+÷ÊòXè¿w¸ÀŸ«À¿,ÿ;‡ üÝlþåxÌð÷º† ü+÷?ËóXàÏøWð¿,þܰ?W9 üùa¾ÿr<ø ÃþBþåx,ð‡ üÅ üËñ˜á/ú† ü¥ üËòXàß1là/Uà_ŽÇBÿ¥!÷ÿ¿þ®Êþ_–' þúÙ Ø$&_¹y{J~Àéí¿Þ 8o‚?çbywÅþ«ÏðòÿT‚áwÅTÅTÅTÅTÅTÅTÅTÅTÅTÅTÅTÅTÅTÅTÅTÅTÅÔ÷Ø”®²çÊÍ¡ î¿È” yÆðxÈ›²­üö®0ªbk+(Ò˳YiB€äöBy€ 5t" !Én B’ ÒùPB“†@ªú舃€ôÀª¡(U¤ <ÿ™»åÎ-[ïî²Oï¼g6³¹L;sΜ33÷û`ŽaEp&$ã”¦ŠœÂ@A>!9ºÜoöûÉŠÄaýÊ ìá9|“›¢ÂÂXŠw *G#(páöŽ ”E¸´BÈ’ö¬ð0é/ÃqS|[±9›ž4à Ìà6¡vm;È"M&Œ•KÓKaù 8É:mÈ"mÀY0)¥¾sˆbN!xçaâÒÐð9JV¡ ðï)ð=¿Ç 4ø'ÅO[8³À÷œå“¶ ½?Yh´UòHÛÎÛNƒùƒd½Àfñ²|¯š„áe ¨JÍk&:ܘ`’ŸoÅcͱvr0ÿc3Y;cC<#%vUÈŠ¶TxØ-î¡É'Õ9Ãi" ‡¶\Zm]È„"0ym<´B.AãAÛ‡”g…Ž1–Oœ>ý ºë`DÐ'ÂR¥MŠB 4á.yW¾»ºM¡ˆ‰,màháZa¯U›7’<¢ÚéÆôÀé´µ64š9ÈÁžÙ4Ž¥Ñ¬7ˆ‰>¨Ìf"GxB¡Î`<=Pd2Œd”@iÞè*¥UWÔüñœ°NãЂk9\çIqÇŸ‚Cˆ‚'‚¡½ö§. ™lÕ"2»rYZ@jÐe/Ëw{ö•G&,E4!‚ 7Œ¢   Ââ2þ5«· “¸4„sÒÒ-fÕËò=…V±9 ¶)W5 ÏðÎN•†à‚8îg­àÑHFfÈ,³Ö1ì¬ßÊw{…ó•VX º}%&aŒ…ûÊa‚“ÀRÃvÛDAQP4 âÁqÖª5þ•mÞJf5!™Õ¸QyY¾»¢¢g'h ï@´§%ÌpÍ íw§ÄÚÛ°>±¢­±ôÐæ5€'Åœ.‰öªœLL TÉ‘ ‡DT˘zÎÀßÎöG[8!þ ÃpûsÞ;0v @ûÀˆþ¼iÃãÂåø}5ÿj·P…]ùñ‰¿àoœÕö¦pwõšñツ{Ì`î1̈HÇð97–íèi«ÈÛ½<_î—”'ê˜:º7ª¡."T¸òH$DqÐNÀût`u„jÊî"¼ÝZ"¤“‚½"xdÕaX3A·ÀjÃüëðÃxq5Í×2Æ ÅÕ÷¸dwu‰EÖH ºœV\ ÅA\¸1…™3¥˜ÍC·:Z»a,ŠgÞÊBß`ËA|o-Ú«r¶:OO…âÀ2œžn½)PÒ!“@©IÉY¬ˆ’G¨2¼åÉ0‚ÓbøNò$Ì à°²øyŽäiH=c“,”%z:¤AÓ&œ7…»íôú*>±zw6›7 A´"œƒ`¬å§¤ç ¸õ·žƒàþ6·°^>ˆñ‚pŠk3º^•ﮤ8ÄôÒ@ÑAK‚Õž0áF ÅMJí8»kíƒÍ£!ÐPæÄà>©)*Ñ^•“ùHC7C•€±ô(‘œpxneízÌù@9Qqæh‚>H~øUIA¼¸1F Ú„«×¤¡^î®zòˆz2p×X;g…Ó]-ûnîŸnŠ5úR3q—WNi­­kÖ1dq½X dÅ›ÂÃ.î1¨7Å·Õyû0Â!€xÁ"A«Åíñ€C‹úr6õå5ª¯ÕœÙL<ÚË0—[`tÚràO fàæ0nß§°IÐ&#šR¼Wb/ËwWqÌŸÛ Ã!+ m#Îf Y{à“n.zêÚ«òZmtAÌ0S­K¡d£MËÎ]_ˆË3…×;†r eù 9¯w° qI‚’—$¡z-ë7…»­'nßlôNOP2@hçÅHæÄØ>éfPîHO´V¥ayAöØŒ Sºõ:1Ì~ÎØrï•E]fž) +Y]XËâ¦\[ÿ² Â9Ë0¨åG„C A²6eñ´p··Í|e »DvÛJÃ^BmµV!{ 4IXðƒÆÝyÎX.ñá~>U‡W Ù©·xQ–ÜQõƽ÷®|…¨5Ä„HK„ÈX„È*„Ú” Æ_ ”èì‡÷ÄÉO´é–…»íJøùæ=Ž¬ï Ž#ë;̉V>©É•Ð^•×7îyÔ•°¼')ó¹…@Uó>“]ÍÍC=³ &ÈA ?ÀjDù—®V!^2ƒò ${µ”ã›™þ)üéÓ•ºÿä6Û§29ÇÂlüŸ EÒ8ƒ³ÿ #(ÿ)ÉDI–‹åHC2fJ 9‚0ÅÅb¤É—`zÚíÓ““Ûúï6Û§2¹Ð†!”øoÿ[×ÿ'ßð®Šêz¡u™­×z^®[ýúáGi »|U÷èΔôúãr ^\›w¦Öîm}¼ï»¶SKDçLÚ†µ­6êqÛö1ÑN¬Úópë)öÜÈÉ7. ÜyòÞ¥ußÝÈX¹âÝnÉ‹?îºtkêë ·^ñíÑR£CFÏ#¿©·Â¼hMÔÞ˜‡›Nå;Wx£R•÷·÷ÿuƒ]=ü·–y7ÙlúÓGYÅvl<×ÿDÓ»¿åú47$%·ü”ò·: ?1ŒL‹I®ùðjÜðG»&°gf~qtXÙ#…Ý6ÿ•h}8óXêˆûÿy?zYÒ÷g:oy£]¿sO"§fŒ(½!’¸äʰZµs+UÌ\ú¹¨Ëó¬æcÎÍh9æâ„âuû/Y2zOˉûÆ#¾Ì4sóµßh~åÚÙ¾ß^X¿>gõÅß»GŸ½ùî¸j Æ^Lk|mݨŒ“½JÏmÓeƒ)µvaN•Æ…+B›5ørØÜ„ÙÿÚ[yÚúî_”:þKÙ”°6Ý£‡Gæ”k¿ÿÙoÝß3áão–Üwóàím‡ÒC¿“6Í\·°Òì]^îJ^?]µéömXÃuþo«Þm\æ§ý’Ó³¹qzòúUϲölÏ+Õ{Ê͸½:î•ïý9eûÄÛ“èB¼óx؈¸ýÍw¼ùÒÜ4bÀ/5Ž'ÊfŽû~aÎܨ‰Ù/,Ú–ÿ\³ÊC>ÝQÀ-ï¿z)´Ó­è¸'_:þåÚõ%éÝÙÏV/ñú©EÏÍž½Ìp9{3·kõå)!uG°9o\Á Kª¼R¾|ÙÙÕ¸ü)§sWw=Ù¹J7\:ýâÊA©×*†ì~˜\üqs›\sÖ̂׷ œwü_U"¸%™ËÓðc_¿ÜŒ_W½óÊ;TØç«Êq»;íŠzyTÄòŸîV]™Þ>oÁÚÒ#B;^ÿ¢äÔ? o–œÙéX§mÓï—<¨êÒsaWþµðÚ“wG7ýãµúDVïÐðþù‹û_öªÔ¨ËJ2Öø]Ã^mßW;¢rü‡“jΧ+Ä%‡N[@óÛŽ‘õ²Þ»úAö¥þ#‹wø#¹ÒÂz»¾ùw—£#KO5ôª˜Z¥qÁ¥Ÿ­óQ«EëÖý¹ÒØŠùâF”(9öpQŸ¢Ù‘oáÇ[T(S¼Ìåñ#;üZ®\öÚ‰»jÍ›ø|ï¢3íÆŸ0oZ qyvZÆÁÏÞñÚŽí »NôBQóJ×sêO¨ñäÔGîmÌiR"¢Gç¾ 5ç¿’¿¹Iž;Bm¥D5ûcÄåN¸ÅDç}ÚWæûqȶ݇¾ ¿Ó°ô¦Cy¡eךּwaÄŠkÂÿ/´¨Ø3~hÎô•W .õöã¥'Þ¸ò]—®K%µ.h¸f_Ý›7¾·æPÝå¥Î|j¼EŸZ7¸YÙ»Úu«Ö˜R+/ÞÛ`[±Xa·©;¹ƒ­ŠlßÿØ3‡øÅ{;Rüq]nüÛå×ZÓ}h˯.,9ªyÄäÅ9ÑËæ7¿÷Ÿ&mû>×7ôb/0´úùx©¬B>ÛQ»Eù&Y‰)Ëâ› ^zÄôÞÛ§gEmyqdÎä÷cÓ^›w*£ú«ë /Ý=3ùvþù[}.¯­Tjÿ㾓^>mx°¹ÉŸ¢ çŽ5$6œ5¨x±~SÉW¯õßü[!7ósÊ´üëÕ£öß{nÏBfÎŽŸ}\³ìùmÅÆ}Ô®ÂéEå×ÕÉ;RéTá¼:Ï1<ËhvþꮎcŽlk”sŸ*ŒÚRû5ó{©_a•wn YÐniVÑýŸn9p­jôœ‡k÷ ø£Ñä÷ön¿f¾¼¯ÔmõoC’î ™¹s}Xãñ=ÛâÇ «uHì4û÷¯ŽÜ³tÓ…ˆÌÎÅn¯±÷úÔêç2{õlý,QŒ ›]û£KkóËäÆ?3#*'¶ëEùûN\žeÿÈÝ1¿Ãgÿ½Ðô‡)O–ß¾12?ws™[ÝþkÃè1õ;<º_ƒ8ÜÀ|éÄÅ='ÝžþAË {²Žß?|w÷:Ï\jy'äÕQÙcòþâÎy@ükÅTð ó/2ÿ2ΘK[Y‚­üÀ¸¥2œú»±Ã÷~àä–p9§Œ¼n¼µ¬˜`…{–wM§mqöš¥'lÀÊFÀ+m,Ü å <ëj<\¿^á²1„³ÆP–?aËÖ9i³‹{¬.›A:kÜ®‡—áé¾ó1qv§Ëeäæ@Ò†±Xn]Ю$£¼¸â²zÄãT!‰f AOM`I¢…?’$šuB³<.'W&8¨ Òïp–T~G ¢g5’hœÆ”„М’ˆš`)%ù3ÇaŠçÀÿßá´¢btÈ¿£e½p[NþÃ)ÚBÀùnÿNI:ͺ >ÿÙø±Õ1ì›w¥üÀióòë)¿‘N“ "~„Ó2þ‡ø áÐù’dû?l°È_çÿL’éÐðëüÏI2ýç‚Eþ:ÿs`’Lÿƒ‡ÿ]ç H’éðð¿ëòH’éðð¿ëü¿IRù3ÁÃÿ¨óÿ$Éä<üzü$“Ðìÿèñ_`’LþO3þîÿÐ$£ûÿL ùÇ'ÅfdÄ÷Nq"RãÂë_ýM鉿˜ß "P(`Ç÷¿p†¦H©ü 'hýþW RpñBxt û:ÿ§Îÿ©óêüŸ:ÿ§Îÿ©óêüŸ:ÿ§Îÿ©óêüŸ:ÿ§Îÿ©óêüŸ:ÿçߘÿSÜrÿÇ0Aýcø? a#íl GPvÄ"ÍxÁÿ©µ"g,S@b„ˆ0ì6ÛÐ+Ç@‹è+Z–*’…ØB1-‘òÛ&bbk º«µ}6 U$W7›„Iš„¹Ù$œ›T߀Œ[è0¶±vbMGÑòüak<¬QÄî5Žr^%dOñU½ ‰Ôë >7‹¢q¤¨È”$µÂ¤Ü¤î”JòH©=Ò‡:„qAÝ\•íg­ˆ: í¯™¯Ã$Ç>-SSŒ„FÂ$žé-xœÓí}Ît‘Cá.‘qsÀ!˜ÐÖN† ïñ(еS‚eD} íŠ·5Ma»Óesh´9´{Í¡H¥Ý‚Ãå±ÝRžRƒ8‰«-õ¹a´Ü«G Bw$Ç&)ªÈÕ©MqF­PÔÞ÷®¢DNŠ­*Â>ydS|F­,ÀñÙݘÃIáKŒ†¼÷Ȫöy ¢cB“(;X0á,kòüüßs (ççÿ˜ ÿI¸ÿC°Âù?†ãúù ‡ÑMR¦„ø„x‚ÂãL,MéøX‚ÁqcÏ=íöéÉ¿Ésý÷Ê…þ“8K(îÿ`ºþ$ùÿ©ÇÁN;± ›Õo¶®E½jÝ«:nZ…j'K¦-|>rÑWU;V,ÿBZÑ©9™ N¾ýê˜jsïë÷eãý•{V/¨:eÈšƒ¬ÿàÁøá£_' >oÙçó¨%[òÚ\_¸ûÜÚ‘cÚ-y³:$/ûjÖÔ£ò–ÿÒ¦ö3Õùöµ’˜üí¦já7 ÕµýªÝ­zÿÞ`FÉ}Ëà7±#xÞòÇâ9¹·'ÏŸ¹²CŸÉ-ÎÎúRÁ+û®h1vìÄj÷žÙfZüɦn¢›6n-ѳá Èá}nÔømŒ¹b^rÕ]Í»jW;áä­Ûó>ytoÖ÷ }sÀžœ¢Y…nêÒ¬ä¦å†ÕŸU¸YåIý¤Ë“Ê-û|Áƒ&¥¿¾òœùQüšoþuxÊÓ?ͧ†O¾_gë_†Î‰íú\у=–¼v$ã›®«Æ-¹ïú‹ÄÀ²‰É~wôô+á½zÞ¹kšžU¯;õÍ»~ÝùÝý Êg›oÓ_Ÿ‘9óþÉŸkÖ9¸ìpÕµIWG,È>JŒß1gfèëÉ]=ξüzÓ/Ž^Y²0&sñÚ’iÑeÖÈbÇ:b/9Ä…ñ ÆºÕæX ……ÁUaaþV˜/ÜÀ»ƒnâ0÷æEJévBip4åJÃò§@BiN 4àmf|Æ+¾ÃïÈ¿£ ¼†”¦¥q*ð`ýT>G)à00žU<†ùN sA¸€¹xñäØu¿f½M¤®8ñÆÉ·&ÕS~#ƒ¹À žý_‹þ1IæÿÏû¿úûI2ùÏûŸ¤.ÿ@$©üÙàyÿSÿ/ I&ÿ yÿSÿ/0I&ÿàyÿSÿ/ I&ÿàÁÒý¿€$™üƒÇÿ×ý¿€$™üƒÇÿ§tù"IåÏÿ¯ûI2ùÿ¯ûI2ùÿ¯ûI2ùÿ¯ûI2ùÿ¯ûI2ùÿOëòD’á¿ÿ¯ûI2ùÿ¯ûI2ùÿ¯ûI2ùÿ¯ûI2ùÿ¯ûI2ùÿ¯ã$Iå‹‹ü}ÿ? I&Z ˜km`†›­“6ÁÀµu4Ñè~?í‚q) œH'Ü“Σ ½&žcpðÀLC%~/l¹úýªåRyw›.üí—@ÑwÊLv<ʰ]ªEH èß!”ñísúÐvJ@j&Œ@û&¶Tì‘ã™±õEÑ´f L}kàBT:0è&x¶¢¬]Níd%àáRµVG¡†Í!ÐYÜÂè¢5ÒÊ}Ý—¹—©›Q]‡d¨àDCÉ ÁO >ÀjkŽuÒU93éòè´jc2wæ_¥ý ‡¦b€ÕŠfyi«U‹–µÚÍ¢t´ΨÙät¨p3ˆðñ¤ é ™ŸÌ| \c$²›BÊæY'Óšc‘ Á!Ë×Ê,›®-â¦ÀXDήf­5k#ä+ƒ­VÃêw¬3è¼ÎLä|¡P/ÆCú2&&2¤ øp#É(o~cè3ÜeÀã˜"öÑ:°°«0kuöl=·Óx ÕG½¾«Ê‰÷é,¸ÃÁ,$HÕ€AK $YŸ\{0¸¤ó0ëÚ©vÖ-Ð+LÊC’nÝÖQç"‘†9re³'²cÐÈh)>LKÈáfùŠ•]€J¥VuÀ”ÁÄ^ R #¥“f3Ñ-I zHÊ!-Éé. ÛTuE™‰§¡Ô=d‡†øcšÚ9ˆ`,qš”òtÙèJÜ\9(©H ÈQÒËLS‚ý+ò™™¯¤(ÒËI`Œ"\½\XÆ"¤}x°­V©rQ™|¢ ƒãŸ1 Y ŒÁøöX8Í”ªT4±ekƺ­º°”o­°¤Ö¥zÔ¡rIÑŠ¡r©`´´C¬®§ÀÒ `i½üdklJ‘á‰ü ›,U‚Ï•©Ó|¦Eæ6FiÅaeŽ:§[ä÷‡“UÛ†Ë鯋­Æý‰&©hs‡N®lÙ,â)æJñù6ÔÇsúxeñ‡J)K—äó§Øz$wĽ®,A‚χ)>rÞšÏqîñ”¾?&O.µœ¶êûõŒéPêØ ÷œ›ˆ}zG™¿󊲞=ÌÄy(*ñÞ`ðæ0%€)Œ=²SV®½j å@‚màœ•Øcd”4Ê%’¦ðyýÊ„(Ì51¾/*ãÜþ#ŸM^@£šÇÀ=>ûœ<ý!Ù?£Ê®™ÿqMb-Îÿª\Xùù_H\ÿ—ÀP`ÜBP!ôç«âò¢©  ùx{B4ä5‚)oŠáã½'à>žj—zÖ_ÿÇ.-ä_åBÀÈ?‘°Ìù„ÔËU\•Sÿ÷¶ëëYDíoOŸ=“êj¶:ßó~ƒ„Æyf]îxžªUò<¤c]‡Ù#-Øh”]²mÞǤçiïž¶Îû=°ŠjÔwÈ×Áe+ßïëOÿ˜ê<·{§›Wü{Ì¿xå×…œ}?ìŒG—ÍŽã·†­?9`ëó†¡së4ýî<öhI·[zݪáý÷–yWïæÿѼö¤OcÃì‹·böYFuNOÊYwuåõÇ8}ˆ üŧdsãûœ.ûÕÈ1pÐAÜæºunÁT¢~÷”j¯ÚlÜû&àZPÿ™_ÓÛÓïýšìŠÙýÄvË)ÇÍ×W“X×¥ÉÁ»>|0ÙMÙ·»ÚÿKs'—ø˜˜ÍOú8nÍÎÚú93~ÉäŸ×§Ïuš“ügÃðÑ]s ‰gÔ²õä×»Ló£ 'Å/nè‘Õwïëþ+þªõ2ÝÚzzÑüEñŽ)mÖ–Út[¾Ê=?¸÷Ã`œ<:íõ©htò×€«×C7Ÿfùôó¼ÀCÿ|ü©Ú‚ä ÑO2a÷í:â 2“¾Zj»¢ßøUO5±O«ÞdSTÄé–-¹ß²¤}¨aÂàýÕ·Ö7rÙyvñ¯bïîI- /^kt}‘S­õÉ#­û%Z¤_z·áОúùnK<‘»0oø"Û^Noo­kŸµð[çìqa.FFEìtÖ{mô¬•½¬¨äSŽO–Llvù£Ù½“GÛM1Yq/ñ\Äùz3owª}?9ü]«°6Ù3N¹{†¸¾e8Ñ`ë•·™~O›¦]p;¹¼þàæ¹Á‘[Ã{Ö »2ÿF^ú[¿ ê9»N ¾ÅfÚš<9oîauî“éÈËg,&7?ígûö»³å¾/ :é[ZÏzX„ß½ÖL­-¬k™®-+xï…Ma¿Uç[4ÛØ£4 »ŸqÒæmŸ¦&õÙÀ×ȱÇó;&­ |b­¨-/.ßë=¾EbBÆÐÌ_L#m77h1ÔdÛî_MÈÆSû÷8º×&+³Í“Om ³‡Ÿ ­¶­çšË½ö'$¤ºø/i=Ãð•{µÐkßMz<·Ÿ»#ËhÍÀFCí– îúâYß8§¯sÆ7ÌË ­ö,'$ e :È:þ‚ËÊVBÆÛŒ1‡o6ôŸÞ?Õ™µ$Ï­šq ·›a;3¼Ò¿Ÿ‹N0=a}äa„í«yƒ¦üsçý—“Wß9‘Ô #9yÈ\ƒÙÕH¬_MªzZ·òhÿ…ãÚÃgÛ»¹žŒDº'×Û#Ä0pDr\iáíÔ£®ÞŸ×|“áp%Î6ûD^,Ýr]Ýôe3=þº·åéUÞ×4šÚ5ÉnÛø7€˜ÉÄ'8çÌ)ö2íøSÜ®ù[‹ì"& ¼3b­ûãÇ'ñãæCÝ»Fok»¸ÿÞFq§L~Û®¨([0ä}ËNõ{M´üuœYQcŸæ1jº×2ëøŽs3¿,)q´±ùϨj¡[>Ïê¾èC|J¸Ý@·šóÞ´üiÄ¢+øþˆ>Ó§gl|V«õü‘ ëbà ©Q[t¥r cÃüÂØˆÜÂØÂZÏÿ²úض†If •×È®h·š:u²å<8R„¡ìòÂJŸDÁzT…À/Å-[¨›WKû[¨›V\¨›®âBݨ’BÝ0.[¨P™Ü0&[¨Fåå–S¨Fd ÄœBÝ48QUþ>ÙBÝ0IÒ²ÿ Éþ/ò¾“-ÞVP¼û†›{Ç‚èž{½Y`9©Ã ·W:Éùª\ùnA1}ùîÓ%ÿMñ™ááèëÏüñ™ÈÄ|Ô$ß)ãýTÇ{+)ÿ0E .þƒ˜ïøïúøO÷×? ÿd´Ñzü7=þ›ÿMÿ¦ÇÓã¿éñßôøozü7=þ›ÿMÿ¦ÇÓã¿éñßôøozü·1þ—R ÿ )ÌÄ}ÿOðߘ±ƒ¹³Ê€ÌíMÞ†I~C8í»R†'€yÛ¶AÖ$…9gkɉxéCˆÜùés(òNû°'ùdNÅ«€®¡"ï k£Õ<+†!H1fÖò†”mr£ÈÞ¬ÿÊ?Jåv§á1 …¤8<Ô³ÿ4_–±ÜŽui`õ™‹7fËçšê'.ÙÙ̃ `¶ Ò|àƒöSó}Ù?‚° ¾ Ë…@ø+¬p2茾ª>Q©óž¤€$´¨4HWo”æ­GM÷‹Q•vä³¢cì;ˆ1a ´Ä˜L‹æÎÊ¢$¯¥TLuÕ•’ùc˜€Beôìtou”,ÿD…FZU"¨he*Ï(1¾ ÑÌW{>Lpp‹.Fh>¦›4O`„ÐrÎM«,¦QWYH+K_Ц¥xÊ2^M  >3Gpáau1P–A›³‡aZ¤‰*Ц¸´¶C¥´Lk­MÕ¦¯*£0ž6à Î-‘VÚïêMA˜ÁÔ­0# }‚³`€{çë༖&æQâ*»½•Ÿˆü;ñܦH‹hŘu˜Q«D°‰˜£¤8C¢O„ÅÔÕy€Â Su<ÅB%m¼ é«Ê)œ§z1ˆÍ_`­U€Btõ†`žêõ›:±êô®èÄ£EóƒÐâÂp§Vq‰ö])™,7ÝÃŒ¥ZñL”×¼jiY‰ã• Ç/†£A ¥Øà­è8Î]p¡` °Ýk#¡šWUžÞU'™âÇNI-C±MnÕ‚½YÅ5]v§d2âÌýüuáx²Ò)W#ë©%†¸X i-ÅP¤–Äcjsг –ÛXŸÖ©$€3˜«ù#æ’„À°+VÊ:£¯¦…x¸É’g-Ά€;U4^òCí»Ò0øÇךg؃¼}§ŠLšTÊL›€D^°K=¡xöpXø@º¶[  δNp¦…í^»¥ q•åDå­É #Õ\Ä t9ñ‚ã‚;U ®ȉÖ]i,'?ðö Xl|ßO \‚¿¦°h w,ryÖ…ñú€qaþg+cèØ´Ðçk~s€2ÑfHâ* ‹N÷ªœ_˜r$@T"Úlçšàf\±V©X`*§; …†@Ÿ “è´ŽÓxN™| A-=3Z"<Úf:„)§Ž)àä3¾M±ãG@`Xq °‰²rR²JM/UŒ ¨3ú*‹‘ü= •%FÀZâÜ´F@K2«6ß$n"¿©‰UBg‹pñ_,BÁS|­\Òƒv.ðª¡ðh»›DÝqfä‰h“ Áæuk}æ"²âĆVZfôU^‚©´Œ-Xq¨pÈÇØâ¸pë/ŸŽ2“šd~¤`(Oæ2¿³©N]¯žý‚¼5.©Ít 'Ç &5JæjD_m&j®LÄ¥˜H™HÊ0‘ „Íå1¿£Œ¹"u+h(3W¸š?¢$¬$ÝFƒåmryêW›;Ú®Lîp¸ö€;Är‡¹pås ï² &ˆp½á6Õ±’H1ÓŽ.ïêZ¼h"µ‚ÌÛÅ ¼ídK}⪲ŽÒív”bb$Ê 1A‹ 4ÀZE³Úw¥ñ–˜Í Ï–KûÈ+褾S!‘2ùõzd^ÇV«ÓK/þÕ3c{OÓ”K;þžý¦½™À9Å¡IÖ÷/ïWÅxŸßo•¾j݆ÇÑtè3³!n¾n WÌÍñÛ`þèeÉÛã3Jò%„=ø›?æpwpD„™¼ /˜±áÛ²ïE³~¯~›žiï‘hhþíÄý#vco^o\Ûýæ\äþ;6wÇNÝ“r±GЖüÂ9…'ìò¿?ýsvØ–NóVí©¿·{]Óy«Šníy0¦¤é ²¢‹_t÷ZJ{êpûäàzëûÀ¿$§¶š[ù¢_¿ƒ¶E!6‡Ï«Ÿbv »02ë[f·Õ~˲sNm *mô"óÖä¸]ßúwNmÔ¬eè¾Ng¿å•h³\fåìc‘1î”#I]LÍζLâÆc†]Ì#j|‰½³¶`\Bê:bâÍ&)ËÒroíÊ:Æ¿ßW³ƒ¾-.ìQ°ÈÔ f~ÿR·€ÓuVÖù>Üuã­Ž\øöÌnRGuœ÷5O=²ýLß‚M-ö[¤/üOý©Óª·»œº|ÍŠ·³’3꘶ ëPÚâàñ‹û.<éiêûñÚ±#/6ÅÃe6.»žì?s^‹€cw-©ú‘Û©½Í TJÜQ£¶¯dXºM:c>ì~™ÐçîJSæy^›õvÅÓØOž‚‰[vmš¶µížYÓ·)Ž1Þjžn8¬Ã¦ê—ÛÅ»àcmCÓ†¯ºšûý§Îhiç¦æ’Ü_þ8ß÷¥ÁÊ–‰ƒ”4oC«k?9èùöäcF6£_·séRfir¶KÃnHèå#u›ß~‘êöí\¯£ÅcÏŒÚ_Œü£S«›½}¯ÍÊ´{A:9ëÜŸ}~ rj°â ¡é•½'/lîápü°:x´»š]“+—Þ%E½Hoau¨p¥Ãª¬Ð&1k:OhToÓ#÷å³·®„—v6iúøQ¦iñC±Û><]kï?cÈ­óï¼RÆìÂGŵ/¼Þ­Îã6N1ë~<7>Þ6}ÕM×Þ/Jç¯mv¿6~½ZlƦ\ûÀké<ò~ËÃ/Î,ØjtÄìÕÄ‹…þ÷ߨyðA겺i·r›G¿NI@–$GûWF¯Ã›Ç—åeã/ñÌ)'íÓdŒiž“0iÂ1ª•íÚ#‡„Ÿ#nýå¸2~N›C5‡îX0Û±wÙ|“ž³î~­Ù­9§™%05ÉE蕃LŽñ‘É%ˆãòÉMD(æ"ürý×Á•£”€$…!•Õ+;ƬT9ØnM’,¾aÏ Òá?u`Ëå<Œ(‘RÀ´Ò‡©àŒE…({ þgƄݱ¦|L”í7®ðPeÏ€#Â%áÚ,^gd7UVØ=OðåÈóœ¸*€/ÜÀù|îßkïêmýÁÙg\Ÿ+Ú'Æè|ÞÎ0ÕëzüØÿ6kÊÀa"‚A_‚ý¶þG‹¶›h†ÛMT¥€Ïý?·ÿèÏUúsÕô¯Œ'€þ|•¡?_MÿÊxè/Tú Õô¯Œ'€þb•¡¿XMÿÊxèo¯*ôéjúWÆ@©ÊП©¦e—;EE¤¬]’).·Û¡Æ1PS5€¶Ö„àj0]B`5¨F‚© T#Ñœ4;±˜ü 2‰AùA[MùÙ f@àk0L¬™ ¡<󛡽ÙvzÓ)IníCZë0}ÈAkÁµã XG`±âп„¶;LuåxD5€ƒJ$t8UpšªÀCœÁUà¡ÃUà¡P§©P‡V—9?¨¦«˜ü 2® ü .S~”’ìõ8|Z Ô8Ã4¨šÇT¦ùx‚Ë *žÀ2h¯Ç\&´Ác*A„Zx²Üˆâ¬ÆÀW~3Í¡þà2E¨Š?°LÚà7•)B™¹æü ƒrÕ) 1`û9}$ ˆ *9Õáu$ãMH§Âå d`þÈpúð5@Ìÿi˜ÜPa†u¥¾žyÛÎq”µ[bWÍKà†'ä© ç”Õª~3ahn·¡‰¶@)F$›ò( Ð¤NØ•á4Àƒ[û»ÒYqx€{(CÛ i‰>‡Û•\B⃈S_rR ßÀTKJ‰ë“ävõ;Ky£Ø²ÍÉ%eÒÅã÷õKŠ/±p5½Ø¢‰%d`þ5!6+Óz;+žÊôz’a>“h³]ãñ&‰ÅJ°çMøÇ&ú‘Z‡’ü–Žbœ§6Ší”Ž*/ƒ7'fd÷èn2Ô˜v´‚îô ï"4~FŒveSéXÒø¢ŒDnê è´\7·(ÀF¤wð8F8ÉP ‚Æcþ%~êñùäO™â>Љ,)+‚qMåYѱ •§xO™ ˆËþP‚bS=92D³1Þ˜g°<Š5¹„1•*û"ëz¤?£Øh/ê^A±).ÇhO†Ãeޤz:e@W»ð^˜’‚W¡£ —å¡èHI£0z¤z“ Aù}=BíI9žV;8Šd#“@NB‚c^È4åÕú—ôKT”Q*XÔÏIj]¨bΫ`áØhÁ¸dÐAúç*¿ã²ðS.þ2â€ëÀìpßZ‘,0@f.üAš•Q!åI”!sõhÓKº$9n·+3Ë9‚x[‚>°zsçg ™’Œ)éè³q*ÝäŒ_=j•k@D‚L¡YêFÉøè4ÑÞdEN5sEe§MȪŠÛ&Ÿj‘(Gä/ÜŽ\§—0o–s¬%jô:‰R DúA§rRqT Ì…@.z0ÔR}ð7W¹; 1ÚÎÿÉÎŒ»f1TÔ0ÊTM1SYJ®Xž5Ý1NþSí[Ðèý^s”%Êœ—öCeù“(­ÄtO ÚŒ–(‡ÛãH!CÙ åP<é‚Tsâäg`’QlšÓLôòd(mÒë‡J&™¨{42)/f‘Ñ—žëÏÌ4µ¢ÜžS”–¡šäö™"å,FC$6S/RãEí]ZU}ÀøWÅí—lõ+JQ?4ëñlqš*eçié.PÖÝ.ø±ö™×“£›‘KSceë2Ýst–ßëTaL(˜ÐAùO5DžîGlþL¯Ó‡ýåñ¥B|© OuueùpÒõZ¬ê×9è$³Ö*—’ˆ®%[ j %¿OÓø•êD·oMIKEwèMe9F9)OÔƒêåÌ Î@ݳ]ɨ&¹£ýÀ~n’ —M™&ä1Z,PM1_´ÚÅ´o 3R3DþU+ðZ‡%¼F¨,P&™¼Ue”¿Ík@è,Ô°„/ô:ÃG®ÇS{¼xÕÔ'»Ì³ÈkF¢`'æ *Ò“A„ªZ”EÎR—v²|Ó”ÖRQB' Åø$ÔùÌÂ` e4YÔ!§z”ó¦,5xaYsâIà°Í, Úµ )PŠÛÇ’NŒƒ‹ ×_}ˆù—&Ö>ŠÝ…bAv‡ŒnÈYS’mA»ß~Pä+…TiŒd3ª\$¨kYœÒâб+¦¸ÒÐHY©d-»¶"Ô¼âRÃG\˜âˆˆQW›‰ÿ5˜öQ~ .¯ÈDØ8–¡Ã°r‘š£n–%7à!å_v¯ùö&ÒVq 4 2{—æ…-ò|­´Be4œ}$ ƒØ6µÿl¬1 _WHq¥ñµ 1„ ¾.Ÿá¶}ÆT”Ï~Y·×æ+Äü!*?NT ò£–ÀØ j¨ý h¸ÙŽê?2KGË`4±B¨F‹FáÌÒaÁ`„–9€u¦Fô.Že9žôq8LÍ= z•EÃÊãlµ)J·±œ@‚J?‘ «ÉËl8èÄS\)ã“ádí4ˆ³•ž ‰½u¼IcÍ…mï‡ =©.jiŒo'æC æ@waå‘dl´³¿N­‚™h ª l8ÈÆ!æ_f]¼¢Ö^duS2$²—†hž¨<+¯Íh—$%àlï¢ÍÅ :¬® ÁÈEDø•ÈÒk,)q‰†•Xãò†q kj‡”!æ_nR† «W¼]AH)Ð2)OŠçlÄXçQ|ñ Öd´;K‚`'\‰ö4NÉ%%)CS¡ˆÑnÓÐmäÔp@”CÌ¿¬¤ä ³-éNè~â : ¹LN„+`Æen¸7R"À³`x¤ÅºA«v€ª 7¶Ÿ‹¯JÅ*гHk[ªÈD)—u-à_¬=žÓ8m3Ú{¡ëì\Ea ©¢ÛÙ¼MòœlŒò|äíl¹ ÝY0ÙÁ$5,;;ÄüË,$*JÞ«_å²+ÀÔ+9.Ò ÷¹¯h" (O›ä©a}Œ4œA‘×!å_æ% Ó¢ˆq¯ƒ©#¸!(³¨M¡‘S/Ë´(ïrØÈÔ‹š1¼s M½4â@Ú(¶ÃÉ›P\%lB‰æM"FïjÉ yªÜù—›”akQ„”ÚÏ‹„²hQ,ÃËL'Ñ…W" 3á:Èœ Qž3ì3Hd“ý´(ÔÆ" F(¢uÁk‚A´™¹† ®‡ƒGbþå&eØs’RÇæaô±´¼g÷—ˆB,6“Èþ̳hŒÛR×fZŠÌ\†eÙMsAyNƱpæ²ò/+©$£Â+r²é' PãCWxoTñתºJ#Õ9WIPÕ=1¨c¿“—¥Ò‘åo êVHq¡ªºv´ÝÙ UW¦G9´Üâ÷‹à/®-”…(M@H,ëñl Èo" p³ §mãn3° æ"çOx;™¶‘ún4dÅñ¨¢“_˜3ÄÈj`¤LÃú Ž£õ-ÃÑÀB̤̿¢40™´Á*àØ•8yJ•5œÈ¯CÙhÓ:ž¾ÒÖ‰°Fá®C…¹I¶]‚¤ÐåB´àD仼dhà‘E® a{$Pvi;Ñ."­ì2¼­D»‚'ºZxÊnù—y[‡5Ì»,Ù2Clp–ò¼+ZS$Á0ï&{2 >•xCm‰ â­•nRۧƒ!ìêTLq¥ OV¢Mç¹Ô TéØrÍ ¦­€=¬£`ú†N¸ÒWÞÓ,¼¨Ïà$ “îz°xj‹¬&-—¡iº2q5q(§†£I‡˜™YÚf<~ANº‘•{¨W8+Çb’¡S=¾¬GfÕФ•6j›†´3P6\;Ù"B!hÑá¢ͱ¸½Äÿ B× ÉB;INÿÃòÕqU”Ò"39ž£ˆ’TÔ÷l`¢€ÊÈѸ(?xD3Âç²HIê ‰Iñá(e¡d^f™`<’e£É FßáÈ›5%E°×+UC(íRGodN é݉o†%Â/*D9€þX r€ô¾Îýd"Wfs6d£ØÀÍážË àf„SŠkUwàfA·iY»H¡¹ ìŽÖ0˜XBdUwtÃ#$ âžj³0Y gë'”ÌË®´W”ETS›¦¸rxw l ùU·±#¿Q/š ›ÁÀáˆâîF}¹ó/?-ÂåÕLPiA‹ä"„MâÈÊ*‡G› ë8AàÚ3‡F/ïò ?6Âg±,ýÜ09c¨-r¬é˜jHgCÊ¿ìšqÅ«¯ö‰¸@¸†—ïÎ9ẑÄÈ»:´²&ÁDúì ”ÅΦ˜¯áŠBx·CBËÿ†dR|XTç-E¾JÜ_A©•o”Ë‘ÑE­x¨c0'‹þíÿiÀÙòùLO Å'géþѤâÿUàhžÐÿ#þ«ý?FþqÒvÆî”x›$Ù8ÉÎÙi”-ÙÁs¶dÑ&$ÿÕõ«~"û”ÿÁ ¡ŒÒùŸ¡iž ôÿÊ þS5ÿGþiýp×nqL;›¥õÖ3³^µð`¾{’Ò,íÛ[{É~RDm·vs¹Ñ롵Ž•®0¡§8 6»×éH·Œ[¸bж™wu¿åã+/öß±ôò‰¦TT¼Õìܾ‰õÓ/¦ÍÛ²íèÔó³ Ór›>šwGÝ´¾–ÿÜöBÑìç»åœí>uÖµ#Ížö¼t hßÔ'V»:pJ‹£·™ñIÍ\ûÉÏ©£W®lî¹fâœs/Ÿ¾ë×ó/e,òÚø:µ?sò=1ï¬îÔò£Öfa{¶ðÔß¼ë£÷¯®ùhÞù×'|s­í†—º®Œ‘=õÚçöí×òsÜ㟷úvÿ1qRÜ ýb&ä<´èÀÕ‹ÛÏÎÚœóþæw×Îuž:8õ®uΰ~YoΜUëà‘Ÿ_¹Ë–q—ð퇻›þÑxØW+>™³ïËF+m_‘ÙźôDўµ§ ëXç>óuÒ˜AÎgWÌ{nÀŶýÄ¢MŽSõ’|ÉçÛŒ«Óbm«1MŸœ·¿AQæž߯k¼$1gsßÞþ96÷ƶ9٦˒A£ïkøHLãß4MéôÙG÷äÖ—>ž[#é㟧̸ÿmKæl¾´pç…í ^5ïÔ[Ãï>9å 7õl»wù ¶;µd༣gV]8÷þ„Û_Þz.§ã™)=>9Yør^Âïò64œÞ¹¨Ã½o1gÚ3C£ÏŸ¬Ûñ·É‹\yü—U1—^ýnr“žù«{Û;Ñ)ZÑTãvT£î ccØÙý‡Õ¾{i½{Ÿ©»þǬò\þóÙ¢#{̯ÙìÅ5®çµ¯yóî·Ö¼ùpËQm’„ÔET›±·ý3ubTÁ¶«§-âˆYÏnÉí-íêTäªýYË?ïïÅvë>þuôƒœPZ´ê±KǦ-{ó^Ïïy`îåQc?mûýÉï'}ÉpsoÿaΞFï/ÈÞèNK{îñÕ—÷ì[1dMï´S [­Ìó¯¸Ûû¡ÆÃ¬þ¶<³x³8ý×^-{ n³¯Ó©–Íè‹ö~Ó½÷/#gÔÝ?2ûç”o?¿ìì´¶ÑKúøÝüEÜàè—~½­ÓƒSs&ìôŸ¶ôùeQŸ&׬­ëX7¶£ÿZ磿÷¿ïÕ÷Ø­_Y°ïªÿ“ã÷&Ää_kvS§w¾@_h“rK«ï2ò’n¿ðÝŽÛÙ”I;üÜ¿åÂ{Ön=¸òÃúûÅ¡yE{ÝSX¯‰c§{Á?~]¶c~Ï…¿¦mŒ¯ÕáìÌú×6ýgkÝc‡~¯¶Î[Ö¤ï—~aöºËõGo\<}${ÁùØk}6¾½23‘™ûÖõŽ{öoýxÖíõ¶mÿí«/üM¢“f/yÈÚûÂü¥ëßxç™áKNO»ãÍ—Ï?Öê$÷ïnh“[ ì3xøÞ9ïõÙ6fz£õ;NÑO5j”Ýiäî/g®V/8ôýÞÕ–ÙséMêw[öðé»7¦vðô©NÇŸÌl|ìo“š4»§æŒ[»¶{në©‘gÆŽ¸muÂq±ÿœ¨¢™Î?Ü»Nî³îý—Òû˜š0¬Eïe×­iqû_úàòaw‹Z³›5¨™vàÜÚú?œv`Ïkñ|VúàE›†^4ª« Ýër¿ÄÔYAßÙ¨u‹×Ø}‹O®9&'eÕs+jw4É»pÐ4¿åÌ̵O²wŸÜ8Wz]ú÷vwÁÂózŒyzÍÈÏ&ÿP´~ìé¯Ýý µýiù¥[¤¸ºþ­=¥:íŸØÝâäéùÎk;ôë—6µè¹¼È]ï—76LŽŸþKwΚ;òâŽãÎ5Šæò/Þ¹c³ìøcO;ýùí½F¯~¼WôüèÙI]ø[¿y5áÏÎô 6qqƒÚì;søÛ;6g,Zrÿ…§î‹—¼‹v¥6;Zx±ð•î+ßï?xIŸü)‡VÔ>Ô¹µõÑÖ•CÖïüÏYãwŒÿ,iüólƒ£Ç6X³°Û–ECçìì4bà¸]M?ìx„Z¿èæWûcy¯“³zg½68çõüeŸmêŸÿÎÐ.wØñîÇâ^œÒrõ K«Ÿwtý¼Öw[Ÿdû/}¬ál×Ü×v¬~júÚ» ÒwÿqæÓY÷×k~ÏÏM V\ñà¨Øþ‹ê¹®×ú¿h2¥ïÀ§ï<|ß÷m¶­iÿÍ[WŸß\¿K×[»,úWýu¶MäŸHßr©ï‰†±·;·ýéÄ®÷Zn˜ÿÆÛÓ›×eÞÜ›{ý¿ì]w\çÿw¨{âŒ`j%¹»ÜˆXDP‘""„  ËëÞ ˆ(¨ - NÜ£X¸QTê® Q~­ˆ+Vû»ç’˼HÈ•W¿yþIî¹»çóù<Ÿ»ç}Ïú¼—_X2lž’9:aWŒÿ£ÂÒ„æŸÊÞ¾ì•0›#þåµy³µY~ÝŸ%Ô1Ÿ_¿u“ü–Ÿm†·ý¹8yûôὡ±¡Âv‹ÏdDlY—féÛô‡1 ?s§‡¶ÚÝ#a¤”*éw£Ë—½}.÷™Rñêb›«)ãËÝ+#&¤¤dì¸cRRytWg§½G†ô<ï2µk«˜ð›ãÛ§´wæöIº”áÝùÉÁ·%ùó6gù_—ü¶3iËä{È*?ãÅ­«×/…\º%Êïþü—±÷ãrò0ÿ9…'÷mhöOÝD¼G ²(Ã6òÀCL†‹ÎÇäy|VŽš%â‚î#×Mà9CÅ«“Ŧò3ãzR¥8<ò**˜"`•Ì–í«‹& ñG ½D_. Éî(Ñt yŸótÉ/êV—Þ2„t„ê€Ä`®CDD¤$ÚW@e@<é$ý¥?Ra_úƒJ(`÷ã"‹QÖ9¨¼D™yH•yÊ>e`4‡;,$(šãk&-Í¢Üh·BÊ5C^ ‹œ(/Q…«Ôd•ÑfÜn¨Ù…• )ÛÍd3ÔËv’ÁdåÉç%d¡¹ä}£=]õ‹ö`Æõƒ*–MHPóUºPU­]‘®í¤ö§ñt*£ko:£.- °S™‡Ê¦ÅQ&-to¦eTÖ¥ X¿¼ƒáFïèµÓˆQD§:Ô" L¶\ Ó©Ã:PFET %E`Bº4!¨=:aZè ªûýáqø58‰LþÑ9ŸÏ¨¦K@,@êAM„éÖCÓ"£lZcã‰SM'­å"hg 3Bù,í¤c@´´ÄŠ0€RK@žB2È‚÷Ó^²±ŠŠÄ6Î^œ!“"£%ÑBqH”„CØA(iEÃáD¶‚6N}aÐMæÃÄGp¾€<ï¤í”ŒÁÃF•ÀcœNq¶ä­1€GÁfœ”Åcœ”ÆÃÄo—„‰l†ØVÕât±(ý˜U âñ8Š"('˜#˃ÁD‰ôL„<!•T̓y8_5"PH5ÌEÕ¯CÔ®ƒÁÂrU¹ B¤êudR˪y|¦–‡!jºÀ8N¨å ÔuFx¨z½€uþj:Cêב¨È“Ȇ®©Iv±pÈ/ Òïþƒ@ëÁ‘éG×Õ‰ãkã÷ÈeÁÂŒÀ+^>?DþVÞí+[õ?3ªg –PNF0Dð_ÿN*㵇ÿÝÄÿÍJRñíá7ñ³’Tü_{øßMü߬$ÿ×þwÿ7+IÅÿÿ&ÿ;5ÿ‡‚|“ÿYKjþ†DG»‹¦y…„Ç„~ä Ù ƒHÄ$‘8DâïOÅÂÿ.Pà`íó¿(ÙßçÓüO¾ÿ0‚æù_VRíâÿ„xÊÁQÜDj"5€š@M &P¨‰ÔDj"5€š@M &P¨‰ÔDú&¥ éÇ ñdq-ÿG(@©}ÖŠÐÏ( *T‡Qµ\L;¬ h͈ÓE'C T]–@Ãè³­™oUXð‡â¡S a­Æ ) f@‹g¢9d‘ÆÐtëÅV|Ê\¬Ê>]Vá5Þ#·ÊŠî®`½$õÐW…Ì’ëC• O•#!ß,°ºŒ©$• ÞŠCEè–ª³J"a\I¤vYLA¨RAdÓêO¢à(®~R©|¢Tþ41ÙØû“6C³ð Pž—Å©ÂÔ$Ó$ž’`²'#E_êIÀBA/A(‡é¬yv…Ê u¢õù…aPŠÖóù…Q…ν9ÞËq ŸôÇe¿Œ÷–*“(Õª"Ž ©áú¨Hýc]O¥×dL¸öš:h.C#Ž,ƒš¨y‰5–DgßQÄ÷§GwRD{Q“C#ê FA©µøjb\ ŠCz#ƒñUÑeÐøÉHC´ÉÀí0¢ú2\YXŽË$BÖœ©3©•ŽÓ=ê¥Û¥šKÒƒÔVz‰út‘“Ø ¢K>_ë4¯CبÁRœEÚ „åú²V e‡<úA5â+&F[Ad¡é»EZFýz¡½‡*%1bi1Ó«‚ôA‚#P†2±H¨Ä”9Àäº(aDƒwŸ •ßx»%<½¬ÂpÝ`'u&›§Óµê Y8Ê€†Zl06&~±!|ãC©¤qqD\2*È‘·²A5FÕÍ”ܘ"Ð-_Z0xƒÝO²æ¸º±R@µŠEÞ}•wPQ‚b«v(:û4 ÜàQ‹ ‚d!7ˆj…d§‰!’€0¶- \˪ªJn¦= CqÙpQº°YÀβŠ5.:ƒ+è·Ó#$3>P–+0šª½0pm†Ò #ã4°ŽPzôBj VË|Ë&X3zZ½é–0B¶6SŒÙÕ´‡äbŒŒÝ@„‘ш`¿ å¶ç£8Õÿ¬ 2ŒQ¬•! ßä­vÍ8ªÀTdËj8AÁž^Š€É@Gux´L±„àR›ª‚Œã X4†à†‹ÒñŒ€eŒ.­YÖ \>6¤Â]ψt”ý §jG/‹( ÃqP‚‘qXG(=zá8Ќǥþ—€\‡¿Õb`h®Å áü‹­bÓ#c:adL"ØÅtC¹ ùDÁ©lqœ¢‰äã€)"kÓqi·[.†PÆtUjsÏXÿ®`Â0Lçqƒ0\+¦…³çRsª¸u ÆÊM”C. ‹4Î ¥ãñ (uÃùjRÕ¨m ü½¦MÎj„4ÊB`SöëØ€–Ù0À%°u„’§õl `“>d«iUoGÆŒ¬Ieã£1£Þ,€.cdÐ¥hÊ º@» ‹J  º(@CtQ0è@‚.*€ktQº¨‚p W^¹@בpœº8Ó‹  GHÐÕÞ‘ö¢b2²„»R‹dUG´ÑiBy8š"00w ¥ã ¡X±uã®´^Y˜¥V9¡S6+˜ ôü߆!1(ÁÈH ¬#”|¯͘XêUÖ§«µøX½¹60b³#X™¯þ"KX@k ÆÈh D­vÑ7”GÐä*†½1¾” ]cò–7ʆ¢5ÆC”> ”×Yc€Ð ÓNªÎLVNCk‚êÛA<¾}änP€ö! „1K`-5H¾äØ¥Xå%·R©CG½kB˜Ž‡D1Ž{ƒš5.\Ë aBk:qŒ( pKëA/˜ð á%¦ }„›²N/œª1á4p&›(­Áµê­+Pœœ5jnlhÖ[}ˆ12"FFd ‚]D6”ìã)-$Ã!9/èà’}iy«k8"óéƒÖÙZ]˜Î´#€%æ6©C2ùä³ÅrKªÆ6ÔaÕ ƒÔ>ùÀ?y1í°`\3âtíƒ@œ‡k„c²Vk†µ¾Et+qž’•àP]<ÄÁTÀQÙ_Œ¥µŠ²¾>¤˜¨È(ðøƒº—Ý©¹®4¸SÏÏ-ð¸c<‚þ¸ƒCýwT€jùàÒÿ†¿¼ê`HiB µEÒö-§I•ú†Ó¡ÒÆBù^íU¢³)Ò"Big 'Õ$¹é#‚þÁ©d˜š¥M}w—é· ”¥´¹Ï5z°8F­0z‰8FÓSs‰JÛø\ƒ¼¨¦A[¡(¬:èÅ´IÈà+mã3’ ¥m|ÎT[íA¶Lߨ*­4fÇ'ôò*_yc_dx@H„ŸÃ S4—б°yÈAé^¯ÆFSP"¨îUL÷‡ 84xNî˜Q.G¿ºæˆ _0eGöóøâ ò * Ò_‚oø”Ù¯UCûœ%pÖDŽmJ5“ªÿY.pÝñŸy þo²7ðÿ7‚Ae¾õèË‹Ž+­ìæç=,ò^_>daäªâÁ;†Ùø}ˆÝ>O¼iÊÀ¯ð f‚˜lâ]éæàu ëø»^ÔzÏ”Kî¬tì5ø­ûÏy¾ì'¿l?ºéë5-¾¶jÚu_jzÖ»ò¶ÇÝÆ¤E\)Íp¿r1êÁómwÜ‹'\|¸8æâ1+Ï»¬nræwyµhßAkøâø¸×/ Þ³½=¹´åànÝW,;tyÃéwob_}[ö4¯tû›ß èèÒÃ9M¼uqø4;þQ+[Ëå={=gw8à|tJÅü.ï5ØçăËiö7›Ÿm—·èq³ø‚n7¬‡>Ø3鯂üÉw.ï‘4<Û·/Ë j÷bBzÝ‚¯OpI§¯ž­ÓxsÍ­sDQfÌë>°|íÍSQÞ©fÄð;wõÛÿkýIGOu=ÒqH߯Íün98Kvþ=§²iÉObܾ‹ßúýO™ zTT.ôNm ÿ~ûu—· ü¶3äQƒ7vy-{/Ls;VÔØ“÷=2bJDöÒ™S Ísv×K½·ìÊîZ<·<ôzlö‹ˆ™âI¢§ë<]›žÐÒ²+ñzŠEóewJ÷žxúÞP'tœw£Ÿœkz2Ý=R,h›ís)wÉO›ñì“Üi×¶’â}ê9Οï¼À½É‰Ð³CÃÚ<ŽÚŸ7º³C±Ã²cƒ¶¾lô L,)ÜýhÒÛÆ‚ÑÝÅeË8Û\K­V,÷»"Ø=ð®Õô÷+w¿± Ù(‹ÝNûóÁÖ—¦ÔKþñçñ]çx•ß±¿ãòûغ7šµ? ߇¥×}ø›Sׯ–.yÕÈybfóNY³¸pGüø–—NϽ+à&“.'6&¬ùŽÐÕ¹uÓ›W\ìVÑFòxwóŠhËDzrà¬C3ëV¼9”¾äÓá.-–Å–eún=½7¹¯‹ðûâGÓ SÏ{ÌÞz£žÙÃ}n6¹‚¡VËWlti¼mêÂ&.99N³4´\ìh‹¿{Xö&Þ«ë’A©6×›þát¡~Në‰s{$ °˜–Ô3§bmj»aöeÿüÜÀ.çÇøÓnq““„dEÏÀYœvf@éO» ;:Ï·qɨpAƒ_2ÓÚD]_?fà¶m{“y#ÿÌhVšmiíy»»kö)§ŒV CœV‰2Â>Ö³nÔkxòx—÷å½>¤˜c×þÆÊ–¼Ï[~=¶î©&y‹æ.ÿ”ÈM¸|-Y2”/öö\Àç}ëhV j5nÖçn’Š~û·ø<Ó%ǧ"ò÷W¿æÇ ¼ÛA°xq—yß%Íó¸“4¯°Ÿec‡’Ù=ë[2ô+AËE×nÏ<nâ‘Ø’ÄpÿÍûth± Ë÷g2‚WÙ$®ŽßmÞt|ç¢Óûµ°†¦ÂÃ3âž…6o}øà/ÞÖ=š}µÊ&eÓº_?s—¸Þ ntxh×Üœ¡Ïë¬v÷EœðÖ¢öî«}í[údÍmzºá}eÔ¾¤þ?[? ¼4gvφÜÔï–OS‡Žq{ˆv%.Xßé;<ó€[ê’¿/&“‘uuç%dutEIâÙV3Å._Н fÖkéŸ=yÃŒ°Sö®íkÄõXº{@q¢Ë¢Q™ƒâWÌÙÑgÆ¢q_»bøˆ…óáÊFû»}ŒsI)´v‰+ú­EßIhTTø¹ë *.ñ}&TìxúÍåÓ¶¿¢Îc‡Ô{=Õù;®ønŠãÌÈi‘W—=ßò˜‹cöKÇ^çÇZ´²»ñè¹§¾%ûwÿýýˆÛ·ÏL(ü¶içøV».¥NézðìÛÔß~Èý¶óh4áüž·2D1 >W\³ &_›q-ø¹Eà“v=áÉ„O¾D–q¹ËÛøÀqâB¸$׬psæØf§ì럟óµß½5¢üCç’ÜÌ-ׯ«×2.}A²¹Ÿ PX× ;bwgè}ñð”{•±·>¿üÚvû17=W÷¹R™4êFÇ¡ãë Ùn×_ßtXåXÔȧãáQ·ÞS·ùÀe•ëî~Ü÷ßføúÈÄôÜ=Ö¾Gž+þ4ºâF‰ÏþÝCO~ÅÝ?åþù‘ÛçMXnÕwɣ Ó+':¼_º*soÛá?lÄkOåuÌ[1Gx´³×Œ]Íû”s[ú·Îj¶èB‹˜3ïÛÞLØT|¯a÷žÓŠ¢O\w²ºäc±âsr冂a׸‰õ+Ÿ/–šópKžïyËkÆI8Á/,­VÜ­|šõmi¿’œn›n‡mè]Ñ××ìÿš0c°p}0ÿ$Ì nq¤yijrË])Oò]7gßµ>Ý¿ XÈÝžuìEîi·Shü…vÇKr[ßZÑ»øîW±÷Gþé^¾Înf½ÿ—ý݇*»óNîLÔÊ•ó¾ˆ+]ųfÈÒ1:Y:n Yú‰%ÁW©H+Cºža #Jd½ÅͤÑDI1Œ5;Ì9ÒÌŒ*é½ïÛ@út>Jê„ Œ:é¹oÍ0útœ|§ A0{Mÿý†ñ¨ jÀ’FæÒwÕ¢tê8ŸÃ‡Át$hÖ ÆçH×¢/!T×@jN§<¯¤æª•Ô\zŠMRsB©9˜ÑžQrc$r©äÁ¦NéGjCHÍÁ¬”ª\”P'&G! d娹8LðÔ¯ jDìO n/Ì×@LN¨Ù‹€¸jy(-OÀœ` 0ÝüÌ~pZÚʶ£&ç›Õ+ÖV=G•Àœ@aÓD…¶¤2þ‡ÕþWœgâÿd#©ø¯5þ‡Lþg#©øŸ¨5þ‡Mþg#©ø_Pkü˜üÏFRö?Ùy4‚Œêø3ùŸ•¤â¨ÖøŸoò?IÅÿp­ñ?jò?IÅÿH­ñ?fò?IÅÿüZãÜä6’ŠÿÑÚâÓø;IÅÿµgüÏ4þÃJRñÿÿ³÷,`RgrÁh¶åK¼ã!ê–'‹º;Ý=ÝÓ3+  ,¸YÇ1öL÷î4ôLóØ‡ÃøH‚/|â“_1wÆhD5¢#1º>ðâãP!ÉQ|"¾PQÏ»¿ª§{º{vgwgÙf’ëÿƒí©¿ª«þª¿þ¿ÿªîúÿêÙÿóö\ÿ«gÿÏ[ÿ»þWÏþŸ·þwìü—«gÿÏã¿+ààõìÿyû?®€ƒÿÕ³ÿçíÿ¸þWÏþŸ·ÿã 8ø_5ûÞþ;`ç¿(Vÿý4çíÿ¸ù¯žý_ÿ®€Cþ#ÕÁoÿÏpÈõìÿ{üwò­þƒü{û¿®€Cþ«çýÇWÀ!ÿRuðäßÛÿuò_=ïÿ<þ»þWÏû?oÿßpèù ò_÷ÿÅzû?nB ÿrÇòåi%¾|y6£¨éåÁöüUëåd¥ÝÇ .ãÿc+ÿÙa4Ks‚çÿ͘pܼ–ºFI‹Èul=MM˜P8h߀œ'íË´ŸwÎÄwé‡ìõ3öØ,>c߀fÈÖÂdKH¸ü4-›”DÛ4­³ùyüeýˆt'´Óµx»\¡° ]\;Ï—ÒT­òÍÐ23°G]h[w­+É­”ÔÝìR¾´œÉ&g‹%Á Eb[øšQ 7ºHŽB/˘J‰]¤äÈ¥)ª¹e®^ƒ‘…h¸‰Gm2 3rª]TQ2kþ¦({BR6‰ütù›Ì)1šÍÈ&†Å‘=”T4oUåNÍZR䔜VÒ&’d[ Šáƒo›? @|¥bù¦GeIQUÑÀ1@F“ `­¯©” ªkr’ÁM62 £Ù^t»¹‡ú€˜æ’ú ¯Í¶úü€Yè,³Ä·ÄÖˆ` ³Tß&§âbBЍæôV´ÝÈAoÅRê8hVt6ËA#bñNè»h£•²D+ 8 "êpHm$ð@‚\J.;Ià¡QÙÖ(ÌCŸb¯ÈTz¨ˆQJêƒ~*¶úЂMibÆÄÅ ÛD iš­ÍÔ£•¶R4g›è¯foú ÙZ€ -­Šé˜‰»²vžÙÒ6 %ëlS€>dmm Ðf—½> .ãF„(jå„ "1(Sb;” RJ 9ƒ‹å 6pø«’Z± *œPu‡šOàFñÔ %åNä›Ù<%dÀ€>BùJjIò?”VYMËæ=yÔª¥DU5¦jsj1¢Ù ͦ°G-BöyJBÆ$RyRз@‰ËéºùH²ô͒לU%ÚKæ4M•Êdõr¯éo¦÷œº¹UY••Ë”è±m{vo•Lײ)à~oø^7ò{lÚšÙKQUS<›ò(¢è,¡ŒÇáñ¬%SZžgˆøÞmWÎÆ.„(_TÓRRf_]«WÔ.dã¡þˆY5ÓG)R™ª¥uš³8ˆÒQQ•õÉô5'Ú[0j¦H¦SOëÕ©ËIYŠ<ù$wFñäoGΛô ¸‹$wÙÇ­K•ÓP+öœ²±ttš@G KQFȤD9Z‰gU"…½Þªe2ú­LO·z@öV•’h%’óáV(WðìOÄ ùtGý%ؘÖrXέxk<ÁrˆµE °µª‡è‚2Vd6Ñ#:…M¯¬¤ˆmZBTÓv<0 ¦i+ÓXáàæ3XÇàˆò™¹àÈ‹¥#zÊZ¯L¡L2¯û*”Ð’…"†Z„ÿVJ}D¯âø(W3)h"©4UãÓXf›o…5¡XÀ%´A¦¤ã ·3¨-ƒçt ‰ìך¢äÙD“’.…Tm¸v"ÿôgM¬‰ ™XFYˆ3 Ù¨1 3C¤tÂr¾¸Ø©ÿ4Æ,úlÊŽ¢jìu™”ÎFÙb\“𚑪UM”ÈT¶h9¬žŠŠÔPsùs-úÓ™eU›ö<¿´D¡OEú°‘ITXzL6 ¦Éì‹we“I[_¥j6”Y¡‘¥flH½Š6@ân›4eÑ,K¦,þ çF_õŒ¢¼¬ÇÞ {²l ¨Ç׉+`¬« \@íÁú,¥u˜Íè­X]Áð††Œ‹ðŒNgS²ÁŒÿ8˜!úsp^KYó'±ƒO/-ƒ.db`OÍPÒüÐMQ>ãîÈ”ÉS+rx'‰àf¶Ïb"}~d3¦Å_ gâäÉ,iÑÄ©S'¢´Ø*#-t Ùr;hphoW¢ØLRÅD[ÄO%Ŷ‘-#ŸcÌ&XàZaùbRW;yò$x"%PíRýjæ(6uj/Å—uê,Ó÷€°›ÎÂoûPÿ3·€pþ\°Ÿâ3²ÍÓRØ_`FªDé;F ôÅ"C¡GA6¥WXÔuºv3M’6s±~&n‡{ˆ:Z”2ŠÁd]°Έq[iüÔþ;µ˜AKÔq<f‚FýЧÚ[øÖÊ›(ò*h‰/Œ7˜ñþ2Ù^®7nÚã›bSZà –v3‚d–ÄÛìGàÝ~òˆ®¸P/<êm–³D‡Ç:Íàð(.×ÏÈ·v"TCeøUn.âÀÊEn¦»Ò¾ ,& Œ,;4Sä˜3:ëfŽî™sýâ ƒ«…8ÁÐ<¹À.•ÆoëO㤠ÎäK4˜B¯“aHêöbÆy0€÷ý÷æ„òïÿh[ü7–ðû??þþÃ{ÿ7ôÀI‘+ Œ …Zý¬Ÿ‘y)Âò­œH3¢’™ƒMŸC ý—ÿþÇ{sBòÏò4kÿþƒ…+ïÉ¿p`â¿]væ+·Ñ#¶¾·øí±Ç®{úò«ŸÚñøØí±wŽ=ùGç4Ny{Ë™Ÿí8éÕÃyà¶Ú³'w¯»9?ó“×½6êÂk³~uøØµ¾Ü‡‡Ì­=Ö/¢ã¼·åÝÊ­ºßžGbþ7Ö½dÓŠ–±l}î¨'Nÿô…øìÈ´ßMÝ6ý£÷#Gÿz˼ÉÍüŠ3kǘW¯½‰Ñ^ßpϧҧͻVœpûwë§~Ö‘|qµ:¦&Ž9çî¹ \¹0}ëüݳ/^vÚgï­øæ®§w컣~çGËν`Ì{ÑrÇ–·ØŸÿôšÕ¾°àˆÏnIߺÿ²ÄÍ3»w¸ó˜«îhÿÖ£GýæVöœ÷nßâ²ÀÑ·ß4óºÑ{¾¹;øÔ5£Wóý±ëüÞãáô@Âá…í †²ÆÂ¡ÍX8©1mzpa‰0S­.8¯.H–›.˜2.h>T¤"H—| yX:qø¼×C€ ¢ð—© …p`I° Z -åJƒJ0}•xå’ïÕÏ\ùFÓÈU×ïûç퇟TŠq•æñ+Çó¿µ:¾ÿCÀóÿà ØùßZ=þ¼ï¿]ÿ«Çÿ'ÿ®€ƒÿÕãÿÇóÿâ 8ø_5þ<ÿ/ÿÕãÿÇ;ÿã Øù©ÿ?žÿWÀ!ÿÕãÿÇã¿+ààõøñü?¸ý0ý?‘÷?~¾ ÿ=ûÏ(áñýŸ˜HdQïJ“·€’œ¬ì(0fpïïÿXާ9;ÿY6ż÷.@uÿåY1ãö{€½ÀÞ`ï°wØ;ìö{€½ÀÞ`ï°wØ;ìþ+>\Üêß `.@ Ü÷ÿä0ƒx¡xÌÅ)óœ'‹„bÊò»‚cÀƒk¦ìQàWrزÕ<ÐÁ=ÿ1ÊÚϛ¯@eç…—"ß|XL£¥05rØ’B0í8´ ¤Á7 ,@þ¥äô4­ã£xÒ"ò²þa9ò-œß¬ÿ©/ùa±´l·K ýJby0VËÄÕIhêT\‹yël%±’ò5Ιch¤¾'Óç$ë•û…NøÄõó±>“¤ßL’ÂÅd“­gRls•žgrˆ㜓:?*šŽ–“Î%sÐý3ÏŒŸFAÖfŽE!1£Ÿ|æƒd¬sÏ ÃÀ ˜!5쟋Æ'ÊCVmcÑ/lùÁŒ® ò>OFXÄ[ô‚Ÿóãº8'ãZ±Zˆø$Nîí-\4™<`Ú¡¼(t§0l¸WÅ2úXH⢖dYOC×X™‰‰·ÝClÙ‡ ¬KÚRËÀu?h]}ó›ÒâD,hp<´!$¶ #k #Î VÒXy%¬&èL? [ø¬\Ò9ŸÄ‡,’•oÝ«ÁÐ{k<›C$e<šõ!0™·¦*±ÝT¥6@ €8¾DCŽTf›–8ª)¯8†Àh-ÚÂP|ñ –6¸^F†\i@¹ÐV¹°ƒT­¼ßJ#hµÀdeƒ°ZåàåJƒñI’T^i¸h$è}2žÛA’2žÛzGǶߚªÄDtSå °‰ýýÿX C¤g>ÀŒ¤*€%ÏÅ…Æ)¼zâñ"ŠÅs%Áш |Ž`=Ö¶™ †TÅšåsýCí{ F¯¸¢CÖ Ü©Þ'çÐTÞo%r L?9ß®~’dC¼¾Ÿ²/ñÇ< ´åg°Ë¬ á6¼Í|?(˜øSýŠ sÿ2‘ ‚”aíûBÑB  '*çc…õ÷߈<`rèŽp¦¿§‚”ŸåÉ+@vHAš§­†gnȼÁØñ•Tîù2«*úþw€®ÀÊÿKþ¿,Ôù¿ÿåqü'ïûß¡‡¨ „€ò t(¡ƒ|«_ˆH­QNà!Ù*lú<Z¨Hþè ¬ùçÒïÿý‚'ÿnÀñÿõo‹º»è[¿:1³ù{þÑ÷/Ù2¦–õöqÝ».ùií¿¿zÞúîË¿>gÿøiÖvÝ!ß|~|ÝÕ«¯˜?îš]÷ÂÝù­ñGòù»_ÞÙ½h_ç®Ü¿tÑÔMlfüÜõÏ-Üöŵ[OÙÿøÞ¯¿ ¿²¦³ë¶Ã9ÿ–]ÿ¹t_ö‰[ÖÒwwn}}Aó·7,Ú¹{ñÃï…sÝ;V¶½vÊêsßsÏÖ=ÓÞ3&ÿÀ×o®œ¸cí®ÓGýäù?ü “{òí‡ß¹¬}íæÙ“>Û¸õ]{_¾b÷Î_„Vþ|Öko\uãM×ÝÐòúÓ»‡×ÿìû?ogV½vÔáé÷ë^:~áÞ}ÿ—Ýk>[ÞÔ1úÍ+½oÕêŽÅñgv]rã?4fÃõ v_ꎊ_:åø¶hdܼ‡ß|öøÅ[ãO}T÷QÓö[ìÜÕë¶ß} ;â¶…S;:6ï·GÿÏkŸ×]ôÜǯŸù–vÔ]Û=ðÛaÙà­'4¼Þx5?2r¢¶é›µ/¾³ùÉè 7¾ðñ3—\mŸš~¸ùÕÈHùüÃ¥õþ?š²qäƒK^Ðúú£÷$Oùý7â—¿—®ÿê¦þtóþÀ•÷\·óú9ÇùøØ6­ =vδ½Rx£uÏ’·ŸçÕ;oúäܱéÂÁHú[ÝsoØúôKm½ó+Þíœõ7#G?òlíô̼Ýù/W¼|þä+V|ñ_¤?™¾^˜¿¹cƒ|דWïû_ÇþfZâÖÓ÷Žüæó5üC♳¹éSýÛ¦¼õ¿O%O¾Kýâýä-èüšýcwpѰÍÿôS#Áïà×~ÕyãVŽºëýû›þá›vŸ2+wØå½ºoaîÛ _%ÿmŒßêÀ3¸5&Z&½TwïVpìÆ0ú…¸·Zöëã$ý£ hŒÔ׫äm0dlŸ> ó5Â} ç7÷ýjòµà‚x —oxk̤ÃêN®”|<˜Ë Ø{t ,ý{—×'9LÙqáC–Ql(„øPYjúÿ¾¡OŠØ²„9†@`5Zž¢lföISqF÷ä!Ð"²Uê!0À‡zó¨g¹é!/ã!¡…ï}L0Pâ5¡™@©'A¶Ô»`Oƒt‰wA†aK¼2BH(-(ñBÈàCsNÇ•ÖÇK<2‚¿´ !`Á•zäûð8xÏÅ—ÜûòÑ©c]ü«ágýíkO*Å8<²tÀ?û û?Zçÿa!àÅwþ„êà?+ÿ]‡üKÕÁìÜã¿àÿ`uðäßã¿+àà¨jøïùÿtú_®þ{þŸÝÿ«Çÿ·çÿÕ°ó?Z=þ=ÿo®€ƒÿÓÿ›·þ?ààõìÿxö¿+ààõ¬ÿ=ûÏpð¿zìÏþsü¯ûŸ÷ü¿ºvþKÕcÿ{öŸ+ààõØÿžýç 8ø_=ö¿gÿ¹þLûŸ|ÿËáïÿ½ç¿kPÂÿ>¿Æ‚²l3¸Ì÷ß~Œ}“ÿ,ƒ¿ÿfY/þ³+Žu%å A›œÉõÅû|Ž §erB— /×Ai|ÁåñÕqZÍ<š/·Ê)ìÜ/O…‰·É\?çZ>Lœ"çÊÈ=µ”äóTžZ“ÎGøCV’Ó(˜¨*|º%ÅT;À$X-‘Ii*’Č؆ éc¥*‰•9rϹ£E‰gUÜîhc±É|2Ãufv¸×Y‹Ô#ŠÊ…3>¾@?y¼îï²>6~êøIˆô©HôsKP1\l' D@ÇÂélÄPn3ä þ¢SB3dýó]@V£ú(Œ¦ú£däøRýS߆eø _´XΜ-«˜áXJnÍÅ¡W­A…¼’u*y¬ÕësúÐ&×'äLžL‡>KÁ¬@d í—³HÿL¹a]ÏôQõܰ ôl)· ¦¤±çs`~{à”¬#Yì¨[IŽiI»ÝÌ %ƒ:°Ã툌S¶fÕ“”D‹›œ6wáÔ8g ZÜ8~ãœKN†’0L+·Ëz=J<©*PmŽ’Èt!­Ñ4úiP¾qZóìæKðxfó‚9M--èÿØ»ð(ª$¬‹FDWVuDŽ $é»{X@@!$ÜW ™ Dr@!ˆˆ. ˆˆ (ˆ¬ ¸DAp(¬€»"Š ÅDäAAÁíz==ݯ™žžƒ¬Ûý}dò¦É«z¯êÕ«ª~]jÏ W²+=9£wZJŸ{’3\é}2Ò{fvNt!ž‘š@­N™ùìb¯+?OT½‘ÔÞ.ve»:fv’J›Ë·]™^/b'¥hT9è’Zß<ˆkt»§¸øD󜞦L -žïë)£·¸ $ÑtÿàÿåŠs#jZyVh±}  ÀþÍP<‰ûÿÍRœãÿÅâª^ø?'~P´ƒÿãàÿ8ø?þƒÿãàÿ8ø?þƒÿãàÿ8ø?þƒÿãàÿ8ø?þƒÿó;ÆÿQr@Öð8špQ‚ðÿƒÿÕVåR³4‡šþ‚Õb“Ršê†-  pIÄ"I=芒s†”sHõÖQÝd¨°(¨Š*+U”éDNS?Y_g9<` ÊEÒ4BS YÚ~‰o>ÉÃS†yøâÃÿ‘Æâ/„+5ý€<Òý€£‚ó Ó¿ò¹`hcÁìL¸¤ÚÆQÌ®_b(k‡%l81„ãýÁ,ˆÿ›¢2n•}`'ˆFù*ª› G‹ÿßÅpœ a>‰å•›M¨BKìÑub(—[P| K—0Œºiˇ±Ó½U£BcHe¢Á'œdIü>ŽåAÊ€b€näö[ehÂÐýb¤ºiÙ02äl¢Ò ¸y1ºÒÇ~h+:ÐV¬qÀa:’Ð1;R %+²) ´[´”è̸ŸpØèBW¹%'IâbU).ÑÅâÈp «ìõ2 Y¸Ñ*â“ñë"œˆ#Å  ‰±¬/WàŽ¾(›*SJšÈpü?›ýÇŽƒ9÷'(^šzJ\1àÂ#¾9ÅÕ‡#¬°š8Ž"hi§&U[µ¸{CTň5E»%WžŽ²(ÅUj.’*Z/:0¢0Di¯«¢äÔ».‰ÐnÁÅ Ç•÷\äÊW‹Í—TãüÂÏÛ7òVH† )>)»›.e)lï±CÄÜ;[4®±Hy8~à°‚5ä—oÉ«ŸhŸ1U¦ÂÃŽ´ÕÈV?Üè ™yZW„'cX}å}+EqªŒw¹!c]lºjwfšc±‚Ë%GUˆ*Ù)Šc±Iæ9uÓŽíõo9ÊŠ”Å@¼ç&³&… <óBŸæð2œx@’a<<Ä™:EŽâÿçE/ „Ï’ÆEwëð RðˆˆVL3ƒ\sû¢´ÙÈ¢ × N(­%Ä~ Jé“CŸjQR$‹D ™9Y]Q‹œz*)‚W¦Òá`°Ûìß²—)ÓɈÎ2£h‡Z𜌑Œ_”óÖˆ<«veTAÄ{lX2°Ñ¹ºû¿Ù~ÿ7 à õ_0ü_žbàý_†pÞÿÉE¹—“CS ““C’ Éy™œ\VtÂëeÉ+ÍŸsE÷²½þCÀ²þ9Š¥tïÿ;ë?6WdðßïwïŒ]]oØðK¿Ÿo¹£ù¾!C.•uîØêÎÑ·¬¸¨ÃU-©ÙwÚù¯‹6|_¹€èûÁMuã+‡MSµyiÕᤠû.~õÍð/½úˉ²“_?|¬tõo7ž½´ù©Á§†Ìôô­î†WÝö—SOQ—2úÛÆŠ1E»*wÿùíG_lw~Éå==¸Ö·|±õÑ‚Êå~Ú}ªÇþ;æ÷¬QôÕÖs-ü(ë‡_¹/Ï|{ðinÉ7‰Çj_ߨ"ÿòm[^MüêÂð·Îž°xù»·þèá±õ¾/:<ŽnÙaïk?fh?&iý‘žìs¤db½Öü© ûN{ñøŸJ>ù|Ü÷Ó_~±Ñ›kžÝòÌæAGÚ.yl¾·Ê³¿ÞxWçÚóì}æÃÂc÷Ÿ;ô>1³[|³iï-Úý§Ïrv KÚzb÷…¹®~ëšÍp=3„Áƒþ8÷þ¥+ßhлÁ;½[ÕªuaE·cïº7¾5¬É¿o¸}_å¿ÿX>í©÷ËÇÌä§Ž¨¸}OJþÈñW•YšðXÆýø®o¤·¦çMJ”ØùÐú=9ó7ÕÚ°÷—žÛ—ÍK¨Yùe¼kCÓ¡™×5¸ðП‡­ÝòØ2obæ²S«rÿή~Ú}¬¢õ Þœ»¼Ë”öº[·yªÿé#[Þz£lj!9nÀÄáW7œÇ»þ¶ô¹¯dýíÉyï)›ztÇÊÊÛ›]S¸ä¥ú›Sz}OÜ×mÕ'ßo:S£FÜÝïO½cÖK÷8‘^˜Ú¤fÖ™ªVÛv¯·¥æŠ]?ÔhûzÇúÓçÞ<²ÝGÛ“ïÊjùDß—&6qý]³½7$lÿzÒ¢/ÎöLùŽØU£ô©”YíW6m—süÐê™· GÛwÚýÌžZµ‹'5Ž¿á[¯!Õ¹ùæ«uÈN˜¼¬nÓ[άNëñÃÄ¡I+GŒMnà©|¯yqZB»:Ï_?rå5®ª½S^ÿ×ÕŸ½—ö×e½ÖwÈøäùGZ =vßý¯¦Æ'´úòãþRŸ^ûÚ³×õù‘šüÀ4ïSµŸè9¦ï¾~#†|>©Áƒkrr5}öÛ‡_kÿâ®ãÓk.bFÖióÚö‘/ütìàñ9o\"ÿñÐ@rÝ«Þzo4ªß²´xÍ ›ç4íº÷–µ}ß~¤åé:Vßûü7Œë79¾nÿïÊG6¯XL¾Ù­ÆŠÆoÏ`ܸi{Ê _ÄM½žïµ®ÝÝoÙ“ðiâš²„ÙŸæ§ïxf|ÿWj®°çíïx©e;—Ïl~xê!ûöõŽ=±nîþ½µO Zz€¾¥ã‚&xÏïóÁ8ªÁáŽu×Ï8¬Í¾­JY¹àôÊqï|à™Ê´Ü6ßœM-¨Ê)?9ã§]÷'öüç¬Výˆ)ž]ùî^Pcôè’;çU|]¯í·%Çy>÷þ_ü¼rú£wmî½âàÒ“Ó[î›lŠÑ,î"¡€4û^‰ H3«i欃4Çùà%`çßd3ƒyÎç2¡€ƒ¿ôj3ãæÐ£Ž„T+‡´Ãm†Ä)E¹]d^ƒ€$[?l3:",±Á€¤­ ´ÙHšBYNéxUÈo­µÀAG\ Û«ß‚ò£rÄ Ð¬9WuG³HÚ ÍZºK4k>š5Kê¡)–×£@3¬ášbt(ÕFhÖ$djµß±¬ §kð·¬Û‘Z÷·¤ èÇAPz$¯CǦ ”ö;†ÕñBÁ“ÿwzÔk>êu«9eçúž<áÉcÃßy E×–úo´¨×¼@: ¿(^šø¿Úà¿8õ¿csiä_}ð_HGþ±¸pù{«þ‹ƒÿ“K#ÿêƒÿâàÄäÒÈ¿úà¿8øo1¹4ò¯6øŽÿ›K#ÿêãÿ;þ_L.ü¯¤ÿžÿr$ãØÿ^:ùë )2<ÅYY9EùùYY¨V(•ÿ¥ lþüŸåÅ/qùS”h œçÿ±¸ªWýÞØ£ÖpÀpÀpÀpÀø¨’@Ö Ð$!ñÿ@³ŠsAÁ±D…±Ù!‘~VÝ´6©@UÙY•Ík¤h²Î-ãù ¢À/\"O—]ÕT;ÅíÿChV;QŠ`¨ÆMß8qï¥s ÷w¹ ²d”p¹ª âÊÏ-âL©ï¢”jñÝð}'³‹(%½|DÅ“•ç±NAýzÊ02 ‘cÁÆTDÑ$Ö‘¸róJË‘;cÜŸ¦^¯ÀކI‰9D’tc$óJ²r‹Ë̸'ÕUxÑMÿü`¸`ó¾#³x•ØÄqtuá„%UœLÆ ú-ªüÐn?²e>%M‘ ¥B"&)Íc…„b‹4Ó‘ Õš/(Ì$êUϽ®/B­+i%©ÅeºÎÔ=òœŠOÃÝj‘§y2‘e0ë“õ‹ØØ“àÝQ'Á©¥ØêtÑD舠®MM4—ÈhásŒÉ±j‰vB¯ç˜«ŒÁR0ì”Q‹=ºôšÝ>è3—V­x²‚ÀŒk¡Z Ê FY¼±f¨úI÷í2cÔµà̶ =…Ð  ¢»Hˆ»s Œýª…9I:ÇàèÏzUƒ’…òPU•Áh¥B4aü5Þ)uÓFÙÂȳYº’ÜÌ\}ÓXB#WE %+X¬*Ž0E²¹ÆŒÔÔ¨'Ïa‘mD‚4è f{z ÅœµX†«4*ɬôÈà+XÚÍ{gëÃz‹É™ É Š…®]‹J3Å­ •r1§ªL£f¿R’ µ7&…¼é°OVd‚/ÖÉjéš™&oφÕô|ë5&ʺY\¦ÞÒ “«é?´1²/‚ârƒÄ›fø‘ç‚h<Ë“ú™’=*{X^~^iž·Ä®¢â¦I3áêòzUú4æ”uë•Ú£¦ºqÞ`6­¥Iæ0˜ðhÖ€\¦÷o±h(íõi’[@I/*ÖϘ#ÊÈÜ¥BÍÛ“€þ@#– %±ÜA*# BMªÓPs]­Ó,1¡‡ v¸ÅÜçN^ðăi™Ú%¡iƒyжs¥Ðæ4gzK“ËJ‹:-…3Üp¶¨¬4˜õÔ4ÕËB3&lœœF Fž™Ž[Ìïb‰[Kn5šF—‰ZÐUŠ¥|o }ÐüÁí´Q̬Àh×f;µ±[˜#Ë[8ƒ™>&ì#ÏH¯‹F”Œ&·Ø:6Ú€´ÂìðÑ%¸B`‰vk\UQzQ~^NyJvaŽ7?È®n,ÅÝW6 ùÁ¡V µÉ4æ eÄióoì…¹EÁf-ä>ÈžOc!‘·†®w‹E>Wâ“ Ø`|ŠJ:â'ãð,-þÄÙ3ÍtÓ.ZBMŠ•¾&ié“ Â@m°È‚ò$‡܈#ùÑ ºËbÍwý]sÌ¢jÉ›f„µüÂ~E2<#ˆÔE‚RŒvþÊî©«à8¸Œê (§ $@?0­l?å’<© ef;–åæz‹c„¿ì¬¬¯-‹U§¯·l`0G†\€u‹àÌUAºñä†ó4Ó§A²G«1üt"©5†Þ€¾%Ø„@;xÂ[€c9øs›aòض <<;r9«²fÈYD. Y2ú½ xfÌŽšUcži³ ·óŒ¥ Sà<¼!‹f¿®?,X4Ê[ ãwefw•§ÌBoƒ Z³dÙØaÁêÐÃu’‰X¼ÎrâßRþx@ôbjß3(!zšP¦Š¤ÄÝÀv&JHòd³úL”râ&F™(ÿä̀᥶O¸¨ #õ§9¬m#9’3RЉ*01žåpRR! |’¥°Yvð”Ež:ö PF]Ž*"tF=ÀhÍhëcÀ’Æ‹\B%GØ$®±Èÿ ×xÎOÜ(|G)qú âi‚æ +:®âqŒkBƒ×œ@4 _— |P@K>X(ÑÖæVÌi[c´µ¹é(\aI)<(¶;vµišØNnÂÍ̇)Oç$Lž°ŒNò¨Q¢q„¦`çÑ5?ÌŽëéa‡­R‹‹ L^\Õœ—ã⬈š’ME«¨$È$‚‚QR9:9‰ od £““³àrF,Ò§pµXå G’PyA@1hz݇’JÐ$}AÈwĽÍ÷ ¥üp#Äèêá2bGOcI¨×(1Æ…'Çr“hÆe”ÀbN%%PÒÈå—9¥û¬ÒæßGƒÖÝçÀ•c1qå¦4IÜÃŒ†_xu„PÏ[Z¢ý§)DA|uPh-R¦àr»á“z΢5Šƒøä”"A4ƒ+­Q,Ý}¤X¼Ò_·¯‹Ñm$f,çcåöú‹“+úÅùïHå¹zûP ¥2mRu/(üîÿÚW÷„žâ”¿u «Åeÿ¡À"0G`üñb$ü†f)ÑÊþÅÑþC,®lA–Ëì0ëÍv ÂËå ÉÑ|›Íæ^iþœ+º—õ?Ê¢VYÿ)«~­{¯⯾cØæO›Í^V§í;l;'aÂwÏ­ff­è´£ÞÒd¾ÅÆuÉn½~›øäü?l>•WçÝ!{z“ªnk4±ö’Ë«&ùøDåþFw.y?¹†÷ìÀ{óvMÛz‘Ù%9îêóµ^˜8îÄ¡ÆÊ»ßpߦÏ7ÍI¾®ÝÙ{è(ªlgS@”Y_„;½w6¶ì„IHÈBéTº«»+éîjº«³Ð4¨È0@(ÈDQv4„MvedB€ùȾHäA†¹¯ª÷ þó#çŸÔ!tÕ½÷Ý{ß»÷mUïÝ×¥àÇ‹kÞªž½©Ó¤^…lð»å?gì6òý÷fulsTËh«h™¶c;u«Îì:¸ÇýÜŸdm×Åqsë¯*ózÐ/|{V²öñ}ͤ?önõççïåõ¾¿eÊU…_þä1wÖýãmeçÖåÜŠ?šveÕ·3;Öü ØÑe£xöý%íÚ_=ÕzA+Õ©÷gdFWõ:<¾z˃‡ç³HoŽz%ïxwé(î욺ºìXü¦ÊASönm·wEýèï&·ª]8óÜ•9H·?»G¡?ÊÎ’¼}ë¢îÜ‘ÓuÿsS±©ýì¢ù×2«2¾:]°ªðMݧlÇÄ/:vŸPoÚ°ïë>1‡ýk¦ußÏ/õÌ:SÚõâ16~E»%›NVŒ»»8¢íÉs“Ïh—l¯þ¼¢âãÓk'lÉÜ÷ÓmëUM±yÇ:B÷Éžè¯ß=Ö³“üÅn=æ™wÑ Ÿœòzgm|Á®‚Ï2r^|ôùü³m/¼¸ïø°è‰Û¯ô,è|sÞ*…ß™¯Ç Ö Ú(ËÓf†îý÷…¥ÛWç]ýÓeÉìvmüWô;þò¤s§—IºuiÛã o¦æN­úcPÜÝ^QC®ôø^±jI½qù…û{ŽÕNß}<¿úü ¶ã·'z_MªÓ[ϤdGž?,~éÄÐêm{ÃLV¡Ó‘âðø³³Û=ús^•Ò‡š_ª1¶ÚYÛ]ÔÞü¯.ãfDé^zcþ½šÙ!ÃT#RÒÚ[l¹×ê³ZáĬkm“¶³qùE¯ÍPe8SþšŒUó ÚˆsF%;êëet»¿`ì .…CãvÏ;[pôõì²~ú‡é€Ê.‰~DeÄ¿l÷+f y¸:oOÖ–ïn%K÷o]<£â°hN‡Ý? ¼à7µlp€¸¨vþž+ûQùÝc’Ý}v½\ÑóãZëæró­{{rסC ßèë¶ÞgdÆö ÿZߪs…ðAåóm7nd©¶{ eþ§-ž¼êµ!—·uŠX¿püG_^¼u§M½mOõÊs GGoÙRÞùʉ·ß›XÒ3}úÍ‚#C¯¤¯œÞ?ïåʘ»‚Ð+Žì´yÓ«KN%Ö¨ÒöÝïzª|ΈŽ}×”ö]»Eo.r!F ˆÌ­˜ziA`LU¶wU?zÙñ̃ô È¤ãË‹ÖMWí)¾p;â½´¥êºÏ > ûÎtâÔIJP42à›Äã¿S·äRù_'jLûßHÞ(K~ûxpÀ²› ž?5­fóÉõ[`#M³Í)¹iž4´|Ãè{5Óë7\Iø¸jý[gwSEɃÂz-n[üÓ+AÃzMs(kÔØ>µ+ž ZšÞfêÆC³ZÏ­x÷ÞÀé?3nèCM« y×$³ÆÜ§ŽÆôy¸èðšÄ6NEouˆºñ‡»m}v¾$Í?w{§w™[—DFïÖ÷GÑöc‡æVÔ+#NF}þÅ ý”é~ˆì¦®ðo3¸j`mн3Õí–^?Êf–ɧììPö¨kÙç7”Ó÷ÔmÕÌy¸rFÍÒ:4íƒõIïÕw˜õ·ïlŠ~×BÍ=2Jœx âý”ÍÖœ²±ë¨õ“ßl=bû®£5]_•$MŒï=:±óÏ#¯ïÊz·ã³¶‡ßœCF,‹·¸_U|á7­;І3æË%vË÷Pû^9X8NUóÚ´Ÿ­Œ8Ün;ºfNTÀô’ñ’« ¾²o˜¹8@˜¶ëûÒmÊãkͽ~¨´˜{¯2]óÉ¢iÅ=¦îé–¼o‚¡>*uæü­GÌûù„ìΜ…§¬å1ûÉy³ã‚”<¿²öêÑîìê6Gþ¸;õæý‘+K߉‰)ü).÷Z›YW%Ï)ÛµRv¦õYq°}xAÑA]ûI‹Z_}ãhØ^]–ÜÔoS‡Þ­ ²´î½Ñï¶‘íüÑòk;#®¾ui­47þШAÿ5ûЙmeßÕ—¥¯ÏLh·úï×o„G?ȬÿÀ¿þÈwU†:ÿegbhn}ÿ½î~Ðoïƒ~å{þYœuøÀé/¿˜=+yðä^Ö†<VÿÁV9Y>JR·®»Ä²ûÕ ¿Uííxyç‚ò³ç'°µïY1dFâšÙ_$”}zFµå’Lwe ûÂùÑ[;ÖN:ÐCô`Úº½]ÿ¤Û}ä«Ûb›©þúäâòšìq»­|4ïÄ΄+Uô 6Õ›äÏé~¸p.ry‡ž#·ˆÖšû¼77¹ve•1iÅ÷7­vÙíê*¦¶öÆ·ÛO²oW/ÿ~È·CÂÖu¸ñÍÖÉûï\è¾3oý¿ÏÝßP4¦Ï¥Õ'§´}]š>räÁœ¬å5¦çæ.ªH©»ù`ÚVsjeüœ¤á#ÛŸöïÿÎãòö½¤ óTV÷ÿ±]joÿ5­GGå÷Û_@Ž8ür›ÇÓÖv¼FËX~ü¯òµÏ=â/ÈóÚŸu#üžbrt·NolÝ-ìКÐÿ>23hÃ;mödQëûïÛª“øÊ‹²e¢Ä©ÉVóö[wŒ/þF®D2¾tõîGåí Oެ¾h|ùawõ‡£E½v¹½wàxíã?fÜØØ•2ª¸Ãƒ…cP#‡‰0™{ ƒ?Y ñ[ a¥¦É(¦qg 8ÊçÂT.&8w†ŠìXþa.)fF•F±ÙBP!!^`ébKØxnc%>4K‡Ïãóéa%Œ4Ö’ÆÄ"þ‡ÙNÍâØ/øü;$w’;”—º”GœöˆSß‚„¡Õ”Íe.•ÈAøü!,Î#©Ø;ß@B²¤žÑ:YH}D…ø”“+G„09% ‰‡u†ùr#ëSðw(©, ñ åP2Ε)ŽC„‘.#5á—Æ‚$„i˜— c ·Å¥ W’«ƒW ñ¡{ÅRQX“êüÂYOUHܤBaÜB“0äXa"mR¥_¸Bç©*IÜ*¥†p–Nõp©6”õƆº‘Q¤…Â^펆ÏgÃÜ’1HìNï!*ŽÚª¢ÌbÓRP¼Ž±°•™6±(4X,‡LpûZiÆN7 &\"Âo¹%0O”†ÉD€ObÔ¡gYð=ÊRÙäY–øÃš0ÒŠ äϳTòZáƒÌX=5 >ÈUŠ%fJƒ7¦É÷i¶8xTŽ4È“ÈeP%9ŒÑ “Bcä “ÈBå `’0…/ ¦ÏO  i@'‘‡IÊ•„4 S@mð…á8f¾°0‰¨?‘¢?¨S0Öñ*˜[q†ÕÁç<â¯ÐÜA3©ø40 ƒícB Êq±Ãm³èrß—Þ_a½^©4–=”Cp3PÒÌr&Jä-¯•õåýþGC>+çË-ç?7ÇåcÿügÆþ-ç7ËåcÕ³b k±3\>öW?3ö·Ø¿9.ûSÏŒý%-öoŽËÇþšgÆþÒû7ÇåaÉÿ…íñõëí/‘Šå-öoŽËËþj‘èw¬ÿ ©H¡Q(°ýCÄ-ã¿f¹ØßHçæZhCn®Æj ssÕ$K憪L¦` úm2°›Xÿ!•Iå®õ2høE˜þ+ZÖ4Ç¥Ô•š(3–bmÚÞn#”ŠÛ8Љ”¹JáLˆ1i0P¢8ZO¡TJC™ñiÎvBÉ/n{šwÙ•´QM•p*`<‡v2þ¡v;a'ÒuÒ`á´Q¥·ª) "÷Žœ;­'A˜éH£ZOµáJi&_(´5x£‰¢Hc¡ÝP¥ÀW 0F)àpOåÍLŒ‘2²±q#‚°)Y)û8rúîkaÕ4¬ë;´¯Óù‰z:ÿ)$x#N“$”ÙllZ޶I)J•Ž4ç)_µÙ½ÍÅŸ¡¬sãUrlºÿUb—«üV&ü’ë†É "Á‘RMá­Uàñ¥ü1ÁœÏ5í´áJnù·MCk­fÊž="‡p@T>WWŠ,¢Š Œš"”9î´Ê’Í-Ò"UÈLlŽ ¥ “5^»rsqràJºÙã‡tÈŠÒbÍwÖñŠåâtãÈÎÜÇþÿ©aŽbÆyƒR YÊÍî ÏÁ_yP&ÅN¤ôØß•:3¥±÷êY&\¸b5œë ‚ù’w-l¤@8ö¦§RAíA\Ñ;ä7Tf ÿ©*¶\MãÊŸoeÁ ´±`Fc¢ðYå,¢YTLëõ(ŸÂ'zk¬ú×P¢Ì„ôÉé(rÔX”™š9*}lPB1–*¢x>´Á¤§m1i6“F¶1”›=è#£ÒÇ"ð¸„ôQ±ii(.9E¢”ÈÔô„èŒÄÈT”’‘š’œŒ89çœ;•'ÍÒÓà°a5âï¡$ŠJ‹A¶TïB£4ŠâÔ‰fL¥àx^^ªæ´æÐÉPI•‚) î"ÁŸyï…2àùaPA –àß»sn†Ëgü'þ=Çÿxü'•óãQËû¿f¹Øß݇8{ ÕñÝG0eúmÐôø_&•‰¥Þö—ÀDPÜ2þoŽ+0 %M©fò)$XD:ÖL„#ßEM®™‚”q8¿^‚_.·áåá(Þ½l8›Qé£hÑ¡±bJÂß%G!b|ôz¿™ :m^þDà=s˜÷~)à‘Œ–Æ0l ÞBÂù½tjJC8ü¾:Bh¡X«)‘di£Ù.(0Ö¨b°Ô10Ôv_"W Üw•r V#¼´džƒ…D‡±…ùÇQE¤™¬®{‚ðfA ¤¶šT¤@ÂÈXדžHôÈ.ˆGæ¡Í*«A£§J\`€Õ4L¦,´ÅúÇ"wj9@ðøÞ€¥õj7IF«(5ôõ¤&5b½ÔÛ cªfÆúª!5b½Ôƒ Þü Û OàÊ$4àyMðâ'H†/¸‰p¬—‚‡oF °×BC‰|½+¡ rKz%”AnɆÚÉ@,é+VBHwJÈ;饫 Ô"=M %T>.(/ä ÕP98å«‚„R^BÁ…´7?P“~?P†nÀòI{ñS€µÊ̬ ½Iª1^2À‡i(Sª0¾2_Æ[&äñ’Z0èë\Heõ¶9ham(3T±úÊ íÇ…r€_?w͵¹–€xÕ¶#f< PBœiÌ©Š,üã€×ð¸2ˆG`AΠ ~¸ðª\5ãDƒF®ZŠóAø¹kªS-»Óšj3YŒ ÖÁ¸÷óø½P¾c<7%.,Ë8» (j¯èv``ÊR!oˆwER]€0JÃy”&Fy<òôn€³$y¸ÈYÀ~Þ< óÂõQ„Ì®òåÊÅÏϳU œÉ¹2t¡Ýé&L‰ÉL¸ @JT0z„Ö¿Ôñ[bÁë”KñÿÀHµ¦z¸u‰”@0• — PÆþ[ž¹|­Öz¹£„x™“Òëi“…â‚{à2šK= Î\âùä…òÄH(³§Ýø'ð_¾a!üJP)bͤтçý„0)|«Ë¹­˜Ûû"‚i‘ ¼ˆr2ðV” ‚«ª#.ˆW=uq;§Г¥”™«¼já— ¥Î ‰ŸgTQH€ÔЂ¹°ë«éX¸ÇÆu샀;˜Œ‡Â?þAæù ð|u=äJÀ0 yiã˜9«¯˜Mh Kø[gÙˆÞjö~Þ¼\bd±æ#—D£ÆsFÂÔ3¤šseV7Oî†ÔÙÌÙÆõh?}QžÍ¦7ÎË^ŒÑ‘'·~xÉuT¸ö¸Ìä ´pÞg(µšL^yäër1t¢ô¬g¡ Φ[¤«.ºhEΡLþG\~Öï¥ái=ÓÅ'lœ-"ÎÈ@³øÃü@³ó33Sì0¶˜—æ„ò ŒÜÙBHè£-V3åŒf‹ß£ÃàßþLIps~“™bqy1¬²Àê`<C[XÜéš ¡3u1 )®×²#~•Ä ÀÿÃÞµÀ7Qe}Y×U+¨€¼vùê TZ…’™ÉäQ»¥Š‹”¶¼¤¥¦MB£i“´ÈÖüXT¨?|+â >Êꇼ奠⟠VÀ…Uüd¡(»€²ß=w2™Gd’idsüHoæÎ}{Î=÷Ü“ó<*P v}4z¿¿;ƒrsaëø ¼¼A„ÇdµNêQjiBœD}o²Õšd÷lj·ã|ۄ诙 4A!ªù/Þeææf¡ÉAdNf?¹ŽIŠåå…)†©Ì%kÊA]%ý‹m@:øÇÛ€ À¤@;¼ø@9D™Ó ?&ñ²a”ÒX›‘No HtîãDz¡œ•ÆVÉK;V¾”œ< è"$Ïgi$|C,Ü’ãÅúXb–ÏNƒs\4b DóXYŒ`®ð8`Jš‰ˆ¥å£Yq·ý~Ssv=‡j ;ÉÂ]ÇÐÆ<$u1Dp£„µi=±!Šš.öhÚÔP3mÕÝfwAµÚì¸Èg¤r\Ü2ÈAI>KèlÅMEX3¤VK¢ér«Íe+F¸:tÚXâûEïÇÑÓdëà÷pþÀt€‘" >ËA°šÐ…‰2@{#ô”‚ }2š§ ð Ÿpq(#¡3†]‰©‹š—æ"©:hã )2H×áü飰ö„ n®Í¦‰}6S£h3%5ÞMIª`0V /çùO @bùœmƒiÎG¯tGR ŸÇX¿\>× ø\«ÁÖöPrœÑIü\íΩ걸 œT4 ãPRÑ)FySÖ£– i’CsÕéE„ñ=Ókò1œê ‚Ÿr´Uh£>ѧh‚?89øƒn^É©$–Êe[âu*ñ²9ÐÒ%QÏ!”ZÈ:8†pÐ"ÉŠÄŠ5…?(€ N¬ª„Î?FáÁÑ ŒêÄR¹\ê“¡ôxÏaôFeJƒÄ'5Ô[ﶘÌêÉM®û¾±A#ÔUp–WNpaEªQ|š‹°Z+RØùIJ3!L!.QçØ¨Gý›7'v {Øað¡Ç˜PNdHV \ëEdÁHá·Ì„Õ/—IM"Í -¡ ú“ßï!ÇïðPR¦jÚD ¼©Í Ò¬j‡ÿ—ÑXá™?•Øx8ûÐ䊎a †Á9†d?(M¢µ h‚ßøüÆ›W²oÅR¹l>‘íAŸ ®æ¯ß@–ó×oã/Ü ¤¢›>åMÅÌ'ZáMŸÉ㱸½BÍ\„´ h£þƒuìÌšfÑ1‹^´»èÙͰ[árœN8³ètBÉ/ Úxĸ™%ÚÊe3Khw„81‹vD: quzÎú{‹³¼†Š GІ;f˜ø4#Óè\Qi™.R»U¡ff 0R—V#åÅ1€¨Òˆ}Œ<:00Ó‰54±m„KÉ€!HZ"­ÄÐcý²Ù(ôÅf¼ØvK†_Ö䫚ÂV@. Z&Þ½@Å¡±˜YÈ€-  5:lHG“˜„üÊ™Da‹y”^I³§;~›ôZ,”ÙCŸŽÔàCAB™‡$18ša²hxA§ÁG+Ì[ý²ocâf‡ÃwŒm;Ưw¬DBƒ:m qÇiŒžƒ¼Ó$öŽš6@5,²ÒèO£’Kê˜jšLŠ­u˜LF1™ ~2é‚É„ä4a ÛïÛót¬9,Ñ7ŸZû%¶¸‘¼Å$eמÑW5ù”^^³W{¤ˆ|hïÄäCÚ&-ä2øÞˆÍ±¤–µÇ‚G@€‚ >°ƒÒŸ-{õ›p"‚î'¾^øM¢µI*¤cLõË%¥!±þ"´Ðx©ÕÓB+ÎòÖJ\X¦­4œ¿H<š‹Ù_„ÙQ¹0w"“ÖÖ_6Ø/4ñ¢d?Š¿w‡S Ê‚t‡Oð™è+ p5,o¶ÉÀòfïí•ÝjÄP‡ì“B#sŠ&þSÔÀßþ9þ“†ÃÿÆñŸ‘òñŸm ÿ[•d²2´Ù¬1"–¶M¤ž´RŒÑ ch«EgfCg÷/•›¢áÿ¨¿ý©þ‡¸ßAñßRü¯NŠþ÷ò‰£ûF\ýÆ© '2Ó_8~lпn®~ìs-ïléUü„aUÝ›îžûfî›q`:½y`Ý;£ß}/ì<~ìÎ[¿;9dë:kÑò·^¹·¦aÁâý­§¿[õÄÎÓ_¿´äôk>ßd¿zoí¼W-^pW×¼SÇ®ýé½£?¯ð8úXæéÏΞþú‡m»_ûùÌ“ÿyõý73þÙúTƒÃgºþ“ůœûtEÞ©s×¼²õ̹U“Ïínè3aŸc¡ùÛ´ëÿ³²K[«c´õÇËvýÛªƒ#foñž_ñÑ5Ù ¦uÛ¸mÖ³¯µ~°®~ø†ž=òP÷‡_lËÏ[ûFÍzõhDÖ¦×íï[”wå ùàÙÁ'g¬Ü½yËûô¶C}¯ñ=:@s~ßìí tí œqË–«íßï~Ð=eßåYë»æÏY]ñîÁGGϾ¾ßŸÚZª·”VüsùçŸ]Ö”vö†3ûïùé_[Þz†^ÿ]mé®Y'ýö¦Ã_˜~,¸ºéÙñ[{O<´òì^ÛS¾øäºÞXz`2³phÝ¢™Ýë.?ûMÿþM=º®<~Û-¾Ê®Útì9gÑŽ_wwãüÅ ‡-9Üàý|i[{ñ‘>w­èòö ‡òþ½¤Ûœ¶Š[j3Åvn÷Vן¦ûòÚ³´Ô´}•·hØû{KÎÝÕ´º~a^—º‡j[lÕƒg_uçà’e†©O.,œ4­õù7ÚH÷f,}¡û€Ç¿íÞý½7ÇMœ}ÛÖ;û÷\yõÌûo9ñâù_Ù6œÝvÕ»=?ž˜ûóÚ-SîÞsÔñxÞ‡;\¿·ÙºsúÏ oßµbîGÚ‡µæþ06ç·ž{'LÞv³uVÿeÖ+÷–çkîÈxrsõE¯>yÙÒô¬.'s&¸ ÷ßZÞub߯÷È}~Ç}ïκ«qß}SºÎェzôßL+ª›üì̲aú®ôœj]YÔ~oŸÕ‡>Ûvxư%]¿m¬z{+½ ëÝ3ªKû?úåØK.ú²ýK¹Ê–Cm´þií¯ ŸÞõòÚMfîšìžpÇ3Ž5]Öel»õõ¦sŸWަü}㑞íGÌú6k}Û¡¯OŸ-<ÿðÁwû,íöÍ÷Ö¾O¼dÙw¨ð›Ü ß•»– üôÆâÑ‹8þÌS 7]qLJ;68yöö9ÃçŽ~Ñþë®N¿¸Û=OÍݸâžKG.NX°û¢ž­£¾)»Çj>¬ÑxO<}ù•Ž]S²Ò÷—=šÉkN š[â2½0³uÔöëf×ë6—|½²°ç¤{sÍÄË ¿{x¨÷J_]n<ôR¿ªôù§ï.»}oÃâÙ¹_Í{)—¼Ê÷Ayñ¸mŸµŸï9µ!»KÁ‚[×g^2cÇÿYÞúèÌÛCZfX?™~¢åëÒö%îçï]6»z²æ…!>÷u?Ùì÷Wn¾èlþ|âìõÌ–yœtå_ÎŒìùïÏž™ÃFmοñ-ç€ókú´$íÇ#i/®i™zÙ¬'ϽçÅÅ_/]¿!ë’ÜÉDë¬ùÝìß^²·üÕ!s*½Wìm,;ÑÝxõ¬ï«ºwCSêúO®y,gõ_—‡ÞÜï¾[לª^Ü^šyäý~üÍ‘±¾^T/_¯n½F=6|Öá>/¶ØÇþqò»-#ç/9VžÞ:ødÿxnã;ÛÚ ®=‘¿}{ÏôÿíÝ8ö‡eG}“nšÓâš{w¹ù¥E¿>ùÜ£_{Í­Ùsfmuÿ>-ý‡~W[{LHÿfTóÝK Wî*p}øÉ±–Õ—>õ89`üžžÿ ³wkÇ3Œ5~çMËÃ}&,¾¢þõú‚GÚzõ'çT¼|XÛ>nÙGž.š×ÿù»Ö.‡ÿ¾á‘±u-¿­ÈÖ]zÉ›õ]ZÙ¶ã¾ %Mo8ä¸9mÓÏóþüxfÎéóÝž~c|Õã]?ÜvÓ—åójKö<¸î˜ýûèÏ ¶÷^7øµ…™ÿ¸xÊö›¿›±fÇ"CXPc’6h¢5öGKˆ¦±Vˆi)Ž€iœæ‡Af/(„cø•žõ×GDï@¬1¸•£>@¼Ãú ëÊ )Îdm‘!Ÿ;øÝE4@ÆÁû2šì¼yV"9†wØ:R0¢É`¯i#OFHÿÊ›°~,gZ—¤XÎz Ë™}¤&–³.–3žÁ8˺`LeRgþ.¾s(,gR« þNo ¦]n3i ƒßEÇû wIM04ŒSMÑ¡p¥5ÁxÑŒC:óY׿s¼×çøn7žê÷Wë!ëŸff#A|¦ ”ñ¿Ùt—$9ÿ'E”øoˆçSñÿÕHúÓICÿþ£*IBmÒÐ_›¢¿IB¦3ñ_´4Cð{Šþê¥ úl7¡ãX©sj¢ð)="zÀþÏè|ÿ—ÂQ'‰ðÃÒ^ˆÿ(EXÃeª† RDƒ þaiq࡞å‡ü#>°ç¦¹M.„®`2/Ök£÷ד h!° Åè|øEøÿ‚ܯÞâ¶yM–B£"´~â‚ég0bH?ãP³ž?gp'‡»WSƒßî'€ö»±¹¬±F[j-nb7Mx9ÀÊ3ÕyK¼–tpóÍiòJIk%^Ÿ¨dø™ô™Y²×Ô•&é©ÍãõUyLv;AD§×Ýáû³ ÿ·hšDoD7Z¶Éæö6šìQ Eo ¬B‹n`ÜÆNÊûp‹Ì¡W˜P_ÜnèR¥Ì1Q¾æ+z«ô íÑœõÀN ÒâÆœ†Æ«LïÀzœL@c#]6áèÙ  q¶¨ å²d `ý8¦'<áëE}ÌÌŠÿÐÜTÀ`rÔ“PètÚ¡Eü}|ÆŒ;‚>3h­ˆðÊÍ>ŽÿÐDoFDo€S‰zäð4èEŸñ2[c‚ˆ­ãF\`6£‡×=]îë@ð1;Gs¼÷Ægp¯ª† &bô¢åÕ „tþÞ–˜¡ ~¸9EÙª]nK“üÒË=Ô dEËÍnþ¡Ûì>ryƒ^w»¼¸†¸4ALlàZñ÷åÑ2>ã &bHFnHcš,n«Ý9MÍQqm¢•añ$†d¤FÄ„E&—G¢ Lµ6»Ík³xøE\‡ª¡EõG^Ç‚/ê·`n¹¡4Im’31ÜYרÀÁ-ød+Á:Pù;8Á…Su”Xñ†‚ù<¿Y˜óù¸Z#”u‹þãP`& ë«n®_zìúÖ\åøÏ]6—¯Yãò.{£‡`ê|¢eá4˜#Ý/;X¨D3¬)v¹ú:Ú5Ù˜ξ,_ç,ªh·Ò´4ÀØ6Ù=NŒ¤mæ—@~ÃWÚlÍÌâq{\–:›ÕVgb º‰z‹ ®½Ÿ;;${™ ²1¢JNàìl®u¶˜p¢ª10ªÕéÇ6g'—Õ¢ öÔC^c§,ð–×égŒ]rÓСÚ@exF˜`NqO""³—[¼nÌ´gp›¾%“¿ Jù o6,ã°ˆ³‚žÆ‰§pe a(\s4¼äñG`ÿ…³F'.lR£te£ý4võú3âÕ²DœV¸¿º„¬ñ€vÝž…ŽÃ¾ šNtüAjd2H(ÍçÎ,Â}Ï\u¿à“‰w B8 D“ÉÞhéD~ÓÇÝJ— b¸PeâÇr‰SÔøc}˜Ntg {—õ‚°8èGýœ÷;xI¢Ib2…;÷³eÐéß×Áñß_ÐoˆN²è£ÒL/@‰â_ Õ%fpµ 5–Ãs ¢É· }/|/“j^ô°…m|Up@„n@A›±[BP^4rªp`„Wéë,É…"‘ë§™V*x V•XŽÂÄø"®¡ÎbCuûýÒY5}ët›E•p+®ÃšÊË*Ù>t¢$¦â ‰á:# dñ¥‹T—ˆŸ†ê'„±{¨r,¾Ib߀û¤èÄ%O,‰®—. ©„'Lx\†—Øå/âk(çnÀ]ïDÎÒÆ³ðÍQ€qØk-)o…*?îÂõ%޽ØßïÄÆ_âû:¶T §l­<¦_â]@\%yËÏVÖºpË7ÕÚ-lñNd+£R¶â®X– \NˆØ*L™8±W_BØŠ«bšÉCLµ8,n43au;Ø©vÚÑ·ü0‘ž±›BhÇ]ìV!ø…5 –û…³¯9’/´On=u.WÄšàyH‡ÎöÿoN’ßè’æ÷_ºÔïÔHú듆þúýÕHú’…þ¤&E5’„þƤ¡?™¢¿ILR“,ôפè¯J’ПLú§â¨’$ôOžø/©øª$ ý“'þK*þƒ*IBÿä‰ÿ¤è¯F’п3㿤ì?$ôOû_Êþ£J’Ð?iì)û:IBÿä±ÿ¥Îÿª$ ý;ÝþG"Å/µÿ«—‚èÏßíšg££Î×Óøv7Öp@àø/”ŽÔóø/ÿ"a¤â¿©Dî<h/Œ'¾ã…;~b„Ín .òúâÂÀA(!­9¿ƒ–qP8pª·Â\ÍC˜üÞà\Qï´›ÁqBøªÐq=§Êer§E EQ x58‚™è)øÍHÏUÕÕ›ÜwT]×ì‹0–z¾”wHf%fgƒÉæ~BÙ±oš-. šcGÝtGÓyVãÓŽÔëqP;3t¤5ÀBME f'' F²-‚BlPúœjˆEOL°xÿ`±CTªz·ÅÚŒÈh÷:sìèÙ4ü(‹Ÿlö'P¨£S-Ù jÖE‡¥æ $"»+gêçTk²ÉŠB|þœjÏ/(W >K.·‡HDšm€ÃYÛnK6¿[–ÓNa&4Ó^bšÍnÏ*Ô_k£}0JJ*GŽWIÜ6‰˜PP^^p[夛QI4M¬C<®ÇÖà²ÛPµÓLn·Éáþg£‹Ë‹F¢ò…%¥%•“ÀÓlDIåmÅĈ1åDQVP^YR4®´ œ(W^6¦¢8›À}Æ‹Ää0:or[» -<j£ÑÞj&¢°b8áñN·eàÝ)rº¦sžXÜj3ã^ãÇc»U '°À”p~^hàv}PZè žlÕå¿xÿ§’çþ/uÿ£J’Ð?yîÿR÷?ª$ ý“çþ/uÿ£J’Ð?yîÿR÷?ª$ ý“çþ/eÿQ%IèŸ<÷©ûU’„þIsÿ—ºÿQ'IèŸ<÷©ûU’„þÉsÿ—:ÿ«’$ôïôû¿ýSçU’˜þtòØÿRôW%IèŸ<ö¿”ýG•$¡òØÿRöU’„þÉcÿKÙTIú'ý/eÿQ%IèŸ4ö¿”ýG$¡òØÿRöU’„þÉcÿKÙTIúw¦ýõÿÕ“)ù¯b ¢?ï›YçtxÝN{MÓÒ ðÍ̶¸¢œ püoRËéžSEêRþßj¤ŒeC ÌÎZË*[“–‘Qä¶€kavz‰&Ö/” ²)"s4ú£Ââ"HŠ èýÓãþŸ½§ ’œ¸§°+«Š1Æ$÷Åw° ÞÑhf$Íœ—…»Ý½cÍ·Þ=¾nï|h%ͬî4Òœ¤ÙÛe³qRñs¸L\•˜ØÄ.0W”>‚ “¢lÄ&PNl*8c—ùr¥ç½nI#ivv½;ì¨k?Ô¯»ß{Ýï£[j©ßÎR*Åh¹[õÓq øZ+Àvž©o$[árBiè.Te³4¬¿Ùn[øîf{~#)‹øS‘"”ËP8fi#v_ u9W™Ó±>¾‹:i78~ÔöF ÕCâDà M¯s¾µÊq¼«{íÖ6Å3,,rMÅÙÏñc–j#ÕËuŒ…LJ¢DðMÒŠ€$J‹7>µƒaŠH‰¤¡{ôØÁ9Å$­vxÍqq!Z»EÊE‰ð›ÆÂœ9Em{z)D5µÝ¬›ú|®X3tGw 7ØppTˆˆ†€2<ÃÔ:Ud¨ºf˜¦À`c,ÆÈ–ëfCtcI6`c,ƆlŒÇñA·Ç—ÁÌŒwჾŽÇð•rY²¨ UŒˆ Dðej+¬èºÓT,mÆ V ·J¬az«tsW²J’lˆ(–Ðw%ÆkØR¢"¨jbÀE`A±  z7 " ¸ždA¢zŒ(è!oÄñ›Æ2ø€£ ôӈᓀ‚¦:¶â…àØŠ)’¬Ù1šà±»iJÀФ)Aí8M胣 ¶k*îlVí¸Ì‹v7MXi'i‚SáÛ1š2Ð\ˆãƒZÂqÀ×yŠÀêˆ@ð» EÅÃFußÊÁÉÀüaéV[l,!Nü­–V·1¸ dØ1²Ì]1T_ÜôÛÂo%–ðGdi‘´ìý]"F]7]=l³„o‘+¦B×–ôbÔ³ùÉ?`žò~Ë KG¹%Z‘Çs_ÝÁI¬‡Dú)÷ÓP{n¶Mm…¢m/ÖÍ9p¨ªÒ»dpÇŒihë+ÔX–v¼¸’»íìÔØåà=‰åË’Žö@ bAϦsÓ™1˜H¸`º›ô£ÞlÄT˜ÏØg;sÆ50 9^µmGDñ Ö•¦a.˜ü(ðGi›Þ*µ(&ªªÝ8C-®WULi4²É[sSÚ¢PU E†XÝKë‚Qô¡ò DŸWQùçH²+€V´"m öñ… XmÓÐÀ6¦÷@÷„>‚DªòÐiIPi¶Mj…=›ÚžÇš Ë5•–öBeXsàDù:~æ‚­µo–šwáØûõ.è¬},¢GáQœ3¨`‹¤„M0Yú]UŒ*R£ˆÛÖ²`×^]PÍP¶¥˜n˜µíýìã) ï¡Qa掷lMg׋X6ëΰ\¯®5V­CõzµJ–Ýò«n~£œòÔ¯¶`©Iû6ƒì#4çr}<»ˆh¿/š1¢õ ~²}¥0¿¹@êt_ƒ.Kûúú:–lSO @°NÒ´ÁñؘëßÝ?@¨Œ ÄIÔ9—eû?ìÃ÷%à»X‚9 # r}8Ä,ƒš% …VŠýàú:–°µHSs”ƒüpøÐ¯3ñ+­=óa©g‡1Iè9Ûï—xlú¶0UT´}0z´,2šXɲú@0’ ^ ¸¢a"`E(pÄ…öX$N8¾t\úú¢^ šÓ1 ‡p)P{¾åMÚèÁ¼ «Gðþ þÿy׸F' øUÀêà¶Ã„Ëd  µ´À Ú$-)²žu̪±Jªi»:Úy\œºi-Wß‹%8¼³8g>š‹EKš ŒÙ| 7–ýeŽ…ë›' ÄsËÅû~®æu©Ú ð‹+AÅQA‹ôAœQKcFF˜^Fí4¢a-LeAw¨ñºú®oF‚|GÀ6~.L‰s!ˆ UÏÄ÷á…‹¬÷àÜŒªðÃ2•hFŠfªafa–a$ÆM¸0 LŠ1¶È7•yvŒ-¬èÛNÄõÅq…â¶gHH±ikxÏÈõ)¦­hT•#^ÝSÇ‘nnÉnÄ&‹¢n3^“—mù}êð‡‹L:Q¡õ„bò+ºTûš íV+ÖW™öÁ(D™^ ÈP4ˆÝì m1¬[ –>pó,|Xοë÷ESx[ÏÁíâr+›À#r^6 ?á…àöàþ̱úµʌxȦs´‹[ZgøU+,þ›° aóàÄÔ ½ço94\±½Y ã4 ë©QÃõpÒu8>h} u:k-‘E|”Dàa1Y¦m/\ñûìœ;4t.ýVõÜáás‰«Ôu y01E¶ésàÁà}ÎPq™d*V£ ægÒ‚m+XZB%šûr×?443’Eú§Ùÿ€±DµááÕ¨”™™ÈØC Àªà_ÇŸIøÓy„vÀÚŽ°‘LØ8.%›1ügFЦV%GWÁƒ‹(Žaì8;æÞÂ5͇¥è mV+‹PùÛ13N@‰Þ±Çm軌X`ìQ ëÜê±eX µ@ÿ†v¿ ÙN™ß#à¾\ v¯JüIsb'¹îL6ÈÄŠ,2l»ì0TIE ÷=Ošm½‰' pÓbA,úG.øb¡qAH|~Ô©Z*T«¤\@YV"¥ô6¥ÕâM÷pót¡€wÄáZ!–ñe[⦠? ·Õdš>žeп ‘e²¬‚ß +AðÓ„NV ¶‰…E"üT{Æ[hé„¿lrœýé_¯É¼V“–yì^-ÌzMs€ #š°í6ÃÚÏñ›.½4pM««›°ªºõÒ¿¾À*,çËÛ︟+Çr˪Üòl?R+¨ÝJ¦…¥J/¥,ÌOuôuïmhœ@‡ S½å:F{’$CÇdY‚¿•r„K†ŽI3à ŒZ, ­(a߆@Ƶ-,•ÊD.“RU PP.ÁpÃÂF™1#ÄnQŠ7J"•o1”6”I½ëÄ ÷;¹ªtj ÀŸ,Õdç5ûƒ¯IZÏm¸,8¿£þ€–`òíL˜‹LPs•yhe§pì¤Öè„jqµ™ê¸:†ÞóÔZ|Eí8øŠJÇWÀ@@N+ôŸTÆ'Ò „€¼L rFòâ1¸ƒµ ?Zw £þ ZÁ½Â*xýâÚÝA™×”è®<;ã)#Ž€ö00Î*Œ|h›)…9¬×É­Å #¡µ:L€]> 8eëm˜Ô¬6 VÚvìfYçƒ}—K`æ")‰tIPêÌúh' ÿÁš¡vb}€ ltÌ´Š‹”ޝ‡œt,>` ÈzIp¼lt~“ÂuKQÆ1î±Ã4‡ëñÄ €.JÑe“[6‰Ç"€µ _UþCI.xúÈ…%ìYÂNŠsüGJìI¾£‚ýWTÄÄuÚŽíØò£p ï5µ·ùbÞÊïAª°÷¿*eQŠ|ÿ+?ÿ3¥T‹B½®Éµº"×e±"Ⱥ* ‚"õJ©&UN6y:±i ö Ë·Gcû¯É÷ÁþåRnÿi¤ £[…B™ÛðÈËŸ¹™aemÏìㆆømlŸæp2Éo1L|ë‰ß‚º2ªc(c¸ñ€YWšÜü‡w^²ÿß‹¿÷àKW¼8ûÁ¯÷ÅÛößt*wÁú—¦û›gÿáÿ°}òÑçž?ûÌK_;çoÏ|rë/žú—7ŒW×÷Ú[~tû[ò—ßôNþÈ¡Gwýòù‹‡û¶[Æ?úÙÝ÷Î×n»ï÷oyþü¯>wÇ›üã•ÎôçŸvÁS?ñÚ½gþø…³»üÕG¯¸®4þ’~áµ/ý×÷|{ð™ý÷…¾ù»ÿ¦yö®ç®kžqWýáÏàÔ¹#?˜»åó/|­|•øÐ_,͉—¼g×={v~ïȇïüÆ÷¿þà{¿ù¹ïæ¾çGÇþváöû¥»ï›Ý{ÅÝWéêÜ3­~úUë¿~ïUO¼vùOnÿáÎxååO^ôÚ÷ÿsâÞÓßýÓJõKëþlìÖ¾÷¿¼ûÕëÞ5ð¨$þÛYæiÛ'ºþ4cóáëoþ”pÑ]çœóô¡ËÿùÔ‹ÞñàÖMß9ï'›.¬½8Dn¾šœrë§ÿõ¾õ§‡?4t¥]ú­;yK8å®êG†Ïùó'Œ<é¼õŽ—Ïj?ûWÖüå÷Ý;úó›œuíÀSwžDÙÕxFy̹øŽéû>ö¿µ‡¾j¾ñد>ôƒ÷=uÿGµ+Þijq·?ûì_ß8ðô}7ÍÖ„_\óôw|üËï¼¾tèî Öƙ¿Z÷—ÿ±í§§î³ßW}¬pá­ÿ³îõŸoüæ¾ò0G®S~xÊͯ·¯lñ‘ëʇÊ7]úOã·¼ëÒ«Þÿøü ?| çägî/~eãM;ÿä’â“çýÕß»žeû™/ïúس7¯Q^ßsÿûÊý?ûÔç~ôîæ}ûß«(_Cà µJòµK,K¨ÒQ¸pËãŒß®k†²Ùž'tÓ—mðìáøIº;CŠP‰¾PFÕ°¿UèŽ ÇV§tošµ&üN}ÞƒvcóÞÖ)ÚT(±&[ðµµ=æñÀ^Ï®Q€Pdÿp|r?uñ5d"Õ}ÖË!ë„òN(ó.á/14—LÓ®Mr{¾†ä"M…x¯¡Šâ)¦ÝP”¤äÄ(…=âøÛ‰0<ìW¬%*ÒŽqþ |uî`™EdÏàq„¿³Îo‚V—MŽÅžÇOaM:ÿÉ}ð²A‡°'x‡wôþ¦¶"Gõ,tUf„™©Â½.¡„yYåA̪\”:\LÊT¢“…(GJ«\5^ZínV\µ·³ÿÈú„°e öÒ` Z[Õþ±© ²uÖv=vl6©:A_ÿ7l yî݈ç<+%IÀ‰¹åÛm­W‘ÿå@òÃÝ+~9°{š²Ã°ûw³¯v³Ïð½QÏÔû·„£8ïèu®H„ ×ùvˆH¢*]'¬ZGCK¬&ˆÅZV¬–ä.˜T)vÁ uw½’ЫÁml’n¥Òݶ&wÁAè¢+”Ä.B¹ÚݶåÏóïféE|‹ _«Ÿ´A&ÔŸáË—u›ø~p|”L÷ÿýõµç¿õ;ß{òôÆ'äëîè†ìáèl¯8€ Âoø}ñÿ—”XÿŸôóŸJ¥JþýgŠ©Kþ ÎÑœÝÖô%’˜_í}ÿ¥áý_E–Aþ’T‘óû¿4Rø/Lö½ƒ¾@yav¥H/ËhR2¼ Å‘ŒéB½¹XD™; ÖmhЂh°|>Ѝ“šÓ¬o#P ¾UŒÿgÚuè÷ª¡ZÖ­o˜ÆLavýðúUb¹L)»/nkŽþ7)†·pŒÑ_èø—/¥j•†|©óÚL±KŽ&Î ÐÁÅGú.9èg©R`ˆ4Ó\À` WA.$/ˆîq\úR.±ð5¥ÄýHÐØÕ; [sÞâê¦î†!VFìf ôzÜÓ›°hóƒ­Ž©ùšt:y›ázK»Ý¦bš÷n@¿©·5ˆ_ :Ä̮1$Ï 5ç_£;¥<äÎI ¹ÃQÕ›&¡‘–Ù!à°*šÒÂ!­;v“ F«i0oã×Ân)Ö~¿WØ9k7—\¢XVÃÐA3ºôË£5 ûÃÕU£ ÚM¦X½‹Q£& ÝÁšR¬†ÝV­ {Ë Š.Ò]æ*u¶ƒ»W!`>Ù«<¬_ÿW²sþk~þg*)!ÿìœÿšŸÿ™JJÈ?;ç¿æç¦’òÏÎù¯ùùŸ©¤„ü3sþk~þ[:).ÿ¢’ùKùùŸ©¤„ýgçüß\þ©¤„ýÏdEþR¾ÿ—JJØvÎÎåŸJJØ¿šùKyüŸTRÂþ³sþw.ÿTRÂþµ¬È_ÊŸÿ¦’öŸø¹üSI ùŸô÷ÿBùçÏÿSI ÿ¯gEþR.ÿTRBþõÌÈ?ßÿI%Åå/fgÿ?·ÿTRBþÙÙÿÏí?•”vöÿóýßTRBþ™ÙÿÏ÷ÓI ùggÿ?ßÿK%Åå/dgÿ?ßÿI%%ì?;ûÿ¹üSI ùggÿ7ßÿI%%üvÞÿÈåŸJJÈ?;ûÿùþO*)áÿ³³ÿŸË?•”°ÿììÿçÏSI ûÏÎþ.ÿTRBþÙÙÿÏŸÿ§’þ?;ûÿ¹üSI ùggÿ?ßÿI%Åå/egÿ?·ÿTRBþÙÙÿÏí?•”föÿóýßtRBþÙÙÿÏ÷SI ùggÿ?ßÿK%Åå_ÊÎþ¾ÿ“JJØvöÿsù§’òÏÎþ¾ÿ“JJøÿììÿçòO%%äŸýÿ|ÿ'•”ðÿÙÙÿÏåŸJJØvöÿóç¿©¤„ýggÿ?—*)aÿÙÙÿÍŸÿ§’öŸ÷?rù§’öŸ™ý9ßÿI%Åå/ggÿ?·ÿTRBþ'sÿŸÆ“É?ßÿI%uÉ¿+ÊÒ¸5§[ðÃïšæÞ½46VAoõh €{Çÿ+K%˜ì;ò‡òRYÄýÿ<þ߉OÖML nÒì}°T(r6øQ|7’dߣø@Ë-ØŠEðe|Føn$[á’F¶†  l–†õ7ÛmK3¬Æf{~#)‹ìG&²(clYK±›M ¼Í¹ÊœŽõ10Ö„c›vƒãGmoÔP=$N4¼Ðô:i-Žã]Ýk·¶)ža d‘k*Î~޳T©^®«é©$JÃZ-P$QZä¸ñ© CPDŠÐH$ €žîÌ)&iµÃkŽ‹£àÑÚ-R.J„ß4æÈ)jÛÓCH ªá¨ífÝÔçCpÀš¡;ºk¸!°@°Â¹Nk  ex†©uªÈ„QuÍ0M%€ ÀÆXŒ -?ÖÍ†èÆ’lÀÆXŒ Øãƒn/ƒ˜ïÂ}á+ä²d5Pþªˆ`d7+¬èºÓT,mÆ V ·J¬az«tsW²J’lˆ(–Ðw%ÆkØR¢"¨jbÀE`A±  z7 " ¸ždA¢zŒ(è!oÄñ›Æ2ø€£ ôӈᓀ‚¦:¶â…àØŠ)’¬Ù1šà±»iJÀФ)Aí8M胣 ¶ óÐlVí¸Ì‹v7MXi'iÊЇvŒ¦ 4âø`€‚†„pÜðu"p„z"Œ¬©¨`éD÷­œ Ì–îaµEÀÆâÄߺaiuÛòhÆÔ­†7ËÜsQAõEÀMƒ£~Ëø(±t€€?"K‹¤e·èï1êºéêa›% i§˜f][Ò‹QÏæ'µí8àT)à‡±Ì°td‘[¢ùFSw'm°é[¤lÜSLCíQ¸Ù6µŠz´ £Ù÷.Ü1cÚú 5–¥/î…dÄn; ý^ðžÄƒòeIG { PM]q<›ÎMKdÆ`"á‚énRg‘%7b´Dæ3uθ¦¡"Ç«¶íhƒ(¾ÁºÒ4Ì“åþ(mÓ[¥ÅDUµg¨ÅU⪊©3F6yXN!h‹BUM(:`u/­ FчÊÿì= xUÒ.(8-Ǻx¬¢Ò H²Ìô5¢‰! ŽC'Ód`2ç ”s]ƒ'×züˆ®ŠÊå è® ~*ë‚â (*Èâ-¢þõ^wO¿žé9’!‘ÿßÈL¿÷ºëUÕ«ªWõº_5CKMn$üSèè‹ä¸ Ÿˆ¯ÒóB~d ú½t£² ȇ.D°4qªUHø Õ ¸³X ã^ê…äK£K­•ñ@y|SÀˆ´˜kÐ;7Ñ Ž\¡:¬^4˜‹€²S[ço¤[ž“õ$Ìj$`-4‹:ô‚ÊâÓêzE½aÈʰϰ:€|¯˜ZÑãªõû\Þ ¾ ÎïŸ,¿Ÿº!±”(³Ï/Jòq j« VË%®$Ö&=Ëu²“|þåÕ,‰©ÛÕp5éÓ@ÚCO¢q)H™Ìò!mæIdÁC`”hðoÐûCV\§\Îе!$Ó¦Zì–šL&MsmlI¡´“®÷ƒáñ£RÖĬlücÀvO ÊŬ!Jý¤¨ú‰Ùrêæ$8è Í:ÍÀj†»Œ"ZŠè Lš¦ªhMSGS ¸i°Ãµ>üÎnôÊØjŇƒ¦HkȯNÀjpr)³Ò‚Þƒ <6—eQt‰“hT ÜÃm7QQ”Ï×*TNÊõ•Á& F¹ 8‚…ôÑB"üÅ|1™H«@©—cFX8MSCÀS šÜà=‚õoV~›‚ž©ÝŒ¾Za‡#]²  Íp€ÉdNâ‹L™V!ku­î$·×”žë‡Sòz= AɉZÌf’q&²¤k"[ê]À³&uÜäȯlX(SÝL‡._Åý” €B/²ÕÅbËÀò]7H‘¤Ð#êe%à Ƈ¤žF*‘‘¯ðºš¥VÞ teª®ã*Å@e½DžÎ¡E˜ a¸è¨Õ…à .BÍR…Ž ͵ùÀ“+Y°G U¸a´›ˆc¦ª”ŒX‹¹ÞÕ$ª¼>ÐWQ&=¬È  WÓ‘ëý"Š)“Ëëw‰X” +‡Ì“fHU37M\Â~F7‘fSߦ/¿O¡IÃ9™x¢BÚ&åÄ –¾úæpCƒŽV¨òúuU€j“7¤«”AÔB%"Së2¢‹‘s-ªëÁ¿êøÈ%%êWœ¢ ÖS.y6ªE¤tXï ¡·‡Ã˜=ˆÏþFe°¹7µV60‚j!ë]0GÉnks†Þ Î=¸!òÀƒ.•¦€g÷)7r“¼._mÔÏ‹´¾i]ô&Ò £¦„/ì²òò²aFòÑY•ò¯ŠXÔiùùqNã, ú"XÊÚ˜ÿ;¸Z~ÂãÊÛ\§§†,>úÍ0æ’»áúø¼D¸‚`IÁ±X*Z"Æ€²æ²$9M˜à(­¢3ºS†”à’`¹äGû¼±ÜUÀùB´/[®Õ®ão.1RK|î± "Ìñ—çŠ×£bÈŒºes­¼6Ú1p¹!vR¸ŠÁ1Èâw,· “METŒÄ')>b2”ØŽEÈJ #¸ŒE®P"<ô"žXæÑÃ.93l dà)bøªT. Õ1FSbÄ)ÒCL7,)D#€1`H©:2H«“œ*FÐw‡ÄârÐUɈ2]F#n .IȵpzùLE,S•5 »°ÙÐî%…¯œ’ž˜¡6RJŠ  I†$"­Mª˜¤J 5JVŠ=’7–ºèqÓu©¢l‡1øhæ¥ žç À§4>†]¤:B\”‘HFU™ÆÄ @¼aI$)÷GŠ@Q¸¾!±` Fçjë J´ËR•´¹\wºbDžE†|"ø­¢hÚ\è€ÁÀmè®+p£xžÎË£ÍáêPsƒD›Ç–—È_YD·Y䬱O"IÍ­ Õ{³éü|&rm©Ç7™2Œ¥®Ö$À™¤x¼¸X¦Qa,"•(C¥\)ZÈ‚anŒÆñë*AØ“h±ѰhÒ5鄿ºY.a8YtÄ£bòh.Y «„ÖâÑ€²ÌˆµBÅV¯ š7ep#u£+DwƒøËoŠðcüƒ¨Ð:!Ü$Ô ÒcøšÿH€!<"\?O¨ßz0†åã)a@LQÃNtHxI¨COÐYÇÜ!LøÕQ YýpzD§|¿(!T QuBPü"²•è$jE¤Á߀TAJ°ˆÃŒ+žDô­;)ú¨˜®è ]´¨Wéã…'sci!îZK'ã¡[G™ž ‘ô"ýäØèVJÔ»ñÙ‘Ð v [Þ(džÉÀ2è@³H‰œ'ZЭFŒ£dÀC 3ó(HºE‰’`q œ`i×i8ÁÓ¯7ˆØD$ˆý•‘56 F=ðú5†ŽèA·€0Ûê2°ÉCX•¶æò)Ä~4¯[(ò×»<¾œÇDÞ(Íë¢û ’i^ç·cM BÇqp›Ž.Z/S& ƒñRG$á|ÑÇœÎɧãßÂÏRÁœa…HÑ’k|,¹ˆöÈÍæÈtäàhž‰¸b@Ãa£Aâ9»0|ûÇLI2=É2º˜´>,º>ÒÕ…yPáxÎmRF0"Da8` ߯ðíR\fÑa—ƒwz‚üˆMTâ6r,ƒ‹ çP‘¬Fp2QlG|r|ºkoŒÂx‹¦íò äße@ë,t>V<Ý‚¤bhXr.é´» VÎm‰c#ÄK«ƒ'Šé¹ˆ ”Ú¯‹·F$»[§g¢Š8gÕßõ…ë“yÍP¥ƒ èow¢G²âÀÞ*ÿ è¿`Ëèg|–ç0¹5pËÁÖå”@[hõ$*/Ï\*.7{¼h×»¹ÉJx¢”Ÿ\ÉUO5ýmÇ„÷ü{¬¿¿a—óÂkÍw«½hxÉ€Õ½êvµ>v iSKɬM«ï^qãÝ+F®[>m÷ϯïŸ}ëÚüC+Ÿ·íŒ­¾ µñûõî÷_þìôÖŠc»?Øo=úË3ó;þŸ/øÀY”7½ïÎ þpû¿_¹âw?q oæ¢V˱Á× [~ÿ¯çwwxáÉ—|Wûì‚{·» 朼¶®›{ÇÞGo¼§>´ôØæ¢µ5ì§¾0È{W¿²Ï¾¨yÛÍâ¶)ÐÝÝ÷®~žÇK†|x¨ë²#ü³sÿÕbÝv›óÀ·7›î<öRÑÛ_º³hÉõÕ\³õ†s†-±ÊÓB¯ÖúÏqéRÏâa§ôÞ½öOóŽZ^üãÔÏŽŒé2cå×…{ÿ˱îðþ#]vÔœO]Ó÷þಣ.ͲÜýÓÞwÂ]?ºÁ÷Ço¦ÞqlSs¿êÁëŸ=©`ë¥yÃz ý¼bý9ß}ò¶ÏpoÅ}ßùt¿oIÁ’™‡Æ}Ùܺ/‡êÛçŸçú,UkGI‡·÷èk{\>®rËhïǧíÛ-ÏêÿhhnÅ[÷<5eùšÖë§ç=ôôG[+ü‡«ÙŠç^aæ×e}ùŽsº ÿæ¬O.¸æÔ—Ÿ[}é¼ åûVZ>¼näICFîyl×Áñ»‹ŸÚ»îwç]òäOM§~¹¨ûY_,ÞºûWö‡÷Ïšr㪧æX]KßZ²ñ–_º¾û‡-Û!’QŒ!!jU )ÃÚ9µŽ×Œ+º=nFqy¤$z\…þ&opU6³UQær¼¶ÀYx÷5Ú€UÕÊ“ARð»+¤P¥l8m#5…àºáM¡øR†‘/)F{ÀÀh› |>(XéÀ êµ¼Ê|œ„’-Ñ‚zž‚4AšÆXÓí m¾Ò#éJLT9UE›ñõÔi—2zzáWÈåõת ¸¨®lQü‰B™G—¤™ü|åDGÔ‰˜"J¹Ã‡îA1@¼ ÉCÔ{{Êþas\5¶¼$…Ç )s:ñL¹‡ïæEÐÀ¼‹'à{Àòm0!!&qî%&E€àp¹ ó¯œ`?K´Ú)»¾Õ®5º‚mK£LªÓzFUŒv=äP »¥@ÖðŠ2zD? ºž†mÏe ßë÷ø}E0”YECY !kexÎÁÙ }¤_Œ×¤d#ËŠNF61a62´g.£œPYåŒdå”dÙ(MÈ+eÈŽp±) ÕPè!~JËGH[ôhÏŽ­©¢°·è „0³YÎbË,øœŸ¨øïÄyÿcæýò‰ÿçý™ü¯ò‰ÿßòýxýG`¬ýïÄOÌøû¤F§3è©w:Qþ$§³:\S#œö:§S”œNÏímKòß“’­ÿ±o±éÇŸe­™õ¿ÎùœXùy«à™ü¿™ü¿™ü¿™ü¿™ü¿™ü¿™ü¿™ü¿™ü¿™ü¿™ü¿™ü¿™ü¿™ü¿™ü¿™ü¿™ü¿ÿóÿjk@©åÿå9”ÊŽÿOÉÿk¡mÚv”ÇJfÒžZˆãvdÿM¯›DÙVi"ÿZlFkÍx©Y^iÎdŸÑoø×vb{pñæxu§ ñΆÜDbRÓ´)Åœ`(~mlû÷³f‘sËí­²Ÿ›È ÕDº‚ ÕìϨ¨å{Æ''É3dùqé®Ý‰®8èÍ#±-‚Hîïj—€1ê~.6ÍT Ë“yÎN3 üq`r9™±èOÝÎ…Hg [í˜ ˜½V&í^© }è3{i&„AnY„¸âÔQàSM%aåHS`…®À aÑ/—F* Þ,º9±’Ó'â± ¡ªŠÂ 0Z&\ä´< 7Ò°Ç¥»öZX–‰±xLдi‚Ò2ðDe‹mMÃj€T¦k6ôJáÄ.<ÎkËX²Ù€Ð̆g‡E¦)˜<`¶66Úa§Ö²ÕKÇj´zÊFƒ'Œº÷åŸ E,L'G&_Çf¸Ž›ÕHlj¾ñàŠ9"Ö•mÃ+:•(&ðI㹾ǣ³¢Éáqfh>ðµCuß(Qc¬¬€–¹F4¹ñ´ÃŽy˜ÓÑž]—÷С¥;E¸ÅŸT:xª Î :¯€¡ÁíB¯iìí×oÑ,ZB¿ƒ’/èt¦n+„¨³° —ÔIX¦.2“¥vhvú]%GÆê ‰tªZË m“NÇ$:µÄ•é)1ˆRºJ, 7¡39ö—´UvýyÚ4.Ð8Ú´e¿*:VÁQÚª8Ë ,zíSZ Þvà)Ïà:Gù"@¿t:9®fQpÇ}Ú®µS£jžÝB¼ç ½ªC³‘p^’dÖIt<ÍŽj8™ëÜhQ©m3w:ËJiÎáé«¿N 8”—‡ÿ"áe+ ¡þ¸¨ðý0ŽV†x-A´†¢tæi©Û§õ7‹µÙp¨¤êC~ÏzÐEX²ßÚ±n–ŒBTxý¿ì=kt#ÕyR ‚RIœÎv“µ­—%Ùda½¶vm×ö²ÀÊkÆš‘5¬4#F#¯ œv”,…nB œ¦ Þà$¤ÿݵÏ7£ôrÙž—Lôöô¤¢±ðl&œ@¤ˆeÙh,ћͲ+=¿vYÞÒ˜ü{þò±úñ_ÂɈíþG,Þ–ÿf”`â¿|û‹gIÿ>ô³o~ð‰¾—>Ç}u}à¡/~e“ø/áóÏ}æO/è››^øð·×ìþíðöŽùÝ™?oÏq?;åÌsÁÁOO>rƇ:ìíWGŠw]üðÌ›¬:æ²k?¶mä®{v|z~êýË^zêœ×ø(•½ÿSçýâµKßyg÷S7_óæ ©ôž+{Þ»î ÑÇsûÿÖ#±Ÿiï¯øÛþ6´ýÛÿzÿu¯÷Ýç/ºvõš/_vÁ…“·þ­íÿvýûÑ+üAê ?zgÛ¥ùëÒ7Wž|õ û¿rïQO¼óÎSwßôÁsgéwFŽýÉw¾zÊ»¿¤âžÙwþú‰Mû_ûê£c_86òƒ3w®}äÈlì[û÷×<y÷Yfò^èúüØõŸ9{ã–½ñìÑ/üù‡˜N~~,Å®zæñ?>üÞûç~œøMï‹7þ÷û×>]ü¨óž…é'UVÿgæñs~,>ѵï⡯½²ö“¿›~¨{ò—ñ=Ã'ݺk˪+.?v§8wZF¾êÙs¿ÿècg\¾ëÖîýÞèÿ~orçÅÛv¥?úyñµ£þ1}üKóÒØôO/ÞxÑÞ·¶žpæ7dÖîëþÕ];ô|6rÈ‹/ÿºcO_÷u[^¿mì˜×9jýíkºäÄø¾È—C;¯>¬ïÓoïÝsÕó»îZ¼÷™/ÌμÑó³Ko9çé·ü´ûêoœøóšq;½½Âv¨gP‚ Û7‡íÐÃq8…í©!>Ôà8IóïW,Ø,ÀþŸˆ¹ÆÐp;Oá3’G‚8ˆçÑ=’…+×KTûdbh+ °¿#Q/¾I}QÝÙDÝQeÐ&0 {]'Sמ]w"1׉ô  4ƒ-IîA_(ínugcZB¯˜¾£-z%KÕ ½B^53ôJÂ-ô ÒíaL’öÐ&a{8–p*£ ½N¦ìc€Æ6nØ¢6-Ï¢)[Ø–¸|­ÏœÂÅ$Ãö¶©¸}ÜTÒô̶%Q'lKZþ˧=à–gþî{ç]¿­c¿#W;<²nA¹ÿï“߯R½ÿ‹±­ÿ#oÇhF±ìÿ{Z…þ‘6ý›R,ò?Û*ôOô´éߌb‘ÿD«Ð?Ò¦SŠEþ3­BÿD¢Mÿf‹ü'[…þ‘6ý›R,ôOµ ý“mú7£XÖ®UèŸhÓ¿)ÅB¾UèŸ ·éߌbYÿ{[…þÑ6ý›R,òŸmú'Ûñ_›RªéŸ · ý#mùoJ±Ð?Ò2ôoËSŠ…þ­ÿ¿ÿ½)ÅBÿÖ‰ÿkÓ¿ÅBÿ•Œÿßöÿ­@±Ð¿uü¿mÿOSJ5ýã­sþ£Mÿ¦ ý[Çÿßöÿ4¥XÖÿÖñÿ·éß”b‘ÿÖñÿ·ý?M)ùoÿ›þM)ú·Œÿ¿íÿiN±¬ÿ-ãÿoû›S,ôoÿÛþß”bYÿ[ÇÿߦSŠEþWÜÿ‹…Ûûÿ&ý3y¶Tå&…B9@¥+ˆ]¨J£ckÇÿH¢—¦ü¿ ô<ŽEÛù_›RÒ¹Å"/#ÌñÊR ÚW–Béã.¡·éNý}º“Ô` %3Ágy²øTBiœVjÉ©*iœôpÉþfóJ%T Måx†#câNˆGSæø“-‹0C’EAÕØL’µHY†™ÄívµÈ hú¸lÀ/áä+ÐóÓ!¢fÒ%¡ÿ(ºr§uTB¡1‡:UXHiØd¶€qÆw_Ç€[Ê se™¯lž©O2<$¥üóì”Vç€s˜™ÒV+nmª·¨L/q|7fkQâýà‰ÍÌàÖ¨c^äŒQà‡:‰Ð€”GD—d‚–&†1,>¼\Š šéRyVåôO-—g!Uå&¾0ËË̆²ˆŸ—*Ú,¤B‘Í(# _v@cýÅ„h$j† #¡šdÓÃEAÃGºs„KwN¹r«©¹Ñ¨Â¬ZM)qÐ2d`£PR*éRÍç1i…Ì+eYÄŒ--ˆšÄ £Ö@8«jíôˆtÈC)• ÷ÉT £æ#"ZŒ½±'ø#^àgÑê’éÈ›QÈÐL‘EL ‚ÀLÔfPó¡‹HPÛj¢>QÓÁAú—=1„AT¨pê£å:ÏËž%$æUBrd €Ä#Ž œ•¤<˜q³„¾UeQĹtçÎÍã^€²ˆì ¬’ÉqÒ¦± yÑd2xÀ÷x¾Ç ü†rAð}gè³hˆ€aN ˜ç%` ˜QåI^±ã,›gçèaOPÁ)‡5XuÊÃ@A@žôyÒ ¹Jí@Oz“=(°S^ÀF•'x)¥ÌvOÌ¢‚rRÍç ë9Ë1y4JW@öz²Wr³˜÷ f/˜¤c¢©£‘Ä@ {joAÊ4ß5#tŠ›AÎ(8zF"ž è6@Ò’f¢)M£^>BP{ Çg¶7BS: wO>?`ôùAkS0°zÑ© òh¹à D:mjÂЦÄ2Þo¡mµ¬nÀ!9µ¢ïûëÀMÏ¢Hwêç8ó>•_CAGš-)hÞ«)`FƒãUWRU¢©€¤çN¤#  ]´X.® êIäup£b>…• .ÍófBfe©@OÊ`&K‡+¤BU(W û œ¨!3AG¼f‚„Ô£ ‚¸‚R £´Ÿ]4þ.J8At !«×YI,¹/ÿC¢"(‹ã¬’³Ïƒ¼Kwâ·Lúd¾ØÎxÜ y ù¬EA-£2™„í0©ÖfO–:ålp-—3¨e0`bL•2K÷9€é’Pèh:-m§„™ú£‚ PPêˆú!ï 9ø©*5—†_a0Í ;ˆiÜ ôlcg%§s5q€S±w†%•ëÍ›­œ&Ü×7(”2è;##úÃ:1/ê<ÔV¿âÞX„Nû úzdŸ¥¯‰‹h©gƒÿgqå¾9dü@>Çœì0+ôÐJzL(¶îب3$’/8àü|`'qjûtÔçž0 5wÅÝØ^ø´ô/Kyûœ´ž’4¢·wÅíð8Q›ú@J¿(–ÅŒÚgf~é 9)9U}¸"ÈëTXˆ25÷¬-ª‰Ø>=ý'4õh2:pÅý ¼°‘ÖÖj°¹ÚþuÇFl(‰… ”¨p£f= Úù@Á à4üÔ " HcWÔ•ó€hç#â<ÚìHò¢}FÆ+OȈÈ0õàŠ/“ 2¨¸Ñ¢¢Æb¦Ý µª ­°Y;ч`BRŽÜððK… ÿ½zm˜Þ-L§Ë²³%ìg ¼’“8|þ…å8b“φL"üÄMøÑTà¿ Ë|™÷ÄDqÕ2d -݉g„´}/8¢s';áhNw\‹¤’‚µuÐa¯5„t ^Jç¡vG¨qPC"{*ÕÜ"Czˆ pœ°1¢z$wÃY¼0cBcFÒ‰W”Ñ9¶ÝQ¦Úî4„i'<‚@VÒ„,ý°ÏDQÁ &/Ây/ÈJ:ØôŒnÕgÚÑ2ó„I:?¹&³hJó©f>la™9‰vÝ£2ôË=R¤Ë…b/ÞF'…"9æPóÕêÚ@cÏBÕ™’T·µ Ú„fá¸q/kŒœ”ç(ͦÆyB‡ÃˆýŠ" ³e…æ¢äd'ÍLåÀE޽™KÄ6ø§æÞ¤ ôЏ Än†O»ªö+øûƒi¹P¢3­bÇh­A[)Bï(…ºµ¦B7uµã´&̬…ÿÔÑjÄzEY‚,É¥ÆùN–ô7ÏÍzÅz&úúæ[Z5^[/5ò‹tLgùJ¨½Àr£Gw–gÊ%>ˆsň¯ÃE'9£G}B¸­Ã3q=ÎØfgx—îTßRa&ªa†àý¥°sô8¢;Ãa‘È)²b¬Öaa cú…RÈêyaj°évCdó‰ày6ö&À÷\…_=±Üè¶:g¢À—òPƒŒÑ`vzhéö!SëûÔeõ—dÐÚ'd‘ç9ž Â*PLЇ¡nÁ²ñ²úÑm$Ð’§^Â+}1_F Ü1“^ÈœTAV®ÂŸ œ®¦SùñIØêÓà¦3Ñàù,å¤2Ò~àôZ0ŸÀ”L¤ì˜€S¼ô¨ ;?k Âz4|ÙÐGkËbI˜Aº(e¡WEG½@Â’ æô¤ÇÝAÛMп–04‰Çgl=ÃÑ¿‚ 60å‘ÛM0@°GÜ·e ¶Úë/Щ;Mô´ +RžÉËK³h‚·c`P[w«tûA“~˜é—evã…üÕñ÷ •Wþ4ºMFDÓ!õÍ¿ÄÒ)(ÕˆRuNB»Z¬}"Øi—2ïó–yòÇrpZ'Aù?rÙ.Ï–ŽÇoT”óñ¦>8ȃ«e®¦‘½šÁ¦ø]ÉØÆq¬Â’½Z×9Iä»BÄYn‡2ƒR¦\àE…%¤<… º¬û]h§ÃZÇ÷sœ†·uK¦À|¤·š5Ž÷0ŽjÐÞjêhz)]â•2žä#i’ý¦§oÙÈxúÐ%™å‘‰XÄLÀm8Õñ:‹4ØÞ Ð! ¸‹Xý¡²ß«‡ªIß ×Ç"&®'×ý[×=°¼PÄyÏsËÄóa?<—`5žÞP¶ó¼í}<ýøçyŠ+Èõx*û½q¬îÀ=ñ|ØÄóä²ÿ­¥žw*`žÏ.Ï7h"8×oöjŒmܶp¿KÍä@ïÌ¿0xº‰]O,ôÁ]¼VM â¼'9‰šäÄtÛ¿!̓^\èà XpЗiÛÐà‘B† NßHC”‹¸XÞ "¨›ŒúõâÕT×_ ÕâƒxÙô˜Ø‡òoÚA3 güÚPÅå`IværŸLÞàD•ét«dõo»×ªã·’KË"lE ¡Ñ¸Y,>nF/@&%|iy¤¤AÓ>Á= Ð¥ñ¾èË"!ŽuÒ“Ù  ™VO.Hõ "¤‰ð& “Ø?5TÑŽž5:¶e´bÒÖ98G¸3]8&,šaÑ3IÞî7Økc™çÝn•8d»"WcÔË·™Z ÜH"[ ÊdÊkÅŒyrŸ _Í@’§u±tà*Œ Ý¡3ùgL"d‰”IÒÜV)’V¾>j&ÀRñ°šjù¢M#\î+2j´²ø…yÒ‘‹YUè ãäZ’)ìM¦ª6Zb­II›„ºÂ ’Kí&S½ô ÄŽ_3M›šÂÿ¢ÁÊ8úxðNŸ0%ë±sáýðø ÖX €=ãZÜB÷¸ñzåMxÕ¢æGºh”d¹çå…NÕf­FDæ!P;‰™†<š”—¸5Ì’y…A4äÊ[À%}tr^éú‡}]8žJO¡×iœû³ks^YÛѹ¯5>GeÎþ!0îKÂ*nõ%ÕæH|b3ˆ/C wñÜõÐ8ú^ ãA-WR€Á¿ôuÐ+/jëæ:cÕyÏá]ü¦õàãÞnõ•Õ Öyõ¼a©¢æ*éÊ*xôš-ª¡–9ÙÞt9Ҍ㑊É!¬/2ØèŽÁuÃ[ ®€X2Ž]½Ý\Ö…¾àÐÈäÝü d!uŠLm>JêÆkNh{&#öË/2¤µÒi8êX6(ÿZ0P©n.v á¼>dU–ý´¼ž%Ÿ0l@\Ic)Ö¾‚ÂjîÁ¼1\–ó­!¹[‚þ2ÚÉ}ÓY¹Älá•| WéœÌg—Ð:¯H}yôn¿Z‡¿]ä. šóß%òhdﺵpª×-õÙ$ÃDßt¸+R§ê ú¢÷MGѰ©0œŽ-àxöˆn$£›è7‡öGÇKÁ…|^M`–-ç×0¨&³edjxlóÓ?z.³¥b¢têÜS±a"CÖVbI(óp{‹Ê"lE7 M £úýëG6ŽL ’¼adjthr’Ù06Áô3ãýS#›7öO0ã›'ÆÇ&‡º˜)M°ñ~W›j‰X‹Ò‡ÁE¡T‰±\&"}ó ÄÒ´wæá»ÒI?f °…À.<ôx§5\cæbÒèb|Á¨Í J‚7'Ds©'Š)à†! 5ºc¦‰”BX­½Â]­\j} }4dÍ¢R¬°ô G=HÇX!ûpÌH¥¸²ÛG†²IËaõd(RMÍMQ™kÒŸ±Efµi-³ðKªm2èÃN&1TXzt6©ÃdôUÔD++-m…¬€<Ù’¥ÔŠK¦¢ 2q3 ”º,êuiÍõÉ5>Щ¤Ô¨_uŠ qXOA¸XŸg£iDŠÁ—þÞ'P{Ÿ…äÉ*³›–«(AÓn°Ña¼¥¼ÒWŠ3¼aœÿŠ€¤îG)(ìGbþÊyÉ‘ròôøSƒýá6º!Ê®Ý=¹q­–X«Z<•Dp½Ønr‘2>¢ÝãWÉIËÊJ#Û Ò²³ÓPØ]*áW颛¤*Ðà Ð^å÷b7)à–EAü¤ÀÀ,Sj \Súô¬¬ °HA”^¤œ5Âbªeg7PpYa Â2e(HeÔkëˆÿŒ9 \a8Ðê¦ûLT ‡@q/‹¡ÎÁ@` îÓTºT¨æEQ HCÛ)úMwHZ/ÅZŽj6š†"Ó¯!gƒs9dц•š2¤˜Qè#C̈õ?Ìš!¿ºà׃Ö(S[„û¬Ú!‡“ª]!IÎHš†ÅÁ„4JFË¡RœÝz»Ã‰–Ñ€§k?9g<ål+Ï Š›À"òã°©‚›lcDäõO²HJ°±NăÒ7îamN5ÉÙDåF£0¦†~ULU¿Ⱥë`I¨œf›ÊiÚ†‡uýœn¨ûyÁif€HL I£ÏIå&q;–”–E×Çݼ(ZÆC¡›l•ö‹6G,û ¯›Ï,õËF sÄ–@¤(:p9Døå9Ò¯!xì³zO±¬@’œÃIÎ<¯œÁ®‘òFºDÁÉXbº&‘ àpj$v°wxEº Iƒ¯6õ¬¬à¨"d…_ßZº›C@ +pÈ%¢b0.ö¨À˜!âó)y•Gl³²½0ê‰ÔTJÈ>zT¾ò“Þ¯^q.ÓêUÈÂ-”G*(;ƒÐï»ÉœDÙ®Y÷x¶>"”6hBàqJíœré)\ÓH5*¦ÉBÕÈxdœ4rru´2ÙzÞdUÌÙ8QT‘ODP¹–T“ €ƒ´ 1ÐM B+â3TAeDÀCë]jå #²ÈåH@Lã‚Þd!m)}©KmÈ:äÏ;ƈ‹&ÌИ€R0ÏxÌ(Æ¥j"¶´©`ÕvœEÛ%‰jÓfÃo*£x“6ÅÝ ”ð´˜6b}Às)%%žhi©ÔŠjUmŒÖmÐ&Cש-Ô4ÔLH­&Žª‘ɺœõ©UÒ©JŸ6ËÓyÅÓU ÎX—–³1z½øÕ°.ÿ| È¿ÓPKÂjŸ°Å“*Ý…KŸÅìsÌT ^ü¢ð¦Êµ˜ÔèÆ„N·@ã„æêãQ¥§p=#O\‘ ¢x# ºÈ•üCÆÔ‚ãûtѨŸEÍ Îiöæxðæ8ÄB?:h"6@ JÀGf¡„§‰¾b]&«É!ñØnB P’k/‰¥+K`œÓ 1 ˜Êfƒnª49LVo·žç\ !ñ[IÝç1‚¤¦õì£Ú µ³8—€Sjá”`¤ ¦‘ŠÃ>&Žª‘È¯Ç uì£ÒÍ01“:Æ<oãsG X@‡ÅXäˆ$CébîbpR?Aƒ’+̬‹C¢.q„{¼áë0¦T<æ1àMv{[*>Qý;Mç€gÎÐ âYi8ï, H4ð ¤F€|Q=c÷=¹.Œ"˜ÆPŒ<•ñbâ„ßTN &ÕËódþB€p(‘E´ûhƤzrYëé]µ šOÚƒœ2Â\3¡¸$qTŒG^¨wºú²ù3ïu¦Ó›¬eu9Z@Ž8ƒÙ„Ï’àƒç¸dÇ… `v¡AŸ„Ƽ©âé2‰§ k;zOð'2ƒ@³öH9~XëI¦F¾ÚO"cY´"IcÕ‚TnâšI2Ñ52ðöÍë"Jé4¯lqb½P³ÄPÐÄЕ ªjISYP›S›M¼úF|WR%Q0[X•KlØVÊIƒßTydèdþ‚(š,ŠÍ0, N6×l¢ñª?ôOUœÁ¿®µÉ°…#>¿¬š4Ë”Y"sº¼4À®æ ŒÓ$0$%ðÊI“m·0 ô`N¦… OÄnżÉrÒäñÉ gŠx±.7"^œ2b\\³‰ÁuCr’(ª¸å„6ÞøÝD¡ˆÙ÷#Û%h}aOÔëø…¥~ž5OXëmÀÆîĶELîR‘ HÌšßÄÜe‰¬Å¼ÉÂ’Ô½*"¶ˆœ®q ÜqR¥–$=I* k•³ LË ‹ShDú×uZz¥É)«³ç¨%<3—.<‰Ît(©Nºˆw®p Á+Åý'ò¸[…¤ ‚ÃPv„“ú*µˆ½DŽM@†â„ßd1ªOB‹‰XK]8h'Ni£šv’ù&}T‹æd\B”8²¸EHYü×D(ôƒ3é :g1[ü“èn%º3Fžd 胣¤Á-’Ð*በ~“—`ZjÆ–¬8èêŸs¹ðD2Oƒ½T¶>˜æÓyÐo ðÀ80ŸÌÅå.ÂÔäNæB'³Æ\Ž`ÙL‡çäLÁd\“¹qÁo6®#L,L&:ê0‘qaÇÏåXÌ•#É;‚ÀF8Œ ;Ê$¬>Ý&àå›Dæòš¼ÙÜItes‡gÌÜáiÂÎE¸Ã™¸ÃB.GLXe½„¥M’…—÷`Ø9•åÝd/N ˆµ¬ 3¦mËJL¶âÞTÖ9“»™Üe 1Úe 1qJ0-³»‹fG÷&r‡9šUžŒ™ö!yÂKº”ÕϳfJ™±ÍÜHaý€Oл¼3ɦÀ–‚ 4­úñ û—É~VYQ<¤´' )½Dy^èæ~ÇpH}lLyÚ¿‡FÏV_CÃ`H”qoÿ—Ÿ¾ˆçýO¾æ½™«ñ÷?áW@ïc¿ÿ‰ãÎ}ÿ·Uï=¥¼PʹhNd‡‡wˆÖÍ ¬ÈÑ¥žßš¾sGrxä¿ÒWÚ,g‘‘ccÞÿDzü9ùo#µ`p^?ÆÆQ©ëÎ]J ˆF²g"••e¿IyNì;eÏóð[ìyx¬ C³±µ–ÜTõâå·“¿ÿø··|S~Õâï½Cîÿä¼ÜÙçÝpðš•KÓ«º¤]‰†Oþs`ë/§?|ôÉìîËÚÍ<ĸžÞp¢´Ç¬ScíPtåšNüôÆ©/¼/Yrù㇯-ÚwˇÛv\øËÑŸ¿¸h¥üÂîzhõ]_9&ô¼kÉ«û~–µÝqÑÚewËz¾tòâ"~ü±{výÏ®Ì[J*–í»enÇåâÏwVìùnÄ/ww¼ö–üåÄÝ/þùµÏ×{¿Úµ}ßîËÙŒ}ó®EÛK7“ŽùÕÓ}|òÌó“§F{íX8ó—U§^?õí § F¾/]½vÎñI¶K^Ÿ9êoòѽi튻uóív‘ ªëÖ©ë¤n=4ƒÉÞ½Ý>Ç»ñß/Ÿ‡>Ý7ãMÚUTV“ýƸ}oÜJÿ¯¸~jÛ±Ÿ”»Û«‹\—Í>Thë6²¬ØÛsVéWÅ—y`gWê;¾ÙuÕÁݹJÞëåíòH汜¢ëK—ž}áô÷ÕÏUL:° SÞøUï¿ÙqÛú«>6ýã=ºôyuÉ¢‡?îraö¶cCƼø²çî›w¿Úf¬4`T×6ï?ó.bú¬h³lñ^™³dó×#'Ú\Ý麷š³äÊ †¾zyUdç‚¶nYâÙyÞ†]k‡öúôÀ«_rRçÿiÆ´) îžpýÚÞ³‡L/Y|ÿ‚ ¿ty÷Ÿû³:-¼„ztï¸n™ö9©sêøõžÎe×vÌ~¼fÁ‘3/í.=t_ÿY·é|Û»e›¦‡Îyåò!}/ºtØâiÇÆ<L}0B^V\Õ>µãñE›BWìíZÐ>­då?^õÔ™-ƒó¯äOüðõ·Ìì•ýiÆEmŽyæ…^œ°n@^`ÚÊA7HË|AŸò¼|cð½iëöå|™ó|7¦s§ –÷Í¿4Ò;ͺN×w­ñõ¯úŸ370,úøƒ·õhÿ0cFä­M[sÝC·tÊ™ÿáèöEÛ<ãõìÑ ž|}æê mÃ:´=‘»ý¥±Óu¹t[Ѩ_Ÿ¾j†ãîªÝ—ä:;÷=”þóÀ—Š>qxÍã¼ñüá.Kç¼;ÁUðÝ_?ùûá]×åÍ:þåÆq½Ú~S¼¯÷¸µâþÞ[÷¬r.º§ÇCþóöÒ.ýöš¥q‹GßÝ–Þþ_-½ºôCiÖCS§îø×äù¸û«S6tºôØÐ´5ϭͺ{C>çù®ðùŸæ~òŸÏOeµwæö¹xúà5k»Ýﴭ˼`ç[ wÞ~yUÅß_›±gèš½h ¿%Ö}ųï-ó3»žê[sxöe<ºdÖéùmÓ¾¢MÏ;˜ó£yC6ž?a±°¨ísJ›žyaéøãç÷xvWpÍGï¼ÝÿßY'+îêsçwÿ’-~¶ü²ü‘ß=øäÖ/LÏéÓ¡à±!— ~»ëV]~úóNc_ÙÿÅÇ‘£­:øNÏÔâ;ŽÝûë×O„Ûß;oá 1WœÜÕTúýÛ>£ûkÖm>½ø¼Îí^üé’çFÚív_ÁñnùUW,d ×ìÏœpt^‡’®¯ÿ0aÃØ/šÙ³OaÖwÇ6l{ø‡OSV=ríõû~z~Ëù¿”¼¼wZeùßúжlýìÛ§ íÐ%Í7¾âÒž³—vçÙÐ7ü0á‰õÞ mN¿wÞ»÷LêÿÞè“ûÓ{-¿gïŠ÷´ÚÿÇIoî¨z¦çޝ~³ëðkÏ­8³¶jõû“nvóØ[£W®^–·iÀ¼§¯™ž×y~ïèˆîüKÆñ¶Ã®m;lÛ«ã'-¹bᮟK> ½¿`ÿ€Þ’ëï}ÛMñÌÔªâ3_ô<Ì¿]ñæø}·ÿá•bÇø·»^4Ó¹œ³Éýø/ÝoX¿ç©ëŸàWš»låÇü¡Sæ®ø×3s¯œ¥g”1/  µoΛ{xyΠu¹mÿ½kém#ÙÎ7Ù©‘mö5€=##±ßc`Øc˾‡`ù&¸°£E¶¤“lN7)K—àÈ"› Ë,²I–ùYdä7ä7dœsªºººÉn6’mŒ[d½«NóÕ9UÝuþ÷ŸþÑüŸ¿|óôíÿýÅãþ׫E .üB¤vb–ïçqvâooGQmžÎQ/¿Onݤ"nM8Ó:oèʦC.ºæÇBÀ‡hqG•§I÷$¿ëÀbÁ:o£›1”;¼¿>¡¢†Í‹¼Âˆ ‡°:tÐÃÊ8{P„¡ó/ƒ™ü‹;ë¼€’xÕ'“…ÅH,9FCa4–Œuþ÷2öNã-Ÿ1¼j WŠe"@PbúÉe^…UiÊ«MŽOëü|ü#3ž>ƒJF¦& Ã›(<¿òè•òGçÄí5çPêoŽ–¼°¬uN0Q<+GÊÉ.1kû€V{¸‡ê-ëC«×ü–vÆhêŒÅ· i³7hìÌ’·)–vÃlênôMèÙ´fš4=Y¼´VS—6ðSXgÙÌÌ?>¹´yEðßxÄÑoP”»7¾æ—Sý"ñû0‹P–‹+Nø`0®h£Œ¢¼B}€‹Þ¤¥»‡'ÇìõU’¹¿'æ ‚®Ž“!z)Ú}ùÝé¶é¶å¤ÿ˜ôê’ÄíÄ»ÕˉOo'>݃¢Ü—Óî)¿¡ø”_Q¼‡wSŽûÑîë=IÅ›4ºÐtf¸šÜ Ð™ë8–Ã.˜ˆ;hM)Ã< f«g¸À÷Õ8;˜Ë± òyóõùº9×®ãóùìù²7ßgc¾]Ótô¹8Ë_Ю>×®‰äȸ±Øu£‡„ñF5¼øMsG«^y‘0¾tŽ^²w»ñä¯ÿûþêï¿:þûßýמžþËì-Š;ÓÈúÓ1M–é[Îoxo“OƒýŸ `#ߟøYbÿÛ†^Üÿîèæï f{°ÿïáSãÿS™ûzߟy¦f¿ŸuËÝž ×vüyJôÇp´ByºÐ~Cg¡Ñ·ãSÓ1ȧ¦Þé¹Áb†ø²œ„š6÷|uz]«n@ŸÐAh ^É1hÆ+Àûaó!f÷á ôÓˆöƒ/Ð_ ­|jij þL²õ'0 HÖ°ޤi2àÄ bL"+~Èð¶Û·WÉ ÌØÂáð2Ž€3æøkL9>ÈÏ.ºñA7pƪOFŽ:Ž£ˆu/“I˜öæjeyÒ3…ýqÔ½*ê®K„š?µóðYÿSñÿæ6þߌÿ_÷ñ©ØÑ'×Ö]ÏæþßüÿÞËgnþç4¦ß'ã4?Ößh¶ÿM×1LiÿüN7uGwìÿûø”ìÿº¹W·ªj3d0d¶BÍ&@=cåû ’ž-Ф=€ã4¹ŽÑ>¸˜ ©_sF WaÉrÅõ*¼ŽAÉ>@ÏNU»Ô ƒt›ÍWQCôN€RPëÄÆj)±û2pɼ´;=Û¯¥—Ô¹÷ï©x“™ù"éÃ|$)m½ßã@ ËË-«i$]è_‹a”¬åãÉ9z“ú1œƒ¶ü*ç…eÖs+¦êÈ÷ ¶¤š±–†3¶»¡=Ê†ÙøX»{me »¤µ1ïXãt‚þŒjmù•Hf´%™qO$ûì¨zŸî£Ë+°LáØ}ø¢3Zœ#º£§·¹,¿Ï E<ÆLt!Â+ÌÑjn^¡¹ùë$ìÇh>w‹©B[‘\K…C:}Ô4¯+PÉlE¥—QK¾Nâ^ãÎlØšM_N˸ð‡ärž1’~݃â{|ÆX›1@v¹VÅC€äôv&І \̾­¨Å_G9“¯6ƒv«„Ú‰s E‚šÚÎàuðŠx·º#†~¨bA‚ŽYV¡‚Óš ¢\žEKÛ!‚+ˆp˜¦È¤-G¥N8¾°º›\¡‚„{{c±«ŸÛŠÔ* ‹í]Ú=ûéç·Øôñ›Ã“ßÞn‡0¦=.@î“¨à‚ ÈQ¿¶4®*+ÌkG2àžó—Þ»û“†ýyN¥ÕyŸM_ ܇‰H@óºEQhÑ?ÜOÍ5u–I0Ê%>¯ítŸ×¾õ~bêðÒ²ëh[æµA(Z&¨«÷ØÐE—†áV;×wGÝ6ê1s!-8vý±=ŸŒ“ùöN÷_ßÅðL1+-‡wgƒ»“¹³*K}ÖðuFúî6˜QTz'SŠ ¿£°_ ÇÕ!åÉo_u· J›+‘–mÛ4ÃoPæW5o¯ãt v¬I¿±ÎlÞ¦ñåe”æh 7/®¢îô¨n·ŒÌñü‹üàábk,Úeø.'i[?:^{GH«T_¡6{™t'ƒÜݬµ!Œj÷’­+é+>‚žMKÁÙ,¯µ1×W+¶)xORá]©º³é)¾ZL/MOStÊ™}ˆG³©>¢sÌŒ9ÝÁ¬$£õ{JO*R+”Sd0.™³½Ù æ5ÚÚꂪixFö³„X¥WpYc”¬t¼¸ÇÏ“³QÔ ½Ë·Õ€ã®¢¡ñ|ù@ž6ÓÙ/îf þPθ@ ³_LL£A)+`|.Qø;eÃŒo5D½ƒ…&‡i8 7”Oä]OžM%è™6ˆ!Á+j|¬àM4ž¤Ch R€ákaj©v¢â¯/)\]äÊ㳩*ä¤!ÏÆR¢Ö¶]!)«Ùhp¶¿ÿWUî/—ý·ÇŠÖú¬ˆ›8ÏøÆ‘d=%ncVÃZÚ±Y´ ¬EÛMkïmqXÆ®™ØâZ3-äÌúí®Áºuöz)ºélÛO.›Á­åŠn¬Ï à ^hðϦsQ۴ʽ1CÍU¹][hÖœ©„µ´ÚboÔƒ]£eøåÂÝ*‘“´$êž%œÓC— Q:ÀØya:ÉŽ$)á¶«*JÕ´mÕtòÂß§¬5¼¹˜ù½šX­4Õÿmˆ'¥*ó™E°¾LœDc¾;ùl*R±0uc¹UmW0”ÛÕÔà µ(wC¿\®ß"›±]Us™‹*±áòÜÛ`Ë»Ôsn/ÖsÖWrÌÕ•œ/œŸ×Rri60ÕŸP­Ñ7’¥ü¬†äB©ò³8Ç6d&¯ì¤%¯z587ôVx^9ßúr%`k\x¾ŠS¾WúlZ ŒØ˜kcf,U׎éä£ +‡Àˆ§WÙ(ìFSýÀêŠ7^Øéà<¹™¾›ò“˜o™8Zá)g³Y{þ='öÝ༤™IÆéD0ÞÁºáE7ñø[v¼O)Ãd¬°Ž¦ Fýh@·®4íá‚’¾å÷Pœ/xjÒá‹rÌÄûP=õÌ„ÎaèåKþêrþe4ŒÒ°ôjÔEÒï'óW³²'Íg\J—‹w/Aé¥åšGzg­ÊwG£º0iá!Õ§~’{½OåýŸà³yÿÇ|xÿã>>•÷?.>áü»¶å®mð÷Þÿº—ÏÜühH뎼ÿhƒ@–ÝÿâþOïÿÔMÛ{xÿç>>5÷”æ¾þʆ?Èelã- µœU½„'R…Õ‹@ÊÍÕ\‚ºDqGêAô´*Þüö1 G0Ú×b™…Ç`”ÂOÃïKoíxôÝ#þPít¿Œ¿sÔ˜.;ˆR%çJ÷z”i¸¥7|tzÃǃië¦ù˺ÝÃpy»G-ç~Òû=ZqèJ7|t þ]Œ|–ênú¸_¹}¸àãá‚Ö|@· öLºèv¬rÈr¹Çß°—á5Øõϳ«~t;ÇY½âaâóAqïÆ‚xäž“ÉLþ ê„ý :r=Wa–çx)U¹0åáß䧬ÿ»áçbÿ»ÞƒýwŸÊüŸ.óïéóŸÊüw?›ùØÿ¹—Oeþ{Ÿrÿö<ïáþŸ{üÌÍÿ°r!½bäD£µ(иÿgØh¹(óïþN7 øñ°ÿwŸÇ_Ÿì?ï%çѾy k‹ÖŸ°êë7¬ïAÉWXŠß®Î/WG¿{x¹úöºp¼· Ì6ìaþï°æÀÐú>¹yÂ,ÿ¹Žƒ‡]î¾ïE2 óI ]b4}Ó¤Ÿ\j—Éø%z@„Ö¹+Ä^t¡å‘Ü-¢ÖÉ¢ñdô¾þe°©6ÓZçpØM°Ù¿‰è. ÓqÝ—K°Jª®iG'?óò$¦C!‡]Fc:ü¿ûl4‘¿5­\…ÆXo2b–î²ÎóC2 vÁ—1&Ätã´;\ô£mCt/ŽÒ(‹3©C$Ç×EibÐÝ¥Œ° b÷{Eu^t£úag@7KÝ€ÉíÎwÀê«Ý0 ‡¥nУr}0ì£õAgŽæêƒ±•ê³ æÕlÀ'?•ñ Ü»Ê,Pý%˜ïá°wÞ—mmX*hÃhÃùÞÙÐlXmÖ†F¢$Œ=,õÕ†n…êØÐ‰n…àt!*uÁ.Dó]p€àQµ 4•>ìÄåú ›ñ‚ú 3ñ\}0θTŸ -ôºiŽe ôxXb$º–”Út¡žd¾Mº’TÛta¼I¹MCRjÁƒ^$Y?Ì®d ”š”çz1™oÓƒ®Lªmz0†I©MÚ¼-×ºÍ â5aéVH`„Ì`¸—vÑZ$¤@a4ÆlS¨°Nü{èü±Õskž} uÓ1ë¼:zɆıٔ’ýŸ±ø"êg‘,3ÃM«°ß—Úª(FÈ&>ÝIŠn~¨øt ]¯aµeìàÙþ›¤‡)cSÒŽÆ!^»µ8ñû¤ßkHª)+]Ô§ìÿ|ÞD 9¶]N®«äE2IaöëâkÏÓ6­&ÖTÐíGa:Nhmš±ó˜O‰–/wùÝ+Op?´ ë?¹ŽÿŒ.c´N7IÒÞ>NßþE8ˆû·¬4Ô øNúã%¹¨&bÕù:%û,ë†ýˆs4v³s4¼>Á¨W!±šq óê «ï)/Å2¿Á¢›.2ÿ5«â PŠ2R©2-ø^oµ¢§cwg0|hwG™’µƒåX¥•Á¤ORX[4yQcQQwAd]Uñð@dÚ¡[ºð“x±wq<‹Ï NQÎÕxµÎsd°)3K^žK­ò÷ 9.ŒNQùš‹Å[“aØÏÊñ0WIòA¼QéuzröÌ´Žô¿ e í*;ç!µ^éº!ñõ²LÃd$²ä°ÿÕžvWÑ34›î­ÉF³Ì'Oßz]5Äïò&‹ÿ”M Ìñ3hÐâIò'ì8IÑ©ÜXãK†Ø52³t0òrPïˆæz”Æ+-ðŽ#œT(,S£Éª¦è:$) IÓ ŒaªÑ’3öxç'cƒw˜¬°ö¸&VªÚ ¿Rô4[¤‰Aï0sÅJä› †2Ô@±â`7;±­†¸ª»>s|#¯z7ö/í¥W{Ú;çÀúñw ~8:,ÆË|@|в`bé—yàb¢ïSðL»¡UÍ[¹ð—b–Lí¾9™uÀL&~ž“KÿœŒÖ'^!Ÿ†Ü&C§œüÏî#| .p•mtáþK:ñdOŸb5²,zðÔ:Ïú)Gšå¬c,eÚ£„7EPÌ\>ö|VËÁ… ´¸+Ûm®šÄŰmØæ“Il­¢Š¬Äh*óAÞÕ™Ï`ûOçÂE##KÆçºŒÌó\øk[“ª€$24ìêr˜†é1°Ðõ!Á õ‰ä°ÆŠd ˆ3fðmñ²‹ôZó%û³U讫8R€…ð­×cÔÝT.¹tŠlCê5t;`¶éÃ7X"ìN¯ë-€ˆ÷á0TÝ R¨ã¤µc(,ÈÉî óüEx ¸Ø^“kBžËºãÖa†˜ íBG‘ªæ+%l€.öbU¤=¼x:ˆ”œÈèêóQê<âæê¾ßf®4{|þ˜ö)ƒ¦˜¤³¹„A2ºˆ>ŠNÐe膒îZ8;¬ÑÄž`÷náËCíF²„[Òu\޽ëÃ×:•·…/KWàËö˜ ¦-0¼õÁ }Æ«þÑñ9[EËéŽF[¯f€ÊG”Óƒ9ñ ˆãÌ¡2+Áe¸NëÞNs jû º=‡=Dà\iò¶ÆB ¡Tp¦­>£æ[{€7ç ¹gyÈÄÇOJ>àŒ‹ƒÀ4V˜«j=:DCeˆ0®‡ß6Hž’¿=@¿Éüôá;é&Äû®IçàÔk[€lFl6j[–Íl •ïº §ÒÍD¦ûÈ;CÏï~åaPÈ-ñ„@®²·äó­'˜ ÝçCPÉ4™>ëþ=(A’±œ b^!¶n¨­Xykø±KðÃM7ï6±Ý‚Ê#Þ~’hð¹ OÉʲM[µ²0¨˜U$ºKŒºeȳæÖV{|ù¬À¤ÜéNÝZìM¡Å,)7&×jÀBk-€/³Øúr-ÑÈàŒºottaõ7tÜú6¹•(¸„V›V|ã¾Z¶Q¶þl—¬?ßâÀå«õ»:q…‰¦Œó~·Àe©°ëX%lÑ7Ô›Ö©¼5p9%à{×Á-s3oƒó^§çwt+ ?ìâ£Uv¯1¨l^# $˜Xjp-ìÚFsì”ãNGvñy¹øÒíjêVÐÌÙÍ,Í@7@1òiª)ÛE0.Ø]¸IeºÍô šÍ\—£™”Ñ Ò8ª™ͬ šYÍL¾î›ªhæè †ƒ@;Ä®{·hf—Ç.ޱ)š­Qyk4s4#ž7q+ ¾í v¢ºž¹ðüŸXü<°,«“‚\L¢€Rf{“-¨í4·6–¡„Ôï>á¬Ü’ ûÎôLÛÀÜMÌ#Û.WǾ×Ä7™P3Šƒ¾ºÝ¿<°Òf;À›M[†Ìuø1Ÿ«Ú´ ›íP·o€¹AP0 Æû:„ÁW7º@5ó-ÜÈòàÛá¼cÙwoG:5ûÝ.GlhG®XykóÔgœ€’.´fHâ’²6€áU¡Îÿ³wíq:U{É)R.å¼Bž\¢£ÌÞk¯}s’TÄq+’KJ3óÌÆŒE*Q™RDÉ¥r™!ŒK"EN‰¡‹\N$]„z×ï·žçÙk?séyöÚ{^}Þæۚ癵÷Z¿½¾ëwý.ÀR³³s†f§#ìÙ_Ñ¡F3`ÄBâ@d¢™GðeKFóçv^˜a˜Eu1Q*IáWéÿDÑÍýÒðeʦAÙ¸R¢iP =»„a µcò 4ÍÉeÎÆe"™²iN:O#¬8%ÔKPrL"çk2ã0‚½Œý ¸ü쀈èHš‚Îãt¡éQÅ‘¿„ŠcªE]M‚PüAˆèwÝ~k¯ º:X~XgN&ÏiÂø‘ÅuG°x’ ^¸#Ju>›MµÑÅl+Ð|ˆ‚ƒ´‹k>Tåš.h>J‘ôÃ6#WKÐlttPÖ‡ÉÖ v4QW$ßí "²i:OµˆˆZ€a@",$n°wÝ3j©)áp¸Hv“ »Ê0Ã)2ªXvoÆl[>Ö(‚®¦— '_nWZ†d:š®;ÃI„"Ÿ²œdPJ.ó‰Hã•í2Æ4\+˜ù¤Åþ¨TñŠ:ÎEo¢N"Þ¤âŒ-#âM"ol$0½U}Þ&»?d>w)–Ù¤3ˆÒ”e†ü¾ªùd²ÏÙ$P“²ûØ!xL!e4°„ÍØ[f(Er*eŒ5/'¬ˆÙ¢"¦š^¤ ³²U‰œƒti¢ï<Üo`¿³D‹ 1ª):6£xT%RM±éEóåv^50¢‹… 1ìi$«zÅ~%ŸdK˜%VL­Ru˜Q:ÏÛÄ9T‚Õ_ð \Ej–M2ú‹—ÎÎ΋K¨¥cuÀŠçÅž‘Vhý…/ù2T\"É¡¤«v›jâ—ªS,Qqñåv¥).ø"­WÄÙÅìŸÆRìâ–ÌÖ®±EëIe{>è`TB¤ tHºuÈÅ +Iãvt‚{(5¹«“K„ –"Z"†+W'’Íä&¼tž(L芫H•݉,d"è¦D‘ªžÎÌˆ× ú†S‡¤žšAt Q*Õ°õ§BÓ G±é©NÕÛyußjL-1ŠÖ©¢L@$rêAxq¬Ïzƒ.[ØxjZ޳–=¾ !k›Ïp°€`ó$·ÛâÖnÉ ^:OØïaÆU­SfB)5dÊ :)¢7p سø8…BrhFhdô±êjz¬[—¿DÝ:U‹Z (’äJÔ4¤©O‡qÝI$R™™¤«6˜ÙÔàR*äBù:…ºPb³«Î%”ˆ¢:°™2J Á`ÆŽ^JÉs0'lah. ƒr…iÑð2¤È´Š EæÐ²¶0øp•_s¼‘ÑAÆT~*6=Y~Üîw,  Ï-vÑÃäúca8»¿Ï†l™ûH7]4†`tC—¦n¸B0 .1B‡JöðB¥&ø9uÊɬ0;D§Ž¿Bñ`À\SÖ1Ø.še ¶ “[t`»i.~Wôw²‡Zb~e`Ä€ ®Îçkôwò«ŽW§¾ÏÀM³5|W‚®Á2œÂeSÄ0ÁÌ’·Ê`:OÀtW;å3ðRkr!Wö°~ÙpÂSNîð²-açcŠE\¸>qá# jÆR(æËíJ-ag]P,6Ã~A6ÙÚ¡Í­b!NkΔƒæñ ⤄ÜΣ!AÍ4ñj€.T,(¬­™@Ö ÏÖG*Dq(¦Ðñ¨ÕE& †n”W<¨&OQM!Ín ªPt«„£È-HŸ°£çéªËE§¢½ç…¼tž0 ™®Š3D,¨h€ÄC‰ºLfpE¡ÁÙƒË6ÆP,-EÇf,-…3jù€S_)=Q®tòçv¥¼Ÿp±‹&Ãáüòé „DÃiúEÖdm+\NM‚Å!Gǵ‚#*Nì))Ï]Ñ!w ‡ˆìóHñ”ŽTpÕ]d]áÔšÍ!G³Èaʬ@@W¶ÌAÕÈ#lpaÏ«ö=öM¨™ ¨ «Hù£a–‰*x eˆ¨BmU ÜS²¤XÁ8ÁfE i;î[[›ž@ËÛ•ò†fŨVQ0Îpt‚ý-£¹íÎ{QŠOêóÀdã˸HlѺˆ0+À Ìd¡¶Îu"ÓtëD×™ˆÂŠ(b]”Šº”§«ÌrA9ZÁ¯uÝ…– ,Y€ñÐyÂQ)5.S…0 2(ˆ)Q¥¤„3ÒD€z6eªÀc©#6c©#\Hš3Uäoç9S…bG0šT¦JÉ®&O'ÙvRªû50±mX³c*ƒ$fDÕ·§ÚÑ„œ9°¤àp,b1uÅäª 1EU†¡ŒÉãç}QL€F°DXUFw‘4Dd¥ÆH [ñHs6Å¿#ÒD‡ @Á—¥ðÆŸÛIÄ¿K›dãßÅ€N ño8›Å —¡c´‹Ü#š‰)Ttqp…ÏÀ8è¥ÿN\ªd?d0'Œš«˜É6" ¯ˆZ˜)aS Ž ¾â³,"£ŒÂ¯Š­¨®À‡U±å©ˆIöV^•È[/ŠŽO9ŒHÖqì "¤‰·LÜ8îS¦2@DÅÀŠ%9¦‹ø¡qlÀ˜—ð)[\LAóuCTHzÆEÞ¤,®.ƒNw…‹pÄ%ÛéÁtž0®PW!µ ÓFtM W˜½£¦‹+g“*ÂÇ*V6;šk9‹¾)….ò·’© .]’WC˜â|/þ¨'²Ì\qê 5ÑsÎË%òÍ`“³4 všüaU":M€†ì@pªq$†!a;þÔö²óÄF†K”#!‡õ0:¶èš¥ŠØôà‡õãf¥¼‘*†?Š†Ž ç.ßkñÉu’…²þø%M°2dl¾xUÑÃA(#W°¯lùÃ.k]w%äB^3倘†JÐ'd0Ý@ ¶D#Ãg…J¤«9dؤ±&~™Ê0'øs;‰l\HøŠ…H(Ù3-TññbO»½lbJ\.…Ì8ˆ¡ ÝŒÎM*„Q m¸Ä5H€³¸p´`éãþ°¸ºW¼C øQnM"WßH Û™48سø0c¾D‚͘/‘>¶Z±é±tGþvž]—Vˆ¢©ú±mâðd\ÖPÈ’  ƒÃIsÔFÉXœÔ„hšÛk ÞðZ 0÷瘕ºÍ+Aê%tž°iàÛq]„Á·­+Îz€ã TtçÛº†i7pÈbÌÇE°±=r8ˆðÌ5ÇE„g¢)HÊþ£FNÝÒƒ­Ï"lϱ©kÓ·©á¬kŠÃñ.Mý'-Pé3姤EÔ6ðGHR·¡ú¬ "r@›mßL 6TϘì}ò´@ë‡6ßÚ‘4R[ –=‘Aqϵ€ÑJBF–žúO~qʆ}ðQâ')yq‚lLþ°?³õÈÚØU )Žê‚K” ~–OÐò,fí8 9"ïkó÷ûO^ž²>z.Oâ–§‘'-Fžlm  ±«‰ò„ƒNqò¶sU]Ÿ·6m×\ëŠ{®e|òûO^–²>O|PÍtÉRãi8€³(K-N– ×oQfª)ÈÎê0pAÞòC‚^—l6[•·l»qP†çÀcÿÉËR֢岴ݲ´"²4‹‘¥{%à¬eó„ ËU SIä dúÁ&ìð¹6ÜHœ¹6ŦgY&Ýò²”¥¥Æ¥î=S³K–%(´Š‰ ­¦ È’ª®u ‡|@þ¸®#dÖ,AmR‹ÛϨ{®åöKOý'~ ¶oÊ,…ƒ ƒ ‚Q…`= lPo)Â(ÔWr5ÔXQWƒ 0Q Ï(ØèmnøÄ¾ñXjCBbÞo‘ø)š> ÎÖ¨k¡ú¹9f$&³`ÏÄ$|Eqrôù–ëVÓ©2»Ÿ÷[$~æ 2³QÅŒ>+j¢jˆ]c±"Ó#"ÓÊHdìõ1„ª OÿŽÎ&…¦œ¼<õŸø m> ‹âž}RÊ·0jð_£0”`Õ þ.~ëØ«Mñu<ý'~ꔯ+Çr¸Þ€Ì̲€ÌŒâaöxÔ³í^9–Íý,–mG„ðGø8ôIü¨'§p›i7–%C6ï±ÿÄÕñQXpŒ"®qPöð|náê8ǘÒÇCÊ/ȸxaÚ™bÈ…¬£“j ºxáA/M¶‚gÑɬE -ö2@©<ðÝ‚\®(LAØÔR0W^(¡xßt1©X D`‘æ§”0•¸É ¦ T‘$…™|ÿ„éG „ø¤”Û€¸Â1 §à5¶r5ŠôO@ý¤Y|åjºè¡aŸQXÝ*çÙ~ù5aÅ›@¥sbV|Šuüþœ Úv CÆ7ê±Âö#®N/.îùŠ!‰À¸"ÄZäâé@‚Êö[b1a 4„6ªEÒG¡ðXP/ü=œœ y4ð{ob.:äŸkìþ©9D" x% +@ ˜^PD¯‰/“¤! ©éœQ úeÒqŽ\ÂölSlzŒë{èßÃË$KNÇŸÔréŠÀ$„/“ °HC“ÍÀ‚|1I ˜ÍAœ!ˆ :á†Y¹ª+‰B<õïA˜Òv6 Óv ÓŠÓ("L)}X`)ÜÒ41NÅŒG(P£±kðÂ4Ü“­¹'[.ãÆSÿ‰Srù¶§CÝ"§ ¡×È¡˜D R!šB¹3÷l%nÏÆ3-¤tÄ=;àT8>âx¨ /*"U à±ÿÄYüSÐ0!U=`Ð$˜Ÿê\=•ðâEhòøž U4Žécb  ô¢­#ì‚Ö0eÎÖ)CÐvÑ , 'AÆ)ã©ÿä…-Ír†Ï"P(À~ D¶…WÎ4¼‡L sÂÉi4„9™‡þçòM[Ï„)P[Ѐ+?wÀrC($`:بjœ¢ªÚ\Q%J„¯;àô†öç)œëPž 4ðé¡óÄ™Zü³wØ{f9¥7àR40 a¨Çò°sT…o‚ªp/à$]Ù‰ß塵„…b†,™F/'/Bi%Óš ÂñĘÈû–2!òVÁfë0çÎ@) N®óÄY |4ô <ëD° ´á ¸v œy&Ðjª)5±xCÏŠzVÄÐ >ÜN"æòÇÞ$gµ{è?ñ:tÿ =Ð…TǤózkÜwUö!ªæ&Qx؇(¥z¢Áp:>¸’T!CpJ?qDR.oýÿ®0YcPêÝ•¡ìÿû¤qã›YûÖÜÔ~Y¹¬Õ&; ¿hRYÃù5ün0ü’õTÙùÛ6]ÚV.÷çÏÿËŸpNzJVêŒa)a’6ÂñLR÷ôíÎÔtéY͆u/÷PØA)\USW°­ò6ÿ¡J9UÕ ÊlNª²Ï`£\Hñ{°Åý <$57*wwNNæðR¿—‘;¸,¨l¨–š¦gØé¦mh™jª‘šagÒt¢ë™¶Vìÿëçûó'ØŸ¤Öÿ p¦—{”¾þ™®£k¸þuM¡Ô4ÙúWJþ\ÿeñÓøæÛ^­6×*7Þxdâ¬ÊzH å¤õ¯|Í5)3²ïNUö›®)mûe ÉÈ ¥´…wåF¦ï„3®½4–ŒÔ•‡MßܧCNÝÕ×[´³áO¡×öMðHèºGêf}S«â¨P‡YåºNØw|m—=ºïiùæ [žiÖfÔå ìnGæÍûeÕÞÙõ'øä²ªgšŒ\ûuúðîO÷ßò=&¶zÈÚùÕÆGµSfÛµLزtÓ± ]4ð̈7OýôãØ_Oý¸h@xßû{ ·N4ëõ§¿&ÿøêÎß½´zdÃC£wnZ[õxÏG÷ª”søƒ‹¶ž³vúÛw÷ÜñtæÑ_ TcδSݲÌ\ðUã“Gv< ÿ²-Ƶ»æÿÜ5÷ösûö¢Á«/¦“½uë_øÉäÂ-úλãªWïXZ8¾îÞÂÝ3 nqõ7U *´ë\þ§µ#~éÕé¶É…Æó/·™¶q×Í÷Žl:naÚɇ§íÏ®4qöîÂ=¡Î_¾Ø þÌmŸÝkíRïï>¾ùÞ¶OíݽÍü>3»^²iâˆKZô߾]ñÉ=Ÿ˜V¿sê׳Ö5¸=oÅå-÷wÜôÚ‘ {èSÏdæÍ›sb[øÅü†3‡¿Óq{÷Þ¾àÊ‚Þ[×-nqýÄ÷G¿|ß¾Â*“óoxʘP1·pñ„Sã®Ë¬ñÒº»ÞÈ2ëßKkÞ÷Ø¡žÚ[rëuk?ªË»õz»ùÅ7äì´/ì<÷›)½›üüíÉžUŽvŸ?®Ê‚­'þ³ ñ3“Æ X½4ôÕªÖ49³|èÜWú•ë×j}…›øôGUjÕÉõX«Ó·¿¹¸MÚÓ¦))›Â<Õ-ë’mWµnÚ«B‡†íž¹±û´§¯ºcNÁ#3Ÿ[Üÿ§%“O]Ô1ï`÷Ž :ÞõÀˆAC–Í)œ×dnÆ.}Øõ ÏÍ='+4õ©j‡û÷|¦w½o{Ì]q¦ÿ+¿-»v÷êËŽ~µú+-ë¦Õ›Ò,­\ùMWçi¦Ü›{ˆ>ðfvÕW.\2fÔ}ù}÷\úð¾_Õ®ÛÂNo®éú¥×õÂÿÎm;zszïëvÖ˜SóäM£;<ÝëŽþ_ì^wCý£¿mIoiõ«íå5oê·sá¿[çÉÚ[ØnË ýÿlúì×UlÝÚbÝЦ ¦îü­Cµ/&-]òY¿ÝÖªŒ/×ïKi²éò=UÞ¯Ê=ï¶Åy“æç®¯ÝaêW‹æQ{ܾ[7t_¯ÃÛ“¾Ó{T£‹ w„Î}eýt»µVgN“vµ®û>sź퇲^ú¼EèêzvTØvQ³‰ïiÙc›­±æà‰w [fì?óÏÚ]¿{®î;W\ßíûó î©^nlæXëµÖ«}V©üÚõ{×¾û»±µ~Í»í‰O?ïõh—õðñü ͪ=ydF~ÓíåóÖ×¹øŽÃ—x¤]ëÓŸøŸJ o5Úo¹êÒ•‡k*¸}©>zÀ’Çjч†ÒNUßÔé‚Õ½ÊuK{ïà´EWºâé'Z½þé%¹×µ©ÑyÿÇÕ̟֯²´æ/¥‘¯'´×”öË+¾t§z¸IÇ_&´}Ü÷¦Õ=ÿÙI×_–«?þr£ÿú»Zû/ŸYnú4ue›Ü̺Wîj<ªçòKó jöûþ.ãô/3/µ;ôÎ;gè×Z½»¼ó©Õ寵Y}ðÝQå½Þó‚O¶6¸ûÕ›[Vo>ì–ŠãòzÜüÚ´ —W]0·ö€f•[kí¿déýç¿1½R+?ݰ=méø®4jØëš×ÎÙ6.ö³}Ò×Në|°}ëç+ö_q˜Mr»Š#®l•]oÇù çYù™ñሩ9sªµÙ´ê™É;´ËúóÑÚi£ì»¶¿qb[ÚÛºäí~wTAÍÊ©s|nòªA÷M~{Ì_f|s{FóQ'õy±záS]¦Lª2zÀæv…=6öðõ‚Žo9¾óðæ©™cWÎ2íù†“‚÷œ|R{}þ˜Š7=×½õØåÎ|aC§³Û^Ÿ’g=õd³·ê>_MY<õÞþ}ÔùëÛ ^ø[éwv7.k_Ü4-œ{a~ßåæÒñ³g):=ü·YyW H=ï×[~z2sY­Â|—׻璿Î{-åÎ*#–4}ô¡ÿ´ú_ö®®‰äûŸX‰Š½sÞŠ¢€B²I6ESiň!Y LB{/¨ˆñô,¨XPÏ^QÏÞNTÎzŠˆ‚",gC½ÿÌnzB œŸßŸý(ɼ™y3oÞ›7“™ï˜[µ™'´úŒ?ãÎHVM̓üëÞ`bæèÛu#ÝIùݵØ%ËõÌž¶èí&Ë>3º?{Úùx—Kx eðÀVaýv-‰c»_iÑÞ¿‹Û=»¼æ£~àHZîMÚñ§í­ÏÁœ¾‹l‚ósò÷åEýÒúbÿÂ&´é~ÞÒé÷“-ç :ÃŒàY¯ûÝl27­ÁÚÒ¬Åm¦ímß?±Ãª.ænu {ÖMò\ßìÉ/)?ZÏ£ô,î·àÙ¡ŒØÔ®b§CiüøÀ®×ÊK ó E-l¼&aMv“·iÖvK žèqb€LÐtMd=ê›¶îýqÄ¿ÇÌ"þž/ ™~grÞ=«Ž!—ÎÛçGŸÞÚ>'|-«Ù_Ëþ:Ó{-ËcKË1¾Ÿ è—F Ýý$sݵEc¸è̈҉™{w1¼nvéþ—E瘹[ìS.ÎÛµtøÓô6Kß”Þ ð·jcëÜìÀÄàwOwlÞøl¼Å—\bÍ¥ 9„[uÊ—O?' °è|yñfY똃™ËÎŽ=3k䪋#Í¢-Û¤´¼vygr¶8!ù$ÇbäÉqnÜ¢£(?§ &¹mú89ìµ_ƒéý›x˜×iÙïgÆù”Ö)×ÿÓ,zfµ˜mÿüÏF9éE£æ%EÏ{”ÙjiÓ¼ï¨ÈÛî{úäïxÏa«Ç_+î1ÆÅçê›Á‡g]iíœÚ.r¹_›KǯŸznDÊÛåÉo ³×Mܱ¢ É—Vû¬·˜ê3~—å˜nmwgÜêXw{óÏÞÃ×?8œ?hëòçÝš®³O)öðry^ÜêÓÖ÷;^Ø¿t~Úîé$«¨q{í>ÊÑ€q}&Ž÷n(uþ÷Q˼Ò?u«ßwQBê…Å!Éí'–vØyJ—-±OÚMOÞú>¤y¿;CleG ߬¶]Ùu•ÓÖ5Α§=r(¹›Ç<8=wwì/~þIo¬Fó;Ùh^ž}‹¶-°‹c$]ž,ÊÁ÷7[lÙwÖÚgÞÑõîõ'Ý6móÿ«ÿ?kΜrøõEÎ(‡wW'•>ßö(¿Aݤ6«R6í¾oÉ]oNNÙô°Ù›+¾1].¸Ì)uòÿlö)íFÝIì©>ÿÁ¶G8%ÏØê=òßá‹£Ö·Û,ðßÓª]ÒîÌ«3³î‹òÏýÇ|ÕÖãAøƒe ÷7v êêÓw…ãªE3÷0Äšç<¸¿æÄn{·Ë/óý[¸µò;¼váÛ©Û&~º½iþeìþ›œçïE¡ŸÑ|êôsö-"[èz²E“Öfò=½š×êŸ' {®ÌžÏvÙ(kæ³u—¹ý~ÁêÍt–¼¥G0Ê÷_éÜç­ÿ´¸‚Ù£r‡®zc±¥óðzg/sG¯xrH“w%+gzdMkdÝ_<ÅevßKqtÍ-Ÿ©I%ö£Ú%Êóz;\°þØHAá4³÷S›žw|Ø3öCÐÇÔŽÍ—·ë\Òéþî_‹c¼=+ðìÈþýŽø4ËÞÔýöÎFÛïz̲<jC –J´å½:5Ë?ýÔÜ&êe™{v=?s×ËÉgFXl}ã°y½Ã¯õ^Nζã9ÑB‚Ÿ.ùmô÷/¤mËoÝK2d~Üþø¸=b³¯3šÖ ¾ÔçX ÍP;ïæn§z5í=8Á3 kýúg—YüË­ú/Ãòçn›6üÔÉ?îñáúØîÌ~öÛ2WŒ:×5}ØÖAê–v?¥ÅyþTß&»èT‹ŽþÛp»Fì^³ÕÛìÄð´Æóâ·è]ÇÃ<3éªß»¢[Ûä’ùß_XôiÛþZ®nØwù1ëí»Rr?Yúäu¢ÜÃîŒôýûð4ʧ~Ûl=ö:塼gÿž.ï·|rHdœ¼¤ ¯3ŸüÌ54VÔð‹4¢a³¡õvÿÚ­W¯üÙ³±]ë›8Ù=ÊkàšÔàÄ‚‘é£÷~.jÙÚaüvÙ%ŸŽ‹†¶¨Óv¢G´õ-Gì L0—J¾x¤½pÀóøËÛ3Þ±¹×­È»a×]¡ãǯž8¹Ó#”ñubóþo-ùðaÌ?B!'’½rÜ묷h1Ñ›CÇÐ6&îºt=£é–Ã÷ôêã9ªX¸(`ÉÒ’I \jï<ÏÜË7czø£Ñæ¬?nß­;!üº×ó5V Žq?·Û_ÿe.(–À7¸ÔÄR,91YCIcª—¡ü¢q*üáŠê… „¼þ’x$"e³à]Ô46L¡úJä<9ŽÐ@2).–# ¸dȸL#åã2Ë©„ï‡Ë©C¸!T<^Þs—ô#^e`ä+nø:±äEqv¦Pû‰Å¹,KPù’tòƒ, e’d>(™Ê&?8ä™ Ì…NæB's¡“¹ÐÉ\èd.t2:™ Ì…NæÂ sa¹0È\d. "—`ª ¨ h‚)ë£h]†ªu¢y¢}eÕC(!’‹`äÚÕxÕ H“óD’pe ¢Ø:‚T59…ê3Ä A ¹: ‰–§( Ó!Æ<Á?16@Má~à½_wò®6.Kc›ZA*©°Ñ)T?˜JWNÀ£«!¤\&'ð¾, ™ìbÓŒò¤ øl¼„ðİÑLç 5ÆÜi hX4ˆéÄ1ÊFpP½+¼Um¤º7¦\ŽèÆ[‰MÂÒ’Y ºQžÂ¨:n¨•Âp!è]¦7Ã8Stÿ‰Læ2²D£ Xe°$ãKq9n:Oº¦L‹'xïáÊWççO<Êtv0ãMÄD8ð¼ Ü£È1Þ· 'ñ ±CZwÓ9bo :ÂhÖµ†i¼ñA?2¨mr`îMçG×di["xCî€Æ×x Ñ%Â4øáŒbÄ|< eÓÙá”×<ÀDà—ÛØ:ìn„<¹Æ­2årcÔL“§ján\?b””*ô ‘O&#ºQ“ „A¬ &qu¥q½]H Ù©B ÈËe£+Í"&Xðšz.f” œ* 1õ‡dÆôV1j¢Qà:` !ÑŒ©`ÐÃu[Eû†Âr™1jšáøÂñ˜ÂòD„ÑõÚ†ü­ÚD^Œšdxzî6dÁs…tãðÆÑã…¼µÞt95Éð8y-"¼«\Ò2€$;—՚ΓQ£Lœ&€'òá}Ũq#wLŸ'åeV¦3dÔ*0ølò01Ê5Þ™d0ôR_¡c:KÆ-3„“Æèäá7¶ñ xx¨îeä&÷ær‹<¯\'¦^ÑZ.?Æ­1Þ±BÞMx+##>–ËG9†˜²M,€éûKbÄ¡8¼¿$¾7üüƒÃ4†²ÉL.’(¸T&£À³_0=<õœ$‘$œB ‘€GÁà™2âL˜K%‘<F¡ÊpyL´'pšÄ(’H!.>¥ºŠùXêPàgJ¤š O*å% :±4 ÅÝχÌA…«áÀÃËqi,O„DǨ¾S(ÚYPDMœ4¥ösU…Pâñc上B‡÷¾ ¥ü˜¨0¯"3Y Ä¥¸L(Si€Ô0Vý6(RP¨ŠÀ¹P$P'ã“ E"ž’pª«@¶TW}6P«.(`ÃU‹ =ª»v~ Úîò̸ëåêꮕ˜#Pt“nB¡U˜ùS¡“*V%Ù‡ãÒ(žX*R½\6*OëE&¨-OŸ;0W¦òt‹e‚Bxê7AÝyZ¼2[ÏÂýŠŽƒË *_"‘ ì¡øìÃxQBQ¢%?‚ ð‡#’—“ŠÈ‰èªúyªz1‘ñy"œìÑM0͉õƒ$7ÑÕP™`5„H ”Âv~Áãù°óÇ"º/‘à-"!ñ–v[€FKá2+<ò t#0T!6ÑHJ…œHÁEtJî,¡…e¾*‘ËÉWQC¯² ËÊJ(ŽF$‘ OŒ#‰Šcá„z!Tò”·5B‡$B=פkæ ;X"˜Qjw×*•¼¿¤Ñ$ƈ ’¥Ð÷Ò£ „¼p‰˜'’iÓ"$’H48°x9´1Ä‘w„BU]†Þq²P2¤™¯êˆ¼‘4D¿./‘X­H¢4‹à¿&§T®ÂÃñH¢¹5"DÆ DHF1§’_4zuŒf@¨R‚hàÖ• )^G‘p9ìÓæ$ø4Wk`›°¤€—)çÿAÈ&ÈÆ!d,„y"üX´é¥ Ñ¡Ù’° åI}s8hi¡fDÑ€#•–ÂzPÌÕšªdk‚Rš)/v8\ º€ˆŠ‹À胄*üqð%^+—(‡ ÐÔB¸©ˆ?ªƒ66­LvEž` ‰ õˆ8Ö„QA2½š lI’NS6°9‘ )2 æõ‘†HUíK´‹¹¹¦U (_'ÚPÕ„”ÝD-F5ˆçïXÿÅg¼ .é$À¿ #&Ð:0í¯ª"é@¢À¢€œ”å_“@ DûÒx_( º0ðDz`à «¶¦N¤õãC—!¶‡;¿¸üCŸ`ñ ÿØî+’ûÖgg˜•ê}¸iBíçí­œ”TÖÏTU’•Qú N0¨ôôUTÂV24CF<ʲ×oQ˜¿† Q}¹eú• Q¿©[©Ê©Ìž¤Yoõ¥ÆD½¹t5¸Rc€ï |J- œ %‡euwûJÖ`n3ÌMJ4‰¼´­w¹•cÑ´*Ç¢™X95 ¾7È«½P-éé[È3æbï; &ðHgð>á~àªy :£wżR†ömÍ{Åå[s%rUïZ€@ïê;paˆƒDðü`UþÒ U,"4L&—AÄUš¡9ª1ávo0ª‘÷vTzT #çÕäBQM kdmTF‰ ªF²Ž*hmÍPe†µoP˜±a tx »m¨U¿ù¸¦víË].5Ò´ÿdÐûïºÐŽd|žXŒ—1$éX?åS€/¦6›LSÙ¤¦`ûWó8¥- —NÜùÝóh|IÇ “Õ0¢šÀ)Ãð¢/ à ü¦Ža,øÎ!iêw ª$eúðEîwÍ‹m€=09Ê*ÍšŽc«GÁ©A60Ìx<ù{rU9Q6’º¥“^­ùjÅÕåCôª;'ðvLµçoÜ >P⥠çD§õÀœW{ÇÁ÷þTvÿE®0¾ÿŸ¦ÂÿgÐXl”…Âýÿ(«ÿ»F67”Ëåñy í™œ0œ%Ór FœËå 8Lü¿æ¯ö©Þ§²ú_‘«ÊÑ&ÆÒ=ÿC¯Õÿšy¾ þÿõa’¿iMŽktëôäKãn-Û^÷F“¬5›ãFÎB<þ^¿|ñ÷¹âÔ/ïí]œÓ˜é¼&ºkNk׉ë> ‘$8.q—.¸û¦ÑéìúIšnŽÿ:£@âòÿ“Ÿ6p(òhÔ‡¾{^/ènÝ©[Dûýž_ÛÚuŸ²áÖßmŸ6õ~Îý‰ó¡ñ,pÕ[áܱ·ƒ7¤Z˜c³¯×°>Ž—.¥DK¢7¶±Ì_·ni\lÁÛ¨iëÙ­­;TçÏ~C–½ŽK å÷¨Ï8V:úqŸ§íf÷]>òÀ˜Â?¯=³ºýþµYÝoÐézhýmƒN›/ Øö{ÉÐU;2_)9TÿòŠÂO~Ë8°àáã— ]¯Œ}€ßù[ºbœgʸOÉÓÛ »‘>¡î¸O÷f¼/ñj*sð<Ìg®‹’ó½ðimŠ\vvüÛÇ¥IV©opÉÚ§£M÷Yä?skàÉ oÎÚ)óuçx¯ÉÜǪ{!¢øZ=Æ•~7¥Žß\ØÅmö9ºÏúè)+ú¿•ií. ¤…;îý¦d×–É^u¶A©¶Yq¾Çüòl7ï8èþüMÆ×¸+;·õ n×âÐfé–uÍ.ØN*ðØ=‡{óz|‡¿îÆŽI¶:Nó™¼vÜਗY[ú0Sï…þ{æöÒ§Ô…ëîûînç•ýKýn»–ÎÿŠlýë«Ç’¸€';¼]ïräžöAÌ#ŃŸR)–Û&8œx.úüÛ–ˆµ×½ÎõúP´9`hä°ëÞó­6ÚàX'à÷í»Ö >î`‘¿,àÝ’/ GÉçpË„2d³h@2Tl`ú&@† pBÈPQXáÿ@ LÂh‚«áQFy¸eåþðVEŒ@ Ì„È]NLZ.:N¹ë¥AÔ‡¯ÐDêûNá+¸tfYðdT ÂW  #ð(JÓƒ@1®DH¦)@ãèC ‚¯ qôßEQLÊ…œé¥Ó‡ª@ }D•Òˆ7€'@ÂÜkýÕ36Ó™áq¨õ®¶fÙêSt  €ÝCkgæÿñ£ãÿ‡ý‡øe±hl‰ÿÀ¬Å¨‰G[þlÞw#Z­ükâÑ‘èw#´Vþ5ñèÈŸÿÝÈŸ^+ÿšxtä/ønäϨ•M<:òÿ/ñ¿jý¿ÿàÑ‘ÿ÷ãÿ×â¿ÕÈ£-Î÷ãÿ×ú5òèÈÿûñÿký¿ytäÿýøÿµþ_<:òÿ~üÿZÿ¯Fùÿçø¿L&Z»þWƒžüuoƈ‘ á \ðæ¾¨B°¿ª ¸ìý? :CµåOG™4FíþŸšx¾/ü_ ^ÇFkñkñkñkñkñkñkñkñkñkñkñkñkñkñkñkñkñÿ‡ñÕk@¦áÿb`J‰‚÷þŸàÿ¢›¥2׿³T`3 ÄU‡4¾Wÿ·jÅÅŸå¨@àb3\k&–šcˆ/Jüm ,΂6‡œTã¡ & ‘æÀfrËb™­ šEUÀNt” *a‚`¡ÆÆckbi³òm‹3"Tcå0”®†T  C4Pì´Xq9¡ß 1Cѯ•}å 0Tt`]hÞ™C´™4e+…‚ÿ›¸Ÿe±àÍÍ•Õ0‰C¢ •ö‚¢« áÕº£²ºIµåo:àX5j\`W[,ÆÑ°X0¤¶R0¥I¦±,mªzQ•Ô$¸B®a<ýxƒ¢…„&¨HÚ³’VO¥M†…U1m⨵ 4 Ñ™,âƒK|T§ªÀ"¸ª8”G%¢xFô¤2™›ª$L T>â6vqK=h¿JƒòaT‡¦ñ».œ‡„`Qª;Ò«”OQåqòTø@Š* ˆÀL¹» L©ÊEé’(èÃLLσ!•lÓ ù0Æ · ánߪ ×Ìo ×ž!Š!l”øˆ±ƒ‹°*+eRñ x(WU¼–øàê·*ã_%27Y¯¿•aUt`eç­Ïb t6aqa¢Aá(q†Ùl@e’`ت<$©©†‘ƒjF5ö%˜Ö±±*ZÝŠfnªt0M,T. íü…±*V—EÐP «+’„ל±UÔAÙVlM Cê~ SVÉØV½(#=‘Îå2¶ -+ddu@ä+jÔÿŠÀþ«žrôŸÉ¦1tÏÿ2XÌZý¯‰çÛàÿov^ü7­yVqÏø%±©7Í\ç™9u{·Ífjw¯•? ]±mÐÏÇÞp–Ù¼(ôd²cg Û×YlÆëôd™u7ç‚Ò-ÛœW6Ü9nû®aŽÛì¬_ØÙ»6òµÙ¼þJÊÝ›×½\ßõœ?1½ñê7Ù.¼yôÁB8oióSêÛΦÜxØoÑ€=¡·‡Þ/.=sã¦<‹uè蚗ÊŸ¹Åh|[–siÉ¥íXðìï›Sût}ó¹xßΟ—…lõ¹ø4Ó7!ã‚;¯àÆÚGŽ·l¢šÏjðctôµu£]:EøeoY×jp¤ó‹¹û²Äw7<ù°2õ÷î¡•—,º§Ñˆ«§flµ8.!õÚ EQ~h=§ý†¦™Ø‹/tÙnç:°k'ö¬@‹÷œõCÛ‡ùB;7-=jâÈ™ ›\|,0¡é6ÏهhÊéGo±3 Wö_ðËöÔüui?…óûÚSן›5Óý©yþÎ÷W[§uO½õ«u×6|JC.Ç6s zü–˜Ž›¹¹Ä^ÉnÉKûõ¡Móíž[={÷Ä1»Ž1íøÏl¼Ï~¢šqþ¤Ž uà~¹HµkÖÀ5”‘}Ãg¾Ïçânùf­f½iüÚzÞÝæs==;Oá¼£§KÝÁ¯yøù•;›7ÏXõpѾk·æ÷ƒ„ôM3{ÞÅãÿØ»¸(޶[ ˆ&ŠÆØW#ŒänûE òb{Ããî€Óó0 Á–£DIìÆ’Ø[Ä/‰åµ`‰F‰Æš¢F±¢Æ|Ø1Qß™Ù+»{Ô;îroÞ_È9³»3ÏÌ3óÌ̳;ÿøE¾½TC9+}G‡Úyõ§Æ}5ôΠ±oj‚t¿„S݈¦M;‡„­ݨѭ™£"û ›x3µß²ãíÆÅü´îqóõ9?|¨eöÔìÕ¢þÂ’Þ¾¾Íö-œ½`küÆ›/5©s¦õþu'—`­»í {%îçUSv§bÑ—ø´oÚáÜüQÑÿ–¦ô{äÇ×F¾²0¦od·3˺ÄmScÏg; ïNíÓ²î™ng¾ÊÝðù¹ mOîü’ÉŠîôxĮ̂­^ßžö[Î^-ÎÖEã„<&tÉûƒö6©Ù_.»Ô±8,¤^hî#ºó¤g{gÏÚV]þ¨ËŽogÏMˆÂê÷04Ÿšwæ_æ·Éz°¤CÖÍUq9õ3‡únÏåZÃß=óAш۟øŸQs|âÑ€ß:.ÈW¿ö|ʳÝÁk»6½{oGðÚÎ~M®-ôÙvsÑ,åWK°È'‚?òk8îÝü‡eÄò°ˆËmoÜkµN›8û‡éçãÒ4ãµsk¢Þ;õçƒã‹f¥÷é~¼>Xœ=fẇÏbWD\÷k­V»èšµêø»vꋵ۪·ë¦Ù“_œÑ±î7DƒêG×9仫Tº%IW‚®Àü½uÕÐ|º+7@ItÌý?е;#ðD •eòTè.'Y ”Ѕɽ&+[˜²¾l¨ W½ Ž>XA~"¶¼±}[ná|*{¢ót¢–&K#Jà.¹“(*‹(P0v ¥}A°öä ¤¡BID ¸œ—@v`OР íÉÈ’J(ƒ¡ìåcYûür^š=yUyBší?=9ûå¾]ì³ûÓà ìSDä „\©¨ Ï„hýï9øŸŒ„ÿäŽ Ô¿Òsð?%üG·‘þ=ÿSÂtKéßsð?%üG·‘þ=ÿSÂÿvKéÿïÇÿ$åHÿ +éßÁNÿbÿ<¤þu%þ'EP8-Ô?ôÿ3’ÿßÁ³ð?š†ƒþ§„ÿ)áJøŸþ§„ÿ)áJøŸþ§„ÿ)áJøŸþ§„ÿ)áJøŸþç?ÿÓæªþ'CsEüáò!úàY@ 7†¢”-Ê8„êlQeâ€B¸¥@¡Ë¹*€@m§¸à½žˆJ³ð°°õƒsQs;¢(c;Ç ¢Žœ¾«’â=§#œÿPØ™­ýžQ $³à—æÀ@Á¯˜HŒ Vr÷26˜‚µ× "¹"XÛIW âv)t–P€.M ¯ÓxŽ¥1¶ „y„p_àWžü£áiÖzR—ë ¼óÍ@"¦tl—åï@£4Ìvò›Á¼“ß0Æ?ù 1ñœ;f^…9:\YJpÌÜ£ÑF þTÚ"¢ !zå"è^8bå”5.°<4R\ – 怄x+Çh2©€k Bº€¦†C•¶Yš–CL!øƒÆ)˜¢xA@)4¹ bS¸z +y‡íiVÉG(`Id©C¸ò™;„€ -È™ IÔ·Fû’Ë4Ú8þ«m» O¹ZX ÑHŠ×Z0ƶh†© Ép]aeÁŸÂ©Žg¬ 7ÖlÎ.ͪÔT!\ê*9Üoç°½IØN®,† °,‹H56Lv$3˜Åæ_qd€&‹Ð;5¬zµj™†&ì>H1i܈Zl©‹Þ’‹Zñ-¹Z†—0ê˜f•W &˜’pVQò¾ ´lUl»l¨3΂; 8Ã­Õ­Æ 33ü#`2œã!¢=ëZÌ~® «iálEº (‰3˜ýæï~ØbB)˜–pˆ‡C÷CA$ ëŽ Î 4Ú,±Z1¶í|™OB¸ B„Ð4 ×!.]GÑŒé‰å/u ¬½3ˆÓŽdî¦1‹€¡!žŸ3 ©Œ!.£b5ªT•;-²œÏ¾ àãššëgµrç T/ª,KÌ–Ì„›¶¨s‹©Ò@¿þVôc8Ì­+Øe%$7@ೇ æZK,‡Z ¥œ‡È…®N™áÊgîú1É­ÛàYEHÒãðP&dRÉÊU¼ªÂËõo— vi®¡Å& ¹Šh!Wº¹j¤’E©Ú⾤5’ÅTn!æôz‹ª*Œe´¿”Û†2áè<舡ÚåI\V»Š4fƒ¬DWâHr0ÿ OÚUµÞBó“ ;ô%´´ÀpÕ÷ð®^6A×¹ui£¤mmÃðÐ\8U>ûJkÁiÐqn•`ÑDlø*€ï˜DnEKLpî.®7¹vV¤èRú3nƒE†®RÜ™‰ÑÁü+<7VÕ[dé «ªhèú´áâý .èHí$˜4%áÔ~űü+l8páÀQ»Â,ËræÑ¾3Ïüñ´§˜ ®š–qLr‹DË8†ß»á¶&p~Ô!³QÅ9Lö¤¥±vfâ‡Üz6òþ¹Øûï€Á(ùKåÊ Öf0È` •hsȃ»øýWm°0JÚ,Ž$rÆ 8”ÅWUæÁ Áö2Gƒ ‘¦áw§l+|¥êÚ½°›3ùœòú9–åuá´‹ê‚ÄmKšE¡‡›%h„…Л¤¤‘7 ~CÌmª\íM‚ï„TÞf: ÊàsYþLJ{C%ñ\ÉÿÁrЭ(ñ0„„ÿ㎠‘+”JU\¼VM)5j £QhhBËÆÇ©X­–Œw€íA ÿM¡’ãßü ‹‹ðßÀf’’ð¿Üª†ÿcÃÀƶ¬ÏÎÇ$_6û·s«MªYÍtz³±ë+úæ]^½ÓöÌ”K^Ξ½=³èüâᙪôîs~jÝ!ú¾*õ:ô׿Ûë÷ÝÙw¶ÓùqM7½ûWzÇãÅãîÚ¶ººOËŽ}ãé©}G‚ ï;t¡°Õxãøáß Û¤ô{U7f kq •ìêäZ-æ}ýEÝi+‚¯\Ug=>ÖùVîÕçÉ·ßèñ꧃Îå]X] ?wóõøñÝ#vܺÚêô¶Ç]{￳mLÁÍ+­æí®×eX=ã‹G»ni’ÝlùE‡'ÜÈÎxïü'dnÄöÄG3ï~Ÿ4$òðäîÇô×óæ´8¬<ºøÊÌÔ³ãÃÝß°#eÀ›3CWô 8­õYÙîÀ[ùß¿àݸ¶îMM:$^:ñó/Û›æ×²þÅ ‡NY=-ùó¤8Ÿ?ÚûdbËçu+*oIúôÑ|:pBbξNGëóõÎlüç}µ\ïJãØ.ÓçÏôÝš1%þyÛõ=»ôhrsaï5;Vv!ž´tu뻉ëýŠæ.Q[t,ý±¡ÕägQºÇ‡Ï÷ÌnûÙÙƒ²â;aþ›¿+TíÉõÚ¹ %ê†!¸Óމ5nïZÜ'ï…ý‡çl¬þêûÙŽâ'¯oݰZmÅ„—>Ðe}&ÞÓ7uÔ¾üƉ_íí[T×'Ö¿VÝA_Ò|~Xw =y‹®u§°!}ó.7,Ì÷£Ú¾0± ~ÞorëÆ¾×ñF=ycaÛÜ%§›þ˜´loϸ'/&Ï_<饹›2æ;½˜™Ñ¬vÍËiç÷-–ÚeS¿e'þ¯VÚþ¦ÕÞÛD3eÔÐ/k ßó¡,ü—µ¾Íâ{'9_•´7ùòê¥s§®évŽ?wðé ÓOóÒ{5ê=ÎoqŸa‹^Q?¹´yÀëÌÚ¥‰Í×ÝpôD¯æÁ3"·ǃ¶~¼Z1·ÖÇ{ªWoÖ Eˆ1?lúgêOš`^¿æŸ+ôÓU÷šŒk°¾Ó•‰~³é5Ém®»°Ôt²Í¢õ7>š¶' ß÷ÔûQW¯Íµd+ñ¬ÁAßÕoÞý³¸`߃Nß×XutÜ#ÃȬ_¼îßïù4âÆ§}M—Æ5ZöÑdž^º4–ôõÚ¤A›ÒŽ˜{äJDð ÿ—öìµTûý¯C[ŒïÝ2îšÓ6oå݃Ó»Ìz¼m·ªu½“úù…|w©Vøn\} $Ú/¤æÚþmn†]è91°Út`û™º .ïzóA Tè–ý‰LË!÷ÛÖí»!rUþ/÷Ž˜Üx[âÄ…ÍÆyßò]óÇ‘AЍÑé ïô|rËàüß_Û´ü|BÔÉMïS93ZÞ_sô`h³ƒý†½T࿺Ïé¦1í¼æ{ï%…&O¾aÅ®WÏœšq`ZË)Ú¾Û;ˆgsÕKê¨õéõàå·¯ÞÓý´“}Å_‘¿í× jý“„øvÞsrÆæçI'Þúëéõì)^Oþxé×óŠ·NÜ1ãü"ìãçÑ“¯=Uu®Ï_û6.¾wûìSYˆïÎ ó ^OkYoºï¿wÉëLy°kÔÕò}–u6·ý¦ÏGMp÷öúw©çî¾uq|Nb,–+ûtYìĦG¾KÌ_G=ßoæç…)u¦O‹èþÉ–åõ Ïê~E7{U£F—æŽ =éÈ“o¼cæÅßš3áí•¡_ÇùûÜcD‘ãØB¯[˜?®jüêŸRü.ëܾÇñ_]«Æ™¯ï^Óå³ßFμ¿éôY¯†Å·êývçÂRY`pŠ&+Ac>v_5404Ÿ†© Œ·™9ÆÌƒSÿ8nŠAßÅ¢[L™\(ens’†Up¯ᯒ(SŒòOë8GC°8$‡G0Ë!‡©Àgê•¡Š)§†äœÜç¡t™Â”õ¡m¹ReJ^ˆ)ÍŽ¿²9{*ðj±\aÄFA$ Þ qþu¼¼&)ûuE¹¢ð–©%ù0˜ÇùPT©D>è’;‰|زˆ|„i¡`ì‰rXÆž(ž`¥•Hä]Õâ4kGäC(ä¸Ý}Jûü9e—_kŠÓH{ò!‚bìÊ ¹áÁRö÷±,/Ížˆ-‡¨IØÌÓ£ŽDì›v~JáÛÉ“žاˆH€H°wvÒu)Úÿ{ÿ„ÿî– Ô¿Jî)úgpIÿî"ý㣉ÿÉ-A¤Âcô/ñ?¹%ˆôOzŒþ%þ'·‘þ)Ñ¿Äÿä– Ò?í1ú—ø?ÝDúgHÚªR ¶*{é(P¬J\, QÙžuW d¥hÈ$ËS„P‹œ"h"Ð@­½4hp­Xª ú¡L'̈©+!? ŒÎ.?PO ?” Q›ŒªTk Ø èH Í((“ùíËd€(Fq™ ¨¯QX&¨ƒQP ¤0¦è!‹·%<•&Ô9";Lˆ’&.“uH”É‚23„ùʰ<ˆa8F›ŠKÀ`È`8¦NT™TjxZkåÀÈ€ùàM…·qº0À<៕“F,4Ó6e¹=ä îÔ¦c²îáï jfD7•i!¹Ç¬T½–g² ±J¯·&XM›ØŠ!ËffRp$ƒ–£‡Ö´p?1ÍPb² ®½ìR5:U‚Ñ Ò§ÓÆQï9(>ÚŽsÞ›O[Ï'´äËã¯/õ>‘}©7Y2ÿ ˆî­ÔÞX¦—¦ÃFb(–âí%ãþÁ'³Éèø %´~`]QšùqK€Lé^^¹———m䱑%‰ðÔ£ú Äü‡ú`HÇ:˜'¦“ÂEý;˜ÓGŠÒ‡p`A*/D¨.¨®…zJd¥°Þ^¶‘j+Ë¢MIõ.ìp‚t½*N«³g^C&uëÕT£eÊM­ƒç"ÍWÀ–” êæ‡q]Q¥‰ÁDÐzè¯5á%^”»ß–`iI.]ni`/” §îT8Ì ŽG9f²¶/j//¾Uð¶<ŽÚÐÚ„Y–nb&‹‡5HWƒÕ#°þæßôxb/þdDQ¶zðOk‘Ià¨@3’ÔW8vÉb9GÔ-ÇaRüΫßd45’´h|qR¶“l"ÿa¼Õž‹J\ ̬|-œdês¦.ç좊 ëqyÑLúCT9†‘ÅXNJ9>hoœ®æ³UIo p6Ò€«ÖfLÄ­/Ø,0$)XIò°P7ºnݯ’Úâ\gŠ´€,ôâ¬@ë—( —Mú‡·úV1»Ü5»°WÀeSLQxµ — 6€›#ðif W]F:ŦñF*SÕÍŽ˜¶ü“\޳œ2éX.mÀ_f¸´IÒ&Ï&'IÝ]—ô¤¢8·Ò£óZïPeeyØ¢õbTŸÁñŠŽ+8 0€ ÿ5hxÒLË ]ÃÐfÓΓì-y¤åv™Ò´Ü ‹É ”³Ñª®Y$þ Â U5£³YKr††chÀÃIY5uP)).Á $]Û¶IŽúÁƒXJ©Kɳ’B’H–é·"9ÀÒ"–¤ ‹O‚´¾dw¹ë”ÞeþIÏg"Ëø… [^8×õbfWÆä@´hB0<¾ñäÓ¨CÃd«.£v†Ä¤\Ȧ÷¢ŒJ€¨³YÓ¬%‡Ù   fQ²u¥ÎµCŠæXè\¾ÉÆ%…¼ÑåœMû(€TS@áúE†ê "öšH‚µOlU-½´.¸¬G-6BR Ù÷P¼ìA ¸É0™!VJÏÉ6vÿÀ’R@½ñ„±ÒÏüÁa¢%DòÕKžsÉüÊ)k÷Þ3¡ã9áÃW=•÷Àìàôî·^óÊûM>\‘Ûöøc?Ý.~tóÀ1oï¿éœ[Λ}ºþù;ªøËÖIÓ>˜ttï÷+ŸMüíÆnž¶ce«y%}å5ç}ÿâÃO¯>ûÇÏåŸæíý¤£ôëIG§-»üàÙ%ùÏXšSþË‘{š¾Ê?´ëÂæo]“Õ®aÓöü¥¯zYþk/=´ó‡å9[¿ß1éuéšë>O¾eÚ¿vªNêwtÿ¤oÎ+š¿ºyÑGÑ[W~ð­µw-9¼ûĉÿzþëý+7þóÝ•³wO/¾}³m¯‹+Š“k¾Š|3¢&2ó½×´½CªrwÍþѵ¾º¿Ëß^¯êÓ÷ó=|ÍÓbÎ?J•½Wþôã&AiÿÈŽÉŸ9qBàÚÐ=⤃ÙèÐ{þt†§ÃC—[¼xõÌ#¾°é¤NcÂÜsÅÌw—?>{í¾Y­{ ÿÓ¦óû¶fÔðù#jÐö@×`hùw?.î1ôå“^4úüo^SþÇ™«¯ïP1å´gÞ¸`ÏÃ-'}ýÔÆ ûîZ»¯ÓœE3—õ³dѽEë›VÙóȘ‘«³o÷êM?ÍUN®øê‹›šl{vÄœ¼còÓ²&KW•]ôäSg®Z=do§û¦¬9¾ÃÄ×.xå‚{»íl×öšÍҤܽsw­Ì{ù…§‡VDž Œn!µš˜ýåx¥CÍ í]ÞeÛ&©æÑj¦,˜zŠÐú2½iöÊÝ\×vòm3–LØ™7òKϪ~m}ÞIçÏ|yîëÏl¼b{öÖ^_œÓê`nèìm=ZÌß;àØâÉw]}èÌŠœnBS}Ýæã ß»äLË×þðï´»ð×é­o˜}¶÷®ÜNk³ŽÝq`ê„aí\}ÛãO©ùç¯Ršt8gÀžm³–oy®ëÝÜ–N­Îùß“Ö̺ø„KúÜø`ËgnŸ3æÛ/åU\×=¹±Ï m;Õ”ÏɽwоwŸk]Ñ·›°±Oñ®ËYcÏÚÙºkÁ©; ›mzéê3×ÿºrEû[¾ài÷Oz,ðé«oÝóÔþ›«Ç„ Þ^ÛâÑM;l¿²¬ÿ+‡´¯X¿¶ôÁQÜÿ|S~cHëçÛÿ:lsŸi-öé´ý™¡‹ó–vë~¬ÏyG.˜»óÖ#Ík*fuŸXsýÝÛZLÿ(pÁ3ᎣÂèÔî{vùZ¿qkϾó^ôÉÕ÷ïù8wYѹ턇6Ž¿åŒ1o¯[ЦiùÀ6—¶|ï…ן¸ïÉã.]Þç‘¿,Ó6÷.]Féä&åó¶õ>/ò\“ zÛ­`I´YE΂WÕ´×¾übÇ+×o9´ýµÙ÷Ï}ô“—ù¼Õgú§­Xs« ÷×ã˾\ù©ð÷HËnþæÎR´ïÅ‘g<ºëÃÀÑÛö®ûúÐÈ¢Å[f^{GûvÝ#{ ízò¾û_~xbåhõãî9‹DþýÍH^´rÁÔ⎗å¾@Çæ ³ŸoÕ·uÏ÷¿mzBç%/7/m?ø¤Ÿ½uáÖYŸLðØSy-;ÏúÛ…/^õEë ú¶¼¨÷¼™}׵ɿᡩ—;|åÉm^¿}üyëoß!ηhêÀßåŸlõéÜ…ÙË>}[‹CÓ¿ØýÈ »¯î|äíÁíÕÚñÃ6œ ínrtÕuÝŸ•¿O]~õ¨àÝ׿t_÷Ü¥‹îíÔÜ|NMÇœÀ¨*ó±3førÈÜ[äÿ½÷õk¦<6ç˜6x^“yß-ðt›¦O=Wzõ7xãøM!¾ÝµON½ê¦ƒ]=LzgÜ?. ŒÜtú–»*NyñöS}ëNìÒž»æ­baE“øwÚæ7ÆØÙêòk¹Ã=Êßûvä›_¬Úöâ K.~sÈgŸÞE8gþ]û^ùó—ï(\Õù«Q Wþ3§çcý÷wçö¬{v>wö‘£¥£W=ùÝÑϮؚ7wwïm˼½ha§ênm†ç^ÛîÀiïÞð~›O×_¤^Zú°oë¿úaE^ó‡OëT]Ôbà‘·}²g{'Ÿ¶«g›Ñ'wlëÓþ]Üâ—ÜyýVÿ´ãÖ’;^º`ß«ÿnº¡páíxucècƒß]1t9^`Jæ5ÉÖï„êÖFþa¡`Ià¢p5G06Œóô>ÿpržãñSF¤då&4Cg’W.Šæûñ4ÂùG†ª£øwª£ƒFŸ"ã'†I$ç ¿òòp4’¯“ ˆ§_ˆ~JôÿÅø'€þÈÉæ¯Œ*ˆV8RŽT"Âù/) F¸|-¥€ô-(•ù)rÖ?ˆJÃãÍ,Ę¢Ô˜Ö²*æó_–7ŒC99ƃz̃¤~>#öÇdÁ绬,á2ãN¤‰¿þݨá¹uŸÁóùGÀÐtFd‰–¬òIÖù’9EãdAåH¿Ö]|½‡ê}”èEdE„QdTß‹$>ñPï[‰ÞBP鯠ë{DѾz_Ĭþá*OÙáÈHãpͧ9ïjöÍ‹‘ˆ9A«×ì’á²Ï´–Ò`UQ¨2kÀˆ³G0üXTuÇ@4nð®ÑçRÇSÀ«åÉB‚ÅæÀìÑ@€¦· !%è ‰žo…C<¤§Ò{6 ðzH#F¹À› À Ó–Òç%uF_ˆ‚ü5œí&yÀc—ýA 1ú×6ÄDåŠ** ÿÕ¬‘yÊöN ÖñR’´A´ÉÃ’€öÔ—`˜Š"ábmòÒÀæ äŽ|&¾'ùÉÉûŒ¥"W´| 8”ŒüH‡ƒ­pñ¸rº}B!Ñ€sI$ áZˆ Ñ ­@h‰**ÑŽ'{ï$D¢h¢¨ÑþN3Š©Ÿ…3 (¬ø‹‰§CÀn2OB–µD±ÉpÓy0C ýÁB9^˜¿ñ ­3õ;&~™÷Ù”®%byÀ6Dm Âöh,%áõ3±#dKIE )DQl"Öˆ2$lCÀÖgÒ ¥×‚€f•ë^­èDn ‰ÔÕ²$D6éÊpIEq p‘Õâ·Ú8í–‹I Æ>§8òÞ̯€µ:ÖŠeáAR€¶:ˆ*–Ý‹0ƒÉ´m¥ŽL/€'D‚K¶!ÉÛ{w“yÒ†ƒ)Q<Øtr­7xP©ÃÀ0õFãùDh¬)Ÿ&­)ŸÖÔrR8’®|"©(.¡…!‘àa½Z#½&F:Õᙣ›Ì²¼­+têT]¡ëV÷¤×@df¯k¢×<®7\æŸ<© »UÂ~^Ÿa•êE!èþ Šwtz\8TÖ¸;5h…,o„B’–7B!Õ´¶N 6éj§F*ŠKhCàÞN  pó¦9Æ?M‰‘ày‡~?ÅÂQ×± `Û‰ÂÓ˜ k"‘7ø(À“©ßT`|¬–DžŒ‚¿žg¢·@´ib‘o丟­ãf°­pA(^ˆšÜdž´‰áØ¢!I$o p­åE£(Á:5Jãù/$v° èlË‘$£šáá¤6×í¿HEq 7m DÛŽ‰>Ig¸…Ñ&®ÌÏ[8À|°Iœ Ù" ¡‰tyGš4ÍÔôDÇôn¯,É]­î-?iËß©£Áô‚ ÈËVÏ€?XoOÖ8ŠèØØ;5³ûRHÒò ¤¦ÌÖ äm³gJŠKhBd'b]"O[8MV„ƒÚ1 F…gŽ)EuXÔŒ V…`X6Á*Ýÿ…è~PI'‚ÄDc°"Âá& 9AL4"'ˆÐÖA§ªÄ*Þ´w‚ •!‹€Œ¡‘^mSµm»=ßÙÇg¹‹Ì“¶:‡cƒ’ìr@/ävAP+J¤‡Ï­á  ú?öž®‰£{oÛT[ŃU±…*&»›Í&T¬¨T-6€Š€’"!ÊQªV­x} õÖŠ¶Þ–"þ½AÅ O´Öª¨Ÿ'¨­õó¾Š×f6ä”ðõÿû»?5îìÌ›7óvÞ¾yó40Ê$—ß4—ªl'“=µFMtgÇÔãmÙê,¸PmÈöyPµDGmÄXnb˜mGpä•‚‹ôÌ&ÌŽLà=û‹³£kÛ¦”²eó©×Ó:bSZ-ø•Up3UùÌ"îȶ„æÊÁÛt¶¯[MAóÀÇŒ3§¤Aï@`íJïʦ/ ³±!ÓZ+²‰^IM8D͈$o÷~­‚¢ƒgv@ ‘DÄcÏB6n"rèÃjC‘ƒdE ‚'29è¢8 b(ñ˜Ù–RHSÄDæÚMÑ•Fzè`¢†ÀÑ!ÒF5€WZÚ ÍtäòÀ‹`%RÀJÞjVʲ’ºSq ÑT4F›hhLd¢p`6ŽÈ+£Þp´+›ª Úa$5/^Ø`#Õ’*µ³ôQátÀWL ’ÀH4­Fî ÂDð ó4 ÂÚ]ÿÿÇTˆs7$“'…&ò6n¡ M Y”©K2ô áŽID Ðˆ0L%i²s„v|Уê«Ihzƒ< k×Ij#Ic VÖݸœÑˆÙ„F Т¡SÛ«®\MT»gˆpƒ#2Jª ¾Ð„‘0*†c»§ª¯ =Ñhš(ûÆP0äB‰ñÂÚþJј©"ÆL¿÷àÎ!9½Àí’@]›SF›cxÂÅ Ö§vdc#³!ua²%C±>×!qŒmß’¥±Êù¿âeUNËf;ÿ¸ølþ7°¿& ˜ÿÀ8ý.ÿW]\B<š šÀq‚OHq—H%ÑÒ( %ãɦNRð½»þ{W•ׂ,ºª}Ø^ÿ8ø [çÿÃñwë¿.®îCýú{â½HN÷Cw2~äPƤуÙ8ù0‹¼˜Û_®€Y¯¸ýá»â¾2¥Fùæ“–¢ê¸£å®“9üt3rUèË1£6ªß tcÜ¥o1Þæ­ùZÇÄ7]’åº{¸ÿؓ۳å[JÝ[þxØå›à])?Z¶M’?vºë‹´ Ï÷ŸLÞþByïþßw¯~7ú#eG·‰ %#ž<úûÕµ†)ãsöÏv}ùòå­ÛákÊš7xž;zÛGû]U·¿uòRÞžì%œë£n§ìüáø¼²[xø®œ¬+ê'e/Ž=²½ìÉÂ_:ÿKE¤*O=Z'ÀÊž©Þª]?ª¿JŸ0}Õ:»ù½‚D’íÿ½,eÏùÝÉ)%^~Ø«å4ìp7û“M¾n.á…§ö6:‚ùÄMÿªa“Sέ^×Çû†nší\˜®{xçA€÷²Å_F÷¯É¯2àn“‹#¯M ™èIÒ*FËÿ“üí¸”6ëO>âfî[sY3®÷¡&}–<šïÛ¿‚ïúéÊFáþ´Ù¾ßvÛÿB|FžÞÜó«ãÏ6Ä>æ}ò¸³÷ºžç“¾ô©ï²˜s)7×uTô„cþ³ƒ®|Tì~roZÚ_¯64H}ùyi—m¢$»¸D»y¶ ¤ ¼Çq[{üÖùMéúëõN¬9²nÓõç+š­wºi«ôõÚn—Þ¬½ºW"-îT²„š3©ؿ•ü½.»½^ªÝÜ(~Ô0ÁEœŸš+ŒZ=Ý£½ï¯Ýöv™ÙíåÚðzSRF¬÷]aœÿDräà«úfÔwÚ˜[>d•ö™×´ÝOn{œ4ß̹혢ݛ{Óñí]ÝÅÎìòÞÈÉé^.’ÃûîŦÜIü ·èáâ-+3Té>^÷,:=²xöœƒØ¿Q™±D³­g£2©‰Þ=[1ÏDËÿn’³ôUri景ä[ŽÇò7·¥æeÍ-,åå¥mý´‰GgÃi‡VíÎÖen±ôÕ—Ù%&F”^m9·—(¡,‡l¹ôLQˈed¡¦Õb~‘ìÔBŸ#ûÆmèö熺¾Iø0؉ïÔ¶•¯ò`ì¹V.kñv\ls.ÅwëàÌ—üË(z»e']—ukÊ YÎDOOôùØÙÿD¿9QõOä´½p¶ñض g]]ç¿/þ³ý•{£Ò‡¥;É]<êΟç)ÝI}½oë–·Ýñ=rW'îJºÐ Ò3wÔ|¯·—‰8×oμq•‡sæoîD”ýòšœT2¥ßìÕWŽöº\¼jûüÌØkas½GP:¤>/túöÓí¹SïãM\†^þágESÎÉö6[8£ÉÑ’þ×±¬"ìÈqNÔŸ­§•Ì9ÚZ<5yêÑqœ.=Jò¢2yƒßäµhéãDÏvY60ëVr¾$ƒ˜xrQÒWcœ?ËŽ§ß ‡Îš¹¾Q÷£ýãöÜÙ0³Þõo®7þô|XqŒò\»iAôî®I—îÎ)E;C}à“ú™¬÷B_žÚæ›úy‹¯1ËwŽl•š½[Õã¢ç6ÿ驇šø®èXò´à Þ>EÆÌ4FåyöÙÕ¸‹a›vIö.ŸæzÒu3ÏÍéâêsžâÛÒéžgâ¦=]vcÀnÅÁ§¿\/»0·Ý‹ŸOdÍï|ÊxD\\q ð‹é®+öÉ雸¬ôáÂQ7Ÿ]^w¾™¿ÝmòAÑÏÓ·.Y\ÔkП—ïo;Áíy-ˆ;1îšt,\íüÅÔäaY7C»¬JÙÑsU\ŒtØ«&n¹qÝ«óû¨ïñ1ƒšß ¿íèã³ÐS n)s´Ý•ß rþ=B‡^]ò|CiòüD‚üÇÄ·ï-ÿøUV£ÖÏÊú´Ëž°º8³± ˜<Á/qVÕ»I>˜sCpW×T}t^ys—¼ñPj?Çu­øùÒ¾~ßå3µ_>cÁ£GÄœ;6¼è§1“›'¦†®×Ì:tËåî¤%7¶HÃ|`hB04#Œ;H.Ó`a¶û &¤CÀMšâæS ªH´0êd9Ò¢+Úbê ³Äá‚á}úè+Š,*¢ÉâèmHQxhè…ò|à`¶Ë-HõY¾¸> ]ˆ8 2iS8Ü XRDo&ЬD ˜ ÊTˆJù1›W€o•Êfd°‹n{r GX„í™±ÉÝ."„Í©VžàÝ…^xi{j*kÚ.N¤ÍÉáóPÈOÖ¬‡²‰Se×ÚÅÈ’ßXÌ’™€ða~ Jh£*Ê´‹e{šaŒ5âÙDªÒáòì¢$°=O|dÊφ–¢í½Ù•Ìe+K–e>Qz#¨«¬À&V•ûc'¡m–D «e6€†mœ*yÄ.B¶Ù5ŸB'­ìa¹mÒU*p=tÛ,[¶“õ¶Í—*ïYm'ÛLz¡P$:®ÂiÒ&N•õ²´‹‘mî ÄbÛØ!Yeºìâc‡sÓ͆óÙÆ§rž!v±1áÚb .b£C˜°O±#4j²<ûI4 üŒùþرÁ2cϰ7nldK™NʨÝýƒ†bbU-àò-&ì…S`¾€äÐQÆÈPî~^çñø@.â“4χ¨d=BMUjw™J‹eÔènCô"°p÷!àALmDH/ü`!Á¾€«ð¨pÐÔG§-ÃÝ‘Ú3Ü,Qk<`¢v­‚qàa˜Å$5 ³û 8†Ó& (’¢1}AOûDY^¾ÑVe vnYãÏX”ñxðãfYgUð„Vý …ëz|ë¶´¶*‘¤eÉ£­ÆABïvË2|Ö,Ë iµe™Àz®€$l]&¢¬Ç†ó¬àñ ¾ÕxÁß >Å·¦‘@h]OHXÃR&eZý)#rì‚i’A°Éï Ú´ÀìîÑ*ŒÝ¹pü°0÷yõ¿Ëk´ eâ‡gvF¦÷ŒÊô°.‰à u²D­E/숷ŸW¾»jö²8ÿÁ¹µÐ|shŠªøü—‡Î)><ÿÅ ZÀ¯‡ÕÉáãÿóó úÿúSïè_—ýÉ ýïè_—ýùÿúÓïè_—ý© ýiÞ;ú×ÅeAÁ?†þø;ú×ÅeAú¿HdÿEñi–þïäÿ:¹¬è/UH4š/™qAòxª—|Yí›{f2ZªR(FŽQKb{1 •šHàŠíÿH¨°0§?Á'Éwö¿uruï24ÈÓG¦Šb<‰^†QÇK”²(…¡!ŒVbÖF+±ÆŽº•XvËHŒ-ÁØ%f¸òZSðR‹ § Œ @±FÎX¢@N³NÁ{È•›ÃhÊß #·‚Æ)7ƒ'=Ȥj•Dk(+Í^$@MeÖ§ÀQY÷)¨¨,û€ñªÌûcP™õ@,TðŠ5”€V:sš,tÖ}ÒeŸ4ƒÎ¬Oô™lLPryC ãpº^§ÅÀ#À0Ä0“ÆJÔ)´„fô«0ðýP2ZX-@c/þ–+eÑÐlÞ(X‹jŸ¦òê©6¨É$aÜþ~˜’%€ai©X‚*ýMÃäÑŒBÃÚ¤aÑ*µD¡0X›%CœMIujh…p€>Gà™\É@9i¨"7XÏh<Å*°z0“±™< ÐJriû©2*hk8\«ø‰g`”Bž¨clÔxkßæ+â«Ò©õ+*¯°óòçoíÚôa¤ F¢ÖªÐ·) ‹’³$á”îÊ­Ô¼°µJ ¾g’¼ÆÊSà©)‡+U©Ô2OH>ÏhI¼\‘Œ™Ñaþ‘èZ;µ$ôªZÃ4¼ÅBL#•(ö†hr”cƒ`Q zÕð^<@u4ª ÅûðåDZÿeïI ä&®äX¶ì÷¸6BÞÁ3 3Ýê»ÍØ€í1 ˜xð`ÀŒ½ƒº¥éÖX-µ%õL·›Á–ãaH–‡ÁvÂräA€`²`C‚c'Y„—%\ysìnYްCv•Ž–ª<¶ÐËê?[õ«ôÿ¯úõýÒñ%Trxò!ú$£Î" ÉYî±€A«J‚Tñ;€`C+¡ûÀ‚MÃ!Dqp–XaËS]7Ne›šl‚lEJ”ÇÀ‰ÔÂø-BT3_$æ…ÂÆË Ø‚2ŽjØÎx'Í,ž`5u½ÿèâj$=„6NdYnŠVqìÕ€åE.¯@œ¯¹ñ €‚¢¬Ò°ÃÁìuìcÈkˆ Ûiá¨+hY£ä¤k¿6Ù¦ ™×“5’•’ÙÄr‹ðç”4Lü*~gÕBHD£ˆ”4&6³-<ê,ˆÎh ¿~ ?¸¯gžÎ¢¼Žçtˆ¼£ ¿¡ºå€ØÄ“?Õ`¾ ¥Î]ˆèXÄ4QnL3Š'šøQ ¿¢Ë¨ÀŒ¬8Cx pY13Â$²­÷ƒ Õ-ÕkÂÒ&¯rãüp^†) qYA‚ÕeÍx*v­®XK µˆy0kð³0Æ!ec*rü(ÂH=RçM\å(íëk$ |Äà!c¨À¨Â Ç´°=Fj/—PÈéët2†öNXÓD©”T±H:=¨ä zï_5+¾±]Åÿ¡8Xl;$8´YFÁJU8 ÝaÌ·|±æ ªŽ0¬:ïjTØ¥NA’Ä’& “W‹a ÂjÕ9pjÅYrU9kŠŒYÅÒ›Q‚ùk8&TAU¤«œ¬á}?¢ÀÅðºdÚâÛø8äÔÌ"Á"àÔxC›ªù޲ËNm$ö#ÆWTb¼š°š Á¨”éHY†˜J@݈‡µÔ…§Lµ‚ÇX¹æsBp›Ñž4ü3 qg!é,¤íÂJÆ!„aÈ%˜Y&eV ¹Šqh-DôeÕbBnZviå,²9ï™')O¦²ÃËa÷Tw¤–››0•ëðŸt•Ómºë\úRd³OuùpI*l=¶šÌ†™}Åj¹TrõP’2îBÙ­*Iw! y@ânÖYÚ¶h·X¡lþ­ÀÇ|ÇÝØõ›AÑ ÞÖã§r›E6–G42EÖ%~ÀíÁþLUÆMe³7 k8˜„å!‹¬ÑZY¬4Ãtþ‹†ëàÀ`7Ùó—ðƒŸ0^Š^€.èˆ§ŠšŽ]• [gC¥@V­ T×’HnW‡a 2æGY·#~SœÙ½½³liÑìyóf#"ƒh±0œÙÇÄ“$NΗÁü$RQç\5Öf­™Û[ºÎÞÞ.X‘dÔ9düZ‚QÍæÍkÑŒhÙP ¡2ã"Е5Ý×€’ø_ýn°hY'OÈÍAŠŠŸ>ÒüŒyͶŸ©hY.=.ÔŠ¢ƒdÝÛþÍHٮڼ,Ò$›sÝÎcsËbM9+ñîæ¤žJiG`Á&ñ—VvßdŒ¤?7‹g¡M®êVi±§Ç¦]žê4ùÈ‹•§ºå•æ.fÈNP’=©(•¤Ú™†Úú8IRíÈlÝ"y5¡ÖìÃâ-óV׆­ç«$£ÁÚЦÛiTÏ‘×9 ‡U!geã&Ú½r~§#·d)×ùž¨Í)ÔSq»¿\:I¿Ò.×s5µíU².Õ ¨¥2WàxËš2?ÓþY©ÖhŒÿ«l"áèÂÅSï9òSGâ1GGÈu|a)¯6{êc0õÛÚbÙô)&1ÖÁÜ:yù«G]öz±ÉŒlÆÀáN@§µbêI¦w“sÆ.,K­'§Û&T&Ï•îü`^¤Ò$ßV,=¯ÌÆÃ|<ÖòWßK0:c'ØO‘¢ýÝ£‹V1á,íÎö³¶_!‡Û¬E{ujëqw…Ç}­Á£MŸ¢1r›Á¹TÈåb«…Âñ5(KL æ^«”²ñÜ0žQ“ªUlóqÌ1ê^ÝZ³š„›pÑp~v^ŸBìÆJ'ùHÌE~\…ýÅ0왪ÍØ®–L’ºWjàn~tÜÁ g!ué@ø”JŒ¦ÜJÌéªÔv,\ «ÏêÖÒjÞâ—ó6ššJ€„%NdÚ^† . OM*x$43æŒh¾R.¶_áš’ˆîýX³a÷n4,ØÌÞ'0‹tÊÍ¿ 6Ó…¹>³Ó”x*áI¼bg{œf²Gœ·þ\Šg2Î’ŸØî'Nµ¿–¦YÔƒ‚t‚Ôí~ÚKG܆¿ìÅ;Ü JE#ÓúÒU,Ù·=í±˜ôzB«xÎì¤ýÆ )Z1•Ùu+¡eÌYjÏ5dO2k3kÚ…”0ýR‘TÓX±Gâ¼–çè~*âê>.N¾6¶ëìÇ’Ô¥+CÆT®/ÐÞÇÆYÁôS Š~¬`Xä§Î a0ÇÒÉ%›~ˆéPѯ ë¢^%·T¦š¡Z J÷NŽT¸,jÃ#j¹•ì¬c©%ÝI“ ˆE~ظÖ–l]ÔÁÍÅ.w—’RÂ&ÇÝ<±ù@5Ñä/3á—Ò#i§ àâ´M ‘I´[E-Ó7õÆU ’ŽùDÛ*Vm&ÉŠS[‹ãŠí­»;­¤­ojÎÁœ/%>ªŸŸ gHíêÍÁW7 ò¦ÕaR®øº_[¤–h9 ¦’)›tEÒýü q­h&¢Ž·‰‹hÊ"÷ W$ÝG<÷¸Év”ÏNöÄÓSQhÜ[+EN”§]×;Ò”hrïo0›;­M&Ëì­&uªmÀ\Dš(-î¼6ÔjýØÝ‹ý™¯èôw/q6âØZÄ#dÛËÄÈO:¾'v/‹z” »\çëŒñü%Á´Þÿ™â·Ú¿ÿqäÿOD#Ñ(~ÿ'Ê&‚÷¼.šKÅy.*ÄNHó¹H<ec\:ͤ9!÷YËÀÞ…iÙÿ¿0‰ýÇcÑDÃûÑÀþ==“ÿÿ­sÏT^‰Ìܾë¼#^zìåë]šó_Ï|þ¨­·uÑЕ·þìן·ñó}á]¿›%öo}îѱ—õ¹3Åâ†ãº–wòÇ¿9qˆú§_~\8|Û1üηþɕڑW½7çàÞGwį8íįΠõ\_=èž“_;fíeÿzVvÁ#ÌréËk?Jl¸üí¥¯Ìšu`í±lçâÎS2·pòí³Ž¿=4øÌÜmWÞ»~á‹'þãȽëûÆø?žÙ¶öo¾öÌ~w ½°îö%èšc´ ß¹üØgì›ftõ¿¾é¥þWøFç¡ßçß>ïÏÝé'.;Œé?¥÷SîxòÙÁ«î^9xÆCßݶïsÇ~oÁ¾›2ãìöC~ûÌ7ç_ñ?£µœ½æ€ùÉ>nôÖï½}Ïá¿^ö·ã¿ÿâòÛß½iëÐŽÞ?íÎCîÞ­¼pÝ·>üÝAÿû³úÆ|ù–§ÜñÜÛ_îÛÿü#O:è‹Å/öîQó¶8rÔ•3þùƒïÙû“Á;ÞX1ïÆž¥=­ImýuÇŇ&ÿæÛW\ÿÙžÿã3_üðšeGä?xlàÖÃÏÞtü9‹ÎZ³~Î×_+÷нò»×nÙòúÎ}ø½ñ廿üþùý_߯ç‚ÈKYiöÎÕDzò?(ˆg÷$:_}$úÃÚû¿ü÷ý6¼rÒšûozñà]w¨C.êè|öÆBuã#¾T8|׌ã×<>ãÆ®µ¡»âW]zó}oyê®ûø›V2óœÍ#Ë__veìï¶ðê¡5ü÷ÃÚ®¯EŽþÍG§^;?ð•G;.ù—}žÿë¶p÷_S’n=lInÛÉ—Üòü“Û÷Ý|í~gßûÄöÑøoŸpgåìý~ºòž×É[>÷ÆÃÉüŇŸ6cî››o>ÿåE;/ÈÝÜñÛV':–Êqð'Ïßpúâﯟ÷ô?\¶qŸµïn|çÛ·è¯f/ü7eózù×­zë„ï\÷ÊÌw®þÕåËÕg¬;ì–WW>øôÍg<´|É{_H­¾äê¡uŸÜÜüáGGo-Í}çW/¼¿í¬UÇ,8åã¯ÝþŸ¿ð­ßüÕ† ßüiñ‚ÐÎ ›_ßzÒã‹–ÏŸ-l¼ïŒ3v¾_½.9qèŸ8àÉ­o™ý:~Šä׿#‘{$ùµ™ÐÚH~m¦µn‘üú/*CuF0 ›¾IÓ OúXÎôrTã\§Q| -jmŸz²{MŸ&5ucÖLg¾hŸfÍ̴Κ™ñ:k&k“5“e3U²ÉT#Ž6dªŒd³>6ËšÉ4žËâ¯Ç6ðÅš¥Û¥è±ñFl"Ñxn"íÀ5dŒÄ¯“·ÍyÀºÞ„ú6‰O|î’7WÈ?¹ã­®&(*g$›N¥ƒ+Ÿ¨ø?í›ü?± ÿ‹@é?ãýù<·þùˆ_ôäõ(ýû'ÿoÿÕ ôïŸü¿AþWO€Ò¿òÿù_=Jÿ¾Éÿäõ(ýû'ÿoÿÕ ôïŸü¿Ñ@ÿ^¥ÿÏ2ÿopýç3Jÿþ¹þìÿ=Jÿþ¹þìÿ=·þÿ\ÿ ôï Pú÷Ïõ¿àú'@éß?×ÿ‚ë?ž¥ß\ÿ ®ÿx”þýsý/¸þã ¸õÏqþÐ,®ÿx”ýûçúo O€²ÿ¬?ôß„ ôïPöïŸëÿþ=ÊþsþÐ?Øpý× ìß?÷ý{”ýóþÐ?~4п@Ù¿îÿú÷(ýûçþ_pýß ü¿àýƒÿôï Púñþƒû?ž€[ÿ#þ¹ÿØ¿'@éß?÷ÿû÷(ýûæþpÿ× ôïŸûÿÁý_O€Ò¿îÿ÷ÿ<·þ³þ¹ÿÜÿñ(û÷Ïýÿ@ÿž¥ÿÜÿ îÿx”ÿ÷Ïóþ=Jÿþ¹ÿÜÿñ(ÿïŸûÿþ=Êþýsÿ?¸þë PöïŸûÿþ=Jÿþ¹ÿ\ÿ÷(ÿïŸûÿþ=Jÿ¾¹ÿŸîÿxTþWÿ\ÿ öÿž¥ÿ\ÿ öž¥ÿ\ÿ âO€Ò¿öÿAüç Pú÷MüÄÞ¥ÿÄÿÁó?ž•ÿÍ?ñÿy”þýÿñŸ'@éß?ñÿy”þ}ÿñŸ7@éß?ñÿy”þýÿÏ{Ôûßþ‰ÿƒøÏ ôïŸø?ˆÿ<Jÿ¾‰ÿƒøÏ ôïŸø?ˆÿ<Jÿþ‰ÿƒøÏ ôïŸø?xÿË žÿôOüÄž¥ßÄÿAüç Pú÷OüÄž¥ÿÄÿAüç Púÿ,ãÿd?ö ?Ñðü¯'РYÖÄâððH¹(§s¥Òð°(礡´›ýÇ NúnÔ?‰Eã ·þ£Ðâ¿Èžíjsø®ÿŽc»O啬Ðí‰0 TÓuâAŸEEFÑž(ê< …b£(›ƒI´ìœ(‰$ºàÌEø¬N2Ž]h1§j€;GÔ%a: ¸¼ A˜l2ÛÏWÊ2/ÊùùJeŠ%ð¿TþR¨ì“ùJ±(ȺÆhܘ€Û yQPIÉ3á…Š¾PÌé˜9âñì] ™Å-&¬ z¹´˜ÓE™E5¦È©«˜pŸœS0×s…tEIÄ©*W%Ua˜þÁ%« Eà¤Ê €ÔuŒ“P©l3Œ›ƒ_.¡X$‰Â§öÙ%J\®¬ 6& ˜œ¨æÊÅI¨Øè8 yQPMÔldyŠ…IF¦6"]”øz“ /È ¼(Iœ…cAŒ>— Ûp_£,ë£Å`AŒ>—,ˆÑï¦ÝîoB„éo }íwÑ‹fÝ ¦Ix¹‹I ˜èE•í&@>/¨ENæ³’}bz˹NŒCo¹FéâÀ–£ÙÆ W?úιdƒXœSq"G xD\"$@¡Q„ ¸@‹¦‚‹)Ìðè¦bŠMè0b=è§è¢—|NU8ÝÆ€Ä²k"%A4ÅÅ3 t”FžIE¡y&¡¿Š›'ôAqqHŠ&qZÁÆÀYe·ÎAŠr#ψR¦y¦ eÏð¬ºéÁU­b˜ðu:‚*pˆxÄ¢\S¹X:L+'ë‡,è¸Y ¨€iâ¿QæGY'IózÁpW†‹²š×€6´*(¼¨!’À€?B5TRJäo‰#‚¤ ö9hDQ9I²¶k£½ñl&äʪ N•È~׉²€Ed&HÃð9bQк—*`=ÈÑ7G]¿ÎIb®Eå|EâÛTµ8÷tA‡šãZ×t/ÉJâê²Ð¦ESÞîêVD(e´ß ß’¹Uß”µ³²œ$pª®µieEC%ŒµÜ-4 ‘ƒ%´¤*9XÏÌãRaL\ËP„ çEå»±úºG¸¢(U‘KD ø+Kú$­%2UiÚ³8´' ÆŒÆb†ûå±AŒZÄ‘©ÆöD r ê0i F“ŸEB%‡'ÿ¢O2*à,Òœå ´ª$h@U‘Dlch%tXðà#£i#Ò"ƒ(.ŲD¬°å©Š®§²ÍNM6A¶"%ÊcàDjáðý¨u‰Ó ļ¸ UY%4` Ê8ªa;wâ4³x‚ÕP3”ÀdÇE^wsÅÜHœÈ²Ü­âثˋ\^‘9IsãAEY¥a‡ƒÙëØÇä S–^0Žk¸® e’“®Àç'mCæõdd¥d6±Ü"ü9% ¿Z‚PÕBHD£ˆ”4&6³-<ê,ˆÎh A|?¸¯gžÎ¢¼Žçt(OÂÒP(T·›xR@‚u¢¢ŽGÁ¥Î]ˆèXÄ4QnL3Š'šøQ ¿¢Ë¨ÀŒ`M‚ ¼ðಠbf„5Hd[)îª[ª%Ö„¥M^åÆøá¼ S@Ⲃ«Êšñ8TìZ]±– jr™°Y[Fà }ë@ÆTäøQ„‘0z¤Î1š¸ÊQ4Ú×ÖHøˆ5À!BÆPQ…Žia{Œ Õ_2.¡Ó+0Öéd í!œ°¦‰R)©b‘tzPÉAôÞ¿jþV4q€ªø «ƒm‡‡6Ë(@© ¤ ¶IR1zVGVw5ÊIŠ&`;w«S$±¤ øAX­:N­8K®*gM‘ƒ1«Xz3J0 Ç„*¨Št•“5¼ïgB@¸^—L[þp$È©9˜E‚EÀ-¨ÌFF˜:íÔFb?bœ!qUA%Æ« «™ÐŒ:A™Žeˆ©ÔxX A]xêÁT+èpŒ•‹E‹¬ÄG°íIÃ?£w’ÎBÚ.¬dB@†\ÒØ™eR†`µp‘«‡ÖØBD_VÝ(&ä¦e7`‘VÎ"›cQáñž‘ q’Âñd*;¼vOuGj¹¹ S¹ÿIW9ݦ»Î¥/E6ûT—™d¡ÂÖc«Él¨‘ÙW¬–K%W_%)ã.”MЪ’tÒ ‘$îf¥m‹vÛˆúÀæß |Œ’¹ë7ƒ¢A¼­g`»Ø,²±<"ÃââÁº$¸=ØŸ©Ê¸©lÖàfa “°Šb[£€>"x—«Ð Èžé®ÞY(EdSDEÅÅC’›ex ®ˆlqADPYž€ˆrñ'ODdQËæÂ½(›ïœS3Ý5! “îiž8?˜IM÷TU÷©óÕw–ªf µ°ùâô®qëÖM`FÊ‘÷៑Ž;-)©”ÓHÊ\€\dÜ Ôºª„ÿŽöøÏõá Ý€@ç‚ù•›ÓRêž›À²ä3÷`.š`²G = 4¢x•.Úq|sH•£ˆÐ¹…tZ¢,Ã!áÝÕ³¿‘D“%2äVé Z¬ðþÑsm=ÎâªVèÝQüšu…¯z¯›µPà,†ç*ÚnQ,¸3v¤Ìnį)NvK¼ÔfF*oŒ^gt:£Ï915/¯IB=Qg½™‰á?ôDæâDÅ,€}úŠ%Zÿ ¿¢cá¯dMrª¸?a0´x.U‹ŽÅ*:9ÑÔìRDWêý4`d3¹h¦(T ß5*jN‘Nv‹eˆ¯xWâÛ\",k¸*¦ ­ÙŽ€ Ó²r3I®$ĈØHdÑ¢ŒYZŠÔ"I*]ld-B/ ÃÄ›d𮩶äL§î­ æÈX×VTE²™dX OD%¸s0Q…ã4%E³èîœ9^Æ-ã]R¢Œ¸ØzHmhNQ\ª+=<ʬRK`õ‡/õ¼’RƒÔ+•¸4#Òwô b1ÜY*nOv‹ô*>ÍyÔ+U…êuUÔ«ì¬~¥*V\´«dáÅ®]–!*—­BI…ÊpÎ0àºeÛ®r¢@ …Êg(¦sœA/ Í”Nýð‰A†gÊÇÛ°‰£LuWÄt´t¤¬þX•O Vù4—Ûw“m€¢ tr8‹òÅ£9ÏÊc¤á*ú&Š)Ÿš¨ŠzçWùJž÷© T‰ÔÉ\ýT#ZýàoC¶%fâ¥j•3àZ‚U/lÃv‡¿Fï ,ª¾ÔËSý±ª—,gÔ\O"S˜$»Æ•KÀá< Ù/-úkÈ3O~ï(Tz~~N„%‚Ú*Ñ[\T©dA•S•‹ÈR$ N‡ÉG[„š7F$‰ LQxP×à¤À¢"8M²]ú¦I~ÉaùªŽUwŒ uG,䥫¶hÁRÑ5Zéä˜ÌåÒ4(>ÍyÔ#]6£ ê‡\VW.X²ÀÊÁÙ9\Æ– ø ¢ ×t‰‚ dÂ<ކ#»Ì9ŽP5ÂßÛœ+jª{Üh·t‰)ÈÉ3BÇ Ó劘b@T 9hWCî)×€„!óÒ°}蛦#WuÛ× NÚÐLøÑÀ¡Zr jÎÛp >èu¤£¦éC×=֫› }¤PÏt¸}@\&åà0è&†ÜŸ I¡›róÓÒóá(ùûùwíSÑÿ'µn-…îدpH^ºêÕóVþÖ¸AšJK±„ÌÅ´Ü)Y9}­ÌÄÌÂÙM¤¤$¬Åùi—¬œ‡Bí»v8w½úë| _HdöÔd*FæO,®-'±9v‚l®ŒÁ©h@ü4×yñÎñûêÂÊy½sî›à°‹ ™qžÉaFÓÑílIØ×Š*$:[dabR¤$%Å3)ÊÇ”í­þ˜ý9LÐcL?„®¨€æ`QxÖb™ö(ž|¡t8|ÁÖ°1 d»%8ÓŽÍTSeŒHLátá;Ú±»â–îV÷ä@ò럅9VPW˜uø‰ Ý1БuÁ‚E À‹,\ Ip\$ ¦0Å"R¡«UÔ#‹¤i=’ üÔH“4] €‘ FYŸH:Ð+ç‡ë@'ƒvHôÓvÇábôG Ö5ŒAÛñYàˆ²œÅà@œ7˜ÊcÆUÀ ¦0cF0yXÞ1Æ¥Yç¬qè›–R˜rá&|)3‘Ó± Â×a[p¦›·,¨¦Ê‘h¤¦—ˆ4tGýÁM1þ úµ½ãoOvTH¹0âàÜ=ŽC¦€3`Ü ŒÄŽ3V4ÎØŒã \}š,gßà{ŰgCÀ)˜ÐGЧ¡ à×j°–6áX˜8`4ÇkFÇü‰—ÊcÅ`Ê(C¦jd‰z†’~ô¸4JÒs ³ ‡\@£#|!+laÁÝ@E!>¯±˜½A6W¦Ña—˜Àï«'£ƒ Â%/Z¢ê >`ÅÁì°_¼BE……?U¸û€·áúò4Þ¤c,2ŸîõÇì>ˆWL2b%;1裵Ìu{Š47ìÁ,ƒBr¸rËÄ¥˜œ¬¨xšÛEÞdTTШ<Ö_nQù`ð{ çUäÿ`©“¨„y•DüžDšEñ0Ǧ6\“Žñ&£"L¶/Qyª?VQ•Œkqò£ã”1‡„@e˜“¥¢æñdÍO€8>Íyô œ #sØ)·äq³ÛH4‹O]­jG¯üÎF¤Wº;¨€¡‹HPɱ-GÙµ#E炎6-êèø.H\MkïŲt/RƒÔ;Ô ìCDØ8¿ Ò¥)>ôÎcý±êhb ‚&ˆ×äE'S¦à¥!QE/‰qiÎkb3ÉVŠè]n^zNf^q‡WIo~•°dzžÜ˜ ÊÄ™Á§lá䆷ÑÜtºPfã#°«šÚ0…ù—7é¸(±¨ûò!yª?fëO6Æ,Ó*ýˆ‹*ÀbÄÇ‚Eæéd·è)ÆæOï<Ì$.Íye&0‚Ä(^C¡xJG9çMÖJ‚ÿ¼Åoz0(|N:+/:ù¬üêêUô‚AqiγuÄ({¼89")—Ç•0¦ ·ŠšhxÍŽsQÇw(“uÔO¨ƒKWT=Œ:ª uÎAÀYC². ’MaRB[ç¨$p†ĉ¿WèĄèú´dFæQz˜l¨ÛÀ64XÞ¤3ÏaÑO¨Õcý1gì+Q¨¤J 5@\åí'úc‹ŽÞA)…©™i7oä2”Щè ¿x%T±è ”âÑœgPÂ5íç® ŒH¤˜d$ÚѼG.™.ù$Õwd¨8 ’Àd•H˜jq÷ .[ô+D‹èc`Hj4 ™èB•é±HŠ-·mIN£ËG1ø¢$qA@0€¤Ò>b`ð&ÀÀÁèggõ—?]Øï ´bÞ~L@*‹è©Ì Iµ¥H6—2 05ð¡!‰<×:Á]ò,å1OZ”·ÒÐø²>Õ‡ƒ-5”ÿ…áYñ]JêÇÃÏ/Ñq¹«Tt\îü—».=yøãÑœ×éÂRimÃ9ËȳʵÕå°>Ö¢ºHà;Ýë¬À„YAž¬0MµÂ4ÕijxF@ƒÀÏ BF ϸ¤U£OråpéY°N}–Ï:NwÞ¤Ã:tZ|ëÇ©ï©þØ“”âµ› OÀq;Šæ.4³lFÌÀqö ¡¤XüN•ôÈ~"¦pÜN„›Dí'lŒ˜·áæ Ø¼I'!,jûÏû‰”»þòËÒo:<ÉÒV\LE]ç2¥txÃÕ;Ü—F¥ÍÓtÊ`5H·Åãé<ÿ”ùºÝŽÛá4yFiò<]>XY”Ÿà°-CUÏIg×üÈÚcýå—µïLP.l9Zq1úͽ¨¸bÒÆFð1GFpiµ­E™µ®âj”U‰^ZŸDy”ÁR>Þ†ëa´£R7ùQ?¬Ïcý±'…ÅKq)·Étm›Q:ã“- o³nqÅÓºc¤ÝÀŸëÁ.å3d“ÚŠ(-;rÖÖáv§BÑ‹ây«¿ü²ò­x<Íõ@)ÜÖО²xh]ÌšÒ@Ù¦µbš69á,JxwO§gëi pÊwÅa)œÒúQŠáÚ¬0ocü*^¹ë=«*^ŠG Bn2ÐpÓJìáKš1È™ñ0ă Ë$ÚééÁn-Š‹Ö˜»³n±õ~\mü›=Ö{úIÜr‘"©‘Qx Ñ~Wy…Q±4aí¬4Ì  üü%TƒßõÁvi¿LK/„(/fúø1+<Õ{f@Ü §,aß‹›—4cÁ'ÍXj°‘jõri`«ÂÀær?3–§úcÆMè••£öÐa²Mf}¢¨„-+u〗•bñ™9`sœî–»:<²Ú¹—˜JáÇ÷XìQ£øÉJ—ÃveeJŠ)“¬3¼Ç†oiëWhsz”)ßHœ± ™ AãÁ¹—zÔ½Äì ÅCÝcý±ïû?s[“,´«´Éî¥sA ¡\2 Û$¥ÂR„Ý7ð¢1Š@ŒBÖ¹-.(%Úꤌ¸4ìnÜž¼%-g‚-­4¸q…¯-!<Ö_~AûÞ4‹$íÒYYÅm´ÐÒFoHÁè>0 €d ³ø0Nt| F“KŠp4Ó%Šäkƒ/•Ǿ9^ü@“¶0w0—XONç{@èÑ ^¡ÉÑ~ñ¤o¦IºZÊäƒüÛ'`zª?öøVü¬-Œ¦8³0_´…%mäðRš€y<^€äÓ–þ’U ûÄÅmË"ÜÍ ™b “Câ-žH©‹ ’¨j˜¢¤ãÃ7X [Yô,UÊô3o4ÚFIÜrH6ðÐh–õ.Kõ—_–¾SæU]Ü´ ½OäÙPÃŽ ¶ç»;“ض¸©Z¼ö|/wýå—…ï-‹h×A'Þ†®vrB!u ï4‡Ž —¢GJ£çI!áÀ¥Zâ–F¸>ËæØH¼1(Vã·ÈuìÆjr³ËUòŠ9¼NŽŽ¡Èä¬öÃ=Õ^Y‡Ÿœyôo‚s„?ÈóÎü”,|$*ž+ (ܯñ»üjJpÛ±[rB…¿^A½ÒrSCøìÓÁ!\PŸqÎÞÈVj^&‚§f'HÓ½µ!ÃËÐ4üTL]¦²ÂËü¥ÉE54UW Ó¬ ƒ _Ir|/µä×À‚”|IªðPnnÆ2ÏKÏ/¸º°¯Œ 0†mÓH1û)ršœ¢¤¦ØiiJ?ÍJÕÒÓ™òÿÝ¿¿^Á¾Ê¡ÿyiÞÚ([ÿéé¿Ü ¦oÔCeéÿ…x5ìÞ!¹…’¨&4\wøÙÙ º$K¹ýú'´nꟓLBêJÎÊ.LÏ—BÉ8V:¥HKOJBRž2 apч}Ö?sí5?üº÷–wmb'~è¿jaʪ1W̸jôÔ[/.¼uÚ†Š|øû• æv-|·Ùº'%}ú„Ï\z ùœá-§™ÿÉü©Óˆ¤¢ê#NõÚžÎðØÏª_úØé¼ýW½¯¯»wÃæ©[Ï <"ó£?v'ÿ±ùìw_,±ëŠÇæ½z¤cÛ½UNo®WýÀ¾™{Q»pÅÃÇ&~œ: ÔdÝ «ÛKšùÉ®ÔS§N­ß5ìëágó—U4³ëÁ£C—}qxȈeK÷]ºµß•Ÿî^xè¢Ù}»>µ`Ј¶§صwúèÛ×_ûþ¯û¯úß~ ÷ß~ùÚÿ:twæ¼íCœŸÓýï3é_8Ò“š³`ßÌéÛíÄ¿oŸßpòòzÝÞû$tä·¿ß×ï¢ýOÏýªå޾ºwíäQ\Ò·ÿ¸¢yY3Ç->Stwó÷×_ÜžôRçC‹’õ¬»}áÍËíÞtü«·Ü[ó¶µõ«ß½÷¶zY‡–¿¤îl°g÷é9gÞ™}fø-ÿÚwE£Ý)»gmX4÷Á;o^ýHNìÒïîfs³^=xàie@î±]k¶¿©wîùé®Ë&î£ßýËœU×lª:¥ióy‹¶o˜úf»•©KrMëþ^×ÚEÙ>uÉ’J;öN\²¢ãe­ÚÎ~pÒ;S&dç}Þ}òëñÓØ-OŒªãîºc÷×NØ=8sæ¨a;æïòqÛ™GÛ´¨ñý¯)K“zש²vlòËG®yíÓ¯^Þö…µ'WU_ŸœYõÐ’!w¦>÷éÑ¢ë~ZßèÈÒY^¶¥sªÑñèfUó÷=?¬èà³ÿªõm7œ­Ø¢IïG†µIÉèÑ-«N-VµFrú‡ý/]Öse¥9-^Zóñ؆+Ÿl>ÿ=iiò- õÉ~µ¦sýšÝ÷®Xý?Õ$-êÔló‹ßÜcöÉ*š2mØš2Û·Ýùýêq=Ø.{ü¬Ií*¾TµQÓëwTX^gxs{™µàOO<1ôè‡w/ÞÖç¿® ­zldïK¼ãâ»fýñâúçê6í6åÙnyÏÿÖ_:ôÙà ›Ÿß{ñGÏέ\#åíÓÃW]V?é öèS ®«ÕêÉk&]¾­êæ®o:§í•í7ŽÝ²}F›¡í+<ùtßOÞ¨ŸÒçÛ#Õùûw5WŽ‹Nõ˜?õº=ݾoÕjÛ#j\?oíê7Ü×øøßZOù¦O¯ÏõªØ;©ÕÊ mͬ}סmûS±çÃÕ×7Y|¶çÒEïëCGç¬PtÍ_ý¸2©ëüËôµ Óçn©5òб+ÿñ[µšÝ‹ŽWTÇÉ7¤ÕR”Zãæ<4-´«É'ý㑳j|ºü÷Šg—4mÓá¶e•fí{æl•Î~íÔp\'ê>>FšsQå_μRýXzë/íEÝZ ýê®M—fÜ{õƒÝ6¼Qs]µ;GÜ8{×MÝ­ã'\¼à©·¥ZW¼>añèí3R3 N_Rã‰g_Ÿ4ÌvªÿEõ2W~z`IÒ‰yÍÛoÙ>«é ›>xnÍèϪ·ÜöÏö—Ëý•å$O=ظbçŽ5ß±¨jQ—Ûî¬öîkßRǽulÛÈÛ;7;uuÇ5‰xkÜ Ó+=1öâúúLïôøøYªŒ®;ê“ʇ^é\ñUó`¯oï«}Ï©K®œóóŽwR>]ç‹vj½®Ç•–_̾¿Áí¯tô‡ýÚ„ÝukÎ>öïš)›ß•µcÙÜÊ-.o•7é¥77š¹è£V?ÕlÒx}å–B#[ÝWçæM7ÕíÒfp•.uî[?mÜM÷_¼¬AÃÛZ:ÓbãS}Þ¿f~ó/—O~mƆjŸ_›©¦åüvçÔéÛ&|^íóæ«÷÷ïùÝ©¿õ™qG­j­Úë†_goIØYuóµó¿®6f¨e•éÇÿs}哹ÝNô¸ùºŸ¶ï¹qëé·&½òuÁô7oøl‰t²ßŠš³Z‡®ŸûrÑU_¶É½º`õˆê¦1;¹ï™–—,“nºtJÃìÅ'wyüäÞÇTj·|ÕÐä=‡;LªßóÊ^•6¥¿xxÈŠq ÞôNÓQͤA=~˜üÔÌ•‰«çVζó¹)÷Þ:6+ëÑËç>Õ©Ý·ÿÇÞsÀEqt9{7£Æp¨°·×‰…*аDñ¸[`ñ¸ÅÝ=cš‚ÅÄ’Ï#‰%ÑhbK,ø)Æ’"‘¨‰Æ†-[Œ1å{³{{\‘Ø„?¿ßŸù){ófæ½7ófÞÌìμ7ö¥:ë //UìXqmßSu¾|?bu›pÓ˜Ù‡ûÿ£2âõÁQ·¶ »kÑ ˜ß”_ɾÝ&•>ñÃó9«µcÿóS0—~óJû¢ýÊ‹[­@Y7Üu˜”OiÚ¡ì˜*ùÈ“½×˜ß?=xb©ïÏü²Ç’ù¿žêsµ1·'Ý&örÜò©O?ÓêÛFÏOýrà tuѧ–וÁ ß?ðì[%¹ÚmûÏ^›ÄQ‹Šäõ{n5™Û/ÉómÏf‰ÿ!¼Kç±mø|lÉðÂÂÖÝï@—êB »ÄtŸ84±ý'¯PEåßµ,+j:ñýÕAƒŸ¼îäï÷ÏGN )ýëEïÖ©óíg{7¬³ü=EtóMý4¹Ä?ßï´JÓ{£5÷í´™¾ëœ¸³ÛV~Òõ‰]?òo5)è³ÓÜKWå—¬ú~wiî‹[æÌ=zeÃäâÇþ; éÅ!ÑÏpó‡µì@«U¿ù.è™¶ß¶Ç÷ʈK·v|*éæåyg;Þ‰nÙ)§0dJÀO‡OZF™|*è×°éçòMÅq¯Ö«ßñ ¦ 4ˆ ˜·¾IâÜ]hÊŠCýod½3#¼Þn¼Ö t”;¾ïF6ËçÚM*ò[Ÿ¯ˆYòõê>g³óÊZ„\¼—vçÄž(ùÒ÷V2kÛ„u.öËTË/ßRýî49vèVT·b¿×¹Ü mL=ó.,¹™súd¾ Zpû»óý¦ûöÚÿÄS/šÓçF`ï·Ï¬âç6}éæª»ÛÆLÛ`{¹Ó¼aÑ|QR»¸º÷ÍŒè4˜zî·²ÈN©MrøS_;°cϭƯ¯yå¿ÖsŸÔg£"Ïê0iAA—ýË-ØÓàç3QMϵ>Ô¬¾Ac3ûlÓOü(1ûÃ¥çŸ #?²|øiþ^ä7²t—ù­¯&íÙ2n›,©lP‡‘Ç  ^ŸØ£®bÞ/› 6u]ÿôÈ™ûöõœ]jžo¹µìZáÒE«ŽN[˜zfÜWEÍøË-ùK^Ì.Þ½r©qp©þ¿:‘ùÃê.V„øv9SR/’hr¼m½@ý„Ȱ´ð×-3æŠXré¹e÷¢_ú Cà±Â 7“Þþ|áŠè3t;~Òv©áÉq êVþÜ|f»£q{Ú¥öɇ¬Ëzaûº/~Þ8g`æë¯°>òÜ믳Ÿ]ÎøÖŸ{Ö&œÕúÄ¿Ùù¹y77Ä|_ïÛƒgù|“ð®ê|I—w•K"6œÜË­(êt)ïüÈaåçv†ÿzÿÃSš9Óý–Ïì.ÍñòˆüÕÇî?¹+ÉlÙ­<¸Á´1·r¦ö8Ûè<ëq]•b]ýÙù½ëõ>zqKyîÑ »¸[ϬÝlºº¦ 0ã@̾€¶moìnøùŒÈ9kÎF[翦•vô1å Ì+¶šÎ-º|rëæç"³ß”Ù­Z¤~}¥ìXaËq7Žé6ëωÍÃw¤ŒÌÞ1-¡ÑAÕù‚‚ÒÏäóF½cÚ5lPŠÀ÷½ûYiØSD@jæä‘—²Gʸ§÷kÛ [Rzg·|ù•÷Bw¤¤·wêØþ­¥hnÜ[¹oHIó{_‰pú¦jSïÿ^p4èãÎïLùñç Š²šMÛ8gÔ€áòW’‡ ÚýÖêçŸ(ê¹¶¨Ïð°xr|꘷Ë·Ë?7cÆá§÷Z?=jÊžÔí/l-Œ.YÕóPŸÆÇCø÷þØš;¶Ïõuëòç/'šz7œ©Zú⮀³ ÊtG×f¿W¾²Q÷ßæŸÙÞz\£©%ÙlD~îÞ™—ãóåÝ®În¹v¡ÏŸ²Võuù ]³ò®«n+£Žž‘ÝG¾˜—Ÿ`[9QwjaÇI_¸òÑöËhÌÆT~¯iÈÝC]bò·Ä•tHœÐv2ûìšûïÿ7:41cfqÀµùŸÊ5/õœïÑtZø×K¬›¾ÈÚi¹tjù­Œj8ÿ‡üïô¡;/\Goyf©†Ý“YÚÚÔf‹á&ż:qÏÆ¶ô¬âŸMüæXáúÍLã?ë/>ÈL§¬fû¦~áŽÖ¾áQ)Õ* ¦®Ø ÍJ§üf’H™ic0“‰âð-4­Ntju¼ŒˆaxØ!äb)+Tx¿`Šcl¬‰âÉ–1ÅR|{-D ¥2y(–ÉGÄ E•¤X$œâJ¥ÍÑ×jex.Î H…øó’b.R$FªÅ‡F|hŇN|èŇˆE)`‰'B€0Ë!DÍ^u•£êH¨;*Ï!bmæPœL¤ƒ ¸%Š’®­YŒ¼ÑÂ$K(Tn¤tn­ìh1xÈ@DöêeÏhpË(´‹Ì~gÄ×®Ô*»a#4¬t_P¸.ñ¾PnXLdÕnbeD,Έ›Þ~7P¸èàCA¥Œà3¹:pØÁ óʆW?—U2AzcߟU‰_k4¯L<„#¼*YQzŒŸ&ÅO6Ò+3U¸Òª’•wÁJ/ÞíQ+¼3âÕÐt•l¸ë 6”ø` Vg?g<„iÛ*™Ñxí'Ø i?ž©¼÷”*ìeVɈÖk«à³âxnœÔxeäá­æUÉ“»îqDø¤„ýh§Ú{ã<ŒÝ®*¹Ñ{çFƒH| Q"½wߪí÷TÉ‹We+Ø Ñ¨„#C¤Î»²­ÒjGU¬(½ª[ì=„„N®Á,©¼w¯·Á«dÃIáÆè„Y+¦bS:éÀ½Lïšê$Ø`#Gá žèGY2(ž6ÅJaXe "°W”‡5„Ùf¢XyXì‘ÂpN© TÁ?-64[§ÐŒöƒ¢}m| ”-ÞžöCQF–øPš·Pò?G+f²T’ j—9>úÁ"J£É! Ùa*­LH±J0È¡r‡©4ƒ ûjpƒ)X ºçSzäSé@%»ÓUk=ièÔ:˜^ïÁL2øÔ¤ÆƒµÒ ô€aû¬î0lòئSxâÓkÚOLÀ„$cx>xpÂ0HGŽQŠë!ó©©[9’4ͬq=œl….`1&R˜}P¢}=?2©<#MÐÔ4¾«bO-#P…ºuEbW4šSBë iN­‰“œ¢bþ €Ô’"\!5°€F˜„Žqáñ¨@¬£}…vññqÖ 2©¸Ð†Ž&Ì‘º “™ÎÒiB ™&X=‚öϲ?39|›! ÿDju°í°ÀOI% €ô,ø!T˜±[LÄ’@qT'»dª0¬è"NÊb¡Ó9*A°Ôm@°YÎ Çf:Ç\’œSÒŒÐf™’ÜÄô_Q±È|2QâY£•Ãû~™ *¢Öº-¾»W‚FÖ½ˆ’¸2*Z{ÄCÕnïÑeœ:€Xˆ%,Æ,Š/G—ùÄA« »"  ÖTòGf˜ A\¸ëAWKáá7®ý^ü‚Íh€þ‰µsDëÑ;"ñ2'&`†\¸q,̤!%2–M¤3ÅŸRÛÂŠÞÆº‚d>®¸HÄÙ‘ƒbcÆ{F™ÑÂÍBWvÒrX=U(RIÍ娅ë¤?Ý“œÕ¦kš‹¼«½NüáE¦0QáÑã“=#'ô¾´,[zºK]da&¸€¥$ ïQ$W³‚¤c,:ò*¤¥lþ¥…Ý^¨¸ë·/Šbñ¶_·}ÐÊFÒˆ¢íÕ4ë ö`Æ2ìÂ&EjTT0IC¦aŽæl,%ù„E0¡Ãâ? –!â<8$Ö_Øó§ã7cÐ^ ŸUàS`=Js<žtY!•ž‰”0kå lü*IX€;’ §e û‡w¬øíìøù"ØÒ"ß^½|gL¢c>P•œÞ3h^&YŒÖd ?‹PA¹$äd“Jš}ûâàNä3’ÉãħĘ[¶^½*É&HY (2ñ%P °JÚ»¾ÂÖxÞá ƒamå…«hÃâ+g¼hqW&¾3ÂN3 z$ithPi%1V(;Q½9ÖBܑд`ÌáNm+†™ŒÄä¼c‘zœdî¸jÿÁöìÍ—®d¾û•¤àšR²Õ‹c¾²IäÅ/wå,ü3d¼ØEÆ.Ü<Koš¥Í¦ôô¿àX¡vw¯ Piü»¹¶—€?Îù´êJýÑ?´—a¥“3küZDƒg©±]ˆGve­#ÌíÞÊ×oÖö::<\¨=\ˆ— º»ÄÁ“õß'õˆ^¬ñ˧ /î}ö/ù±®²£þu¿ÖßI×Á½}\Kc^°Š.xKÂì±ÿ'—Ôjh`µào»]Ô@ìßõÒ"pˆ@¯ÃD9NÓþ§‚üa-ßœônDl¬F‰}@<º>Pf-åý+]MÐ öÚ:¼;è¦{HSˆ^_Õ\å]3ü}R¨Hƒö¡f³TE<Ê\ö(úÄðèõÿØ»8)ª3¿Wa:n Q‰?y(çÂÌTU×Ñ=‹„[FNg@@°gºf¦¡gzèc†¡5Æ;15* f=v¢$ìþ‚º€‰ÆÝht5ˆf]ÅxÅc=ѨÉ~ß«»zzŽîé¢Ö}ŸÇô;ê}ï½ï}ß»ª¾¿Íž š9gÃ?ü^Q;¡µÐÄóÀ6™0æf„0_/ †}[‰Ri# RÉ3šdŒÿ™Q–5(AËKÆsÖ7†*ÀÔ(Ø¢ QÃlCœB/F<‚Qá‚þ 8cym@˜ò7@˜@°¼©˜”})È¿ÅÞïeÃ`-êèôgÁåP*zU-…éºG./ne´/­dÞ¾´* ]¯˜ÂŠ›Š}ÿk `0½¿ÿÅ9ñ_8ßÿâÑÿ{ÿ«ü¤6rª”ÂrC“ÐÄ)ªÒ DÅ˜Ü 5IŠÚŠéú1*/«ÿƒéCÿE^”óÞÿD¦ÿ^Ðàà¿Ü³ä‰µ+ùoþþ“üŹžý|gåfÜöýýËΚ¸é„!çÿø‰¯Î5ybáîýmõ±Ï6½vÇoçŸ1wX÷LËK™×õá˜å“F%/¹öç{×¾yÕõãNª¼ç²§ß{ô«ÍËnxz÷S^ÿÙÚsÆl¼uèÈwØöꯆ½ Öýà±eWÿtî¨?„®LîÛúÁ¾c>\ñüËCZ´öåËWޏ¼¶òøuÏÝþ/—O»÷ág÷¾ñòÙ•§lïhsˤ¥ß ÝtÔuß°;ß½ÿÕÅòŸë¦<|Íšýwzâ÷®]ÿüŸ>ý(Rù3Ö­‘¾8ï½iÛrܰå·~ÿütîRùÍ#£+ÎúÆ6~ô5Ç?x|ľñk_é^öÐþÀY+k–_zʤS7wŸü³Ïwozì'­[ÌÝþvjáæ_{âm$ÂhI¶«ø~†Ä3¤}ï4¨øzS61™@N²¬vÉÜEK—é WeÓëê¦/\²âï!'t¤"Ê6-'ÞÚžˆC±è°-ÓE’MdÁ캙s!ÿôµók—¬ á9µKή¯'sÕ‘édñôº%µ3—Ο^G/­[¼¨~v¡u¦C?Û7*M©$‡a—è†'gFý,ÍË‘‘TEêU•Vgf²½ ݲØÇZŒÖš&/µ‹TÎ]\ku ¾ScžÐËÃ`˜·¦«œöß5ÿûæþÝÿxC.ùûçþÝÿxB.ùûçþÝÿxB.ùûçþÿ{B.ùûçþÿ{BNùýsÿÇäï ¹äïŸû?vþë ¹äïŸû?vÿã ¹äïŸû?öþ¯'ä’ÿ¿ÿcç?Þ’Kþþ9ÿcç?žKþþ9ÿcç?žKþþ9ÿcç?žKþþ9ÿcûOÈ%ÿœÿ±ý¿'䔿èŸó?&OÈ%ÿœÿ±óOÈ%ÿœÿ±óOÈ%ßœÿ±óoÈ%ÿœÿ±óOÈ).êùËìüÇré¿Î™ü=!—þ7AùkßÿHÓ)Oþ=øt´¼þªíÅt ¸ð÷_¼,qA›üé÷_‚¾ÿò„ÆŽ^\_9=–lP+…*.0v¬îŸ±†¸4öêŸq"<9ŸÒ|3j®Ñ1>ºf¬!gZžñ'À`k‹a~'öÅòB Kšwý™ÉÖVt« X:ô£Y=+™™…À[C*@ÜF#RC- HžÙv ÝΓ\€"™T» ÑI&ø•G—’îJåÚúEZ &¸:IåIá;¢ Ä:4~Î" xyN&ÕÓg›!BøyN@—<8{N„h7œ=¢NwÀÙsÄ L®„ˆL<³²(¤zf£‹'Q#އjÌvTD[=;¿<7Û] ª1ÛQ ªQë,š]ÛCyP™Ú¼ò ­µŽò‚³Ô FIõ ˜à‡Nmf(¾YMµFÛb óAZu<(Bk£ùµmÔÍV&QëIh{ÔQWQB Q›D¨D£«Ã%¨‚ꨂUPó« A‡«î*HÀTu0…qXw–ÕŒ÷PT&žW´3î(O±ÆT2š1c ÆmŽ$CÕ’ž2”“Ìç)CU’nž2´7éä mH:8(P‹d: ÎF <•uÊj‘Íç©@U²nž ´!ëà©Ï.gyÐA]ƃ„ l½š!€P @x‚ß>FѺªk9˜>ÚÔ fÓðS‘°LüÏ„äÆ€2l™(#{ʦ»’ê9µ³(2/EîÎçÄDj5žéÆ/¼¢‰„aš6·£–M'šÖAÕÐãmª ¼zI¼UMWÖ%A{ˆ­m¶´ÚL4o,8aê 'xÖ¦Z(¥rQC"¾>«ö’£GÞÎäB…ÌLfS ýBñ™é=²¶'(À†ûëlÖ§;Ãsy ~<Øó™öimG|#:žTSèyü±C~´=$çç²@ìóË4GqˆX òvsm[G=F͉ҡÆWq:¸šYCó"Ž4~^GŒŽw÷C”4fÔ€È}¡}™†RˆtÃôîÀÇ•æÄŒÇò >šÌd´Gùž•{ˆ,T…¸&¹j„2"9¯¨[Ã׈òb[’B³=Þ^f° L® E\·"³m=F§pé•‹G›“mÑDÚhI&×iŸ5û Ú r<`G-·ã™;ʵÁ—ÌcÇ1/˜É8׺JÿÏsnB;“\ÅX'k ¥_þ°c™¯µâöH 1°ðsZh+ÓçI3eWThÔ–æ@µ©%…HΚƒÐ„È„‰„Ê8Že’ÆŽ´œ0Y_ëŠLÔ‘"U¡£¦Ûšk@OcL-Åv*,M5ªÕmH3–Šv°ÃÍm0¨Kü‚ºA_Ž#’¶™šIStuÇë)°c®Ð¶±DŠÑØZ‚‘Ð{4ÍÖ›˜d jù­£'µxÎèà ZŒ&- Že¡>r$eö/í—Š »UÓ>4»Ð€œ7À±Ђ °zëߥÿÝF—è]ø(H­ƒmG~š,P€ö.øA›•Ñ¡ÆPò4ʊдºÙ‘ÉB$sˆSM$âíiu Å7ƒ>¨NuÙ;.µÁr$ÙSZ£Ðg ¹i!¿:$zÅÒeCD¯€B‹fu+4|tŽ®£©FEªQ€³¢Lªª”æÐS3íˆöD"Ú¥¦¨ò¦ÕõŠ•Ðë4J7$™E!¤’Ä`.qáЃ¡Ö’ß(\j~Á^´*ÿjÑíX°U–aÄQsaf¨”V±\uktƒöÓè[XÑgSΨ@…³,3OÒÙbrlMÆpϨˆ&’ÑÊ6+‡æÉ2¤†™ëÖ…k³Ÿî$»Ùt¦9ä•lÓÛdÕ™t¢Bí1ŤgLÓÑ×Ú•mow´¢ÉNG”Y ‘”È8"µ"š!›i±4uÑÌËKØü hOÛõë‹¢zÜÖ`»ØÓÊÆ°ˆ\ak<ƒN6à˜=ØŸ¥’º°y›«ɰ­Q˜£ÓÙ”j@ ¢Ç Xü·Â2D›×WÒ=;‚Œ@%3-ЄL ¬§fÅÓœtSjãéNHTé¬ÕMrx’DàfrµmH´ñ‘͘+~½:ã§LOýHŒŸ:uðÔðÙë_J¯úÎÙ£–Oœ¶úÍ·Y/eï?på{;FßqÉŒ§®¸uø¦ë¨Z}ò‹'äÝü»>Y~pòÎ%-û¦Ü—ÉùùGá'§ÍûxÎñ_kò9õª]>ºå“Õo½råo¶NnÝùÃücOϾ½ñÕ«¿¶ðËÍwìm˜4ï„Û¶¿}è£;:O>ܘßv.?ì×ÇüÍ »·Žº»áÄɯôyéÑS{#²êîŽónþËßmÿæu­ßøÓŒo¿y²°sÏŽ+ÿgׂ‹o2nû£™‹Ï=;8¼ëО|l䨛jîûÌ#¡K¦Oxní”];j÷¨3»Ž½þøšSYsݧí}{ÒûCï™óÆ™?úþ'SÕO|â½ÃsVŒjÞþÔ)‡ßTºo\ }š^µññoã°Ç_ÿb÷¯ÿkG°ãÚyc7<¸°êÑ—ª6~ë7Ùǯ¹ï¸øEåæÔ<„hN”óãzB¦Åüò)/3q~¾°œòyÏrr~y\Ø—Bì…úëS½ùöQÿzÚúi¡g_n¼åĉù1nê`˜ÿ*lÔÊD®ï?üãÿ…ùÿð„\ëÿF¿È_fþ?AÓ>AtjÏSí ‡©ò…-ÝxŠæŠÇîˆëÊ8¤²*eav<•¿lÊÓ [îòÞ_•˪r˜GI¶A¤AS ¨XAÌl‹Q»AaW¬êÁPåeÓ4N¨ÎmSÅ“«÷‚¥Tàž¥ÖE“ÃŽiûIÒ¦¹°6ÍmŠë1ˆ ÃLÆITÑ»ÂÂ,Ò›V\004°vFzGTo… ¡C‚#]äµ)$ˆs,DÙI¶ô0e/âì ³,”QVe†öaŒq„’µ P/[ùýUiɆUŒwÉ"½mž¥`Çäjz>˜Å}-±êæj5s­Š€ëÖR•·…z5åaÔË ¢ò˜ ´­É˜Â‚ëØà°­ –´ö•J}Çì+ƒ®‡³¯Í(ðA¨ª¬-|ƒ!›E r0ä`݆ٹÌ+^„6¶¤¸"°Ö£<)<Ÿ”¥ìþê¨bÇèF€ÞF¬æ¢µT¨ŽI1ÛZ)ýÌ;•Õ[bàyƒ] ›v CØ<ãX!©ùÂV´GƒÀ¬—Iñ²99ïÂèÕœEè*n$Zé œXò¾W)Q÷õ½±aEƒ çÀ"À–®³…òι<¯ñ2€½CDóÞFKÙÊï¯>ó!‡BCŸÁ†wÿ8Ï­Ñbu¬1è~ç’né¼Ôi­1†žÁƒ†¢a0$YŠ&ÙƒEiõ`°ëM¯ƒ=¶éé|‘vm‰‡Œ7×%h7Œ®ÒÕÛZï‡Ct½OÕ[ÂIGr¬øË£Þ¸«-õ“hÐT?™­•¢ÞE•ß_õ–˽K­M«d­?1`­81_?º…÷Ç¥0*úP*ìX§Ój*c×2:ÿqæd)š3P}‘ }éY\ýW\÷óÖ–„‚¸„(N$by÷ŸÈÂ:ï(CóÀPÀÎ,aóYDáý^ÕÖVD_Í“¨.¦‚YgI²ìÿ}ÛŸ¸™êîªê®®šî®žj¼çÉ¥añÖä)J¤ë«¯Àü„Žè mȲúZéëNï£o=ïm»¯{C/j_/ÎÊ•%×D+K 0ÁõÏk¼¹ŒYl‘Bìp` ÓĹŒß44w*#-íüoz¼wˆ;{Ùð ïEâ ‰µ:i7ÄÇ–¤*àùt³¼lMÃÉkUˆ! ñ>áN+•M·Z…U_d*Ñ5•qÄŠ ôë¥?ùÕÒ@ZîWK:ø±IV ùÄšj01}˜ ðÊâ²L@ˆö“º£.<£)&€n®—žØ¥*`”ĨÒJ݉ý FC ›ÉõèWQ ¨h(Ý%Í1MÀ~ÉÓ€+åD’^hÚÀH‚7´õ0݇©öôÐAûÂj#žFà ëÌã40³¡µ-»ìÔà« qêÓ]¼,nⳉø/ÝR_)Ï:1C­l9ƒ †)6 »õ-«.Àcˆ€÷´>ă­o޶4ùåK ùÚbÀFɯ,Fü¤6=l¢*ÊÀ¤E£Ô 5ÞˆUc§(HtË/:µšÐ¡l eàDÓ,§gÓð_úì•:&í1f_*=q@÷ þÅïž 5™x±Ÿ;° ÒòT­ ZŸjÉÊUeŽIG¨ZV–À9¦å?$"Ójx¡Óbø/_–ÍU:¹,uøp¨–¥Q%é],ÕF•tØ.Õ$c¶ÅM£D+X/‹¼`ši›„ÿ’e¥ ^Là2x’~žš³š0(ƒVøcÒÒ2·ÍÆ:cdIámªÿª >käëÿ”MñhS„EÅ!×äe…&äh“o]A¤" 岜&:tà!ô¸aˆ_”ö—óÕh‚ûÄoF`^;páã¼´Ÿñþjño o:A¦ »4oœ«kÖ¦CÓð_º¸b)²ÓP£ô¨Qzié·ÅçJzeˆM :’I8P7w®tùø#ÊÂû]åûòçHŸÓ8˜$}U%}ŒƒÃ´øÁÞ(-4ÆDêfŽÍ¢®v¨šxjtÉñŸ*­MÇÕxü'ÊÿMË"=‰ÿ¤ÔkãñŸ¢‘ô•ΨaÊtFƒLŽÆ`¥mº2­–¡aYÄXtW›¿xjÙtÉú3î¦Òˆ ÿ:.,þÌSâú”˜—‘•L§¨©ÄÎ.XJiaý&”M¦†UŒ–¾“†9 2)²8G=Rdá±’“+ k3˜Ž°L%Uýìò‰cËêðÖ™ÂÓ½õÞwÞܾk2õë#g?péÈy¿_·aßÀO»rõµu»zæÜÙ~ʺŽ;uÚ Ó¿îŸ]êÙ´üó“ùõS/ü¸òüê·ïùѺ¹¾êĸúÕ›VÜrjô’º);¨šÚû©?Ú}ôÇŽÒéŸ×o[VUR^—Uº±õ’ÿ¼vìü'~þJÕÖþï»S?]ôüÐNg߸C¿¤ÝÛ¯óÓ‚ö?¾­?õÅnaXÇ»6Ýüò£ó>ëXhµž^øö?ŽïÞµódý¶º·.|³ÂsØxÑ>=¾ÝûáÝ›Æ ëµä?–ç_ÙzzÛ¶Ù§²ëײÿác[6^Ø!<Ü·Ó¦[¿I,½Ù}Íì9¦¹íÞPçSE_^ØøxÉ>å‘7Ìe÷¦%|Þ‰ÿiû¨.ýŽ-Ia›¡HúçÁùëØþIÆó{.êþ`â®éeµSêºëª·¢_:­X»èÜáõÅïöY}´ÏŠU½n¿ãôÆùot¨³?qhçл‡Ÿ»ö†Ý“».:dn½ôµÕ 2ééekû´É.9ó—%¿|ÛÌGØÒ¿òÿÌÜ5®ßÖïoj÷}ÎÜÕ'Î>2nöÝÜÊÅhà1¤[1ÂÜ&mT‡Õ§zþÛÆÜù³®‡w¬Ù}í„Už^Ø?nå‘ç jZ ™Ù¥ªÍ…¶Ö»—´Ygq--ä×ÏY³¡NùnݱI _Nä·wxzUù½å+þÛ¦ ï„Ÿ—rußu{sæÚ¯g̼I³±¬|ð–‰|ÿ»;dݕݾþ¯÷Õ½ìºo䂞§gnU•¦öµ>wþ€ioÎÒ.=æ½pæÛ'œA½ÐîœÖþÊ­Ã&­úìá³çšLÿ>w÷ŠûwQëf%Ýu»ø‰oéý'ï\üÖ°Y/u¼ñæ5}f–v>±sÁµãzý}öÞgêï_¼2)oï¹'WdävÞ;®ß”!/ü©û­ß;2÷h·Žmý}bî}2J4 M›LþæÎ¹Ëì)›üë·½ßJgÍ~šfžgg«;÷ÛsÝS›·ÜÞù´ýØÇœ›çÿ¨tzî~«Ûâ®éó©m¿j5dòÊWÖ—<¥Ê¨<¾}Ûî¿´îüqÒ‰uû§µj?¤ÕúÇïµ2Š:õΗ7M{P/V:jr_òƒC×0Eë–­zñ1S~õ³®ŸzmÊíœß6e¹jC¿¶ÔÀû·[Ÿ6ºÇmƒºoÜýN¿ƒ¹£ºÜ¶Îm¦jÆ8„Á÷Í•2x–-wõ¹kO· “Ê^+þÁ±/iÖ¾‡ÎÌ.<ÙanîÖ¶g“»ô9ô[ß¼—Çd•œŸ˜]y&=wÕ;uþÖi+w¢hR¿ŽÊ?ç)ך@ÿïÀõ)[’f?þçS<çú÷]öûüoϯk;¸væ›úŽ­y×L-úâO¿Ö”OZL/˜r훽—ßh<¾ÿ¶êàÑñ[Ö-Z²’o»‡ú}Xò³÷îÃg>2`ï²W»,ÙõKfŸ£‰ƒž[3ÙÂ_[]z;nR¿¯ÌW Þ|ç Ü”…z®ç‡³ëÚ0zùGu¦¤lm.÷ãžÔí¤<{nTiÖwªáç_ý¼…ß°.ïÅEÉlòó? Í…·,Z;¼¨rc·½ù©ïìOØ—Km¸fTçë?¸~ï­3Ë>Xù‘¹Õë55÷ÜÛqä¢û§¯Ì5oQ÷¾ËzÞÆ.¿euþ¤³›Ÿ<:á×÷Ú?s¿.®q혹úÔG]9+Ï|1dÌœM]¥]5oìÌ%âëçj¾oßßxêá¯ïSÖ¾\’ÿê Ý3ÖrfËž¥ >±Á•zOɨÇWLs2šM{jÞOUÿÅz´&»¨õ–bÅ©÷NŸ¸fÆÞGÖº™^?ÍÙV=}á6…j÷Ž3ó _Ï/p¦Ì*}ï·/Ÿ.=XUh>¾pÑ oOJöôûW{-.É:Øæ<·.=å“ÝÏM>¼y¸í!jÑÆ¢ÅóOúäÓó32:¼ùèØ»êG}Çï¯3lß½£Ûù¿]ßûÌæë+ó†Lsëv&|˜Ósßîÿ×K¶š2êÉɇ_èRôhÚ–ÁEƒ7ؘø÷ÍSvžuvoÒ¸ÇV˜½<¹úè±>…¾ä.=üî¦îúkصÎÁ2Îk¥á/lÙu^ OkÔ:L°ú5VŠ1¬•cFÕˆD^ñFY(¡&")¡ ¤Æ/{OÍ»IžS°ä³b±^.HQÀV‹P/³ZÌÎ'Ui­T% '¢É †‚·‰"ÍnDW±‘h¥ôCK?*éG"Fc†M%Št@€#„"­‡·Ajƒi"Mr!Å(ÎêBŤÁ&ªám˜‡ ªth_@Fdx¡Ü‡B-#¥—õ¿™”blÞDæ-h”$­¥¼«8þ§–œJTi¡¯|;ªÞ˜7Š4¨4Þ”ÓÀ‡Z”"çâ.ôn•’R?eÒ• ’Æçþ‰O»=TÊF©Gü%"+tã¬èÈ6ˆ´©¯k”•K89‘UcÌ`·>o¤&_)e&Ò¹ˆœ¨çDEœ¹äh Ý(#‘éDdDn BÑé‰÷[ƒ!èõ‘8‰¼Á‘ ù¨IOtͤªº \eÍ52G0.›@Ì©q ŒAt ~Ðà{fu[XgRf~Ê®\¢Ëâä"2¤ÐZh‰™Ì ö Pû¤ŒTX¾(•°®«Wãü1‚µ¡,o¸å$y´es£á–̓ jš½M2K!—ÍRÌåA8ئȳIÙƒü½Xídmþä”òï¸(‘N«Uk‘ ya´A ŠäØ}0•A£’Ãð. ¦ÕÐr††—S…•£ 0žätõ0ÒÃÊÃ`8Lx ï ‡áˆÉr˜FŽO«ãY¥§ÃËé5A0Ñ»wJ\]8lnl@žäÕ…£]Ú$½¿9¨8Éž×Þ¬ìþعÿ=~ÿsT’lÿ'vîßÿ•$Óÿعÿ=.ÿ¨$™þÇÌýßñûŸ£“dúoŒù«âòJ’éìÜÿ¿ÿ7*)Tþú˜¹ÿ=~ÿwt’Lþ±sÿ{\ÿ£’dòûßã÷G%Éä;÷¿ÇïÿŽJ’É?vîßÿ•*uìÜÿ¿ÿ7*I¦ÿ±sÿ{\þQI2ýû¿ãþŸ¨$™þëbEþqÿ_t’Lÿ¯æýïqÿßUH2ýÿ\þQI2ùÇŒÿ7îÿ‰N’Ùÿ˜9ÿ÷ÿF'Éä;þÿøþT’ÌþÇŽÿ?.ÿ¨$™þÇŽÿ?îÿ‰J •¿!vüÿqýJ’É?vüÿqýJ’É?vüÿqÿoT’LþWÝÿOÃÂ/®ÿÑKaò—QÉÙ«X»(8Éç¦P® 4°€‰ÿ¡QjTøjЭÒÄãD%™+j¬º œ=ɾÖC™],‰êˆË™KÍÉPÿà²ø×_:¥e ™Xëdí¶–2óLË{.aŒÕš9»•­ö„ÜÚ„zxdêµµT-UPÁ"œ‡pô·•u¡ –‡¦" ϸ\È&8‘ƒqº8{9òWEVFdÍ)T"ª7O>ì$˜RÍPBRñœ}Ї Êe§æK'nvŽ[­²ÌÉþLs2Î6' ¤ Šò˜E™û{¹D†nN0l@-!(+`¶T0ÎIæ~žÚ|ÆœLn  €"Ôí¹ k"_ß;­Îp•ã­ne,ÈÔn©AåNÆQA:?¢SÍ$†ŸÇÆ•»lmñÈÊ ±@Ö‰ËT±U•‚•¥Ì^^ Îâ*&±þnWk ±ÄceV¥¡Ñq'…9¤Àj€~ð2 *¨à\Þ&à{.4HUÁáBVÎ êÁ× h aß“¯E\WFW ]´ÎHÚeTXmeÚݹqf—»Ì«Þ·zÒñ¸f]µ>ÆÒ…JcsD¶’›† sð¢$Mº‚ú £7šs‰µfW%Ã󄢈æ9…*k³K¨wÛ Ë¡úŒu7 ÓÞV!Áv1¥NA^ÔÐ!dƒþvSÁÝäÉ`Eüå¯e°Òçàüÿcw¼]y÷ ´Xú <µGŽ YqËc{d®p²6O%´URyÈ›J²†“7bŠšUΦØY±–˜Žˆ¥Àº!ÒÅ^úáÌL>†O-Q¦ÐŠâoëSKð§õA刮:œ(N%â°zºD'WæA`œôs…àÀzɈˆÑTŽçQ‹€_››‚ $*Ì)9v|JË-B…i&SZnAÑmPº rYèNi¬U:xÐNÅa9ìb jc2Mé#¡|ÚˆœÑ9EØ(dåäfæç£¬±&”†òÒL9éãG§™PÞxSÞØüÌTೈ±[ýÌ3Nñh­ h¸í8ÞƒFäg —XÃû³RP>ËvÒG ^Á£ÐJ¸&ÙcÁË#/'Ð%d¤‡ÐpÞ‹èë¬t¥\íJ<µd’Íÿcçüoüü_T’Lþ±sþ3~þ+*)TþšØ9ÿ—T’LþWóü¯´ÿ‚ûÿ£—ÂäXKòBy©Áâð.SXGS›ßøþŸF§ Žÿ‹å¯Rj°ÿ/¾ÿ×ò)±o^~ršU(c“U)J*1Ñ,É#’5lÔ̵¤`dR,2|±ŽE–в7 $Á`³[qù,f`1B¨NEj-þO£1"^+]O«ïJÝ‘Â;àòxáë—”"C3ð=@\ºðÁÊÚ(PºüR¸XÑí +i;<¹0F‘i·˜êXÅÃ’_{A¢)H–«¤¨œü±_RB%-*g+¤*†G·ÿoŠ EA!du;Z©CŠ´Lÿ OŒ£~ˆ ß™Ã9-îJÏVûÁ[9Öɺ8—¨ , «µµqQ?@ ‘ã­"z¤H·°VXæ2> ld†°²Ud†³AºL94°‘ lä„âƒfç\0“†Úš‚O ñòb0LE!Dô@ï\ØýE}9,^a]Æû+j µLHE ´– çNd9Y a5¡íL¯`‹ ˜°È:\ ,°!,h6œ-t8+gA DÙ¢0\(>`“»>`† ÃíäBð适ÕâÑŽí!I¬ !4u€G§©V9M´W¥ mB(è ÁÅ3® ?j¹Ce\¸Ãiê·œ¦Úà¡©š5¡ø ƒj|¢¨D°u"‚,0ˆXD#¼ÅÍXp$tÖ«å`dàýagE\Ìؤ„qâ6Înµá0·ø—"ªÝOã+îÜÄíY9ÈÎìªõ ‡à ÿjgcyë¯S‹·lž÷ü¦Mnňeó&‹Û‰£öðÍ1ÇÙYÌ"UK * ¸JÖ•l@{PPÛ‚òrD†ç, dŽxk#Y Ôõæl8'ylÏÝåf)qQÚ¡Ù !IÜN~Cð‰ûò/J:8³žeœ¢@ÞMµ¨Œ“DBù^w¾¨Ê©x7Ðï3ÉýPÅMÃW)…EœÖd,¾dSÉñ5(D~„ øãæÅ¥&2TÃqúG±¹, ÏJ#³©È±WåcPC†¢”Ы¥¤,(Eü4b«-xðW!y%)j‘‚¤Vh_H;.ÀŠïsÝ(.æ +ØTT,)aD2*•nžhaƒUQ”ªÒ«ª»°!Tœ½ ŒˆG¯ƒBïOD½BºÂ) Z!LE¬çÁð`œex€y*ä.«ªÒ½wP&è¶_ìÄs¯0¨•cÊ;ûBá € A˜"9/€¼ˆm ¹Ï Q ÿ%rPò*\eÒS0^ÿýW”!ã:R!»àðñ™EøÌ©‚ØU|óò$$"MFäÉE%(¤?‚F›brðüRÂW‰áýqh+y«Ó¨\Äc:Ü7¿ Ͷ‰% ˆì½Ü ž’ÌIƒˆË8¨-U.é1iˆ>Y7’20!ß5\ ø¢DÍiàȯ¥¸TB@S}lÕú¤iu2SØár; â™Ç.‘2ï|þ¨ö犂ï•]ÍápÉÞÏú8zYŠŒu2Â@è=’÷ì] xŶV A[@d™®^¦»cDÀD‚@n!Â’!™L˜™@"«BŒÈ.^á"‹—E¯¸ xÀ7ð"‚¬Q ˆ n¨ÏW§zz™É¤{&ò½7ó)“ªî©ª®SÕ9§ªÏ¯ëM¸¤KÊ÷kJOÊù´ÒÁq¤Yò%8”x¤)¯Ú¿¤_ââô³‚Eù9éCµ Ç+ÃÄSTàu¹Éà'(ÊÂÚ#žý‹ßE>ä[ ÿâ‚8Œ:lväá?Õ* €‚büy ܘWHždi2ª³ƒnÒ(Ý‚ÄéÌËsøœC Gî«·XßqÞ"}*è’þŠÛŽû¬H‘›œÂãWžX,qET1å÷Úó}`÷[âp¡°KJf]2l!l1h‚voEN¥€à†Ê \ÝüzI?m_ ’—'?ðLZû@É$  GSàF}îâ‚‚ gÅYyž1AYjÊ¥<P¦\D6΄ÇÔªT±¨ÞK+ª6þÅ'ÀT([ý¥(ÌzU_f£Ìˆ2ë£Ûå‡=sü…§= MðŒ ɵ)¹òÃ+3¤ÛŽ×h_¡×©0ÍÂ2VþÝX ‘×Áé]ˆÍ_àuú¡¿<þüþ¬O%»|~Xt½«òë1ø¢“¬Z㩱àJ" ¸zÙªS)y|úU?Мø¤¤x²1ß­[<å³pRž|Ü*Õ9Ïà·}´+ Ô¤<{~v!†_¹ ÕM]?©U0XjóEm]BRRG¼"åS ò·Ò°Ûºu«á6"eY€²Èd'P"n* üì²Ášnèè|?9 ‘H ðx!Úº_æú´|Fx pØW¦ô,<…*Z”E.R›íäùMUHZ½ 34!7©†+WÙA¥7Y”!§0¡^š–¸zêáÚ(zæPšbhIQ-€‡›V)\%™Ã<¢õ‰j ‰kç?6[Q-´¬"Å [²aŒð®Yu Æ)íÖ}0Íiya WÏ(_Ä讞u%’fð 5.u‘$fgHj\êäæZ¨ÛknJd«3L$MSë²õù.O€::ˆ ZžÚg…h¸z±…O4,ÊC7ÐXQ –¡$pos¡¸T’aÄñ#Ù(%>6ÄâçÄ€P/Û8Ò äoú•‹2_4Ô!h|Îd5>gH"S|цÊ—/š&懣ºÒv<ê_™$E5Ink'o¯s‘©Î æ°Fi¼Þ ¾bŸm|î´Úª™*C¨ÚëŽÅêÅ>kJà!ÂpË:B°Û¼1:Îo%XèxAýŽ&ÞHg7#N*RÅSƒgãx3X~¸x«ž•=bxÃòbD IªÀINÔÀ듆ð‰êŒâ -–›«5­ÊÒ§AÐÒªd‘¦ÎUˆHß ¡€ÃOË`t‘Äë{H[YÈÕZTר•.’ø¨j‹0Û HUß°šIE}ƒ¤„´E˜Ó'h‹©Î¨¶ˆU $ˆÁ+—Ëí¬}á µ ©z9Ö HHí:„U%2óÐø¡à‡;KŒî’DêÔ%ƒÈGÓ,ä˜Y’ –.lÑ]’$¬>pªx$9©Ldµ$”4´$E¢:ÃKV¤3»Àibw±]Y[ F³ôT/¼º¡Gs0 FZÐOC–"N§ð±¨@ˆµ®ád¤è.S €â:ÕeªÔÔxVÔ',SÆÊ]B4ÑF0˨F‡MHK’œš$7kIèŠLuÑ\XV ó]>¿#€. IXU5=cèª^xupm°U\ˆ’h¢×¯A Ábe#d·`Õàc.ØÖ!߇ˆ¤%Ýïm4ƒëdq-pTŠÅÕDšrªo‚H\Óðä«´ h,?\hŠQ]øÀoªé÷à´Ò&œ’´¾S2å÷0]•Ñ9QsyŒÈÊ÷ç@†¸64…Ñ«—–ᕎ›?#x-M’-h“`©­ˆc(1Ú‹iŠÒ8ÜgÁžªZübÑ)<\ IÑÆ+ê¶æ$‡/ê6oÊ—aº*â47†jxEÖȪ^L†Á&`‡–5AÜ#zðð<¬c<<uðð¬~|ëÝN8%˜O] <ˆŽ®é%jÇŸ”¨®9„Å©=…¨K2ºÌUdØÜâ)Agl9ìÞPcKS ‰ÙeE5ÈË0ŒÀÇãG@I ÐÑÁ¦–@œhàþC+ºYÄ4ˆcSõ1W™ÙÅ2RxØ( {§ß˜'P"¯(¨®9†$U×CNÓ«®9IŸ4ä ŒDu†=`²©ã3âxýzKsLÙL»Ñk^L,dbIòî1n+»1`ÿJÅxÙñ|.sò¾§Û?&¶ØÿØŽ²¡l0žxéY$ȲŒlƒáÿÄ’w6 lV·2FÇù(‘ºTç DÞ3Qƒy?ÅŒóÑPùaƒ—±dPÖ4'îˆ æ<Ž žâðÈÌ´P”µ§Ç Á62(rôPÎë!“IJ¢¬é…Ãa›•²Në#ÿ“ÐÞa³:húeN׿;¯#Õ­¡þ.Õ•Ÿk±öxðAå™ÑsCÚ¾‡üJ!I*=†“ðlêäÇꓵÎѬ®–¡ s7+j+­þ¤PŽÉsB†¦ ³NB6¹ñôÊ<…ŸÅxÌÛIQ]jñüï:©¶(HPÆžQà]+«­±òÃÆ,„YšO Âk:.Õ0fY«c­Ãl¡ß•ç«OÔÊÏ¡ÂH$IFòÓ©0¢õIC¨Duµ¡×¼Tµ¤[ë€Û*œ*VŽÄæ¹NÆÚ£¼Óƒ¿Ey64£ aØ)Ñm;I14³ì,?üe7R§÷Èz#IÚ@È£}‹ä[‘hgÍ“S}ptÁ¶5‡¢¼?Ë#Šc´ŽÐ1AÛé2µ?k¬üºËÊ´²,+H/,YßR¾Eò­¼Ì ‚÷ž&ïG[X¬MÒ7mš:ƒ-GÐFÍ Ë@ùa ‹Õ­¤pÜŸðŠ¿)}–Çú,cõçxvGý-‰Jóõ¶¨¦YBR§JÂÍæÙÈTW˘$æ­N‘•ûS¿aä(2¥¬j˜5{$Sž`µÙ…H’Áë;ù LŠ®ƒU®ƒ ÂŒ¤ÃŒDºÕ¤Y÷òÃÇd¤öså1©óΰd:…ò·-hþ„ÍJÖ&‘MKð°0»pÑ]ì >ü¯ß3å´£d°gÊ™Yì –¶¬¢z¬"zè¦.xŠá‚§¸9Ü­¦ó‘¨Îðy‰`³½@7ÝÏj‘šóT˜Õ Ä:âL›óXFNÁ7ÇF}Γëà´qÎêç$rÕÔœg°üðmôH¯”mÑ õΦÿªÀÊ~T!Ê:!©C§³ARw’ן–5zÀ²îå_R÷³-Ê‹ØõŠüZå /„®öÞ®•_Ê„p]jv Z‚’,ÚoSú÷²üÕ!ËbŸ~ÂÿçvLjW‡Úø?€DÿÉ âÿ1¶ÿG½|†;ïäÄx‘g8§“ã<‹;EÑÒ_ݾØ'ºŸðñM{ƒu\ÿ¼À¡ÐøŸ¬‹ÿY/Ÿ;$÷ꂺ²–;·Ÿž¹ÌÂS4å>Ò’”dM•ãd`Ý…J³öråAÔ;k/+ÉX‰q8»u5Äiw[Š•=Òwæ—¶ë7žzødN›Ï}¿#÷ÉeÝŸ¼mΡŒ7<ùî»qoî°ðªÿ3¾2¥Ï•ðîF%öÜÔ¦wŽûáëÊÃyK… »*ó”/¸¸ÝÚfæOÖ™m.Ü~7]Ö(ëbÅìÍ•ÿ¹ûä#£~ºî÷Ý•‡<}óÖ%–Þ:~EñÅ“YëÎNÜP¾ÏÙj}ùŽ·¬ëû|{ö§C/-¬|ßóÝ¹ßÆ¿±pÓ¹_ëÏ-œyßÁÓO/ÜÒ®ÿ/•CÇu«s÷ÁIûOO«Ü³ùȦï&œPvêðh[âž± ¿´Ènû‚ûüþ_>{©yÂΊe{¯Ù9ó®‘ó?ép²lFÛ[?>?æïŸ]·mÒÌ„Œ/žŸ39~©?uËÅÎdþþZÇF~w¿sÛæÈ»C†/ùÊùTù±Õ?gîL^ÆmmÖlV“ä£ß¯iøüšö{â·ìhÔ~ó•}ò‹Û¾:¦äó-/ßr »·¥ø µê¶ã;ýÍw­.¿éž½£ú^¸¯Å¾§7Üóävtë¹õÜ[ü£vµJ}yY‡{Ë/4þƒþqêìÏN´ö½×G'UxvÕ¤mÓ\ŸÓdàuÝŧ—¬z3oÚ‹Yë:“Ôó-æÊ³Ÿ´j{1nû‡pE“¥-×´›rrVËk;Ì»úúÇyÛ²ôè€Üs7Ny¥SËóeó„³OOÞôpg‹N9nlÜùîÛ{œXv1«ô·„17¼ÃžI93pGÍÒ§…W<÷BjÏ›—»¯›Þ·ô¡’-' 6y¯z®×Æñ­îû³lÊØž %E’mØ£ýopÿké•“‡]Ñ¿x]¹í?Û–döôÏmѸËþ”6+KNýgÔSwlß×ö±6Ù®]‰Ûßo–{ÝžÁ…Ï,8¶ ÝöiúO¯ù”ßv<´÷Šòfomãf¥6tìj·yoûF‹§Œ^±k¾8lwÓ±ƒô«hï|ùö×7=Z±è›Î‹»¾ýîîŠe|4o—týú3Ž—ÿÐsÔ›Œ’™ýËòĆ[;.¹òþ´‡¿L:T:«Kz}­ÍVäxb`Å'ÿ\ñvÛSíVý»sÙî]c[»+O¦tù¾“°àæe¦ÏNlÚ`âÕûf¯«ø{‹Ÿ˜øäÚÅk=þj³‹ÿüAù Æ÷Þ>â­•»Lxj]âƒæ5ÂͯÍé5´Ëé×S>¹2iïK;ž{å·ïRÒ›[7œü`ù‚Åvië´ç¼{õÎý|ø×ï4}tgö¾y·<ó·•ÍÏÏJíþB«ÛWOMãzâ¾8×dÆ7-iöûª‘C“÷&Ÿ¸¥Õëo¶¾qjÉ;)‹v8}8§pC—ŸŠ¥µöä¯-³Øƒý?Ê[t¡O³A‰Ç¿½«åŠ·Ÿ§ó”AsËsçþ»J›<5gÈüN¿,>þýìÔ¯¾ÛdñÖ”S–òÏҧا¾î‡9·9<“m² ß·?¼’¹{óÌ ÝLúTï; ÇžÏ]9øžýï¥Ùó¶¼ì:qÍMF/9ÚcïùžkJÜ(æ~Ö~Q—ô5¥yíæZ`Åkÿý}÷¸ý‡?îÑ®YîÿþÔ׿‰®·¼ºüÕ’qÃZßX¹õ×/sŒìœãÝx¾ÕÉ‘cöžxñôæ-¶´ÊžûTeZÞ…> ÝyNÜ5-kA;¦÷Ûç¯Òû£ø{O8,˜¿‰ž8ã|æ7ßLX:ð×#»÷ãì«RÊŽ¼p¬`iüÎÉñ÷O½­Wþ¼\ëŒñYZ|$çÓÞ‰¼’³"«ä«¤›Þ·wL[ž=·jø£7uÕ²ÏÖ|Õ¤¢ßgÛ6¦­×ážœ§]«/þÜrE®5wkÃo\;²ñþÍüâÓ¯×vôVið¼Ýk7 ²6Ȭø~ë¨øOvž¾xÙ}W}“QÚkƹ¼ìõ-›§vûðϽÏÞTù:õàüÔq÷¤ÆÍ9´ò4r¾ðãµ³'-9³qÇw•M©8úX«Rëñ¦sŸ¸:õŽÄÊbjâ?J»åvó•¯.yvëìuæ÷jxlccö¥ÑÝ=Ñzò·{‹Ú,ì;iõàó£Gί•çê}ïÍœûA£Ÿ§––~þãžµ7\p½ýÌŸ»f]ÕµÏîÔe}üFS_>ØcØ÷˧PĿܲët{_ë”PÒœ/IkþÏV}¾º8óœÃ“R2¥CsËv¦œðå÷Å'¯Äv^`:ÇÁ` ,ˆ%Ó–‡AÅN+X‰Ö~N‡ËÞÓSD‘]p<™k‰¥CÑø.?Ž…•g";ùp!¼ž¬t§?ÊW!Ê:ÈYäÇ¿K)ò÷N'?EŒü“^ÅÉ¿ÇËŽµG~¾ÇïËH¢å/8ü™–i½ß Q£)^¹=ÐvVm;EO‘Öû(k_—ÃGegK³dRµªÓý?6¾Åî·cõH)‚ ©Jé&õ‰,ÖþúQ¨[·ÀRÈäÁ,MxQ|»òA„{FÙÀ „B³öÀ¿œÖçÇŽ,Öt¸ :.°cC6lÔF¬¥ˆB<‹[!×¥ÖVÔ~â’í@µµƒ!NEDÉ»1µ÷Fµ›V—¬žÑªOˆ ÓtC€Õ]-bðUQ»ØÓîsÂxÕâCÉyZÍ…´ßëªÆpf9½ )é¨Þ9Ÿ_&£Ä®ˆÇAâ³»<ù@z•œ¬W4ÇØ‡;‡Ã×ûy5] „vOì>¤ÖÐîC:âŸÊÔ` CäðîCäøî!°¯?ϙл£Ú‹E^ç ¼¸bQ­{š²ñ<ËS#¨@<ðÉ•|%¨9!yHè*y¼È„æAnÕûlUîC¢ T©v™Cï“P•¶04ªäÁëÝUÊCUÊc`_BÍó|ldËÂLBÜó4– ™Á :î˜ùú$S ¿/¾kêôM£ý{ù 7F=óqǪ9™¢ŽÛ½~"ÆÆÑáyëBøl— ÿ büõñ ±ÿ³.ù tLþõñ Á¿p¹ÈŸ‰É¿^>!ò/ùÇøŸêå2ÿ;.ùÇø¿êç"çe#&&ÿúø„ÌÿÒ_ÍÿÇÓ¶˜þ_Ÿ*ò×¼7>g¾Ïã:4Ëãv{òMP‚€kÞÿlÃËŸalø+¶ÿWŸË‹ÿO$Jà¸ÿ_Œÿ/Æÿãÿ‹ñÿÅøÿbü1þ¿ÿ_Œÿ/Æÿãÿ‹ñÿÅøÿbü1þ¿ÿßÿaþ?ÍÿŸ€ÍO–þÿðÿAP%}G³ $y5Ië†ÍVU+ D÷ ð9Ë.ç:±VGgUåc%~UMœ!Ã캠TMñèƒÅ% Èxà »ÕèZ¼ñõ*ð@ÊÛÂð\¼öÖ}à1ÕxÅ´>i$:UDª«-:•„åÌ‹—yu‰R‰q÷W°*VCòp$Ä}å€ZMÄí䢯âLñZ jEøŠxE_5üÕXùuˆ¢¬ ¹ƒP äk.äkuØEòX-pÕ#â•QCpÁÑp¸ h8C&‚ïD¤ºÚ‚ïØRU£HÊýZ×€t*Ž#Gcj:¸s(’‘bžBðà´HæT}p$AˆçCð-ž‚XÙl´™ª°ÐXIÿ ‘¤­Zd*š±ò/Hϼ[¡á€ÐR‹ÈIé‚·Hú¤à0‘©Î`p¢xHAÑÓó\Ãk¤Ž ÀÌF¯® À€PPÆè½Êß:¬“ ˆâ,[OzÙ´°„±TĦ D|–xŽô’h„<¤‘H"‘+)ÓrKŒÐ`ù—Ûˆª"($*Ij0¹à©†ð‰ê ãϵ>¨âÌr€(tÊäž*`ÑaH§ª×S€ß ‰Éʿ݋ÔÁ©+ ‘$«®(r ̬XË›ß>º4Á¸¥óPCè堇Ӯµwš"y3_•QR<åëHÞ°¦èòÔ¨(š\ âª+â4QàI4|`¬ êxÞ€%X’ßí†çŒ\hQ5ÀpºX®¬¤#_#Õ×ì)ŽNáaã(ª,Á$˜­F$/êÙ× ¥ñ­Á¦ˆÞÌWeG6=Ñ›ÓëÍ÷hkÑõBâpšÁ‘Y^àP‰À–ÃmH¤eÿ°Î’ÂË1 m‘yì¹hÃH¤xÝH'ª#§ÌÁ¨î…‡ £¨ª€yZ?´iýÈÖ¨×à>SŒof+2!ÍgáÆ%U%H4È(}t°Á@hxLñ2‘»Žæ õ2‚(ŒÅ6.0ª0öSw„µßü±¦´Ï™l¨ðˆixÄ,ð(Tü¡Á@¤à×@8X5 å]UÖ I‚€þwÖ#«^àø¨OXîÅbŸ@àØ~󅩬³™²ÄŒý ÂzY€,˜/KÈÈ–#c+n~n(Áóï‹!BµÐ&´ßŒjÏj%ˆøûXœRØÇÂSnã oþĶùSUt'˜@ ¸möó—úέ׵? É5(ì$Híæaª²”W–\H+*sèÊœâ<ÄIÎCg1•¯˜‹˜Å˜„EòP¨ìáø©Q5ÏCÔŽäó„íR>OÀÎâ¿-µµßŒ*•êd"ˆq˜3C¶±FD¾ÀSN“„77¢¸6‰ ’¯ÀÀEQnÎýh…e•—RFTV_’Š«"ŬvŒNrzˆDlµpnk…Ã\°ž!,žJ´œºLÃÄðïÀ§E±uÛ¸ÙŒB:,PyAò‚Q‡Aµn`ruŽTNæ‚WZ™­“°öÕ[h ™âL'ÀÙ"ØNZIf“<8ó¶Ò/Ãü-{Eør4)×:à)çØ†7‹gV4nþVMwB×q <Q–2ËnypÍ„&YÍ„7„àDH3ÖWÍJpž_øú€'ièïYpB½…ÖÙ>ä+…l@Ɇ |"e2l¿É0#V€¦q$06áÂa†b`ãÁŒ—/Яý}) þ§œÆÂžÊÙ{ìÛËg½Â© QEw‚A†åÞ|2r‘4ËdA¤‘mÈ’d®‰”ÔNÄ*ŠƒFX8ÁÙ]=ßà é˜{Ä!¸ñøö[à<Y‹q éyò¨+À¦ Î!á²£˜Gw`¾ÏÀ Bƒ ^:Ûg_…C£¦0[`¼ \mí7™¿Œ(ÀKG!¬‹” 0“Všo‰ù·ûbϹ’/Å#{M9LÐ|¢ìåå0A}’õø)TREw‚Q‰P`=ÊPI&‘f€iI+j6ÈÇ"eI¤l¢‘¸Í W}’\áÁá‘C$‚U€ï@ç! @(”™c¬ €\˜š=B°‚›ñÔ½ä3ž‚ôAeEPûMFT!$‚†&/á+a‚A¬$R¾G(ÀÇë A“úW”Moà{ä²S^:"pó§’!}* BÝ ˆ ?š( H£¹!yš$¥I"Õé8‡EÃS°xaB0ö\½ Zš¿AƒRæÖuxU¬ŒÝU`ûMžô šf-™AfÁ“ÞÓJÂüã&½ÄëK™ô²W”ûe)~† Ù‹ËÝeô'Z|•£’î»)…„²I¤Ñ\³‰üOÊOz•Óö?á‰ûD€‘ |î,ãÃùL/æï€Ï#fÞpLÄ´Úó_€Ççå§€‚ÉMì(6)°ý¦sGTE»‡DŠC7xâAø ýÔÀ¼ˆÑˆBFHš‘À9G¢,­§õQ0A£Ø Üö¯Þ®fÅÌœ#MR©…!Ë,\–Ûo¾,•&}±Âä¸4K¯ pAoŸ~Aˆ€p™ëÌPÄ`êV rì¸x×"€‡»ê)Oê'uq®wHº’ àÏE”¡B l¿ùÂT6Þœ•%¦ Kª^–Œ eI~ KaeIÔ'ÂùI†À9Y‰y0y‚õ'â°¦‹â4§ú4GJÈRXûM§Ú¨ dY g‰Â™RÄÆ°1Ûh² ~˜‹"Ø­ÍF6° Kñ@ƒcˆ È’p«­^Å¡áQ‚¸B‚¶r +¨ýæËRiýP˜Ë”…>cœY`½åOLÀ˜SƒÅ0hKQY cA“1gÕ ²ìS)YÞ«2 +¨ý¦SUT€*£aȇ2“ÈŠD06@ù ,„ò#&V³¬@¼ pò,Þ©Ü‚(¬ý¦sTØ]ïø–™o _e@’ ìdÚլi‚˜.ÛÓÕ$ ìÑJ °ö›îHU]½våœzZH ƒ.(*ç-h$ô* X [ÿžê•®Ð ~K¥òI l¿éÞ%ÕÉ ¸þ8' ÅžBY0G aê•Ș¸æŒ0ì(³ÛØ~Óíò*“°9s.I’dÀ$´)ŠÙyÃ#“@ŒcÆÄ8°«‡ª9HüZ\Ô‹,ñˆü·A•SIY5¿ý¦›SUgÆ;.h–§ŒNmz,5V!‹+H‘†0‚¥(ÖrÂÓã(À8é­€/ ! R/âÅ:Ë ° Qõ|#.ð®ƒLßVoaÁ"¨'a 7r¥œV´|°é¡• ÂÚÿäX¨¯ §'+•§'¿Â¾r^èîJˆ±õÏØ²Y  ºüÏõõÔQÐ’÷]û #õšQÿ]âçij_-±uGÄt#‡<ýýÉÓÛÒGB4§Æ<Â|HG”"x޲çìG4PTDâ"‚¹Žj †“ˆ†Ò¬Jö?  ¯™™¬[ßè}Ò…‹>Ç}Þ‡t6…¢´H*b´j)á#RT"òd4n§Ä´äý|ÿÿ¨÷#hþûKf7§Æç?*¡œÿ„Á „óŸÙÕþþŽOŸ‰#FZ –"½>çGíÔ#Ì3?yz66VcÙ:™ Ãê$«‘^Þ ê½ÕH0VF0K¤Djk 9©»Þ’­'f\òuÉ4º]3µjÒ‰ýgj<»˜24‹ü:¸“ö*‡Ÿžh&,(‹Vgk³wmMβÔ=‹WHý<ðyôä½Ûé~%u°ÉÛ‡5·Kþžp÷~É}7ƒÇƒëž¿ž5Ä4…žÑý¦ƒw÷«‡êÞœí[U—³ê}NݳšwnÔÃ;üg>šcX<áT…iÔòBÓiÙÏÒ,ú…Ÿ_z(Ëôî`Óº yßýú~ÈøŠ²eoê^V™½]âHEí¥‚*4/Lxw¾°àÕ?Uç½J«ño1ädÿgOŽ;‘z¸´§ó{ÛgïÝ*ëB^]:vöß-gÞ:â±ØgŒ{ï_6ë~XvûÁ ŸTŸmG­Ÿ§¢d‹poñª‡¯ó7ï²)%;íªá»Ì+?=b™’ù:wù„ô×=Sʽ oìæè›Zyñö}Ç×%×·Hí£ ò®U h““N£0n¾Ïü <Û?%÷ÓP›mo§ë¤j‡lX&ûçÕY‡icão¤þ2ÀÁèy«|Ç?5'•Œ>ýâ+ò×»š3Å~‡büÆ/¤Uò—F«´P´…†ÞkªÕîÖ½“Ó«ËþÞ8·($n©ïœ «‹\B5NèeÛ¡Î;5o]>[ 'ÿêóOè8ãËa+Æìòq\×#1Cš¼¾uÜõßß…üön¸ËQÇöšQSuômnÞ¨mY é7îfßâ"±ôˆN‘wzø”-£ž±^Ò§õ·a^ß¶¬|9ÖtuÆ—º¼2ÂÛ·ŸwÏ^¼1Ñ%7êe¿xͤ؈žÞZmGuÞ”]–0¸½ã¹nÛ&ôŒ?ÒofIàÀ˜‹WV=Ï|K•.¯6©Ó¾aS^|Ï» ¸¸ÂlE‹ãn‹;:èù;¹Nøë\ÖÈûh›´Á¯:‘ÞîXÕ:`GE«÷-¦:µí?ãÍèu÷õ <™J'Ü·£òOsm%t2=½ôÕñWô‡?(¾i­Øx ×ÛZ[×X»hKÿè“ÛŽ”ÛÛÒ#¥º_׳Ç[>\‰?x–¶!Eª“Rüþë;¾ó¯ÚNÿÇ6ÒÄvœâ¸Cßþ:ä@§Ü¡KGÝYyæ¥ÖfM[ª‘·Î=è¬ÛWëPvõ½p'tAþùù¿Äúïuˆ,êUxL*:˜zâŸß†Xô•:Ý0Ôå•Ô^ø>Y3IÇïv‹©{J’»xGHL±²«OÄPW/.q/ö3Ž;×#ù·ßF-§±Ý§žuý\7Q©á…‹Úy1í*n÷ì’sbæöïƒW:g?¸cõÕðƒ£ô_PyçÛ$Ô’˜3úÚè§”ù“1O;¹Ö&;¯óïä|òmmOÏý§·¸V\|:9bv»_Ý fé:ûö;ÓÙúíuIðܹaÝJzâÁYÙC3sô†MìU•80pË›¼×-ï•;—Ç%:y¼ÌÑË*Hø×Šiã4‹Þ=CÿTÈ/!Žƒž\ÔÃÝ(ü„ÙÕ —즋œ ÷\èS½sÃÎuþ¦¦+öü܇6 ‡w~¶®zoëãÖwZ[›×ÓÒ"uuÐZäÌÚ,ñ˜D/[ûöq¯³ßü`½_3épÆÁìõƒ;2^æ·¾2wþ´Ò®Õ#ïþrRgÍ›Nù±Yú—LîV»;/ÞezMxËš#çKÇ'jG _^²>Ñλôù¬eÓûô?4¬gèØN»’çÖ²;M¤ëÚ¬ëS=ÆÝï«ÇޤåçôµòX% Y¾ðë?Öýü~ëVzÌÑÞá!VÒ‘©‹f=~ÑN¼ñPèð¸ââkÅC{OÓaF®KM0aò$wËÓnfKvEåM¾|Çp÷Z£9k*$î®;hl»>®­æYIÄNjAÿ:O-¯_½8êÇÌœÇ#cZNÌ\úàÝàA_ÝËø^JÆ2j?q²Ò×,ݵëÍ_¶]žþ8laRÇJ¼ktz‡]ONë ,ÚWÓvô„ć;"vï\•놟îo}Éâ×ÚØŒm3}×U^´·Ù^’Ye»ÝR×mÊåS¦¬±Š*71ÐY°{“Ö¶¸9æëk†\þ}úü¡.ôÛ#-¨•=Z•/û黜w¦tŽÛ¨uW|)lÕi›M±oR2û޹œfþM<<~á5½g{7ÆýQ'IÈNqˆŽn7aí•ÖÑF-u2û]°LþÁîÙyö›ú”i&Un¡ ·§:œ’ÜòJÙ®û4²þ챇WH+ÃB nl~}àœhòÌ%/‘ü =[ÖÅl›»9òâ•ç6'ßUÝ´qRõöŽÁŽTïwZ{ÙØ{è8ªëLB(J]¨9zž‹?’miwf¿RY’m„dÓ€V¨³;O«±gwÖ3³²äeS~!å—qó÷)å“¶¡…ØP ä8¥8pÁ§vÜ ß¥„Cé½o>;3+í®üYÔVïXÞ™û>÷¾ûyïÍÌ»÷}ñò̱÷9yß¾‹Îß¾gpó{o_9°kg-îþæ#+–ÇÚ–.ºmßqÿÔõû¡]ï?ù`gï«+œõ‹SB]ÁîÖÚgÿåSoî>6tÎw®xäÂׇƒ ŸIìøñK;߸aéSÏ/Ûý»"¿ºé¢_îÜV˜õÀÚ‡SÇ=º!xàî·Þ¼îú䲎óö¼7Êïíù«“ßzèŽÿMmøæ™¯ ]õñöÑçÿð_/K|ðWg ] ÏÍ[ü{=¢z}ëuWíîø‹cO½ëýW}ðÊßì=æÜ;xóιŽY°ä¦‹ï¿lß®àŽesg]Úûrÿ5—ì¾·<óË•­ßþMóïß󃥑Ø1óÑ`âÇ·½ö½ô7¬QŸú»±UK·¿ôÆ=çžÙ2öŸyh(’mx¾ïͦU3·~upŽxÊ÷ÿ½çCçoþÙ3—|íÎy_Û÷ÏþªýÑ×ö¾°>ùÙI º°åä3Ÿ¸úòæ½omôÕðì¬ÄhCRãÝ,*<°íòëïug®Þ¶ªùÓ™g ÞÒ;úðýaáÙM=‹Ûv>uéÿùÑ}dÏŸ¿í–!qà·Oß®E¶ÞÌ¥?{ûÝ¥auÿ¥4+Y+n¸ÂUzÔZ­ ­BІ…K+øõc9À×D5T’Åeê(éÇݙ։é\ —wN‚PJ£Yƒ„p±`ª«y-Euh¤GSS}ÔèÀƒ ¬§£Ôë5Vô±ªBЬ²\…êÏnàÉ ÐžÍª†ÞßʼYˆ7³yÁü1‘ñaó'bþDÍŸ˜ù7X+ÀTê$b£±úrúLX§ ëµNgË’Nú9Åò@&ïªÊ{ÙEDCTÔ´ÝDȇ*æc¯Ã .°®g á—,± ¶ú 2†pÖ&Zw4YAg"18jo eûgá¾êmèí®ý p.Ї÷Ö¦Y¶gÖ¡‡É`B‚ôÛÂ(7ì¸]¾"AUÎ'®J_‰ôhÁÏÕfìÿÖŠ„T9H¡*!B%B0ÒžÓiFaŠU$¤b@«ªd„*‘Á6­â– Ð%T‘Œ"äT%Æ?|x‰ÁÍ]øöi­¬%µGÕ¨JS¤¢Â WaÄü–ŽU–S-nûU©‰V¦¦ÕüºÌ¶¿E*RSÝ»·*-þÑÈGKœùú°/ߡʦTÕ¥¯*)ñФ`ì^L–ÊŠSѨ*‡]ün‰'„1dY¸2G*z'T#Cp ¶½16iô–æÁ5öƹ¸7×ÅÈe¢Nqb ¬¤Ê5ä”hv a%Ìâ]­—êÃÜ-åSTkìêë!+†UÝÐSšœ3H¼…@':`1>05v¶ A> Q>Ї‚¿F•&ÊbUU­QR 2B5==„$×ÀUÍá‰I4AÕö¼1 5ì•k¢‰¬5àëeC¡+š.ŽjtˆC‰qΗ"ô5ÃOCÄ‚…pG¿™“µa‘ Œ>X7¤úaA!⇃|,M–Áð»h^œd}åÂh¤>ž¦é‡av?,*ÇÛ+Ãæù²öÂB¤¬¿aôôÃ"árX4^Ž#^ÎèÊ˵ºëÖ×Jæ$o…å¢@`Ñ :Ö‚$ÐR‰¹ tw’þÆÛf?øêÌÏ4wwÇ»sâ–¦rÈÇ^=‹šÁ$"Ä¢“ÿî9Ìäýþ ¨ ±Hdâï¿Aöý41 ÆB3‚¼ƒ2©Ì‡šþŸÿñÊ¿58UäÏ Óò¯GòÉŸŸ2òŸ¶ÿº$Ÿü…)#ÿð´üë‘|òMùG¦å_ä“xÊÈ?:-ÿz$Ÿü#SFþ±iù×#yå§Šü£Óò¯KòÉ?ù9ÊŸíÿ„ÿÍçÿà´üë‘Êä_zãR³†¦*øê;-¢2†kjo¦¹ZÙ®°ÿ7‰ùä/„"±Øôþßz¤¹³{úšÛ%5I›…– 7w®õb¿øßìW|±ß5—c-ó¥¾ùNÝUð~YQòWieËJX~™šÏJr6½Lm#èya¡C[#¦ÏK‡šÉà×~½…°8ú õ€Bªi.Щè<„'Z2/"‰q6Ðô(â:5ò¹Õ¢!gyRàXШ@W6¥"Òsi zI„H”ˆš&ޱˆ/7ÈqÝ}ëÌì,„J’¦4¨6"*$—w®9ÎÛGˆ”ϱxö.率;1•7¨0^–¬¥ò™!…Ž:à0€%™jT—u`ZC®Ø@4@êB0dE*‰‘@GŠJ²¢ˆ6Œ2ºMµŒ˜•’ŠS1 ½=ÃÐ[±œº0 ýhÀD,Õ„¾‹ZÃ@–èhr åcxH "@-'! §~"€”z‚do{@¦;.XÃ¥WT’Å´šÝ  «ê&Doàܤ pIBÈÖ“æ»]Ç©ºB¦×Õ eÕœUÄáÏMi€«èNM s‰L6v§s óÂ¥mîÙ}RBÿtøÁ¾2˜U'iuº9±ÃoCÉr€l6’÷ÿXãpטhl"LÆ2¶IR#ºy۸ȂoôÁMf"²}»pðX33†(r¬ûÁ5”,Õ&«hKSÒÄ-ÆátT@“TÙ‡$­å8\Œ:¹†jOÀjwY9ðÄX¡os‰©Š¢´‘ ¸Çò\ÜÄ,×­Y¾°9iƒ6ƒX3¦Ì,8¶…ö$šÃ_Æ—†÷¨ÀÙÕm5QGsšœa€Œ¦`õ£ÿ˜õ;ªã^•1ü ƒÕÁc‡—J 7¬@Œ%Ï@%€iÕiO¡Rœ8©¢È9²ÀÀƒ€6æfœ6ê¾ód¹s2"ðlÔ–›yúk,\Ã(#†&fu|ìç QÀbŽºLmqg®E-ZDí¼„šÁ ÐT­ð;u€8Ž˜5qŒjÌxuº™kè®350k*Jš‰s!ˆ UTmØ€k®µC®àY´%ÿÌ›°û&꾉;7œ‹X†5ÎÂÌ6)“°B #Žš—6oaEŸ×¼ ®ÁÛ–S€'z>IŒUÂgF®ATTQbªìåpx* ¤ö0W´„ë?ýYîaӛ瑗šµúT¢™l¢BëqÄdÔ™öeÆò¹œ§¯RÔ-Ó ¥ ÙD€ØÍJDzA{éÿöÂÇ a>õ[‹¢>|¬ÇÊã­lìÑ %’‘a±®ÈðÃ<ŸiêKؼ‰Í†šLÄ!3"ÌÑz^£v´i:,þ3° 1çÁž¾föÌŸÓ¨üRaè‚1 ë©NY7pÒÕ¸€]{ dR6kIß$±¸“p-‰©yÃYñ[äÌ_¼x>GZ2É’ùD‡(Q³@YMG`çö9…Ë$E̦ó`~ Ë(á&žŒbwP 5ëñÅ¡®qñâ&˜‘²¤±ßüµ ó[²d‚bLʦM‘™ï€Ú€TÞºö¾вö+ Ì_ëç¬Áö¨¶‘UÃý„†?†³ÞñþŽØz P{ Å™ –Æ:sts–ìÞÉÅñ™yÃŒ-»deâ~`±ÎŽ®z¨g@Ör`#pΉœË‡R:ÉïJq×xR!ÆÛÄ$4¢üĉàDUr"Ûï™­×̇~$ 8î>Òwv,ïÎð1;ù`å‚+&>Å°âæ©ò‡?„pÅ7ð©\®NG‘Z]rNZÁ üNlp³Ÿ¶àÉ[•ãßWÑêÃFUAåøX”„ËÃÛû•û9ª»½Ú£å;}f1>Œ';ÁPù„gGJ0Ù„îá }Ø=Þ”¢Ðc^øpB¹Jã5Çqs1ôRÂïÂaœƒñ9M1G2GWëiý¬;¶EÑ+Ì6H4çË ‡sñá"ªdùq0ãòÃl¥G'eõÌT-£õXx ÃÁ1óà $Œê.ð%3á¼ÎGÃìØËÇŽº™—ÎICK·% Ÿ ytÿߢ都Cÿþ_{ÀÊßÿƒvü?¶ÿ‡ñû82ÿ¯.‰’’q>HãÑT¼U%£)*D[¥T*¢P—-8ÓéóK‡nÿµ¬bÿ¡p8V¶ÿg:þg}Ò‘‰ÿwßú§7>ãÙ×·ÌÝùÆe\úŽMË.?ï@ú_þì½W¾ùYò“èªïœ¹xëŸzùé÷V¾›\9ógÛ¯è<1ûþî÷—¾¸ªõëýÂsÝxìí[ÿ{Ö‹W^[¼nÁ'ó~þä+›æ¿uÉ…Çüà 3¾0a¨˜p04‰H1æÛµ#(Æ þbбBÀL(æÿT¤6íµŠT80‰—?‡ë߈ðlo™P9C­O£“‰øR Á†eŠFCˆ['І`fÕ1ª ! —E%àñˆ-,—E%À° µDCbô ?,ÖZqçãe°à8 ‚­ñ²<]‹¸`e‘pbÅÈ–Œ\sCäå®ÓŸ½xxÕwnj*‡ø" ðð2Å׎xòùÿD§Šÿ‡0½ÿ¿.É·þOMùÇøiù×#ùì?6Uä/LË¿.ÉgÿÒT‘l:þG]’ÏþãSEþ´üë’|öO§Šü§ã?Õ'ùì¿uªÈ_˜–]’Ïþ§Nü·éø?uI^ùG§Lü‡iÿÿú$Ÿü?ÏøLþ!a:þG=S™üSЍëké–>9“Wð¥v‡ù¾¿}Nj’“Æ®ÿ!‹ò¥óß"xþÏæÿéï¿G?%†ÇrT¤©Q¨,ûbKè”í`,@¡D³S,Ñl+J:°%ÒK‡¨†n=E.ÁüÌ 5)Y1Áœ¡ 8kâ¬b‘+r&væ®hB·6‹2ëó•Þ‚^Þ\!a$q&nhÈK”ÌY<' =L4CEü±J3ˆiÃs–Ì)r\wv˜j²!¢ÏúMjÐ4"¬Â˜¶ÛEW’ÓyûWp$EÑEÅ:’Q%Ê%,º˜ÿœÒûÙn»¯ñÁ`Î(HီÆKܬÁ(d­š•JØðÆ"†ëP’ª±¯`Ÿ[¯R)N«ö*´ÖÐ¥„žOZ:» Ð“O¢óùšIR,Ïg\/ÚÄv¨™œ˜2º š‘·be®7 ƒh%¬‚"g7ÕR¼ o‹¤±R{öøòvœ2'!êÆê‹HŸ˜h^™“!W‚"ë‰&i.`‡¡1¼0Øè±Ž€²bk@–˜‹2mšœc¿9×W˺QLèQQßÀz¨V—GëbAA¸ž‡ #d4"kF^TÈ$dÕæ$`\˜S]b“æ_?:iì°{—TÕIuQ(اlÊ:RÒ—œ‘hî‚Âc(óÄ<ÍÒ®r•‚Ë®–ô;ÍèbÃ6áFBÐ7ɹbVÉ$§äuIeŠl‚¯¶:osÍé¦tR`¦d/Ǜ٭"Ðé¦Ä°ZB Á–ÐÁž£H"“TG ýEkt6oŠÅÉ*64¥æõÇ­†Ì 5†U ‹¥DV,9fÃ*® % Ö_áqÐ’ÖÖÖ£æðžÂ’®Å16T}k\íïá!‰Åhsžz$·i˜Å¼¼h—$ C €UÚ@WOÝU€×žÒn–0sõ"CˆE^9­½jePh€ºŠr\/•39…¢ñã†45SË(ÆVOh_±eRæ92æ‹ÓíYæï­ vDM[¬ÍJÙ*¥ª•²¥Â!¯KLÓÄÕIÑZžU  ÖT^ܶ¹°Î¸•Q)jº¢Ús\·­Ézm:;R:>2:ü?ì= p$Åu.(H4â˜âS M@œhwgö+q–O'éît’¬ÕA.wâíÌjçnvf™™ÕE.W ÆáãT‚ð ÆÆN*@ÇÁvù‡Ë.®@ ±ƒ‡¸ø™à„Œ 'ïõ|vfvö#­4ÚJM×Ýjú÷úu¿~¯_¿îyú/U)v­ÚOµ¹·©sÚ†ÚÞ¼öl9ZÎïÚ.£É&ÜƸÕXk¶×0‹™ZÓÖ.E)œRííX&/Š„—uÕ\œj3Ôž¼ IÑ%A¤izE,HE©`j® A•D/äãmûU++¨KaIêpFÁ]/WEôIEÂÃúÁÓEÖúwþ½ÿJðùéý?ÒÿB >úwþé¡ý»Gÿô¿P‚þÝ£ÿGú_(ÁGÿîÑÿ#ý/”ࣗèÿILŠèBðÒŸOtý¹l&²ÿ‡|ôg»†þÑþ/”à£?×5ôö¡ý“ÛMÿd2eÒ?Úÿ…êè_÷ÎÕIG¥ª$ŒnÀ$¸É÷ÿ2XìÿYüþ'Ç%¢ïÿ…š¿ ë£}3XôÈ€«pSmL´ /¾"»šeROÓšº( ¢Ntµ\{7ÓôTSá5Ý~ï’wáÍ+ÆUH ¯$«ËŽ ÛÅ ¾WHßàlÇ“$–Ä¿®–ÖëK²nˆ7Éï"Gý. qmM•­ñ'¹µ=ËÑ›´îY×ø”ôcÖÒ«dP…–c¼Fúöæ 0qÓE¤nÆú×˪aûs¬k¾]ŽAƒ}:ÖÆe‹ü:¶ðgèËÈöº¾âÖV+šZu…—¡•ÍôHÚŽ»ÀiÓ¢ûuz*jG&'NŽNŒÌNÍ f³S—Oâþ‘ɱã3kµ’3c´ÄØøìÈÄÀ²ërÄ׎;´p–Mu§Dù ·AKp Î9ßšAGéôÙU?¡?­ žß!&uŽ1ü-´ç £#ök½ö ù±Ú,†s<¼uâP£-¹G¸…Á¸ “ÇïuVT 8FÒ×Wy\<¡[†Y{¯§ÆÌÄÞ}³ø0zpæÀ¡5›!ÛêΦx[››V©klM;Nã–@ß)KÿÑýBeþ:\ÍñY‚®Eê+pn;pzP7{îâÌé ²½Ž;Ì»Æ.ÀuG ßÔyGÔ÷ApÛuàÑaðíÿSÛmÿqìÑùo(ÁGÿt×Ð?:ÿ %øèß5ß޾ÿNðÑ¿k¾ÿù'øè¿íßeSéèý¿Cýkº« –yI5xCýr…ç?é—qÎR,ä³Ù$ÞÿŠÎ¶>xŒB´wùx7-f‘X‰à®Ñ1Oà|²Ov0 slH»´@Orpkˆû$ï^W‹’"¹ýoòóº¡Á~‰˜µÍ}ãБ ¯1M÷¨c´xýþÔJ§ÐÜPΣ‚,Í›‡9´XP 6§‹)”xíš#¿½ºfùC•jI€ªQ)aÑ& «%Ȫ!Éz;­×oK["Ò¨²¸{x|Õ… ÑEEÇ=vGÕ©­¤‰zI•… Ãòìù7CRpPTmeÖx£P:ÑbµÜzr5ª,HA•ñÓ¬'ˆ0%+„ž¢QëM0OoÊ—KѾL\H¥‚$ žVäf‡yÖ·#Lta†,é–I’ˆ i üätÚ BËŽÙE-SXrsÎ+3YÚÁ¸  Nx+­ûä9 ¤§ð­¿dš×:mä˜Ö½šT®‰òbU©P)^(X>ÿ;µ|«óÇ`(tz¼‚EÍåŠÙ\3ð£sœ6ý(¨[Ö­kïHÕ(©ÚÐÜ^ÓÉU¢q(ãšqdeqjˆ:$CÞÍÚE5 ˜9®@§1¦ˆ†ytв,=¤¹éùJ¨Ã14—ˆq-ŠŽ¾:4Ç%Ø„«e㊦Ò;r®n}K€¡§C\‚xƒHY’d=Z¾Åª|)’䪉Ù}SgÉÈä!rÕÈÌÌÈäì¡Ëè×fTÈÅÍtÒ]®È~††×4^1V„WŒÏŒîƒò#»'LÌBy±gbvr<Ÿ'{¦fÈ™™™=x`d†Lœ™žÊÇȬ->èì´‘ç5‘Èp¶mTtΓÝù1¢+²“#è‰ѱý‡»g™ë9S “A§˜ž¨ ‰mX‡ŽËúoûýÿèü?Üà£÷Üÿˆü¿…¼ô/tÏýˆþ¡ý·óþ‡éÿKPú§£ý(¡ŽþµÓC*‹ü)i"/8—écbe½Ã€n|ÿƒK²lÊKŽKd"ÿ¡„Þó§ó#‚:/p±ÓÛ; ÔF'4DP ¼,‡„‹q¤ï xÈ‹Âr„K%á_†œ%\"‘{°VÇ~‚g&6+²8DöÂã4¿ êP&›"`ùÝjU$ea·º°ù·3fíú-¥(Ûz¶‹Aš-Ë’7Iáˆ=ØŸiê’ElÖlÍN5LÚ–eÖh½ª‰¤"Q9Ã+“ ü—eѺ²: {þŠFݸÕ(‰xÍô©1I7pÑÕ˜¸]{ 2Eºj­‘U4%QÜÉŽ»Ô@bΪáhü:;vîÜA/BîÞAt¾(¢{Öé<9 .‚g÷E©€j’Ì+ U`?™fÔÚ&žŒµUÖi‚ªYÛ»¾;ûaERHßa󯘯Øðpƒb”Ê&M’™F !@•µž½6  ýçØ€°À(Ж/Ø!2­j ¸€–æŠaÙŒ`[<˜#¶D/€µ•(Æ„Xv¦xstwrQ@«-K$ Ëõ[c3†ÅâÞ±Ø3Žéí™&fMôè «mõL5Ìš¥¿ß4[˳z„øÚŠËe0f-*K:±„ë¹¶Ø MQØœfL7prê[€ûìÀLK³ihŽ•ú™ÃéXš#ô'³Ò±¬Ã16Cr òiËå|IÉл–éK«ý8¹sÌ2Up/ìh žˆEUŽ9Lâ3èæà0asÐoh: Ðrdø!¾t@àÿÄ.SfÚˆé†}çNÏW畊Hâg&ÌŸ¾ …t\HpqǾ+e¹Ÿ c]§ÂI9ÎÄG&'mI´ÑÙe“ÖBÞ¢—LbÌ"!ÆÒN KÖbMfQ£ÉÚySMf›Ë’TÚ™K®Ù³Ù¤gÉÀ01ç@"tS ã‘Éda$²Ù ü¦€-œU»6È;Y‡¯R,r›†~€DÌ&H*‰Ë3ÍlÒq³=Ö³l¯ylÂá>òTÊ!æ%Òzk€[lI€¤›÷2µÀÃÿÄÆY/Š ×Y}K+D¤°ù"hÛlavÌ8(Ç5¦JØaCÍøˆš­åÖënmËpŸ §?V± ³irØ”c© : ÌÉ"·r0Õ·–MÓ”vó@›NØ|ª6ÝðvÙ4Õ.[Š©ÁŠO#–á`:dù‚§+YqŒ :1,Y‹5e/›×T“iÑŒk¹Á4É%žªø5¢M×ilŽ ¦\ûCódm¡$ià`XÓ*ªai·9†Ë¤H& Z`ŽX.;H²[»êqÙ¬‹š”¶Ùý@†u²êmx»ì”ÞRvd]ªY2åVÍ0VSưd›Z`v긩 ³Ó [C´](xÖ¦€§F ¦Ùú)UÓ˜á1…;¦4ý“cñÏ–ò 4`7?Ht¦3‹£Ù¯lx»¼’ÙÚ¥'SS¢’€t¢6}s.µ ˵©­5Zx:khÃ|’rirúŠÇ ¹Å(‰©ýXŠZݶ{ý“´9&˜rëàX^X—Š›ÃÕðÔƒ?[»ºdPgrÚ M&ÈËv´¸¬vK~± ÷Œm¡gœÓÞ6«á;üšev5­uxËI¶®q±‰©ÕŸÚ³É_&ŠBaý÷?ËÂzïå6¿ÿ !eÝÿΤ™Dö= Ž¥÷£ûŸ[€B†ç¹b"=_,°˜ébŽM &RiØón7~QØÚ°~þ¯Åu¶Ñ‚ÿ“Y6]wÿ;}ÿ#”Ð;=¶g€%™Þ'^ûè½LTNuþ³sgü€yNŠéL|$ã­Çøœ+c §âð0j"_f–ïþìÁ+Ôï'N}üÕ«^:û¼×ö?:ü©Wo¸çË7œûÏogNýêmÿsÁ®#¾ü‘ùÿ½þÂÞ'&Ž¥^Ÿ9û¦þ?šùÔ[o¿¸£ü›ŸùµüÇã¯<ûõê3KOíÿ‡ëV|øêKŽ§Î¾oàFYVŸ¸ìhß;wžüï}wÕÏüõ;ÿàé凮ùé‡_xêàOÎ|õâKßùô­?úùܳÿô‡±É®¬~á¬/œwäœ_LüûY·üŧó·¿oÏ‹o¿õúÍïüà¡KÄ],ÝþÝ/þËe Ÿ»ë£Ù߸úÖ]ßyÿŸ?{ñôÉï=wvaî_÷ßüì©ÒÊ/y.uQï)wýÍE§þÚ¾»Ž³'ÅϽÿ¦ï¾tõ¡_ÙsYñ‰¼{GffîÉÞó{7ýíâb·½Øw{ê“¿õxÿÕßþñO^¾ãï*uÏ÷¿wÇ=ןûîy÷ß÷lî¾;Ï~öÅç¾ñËGùÆÉߟýäáo|ü±…ž@ú{øô‹ŸçN¹÷œ×/½9Ùÿ±Ì£}û—Ï8I}þ+gíŸ|àœéö=~nÿ×\›ü“—žÎýò? ¾5ùXqð¿ÞV¾ENº%¦ÿlùk_9íµOüη޼ ÷ÄkÿíÜÑ“/=k*÷¡ îÝùß?.¿¼äÏw]ó ß9ñ­þ™ëî~hÇüñµ¯žrã7÷¼zÑ™ïÿÄÁ ã#Ÿ¿ûšá•Ó?yþ_>0ð‘?-ßñôWŸüÝóö÷=òÎÈŸ¿£ÿòço|ïMºí–CW¸ÏÜ÷Ôsoüý?ÓNùÕKœ¹õÂ3NzìÓf®ŽNM_ÿw'žôæ—ÞÌ¿q×Ïÿ†áŸž;ðÃoþ{×¹uýHш? »mM‘kx]KñJCr^’loW«Ç®œ}¨#­ÝÍŽ²¦È;w9ä˜äh¥‹Ú ¤ ·íüp‚4H;qw[ÇE8uÚ¸nÜ …ã:â i¢†ƒu~4MÐÇ9÷’’£‘F;Z.íòBòÜ×¹÷Wùß«Ž~ä?%¦§bp„jYòÔ³$J>©ÐÑØ¥ÍÍáú4wŒjºrÈÚ ì­¾C¼,ä*l{—ˆPˆ½Ñ”Gݲ÷®m,Ø–ºHÝÓ9° ’[¢.Ô›Ýp/²ª’Ä«Ìá{U’ÌNÀrS¦i¹Îé F°ÓÊrn ±o£ýrÏù€g˜&Œk‡ä>¤k9ÍÆT– ¾@Šý„ªJÑáBÅU kÕo"몛ž`(BîÄÂ1"8àœˆd#¼]iœmU±Ç|0!þ–‹÷NNn j¬Ì÷ÚÓr‹˜åí©°-• o6a½;/å‰÷yð+mÛ÷ö›:;2šÚJ™M\%4ïr(w\æŽw2)Eíè¼ À‡„´NÏH’:õCƒjM•Úó‹ äðšå¸<˜ÜlKEÃçè–‰A¾†g&1Ê—XK°T/ˆÌÒzeyОá8²§º-´§:Uy(´á*‡÷T9¾g_ìv :|x$˜Å ›Ö¸#Ï p)‹ù"©Ÿ6Q g9¦O“ RM/vÑÊb7M”ºi%|–£MLÈ]ý¢sˆÓDÐó8 ·iã4y¢»n^Ñ\ï¶™íCâ+…¤©X0ÿÌà›Ð5‹p7’›Ÿ!§‡?S¸ïÈ‹ç{êw‡~zêžWŸ¬ŒtS–véUl—M¶T’J—~[ÿ¥'þW†ÿL$Å䟞ø_Yü§DRLþ©‰ÿ•ÅJ&Å䟞ø_Yü§DRLþé‰ÿ•ÅJ$Å䟞ø_Yü§DRLþé‰ÿ•ÅÿI$Åä%ãñïÿä¥lýŸ`ê’ìkgðûÑOÏî: ¸÷þTÊËQùËr¿ÿ–íÿ\þ”®ø?øÆÞD1 ÿ“…ÿÉÂÿdá²ð?YøŸ,üOþ' ÿ“…ÿÉÂÿdá²ð?YøŸ,üOþ' ÿóÿ<ê/úƒ‹ÿ_¢ÿHá°<âx8,œuBñHƒEÿ¬›ÝFÿaÏ™ùg¢/!ôàíÁ³²^‰býË,ÖOab X?=?å›TÄ>ŒP$P(žb8ø–,êÏÀ]muì=„éë~mz òE …&¹1‚¤ñpŒ <C.ˆ_,t½ÿ“Ïâ?$’öÿýÄâKg¿.^ÿÕ7oý×µüó·Öžùü¹Ïþ’pǾÿxú“ï?zñ`õÞúÙ¼çÅŸ¿¥þÀõ>}ì¿ÑúÚWÑÏ_Ô_}勼ú³·¾ÿ®Þó¹Âsïzá©kÊýéÒï4V~t›uêâkÏ|yó-û³_ÕþæÎï¼àüÝk›Ò·«_r]µ<õúSÿð¶¯|÷½?Zü£‹?÷™ï[¹xì#µú'ÿ€~êÄ»?§óôJî?0'-|o¶ð´ó³SÏ?ù؇½gâá{®9$^[yý•Ç¿ùxëþ7þö·^Zxãk>ü÷÷ξûûý±kù᧦o:õçßîW^¸fš»oâ&ë/¾ô¾Sÿríó‡Æoø±ôòNj¿¹ÿÖ•ïþÞÕ¿>ù Ï}ö†Oåƒ/-üÕcwúí/þäÙ‹w>ýôÇ^¢¢ EDEc(ÅíQÑ}ÝÆ¾ãÁÑåB±8šg¥]»AÅë:Fƒ+ªÔE+”ºi[£ …. ´XÆxsñ~å. ´KÃn`uw9I,mA›ÑvŽþð[Õê£ò¯ÎÙÆôó>ó\^Ù‚‡GçÇ'²›¿ž)ºþÓÒóýçböþ)&ÿ+ùýç ÿRLþé‰ÿáI1ù§&þC†ÿO&Å䟞øþ?‘“zâ?døÿDRLþ)ˆÿPÈðß ¦.ù34$ÍÚõÞîù¿(uðßù‚ ò/ÊRÿ5‘T]ÛlP¦`•º-_öí–Pu({=†ÓÆÖÈœnPR¡5jã{Úm¡Ê€­˜Ö´« Çæ×:è´ÛB[XZ£Ÿ>ÜEjjÔ! qi½Á^¿Ä—jYagŒB«êº¤z“Wì»}Ÿâ€Ü±µ}öµ« ÅaÞËÕhƒB¯¦ºÉßÔì´5¶6YeïO´jújÓ¦íÓG–¢R|B•uº^·4*T½Y3ºêœfïYÜ1^n¸Ë-Xi% •o†A}è»Óžx}‡Kkºãñ„o38ä<´ºÆ&Á!šnÛ¸…YóÏü1»XKîÉÀ»²1ˆ9MɇÆìêm7ªÓ\ñôჭiEá´}&¦­zCQÝy¤~ ëpD‹®^†nžk1‚:…=·[ju”`ÉA™Æš;ª;n»êÔÃ` V¡Í¥°®4Īøã•ž#õC„€?!<œÖ uñ)¤Ff(” Ä]iªÇ6V÷Æ~š?ž\^Z³êŠC>¤˜æªNA}Q«k6­µêЩkMº¬Äع ÄÁšª©V½Í  w6ÌôÏ™ÉÝÔ½@®¦ È;ϲ2×5Æ÷u€ùU:fR—÷°c)ìh.ͺÿ"6±Lcs„°¹õFÝ=wñ'è“ˈܾ(>Ÿ\–E±*Ç §a#T¸ŽïÞk:VšÑÓM˜JÖ¬‰âÝ%çj·BñµôZÓØO $¹{~éȉ“Kdêø)r÷T¥2u|éÔmPfré:åíè Vš=25]0Ç96[™>å§Í_:…:7¿t|vq‘̨)²0UYšŸ>ytªBNVN,ÎŽ‘%ß`Ù[ú>óŠM‰¡ƒY9Тî@yÈ¡Åjô³ÆÈ"¥Œi«±‰šV?qͲO€««ŽY˜ïL Êunxía`ÆugL°A4dXÁM‹YÙÄaLÏ´&âÆ®ôu(KW&ÅÖé‰ÿ•­ÿI1ù§'þW¶ÿ“HŠÉÿJÆÿŠÊ?ÛÿI$EåOÓ³ÿ›É?‘“zö³ý¿DRLþ©ÙÿÍöÿ’I1ù§gÿ7ÛÿK$Å䟞ýßlÿ/‘•¿¢¤Cþ¸”É?‰³ÿôìÿgòO$Åì%òG X&ÿ$RÌþSðþGöü7ɳ5òÇgòO"Åì?=û?™üI1û×Ò!°ÿìùo")fÿéÙÿËäŸHŠÉ?=ûÙóÿDRÌÿÓtÈü&ÿDRLþµ´È¿˜íÿ$’¢ò¯]ñý¹XΞÿ%˜ºäß ÒtuÃÙ $ x›ï¿ób)Àe´ÿ²Œû¿þãò§þ£[öa$äVÏTG!ÿ±ÛãB¶Ô&!âGõÚ9¸uó½p#&q¬:%XJwuFшB8è_†vuÈ^ª¡›« /BÔê(Ã.l/q6Vêa²%Ã{Ö$‰5$¶"ëžÃ·ôDäГ•œ&•¶MÒ üúà°ƒ~' L£xƒ*è°/¤œ·0Ä?{Cˬ+F“î“Û û&׎cÛÁrÏ("ïMü _á9èQV«Ž"£:ºÈ>¹ÿ±·û%ig›ÆúBÓÈ¢üX50T 4üÛ.='ªÏaJ»¦Ä†‰Rs¢ŸQJ»%S‡½¥¼‹QÊ!an5VYìg°ò¥ˆÝp?£ÞÑfÍfÚ p´£%P(»£ä‹í–[=>f¡Þ40ØWutÎnâìëmRmæö[Õ•¡á<¨gAåyÖ ¸»Mî DÜO¶,:o‹ú:e…¤…0öø:]u´‚ß¾IÁòråçáwÑEÔqX¥á¹’˜Ás/<µÌÖFF„€ÓªhJ§´f[õà2ÇïÖ¼R8,Å<Ç®ƒ—nµ$ÿ IfÂÐðv«õ.dwõàFðFÁì :¢Z²¸:ØÚ.·Ýöû û~TÁf(˜¤ÓÛµºÜªâ§I4Ë%ë'Nä1™ ƒƒEÚ ’Läüd~JääÒ4~R¸85ç°Ö0›Ç‚0w -é®A'Éa8\PV©@ÙL Ë²š¦¦›«‡¬I’/âO¹(‘ry2gM £…PÓuGY§Xñ% ¶eX«BnÆrgtÕÅΉ†­ >‘!Q!çP·Ù8ª¸º)‘–PWìsBnÖT-ìõ.ª"ØZ.–øÇ¼Y$–+ Âüâ Þ‚ŸED¨T$«Ôe•uÅ fp,Ñ&B´fƒäÅÉMÍgœ)jÓ¥EŠªÛj³^3èF@.YÓ©MÝ ˆ"WmœŸR BfB®nh"e’›V©¦†âÓ$`c6ÂÈ67Û͆ÍÍÆÙ€Ù°1m†=¿E{ÀÌ|W{0ÖùH{y œŒ5ÉŠtR†N0¸‚æW©]WLmÅ*`´J¤bF«tsW€n•x·èDéÔ„±+^ À–A˜Pc꣊Àíf¡Nã,¡Séô0§GÛ6õ-Úfô®ö`œz¤½ô ©¶¥¸86#ŠTÖ¬HŸ%hÇêXñ>K0^+Ú'ŒÁŠôP.,ÇPœµ€µšQ™Íî>ËÀJ3ÞgÆÐŒôY†>7£íÁmú „›Á×¹²ÀæˆÄÐvŠŠ@5êY98¸~˜ÔÅb-h'lkº©Õ,Óe'ÈÝwQ~ñ´Í`‹$77?CL ðG¤Ý" «Á~ÛD¯QáA6¢GÃk‹{1æÙ¼¤6mœ*ãü0áÅE¡Í æyèŒV¬:FAéŒ-”7ï*†®öȽ+±m®j×´²©Â™˜ZÎZÈ/HËÌIÌ@Ú+,Œd•È1µH ]§@õdCÅ’÷R× ˜$Cç™jœWLUpá‡ØÂ0ºÊ IY@7ùU7qêø¦¼Si¿ƒ$&Ÿ<•8÷k˜3»O$Lዬ‹ØsºôRùà.5«]-¾ÕêI¥úÉX` Õ™ê;ãkŠÁÎbQwŠø°(º`¬Ø4ç’±À´ªkªÌXã3GWËY1a¯ª‰{-Œ½¨Ê‹4ÈuZ€0Øi,Á^g;>¢ñ¡‚ì§ùO9NéÌPÝÀ+Xåuþ¬Ÿìg·a††€TÕ‘ñnõ`í[ý‘²ó—ýtN/Sðƒ]tøtàÃ5 U$ì‹æ\³_›|9 ö÷„³Ÿš¨Êœç•ýª&žûÝϪf©œ½àkÙKf?Êw2]±ÐO©s… ¼d:‹¿ìmXbùëÈñÎò‡¢ê‰½\Õ){iþŠº°;R®)B†ã NHïü9‰jP½Àè­!×¢" ¥!=//;$(òЬ„bÂJU*JVúåHÀ¸°È¥#B(rŸYLäÂð brVó_F$’§,!ÀqÅÊ£x]Õ‘òŽî'ïhª)ÓK3LYßÅ¢Pqñሔëê8(6͹ä#£˜¬~raL¥Áª ñZÞŽP8TQÙÂ툳˜®H\¤)¼ÌWb6Hƒ|[¢’´Ò¡ªÙßó±ÌñÊÙÎxý:,e —óÍ™Ë º!¤Eˆ:ÐM`¼Mƒ‰ô)Ýgü· {1ÍÄmY ­ FÖÐøï5guÑM_Û0ÕÞ^vÚ=Ð'^Ú1<€þû»®ö»):t$ œ8ºàÎÜô@Òà½ì?ñ­ñMǦ阖“•’™ ¯:Í(ÈŸèÔ jq~Ú'3ûޏ¤®ýú…ŒÁní{β$´5‹¡ŠºÐ§áa=2뎟ÍÕ°8 _*œ5ÏžW,Q˜ñœ¯b‚CFl÷r°xh ìÑT®}ê0…þò1`D2…º€d"Õ4 ®<ìÚîꔩÌÈ*%ÞÆH€£¸k6¶’Ò ­º€å³ÅËÁ±„4LÎW†°ïð’%4sJ¤’ >öÞT SåHmª•XX6È»ác7æxWf]Ï,ÎÕX™Åù jüGÈù:9@­Ð$Q‚ñžrÈ#ŽKS rhª*‰üw\ÀÆížè\P$»0¯“™ ¢ð«a‹$L2L]Cþ€+èœ ª¨RýTQÄ4.¢ üpµÁòٮŇa92#,1Óì!”ØòdÔrQyÄØcJØ2—QtÊéeºÇš”f†=9œQÒ!býìOp0ÁYƒ1©Žèa@Ì”æWS5¬If™|õW>ΤÆ}B?—1yA Ó3iaDxOtPr‰hLIÙá35ˆ<ÌFÉj€Èb‘Ų•!fœ†0º†D¨‰C$“ Ú4˱ ðËW|Á&»®"Gã…{Ìð€/n*_ˆŒ/Ä`HEªÛª«k„éøÂpÈ,¸ó,*)Á„´>Å’‹Â"Ghñ³¹š”¾ÛVr`Ï«+x BZKøÿX¢êIK!ž„S²ÞÛEp’áU·¯~«)š)¬†Ý¤£\2¤75ÅEý›båÇ iÕ!F·­E”pqÃ)Z–˜p”¨ÄD'ˆx:èZàÅÓý%•݆3•¶÷Ù™JÛè…T.ëšT^}^§“ŠKõ yS•ïü’J1ÃIEli\çr*z„¤ˆß|^TSi7擲<‘ÊUý‘’ªj\‹‘Ý^礣ԑL °ì,™TáaæÅ¥›æ\Úíu,T!(Lé™›‰[—žhœ¾u‰)ªíÈá+¯»ò•&Uа¨áÕÂõ&k´{Â5¸fkòÇ šåƒ<œÖÕùoá.Î…Æ|å;úÒz 3œºÐ#âï\Ö)ßYþ†r¾¥ s±‹!™ІÚVtÊ‹æÜ†rðµÉtaËÉMÏÎr^ÍÚ¦W&¬š„î77Ũ\p¦W©íá‚i››U) XÇCÓÌgË6¶aˆ.jv“ÎæCPMõ²¹¹ª?bíOñÕ+Míèš{ B†x1ä^ƒ"ExXÝx¥cÒœ[¯4Äo"¸,#ô&ÖjØLֿФ¬¸±!;¼V %£d6æÀ5.>jÁNg!³©ª$IšÀhœùNOX˜ÁWw0´AEØ8@i÷ úä[ý3‘ÝH L’\±¢¶KÞµ©EÇ7 S mz, -䌧=ªÝdƒC ízTÅbh×ãE¸eŠ\¬’ý«îJl›s»ÉB|®YÙ@ÔˆÂ{v° QŒ«@SxדsÇ]ýûwÔ0ß²†¶W¦¨Fxñðhcdûë$p팟3öO Á†x•o,Txè±(Í1,EÔ[Lù¾m<#S‚ÆEÜŒ LÕø?.ZP¶üuCª³3à"¢&Ø=ðç²þˆ!H—E˜O‹¡£Hãàæ‚HRšI*CÐÈ‚ Þ|FÎø´³SHlÐCóiÑùÃZ êg!r1i®¦09R ªˆŽ¾ˆ³,B@‘Ï·(áá+1Pv¨×€ýÓÍ|vŸ-ªƒOÍ@Á…™þZ8(Ä™âüVpE84‡¸;/—õGíÖôÑxš ~M þ(8­;ï¸%ÉÙ, ³zòÑ`8¡ê³ðÈ }9âOe!â¯zC†?•GŒÙV˜Ø¨¢ÿ΂ëÆ5fIi•0;3t›œ¼˜Füx‘UÙí‰ÃnÏÐèQN=£—õL’c,šs-9’0/kã’DeBX®AåTu·‘C+<»‰4¦lÂaþ BP6Â}µ‘ÂB,vµ$#–b ò h˜ƒÊªä˅̾”¤E8CÌ8ÖPÕ__®Ý†)$9»IG’S±'^$EWõGœƒ„¡ >ßpæšo–oK6rMN)HÍHû³˜¸BÃtP€aÑA{ð P¹è tbÑœkÐQ0 Ïé ¢H˜£'ZᢠRu`´ÀQ=[Å55pˆ 8¢jAÀ‘‚‘ÑóÈaÙ´ýI¨š*ÒÉL2A=®p‚I‘MÈ¿Žê°b•\qܨ€d ä±üõ{CЦv“`@Ñ‹ßÛeý• x–4bx8š©$¥¥Ë/¡31+óOFÁ!:Æ,;-†cÌRqàŽ£“ÉE7`“æÜ‚g58¹TÉÇ©­+Î9já5Fõšº«’CƒBŽR5æ€‡Ž˜¶9ŒP|ï Ó˜Tzð ”Ë{æ ¢Eñ5€9DRªT<´¦2+x< Êþ¦}°ÛpD[\7â”'Þ­á”oõGŒ9ìtÌ!ÌÆÕƒ¹,5)ÿ“Žƒgþ©0GäÒÀ‘ ƒUhà2¨5[Ï"ÀÏ͹Æ^=­lYjD{:ÃùÊ3æx.w‹9LÂ-sÌ œcåC–s4»nÅ>†˜#Ç÷æ ‰ͨ6¿R =vF&P5 jÈEä[ý‘‡Å*›‰Nãt2@Tc| XÍþOãd ÁWŠ4ˆË´ì„¬"›ˆbgl"U$˜‰Ãÿl"Ža ³}ˆÐ ;Û‡¯Ëú£§¥×àv¤¥å ^´ì$ià"Ãàv]ð1µªÐK,ÌßGÃî+h(±¯Š}Ê@:쩃[O³³ÒPÌ:ÁïþÒZ7¶é§[•‚Ó™Z»¬?zZ{Žë´‰­„3.x44ŒcÆ•C¸˜aáK‘ìjÅ>:M…u‹¡ÕÌD÷8„i„¢"}û$$1.S€$ÞõbýrYä!^1c\ˆT24Á¸& éãO¥„:QƒŒií4Ó;QŸBCÎV*ò¶Ú‡ˆœ“rºF䢯sWô´òÎxVæHOŒÙW–i;Êå(ˆò Šªí¦³lIHÞ1Á4 ¶6@a{YúKL» 5œ1¤Íî‘WÆ‹ºþÈc¤bÅxî#Ä4ÈŒ ¡p„ð‚ƒÆkdí…£–p,LÓñø—¿Œgá®ÆbGB¶ñâ:vYäÁ$1‹, N„ïh¼v4û–‚¼)v4Δ*$¼ÓQ\ EÍø«V(ئ™£ŠXu`Õ›ZáªþÈbÅlGãê¥8¯q Є¤Ùf€Ë¤ÀUD²“ëÌD%Y‚ò®k ê‰â&Eû rd'9UBHc)DIÂ!LŽ<:„“ù|øIŠ@>HÀ(û‚ù/©§ÃÏ.ëžÐž3Ä`Ê/Kì†zx’“Ð0- i+Ä÷à¹7^-dšÒý¥3£Ã¬_h©^Hä¦òȳCÅl‡³Ó 9ëHÁ¤b°aÂQ`)z$GñÐYugƒ±y=JŽÑ×ydMÌHAœñ(ÕCÖ/¦ØWâUÝ{Ø Ÿ+)eöÀ‹{Ïeý‘ÇÄŽ\üLÌZ &¨Ô¸ä-hf}ö1- ¬9e œ-‘ÿ¢ÒºÖs=Ò*úú#wÅÆNHW1!˜C+;!dÿ Œƒ8!E”£8¹ +/¼2ß1Žâzpæ’„Ï¥áã\Õ¹ +v´¢˜ [¦ ÒŠÚ|E¤˜*åÀ§‹ °ÁDù×~tæÄn1Ë1ùËÄ H°4i¦í²¯ök7D¸‹…¯»c¹R"ª`‚spçˆ÷nøýZe9G‘^;Eo¯µqUô´ô㎴t¬Á*ú(Ì)WÛ…á³Q Û:_° anOF%wõGO Ï9†0M È«Ù.2 ^À˜mTb’5WSðLØ8QQ½U¥ y[66‚ê€"«Çpà ó˜…Ü1ZR}ÅPÌw$dÐGe7‰Žöhê®þ3Ò:øŠà¸Ð»€ãœ;ö›=å¥dÂ;Rí¼Úïåñ5|—_òšâÄo»÷ïWë¯OŒ>i9©IðîÓ)IðV„´ÑÕ¥SOÍÍ…3 ©ã³Ò´(ÛPø‡Kóp%†¦`™ØeûÔZ„¨:S5¢é´–B¹> × (¾Œø´ÏÄü‚”¼@ ÖØœœ1wÖø\z^þÙèÐÙýXVzÚhƒYlôJt¦§¥¤jcK£fjšBÿ¿û÷×ÇßOôüŸ›6&Ê6jæ¨Nÿ5Uá€üOå/þ?Ÿ6É7ôhGÕ¸6Îz&N (œÑãâ:tHêc¿'Þó6 ©Gæø‚ô¼@RX+7p "-½S'ÒS²â¦,*¶9ûò7.ýúÄ-Ǽ5{ý‰Ôæž 5-lrî}Mß`IéØƒ½êž,ÿiQá­/=öÁ×m¯ÓµÝÿ¾9¸ï/-ž*ßscþØYu;ÿv¢¢è×ÏNœüµbó½omüäHƒ²_7¿ódꇇ6Ü5öÑ_«˜¾¡ý±Š­žÚ:í磌¼eÏ®}¹…Ûr®›UñFç–§~/šÒu㎲ë›vø¢ì‰¼¢ÂN¿Ýû}Âί}Ó¹ßá½ÓËNlÞ¯ïü=¯·ñÃgYc>™uèijÃOíšœðßÓV—ìÝ;ðŽ©ž¿+òê•“Kž¸í†ƒ_6ºûÔñ²#Ó×¾Ù±hòª’ù©“v]ÞíÉv_ìÜ“Üçý?Ôo[th©±zfVÑW­þmŸëö–]—]»I»Í¿ž¼äðÃÅW–ìéÞ¶Uݶ}ËÇ]zªóÊM; [ùê¡C+%ÌŸöÓó/¼¿¿¼lpqi¢ú-ù}Z +(.‰¶üÀ/‡wLé²få—£—õ½¸]Û–½×n\‘4µyÃ6ŸÎùæ_lø²ó¸µ/f¬ÝÑúxÊ£‰-wt‰{cÿ’ñCvèVxɯ{á²ÄøÃìLþ®ùàŒÏ’—^Qxù ×”Öÿ÷–#ƒRîÝ·|Uqý6?zoSã‡×|[œ°}ö ×öü<'ðv÷÷®Ašÿ{÷ü¥Ê¡Ïìn7 ÿ Eäç².,)ù纕º|G¿çÇ^SQ´úxÚÉ[Ês ãÉñ¡uØ¿víÔ®n6Ñ,ÜTZ:}ØÀ¹9Í6¬ÎÚµ‚ôLüñêÔuëŸ-Û±E›4bÜR²yÁÛûz¾Üá•Y½¾¿ù‘Mžk´bÅTsQçFË‹sº?» Y¾9ëœÛâÞ~å‹×/ZÜó’‹³Ês{o]·bäú%C–ÏYÓæÃíOæ—½(NplðW”¶|qÛô²økJOô›´öЧ{Ì[žxâÝnÛâóâǬéݧÅôžñtYúÜnç>Þ¦Uï™ÏõÌ¾í©Œ‹6nº ë—u'?/,ÎÞÁœé ô?¯÷ƒMf+ÿy§}Â\½ã¼§â[”Rº½ý€â‡ëuèýÕŶ֟×Kïvg‡ú¿{tεç<ólãúÎlWîáßZ5;֮תW»»ó}uF½šu®—¼qýêu ÿžúîÞ¢ûoÊÝdÔK gܵlú9-ê-¾ªó˯j¹6¡É–©3»<óüÇŵwtÙÖvS÷.ÊíÔ~–U ¹Â’F;nmðGÝåÏwœ˜ÕaOî²qäRýÈâû{ݱºä¾Gÿ™™àûÞ7M½û#ÓN¾pÜ\Wú‘¾tŤ©%I?•~¸%QOXóÅ‹ÿ§áÃõµ^úÈ=©uêd·jrM/ek½¥—vسoLóŽ;ôï¶7ŸðúÏë“{öÈØÓ¯K×7ÉÂQ™µ7Î}rê§ýýDûF£&ÑK†¶ÿiTÞ!c/TkßÿIí½‡ïî:«¤0ï˯jµüÞ¡/õ¿cÕð+î>ïàõ+Ûµ>û}Mï©“<®¨Å G§=¾ø¼ù_íu}ß?râÌwº¿jthÛúÜ©å]Æ~ZkñyË|1´ýÕßtmòâvúþƒJ×v“’gκ2yE£yãþ9ñÊOº<þØß>^½bÉ+»×54ªÙÓçí¯¿´¨\ï9SùºQqnã@JN|íå/^Õ¿Oòço-YÜåÚïÿAº¼7¢o¿¢Þn1¤çMɤÅÉ5²^Xxê©=rú]r¤ûS 6-û¯a×ç¨Çæ9°ò£ºñ'ÄçßýËÍåù š.¹v@òÂÍlÚ1¥è@öìû†]µªõíGíÛµmÝì¢'26_¸zñšŠ&7^¶à`Û‡Ûuô•Ï_}ãÞ’^+/<ÎŒ .OÍ.ÍϪ}¶™w= Ö­•Û3%®c¿qÛ |¨à‹ûv=]ôyż߶¾™x¼õü÷^6t÷Gïû Ûš¿e~S»ÍWO½ðÿØ»ð¦Ší>D ›”]† ÚäfiBX¾––BìjZ mSêMrÓ^ÈÆÍM·üc},ò”)¢,n JåIA@v (².P "‹,êCåÍÜ›¤É-MBÅÐïÿ2_¿/·sÏÌœ™ß¹gΜيËN(lo?§Åtz÷)¡~Àõóf•— ß6Fú®J™(½¸unáÔ°×ÎüßõÑw0Åòš Òµÿü 2콟«5xòýé­^Ø¿cdFûÖY5ÃÿYñúÊ×ò¦ çßÚ¶A–ZöFêž¡_þ~uè Ç—ïÓ $mƯ»ñ§fìš’°6-†ÞÚµëùÒÚåúJÃ옄œ—wnØõr§…ö´æ–…Õ†Ï_±ËplcÕ€÷’*N—tëíëßÝÿÙ³©ÕWÁtzÈÇûÏÈ«®ä/9òï‘öVó›IgW¼iÉñD§¶çÊ’¶ÌÚeˆ¼üá´EÙg,Y};ÍîùÃÑ)*'Tïzô‹L®Ì9vc«bÛ,ÊhÒO(Þ4ø‡oˆÕû^œµˆì¼fu/íÒ¤q‚œ±5¯=‘úÞ¡£K#$ûÞ=ñiÛóØ¢²øsßMÛùRÚ9¬kÑzÅéu²ŸJ„ónþû‰7:¬Hicè…¼•ó;ð¿Ü<õúÈ¥]3/Îl~±xi‡“áWµJÝžÓ¶©ÇÎî~\ýú$ûñïfé{¶Ä’c—SL)Ñ­×Â]í'^í½«õÞ‰ílT«ñ¯|2î×Rùöæk¿•¯{ßqâWHÃ¥o)‡ÌîÞæº~ÂŽž}U𯫇° šaËF=|(kõð>J Æ÷'7®x­WVÖõùÚÎî6ôß80<)Q>gI·‰Y‘Æ1Ïôz£ªÃw[—YQËÎ.¶œ\·ëz»ßæ<·÷`rÔ®-¦‹{T½“¸íÓsâ:žLü ½=½?¯óù–êÄ-‰Gë®iÝwïO6 >›7Ú8hËwü6[óÔ‘uŒeá·¥{O…ßl1xt{M‡¯6Ûήmu)>õöåœ[áoT4_:۬߉+5»…åÓ^YѼý¢™S§BþþDù➊;Ī“}Ê¿¨}ºwBØk}$5)—»|EÏ}”^Ö".v…øùvZ•d|ÛöÅÍØ²¶/=ÿ튋iÃ{Þˆz+þüæ£ejW—ÿÜY6˜ÜÕ²LKLîo9Ýöp·—“©ý£=4×:–]z¼¬ÛÀÇ:W«ngõ¦ŸMÿôë{>—òyÇ–e»OvX{rÏ×%Ê+•ítkj;ÜŽ9‘~‘ÿ¢ iíO—ÚÞê|ãÛ•óׯ<_ýëð¿®´™eS†ë1™à]_13iþª©/‹&%/‘÷¸oÕŸŽö\XÊ’}éÍ3ÃN‡­\ÕZ7s`üè6 2ªšˆ\Á—Ok7_›²ìÚäGÛôù¨ËÃÏúì™ã®šZðûT>;¨5Ñ}úâS3æné°íÌì ø›.Ú·®euXáöìSŽMÒšñÙÚg&üôˆn·FOPÊaØbT+¦Í>]fuœz[üZÔдõJgNʹ4ö©eêîxmα…é3Wîþm®°š8|üÆÑ¶·ŽŸ¸ôyÒê‚å’#¶nëß©¦üûùS7¾ÝõÊ…Ÿ[LZ5àÇâ¥Ý»µ’}‘”v3…¬&¨*ýùò†NçÛUT-KŒÉž'-•-hS¦ü8íö ­‡Ò”ü±÷¦H?¢ëíC9Ã^:¬Õ4_=vתê­KSly¤e÷¾·Â¯³xR¿ÞÏ?q´×‡tÒÎ!|1ãÛòŇ·¾7ËѶòÉ þ/ý n—=ͳìøÉ’ÔNÔlèòÑ£]/¬Œ4æ_¬¹Z‘¤´?áò–ñ‰º÷÷VïIû‹{ýÒªi†ÜU›ÖŸ9`µæÛ—Ž]ž1êɇ"úOî:¸äôÚýÉkøÍùl܂Ū–ªÒ5¼ßwO:¶Z.KßÞ)¡Ï…ª«zÓ¼æ–#kås#ßÛtùƒ)ö~§u‡KzÌŸ²Þ°ZY‘ð¿û¾2þ¹ŸOÔ<´/…¿ãçW{ÞÏ3œlÕñì©„°c«÷îü×3Um'Àò¿7Ù»€ëµ›Ž=΋ÝñÎ eÿÎ<ÒœùÛž{fͻصù»3{5úÀ'Ùßîk¶øê¼-e§ÄÊ¿:Øþ™‹·’çžß÷Ÿ ¶Ÿx±0ùžÊ2£}Öüï'Þ1=Tz+ký ý›W¶E÷=Ó¶ma éßÉšSQq!µÃÎîÇ¿¾˜Z[«Ö.>”²ÿóYËûäÉ®ä®z^ôÜéž;Nýç&?«2ªzê…E“W®xUz2ö‘EŠY­+J+"·}ùÙ¶ƒè¢¼§jjnv)|õ•WjjnoËžy¢t‰4éò”ÃÝéum÷_ž~ªÇÙï-z:wüúN' žöËmr঵{~8ù¥Ö«®Ë¶w]^Óµ“¡â› ¨úÓ¹…mU•UGlW¿žµdÃjÓQÝëµt?õð‘‘Gªò=~¦â\XÎ¥wñ³cò›OÎ|ìÈœk±•k&–oxKPöJ³ÊéS—ö+~º`ÿÞÈ·{`Å_ØÜ|ç¿۞ήª’›ýdüäªq'‹§ßi>gʬw “Î9jOh¤ãñˆE‰+NR7 Ê,µä‰¤:a.¹hc™ ‹2‰$'P™i8&BHE&ˆÑ€ FV³ÒV˜I:eÖft®¶€ “(¡aº‘%ô¨ &©c“$šar‘ˆùŽ®q&“™¶æf"0!ûÃÒb,ƆIØ)ûÃþÈØ9ûÃæ"brÉÄâ ³V u•欺Ø]uÀÔ0•·A©³‚\[R€9Ø ·˜GRÌ»Õ Nãs+ 1§(§•Ý Â¤¥§løp'á`!Ó.<ç6@ ívBW0'‰aú¶2;áÿq0Ý•Òÿ½¯y è;¿Ìˆ|#„î5ÃØ¹šÁ˜Ovü\zå—±O„Ðæ9»ÜX"ô͈Ï#¡ý²ÁU A‰aÚ‚]Üî[T8„Ö/3R_Ì ¥ð´“9ŒÑ·¬ø9ÙÒ/#1>[­¯,e.Á”bRŸŒ~¾_ž¸JÈ»qÐîJ´”‚¹ÕÅwãø?¿É//rß¼ˆ†– s]1¿ÂëûT¿¬øT¹Ì}¦h/ so•ëó<lˆ|*\† tc;bCì[b|nñöˆ‡®Uɘ~KU׉<”ŸJΓ{¿õÀtn%P/MŠšÔâl¥P\]É( óȽ.=´"t6-AEŒÌH£ ÍVÚª¥H äјV"š5h£{ìB#"!&"ߺD#•Ã÷)f]C¯˜¤f*Bg¦AAYÑvyQ´¨#RàSaZN¨ÿ0&3h UG¤q6º¦TG0tu$HÆ)+ŒÏ$i1*ÒÝŠ%¡ç¡å—<÷¼Z„$K8ãÄhÉûÆäŠ“¢k!8qâ´œ‡¸ãÄ …HûqéDõèÄ2¡¬^¹hít=:‰¼^œ\.áÆI„¢úqh!7 ÁC'—s㤲zåJdõë&‘LjëÕ²X/] ÈCûÈëµVŸNâ™–vN×3‡+eИhC9b U PšôfÀZ«eȘñ¦:²Ë£÷^XûIåòqŸÖæDÞ%*ÇL/à͈T&–‡¦þÿŽÀ™ÿÓ þ†2¬È¤Ò†çÿ…Ìü?¶˜¡LÜLˆ‰¡Ô6÷ºÎ Qá|þƒ¿®Éà…ðFààO4üE!üƒ8øë› þâþÁÞøxSÁ_" áŒÀÁ_ÓTðÙÁ ü›Žý²ÿ‚8ø7û?dÿ%pðo:öÈþ JààßtìIÿ`oüõMÆþÙÁ ü›Žý²ÿ‚8ø7û?dÿ%pðo:öÈþ Jààßtìÿý”ÀÁ¿éØÿÒþÁøKþìQ¸wüEb,äÿJðÂ_'6ï_$†ì¿ þX“Á?dÿ%pð=hüE(á²ÿ‚êáïsU½Öb‰†´÷XØÇù?b‘Dæ>ÿCŠaÌù?"Qèü`ua©… `´Ýö;Om%˜ÛÔ­:_©™†=¹SDà ‘4@Eè Š0i OmÀ5„Á ¬9Ô¤IG”Ø]W9©¼Šˆ Œ‡ƒçàemäè ›Ž°h ¸Õ ôf ¸é›(ÄM:i*P¨-8ÅlSÁˆ‰v&Q*QœAm´r>ƒI‘éÊÁa‡/ÕQî×ð‘e+ªŽ$ðxv5Mu';@­-Ä©gÔáv‡ÿ:Ö;þÌË€®’mdZv¿œßäü¡|+­#ÍÑ…üá|R㇄‚­ï“„ (“ïr ¼Káñ”Îw:ÂB@é2iKA…[ H–jæH?»ž,°Q„#wtÏ£%L4A!1'ð"¢ÈhÖ<µ“¦RkÍeŽþ&–c:ÏŽ6UÉü ìÙK0cÈr])è'°bj«Mãú:­ËׂÝ$#› ü;› 1 «CÒ„1—ÝO¢ÈCÛHÀX‚.# F5L§·Cñ3Ðf…¾+f^Å2j9šÝj +Q@D›ÚÁˆ_*(€iCgùõ™Éb÷Â(ò„h3ŒOR´µF‘‡vÖxÐe’V`¡Ì{#€:É´ÆFCdHlqš-|Ài@Ò ˜4€†_½Í0@J0V™9:mL&ˆKÍcãTª¸ÔÌì!6|‹62ùF‹„Ùã…›èR`Öƒ”‘ªøÑ>n„2Y™™ ¦‰ÊÌÔ‘ 1Mâ@zœ*S?&9NÒǨÒÓ2FF†gFJ ünæqŠJž–a3¡mV8‘‘¬t©Áý*dÃN¼ÙR EÇKÜt ×Ìë4øí©£F§+ëší9Bb+npæ‡2€’n´F?ènòÿmàØâmÿ»Ç!ÿ_Pÿ¿ÅØ(ücBø#pð—6üCþß þ1M,´þ'(ƒ¿¬ÉàZÿ”ÀÁ_þ ñɤ,þ¡þ?(¡þÌÐ^‹†é¸®¾Þ»ßþ_ æPçÿ#ÿŒPòÿ%xù=±÷ôõjY¿ ®ñŒ·¨‡®·ð¸œ·Îc]Œ'×ÀQ?®¥î'Ú ¬6‹ÅLÑŒ ×YàÕsò‡òÙ·¬?¹ò ФqÈ Ð‘8ã¨@.7¿÷ÅS‡ÉeŒ§N.Ðé…^UD^9†ƒü|&/ÿœ‡wn€=ݦ1ZB5m&&Þêv,Å›Ø:Jš0’e„ÓÅx ‚• ^çKw“8@D¤/Ø5ÃG2i¥j«7NÔ™xÈ/MÙ´´™ŠÎXX]¯~¹Æ|qys­E +ŒO¨û±ÿ ³ÙsÚå¬E‘9³QùòÂ|\â°Ó([”KsÞœXÑŸfÁj–D›ÁP &Ùp©Gî8íýh&l¦"’¢a®õ¼°žD|µ•4òïjQ@uJ ¬‚‹G;ìèdÄ^¥3´ÈSíüöï PÆâ$â ÈLê_[i¾ºUCÅ0%ë0'(#ibÎ\j4´R­o^!…ÒªŽRÙL&ÒTàSi@˜Rm£L€Ô3îX¶i‘‡šb‹it}büÖ'†­O üXýW&æ+‘•@UBÊÀU¯*ãQ§i=Õ4ÒPM7R[[ÙÔ 4„—rc°Á6# EОßu­Søÿjü¶A:e¦á3Te÷¯·Ò=šÇØ` ð@&ô)1šÀz/·ýå ºÐ¬CFˆ†GaN¿„5Ö”m!i€ÖH@:‡©IƒU€ÝÙȮΠL㸠áù±þU¡n4®N¹7=ÄÍ-³ ,84Õ©¹ÙB˜êtÿ}â8Ú9÷ÄׂÄ×Ûi þˆÒXg’8|Š®%0Ñu6Û%CÓ²±ªÚ‚ùSÕˆ‚áéR?¼fAž 0 Í» žýV@äm=ú±ñ¬¥ÈYKÆôSÍÀ &&'4Û¸Ï5©|ÿ('ÎgÌZÒs8›¡mÍXéÜÁœ»3ê´Z,«Û.:¸ÞwIãü<ÝÌå"Ê<»]ŽÈ\;dWSdA!mHZv¡Úý›HµF£Eêx ”ÒK·;c9"Õ…VØ®„]-† ™Á$P5æ{®ÃâÒƒ€S}³oòß" A’λ«F¾ëz†t¤êHoU¸Ÿ:O$Y2Óy3‰F"ä4kŠpƒ`Å;Çr„±#„¾±ƒ6‚+ÖýX‡â]ß„§›<0PïÁFò€ÞÃ$‚†/´Ù.+@„ ¤‡yÞÖÓ]¡U1ø@\=0sö `ƒB¾°a>±Î±’¯Ø€°`HÃé4yæpò™a–Á³ò‘HÆ9yãkþi0‡4.‘”¶6ÛÉ>éÁ ‰KùII«3 xœ;ãÉØÔŒjü‚HÌÒp'"9/òx`<¾UœîŸ¸2[<<ñæañåùÜA iäG¸€w<k¥ÁDT5§¬ÅNõ¸œ Ñ˜MKIhz9»‰ªÑù”€X­&e¡S˜°òÓˆkð`城ô ð)HžÒ¶…ð‘Y°ò¿úFETHxÁF UQ p¤„ é¨ãÒ åc1áQ:Ù£ö$@#TþÐt0"MþœŸvÇêH÷B`."üT.ZÇ×£&ÜÏÕp5ά`MˆÁÐeÉÞ4 ULT@ Œ‡’‚#Ø÷J€â=t|Ȉjá €:žŸ*|% äcØÆÀÔRfKˆ÷rÂ}Ϋ‹Ö)5^Î[Ûj¢×­ ña±ˆdῚS ±«ap5Q“©ò£)ˆ¤¢f“E¸Qi›eŠ:áW'@Jüá d&>N£ÚÖiS-qKM&“Òs€mbIˆ  ò`xxœÊ­ÌˆˆŒý'òL ÉÜ«Eø¼r  Á˜ ´ð é¤›ÒÀ‘ÜKq=Ì&¥§Jl5KÒôFÜõìp-^œ%ë…økÔч›97ÆKC"Ë{f‹˜SF  uë‡Ut{§ „Ö#yªÖÄYª¤P^H-)À)©M ! ãÂý‘B¹}I»˜Lj«`–'m(7a³¤&|C8â’ @ <à=‚õoÿ6DñQføY¡×Á´#·2I:@¸nH5€Ü'I%ÔL½ºVSÈà£îçZqr€?åªqnK¤QÝp‘uJ“¥Î º¡Í$¹ )Ð_Á°˜M ¨Å"îPÏûÍ&@ T«KÔ܆=AwÄZÄI´Œ†¼B'# LnÕýTb;"<p7rÒy£Ü4³©Z€DCÀ8ÞQŒòÆBV½^@‡{,\ñPG¸ƒÉh¾þ «:aW'œr¢Ê¬bÜ0¤áFv̤.%0Öd º„[©mÁ£G´ ³I‹K.@£h¼Éƒ¼ÏÍ&w€w{‰*«¬6OŠ!•Ì\³(\•ýÔg©Í¦6O#/>$ÖIá;™d Â½G“X0J´/؇5uP€¯×€d„RV ¦ (jˆ«©”û¢\–’\˜üKŽgý¢STާõøÝdždÍ4¾ úcxUþ€ÙƒùY„¯…M Ô$¨``l’… ºaŒŽâÝ5a¯;gx[!8ÿÁ'FK(-Ï#sþp„¼!A|¬ŽÃ/ÀŸéÆð 1[¤§ë!“#£V3jÂKIÄ—³-*7 úÉ¿È΀‚‚ä›ü……PÔíãð›–Òr4†›œÞ§û=ØM ¸Cµqè~’¡ÐFšŒæ&Z&Á€ÔÄé‹Ì]nAÁ@‘B(·Bø+1¦+VXhPŒHY  2ah0°J‹÷Ú5 ;þ§¬áãÁßî F¥|Ÿ73 #†°fädër"É¢{À‚JN”YÀ¨;Á¼É>I˹Ø@“³ÜÍT>…ÏUý*ÝÌLcRÏX$3÷3ƒNL ì S¦z‚¦AM“_¹ß'!«ä‰5B*¿Â‰ µ8¢À=ãtJ)JP†ÌBJNÁ¿MÚ4>¥Ý&aΙ ÐT8Ð\a˧¬ÈžOqÏÇbÃ?¶|ƉH†-ßaGL>ÿ`@•¹ ïx+ðJ»SU œ™MÁ¢“¬íIæ¡`5YþC„´3ócc„Ÿ$ÜJ|2+«AŠS "?R=ÏÒšç±Cb„ŸUOÛ¥ö²1*4´Kƒ/r!«’¥Q‹ÓŒºÅ!•N‹Ó.…»AHЊJìc¥pÈòN¥2L©3ítœ ¬*ý„f¢uØÛ€ÛΪpózðlITO…ÃF«p”qÁŽ|EÑ’b`]Z ÃÔHWDOÈO2œŒZ|¿ç#UIΖPAr§ä**K~’Q£m™¤F±I¨ Úfj¢ò8’¶¤‹NB,¯MÄ” s¨5a\üäuÉ®{1x£‰-˜:mS‹³\€ý‚Í·JʪT9ø[žº´z˜lý’!eÕ½¸¤­dTK½2©[¼$.VbeÕòU3®v²®wŠÚ™@E3h¢OĤëQù«ËÀ'2rW`« ê‚SâȃS.9…K*©ž‘žÓG*ÅP˜Êÿ³ÂœÜ))0¨…ò¨|Ê0©d’̘‡†i‡=‘¹5väá +¢ÈJ“›†Ûé`Çz’ì$US”WˆŒ}xau8q@¯…_'tBy‚.WsÄÈ•Ä)•ðŠÁ°ë óÞé­Ô™¬w 3YyÍ7mòŠžâÞÊÈmLòXuÊ0Ï–gÜyÚSb£j„œžV)|ƒ'ÄRŠEVæiÏŒN\@3K+ef9G˜÷Nˆà>"âò‡0kÆû)d°¸‚ƘÌʳEã‹OjOaúû‚Þ¶îÇJ½ÿ.«:þ‡ïÿa¬öìþŸL\.' Bñ9}œÇÇ:—Ýíó¹jÜ>Î鬡¹×Ùæ/{Ù+ýþöúÚH£•þ#câþ?6»ÿ/#W¿Ò‘Åyt>kî÷òñ%-f¢_3Å\P`#¬“àŽÊ,ÅþÞõb)ƺ2ÆG/WXˆYÎ47¬z}âûü~ªû­ßWO[bÏ}©zZo?ÊéxnÇu[m4Åßí2Å|ðïÝ þõhýWÏ?µ>x}㵋W¿ÖüëÌÏVY†-éV×ëÈPþÅ¿MË©=ð—máxÿn•]׿ܷ`ÿ®ïM^uÁ—CÌ×|´Žžµ­­dx,ZRÓëˆÿ¨hÞÎ>ôŸbÌ;+š½±G¹kÒÊoN¼ûµAË·M?±.°ìšëÂ÷·œ»ü²¼Aܘ>÷=ìÜôÁí“–;×Ͷ/ëÕ«G°Ï%]ý¹w]X3ÛÛsÛy{6üôÊ¥ ·_×ùœÜQ;ÿ§we]ÎŽü__Óáëgr~ø©Ãƒ³]»jo›1 ë ½`íÁ§ï(ìÜ·û˜K[cG¯~Á½õïÿÄTÓå{÷¯ê°ùû¹qÏå/ϪãV,|ñ»?œ¸óò/¦­,x)ï‰~{øà7ÏŒ[õÐñu›B¯Äß\ïìù\Σ}Ž|ž‹¨Ap‡µÎ.jŸÍî”@VE!'4†9 v{,c9¯ß=œo@䥠ð Êl)#«÷ˆ‚Bä…5‹UÀ⫤(à(ðžr.VaµG– 0)€çŠb£ÈGÂÈ%+FÁœy'“¡Ï¬$´!£O¿#IhâGãóìÁxµFA´`j3–¹&Œô™sTR‡³¢KRùvpè¥øV$#7:ð4[¯qÊê"@°øÌÛÍR&ÁèI(Ø<œ—VÇdíÀª6|ºƒ§­,¤Úî±y,^Öžè±AÊ·&VD²ÉPœ”|(±zRÒ¡NµÁ_;ÄRhØ6åHê±AƒžoͰ㨪è 4UÄÉÖÇ8ƆìºyzD\¼Lg²¯· ±ö1~‡M‡ß[í÷¦O Áž‹í¥¦bgOÝ[ÃxtŽ*ŠùcäFZ›èU%ÐÉWMQçÙú£Õ¾H܈wõºáWSç»ú½Õ«¨”hV ü.=Z{ÚD˜cµ7<äÁÐËTg­©¹rªÕ'ÓRs›ËfàÊy§ÞeG=̈“m'Œ8h#ß1'§Éo4fǦ=»A°BÆ ’Òþ$§ q–ˈ*I 럄‚aDy=Ÿ›ÔéJË˨4þnI´87Ц/1£p™¡Æ³-ñ–ƒ"B¿âq&1IIX5ží™!¡ñl‹ˆu.ÓК‡®³Ëö|«3Zµ¾.tûCix»JE’"µŸù© &£9Nåä']…æ<•¶ºú‘æ•Rq H"4«z©ÆhŒhÃl‚•fÉs8©Ù„•¦T®¾•"ÓÖÅ’?Nëé˜MèH()Ì&pÞÉÏ&ÚKÌöÓyÚ÷éÅ„Oýý¥‰ÿÎ2äûЈì÷™¸hÚSC9Öç`¬.Æåsø<ú^›³[}5g›¿ìuf¯SëÿéÅ„o¥ÿ[Yèìºï¿¬&Ûÿ3qžøïŸÞ8zü{T÷gšôç£ýB[ßZRp|jÅ_'oíz÷{×ÏÛSØÁ¿¢ê>¯®îvñç}ºÎþØèó'Þ®\Q{|%?sÔ‰9÷÷þã÷WŒùÏŸfo¹øÅÈ‘_.êñím]Ç}e9ô¯µ}å½c÷¨;gÍ¿u棎½õƪž½ßÊ÷sd~ï»÷¿òÊÎê+×=_š³ëIJŸ,^yGñÕ‹¯8Ô¼kFIì…}u¯Î¸éÛï™fV>ÿÓ%ÇLW¼>û©Ú¡5ŸËýüäy}^[ãZ¸Ê´fΤ‡×~øHíÄÝsèÁû¯ùfË?©Ù{<à\}ÁÒ†·îíèÝQÕ™¿e┹¹«@ô¦œ«—L5—|Ã÷½uûM‡jνyé¦{Ÿìµéâ+'ôÝ^tÏÑ>{êÇl__íß?ìÓ‚á«£Ÿû®9wî‰sÞ:vãÎÈ„ïö;ŽÎÙ|g·_Ž.* ü~m÷¿T=äûã¨î¿nžù—Óº|~ã“¶V5[½n×Ö'z><õ·–Í[ʃzxN^vÏÆ1_<úÕÔ˶>>ôÂÑ£êý½ræôxnýäëY›/[ØðÙÖ- ¯ê¾½eOü×ε«—ÍŸWlýýÔ›ö>ÒÓvé5?ÚwDMo¾ð©xí·ÿì°ùÊïoàÖÚ7œwýŽÇF·|6öÐmçܽÒÜ%pdq—«ËŸ=¿òÛKË_h¹µëÜE?„+_šÿ[ç‹VÌì9·å¿Ë‡t˜8kÇ¢e×îÌY¿ü¿.+}|_ÿ±ÝËÿ£ç—7tô$z %oΧS§~Cgßµkßæ)}º_pxñ+¼=äï{VíÚw³ÿÚ›¦=ÛñðÔ‹ÖäþÓúËX:|3åвÕçâž~ò‹ ïì­\ñ`øÐÞÏ'±MǾ~'°íây½_µö™ñùŒI‡ÙØ ¶_?ÿ㵓ùKêzï¾Á}Åà Þ=°è=3÷r¿ÉOL>qüâÑ^Ätûrã·{Füz×Âm÷vžõërÛã3ÎëxÝ6S§[Žü/{O"I’•Âù£Á‚«ëÍÜv{ÓU•Y•UÝ}sÃôt÷ì4ÌÎ4]=·]Í\VetWîdeÖffõÇ–u?Då@9PeþTNqE8¸ûÏóDäDôäNî‡ ú^DfVägeõT×ÔIåLwgÆÇ‹÷^¼÷⽈ÈÈßú‰ßþ=ï­oýçzß«üÊ¿üæ÷»»æ7v¿óßùäç¿ý÷|þñÏ|ö>Úü®ôñ¯¿ñïgø•ƒ¿üö/k•ßùñ?i}sxñþ—ããÿþµ•æ¾÷ïÕþ³ó¯3ø·ÞïÿméŸÿë‡þåþúùß}ô¹o}êgÿêïí§¾ôáÇŸüd‹¶ßþîWÿàëÏÞYûŸú³OÚÿñáW¾ñÍüéež¿¡Ô¦8ÿÞß7“ðeY<_ OÀß¶,Ûsùùøüdü“ÙcñYAF‘ä¯ Er}“È5ˆ‹6TàH°"ào:.oCµg‡ûwjHå&–FÆ'åãôˆ‹x  2­ÈD®Ö [å\d&-BLDD`wÊÇ„óüôc›r%ëcŒ¿®&ÓäJ⣕M%Q.õc›Éº²¡úéÿý¹ïô»ÿøÆ­³;_\K¦Ä?*°Q¯,?*0‹+æÿ/Îù¯Ëó?çrÅúqÎ]žÿ2—+Öÿ‹sþëòüǹ\±þ_œó_—ç?ÎåŠöuqÎ]öÿ\®Xÿ/Îù¯Ëó?çrÅúqÎ]žÿ9—+Öÿ sþëòüÏù\±þ_œó_—ß™ËëÿÅùþÓrþg.W¬ÿgþo9ÿ3—+Öÿ‹3ÿ·œÿ™ËëÿÅ™ÿ[Æÿs¹bý¿8óËø.W´ÿk‹3ÿ·ìÿ¹\±þ_œù¿åüÏ\®Xÿ/Ìüßrþg>W¬ÿ_ûü_µR_öÿ¯Dÿgîl„2×l;8{ÿ¿\WëÊxÿ äD©Ôêêrÿÿ<®V÷ªO`Áõ†Y}?J-—²1†ÝZ ´Öý"dë’CzJ<Çw$µØÁÒà b5j±ï S²î§%ŽFÒHÚn»~‡0¨üXr^ŽŸLÎJº%üŒƒ4lyi}Ú°:æ@§äÖÝ[Pð¢µ5ðO'ظ{ëÞ­‘$íó\4<ŠCw´ƒŸAöV‹½Œ8<5Î?:‘ü”ÅÓa‘ T;§çxD“Ôò±`/Ï÷˜½´øùšRé{'C].ëìpâ/ßhjéãvðÁGCÚ±Mà¾í°]³s£c£ÆÈ¨”õS%‡Œ W€†–;hûB÷KÃA?ñíµ©C,–îŽ,wì^bߣ=ã¬lÀ‘ I÷ ­‚Ίš†õ2¿`Gd5B°?Y?Ì!·ZšëÝr¨{‡4µÖú£¾¹:9"Žî‰;žc¶ÖßžÀ<< ™VTí)ƼdžëZnO3MƾpŠƒª ðƒ%â§BEjLÅjX}n8Þ@3I!–C…[-ÐÕ[ÙŒŸ‚j¹Õ»t¶D+ÑËå'ë–WŒPûÉ ‡t¢is=Rœ\¥¹.µ\0 Ö w'0žüáÔø‡JCÏçD@^Û¶ vlu4äïí3)òÆBß÷Zë{Pì å»õ™à8¤^@4™ÄmT!Â{Oõ6`Ôàߟ0¼.ñº`í5O›MwׄîFŒ÷Çæèá ÔnR`{‹ØÂû®Q ?j"?Øl (Æ€šÏvš3Ó Ë¼š‚Å $ Þeí­?…ÖfÂUäÀ3ˆªJA¨1 Ó˜Âb~IŠ ³1…õ¤L%øuŸj1.ž‚üz!ò(±OYàŒ«SŒ¥’8šw©‡¯Ìêw²÷ž!±ø$—ƒ›#!»vgÐ ¾¡3*ꡚ05—¿žÅvÞ"û9¬ÔÜ7§jÁ÷DB‚C@'ÃÆÎ-¶üv˜ûÒ膕¾GúæÀ%j§7bjÖ4Ø–’æD¤dÈt ˜ºI Lý"@ÞZ«ëBïÓa¥T…öÙ„$iõÚöåðx仟üñd4*.©Úh©p`+IG]Èô}B¸ëh¬Xû*H˿Қ\K™¾Ò­­à0ºÕµQ)Ôfß÷;>ЭǾ“µN,ꢰóbQ®žl뺃ŸÛ= JÅ*ÀåHi‘%L£aŠ^×C µ,@P¡¨$R£×7)*0îÔ±{x&§ò ùgXEÌÛ¶…‡að9¡tn­ó2 ”àíg†§™ùýBE!§¡«'䥊Á„¡%(©ÉÎ[ÉÆË<üÖZ˜ìd¬\ˆXbT*hyë×µ¼þõ÷‡þÍØê&r^Ñâú`ŠÙÛÈôB¦Ý çr¦¸IeýMÙTý¥ëLGHR“R¢™®ÍmîØÞnBư\¼Lsû´cœîCa{Tã^À„ÓÙ±ûW8ÖcIö­APl°„ûHë¹f¨KVS¢±D´é`Òí ª¯½ºf\>ѸM½¶ }t°¸áÁ#Ã"ÖôÙ$ú&ŒáRÜã¹Ð\rF-êh¡¹e|´‘HdrÉÝ*2éÀô×¢/^€ …+P¼»7º£aÆjà¨PýN¿Ÿ³R}¿×½â½bëÿ¯ýýŸª,/ßÿã•èÿ|ÏãZ»@&ìÿPjCØÿÑø±Š"×åÆrÿÇ<®BN‰ïQNÞ8Ÿù»A& YΞ^ ugˆ_÷‡ì¤EÌ>f×Ú‚·W€ëí 3“}››lŸE£¬ËòVÞ覑› J)ëÆD¢m I–ÜH"ŸÅÍ}[‰¿zÈ›ÇBle3s÷IÊ®“IêýšöžO¹E¨–»E豩ù1ã])ÓîÅ&~Ôvd\w ; ¹zs›- ðã¼…|ê­®Ý0j³ÝñêD¿=ÑE×ìbÕ™®ÜQY\wׄ%“L_ßâ»Ï§´%øCÚ…âLäÚMi¯½,ïûzü;i³;Ò–éãå¬ Vë™îLÍœb£ƒ}ÃKUÅüí›X¨†®œIS!jȺgµxU´½›\Ê óE[Òšì)Ë…­…^؉³Ö Š­vó,Ô‡Ûû|ˆ•VH›©ª"ÄbZʼ”‰ZÊ\…kû%\5Ñ;ùîÉj(î‘ò›WVFŒ(üØޱyb/Iû$»…wsÎF†k³‘áàcÖl±®8á:^C€|çÛ YsÉ"Ôq,;»D«ÓÕœ/¶~q8s¤Ô§®„žaº×®}¡y®ŽÁlî”äuuÚ‡ˆÄኰ{,*ŸØ—3Ù[XÝT‚Í…í\éÃý’3oOa‘õðÅ’½”YþiÛ­ü¢-y—zP®•N‡= È³·LÈ»`Y÷™í+ñ…Jèµ3Z²¨Ççá&–é%ùSD_àŸåÝ:©”ä Eñ+¿['ø‘_¡[þí;6Û® ·ºáú»bØ[u8µÓµû8§yÄðÈ…aš8›øžÌ;J’w÷=}vD¶Ÿ<'ïnn?9zþ9¶ÒlC.=§.“¸­9ŽfyW8í÷ÎÞáÎ#(¿ý`ÿñþÑsœà{¸ôd¯Ù$Ÿ’mr°}x´¿óìñö!9xvxð´¹W" g&"ø’Y€¼æPb v.´1°p’P#š»Äõ®Ì0«DpÑ æEYÖÇŸ‚µÖqâ-dI0„›><6ùHž[zÝcÑòšÿ‹ÿçûË÷ærÅü}QúÿÍçŠéÿëüþ‹ÿêÁùÏËùŸ¹\‰þOx›l¯y¡õão•h¿(;òãÿjE­ªÑþWªuE^Æÿó¸n¿yÐ\ßÖí6]WJéöm¶[b¢Û9ç®9QJ Y}nš´Od…(Õ­*ü¯“gG;D©TÔ5¨ùk­2>®Œ, íÈðLºEÞ†Û팺P„ÍÒ±ü\\ð>Ø—[¤ªây³J›UÈܳô»ÇÖ„%â;,áÀc›ö™TÞµ½]£ãaãàÝÂNO¥ ‘’Tv©7è?ÆíÈ2J=Íy)•÷¬Ž­~â›4DQëù+€Är+¾6ŸrA©@%•œQ-ןk&éÂ{IŠ‚Ñ}R­ÔIy{/|’áIë@ˆ¦(Ò1œÎ wjÒË0¹ɺAên˜XDPÂóqmRh4L¨B„ôú¸Hƒ”w:T‡àG Òd@c/‚ômy/‰† àöâhÈ€Æ^ ÐØÂ²÷Sà2û x@ë~^RžÅ‹˜”ŸGi@#ÏZa! ÄVm3¬XjµHÅP«%±«A³Z¼Ù4¢kíZ× ¥‰]P$:1†«€   4‰‚ §qTh”F9,Qx€¦‘1ð€N#¯-èÇÖ¼00¶"‚TÔìH›u€c'Û¬*v¼Í:ÐkGÛìH ÀÂvaê†)PkísÀbl³¨ âm6€†A¤Í´y… º *â«Á· žP Y`³D&8¹¥u@Ó õµŒ Œõ°Ø ñ aâÏ©aé§¶å±¾óŠ›+n¢‚âC€Í¦=Iùáþ.±(¤€="£!éÛ}ö3"Æ)5]Öa ¯™f˜š¶¸c–Í¿:Ç£Êp;Œy†EEiÄ –qÉ]?´A{ˆ@›·ïiø&mzæÛÔs²2ê>¢æ9ÔŽ–³þ´mïhN‰Ô¶£ÙY@v콟•žÙxŸÚ´˜™ cRÍñl66HÛà]"Ã]ðïÎups¾Î`ªHåŽm;ú:vßú©Ö3Ì+é?†…ÎÏdœPŠAb¢š„Jñq;šI¹D#šå}뼉I5&jr©ÂÁª/XYPŠ~™ÐË ÿ9‰WâP‹dµ¢¼àó_.@µMCÝ8>ò¡ lŠ–1²›$Ö ¸³L 3«ÚžÇ«ÊiUë)‰Y  ëŒÈ°Œûa ®Wô5¯ËÔ‹€¹pì—4‘Úµ/Èõ\La¶QÀ†DÁMPY6³iÕߤ;Œ$¬Ôd}¯D*¾óo[šéFÓ¡º¶ýÒËzþ„&ÔŇðáD7ŒD° ³@¥8bÃrO»ä·oÁ£8Ñ$i% +, wÐ&a‹=[ǘQZÑL[Ó™( VÍÓØfnäw®`?ãY¢ÙŒæEú˶|𯸡“É*Ôž°›ü‚.“¾ÞÕ ßÐ I¸ ]L Y¦Iä Î É7êbX¶¸>üŽò£~ß)jbX/A¸˜æÙQ’ñ¶gx¸Š ÀìA|æØ~g˼µ •5°= Æh߯ìë§èœáÂ"8ÿ=“úo:4×YÌßwئ{¬á‚?µk¸ºŽTj_@&e£Öˆ q*‰9àavYp —zü>:oݽû[.|ëÞ½·ˆ«Rb[€yLÏÁ‚Ëþ§Z\sëlêg²ŒqÛ$’1Êa ô𾄨­Þ½»#’EVùß±X±{÷2б^æÈ»ŒOmª²ªãÿñx ´¿‹Ø.èK>bøsFêiÀO`Ò;`B/Jâ ÇÖŽÛ·ÐI`Ïa.ZhÛcÅJ• d ¿Çz&ɘBÄ%9éöÊÐb™ãÇDlëq?,Zf¿CÅOivœçS.xèXÈ5|ðÇ|¨*µà1ò0m‰\fÓ wrSÙ ÔÙ¼“{5e¦yM:n€‰WKªBð¦^‚ð_)Éu²Æž%³'ÿncƒßUKÐÓaE–ÎjÖK›~Yüu"]2—cßÐ+nÙøè—Cà¢lŽIZ'½†…»{Ø ‡¡Æ0J¡@-Ujuv!;ÀÛklFÚW'&rTKÊo‹¥³ãö‹6[oDšÅ`ÖËj/6 M¦ª`ÎÀ²À¤ƒñU•$£hÖªq4½L¶Ä¨¯'‰®Fû¤f2Ž•ÚIS”ˆ¤)JQI”ç³$E}Z;HÇj©áãwsÊÄ‹á/]òææ‚#¸ÑüR ÙݼÑl¨šø²}6ã¢"T¯ €‚w¼S€Õ7âh¦(FzªmbÛ#œe²^¡¶òmS=ÆlÑ UâHUEAl¢© ¼ÊB1jCKrxl¥EU¯äñDÅ  Ÿnzã7òIe­¦6(‹³ƒGSš¶it®²'Fk¸^ªm¾X³"Y-WªQR·;žqžÁåÌng ÕJÙ,Ý”£Íì[Z¡†Æ“ªÉM66O°ë1Áš€S>×g„“ªÞ´©‰2¶Í¶ß⤛Iq¤—Ç4Ä…?)iÍ NÀ§É‘cœQ‡c6ŸÔÐXËcÚò1LV'Äoÿ#CÀaì”Àa\$Á¹^/Ñ!l‚¯³wñZ± ޱ´PùrÄ+âAEü€K‘ŽIù‚›tìÏ]É*à Ø@¬Z~`;¸•óðKã]GîÞ%åæ §Ý“ò³Ã}þkõ~ĸšr­°õºÔõzæ¹wÁ…0ÖK©¼ýäI0qpÝX0ð9=§¨6ØcŒÁ#Ré?Vćœ˜/+´|õ¦ò\Wèga˜È`ê«Ä~q«å'f…¹þy…ÔÀAX“ýó RÛÍf†±M©™ ŽLC47bl4¦ü±V££Ç¬ 5 ÆtU€[›Ud˜Õµˆhâc¡þˆxaÿÇÞ•€YQ]i5¸ðÐ8fÜ*3«»Ô­*×!MŒ b§»_·´B7_w£¨MBbP1Fù”Ÿ/1&Ä1Dã–DGæÓ@\£KŒKÆ}æžsëÕ½õ¶®WõªCfÞû>x}«êÝ[·NsÏúß*o]ã,’:ßÁrY'ï8¢Æ÷–Ó™(¸ï¨8Ð[n¯”¬÷Õzb=Oêì•­ Êk¥ÅC2t¸±VË¢ò;ªTêÂP¹†~õ|ý³&dU÷˜0/ \ÊIÊ"Ë뀾Ÿ²ÕµDRV¾Aè“D—ìmÝ=•{,ÇF7Â÷#Ý}—úÌwYí© ?BihÆzj"b wT]ˆj’´\¼AÏ“¶¡=G Ó³«wíŠdýóèª'µžØÎ¥Šý1sí;¶­»¼;Ï 8©Õ1É5­¿Eéeýég[Á2lm‚ql72Î ùâפ‚2R©WÇ/ñ(TUÕ¢.…úÈçx,n}Dtõ)‹ ’E%¶uÅ®“ùKfœdŠƒ/™EÕ¦WNuÝa R¿ä´ :” ¡×(©:À¹úU‡ “%WLYÉ…gTú«}PàÝä!¨ð56„‡ƒº=åôo§Ìœº…mõVñ“¼þgA!n}Ö ø¶Íƒú?Ámá:PÿãÚ¬ÿŠ^›GÚ ÂñÝŽ¶6Çq©èl£]\¸¼ ÿkß_ó“í'9ÿK3'æƒð?ç¶[Vÿg7ùH>ãfMž:Ld¹q½¾buΑfqoû)¹I“òÓUžœ\ñ­–üÔîùPõ’Ÿ ïÊäN@p•öo?[|ŃÇß»þÏýß··t×üø¶™·~òðW.³lÞè¥Û/[3þ;wµ¬bùºÿ±jåŸ?<ïßÎøá£K|®cÓåÏnèýå±ÓÏ÷w‹?Øü/¬ý7ïGk‡ßpÉÜügùÍ’ÉöðƒÇ[ÿè!ïŒyÔ!øî^ëö¾õ‘³×ßÖñüˆe·,Üî¤OIëí÷̶wíøÅ.ï^»jºݵíëykÂÇ¿:æÇ/ì³ö{›ÉÞÞºâð—­8qñö7ïú]²yÂÞÓ>Ë¡?Ù4vϳ¿ùó×ÖŽºþüï^xäU—¬Ë÷Ü7óàíÎZÿ‡žÚ¶íœmŸ,¼½í oŽ8ö€ëvyúw6Z9îÂë¿>âó­ëÞ9wÅŽl³Û%ï¼ptÿe÷v,ße÷[î¿þëÞqü«ßþ¡÷ñ’Ñë7¼ìž)ò7.º§ûgûíóøšC~ÚõýÏ\pÔÿ<>é¤ÏÞqÚc×nØîÂé>~æíÏ~ù˜×­Gþét{Äô—©{ï÷îÂûöÜwÚü;1ó°=Î\÷âIϾz²}’óÑÈkæÎØwÞã.Ø|Ëî÷ŸõÄ’®‡Ÿ{ê??Ú£gùš‡.ßÚ9⡽þøÛ¾Û®;ñÑGWŽyúOkÞ<}ôÍ_œÀÖ=?xÕÓóW]vò°;æ.zqæ¾_{e_¶*÷üÖW®vCßÊ®ïï¿àGÿt§eGù…Ë7µœó÷o ½ýÈ»/ùÓøÏ~²õ9×O–ÿÝ_–Þ1êå}ölÕ¹çscZ\»ßŽËnúå§/­>éµUïíÜõÝ WýjãŽëVpÓ7üê—/>/½ú :ò#yz8»ýÆë_;÷ÉñÏÿä”K'¬^°yç®;×®Ùëïí:çƒÃF¿ÿ.~f×#\ÑòôŽÏ¾vó›%ËÏŸûó»6ý~Ñ¿ï|íEWŽýÆ5w/ÍŸz /M{Ř#ΛrÑã¾8æe‹öøÇ Ï»àYé}üûÛwiÿÒèq» ?ᬭ—¿ê?pÅò5cÇ.{ð¸žZþÂMß|}Û¿ÜýĨ_ÜsåÎ×Ý~þ'#-²ÕÎÛ¼Í —¾ñú’ëVýêá]o_8»sþG7ÿ…‹:6ZO~nøß>[¼tõãÍ~³óâWž9ê¢íϵõæÿzøê³ÎÿèŠÛF‹QÿúÁž§o^{ë3S?¸ïÝÝΙuñSøAëQûÿlÑO­kŸu†;ïÆ½î?nʽïõ¾°ìµíop¿uüÕì„;6^³¶ó˜—·}5·Í?¬¸ë€±ö)3†¿>þý‘wüzä,©{Ì(ÿ#{¾_<Ä5oþÕyP\ó3: Ým‡õ.¶0¿:È¥œ›Ë·`"¤eË«0ùŸ‡ƒŠ~Ùɬ¾ÞŽÙsòR„XyØã\þnÊâÃ8!ê'S¡PlH™‘?´§§w ŽŒÚ27ð͈ÿì¯ nš…7má][xÛýVþ¨îB¿5'Õ’›kA­Œcü”Dç+/iÀ-‰‚.XÉPnÉó §’ËÏœ5Ã"\è—\ˆ3ÊŽG‚5“*\æÊRô9éëùC寎i™VGˆ1—Ÿ ¿€gxÑÙÞ>ê÷#5Ça’¾¤líªæêôŒ'Ýââsl1È@³^΋žõôÉÃÚú;áeÑ™µj:pL ‡ˆþ½Ñ¹| ‹::ûÆO™=Ë:|^oÿ€‚ä²¼‰Ä‘“ÀÊöîÞ‘?ù@‘²9DÚ³ŒËó3z ÕNEñãKkâO¬Yv{^Am?QÆŸ¨*ã÷ƒ’Èùãß/|Š‹û:»r’YNÃb€ûŠ9V—#Ù¨Îô„Ç\ê•#/;fÛe¿…Ý—ËŽù~ ù­¥Ç¤uPv ¥Ç¸[6vùo3Ž ö5úå¡JÐ[zåóG±5„]½–’*ùi“­9ãÉîwÿyÖ±áŸíf<¶ºå×û•™›C¥¥­o6ñ™ý·c©gó)Ñÿý-ÿöÿnâ¿dÿ)ÁêÜRè/šô’O ý»¶ú»v“þCñ‰Òß±ÿÚø_\(üo»ÉÿCò)£¿FÇíîTÎÞ¾3Z[a§M·ì/ø«úÿˆÍ˜ QúSêR·éÿŠÏ–…ÿå ùÏõ›ø_Mü¯&þWÿ«‰ÿÕÄÿjâ5ñ¿šø_Mü¯&þWÿ«‰ÿÕÄÿjâ5ñ¿šø_ÿ‡ñ¿´(þ—ËlË•&ûÿü/Ûr\šK`3為 Û(Òö+TÓÅÆK?TÍÒ\ÇÕu#ÅÝþ´Ï\ΰ\±ô!,k-Á)(-'¡^%L°ð¦Ç¥ä ]¥R»­2ALªÛ]îW¡z5Rê“KÃÚê¸Ø 86uõ^\©¢B9`ôV;\ ê×zÓ)¤*Q]Ó?Pèî8¯X-H£åOQ ƦiTÝK‘ŠlâSK0Hãñ,áÉoâ£+Ö¾ø”K]‹ø'ImùðI\çÕ!ÜÒ‹iòÁYÉ5ÕÞ–Ìú_Õ›!csPð°Š”ËwšÁÍbSèÊW¸XÄ«³­ÌX.!cA!¼p˜ÉXó»Û«rVCØ«2ñê`/É0Ø‹¹²I®ðO)ª}_³—l'§B„œª|ýqÃóîܵ¨GðüÛP"š%û©1¼âªF55ž­.¬3ë?.ûñlÙÏ–ô ïSÕ,ò4µèÀ‹kHª8ì׈᳟|7 påÙ(a¿JÀ)د2ñ’¯n‚É&“쇲—É~”;òúƒ²ri A¤¨üŒ÷úÛf©3RMr|øúC“¥b¯DýÇe/'[µÑðCRÇÀñ…Õ-yc*TWÓ ”XUô ²`¿ì¢ÅC7†•*ªNVÒö•J"— 2‘ê!YI>SO$jC4È·g¯$C‡³-_kp¶•V?¬¯ë¸Ì#²d¨.7j‡acSÛ¼xq,k» 5f¸„Œä;bŸ¬ƪƒ• VIAl®G¨2´¶p=B8 ƒ‹Gx ‚B[¾…°SC]õ0äá¸Û\ƒQy­ô s@’ç]­.2É¥Bþ†Ë×Û•sâ ~盢òÅòx|ÍÈŽdqÖP9Ž#…@8ò^²dtà m{õÚ…<¨îÀIÁí ûËò®ñD<†I<Ôs0³$1ÈËÚ<#õ±Ð è=­Þ¼!Âz*N¤("=Í¢„¦ÐpLp±ˆçÞÉr¸Z`’E×.œ¢{O=W-XuêéÿjaØÕ/‡Ü/æR¶86`>s‹3i~ºð³åcYLCÏ(2‘j.à ¬ä|œ°ÿ¸|L}¬Û–¼îHÕ V››/¸´bóqr0“¢é`«h_ªé-n¶’`¶¥ªÆkɸgØHeþù:x8žcžOdéü¸~jOSDÿ"’ù#"MZGš½D>Q€gÒª I•A*‘@ Âó(&z`áü9àêó®Åå2‰ß®@vãŽ0ÎûçpÞÇäSPM˜Ñ?˜>TªTª>$€hô“Ã3Ʋ„¥¦¤Qqá¥ò´,ÍŸ¤7I:íA¶ YãØ‚àAa´— š´×ª–*‰Ì'xpB>8j[Ðr´îe;F+ÄI?T-ŒHiçr§ºÄQÁF‹XñÀDŽo;µ©ãFå‘T1˜8 —h G¿!GÆŽ¿¼O„¢P€Ÿ ¹äCVZx‚iê!źø,œl­cá ¼‡¢uäÓuñŽÒÈ ûËw•Ý'Jó:7¼ Õ ó.4EBi&IóhÈp‰Ó<äš`l¹Ø»°³g^Ày%:a%¬õL˜ÖVº¸Á‚åƒu"-Gª‚_¦‡ŠI‹&Ê8C˪‘yÆNoÃ5Ö_5d‘”xi‚W ûmýUv 4*`- al`,ljn`ŒM½Ë,^k‹èªë† —4`íØ‘}¤{çµ.èžß_•ÍLû«¸¡e ^«BÉ:™MoA}µÙ *0ù`6Æ MÒwå1Ø_Œ[À˜àjf$[' ŽAuFPïú¦î Ÿ%aÿ±™˜&¹ú3iüq&,n§pµˆ|¡K®9ÛÎF:ZÈ •!UÙ`ŠÅU¹Ø,®z² E7›Ù¿ò­4v¸¤‹¬´™Wî jÔå#. ‰|¾Z(¤Ý«t¶n=ø.à@¡`8e•‚ãBòg 8$ãlfCgã[`D9ÞQŠ8Yÿ±ÃΑ=ÂäPqg‚>±P ù‚Óeú_!fÑÚ:¿÷ä-D4 cÅ›a°˜âôÃh›o6“ˆ†† —T4pÉÍnyèZÑD’¤.÷mðQê,íPnІxuB(FLZ9¨TØå\¢åW9SÌgX„»¥˜co¨î†~"PmŒf¢øq¢þcË Ç !Siñ@Š»TÄ8KDîÌ3äFgOoß–!3Š“,ª÷`ýío€¦ŽþâŬ¶¯¬¶ÌhÌpI­ HƦåÁgEºFI8YoN*RÙ4mú9•V­¡Z@Ȭ[0î!Súa¶Âp¯ï£Ê¡¾¨ƒ(o(BlP9âÊ¡êv‹gœ'Êy¶ ·çmœw:¸4-9ƒí¤¡ígkÏÀ,\ð%¢¡LPw&c.aÿ±E0Uxž’fàp¤•”X‘|Á#å"·Ä”ïèüÂæÎs*ª ÂÃfQmfJtj6“äÏ5d¸Z9tð^Û¤ŠTÑO¸òE×¹TÞ¯4ò³†;4m.™»ö&¨Ànâ€&ɽl=Càž®í Þˆ"͉‹þ–JI²þcK3ò§ º$˜ $–~¾à:†DhëéYÔÓÑ ¨°[ˆfÌ´¨*H‘k„Õ°©#xñ Q¼A4“† —T3!~$ŠW”!Q¥£”ýW¼¶ÌÈI©·¤Í´§PvcÔ*`ª«²ÁíAýhdaõ©œ‡:¤Éú¦Ë„ ©¼GU¦‘9„¼gH¼ÿ…”;ÐŽ³ª1 _!¦=çx6Mä0aÿu'W¤NÁ.5cCQLkdH+ß´bËghÄú’Ðr ~ÆI0bªw˜¢¬½RÑóReÀ$èF" ‚¢C| MUÛ(â„* ¯Á’à;jÉ0OQ¡¹ ÇY°dP#4x"6ÅD0 ‚ùqÊ1`ÌP¤«!C‘ÍTEœÉú-hÄ›&yÅQ²ÄMQÅiç fIF×¢Ý[ˆ0 ¦X”ÄÅfQ:@Ó ›x±[»¾s0_Z#†KìKXžòÚO F½¡¹°ò3mj K óU¦†Š@æð*2GÉt¡* ®4CwAYc+™°/(sXTæ¸J^FÈÀ‚0ÕT‚YNÆî3hg‹¡Æp´{K ®inšÆ}–¨ÿØ2‡—ÊI”9,…û¬#_ÿŒÊñî-JæhØ œ©v`'n VÛ›Cæ¤.±ÌÚërOP£^ó8<”Zæ¤N6O*sN.3‰Ì31‰„Â*Ùxÿ PL“ÌõÐ;¬Ã1=©Ùš\ _¡*kGÃ$6ú£Ó˜\‰ú”ÖÁö¹â>¹ðŒÚô«}mݰ¿ªÚVí)*ú0뇃²§œþí”™Ss[5?ƧÐÛ‘‡½Oç <_pìZˆÆ ÂÑŽùœ:ưåGpßÄullÕVnoEˆä?æH‘leKu×v·²ìÌfm|õ´õYÖV'÷övQóºÎ¾þ¡¸¡¡ýtµ‹®vÏï £.w:I›çœv:v›àõ¹ùùü$ãÿ……®:ƨÍÿ„SW ÿ;Ìæ\pà—ˆ&ÿÅgܬÉS'‰,7î¡×W¬Î9–mõ¶Ÿ’›4)?]í“.«%?µ{þ@gŸ•Ÿú¿ì] 8”ÝÛÏR^ !K<•,E³o Ù "Ùʤ…1²ÎhfìTZ,¡Í’%m–Ù—,)E)Q²T²+%ámá훽ï[ãú¾ëú>_×õ¹¯qq?÷yÎ}Îï<ç9gιï›ÙWô³G’¦&ó=N²÷ùž/&<$ËÜëüsÇ„EU^ÍŸDi¿ˆ à 1$Ú.k‘mÚtt:È·±JÅÆhƒ—Ñ«` Ü´Ë¡ð¶<>˜r£Äð¨ÜÌ!šæô«¯Óoƒ«îíÕ\3òáãíDbÃè)Áz™d—9¡Ò73)‚ß²fú¿Vç>¨jíEµ6­¼uê¯ ¬Ü·/׃ìµïU . Ⱥ%¥Ét' }»ù… Ú!×ñ^NÑgòæÌ·É » Í´¬C¦NBšØÔÉîhxL-¼:¹k'mÒÒm†êß?ÞúmLæî!÷j9®¢ëÏ˃oµ‹úöñÝÅÐê*õ@϶¢w—Œ˜|¦¤0Ðßo`Y3¬K±¾ìØ'yh\#~ÆØëdôlÈû¶UÞ¡ûA¤Óº×••Üm¡£¤ªu¯GõU§6hëWßv«¾{ŒPeu.¾®í|RÓ~yq%ýäfœ{÷Ž,¡Qí êG—JLÛ*¼SħU(ºûfÒ·½ŸDî–GÁ2Ü¢wó6œ6ñ?-LÖ=.ùµ>¢sàäÇÌ?ûªÒÀzïtÂÒšCìt–;µÝqKßZ1Äå_ÃÃuß±GÄ9‚„“Êõ;æ k¶Þ3Þ£·R¡ïsåľz—ÉýQxbíÞ)÷Ƕg=÷G´ÙR‚Hö$ôòÛí”ðýJ=ùìÅqŠ[¤Ej°×Á'Gù¥JczìÙûUŸóDlƒ>—(pžX–J;r•§1¯Eºwýèå¦k¾¾¶5y‹*Á«vº:¿½£“t{“s²š'—¨¼BÔûÚ ûX9Þém@™ò'JÁõ K2/m_z³M`ÒúrìEHÑÕô+ŸÍŽí-Æš7?üp¯Áô\…†kzʸFŽqé­'œ$š¥ô/%óHWu]ã_Ë[œÉƒ!hNhÝz8½â]÷m3L<æ27÷ ºŽ BDî® ;ŠÎ2;zØdI·C"¢»UC¡}øÓ¦ûb9”:ºýjÞA¯@ÅÁ‰¬ì³›Žú‹Þ¦¸$Fá,õÛ Iø©³}µ%$V?¨þÊAìÁcÁ»áÎù–ÆWø×ZŒîÙÔò®ÝL¹ñbýÛ ‚;Óbžv6]J}÷ôDB—Ò‚I€”´TêxfЋ7Ñ—åµ0J«)‰X'„Ûn]Ûª(óäÁ§¬is«<ß3bÒãwD@ĺõ£4G2¢[<Çý'ªÂÌ'tõÿ H ¿TD¥xLéæë}€ÌÔŒ6‘^‡nÆsáv¼á©’‹¼o½æ™D¿^©VAsÔtÐ9ÒK‡½˜´”1"¦4X6 ¦ÉæÖiî ÀõVãl“2‰[¨O„ýxÇtŒá—iüÅó¶ò¶Mƪø‹eê’/Ëõ~Ö ¨ùÓÊÇTu¬ãiRÆZ±‘Þ- ¢ÓÖ}À¥áÜú«Šñ;ï@ÄTã =-‚ !jm›â—ãzשŠõT¦õøñ%n€´ÖF„Åf& …—ÈC ÚZ­Ég!Ê™¹ÛÀžÙE¹5‰†ñwë÷¶¹9•¾³‘ ð˜!æO–;]‹Õ“¾=Ù`|gœ¤Ht䥮ž–'êý‹cõÅŸtчlŽžÀ&Êí‹ÙŒJ½ÌµÌ&²›61èÝ~iìl|²ƒdÆåœ ŽgâúòÞØœ¸ÓÜmr_:Uv r&Ò{TídwÅa÷Н:ýÞßókTw0Œ’ê6©Úšƒœººàã’ä?æƒW¸áeyZ¹EË@òŽ‘x¹Ù.ãSÎóôVÉÆkŸjÆB–iu”&¥ÆÙ´ßæD²¼û[?ì^ÖÖñ:Æ{ÿEø¦Š­êŸã“3o.³.Sé,_¡Óq3¦V1tüp“Þ£~¼6ª¨èpno Ö(h*aý¥-]5F®ÈMÿ°Âi¼Õ¦Žh.$k®È¿Ý÷ÀÇz=.áòE4¸9š§ù}‘@‰¾«‹TÞÙÁïµÆð¾,î\åcÈr½þ)ïÉÍQÚŠ¦Ï÷Ï8Ê¿K%÷Ú®ú?ù( ­sôbKjdAÝuØ Øžéj½Fqc†öŒˆºuŸ+Ø>oŸ´A°µŽT|nó[‰sz²yR½é¥m9…þ¦û䲈IcÛƒGҲɴ¸ñºÆä=CÏ× CGMEm%kSóu Ô´œ.§+.”Íh|yÜQßÏâ¾Ê²¨„ß=S_ÂÌše±£S„}ñF'O ·¥hài!´PË£Žq‹Jµ‡µ•–Z†‚(~ëb’ÝÆd#ßË7ŽBˆë«’ÌâðøÝ e.˜ññ'ÜíZëkœÏOÖ0O+P˜0Ã]è‹Ö¨Ô¸”þØX,ÌGoµE>¥ÿ8w¬™ˆÊ¤âûâ-m²»ãöB]E1WŸÜ(@¥5ÁqR¤'ã±*™&q©·ÏžÇ3>Ù¨e–ƒdâ}nûpñúû"ü•·E$ÔLì|ùMì$?U@Æ|¼Ï¦Ý)÷è ÇÈq·Õá4=ŸgÄ”ˆ¸ÐåÑ£ëÛprÄã*1«&!×öž¿í霰”='•ªviÆéÀd¯mfþÔµ{;ÎË T­N.X•²¥r˽2ŵíÔ œkÞ%U˜l}¢ÕiãöÕínù„nÕ`PŒV§OÚyS€V÷ÌÄ­Ev¯ÝLätð<)òæåØ‹»Ç‹ƒ¥ùãñ†éûèÑ)w ìÒûº¬Â–êØ Õ ðFÍù“?Ûò d y¸ÐkD&tc†b½lÜOÄdøÞYÇ;uq²RÏLN´pðRþ3ñÌ|Ô Q‡ÒwÙ„§€y.ÀÃ,©ŽÎÿk?ò@Ÿz²};6­JíKaðç «epàêÖ7Ò_4ÀµÅ¶{ˆþa~\û—ë@Lb ä´’þ²²í¹Û'â¼Ò>µ!¾Ú”>î )Ûîª>ÞÞþ:½øóuô&/^X縎â{¯'UßÂãǃbÖ ú‡í ¸Ÿ‘“&PV‡üùU§ðôéƒ!c¦ÊA0îQ®ü3µŠ'É÷H<§lQøGmäW˜:·¤¯§USÊ#În; îþ\Ø}ÒM~WjÏàºÉs²R]‚}Ko$è½Ã*ÄöDtÉie4ÆTÛ µŒˆÏ þØÓà²gÜQÏš¾׺DW¥‹¤\Ùáú§ïÛ©8Ùñû †ñ¹êA}_ýÀaHÔß<Ä¿+"+?O˜ùË"Ø”äèb¯Cñv1 ÅÐpƱ¶ Ðë#¢2ÖΜ¹xb°I4Š•H¢1nbN¥-Iô]`ÆÂ [‘|éŒ|ú¾tCKVVt6‹…‘cýÃXiµÉd ¶ Ëb°‚m3’YYè¬t¶0(b6AÎ&¨Ù=›`f“Ù»ÀXwÙ ÖeÅP– ÿ.í{ÕáÿT`Õ`Už€M\iÀ.ÐlI»Æ¼ÚBÈ ý¹Õ"öt{wÊþ¿og+ ÍÖÊÿ4¼ÍÜ€jj~IJ ²ÚôݬÊò ÿîYÎhØ¿MúX}Œÿµù¬-Œæù [2™MÿÝ|e½÷,þ£"LOÎÌx[H(€EsTcþ•ójå¤ ÓT>»¡‹ÄrÔäWÚÍ«Œ3DÌHÇÐÙÍ,”£FóDµšW8Gˆ˜Ö4(0먘³"}>Ï«ûÂÖS ,³§Õ9÷•_ð2;¯2HŽ…¾–yåm‘sw™Çu弊 8¶ óÀ,3Ò3¨ÉQ‘_w`7¯Nì£ÐÏeú}ÂΙEpnœ_q¡5¯6ÎÚ (ÊŠfƒÎÛ}9;j™WŽ£.Ó†Ê4oaùà<êrtÑ0Ÿ0Žc.K Fÿf©çÜg8ZmϫƮšõê²ø÷Mûaø³À€0?_ýS{‰ù–ãIîÞ$º Ñ~¶RLÞ¿%3YÐîþo~ÆDÂÑ‹H¢*é[š†ÎF¤ºxÒÌf(’Q ]ÆÌ†i»®Çx‹*é©Á PCAŒQƸnJqüO—XY)T%G ð&QiL xØf`§dÊøfIòX.¤ÔàŒ °¶Òeú(@Ú)3²j{Ñ9í”X¿§Û)[í©4ßÊ…îNR2Tþ§}©$'c샃þÙ„0ÏÑ€ðgž˜š½Bþ›‡D"çðàÌÓì<¦‹x6ÂÿØåsï‡föx¶r™†AsäP9< ÅÎC@àˆ9 ³bF?bÍU°Ù‰ÌNXÁFzÀ.%sÃfí—+·iqA¯½(à¨<—³ÄÚk°§ÒY‰FÂ÷òÿ‡ˆmÿ þ_(ƒÙ9ÐHäÞÿ‡°öÿ‘( A×@ 04²XÍçÿçûløÃ~ü¡‹ø/±áÿmð‡-â¿Ć?â·Á¾ˆÿBÐÏøCíüQˆEü‚Øžäï‚?tÿ!6üQ¿ þÈEü‚ØÆ‡ßÔ"þ BløüQ‹ø/±ÿèßè"þ BlÏ¿ãï‚? ½ˆÿBÛóù]ð‡.⿠Ć?öÿ(jØâïÿ Bsðg;åÂ~t!ùß.ƒ 0ûO†ø×þ [A‘pØ¢ý×B³Ÿ'‰Êh‚ý$zgìƒ@v4Ë>SÒn¯*C–™0¥™éOAɰ 9‘¨$2‘²s·w ¹üR? ²s!;’|È?Äuÿ9æ™Ö¯è Y9“æU€iºèåH¢Î$wF¥â±÷,ÐqT×…SèAHsÒ:>ê<Œå€vwö¿ª¬F–d[õGB’mŒ$ÜÑî¬vðìÌ23«B„BÒ”6üå7ZÀ…‚i9I pL€pJÝ’ÐPZrnáä8¤„4ôÞ7ÿÙÙ•lËãm:ïØ«y÷½wï}ï¾ûÞ™7÷ŠœªB¶(+¤Â)ª M¼,iŠ,<òFŠŠ\&4U‘ž¦ ˜ÚG¡:Cô±i×,Eµ…ŸÒ+Ê v¾Ëfen GÛ¬âÑ6¬0Úæ¬! 3;ªidô ƒS²¢cÅ„(ŒGJ+:WÌQ¢ž £ù§üñèòÙ¹!n´mCEˆ”lÐ<-Üãç·ÃÄaÊ@)øà`˜>£y¯ð ])?C&®R¢X€4ÛG©;„Ù¢0QUø¹‘ cŒÉó’Æ+8Åxn’Ÿ,Ëž5¸¥$„¼:BÝ&¬Idbml¶rÜ<³PÿÚл6 Ì,@§†K‚jt½¨d ˆ•è4QIAP@aÄ„ mæÌqÔ°­>¡¡gl–¥=Ãq™y{B˜¿{£juÜPùÏÌvëê2g²Ö-—+\^ëÓø²pVàŠ0T[7<47 ª67ª–9Q¤TGð€"O ¨Ýª\…‡¦È¶[»Q—×ÌËàËx`Ûè¬J䢟âGˆAÆÈÅŠ`ã¾Ù^ã1ÒÃëç´økm2D€üÂÑO{µá!/²×.âE\³FK _œ-C5¹]„²)ZôYº‡Fô³ðб >"ñÚ]\æ­+ ¡ÃlЯef›~R­},a穊ßÚÇðÜ›£ÕäŠ"ƒZ•‰€Ê«jŠ0^Õ@h‚DǺ$WPk9™D‘Œóø-Vų Ô$Ûû†7ôo&][ví]ƒƒ][†wüÔ„a‚R<°KñåŠ(Ú)NQ8I›Áé¶¹w°{ÔïZÛ·©ox.ëú†·ô ‘uýƒ¤‹ t ÷uoÝÔ5H¶ôõFȰ¹‚Щl2Ï)<ÐhhT%<É‘µC=DÕfD«(B†xž²Ó-Wfp‚9gbrM‹ûa¹†Íe Ï:Û€Cè¸hà£úÅ+e5r¬mš0-ãPdQž`¢=²Öƒò€¸)¯À¨GÍc¢*¯U+›8MX2Ë”9eí•ò2RÝÆçñ0F¯ÃC˜3ñ”Ʀo¨_Ç`‘ ß7ÁPã•IN$•ªuÍ0n !…j…$biíêµr,ä¸|Uã-H yAÉWËE‘Ÿ¶ÀI^áUAµ€1‚NÚ­SQ€¨H@Ä‚]%C¢Ýy¾ ˆ"gÂX`£×ÅÈ6Ú[Ë èz½l°ÀF¯‹ Øèsãƒn÷ùàfújðA_û\øÙê­Ó$ºÃE$Dð²dUô¼Ræ¤Â¸h5LBo9WÃ$ô–«å. d9/Ù$áì–ÐwÎÅkØâœ"HyÏ€§€ÞÅB XàkYHÁ€ó^R@”w…yÜø€MÁ0#Ôàƒ~ .|i PÈ+2§YàXrM¤4°&»h¦\K3 ¬È^šiè¯ì¦ }]2À…¬Â>T² Ъê–9pQ­¥™Vª^šèCÕE34gÜø`€f̆„0ÌJXë4E°º–à'-\#añ†–Ã"û‡ÄkXm°é qâÿ¢ ŠèÊ3¢QËØÓ¬> ¸éO$º®¯‡H<@`="s³¤"Wèÿ9"yQå­6sx›E `-mÞUŒ®lFÊWôLOyÀ›P&H<²ÈÌÑŠÑa¡Ì«mƒ2hqôÍQÖ§q¢¯S¸V Šê´µ|àÖ/ië… «|ƒ¾´ÝÅõtËU¤_^—¸YîKÚYXA^ä9E“éÞ4GÆ]$Œ¹Ý™‘Úñlö3ýS£Iá"ôiÌDó²¬ÚP|mE®,ˆ3Ä%?ÊüpUQ›§ÅD§j-Nkg‰šçD^ŸÑÈf´OšBÐ:ŽN56ÓÑ«;i]PŠœü,á§ó8ù'‰·‘^­hEÚÊ=úw *`Å@¸ #cÐ} Q€5‚8ªFÀÓ9â¡æ,ÕºMeMÓ›²~MÓ>Àz¨i‘Ù(ÆÑ%³F°\ª^$ªÇ¾­–ä)2‹zî„;qŽã›%qW`U¤F;àV%_°‚¶W ´ p²Ä‰ª(Éò.ýc$ ¯é#‰c¢’\ЃC(+©ãzÎ‰× Ü ×óU’äŠQÅ\á¿“Ó(]W1d0™mYIr¡9•i‰êŽÙ½À™œÆ`Ư] ¯f4gÉ„†sº…j†¿-¶æÛt% ú7¢"C®u´u5ý<8BÔùIU϶žmÀ/ðÀGWëHÈŒ_Ü‚{€K3¨šQÒÀ‘¥¥Ø¦ÅÖT“­9Sš…›"°OH0èW¹øÓ¸aÃÅ´UªÉæ–C- gr£n*ôm%ѧ"W¸€ F–9F‹Y½¾ 0GR‡ÇÌn¡htèE(pÄ…ú#Š5¾t\ZZœ«c6§ch áœ9MäéŠ"”i Óy°aõŸ1þN«è»zQ´n;D¸´HÆA*3pA»ÌA®Qòdt­žpU²ca»ÄÉ‹¢PQù4¸6ŒAT™qœ2íÌ¹Šœ%eÆlÚ”›žƒù«/,LË4™!šÂI*Þ÷3-€¨è«.¶è©-ANÉÃ,âMnFõݨªFˆn—žZ@\Gô"7Ã+TyUþB¦eF‚Œ…€UüLœ´‘ì… .œz0ÕJ\£p /þp7£‘,üÓ3Ig&íÌd­Ìã`Ì0ââÆ2ÌL•Ò›–¹iýÒ[°è«ŠÄ´¸qYX¢VljE±,ðž‘iáD™+ЩìXåpy²Rs™›3„ëX?½EÎeÓ]æ’—,}²ùC#“nT¨=–˜ŒŠ*}å™j¥âê+€DyʲšE¢æê(&ˆÝ´IZºhÕ™¦Üü›†â]¿ë7Œ¢!¼­Ç¸*~–¹"2,^– ¿‚…?°ìÁý™"OÂfuj&T_`Ræ Yæ`V« O*…"gøA(ÿe0Cô}p`¨ÞóW^Ãñ’µtA+=Õ#¨nº 5[OA!Ow­92‹’¨nGf ÑçGU³,~ƒU«ègž«:;W•+òD–€²‰Ÿ„œÞ'…<šI"'MTAýDZ`Ó&®‚¹YÖ"©·/w­«aG’Hëˆþ×dÌS­³³N5*e]€ºÈô‡@íÀ*k\»ŸaÔ&Ç3 ¬Ð´¤ÑÏ›ÛÉ€¬`€Ñw ã™Q*KÙ41—ô<,¡¦Åè(íÕN_ß,#æ­R\¡i/&‰Å ÈñkëÃ"„8oYÌ)ǬlÙZÌêüÑ)fßëév˜ 5K-Å÷!k—="ÂFm Æž‚™8›6³1gÆÞm‰†,,ÝÈõ†D–Äc w«÷Iójf$ë{*’мHGàÞ?"YXé)˜æŒ«lV¿JD@Ìi½È*c¦éö÷¹–`wÍ¥]Ĭёìg ›µ¹o#åÆ3R`œ2Ay²xMFœ ¦"±¤ƒ}'€7úðõÑðAJsþ]4©œ zŒðGc]ø1“̸°øŠVòGãù±dâ@ZêD¦ÁàJjƒ¾¹‡Îø‰%ç“g<ë’'d$OÖæî,â£h‰3#©HÆàtÑf§ÅÇH94ã,rɼÌЫ£ÊQŽu0DÔH:ë>ˆ29"Ø!óQ|G×à'–4@n=òAŸÎ8Ðo†9_ƒÚgÂúàI9§*>sý~g^–¨Gº éÓ×@oÏ`§–óÕuåɺÔŽ$8°ø•6TŸ%>=R*ÚöÃÃä¡r•`ëp%HEy‘™ª3ý=ª—óc¨ ,Ú0ùñ6ï0e|˜âËmææŸsé7šBa q×*ëÊfNœ!Fì5‚±ñ “-‘M’10­ðkÔ–ˆé°.ê ‡ÐðPz„3‚±ÖôŸÖ…"Aãûz+ØÔz€6ÒÙ‰¸,‰vmÙbë‡k™{‰Ñs3IêYÓ2úhf]¹–V=ƒn1ˆ5²·Xú¤ž½…£º˜6—±‚; ”†Û6ö(tö³óïÛq–¾M3»u˜jž“$^¡‹¾É¨cѯÕ·æÍËfÒÍfr¡l&ØöŽÿQ´1j¥Q«èÈ#›k~c™F¶‘/“‹l-ÓxÎiQšË6>ޝ‹>VÏB×îx$mØCÆDÖ½}°V•º–²—M45{Ö‡==öïa³ægp5ØûT·?­?>RNÌA²GÊØÊk-ÁCÛ”I['©ÿ‚¾@ƒm) ör,’Áð‘d"G¬'ŒÖŠ—QJZÛæ Œ§èà3_U&çYÿtz¬ë¥•M"å%ao|Ù8-«·ÓÕãÉ4c>‚f¬ýÒ°¡R®¨?ŽÂƒJØ8§Ä"&Ænûnò0Ïÿ• ‡p8³ñù¿ÆGµÎÿ& <ÿK…þIéD‘OòÙ$,üÙñ"›K&2EžÍäc|*“gÇ5a:ºé0õn´NcýO¤|Îÿ¦c¡þ‘Vô¬kc# få³®¾›IÙñÅ7éïÉÒ«9 “O½E×á\éS¡ÀÓ˜Ì Ï•™éÛ^ضQ~5vÒ“oo?qï¿üøù‹ößøÐS˾¹G*½qû+w—^N¶¼ÙqËî·'ÿYþôê×Þ¾û«œùÔ{¾²úÏÕsý¯㪻ØóÿëµS¯ÿ§‰S~ÿì?ûǼé‰íË—å¿7>|Ó]{ÙÞ~éœ÷?òȪwŸ}ûÀSéG¼õ„õSÙ«ÿò‰Ÿ?spóq¯ŸôæÝí›o:e×y_Ú—yïæ¯üä–5ßü‡ïÞóù+§Ÿ{¦ã¹ýkJ§¿qÙ×­_^ºæÍŽÁk–~ûS7vüôßïKþò­×M{´U½4{ærvKä¸ÒÈŹ%Ï|ë/b§=úý¶û6^úîåßÝ?þõs?ÙñƒO~ôî[‡[?¿û;«ÿþ‡Oþú•ÎmïýίØüYw½}êƒw>\=Süúsû+¿¸ìšWÞ¹¤Ïo=ñ×ëâü²ë®øÙû~O¸áùí?Ìÿ½¹·Óå·ýÕ/o{jÿóxðÔÝ÷¿ëOßÿ6wÓãûïxø’~ö¥GÛn_ö±¡È çýçÁÊÃÛ–¼ú·»¢¿yû¿}âÔ=¦F¶ä*æ’Öï×ñ£þãôþG/ûÅ _ί*¹íŽ«_xñ‹÷¿vÎÞõW|áÖ“wܼ,òü•K¯Ú{Ï“÷^»çovf{óñ·&O~þŽÖÒè’7ÈÎøyöŽŒœ¼÷õ¤0wâ†ûã37ußõÖKí¹hÇO^yæÁá[ÎýÄËç¿öŧW\ºù´ýK?~Á•ë»ÏØùøcé gî|hÕöŸ~ê¤ÿYûrÇÇnÞ{àýȲ¶lK–¾õµ—}çõ›Ÿ|ý»›Ÿxê1áé•Kïûíû?¼âþç>xôŒsÉÒ/ÜóRÛ÷.ý0q÷½\³÷ÙS&>÷N÷ùÿúâòû";Öìß½ùÕÏ]¸êEõô¾ö»ÖrýŸì¾aßËÇ?Þvyÿ©_]òÞ½K–¼oIá­ãÛyÝšÒþ³Ëç-?ýƧ[ïmÛ÷ñ/mÙ÷éã;¦{͘Fˆù´1™ÓÉŒ JÚó{x¦ÂGÑØ‹næ ·Vž&ôŒñ>qŒ‰Ò—$µè˜„¶Ü|5­’¸/ⵑ(¨‰Ã=´ëÖÖѦlLo²á°4:Æ2vI’¬©#9ŒE»¡º“”YÁà6aqK(»„ò«’èF¡ ’Ú›AfŒàAC$àhʺ; U8å EÂC*ã«L´`3a;;Š9OEÚÆxȽL*A`q‡!LÁP˜ÏÃÑ.h¶u°o¡Oú˜èVÇ!3žöч}3t| n3´ƒŽ1p Â`–ɺK³váZNåQDö;]½o³)#ˆµÛÇíö0 Õ<¯´ö õ%YÕtß$aSÐ úM… Kèvºµ§ýNÇ’ñ4 w^lÊ7Ë…zEÆç­Þ¯1F~Ž÷¦QÝ9wë¨þIƨþMÆj<Œ«‰|ëúÕÖ(N+|‘Á÷gŒýAI§R‰)–ËÂl£%’ c‰¬ËÁý¡–I±5°ëS/¯¡óÅ3µ¼@ãÚzlm½xÒÓŒ»>ú<|á÷ƒ2Œ5ÕU<©Z”I\Wâ¾2ÒúÌCg^µçáËŸüð×m½Ø;rÚêZÈC·FNÑèÀ²©d¬yïÝö_¦yü¿†ß’<òoÿ¯¡ÿÏ@’GþÍãÿ5ôÿHòÈ¿yü¿†þ?Iù7ÿ×ðûÿ@’[þ‰æñÿúÿ $yô¿yü¿†ò$yô¿yü†þÿIýoÿ¿¡üIýoÿ¯¡ÿÇ`’Gÿ›Æÿkèÿ1˜ä‘óøÿ Ÿÿ’<ëóøÿ åHòÈ¿yü¿†ÏÿIžõ¿yü¿†ò$yô¿y⿆ïInùg›çý¨ÿ$ü›çý¨ÿ$ü›çýøþ7ä‘ó¼ÿßÿ’<òož÷ÿáû¿@’GþÍóþ7|ÿHrË?Ù<ç?Bù’<ò?–ïÿõïÿ°^øü7°T#ÿš/rðë$E‡è§U‡Ü þK´Þ-ÿxŠeÃï¿IÍÿ%cI&• ã¿„ñ_Âø/aü—0þKÿ%ŒÿÆ ã¿„ñ_Âø/aü—0þKÿ%ŒÿÆ ã¿üDZŸ-0þ Ügfâñÿñ_ÒIG`Ȱ‰¸˜Å‘9Âø/‡N¦GX#nä|ý‘»ž4‰Sr«¡]èô¾­ l®Ó3þ|aFظsd0»0#¹œËY¹Âçý•»]Û‘²·³sœ§ \;ã.—çéWÖ%ðllA½r…ݨ+ËÅs~d’'à‡Ç«xã.™kñÅïGÒéÔ›>Äç þV<mŸÜWõ¢¬¸\ÙÚN=ÄÕР¬Û³{â!×8 ÇYd}=vÈ™C&àœ¯=Õr¥þÔtkäáGÆHÃ? ¨”=²Èøv.Q÷í\P1ôÎXa²4kŪȺbU¤40Æ"k#Y70†1¨Gu jn"펊‘]hTŒdMT ©Z®·Møìyˆ áÞ©äªÆÜNœQó!òxü¯ äôï¤wïmõI̓ÇÉë ´¬h†?[ ÛõC¢!zGp.D?¥ÀÍÅN¸ašñ'`-µF´t açŠ9eϹ…(ó‡(ÄxÆ-ļ¦ˆ Ç¢N‚úRoÞÆ3qç¼Åì‚æ­;Þ‚6iDÔ„“uãÔãðhÛ¾l&\áìª Œ/_KQľ-dØ£kM 6wtí $‘͸I ›Øù(øÅñEžIb¯,VÐlœºO6XÆ\2GIöÙ»î¸&’6|zgʽ¡±¢(˜ì&›DAŠ`AE@ I€(¤(ˆØQA,¨ ‚z§'ú³Qä ØÛÙÏ;=OÁ‚ÝSô›YJ¶¥òÝeþw³û¾ïÔ}ff÷yð?`®¨³hˆêB þ[åECÊÊ%à6Pú\ !.›ÅGØÚã6ñ ŠÑqèO5„ÙÊ2R1&³ñà Uš½²Cp-áH ÌVÎT´ .W2P”­¼¦V †Í&eªƶQ&ñe‹œš¬PGŠŠsåÁBû|ž´X™Ds´ñœ"0 ½`¨îp Ú¡ ÕR‰'|ïC#ÄFqRêˆ)ÐVäá¢,v¡)_¢M x•IÏÔ5sŒ- 6sx¨Q3ç •)ê*CºwYúSBR:û–4Íæª‹¤Šp£òpHX»|«Ey¨˜=À²#>9H4ñÀ$“Êè„sA—F( š"á]‡ »Àš-¢A>F•u¥$![ÉxfÉ8E)‹}êTà€ . ÙV ²µÅGç±`hP‡Ð)ã2fÆ¥É3º#c]¹ŸHÆ$6MW°Uª^ bÕ?•nx&]Ð*¬¨ !Äj[ö `¨4.q­FÙ3B‹ÙZ>›@tŸMp9lÔç²ñi*Dñ?nUÌ&(.ˆÌ&àoÿn B]¿ÿÐDPõ÷l²þõÿ¸|Œ«ÿþ£&‚²½ˆõB¸(/• ^˜P:˜@(äò¹BÉ·ŽOŸª7éÚÿ5TÓÿ¹(õû?„Çæaúþ_©jôÿOpsϲÅÜ÷û'íðLJ÷‡2>åÆo`jõçðȱ-ë:šÙþ•œ™†hedÝ"ÎÄø]è¾MÅWæ¤ð¿ŠB?æùtÉè*‘_Ùýï£{ŒÞ×ãJÃ/Žõø}çŽ2‹ k~ãeQÎô€£üò“ä×ú1Çg´Åß6ÚÙ5û²qu€µ }Þë|ï9CmÍ·˜ü²4oõ»5·o|wèC³44ôØüÛr*Ψû™ ‘¢(ìSü®‘Ë.Y¾ÀÆ´GTƦÉ1;Ò߬›oÙê`JÉŒE.®éóžÆ¹ŸØ{/Ìj0Ëî§kߟnæ½i]Îè¿ô¿}h«´ï4ö/Íýærtrµ÷yø>?둇uáÚ Ks·`&un˜Emžéê{àœä`V|aZVwé€:I¼›N¾‰N¸»¬¹±óœò±3Nk¶ßeïŽfßíÚs5æáBë¬:ÉÉ·;Œ>mmïe;;Ä×ïw76 ÷Àâ–›Wt²r˜>Ꭰk³íÀ׿»;ÞßÈr`¯Oxý•ø–W¬—üíÕ\Z'ÉôÎÖÕÃ6ØÙìßôåœì.]9ãøÜoiv¤ÐdOôJ›wÎ?£\§/¶4-œ¼wèÌçM÷ØuXÂ7üfuæCÏÇ;¬æIGùv^rð;G¯èº‚sêÚœÝÂG¾0Õ¯ýÜ"ÛfÜîï<<ÜY¸²äE×YÙíúu=*Ì7Ⱦ²·é{4ÎaÜåO“Dì¸:‡\® (ü«aÓY©ïš_•±ÿ^Î $&¹ñŸG–c»­/½-cè÷sÊ>¿LËV>æa¯L®œ6w¾ÔÜM¶Î8Øqô»¶?½š¼/éÄŽë-d4SªW(@ÐÊè–¾ÿV5z…¢^!¨WX*º÷ï’-äƒRâ›êd 5y £2ª…ô`˜„pð->ÂQŒº½µéò‰…ÃÚ*ŸÈ*•OĪIùDT…|"‡g»ø/ )BŒG?Ça3I*Ò®c”OÒïå ôë8ÉòX<„™Æ®6ëÂãàZñ‘¬Z¢5/˜ç ÉŒAR±‡ÌßK®ŒòBÁV^RD/†èEæf7Q°HY>ˆÕ@á°PGÁ˜ C‰,È#ÐS…‡ƒFÁmè  MO‘ÿô ™1ÊÔ5.!6x¨Q#!ÕMmèUGAAoöô·a8ˆ2¾ÖoG)ù*c<ºñbhÕé[~`R˜Íl@RG›PaUM´Í’mÃ÷éÕS2Ôs0@ã$>_`|(èJã™ÙA˜xÙ(=‹rNo €DÇ[€“( gmPÁkTN„A €Ä£[ÀH¹7xÎÓùý4Š€‰a483†AbÚ­Þ è†Æ· ž2Œ Љ"Oé#@M#cSóð‡Ž:—Œ9‰=‰âRÚ’V YƒF‹h†&ˆ|eàù)Uê !V>…‡EQyZ„A"¦4¿ª«RG$¨ÒL¯$猎H€~‚4P榟 ÄæG£+¬lŸæÀ;Ñõ(&ª,]Ük®#"áwk‘¿Xêëà(’¨$“#a#ÜùGJDÊݳ)ƒœ£Ü××tF;_ MÙ8ÂôV‘z¦4C9ì×9ÒÔ <å5¡Ú#“Òô2ßÎTÁØ\Þ}q\3õlÊpQ…WÍÈ2¾R‘?ÃÈ KˆV.j›# ²kKà†?a«Ãà`o%‘FcŲ­I—ø”1YÓ!šOv¬‰OLWJ0ƒÍâ  F˜Òƒ¿µ™w™£vW¹ºÌc9·*lh…²EYÎ+–ŒË¸ÌaT++\ª¬9P³HÑ¿ W3ÈFʼӄÃVU¶@®xT–å*dqwrQŠù*'q·£dîe­8œÁU2¡r5S8Cl Û²® Î`@’«³œÊ:{õó7³YZ“Ðôá¡®MŸÕBe`™Ì·úíâ ;-¯3ˆ!“.W1­3¸“„÷«œÕÜIBôÚ“:\BÂäºr:C¡»êå[HàºZ<Ðuõ:#$¨]|ÎÀf ,‹/¤UñÊï ìªÐ™P˜ô¿—sÕ)À`ø Ù.Æc 8å¡,!‚¿A +—3xÄ]p‰HW ¿ µW†á°‰’~(°-äâ_çˆösщPP:G[ÁjÁÔ¤ƒ¿~ƒµöWÖøJÊðü™jå¸Ú Ô_·7p± ØÉü¹Ú©nˆKÚ×”ªzá¦b/“ÙJÞ®ŠUÍ14š|âvÒv|eZ“¥{f˜äP¶$¥ ¹¦l j’6S¿Ô±ÙV»ƒG‡Jð^ú­œA9nç$Î6€,ÒÑ;BtBw>ß—æñ &O'¯Y$ È%Ü–#Cðàã)Åai¼Ê~Åpi°ŠCæ¤ØZÓÄE3Ä “0~(ÞœÕî}Ùÿ[œÿpÒ†ÿEÍbRÍÿÂ.×ÿÁ¸(aóÙÿáóõü/5‘¤R¾TŒb"¾HÈãx²¥lžTÊc:—Ͱ%œ©}úvI›þ¯‰æ1©éÿ<.Ê%ó!—ÍÑ÷ÿšHU£ÿsÖå¹üÖâë¾Ì¡'YÖicìš>ãNb?¹tµ¿î¿ûQÁˆŽ­÷ <뛳"©Íý¥%éƒb[÷z.ëÕicÛØY9á%…ùc,†´²ÈYõ%óîì?ÇŒŸQäs;Ó5üÔ×ü^?Õ+ÉŽèpúôý Ÿd]jZÒqn11.½Ð1³¾ãç¾É<{{Èu¬#[¡¬„Ì7)gÖoyåíúÒäCddVôÙ¬væïý*&ÈpIÖ°ø\1‡Eá¡GE¯ú_\³HháÕ*k‘kûûZ›{Çns>ÜùûÕ)³¯zýÑiÍ„%'g?ìþ룦 ŸxÅæãšéBãsoŸÉ7 øl¹ÊLžØû`ÑÈÆXÔ¸Ž†ÿ¤LüãŽÙ& &µy!ššz­Ë{Íó9»ŠÎÙïZéÜáFb§ÉÇR‹JÖ¸”tˆ~=3zĨ·So]›!ÿóÍ”«‡_Ϭh°·Þôµ“ìn÷ævñY+xrlÔ/âáA/ólÞ~¾<ºõ‰¦_LeJ[}Y:òâ‹/ ÆÅ=NÈò–l|ñìv\Ïœ ȃN«îû¶ˆjüOzŠáÌA_…ñs®qš·LçßÒÂeEï!â…;¸¶Nw&¼~üÈ>saèÛ'qßõ:–—›9¹Ãç&O4ê{tù¹ä¤SIɆÇâ² 6÷èyÞmø¤EM'l ·mõ´Wˆ×fù›Ð…›¾N!9mxhÏ3ß]o=aÞápÑÞ¨›3×o®îëÕÜd^Ê÷Hî2±yÿ<ÿiâEEãV ´Okáô[‹¡ÇB]&¬my}ÛžÅ+Sº&`ól{]ëÿO‹ûr|¦]ÚfŽí•œ‡â,c74³åIn"7ýÛ ±4~“㯗ôN0wŸk´´Û޵+š ¼mü&kòsX{ìÒÌÓË3ÞYþµpwLìÒ>¡».ûň§?U¼íæ;îH—üçÓ¥NÆkýwí½÷ãO1£w®Üþayä‰&æ«FÕõ[~*ÉD”3»þÇñGGûN*8ܨ͢v‡ FŽ(œwÖiâI~Pþ¥v7ã-Wuks¸ÇО¿¯J+˜¿óéüì£ïJ’ý·>Ì(Øþ)•ÓýµsâÍ£'W-v½’~ËuF“aSâ$w¥bŸg·I›µ»°ßγŸë§9Ïì:ɱp÷Þ>.ï´"r‹ˆs*øÈÅ­öt+:f?óx?—¬=ÍZ{TPy\>9*nö#ó¼5/ÞoJ¿ô´óØCçÃ×oJírïf“ð½Å§†-v>k½M6Íha¶ñ@›Ä3îï§6·H¾ßå²$4|ðš³Nkå+ãç~ZÕ£×€ x÷^yžlgqë×nòí'¿,Li9Ã`û®ð!£¼ÓrnÎwï—Æ¿ôÛšˆ±g¹© çþÚ zù­m R{:6^÷9Æ{CÃzÛ¾o¿Ó~gk»ÛÙxv·z¢dø¹E¡}[¼Øäúølö²¢Üö›Û®srÛ³®ãþ”%³R£egLnk¸ïüƒæÛ.nd\=Že4̢˲CFõŒœ'KP÷¼ÄÔ¿—Šd}‘¨¹fî7Ÿ ÃÝw\ÜÂ^id0hÐÖÜÞíÇ·õ›R¯ÁØ&[ß]–Tì`o™{âãìß1#©{ÈŸË’þjeœ;uuËV»žÈwÜõ™ì¶ÏyWú³Ãg~:â³Ó Óäß =SÃÇ7çv¶yÐþ©ï÷ív/#'Þß¹ûð Y½Ù!O{GýÖ6íé©’] é…þ»¿Ê¥=v{FÜ­U“7>GW-Xb¸4Wºhñ¦Â©/<¾qà¢{Ò˜saƒº¥çÞ˜i]`Û-6ƒ3ùØ+‹¿é¾–ò/4h½øÇéçŒF|çz2eݰoý¶{Æ´,Œ‹^Ó:«¯×Ô>ωÇöo;cÌðÅVq‚€{C?ä¡n˜6ãuý'†É)ì®æÞ ;3gñëÖÞßß“|µ¸ýMyv·ô ?a^ïy17dg–“Gû´kѬâ:=£øK½Aò=“”ªLq¸(¿2SeŸYëe¦t™3{!È<Ÿ%«WØI¥Âåá;Ë6P @UF¢d‹ò߯,…¢J•¥ðŸj²_€P™ø…å‡0(7qi÷2)Kqxí:ŽeÓür„ô{|í:0 ß‹ÒîE8á\å•¥Ž[ÁÝš¨Ñ톽e?ØÐ—áE[ ábœÿÐ2eþÇ©-üß=ÿw$Jý#ß’ÿ@ ŒÏEJ럯¯ÿšH´ú÷—Îòð’ùyxxÑÖ£”ÖDàc.ÑÖ¬`ë?(ììåë?\”óx>€'Ž~ý§&’›OÁøg„áJê>"ÜÀ-HŠ¿Ë/qóp3Á?ð2ü/¸Ð̇eYŽR/i ¤r‹0pùÃU·¬7œùwÅ,5h©Ò]D„A„“”O³dþbß Àî>R_H8†CVi)WWÀWØÞÇ‚Ü6,¯@¹+ÜTŠ­!zƒfºk X¥¥â m8}=\×D#ÂÁY7ÓŠón¦ðð/üÍŒe`îÌrëQ«§yOo_™§™OO‹ž¸Ên]xª[÷ðˆñ"7SûEÅ)5wPÊ /mo.+ä@8Ù Ú00p(»]" (ÔsX)7^Ъªk ¾#î%ó ”F¸Ú»”K!‘l.RÑLéL?¹DjàV&n[&rÅwŠ£? Ø=\‚€%UÖ¢ H½ØØ*ŒÃƒ2ß N>² ²Àáekð⃷ –Dš»o d 4Îò£ò’ †÷–¶–*ȇ+ij„ˆ…ʳÊ[}¾Ü‚B<ËzªI¸uiˆ( ~o/;Kýz§eà,¼ëÞâÿÇÞ•@ÉQœgA³6 W0G(@BZÃîLϽkYÖJ»k IÖJ¡]Ö=Ó=»-ÍL/=3Ú]ÖC°xzðlŽ(82(Æ€MÄœbx±-®DFˆû™üõ1}ÍLϱÃ@ºžŽéªêª¿ê?ªþêîÿ3õ²PÈdóý™~ãýôCWà­PE3b ´6—¦„Uu’ª©2 "&ìô´(­Âà =ê2´zôó2ÑÍgÑàH7/;ƒÙÔvD™X$WaÚ*Ùƒì@Ç‘¬à³çòI´/ýÃàÁL¤`xY±3 e£´h6]»ÚåãÇßžæ³yjÊÖkEè¬*ý[‰9Cö~;|íL™ªèLw /­«GUqD¨ð) ³È øýU,‡Ñ˜…4ÝaqÕŽÍ!KF1ªrŒÇ„‰\òT5ÉŠÞe§-^¾Œt-ZIVt-]ÚµhÙÊoBM˜&(å×òr;Bj$)@³£øÆj:;ŽÒuzÏÒ¹§Aý®9½ {—­DŸ×»lQO_™·x)é"Kº–.ë»|a×R²dùÒ%‹ûzÚÉ2ÕЀŒ*ñ¬Ä“¤š™>0À²DX2§¯[Ž_­µ“>ž§ä`˜*O:Áã(Õ´x1XXX–ô¦„ÊPO*íQ­á¥T¦½šõß´ÿ 4ÿv÷ÿH&þ›†ÿ®ÿ×dâ¨Yøïâ7&ùb›…ÿ—ÿ I&þÇš†ÿ.þwC’Éþ‡›…ÿ.þ{c’IÿãÍÂÿ»1ɤÿ‘fá¿ßåC’Iÿ¹fá¿‹ÿÞ˜dÒÿèçÿŠø]ü÷& ÿmÏ©»ü@Hó’­\üù¯?GŒü÷" ûü·©¹ðŸ1¸r°#àâ?»øÏ.þ³‹ÿìâ?»øÏ.þ³‹ÿìâ?»øÏ.þ³‹ÿìâ?»øÏ.þ³‹ÿìâ?‰ñŸ g@ÎðŸp?ƒ¡èÿügÝÆµ4°b¼`‚Á–‡î¢ ôçÚº).Ì×Eñ¶;i®DºR˵€€Žð a<þ ~àxY>.+âÕ˜qK¡AÆà º¥>#¥>g”vƒNP§¿~ø å™a PS¡(…µ+TG¦!\?zç°2 faÞ­QîíÂãé™éÒЬŠF†ÙôN…÷KUSPL0 1äK`®FèZª8;äÉ LC „˜€ZŠc#ðVüÀZ©5QV@VÐW±‹g%PËÜŽ°›¢;‘Ïp¡a¢Š HôÛ0œlggÞ^&**c`ïÅ€k@*ã¼\˜µîZO´²2aÿåÁ¨ëI0B/ÕE_¢zÒ_•Ø\ÛÃÔ£³R[ŒñAS&µî; ­¸tÜw‹ êÌ õ(U?RcËH¾J¶fÆ£SbÓ–§ìàaÃàNbÚ#9þb°R ¿&yKR"L4Rg.¶lHêôTFTbÕš[kÜ‘˜0‘*Û¥ ]ÑÏq—Ô@tpj"šAë0C3qYd¨T+ºM$jî¢`2£!ZV5ºM@¿ªÁ‚ÏÃÃàU‡«_Õ^.ä·_Õ–g…d£–5y4šQ’/µ•F£æÚꯪYÖêÐY©e-H‚:»m7«“à9v©e\g‘ÞþË—ì? Ëo\Ž2q6æ‹,Ivû=£(K&c$“qJ¦¯Ô2…ó?鮳ž6öÙ%Ýû&¡±´‡oKä¤xøå)µwòù±l,—Hðv ¿Ó5ŒºH*|ŧblaÛ,äÙž4y¶Ç2Flm^ªmïf"¶~þ0?–±GX¬’úW $Ø*6'usâ¯}s‚ïÖv4î#CüúP\‡Í‰©‹Â›,«|sâ"H4 Õðþ·cˆÒïûŒø¡ ¾ÿö¹ï7$ù®#ƇÑX<îHø¸@G$á‹…8ÎéàÙÏ›>7MnªAÿÃ@”Ñÿ ã Y¾ÿpñ“êƒÿðìŠW>ãûë>YqæË‡®[úÆó½oœòò 'ÌÞÞxæ–³îùÃ]'þa÷¬§}ÑŸ~ûä#±§m~àÐ~÷­¯\÷Tü©owÍIN›õ—o üòšW6>uüQÂÇ{7¶>À}Gúô‰`vëùçn½í»ïwãñ›^ œ÷_|øwìüÚcï¼sûŸ/}ðdcOÏ>¹¥ë¶Ãnû§#NùpÚž©W Ÿ¼ðýýÞZÿÃg†[ïžöòÌ=ûl?tVûK{gĦݸjÛ=ÿrãÝsZýœ³qïÑ ñä ß¾sì©?þÆeS¦ÿüÕSþÙÿÊk‡úÞò<{Îæ™ÛŽ:)³ï¶¼yÄ_{kˉ?½þÒç·lx|ÊúYÿÞì³ÜuÎûWß·sæœ{3û|ë×í÷ýï=úžï]qÃÅëÿxŽ·í}qϧW]ù•Ão¾w¸çÓöC{ˆ<}Ň¿ÿÕ WÎÙÿ®å;_:qÓ¦ÅwÓ1”Yð“½Sn>låEóR'¥ú¾ûÃ;¿ÙÑ}AâÉû>8í;?Úö·—‹yøí¸ðô)‘ã>¾ýõo¯ûÆ]ïÛùPìî¸[o™ŸÞ¼68óþÀýGßðê ÂÎУ}?:ãçG­»òñ™³Î¸ªãåPüþû¹}Úùá†rÁG_»øÑ»¾úäE¾Ô¯_ÛóÄέ·¼wÀ)ÿñIì¢ç:è’Ž»ô‚»w¿ùÎò·ŸöÊñȃ[>“¦þcßú wï÷›Õk2.»«}Á/÷m{nà¶·¿¿áÚ®ùsn¹ÿ{;æOx¾ròhjÁ©¿¿ê…'×,¸ëÀ·zºkÿ]G¯þjÛ­Ÿ=¿á¬ÞUßÝõõOþj÷A§Î+?ܪ 0¾òþ‰¿†ÀøaÂÐcRðçÊDÆwò°¬Æèøð^Bô±¬F%‰qtÆùå•ï÷ •O‹š&T¾/` ‹ -!ð;¢–Ðö¾H‡å^»Pù¾ˆõ^ÆXò‚k=ƵäáB˽ŒõÞ`P—Wy¨üwÿ{P||¿×>Ýöò]ûcf]«5Ç(Ÿ‰®7ýEO¦ø|ÓÄpãÿ7$™ü¿Žfá¿ßåC’IÿÍÂÿHÈå#’‘ÿáæ‰ÿèÆkH2ñ¿yâ?ºñ¿’Lüožønü§†$ÿ›'þ›»ÿkH2ñÿóôÿèóŸ@¡ü»ñß’,ü·ÅŸÃ¦×T† .þü/à#&üw_ØrŸÿ5"ð¿Šò^fA«:ýmX‹PÄ¡"`¥DK…³+›m›K±¿äîhP}'=DX'†‹qœl`¸¬`Yø?~u$ƒsyúØhM'Äþ6§¼†æã廫ãQ°ÉOljTJ)jqëǮ®n0îz†ÙOPFŠ;e e^Å”;efØÊL,¨”•a…•Ëh‡Õ±2\ +å‘M+#%Yiœž¬4T#+¦Û)#£VF.‡„8›¬Ž£Q…£J#Õ±4Z K“rO“ÊÚŽ’¬-2aɡʔµa`gÓÅq˂͉iØ™Á°Ê5Q¨[dw¤klj?›ÉN«N&è²1Xe‹%ZCuœ F™ Ùø4ÝTXÅ`ò¦Â¯L…&ÉM:'ÅU¤²¹Aî‘$$Í©acÔ•¶íЬ¾%Ê/Ñ„ žìpFäLe–dì—~èsFë$ Dz‹*·7«ç æOÒ BæýDé=ÊÉ—áRCR5Ent²6.«ÅGXlñ®ÇP-ÖÁù˜Uol­(pNÇ û©î\j¤Œå¢¬ö3aÌÜ®n?œø¡P „9Y€«Es.2ä1µc:!Ýb<—R#ÏåŸ  o\î4«˜óØ`EdÐ,ú쉢Eù¼Ú_UwŸP1•Ê¡’6u«Š6>0Ñ_ Òï&ú%Œå™Y#Œä'|#Y2’ÌeH(žÊÓ…´Ä±Zg™¥s2VN2«-wùÖ|%§2xBá©p=õPò7Œ8‹àÕæxa ÄØj`F»-Vø-2T§v"Éé•E®fñö !&Ê”JæW¦T»F­Ô‘껑¶’pⲋãÊJ9^_Õ©¶újÔVyÁ5*š)Ï ŸNê×G#M­ÖS-¾Mói OÕ@¬y6]›cjÔ8»¥­ÔŠè¤~}4n¿/ÀšÇ¨çx­s׸Æh\¤Ã=ûlÙOдJ—WÍÁvœé unJé u0ªöfdùGŸ&¯85ýÃð<ø _{º§Ï‘I*&ŽM¬Ê+—|9ÏW¤,T–RîPÍBN‡1ú(a¼rלּ»,-}NE*\‹H?kpfO˜s ¢æ nDÐܦ3q4œ3”K»“ç ²Xf¥¡ 2>·ñTÜàñôñ3—¶Í–pëeÉÅ8büIc>0`X×(ïÓóYú2=…˜!¯†‚÷@Ùp&&_éÛÕ iJÔ)à«—¨”G”*ªY„¿zJ½²;™h™F²šÐ«Œ§Å+ÿÐI›wµþBÐ_—þF’ó”Û2”E™n‘!è[ZZ šdSK ™:øt¸šÑ?£•P Ø&‰¯ÍÈ—3NUòW›òû[åìHE®iÁ5À ^y)Ò´Çái)hªJV^å&'±£ìðPD€žNÀêCbÊv~Œi¥YQ]2}YÎãUJ¨‹?c›FdQd¹Õ3aöh™n6±Hw)×/d¨3)çûÔ n¡ÍÈ,‹áØê£HÚüÒyiiÑ[z;Cm 󪘈c#’¢€ŒÅa÷Ö\ù,ƒ1“Çñ_h(ZnG~j]úñEÅqøA‡Ä(ðFÈyšUȵzÈP©€‚d`'ŸL #~b*Áx¥qýÄIcú+C‘¾$Åœ©|“¯@~eÃâi#ã$+±é ºýžhz‘­.[Œ;AVŠƒñjFBeh&TUœÉ §Z&ÚùŽ$;ÎKTy3ü9ž–U0ë4K1$™Ã1¤p°»Pô’xb¿‘¹Jôuø¾h{þÈAýEXÕ.<:"`F Ôh3U¥dÂ&¼)vLþ©Î-ìès’1ËÓblK«ÀL.F´S"‡>£§…MŠ,GEYgåÐ< ©jæò suöÓ\¤7›Æ2¿Ä´2¦}¸É¤ jÆ&¥b†J_j<72b+d%ÅQC–Ö Z”Ì2å&† ‡YèRÓE­®OÝú€ó¯n|p/ÙëW6E}èÖ{À]´ÛÙ¨QF*K Ysæt.-™>kÖt’a<Ó@Yȯ Îík…8n“’lz(ê—¤…¾‰¡ ?Áh]økŠû¢Q7cæÌVX‘ÒdÆ*ù•0SµY³ŠT£\–(³L>êRå·ñ(Œ´# ,_ ûgåà¶“,%ŒkŸ•áé<ʉ¸â~?Q z ¨º‡òÈ llÝ´-½ÖJÑ>Sü¨×‚–yÌ!z‡E8¶ÏJØd­#„Ù¶"ˆØÊ‚‚¸ütÝï ¶Es«î¢x`”p4éq[»†]^@¤PŠÁö€ dyy$g§³îk;ŠÌz±)‰† sÂt“‚~= ³£™7“PŸnJÌ~)ÉêðëY“­Îxc« ›•ò‡©˜%È!£ÍR(Œaú/˜ ø·Z K']cŒKÚÂ(‰e|ýv‘3ÝT¯TîùŸcÏ©ôó?ŸŠÿ©Äÿ âó?Øç>ÿkDâÂñp"Üœ²‰`ĈâñP"Èr‘`0ÁÞô¹irS9ýw òY"•Ñ0°<ÿF\ýoDªþçåWž¾æaßÁ¿µçˆÎí—pw¼òü»9ŸgÝqÛ÷„×ÎØtüº×ž>ä¨O>ºúÛG]4ûë'þø§+ÎÛ»ó²ßsÓ±m‹3SûþÝíKîë¸ð¡Å¿øÁÅOï?gÁ¶ÞçÕÏVm‰|,%ÏxbSê™G^Ýø?™-Áÿü߯¶þöò©éåüð2áâÑ;ŸY4ü.þ³¶[ß½òƒ{7-Úž¿iÅXï/øðÑܱoî¸ù+~³ÿ‘ÿÇÞ“ÇQ]iXHЄåH`!,lƒ…­™éî9ðz,ì‰eÉ‘F6Æ2¢5ÝÒ´=Ó=ÌôÈ2ŠXŽuXS^R)ŽxÊ»‰]°oÂU `² ”)Xl1l9s0Á@Ø÷O÷t÷ô’åV;Û¯|LÿóýÿþÿýþëwýˇïËî»îÏÛ?~ì_®ýß{ßÙ}ß¶3^þ±¸~]¢óÂ'Ó?=ñ¼»G.}v“¸gïS׿ñ“??b®¿cÙ£سf3ýÉôSwÝùֿ̻ò³m;ßìûæß?}ÞûýûN<ÝW5|$'|$¹ÀNJôȨ>x¤_ y¤Æ‰´†¨ ÜèÐ`ˆ¡@´Z0D%ËÎ`ˆT`ˆþ`¨"(¡?® rôW ôc]sšU0D†¡*ÒBVA-ÒBp»«H‹èÊU9¤ê9<æÔ•}³.gnË´³Î¸oäùOFš-’La£ê¯ùæczÿOeü¯RüïRü7þƒ-PAÿñßu>çÇ¥Z›ÿ£ƒL(l¤?ÍÐa—ÿ³¦ÿ¢@”q@]PWÔUu@]PWÔUu@]PWÔUu@]PWÔUu@ÿš@5Pƒ pý #ÿ_T@uŒbtJ‚ð@ê£_ÿ05ÐC릆úć¿ªÊ¡•¤¹Ù³2ì¥Cü#ä cP*„"Þ’*"y*ý*é"*J¤!%«œÐêâ–:‹åaSt@?püX^MýVŠ*©eû9,1Ïó) Á‹ ©¡_ƒŠ•nšêe=LýFLýa-#:YMf>±h¸„öa$FYýW,tÕ!xEC’_6£ ëÐÄ·sx3ôË0ï¢z´EV ¶åÂoD·R,z-z'‹óKÆ Ú¤½!}Ò¦V¦VØE‰-˜é+º0bËPÕ°…WŽ |aÒ±5aVZwê¯rKØRÑZs›Ó|ôØ<Ãå†u-0dZ(¬;0 ãÑ­“òÙ9É3o½&°3X‰|ÝØ»ÿJDïÁ/À0¢¡ÅUÀùHyìKi%yú•´˜â‚‰¨)(š'È×ÛPþ™5ƒã|\ˆµþîÚÍå½i9›iFóæá¦´ú‚¸Æã‹uvªüéDYÍìCŒú>1áGõ¥_¢úÔ?Õ´t8|Õb1D‡ƒUY ˜ÔIç0´ìšïl<–PD?nüXÿ¥M3ä“£: é˜¿às²f§aÁ\X,w5Üšî Æ­åÉ”X´UÞp  ë Žfjð$@¯ÃÌ’˜ ‘ôCÅØQT-†Ä ½ÃÀÔÆ_š*ß@ÖCäHŒô'—‚ñŠL!—Tÿ4W­’¬ol[%EàRÖ4ü¢H"~-RäŽ4QË$ÍH(bî"¢7 Ãyã7*Í£«Á‡ „àVšø[mÐÇië·Z¯,dìz­)£Ñ%åQ{Ó(cÔ®¶ú§‰¼Ö&¡³Z¯µ èÎm«Y= 7ç2—ZçêŒG¤?ÿ•ÇÎm|R¬(òU^IVüžñ¨‹&eD“jM­×žÿÃ~uÖSÃâÀ>»æõÞ!8Ö¾á["yXnøõ1µ¾äó#²âÝôÞaäŠDGªÜ©¨Š[”%z–Rç g) wëu‡vKµºA[_31–÷ü4?¢|Zó„ðÍE[=©‰ßß±ãÍÛžK=·üÝ3o™þäÌy¹pÕ}·¼¹é¹³N>ù|Só£Ü·óŸ=w\yùŽ­ßùä˜;ϺãuæŠÿáCïß¹gïמzÿým¼î±óѦxü¨¿ÜÛzòÖ}ö™gÜœ>·ãÃcÞÝðÏ/¤›ïOÏ|ゃGí>iž÷õÏg ̼såÆwâ?½sû‚fú‰Ë6}~ú tîÕïý|ä¹×NyûúiçÝýûÙÿF¿ù‡“üïz^¼lË;O›^8zëEï|ý¿·¹éœŸÜ~ÝËlüÍ´ ¯ž±áƒù—·ï²¿ÿðÞ í®“W¬oÏNÏö}eûŸ÷+ÚvÕà3´èÛ?Øyê Òãß8å£_í¹zÉ´ð™Ÿl{ë®9ÿÁß=÷WÛ7s÷Þ³Pܸ5pÁ#Ì#§oþý.aoðÉž,»û´knš-½pñ²›£oS<|¶™W†>Jÿ調ö½'÷ìûê3ëýÙeoÝzïŽ{>øÒìÿþt`ýKÇí®3¯»jûþwÞï}u÷•—¬X~ì/ò3þµgÃÕûù¯Õk ¯лø¾£[^Zµõ½ïn¼5¶pÁ=\ºgá¨çËç®Í.žóÊÍ»žY³øÁãÞ{n¼mǯݹó–û·üNÈ-úã¿¿zZáàÎ/¾2ïôû}ÿùáâ’ÿtIðØûnë.n÷Ðûðæwo¹áŽÞi­gNk=Ü=oô#߇ùïïÎoú¥÷fÜrû?v¾Ð|Ñ•Þã6ÜpE(üO’ÿʽ[YúÀ=ÑÈ©'²oë?ïk[ÚþsÓžÍñ“©Ówl>+ö³‹·ÙÕ·õ^{dß±ûN_ýÕ–{¿xyãʼn•ßÙ÷wŸþÍþãç´W5àEƒã1àVôO&Å‚›¢ô&Ü´fÂEI.¬T ¼ÓîUG¬]7)HFä) á¦D1)Üç"Q˜UàXÒùóÅ Zow¢Áe_.'N5õÆ‚E ½¹2a¸½Ég=xÕD¦!g]ltsnaò®³Jw¨É{”fª™¼+Yvš¼35LÞ)?SaÞN™@…™y4RiÞŽVšÆ[™¼‡+ëRþH…©=,¯Êr]ajOá/„u©Êº€¿–iÔ‘ ƒ^(0ñ>0kÉÿLÙÿ°¶@ÿpØõÿbâÀZÒÇ-EV5…žT á “_yQ7?È籟!èiµ55VŠ‹3q^¹µùUû󌑘ž8*g)´(_ ;…l.ÛÃ|òH©‹ÖæYb†FîêsûrlÞƒtÑ6+®ðqRm)6Ä®=«äõµ\…u´O–Qßô:hÆ3”/ËÞôŒy3ÆHgVE¸Œ0P³ÈP½ª¿îE¤4žÁ¢,d ÕËõa¿—ö3:f9ñérþ¸ªg¤¡ÊºO¢Tãspy‡õ²N±®"4«Fy5ë 0TÌóc+i‘hS<6ÃÃKŽg‡ùá¬Äñ8À0郴+¤ +Éçê éH$'¯å¢>.¶^•ŠÛÓRìY­iüPêY 6¬ì‡óGÛKv ZˆÚš!bkí³~Ö·ZEÙ! U®Fœˆc[ÆŽ57/åp [) þŒ¡YíH;¥`Üòäl#h’h47ttà±xLÞ!ä±¾B–ÍdÈ”ã`Ä]¥á’••ƒ-I<°¢z*ཨT¼5WiÊ*Œ®GOýÑ6^Æbµé£;îx²ˆ¬ˆÕæ®ÂÒ4´œ—/ç3ø°èKçùÁÑ, J–æf o-ÉšOÞ}^EŠ ˜ñ^‘—ÇÈ)P·œ9¨v çeŠHpî*¿—ªSKç®ÂF]¹$ŽæœËc¯BYl¦Ë øø(bo‚H¦9 ÛæÊHÑZì•c€Ç¬ƒÅÌ%ÑòDrQWoÅ:W å±îîXgrÅ· $Läòü¨QQ€f×b—a"NDKâÝ­‹ |lA¢#‘\#j·'’ñžÔÞÕbhi¬;™hííˆu£¥½ÝK»zâ^Dp&«ôªÈ³ye8u ÐvБG,ZÐÓ¦ø?Q³¼‡ýÆè´J¹ujŒju¹qk’ Ë_ìkÁá±µ)Q× £ùÓ„4âÿ“Í+¾¡FAñoH¼!Bå’ÇMÍ$ŽP_¨ïˆS õSé†çôµR}H0ßãt7ܪ¬çzΆÉ2­X·Úâ$‹{lÔ¼ÜÍ­ZyÔ]$e¸’D˜1\¥4Å0w"ÏcߣºVÕ±n-ǽ·Àyi^Ì'à긹!”­|‹Yìk¸WÐ<”µv×l\,"D*‘þƒ*c¨o•¶ÿÀ jíêlO,Ä;2Ùµ8Þ‰,Šu¶uÄ»ÇÐ…s:b=É9H©Ø½4iYKËoën$¿-žŒ%:ª•,ãÙïìéªÝ" %ÙÝUµ-R&ѹ,Þ™ìê^Q³ÔòX²uQ[—õ´Њuvöv¶&bÉ:¸µ%–$jhï­S@7º…ñªSo5am±d¬ñIi¤4NŽuÇ*מˆw´ÕGwy²­ÎЬæ».²P¾ *Ä—À"P­ËØjäŒ÷$[c=ñÆh…BZ] ìéêín7޾¶ØbÝ¥ o¸«ŽÒ®¨_øžF׸˜f×Ëò8à¥4ˆ€›9ì…™¼ Š·è…=)VáÔ•%”Æ¡å±(#È20nðÀ³²×¦á•RÀe«0j68kw&ûxùp§]îSèÃ}¼÷?Óýß9ú?®þ‡-`¢¿sô\ý[ÀDçèÿ¸ú¶€‰þS®ÿCÑ÷ü·*è_–F¤$QÎK™þ~VÄ!à'þ ŽüŸ Ñ”&ÿgB°ÿiX®üߨ"ÿ¯¤}õ¥²ø§RºÎ—€ÚkÌü9@-¡6mþ&`Ñ{•¬rŸ#¼³R•*Ã¥Täà†6Ô@è­V¥JŒ4Pyo+e÷µ” XÈþ'O´Ÿç,äù Ö- ý¿XÌþ¤HЙh€HÐybj®—#ëË«ãâýuÆeóçCXä ȉZµ­§ OàÊ3ì‚ Ò);Ž Ž„ïHà"˜ø?çè»úŸ¶€‰þÎÑÿvõ?m#ý9çè»ô·LôwŽþ·«ÿk ˜èïýo×þÛ0ÑÊõ¿Ýïö‚‰þÎùþë~ÿ³LôwÎ÷_÷ûŸ-`¢¿s¾ÿºö?¶€‰þSþýוÿØ &ú;GþçÞÿmý#ÿsïÿ¶€‘þ¼sä.ýmý#ÿså?ö€‰þΑÿ¹ò[ÀDçÈÿ\ù-`¢¿sä®üÇ0Å`§þŠÿœO1~Æåÿl úë¬Ñ‹YÁ¨ˆèås™LàêúßtØÏPFúÓrõ¿m™g/íi‰qÒßB{ýž™3[ó<Öbœ‹8IFÊV ¢½4šµ~ôð9Dшfæ2ð'„z“­ˆöûƒÍP³ךEæ±a¥FHK r†Ÿ‹ÂÏ¥ì_€°ØD—_ EN‡H#sÄ ÍE!3.r­R6Ë‹rÁS`‡y\k".ÍKiÈãk“ä6!%ã·pü GM$:‹¯ÀËÅ\Ö5¥Ð¨'Ëæ×x|q1%á^—ñ)&¢ƒ!„õב)×ïñ$zº”Ô,ä‡JA4ÄC¢Ìç‡Ù ʵ߱ B\1‡ùbq퉂'6U”y-…†””O³ƒ~DK@2'ðy¾ ´D?$åñ¬¨)AHÉC§Z ²áÊEÂÈךâ9!“aÕ4 ЈÐÚúâ•hPÐ\ÜŒhÄ hP€FÂØ ;aÑ “¨hÆš0´Ç@J¯¹,ß C'aè«ÒŠZh~ˆÏgY‘Èh0ZÖP1£e+± @·¬¹Ût–kÂØY®@‹Õ“ H¤Lx A@¯D!ΛQB§¼¡SX‡>ÁØ )X´ÈíÁ8C{!èKå%VÖRcѰB€šdè3íH•}†ÉÜgÆ+û„1H†€…TȰ…´–µŠFšÅÊ>ÀJÑÜgÆP4ô†>×Ûƒ Z§VDÈã™ gŒ DND!l*Á¦`§#¾´Ëá÷‡È˸Ø(´¦nÿDnPeòáÅ!9­WÊ¥…¶‰Ù òµ'ÚÈC œGhlå¤ù;†„A>Sàµ:cX‡˜Íd´íh3Ÿbäd+Aª˜ÏáJp€sç "QôŒ‘‚¾¤å -Ý줛./!³!U%s”ájdU©»ˆÏ Úb«ç´t d„ËŠ|–}³«5Ò*óØE•ôª«ù–]ë3«4Êðl^–È»i  I<êë®›WTùçbõô¼Ï3–aárx ù=¾”$å¹L¾–A6+dÖ!ýð[ÌÈuJ‘–ÈR­lS[Åì#Ã++£éKˆÃ=8©%Kòú•æÕ~R6E^üâGRxñ#s%%j‘‚¤–q.Õû´*eöÆÊU0|肃3éŠúpOJD‘©—l1CvaÕª’,+U)«ª!‹ÄjM â0"£¾Alä€íÕr¬œ&Û Áq‘—Öð©ii-Åû\Ÿ®os/°QDã3°e‰=‘¡WÜ€>±(Z&ç1ïU‘Ê ì$²™‚1–¤5%ó^&¶;)àÃòÈã%ŽW~â¼ta@yÒ·ËsCuËu]¯(åJEÔcþê1õ‘s5¬&mš‰´‘§‚§É§üЭ6ßjýƒ *!ào°ÁŒ•¤•ªShHÆkºiˆ°¥MMMåh““aw¢¬„ŸfõÍj&¦g€n:5\PgÍ)¥¯6¥÷5+¸#x'Á‚ƒ¾ð;À°3È6#]FÚ.Åãð4•wªŠÖ˜JM.Ï®Ep‰°ˆe&¶Ñ(ñãðcDË•%õ•S L®ÇWÊÁnaŽ›`–•¥Èr«N„Ù#yºÙÄYºG¥|9AI%ݯNpiF!’… ŽÛÂûÑòÚü’yijÒŸ µ:™Cm ÇÔe"äòB– F0’îNÿu¥ÿÿ½+¢H÷‚A”t[åH˜éû€ÈbLˆ Bv’™0™‰3“î•E¹Ä("ŠøTäPÁ9åXnuaDÎ}D·ªº§§§çÈd’ óÛ×õƒLWUw×WõÕwUwõ¿Ä‘?ÆŒ•¿àF4:vXÀ¡Ü$  ° nb L¢\ì™»@”ê\“²-6‡ʹ';ÍK~¡Ãœ kàì¥Ê³—(sUÊš#³ßĘ¿¢bÑ5*ÁJ1§ÝhuÀ¸_×Ü´"j]4m ðz‚F{6˜Ef× < µšD!CŒ•r*B="^a1–šíHxætÒÁ¨£"I‘€Â"¸U놙€-ì‚SLµ<'8†Ì…¤áð£zü3´2Ã*3¼œÉÐ)ˆnæA옹DJ$¬ÌP`,]c <ú"»g‘®‘ç½äÌQ”…É-ØL0fÔ52ZlFšÊ -Õ“[‘ºÔÜ8‰¹ ý©®RªMÏ:~Ù¬RŸÜôA'*(=2›¤hö”zôYl£=Šäºª,NBñ¹ vÓݤ,‹ò¹¸ËõÁ¿ËñsRÔ/9Ei0¬×pÑ—gãÒˆ:ä;á&NðÔˆÏì¶Ñ³ ±5W©¨`—†,0í(²›±BStÎàžFàü7D´ƒ)iÝPÌ_h7;áxÙœyðgyÀŸê›ïpB£k×\W•fdµÆaep) 9àrµAábâü(rÊ¿DN瘘Îh§bçØØÎ˜Ã˜cÆlV@öŒ¹hpÐ^œŸ Ý$‹Ñš[ÄÏ‚*Ümcãʹ pM _dê¢bb¢E²bQé⯋0Õi±±~NC\(²L\êH%¤cÏ5 þs¯ÁÚêDßZ뎥Øì@q^ŠC\3¢#@ÜçRéÙ@…º¼(xK·¶õ›ì$ ¼\ 5´Í‰NÓã8¨RüuË™Ž€%˜2dqM9]ÇFÉ@Š ‘>4Åܱžè‡yÜš@eÁ÷Ѭ»Nê žc]ž…€ÃŒdT@F3„âØmk  ¨‰FD×çðO¹n%﹨ _Ÿ­Kgô ‰¡?œ^:`ô80¾z‚Åx çQ©çyñ¡:¹(CW‚ì= le“ï‘‘8DêÒ1C*ˆŽ±tŒ ŒÊ„óŽ h,LoCoàÒqNÇÕËz¡­æXL fH+Êr–š1ÃàÔñOT…ðÓÝëç& ÎùVøÙ”×ê*•áwŸQ3š«¦f€vŸ—Ô‚¼€‘$0‚yªe»š§¶ÐâòâpDDuìz•ï¬l“œ‡¿Ï›Ü} cøÐE›6˜Ò ÛCzg&"<~ÔMÙ§aNvÀiØwÙÿæ¹¼ýê6²§Oc4ã­ +B +%ÀC ÔH¼évý««€ïÏ‘Jןåç|(húÁàºý~”•†\ú©Må 3+ø\5€Î çß¨ÔÆ­ƒV ¼‡ÙΑÌ>þ‡®² ¦oØŸ°»ýbgdCLÀœlˆQe;L)r!Ùüê6Èâƒø‹dy•-~Õļz̯jÇn®ËÀe¥¿Ê8 Ý)ŠCª„ùr%¬ý&A?qÄ-’®Ý€UÈ+ Ø-¯Àçü¯LÖƒV5½‘4\Þ’g,Éá€ø.@^/8Å5þ$G£ˆ z¶èÅϵË‘DÊc}νGÒ¢4t.…xÿªóªºæJ¼’„x…s˜+B©]^¨M?k¥ˆÀêØÎï¼o]cªŽ³žÆÝ¼ ¡© Y j4d8ØZf [R¸±4á&«Îªe(7¯”ÒSxëq»N®ž ²ÃâÚ¥g¨â£7øR¶\,½“MÀ;éÜ×öØ_w¯_L×RXRÕö˜BÙ“xÿH´¸ÿ‡¦‚Ã!þ/ÐH¤¶ÿ# ÇùœlMsœ‰dL8Ïf1LvCf›^`Éœ{MŸ–j7UMþAhB•È?zÎkÿÃhòŽÔ1¥oÿn„žÒuÜqyÎ;:Ã1[ÖH]LŒáñ=)àÒ`©†þù¸ëÁÐΕ¾À·1™cc¡ƒb6èJÞ\?$ÉöþÀæKÏoûXyÂüUs.M4nøè·gÙú¼Ú±`’)ýX“í¿ßýµÃîüÔw_ø®ÉÔ‚òefÎY6vå7ßükâÉ•‹Ç8šýrdñŸ‡ß½þôóãÞÝy¾íKÉ'òȽ+_ZÓÿÔÚ«OžÚ ?9'¯[ß9ÖOê¼¶iH»Å»ö5o›È>7¥û¥³¿ØßýfKÑøOÏÝÙòî‰6ãOåŽ/>4åÄG=fMY{aߪ×ïæ¬X½ÑæhÑOq†¸ÿXôѪ3CW]9}¢çì/ø³«w´j=·î¶©DÑCGûÌXn=ÓåÔ©ï:é{Äq_ßÞÚýnÌO‡Ë5=¹zóíž–ìMÚ·°küÖAöè~Ë7% 7Ìs–ÑíÎ%?Ÿžwùؘ˜« ÏÚW§.LÝs¿9eÒcL|ÝkÛL!§&>Þ™ßs™\{åÃÝ«Í1;¿IxéÒ´÷ú42ŽùºS\×­u—<[ñCÅêgs¦mºÒð³c{¦Ä7eKyåfÐ{c;rnf›YgãoM/Ÿ×u×&¼Á¶¬›ê¨ˆªÓ“\[ÿÄzd÷# G$´_YÏðqéÅìÜuxìÿ ¢›lËjùj3-tÓšÆßv³×ø–?‰ØËÏçÞ:Õt¡µõÍ- &,hðZ|Áì§ùU“roPמ½=­Ëµ{¸fÝgty§C—;lÖ%Ž»Ô÷ø÷C:=sdĸagêì$c†/\ó§‡?;vì›oGܹ:»Å“õ-ÒMèÍ6ß¿ûñuIW_ç6›ÚáÇ_ØûÐÚ6g‹ë9óôë†lïøõÌÆÉ§S^í±´ðð¤ =ºüçÛ½úŲú-^˜ôû޽oé€ÅsΫ Ön˜<«Y+û⯌qÓËÞ¶ =7wëK×çŸÖ×k7쟇fìW~'sã¾]¶\}þçí‡?<|îÅvW[$'ýž1éÁ_Úþq>éb³åùôîƒÐÿñ×·í¿¶\Ñ~só‡^ß^ÞÅùð/g.?¾"zØã«¾Û1uÐÑãÏŒüäõcçåÑ+‡¬ê^áø`ËÀQƒOí½ù鯆öo{®Nãþ;O¬Èß8¨Iïy+z¾²Eè¹´ÞœŸ.®îKz øÏ’0€#(@¬$HG¸Šh·lA$gt¾ IfS¾±·­Cï·Jï²eè ©èE4 g¡—¯)(† Xz-Òn’b·e§™é ˜a¹Ä ®ëWâŒOC—´xIø 8Á  YC/«Õæt¤ ¨€ÀÅBü!ÅÔX†âXÀ ˜˜|±ÔJî †º‚¡¾80Cb¾É¥ëÄ–30¸6®¸”ðpŠÑ‰`8¤[Pª¦8Õ ÉýÓ¦$aDl¬t¢ :uS'­ìŽ¢\q!‚ãäZוÞ*6ô× NM¨ü5.! žGRZ»EK·2hDýBòâbøJÞ©”" !ñ,˜pðå6 A=Ä®”2 HÅúða‘˜ »UJ x`h¸HJ $FãI j™¿RbZ!•CÓ=U!- {œÊëxÏZÞ]ÙÛè0CAw¿•*v –¹[†E„ûzK€.1e›íQýÒR°ø<›Ã)Âè`¼ž`@'Юð|›b¿DõíÁ_pšdÁTæqÔ'ÙLþª¤ åQêýäÃn( .r¢†‹›Ê‡‹»Ê£ávB§Å-b‰Ýœ£ƒ/¸èÜŸ”ÀX†¡,“Ê ‡‰‰5VW Nusœº ç9Æ« '¼ËxÆ« ‚à½ÛxÜ«Œ$½îGÀý·ê2Zà½ÊXÚû~'x·KzŸ'0Š2§´6„nÁM0pwª ð™¸w/dž‰vÂÐKjemó׋·?¢?[ôhù¨ÛÇ¢½K2tÈY4ÚˆQ$I³Ú*Sd$Õ÷"çûÏÚ÷Ã’TñVdðŸÂiíû¿aI*ùœïküKRÉvdðÈ¿öýç°$•üGÎ÷ß5þ‡%©äßüò¯}ÿ/,I%ÿ‘óýÿaI*þGÈ÷ÿ)X¤ñ? I¥ÿÍ‘ÂFãX’Šÿ9ÃíûïaIžüωü ÿ!ç©3HB8!Ó¥J_—)x<ˆ¢|Îh³Õ˜h Ljß$xÌ$2À¯>!•±,(*ýh,‚`• fƒÑX7×Õã.˜o­<F¥i‰“z&íþãæ@(È$½èèÍ ¢á‚p&3€)V¤úIŠÕ4zÎ(­³JYwµípgAŒ'‘àžÓÁ’àk«nà‰¿åƒ6† H[&pÑrÍá£0°êðA?Mù _V£ ¨™ö**RŽú ”"|ªð<¦c(#ŠsQå©Lþ{á6^µÙ‹*Û7ŸúÀ/ìf#Œ‹j³ ¾Yâ1•¼h®J‰´ 1iYé{×tèxŠ&ƒ‰5ú~1%Õdœ¢Ôy—BYWT$uÑ•%”¹k¢±€ê表¿ j`ò* ¸`_XZÙo˜­Ü Œ»CO—Íd.tÊð¯jÍ·r‘ïF w³£!ñq/Oqª´séÑ9 ®s„À;üªE×̃{ÞR§ˆv}8c¾È«aO¬rIE˜ìö½[«éùR§A2HOÝ;Ÿ° @‹ÕE1å0’•Ì1<*¤ñÚOn‚V7áV™B¶à ”~8F“"„'5d«–c01¤o«6Ø™o —Y{#+%1+[±2z·2ŠY«ÆL Ç…Þö5ª5n×<…ëЮRÿ‹ÙÊõ?"†ð4GŽl£Õjöc’ü?Aš)p"áI&$™´ÈLÁñ¯e;¥‚wöRxFž‹|9&AõId-XÔ`(e}š/s‰3«('ÇìËðkÃÐò.)!p«BEJO(V€ýX}HCD4y”¯!³Õ™ï, ™4•c«‚2÷IÉù #Ï\"¾{Q]J\ƒä))œ­f¨IÉÀÃÕwNhWx4NÀBJ Ð:·Â9Q5á6|À9uü¯–ŸBßÿ<pàý?¸ ÿíÿ£hîÿa BÛÿŽÄ“¬ÀšižgY#Ë9fŠåsH^Èa²Ê,÷š>-Õn ]þƒÇ®Dþi’öÚÿÇrþoXRÍàÿúOÛ!¼é„ý™Æ¯µ=œÕ£øÌ¦'ê6¯·lý‰o°.#ýÃŒ[ÛÚnºú™#wÉõƒ Ö_(:*ɾvÿè/Žßê±dôž¾™ä¤6›;_:ÿ n¾~gçú5Ÿ—v8AÎ|zÛmó[ˆ™¥ÿäçfcâ¶½tìê¸yßN³í@·›gú}¼«|ó®m‹·Omw¹"yyóåóÍÝo7ŸpîÏo½ðhÜ—e_•uq­×¦s›éñ¶ú˜zë¡“óž89ѹ£,á·—/´üä±øÏ_þ÷qûË6¸»pÂô“ç>Ü;M×þÒ€òº»º<õ…áüìè^‹Ê¦OOnòó±ã=…÷fÌÛqj¶ø‘øG·%ø6åfTŸ==õ#·|¼bÔñ¿|ÖüOwÚŽŸ›÷Þ۹­[^{äý[C;#ÆÝx³÷ÍŠ”›æócêXµÄÌ®/·p&¶dÃê›ùƒÚ.(:¼e—¾Yׄ#Äž%Ï~ëÚ•É÷§tªf>KØÍŸlº¯Í_ÆJldœ–qgLû‚¶?ƾýð¨¹ó‡>kÕêßÉů\¼üÖÈýø€ìwGß¶}ñÜáÖoÿøïƒÛ?:{4óF¿… B¯53ÖGèþɉ­Ø­TìG6ÔûûŒN-ö6ž|_“ŸñI’2¨¢ÓÞ8³õ‘³^Ä•4¯3iúæ~·ûOé3ÀðúÁ-‹›vpÄ´a‰lݼÇ[žb©·zRR“vÅ].·îiÙxl~ã‹Ëú[S¯Oû:}œ}G–o^¡oüõÒ/Ûwˆë9Ó:oï¼¼î ÿ踸ëø? ˆéókVô¶÷»Öÿi¡qúÓ‡K/ÜŠ›ùfñÑ6›n møÓ†•ïœèüÁÈè>+÷®^n*¿oÔîeÃŽÜø£Ç¶e‡Kí9ë÷zSÿY±Î?0ÏVXzµ±fà€ %0ø¿ ù„Á ÜæÄqƒyÌX=ô_‚qˆ2L`ðß V‡«ì\Vÿ¡à²Éû—«Â .K—õVe}ºâœ +Î ^×ú—õ¾– 8o0XÆh,IxƒÁRŒwƒ{_ËPŠ2o€Xª€Øü+ŸÿÚk`IJ:]Þ¦U|ÿ°w%@rTç™û˜X 0¤0QBÛ–ˆ$K»}€Ö:Ђi…P4Ò2;Ó»;ÖìÌ23ËZ¬§b(ðÁᔩÂ!‚Á@"(@.°lÌ¥Øæ8T!D12àØùÿ×Óݯ{zfzºgZ讂Õë~ó®ÿýÿûÿÿ½÷Í©}ãˆåT^‰ý‘<.ý¿{ð?âøï‘5ô÷¼r†÷‹…Üà`6?ª³åÖ0`‘ÀõïóŠ,‹Núó¢ÌÇ÷¿#yº ÿU•™åbü×ÿ5Æñ_cü×ÿ5Æñ_cü×ÿ5Æñ_cü×ÿ5Æñ_cü×2þ«åò‹ÿÊ2ØšCüWQ¥€Y!ÁÛ€ ,‰ÿÚz5Ðlà÷ @ªžæÎàÙ¹i°–&° ÐEµA%I_ °œõ3].æš@ÀzEG¯üêÆ˜%Å7Ã_õ¿ÞXÕ…1Kª‚­Õšj˜êÃÊf²Ãà ë0§@5ؾÙü†u¸bI ‡¬N%͆¬6'm¥’¤/lNŠAމªÿxBô9° j0,굺SÀP-5Ý!2œNŽóÃÄ‹0aG²åT.,˜dhzX9Ù1¿ë ë {i´´”Fͨ³M5AÓ´uÃ4ÖÕÜTC‘v¨±^#\¯‰Š²%i¢P¶MtHkû²›_Y"DÃ6±žT ÖNOHY2’èhÿ8zAÂøEŠ5†/T»žÏÆy¢Ã’1+è™zMhèóJ+LƒšM´&­òb€tõ„j,ímõZ®êè8!‘ZA›T žeMþÔjôÅR³X’´¬£‡&ò€g¾ªFxj@OJ'îV•ì¸S½?ó¨BPhaa1ZåÄ×v`´ªd÷Ÿî›è Z#4RÒ÷/D«ìíFˆVÙ#Û-­rèØD+,‰Š%ÍHŠ5@U9òZsWaËKxßÚѪ–Å T’CàŽwB«ÑS$ FÒ\dª]¬&‰ëYøª­g ¨äõAÇ÷7:+tˆ’ü‚‘ô!ù¡W‚sê$8+4‹w¶’÷ÛJ®ÑúÔ¸§ÐÆ®ÇÅ6ª Áλ›[ªx®[]~ŠÍëbèXlž'tl´Ø¬Ø OˆØ6«ÈˆxñGøï¿Þýõï±¼q8ñ?_¿òäÛ_Ø•ë?æÌ­É§^à{o}øÅœ“ŽxüâÓ¿øÆƒ3^+ß7ë’³Þ^üÌ¡Ç\ÿêÙúÜ‹NõüϼtוÿóØæ?ôÌ”‹7ÝøÆ_î|§xå/¾ñÐÜ×/]zä»™ã½:¡~n¯öÁ£QŸ»ýÒ×/{,û“óÖÿdèü¿ùßö»©ç•÷oxìâ36߸çÜ뮾túÎóßÛ|Íå7)çÜwÂq_{êÞã7m8uðñ}ÿ}vÿSÓoZ~ìŠu‹oû鮳ÎýÙß8ðÁò¥Ÿ]9M>xË'n9yÞ{_º|ËWÕ÷¹uÅ;ŽèÿåÑ7ù¥OÞ÷êo.?&qï~zß¶o°ç©ã?¼ã¨ãvL{øîk“'ì>sçÁgí=üä»Ë“ç]’Ÿ<ï3W¿÷È&ö­U7<ñö¾yÄË='¼°u禋ޟöìé?ûÕ»ßÙöüK¥[þtÙc/ðÎåýùCžÙ´°ðä´+Öýñ/•ç¾wâBééÇ×5ïÖ ÷,}jù‹Ýµoן¾5¸ýìßß±xÚ=§MËï»ûÑg?¥ôü¡|Çáÿñ¸[Žž÷Ÿ}W-ø`ý¯Þžüþ©×~þ®Gî½iåøÅ½•ßý÷'þîŠW„soÛ»{«ôÏ¿ùÀÏ®ûö²yŸüµ$ß·iá韜qÒÚ;wýxÖÒ×Ä]Û~yÅð÷üè…ÑŠÖÿÝßœ9{Æ‹·›øÊµÚ5O/Ürã›Þzò¨—¯ëÞ¹­?ì¦o;ós·mÓw-½­åÚºÿÖùO½>?xé_òòÝü¾¿{çÉ¿;°7ñéCgÌ\µ`ׂÃÏœµýç«?ño3fô½vè…—Ìzå…ißî?ãæg®ZùÈÚ⯾óèÂÇfNØóO¼yúi‡¼>êí=vÏAÛ?õfꢇ|wöö•½/ûÌÖí—ýyáo÷Øôþ|êßÎÝùþIó?¸ùœ±wþè»ßÓîèyø·K6žòÌ+'Ý0põò/o˜~óÉÿ4÷»ë?3gïÜÛŸ›õÖÃ']³rÚó'ÿ‡°÷ðw‡wO«û©(-Á~’m1ìgpØOáUáD,e£~²`QdwM’CƨŸ´'[õ“í*ÔO¾-S®EîäX™¯EóTk‘@=Q?kËq²r§ä…úY‹J*ˆµ¿5ÔOºo­£~®Uιóºrß÷¬<²òÙ­sjßÔ ~r1êgÔ¥ÿKˆýN¢Öâ¿ðÇŽäqÐ?òû;þ¯ÈH…‹éÉSC¢|¤Fa‰Í€>˜éo!ë@7°ÿ‘§â¿ ÿøcû?Š'9 \†`D/O¹i_™J$K:Ù%ŸJ'ç’óñ³ó2«õa½ˆ÷ö*‰$¹H:UgU’$¾Áõj!¨T•Äh!G. –Guø?1iø–Å  ‰©d¹Ì$?›Í§s™ùù™F¾žÑ™§Í¬$ý†*…7 ñ6s15Fnk¹Z¿ Iö¦†³#E½²aÙÆDõMZÇK]Ø=u~çK$«ÕŸW6]Ú@öN••ñòÆ©Lª7“Qjúëv•A‰ XÚÅc¢Z{bQ!cW(u8ªf™8ΣÙihŒ6'KCÕ©1wjÕÄu8[»féDž¼/UÌÖ-*Œ§Òåþ²>º#¼Î¿˜Dù7˜â`ú]-–'R9ÆÈš3Ç;ãÌd);6Ó5\föœfópµsy¶T®$Kc©\Ž´4 ]¬ƒe?ÿ{˜êK Ç|uЧ:uA!›iÜ3Ƚ&;’Oåüu…÷Õ£ÄpÝZêä^—Ê–ýuBðÕ ,¯n¨öœsLØb¡ ÿÖ3L_¹\ÌM”õ³uœ…7„Qr09åþ-7üÕ˜™½Òtl »Ÿ±¡df ” ‡hj±^F‹/ƒŸ˜í𲙀†"ðtЉ1óÖ&‘cåÑl‰!Ýa&S%fDÏë í ôábaŒ”6 b§0‰eCµ¥~hAÆÔhÆ :Z™2—‚Jý\éñq+þÛs$ö÷šåãÒÿ¸ý­ÿWí?…ã?Fò¸èÏïoúórÕþ‹ã¿GòÔÐß’§m0üªOûO¹aÛÐÿÛQ<­†ZKmÃÏ\UÜ…¨gðQóÆ´ôÌß-´×e´ñPAÀ%ž©Z'U½@/U¢TŒ¦òX·G$ÇSÅD=ªb¥•†—Ò›+´K^4ýIßD¹Pó³ä|òºéWOzü^6ü¡at»Íò“ÆËú§Í_’¯6ÏDt>: šÉÆ×Œ> s‹à‚¢AÏh[¬MM Ö¦Ú›d{Ž uœÎ5²/Q“Ñh¢ÍŠ5ÔC0’‹0=s[h/L73eöšè›˜³-}XÁ4™–î _óž8 EÆ\ofkª²iïÃH å ߪúw¹À”&ÆÇ År•ÐuMñf,?6¨Ñ„Ñýsð#`ö&iÓ†4bWM¨¶#ý` ÅŒ|7ͰsL Â3‘72çÉ׌_÷@Ó^Ô“>z°¶„%[8Y„¤K¥0ò–I>šÓØX jº/Ƀmi¸Êš²‘y/[q0%‚ˆ]"="ç *LrŠ™J 3:|(%ç¯ÍoÎ&ó•yL‚~½f¢„BÓýzõDMÎ%_Ê–+ ëý ¹Ô\b ÃLʬ6ÛîñÂ|á­Òdz:¹6 l-Œ¥JÌY©|~$«ƒ’ˆKnJž*” Ê$GÏf+ÇÂát¶']«µºþgX°¡n< À¬ÓË깚¢sðm’|ZHôÓã\tDïÉëe£†¦¹°¢ÙN¯M!ŸÛ2‡!“­ÚëÚ!8Ç8z±`#F}mœOr,ØÈ³¬Hå#+üx±@ÜÝY\ÔKUg\Æ”«£…q ‹³eféézlx"7œÌºþe+×0}+Ö3ëúV¯î[1°þÈ £ _õ t£œìØx. ÅNb¬÷|y 2ÚÙKV/Zùû¾Ð¿¼`=ªKûV,Y³†Yºr5ÓǬê[=пhíò¾Õ̪µ«W­\³¤‡05 "bÍÆ§Š h³°ü—t\ðtOŠùšÅFàZóS³F×IsÆ·˜¾.“3¤ÕäóJ0ÉùËVõÛCbzÒ ã¹jyD¶êűRO"1X"3;=O»ˆÌÐìÆ¢% ‹ ŒQ×ã¡ÿ»ì?a㈒ïÿFøÔÐ?¯O–²cÄWjh·>a>ê> íæ†(Xôð=§œÛÿQ<Ý…ÿ¡h£°BŒÿãÄø1þGŒÿãÄø1þGŒÿãÄø1þGŒÿãÄø1þGŒÿñÆÿ°}@þð?0yeYý¸àpŒ¤Z!¡™¤Ì`E0¬•âèD°5„44+‚ìlô8—²cx׌™çŒZ NU –æMº…˜Ç>)Ãö(¢V‡2uŒÓY´#ãÊFÒ%LÊv’s$kt6¥½Õ5 R£Ùˆ ²$P4,g†zFôs^« áÛ”Z\Û‚ˆóµÚXM`dü#59˜¿¢8Š˜Ÿú9ÖI*B9›8h‰ÈÖ +ßhÕNr Ïqì(Ú É1iMcHòv3óQbýsM[ª Ì5P<…î¡‹ù‚Í5v,¶p7ÙZäkR© ( ¦‡\#ÃìkV“:¬Ñ"ÄàD{V7^à:V¾_®©€Ä •z Í•öS½Y£öhG# BlvÀ+ì‡d¯.ÕnYCÇÓɈÛS]£€¸@l:©©ƒŒ¶ áI1Ð2\[Y›“ÞKè¹@.UòK¼ÖQN#u؈ „€¶9b´ ¾šÕ±òýršÜINãAP*"¯*´ŠH’¶Þ@2ûÔH½9­=Õä4šDk«¥r&[°ÙÌÔ–±¼ÉÖc¡z.ÛŒ ƒI–)òWàÈßN2©C±D¡‡íý2ZP_îv¬|¿Œ£t’qD–³÷¦E h6¼‚||ýu¼9Ë„­( ³ˆ ÀšUrÙ¡º¼Ò†ñ&W++‘â´vÁ6•à#`‰5øIT,†áNAg‚JNCâJÅKÔw˜‰‚8( ƒª%Hu®³F¡ -g9ÒÓò›Çpa Âeûe3µ³lÆÒV’²’0I™E˜Ù¯QVÙÚQ]`–S›qfÃÅt^À"!˜Î›x-®R”ú§Á€©,"Ç‚L%ª’ÍTÐP„'Ð?Fšyê¡*“´€¿Pý½3l‡uÈ6o`R´¹“a ±€åûe?­£ê¡tâ,??äå,Õ–$;‰™…0Û í©.°zS™··Ì ÿ®Ý¸ïGöó&^‹ì'9•DYNõN0؆Èb?…òƒÇ÷°æñ* ªÝQ%’×H&M Õ¬åÆhAö X¾_öâXÊÕÉs0¦²L®hðjˆ ¡7“R)Wg¦0–Êæ£óuš©^0ámÍ›$U[ÇÌj˜ˆöT×4_^©Ùˆ¨Žk«ÎNò¿Fˆr­3:L£¶r:j¯¨Åq²@.Íð,"¬vv'‘‡E›Bq5è$Ydƒe%tNV¾Nn—¥aÎ_s:ƒÔåÐç–ê48SX[¥‘y¬¯Æ( êÚµÙ‰6ÏÒŠ¾L+úaÌõÖ‹n4aõQS–˜¤Qyƒ0DÞ  *ô4qPCêH¬RÕÕ”Îë›6Œ¨¡*N}°¾ Ó±ò}ÓÊ÷¹¼`ž…Ë‚Ôh€I¼¥i¹â:Èóߎê{þ%"³ÍEkMjÙx–¬U×Ô¹VÑ —­ì¸YœU‡nþY‹×œ¬…ò R(Gö'ßk <¹¡‹—<¿*Éc}—`å=¯„ UÖ(]TderÃP‚ +sr2¹Üj~—‰Æ3²‚TÑYUÈýàÎî$¨¤.ËÓ¯;–§_¦“v•ï›u;zpS€¥›ã(߉‘´|'(³×‘ Àºí©.°«–|ÞvÕÆõüh•y½©]d(>{ŒÓ­½ÈØP¹ÚÎ)áC*{‰„UŸøJ±Ëèš¡ä;«iuH¶‚%‘Ñ6‰‰_¹0gÖ–ï›Ï:zÔSBÇ´do7B?0i L*V’dV< w}óY{ª ÈgN:ÉÆn.Œz_iû9›ÛÂTÁØÓ¸MIì8K@ÃU²÷¿qµDGUà…¬š<µêaôUQ!6áV•£¨À­ä ’ ”Z<.)³=ÉBê°$1™²e¨‘¯’‚[–ï›[é#¦è&Nl²ÕÊ÷ðȽ™a™òð`Œªvúw¸¦W_ê®ÓÕ.š 'Œ?gÛÕ˜äíƒAqâ7Þ¿ônJ{« (?ˆÉª)5~!¤F ^¡©ìH¹-UÂ`u¯á"H‰%z4Ù×Äöq”BR‰‡ƒ‰ |ð,×Ù5œÔ!Ú–¸H¢ ™„VpVÔß+èXù¾¸Ê´T5}ƒ)Íö÷@N­±G¸‰T]UP‰õ¨µŽbƒ@‰–|Ÿ¹Ðãy;+ü­--ø°G‰ÜÒB1Îå¡AÏ¡‹C"ãm ‘;ƒi<¹Â®uXR€dï¹#½UÛ]’K %&î[F¨ô1xQ&¾#Y‰—(°”Ð{3@p°¤çK…bwH³“¦1€;¶¿ “”ƒ 37sÏ5–í©.¨í! ÷œ)* z´$'Xçîk©r8ë„o‹»\ÑlÉ€ãzÑ·‡çäeâÛë¨õ ~CS»,“¨ø5”X¾o Ñzú0ºäh â* ×›Q¹Z0ˆñ¥K<º­b³OæR]³÷ÌžZ•§“¶ŠÛS]ƒ‰Š šÀÕ^‹©±5Âí`pûª­Ð7SYç›v˜|Ø#%î4^3Üû‚@6gñŠ †Îì¨B€€ó¬¥¤™SÂ$:,°¼Æ¡°|ß½é##ˆt΋1%qÄ?{ŠH4BÙ–$xTGÄ»PðFGÀÃ.6P  Ê~ÀëšöºBÏ«@ÖIë…û0¢Ë…‰çч*v†Ü›Ñh'ædªœÍt“ “:&Iz+QžEÇB’¹É}ÆænÌðÕve*^Ñ7,Š´ iäÍ©c°ÞªI(1Ó–MÕáÆ$Û¥xØ75$#Ú íÇ%•82EÙÆ)ÊveJ¨9Ü¢,Ù€#- a¹+ß·ÄÜq=8•ÄõÀK%ۛчè­Ð‰±lwH ³‹–Ñqß„$í &$s“ë-Mt’¶TØ©:®·X[¡@V·B­ò¡O3 aãðä'¥{N[A`‰ZBNÒ§ÉiC±zêÐ8_@ôù ÔKÈ{Õ8 …GfíS‰@$¼§ŒŠ1Âþ[è°ƒuˆ¶B&†m‡„²s‚•ï[¨(.¡"¨¬!TØç+Ò½øºA“í&¡‚]¤û`ÒäòjÇi.gÿ½+‡ªûÿ"©QO$KQ†le™¹³O¡he$ËbŒFfìK$•6ÑNå[B¶Y*K;i¡Å#•(e‰´‰'I¾÷Ü£ç÷ y~ÿ|ïk^¯;÷Ü{Ï9÷,Ÿó9çóþ¼ÏXð¿&¹Q Ú_ñ 6þ9ÅÐ1ØX…ʘ<àu†'(*wBCÅ#ÈÞ °<áÓ…+Ù†LÒça€h‚Æ{rFF—&Oø¡NåxdÍ`,“³QÅÿÏ+{̤Í\{nP $#HS È\Ô$°ñNÎÀ+`rTF  ò’7éü܈u6‰»ŽI_pnTÞe •J€C¾fŒk±ÿ<þ‘·ÿ*Þ_.A94(bñg2ØB °m#¬·ÐøN”¹Ìºƒ+Ÿ‹óPÞ]>d€ãÿÈm¿P+‡Å!n@$!Lfð`,¢8WŠB”¡R™+còðÐøÎ…¹’Ç;$Ýt 0)ˆúX¤à¨â¹ã×U²BÏc„‡ °®¬ã¸<< $@>J¤"= låŽTvœ³‘aóï “<æÊUüÃVVÿ~š¨g¢îp·Á³öur rwCän¢_ ƒ06„cB ¾k°Ü%Àïpa10`ï»@Œ ã‚åqß¡0||á©ååBäÉ0>H8Cd"¹†¸×܃€€`M–€‡0€ŸÂañhìXéá6äF£Ö±X®A|Ÿcú²ÿ ý»ʼnJaP] &Grb♠ȉáŠÇ¹ºº¸ áÿ;ÿ;Æ÷Qÿ÷qqKüû?„'ÂÿAÿ'â±<‡ÈøÿõÿçP¶ jBZx”rÙÛØ("‹f9{ ´µ1fÜ}rá±m‰1t÷ä0}ÑCÐVhð èÂÔÕÃÓÉ x${%GžQ\yæPr:ºžî ¤áîÊÜ=ù¶2»¿I.a¨VG}ëi ±q 0õšNô’ÉQó'&f­”5øNèrû°|c}ÒôÅß´çÔ÷mXûþcGO”Î÷`Ÿ&™PÙü„äÌË‹/ë-²e;¯Û»²÷ê夾å.ý¤êÈð2Ù/i—ßU–É;VW29EY¯Ê¯3Ò£ÌÊ6_¿ÌÒ=víÞ³¯ÍåÏ‹2.÷QžoIt\þ¦)ôÒQïwæÕµµÉï $6~ïø”´õr±ö7ÎÙ/¡(«£{ìÌžÔÒ±s’H­ŸÉŽÁÇNUš®t¶×M•©^ßýþM~íþø´ÐŽÔïݦ½qÑ¡¶wëk[f÷;ùô¶î:3â—5–7¬S–»´M­Ü:ÃCb/óúãY5—ö\ÚýµY'µ/ûxįLÝÌIg¿n}ûq“AÏó=U[•Ÿvî茜ßdÛ¹h÷•RÓ15›åÆb]‹“¼‹¿‰hëÆ|’[ixÅBžÚv2s·€¨Âý,ù與ÆûîøÏl\m‡¾ ‘·E ~º¸Ä4ÓÉ $rÒå †å]2–2Oš[ë5jtì:·ýx Ít—j‰\ÕyÛê*Q™bû?/ú£#¢Ê¤ª.±hUò­{ØÑÔ¡þyç~£W¿—àK¥E½Ðü˜^Ѿ¿WQïTƒ@ÜÖ¯Kƒô­ ô'è*ö˜íS´)uoÊP£é§/ص[|þµMór—LLÎ^£{Â@&9)wŽP4v™ÏÓÙ‘ÔI51ÊUa¹éF¶‘ó6Q%Ïì=õÒŸp«$Wõ=u¶¾eö„ÈѾã)_¾/ñ\·YÚðCW† ʽi»·a¢ÿÎm»ŒD×heë> ¬ž,×0³.¦nçñ´‡s%Ú/ jœ¬§oªÛV…Ò±õV¶!«#E§å¢[“…ñç‰iäÏYK EYÕö¶=åõ¯®Ð\¡Ôø“ò<=Áð¤êŽ4(Æ£zÅ&¼bž ŠŒQžN”ŠgQŽÈÌ·ð©1´kdEók‰áot Sévš™úB^ѳÛwKÝ¥ÒÄ&ëo®“—»û$ùºù·Š—·²µn³Ýj=/¥ûc?_S~»vÕçɵ“¯7§ÚE¼MHÀl×ÞTåq-dRO]¨»tVêÝ7Ÿ ³û~9C“|ò¹7@ÿÀ-÷\\Ë„ú¯õÍiZÒZ‚†# oØkhŒŸ9(MÉn¯4:›òYéÖ¹9 ó½¢þÌ©Z˜lv°;D[Ú»$W=¡zC”•_ÊÖ;±²W9øêw;27ˆ¯tÊÉ¿Ï\%“™-v}½àÑGç¤+v¬‘ü†ÞüÛá½óŽØDÓJK®‘ À˜f+LœwÿªÒ÷ÍùÞ¢k®®¶OQ÷NøS$£· ¸ÓíÌ}ì«Ý/m&lHÄÏ3p`½èýX¸éîdHL\Mü4G¸ 7ÙX+/IÜT´|që4ALä¤À /¿ø©÷ããB°›i98C1ò»Êªˆ+VŸåØPо"¬UO'÷ÂzdЂœÕŸÐŽŸ6Ü]t$½ÅïèÔ¥¢ë$èï^j̲SnÐk4@o¿ãÓé•nT¥Óvä˜øi’ãS£çS ¿½¸ù†”Ñ¨Øø-™õÂâ¶¾I°îòæaÍIÆ×…‹Ü¸ Z°ê‰Õô¯ÉÙ'ô;©-ÛŒn|Rûúå·”ƒg%§R§ìJ Ù:{ò‘›¢mËbÚ¿ê Vkœ'“NŽâàË_ÌÚüryq¯÷2&jn*'TÐá´ËèúÊæ·éM>]‰RËuý ¿ £é¶´öjû<ÕÌ+W礛޷šT`†:×Ùšípc–BiÜ–%âÞØ–tN<ö&‰ßµÞ~=ÍÞåd~Íì\¥Üf¸!‹•&<°¸í&Vá†=öf£¦mšÔš™å7õvW¼oš?9ZKáô&/Š@³xŸ}Cj¢Ö»–2µ`JÒOŽR2c]N½½—`vc†E»à´håe "‡Ö>ù–ôäjüÎeç—(-SRÁ¿‰µ3Å Y®_7i¥Jy…)Š!{*±ò϶ãÌÆ½·§J7Ô…ÝÞV”*»ˆ%mèýD¥.¶ má %xá܆,¹å™âå÷çéY5,Óõs÷¬š·ðå·É>ϼhÇÞësZww/ðþ:ñ~*ùe÷½>ó Œóò!7%çÿ¾8ä²|[ú/– ht)Þ¸ä¦"¢NóŒŠ<h3ëæ¬«´…UaR©Â=åÓ^›*¶µÌQI±IñT(ê]ùŸÝN©öÞ“~¼KñçÆùëÓ¥8Ùòϲ ⯜£èΔݞ[Wt>cÆžÅn£ã9AZbá"©Us)¼Õmñßc4¿nªëjÃñõ‚[ã'ˆ_pËŸ·*Dk½ôZ1íðZŸçôHûYíõM‹ÂþÌói>ó=çk[ø–@•§g Ý³Ž†È—îMbøë»«œ»iµ£Êô’P¸ù›Å[t|N'·˜ÑZWp\%~oo)ú*­Qæ‘CDÊ–ù=¤ú²žwMg¬nsºŽžÍ¡To£šÜ`ÄÙ؉oð.6¾‘·êºIT§É´S‡µ¨Ù¦h—ê ¥8Uu6ø¸FœÝzG‚j*lýðšp\Úš]’8½/(»ų±ÙØDÙs²ok‘ŽÙ#\wäZ€¢[Š[Ž#æË¢üBéÛ÷õ5LÖî—Ó<¹"^j–±+JjFÛW¹Ã6.ñxåe3·@|jþ±÷ÉL­GùiR²™A²%{Þ6æ­«3v·ÓU ûtlî$ÿ̓ƽ]&«ž…†$õ4%¾\ÌV¿~6!èL³³¶1sÅþÇR_Òäé’û~˯缀"ë8“KR¶OHO«~¹áBÞ¥®œüÝe•v"„½mìàO.«wÛž)Èñe­zÑÓKKw{ýçk­Ö I/4 œeºSÔLÕ½$šë:^ø0®ün­þ!YUlN}ÀG“î”z¬›ffEÌ¿5+~–‚„šŠRþÚ?³„¥Kª¾õ:Ôní–«g½7³Ýu\)}í+ÝÄÀC¥‹Û×Åøà²5ú,ž9i.ɨ|.E½gX ©}„©ÞeI¾%¬pg©@b§À±‚ýoiÅVí+±ÚBSá¯Ûi§¼BýžAvUkÉvvY¶¬¢ymØ”ò 1=Ø©;å ßOG-ñ0)»¦2sãä‰*º1AìØ¸‚Ÿs‘q€ø<˰ßØØ„&…¹Ï‰Z¨º{Ë–•?[kh,-ºëäñrNtaêUÚåSФ <::Hõkã2­s_cýíwhN*ˆ¯²hÜÆÐÝýbïÖ(“n· vÛ¾r:&wÇJ¶ö¸AÓŒS ýTäN¯þn¶¼réÑ­Õõr¡K¶·¥ ©^\K¤æÉÚ‘³·äïëu~ÞÜz‰¦+™™·«ä¨å'/õËL™7˜‘ø} q;¦-¿?QSéœ÷U1%FÞ…ó;Eé²Ýζ÷ÚröÕ`ßc÷WÄ>1×zoõÈtÑ”ëÂsw\=.ˆyóéì‚Äw©3JÓ”z<ã›k °Ö¥þûJ-#Úõ ¶ ÏìŠvjÍ:¼VIÍá@Âc•B«º÷Œ ÛçÎTŸ’k½æì™Ý‚Qн‡u3š‹r•çJ~@­S³JÖ0˜Þ÷:>%0Â!V3Þµ(qƒÜ‘{"qOdî‰Â=qcÁ!±Øc–ÂIÁ™e£‰?RëÿtüÀ§£‘oG#ÏFcLÝ]ØèÕ(nJöh8?8·Ï«ÐÐRƒqâ8y²ÖýˆÿSRäŸJy @P˜åt4¤«Ûÿ õ§‘rAõCËÁþìÚ¬Jd¸`ÀÊT9|­¿gciü÷û?£0VàPäýÐq9>>Rô›"Â-ND㉑oøou;l> ~ùt‘8¹ß]ŠA ³ŰÁñË£ p^ÇÄ7#|é‡Ížo6Èp/%#4*ÿÒ?Û°YùYd m"®³ —¹ˆÄ73ÃÐ@ ›"ß2!rÄÈ^L8þmuä\4Ãæ‰Ä·pƒ€ïÒàùæi$dÃææg¹óSUË+b•!QùæexŸûasB®ýÁF@ˆ™ø·àas‡Í _‹ˆ8ø®«ÿbáëõ7\6pÃJZ@t‹dË_°ðõ6<‚Ö’Œ T–ƒãŽGúYRP”¡wyêT߉Íc:fÓÓŸÉqg8q? „ ¦ ‚ žØ߇Õ?ÓWÍÀÊmäÆbsØ _wš¢áX ë1À[Š™j´…8,„Åp$ˆ€'qð}:Ëåïn!¯²|Õ\X´?Ó— |®pZ8ô5:üÏŠéƒDø…xøGBÛX/$›Ä5óáWõü8nð›kÔ5ß5óÑfN¾l8ÜÚãÉT3š?PоLWŽ5`ªÂ><íŠîÃNîïaD@UúS`è~Ãâÿò. àÏÏAy¼P~NÂÿ% 6‘ú/{WE‘ýYD$(àr¸‚6»\AÃL÷tÏÜ—f‘[¹;3“d`®ÌAb”cÕ€‚""(  ø[PûPNQ@9"H”CVô‡à¹ïUß3“!L'Ñ?ì¡§Ž®û}ëUÕ«÷¢ýðJe´JEûÙbËg¶[,Ñ~,mŠ)3‹:m¢ýðBb´ Žö³XcãÙL1ucílL™9“5N»¨¿ ‹‡¦ä†ž{p¯f x`G„3¥Œé¾L?%°§ÆônÔÐV‹GïßwyÆâÛ¿:Zcî°To-.5Ž×pÙçƒa2l8ÖÄ•åöw~J?ÿ™ ¬{.ÌðqIgA®À Ÿ‚`×~þ³'k•Ï`¾¨bbh‹ÕòçùOe<Í›öÖÐΕƴ1Á€qµ- ¬ q5¾ì_ ˜*@* ( ¤¶¥îW$ZÁ`ó91~X9ݾ,X‘¶¥ÌxcæEr)Ysèê÷zq…g@Œ¢!0£Wk0v󇻡¼jN&‚#N 9ÉS"1C®p$ð Ì0>š*0ë³Æî>‡s}&dèEâƒA>Ÿ$@E…š †ô}„¤ uÂpTL‡° Žå=T "ÿ6´I(Ê awcçïˆÀJQòaðæ°;èˆx3=®<Ù›o§Û «;${šÀ3+ˆ­"ùpàƒ6We€´Î°4s*Q¬°œu¸œn‡—ü`V1v×úÖØ=¶°N1v.,*Ý5Å€™Ë˜®Mª'=(LzLzP×tMzf𠆉ñM&VÈgtŸ’Ïr½¼Ï™á‘?„±eä5 eäcK“Š‘Î–…LxåK¨;¯)+,ŒŒ¼º `ÅdtD58ðäF—¦À]±E€UŽÑ]2ui2…qhtkÓƒbºã¤…qǤõtkÒ³@NGÐχe(±O3,P4¿&O ¤ãÍø£?:O ÔׯÍêà×ä“¿Ñòð¡lÙ¾ŠhûJ‰ÍÓ E‰Dçi…:D4yZ!Ï|mzÐ@ùÒ‡e04¬ S@öÀ‘Íyž„»D*ùÃç c´HMx0MüËtûœ™¸)†p¢®’s“¢@ÚÓ•G{ÇásàUX@üòWH¹3]žKþ¦ÊôyGö¡-Ų‰#Ä=>R”@ƒ0·Ï…E4’ˆÀ{]¡´þ~ JU7UXz˜÷¸¥vuu‚ R¾•×¥‡¤õÉð¸s"®1âæ­ .-‘®þHz¿4ÿR3—Âãf­,%‡Ç£ŸÌM…T†[èƒ4ÝI{°m©@Ðï€ùŒ‚qÈë‡ëEƒÑá‡õcv_Z&ïu{ò)Mÿ‘RÀ|ľN,’ª±iÊ£ØF…¼Ç%Œh,&ðÊc Wž 5ºIHŠ:’Ä¢HÁÁOS®<þ±TôGB|E"’¯´m–ïq… U” Ú:ªY8#(UT#z¸H ;•‹7â!TXê§þpXø”Ž÷©%ŽgiI¹}cD Œ(VJˆ²£„¼(£ ã›íÏ¥ ÎÕþê43p€À²D-«ÉUÐqÔž_\ï ò^1¾N7Ÿå÷ñžÖ: ÛïBÀÁìÈ1D.–2e•ð „e‡2—:]YŽ6A2®¯ÉçˆQ$X„?uIWQ‚–*HiN¹©Ñq… )Fá‡j´G«nµz E’Cö‚Ÿø9Me…qL§¹ex§(”Å&H ž¸Ÿ# ƒ«Õ°V©éc7¦I9Ɔg«{EÿÑQþÃR…ÌHçMÁ9@C„ÌHÖP"™J±†…R¥bJ½é ò¹àp–†€‡Ïpy`ö¡2D~~äÉ¡a¿4e@S»q×G %#ä ukN C‘wަÐZ„©ZƒTN!¾â!µ¤ào’8…$#t„Ži!=š¨ Ü¾¤]RRÔ¨`>'m(7a¡4Lüy ÛK*5Ès÷èŸ/¾óB¸/ÿCB,P,;<ðSÎ’äÃR (Œ(ó=O¼ª³4‘ÑpMwº<w äIdÍ¡ ŒÁ|uÃóÔ.M:ÄËC›åIý&¸`ü ÀbHÉ£ò©p÷…pÝoHD!uɰÅ]äù F‘KJ@[PA^IU”X×Щì‰8"|ááó]AB¼!WŽ!e(´:ñ<#ÀS¹¨4Ê s!t=jÙaø+îÂ/XŒ¶±Á?ÁÁªµÃ&;†T…6ŒÒ”FfÌ$’ V`ôòyÂO©m£µ^†mZrš E2(9G¯ß‰kFC ïñóN2”U(‡ð¤©s…bçªð3:H ›Ú0Mù}b”ò!“I&*¤¹›Äˆ!2ú¼ù‘@@SWðòøs5^r‚R'¬ñ’ÈO¬¦’¥L‹r\“ÄúÀâ_b|Ī_dŠà²¬âq6" ·G¼n`Ö=nxìÁú,èÏ;›r“|€á$„ôò0G‡"A—¤w‹‚ ˜/°!Â<Øw@Yó‚®0¶—?œ Ug?ÕÍ ã¤4¥¯s!ÐEf­Bª·’.Ul %ŒHXæøÅâ´l×®%KZªe‡-©Ÿé¢ü>(õ k, 8 eëv ›äá}Y ? Pò¦4…´œ½&._äÒµj×.f$Õj¨ð– ­C‡R¢‘^:Pè2a¨-•k÷€ÐΗj#ôÚ&‡m©¾þ nÞ†…;CqÏÈ„Z4J‚t@¨ÄE„$´ðMfˆ[E„&¢q4‡)tf Ñ‡R/Y¤!'iJÖrEYÌL Zùò"m²§8¯§]qª ,Z”¦ MV ®xÙˆÚ¢hõkâžsR*è°ŠRØ$u¿ªœ£¡)Ô¼„JáuVÄCz§j=(B\åYD‘ª"¶:ª¶VY4D§Ê„!F¾žÅë ÕrÉ.ÁBm:ñŒ$J-{èTã&b€)Z‹hÙµûÉ·Ðu^¿¤ih?E͈g~´[Û\¡×+…"X4˜ Ø "¡º4Ø$™~YïÂZ4d-˜F=ï¨8MÕ3Žwlæ*®9µ¥cT梲tLœŠic¹Œ†•+2»„tÍhŒ'GÏв0?¨ÉþÆ©[¯©C2¸­f…º­¤ÙPÁ N»B3VìMw¡&íŒÏj¨/Îù K¿Ì7ÝÕFh+¹‹n¶ëÔÖû¶†,VQÒI‘Tês‰ºgE_.FÖ§­·|²KÖ`*‹£­÷w±†,+{Ò«U†±pÄDº¬\°DÄ Œ%ÚCF%i*} x¨K4{£¶4T Az¤bõ)ò(úϦ(8`D••ÉCB’é—Y?«Ú ™Ù$ðŸ¬É¦‘wÀŒÏDcÂÈ óbÎLª§L©¶[ª½D©Zg2ÀP.Ù% tüéèàc 1)ãeŠv8½¶Ë¹˜”•!NÔòˆoÒº¦Še°ª(VYÔ‘êÑ]”dúeFZ…,ÇQ ¤ˆ;Þz¬ž:1ˆ ‘í®¼Õ€T+IGIpJ:jĺJôÉiœI¬Ê'»C-ó¡4M\WÛ-¼‘eA©Ô®Ï¤aRkˆòÓÉ 2Z^D0hŸ «H¶®P×9 3+ø€šÑŽªXdˆñP–¬‡åpà@ÐT"šQEÕÓÄmS™ ¶Ð+1³ÒP¨Pü1 ûDR̈́˜­¤Æ:ð'¹ôËŒ?êU Z@Bi>Ž˜fÐ?\ÔM~”ÊS©Ø#ÖHÒˆÚ*UF<ÐÉ(`€‘]ØS.Ù%Â4Õe*{Äö-/܉²©Œ¾ŠóP,‹èÄÝ« 5ÆØc1†QtY2¨F‰Èʉoø3ÓZ B¥¨Ûí'"ÆpŠâS”@DCif›  –D3)º4É쀖ËÑn#ysD¶B1ˆ¥5a6i1®ƒ’K¿Ì¤6–Æ¢ºgè;Û×jÕµjbc0H¸µT‰$VGB¤6N^A§bY€DN`È  T.Ù% ´ÁÆ b¬¨ü¸ž¸vŒt¢n+iœYƒ6xů “Ã#Á46C«Ñhƒ¡‰Âr†± h¢²cƽœ°™„Ü^ODKÉ š˜‰M"'ÄZì$9Ñ͂ץ7­ ¯´òªÑ€5kЀcô¢Mré—m¬´ ŒP†YßL¦-m„«š•‰6&uÓ‘Z)M'UR&“Ú™Ú”Gv×Cºv‡Ø[,´)Ý£N´Ñk>M€e;’´7G4Ò3´ˆ&´²ãŠ×*†£XXû0 +ôS±G°¤ˆ&»B­-µr¤ÄzÐ ©ôËŒvÍú-â˜aý#œ}éÙa¬1h ºÏ^™+ ¡Nò’ÄFœò’D¨©¼$1©I­€Ê#»„»/„ÅÛðå„ 7j6^'^ØË/hE#6âšòB¼ mf‚´Ê"^ëÂögƒA£l¤?,«÷)–VLŸ =k„p, …Ä*,ý2ëýg¢öKhh;Ü/¡Ílòx‘itr±x!)*©ÜíZ9$õR4óKÕTí_Ð ìå–m»Dv ùH‚¡ãƒ…м²[¢–Ï*¯ÍXF¯¼®âi›ê$CTõ„à€`¡2¿I@7[QùE`6h‹zéb‡þŽ|i³lx  ˜²ta‰[ysšðŠÙÁ:±ÊF­!~–Q;“ÚI*ý2ƒ «9 ²SPÎnG£~IC‹Ýè4›c EQgS™ç@¤Bò¹Œ‰R¤kÐe—]Ó^ú²,g@z³JÈ"˜ãcŠÔ®åƒ*Š\X)'1_X݇=¬_XVĆРƒ¶UF‰ÐÞ&2x€C“MUˆÏ²ªÃ+Á†L"ó¢Â<Øjã¾ÕNz¼‚⾚øÑÜ™ŠøÍœ^pI.ý²‚‹U#ކzŸ í`ÄØ’Ç“Ñé´«%ȕʭˆµ=pM‘ó U“å¿*]ÑëŠþ¬ŒH<b¹@Aq‘‘ør!ú@A÷Nújûï ±5ŒL:š’æT ¡¸j²Rœ`Ö†«hÙ3a}4äå(‘ü°é1(—dúe¥h›Š¢Ñx'ZòC 캘Î÷JHåQµP‰ÒˆF?‰Ðh¶‘›¥ëÙ½Ô›Q"Š6Y¨×@’£ê2]ÑGîzíèF“;ã4‘ %b¤Y5Ò&Ò xN+¼þ$÷£åg,”à„bF\t’qO›ä·æŠCIU;‘g¨ ¹-Ê”‹NeçÏÜh=ûDI¦ŸDgé6ö§³TÓYÀ7³xìh… Lêp+ÑÇÅÏM4×…ŠÝô‹ÛØÊÎiÐzîi%™~©÷üøF;%/P’ ·˜Y¡3qÃFéL»x>Ì©ÎÙ îL{lcsJc[twfRé'Ñ™z¹[aØÉ=‹bC£DF€G+öøM(«m,‹†‘I M_aé'ÑzÏ>XZ+÷/:£ß2åàz`›…›ßHYx¢P–…l²8‹ã›œUU¬kDÕŠpuA5'ÙÕΤ:3©ôo¼3uïU“’Úi5L&ìLV<È2›È½cÒ™fV3çÑf†Ìy´ÙT){ÑTª³8¡±9mc빘dúIt¦ÞÁ¸I—Þ™x*‰²NXQŠ[eŒ ê‰] õ#û· ±\lCk PoG&•þ׆¯žç†õ?'a 8±þg“Êþ¯Ål¶šPÿ3ÇrꮌµogœëpeZ8»ÃÂe:329ÆáäšelÎß»|>ûÜ0ý'a 81ýÓ´ÅÂÆèçè?é¿2žò±ÿ»é‘žþc=êlþnÐ[5¹<¹ápÕoöíòV·­þ¢ÊÃ'ÜÓ?y-3söân;W5®ÿäÒº¹kïÛprgþ5GÇa/=öîüÇF^Ú0rÄk¿î+™véÊüá×?vt¡5evÓÚ›š|õ«wÍùö?¾¨¸ãד¶ÌÞb<·é ÿÒ¹ܵuþcÃ/ý4ò­ì­ÏÜ9ˆ]XëÊ™©¿ÚüÓ˜ï|ç­k¾¿¶ú¹‡¿ÿ%¿ Øê_“³òäˆf›C÷Ïÿáûk+6™&=33øùÏ]è°¿dÆ¥™ŸžôxxËðˆ±íí»˜µ.´šùKQ¿US]O :=gÙñ¢”ÉgwYsÙ]À{îî:ªûà –¿uÒ·9ß½“¾¸Är¸Ñ¦YµŒký„íØ—ûóËš}`O›’n3r×½÷î\ö湋7]¼ÏñHõà+k¾ùêïOrçùñÙÌ›zæ­ž—·z‚kýç‡6>s¼õò ©Žì5oW;û⪇^Ý–Þw݉ýÃú8^®Ê”Œ¨òä_ª}R|[¯zLÕõ‹¶h_wë™›·Öº£äTÿš×<3ò ÷¿yd±)cæÁ¿n½{̾:á'k…æÜµËwî¾ÖãŸ>ýVñók-^9áì'ííOkÑd|ëìkÕ—¾Ø(uÔc'òÝØXÀ8-õš½0"­m‡¬·‹kÜrÓ‚Æ':òÊŽHIõÛî躣Ӷ:óŒøŒ›¾çÌàÌ“Gß}åÞ›¨;Û“5!<õÓÆýw ÿüôÛE_¿ºme'.tÿ¸}G~Ôä¾3Y÷ÖÙn”„¾<¼Ãp öþi­×-œöÖŽYÓ_¬ûÞà[ov÷—ŠÏÝtó³O‡_}³Q•É+ÓŠ|;퇳‹›mø>{ðÙésþ|µc¯úOo³eóãä…yá‡~f>¼¶ùxµ¿T+¸£¸¤Ã›¶>?çÔU¯ãuoû½EC'ŒZaë[óäè&æ­g«”¼ûàÖé;?šØsU»[ý|ñ÷ikzštdÞÑIW«m<2õTÆ×LÆÚ)înYV÷ÄŠI̶¦³3?3,·|ªz“¯vÍÙYõãõ{óCþþZí’¬ÏþÿÅ\ŸÞ¿Ê .Voμ%gÎlvê¡[éæÏwý¹E›œ]-ÎÖøbåø39cϼ¸½N°ýž/û}°p—µS³éS&õ ËÆçŒ›5ðJQÃÖô¸œ´vÝ•ÕãÊU~Çv¾s¶qWÃ{Y—;[»,Po§aÓsÅopÿß-¡Ã›×öæŽ ¬Ö½Kõþ5‹®unØxÍû»s­\wðýü…5}o?˯w{~‹L¶K÷V<{è¹çfìž=ïšù­Z6Oì=xc½÷z®ÕÖ^_¯êr~|ïY¡ê©ê½üÂ_{/™iß²w†³ÆÂ@ïæJ/î}µÙî%óê4z¿÷Nö›Á½³_¶™þöCÑCŸ>¹§ê††C‡ªwæzõº~ŨßÖ~ÚyíÏï\´vÈŽÇú/~oißú£?œöKï6,ïµë_Öß|Møžuéó×…³?Y¦üúÝ¢F£NUßû™Öž~â ~EýÑyi‘öÎìl¸ç©»>2ºÛðÎK~<3by§›}’7ì¼m&í™Y8þo= -×ÝÜgÀ‘•N¯¼2«E»¥S—¦ß5¬ Q_÷þŽiç¨s—}™>iþizûGÏwzíÕtC®õÞç\öÊön“ÛQ?ŸËñz†ÿkåýÝ^^pù¡)ÞG{ÍØÖ zzÇ ÔºôÒÆ¡K"îf¿}{êñª vô¹|ÏýzáóΧë¯1äŽÜÒ¸Þ—oî ¯|9s¯ÈÜ+×–yç¬Û¦ìóÚ=ß°ìò¹NkG03¾þ⎻oÜshañ÷¥¦ŒY;eâo——ž0·ÜÞ=fÌ= Ú=q0ü9]ü‰aù¤'çž>¼ dÆ‹úõÜ޲ΞG¦Ÿ[÷Ë‹éÛêq|ïªúOÚ{¤iáE½îÛç«òã¼3[7-zo4iAQ¿Þƒ\©ÚïjѶs#žôÔ’á |sÆÌî~ìØ†Cni¿z}jó¹ªSjn}múЫ“©W®Œ|ú©ÏŠ_Ÿà]{Ë­ÁEÿn½¯î›Îjž‹Cÿviÿ¸Þ¹ÍÏŸé™ñ@÷jëók?vœX\÷â„5%Kúíº'ÐÚ9õµ6cVM»¸kôÎì?|ª]mKɺý=—{›Õþç›%kï»ø?ö®HŽâ<ãÂÜlLBˆrK R¤»›™ÙÙ•…@H:s–ÄÝIŠÐbnwînN³;§ÝÙÓ›%LÙDÆ•ð° ;›(Ä#Ab eÌübJˆ1àBÆÆe»*»’ÿïž÷ìënïVk˜.Ðm?¦ûïÿÿûïžžîÿû¡pß3ÿyõYgŽï9açMÛŽýØŸÿÅþƒ‡Fò,?ù©]ݯ›¯^ðÐ-Ûn8øÍçþI¸å‘È׿xâ#_N_ñüË÷þå—ÏùFyù‡7ÜÛ½5ó›ŸÜýPöùÅÿòå/84±»xÑ ›ÿ§|×åÇ^¹w}|ùêE›n½tâÐiOÆ÷íxõ?ýâÄXþ®ç>¶èÙw††Cé[ Ÿ}àŽÂúë–|ó¥«/Ù^þ‘»Ž»ê ¦^ûÖž×¹[3é»Þ²óÕ‡¿²¥û’ô‘^}üñž‡nøýKn:¸cÃÄGö}âÅÃ'Šç-=þ·Ó÷þú‹G~ô±ƒýhßOÏz…ßvVMÈM^Nð³€Ü´\UÎä¦à…Üt)r“aн·7ñH&Þm§·Éêñ5ôÞØ'ç¦q›zO«!ØØã\k8œq>IQê˜S§…„¿¬Âɥؾ—j(Æ.yZƒâ%‰È$8 1QÁN6í ¤5TN<‰XBì¢{}ªšuÐ<'Þ—ÇÑÄn¾&©qã í!sÒÏs ì:¸ˆ7T¡Æ7 [ƒæ¤Ûá’HÏó²ØH‹š¼ÒÔH'êBEâãõU›¼6ÑT'~ø‘eB ×Ç mú¨uk ˆ~G7‚ȤFÈ¡uÎgγ³š5DÏÕì`#®4:SÖ/>h=Ôc);=4ÉɵÐCYV;ÑCÅ:衞_b9^äÌê¦À !¤K>F⬆Ê'ÅP9A#{Š@*'‡Ð9¼:§ Iá´D2D‹Âi)9ŒxŠ·ˆ‚ixÐ"˜&r!šã’®OæÂ(¨I1\.Fy>Ԇȋž´0¢¨ØQôŠ_œÿö3?<îÅãn;¹àÝ{.XN à‰Š¢_€Aý_±w>+·²I–¤Úß8úýGùD‚“ãÇp¼ sò1dÖšæÞçû¿ùK"ž‹äߎ¢cäÏGòoGÈ_îù ‘üÛòOvŒüã‘üÛòOuŒüÅHþí~ùó\§ÈŸ‹äß–?åOÏÿHq)’CHþ])3CãUÉ®5òYüF ë»vQ¼ur<@×9ÿ•Ä„_þ¢óŸm KNß2ؽ&kŒ¨ÝB[²ÄÚ]I‚[£uwF—Á“}øÛe›¢x¸7EW’ϸ§›—‚²å³XÞýH±y¼Ñ#ËìˆôZ#—ÃïÌ1 öhaZH ½ë sž5Glzè;íDvB¹–&7*¦–çI9F/K÷®Ïg lu›JQ¼ÑA•R((3´Èåb±þÁͬ;‹pô:ý˜jRüÏ)EG°Kûw,æ¯"F(è8^øë]³Þ‰ñS2%SuR¼-®2¥Ü¨®N;É"$g5µ µ¢“ÈA"ŒÇ)÷i R'ÙIˆC‚©éY·ˆLz×fÔ¬¦ëŠÆë}d€l{ׇÉࡺõA2x c½ Èè÷×Ýî¯RÓªúÚï«/)[ƒÅ@Ezwø‘¡Ü“Ï;E ú1µSòÙÝyP„Þ*¾Eè­¦N„f•`³"4¢¸OBß­¢„H²ˆ@D&Àp HP}$H@‚&A†«A$hTõ5 zØ«ùë2µ*õ1Z¨>è§æ«/-d3C1 8ïS¤føÚL@=F¸ÍbÛL@ ›ÐÃׂ TEQ¼íxªä—9PQ ·))¥`›2ô¡äkS†6güõƒfì A àAÕ$€P @x’W JOªÖ(#óG^5±ÐÅ€uâÿ&;Fl˜i×DÙÅËP7”T§Io_ÿ: ÍLá¦+eäž8P½ö3„!VtÝIpL[ЊQËf œÒ 2xh-¯zàá{‡´œZì0`ôOßc@ÄSÚÅøÝ7Ö›1ŒBև퓥¢Jv¸­‰ªj¸NG‹“ 'ži4ïîÏO bRŸBUïá,xÕÜEË"8*?oA†kS$ø‹%޽À´­é2;‡¡ûÐDl„xTZ"E­äJ:…55L“=ÊW{4Q%±VU㜔{ñJ)[÷Î* @ž]# ¥Ž{D·7Ý[ç*X™¾ût¾V™Ï(ãM,å«&píJÍjʘ‘Wô¢?0n»î94o¢a˜ó1/l½ÐÞW¯¿¾f/}ÍB6Â=c•õ¿èÞö&å®%D#„ÆŠ±®^öà f?áhÞH ¯3Âì+M³çÉ"¥wu1 ò®®.wäÙÔ’B"纺ØÒôÒe„ÊXÃ:IfªÈ¢KWXéôô2– ÙW»( º¯»6ô8RäŒRìG¬Ë©6Y[šÙ‚²—€˃ èʈªÃìCF¬õ8"©;¹¦aOÀj ÏmX9ðÊ­Bß–¦ŠJv‚`"pæy¸‰Yž(+ï&ØœdéœÍà.Z ËBc]89RpøKùÒÕåµ 1ûqÊC‡…[M,°xìô`:«G°þ3Ößé"~ÅŸÁ¡"F¼vèðÓiR€09?h7€ë¾(Jž&¹ lTù ¹×J}âTu]›,ª»è=UàAoaÆË¸Â´7æËòæäàÙ´-7ýe†%Ö5Mf\ÌûXT ­0«KÕÏ,àJP)d@‹T»?¡ì®+Uë¶«oœ:‰hGغ2£èà-ª{b];ë4É2$X‚5•JºIæBª¨Ú¸ ¿Q¸ÖI'ø/£=IøEDo$á$ÈpÌC,Ègaf)FX¹7§L³Ÿ6oaE_*ø“b]þºœ<)–FˆÓbÎÈâ;c¬KÑ %KUÙcåÐ<¹†Ô6sK¸ûÌòšMžO^FÞê“K.2éD…£Ç“U°Hµ/7Sšœôõ’tc¯/É©ÐÎÒM_"«b ±›n“ÎXtÊröÒ^þí…u[š½õ[‹¢A|­Ç£±ÕV6¶Ed7Ïs,Öu þ€Ùƒ÷³‚±×6ÏZ³S™‘l ™S`Ž.– ªíeÀ„‹ÿ,CØ<¸e°›¾óOTùe˜ãÐsÖSë´¢‰“n!Ök?½2U:kUH·’èÜÉîõ, Ӓ鬸-rÎXµê ¯´äŒÕ«Ï EeT%Fè Õ)°à<Ð>¥ep™¤+ù± ?f¸m_F¥Ì;M 5ëõÅ¡néªUË`FÊ“¥;Ù_›°@±Õ«k£Rfd"c›@+TÞúíßJàîØ è¼Iù­$[Œµ2™¿˜µg„˜ð&o›ô ˜P{cUºÖŽÙ7g‘@ãN.Zhz/£Š;;wœÅxL!ÞW[ålWsuÉ׌=ÏÂ"åq¡¿]\sÞ|kyœ{õ0Ý“^'¾ž fê™AÙÃþ÷ªøë«çjÏ¥ßõE D»®ˆë—$ —ºE$‡'ã³¶Ó@êëσ(r Ü€ÉKŽÔ9¢KÎrâaW—†H—ìM™óX1üǦÁ¤=Í]R¿=91Oò)O£ƒ°¬TôPs‰Y{·Á"ªT*{êÜÆ"TcÒƒÜi#Ï„êiìÃÑë ”:»A«bkÎ@ù¤ïûËF#³»]^@il-eÞ{ìq/Ó~Ùn½‘¹xm±¡:ƒ[ rÐÆ ›°1!0N¬;ª_ŒóôCp]–Ö³‚œ×54ºM_ÈÐxµ¾I’8I\“$y|T¹Æù6kcS…‹á±…-ÊR{S£É&ìMÓí&¼fµF{MV%yMæÖ¼^­2ÇV‘eõZã^›8T˜©-ÄÂ©ŽƒQ­îY â´ê~ ÝH9Cc|œ&¢óË”×µÔl½G¹8&Á\#‚ά„¹¸+ütßÔr˜å÷ÿ9xjÚÿ=ÿ#È üþ/àùÿèûÿ‡,WU•8%›Š+Éx–S³#Yud„UR©LühÓ…… ³ÿsðþÔpüÇ!1tþ‡‹ü?µ%Ìÿ§Cçm8–?á7¶ðþÅO<¿øÝëÒ'}|ÿ'_º}úÎOýóó÷¼pàîØ«¼òÓ¯ëwømúZýêÇŸÊþÉS‹â·_ðµå§(½Ë§^zú·¯šé¾ñc׿žù‡“{cÅè‡_ûÜ™×¼yì=»7žòò“¥›/¼óôï}é6ñ¡mÛ~sÛ1×.YéøÁ¿ÙýXî¡}õò•}W.ÝÿüÈâ?à¿zþŠŸðIþFîûÿñ;^¸ùWï{"Ù¼ÿø¿~ú’á_~hæ—K¶=Ñê…wïØsÿi??îÐ+7Ýþè‘Ç—ž”¹þJåÞ5çÿiòg÷—–?ûTùÐÓ{ïøõk?;ò‰¿ëáÿè«¿ÒIz¸ïmýšûþõ¿|ë ù¿tæwçvȇ¿ýÀE;6=÷Ço•Ë_ØÿÎ)©¥ß¾nÏÐ3oÝ;qé­_ûÑÄîSåÄþoÝýìÙ¾(aþûÜüõ‰ûÞ=åÐÖÔk…Ÿ÷.+•]CR7ÿ憫¯:ðôéKî*íøìÎ;é Õßž\ºìäË?xÝs—}÷çßtMÿƒožûùï»^ê:õ;ÿøÝ?pEwrM&"Ÿœ…ÿk«m^ü—X®I˜ÿËAIÐÉ{É×U¢¯¸ ïo×ܘ‘ðÅm¯×N½¸-Åk^ܦYm¼¸Í u.nãæÐEk·Kýi\"¾¤- ¡KÕÕ.nsºÎ%Ãi<]Œæ’b8-%‡/‘{ë\dÆó€u/2ìûñ¾·>÷o¯¿16üý»¾ð_ËÂ)‹Ì0·sÿZô¾ õŸÐ1÷?Ñùÿv„€üã#ÿèþ[B@þãÿ!ºÿßžçøˆîÿ·%äß9þ¢ûÿm ùwŽÿ‡èþ[B@þãÿ!ºÿÛ–çø"ù·#øå/tŽÿ‡Hþm ùMÿÑþÏQùwÎþ_´ÿÓ–ÇìÿEû?í ùwÎþ_´ÿÓ–çìÿEû?m ùwÎþ_´ÿÓ–çìÿEû?m ùwÎþ_ôþß–ÿQßÿÿä/Dó[BHþ.pLÉÔô"CüÚ@×ñÿ(p\Ü=ÿ ‚ÇR"ÿnGHÏLª`Á˜j–«É¾RŽ¥‹*½ºŠùé]én(h™(Bú4]%ê¨Z@•Xšú”)×ѨJšº;£-b–S×Ùµ©Tb•ØÐ¸Jå‰ u)«IÑÈAR)ÏîÖ¢cÊì5Ðç‚fŽSƒü)E/AYôÐ7°]p™j±‡Äbå´i’ô"«6²xÕb,ß3¾xõâJzR) ¤ÑÜEéO•+Õ¨w³ÙÓ±X¿õ`VT¡ÃùÌ ó$@)­ÑÓ•iz®<ª• jeç¹Ã1+%£¢Ç 䯪L©S9#«ÆÒm´Z-SÜI¯ÊÉËÉIs¸Œ0b‰ê"`xÞPæÖŒ«a{iÄýŸ•û,+65kܤ’1ûM5§]ŒÅ5øEb(cROydqZ)š‹ Ó1]Ëﮪa»¾RÞ¼èÔr%÷¦»û %ˆ£ ÒÝCþD7@²´^eãP•T)›éîÚÕUP–ú°Q+š•t1§è:íE:2 š¥B´Æö…"SÔĨ‡XEc¾j¦ -Û¸çB¸çëÂ}.å‹Ì“–7‰¹ÂË\ ­™Îô¡'2§' Y<‡¯å¡_9z{^z÷}͵§Gt´ÏwÄš2j[¿¨¤Ð|5ÝAO‚3@cÞ]^§šxØ;KÖ©ìt>$ο…µ:ŒmXb';‡¿rß“íªy±ª£åMÔÑrh2•:äí¥YgÓ‰·‡Ý+ÖÇÔž¼jV¨anX ì8¡¬°Ú³Ý!X9Ìõ𠊢ÐWãO¹¡q­ˆ¾ÁüæÐGPVCÉ”Lª”UãÆ¤ŠŽL¢™À2îsFKú %Éöþ¡s7o"k6í Û× ¬Ù4´ãÓ”¹äªS*«GËMêT»ýçÍbŒ’óÖ¬=ʯ9§cÿÐÒéëÚ´~pôm kÈ–5Cýk·n\3@¶lزyp}¡4S!£¼lâ•‚Jt &‚"´ÞÑÚ3¸Ž9_´³zÈ ªRrÖ“3Ô,z´%k©do† /Ý}î–~—%¶þ@Çu«>¬&ž\±'FUF qÆ™ÔK d«’U&‘¥£#ǘ1™Ó²Z¯Ö°RØ-%¿»ˆnÃèä q#§É%ŸÓTЖ™´DÏn§ÄÙ£­'cä˜zÕν²&x§H²ÎÈ”r¶Û"PŸFk,jcb³_vÉáª'Z¤!ƒY£³Ëõr+»½ê8}VË7Ê*‡[;ëÕ<\NãÅz±œ. ¸ân Ö¢Ü$•w‘H™\…šïæLsÀ2—ÑÒšŸ}f‰ ª•e•f–°(4P€ÙÚëª&q‹#ú[é,ö²^³ÌŠYd»&—x2ôaê¤TÝ`6Ã" ÆÄµë`ï©ñòWî1{UU˜'U­­bU´ñ³ó«šó¦– «B}…|oé!ߺÂZž¾T×§`nu}œeó¦—Áš›ÓM÷åÌÒ±æÞ»æãµ‹ê(KÓÚÌ£67~ kY‘‘¦aZ®¨P[q [_=Ã-Z„®¶ètBÎz˜zÇŽÇ[×ñÚÓyãå@“ÏΛNÏÓ -“¼¦­ý]›óödŽbðïÿÇæù_Ëÿ ÏÎÿEçÚBò7©Ë œÔweUk“xn°_N¨ÿýG’‚¿,Æ…èûO;Bgá%8™ˆ©ÿ+ÂÿŠð¿"ü¯ÿ+ÂÿŠð¿"ü¯ÿ+ÂÿŠð¿"ü¯ÿ+ÂÿŠð¿"ü¯ÿ뽌ÿåî5‡ÿ%ÁË¡˜xßàñp+xwÁ­ âBrñ­!€µÒH]T+Ûhî_Ûéâ®TÃvqrç„ÍÄãve"AøLãÉÄÜᙽYŽ÷| ƒ´+9Þ&x&»óø”D£¶ 0št£X8ÙŒük*Ù¼4WtˆOAv•Áþ‚ L¥QIŒŒNU€¤9) ocÞ-bÞ$Ð9ºè`/¥/¥HÙ1(鯿2·ÜT½‰XHQ .Ê€Í.˼øss-O¼q";8|° €‰V– ¼€¢+ìˆÈ%N¶À 8å¨Ä/ìðäI"Yu ƒH[ž³­¹Ùá÷"š+ãIþõàZ5•z³IÎ;áªÓæ®]#¥ÑQ˜&æq¾å¾PÕD>µºjq{ŒQ‹6ìI {¢UGsuRæ·¹:*[ϤI4%rxÖF©0¡ÌjÒNà/!igÐ3©áàrösxŸ³ÍE¼Ek!pˆ-î l ¼…K>ãtu)xæmŒKx™~©°G ,7? q|7B›œd²Mq jX.Aß¼¯fžEÊ!Yþ²ió2Çú›52 ÑceD‰)oÍÊdz³â¨ÇÊà4v\·k»;¶m]÷ mŒzÆ2ndIê¯ æ§¹::*&¸ªÖ‚r™k­f»Ä¯ŽæíËmeqáX еy0IÁ}â,3ƒ@²Ì…ìšA&Eç)¯Ñ\ˆ`bìü¸€;•=#‚IÅä»ëQLÒ¸(±çm™-¬9ñYD¶µÃù‡»Ô’9™SýM›“„wÑ‚KcQ ‡yÇs6'#½Ùï.š75s¦C–+V'íõƒœ¤Q{ý€Ñ„¥…µ§ƒ&–+óÒÜ\—+)¦˜  &Y¬TªÛø%öÄç´Á옘Äÿ³÷äñMß{qÎÚ "ËÑ/,ÉÞÙ …–¶PÛB¥ !M¶mÚ4[r”£"r |¹D~T ‚UCøñU©(—(G-H± ˆ~E¹ü< ‚¢àof7Ùì&m’&mìÝÏÒ™}ïͼ™7oÞ{3S/"F%×H0›FB¸j$@´ÀXQ(jpŒ4Àñ=Ó6Mˆž#$„–k ´|ˆã~k$u†ïµ¡e Ú Óî»!”:º&HmD¨Š¨¨ø¤¨ÕJšôI©tnµ ßàªÚ„A]T¯ÄŸº]/‚w!Éɯ8ðQÔ¦›`ÁA:ÞãP €ºâ0ŸáÆàÝçƒÔ PmUÛØÙ°&L'Ù'è¨|`ûãšð¾·‚“º' ºsH@ˆ|8Ð=Pç¥L ņ­"öqL’|Ò>Ža’“|a¦výÐ ±Q/èÜŠ FªÃË1~¯_êET`þz![œ aûaP1ƒKµEBÃ/#ˆZçhÙÈóyQgø^ëj™í,Ý0Ø~ Ý?|*¥ŽÄ¥:@˜«lÐöêØ5x ôaÒ®ÁÃ$!&ù„?ÞŠúAç¦B¾c8éªð­ ê¦ `pÚW;ënâ üT Ôõ1Ú)¹ “R ?ø˜Ÿø%᪠´/Ød‰ ?¡–Ù01~ʤÀ?o`iA¸„—Шl4ÓþÙ0}‚ïµ´`dFA ÝÒ~Ø0¥NE;ÇPLØê!Yè£g¯½vâBŸ&}õ‚ΘÒe\—u "˜z™ñ1™ €ãZ xYà$°8 Þj€a¤ P‰ƒB…1CÃ…jc 7 :¼—Bý3<úßkå_¦1@Ÿ²ÍØ‹Ò~ 0‰ 0³F3g‹O}ÌÐ{­l-H@0i×ÅaÒ!EùÂn„¶¡^й“0Htµ&ÚYlã:ê*¹QAåeø’ì³ú^QÔ‹Žá,_l~R¸žr–/ÐÒˆÓ¼ŸÊ (_ wï…´À5Tü ¸|!ãŸjùâ¾×ÁõæÄÂCpÇL O0IÀÐxFp25´Ïš'ÁáHäc$“=O ?!1>Â÷ÞÉTÌ£îÑWG€ $ôúáü–+(å EôÂe(J` ¿·z ¥Ðcˆ«¡ÇPeû….á†5÷ UÀ¥š<‡@ `IÆfúßfúk¢åi!(éŒÚXqÁÃ&x*Þ°Z”@‚¼±ZÖX„ß̨;üº3Ão#˜Ð1T²‘ÅûÓ žGs$# #.ý1ð^¥æG4-Šïá”–‰“¼MÝÀ̤ùÖ•õ|LÞóýq¤ùßëð^TfDSÃÈD\Mø¯O*ut†D!Îæ,æÉšüFâŠê(Î:¤$¦õ°¤‡8~OQƒþ¢ò9b¬)Ì߯ß]ð| ªãßþ°æµ×¼é®*/FIbù1‚{‡ cøÚ´ÃùyôoJIÂîá;¿"ú}îõB—¹ÏU¢$Üo‡úác•:’¨iØÒ}ÎWEtgÓˆÃñS°~¢7[%Múä<÷™;¿ËÕfÅ~øÎÝŒcŸÖ°Žùì {¶èˆ€öo¸ #àV=ÁŽªH‰¶+\ ©ùm|;«Ø)$¥ãR"Ç1H¯_>3_ {­¹É'{BE1? à”RÇHƒx'k,Úl]ýî²õg²'IÔ>h|ÇüË×[œIIʧ©Þ?D>Oô8âj-·ó ½CÔ êi¶§üŸíÔrøÐp5Ü„á Û®k¡uKáÜýÕÓo~9ýNäívëŸ]wcàˇñdå‘ÍÓ¸‘\Hù·Ö;kGÝ=ö¯U‘¿þýCëÊ‘cÞÔFf<|ÿøÙò”¿ï‘ãWª&%9–±þÏKw«Þþ©¨¼êvôÖòÎäEæ)¯_YÒ|ÿé«+#‹>©x÷ì@ëÀôÉ?GlŸ”»¡*¥ìÍ ±•xxéŠIíôY•öภdÞì<}Æ·/ì)%ï«þyÊî'¯_;ÒjúÀ–§ÿÀ®†œžc¶n1‰;݆xŽ*Ú#+¥íÓÅ-Ú¼õÑÿ­Ÿûý¸w³ð]Q›"«ªÓèñK&–‡äëG®‹¨®®¼¸fhóƒšw?MZ7ìÀÔ½'z%Vÿr?ìSí¿ÕiŸTžŸÃÄ\Y9úåCæ2mTµŒZ»¿sȶöO}QÚ|_BÉZ•EõÔ—´,í»Iw©sÆÐ„õ6.{)ãUmÛ,Uÿg{}—­ù÷?.*ýü™wwu˜–Ö±Ãê›m¾»k.[yVèý 7{¦u:ؾûíÎê/"ï«9zeЊ§#¹™ùÆ— ú]Šzg×säÝî¿Í® ÞÒY¥~fìqo´(=œ¾ø@që™ñóÚ&VFÇLêv;¿»C».wvœO|cÚ79OO;¯¯¸Âµoµ±GyWËñ¢»Uë’ n͸ÐâÒà•*g¯ÏõL|Ô…yu[×nGûE%Ýé…äÖÇÐl½Øšì=÷ò93ž™¸-kѤ‰-Ÿ`oßH~ñãDrÑÂO÷/7ŸxcÑdbiB~’°ù_9ßÿµ¹Ù´ý¯>:ê‰Í­¦mì«úÀ­&¾voÜ„ˆÏnˆ×­š·ñé{¿,¨\ôÁŒ-o¾\=O5•é×zÝói×{;7vý0§YBD꽡‹þø<§6DT„´ Þ½¸!^K^ß—}¦ùºPÓÕîaç¬ê¢²¯þÐ ìñÉ&ö.ž³;;®bq木KR’¾i}eÛìàb¡²ìóíë/ëþ7ô戫«^½_:©~È+;´©ÝšïwË(hYþú³¡»û˜*+wUý>`ÂCmv ž–»mÁlåÌ'ô~Ù3­}Øœùç¾~íÅøœbr’ ‚'˜–åœ,ŠÙY¶àkÃæõ½Ò.'¼Èm<[t€í6µµË9õšðÃLìcñ ·~û·ï{_¹wàÚØ3nÈE׌Œú¯®×º‡^ï[Ðæi´Å’¨KªÞ˵îúj>qððüe9 _ÚYrt7{êúÝN×ÇŒº=cq?iÓÓºt;<ë÷cI1–iwÍz”˜ÈOíïHÐÚ?cS tÏúñÉ’wv(Þ6h‰º[IÛ«{ÇŸïd=°`é—{§}ž°¶pó¦-3‹Ž=ÞžŽÏ8:[ÿ ñúû©åÍ'•!G_ ™XiTåå.ÏNÛÿê— ™}¡´¤Ï÷ey¿ˆÏêš»|JqŽòè鿋ɓw;÷©ˆÞ5þêîVóß 6=reäãQÿéñÕ¢¶C&ÍüøÁÎÏ_˜2rãž‹gž½½¤û ð^Cc:¬~rÖÌo¿ÜeMzÒñ‡Øìƒ‘‰d³5[Gå¿4*ó‹u¡iÓ# prΚѽv z+®°ë´~ÁUß·f½cߊoÏßXDÝÈ­øàÔ–±ìCï-6é¬sÛßÜØ{[JÄs™GÎGß­X¬jWu²sŸkKSÞIÝ=¼K‘²ÁQîÒ×9£7‰[óÊÚ½WTü”=woiñû‘Š.Æ[éý.Æí÷ö+‡öéýÖêlâ9bñÄ6éúÿynmßð5{**¬‡Éüc;ÊòŠÏi{m] r3{Õ¬;¡©=~î·ðB~âoÞ™ÞÇd¼šZøAî0«¾åðŸ"+&-5½†î¸D1°;}©¤Ã!sóª>KW}>µïÙ’æ[º˜ O˜qÕ û§.øj^_ú——@óÎ8V²wëØÉ•·J3ÏœÌ5Ï}¿ÝG¹IO}~ý52"†Úhþã³òmFýqË®ìœT•͜ߢý—÷w÷¬\¼dp‹×³^éðëóË?þ>èLJ'ËÚtâúÝÕÕµW®W?X~¹hlDÛeÍ~—~zˆÎ!vÝs£lAzÕâÓƒŸ,ÔlKÛÒçì Šú êJÆ4›Ð¡ONé†Ïî¬n~n6QØáx«CåÅ3÷<9~FAÛ1 «%îºýNÁgKÖŒÎïE/ü.=™YÔ=½GZÁ'䌷‚~¾š±ë9îå':îËVMé4"Vµäý1[çh{¦Ü´._ö×è fï¾ã/ðc陯7>Ò|éå6§J¦©žÔqæˆù»õ1;n­8P–<¯'µõÒÚWçÆ3'†´øttØÌÒŠ°ìNНNÝÐ?îбŒ'‡U·ïuûƶǫ:tÅRÿÝG?¸O›µãW…ߨ´©§)ÔBWöíÖ2«ôëä9×Â>~ª(ææd,÷VþA]ø}ÇŸOô/\Öv¶iü§VÊ6Å¢j µçŽi7uj>«„+Ce«Ók¢¹)ôµí˜Ûñ åþŒZDJñç²ãp†Ù¶“ÍH²‰Ó¦°–qJ0»#ÊTvŠ|;Å2„¿‹Áá“8x:ÆU…º%À«CÊ<’ƒ»#ÚÞ!9±<îÉñê4#ä8Ëy먅 øÂ¸[r<œ†â‘Ò}»Àƒ,Ð.(¼xË-!ÏTðH å– çº6SnIñ°KÛ#!ÎRÇ©ë¢#~ùÍ’îÇŽW{L=’£vßWH ×{hùï¾ëºßÄæ‘·2C…G"ñ[AÜ÷Ùºl¤ñDæVæÂÃàyCЬï^èzŠeôH‡[q V¡KŽrßy=GWy$Ńè¥T8Ï}oññá‘÷2„5'8xqž¼ÌI‘ÈÛ4¯VŒph˜DŽP+Ôò·’á­1³P-s\/ T æ90Ã,TÝñ=ÐütV-k ‹MIF†dsf‹pé3¢î‡’ üõžzÎ4œ°˜L…ªTF¡®&ð>‰ÓÕöÊv3h˜óÅ énoMï >²ÂûÃÒ…ÛAÓ…ëA{Ã{á,6lHo±§˜ØL'‘ÓæFY-Ü„ ZÎ`˜0¿½›_Çv€ vÿOc@ØËøa(…7Åÿâ í–œ¥ã2Øp¬ŸJjóòF În^·^ÞÞàË8ø•àá¼p³tðF C»ÝÂ@g3ê`ùhÎjÔéYÑÜ”‡÷ÔðáE [æsyy0:P·Âòpƒa²‰3pY e g‰»raû¡ŽÍTØ3…­ˆ ¥™µXó5½E üVpe¬QËA¬£X-¨&‚‘¢1™4SyˆÓ[•BŸ2\€`…À‹½H$‹™ÖT 1 ùVño…BB :k>µ†2*VL¡ ¥ÑZ-¬˜ƒÁ½ðz“Öš—i`§ˆÙÈÖéYkÖ›ÅLÈc±Àñ5 rL©˜ƒ ‹Þ s¡å`-«Ó { Ȉ•‘x«Œu%àbÉ@±22P@F¼¨v| ð1ñ.ð@]ãeðp3Ò¹è&Ê12$4@ã Œb>‹5åiŒº ƒø!j«‘}H€Új\©#Z3Z Ñ8¾u×Èh%Y) @„Ö©ÁI@+#$°®$€q dI RV†ôC¥^©¯ FïÔS/ƒG :­‰ÓXÄ@±QÖ‘(@'ÃI8œ+N Â9ã¤@}99NPN†Tpf0e‹9à+«œç€ «+NbuÆIƒ:Xe8i€sªh ©öD¡²Î‚€W@ ¼@PD›­1i´p'kå@È€ùÃÈZ`±BMx Lø/SoÔeÂ(k˜0;ª$»¥íÅ lP’‚(ãâc# r€ÿo:¢Ïd fVüf:’É™4ƒ˜!Š6g)ÆK6Û£µš`Ð8OÜÍ Þé,$Q1/¨LÕç±æð=ˆ¤n’wñA¯­åe4gйyUË·b´Sío‡gô“¬¬›5â–¿® È`Îjܯ-¿Väö÷5¢–¾¬€ÖÀjLŽŸ›¦#z% ûtgê@òMœÌg¯ƒè§Á6…RËq&]8d_x¦&Oo˜ŠÈøÇSþÓX ¥xH|Wu…)öb5bÖj ¬Ð£!™Êxãÿ³÷,0’W“͘$8d+„»Û‹½;ýï™ÓyÇw6—8¾³×FIîN›Þ™¾Ý>÷LïõÌì'ËÆñňs†X`›$Ù$r~›`ÙX2†Dl Á@lä@ä%|$¤Dð^UwuUÏçfgf›VԥݩWÕõ^Õ«÷êUUï{k ºÞ¡SMSXs@ê"­ BQÂɯw£Ž“¤bð­HŸ’ÇmÓwÛÐ*zÙ8yº( #ˆPµ‚—Ö¨‘–f×§R8ðÑ Óaªýµú5åµÖ@‰lUÐ?ÙŠœPñ"æV º¬“-”s.¶¹„l‹h’g +óhuD`·Õ¢íÕmxÎrÐrü¶ ¬ÁímT8ˆ¾ƒ:†:X å ÷aÏ@ÙJ{‰åÄv¹C†!uè¼¾X¥V°U‰Õ"üŠ”V¨^Eo d«´xä,¡¹v¹Ta_„ÙV9+f<1\BÇð}¥°èq•,wpN—¨÷ ø,%’dSM @%ñá¹™S3 屇m’úZ›eg®ŽàgSðSY"Š]C”p $ƒŠE q)Å~”K‰¤ÆdmÇÜl„Î:=¼Ü‚)à;K®«YŠìqø²ÁK;A¼dÀP{øjT‚ÿ#c\‚QfSÑiœ%„Ñ£eÂhb‘eõ@<’ ®Ä\¢Í0°"d8¶…ò¨/—RIÔ åøq:†|·ãil¬†^“vz°Që´ÿfô¹ÑÆ7 7ñ/4d€ÔÁ¶Ã‡¯¥°º _h7€˜Èrž‚“êe©RâfDb§ëûÞjÛ]¤NK` *á¦8pᆘ“ŠÄ’¦c¶óå`þ2ÅR.mMÒ V÷ýå4 X˜Ö¥Óß«DKÐ ë0‹Ü¸™PæûE5ò~"É)¢aOøÎ¦Rám»çÊ¥“0ê)vÁ¦rÉ,iÀZì©Sm¥ß‘¹Ñ[Ûð 6£sUøaCÌXb¦Ê3§Ë`†‰n˜Å"ÅÛª4 ö5[°è»¡ *—ä¶x•´»K„cl Ü3–KŽ8 :•-‡ê)Q¤±šÛŽ˜+èÏt‘¨6å2‰_A+êSB™t¡BéálŠ*¶éìknvWW¥¾ÈÖ%o0.ò;5± @ìf‚’Ë"¯«Ä¦lþcÃ'òžÃvý‘Q´€Ûzü§~–M¬™¢¦ƺïÁ¨=ØŸ…ÁzÄl•a‹¡LÁ˜±†l:°F·»¡û#° ƒñß3„­ƒ'féž5t;8^AgºÐY{êˆ×î࢖+ñÓëPèÒUk›láQ5ÀyqE0 ›Ý·ø#r>|€À––˜Ÿ?@ÚΗ- ƒÜè®Wö5¯Žf’ï´–» ~>-Hp©`{Kå(4àZ´}áÔÍ>|V¤™9É>cÂRÕæçT£\f d,c‡@‡€T5ú.ŸYø“œa…ã`@·:ô_‘Aˆ¯ƒw˜ç©rtf¤V©çÆX¥×A…ÆVT™5™h;¦ß¸‘@ó¼54ýßÚ>®ú9+«!â–%žr‘S®þÎ)Gp88Ї@Á°Péÿ³Ek fçÊ0/‘ƒ ˜’!ÎÁ€SBüÔ!3u=ˆÎ„{cåôûC= RßÃöHE“®%1†°;‰ü!„c0HN÷,Á(bõÛ`J$ÅÛ7^XDãEèÑ%zôÑèIœDÎ\ER#y ­GMÛ4O<®ìYü÷¨*¸Œ½Š¼óâtà¿Wî1÷O*¸'UA¡Çg t¤Mã³Vi¨ÕžK“Œ“FˆgbÑl,«‚(‰¼‰ñ¡µI{NÙÐx}DSÍ~Êa<Å0Tè>¥*ö³—;:5q©=óÚD$“slM€\•ˆÂìhD%”eu0UÐ#iˆÑÒHþô¤¾/^SðÀ7bSº¨Cokùýã>pûp³«š¨o 7³AŸ³zçl{ôðoýív4VŽeÚ`f)sUÀÔë.ÓDø\Ô!W³V5ð¯=Ix©Ñp'jÿå; üI鲥܀2˜©²!þCóET?¿££9sOèF–%òɕԎUÓ÷Ÿ¿Ó"ÉiŒ÷?vì vøûJìÿ•¾ÿ¥Ù6¾ÿ¡˜ZñþGiÉR[7 ÛV–Ìš­kõFÝ^RÎÔõ%·î“Šô}Æÿ;ƒ½ˆü뚦÷¼ÿ¥þ_3ISòÿzë ÇŸ&?öί’|{ñÁ׿éÎÞüÞ»ïûÑø·ç½ü¹ïiŸ¸ÿÍ¿úígþäŸÃË|c³{Ùç¾õâ“¿öÒ»÷îýéc{UþuO훯>tÇþ‡?ð‰¯yvëg÷ôìÍoùðÞÆçßÙwõK·|fÏñ¯ÜƒúÀùs?¼}é—}¯ôŽÚ7àŽåÃϾ¼÷Tåð½—¾û¥—ßsªñÐ/¿xè'ÿÜrE0wçé…[îÙçÂ]W¯Ü÷ä‹ïs{×£_ó>øùýgO=øgÜ|Ûë¯ùgë]ßzp¿ÿ§«áé+ï{ãÑ?˜ûÂ=¶3ÿÔ¡KÞ_)¿üÆ×}åcϽåÒWÿç×n¿S{~ï•·ž÷ß6ÿûÞûºõµ¿ëª¿:ñ[o¬väß{ÙÕ÷\ò»Ÿ[[}ø‘_Ó㳟9ö¿³¿sÝGÝ«‚kêñ ûÔ§ÿüôß~wó§¾´÷‡>÷º§¿zî¿?ù©ùÂüíWüb}æ?îºpÏÚó.áÄò?pÞ9zïÛ~eéï^µxäîß»ð‘4_Zù앯¼`Üpâ'÷ß<÷«þç7_óÙG¾Ø îÿ›'>f,?õ‚þÂíÏ?ó彿tú±'?þüÍØø¨õGW\óÒåïûw:&4ôêüFǯSñK¹d~ #ǃi¿„ßW^5ØÀ®Ÿž ÷ó5ìœi'N{]‰^üòêšÈ4º&¢Eº&Rµ!®‰»×=ŽªöºùQlµ× ‘ih£¸&Ó¸ÇõRí…©ŠÙ‹£j=°Z­§žªˆn’z\ðà[¢C]ð<ñ)ï/÷ß÷ëïyàñ O•Îè`/$å€G+ Ø fŸRö_~üþ2I)þçÇÿGáÿ!“$ó_qò«ðÿIJÉ~ü¿üÏ$¥ä)/ü· ÿ™¤”üçÇÿOÁÿLRJþëyá¿UøÉ$¥ä??þŸ þg’RòßÈ ÿ­ÂÿK&)%ÿùñÿUð?“”ânüi…ÿŸLRJÿ»yá¿]ð?“”âÿ™Üð¿ðÿ”I’ùoæÆÿ_áÿ-›”â~üÿòŸIJñ??ñ?ŠûßLRŠÿù¹ÿ/î3I)þççþ¿¸ÿË$ÉüWósÿ_Üÿd’RòŸŸûÿ‚ÿ™¤ÿósÿ[Üÿd’Rú??ïüÏ$¥øŸŸûÿâþ'“”Òÿù¹ÿ/øŸIJÉnîÿ‹ûŸlRJþssÿ_Üÿf“RüÏÏýqþŸIJéÿüÜÿüÏ$¥øŸŸûÿâþ'“$óßÊÏý!ÿ™¤ÿósÿ_È&)ÅÿüÜÿ÷¿™¤ÿósÿ_Üÿf’RüÏÏýqÿ—I’ù¯åçþ¿¸ÿÉ$¥ä??÷ÿÿ3I)þççþ¿¸ÿÉ$¥ô~îÿ þg’RüÏÍýqÿ—MJéÿÜÜÿ÷Ù¤”üççþ¿8ÿÍ$¥ä??÷ÿÿ3I)ùÏÏýoqþŸIJÉÿÿçûÔÿ¿¡YÅúŸaêáË]_\l{ÍÅÅ3žï..6¼¦·X]Y\ôZuÎ]c Áƒã?š¡š2ÿ5UWÔ"þCißkN,Ì^Û–ÜYmN)ïÛ¹R?DÒ¾Ô‡ºR?O^O17êÌ‹:B/ê‡È Iô§˜l­Ö—c¿ÒX®–©ÝRY©ë‚fýü—i°×(öo ¸r$èÁXX€œÅÂÀ½1È¢¡œ»«7:¯¥’­2¸X9ÚªˆõÜ:t“h¦Eœ0t6i$Uª”ËÇ޳â"¢ÀC&Ær¦ñ×ƒÝÆßËe¹‰2!î*Ñ‹T®=Ês*äœz·ãrˆ†±&½°ÞmžñÝ 6ÜðÜÐm{mT¸â¨Ä 'tt<¿‘T±I庺Ûð|߉a*qT"=»í%C…掦ÉPŒ£*qLnº}¬O{@̱žö ¯Ç¤öt€Ü–®Ó¤òV ‰ HЉ‹Wæ—ݰé´K>ЀÞ:ÒƒôÖé¥Î´N­HœäIè»#Ñj˜IZ`DÔSÓ»âJ$˜@‚ÛK‚ î¦I0©+!…yXñäö€L¯O{@Œ×ÓôÓ“Ú³C£N‡C€â–4‘, -pZÐNЋÓR‚4N úÈ8¡„Á*‚¶ï´W8žêÊ<*º½8m ¥›ÆiCºNpnÊíÁmÆ‚1ÀÜ"P„j¢’úŠ:uŒ„ãFRJÖ–ÛÁj,€6&lÏx­††¦™8Ì|¢¢âê[Ð6Ôt7HåúcGhhvn~{‹ŠÇ_ª;~fÃ;¾Ï\µ¥µÕlQªwC ÎBipYxx¯åÒèÕ,{åV¯é¶go @zˆÐ7¡ìXÇñ½ú€Â7~cHÑ€g…`ÚƒJf/ùÞ¹®;¤F_Ürñ F® º!p| ò¸¼/j±p@Bàw`À’ÇXRŽ—»8xÎ!²uXÏX ò5ï!¦\©AؘEöÍžqšž¿I$þQ*àÓõ;©E[¢Sµ·M>‹«¤]w|—Íh$³r¬µ¶€ ë:ÕÔ9…5‡1Ñi]ŠN~•¸uœük$ý+€§hEú”<0h›>¶§QEA6Nž†î ŒiJ„ªäkÔH K³ëS)øhÐé°GÕ~Z}€ƒšòZk D¶*_”lEAD©x‘ ïÙ] ÖÉʹÛ\ ¶E4)¢ª„•ކ:"°Ûê Ñöê6 –'‘Mè†Á®­£Hh€b‡š`DlögæçõJ~“«íèR›…Ï&óóØcg—+×ÞtSlûkÎñÅ¥;“ŒVܵج2FW»‡lÈ|TMY-ĆÛm¶©˜f\}/ù–lêÂ2®iL‰à¯®QE²›âªêLiÅ$ȬaHì˜í*´5Ah5PÙ*½£SkêDRkj=/¤„0;Ñû ›e£qŠ{‹—œCx§ƒnÈüÔ`SÁÒì»ï‚‘ƶKŸÓ¹o“Èumrmhɤcô—¦Àª&¨…ëìª\3\µ0kœ…0>ê-Ý®µ?òb<- MÓLqY‚ ØYšV£¸HéÉŽ v:`9á‡mP ÌJt¯ßu“PÃ4u´CvÕŽ2ÅõÍ8ÁÔí,˜qØQc4>*ëLQ%%@†nÃx[ã+d³Ò8ã¦Í¨Å†Óq2ÔȬ+±†¬*˜‹$äjV2ùm!7Ž6žÕ0M s»ª÷µ£èˆNfLõ‚E:x mÌU€9© @1¯%–)ÌÅ*•ò Ù8õwU# ¾òQŽqƒ‡–i“¨á1U-A ]¥†š©Â§nŒ/ÊZ¥¡‹/ûNÙªR/z¾=H¾ãÆ:Q•,SšÕy–VÖÛŃI™.º1ÏX ½ F¹Ú£vfˆMloq ·¦ ᪒ˆAOLlº2 «¸ÙM)g8¸^¥Ó¸LKÕIì­1ÛyÑž–½E×'%!SC…do@£Õ{øÝ6›TE0m0«'¶†„Lf8í¼ùsaRˆ¬„Ø‚¨ÙôvÁP˜˜àU€x0I!o¨5º9g³iwWEÏ7Ôª4Ÿ!Ëç3Jð$ ã˜í¼6NëÖ‡jzÍJÖ`•z ­†G½¨ùÅã\φ¡?L<Œ }—Eª8ñÖÄäªÇDÕo >|صöw̪IU[£ù-¦ ;K”SG©Ñ™jPÕ]f….Y TýÔDõƒò= +ÆjäÓºiI =‘ªÖ’ó*XupŸ‰'S¨þTa®ãfŸ*@þô.ÔïB‚FJîL“] îºTYUiÖ[ÂJ‚ÙIà˜í ôäˆK•…I²ÔÒ˜œi๸ ݃zZÞh¡!´»WZ5zi'\;I ¦¸´Œu«5Vû;fÕÄVe•!I€t»JYF¥ÎNXaà YzÍ¢o0P³CO™ºÎÌ0©Ù¡ï.+鯲-˜Š˜Ëì«ýQY©*âžÆK£¶‚JµÚØ{r£Ò¨ë=÷ÝŽççdku”/¼ÍÆò¡1¥.l…„ì8[ó© wk˜4ÝìÙšSž K¦ø‚šTºóí;×+0+§±œW%Å«;U,¸¬Óå\xÏïT,6ÑTT =çßUÅ¡J“‚²ìóx¨x©0Ñ~e¼öGVª¨8p“QÃÍ…Iß7™ä0Ïlˆ‡yÑËÓ9QQ7¹3#‘˱E;ÏGس㨩 €ÍîQ1GÆ:Ö£…=÷«Š1î‰~¢0ú¿©¼S…Á»«W ¦0jlÌ Å–ìÿ]Q‡™Ø­˜åö5-ý?öž¼©bkQD½¸¢‚ Õ  4ÉÍÚ~ Ý ´@H QYDY+<~d‘EEPÄý <•}ŸøÊ?so–æ¦ÍÒ–4ÿ÷e¾~_Û™3gΜ3sfî™3gZtD×LüÑï$ZÍ‚Á/ˆÏw…’_UJ8ÂU2á[Ju­~™|l„ BÀ˜ÎÛZfõkþØeÑb’…è á›Wôèc )!yf°5)KÅ[“±ðQu­­Ièì!Ø‚ÚàcG%¸ µLVÍÀQVÞ›g˜ïŠæ/.Œ”°®Þ÷†„ë&(‰?Û‡G˜°@ÝüáX[ciƒcüÙŒ Láãÿ @Bü'¥B…«U|ü\“Œÿ—d’iLŠr…Z¦ÌÌ,W(©,BNÉðLu–ÊDYÍ‘v2ýJ1Îø¹{æ¿Z#ÃÅñ¿äêäüKê¡Ï+ÈÀ% ¬Ç®“³c*øÉÉ”OÀúõ“ ÷dá  ÒÚŠ¢ÞH ÐXɃK=IÁOJ¸XS„ «Y°ú/»gUß¹é×ÞܺÛO9zKµëpËõÇdŸ{:NG×m¼iÍœ½.žysì;˨Gï[ùídâån¯¥½;öàÊÅý/™÷ÔYõúýgНž]:ç‡ú ¹–+³^QmrM~¬H¹IñÝcÿLÙeû‡›Ïvyíò€·~´»^|óö×õÿ£:ó2sú÷É÷§T÷#RN2›Nùôû·7nž¶fã‰3Ÿ®Ú|áêü#=Oö¿}bõCöç/výÛƒ•¯ÿº}ÜøýWNȦ.z§ËWGïüëÆ+ÜîC›~Më<–üè;Ìu½×ÿ®‹áêÿníkÜôó¨Õ;Ž.ùºîô<Ã/)#¾?uÃÛ¯~G3K=vøÕ…wñS®þëȨ߲Ló¶žè´üüášÓ[Šl¸-çz¢‡²®Ó£E­½=å˜6eÒ’­wJÞ9˜{â³#]Ï|ELùhüý?vÖL?œí4ø¾}ýR6Ð úÙ‡ÞºøñsÛ/ÏÙûÒ­;™Í›T÷È_yù•ƒõ5Ç–wß¶_äùî‰I ÜÝówv^õñ¦ÇëO\6îê/ÝùûžúSŽÜ¦m¹x¥¼zÀm3Kë>;ý°ëøü¾×WÌžÞ¯úFûá;u ÖhÖ(7L®¹ùѯ–Ô´3Þ¿Ís—»îÖ®¹éémØß>µÔ_p\Wº}r¯«©§ó'¿Œ?î±—œÇm)Ûvî3îÄ3®ÎýdæÖêy{2»®*Ùvdtíŧ:>÷dáG3Ÿ–P쌂3ßœ=õ±î}e÷ÿ¼»å“¥E)åGnýWÇs7~#ûwû93ê˜WðÃJ·uÑ–?Ž:1á¡ÊÛ²;Žì\·°sÞú'ìT²÷EU¯/Û½ >¤v]˜;û™ Cõ‹W3ÓyÒ_Ú6xÖâãc–ißÈêù݉#;§î?'ï¬üyHöÔ·ßÈ×ßÍÝyËWOu+Àç~_ðæâY_lèØú›‰Ö)Ÿf¤}öó‚‚®>7t;i]½µrJÚħ´åwÜ}öŠÂ{¾øû…~÷]×áhޢʪ¼cß*ò†*·ÌXñÌôÆ)}ÊîØWØí™¿¼ðåÎqGkfüÑõ­KwÏû`ò–{»È>é³þ^¨Ë6yù‰œzÞwIŸ¾‡ÐÖú1câ’£·¬ÿ¨hDÙO¯o»ét'Rk:;liok?ù¦Â˜²¹ç¼›öQ+G*ªWšÏ[°—zw¾~ëÐÑy=óÀØÙ—ç½4aUŸnOw½míŒu7(yîýç–T̸»ýìm»Gÿã®Kÿ»¼@o¬0mûÞ¢~’c…Ý¿Å?LùÂüÖ™9ÒõsŸÚ3é•={_š?_~ÏÁy÷XYöõë9éOê–›×u|ë`ÁüŸ³&m§öÀŽ÷l—,a.[ÒgÙOÜÿåÞÒž}÷ã´EE ïšqnñ?ÎvíoXxãüKëzÞ ¥—²¿Œœþ‹îÉ‹¯O{o{׳÷žytUMþ¬ GŒßõÛÄ»',?W3Ý™¿OÙ»ÛflýŸÊŽìé1våyƒ„í;÷·ã9ûþ<õŸ›»_üõúkŠû^÷Åä]Ó~Xz]ݰ÷Ç=ÊúÊ'Æ<+Û~ïŸßÜ|5ówp|ê=즪;êÎ9F [HïíÓ~ˆ7æ=¨/¬ÏO+üü̽õ£Û:7¼QÿðÚ?=7\Ý´Ð3-süÅú‘Ò)sͳÁ,bÞñO(_ì·çD‡zgÒΩ»ùµß*Õ?Ly~]·n«~Þ5S¹õ¨cÚrvˆ©=ñ…U˰·¿¸sÈaù„Ije‡ôÕ¯¤nØÝné[XjÈûç ÊKÿ{Ï’½_š¿_U¯ß¿´êdÊ¡ªvO¾·é×ú çöÿ~îxõ5ü éxµW×Ã¥XíËSôI­ƒ’¢%éPФ‰¦ð18¼÷íË0©¿,dŠ£@KÌöÚºœ‰žeLÅW*…Ë –P5¬—_à *æ«â*¡J SƒóK שÖng8giŸË„_¸ðK.üÃÁ†2i.D€bE•‡·C ‡ß#ÀwÉ ¤…4é¥|‡ X@±º ªâÁ¼€ GX‹…BÔ”FÄ;71épýP€÷ïïÌò½Å¼VatÈŠbyGÄeŸAØÿDª…ÕFt‘nµaÒb†¸é5ûòV_?ß {λj»s›ƒ0q:Ž²Ñ“ChøÀb‘À8B†„À×°Òöʨà#‰ÊÒÒc‹‰úUD;9Ñi#¬V¾gFع\ØŽu¡÷’$À›k'ƒk4‡ xŒ\À£âB1aÌì aÉzs%ÂH‰CxT*pY­`¢‹°Ò°òš1LVE³lÄÂ8X/ÕgAê5Dò¨X”G]–(°Ä/ù|;‡º¤ã £ ¶a.â0!‚˜™¡ˆŠŠs±özLËR€MCÓªìQ6Æž ‰±ÅÊ%ˆUk ›”±°IXŠP“­ÊäM9ÃÄ6•`%Ó˜a ȼávkmK¸ Š… &A•°´*+ÔMèMcϘø1y«æÁ¶YúD W’dÑc>ŒYÐð€_ØÃóÆ7!b¾Æã.¦8×®4Qt=M3ÑU MÆDt¦Çç²9 ½áj1–ÐÕeÂ@Âê¾1¦‡à€« ¨7aÓv¸³ñ>5Mv¶A†‹´CsçQrÍ ÑŠÂûëĄ̀÷‰˜™h›ò“Ëæ{ªÈã,ÊDû™¨v¼ááG Róø06È{¤EØ=ü<(E8ËÜFt÷¿,à6²èÁ6g%íð¸e8¬.'P™l~ìEj ;›ÍmÀsï 3V8áx Ü2‰ÁoóÑVÎÔ¸K=Þi!ü[æñxbV7™h€E7fýz =ïÖ¿TO°„=,»ÌWN6šX WeÚ€ÎBMZ ?ìƒ+¡o31 BMk B¨žèöþŠ!%­< ½h£“¼<&ýz»IµÍ ˆ×žôk;â4hĉ•‹Ç–@zY S¤#4Êûû ³"2 ¯ š%°{^»"23úM¸(…1#‡ÇÿË6: {<†jð¡' ±yIVäRd4Uìxc7·'¸'VÆ"©zx*š¬ë%>´†é¼À$å  #í¦Z`¯à;ž{>Cª™¶¸XÊS:Øo06QvöÊ"ª¨*CRÈ’Ï·Äc§MÎR>ääËåY®ÌMʤ¤ÜÔ´˜…0b^K²=úÇÛ:o¦^âQG'¨†íTF_@Ò,‡ÖZ»GŒï?¯x+2‚lN)ä|§äü͘0‚\ܳ g1þÔ‘Šè& ÜV•Qœ¿ŽŽzºÄt ÔñæùÅ5ÍûˆqaO µé7Öã@Ç ›Ú/þ´ðH¼÷H¼Uä qråéQ+Úh]÷çpqÀ×ïÖ>uO,mÝÈi–M#» Ñ£)neEŽ¡Æ –2»m°G“m…eÕ|Ñ@~{ ™@Ê-”ÄNqÂù_D¨Ôþ© üÑÚ(!Hv™L‚GEE²ËP\‘p¼Ju° Ôo6@#-êäXºÜ…Î×h;ºV% ÿ 8@s š¶ZA9 ½f—µ€`´®dðð‘%@;l ­5´ÃJÆô…M°”ª¢<èÔy2V,KعZtV=4ß;ÂkstEº’1HwèJ†åƒ‚á z­¡D—;²Hkú‘ýðâ| (ñ©r@ØI?ñK+ õ«¶á²£@3È)ÎN®Öê/’€bŠâÉÉeµ¾#CßX#yªùâápµ„CL¯ °Äw iFž™>„ês›S"œ^ÂÉüà (C! ¶$á:²¤6ZX£¼P¨[„½Ò 8c¸¤‚±NPHØíš‚ã#d”q<„¤Ò1Ðl¢%&Æ{¼Üt1WBzšb!ߊ »…q,Ò„Ãé+H9¸C0Uhª¢oëÝk2µ4‰¾ÿÚ<þ®V&ïÇ1…È_* îT8–±òŽ Í4DøþW*U²ñ|ü_yòþO\R»ìPÙ7m@°è·9·„µ„cbCѵØÐHëM˜ЂØZÂ…QX×Q®P—w{Šbk‰:—+T Ý[¢Bc†¯¸S\{ÑNÃn.5öÅAÌ&;g á²Ã Äb¥ËÃø MÁ4e·ðq©:jûExɵð*W3‘èi.‚p¢¥ðÖçÝËh Í­„ ~¯Q\óYÒa'b3u5‰‰¡l­F…Û˜Ð÷uD.¼=óø·Ç³Á ø§ž°PN›Dð9ŒËNÒvKS“ *ô£–)€"+ =mm's êÄœD…à‘Ë£že¬Œ“æ1\mâPã€D”óeòΑ&uRœËQ„":ãÀÙ¶“æÛM ju…^r• ‡ÅZ•Ê0LW<\Àà+2XI,Ìä(¶Š°‡Ëÿ7†£À ] ©T›ïÿ‡ÿ&Gùsä0ÇD³&—Íl¥jüÙJ˜MÒK9i§?S3-,âŠ/GsІfp´• €h€4×D‘´ÕJøòpHF~P¶ÒüP2pˆ._LÉÈ"‡dè‚ñÁnëÁ‰Ñ…àƒ}ÕáSÀœ‘b08L¤c‚ÑÀFÏ®ÝÑ[(ÖFØÉr«¿¢ö–ª¨„½%B©SÂf q³Jب ûNѪ„d E „D˜D WA¨ T*”d8%&A¥‚…ãPJãƒdÒàƒÄü{WE‘…AAÍ((Ê" F70dúžÁDÎP!DœÌL’!“é8GB@WDNWC\ —*— j¼`=ÃÝWUÝ=ݹHf2®ß~ΗLOýêxõþzïUWµ« =h§Ë@O„v¯lók1Pca ‰P5ÙP¦täªeŠP¹r™"´W6– m %X ²Ïmóåj1pWÀÈs¨E j™¨J r™hCÀP¦Ê,1Òƒ*QoD/ŠÁ‡ìC…€b(ô¿Í’N9)ùÃãô£l¥@|MôŸíò8²eÈÔ®D©ÙK6ÞöD™“ûõ¦^O3 °RŠEºAdñÎC©¨4Ü}dÀSm´é^Ub.[Žì±¹}Æx`@®,ç)/Épúñ2ì ‡y)“Ù#;œäw)JËõe‘ž®Ó‘sÅS”™üÐ6óh}À¥—(ÐoÈFM§ÜÎP9~4¦£r°Z”¨6FRˆé¤òe…bGÆvƇAi{¡cã”øÑ•âGv& ¨ ˜“`ÀAYh0H3\4ÔH“RÔSTPRÕj•©ÜtxmEàpŽ†Þ™‹6e)ú8ü(ÖRý²:e@Wƒ’k2+)hÛôqô2Š6Çh EBïá4]o¢$]äF¨=Iâiµƒ£0Â’„Žh!y¤)¯Ö¿¸_¢¢ô¨`RoÇ}¨ua™:Läâ¯+7ZPlíпD¹û\cœT úB+VùFB0~ °˜¢Š©Êïµy|Èî7EQ(… .¶ ü#MÐæµÃ(rªŒõ8ˆáÆ?õrªE"!w¸m%N/^ŸóaSTô:ŽR€"h«8Õ•rÀ\ìBCÏ^Ý¿sQÕèLô ŒÑx þH€×D}@Ò™&]%@ £ µÑ3U¤HÅJÍù¶bòSí[Ðè^c”)ÊHKËÀP¾@¥•˜/;Íhв¹e›eÊ!x © se suøY9I›Æ4¿dÒ¦`ý’‰'*$=›”Œ><úòKø@&Ý8Ë/qËE†( šäö" ‰ˆDÍ ©É¢–—VU0þUŇ„«_QŠÒ‘Yos±:ÍFEDƒ~æ»üh§(\öÀ>óÊE ³RšKFP2ßs´/àuRŽl¤œ¡Í“ üç»ÊÕÁé]±Í_àÅoY¡d®½Åô©Þ.ŸMº^“Y½»xÖ*£J‘+ +àZ²Y§Rd|üšÆ¯T§SBB'¼%²Sbb'ÊgËvR²êA t‚3P÷B—©In›''âçÆ Á²)CBY)£Á×óE«]lBBg˜‘ ý}@(C*(ÐÊkbºQƒe/ð’ÌÄg$ˆ6AUH·„ªZ”‰ ¢Á7MIÀa-!´ìÇÙâi’tßA931(†Ò›,ê3ÅD¥€3¤~xˆm=¢‡H3ø[üjŠ ¦)-B}6¹21‹ƒÊ¼‚ƒR0¨gT‘Z«ÑpEe·Ú¤5œö¡ºœãs;›2„x¥ð—%^ù!ÄÓ0%Ç3"%úã(6^’Hþ Þ$Æ[E]|k05ø¥¤ l¦©ë È8ÖÔC@á2[W.ÓñÞZ—kêz†*ñµž•ÆA1¤ ÁZ8]¹* [\-Ü®md ò¨òÚX §–¨¬¯ÄÔú󉡺&R53 ›”P?ZÝcá›ç¬”6çÅ!C^ zžbXÊ’H‰°¢ –¤ ÅÂhc ÇYÆŠ‡;ËIZ:ËBº•Žf°/ùJ9ŽÓÒ‘ŒãÛ¬Û6”¢„ä†ê0> /XñüŸ•‰¸¾ÃYõ* 'U…µþñº»® ؈{ÖÔUEd`È¡‰‡Õi¤¬ÕJ±œÏ=À°Â*Xt ޶ +‘ÞKò#»AÚEð-OR:ì…üzÓ¯?/ÃöV*nT=/†ð=·‚x©sX¢[È¡Œö1VeqXbtM4©A<Œ<´7ôm(áÊ×È"'ª gD6É€lµ<\1úõçuØ'Ìk¶V^Ó:K’F<†4Ô P>°GÊRÉ#…ÒA¶&'ä‘#kmbŸ…6zŒ4#ST¬0ËÐè×™—œÞæ„þBxÉ£+†ÕÉ›öªÛ‘Säbr* U„£qPäƒê»Òa˜ R\¨¦'¨,WÕöÄ&éÿöÂù_ùŽzÌVûù_è0åü?‘§ŽFçÑÜŸïÿþ]>v«ÃfwJ'ÒYölAà¸,‹ÕÊsÙÙ(9‚ø¿®ßŸŸÈ~B°|êWÆäßÂÑB•óÿ8ñOùÿ=>1ƒ{'weâ9SÌŽÓš°œå¬Ñ¦„ó@²Oô*Íœìr£S¯ÌÉh¬ô…Âá˘¼DÛTóMG×3›•LûnôºÏF´YzÓ} ¥Õ#Ÿ•¿/ÿz\Û]k£oHüñÜÉõ¿~¸½]¢\Ñ}ì˜ŠŠ¯/oŸ½%yì“ÂîóM‡¾”×\¶{Ó±Ç÷ñÖËž9Ã'^˜”qÚÕ³hÇ×;2ÊJÞ±¼ùS{íòAAé——6^^ùÓåŽ*ò\LßóÔŠKg/Ç{¦½½ôÝù¿š!œèv´é!ËÇ==‡F+Ï9UðÅË¿•½úéôo“ùÑ¢òñ_þöÏ_þ4ú–)G7”‰,ÓŸs|QYb³C¢ßdËWk𠽏~zÞÌöË¢G^¸š’Y±–époüO{·-™›—þT`Ì]#†{·Ç•wóÕÙ¶å{ög7=²~UóÖ‡ŒZ±`F£ÛNôÉ¿nU‡¬+¯‹ÊKë½&¦iᑇÌÍw~b^ÕjT·I“&fÞÜmÃ…þû’štøº|Jዚ%OY4¾lëyzqo—ôÛ4vûôÓ¹£Vîd¶ŒûéÒèÀÒ²ç?f§ÓèI¿ªØ8êð/R³‡F­LOê1!#ºýdKfËöcÛþcûŽÝ'»P w/ªøÑÜýÕ®[Ͼž9è¹[3õê`êS:°]l“w'¤6³osàtŸ§'-<°ÀSØþh›ÆticçÉ6o˜>ø!š™ûæŒG©—LJ½ç­­y×Ä|kݲoÏ‚‹ã>—7¶›»ÿ™Ë«­V xË´ç®iT6oÈCf¶¼£dÙìö÷î(²w¹…qÇÏ•7ú탖¿8ÒýÌ'é¸豭\ŽAßäV¤?âûðѤ„íÃ~¾OÚ½e@·;s’l[¸îèé›Ï¿qT:s~ÐãKÞ>qïñ÷O}t²ÇÖã>ßö·lÉéY;¶Ó#Sè5¿ßCI§sûì¿Ø¿ËÚUòáUò]W1ö–‡Z$œjz]æ'Ãi“cj~þ®…‹‡Ä4Ϩ´ù ÚN¹êýAw®ožÛäù«“™±ðR߸—â§|¾¥Q»ÎRc·¾‘N “{4þìïåg–µþá¥u¹›;ÙÇéXtñFû¼¯ö^uG[aWÛ¸Ž+¯qÝê'ßtýêa7¼¹7m[ãù﮸qÆ¡mŸ]ó¤äá—699xø­ã·ÞüÊþ!_}Ñwpo·}ìæõÛóâ/³`ŽÄ´œ¹kæ#‹_Z2cû”ä9Yã£ÿrqî…³Ý4¥iþëEÇR›|¼mæöV?¼Ýnàʤ;fÅmšµ!ªìÃTô“ϵο*ñþ¬®¼÷w<5dÖòØŠIìì³Å÷N˜<`gÛm^ï<«u§®©{ßÚ5ý¹ôwnxàµqs 8;ùÙM3ϼb³õù'.¼ó·ÏI–^³~rgÊõ3w~sÕ‡ëÖßý”3»“7Íúðá[žÜ7õé¸ÝëO½w©—óéŠÖ­Ž¿ûÓéwɽáÀ؉¹ ¾[´kè¯}Ó¦µNس¹yyÁžsw>±wXâʶ³úþÜÜ=lZë—Çÿ«_ºnI»æw¾Ú=mct³öyK[¯Ìubù‘òߺ“|Q»FRÑs'×öm14zÙ’&n×Îâ I¿<~Ç-ž|°Iìõ/?•ÒóèÙ³.þhGêé¸[|÷^Þð©#Ú›Ýìê=í:>=é»Å]æwì²'½û¯/ä¦o³ÛÏ¿¶úý”Ÿg.‹³Ïgwß_¼»däÀëoË{~éò>'Ï9tÉá¬.£2.Ný§WÏ77Íz;ï·mýþãð‹ÿšÚ|uJ[ßžåË7žtû¹ŒE ?9·ñ¾‡Ž”_‘5nÞtÁÙâ‹>w®üËÔ¼s=Ÿßñä¥5Ä:g¿ÞîœyLŽeªý¹Row¦LïÐ9÷³©MG,>{0qÙ£_nïxfÇ5^™7©Ï÷çìo7›nuíE©Ë3ßæQ+žþÛÐ>ö>Vtχ¥{¶G‹ƒ9å){W؎ŬYùóÖu³ßÜ'Ýâ¡Í 1O|ðʋ֌!ï^ö1—SÖkvG¾â½ÏRÞ{«ü‰§n¹}ä·¿µéóKW¿Óiñf°Õ”i~¡©CT¦tI5ŽN+CK œfdé™9.Û=r1…öQŽñÈ4™Óð ¹ð¹Sš Zñú€È`¯lOwú3Ì0{Qæ¡Îb?Ü×§Øo:¾•É-Éèô+Æ‚0]™“<Ùï˰â†&†\Xr!…1<¹ é0-ÓÜ è “h)A%¥´‹ÓÚEá†Q¸e>Ê<ÀåðQ&B&“B'¢ªèneŒ]Yl~›[ÎQIp•вTêB­µ&sêàA“˜¨d´VʈmR\çȇa!.D«úLuš+‡+™“à®aiýê²ÖdNGYQ¿*îqì×êû·æŠX²¨Š®]kU®¼ýïŠuaj« :Íï ¶\­u©m§ËkÁÖV |^’ õ_ö®ºêLÃBw±šåi(Ùœ äá¶4£=œpâ$xOH¼¶C‘7K#{I#¤‘c££Ëûµ¤Ë;Ù]h»@œK€ò.-´)¥<’–…¦ é.P«„.Ùÿ¿óÐÌèa[²=sOÀº¹ÿïÿÿþ÷Jó\õù¨þ#ûQ¹ðW Pü½ç'|¸*cû-ï¨ÜØMƒ•¿z ®Þ°Vçg ßòŽÊ _•6@#-«ß„ð£-“ê_,ÊJ ÈJwj·Éx˜¬AwÈ²Ö†Š• „¬ˆV°­H–)cS|Þ´LÁÐÆrQ1Ó¼¨§‹,”³J6š‘Ò µ2< ‚F —äT¢æŽ6ÖÇø|`8BýYr¬R•h¼ÙgÃÌ* ±yÉc‡3bÜJòwM>ày?OâD+c¨´&¥—ù}aÖ^Æ„x®¤,àÙË ”/mÇ”´c¦”.[ÒF] œKÛáwGö2Ž)}–ç%ePé³!P<{Y8PÚ.6•)Úm.ýʃ(ÂÀaGÓ}c¿Æe¢n¶ÞβºùÃH󪶗F2‰ÄÏ^ºù»‘9—Gç”-ìóÐ#§Q¨Xýl˜so‡ëM¶û®Qð_XÿÝ‘d“?ß0òwñ¿IVùóB£È?èÊß‘d“ÃÈßÅÿv$Ùì Qäïâ¿;“lúmù»øßÎ$›þEþ¬+G’Mÿc"ÿÝ™dÓÿP£ÈßÅw&Ùô_lù»øïÎ$›þ‡Eþ¬+G’Mÿã"ÿ ‹ÿìH²Ê?Ð8÷îùß‘d“ãÜÿ¹ç?G’MþsÿãúÿŽ$›üçüïúŽ$›üçüçúŽ$›üÇÿºòw"YålÿßõÿI6ù“þ?}ÿgTù\ýw$•È¿ø›åAYÉ®Òø“e¨¯ƒ ¸ÊûŸ~.à/¾ÿÉAþÁ€Ÿqßÿt"EGÒb¦`@Tòåd_È{"Y‘ÆQÂúÈšH ´À?Z›ÖA²XJˆ¤[Œ‹„ð.x"S>_eE"R*&çõ0?F_gT"R(x žÞA‘àïú ¾ˆœ‹‰Y"hBÐ ™µ¶dPHÅRj -’2² :lé‘’¹þÞ<Òr¦Ö%ñxòE!‘“´ÞÈŒy3ä´˜D¬ÂógèóeÚ "gZPýJí"ÑA!ó½È‰ù‚u@ÚcÅêq=M_² ´(Ýcî§G€‘ãÀìOx|ãÆÔŽªI:#ÚM"š} f?#õç˜X)¥ -*!(DRÈz)‘ñ!Ð{<—8•@K²²³÷Ìå+zIû²Ude{wwû²ÞUs¡%LÔŠC¢Ú”L'$èv½É)”/NÎZÔ½ðLhß¾ sigï*ÔÇŽËõôÅË»I;éjïîí\¸bi{7éZÑݵ¼gQ+éÕÕ“âÞëÌ ‘$$Pœ,ÐÈ¥ð,,èé Ye$aTµ’Q¤ì,”Ó#¸.Í«%F¹¦ÕËÁêÁJèê,N ¾‹„«žÐú£ [Ì$³­ßô–=¡©Šÿ…Êš5ý¹8ìëkBÑ´f·ZÅô8ý êþŸŸáƒ6ÿŸeY<ÿ»þßä§™'tõ´´Çä~±…mõyfÎÔ^Ëk#ö÷òª¾–7ž\ŒO©¯ä©oäap/|#¯,)F÷j†Å–Šaû2è.¨Õy¸ ã¸Ã¿‹8~¬" 6…$¾uíÁàjØíì> yÀã핌µÄÕ k11îÑ ÕloVTr饸)1$ï¡á:½‹RQ©ž › h8µC+5B; ¶Z8G=ËÕô*‚‘yþ²„;÷ éœñÙã±vá!$–K¿/@¼í‹Œ9! ¶×(a1Z©”‰æ’ñ„8lsP“À±ÎJY£Ð…` ‡ŠOóP’¢F ÀÓŒ›‰waTŒUô2ØXdadë]TÊÝ-²³Á‹,l0ÀF§µ?vg™þ€™Î’þ`¬–þüP²ÂÞ –‰w•…HˆàF2š@÷`«aÓèOr0ZÁò £J¹ã€¬`'Ë¡ø$Œ]°ðÊ[‚Y0µM8,ˆx`A,e‡ í,ð@T´…u蕬ý›R™þ€©¤?§dé/bÑŒ,(F pœ²,¤°&[h ¹”fX‘í40^ÙJÆ [( 9 ®Ü QOå¬2.r¥4ƒÀJÎN3cÈYh戵?˜ ýAîàL°u *0„ZÂ<:Ÿ ‡¨i9Ø?ÀƒÃfyèMMØ'þ‡3G£P`&¡FT2ňԛç¡oz &ÞÅpæ‚°G¤'i9Mÿ+).&²¢ñL=pÌô٭µlZŠæ2Tƒò€Ñ¡NJ‰È¢§@z{ሙmé–A{ˆil¦ºNEŸ¨Bå9«RUáYãõôÊ5-ËûÒy9±J‹²´­Õ•:Yþ8H¿RyEâz}YÒæÊ DáT™Qdº7H¿¤ŠÄ£owzГ6t~£°Ÿ©Ý!é| 9àñFe9kAñµÄ…¤'[‹ü(ð?!—PFiE{¢Kµ´Oc‡H6*$DuE#›ÞÎÔP-èRcZ}jwÀêÚ”¢ ?CÄá(.þ!bH­€§hCú”u.TÇ> ½bLUÐÕ}0| ALM½X Òab£g>ª…•E}”)÷h La¥®¤Ô‘¼C²’¼w•ªñªaTKJåõ$zn.7÷Ù ,OXK)K<^#„7<uƒÙ~5gî׈A[¥ ]×£5JÉi­‰ná?3§^jW1ú,É7Í$YKh.ëiòªL«Í»Öœ‘̆óÅã Œ•–i3d@Á5ÝDcþÂߦ¢æÛÔ’B!†ÑìB®9Ò<‡^NGØut(«f›OÕÊ×ÚÊ#sÔ $¤‡ÂmÂ=À¢TÍ(iàÈÐR‡§©¨©:[]š±Œ°ž€HÁ wµxЯùãðaبUd}Ë€©–0hˆVƒ§C˜ã&˜eu) ±µ aöhi6±Ê”UÛ ô™TË}ú7ÑnT¨U(pì õÑG2ÆüÒyij2[þ8Cc ú2‘‡Ó)I#Ž‚÷ÖDû;œÅÐ#øèˆ­ƒcG>$YP€ô| Ãf´xÉ(yZT,PµzÀÒ¨VÙ"N1‘ÒYq Ó sàÍŒ˜'.3lÎYªÌ5IælX—›šƒõ«OÓ0!JFHeñÜïi‚NŠjué²Å@è ™(¬"QïÀʨëUU‹ölÑS£íˆúDB3Ty³âyž¦Õ0ë´H3$P˜Ã/H ‰Á^âÂ¥KmPÏ(\-È|‚Ãhkþ©Μ ˜3!#Óç11n±pc8fºJ©Œå½IaXý¨Ï-xô¹ŒµÈÓdíËhÀl®Ÿ“r ÏŒž&!! 1º”MVÍSÑêf®  ×d?íUf³i­³ÈKNic*ò‡N&ݨP{ 1i ³tõ%Gré´e¬P”×[ŠŒõª„b)T»€Bf‘¤¡‹F[ŸîúÀá_w|´háê©_sŠzðX‘£Êy6ºET#¯'%oÃá˜=8Ÿeäõš°•š^ª^·Iöèl.#ê8xc ÎÜuìêi¡gþtFTp¾de†  ‚?Õ!eÜt3¯þôz¨é®U y¼J¢¸Qí5¹D]9Åðø5vfÏ›7›ÞƒÎž?6É q‘È)àƒ,‡À‚3ÀûE7)!¤r ~ ZQ¤M,…̘Œ>‘Þ4åjØ·ê'Ue r` C@|³þÛfк¢iFu­}oâtÝ Ô‹3©îÕú|0~<r°bá,Å[œÜ½‰cA&”Ë Y~ Ô³7ÕÒùXu/8™{ÇùÌÎU(`v® Wt§°åý¸ò»Sý¤jÜŸ8Îrƒ–Ub’l»=±¹quhIyiOK8“–ÐÂlà?ý3©Z$`tò%hZÈ0uhI UKB“ª%þ ñ™-¹ÏlÈ‹®¶«Ëƒ«—PÍ™<8|w"£˜Ï?ôÚ×g€…k.\ZR^ZãÓ¿e/AÄbÏ:t/a'Ç›2lÐlîM¢ALòz@¼ké|¬ZžL-áë°agy0éaC¡1Ç0Å,45ekД‰ V£¶ð~86ø ;Öœ6y_Öíc‚\°€®6åÅ7µA·³h€ÃàÁû ï áÜñp Oîí’`|†}£"4n_yÐÞp=×w5õ>f¸uߤjnŒÁâbfMß,a®ø]¶¬ëK¬úIÕ¬5!ó—X¹”Ž˜í’MóÀl^YÍêRAhãÓ—PqEÁx‚aXgô$ǃUNî6ée…ò`‹F͇'¦:Ô¥†Î]@ûƒjzÿkòðß™@€å)þ;pñßI1!çúcѸŸ†âñ â}‚N°a÷ ß4nšÜTƒþO4þ;J_òþg€uõ߉4Aøï7oOíò±è‹ýžÖ;/í›ÙQ¶týGó+‹ú?ºê‡g¾úøA§¼´õÌÓŸÊ^~ñ3×ÞqÎ¥í›g]ýx÷­'¶~úVóµ+¿ž—¼zýó×þøo¬÷7}ßYÜ7íìS¾û»mç kŸÊŽooyí¤—7¼sÙë?Ï碕_‡’¯}Õr òôÓ7ýïÓ¦½¶v×Ñk¶ÿ÷U/øS×ÝØòÔ'ïúá¾{îÙ¾í\žÝ×5ý–7º¾~f÷‡ØsgmHõÒŸ~|óž½÷Ý}ôè­=§>r÷…]Zç'®Þò“ŸÞ~ã’W—Ýóú_ë¬kÏó¾ëî}3¶aÞo.þçÇ.غnÅWÿ¹á©­s{eâøÞÖ“Ï]—¼kÇæGÿçÉ/æî\wÜ–û/{"ã}äˆ?þjÏ‚ØÛÃk·ÿíÈÑ÷´LùÁ·ßù› û7­à.z¸gêé' íÛ4ûÐ+Ž™½üŒ¿Ëß;4ò«Ûóó“™/¹®)ÿvð/oÙ·ç¸;¿|iWûæçæìzñ0þökÿÝô¶ŸÞwúÑù7g-ùÞ×Û®{6ÕçyîÓä÷¯ˆ]²5zˡͽïqŸ^Ó´åÁŽKÎûüÐÇï;òÒŸ^úò‰Ënҡ̺ãùÃRKŸ½ï!3”_Ÿ~ïÑÓ?_õv~Ö¿¯yþ˜yŸ}vÒêÎyoÍ™[¾+GVÿˆ“.p í¯þtÇ/6²k§þÅmxóÈùÛâWLý@ö~õàæ»{ýã5N~}ó!÷öÌ—›:6\Ñ| Ëuß;Œ<åÆÓw<~Е÷ï̈m?C)A¿©ª\íÇ7õAkspN†s½ª©Ž7^öÔñ j—AI6!]7(JrÈÏWBIV«œDI檡$³œ¯ "ri*A5ö…Ã%ËåP’}á`)Â2[ŠLÌC%ÆŒ¿­˜á¥e_ L-í/È›ÊJQ¹QP/?LYÜ —̺xÿ]çîÛùãŽ9¥%6PVP_¨ßï¤IfîLÒ´…a>½ç㑹3sι÷Üsî½çÎ=§ÆéŸqúgœþ§ÆéŸqúgœþ§ÆéŸqúgœþ§ÆéŸÃéŸã. ô²?SLQú»IþœHJ’Y*P2ì-ž•9­œ£É“?7…LÊäÏÙF%?sÔÍÜ 4…RÒR•'X™×YvÙÈl£”<‰-CI9aÓ&$»´šÝ%$êi‡võJ_­F,qœ–%/‚W²ôÞ0é]Sò]6TÊôµN­|—°9˜F\Ý—š’#ü¼&žNdÀ$mV)A--e­…íe£.l‚ZHÞ&·²²ÑܹMHPÛäJP'2x’ÑìH05é”@^Øüh|"É&TAŠ’« Õ¤Ô@ŽSrè ÛÿoX ÔûÿEþðÜÿ·S$Þÿ×XÚÉÑ´½Äf·Ó4ø‡)±“$M{ìï°Qîbó‡áÂBãô¿a)@êÑ«•±¨¾ÿ±àïtó”ÿ£pXù.Ë•;Î9Þ©Û²±Óþ½ãêÝŸÉ=tx÷Áîg.ËwÏ#Ó§/\ôDÏVGŠîm»¸ÿë³ûOÝÛuô¼Õ•‘ê³î{éºÇ†fý±¨{ÃóÍ6\CtØ*žõø€ËzÌÞ±ð›e}||ß¶¬öêÎ#Eô×ÅoÞ¬yæò¿·Øq¤ýãÞ‡nYÞûµ¥Ýžïö髞k¿Ø8xÄì™7}Úâö¿M¢ÞüêôÏôíÖïuçÐnožP<ìÜ;fÕ ¿¬Ãà»ï7=Úy~ùª¡+vï<=¬bÚ0Óß›ßVÍ}录㟺æŽéy߬xîøc½WÍîõ¿»Ìêš`û&­¹o~ÇáW\VõÎÌã>®¹ù#ïÒÍ6<>ä¹ó,ÃZü¡jXùù¸‡*Gd.¹±û6Ûe‘9Á ˆ|V󳉵[öÙÏŽ~xÁ×}÷V6?º²ê\öî<ÛŽ÷¶,ùú»¿õ'î䪙ûûœ]|vÿá.'¶¹¨³7þ:p舓£ß~bLþ¶»ço.(~íÉšZ{lwÒ¬V;Ó€¬QÏÙùIú@Ê“>P©’>ü¦²=0Òz\rc¤N°PçiyÀpM@œV°”HÉEšk؆d|ÐHº OÉ`̤ M%Kº½¥gÒkФ †ÔH°àT%5°ØiuÒ£.ÓJº`«_´Œ¡ÕIÀ]ýœ/N«*Ù ªñYdeê Öz,üeÚÊEë{µ²×|6>趬ÓS£I±@Ú,äïy±§Êù_‰qâ?àóÿº"ãÄÀçÿuDþ3þƒ´þ³[êäÏê*ùs^6ÁW ¾ˆ΂G|\ö—ñA!ìrI{á ;$ÍP’®ÿ­”•!•ò§¬”çÿÔŒuþ‡tÒ„L‰ñ |€ð |€ð |€ð |€ð ßî „(½@$0UÆñ{9$›X´“}‡í$èÄ7óùE#Ž5LŠ•8h*ñõ7êiîiÿØþ°g3”êƒoäŒøe͆x³™ºðYø˜æ݉*Ò”¢’tâ;ö”g˜hK‚ÿÞ„Ïåò ÏÞ%>$¶”ß§+¸R°\÷ezŒSasÒ ì¡Ï¹¿GÔFŸâ+wU3Ɉ8¬ "‚/V5.7f“ÕB.ù·ø±Ú%þÑ¢Ç zn!ä –$«Q‚ûXeâ%CI;(KXy(FU%=I÷€_FȺ¼L§{ÀÏácŒõ"Ð>NíáÙ¦ŽËóØÝ£åðY3É”ÍÜ´Œ›iõ²#ýºÐ>0p® ÏðYÝ-™ÝÛdí6½ºâÝ…Þ–{†ÌñrÑš›×9ÐuKiÉ®YÿŸú.sœjÙöÚ·®[Æ·æöp̼~}½ØÒÙ´tGø©À·‹úïê?íòûnw×ÜÕ~ÆÉÉ×õÿ‰^öÌ‘{®z‰yœ{à«kž.¦&OÛêzñÔßÖN½÷ûž§ò¿¿÷û#§òN¶{ãƒKºoïVõV»“×ÍíZi´®$„^Áîyú“EW9zdÍ8s”œ¼}Gí±qóŸÝPF.ÊöNÚ-}T‘çš³BX6sgáÜJó ±7¯ÊÜ3âÛM]ø«GŸ¼òrO«}×ÜÿíŒ××RW¬ËœÙ¹ËÒá·¾¸òË/¼žâÖ‹'½¼¥í=o†Fý닜ЀÓíÞÒoÛ³¹YÍË[v©Ø˜ÛiöWŸzñíí̱^'žsºô+ùq¾å…ïquú¥u¿×v¼[°°Å’ÅG»zoúqdÍ‘!gnr†k~Ùöà ŸL4ÃrÛàvŸœYRÞ¼Çávmomûeñ‡oÌýkßã\§Õ¯qSÿ=ôãG6ùzŸR»ã^wÞ>ü©Kׯ|ðŽ¹¹Žâ7/ÜtMEŸk…K¿Éz0£ýÝkç|YDŸlÝõò¢GÖ š°îú1=Å©l'þ¹åëW×ú}ñÄ– 'ß[wÿK+\ÛÛí¹±`ù¢ig—¿°á±‡2:zíº:¸`ß鉭¼?—‘Ï´é’×!ªrÑ'5Û?Ý÷A¯¢È°µ­øs{òô€¥C_ØóüÖ÷þ3êÚÍ…å«]’×vôµ]ž°Ôo-¿bõëëÿìØwí;›nmnóÝžúoi‡^þ|Ëàý‡ZÜòà¶3öZÓ“#眽¼¶c—^ãÎŒºný¥{}îÛýÚăkÅ­{lâ©/ézºÓ­vwù8øè ¯w~újß–»ž.å–Ê:Ü’ÿ]Íî Ÿ…ï±qÜ·¶9Y‘«6äÿbÝðÍá7¯»äÄ%£\w´\=yHËYkþµà䦧:,æí8Z¼¥Æ÷VÉê£K>œ7åœëùëGæ/¿ä¹wnïâûrUÕâV‡˜{:š ³ª:©:ÑæÜ‹“¿8ðëî—^üëÓËC‹7<ÿ—öýNØw~5½¹°hLhÒÛ&Ô®}cFÉWŸý¼ºMë‰kš=~}§{îž}îíVïteŸû[–Eþ§vÀñW\Ê·hÛr£{õèè59}«OŒoþßûO·¾jæÖyI£Ï‘ Ý€ðsuŸmŸŸøsyü9R3þÜo)ð–™ CVhB&eÌ·úvMzN#Ø›<œ1ƒ½9­d²`oÑ[z{£R{#áçˆh4»Sœ„UÁÔÔâ´‚½‘§: üzUE—R€³YÕ¼Ðvõs´SV¦ìFÕØíÊ{Žö»wéCïÏú¬ÝO;ß;ÔS]‚†us8mxUß8@æÿV£Äÿb,8þ“€Èßfù“Xþz"Ú0òÇñßtDþvÃÈߊå¯ òg #–¿€Èßaùãø¿º"§aäãÿêJùsƉÿå¯ ò7NüoË_@ä1ãcÿÏEDþÆñÿaÿ.€Èß8þ?ìÿÑùÇÿ‡ý?º"ãøÿ°ÿG@äoÿöÿèˆüãÿÃë]‘¿qüxý¯ (åï6ŽÿË_@äoÿöÿèˆüãÿÃþ]‘¿qüØÿ£ ò7ŽÿûtDþÆñÿaÿ.€Èß8þ?ìÿÑùÇÿ‡ý?º"ãøÿðú_@äoÿŸaùëJùó†ñÿaÿ>€Èß8þ?ìÿÑùÇÿ‡ý?º"ãøÿ°ÿG@äoÿöÿèJù³¬1äoµØ°ÿG@ôß8þ_,]ÑÿcÈÄò×ý7ŽÿË_@ôŸ3†üþcÿ¯.€è¿qö°üuDÿÝÆ¿ÕBcÿ¯.€è¿Aöÿðþ^€Èß8ûØÿ¯ öŸ7Šüi,]‘¿Ç0òÇû?º€Rþãìÿcý×ùgÿë¿.€Èß8ûÿxÿW@äoœý¼ÿ« ò7Îþ?ÞÿÓøŸÆÙÿÇû?º¢ÿÆÙÿÇò×ùgÿïÿèˆý7Î÷Xþº"Ãìÿãý?}±ÿÙÿÇûz¢ÿÆÙÿÇþ_]Ñãìÿcùëˆü/æþ¿”ÿÛÊØ¢òÇþ]@%?_ár…ŸËʼnþpPô‚+)߯ËQær¹ùÌÏy³ù@Ú­œ<ÿ;i§±OÈ_Êÿn³Ó8ÿ»Ù}daïn±„ïMe[L™™uépûh>Ü”ép{‚7÷¢©p£™pA™” ·1ü”"ƒ@gó»áó9bÄïü¥9beÂJGÿ0„“†¹\ýî\ÑçƒéšM!v çKÿHÐ!ÅR“y$paH›pÃnÞcŠ–À'M&sˆGÃÙ°à'‰j“ –›Ìy~N„D‹xÔ’ h;Áƒl•„€@îZL¦üÂÛ¢b· x‰&JyPæƒSX/ˆÄ›LJ&‚pG„Õb'ÌóâW$¸b¹H˜—P „‚\Äçñò•ñb(v | ¡x¡–a«ÄJhPDãVP¼îÄ# aÎåx·àõ²±2°‘§`&çÍS³Aty($`#OÁ ØÈWâÕÎ×À˜ÉWáuÍWೂ’ÛÑÇ@/1Ua˜‡Ù /åƒ>Öï.ñÆ_´Ú²Šm ¶¬š; Ë¢dm€›xÔUðjl±rØÒà4`W°@x5 4hpeDyQÐÍ‚`SÐÀ˜Tø@=>; àæ‚"Ž—ŽýŠŽd¬‰ šv€GTÓ´VD”¦ÔWTÒuÀ…ò²¡²x x+¢”9à"¢¦ÉV"(MÔ!¢ ÉšUJ| ªb/„É” L]˜·€ $ @WÆYh:Á×i902`øðóaøX5Àˆþõ~·&¥‡^Þ_.‹š«¨‰Š=^ pƒ'ùJÂ<8áçA °GÄÔj" ¤¿S ÁÃ{C|ü©„G ²^o¼ nÚP+&Y¶:à"Á 0ªÀ Ã{‚Ÿ‡,š¦JšG >>Ô»@ÚCÈê&»—f½—äfŽèu§¸•äÝxVøäwzßVâ&GøOhÒVÞN†$WŒô“•'%»¯IZ~3 Î˳Á°(MS‰!*Sl¸+àCFÐ@PäÀxF€~(›"܆!‹É̉bÐÝН·‡õ Þ*B!?‰ ðñ†ëyJÂ$uU5Îx/v!ŽõòÑ Ù4çû§¢Á¬ÔÕÈlK`Õ%= ”"v~’à+9Øù§èKÑà-éAé-e[€F«òò!€Uô n ã&€ên`#Ù£fXÀKO8 „Š/â•´0é«b8}•ÔzÕ®Q˜ •àŸŒHµÙl?Q &Ô6\&©ÌEP,çU¥ebQ õ\^.ÇY;X5AA‚^ ²‚;¬¤ ©IFüšÅA8õR•º¶Tô³Þ² LËCÐà@òahc80 &³_tóÑßÕð^Y¨$z%ÇË»Kë}Fê×õ=äuÄÌ"ø+çÔ,ÙÕ˜iÕ™„@L"¤«)Ãý!ëmæIò A~¤D€ù øÖU*«{$JðOg”JÓÒŒŒŒ„æ¶%K v>^eÏêIH2 N‚›Š^fÝTW> )ß3zcèp€š!©™Dp×RXSFBSclMIÓd+`‡Ký  xÙÞ F¢¤n:~TÆï†ÅØšLrMæº;`Ũ‚ºeѮȺ'°´žtOÖšð–ì2ú|¢ Ö’ÑrK¬3$4QDoAC\P-D0Þ¾R»ddÈ­‚)öºÔ†ñ&œë&be (ø¤ €Tr`ö¬UÝÿ•!á.ž¨‚ÿD6 u`Ùá?ã$) *ðCª`ê¤tÇ­Y¢ ªÕ¥Š‡8¯⡞+ÅÉ{½B Ä»àØæ`•¼á‚•ò+Å-ù Ú¬2&·èè¿QÃbʨ$ªˆpõ‡à²ß”*Q«+u[ü…3A6È^ÄÇ(õ»£J&5°ôS®§ñBhG¢oü?{OIq]`gðK „³– ±ìL3=#¡•W»ZíjÙCŒxŸF춦[šÙ‹žž•Äx°9ÖÆ`ΰo!ð€%æ™ÀÂKì@ „,ሠ„Ã\Á@ƒ æxÁù¿ú˜žžC3:Fèzz£îªêª_ÿ¨ú¿ú÷¯¸4©¨Tx3ÊÌ‚!À:Í2&ÈÌ‚N¥%D†µÈ…¬¬Õà‰‹ ±Ãx¶¨'úÏ~#Úo‚ÖÍ0cÔ0R¥˜™"¥–ó&¤ ýÒÄ-hôYµ8‹YPÜ–U#™ì±zL¤d´™R<%É”•m³NO…‰Ôœæòqmó§³È>m—Ñ+•4ÆT€•LºP¡ôXd2*f(÷%&³étÑX!+ž/ʲ4‹âZQ¦ÞÄdâ0 ]Z²hÕeMÕŒSñÑï «ßPŠЬgÀ\,§Ù˜3"Ãáe"Êz<ÿ`ÚûLMÄæôÞÌ\}‚ñ›3dB‚5:“U’–GQ9#° ƒòŸ5D_û–P›?­*â+¥EaZô©žXFÃEWe¼æÓãP¨ÐU+Or¸“Dp«ØkS‰ÎYÍÒø pŽëì<Ž€IKŽëê:Žd¤Q…¤’Y«lƒœØ·Å"¨&Å¥äXÄ/N }“¢‚|޳ºàj†ùbA×ÚÙÙ+R’´éÿMÀÕºº*T£TÖ ¨“LßêP9ãºx H¤æ–oý9©õ•Jvþ” óR_0Œ#ž'0Y™z&PS‡bô s>»Y*½·Jq~Ni´š‡e¡Èö[2†Ãb7XL†cŽY°d˜ÓÁ£ V°ôt-¬¨iŽþZb_¦ÛB™1"„¿ÝÔ+8Ük Þ Ök».¬5DUf§]Å-‹† áE³áVÜiÆfsŸYßföDÛ˜!¿ÇÏúð~ ±‡IæüBV¡*ï ‰à[N,z´¨”þ`K4 ª- Yl) E7…yfˆxC`[“!Â"@»€! ƒhx—ƒ:SÁ¡+–ž×A&Ä;Ñ&Ó ñžêÓZ[d‰½Xeë=’N{¢Z"ÞFºº°A«•µ±äVÆÛ½~½9SM—ýLÚ#2ˆ$ð,Þ4Æ;¿u‡5 wUج7ϼ«*¬ÆYâóOÅl€×ya7{K53G–t˘ZÇ€xQ Ê~}  –úP@¼¤8`I¸ßˆçDŠ3¢ÚÇ¢ž@ «`Xï+²HkïÞgŸ`àϤ4”A÷•˜jn79%»äyT”%<;}Á÷{å g|¦RÿFŠ=Ž)Ц$ oÝa=¾2}júvTUäÛI Dâ)J ŒÖ%ïTTi–]¶k›fEÌ…Ysž+ˆyr.L¤dàs.æ\Ð.‰ «Ù$‘÷ÍPÌëm|J17ÌZÆ´_«DWGAýD½^7Jt]_rZÙÆ;N[b Ï®ÜÐËÌ÷‹Þ iÚïÿrÍîÕßÿCòü8¸fyAðqîûÿF$9 ežò~‰B(É/Š£¬_EQâ"Ò|Ã禹MÓ–Ð;jíc ù|>¡Øÿ‹‡,Ÿ+ÿHÇô÷ô.á<sÌžß^tãu,5²…éìô®Õ7Ê` &!oo,ޝ½½½È+=°Ë h¤:c0WÝ6ðÈ–Ø?ÿ§·k»¿¶íƒ³ÂûíêcáR».ÛüÞŸþìÙ×þòÞCÞÿÙÝë~³ïSŽ\#sßaW?[ðàç^¿ñÉÈ–¥Ëþ^?ºæWâûïsÐù-òŽë/îx7Í ïùØÈ»çÜðÉ{ç¾zñ©]ß<èÁå?ºì¿w/ºÿÙvú¯ÚrÕAƒ¡s?àÍñ,ØÃò;º=ïÅ7Þ=ƒ|{ñ¯/ÜsòÄ×—ȯ}®s¯Ï÷(ÿðö·¯¼àø¯d¶?õVôO.üäåW_~úWßðû8ºìž+ºoÝgßHFn¿ìžûúÚ~ÓÐ:¶¼ñùfö¥5ïô]þ⥣òïwè›è½w¯[×z4(eà ©)Tõ±¬™å+z, /j.ÞuŠ“–§&Ým×·Ö†oˆî‹*Ñ7A²d{´h£_MEmÈ ìD¼ƒÊ„Ï­œÐV ÐG©šôâû(ާ7À?Þîd2¥e†Úi‡††½+ :~¿YÏ€Y°`&hB¡ÎïI19C†è˜BÌ0ÁïØíQ®x¸PEÒ¤xjÌlBptp Ç ãÝпŽp]]FÅvGE:"Æ0¹5©é^F; Ä´wÞnx Áº6€ï>ƒØ3¬Aj ZQ,V†((Žz~ñ\U€j5L§džùP€â5d# o+ 2ÁâÒ`¡p¹”Qy ¯úà0¯Ð3fq…çmÊÙˆ¢¶®è'«¢©Œ–‰¨±´Öç‡AP¯G°Ô{€Ä­=<Ë2ă6*8Ê×¥äJE†Ãd«Ó_2\Õa2ÜvgÑo­5¬;M†u¯É6ô—ÑâJëª6 ‹ª2Ê€Ý&0—i"úý‚ŸŒ3/à.¦%I3ã}>g+KóüliËùKò|ÁÒ¼@;WÒ/î¾9ë¾$¯=(}–/y–ãü¶<Ͱ·è® ¾©EÿÄP ðO§t0M}–ñöõ¡Ö‹^»tìkwïÚ‹}aÍ 7ùÚJs†º IªF‘ ú‰ØÜ–Ûì$Ç÷?ÍÿÍõÿoHrпy⿹ñ’Šéižøî÷ß Iú7Í÷ÿî÷ßIú7Ï÷ÿî÷Ÿ Iú7Ï÷ß®þ×ä óèÿ®þ×ä óèÿnüdž$ÇùßM£ÿ»ú_c’ƒþÍ£ÿ»ú_C’ƒþÍ£ÿ»ú_C’ƒþÍ£ÿ»ú_C’ƒþÍ£ÿ»ú_C’ƒþÍ£ÿ»ñ¿’ç5þïê Iú7þïê Iú7þïê Iú7þïê IúϧþOý¿}¼Ï]ÿ˜Jè_ÑåsºÑ?§ŽÿéôçÎïÆÿlHj²øŸ<çÆÿtãºñ?ÝøŸnüO7þ§ÿÓÿéÆÿtãºñ?ÝøŸnüO7þ§ÿÓÿéÆÿü‚Çÿ4·€j‹ÿÉÅ/küO.hÌ wsÿ³înêÿY ­ö蟳žmfA?yÑ?£ Ÿ‚W) ±0o‘>yQ´…ßÄ»9‹ô9®êô‰èœq¼¿æ×Éíá:}ÓéoÇX–4\'?·qü°{Ÿ}>°EÔ„²™…ëœFãÓ ×éÇh2|Pø‚„ë¤Ã1å zXâ7¶(šPofá:gØQ5¹y7\§Clá:Aâ¡4Îe;%ÈÆ\‹¹-¢&\Ú"j"h3 ×9ÆÝp HÓ|ÿ_GôÏ:ãŠ|ÿOý?Ü÷ÿsŸxÎ'³JP”ý£ÒHñ ~Qñe>"ü~±!.8nš¿4Mù¯#úg ñ?þ_¼À ¬+ÿH³ÿóêu[`÷¿ç§½qÈQ—l¼ûÒgŸ¹ïý·Ew>ȉçÕýä/»?ÿ¬å˜uwÞ¦må.|ðÉï>yéøf~Ÿn=ñ­Þ¥œtåQ—]{û5‹ÏÛµ|ï§Y¶âöknùësW=|ï¯ûϺ·g§¶ñøÝ¯vþô››øÉãgŸ}þ›wõ}óI7úÁ?¹kû/zîØ£´#µ7/Ý幤÷ïváêëþ"ºrç?^ðô£Ï÷ÿbß®íwØ7úüë­ã| ±Ž8ŸúšçsÆq>éNFõ8ŸSìùÌ0¸§lBí27¸gmÁ=}lÅàž´¨y‚{‚¨—Ø‚{²%y¬(–Þô• ÆY6¸§XÈ“ ˆetúJŸ ²ÁÒàž¾’€Ÿ[@”ãì°ÔÜó R§çœ‹Ï¹þŽÏ®]z;×VšSÜ“ã¾dv^¥äÐÿšçûOÑõÿoDrÄÿŸ÷ï?‘w¿ÿj`*¡$.e2ë•ñX"ǵo@IfR*zã§’¨Xt]ªüý‡àg ç?ˆ<Пç`ví¿F¤pÔ*P0¦h¹ª´Ïç˜pF¡/HrP'¼Äª—´^x‰^“¬ÀvHHUTtêÉ3aêe–«…Åòaê «T¾¬bI>Ïä½kꩨ×Ñ)XZ9ãAÿn&Ö4^„»YY!-- ‡7…—ÀsôŸ>$¸ÒŸöD[ºZò Ó—Œ*jL“ÐY &U)A»«Ž’Ž0ÝÏÆÆ²ª’Z=Ì9ÝHEŠ´MÙ–Ëš PQ¿ƒX$3Dwñ—r¬/­ çä W–¹êXÄm ç¦M´h´ÍBgxcÀ¬HÅ<)•êÈó5&Ö+³íS)Ö0 p&;bpêñ¹þìzœ¯S#` õf“4?“7a…¶ÓRDëÓ”h›ƒ+ÂÔ.›$EƒÖƒuTCíêxÍ“Öj­™æxi3V i K­EU2muÉÇ8³6–ÑòáLBŠÇ)j€°Ü3ššE?h1rÿEOÔF®.4rDã d@ /YŽA© U‰*«¶L³ç"¡;V%M²ÕX¹ 8*âÞ+ôçÌ©¥¢”2[k©(;*.O¥â´BR‰+r¹óQ£J½\ÃÕÄ5½Ùx|’œ‘•â±Ñ˜"ìlq:{Roy)‰F=îfŒÇ´(Ñ¢ IƒÙ µŸ³Èl<0Û¶˜ª4¤v¦ƒ§Z°@´LÉzõ¢¯ …=Jrgm(\Çø„|Žîx(”Ïa¶O¯­Ljê$2LøXÕ’RÉ€2Ym«a0Ý(DDºZÆ2ÄøXÁ¢=u±LJÈ75Ðß4B´RUS:85Þ—Ï­R´a¶c¡Œœ‡BÒÃÇR¯#«ûûȨ±B‘LÅNÊÖ¶q±-“ëÀ?ŸëÉ&ÒSÌkSc¥Ó&f"6àñ6]¶I- Õ)©u} (ŠG‚ª"Gh˰–mƾêçz w‘dº™5ꆌ£)‡â@zR‘lÂtJÍ×5ç¸ÀÕ ÝV›Yêò ²¶,g]æóf»eKN»7C—²°1d5:œ £‡ }G” «è¨ŸÙKçslZ#éx6Cü‘DžN?Sh‘¶§Ê„CrÈ.æ´“/7ïU`ÄmáhØCɱÀ º> 'FR¹¡¼!úíp>Ÿ¯sªÛ¦3y1Ì`ê%-š’ñ‰ˆDŸ™4óª*,² +­¯Œ¾"«ý©4Þ+°ðx¬•¹ßÐh‡ú%Ðꩯz‡¥§ËvéЫcy¸[–UtyOZ™¶AÛ¬Õ¶c‡Jlqg˜c€W kH§’(4 Øª2LH‰%Òq7ª¦5Ln€6±’¶˜÷Ô#ÁþÙ`œò–éÓ¬%·¶¼Y”Vl¯6A¥ËÄT‚Jçêi/ ºtâò7Ö‡¹R?rKÕÅeÆRB‡bçyì)ž«ÊíÓgaÿì°°o6X4=ËÐI–åœ9Ö®¡î,²¼³íÚØ¿HcœJ Ê)‰SéˆóÃ2¯ª*êõ¨Â8·‹˜Y±>}“a…HñLŠrºÃMæ·ÚŠ%31YÑE/­DÀÞ‹è»K „Qh*êžOV¤Ò“ˆ>ûz +ŽÓmR<«dHkl”H4×LX2Sã`¢Î|•£Ô6¦†BŸj m`ü"v<‹èK9VÅO³qX­üö X[[:ÅÌÆ¨=­çUh–eJšœöB© ótË)škúÌ™&SÛ¨<Ç òˆ°k¿T•ÖP¥¡-’q)CÆ”¤¢JÖÌF¹"…$Cä"Í3µl¼Q8  :^qro0šÏMµ[›¯§½H:=e‹X§¬é1ß[ø3JŽ÷?ÍÿÓ}ÿ×ä óÄÿtã?6$9èß<ñ?Ýøß IúÏküOŸàçD3þ§Kÿ†¤ú”$9–ˆÁ/¨¾ pMÏóCOÕý?XA þÿ,úÿ³|ÀõÿhH*Ú:¨@{»çG±’ŒÕèÜߌ’^Ðï+¹}Tä,ÓáÃü”ê .«Úõ÷@£Í b¸d¨É±vúñ‚1dHTJÊ`Œu„Ó’ÊTµ‡zà¡Ax¦Ô°Ա b‡InË&¾'ZÈÊÓ~+>QIè†ugbŒÚ›XsV†Äƒ¦KM»TyHÖ‡O5»ÐwMÊ”n&:£Î˜kñÙ(÷ò‹J¶0ëïÚæW.Ël•èîøÃè…ONS´3•8:}…£ª2šKÀ´TGÊÆiÑ2:Ý{ô7ï˜âI*š¾7e­–®R}ßæTýS‚ŽaÖÃMQ¿LèÆlõ¨¥ÕõÔŠ¡Ì`œ´‘,î»Ä’ÕÑT…EÒH )âqÜexG³ñÔ$§õ ®ÞpÊ é^¿‘œÖ u¯Üx"}{•‚RÜÂÒwåé8nvc˜ä¤6‰{}ëV†V¬†úÝËûÖö nDIíí\¿r`€ôn‘nÒßì[qÊÚîé?%Ô¿a`¥‡ š‚Kƒ™ÀKªBâ1'ôñÀ „*‘Èò=æ£Yä!¸õˆà˜†vÞ²½sÛó"̼ý}”˜U0ð¸ÑÝqTÔDÆ3ßËï¼'‡þ×<þÿWÿoD²Ñ_œ ÚcªŸþ¼À»ç?4$Ñ_fÙæ>Àºû Iúsó}þ‹È‹:ýÝýŸ†¤ú—(ݧIZ$*§ÆœŸÔ~LõýÃÃ^ ô÷cü‡€(¸û?HÍvþK€ˆœàããããããããããããããããó…>ÆÜªñ˜vžøÁ/Ë0¢`‹ÇÏlñøá†/—õø*'3Tb¶:ªv Gx¾ú¿Üns3dûÇ ÑàKþ;Né€+×?hÝ–‰ë?E„Ûèy¾hü|áxƒ*C ÀÐØÂЖĦqYÛ¤*…ŽÂd ¤c ÖÉ&”Ð0×î/i]”jnÙq‚ Ø|P(jžÆK,ß¶qüBb½‚½±çl c ÔÐï}5ч}vúàmMôáüГrÌFõϰÎ5+ê•ñÇŽB¡ýÿœ6Q^LΪ Pz5?Ðr~;V³‰ÊHD@Ê6Á ¶&6(嚃ÕÛh·ó U¡,,öùÀ.@­œ½ì„_CWlE¤‰v ¯R4“®‹µÊà 9¯X¼³^Xüvú L 媹ƒÅggPY ÐTFt¡Óº@*×½P`¢EdP)ª~„‘Õ}Q»Æäë8ÇlÜÀ•9;ê•„vÛ_®ÿÂl?'ýÛ×ÙX&ôï©]x ðCó|ž “æ%½Ôu0Kx 7‡pÃÿiŸ2ñÊ‚Xú">„>á 9]J‡uXHo­õÑYGÚn¦q¾ÔÌ»ªz2ñ‹BY=3„1ª¦¯bM½ÿÇÞ“@GQeë‚úÓø•ñ‹L¡ ALwWuõY4¢ÀA!pb¥»’vW5½@b â(:.è ¢‡ñ n£âá‹Ê òEtT¾ƒë€¸{ÔÏèwe8ßóï{µ½WKw‡„¦gN¿I×{¯îòî}÷Ý{“¼›×Qªƒƒè±°ŸÈãrxPúý+Ô¶¦­¶S¹+mÀOûTž2| TµYŠßv0i‹E !,B‚ôÕ~ž \ÐOxÔ ìr)Û‰³dÎÐ,»Ú­Æ—‹/axÂÓF¥Lsk:çF9K,°¥¼2B‹SŠ7«©Í¼Pƒä¡a‚¦G $¯;¥Ý äæx;|¦Æã‡û>Ä“êÍ冩®^¸›Ôûj7ï@‡«—]b:ܽh'Bzç@¦†ò’õd\1NƒÑqDà§]'d|âÅ K÷¹úf¨J-©_¨x„Ãb˜vÊ-(/º!39³"á…CNð(oº!>›7AC²Î›ßå# ”ç[íñt°…p‹%yùÂ~6` ²¬S’‚$ɘl8Ád£=‹à_»êM´ + öA Á¥OM8úuqòâI§ØíL8GY¯“éœ-¾Nf4‚+íègŽŸe¸`å…ïAœ<ÐR™– ‰%J;¦'ÐÙ7•i w \EØ6ø!lÛÃô›é‹ÚÑG}>°Ó×®…k5nõÄXiô¨§–á­¾Î0™xt /œIé[tyt(_ŒÃÂ>á‰cÈE*½‰CB–‰Z§“{^ЕCìóž\+ôXؙ˻uø¸;¯¯=ýíw·ßyBÓ7G¼Z·dú'û–¾<ö‰uk7|8|ÊÓB[þ~áý§,{rÞ%»~øÅêŽùð†³Ÿ9ëi~íáç}sæ‘KZFˆÍI­zž»û¿vþ´ aÕ¼oyÈßPÞ>eÏ »|'¾¿ÄKÇ­8éåÄÆAÕWÏØ\;óë>îwñúÚÃÿrkrø]ï¬xäˆù+onX=iJjä;ËÆ¬ºýŠY÷>w͇áíï×ö¸ðè†/˜ÉŸ¾—úèCþ/î™yÒÔgGŸþ»åonRm?cÖg¿}xÌ5¹NNúè£e5Ÿ,[Öq翟uß±+G;jÏ—Cº£³—~äù÷íÛ7÷Õ3ˆ>ðú1¡_þÙΟ‡®|Ö{ì´ ö¶gÈäý÷ÎÚ¸ÿÚ®ùSïã¯tÊ–}ñÅÙþã­“ûïÏyóºiƒïØ*}ôÊ[‰#ÿ:öoÑö¾æýëÏ=÷îÜü§nøPãM%G¶¿tÉŸsêíg\ø›ý+ŽøvÊ€g¦ü²ß ŸŽÿÏÆª­³nx{ü’U—Þ|þîKo›½cîη^Ø»ùÙ1ýüÑ3N¼ôªáÒº5ò]7wî9÷¦)òWÓ67 õlÝ3ûÉm N¾î†7þ^1|̨Wç×™9;úÉ+ë¨_sÍÞó~ ömMv}±mõwßuæ9»Ž¼â–³Ÿºi±Pÿ×#?æòˆg׿»q¯çûËmoÎí÷ßÃ¥÷ûïÙÜà½vîmì {wÇ^ÜÑõ^ìä׌ê‡BŠÿ_’ærÿ¯*{÷‹a<Ï}¿Îšd½èð^ñ‹;óÜì‹ï+ŒKâJQxÏïÁ…¢®õªò^î›ÕŽ¢wûŽ;"“KŠZ9Úeº%6%¦ôè’_¼Z}S‡9¨Þí Î@°Õ&º®K}§_êŽ8ðroóuU¸Ýà‹ïwÕ´ÝǪi~¦G·øR Öák@zVÛ¶°j!ìÓÔ+EÇÂ;ÄÌøÜš:õï7ñ º›[ R3÷WÓRlájíF S! I±5…íhÙ¢9f1Ç )tO1°;·¼ÃÔÜš©Š lû 3X\eYA… Š;{ÅW4_œ•¯Yxž–Ëv/f sU\Ùc8{0¥è^âÞ0(š©€#Sõét÷b®0Sž0%¦Ó½bŠ/š)ÞÊþ2ï;¾0W|Ñ\ h©gwo8 ÍYÐÊ™ÊT¤0SÁ0•¡‚v–V®·&6„åÀ*pæ[A ºOE˜ÚP‘¥Ê±Ü´jî*ptVõâŒ,Ñ%õ%t1+÷ÔWî©/êžzµú"ìEÆÐ"T½„€kbÆ…UrQS¨:ÙÚ,Ä– _–A—ª\Ô®$… 3Eå6IͰéWÏð^fÌß“¼1E+Bê>Œ4jºGšÈÌä6%'¤ã6詌>4^Ì(5Y1ÖnÂvȇ:Tþ—l–üW6÷‡*÷?—¢Yä(ùWê?”¤YäÏ—‹üYEþ¥hùËFþ•ú%iù”0$®"ÿR4‹üÃe#ÿJýï’4‹ü#e#ÿJýŸ’4‹ü£e#ÿJýŸ’4ZþlùÔÿªÈ¿$Í"ÿCYÿ«’ÿ9Í"ÿòÉÿUò?%iù—Mþ¯’ÿ)M³È¿|ò•üOIšEþå“ÿ«äJÒ,ò/Ÿü_%ÿS’f‘ùäÿ*ùŸ’4‹üË'ÿW‰ÿKÒ,ò/Ÿü_%þ/I£åÏ•Oþ¯"ÿ’4‹üË'ÿWÉÿ”¤Yä_6ù¿Jþ§4Í"ÿòÉÿUò?%iù—Oþ¯’ÿ)I³È¿|ò•üOIšEþå“ÿ«äJÒ,ò/Ÿü_%ÿS’f‘ùäÿ*ñIšEþå“ÿ«Äÿ%i´üå“ÿ«È¿$Í"ÿ²ÉÿUò?¥iù—Oþ¯’ÿ)I³È¿|ò•üOIšEþå“ÿ«äJÒ,ò/Ÿü_%ÿS’f‘ÿ¡Ìÿ©õÀñ¯È¿tÍ&ÛV òBQ†ï¶ bª¸Av¿ÿ— üZþÏü•ûKÑFŸ>£fB\ik8¯ß3r¤v³x-c½Z<ïÍâ£áÍÉè-õVqõRqT ]*^ËœkÖ«e“ãhþD%'Ç%¹m¢ÒQË [⃠3a>¨›¤$“è.~*†æ£;Ǧ§•„ÒæñÕ)Ù:T) «%Óâb«GïT˧y|1›K] d%™eº<¸´©¯^Ž)ë,1†.Ñâ‚!ÝÖ‰0–Q¿ÇÓ0cš ABå ‚A¦M„ά˜^($˜TÎøìñÐ < Ï¥˜€?Äø&ÔO,< ±\V4z8TàUJÇrÉÖ„ØatóЗĴ˜‘2F§:a .4ßBªñlt #+%âæ”0ã›ãR"!è},QO‘²õÕÛÉ@w×[É`ŒzŠ Èh áÛ ð€˜<ൂ€ž™Öi &¾Ù’0 A—æÉÆß&¦“‚oI/òÀ­@½È·‚:Ð V´< Ì7w¢•²R<³,xH)‚@‚h'! .ZIR‘B zè“hx@¦äˆ‘lð€O‰‚ ñXZ²FP,SŠÒ gà(vœ! E±â ¿ xP( a BÉÀ9ÔnôÀ[9Zæ@EÎŽ3 ¤ä¬8ÃÀCŽÂœ4T¦œéÒ*¶âíÅøÔ¬¶ÞveÓ…ö9ÙOÂlA ÖÅpT5X «Z¡æ9Ù±;|/[o\ÚYHdè~@»¢\¦^ è³ÈÆà¢·ŒÇg†w`¬=Ó¢>‘p"¹yæ`½.4IVRÚÝ,Â’R¶«¨n-ÓU5’‘˜ù ~Êxª|êBÛ|óɉ|)¡b¼èjVà÷i¯³L[ét®Ø ß«ÌdcK ¨¸‘VšžªçVÆU€":¶0£>VŸ©õÏ·ôÏ­ DzÝ*tP;o3Œ(2v)âÃSeîT¬n]šñ´°ˆ;Ü&ƒ àÛžÑm¼-š?:ŒÑ¬¢°Ôª{¤@ÈX·‘ŒªŠB|>ƒ:aõð±šhˆxTç›úJªý~}«0Uê8‚…ö£ŸIë‹×¥ªŠ´ ýu¼†Ævëj¢t¤ÒR3tÄÀ{ëß©}ïÈ  ?è+âa×AØ‘€J6@ª>`6€­Ò2’<î2;Ô]ÝFM2 2Sâ )•›q…gX_º“\¸tùD ‘#IÖ¬C—›úú«OUÓÉdÓ‚œAq¿§ €ÕêbµEõŒ'(¤c E¢€&T­¶ªV'šÚ§F'²#ê ¡SLãÍ›xªš`Õq—fH 3‡ŠÈ05LÎBR=Pµö,|FÂÕÊ…Á'F½ø§>ðäCˆ|ˆó<à†15†c¦o)•°._RèP?êk }.MwyªhXÆ–ÉäZcR‰£˜ÑS%$!ŽU™°rÈ<™†T7sÝšp ûi"Í&=FÉK‘5žLú“‰*´{ 1i3Xû’¹TŠâºÊ"ªË¨%²T§ ¢ :›&Jc/sýºëÁ¿îøhuÆÕ¨_sŠf °Þᢓg£[DµnzRÊ¢‹Ùá˜=ˆÏÒÊ"MجŠMïU LP·IÎèL.-2©x+rÎÐ5Ûàü'Á QÏÁé3jpÌŸJ‹Y´^J¶]D•YÀŸª“2Ytè¦=>ýíE0(âS«›éB©$ì€Ã> dTýÈe _#gÔØ±£ð䣯Åd„V‘Qd ƒ¹@\œÚJ1ä&%¹-Û/LÜ 5ÐÝÅ(8š¾ÔU;N$™©nR¿ë„Y¦ç2 KY *25 T ¤²Úg:BÿÌš0 h9‹ËäÕ2Ó•4*Öõ¨'†–3‚(> ÒÔMz L¨îEyT¦µSí›á$àgcYh\nÒã÷úý0D|5÷™‡E= ²è*çY5v1«Ò‡UÌŒõT?ŒÍâ¯ÆÆw@kŽi1„cÁòÈTkg z@q²öè'ÌÓ‘—„¾A£:¹ŽËÀF@hQvµc¦y´§) F>è ‚háCÈ H8/b"`îq7~Ò>E"ê§€d­=r†÷jý¶ièM??ÏÓ½‚É?JÍ+€5>ópÌLæj˜d3ػ洖Lò¬\pLÁ…F·I$æÂ6À’ܪÙaÍðl/¤E!ã ÛF¦VÀ¬YŠ÷IoIqÑ))ôXŒ¤¸ˆIäÆQç"?ÜÓô†5¢K –ê|ôÅ\O.ÌþÓJlîr'•¤..ŽVüéP’k›Kº¯$"Å Gêü,ˆåâ`o6ÄmB^ŽdÆä³kÙ®.-8YRy2¢Ÿ&'ìK«AÞ 6Ì/ao(B-®ó±QRýäØÌTNt\•Ù ¡f¾œ°rÞoJÚ6¯;Ñ!õj2xá†:¡Å¶/5±ºär£%NÒp")Lj΄x!ŠÔƒJOˆÔCðë„l>2håΫnl¥A£Â¼…@›óÃÚ…T*6ÆÓŽÛжElšd °báHý98ˆ§™ ÷Åik òÄilH#΃=*:ñE!t¶Ã>ÉϬ?@kf1 Y¤–EY;艎Ʈ xm ¨xÞÕ “ RVVtdˆÐeó¨Ð5¤HöB5™,‰ ;oV™QõOЃ‹á ݺrÅBçЋ’#†"¥°˜†B<õlÅX»ìÝD’OøÅ¢#¥_—K¦ò;ÎP(šzÐbYÎÓÄøQ!±&ô‹¼™' ßçyÆ7QI£ZhM8`ô«}pÍ=WJϵd;S"ã›ÙØ ~©j ;ý¢Ro{6™ÍŒ‡Àï^ É—y|¦NÕ“1_ë!ƒÆˆ3 s õWcÏx$ŸòDÒn{_ ËÇüL(jnUË‚ö&’¦Î©¼!ŠP,¢ÇÂ1´ŽÉi)¦µ¼Vd&ZM‡Íb>XŸp4Tø1ÐX5-í ·D¥ ás ,Ho˜>®‘„Cø¸hR¶ÿ8ÀœÅÓ\u ‹|IŒ„¯0J™æÖtÎv–XdÂýµÂdi™Jñfõ§8yÁš¤êV\óbÈQ‹%ÇRRHíÅ^ýxôÁ†o„zå>èy¥Í1zuÏ×ÐÜ ¹×àqv⎽Qç?Y\µë"~΢w[½»ë¥qU5^[×¶Ú镜6Yà½Ç©ú]ÏHÙÑô'ÂyÕ AãÜ—Õ¡I×ö?ñsòjø*ùݼÎm/ú}çÇš1­VÍ­•¦[ÔmçƒvSrGÝœ7àf¥¯Eºß©ÔS8tÒ­\;µr2L"xÁcÝÞ}9ÜŒ÷§6ÙyåÝÚµœoßðØ8â¡ë‰y¾i§/tñØx:åï×ngg%ݰnxÕ]‡ôÿs!ã:ΣWý€¬6ƒUw›x5gЊ#_M]ôàYõœÁ;ŸUY5j_%Ÿfs6·Ùûsó–mgüä».iÊŒeΜˆÛrfɈéç_¯S»ÊºYホç´²wÊ’šË²sÜ-uí½DX0·p;9ùèo>ÃÒ—\šßëü㦙¿$ßÙócÀFzHÇÕf{™~6³NUó«-Yô½¼ÂÌ-s¾Ü¿tp½ÃûWÌ.àö¨Ñ뵤ӫ§ïìæs™mf¸6ídòÊ95¦w»ýé‰]÷ý·7ù¦Šÿúì×›Œa×}]#ðˆšÏg¶<Ý>èTõkù©â‘A÷˜Ï¼·œ½Xi›ÏA]BžØ{($µÛÅ*oOÜaØÿë¦sÿä¹<ô •âû¿üd§›<×/û°ò˜o¥6º­#&Ýõë¶jñ†Þrçêu°÷pçö$Ë©gœv–Sô´Ê/Êî?dy—]kÛ».ʨ”2àóÛÎ4Ú|næÃ—›ßÜþNú‹ŸÜûÅÿ›-“VÝ»ôj穻ܩÿv‚}ÒÖ©SVúòi•z,_·2ºOß³[ü¶Ú¸©O½oŒ}'qìƒëÚðéW'í\û§e§ bœïëÓ²"îýÚ…<˜}'îÒŽ‡÷¶8+ø ¯‹ß~ÍûÆó¿¹¼ÆíÖŽÇ[nj’?z䊼ƒ†TþaóÖ¶o­¾ÒaÒ›¯¼Ú­ÎªæÞGÚz)õ÷‰{m ÇWwžëÔMï$¸wžÀùúÀàžo%½sºGÆÍ†.M¶îÝíÿK¨ËYþb;ÎÈ~<Åšn12G¢½)ÂÚ€0}dH—Ø$GÅ#à†k´8| á[8d›FÌ oÍ °’~ñ±¡Aa†¡ZÈø„¶X’þ®[’¡{þ) ÅŸø¡Àqprº¶sLL¬!a¨€n ×v…OQj&Áš^0~--}-?—Àß›@h{Gꈡ¸7šá„;ä¡:/ÿ˜w¾b‰Šeª‚.Ò”®ÈÀH}Ðhûö @ÇŽÆ…"/â®hŒN @Ãý@ m£8&‡†1ÜXÛþì­Àž¸-4Ú ô&-£ë{.¤ïÀCkü@þþ@E÷ýä5¼ùS^~Ø%$! QG@»…îÉ-£[@þ=%ÿN}bhX¼g· ~D÷ˆØCBh|dœn¡ ;-‘±1¾p(=}}(À%šâÜÒèy@¬¾¤GÆÜaÏ¢©ÃÃJÍF»pmçD”Áé9LÌ&&·F™c†¨0Ïî­¥QLŠ ×À9Oidô‚c‘u-œ0Þ€ƒÆOb¤{ȤUôr>¹G p*½]ü=DÏ"õQϹÇ0ºâï±Å¿…æ‹¿ÇÅ=ƒq3Œýj(?%ëÆÂ±ÆlŠÒªÂc Jäßž¾ÄPÏþã:4»Õõ4.9>ýYý­‹ß®ÁëxH¼,ÐÚ±­þºŠèÿÿÕÿY.WúWüWþc¹\Eè_að_)þc¹\æôg* þ«ÿ³|®"ô¯8ø¯üÏr¹ŠÐ¿âà¿:ð?Ëå*BÿŠƒÿêÀÿ,—«ýÿMüWìÿaLøù_.W1úÇ„ NˆŒÖãx£`>9þB£,†{,v!—ìÿcuŒŽ1§?E¢[ÿ_9\ ÿ‘å‚eÿÑÿèÀtà?:ðøüGþ£ÿÑÿèÀtà?:ðøüGþ£ÿñ¿ÿQ¶Y†ÿÈÒ Áîÿ(aËJ•‡E|*rrQYPi}S¥ãﱌ”•‰¬ÎÈè,Úœ½%´ódS#4€2å[þ§´,ð2ÀXH:Ò[Ç%®Äñ䂤NS´£†Š,ŠèeE±TàóO±ms¥°´é X=)g'ôQ‘#„5ƒé)/WvšSríó‰gyr­iN›fç)Å_JñÖ ×#†‡Ý$aû°/I+žë°C˜ë ;¡> œ]…R  ³,i6i+„†Êú-¬}—d8_x‰‹)F,šÖHåÞÉÈò¼YQÕ’l‹æT/É€ D±qa1F±Q"™M$ÈóI¨~aFLM"áAb¯7p%!Ç ÀÁÃN¸¢Ñ‚zÜËVNÔ+¯œ¨HË+'qp¬Y™UÕo)“qöd2äÆGBÖøí  qÑ$ P‘—ŠøeÞ½×6Í©d2Ž@É”glDp¢!2*¡D.S¢o™À ­`µç²¬¬&Ÿ¬U ­•h]CðM ƒ»gOVÛè‡)¤“ötâÓ’…°Ýê·”•tJÂfh´à…Ö¾WPcMKËâ¢iICEJ¶á —©ÒMFÏÿÛ6§v…Ú!­À4Ù5Ê`,ÆòÖm{u6^])¨²Â½ Ð¹%´¸º’ «£Ã±zÍiØ&ÊdGƒb×Õ·ÁÈR‰Â»™9¸ú•‚€l·ú- @PÊn(ï‚(Æ jJ«gÃ2! ¡ GÅŽª ’ÁØQ«¢¥„’FW½Ì”ŽbýÉ`“æÔJ´F*àSM’A¤ $I™¥ca;kœ”62T'è¼oÍÑÐ"9A1öÝÚŠmH[O‘ª¬|*Z³µUY¿¥r ¹€b‰‘ºÅMGªåB˜Vh…\H‹Iˆ¯2ÁÔI“nçŠÂj†‹²é¿ü#]é2Á6Í©Ý 0ÀÌHg’ "=Ê$Š ¥ËøæœU›ÊZ°WžQ:`‘ijÏ€DnY ÊšWØöxlK3‹ ÀËŠÐÁß Áåp<Ö܀ޱï^·!õ@œ/ƒ‹O5{ uõ[,@Ì¿`DÃÚÎ"˜Õhõ<(.@‚ °ùˆØ(½-eÉ tcŸL‹:ìš‚EM=•ä1©,ª9 Ã&Í•v¶$Z…’d‚<¶%‚²?ïg¶qoÛÄ¿­ˆè – ø/Ü–YÛí¬R@¥äsrŠШh•J¡®~‹%­T)((Iá ƒ¶q´z‰ hõ:V!BbbcB#Q^Ñ+Œ=5-ôh¢¤aÄEYQÃ/—¢Z Wؤ9µzœ#hž•! ¢¨ O*öéÝb[+µkýôE´€µÇ;QéPX+C!øD@aï –ðœÒaðiv0 ѶY@ìªtà6$ N&Y)ÀOK>Ùnõ[,bX3Ã<Ú´ðØ£ZÂè „¡&RÂt® òwSÚGà’´û.±»YQ•t±¾1Õ²…#øâê‰D2Y9Mç;—v$'ãM[§rXë[DŽú"„ÆÑ x ‘0¡;ÑÛL£€6î`Ñ( @ùˆb&œ}% OÈç6áyd>ç ]ÉÁµö©Üb¢3“!:‚Ïcá¬!œV/(í¡ãB ¡úŠb 5vRbj•$¦Æ=—xZ§(©’Ö6¥Zz È™bÒÃDˆ2Î[0×;ŠŸgõfÅZ¿ íQHªTÉ5šÁÚ¿ŽÇ‚CáEì,À^Bä\(~ÈÎrCGÀÑ“X7(±6,±VɲWn±ÜàÍ,¦P¯Ãg0Áý¡j±Ajõa#•®ÕÄèÈ "2pÿLlŒVz‰‹±)M6\ Š’*3©u ©6BŽ/îL…ã_Vgª”^am¤œ_å(Hø2 ÄÈbÎ`¬ (T‡®=€ö0v¶…Â&XÙT‰” °ÆÁª¢n‹CöÉ""†Ã„53kN†ÿ) ¦"+’T åpKÔST”V츂cE•²ÁúæTK¤ÉpÅd¢FYmÒ-keœpVÊÞ, š)5 Ž&…ìH  a(Í¢1P 4x;‚°‘pÀ4̦±Á“s„HÁLÊ0´0ÇP,fT„éooAÃP¤R0€SЦ”´2»Õoq€—­ãq´јGúàÄ¿(M`±ã$ž7 ÿ"r¢2I*žÓØ·À`¯Š=G¾ûúÏÄ8vi.3(OF™ö€¾Äÿ™ÊúËLJkÃ&ERÊŽ#ÈM4)à0C+…ÿ¡YÀÑ:ÿn«ç?”ÇE“úPRÏäHø¯À…êÂÄÐ= õ!#y^W.G°8®ï*ÿÇéÃÕµQ:ÿ¨ÔSÅΡtþ/«E?_¿vÀ›Ö´È¸9çs +Ÿî/⤢#éµ~‘QèÔ­š+¾píÖ‡ás£ñáõIiéƒb›oe÷ñ/¯ý~´³æ™Qw\‰õöUKI¬ùþ´Ugò]çr÷²f2±éž‡ò#ºŸðs=¿"ŒûæÆ[»G:OtýmsS÷§7=½^°öÖáìSÇ«h²ç=ŸÙtë:7ÇéÖH·cŸdܾr±`èÒ§k&Ü¿<ðKç )§ûî¨:ñ^â3æqá–Ý[¯ž²¢OÄê­këûÁD÷½i¹NtÜ»ìÀí ž<2šö)|`ø®qò]=Þ5!)ûÑüc9ß^85k\ÆñV…W/^®;qgûwS ÒÛõ=úّůåÚæî]-`홥—OÈz¬_·9«pÈôÜ÷otŸð^v¯¥Í¶Kþ)##è»ÍéͯìþlIx«ÝÿÜ_½lWbúÃ+R²Ö \1ã``ÂçͶ\¯”sýJƯµßÌ:=sšÓ¢ íä‰ëg5Èp¬QåS9Q†ºwƒÇ7þ~úÉŽaé— #ÎÝÎížtÂiýñ«¯åÖ\¸ÔïhL÷¸¼5ªÏž¢ßÙ©à¯ë-ûäß¿]¹J°ív槦ö­XX¹e2³OÕk|øm5È.{6ýÓ¾ižÏgþû¸í*ÍÏùªþŽ ÌZ™7R*ͼð÷Ì—îåæwjX{Ö '·c×V6ÚçiDîçæz…½´»ðò’ËûÏûùºŒq§'k-âî½ò·ó߯ì¿6íïœI ûÞk>ö™sµ{‡6¿RðQóõ#ö{5áÙ8vCåF“gÑMºÕÜùš‡‡¡KmŸù¤ªËýTía¦ÏœµÍz}Ñ)èƒû]—]ñ½ÚsÞêúVЮÓ7Ù.4kí¹/©ïS«ÞÈ(¸$lx<µÊô)k ï“G¥zl»ºØ£Ù;O" ó~>èÒ ïÛÇü\“x¯ÜËoÙ¡÷áüÐ õ9Gw¿[‡pKòÙñìŽþžË´ä]¾¨1{x«ùÖ¬ÚëÏ×ÇŽ»»æ?»a~žš]5&sÁcŸ''OW±ø”OÂá>ž»ÿ3ÕÛcÙd¡~ßÙz·þ-ÿ“9zÃ'‘綤LýÑiê·}Bîʯ3©±¿ºôk½‡;Þ?ñÃ…ð[•¦»ïÿ£ò¤ýÇÙœ´üíS7ÍJn¤?wÐìÓ¡××ÎXØwHÛ°ƒó6ºŒq[½ly"¹’óƒD÷UÇV>ßPb/>}#­‹ðôjÃßëƒ?«zùÑ‚ewÝwĦ¿Ùû»YwßnLz6Hª—:}Á”(ÿI^ËR³NßãÜœ±ÃÛVŽùdȼQþß®ßXû§3…Ã;´¹døeîQ2ú£>Ǽ·žéýãgÁ}wî ßµpSŸô<×GÛ»|¹2öܧÙc7gýÑct‡yÎUν괦é˜*…¯¾žûfÀ¡N]×Ìz¼ñä°;wrÏO>½H¤×v=¥™¶°ÃÀ>“wyä;ßöZÐ"ïpR^œ÷$&jð»'º|¿|Ñ©º½3RGeדÐô’gÚ¡Ôö©ô5ϸ«ÇžœsfXÙŠ_࿨cüo?$O9M¥Uyð¬ðLÒçLçÿÇÞ³€IQœi¼Ãè#¹‹JÎW¡ ì*»3=ÏÝûb™¸ËnvvA¬Ø3S;Û·=ÝCwÏÂ2~£‰ †/#OD&*˜(zßñ…žr>ˆQ|O=¯ªºçÑ=ïeèí3ý 3]¿þúÕ5Uýµiû}‰ác>:tÎô×\ÔÏþø½û¾\»é7ÿ{÷Ï>›2u—ÛõÒÕ`â¸kíìüÆÚõ ¾ýÅ«¿ëÚµ÷±y×^òµ£ÇÿáÂcÂóàSûvµòêË^™õüÞÝëZƒ?:¾çéSoYÿPó ÷ž<ÿ—ûÞ<ýõîáç·oëš'6žºvÛ}¬|r<÷àÞ[:øÀ:¿mïoðDÍ-«Võñ•·Ü´jç7êÎXwÿZè\³`ÚÖ§œ¿1î8ä^õ£»«wOåPàó×~vðä3ïúëvÿþŸÖl”.\¼µã³3·Õüqíö“Âûv}=øñ[ë¾9V¼Ü½ìœ÷wv†§¾Òù·I›<7ü3³zïû–ßüÜ»¾ .úÕôY?lüðºszÞ_yímË·qomxã¸ï~ò­…õ®¡C»×|gÜ×-—X>Xýaã [ú†/n?ð¶å”å»þtÚÿù—c_«Yþ1ì›ùÑßÞ­ß²Õ×þ‡p׃#×ü©/ýýij/yb÷§Ww<¿üÜØ Ëû7Oúë†Í§,8öz§ç÷Wž;$|üÖKàá­[\'Ÿx†{ܵ¶3Ozè‹û_x™Ù3£søÉgï¬9k¼óÀï,ã;ß½þƒ?ù¤ýã[Ö-é½gΓCÿú΄Nk&í½uíc—LÛ:t7ßyú®Ÿ>±qÚ™=[Nz#´çÛ¯V_~óI¿¹à§ÛjîìuåŽg6^Úpõ¸'ûO{–K¬ƒ<Ç®¸ù×H8¶¶]9¼æó-Ù0oËúžÖ_~ïËÀâÜ~ãO?±?Õ{ñýMW.ÛrÞ¤—wõY{oñk5®¨['n¿~›¯;w¶¼ÝxèñžÿðVÿi»Þxk ÏÍß¿sã/íúhztÿ³}wؼíôp×SŸ~pÃôí½ùëÏ7¯üÁ¸©ß~Ô+ã<&ÖZ¿{ÃÐAÛ´‘;öt<¶ósûÇ?¾ó+ÿkóÞoíÿæUëºÿœ<ï¬xúÕ Ó®˜ºí·SF^;¡ÿ¤ ®™ùÞÏYñ~U×=Ç>6oÊŸ¼Q·lÚöÌÏïØ¸a÷Žmíölºj»ë|î™­ý«|aÇŒÏO¸hðÉ(ú1¬¼üÑ7èƒÒB+š³k/\*¡zmK¥v©JÕËUfã;/¨ò€&)Ö&Žã%q¡œ@ÙäJþ°Ërc”SþpÉnùÃ?ú­-+¾¸’ˆ•^:R½¤›€ôSÖó˜Zd¤ýß„ ˨J©„ŠÐÍòá$ ‡¦)†¡©¾[¬]Ý€š9S)Ø )HX`QÜøH83¼EKÂù¸“.|Ê Ö&T¯¯Ç[,2’ÅêÃÅ0g=â«—¢‚ð:?.¼óß l27$£„`,E‰¡ ƒ—ÓðYq9hU˜" Šb/È|´Ÿ“Á¡,©Â„”~’¼(MŽ‚ÌÁ›uv§²Sæ,HS)gY‹R£84Ô4à£2Nr±0ƒŠ{+JŠ«0)õï<á á…))zz¦(!î‚„àsÎòz°½ Ýñ‹Ò ²hÀ51N»­ ý‹’QŸ&£ÇCÅžŒ15cìë©·Ô«s3ª6Ó"įŠôEr§pZºeœD¥ëgØ.z…bA(T·ùºAû /JbP`¢¨¯£\¨ä"U†çZÑø\ÝÚh·Q6›Ó݃ò;ùP¾,åÖjí¬þ‚w°úkPÕ¦¾ ³Ú/ßÃê—/b­Á7ðI,¬n¯Iqq©,ØÅÑ’Z†EZìr¡p(iv'²59‡K¦9êÑȤI³ã+µiØV“f³a{Ò–³g×Å»YíÚYå\X4in—=+ÍÓ]·Á‘ͨ̾ÉÂç°gÓ‡ÞÙ|q6¸³ÒÜöl|w-}’²÷@¼çñ=Tˆ4=Bº@&-øú¼È3«·,¬¾ü†³ŽžÐµé²õ7>é<ã¶ï×d§ô[Èz -HDðN[}ÃWhÄтzý×Fáýï.'åvÛ<rÿ»ÛeÞÿ®hÖÿ]F‘?eÊ_ÐØÀ(òw»MùëûwEþ”)]@cÿA£Èßí1å¯hìß3Öò§ìvÙþí¦üõ€,ù§e‚<' <‹×ðh²ÒŒFëPɲÛÀ.àÿe÷ ïIÿ‡›:Êf§\H]LÿÀ?8…bAJñ²OÄ-~’“ý¸¤‘¿•ÅJiüU._‡ŠƒÙ A€¾Ø9añ“›Æã%éYÂÏp!¸4ž<’ž,“F?« KÂÒ;Þ·Ø‹)‚" A¥•{|åÂ@©i.Ä2\¸Ñ¥ Ùƒ†â¤Ê\¸ÄÇDb,^žk‘«4‰8Êòצ2ýµJ¶¿V)P,–¸_’€ÿ,…àÒÂ…þ3㉜}©LHzÊ«ŸÁ‹ÑbJÞǪ­n±x•š!ˆ7‘„Gä;r SKM£Ÿx$ǘpL€‰…sú-JJâ{•±¾@zGø´øBILP\H<—gØ®¨ÔÑÖ‡.¢R²B‹ÈM·P§üb,TñV(áu¸h…òÂ.J4”2)ìÂ䡎0Œ,”Wûñ¢/˜¥eUÓ«üƒˆ#I²ßÈ¢¼%$kÓêä VD~ÖqPJÕ(Zªjf ÜSÚÏ&fž¼rÝØo«£ŠÅ áýx<£\ï #‚¨À#™GðõÛ!_sˆIH& $$‰A> ñÛ`$°„aY€øfê;  ’`¾·wNW_/hš»ÌoêéišÛ»à\T± åâmD‚‡‰DY¡]B ÍI#€m=-sPù¦fo‡·w@âííÛæóÙ]=  t7õôz[ú:šz@w_Ow—¯­š‰~à‹º“ÄÓ,ƒtNDmÄ8¼)Bƒf_+¥6•U|rZøèR•¢…Õ$» Yœ¿vN·7ͼC€uœUðaHÇ#b]¡ñ_3ÿõü/9ÿ÷ØÌùŸ ™ÿÕEþvSþº€Fþ †‘?eÊ_ÐŒÿÐ(ò÷˜ò×4ò0ŒüÍõ]@-—Í(ò§Lû×4ò§ #Óþuü톑¿Ã”¿ ‘¿Ã0òwšò×4òwFþ¦ÿ. –?eÿ?ÓÿCÐØ¿qüÿLùëùÇÿËôÿÑ4ã¿qü?MùëùÆÿÏÜÿÓ4ãÿ˜ûÿ™ûú‚ÆþÇ|ÿßîqÉöoþþÓ²äO<“‚^Ž‘Fåë™ °€ ø¢¯TÊÿÓå@é”Ëm3ý?u•ÿgZö™¾žA-N-ÄÍ-·C§Jq’Λäa–üA<1ñ†f™eä`4v²¢V@‡êP»ßïŽX&:a$0;Æ‘t1å?ÖÂG¢tPòJ0Â,ƒŠ'°äéÐ"Ú†û¤ñÀKg)L€êšüÃ%-šö;uXŒÐ,K(ð#"Z’ ⻢’Ê…Ô5ŠPKå§eUùE&RU"ÍTI4·Â¢$g$¤¸^ŠÏd!±#ħC±ä$:åÊ&aW:Ùµr -‚0ä @cß¿?¸žeù%IG¹ÆRô‚0Sn[ñiV!>ǹ:8Öz„A3ÿ3Žÿ—¹ÿ« häoÿ/sÿWÐÌÿŒãÿeÊ_ÐÈß8þ_æþ¿. –¿Û8þ_¦ýëù¹ÿ—Ãc3ýt„,ùgLÃq6›cèWÿh„ ¯ÿ8”ÝZÿqÛøü/…÷ÍõŸ#Ù ¹eŸ¹ ¤=œˆKùkårW‰ «WrÙ(wî¬<édai¾@GQ72Nbúhíœ(£&=É MšÓ¯UÓ«Ô'V%\ }d½¬šY•8RËS¹»•{½ª@ÙBBÉZ!*,=–¹òµœkÝ«@Ù"½b >» ªü´(Uáã’\xšV=p”Gô?À!32;h.£Ã$‹ákšÓíÅZÑÑ4·¶Ímïðúæ”ÇÚÒVãÈ9ÎÅ1šeð¹Ô`šÓ•b´½ FÛKdt>£þ)È’Êã“Ý |r > óL¨àémM…Òå£4£Ã¸åCËø;G³ ’ªÈ±c’óÐBp€Ž±¦Ù+f¤Î2t•å£xå¶À ŒY%Ë”Å1gI 85ËnUˆ.ÄTßúP#õ½%« ªÛJK¨²|ßÊhYá*—™æCž±²Ôº‘= Âà¿¶I 2LÎQ¹¦Ú{Ò´ãao#àïòˆ^Dµ<Ï–L°'÷A©¹Gâ%RU¤ËÄšSºÌŽžM¾¯·’\¨W¸€õ1!ïÐBù¥?GgÈ©ŠÐŠzW2© ‰x»J`iQÉmM1Nd !rI+•pÌvq·G^…ÌÂWÖ O~ „/s”Ï3u ¯ÒD^§?R¿wy\ÿdÑ'À @Œ$Ÿ’–;Cñ`)Á1ððg)2òMUÒ úó°I¦0Ó)$Wš”̱ZgÁ.‡m˜¢ñÄo2ÓÔ9•3Œ®²–€1ðø$rÃnŸåêj}jn£ò=lÕ$´h5.M¯ƒ¼ÂÃ1qŒO[Çèç×B f­T±ô&\êª; õvÑ"™—‹êškqvæI¦Dé¸Hx”‚ØþQƒ¦|…@sþÓ8ñÿÍøïº€FþƉÿoÆÿÓ4ò7Nü3þ·. –¿Ý8ñÿÍøÏº€Æþÿß”¿. ‘¿aâÿ›ñŸõÍøo˜øÿfüw}@#ãÄÿ7ãêšñß8ñÿMùëûóøÿfüO}AcÿƉÿlÊ_ÐØ¿qâÿšñuý'þ·)]@cÿƉÿlîÿèjù{ŒÿÙ´]@#ÿ1ÿlîÿê ùgÿßÜÿÕ4ò7Îþ¿¹ÿ« häoœýsÿOPËßa˜ýsÿGÐØ¿aöÿÍý_}@cÿÆÙÿ5÷týÇÿÔ¿. ±ãìÿ›û?º€Æþ³ÿoÊ_ÐÈß8û¿æú¯. ÿãÿaÊ_ÐÈ,÷ÿÉýN»|ÿ£Û\ÿײäŸ> Ф.ª\´(£‹á»òê`t4,ÀÎÿ£|Ù£Jþ(ÉmÞÿ¨ LžÔí«m ñXk¯³Y&On >·ÝB¼”¨›À^gÕè‹FevG£ý¹A_o °Ûl®Ts6®UMøX:hADi½ŒÄÂFÐŽ¾vÓa(¢HÙ¸.ßÌǸÃ…›ù¥ÀáÂN(‡e¶q¡>‚ÏS‹‘†¸<>Ý-ð,¶X[y©• J¸qÂ_BpÀ’L$§¨-«¥X´ƒ–ŽqK„†,Ö6.ÈãVçArKœÝå´ Ð#ÐäÚ,¯¯KÆÌ6TÉÂP"GɇiDc©ï‹…€P, 67°6µ¥ž(ôDcL¥ØQJ‚±È —¦’(9Ä@ŠŒ˜J´¡Ä°€¹’Lq¡ˆ!•à@ ÆÒE<ÀÚ„!†eéd…ÈhS‘dkmË&ƒBèÚ´dPˆŒ6"ëƇºíÍã͇úêUás ”>m1¤&ÖªF<¨i¸T„> …Í…lª¢õ–VUt¢ÞÒÙÔ9Q³´¶Y'j„N×D}§U´:Yt¦œˆˆ †á.DT‘àB$Àl\ˆáPK‚ 5 U"=´2j|ˆL&>D “…õ“Qás£BA§¥T ¢˜S)’‘Æ«Út#<|v›nD ¯mÓúË«ÛD}àU-x¼ÈÒâ`*ÕŠ©eލˆe·éA¤Ä´mzPbª6=¨Í5>Ä ‘dE|GìdrÝÊB # HX:ˆÃŸ@ÅÊÑ ƒÞ”p±8Â&Ɖÿ 0\h€ç$ò Äü ¥‡¨dñ8ÂM…ëlo+à JAãHÄA”’ À @V„©: c‚fÙTBjhÓŽbddS 4¨Ð8Œób- RÐÚËD XÛÃ#ë}ËÈóJ4¾ú6wf3φ då©;²Ãh@ Òùsj»,³8 ”ÈÙ¶:;’>& éçKÏÛx2?gÓ™™yñužOÞM `d‘X’¯»("Aô |Ç/Azf–¡×Íb ò¼ªÅâ« # ;Tò#T(—€)E0UÍÆ™ÒâúÿcïY`#«®k­âWRµ…”R¸Ýâ »3ï¾ÿ[Ì‚w½»8ìÇØ†eëq6c¿gÏìÎ̛̌wm7JRJÚ  5 jÔ”DiÓŠR¡4I[Aš”„(JZµ „úBŠË¿(”´çÜûþžçÇ4yW»žw?ïþÎ÷ž{ß=¤º˜-Ø£±›éÉÒéL:e¨FS"¯ºz‚•¢Aä§Ä^]Dä?Mâ/ñ x‹doEç&m­`W¡V§·€6ææaøÐ„<‚„Ц1Áf%Lk¥¸R`TØôU§Vã¯ÒF¯j ›U•/&ROãÝ_¯P)gѳ'R4°‹ŠsÊÞšsÎ:Òy8=\ç"XHØ`HöLÞªE[uo«GWJ “+¨{mHµòÙe§”-T£é€œãœâîb ùò˜EÐÃ*DH—ËæÏuÌËUx,\¯m-oZ†áõf…JNÙ-â±EøîišñÕ2Þ&UÙNòä$a±ª0’æ!lKŸ Gòá@‰€~ãÞnÅÒÜ×)Y®!N,3µtdd$ è6ã¤ÔIŠ0c£™Ñ„Á˜ÝbNOWytt§›~2–žÙÁ3°!I€pÐÊ€e02cMC|*Åq#¥zÝZ÷ iU²gðav«»¿ ¤YpõqxXõskŽ'2»ùKH»9xÌñÌ2GŬu’`"ÌË Í&f…¢¼|àÍ$O½ aÕpð,8Ö…ô(’Š?¿l^FFÂ\Að^gsèOẇ&Îj¹’/²ÀVA{î¿æþ®Vó·Ød ÿBE P,; ðè7)”×à :ƒ4ÉrD>² Sõr¤ÐbÁ©ÚHçQpÚ…B¾\µO`ÎAº²ž¸Êj8É ç³0g«Üx ð—3ad•¬‘Z%[ªâº_J¡ÎuÚRøš`¶²Xd{D;Z²8‘± fa:õ‘ð7 Ù5»Âˆ·jH™ƒYgI.#ÄЩl²‹X \ˆz¼É ž¸Ø5qŸ`1š2à(ሎ~d^uÔ0鯘y$Å;VO³«üÑ›[ÐèW*Ñ$a$Z—_€’êÊñ[,:®…‘lÁÉZ •C\ÙSÀH=6·î7Ä?ãYa¶Í‹ÀË)¹c ú‡J&TH=>˜Ü‚U†}ŵæ,,„gŵ‚s&’äWèej‘D^Å2$â0ƒ&}ZôËŠžê‹Oñá1wÕï*E3¸¬`¹ØH³ñ8¢@ñ±˜¯á-gðlÖgçŒ lÊ[óR9ƒQ=YÌ‚Œ®®TlR¶–P9ÃËCAù/‚ÂåàÔÌ.¶æ/WØ-uÄ©åðÎÏèSùj …nEH{oŸL›I­uRGSSÀýìtH $?Vj¾Æïv犱±+˜÷+ö칂T³K6^Â85CÙ§ƒSèûéü"ªIÞŠ–´M"ëuê7!ÔÜå‹ß»Ñ±± ‘JdtŽÿz‹Û³§I1e@2nÚ ]¥îsÔ¤á¿À„Ž‚íÞ©·›L9`\K.1¸Í×™¦A<޾ÔS¢^cÀì8{óu÷s‘A;5V,%Šú™@1…„W,Æ ÛGŽSÞ=†aÁR«a‘ª)ûëÓ}ƒfƒ¨)doŠjÄ6Ï’¤”að$ö'Hçya•É{\Øú"?qA$ s$= «c2G¨¤ª“ bjd;½: æ9ÂdOç>ÇÆHzfeݰž¾qz’ÿÝfɰö0BÖs ˆ9_:aäR¹Z±°ƒìÙƒµø¯Ê—N éñ#G<³9ÒÐM‘¦)<ùÝ©—$c.ä0fú1,Ä¢Nãnô®©ÔŠ@€eCÞ€^ [@°àOç:Ç4Jví!åˆ-ha\š¦Ãˆt˜+1¥È&ñ%¾?±¦L4É!¦C]:Ñ[J"Î2ÈQž)Á!SRøÄð3[Ì.ï ,0ÛëšJT3Ä/¶`JDS›bSjv‡·9X´`UY6aºá tÃþÙb¹Ü3КÊÝa¸³…VYˆ¹3„1ÝaÉ ÖB@4“BÝ7Õ%@W¨£¡ €Ùì…¨CľuRäé’–¡ù€–A(ª*ÈÀh‘Í, ¾¯äª%BTÔ'*{Ò¹nµævÉU‰Èk\ JÀî%±sbµÒÖ’Õ@\Ž\ù8ÔÜ.AK=㥤êþjER™*$'ÕUÆLõþ2SÖ¼ÑwÍ€¼LbÐ.¦¿“Ê7…€kº<àçð÷lÝÆW\à _¯ãI?Ù=ÈA±&!xwÿÑɽïÿïÂÖέNÎäµ>ÿAáçÿY¥šJñü—ˆçÿ’ó_ý–ai6ULº´@Q6-EÖEÙ2TeI1%Ez»û—„þ†­Ñ?¨¾´± ý+ðoÃùOEMèaûÔÄ]4% Û¿yö®ûÎÂIal,íz`í„L§ä xê)}qeÔˆõèv¶(¬þÉ3×;O‹ç=òü±—s—>sÿ¾µûƒï?{»öÈ;¿:9G^|íû_»fúžÏ|I¼çK£ç8ïš?xðè­çœU>{ëëxý…÷ýãw?ñøM«ÜpÑ‹¿zÙ§~÷Ýï<ç²9ýä_)ÿtåÇ.Üùêü3/ÿö±»ûö/¼ñCzÇËÿÀºá¼«o¿’lû›KÞ¼áÇ¥çž.Üü¹“?yõùëBõÉ7— Ç.›ûò ï_Ô^¸ù_ùÎ?ýÄOžûð/}øïgï;gï;îùÑá×Íß¼ðá?xê­;¾W5¾òóÅõÒ/=¹óüO½üà®ÑÏ¿ûo_ëwÿß¿»ò¬¸ýð}ôÐ‡ïøˆzjáÕ#y䂯W¯yï…»NÞûÐWˆo} 6V~í쯜»Mß!ݹí¿Þ\½à’ÉW/¾hûõÏ>§óÂì3ÿO|ùêüç%{οçñ‹/¼û]Çï;~óGŸ¼ô¿·÷œÔú3_xך|ê¥ÕÊüûÿù©O?ðÕÿ9û[ŸüîUÿâï¿lüÆ¥çàÙÉ­›n»ê;«ìÜ6¶öâöï}ýäçþðÚ·^™¹äkWþ²|õÁWôÿÎÝ?–yàÂçŽôšñ»¾pî+×ëË÷g>vûMßúêÚmç=ñk÷þö•Û¤{ŸØÿïŸyôw}óûʇf.øèŸìgGSwÜýØCú¹ËýèSÏÚçž8qð/üÜê›gw<ù«^EÏ5(‹ç‰‰êw».û]'¬ï„u¾JÒ×ç­*™cC›æ žçÂæB¯Ò訡H¶–-8Ë^r¬)=6Kþˆ„ôѩÄîÙã4cÙÀ×B%jÌž®Ã¼xw‹<=oÝ8=¹ù®„žÁ‚8s®¡ƒÙ9ü^°lÚ I—Ð"Ë ~ÆfÝheÝ´´õlHÖØhË -{±©ÍgÓ~HA?¦uÌé.È¡\C0¢¹F¹7[µqƒ=D>*L ZÆ$¼jhÃZY´+£ûg¦ÈÁœS­qfÄHQÁŽðçÒàÕèÄnI¤ a%‚j'kرše¹§ÿGã‡ÿ3-OÿgvÀ«ã+x{4ÿÈðOvàÙÏZÁ=¸ÃŸÅÕŠ½$ˆ„*BðýÑTUVÉñÒ `ÎrJ^¨ fiC}rûi5w­Í¬—x ÆO;ÆÊðå’C\89AæFy¨~èó·½ôÉ?+}ú¥Eù[wîØ˜2/0‰­Ôp¥•¬ÚæCìûßá¹ÿ5ùþo !¶þžû_“ûÿ¢ð7†çþׄþbðžû_úHˆÁxîMîÿHˆÁxîMîÿHˆÁhîMîLˆÁxîÿLîÿHˆÂ_žûø$Äà?<÷¿&÷ÿ $ÄøÿðÜÿšÀ !FÿÃsÿkrÿß@BŒþ‡çþ×þ 1øÏý¯‰ýw !Æÿ‡çþ×þ 1øÿ×Äþ?ãÿóÿŸÀ !FÿóÿŸìÿ $DáoÏþBÿ 1øÏþBÿ 1øÏþ²ÿ;ƒÿÛ¹ÿï~ÿ©&öŸ† ð}¤qÂÊóø½é´ p‹ïÿd†ýè?'J-&ßÿ "drke»S°l×êM`¿^2U›]¨‚E2'2» þ`1üÅ‚©9Q2m/Ù¼Ês]Ȱ»eë­1k=Ãn>¯‡ïù9Á+¼¶esëëº0›³ &ü>uŲ«$gðÂÉÅBÖ½©±œ­TÙ-¾ð±²µ,Yª8ERƒ7¡Þ•ûV†U²;eÂç¤/ª³ZŽØgfxA§‚Cœ€ŠÖëšÙå§gvaNfËKA¨gj5’y¯Û-²mlÛr!¿ÊmÛ³m5+Á»å?˜¹¼¾>“Í캮  ’6y#:K|v:|Ù›âŠUÙX‡ Lº¯[vÙ¨•×øÕˆl¢[kw†]´Q_Ê/¯Tìõ¹ëæ7eÑÆk4Yììiûtѱl!ãv“Õ_¬Î± 9®–%µ\›¯[*0+³>ñO•¡>è`P9Fܶa³¹|Õí8^ƒQ%g •Ã*àI½°F`H€š^Ì›¹¾Ë±¥C¢ŠÁ†¤§­Å¦$ú»Õ¸2Õ•—NßW߇˜kW×½>ísŠåìbm²fó·`á<<“I×kåP¾Z[ÏT‹ÙBµ“¦¦*Îé<hÕ)Í®”XG£$Š4ÉÈÔq–ÑiЏµÂà#-†ü áy©OØ5ü¶Ê"6ÿh‡˜‹¸ÓŠuA6Ç¿³Û=Ÿ×‘cví»€Ü%“«ØKõ" ®æì.@Þ–u-“[)þa-ŒcÙN•ìÚ:ã›–^EØœºíoìÌMüÁÝóbŠnR?9Ü=_†Ê1B,WÐ#H¯Øµòxß÷ ÞÄŸ/±ÙÍ9e$ºläkä Þ¨¿`ãí³K+…J’c“³×½q–Œ9NŽOO™=~”„i‚\û´ÍëÉË…[±I!tY…6ðrý É’½3Üw—•"3¶Íº³Ï)¯!>…ÑÎb½fÙG¿‚˜š ¦„áô^pëc4cWŠÕT§ò?¦ÿ½ç?¹þ§&ë¿A† ð‰ >'Õ±O¤;w×Rÿ§¢,‡ý¿!ü%ª)4Ñÿ†Ëÿ›ŽWœéfâÿ-ñÿ–øKü¿%þßÿo‰ÿ·Äÿ[âÿ-ñÿ–øKü¿%þßÿo‰ÿ·Äÿ[âÿí§Øÿ[`jÏÿ›f*D‡%ûψ8‘¨º¯Z 'Œú< júQ1éÀ \÷Mµt§ê]‡0›3šœ·îéÇ÷8 þ%ºq&ÒØ‡WÀŠ)]1·ê¤Í¼—¤ÀQ‹Ê¢¾»ˆ*~”¢-½ÂD»ÒÛæ:uÖfêŒÎ=ðWkVÞq´1èÐ×k®{”T ÉHèšfÀ/:©óý¿h8•:¡ºÄIu˜<™öÕ o#ðOƒð’ða®ÔÜ#dßêo׌ÜOÂ’á Mñ}Ê€{õÜ•aT ¢XXkí±5aõ¦¹ ½š*‡ ‹:jBY=!¯ÆÀÛy‰F„¼°K¦T‡ÎÿTBÏTÓ È &S!]¡RÊÈO£ºŸAk'©&û•¡QMUûJ~¼ ß ƒª™å6gÖ}«¿}÷j}%?àôÝäQŸ °V¸§j‡üzÑ\Çä¸IÕù¡ñ"F~rJÖâJJä×­c³¸tS(De /LÖy…ÉO’d˜P“H&UÔ„)¤ZŸÉ Û0ô7ÅûèQ¹+òê¨þvÉKí¯Úh„½ûiaï~ZØ»:ÃlÏ`3…±»†:Vµ‹A»R)97_FJìOOH©1 ¶HJÁ’Iu¢è:m£Tb”vj"° ÊøÂ…ú®#Ò g3Pà Ò­z¸µªÛ¥Æî{D;*ð²¼TM/qY4XÕ²Âm­§›QPošëŽT™FVÜË^ØSm°[ŽT¤q¢†‰#àÇL‰ibˆŠ‰ÉwÊx6J`)¤-¢v(«<dq%ð ‰4ª!Ç’Q/7ØáM´E<ž Ài@#ÕaL jŸ¡|ř”‰AÅ@m5 džUt…+¢¯xA¢ýõÊÛðí|‚d¹-¼?÷­þvI^;ûÕ(;¦#qàÙ‘nœs·r„Óo¿î@<Ñ ),êIPŒjÁz kíYwúÙ\+Ï¿H+³ç¸ïß\O=ÿv‡ôÞÊr´x¨"ð cV˜TÅ)4ú+°gáá%¯ L¾ËWªRvƪ ©ÝYýmu¤!ËhÕöl¸xÇd,¦-{!~Fy`DìÂ/…sçcf°$G×\íY‘úÕT Œ”AaøwÄø¾Êm`uïÆŠÔµ•‡Á¢Ҹ jhN‚ž©a3¬kT[¡uT TYòÀUôß­¢ÐFBbB<ÈWAأ¿:W0”™‰ª ü+\!Áá¨xÈ¡úñà²c• ]4‡Ë’„î¶}½ƒG£?}]cÃ<™¾å‘ÊP ÖÆ-4ßþTÞ6›‘ClFzq¹“«³¼ Énò)Ä ˜;wÎpD÷uw|?€’j{6³~5Õ#SÂh±Ó×ÇÙlŸ¯#VÔ­EÛ4£œˆºœHq"#ĉ`i£È.R8§ Ù‡1]crŽ¢è1Nƒõ«h­3§AYXì‚ÀC€ãÏSP Ë}e%¬ ¥‰(£øÖ3–× +é¤òvY 5"KAQRùöDÇÌd!m-„ÝNÚ¥Z¾¶6È¥‡±J©fØìÀ¢ÿe…Û´rô³¹VK]nxv€ÏkGKÆ, FIÉ]1À£,>Œ€ƒÈ<Š[_ìWÕúnDàm6=7é/´.Öß¶¡W»“ÞZÙÓ]˜­]ÍSÆÌìEJ°ý_EáÖúøÔ×ÙÞœÖ_Pñ6ü©ä{ÊþTòÝÁn@Õaý[U·;YqPö¸ʳ*‹T¢,¥¨$Êw¤>kÙ¬àp€Â›Œì4™]ª£úÛUc¾Ö#k¼¢[’5+“Âцä߸+½m®S!‹$b4ø¸¯nÛ¢µ·ëƒ)ShüYNçØ Lý• ™Ý;Á˜BÈ(ƒ7®Èxr)ÇPØŽlôù2k#8üʰ ´S(±u³ÓQýí2)¼•ƒ ôÿØ»ò¸š¶·Ÿ„ I%TRÔÙçì3l2Ün"•B“’¦s4ŸÒDt I¦+*Ó EiRáJe !CÒl.ã¥t…x÷Z»ÎÙñ»ná¾÷»?ŸÚ­³Ok}žý|׳žçû<‹Š[.(ƒËAjȦ/&û_Ã8Ü¿Ï 4tÞh—®Ò(°Ù¥« IŽ–1ÉMA A$à ¸•Ae~z&d‚‹¤Wî[0å°þ"ü#$¿š‡T‘xI\]NШ  7ÀWÌÇ üã²è°¨Ä ˜ÝR³K¯ÔùŒ.P¼ŠÔ7ë¿Ç¸A'‡€A¼aÁ”&D˜cÈFÈ%Yƒ9Üà€ ftÝd—u†Ñ`³Ë:M~¾™öc_Ù1C4à ºšÀ•¥~A&äÑ+À tüPx–C¨õUXâ8•NéfZ@.îÉŒ ÖL>P™Lhrgø¿3I9ÀÜÀ¡Âþ7\·°È×;†~Î ÿ: ŸP*ÿ*„ÿ÷’Hµb ƒ1h¼™>DT&Ÿ@²›€ý÷‚dÓ|Ÿ`¯ÃÍ?!1d³ï!È%Ä Þ+Àýrß:ï©ëûC°ÙõýuÞ)Ñ)ä¦ ü7‘ ÷#È:¤ *üoXøÂÏPá(䬕nÿ&’ÅUXþ·±4 `V øË ¦†ÏÞòYâõpP1€<ü¬¬Î'¢‹H€Ñ¡N ŽößcD`vã¥Ñ`t‰A¡ÁÀ€Àˆ€²™t"¸q¹¡\oP²õ_b™tÞ)L†v «&J¢“Ñþ6Š÷7–‰H†Ð2AÁJûÞ2! E :Êw¿(èÿ‚áíaIòT”ÑmiüŸø!x€¤@$@æ¼²@dƒšüà ‡üÍ»Žap©tŠƒ\‘"‡pÙÜü€7 œVøJ¤{‹—ÌÆà=`ð¢ñ'"xU˜È¡€ý÷…°n(¸Æ Ÿ—¹Ç£G!* …¼¹`ý$RV›0DÜ'o¹B4yËâîy Ð­)‰b81ˆùãßbO$½ò¸BŒù[…fÀ”ÇG¡C¡(½;êÐ:QÕ¡ Ô!¡ XA.Cp5D¡“P×1ŒI üï!”dQˆ×i¨D%E€O ¤á(‚¿¤ü‚³xQ‰Çä¡1$5@S˜P«€ý÷˜³tC%&ÁyÆ0X3G˜èFvô.u ñðbÿ[ܼ]·ÉC 6y(AÜ<%˜ä¦@ $Šá%@Wÿ>;°K"½À$†ÖÝî¡üosI@¢ úÖ B;‰ú€„BxDQŠ ¸fƒ8thÁ3˜. Ѻ0 0î Áh$@¢©#ø‡Fpf³[B€x ŒAç1$0ÀÃ(L…ûï=]XØ4´o¼ý6À B*IuŒìì§«c| À¬„ÛÆbRÔI<‰ÅKŸ€Ã ì}ç=ž2Ðn>~PRâq¹Ó„p°y²ñRZ¸·hóI…ñð·Ø…ßàNù.®®ç¹Ü1rS ¿(†ØÃwOýÞGlØ»4ï%a {4¡éè‚Î Ò¬@ï>+°:ÍTV§™Ê$›© ¨F˜©0Ù”B$ŠÏ®’(<£ÐõRÒÄëÔcð³µ0bHžÕšB%ƒ ÖÏIJ¢ªjBpø”Ê€< &•E {›ÂèK…AzWU&ÿ:p<Ñ™¬oªŠˆ7FLŒÁã Àª|@'ª~#°ÿÞËRX:<”%ÆC+p@•&!SH‡gðõŽ"Ð/+—c¤ëø308Sˆ¼Rz(¥uÒä&OÐåÅ+kŠÁ1ytvæwtvTY Øïe-4”6¥»ââ r@î)Àxé e"p?$DpA¶- €QùJ°VðÚÁ£¯ÉGŒÁÞ#ݨ›ÄUa¬>ûï9)LdŠ ¸MLþ‚I,£@õ0Ã`9OéT<Üt>&PóêŪx4ŽÕ¥0툗[ [‘š‚(ž`ý÷^VÂ+$¢ñ=P4b úXDhÌšBA$C`XCÅ£ƒ›ð¡ Ô ý¢ůxÔîŠðƒ?‘°Š×ëþ{Ϊ•âA‚ŸÁCǵ”Ä* ñWBÀ¬¥CįÓP˜0&^ÅcÂY·›bðg$¨6›ì¿çô‘q‘º¨<”D 7Ìh ñ(JÊ}+0üp¦«eï²T}Àøf?šä̤A¦0Ë úï93@TЧ,R儈% œ†Òĉ€cðW¹ðÁ&U¡raG þ{ÈI·*:T`î:/<£0îÇ·.@%d…°ˆ™YÌËqømñ³Ã»2 yß% R³°ÿžGD'+P ãË Q‡»:P¨°/Bâ[‚Œzd2SLq™(UÜ– >]xŽÈß%>5Âʪ×ý÷¼øŸè–Û,uÉhgªƒrªø?à/BA‘B¹PPÀ¢À€ƒÔvGHÕ7à¶ ¢+°((tb-NVJ`]e7„¨ªOsI˜:Î7Ž@e ² `­¡ÖÚ‚õß{A ]6 JšoñãÓ$ 6ƒV “lî#긂«¤1{Eìw~ X·NŸ„*°"Hç=/':cƒ¢NòÙ×#éD zw ž¨Ü |Ñ(¡obL¢ÔË_M>L¡S þ{ßÙä‚5üYVÏ~d´¡˜I"Í $öP¡AÚÒ²êA8‘•,åÐø!S@a¢³ˆq&öæàLj¸'ð„ü¾¤VA§QÉ›sˆ{ï,£D.9„ö¦Máö¾¨ÿÞËRhÊ<”%ÏU €&( Îÿ\åw~—J#UUå÷^÷ß{Y]²VdòP‚TðÆew @aßn)îX3i$Æ #°·;  íJP¢Lƒ¼X ºYÅ£aB¯/†‚v¡ ÐY-LŒF þÿVÖ[Ëví,Ë»Bìøiäæ öN%6~%ö Åü—ÁkÁàE¼'Yþÿΰ2••øïèåÁð0{Ÿ.3„ôIô/Š{–·‡Ÿ?›ÞÛ1(ø?/àŒ0éØFˆ6q  ¡áÊCÇWáøëT„N¥K¨SÄqÃß¡Á!nAêêž‹Ãø>NPð?ñþÙƒIgâhKÁÜ8î(Ýë9ó 2X7š‡Æüÿþ|ÿâ=z­ÿìŽãÇúà }ê?FAQ: è?ƒŠþ§ÿÿÄ¡mmb:1 Éj—¾Úš,KW§¨¸ûÈZû¤ƒ}Þæšzû…p‚Ô MÁ³b‚[ lÎÔ©`®ç¸ùË.Û›çh0öäЗöϽF¿jé8Ñ_ZAê²[MðÀÈ‹Ù5‰Êçê<•>¶=j³ý½Î¿m¶¿·R4›±À2ÖÖeÊ•¤÷Oo4þòökñ’¶]­_Š '¿o^õåhn»Õdß÷HáËȺɷ?©-µzÞqvð׬_Zښؿh=aùn˜tKú×11íç }§9”ÿyØRwm{ýâñíKKï ˜ªVtÝ£ýóÊ@惼¯çT¹Å×Ó>…áÒV$ÊTßý\íøªhä©U^ImM­úëoòxÙgØçeŸM{ýådûÓ÷˜“î8æ¶.V«ð[ûÔ`½»ñýs\×\_Ã{úõJ.äÜÉÏ{¼'fÔ3SΟþúK/Õn«Úàœ£½Çp~’ßKU‰ïÙÍ9ÕuŒ¾Š.²;Õ"2Ç}4`xWåG5Þ0öºòs£Àî'ý÷îßH‹ ó>ëàÚ~ÜîÂû³Å:^¸ôÝ5éMÍeÖåÕ+ío­¬7y·$&ô~ç¨ú„=ù²Üw©¾RÏ<êÒGΑnW¸+ÿ¨­fsy¥†±´Ý'æ^y†›µ=t_1•ߺ×\™¤¸Ä皣ÜB+ö,jý›>9»ó7:dêÛ£,y{¥¡æ}ã¼áK2Xa>ù›—5¥¾4Ù;*½Bè׈ïŽcµÂÃóú¯[]R»çt‰I²œiþ”‚7Ý:ÓÇSÞÖõ‹™ya_JÐ ‡eÕ+GÙ¸ÊPRÈMK °¾²ÃþpîÁð#rR7Öû¸È%xjrÞå òJËÞë=pÈIÉW$…Q“”’å«ÏjròKWLÑH¶,|:<Ò]#Qúnà=·ÓÆ9…![6$/-.c^ôÖ¡Òû”ÄeÌy`%×ÞxÍ*‰¹»XÞÒ^í¡måMsÓ(…3 Òúû£½\7ÇXkfÛšÙæþ b€„|ì¸À;áÇçù†[ì£N[_>ß{ZƒÛŽÜ~¯½¢8Fç¯T<\÷ÜÆ»ïemÉ/%U~«dd|Çý÷;)•}îÊTl0þ<ô•ßÇCKsû]§K\t¨•°.-št¡£ŸÏÞ?Æp_DhIWå í8TYüNn†gć•Ú»?}¶õïÓw—×1î4׌"V_Í=ÃǬn=ª8“£S˜`<3?W¯£ÿ¡ÔqýŽ¿çå²Ñßÿƒäð~»Ùi¿þ²×Ñðq §¼1<5!ùÓÉWêMeÚL-¯t®¼»{e”«†wv”Iÿصƒ÷GUWÌ*QJuU­øõhÓãЃÞëuæÏG÷—¡º^O¸&‘%óENQÜÀˆY>Žg®½ä< °%k¢¡×ÏJôÓ“n:E…mpmÑ•4Pðÿ©ðh|H˳YJº²#£_ŽáRìúYRuŠ“{^y‡NËDyômGÔh‰‰K*ëèí.ÇRö¦nžtb'Zx}ÀoÊåw¥Ž•pÌ–D—¥Éë,»(§µq°ÔÔÐH«¦m2áýµn¨)¶ë§ÐÔÇØDBÙ@úýè 9ëùü: ƒZ™T•‘/ÍŽ¸?›pe`Mìæ»!F¥W?hÇŒ]Ÿ«5bTl=¸Q;pä‘ãÏê°´=_GÏ35\]Ñ~?JIe¿¦×Ÿg¯³-‘sõó¤"3Ï}Ìî¸×p ²vaòí7q‡ëGÍÏ£«ÇßšãzìQN•ͱ”ƒqÚΧ§^Œý =ÙüóU£)F–ï|üDÓåv"É1¾´ÐìëÕ…ŒgË“µª¶´'6<Žm`M›§ê©´±ÜìP¿»ÃlÎÏ}pï鬸Nj6 ÷8·*î¾7åÒtJØ×Ýãg»üzJ¹Hs“®ßgUã¶Ã4=†»¹S^o{úöHý_³çNÝœm,o9§Áÿ`äê’YοޱQŸ‘•;ziÉXççÁIuu ¬ÏfŸ_äiœ}&ÄY±ˆ|äB•´ßª½NG~»÷é„1’]›[iüîá+£d©õ!ãN$J-©±žÒw€âþåsœÈç_*2Þg{«}ÏÍú­jŠUFVy‘ &"ÙY~V‘5‹NéÉ„ö^»çqfÅêÅEó·lxR3ôÒt³™‡y¦¡»|¸®<£Ž«Ç±½ciVqŠnyrÌ›ÁîO4VúeªqgÍ4kzþGTüÎ5i7è£ïM§™åq{‘nëã‹9Ÿõ´¥Ì?NRŽ™•o´h߆;n+¦ëÔj|nÅÂbg=š{¡%ÛzÛ-mŸ„GeÕqG¬ÍûÙ'×Öü¦}Že•7<“£<ÉWÛFZ–”½LÕųeöé9[Øs¿¬|j¢Še$ÙÇO]¸=$CgsíÜU®ÇNÚR²Ë=½`]í…cE¡~#“K†Onлh3wÖ•Ë)Ï4¥[Ú”];fʬëXMÏ<ãÂYiœÞü‡jðâµ¥RIí¾.«ç¼SÈÔœýâê„XÛyVeŽq)–7¶'ü|wŽbÒ sήے>LöÄäÒ‡Ozy+‚>½uÕ±âbÍCm¨öé?&üÍÐx©ñ»¸—uÖ%Ü75y±±Ï‹¥ŽUõÆy¨ÒB-ݦ7-aT¥,©]6ùÚìÃLJª:ï^/£[±uÓëE»·l-{Tú$blàͼ· f4r¥† «[wkLÅòÚa»vý”9×mÇcÐC=ކ§YüÂD§UóX}ú:e,ª<ùÔB)¶xÓ í—¢|fÚ…žlZfØçt‘Ì”sÇDûDûý’b’‡Œ(c=~4å æÆˆuqm”j£;åõl7$.=†¢”Ñ¿åsìÖ!qCËã­å.}=V9‘¥ýdB æiåŠ?GÑŒRÏ þ#`jÛÊšóŸe.rÝjW¹0{Ai¹Ê…БWϼ]¢ýøCÙh¥ˆ&ºþjNq»\hV䥪Ëf´ÇQ2Xöу2˜Ý6zÀ¶ó•O›×X( ‘ºRY;ÖE+n”ìÛO»M–wDM§,;Û;f¦´çÄËáZeÕ ¶í¾Gµ©Îýh~é1Ù­6†Ûlg—-oQ9V-}øg»†5­;.ûömÝŸ½+«ÐÂfDtöÀ”aãž°}.á˜_?AÛ¹ÁWÉK‹>½¢Afçôqƒž[·êÿT¡•ßÜì–ËÛ#9›M3-BßN,×U°~ËLÊ›V-·¯Õ&唲ih¼Ÿ[èí§û}¨\/¨;4?Ízßê¤Ä H|sæˆOÅ!ù´Š\šVYÑÆGýÖçΫ>zfÒJçm÷—ï=­tušê¢Á‹šÏÈ„o¼ƒ:éÄÛëÄïªz즻4~œgTšÚÀ Zž¼£ë@¥mK†mÝÃxd—±@Zñ†]ˆý²òjîY]™™ëThØyV«ET™ËŸù*ÿøË tBÌòëz '¾n˹»ê|íaý65Ô²*Ýèôɇ¥××%Fs¨ø1š3dÂŽIÓæÓÛ¨aW祅©¨üþꦞgÜ,³K¿{;éºÉÛ<é (ä*ä]ËYa~¦@)~xFY™dÞ Î«V›Ü³u#¤ ŽŽ4L ?$»îÚ¡¡ÛJ¶Ç§GOP8©ÛfwHé¹ñuÇ/·öÖ«þr(WaÑÞ-ŸÏ”/MØä»^ïäméä´ðC*O*¶yUb_;ÛTëLõU‹„ˆK¿¤$—JÿgÅÖü$ÆÜ-yŠ2ý"Ú˜AÃ/FìÈÚ~Ì\ÂÜ9Ôqkš¹B¡Ê#ýa‹Œ^ï*Û<÷½1+iÉ5™Ò¸B¬ñ¥™^ö>û/†Š3gÑ®ÆéÒ—ííœÆH9ek™Æb—¦|Lœì²9yEÃnõ¹,åÉ.7çÇ9>Œ¾éÚ¾KKJÆÞT¿R ¾îÿØ» ɪêLH°œÄÄ*BR¹Zìî,0Óýþû-ëêìîìfp—]fœÝ¬oºßÌôÒÝoèŸÙÆ5T-©BL"Á1hÅH³¦Ä*!J I ”¨IÄ"IE °€ÄÉ9ç¾ÿî~Ý;ïÇÞr^íN÷»÷¾sνçþœ¯ß¹çVÞðÚõŸÿØ/=³óŽïµkÿ÷¾k¯œ~qzúï=vóW\½ð®ý/n¾áƒÏÖ¶]úG¿*|çêçñø ßtÿþäûOýOãöKË=1óÙñþþå¿þä–±·=ñÞ¯õÄ™g|^ý‡/¼t³ü_ßüü­Ï=õ+öá’wœ<ïµËLßøíÇÌGÿ`î»÷¿ç®÷¼ºgìòw¿ðí;~çæG÷êk_}ÓÖóÿlÿ-²11û ¢F¶ úƒ£0x ž D 2xd¼¾2…çžÐ BoÛ}SŽnœAbsõ•¦-ÎÜk†’„èîÛ?FO_Y"'[Š ‚ÛbpŸ©=ÙöÌÑO1rºUPA!O AŠî8‘;¾ûŠá›p§5Zµ¦½ELôÍÓÅ\1˜ëSìN£iâŸÿM³ºl¶*%ƒW Ó<Θ$ø¨{σ Qn—ÌÆèäÌA¶wÑj¶š¥Fe©ÅŠã‚•ØF î{ß èèîmbA(dQd©X ¿Uî•EZѲÕbËf£‰»çÅq‘ÝßfÌ%†[“¥müSÙ‡va åðVxt¢ÝZ„'ÒO釷²}F£ é‡*­ª9ºw«ÛŠ+ s>‡~Û9÷ š¦H ›gvš¤ÂrÁsêNš‚;µBi:„Óðt¢PZ¡€“`¸œÜQNҰׇøâž‡Žrj¡#­¨wÈ'Äz2žÒNÃHá4Yîà!ãvßpš&tÒ+ª²À0é(§à©£á4ÜfÞÑbG(¸EÙMkÙ/è)ÖBåZ0e%1ô#2SY~ª>o1n«æ§v³Ùѧ—ôw¾ùƒŸ6¾ð–ãW}qkgÊ‘½f0-ê4Š&7^õ'y…Þÿ)ùx`Ñ¥÷ûÿ½ÿW`\¨M:£ ˆš(žÁNÙÑ`=×Ïøû¿ þcXô¯mè?“+¤ÿ¹¡Ñ¿´¡ÿ,®Ðü¯‹þÅ ýgr…ÆiXô¯ÉúÏâ mXô/nè?“+4þËâMÙÐWhü‡Eÿâ†þ3¹Bãßýkê†þ³¸Bã_ý‹úÏä ÿùaÑ¿¦mè?‹+¨ux~ÿÛÀÿ™\!ýÏïø/“+¤ÿáùýgÃþÏä éxðÿ†ý—ÉÒÿðà¿ û/“+¤ÿŸ¦ýOûIÜXÿ3¼:ô_ªÍfi¢Ñ0VÑgpÑlTZG.4Œ¥Åqsi]-€ î¹ÿ[ 0èƒúA7ögqmzûÁ™±‰²5gމã…ܦM¶à6öŒtÜ OîÁ§¸ó÷ýè-èû·íõ¶ŒBg«—±üN«]/Wê ;­•mLRðŸ Q@?ÙeÕj¸1!‡asð ˜s°aU­…\~·ÕÚQtð, §S6çsN"­“Ë7ÍV{iŸÑªÔ¶–£#{ò“õ’…l¯4KPO qc`o',”[Èå¦fp N+PŒŸ[fcÙ¨²¥¶û=— ’È1Vn/Q$îüĤ{'ÀQj·L7EÄÓŠ*R»6_5WÜd’˳a6+M7±‰0$—½§HiS7A‚„V¥ZöŠh,¿«d–+ժᤠÆd@ Pn~²S ÈM†Å@ŒÉ€ˆ1¤ÕžêB„™ê u Г åŠp1è'ù«L4`‚¾§u·_05£^ž«ºÊP[#ð  µ5:¥“­f+Ã{ênd•A,ï„(…\Ì€ ˆ`vŠ @ƒ›a`j˜B?ÌW‚ô@ÌJz L¥ƒÔ³ §‡r©a-7$®:’ ¢Yž0hóV'OD±Âb'ÖØ’µDÿO°Ê¼Ymšî3'ؼÕ0ªU7ÁÚ³ÍlöUj7pkÉ€q¹ ¯R7QÄÜ *˜?T©™Í±i FóÕÍ—7Õ2ª•RÌVµ‘ÕãY×¾wÎØ¹jåš¶Q¢+ï`v/"»¬v´ß+½'s'¿+kf¥ªi4Z­M'Ø\…«$ç,wÎÖÁml©a•`=cdŠ-W®Å ¹|ɲå1Tߨ¼Q«TWY@$ü1ÚÕVŸRD‰ºj'M·Y³dTMÞ£QÌüT}y“öÔÕ„ñ'¢¥²0(F°ó Ì\)aç_fá‡x}û@OšºêxصG}¢\î LôºôÅïPj 2mÖ:¨¸'®£ú»ÓД ‰j5š IfÐ.¨=¨ª~­X`Cà{‰Ù#]P騦}¼“ëõaúÓŸ"dËOÒ»ð»èëægw$­W{ŠZ~cëâçÕ*‚Ÿàï—µ×Õ³ þ>°ÌÙÎNîL?‘ÝÜw^7š+"b´Hãj„Þ$ͯ·0ÛJ‹ =w†ìAWõëgÚƒ][¬Wu; *~LÕÁ^묵_ãžx‘õ—»Ë˜Ý¶ƒSÿƒs³ÌÿÂȤS¡2@ø§nøÊ)𴉚ŒÂSð+ c½ð?£” Úþâ{ýÍC°;ði÷Œ“ËO\v™ Öké9K¢ï‡"Š â,†N…ìÛ‚ÿ&Šëe4Æcµ2ûÏÔvm·ËÌã3•Z»Š}Ãr§dι“~ñÖ ×ñ†A¨?¹zºÛÌX,ÐÉà¾vÃÛ¬ÿéö± E&ú†Ü:ÌD&JBF"˜¾‰MîiMMîïÙäBÀ JÈŒcBÀ@JŒjÀdJÔ4„™PŠk2!` ­Ã,dBÀ¼IÄ(¤cì23Ñ(¢X†Ü Ý–Õ”ÌA¦w³uS²YÀ`Z‡!È–Ñz­@0‡Öo²€ý“ýÇ$!Aã zâ–ë6ô2·úÜ Å®‹û öPPmƒ‹ÿí<Þ¬(É­Ä®T%RÄ¡2ôDQ¥_¹œÜŠô«¬MêJ‡O¸¼“EQ&‡(£w“cV­ÿ¸Aª « 3©è®•EY Ü^&cjô»×­ÞV«'`)¼^iP‡ÉØõPWHÁÄ Ôb§%Láâ;ç)j’‡ ðư`<¨ŸUÄht©/`™rB¥N4L#ÔbßEyÜ?‹ú‹uØ‚Åú j/ÏPk„g]NѹX˜†($jˆP&¸†ßC6Ôø!1 lCtS@7D75|CÔc#¢ãÄQQÍç¿ ‘ñËë ¿ Ѳ‹‰wDˆé$ƒyR ¨É&‰{øD™4ò!ö‘âcÉÿ3~”€Š¢N§­aú ``$‰Åå—çÈhœû°L˜*‡Í‡§ÒÛ6nºØ§@[.üØæs× A¥íq°Ïºè'}dEÀ>ÝlÓá¶>»õeÙŒ$ÁÆî?-ßVÖÂE+N•ð¢Ç}‡ŸUÄP”ôþorö´k•]Vmɪ£?p&ÀÈ^ÚíÅ’Š–ÏФꔃá"j.Qc„‹¨Í’ÃED.." Ià""” .¢Æ÷p5þ@¸ELÝpÑM õظˆ¨ÄÄED#q\DT3ÄEÄ/C\Dü2ÄEÈ/C\„ìbâ"$‘.B:Éà"¤”.B²Iâ">Q&‹H£C…‹ädÞ ©žÑNTEþôÆE,",@ª$ÒöpÜóá"Eã–qϾ¢H½R¸¥¨ßÙ¨±ß 2ý$p‘†Bo\ÔÍ4jã³[WV|°H-à[ítukãâÛºÒTÝÃ*xã'X0,ŠÏ*b$ªBÿ÷E»+µÊ!ܱ–™ƒ›[4hh;Æ÷ÀȇZÄC>Ô^!UHô‘‹…|ˆBȇe‚|¨ñ=äC?òAÓ@>D7äCtSC>D=6ò!*1‘ÑHùÕ ‘ñËù¿ ‘òËù »˜ÈI$|N2È)¥€|l’ȇO”I#ÒèP!%>òȽÍ1ëé˜E‘Þ iJÙhø&Lq " OÙÐÛ))€<$yà+-˜$c ›õÑOÙàY²½‘MȺ û±[oT}àE#.ýtuvÓühºßMz i±ÝⳊlÚ©8»í©˜Õòðy»¨„èõA7ZÐßMØßMKÖßM‹íï¦%åï¦eæï¦ýÝôýÝ´”üÝ´”üÝ´TýÝ´DüÝ´üÝ´TüÝ´ŒýÝ´ŒýÝ´ŒýÝ´lýÝ´øþnZBþnZbþnZ:þnZÂþnZ*þnÚÐù»©±Ñ ôPÜQâ˜öx+H<¹ Ðgêè› $‚]%Ê^ÖG? ô›±¯¿šß¼v²[wÔ|ðF'G,A Êo„®øfì£ûÌ Š‚/V€`ã|¡ àÑÖ]$™E ×(¦ëZÿÈåFÆA ü½»ºÑƒ^k¼½‚7ÑÍ’¨K›Û¥MOÊ¥MÏÌ¥Mº´qÍ „}úi& \¤§ä獵êï¦'âï¦'à獵âï¦gìï¦gìï¦gìï¦gëï¦Ç÷wÓòwÓówÓÓñwÓöwÓSñwÓ‡ÎßM‹‹‹t˜]}o}tU #atÄ©2OQ ¼öñ*“©/d^üÀ5uì¤ã~#o*  Å:’;­“~Ø ZTŠ tàÚŸ™Z˜Ýz]ÑÊ@qÁ0†ÿô fÀ+àØg¢æó£;,3 A"좶ˆ 0Áw3nO:ÖO-žî)ùI:ógW8Þ/,UÙ‡d¨I L (j¢‘ ˆ^¼ÐD"‘ØD)›à¤d! ž¥L%>N#@N/B‘¢€ÈÄQ@D’R@d³ŒR@ ³ S@ ³ŒS€ ³ T€üâF*@‰„*@B Å*@Ri+@º‰F+àófÒ0…ëu¨pJ1>NèA×@—èÜD²ÛeøÄý7’·/GWe:S(è|㎠ •í2‚¬ÐÖ2œpoŽ€vê@DÔ£@º')È”Ȭ~"@Fåéj{fg]vë’ºĈ:z^ ²ªž¦ †WÀ±Ø°ªpjå¢ =®£Z2ì¢ I<ìv;úÕ?µà¡eÃs˜ìs¨Q|0‡m0˜CM“ Ì!zñ`‘Hæ¥l`©ÀsHƒÁ”2˜C„Ó€9D8=˜CäãÃ"æ‘äa‘ÍæÃ,a1Ìæ Ã,aò‹ sF"0 %sT0é& sø¼™8Ì!½ÌÑãÃÕ–ÞÎÈÆ_@áS ÂÄ0"NPº·‰ðe÷ÃQå`Cë¼È\Ã,Ý÷5EGóÃ/všŽûl@ô8ïkÖE?˜#ªZŸ >ët8ìÏ®¶àGBrQ¦t´Ó ñ 8FÖÃw¾„&X6&J„]”­)ëb_$4Q¯[ízɬeŠ­£ë)=Ñí«!”> B¢Æò¸£ Œ¨ÉDHD/B"‰ $¢” B"øàÑFH(e*‰§ˆpz‰ÈÇGHD&.B""É#$"›%B"†Y"$b˜%BB†Y"$ä!!DJ!!©4ÒM!ñy3q„Dz*„Vg"o‚|®Zø&H‚dÍ~‚HÁ tõÿì}|ÅÛ?sô¢Ò„¥‚ÜíÞÞî]%„‚BjÂænïrp+)ÄR¥ª Šˆ4Qzù! " J‘*  ”ß+XÔ÷™Ù«›¦œ÷þÿ7ÈÞôgæ™ç;ÏóÌÞ ‰~d]Û|É€¤Qd"¡û_ѯX»5¶Š? ò}åŒe}OjÊòc¥l¿\L$š.ÉD*Bm \ÅTÁÆ£bøƒ;G¸¨>ÅÊé ¼U¸ïÞyÏ=D<É(͆¡%‰§nì€8I¥+hÌj)ºø>WªaàŸÖÛzËÈЛ²x«Þž‘¡³r–¬£FQš>`}ÈšFOP¶d8N q!вJ$)gh¹‚’Éä•d‰’Yy¶¨à°Ù9+ATÒ™ÍÚ¼ËñV›?òoPÓ N.ãŠÑª9F­Õ*95 FÆk3Õ Žü·é †Š ÿHþ-miú(YþI9ͲXþr­SHþI…<(ÿþ¡‰½âÂɹ$ô³Ÿ^Y&Q2œ9J%MàM:ô#…’$Ó켕ơµÒ vz ß­RxÎ(É]t3=õ•KÛŒëþqÏWÞ¯¡=Ð%¤]åÛ;ßR9óÖÛêj3/õk¡‘NOïÐ§åƒ ]b~m?=rçb³mäº!½§µH’Ç»7&ìç/Å„‰Tç¯ÃJÍõÆ|øþ­o[^dϼ}«Þ–W–v<5yÓŒ¦úëó©…2ýóí«u89Øüa½oŸ«Ý .,ýOÉ ¿ªv¿ëîß.¸òBÌèî½És/Ž+ÈK-Sw·üiãÚ;·–J¾Y9ÿ5¢Ñßù¶åˆ%é_ ØþÔƒéQùÉݹýÃ?­=Âz’^Ö@÷¬BnùüüyóÐÛ§†Ç4øríƒéS:ÅÞ<Ÿ×¯ùŽÓ?·Ocêty¸‹YìoÇý‡\ùñ~Ô\kÿ&ëMõ¾NŒÞ1=Çtù¥ÁQÓ*…|Õý³y§žžyáÁôƒÇ:ün ¿Ü×Zu@»Û5´l¾äéwú׺·îÜøÓ'?®w}ü°6×ýïǓ޹Úwxûká[nIǯ~úªUÍ©±ãÃÖ1ç¯õ,è°»ÃÙgwÕTã`£¾[-8’{åXkcÎ4»5/rüä)öà‡·#¿º±ðֻÛ|ñW«8$í2¼ý·?¶L ©Þ>u̾õ{߸¿yõww^ݱµMÓ.9 ÷tþöá MiÌËÞ¹tºá ‡§Ì¾øi£¿R¶/¹pâ]åCóˆ¬?J¯]Ò°õЂñǶ <¦Ûšwù»É{ÿ3÷ݸYÈìcÛn9ñÒ7ÆìƒRu“¾É.zJõüê;oî2ɺêpʆ>kú7uwÙûƒØè]#¾Þ¨˜ªO|z²ô‡+ݯIïø íú_ŽGœ¾ûú¯-kÜž,ÿ¨ÇÿL¬;yå/oKÚO™¾ÿL&½w¨¼ïÇ}^6ÅæNúfXõýÞ¯rìêÍñMjTYw{ÆÄ'¾¾{öëüzÊÍÍÖMžpiÞž‰¯XL&ùé^Ëñ;Ì©É'ãò“¯ºT÷ÄÄfMäµÕo¾$™ }ã`—NË_Lœ”Ò`Õ˜o÷ä¯6Ï{øû|joƤª“_ô8±4mo—ÐjаŸ"ÇtüþòðQÍ.UùzéÝòm WM›Ùþâg³ggWš³w _eç i/kþV9¥ixÓ‹çÎgŽû¼’üâ—'Fínúò›çÖºØdË•¿? ]×è«!µnr<ŒW6Úý6_çå]§g¿þ‘jðÏ“‡Ü|Ȥ·­eßÕ¼{﻾ÿÖéýÏ,W¤ÑöW~ýªÞƒ?v/Rï›xòÒ¬Û›NΰÈzô§D;¹Ó¢¦/Wi×ËØ|½rjØÀ1k«˜3ûÄÔ† †ä~Ú¬MìÊæ¯Vúí­)¾øE>hÿŠ“OªòÔÏÚìS{WìïTãvȤ† ûžºà×ð×ÿòŸ½®Ž6ªãÛvZµ£õÂ!)/Ü=øÁÎÚØ³O\³:Šöüº­SØ7Šìj~+T·¯çÀrEõ„®Oñ&"óã» ‡ùÛ1ëêÒ]u®,’—ý¶ùö‘‘³-q'M‡ŽuÇ]o]w娨ÉoI'u¯;)'M²ìdØé^³üe«YåhØ–?;ÍYÖòï(277Z›¢i:5îèX­lÙ·Ê“/vâ¢bR?>}zÛ²So\þñ•s¡#/}û ¥åŸÍ}ö“6Ü™ZãOU{zYvÛ WSlU~ÞRgèÀN-ýâžá©vÛüÍ›ëdÕRù—rŽ Éÿ£}BJ«Yý‡´ºñÜ÷[6£~ø®Ñ[–Þ3Ö?ú}dÉs'l+È\VÖ~Ç’šK–T¿þU­#•—lÿ|©©Á>®rû™¯š×}ÐóƒÖ7kymϸ ꌂ#-çÌ#£žì¨B,X¾¼{¬íOÇòiY?ð÷Ísnܺ~ÙÍ6Ø× nµhNÞ¡ŽÙùÑï¿K¸8e£í¿]gFšp3ñ—Ú»LÛùžcSHÍÔÓsìm܃«*{ó“Æuoßt´mÂõXS§ïÄWö·Ñ†Ú±G¾ k];£ùÞS«l{caŸoÎxÉöEí:¶ÖÑ[ªÜíZyè¡æ5w½uºùüÄ/¯ÊT“5ÜÜ"¶]çç†×äS‡~ÙùÑWkkNyól·§ë?³ö­Jû”é›_Ù±ê§žÛ Z+;³ò“ÇPš„ʺïO«þ»²­ËáOÕ1lX´nÖÈ…UGÔ'š•ï68sàä)ž‰Ö›n6y½ÛÔjÝê„mÙ||O•[ÂoÍÒ“6œýŸ7½Îֱ雇·Æ~ÞúìÎ;÷,î{iÅkƒóoEÙöüx?æ þ¯‹º%ËWîºÝhÓ3Ç驯mM~ÐYsIÞkÉÅZGjØÿSiØú§ÿ =ªR>8t{ÕÃÄcÑ/,ÝœüÓ‹7¢–S[¸ #Z«´üϰ¶¾sð]µ£åñ­æ+£B†7‰Xñáü壻óÒ—¦)¿(ørýGÝ”_œ¯9zU«^ÉïôÊ6cÃuv[Ô{‰¿-úfþ³ã®_?aíç#?áC÷¶×wÕvÚûóú¦÷î¬G\úÛÆšQq)Cv\иÔêÖk'7W_w´ÅO“Ãúñš¿»vC·æKs+ë;U]P)qmã¹/÷µî?œ8â©uÖ‘ûÖÖÕZþnt£!‹§L}ÐâøüjŒK§Æ]îšsFåˆ\׬ùÞ¬›G]|£ãúHéšñÏoŸ`ýnw§«éÜ¢µzãî…?Ÿ¯ÿå¬ã¦Ù#šÎ|½WÇÉãÆmÕmàä°é}Ã"^O]>dWô@Éž6)5Ÿ¯bdO½ð{ë×ö>÷pÇs»VÙælÐL6÷L×öWýµfÁäÁãÛÍ;=*:i§ªÚýs÷›p‰}G·Ùÿël©\blSw¬ýÚau»º‹OϘvüãÓµÍcR‡N¿Õo}ÓÚûb‰u6÷OÏYtm}¡¡anÖT®ïŽ/¶_òîÍcò–‹tÕ®….k0kûlý«-ß^¬ÿ)áÚ§=v9uî­ƒÇè–mOÕïûŸY¿ªrµqæ]KͰßU¾ª[Siñ»4±ÕŸ¸óÒ˜5!^ÕºÍüïeÓý6à@‹Y÷ó2Žp£ª&ž{wn‹Ó3—¥eÿz¡aãçgW’ÑaÊŠ÷s×÷Ýwi°yd§±‡âfUZö…¾M³ÓÏßë«k>nÃÑY'ßÛ¸b륳 &5{´¤úçCëÍmÜzÀê39Söö·9Ô´VÚóGwÇTšwëöÄoíÇ]:_ÐxqÛ‹w"öµ»×eâÆ·Þ?ùHÆmZÒ a½kôú¼n½éƒ‡.tåÃeëòÃ#ë=8ez‡„ä‹zùÜáòƒ‰»ÿŒ•ÿww¿csž½õ½¶Åîñ9ñ‡þþÅwÚ/讣Rvï«ß6{ÿ¸»‡«Ül0÷ÎH㜓K>fÒøüûÙøLÁ•’Æ w̱xÕ´ØÝãG,øšz/íôúaö'ßý>iùù~+/ßK^׃«”ž0õXsHhÕ#1Ÿ})¯Uì{Q‡G-?JåtI7·YN­«þnÄÁ½·W?»rLj!‡5ó/ÞgìÔûúLZ³óÆÒC½µ÷Þîñ]ìçµÏïÿ}쥶+êœd«7n°¿ö¨EÌ´µ­5f?¬ºhûSb“c‡ï/®ÜyšÙ´?aî»{¯É¶¯˜|ðÈÌËþ¬½¿åömM/õ¹·I›ÚÔöÝ¢žÏÞD£‹Z1wy±ÁFõäãaõG©vxnÍü‘êð«s^ø¡þ>`mìSúO(Û.ZZ™Kœ½RÚçüùúŸ øîĄտžÙW_-oXÃ6CúÌòãÛØ÷:ÖŸ<-3ë½k#«ßܹ빾_¶¿Òꎦáô?êQ“âkÆêÞ;AÇ)z ô ûî޼᳃û&nÝ|ʾk+»gíÍu»ç}¸Ø~sÅê§ûïÌ>¹uÞ‡½ûìlÒ¶F½Õ›.2gå…Ú#U2ŶÑ÷ Ê’‰õ?¯·Ž:µŒü~ê[ †‹Z:ã;»ó–~+ž™õѼ½óÌ-Þ}Ç\wXTí k¯µëw­ËzúVöáÊêUV¯¼6´Rš²VldccìÍy hÉ#Ûä¥]êÖã~¤®ò§šK»^l¶²NÄAÎQ%þzW+Œ±L—ü>é…wßÜnVãíÿ†f¬¸¾+lÁíÏî>ûà‡›¯é";ñݵ ‹ÙÚ{;¤opüiÑìíHÝ‹ÏÞÜeºîhó^öˆíwv.>Ûµçˆgõ©ÊüðUgMÖ<³d·ö-ËuU»ÌšS÷ÝÛöhàè-Wæ6ŒÛîÕ÷~ç ­¿ë½þ“Ú{Uï~O\=xùµF}*U~«wV}ï™Cº|jø]fN{¯é…úáû~uéÈ…Û_wXîHx«÷‚œÔÏZM]{¨ÕA«ãõø_:-^¼ó`ç%Ï®œtjʶÑÜÓúÔ|§ý•œêBŸÍrÿ÷Mtm×.›2¶s¶œ¸ ÿ»êÓ–~G_½ñÓŽFŸõŽk±{ëîN Ïoë°õÍškýŸËùá>iõÞœ.Ž‹k®µ]1§[hŸ+ìaý_”quÍØ¯³úo9fXðóêèˆu«­ãój½Z¹í÷ëÏíÕžV»ýíCCç ì}pMÕ×ovü¦AƱøí¥ß‡uººÝ€þhs`Ñå¹?tP¿Ò3*î÷±_TEµCJ|jWÕýÐçµõõþ®94©éÓ¼Iã4ªà2ħA&§erWí1ÒRò,¼ù¥ýxžëiÎ%RñO±”Š`(&]"M2ÛÁf#dPÌŠ|®èF“ Ùy‡º ZI´šÕɼ=U Æ !MásíP/6×Þ;W%•B•83T'U8ÖŸ¹rí¶T!” RxPÂC茤…‡Bx0ƒEti ´ tÙ…«aç0åîaxœ¨¾ ×؈T‰Ðh:-8a^UIß‚"œ3˜u®&䢮XÑŒºÇ.‘HìGݺ9 ªDñHœ/ÒÈ"T‡ë‰ïŸPÁlº^§ÁoÓ@<Z”_üK3i2*€æÙùâ ~oÆM žïbIA§ån*„[Ó+† ²$*ä*ÒC…BYqsA•D#óš ¶9"/‰ Ö›#ª äˆ|¨PysÄù [C†¢ÄåIÒ*/:„¯ÀW L‰tP*/®4ÃVbˆñ¥ƒVú [qt(=t$±ø’¼pÓ ß’”¥o®WÕžœGÛ´oÈæíz5'Œ ¥yzFI¤§¾—”ÂŽ£q¨ykXlr"Ñ;Ël³ÛÔV½ÅN(#H "ö@ô®a/Àà°^‘”Œ”ÉhŠ!i¹R!ƒü~fMqY¸ªÙ¦1Û‰lÞjCo,R‘Ö>%óXo%”Ã?†”CP2™ˆK£ö,¨™†Ái‰Îjƒô½ÝÀ‡õîèžÅ\+¯•È ¢Ä}†%#…B® ´„3MΪ`ÂpŽÉ•¦ ¨Bi€ÎªBi Y¡r2’)Q9ZY¸=%Íê—dèÂå"ù¦Ñè_Äi¤¢}4¥’J£©Âí)²P£*D­”S…ÒTLáù#e…Æ¡ å^ivçi+~GU?– ÁZÀŠ !7iÍ„ Hã{©a³¶j†¶o¾I¹}ËŠÝí"^ZÚ±pJº;»9«3^AËeÿö¹myßó–“V@ˆ7¬BQüù¯ Ÿÿ*h’½Z^IKW"JuØüOÃÿçç?"þg ÿAþû#ˆø¯þ3Aþû#ˆø¯ þ³Aþû#ˆøÏÿå()È?ÿµÃ2È_þ+Gÿê~ "þŽþÔÿüDüý?¨ÿù%ˆø úPÿóWñÿßÔÿ¹ŒaX–øÄ¿„Bü7ñ96½1#Cë0ê324œËPfE@‘Òö\Â÷@ìeî÷ÿi¤S2JNßÿ÷GHËʳðV˜oÏ/†÷ù’4ûIËH ‡B芡'*‘EÄé <‘Äky+oRó’4—ÉòK^Yiz“†ÏÅ£\œ)4Ø£Äî $’”,žÐ¢nõ&µÁ¡ám„Rð±(|Öš­ªDd¢eáLBm6ZÌ&ôLD z“.2ÍÂY%„00:×.êg] ò!5-ÜžŽrÒÂqÞc[ˆqu]\3ž„D’Ÿf·imã"ÒÔYœudZ›ü‚d.-¼E‘åI*Àc(¶†ï,Z5ÖÂu%’xg5 oá!&u¿õƒ'±$>D¦á/…ækõ:‡•/Hí“.q¦¨a,¼­žËæ³f /Is’‡ÛÖ«m©øK³]ý-öô|ZªÑd·TÐ’Ôhô4Ž"ξa)Yz›“pôEM‘½dá5b#4z+¬cCC‚U犹f̎ꢒå2$J%ÃCRI5rEñC‚ù~ü¸ÒlŽL§>Ÿ#¬îMhÝpj{¼7êÇ¢ÂzøDHð",ÏU)ê/Ao³¤ÙŒœÁ€{LƒN1ixÅØ„v@À t ž-‚p‡ñù4õOÈ~¬8––XÎÅê•àžt‰7ò{ñvt­!zñ‹ øÿ2X9'Ö¹þR…—)"ÓÑ;ÄÞ>–7í¢Ú¥eYym¾fÇnŽ4@^Îê÷×áD˜ aâ¡si-Õ®[;3ÅÙab /‚D¦Ë"ÈÇEï•D¦£×J¼ÊaT±XÍ âFB€Äf·ê3v`±Þ„Ù˜e¶ áì„ÞNäè "“'€^­ÃЙ€’Äø”>¥Ñý‡C¢“’¢û§ ë%aš —Ïæ…vôF‹AÍæ _/2Ù«´D¿Ø¤˜>P>ºg|B|Ê0_qñ)ýc““‰¸ID4‘”3(!:‰H””8 96‚Hq¡^K.â9+Oô26èÃaBoqDÏä^„ÍžgpgEÉ<ɉ1[ò°{­[ ¦g€Í¶£ÄxÏ” n„µ s ´‡P3Ú"þm}'|ƒHÿÿ?´ÿü|ù¯ ÿÐþ÷Kñ?püÿAÿ¯_‚ˆÿâÿúýDüÿðüß/AÄÿÀyÿ'¨ÿù%ˆøÿ¯ëÿãäðýo¿„Bü÷ø)s8»:KcÖ•ñôç±ç?rë9ÿQP ðŸei6xþãPÌùï‹?ýq*ù䧸5%>÷ñ´&>öñäsäà >Tìurþ'.Ó!Î:…}îÿŸÈ@ÑJ5Yô"ú?v"¤N„4 ªâô/ž=<Á±J¢Õœ­Gb©u˜0…Eœ±¸¥/@?´ø "‚ç ÁsÿSç ¾ú'û·õ—ÿ ¾ÿí— â?0üúÿýDü§†ÿAÿ¿_‚ˆÿò@á?ôÿû%ˆøO ÿƒþ¿ÿÃÿ ÿß/AÄ&`ø/òßAÄ6`ø<ÿñKñ_0üÚÿ~ "þ«†ÿAûß/Á—ÿ™ãÿ òß/AÄÿÀñÿý?~ "þŒÿ/èÿñOñ?püAÿ_‚ˆÿãÿ úüDüÿ_Ðÿã— âàøÿ‚þ¿ÿÇÿôÿø%ˆø8þ¿ ýï— âàøÿ‚ö¿_‚/ÿÕãÿ òß/AÄÿ€ñÿý?þ "þŽÿ/èÿñKñ?püAÿ_‚ˆÿãÿ úüDüÿ_Ðÿã— âàøÿ‚þ¿ÿÇÿôÿø%ˆø8þ¿ ýï— â€øÿ‚¿ÿå¯àËMÀøÿ‚þÿÿÇÿôÿø%ˆø8þ¿ ÿÇ/AÄÿÀñÿý?~ "þŽÿ/èÿñKñ?püAÿ_‚ˆÿãÿ úüDüÿ_Ðÿã— â€øÿ‚þÿÇÿ´ÿý|ùÏŽÿ/È¿ÿÇÿôÿø%ˆø8þ¿ ÿÇ/AÄÿÀñÿý?~ "þŽÿ/èÿñKýþO€Üÿ'—ÑAÿ_‚HþÇÿä¿_‚HþäþGÿ ÿÏ/A$ÿÿ¦ÿßÿDSAûÏŸ¡ÿ=·Ò ›.22Ôf“Ýj6d(Õç½4¼åŸMbp±÷‘¤‚b_þS­ ƒ÷ù#„¶NLÖ˜3ùp*B& ±òè^›HBc¶ÙÂu1AaýàC2o!HŠ ä‘røÇƒRbJ&St„šq¨VžÇŽºíÒRôvIô†‰œŽ·AXl& *ßÓì0iô&]Osn$!W *–%TJ%dÆš41f£‘7Ùm—Í£ò芚DX‹fDÚËlï¥WÛQç„}ÐðZ‰+_f#‘Hm¼ÝaI@w‘D¾ÄÈYGK¤±&µõ:˜WÃ0 JÁè‚™<Ü!Ê•I$ñÉ„\Y„ *)‰vޚ͋ÃýY"ñmBB‡…ËB뎑ãÔ;ïN¡ E­·ªF­Ïu'Ó¬ÑóVÞ¦·¹e¨³¢Yq¥( Å ºä`×4ž",!Qó½ÁÀ¹ÒH #Ö‡ à­4¶0$4+&ƒ2b}È Œxßö`ØñE´ÄÄjÆïÓžR‰‹Á2‘óé„…NÐK&wh^Ç[œI“ipW¤a´œOEFË¦Ž†n9q·4tÂyjÂØ9Zi ‹óf D¨E®x@_˜L8/&Aò>Â:”ê}Û2õE´Äè µãÔû´Ç@µÕÌÙÝ)@±Ég!1@šÙ§OÚ1î“RÌâ>¯Ù·OƒÙ§¨0Û œ-˵¾<*…ûd‡¸OÆàðé“…>ó|Ûƒ ÊsU$‰$°ÎN@€ t9§I'x§”ÈÀþaâí¨X>´&Ô&ú¯Õ›4ZØAqÄÀ›tö,®ˆrχ¶ñmˆ„4.¾aâ!ðˆ(È',f þ_@èµ¼ÁÆ»ë Ë¥8ƒÁà†61ŠadsµÃjPÅ4£<½‰G$J pAiŠÞÈÛÂ“Ì =„ר¼òâíœA¯.&³§Ù )!«˜º}xC6ªš+>'|@¦A?ÆÁ—P¢È¾}³‹k$Æì°÷‹K/¶sW~‘]{gÓ€ÚÀsV»ïMD¦^`‰ÄµÝ%ñÂo‘èÞ25ìgÂE†Ùú±° É$RµÙlÕ„#ö…k9£ÞGøðS8‡Áþ˜R¸%¼T ·é^ÅJÂ¦æ ¼°¢™ÒxSv2JŠãðR##dBs@j. B‚?Ið¹j´ø³ q%!jႸ–ï\w²Ù U³A¯ÙHM‡áCÀ«¨%𸄊õbt°[Õl· UÉ¢ª2E$×”Þ” ’/Õ¢ÛïÐe¦Ξ…Å‹¸°šGó…R³Ì9D>’sïtï63ÑË'(Ô¡Dß(éÓ+ê À;Ña*2ÙŠt¯B©=§3›8ƒÍ7e6v^ãÈÛñŽjÐì„Dj2kxás>Ê˲e 1ïvyî±eðº~\!“Ùâ,â‚EøïM©ãªTM"?$”У³IB¤Â¯Õ&åÑ{G€Kè7è&?+NsV' ­éVKCBB<’dc$…DNÂhà1£XXZXG|ù(P„šVgÛ„hXggú(QzZG!u{,8è í>’Å w ¹¥Câ‘TY.nj¬\8¬3ÁÀ7õ¢Ë3ú8|ÈuçÚÍ®-¦”\‰Ô™&#ô c %„¥ÈiF(fçyÍ&ÊòŠ å= ®™Òe® ÁÍ,²ÃQ[He„Õ=¿x^BB¼QA⪎çÐ=…®ebεXõF<A®´G@ÿ<ç3צËyè/4DƒÔÙa€î.)K|ÀÃbLâ™02O‚ Õ:ŸBjƒÙÆ#9÷e'o0è-6>å 9Zó¼'ΚëóÉòÎ1r0g¹.¾ 1X¿°HBr‰<ÂnåL6d÷KB QèE@]¼lIø4AΪ†UÄ»ð%Ô¤„ O0þè-§îD„#B —Ç[±ðÚø1’T˜uœäHt «£‰pB{!° -=XjYvøŒ˜‹H“¥£O`ŒF(១½#ŒwD鎤K¼ˆ5Œð¡Æ­˜¹DJ ,_jär…®¹ÞaõM’„ø¶å.@6G&áîÑhÖ ›QÂÌœ/e/”CðäRÌ8™ë…Ÿâ,oØôÍóá—Ù䓇>¤dâ I›M΂6¼úŒy‹Åg¬d0çø$¹teì>‰B:HDÃôté–EwY™Kõãߥø1§ÕïTŠ’‘Y/s±(ÍÆ…ˆ}4êíèF_xì}f5ç8™M ½¹R€Q¸ÒÈÁmsXy¢Ñ"å ]v Ê¿ÔaLLÇ6¿ÅÊÛÑ|™íY0{èS½ô6;Út­©«vdòx×* ò‘+ +àîl©—HëÃawküNr:DEuÀWØvèÖ­aã´éî‚®9Í7uaQQaG2a©ÂÓE˜¨X·nÅÃ\(°LpE©¤ó³¯ˆAÿ<> T`(Ð&;‡.Ó$ÍV.॰c8}F`Å«À^vAº Ô¥EI„&=h'à›[IÀqw.Bh³‹É Ëë¯GÎ$$J!¼M×’“„†ô)&úðóØz‚æÓ4‰ÿº¿ˆn=yÎõ4X¯Î}ˆ”ËpÔ¹¯à¨ÊõŽxvDH‰d”_W‚²[ät( ZI¹C^gätÆ>g§Ë9Bm±t”¤*"ÿ°ÎŠìÉ$C(þq¡T Iø§.ë‰ârò9ãŠâæ[.]’‹5d"»•Ÿˆ“×Ô“òZÁÒªbx]sS%']³D)„¨sšqTá‰Ê|¢%ð[LJùvWÏKZß”L ½)Ý+BÐû"²ð Àìv1NÄ`'÷þÏH"¼Q<ó°‘ ´2 ‹¦Šeà/-Wî]Ø# N!p‰ˆŠ%P‰”‘„R¡"H†ÁœÏRxˆ¤’ÔTÉ0z¹òK˜9&ÒÇø{2qn1×h¹[lQ.Ô+nÍTXûΡ>–UòŠ/9¡TÉÝ´Ó,Žº8DU¤' …½¢¥¯òè®´âEš“¹mÒ0­Úd7`顟7–Z°Šf[‹ÁFÊñ) š:`ÉñàH%zÊaQ¢']Á‚…ú`= E=û!Î-Œ+¬ý',º"‹T©=   qÔ½‘@ÔK“@…Ù'ÑSЬòé®Ôûˆ1ãÑd&Ðþ5Î}˳Gá-˵•uß*šy¥/%§  ’KÅâè½o)د”2xB9%L!”©PñÂ}¨<€¢¬›‰8·x0®°öŸT¼)^JM°ŒËUr!ê$G•î(.쉖B¼Ê§»RŠ—Jk’qÃ`˜Î Ïô—Há/ƒHͰ R ¾z‹D«@Õ£ä„pIœBæ’†í–QBO òA¹VÈYO¾‰$,üTÀÆÊ<ù Ž %¤ã'R5)‚ñn/⌞,êÄ•¥<õ)ÚFÃJú ütå»â®';«w> ý¢8 ª¬RŽà «$K,FZž4¡ZY¥¢B!C©„>•n B´•J¥Ê¥lÿI!ƒ©PÈ@Æ“Ò#ô G]2 QZæ5¥w´4Q.Ý•2”°…É•ÈHæúXô3˜VìJ(«¦[4×þn€:ë”#$¥‚'ãÜ©½äÐVHWÀ4a9*¯òÈ5pDEPdø] ôtå»â®'’kï|%À-г _Òh»G¼!=&¬RE¯”°'@ÿHóhYË5ŒõéZL3Þ«G…¢e’ëÒµÿ¤rÍJR ióJÈ‚´S '°:]BÒžf«†·B.>áÒ¢ÕÈãIDEÒdG¦=ÏÂÒAIñŸ°vµT£  ½«iÕX3”YYv£¡#Ñ­jÈ];Ao-‘F÷ïïòh—ÖIéš6×XœÓF;£ÎyrЕûFK„”Šì®„õ)‡ò é–D_—$̬H¥/•3ÒÛñÈÐeÁ¶œMšôé+rA!½,lÐA$+è#¤RÐG(…¯>"§œúˆë •ÇGæ+]RŒžrüò C©*7pr·e&ZLp£”í?)n(½pMKƒ*…ž0Å¥Æ ßñ Æ ‡]o(Oà {ºQ¨¸êœS´ÛÍ£Œ;Ê8g£$P)š”òí®”z {5K+‹Ä’ò@œ¢rË;Ê2›I*_3Ié4“€fÄ'l&yÁRgd–V9ƒMÊ – `„D#•#s‰Æê'_%x6,©hÁL"e"3‰ÒÁcϰX£yåQŸ,¨J²XF^¡°…`’:œSÄÈU>‹SP¼n^aí?)l‘2/ÜbÁüCoY+OèÕßRã%ÕÈU^¸UΚNéË5B—Qˆ6yÚ­-â(ãŽâÂLñºêã«|º+%`±,Xu´ª`ý3å¨üt Xjå¡‘' …* ŒGÐ$¯cWÜõT`Ôòä3Î8£ã‰9BÆE{9MÝË`q“«C„Æo¬»ó• ~Õ9P¬ ½ˆ¥¬P´aaÌèy×`콂%Lñ¾ù kÿ‰Ñ†òB湋,¸² Bã6Η‘r\ÃtN©ö(/ç Šz™¯¨ðã|9%CNùtWJÈAbäíËqCŽ“#¥ÂÑ+!Î ŸÐRR™_(É}Þ¹!QT޽È4+¼=ŒÂGý¡Ñ¹(ä%†mV^^^ˆ“ȇ/CÇ+Z gMùtWÂòdÀ  Xy!\p½:öä°ðä Êü&„Læ‹2 È$…¤Y)h0^ ö££Zäfœˆ¡PzT`9Ï•R Ǧ½ "( )(¨ƒ…ô úž*ÅÒ8!‹ùÚ½ü8 L—œDŽ4çùG(/ÄAÖC”*xB\Y±*ã¥LAYTœR¶ÿĈÄx!6PÁ¦@ud˜2 ’VªaÅÙß_¸äëÕ 4,Ú=w®QºNåQa¦,¸T>Ý•°HIVPÿK|¯µ\Ü:ŠZe>Õy—ÁpDn’zawFèÂÈ+Öû‹Žñ¸ö\œwó0H^ïo)Ûb©÷>6BˆN#Ï» ½’]6©§ø"ô ^§·s~|×\V2½îùÂQ–ñhu¤w´‚_>Ý•°NÑfŒ6âb×—¯bRè³B²_v((—ƒ&Ï›þ(بCŠ+ÇJÍT,à><Ê"f/ã~)Y  ,PPÊöŸ ¼O‚ЪE?"(^eðqȤ¦(°©ÑwšüˆÎ1¹…Sˆº…S©{:}¢¥Á‚ré®D, ñï­ W0àÈ]éëp-³“£ìg@´¯IC;MÅÿ²wå5¥ï?&CÙÆ¾drQ(ª{ös†jÌ%dH֢ĭ0Š2dH&ÂXÉÈ6†QH&&[Ö±GSÖì[CC–†ïyÞs»çÜF¦Î¹Çÿï=zϹçyßÏû<Ïû|>GÒÆ! T ›‚ÄP({@$EJ’ üÿ'´%Ž€,Ò= þ†HœEN¨¸ÀJM¬dkšØ‡ÄY`$twTE$t ÃF¤!FÎ*)—Ù…‰3B$>À¡‘ø0ža”íM3ïB$ßq¾¡ºà‰GÂ/2‰š€ Ñï4'mÊÂ#S\î½xÄ»üÌ/„竽ËIQŒAœb ¢1ˆ’`£Ç É>3 i¡,†$…ò’0.AiÀœÓ¥çI”.ï[ƒpiÙ³Ìþ+ŠA¸Ö(@⟟–C¥G8ÿüecÇ{Eï ]àØ ?ǰ塦aË…C?Ò­Ò¦¬àÈ—{1˜Çèrˆ¸ª¢ü©š¨â}f(ù”¢ £Gº´á„ä,Dà± ´‘ðHºÅvPøˆÚfTÕ%«p îÚPeж…`JòQÐfTŽÁ`Ø`bŒ$\Ò°ªA“TƒÉê¿Âhƒy<<’󽡊"Þv²Ñ&À)€õÚð·èû!Gÿ‹$.&>®Òßix˜¬´)Ëã1ÅåþÅãÁÄÑðÀž¯*˜cDU7½[Sâ@.BÎCrh0´?„Ú’  ˆà`ÿH‹V Aþ†V íäœ*Be"!ˆÔŠ‰Ñ¸B¡ã{FµjýW‚ŒJ]ô;ûË eDüA¨g}HGø=„AMƒ  _ipAhiS–ÇcŠË½×ã!PPÁÓU~ô œ•‘Ô1‰@cpüË€!Q™.Bx²L™z êUø§G’(SGê…kp¢ã@£ÈN’þ# %Dc™ýWTUÈÀ`)¦Ää=E£fé~)4CýgæýÕ­ÿFä7Åådù…ÉÒ)«5"0"BW¶´µLݘéªY˱de'›(ƒÀÃÈ3–Ó¢¹KºCjc e ¤~¡<^]R?x Y9¥…; ‰ÑÈë¿ÂL>S‘ÅKÙj.†šPTõ÷P3L—)ª¡¬ ,ŽAdk†Mò EiXZ>™ÆT5%ËÆà ïѽ©òWhÕú¯´)•V:¦4ìý ñ„ôµM`*)Žeù6Í›m}2ÈT¤Ä/fY¡ÞJ8’åðowK£Rr»ªnE'èÌñcYc~,«+³ÿJ›Zé¾UÙYˇG4„G¸ K9£÷•€ À€¼oj†"Ð(a(u÷•„knDÊ0k„³Jö•dö_iS)fveÙ˜žwÍÛAË«ÃMŠW)Š’(þ7bˆ¹4W‘™!lé3¸PÉ0ZÄÔ0œ¦ H]ðË/ÿ(ö´ºá,ˆMK¤´Æ–匹?z1ƒ|[Ëì¿ò¶Vd”µ5¨!Á Ë#[+B, 0TxÏ€E© µ‹âÉ­cb€‰).Š—Õ…©È¦r|£VTê‚iÂðKRhuu§ º†8¬Ç‚ #?C–ã"«ÿJ›B©ãRÊu.5øŽ¦aùÕŒáûÇ…–qïdp^‹GÀ‘!µênƒ—Gbâ£4Ö‰a¹@JL%«ÿŠ3aM5mJyR‰wDXåhÐfãoœ¡Ôž6šªFÚ4 Íke¶Ñåm¡tÞ”±KSh¥gATF Á¨,ˆ<\†•Ž[B*D…!ßD-äõ_qÎ¦ÉØ1Ñ(KÀò¤SP6BJP"ˆ÷o½¢µ„ 'ƒC†º9¸&.– d'Jê2ãœ":¿¼þ+·3Ý‚#Ü™”“ž Ž—šV áòÑ-•y›bI ‹˜ðôÀÑëÒÐ(•³@ž† q¤bo SW© Go£3à4n4q8Ý‘‚‰)¯ÿÊÛZqüõNcÓz#‹Gƒ±õ%¹&0Acƒ ÔEQÄÂÇK•JãT%ª$ñ/³ÿŠÓÂLå]”ÒžJƒPÜÔ IVË Ò¼†¾]zDÒ’óà‰@›½"ÐQE±úž"ÄèRïA$pw Ø;©|ÿ•·¥RE¶y.Ð$ùG°¥¶”~¶”žÅ h3üƒÊfDhË.„²’‰{ò8¦¯Ž’þ=øu8±'ƒV!ˆ%‰àñ+-B[xWBYéßsuQòw9”U;‘H ] ÿDAE¾®¼þ+?VL€²$â Ä•´È¸ . Š,©ü2 ÆfH -Q¡! l @ƒ „ ‚$8UV¢á`‰f+¼Ešd᎔L|™ýË0¦r.³¨”%êA‚ÎèQ˜QÛ×…kû¢ aä‹ÒJ–D™ýWœõj:òŸh þ¹C4ø¢ðº=„¢ÒLK#_ö7qPTK'€²€#§GQ¼ Š /@M[a³Bm%Q®Œ/É)FQYýWÞÖÊQ›6•PT H›Š’¥„ª°å xrF{s€²°%Ž’'$%V Í¡ÀÎà@(ŒKúGdÈa•š©Ìþ‚ô=!²³Îx;­ÊÊådõ/c0(ß4‡ÉH ü'θ éˆUŸóßóÆA(MA‚“B¯R¥ÅêoAN”Q¥1‰ŽäcqŒPÊËqÉ›…qZäö(•Ai\ÒŒ¥Õ]‘áURå£(ìØ(EiYýWÞÖ&ñu1ñ…2"ÄB#it4LL`íð( y]`î —hµB¡6™¤/C"”–¹•µB="¼­F@iÊ¥¡Ñg4ôž¤º(-øãåù²¬b”–Õ¿ŒÁ` _ù_ƒ$JyM†Pㄼ±dGG=”ÆËEQVªc$¥+ÝÅ Õ¦ó¥$È!P!‘Ô©Vô: ¶‚—æaàkC%:'ÔÛq*çmÑ5ÄÝ-éâËÇ…³Šò¶òú¯¼­Là 3ˆÃa0–@ … J`Bia ”h$’WÑü90"ÐF€F€j Y J°ÀpáÈ¢ôÔp‰(²O<úâfô9U•_ú×y¶BÞÖàï”fuæ…+ß¿ŒÁ ÜÈ@”-¢• Ý9I ( Æ”…Àå¿Ý¹òÅ7Â|ƒ-þa8ckÛo{FøŽ Œà[ÝÆÀŸi0¾!~ ߇/ùž,Å¿íæáfiößÇDŸ¿S¨ï„ÀH§Ú‰_ Ë—„÷ 1bô8ÿPDZT¥®¡å?4IÂc(-jcB[øZ3ŒgHšÔRZÊL‹ã¡5ÓhUúÍFŸ‰ã'øFh4fÁ:]PÔ{ÿ_`ÄøqCö㈓üúãO²¤¿Ÿo omÈh9>æ0òÿûþþû¨û‘3ÿÂ*u÷Ï>„ÅÑü§)>å]1˜ÿ$Ný7ÿ?ÄǶ_W7Ì‘°´Í~˜¸Ú’Òh5:¿ËÎzŽ ÷€ÿ¦¿“ÛèÐ '7+]y" ÐÅÅRQ³Œ\qhXŸÄÙµ3O¥-+xÜ¥WÌ7Ã?2·¨zs¤ûNM‡^ô–1‡–8´{ëòÌúèý•——¬§ü¿üÄ&|Oîå‡Ýl3äõ¹3™us}õörÁu òŠ«û8¿)y~-ѵEl§õCóÏÄ=ž—5÷®NqõÂyûææ½múÍ“;ö»Ÿy6¯` ëõz%gÞ>¶Nüfª³Ë¥°ëÏ"Sò;?÷yòâÕ“?O%µÔ;™ô¤xg^XQá“·¯óšÜ»—QùzõÓc?ªYyÏ·d¦cê•.…—?ù3vƧE¾;â~zÊQ÷ó¯N9¼}óàÙÕºßDżéí—°>[úÐ+}¢Ó˜Ç ã§W#ï.N½±ËuéøÂææ³_ïþ¹jpæÿU ú.>3³SrÑÑÛE™wnWà³ûJÌŸ_†l¥:Êq?¼+ºÅ}b.=|rmŠÕ§ÚþV FžØ¿tcÑîN/š·ª{îíøùæÉ§E}ëˆy5æ·…£ŠÆló³û¥`†÷¤ù…“FÇì;<0¬`ªÕ¤yýòÇn—ºmYÝìÇ¿~85ëbâ¹~Yqy%ÛŠ—œ+ G¦FÖÒ-Û8s½[Áù‘ÛŸŒÈ¶åf—5jÑSŸ5_í‰çÚ7ÁªßéÖ)íÙÁQþG‡Y÷â¢g¡­wKʨ2a"½¯¯»ýÚwè˜ ‹}¯cн­n‹ZvàõÖ!iA_ôö,öîpiìÉ/cƒ²¿ø|ô)ÞÉMã2,·úÑœæÛ;åôÓT uMx°hÍç‰9v6)V)5ó ,J£Éüiá€{wÇ,Ðí]¾«$oì´´»ÍÖ~yf—æ|I|HaœMÉÞ.xÓÎÕ;jδYWeù²;ªZ´úÈ×ùÀªp‹Y—í®Y¹º­Zpö²ï‹f½ZÖ9Ùmq‡öÞÓQÛârÚìˆî°P=ûæ.Éù}L¨•¨‹lïHn pÌr¹óÐvóã/µ¯V7rÒÃ'Jò,Ó\Z6ÆþÚ:ðxÀŽæ_^é}ÏâxÆÿáƒ2r.z.™ÔqòÚ9W7Oíø©ŸOlNàuËPÎ>«³ÝoŸùU[gVðÕk^޳vXthÍ¡QÖµ›¦dKNøöaʵ) {dßõ½û¼J·Œ6n˜yúAX¤Ù1ëÍ V…Ù,þ¹Éü¡O5Û±Ÿš·ÖÆÕç’GD«gÍöõq}ÚÑihê¦Ç™n{Î;|uöô¨{gÓ<[Ú`àÀ¤fßçïÒøMÞ9gYŒ[ïÁÉùž­×_‹{—WÛ}y³<›ÐnYMžÌ`gÏ^ÔÆ?ØkiµhnÍ€úXz·Þ…ƒê¥ç^Ý÷§ƒÁ#ù¸Öÿϯ'^Ûy« ÅÆ¥ç›Mº'±ûø'óbSŒz{ÒÆî×½¡înÊhY¯Cj×–%§?é~×KgÓÄÝ?aOç›ñ– «u«P%¡U› ´¶C~oœ5ÜíˆýÇå­jÖ矲½ï£Cë÷œòG-û<Ë&¹\bñð>vS];íq¥ëýð^^AUo9µ³jÿ4¡k Ûê_»®>¸á&éîWâ»dQÄ’æ—Ï“Å{¶^Ô³}æ·©WÚ´íðYö%ÛšÁÑYšéÏ{Ç/¹œËôûµyà 5'{¿þxÊö•/šM³g¼ç9¸¦¯ «÷澦ûK÷…Iô¼Þª¨ãñ1W|f§ïÞ?„;4$‰ý>´Ó‚˃綳Ýt{í.Ïñ‹Î˜yŸ¹îèFç!QµÒê;Çô/4æY›ìl·ÍÎÌÝR3vŽóË‘3_þR4Ô#lÖô¨ÿH¼ê~½þŠ ]VÆü½2éé… Òrbf¦Óá^;ÃÚžX~yÁªT·ð¶'ƒ³ ¬=`Ùì"_¯‰ƒ¯ÜŠYR'žh},ì°ÍÜœv‰´ŒLvÆ×5b5SžvI{Êòˆo³ÒO·eìŒO3yìlèøWp›Í/²Ã&oˆý©QÏ©k?¶{ár.Ý{Ö®È9ìNMß΃N×ê“ÚÓÜæ†_ðÇÕ]¬6Ïkº¶èöW[Zý¾,=-?8.;k’ÓÖ35Ìüü“žþí¸¹ÝÊ“÷¹Dû“ÎnøÍÜú7~[ÚuÅÙ­ýª¤'½ut.yÐÙjùäÍî®æÜž0ÇÖó: t+åÄÓO<’úÌ蟟»·É£›ôœ›Yw²sÛYQ›Ï­X±8|侇…‹Ç¹L¸l‘PÃÒ¾é³÷ /FÛ×U«ÓéŒûº¬1ù©¿ Ÿµ†Æqëê' ÷›nšÞqÁv'•›žvóüàÄ çYÞ»&={Ñ×ë-ÖLÔwɱ¤T¿>wwó îùü=ÔëdñsàÒ/7l<§»îœ4®×°"º kYûëi^CÙÉo®Ž9²´cí—«_ÝᚖѼÓ÷ÏÃ×Π7yµHÚQÍêérCOÇü ¡=óÇŽñr`§{þCîÄÔ¡9}þÇÞ“€7Q­‹÷â6¸|n,²xØjSh³L–¦¤¤¥”ÇRÚ²HS`š™6#I&ÎLJÛï(ˆˆ”¥È*›€‚Pédñi± /Èŧ ‹Ê\àŠ¾sf&i–6™¦a¹ï’¯ß×™ÿlÿzÎÿŸsæœ #è²tÉô­á޽RsêEGn¶RõIË^ôû“+ Ÿ½0Îñ?¿&gc\þ•‡ŽÇ½4«ziyAÅêÞ£kêŽb¸£pnç4Kå'wqí2žûÓ_r–ÔÆÝÝ~«uâ¨ýKú÷ yG;Q Xôà꣣† }z×RbÆ©äºÔ4÷΄NV&ûêÝ̳GŽ–Va¯«¿¾ûÐÅÝS ûoÓÜ;rUžîƒE³Ý9[>Í=ã5wò꽋X·Åqt¬å¾Ô„ç‰)þ½çGóYËkŸ<ל6ðöÌäuÝŠƒ€¶N1iß²Ë/®{¹Å±«£_<õÃýǾ¬íµ©¥²äÇaë—•ÛœwÜóÖŽ§«Ò»Žo;o½át?|ò?ž™÷Ös'µo¿|לM:âxíÊ5q¿•¿‡=úuUù]#Ÿ™9~›éìåÔ™›øþ¦+Ç_¯He웲£üªzÍÁWÛo=×ñlÕ+ï̘8ïÁõ½G·¶½¶ç_‹·¯ªí—É›~Š&+«:|öü¥Û×ö­^±ä¶Ü«ÛËÿr@×þÊø‚mýzéºøÐèþ Œ…¯m¾ëð´„§gÍâwÍ2|lùì!Õ*¯zsRvqUê»{±w冬²Äšv‡'ï /<ðêúžmmµmÒËPwÚùpIö¬Þ'ZÅÖŠŽ—¦ $îï=hJbršÎôç«Ëw]^÷ÆšŠñ{:­ú¾Ï‡­ª6¼pqtÍÔÇוnï½¹°®y±û•% Ÿx¦×•U'.Ÿ÷ÆÑ¡÷¥.<¼td—Ü„ôŒ“n/­ž«>»?ÿKZ[÷›XòŽ«"ï€bÙÿgìG‘£“²nuè«Âÿ^ŒÌþ`ÝÕ“uÇ:l]âK:áÒ{γ3ö™8¦ïôšé#jÓ6gŸ|YÌüŠ Ô`Œ²ÕíÓèdØÖÏœWÔ)ùÄmÇžØ÷÷ŠQŸßÙåÁý; Ç&ßfú¶®îüÁž]T/µXziÖ˜/–ö:ô•p³gªmÚ°/Öa5oßûÝÝGT;7öúäÒÝçã}^¹íËI?Ï­;úù4àêTSæÚWz€œûípÛw?ðͶ9uŸ¾öÃ(˜t©²ëT½Á>?¯Ã”i©Ÿî®ð‹¹gëžÒŸÝš±,½õ¦t;¥;”Íž¸’_ÑäÉ-ºd|î¼Ä³4íËŸ;¹üìÜ9ëÛ¼­þóƒm[«ØŽ/Ù5Tí¾˜ÐáÞýUDÿC“ªMgø Çžªþôâ03ÕZÎZ:ÝQ×}â¢qEß”}Üö ÙÑQXT5}yêö]R<º÷þï÷=¸•´÷H=CܽwÙù“*®þõÞ]Õó6eti—÷ðc5Û­kæn´X]8Õ.£Ë=ÕÃÆTfþoÅAÍ*(Óºo·´3±ãœ+o?»+oá³/>±6uÐà—^Xí˜=oÑþ™ÌÆdåñ=ÿ‰~ é¼aaˇݘ?ü ÓôNµƒ¶hÌ:hÜÉ·âµ½úÔ¯î}eýfpN½ð×W/|aZïXÿ᮲µž©º£çGû>º°\¡~µåCFEŸ5›vOݳ|0®s%‘Ð5çÀÆåûE ®du*ᮕýò«ØE}×îÒ}çæ¯µ41è5æíº·ÎýmÞìŇGŸì´f×û«Ü3ZŸ›‘»>á‘u…Îè ß‚/W+O·Ûg]ÚæÌø½žÑã¿^øí¬\}ZÝ·vZÇ6;lêñqa?çäêqÃWÞÌ4é“¿Í;ÜqMe«{wO©Ö«ÛÜË}ÛÕzáñÊ^o¿³wð}ÕÅ—gÏX¾À´bÍQæhž3^è|¿½‚M~yÒ ðÀ§ó2-;M_¿ôš'¡è^/EùZ•Jå…ië#ÿ¼2'¥D³ïÊÁIý˜R”6j5À¨Ã 0eÃ<T0K9x€£I–nåæ`%Ù,cÉ¥ø|evz Ì£JyX.£”ÏÌŠjÔb‘þ ,®Ñ/}ú`Ê4‡ƒá¹|£P«Äb^µ˜K-6¦ÖŠÿtâ?½øÏ þKÿ‰µh„Z ”&ØD–:oké¸t Ðâ9 ü/šä@>&¶T` .ˆ­Ú¯¨:k0 Á£Ët¼UàAM‚¸ìc¦š=¨ûô‘2ƒ2 |Á¤ã¿qá8;´ÈŒ5BÆzþNþ†ïi°Üðœ,ñ€o&dV%YßáÞ˜2åEÜ—øÎ÷ö¡"H¡Q\ôÂ9Râîƒ^t‹‹§mò‘Q‡CÆ€ÑâÒ!=xXd4J7ú!Ó$–hÂaÿÆÑíÂW±êHXèü/œñ^l/<’tО ñÀ CXT"]R“à.$tÖ°^kÖõúð˜È»œ8">º°BB7`¢3É#â#ïÚÔˆ(éâÑAGÝèЮ;Mx½‘}cDœ‚û¤ 6©„½âÖýäˆæ-ç·ˆ%‡ÇHG•¸W…ÅHÖuNÑ Û WªuÒÆ,]XtäÞ÷ #MØÝçv¬ˆ×Dd\ÿ¿N9Ç r9õcžÆ¯³ÌIÆ’SýdÝà(ä(P¶Ч-„H‚Õ·Œ@j¿ÚëËC—ƒtY(6>#7dZއ¦@;yœ¤ÖA"LÉè6Œt8ÞÆ§§hTj•J«Ñ«µ¸7ÂôÁ ÙX’P”aãI†%Ë¡;54I`Ž Ÿr)'@ßã)8üÓƒáy& Q©tf,šæâ­°¤9^Xa2+À ‚å <æmT|¦ÂÇÅR–* µá˜oa¾¢Ãu H0-:åDLqxaz´u>¦Åuú˜ZR-¿…äS%‡ÂÐ)©Áí¢[‚ó¡Sƒazmh>´3fD†Ó©t!´éÔÆüthSg0  Cb0 }  3jBéUéCÚÐkÔ ðÅŸ^^ÚÏ"ÜÀB—CÏІz$xµ@™å(b€èÚ*³ÒA~|ÕÜ3_Lku%õ§.‰½·þf¹"R€ «oË J£×áÆ(wÆ®ÿå5XcD¬0ètïÿPIû?Ôz½Ê€·P©q(ø i»L¢üý‡¯ÿ­ÿnù«nÉÿºü‚쟼ò‡Ã„Nƒö‚!ùkÕ·ä=~!ò·ØŽBMÈ¥í.òyÒi;3D߆0(6ºÿÇ58îÛÿ£ÓkZ¨4h°½µÿçzüÌVèN³ÅïnPö7fæ(á97L3'úR͉(˜P)CQ,å°PÌl# )›;œByÌ´ƒ¤JÝÁð¾!ó`bE 81vA1À0Ìmæy`îŠ6§¹H tKí#óXs"Ìþ‘(§µ[Ÿn ËrX)íS@ÒD1KØ…Š"-Å,ìÝvÑÅ.–òä(À$ˆ…rð‹H¥ˆªÄÎf–Ú‡U:­´…Ëöx÷6$;ù7 Ø-É 3m«;V( «…!A}èEB316È]†™ëC• PœDcX ^2Ð7s®BI™ÜÙ®Bmƒ){!ŒNû»œóxq41v'aá³xÊg¦áÀ"«ìXB…´VÈgƒj˜\ qÍâÕõÎr‡ö¥€nf‚ã»±§e,ˆìA4Ç{Ìœ°ÙÂÍvdϺ,°X »%ä3I-‹IêkϤž —0'pÒ0•„YòK²r9§–Źþ.› <í"ltM‘ÀRÏHÀ3},šH@S(hÞ x+œ0T‡¹I‚'bÀo äw Íò ™ï0w73ìÀº5Â}¹üÑÈâO:CÅÂýu98ºØ™H;xTâC\vDž(# “J\•9ïbÂÈaNÌ"c@ª’êS^±Þ<ÈJs"¤)rdŠa ™ï-–E6A´ZYDÃÚJ ê“€‡:á… #GCuw.Â<šÄ:ˆ 9”1€ô¾(d  « –²0¬,Ó‰«^ÂͶ„⊠YÎÙDð…Gf d@r÷÷X}!’»4i”/ŒЗ`¹ßé¯b6©ñ'C£É+¥Þ|ÂxR€ IèÉ µ lA$LCÑãUˆ3tc)ÿ¬rfwÔMW>Ñ3µ¬þ¹^IZëë§‹ÝqÃ:éïO…maÓ¤|US£©&¬)þ†åRPô6Ž{·zɦHùj¢MR E¡tmÃJØUYá8 µmƒKj¶zCŠ à0€ÚGØF«‘ˆ ¬8‚¾n¢r&G¡›BèÃÀ¾nߣŸf6”½^z«hvéð†‰wE]ôF½ž†Â^) ¤Ja¶rpܣܪ$6.,~³½)uç{¤¡^|-ðxäêv²ÐÊ™1,Ï ¡ÊYe³B¶Â2/,ìÜ0ÉŠÞaÈÔ0ɦ¤d3NôNÅ+<ÍWvK à_8¤÷^ ¥þE ‹rû³$V8†åP4 o‘CWÄ2vN†ÚáÍQ;]ÓÕÆ4(¸éë–ê•/$%j”*ˆ™ßá ûÂD}’Ëð–ïtè"9qà5ð8€‰q–¡0 åübŠ% ›‹â@<]=o4'†8 0(R/1©€Tëzz½ ¢o-R7È•AÖ…‚ûæ^]®ŸòWõÆò4Gé}µÄVó}ÕÊó¹ÃMpy!h‚™àò|óÐ)¯›ßGðN¶ø ê¿p.ž€“ÀCÿáåY„1Jƒ–&$U×O!4½y† Ôk3*ÒXýñE½²ÍÁ(×—ƒþÝlAäJÃÖ ¥ú\"f]7Ê&Ôª¨ŒB\|t^ZUó7‰ÐÔæ„XElíA¬³YæÐØz X­ 6jHÁË‚bqq° C‹Jž1-þ{Ù’ÀÇPCrŠÌ'Š)_!‹W þÅ%ž6l‰bâÍbˆÚ¨ ‰Øyx_Œ±áÍ1Ho%±5Éú%°f™e½=ñM h´òÌéZ‡5×ИøF£1ëͼDœçR<ÚðÕ×-=ÔAHJÔÊ/UÐìÙWßö´Æv§‰S(^ˆ|%‚ò†w«5FLJNWoõ Y ž&¡¦8ËMT•(¦s½³5¹Áó8!)ÍQù}d$U ;Åä>@MB7 ÆhšDÒ?a’>á_4«š(Ôí¶}~*ÒPjôjâ­"fƒ©ß^§&¤Ò†'!EÜõÔØ0Ûø¶'ÉÿEÐ& ¾Ù¾,ûÿk>±ÑÁZâøåpúê ðNûo X–@ó-è£/=õe¯ÁˆŽ–Ý  ü÷¡[Yx´'HL 8PL9(–ð-+ Bb'’Hœ÷» °_Ø+ßѨ ›lõ PÈ·UžÈ%-Ngƒe¼Áí<7úÓ¸ÿˆ_Ð÷ßÉ7Í÷ß·¾ÿ½.¿ ùoùknÉÿzü‚¾ÿ¦nùënÉÿºü‚ä_tÓÈ¿%ÿëñ ”‘êæ¿Æ`¸eÿ×å$õ<ÿE8ÿC§åËþ¯Ë/Dþ!&ñHÀ¡”=à”‡$Ê)—áϲ†ƒ}€ü5¸Ùÿ­ó_®ý¯{çìÜÄ4’)¤5I*¬{wé¤Ã|ÔaØ“°dTJ<åP<äÝæˆ9L™õ×9ÆCes(?Æå@ó&ý˜Ò€ëПڈ®«6ˆwBš»°AC·i¢ühÊ"ª"SŒ)Ó>]® oÙ$©"Ì oÜĔŻœƒÐ7>jàÆì;Sf8, ju%þ Ñé¥yTJUaXVîP±oP WªS¼0TBØ€Óå{ưÀ*0H—à*=P¦eøÞÔð°¸xÊÑ@ˆ…f-.{‘*õµLÒKq4çª aI}i„°°Q‡ž¶‘õY @i²P$m³^˜¢‘€”­2# 5¬.# 5D## 5D#+°>HvVõAd²BꃴfÔ‡CÈðàlPM”O4b€ 36¾,°úbе²ðÿØ{¶è8Š+söÄj &lxÄË£ŒíX ÖôtÏ£gd£X¶${ŽeY‘l|I(­™–ÔffZîéÑÃò»„/fa ǰ€ {uÀ9`rÖ¼âåýÜ Ž œÀ²÷V¿{~ŒçcêØš®[U÷Þª[uëVwUݤU0µ]ƒP[1Ÿ» ½dƒ@D´KBÝE¯A`KtŠ LÄ= $ !`AÊg! .yYQÉEú!+»ñ›r|ÀŒœ‡ê)»ð…B"®*¢fA€ã´«#…5ÅE3 x”|ša`EñÒ C}7M¨ƒâ¢ Jæ¡! ¥²n™Ù|š°’õÒ YMhŽ»ñA›ñR©9ô’H@¨ ‰‰ªÇ׿’1ÊAÉÀü‘–4Ì6Øô€8ñÿ€œN à÷Ñ?:8›Ù'7ýêAØÖX3IK}DrdX¦ÿsD’É*“ÃW¿b2i,ÕæÕbT³!žUñÆ~ʺë…49-!‹LŽfdWÊ))Sß©Àè!Žº9Òbšˆ÷6N\¤$%’Š”µnü-žR¿¢?)¯ËJ%r¤íN.†d±’UAúÅàE‰›éI;‹ ˆ'%QÕ:7åH¿¬‹„1§;ó²¤2¬*q˜Ï5¾Fäõx•3ÃÆEMÔ£øêÄ”œ'.ùQ.à˜Mj“䢘hWÍÇiõâÉÄŤ¤÷hd“¥GºÔ*Ò®Æùü::`µæ…AQƒŸ#ÒX;ÿñÒ ÍHK¹Ûm<)e+:ц±ÑÝ Õ ÐÄ‘•E€DsD‰‡ ˜³t-ªhš^”+T4\X •œ%2ÁÒk¥ð›z̦˰ºßì<è2J&pœ;áNœýØÁ&ïr î¢jÕšp³é‚`m¯<(^'§¤ÅdÆ  )ʅƱiI£g¦©q°i%¡;‡26”é×cN¼–Óñyh¿ž,SZ6²˜jþ;9e©^Ewãd¢f‘ÉZBc¦†Õ½]ëŒÈÎH ý·ÃÖ•ÂŒâÔ°O×P'ïð[c`›jRâUë†GuˆÕöÔÖ*cq’øHFÖÎ3àk=ðž:= ™¾Ïkpp :Ì(iàÈ¥X¦Æ©&[9Sš U% ‡é½\ô³1Ì>¤ß°ÇáaÌJÕsÊ ôË'Ã)xA<´q ´²ÞÅÄZ‚@h=šæhMLrDõü6ÀlIî7¸†¢ÑE '¡ÀŽG?Q­ö¥íRSãÔ ŒYœ¶¡Õ„9³›(cꜢ€ŒÅÁzí?nüŽeð¦îqü ˆ‚0ê`Ù‘„G‹$O÷ÐÀ­0ƒc’¦øõšÙ}Tº2Å“JFÂqî§”LÊéS° XuÜÙpê˜3æJr¦¤Dh³1Snz ú¯®X˜š12N4ULgpÝÏÔR ¢k]Úmñ^r´E5½H2¸M'ôAF˜>:Ç©D=¢—HŠã’JoFZÇÔtC«S¡H˜ÅÛCI=IÀ\ˆßè¡ë%q{<£p çð‹Q_þé‘ 3vF"V¤—q0fqqcfæÒ›`Sâ˜þh¶-XôYÕ bjܸ¬ Édû‰E1¥$pÍÈÔˆIELЮìÐr¨žlEjª¹œ!\‡þô&9Õ¦;Í%/%mÔÉæL:Qáè±ÄddÌÐÞ—Ï»ê Ü‘áYͤ¤æê(ˆÕ´IZcÑÊë7MXü›†3Vý†QÔ…Ëzt7SȲ15"ÃácJÖp;ü€Úƒõ™ªŒÂætj&TW0!SC¦D˜£3x2x81€ÆîFã?•”ŒëC:ºêéšXÕwŠ(Ú„;1D¼^0£á¤«2¬Yz%:kåȾJ¢¸•Ì:Ì@¢÷¬fYü;s,˜K`IKæ66Î%q@ÂM(]¤M Îï#rͤ¤˜ÌÂðKÒ›6q%ä&8‹R3–/wµ ÔÁŒ”&µÝú¯É˜'[cc‘lTʺu‘é/€UÎxv¿ ã?ûfX´±Õ¥t(*ºSÐ}Æ0ÞÁ’Wàybªô8¨PÓŠbt”¶¶Óõ›e$и•Šš:6cü>¿’íqÆp!Î%‹Ùå˜95í0Š9?ÚÅ쵞n‡¹Psô¯5ð µÓŒ‡aÁ…Ðã’1§`„ ðfÔïŒØ³ 2Q’…#CF7r 6!5q×~Ó\Çt  åC¾Oð!ìxÂû¸0‰€¾§`3ž"ý)àa[íD ·K ¾°Q°õ2cÔFÀŰe&Ø­Àq¼³0jÔ¶D#$j×pIõ©x­d·ÍU ›³ÏoñWy¼U~ªòæ£-TÂÃ7Çú•Òš¬Ó/#S² S-„GöNŠsYÎô ¨Ùb¼sŽFöLéNœƒXNôé´J¢µY-bÌy©8Ìåz 2l\¡ DŒ‚…ª€$§ø †@ØqŒö@'Ú…MÇbVËáõüY‰*„+f«âäÙ©ÅÙqÙöæGšâ RR7¦à2Îõ«b‰©PpšÔ®jy)¸ìê‚FÞ”¬:D岯c™V5›‡Ë‰P;¸,ˆÐeIÇ]TYÃânQDÐeI.Kº…jîP“­<:;ì F¦"Р۶VR¢œž‚umW¤ ÒðÑ_:!™wX‹$FÇš¿j8ºáÐÇÿpb`Š4&ÿ0í„óÎ…ªþ¿Ëæt4·Ös¾3çÑ÷6ÝÌ„ˆà2 °mú>)˜dI'Û*'ñÔÛŠ}¥YÂ{iq>“Ä3¶å­ó—)/øOxðÝÕÓöýþù«Ú§gÛ»÷Þ±ï®ì…¯¿Ðð– ê¯ Ê;o~[úmnÛ¼=#›÷µÿ<ù£Ý©¶e³?Šóƒ?=8«)Úø§ó¶\³ë³í«¹òéê¾þáæiífüÚ’Øég]SóµÆß½·úãGw\üï±Ô«»ŸªßûÆ<Í]÷°:ã«êÕmâ­_zcCûEÍ;ÚZã§.™~଻.8¹wgpóÎ N}éá·Ohô½öÙ·éTòÒÝ7üäåKù‹^¼¬nþ¯‡O}åô7v}øAàó¶+3êÀÝÇÿþ-—Ï^wð„WG[N¼ñ¾¯|ÆlèzàŽ–õ¯­{móâç®X·|¦ü?xóNaí ÷ÌdïÛ¼£ÿÙs¶¬¶Ýæ»äAñùúÜÌ•{gm™?x û•‹k^–^|æÒ3¿¼ž]uÞ_o˜õÛïo~üÄ7î{bÇuÿõÞ,¾èï7M¿äã—ß_ÿÉʦÍy,øO3®»«s›ï¾+NzhËË·úk?¹éÂ}M·µ5ïÎï”ûŸ™uåõ¿^vѹsvmç}ïoº'tÍií÷ýîÛs½Ç½óõΜÛ{µ²îÞkÞúäåßëçßS»cÆÆ³7Ìxõ7— }ðw÷¯ýðí_Ý.¾¿jóK7‡çíÙëûñ »vŸxÚ¼À)¾}ϿஶOfÖ>yÆ7·zwüëÅmøÇO‡¿÷Ö>ÿá)ÜðæŸ=«®¾íñM¿â1Ó"Wýò醯Ôÿü¶uíö»—ñ§ïþÁ´ë/=¥ÿãþfæy—]µ÷êû¿uòŸ7½Ó:øæ¿=/Æüí²ö,ÜpîÞÜŽÿÞ³açC7&þúÒšÞg6¾{Ú]ëCÿðø7îüòÞ±§Þ½õ?÷ìüöë{cwÞ´ÿ©ý'nÞÿ›©¾»¬ãÊKfìyð¹7¯Fôyæôý›^}ôž_²—7üËÖ‡øÙç~­/Ô°øƒk…-ÿܬ¾²ö­Ñ]ßÛºnËâ±gž^<ýÑ?öÌë½éÀ-wo¼ú£vÍ8¹N˜9ûöO_¼jiÛý×5<ùÈ¥?ŸvñûW¼wÛ ZßÍ│é•ÞÛOj»åùÛ¿úñîÞ3¶¾ö\âó½—Ý6¸~âÄîgŒ¼sðãíÿ±öìå ÿòÓ­¿ØûÜ=ûk‚O=¶óÚ¼ËØ¹Ñg×ül_MCÝ´U]LßöýCßÝþÄcg_Û°óS0ÐŒáO8äÂÆÐ‹ðœ Ú£—©,Zwìr)!‹‹”1BwÄ»ßz¶“n]#~ÈE·kpàØX£gI‡ªÄ»$­›…AOؕҘåZÆ´%ôc ~ó£EZqÓ8ÇÓŒr¶)V´Lw”8¤ÚÙËâ´@ÝG„Ì|Ó‹iB¹&”í a—ɉ 馕êdz žŽA:Ž¢œ»¾EÔĤ2h¢xH žö±ªÂ°+:–®±ÑÈõd¤5bŒPS.%0#Á -b~0v³MPlUglŠ[7¶ scß藋ڀE™EDç‡ocx®$3“}˜”Gsw ´1;²à©&âN؉‹ÄŒ„=ÆÞ©W a6eqvyr蔉l\Rk[º:È’!%£éW¦ÁZ• A%èÒ[VÒÍ訹÷sh2„9Xùù#¾\IK2Î2×z2÷”<ËŒË]¶)‹'Jk{ôóÌ=úæ:<ɦ%¥Ú%uV+Ž©ÒÝÉØ·p_2 Æqa%4%mÁ OŒó‡½0”ÏË9óaÑü²Ïò`¡(—Ÿ·xz`h>,È/ ;`š±¥Ñð žîT ý©nÁ£_ ÑU k&ݵÛ߬ÿæØ-Ùqµð“¡Ov¬Ë‡ô2ÔÖU66ÑOˆ]ÓVÃÔƒÇþç+æþ—`õþrü#ÿPUþåù+FþáªüËÜòï+CþP¨Ê¿Á3þC•!ÿUù—%xä>ÖòçÂþêü_Æ'ûÚn¼)¼/2äƒÄã.ñþ?8ëýGù ~è.Õ÷ÿe.ßy²GŸ†ÏÕíô&ÿ!Ò ?¤ST<¼ïrBP¨/å ߘ€pË‚¸s9&Gï»Ç¨q˾”¡·Ùãã¾{<Š=,ª9=ØÐLIw¶Èn¾/[ ¥…ÑßuüÛ3Ë Hf/˜=˜”û}C³gë™ò3(CÈvV““™âùzðò¨ï÷œ3‘3=ø†lÐ$%è u_ ¿»=ͤ‡Œ%`Ö0 ÃÄŒò iXù¦ããúyi*B²5ý ȃYUÊu/µü7 ·1IÅŽ$‰#ÒtA‡ ?Å)Ç3Ýt'Æy|HÖz'6ÁÇóûZ_3¼.Xh1bPe /æ:«¸å"CFÿî#$dº~rýW@·5cfcQ§ ˜óÈTÆï§• UÚvòõØO¾=±{¿”±œMqö £C5ÜmrFËõdRb2I±£ßŒå«î&DÇFÝXPÏ F!Û„ްwÆYÙ‰fIà Òìt¸q ´GÇú«ä†^|ƒLVKÚz)‰J£gH•&€™¤¦4$!m”&-¤O±Àß äKKšîŽ|Ò\ {Hi/#çë¯Ázýø¼dV|«ÞЋ/ÕùèˆVñ ¿Þ‰‘q?s¯Î‚fÅöR†qtˆ‘52ŠW`õKx]Ä@69@N²:¶réŠU+ISû²º©³³©}åšùÔ{‘©Òˆ¤ãAWU2 Eí—ÖÆÑ5Ëò–ÎÅK!Ó¢X[lå𭱕í-]]¤uE'i"M+c‹Wµ5u’ŽU+ºZ|d¥9Réí&ó¢*‘¤ Ã(4ð6,•ˆdQW³~Ù˜™ä#èÿÙ1½Ö8;”ás “W€êµÞ³›ÄtÏOøhÏ—ÔTÆw¬'~#xÖÿýÇÚþ·î÷Wíÿrüã#ÿªÿ—²ÏúO¨ùWýÿ”'xÆ¢Rä_õÿRžàÿ•ãÿ«*ÿ²ü+ÇÿWÕÿGY‚GÿWŽÿ¯ªüË<ò¯ÿ_Õý?e nùÇ+æûuý_žà‘å¼ÿ©®ÿÊ<ò¯œ÷?Uû¿,Á#ÿÊYÿWí¿²ü+Çþ¯Úe ùWŽý_ÝÿU–à–¢rìÿªýW–à‘åØÿUû¯,Á#ÿʱÿ«ö_Y‚Gþ•cÿWí¿²ü+Çþ¯Úe ùWŽý_=ÿW–à–¿T9öÕþ+KðÈ¿rìÿªýW–à‘åØÿUû¯,Á#ÿʱÿ«ö_Y‚GþÇÒþ×ï¤ç«ú¿\!OþÅ.7ÃÛâÜ€JÃSlpñó¿xÖß!ÿð%?š X=ÿ[Ž0gfGW}SBé—êyŸŸ™3Ǹ3­x/M+ygZ”lÅRú}iúuix35^—Ö@–ØWS×BgK'0¿Û÷¯îË7"¾[Ò‰ÅJ*…7 2ÔÙ¯áûÙðÍ6+Z3ÞÔ Äõ+»Ñq³ ԯ瑩¼³Ãm¢&§92ÁP+áÆ‰¡ùËQD QJXÍ“Îý¢$ia¬.ž¶€Ô ž Æ¬E³HÏ V”!*‚¥ÊR Ö©=ìs…QSª7ãÅkÑEd ^ÇI¬!A‰6€"¢ Ú ÑpÁÔCS-ÏŠ~Ãà²èè:ŒÆ¨ÐLDÆ(ø•=’%âU¹a„ 6vÇŒ[RLÅÊÄšæ'×·È£·™…I¢¡,{’°Ør»ÆZgFQ„ÆHktx*ó¬˜'‡!åÌ\9;¸<ûéœÅ7›Â<ÁxÑ&¶MŽú“‰7*X=öab Zðì+(µ ÚŠ’Œt± É.Ë2Z‰Œˆ‘(šéPi_‹ö²ÎõA‡Îña©®˜S?ë¥Ã±^„Ž‹î<Î"2¼]+ ù ?Èì¡ó™™.f›d´q©Œ‘s²@ƒöh‹Í¬ç¸{ë9ÿÈ aöÁÔôh|æ/4ë­Ð_´55Áš‡ü©~‹6]³HÌ]]Œ2õx×*'ÊàVvÀíÙbžH0óÃfµ{üluºÅÆvÃ6ÝââºM®ž M¨Ä@}²à$ª{‘A n’QciCËψ3º AFyiWA¡Qc/öÚEÅÆvG;’‰ˆÊ`þrs*ç¡ef™!cnõBU%ÙßÂ{@ øÏq ¤ ÚdÅQ½ˆTÚ óV†­MÄÞ3ž=Š"8“®E&”ó¢DŒH‡µcì›ÝIÀq{.XhL¢á†¦Ô±ÎD$¤ü# 7åX;÷ÜÛ¢g÷dÎu±£r¼s<Ç‚”C„ãY–K0+7DÜR<×Í'훚:HõHA’j·μ;Í~!rvCÍ+ î¥T†Ý:ÙnQ+IŠß­ŸìVE¨ÕÎŒËÞp-suA„ìÁ+Cêë–ý˜£ ¾_ ¡Œ²Êk¡PzàÆå `8roe8]É'Q¦Ü“n]õö£®¯•—žéås‘"“¹tê#muÐÃÖÇÿ©"H>Si’'Ê…ê6(ýÀ„Z/M)%Ê XºBM¨²¤ŒÄ¤¢Yhk´3ö`*aÒú`˜BÓ¢0Œ8pó0ÿxI,DÄÅ(ûõ@æ#÷<˜óQnwÛáÌÓΠ&A”³ûl Ù¨š©c{ñ´‹ù®ª E)ñ=ß:¶˜€n/uš\5¾]Îk8Dë7º¤?<ào&[§­@î˜ã\e@€¿=m³"/-&S}‚]àå“[;ñÒƒFJ¸yVU¿=ÈANz6€©z_m×L¾x‰T ¾ØŒN Ùè$Tê^ÝȲ|Õ ÅBóÎSE©…ƒHëoq)¥pµV³±Î¾ì)ŽIí¹CuŽWžç°‘ S;)•"•’Û÷Øêc_ôƒ·FÖ{“À“'Ç6’³×¨­¶HÕRüG%óÇéÅI…ÃËE§È»õÓ û’…ˆ{›BdÏaž>Í’m3È™'«ðν=™}åžI"ǵ|æl¾ÿ(ÐyùNÝß  c¾ÿIå”DŠ¿ÿH©Ð÷ÁJ½F“«È%¥èD¯–hµR’’i%9¹ N"%õA‚Pøû‚ë¿P—ëŽzÖ¿ Í=á÷”Œ¤BüA ‘©ý£É©(rç÷Ӊ䄄 sòE±±âÌ{Rh[%Òĉ#|õ N„¹Òí¯:}\ì`zM¨dÞù¡èã’f›.=sבíǦ¾7~É¥5«Ô´.8{¼W«„‡ ^\’üzë,ñºè“×ìßVtlÉcÍLÚ¹»§uŽ¿R}¥quÜåÇç͸öG刘Iç÷mÐù‚¼Å¼³Ù[Ï$%?7m÷sî­¹ÞñÏŸ/>¼ªåƒë†H¬S.ý¶îpabü75ó›ÿ:9¡G³Ö ç}¹kÚ…Ù»ó>?{¡Ñ× X4ª:QzhÏ¢²ÓƒÏœ ÿz󰔟òšèxéí ]î:·sа÷¿¯Ý¿kÎévêz]ÿbÌÐmÚ.–þ!ý«s‹9¿q‹ÉûÛµ˜´|ù}ßG„_î\ÒxCÚ¥ ¶'›ôÔ=š²éOÎÛå÷ãíð?]~š<,¡ò³!ÙݵºsíüåoÇt(ßùáñëUÍ;öÛÛy¦ZûSF|ž9ñ½7šÚ¬3äZÓ/&Þ½rÄ“*ªfœÚøÕÄ©š7ß_B¯;º£Åo¥=¸`‹6¶OÙÌ)Ë÷Ål&RÒÎõ>ù@ÕØϬùîpD³þw\œ;%-½j÷ÆÖÏGw®êº&7ç⅂ɉ/,žtbØ©uãºòÆcg¶žJøáRlê´Ù‹Ö]è1vü{«&$½ÔOQvtiií…7Oï û1R÷ú½vœüjqãu쬌Pôlô©iRµ²öÁ˜a¹=2k–®ýø¹9WÊO/Ú9»}›?žhkÜVq®GÜMå[ërçµ:8÷X£·®46UN¿¿yÔª÷¾0¹Ja7{îRUR»ÏO›P¹æŽeD¶Zrõ¾´öézLê9÷±Ë33‡Œ”¼©žº´£¡÷°Ñ—GÖ†};êÎ&‘Çè©ßõXÚî°¸÷/ùMª"GØT綇-ÉIJYñP±)¾ûç}×—çÐxNEÁžÂ·½ÕâûQ¯e·;³«O·7vä‡Å¯®*ot OÇ;Û¼9lFùÁ¼fg¾»|Eõ4Smø¹u/gU·³+›|¯pêÖµ;¨C›žÉï¿äÄ„™5W-éÉ‹ƒ¯÷nÙ|uã›óé÷?¿¯|Ê&éæÚë/Ưª•È}.㛘χÇK«&ܼ¼è¥½O¯ÿ"Ü'·uêaêùkË®7î;^väĵš»ŸÙ©,¾¡møúi Ê×Ĥ,ŒH|ãä2m§ÿüïÔÚK{?ÛöÊ“.[ñjÚoŠ‚Ú„×ã"Ç6ÚñÞ†éÈAcú PÁ.D•TÎ%ÉkŽ©bðîăô:ƒ¦/]Bà÷cÙwá²Dâ4ü"!A¥ðËÛRXÆ(™=£[T3­M×[3ÄÈb°ï躄k~˜B$sI"¼BNR8‚Ö¼¸ÉD[-jœ@‚Ö´,1lð­&!çʱ•–Ú+MàZ¸ÚB<À ³¸Qi¢,¾•=¼KIa{QUc¤Gr"¤Nª”NýcoŠHœ’:ˆ ãâØ‚j§‚¸E"öj©P¤ YTrÔ#ÜÃöýcqtÙ´d/_Ú‰Ó¡4tû(? °×w çʨÐA‚$H© +Ygeê{QoExݦęÆ Š—«©„¹*Gf_E3Æñz$Ó,Hsh†$Òq=O8š”:›VoŽJHO%’òh‹•áóDgURŽÞÚä”Qýz;¥DF)Htò#)”?ˆÖyÊb¿lŽrþ°9³Î/›á¸+f(<£2™¯›3™Ï›»ÃwmV£>*©»½KÌú\üR¤Èm@(äp“)—`ÓH™“=M¡pM#ÑÒ)M¢–º”C%å®å\¯%)t¢wÑ+q¹–¤*—4™Ä5M.s½V®ä¥YÙ“(~ˆ_TÀwÄi4êl[àC°\š`L‹8¹‘õãȰþjBU¯/¨‰\XÝÝ5%K„=ÙŠ;›T)I§3m(xœüÿ†ƒÿ¦ á#8ñ5ü·þKP‚Óø7ü·þWP‚Óø7ü·þWP‚Óø7ü·þkP‚Óø7üçÿ”à4þ ÆÿW„øÿ‚xãîw·>þ”” á?%Æ_'‘üíøŸr<þJIÈÿJpO·³û,Z€:¸ P`ÏÏ¥RÂ{þ+§àù¯Bzþ”аð?)‰<„ÿÂÿ á†ð?CøŸ!üÏþgÿ3„ÿÂÿ á†ð?CøŸ!üÏþgÿ3„ÿù/ÇÿtÜòÿÿŸâÂ;£vd xi90øŸ·®Æ'üOîNs`1@¡·A"”ð>“ ó/„EÍò,(7®Áüòn”o -Ôcsvûm ˆ6LQ°‰€"*—ü PDÙÆðÑ’yØžl¹¨ÊGQ(«Ã¨Á 6T$QhJÚê”(¥ðJJ4úJäJÄ J©ò Jü=P¢hÞò±DѼõKjÜ ±D¡‚ÿ,Q¨¦X¢ "X¢ &ÀX¢HE ±D)E±DAø? KmÁ< OˆÉÔ8QFâ?~ÀU‘Î*NJå?,QÔûKTFý‹±DÙFÚ±Ÿ)¼'Ût6ŠÊú†%êe· 8(“ýýX¢Ð$‰ ù¾c‰JeÅùÇ-þÀ9ÁÅþÆ™Ç-AÇEK€%Š–€ïX¢¨! K*Ò °D¡" KªX,QÐX,QÐà',QåW,Q`,Q¤"ÐX¢ "ˆX¢ ÎïX¢ 4X¢ ÆG,Qá,Qô¯ÁE‡ Ð'Ä$øØX¢ðÇX¢èôâ¤Âáå¢Nj¸X¢¡ðÏ >~ÿãlÝßÿH„ø¯Æ•)¡ï‚$z™D­#µ$¥‘k5 µ‚ÒÊuŠRªTÉUzòï®_(6ø¸þ½Â€­gýËàc_Á÷Ÿ”L®”†Ö0‚ñ_o0ø¯ïÝS½úøúœO‡~8‰¾”Ú*ùzØ«] žiµñûµÓfF|.éØ7lì¿$ ã¿ÖtêÖìákó{.š¶¸2ó뤢êY‰ó2“浸¹´Éˆ´-W{®ß²;éôŸâã:(G»ó΄µ»vî,ïz÷•î?ȳðÝçî7ÝU±ý÷Î×[?üT‹/óîßZ<°iMË /ßóùŽª›í=s£¢¹jʬÞ'¿z±2~¼¤¹)|Ï`ñÉÉâ-›–åçUMþOJÓäØOfµž{TÛçlñŸ÷Úµ¸å¥fUöìü™ôå'mzèÅ'>W_m~µå¨×~9[9ôׄG Sbžü³Ëg§è™k~m3b¾òÈ;¥’Ö»è9Ȧ¹Ðô“‡nlÿáÅ«•£õIËɽ ÒJO[öáâTº}·K‰‡¾ø4kë«ßUmïrzàFrU¯•>xnYǸi/u¬h5âÝ/&kšŸRôKæú—{§oû$½â„o: 4¶j;kú~åp}“ø÷”KÞ*}$]ÿAÿÑIôkCÛ YÔ¢QaÙØ•óÃj¬[_Ú¸âØ…ž©)mßÞe=òß…ÆGÏ:µÈž°±ç¨gßÞ&þºlKYÄWßv\?ºøê7DÍökÏž_Ø~[×ÈÄcÑOY^«=3.¡ë§wfŒÙsw›îÇ›šÛo[0ðð›ïyê½Ö¿òÎo?Zxvî+&>½¼(ìã®Ê3ãžØÒhéÒCíR'è:äå·Ûß7éÑñ-2§»9ãÉ ]™põŽ¾Ã§¬$üçØ};¾Ø»xEþþ®Tâýš‰—éݳé?cgÓmÚÎÊÛ,§ÛdÝÀÍáW´xzYÉÁÓ•­£Ó:w|üÝá'6ÜŒºPm-ΙÑôÞãE‡Âg6^8´æÝ_&.­Ho:¿¤ýþ“n®¬þõÎÔŠóQ5¢Ý“÷?³ê³¾eÅmúOüè7-U×.?ÏŽßfU·o¢Ú¼,ç¼è%ñTýÌ•k?;8ýÉ94gMœ@]ü]ïÑÄÀ(°cö2#ýÔ<ñ‡â¿¬¢«ãH«‰6?¿ª6ûí§;mº±²¯¶ÇÁÜÇ·\[}6ìE×äùeo\<)7^u¤vϹ×WÙ~}m‡,F½'qDæ²–{Ë4{ÅÞ}¼²e–xÿäOÊç¬ù aNܤ?5ùiÇzÏ(°2òVP`™7"C(°> ÀªX9ÙP`)%ƒ+“†P`ëE•(<¢À⬆ƒ«rEOU(]ÓHJáŠîꊼêÖåZ’’J]õ¸;—SÊ\Q`I×4¹ÜõZ¹Š—vë(° ÎìM+ü}îÜðñÖ!çÜÝ5ÅVºqÁÉÿ'þ¥”„ðß‚œÆŸj0ã JpiC2„ÿ”ðìy` ×À5JH¥¡n[WIæÍ¹£Î’8¤A4’ìF¶‰Mä DŠºJS7qE£uuÅ-G[wU¤~Ei¨;„ÄQ~óf6›ÙÙdv³ÇØê¼?²y³³3ï½ïû~ß›ï¼÷ù ä;Œü,)’@þ„ÃÈ_æÿI’ò'Fþ2ÿ]’$¿] É_æ?J’òW:Œüeþ»$I Úaä/?ÿK’ å^'ÿWöÿ¼†$ÿëôÿqïÿqR~þ—0É¿´Yµð­[` F¦ŽÖÄ– \úú”"IÌPþ(Á–×H‘‹ÿ ÷bÊüg™ÿ,óŸeþ³Ì–ùÏ2ÿYæ?Ëüg™ÿ,óŸeþ³Ì–ùÏ2ÿYæ?Ëüç7›ÿ\ì2“ÿÌ<~þWùÏÌŒÙÿ\æÛXÅæ<Íö¥?ã!J ã”úŒ½™ÐgÌVÐgN˜RrEEké¹”:Ø›ÜXæŠÈxgÅ;Þ§Þ¼3a@\fêÄ'.모0[‹w¶ÁÍÄðΘã ¼3¬«yxgÌZ¼3&9Þ³Þ³/Þ“ïŒY‹wÆ^Þ™0À;3ýÖL¼3æèxgìßwƬÇ;cÒà1ûã1ûã1{â±ÞÙ½ 8¼3àðÎÀ&xgJ)¼ïLØïŒqxg¦žŽŽw6pÆ ¨ÊL}øTe]õŠ¨Ê˜I„³øœÍ7éL7zý˜fÌÓ ëd¦™yv²/ŠH‚b6B1ÉQÌÀ(f м3f€bfZÎ<3SXÁ-GÁ-ÇÂ-»ã–ÝqËÀv¸e`kÜ2°?nØ· ¤Å-{à–4¸e`=nØ · Þ$ܲ! p¸eÀá–MpË”Rx n™xÓqËÖîÿ0,¾ÿ)âÿ²û¿0 ÿ“Äeþ¯$I‰ãÁxpPÓô¡¡¡t0AÑTªÄÔ*Qs+uMþ">7Éw[êðwÏo:Ô©MfÖC_,zš“²õ¥¬Â#ã:%ôÌÚšÞùÉØõùõ¾è4æ×¾©Ñç6Ý·¾û“G8ÈHÜ5rÈ_ó¦­ý`ݲèøßæ|›—ò{õË5ÇØÝ',ç²æñW™56øºT<¯A¿ûõ;ìÏUZƒF4ךÆÏZÛýhÆØ6)k&=ÖÝ×úE³ˆcýª~´þ`Êž{Ò†¯4oÝð.Swý¤f¿ºšk7;Ä­9xÆŸXÐNØ |x–gJÔ½ûëžÄå~ï|¸B@ì°ÓÃ6,|Ðla%ÏŸmÛÖfáày÷g¢ò.x{[Ôèü+Hzó'>Ò¼åÙaLJN8Ôjö‹ ïýïѤþM–—oå¾zØç·âó'ùeϨޭÿ¸ÂH¿‘?zW\¡Ù˜ö¤Üºà–æ÷ü8ó-u“¾+cU5›¦ÕëÔ·î_®,û¢òäJÔèÜsÎßö²°«by…#/ Šêßð´«oÕÁgOV´<ÜbQäûñN‹Â³ú½túeýôk§ªþÏÇ«Ã[š«7;Ìoè¶(É·`›÷dÿ¤‡›»F·<7ãæöé鳆ÿù FÈŠ;Õ³ÖnÏ9y&{}êÁŸ6Ûš>xöªg»ýö¶<óç¦~ë¿ÔîK:¿kÇ•ñW¼ß)=r‘†Ö/ÿú!Yq˜ïÄ®þ+Êu-ð˜Ý"!é öûÔ« —U}܃ ܽOŽ‹‰»“öjÚáܳ5?w DNžHÞ³"ÞõyÄ^ï¤|Ï=;~Ô{Îßeûç\ÎØöx÷=­ÏÏ«ÝSö¬«¹›š~¿ƒWìö“»ñ”NõÃÚe<úÜmæøuSÂw}}þ+däÅ1ë“{ÖNY¸kÌöÕ^–{ž—±½tî/†•…ûË­„“¹¿VpIŽû‹+û‹ë¸¿ˆÌý5ÍýEKçþ¢Åý¥(cþ.i| ¥1Ï3:¯dî¯ñoŠ–ÀFŒYÀ(iÌ Æãcnü[‚â+;÷÷ôš¼(°íƒ)UR·¤ï½ÉÍøˆ÷—¤eî¯I0ÿwþ«Ìÿ& äï8üW™ÿ)IÈßqø¯2ÿS’$¿ãð_eþ§$I Çá¿ÊüOI’@þ¯“ÿÊúq óÿ¥LFòתGÆhF-ÆR†ªÔQÐóaïM˜ €K÷ÿãŒØIžüÑr ¨ÿ²ÿßþɱøoŒøÀdþ›Ì“ùo2ÿMæ¿Éü7™ÿ&óßdþ›Ì“ùo2ÿMæ¿Éü7™ÿ&óßdþÛÌ+ö™ÇƒkSpJù_Ὴê÷dÒ8›Ó +0‡ãqø pÖÞHÆGT@3t8sþfýÎ_ÃWºm²üí¥nÆ=°vÿ–ÙDb œ`®‡3ŸiùæÔS…Ñ<¯z´*:Pf³ÿÀdG*U¾ºêÄ€â8›-Ú™³”>Ëž\œ-±;•\ÛÞN¤S‰) ƒ}€E].®4»¿ñ÷¥’¸ Øj[@ë„.ÚšM@‚ÜN¯ÀhT0„mÛ¢q,ƒ)0 ànH%' ’¶xçœy%dˆÀøö£ØHÐ4ó]é¶ÉNW7‚ò Ð#Žc3ÊÀþJYnO•ÊÈ„DEI„)ª‡®ÅØê0Y]#ÕN—eO.ÎZ±ÍíÄ(ÓÇq¼DfZÕJ. WQíÆ¬ToFGQåmIE™ÖQҬʄ)*£èzåKØâ>!\•ù1ϲĘã(Á¾9(3%BhÞ÷4#-ZÏÃá÷Ðxð¿gÔ gFkX Ç8Éâ¤]c­Q\¿š ùÚÍü6ƒå¶Ã’‹›k:”üñ„ÌÍK ÖbËì©ÂÕ<Ë¤ÕÆiC4ð-­”¤¨>E8S-¬[TK=ç‡âg-A?Úävb b#)# ÂkÞ2Y‘?Eç ¶³8JÏ'0h3$Eà€5 °í‹çŒÝTÂyÎ|b:Qò|¢)‘,Xœ}ï Í)|j±UPyª‚BxVA¥¡‘Ôè*R¤Ÿp ŠëAl–ÔgÙ“Isx䥓`mq;1s@抴‘9€íZv; ?T¡ªì:Ît#Û*9Ê”ŽÑ^ZÉ.Ó`•GyJN±kX3IN„åð¾7]É)¾’3F.Ýó4 µ‚øä©Âp¡’ª‚bƒ$Uu]uôC1ÁfõC1WI=•ð³–¨ºMn':òÓìÚ§’Tm\kõ½4 eµ!€ãO1[Z(fV ˜Y?|r`-‚ó,Æ®_c-¢ÔÉG ÷(YW‚°ODÖš‚²^Þ\[@Âß«K’¬åE•V8qO¥*ay®”C>WýL°YýÌUP?~Ö¢!ß·³ðá2ö êÑ–MþE\ÑÖ©=i½Óç»X‡Á¨5`zIn–Û—?@Ù°8û ˶0ì¬ö«‰¥è%j壿e—7{ `ðôÏøÆºàM,V{ÌS xjÏTV-­ÒSüA(ðß±Y^“ÍzëTºÒÛâv¢ó|¼Ä·O°]ˤò|E<Û[9¾[ÿ4«X nE›… ö¶ói÷ñ»¸•i®@zMƒŠWúÓ ½.oöøÌåaH„}:@up´ô‚ÑsØhüÙ; ¡~“,ŒmT³«žCZqô6¡⬙²\Í-ººÙïüûÎ}ßqX³öA„ZþZÜw°:<Ìòüi°’</k¡ûÎúÛ™pßÔØ}Ƕn™Ýw%(¼}ÝwLW³Ÿg ˜~húñ¡d fè½`½wð]?ÛâÌ€hwCPÊÚANU1k AY¯n¶!†S@X:c7i+Tn%_ÔC‡ºOó=x¸‚†Ú¯T@·>ÓÖJû>õÿ›õÞÀgÏ.xP La+\wˆ§ŠDKÔ{éç\ŠT†/)vªqÕÔ/¥A"¯YÍY¸cí­Ä´Ÿ¹nì¼+nY ÆsL€hx)Ù›, æE^cžðáÅŒûðŸkl»ª¿RLA1kÕß’«›­þ„Àå§søYáïcF}„ï¸Qkc$^±ÇÖCÿÌ 3ú'n¶n|¿›µ^>kn$:Ü“ cï×–e|C'Ðàâ°n6[÷KØXƒY7 —õ³«ìØxŃ;Á†Çf§óœŸ‘µÛDpS«WfÃe8YÜ×)Œ]¹ŽÒð“àGöõ²°E ô:Áîœ!A±ÂáìNË%aáõßœHÿ©TVþ›9ñž„Iœÿ†Å"qŒÄ0‡ü7Aeþ› ¥i  R*FDh0ª±‚À•ªB‰àPðºË''û¦²ê¿9ñž„I\ÿB’„!ÿ“ÑŠ’õ_Šd›øOY‹zE6 ªL½ÿ¨uì%:»Öc"5™SñŸ‚¿|47Âÿz÷°vXvî—ËÎ|Y½Ç'úÿíÓ·^ǧ¯F]xñpG¿Æû t]£Žøš„wëÕÎl]9¦pGFx÷õ÷7ü“2!ïÑ“¸ãwZ…?í8ÒyüÃw{ÿ3öĹÇuvåÞhþ팟²Wn}¢ñÒi¿Ð>-H'ï¾Úù$sD‡íA?„{¶­›T{À„íï¯ñš¿fÂï§#=¼^dïî˜>!ü³¡Td=—Þ­o|´q쯴ÜZ®^¬»¡ñÞ¾{êÜêžq¥Õ‚˜ï ¯9#»{D4úý˜º!éÿäNÝø÷wWå]Ûš|u³2ñûf]ÚQ>ûî>ÿªùðçuö¶é]~nõÁwë=Üë¯x°½Ø:ïÂþÇòÎ}ÐîVÕfiKÆÓÜLÿªÏÔÍg}CûÖþ íøÃí«‡W™9n`HþÈz/(l?¦Z5€¢®¸ÝJ?¹6´j¿˜ñ+L¿Tí줕ÎÞŸºyCÓ]Y'+ÞöüFÙ~JÍv³v>âé·E•òw²÷ˤ֓UÉ?Å\Úlb³K {äWL­‘Z1ieåšGË9O¾¹Ñ{YØ,§7›ûmmô`YÕ§q˺øW®pá|…žÓº>ªçSyl¥¤Ó7²¾½—ü2鋃—Ÿ<\ÕÒ­þ†Jï¥9õwxøùçëL|–0j{Šó¹ç¿î™s£G@ÊgëtõÑ MÜ\óý6w"nûñÐvñ÷?Ö—h×̹ǥzãƒsŽ|1øË›NO“ÇW-æúÛÐÊ/C'nmYkó’ “g…^i~ú “{\B„ÿ#²ÛþkÛ½åóÝÝãþñÒ7¢’çÌ¥}é¶×àþå«…7©¸ë¯—³~Þ’yyÛ´1m?ëØ?÷TÅYc«ùV©Ó½ªK“Uå|jõùâjʈŸ†¬ß“ØöóOGå5JÙ9riùøy‹+_ ñžy¸ë¬Š{x¼çQoCÏ^…kÓ®æÌYüóN×­×pÐq†\ r +95 ñŸÍk×î«·±NQ›=ü¹jÙQï%è´=§ç5¯>*mAô±_k—»«º¼ìwÏÇyJåë“Æ× ™p²îU­²þ¥ê¾‘}Zü½øJ„ï㠪Šî6D¬y–ÿCЃŒÞõ»æYCb°«ÿÞi¿º¬n²xõ¡uNõ éóîg†öLÝ{ÅõGÚ÷ö_¯*ø!1PrÊa/Í:ëäƒWïq¼{Æû÷è=e@æàÿöl5äÊ<¿Ð i-®u}¶xÕõåxÛ;SŽ5¾?eÁ³ùûÞqoÐqåê6ùOeFÆÈA¯¶¸ˆVn¸îAª6bFËJħ—bo=~zpÈÑ>7* Z™GYóÀ7ÞÓzÕ83=íæÁaê~‡§„{üóZnÙèÝ7F{ '÷Öõh× tWãeçli˜Üï³Õ³ÎE<¬¦-wÏBIJðkØ¡GÛ¾]ÿ»ù§kç¯?VïüÀ‚wŇõ:ðt-1öº½Vžzèv-3öÜœˆS§¯÷^éB,ÃGºÎs"rs§¥§Fy}øVvÔÀÀ}‡ö¿í§9Òaàü´k~øÄœïâ®Å”˯Ósÿ˜Q›ê>Šë츺 Va³[¦÷¤ïÍݲ5=3arúÐ ÑÚIÛz­JÌiœ±¹µøeŸYÑÑ£:ÿ±¨ÏÔÂ#³I®OV´Nüãö7D›ìœã)ûüÔç8vÁ?èub†+µýKÞPŠ.Cø.ÈÄ&á»P”¾ ÕÇÊ*)|—‹.Ô—.ÈàN\h.ÀEô$÷AqJ Ê]o^,0îA˜cSP¢ñ·Ä(Öƒì]z½‚)R´⌲Ä+¡50 °;EpD<™y;–M–-t·à˜‚Ûú‡‰–ÇÄ^I“ÁD ‚£,€®ÇPñ˜qfíç2Y¡-´ äPìÒ~T)ÞkMn)1YB¼(JÆÁuì–{Ñ¢˜Xæn² ¤¸ˆà²S¸û¾B4IÏô2]“ÅZ £® }»Üº7ñ®kb¡ É‚(Mu]¸® 0ñ®kÖZ&“Å7¸Œ¡¥à¦\A‹w\sVT˜* *jvá’ n¢„xÏ5ÿ-¯É‰`؉u]ØT㈿x2Y~¸G£`(Ï:h0H ¥ƒä¾’0$Š‹ƒ¤ ¢ˆQ¨qðF’ÑTá1L‰› :VŽQLgÞ—,é<1:F£FQ„0ºŠ—D!8_x WŸG¢FõE©îA#Fçaf\7 4>3¾ñXF킵 3áà3 t‰â&]æ5Lj¡Ü^P対 â*ì Цº•pHê£1Äö¯;þ?¥ÃÄ"åø?R$üi‡‘¿ÿI’d(qùËñ¿¤IùG‘¿ÿWš$¿ãÄ–ãÿJ’òwœøÏrü_I’@þŽÿYŽÿ+IÈßqâ?Ëñ%Iù¿öøÏòø/a2’±ß8$R)qîcæ? î,²þ“ì­ÿÂ(®ÿB)9þ¯$) lL”:ši‚áêØ1Ù'&¸ĨÙ=/ð¼€ÀwæLø¡;þ φ»2Þšµ¢¯:T ƒ:%º°QÆÌèc‰l Ì„¢­Eg]º“é»'&º$º|¦VÀww ¸l1N¥ŽQ)B"‚tÑ{ØØ`ºŸ*‚´ªvxÛ€¨ h×$Ìðö½Õ£ûiFÄEÀ7]¸ŸÀõ‰ Ìîú¯Üu_¸³_{(\\bcMuEPÀø¡Ãš$$–X°âÙ²”í÷ú6°ô:ªÈA­ñÏ]\zè~©RG©ñhCÆpqþÏÞ•ÉQgÛÅŽpp+÷ÑŒìÎô=³^’V²¶"¤eµH’ØÌN÷c™c­JEÀNƒmÀƇË2˜‚ °)”¸IŠ0Ø`CqHb E$$òÿ¯¯×=;ÇöÌ´&¤_!fßÑïúßÿ¿ÿý¯ûÿèdÖ$H÷úÍÃ̈>ZÊk³›Wo˜)) 1”p}hÉ m"“SµÈ³›´=UØL¿8›¸ñâÖ¼C—•ªKÈxU*…®:-`Äì hK¡4l-ç^­ˆ|•ôjÆ $¶É2§ ;CЋZf³qÕ½ïÈF­¸]K“…= ·Œåµ‘ _º˜ëNCÞ$Í:—Ê­.ãÅ!èø¨Ö•Õ i\5K-\ºÐy3Û/ïÌãò¬{k¬‹«Qï⺷âUSnpL/ ´)Ð:ƒ[ªŽxÃ%DâÔ³¤4Ëkˆ«U$z‘L"¢æ°†èS#¥ôYJ’}ƒ«×]0H–­ÝD6.X¶vpÓ—¡$LäjšQžOëPí$Â}g‹Ó$7BÎ[9°b5”_¶¼oMßà&„]Õ7¸våúõdÕº²Œô/ì[qÁše¤ÿ‚þuëWvÚgº2ŒËê|2¯‘´«­m ¸fÖËòõ½v©•ÕEÖkíÎŠÜø4‚-²KL¥½¦Ùë€Ï¶t®îïs¦/)qéÁÀÓf}X¬îL¡Ë¯ü÷ìÿÊ¡ÖÿÂûŸ`ƒ‡þísÿÚÿ ú·ÍýÚÿ nú msÿÞÿ<ôoŸû¿ÐþHðп}îÿÂûŸ@‚‡þísÿÞÿ<ôoŸû¿ðþ'à¡ûÜÿI!ýƒúòû¿Ðþlðп}ì¡ý'à¡ÛØÿBûO0ÁCÿö±ÿ…çÿ@‚›þbûØÿBú<ôoû_hÿ $xèß>ö¿ÐþHðÐÿPÚÿŒ÷ÿd1¤€¡Œþs¼X¥ê£z1™fÞ­êÒÆç1HàÊïòœ$Ènúó”ßÿ ",:­}ç257¬uò]ø}¹é¡›x}#Tu°ž\…On ¯è½½"t“¯8î{Ãb˪X~y®”UõìèòÜT7ežˆÔϵ`ø^‘ËdГT½'cy|¥¬Vdn4íÍ{Ñ™24nxUVµ‘ˆ•hxXŽD Z±4¾&YÔ³™‰P—êÑ•ÙT[Ý ¥`˜ÔM¾6M+ žÜX$Ò·~Qƒ•E]ÃKdTƒÄ¢–ŸH¦ÉxÉþ;qW!D-Süì貕vŒƒX2U*jv åõ|ª”IkSv²ɪ®åµ‚^°c8šÇY±R$HÉC£v‚ E=­:E]‘ÒT=NZitc¥«@ÛèÊònpPÝJo78èÆJW78èFŸ»>vßõAgúÊꃱö¹ê åo1X&ÑM®Fh߉ÌÚE úQ-ŸIfÕá´ý £Mºa´ÉòÞ‰ÐlÒÛ¬$'aìIW_EèV’%Hy&\‚.h®.HЭ¼ L¸æí‚j®FaFuw}ÐM}Žú 3zY}0NÝUŸ -¨©|.Y´S ÇY×B’¡k9W›2Ô“+oS†®ä¼mÊ0Þœ»MCÎÕ‚½ÈÒɘO•Ü4‡^”ÊÛT +%o› Œ¡äjS6§ÝõÁM[‰,YW$€P @8‚ïE'Sè U3¹„ ìY­ˆÅf 6#`øoDϪ#èƒ#iã*ãÞ*>uÓ×ÞItU_/ÉjòˆÌÎñÜ8ý7Kô-]ÐìgfñeÐd:m'Ø¢Í+Ũd3Cª”G—‚´èžòô¬†]ŒÌÒ‚ÑA=£:rÀ=„“×Ê€žª¹<—V«dUxÖvT9§sÝpZ¿¤¤U)1gÛîìJ•¬È•ò@ýJé·òçlšÍ¬PA*­%óÅÝ›fɰn$bmw–ËÇn|Ï8û™ñÚý„¾Ý>E¢©\.¯v"ù:G’==M\ô£½€ÿ%KébR´&ºTËë´WqœRÉ´f¬hìf´/;±“V%éRãºbFuÐÕ!Z˜¢?G´©.þ â}ÈÈ€§hAú”{.Œw¨ P+‚&olÞ Ã‡&T„)Å–HO+™RšraÅGsÅ¢ñ(7×£ò‰•ªÒ³ Df¢ˆ¹@fL`Ê^$jà$”¥Žå&É ò9›ÎÖ9Œ l†ð.ÀW«2 ”aKÙ9“ó¨{•¥ªzr4—M¦ ît ÀX.w±ñá4_DCA#H$j£ÁÀ37V6bl½6ÈD•2t]×*”Í›E,±ÿØžF©\Ex 2Ó±ˆèd¡±B¤#jüÁ¬¶è66¢³ âuà›÷0Všf>ΑÑ"®é ê¿ç@·©$…Ęˆ±Å[/!”Æ:ÖIR#ºø,3}›'}Ë#²°.:ppqe3Ú4ôÈæRG¤ÃáT«[³5Õ|r’€Í _fáÇæ>LٹŜµeÀTëè¸ÍÌ¡ÀÌÀØc)&Õmô«˜=šÇÌ&f1Q£¼“`ͤ‘³&¸ƒVcÀÈB‚c]È1’·ç—ÎKG+"Öãtí)œµ–Inj<¯gè`S)ÐAúO›¿Stã5ÿ‡ŠDà:8v¤áO»I`|þ Ã€Î˜€(Hyšä$\=ê*äসȩ¥ÓúxA¢@,0Ñü4;qù)6æÊbs2I˜³)‹nF Ö¯!X"SdšóÉlÏý‘¨Z1¤.]¶è´ 5Ád>«H³*pwÔsAV5á\\|j'¢1žH'§µµžž„LîZ³dMIT·³£ŒHŒõQ*Ú¿ÙÓ{zN§Ÿœ¾téé¤ÑH. ý k´ àô}BO¡š”NfGKÀ~išá´M\³3œÝT3/vï÷ô,)Ko6~­ŽyŠ-]Z¡¥²A@ƒd†¨ºÊ™»m@2þçØ€°À:P ³Eêç³›ôçòèk±hjEL›‘Gô0K¢§@‚ZJTĨÑv†x³u·sQ@SÇës`Þ9lá0…°'kÅYxp~qûêÚc±5©çi% bšf ž• k¦ ìÙœð–¥Ù447‚ëGü„.Av¡{:¹›Á"x:Q_ €,|,ÚŠ$¦ŒîŒ}H*Q51×·ò–_ù&àGr5×a¥bŽÑ¤¤hÄÌ…`ÜŒ ®Øœkqîn4¯©*ë±Ï¡L+­Ö®±f®Q{)ú€luÒàht2AdÐ2cç”8‘°x^€ „OÀÒZÐIÚ„MJ_?óäÊ «5•× 9™`ñd• P!–hNz$ªòZÕû¹v æ`­IåbÌÞ1þYIÔÚ¤ª †Æ›ò)¸¸\Ï6ÖT1ÏMÌ I4AˆŒ á0ÆÁI’þ$ð§•²›€Y°šWhƒÖÀæ¥d…ŸÊë•\Œ ô¯Ï'¤†À§…¨šŒ³@#Ô³K›H:B ^6!3hÑaТ¡\ Xêò¡Á†|J¼’.‡¬¶|ëÌC&XÿóbÕ³ØóóçrXm³9s:þi±)¨¾À‚TÇ)f5…"?þ´TÄ9ÚîfÌ"sœgb~d€ÊëÖš¥ÍÑOv6Åj˯àþ‡JÔZP½‰gu*Ù¥SIÀOå!.uÕàóý¯yÁ@Wÿ+Æà?Kœ¤ÈŸŠñ¼" áû_AaXP†‡ù8?¬ñüpL5IE5.q nD ñŸ?áÁ'ÿÏ ºÿ‹Ç•½ÿ)„ÿü·ƒç]|wô÷oü0^x~§ö?ï]¸øŠåÇ<ùo;¿y¬üdöϾ¤_·üो6ßôÂç•G’Çÿ•öæÕê››¶?3òÙ_þ×éû'níºýųpÛ³ë¾|ľµ;ž¾ñê#G¯~ðÊg”·¾ý­¨z`íUýË®ÎçWýÝ«o|ãž|ð{¿}ÇžEŽ~u× ¥çºÞHœ³{ÿ‹%å‹¶ÿêÀmzøÝ{ÙûÌ®á§Ó›Þ;÷3+>þý™±½ëÛsÛ ÿtãüäà×ÿxϽ‡ß×uço_Ÿzî©ß|wׂ+ºNx縡çOzmë»}oÊïœx÷I/¼~ì-ßIlßuù­…¡ë?¢wßpé÷ ¿ËÞ{åß\Üý¿ìÙxåÚ¥},|ä×ï\uØ¿Æ^_wåÍfëµßÿó%+¯;éŽ57¨»O8Øûá÷Iÿ;ƾvîî—û¾®5xóÎûWï~ã®Þ›Ž¸ð냕þõ£§^yÏÆÇoù‡oþå{—¥ž½ÿão,ND^8uiïêU§œ±üª_ÜqऋvðÛÕ_;sÿ1±3¾ò鏸¾Ø9S÷]ó£~úøûgurŸÝ»ã¸ï²#.{û’¿ßtçÿÜiß9ãæ=—}zæ¬[®ûHÙ°sÁ·>¾ý¯úhtãâÃ.?o߉¯žèÈb÷CwáÈ/ܱàÕ{–½rìkg}ÐáwŸèægzž»ü;÷.è¸ç¨¾‘¥ 7^qý]ç=ó£·ážSä:†~ú«W>wÇî¸÷åÔ›—]ó³ÇgîùùÝ×|úáóÏ~¹gÉ~ÉW{þèKÿ¹,þÛ+ö-8êŽROEt\IäæŽKoyš‚˱ظ\=ظŸ$T[|/Ž"ü(ÕÑdkÝ?4†k‹GCPòéq¥:ÀbÝvÏn"â+¢e :¾b ÛÊ|`mËѹÿ花xEtEš º"W ]1O”¡+rW†ð‹ eH€ °”!)Î…®“y¹,-QŽ@ȉR9Zc"^Ž®ÈÍàÈËåå„D9Z£ÈWC%äj¡îéžyþÂK.9íäùƒ×ïZRžâÁ$侘„a.xôÿöñÿúÿ $¸éK¶ ýåÐÿO ÁÃÿíãÿ+¤ ÁÃÿÃíB9ôÿHððûø éHððª]评þ¿ þoÿ¡ÿ·`‚‡ÿÕv¡¿úÿ $xø¿}ü?†ô$xèß>þCÿoü×Ú…þJHÿ@‚‡þ#mCÿÐÿ[ ÁM©}ü¿†üHðп}ü¿†üHðп}ü¿†ø/ýÛÿ)¼ÿ $xèß>÷ÿáý_ ÁM®}îÿÃûŸ@‚‡ÿÛçþ?¤ ÁCÿ¶¹ÿ ï‚ ùß6ï„÷¿ÁýÛçþ?¼ÿ $xäûÜÿ‡ô$xø¿}îÿCûo ÁÃÿísÿÒ?à¡ûÜÿ‡öÿ@‚GþÊûúý¿Œ~ÿ\(£¿ó]kQÏhyøËkIu(>64¤j-Àÿy^déÏQÿ’ú"´þ—, 9â…ø_!þWˆÿâ…ø_!þWˆÿâ…ø_!þWˆÿâ…ø_!þWˆÿâ}‚ñ¿P}ø_2'/ÿÿã¶jÁÁ¸1j9¡çÑy¡±_ `6UŒK”£$6gÃä<¬ ‡àNbáS,€'̓µâê‹“%ÂÃäŽðbà>RTU†ãûX®X˜LŽ7±£*‡9 .CáiÔÌÀ(‹x"±Ñ*k«Ò2nNsUÖ‡Uå =æÄúâpâ䮄ÜÐ"jz—€Œ(8`}0U0—˜€ (ŽN¬ÈÒ㜌X “-å*IÂH NÀ7„Ëá¯þz¡9d†ßEY¼ ›Ì8—ýó»F?¶˜ƒßSããq¼5sÚdP¨0jÎÆí(-¯L¥Úߜ檬O 9W*rüüP%ëåy_h‘6÷Ër?®C†û9àzN"É 1XÁánN„¸ÀQþ¦ÒAbðýðù¸DĤǃfJ‹¥RžáÞ˜àâ^¼mlL:ø«¿nð.ÒÌ''@ŠH8Ið/䨚aÄÃd²˜Ss£AêÆPì Z¤Q{ƒ6hoÐ<õ¥4£¹ªúz‹Ž•Ikfç¡8‚`Э€k‹O)^•­³ã$‚zÀ™ðž8ƒ­ÝöyŠüUáz o¾Ógý~<Å„ˆg2¯5 äGUYš“«ƒÜõE½M†MÂÍĘ“‰%ë‘®¼ã7ÚTÕÝž› ƒÓfçùìöódèÆ¶ü†9;ûzÜÁ߃ÝñH9Túá)0[6'Å ŽñŸq àx‘ÙòãÒ—7O_êL¼:‡ÃI‚`ѳ¥2#†\k“Ô–¥qä ®‘á«úz%†Àb€óÆùVDm Ã•‘yÓ0ÚXžÖ0-pnAdñ4êœÛiáVƒPàMiÎ/¸0·EÁ¢È<4Öå’5fFLô«Að–˜3|œ§BOÅ(¾3Fqr[, Œ.H.‘³ƒÐ\8Çø—>ë¯WðÍ:äÑžH ’-ˆ\x8“$*³ÙC¾ÅC¥ñƒc2qbëI%*®©™©DpØÊǃ–Õ_÷!Na•=Ø 8Ô (ž-ï_t'¢ªÀêÁhµC¤ô™C²T1Ô${iÓ¨bGia¥2cÕ¡ø5¥¹*ëTLàñ%Q&Šé ûRÚzº¡`û”Ejjhà±6H´ 1CPE.(*@¢‹rŒ–DT v¾·hdür-%¢(”íñðÏZ-tDb¢ÄgýõÛƒšFLgßzøº2'±(;I&—µz Æ.ˆ.³Œ(;rÍ2•¯[V½Ä\yœjû¢`\Vúë5ðß±>g/mE´õ:'Œ2¶O,\놸–>ÞŒæ|ëãÒœwÈ=|]ð1Ûç½=®ÿ¤oK© Šr¸­ø;È0‰ˆ<**~8ݶâÇ¡LªÀc ɤŽÜz!I.v41TÌÐøÐ €˜ýó—ÖšeP眗§f–UÄ9ÞPÀ9ÞÙYQy§W ÄMRÊŒ /ƈ„¢ ¶\…Ú]D¥µd”`é0×ñ¢â2¿Ó±5²éú¬¿n2ÆYAωº‚ªP¢Z%ªjjí½-Ľ1TFÛSdV“IØ1,™¨~}[CÔ7Ü”_1Ïs$^~«ëVõý¼*Ô˜¢ïkC€uÚ„W\;§;ôÅ#ðÑXƒûÇ?@—V›bÔ¸\áe¹Ð˜ºè«þº-61—áèݱ(ÂÉ· )®RÅ廙³X#²y8N£6ÇY!L W‘ùµ­Íi®Ê2ðʃçÊDƒë%BF¿¯ú»²å,À&“&ʘUü¼Ře¾õ¡À»yÔ}¤*ß´¬þºŒÍ²ÚŠ"œ~bÌŽ Ê^ ­²°óÄLS s›bàd¦4ö¢éßrL1P^†ç<}ÛÔ°ê¶–”"¾&ØãFmŽÑ‘4bŠñUÿ¼IÙ¨n=ÁCJD‹GRr@*ʘsêëøþ%V–ˆSJ2f1®´ÞÀ’q§*µ˜ŠŠÝtÒÎ,ãa±†ôYýº}󬣪IŽu_ ‚êEY 2ƒZ;%õSâms¶ñÛÚ—fDX‰8«f'œ-¯òc\£øª½&¡ÌÁ"ÖW_;Çø†cÐD¢7>å1¾Aß v²é„Ú"γ!¬|ëƒOÿ?uΙªûÿA@†ÿQQ>ãyEBÿ?A„a%Oˆ<—ЧFœ“yAÖ4‡ùxRTuÿÂÐÚà“ÿáDZ5ø_‘ÿ7þCþ",êï]ÕÉu ‘EO¼}ím‰ÄHnx[¤§'ºÆøN” 2]¥§ÑëMt®•^Ð*TméRÔ ´d&2uóÎ?ý“Ü+Gÿä©]7Þ>ûÃ3ßÚyñŽÛÎÝqÊÄ+›ÏÿüʵG¼}ÞOï}lhv¡$¬=ò¿ÿñ¢Ã¯Ñÿâßû_}âÚg¾úîϾ½ýòs¼xê#C/ÞyðàÅOÜ~à†ý×ì»öä›n‰|alûÅo}˜™üÚÓ§–ö=µïñ—ö¿4ú~¶¸;ûþñ‘¾ëÀ}—6žz#÷ÜøÏêÐ[]¿tò#m¸õ¹KK›Ï9繉÷×8¸ûÅŸý_öž:Š"[ä)B9¨‹Àác%¬Éüg’ H~„Y ÄIÂ/“éšLKO÷ØÝÆQA×E$".‹«+"*þP×Ï ¸¢€(øVQQp}~À*ðŽ®¯ªz¾=™O0Læ7u3s«êÖ­{ëVUwݺw‡×>|ÿêW/ÿèÝ¡ú#:þ¾ÉÂëO¾½H{Røù† 96¿n˺£º_N_züÙ¦“=Øw—{ÁVœ¦\ýç†ç†üüÌ÷Ë:ìB“ݳûQ]}ï×rO÷½¥aþ°¼’Ñ?²úÜa…‡7—þlœøþ¿.9=öχ¸)Ìç¯ûJ¬iø®èžÁ§÷ß‘/ücúþ²E—,\0æ‹QUëï|oú•§ÿµvðÆ£9k7ìq|þ1vüš]m½¿}‡³®Ýqú~ß}0òÑÛ zû·.œqåœÛÇ<î)k»¥ßKSþ÷â?<6àâïï®­tÀ?lÙ¡mC‡¼6õ–Kw<½óåM?Öi¹ïŠã†Òç>[5øÊg³|×ÕÊÝzùÊË'Žxò)ï]~üTAß¾CNlrJM__8Aú ò†Õ÷Œ¼yÛàÆ#;ܵzäœïöë}`¢Ø‹{„[øV½ãðG>¿ëÜËÊš2côï__à_þËeÎU‡od,›|mô¶ÿpŧ äÎeWä€÷ f-Ñž÷wãm¬9¶l}hÿmyÒ®OÌzK|îàÑW ß}sý7»ªÂù.{|ÊavÔÜ>Òüq® ç{Úèœò±õI_û¡œ}†A?æ^¼Jo˜±×õÇÙù'FÕ.~è³›–¼ðFŸ=öM¿{=ïÔ€Kú|Ú¾oÝßÎvüÛ÷¯·=òì Üm›‡_Ôº0gÖ†÷~j8à³»k¾9üՌ廞ËÞ¼júsC.:átÏ›õ‚鿾ßÕÿXÔá¸ÆX¸±aõÅ‹‡\²jèŒöÝG~yh~ÍÍ×9|´u?õŽgĘƻvÞùù’üÖ·÷/øa—­>¸çüáÕ¦ñ¿¹Ç•{Çwc–èsà¼ÏÃ}¯Ýº¾êº«}~Ò.u¯Û°lùòxû ÷¯ÿdxlï–ýÏÔœïÊ<­Ÿ¥äX†Ï¶/ÝèËÿòÐ’ Ï‘û9ã¦[wøôÓûósîn9dÜ2|ôK¯Õ9–^_öìÖœmÃ_}bgÎøë \TPqÍç%ß¼òÈÒµ [ OäÎ÷y¯Ù^¶vãiÿ9/ þëžÙúÄØs¶N÷-|Þ¾rü½‹ó·ïl¬cóªçÕN[ÖѧáÝþ½ËW®¸y€xŸ"QØüô¤U÷®ÜÑoèžûŽEßÝÖš;tÏúMú›_{æ/EW–ßÙëõ>#îè5óÛƒ ´ïmF¿7àäÈßÿ¡á<&ïåI“n×»Ž6~uë¬UÎçz/½èƦÅ{ÏëŸ÷ƠߎÝx­9ïýâe÷ÍÚþA ê°U¯›å|ü¼WvœôÎc_=ÿáöÏ¿ßðè×knüâ÷Mk†Ýöáí'öÜÛº`àôÒ“—þmávZ^~ü¿üÒÞÇÇξoEÇ<íò_^2{_Χk\W}½a…ýÃç‡ýn¦¹öÃVoÞx?óÀ‹s?Zßrâ§‹·µì;\û>³æ^óxþ–¿|°f÷Òrý°²ßC57^0màÜÖ¦¦/V¯ßöÌeøàžms¶ì-<ÿ–;¿:p½ñ©·æ>ñÞ‚™ãK7VÎ?çû½sç¬uP+î,È~ÉÊ?û×a嫟¹¦ÿGC–lyë3ïœ7_8~ÓþcÒô˜˜zÑ7<]›Ó¶ÎPbŒ᩼¾Ý5ø!K32,].´âN#pu¾‰ÒØÈ½w E¥ˆ¯žõ8`Ú*!$µ¢à¨ƒr£­@SÛdT¯ªM®®#UÑs4©2{œÑ•h‰Ð”ñ¼ K @§U>tʇ^ùPÓ•“òaV>,ø£IS°b_ÀDè¥!ÔK@º H?% ™Ä2h¤¤Mûâ„ETÕE3¡ešZ‚( ª¦,*††úNi¦ÖNºqãKT ¨À¹‚Îl&¦XŠ c âaðL!ààDS†ê5ج)\ §4u¸$fsàÔ€„!ìŽK‰±¤˜O+W/- )I~]5)-ºÄ\Q^T£? 3Ò’ôn\RRô‰Ùb†@.¨$O ×y’’bHD vkAÌöˆa{bb’ÞHJŠzÂˆæ ¾bb2ÅxÓ””í^“’dJÌr_C13Ò%$)‰ÍVRBÌ AtZð›}(I¬F)Ú$%G=©ÈÑ"I9a3%$(ճɤ‡)²YÈTi‹˜i#fD[1UQµœ– ^@ÂÎU”þaX¸e Ò…ëGh3Z£¯Š£ªêjAµKdÉ!²éL¨Ĺ1+ð•hÖUYª×ê°ÿi4Šz”?E`âeü"R»E¶'ô‹l/@U˼Ø;í(»âÙ®8G.À^1eŽª.q±M„NìJEK…=£³Éd0'Àt–bÄ]’Ãa<«`: ZÜÕ0<å«`jŠ-g‰­[lˆ)gÀ§51åðûçhbfL9=žMÔ0}‰>†Õ[ 3Y´10‹.†úb“1VRË?|1.f‰€ÉwÕäû†ÓkÚ4¡±@¶2Ø¥¥SÊ~Fc­£Nm¿R”o/ •°â2öB\ TàúÀPľüý”—ð%Z~; ~äë,o|§P¿ŸòSµ¢ÐÊ2P’à†Àéå Š{v-J8–…ì‚€Á´È‚“À$#†à—ðE8äå³Ë2°_Ž-œ¼ yWçñ¨³³í…¨4þÀ%ñ'FXäÊ—ç§(+ï‚"+Ó8vŽŸ"ÒnB@|6•Ú‰°ÏɶxEèoœØD ˆ=Êc¶Aº¶ºRö5Ä9ë‰-ñØ’ÜäÃïïKŠã3[kòfÏ&õjÈ3ávðT…À!i ¢Â”éŠÙ™¨+D` ý°KÞæ€°Gûj½Í8ÜÔèn†"˜"þ ™‚ÛC;d« Ýì|\™Eß•šV̦µX1HYŽåç&)Ÿ~0ªºÎAó8ôHž–䬬géíi\-O¥òêzðLâ~ 8ätd™¸[‚M.‰3¬|+zXÄöNça²·BpÐxþõsMµá &/x] Ìs±œTIá÷U˜ˆ3žj#w/<œvà×b{вº=t“{ŽÉ^/"äñºs~båC|ªÇÄG¾'#¯âdæ%9ªGK òP¤ñû§(¸I‡Ç óðë:ü.N*Må°Œª¾ÙD¶ Å.¿/Ñ9ª?U<'!&œßéËËž>dÏलÿ0gŠý—^—µÿIGRÙÿ5gŠü-Yù§%©äïÈùë³òOGRÍÿ–L‘¿>+ÿ´$•þ3™"Köþ_Z’Jÿ‹3Eþú¬üÓ’Tú3EþÙûßéI*ý/Éùë³òOKRéæøÈÞÿMKŠ–¿%sü?dõ?-I%ÿÌñÿÕÿ´$•ü{Üÿƒ^kÎêSŒüÃG/lðPû¥;ãËŸ½’úÿ6-aÿßF3öÿ­ÕaýÏÞÿ<û)Êü¡sÙG^þŒ>} •*r|ðçêgÜQ¼÷ Üo|ü¦ÈÝO|´‰ÿÂ'µtàLq†JÍ3Ë·”Ú=´H%À–¥ÈùI»qkÄédðÔûŒ1‰Œ[_VUª1ÐçyG; ÷) Óâ2¼[ny×<¦„Ž3”à‰.wâ3mV ãÍH{rP VD•kd „~¹EN¾qÉné‘Þh&=jF#Ü·G¡˜ )ßY%·¨aÒ;ªÊhÿÕ:•;£!½ ÞÒá[@C·_#êIÕîĈCñÞYÚ„v‚éPž9|3Üî¡ÓçFôËB)‡ò摬ñd(RŒI½-°ˆ‡²bt”´TÞ¸<Ø¢dšây´´I[¤KR;2-mÂ~L#Êíñˆ¹ÛÍb…‘d‘möbóV±„q ¬)´ XÌc9›È"z^î*€J‚éÖú‰SêAYÍL0½Ìf+«©Ÿ9†XÏ ("v<¬Ûñج–Eš—Û±]Ñ”*[ÅDT¾¬Ü:ÙZ?«ék}MU]˜0ÕÊ@m™­ÞZÑ0¹ÌjlµS몊@}PkxˆxZ„€c‘6I¨ /ýÛÒ ¼®Hr;Ê*uP1˪<íA‹–àÈ Úü¢ì©hBD“w­5Ì’ ½ ê8ÀGn°AÑ-õôºÝ]IµÿËÿ_YÿOiI*ùgŒÿ/}ÖÿSZR´ü ™ãÿ+kÿ“–¤Òÿžôÿ•µÿë¤Òÿ̱ÿËÚÿ¤%©ô?sì³òOKR鿨fíÒ’TúŸ9öŸYù§%©äŸ9öÙó¿´$Õüß“ö¿ø¿¦ìþ/)FþqÂÙâ>CÏð 8þù¯ÞdFûQò×ëpøìùoR~nm]a#4ÃB}‘–ÊÏÄ9+ê@g 㜠šp-%Æ™â ÁHˆ³RP¾’ š¨l<ƒË— ^žaù–r¡­LøŸýé,:‹g*7¹ KIt+ÄåñG­(pB ¥©äJÖ!ãÆƒ¿0ÐIä0„¢4”½žÉø¼J|”›çRš*Þ!àV§Aì ÑðE;AT¹ZвÖMU0³€U2(“;½­4<ÞÐwŠŠFAÀx=À 5MYUè—ý¢^† zq°¢Ãëvr°-6"0ÃBJ¬j°EÄ\ BL"¢FCÈ,Ç„‹X€¦Â–ãè L‡È¨Š"ÉVSK†¡«R“¡CdTE‘¡CdX£ñ¡n[;Á‡ˆ±ÆàC}µFá3 Hƒº"š™QXP#øŒŽAè[ è¦y¦™ U4¢ÞÒQ¨·t,uFÔ,­nÖˆ¡Ã5Qßé(Zˆ,:RFD„CÅp"F‘`B$ÀXLˆáPM‚ 5 £EãPÃFãCd²àCİ1øP?Ù(|fÔãZAÅ|Ô@2#Ò„¨6ÍÛ¦‘"¨Û4£þ Ñm¢>Q-X‚ÄÑ’+Aµ¼Ñ2GTxcÛ´ R¼ê6-¨Þ¨6-¨Íöh|ˆAíÁŠØx>šëd€²ÐÈ tTÐ|“´M2hýࡌ‹ù6%aœøÏÉòŒGDÆ?Êt¥LQÁâ>„›˜ÂÍk%à!‚ ùø}À#xÈŸ°NÈI0TÇ'iŽ BS›z#3[ 9¼"ðLh@ó°âSb)?)¨©gÝP*´ H{@Dß"ò¬2jwžY.pL‚¬8uCñ>ãçNmæØë±—¸%:m;:;’ Á+"éǃÇm<˜ßiÓ‘™q88H‹²@Ö&?hf‘PÁå.èÕ¤Ÿ{;Ðz¦˜¾´²óq(WJã‘)Äâ+tÒn–kQò#T ÿh/'')E0‘¡‹34Š‹ä 9¨ŒhL¦ÆÊ·ÖaК 5]‘VA‡HMÊ"¥è‡¿À6ü­@]IÉ@µHAR+šÊ™¾„° Ë ÝhlBÝGM0hŽE5I‰ jÅíåˆÆ­*ȲRU×YUs'Àx¨X¾M"> v,°!›‡–]D½š.Da.Œº„yÀ‡õ<‰³0Ðã9¤²Ä)ªÕ€3_ÐËw ñÞ+Šþ <ÍIÑp$— Ì ˜A™Øÿ8Ð>L”†¨|÷á<—Ô¬üŠÄ ™–¤eȸNVˆÿ_öž<Š"]E„/- Þ.^µ< 3]Ý==3Ñp%$dÈËDœd:ÉÀLf˜™ÄVåDT<ߊ+ ,Ê) ^¦g&÷1Ìóu}Ét×ÑõWýýýuþþ€’D‹ð¯/©™ÊÕ¨š¨.% yÐTD}!&Å,¿èZ›yªÞãÑ{€Jô²êJÔÏ1*“6RNÕÒ”””ç@±©$…@bjÙçÁã'¾tgzÝ®%"Y—ÎÉÞôAJøÔ˜pg†AAŸ `‘> Š3(›QÐP"KI=˜”§ªÅªW©éºªÈáòJhtŸ&ÙüS¢èãðR£Å†ýj—èeBŒY‰!#@…º¥!¹)ºÜS ìÑ86I”Î+§¨˜”ÃYÁ)4™r!8É‹ð#‹‚~)^RRôRQ?§8ÔPX¯6M èñÑ @ jJA{é_«Ô|G&ó‚òåŒþp…DîÖ}j¤'&n1«_WC¤D{­zTG¦’¨®E›uj ’ÛGUXÓø•âô:´?ÝÙ?+«? ¹Ê$rŸX¾•f€ÇPöžR¢&y]•åUÀ~^¢"êë°‚ª)ítéC‡f@T‰Ò‹ä§Z°˜dYY$£T– (“Lž EÅÊ{ôHþ"s@$A(ÐÊåeƒQ¾?H ±‡¹ÇPæŒXYð*ÒKA„ªZ#g‘v²|Ó”ê×b‰„ö‡i2 ¹ê#|Æ`‚ôCµÉ1i)》±\>ÚÄ"c=Y‹ÊÓ_ñ‰Sj¥‡±¼Ò aN >¥W!>kħ{ô6¤M¡cÀÈJnƒh°!QP3NW~¨SÍä · ¦Èb²pˆþXMÊ‹ÅÄB7lÂ"²Ä§A¢É.ÊoœÉf“SD¾Œü4[ÌÔPÅ€Œ€5Ý Ê£’cй€\\DçÝ æH‹ ÌÃAó®/B´s’òeûC‡"³£ª$\yBAŽü“žêÍn{YƒÓ즊°Ï›²²H>ÚÇc=•Ósö¸qª,j¾yáf›WctW*©ˆÔ5By¥æŠ¤l¦‰5\ŒŽÕD3kŠ•x¶éFXÑYM° £Ì,$·À†ªGÂPIQ´Bõ¬V~ÞŽ4M!ÂÈÀ®b„•­<ñqKvú€˜F6NŽ|¶<aÅ*xBHQ#$/4Ú‚:'s¥’ÍÀ®ã|!ŠH´ÛMl;çófw«ãü*ÐBÉÁöJ L’Š‚OÁRmÕ)#¾6°}ûAµ‘íElå"Ží)ZÁó†¦áôGIÖf&··—ɱ•H­¿†^ÙœÏ#« x¨LŽž  dcçaÖ¢ÅÁ€y 6øðüÛ„N•„VvJs^k$·CB´%ó–JŒu"B =ù­à®í"Â"B¿öø¤ <*‚’Ë¢B©©‚RRað)HTª¯vâðñµAT´TE…`ÉÐ"VTÈÔ‰Ñ ‰ZoâÅÕ@Ö!ŠnxÒJÍë5 Ñ`d€©îøVåY`4fõ˜CÄ`;UhPš G©ÏjmâøÆÓÎɼÅBƒ× è…rp"ìíÓ+\6Ðpû}.OerH ¥Š .9ÐȬZN|vÍGRÚÛ£X´T¥m¤[‰•2Z«YÐèÀ±r¢ ’€ïI`ÕÄ!æy‚Y¢A€Î-TÙèLf' lADÈl×HIÀ[ÚÁìmɼ¥ÌÎu”~G†Ã¢]“H 0[aì,É2ªâX-®¢Yíz-*‚ǵSEkmæ­&@»;CezB¥gôCGTû;Kg÷wvd᣺$›¾KÚ×ßµ>ó–+ÉŊ§*ƒDIìð#sU¥³y 2i¤ bµf ºQãŠnçdÞr££¦’h—ªq*²ÇJôs:L§bÄΟJ²ëg{"‚‚Æñí @[2o–Ê*)£.‡2ZŒ¼¸Q$ן•5.yi„lšÕ‚•=³˜äÄD¾•7º£lš´rÿ·Ï݆MùMïÿ'ÈûÿÞ‚ÉÁ/–Ã<ý߉p‚•µc+k±J^à$Ñ‚Ëp)'ÚÊJ ÇsÛBÃ9×Jþ‡cëa4Ãÿ ÎZâÎ÷ÿ%Æ¥å‰M<“¶ýè½O1ÄÛ¨ÌСæ±ò> è2Qy´ÇKv=›G“¶2úN·”•E:@Éåcj–¬˜ðVå‡lï-ÇÖ<ØkÆËæ½]FÝÑeXê·kÓüeÜѳf¼7hÔÌWϤ•«Önë~íÞïÔ]™•cÙ[ðÙ3ŸwÛK‹‚§û¾4)kýœ‡Ïß–~äÅûoJ»ç©¯‡L7o\ìÿüô =ÿvâKüAî‰Ý#ó.¿cå̇‡œœž½3-<¨bë'w3_6äÛµ§ömþzÑþ"ÿ+×|_¤|]Ýá/~U~ÝŽ‹^)ân>õ?¾ðöž§×==¬ ÈñØùë¦ {ñØÝæï w¦¬üœ8ïþoÇ¥/ÿkî_{ž,Züç7ËöŒ‡Vl<ï® ÿ~¬ï‰ãK¨ÎüÇÙ{žz·ëü¬Àm{¶xþ2áù«›àxîší×Ïûãê%›vm,znqnÆâCÞ·7–3“®Xï^>:{ѺGß<2õó©ƒîÒÁßzù•=Ë\YúÑ ßw;ÿø/CÝ¡ôuKw]óÐXÏÂøÇ´¡Ý—Âc¬ø~ÿš×z^øøéO\õ¯?T_dBES–¿váë‡nHs­ -ÏØv“{pË£ÓÑü5Ëoù©dМ‡—-¬³ÒrÎ%Â^ßp«÷ïÞ)-,íòÍ 3û¼vî;~úQÿîoß°>£ës®¼àhE¿åøõÞo^~õ‰)Ã7¿?ñÆús9Æþ×m;ýÎbÏs‡Rîî›ÿÆWþÙ/;ùúúýOï,ÜÖ߯ŽžL]6ÓqðàܰiNÕòÞcR6mEæB©& ߪ qÐO±òÉh²Ï ÔŒiή¬ô‡CEv€YùåGÅæð 55hQ¿RªÀkU@´ˆV"„Ì7zÜ!TÄÈPŠÙÞN ê>Åѵ‡$®°Ëë/W³àc@Yc°¥UŒ1çåç"œ•¥$´Ç$¤õc”yTrœ FH&@:‡ªì4gÃW rZ²÷‚1;HR‚Be¾”N—jå ¨l´ " F¢ÝŽlÖ& ÒôRp³¥ÀM•Bì0œñ² ö&KѲզfKÃ5U,ÒiB:Û,NššÆn¶‘vk.°Ò¦U k™:Æ,°1¶èX[$r¸+$nŠìï’+EÂ"IŽ|¯Ã0¬»ªT ¦rä£1þPX¾ÚÙLØ• ç+=þJr=cúÈÁä~FVàD,ð6ÄçúÝE)G3ÓcOf:›<šéÌ€OåK,ÓòñL§|>3ƒÌ {¥ô1k‚RòÉÂDg#Ñbá-¨ )a³PaS©…ÙÄø0VàcÃX›`‹ c±%>4áØü°… ³ÚãòÃØŽãÂxÎ&ˆñéÈtK >†UÔ……•;]¢![ÇÉIÈ?ЉÊ\râ¥Ì8YVçŒDEé'—æ:7÷¬O±ûîÙ½*7#>¤˜¡*–+¦Dá@‡îر?q1úòØÿ1îÿOˆ‹¹ÿ#yìÿôOˆ‹áÿä±ÿ#ôO„‹¦¿-yìÿüŸCÿä±ÿcðB\ ýϸýãþïĺú'ÍýïÆý߉q1ôOžûßûŸâbèŸ<÷÷ÿ%ÄEÓ_Hžûÿ ú'ÄÅÐ?yî7îÿMˆ‹‘ÿÉsÿ»Aÿ„¸þOžûßûŸâbø?yî7èŸCÿä¹ÿݘÿMˆ‹‘ÿgòþwcý÷ ¸ú'Ïú¿1ÿŸ#ÿ“gýß B\ ÿ'Ïú¿±þ“M{ò¬ÿüŸCÿäYÿ7ø?!.†þI³þo¬ÿ&ÆÅÐ?yÖÿõß„¸ú'Ïú¿±þ—CÿäYÿ7Öâ¢éo9“ëÿôü·€JÑÐÿââè9'Í*ÃS¦xéñÈγÿˆ­‚`‰¦¿qþ?a.¹ì?r"F˜ç û†ýGÃþ£aÿѰÿhØ4ì?ö û†ýGÃþ£aÿѰÿhØ4ì?ö û¿aû‘9 –Ùä8‘X2úcþ‘×î@ÇÀ¼v38ñEî ÇM]HÞx:L“æ…x»:òL³·U¦÷,&ò2Ù2–£3›ÑFÛ _•Þ Y“U°·Ï& æõ†J0ß:›( £ã@µÙ&Š]oÅáº>à¡ÔMÖXê*vÔΜ‰D¹IkæM0yA1¹A®œÓÝk¯x©aåѹö @«7Obc#æI‰í±ŸØ–Ì[jv a›3ÅA@®ˆ€â°U' ˆO' àµE’°Qj7¨6sE/+ý Z*ì4“„í¶„õæ:0g!>Ì[éC61Ò©|#Pû *x‹Þ¦ ß.›Amȼ¥|#t.ßèæ%8ŽÜ‰ª6eðp:ægu¾6qMûµ•g€V=Ë€:îE¼Q¦‰ã¡ˆ¹-±]ìÓ0[Ç>:Œ±Cú$ŽÜ싌¸Î5ÊIŒ{qƒ¢QTÂð×£œmÉü·`k%]+÷tºýQàÈþÎjØIˆãÄR‘µqÛÜ’¥»lœd+±â2ÉÍñ^8Óå3\çºVògØáY6nÿ/rÿ'Âuý—Âóúá[¿œô“Íþû»Cö>4ñîûl×}9÷¿™‡ î¼óŠ_²f\8`FÑ®ì nØ>}è?î;~Ö-]óo—-û×ôK]'–/¸äêI >ø»®]p× ;³EóžM}g[³†}–ùÕÑM/Ö9tÝùÁ/ºû‚™½~~9uî÷ŒØñi—ËûeêÞÌÚW=ïv\^¾nóž'¯81èÒ½¿eê¬7ò~~âÄÂg—¬Ý÷í¢C ª§¬±î/î±ýö.wɹ»ú³öÌ®§ÏöÍùêêòÜwà`O·c`Z¯‡œk«Ö•oÝüyá½/}PWüÕGË?î·ø¼Ç>ß°}É[½»—dî{0u|¹£×ÖÔþô€{ÀèQ‡z.º¶|ߥvÏw…«oJÿníÒU©³'e^}x÷¢ñóMwÝõJÙÀç¯ÞòôÞSÅ•YÕÝrVí¶÷]ÜpðÝlçìg 9Ò§Û–ð®ÿùÌG_.)°fͦG¬Ÿôù-v¦½5{ÕâÜÜûç}ãâá¯öªƒ¾{eÝÄËúüþ”ó—~³™[vÕϺwíÀî»>ã—ûÄ‘7¿óêT~ëÏ×m­{ÿ÷ç]5|â÷Ÿ=QûÄës}^6å……=Îɾ¤Ç>ñöÜŸ)˜óÇÕܦ¯ÚŽ¿˜uÏ0Ó¶7Ÿ¹µ;ˆú4jèD-­0t"ÏÌvˆ»ÞÌ «™9ù¿jäû:Ã"IjŸÂÊsÙ§£iŸ7aŸ‚µÚÄ8{öx;¬5Þ&kãìN4hŸÂo‹‚µñB<ÜÂlÖøüì¬.]¼= ÜŒ=‰Ñî²ÙÌۧͼ¿·ïì@F|HŒ= Èÿío ×´‹Ñÿ’çþ?ãþ§„¸˜ó_güþ?Œ­Æù¯º8úGÆ¥ Qý^b€ âÛ£¹ñŸÕ"jã?ÞBè!¬1þK„sV€¦”KẆh__Ç8CR)Q I¼sŠ3R‡’ÆT`t(¡©L ’-\õŒ“î)¬k¢EÕ;év÷:u€–×u©¯gê™Â •`d2¢Ê Ú¸«¹J`°â* £R¯KÙœ£|…èô¿§²|°3à 2H®,L«£iÇIÕ¯ÊK´Öò'õuèÌÔ‚™j„ 1L3FÎ~ tä$çnqö­«.tÐ4UD"ë)ôF¿u¸œ™tu<ö †ÉQ»¥è¿€ÜZy' ­d#ˆì¤sÿuežòª T_t}1£„”JdÃ!äš!ÍðÁ žq*å¡ÙzJCEt`oáâ:7gv³¸A ÊB,’3ñ(€¡ø…žR`2-BÕ¢‚R0„Üž 4+o-‚ª@cP}*~Âä[’²CêÃYXµ>¥l#õ$7_)g¨ªDa‡u#H#’BõjFø}hˆ9aÉJ;{à 1r»lWã‹0Ö ×;C>—×Ka8Lv<„äŒäíÚ4£ )@¢2ÓhågôÕ­)…ɨÄFJòϨCØ?Ø qÕ4ê:*ÙMòT”´\2UJázʮͦJÍJEu üøÂL”ƒ‹Yn&)W.&Ãj]:ÊC 93å#›Ý²#º¤ŠœUðT›H¨Â üâ #OU“3%ÙŸWVå„ %š”Sx}Þ„B”=n2š”]P=®pòH h‚X2ÏKóñø^d[MDV†3ËP×Cúìá9cs 'fS8n”ÃFç l”Ÿ]P˜3bÂØì”?¡ ?Ï1Ê„ UÞ¥ÛÕ»‚òz€«Bƒ?"î)ŸîP£LÈ!I´8#üZÒtõ­ËMKM£ó@$‚àÌω „L8¶÷*ù‘ €‹}!C›*°>ÒZ x«€­.·+@PZôûdd|Y()©Hµ\•ÓBd_ra…ßçú_ö®.Š£íÛ‰æEÅÂëYn{±EņX"Ä1*r€DéØbMb/»¢XbE±&KÔ(± DÅØk>cì½€šwföîvݻË}ﻣ?–Ù[ffç™gžç™™ûÿ5¡11‘Qá`dXŒ¯$ô„ß ã-#¢üÂb£…UðÇpD}ž:+84&2vHh‚΢ô¸DÃG-Ãc'…‡ Ë.èCP²¥ý7‹ÿÜÿYÅÿtI2óÿÝÿY•¿K’™þ»þ¯Šÿá’d¦ÿîƒÿ­Êß%ÉLÿÝÿYÅtI2Ó÷ÁVåï’d¦ÿn‚ÿLÂ[ªü]Låϸÿ›ºÿç’d&÷ÙÿUã?—$3ù»Ïúêÿ»$™Éß}âÕÿsI2“¿›Äªÿçªd&÷ñÿUüw—$Sù³îãÿ«þŸK’™üÝÇÿWý?—$3ù»ÿ¯ú.Ifòwÿ_õÿ\•Ìäï>þ¿êÿ¹$™Éß}ü•ÿÇ%ÉŒÿÕ}üÕÿsI2“¿ûøÿªÿç’d&ÿÒÿðÀÄä¯ú.Iò¿¡‹ŠŽ2ýb„<ú§B¾ÿE0,CšÊŸÀÁ?õû_®HîÅÿD,(ŽWùŸTþ'•ÿIåRùŸTþ'•ÿIåRùŸTþ'•ÿIåRùŸTþ'•ÿIåRùŸþ‹ùŸÄ5 ÛøŸHžÐà îû!€Â$|>'¡ó‘¿³6¨ ž%•X%’P Ÿà2³]¼OžxK&uQ6D£ ‚Ø!œ`ÛApˆôçs0¼µ­KÔ9Dƒ¬Žp¯‚ÁÑ LNfU£í üð©«#AôÁI×Ï:GÅ@ø´Iу}5-ZÀRŒÚ)*fPYm«.] SLá£/tÔHü¡I##²FN½ºƒ>LL,TpS[\È”Aà– ÉÃÞ¡†~oI Bþ1¾*ž*Ò6a0KƒÓ*z– Pg)«åÅ+” íTúž‡'qž¿á©€<Äþ¢meÞÁIɬ@°<â) ƒ8CÈŸt`V°ÜU ‹‹sج`]ó /¢ï1’åPVßK(˳èa1k•øÇ™ÕY“ÄLñù›Э0$˜ä ûµWÊœ‰åDõæ4ª9AÉAûpLBGuš,L{àJ‘âç,¸ÇÐ8A8$4BŽ9U÷ˆEO‹ ÊÒ ußþ¢mÖ}Jªû бÄPŸËVýP­Ž¤ÌU¿Ÿ.4)Ô¥€ð6…/ÅéÉ ¯hÐG†‘f娿*³¦üÀÏç‰|uõ«Ò ?J=éo g¥¤`<çƒÝ§@Ã!Y£áqÔñ<é\£j§$–4Å`y9Ø6ÝÞ’mUk‚5qô¥Ab¦Q¶V3ZOJ´Â˸…«/eŽƒo+!¬ÞÝèxS…qcææ+­J¶‹OäÇ#ŒDagœ+ ÕYÀ*(j ‘Y¾íγæ:‚Â4”ÈM#SA0œÑá`œ+ Õ$ñS)cPš¦dQBNáîÃflßùYô¿vðÿ2$‰“ðü?ÆâêùW$œ È00‘D0ad„Ž ãt Ï„Q\8JÑü?Ý>597Ù§ÿ²è ÓgpóïÿÀ[ªþ» 9†ÿw{ÀØ‹Ø{{ózÞöª9{Ê—w›ô÷ÂúOb2ÊüdUçåçÏiù÷»WÝf?]8«Iã²þ¸ç‘™«Þ¬{öõÜÃÁWïF¿¼N¬¿¸¶Ë®;'£ÛßÙ[gã€3 êmœñ ó΢Mè7âzÆ›fßmOoÍ<-ƒ/Í훓Y©æüŸ{mͨýégõÖö¸øàâ½È‡ìî¥#ɼý׎yñrôÂ輞'†ìË,²õöŸ«"‡íÉÛ›{jtï!U¼«¾˜üëÍ>?=ÜS£ôÚö•æÓczx}ˆÓŶu™…ÿYâñ´ئ/ÚìŽ^Agìùöèßµ°=ÙüœZ-æ¥é‚§vâ'<ŠkúwtiôùèÅoP¯®{yUíEJp…Þe_øŽ5";39bqõqχ£o? ¼ðÕ¥ÝëâwökX¿fÜ»'/rdݨ-‚&l¹¥|ZÊ“Å_5i¥Mèr¥ü¹îï~Õ$èü¼?ª•órÛ‰Äᢿêí *î™Q×»dÛVUhÊÙ8ȧéGOÊ´»Öùð]ÿnºåQ>™—4掠ò:øï_µ>5ÔÀh¨Ï›øëAXrßð¼Mj®[1áî¾}ÅÞætk¸3hÝñ§åŠÑËêûƒk¿(8¬L‰—;tŠ>µÖÕÞÖ¯9¾´ÿ¸§?¼)ÒÙ—Z<¨{rçó__œ˜ÞݯSêÖÅc–~Õ»Ó±^Ø/;f-^5¥Jx¿gׯ-"F®ôn§MiU?vËöz£—N®°²êMGÿ#uÛöôh³¶ÒûMý‚š¯èÝ®IL§wë“w_¹_=jþßÙëO¤ò_×Ny¸ëq_rŽq¯:ü™ßN™wì§aWëïè\éË moÏŠìÓ·Ý… tW».ùeïþäïËÞÃï½ñCîûý+ k3>¹bdvêá›Éã:”šÒgëÝ ¯„i Ï=˜óeÉžc7ÐMÏþ÷GU£F”¹žã¹15V7lïõi«_M\UùjÒ[Æ÷§€‡éA[{§Ÿ™Þé·‘‰éÉGÓÔ«òi‘¹mΰ©×ø5¾/ZþXùQ¹ÜãïòJÿ^¥Ó—2$³´= Éú³K¡HÆ))G²‘YÛ*&&6)1D`PÖs'ã¸pdqTÙçÿoٔуè5Ëê×ûp‚E±žÒ Ÿ «}úS¤ÚVàïº~l§¬6>{Ò@® ôŒí7[6„à„%aã›´ÚBN ÚÜjC@ƒ?á!Æj;lÚ¶,´5„uùÐ($q Í[mŒ »-…6…´Ú1,—Îàb&…YmŠM‹¿…6F2+äÃ.±¿îÊNÌN¸šœ±ÂŽã„C7,à@pK†nÚ6p޲¨ø®–uðŒ 8hžE8ü©ù=Š#,î1„ey,CZÖ‹Y>gÂHnÉ4ÎÂ4>4æÇ Ë–o;”¹°OÌí)Á |ó¹eÆ5‚L•kÜ-“Yüç>øo*þ—K’™üÝÿMÅÿrI2“¿ûà¿©üï.IfüOîƒÿ¦â¹$™ÉßMðßTüWW%3ù» þ³êÿ¹*™Éß}üÕÿsI2“¿ûøÿªÿç’d&÷ñÿUþ?—$Sù‡bÿ4þ+É2*þ« “…üÅý°Ø˜¤„ØÁýúA tD&,pÁç?( §ÌäO8­žÿpIr/üW–¥5Ūø¯*þ«Šÿªâ¿ªø¯*þ«Šÿªâ¿ªø¯*þ«Šÿªâ¿ªø¯*þ«Šÿªâ¿ªø¯ÿÅø¯âmø¯,ˆÅ œø_ÁÅአ00!ùz1Ì1bNò» XeÕXÅ€¥1 ÈÃR34Ùvtb”9\éG2Ìýo |Žà … ¨ûAcm+æÇR¼¨M4'ÅÜeHB‚s"Ô|Ò&p_óf8®*™¨M4gÚ!N@jbüXsi+Æ[RˆX€ãœTpæ ª,ñ–æ^z´PFƒÓ` Š$Ñb˜«h0t‚ZBÓ¬†Å54‹Aœg!Ð Aõo…‚”‹M` †þtNá¶bQ˜@³ò4‚½€«x8¡Í‰ÐêH^²á• Kp$„[! Nú·0¥2(kJeлp$xZš•ääꬌI¸ƒã–hN Sí˜Ñ¥³7C)™”býèÍœaó"ÄQúËw¡±:³„cLÀ]è³(!«¶D^ù¶*,/^¤Ñ\J€ èQÙê ϧ0ùìO»LeõïaD±á$^‘þå ^‘IN†º*¯ÊʘÄ1*Ø s¬ÿ¥@ƒyh0-Ñ`\£Ç邊ƒg*0ªBDk¥Q…¡QÈ –¯½r ·ÙÖ:ʇBV7ñ“hN#ª˜=)œ0ࢠ¢3|büBoˆãë *D4aè°p‡ƒß—Và É(ÜV IÁªQ/âr-ÑWÐZ'=þƒNýô0$""Ü…n‘áu ýßJÄ43¼¤>‹.„¨Âú<ë˜ê¬ NŠÀò%£@½+t®]`µ–¬Ò%釟“ïFç¥0|‚g)™(”%yR£0!œr¦š u=S$E‹ Oq%ˆ2Ë·UÙç.;ñðF_€!„¬a5d ܘ…K²²–QÜåŒ=‘?À'rpÔQ÷Ì c¨Lþ³Ce E_•aà$„£C0pöAE²â ôÜ¡âCx}‚£ñÇá³ & ÚUð~K–…Wç¢ u°¢õƒYR40«0^fù¶ªœ5ž‚”pr#gÁ Ðêè$ö5<&)*i„ -«þE }† ÃÆÐg0+®Ð ‡­¬Ù`YR5Ë t§-‰`„~•Eó$Å¿Q~¤¢‰@)ä»aUÆÈ¦A!ôa®ÎP´ è´h;)œDyñ %àÜ G¨K´}HèŒè0–*Šsd–o³#í¨PÇà8F;E£P‡¦`ÈF˜ƒyq½ˆ†d4¸Ëi€LQ¤àìù—0ç e}ãô—m±wÈ)ÜVÑ’™˜f3†b•E:ŒV‡á’™xpl¤ë¦aÃ[\ Ê$â@Y1Ä@+ pS•1IC·$Ÿtª] f¿ý“®Q“iGh2!j²sŸ¦áJÓèêTmEuˆ;)ŒP¥AHèSE +¯|›¹´0‰Ò2ŒK²ÊÜ'(-¡M˜ªs¢ë黑…h좇ƒ²¢Kƒ.Ä¡²N¶ã˜êdÆN ª”8[‚‚‹‹âÒ¯M¦˜BU6ÌnFN -ÿ2zšºWëTUfXÁC14A/Cƒ”;bÁÓ»ÓÊ·Y•m>Ê"gñáLœ&–¤¤¶ eEc„¶Ñæ¿øà˜êd+É:˜Ob’.*Vo MVò”,Aˆª“¿ÜìTÑ 2´eý•åœn…:8qhsR+%|ªÄ Ê,ßfÕqêq!¨èâ8ùKèrH)+.|RÑq!åU)°9’ãB¡‰‰á &§ÃÐæ#f<9ÀÈ=Ø%ªÒ0Ðà^K-Æ £‹ƒ9—~•„Å)µ AþLV‘ÒÈ(Ýæe7‡Eãh±I I ­Ð›Öo•INh´/ âq (Næ­SB´Nöõœ­ÓÒ€š3îÀ€šS²[!§p»¨8C¤MHéHZ ‘'‡‚4 |N3ˆ˜Ë¹Ah"…›Q’Hš¦ÐR¤É*ßnQ)Ý­@¢‰Û¨€Š QÁC„—ˆ¢‚÷YaeŒt n‰Êîóð0$8Ð1¸EäÜEL:Ñ<#ꃲÆÝVºI%Kåd•o«(ó'çrØ!.:7 0`V 3ÑÃ6î´AèˆêdŸOæM‚\á«gfN: r/WÕO)³š ~â6 Œb@Íð T^m®à‘2ãðª4oa›F™Å’Q¾Í'åuÀsy¢ÓA•JCñÀ_f…ÓLΞÅС"©aÍüLÙfáv @1=§pÒphDpÀ!%Àä iÒ9Áquî‘]l3©¥MÔòÈù—/™å»Ù šÜ.Ùÿe?¤uü/ÌÀÿˆðÿp ò¿©â¹$1:MPðp*ŒÂ"hJGc:r@X81:*‚û§Û§&ç&ûõß~ÈBôŸahÒÿLªþ» 9†ÿqc¯À™ÕÙ÷öžÜ¼påŸý{jïÄ7þäŸlÿm#NÕ\ÖÕ—Ê̬}Ÿöã ”ªß¿±ÕÛkï¹zÖ«Y5ë¾—uâE©e¹c‡Ý3<5wÒÉÔy]?H½¿¬Idn…N±©ô2}ÌÕËÃý¿³W_M;ywÙ‚ã1_4üàYÅæÒÆ›ô.3dÌçoÌÏ<}xï3]ÞEÿ—y·V`¾Î·˜}ó÷ˆs³NW`'….n“X:«_£ŸŸÛ²=âiÔ¹/»Ý?ÿhƺÆãG<Õ¦ç|Á>¶iî’'·âËŒ½ôîÂÛ¤‹{îø<íD4Ï8ß1ËoÂàÖwú•Ý}gu 6gì¥fMîçú.hQúùÏY[Vg]¬uoúãC1cªÖÜ‘}ëa«æ[çä_Ðèωã&…ùæ-Á/_Kœ2þu¯Ï5þ‘xHÛ÷²G”é;á§¥¨'¿ß8ÿ4·Q|×®Ÿ½¿§×Ÿ+ßô|É«N5ïÞ»ÞXỿí©áOï{l[æó80x‰œí|vìfÝ¿ûáÈÍfú\gCŽ}þ¤Ù˜öã+_Œ=QúDõ“WáC‹vŸ<ùZƒæÓÂZ òZ™Ñ;¾HÓ¼.ì»ÙÕ¿ÑÀƒè>3¹–3¦îz9uvñ>%eU-xwK<ß½§÷¹èŒ£#ÏV™þ¡çRºGû2ºMµïÇgÈ+Yæü³³³¶yÌmG=ßzª¼OÝn5øµ;´¸ùëé t]Út¨4µì  Á7ÕévçæÞâR©¢=Zx¬y¿GßøõŸ½íQùYhÝÌâ³÷-oz«ï¨zã$ͽ–y/‹YkÍükuJ>Ðþj´ÇÇñ¾cæ—÷+³üZ£_Ÿø|Ý€ëñúâo%Bü–Ö©Û+-0=)¼Ç’WüÜEÏ—5»òñÍÓÍ3SŽ6ê=#4î—’«[âC*¯ß¦]Q©ØéŽR:l8ë±2í`j\|Nõ¶CgäTÜUWWl}Ù[ÓSvgÿµþ»>“3•}óÍ?¯G»}RªM•Wø³ïðSíÿð|rhåøÏÎ|v(32mוユ‡öiËçý†¦$ŽŸÐñT½ëöÔí2,dß7¹'}ƒ{î´hÄ…;ï3¥Î²* ‰iogŸy¶©}B¿E)g2s°à¿öÕªÿm¡~Åx¦ó¶»e¶îï0;bÿÄ'ë=Îîx`ó[jÿ™=±uÆÓß{mwþ¬G"qiazv‹’¾E4CÇ>ërñІ“ÛVl]õî§•×Î]WrĪg7¨Áþõ°ëâÿòŸ>䋸–ʵeu|72®Ern~³é)—Û¼˜Ù9£É:O¯µ?«ÝfÍ·)m¶vÜÐoãöÞ!'GŸfGõèåÝÊ31ï”8yð7·¾­–’|¨kÝG«Ã×ß;¹êhnÕá£Òg—ñÚûޛ=¯Z´ë¹3¢âcí¤Õ>5Ÿ4¹šy&è–øëÒçÃ5ÏßVÛ¹7vQõw~Ì8÷W“–§æ6[¶,:þÊŒ^ÍrþØåY.뛓ãçñu>X?¤›v~`úQ—=Ç‹gÔ~Ùòñ¶“ÛÓ~ÛTé ³cvÍË­b¼¹c_Ö©R442 ´c`Ùå(߸¾½J·ÙÔþPµõÒ&4 îh» ç͘ӣRÿ:ó’—¬ª3mZïÑÉ=R+n9ÒzÖ¨n××uß•Ý`ɲž»¸yZüßw[”ňètsúÁï«–î™Ö.­æ$]íó±s›4lt¹;kÇæU‡lìxíÆ5õȬòÿÎÎ8ÒyæñÆ9S˜o[Ç\™;ƒ¿ä=+¯Ö½qÏ–ûT™ÝljÅŽÕØÅ=jÕoµ÷Ü­3§{œLöÜ4/51Ù³\ꦦA ÓþÃÞµÀÙTí7D3Ñ-å1®7™Ùµ_È3Cò(yD‰1g†ñ˜™fF4ÞL$%”+Läq‘BS"Ï$a<’J•ŠdäÑ]¿ß>gïuæŒqÎÞgOþ÷Îçñö>ÖÚ{ÿöú­ßk}¿]ï_üñ5o{ÿ·-C¾RËŽ}d÷ÁÝÝ[»×ØT'omËquûfõÜK‹r&\¹¥¾ë‡~ë&þÚ©Ó#Ï¥Mu5¯±ø/ۓ׺^?>¶÷­“n¯u´Êù”cÖo®õ[væ›CÎÏè°ô­³–xëÖ ÷½Öv`Ö…Á‡#bG¸RÞÝeÑ×$+¥‹0[©i#4l¥ËV*ÍVª)þO‘– P"@oY/ð/š‹²¨­ëöK!–FˆK |Uä5\o?®=ÂR¬üå2áú®m]³ÇXJ¼©',\/šÈõ:•þöøJ! ÏE/n*ú¹Uè Q©ÿUÈàC/;+úqZ¹wÝáY&TžTÙuÃó¤òê5yRñTqò¤*Eñ¤ª¼o¨ Ò! £®›?—¨äÏWZO*éÀ‚ÇTÞUAQü¹N5Îï˜À‰~ý n,x @¥ #’ÿï$Õ¿?…÷W!Ì1îTå:Ü©‹ïÚÔãøäÆùq'.ï·¶ëƺþG 0§Šœ¨:J-àÿó7ÿ‡ Èaþ·bù¿ðwóúo¿$‡å_?ùÂ?o™øÃó_3þÇs"ÕȾò8IÃñ¿âøÜ`üp€haþ0ÿG˜ÿ#Ìÿæÿó„ù?Âüaþ0ÿG˜ÿ#Ìÿæÿó„ù?Âüaþÿeþ#ÿ‡ °ùÔeÿÃÿû-¼À¿ô'Ðô¬+Ø4·’ñlÃˆÝ¡ŠæQL,F/jÄœcÒÒ‚o3±Ó,4õÁñÁËôÍŒ½ZÏcÓ»šÄh≽t¡Îâ^:^éhì^:ð.BÇöáy›½ï:¡jE‡¡–UA÷¤¶å*‚‚ Üp°SYygÑÄq YÅ%šÒƒ³‚jco‘Åþçïpp^‰”Ãû¢ 6MÏÅbS6›ðcÙ Fh†³8¯D‘vo¢Úü2alý'VHf—Ý}yªÌN.ÀPôgÖ Y‡IÔL wäÝà‚ŒÞ(Ïãä“y¥ P€¥Ÿ~CÒA–œ¥ÍÑÇ0 bP¦& ¥~ÖsŽÅþ‡‹wtò*/óÚ½iÌÚ4þ¸=Èä Åp–'}7y©86ˆó¡`/¸´Ñ©„ÓOàôémìô£ÿ–9Í%(p«³r2ï,Õ>†‰s Rãóõ‡¦ª‹ýŽQê¨ÍHÌH¢€5ª†Gß+ÓG”o[Ö¢½,Û‰Ô¾7&TbzzJª ñ„S©ª ©d•Æëy§’Ê»ý9àe"3 Žû‰O `µ¢×ðÎ[ˆ4–Z>t:QTD®!ª†ìšŽ"®ã† ¿tÆtijŠ„7‹ý[¡V ¨Á€@S¶ ,ƺãU¶r1uP|rJ1ÃynÄ»z›Þõš&` þX,°ãäpEÄjøjý¹Z¢V(éÛ†²Ë¬Pp%¶$;Í`r¨]­©Ê‚Â$ƒNÁZ+¯Ðë§l,ÙÖú8žÃRAù¡"#§õ(,Ïâ„X7ýS°þ¸¸æ°ç& ® ‘9õÜ™·ÅŒ¨êÔPEñ°ÒµŽAMõ ¬9q «[ ÙubUÂNW€ôpÊHT~ƃ—*/ôp‰m/±Fƒ@—0^E£BŠ`SãX£ÌzÍ¥œI„¡Qᩆ hlXõ‰”,"s^Ñi«A§›èu2€¡ž¦ï—£Þ5}MÀOx£LêA€²mh¥ó€u KþA¨¤E¡©f‡E )± ŽéåŽÏŒ/F"&ýV¼nhN†R†ûóZ[ô—R`Ñ2§†*Š€‰ÎH"ªið‰ÚS7×â°¥‡ìFTŸ”(ØÂ ‡¨‘R=CŸ(¨úG×3ª¯žZÐ/ˆ6O¿ÁWÏ€~£Çyä€£ŽŽÌè) ±R‡p¨¡ˆÃ\O0„áaÂ¥™œÄxÎÑ“…ΆbWY§ƒèܲ‚HÐý?Ëçæ½¯Öf¸›L~žG7œ®H§C+´$àoçs3Ôo¬Ý•‰ÅóØžü¦—çtø@ÃŒå}HÃYl†,ö4lµm¬P—läèë1ZUAz$Œ3í!¨2¦ä`ç–LMÌÉÉΊJƒ˜—¨é“´#*‹ý-*»ÆAQQûžÀºŠ\áœ.*f]EQQûETÃßq˜bXÃté}HŸ “d‹ýßâ8žjÊfN›Äl‰qh†³JYBK¡w {4¾MšîvË1JÁ¥Ë¢W2èpœW&·&ì¶„@uˆØæ|üZÈ‘ÂþP |Z˜ctn Œ½ /$즕©Ý dñYHsc´‰¹-ÃúÎH¯ÈGµþF¾v´0ƒjˆWÑ›F¥„†ÉKC…ø4­f„d8«…‚‚¾’wÞ¥¦%¦ôK+ð*ì/»“°pZ^Ü­ˆ¼ºÀª¶`qƒÇh.nÞ¨ Á ƒ=B¤Ã¡jCaÖ_}H#D M;L'û‚ŽÒÑ3‡»ô â_ ›Þ 4MR1ü±`‡Ã.4ÃYœeDS3À˜eýz ÎL˜qÍiÆú_Òa ƒŸk¶ !õL™Éá:Ñj]L6‘¡ ©ªGÇ"½¤w9„.p6½ 23\D!o^ãØ!Œ´Ø„‘l^ˆ>?èQƒ•P‹ëNb‘éÝ&Þ°Þ[4r9<6d7n¨2•mZà€ ÍpVYꊪ€¤Õs¥`@Ç6ÕeÁXRÐüLùCd|Ææ !uÈÜÐÿ¦Ìàˆª³õÇúfÑ+¾LžEÅ+²®,ö¨RDF)µ^¨åB8 ÝËJAˆuKIlüõéĔ̓¹[W ÞõjZNƦWÓB“}Æ"Û´ B3œUÕÀAÆ?ë¬Ë$8*x)–ÜõÉŸPo !‰ 2U8ÔF…z±¡7 |•žSEÏgÃRè'ÕG Ô†0H`›–‰,õ°ÞðIC¶‘W‘†“ˆ6RÀ‰±n^dôFFbJFjú¡3¼7i>jØôš÷Ð4¸øc±èXYÑ:#4ÃYõ&ê þùc]A) Î7óÖ†lËß즋Aö1-0Â&¡s/z‘"“ñ$Q79ð[ÂhNŒó2˜ æyÝô¿EeÏ{‚ôÿÎ<àÌóB¥¬¢SˆJRÇ‚æ¬?cˆf9©¢iT@ÓN›ÅþVA2kºÀóÔ– CåeÄǺUÞ_õŒlúŽt_Ù{OÞçGo šÞçç¹S¯F‡’‘"ÜÏëg‘C3\/*,IPÍU¸V1Ÿp(ô‹¹3Å4PØÝ*œ_u‹m£Ånù}Ag‡.ÑŒrjÔ镯:á@ã_Ṏ§Ì¾‚q;‹ý¬Ø vBDÈ.A…_ bŸ‡WjØåm'û£±Þ!ñ™ ýÜ7J˜×{›†–°ih ýæ -!²MKJ)ÃYVJ°§Ý_ W"Aè$9Fóµ{¸ÂÍ% I´*hq…¤^C!A]¨ª‡g3B<æÑ,ÂoÈ¡B}’!Ti @!ñs^Ó\<½hùð²¾)‰ÝàTÍ?`A1uù¼¹Ï±AűþVH‚O€ˆ¾iL´¾áb݉}ØtôàÐnT´?ÖoÑèl]‚7nt%¶i)~Šá¬*#êQ@å¼_:zpP;M#ÈÆNGSçØE¢³¬sFçH¾:GõAªÇRX#È£oÀÜ”=:‡©7× 6Lü&X‰›œ K¸9ÓéêCkš„[;턌-õü…¾ŸÂw3Xl<ÊMv±Ë‹Ê»4}eQõ—ÀñªÙÅ H°ïØH0K.›% Áwx‘R¨ÐLôóUw6p–&`¢*p ¼,Š…c@$êÁQ˜ó2µ‰„ÀOÄÙ±>†Y7 éCa>ð–ñD‚î?xYÚ-‡GYj¼±á°)IºL±^6§àÒˆž&a«ŒÚ—=Op¶êßœ¾/AR™óš§L^À2y½\ÞYYËXŸ`X[²(ú•³;²¶Øð²¶] ª ›ó¸ýÖ£0qÙ¢/ÈÍ .î¶U±²Öœ¸«*!jƒû“°ŽÒYõ«aF5ŸÒMý¬ l±ÿÀ‹ÂB5q±¶I1}Iw£$A7‡0YÀD›%UŸx]F!Ó.לÝÊ's Žå¸íÈØ[p§LÓÊijÖð²²=ñôB43Åë>0ÛFÕSëlÕÊy(k…2m ©XðnN< ¹õ8Ö»ÂkÉ9\Òàyõ}&†é³Òu®ÈîÄ ºÿÀ«ªB5ñ°@È¬à‘¨ €`a¾¥ʉŒR<°± •$Ho‚ä,´(lZLdÝûýôic'Ùl±ÿÀËOBV‹ä-µð¾UTÄ»"†‰E˜½°"P€õ5ðM'¡è¬°µDÍtÌ8ÜzÁdy¡ÒÇŽãg©ÿÀ+B6±`Ébp[T=€+ýÆKt6c˜¾'¾Ø"óbër;+–¥þφL•å|0tNC7 ¿AT d¥¤Aè²âU}ev8`‚OËÜîÝmü@\>FŒ¨¹í——æGH.ΕڧDãÆ±ítžtjI¸:ÅÆ%ÌLLwÅÆÁ»ò5)܉Mš€Q?(bèìwß1¹Æê ë?ï¶åÉ=ƒNz`tü–ÑåóvîâJ-‘ªì‘Äi÷E^vn}ÙŸ:Í9ѧÛ'·%o—4í…JbÇîïØú\ï—nþëøÆ—ŽmÉÙ°k[ùU »|qËæè¦Õfkܵ²kFæ¢Á­kšûÍÆw÷ŽÊmšæË)×ïÝûÇüœ_K]Ý7*z÷¶¦åÔÿyè—GjÛvøÉN“SwOudD“g?rjwjí!z^ºðê¾ï_Êl;䨾I»_ZܪLåò‹‡ 8}oþùšþ•ué–^G¢7h‡^ÞÉ7J|oƒƒñÑéujýpô\Üãû~j™š9ìp~nÇ7>}G«š1¬Z¥í¥¯\ÊìuOÿkÚ}z1ïêŒ߸oSã™=–¿sªËò.ÃëÎðëÂEÛ×ÌúcÉc_ö:6nkæôÔzKN%,Éípò˜W–k”ûÐÉríÔbù+;7>ûÜ~ç¿m± zÓÛŸ=µ«ãá3õŸ™° IÌ#ßWû©Úáv¯EÄÍȽ¸'ºæ3÷L®;þÝi³äY#£_H6ìBæó{ºgoÈ:9!93oÎå能wL¿i@3±÷ÒËfííiÆ ónš·Í}xíò-v4ì’¶ªôÑSUU8¡ãá³w6øåòsc»¬í#¬ÚÌ·ìyøL«ÍÕ;UŠ˜ºå½ŸòÙàZ™×¦Tgõ —Òòµò§ö¶%‰Qvuձݮ&}Ì}ýž”çã·öÚlà¤y3š•|%ºCç©%éñÑÊîú~]Üz¹ÃÆcg¶.Ýz¤Å·Cÿq$r~Ãf9WD\YÜ®üñyg³/ægß6ñ훳zÞ]>-ó÷´1ßlÛSÕø7/ÜY½IE!kâÛÕþÙh|åQ‡nÝûä½õ4­Ôü³çöž{Ÿæ%Æ¿ØëÃÅÕãÿvW¹§«|_aå_w¸£îœ|¦ö±Feí5¥e×Iæ´Ê~øçÚC‡&¥vùºe×rO\ü%_8Ý=cÙŠÛžîúiô”­ÛtXrþÕU ç,ÿ®JæÑAê+Ü’¸ ç¿Þ¿öáG»5ïöJÛ+ïÏ[3²däóÓ'÷n[a|öìÕʛצRûÛ“Ú”®9eJå6¸#=K´ÛÔup…½y‰Ó[ýü~ c¿?~冓nÛÚªÄíÍ«–yyû…-Ï=úïÌqø»eﵨ>3¹æŽ¹³:Vß\e{öêF“ÆGŽùnOÉ!Û·hï.ýÆè¯ÏvIø"£ê Éß”X0åËœÜU¿-JíÕÀUj×çù_96rFÏZé ŸË0æÌâ^îË«˜.þôåC¶5?–´çßQ G׺µö±§]1SË»nªÐ?biÃqKÿŒZØiXýKwwβ-¨÷Z©—]ã§Æ—©°­^åšýÊ•*QéÍq÷ÜR#3o™º¶Þª¨JeKMû<µõ¤å¿=>¶ôò‘ê¹m?ÿ²:{ýî&m2NTÝ÷õ¨ŽußX=ýß×Ï­qç¿vøò`ûýžR-˽mýžœáyW£÷µ^ðzJw½½.í™øUy-VÏl˜sËÎ{žØ1kÎ3C7–ªT¯{¼5'ßV¥ïˆI_³jgþ“¯dÉŠz¢Ùkóª·ž9cÍÄ]Û¿úö?‰)‡žØõèðœ*£~Ô<5ò³³»ÿ(Ƕ]¾©ýÁŸú­O™ù`j“Ü Ö®4uQäïßÌ>}ôÃ%W¥Ïïu Õ†¹'Õ›?0²ìÝuÛdŸ]·¢s£­$iô‘iã«Ï~DÜ3áö Ûª þaCZv÷Сþe~~qf‰ó[VÏ)Ëè§ÇԼዉõZ/ˆ‰ˆ¼9ÿÕì¬u+Vü¶ç­ÇÖO;=ÿ“Øé£þ\ë~,rãù§Zöù£ÏêŠÿYx\s×¾¼ióÕ›z?´ïèÒø¬·L·¡dÙ%­ÿ¸;.yE›¾ƒ[\ÙQûTë½Û[»ÖÆÞŸÍ³:êdƹy÷ÿy뻹§Ò¦7é›´¹Îï'ï¬>fêgk¸ŸO{ý«ÞkÆì˜S½îèŠÕֽݷrÎŽ¸e5Þüõ¿ì= xÅÖÒ‹ú7xQQ`x·@»Ù¼Sz‹}Z - }Ðn“mL³a“´iK‘‚<Dy(ŠÈP”‡\) ‚—ˆA¡ü^ÿ3»ÙÍnÒ$ˆþÿûþÛ¯í9çÌÌ™3gfgÎ,œf^9íÌcûû§ØÇötŒ<ôEZVú€ªþ™õJäzå«ü‚VQý ~˜Zh=§Ù±CLJýÚEÿó¬Ì+·ü\ºôÍî§§&ç¾o2ôëЭeÜ÷Ó¿®¼¤Ð·ž:vøbüœY³ëWÕ­+üûÍšÖwuæ…AóG]nùS]AÍë?~§õ·¿–í¬¿tfÏwÏ¥íë±àã3¯¬»¶êÆÑ9?MViÒødýî·?ߺí¹ÿjÔûøZt=¿¸Mz‹ \ÿ©ø¥÷à)-&ß+ù¤ÝŒ¬[E³›o;úõ®qc6j·þ³å†3è£ï^;·½Ý~âFm»[ÛëÙnŒTζ}³}íŒÞ¹³_í›ÿq§ê¦_Ìž»ùƒ3ºåQ¢µ–ÄwŸŒÛ2æð•ȧä/Yf3^¬¢sk†=Ðøü¸›‹õã×<½ø‰ò¤Y#ö¼XW–UÛú•¬žMÓÖvè?|áö´i¦Œ“G¯mÔÚµ`˿ƽÝ}Ù(y³»ù•ï&4¹ùQÛ1Æœˆ­O¾pnJ±Õâ«tüÝÙaññ•ÇÞ|†žÞø+Ë:÷èoÇ ˆ{«S~Ò…EOÑKÁjÛgyVEÛ*r¿åðŦ§+©ºÛ_ûïMõ× =_øèOŸ%Ž{þÃ>?Œ=;aâÄ×äŠ}yyÂütî=mu_…Ï+«XÒ·ù•ˆÈê×è~¬ÜýJ‹Óî÷·ù™IWbzÍ=µÜ9«yÆsW—ÿ¶yĤMÑ®êöC‡v®)|21;ìÖ¸i}rˈ‰gúMi?r[\EÝð„³Ç¿/Ÿ´}H¼IÏÖ†—tœÔµY\êîffeãÔ£q/ly¾ÍÌÆÆÞ¿$ŧ¥¶~*÷©ŽYk¶¸›±¨UÖú#ßì(˜þêª ùkS,[¿¯ý0÷~µué´U?¥ïŸrö±ÆS;o2—„×%Î>ýÂÕ4³öè;Ê]®yø`æ…ÏR'­yv©©ëùCQçûþcMé΄¯˘µ+ÆõtM7׸´¹oÍÜæVÅ×ô~ýÕM§QéƒæŒ^K¬½™OÏŸ3ýƒK%gQZ½)·Å®÷úæ^Î?þxñ:â“ÏÆëw–5Zê~uáoa?ü^—y®ÛÎWþÙ®ÕÚN9Ÿ¢®ØsÆ ¿kc„^›ÔíÑŠÅ{vLßyúi¶cÛækÏ~p>7ÿZ«+«º¹Xk‡ß/¦Ÿ=mÒFÃ>ú`ÿáÃûÍ[ߺiÍÖc©K®ýãÇûï{}ØþÚí–$n3nþ¤Ã¸'nî‰M,L{ø¥®aLû!ï k7î­õnsk÷õm'•Ö­õÓé§>èx5ó÷«ÆŸ[UßˆŽºq³&aJŸÅç6k»fRñ‡mLymȘ]_:xÏç›;÷èÕ¥zÞ´>‡'®_uü¢}M¿ßŸD³W軵⹟ŽÍèôKJ·#Ûr2ßM}É›“µjハm§Æ_¬›Zq€mvtkŸ›|ÙëìåéC¶ET¼µÑÔ~h½xäÒâš<×ào§L9¶ oè}y³·×þmí µ{×M4ç÷Üd«=4eƾgnmíýu““¶G¾\;kÀ­k»­q[ݕǯ?ñpÊ^G÷„fÖ—«×ïîßsþ;‡òÃt5ñÍb?c²W }½ÝŽMÏî p‹reÕõ)mf. ;xr攪ªÁ ÇËÎ?õ›öÔ”ê¢û*fŽùdzƒßï¼4v‘c©~YΡg'Ä^ÅNÈ(0=¢çòð“[ü6kÌ¢«îéî‡ØÍ]º<½õþåÏ̼öà¹åé}ò›|[ç²USqs“«âcÇÆ>±éÈ–èUwúþ‘o»rîÙ]óÞkÃä¼³pXkH㆟Ò©ÓÓo®¯}’¼Ðé¿8¼~òEGì#?ÔöøabÕ¥ýŽG?øÆ/£Ì·º\Ðö¥Þ‹Í¶ÉiGw×Úßn:o÷Æ£±o8úŸí¶íÁá—MÕ¿>F}ĸùõyYùY£ÿ˜õ˜£rð‹ŽŽUs´Êwç6Ùת6~ÿÉ·o\j{kyn—qã\®¶ß×ëÄ+ï¿þ­+òÊÞø0²6{æ¹ué çžI]kÑìÍrn ïYt¶îyñ5‘µËìܨñøÙŸŽôîäøº–Û1ó—Lœ¹ãÕòC—–¼éÈ9bîöIîì=T·;ñå©VÔš×vNZ½¯ß=;>üÐÌQ‹jXãØìÃÌ£9-›¾ðaÎÓc¹ÜîÖ÷®ùUo´ÜÜ¡ù©?†ý¡ù9âËï×,¿vuÀ¡EM~Øóü#^˜üL^õ²Š—NÌK‹»Ö¯4kDõôe+ßðËèoí:×lùŽÚÕïoÿfüÄ…Ûw]X±â_/6éRXÔ¥tTËëÉËo~»q@ݰ°Ö{‹6]Ü~²ÑÁüÑSêŸëùÈ„œ‰DE^£ÎS¬›–œ½4z蹉WVÛ˜|ãÍ—WMüêµ¹C~m¿Ä‘«xöֹ˽ª>-[AÛÌžù ¼á9ŽÎ3×Q«Ô¦ñÎ2Ëí4%‰TÚl¡7ÊÆGuz%Òk4¹ "qÂl)!KÛœH§J¦Œ‹5Ñ@2ˆeL´3›€i"2i·ò%»}2¸¬*’ÏÒ›ì*€yo³1NG¶‘JþÁ§%ùT$OŒÔð-ÿÐñ=ÿ0ð‹ŠÃ’K$)`Ö´5OÑÕbÑWvÄÞˆþ³e+xJ¹0¸€[R’•”×$¡œ”•)P¨}Hé}jY¬1pP*"ãâ< > ¹zQxt’øLœFíñi¤†Šsrg9!ù†¤§„¾!VAdà„¸ê=7¹s›"\doÇÕc·jdÔe#è—!™ ƒ1ÁA0ò_ˆA™¸;ðB²¢ Ú0üõœä¿ÖÉ Ì„¸E+$#êà cDj¬G£ ÎHPÓ!ÙðÕ26TxO NïÙû\BnëmHf´Aå;À"üw3upI á*3$#º µ‚·‰µü–qR”‘Ûw˜’'_ÝãÓ‰ð& Ï®NMðʹ—]!¹1çF‹H| ûO"ƒ‹oh×=!y ªl9W!Z5§_H}peÒaG(VTAÕ-¾8„!çÏ—œ GõC²!Q¸éznÔJ÷b*‰L7( òXIÃ&PðD_ÚZJ;-&Š/†y)c)ÁîÍ6„Ùe¢ÙˆäŒA¨O1ãp:L¬ÅîD†hR …H£;,H‚4")F¥$•JJZX¯RB|*cÅeeØ3ãD¥4ëÀnTÑ*”‘ o´áÝyê5üêÐÌDì˜B› Yã]ÎbÈ™Á-œçD¢ëx¦Åi¥#úDеèféBÞÏ®¿÷¥ÕÂàPˆ<0¼öø›ÓjU_˜o¯ö…aÀ¦Tb%è›Nå—N­W’~t±¨û¥Ó¨ü`½0ÈøáÓZ¥ ŸÉ÷…áýu¾0ì«Â¦Wúã3hüy1ýÒiñÖZ_v”äWJ¿:Ðâ£""ÌéùnÏ9ɰT€)«F`ƒqf*"Rl… âmU"% eG0¥/ŸLm§½á^}æ£Êܶ‘þ\÷QbœÐhõjåvÜÝŸïjâ.ÐÀ2£×jÿW*ÅïZ-yŸ’TéuºûÐn7øs?ÿÏ¿ÿùµ¿ÉJ9itY†¥ÄeŃž0²Œ5É£í¤±iQL³0J‹XÊ^MÛCU nàÀßÁTiäí¯ÒjÈÿìÿ¸'?ÛÊˆŠ‡šŽREcmë1 b¯MÔ$ˆ„œ½q.Þà­¼½ [1¨wW›ÍŒÓ'0.›Ùb+J`Ü1¬ìÞF©Ez­žß$–È””à• Þ^‡Óãu` Á\HA$1Î$¼Û;Êâ¶Ý™aÀ€ü<á .û0Žl$ªTpΗˆd›‰ÁT‡‚-ɰÜV8Še©rò‰U*)y BRr{‹À’³9i¶”²"»K|W(ä(™]vîÄ.Ÿ,†HQ&—“!*ìwÊš\%…VÚ-‚56[h˜æX"P @è|¥ÞÜZ€°@TÀhï´XÍÞ$zD$šh³Åj¥+D²Œ h["ÙŸ ˜fɾlÀF²Œ 0ºˆ9>(vJø€™?|PÖ>08ˆ!¾É@Lˆá2"0 °1j“ú"š-¡l櫘Q¥¥dÁ¨#(î4@–ò%«"”7'”’ñª¶(ih€ “O…kZÆ‚X ýYs˜ }Y;’ eDA ‹°ii0cñÃå´ÈðÁô—0›X†rŠàØ&$°H FFìe‚ñ§©V_š:(/#§ e`dôÀã€q¨X„@.—¼Í —?M=°âò¥©‡2¸d4aBM”ËñA• R(:ƒ®s"ˆ€8 –­©˜b)Þ C{z9(?l´'«lüƉÿ -6s!^ÜÅ+¿£F²KXH^ ¸!%íFDo0–m4@@¡ªJdgìÜ_²ÒV-æ©B… KY­"@Tm¾ZŒÓlž“‹ÅkÕxÿ.ÄYl4fQQÅ%„ \ íˆJg ÷ IÙ$q)NÊj1ˆL`¬æ QòŠSãÀ1Q ¬–Q.:HŠiË£!Id\,´~ x@âB|ƒ¤¥‘˜¬4LwnlªB¾IÂp'|KˆAv–1Áx†8£«ÔR—:„‰aXsn¾¨BªÄb-G²ö㸀”Ëê ‘ŠÃĉª?NQŠ Èa¢¬4/јM˜æ•f`PoŠ52ZÉ£Vó¸´Ð)±ð“ˆv›°ð—"ßL|äâr¹äu•Vn¥€慎¾‘ ÅfÐH’”ÀšKaD>TÀœåzaÀ¬ŒÓÉg%ʪk•ÅV J¤’À›òQ¥gç=×½Áo¤÷ƒ3e¨÷s)\г X%̨¥' dTy’F tÙ³Øöòƒš-Tc£¬9 ˜ažu`…ƒÉ;±ŽáN !:d„<Wì(àCR¼â)„ i8¹•ÈÆØ=IµRN N¯âó¨2¼3² ‘ˆ 9áÿ"‘6b¤4`‘ •ðxà²r0Ov9±L‡s§>àîí9À6§Iˆ—"=G, ‘‰¸6¶`œÈTêàƒ=<ð‘>ðœH>C„ã1@Ö3¸nÆ‘ŽÄ^ŠË¡÷öT­*¡5Í,U†@Ù@¬Tm…Ñxìqxq‹±NF2 ª-xÁÒSF  eëŒxQ¤Ì#Bíqq’ÚÄQ’ ŸÞ j’‡+… çÐðMÀGáǸpT"V¬_®^ÂÃ¥ZA!dçêP¬Â*AL·µ”p€¸M`=‚ö/÷<ݼ¤UŽÿ" ô:˜vXáU$©‚`/‡®ÀŒçÄ nyäð½ºH–È{°FÖœ´Õj±;è<î¤ÔÁ–K+ŽuKC²(iL uæÚüòŠEîFåÈÉR6ž÷+Â)Páµ.'¶x[‚k)¢rFùÓ>¸«zÎûÈú©Äz„Ïa¥Êi–ë¼z”"<jy ]`SÑ( ™a,„æÂ¢¢Vì„wܸžÅ}xƒÉh´~ù€FÐI1«0f’q#fB—â«$J(7ÿ*Ô-Xô.VR„Ëq‰ Häp ‘b cÆsFE8ee(3'Ê-‡Õ“W‘ j®ÊÓ¸ýé%U›ò8Y{16O™¼üa#“¨pï›É“ÐÁI_I¹Ën—•@V¦L QV§ È£( .¦—¤ØÅ´JÁôÉ¿`øx΋ñ³~Q”§õø›kC– ù³w%0Ö­x€ÚƒùË”y›ä© P^Áh YBÁíp±´àµÁ€Æ ˜!ü88(#Š›óÛñ¢Ôã,†"8‹ÁžJ²8œxÐe„» "inÔªB•x)‰3ÀÅhBb"^>\NÑâ÷°Ó56¶+‚)-ê×9¨B16à  KAƒ“À{©Å„Í$+e+rA÷³r^ÚHQUIŠ$TÐjžé‹È]Dll$ŒH6‘Í?Æ|’ÅÅHƵ2߀|“ñ‹@1À*éy—¯áÓ˜’5 œ` Ð6'÷}+ bXüÝÁÉŸ¸TðkFØÃ‹^¥B‚J7 ¬(Ò«íxý& \XŒÅšÛÒÓ€ßio?S‚¤SAä„ó®wz)ÛíÜ &1,°«ñ¨&^oVJi ÈEm\{ÿ52AÆ’D’Þ+‚¬4G*²EÇÝøE­W5|³‰ÿ lßB¤ô¶6’Oὕžû'M¡Óöî­#Ò릫ï‰õ 5`@Foù;¢’<–6 îÊ9NÅâÉ/“xzY~–Ù†1xžËn–ºrdï= ´T:/WÝQvÍÁÆ-æVïqµþ¿ÞÊ< ÿóÖ±×Í”fÌŸ)÷ö²Lµ¤LÜB?nfl©èÉЊü‰ø}ˆ¨I ÐûÜÆ>?\•x‹è©!?9mˆ€D{tG}ÐGë wH@*ÇI®{`•÷T)–Ðê$7S`Üâø^×;¾˜BC˜5¿àÝ£E=…ô” …áÃSD!h†îà>ѱ J 7ªž 6XÝÕA*¨–ÆÅñz,âʪÓ܆¢ÆwkIÙbs•>´^I¸ÁÔòŒq9ÁàËà ‘·ün=ô»HJQ%ó“ ‡ÔÊð€½ŸS³?Á¶¤½R-C_ÆÂ$&Uå U­çâ] [<ê^BJe”7"CÿÉFÄw³K˜œ¬5h]¦„—áHn±¯‰Üªô·c6a޵Æà&ƽ4-üT¾ŠwºÜj¸çÖBƒlª¥ÆMš«$ø× ÕÝ·%0òîZ*|ÅÖݵ'0 ƒ^Noö EÁkÝy«®Aäzí=±WDðч“AÃÝéåa‡4F¨!¹‡úÎ}=Š$H_^£À`ø‹WŠI/„Ç7E€É¡QVý…{WM„Y­ó·Û ?Ý«[àù‚:Y£â‚‚Ýä)žpûŽNº“;àÿ Ä‚H†FƒôÿÃÞyÀ5q¾Ü­ þq€b±ˆD!7“SAÃ)"jÆO0ˆƒW8(î…*­{/Ô"JQ«ˆwAQÜÖ:ú¿ Ü]î.b¤í½?Â]È»žw<ïs÷|QgÃ;T'úëÄ!5‘xK—ÔDâRóGðRi‡û¥!T }¥¨¼§ª,‘¿¡å‚XI„TûÔÖse‘KA¡Ú«kD>4MUéDt²V9ž›z„Iµ@oD‰4Õ6"V3­î©“iÛ/9Ošò!•T<Öâ̶ªª,н’jÛ/%ZM {¢ß•_dî(Iji(+0•¤aN\j5Ì Ü%³*ǦEÔ~ʪïzDEDP©ˆ`Ó™j¢#½‘½:][õ8†½C8׿(ʲbr—jSYÅ¥4‹^EÏeTº´Ò²ˆ¬(ú®{¬K̵¼È QR-3¤h¶îR_Å‚À–'’4N†e€±˜¢Ù~ž"(š­X±:Å—M:m]Fma‘6…©º®Â‰W m·ª!Œ™¢Ÿÿ(£ˆ²ÔêÐEda:Põ‰Œ@²Ø†*7 ¡Ád[ ÛQƒÓDe@©ÚÆK%bF’ªOD*Á sXaðÓÁi‚VD•FªöøOÆ¥ÖÞÿC3”ÛÿC â"0€«Jø€B”÷ÿÐGBaQ„ „$ D* •I\ÁXPéúñéó¦ÚÏÍXP ó†Ýÿ B!~þë#é†ÿùày‘À(û½³«âë? 6>½lkÑÁàô—,ùã¡&îÕ[Ô=ÊßäHÙ¾¤%²wW5²7™¸ÁʧsÿG³ží°ìÐñïÛõo/yC¼Ðcœ]gÇ­|jÝÜ®Û4û¤ß“ßÕ»PþìTXÌ~÷'W=ŽŸo‘ÿüùºÒEßæÁfÌ7*{àÔ¹W+èr´Ä¸{éšÜWõ³OEn(5õ(Y´ÀgŠñÆF¿ßy?{A£ŸmRÇ]s+HJ?ã±eLÙÒuÏ NøNÚ‚ôɘiRh½æÂ³­€ÖGwm+plûõý3ïIÛÏ]’0¥~Z”y«F'¾ ?æ0Þá€ÕÙ¨W ®˜,’ÞN/{âõPnq)`Þ6—FþÉŠ#‚c\o,¿u»}רCý‹G† û¤åõz¶UîYz[’:ñZ5äòÍ¿_—þã°¾çæÖ³nÔnrq§Á‘ÃD¶ÂŠ"ý¬?Ü¿õSzÛäA»7÷ìÝÏ~Ã/]E›d6 î¼ÈÝû¦Á±|›‡Ÿ¶Ž]_8À>8#ý|ˆó¼Žù»FÎX;{Ïšp¿Ä>Ýû›È¦>l½sK³’ëë ÖÏ>¶ðêÃ¥ þç½z™Yé²§£žÎj¸,˰iYÉ´¦½Údßß=§V–s¡Mzp‡™÷r~˜‘ØÂ¼½QáÏ'õ†½[h³aê̆ùV!>©Á²ÈôV¾-,o ‰zìx×¥•‡—•[©õ†ÝÉ<ÝKyh›~úÑFÏŒ5'.ŒšjyÔô¡§àö/ÏŒIˆûÉõWø·éQf~pù‹N&6^ÆY‘ï’þe'úýÐ1»þècòªpnÉžæcÚŸ;óG—“E_'ž»'eýø MÎË.ƒÛ>þ9ÍNt»Kû!ŒF:ª}U!! ÒÊœ% ª9SJÄ‚ ð“¯b`£3±âŸhÒ¤­nÜ`'‘â9¥uJ7bæj07’uyÔX8%*€.˜Zxž” ^2®f°U‹‚ùÿ¼d1‘âñ¨îðnøßbÔÙZ± R§¯i ÐÓ„¨Ã‹¤€ Ýäq¾øæÃÆ2V£%Óvœê„K)à¡Ä.ËFiVÉ‚:5«UKèæë®Ú\IËYóÆÉX$SËŽˆVe5YÑ"š[L(‰ LDÚ˜WiƒÜcœŠìVIç è àˆÈˆ¸YlM'u¢u5ù?Õü¬Ê“©ž2¢r kWMÖñ¬ÛR‘᪞Ԏ]ÉÔœb£ÂÃU…ùÊâ‰w±&×´Håq-À–\6mùdªiis!¼ýkÜŠ/йØ(+µU#©ôó˜k‰°#]Ùª©³xÕ­+•-)#4gM£‹¬n€#ÔED"nyäùÊâ'ÄÉÅ“âˆW2ˆçÙò qZE uœò­=”6¢´þgÒ¸hu¥èÖ®ZÕ•)Ä€>êJQ×}ˆ1±qn‡× r=×0 ý§ªuIf:ÔÒš¢yÎÓÊ*j®AËêh¹ISÎ ª DWÅ×<4SwP—fj„¡îã‚jW 5ƒ“ÖõiÚ'!š¡òȈÉÎAãBd¡Y8DR¥»Wí *^3} Èk#ã‚Úa•Ûö¸P¹¦þªö>ν£cjÇÎê6™&Ç—åùR¢™áóT„óÀÐZŲ“b¢Š×ÑC‰7tu Ðøð…5¶™¢idÞ}Uè"â’h°ê’|Áø†¹º+ŠÃöÅõ  ßHžŠ®ïGã[:(–bÎ ©6\•" sh~¥zÄ^ ¯>%òq©ÙÈÕ#˜%FÒ`£¦âq‹&C¨*gF‹ÓPñÀÓ8Jzš€Ÿ¤Zß'ÞRaË@±|“Ï»UÙˆHÛ~ï Ë0kFjzS–,â‰`²8D"m‚Ôq‹CD±8T Qf²?ëèT[âð\)¦åJ Æš­­AÞc£”ËPÀ¼°ãyЬÕÅÒã9Tý1Ê1’c·'2©Z˜7k ×õȲGËbˆ…'pCÇ!j dZJª,xL¥QŽØŸ½4ÊZUš}KS!sORNʪÒzר4ò™ƒ¥´Z9ÀsP{(£ù‰S6”3§¯<†ëhHØÏX¥E;tÅ„pÙ µ:mã¹RއÎÄÛ?Œ=ÅÖPZv(åç>.VÆÐ^ÚS<-G…Ls°–ôª¥vç*v +µE`„!T¾i h¥JE\!â&þ×ļbµ Ÿ9iET)mø¬'>«c¡"jáÿ©9ðƒ2qû ªâ? °@àŸƒðþŸúH„Áh(°ÀÁ" AB¤‚  Ó„öçÓ?<Õbþkü Læ? C Ýÿ[€ùù¯¤›ø¹Ãä…Z~ÿvÛð¹íì¬rßvªßú|ÖþG—nêé>ÅÍ}•EÚ±†GSV>·(ÚqÅ=-¦µ<~âï)ïâö­Ü÷2îøÜbHÊæÖ}NÈ\~sM_‡Cqß&Ýíah¿l¦A\R Tvxv׳܇c¶E\O3kìrE´0iR‹ŸË<ëßˬ¦J°¼kº9žHÌŠ½ÿ}ñ´¾ÅÉ ÆåÎsnz¬Ýïëàv³ñ«!wÎY.ÿóØÛ6á7Ÿ9–X4Kt˜“9±“묫 Oå6 û9ú÷ú^öè„V­ŸXEm¶É|dà·njK—ÄŸ¾ïñlâ w§%¦¿Ùås¸ãö{ë}ûEu=ÜræÆ iÓI©püè ÛR Klý`éIÞºJ^\Û@].»Œ¹Ûg”²}½ìú–áÍ}ü{›>ïßêȼq¶ð[˲ÕëÞÈzåíÜöÒðÑ¿µ¾9ñÖ£}z™¼]™öph>¸¤EVó.[eú]9éÃèFGb,W¦›fÿ‘møñuúk¸MÚ‚(0}íŒËÙæ¶¥ç'OÝ`S¶nž¸pÅ+>ö‰ÎK]|ºü‘›KÖ§ùaN F=}?Ë«e‚Ë…|¹íǘ»-S^¬:>¶ÑžäÆ;Ü»wZxcŒ×eQ‹M’'HîYÌîx$ïÍLyP†áÒ{¿zG°¤l}»AcÝÅ ÙEÓ½M_ee»El\–úÚ¦Õ'›·±mn8r%+ûtÎðã‡F½Ú“*«ßvckküf[¿ŒKȘÙS¥žÿ}IïœÜ=Ã,KºжäJNBHá³ìƒ~éŽòx§k {u+ž5²ù·?´;\ò,gYðî‚)ýw÷kÞ¦ãï ÖL?óñxC/×Ñݼ„¦Î¿M9xÅŽ9ùCŒþnúsi|Ú©¯­¦ï[^ÚbèìK¥£|";³n¢ïê )·.·›å¹dS›ƒ©×œoúç}\9s὇:”ïÚh?Ë0æ·­Ýs?†_1^±açÅn·ó_ö:;`¹Yà›·Ï–çíºoçÕ͓̊›åùd>kÙàÕ¬aÜG}ò~Ÿ9P²ÈéZ—ñSºË’rw;dÌ€a¾É‡‹ žæmß´$s‘o@«I½Ü¿žÓ)œŒ9ùåýòÏ´ý£§Ÿp.X2û¾÷7—;Ý [Û3.aötóú>…ïþL ;˜1b'èÚpÇ~CqÂÎȌ׌[6ýõpFLùWÏ“«øµ *üΩ°ŸáÀWçÊ7J÷[|vÄÞA~±ÞËróÅG_|5̦àÍð홀LùsóŸÌ‘íß]Ûq£Á'ܳ–Î8ÚgÒõd«öOoµø»/´æcëìÕ@â=ðr_ìšîž„ÙO{;™5~0?÷€sTOC «}OKnXß/ HaræQqÐ WÕÝ"£ûŸ³ÏÔÕÛ¢Ñ$ßòÆãW[…UÞ·Šù À˜âBkìñ¤uñ0y!*AºÄg0»üçÉ\£«•Ry²£Ä„ ‘Öf€ØIEi®ãÍ”UÍx}Îu”t4EXÙ™¸«˜øßÜü 3½–qÎs!‰w¡šæŠ.Uöhµ¦9Hñ¶ÔbþëdšC:˜æ @žæ¦`O"…ágŸæ€ˆ<A<A¸–Ó¼º™YÊVªáó­}?‰Äýü_Påÿ‰oà Ïÿñüó}$Ah0 R\0 Œ…ÈBCƒ¡ 44HáôK×OŸ7ÕpþkíûI$ ó‚Híýåç¿>’nü?S|=ÇæŒŽ¼÷/ ï¸èÚ¯‹®73Š_]df?ó{Ç[ž¤¾·¸ƒ{@ÉÁàù’®âß¼nÍ8cê6¢ô—ÀxáÄíØN³sfY_z;z Úü¾‰<ÛràýüÕ—?Œß™¼ój¸—üü ×›¿~÷㺗&™Û%ËgÖ»îxig»OÝ$w Î.Ÿd!ýsȒæ+ç%¯ê\Þ,ó•¯tЋy‰fÿÛÝ>'ñzø¹£™7ç‹Û¾hyøå·6gƾ>aÑ ÉobÐxœ_I«KOg'ß•~Ì™ÐÛÕ¯ài¯Xk¿í&=¤ùkÇO|xî¼]2/™yÐÜ Èú&]›:ö ¿ö—Ãd“,‹˜Ž÷Ú=/>`TßÓ5fηw8K ;2Ûšœõ_ Z­Nk¿ãEÓÔUM.e¹ŸòH oÒüoÄô!N…â,±³ï;ÿßâû-Þ4¬ÀfcΆ›mJWßxsG$|•úêÎýMçÖ‹§‡­ÌŠFyÚox²íÔèÚ”Í{F¼½|ò±¼•ÕÁ.Þö-ÝrßüÉýÕ{»Œµ[úÓèM‹–»>ô`õ«ƒê¸ÕUÙtãU½ê@F¯º O±•s€(Ý X"§s¶V¡êxÛ1ÔÅO–Š“·¯Ÿ¶WÕ!»÷©;ÿ‘üóê¨óŸ±9ÿU|¤Oç?ˆÃùO DÔé@üpJ»'@1Xí¨ßcpþÀ N‚" î$(RsDˆ`õº`"C'FÂjUyOÝ!Òห½›s/tùÅÛõ\îŸ7µV¿Cw„øŸy²Ó.Ñô? nø€B!À¿ÿ¯D“?XgäÏûè%Ñä}iÿòò×cR“?]Õ“FDEÔÆù§žfÿRå‚Âóßô’ê–ÿˆñþ?¼ÿïÿÃûÿðþ?¼ÿïÿÃûÿðþ?¼ÿïÿÃûÿðþ?¼ÿïÿÃûÿðþ?ÿÏÞu€GUmk¸e¤ ”Ëå@CËœ>3Á¡Æ„"f’8™9I&3a „áAà* $H/í ^Û£ˆò¤Z½÷ Š ð R"ðx{Ÿi§MÉLæÓ³¿OÉÙçÌZ{íµËÚe­ÿîÿãÝ Ñÿ‡þ3ùÿ \Ç”æ:æ€'Ÿ3™ÿOdlêëÿÃî3Ãmæz8ÿ¸³Mqàå¸w´Ãvö¡XgR‘³¡4ä‹îQDÕLJâ:Þj®ã ©æ9ÞP‘úøDÊ*àÝ\ÊÇVgÄ—þcÃg¢ù|vp—³É:´ÀúÝÕËü=Éíü·‘ÏNÄÃòÙ¡¤œÒDä³Ã( (éç<,Š—•ÅÓ™X§O_âyÎÀï"s؉Q NK¡þvØq¿¼uüü÷Ø;ÄçƒS°ö0Ð  w¨Ë»íØsh@Ÿã8ÐÀ¢EäqÙ;'–R8çÿõrþi²ÿM4A8<ÿÇq9þgT^ÀàZG‘jµÐäc(¦Æi•ž¤ÕÂ@DErºw)œþ_/çŸFÁýÝÿÁq¹ÿG#5”ÿÏ0èÿ³ãæ¸Ú—ŸþÉ5Ú|V§šŸè´6g{˜ŸØúöÍE+ÈVqççÏÞ9dã/£^·6ªŠ‹Ïý.—:iüIgk·ÿ½ žZ߬סß\ÝloÕ3›® ?XŠçnúö¿7OytÝ û^ùùý7gž©|ç_â7ävœ}MòÑy¿ «1¥N®î—}`zeûåßlÜ÷¸æÒþMÕíGïßwJ{-á4² iåWï5½ÚrrÝCY3~_´úù¢æ‹kæb‹^ùõVÍ¢;™»÷Ìèû·.§.w˜5ì 뺹êÑÓ&üðäõ&C{ÃV§m[‘v)txö3|ÒbÀ$…âñ™sâÇWÞnà°Š‘³ëÖä¯ÜÚëÒµCÆd¶Ü?ùí%Ï—©ÿoèÑÖƒ›¼=bûðKRi{*ÖŸh»§S~Êá]sóÿ[ÑÑ5Û¾<7çâå¥[¯~Ô»rθÛÓWßüíP¿-Ï\é¼·ÓÉj½A÷!s¢õ€ºÑOTÓÛŸ©iõÛGU{¦ŽüTemùcG¿=`ê¬C-;ôDêÐÃn„±ûz‚ìüDèÇC’Ð.Ðûñ„´˜ýã;ñ„_'öUì8ñ b$-L#rìóªI %ÅH_ÒN<¤Ø9GE‰€0¸ %úNÂH#þ, %ò4œ¼ú;ñ<•87ŒÁñ™tNÕZGiÝS"KèÆC¸®•ÊK@AØdÌøòýÿh$þ©˜Ñ¿Œÿ•$ÐìàÿÉøoQIýÇþŸŒÿ•$ÐŒàÿÉøoÑJýÇþŸìÿ•Ä׿á^âÿÉþÿ÷ ô;ñdÿï¨$þc'þ!ë?I ÿ{ÿAÞÿ¹I ÿØÙÿ“÷¢’úý?yÿ'*I ÿØÙÿ“÷¢’ú‘ý?yÿ'ZI ÿØÙÿ“×ÿQIýÇÎþŸ¼þJâ량ý?YÿQIýßóý?B¶ÿ£šDú×›t6[–±Øa‚áF[&2æð:PÁî“$çþ7ÍÆÿTQ„|ÿ;*I[4¥„±‚*(dìåºw–+´6†õ”,÷¾Ñöeß!Éð{$“)`¬0x‡S¡e£É”ûoJN-笜Ÿû”àÙéT8C,&ƒ ±˜ÄÎ2+-2ê‹`3ÃÀØE0 C‰Îj3š `Ä6E¹ÖnG´qÐEÁa`ný»™™Rmž¶¯ÍX ÿW^ΏєPÔ-±›Sdsä»ÅëUžáȇÁÉF0ÅùŒIs˜Ù|‹õÁ+O¶—èôöt;Slœ ¥5‚¿…« MFóD© ÌÓ¡NQÍ9‘x= lG aH9¤›Vg³w3늙>ˆ;ßa4Û]‚÷°n´ÙZ[±Îdb  eH†?²:ØÀT¥F{b/bH 1Ygr0ˆ¥€Íei&  |²\‰ü7Š<ÛE¹Á7Ý´ î»IHß3„¶)(B>…ñȱX8‹«$˜Œà#A5‡,’D™ŒÎ gH»Âp8P}%VãdxížmѬ†YíF,9%g¶GP©ÁÇõS$¶Øb»ÆƒÀrs2¼ý•×ÝËS;¼yl€í‡½>2ë9ê(éfÄuå¨ÌlY MÆ|ÄÄ”õ06,ø¼.eXð3WÈE7yxÓÝæf¾)Õ±½±N r,æ… ÔÜž4åkûHŠEï(öDKq† röá ñ§Çv :`‡6°û§ãáät‰ë•8›ÿ‹œr-tf}“ʵV Ê6ÑXâ,GKìH‰ÉaC(}±SHµ_?ÑÜ%1#å°ÂNåäÃl>«0gOgH …­­þ£²·—À6éž`²3tVðe¨_Žç½Ûf]Ÿù Ÿ‡$e„ó‰KŽœ±"ölŸá†9®¢(£Áwncû‚½ô ¶ @ãµ!…Œ™±ê` Å«¥˜¥]`1™,¥0°œ€mýBžL…Î*pÞÎS9ËMëÎPéèKJR‚ï%G‘{m±5lØÿ±sþ/ŸÿF% ô;çÿòùoT’@ÿ±sþ/ïÿD%ñõ¯ÓÝküŠÆÙýRÖT’Hÿ¬-7’)õZ´)ÐG8O¬¸¼<6bã¿$ÎÁaõã)ljJŠ-ü‚ Z-ÀÈ02Œ #ÀÈ02Œ #ÀÈ02Œ #ÀÈ02Œ #Àü‘`|{@!"ÀhÔMýi ``4voÀu í‹ÒàÖûQÅ{ &RF‚ÙkÀŒªöw›{*²½ð:A…‹P à/"¨~Ï øÏ‘Wó¤„nQáØÚ´O€¾H±+”¦•у³aËå-¯8¯Ì^¨OY!yŠ“7š ,õ£/QO\&$Ác§Z›4<&y˜ nd.5QË3êC[â ŠÃIžâ|XA‡ùŠÙ¶=-´¼!…Ê]â†k‰®lø?N¥aM,•†Ó+{#Óƒ‡ýën—IEqkÈQì¿R I4Á!1˜±Í)Ý AˆVóJŠŠÚ¨@!#ŠÛ¶À¤—¢³ëDlØ:ò±ñ?mBç ££ÍíW‰ã\Å' °†÷ÕŠ ~$‰c\ ²LL¦Á*©Gî€È&¼µäå bƒ ´ lH`Ú‚©™6ãk²¾6 ÅMƒñ™ÁÒŽ ¼ÜÝC¬¿|T\­'ëÀÉ$©ŽbQBÕÍmY0z®ÿvÀmPP;ØP”PQ:`˺ªâMz"ÁýT&)5Hu£z»!h(¡ð ¹ÛrGŠ£¸$ðØè—×”qW‹›’oê¡JD¤ë…´‡"©f!…h2¤=½Ò@Ðâk `Ài0Ä.,¨õîYÊè1[X8450‰ö=¢ÜIû]º Ç*€h¥‚‚ $­{ „H{ïS@ûH„ó„‡ÁÍÃ@b©8óX0p­î= vßÂå›öœ!ÊýÂçí…Í™¿\äõ ù»,èé‹fO- Á 0ؤéOùœi ’kt£} »o)M[(€›ˆƒ¿µ Bq¦&ÈÐhË+°:ü•œ7åù†&IНN£!ϵÙ*o¢ñ‘æ¿å0,±J,%°+0–q~'8¯1¤éSÍmú”d1ì¦OᄟeŠ?C.ò.1S!”ßÅ[tËAò–mÓƒ$òuRàÒð–mž­Ó@&b€I’o –ÉL’ë'߈È’AHÞ BHԡDz”\@‰·K·¥Y"R\z*šSF)z¼eWº!‹"ü‘¤pŽq,10Hrà­½î Þ,•«3ÀX|õÈ¥é2«!yë°K±ÎhÁ.lŠñi¼åÖ]ZB"o±ÆVBðVPa[äìÍ. ÷¤!¡/FÎáæøSéÍìÐáO5 ž|hÐBà4 †²— á’n‡ €êe‚ñ˜à\[² Så" ${o×@•¢S4j×*EŸïŸÆÀâÄ#œÖåÝU…PdÏ|Ìy cÒ0ìÂ]¤Xøº»K ýE;°p)Œ$²ŽUÜуJÀ¹óHCïÐØuP^þ°µ…ãܪ¥}ȼaWÓðÌYöêt[V¢®<‡ä( ÿÅì(fƒ,5ÿœ^ÙðGÖ+Šo¨Ã‹ þH –^ÒDý*†¢i®bàc䊡(î¤ëjÍÒ&”ß6,š$Xº$vwèâ<Ú/auL°l+[š Ê·zëk@¤†àÓH2™“ñÒG",U5W+–èsm±fçHT %Sjðñ-ÒühMtùQ* ~½„ÍÏÝTþꓤ$øõ ‹w»Á/?‚ˆÈÐdiàÜ6f4K4ò k–Ê;X²Xüx÷ú%IÞ£³ê-2BZ}²tÕ¼$xYF²Æü‰+&¨â* Ýlc$¤œÎ„"?-Õ/#l¶õ7ÞÁÔÐzwÝ’Vx w˜;Ð5Ql¾cj”uˆñì'© ¯A0PÐÝS¡ð¡çÚ‰¬Ð_=†! ¡_÷ÑU^oAg" ß#Î59E6lL–MjÝšÅà+¾K¾¶ê»úò…ÿÐ}7TṪð¾q]éíFütÝìs]ƒ®‚Þl·§ ))|¿•Á;ïB Çÿ·ØP?Ïì ñÿP”tù“Á%¡ÿ/‰S²ÿo4A«•†"òU$¡Â)Z£¦IMå£:M>FT÷º|rº»)œþ_b(¨ ýŸB \äÿrÿFêž‘’ÖK Ý÷þR±ZAùPÖ‡»îÉË¿™Ê4£ z½*Ó`[IV„añµ­Œ®XQ¶âÓg†YŽ©Ûî87®mmªéÄ[Cžn×ÂôÀo Þÿ´Ç¥¾­O^ÔhreV/^{o§³pÎÚ”ýSûídc÷OöW¯XjÙgé£iÛg÷–«­XóükߥúÂüŸ®»V¯òêŒ×‡·«îQò?ãçÅÕÖ5~}àžÎ﮹þö©…ß>wµUú¯ÖŠÓÕÛ—ÍzjA'ÛsEñEØj¹eÍ¢í—\ZöÏ÷õ¯¨ëóäv]˜i»¯”}Q˜:í¾èþO¢i…½rw+MlŸ>­ÙÛ‡RõïÐjÁ×uyM±ù|h«Ê­¯ ;¶7vî}sCÒ¿oÐ$?=¿Û¢(‘éÍîdàŽÊ‘êUÝ_ïy(u}çÉe_ÛujõŠ‹Ý?r^½’jΙ¶Ã¶jÈ/}ç9zls<>|UÝÉ߯ŸTÕ…ûX»cY­þ^ðTr⩚³˜ù´mçOÍGdÖ^x¡bàÞ#·—~¼Ý|ãΨ‚œš¦ݹWÞlM†a8¹=îÛoŸÛôZrÞAûü6öÁ¥çOÏÍ2]þø1²å¶#s+Ƭz¤Ýíá¹]U½´ñðø«•;›oÿ¢$wvc[Ó¼±Ógö8v}߇MÏžðŽâèÙ–MvN8¢.Û~¥Ý}gæÏ^’0ë•øC–muE-Îð–ª>Ço&ïžþþ3mÓýU)—^,üje‡WœQ¼â bJûæW7k‘í+GÌjµnê¾cð—7¥æþ³iü+Éü~ûÈÃíÝþV¯ÏÍBûŒºr-óDß¹g±–ŸNx|æŽÉÙÚÕ%çG¬ÿµ¶ò…Ó{6Ô5]K½¼ù_í ¹‡ÎÿçúïÈ›q™+ÖI ÞÚ<¾}oNÝß}ûÑâ£XÙùüãír·˜·oÒ.ªÍÁÚ–5pô·¾1þìwúõK)–_¸]Ûçû®ºÂõw>~aÃÞ:´CÎôÙ¦e7k«ÝX6¹åsc×ìÿ‹3}íÃñ‹f}Ò¡K³µMŠÎŽ>÷—g{}ÓãKtA‡#]×õìRqðÀâͶ´)²'Úç.y¹|þ[ŸýWëçTÕûéßFu´kêáÇŽ§¬<ùÎØ‹3ì7ç•ïÞ\ÙrÊÓ;Ö¼·¦fÙØæ¶\]?ðî½ÞÊ“{ºÝõ¿™œ ˆÇmUßÌïØqÆÜ‡o=®ú_c÷3/Ti'\¬ºùÂÐU²mTóG¾_sîýÇ[`Oœ×ɹkpVZö-Åç/½³ûêÏkÓ¿É_×G9´÷Óå–ÞÌÑÖi×Ê¿¼ÿÖòOž{ôØ…¤Üc£ZÂ0¦cÝÆš}º2Ӝ֦Õ<{sÌ…~[Õ~9·Ô¼syßÊþgš,ß=éøâ-o,x)iå)ì§N®þdǤ7ºš§NnßÂÎì¿=¿¸nöŠÒ¶k4,°6Ù1çÛÚ¯žx‘z×RÓ¹ 8ûð ü@‹&‡fýÐó>¼kbÁÆ®é—~¬)Zg+ªM9ýlVåW›Ûly¢²ÙÉn¦Ô¥ñmGOÒ÷R<¸kbåì¬×ú½—’Ûìò¿±-¬_‘~ìÚåe·ïß<ôèûg65î“8éJYË g®'_”Ll­Ü©ó×—ÿšv§q·W»Žk÷0þ‚Cíâ0°þò䑾až=+á D9‚1uƒ,eëzæv3ÉQ(3Y_±~‘!A¶ûØÝˆdX-ú,Æž­£+¢Í”ÙÁïRË샳؟b˜ë'iÐ;ÃÙ0œ*“Ìf‹Ý–­a30È53G™ >‚aPÊó»Ð„·Ð[j„-¶ Q3lH6+T¦"nèç§_^ð‰Î®3Y =$+• ~¼¢(”£2F Xb¢ûCàCV"…ûô ,wI ìh@…xÎÍÜž}Ê$ð«1™é!ÜáS(³à—°ÎÜGeìI™·lÝù/ë8=‡`Iˆ€%ñsN´œÎT±õ—É©~œóV­Póߪ}/él l$>g#—80ÏÇfa¾ßsˆƒvhpèk|jV2¸ÈÖøltOD€Q@ö Ýh1§UƧôÃQ ,Æp# F‚÷#,¯Üq‚â…a‚´ãÁ}0e’Fk‰×ºbi]Á‚zÂ(v?¸§·ˬLE0Bá‹:!X$"ˆ;£pУÙ7fOàDó0U òpµè·¢ø;ZôF©HQž†Ðˆòh zÀ å©UâßjPNžÝ½Až)Cÿd•'ÓêŸN`X… âM”é)Hvü×g îóFÙ†C_¼µ|k­±§8'GÁÚq:«­lG)y«åO”ñcÿOÆ‹J¬ÿócCÿJÉøoQI‚þ#ø2þ_´’ ÿëcEÿ”Œÿ•$èÿ±ƒÿ)ë?*IÐÿ ±¢JÆÿ‹JôÿØÁ•õ•$Ðì࿲þ£‘ã?+ú§dýG% ô_3ú—ñ¢’øú/ˆüg¹ÿG% ô/ñŸ]ø¿`áõOËøOQI"ý‹]ÓŒ&fœÎ®/2X óòŒæ"Æj´× *Øÿý/œ$pНœ¤IùþgTRlá¿`ôý‘ñ_düÿEÆ‘ñ_düÿEÆ‘ñ_düÿEÆ‘ñ_düÿEÆ‘ñ_þÀø/¾= Ðð_0ÆBÁÿ,ø/ãQ* xÀPNHgÎCè/‘± S#éàÐÜæH¢DÓœèIî:‚hêâˆÃ!DÕU«¹¢%œ´Qñ£“•ìþ1büá@xƒppBEóc•tv]°¸i¢˜Êþ‚Ó\1©Pb“©ùqõýé´áÂó†«aÉH›Üˆ=ÓC.{d}RÜ%3TžèJtU*x÷/^Älö/2A˜;7~Ÿ‡y©ç´ÈàC?ñµÍP A'hèPªÄ_;˜ ÿŦ"ôiPh‰¨ °q5$$AÈž.a<È„qâ¹Eô>rŸLþf¨†``´!àñ“Æï !Ä€¨g†Ž9ðÿì]\Ç÷7±ƒ5 v]#Ölß=ÄŸ=ŠŠ ¿ÄSÊqp§ wŠˆXþÔˆ¢±Ec‰QI°b‹þì64ÆžX‰½ûŸÙãÚ^á8Ù÷ñã1»³3oæÍ›²ûÞ÷Á¶¸~»a²èéì]pÌN?BW4¾éi–†båÇs]b¢,Càë"‡¢C­‰”Ø1 *eB^\Š€|†Ü@›-öGs·…GttÍ4 ÄZÂyž|^¼¹òe€µîäµÇyÖ,Êá¶¶¦pŠ»ˆ1ÜØ—ÀšaøUè¦L.ö—•@p¦úÐ_Õ(ý‹‘83¡¶¯j‘¾nzUξÎZÖÔ­ÑNJê¤viQ·Q“4HÙ²¬Ù¡2K˨阘š^µûº¦ò_D¤LØ"ýù_´bþ'‚5\Ž”’°˜©™%ÉT”ÃI (6 Ö€Mª€žMÚÒ2ûßÁ딡4LL¸/,€‹òhp4ZPM2é€ÕN “Ë—tŒ*|Td¤ÔÔÂoíÆagj ªy¯„f26ƒ{¦Ov.Ãʘ`OÊfÖxÛ¢â06pe‚ ™tŒÒt•br¢ø·îÉ†Í ¡Ùœà%ßœà «·sÀiw‘ƸÀ6'¼*t  ¨Ë˜( Äº8•Ðþ×*(XËö¿¨ÿ•³ÿ«´ÿ¥Z°ÿuÑ* CÑZB‹Â%”ˆ #‰p6œIIŠ•69–J¨ÿVAÁ¡ÿ$JFöÿ8)è¿3È>ø¯yÁWbO£5Æ? ›Q§Áük!÷‚½:vž¸ÅgzÅi™§Šnù oYÁž+Ç—Ý'¢ºî½Ø³Õˆqí—ç.ø ]BÂÀ*^/öÜä•›Ò|YÌôs§žÎïá×2¨ß›ÏÊÍö<|£þ‚çèëjÿyQ%dõÑã×Û²Ûö&Ž»†~qªŽGtTÿþ“v¡«2Ö­È›7.üáÖðàK’êæ&.Ü,ò=?/ªùëjË«·÷EjTІigýOßóXtªÁ5ÿuï=ξ:%jÚ±?î6—7in^ƒG›>ªtÒ¯Ó¢®žýÅ»ë=›ú@VonÔô)¯ÞúÿÞßÿMÏk|U£f­ð´™ƒcž’÷ËÔan×M»}Ó“žù6´A­Ð×阱/NlŸ¤ÌÞrøÅf÷iw}ÙÛGÊj¼ýø¯ˆòÝ׸ßÌ\KyûrL¿‚õý+î ^7…ù覆ÙA;çHØ×!'ìÕèÕß]ʤ‹oUv²oÖÅÚÕ¥“ö©ÿ-34üJÐé%mšUÛû aß)5ª6Ë9»ý`ЗIÃãG’§§—Éš)[>ñy¹&#ç{­w%}dø‚Ÿ×ÿ1­êàùIá Î6N9pÿÏïffN8òàú7:ö]×8£â‹7_MŠëÓ¦ò_åÑ+mVöºCs'yÆ^&IÓß#®}:¢¨]N<¸V«Å§F{ÏÍv¼fhÚ¯OË_ÒfÇíï=çþÞîLßúoÜŸV¥ö4þîU“ÝÝ7Ìjžç¶bé’?_újÀ´;KTnñÚÿõ™9’ÈàÍTk«‘¿» >¤îþ¹ke_©ñX!;Z=syãý#‡›<ܯk´5ƒ¾í8¨à]ù5.SmäD»ÝžpicŒ"ðÏÿ{R«jãûÉò^ £¹Ìô**ÿ÷¬A ÖÅ,άž‘Ù¹[Ós#C¦½¯¾áç± YVÔ FÞù¬ŸYPšaŠZhm À€–”âÞ?b$8VP–Ñ7­ùxVB,Pp–cEÜg>Ç,2cÕ;Ï™ån¹ 0(ŠcÆ ˜1২4ÿÃ=k eŒŸÅPÚÈ“¤Œóa˜1(nô«qy¸Þµâƒ^xó$øËèQ¯W ŒûÙH¦µñ0(Æ`¬pºþðˆ·ÿÇ]Æÿ_ðÿv ñäO¸ŒüiAþÎ žüI—‘¿€ÿë2”x˜kÈ_ÀÿuñôßEð¿ü_gOþ®ƒÿ,à¿:…xó¿ëà¿ òw ñäï:øßþ«Sˆ7ÿ»þ· §Oÿ]ÿ[Àt ñôßuð¿ù;…xòwüoÿ×)Ä›ÿ]ÿ[¿Sˆ'×Áÿ¾ÿ8… å/q÷¿Âùß)Ä“¿ë¼ÿÎN!žüKóýgÿK ë¿SÉHþ&íÛ>¥Û†ý Øþ; 4ßPþ8‰Áï?‚ý·ãɵðßqŒB(LÀðßüwÿ]Àðßüwÿ]Àðßüwÿ]Àðßüwÿ]ÀÿñßuÄgQ„dÿ•øï «Ì­ÌNÛ ÿ½øÕXÂ9!e¾i¶+Î!‡üUˆ±Ms‘7Yý–ä5èaõ _™›Åz×q­áÊ0YQœâ†œâVrŠY„p ˆ ±8Lbš£1Mòhg Aë•".‹HoÈijç^‰×Í N¨Ó¦¸¢MaÂs\©—ôyLd¬˜3@î+,ÉàšYáòOQæø—Ä*âbcÀzä@îÍ}ë7Á2I˜c9R¯H‹—Úc>#W¼©CìçK›¸ÀcV¶Èަ 1¸aåøÀÌjØ£‚ý@´ƒÛrÑOÙ¿½fÕYÓ\Ç©…µ-‘ú+,DuÁ- üXöÏ QØÍ´ &µÖê&&9@Ú’„…°Geö5$†à"W ÁaÔâíYL“8c·°°4Úþa!`ãhÔ q´5xÛÒeÃB@î yÄ]0,ä ûw„…'Y‘.fH±w<è’‡…`i^zS¦ˆàîÙ%,N"8çb‰ì?>,Dak´“’:©]iÔmÔ¬4)[–5;TfiYžvݰ°Eúó¿:iÅüšE:/,d“4d“´–MÜÅÃB@-¾Ñq-¿Òq•°€SÂôK—ˆ»Ùc\7,d.ý° ê_B„«·s pwǸ¬äa!Àæ„W…náÜ=!,„«S ìÿ­Šýɲý?ª‰ÿ@(Í`SÅ †ìÿBŒ(\$ “„¾'ÙH)Žå”Lâ"‘(‚%¥¥ÍŸ@Ž¥è¿U± ¡ÿ$ŽÒ|ÿÎÿOÐÇ“½â?ôŠÍG«üz7¸ÒùýÓŽŽ=¿p]Ù³í¥W¬Mø2é•ÿý⯷ÌŒYôöÙÜ-Ñ¿Íp'‡®ˆkvºv·ñ+_ô‹MôŸïàà®ÕîÏÆÏÿû´š‹ÖGõ~4¢…dö„o¦6–|x]ZbõÍ!WSrÿ°èü7ËËwËaçÌ™XçM—j·Úâñ'‚ûÄ—í2ïѸÿïzeÊLŸ©3\MnQ!@å}JÖ´ÂªŠ—>þO‹‚ßgNš•áÑovâ䌴yåÜçVY¶yFÓF-;·Ü2ëìÞ7¹oˆ×‹7Ø£­Ó;òøéò'´ ?¸êÙÄŠ•&ÖjŒ’‚ŸÔû²Ö-t†z·m³{eµƒŸ¶_˜°gl«ƒÛ°ûªÐ›—WÚŸ[~Ö/U׎y7õfl—2ï'Þ©ØuÛˆ_/~Úòhv‹æ ¼dusz¿ólÓbÒªóùžwªöyŽÍl¾pA YöD>óÖÈ CWe ›sºUvÛàvþG΋‹ûÁ£áµ•+$Œ¾ùD1ù{¦vó»z|t¬S¿…GIco-•´,Oìzz»]÷ë“73ùËð[ÇNÝ™±¼nNúÎçvm^>«ÇþÊóem(¼lýO»Ol+|É­—~·ú—Ù×o?LlvbäUéÅüø%c{Ïû*­q†GðÙŒä²^]žú¼ °ªÒ§÷vBõÓJ…J(ìñW—õóûv©²óuÐЂôÓí­š]íÝÎwß»êñœ”Ê ¶ÏŠŸ²é²GdwO•#Nt:ÛcQè¸ò¦ŸO?„÷ý>nҒλÏÿÔ<@>òÏ }\°)s⪿·Â|[ïLÚ5àÖk×o ¸ÿxõ»„³Ú ­)N¨¹mm|æÊêGZOßؽÅiѹ¼1õÎ\=à‘™™Íë‹€†éyw1´¾žH—9u)‹:aȆýª²00,)%”«ó Rª"ä±>j_p_ÞPÅWÓÒ*ž’hye(üz°POXë«×MP,®7†-,ŠŽ(ÚZí «à8§sP¥qDç˜S”.rRÖ€†™×Ž’Ve«vi:‡/e¢ÒW%WHu ÂsÖÒy‘#r_]L‹¯XêBkWA 8`CËr%D;V]0„éÆ4¨Oç_DIÔ¥ØE[«.”cÕ…A -tÐwd‰n3z)›”¥dÙ¼Pzˆ>ÒøøÍ:bàÕi—Í–iAK1(ýÍIÃÍ8óù·ÝÑšªá€Å)Ýð»;í·z¢h† e[«´CUî íˆs'­sIZs™-L V(ˆ]ª³QMp”F0d@«8½Ã‰)góŸP´°$¦Eh½Òp3\7óÒ°Û00ÄDÜ ƒÐ$@…ª<\º'HF'*hfmJÊaå[«DŒ#•GqxÔÒj¦´cšäÐ95IU/iƒ Ù£2[dÅP-îU«Q1rphÑéþi…w‚±YuL ®˜ªƒé©W`jÆÀ¢Ã½6Á.rðºa}tpj©èö´Dkmå ~û(YaÿkµŸ¿9²lÿ‹jüÿ9ûœ¦ ý/ŠÓ‚ý¯3(—P‘$ÃRa’ȰHœÀÉH— §*¼´ùȱd…þ[íçoŽŠÐ‚B)#û\Àÿp ÙÇÿ?ka ôÿŸöð‡ßÅ”_VzݽîZ M¡·VmW[~±œlÛÏ—Ñ{Wæø®båŸD ÇëΔÏX¹&¥ö‚¨UIAõû&æž;–دúúÔ'™‹R¦Élš5mÍ‚„/ëÛùÕ­ÆÉ» ÜfùlYàoÈÒÄèw–¬ÏK©çëy“(û5¿Y‘„ä/¿”'îÌ•¦îìvè9Õó·Ë­æE2ßew¹çT÷žòôyù¦ãÙ¨mUÕ»1y¦Ïä ÝÜзgV×îRûÚÇs®ä¶ôE?Þ>³Â«¦ÒW=ýUîAÓG{էϼOߘòí¹Ÿºu¬]Z“ã[+míÓpg£ šZÐïxÅ27Î]ö:ô[½CÃÈ7UhA”éгך}¹ž;ŽÇaŠ2ý±?ÜÞžvK*ÈØ¶éé½ê?ˆÞ¶¿÷øk}=ÞÒüsáý°ó{ÿ+t`e¤fjV†w¥Ô\rãÈ€?>{×êù>y*³#µvã»ñç?›Ñd™ª²2cò§Ý¿ñ ñÙyöÆ›ì#‹fù.ÏÉP1=ßæ·Î;ÙôÞ”èãA¾›jªÒØøù]-ètäbå³nm+Üôîዟ¬qËÚ:²ILZú¯x£¥Êþk*å¾Õïmý­ROe6ˆó«ÀüîÑ0í½òuÙÚe¾òÊ |©ìt¸sfûn‡;åG=ɾô¨£ï£[^ƒdM;ž;"|Þ¬×=ãÅðº/4°×=ªïu™ôºÿÜí1ør£Ôç%‚²èânòSyqìM¸´ë;¼»¦K;K2æ\ÚÕ·œéÒŽ[piGE”±û:.bÜÒEðŒÏ»Æà´U.í |ÕÍ«5q 'ŒÝëQÒˆp&7Î‡ë»æ»¯ãE¸¯?ýdgFy­'e¿™{®ÁË>­¯ðÝ×)ýçPyû¿H—ñÿ¦ÿ_g¡ü#Â\Fþ¸ gOþá.#B¿3ˆ'‰ËÈ_Àÿp ñäï:ø/þ‡Sˆ'ÿÒÄö¥@<ù»ÎþŸäï 2”¿ÔuöÿÂþÏ)Ä“¿ëìÿ…ýŸSˆ'×Ùÿ û?§Oþ¥¾ÿÇQ\-T¿3ÈHþ1Ò„¥\)–†„$„©$²ˆØ(øíd³¥(`Køÿ(®ûþO’`œàçáû¿ãI,KŒ“Æ«'Y}r’›X)åÜba6qˆØd„?0+üÕdö‘!¿ ’FJã!¤C²›˜ÃI*z„%‹9,Ž˜ƒË +¸c‘U''»%» ”Ix æ+£"¤JD&† жTí¿¯„`'šg2‰ŒU *ð¼RÅ ?ËÁ¢üÄ ¿¢î­hÿ$“ ÝÁ……%';boí=±7¼+öÖÞ÷AÜÜ’Ä*"nVÈ$âåï-÷‘yýÇ+™«Ž—A ÑÇBÅŸ&%{÷ˆ“ûÈt—Šx°ßtýecšŽ‡ˆéü2ÜÜ ÆI1¨²_|ìh9Tce¬hö¨ŽaC5†:«UåÂ&)‘ØHSÊìƒ z Z½ ÚV»éwRRW© ~YŽ@ºJÕ¦àâ?fÂ)ìiÈz¡4‡¨m ü†B$Xª+†‘X/LR€¦ªbý¢Á½îVGnôQÛÅ€6EI}b¤ªdnÒ(2˜Ö®‡ ë7ff°ÚÂo(ꃑšUø …VÿÏÞ•€IQdi]eËa<×O¼H¹„qèʈ¼Án ¡åhìn`@m¨j(íËîâuXtTdœE¼¯QYq=ÎêI44×'Hµ3 wlcr¬´ƒ«%ï—–U ¯¨¡¼¢fäàêj¡¼²J(F•VÕT =¼´J5ºjTeõà¡Æ’4³‹ÕùÚ–¸PŸ ,ÛJÚ€Lm-B­PV=ˆ%³¾*ªãqÚMͳ`mñ‹0F{M¿®$b˜ì£*œ)¡ëŒô ¼Þ¬²Q¼¥¡µäP+%áS´'Eÿo?öÿÐþ[”'…þíÆþ¯†çÿ¢Þq`À™ý¿$$Iª›þXTP˜ÿ©(Oû•%Èuk„ø¯!þkˆÿ⿆ø¯!þkˆÿ⿆ø¯!þkˆÿ⿆ø¯!þkˆÿ⿆ø¯ÿÀø¯Ž (7üW ȹï'‚ÿŠ8@ƒÇó0\p(GäŒX?¾šÉŠË£‚XžÌÖœ‚¢•Ø:!„‡kKÚ¡_Òÿ“K$O"'‘nÂ?¯†yÐ Í)*®¢ं4ç_ŒæU¶1Tz±˜V5‰Ò©•~\ÍulÍd3ÆÕQØ'$‰tÎ,¨Šœ€9 N4¦(ÂBÁ@*‡éÄZt“%Ú#P0Þêo¯²æÂ&646±¡¹°‰e-g(ä Uæ¼r”¢¸`’Ù‰(ü•‚9Œu¨`)w9HdÐÑË PIÒ(ÎR Üm`§ @T‘ö 3p`õ·HXYåQŒ G16xÜbxÓ`²ï¦qäÀ²,¨~vF/•·[EæöðFrö(9"ÞÌq›Ê€_ë»)¯èµ*æ·°Öd,Ñ”râJÙ¥|p‰_ØZà™ãZ,ø#Ó?Ár ™zì,dÚ ·åÌvÈ`*Ï•Kô`¹9WÀ »E^;'ExÏ)yâ yåÂm¶æÐ Ò\µ$yõN”­ÿÐmEµì´ž¹¤mjåÇ%’k/C1ü3è^‚ƒÕã°Lv.÷id‘tÏ—ä_y®\bÉ%à”é(×2yǹi€w»¯úCC/Dc¹E’Ý÷ÍœöåÞ> ¤‚©Û´M¾ÜÙ†ªvÇÁØçP\y‰Œ`àÐù$´mÔá^à ÜSí¹2ƒå"[m–—ÈY€”¬ž“’æ”È›NÉßømÊ+×¥¯Ú*r¯i ¢ˆ¥ØL ,E+óÌ.ˆ–¿èΊ"›Žf~¡'9phׂÝfÀ=^shôÀ΂–áÄä‡]ò¯ü ÜbºE,Ÿ¡ˆý ó¨1±™#ó€Èûc3°AMç·?r`Æ"=yÄ5Ä<äeÿ!¸ÿ‰ÿ%‹JÿUŒ'6ɘŒbH3D]Ò )6)“5M‘b1uR,×uÿÂ'Ø'þoŽÕykã ü/cMJ‹ÿÅÿ‹ñô5¨¼*‘"=Öí¾áΈâ€_g~’€®^-OÔCÔS´ÖÊ ¢Äâ ™â°Ï¼míØaMïŠ?ÿË®±;¦vÙVqw÷a[nþá}ÛÐpòüÇ7¾vØe |ø7ªªn[‚ÎþZ<ùúÄâÅ/ìéÖ{û”{aìï'·mŸ=vs×K¶¿~þÔÕ'-5'ïZ¼|èS'˜7fï~wÑŽOwíýøÊ-ýNMÜ2äŒgÆ^ñ^rï÷W÷ÿtÜÃË?[|Á‘³‡¬Þñü–«Ô7±å”ö쟳jʽ¿Þ²jçÎq§*õñ‡–̾w´Ü㳟ÏysÐW«œ´ì…óž<ö×^Ûv×ßx߽ʅKÇÜ9ñÍ—ÏzqÁîsGÝsÜ%ëž8­šúõ­ï¨gμõê§z¾ôÙk£ï*{eyâøÅýfo^)ïøí£k®¹8qÉÿuÂW+VÄvÁæ^x×Ë¥ïu¼n÷¥ßuİ݉I‹îø|ßÓ¿ù]u×Ù}Oú¤.ë°qþþž›×|Ô¡÷—ÞZy܈›_¿eÃÅ›—O™úJ÷ÙÿÙm¿ðê Õ×·üR,}ð¡;vv.ÿ}ט…÷?øùœ?‹ew•ýâ¼o´ô[?à´áǾ¡ïK'}tØéW]?{kÝ9‘5×ï&{bžô¶~ºtÝÏÏ^[1aÓ®¥®ê¸¯òcÎØYÓ§iåMÇÎþäˆ)F•ùòùw?qØ=zôÑ3¹ù£î¯.èói·’Wv›»tØk{üíŒ5gîû®Ó¢I‹^üÃô·;­}¯ró׋úž0øÃ‰#¿«î“Ûût8mê}û.ëùâ³åïSqtç/Ñ’#ž¹êQ¹n—ðáÀOµÃ~¡î7¾{dÄ–òÞ vžµñ‡¯XrÅþªVýî“§ÿû¹¨ç9‡¹­câ¼kž¿`Ð3kW÷ž½½sú¢ú¡ÃNYrÂÜ7¶wœq+þÛ“Û^ÆrÝùS_0·sýSý>ZóÜÜ­{þzàÿæýûÕë»~8F×ëãgï³ûø®=÷Ÿ'‰ ¯=nÉë§¼²®‡Xö†EÛçvï:ýÛÍ7í^x¹RÖ㈆ºKïòäÊN%×þë©÷µ4œW[ùOý7]¹ç„ŸßÿÌ”’+ûtéVrÔœåÖM-ÙZV6ÿÅáµ^z¿÷w+†ü0@Ö¨ß߸£ÃÎ5F·eõó?yùŒÈæ^·rfä:=ñ/•+Ö'Ì©éÓ|N×…Ã6-›&ŸrŠ´°ûµµö¼þН¯ü Óþ‡þûÔ…—-Úö˽×,}øþíÝ<öøŸ’Ç.ÜøÖY›fÖs}Ã;Kv+Ùô×yßñæÃ{Ž'ê«ÉP&~»j2£.ÖG²ÃŸÉtßèˆx,Q[Ö4S >ò¦?ìÄH´Š:³ "y‹pH ïÜr­ne÷“«ãÉñQ"„hM|f’ünðÌäjúS„ØOÊ!Œ1¼tÂ÷ÑÒÆÆ¦dëxƒ~€ Õª‰Ñä%ˆ×ë=³Ó’ÝiöZ Ýn¢Ã±Va<TUd¢ñrÐ÷Sä/y¥6Y[ß4ŪBJiJK™{(‘hå¨êßß|ÑHy‘Ž(bÞW"rò' zûd ±î*Í„h)ùÕ誊ƒø D¢ÕðÌ—y9Iï&í.ÐyËØ ÷ã3¿hYûÐæ­èAçf¶J£óVÅM;æ¾Õ#ºû[Ýù²¬¶5‹Ãñ†fCÏœ–á#äüž«œ¬¿Ø´Éñ–^ƒ«G C¦6µ&¬‚ — … ‚f#H45B¾ÿ^ƒÎ„ÿD_P‘,iØ ßhŠeúÊLdÐ+5Á„¬‰ &ô&?e¨½&°dX6ƒÞÆš¬÷Ò۞ř-ñºx‹F쳌(¨ŠBÎÉu‚ùB:Y¥ô›Fû3•P7õ3ðŽKùL4ä´ß’7•ô÷Ò‹°„Ò>St=ý=-½/²˜Þg§ÿVQ¸Ï’摜ÞßC¤ ¨j"óOÅÄ}Ö5 LŠD+ ã{m›¹êȨ¶tù·Ç]³yѽ_½Ñ;ý“‰ªhÔ¶$éd#]‘ÃÃ}ážý_n7ùŸp˜ÿ§O ý•vCÿ0ÿcQžú«í†þaþÿ¢<)ô×yþ7I ù¿ˆOýSAåZb-n<¹üóÀ3ÛÿTM–‘›þ“Rhÿ+ÆÓÎò¿† b-Ìÿæ ó¿…ùßÂüoaþ·0ÿ[˜ÿ-Ìÿæ ó¿…ùßÂüoaþ·0ÿ[˜ÿ-ÌÿöœÿͶå˜ÿM/ üSÉÿ& Xw²ˆ¬h…ìC€¬h]9àü7•56ÒóÀQ›sK¬%¯DNþ7WÊ' —¨²§œpN°A@,IÔhã9‡MB©Vv}rss‘²X±¢à$™­08(:¹âèËJn¹è‚l.Ë:‚È:I2Ú\I%dZ}­#s͈\ÒÁC’©NíÀUƒ W4HeµßB¶ °œÚ‰ê0YøXØ_æß‘Èšµ¿×$j«Ä•DþÒ)—¥@c’ RP´‰.ó²Â`Ãð“ä¥òÜSØqú+ˆl7䯆¼ Åbi×lµÓ''àꥨÒÀ•Åž*+ZìiŽÕbOä*z‘i.›4 K_q2†¸÷nŽ}K†ƒýǪ$%¸—߉üI¿ú(§Ø±|†He 0©nîÈ ìEª.€G ;`P™¢¨Nê¤I×0BWTƒQYU•)´ûvh¨æb{]¢£ð.S¼Tž{b?>i™HÈ@@ú¢øQ*ähL1²Ë”â%1cc²rh¬h%#0GÊe€S|é…i.[23~Π_¸$J4VòäPd.DD„Àí°uHP!dž 9ÅdU²‰h~4Ñ  ÉS8nEdÞ¤,I#«ßKC K‚¬‘-¨DûÉ“¦§1.šLލ-MõEU/ÌYû=Y±P´ö{(:)8èËFn >‚l.›z!‰dÌpl5ç·Pª¯p9~Ó–úS#ü&GÔDzáÔor1¸³ –Üg" ³ Ù9Ÿ€ ƒ“d›T¦À™…¼§ì/—^’*ƒs|.ë"/²®¸ôÙЬee¶ô`Ó µ|{Ìñ¥ˆ¦*ä]öx©ÜKzFH^,+dE©Døh>4ÖEcš’YðM1Çc)0,ÅI®gŽÒáð²æ'kcašË¦ƒ( ÝO³Š‚è¹ /¢Æo2ÈT]C–©´ .ƒ°a ¨œ° Ÿƒ!‡YEŒHj°†Ž¹.¢¹tÒL­ +†w‘§QE©"!–hHWañ4Y¥EK3 E¤­|Ñ“"Rˆæ²*"¤FCm["ÀäÐÀa¿[8­ÃoÆKØüR´‰YUÓ"jpZ‡N=BÞƒ¦a­BKÑ*tDSbƒ‘ƒ ÑpkDcÁ ,0r)Ájȵñ»Ø\Õýj*Ï=¥&§U5LÒE6q¢è+)»!e!ES)ÌÁØ) Z´sk²!Z’P1·¤žA6—M¥mRײBÙ3Ú^„†ß L08ˆ˜ÝŒ ÄÜ]èM ™c›ïáf„ˆP$]5Il*]ÚG°¥mð =^ùP ¼ÕŸ{ªP^ k‚L'Ýûüpÿäh¬NOãþºiÅV Øp¸; i ÒÞÑu¾èI(DsQ p&þ‡É-ŒáX* «@øÍj Œ€9\¸½0$rÖ¨[þ aWhÏ‹ØI7ʾõ…¼â­þ<²›¦lõ°*–ëÒÏE†30{Q·zçúS Éž8ZÄ2¿÷rE¯[½ïæ²nõ"5Çefõlõ™Ý {ûÎÂÊ6:n¯g7z` g:çÁïåØHÙkÏÙ¼³«?gþF.ç0Y™‘û° h §Ç'§ÇI㳊ëúÀÆd_¨´h_°‘Ú¾:_ôäúPˆæ²º>*P“€=Ã…ÚÖiܪަ€Œÿ<«¿íµíR™‡ÁÔ)[¡TÓ¢þÀ‡tgÔ¸kB¬!Æ`ªAqü°Ê_c²‚éõ6 Xâ¯1B<0fÌ$àf”^S<ƒÄVF ×h¶[ Ù¥9WN ;ýœ*¼Tž³®{ LgC­²˜7)ÓÓ- œ*ÞM‘í¾ Ò¢í¾ÀÆi_`¾è馢Íe½©)/DDáÈWy<~7Áè¾–¶"bɃ¦ ²Ãçè< P¢Ú!3œa,klDD!ÂFgŠ£7HAݽÑcý9KÉuè%¬R?wFmÛ™PЧŸ ×Fä˜ÿTßå LCYÅ!d°1€“At‘¶Ýü}ê~½+á®;P ˆ¨È@r†ô¬Àõ¼¥‘¬àu2&Â4£€M0»ZæÐƒ76yâxOõçÌñrŠÓ’$ê4Ç:?¾ JúѤ5ÞØZd—ls@öAÑ¢}P`Ã䜘¸¢GŸ)ÿÍeµ4"ºµ)Øôâ2å (üúKªZÚ9„b ;çîb1ƒ$û‹)¼8@{ñîTTW Dae —ç|O£nVðWcç>DíO3Ï) ;ÇðbI"õQÏ ²XeJ‚¸PÐõhŠDñîÙJ Ö¨¸ŸÜQCçåŠjø=Çx¨r+ѳ ߀5ûoƒ”¨[§LƒIÓ¹ ,w¢É½W Î!¼"Õ«ßÞöÙ}‘Ò[ýy“Ò¯òG{b8¤Ô¡(ÓÐ6 ÈÑSF°ùCXÜSeH®©2|© ÞêÏÝû¶p›•HÅwä"e+º)©ô¯ÃVà€JކÊè„XL·‹­ G°•dæ—’¦%'Á ˆ\sýIHOõçOK¿^í´£Nhå+p0ƒ°Q™^íAïV"mÓåͬ9» ‹?ñI‹üëÏÝݬp|¥Sƒ—ut¢eººPz¤ñ é¹dmG¨(yÙàŒ ÎG¼7˜,ó;?ö©¯{ª?Zùv¥=•¸Ã¦î·”h\CÝqb:»å'Kr„ í obä_î÷›…<=!N×°ŽÚÝ·O½Åfá¹Ø:=¥1–aÚ$¤âèyÐWUãUj¸ã숆џÊî¡þüiéÛßö”;çÈŒ½Ðè-ó' ú(«¤_«¼BŠŸ8+õçnØ/cÔÇÄÚ‘ÀÝ d0 ]+™v¤TÆ öZØÐy]”Ó™éí’?è¡öüéäû~ úéܾÖ+pA¯1ƒ'‚c›¦w œ‘ º/ÇÊJ bÁDìoXñ˜šå’g)ÈœÎþØÄ¦CPSÄùíOeÚþcC,O`Îìøä‘þ§,©äȈÿQüÏÿ1øG–IÇ„,µ1±NV%uR\'#×ʆ!kE!AøºÇÿ7Çêòk#;ÿ#IÃJþ+à?‡üüÓcÔ ò>¨DŠôX·û†;#Š M“.‰ôëÎpRÈV.TEËõ€z-‡µ2ˆìé±xÿþ°1Çk"3o[ûë §iÇ®Ýqvª»«ª«º««gº«·~£pÿAÑëðc‡w=3uZòÁ©;×íúÉëÓ¨ÕGÛox¶õ^è­‚¹»>Ø ŠÎYu‹þ¥èµ…×lýæåÚf;^o;0ñ–¼ã¨†÷z F4Òäø5óÛ øV3µ°ãÜþ™GÔ QÌ6ÞMzýçÏ~˾˜ŽX~j·üæÎe+VÅä6ÓŸŽ—Üû°sñúü 3Þɘ£1,óùhæ]—VœýÉïîý7[Êö­ó¹‘}ðêȼ­ñ½'Ò_¾É{üñ´è§e›†¶,Rxn.Il¿}hÙ©Y'Zþ2³Þ‰Ì—9Gì¿™OŒí›U\·þ„Ìú_—Œì¢­×êQ±ÒgS7oùÏý[?Ø\§ÓlwÞåæƒ”“;;ulÈăï‹–Nþ|éîwÆãÝ@Ÿå>z1ïq·EüìÖ±£ãNÖÉ øåƒ†'ê¶™z×PÜç«Ñ6üÐr×ç‡'у›ÔÝéüÍÑß.nðËษêz¿5ñUùnœZ°2nóñð.ÂVŸÆì/Þ¨ ÙÒƒ|ùùUß_i:tvv‹òéc¡ŒKxÉ›{_ü¡÷‰í­ìؼ{vr@jL›R¥üžQá¹<›ØG(Sö¸Ð"xk͸ë»vn0ÕÛ7Ù¿Áš 9þÔ}6íN&S:n<9®Ù®“žüÙöÁævÃ<Ÿùž, {)LÊê–-ãåMjщȡV6÷éŠçdGŒ\M(Måü”4ÐM jÚ.Ñwãl"a™Oï÷~Þý¡ñ}ÁWØ—Jë§ù‘½–­ >iI]+ñXæÛ£ÕVÍ;ÓÀ(ã\Éõ9þ-‹|<è§ý'×-l`*©ÿN›OZú€îîYº,¯^×›òØ‚Yþ‡ß) g20;çÍ¿ûuá3•*#ÿëù”tŸWK®œm—¯ ãGÑ[ZÍ}’f¬÷m»È)¹K³gîïfˆ—üšFù¹sñ>Ü»`à— :Íì^’©TóÛœWx$&^õù®þâû-î,h:àÈêÇ/kìwY•óPìݲ±Øëë Çÿ;yóK,láÖ¥ó÷®}“žXöîÚ¢éêÉ%o”“ãÅv;6áAv° ¬¼ù£'÷ ‹¾¸¾ü»\OõDõ™gübžþêJŸú]¥Aáy²V³Ë£ôî="÷†©ììþ´rÙý°ýó~×=ºü¾txycYÿ@UѾ÷^ÍÚtÑtÝÊkDŸÃKÖLèðt¦¶ëççšGÎz:½e—…Ž r¾¸å±M{áÒBŸ9õSoy´Ÿ0aA0ñ.ñ|qì⤭O›ø…-Ƽ׬Êo8A°(>÷M|bfóäæAAÍY8ñòÁób{|Øâüî9纟¼Úf­p_ˆq½ÿqû´i/çèvþ—òtùë‚IS¿ûêät¯7é;K_í,ž?³Þ•÷´3}:ä½ÖÛÚÇNéã›ãÕ¡äÀ ‚=&×íØêäÉwõM¢¯×î"}"òï¿X:¯Ajø¤†e¯–ïøWÚݨ¤WóŽŒïP7ûõ`ûåÆgÆõà‹ui-†ü¤È+,ÊßZ¢wiÅðÜ„“®¯jðMÐŽŽEâV‡Î.(辤ۚ‘í¼f­ö8ÓÊËÚ¾0¶Î¼Â1…I{ƒó»/òùCõbÔ¦®9oÎJÐ {§I¿¹½2)âæ¯­ˆy7ãgoÚ,çÝíe~Á'³L_4‘;–ž¬Þ0àô‘Éõ|¾jïò^å~Eÿn‹mJèJ§ÿÖùàIÏ1£–ÍN?öâvóF]ËQ|u98Þw)é¼W_2”Þ$Ž÷}ÞaËý…þ991¥Ó¾.hÛíÜš¯F×o1$©uؘœìX¡gâ†Ç} 6Ñ×þ’\b^Ó·¶ÄO›ûcÏÖ ¶ô ÿmkT=ñ—-/i—±hrÛžk›”(ù{ï ¹Kå\¾¿æî™ÂX¯Œ¬Ôô}+²íùÅõåŠ_¼·ðŒž®K7]Ô­~×=·7¤%Ïk©¹×î.òÀ¼ƒí ½ §æûß ˜§+ëî í“öáëÎ!{¾[ýOzo‰ëÓkVèª3 ¾fTÙ ˜íÏ&îÉÝF—®P4,¾[´Åöýíóc¦ìVo ÏyþÙ¦²‘L?mèÝ&u ÝÑé¨Q³àlÖYß- sïüpn•I³(»å÷ =NŒ:¶zÏ€µKèä^e·¦¬•vQïëÏ?½M>6gÈæž£ä -úŒzÔáÛWW¶”ͽ8¦p®¿æóG™ g:¼‘®ïê=¾päUp`üxÜëi⪣”ªp*„ñMlç}hg@<£^¥ùÍW茻‡¶í)MÞÜ3yÅÞž¥ôÞÀ3Ͻç] -<ìëwN#=~nxáñu-ò,Ïú}Æ*ÓïþÚ¿×h°â”þÊþPÞ‹ÂßM÷öµŸ‘´Vx©|À"Eã_"îÌ7®m¦‘ô|2yÁ:ï3S¶'“×35 _,þáèÿ³G®ûcÉâ'vHäob×7Ú¶øIÞ„e‰AŸý³ŸqÌí¬´;Oíî"NÍ›ÿbzî Gy⦱¹É¯WM»³™úüV÷ežwFŽ9~îÙ¶ã÷”[¦?Kßûìç(Zè­H*jõîû%kž>Œl{Z³$R“#m£ïuúÏÑ­/øïìñ$ÿXq:–ë=ÝCQì9³ý̈Ô×¢±-ÿžþݲ€—óÏLñ~þx7©U™]ø ¹I³»$Èp LTáB KO!yèÝ/‚TQD(cì1†æ#Ëâ1^{ÞàÃ\ì›BämA°ùô;=D©c”Ѥa4zj€7Œ4`¹p“¡4[T æŠôC'} Xo ƒ®/D«e úÑr€ó¹ÎÝÜ#†‹¸‡ç0àRî&ãn‡EÀapX‹%žÙ€Ñ±…³X„V±V.€ŒðR*=q\Äth2¬ nS·—(ÌBšQ[PHI4`ÆðÞ½ÍåY™aæUÔìR+´±”=£J…nYCm>‰’ËÅD)Üê…ñ¢QF¤ó*iv‘´•V=•3‚sKøPôb±Tà’‘r¸[®pW\Ái …ìGM±ñTýx·< \J ¶B»ºEú—¸ä©ªg$¸åHèRJ"·æO¹’J]rTµàénùq´?öB/óå\TFÎwÉO•"7»eGìRy9Á$2ç²2“LEr©bwÖ/Ú o…Ì_šÙ­–Ô8k“8÷ƒí’KžB›ÈnBÅSô£}ï•-çËý>쯼ü׳oúû9Câ1ö<¡3°P,ñÿù7k‡ï?2ÞÿÃ7$©X\ù÷_>ûýW,Â%¾TX‡Ã!]RüÃÏÌÿ·ëüûƒþå5FÿÒZýWÇe¯œ_SôϯÕµ\úÇkŠþq~­þ«ãrп Æè¯Õu\úÖý jõ_—ƒþE5FÿÂZýWÇå qÑ¿¨VÿÕq9è_Rcô/®Õu\ú—Öý×¾ÿ©–ËAÿ5çý_íü¿Z.ýט÷‚Úùµ\öúÔ˜÷µïªçrÐÍyÿWûþ§Z.ýÿ7ßÿ±û¿$|÷þ¿vþW-—“þ•4¡×&Ó¢)‘FË'úQ49²¸d¬’¡é±cÕ:"%)L©š@‚+ßÿ' möÿ±úˆøâÚý¿Õryw‰ŒQ1 d€ ­0/š Ž«f\.šñƒ%û¡RÜ‚n½ ÚbÖËþ{ì}acÓªPþPƨUQZu(c (T˜˜=Q$–rõÃ-%ÇPp”…5ˆÔ14£Æx}C_ë炨ÈDÌä `<=i0¦ " ”Šš®U2ˆêpR «É†²%t:"ERù¦ˆÂa°$¡óÅÄb &!Ð@êR ¤­¿1̀ʘÂFåâ…„[ŸpøD(Ò  xÜ”NiÔ$Ò¤É A°Š"u¤žÒ[|„]0µ¢´Bt¨ „E«*²H/LIª(š&,0²nÇÔ-/Ü™ ¢ wd‡l„Û±C6öø`µoÁ™Q8áƒuUØáBHŒc6ØLx±vD¤Z®¥µfèÕ¤NChU ´µ Ö–°+(‚µ%œ¹A²„#Y$BT”„u'ìxA¶[ˆ J‹! ¤ bÈéÌ‚ œtdA ‰’vDa;äQöø ›Ô[ðAf('|°ž”> ¤ RêÂ`…@޵v IYcìhJ Æ™¦²Â8Ò”Àú2ö4a; RÈ£‡ãP’Kíu¹0:Ó”BVŒŽ4¥°F;šRH3ÝPº¥ æ mÀ$hk”I„ŽP¢Ð¤¹—C#Ç-i@Ù2 6îB8Ñ_"¥U%¢9èævTÛÄh±dÏ€¸aNÒxý}–„h@VHaRØ¿,@%’´ž´–ɉŒŽ i+ÀjÚ­kÙÌ—Ò¨CXP ˜FiIÄ"–Åfä £4¤> нØÔÍ&Ma hJYIb(C«\$URÖºx´ò”€! 4õ‰‘t‘ã­´í“+CÆuPû•Á+%nI+iÛÄJ(i’ÐvlÊ §Ì2ÜY6‚£„ã`]¯TjZŒñ” £S õ$ŠNvúc¹€ÿFÚà&‹‰mªÎ8­­XôJ‚&¹Øä)´©ÑÔ`›ÈçÐAVDzya§ð@¤I‰*p,Ä%ÀRlF¶”½, ÐÒiR±¢˜F°oŒŽ‡Õ‡$TÐF›¬< Ùrà@º³l/¬´(c0pEñ·•¼X*J› HEEæÐGl÷<.˜‘4‰I¨ŸÛÂmq& –vñœì¨r'jÀ<¶@£ö­`ò½œ *ŠP3Z‚ÖÛá’f¼DÞ€l Ö `<ë° LKÒ'pO¶x­a \äaÛµ»LZ&ÅœÅbáŸ-§<Ö®¢P ÃÃP °Oz̃Çý°im¼dÛÊöj …Ó‚7TWf.޵µi6æ¼{TôÈ6kI!_q¤*|òóõ¬Ž)„(SõÜ£¯¿žìóã!K@*4Øõ ¶›±¤!GÖ^ŠêyTôT [YmªtD€vX­…M€&HŽ> ÁìÃ&kª± PÔZÒoNSFHÖÍpM‘P%„ÒcÓl¤‰’l¹ü‹$98ß"` §. )áBý‘tVù²rñð°µ ˜¥8+C«³,Í„1¥è( [X“zÐú§›ï&=Z¤Žþ‡ˆD°×Ái ZI `HI‡?Øj@fÌQËæYP€ëÕj»LÁÍìÔIÒ4•¢'Dz¡Ò  xºt[ÁéL¶OvI¶)ÊÌdÑ÷Û/gX0H¡Õ£y?æ‘B*œÕe›-Z’ŽHldÖ‡x̆ è†;n¬Ž™¥KqŒeð4„‰ûi‘-ôè:{æaËšzc°RÔ0*4gÄ<š!TlS¶±rÈnÖovŠ¢Ñ´mt}›gc±ˆ\äC uš‚7höàüLǤ™•sÔ,PÎÀˆ-RCÀ1ZoÔ‘–3¬Сó¯n7FF°sþi@òb I° †$èOõ¥ô4èê0ž¥tL$ÙQ+ d WI¬nMæÙ¸€kFƒÕã7³ãìà”ü‡½+¢Èú~а„C\NE±Ñp }1@@£r%T&†ÉÌ$ÉÌ„9QÁoTäsE\XX]øXÐUYu9PQpÅXXV$ [U=ÓÓÓ=GÏ‘N¯öûñ#ÓWuU½W¯êUuýÿ}îƒù¬5ÌãùÀntLœyŸê´ÁaR½Õ]ͯ]ˆ¾‹¹ Ò+H µpø"å®ï Aý@äÆúNÿF2¦¸mðà·!-‹ U&N¬áß±s@,ü‚7Œh·í+ÂÆx¼p'_Ä»Ì Ï’&I,âÒmÀ…FFQyb’Qo'ú7i€Ž¥«ÐC#<†8TaÑv–GÀ3˜ƒ?ØBHå¡ ?#X™ÈÏ*IÑxézR>´¸,hÑúàyy…ðR©“”•—Aö-À\UÓìþ*¯ÃJ‡rв#H*°¢<ÿ[$ƒ<ÆR1ÉÚ­~kü4µ’½E‹É°òbFŒ““Žæ§?–H§8¨…äv\8—ºkX|þ­JŠe}¦æ¼£_†(!È g @UåºrÇɴʦb~á´2·t!ŸüíœÌ#/—¶"C» g"j›Z3¡•Å0‘«s›ÙŒáÐ im& Šnû@;k¿ªVf÷êÆ ‰ iØ4‹%&K±ˆÒ¡ü(#Íì_–”•A–'êA@¥æ´óRJhI²r“)/7% LR ÂED tt莿DšÈ£Çwë05œ‹IÍ‹ª$NZÑV¨©pQìxT8×V8‚ç’ô@_MØ1ÄhOí`îd]tœ ^örìû5ä‘¥âøx’ŸÕ𾿋!š¯ïIíÍ%@þ,ñøyA©Dø®ÁÉ “‡þà™S*I”ÚœòQ—É‹H.3Pò^ÁHP¿Í€˜ ϼWƒ1 ¾b_½º5±4’S¥®E,cä0æ(“n-/KÖ­Q-óÛñj5çýZ,ƒtrÿJ$÷ÿâ¡ÿOaÛùlV·Û‘ KRxƒ8ÃßTÙ” ÂlR¼Öl²Éº)XÿMÜO)ø¼Õ—B þ†ÏcL0¨êPãf² zT-9¥âv_Žéþê@M#^ǯµƒŸ…d8j‰>N€nIÜëƒìÅì “=œ‹“=‡ÛïôßžqÖÛ°þ"á_¼l'uŽéâÂQ¶9!yÙ”@8’%ؘ:KwpBåŠÕ ·EÉ‚à+ “,þ0d.'ŠWD;>žF×LΞÿRÉæû_­D@É¿ÿÅ#ü?èû ž')Ž6ù?t–ÁV«Çí¬ªmŒ@Ñ5T5_M šá…æÎŸ)M+Ù´­D@)Ú?³êïÿ)³ýë"¹áÿÙ=á€ç}¼Ã̪¬÷wí¾è`Uéwò‹‡ÞõjáÜVsVìr¹†ïsÔ{ãÀß—|O—Ö–¼ùñõ}'ϸúÙíÏ=rÕ´imó;ŸÚ<åOùÛïëµÄ=wﮓ‹®+êS6æLÿó»|0áÐÅ‹ÀÛ>Õ¶êÅwÿþùþ/oÞ>ã ~ó®®ëkÇŽ½ûÿñÒ–­zn÷#3ª®¯žðÉê`·í·?úŠ0ðÃGj{5¶ÿøü½yê¡Ú²ÕÝìôþwÛÕýà U?½}bí?f×Îyï³o{Íhؽè©í»»ÿÓ嵿ÙY4ä±’.c-›.ú÷½Gê.ZX;wö鳃öôÖ]¶,ßò`‡ ;V/x`¼§ô$ýý9]¹ÃݦYÑ…}àì¤î']ó9ë¾ãÔŽ wûÖ¾ºíÔ+mæ|;߸aJ]‡³ç~m?M›åm¾X;5ÔÑwøS÷˜cÛjó„U³¹›^8»¶ìµ‡m|cÕΣ7\zúŸÃÎY:ÃÛ÷¼{®ü¸ÓŽ{ÞuñÓ\eõ²÷Ÿ¼òŠöo¹dôâû:´»bÝž [Ën Þú8ù·ÐÜ¥ç¬| îÙ»~hqÙ”û Þ½èÀÒ)Õ‹¯qñË Ú_¬^¼§Ç}[¾ÿê™VÜù·#Ÿ?ñQiñèU=–µ:uæÁ»F]ÙúëÛn›|ÂykW½½ðî.žñKl¡éc;7\½sujaß±ï㻦,\Û¦úÄòÊ77ŽŸ³ïÉ+7þß. ÷_õÁè‹Ï´9ÙŽy£Ç3§/Ûtíêy½ö5ä=÷Ô“åþäÁò9ßþѳÅãŽýt~ïŸ2¶¬«Ï;|ç'kÜ®‘_ÍúWÇv=¾mÙ·õ#ºöx›)ëÆ®Ý·å¸Å«Ü¯è´tÙŠ¡Ã{î9Ù5qÎϬþ󮺕µ‡8çÐ=E ¹XŽKƒº!üµAN¨Ât "uC˜”!uÃ/‰X`Ðü#Asÿ;)Ô±–ųìÈ`|É h™NÚ­iÎ3R5겜ÞÀ ¨Ë…'B]/鈺LPIP— \$L0„MY`U(É8Ç«ž‡ºŒsêg œU!†]yŽ TèÇɨÏQ‚úYøÁ“tN…. ·k%E.: ûÕ9-öXú s[vÃúÅ9¥À&8‚7ãë_š¤ÿ—8]Î ‡Ï_nÊìÉÇÿÀu°¬4þgX8þÇ7Çÿzˆ¥ô^Pµ0¡îCÁ<‹Ïփລ@ºÃRï±À»°aðy¬ÌQãðÂo¹Cy´¹ ˜Ê´B´ù-ïZqܳ¡P^(O|Ú”"^G{5À²W¸‹//hñû1˸6`w`ùƒòÝ ÿU–ðüoGÁȧ°.p~(5P.í•Á1j¸am¤ÃU †#ntÞʆfNƒÃ<®«Í_êw¸€ë§à–§­^«¬8¬Zto=&¤¸3qÕ‡°¾åVKÁu NùYKÁ¨€ üÄœö~š•ß”§(ÝN¨$ŸËZ_ÊgER0 À½P…Xø¬ÛûDzuA€º˜êôúÖzL[€'ò-@“ùIk&²šÊ^âÈqÑIYÑ“)R[µ€ÔÀý°ä˜ j K£HMPæð¼n îÍÀl`, ,,EMT{u¦á¥Ûa®½ðG¦ÙöF^»¼3RÞ}zœœ‹Õ¾,–ý̼ èñÜ•€ KAÆÊn7ðÿÐè5ä uWÎÌ*7aæI‘9XCý^èg´¶H.¼V3‰'6iKo¿V«¾nL)VîŒ0_¼äà«,à­}ûå¾<|¸<È®“˜»¥·fƒO]"©}5Y±Ð`À£îTÇ9Ý~¾sà0`@|=ÞêuZ«ë–‚1V¯Õ…ZK¾Åêóç7ÀãÜTÊ_S”ŒaV0l«×؆RçUL®I2K„ N?º­1¯Íá†9o­wøvÑ(Ál ”üH$Uñ^ú3å¡t›È| Rj–Z½9l šý¹–&NYK #ž©§]k ÁØ $àj%KöÀžZõhž嵃Ç#ã"-C=p;V *ÐÈÁëBsc K';!…1QE°Äá‡S6v8Dónàdêx&O‘Š"&ÁJ<¶€+²[.¤}ØbX¢ÑuO±G\G(’’â|Ï´S‰e•Š;QL©2h© Å© Å 7û&;BA¼Á5Ô|cs…bOâ—‰‰Â! FHyéø¿¼¼r‡³Öû<˜¿Œ…¢jÇ<5è””’Óís‚Hžó58lΧÍ*ÞèÅê@4ÿ ¥a:´¡pÜ9Q—ûŠ*aæ¼â .Ö!› ߨÕ,¨lÌ6›b±©J&!;—s€éh3ä_’jã;,ýt+¡°_±Ôù@ãwñB ¼MA`Wµgzpb(ìôÄÃÊP(-»£ Ý%óHqFÐ.å¢ÊÈu»Üñˆ·E‹Q9Än÷ÂÎaÛ¬÷Ô"Š}(}“â²±(УÀ!mq0ü#jWª+9°®pR9ö6R $Í ¡´¼§Í)ÅÄzù¥tLP,z¥5Ö‘Á£`Íë°y¼™¤Ú‰»’[g“ºI>K›F¡2]1–’[µòZnì¥Õ†N Ц"ÂôL›×fÚêшö-–_²o`ÇèÛUôf± e.½-FYš6 Â,F$±æ­¾ž+G©5‘£¤µDVsK–Þ“Ôjñ±ñ–1í]¬€8/ºs±ÍhèD–†.†õÈŽÃór3W_Í‘‹‰5…‹)§9§"Z;œY iZ'XÒl„¶ö¡˜p1bó@5¦n b5C-˜54K©pLöx¸öâw'âEio…Í-М} ›MK+õ…'ù‹ƒÒÏhK‹{5-MJL[KC+ÉZ˜l±"ÍiÚ|ª•‹äÓ~oÀŸ†æó<ÜŽ Ë*¥”r³š0(wøáz_q0ü#ªXÕ•(5œTŽT*­V& ë2éPÀŸx3W±–_1‘±‡€ö•åÐYZŽ4ðGF]‡•ÛP¢{rcMRz¹4))ÑÄAU¦Ȱdk̹Št¤$±©Öú°}èh\LÖÆSÊã„1 ®çʨÒc´š”Æð%óØ…IlZá¥ЋE' ó¸Ö`d…&Jˇ€Qü"«¤tdiÅðò ø»¼bHŸrøkDé¨Òò놗ÀߣFÃÿ‡—•.+åÂZÃqŠÌbÖjO û%C˲²\¸P,Þ&ý”Ùm¼«¹°ÚHb9ŽKdËòêUy¤>qi>Qì‘xm>·À³éÙ¹ 9ñ6UðÅ1:Ù2†ßc÷TUÁÿч¶d(X~‡*‹0-`>+úJk=ܶŸÔšÓiKaeTŠaù¤§åÑ‹Xí•ZÞ瓱ˆßkÂ!2¬ƒè³MºdT…êÊêup}1/.ÛB({“èöìòUZ´Úë¯>6 Àkn‡× ü¯Ç%†§¾Þ3 VT»¯HË·§(ûnÇ´ª*ŸÓUU3T…ùªøºP0ÙW°!­éØ’¦¯Ç] oM‰ˆâûª¹ùß(š3ùßu•þ£-Ýêv{€ƒs@g…ÚzUtËšiß$I¾ÿ’>’2ý³ç7KRœ¹ÿC1ÿÄ·“þͤ3éßLú7“þͤ3éßLú7“þͤ3éßLú7“þͤ3éßLú7“þíLÿ&Mic£HÎêWCþÅGÄ:‚œW‡¢´lÑß‘¿eóš¤La¤D/ÖÎ4Éfù<3\2ŠÄ’£„¸å€ð©þ‹@yÇ>WQJeÆÅ“IÄ@j|ætä@»À$œz¯Ë‘ÒòRmˆ ë–—’P¿Ã¥˜¸“IN=?¹{U LÖÊÇh&¹}ÖéhiØ$‘+8yÔÀ%`‚ˆþáHŒÆ3†“×ôzø ‰?ê—&$mƒk k‰ «i×J²#È‚ñ/á,6;Ô@»•—ù;8Ýñ¨„‘Š“Q~Px ãÁ÷¥ ÝIá ²|Q†ž€ÄY³aĈÈÈ$#1I¿‘ 9hä¤Ä}‚(]D„¼+ÑPÙ¦mäðÑPÁD]ºá+³hä$þ+&«È`ý_+íƒ$É×ÿñÿKS èpÐú?A²æú¿‚Óv{µ °œÃa­a†çHž§X‚§8ž! ¶¹ógJÓJí_+íƒ$)Ú?Etì÷_$pæ÷?ºHnø^(9úM¼ík‡'œúð’[žfßÛÚ¹uÏžS>ÜÓ}èo¯yK«}Å:÷´¿eÒ®Në§|ßµÏÌ[“·àÚ§¿aY0àß——X×uÈ?´ç¡¹Ï½ê\ò©e£÷XñGA²ÇûûˆÔ¼´ãуVp •;§Î?¯óîÉ¿û¬çº1ÌÁž]·äÝmíÉÑÏÔí§¢Oç##~Ï–<³Ý¹ÿíÁ˪¨GkyhЈkì+ðmöo¨£KßU¶ þáÈæ‘½z]îÒcþE'nøÇôO¾¸if—ÖËflýd}»þ,~jÈ;=ü çç½.ÛðAeã¼sJçî¯Ùüà«mž÷@˹ó O>¼s~ïww÷ÿfÖ  |í¶÷ï=ñû¶´óZ˜=bù®’-óæÏïÕžÙ9†òÝ9î`÷n›Š*ªæ¯v/³ÜùÞÁ3­n~fÉ®sŸ_Ý­ãô¡û_niX²qá'Ï»l]c×…U£ÎèÖ»þõÍ“]…e·Ÿ·ôËS« ¶-ŸÿtUùÕ-OïýÛɳ襳çs¶•õdïƒmZ¼x|GB†J Ò`8gÔL‚ƒ,x NŒAþ>FHJ) iÞ';‚ø…>0KAo"ÞüŰ ˆØ@¼dbœ£h5q€šìg95a-¨ÏÅ#6 95QÇÇ!1`8Õ}b¾´ ‡¾›Î¦a¤›ò¯à%…¤\ÿMíE-É×ñþ úþƒdY¸þKQ&þ‹.bcqÖÎØjh‚°‚•¡Á°Õ¬•ª!›;¦4­¤lÿi£½¨%Eû'Ðæ•ßPŒÙþõá¿,yÃyCÚÎ9úcgáH¿Ô¼NMÒâ¯Ãö½v«—Ξ;¡þåS?Œ¬YWæ|é^rvëß•~zö#ŒiYºwõö¢ÿ{"ßrä¹§NmÝrï¤Ö¶Ü{tŸ0`S‡™7üsìн‡~Ú¼òë1‹ˆî®Lý+í=oŸwò¹ÅSBRÏvµ½»öj²båmU®o¾üå#¯Ûx=ݸË×xδ‚y=ßù¼ðÏ,¾œÙFý8{ëýo_½“¼´þ†“{~ë êô‡ýîpÿá݇{׎:³õ\fÑ+kF´¼~Ëü›OÞ±Uh9®Ó¬¯š}iÉÀ›/¿qÕ´M7?øäóÜðïm¸õÅåwì¸ÿ®@ûÉkO½øzÑ™]—ä-š4ðÚ™Li7eXûõ}~êuÓ^{˜zrùg¨×»¾¾fVÏ{o-z¹ãëÖÏx’9ÿ¥©oͪxÇ®™8áíÔÿÔ ß0%1t I¦Ý"N†äºE#·àrË+HKDjŠAIxšK„H"^Ò‘„H†Hüµ„Q£Š0¼ ¹H" ®Fa5ê ï¥B.Á9VvŸi„H…4Òö´ï‡ü.cF,_Ã,~tå%ýÔg”H#8Ã.$Pôÿ†ÙÿmîÿÕGú7Îþosÿ§.¢Ð¿qö›û?u‘XýÓÆÙÿmê_Qèß8û¿Íý¿ºˆBÿÆÙÿmîÿÕEú7Îþosÿ¯.¢Ð¿qö›ûu‘XýãV£èŸ5÷ÿê"Šöoœýÿ¦þuEû¯6Šþ9sþOQ´Ã࿚ó¿úˆ¢ýÛŒ¢ΜÿÕEíß8ë?¦þuEû·Eÿœ9ÿ«‹(Ú¿qÖÿLýë" ýgýÏœÿ×Eþßaýs¦þu…þk £sýG‰Õ?cœõ³ýë" ýgýßlÿºˆBÿÆYÿ7×u…þ³þo®ÿê" ýgýß\ÿÓEbõOfýß\ÿÓGíß0ëÿæúߨ»–I’³|âÐ)d,! Â$f3ùÎqk`wxİ3šÙÁxÔÊ®ÌîÎÙ¬ÊrVUO·Û½d‰ƒ-d—,„d26–}X­8X<s@B‹Y!°-¯-4ËšÿÈGDÖcª2«r Q¡™®ŠGÆëÿ‹ÿ‘ÕN¨Ð}ü¿ÿO+¡‚ÿësþcCÿVB…þëãÿßøZ ü_ÿÿ†þ­„ ÿ¯ÿcÿm%Tø}üÿú·*ô_ÿÿÆþßJ¨àÿúøÿ7ôo%Tè¿>þÿÿ§• Óß^ÿÿ†ÿ[ ú¯ÿÃÿ­„ ý×Çÿ¿ñÿ¶*ô_ÿÿÆÿÛJ¨Ðmüÿÿ_;A¦¿¾>þÿÿ§•PáÿõñÿoèßJ¨Ð}üÿÿO+¡‚ÿëãÿßп•P¡ÿúøÿ7þŸVBÿ×Çÿ¿¡+¡Âÿëãÿߨ[ þ_ÿÿ†þ­„ ÿ¯ÿwcÿo%Tø}ÎlèßJ¨ðÿúøÿ7þŸV‚Lg}üÿþo%Tè¿>þÿ ÿ·*ô_ÿÿÆÿÛJ¨Ðmüÿÿo;¡Bÿõñÿoü­„Êï­ÿãÿi%Tø}üÿú·*ü¿>þßÿ§•Páÿõ9ÿ±¡+¡ÂÿëãÿßøZ þ_ÿÿ†þ­„ ýßIÿ¯mši‚à¿¡{aŒþ½ðÑîî êîîÆÉÁ®{¸»„ýÝݨ׉·Ã~­@ÛœÞèï˜@z™þ:Õ4ÿµevRøNÿs?~çÞ¥§‚d/¼¤okʹsWÓÐ&ée$CrcŽ’Ñ·uráçà˽°O¨Ntã²ÿlòܳW‰®iÖExò>uÍãErËOöl4ŒÃËägàëÿ @Xl½Ë?ŒzAÔ;x:9¾L ÿÙ¦EÂÌë½àjÒ톽á@øG!–¢Þ4u©¨×’ᵨ3ÄÆI€_‚p_É÷°¤¢¨ƒp8êßò‡Q’S¥ë§Ï+êõ^'ÁV>ìÀ0‰nÙÄOSÿ„U@*¹š¢Ü¼w›×g ²ÈA‰Ã0=òcÒßE®B!$õ‰¡ÙD}êz£ó;£aX¤èÒ‰ÒΨ»‡ÇE² ÉA¦á ‰$¤8+yŠ))4Z$0Œâ ,âõj' ¢8öó4 ݸ.uh«^ï…ê®W»A¡×¥nPèÆM¹>öÍ õAgnŽÕc½)Õg@ÊsÕb°LÔ_”q ‘áa’öŠ"PýA˜vý^°š0Z_zЄÑúã½3¡Y¿Ú¬ øå“0v_ê+¬\ÕI`B':• ·  ¡Ô ºŽwÁ‚ «]° ÑPjÖ¡ÉõA7£ õAg¢±ú`œ‘TŸ -4ñ‡E ô¸'-$º–HmÚPO2Þ¦ ]IªmÚ0ÞDnÆH-8ЋdûƒÃ"žÉ4‡^ŒÆÛt +£j›Œa$µé@›'r}0A'ùƒ„(Ê9Àº!,€PÒ9ôS¿œNÂŒËd`ÿè…C,v µñ€uâÿý¨ì'½!‹Äaï`xÈáŠCT^üꆒá1QoܼFz!¤‘³SÒOúìÿ‰öÃxÏœ‘ý$õã¸H( ­Šb ٲХ)€*ëà0æE½»¨œ±‚ê³Q7\º›÷alBÞÍ¡G)™O'q0#kʳ ã#ÔŽ?=çÒí½8úÈ(œQbbÛrö´J®&£¨?-}jãyþĦÅÌ)tâÐO‡ Û›ÎÈ^ÄI¢äÛÝÝput` í§Iö3ë¸x}¶!MQ;I’—|—öýnŸ‰~¬ðÇÅÃ'”b5±¥:^g±Š]2èøqÈW4vS½Ù;º‡I7|¶Ôè¶Æ«ƒ®î²²À[¸ø) ;¸øHõ!žO±‚ì)y.`ÒNâpµ&qoÜÇ&À"U1!d%S(¦QeÉ—œrnëàbÊûÇ–X©ëq9Lªš²¿ãOh¶ÌËF½×M'-\“Ųmcv£b¤Üo°3;±¬†¸ ;q*\¢[f^õ´8£Á8|ûð¢rßÚ¶tÂþ8ÛÙk[ƒ&·©M\À{–ÄbeQ}ÛuÙ·Ê1ÛóQ¹-¶})’QIWîõ.hÈä>¡&%¦cA·bzyK\}Ä:`éû„í<<í©®D²³CÔ{£½áI?$êswoò?ÞXjàj‚ eÝݽÑþ~˜îº‡Û‡Ãn|‘\¹‚uÜŠzÏ+êSÏ<“ƒMÝõS.N6ÃlTÍH”2'.£3VÊÔ%¹”æf¬jzÄtõ±Ãf—OîB+ÇÆoº›gf+GøclÓ¢\þÄâ+Œ’KW_j“FÅ”Y˜`¸GÛvþš†GŠÝ¾˜`X¬œ_jê̘iYÄ„nR]cÓ Û(ÏÖm˜,X†Ÿ&§Žkù3æ™÷ˆJ*æ|4 ƒº%"À¬éÎt ZMåÙ ŸL"O@KD1` x@h {m0Ô` (C wÝN¿ßÿçɦÌò<Íf‰E­2Š…Ëh þ_Ns3Ö¥E ¨Ñãœ×m˜ÖX &•ÛGÆ×šYòÿâ먋C–¸È5Æð.®|—à’‡”‚ÁéÑ âhã 06ÏÖ©GlxØÐáV² ªœ­—›Ä5Ò.`„‡1„|¤Ö “ÀËf:+Å`aÝ.èk;"‹;&›‹úøQ§òyñÃ¥ÓÃ΄ÙuˆêImü訹_ÅÝ(m¢H>œ|â4—E³¹Â(2‹ba!ZE–ÓÜ,A×èDa“ÛJ*âh™»Œ±›Š€/#0Ä¡„AÁ0ÆñJŒ% m@ðÏÔ¹ŒÓWd*Y€?º8ü…¾[Äù<߀|@Ûì°QzÄ|ÓƒIp› ÓæíHD{,øDRŒÜ+Å œ»X~º”¡s ªQùÜdŠš 9¶¤uújcÐÈ0€A …GÓu˜l ¹R«£¹RQ·ˆ²Âe´Ž³”æfé06g´*úðy]@}™ 2ðÍÜ6êèÁ%¾˜MÕÍ‹RÊg”˜ìòv´Õê!Ø”&© c±¼éKd5•ÏÍÖÀÃ(ÜîB't­>›jàLbàö>Žl¾p8Z±}ó±e1,WÆj0oÓ†f,EÃ4ˆ3i‘æbÛ†‚µ. sÔBƒlNØgSgª*Å&o"S»Œ©Q€É¥îÊÙÛ¢"Z–ÈV#3CÊçfo[Ü¢ ˜7PÂLtÚ€Ã5öƒí‡ÁºÌÎí¶ÇåùpòÓ¦,šïœÅAæ;§áŠÑ:õRš›il„uìMày6»h¤^Œíudq·Êÿ3lØ AÀn ÈíP vm¨ŸÀÞ¨ àŒŠÖFô]Š Ò:›qÍX- @ ™‰® äTsººšÊç†G’ÔuöeKê4°6zj 9Õsû-ò6Ar¦¥}/]!9ëb´– ¾Œæž ¨SkÜØ¸(範¹%xL­dnŽ@½†uM!yg«ämPÛbjóiÇÙY%o»Ð#cŠÛ‘±_-¼Nåóò¶.mñ:Ì5™oõŸ&B¼¦ ¼={ƒ$ÝÝBó‡I´ÊéÙ¨rÖy–685Š(+l41.§¹Yœ®»¬‘*§g“\Ìñ‚¾&KüyÔØ6ìªP¦U[²{Bo,n” ˜›½kp|@Ü0ë`ç41ŠÏ•â†;ƒµ¦¸Q£òyqèÖpÑäêSk èj`xl¤ÁROÐ'ž^™jÈF˜ëêÀ͵u”•µR]71:B&we¹ÍÍX¯³p ï×î¸"ÄXÀÜ'ÂF­SzFC @“µéÒñÔ‡Çüg&úØÐž/œC0Ðà ¥€>œÞ"_7ˆ܃v¤nN«ÕÐFg:…tÏŽ¦¸å–b»b´PÔ¬nýJVB‡¹ÙMülrZdŒŽ1ÅÛ¸˜‘ ´°ï¹âñ-#›˜±”æêb¨—ÓN:på"çœ÷PÖÁ{òyÇE0é ° ÅãG ðÄXqÀÁãŽADv+¤P ,âü„äâõV ,ÈéŽÌønÉø6I`©UÿÜÊËÒ|̼£ÅÆ+¼Ø3Ó@ZºÌÉ>øÕÓž:W[]Mi±pýsÓBvÀ[@]1M§;7E’Ž+’­zƒøPr\5y4ÇÕl€®JÑZ>¡e47Ó3‚º=îÐå3»Qùji€cëM}Cl] ¢ z® 8¾CÀtL>Ý‚íheŒ]=gìIŒâiCÆ^¼þ¹¥7IÕÓœ¬ OÆ4Põ<5°:SOœ·ÈÞÙ€r~ÄN©ja´tÓ°Â^#—ïRš›ÅÞ?Ú4ëÌùbæà&§Î›1¿½ÕÏ•%4-“Ðô1 Í`‡õl¦úY¦Ë%4áè¾ÿð0ðX‚#¦µbð@åKfn×’%¨fàQ«þ¹¥³rP]×ÿ\-1'Íi² ·1kÕ?ÿê¥É-wÅñ$“Ÿ›Ãàx`¿ —ñP2·«áÙ{|‹»#¹ëÈFroÅjB¡Ø²³ÏNiÄÆSÎômxeõ/NËÆ[ë©-˜óy´úY&Ñ¢ ¸€¯÷ÓM½!O:0‰„†4Nk»¼W…¯ZƒýÏÄ3Ù­-GÚM©†v <’aòÝT«ì¦Tç»)ÍvSºb‰)e[2Ë“x¿_ÒdÔªñuÒx7e})ï'ëx(ïî!E]~(U¡bÀ(t×aLÀ?¡¼ÀÔìYÏâuxüæ!Mñ¨Bá; fG`0„u¦³—bº©™çMX‡¨›àÍž,Ÿ}nø¡¢bâÍ@˜|¼õÃ6C“»'«ñŠßÿ\í cNnOZ ®&†Ûä’`Íú_lÍ-ìW¬‹Fc 9…/&Œ{ÂbÃÅEÙht/++yS\ööQôªà{DñM¥¸¸D]Þ .Û¥Ð&Âv(á0‡Æ÷)âUtÔã™à”‹­ý¸ø˜v8\L¸ÀÊÅÄí帨ÐSÀÊ{«•VP9ùÕäì+»‰´R³þ;\c«.[ö–,®8™¸¢‹+(†à _Ë-‘ÅÅ "î€:*„™UØnäÉv YœhFÌZõÏKLO2 SöÊ_<6¼Ôäòž v¿×õ:¾Ø¹]›0O¡Ø,Ziù( #-£µlÂËhn–MX÷˜Ã£jߦ·æ ±?yÙ± íA%v,GèÑ$èpu&“1¡§LÁ}ðží9¸WŠñUÑlÿ¡Ù>ĈÙt82k{’„é6òÚ׫î——8’§ØåÇ »ÙÅß@ |Ñ¡Dݨ]?±+ÞÄE›špµ’E]Áqë6¼ø»œæfú‰­‰q^G‹"©ñ{ý§é­‚ªÑƒÁ€6l>ÅN¬\1*Ø2«M÷7®¬þ¹YÙ•ÄX1he_7Ýú¬ì«aVYy7ð‡~»RNá8ðX´°ÝñAÛ²%FkIËhn¦g¯ÄYšMnS®žtR¯ñ]ÝÝ¥°;••ïühs8¢J;?j©¸ó[\iÀ9½Áx w|ä+N“6lWîT¡^2IÖ¶]-\ sÂr4@G&¦Å5@G#&ÚŽ(»a¿øEÍÕèχB”­W|ì’i_æL«êתn§¾Vàð&3àš\ ß«8õ÷Gí p m¡„ÚL¢¢š$Q5º¾œæž ÀMºŽóºø+£Ø·% p°ŽV`22ÐÆA‡feöDÝâ(@E ì~˜a@¾¦spÕ§~'™idmùf '×?7Њˆ—m™·§ÉÕp] 4­ ïˆ(\Ùf£²tQ"îh³Ânˆ/§¹'€“nˆ³Ù]Xœ€ +õÆ6&9¹Í .è8\ <0¦Ý Hm €Ý H»°ªÏ¹2;7srתn¸Ð%¸pØÍhôá5ºm¨ë põð'IÚî[£²Ñìëˆ×¾ó1ìë4¼e¾œæf¢…5ñ–y1¹uÞ*1ã¥2ƶÝüRX,Å_¹€‚¡›ì\ ¾©’âÙ` C´ã½´Ýãk)]N?}ÕÆ¥ÿÛj†tñæc‚Bî5°kj`ë¡¢}ñ‚¨8ʨ‘R.ˆ™³/”ô‹75Ó»¤ã¦âDÑb°»}´ ‘c9çêæG|ÓšŸ-@‹ì‚·‰I´Ê~ÊIɳI)rø/°<›úþ– ÿ!þû-øË¾EröþkRÊg¯ß¾¡¼Ó¿n¼ O ýþw7¨õ“쀥3~ÿ‚ÉÿÝ4lÃÔð÷¿5Û27¿ÿÝFpôN°¿ïÛÆž¸¶é閳߱½½ý°Óñ,ûîß&¬6,Äÿ °Õic6ÿSË2Æÿ–¡¾Åøß±­ ÿ·ÎݹvãÝ6”sùÍOý®‚ïQNö*;;ê-þ;y »ê(Æ_½VoàZ¹’I‚X²Eèw•ã_ù¥¯|òG?ÿC¯}ãúëïyíõÇŸý1ò#ä§ßc|ëÁ»¿ÿÅ÷~®û™üíOœÿô[gÇïzß+?ñêÝ?øû{ç~õ‹×íÍÿsø?_øá7SõÛ¿ð¥÷í}ü¿_}ãkßûRçoîÍ~þ{~oïo½ûñg¾ú+ú«7Žnðâw?þÒ?}ù÷àíÞzáýß}é?_úå^ùÁÿúÀî§ÔÇo¼÷ïþæûÌßûNúõ+ßú?{ü‰ß|í§Þõ;Ÿü·ooŸ½½ó‡/ßþ÷ÇoþËoyÛùÂË_ùÎ_ÿÉ¿z¯}왯½ñÕ¯¿}|þ•×_~õ­ÿx=ù‹/_ùæ ÿpóÓ/_üÙÿeïJÀš:¾½*qy*J«Ð[… "&7! ¸²jÄ(²heQ/É!“VAE+Zi,Š UDÀQëŽˆŠ¢(Õ¢¨ŸË_i- Vù»TkÕ7soˆY$±ïû^_¿ï5ŸxsÏÌœó›9gν“™3sjz£hâ,äbüØ'aon ½skÌí?aUxø·›6ÅÕ÷&xYÝR<Ÿü4îåÜÌ×·'Z?Þ/|WüKݽƒk^•9Nôæ›­JXàÏqB̬SgÍõJk{mDסÞeúgøüøCšè7¯¢£Ï^¾Ô4sÌÚ!E=wö+»’ºïEêÔw¹OOdùí—âÝtðI¹bµ}ýÑ—Ï_(¾0rD¢Û¼Œ”­6ß÷¾…½ë)+uJÊ »&Î}VRУú‡øýÅ‚Y<_˜Zea¿>;W.‹YÁîþ2»§Ý•VGw_OœlïcÑ=+‡œ–µÍ9ß<þ€³ËÆmK££§L­°>ó¦÷\tbtpkÜWksWEåŸü¦˜øéÀüèæT:¼ÔÒÝý\à­Aý,®e˜Å8¤¿©ènΰ8æÕmÞ¸¯êÎ…†VY ´Ÿ*ÚG–¿¦¼¥ Ò>$%²²ë¶aÛ<û~מÒÚåÀ÷™Óùžá)¶Áœ£3l³}{»çT;Z]3Ý®÷ëøDdÏêþRúR4úå!¯ë·Úq¿9Lø+¿<ô¡Ð3]²ØÖ:egæÌŒÈþÛû¿ R_fcmÙ:aháh¯¡~6·m3†¶ØÔ-»/þ/nÛÝAÉ›{ ‹*¨?j0éÀn«äIÃ%§Ÿd;C¶”Žÿã·æ ®Å7_Üc¼õ8¢8…Œz˜ZÕípòBÖìkkí=|¾ºÑN!”¬x©ÎaZåuû_®Ô´¹Ÿ*n^\- 0Ë;r Wn{¨ê×=ɑޝˆ…iǦœÜéÐçûa!÷ž ÜYâ®ëˆ~>ã°îÌ3ÞÃa2yî;‹MA[jV ص}Xî]Ÿ…kÞ ÝXcþðóçÅï&q=l»ÁâN}¿«õ¥’æÛS½ÁÎ7wÓí#íVÙ—ãìƒ^{,½íëW5ä¦_u‰Ç'Ëï­î–gÞÏEÜçÈFËÊ!ífïîÿ“öæ_É/z6ÓÆý{¿mŸ4»«$31»lkÚBaý»Œ}Â_¦§Ž XAFå­iÄVy˜¯øÄóÁÂÏî{ŸÆ¤o”æWYòŸ1â€å¸ï;Ôñ·Þ{äÇ<ë”MË¿ý”þêzÃëÃåÿþ¥k÷ Íăeç&ô>c™Ñ~º¶{žÅ¸ÖÁÒ†§ŒºÃ\ÌÈìƒ7õšCFÙ|•?뾦¤à-ß¶líÞkEíòo*ÌC¾ŽuýŒcù•jÛìì¡9SŸO¿\:ýSž·,)Ê1梓ÝÖ‡ÀC"µçn‹;Iý&r¶F Îo;žµ7kõÚög¥}³n˜ü8{iÖÃâß5·ì¿µþ~°8=­™¬MÆ©øSq&ï¹kì0qæë¦ˆ9Ñ{&5ä]Íê±Z1²wj>èá†Û§ÝÖÙ=ûIù÷Wì2s-Ï¿¢:!豯õë/¼T[»4‹WÞÙøJ’¼¡›ëù›ÍÛ6|þàæ¡±u¢²wM¶æ.%O$ωtÙ0z€HqÌjû‹QËDµÇg$ù*FGÍQü1i$—¹ß~m}à˜"ëæÄ ‚Óÿ)6 ú¢îrc¹mc¿>–¡ÕÝfnmǬP³éIšNÅÆ–›¡¥>K ÙtþPiêëÀ'¶]»î<ø†ÕWó]ûûlg<úpƒõô;iQ–³¦ôºÈèoŸ™õøšï ´ ×]UÙ¶Ù?U4H/Î=¼©××Q•ÞŠ¸ rW¶´l_g_ä=ä9{ã¡¡r÷Ñ[šÒ\Ók—žœÂY3¥bòpãsq9f¶gÃ¥o-KÉ¢…¾%cFŠD»²†ŸŒ(•Þ×kQسsøÛ”’Œn·jʫκÄÚ¿h©ŽžŸ¨Ø”¶ÿÞ4^xAáqÿ/¯M( —‡¬Ç»ì›à½Ã¶vP\‹Oôø¡X;ºÑFY‹žu–*{ÊgˆV¶ö%³Ã¶Šó~Áík¾ʘQÔ$+=S>¥v¤ñô^_Qо=?)Ù[rËòHΊ{p,­7.œ…÷ÿ¹ag~[ã–9B‘2ÎörIc½3Û>­Í«üÒŠÚŠa ¦Ïî6¬¹jqÈʦ©5Ë‘L@„[æoZÚƒHÿùÅõ9ëò̧…ˆ¦ð,Ö•íê²&¦,hsݚݞí%©|×3R/Aü‹JB¾ d*Sn-ê=ÄírôájÎÐïþˆ UÆõ9÷ps¨ô§;dË0[«¼§†Ê*ó§9xïv~<¹Bî4‘³æ÷ÒÉw4Y¹DžrGÆn~þVÖ3pfVBˆÊ{ù˜4eeñÜ믥¶­jJLÌÛØJæ¢1vË·¾-üϨ‡ýqÖÜøo¾e¼ÚU³ÓŠ(›{/·ÕH?Sé:[ä~;5åf㨀ž—ÛrŽŸ?2Û³žDŸ ¬³~ÿbmáŽñ³µü1c@š¹³$2pu@ÜÆB—ƒ÷]Ê Êès03Î*¢Ëòñw®ßšµdšrNú4ÇË$çV2ß(š÷J t/´\mÒ{—01ûót3žmfÝ6Bds·ÿ˜×[Ârhùuo˜ñð¹×ýЫª=××nTñ]?Y÷ªØ—ÿféÎÁçÞ-n-.Ü3§ çäÑžÅÄÖ­#\|U[ГÓtnÞÎ3/ÖííN,:6ÞêqÓêÈ·¼VθzúËsg›*NOÈO±½o»éÜÂ×9蓯Î?iüìZq×ÊSn)Üy‚ŒÀ/¸u!í¡‹çð_—\ýÜvЯ¹¡< ‡þ eOæöoK~×ÓG7¬¹ZÞØ÷»ýQAÉGÙ{ ˜×µˆkQU²d_lZ6§0¾õjñévi–ÿ'Ýòæ6mh|zÝ’q8§ßë2æÈ™} *«ú1OûO¬œ<¬ùÑ\«¯ÛŠ“ç·6X·ýOúøÀ9õÍìŸEÏÜY†Æyî¼,lÞ*é”óf9©¿œpLènÞgsÅ© Ó·q£~8òû¾À¥Á-õÏ®ûåÕúÎÜ>óͼIÙã›êgöàý¾ïmß§\ÏLþ­vF­÷Ê;¹ÑË•E§ûôñìf¥À²¶Y­»'­¨¹áÀÑóqCç¶ÕÕm®š·Ól”ÛD³€¦Ìç> -FÝjË&Gêò¶ømôʲØÛÇWû^òÂ0ö°<3Ÿ_Rª|s}ÉÞ+gø7múä6k‰›Ô-ïî‚5ŽýKf¦TŠWÙ¸.©Äù kv,éƒ~{'-wßÕ¨„ Á¢p~·ÇO¸|Å›g¹LÙ1·.ioaV)kø;æ“wå¯GÿšÐ —KÔ¯†à|ä©_+Áè’ßAszÿªéŸƒ3áÏHL.‘bnDÚ7„Áô¥ÎåEX u=¾•²ú”h%`⣠Ä~8Äo´Ó'A9ÏxrªU”íLñ"`qu^a™®r9A*ƒèT”¦£(}aÓZêD_¸ô…G_øôE@_h.lš ›æÂ¦¹°i.lš ›æÂ¦¹°i.lŠKÓ@•T"Ü”ê&ãhš ¡Ú ¡M‰0½¥%Ä y‡ €ƒ ÔÕ*Šê¶6È‚‘áu°àè‰âëiGÓ æ,‚Nš¤Î謗‘jO†z¶Uo³EÅ 9ó€B:æÔ§¹3]A¹_áÇË`úÁìPqê j>Aƒ†R`§p¸ð`>¡¤ä…câ O“@Pc@è­ð¸}ª×(: Ð$¶Q5qéCUé@5¾Q8&Î3 „c ‡ÃCPÄÉ ÆMEaòp#“8ôÝnƒpœ©ñéãDŒCù¨SXLÂáׇ>> ÎFóÛ­ñÓ LâàÅç\Q:à å7Û?³s½ITúÞH×hàüŽ˜ µ³qeÛÛ$ qÓлuPÄ×ÑGì¸kŒQ¿Km¼£¼8pof£`Lî i ۨυ‹y¸p¿0jK6ãÚùȽìL2ê{áC.V„6‡eªoÙË$£NN÷Â@7j%¶ñÎôqñœ&ñ˜ð½Îô>oTÈ“I›1#fˆQçËaÓ;EÁ­ÙNÎF|T„‹I8F/Gý, W7`K¯M1ê}a»À§lSOZøiŽq· OϸùŽ©‡ÁÇ,,3‰Æ¸ûHø|*øÜÙ¸í~üÊ“ˆ´|°/ŸzeöÕzY×r‹¾†@7U«2n˜‡£æ4\‹“R1F×ÒÞK†$ô}y-×>•WØyúù S#%©+¤1$"‡rA%ÜÁH .æñoïv.lÊb97ð¤B ]DH:K¢Š ; A"±¸B —±Ç±‘`;øæ‡Ç pÇJŽ üã!þî›ÅâÛƒ¢®*2” ¶£&V‚푘B èþRR†ÛMµ×´b¼cÀÍJšù`0òã ±Â5ÃFF§È;h<Ÿ­Oc; œ h8ëd˜gÃræÊe`á À9èÓàê }šjÀÃåæãÊå8†øœùõpBáØC_dõigòp}ï2ð¡¯Gsæ”å¢,ƒ|\¶a[qážWú4xð³>Ç3Ì'`´ ×ÙÐ^¸Î|-©^¾B-p“&âÀþ¦/융#L¡<Œ@è¡;SèÙ™©øÜ½üêÅš²´]ÉCö†”5)†)Hʨyl¾Óß}!Œîü/GÂü_ÛœÏåv¾þƒE­ÿà‚Î:5§ eóùÜ.Èÿh±ÉŸýü?ŸÿÕÓ?þ·Ñ?ïýÿ½õÎý³ÿÑÿ_òÑëÿaýóùÿèÿ¯øèê_Àú?Ô?µþ‹ÓþQÖ?úÿ+>ú×ù‘‰PÉÅx4ü=[w! ógš*¸óõ8{ý³Ù<þ?ëÿþ’íg>~Ž®` Ž;²Ç±ÀhE=äwAôÇüF‡üö ¤,E÷éÑ>Œ€£}dêû0;`lr Ìï¬K"•‡»ñ.ÜX‹ðœ©RéXw"šž’£4`~Ÿá£ dD8ƒéA0h§£7$`ÀÕA¤#9L%Nªbf`¤TŽ"I *Öˆé)Pê\ ªIÅ•` –@1@ôRY †ÐoÍ¡# a(F8ˆ$®ˆÅdHŒJóÁÐeÁ@‰*†ÚÉŒé꩹ƒMWL¬"q … c®¤ ±*:L†ÇkÈN€,‘â \)Ujˆ,@ WÀVé pE„j@ ¥2Éû,|„é.Æ%R™ ë ¡†§  [¦§! °óÔ‡ž:0PC¨ËT[ø~ŒÐ€¨«P‡Pô³3aÎÓÂBàMrMÀ>WDcrI¨LSÐ ÔÓ)èj‹¢sb1}±N@ö¾$¨;¦ƒÕ À´Uà@ˆõœ à:¸n ׇÀBq¡À™R]~¦ôü©?PO©? +ŒÔPb¹Ž!ñ4BG&ð! eòB_&ԗЕ ê@èHà„R†)#4PJ¥«s€Be(“ ¨ôeòAT:2ù@f‚.?Ð@ „Á°¾ŽD@påG` L WBãê^œ x~ÈqfKÜèä ÿ¤rI\qodôŠj­`³ŽìI€7ȉÇ#L/¡"Çø#$9 ‰!b¨¿dD†Ë”¸¦L2F(0™LCи6}/Fy6õG¬RÀ4Ò¤rBd$S™þÒh\éèK€ÞƒhÕM+MHb2©¸“D7B&1’ÔIYÍOß§8Î •I©p#9>([7¹3&î„J´ß½Sáé­Ø ± Ç$A=›’‘P)­FÇã®c“ £ Äày†;މˆ•&Ây SL ‰#TŸc-•% :ú£P€ÿ0•Œ4‘‹âD™ª!O ¥“á´EC˜L¡<Ö’¼0ÊÔÐq,š€º€Ê :…94~ÁãÅÐøcýBt(Ee¤Jé¶h´®\ap&èA! ú@„øD++p*‡3¢'%Z%£za§E ’¤‹¢*Êû±3VRy,p"ILÛ‰$©8©î…0éxLj‡$Á~®M׿ , aë¦êH¥C¦Am¢JþA²¾{P%R,œc2¥.( ‚ ¢”Ðá@ñ$ô1Tp*Â`j‚¤A¡ ¥ï´ùj‚Yä¡ìÚT&9£ÎÒáÁŸ6R&åWa+’dn‹H‘H„ºS2Ì™ô-kcFjßHµo€–`\0¸ÀºR4uq '¡M›SÁÃàjþ¾çØ”'D8ù§ŽÔwvÁvö¥c)䉈c•ô­ÝX5=RlO'@A1µæð Ó3¨nF‰ˆ4½Öƒaþ¾§vÀJîЦDÅ!À‡Ë ȰP\ž>H¨ú}|‰×¤’DÇ#4µNHªSàÚ ÐÆæ •iSÄ$‘$‚Ö£Ò´Z&iÝÒùß:Z’¦³:ØœbC«€N‚ ‡¼`d! MûRíbn®íÅ©6Ô4ar‡™ñ1 i4UPƒx1x{Þ?A}WÂ)¡ø?`äzvÈÀWH6èÿÍÞÕ@IQ\kõD”9jDGŒ„AEPa·«ºú/nˆ "‰ˆ(y€?³Ì+ûËðÈSñ”`¢ÂAJ@ðáD‰‚ ƒAƒ†àz1À«{«ªgv‡™îéeÍ›9œ3[ÝCUwݺ·nݺõ}¦ð?ð5øÃدAòxÉ» ´z¬ïGÞùlŸ8S••&¥®Áß¼Jk§ÈWÛ(—|·ä;U ÞgŽÜD‰_aXbmãSâuµ‰êI°îµå•òV„ÕÅa `à &jGóQ”r*ð?¨84ªj÷é©{ìˆø•‰)©ZTÞI©‰±¶#y¯ã%Ûð‹õܧJÅ{Å“|.ä₡LJڸ:þ7×ÞÉçñÅh‰Éÿ‰“ º\0ÝÂU1é!¸÷=ë˜9*%ì†ÒªD£øÓé[îÑ××ú/ÅÚúër@â“êËãn‹U5IX3ÆÚ&*kIÊ’•óäRÇÌMµ…+ÙÏô[²ÙôßóÉ«¦Ú~'ïùÀÉĉ ´Ç“ýÃI8úª¦ÔO˜à{W~©²f²ï’[¡s«²ÎwQT1–_„×ôštuÑý­â¸>|ñï8>6ì€XõÛNÑPXÖCgSžc„CUwÖ++ø7{|}V[3Ù6­9W…Ñ Y•àsô¤úÚ”Rç:wþ«¸"æÁÁC{ášBmªú«¦n…ºqÜŸêW1©&ÝÚX©ó¿'ó›)œµ¦Æo€P:àîíRÉ Œ‹ñQ_çzüöãt/+ëçKÚx÷Þ½»Ç'%Ƥâ5Õü9âS Ü‚þì £ÁMªLT­çêW‰7¼¶ã¾So n”KÍ^¾¸O×£¬ì>#UÇ{Œß΃¥ý¬wïf~†R"A ŸòG%ößþÿ¼üà2î@W×aþÊOãƒkjaß¾NwÄ옰íð¥±cÒGsêxQ1Q¥gí„}s,»wÁBã9ƒ&°`<=‹¸——,ÎsÀœƒ"ÚäA£ÈØvò¥=l;,z`vJŽ@zÍë„o* ΊÙ$„žs.W"Ÿv:ê2Ù:H7¹ÓêJhJÄP.ŒòA zÍ*MZsžãZIÉybÆb2=ð3üq(èµÂ4—eŒSizMæë(È Ë­#æ2K†…^#€\Ë\j¢AQ`W@Íå*+C«9e§«ï(Q“cø˜ÍX8ð …!‘ X®Ðj~VfÁ'¬Ãiš0¬Ì´4I¬f7âZ’žÙ”ù’ñ½<¾dç5í"þ8$=s!šËJϬ7IÏì›t Äß“ã´V͵aù- Àµ{°Ï£HøÏ^‘àþ·DFŠÇL×…ëF—Xò_#Î0ŸÒhaŸÁ¼–™Ÿ'Bˆ…oÂ~«?Wû¡ÉöƒÜbOy…@}n%ì_Îû8úŒ¶Öí:ç-}&aaŸ Ó\6óA›†}þ±¹–#,ka:ºŽëgAL`µÐ"0ƒ S"y4¡÷àQ` …ÿî‘D k‚4·ø â‰Ørà+(>Ï@Òl&laÏ#Pý¹ZÃçyðe®É>bBБÒd2™q,ñHYñN®3€%×Àu]¹ÈñÛTV§ø3±â¡oƒZÛƒ@þˆL¸ø#dRÂ’ˆÁÒ0ËsF4±~QíE 裒3Ž „(`Õh/f‰×–ÿž[#HÕn!`¢-@š\ÛÂZI7ÁX©m•*L•*q®ƒ}åÆŒÖLM‰Ó-\HòÆžôB˜©`õçj¦|ÐÓ6åਥɄŒT˜¬©JTT2NBŸkÚ~I—„”úØ'4êcŸð“Q4i»š~”Â6—eàf3 mÔ”G$ä(´’Ž]-«Ü#tŽM ‹: ytp´Ï~Au…bþ±­ ô¶‡:­£=‚Ä2¶áD ; ¹¤‘ƒhaŸ„…XÎØô…òH!U’x´jëXFÄ‚)Sý)Ÿ^Ð#e†ðH5o­«ÁB зåu4¢„WÐ|]M ¯«¾QQª?gR:™™#ôz”•&5+»GÚ*l¾x[ÇŠä@Ú]àt²ªÎW=Œ½ÝTP[âÌÁÍÝèGäÅ™'ôÐÆœOižÐãÐW[qƒÄmADÊ=`Yèü6½“‚š…c/²úóžB›ð$Ô›Œ8Tfjq]E¯Y>OžÁ“ׄ'µLî=xñmàr·»ðѵ0B VΞ|¡¢ÎLçÊâq£2®ºÀþÅtc>8SKì` Öj&_5˜|†¶L#ì xr4°ìâú(¦Œ0 Q2>œ€¡Löºu·o„Þ$¸(ÖŸ·(Ã:]B”Þêö[yàíà'=Z§ Á[ƒˆ®ò@ø€aÂxëÏÙi*”郾÷¶z™iA‰Y|ʰh6¯É~‰Çª ÷BÅ(‚T^ä½Ééìüg~D0ÙÏ*ÿ 7:žÿ„¯âùÏø$Xy‚ÐcQ¢á3g9KZ„IiÌ(7ôó?Ñ~‚é~D0‡Ñ2’qþ[#Eýo‰Oaø_ž~Éìíæ Ï7|_§.goqýUÿñ«ö=žº¥¡vdÏYgl¬‹ ³¿ß¡ƒ_<Úc{Å;¼ôöÛöº¼ýEÓö¿zã'ÿüu›.þÖeíØåCí™ÔýÑK&/üôÝÉÞ«7übËÞMŸï{xíºÝÆCoérãÕ?»æ×n­Ð¿jÛ·ûƒ9´êýÕ6 •O úzñê?L›üÉÁ¿•´Òúü˪ ¶ýë»)kÞø]×ê»Ö]zï=Æ¿Ê>úrýÃïÿfóú![Êvïž÷÷?>¸±aÍ9Û‡ÔþiÁw7ÜþÜîƒ;êKÏ_pëêÕ7¿ð›…W^û—½Î}gÐK#nè»àÛ‰{–Œ=ásesã›O’¹glZúæûÓ-Ù¶úÀã‹+*N\÷Ö¾ƒ·[~Á¸Æ]Ïo¼ãi2rhì·^ö⯭îs_ýç)3fþ·™š;ëÃÙ O<ãÌ+·ubÙusÞ›~áêmJßi|>mÌŽ:kýw½½â²ØÓÇýä»;°öŠßLRÚ¬»zbÇú­SVÌëð?žºíÓEs’“ê¦>=ÀÚ9êekÍ’‰[}ÕÅí÷ìohsýª æ–N¥7ýcÜÏ­ßpKŸ‡žXÝûŸk~ oþú²¿¿vþ€WŸý ëÈ S.ؤÞÔN1p]¿®¯¯í¹eW²]Oë•þ×µ‰ºí½õ–¶aǯ–Ò3_üÑWOXÑ÷ãöÝõ»–íê8qÅcNtúÂvïvyiö9ÆY£.zæ¥!¯¾|î©çß¹g¢ß¼©ó'îJ]}ò¨“w~zú÷XC®n<ú%3OOn ©w¶¾>tØi+¦W|üÍé¶yðÚ=ºî¯èÕÿ £¡¼íÆÞÚÞ+Kž]öUçyŸÏj”òÚ°Êu˜3ó¡ŸóAõ/{Öý¤ÿÉ7™+mêôþ ?¹lý;çmØõ–¹ïÌNW]¨ ©k÷³Á—4·÷£OûÅ©ßþR{¹ï›w\{ç×fßÖWÛ|ìQ?jÿÑŒ[Vó÷^´ïæWŽÖ·<¢û±¿[óÁôËÞ}ïÃßÿîÔÊc/¿vVåqgwhweŸ·vvº Óo7Ï|ü¦;÷ž±yÔÃõÇ\:{þ tÚŽ?h•%ç½3轩ûöß=¨qà w¬ëñäøºw½ùVEŸƒ;ᘻG¿µâ´Ëv?ŽîÜ=~`ŸKûyC¿™ý~ÝõòímOzæ–{ëŒÓV­,Y½£_Uãü\ÒiA—Ù·Žìÿà wv¬ý¸ÛgƒFôš½©ÿG'½ÝÐõÜŧ\z߬µCÎé0vé}§U.¶ôÓ{æ’›îÛeòís†— _>}Ϩ©/,«ŸuɳµkHvL<Ë|lojÓÂáÓ‡¬ZñûÇêÓ6/>Ô'öܡԮe»É¬ºMeÇošñÈ`ÖíõD·‹HÛso{æ¬íJ··ïRž_vl5=?{þåùf”<|á‹âwŽ9ëÊ[û.{¸Ýø/ÿšúvèÙ‹_Z\ñóU]–¿ò½Í<ïOÿx¤Ó¢ŽO$ãç]^:üÞ×ú 9oóƒç>ôÌcï~±üè»ÆÞÅŠ'—¬zfÿ Ëžõ‹eLsV÷ö ÷÷î¶qoœwë)­¾§mõmÖ7î­ªÙ¢«KŸÑÁZõ\éø ;þ²üàGËŸÐmxŸé}\þÄþpNÝ– ;W]±ç‘XÃoøáІ-h–Q€ªæÃ(  „QÀfŒ6@F+¼C™Ä.QvLØ\2ÞÃÂý[ Ò9õ0HÏ9æÜ†ƒý‡TH¢Ô2÷0¾…|ÎŽû!3–¸–g9ŸÔ €nŒ(Çô°}t˜<€p*Œ[qfÃuNî»TùÐd" Ëàü­QX×ôæ…Å­D&FDaÂ2v©fd Ë–‰VK Ý1íZSˆÂ„f"±Ìv•Œg!š™YŸA3gȾ´)tc¢«×ÔLt^ÊXf¿…‹{-9À|²"çÎØðQͽo/ßfåúOnN®]rNæ•4ä\jô{Jû^~ÒÖÿ¤µà?’"þc‹|ÒäO[‹üiÿ±E>iòW[üIQþ-ñI“?k5ò§Eù·Ä'MþZ«‘¿Z”K|üòg‰Ö"£(ÿù¤É¿¼ÕÈŸåߟ4û¯·ùÓ¢ü[䓦ÿ£[‹ü‹ü?-óIÓãHó?0•ã?-øÉú6†Ÿª1þ]Õ‰ê—?¥F1ÿ§e>­‹ÿÁ´H\WH‘ÿ¡ÈÿPä(ò?ùŠüEþ‡"ÿC‘ÿ¡ÈÿPä(ò?ùŠüEþ‡"ÿC‘ÿáߘÿÁ‹åÆÿ`B#_kþ¿áP= @q‡¢KÊÀ‹¢“"ñ?„m*+ÿƒêAÿûá„Üsa@1í"5ã¬ÄLÇáÆ¿T>o°•†Âl¬¿ ©+%³òD˜¢DCæ¸ƒí¢‹¢ƒíEÝ+_1+"ªÿQ Û\@¤)„×<ÖáÚÀRŠó¤–¨MúÈ1-Øêàt „Zb&1°Œv  ^jÂ+z:t8¤ð.Œ(ÛÐÝU JMs‘KĨaà‡‚ÕŸ;h¤ê¥#HŠ;Þ,ºã F¼"ü˜6)“‹z¢¹ÀêÅÇ"q¡»{Œ]]W‰Ú•fýdƒX±Â"p¦)±Œ¸jrÅô^D3eØužbêãŠ/ ÀP¼óHĸ^Ð¥ÞÀMº_G¤0ЍþÜ)L"U,gÖåÓÝ‘àl^~læ†äÝœb¢¹ÀŠ¥ ±w«¾š¯’i€ˆö”¥0za`õ Í’¦^} økX<ªt ýÈ*E'š J²ŠXöü5$Ìx†NaØ¢øÑ’«¨+GZ'¸ hs°ë‘v‰høVQeaëÕ½ÏgBØ!gÜ0d 4`ÔÃÉ7ÀEåÏh>— ¡§ÝÚ>Ý–Êg^…Š&¹orÇNÕ-~¯Æy瘀—¯GëÊŠ¡åbò™ÐãòÀcØÁMBÀúsJŽÔ$pïÈt§@è¼IÎDR-¯È,™„B4Ø$ð~°¼whbÀ„ ´ z‰‘2ëɆÅ„\9žÂõÍ—Gx]ÆÑÒ$»`8[>ð(qq¢–&è;E0J+NÑæe&‘u$NUA£c¯@%BÊ ÊO-ð,ùJ•¯Í¼{vÑþ‚eªtSçMGÀS4–÷Là~r¯l¼CóÙ ½1‘þÇD=“i‚¢±@VÆ<]Ö}”$& c+ÕŒæ‡b¢˜ß4ÆèÒ¤F32=k“-H5꼋Cºcí~rÞ°Ò¡ÝñQü¢¹¬4? â}7Ðä=[\tŒy„X44W,<&Eªª˜üÇ ã÷#,ñ)à¬%x8ìGÐì¦TX¼ò<`ý¹êµ)éµ®7Ý|ëJ(º„Ñj†^××UT¶žçEí>5øt&­°è¹YºÝÁ¹ Ó\@ßD×MßrÅg@$cJH»Â,˜‰&x|¢°´NQèijˆ¥ õ–>Ð=°äÑpécð¥ Á¥N”fÛÐÜè§"É,ÁLßàf#`ý¹š ¢Èv\<Þ¿¯•òZë2€U=Ã~CGƒa´{¡p,z½‰?Î"¼ FAš j0 ž¦ª#?ç¡p>ja<ºÁ£¹dRÈ—‚ÊÒ‚…[ ¬L|iMqÅ "-h û™¸ŽLÅ@í->(.•8À|Qb¢õ§j´‹ цëüãP©<¥TXk¬þœ­ •­‰±_q9Y!H›¸5Ñd¬ÀZ;•§•˜û5]§@Ç¢ëèøò®½6äb“Ræû \ÕÌLÒ&G"ìŠ?=¹áÛ4 hpÂoÂ_äUî0‡ŠoðN,)º œÎüº*öU‰"Ž©°QÏøïø[…4|GjP  Ë[§j¢Ig|à„ÙK XÎEæ€C "¨7äaè>ÍÌet0µ¥‚Î9ôRðbcžóžN†üXkžèðA‹Â4—e˜Ân9õØäšËÂ*ÀB%ÿ¬@$tŒÖNrs,Ä^-Šx´ÔPE 6b–0Œçzi4ib%àÓia,@Àús¶†Răa_ âÜ-€Qš4ä€åÐ}ç]"&ŠN<È~CG7U_1€î¦¹,–¡„ff`SûÑîð ã†Ab JTTzbïÀÈ;³\ë-ÁðKM ý*íf ®è:rÙQÝY°H;¯ Z°`b;MøD^Ð@‚ ÷G(÷êqq>Š´ó Å,¶á†©qàPWÝÅÝ0L]ëÏÙºÈaS u‘ê@Íƺ(¥IRÞ¤u¹&™¨K´œqÞÈñΨ"+==-LJ²1…i.Ë0…(yVƒý[pC“¶BÉàŠ nBH Í ‰¤ïëi{ÀŽå±ì=`U²@Üzh†my ¤¤…LÄ1´…ˆz÷)·J°uÃ×L–.fių lšbaÁ¬(AîàQhkXö¾ußýhh¡ æÐÒ}Ó"„H8¦Á@õçl¿¬H“-ÎÁË}ä²õ2ù@ñJÀ”Ú|~Li–! š` t¢®çÚ£fÜ5©ÚÚ Êé´ÐD¢M /ðêBwÌ‹CŽÙ«=)Õrº0—ó™ À݉táMxÏ uwYÀï…I’PwÎ …ÊÛÓí^g6„<=þÌ ’‚©.ªN†ª zdÀa>Ä ÷¢HQŠÈ€ìwæFoD:¦kŽ ËÂ' .¦€õç-ª°Ët‘¾á9.Lì$wàÚdà2]Jaä×(Q1 Ÿc±¤´$`ŽÖâNF¹²™|ЈÓL`Iò2(LêËŒ3c+TúBÀúóeXHh'Jr°yƒI´JœPUÚäÑáÌ'Õ㺠c‘ŠíVÕˆxËXÁmjß–®k¾t¾J ª0[ÆêÏ[T¡7ô„ÚYž¬¸ •ØØCY)’¬˜†Þ«Ë~bæ1l˜º÷Á«å¿Ñ!ÊÆ×É:l²hÕN‡ÍE檅ØPó¶çu‘CfÃ.PýùË2ì^‰Ð;æ“%7(Kпt½ƒ½ôNCÔ1HT®È÷B¼ó4b'MJ¥yè!÷Bò¯?ç ¯B9&˜¨¤yiL°MÅ‹œÕop<¤E_4އ‰pq²c y™T–Hu ãxª?oQ„uʱϗQû|™|¦1n Ó9_¦ ¢h´gBT<£æ›n ßt£7¿qYýùË2¬Þ‰”÷AÁ!¤ö ÒÎ`ûRYhüEà”3ÄDàܹaÁ 6ÅN´Áüz!¹¢&Å.`ýùË*ìáéŽE¦¨ã‡è=ìBzÑ{ w+=¹õ€è½¼:ƒX6ÌsÌ´põ†'”ˆ£÷pjLq}q(Çí\'L•PÑû`õç/ËÐ[ÑN.»OÊpÂêì‰ÃÑAL}ó(¤åàV- µ¬þÜM e÷}©š´¢Û0#&~û¶Ålœ ܃m1iÛLçÏÁçrXN"I¤°0LwWož‹G$åX$œÇ £umD[žëAügxáfÈ#’êÏ$„Žp9y5Ž! ¼WG ˆÒ-L¸vE ñjƽo‚~kô)çÔaò¢…ºïÈBà”ó¼ë ¬°¡c–—îË`#pK@ãàÎÐhCÃØ†gÆq'ÜÃÁOf°þÜÓi ¶#c'‹8£ š˜…'“ð:¸QfÔ‹iÞ–iÉŽ¥À1ÀB¬?Y„Ó§ 0t•_Vm+æ_Mcž®u Ú€"ZLï°“°2ªßÊ„ (¬ÿ°Â²qcÀq̽#àJ‡Õ&*øU Ö °S Áq/Û,8jŠyÿ÷ˆ1ÝãªJæÃÍ¥(ÙøŸø‡Ùüo:S4‚üOºªùŸZâ£1(QÊï}M1£GëJJWËS ƒ‘r-ÁŽôó?Ñ~‚éÿ„ä˜<ÚÈ®ÿ\ói&ÿðõ?úO·Áýú÷"%j¬Û+ŸÌ~$¦Å•xMùu±²²Ò'ϱñ!¥ý+*õ¨´?Œ•~|²M¦z÷†é2•¨Š5þæÿØ»p¨¶ö/§›QºÑEÉ–'ÌýB¢\“.R’k¶™Í c¶æ"“”î*åœNRJW:‰’JW¤”K—SNé)}¤uTŽÑ·öžq™ïÿ<Ÿÿó·žG3û]k½ïo­ßZkïf¯÷]…‚ …#²Ü>¥7Í4+¨5ÏÉÙÔO×ÿø>xm‘3-Rʯ®Èó³{1ÇÓ{22œ`çŠä…§OYóäJÐÕŸÓï•n.[–Mlj¸Z˺òµ¾ù·÷Vï2KÜÊžå·L½hùU°bó“{ͬþ&®ÎþúÖýÒø+OuëÕûÿÉÖ½0¬ }öiÌ’¹™ÕÃnk:cYûÜ¢¦EúY¼+÷JKSãX «O÷žïp~»³ys…ë‹;eu·¦Ï/kXVà7ú¹•ŽÍŒ/Ò!;Άýþ~Wó¥˜Õ3|6 ?ß#ÿ‘KŸŠÖ•¯ÑmlJc®yÑäßPf¶¼irò×å)Û¯¼TìøÄJGl°?«:O³$mÁ]«Ã`ø ‹óFç~—c²7sÇÇæ6õšþÊ tµeô{õ]IFÕú÷1µGµƒn^6x´{Ôµm'sǘ ‡])' ƽ]“è»xgíÛÐWA¯+4›øÛÆ"5šMóüf9Ÿ-ýíú±â·ð} ÖÕ•MI´uÀ²C -•ã¢.UK¢’">‰*3ùò7m–Kÿ÷1Õ—3â+S"«<¿FiòµQýÛˆ{Êykjä&÷ú7E”´m³òï?ªÔžy¨ÿrjå¦+ú•ìÝç3(~P‘Ö9«).êþºS=¦é©N)IH‹<ýi£tîìÙõ˜¡¿>|å—ßOK¢O”ô’†NØ‘µ.÷Ul¿Hò¨ÁÓt6‰õž¼3º÷ì“öàb³ÔUoÕšhÓºu9÷ÉŽ’™{¼§™½ßïãVOÝ åõ…µå×ö û•®_™þëØ~¿hFkfV_™¸k»jᆦ»É×ïÙyçI7F7-z)ùs’u½_e”{íø%:ýväˆÔMr—Í)¸èóúVzÁÈþÙ§ÒNTKBfû¦$©Y8®qP>¹2x³úÙ›0£â¤ÖQÊó5{WXþ<òÐkÊÉNçuB·=ÔÿpíUñ«Æ˜³Ì¬«"Ìî~É¿[÷£Î³ù[jÇ–kyX¯„3=/²,6;Z­_¥ÿBµQEc¸ß-îäˆm‡Ý̈Vk?X *Ôî¯$D¿¾¿ê~ùZ³º•:“’Èñjý²Ÿ¾S½wíæzНó¿2Ì8Ù‘×^‰Î¯ø®¤Mb˜&ÑR‡m‰®4Õ<¹sê°aóÿ’ò7î?¼âižÍÓAH$|3ìþ¸ªô¡™‹¥aîo6lÞ’w=öò("‹%ñ)¯jôrб(eÂn½Ô¥Ö1;óξš„K–<ýµ +³ß¹‰…QRS½ûõi—æ­y‚®\{•sz=%ÜwË!ãÌ]ÎÄ‚÷‰Û‹FO˜?ð§*ê»üL· f'”ï©^]}Œ[˜”z„ :ãHV u íG•Ç‘‰Åú¦ƒ†ªGOžutà)'í³“0®êYßX5bˆ³õ¤FÈVO ~9eÞÔ“¡ø§¥«¸ök‡ºüª9{¦ß^{V5MÔ/ù•Wã´åeÃ[o|p™:Gï/Õx•Ã?7æÁÅ–»Í£kâWEÚ‡4X’_êÆò4.Pùšs`Ý̑˦?Ü›<‡9Ú˜°=/0|«ë1ÏÄùÜC^ÈÝ7—¢Vû”‘5æU³Yí6ï´…«w<‹Ó:ðVãñp)3­%äØêÕÑ3’Eqw²­ªc³ÎåÑ^ÿ2 úl{POÔ¼ñ× q½bMPɼ±†’?ð¯ÑÉ£N»#¿¯ñ©žðøÕ•Ðaæ D§m4³"Ó‡~ž7oþRókG ¯R.7]& Ý@»9Üÿ\lšœ:nò÷5÷}à‚;¤}q÷ë±_DsÂÔMjæ_¿ºÁúãíÜ:.=|¯}Õ±¥?ž[›xúWÛ¤"`U[mÅœÝ9&–IEÒµcîŸzz*m%|ƒ¤­õ¿V+¤vͨ7sFÝ:xìu©Ñß!ýnæçKó/žO=ñÄÑèÑ»[wn¦óvy¼t“m47p+¯W9Ÿn±Ö KÝú ÓõÜ^¨>Þý±Ê-;ð¹ðqª=âóÜùñqñzÓD­£ND÷=Ò£U£“ØO;Wº"ö`‘ÄÊÛ)ñ©– ±Fì¸Áa“K!®«?œfëüB»Ü,tlÜ»÷öÈè=MéŽ'/Oh~tˆf½zÝC ¢øÚx{+O{hؤÅ%íÎp¸Uä•+ÖĒʸ¿Bã¿ô=W7wÀX·ãq¤O·P^ù¬j˾™ãWbîéš5zü¶Q·K÷Ĥs_7Ž>;ÃyáÒÅ*“ªØUº{‡ýœÔ<åãÁ’/’Ý1j1z^ž7¶žÿº³}UÐú‡µ·ÔæÕýb&šxàñ¸Ãð‰ˆÉNkG¼uñ-0´aÌ~Q¦Ê®×~`kXïzUúã˜íÔ‰~L±Sñu×磪|¨jgŠSî<ªÈ°¡_˜ðÀpsÝÜs+jfh0D–÷Ög/Ï9²ÙìãØª3»Þ­â&ÍmöK/éfk•í¹méáíQcwg?b¹X- ß¹âÜÊ„"g³ûëg6ä7=œâÀß?ðöäOû>8L‹:$Íš³·á餛Ü!GéYœ–ƒ¯½¨¦Ä|àJ3†LË[%z`iv>ìEÊiÙÆõ•e[2,‚ÔÆíI¼) Ú½n†ñ콫›sn쳊/Ù{þmNåÍG•½»:ímâ9DÀ‘?‚oس#Cþ I¡ÓY­2ZûsåbiBÄ~!ÎC8<Ø ƒð³äç¸xˆ.ø!, ”£b @,Z!Jœ…({"ö$‚ÇWˆ¸ ƒzvab‡ExU2CVÅ;þŒÌÄ/Àó*q–@€ŠEžf¸€L’}eه̙&ûÀž‡]¼‰6@v1DoU%oµ­]Þ0o™":ñ8"È“ Sã aGAbP:T%+v (‹a>Ъ‚ªdŠ©Ô…m­%8σȖ–ò‚fJñFä^“t’,ì(û¤PA¯µzLÊÏ×"Îõ\]ÿQ˜HqVëZ¹W$îÙïâ.±0ðÝtdÙ®:¹[,ÿ ´ÝwÁ»Ôï5£<1»Ó]¼¬ï¢ t‹‹EÂ4“í$43ûŠîãì| µ;(XàVìE6Z(˜¿T7Pþi„Žï"R^'áAZÈ,ÙÁTV·ˆ¾1à»XèÝaiu”ýÖÞ=–ê_ü]DŒvD.L|Apé°žtX \X–b.«=Ó!ØÂØ~‚•¬}˜¬Ý2&"·×ï0jÁÚË‘°¡¡Ý"gÈ‹ŠÄ"¶"†X¦d:h~‚<Ø‚µÉÐÖœB"“H4 ƒL£2iXþ<”ÓU–üðyCå³ç½º=|ÞËT%ÁŽ7ô’@ï%;Þ;zXÌG ŒÚz1Lˆøi,BÛïÏ$ˆAdžùCrÅŒ : Ï´ÊhX!%…檲 óP’‘HØhR.GëTŽbÆêdƒF+“’ŒJ+•² {S­,ü¤”e4,ö³’ŒÎ"u’1)õ±:Û ‘ÈðÑ«í2±üí æ ¸ÉŽñ[/v°? Éî¿DG[ÈÓðZ¹ŽNá·ìÍáÙºÿšfÔYâMÀ€‚…bœP•Êúo¾Gù¿š”~ÿeÿl`ã€I§wýþ‡$ÿF0‰IU Œ=è?yÇô?NÿÏÿUäŸÆé-ü3ûøï‘¤Ä?ÒkøgöñßIiý7ë-üSúøï‘¤4ÿý{ÿTLÔÇ$EþÍH½ƒ “Ü7ÿ{$)ñOî-üSúæ$%þ)½†rÿ=‘”ø§öþ)}ü÷DRâŸÖkø§öñßI‰z¯áŸÖÇO$EþépoáŸÙÇ$%þýz ÿô>þ{")­ÿŒÞÂ?¥ÿIJóŸÝ[øï{ÿÓ3Iiþ3ÿ‹üãþ?t³ïù¯S'þÛ·)‰.[ÆFƒƒQÁ2Wîü…„ü‡ý€ܵÿB!Ñ;ðÏÀü¿(4rŸÿWO$=çE&³8¨bB1% ä[°Ì!å=XÝnÁ25í±Z²íW²ÝW˜ã3¶ûÊrh÷|6ƒMÀÁÊ[£‡'°FÃÌ!<®(€šB2“¹OÛ€q‡mº%`ŽçXyÌåÜYˆòÑÑÛb~èX¬&Ü!ƒøZ…2çtQ„ˆ%!sa1O@†Â ø D;Ŭ.AØ ™ø-°PKqR.‰@p\´@¦¡5 ’µ€¡†Â|(DÒö@PTA€ Ž$¢’q–]Û\Ál‰i“P°sJxB¶$ØŸ„µ‰i@Ìá!BDĵ I@ Äz¥UB!0Ú& ˜Çç´aBD6Âáñùp«Œ `Ø)ÀÜí:à uvÊ0Ȇ 2€á¨¨4ÛñúÇNú@[ôQÄU¹&Dw#L`Ûü'h+Ô Â`XÀñã·U¤Ö i µpgt4`V6KFàöš í°V€w¤€@°•:œ èÒt8¢ Œ" FÁ8$òõ˜¼oè`xôvòô1€[ˆÂâ6 @,PH U°ÉzÐÎ6 ªl“Ú‹*Úm@,0 TćEÜ6 ¨%Qä t¶ÉP$Ê6™  ›L`Sª¨t´µ"`­C ,¾@dˆÍ……0ó„Eä³,2àþ!@ÄX±p M–0ØŸ?OÀñÇœ° ¾Ì£¶CüŒÖâá@7(‰„AD{G[H€ X ˆp( Áÿ" ž?Â!mu" Tóùm‚¶¥MyÃW6ybK„˜OŽ‹lòxƒHˆÀ 󂑉 fÔ¡mòÅ0ŸÇî"ÓåsºÉê¢nÛVä®sLøñyË%H7%¾i[1»+%6¨DØïJÞ¥ñÖüošî˜Ù…6…b¿7E@~<%„ÖÛ]«Ï‹9"DÙà~q å­Äv™ˆlrL0úLüá`_ )ð‡£ÿÀ¾ø;¥pMøPí¬³m³ æ#²Á$: Ba"{jdS’L€º / &…6øÉÆÆ(¤\I–jáñZŠ}:MÊGD@+oÌ OoÐ|`‚Ö¨CQ"&@ðf’•` Ÿ…]VEÅbYUò·ª2¾!ìJO ‘p"® —ǤÁ§D”…˜é$å¢+ plžw”wÔé‡ °pˆ¢kGÁªì!P¦£P"ø¦Xˆ={u’rxp*€ù"E9 €‹¢A"lÁÁÌ‹±5·ˆmÇó€: +ò“]uÔÛŸ§›2ø¸þ^!"/Òº,‚¿ŽH‰øºŠEæÂÕ áW"‚Qö¥Ãh#v¼àu¼,a¡ŽÀÖV\&¯N†ÄؘVÃã!Oµö™`ã+)b^ òàCàÊÐËÐÂ9æa:!v¨Hvih,—*ɽŒd˜¡Ö0AjØ=@afàÓ 7 µÍR¬µö™Ú +¢•MŽ^u8@†öCøàîùÉŸÇÁ—°¶\1ÚzË]ÍÃDä9࿌À*h›$Š0'„ ÷𼽉eu¸”•o´ö¤LNjí`5\ŒYF8¦ëßì] \ÇþW‹ ¬·¥¦õÂØÍ^Y<©ˆâ­¨àU $š& PD¬âÕz‹Zj«b}^õ¨ŠUÁëÕêÓjµVD­>[Å*V<ûŸÙÍf7B’MÐ_òQÂì.3¿™ßü®™ßÊ#"ÕÆ—77¡VpÎŒ¡aÓ¸iŸœ Õ0=HŽÞ#Ðþ)úïd<¦‚Šp u ìPƒ_ MÊ€$¤€_˜nbô¹¤ ç™KüVª£âSN±S¥VÇ&èTáL+0~ÚáÀi“…%£[Â;³dŽol Ì_V±HÜ’¥)ÒD­"Nã~‰¨´Âj]fÚÂCÐTh#Á,RqÊæÁ‚¢ªÏ„e$§†‹P°¡V¤¨´ŒðêTã%n#Á¨3—ôŠ\L>•Jê#U[ا˜j1‰àwÈ\ý¹*ðF}åà[À…RX £%"€&5¢Æà˜q"Å–ê§Q$³¿rc <ú$­ñ%‰›q]†P©.)BjhQ¯„1£ÄM¡ŽW(™©,ÐrP=ñŠ”Ssizæ ôgé[Bµi|ψ_ñqú>ñôA'“1TPz lÒ?¨cfŸ&%)!Á¨¯à’:~¢Ñ%C…Ü-u¢ÑE¶Šhpv“oÒ ‹†gÎõÁ?çøè3©±Q¿Þ) a=<+hʳá4"›•N œuu,øjÄgÚø‰zf£lkÜUVÁœ†Ô(€Ö%iU´§tàük€ÂÚÁ!>LÌŸ U%ÂñŠOŒ]HŒþT`¬.]­Äûë‰à¦Š±ZiÒT¸”Ä8à†Û~7PÊΤDƒÇ¯'§M§Nm¤ ¤•¶éÒ¥T§ˆRIããÒ¾ª @ƒ£€ö ±‘ÐMR+⢓€ø©™|ÛR£i©¨¡ àš>|1PçÝ©S[`‘â¤Þ#ÙoްRuéRÎc —Y²,cü©¨þwã5 RÊ©qk@ðÀŽKdÎúKÆkáY²D6¡D¿fDÊìñI‰Ù»bÀ4l¬ßÒ¼»˜#y!Êš`†3™xùÎù)Íp‚†HE° P¢ùJ J6Ø=ñM™™à±+còÀXZaïDƒf·‡  |˜f¡¥2‚o ¼ Š86W9Ê‚†Ô˜'pc—“©Ü¦Ú-R{éKý´äpPBJÓR…ƒ/“âÎ0ƒ‡¢žÐAi½&r,† Ûa¬í0#m‡ŠÁ0±±~KE´)N@ A ¢´)á§”#m —CÃÃ#’¢¢T•¨VõáU òavë{È¡Y€'E©UñM™™˜8.3¥V™AeÇÔ õÊ(UÂW&çnêÕ«àæ‹ž³] ãvýò/çå¨%P‚j~A‹ãXlØmØPì“óÌd ž*·T®MãªØ-ºó»L$ œoÁàø",ÙWˆkÈæˆ‚”PL¼£Õ±¼Œé”´u·†¢\&ôæä“R ˆÉCAL`q*“ÑW°(h}¹Æ ÛKh»ysÄ›7f1¦ÒÚª-†?ZI€çð¿Üv+á§Œ&QTÅ%Æ&¦T¢}d»Á-0 ?Z Dðð…àI¢|¤K ì£è¦ÌÙG8¯‰2ö‘N«VÚŒÖdùuÜ%æ¢Ù0Mà“¬LbŒ$<,ްhøƒé`2Œ:š0 ⼯CJ¶˜G*·ØíµW|¢÷︹ žG ;<è\&Y'¿œCÀuaÀA‚Fôß2#ˆG‡((m@ ÅC%1^Œõ[Ê)¹@õrfý‚ &@!ý”*P½êøèÊÓ»ú>ðÁ„Á,ñá|RT\"¾)3ó‘ M.÷€±´*AÉÒš×*-kc±˜ŽPŽå‚ކ%‚d‚‚¢gÀ&øP²ƒ˜æEI¨ •[*ž´@<) ñ ¶£‘Û‘P™_bŒV¥PÚS2Ñ 7¿Ë“Z®kú1¤H£C¦Èïh0W°Ÿbšû6gcôCA˜\Á~ ËFªùáö¶íâk€ž¤Å"ORB3LÊ1Æ “ÐÜ¥CÒ,b²C%iŠAgæX¦ç GÐ!k[ý£€šÆþ´Ó‚…"KD¤ÀÁo{à“=ÓK⛲YläBƒ¨KTÆÆëM¡ÑR›˜µ;BµRB{GÊ™I3_p2934Á›$È Þ$1Í‹̵¡r‹åÄâw¬l’ Õ|¤ õ<)ÃSLt!FND7%¼v…N§Ò& }Fæþ5*’ ÈmÓ<³NX(#ë.@ãþÚÒ±[L$ƒ,Ôü<;H Á1ûK¶Tnñ²™Ý¢l¸Jd°}ŽÁàŸÀ­ìv•` „ )nž@êÍà°w0ìžúôÜ£±/&]ìöâì”±Uß›¶yÄÖ„W:]ŸÍ×^P/³Ö<ízæîÕ?4î¶o{vÀëüæùÍ'–ÔláSøè£KêZ#öîïþ8õé/—`¯'ßKzÚfrnq³Ë‹s:¯D¶,8’R2õˆ.=pЯý¤)]s”75¹Á—3#f]M‹ÿ;ïUþËïÆýFx$Mh‘µpo„Œ¦÷¦c.ê­Ë< ^]iWýÄ܃Iʬ]¢ÏmÏùduó㯠² ~ûæFTÂäò7ev{gÅ´Á8Z#sËì'œ¯· i×:µå+U6ô ˆŽð[nR3Õ˜69>KÏW^d«…ƒ\Ú–d®^¯qž÷¡z´”éà148l±z˪)ñ²gWÖm j¿ÀwÓ{”ý¿ýuÖîÏ ïݳ®JÚÌ&v®qµÇ™“3J;°naËÀ==pò«k3f½?ÅeTÑÂáCZ¾‹¨÷ì¨'ö¹žhÙø®îjk‹Ãî:}xõ ûŸèqd?Õ`Cæ®O·µÂþ“½ü~×õ¸W»3Ú¯ózüù…Àç{Ÿ~:¶$ë·îCݳ¼?YYôá¿ß{¼ç–|rk†{«ƒcº{&¹g\Y0rÈy«¦ >æ¥jâ]˜3¯^Ýúª‘îû6k²m±oÀ’ä+n‹?Ü6ãOw:${Ü¥`Ïôq‹ù.ý«ËÊAºË”™}tÌLØRóe„ÐÐ=Ýïçø}¾y×ìÿÎnò~«µ÷uÚïqqYİ¥þÿ©ºØ¿}hý1K‡´Þèr²î;‘a_’íOïw³öõÁ%»=_û!{è O¥¼Åãâ¤.éi3ýA¼{Dw·}ñ¿ zgûÞî2ÞÝý*yìwOUë°Ùßþ¼bÆêÞ¨êÀ“Í—¯_Y~ïl¯%¾~=±“ß|v´û†£ÓåÇæto˜v²ZÏ(Í­];×5ÎØöãòÜÚÏ~9Òzv®ÇëåØÅE_çÖÍjw!=ôlG× ­¿LÑ*JŽv{çeËÇÔKÞE¾¼½õ)±Ï«Qê€ú7e¤LïØ v§yÁ7¶,yÿV‡X]ü´sa£¿ÚÖg¥R!©ÕoÎ_YEÇÎ+iÕ8èaãù‹7Ÿ:0:‹»_ss÷þý·n(šâ~ëîƒK>M[ž¼çà9Éçt@oÝÙ˜^O>ø¯[a£OïXpZyõš÷@Õi=¿Ú÷.ƒ÷Ù8O»ü˹)yB¦„¦œûéè‡Ùþ>K=Ç ºs{ïòŽ}_}½­Ù‹¤›—Çïkv°(ä`êóy÷×ü÷Æß‹å'ß«×$º¡·F3¢ãËGÞ¯3×+Èw¬ë¢sµÚ¹œÜ«ë¨‘Ã\ËFÎ-f0ºþ€»}€Ñ !0:i+0ú? •˘µhö¼1aɹ‚ÚâàÐ1T.¥(ö¨ñÇÍ¢ Ãú(¸ŒVDƒEÇKÄ¡ãúeOøß<zoñŠB‡›`L˜w̉¹7ÚÄAŸS»a¾sb~’š|mÇ´sØâBäñ·[\Ž!åa‹³·*[œ2ƒ-Ž’TYq’.ƒ¡’hìnGÊà’›ÂGá1„Ò×(^¶]™‰çȲõÑHÌp‚•Å/‡‰XJ_ƒ'K_3A.ƒÛLe®Ñ‚keqÄ© pħÒ>þ¸ð̵p½^ÏŠ¶|J·5q©’¸LNãÿ;ë’¥òÿ¿Iüg6þ§'þG%~Êð?R­Ðéú«&†Äj’ÔPa‚Ð_lQR\d,,Âõ µ:<œIˆdY.xÈàò×d†–â¿ 'Içúo¥|Þ®üï2„ârÔ™ÿÝ™ÿÝ™ÿÝ™ÿÝ™ÿÝ™ÿÝ™ÿÝ™ÿÝ™ÿÝ™ÿÝ™ÿÝ™ÿÝ™ÿÝ™ÿÝ™ÿÝ™ÿÝ™ÿýœÿ_²,ÿ; ÂE˜•ä&ÿ»Á±@IšÏÄ (&㊈°`Sîw1͘ÍÉ-LSâmf¥¹­d¤!iü…I#\^âŠRGâÉÒ ÂøÄe~pé0LÔcò`‚0=¾L8H°¨ ³‰ïi¾û>RM¸"..\«ŠÝÕ’˜È‡$Ì (Ìi_´‰´eR<…í¥fX4 ú©ð˜¥§ûM3ŒÿÁ stïÌdkzÃüö6v‰?¿ºW€U OüŒ3чrPJðåÆ}…Ù(M´Žc‚ù˵®l)‰ =!ü”¶”3?ÌRyI0LuCMw£HÜspñe (Jk‚N”6Cgxd<0Ð0:œZÓE> #—¨Í쬡Lô%N¡QÙzã¼Õå*îŠq<¤( þˆTF‰Hl¥ôS’ Ó©ƒaîJÂò`:c†@˜"gÅõ]äŠraÉ&$ñ™Ëif‰•ë3€Aµ«¯`¨©Bö… …ý†ÅŠ-¬ 4'Т-€ T%$ ²›šñÊ›„µ T¬MË ‰‰ºx¹²¨sBh„)ZÖ95ã@~9Ðq0â^Y¨CiÚœG`Š<;{Ð(§L˜xø¢§83oÌ+M?¤‹zƒ®‡å°bSÈq` –pš¹ˆ£Ìf{Ché&x• Óc˜9 m¨ÀªÑ̶>쎋Èå§$d¦­ÚÐÄXue™5¶7P2¶È™}¹¢Qɳf‡ÆÌ™5 ¸Òh¹f ŽªÝíš0«.Zþ§™Ôè‚Þã–éÐ-ÔØé"ת*Ç$™wJ+6S€.ĘLÄB21Úœ™‚ãï`;eÌ  Ðh6Kh4b›$ÒÕJMGΪäDöä‚fÒ¡šC9V'p ßFò0Ôyìa ›I+åØ ‘ÁÀ#&É@idĨ’Ù½B±”pƒd>y‰õÎ f/Ð?à+À÷yÏ¢"Á/9Á|Q¶gú8'ÆM ¤üE_g ‘ÿO‘ï[” Äüû߈Qþ #àûß!s¾ÿ]JŽ«Ð(JE«d˜,Šˆ$#”Td$)§TJQJúMÓçü8ö#Rþ-ÊRüƒ`-sþ#ò_ûäÿ¸ÚgþyÄ#çEh؈iƒ_öjúµžôƒnùš¿\6ŽøþêžµWÄ ÷UrÿTÉÏrÍ‚¦Ï«d¶^=ç8v-oµß¯ƒ«üµ—Ï/ê?ìXìW½ü[ øò‰O§ïª=ùbÔº?=?¹vtîÅg+É]·«÷œ˜7?4&¨ÖóSj4hPòøË!#Ú)vK›_ª¹-ï‹‚BÏüªg$äïi{®?ñ~·Ž3—õ‰É-ê+ÙãrguôŠƒ·ûw/<þ³_µ]“»fL8¶ëÊpMjɨƒ­¾m§½Uoш³Õf¹þùž6Ÿhðc`F_Y`ÐèÆ3Ó]wø¾SÿÀLÏWò1}òšN»ï~ØÅåL¶[•×?mÙ9àTç”/ÿŠy2oÈ€e×€çÔYbüՠͪâ©è0ïìãÛÿû°}è‘&cN5Ì=ñqÞ¿Çßo —㣦?«JýuŹì‹G§«ö‘nï`4e~¡Ë ™Eª&Ÿ$TK˜Ü©ZfÄ™×1qÕÖ&mjæ›v)?S’…|J¦íûp䞦îco]Ý},)xh׮ÙÃ%kŠé’ìüµU¶|v®hÐÓ®L_Pÿ«Óïä·¹ž6í]TZ#wôÑUnä³nTÓûaCEöØ×~ØœT÷ç}£Ÿù¥dÿ…«k^6­uvaù»â^õÖ~IÆM—1‘½h5êÜC|»—R1>=Ù3çÛþ?õÀ'iznWÌ;"âÒO³wtls¾xýºCóØUíÊÙ±£Ÿß¯‘>øùŒ[#¼rŠýõ<½ ™Ðù×Îó‰7ûÕDöÛ=dçÈè½Åm æS}.öpsÿÙkÆžžíî#©EG;ŽàÓ´pàÝoz޵éR~¿™cªÎ«Ê›8$åaø‘×›Öø=ä×fésò:^˜¹¼yÌö½OÛ8?ü½ïÓ'q.‹;»«åréÊãM²WÒLU¿í³³þúû»c¾üõÝÂ&ϪϞӒ(7GIÓV¤hпƒbŸ ¨0EƒÌ\ІTZʼCA  €1ÌÞ’ý5q©dsæ îyà¸ùÓö-‹Z“”ÁÄé{Áù·ôô=-+÷ô={«2OßcæNß#x™Së(‘û?öžJªêØɨŠb4‘â‚ÈÌÛdÓŠ‚" $8Bz¦_3-3ÝMwÃ8Ž @ð»¿â._AcÑDÜ@DùŠ»‚KÀ}A ²ó«ê¾­{zÞëøÿ÷;gNÏ}ËÝj¹u«êVeÝã ½ÉIv^ç›|ÛÜé{^kú­ÀMN¼ rÓÓòš²ï‰ZÓ{˜D°É=Yní´¼´‡Óò¯YüA§ï»úØ_>%÷=aÅéý›ÞÉ:+/h2_Ü€ÿo¾²âÿé{ñü?íÿyM¢óÿ¢V<ÿßWÖþÏÜ7à/á­"üÛáÊ¢c߀¿¨IEø·Ë•Eÿ‘}þ@ÿBþíqe¶UhÃýãÿ´Ï•ÿŠ}þjþíqeÁ¿rŸQþo—+ þ{3þ[Qþß Wü÷æþO•%MÑ‘à/áß.Wøyòˆ±#KáNÞÚ@·bÿUTEÈ‚¿,kEûo»\åUõ 3 S0ÍL70Ø76””§Lò·îphÍàÆ›3‰1KÊ)hHCÊ4–S+ë“áve%%%Pam…]ç3šé07Âdæ¸ U’WZÞƒB4mÖœÇÿƒÎG}?7ÉL_dVsý÷+¯J𑆍#T ÏêèÑp‚P)³³Eâ0 Ò˜™nl(O§¹=¾Õoh?®ÜŒ…íö›væ\f´t>_*ìáU´ :_”Jy¹ !Þ·½Ó1}S£±t2ÞØÐèªÑx/\K…Ææ&ÝúªdR4]Å¥«L.Å Ph^IT×BÏR\4Á ñT*Z`LǹdmŒ^Ž'ÌXU"Ê…CfMîW†ª«ë¹:¨,^›æªBb8˜ªP2\Jšö+cW„*§O£8B¥å‰P²„›Åøø(fÖ5íF¿ÀΤ¼ð¤(IÆk8øA$ƒ§ÍP˜‹Gìæ©ÅT4̪Fσé?ú´2ã*LŒË›e÷¼2^“ˆVã×ø¦Õ~(’6“0pÊêðè¾X±¾ÔÙsH(ó2Í„vk°FŒ*€æÜúx-µ Ì$ZkáF’‹×Åš ª"”‚A)„Óþ¤êal5œY:­”æ2Œ³žJ'­YªMŒÌ”…PˆIÑ‹L §¸”ir¡êTœcc›nQ¶ml˜Ù~£5Ɖîø ê’ÑtÚŒ!7`“…C € Ž;š¨‰†£I´€ZŸPÀ' ­.–bµI$š˜¹êj ÆÕ„bõ0©1xTMGÍ@']gš]ø0”d}#²p‡Ù2e°fFöh›¥ zR‚3à™´&–ÚÆ(•tËöà1~zŠ ¥)d[àè™ ÂÕºªhe‡9‘jÃfÊEJ ° ‡Í0Í}Ç]m”e÷Â^ܶڵƈ$ÐP ·¨4\ŠóZ^ÖÈê³bŸ¸õbÄ1|Ýíe)ö? .[GlmBf 'ë±E†ÿÍ´Jß{ŠQk:eVG°é$m ¸G<£‰B‡ÂµI›ÃÑTeüBšHT]`‡à›3Ãiƒ)fsG\^°f=|aæq’"‰ c0“šLbo Ƚ:Ì¥1>ЉÀ8lfT¬ÌùÈžsì›Jaœkð4Œ `ÐD ‡¢E§ß³ñÂÔbª0q¤6Ì"eÁÚ²'báL à‡‹_a@ D Ÿ76œÊ8 Îd3lȼuº¡:é¸Ô³‡:[$&¬¬dbÜå~Mi‚Qƒw$À*˜~jˆ&öÄÖ'Ïš¨ææî ŒXÿ€(`#?,ß^†Wɼb5}Çõ UYèQG#QèMm âX³pÃýÅ㈻§¶ÊnÙ¥±#+tq%D¸èDÞäTEF+ãI$:ÀClŸÐ—­nt›Ãž¦°É CÉhVm{ÉrÖysf¥™°Ùû4‰Ns˜U[…íOÇàS¡äôÔ‰’„]£ÕöÑœQ½0T3Ýůœf³ÙMç„P¤|ài‰hi•ÅZàãZÖ_ü¸6HqýÊQB 0®ýʬzX{ œ@AÚœfÂÌ&¹*s¦]‰‡Ò¤ââÌ8ðx^˜A†CmÂn’±×a•”áO ²‰ê@úÝßy.1– ã8 }Ä´’ä uT'Ë’ŽLÊ‹XL[éŸä}ÖŸ+É«%y€â‚Ýwƒ§¢Ýwƒ§tªv^öý|^šóKò2¦nrWÔ !òAšw+:ê ’jóPk ÝgjOPW…p„¬R© `Ô~ÑC×0u˜S`h*ѽ4ê<š$¼#â<`YR=Ï%Ú¦ã/¦°¶ º\C„ ƒ¨’#„ŒK¹„?öC«hý(0cž‡*@šÕ€eG@n¡f ˜ 2 f°C3˜… IÄ$0o”n1´Â2 ‘&É!f1Cq“ÐJ¦»‚ÕŸ+³Ð<‰›0*¥"˜ŠrÓ ž=Âôý*ÞWˆû‹ba7Ô†›áá]R°W¸‰¿úsæ&b†"‘¼Î£qR ÄM”°—›Xž;ûK±‡iï×#±hï×°h(î KÞ¢/$Íù–AxRþ5a)D|ñ•¬ôˆÖƒ&©›}0œÀVvÔ=zU« ‰¨b¡_’N<*ÅCKµ*©L<ñXáQ)h¢ Ê–XŽÐâ b€G|`M:âëQñÄWý93Õ›g4i»1¹½h[£­ŸCm/µ…=&kþhh¢“—Û©í¥gýä›ÎKs­ ª` Ð¡4¿Kñº]åk³âÛéÊG ¬´U2•¶¨ŒE· " æ&"¥laýr—:›Ø, £nQ ä—ã³þœ9‚W‰õÃ2ðA zÞ( kЇ#ì^`Æš9YgÊokª¨(9EzY ’{>?͵š}Æ*6uÁôÇöµÖj¢Ó›9ž§ƒÙ˜A^4tËDãñvPqƒ&[x½Fu‡¨{M³hºá—  ”‰‡H ŸãfˆÉ‚ÇÔ"òèÈÄÌBd=R$‚O!¹ kÃYD‡üé©Ðò‚V°úsæ6^µ*:E!…¨8·A¸ lhŒ,nŠ01A;ZL¬áØ¢ŽÊ¥{Ž~šÈnòÓ\kdZ`7Îìæ‡ßdlZ2?°„ÿ<'°ÊT”2•$š‡çhÏ‘²ÌÂh=ŬˆJ3fa¸TD¼ÆR–Èj¦…löM>ñ¤¼“¡ tÁE…w9ž‚=ãÑ¥ïޏMÁ¡ìþŠÏ cÂ6Ž¢H¢OÑ3{Ää«þœ9–QPÿJQqŠ:¦‘tœ5NtKðžØ²ËLž•òíS)qŽèz|¼jª™L6‘R²tyÔ6;ßÛ D(è^àÙæÏ5¢âV ]—á}ƒœ…Umb îy„›ëô‚h5Û^uÎÞùòÒS-s¯½úE·&k«†ôvݲ.ˆ¤JÒEty”8t„‘¤ÂªŠt4¶KŽKs¾t8‘ŽþERU‘ÏúÛ ª {t•KD*®p@A8ì3T^©[E’ºu -Ô¥“SšgÔe Ê 'È*Ðq%.°/ƒŽ9Ž]w ]Éð“ÓÑE,/ƒÏúÛ Ê Â£:”ˆrhÉ!oyÉcñQ5ì˪†Š^ƒÙ^¥ÂªcTTKº«@Õ¨è(P òâ ¢ õU›AغÇÈNua¥PÔ1P ­|+´ò¹~ƒ ®ªÊVôCFë©ó‘2<7T²ò©†NdZXëA}ðZ×$WŽ=‘‚ÏúÛË †FwB,],‰þ²éN'ÞOô¬U%ßs£ð†÷ô 3«y Ì+= a¤íõçìî•/Á„¼–d÷Œxƒ¢ŽÛHüEÁC.ì‰jC2Ùu—˜ßSÁÃWýmEPÁƒÂ‘u4¶¢Ó3ÚÏ HF”<'%d&˜`ÎxŒ©K"-Ê…•BÒ¶ÝÅL|<Ó"NPùª?wo§¼‘ ªy$gµÒ ‰x¯f­2$$zV#p4]ÈK_GµŒTxXInÚ ®Æ”,|ÖßvX¦+r»Ò2`%ª V°¿"X‰Xá9^Ag=>@¬ã »éO›„–ðUø«?w3}¾èÊ6AÛú|TOª<§Â¦ Yè´ïJä`™ “Ë‘ê}Ö¿G`Y1KìàÆ%ΪtbÓZ'­ˆµ,Ð)¦Àqn[p¬©ÄýväY£ •ÝoÏ—ßüO5áܳsñ|«ùßy^¶ò¿©2¯ð"æÔbþ÷v¹„ˆŠHá áP¨R7*BªR¡’hTˆª¼·ûW¼ {ù¥ÿD8’s­Ó?Q~vþ7Q•Šôß×1ãFŒ(”J%ǬùöÚ»KЭ/^qAÉàÁecXœtXg¹ñe£¢Õ˜õ¨lâÊXpÃæÐ¡¸dš¡š’™·/›üR¬ß“=ž^;é³³k¯Óeç—>{x—‹o>{ëåéã¿ï¾vÿøECWGž^¹·çwÓ—t­›PQûȘ³ºžÜqñ§”Ý;¾ùûÝ;/8µïk'ûÇšIýè•ï%Ö}óc劯¯¹jìö+{¿°³^Úô²/žß¹fÇÙ.«ø§ð›ydÌð ƒn=¨ëõ+zó”YO/]ÑùžÉÕSëºnHöþ´ËŒïY9bý ãŸÛþAïg–Ä×/:rÃa/ܱ³r Éãgl\}댃Þ¶~Á!ŸJÝOšñ¶yù¼þÛ—"|>à_Û£]F÷X1ìØ7Ëž_ÛáµÊò·>-»¸Û›+³ÿôÈæqWÌßuq—ªuO•5œ<çÑ™ó*?¬?´Û›¯Ÿ1¤ã’W^8àô—¤áPßÈ…óºÜ= jCdÑa¯}½jÉU[6,^÷Ðæ£?{¨´÷/úTùË'ÏþûòßßýÞù'vî~JÅ›æu뜞·Ïøòé×ÈÜà²e—>üÂÐ^/~þ’³ê·Þ{÷`ÿ1}Ž·e·~âîk/?ä·7Lì:÷½eÌêqß›+>ywÍ’#f6&‡Í|XîôÆj­Ë¥ï,ž}u‡Á?<Ôý«žËÝ6ãÛ3vt¾®rçÊž4ö ·ìßiëGôë4ìø:J%Êͽ®òÕ™¿:èôUÛ/ÛyꃋÃ]Ü\wÎãåKù.Ÿºû×»GÏ~ô²HŸ+ݶž³i¿ÍK{œôÒŒÞOö7øãÇþfÄû«…—~öþÑËŽéuØè;¯vûНû&·¹+òóÇ;fÞqÑdáð îYµñ¼SvýqÅä'ÔÁsF›S~ô3?+Y8·S}ņ›W-hxsøäqÉ>‡¯®rÙ²UÒuåKg—ß½cj/½Óš·;.˜yí'o|ëÏ×ξ䶑ÏÄFŒ=à˜·|tåì·ÇJÌÞÞ°h¿æñðÜÂ]†]ô§ªe“ªÔMcôs 7NÓwÉ[wVüêË£î?ðçη/<ëã>V¿»ï¶Æ¯¿3õŠ¡'¬úm鿯_ÖñÅisoü[ɀ߬Þùüàò^ßø¹¡“Ê.(¼y{÷¾­yãO §_YžòËc¾M9W”q¤Ó¬n¾qܵù‹2î»~ÂWízÝvÊäZm}sÛוçÞ3úÔüqá—ï»wc·ë‡°þÕjüöV;í]ðöæU·qU½®n2òä’!>¹ÿÆÙýS7ÞxhöÁG›¿ykÕ–p¥éÇELJL¹aËéaÿXñÝÒG’VTšú_»§ç§‡^iûiéÒ¦ó¯y÷Ê/ó¸ñÏ dþÛvÏÈäw\Øòô…5ß?ñÚªy¯PéMÚþ+|÷ÖÛJFM|ì¦þC?œã<4k]å}7ÏõØŒÖS¶y'½¼úɫƶåO~2F,ðžÙwsÓ?½Õ{ß[wìþóý™yMöYVé3=ã¾÷æn½^{æíægŸè–¾é±ÛOo³·¬\4ýø@q_òè⊙Ϟbv/z~Óœ¯/^¾ã`é¼ñß®³.{øÓ¦­*þ¹µãuÞç·ävi?oþ“¯š÷Ûgì{6øümû Y³ÆÏÚs÷Š·‹¿]°ïõ+VUn¾8ýmí߸(´/Ø0ã"?ºÇܧ›L[3âå<™GËû–gž.]:oÜô×g|Ùa_çQZðúŒ¿´ØüQiÉüôN»Ò¿Úò~ó}Yo´êÑqTë¦åï®| í±e/íûÌ÷Ï¿= `ɽ™•-º…Î,û¢bܳçÒlÍ^^ùµ]?YœØn~ï÷F/º³êÀ ÛYWrùòñ‡o±Þ[Þ;eÓZë©¢”¬GÃûÍë;efþmÍŠ‘]›g9,“…3k{úù‘× øè²Šcã›_tjÛeòœý[[n¹/;‹¿÷üóÍÏnüþÈöâPá‰%kù¯-)öfq½·moUáúrnŸÖFX*—¾þø^ç»kžOgg|´ë§–§+ÎSÙ9œy}×aÙ×/Xðú£SÎÞ2ðã=®ü¡¼,ì*<´n{ÇGþïhÿ÷J¦µ©Üòâ?~ìŸÞüéYÔ‰gǼðåÄücsnª:’ÒüÂÉflŸÆOÎÎ|¤ù¨Ì…%Iî“å7~¶9Õ5¹¿¯™wñ¾©ã 2ßá3®j2ë?Ç]üjÈìcw ç¿™Ò¹üì®nó>[Ùö…ù¿–3‹ú¾ypÁþ­-–î­zñ”­Ê>§´w±üãg«óüóÇoµd‹©½7ô©cÝvÝöÝÍFM}dÂÊíY¶ŠäŽìm&t4 W4-*N ®xúò§ö–Í4ï¼§xë)÷•û޽zö›6F¿8ªØÙç†;Ýs²ž;¸à©] ÙôÝsÿÖaù®ÁƒOnxãઊ+¿ë–›vÓ5ÃæZ"¦UºCƒÊ[Oß½cÊŽem¹k©XX•3½{ÕèWü'ù‹Âþ”ðý€sWïø:|h݉›’û»V ù1£wæåß=zð!ïˆm¯m n»>Çù\ÕÈÅ-ÅÅ©Ë/¬ÛslR^áå{ý½ëÃ}Ë6höêþ[é¥Mæ~±ø«_7­X½ðŠÎ'–¬\“Óâ?Mî˜Y^)úܲu¿Ð¢äeËÒj³Ó ӬͥE¢H,CD·ÇÙÏ_BÄ'Ý%ÛlÉ Ð, ±‹†)eçAHdhÀï.†²,`ÔR–bI¾K- N>exé“þŠÆä¬XK_ŸÏ f9¡¥#=¬ÒCÊŒá¤ZÉÙ–» (¦lJRr¹Xµ\)EJ¤,ƒ<î •e–’ɦ YÑ}Ê«¢8CN¯?OI‚ÈJˆ¨Bµ´fKúÐ!Ó§Ñ‘Ú,_ž´á¡š¦x|Zi¨5å⤌ºeé ßÌH‹É›¤Ù2ãbÕÊ÷#ÉõH•RÅ5òÂ;$7a’Ã6{­¼Äà¯Nf˜Ú˜hiµPrÅÕÊLmnµêäÂZ{•päxªä?†¯‹‹ÚÝñÔÉ [+Œ]>‚‡’8G]­£#:yŠÔžˆ#lt\Mvðlµò‹+:¹±Õ*Kä6$£êä&¦«Æu²ÃkìdD#dèŠNCdØÍvc¨] ìç Š¨5`+©pHÓrF£}¯ë¶ |Ýa—HJ>”®€§(DÙ{06(–÷ø}) œ’RzZi†¦9+Ïp¬À >Äï®)HƤOŠ„¤[+&ýØdø´o‘Á“ÆJ¸ôc%`údD$yŤÉj-–Ä fÜœ6«ËÒ¸mbcmÔJ¦Y<´ ñ)4wò#hVÍDÑðØ|¦™(š•ç£h šíQùÒŽjâqQ¼°Œ=ê[¯ÏDÒ8ž¢ñ p"i‚-ªX¥£øc£øãh}ÙBòƹˆx›Œ‚QÚ˜Œ½<ÁOI°%-…ÊJºûƒ¢6Cö~îîóNÕØ¤Çž­L®†”m&+SÎ@ˆ4)ÇòÌï½Éò?üWÛúo¸ÐJH^ð‹â^ýįyý„\ЭÿrŸh+mµYÿXÿ½n:¼{_ЀbwkEÖµ=©He[«®M†/ûãW’ž•Ô,n~¢šíI Ðv?“ ³ùÜ߈ýH°Z‚´…z—¿ÇÁ ™€=ÊØŸ2¨%ÅJÁ½h<¾I6¥¸S!JÔÊ5\4FC•™‰WKªÏåÇ\G‰ÅÛjã)g à,% P¡´Ùœ6<]JA ¢hrŸ#†HÄÿ,vzìRùm6“0St¯ÎYú¦ªo ¼9]a0ÓŠ“x®pá¯X¢’9 »="Xqž J¤˜ÀZQ(6  .žJ`f°[‹"À\Âs+¯×©ÐÀöµ¤Ø€¶µ¤F³6¡%5’ 0ã-©6`4³¤Óƒb§U“0“•”5Í ”‘‘Ñ ›X2 ™€elÁQÞ§FäóÄ@¡ÓçÎõªrPZ§áCJëŒæŽƒl‘Ùr‰SûÊî4ðÊÙIV×0ከp° X° b4 6¨p1’x-¢!Sè‡1=`ÓSMzÀŒ'*=(§Ç˜70£ ø!•û  Ì‹ß'˜ßtž<°âÌ“‡òúyBü†àÂô"Š·B¯ÂÆ6.ÂÑy ÀJ82OÊ6ä)@ž¥Æô ‚J•) 1€‡‹! ‚@PD€YâÊwœ.Ü e)%ã‡O a4 @ÿ0Mü§b²ã‹3­©(%z¤ 1ÅÊÒ,„f&pÓSË{J…êU¾™Š0ÄN¯W%¨ª-R‹Í&ÿÉ à„Q‚‡öøD<eªû”¯†XSRãœ*³à‘5ªL>—6U—Ž™EQóý“$ˆn=]Ÿf.v°2˜éÏÛr•œA=1ì«–@Û+Šêö8óü>§7h¤Cäûý÷I¸ç}u 9sG™õ°õz@{Cº:üúãèìkŒ¤ ÜKU%ÿ3Ý«ÐÞT™©å¡ (ò4›,Ò=˜}þÅ£VÂãŽذD“?g¨'u¨VáT¥›È`ñX(A‰ ¬GÐþ¥ò³$ˆë¥øHˆ©ƒi‡~ªYZAŠJá)0#Ÿ'Å–'$ Iuž!’vìÔМ¢×ë) Š9ä+Ô%Pª¯¸@‰þͤ)tB•(í&½Aÿ•‹ÙTB•j˜÷f$ ¹HZ—t[\}AKÐpA/•ŒŒJgaQTåÓ°9U‰¨G¤/¼ÎR1@„7(N4›² Ö IV$@ ƒM%RÝ)7Œ…Ð\Øõ «å‡à76®¼z ¿`2ÚÃÿI/œþ…׿ØÕ—l³Ž 0Ã(7ªa¦ˆ”ÄX™¥ÐY"ýTê,úpÀH2›Œi©*Î¥Ô ýnœ3šMN¯ßé&]Y§åP=iŠTQsSåÆÕéÏÈ ½Ú4†ÚËï“ˤñ‡F&¨PzÔf’#Iï+, Ê $¯’¤&¨yC¢”D±˜Z–ª,ªqiÅôÉ¿bøÈ§©¥Y¿l Çi=î TgÙ(Q:™^ècÝë¨=˜Ÿü“äÆf¤Üª¤`lІ,t DÅ':ÿ…`†HãàÐáÝÉœ¿( †°¾ü¡|(B(ì©O0„ƒnÀlQ¾ž"µ¦Re¸”D p5Ø¢3)©„CªÅ/³Ó¥wï.Li©.}út¡‚Î "å÷Ô`±48¼{\h&y¾¼0ˆŸ—hyS†€©eŒš…ZMž¾¨Ü%õî #’JÊ’ž cÑúô©!ie©¥&“z«ŒüÛ¸„·¿uk@! h_ˆlô¤†ú¸h’î#˜å5#ôðÅX)E¥»@…*V”YJRÓv’~Sò®†¢†&›ÌÕ8!ÔäÌÌ …ÒOY”.§\çˆ×÷kL>âÉByÂÛš¯r×C}cô/µøx¬Ñ÷}‚ÕruDr®å„>\詯ãyÕÇkœXXÕ»Rj wœ6Þjð©Ë\x“WO]Œ£ ßêr6Lvqºæ´ExoTpÖD`ÉýWqÂK „8áXd¤¿–KðZhó²Á$¦tãJ?fô =À)ÌɱãÃЕÈô„·¸iF§z½þ¼Kˆj*•A±hXýTß´ÉÆLhV’xVµ¡™¢™=+º¬×lİÅQ-kk($.”c»nçÀ7ô ŽVÀG£ )dáÐÆ8’¡Ò8˜}BGⱊ§C'žÈ j;q$†?lµZBùÑénHÉdê^ÌzMXªo³ú ‹`]ipáídlá×·;öYž×k~]ãØÈ$91a©oâõìLt–MV‰TÝj£YœüÛp‚-mVÙô(Mx‰ž ØãúG­p^:ÅÇ4ö®:´ˆØõÖ4RkWú—ì˜4¢ÍЈ¼ÔˆBT#"È1Kæ_Ø!ÑV#c3‘c÷ú)’nEôÞ„æ_õOü’£ŠcëpŒ¾uð /ˈ¤uXãq_–%‹\Vi˪5ɆæÐ› ®»7ºx!ü¡~Õ_ëí64š“­ú'³)ÑÈGïYÝøÎ3¬n|Ç7MËcÌ„L‰Ä³Š{—ŽÑ›ÒEÉ››LT^gj8èi"g¦ ðo¨!ðaCÀ­F?¯2Ãöà kµ\ÍG3'ñßt$fÿOõüˆø«Ýÿ­à€ •ÌÛÐÿÃ2øº`þ98‡Ë%ЂÈ2¢È¹ÜV+ºœ,ë`ìÌ%i‚?þ~¿¿˜å¿>€uÈ?Ïs‚æÿ í´ÕÊý!ÿ—â¯að?–4ëßlý¿ï½óœS¿­m—4¦Í×ÎI_jóA¨xÜÿ¯:ó¯í¹ŸÝŸó—6Ý?k-L´¦^=mvÒ £Îzéü’‘YŸwrüçâÃS~fÖ´´4ÿçš-gøžë°xÌ™9ÃG-¶gʾƒÂ˜ŠÃ¯þÜþâÑÎ}Ø©âö“KÚOÝxÕ”ãÿeïLàjJß8.‘!Y“ÈNTg?÷ ±L”‘ Y†„t£f(I!k¶)Ù—dì²›ÂÝŒ}lÓ ²Ù²3™þÆò?ï{n÷œ{oÝêœ{ÒgæœÏpç½çzßsÎsž÷ý½Û÷yv{ÊÔÉ͈AÉÿ|3b¥×‹ÉMyñUnÂḬýcKÎêþ[ð-φ‡&ÿusÌí ½O]|ªÇãô1ɾYS<øöî¡·—Þ }r:mÇÕ•ç*¤PW¾÷Y­|ÚÅ{ëZï¶xÝ¿\ü­å Ôæ¾ç“ÞÍË ßß÷üð[Rl͹5äè? ¼·ÆŸ`Ó#«I«Kw áYµÅybuUõGg‡È)c]fœiÒ6<Ö<ªÁþyçþ½«ªw¥ÃêË/g}y¦ÝÞ›~W×w‘Ú1ðh‚Õs?çw;ç;ÅÌ}èü0ñHÚ°€îý2zÞ–ýÁ>þ÷m –õ8Q11ÌskÅ”˜Z I®KÂÂ7¯}8*©Õæƒ{6dÕ˜ÝڿΡþ¦¼b»þ}‡?mÛ¯tQ=zÈ®qn?\²O;¾+h…O¦GÚQ'ÿøË?­÷k<½ü[+Ý¿s2mi·_ÿØW¶Ùð£;®Ø\j?4;¡s‹~8³Îu™g«Y;6©·•ëÞ‰—æ­îÝ¿”ŠÙ†ºÔQ¸Ç¬S—½o}ÍÌ¿ìÏØyl¯u²QPpùcäÀ2—T9Î?”íç^myìÒ0óò]Wu/;£A·¹ñ/6ÞzñtK♃ѷü¿¯Ômöä´…öóN4p_‘îÒ$g{»ÊKlýnäVv¸8ÊùyÜõã®ý»àiêÓ½©‰ÖÓ-²šìì»Ý31zEÚé7çæ¿8à»zK“@6©åTÖgð³]§¶Ÿþháÿ`é¨%^ëj™7;÷Ü®öü‹ß ž8*ªŸG²Û’­—3ÿ š{qû佯ÿS§¬~êåžØ¥y¯åæU^ØÎúÆ úmŽÂ|Ô¾–fOЕ¡î­ÏW©ãUÏg|ÿK:†÷ö›½eDo«£)Ö›._˜[Ëqwò+b'TS][6®²›ã.zN¥™a˜™}¤KÍÝg-Í_Wéšù¸Ó¶!‰Ç×Uü¾Ö¾Ø¾îè‘SÓ†Z÷pqšëå5uWTånî³<­»ÖȰíÛ)ÓrvüøKîÇrj´*,ÞbÏô¯#GW½ÛÑj®£_…”9¯z6lœ¾)³:bfókíêÍ]Ž_©·‡©¹ÛüRçJ‡ö™ï^:)ýX¥é+ÏÉvìÖ¸Eß26uÅŽw u,¾-¤Wƒemûÿ³;)5þ\ûTjÝ5ÝÝ—íÛc7¥ÏáMU±ˆCxJïÜò l›²zæK ç9÷:å¶pN‰yQ÷pÃϤfœzÙ4µÖå¸ç>f#"öÆÜÿ6iÓ†ÑX`ÿÉe.¶ZfmñÌì++ŸËåÚDÈŠ:ÒèÝßgß´µ¬‘¸õAŸ€ oívoÒÇ ^•ª¿Q™wþ"lròxµ¾wëÅý8æÐ>mÓ|]‰ ¯6$ޤÏ;Œ?b±#ùΕØÜõ‹Z{ÎHi¹Ö¾jÏÎ?Z»MŸy¼ZçKÏœ×.‹öÚS}Ž×òþ‘Ööa^MÚ¸kÅýµÈ§±¹‹}ÎN¥¿îsϵÕ{ªÂîsæ=‰©õ,+Ö¶û€WšÞîäûFýåÔ~ãÑŒ5±Ÿb+°ß´pªíÝW³ê?d\»ÜÙ**õþÇò©Û¿1-äéî¦g¢‚UK–6=S1éÉî &ù=d=38ÕgPhý~«î b—Ƶ³1˰ŠoSùÑ¡ºßûÏoFÄm>]}§KV ûP&)åÁKïÚ1åÈÁóm³Žü¼¤÷±*ËÊät_=8Áîüð=5W¦NSEV¹{!fX,™»¥oFÍB)”6/žyo”¼Ö¸Ñ`hµch£×P¤ýÒü7Çp3ï YØ* ¾ÆïÙg§û?c‹¼¤Áö)Š›Cà–aÇÛç»’¥8tý|pöBØ})ÅÙ“L8{xª$qö´œ=ªB Ñõ*ÜïŽæƒ|GIÂqŸÎáô¿S‘´A¹4EþŽ1@×cnøJâöÊXÿ;‚0,—¤ Ÿ\ Fã”1t=]ºÞåÓÌA­~N:yœ.÷x¶èzf«|¾ÒC×ãŽÉ®×ëÿû:ÉPxj4I<þ‡hâÿ¢…ÐxÅÁWv¢‹süÇûÿzöW—û£ŠýKâг¿_©±?¦Ø¿$=û/5öÇû—Ä¡k•Oé°?FÓ´bÿ’8ôì?¬tØ_Ñ%uèÙ¿ôèEÿ•È¡gÿÒ£ÿýW"‡žýKþWô_‰zöÿœú_³þƒâìO*ö/‰ÃÀþüœÐØq>£¥‡€.xýŽQ¦k !!•õ?%p”®ø$œ3JüG%þ£ÿQ‰ÿ¨ÄTâ?*ñ•øJüG%þ£ÿQ‰ÿ¨ÄTâ?*ñ•øJüÇqüG~ ¨hñ í÷ýgâ?ò,¤‚‡i€OôB‹+8ú£”bŒÆ~̇›©j,†¿ iœY‘(2Âó0œKjžLÒÚ$ü1Ÿ¥0Mq"ѨŠdKÓRq[ö ô­Ý3¿¿>whHÍÛ÷æã8Ä¢Üf.zÉÃxP")x¯ðàRò†dàÊÐÒ1¡é(ޒଞ‰lù=´£¬>¦Ò‰ëƒë`"a’G…ÂKЏjšâ¤ø˜Tä?$”•!:™ì0ˆ¤ØlRã(êyø… 0È8ÃÅi#ž†i"°ÂmHòBMaÆ{‚JˆCa,)PS‘ù‹ ´æŸhŽ˜/…Ž;©‡ ·ÚÁ®cqw!CZüRZL#ÉEy#ÁTW>*(?÷-T™Ø«¥¾Ë“UA[Ȧ0ƒìc’™¬ Šàá§À4<ü/)–¢ˆÌ‹¯Hñ˜­ûpÖ¨4")Æ Ã:«p+êØ€Q~cØ“ƒÅ i“¹»Ñ†Ú¢V5·˜Wã„´P+Ò‹2ê˜u¶|B­pOU@ /F°ã‚æš4Žš “¨é jÛl `AÓMQPÛPòr*AJJk]©.M÷ŠÈ¼èa<ä½*”ŸlÀpœ|X0ð;IÑȤ$Zè2‚hdž>nšŽ$åHë;šÔÞ£TÈ«ž€·†Gœ‚•“€ - »V ƒ ’Êë< ¾[ëòcÏIòâç]ô2º¡ƒ¶&L ò@Š×u.‘Ì/½(‘îCàºdþ !N ÍâA¡ü_i·iD×€IÙ¹c¼mWï}ú~ý½~¡S[‡ŸÖ¯uÜ“á$¹sûžóþ¯ÝÞ~râQæ……éís¯¸Œ«ÑóãÀ„Ô-å7øtú_·-ߨ‡'~׿Cók‰k~žð"³Îä)žþ|RíÝÓ+ðàºg³~ÿ~ï«%!±«z§;xã-v®J}Ô%tÐ êÊ×õ¶ô½äuüñ€gq9ñ᣾:cÆCÆ5åv‹D×3°NÝcé·~ÕŸ&~A&§½™vu¤÷Õ?Úlº>rVSçÉCÃ7{bW/59;DZë©;ÞîëïÖ{žúŠP¿U[–#5«¾Mþãòʺ·3-—/ h3rË‘·³k~ýñmzµ“ªgÍ^{æœñ¿¾AVÏ÷4Þý¢™:mf-fÛ̦ÿ ñWïøÔF~õºuõèWÛ]Ï<˶¼Ù¦cÀ±Ýg-ÃgÚl(GÛ‘¿ôå»r‘‡æÚLl×èÄ>¿ÆñI¸Åþà¶Uç” ˆ ¶ñrºuâÇ)ŽIDú•E­G¤z9©7Æ%GuË ?uVù›>Vîϼ©cu»VjæQÎnühÐæ—eRüöÿ²kný¸*_GVø§Ã±È˜­ÙëûdDuì|/ý@Àí—Gvn ´¸yß±Ö“Œñks®fe¤Y¨Wþ`uxÍQ•¶:»n«œ°ëNýyæ#²lHpY7qYýå­¾ž6syåÌg&žkRû åškɳsïíLì2Çó¤íw ¿v3ËêqýôÂfIÕ¦ŒX7{͉‰«¿µÏ<‘ô >×¼þ Û˜ê lí3¬'<ûv¾ŸÿůI_õó”w*D[P7w«Ž o¹ß}9>¦žïƒÞÉOV_ððȹŽoë“u}À©¹É‡5÷Tµ 5³L¯·í§P?_GO›%5zôúÆ:èTçÔÑIûÚ¯N>Õh£Ã¬ÉüÆUÛ; Ón¤bαˆ¿ ߺˉ¤ÅAs3½6›{ÿ=ïÀ‘ŽV‡]¿¬r£ZdVÎÖo¯-ó¬zË7xÒÍÌë:¶/ÑxÂ…ª,6o²üÓâV䌋ÖÕzMo‘²í¥ËÝ¿¯«Ð)b£_ÍyM=üç˜v5øuÛW dÂ3Q $¼fáµi𘠯e¬AÂÿ›èï`s>ìdÈÂ¸ÞÆ`Iþ£ ç9/Úʉüw ^ ö5~5â(ãÔw>”q†½”RÆUUeœ;U’”qÂeœíS½Ä€âbB¶æ;„0ø]¾”q3 x£8Å Âðw*ÃïHÔ€ŽR¤at>ÿV… ¾3$……Â"ï|_{꟣R—\©o‹©[~£Ç ÇP;X «ÿ™ÏÉÿäô?†qüO…ÿV"‡ýqEØwÈŸÀÀÐ@ßP•ˆ%Aïÿ±u–¾ý1Œ&(¥ÿWGéâ?Ñ`šBþ“ÂRøO ÿIá?)ü'…ÿ¤ðŸþ“ÂRøO ÿIá?)ü'…ÿ¤ðŸþÓ¿˜ÿÄÿ‚uâõ_á?±ÿ Ó®ÛD .©ÝÕ æb´I„”ô¢Œr P\+‘´»©á˜³`ÈYÔŽjÍZ[c˜!½LôµcŽ”ˆ‚¬ø(ŠÑÁµ«Œ)†Kj9LR|’ÔIŠXImšâD®§¦ÀÞ2R»1«åˆ‘Ä›tlü9aQHï¢FÁòa‚d_l s‡>B¢‚-¿€Ds °ï—<žaƒ£Œ†Ñp`ï'[³a4­=O’¤Ø€GR*øI¡ºç)°´™&í(Àì(Ö²%/#‡"XVÞ{ßíFŠ}e0J #Gdþ¥‚FE±6d´KÍi¶²a´WR ŒºÖƒ0aR”ÃJ/L´»²ÏÑÚHÞ-ú’±S(­Ó¬aE‹#½i|V‡;ŰEy×;é l؆do‡‚ýÁ|…ÀÝ ð•ÊŽ`°¢ 8+ÉÿK Ð&X‚‡ÆS‘üI¥P¬¿«höƒ¶SÉíŤÃ;ë`Œàmaû’E¹pñ3ø¤:6g°)¼ÝR¸94)˜×/)jw3y[?Ùö–h %ð_Hè+bÝ!_aÆÈ9l[%¬òÄž8WbrÎtL,BWI³Þ «’CØA¤"J—ÊN«·õ¬È]AÁ$DÙò/ú†^Áfz’Ã¥à“AÅû¹¯“šÄ Ö»ŒQ— —çÝKÞn4M2o;šæóvEë&Åì¯7IqÆöØ%@«òïÖ±OÖÝ9!&Kš_KÝlœ×Ϋ7QÂa1ª`y€êʺE–¡­º9k;âð,%e·¤Èü‹Ü|›JÕ6‚°ÀXƒ¼>ܶg˜ —E­>Ø;šâë^°“¨8öfƒbï‘×€ .\#âµ½? ÊKDæEç2 ªdâ1 ‘DŜԌžð b‚XV‚u2w3yu$AM´Í~) 2*¹(cu1€nBF…Õ4ª+ïÀÿËNúÙèQÐõyÂÊ\.Sc(›aHykgP_<°¡VÁsÞåÉ\ ”R•o 3³¥Hqoœ¸·‰•ZèzAŸw‡yõ$‚ Õ*LòÜnøãB¨áù_Ši‹9VCb*jx^µP‰¢ðvåôr® ­=¡Å0­óÁ³¨J™Èü‹Ü›JƒÁ å/*2’aìI (EDn)ÊБ;(‚óz"EL‰É¾ØVêÝ eਠVŸ`'S ÂáMá";ìÜÛ$o«H¢Â_ø>ó/0 h¨¨”†QdþÅ&+J=‚5=Fñí˜VÙQàqƒš_8(ŒR”…º.3f?Y/¯K1lü%‚ÙR;$@y*¢à Ùò/¶©¤Vm\Íφp/û‡Â€×à\Õ 3¾ôׄªV?Œ°úþ-Å¢ò/òž©¼ŽR©´¦ ÀˆÀV!F€{c«?”ὂ`?†‚ïÁ6ÂÍ©’Â9UÄSaÐë0šU¹7Á(»WQ*·ž´$ )¥™±M)Y0ÀÑ$߆ƒK$˜§¸émTPÁQ8ÂD³·¦ì8/&·¶£ ¿›÷ ŠÔH%%j;‘ùÛT’U4ïu`êŒø€ëe½z€ à”`•¡â¸çPvàz²ÐÑìèJ ;p¹e:×±Ò‘ÑY€“¢d‡¨ü‹AhôÉÙç…A­4€¤0á¤öÅ æ@U¢”tÍ57ªmx1˜Ìó$T® )¦kn’âÄvÍYOÇpÃ#Ð&À$&[ §w¶øÝwÆdJ®9'u*•¦ba¯ŠkÎ ¸pT, Y°ÌýD祀fǵðP<{LRE\þE®8PaÅ: è\v`¾JÊ`)DÀŒÑ¬×.%Õ†æ6µ~LÁ¤Ö)xóÚ'L “bª “'ºÚÐRÚ Úȳˆ¨a=~@_x‚¯0ò_-AÿÓœþWq³ÕPD2òöй2´½VÎúÚ!ZîlÁ¯“lù]I˜l6ˆ|÷#`ƒH᱋p})RîA?Ä1èŒ ðƒép|AÚ¨Ÿ¨ü‹o ÉCËòu[XуΨ„0•îhCÂÑ$°Æ‘ëTÉ=š¤‚Á„C ¨Î„4j„þ-[þÿbºsá‡8þOñHÐÆù?ÈÿÙ;¸˜Óÿ#9r¬³(2tÈvÍ÷œë&wÈ(!4ÍLºÔtKKV9ʲDŽ"EJ [Ë*k“JެÜéXëjQÿïój¦5Wµý÷7ϾvÛï÷ûÌó}>Ïçy>ßÏs½ŸÆüg*ø?8‚©ø?m¸(‹ƒÃÃ`6å8@4†ƒ#›p±8•Åå*üU…ÿ7A±ö/ ZJûÇi4H’ÿ©Ú[„–á?Ÿ´µtÓ£õ¼ø{bTÌsû…ù© ê›5Õý‹,]-¬’yK)sÒï¨þô4&¶Úɱt†]gvvÞŽ©õ†Å­y™»Î?xü—_F{—ÎþR^8ÇÿSÖ½­ÿü>tÏþøç߸Ív«ö»PázëSÎ匪àŒðñ ÍøQ‘ÿtêPó¶ìUQPÐuóœ瞨—Ù/÷÷È_®{~¹Ï‡à’¥ÿ=¦èAåç/^EŸ<^±õò¸¿çž©·Ôçs‡Ð‡ã?¦>öå—•žÐGôuöÁûÞT¬ ×ûôëÞÌ’c¿ÖzW{~¸Ìýp0ô`o þåñÇgÛÎý~¬†lyzôËI¹7JcSµ ®æßës|‘«_öšûÁÐðiŒÛî{öa椺ö>: é·PwãóûNϪôøqb·˜Îg£’ØÓðè¡Õ—Éã&ðN]8¹uÒTa}/öþ¡úºýý?·¼9×ãBD¯1º=Ãïí„t;™» ß„Ø&äi‡G­ì|è²ïãjÈ>7½æJÙ1óê„Ñ•±ïÃ//ÕšÖ½|¯eì\ÏÔ0ú VÏ×§öÔDzÞd ±í¸µE]éÐíJòµÚ&©±?<(™ìUõ>© (D/³k|ˆ%ŠÇï¬ñ¸ÛöUšQ‰ßëÛõäö‘j¯ìb½Ï½ºðÙ̽§l5–r-çEõá,=V›«.Á‰n›Ücöýñ(<é.æk·/¸bþ¨,ï7/´FRz£Ð]úNþã¾±öå¥Zn#÷{DmªÝ Ýe“MUŒá%5 ¾™X¶öȑ㱠»-™~Û¥{µ¤ÏLôòŽçü ¿ŸìzÅÛ, 6îûzJß„é~:§„´u™£áå·=Ϋ§Dª[Ñœs¢°µ…+)EÓ˜ƒ»Û|·<ü¤ ÇO=;ïÏêÞqX¿™q×ÒÆ>ÉŠx{Ãb[1×è·Ûöý?ß1<¬[b¦·ãÞ¥Ìüí‡ËŸy ÅÊÇvŸóÞð.rm¨ÙÙÐAÖ7GL7ÜØïüÃ.aš÷ØÛfZÅÿi’´›9RøÄsêØ½%)'v®»Æ_æ˜iv'!nÅÞ)-è“ïz›ÚÜ7±qw‰;½~¯sØÀKâéáyÑVØŸû¯ŒûË÷Ç”~×ËFdhÐg={[pÅÓºÆñFzÙÓÒ94ç…"yĈø—Y3oL¼Üe±‘×®ÛT›NoŒoFXÇ^êõf¸kcïÝý)o}úOú4ã<ãZ½`ã³|cë͛棖‡O(·¬ F ϼ|6œöhµÛÈyE÷6V,±lYÇ&!áÊ@ä „×mÏoJ8&J Çe „kÔÅëâú_C‡ƒùS.XáÒ¨ÝR÷µ)GØB°ã\}Ç€›ÍôÝ7JòÂFAi4¦ºLËÎåá‰KfƒC‚Ř´ì4¹LVj.fsANg1ê†íš‡ªË01(53âÖ¡qfÀ0 LA´"i~²AjVDüÚ¯ÐÞqJ{§½ÓzS´wÁ£¶¤½Óš£½Óq Š;Ì€¾BI§JÖ1†l´w°=GüÞWÞÓ1ªd>Ùa•®mìÅÁÃFIÞ#Å#Ä7¢ñÀc3ýÏ…Gü—øŠ‘×]!ú·´þ?‚à¸ÿ› ΃‰›ªþ[„öÅÿÆÀ)(0¢â«øß*þ·Šÿ­â«øß*þ·Šÿ­â«øß*þ·Šÿ­â«øß*þ·Šÿ­âÿ‡ùßÂ1 Ùøß [ôÿþ7DâHë9{`í?µa92y /E/à+ÿªæùß$†„sCÎò¢‰n5¹ßIÁ °(a£’Ûa„È=†(…$þjo;¶hõ´4D°³N{õÂÕkDÆdÁÈ7Yc[äuÍñE1·÷k•I¹zôo²ÅL\H‡ ùĀ݃Àùõ…ÚªÐP2 H# Òäa„܆­øz}ÓW„ ŒRÐ1L#W((Ür9æ–dËe»»·QÛ­¤a—1¼l EÑIñê· È´¦÷&Jo»-óºf*'J|žÁþ“¯¶]¢X[ õŠîdûà¿ ’CÂvLªÀ&VˆÜBš?X¸3!¡0 XäLAèÔF„vÔã4”AAt´ÕíÔ¸B¸°¢JîÛQ0}EH•hÝ6(Œø\(µqžeÎAÐ&&ËÛÐÔ‰SßT #= ¢LÈÆ/rÖˆ+8²„h ÀË}HRr)(¡@â90äˆ"›ðLˆKœnB¤ƒ´²É êtKC‘q°²–ªÔÑ %/ûCB“Ó\°È”o D'„.ê|¸¹°x®í½Q/d=•Æ¥€Køˆ¬z£e^§ z¦#_Eoô¡][Äú(~ÀÜbX}´Qï -8ƒèAtˆ´) ´ÂÜ€kÁ_¨N9­‹õ „áF—„ãGÀÝ”‚é)˜¾¬ön©~&™Oá}`‰!ð­ê|; ÉVWŠ6**Ì‘’ª?}¹U¡4u«2‚³~`à¦ãu]~\è†Ã8ñœ°$$À®ä—=Fºí`Í8ƒQбj]æLV‘£M×z0І)3ô§`úŠðëAq%\euÜœÃÜÓÒ÷Ê|wQ¿H+ô«ëdoø ¢Ò\xiß\e_¥ð÷nÞ½o9@žr³p‹áíI,Дà ¶8‘‚âm]›ŽˆŽÑ‹OÞÄe¨™ ¦/·MW¶oƒqjáÅ0 3&È>Mà(Á¸H÷  „‡ð“€Åùö¢à`ÙƒÂ蔺nn«*ÁDÇ•`o<G½TD‰Š¥/sª¥|$œÌEohM8™¨‡Šh¶€Û'r`Ð yÒ&Ü^Ò‡Â[WU`,Û#ÞŸ¥Ør ¦/·ª”õ¡€ª`áœPp€ª`¢mÕD·ª*@OjÔµé<"àû)s.ª‚éË ¿WÖô|¢BJ7I_% ø“Z[ Â>ð/„“ à¦Ô!J $þŸâÅ)²ÿS>ú›Ìü7Epp°ÿ†QÕþ϶4G”FeS98¡³¨8ã\.ƒÍÆÙb3XÿvþT¡uƒ"í_>ú›tþD´yñýߪý·Ihþ[ÊBK7ZŸ‹•‰E1ìw• +ìd±®ÓXý‚“F&§<î`“‡ª¿ùð]åöY C.FX ZF?£¿±2W矲XoÿO”l¼]uû}ígÜÿùyitÖÜ`«›eºÅÇÿ04hk°M©ÏêZ³aŸ/Öza éÜ㉾êAïÊܵƒf¯ï®°ç=ˤÔê íšsÕcÒöv­^s '·ku þ }ï\æ9†eêv½ ËÐŽƒþ~tqMÍÏ®)‡RbÞÑÓÆÈè•ñz£Oðû¤ãgç„2MúvÉŽÍŸ/ögc.>)}«^ýzgžÙµS%O÷](KK1™9=Û¢|ÁÍb§EÌxs³c¯GUΕûßñÕŽŠÀ_ÿkº$¡ëáyÎÑSö䮯-—èÎUÛØÙ¿(ËÒ*|–?} Ï<ÿº_¯mÖµ¿§ëLš?˜â±_•¹~Gn ƒxáªÙ zHmÙ—€ÇÇ~[¾i—™­úáø=f›³§nˆþ‚jË-[´ØÒäé1Ë̼¾³öê9ûÑG<2ȘYn`[¦¾¹èîí- ˾xä3 ªt"úðm;`´“Ã"õzÔö/~ÞñC¹VÈ4çH­àóã>j®`¨¿?eæÀ «Ù¶¾UŸg™F.öÑ¿¾%(î݄Ͻò‹NiTêdrGè&TeOÿyж[ó;vðÙO/èÚ¼œí¤—#¢ù»tóž¿‹ö|ÿ½•‰ZÒ†_Áç…«G†Uäæ3¼‹úþªWÿÉ´×{~ËÒßc]Ä©á:°Á¬•Ђá«>îiÒñ̨,ίý†Œ³8<ú åFæºG-ÝG_ë=;«éÉÜâòêPèO“ñg÷Ô8—ñOç ^lj8éí6s¿;•ÆÈصŠÑAf†›gÌ1œ6*%xô²¿àÇDí¸KþÛã?–Øèy:ºpw·+ɯ^ É{nk|dEá‹êc;-5‘ÜßýZfÝ¿xiqç· 4¶~8†–aU»Å³|«-{éŠ!N6¾ÕþüxìòÈ~ϼ»“:㌭Oïë> L §¤ìð:b?dz÷Ç+â^¥¯0(ŒóVƒ ß)Ê]zÔèõâ‚i!Uc¸·­†ô¶Î²ýpD¯Òøþ†­U;¶>ñ6öiëv¨Ç ë\ÿkþ™ð½‡ŠÎN+ôp31­È}Ôá“é®ULÝ×3y»õ·7¢=.=›å‡GfçÝáûã³±ât{ÃøRLËM+ô—ë–ôªíø1×dQÓ`1**X¬nÝ¿ ,ÖJ`1Lpð(9Ò…¡ÒX^M/gW)&X߈PKM‘f³!em®r<10hf-0’ Ï’iq rD1rÝ‘°b¦ùÌÈ´ÂH9°L¾&Âhžå%eí‚rP10ñŒ€u)´R‘a:翃Ñ&¡bä£vCQDžŽ»!tIÐÑå *I‚Á pŽ™Ä{a‰¼ –¸‡K‚Ð :Uò· T*F•” ‰HÉpÉrAˆ2P±ywCJzŸž’räiª–¿ûà(É;bP1§3ÚÉiª oëÿ;˜·Â;@e¤aXÓãÔºóˆ6C¥!ˆvLDè@‘o”QÁð?ÞÿÓ?»ÝèVé¿-‚˜þ9íFÿˆJÿmÄôÏm7úGUúo‹ ¦Çv£L¥ÿ¶õÏ¢¶ýÃ4œ¦Ò[1ýCíEÿ4ªJÿmÄô·ý«úmÄô´ý«úmÄô¶ý«úmÄôýÛúG•þÛ2HèŸíÌòôœÃõaò\¼œÁì…+ŸÇ÷›Çâ;™ÑyPpÓë¿`„Jžÿá`ýDü£ZÿÕÁÎÉÏëAÁ .? ÝhØyrÉ=rD ;Ó†8v¦‚Xv¦ e2Hƒ2ŸëÈõ<×@ ;0 ½zÚ‘ü€¯?ÐÄýÀ@@…,’2J¦Nâ9¹d X°mpþv|>ÅN,`ôâp)úcô] 1–Û™zò\ÀÁÌœôÇéj²z9Ô‰ûmÀ7£ÔÝuå4þ…¨ÔÒ値ÊÁï¤0Yv¦ÓÝyŸÚ™. Ø T”Ô1^˜ä³ó¸uõƇ0Ö®ëŽ ÂÊ¢bXq݈ˆàv“âË­gX&={pù^®d™LŸ7ƒ"(,€Ám¶¼ÝxЬÒ!L.ŸÈÃçʧð8¾&’¢‚5@Ó`ÄWÏvc“ @¡Wand©à\–=üA—EÔ_Š»›'¤&EãMfRVñÑÀ€i â ~.,Y²?_¨"r›±›c}…%d©—$&E¹”†‰*M<×RT'«N È$—$ÍÖ Y%ÄëeF]…’O7ÓĨ¯äǨµ´Bk¬É<·p«­ë=0`"ñEw娙‚Õ*òiAðK¢]{€…. 577g™3Ë ø?öž8ŽâÊò ;|ã.æ ´ÁÆFšýÌî:FX¶$[ Ø:É&’¢ŒvfW+Ïάggõñžø]„ Ž Èê ¦ÌA>Ü…Op|ì'Ôac(C\Ä|/Üå¹×=ÿÙ™Õ®$¯÷ê¶Ë^ͼî~ïõ{¯_¿î™îéRä,Œeä[æÐ…¿„ pyu8ÒJ8'î\c©8ý;s61•ÇÓ ÔçT,)LÕÚ–žo j®ø ûóª™ÊâŸuÆxŒuÁón áQ øàw)=·‘‘RuöˆkR>ÿpIiH«6S°I ¿©À‰@ J+ò" xê¸|X¢4&Tµ¬mÁÚº’ueŸCÖv—³‘· `͆<¦Rí*x³á‚*ÌÝ$JÆÍ²P™:1ÛlИZLU#y¹2²FÉÇvp'ظ­J¶Ž‰j±CPñÛž<ê´W€8íܘr!±O‘À³*ã®CN²ÆÇ¦ªéUx¨™vnïßV½"0³•„rtü¹Ó-Ü”`¿7–ÁâÞúN6Õüa›üÆLnªÌ©('ò(šÌN•£´lYÙ…—éç˨ˆ ÏeÚÍU7‡=85ƒi´Ù%°mê½»¿‡S¸,ù|ʲA#Ÿ·Û®VÌ‹íÁvžWð·X¬é+ øD¾Î"A—›$]ljC4NœÖïZ㙹ÍÇgkóZ‹ƒßEëÚ²mŸü9²a cevK‚ûòÆkçµpžèbñjm0޵VY?k³Ãì Jb`jö²&U¹•$fk%xÞ¡Í:V­kËJ|òçÈJ,Œ•Y ‰¬Ê[‰}"å1ÒlœOµ6“À6SÁôjÖƒy$“ïå ÄCŽà7b™‘`ÎrÓ›P)Úºp ¯Ñ‘¦€Iæ É$8ÂTA‹ÚDAÕƒ6yD‹dpA+¦ÁMnjž‘µ²³µÖÕ‚J–*Œ…ŠE7Ä²Ü ÊΑ»ñVfËeVÊÛ¸×:Óì<"‹­»¢Å§#ãËX³Þ –gd˜‘¹2L¼liYå,1H2slˆç ÐXw­ÜÉ–âY__«Òõj‚˜ï™_x¶æ×§+~EѸ²ÌÎ#oŽÌÍÀ7gžµí2¨2H,y¯Bv—ª!3\•&Æ&:ÝsŸÃe—ÈV„´ÔnpöL³uƒÖ»Ñæ(àŒÍ•©ZòRjºeÊα)W7„WeÒ¾Cõá´Û˜a·Â4O^ja»æiζ˜ïΕAkÃzŸçÐ_¦ÌpåC•Æë1ÌWä•«4بÓ`½æG{¸l•¢ÖCÐÃÛŠHÜ­ŽdòÆŠ—GiAÂ+íR0Å%RJEyOtñéùe•¬„“%lëØ ¥¡øÈTÑûu&×rJk's9Ÿú8ÇsåùH¿·ÖHs“\ï²Gúý_óýïÆþ¿š$—þcu£¶¡ÿZ$—þãu£ÿÆþÏš$—þõ¡ÿ05ô_ƒäÔÿpÝìÿnìÿ­Mré¿~ö7öÿÖ$¹ô_?û¿ûk’\ú¯ŸýßýŸ5I.ý×ÏþïÆùO5I.ýñýßõŸÚ&—þëgý¯±þS“äÒý¬ÿ5Öj’\ú¯“õ¿ÆúO­’Kÿõ³þטÿ×$9õŸ¬Ÿõ¿†þk’\ú¯Ÿõ¿ÆúOM’Kÿõ³þ×Xÿ©Iré¿~Öÿë?5I.ý×Ïú_cý§&É¥ÿúYÿk¬ÿÔ$¹ô_?ëõŸš$—þëdý¯±þS«äÒý¬ÿ5æÿ5I.ý×Ïú_cþ_“äÔ?_?ë ý×$¹ô$×ÿÈùßlˆÑ¾ÿÓˆÿk’Jô_²½¯Oò²²JÎfeih(#JFJ+\n¤UÈU ¬à2ç¿Ç‚aÆ©ÿP$Š6ίEZ¼°§¯¥—‡…–PkZ¼Xÿæó2äþèsÙo>7CÍ.\KûÞ³ö¹g€­ÇŸ{^†VÃ%ùX=c“x\~¥\ðx+å‰e(ÅÿBÁbãQü5a‰Ç&'HjžÊsc.wGö(²(§)ºCV;2IG<¾à…eÉ>JŠ¢ó‚ZÈ]È©‰AE*Ë))šœT/Èñe¡(‹8Eá& äÊ RTwß: ƒ‘…‚P)ŠÒ‚JŽ÷ãD”+˜×ú!C& !¾Cá ‹èöNóŽ;.YPH2£$ Ù”(L˜à€ùŒ ùLÞýo̪>ÀÈ„ fDÞ*Côª¤ÀgD‘3` °Ñé`tKw–²ÁºN7 °Ñé`ƒ6ºø ÙÝø€™î|ÐÖn¾0@6¸‹™Ð—8ˆÄ€þÚ¸dôiAÉr?,š#ÐZÎQ1­åJ¹‹YÎM6D8«&´sð¶8» "ÀDÒ%ð(° 8Xˆ B) Q¸àf! DQ°C:ãÄlf<ð3™|ÐÎŒ ø¤"sª Ž%‡!±Àšì É¹”& ¬Ènš,´WvÒ„6È 1àBÎÃ84bB VÁ©sà¢PJ3¬Ü4cІ‚ƒf hN:ñ€&Šøƒ‹É‰×€r—ćz z/'ã‡$¨¸X°i ãÄÿS‰OÉ’Jn´-ýš»Ò\”Q¼¸ÉQˆîêî@’ðGhªˆrrŽüŸB™” æ³ÎÞeΉ¢ 0]›Û‹Ϧ§dAQÀ©ðùy—‘Ì"5E Òë3Y!ßÒ+CïA¶¶ÙòºUâê¹uæŸåSw ŽCMrþ9-ë†Å̦‚P¦„'mg¶’UrAíûÁ}‰ùž¤í™>’¢À)ªLƦ)4œÑTBÃ]¯IBsŠœÄÇZ’¸k,³†¡ E'eYá[°úZR\6#N"‡þðÃDušR1ÕRœ¦ÇQ>ɉ‚fјMº[ëà.Ž˜ÓÔЫC¤,tŠ6~ IlücÈ]IË€Z¤ ©å”mRò€U3<ôþAh>àÁG [QR"\T œ%½Ð·ª¬ªZUÆ«*ëôC•‘ÆÀ‰ir0*>XYJz4¸ EÞ(”@GäqTÄýÜ·ãÆVD!LP„.;žáU'UL4À,Hž`Ç^%P>Ã¥e‰óN8(`D–7j‡yrÆyâ0Q´$ó‚v]Äy#ùaíÎŽWàÓÓ–!v=]!IÎéE ·ÿíœÒįæ ÔDÅÀb”A£ˆÜå©­]جµßdì7 %ñv*¤Ó«3(­b›¤IX¬žlO @è(+ƒã‘ñ]Ó@S3":Î`œ(9–×n›ÎÓá£.ø@³– Á˜´ðà褛ÒÀ‘ÙKq;¨€ÕS ¶¦ mò 7ŽÀ§%0r¸ Œ>hXÇábÂÌUecÈÐγ¤h=¦Œ@Ú¶i¦Èñ£Az$Ï&Mœe»ÕÊ[C’e1LŽZX ½˜Ñø#&fÍõ´8Ìš!¿fÇ÷ kåé-B¶À‚iqéc ¾aBæmÐ~c6˜‰²,Ì -Èõ@ÌÀÝä·ÒÜLõÇÀÏG[£!„/ØV jeXOÀäN¿ŠÇµ«p+¨›”%·úO0bË5ÑbD&2ü3HMpϋ͈Átˆßê /ÓÜ80l´s‚Z‚­QÔ„š‘-Žò£wŒWD±–p—"?ñà“ê¶ÆXMz5¶– ±ÖèÿYÖ#aë—UÌ;¹ª‹„[ÈC¡—W<…Mj[ÈB­lÄâ߉ßE„I؈¬TM6½‡ÇZlÜÖî [kgŒaË7ÚÞU: Ùœ¿m™ò+Áâ軎}8Qýˆî ‹öãÎÊDYİ èH ÂPJ¯„é#„ýÄç5X»öù‘åËÝW&çWÒz»µŸ¦E|æƒ)¿gu­#jVlFmm“YýÂŒ´‘¢Û×®5BšéG)fÚQÊoøÐÛix/6Ln1nqëÛ ýÎs¬òfd.‰•q©åFå0Ä*áh™Ñì°ce+ÜÊPÜ.|;ýèQ®©0p³ŒÕÔ³Qv(Oš8¤@ …'ýÆh„ÍÝ#þÖuå‘k4S†Ô‰[õ£[úãô6ÌÑãÄ<†Ÿ;NG$i;ðõgÄB,á`0?”‡¹„¼Þ ¸¼°—Œ]?áVÍ«ÙÉÚ¢Lü‰ ¨CY.¿±¬\ KY¬ÍtݪFìô¢N â…J)ÎíH¸TÄ<§rUË×¥p§"öT†Œ¿•'å×ˆ½ßãÛY÷û(Ô Ìj’•Œ½À[$‘¨_Þâ±òQaMãAOcŽ»-y¢`í¡/9A¼´UŽ>ëGaTQ»uâž³ âд¬L–à$mõè7&¿VXêô€„Oêa»%uç¿JUDoÒ¾Ž3@ŠîI-+i«/1ŸvVB†‰ºÉôá%Ž|Å„tŒÇKÅê'È Ý":Àõu‘^ùÛ–ÝãÅìaÍæ¦ºˆ…v›Y?.m«CH•ζÊJôêanâ1»É¬¼ºk›SÿYFá˜ãjSD½—ŒpRZ ÆUÝ„qúžä;öú™«'çŽÉíL'z‘c{xfɘL0VOódà(”ˆ:9Ò_5+jž„âa!lUµRŸåEÎÏ…•i´ Å^.‚HuÆœ”¨eÈGíÆÖç+s«u3•y$æ"TNæ^äæPæá¨/Þ2¯“ªd²ÏÒ–;‹:Ç@GbìÁZð®î«&aŸŠ¥Ô‰}©3qûdN,¥^Þ ˜˜}n&lª–y6ì`þRA‘Ë4 d,žÁÂjiCþ\ÈËB0µaa€ ¶ÆÀj‚­8Æ3Ÿ¦šÓ¦8‹˜ˆ¹€„ïÂ1„©ùÄMǦ™DiôÇ :‰°›„µD•’<¿5)9èOá)ãq;eæhÏÖ+ø{àŠþ U{ô†_Ê6Áú;Ù ÆDYu;×u5>ðòÿ#ÍrÿG–¯`“Nùý"Öþ¯0Âû?ØP°±ÿ£)f<“äãQ&’ ó+0q!ÂÆSɈåBGš¿F:¼i–ý?ǧ¦§1MÿãÍžîý_LcÿWMÒ➎®¦5L-ÞñöÿDEQÉãÔòåô…Ú{R5¡^º+#â]t¶•R¼­ (—¥&n{ñ+ûòó™“/ß5´eÁÐü3Þÿöÿ<÷عÜ<ø¹w»ªçöl_yÜ3/ðÌãûöýíKvìkßøý£ÜÌôЙ{Åo޼I¶GÛ5ùÿü—Û_øÙ7Þ¼dsxáU_ÿ™žïžÌ‚'}g`ÿ3îû“']ð§§Î}ðÊÁ£ïXüƒßîh»:ÿÇs-PK”'Â×­çƒßi[rûKÌ-âóg»kÞ{O¿ýí%â/¿ØüÈßï]ðqâš7Æó™yó»«ÇW>õõÞ¯¼ßÿÁÚõç=vÌéß¹ðP.û_mo¼·³}íÚož|þÚ5«¾¼ë‰ëÜ}ï÷~Ýý¥âM»ßüµ ûÿù .üÝ—¾õè~ªçׯ­>îÄ/ _ö÷ôŠ@÷ï?Ztù'‹¾Ù|ëÇm_2L}#3Ù=­ó®?â„¿ÚÈœ˜8>)g¯ß2u0rîJñЂŸœsQêÃïïž|è¥ìÏ®ÛqÖÚMW¸>ôÖèk×-ÿãMÇÕßuÅ“{¶>¸àÌ£#­Å›¯”Nþtó½«.Ž?ônÇYá©5[w¾ð¯zl;wힽ਩sþãå×ÃéÕhûÇÄ_ÜrͶm[šûžyëÞcw|þFše“[çK—n»kø‚‡ôÑk·±ÙË_êý0Ù»ùÕM¯œúaúO[ïùëKÿnüݧ§>Þ} rMêâ«_Û~å_]²ã Ÿð…ƒ[~8ogñßöHâ3{Ÿýožm».ú˜|êŽïd/ÿèåÿ>ö–Ÿß9´ðêÆ=Ks-é÷´?wÙY‡þý¹åÏó.]¿¥{"z“tW÷[§ý‹'6=oËõ'¾[û^öµUûß<ÿƒk¶å&^|sx׎Ç_ãÄ{~¸ú{™W?uëöóýËGï¼á7¯=ùîÞûùÕÊëOxöØ=§G–ü²ÿàó7µ,”ÙýûGïÿ‡½»þ8[Ýš}cp×ëŸzû„¯ÞÿÀG¿ýäç¿sÒ)ý¿ýIxM§úÐU±Ûo»ù´ØÖO}©í¾í§ì|êê;¶]}ÆÊžC­?ýlOê•ù×^8ôÊ Ÿ}ñªÀ‚›ß9å²§¿K¿¾¹¯g<ÚÛZxô­¸§çžÏmoZÉüäÒ;ß¿éì/Ý¿÷×üöýûN ˆûN˜wþ/Nþé™§Ü”ø@ºB\:ÍS.9{øGÛï†Zïp…û«÷­X"h€"Vwà ç4ŽÇé‹>í”'yåU½m¢{É»i(¥ÈûØaÜ3¬¿)™$=Šœ„9s? ½Ñë… êuN¨«Éš/ž¯*]ø­p†!7ÐévI’Õ|éU‹Ÿ¢¨Q@ç6lr‹»ˆð›Gô—3|õ“ÖôRƒï{ÁlUgC¡§r¢œ6P„]¤b.Á˜m èu=!¦­M/˜p$M¡ô×- ‰L4†´W ãU ý]bºªmèí®ì… ŠîÃ…±Àô—*È;&+Dº:/½1Ò„^›l"èSqgnÜÊ\Éå¬ ëC­efQÆ Æª²êƒ ð…¤ 4uöõ Õ#r^Õ¾tŠâ­LAV-3²ÔÒlêX 2€‡X¦Æœ‘Ìûeé{ƒ›Ü[ƒÊî ÆKt{ïÐlÐöh„›ñÎ0UšV7›RœP„y­²N€ GQ é0† tIŽdÂ"±D ,ÈÆÝ°`<)™hi¹X Œa<`‘ÒºLˆaK`x¾·ÁT}ZN^úÁûðfÜ^dMz*Þ6•’QHëÂݨ¿é¼G¸¥¯ÜúÉžÛÆvß±îÞü_6—B)2NsŠJ˰qÆ1Áÿ_ö®>ªbëKHèÅ‚"û @BIîÜ~Ei¡c( EŒ›ì¦@B)à'MÄ—P" %C íЀDé ½…G ½Ih ÂCé»w÷Þ»»w7»›e¾;?f³9sfÎÌ™ÿ93sŽ ÿ½ÌøŸ<þ£0JÍÿåÁb!sv`ãí6&<\§ODÐ?2α€²¢Œÿ (u\*P´Šÿ=R¼+þsè4Bÿ ÆPã?¨ñÔøjü5þƒÿAÿ ÆPã?¨ñÔøjü5þƒÿAÿð7Žÿ`ö9ÿâ ~øÿJü 1_ÅF!`Íô´R檸âDWR R0ÜtYyœ‘Ã9ÉxÖ&\•¿ÀHÙ;(›oKù»öÊ/æì=ÔFO$E„_pú¥6mVäU×ÁE;"œñ‚WÚB'’ ’¯EÉWS•ÿ²¹êÄ;m÷4çìKmÎ:ÑzaÖäQªY'ü¡ô ÏáI„K̸‹—˜QTtSYX²€ãï/Ž#Aþ' ÓEfä8(΢¿ odM;}ÑÙ1!?ÀtIc%j£ ³„ÍùUVäíÞ²´!R$‹ÃÙ àæÿæ€óêA¤Ã€•C·ÈÄD·)e% tÅ8j|`Õ8NB…EÊJª ÛŠ­ýË=Í)ÌN]§gX[Û X÷n0â¯8±ê Wß.Àim~•±À ±‰N™þ5Ò€0¬ @Q¥ Zônò€ƒ˜ =P€ãÈ?K–©R`¡Ú¦—ð‹¢E˺ã¼Jp†¸Ã v¡€½K‚ÁñsZpAº(J¤`Gõ¢“x/À ÆŽG‡;czº‚jœ9ò ü&gåY‹ãq]\nÊÙ«½C4/ŒR£Tñ»'@[U'î¯f¸ %à/ræð1p×ä o¢z@CM”-L˜ÜöàL’FÁ~0ÛPQwX'°b‚ë¢!IZÃ0Î넨 ÅØÔ ž Æîèö Ö„ÚÐG»ÃoškN€×›R˜—NkhRqu—$¸¶¾]D¬‹+îñ.Ì,4 Khû‡`š!€óo¡A˜ &‚”†A»)” ƃ ذSÐ’ãwFôÊÓ Ù2úOxi)v\p@TqM”–²ÃjƒC ]ÆY Á1絆6H0KÃ"<ÒðÇ;°ßSag9̨±÷‚Z†ß³ÍÔ’p±!gqI‰B J £ Üáî²ÏÄ2æ£+€‚sƒo‚ ¨ h~#& êBôÀÚX5Jý­›²uJPHÑY÷t"¬`{â• qG•I”P8ev&HçõÒ±VáÉBdoQ†þšÖ4ÎWM«Ú0 ¦eM‹«N)w4ç´!y7ž Eb’Œ{u‰,ò‘µ_s‹ßNc×­OLŽO–‡)è’‘AtT™[,ãÄë ±*ÎbÊŒ¾ÃðÃmÞ(MUÚÄ(‰bÝ2@CÂ3ßàü+[’“Û€?V Y³õ@*žb”}ǽJn÷8m#“,pˆQ¡¥„îŠÃßáí¦²ß¼Ä}cŽ`Ž~ƺ"gˆ;ŽÆÝ'½ØD·üщ4EäSÉÇÅÀ!_mË8AÜqlã®c1Ä%B‘&À*‰óË /t)H@ÞsŠÐ ' Hã™eÙî8GðxA .ÌðçùB¤ï„¬Ü±\ãA´^8–_/D]=e* –å!» ˜‡§€+¾G'é« ÔRF¥´ï? ø$+Êï?1!þM‡ zÿIÒ¤úþÓ…ÅI"œÁ°¨(X‰Ä˜(=Ë‘,BO¿lþÔR¶¥´ëß¡€O²bgýS CY¾ÿ&Ôõï‰âžøOë†$œÃªmy:ðÑfþóÉ÷y·&j·Olxö:]mgòyÞ7;3ž?½×wfäoSþ“ü¦vʬ×èÒ¬Qáùõ‹}¾{¶…ëw·hܸîyžØ¿ï¸¡±ý÷ιԷxð½›úõ«»÷~ïñüKcMxûÞÆ}³6zÿí-'Ä×xð”ªìûƇ÷GÅ®þì܉[Áô#ŸÞÝtÛ7 ¶<ÚsiÆáck¤ŽŒ™ó‚-?wÁ%s¦MY6-³ÿ:¿õ§©‡·ž„=Ð]ÔO⤫ÕB±çÓºéŠ&œÿ¥ñÜI 7fº0lnØýLQ€µ­ñ¢“ëVoè?uÇ™ignu¾:ç§±wÇç¶òÿù`|þ×_‘#{ÅUª;)ú`v­¦„|å³ð_×wÕ¬¯=’פmß’ƒSÖoîÙeÞ…×*'×Ê|?¬xðŒÇ™º3­z•;š;oÈâ÷kþøe¬6áûû“-ú Øý}iýjž©ñÓÈ)™ÿ­|¢K_KrÚ½Y®nÕ>å3o~üð·‘ï= ì­ôâäη¦^ þXÍö>jÚ®]—KG‡îxrGQqîꉓ—ŒÛ[Òäè ]Ñéš)—£° )¯ì9ÿÕñýú¶ë6œé<­C\TH=zJÞ±ÐÕ1Ñk ¦oÛxiz–_aѪE© .Ç~–Ô¸­vêßÞÿîòª£[¯Ç/\±#¡\Œ˃*ÜÉ^L½“EdçΩÝ`ͼN‡t Ø51 ävVv4úY_«RÇ¢YY•‚•€ÞƒªkÔª@7L¯»mdûÔÓ‡~}ǯ^猎w²ÆÕO)(¬{?¸zû§¡mgtñûD÷įÒ÷ñ {mœª;Ý({é¯ÔþeÉŸ¿×ªÑMÿ1ìJI·šóµïÛ©¶ÏljÅU“g·lXq¾v[TÃ_⇭RXòýtná««vÖ¿Q=ç9·«UHxÇÛn]ºñaï'ÌæY»>ö/¢–Ïxl~‹èUÛ|ôŸkkúíZøgßC+x‘þzVákUÇÜ[Wt#ÞîW> |­mx«™£[ž*?|ÈÖ¨;[<¾ƒíõ-X?å•1ÕûÞR+íᮺU»ê÷ò¶ª~^ØñûÜͼÌN2‡ÇŽOûomÿÍ;W®Ô°Êr¿¼JxÃäÜÆA•¯ÿ6¯I¯ ·¼û³6==>äbÓ3Yi-Ñ_mvó'¦ZÞç [sjΪ³þÙqwoÝÚ=îl~þ ;nx›Íõë~3¸|Îì ›êüêß3ôãcÉ«×/º6y{tq£¢ü‡6£Vq ^ЍUÆKùî‰ZE‰£VÑV£VùC[ƒZC”`h ·ÀVaðRîLŠ‘­ì\@/MT+KFHÖp=žB.WdÄîUW»¬%V‡a4üÅ0F‘‡.ÙÙeWà4«!IFðŠÌ8x»Ç.;„âØ ;ŸüÙ ¹qðÖ€]nä*BÆ ÃŸW Xÿ€ rü8Ò.O"lc%<­ñöðl,ÎÙ Ïfø‘'ó1JáÙPÃOL¡Îp³ ‰†³–!Ñ0Æâ{Ö³h6X†Sãp‹vQù÷Уùgm>ŽÁ,ÂÇ–´üg¥]äa•† W ÇØ ·õû Ï»VãÍã½jÑDóÖ–ŸÈBÀá4Æš]{2ûx‰ñßøøßCâ¿Qjü7O™üI¯‘?­ÊßE&ÊkäϨò÷D‘ÉŸöùè#Uþ(2ù3^# ÊßE&Ökä«ò÷D‘ÉŸóùªü=Q¤ò×cÞ!ˆÿTù{¤Èä¼Fþ¤*O™ü_füÕÿóŠLþÞãÿSý?)2ù{ÿOõÿx¤Hå¯Õz‡ü ŒRý?)²õï%þ_Õÿç©"[ÿÞ"Jõÿy¤ÈÖ¿÷øÿUù{¤ÈÖ¤·ÈŸRý¿)²õï=ç?ªü=Rdë_ç-ò§Tÿ¯GŠlý{ÏùŸ*™ü½çüOõÿ{¤Èô¿Þ[äO©ò÷H‘É?Êk䯞ÿx¤Håõ2Ïÿ ï ÒàÿWñ¿GŠ…ü#ã´II‘ýbFéµ:ôæ;F?*69<œÏãTöo{ï¿IŒfp©üq@5ÿ·GŠwåÿF‰yŽPó«ù¿Õüßjþo5ÿ·šÿ[Íÿ­æÿVó«ù¿Õüßjþo5ÿ·šÿ[Íÿ­æÿVóÿó›}@ŽåÿF¶8C±ÿ+ù¿áèPæÊ(49eΡŒª eJ„ÈHjNäwGc qº9ZÃæ<‹F¯3ŸÄ#5´eö¥Di"ž‚óŒªF¶”’’73ÓDÏ™2ò#ä8‘¦}³Ç ¢ €„& ¾f¢e:išã$d’Ð<µNǘîE`Ï6çȨќDÒ¨êÐ¨Ñæþ-5F!A±‡’¢šRÝÙ©á3ô‡¸Ó4SV”)JDy¼mÒ í}Ñ´n© CÁ—,ˆÓŒt?·J"z¡´ ÇŠ$”H±¸º'…¦Œ5°=óØŠ Yfþ±=#i'N|…F¬$S·F•âÄ‚ëªO¶!9&6ëÒ‰bÅŠŽ‰¾@P:&Vi0â…ßyŒHd&®Ð 0gg²)2Š/~Yé¢ý(¢Ôb(KŽ2•‘Œ yÅ"ƒtQ:Éé"šJ]jè‚æÒP27úe¬I*N$.uµ!M ( Iùf"l'Ê:ÊöÞbu7€ÜQ¤¸éÀ^@BIC4¯5­±@J㯠Јœ6[$$-Ž´ÈjHXnVUMé‡ÈÊZ„å\Ó ¥Èºèb2¸-S¤i2BmD¨% É|ZbÒ?™š€eÞéX\ Qt!•2!Înˆ±¼KGP¸_ ÒŒA õÒ‹O‰C§ÝÈ>Ê0w<¤‘„™XQ|Քݜâû) møeQÕ ½äžæ”´§fÞ5mŒ.\)¦õþaÄ@Ò|ÊI «ˆ–}Ñø¡SFê"ÉÑâñ 9G¬”ù˜dÅà.>\÷v3Aqœ•mð[’Bƒb"¨Jë^B¥fiwmùˆ˜ÈõÖZz¬sô Ê"§[k‘Ô>›>RDÊNû†E~ª„ e0 tJJ€©«¶Z–úd„§RmŒ²M±ó ‘¬í!•ذ™î#´5$3í—ÓpD'--àÚäÈ]B´§¼å†Þiá tîc²F]Fe4Wñ•»¡1…‚£÷s4gÕ†ÕcX|@PVÔž²õ‹–ŒªÚ7Tp 6KJÔѺdhN¹ÉÎå©·™£¶…„Ñ!aŽœa æGذք9è>sÍÁi¹ðŒ²¶ì^oc”æl™—69u;t]JrT’¯leZ§AŠÑ_o½5ð³M„ÏDþù±>T7Ê*;2ÔbŽ&^MMX¶#¹)à¬]ÍSÂdÆ _”ÏöuTh¸ü{¶¸ádV"32›Àḭ́â ÁŸâØ_¥²Ó—f5C¼D´Ž %\—0P*¨î’Í÷¥sÊE`ŽÀ’˜ãrƒsüF½#-Â_®s®h“ñÞÃø˜~b¸ÝÞϘïÓðÈÁp7EM0}l š%óï“wº¡”.þG¼Î™˜,Êñ?ø †ø?4‰Ñ8âÿ]ÿQöEË1„NK°Ú¨(ŒÕs„.‚ÓR´>’Ô‚(†å^6j)ÛRºõÍy'Ú°³þi¨ÉåñpÿI]ÿe_šöéÔ¥5$|šî½=#×G”#ýÃ;9t 4¨KlŠzÔÍ•Np“Öéù¤Òp–ÄûŒYX<¨gÂ[L­­w¿ÓdeNÒvmË3Ó…ßÉnŒé¥j÷\HþÞtÛblë W¶ê¾ ùGÌî kD±3¡mè_鋱Ž÷JÆŸÚt%Ÿ)¬9ùÓã}»ŒðÚ7wvNÞ²Ù‰-~Ù½ì§o4môËóž®Ü¸M¹s1míg·ÓýµîâW 0Ý´šrŽnõ›Ölpµgëok}òZhà€¦‘™·B/~ݳàtû’ò[ç.}6îAð½±ý7ãÁל©ÿÁ㇭«µM94¸Îá óŽ´çæN L½tqûïŸ%‹._¢{Yð¤ñ¹b²Ï£e«^ûìÜ’®–[´>xè¼ów-©”ߥbPÈgËæöY=7|Îú·&°{2OùŽýccúðßn48¶õ›œó^ܸÚ¹CZÑMOwŒß6ç_>÷ñ/&oÈx·åã+þ<¿énÈÊ^ÙË<Ñ&jdÞ¯úæÜmÏI®jXƒ bm }Óéû›¬ùgîšnÏ*–Û‘3>=<=§n7o4ƒ¿ >ü±Üë«o¸OD\oþeZ‹šü›×Rž¬ª¿¡Êêž—2ê¬ß±";t_þõ7òêEfïœ:«E¿•!ûoU¬ýv½i:–tÎXðu×f4é9{ÿk—Ø~Í2=Ë_²uÑÌý§ôÚå7¼É¿Ÿ©]’ÂDÍûcÿ/µ·´ žúØ¿sÿµ›Ÿ¯ó >{ó=y°ÚÉ‘«v3(¢wà öŹŸÿ»¾ˆ-¨ZØ.deÅK+ —<ýho%º-þmÁð¹Yã ?º“øW•1úÇRU–Ÿ…Uš¿š=¿öÀÄ5…µÖK‰Ù˜ï»¶°yDBeýW!M&öȪ?$õô_OªŒíŸQeÏýÿœÝ4ìÊ¡§ï¤ß=¶»ž[±vËÅ.) C^?q"|Ù¸Ïè¦3E7ß~åÓ©¾o¾^÷Ä{—æË˜üɹscf¬Y}.úùÆ;lýxoî“íQщþÛÆÎ ¸ºyQÇã‹ÛL¾=±SHÑö ç§ûwp=ÿ‚ƒç›_ž=´xÛðcšŽ¹B±qÛG×H9<æÛc÷Šn&ö¾™4|ÎôÔ’ãp´LþöžHŽâº8;7PVÅ•¤(>qc#ëd[7ÿÏ ål }¸BBâ|ˆËÜîÜÝÀÞÎ2;{ºã|¤¨8›Ø¡’`À†HbG.1Äe™@H¹La>6IÅæSe ƒó©2ò^÷üw÷´·{;™ªL—t»ý™~¯ûõ{ýÞëÞy[w>ðæ#/_|Ý'žíÄ<ñ{g=|Þ½oÿÃ߸íJî[Ç^9òÌÖ|èOüŸ½ÿððÌwN:ùðo-žk>røöÑÏüêÐsÞ7îž»òÁã_ºMyûÀ£?¿êÊkO±7ýóß<ºë†iiôÊW¾8vêwžòÁëö}ñ2ùÓ·¹Ò¥Ë_9ôÖ©¿ÿÎõ£ç_ÿý×>7·û îå7_°Oüéwvýížï>f<óüÞ¥œ¶û7¯Þpõ'w.~ùÙçòÂ÷NpýÅ¿<þgï{í¯å;/^{çWî}å­)üé“ú®¿ûù[¾ù­oèW½0byì‘/ÿàšo¼ßýã»_½6÷Xó{÷M=üêSkßúèŸnUŽ{öù¯üåÄ­?úÌGÖÿøÔû¯yï£7ý×ÏÜ^[úî‘÷4¿ëŒþ⪿ìÛOÜõöÓ/ÞpÝ®»–>tÁ{Ï,Onž{`ì˜÷Í_@>wò;Ÿÿ­_çþG~ãŒÍ?>|ìW·]ûG’ƒÏ}fã­÷5fÏ"¥»OþÚ×ùïó~±æWŸþÞ›`ˆøb¾áV¡ù[†¨ŠzP¦DÛȹ u‹G3†ßeUls‹3OèOùýŸíîçø½ô7·D€Vô=2î8PìŸÙ7 “=®SÞgyã<ìV„?ך÷à¹móÞzÜHDÿ‘íø¶ Q¡ØžøÍµšã5ÆK´@؇È>$üØÏŸàKæˆ<åA‡@èDƒðgÙ•ç”ý_òƒPcŠÉÑCÓ3«ÎtÐ…œ¥§f+ÇŸ½gGGý†¥TC:>Î?òé}Ü|è*ÌNpØã¿6ß ·wì(¿Äâø}Ø 'Ï?Í¡‡9!t;£@íf0Ééï ôe±èö—GÅH\#YÇ›ë:‘¥å'¥››žGEEZvrJ*žeËr‰H†¼,2]º›hó{uºÈöÆÖhŒE÷œ‘¬5¢Ê-fÃB¾Š~ïÎÆ†ed,£çc¬[i–-wxÛ¾=dÇŒÓðe×®{ÄUuøÚNm+¬÷á­%AEÒDE6T êw9•NUþ«*‡Óoª¼hÙWU¢#ŒßÜÄ_Ä^Wy{_åz|Q™Wµ†w¬gqÞµ¦8ˆ*½¬=,«dŠøe¢,ZS Ê$Mi) Qo)Ó$)]¥jk;¡¥X’”¸ªÑ¦ÖÒŸ$”ZË$El)“ ¡F+Î^äË<ßE•ñU:øfȽЉJ_|Ø”C$&µÇ¶’ñáÛxÍÇï¸mÍá[ÏÿpÙºçQw}kÉ~Žš¦ëQ¢H†b¬ª+ìÿeJÙÿù‰ÿ[¼ÿ;“”¢~âÿñ_3I)úç'þoÿ5“”¢Nâÿñ?³JIúOæ'þoÿ1“”âÿüÄÿ-èŸIJÑ??ñ_‹ø/™¤”üÏOüç‚þ™¤ýóÿ·ˆÿ˜IJÉÿüÄÿ-èŸIJñ~âÿñ3I)þÏOüß‚þ™¤ýóÿ·ðÿg’Rò??ñ úg’RôÏOüßâü'“”¤9?þßÂþÏ$¥èŸÿOaÿe’RôÏÿ§Ðÿ3I)úçÇþ/ô¿LRŠþùÑÿ ý/“”¢~ôÿâþO&)IÿJ~ôÿBÿË$¥èŸý¿Ðÿ2I)úçGÿ/ô¿LRŠþùÑÿ ý/“”¢~ôÿBÿË$¥èŸý_+îg’’ô·ò£ÿú_&)Eÿüèÿ…þ—IJÑ??ú¡ÿe’RôÏþ_虤ýs£ÿú_6)EÿüèÿÅï¿2I©ûŸùÑÿ ý/“”¢~ôÿBÿË$¥èŸý¿Ðÿ2I)úçFÿ/ô¿lRŠþùÑÿ ý/“”¢~ôÿâþw&)Fÿüö ÓÊé/ÉRáÿÏ$%è_„|𿤠…þ—IJÑ?7ï ý/“”¢nÞÿ(ú_&)EÿܼÿQ,ô¿LRŠþ9yÿ#п¸ÿIJÑ?'ïÿúú&)EÿÿË÷ÿÑø_Šàëÿ…ÿ?“ÔBÿšu`b¢aÏNLTìY{‚Æ×ž0Êõ:ƒ+WG¬úŠg Ü1þ›(Ȳ¨%é/‰šXÄË$­=uϾ ›+ΤµA¸µký I:ªÆ²A5ÖÓÛñ)PƒÅÓÀH¦Oc#Ù…2†ÅV«`û-N³V±kÓ[œùDÆ«D—JD×K,êÎì,†æá0š+¶Ç8®{\§êLsüVÇÛŠÁ]8‹òZ±¦¸ E|åø†å5ë;MÏ®‰d‘›5ÝK9~[­ì Ôó­2 “HªFL×5h$U+pÜØ¾³YAà!•L[PèYîœY%õføã’]p„Tšu" á7o s"äÌrӳ Jʶ[nÎNU­ù°XâŠm¹VÃn„…N»8+A‰ %. d(ðìj%j¢þŒ²U±«U3(m 4€¶ü¶V4Dèn[ ÐØ–@£|Œ%ûƒaµékéÆ:–èO†’óÒÍ`™ð&€èùÔÂ&Ðý´åΚµÊd5|PÑš‰­ÙŠ`Í4X€˜Ñ“0v3«h™q(€D95á* `%PP«&ÜJ£ P+Ö!o'û4í6ý2vK0N;ÑŸ*e×1½°0®%’¨9 ˜ôã´ÂÔ' Sƒñ:I˜0'A,œFÕlÌ„%ðT3IsÀ¢Ù STši˜:Œ¡™€©Ì…d0A Áƒ„pÜZŒ¥N  ¡€ˆ¤—ƒý£fyØlzc ûÄÿSv­2…QÉ0Se5cA©ƒæ‹Ð7´´æ ¿}l+©YPòˆ,-’ºS§ÿ—ˆ=eUVøÌ™r\³Z BÑ––bT²ù©Üt1ÈÅCUC]³En‰6ä1WcÃ^¸‡ÄÆ«ó̪]îP¹Å©V–©êðl\ªs͆³'«öeMk™ma'«;ur†ÓtúÊ;êÛ‚ŽWvè \µL×sèÞ´D&mF.Øî‚ xIÝuʰŸˆwq|ÙqÜÊ$߆)sÖ®.ý(ðÇlV½£´¢=Ñ¥ÚÚg¸Š Ò(›U‹­hD“«Ííâí&]jâˆÀºT'h[`Š!\ü"±æË¸øçHú!VOцô©ä\À¤-T­ôŠAÜ7Æ÷ÃðDd‰5å±À¢-J$e¶Y¥\ØñQÇóØ£b»Gµ6…º²ks Dù)ýdÑ2OÙ‹ð,f|KéŒs€,"ŸÇËã}Nâ[$R"€}*B£ˆ6km‹]Ô½ZJ+¶9íÔÌj#Y˜qœK(p¼‡2¦ z˜K8¾æT,ö}ëf“,ïתLµ ]×GkTsê~“@,Âÿ8¦<•«uP5ÉâÐZb“KÍ5¸!ž}‰­6þ’xÆŽg€JôøÀ±Ò2ÿq‘L{¸¦‡¦©Z:44q M%)bP¿Yƒ¹á‹†×Jcû$å¹ËÔ/¿$U~ÑzV€`O‚°pHpe3 0 ¹ÇÁ Eœ µP³âšÈáé,ª9iUa÷!“¾>_æÃZÏ ¶ ˜jCþù5`2TÛZ–¢Y¹„`!Ì­‹Í&VŲ¬}TÌ$+‚ ¢Ý0°*$8ö…ü(7œ_:/CCq©ÀÓ9 §p)X&Î|ݵgé`óeÐAú/øŸó Z·€¡#¸ÌŽ*| AJÀõøB‡È OÒ,*`\=hT®: ùqî|<—¨Š×Ìš0góÝXÖ/,ÜÐ`üŠËùV¿¯íC³#˜¶Ól‰È‰øuÖe½jÈ=°Ï\ç€Ol‘A J™€Q 9kÂÝhº©W¦P9#°¡ƒò? jÛ÷ìÛ@mþºky8_Ž7Cðf@ŸÚj7<Üt]Žž>•ݵ–È"º’¨Vó15°õÑôBßGgݦM똴dÝèè:Ò0§,âÔ²Óš .îsvÕ¤ªY›nûUiE›$*–Å„TóÍ—»áM›ÖÃŽT#Ããì3@,Õlt´C3JeF@F2æÚˆ!yýïI†ÿ"68èšG#Än${#‹zÛ1˜ÏH+)D“=ée¡ű.#iÇä[¨$Ð|X‹搢„A€ªØßˆÏ8KHÜd –·vh7p±Èð£K,²õ˜–èZ¤CÆo6ªóG8ªz¨Zˆ’B³þ¾B³¥0+Ä3ÑŽƒˆ,‹ÆêbÊnÛé0 7=è|½Îèt¦>gt9”ëõõܸ:¢J„þÑGü/êˆòˆ¨dÔ ,¢_¢r¿Ò0߄أû¹yª& =j ‰ŒOX©[ #ºRê@ØN³-°î%)˜‰ºC¥`NiV ³´q”]†¸iTVÜ2^n1‹%òy@þ†W±‘JpJ݈Z-ò®©%’ £¤3Ù¨- XjšŽ“„!œG¹DÂÍ6š*­œ\ É@H@M3àt%œ:ØÇX½†S©Q—è E&OÃúeæŒá$&l¼îP¤0”E¤—‘k%£ãjXÿþPJ*yŒ%ÃÛÇ]†µ‡YYšÕ¢,6޲=0Öê€ë‘±ÐÑ«©rœ±ªödGÎZöjO¼°—`$Ø Q*IÀu*|ªD„u¦–J{Ádj”+0TQ¤ì§‰zX/Á2Õ NRKôS šª”ý #¤9RUˆLk; ëõß-û)ƒe?èá^bÙ ‰ÚxIÕ û­¸žÙÖ¦¨ÆØ)ö“Gd-­¤ôÁ~í‰×û•½°X£ìg?I’aBKD*áPXš0…0–Á²Â(EËß .ÌÊ}±WOýwË^ê`ÕF#r5J°²„H‡ƒe)ìÐNêÆè¬0ö¨gUL¡,×­Š"° e%úgUX©=¡VÈJ‘É$ :Qtƒ€v$Šå$˜˜¸š¢BÔE¼Q!B;qð:¢Sá RŠ8ƒô«®¬ënyG$ï¨ ËbôR59nâÒldÕÒÆ]ÙÓ8huÀõÈG*X q‹{:Ò WUlO°•hƒbb;‚­†nG év,¦ 1.«÷w‘Êl`%Ü¥˜¶ˆÚ¡¬²rHó°µ…Ûð¨†KF½Ü —k4=Òñz‚f€¤T‡1)¨}Æê0Q÷RT‘nƒŠÚjÄÈ |W  ”ð6ÕÊè Fh°e2$­Õõ>¸½Çþ»ey'ü^ æaÈ%Òk:0ÞÙÏÂoqÜŠåB-=`e›Ëè"$›6~_sÒ[¨[„?oïû3|ZEæ+¦¿ÜèÌšvm˜™ñf«ëÉè(ö>ºÓ®]Êñ›wïü¿½ºôÂeí$Ø4…fƒ³ZdOcc­;ïÎ Á-³8Eä%òà„<:¯‘`éÎwGÿ„E«"‡ôÕÝËÑã¡ €°0E§Ðì† 2 //(P2‰!ÕT‘Þ±êc×î­ÿ®:JŒ‘eôêƒx1R¼g6.Ów”§î(gÆÄþ üù±èáüø# lhYê΋4(PˬH¼ Éï„ó}¥œ›ôº÷ãEêÛŽEÅ!ư¸ iLaP5t'fjÜv­‚j+´ƒMU–£z`pÔudõt±óòª*lö¨pÀ§Î %æfUPþ¦àåPT<äXÿxqY‚±JÝá²$‘RÔ½ŸM~ ÔÆ†y*…ž \TF´ÄÀ6^FóLç]‹5&ffÒ  Õè]̨ôU(í ‘•°ñ‡âÏê¼rhGaN sØRíÎg6(PˬH¥¤c,sÒ×—Ä9Ú9_O¢¨_?®¾¸$}I$Ç$‘“D0§ŠìK …Iš˜/€J˜’/aJL¢(zJÒ`ÿ*zë *ip/ïW‡rCZbì.ŽQ¢.'ªT"•8Å‘Üt •¾Ô‰ÊI0`·”`P˜_#Õ£]øòªX¶¹Ñ[ÿ]ËÄ0ž7Šý ‰"÷qlñQŽÉ†Uk8n>dF0È@;+É4hg˜Žpicyy_Ùò2cuÀõjM“(Rë 2£ÇІ<ùBMCëËÞú=0–T!¡ZP›J{¼d&¡}¡G"@Òuªr°Oð¸ûª :¨ïÔn1âõÿËÞ•ÇSµ}q *T*¢÷¨n†%÷ÜéÜ+¥" …2Ê\f¢zòÐ ¢ =’ʘR$I)O%ñ^†h4…/25‰÷»{î=ê÷zÜë¾ßïw>étœÛÞ÷œµ×w¯½Öw­=à<`0˜†ß€ó€È¾OfNÊü*Äü7ãHµ< ƒ>Ȭ™" °oÀ ÙÃö‡ A4¼éÞ'èÄë˜æÇ„(XÒ‘o!h›ëNf÷;ì-ÿAîÛÀ3 ¾? ^¾¿'e!:É ÿmTºûd‘¿@ö |ag¨° |Ö ñ~ ×F ·4ü¯ciÌ)šÂ|[$ˆ©1goùtÞz8H €<쬬1H$`P¡Ns޶?lD@‡ðÒÈ0ºD#’a`€cD`(X¢T"˜;:º9ZØ€’­ÿ'–ÉÀ“²Èd”!a5pIÁÑÉÈÅûËdTºãÐ2¡€9”ü­e‚ Gt”oþ"Rþ,po·pK’'QhC–6ÀÿÉü ’ðœWÀ3DPó€ä‚³î3p©tĸ4ÂEá² ¸ùo8­˜+IîÍ[2èƒ5Àà"³'"x—›È!‡í…CPpA>/r9F!”‰B$ Ù8‚õ»“ó¨²Ú¸Á ì9YËì’µ\Ážž C.9 ÑèŽc ¢Aþø×ÄɈ<®c¾ãV!/¥qÊŽc£סP u(êPÕ¡1ÔÁ¡ XA.Cp5D¤âP‡©c Cø>ƒ+(H'b¿'  ý>-Ä´@ægAÊ/8ó•è°Oj`]²P\rjå°ýasö‘¯8ûóÌ`Àš9ÜDxG¯‡¹«ÅNËÿ7ïàc²P‚/Y(=< %Pü%G 4Ýq J€®þmvà DF€I´¥Œ¡vñ¿›K\™ëÈÐ×feHHLÀB0( J‘׌AÚEð ¦ Hä¡€ î aq€D& Ì/MAÀ™)óø„^qþAE/aç»ßIQáYûÃ$Ò2(Ø(×ÌVÉ\¸oˆ –VÛñáh·ÑÍVäÆŒ=â :|g;Pà%Î&ß›ówþãÑèŽcÿ1ȽùÖÓ¤1Òp4+Q™[:™Û¢tc ‡9Ô¡˜C0‚èFŠ7‚@È3‚`*#KCÀ/Í:êAöp¬€„'ÞºŒAì\ Ö%kN—\¥qÖþÈSF…øNB|ãßHü"ø#•À@à(–0s=ÎsV‘€# €ìOÖ[„ÝsGIyãÃ')VUŒ€ÃJ$äQ€0¨,ÝÛD¶¶R!)–ƒ0ÔÁª"(û>p«j´„Ø *PK@Q@ìA â:Kñ˜J˜µT’Ìûd Lã­â¡pÖ¢ì ª 7ÁfÛ>ýdÔ¸HƒT J"Ð f4ø ‹‚Ë}+0büp¦€²òváÇüŠd{aºÆ93ÉéÃÍ£ö‡Ï -Å‚S®r ‚ÅáŒÎCɼDÀ>ØkO8°qÕcÈX„œÅá¨ýáÇGGä@ÈdH0÷ž)0îǶ.@‚É ¡c33&ðm±³Ã3 YïP)¸q˜pØþð£F£'+P ”Á–B€»:I°/‚ã[‚Œzd2“€L™2P¯-A"ƒ_øöðï’ G ·²qûÃw¨š¬€w˜=¨¨L0†” —˜ˆÉ ÇËklK2ŒÂCãç²ÂªLüÕ¸G¹–Gí¿Pãè¹FP·À¢@é[p¢b‚Â…Ý¡Rëùêð#¸J)p‹P}HÅü&x+œ€Žˆ`; x\¾¦ù³ YP/X†+¿gí\Ð\—8ƒ’f¯Î˜& öÊ€$Š_š!&˜‚HçBÁ¶<ŽE‚?ð¡Bvy0&¹*†ÃIãÃ/e8z†!‘€ó¯71 ’O©X½êÐÕVe'å_ÀN¸Q+YÊ¡±Ã€ÂD¥cQ<ìŒíÍÁŽâ!pOà Bý¶¤ VA'“ð›sðzï:,£„/9„àö¦—Üí}ÃQû#—%×”y(K–«— (,8ÿs•ßÙqv_Tm´*¿¸ý‘Ë‚ë’E°ê Ê4 '¨àÍ” Ü1€ÓضðHQà΀5l 2Žq„Lc`ØÈœË  àmP¢@++VC…nVÞÆhPècÅP(Cc(è¬æ&FÃQû+ë­ƒ÷dÝÁvüÔw6·{§b¿bû…2/Ø¿¿s¿d¶$Èþ¿k´Õùþ=FxX:Y(€½O=@j ‘öE-ví,o û¥–Ô‘öAdÌñÎJ%Âk»Æ ‘AÈLå¡"4™HB¨D2È‹þúpsq5w&øv89Y{}÷sVÎ.ÿÄúgæ{7G™ºMÜnͰ ‘·›S¬HÛÉd”iÊ[˜3ò¿þ~ÿ¼=F¬ÿ»,­GÚÇ÷õa.IPÿ©d"…BÄô¥ý«ÿÿÄ!«£ª&,% ÊþrFJ œ¶Û *))haû¤ƒ}Þ6*¨ÙØ»Z9ÔÀXQeZ –V+V€¹ÞÊÜAÐ3&ËXÓI²pz^{úé+kCìöVí—´#6>@+ü ߯°·tµ~ßϽ©ÞÞ’.ËýMßw?*ÙdèÛóGÕCu‹ v·¿­¨×®mn(Ü&³¼¿³Ã,$nj•¤…ã¶*~×Äßjg·!½{rûBÞçßjÿóºÆ‡ NÙ†}“Ç~©PÎÖ.T¾å¤¼™Ø‘wSÇqŽÝMFÞ>Å/]-]‹Lª³¶/ðèQéím}£h⫘p>©ÂíU‰vÒÓñ|;Uz¿ôº:LQG%«_v¤/ØÛßÓßx놲ǥ¬Ý'cÑÂPëb2ÊéìhâÓ4Ýó:öÐ…ê¸Æl·²«Žé 9ZæyòM÷fIl46¹‘’ugWÕÉp«åÝ­6ë_Ý{dëàätö¥æ˜ÞüÈ“RO=.¿I¥‰š*&§9Ç;3'XP­¨¥ÓQ˜&{Dóþo+Ôø‹?LýP{³ßîv¨ŽzÿüÍÏÏq«18ÒŽê./éx´V"7¾ãÅ£ ƒÝç…ßêÆ„4Em÷\³;$üe€à¾é«õã¯m^®¥`þ(oɹÈ#ñ‚—k,‰‡ ´êßMÈ®öõ>³2¬ì˜ð¬»WÖßÕ0Í¢[/Ôj¾™ì)T¹ñn¼ßî´Gö†ÏTzõc~9W.4óOçëï»»ôæÞº ;!p÷þ{ô_r艹ºôªivOý¦Œàû{Ò$tžœC6ª(jË!fõºÍ:Á§v–DhxååËÎyÚ¼®K·`âê‰'åI.y¨ÚÒbÌ(Õ2eTÌΑ{êQzª³»sœXÜäóëCŸeܰxƒn£j\aI߫ŢB=ªu>o'd}.3sM»Ú§€ K[Á Ù²˜½1cß,ÙçäøjÚztnAÉD9Mµã3n\Ÿ´øt€mÝá0ñÀuz])·W“&ÚݘybÁÚç^G6JxÝP´RÔNH*ß{§`ñ¡§eÅ}û šâgôÎN!„œ¸6飈Ñšh¼KÀîð]Ç‚àתt E?\s)óg[›šßį”ò‰¸<æôÑŸÝü<Ä£v§ªû'ty´²ÕJÎ놔.›û©>ð„eKÚïer¦èú—ý3ŸLjždOòäû½ÀP)…ØQ9YÑ9¦ò5ª#/½hìsŸEv¶Æ¹¾?•ßP(œ1?6Ŭ=±ŒÜç6»Û¾ÿçþSÇV6D6k:î<ønCõ¢;wJTÊ}&gL”X)Pœp6H^/ßw'å×[z5ÇÚfWiÙÝí¿'Q/¡‡ú ™¸ŒéÓ¥]“T6~xÙÔ÷;ѧNèÖ3ÛîBO=›Z“ê"è!3¥æùÌ/ºvÚâ£Æ„O.2B2ü+Ç×Çk“=¾©}Ûþ‹ÅÅÞ×ê·ç?ðÛ­—B+—¥ ÷$n:Hö®˜)’K›êFó"ÏŸû¹Qb×ëk."m¿Žõ¸,Ø6-muT©Ø²‹2¦Ó(•볤6þpñcÿ}ÿËr_K…RÇ>Ò˜$Ïçu_õ%í±ÌþÅñaã*”£ ÆÊz‰­ÏxØ¿Š¸%gߺ%EõöÚõÂ>eïL âÖ½Wžcó8kŠ‹–áŸËŽl1K|xsÑÁxe9?±Ú´ZKÑ.‰0¾„ˆÄžsÝòŒ1N>M‹œUxCß©ÄTê…(qŠ™ÆXÑÍû<í²®w%¯ù’ªïµÎëñyºm¾åŽ,³hÃ#éz7ë¦=QS™¯«v…æêMtºê^ÓšNQªéI]’ZøI·‡ž™¼5Áèöòüñ’o«6äÎ}c\•z´§úâïJÕµó~6è{õ¼k—îÑË·Óª9¥G (ã ÞiÍû§–¿ŸU'îàúHJBD5<\Tò €YÁV¼&²¶¬åù©©w¤¥[,öeŠ8Æ{WEMº­ü\Îi§VšÒ•t¤þdîc»ÆëÛškì^eÏÙ´0@<—rÙ(jŽ_¬zyÎþÇ­RLÜ1íôX­‡6ÉR¢¿VuoNÎüÑ{_§nsÇÙí'›S"܉…"Þº1?·e{óIêµuqÒÕfç>;ȯÿéØÑÎòíOe™˜åüTyºXKËæ¸/J]×^E¨÷~EWd$$\‹_-›e‘,²ÎèUìçˆä™-Rwü<µë—÷+£›EÝõðøa^©Éƒš3Í[ÃyÝúèèá ˆn0Œ¹nx¨¶ù‰Ü'u½‚L›U«"“ Œso¯–ï3=–1ckí’¦{^© òË*>y!®×5.i¦,cZcZTk’óùaQ´açýU}×2 º:Îl2ÊHž-/`­¸½"ù@Š»šqòl©ÅZu æi|QË’N)qJfùšÎ×^Ü+R™Qš¶dciašÑ¶›·ŠûNŠm¨n syu PhŇ¼K b[dÖD”o!?w,â­¬z\L 5ðFìü‹Ò©÷–JLºâøÚH?D³£Û íñœ¢*DKå4ù†¤)šw‰L“K8p=þ¤¨­š„n‚ –56gí„*Ë·„®ÓyÖ´·­qÉ&¥6îÑ÷ÿèž~#w—°ˆŽë!ãYÊJ.ÂÅÏ=Š?ß©?|åqVÊÕÜØË%ïK½÷+ï>(+~äÇõýÆÄ:9·yÏ5÷Îy>fœqò©¬d¿*-±è‚C­›eŸ4,[u6õú ŸPÓzÿèZ1Ãì‚lŸ“ay»™¿1YZµû¾´÷Ú3z©íõi9Õñ4Ü{%Q©ú%¥Sê"dœ¤Ìdâ¯J†J—©Ë) hi?mW]1t¥Ýä©ašÐü(Î箋hâïzË ¦-K³9óh<ÕÏwÖ¥‰"*ÒoÏ S5WxÏ:©Òô¬Þ+0Ï ß u.ŸÌ0_=uÙ›ÕGg6n¾ !ƒdå¨ÂeÆ®"g¹6Þ?ØX:ö슭R™{WG„ ò_ šÎ:—)Öø"¡i§DFj^}Š]® 5}Ãì-Í)[i¥O«¬”=§l±ßzâÚÄ›"[‚ÝÛ©å—û­Î\'Z™Òcé« ÓWO,ÍXg9®èò“Ì•Ò)㦣¶üŠæ+#¶ „ÕÌ»BäZê§moäÒ˜¥wÑ·;ø‚³cŸô‹ý1%…Š­qñFWMÖžE9Ul«qÃ{ß6&a.{~rQŽy°s»Òó°Oóì–ywÎXns:Ië(óÏ‚ó ù^̱]ó8ÔúXâ„£uQ7wUìñö?ùv­nJ¸¯htûy‰d5'¥#5ô»¿Ö\ûm•Wº‘-à¼^|éãToö(Þ%\¡V¿°íaèþ³f[œïÓ¦;{ºóK÷Þê§.ë'Y°^/½RMR]6ãÄÙO*¸5%ûG¤{ŸØ(ù…ÞXZ\!¯àÃØ·ÅÚ6æ Ú8%-yk—´H${Ü“>­°UE¾iQÏJ§£:Q’^+´Ö·§­wrØ×úlFȵ»2Á­7v;xïéUª´wpͯ#h_®BztØýðjkTà‰õ¢Õª´“ãÒK $<â­„l+6”3t«zv8³êTÊ·-Iªèy7òU[mŽ›vCÒÖÏWýb›%þ*r)íÒ"CKÿ˜}å³£nßœJ¸¼£o~j¾ñ1Ñütcý4‹¢„+cU[R+VPUNܯ 2Ù•Ùùò2£yÖLSrÎçè;1k—¼ 'çäið×x:t4­Ì ª7T,5oc°³•ø«M—îNµmÈKzái§ëª=CDæŒEd«—܃{Ϩ•åT|9êÙX#Ó$vÎü·sq:UcÕnvŠi]eû®ÜvÒ3¿Ð€;^rïæ{†û©¼£9 ‚¢Þeÿ|¾ÛâîVÃ’Ý-Î mYE‹îÈÚˆL™wJöÝEAÙ›ìÇ\áÛÿκHÕ.ˆAŸ6Kæûh VæþûóV})qÕ${TÒ¬î“KC¿ŒWfù—¯R›OSW¾Ç·öšµ’Ü[yÎ.ºã½Ü̦{ÝÿaïI ä(®ƒ(Øl—ˆ!J ¡]ÂîLÏ=‹P´Ú ¬´«ÕÅÎõN÷ì´43=t÷ì¡ñpÄ`ÀØ’ &8(2 =ËyƒGÍap æˆb¬È€@V $6ÿ«éžÞ™Yíê ñÎ[i¦ýúÿWÕ¯_¿ª«~õn?vÇtyñÚ¿H:WêúÁKkß¾ûÖ«n]ñ«ú¯_³×5³ë¤GÖÿøøÿˆÍ8vÒîÐí“ý»W,œrÃÑ+Û¶© w,Ø|ËŸ?4™s¿sâÀ‚ÝM‘Ûh™rÏm;¿=m±šaùèã‘›ò˽‡Áï·îxêñŸÏxüÌË·5§ˆo.?mãÎ/æ„^jÞôuÃÏÿKóô[¢g×÷Oª½óÒ¼qεolûÝÔ)o>í›ô›§ÎýÏ©Wß½MÙÔ2ï_ì¾eÖÞü’snï9yóš Ó.Ûzãú.ËoywÙ/ÿpõÛ¯L:gï¶çm»á®Æs?Yÿ‹ßœ¶îÎg‡ú¿öØyÍk†§¬Ù¸ëÅ%[¿u_û/×´¿·ãÅW–Þñ”ô–Gø»÷š³ünôÑE=7¹O{êÛߺ|ù_ô=òòw^^ûü¦U§$O\‡xÄÝá§f+Þ|æ±'ÈßnzdÆÑ·õ÷-ºï/ûú&MÞþñ¯Þ¼lý%kz„ ¯OaàN{úôÇëñ ˜¯8%êÎ .\~t-x‘›' ‘< ûHÐçëe\]’ $â,YȨċ³' Š”“ã‚D:e)Ô̼ˆ«[R!_ëz~”fõ°Z–6 ²{<ô¦Z®¦LFR•ž0°níKÃe5,VcÆú´/¿öо‚ÚWHûÒ¨x(•^W3°aâ7¸éE÷šE'´ì„^!® E^!=ŒÆ©—…HËZ²²öZNåRR¿AÂ[Â*XRËf…0®ŽÎ„3GG — Òzaô£›xÚã6kÑ‹¼P±Æ±Mzjž› ßâ®HõaW±êõ#šô„¦)m‚²‚àÑ;¼Œ *<¬(FÅ-« ÁV‚6kï‚Ã…Å}wUEñTn|OÎjïeÂlEaªÜ—UUoå†ñ/nU !+ R1štU1Jí†] Üý‡G´é.÷Ê2ŠøµU…ñWÔ uÅj÷lû¼•5¥JP̪‚*Ö nGaðF<Ö_Qчƫ*S©í)éD¸Bß¿é«\9£ ÎUUšPei„ÅÃf)‰­¬¾ÕƒôT•¥¢±¥AAð\ V6¶UCsTÅSÑÜúQÖ¯íôVVœŠ‡ò«Ša1¸]A:ju1Åv…˜=ÕÒ°ó8EÀÞ5_H ªç´B!¬ÈA¬…z1?ø|..ȵ­ÑNr~RRT%.‹Y•„X?¢œ MÐhmK£ÇͺÝ>O€õyƒ/¤/ørI4«$×ò’JYÁž‰Õ.€_Q!Kðô¸·Ñ ²¸»CPøcuµ)§&!g¬–®¥ÇêH;'+ïÕ”P{~Y‹C²`pã6c¾Ä[Óü^?Iæ ¡À4%cÀü~0 %0/nô,…aä˜ÛF°ÏçÀƒjp;øâ–^€uÀBa‡|>·×Aχ{KaxV§†§Jax(¶dôB‡,ÐMx~Öç„aÔGxuà÷ù-0UCOÃaˆ«Á•õpˆA¨›J\‘LB"š¯êŠ´žÚ %ßC3~?oÍQ¿ÞyÖ?|¥cmÒËÐ÷ œ¬R¥ñ}á‰wýûñSòþ/è:ŸÛòþ7€ö²AßÄû߃ñ‰%ÁÉ¡ ú5ïlûBž‰) s„©±‹cõŽ_xW 6°ù¤KH²‰ &–âú„T¾¬6bb††òFÎÜ‘É LéN ç^7 äxA!‰§8E! I&I.çÄL?Q WUiŒe9™!Zñ yUžæX( FÅt.….N»Ô_È Vo‚bõl “©*‰©s$3fÏPT^”’3æÌ(PÚ#` +.tÜ”ªX sjuRbZ¨Œ¤ÊPîŠ(¹ŒrWDIÄ3jª"Æ(áA*¢@݃š•G‰Å“œ¼"vF¾àÔƒd1qŸòêwŽ•æf˜ˆž‘²à‘‚Þ“~™Ë&©>¨‡1º[3Ÿûs²Pè™ßËè8Ì©õ^à„´Ä LL—ŒãJÝÕyžÇã˪½y\yòõÐ5´6@ „*ÒÅ-ôÅ\ŸÞÏÎ/ád‘ë]/²4Ké,W#ªÿ À"ü"L•>~1çÆn>–žbí_eƒnÀs¡ºa@l¦¤$í ½…˜’æR)Z–§EHˆgB8õÓÈ)¡[„1vx:Tµ³`V*cm…|‹ ¢×˃XÚ €‡Æbé5‡rè-ߣMÈ{qF– êj!…}1–W:Ÿ¹U©1iƒ4i.â´•j³_hÈjv¶ªXЯ ­.¿S˜%Úd²±×ÝÀVAŹic/NM-xÝIQ!YY‚N•&ð“ÑþõåT¨|1Cë2)eøÁ©DTÉ ˜J‘>€¼‰\ê˜di¤{~ÇânÒ´p9YÚÔÕÕ´°{ù¹€ Õ©¸°FéˆélJ²ƒœ,suÕkAkWó|Àošit/'ÐŽm‘î…­Ñ(iëè"M¤³©«;Ò¼¸½©‹t.îê숶6*3UhrSxN†f¡ƒ+À#—Áu ŽÌ‹¶€2§Ì¤˜l Tœf);ŒêbÕ(žJM“;ÀˆÅêçwFŠU‚“vÔ4(xJ§GõMÓJCÕ: 1µˆdS9h¬VŽç²X¥ YJk•‘M‹¼(cgÓ°°X\f•BT‰h:Û”ÒœB.ä2™~Qýph™J1V™sq±!.¥5õ*Ÿ z¥ñèê-Êeú¥'óYÅHš+(R½*Ä“Eåü¡öÀí§‚ÿ—2ª,¥à‰¾#³n²ûâ Wöÿ=¬Ÿ ÚçOÐç™ðÿÆgæôÎh}/õ õž73s¦¾þ×HJ+®ÿÕAÎ6Ì¥­ýiKxj—þÉùÅcµ lñçI`ûÀ,Í“†‰×¾°—°^¯vöÞ4¾–dðÔ âã8Ñ )õ3®ImÁC4ÿ–ž¦á…cµ“5ŒKÔ\¶SÅ Kò ©êjÍÄ%äº ><á‚V~˜ %©nð£#‰¸éð¥DôÐ¸ÉæÌß c'ÁÂç²4«©Õ|bá‰‹ÃØeB<NV”ã¹t"% ™`€y0}‚"*&Ð @IйýÁÉ€ ðÜ_¾ˆ$®æ¸ÀèÈ0Ähµ‰mëjuŠÁ¹ÖR1X£Õ& bDìô Ø‘è0=(kÄFÏ Å¥h &®å6&A`‚ŽNÆDòý0ÖÁ Û—23ú ´œ-£JË9¥ó[®”­˜pÅœPvÎ&«Äâ¬Mà!â%î›~ApŠà‡ JEðSÁÆôÐ%Úé˜âô@ÑAÊ)Ú耗%N5! qƦHM²ñ ÉÉ3¢H¥<P^ÉÎÊ Ù8A Iç7iB WÎÞæ EÎÉ3¢äJy¡ 9Ï ð¶Óƒ 62p§g‚­S $ Ô–àLæààz/gp./ƒŒhy ¦}&þƒ© ŸÀøÒvÔ[ÿèy M—Eˆ«-Ò¾@À‘Bžd¥,ýW bBH)‚™§€LŒL€iÚJ­µlú'ž“qc •åñt6…"2Šèê†Ù¾RßY†XÊfI‹¨ø”eçI)¾BR™¼æ{°ò)õ})ñ’œPcDÞöärDša>­_^–¹‘>"kkbñ”ÀɪDǦéµ&aŒáÎØ8Ôˆ“‡8ŒgÚBÅ€¸ßk2®¸$É|=6_}‚K‹©abk?*üÇåRj,J‰ªª“¦©Å!¢Ä¹” i4ŠéŠd¢j㨪± nˆz1Å…NQƒÊÏa(ŽÊ?@J3i ‹"Ò\öºÐ&F PÅòÐ7zz¡øÀ‚A,¨.#LJ¸ÀT‡ö²Y%UÕ²²#e Œ,GJÌ €É»ð¬-Éëji÷".í|¬š”Iû¹n¥Ù‡ –'ÛAaW-4<àX¹Ìˆ`}/”¹~)Ã¥; )I«´Å `¯¢¡‡… ã2ã¬CHK*}Ú“•®y¸¸ÕëjH)«£fþY%uQ»ŠÇŠI¾f&ÉJBŸ¦Æ¥ý°h›k¥õA´>@+á9mm…UƒéÙYÒ¯¢N×ÐÃÜð]Sì9 6µ¤Ä}úÉixªÕÖÚÆ"Ò$ñE{¬=G‡¯,Çê´ddœq®Á1ÀÖ3h7£¬A"³—b9˜šbO5Ä*­ÉËÜ ;ÜŸ Ër¸‚Ò§ûãðcÈL…9¾>d@U‹¸;AO)#p…²Í$š*rüJ‚@¨=šf©ML²„̇^Æ"¸aÄ&é˜]J,ïJsCÚO£nÁ£ÏÉvSc§e"°DÉõ“cZâqÎÈÔp)‰ã©*[¬š§¢!5Ì\Ao\‹ý,M²šM{𭽤Œ^¦¢|èdÒ {ÙL:¢Bµ/=œËfmePJ´L‚FRJµ5ýÄbYš}ÑÄu®Lþ ÇG¡Íúu§(ŠÓzÜ`9’gcXD-¤FZTq1¾ÀìÁüL–õÆf5nT30~ÃB¦9£•œ,—±àÒ(8ÿipC´q°3ZOçüYYP±¾$5 EP“àOµˆŠŠƒ®Ì¸ŒÜƒ(ÐQ«@ò¸”Dp3Ùeq‰¦9ÕôøuqfÍž=‹®#Ïš3gQ¸„@¤ ÈAÚ…°à,È> ÆÑMJq™þt¿M(ò&¶„Bž5Yx Õôé‹)]íìÙu0"eHmömV‚6gN4ÚÊZjM¦-5‚¨¬þÛ¾À¿â"t€Qéf¶FÒ)ɸÉHÕ©0úš‘?DÂ!bXô8XPÉb4ŠEc§™7ÓG Ïf*hº}„ÛdŠÝŒaB¬3CãŒ(6c½jy4÷"³¤î•õáµÞF|*^Ä’ ×-•aÿ°©îƒ;nâ1Všµ…f|ß:Ö;—é<Öë–Ù€-«-Õr™ãf±Qßèc½8 W_üA(a7ÿçvÍp`„…ø/ÅÍQzøw~kÄ;½àFh.ÛÓn?«1Þ…+ZÅ¥j:öÁGÒÎ}¿CÊŒ‚;Þ+¤ô®ltsŒµ –oBð6U`¹þ Л„Xú…l GÊÂlÚ¾f°)L Œ'<àXˆ6†™õ¾]¬D¯vá‡w~ó.>¯ôbîË`ô²šÁïÜ–1C¯cÌùª N•íÂøYÑ.°xUSÕák¿š‡Q^c1 㽈 ˆ¯h@pè ј½øÄ»¨@ÅN±­‹ñé(ûñÄ ñQÇ9t[Œ„ÇM'Ün/ü»¨ršñš­„FwuãÁ8£·¢^›OˆW!þ|uÃ0^Fc4 õßy·Öûd ¬ÝºÄŒ£—û*}`ú 0©òÐ fñ®Ç­X£›c”|6 PüGOª±Øà=–æ]lØ°ÅØ°”ý¸lÀˆÚOØ_^ñÅÑŸÒWàô 2Œú|Àµ€×êK¯åÅ´qÛ ñ‰¤ûòÛþ¯} Zåü‡=þ§;ˆû¿ž‰øåà ‰d¹p¢órn·?{ÜÐB(”ˆ ¾C-ßÄçÀ~ÆÖÿ÷-hµó_¬ÇïØÿéqOôÿƒñÙ?ñ?Ô½@zÝ}ÔÖw—¾<ýúwþ°³qÅ÷Š«?=ú‰N¾7úè×¶ÌýâóiuË#_Ù9îßî­»~ÃíŸÌ?/rÿö®£_¼ùúƒßùÝ›­÷,™ó7GÖŸ~Õ¢—3ï¿î‚SŽøýÖOgn¹þî{.}òÖ·>Þ{ýë›.:îík—¼½ìõÈ¥Sïé=ãɡž¬½Om:æ†O·ö~ïàÚ^[÷þW?w}öLnmáíM—N^~ßÌg§ýÙCŸïYzQîùÏž¹wå•ñž¿ñšÁ)SùgW³÷Ço}TøôŒ9Gÿ¦mÙÚø§-ÿ}çθrshφBôŠol>ôÎcéÿàëÿu×kG\ðÀ_<öÆ«áYœ2åÃ{—ï]~çƒÒ3Ñ¡[}]qåßwÜFß±+¼{Õ²G¿{_à”;æ]øÑ‘Oïøþ÷ÜÏÝyÚÐ'SnxazíÉLãŠi³¯¼²ã°ÎnêŠo“ÛÐ>ùöe¦ïüížôåü%o9zã釿±lË–G®~îá÷Ö¬º>ºóæû¹kw¶þÁ?õÝÔMϬ›òÜçGýs÷$å±WÅ]þ'ÂÿóÂÊŸ]ô‹“v»â¶Sïܵ9rþúŸ¬»ñƒ¿>béW<ü–Í5']sòñ ܺõ[wÍ¿có©×m¿êñ—ßtÂ?=yý¦W¾·•ÿé7Wm¼·ýÕ-ÞáÏR/}þý[&õ^}ÿÕéÍ}Ïook{~Ù…ï]ÑvÂÊ3O]ðÞ;Ý ­ÿׯ>qâ›g¬ô6¥’ëþv5ÿëÐÏÛ÷„ÿjÃö®ÀË¿}{à®gr©ôÙƒ‹ÄÕ½ž³Oxõý#¾m÷Ö¹×½öÊG÷{†Îüüðc)— ¸ä÷ûö!Þ’öÊg¿„[Òc'iá–X3*Q…pKÿŸâ%á¾Pz¯cCÕ‚‰T|'1¾pIloY†© [-RÑh×BÇ9ɃÁÑÝמÊ1VÆDÊ0ÄNÄÉèËN„õ• 'B“b8ÖW!œˆ;ŒËAöð¬ßšÃò9„¸~G8Œ‘‰¸ñ½RXØï×ÁúŽPîpØ^ƒÅ{îJagXÖç Ââ¬&Ìš÷ÚW Í‘<6ѹÈûÊY[žj”GÕÉzcŠY‹dŠÚŸC;g<©ËdKšfØi<\GëíDÛЬ(ññìc£¹Gg& `¼~ú´½QÕ#3ýÞ;lw0Zª0+ÅhÎÔ¦ ¶¨ù763¥¤5çõXŽ*4ÌnÑÓž!·›ÌÆLžæpÝ£FN£² ):é–Á»=oð¨!R«b½£_ !¼j¼û¥ôT›BxÔK‰nša“1Á`p3ŒÈœìÁÆ‰Ž¡ãQ&ÖÔU“)%!U￳  føY¯Su5[Ïü´Ÿ ÄŒaq5èd+ 9}0KvzÌÊÁz67ªÊðŒø€­ÜÒWYVꇲæ-wÀÁ¼gy>JÕ͘™fCéÉq7èI4«ˆM<Çó<H–+Ö¨#-Ï ®Êá K6ÁžÖgcí‰D+Þ¼*.-Á0!{DŽÕt,Ù‘99îGì tò*° Ñ£ÁAzs¦1ÝÔa$t¬zt˜•¤M5é9Çm°WCìÄhFGZ–“ÍñZ“êe}ºÞ¨uÂýO2¤¦ÆÛ¬L<±#Ö,æ¯NÎɶMÒ9®ïbß-°ÞǾ 6v+:Jzt/þœ÷ÿ”ó?Y’³þA…¿ÿ§œÿÊ›xúœóåüW–ÄÓàœÿ+翲$žþçü_9ÿ•%ñô_‘çÿìþ/[ù•ßÈ’ú#D¯Û¦¦Zw4½$ÿªä–ÿ‹d8ü_¬þ$¥ìÿË‘‹ÿ §Mã ÿ—Âÿ¥ð)ü_ ÿ—Âÿ¥ð)ü_ ÿ—Âÿ¥ð)ü_ ÿ—Âÿ¥ð)ü_ ÿ×#ÌÿåØòŒÿ ÇÕ*Ðÿ0N`ã´ƒáeHq ÆÍø@æ_5@ó8‚›tp¨ðvšÃ‚GØ)к=x4 "œ|Z—< ŽÖ‘ÞÔ$¹‡4yá½™*-½£e#x`ÅÓÊò‚‘6‘`1€Ÿˆ@A=.L”AÆþ(§*wªÊ¡O—ªJ⻪Æ©ªdýÉ:€š×-„šq*À ©®:æœÆ§ÆYGF=œaL)Y.ŠâŽÌù;EÙ^ͯƒvV É¬‹7dºìRŒCÓã¦)\P°Þhô²`V~ô‡S0ᬜôT Ý VsÎjIÒI(ÅÛCŒÛ#T,’¶‡¶°mb´QñGZ1!©+¥Z¹±®Š#H®;IØOå)ŽšàˆÃˆ;ƒödŒç”‰Ü¹h¿ Ü‘‹â( §8ôr«HßðÜ ü#VÉU½åu×ó–b…\5öÒOpQ¢ÕM‰¸]e+ÄA.é¾8œÛÿh‹NPÍ7"¥àn·Ç¦˜“EKÒ ')=*]ÍUÅ ›ou­ ·^U´†rêX×õð»×çi®*á,iDöܱ£äu2Rá2Ö?bµQ¸œµ9kŒœµá”œµarŽœƒ„qvÖbó˜»ùƒfüu¨W™ìb_èÑä骸ˆäj .CÝ&7áNE˜% ±r4Ò.Û‡sƒ°„m/Íö¸58p(ŽæP?òTÆ)l@¦®¹¥9f~žÅËôŠîÎVì|£àœô»ÐÅËŠ¸Ð o©¥¶x£Ù¬mµ ³¨iöÅ/7'±ªvÉÞ]•IÄÈ@£¢9!§3Ù1‡$Í÷+=ÇÊL4ŽGòa$·-(ë>‡&@iœ9>­¢] E©„BYÏ„r ~9}'â½îI¡¥¡âã\é*ºìêuЦ}ËQQN1t™æ¨T§°Úúk=q5Ø­G»wovÒLÑab9^¶‘2ÿªaMBêB ˆÙM‘¬hX.bR Øÿhx1=«Þái(’Æjì5‚›su ÆÄük´K÷XB‰Ñ@zFìê›U—ÃFíŽÊk÷¸ü“>¼ÿëùc%ù)’&1#Ðû¿8 •÷åHI„^O‘$ 0}MâP M&é1&±¢åSRù&ìß;òÇJnퟠILðþ?ÂÿRì¿üSÙð?^íƒø·]Ž­v¬û‰ùý×µ”u)úÊ”ôÈ:OE¬ï^»yÿAm÷ÍYº7÷n¯Þo,"ÿ*ª‰nPpìé~¹Í[ zsÍÆùý½¢©[¯´š#äuFWãÚÙ¯‹‚7ïØÜ‚m`á0#솷$%¦›S%ïÈLO1™u’·¼œš’ yCŒ6®]¯Œ×÷¸¢·õ¼Qgô™~\ = Ê4§øÎ©n´žÑù^€]áq@’Ñz£Ñ`äèÍ+Îv1»)Š‚&YŽ}¸NMK{yñ¶W ¡+î …»Œî~%^ü8ü¿Jü/Kâé¿"Ï-ñ?E*ú—1 ôÏ™¬3ÓRâãÑ$¯N†ôÖ¹ÚkhéõA ±á¤LYÿÉ’ ÿ™Rã* þ³‚ÿ¬à?+øÏ þ³‚ÿ¬à?+øÏ þ³‚ÿ¬à?+øÏ þ³‚ÿ¬à?+øÏ þó#ŒÿìØò ÿ™‚+s Vÿ{ðŸqê4ã@FÁ¬3 ãf|€ö·*I#žapQ–ÀßjW'Ëyfm†µó‰±Y«öØ,eϲ7;²¾€ž•IuRà]L$&:˜üGÞÜ $ðœ°ö4ͨlˆI$MB¬$dO8p`ÅÁÂòDÿP—Yzц!eËÛ:Ûö¿ïSžŠH8y~@k\œr+_ ùILU$DzI¶Ëà° `·1ÀwËN×é4ËF¯NÊcÛ¶†Ø0¶Àfm`Y(ËØ³ìÍŽ¬¶]6ÕI N’uqÛ†ÝZÖÍóÞÎɲ°s&$l+‘ì:€©X÷o±Ù1:êA£žÈ¾ŠPÃÇI‡“hlÀˆˆÄ‘OÔ@‘¬FÊÝàÎvʵd­ó×x_¾§~€âúÔ埖„c„Tûî@¸Ã\¦Ëè ¬Í±#î‘lÖfžÖFÚÌ“nž†¸ôeR”7ΰí°ÑO—à.pôÏWPþú ç¢kãÃúH#4 Ö0¸1ò·$ô#ÈKÌ@;|€¾À"´-­ dM’ãk€ßÐX޼IèoÆÊÕ—°~ϾêÐàNS>ê„_®Ä§â=õ$Œ“'! s†Ž!ÒúîGÃuIjÁ´²G–ÆØíG9»Y³-´[5ÁÉùäCü­JÊ@+!EÜêTß" k áä:Ê+Ô`ü5pÖ…ØÜý ÅF°OXã×plŸ@`åèU h (Êà\$a!¨'Ä.Éz}x›ý"(kÕ# (ô_ù†˜JÃasÂö) 4œ¬Oч/Å{ê2ŽË ôÑÐ×jä“1ß®Ór†Î¦MI/Ë Üíþ•+Wbk¤µ? 5`³ÖDYÔtÛæ¼™“u'⢔muÃVʧ5 kcþÆ¢/¶&¤ƒ¼G¹&üô((à¬Î 4àh34ÛÛö€ƒaØ<`nU^®Þ  ‡¢vŸ(Îî͆D¾»Ë÷Ô?€²Zg²r:€ßÑ›…(d ‚íV“å® ’tê*Ò¾Ž³t¤?Áå{­ Ãx´&âvÓ-lÐX±.ùiGŽ@épä¨(h1a™©qÎT ?8ƒlø®¶¬Â`»ËU•„e˜Ûš€kœF=\£ Áä‡*}+ßSUÒN³.ƒ"BMø¨“á: p¨ƼËpâjÐ9âj”sDÒèN7!¼»9×ߪ|žoIéðÞËÃï‚{_&`Úï ˜ážšbÃQäë5ë)(5gúe³ÖNgÿcÊ×KwŸòƒ2p=ÐÊ­|¯¾¿ /×Chc+'Ú[!Iv;‡¢ÍY{ÑhÅ^O‡Ar眉™„‹8˜E«,ÊB$K•ïòŠ–›N¬ïåt2{åúx°ÜÊ÷xUV6‹ä‡$ÚIBêÁ øð1¤&t¸áÐT.ƒÔ§fcb6Àò‹ôÅ¡ ú#Ëb·»^ Á]ûø *Ë÷ZUþXHUÀq`€Tï4Tbì´mS—¯*v)Éé*€i]% Ò)·ò=ÊÊõ8%«š`s$Ô iq^å¼ÌVOqCljºFù³ôó¥p· ™È—ßzKäÿÇÆÿC“…#à'ÄÿCãÊï?åHZŒat¸V“¤Á˜èyµžD!2 8-«“þŸG<ùbÿÞ¹±'qþï¿¥ðɒʆÿgkl¿¼FL­Ö¼]”34öý• /_­zM—ÓfvÓŒ£Q•"ÞK»ñ÷ΞÆ¶D+ÌœýUƒü6ãB^[p67}gû•›<ìT?êÖÕ“kæoŒ?E–sz×ÁÝóocLÛ󿑦]—ÆÏ}þ©ÖäÆÿXz+ ¿Õ0øÎg~~°yI•êõn'¤O¶ZùË{ù™&·lZôÇÝ·èWö^ûéjMÃ)C龉ه/7.»ÎÎóñ ÌOfÍmv`ìÄ?¤õŠX|*íŸ5÷›ì3Ü=¯¯C|;.jr»ÌzK4¯e¼uÛ°âÇOçµJz}Öo%ÍNÌøÏ¦ü³Ï4[;cmõ =fßíÕbñ¡9»VýØ~ì³÷]ùÔÕM?d4}éñâ··í™w›óÏôè&%5Œoë‡ìøû\&3ì£Jÿ|Ñûò/¡Ÿö?ÿô‰ÍÕ¾?û îöµ¯†”fTž{Ž>RmÂüßßi2•\]ZüXKÛ³æb_íˆÃšíÇV üëðÜ—çÏ©«¯ûXˆ±õgµ{øsyÔò›WZêÛ=¬î–³ÉªÖKhP;®[ïãu²‡ÎË-8| •SãÞxðÛð%Æ6ï=ðl÷;õëïxoLŸUw;_ÿûÝsù} Ÿ\ÿv踚šÇFôþëµ¾Þ±dHð“ñïL7­VjÜÀÖOé¿£Õü×FÏ_¿¤J›KÙØ÷{f\©Ó tÔì7#æ·Ò~YÜš1 Í/Eµv6Û5ü­¥%k_©9.dýøAV¤µzåÜ¡‹÷¯_OÏ?vnLõNú÷÷“‚Cª¯œA÷2žžØçÌþ®Uó^ÝTDï^£ng%äר2º!œyV¬ï½<,ÿ;ÏÞ<ðUãºGo-M.|®æôÉ»»T‰*šWdîZwUã+;¬ûàŸÁD†~Ø™¬¦‡K†E†Ä~ªÿ`Þékã‹Ì†–{J‡÷9?d¬fŠþû—±Ç„N4[#›®þwYÝÕKömZ^ëâ…i?å¶=W㇎Q'/ÌÙûãoí~{³×åµ-Ó^fP—î[·¿éô9½óëlUôÄú~yZ´,ì[²0¤`í[_?wR{hÿ¢—Žæ7`ÎÍ’&?*¹5ÕØdÑ»³Þ]úãοŠÿ\_8¨jç_ëi¼¿=²´Ex§ž½õö§OÆ® ¯94g@d½sdpLŒ&ÉÓ/Ý ^½·uåe'°È/‡6ïs·sl³‰§†­i[{lÁÑÁU»;gkÕ¢Û׿»Õ"f÷”üÍûÍy\¿|ÏùõæÞxñ‰‰ÛV‡…`;ªŽ)ZPóJ®×ûïµüÃný¾6î: |üþú ­²ìÔ¬c#–ô{»qôƒÞ‘Ÿ¨v÷{làÝœâS×LCOäÝ|½öþûŸ½Òm² ‡‡_ïp±côà¼Ì¾Ñ†.;gÝû8þ³ç$\³MÇ_wü¶éøŸ˜÷-Z}ž|öÓƒûO>~¯R« ô4—üK8¦ÖxAÀdý)@Ù0Q\&Z”€)ØÊÒdågÂ-¼/¸¥2œ|ä8š(Ë»D–3.R’¤Iò woXš„bX^i$T–·K I1ܼŽëV\R€«@|Êì¤ ½èV - —¤P ¢¤…ñè¥"·ÂRÂ5Æî YNØqIqܼ®àV¾gp„Q£^aϤ{Ń·¢pâ'z1ZèôbjŒtE/f¹$'½#E/FÒz1€h¡yßá$&Bý¥!=¡ÃqFpNáz1@ŠPQ”^ŒV ëPá³ZpÀ…m€´ ƒȇs¾R˜1n(ÌÎ^™Úåê± ß¬Jš¶4bÊ7aÂoxf€ÁÔ2˜)ɯÄ[ÿ ÿ—Âÿ$Oâé?pø¿þ'YOÿÃÿ¥ðÿÈ’xúþ/…ÿG–ä¬2pø¿ýË’xúþ/…ÿI–ÄÓàðQŠþåH<ýW8ÿ×ÿÙ»è(ª4}šVQPaD/J„ˆIwõ3Á$@xÆ$ŠCÈÆJWuRP]ÕTWçA& ãꨬàøQ™qt`ðà¨#*.àT”ŽŽ‚è:³ *;º»ã«ëVWwhÑg·î‘NÝGÝï¿÷ÜÿÞ¿ÊrÿÿÿÎ& ÿóçûî÷¿I$ÿ½L¾ð?ìžÿ8’,ú2¿ÿážÿ„dÑÿ–|áØ=ÿs$Yô?Îÿ]þ;’,úÉþ‡Ýó_G’Eÿó'þãòß‘dÑ6_øvÏIýÏŸøŸËG’…ÿùÿsÏÿIûÏå ÿÃ.ÿIþGó†ÿnüÇ‘Dò?˜?ñWÿIþçOüßÕG’…ÿùÿw㿎$ ÿó'þïÆIþçMüßÿ9“HþÓùÿwã?Ž$‹þçOüßå¿#ÉÂÿü‰ÿºñG’ÅþçÏó.ÿIþçOüßÿ8’,ö?âÿ.ÿIýÏŸø¿{þëH²èþÄÿ]þ;’,üÏŸø¿{þïH²Øÿü‰ÿ»üw$YøŸ?ñ7þãH"ùÊŸø¿«ÿŽ$ ÿó'þïê¿#ÉÂÿü‰ÿ»ñ_G’…ÿyÿwã¿Î$ ÿó'þïÆÿI$ÿ}ùÿwã?Ž$‹þçOüßå¿#ÉÂÿü‰ÿ»ñG’ÅþçOüßå¿#ÉÂÿü‰ÿ»ñG’ÅþçOüßå¿#É¢ÿùÿwÏIýÏŸø¿ËG’Eÿó'þëžÿ;’,úŸ?ϸüw$Yô?âÿnüÇ‘Dò?œ?ñWÿIþçOüßÕG’…ÿyÿwã¿Î$ ÿOfü_ýþ{0tÏÿLüL"1“ë¨çcI곪•éRks3/¶q2¯47·ÊL¼­„‹÷q>0ƒC¿møïø>’ÿ>þ ï÷;t-ý?çáÈÚúâ ¬ÔÂûJ¼Ta¡þ×qÈú…לx-‚;«ñ]ÚÇ]µo»B™úm×qh2\ª_¦† l"‹ÛWJI‘åÅÖJ©sòñt¸ •ùÃøÓ¡";QŠÅð‡³©ÓÎáö\+/ÖÊ’ µRžI’2‰(±ø‚å¢Tª°·¤(O‚S’ñéŒÂ‹4ê¦bŒ<ŸòT‰ £^ËE`˜È !F–™.µd©õRTMý,­‡TòÂMAÔÊA¡ÂÉ팀âI㚢È.(„Ødù½!ä™PeähÈ1‘¤Â%>(‰ðr$‹ \§Q€b–çd.Á'ŒB/‚¶§ïB‰  F ^`ÓMÂÈ31±¼ 0©2Ȩ"ÈÞzª2É ¡»*+4QEA5d0ì›þ€˜šŒþ`¬5D~(¹ÆÚ ÄÄóC$ øÓ¢Ñºoåä#²-‚qcFË7`´L&u€e¬°aÒwÂØ‚ÖŘY""–  ABHà2I„sV‚Ê  ‡žìÈämúbøŒþ`œ<Ñ_؈,1ŠQ‹„ …€4‰À A?R&fH‘¬˜!¯DbÂ$! TH X‡ÚŒ¸+Iò¨Hfb†”¤3 cH˜aÀì"ûƒ êJ݈E‚­ST@ª@4Š´12MGœ®å`d`ý97ë†Þ´„ûÄÿ¢¼ÈF%QQ3'¶*mš¹ÒLTªy7ô -¹Nä©®™„DJÀ¡žn—âê¿ÄG9!Á÷ô ¨$3‚`¦ÍjÅT˦§HR–Á¨ª4€Æu¼Èa©µ¡§q‰â: ´™Æfª«Qd©¬”6GU–{g¯)žÕ"ð ’\޶Ødu¶N&JI¸Ÿ­<+xªÞÚ\™¥ƒˆÀ1²"©kSjá5–P©å®ŽK@XBã²õ ©¾W;¿¾žòD$If‹1ûŠ£LŒºÁ?• øa’‚ÒK+µ'UT3û4¤¸%"ŒÀiÉôÔˆíõ¸¨šQE.ñjÝ©Íj[PŠ,ü4â:#XøÛ‘õ&­îRªw‘s“Ö%p èUxt£± †,ØdjêÁœÚ¢ YPÀUµ0ë­’¢h·Òv·†l ³uÅ‹í`Dº=Q°ý¨[ä:âŒÒ¦ªs!Kó¹ŒÒ6©uc=7—›ûlÁÖ|P•íàY…DÅhêÌ…IѶXƾWF)Ë3­’È ²Ð&IóØà`xÛ˜øa2¢<¢ÄrÚu7®kK´h9s¿ÛÚkU®{k$Jq½IÊ,Â?3¥Õ®ÆÁÕDÝ…ˆGóšKPíÂ$mžyæ oΗø7ðU-Óo§Q«‚eº UuK Òšd«– A;QLÃ#áܘ¹cŠÊc÷‰"í -;ær½|ž¥|n‘V`M,¼š¡ª™ ZŠÇA¤55EVOŠ›¬Ìt °Ã­"ˆ€À´p¬>¨E÷Çá¢Ó¨U¤Ô’S N.åÑk`˨0¶B¤‰"ÃÎC¸fO­3Í&®2eµöé‚ÔLjåÞÔ¨Ýh,Ъ0Ãq_X½H6æW—‚³U R·«shLaOJL¤Î¸ÌÇÔÀ:#à=‚õïÒÿv&ø…ê¿ÐQ´¶\>P€x\¨Ãb°Nª5^mdéM«[‰FAJpXÏIvr‚ÀÇ\3®Ásà‘»Ì'wšsD•¹&ÆÀœu¦ø¦å@~5ÃBt¢.¤ÈŒ˜Àû~ª:ÍêªbKÃ?ì 2r¤ˆKu@*²š’©¬^šõÔ(ÄvD»C`º8YUÞ·€*h„YW‹tC…Ið©8TŒXX ]Xô@ÔÚ¸ÆÌŤy›ðlFKJá?-0gBæL©‘i¢LD€†j Ç,¥RaÝžÓ©]¦æ<ú¤LQd_F%’-È@ŒI,Þ3RŒ 1¬*Ê&+‡ÍSÚ¦Ì\Î\“ý´V™Í&YGðKõ1¥éÃN¦ºPaí1ؤ7L¨ÒëJÆãÄX¡H:ˆ"£ÃT• …Z­Pˆ‡™†4tÑhëM¹>°ùO9>ZNßõëNQ=ÞÖS°]´ólR‘¢ñeŒg]àá˜=ØŸÉR‡ÎlZCK•j&˜²1ÖèDRæPœbç Á‚Î Üm¬­/V÷üq™Sð|IJ AijŸPð¢+SžÔÝPÉ©«VêÆGIªnT{Ln Òä#©¿NÎèòòѶ´htEÅh”`¢’D MçÚÁ‚Ó@{;Án’Àˆ­IP?A­Hc#¢¢§›6 |À5}ûbP7¦¼¼V$iÔþ¦³4«¨ÈÒL岯@eÚ!Ð8 •Ö¯É3 þ/}„ÌZT`û%‰ãP­$ƒá^j+†~fÛõ2¯¥LzLhÊ‹¢´.ÓÖN³o†“ æZl¡%EmVâõB•é7­gKyË’9ª°`&h1­Ñ§ŠXz¯§ùaD×´úk(¾ lºNÐö®ð©Y}]ÁÙ2¯‘õš3é’“ŒïJsvm§ƒ.E¥¥áTïcìNœ‹¨Æ0Øú`I á"Tö!_ B¥`õÕb5§_•–jWþ`¹Ú6P¢YZ?MT§ê à°á#¤‡_ZJ gõ!æŒ+”W1Š0q¦…x¥ Æ£Ò¦â X¨1 Éü£7îÖIk¨´Ò´ŽEv\˜‹}Qª1XÖ‰ùžy¢µÅ?©• çi*õ‰LõêdÐêó›h­‰VMŸ Û}1*eP˜þQÑT‰—„JMpiL }Lš¶`‚Á­Ç¦¬wPŸq•BÑç) dE—•eŽ¶È™Ã=&äÒpæ˜ñ±Æq Ù"vxá oËV‰ŠÜÕ;`8dT,øþ’6!vÀ!ê#p–)î#pÐ*U±›ÒGT³r‘sj…ñ[EhV;'GÁ™ìûø MÅãÑ[¥À1)v°>«üÀ´Ndâ‰ã™UÃÎè?vJn"£û >ªyê8°Î(€? –P8\žJIfÁÁlDê>H+›Á~*/Gžúd‹Òç皺ígÌ(ÖçaÑ̈î$ð3y±¤M‰ E¨¢÷dÜ>çSž 3g¦ßÞ}ºW_&›ƒH’౦ }àz6`ÎØú1ö$|709–Ï\þštÆ“ñ¬¸6‡7Ù„ï8H Ó„ÌÇr’aÌä‰ Ͳ1ŒIvÄl§:ÇŒIœ«Wób.[çúD`‰ƒrç`‰3ï̳Žï.†Ëy²¥Œ8_ÔÒN,np¬ôÑäù¹ÈçòäÒg¶]⺎‡nÛöM~_ËÉ|´+‡Ùò™e… cˆ˜Ñ„ƒ­SÁfH÷‘ûiŒCøÙN='&¤c…²p›Ñe@n¶=QaO"ÿ<žVZ’lñ [ß ŠI1Âc9Ññ3‘sÛ“A)³%ÒÆÚÄþrSUj ªe‰ÄÚ’áÍÁ,Ni.úè–eÊá$þ˜Á •ωμW%›@Sn@ýÊ|ì™Áæla'|&ý£)q^òöÙ?RÉÉÁµC$ÜppRˆÓù„Ý–ÏÞIȉj^ ˆmqÆ6Û¼Ë^骓¤^7]}Ôý §Ù2lmK} nQÐGŒ,§— ÏÄ,J“’1ûõ\°=pG£â ¤EðìŽÔ§Ö)oIÛ[do >N1ë3Î¥À5ÓF° ç¼>\*ó«Jøù½ö^Ž©4<šxRÜ€NZ ÒõÀ"ë²…À²Ïƒþ8(•zî“2j´§¸d†ÇÏÃióiÏ€á·býå@÷D¥ï­šUMì7$ÿo§xÿ7ÆöñíÜïÿB hïüAŸ×ûü!Ø}ÿ׉ò2l¤…‹øÀ ÑŒ—ãZ|ÇEY4e“MŸ›¾ßtúg£}ÃèEÿ_0ãýÿ€«ÿޤÂÚIÕÅt‰Ÿ*Üò—ePAäERË<ª¼Ü3]{NœTç©æüÖ«§ËÊ$ðZX®¢û£:Wl¼î yçUgmü|lÃkUý?ùåÛ;ž¿¶ßÐÊ×è¯z´áoçÞôø¨Q—Æ÷ï>$m[ðñOŸ½Sþáð·¿Ú°èé¯üdÛ3ìÜ|Ñ “§8Š­?í“Æ·ÞÙ6hKhây.=üòÄ÷k½ô¯—ÿãŒO.Ú·ì…—®^¿Ø}ýß1gß²æ_­ú&zFIat`?º(ðó×ï©{à•UG^7ø‰ààMGÏ8ìßþycbðuÓ¶x|èÇ%ûP{Ï|äÓ÷þ8hå¢ÛÑ:â—û=ûßoδtäÍÕþý‹Gl ÿÓ-›‹êî:ûÂi¯¹r¦ç†£ëØç¿8·ûàîQ³.Ùþåmz|ÊÞ÷-ÛõSzÓ9•‹_üÍ‹£^§ >ó¹ÿ±#ïý>ÿùË•[ô›%ÜxàW"‘¯}‡ÿ˳ò[oÿòŠ…3Õ\¿å‘Ãs&¿\sÖErõ­3ö¼[•äv¬xoÅÝìß–Õ;þãGÿV¹èÍ®1ŒþÁòK—_yþcMÓ—>ìû¶hüÊο6¼òÐÞ “•Û7ž~Î9«÷ÿKÿ{/½¾ÿŠe¯Ó?º`õ«§m—JO}?|á7—1ë=¼¿¦æ¡W_>ò£ÝW>yêƒÊ)Êó+¿ú׋¦ÖÿõÃk;æþ~`ås7Ï=|½èÎ=Cp+Þ=xÁ—èàÝ“^}^×úÅõ‡ŸXR8øwoññ= ·ízªà¾ò-ô²[nØõíiýÇŽïWîkøÕ¬Ðøëoݵ6òé¼…o8<}ç{FoÚ|íúá³çÜ{½+¸óÇŽÛµæò[ïúlXí„Õ84u(ÿÛÑïapé;—¹cí†yçmŸ9äÚyÿýhéìØ‡»èá·Î?÷‘å]0µµáhüÎC·Ó½5¶xÅ}Ól¨zîšS ëùUsÎxmø3Ïœ³)1}åŒËn4ㆲݯ˜ÖUX·çªŸö›'_:oÛšû+×_\rx@÷†w}Ã,¿lت/»ÿ¢¯?Ÿº®¦®ëŽaã›>Ú:ªh÷È{7¼36qäG—Œ(Žü§7_jüç1Ó´EÂ÷Dj¿<ýoO»íá7wá“Sßš¸ÿ耇WmiÚ½3ùêºÓæÍØÔïes|ýèÛ=Ã;Ž®YÜòNÏÙ›.Oì_ÿÆ=S~Ö¸·þÝQO÷[5rô5-9õâÇêîÞQ°lÈ [þ¸ö·Òì=k?3õß¿ù«òÖYϸþ±ÿܵrÝõów¶.þ“©k>Z:nmâÅ™Ïýyáì;Îüöí¸­ ë8±¼æÙ¡ã|¸õÜÁ_…f^0çÌÚ¯¯åï¼¼R¾ðÓÛÖºçÀÕc/xãÊ7ç4<~Êœ}MÉ?Ìî?dì?¼ï÷ýù‰mUã—M™ùDÕºŸÜ ïxäݹß½îüKøËŸ½©îÆ»Ç_±ùóÏ¿³g*3è¥ÛŠ'øõcƽ¿aÐÞ§^qÛs{EßY2{íX¸ü‹·¿?èªxòàáO;ú~Qý“³»·,½xKrß”~E‡j†U¾ùwvÈWGÆœýüºaãÿŒšÝ¯,Y´{àÅsöRÿ%¥O½zûŽUcÿâÝ÷ÁÍ U¯Þ<~ñ¸êàæëÆ®°Á 醇ö†ƒ©²@Ú5tÅ9Þ$xfp,ÏTJH}!Lù£‰òÔ©on /´RßVôc»Å©'  “ZYŠÔsJ£lò4p ÜWÕ©LVŸWÆ›(õ–jüÎ$M«0rž ¢()‰Æ2\ÐäÁ‡qøÿJ‚‚©:µ~ƒZ¤’‹TzÈ3g¨QMÕ„ð[áÀt+Mš0 #H­©.ü¨°ebŒ1PžYµ3]Q¡7,³4T‡BéϘñ{8° •aRÏ—þ/{gßT±/p.OÃU¼¢ zX„Vh{–œ­,Rh ÊÒE(bHNi4]HB)Ô²ùW@EnAÙD¯bepC¹lÞ‡Š(ˤÈ"x/oæd;[–&išÌü9'¿Y~³Ï™ïÏ}Í.% ü&?'+´¯Hu)¹ðeXZî/IÅI½é‹ÖVLŽ$û’üçp:Nþ”ó=ìcrP;¾»7®lÁ0_Ì0ˆðýžôýTËx³`OÈÈ‚õ+*u8f»µÌ Öþ 2!²o¬¥%é (ÒSIœ³’!àܘϳK-þ¹±9 JjŽ! 6îE¤¤‡ð’ƒ cp±s!4Áiú%zK±Â.ê@'u>pÆÐ4Ec…˜;ŒÐ ¶ˆOJ¼a,CªÂ ýCFp¸2 „Òê÷Õ{„ž!Ta Ï©Âh\†R¿Ç0’0§{£@üÒ^Í…œ¸/&^VÍDÂRŒtµß¬tldÂäoøÉƒm³;®æ.úg«)‰êQ:q c²;Å‚%xFým9(æÿñcÿ Ùÿ‰‰“럊û_ˆÿ§hÿ nÿ üø¿1t*ý—ŒF‡µØh4ùŽ}\Q2x'Ì8 ‚ìÿP4Éx÷(èŸÄõ8Úÿ‰‰3Ù²ÁXÁYéO÷U•:ƒC/›Áw FCx þ'y/¹Ë“4,G(ìåQ¥3ˆl™Ê 5«Ê ¢ÏÄØác™ÌÞ"¬ªÒUéòŠ ÞšÁ¬%fÛx X.™0q±"b$ïcâkÉØTC™É®Ã\YVª7’Oª*ÁC’÷‘!Iú0Óé* N'fèèŽ3@JÜÆ•U¹&CRÿ2kr‘/¨JŒÛï/T™kE³1˜a ±[ìêßêtYîŸY„2°¼úšèbˆ¥ ÌS â!ce¡uìx»P5²ÿ(;Ä,@Ôº`*Ê‹K-‚ÎàN(ÚjvŒ#{R ^æUiÁÁÒRï·bÀg³  ôI‡wä yEV‡;áððÑMщÂY¬vPkm1%PÇ<>O‰9áoá›QÉéΑb3&@ž@ϘÁ1~Œ»ÅÝ_ÙÖNÁQåITßÒâ2“Ù™åŠÁZ[Á_˜ÎUé£R«1ÁÏ ª Žb“Í&ÆeÑõõ61‡K$GId8’1÷» [29’otÒW¦ N¸Þ³`é‚kã¡¡»K¦Ê]ê#]‹÷ÔQpÍŽ œ“Ö©G'CXRVƒ\8KSmàÙñQoqIvmIT’Kg•Ø’ƒ¾Õ©W'L, úHЕÉò ÜàõdÜæ–€¦\ìHnèQ=t§XÿÅýOdÿ/&N1ÿoHû¿âüŸ!ÿ?–N¥Õ ïøÙóÀxf²æR›-Êü’Õeûô¯wÿShý _ü’ 1šäÿñÿÿñÿÿñÿÿñÿÿñÿÿñÿÿñÿÿñÿÿÿæÿûö€Bäÿs8¦çõ× ÿ_üXÚC®c¤4[à!h/Ƽ'ñ…Aÿ4¢”I#$Ýýì6G„ÿW¼è”Þ—Þ_ „¤iQ@opZ r)ãâ@̨թ ˜•²EÝWù½·ØBo.ÙR"Y‚ŸI‚}üS'Oƒ@ŒkÊc+“+~f­-UOõ0 ƒ©„“UÎ,3€d1þ¬Hê] Ô­j x9šbr¨IŽÐøAÒ-Yä:KÕäì߯$JÎ ½m b èÉ­9ã}(m¼…–)x5Ïn;V°»Pì*Y>ƉsÉU®rV¦?h~Xy#õ lz#¯O±àœë`ÐìªoQcÇ3@“ï.kÎås7swž¼æg$žc£:‘Eh¬#@SðU³wls’Â’@2(\’^è ÅÚ‹ž3ƒ¾Ä¨†EŸ : —£€ý£«ýÓ©ACåå `œ†ùãR+`Ûnfd£8©‚¡/”ƒç ¾ÎÇì·· ¨Ju#æÄƒ•ú¬—rv&û—Ì2a‰§XY¿†õ`»—:¬%Ž”oÃLø;)­Ë/þŽÏ(% =4×M/$X®V4¸ ÁìÈÖBJQcÁ)€à}N¨ô;‘›r©“æH–là"i[ϨhË›&Éh@[$-mïŠì†“¿àâ‡Ñ¤½: Ñ.é[€!q™ŽÀXZ\ EÊh¢9i4/@oG‚6XwF“»(Éô€ñM,èÆy2ü ‘bѳž ˜•ÆhzàN¾gÀò¢×³,^˜)·—社0¦ш,ÐÚ„„Lz^2Oåè›%ÈæãG:7h‚’tBo‹#œs¹m§' öP”KÁ ‰¢å‰¢CN”ŒˆiÖ´ð¥UJ3w(MÆ·ŒXš J±4œŠ¢49Â}P©½Ød³N @Y¥È,©%¿ñÈÀ‘}ý ö‚¤U¶./-ìpÛC#÷êQ@{²ÊjAaL²õ´7¦ž‘E >Ù:Ø_¯úÈ™lì©þr&:zâëYñáZu¤}øñùæÁšñÉ1ížøºÖ[þäˆöÄÇjÕ—¤°â“Ò…ýÆGkÕ—zŒOF`“êl‡`6¥vuSR;2~„Ë8ëÚfC6( ”[ uäjìriq•ýlsA‰„¼ÿW[S”íÖ}FMžQ»>ÅÑy&Ó,˜ñãÉH¼zJM€_¼or…sâlšÀÁtn·ƒq1’iuhI eó;P€è¼g`ÒV~^¯+½þž‚)5Où¼¤tª¨šzÆeÚ´V¡YDò%_T£dÑé;kïgëÃEpÿ#ÚüWZO°¥'Eþ+‰£û±p&–²P…ÖdÂ)°°Nš JJ1SŒ¥mèô!W¿.‚ö5þ+E³òû$Å’ˆÿþë'ÖîÃo²ËhÚ>૯ÇtÏ<à¯7íÖOk½÷½þ=œ-nØ›ýH›Ë·=ù?ÿ-?m;þNÁÂg·¼À|º©Å+g&O8M›rµ}˜7öK™óžû>ჂÌjC¦ßzxYÎGÖÖÆtcÇÖüem‹CÏìß3ùäGGÏÞ•>ªcóч 㼚6 znδÞWçv*›7×r²èÎ)K;ŒÒæêÔãÄ¢×/έ­Èîb}¬Å²®Ç5ÛÕ=õp·MkŸ4—[VýRËVë?s¥Õ-ÏðóW~;³(å™[þl|ÛºÉíÆß°q:ýÝî ¼jæÂܶê6ÆÞû§ëZ^]ÞòÄÇCËJ’û_ vŒþêÈqü>ûÉ'“›-Ÿß{÷,[Ëê}‡Î÷zcâ_Ú9_Ù\{dcFËS©Òéý¼µ5ÿ‰V‹ûØ_]ö®õ҉ͶòÇn;úùM3*þ±¢ýæi“n3×rëWð¸áÖwßy±ù-Coz!ëÙ¬iÓm5#ÚO/zØÚÊqóÆ'Mí”xgÑ 5y3{ ·Œ[kãç5ý¾ cÄá×ÓÎ-ýîÓáÕ;_X;që‚Îöõ›¦4qŽ[òd“ÓÍÊóW8ÜüëÄ}Ûç›Óök‘eÝRÞ®\çøö—εò3j&=[òÁ’«¾Ø6uù3ç­ëÞLønFã½o/êÝfó¹¶û¼lÍÈîÓ?*NXåü¹à—¯GÌ[¸wî°-äâå÷,ßxOþÞŠòS³î?UÀ3‹w/šÝvè¼ÜOß?Ûev—矚±{—ñëLñî®äÍ5…Ž•Œ^]=íÀÓÞúêÄÇŸn{¹Ã†î²›|üxÖÈQÕkd¹XÝøýÅ}ççÝYk˜>ö±G—ïéݺózâ­/UŒ®Ù1}g gâ_{ÚM}û|r­ef·++§vYrvI·+Í·<Ò­IÛÙOO¿iðñK ê>[±ÒÁwMXýκYSÚÿ¹4áËCOþÏË[÷í®mÁ§Þ›9¥QÑŠUÃý‚T9ž¬ GÕõ]t8ª„”£JjrT]DÐk §Jˆ;`Ùª§‰€Þg¼É¶@¤ŒèE "jl$Nb§§šºÔP§Êéù'Í•ká.’"Ì šÆ|öøŒ`Üs³‡µHp Ʋ@8Ær.ð€CI ûIßãëaZ1þIŠõ#ùS÷ ´ýpø”[—ŽíÚ®éøÜ7/?rßç»RÛíŸeÝб`âè‚!‹žz÷Ι–®Cn\œ4 ý…ä·-˜ñCãÁmMÚ/þâì/û¦‘.¹¡E¯u)çÞì©kz¥éŒCç~´™9ë¥ öegÏÊvcxÍñöZ{Îmz×ñq“—–ä—2›ûðõ·]yÕ8ôêˆÍ*~*¬]4laÿûZf,zñǰEóz%,λÑvà›5Ïÿ¼$óžÎ;ÇmêöêÔ­3©ËO¥'üxôåF57æMüey¿‚Ä/kÏ¿Vð5§åO¹CÉáÇ»\1\l·Áñò—gkÛ?^½gv‘±>µ¿ÄØÞ¼§úÎOW/L­þ¿ìäù½¶pÙàåMOïµÿ8wu»Á«œ[qô¹My#F§½V›¹Âür…®ŸuWo,éƹis×6?ü¿¥9oÿÑë•„ö¿bã 2»íý¦ãÚ•Õ¿vkÒfíöÒƒg'ìò‹.¦¶èb×ùOtÈŤ”\ìÅk‘‹]8Ük `Ì‹[½âÎ: ä|"21¥ç஬¸ÍÇ)‡º;Zº±FÑpFˆßK“ÙÎ!nÓM”¦¬f-SX¼³–9ŠöÇZv=Š%kY€µŒó„šƒLÓ*2ÎÑ*–1ΰ*æ±&k™¡Uìfœg4Ê<® ¿VsŸõê÷HNÍZ†fÁUaŒ$LÍ_Öá/hÖfVgC‚ÁÐÿtõC=Sÿlöu¢V˜’ÀÌÒÌu»ÄŽk§˜ÿÇÿñ¿bâ÷ã‡ÿŠô§Ðœð_ÿ1VNÑÿÇ ÿ•Bú‰S´ÿøá¿¢ûÿ1qrýóqÃEüÏØ8…þã‡ÿŠÚLœBÿñÃEüϘ8…þ’ÿê:ÿ£XÄŒ¡Sé_j—0îê­%E‚Ýêô˜ý ûãuPÁþÏ 0×§$úgá$‰ëtþ _üÐð1JÏ#þâÿ þâÿ þâÿ þâÿ þâÿ þâÿ þâÿ þâÿ þÏ5Ìÿñí…ÆÿáIqëàºáÿxç¼äN4¼Ñì½L)ý;,öO¸QºsMc´÷–k‚dY¼gë1FÍFðOѼ)íK?xÕ—ßµþÉÓƒªäI¼•%áÉ4–€%b’鎿è(itT(ÑA’Š·0ºb’â0À™,ˆò^¯Sá¸^ƒÿxЉ“\wïˆåŒ÷Å⹿.¹à®% N$d–Ã8ZÜMŒ}ÂÉN#bD8p%ß]\œËçÖ¨;O‰Ôá ÒˆÔ/b:TÍ-xS Ø® €”¤ú‚Wu‚ÂHßývPýŠÅûîÔxꟜ¦,yP&ÃÊd{º•Dÿ½CÓ21ØÿkËq£<É!¡”™^ªcè ­Ì(ZÝAÔ¹sP5d(™¤êK2AH$Oö/šeÂ’OðÒN3Þ.P g’Yy%r‡kÊãX‰¼a`b¡ÇIôMÅJÕ•å}l ˜Ö¨äùÊVÞã*zpÿEÀP²x4‡ _$¡ P*-U\?ÁéGsl2ã- XÖuTÅG6 A¤´ÙgTHTæM¬>N‹•Ò¦¯Èq8Y ¢=C f+¼·WއAÿ™—âOÊÅK&=!hÇ5ãêþýGÈØ¯ üýîáˆß‘,ä,BßÄÀÁqš²0øÏ$Œ¡S!ÅGzÖÆ[sC§¹úuuoÿ!c?¼.Hû§H=!ÿþ$qhÿµÿúwQâÜž=`þÛbã¯[,u[]l¿#ýöžïßÑcàóC¿¶f+“1ø¿åÿÏÞ•À7Q¬qåˆ(P.) „BKöLÒ¢RÚB+Wi ô”´Ù6¥IÁRú¸‘ûx‚¢ˆr±<_á ˆÊ åúrÈ¥(¢òfv³G“&M“&íóíüÄtvggfç›oæ›ÿÎü¿’>#O^¾–ÒÁøàÁ®×?{V‡èe Û|E#ûŒ|>)éвI¯|tñúGSÛçh]ï—¹E]þпpäØœàÀà䀷ç^}n…Vw Q»Hc‡F‰5뵓Q×¶OïzdJü¸Ð®i3ößë\³ñmî}000t@»KÝv_ ›ß&2Nj;Q²k]tçZ·šï ±Ú-W\D¶\O)\·õ÷R^½¼¶ý¥8ýjmɽßB^Y’:1|êzB»´kx«‡µ‚–¿Õó¡b§QÓ ººvéÅÍQ)gÖÏÿèVÒWÆ«G?n°£va‚|K ËçêÛl¹µ«øµ5+*ìjÚ20®öÝû¿nú¢Õ©%ûSŠNÓ†'l2B?"`vpŸSД´}1ÃK^êwì³£L#‹è×ý>QíéNŽßü«ðÜœé‹v¿üÛ‘=­eß·Z°t¯õУÇg¾ûÔLœ”Us›þü´/ãнfññ9O^5<ÞdGÒ‹«}£‹¡Ï”£B£÷^_´ìBÃY_Þ‰\Z§nI°wƒ4©¾ïãmÓ´õ»ÏÍ¢g¨7«¶¨?ë†-†;eä ÈŠ0r°ˆlå0rÈÅŒh™Œ' ¼± QRpË]¹ÜeÁcáÞ(ƒYBôÖÕ•Y‚tÎ,Aú›YsÅ,¡PáŽÌ ¸#„wd› )÷˜%HÂ1?%áð,*§Ù+”J‡gAS:²HÈqÑ5GƬƈEOG¨Õwoµ¹¸¦ᯂ?Ù롈L–¯¶Zu{[ÑHP÷ öC¨.èµ ¦»$jxªp¸º]~Ë·Ó éØld²X[Z:›ífÊÈc7ª2oW^S…©™­ù™ú¬Üº 5f¨Ìv%ƒ†›¡ØhÍhz´Ñ¬¥ej[m™üõ–TfËÀ«8Šf[‡ækÉnZEº+ɲœñ OPQ¡±•ºWnº­‡ç÷Ê51Y ¸JEšÙ@|±VÚ¨ “ëÁ_ˆÌÝþ›¦Á`v!Û¾æ,GÁ‹ˆº£¸S”Wˆ$„Ƀÿ NžªÍ5fwE2@#X]vJš÷d*ᘼ§±ÝyZÓ;W@áûÈìÐWo±¨-FÁÀˆ@ ¤`εfçZîÍÛ ÜR‰.ðb”‰åžE[!¼¨E¢h«XŸmo+dët©,L6¢ÃÈÚ:–6@=WërèÌ|#x«9Ìîanõ`fŽPö“¨fj¢­Ì Pn*0f L»ÙÊw¬Ì`â*‡·Ë¤1 sQºDÞ—Å6ÂCZ=¯ÒsáYH½ ±‚¶×Á“ VDoEÆÀ3é4ÜÿŸ™k芀”ÈØÄ˜ƒ‘ˆþÉȈøøˆþ‰Éá %h&p—M³ùèÙ=Èv $\0Yós&Ò/:>2¤èÛ761òë›Ø?:!é5 ‰@â"âc#õˆGâÅÇ HˆE˜:3=‡à*¯É¡ƒŒ-P<Þ˜ƒhž QìéQîV(’@ÓLu"ÍÙy𸛸ki™Z3·€1U+4 ü”;xqƒ-?˜ËŒ–PÓO6!|GB² ¹@°Y5ZM6lÒ̳‘mŒl£^«Ï_}ØTðµ4¦‘xî)Qg6j,HÉ”¥§AÏpè_V&EèH>EÌ }h†ÙÈv,ç·aŠÓÓ9 ±4¦,s®&Gë{¶…»Õƒ¶˜Áä‘¡òvvä\ÕÖŒ*ìÖÿŠªæ"Pvý‡Jë¿ù æ0ÒôÖ<‘õæõ\¯ÿ Ã¥å¡rJ!­ÿüªÿ ý(I‰ÿIâ’øŸ$þ'‰ÿIâ’øŸ$þ'‰ÿIâ’øŸ$þ'‰ÿIâ’øŸ$þ'‰ÿéoÌÿ$`@îñ?Á#Xÿß@¡ çÛæ!TN0QÛ¼ÂDqB iE<"‚ò¶(×H˜À:Ámø`1g¸=£a`þ'"†àxD¼,C~Á‘>¡8&âÂpMrS6©‘›r”‡*•9:k\L º9ÆÓ,@Ì FmMÈD®&1QñBdC¥«R¹Å¹§«¾‹©ÈR„6ÜŽŽHàè°£@á‰\Ü–Êql”-<÷96@À.Í{Aú¢R!Ð÷.Óù ’'Ú@AK¢ÁPŠ JŠIƒ4ü}% ÞÂæ*ðôQ8Ä¿=%êp§þLÏÈ$ä$ÌÔ€rÚ¡|–¹L!69â¾Ô=È¢ƒóºi‹p¡ïƒÉÇ`JÒ½ó¾(uU FP9­AŸn§rbb#Nï¼P¹²eæ¾ÊqS 7ã`*D´ÔLA2:š‡W)Œèð*¨,$0Â!ÏŸ/õ %™¹ºAañÔˆ°xBå…2y’¹»šDøtSaª’ Ó å§ПP> ‹¢žÌb•Rœ‡¿»¡**KP¨JU£²V™KUjæ‚vUa\.f¶å„ʉ êN¼ÐbÏòwW‘U"EÆÀb•p_lU™ê¦•£"E6˜³ü§ÅÜ[p†Y Qf¢ˆÌ$v ¾v¦Å•Sœ+–uEÙ 6hÔ ¨påAžªÊÐYLÐY8K(†Rì/…2¿>]ú1ex™‚-’sõféçYþnO¾•…>ss WO JvòÄÀJÂ÷œ(0HzŽ©Àu´£6€Ù·€YÁPŸ€IAŸ”L¼˜=ʿ¢ònq4@]áø¢ÄQ¡¢Õ¦×UPDРƀ¨Ê×€ ¨“ªà ëuL‰‹Q4òwWTJß~‡£Ä¶ag¢ 6D¹mZ:ûWÅyüŽ(ev&hb²õÌTe#ÍOU‚-Y¡Ùˆ×«²¥VA½¢½‚&3ˆbÎþ‚Gᯯ‡8”úµ’-’‚(¦5½â<È¿ÂCœ·†·âE—àpˆcy Ô÷¾5 pfY&ž¸EÖÑmoŒyówÛ˜¯,¤‘³b¹ñ<Ý3À¨œDp8›È}5‚¦’—ÂEP°R!OoÀFrwW ¨\´¨‚Yæ$/U$XTaÝX¯Fþ[MqÕáó¢å :0“Ø«ÕTåç¢?BÔ_¼š²ÚXÁìäÒ)”s¯ ?T‚:b"uÄ™(£ŽðWéû%[†R¬0¢% {×›%“‡ù»­’nï–óìsY©™‹€_7s‹‰ ö“Ø+ë®rŠóк#äX)ëÎbÕêÍNw|x­:Þ:1â^u”Ìjx²8ôˆGøv®,%.Vz¢® ÍoöHy˜¿ÛªãÓ ŠÔlœŸˆIØyAÔV[&JòQ&±õ@u*§8OUG©d¾8qª“-š|ÊwKè f'çõÈ[¨ˆzùº DŒ"c”ãÁX²¾ýXÆ–!¸ cDÉ›iœ qo¾—y˜¿ÛzäÓ͆T<ŒE‚Þ£â07òÝšG=Ò"ï óT‡ ê#ç»N¹&=˜ì€ð2><{§=Þî9díX‘·;UíaÍ[¢u¨oQînœ²r‘ ½›`|‚x£=å/ùôûâÿ©¸ë?&@–wýÿ¡$úŒ“+HJâÿñGH'P(­6ÍŸ!' %Ne 8AkUDº²ªë'߆ éÅ]ÿ1¡ý'IŒtàÿÀ¤ÿ~•ãÿocÒ·soQõÏ_ï²svóE3nØ÷¯GWõhþëáÛ3WéÖ<¬ÙñNÁÁ¯£ŸîêÔtnº=Ê’NË/_jÛyüíssÃÞš÷gÉOŠ’GÎï¹>göè•­©ï_5îϪõôóawßüÃd™wô“î6?ïéŸ.lí÷pãk=k´yòÅù1%îÕz¾¶é·ia§˜»ó®éÑò•ÛÆ?•¿¯ä“/Kþ:ðtå“ÂÏ n]’F·(îZ4ì÷.9ØGÇJ ‚Ͼ;}[ÒÏ,½ÛMñºi×§wžý-þT¯´¡ŠÏ?ì·}èܯ¿>÷eÓ7'6kÓ¡äîãï9³ñ÷wÂÚ,4 ¦Öœó“I†Ú©ù7®VÍüæÑÃS›,>¤KÞå³[{vÞ>-þø3_ §žë•ùÕºFí6½¼|@£eªáÍ/ßÞÖ07 öô:kµ â.?¾œüâÄñíÔ “Î_O_º-{ïøÓ»7¡wêf|¿2é±áJÛÈ]iýòf+õâ¤æ'þ³%ððvréû±§ÇÜoº,wÈÈoè'uj=>8¡æ÷%Éæ$Ìë­Ù>euztÍÏQÛk¾‘>þª6æ…AfnÀ÷¿´»éÚ+YuoÅ­*^r÷‡>µŠ¯Œ}~MÃõ}ïÝ{eß·s/×·<ÕZ¯gñ§ª­¢ÚòÞ“Iõï“Ýób^)N8C<3µG‡:s5µz½5¹~ó€GÑÿ lY,oÒâÇqçg'ÿ;<èä ¨„;]›¬oWçƒùs52N=ñìþ¸Ó»V‹_Vn»ÖwÞHl2>üýº^ž¨\ðûÁÉnµüÞ~åK‡F {¦é§hŵ~­y±ç”M£Þî°nFŸõ÷¢z-¸2aߪÄ­‰·÷>Þ{÷ÎÂY9ÃÞx÷þÝ)òx°ô ÿìQ¸@;éðö­†…5Šƒ;¬{ñƒûeöˆm=øÌÚ¤àÕET­°¡»Kë…tZÒñB·Â¾ŸÎl=ûúŒ0MËŸ·ÿø¥Åôÿ/ï¾q"v¹ˆZñ v-â§µX¯#‡æÈVtì ŒûM­: •O\Üx£‹dýw®ŸzÒ6ðò¤ïdõÿbìsI{>,ÝI«“7K§ïtÁçÓn/¸–øÆ…Õƒ¶öÞ:5ð&¶aœéÊ…Gd!ï_iD,ž|£Ã©Á# gÅìmýu™©»dGd]=ÚèñÅÔÉ~¹ß)êœuÞF:æLÊàÔu/ÜØr¢åÙ†º ‹v[uºW 2n¯®é¬†¿ï~Ø.ùÀˆ½ß[68cÁÀ9žùhË b}‡Þí~Ö\º¹çðÁUß¾¾gÙ²MO /­ýôß—æ¶Œ?¾½í†¸ ©=^m5ûBb‡ÁÇvXfê õI}|nï¼=Úˆ‘õ¥iŽ-\¹‹P;Ýòs{tR£ZÅMâ?<²¥Ù{/Oû4}ZPï×ÿÑ¿ÇÁ€3¶76¼U/ ê§µµ¾93q>ÕýÌê®?î4¶øz‚†ZwøðʉG›µ^xó[bæÕ˜9½6×þvË5ãúg®Ù6õf¢¹ÿœŽ… ÑÁk®ö9¾©Î[)‹Fÿ¾e¨îËœq³v,ë¯;‘Õlèî'7vïr¿CȆ]vš“º'‡„7Ÿ5<)1Ü8µÕu¬ÎGÜÚüÒº»äÝž7Zö¤'œÝdþwcV|·áH莺³â¶ïҬ͋wµ¾³vJ螎5$ë¯8?ýTFKõœ³'5(2pXôûÁ½ûåkAæm4ì—š4ü¯‹OÍ/ûLù䞦ýȰuQ‡7n¯ûÕ K{qN^ƾ¯,×ÇOè}82ºF÷#¢ô©:úüìíf. 6üÓž¼˜|¢f÷»ÔÓgжç=vênÅqªþ6m'à+Çá&&v¸É;¹,åpSfóÊÉúãü;¹ßd¶™“¸mOkœå쉮ˆ#NÇŠÀ ]pÍ΂ä¤ËЏÚÓYn-PWµÀUl-XˆÑu-ÊüZnñ"— ex#Å‘êîT)y#eoùÓ)áÂ)J)<{b˜ÊÑÛ'…©®ŽEËòF ´ÇÑ󨼖C¹ŽOQ…BápM…:xPÅä„C: U8ä‡ÁC‹ü5G¯¥D9^K§œQ¼ººÅÀUÙEús¯Ë[ÒÙñŠÏR0Ëÿ÷Ð+;ÿ?ÚªöÿÄúÿÂá%‰ÿÛÁný¯¬òǸ$¿;ý§«Zþ.ùógp¿`GæØV ^ù~ƒ Øþ‡ã&ø“CüOŽ£˜„ÿù#8ñŸUJöÎ}¿qÉÊõúæ´_Ù{|çhïîM|Ï™£7‘;(ÎÂ=g sé Š[%;ºƒâïxæàIÂÒï¸H’U^Ž¡¢~äøfsð çfZ³Q£7yé€N,¼Jq=‡ªÆõX‡¤³îU¾Û9ù¾Ÿý9C%ÇcÇc¬Ë<ߺcË|U‹`·þSUµýϯÿPÉþ÷G°³ÿ3«‡üq¹“äïPZþ”¦zȬÿ%ÿ~ vòO¯6òWHò÷G°“Fõ¿„ÿû+ØÉ¿Ê¿ÿ€Iþ~ ò€” ³Éšc6¤¥™i#ü¢ï1\þKâÿâ â¿FJø¯?‚ü×NöÎ`[Bø'Hªs…»ê]ö80w›ÉÔ¶/Ô 0¤Clñ€]‹D¸Âê"ÙGÐFG´ÎvOï– pi‚FÂ0­xÀæhs<~ÖöÒ^¢·ö-^).®T1®¶›t§]à —æØÊÃãHd (GÇôˆ,B´Ë1>Ð˸×rVÔ«XšRp°tíê¥@«—ÿf"l:8?öNÚÂC¬‘fc¶&Ãk¥ú±´ lEdl§¯”^mWR_½ÅZ ¶5S–É«˜…Í“m³„"¶´àµJå#ºÀ¿‚÷h¼?]‚æ%hÞ-h¾ªg÷òƒýWåû?$üÏ¿ÁNþÕÿÅ%ùû#”–¿¢úà¿þç—`'ÿj‚ÿJø¿‚ü«þ+}ÿõK°“•ã¿’ýçß`'ÿêcÿKöŸ_‚ü«ý/íÿ÷K(-e•Ûÿ²ö?)ÉßÁAþbm¡MsD®F³É‹S PÀ®¾ÿ¡„øüù_HT.}ÿóGpòý¯ Ù;ÿÈ&f?ÁäÿeïZc,9®²%þ0¢„”ÈI!±ì®ÈÎí÷cY/Øû€ÅŽwÙõ#Îz5ôÜî™éݾÝwïí»3ãñ&ûˆ$bA $$ˆB~XF¶, 'R$£r³ (ŠÇ #Ç–C©ª~T×}ÌÌí¾å6îÒ<ºªºëqN¯N}]ݽÛÓ »2þ^`zJQ8?pRöpOžŒèÕû¹Yp\q‚\>~»€æâÛ$æÁ]úQ÷LÁ/ ®öèÊ€ñƒhv=»>ÿÒs“ æ„}Ý¿œ4B깇éÐ{˜ kgö°ñ,Џ!ÝÞkïý?¹öNœÿ×þ·åÿ„NÿÍá[þOHàôßþ·åÿ„NÿÍá[þOHàôßþ·åÿ„îùß·œÿmý?±ÓsüÿÖÿ8ý7Çÿoý?!ÓsüÿÖÿ8ý7Çÿoý?!ÓsüÿöýBBYÿ®Ü ý«–Õîÿ8ý+Ñ»þ8ý«Ñ»þ8ýkÑ»þ8ýëÑ»þ8ýÑ»þ8ý›Ñ»þ8ý[Ñûü¯Àé¿!ßiŸÿ8ý7äýÏíý_Q¡¬ÿÕæð­þ…NÿÍáÿZþGHàôßþ¯å„NÿÍáÿZþGHàôßþ¯å„NÿÍáÿZþGHàôßþ¯å„Nÿ áÿZþGTàôßþ¯]ÿ œþ›Ãÿµë!¡¬ÿnsø¿VÿB§ÿæð-ÿ#$púoÿ×ò?B§ÿæð-ÿ#$púoÿ×ò?B§ÿæð-ÿ#$púoÿ×ò?¢§ÿæð-ÿ#$púoÿ×®ÿ…NÿÍáÿÚõ¿PÖ¿×þ¯Õ¿Àé¿9ü_Ëÿ œþ›ÃÿµüÀé¿9ü_Ëÿ œþ›ÃÿµüÀé¿!ü_Ëÿˆ œþ›ÃÿµüÀé¿9ü_Ëÿ œþ›Ãÿµë!Ósø¿vý/$”õï7‡ÿkõ/$púoÿ×ò?B§ÿæð-ÿ#$púoÿ×ò?B§ÿ†ð-ÿ#*pïÿiÌ÷_Œ–ÿ8ûoÿÛê_Hàì¿1ßÿ1ZþOHàì¿9ü«!³ÿÆ|ÿÉhù_!³ÿæÜÿiõ/$pöߘï-ÿ+$pöÿVÞÿ3 MÖuÙjýaLÿ‘¿¹²2 z++^ÜsƒhÅÞ€C¿¿²DÝpÙïï_XÁ&Õ÷ý[š*eý« `ÁMH^@ÇÂ;\ÿ~öÜ…#·zñªD]–¥N |7‰G‘'èô9ˆ#¤.«èÐáà‚ßGŠŠTí¨?&ºû®H•eã0\y_uˆÈñ0ºÃ !í® ý£èWàðœ»îál‘‡Ï¿-E^­ßoEšA~à×ÑÈ<y'â^Ï’¡4t¯ùø|=ˆÎ â0^—:'ãädÐMpåÈÞ¿&e‰«øLIê ýdÔ¿ÃM‚HA;RÏ\‘:§¢nŒk½ÇïB7‘j˜È ÜmRâreI:sá,-!ËB2\d upÍ Q”KR¹ !oÔGšl¢Î­§ò˜1·;Jüß*õK•Â8ìåò ™Á„ò 1ÁXyÐÏ Tž 5xÝAì&y ´8* $š—ê4¡œx¼NšóušÐ߸\'ô!.Õ`A+âaè7ò¸jTÖ9´b4^§MñuZЇQ©N êÜ.—ÚÎ.DH’Ö%²A¤ î†;p»`éÈO­@æÈOði;P ¸Lü»DÞZ%$úÑz²AáŠBTvú” gú[¨súÌIùx„®ï ~Ü'¿×Q°æ‡C?¿æ:Z‹næ 9´ñ(F- ÝÑ` JÚ8Œó‚ÈÇM”®“;w=xäTáF æÔNðÉâjéBb…S/“„^ªLºÔœ8­¨ º ²ÓYìG;àQ÷Ýdƒ˜¸ÄWü±Ôxí`;gÓÙ2WñÛA*®0“Ý ¼¤\+®t€ME“Ø÷Kõw=ŽÜpXNlÄñ•!\}‚1¦ ~ØI(ö|z¼ƒó6†«4Æ–ë{뻞CÆõn'Eq?=%ƒEøe[Ú!¸ÚWí,@ºŒHl(-uè3Ú:—ÙHÀF@Küø‡ûJÒÒË´žà1½´NÜÒ¥¥¥Âr ÙI!¬õbžÇÝè0":p™¨{mH£‡>¦_æÒï?L3pE0'Á€ƒºðP² bf¤jhQn¥¸ÒRa©Y³®gÚôî&^`„îªÂìƒVS¶òÜ$Φ 58¹R'Í%#Ô };€èPt½Ë'‚ôH#MœÅDéùEB&Iš.g^"ÅPÐ,¬p\¶G rù¹,-±¨ e—æ"¼ž “x«?z¤Ѓ­.x€þÛéÿ­að€¶ñ_(H«ƒeG‡y•*@H7 1Ø&IŽL{V$P«^/Ô ã¡í¼¬N? ƒþÐ_Á9XÁ6+¸Á+e±9=d¶•éÆ`üR`‘–¶Ð6Jn4Äë~i …Z(ê’a«À/öÝAF‘ŸPnhäQ##&‡¬æ‰Gè¡»íˆñý«ÒÒE:IJGàSùèò`.uá¡Cm#c¬\Ü4ù>‚Åè² ?4¢³“Øyä’Ä4Ü0TjMî˜e&E¶Óé¹[ô0“-xô£A9IZ*—•Ÿ  áhå5öb¯¥%7Œ] eå0<@šÁÜõT¹ ~òY,l–óJúŠ£´OEû°“I&*l=¹šÒ‡dôõ¶Gý~©¯Æ›¥¤¼À,+LJ‰´ˆuHÄÝ,ªÌm1?WÎ\XügŽ¥«þÔ)º€—õ,'y6"J >ìଇü؃õÙ ÞL•­ÐÚ²T 0F†=æèáhࣾ·†3:8ÿ=pCè†þ9ôsžÛñL§ Öíå¤FÇã«óKî¢+RçÖ;ïÌ0g÷a¤ì:Œ¦ê6í\ªÒGˆ¦̺œiŸ\D'¥ÉM©·ºÃi–é(Žl[áÛÞFÙþÇ‚ŽGt0Mj)YÃB{MÓ‚–Z– uÍAù$_ .ÔM#·@SA†n"ËF¶l#E—‰ aú¤ÙØl)Óv¨È¡íYþ áÑ&)¥¥å[¨A µF0  [;V~ÚÕ]5¥±Ö’µa®P£aÎoíjÇSk_q£&¹®ïe¬ØÝ~¿6ëßÅÂÓe&‡ûÑÌäÒnf¢Ä'Ñ“ÅÔy©–êf RÅБ­kcS+ßeïSÇä?²ÎM,Åœ’‚‚Ìdì´šáÁ0tdY…P@:V† #”GT +-Ñš¤{ùD«±Ñ¹æõ:ª›eç6Lkê8}ˆåº/O}v2s›+šrõíŒ0’u¹pá5ò ÞסcWHMÀÄÍ= ¥+%SÓµª¦¼ÿò÷lÊç¢k0j°‹®ËÕ6,zìíĵ‘xw„ñ™µbƒ q¡e™õ™™èœ.zõêvqÑ5{œìÃrÝ¿)3\]m.zõ½‰à¢kJÉEWꢧO4a¡±.ºæÄE×jÀYô# Oí’%2O=;¾Ð[Xù{¶t“sÑñ;®°;‰_¼Tå‘&Yæ-ý-qÑqwŸYÓUÖgÆd|f&:§‹^½º]\tMgëˆt÷í¢O0ú»èµl=Ôä5‡Ql@³‚X¤àǽñ‚]!¯9#"7LßcrLú 4±Öéclaåï J›M…¼OPÅÓŒZšó;žÁ.Ø7âd¸éöÅ>¨@û’?9`“hf›8ªt>Y­ÄÎÕRÝL(°ÉÛy(HE;ç“K…™›ËNí;•Z6²öŸÎö²F^lHì_ÕK*hŠC(yü^I"g¥µÿYº*m#/ /8UË!»ªPó¶ËØ]ó#¨v[¬3@{“›$æ&Iû˜ÏÎ¥è\Î@ÕÍD 43Î×åÂݧ3@¦Lz-Û]mÙ„<­.,¨eO ƒ:à¡­á­?šFCÀe]ì€á-?}‰À-³…‚ªr¸­?* ¼õGÕ+°yrÇ3Õ‰P ~uö‰yŽH-¶âe=eöâ0Ñ9·þT¯n—Ç–TmœØ+D<Ça/¨ÀÝó_ÈÒ¡–‚Å3]x 1~k°MÝ4º]Úø£ê&Ùø£êô©%U_0cˆ·ÞÌ0g­2\ÌUþ^áB•9ò_qdBþ«JÆPæÃ'öi?rÏ ÑœÁ£½cÈx&:'÷_½º™Ü?LÎ8abÝ.pO Ôbâj-›ûÇt+¬øñ†U‹>%€ÅÅR…*~‰‰Eb§²_´Gðö6ñÒÞ>S.¼)«Uèt<ƒ}½É }£Xv€v†qÖ•b'‰Zs‡O¶*…µT·ËÚ@1ƉÂL¶s;7ѧ²^ãD¯Vß¾WF&þ<Ì÷ªA P,µDPaa$ШfÌß0x›£€Ê½Ë¯4ð«7­Úî=™½Ë?ô£¡à÷¥]aÞ-¢( eG;˜e):ç«LªW·Ë«Luœ!¤’­²©—5ùÚfÿê›ùÊvoƒÝÃ0×-²Ê"v¯•©AEµÈ[LðÍD"`µµûYv_~÷!~ORÁar*ƒG ¦V¿Ò{½8Kå‹sü’›bmNz™/ÍU&6Pµª™$~‰ß£OåZíOr ðU^~Xjyñ!»ú§ï«'SppÊÏã» Ù?ÐÁ¢ïX»®R æ*ÏÀPÚöRÓ0Oha—kn`ÐÁP'C²•oÄ¡'HŸrƒÅLsa°6îhn° › ªV5 t¼¥u6䢭X²pÊJ¢æ „j-ïCdñ X³±fÒG€X²D‰B¬ì_‹Óñ¢´·$‡oÕÀoµ…&û@ñ¦›t7<ÁoA#=aöþÄDÔ‚·ÃKÑJ,aÅŠvÙ`4ÎfÒÜ0&˜tíBõ}†eƒÇ;`é€_œN÷¨ré^"~g‘÷!m,ø©€·©¹§_ü‘²OûHyýPÇ]7ÀŸ<¡ßk¡ŸùÀ€Í“Óï¿*¸$©¸öÔÙÓÒ[ýÜwpØï÷Ÿ{Þþ¿Ê À7ãûÏtúýo]3SÓñ÷ŸuÕh¿ÿ,"è®íšk«†¯Y¾oªÛ5}ݱ}Ë4µ5Õqßêöµa±a¿öîÕ¾ë˜mÿŠaªãßoí_L8pîäé#ʲ&øâw?ñÉ÷3^½,;Ö¹ƒ~' < t¾s:ñW;§ñX9 .‡çƒN_?#m}ê?üÁøkæO>õÊã_¹:úÛç^ùÄ•}æ—ó}?õæ=?ýq÷ñ—oºúôóŸÿÑÓž8ÿÇžøÜ'ÿï~<ü…o|àÑ?þþÚëkuöæ¿ÿ›Ÿ}æ¾ÿZðês?óÂ-þÛW^üÞ«Ï>¼[¿5úµ£_½úó÷üÐϼðµØþÎÓÜø¥x÷Ÿzã³—7ÿðágïúô½ç·4úô“÷þËŸ¸9ºÿ‘¥oþÆ·~ñ/“ÍÿýüÃ7Ÿ¾÷…K¯¿ñõßyù¥¯<úÃÛz/½¶öæ?¯|èÉá{?rü¡÷?yõù/þúƒßýÜ3ÿ¾ù¯ýÌc}é<µýÔå¿ùò}_>úÿô­?{ü]Ï=þ{+î}è¿¿pðö÷?´ó¼sðµ÷ýç(}éÆ}ûöWþôγï¹ç{Ïþè³æÎsë~igyën¹ßùö§Þuïn|}ãÃÇßýÒc¿ë¾øüÃò±ßóÉÑWY_½ñÞ{ÝòâËç¦s¯?øÄ•ßþóWoÜ÷ÍçyNþÈÿ±w%ðMß¿€ ·ˆÜ2•¶Ònv“ÍQùUZZ @¡¶„¶Öm²mi6Ijr"—ŠÜ"" ¨( ˆ?EA€Š\^€?¯ÿ›Ùd³›¤›zñóóù›twß̼ùμ™73»óÞ°¿òO6õ“^øæë+OðµfGZ~öêÄy‡-mæÄÜ6³6.çnýÝYÆ—ÇîpþÝ¸Í ‹„¯o…N¼ôÖÏyû6¾}áèˆ>ÛoÒsÔ¿¯žÒêó7Óý:k£5y-ï<ÓèÄ«;¢_?èdz‡ MsôIüø»®/m|°ˆËÎí˜Å–r“Útgö%5oz¦ÛÉäß½Óàh·i¿ÞûÕ{V&ƺšþÚªm÷üq—L‹}iF§ ·´N‹úiÐùw¬ÝaÊ¿0é€yæÝ;òÚŽìtóªÁSצ4k³®ù¥—§E5¿ëÔÄèËÓç·šd*ùzÿϵ}|Òbê Çw7Õ8<èÇø.jPl:c89n®q^‡uµï½oäã×m\ÒðÌjíþ1™ºíí„äSÛwÒ%ß\Îm5¦Þ&,X‹²Ž·ê‡Ïú/Œ¯:~ø†~;›7).ýéâ\C_]ÿ½\ï ©«—îÐ,(oxë°!QçuÞönÚpu°hÚ—³Ûßþ@ÇŠ]‡_Ø7÷«v‹O^(™ÓŸÖ85Û²ù~ó”{/âòÿ3æÍ+›2:ìß¿¯ùÁ3 ÷U.íÈN¹¥xÆ»gvÇ›¾(¥0ç³Zí;Zª]öÓG—^Øjzqç’Ám»¶KÛ‘Ò¬´aJF¯Ci1qq®Ì†m§Þ1:·ÓgKxý{Þ†wR¥·¾oášÿÎ{%1fÜõ™Ùó_ÿbõ{Ö.]»ï_yjqü ƒÚíÕä„è¥O1M>XÓ£ÅËä~i¿~ýâáö‹ßo¹~ÎÞY3SrÖfqÇÄ ][Xøüãè|AzeWÑ b–/;7+Î~ó–ý‡VO{±Çʨ²º9K§_j“rHøüž3]ºîVúÈþ ³ï]×½b›ëã{÷œ N6Ó{Ç»çÆ²]W4º¸ñ4Ó6õ­îºR[vñ÷»õõÌ¡ò&ã{}ýñ¶cÜÆ>Ñ­»¸óûúož2Ï-xeØÆªñ[ŽüòبFÖ‹å]cb÷´žü˨5sLÿ½2cõ[-ûíšûùãÙÍ´lb³Þ×6Ëšs Äe-ÙœÔtܦV›2›=Wë}çɸu-®¶O(˜<ºË÷ûnyvÙc%1Çþ½fÁ(ËÍ5Ës/z/?bŽ3x;zãO²E¯í=‡ ÏwùjùGkvó[çì¹-æ´÷ãylímŠ:±hÁ¨ÃŸ¸Zôh7òó)íN¬Š}t~“Ï2vNïÈD¸Ð1jåàE§Ÿ]—›”üXj«=sJ+W•/Úþå­Ë~¾¼å£i±» ®Ýû´ÇT}ÇìVOçNXýôåø•ÙgÛW§;Oõ:6£mü£3N_y(7þ¡%ÃW¶òfîýõ+.¯\µqÇÌëîZ<`xî®ùžœÞzÚ¨•m£ÇÙæÿ­²p—‡g¯¡ÎíÛ¡ós®Y ;žÿâÙ–‹ÏßÙ²ù¹GÒGL¹e]Mï+ótÝù=ƒ·uþtÅþÚŒ¢íÏL\wb똘%ÚQýJýqÐÒ•óoœpfÓÓlëú©?.3^ÙBîÚ`FÏ&ñÐB÷ô¶/Ƚõ÷O;²º½ý×76õ)q¸?yѱ_Žt~髪ÁÓ>ìù䈅²O¯ßâ*ŸaOùvŽaú†ÑšÛ?‹ñÒSŸ¸}ø£ô¯nºå峇']H߯N84|Ì)Ê;¹Ç‡¢ú`ù±¹íf6{«Õ¿Z¥+¾ñÕÔÏÛÞøÔÃçtçÆ¼Ÿ52¦ýMwfòúÉ»yó··tLx]Ÿyu]iñ'm.ºôM·Wè:ÐýùoÇh>=ºó¦{Z'¿»cÞóá-ï‡L¹RµâPY¯ïž×¼:öÀ¢Þ[[6èÿhó^åÑ ¯=T.ÜÓótmÏ›Zû¯ I/=³å¡]7¿óÀÛÛ——¶ìsøÕøåac„¯VNŸ™rjH«|ýÙ¨è]=îë6iŽv¢mêøæ1Ÿ¦.ºâçÙ«,™½MÍŒ¿sÙ×o<ÚfÕ©òÇÞçʪ×Ï6~ùîV÷¬V‰ôë´¬âêÉ!K&Oüò» Gžy±òù9üîS Íç÷þ\Ù<ã…{¶6]yHºqÛtσæ}:ñø¹(GìõñQv¹}Ä›y'FnÏ™µùÎiÕ ^·éóo··¿ÐnìåůÔ6x¦×¤ù-róžùarÏO{tg+ûŒ¥»/qÃko϶mæèŽû*ý¶WoZw˘Wvœ}~ÙÖÂ_6¯lX¸öÑyG϶;Ï7K^Xxy»æj¼çôÛªæÜ}ï¶+Ýß™Z «hßð wxÈ6ø†nÚ¬5ûiúÀpž[åâ)¼§2y«KuV"r¤®ïøÌ •MξDZˆEÎ{Öá‘Ⱦ]&n`’%8-9¼'‚Y¢rùJ¤K¯ô Ì!Iu¾$ð©Ó:=y€i•âp8=î<3!ÐZñB‹F¼ˆ)i1 ÍŠƒx1Š“x¹0"Fäˆ\‘ #raD.ŒÈ…¹0"F䢹èD.:Â¥€êð¡܈õ—ÀW:©:©OD*Ô¨!6«åiÄ| pðB в¤´R…óàsü,tAYƒ$'U²†ž•‰èäd_DsPDR×ß YÚdB&#‹ü5ÏÌ‚°üïcµâiÊT ¤‘Q÷)•*GÀbô½m%/[¥ü‰8ë 7"“Έ°/DkTPσó"¢UáÓ Ì¢}†‰6«ªßQ]ñ0ªxð;Z’ÑDGÂá„ ˆXt‘„e„>„…eÔëT±ÔÿÀ’ˆ˜‚•T&32˜ ›idÔª·àßp*BDP¬:(–ø¤݆«·êßât="*ƒzÓÖ!ƒ7mì”X½i×Ó›sD@Áj*¤=a‡›¢#Tõ¶]'²1™"õ|îÿ,«ÞÆëë§2""u 5¤‡†$:ySoá¼âE¨ëjÖD<1&¼ÑJ½U×ËiWD8êšÚ¨GzZ´³ÓëÔ›s¯B¨«h#M ÒEU´šO”ˆ@Ôõ36sÑ눀tõ¶[/— ᨫfÀвH´Vo¸‘mÆ#bQ×Èø>lB‰?=›ÔÛn}ìW#¢Q×ÄdŸ¢™(>F¯ÞtëoB“º2Æ{PÍ´hL«·bu;ˆ8Ô0¶Ð€‘JܯވëaLŒºîÅ694Kf_´.¢îUßÓ Š.ÂL&]F²ÕʬÞ~ë½Í2" uý«‡îÛ° oU@¿e{WDLꪘ…FCL™ˆz8Ò’ˆHdº8ÛHdÙ²¥ L5f›4&e¨¬¤rn¯‡©A¼½œ÷Ø,œX.L äŒIt ½¬`ÉmõZx!6=' ,uº=0m´¹<È”H³Pˆþ0=ÂÛiÒ`m›–Ähi­VÏ 9#„g:­u‘¤N!Öêô r^pãM9L"ƒòc3á.‡wáŒ.Iÿ hDnÄhµl~$MñzJ!e~,ùl’‡†r‚è¹6'Õb¥Àk´HÇj¤¯½Zd`±åbä£1Øí‹âðÓ Z]ÁÞr‚iZ¼~PÒð7¥`m6‡Äc°GÈ k6†‰2˜f`Bò`ð šÁ4s(>4CiØz-˜¦céöULÃçåÓŒ¡åÕ™õ!øôZcHÙô ßÓô¡yè ºÐxÆ0y˜éY²ZCH<–ÑêBhØ(˜¦7…ÆÃg±ÓÈÞ™ Z±fyß.²eÍ6‡öŒ¨l'ôòæQŽb'_BQi(/ömjôkÍ&o~b—µÓ¼ƒOlžJ)ÐOhœà!ÄÝàÚï‡ úþk¦þ‚áÊôgp\m*Ãòr:|e àÓL2PáÞ#‰ÉÑMZ_Y•×åR”Hvg…‚$1ôÙ= ¢È¢ˆ¸˜,¥¾(ÅÕú§>°ø÷O||ÄU¿oR”ƒ—õxãp¸™_#ŠÎÊl0Y·ÛàjÖg‚³Â'lZÌÍO ë×eŒÑn¯ÀûŠ Ðaò_ÓqÌÊI k~ÞÄ õåô”B<¥0ŸJ³¹=xÐ4”?uòdÔªAÕø]™€KÁ”lˆÄöáõH3~œÞ}ûöF°¤E½““{#7WÌ#§p ¡|9hp°—Û,xšdç%^è~vÈ)jªi) ¤æ[¾HèbûöƒÉbóÄ«XP´ää:¢)‹E&¾J¨´ï^ùÈ€ÿÉ^áÃaíð=.I(Ë)àoñÑ'‡ÆÿÖ;"‚Õ¦_©[@‰úçQ‘i@߉Nš&g)ëhbÆwK §ihLAòE‹¿Ñù}™ü^ÿ3õqòøøɯ”Ád$¾±?ê~æpd]½<ÜÕå çÏÉNÅ— kyÌÍ]˜·Ïqš<É= ¾1$™ðÞíC]T‚µ”8áà°îiäE×¼û‘²Üû©É #/JüEê‰Ê°½§Ôïq‡` sf²~p„]à¨WÂN µ†YÀ/Wýʧ×+ʧ××·|“üboEa„–'±¢Ñwá_$ÂÀE}Ñf¼‰õÁGî®-H­Q/ñax!ûm=PõŽ0ët¼FîBýµ…óܦ<þ!,0lÚ ìª7€ˆ®¢äÎKµˆxy6!Úüü–ë(+§ ÿñ+%`öuœ‘"Éß^Àà —Ó÷¨•?üçc4#Õà öÖ]—N—U꟪ÛIâp:5àÔ, U%)ú—Õ’Ì»J˜>Û@csG¡À[ ¼»ê¦OEÉ*A²õ©3«hq™˜þBmþû„ª7LÄ ´ŠÒW+Ο¬üÿÄ2ÑÿCUl"çñZ±?{¹-,¶Sñ! 4ìú"Qù£VOu͘•ÀL‡/€d]üW€W$ ãE9 N£Y'¶>´Úð ö—£ ÿèoýƒâU›Á¦0®Œÿà+§º¿iæ 9™ü£N¨Yr4uÆçS3 |ð'püù«`lu/wQÏèDÅ`“´ž ©¿×Õd†^¾8ó¯Õü«±ÿcïÚ¡Ê¿x*Šè¥TH“¨í!sï̲*‰…èa˜Q†¼mÚÚR[”(åW)z—"¥7¥ì†òØRz°* )´züî÷Î 3ãΘŒ±ûÇúg|çq¿Ÿsî÷ñ9çžï9à M†ì®BÉ iàÐx&“¥|,‘†Ï´frØöTŠWLþýÃôðôÄ—‘Ï…Ð/ 4»’äUæ®$Œ¬“$ñT‹§Uù˜Ð" ZÛe$’LJ,¨˜$ ]èè7!aVåæï»Z­"’ðµK€Ï­°ˆÔŽø§ÐwvÑþO-î/;ƒ쬶μÐô}uä‘B½ÐHB½0=Øl‰½ði*$ZZ\B/T¨c/'¦›Î'vPƒ 4¥T"É—Á›A=áÏ7Ÿ:nul’D‡8Üòòs|'xÏ÷ÑC¼!8ì6üŒ!]æ*eɆµ#8ÒÅ* —…ó°r‰È,ÿ"ÅÅk—uc€¹)bäOËâAâRn $7ïˆ<@ ­à¤#.“Æ–UYAŠ[g»Š;ŸÀ£øî×%0LÅ* ŒŒ7y¸*” ™dJ $vªx³ä2;½“Þ¼à*LH ¸NqáM~ZÀgdC&yÀd1Be­l‚«²Ý%SP¨(“!£Æ%8çÝcdRåed VñÐ EfËPrˆŠ%€Àµ2Í=¼hvNÿIØã#DÄrñòèÄU/„ o™é-"Œ‘-‘`¬€û gKEXö놑D’d™à‚”ƒY" RúçÌ ‘Ž‚ ô­Ë Ä SÁ]W,-ÀèxöY.¯¿|±‰ìÊâIÃ{N‚áeqü=ü=X~ÝŽW¾ƒœˆCf^*I’~}¾ /,´¬‡µÜ~aI'dꉉ‚Çd1‘dHÔ¹úe¥c²ÖB@zZ› Œ%¥C vb¬ò‚t ¤òI "ªP‘ÈTî&-;]£ ²B ØB€¶P»·Ët"@×€ˆ *Іd(ùÆ6dÂl|ºfÐct' OoT¬Š_O|ùZ÷’¥ð[wt&1¨BU,]jíVº†-OmËF§| Èщ‚òƒ¦¡gXÑwa=–ÝR,_ö_w‰¯ah©Âh©R£E¨ø¸räko NÀY”Tv l¸(»™°I •„·qöcÃÀxÛ6eÚæÄ T©¶9 ÏoƒãeÎôà°½å€Oh£nç"›·4"Ðñ\<˜nÞ^>ÞYÂ5:Ç/1 Ÿ)Ð4<Ç'šíáëÄð•Ù9ßs;ËÄ.>l/ÒÙ~]\¸TGñ SÁßqç±Dê‹ ,¬ˆ"Í* dú$êL_I<½#3ÿŽŽ% %K TˆSнAr$êÒß®Žk'&³/B7³x™åÀu‡ö»p(¸2r{<³S ^ áòK e–r€„×…„Ë!$¶k5³[1‰8TE¾Ò5A••C€@ÁvW‚0Wìê‚­E‚®>*ˆF¹Vꉈ.TîN-3ÇÚƒX( °R€c釻Ì1hƒND‚^“,Ç`2™D|Žaè!‚Á•‡b†`[.hÁí{øª@³ £;:“0Fè0ˆ O0¸Š•ïA+þ ;uÃÂÚíÎ7j:æf¼b’€Åá”Ä1°Îˆ^g`#èro8‹¾`—Ž×% ìÞF!wÖ³„MY\hŽ6·«6†Ão•¼° ›”¼CšÈ|!hÌ‚;bÛª£øuYg;kã\wl³8 Wt í†áBdDÁF»ìP:»qRỈA0,´ˆ¶t‹˜0ÇÅ_­{ò¼¥î:°*€˜.ñ\¥Äò>RÙ9lÜ€²%@ÿ¸,llo_/Fw<\²…. üø þÓú6t+|÷î8¯'%FÉ+ ®¸^Ѷ••Ébwƒ/TªµUHT\¨$Ü0îvB!4,»¢í®0. iÏí°§ÉSŽïÞöðpƒÂùt’²ÉS üû"ùÈ‚ôö-MfûV(†„J¥a‘Å4˜Œå¤Æ8<ÒnßÒAHÝ&ˆÀ–G®‰˜#»}‹šÙ¢¹‡è4Áæ÷Û·tÁã­DÔ&§‚]œ£ÉÌjÙºâ[¸‹yuèzêˆ+O&>K¢µ'¯h“´Í¥ µ»rе›:”t\HGoE|d _ÇÝjîÒD·°Ž»\§œ‘+®@ÆLiÂH " š,l~1ýÅÛ½m¢‹[·ÚŽU`—&‰@K°p;ìR Ó„…†¥‰uæ"ƒ$;óïµɲ”w¾ãbÍ…O”-7SgÙ„ ÿƒÒÜczm5=eòË·MHÖŒX%Ã&MïÞMšÂOa*ŽÕ$,ˆ*|þ‚x§çý‡DÂVàùF Æœ"  8zç@ w Y¦ SÆß§ú{ôT ¾8.|r{2¾mÁ»BÍ®„vKwOÑ $pœOµr8'Ô}ßYà)I0ç!·)MÎCI8 £ŸƒÃa‰IÄ(Ön¦s °0PXj ¤„àÈýŒàÁ‰iBA’é’Ü`ÿ4‰®/\”r9É$T*®»‹ìïÀf³ðtÒîÖO2 ŽdHào†‚¸ûïÁ‡àìð^Ø„´®!ÎÐ~Dß3á á…@¬dssáË ¦ |Ðî°’Ùùóy ~öãï Ð#·;×±&Dâ¾MD°Wc¸;ôD»Ø aûôû9 /7¾ ? ¾JÛ'܌ּjÒÜÌæÜ„Ø VZÛÛ¼Ri¸’JûoåQºëõÿ¼˜ÒÖg”\ÿŠcõÿÈ$夨ÿ‡ÀðõÿzâÏDdÂt‹‰ÎD…„ba@L†+ÕâJw둜ÿýýs]Ÿÿ¨ù#e’ç?jŠÂˆpýW˜„.¾ÿÍÿžøÓŸonaM%©èß­ÝyDAmgoWOùÜ2 q¡!:@Ñ;C 0VÌÑíšÉBíbnú!•à¸:íÇœ——®Ý˜a¶ÜI¹vkŒeôÎLŠeTßÒQýBr•vè\YçZg´ûñºÇÞƒÎÜ>úÃÏÓ'}ta”ž° ?;éaÒ®ë÷í÷¯wû¶âGƒŸ[“ þz®Qzà‹ÏE—Ç·fôwd.­ÖuÓ§®Wam¡D”)NN»Ï¾ó"ßðóÕV¿%Í[ë×^ðsíš“µÍ‹ÙΊ£³óÙDõ€={O>¤ñmù×qU±³².,á¼÷üôxŵû†‰ÖIŠ•÷~]:5þ}Ä“ÈP¸QÇÏ#9l×½ôÌ¿½Î áñ%jE {Cï§y#Ÿk¾Îøîó@j~('pÁæ–û¬±þ²ShY¹ãÀèiÇì2¾¬Ù=9dÓSï÷Oþztó|## lXßppZ•JY騃~7œ•Ccgë)ëy{þÆ¡ëuutNŽÜ9Lé\ç—˜GJ>O«Õ4[܇߿f½nxET¥8öëùj#bè³kŒÅkïß|žÛ´eóñO¬"Ã’5jGµþØ«ùó˜a¯–º¹Y‹sòSísV×d÷üHoÈâ×ôØ›Œãµ,ZvöýÉ2Ùl;@Ù®àmvÆIËÌ,s§¹S{¥%pê‰5†µämêÕgõÁ{=ÑgÁp›ÂS ®6f¥[ni>÷\5ðUÀ–ýÊþÐR›"Ÿ¿õªç$Y—2ò²cì︸Õ*J ynŽmU|}\mðÜ»»}s©Q£ö\ NgÖ+Á¶Â…§¹±3W}*c¯ùoHÓâUwöE›Û·K÷Xx¼È.ÁpÉaíóÓ;¢|^ïûf{šC‚÷ö«~QÍ5Šg¶·Þ¶žŸDÜvKïN^ÒÜÊ–µç÷§z¥Þ™÷cÞbí'Í%…ÌD‹WY>ß¼m,i¨rp„nå³…Y´Å»T.õÒ¾g„Ÿqeá ³ëâÝ×>ÓX4»´j;žø-3}—qmÓÞ銓õL'U¤ ˘6KYËövÜ_ ÌLËiÞúåiá©j§èÎCü«c MÑ9ÕgÿQ ›»Dí!Œæ°µ)úχ¾äkìù«Öúq­IûWÔ6œ‹‹²¨){¸<(d@‹Ý"}rħmVŸ”Ëì?mS>D¬I=ðÌÛtvî.ãÓƒu;αŠ6~6eˆ¢ÕŒƒ7Wnã¬,©1ñ¯ö}ÌK}aÏ­…†6z¶N×aU4õ-°%~³9|îá¢Êþ#¬œ™)yWçg).(N/û›fÖ¾Š.NH³I™û¶ooÕ F·¤‹¹7çÿÙÏa¾­öî?%õÊ\{ utDþ¶j[/­Å÷Æôyݨit¹Š½V¿°ú¼—ôßM¥ùí4xS'â¹wÜŸ‡¶7ZŸÚ®Úä9¦vaÚ…! Ç.u,Ü <¦ö“‹Íޝç\²O˜ì8#wQúÑÌa£³éÁ¯oÆ<ZPŶÎ~W’±‰=ôy«Î™oFlªt²õ;mía9‘¥}„¾ç©ºšKó-³(“ï5 Š vµ½™úê÷Õ´õu]ñ!Ê噑ÕKïB>\p¹ÒºÞç¹æO¯ #n¨I=hÿ¡_ßߨESž998=.1ËÝ5dB¹‰Yúé¢d‡³U6-- rý‡jëèn¹»Œ>÷íÊåGŽí]—v.p‡Ýt‘&a²Åß¹ëÜú?xøµÕ×&ÃŽ`BR Ï›PW\égjÎx¦äLúíxø¾Åå¾–+­Þ…nÝ8sc±¿ƒ )ÿý´'q‘“q•yÈb‹þÃãÔ—l8s¤2®|ïpÍ•–«¬ÿ´)Rô±1ÏW‹{Kž5äÅËã)ViÙ:¶ŠkXû>zÞY½Ö®Á,gÃü,ûTý3£8©öS ö¾¸\T¸ÆQsåªÞ^×\˜‘Ÿ\’upQÄÔ&“~zœÈ7¥>:Òû¤ç¸¦ƒ—?õÿ:ÞvÆ6ÓÑõµ‘ 1Èàª÷Ö…7¯9SV¸g]¨­k¸~5ÿ³Ñfí}jÎ×Í“­óÈæÇÜ}.F“fMSðˆn°XíæeO²ºœÎÜy%÷ Þù[C÷~ªå*ßÕ‹ÞaD^¾³)ëë²¾ã“/fdü9B7ÎÌh6ýÄPðÆñ^ŲâW;•‡ êo6ļI)z¼£rbæ…/wÏ¿>a›}k‘ÂúàÂ@“bT&5‰”äB«Ä5Vžtúªø.¸€îÔøê›¦s­Eüº{IµÉÓã´µý c¯;h ¬|[ïaÃ$}¯µáßÇnhV%õæ\Û¼Û¼!ðs‰RAøMǺÞîŽùwlŸÕ¤^¶9™è™cÁ®Š¬z˜­íµ;4íA¿ª†È÷žÕuç#ú)N<ÈN0)zX½eEd§¢IÞG~QÐ15 ½hš“±ÖzbBbJ˜–»jz½ãþýk?]xiú^¥€¸ü¢’%Æýǧí%ž'Î PÛ”ÑÇñ×­>†K²–x6YSÎü2±/112inä;—IÈ¥÷a§ýUGV׌™ýSNþ‰',ËÏuY#çÙoØÈp&«qæ-´†}j8å¶Z¿åÐô¹ìßnK¶z’¢âžåSUբϦó\çЯ+®Ò+ 4²*Ó{z׿YE¡ÂÕ†¤¦ŠÖUGFD|Î>vØ©0}Üú±ÙÈLÆáÆlƒ„ç“_G¦–~r öc¤Ô¿tÏø±Ažê{­ÒÍåª]3Ö¾Óo¨‰ñÌ”±è›*÷lðˆM“{X1fæþ˜8G"c{lVXEŽƒºRÅ•ÉOgYŽÌ¦Ù¯ZþÌb–É„ÙÓÒNE:Ü9:nK ÛfrQf¿ekàéO´ÒOø- bü¾F™ÔðqˆÕ±€}6ÕÙLLP¸G‚ûÝÿ­SY¸[N꟥Ÿ=†›gd5âLׂ²/+ÝØ±Øô Þ:_•!ÅVO.V>²`9;krã\Gx¹Iá·QWBI ôcÔòMN~8·ÔÅýÑ‚k6ë„Cš/úݼ{èèÊø+VçÔ5ÚC'¸ï7Ýýnµê’§›ô¢-^ÿüCô¥ñ檯:§¥ …D¦æª2#[ÃÂçøR›|L@&¡ÁÐÚƒéGpVá^m”"ˆ~ «ý Ã$få_‚$ÒUD•mB«üŸ½'Ž«ºÒ4FSê–„­%p^ˆË€fþ>3‚K–§¶±*ÉÇ£Êf¾¤æÿÿ£…‰ ÐNÐ4œ¤¤\Ö9l1II kOÓZÜ„’4 –,`âÐ{ßßgÓhFRIê9²gÞvï}ï¾{ß}Û}±-› ÛÓãdLVd¤u8Ûw,ž:´_—á¡åÜ};çqÇX/Ú:˜šç‹<‘Ø–†v6êè>Gmðú$%â„¥ïÊsbcššõ]?'=l#zðñwÇ]›L6$¨)7‡sRÃ5¢FäyôŸJo8±lCjšòâ3'5|#jâ\âÚ—rã ©iþ2óœ$Uj‘IIZ‡8×x“Ôäݧ9évg&.âÁc–îô'³¬é³jsÒ$5ìDÐ8t$< Jâ\½hîmù9É h«Á8Õ]ƒÕ—¤&"‰pj ±O6TåþSvå0ÎÇŒQ¬_> N0ZäJYÅè\74@N›ÐMËÌjÑ"‰(+B%ÖÂø…‡úAvöws Ë0'±Ÿä$H߬çê%Ñ¢ºÑ™Ó-2©&uà¢Iwn†_CJ‘à®ßÍßD¶¯%ȸsë-YP2ÝI½Ò«É&Ù0!~Xµ4¥ó´Õ^+NÊ}û+â­Õ3DEèXcĉãÜÏ¡)7NeEÏ0‰Ê8.ž*ã»we>©*ÏVçø8WO¬¦…gªó Bu>1QE3癪¸D¼º Ž­ŠÃ¯Šf¶Šq–³1D²à»Ôl’€©|§‰¥ c:±­ˆXªŸìèüÊ3ä_óWßqgÇó‹Âç/LV׈‰Ð%<Ù°(›‰O,Ò&ÓÏ»öS±þÏÅöã¸(ÖßÿcèþŸÒ!1qþ †åâñøAdI6ŸþŸ¯ÿWðŸwðŸÇ¨ü_‚Oÿ…w ÿÙü_ŠO˜ÿùÝ‘;Àÿ¥øTÈ¿øÈºÿÏ q[þðI>Uü/(S££¦šƒIǨ{!21…L­á@78ÿÅÇ%Ÿÿ‚éx Œ=pþc)>鉙¢bØÎ2Ëuy?[ޤM…^§ÀLéÑtdÃ/ÌHƒÎòÁe2¨Œ)†RÈ*³‘´&g­BÅ5•ÅÈ›ÑÊñ¿ýç¾<ŸG_L®þŒ*Åy[Aí?0ùa²²ÿ96?`ÿ-Ég准ºzszFéâ¢LdåJg[©›Tî+5ÜVZ %×c){KÉÞQÂ;-¸£ÔMNó/µtBg+ä0ô.t²Ò§Ow^Ä¿8Þ`f’öÍPÔØõÌÞëÁü¨*`œÐôñH¬_·úñš ·ïûä”±ˆißý‰ÄLÅ*7Ö-°¤¡—ucë Y±ž „„%‚‚>CŠT¬›¡-67‰0ÔÃ'ØË*Ž´“²FŠ%ïw$!$W*Ò×c½ë¼ !9 êË‹áð¾²jdKù1M™ö¢ˆÎ©`L›ªéE2 ÊdÒ/-B ^ ó"xˆ°T-çg‰“ØÚ¬’Å(»q,±.Dð6¶®š À­«$ƒ2Ö…È`ŒTT;U“ª‚uM…àñ³µ2t“Øö’8 Á±®àeðã î@ïf4¯ µ•C¨­\MhåJ´ ‘ý’Pw9D«dÉA@D¶¢ÁE A ‘  J5 "4¸RI‚H•Rè‡15 ÈTkÀbÔ*xPO5O ¹¬¡Ë–BIÒôN àèÕ8% E¯Ä)A}õ0N¨ƒÂ*tì¡ /J•Â<*JÕ8ã@J©gêP áŒΙ0G O0²T¨m íU›Såq½ kf80¡ëgÛ³\@o¡Ž¡7¶I$æy26afìP®wûAÚ¯çÊTЋNW-¿ ¥1ªWñÒ5)w¬$*9‹ÐéˆÙ?½-vV0 À%¼Inß··ãœâ,·°OwÐëæðÝáKM5)Dâ±6ç^9„:Ó«éŠP„ ³“¦ì<ɉ?«">½ÚN@Dî ðB’AÅŒ¢Š<)ÅzD:|IuÉšu¹™3ä)zx¼]€®Ïâ$:ãØãðcÚKµtwÈ€¦VñЛ“‚^ ; •í®(çÎ" ­GÓ­‰I ßp[ÒŽgÜî `lØIÈp„…òÈÃk_Ú.A­q‹Ó6ôšpÖí&útÑPó´Pƒé,X ýgœïiYÍàÿH©ƒi‡?=”@q~Ðj1Ž›ä<ò#l©eò½ „Ø©hšZ4•QêžÚ fÌΘ†BIÁ”¼ m6íòÍAÿµK¤cšÌË &Îû#°ØZ—v[0ùw ÇI†=ëwŒ¢!œÖã¡ìZ–«m§yÕÂõUøµó3CŸr˜ÍÚØÜX[Áˆ®†ÌË0F›%Cq½|á¢#ÿy0Cìqp`¨‹Îù‹}£™èÖTÁš{ª_5-tHÌ-=‰ µfI—’¨î%Çf ±ûGÉò,~‡œU§œ²Š.%®êéYELyL!zè ›”IÐà,Ð>©fÑLÒäÂx ÄO£ >nJ˜-³ ¸æL_<ê:O9e5ŒHÒ¹Ãþv «ÈÖÓS'å²Í@›eö"P7Ê:¿Ãk@þùk@˜a Ћ.œw“ÝÀ³°–íê%â¬AG`aÞçªô,¨P×ŠŠØ }mgë7ÏH a/54½TÑš/gcHpÊâv9׿_«.ášñߥXÏ'‹ï%±žO0ä½  4pWÏ3]û¨xæI„¬r·}ƒkÎÑ ×­ZØ¡©ã¶(èJk®ÿj?KèøcjäÅ´¶/Â&ÙËD±/×fo½6ÄD°ÕE– ¶: ú M37ÅâJR]67êÒ‚~µlH¦›ÜÀußÓÀ-+µÀ,Ï×fm®5vxßlj4ÈÇô[ìïV}R5C‚Ãó¤KÙá;´SÙºaÑà7ëÓ:ÛŽó½—‰®¹w@êÌ+ÚDÔꌦ ¾·fûx­ï›»Ö3Å­ˆF»ïÏs|"hÍ ÞÖç ã àŠ)`#s"0T_qÉÀ¨Éž8nÂD ,îxI (OYã<þ˜Tº ›•¦x`”Ä36Ðò|4d¢õQ2ËerQÒv½tã£S §±ø¤ˆ!§0$ú!È)Öxt¡éñ±}T :"¶ž Vvs¶´öSá_[ˆòm‰y»OD;Ó´€,Ù°ÄSI†öòÄ<ÉbÐû‚ -®0sIžøQî ¾­ÃB­ -oÚì]¨ù‰cß¹:,s|Eàð‰ë8ï¸<@I£¿ ôa£ù¾¸&Œ;EN X_1 8UjÇŠi~³œªWèú…Ó¡v&(R,ǰÕ«éãK§w:¸6 œ,`ÈŸ`ζæ%í£jбær†Ž~æ1 ½0-ëɱ¸rìÏ3M|ц£“ô8´Èó DáOþT€¢oKB[ÞÊÓ‡"ŒH¨í$ô8Æ·ñ¢’ÊÅðP9·t’é’ï¾ãÀ†vªhÐßµ ™›Ü3YLt _PbBû"v{RélüNîüÅP\¨§Èµäª,ȃÃ)>¬Äâæ5ð“‹*‰¢ˆlñ^óp¹xÉŠeê+åEƒß¬<²ÌbNüEI Œ(TÃQ0ä!˜³ÉÁ«öÔ¿}T-Nþñá±ÀÀfZ9Uw†´Ð’Y;kž¼Ôa×ü&ûK”{ÜBþЂœð‡оq«àMËIÓ§+Z“>0ãE]îÏx1äÏq1g““ëzrÒ.ª–å„ N¼ñ«:lz3ŠJ­”ð…¥Ý¡80º@pp’8¶H‹»U$Š"‘Ä æ0›¬}¢V€7-,‹zVE‘÷4nœåhС–E/H3‹õµÊܳ0èZI‚v<ÖY eµÞðkÛ2KzÂÓîJ‡m‘z¤ã»f,Ï ßaF—¬OŸ^L²qøÊŽrÒÛ¥–ÐJäk¼´Ö´ µ¿i1ª}&aÁÄFKOÄ™†Ü^Í$èz“׫¥`°%!jYË"doþ»"T*¨`£U,:8ÆY…ÁÖºð´{šÄžÝù= ×Ù8=é“èzàâŽ>’¾‚n³…ñ;·D§VíOKð›Þ‚Y¨[ºãà©>™Ä…dñÒ>úXO@¿Ál@ÆÁ£ñb.¦')Sw1™ó×rÄÐa:\“ L&[ZÌm þ¼™Øîre¢b¢d31^ÅD6‰†®åIè=\ ñE>c„ÿ‚®³ë-·‰¸}ÓÎZÞüÏ›;íîL#w6È¡Üá“”;|€;Äòtij÷K8& a:©¦Ý.aoï.öæ´H¸Ð28¶Ì“öd«àͲ.±¸‡É“)¦È$SL ‰möd{³ÙöQµ|ˆ<œÍÚ×+–}j=o<£Â“²Ú<›§”ùǬÁ|€êü‚Ö‹<8¤ »~B}ûrq€ÿ^=¨ü;ö™·ÿ§æŸ}ö>ý?1îûÏÔÿ/Ëàû¯¬$ ü?-ŇÍÄ¥1–‹g³¹x2. —H&96ÎÇÇ2™1`ÆÏïõgÞòßü³ÏÞgù—x6^åÿMbÈÿR|æýç[Ïܬ¿ ýé½ooûŸÎc_z=»áÓO¿gÝgÞóÑ—>r÷îÎÉcWCNŸúÜáÏýöí'®¼¦çƒ7_‘Yvá;’×~ï×cÇ]´ïŒ/^rë¡=/–¿9ºÿUvëÔ“'ª·^õÊ{þitûÐöcÞ¼ôÒë Ÿ›ºyÇ]çþø•½o~ûÇ/<ù¹s·]wå ûÞ·ìã<=9ºúñSŸÙýƒ¿_õoOœ°í©oüôœûöÝ{®vãó¯½qï®_~ù7ûÿã–›¾¥gîÕŸJ}¬çµ7μê¾7ßúæ3;¦37N¿ò?ÛxçžëŸ~vÏ÷¾±9¿ÿºkNýêy#û­{÷ݶû²GßwÁ1/_{ÿ×.,i¯^µjÙÈ¿ùú}ËŒŸ¼²úzùmwïüÌ1Ùïùeì’ì£?8/øE—h÷üÑlrÇøLÏžíÝs&ó–ôÏdÅ[úÂô·ßþ¼yû3=/f+=uäÛ ñ˜Ÿezü±ëvþ÷Ú§_Ù¹7úú>nùW><ü©£ž}–ýÀ±7ýç6ý¢g÷ì9ë'¹kÿð¡ÔÕ=ÏtêwöÝ´ýä_|a`ïmo }€?çû/êþÖåGœxË3äS=wÇÁÿž[3xø£ÑìwÖÊ®¸óà›¿tÐí—\õøÉ/þúà/?qÍŸ,Ûh}ÿ£FêÈ?}îŽû_~dè¤dûÉÓ«ß[™|+öÙ>±^Þ¹ü‚¯}º÷¶‡ÿÛÿ:ê†ÝÊï\\Ü•¼ôÁëþæ¯Þ}Å'ŸØ˜Me•§¿¾ç·Ëž8aã_?9~įïÍßù«‡Î»h×ÏÛõ€vóc˜_è»ýè '½q÷æ/ÿÚ_]SXy™<}|dù!+ÿøWŸ~Ìø³žãŒËY5úµG~qì?îÿ—þõñ»þR8ê¥{F¦þáÉ?ÿä¡¿–¹Ü¸åm̓kÖkçß½ö´5«º¾bÅëÍ‹o;­ðÝóÜÛ÷þ›Žd[þÞ[OJaŸºçûË—>“;uòïö?²¹ôåËwwÈCù«ç}PùЛÇ\xÏDê²¾[ÞÉgúÎÞö‘«_ÞÜÿ· Æ~z8?øƒ÷ïþnÿø ?zxç]ôuÿ/{OE‘.ˆÈÛ¬ŠèzË:¢<åLß=- „# b$y²Ê1N2LfÂdD "«OäfUPa9<`Q9äEDQx®¬Ê)°r Š‚ øºº{¦«º«º{Ž„¼}Ó?’Ôô¤¾¯¾¯Žïûê;þëØü×[irKî×­Û±nl_æ•ü‘ã>y`ÓÞî™/>>îÜüãýï;—óô?Îøô®c~4o煮f}.îÕ$ã‘]'ò®x¹Ãw·/(]|nÒe—?½îÄ(ψæWÿ­ë¨“þ¥Óºœz5Ôl郳ÃÓÁ7ÝÝeêV®aèÙÃ"O½t„i·cñ;=;ôõ>;›±_‡7þ©s燎uÈÝæûíúõùž˜pfÑUƒ>}ð…w/¼ž~üÄÆî?{Ó€¹M¾4þpö´ñâ?»4Ûâÿó®þ§™þM75ZÝkPËÇG=¹»Í{O]rçæÍ·úôÙ^SÞŸÖenËÇœœpÌÿüPæY~ ÷¹É,ž·ã?•'®è¾bì¼ÏÏÛ²qÒ¶at˜túú3S· ¸dCõÔ÷î™s]Ç3îéåÊ ®9öB£GnØÕ Ûx_ÃÅWåŽ;:óÝ^[tóž[Ú¬ÊÊšuùùëg6:³`áÄ̪ߟœ{Säw éïônä97"£Ûôuý¾º~֚ʹù®¯Æ¾1è"~뢽¨f[÷µ¸·²zùcÏ}Õn÷ÉqSœ™ÿòœÓÚqåký~q=÷ÕìAs{O^;iÎØÙ¯,Ïß×xòmÇ~k|¢ùÑeÏ<ÝgUãŽ{çtºv%5¬Å‚›ÿ1èä²;¶6ݺǴ]ìw^?¯ÍîÑïiÞª÷šŸŠ&\ûÀ”+[´þ°ºã‰ì‘ËOuÝ0ã¡Ò~g½wLyµºÏÄuß¾1oFÕƒ6->ôúñO—®ë8€/¼dÂm|3n´?¼2êÐXêîe™Cú¶2Æ‘~ؾæÔ¶ƒûÏ躪m“+[m;é—òFµn¼òÄñÁƒ¯Þ´~uöGGÎ~Öh|õºƒg=8Í7è‘®³‡UVLŽ­ÜÖñìÈíþûåù5Ï}ëÚœ`§·=;ÿ9v¢»¯yïƒ÷_Z2ùû]½Vì\0êµO>)»7»ã¢…Û׌}ºé’ßlŸ³ šXõ”fÝñT=ÕÒ&¤¦è)=•(u\ôôߪ¾©È¹DQ ´.i¼œ\ASàd-{ªh‡ƒ£¿$«™ªæCÅðk]ÌÔ&²"¹2¦Àè/ÓDñS³¦‰•—qrÅKyA½xPod­«`b])ã)TŠ©z Iwõ´ê¥À󤪗꫺¬z)XT½”s•Jp¥nøŒ$SUIš“U½¤9ÑÜŸ[^NF¸À£Çô=Îü¿’hÆ\€?cxSåJ†ucàÒ&¸ò¾}f®\)ØT®Ü|bû’ÒžßvÎY:³ºt@«AµÂ|d¨\ɸY!mÍKì1èÿB}©ÿE±éúOuñê¿Öþóiþ×ÉcàQ½á?—æ]<†ý_¬/ü§Òü¯“ǰþ}õ…ÿò×Óü¯ƒÇ°þÝõ…ÿTšÿuòø/Õþ iþ×ÅcØÿýõ…ÿ|šÿuòø_\oø/¦ù_Êÿ¢ Yÿ]ñÿh1­ÿ×ácâ¿©iôÐã) •”x64™5\5‡ôϰ¹ `*Hn7LÐÔFi56Ä‚èc»ÕUêñÉK=D’Ça*˜ÇÅPéS`‘>‡„"å#¼evj”‘‡,´— ”H×¢†¯)ã:Mb?`Bˆ’õœíÃw+Žë¸[·uÛ×_Šë6Ö ´“N¡-ÅT€Îµ6®>©A—‡™ÖÃÁw*À9'tËÂS.OýùÊ!ãEÚ´}E+öøjØõñâQaDt„]Õ}~ ÄÓxž9Š|cÍ5ÃÊÅ÷JÁsá¿ÕPˆ¨ ÌûnŠ,“'oK 'Åí9cFR<ž¹åÝÃ&P°p$‡¾G]Áê‰]àL¦°ÝQm~kÊÃíŠäËÇ“M†ª“Ñp&iºé €æ`¶ç³Xç ºXãǤg~nôÆÔзýñJJK(OýâúsŒ”ˆ.‚pe®ÏnDåG»ÏKÓ‹ £q²pFµAÃ’tRãÅjkŒá¢läkò Øpœddž‹8H8¢ ;¶ FÄ ‘ô&‡ˆÉˆJ´AT<Ê •Š*»zƒEþ›SÏ]Ü׌hqã|¤à-#¢ÊÈd‹ìÁâÕâ>émÎ|Q‰T½5>uß-¢ùäiv ©Ý$A[È«à3̓8Œ$ºX&‰¢†L¦÷›ýâ5Ñ1e5iÛû òõŒè‚ªÑ‹z±õèØc73H{„G#u LóMËç N¤äzˆ$ãÛXEÅS¢ hÚ[-G,ðJAhØ0‚Z]žˆ| ãm£íB `ܪèëW­_ЯJuyŒ(!8 Ù7\%¹  AU¿€ô.@oáŠ`0Œï_®‰Æð^é2Lhˆ’íÔv–o¹;ƒå[žYöXê×9ÄÙÈ0ÈldÙ¶mg#"¸cV`-hCDsüð.‘þë%†ˆVQåÅijqâ‰è‰ëQrOˆ¬ßƒlä2+#c†QJOHóI­–ª¬!â:ØÒˆê¸a¼±=;qE[†o”Ó5r˜M\FÝz°$훇ËH©R‘¼U)ÜVŸCägkÑÚ(]ǡšjð.Dp–á8Õ{Wox"U×—é-fWB¶‘T#Åóµ¾Ù Wªò Y0Hc&ìMXø,ì¾Q ìŒ&æ•j­.n›8e!™EC xÐ $tÆúWLTÀÙ͉ËÂ+_–º ÷#&|L÷¬¼v¢ÆÖ Å³¯­$be,5>%#ZDGäYù§[©¹”-qJ¸œ6&¥ÉóêÇ bÄ+ŒÑRA´|¨³ ,¡ò[Vá4…,ñRBNPdaÇ@Z¢Œ£: x«×5‹Ž‡ôÖmz+’k‚ÖKÜp…Œœ Ú:ú*[õ],ªÄ£ àæ%FäÉòSƒz¶4/O¡„M#ÞLŸäVM#EÙ ˆºXC´ÁEÙÎÑj;Ê;ÐcÖÚÒJÀ"’p je¢Ü£ïÆ*²Ð›*_ØÕ)Z MÙæôi]wO¥Bïü"~ㄈÇ3 B<ÐNNUuËP¨C ð·ð&Ã$Š·Ü'¡Æ Õ÷“ÔWT%‚;p£öVdi3€} à~DÖh- öd¨p}’˜Â ÂÐNš) Nê\Å(»VÓÔtƒn9ºVºe`™»ŠØ¯($Ò9 ËÎÙ>+? ¼¸:¡PŸ ¼»YLCÇuÁJè=\iv‰ÅM èEßð S7ÌP™? ö¡þ1ÄÃI‚æEWŸ°à©NÁñ"\›Ž ƒÓ¦H &ÇcÀµK¬h‘À±×Ëæcô޵w ÅöC!Ö“PØJ¥ŒÙKp=1ª©zÃEV®Žì+ [7bì\Xj‘ÆjêO„iŸ«˜úInƒˆÉÄzðn5&9]ãW‹˜XEvËâ©êÑá¥<ÚóòÔ7‹õ ؈át‹¦A}v TþCÞW•‹â]1¥±)–S¬„4%ïë±¥Du£2‚Œ$¢Âŀ׉T<5–œÅS-e’aD%NôR49Qý˜—ÔßI•×vˆt/Á2 FÑûCå­ˆ4-Þ²æ·ä{Íz‰[*”E•°²¨Ç€%ùeoÜ  -ÜÙ) £hPJŠJêŠ+6_±«Näõ@§Œ 5ZטÒö˜heã(¢Lß‡Ú è•©™ ÄŽ7Ž)0s&%7îäG¬v¢Ž*ǮС’ÔOŒq‘×íHÀ[âñÊ‹äÞ’PÑCÈ©‰§Ùdi‹¥ü09ÉšþKûn”4 ºâtmF·.0Er£¡còd'ÄŒéPM\W{ÑE967sÔ>x4ÜP ¹%G9"Ú;° „ãÐðAÈS#T±ŒbÅËr2vs („7ˆH$î¿a‰ ƒÎ„Ј }È3é>„¼C¨°ht® ñ}%òbµœ2¦ QHÐx Ušo‰g„@`{ÿÃèMÄäÝ"dqEi 9˜:{Á¿‚o € Aë¥Þ¡¡°GK ЇLŠëRþ2îqº] ·¤xCx{i è:NÝJº!>¶õÛ/cÃ6ÍÛ£ñÖåÉ[Ûø)'%Ï2ÈI Ú)8)y$vI•¬âSìåÓaÂ#‡±ª“î–-µâx¯‘èr¶:»ÚNå]¶Š«¤îkÖa@„ ÍŽØqÔÓ[ÞWÝcúùpÞð ­%l凄š 1H:Ýå=.i ôПØAÀ‚3ø4Xì #,âFÁ9!Ô0ìõõ–÷¿8‚2à݃¦ 0þ+Xâ tXš6_8ñ ìDüØ1Iíi4RMÀÈ 6 '?ahD`‰ qÙë:Ä_ô#¦é½ãñôã´« >{ ×¥oVLŒË%N…ŠÆë—ø½ÁŠ2Ëh>œÜ”*dc^Û°B$ÛAB0iƒ‡”LRŽ€ "ÞyJ²"·O 0#™ruÔ`‘äŠl—!…–nÑ ™€\Š|cˆøñåV2ŸnÇ t†xìik>µNèÉpŸ?(®´ØÊxÖb¡“›pˆH®áMãü5• ‘ÌUHjΓ8Yg<Á§Á\®%:IœÚˆL¦Ï)ˆT®b V‹Ø”qÒ¡†¥º„AM4ÏÅ~ÞHÑ_Èœ)Ä/7jù1IÖ‹‚æÍ“‘ ÂZ!áX^¥9ó”Ì Ä /¶ØcÍ“07¼MCa³“ˆ5Lí/ذjb8ì!kF‘ÕeAªgYö|µ¤4Ÿ{‡.°*PÚ­íÀøA“ã¢-ÃÑ!ZA†BD{5¿¨2g~Ò†`†ç6dZÒTóøÒ,‘B ¡]êÀ’¸üw†ƒÜީйØíöžÕÛ´Í{÷^HæÊû‚¡˜Š›ïvŒ¼åsnVþ¥útèWà±{†¸ªÚNR‰,—Ç&‚ýb@êá$¢Ë…LŸ@›¯¾ ü##]*Š‹ýá”]Û‘kCÒ F¦´5öÅF ðFÛi…ÉyŒSÒ2±°¼ö)9®S9™«lýj²÷B®i´1¤È&|ŒRw*R©À9KNIÉ_eÑ‹‹ÂèøtÔ1 #1,–Sh,‰±Ä:OR§"ÇÍ!ó!°¦%b|q½ÆWþÏ`-¦Ð½Rí‘f¢®®|¯,»ê”(HÎqXªÑ„/YˆÃ@ §9Þˆ··RÑÀ6Å Á¬aq7¤ÂCM¦À®œ]^°¼–ÑåM]Å6-¼ÇUxưe<4b<©3 ´ážÐÑñ‹-É(CÌ;‰`„8]GCpKXÏÞZñDWŠ8Oû[¨› ‘œÜ]Ao¸² „Ò!ži/@—x&n#9º»ùòJ*Ê-Q0€Â]ß$„’•[/8ÁéÚ Æ‹"XôÖ*‰ n7¦‰¢CKFŠ„4ÅCx÷ˆP¢•CÉâaæQâÍ(D9”Nįës)SõAD/-Š1õ–‡F‹ZŽü'­¸°r” 4Ž«"¸”Ô¯ ÑnÀQj/@¢Uú­mƒ|ê!º‚†(B!ÈÀÍÕÍëmmðÄ÷x/êmT·J( úB¡˜’¸j·ïf¬† _¤²ÜEË€JÚä¦1´Q×£æña\1ßðZ5yñ"2=ÀÌ^†w#ì¡Mz/KëðôŠõŸ„Éë‚¡˜’`¬(œËàÒœ´#³í¤å!Gƒ@,E"€€**‰èw¦ÏË›M`zžþ:2ņ¤˜)µ­±Siƒ‘FC0h i'`KH‹%ÍÓ NgŒ§r2&°¸ 'X—”Qrn ¡ hÛ—@nZšÐ8cõ*SL„ae˜n!ñú²ƒ1†1ÎÇÀ‘Œ6õ+êŽfÉOÅš˜1½^cÍ C:ÞµdŠHmHM¦yˆ3I9ù²YzQöÐ`Èrœéź¹YÐ2Ã6fd'Ãv8Æ8`ó««4‚åä.ѱóÈÐD¤ON‹¡'‡4I'Ô«³¬LÞm®âq?œ\Å«ðãd÷p¨4_©÷`ÓW(”Ë"Ú7ÉŒÂcê.ýƒ Æ%€¨+Ÿ Âm†µcå³—8Sf-4ãÖãivÊÐŒ‹“'M˧µrbæV¹Á¦ÕPpù¼¢¥NkS‘┬„)­b•Õ÷¬ÞæmÞK¸÷Éø\8S¡H©¡ÔˆÏ*!Ö†\hl(µ‡Á×”?boÔšÇaPê&¬Õ¾VK&Ë ýcðY9øPî)Cÿßn÷tÏh×ã e‚ý#3}R¦¯ÈkVâ®FL½G)ƒÜ¾ÔÇ;†!SŸ8ü¦EžRÚ´ÚVŽj@˧™,<24%6 VÞf¸¨ø†’ØSR»\ ‡BÅ•–ßó‡Ë롺}8®˜aé"ž-–D‘)æYŽ‘x¶ùBÆ-‹¿ôS»O¢ë¿ÌWì†õúµDeýó,Å ´²þ9ŽI¯ÿºxZæåtoG·g3Znùfêü ÞE¹B…C3²²2U§YÙ¤\}3»J"þ°+³;˜+9ò9êówêc¿·4cäóGšÞ»ê䯣³cv¶´vKönΓ‡në³¥"ÿþ¥7??©Ç2_îÒàªùwVwÝðÖ› Æÿ~ímÙ<þ×HÖòˇuþ¦ñÄ·¼ Ç|0áùç_“Õ¦Æs¦æÛÂÎyfΞ’N%5?_t~ðò¾Ý†¿=½[«CM~)[W9gàñ·»ýtÒ·iùŠËŠzÿ«âý6÷ínÙ¸gÖn÷}¸xýŸo9ôѹÉ[ï¿· â§ß :Ãþr`ï¡÷öŸ»haÓà7¯ª1½cÇw½ÎÕadÓ×l³þEß>îîϸEçÇ”-«\q:¼íô”Õáï®ú¥ê1}¿Sºä­‰ÕOe¬ûôûªï;ÐdóO;V½ØµrÄÑYU_tònÞwõú_‡Ëù¦úÄß¾È Íû°j}xòêÒý#¾¼ýʃçËj^ú¨_“ÙV-\2î‡õGîÈ™^¾»ìò•™®µËo[²uÚ¹;»º®œ>ã?]§Ú¶òÇëzýÒ§á²¾å‡wÍÛ:rxMayÍ—O>ÚgÁ£—ÎN+<¾šªùbÒÒ __tcÓeÌÜóÕÒ¯ÂMëÄü—ž˜Õë¯->œ¸{ú@WÃ7ÿ›ûjÊ÷Ãz÷gÜüÂñ7 º¸õšÖÏÊû¾íŸ/8fàgþ9×.Ú½»tSðìºâí³_Þ_úP¯»û îÛ‡Œ™RøÎÏUM¯i+Poœþõ³>ãû¬Ú“ùIMóf›rïšVÓõ½Ì-Å—gyŒÿ`Bœ%Uo^ÕgÉÁ ¯^üâ†ó-O}Ósø=ƒ&o˜¾øðe¹Ÿµý¸Gófë&tî6ôîùGo½ôù¿t™¾ýÆÆg{OÝÿH«2×ûMÎôšTÑ⟯M{|à¬çï~ëüí˜ÕþË„ûžîG]~¨ÿkm7ì›°ëóߤm…»¾ùñÙ»p(Û¯,5…,ƒ„,³!dËš%"[˜Ì`ì™™,¥Ed IÊ•­×²ï^TÖ’h%d ÙŠÑ7ƒz{u½õ~ßwý}®ës®¹æ™9Ï}?÷¹ïß³œç>çÜçfOå¡*«³Pºi8Ý”ø)ŸÀ¶ñ\ÇA1f4ô%ÍÖä†ã"\1òIôi–a‚Ó¢|ŽXÛöÉOèF­çÓ<ËK¥+4L ×&Ì u¹¹Tž1È-¶K~IÞÓ?‹y{Æq?gZ݈™L §¥Ü™C9Ëï?7a2Ÿ\´o¸êþ9o Sôqð;$¯™V«äé’ć˂d䤪g¨ ó¨ø¯¾:²%ì´K­ÝÙ[S­}E´@#î8ðBx¦‹ìc¤h3î×S<÷èÆç›6ÃMr4ÏýyòÞÁÊ*Ç\¼êçÊ&µ0äû9£5¡zëSóXÍéç3]â‰ô<zDÞd1Ô»°fbàœœ\ÄêK­~ÜålÖ2•úNÿ½py÷š9"|ò\ïã{c>¶»ö„Oï„S¥: :–mE,[8š(/}>’Äù ïcû RU0ä.q‰¿¼·¤ñÜ$a|âR×Û­ÏÔËC²”΢¤Â´.·$£ê¯ªà,ruAWãkEXF\º§ÿV?Ö¢ÃA–p· XG¸¡¼}ÿÔcÌü¡fXj5í³T¨dÁ0Og˜oË-ŒíŽîÒ¾+C»¯“€V;vo!àÃb}3¬¾¾q:xžfË8ÿÒQÎÏJv§û™9ÒZL›JP‰jÚ\GzîDE(œ‹š‡˜‹4·waH »\Ÿ–ÍÖðñ´xQ"ÌÏm@»iÛ tjp½’œœØäÓ6 ÿ7‘W+jAB²yÇ@Ø%émPSneã~.›;Ój´{¼9C® — 0¶ÀCZ½POÐìÒ™ü¥‡L'´šê&’ýI¨íXCÄCÝoz;ó ãöëqCìÒLv¾7ÆÖMñ ct» ;ã9CµÀ¥ƒoÙô¨ã”ŸÀ¬_¡øѳ‰ç¹½5*viû ;g¤÷°á+.PeØê`õS-oÓo(öf"ò¥“¯'cÍ‚"4“h¯Õ¸Ülƒâ›²%ð½Eè¢*›cCIµ=•û´bÛžósFZßù<œ]K'Ó@Ã%pNâx{é´ÝQ14‹°‹š¿ñ`Ì!™¦Ër…@DÍ£Û;T«¢…ßÊÑ“¤|\Å&yö\kÉëW6uÄè5ùƒæŽò¦’½½€Ð̹ŒŽÕfï¦Ö™1óó}äÏRêvŒ=:—¦e¾ro WñþQ^i9§Ã*†±éò Ýïwž¢.t‘™’bÙ7Šä£D¥‡ƒí; É×R.:êNg¾0àô3U?s0ÈTÿ8‘|þÕ…'‹BÉ ûF¹Ô 'ðÑkŽt]²¹‡3¾z‰e¹Ú¾½q>s8Õâsk¿6Gº€£ÝŸ4R¬ü=í¨ ¥§lf7ìnô„²ŒŸÿ‚~õ²èSe֧ᩜNùl¸(Ú5q&5,_M5³¹Î˜ý”e0>…URR—Ç„K( ~„û´§;mÛ,WDç½z(GC¸ÈþÈŒ›; ¹õ–•ãÂî"œ_©LžñlM£&{ló%€£B'ŒÅóúþ LáÓp8Û¬™JË oU pñ°³Ý•M}™¡Çjˤõ“ršEìö ‡ÒÓóxiu2øCÙ.¦WžµuþLoÞD—ߪ7¨gÒdWq¢{Apî€ <Ãñêñ²,ŸÌâÿXÌ™Õd)•d¨ž;»5!¼hF— #WÕëBl¢N«ÿ–—5–0<¶Ÿ Æß*‹U luL*¿]MÓ5÷J¨ŸÍE:J¿t.¬£û]äD ¯ÒaýÒ3¦ÜH)Ž[ ŸRv¸½»j;ÂŒÒNÝÿ iihå¾ûÄ—¨Vë÷ž‡òqåÜ}Ážù»:lDŸHrí·*_’?Ø–`SmÐ?á‰|RvmÊ‹>ËG¿Ø=»Ð TÞùz[¢Xj/),-úzdAó܉ãzÃw'Þ„6̲‹ìË,¡?ÂÁ‹ÛÊüá½—†Þ¨%d);¥¤4“ªþÐê¸ëêU†‰AK~¬ßzp9ΆOÏ%Þ‹ât= jT˜n¯SŒäÞÛbÌ«aÂßS¯Hµy§³üàm%ÞZç9ÝÝûbµ³©ðïÿÑq‰ .^ +ƒycËbý‚JU3Q‚½å¢k"ññ‡ý–F ·$UUK:QÄÝãÚ#¥„‰–x¯Ó¿dqû¿O89»-6Ø¢1DÕ÷uäãN-»²è’ÓJtí=z“¡¦6’×ǹ]¬9erj£ŠÛKÁAÅÏa/XwÑǾÕSÇ Vèªqt&íÇû˜Þ*UôÔ`ƒÌø{äk £½&¶4 ;½`ÜÆ†Œïë4`×>•û4‡Õ3Kæc^2‚6Zi~A%ÍOXãÍKò¹í5d®E3º+ó¥g Qivç¢Ö1Mh°/®þ˜›SËqóÌ[ÌÕ°½’ê+> òÇ~‘¦îöx]RMfߘê¥Cy¨ÙðFùÀ¬{•ÑRÚÓ—‹^±éëßÜ¥¡ønìϳ#ƒ}ü¸wxâ«#æ~´\,Y¼ÇT±Ìú‚ó¢|÷÷¹?ªk@Ÿ1ð«3Ÿ4¡¹Ã£Øè5ÏW·Žzž™`ç¦øÉßsRBÁ­ôÕˆýv.þ×lªP€Ë—°¬]•F'–h–{íº;_¾?HÒC{4ˆÄàxph´|øël~ºÚKVÛ%ýªt÷(TQ„`¶¶{.U–ÎN©ñóm@/ó~W[›·®õ‘ÊÒI ’BMç]hYÈŽy4Î"ûÆËÅä(¦à¥P|Aÿ|ÿ(@ÍAW]ö›X"w˜L@©ô~÷°P^Í[ÓÞ yaaîj4žnÂCT¢{µî'†5»<¼¤M|f—>z‰ÃJ޳çA‘P½øŽƒï8@שٵ$¼™«²¬L’‡Ë¯¥cŸ9húpt«²ñ/¡«û"jçÃã3\£ Œq’ëcŒ­%ów`SÒºÛã òù|þE9ŽùV3ççHïæ],KL×ð¹%QZ ôÆïùg> L²7òÜm‚®Û+Ó7ZÏ«QßÔÍìE’}Ü\Ã%šÂߨU ;¯S>ùŒAæŽCûWé©MS¥]ÚE1¢åo²ð¡"b¦Áå[óAYL<šeùªéÜe˜§Bžv‹Q8˜dò)uüPYÎmK€À8JJp ¦o¹Y£5=T|ZêÖŒP† Ó…ÊJµâGc=ؼ“6'‚'êH>ÓW@¥/±ïç ê¶el¶ó÷tWÛo¿ùÖXÛ¤áQ Km}“à”êØ¾³Äsíú5ÍnÓfúܤm¼]Dkªãõšëp%ïu',ª1gt¡CXøYÂF+º%u–p“/‡„‹fÄôè_ðäœÊRK¿ô8_‹‘±ïÖ>[iwØ·`ä#{‚éŸïGâ%/ÄÕ‹'÷.N`l ã&¿2txyWωOí\(± / +¹wÞáv½íë}Ý»£ó[E³Ï{W åv_gÆÚݰfV’o~/ ¹ ÐÄ)>¾µ0v+7[ï0ó>;;táÓ£Ù¬íßKt5 æ—)ÞµÌ=c驯?ºDª cRôcôËTä•é„ëŸÜ¥ÜTõ8B !lr­ ÍföÚÄ1¹þ:«æœ>"[Ý#Þà&^λE™B¡|*¬‚=ü³¯ôÉ2»+‡Fæ0Ÿ„luq? lüædEªˆGF}úlϹÞ¢¤^6š)MÕkã4H±aæŽö Ùˆ˜\ªDÎÒŠ¸àƒÌ)*½ÁzâÑÃåLO»ò•Ÿ{Mñ€²¯ù²]¹ÉtµÆäR’X#wF¯Ù^‰¬.>ª)õ«å¶0Ñ (³}]d2øLóë„Y}å'ÿ¢L W§ à`IØ7ü¯)ŠiD™ªia18´¢³;ДâDÉo#‘' =gJ‚& ˜\ÌëDÂ(Ó dö·5ÒÈGÑuu¶ÒÇLAºÊ*@%Pƒ\ïˆ;Au9·_©¢âL®A,ÿ‘“€œœœ xS©e¼²¬l +›åÆN‚(ËÛÆ¿W^í ì{W€Ë}.wiâ0x )`¥å“@òˆ”ƨ ùû(‹  hg›o‡€­iJrͨ}藍«„ÈÉ­”ZSp¹›€U¯,KHIIQVîƒR²Ö@äÁú攵ì“Eþ¯@®l §þ/sÛ@ú”Ò”1]õ½Zv½ú.ÑòØþ£HßÅY^Óc5 ì—BýCV™ßÊù•PŠÇ/! „/GÂ!¿—ß-Hü[q ¿FŠâ:ˆ’RÌ­äká×0ýË Ñߊû•Hp(xe­üU§³_пtÚû­H?Ü.ô$—/½®¢æ#õPÔß÷¢þÚ©ˆÆc)7Öá –€³B¯tÂû«e òWý"ßc0D+¬«ð}] ª­3ž€·rŹ€( ‚܉åÙ8g'eò)¬, CÀ`8 äà0ò~-gÌ?íZ®êì*Œq&W¯B% @3a-ò/}¬ ú“†‘?H Áq%òéFPlí "Á–\ÓLxyrÚLxíŠ'óãXaU‘ï£è¦äB¾ÛÔÀ@$C­«<8Å peÓ7‚²æûœ’¿c-|ª®åÁtÖ–CüTGýÄCÀÀ?—£d2ZËCJþÜ ò³|RøOm@À?•C@á?Ëý±o„Uë²³*ΓüxAAàò£¢$k®Ùœ0”òŠÎD' ÎÉFÑÙ]CP>”µÕ pÉ•¸w%gGGŠ[€ÞO)O ì×%Ÿ‘Î6²3A™íOn|%샵|cþ{WßT±õe{Ò€€øÄí²I!¹7wIU XYA(EL“Û66m–ÒZ *ˆ~ˆ€ Â'¢ ¸ ˆ( l"à‚ˆŠ ²>7@DŸ>Dà;gKÒT~ïK~”d–;gfΜ3g–{þ’ “Ù/‚w>M•šˆ‹0s¿|§©Žèã‡áxÊwÌHTHªÅdJ>D*AI¢,ÞdË!2 úŠª ¨þ6™ŒE˜(Ê, @¡QæÞýÔ !‡3Õý¤¹}Î`^¶G,V£Yˆv¹EŸèwûÕH Dæø°W”bÐí‰a…ˆ€ÛãÒ²”¹St¹=‡GC5úª¼5÷ ¯ Åõ ­ Õèg¨ ÕH7–ÍNPT&=¬ÈBk†Yh­#¼v,u„’eˆC{Úî0Ô•…j9ô,`¡Îç  ¢¡ TA ¯.†V¢¢(ŒC³ÛXTÓ¡<¨Œ;¬‡Ç£F¨ª-T‹Í&œAÞ³&u@—$æÎ±Š¦2’ÑŒ ÇþÎü =”®mº´t0ÜÎ(‰7{=®r’¢<«^ÛŒžÒyH–Ç]ËÉ‘¶19Z!}¼Ap?Z|TâJzDÒúÄ(8× à%sS•å–XbR¦;å|WªÀçuÂ|F÷ Eî»ñB®Éìôz}®ÎȾÎÙŽ<·§„2ðÔþs= r‘’ÈP /SÅ6ÊïtxDiDc5ÍéùEÃ1*ÍA†ÝÅ"UGò‚P¤àà§)±Ø‰ƒ¿ˆ }HJ€§HFò”±/ ÓJ<¢JEŸJ cÆBóú¢tYÍ’C(Ìa§B¨ä=D £>ê ¤GéHò"£åÎ/%RjFJT©ì4‰ˆe–…Åæz'R¥(çúx}™Y8ÀJ)ÆàOÊ@Uòt yô‘ÁüˆÑ>´½Âb]nGŽ7ßáñã¹^ï?*$@C\)Q&³êÓž´\–Ò—«º^*'×eÊ÷ÈYµúšš‰^E—JTiJ;ÊM§HÈoJ1K?t£Í<^pëÀ%t(å'¾ä¤8ùqšÊ à˜N!^§à;E“¨6Ѥ‰æe÷RJÍLí@»±LÊYä—‚©7ÊñãCâ3;H HHñs€A2ˆ˜ÒP#UJ±¦MR•j•)Ütù)ÐÃ9ù0<Ž,ѳ•%Ûãð£XM x•)ºÚ—éåX2Uh[;JŠ×x #¡÷Hš®71I”òkJOJñ¥ƒSH1 ¤$d8–…òh¡|jÿ’~IIÑk“ò8éCµ Ë”aâ-.ð¹óH ÅN°Aû—ÈßÅ~¼ú]‚ÿCA,H,;<ðS%É€”ÀÒ ¨Œì© 9O¢´Iªs ™4‡fvŠ»À/?dØf_‰¾ã|Åú!IŸ’ç€>+Vø&…`üJŠÅ”RL•PŸ#ßë~S  T$­K†-^tGKÐásÂ(•Œ•˜¡¨Ê.Ì rªF¢‘žð8JD^¿XhJ½N¢dE‘A°©Dª3傹Ø…C†Zn~#såWPà,F»ØàŸ`õ^°©±&]%À £ µQ 3E¤¤Š•šóÅÒO¥oÁ¢úŒQ¦cYjšò³(•bž×…kFSŠÃãu¸ÈPÖi9TOš"UÔ\™Ì\þ MÒ«Mcš_Þ|¹MZýÐÈ$JÊ&9£ŸŒ¾¼’`A¡­åñN4D©*Iž€!R*""±™IUÕ¼Åôé§\Ê.ð¤U¿l Çe=¾9ɲQ4¢äy1Ï ÆºÇ _ ö`}æóN”™MKÔ”XIÁpІÌsÀíúDÅ·8:ÿy`†HóàÐáÉš¿À'°¿¼\hB 쩾n']ŸÉ¬<=E2k•Q¥¸•D p5Ù¬3)i|ªÅ/W§}·ní)XÒRí{ôhOùÙ"å͇zPÅ"Ðà4Ô½ÈíD3É##xH‚F›2$”•Ò* ¸&/_ÔÚ¥vëÖf¤|*uŒô­T,$[Q².K ”X&mu…ªÒòoãÿ´= Ì0 èüy÷ª+5ÔëÃ÷s’ÇG“¼gËbô㩨t'¨PÅŠ2IEjÚNÒoª‘@Âj*jhò:jœ™hŒ¡ôKeÈ)p¦±:¢¯h"¥!ÑVC ~„x-¤û]Žcú¨pq‘)Ç-ªâTË(7›q¯YÙj–wš»ä*x5¡Î€¸‡Îp4½'ÚØZŸ‚2\ÿ2£™Ê2ÚÒE`íQœÝB ª‡Uže0$÷4†t ³w®Ñ«Q}¤Êaxyƒš³Û(š:q¸N˜ÍYzÕyD+„#3KòÒkéÂó¥x¾e­öHð7Œ — ÆŽ!Új¡ ƒˆ„0†ô²ÕN02a$"Ö•Õ¼ [­øR!îZ‚öâ¬6ŠçÔDÝ» Mq6à ‡³áŠ[Å vJƒŽ!A…/ál4lˆ6®Sx$¿‘øjÕa‘àþ7m>G0'`LÌH$ŒÙeµëŽÀ|.ß8[MÁ(­PU •Š-C‚Œ´pú` Ð#ÕC®œ1‰‡ 4͇){èÔ*(x½2çÙx€5^ M|ŠyGŒ%_×øÚó‰¡eÌ\ŸèpU§´ÒžÍG“d¥ir7 ¬Moá fÒÌT‘«R½äb\; èFYglI| 8+Lf¬%NQV´›¢û­)!ç9h^±BBE™·IŠR™‡ — oh6ºzOXù•åJ_n‰eó·Œ&jª››HP›ŒHæJN…‘7ª‡\ÌdØKõ\n¯»·g——Æî½ó™ïë¤~!Ö¹?„õ™i[.ÛµtAÙ;~Þ?¹÷ë³­ŽŸüÏY±`Ý¡3ö4/úyÚڛݑž‘¿ûtûCÏu˽ê¬-³ÄÝõµÖƒº~¿èüòýó—­œ»ôýVýêÿcË ?–-Þ|6}ÇoDz½~ïàºbØ…Ìø–þ±yÛ¿^L¿¹ÿÞ[ðí”ÙøŽ©'N>òË{''µ¼fÀšON¾úçÍ»Æm:>¨Ã£Ÿ™ùÂqÿ¶¢)»Ú5ýÝ9vä‹3ü;{ZÆ©&ëMo.h8½·iÏÒI=¯nÐ`êàŸéŽ‹®íù踃þœß·møÐzÓ‘ö+G¤néûiɹ_öú‚Ô_Ÿ{é®)ã3Z4>°ó×¶™4öÛ“÷<µó‹Ó³»ýqäòEïÿinï^þÎýé÷ïÞÛ±oqáœgþܰ£YÚ¬W2ŽomÔ}ÚÖ²žV.|ð†# oúæ®ã7[¤Ú7ÖÛc¿ó¡Cmò¶l›sû  kÕ·¯_»á®'žòìîÚû–n®Ù=¯ÝÔgwõÚ¾dušåB[ÛÌÿsT‡¥¯ùž³|¢ûŒU™u¯±ýééMgwlÖ| µdçèìéÁ‹Öd<0aD½Qgnœ×uÓí…uo˜±âî! ·¡¯k:d¤ë†/Ìï4íE¿-–rþö¯–š opªùœ+þØýƾ]1÷¯œÑG^jzfnàäÖ)…ÉW½ufôÛOí_~ò»Mwÿ>û®’õø~çÉëgÌþkë®E®¾pøÌùëž=¹oïíÙ»—5žÒæã[êMiù¼asêÔþlsÖ¦?;æý²zÙËü–R®Ü[´x{þæNx¸î¦õT{s÷Ûvèß§Û¸‘‡¯_=é®&©ý{_ÕdãBÝù¥ß¦³ü´ï|­o¸¥¸Á³í–Líÿèè)++óa«ŸZý«¾¹cï¹T« ÙæN8˜wtæøžKŽýjìÃ_ÞsxëüíÛ.ßÕ`å[ŸMœû½mÖš~´îñû}Ë®ºpmVí—ž½6Ûä·Ô¶×¾lf“«g´u´È̵ìj»ò“´Í¯e7~¶fó¼MŽ ÛÎŒY}Éâ'‚›Ÿn(¼wëÙ¾]ÒëxÁºÖŸ×YÔìÆÔzGv.¼B,¿bVæìþ·š½ÅQñÄ?‡­óÁÃ3ßørò4çm¿ºÿ×ÂÃwsxö q]ø²¥pÓœÚG›Í›½|àOMí8äùA+_ÝŸqÛRþô'û¯îqõêÁÔôv#¯_bﻦ÷ê/'§ j´}Óÿh=âGëŽ×'ýãàü»{ÜSÒ«ádóšY¶C£\ÿ[ÿÂÞÚcj÷8–·fÖ[(Ìž]çMçœ^ãÏvÎâ9ÔZØúQ‰¿ðñÞç;÷èÞ¡ðàÌQë—o*ìÒ¢å¥4o_rÛÎoë}ãጷf\wçWc·dý©äšíÍï›\«Ù®÷3[¶<‘qd³Ó™Ý¦Ó;ï[•ùÈSþû^[µ°×’OöZ¶ga¯¯_öPæ¬éŸ=`XƒÇ³ë?àÔŸ™÷øæôU¦;ík7õÅ;3?;>à¶.}foiâ~òèŸ%Ó?yäæ &=sä›'ÞùþuÛRÖO\sÔöýÈM† |eØ#Ãz6ÚÑì…ƒ©Á;ÖN}´«MÞ¸ôù?®ëøÆ«•ÈÞ?æõ<¯oO›ÒAï§OÙ0{>÷‚åAûîŒc“ê7Ÿ}]³ ôܼEϯürµ‰N9ý¿ø• ÝíÃÖ>Yt§ïùQÿ ì{tóÀ·~ìÀ}Üå¾üü®ãU?­û˜6Þ‡VØ®{es÷W‹z¯^~â«í}&<»îÜôM|…ëÿçÔk ßoáå…­íçÜwí̓÷Ô«5èʺ‹Ç¬xqF§¿žW§ôƒ¦óS VLtÓÛÞÛvÃçãï˜v铃ÚñÎfìݼùÕ·/\Ò¦öÒÅQqÛa¦«€Û.»Ú¨ØvNÛÎW¶]BŽþ¯BoG'±44YºÏo© <ê›êñ¶“7XŠáq·ªÜ:Tôúm|€íä¢/ìx°QnM*õ¦Z|€í¬rÒDî©—`_ÁÅþø`ÚñðûEºËT!n|Ô{­UAf¯GÐÒ-³ò»#âE½ Éë¡ßÃáyêb†,öhÀðRRMà åÃÃ*? <±Y…Ð8X»…±ÓøQH\$`x_– ³ñaàóŒ XÃòÙ-aqŒÅVC‡ƒÙ3Öðº0,žOÃêB‡ÓX]\8X¼PXü…Z;6Ž:pßáÎu6qëFΜÙ!<&,Þj±Ú¸s²þ¿xð¿’øO5ò áÿŃÿÅ$ù_#ÿ³/ü¯$þS|Bøÿwâ‘ý_Ö*óßšäM|Âø¯-²Á¶Á ÿ"X¾x}%dûß%T}ÿŸæYvÿÐÉýÿù\\ø?VXëÛ¹$üOþ' ÿ“„ÿIÂÿ$á’ð?IøŸ$üOþ' ÿ“„ÿIÂÿ$á’ð?IøŸ$üÏ1üºT9ôÜ"eõÿüžR_FDOšY YÕE÷;ðŸøÈ” þÄãA}fu›¹J.Â4猑p~tØh‹ôV&ñ £3GFc`(+ÔA°Sœ-vOVV³+‹Ýy·9 j Æ@j†úš^AS_"ƒ§†0§ŠÆ nRåÁØYŠå"°.Лq ,y èá þ "è,«æäŸãÌ€^³Iϲ 0°$#f°ª/­c€A …ÇDóx± wÜKì"K›]ŒPÞaY J/iú (^7’;Jnäÿ±÷$ÐqW¾¨÷ü€…¼%!¶°h¦»çè‘0Ù’°l! IØØ¯hÍ´¤vf¦Ç3=:<–ýX›lÌb²y¼¼…†]XŽ€ó–p=sf¹ ˵,,Ùl 8˜%„p…ìÿÕwÏ%[òx–×Öt]ÿÿª_õëWuýþF'âwßgö­îƒ¨¬˜‘•V†ÙNáý\f7ågïuÚa~ô¿i]‹3eìhîÀ~ÔÑsû¬´>dOI›Í·êö¸g»<§a¿ßÿïƒ pù÷ÿ¬ÓþW`ñýç½÷ÿÕ#xûBˆ4³RP"‘‘á0+òâ°ÈÇ#|X«rÇ /ì÷üßà ó&{ àþçÝÿ©J˜ûßkúŸ\÷0;ï¾wNû°á{+w¾¼¤ñØ Ë~5ØxæÖûH÷ïŽüó§ÿûÄwßÝuʹ—Ì[óôW¿õô3çW9ô›]ñ£.ýòІ½Çw=xIcÝšå½-/<¸é±·=‘ûô²|é£õß Ëw^0vÎÔš§¹[ùÀ#ÏvÈòYµð¤¿û°wåÞ‹•­o^;çúOøÑáÛW?pôa··½u ü¯¬[ó?§ø®Wß8âí|Ž¿~`Ïüõop¯^Ú•ÿ¼þ’Ý¿?ÔwñtÓµ¯,}¼£ë°÷o;zÇžm·^Ûõ7‡?ÿýÛ_¾dà5=«ïÔÁÏŽ}烯m¹ëÖ_ûÅã7íPCëÎï¿ùŽäƒÉžŸ’.[~ÚÆ¯v<¸õ—ܧ<òPýn|îºç/i\µìŽø-ç<º2vvÓÇ=ºýƒ?ÛØWÕ©2sÿÖÜåkÚÿû3å‰;Ïê¸9}Ó½OlmÝü•çÿòþÏO8bU×I ßsËå{&¯¹kôû¯Æ…ä ÝÉì_B÷.¼êŒJvõ;/L®xwÇÛ_ßãï¾ü2áî®_?¶$¹æ¯~úÎÏ6n[â»âá¯O}︒V~æ}1òÓNÔæÆÆ³Ûøñålü¾Hv|\„’ÑãŒæ²–Q~fkÈ›zŒçÊR1ó½ì¾Xô1Ú²ÙUÕªÑVP(i´E³ªi´(c´Å £-Ž/4²bÃBl.L+b´Å…BxB¤ÀxŠã ¹Ø_`<Å6‡ ÊÐJAZÀ–Vhd¨`dõB´áº¾ñÇŸÅGÞ|Û õ§5Ir™YqA>ò…Ýä• .ý/V+öaÖ»ÿ_àâü`óŸ…5þ=þW#ðßfD/'¥ ü˜vÛPj¿pÐe¨ôþ–WÞÜÿ…xö°(„½ý_5Bt ´¨ tÁ¨¤æKó~:ÏD³}'‚¥¢CÑ&(‡?´$}ÐÀØ+J¤O‘2x£gš‰Ò+fùŠãk:Jï@çM‡¸4ß{v%¼ÓÓÌ430&T_ žQäâ â‹$–õKt¹Ç+n"¡ÕñÚ®BQ<;hY‹G¶rTž¥3hü”ÄÛ„q¯6çÐè:Ù=¦¤Qv‰*‘UëÃ^´É%N'P’¬êXÖsþií^MVµöõµv¬>JB7A®4.ipäd:!Ø ´lL© %Gȹí}K—AùÖ%]«Qpvtt·÷÷“Žž>ÒJz[û:—žßÕÚGzÏïëíéo÷‘CŽÒ{‡ñbF" d[p J€%ým𙆑å#ý’DÉYª¤§pÙGZœRM³{`±Š6-ëí´º% Ž@hxB‡‡@´$³¾ƒ­1}±‚Kÿ¯ï¿xßÿ¨Jpñ¿v¾ÿâ}ÿ¡*ÁÆÿòí ûÎ> xç?U þÇY¶6æ?/à÷ÿ=þøàâ?W+ü÷Îÿ«\üçk†ÿÞ÷ÿª\üÔ ÿ=ý¿*ÁÅÿ`ÍðßÓÿ«\üÕ ÿ=ý¿*ÁÅÿpÍð?äñ¿ÁÅ¡føï}ÿµ*ÁÅÿHÍðßÛÿW%¸øß\+ü¼ýU‚“ÿÜA?ÿãƒÞù_5Cÿ­k Y)•U2èÖ'™TR³¸ˆ .oÿÅY÷ÿXôÿŠ1ïþ_5B‰û3¼/}P+ŠOZá27+Ž0÷@½€Ø}°õ .jE‰V—Œ‰©xBNÎàBK?­±”V/¼Ñ¢åF›ôü²‹µb–ú »bnî¾5GèÝ·ˆ?Þ,”ãÜÿ¯+}\$D›ƒÉ•oÖA¼Ó·On÷Ë–ZW»40Ú‡)=“.A—¾ÿ`Yû÷_‘ÿ|0Äz÷¿«êOêíoj+ÃRïc™úzý÷-Äý…û²¸o„šXKû¸½öm{ôª…ß¶o!çXnµ`°¥âXÞéü•zsåš"„Í7ÞÞD‡ u÷ª;ÿÕ]ûÛµ Ý›rÍÏzî55ŸgÔ—s.Ý…÷\9’g¨¯={*¦ Ö•R šIøP˜à=Æ) €¸rY†éìïÑ Y„…J!tæL‹ ôvk<3ŒCH<—&6Lü­ífŒƒ˜Ë©’™Â£ÏA9Ë%GÒ¤™„ä¸,e¤¬œ5YH„ 8nÕA :J7 Ê‰¸UD þ¥1).'¢‘Æí2€·þöB2ð“ûín28 £ÝAdt:áA³;‹Àb: àA[;ðr¾» ÿjàUÞ”YÀJ™¤˜Š'ÌŠAh­è¨„ÖŠ…Ô­èF$¢UÚ.:h †Ð•´A "æêð 9H R! !èpÉMBJ¤0ý²)ÄÈð ²^0ÄcETÍ 8åHa Mqà ¥gHQÜ8ÃÐ^ʼnÚ 80@…’…uhÌLZ9'ÏŠ\!NHɹq Іœ§8§œð ƒ¦ŒŠ„ ð~I%€P @8‚bŒ~âVŸå d`ýHI*Ó4»pÚ&Êd:#'i “1ÐAúOé¿“Yt45…Pfl;ðh¢äa¤§à6ˆÑ#çi’• ÍêQG!ËŸ±ƒR"!§³ÒõŽ }àÏLÙ;.3i9²ì9IúlÒà›ƒñ« ¦n’L5#¦²¸ïgê(`Ѥ.¶èV 5A1ƒQ$œ„jN–qªên–óÔLD9¢ÕHˆSR†NÞ¬´ž©„^§Iº Ä “&‡µØ…C†Ú˜ ÏÈ\Ýo<ÁfÔÿµHÐ Û#3²–±jqPc*fÆ”ÒËû“â¤öhô-hô¹Œ3‰©sÂ2 p$›&&ƤÇ=#S'&1N‡²MÊ¡x²©!æ¦uæÚä§;Ë.6y~))½M}¨dÒ… gÉ&½`–޾äT.v´’Ê„#Éhd%TG¢b±™Js.šeYCõÍ¿¡øènºµ]¿®õã¶žíb1ÍÆˆš³ó¤¬¢ )ü€ØƒýYF™Ð™ÍiØŒTMÀ„ ™aÎæ2IÇGP9C›JPþ“ †hë`oÝó§3’Šý¥¨cÐu ô©69«â¢›aüFí È”èª5Mòx”Dp3ÛoS‰6>rª©ñëä,\´h!µ”\¸xñB’G$¢¤€Ò%ƒç€öq9†jRBLæ`ú%h†…›82¦óœ‰‚®éÛ“º†E‹aEJ‘†Aí× ÌUlñâÅ(—5j,ÓZ€TNvž…ñë  ô€R©/‘Ò«dРª¹¸gô3#ØR .L" ói2éO‘ˆöðÃÍŠV&M·ja {ux²``t-3IuÜ$›êƒÕ;ÇÛû£z/”i{„4[-ŸO’C)Í´ˆ4[fQò±Aƒ( 8êgq´‡€õM kÚq°=ÂΨUa‹ªÓHiŽFQ«Eb½³&µ øÇêÝPÈÖŽMûÐúTk­ l­¡ÇúR_pEõ'ÖVÃŽ‘w®s¥QU€Ã…p@»ÂïÍœìÂL;x6à?‘íÆl¡¦Š#0E­.ÁÈíCˆµó€ov2Q‘ö‘‰¼àdbLÍ$Êö…¡>XWèRã–xû¸ÅèŒÆ-j.¯VTSŸ(ùH`P¨ /T]Q(JfÀ®Ötç’åW¸¢ ø¯K îÀj€‚k>°ú¢ˆN ½*aÐE˜]Ž.„ª¢¯¦Å¤ô^–¾‡%; š?ë3ë Â*aT™óv\È\²1l¦‰AŽþÀšËeÆ+H çx÷a¢7 K) óJiû!`ÓÛ ÷ƒ<’ ]̳û¯·Åüñ@¸Poƒù4g:Wñx¡”>§7Ò×ÐVŒ:•Þt=ÊóöXQ}®8!s‰¬Ì¨)§RY"°BQ]1'z^É gk¾À:šÑÊkc¹vXvdô£Ô™œ4¸¥™f4á !üÌ‚!9>sk„Þ—v,áÀìU@„ãÒ~¥”*«Sô ËŒ´@ûf›-­(Ú1ºÔe9;4’É•¢³u²kI·Ãt)Är|H{1V¬Ej eÎŦ.7–´’Æ)ý®W,ÞQE89Ã'˜a6bŸõ5‡J¨Ž¥´–ÙOõÂU ‰j„+¥«£dŽôÔÒä8t{ãeOé)+›Šcp(ç}TFuÆg‚Á®R;šåÆàЫ‹*y3Òê”C¿îÌvdr°ì…°Ê¢štg¼Ÿ ‹R0C¼MÃ-""Š¢:4éƒÂ¡I·SÉÝ b£ÒŽÀ%³Ã¾`d& :uk%)Ê©h×VCŠ ø­¢ q³Úä!ˆ@ól-og[¯¾ˆaZÐ~6TjýØÝKÀؽð³ß½9Ö¶µ²tÛhÐØ^ÌÁîÅ…ÂÒr<æíûîE¿žÁ÷03G{«:ÁO5gô—ëÚ;Y¼­o&ë—õ9„ÄXuÛ{:˜ƒm±à…¹ ³³ÿIÆgb£UÞþBP³ÿ B<ˇÐþ' <ûŸj„8 E"ÍÃPL†#Âp°™o Gà¿ W²årfËу÷œ²³¯MúàÂïõþçöåÇ ¶­kÏÚ›—-¹nÛkk~w÷ÆÈK/m¸6/ÿÞŽsçõ>û¦á½w<úÝOÌßùì]y@GÖÝHÄ#ÆûLÚ qúœOd=PH”CAf6È( Æ;Þ·ñF£ÙxÅD£(ÄxGWb4QQã½Q7Åhâµêg¶^õLwO à 3ηéúƒ¡º««ªëÕ«ª÷ªú÷k¿aÚ¦u©}§Õ›±´CÝ­¿ßû©–Útë·?5é»ïÒw ÆŸ[¡lôc«©Ÿl™Ÿ÷Côà=9—î3zÍg~ù9-NfG ïØ&}ÿä“-CžiVoý¹Éäcëb¢F”é5zÿÌ×#ÛíõYµàt݈üÍëFåo˜¾?±|ë¹;úªú߬ðJ@ð„ùGM ÕÇ­wsÖç?fgÍK¬Ù­õÕv£ß:ºo~íoFnÜ»¬ÓÓ¾\«éÕ'5W÷=²ìËýk}\ïthèðØ™[³ž¾N6¸ù:Ú#ÕgóÛgÊÎ÷]Ö9oÃÌq׫„½tíü´ÜãÁ¹·ë¾[¼rï ÿ}?MPÇ? ä×-Ç^Ë/hy;c[Ù«þûî6_5ùßß¹òÕÜüæ|¿uqµMh×ÞOVÌYdRZVÁWãóüRퟢÚÞÜÕéòŽË}UoŸyïú’³Î5¸=íÂÑÜÊÞŠê2çrÂ:rQ×-}ÂïŽß¡í¼/÷Àóé¢6Üø†úµàÛ'Îܸ¤ dÒ˜;MÂâ–æ¾w¾zê¸9µ·Üì=åøÈä;;6Òù-ò^Ÿ¬N(˜ßø«´ÃÙŸ>ñÝþñžÁh­mÖ(ôh¡Ú¬Z–´\bEƒ êªpƒ>-©ƒq(I›D&ø©"ñiF‚D©ð ~t]6»[²P&™Æä(ƒ)N…ÆBmjBÏ…5…á}1‚¢øG:Ãw#HñUí32Œ¦¬8¾@A©‘ *˜)àƒ]‚³¤3Wš*MàZ¸ÚY„ª[š>‹ˆÃ/é—@ÀSPŽäQÊú}Q’$4 X²`dEidí#¼ŠŸªgD8A…„˜êd ñù™÷z(8Vª#(Vƒl<µˆeŸÇ|]Õ=Ö+²‹ƒ§püTQ쫃7u„ºà,²24ƒlBŠ …ª¡)»•)nk©ØŠHš;Rƒ3R" ZrWë§µ¾«ovHÊ2@ÏÈò¯×Ä’á%>/ÉuJ}v²!Ó?4*‚K5f™xF!BÛŠâÐK`/Jš1˜pü;ÉÒj ñð)º*ܨ/ê–ùóvù×íñv?oÏ…Šç òç?qç¿q€Méÿ°¡‡fRðÉX?à‚Psà/L!Ì×( ÷ü ášZc{¢9ù5RÇÚ¤C)_ÎöYŠfhÛr¡ÊÓi›k,e{ãlŸå´’k&³Sï‡Âg5ð1y¤µ?[àkÀ#Á-ª.ˆ8ÿüã†íëºâÒè¥ S–íÝ^+ÀöJ‚^~$ešpcSZZqO8dëïÁÿUð?=¬åÏxþ¯"™ü½ÿWÁõHÉß{ðüW™ü½ÿWÁõHÉÿeâÿÂþ¥¦ieü÷`°‘¿H†¬O˜†þ&™’úi“ r–ý½xþwšäÿ?K"ýGhVñÿ{"Áÿ.“}Ñìïÿ¢¤­PJ{Üïöz—œùß¶d*ç}—êë;îç×Åü¤Þ0È€ú\Fò03)=ôû­TÈçÑD‡Éçu*=©.Z#ŠgwݽZ¡p®+œë çºwÙúÏ{øü™ü½†ÿAÁÿ÷LÉß{øþ?™ü½‡ÿUÙÿñHÉß{öÿŸG‚µüYïÙÿUäï‘ “¿÷ìÿ*û 2ù¿Ìý_ÞÿϰÊùù‹þHpîôë—©Ï”¸#d|²ö÷Xdn%šâXeÿÇ#Á»øŸ8JC°ŒÂÿ¤ð?)üO ÿ“Âÿ¤ð?)üO ÿ“Âÿ¤ð?)üO ÿ“Âÿ¤ð?)üO ÿ“Âÿô¿Ìÿ$ú€ãbµ4Á’!þ' ì4êdÃáƒbÕ(-…yº`5ÅÓ„J‘ÈN¡Hx~QÞhÅŒŒ4Ëmõ]¼€gy «›,Jš‰EЍtPw·ê2eՅЀ+éB4Ih‹ðÝ“¹£Z¬±"¼UcŸ ¿È†t…9+â„bªÇønùw±¬AÍQËÔü†JZIÔ)ÆÛÒ(Î;‡4D#00Ù:âRÝå†sf¤Ñ”Æì-j8ʈ†˜•)†2tnvÔÀJAÂú&!ŒÛ:—5Îåï¨^k¥„ˆZ žùÁG#sÜ&ëdÆF¯³MiéžSlËË˜Û üu’U ޲B”6¿±óŠ]:ÅÙ#ÐÕ±V̯VŠ M[šý¢».¨·¶4Ô›ø–€ù“F6- VÌ< ¿î°ù2„fç%'Øp—qeÎv2GÕ›rëê¼Y’m€—œ7¨âw2GC,ZŒ§ÈÅ‚œö1„¸³aLígÈÌ4ʧÐPž•ÎäX„윟µ@7ŒÞHMèøe4-Ùã@íNñ.JÃaå<–C•ã`é#Ô NâÆELÑË,÷dîðJ¸´\xµ§¦ Z§ÃS9ì<Ñ$Pç¢Þãf!ðeh¬LJ-Ú ¦ðvŵàTþ%…«šB3”Õ²œÑ`¾˜\(µš—”Ää¤5@xÍàM(d4‚É &¨`s¢×†}dµ"› ›ej÷›•¢§ü¢¬ZÆU³²„™—X‚®.,¦“E‚0ô’àÚc°%@k`=ƹ© .ñT.:ÎhPkºè}H·åïðR”š: vÔÀwÒZ§Mƒˆ¦@)÷.£›ßв`×hqÔ²`‡(#îEé4Ò¨3Ôè¥RœÓ ÊhÊ£)Û¡dþ—W6‚²£®V Ú.¯Õ¼1D£1šby ´Ÿ0^Ãá p3‚«|Zh_ʽ£–©0»Ã>ÄTK£ÎŒÎåïðh@[9¼2„#”†vi4àôÒÑÀ|*ÔK†ókZtTGã¨EG!ªÏ}@býs%Å ¥Rœ“C­C“v C‚Y"N öY½]0\=ñÅ¢¶€}ƒL!X&@«ÂVŒ'î]°VUªÓ×@íÒ€à\þ; KËìÁ¾0F°æá,"¬j€‹ˆ¦Õ¼É@»Ûìá°ÉjǓ͈ºfö8•‰EáªÙË‚G K†y8 €7¿iÑ};JØB…¹˜ÅŒv÷æ7‹ÝùëCºÍ ‡Êìx–Ü–¿ã‹êRSX"Š}Šõƾz-^ÊàéB²äý>ðtÀ'ÑÅ›ü¤›­PèØ¤ÖÚÚgÄn eÒ%CÔ¹üK.+—õ ¯îEYÁ² u*–?ƒ jŠrïlƒ{®hoà~-9ü5 ]™mœÌ_aºws()þcŒïÖÁ>þiáçX5êñÆÿA3¢‚ÿ㉠#)=«c™$J“Ô_ͨ©duµ–!“‘ë¨ÝË®ŸÜJªÿŽ1¾[‡bô_ ÿËñ¿þÏ„ÒáÏín¬¯©ºó· gW>$0×Z-7}OlŸ±yÕB«´M¹ôÃ’θØ9vrÏÿìü‰k»sVáÅ…“vžLhRøyçøµI¦Ü)s‚{n9Rkçå_qwØŸ·ÞÙ¶–Nï6jR™ë¿¤œy>r`ýolÝüʉKb Ÿ>~æÙ¶'[*®±ëýíOw÷ÛžÝ{Ô¯“ ÖÇ…=Lß±I;$øl¹>÷C²ßÛýäà·³cêºx烆Kw¯ÿÀ8z[Æ%®ZÁ¦Ñ_•»ŸuñBóÅmVÕ?þÇÙO×ögê/±%:¹nþ¥EÙŸ}ØoGö¹OÙo©[e_IšÑzÄ—AÎj[$-2 ®¿pîê³_œ®7°}ƒÖ©ÊÁ³Þ.“š·sÈÌû§ö̦¿1ü½‰½Om¸Údøˆ‡çVŠnôìׯhç÷8t15Oß-¤÷îïZ–;w>4òQV‹¹g¯nU×Û[wLÃLuw=ØÜÜçü‹«Y6âÆð¯†÷iýÛ€;ï×Òû^«ÚoL¥è.«CŒÿÏñFÁÂÇTš¶¯ÛÂöÓ–îIŒcêtì£ë8$ö׺úûܼ Wúü°ûöW¿\«ZÜèéiúª1Ç®&W^÷fõÔ7¾›•:óUô©eq•Ù°S‰mÃNo1ý•¦=ã ÇMÎYÀüãóUU"*Þ5h´73¥MÐÍj§:ÜÝÜ÷‡ÕcŸÍ¸^yæèS.¶Í jS{i÷ ïW!Gú4˜ò·ë—™²×·\¥ÏˆÙË&Í’Wié²&Ÿ6røa>¡~Ï7ô|·oL=Õ(¤NÏ}}Úg§ ½ñ858deVAîÓ‚Ë•j5¹W`ügãôÈcWÌ;ê;M;¡A؇›6]á›×)µ~ó¦> ü’§ú›R–ò»¿ip­æMR’ÊN>ø`÷䫹Ÿµ Þ >W•¾~ul»£NlÐ¥Å÷ã}öœîsoâßj%^¸V;hJè1_/c¼5¦ðfÃÏ;U©°pxhóGãÏæ¶{³öÖáåÖÄ./ß?¡ïº^9GjÆ…ÏÚRý—Ñ‹b7MZò¼J…#Ï;Ķºsí_=W+¿q¯uÒÒFuÜ>hnsû#zù“ÞøÕŽv¿–iÝð»jOÇõQå·nu·ümöAÊØ¤½ëÏ{íÓà­˜šGsªoúÿãü©'±)Ñ7'ß9}~rüɹ_üØžž¸í£a\àŒýh©Òiíý…‰ñ³ëÌ*WwUãþôí±mÝã ·õmSoÅ£ë‹Mqº>ÞfʦØ/¿=´cæÛï”/[óÓS©½?íº-v}ÿÄ=‡V7ë²=xw­oß¼Ólî–åù™ñF Ìè9½L³íSÇì|¦o}ºå°Ê‘מ<æÖšC»/ý¬YJËæÓSÃÿýùª­šiÏ6wrÀŠ·î´ôïbÊYV#tÉÝç6]©Ù=¢{lÎò¼_ÆÍû÷ºÙó:ú.Œ>;úÝCc"ûK&ôÉÖ+Ř7Òuá•¿ƒ&tXYïõIA×FeE¤žóí¶Þ0¿|LÛ×ÖœYU%žÙìÏYY9ó§6›5³_µö1ë—y¹ù«vQ3¶Ž<¸OäÉ€åfæÇ¿Q#¤ÉòÓäÏ7wzÚ¦b³˜Ö?ŒÍS«¦¿ZmðÞ‚!öoëÚk×› ¯ÐE]/qÛÿU;º²ìÂ+kºÔµ­rì|ËgC›þ2'ñ?Ó®l®h\uz\öæ·¶U;u¨Îü‡¯OÜ•øÓƒ§©—odÖë8buïV³ËæŒTí_ÍÝ!ùWìs=ÿÄêlÐüÀà‹Cž=ß¼²úÌOr©såi“OÆÔ(ÈÜu, bëœcý|ó£rSªu›:©î-ýéî¬KfZÛF6Ž­ÜìÖ•´¶¯>mÐ(öhÌÏó´9YÝX#§í uÞòéÜ¿z"0öÂ5 ¶“=ÛnèVx,çdÜІeŸšØù¨ïŠlã»þÙ'}ñeç/F,ÍÙ{é·Åúl8eìˆ,óÈl&$W›Gu´¬f-×Xå<ØAªpƒ>-©ƒq(Ï-oþ²>ÁO‰?‹'H” CÁ0<[·¤!‹çlOŽ2˜âThB!Tц¡&ô\èPSX~”2?ðpT"@C™î³âtøÐÃÅÿ`NðUGôà@œå)ó+0Â+øüY„ª[š>‹ˆóãKI ‡ J•ùž-pDpFÂf01ß’"iƒA‰“¦hW’r/ÈhޤA±¼D˜d 5£)W@®œÌßq²O 7 @p2<”4¥ÓP‘I*½ZòY çaÌ/ €Í«qT€›ç_Kh:Zu†¦TгGƒ±ªIùÈì¾ãK¥e1€™¥Ïâ– ñ«€Êòÿ»™Ë£­fLŒ.+€Zñ5p‰ËйüÆ3“ê% ß8¬³%8­”j•>E-ÿpØcªÉ¿ƒqL§Y "ÂôA:é&ÜSÎÈÒ´„RBJââ"‹+D.ë*ÛI:2šNÚ—‚étTY¢«Á ´F€Wˆ§cH#ü¤QvZ5žugZ(†"¶>¼5p,ä3©çfJ(BdGv Êî¹?éDæŽê?-…pþ/{WXÓñýí{«4–ÆöEÜ™»EKK­±/!"/!• !¢¾E«vJ•âkm• ¡bù6Ô’*¡ª¶ÚŠØ[ÄR*”ÊofÞrïÛ’÷î}ïy¿öΞyïfæÞ{æœ9çÌÌçCÞ1æl#”X*8Ûhd(™ À¨#½8=ŸÃÌÔ X¨ŸÎlB)µ|mné._¾6Á._y­.˜ûvR5…C÷¸Þw4 ,Ú^’¹œ÷0Í éC¢‚!ò4ã»~UÅ4£¬}Ÿ û†"kÁYÆòœe¬I¹ØIŠ4û1«{ºSL@[Ч|dð¨˜8Ó¬K ¦ŒjdÒ%Ëi×%U¢ÝÅüM†“ìE\Ehœ=‰!b¥y"ðaó)ä $g¯ú;ÂDLŒiÏj"FcÁÄ:f–Te„ŠZ !‚¢ö}‚N9&ã’Qn.©JÌ<¿&º§;¥šH’+Rªpä(}ÌpI ÍJ¦Ê·¥ÝFÒEO"ÝÁHO,懄$ ŠøMz–a”ô!Q”„'åúȨaUؾoðãP‚’`¨1 7e&Î!U(U 5lþ,>0€»¥;¥àØ™@®8±1ƒjŽ[ÔG5±ÉgIyjž#QÞ‡_ ކð¬ú>$ò#"`ž w F}¶ï<ñ¶GÕè$‚HF 5óh:NªÑòš"ÕQÛ•RµAR“òˆ ûO¬´†¬VXqáªÐµ´ÖJ²¤0öö°·†Éž1ööddvÃfˆ&þ²‰³‡º&"ΟÐü‘!œN›â.$çK“ruP•3UÒ¸ó\Øuñpr€’¢HªæèÊ×`ðÅù-ù8ãâ¹£;ÅÁ–@ÖÖL:—8,MVVÙ ;) 5:§š@ÒÊÑ#–H¢"âðYGXÈC8;ÉøUû’HÉ",Ì•C“¨sæ¾-³€ú%GWe5 w¤ÆQTÔ¾³ê'Êçxóãmü襩IVFvŽÀùÛœáe„¼Ùvášh®á+EÇFÓñm¸¯+¥,shÒÌó˜õ®³›ì Qb4D·¸·–F{Æ… b4h¹Ñàa¡ŸCžlkfÆœ˜OÞh›ó8':õÊù–Ñé{î/¼ Ã&°aå™Õbû“¤ñ÷ž<ôÎîA—ð£ÅWüµùÌì]a÷&½V©J³/¸ÙQésmͬ•25kã7Ÿ€£7_Í¿â§g7‡ÍHɵ`ÕõÏVyÖv_ø¼­+Ï Ù½¥ÕÔàyÍ& xÆ= >¨{¹tÖEÆ]8÷iŸúãsc>è›}¸Éè³/?ºžv!îl÷1;VUÛ÷ú®Žƒ;íªy3yTùmó«EŽ‹­F í6£Þ¡·âf,Mëy7az«_Þ+zäÓª“sÖhz<öc¥ájþåßaÍñ“}kWîü¸Î­º%Žzò£ãÍ×5,ëZÙ Gl¯Ï_/š´9²Úˆ±‰÷„å­;3àcÿ°Gmbï¬9\ûVï'תþjÒì" ö‹@}™Ù×ÌŠ¿Ü,½é‰2{¾ŸVäléÈkÝ_óûßìŠ ÿv8{Ä͈u¦|çêbÿ²ÓýÊ•,µekÅœµYµé/Mçç=¨shÁÙðÌM]Z߉úûbŸ=óJ-˜?ðìµ.9ýÞIiö01é—ÐÏ;DéË,kÖýVã¯Öm\Iýxdü«5G÷®±ûÍÉç¦/Z_gθÚï¥oXûàk->›Yf±ðw‹ç_ï>ð´iሩs õnøØnÝ o¯YXw@«Ôµ¡³ÂZµ;ýæAݽ¬È+Â¥½L|ám™a©¨ÇEÓW— 8U:(jÖõb\bÐÁܰ9íúß¶ÿf¡°ÑC+UëŸTeûÌeŠœ:t´"Ué‡CoïÌx{û‘ w¶¬OÙ]9þ³#=¶+U%õË:ç-Û=íôdkH‰3ûÆm(ŸVäxDbÕ¿[Ÿé8&tÐöÓ¿û lV?`Áž÷‹Í*‘q¨rañjékχ±·–É {ÒõÃY…Šum7bäÊO¦õª¾¥BËÂ]‡V<•òñú+gw-|3ml±WÖ-©0=ãþûgo0cƬMõòà»Å.úùNm~xñ9ÏÜi<«NìË-C—Ož»²LÀÙøìÒ“æÅ¾ôm©WË{£å¯ñCîi².é¯O'§u;ÐeÕ”ÓKk²ï¯š’Ð$í½S¦”]Ö©lbñ¤€É‰ Ç5k<íÒÊžßM*óMB‡zió7Ô(Ö¬nòg].ûï [·{FÀö•*_~½vÖ»/¯=‘’ÒsǺ ›Ï |ýäܽæô«MݺÛ{Z”¢ûÎÌYóE»ÿn¬ú]½%•¾Jé9vþ˜Ÿüôûà-g¿Ì˜9áA^¹ÎöeV«Q|[’_Øâ9g>1Öoâ+µº”lw;¾{ÝZðDéDÈÆÆÌksuA«‹Œ;Q‚Êø~_†KU,Ûc`àÒÀëÉËwæD×’¼6äñ×}2vßÛÑcIÈÉuñSNŸˆˆj{wgÜâñµÞˆ“o¹*>ZT7 á6 \íÛŒ‘‰Ì|WxH˜@ŽEäªoõÄJ±àIÒ ¼¡õ!89&h V'ˆø+Âÿ¢‡WŠæ X6/‡†•!ôü;Àþ÷(B€Èÿe û¿ OöÐŒ†ÿà•2ˆ¢XZÏE¡ˆ¨A,M  Šáõh¾|Ñ÷§Ïõ_DúOCØìÿ¢¡¦ÿÞ(îÁXí×±}&õpyøýÝíWŽºž—P©µ_ó핚u˜z#yý^®Mçç£/¶zêòõ¾õâþøã»›‹‰]t1=H½Qf3[¶wïË&ÖO®›}cõ¤î k–þsvz£g1/? ôìSñóž‰W‹/Õ9X¡Î[qõ*t/RºNîúÿ¦5>2©ëAç¸×°È«ÏjÝÛU1Ô?¨sKÁ{/DU¹ÍDžÒ7à*–¹ÞhÈG³Gmž£ …%ª-ÍÖmºÑ7eÝ–ÅËû6ÿ-pmÀ¥.1«ôï=nRA¿šNþšÑ/lÜ´úƒ¢uN}ó¿#.¢<¨{uíÂìÔÖ}Ï~ýéê[½wÅ]=š\þÛ)ݨMÝ^Z2;¦Ö¦[ßíyã÷•ÓSÛÚ¥ÄÝûù“Qýô‚}ÓOÓ7í}Êx÷*Î lŸÜô ßßvàŪmž>úÑálzT‹ ÍyÖ¶u|@TƒõÇo>Oùõ“ió¾ ¬ñøHfÍ2'ªÏ]øÃ¨Ãžœý9m8snâà"ÛbÎOÙÙõdLú¹Ykæ/ŸðàÔÕØb!Mý¾íýòªÜwŶŸ´4>¨Íÿó]xeæÎœ·–,u±pȲÀ#~%›îOÞ–œU©æ²â3£¦‡¥Š›Â6Ãh‡GÝ–w᤻!#랃î”ü ;°{ÐýŸt¦#°Œ‡·Üå{ŠÚQzÌ•ívŽOËžÚGO ¬ÃãÓ†Ÿ¼y|æs|šâE›cÌSÙY}Gñ´ÍñdŠåœ:>M±Œm{c{¤šB»Íu‚íQiô­íw´ì;Û#а€#ÐIcžÆþg_XØùõ?Çwº?ünC;_Y‚4ÍhÑ7ŠÕùÖgÎÿíü‡7Š•ü9Ÿ‘¿vþÇ+Å*þäò×Îy«XÉ?ÒgäOkò÷F±²ÿ¼oÈÙMþ^)Vú¯÷ ùc XMþÞ(Vú/ø†ü‘þkò÷J±’¿è3ò×ð¼R¬ì”oÈ_ÃóV±’¿ïàÿiøO^)–òç|ÿOÓ¯+ùûþŸ¦ÿ^)Vò÷ü? ÿÍ+ÅJþ>ƒÿ§á¿y§XÉßwðÿ´õ?¯KùÉÿ§­ÿ¼€b¥ÿ¾³þ¯Éß+ÅJþ¾³þ¯­ÿx¥XÙÿ¹þoàÿc(bÿi-þ÷J±‘¿KQøÈ¨a#‡'„ CŒ `±€ïÿGr—íÿ'ò‡xS§¶ÿßÅ·ð_Yˆ> ­á¿jø¯þ«†ÿªá¿jø¯þ«†ÿªá¿jø¯þ«†ÿªá¿jø¯þ«†ÿªá¿þƒñ_¥sø¯ŒHé  ü[`N4ã– àšqVÁ5 jfªÊ+ ``Õv”?ü)eF’l€3Î8áLò͆tsÐ ùG† g‚u³Œ4"½K6б[%Èfˆ@ N”*Ä3¢©:zÙ ƒî‹2ãã1‚¡jB]ÃU(U‹j¾Ð£–·âÞîò‘p~#™a‘Â"Q™ä?86f$p+Qº.'`BÙ³/0çQöDQŽ(^gøŒ@ÊðH›Áöê˜Â CX3èZ]ÇI`|øýBŠ%ð›Äf õkúFY@2‚át eù;ÐßмŽ8ýÎ胄Å`Ná ¢~p_¦aBo¨wí ‡¡ÇÚ/mÐ8hj,’3ÏI$àšY¹”jèJ©¦D[Uw¥TSF'H€£Ý"ÚŽˆ!šjÄØ”›f lS™¶Ú–óÚŠA*åÔ‰HÑ=‰4ÑUÊT•ÃðÔøƒgˆ¢¢ÖÍzÊ Ã¢?C‰µ•+!Ô!f ù†V·éœ†Ð: Z˃·6çxðLãÎê#,‹[†,§bDð¨`= eëÓæ•i/ƒÃøº +]¸&)¾ÒI÷TWù¡K£,Ój“ûå²çånËl µ¦«»'C£7„µÙ€±siê,éÂ,<" 3P:ùR¡³JwVg E–»ø)®b­ Ö³ÐfWI‚Þ«Škx™:áªLŸðšÊ¢ªHyÝÑ] Ê~…Þ¬;¢' ñZ­6 nÐf¹Ž&gDƒŸæa<è=¬Ñ½JZg!QÀà;qlî=Ö¾Ós±»|,ãDdØ<Ðñ˜Ý}I‘xFæFѨ4Lq4ÃQÄ’ýÈ XˆCÎ’,jƒAÏÆ{Ö$3P>Ÿýi“§ƒæ^IVÒ¸³¢ce&ïòA-Ó«Ê‚ÁzZ”d7›bP`fË‘™6>Ÿñ=Ò‚ü=âšäæà+ ð¯ì߆ûºRQá Vv|/׌¶jÛl6¬ ‚ t=ªAäm¡Oª5îB4σXT‚ä&ãîOãžiÜiµvWŽ VÁÌÕ@‹ß2-’¨]QCóhÁ!-š09–D¯8!åéðJ$G$ÁÌïÁ)/JŒ¶ï²˜ÔNœDL’½ Ä/ƒî@ÎÓz‚»†2ž¡Ù Å©Ó%;‘¸KO Îβ’OŽF–# WÀ †(‡“’©G— È©ÁæÛ_œ¬òd-¦rbˆ¦AôÄ mÈ\z\—hÊb¬CVë¸Ê¨Õ%×ÛwY”îpBÄŽqš™5¼·žX= 3kØ×È`g ßÈp<¬nÈÒR@®ÒâöEÇërjÝe)¹Ã3Á<ŽÒÐâ±t8¢P²¹ Sɉ,Iº’'o=ë9p²qò€4¹3²š"ÏÁõÆ( ð{d¾Gï Pª¸#i›M⨘X߈ Ljž?9R5¹èØJî›Éª ¢÷t§4B  ê·ŸÜÁ"qÏÚ¸í¯®‡fc!ºÃXÈfg’¥Sœ`ÀÄz9˜«Ï£A°¹a˜3«x ÔÌ® ÛwÖ,ÊÂ.`¯ʼnx›WÁÁ ƒõ¬^ž*0nÊò«`xLÓDˆ/•È~IU")&@‹\UpGw ­±ÿ*Ú&ŒQ”=°ZÀ1þ@Y3±ºnÐht‡A´…3pTÀoMÄ^xÖ "˜U9³ÂBrƒj ‚¢ööÜ–aÀÓ,ÄFÿÅÓƒ·°hˆ|€g5C¼e”/[©60Ϫ‰|µï²(Tgˆ#BK~‰@æbæÑð!&M1R¾X¡‡`hì{{ZT4ñïåÁ‰E2oüS£ºÞ¼ÆN길|þ_hþçÿ)‰ÿ“c(BÌÿÇaü'íü¿ç ÁCއ‚L4GE1ƒ"##Fˆ\$þòEߟV<[\Ö  è?Gq´þ øŸšþ{¾¸‡ÿsC¯ŽsÎq¯ì¼Õë·!5n'<><ô£•m>ªYñiO¿V·¾á ¯OoçõnÒ…r1‡2~xwhÉ)q3ªwÍ|xÍ©+ÆnþòBv·¼ÜÈÜÌs'ZŒÿ}Õ¶¼g§Có¾Üœ|ôa묇¿ŒÈ}+é·/ŽyÈ?¿üàÑ¡ÑçB–··Ü7/Ž¿=á×û·`ÈèË_~4yEÿ]Õ2.öªUrרì»Ûö|sá~Þˆœ^µ¦l÷ŸšøÙòÌÔ×ú¿ó|ï#ýÔ©sr.ÕöAÍA}âô{ŸîÉK{ºåiÌ©¿ïHº”¶ëB‡­ƒ¹¬ÁWºåíØÓogHL¿¯~¸²æ^“ó[Ê«ÞùÜ€ÿzz¦ê« óÏÿ½¯ù‘þ|µneúü{WWSúþÅCL”5Ë\K©A}1†}K–Q?I»”JB™) ¥d—­‘- ‘½B¨ –±•}KöŸ~Ìÿ¼çvï9uëÖ=§ÿ™s>3®÷Üã}Ï=Ïyžç}ž÷ý~ŸÛŽDÙe¿ÈIžè8¯Õ_ßM>ÐËí€nPÝ¿_½¹@¶ºÌñÞ]|8åꊒ}û{Lù®¥Mꦗ9NÉá'^šþï§û×× |ÛèÓ¬ a¹›æ»½¶Û’k>ÿ^˨ij­^žš¿uç9Löí†ø°Å{»˜Œ¤O-[x~Þº…u‚Ÿ¶«acñŸ¢%-ì:Ô’`ÐkÇêëÖSÎ5o‘´yËy&Ñ¡O"ÏÕßÑ|ë†ÕHýƒ:~ÓüKæPøÈÄ‹ãÆ|tg!‘»'ÎÊeÌÐFÅ3[ëFÚ@_ßEt)Ù1Ù\§ÿ’U»PÁm3¯k”±ûœt²KQ׿&K=¾&ëö‹ñ¢¬›Ù+ÌÔâ¹ñ‘Ý7?×]w©ñƒ±WVäç.hC(Hjd®?¸Ó9ÓƒÍ!Ëo³"WYÕÕ³1Ç/ÜO¨ÝOÎÈ6^sø«%¡-»ÄGìS´ùÉà€Ë%ƒGèí¬óõ–f¦kŠýûÇ7MšýkìêUmRFD9&·j>#ÎÖmÓ%“óCŸ_öÔ*Ü>`z\¶ÁyÜ ¿½ÑÝv¬{öMû)F—\~KmvOJhòŽá0£Œ“s®¸„7»Õb³A»—¢·n±ëíž+«½·>ÓyÙ©y»Û}¿9(òÍW+"ú›t>bú`ÆÆ”˜:nù½0aãGëY}}/½†¢BG<|n¾×ÿuÝôþ õ“ŒWŽ·¶¯o^4xNØX]ãFÖ=‡$\>"±ÅžcQã¶Yy¶º+ÒLMöðß9;!”u9¶Q„a÷0÷“õr%ô¯äæzç߯èΤüX“©Sã ºÆ73jî›ûr¢ÉŠé[æþùMLê£O Vµ\nUiÕ[q ÊÞ–Ñj¦î-Ư{«,k[¦îm£Ò⸥eqayÑMý§ÕÄY’dsB4©¶(n;Ä5©[ÑmÈÆ’?Á8¦öFªÞôZå½ÀêîÐI1„ݪ¤þ‘¨ÛíUå= êîa³°Ø Œg3`ÐðTLŽJƴ˧†à€×@À'n0¼:! BåÃ$Øû‡V!T¨¹³Å3 ÎLÌàîõ…Øö*tìÜãàÌ0øÕŠÇJR¼–k r ¡¶€ÂeªÄr hdðˆ:j ÞhÔ}éD_ÉB "tw³S„óþ¥Í²ZµŒb"Jè3,Lr&Ÿäµ„Ø×:Ÿus<¾LŒÁ²> ¬¯v9pÙ)Ÿ>07}"Á­‰››iÚ¹„ꮉCÈþ/M!àê÷A ü7¡8LÀÿ þ»v‚vDh؉puD(ŒrtÂaŠÀœœ Ìésߟth÷¢ÿšBÀ«Ð "U÷BÒþÏZ9jÿ=v˜Çu¨éq9þ{ê뼃M-l·òMÂj«CÁ ½ÁAAn˜-kœü¨¥S¯olåqo×gÛ;XLóxö‹G==©OÄí(½üºwêô˜–§¿ûrÎ?ûˆn¾½;ω0ÿñ}Þ)¢Eºå»ŒésÍ&¨ÃôdË¥Í^Á&I~}—&½Ï»ašow»d÷ðÙÁ…ƒr“Ÿ_è5>°{L€ -}·ŒŠopãÇ7[æ/n•ÞduFì³…[é©V|GÂÓ—Ƨfî½íÜÜíÔ†ÛGùMøø!û^¤î¸_ÆØôO¹<ûaBÂäý¬ç}=|‚½ìÈvþ=Sf/ 7†ÒØÉ%©\¥&À,‘Ñbá:$°ÿj«QÅ{jLo©4ã*i%Ã0h|“ò­ÆøMAJ$~0¡*„Éÿ*4ÓË™£•K:”NÎÊMØ„+ØÝ$òèŽ{³@~q?Dé&‚Íj×û€lædÆŠâ^nŒ ­Ä( þ«½Sc[°â 4ÿŸ‰ƒ9 ¸`Aˆ—Oǘ&™/™è‚ùO}2—ÉSZ^=ár9h™Ít 'Ç &%sõ¯±E§ë€ñ2B$äB$Ë ¥I0±¹<¦[ÀjDjyGÓÉmØ‘'a•é6,߈ÉåiÞ¹ÆÒ»2 ¤ƒÁ|é`+”f¥ƒòUŒ9‹² &ˆ|½„Ç÷ÍjÍrõ1¶“]ÞÕöâ4*Cʬ óv1ƒÙ€¸åiÍ;¯®è(ín&'y!&F‘¼´pÞ2;).š?”àMä8?š•ƒË¥}عè% ¥–U,3 µŒ[V§ÙªÀ>`r:F-ÏCpõ-€8°2«~¢Šgé\âmÿ’ ùŸ4¥~gõüOPYþwð?ÊHüOµq ÎÌì¡)‚¦i'ÜÁ0š†P wÂiÒµV(ؤãó꿦ÔïìQ…þ —åÿC`Á$ý¯£†øß'œóêL6M}ÒíÃŽÞgoY_ߣò•Žïº}Þ}›^ðoÐÝ-cVÑÝçcöF¤Ú´ßeÔ&$Vß&öì»ø‹?¦Ân‡`ÿÜçYO‡ý¾óhà¤!¯ü’÷_üx~}ÆÕyzÞ†nG>Ι™´?.àÞ³Â÷Kòlrû˜íAŽzÓ¾ÿ‹xûµ×îgê~:ªcõCt΄?}üîÓ°'A'y}ì:·Ïá¶¶…‡§§N#‡Øî¹:º^äžbÝöW—àŽÃgæç|×êÄž cmWŒšy4mÉ,—l}—þ;ÿÄýÃ’ægw³½^xúß^K‡‚§É '<]/xcžà”µ&ñÓxòh²î סû²_þâé² m9¼÷ÚÖ‰²{§‹3×<‚sßv¿xb|žÑÛ⛞)»ÛAÑý‚WèÙ%ÏL:ûÄ«]ë–“Ÿ]˜uÁ²Áã‰ïþ{ËêšÕ†áÃî<ÞyãH’õþ†ú#FMë.ëܸ]Q×ôzëO-˜Ù†xø¢ƒnƒö]ÖØe,0 !Ïyžü­Ëɩᙯ¶. ûØ{ršCý‡·ê4œÐlë™ú6s¨5ÇNfEÍ{øä¨8=ÙÞ¬='n/šc8ÚÛXçåžü.Î͆X›g8ëùw³Ž·­ Ã!‘;ó¢}~³Ü"ðÒØ½kóVfœŸùäå‡ï¨]úMzÛ¬9QbO>Í0˜ûíÞn/øs÷…ëúí3°Äè²qvúùáû–þ|)oøùG“Ö6Ü›vs¹Yjrÿ‘ú7'Gï^ˆ\Õ›æì×éÖºön£"Sý¯ÅŽ>ÛTÖQÿùµŽøé:ŸiœÒÞÞ¼ªu{¨ó¢€môýÄÌŒVoÃ,tÃuïÙœ±¤šˆè•Þ¥øæìu÷Û]É›?¶O´/z#Óybv“ô1¨×‹¹í\:¾oúâù)×FÓ?z·5°M›ž?«ée‹îMV®ï™9ö¨ezùá<ñ/qè¸Ñlº‰åÓÍítÙ¸KÿX~ýÕÚõ\Øu¾áÅÁ‹nQH›F^»âí÷×-ù~ëÝ~Þá‰qá§¢û&' \ÑÁý~vj\HÑ14ˆ¸zÿزE„ïF '•ØzüÖ®õÕ]æéÌß{úËnqÖ.Ú¶´êÒ6ä©îÎ!qCIxÑbÛ_ÇͯåNÞ¸µ³ë¦¬QvC¾su_ÿ´OÈZ‹mþÞn0éÊä˜4¿ôeë>X?)9ý†^×[/ä"®b™²¢Ç{ÛÕ=ÒzúÿdÞóZ³Æz×Í¢š?3šäÝTÏðaóV›"g8¤ û¿\Óë]úâÐwã~?x1¤sÀÙ¨°©_ç·éÝ]ÏzÞ”–M± 3=n]pgÛTn\ññŸnÀ]Ó~?w©}¸}Oxå²'s̃»ÝÐuЩM¡ØòÎçr[®”}Øþ ߦµpÌ2ø?öž6F’ã*dP`°0I$Â)âs|g{wºgzzfÖçó­w÷r#ŸïŽÝ=öÍeÓ;Ó»ÓçžîqwÏî­—1!@¢˜ 0†óáÀA„¬ + %1–;ŽpP Rb‰ò'†÷ªú£ª¿fö#s+´£»Ù©~ïÕ{¯^½ª®ªwâsÏþåsú5?õ¨÷ìÔoýÕ/ÞqÛ—ßtÍk•·]ù¾ŸüÊ[oø×»íŸ{ñ?ü™žûð5=~Ý3ßué¯ÿûëÿüÈü_ûÊìíïyô7¾õÎ…/|ñ‰ë^ýõ¯-þÓßþÃÚ¡ ï¹îSΣҡ¾ñ}äå¯=öÐgó+§ÿôë¿üä‰u¯»qßçåõwýޝVþ`úÚ+§_úýÿj¿pý#7ääÂg~ë{¤'¿úþï”O; ““Ï;¸ùßOýùŸ¾ó…/½rßÛŸv°øØ¿½yîMßòä‘\<ÇmW~è ¿ðÀKæï½øg×ÿ€û™oÜõ,ù›g^ï'ŸÓï«Ü°ü¥/×_¹þöò¿ÿÉM¿öÔùí_89õ‹zä­?¡|ïÅùŸ_½ò»¯ÝúÞ\xìØçþîAÏ~ó[Þ2uóÇžT~ûž~÷£g®üïw<õéýKf,ëÛˆ¢à_‘°7a>ŒB!'ŒBÁ¼Àb.ü ª€as«Uvø±š? ïèòî*àë*®¿T†Ñ0Ò¿ÝÅS(ù‹‡¸ì›ÝaȹŠíTH’Kþ¸ÖŒ»Ôòy’·Çx( å<* {íÀÞÇV†I&¹‘r(z®ã§Ä”à<¹ýS¢TÎŒ)A‹ÆSB͉)!WˉHf"ƒZMÆqPª‰zi1%d¥’„W­%bT”*•dœ‰Z)ùl½’¤Yª'è+ᥠñ<¼ã5ž§ÔxK•——Œ=¡‰=ÑYûÇÿø³—–>ñÎk_:ôá¿~ýH2'yì‹z°’·—ŸXü}ßÄPîÿÇ'¶þS¿Úò—¥ÒAü‡1~ò}!ðC {/p €óâ?Ve.þ#t|«¥ƒøcù4;àÙ9À‚5ÝÛâd?Ø*4]Âìærs ¦:ä òdA‡9^×9(4éý±[Ií4éæ[þ‘³©ÎqÐ`P–::YE€¸¸ÜoÃDÍë`ÂÓU­¥“–©¹.^ŠÙÚŠ1ÝìiN0¢Mð†·hÓúÆ¢Ñí›è-¶ ÕœŒÒ쑆G4Óµ#DF·gêÝànAb¯×îêääÙ™9Ûp§H¡°Õô<Ò¼Á„:zÈÝt‹žÑÕ§:‡ŽbS*±£ù5èe¹UØ›íœ*ÁŽº¬*M¼­þ]Í·m "¾ãŸ `}TÎ/þ“m½î1Èw“Ý{H/¼ä…7ݤo¥·Vµ¾£.œ¼XðsZ: ÕB×Öõõ®ÝÖ MŸ" Ëh¹èÛëÛËe¥ç]Ü©`Uá5‡½k@D>> u©c¸>qøžØ%¹C•É%mÃÕ57 J¤Æxø,ÖÜ“fÈåjÐ ½.6ø8¼-M·¿â÷´›·fQuwÐ1kw{ZËkxz\jÈ6à)°~±­nƒx tgÐt»šiR˜MÛûßãlPƒNÏÀž7Eüj@¹‚ˈ¨ä›4G# mR–!ZÖ$´E7°@|›ã•ÚÍI±ÍÍÉ»µ5£5xHº cŒ,ÕäJ޽B…¸‚']„N¬~wEw¶ÅŸÏ!`‡3§6™ÓÙÔ2÷»iôÙ„û¼À¦ÜÓq¦MÎëÞƒº‰VªÙ‰ÛXÓ³§M(Û EÇéx:Å–Á¼¬éS–î ¨ Z ,¡Œõñ'‰¹‡-L_”¦ä!Uqõaú".>põ¨yé9©¤‹Wÿ¶ 4È+}Œ`X”çèx߯G làMÿ+:ÞŠ»Ú7o%P“œo,¢ü«Òþ?ÌÿÖÆò‰É_Þ7ò?èÿcùÄä_Ú/ò¯JòÇ'&ÿò¾‘¿| ÿq|bòWöüKòÇG”YÛòÇòÇ'Öÿ+ûCþÐÿä?–O¬ÿ¯ìùãA€ùãëÿêþ?ôÿùåëÿ­ý!èÿ•ùãëÿÕý!èÿòË'&ÿÚ¾‘ÿÁúïX>1ûß¾Šò§û¿*ªrðþgŒŸ„ü»æèv¡åå–mšËËtóË”ÞÛ+PÀÙûÿª¥Löù—Ê’z°ÿo,ŸììâäLÛ^Ñ'KSRáÆýCÓ$~ê"÷ÐÅxò>Å\°óx)ž·˜&ïˆnå8 Êfµ±¾û—Æò­+x“t¥Êîö˜µ»¸ Å-Ðh¿~ðg?tqÎöæðzÀÎîIÁÈÍA&»3…Æòî÷NižaÉd«@o/Î[-ÑÞ£·p3B©¢Üy±IX©T(4Ï0A‘à¡ ó¦»qÖ5£¿ Dv¿G@£Iqf>LÉÒZ}OsJxáºá´úÝUS¿f+Ý6tGw 7Ì” zâzôtrpÇ`˜Q† Ï0ÛQ•*)ζô¶ašZ'ó Üâ|’ ÀÍÇÉŒy Èhˆð Ùx@L#ÚÚà•!ç\¼èIñ^Iàæ#+¬à×t§«Yí3|PÖjƒ ´VKR§Z-ŽV$Zô$´]hU*Jœèr±cxHÐ*@‚ž$¡ ×ã$T©. =,"< ÓHÄ xÐNC€§†v˱5/ÌŠ-A‘T ÍpªÇNâT;ŽS…öÚ"Nhƒ-`¨¶ Q'̧ú¢ÌŠ~gHéÇqV¡ }gpnŠð€A›Áƒ„`øEÝ#P€P @d‚[fµ^… û½Œ –îa5A?ÿ¯VcƒÓ„zž»Ö)¨¾°éviR<ј#–9`È`‹`ÜvüÆjžà®+Í4Ìдŭµlþ§Õwðä/¥¯]bû*iøò­X\2ºº;¹Ã¾E¸¶qe O3VFá¶ÙÎ)Êx–‹¦žU2yfÅ4èë95Rq‹ÅY@fí¾ÒÏÊÏD”§¢æ 3´L]s<›ŽM²b0‘‚á.8™=úZ0ž±MÏëÆƒxŠ´PlÙ¶ÓžDñM®j]ÃÜ$‚ü(ð¥õMoH- ‰ªjf¨Å5â¶4SgdÖú"fШªÉS¤.ÓºÐ)&Pùe¢_n¡ò¯“øC¬ž¢éS"/ØfE â5hÐ7.\„æŠ6ØÂU-b†NkÔI ø³´f>j{{TN{TMÉÌeXë`D¶Šx‘ÙòoK£Ý‹Ùýg‰Ü޽A¶°Ÿóù<ÌT°-R®€°²{¡ŸÙ·R³t¾¹mC[³-ÍtÅ|@Ƕïwé6O@ï¡¡7Á‘B1¼œž²Ž»ÂR<Üðæ¸œ:T¯‡U²ìž_%0‹ðŸ§´Hí*^G¶&n$¹DhÊ-LÙNÛŠ—ø„Á'@Jx;†ÁòüÇe²æ¡NOÐkúàïDÔs€ljI!SŠ"bBêpóðzP(BЭu—%ßêç_Šå7°DÜa7c€Ð3h7£¨¢°—b; QO ÈÒl;Ú;¼f Ð ñ¸«yÅwÈáÇå°Ô³ƒ!Xmà™p¿¯O—™*jíK3{´Œã&qIV?Ê8Éò¥€Á +B#,ìqBþR¾LLðV¡0ùÿšO6ë÷¢EœÖãižM`Ùe©]ÃÃã0ðÌÌÏ{ö̰¹ÌÀT ÙÕ`ŒvûŽ„-Ãã àüwMܺãàÙÅI:çï9º‡ü²½4Áë€?5g¸ºN¡<½…:µd ×’¨970ýè{¡Çï“sÓÑ£7ѳ7;vqµUØÐANéë`Áe }Ýh¡›djÖZºŸI "ÜD(lÉ!ŠHÍŸ¾„Ô>zôŒH9|ý ‹U;v,£•2 [šReÿ·¸¤â?nkœÚ?Š4MÎÚÞ3á±;r þª‘LC ”H`Ô[`D?ªÀ€FöŽY¸ÐM é°m4½")å⨧dÌ!ü¤%Pº †ÄN£Ü’¯Jâ-áýQ™¨µð‚jz§zm”èwYwJïU^lJ¹BÔjù.¹ê|¤p!ŒK‰?Ô©j)36e,&Kø`²jê%Ð|“UUáI¿ayÍ‘ 9•¨9·î²až¡™ËmÃmA¶³lÚ­ûémÕU?ÐRjCd• oœ‚3œá•0r"$ ÿ”_7h;¥¶\Ï¥v„ ô”¢pî7=xMˆ¸ÃÑŽ •Š\P@m£']/(©,‚`¯A†ìÎ(QE%°7,Ÿù9Œç¢×‘…€ª"ª ŒÝmµ—sµ%A~ ‡”n' SD…rú–ßòF;ƒ»é‘¥äD^Øö'Ër*ÆÕ~רÊH´ø(ÖðÊ¢.uµK¶³ì¿KJGœ¢Ö-qÃÄ'NïK’¨>]Ãy¬•;D®ÔE… ­ýðî+Zf¥S–à‚Æár“”d;¢¼Mæà§p±÷@ƒ”(rÉÁOQËÜpÂFðF»‰Kü@’30ÇÇðø¡ÃkƒšÉ%f¡hxs›0j®9Ê@.Œ–óÌ@fa§žJ¾iÜ Üy 9ÉìU3 Õ0Ns#("r˜ñ8ßN¶U ž‹š~Õ9C™ÙP©œŠÿØ®]@Ÿ»~*å:¯n0…Éa‚/ð Q{Ã…rµžJ@*¶MÁÈlPy¥[еö)°k£èÿ¸€é(*•Šs–9"nüKØÔ l ¯\çÃÓS[TŸ’ÃÞB]M5ÅÈÇT–ã˜2–‰kÍ“y­™íè­ûG˜ v$D¯§ûÝ|[Ÿ £Tç%?Ó~rô;îòå yéHk¼Ìšºfõ{™ˆSš´G´TeAõ»¹t„ÌÜÊ ¯ ï³’Rå}ø]!Uxe9aX9’޳{WxË•«ƒ·ÄëXrm#[¼{¸Ò‘AšÌ«ÜC#ÐF@¹^ü<#Ͻ‹V!Òaժɾ¾ƒ>ž¼Ê+×=ºc¬næ°¯0Ýq·eÛº& ž·OFÛÙ)!Ž$"Ágˆu˵·‹+fÌSÚ—Ä-øß 7Þ%ïØæÎY-¸_‘:¥ 8ߌ€Ëê[-ƒ^7¶K¼È%)““jx^óZ¶½¶M²jñ@¼RŠÏ“©‡RR3|Õ<FuLëIeœ3¶-ìúùȪIíkX뺒ßÜ&Fÿ¿šµšãw þ8¸L'{ÆÍõ»éã8‚'à ¨Y*\ ~p"‘*†W`¬ªäb0<¡ïùYÞ ½!‘Ð+åY$‚1Ø «!U’G˜fÚk,9v a…0ŠB¡8sútðjw§ïê‚E3ÖŸƒØ&LúKfAý¤Ä'r¯~»På¬áÉ0 BnNãèn^Èåvüð+wyÚ¤ÍÇäðÅIhW9j×$ii=mÅ0Áp@{øÕ°Œ±.zÑ$‘a´–DZK#Ò*gM)ìÝÔa4™$;;P)eÎ!2ÉÜÝ,bç´ÖjÂtbuþr G‘>«ˆ-àÆ,{ìµV&Îj5†sQ÷hˆ¡áHK‰ÁËçS„YÍ2ÀY­$[;"æds·…¹RN¶WÈwÔä˜^¤áSä>p†À#HqÈ«jÜ;ŠáÏvÁq)E¡FDœÁâËq­Â mÒIÇš˜â¦;"€FŠ«Ð™uÝY5íÑÛǽ8Kl@RRÐVëqý¶Îj=w'\MYÝÜÏDOßÐ3zp½¬È$È2Ð[©Ó)eUQ¨'T-—ÂHಠ(±°^*X¯2üÇí5Ay8¥Ö$R®ãl@b›V*ÕGÈÄÈYѰ%I‚‡!U0Ú~LoŸeΔU‰6¹ ]ÐJ;÷µb»^c^`kòí™ß'Ý£•å­ ¾C#1ì– Ú0jóéTÏ0˜½F˜£9yª¬"î}“ÄQÁ &3äíÌÁ"Hd…¢ %{¹,š?! =“\oŽ1L’xþÒôpnÛêÜå$é.ÓÓ¨‚c*¾"NaW@:Ç-I"8«ßÍLêjY€€»à³@DKU>?@Üjá$ÛÅ *Z€Ëš)šº¢ð’ÁäF˜û3…NñióÔ81âP¸Â,á ¯ãÊ\Uw½Q7lµ)ŠðæmAßî+C #þÆlÆL® `"³‘¾¾G¡ /Åìžî Éºp1…ÉùFšý‰|”t|Âû°1àÞƒøn¹}Çø|EªfñSxÿà›Ü>~‰>ŸðRkû/£Fµ_¾î–Hxé´h;yË“¡ƒœJxÅ´Þ~«3R×ËYó£pÕø;ð´Eͧ `Êæ¬ííÊJ[Në—»TÛíÏÊù3vî´Lª0–¦jÐÂäT \‚©@)¯ÊeRE£“Ùª®¾R‡¿ÑT  ÎÐëÞ ÄÂBkÂQa ‹¨Ã¶]Ž´ ‘‚–H—œÍlQ„ ž#Ñ<‚µÛ»¡üÁšu{©L׿I…¢FY†jªªu•°¿ü-û‡êz·L¸ ˆ‡ÇòÐ1®GÉzN)6/^ZÚÕP=~Úöb¨V ª8Tgã»Z‡÷†÷™ñ• zûàEÊ0Æ€:îæu{]I¾nǰû`É5h¦/6<ˆI_E0Y¨båú£±ù ®{ƒn‡ËS X™zÆÑÙìÔäÎß³r+%CßhâӲ´Ù#–Ímª&Ö£\)‹‡£ÒBÈÜ„r2:eš–ß7?ч€JâÂ-F‰M”\sàÈâŠm[ïyak¶¢äp’¸|ë,7§…" ó§¼Üku•—;&w/wq0®×{¸ó!&Ø”QHM5s—C*9»Üá0MÂB% È™½-gŠÂ!çüá-o(gÔJÇ ,;Þ ²N@OÑîtP%^±ñ>4Ýu—[¶EC)Ó"˜²ûø=™SëØ¡Á ý?ö®Êõû£¸k´ˆnF( c–w–,!ÙEBe'“}ÉX³¤„’H$²Ä ‰,-JÈ’J.iA²E²G!ÿ™AL–+ÔýüþŸû~>ŒwÞåùžó¼¯ç|ÏsÎs~Æçò+-œKþRÍ-:‡Pv6Ëe^7êbÍô…’3ŸŽœY)\‹Éÿ$b"›*ûŽÉØnÅ”5¼Å(‹lÒm ˜‰¥ƒó2F6ë?õÒtÅ#.|·zŒä ˆŽ5Â@t¡Í`DEbD1ð#<ñù‹ff$hÀwÃlâ(0½‹Xð(zöQô2Ñ¿€m%±ÉѤѴSéŸO`YA OÝ¡ˆ“À2ÈŠ0¬Àg¹'Õœ~“ƒrJŽI•Å!îNvÏ”tSlN¶»åÊ4·À눈³ìÓc™N—æ¢$™„Ÿ MV8b¦`ÄÝ64‘Dÿ6ì‡0œæwV½P?Îw-ÆiI%]4@²(Z2®ˆÛrRÃ³Ç bãäa±ÿÔú˜ C@ýÒÔrRÈß•ZNjÌ3«aç<¯Lä®ÏeIˆ˜•dþ ÒÙI-‘9uC:;©Q²˜W‚Jç—\§+ /Yì/ʤ_Äø¸bæ’dDO;­¦<ƒb*zb™† †$†˜ýEœ(XQèW›oH$fæH†DG²ï“@HR”0½;!ÏúÀÂ`kCHT2áKL%°DÆÜ‚Xô"C|V¤ 憱‰¸8Ñf11°á/wm>jÏq»Wäx±cŸïë³Õ…u@•öòByYyvù¤Ýè-LÜûÃŽv¬}šüÞ£Ýr¬·¤±ô7ÿPp°²þ£Ð†€ºbÃX=œ¤?È£¬»¿³†SßÛáq2»ø\í~4 ¦A½üÒ­᪜ÖZ™O#’Ójó°ãmÍæÞ'™kå{xA{Œ<¢ô6ª”¯S \oгÐy*élúèòÙíÛ!mH²¿Ü.½ ]£¹#Çt¶dÓñó'µ¥)"ó„‚î˜;«Ž½âUwM¿?áëç¢[_Žj^¨“=ƒ»fè¥ÆüBŽEÊË–b¸ù=òôãÓÌ&—K•Éw¢+‘-Ù—>4¬ÑÄy¿PêaâÕêg^µQÎT¢ði(Íh¢Ùª„„hþx×FӢܦòÑÍâVOuÛÆù:AlÂA«Ñù\›dÜóÝNÇõâ} RäU¥B¸Åá2«! åg‚´,Þß ð3´,¢mÀ Qòûë甂°V&]/),Ò¢Ö­’hkTb¨Ã6_ÜWE•k³»ÚJ·÷Æ[Ü(½ê+ev°OÂú°ŒˆÙî!s ³"ͯ£—ï‹ûi{ä[ëĦ¹ñ–6¼Syµ(K–±¬¶9;Ÿ/¥ '"Úx§ä³Zý05ŸêÃ(ÊøzC&¨"öuêŒ=NñTR1Öw†,Åärÿ*£}žšˆ§ïÃCÄhú[Ÿ§ìÑ23¹í~Ke+r[¡±Þóó¶ä–·|AÀ~Á£ýÛvÀ¢"³PhŠce*ö*ƒ* ‘ïMáýg´¸K¹®oÔ–/•ø³škûM€ŸK/LQq²‘¥È¿çœ´[×°¸µÀÀÃíE¥ã¬ZƒÌ•vU½4¡[#vÛS؃èß„³5»a‘ˆj•›—Øž^Vg>ƒµÒY»ŸRõç›Î<ôÏ’¨2 jž»]j½·®-Å\Ú·õMkºl³ —ýéO8œÐ°0jÞ>p¤õæ[M¤4¶çÈ=gÓ;åã/é²\—sz˜^œç›ÉÚã4œ¾ûóñOz±t5¨ÇïK}£ËF»ã8ýÚå¶yÐè¶ne ;pîúC¨Sù·}­aûßzå×K—|ûÌço»šþ ;ëG-[8W•Ry•Ú¥÷cÜ7°šˆ%T€xl`=íÖ(ª~ºÌb,,çÚÁæE𳂸ºÖ#JgCÛßí‡J^½ixqð¸;Þ„'ËVÁŒ§'ïBê§à’pσîn£Ì®¸S!oz³É(Ôªº>~ŒÖÐS½;èX­²Õ)Ÿ\‰´G#E{ä¥:]C@ª>,úñ~5‚x°©ØN~ìªMS`W;wØqXÅÇ<öb3UúRQâuÎEðâ‘ÇkyÅ¢¹Ÿ½^Ãhæ‹‚A¶ ÷x°]3vº_h—°Á}8–»Å>àëZ–j¿sú¨‚öi(‡>ô}½(htX:¼’Gä iìy¦ƒ¿ét]EˆÇÑ}ÞûÓfå—\pœÂcÏÝÒ䌃mÄï¢À÷!Þyt@(O•П౬ˎÌÎz™y‰{€™Õ·¾NÙk˜½‹}ŸÂ-¶K£'FT—ý_•T¸¬¾ܶ½à™!ÒµùÙq¤È|gyÅâ®2ò%=R—:ƒÅÿ=­zWÌà jCÈr½ªlRL³=«¨³“ZQä$¹ÝÓãCE¯][À¦kÃØƒer釜âœôÎÝCÈÆ¶Ê á¬?õä½ì/;ÔŸï÷©È/÷¡f¹Þ¿’ MY>$aä0T¨ÌéÊͨ«?ôxU®æÍ·f­ÉÒ~yåPœ*o%m6Éò„±ÆQ\¢°ñš-Ö$1 HÂR[ó±IðÄÇ‹—_€O¦W>£®!Æ1¬ï-åÊ Uô‘̲Ä­Z_ᑜN‰pÞq”÷U2ý¹‚}×Í´ ¼ÿ0(ŠÙ®TpÍ7ýîÖòÍ®—]ŒõÂI¸±@û]lŒDÃ#–[ŒOj®”|ÐJÏì×)w“Ùž0(ó¤¨0¦}D¬ˆÛÏöÂ|×7‹g¹¨íkÓ^”Ñöä%%Œe0Ö'ÕüÎòçÑ©–eTË4ÓÔÂ94ªsƒ;¬UìÆ‡ÓÍiÏg(`¬©m7ÊPêXßHõŽ¥¡Ÿ ¶3Sþž©þØ5„Ûå—ú—š"ì§Il’+. é(äöÙe9èò Ðvܺ…{ö%9}du}Qìñ0¡U-•ԟЧÝγŠÔë;š´…÷ß|Ö9ŒÙåNe)m8T|®tË—u,ÚAýP~pF:T³¬>­Yh';ƒ†'¶‹õ̽äHc[ Iùòû­iÃØ1ÓGmãLy¶ú«R?xAC"Ó{*Ó-+ÿ²Íêé On”=ù÷z Ã÷¨{=žñ‰ul²PÀˆùçoö|£®ßö¾^VãbðF“=êi,^9vïª^ÖyÛ]3Œ¸84Ü—ôôͧø¯ªîqªÜêÁT¹qøÕÇlñ íÈ‘'câüòÛØ…|®4Ÿ¸­âZk%¾§]}4d­fTàf±ý}"ïÄÃ×uû‰BoÓ§¼øÌY†yÇ·Ì^êÎÍ8SG­ûÙ@ŠÎ?cwñ·—‰Â.F,¥¹À:Qý3 VEåoõW‰:2Ze½i½Nº†#Äå1Z¨jcaïËbX²öþ”Žüæ-8.×ë¡¥ ¶GØô†â[û>~íÎÁcüež0uf£FÀ2i·ŠmÞ+4^z“cRSLáze3PÀ©'Î#Á8TºÙ®)¢¨H¦ô¤¹eSÓ—@ày–:íCCnË1VÚZáþÕÞMW®7ÑÐ|dõ{æEÉhÍÖ×r$6<ÙÇ©–-ÖÉDÑZ‡IvL§#ו††‘Òýv¾§Ô ¶ê=éÇß­ÿÖ»rÖÄÊx’¶þ"Rä$åÃÀÔwˆi¤álc!z'!Ê&ÆæRÖx0©õTÑÙC ˆ©b,X˜p©N:œH™_O­ïA¸‹ªµ‘º‰ƒ.„@·Àâ;ẽxYÒº¬`(0q‰ ±Z;”D¹@~‘´²²v°×ž€ O|@'>`A‰ˆÕAˆõìÁÀÔ=&%‚—L L’É Q47¶ë’$VîàHÄ0ãR(¹2§8XX›MÝþCS¨”÷]LDEU Ÿ<óÉ$iA“¡dPRtc(‚²¦bÈ&«€C$ WaÕä»8¢N<¨ÔÉX±ÿcïêvÛF²ô\,°0o÷ª±Î´=Ó¶XüW:‰ÓÝÒÝAœ`a-–-v(RÃÇnAo°ós»Ï²W ìÍ>ÄÞï9Uü—DQ²¤hwUH,Öëœ:§¾S§ŠU$ß*–óÂ…;ŸØQU¢*]T:mägÎë(r@›8P5“Ÿ¯if éÅ, ¹Pš¸ÐðQ‡Ñ%ât³¾H-͇Ų¢6±bàk“ºÀö½™•æ£ ù¨[ƒ &ï]°¸§Ž63ÒrSãBŽJË4L¸%¼¥\K²ª¹V‘ùÚŽZœâ;Ö¢}˜VPÆ$ZÜ_ê`Ôœ¤Ï£·ïɃ Š£~èŽbbRñ$›<ÏûGgϙʲ¦€é.5 ÿ§À™—Åo Â#'ˆIzò›(§ éýWlDp—ú\…ùõã¢È²ŽÏz;¯’xwöŽøŠ^³ÃÒ?º±ÇŽ~8Î¥ø²[I&Ô”ò21t|zKÒ4Õ `¥xŽŸ¥iød´–¦ê†<•¦êSi²Œº«—S§ïåo®ÑÕ»êT9S¶¦Ò,m:­kN¥iÁ^K§z*Mµfð¢Nñ¢éF)-Níñ ¾îï0Æ™¤ƒßé |ü"|ÿ:ƒXçüŒ\ýÿþåïÿôŸäßôÿø÷üïÿ:ùÛñtÊ•ÄWí0æÊÓ,½»Hø¤P[ÿg ÐÀ.aêúüç2_ÿ×5j²©þA¦ª¬™ ËÙÐýEá‘ÚKýÚ–Qð¼¼çúŸZ”nR΄]ؽ“Gn5½wò‘ôþÍ=^J]HOªµõ£¡íy¼µ=hðI&}¸ý”¤©¾S½cyÉP̽Ɖí‘ö‚»{ ßÃrZV´•$ÎØ¡”‘ø‘{ç3:{¼„T  ñýò“sOú¨2²¤ ”V2øÀâ$ôI<`ÄO8pŽXFû˜·ÄöIyë“”Z’T„ vÏB7~ä h-1¨*»qu©Ë ,JInVLÚ,1}t‡l9A5⦋ØŽV—’¶¬”b !ÍÍŠI15˜Ó%$5ABïäë¯`zôeåS…AJB¶FÉ ™› XÆ.Ã-爱ÿÉ>{øR‹$a,# wªo7"vÁÀb"¢×YB &˜¸.‘¼¿½ñb?~—•’ÙJJ@œ”h“[Ͼ[ ‘Ìf,ÙRk2>K¸hºç]p7íÜ`"@ÍÛ3ãÒ¢iö tzÈ#C‡ÄÁæz‹óZ]J(\¼Š1\Ãpü*ŽC÷&‰Ù:ÑÜhÚ*«™òw'ËuªQ;O°"aÇŽí¹=j–l+Þ÷øŒÅ¸ÇÔA§Šo<†ÄåæR­ÆšO΂~‚wÙ¢êeo¡ÛÞb23ßý 1ñ@Æ$««”öÕŠõ¦]4oõ%Öv5îáœø™ÿq/tïqôÉMÆò(&#/‰ˆÞN8®›*þ+[ÇdŒ±8IáÜDÐØX>U>a#½áMð0¾œ¤æFD¯&“%»,èô¿´-È»9v»µ—ïíІ X=¿Êòr·ÅŠæ]½rœAO‡d/¸ã]¾z¦2’ôJ9åÉ;y<€1‹·“|¶#rÇ||'!€â6 †¼æÛÀó‚ÏühGô¼õᚃ¹ðõ5Ì”®¯ËváÚLÆMÓäIûšú£Qc]˜?Ó|ée“ÿ3¡¶þo~éõß|ýߨ¯ÿn#ÔôoíŒþ÷û?·jëÿÎnèþc[¡¦ÿ9ÿ³ßÿ¿P³ÿ;rþGŤ½þ·jøßó?ûýß[ UýwwæüÏþüÇvBMÿ»sþgÿ­„šþwçüÏ~ÿ×VBMÿ»sþgþc+¡¦ÿÝ9ÿ³ßÿ¿•PÓÿîœÿÙïÿÞJ¨ê_ßó?{ýo%Ôô¿;çö϶jöwÎÿìõ¿•PÃÿ?ÿ³þ³ÝPÃÿî<ÿßë+¡†ÿyþ»þ·PÃÿßÿ¡˜Šxþ·_ÿÝJ˜Òù½Õ+öœ¨à†óŸ”´8ÿ©B:Õùûßöç?7¦·4 Ý—O{ö{'<íðÅ!ùH_¦Góc"ó̾g÷ÃÀa¸ßšÓã¼sûÑ%ÿ²í·š"â«1“÷m¹}××®`$ýF^ºy7¯#)eéMà˜‚PìâÝ<ÓºÅyÖ:•«<—>ê×Äðfμ¦LÌ<áZÊËd2!Gx¦1ü–7ô³¥¤&ËŸÄÌ(ÑÆi…qq2evÙrÁÞyßnn`»“¦o‚ÑãZZ©4´RÉÓ–ÚÚÌ|»#¢O8&›£ž³ÎÀ–ò_9xÖpÖ³£ø0nf¼ÝQM¨•1oµ³†1<€™ñ5·P覰p‡fþÛ¢ÄG¯£ ú¼o¥@ úç-ì5mO8 æ=/ã>Z™}£ P0ÂóA˜I9ì}s˜H)T3ëàk½‘í/f„2"$ã€8ìÖõݦój‹m–=ãüj©XËf7¶·Ý1Ä©öÚÙÁ™õµÛškâJƹpDc¢ùó·í‹ÕJ^g›»kks·hóÉmî¶S¿(áV½‰™r@TË­0¤Ë † ,ðs2œw˜}j¬nçüÀâì]ÁíÓ¥‹Z¾‡¼¢­Víiç|`ÝOA¨²hÁA ‹s$ÒŽŽóV¥m£ßZŠr¼ÀÉjç¨ u~Êîé:[ä°PþÆ ;ìJZûÄ¿!Ë·ßC†CûáÛÚNñíüÁ ÔÎ…ÂY>±YƒCAµ…ÝJ¼éP¸ÐŸ í¼!^YÑ’ÕY×é œû˺2¹a µBq L)mç %]`/Jš+j“Q¹âxôª­5Ú -M# -9Vß.5}Z §v.˜ö%ÚUªWOaÿi§Ë 0æŠó¼qÜ—Së@¢aÙDZÛqáö§…9m~88]žÙŸÜý_jÏvçü×~ý+¡¶þ¿;ç¿öúßJ¨áwÎí÷ÿo%TõoìÎþÏýþ¯­„šþwgÿç~ÿÏVBMÿ_rÿþ¯QMèþg+aJÿÅ«š~@ýúÚ îø‹šðwß;e£¥¥Ð¼ÿCSAóUý+мÿ÷v³¯Þ_œ¼r‚v¢œÊÒ³gé—·Ÿ“ú§·¿¼} w~w‰¯n‹nCÿèösò\¾·ïX ³ù–$>¾Ÿïuððœ¨:þÓ©IÔ.ÿ¦³ï¼ †|EUŠì{†åq!â}@‡”:gA|æöc$N¼pØ­”%ò% IêD,NFïìØõ)KC;ü$uÞúý©þ…áÓe¢èFºö…Z®,I翈²,"ÃM:¹c³ðÞöÈ(ɯ%©Z…Dˆ“Œˆ*¤óêm£³ûIÌòRúnØO†·{È“5Hv\²ÈòDïB”J–¢CJDób×sŠ"&é¼é3Çõ<;K£ÀÆÛ  ÛÎÛi6(T÷¶Î6ÞVØ ÀÆyµ>höùŒú€™ó©ú ­ç•úTHùµ^ ºIç_*DL ‚ß|÷ó"Pý ‡¶ïÜxù´Ö®Ü¨Akíiî4 k×Éj@Ä.î„¶Û^5`Ë.«@&ú5ëÀ«°  lšÎê,è@”UˆB?ì¸Õú€MwF}ÀŒ;U´Ó­Ôg§vœ§Ç~¥#ÀZP¡i@=Á4MX ê4 hoP¥ m*Là"ˆ<;ä)pWRÕ9p‘LÓ4•¤NÓ„6$š&Ð|¬ÖzÌnÄmgÏøûo! á€PÒØøªH–¢Œ Œ>‹±ØjëÄÿ·®ïÜøªSˆˆ·k s%LTV| uóíq¤óýùñ¤€="“1#þBÜ[æE,¿g‚ë¹¶çå ¹i«[1nÙÒÐOÂŒ*çì°XÞfÈ¢4á;øÆîèäCè!¥¶•òÎc7€ÍÎ|xNCÖœ{dÞ=Ô¾=?çä—ÏýkÂJ̤]ÍžWÉ› AûóÒçÏòg’.gΩ O˜â€Mrã •HÙp÷EPG†ÐQôa<#|¯Þ½û; C²ÔéA蜠úNní¡ë=’Šþ8ðÇN¼xA)^ïªÓuæ½Ø"Qßö˜èÑÈfçÜ¿¿À¤ïmÞÕè©,ªV¯yYÅv~JØC;ÿ=©ß$2à.^ßU•íÑcÔx®ظ¼‚æ l)í`ã%º¤Fe˜x…so âXÜJgÝjÌHœW•ë߃wnÁö|¿éÈŽ^ÌE|bS©ƒà3#ÎËéå:o°ƒ‰‚=€,ßÙY¡ŠÔxʉ‰?39Dßk*w¢¾íEÕtPÀ >‰—*ùmLü°H?p˜¸cÞ º±r½øúðEex¿^TÈFi‘Ì,Âÿ2§nWGàj’ñÁ3â’ßEÒAG\”z[ç·rÄ-G@KüøÁ¶ò´ôvJîbìÓwÜ-=88(lsK ‰€N‚›ÑâcG½£cÂuìb¤‰èÑ7iúoµôÞ±È@B0&A‡Z8TÁaÆIG9J±ÒAÔŒ­I¦M'´?°Ãü;!üi)>°¿Iýq¸xÈsã 2@ÔàäJ4¦Œ@ÚöŒˆ®h;¿Léñ¼’41«å‹„L’"]Î|À«*Y¨p¬ ñ(“0—/—ËÁAÙ*HÙí\†¹'Y7 F¡;ä €<ôÁ{ëÿ˜þ>DîïŒ<â_¨HÔÁ´ÃƒËœ¤=Âo0ƒ˜ä9²hY‘ P}W)Ô÷‚ˆ!ΫêdžçŽ"v9(ƒNøX\øPŽU²Ê9CdöéMÄ ÿ Ã"9º¿cµb/_Î)Ƶ,(T&ž«4½®®ø¯X¿€î_yNÞ!.Ð¥1Äš‘f)| š™ô>˜ÐÌ‹’D•…µö-wx<ÏE ļة,CVéo3‰b )OY².'=;øPL¼‹s=á‡Uª¦üoüd‹¼´E(;èùé8DGÓq…GÕ"ZŽ#2ÒÈÆúH gw¦8,BšU~„«Î¸è,ÖœëøêÿcéR?ÕÂÿ˜§é…~*À|J bíO“‹h`ì‹âÊ©eeWPt*CÖŠ´+é» 8Î=…J$U¬"]’ΘT“KB JK'Š©òõ·+@Eç5x‚`. ¬DÚ+ñ)‘/Hç"¹‰GŒt~ýp.þ: ì>{Ù}p:ˆ‡Þ1yùkÊoçúŸ¤Î«ŸάӪ.×tÚ˜TŠ©ñhªOŒb3]CáR´¡cÍíÃk!×й¨a¥«4t¯Á&;×]Š’“—Dô­Y á^©a˜ MÓ4௦vIî2M™ÁÕT5dÀŸ¢âûÙýîo§®Êºjö¥¥iCÛï=¿ô¼GÁíýOï.ž6·ä ;ÊkQu+ZòòƒöE'¾uñÌÕ/Ê–§?:vq¿æå…øq/~Ùºõ·ä¨µ;9ÿžU(9’÷BóèäÈŸþºQ>íA‡•»ÊNܹtGä{‡½çê}–§¿¸ëó·0ò Ï›#}K–z®z’{öå¾)÷_ÞYQÖ'<µúXYÆÞNeSîT={éSò+CS«oUÌñý£LÅ=S±=´Ç_åe¿Lx·yuÕÃê_¹kïÍQ×2^Ñœ]W¸[J.›óÂùÅg°NŠç‡+á|sú„øß ÅÒ_à6=½¶I1ø»ƒS¥êÎEUó>>X}«Åv?mÛË=!‹“NL .G¦"ߪòÏ%c†œ‹8Ø­÷‹CS¯ÆÍ,i]ªÈÅØÔ$#° rîìÉ«Bwu›ï÷0ê³3åÕ£²*³Øá?,TÿÕqÑ‘G¬Û!Ç<°Òâz^/- \0zú·k<Ÿ¬`VnØÚé‰ï2oî­ÏÆwzË?£ˆ_SyƳy>Ý2gÔß1s†eû´Qd6彨=$çÒ q¯\9úؘðKƒ—0oÞ.M\r ùÙg«þdENYÖrÃÆéFWõ=ðÅé‹…XbÏäâÙí²öZ’}÷Ûâ’ò²·Ë»”\ðMòñ…Ê{ì^Á͆æÜ‹’–< õÞ~um¯Kþ´€™_¶ðü懩 Fw/™;aQåÓŠðŸ~?|Ö™¶~+8-"ýg\§Yä±-´Û1QDÆžNÝî^zôvòêa+¤gZµ% ›¿±­ÖåDé|ÏÞ zÍÙÙ¤xkÇaaÓf?ß¾iÈÚÒòÛ…G%¿ÉŸìíóxTǘ¯øäY]æ?‹œÓñ­¦§w¬ü|øW…ªÊ×Þôxûa‹î­V½&I\=º‘ÐÚkeùÈÕ¾ëÝãVðNe´Ô-}‘pîWg:¼ýy¨ßö÷Ý\}u²Ï’ Ù¼Ôck_óˆšÐ´ë±›â_ ì_1lÆ‚Ã_OJ™\z<³ãî³¼îȳf3}“¿Ü3}É훦_}0ëͮK #÷ujYýªK‰ÏÕGÖ¯^á91ð@·…]Ç6I‰¨H=>êçT"ûàÀ'£ Ä{ÛËËu÷v¶&¸¹x~Ê\V¿ü–ˆ•nRÍ9šåÝvÀ̳k–ÝÝÑâíÞÚUËž¯ˆûì÷¸½=¶,÷KðÚ6+ˆœrlÒ–v{Øò#SŠ#. /‰?<, U¹pýúî;>Jìòs×mÛÊšœ´.f}ˆl©zšïiåÓÜ,E¯-î3Ç£eœ F\dÒkq›—'ÝF¾}èß±Z³&}Fÿ—s¦Ãw¼ÙeÄjÕ2Ÿ–„hÉ¥6'"¦~ÿ\ÛOå©‘ùáóç'Åÿ|bôŸ[v/[4p#oæ–í]ã^?57¿Ë'GOùŸ/p9zã—!ãý~Aesþåÿ|¹þÇE7~^âë;s`ñ•c‹˜ÙŸ|On¾Ú¯8ð°ß¥Óób¼>ýp@ÌòÓ~üUCçå0'ü9´]Bú&ò?Í‘ûKÞgïnØ1xÝç¥7®íPOqGÈO¿Þ^˜µLUqY]%<³_n®L©HãS(Kû‚Æ$¥3£@ZˆÙ‰ú人³ uG¨Ê#Tís D¬@Ò¨¶%1Òˆ™‹3ù­ÙlD¨­DŸÛ¬(®Y7ZÄ`IL@Ј]B¾YBªa Ýy.4¶¤Né»'Ð3ú³\ ³ønXRÛLøÌd˜öŸî —:Â5Ô…êǺ+/`ÂÓ>ʆµZkÇõÖµV 6†QK}í¶ ßj-j=Ä®·xÌX|—"d’ °MÞò¼šoyÆ—‘B ™ÖÑ¡m Œ3– £Pã÷&E¹«D¤<(&9‰Ë–)”Z¯=/ %@#(ˆ\‰,7ðTPtOŒ…uã 8›ËÆÀû™¸®W:tÝ sp]Ut]A0ø´Ÿ bœ ´»-Än0ÄVTæAqÁ†^œ$'³ÐÀ‘aX`³A° $ ÑÅ¡>à~êM®>ƒGnfq`=βˆÃ Ì<Ä–éØéP.ε(ð’e:Ï"ŽYÄa,ŽEʳl†šÄ)u›DÔ ˆô¡g“d€&Ô0 ³dˆnøë¤­ãï*Þ;)­èŠbT‘b3þ(Ø2&AiÄB¹’"F ÄÀv“ÙúOì.øÿ´ÿ×3ú»ÿ'Úÿ‹K‚ýÝÇÿíÿÁ%¡&ý¹¯ÒÿµÿÇæ ´ÿ ú" .Ëe9Â\¡SN@ ëÞÿÅPCkÒc³Ø½ÿëŠà^þ?px ’ͦýÐþ?hÿ´ÿÚÿíÿƒöÿAûÿ ýÐþ?hÿ´ÿÚÿíÿƒöÿAûÿ ýüûÿ0îÙèÿ,yù¼ÿ÷,t@瘠Â'# Ë6º,‹œ+ƪÛA=~»~§Y»Ñl§ëSO& ŸµA½×ÂÑ NAà– ÁMÄ.×q.SÌçÔ²߀`h½X§é³¶z{í“ÞÜGÛp½j§Z¹°öj4\QŽš¡ á@w7.-U„ѼÒ×hÝ Þqœ¢u$sÛqL܈ð(4W¸ßM8ƒ3Å"®µ“9wtm5°2¸€'¢Li=³“õqÁù¢ èBýóWƒ¶Ï^ŽŒ Î-À7Ž tÇFù'ÿ¸6m£Â…rk€áòj€áÂâds$s;Ü'˜Œð.&u(ˆ9áiˆÍ y&ƒ„¬&$¹n26P-ÔË+ 3"òÂSD^~}пõŒ Nä0ô/±tK¤¥€]ÃþO-Ί^©»íÀ (àtÃ!Œ SÈ`ĦѢí‚1€6îÝt‚ñ!ˆ±qø‡•œÈÜfE¡¡Ô8jÊ3AaåB5ž“ƒ™ÒféÁ6U¦LüÌà¦:»ƒšš½™ÓضÇîÙ`ýþ«†ý?ïbãÒ÷¿\p’ýgfblRÈesX¨83 '‹äg>çUדû@ê‘Å‹ûŸ(ÿá’Ð0öÿE) ã:¡möÝqk·zKÉ“CF®ž}Hݣț»õõË%ýÏ_hºJvæŽÌôÜÞ_ö·_>ͺ9tÃÎEsËzþûà§¢z{EêóR#Z|å°óñ€ŽÍ¾{Ì/olÊ@Ÿí­.½QR<¼éqø4Õ…^Ÿ~ݯGóC=b—~ùXî}x×ý²½áó_VöaõyÚãbï?öwz1¬b™Ï¸©Q£Ï–UØx¿8cèpŸkÇ^îsñ‰÷Ý{+º¾¼ýèYD~Û•ÍÇw­à¤ßظá§¿vªZ=ïIÂáVOš_.’9µ÷ÉIM\ùGш»U*Ï¿õxÙÉo ¦Îj¹0o‘Wvh…\ü—ÏZMëfÞI§b¯|âwØ5·år´ Éo!-`ßwɽ”¾·nÅ·iR9Øû@û«}ç÷ é5Cxýæo¢éÂñò}ß»ÉQ埇ªª'/>(ñ»“=nMAZæÄÊ©­÷ö¼]T˜u¦@ýîæÒM¥<Ï_ÓŒ¸»5féë9CžßSÜyÃZ¯ÃíŸæ%µéP4#´øj~[b]?¯%r¯0axxøÑ™—&†¤æöøáɨÅŸã*—MKõSÉo}6¶Ù;›Co¬LXvþH{Á£ËÏ—œªü¿ŸþÔÜ*þ$öнño=ÝùɇYO”›¯êútÿ¸¶ak8]æ¢ùƒúõ_–Ïùà‚"lPèƒ÷ÂnŒånÅ3ý2¦ ž’ž›âUò¸ÙýÄ̯=Óó²üÚ[²C}Î߯¨ÓÌ™ p{¬œ©#ÚÈÙi#gx”€G2ÂåYµç­ïHÂIûf7Î×.d¬ÛÛºꜥ3¼UŽR—²1ëÆÖõlºü÷<ëÿu<³72xfñY¸…A1P8, ™y¸…!3‹CX×fðÌâ°- Y|Kciçp,Óñ-¯QKƒg,,ócYä`g¿ÁsJŸß?RͼßþÔhÙ'mïj°eŒ™Á3Êecÿ™kàÿå`¦ÿgºý'‹¶ÿsE0£¿ÈmèOÛÿ»$˜Ñß}ðhû—3ú»þmÿí’`F÷ÁÀiú»"Ô¤?ïUâ?Ðúß+fôwýŸÖÿ\Ìèï>ú?­ÿ¹$˜Ñß}ôZÿsI0£¿ûèÿ´þç’`F÷Ñÿ šþ®5éÏwýŸÖÿ\Ìèï>ú?­ÿ¹$˜Ñß}ôZÿsI0£¿ûèÿ´þç’`F÷ÑÿiýÏ%ÁŒþî£ÿshú»"Ô¤¿å.ôÇéý—3ú£nCzýç’`FÌmèO¯ÿ\ÌèÏvúÓë?—3úãnCzýç’`FâUÓŸq´ô§õ— ú‹r„ Å`rb²DªÊ¦QZ h9Ò9P$pÝöŸ(Alƒý'ÁaAÿï8‡öÿá’ ÈžœGÊAŒ!•jk´×¨IaШAA¨!‘ T—L "Q0$‰Ì"åÑUÃPÃjL# PðÕu¼î[× †¡ahË¥0ªµI –1U#‘˜" û3Ô¥t…†Ì*1‰ø÷òÏíÉ„‚Ïà?]jøB‡eûGøkŒþ¹Ù¤\¢BZ”-J©Â¬vFO®¡Î’ŒQÉIMZ|:C#"!z(ìR8œ •‰I†@W' mR"R¤Q ½ùìOÞŠA’D.–›DF)å TÊPT[8L¢€‰á[HÈ`{„¶˜aÖ׃$ Ü ©0'‡êmèpð‰B)WA0ý0D HZã »)ƒÊLÈ•*ab3…ÀGþ ýþõÑÉÎ~@mê‡hÒÆnз+S&³£q˜FMa’K€F9$?$ é,”ëøÉ’‰À;±<؆¶ôƒü†hÛÑ“%`@Öú˜(Qf#Êl0v •B «#—Ë´u°µÁl:™T긴Wù¬.îBþAjM¤—Š’[z >±?’¥r…!?=#š7jóq:δùõ4¼ñ›gG“'È$bÛ›JhÔÑ*i^=è Ù˱F‚6ŠÁçÁ:âÛ"ª 9ÅÄ:‘ä‚SJÍ¡u¶Ð$Â8åÔ˜¯ä2%ø „¤ŸR)—dª”dNVyp²2£r)2ÿ¶v7̈Rä¤Hc×@˜gÛ„‡“EBµÚ(N&7Ô ‘‡Zv‡Ù|hs‡ º¡$ÅÎ.±mn rFdY5˜Î>c˜rš:šTB;p1œr(i›ÞÌ0ËÉL·B¢e"•TÔ®±gÂÆ *U¿ÖoeZî¢ÞÀTÕWmø ©¡ÍµÖ·],K'¹†ŽH3d™®@ä< 4G-CÇŠq’<š•§DòrT „I5ÔÔm]Áîi2[[™¬5%2z°¶9[—47X­|AªYalP j„¤™²Iê4nìÕ>¦k4ö12 à ›ç}#%¼”’Êl™& ©d™“õqVua±hUx-ª°XÞ³g¢,>“@M 3duݨ™–(kÊ]COòEl* Úd5{6½ŸX,‡^€ê#MZjú èé©M»„Ïš…Á]õ,ëšD‚¯rAEA¤IR#‰”HórH(n ã²ä2©-#¥ÕÁyš0;–p^`á4ÚW;uÄÔ$®Á„æf›\RzG=rIMþkZa„ú†F§p4¢LO¬++N ÕSv‡EåÈÆXet£¿žw¶q-·a¸wžkK) }Õú_Fî­å]ƒq±>GÛ8¹Æ¢¡Ž6®¬,´Œ  k«m2­&Ô˜Ó ™È¶ƒ‘L’ˆ0G!ÓN@FžÔ³«!I®B"&©8E)’dIDZhEÙ¤ðÿÙ{à:ªëÀ%m¶i<@ áv-zûya4–lÙlK°Æ;'¤óK‡þ4K²U, Y“ ÑÄRÞéXÁÈ äL¡³‘EJh…qófSjr~®ÎöÎüä–Íçëå‡Q*ÎÅöV_EØÿMíý÷üG¸ÿßà²eøŸ ùß àªUø¾ÿÒàºeøžÿnŠóó¼uî„üoŠ ð¿uî„çÿ›âüoûáùÿ¦¸ÿ[çþGxþ¿).ÀÿÖ¹ÿÞÿnŠ ðÿ¨ßÿךëüoõ¿pý§).Àÿ–Yÿ ךãü?šëÖý¯d,|ÿ©‰®Œÿe;~«UîÓ¦e ¾gƒ7Œ"r¾~¥ ƒ«ßÿb‰8ïç¿ç“áý¿¦¸Åg vtKú¸Ü!D8fñbÛ`W' Zìªi°k)¤\…©,c]–­.4™Œ¶º:Éê’Íävhlš„ñ{ô¢&)ÚD>ÓI¢qüǧ£$–H[†—WèSt?šAcÕ·‚ ]Õ'v¥n®DÛÕh©±–äã-ƒÖ [Íb~ hæÉCܳ½ZVG¬—Éxã†ñ Cœ¥@(Ç0}ƒýVNá QœLÈ&=*0-ª$_t¿ÆŸCˆTÌ“(— lw¯ëãÁ'f‹¦ìB€d#[œÊ©òŒ ŽXRdC.(Ⱥßt)u  uQ˜Š*•¢$ »"+KŠªŠŒ2z}doÙÞr2xÈ®7HdôúÈàŒ>~Pì¾ ù1}eùAYû|ùE2ŒÍ„ÝàC’$h*Ns£@ö²1%jÒ¸ê&ŒAiE_”V,§.hÅ Ú K)¡ì¢Ö%zY"²  ²„8 —“‡ —ƒ$Ä©ìC íUüù™J…ü€¥,?(§âË/¤¬¡‹¦ Š5_CJiºgòÑËq&€=ˆ3åÕý8¡ ºC¨Ð  ‡&]¤*úyTËq&”bgÊPôáLÎY~PA³NB¼&¼dI ¡€ð$;)b-áÊv/!úC“MŒ6¹YóÄÿ9E“rhZ=Ö‰/K\Y"ʉ>yÓóg„]Õ·’h2@@‘ù9’×óôÿ<絊`Ç^eP|@×Dµà‡&u}‹}GL6é±,ŒÃ °š.ÉÖ÷†MÆ-Ÿ7_Yš¨‡¶ëz‘4=oGqÄ"ü÷RÊR¹š‡¡&™k[L²™P_ic­Okc7{=Š×\"0¾?XV ³“ódÂÄ6Ý6A‡¥mmm¥ždSI @4<¥ƒàÑÑ×>Ú¾”P+˜'ÉN,oûù6|s>ºÔ @D “ Á.Ô¾žA»E ¹½ËÁ´•zªCÖ¼ÃMÉ·Ã4zL´·Çãð1㆚º£2 ª4'l‡àYG¨ã6¨e«)ŠÒf‚@¨=æ©M òx­ø%€S“œs*¸fc±À B†c^Ø9b¸õK륭Í+'9­C· çf¢Ïä eŠJ0“…Ñ#HÿYûïLäÎâ/dƒ^Ó>]”t€ü,|Ðb1Ø'ig•¬°zõ„/RVÕ 2ös?;eUUòy†`°Æ¬·âŒ¯Ïä ™¡Îf¾Y>h¿–`aÚfÈ,1 Q+༟iƒL‹%ui³E“À8,´"ÙÉÀO¨&YŒV0ýôöSˆrÄJ¡Š³²A;oAþÓ6µNA¶ `_‹!D]즧âÙxøFæÚÆ·á &£‘ü³<1¯'áõ¤\Ïã!†aÄG;0sº”EØ;%ÎXŸN݈¾høAL›?/7O ÅqâbœÒ%œ32m¢ª‹mÊ)‡â©$H17o3×#?ƒA^±éóñK×ì2•èÃA&UTØ{\6Ù ´õMÍóy_Y„འ7C'H5}@+‹ b1K(ݾèÆåœ¡Lþå³gýö h§õ L+l‰Èðø9¥˜x¤þ€Øƒù™¡oµ™Í[ب%`⎄œAGð~g^Êáà ÿÃàJ•í»ÒƒtΟ7袛“2žp‡ñÔJ¥`¢Ò5ÖI½eªµæÉ.%ѸÌz†ÄjEÓñÛä,Y¶l )-YÒÕµ„ÄœLt è käià<Ð>­dq˜¤ŠÚDºŸJJ¸‰/`~ŽwQÀ5{úâR×¾lÙRÐHi±þ:„¢uuU‰F¹l1Ðb™µÔ ¤òö· (ÿJk@¡Ðö‚N2 hÉÜd,a¯ÅS$G¤gA„:£(ÆÊ²$í,ùæ¨ß E ­›4Z„ã Èó[êg â²8MŽYܶz1oÑG›Xi®gÃ|Yóô×íøЖÂìÏÀ‚‡Y=Gl‚^p½œ×SÒ6HDMk[±ø’NÞíUWš—2#IôñH\ ø‘ˆ$"DøIȧ`곿R)ë+~'¬ ²pZJÄŽX–£r±1f†pnìŽJ•Âs¾jA¯]øEN‘T©Àdj“"› 9 E¤äR**”о 1å#1Õ…‰…瑪LÅq)3$mª‹¬ ðÇ©ˆ÷¿­qúéW«"õçû k6™À3­Ýe­Â÷ÅÅ‚ˆýUÀå=mÔÁŽ-n° (5ׯ (o͕륌 >]… ÑA•¼~‚’UèÉ)²*V‚hÞfå‹â¥Ê'|[ Ìa32tõܹáã ac0£IÄÈ(r¶&¯0p¡Ÿ³`ÝÖýÉeË;X7gó2a‡3}ÖOû"Ib¥„Xy§0#‘IsJ]Jºº0+7ýEÛ°ÝëÖ9#ªƒU’Ž ³ ãˆ:(z5eÑñ ^_ uXMëd5äo÷”øªJ1ƒ¯FuèæTµ%yÊ-@é<åFo}…ƒÁ#PÎ¥'Éys’ 1‡B—òjRÁ! sóH̾GW)/¿Ò¬[8øï-x*ŸN×ЗøϑӔ>î•K¤.•¬¥+‘w˜a4&ã´°õ5^¥ASÃZéJE-\_š“Ž.R}ŽA×ÇA %`8ÇE’@'‰EÓÄ]@pÛ~ôkÌhè‹&)PH[8\)˜®Ó,|¼oMº„"DQ™)†U“‘uë!êÕjQº%ÎÃð)^«åX).TÖjÃ0Ÿo–Z³Jã %Ëëj«ŒŽ×ç;µvÕRk<‰yäv¥Z=ìz­4tŸÚòJä•ÿ–·ùÏ“hÚ¯Ž YQÓä**) ?õÕp%í#½‘™¬¥¦°þ°žòs£‚ÀkN=[„ÆÚóËŠDÚ¥•'‘òŒ9^ÌåäJŠ¿Q–À/!eÁJií x7Ju­äy…­HŸ®@ž¬™ŠYií 1Ò[›)›ÒŠdpÉ dLÊ3ÖfØ¡RâTR©¦ìY+_s\_);ƒáÐ'BšóŒ„OÉ(ý|< ƒ? âƒÁ †øàÄÞcœí/Æ ±³‡ |~Õ°÷4¬¥p<$é‚í3’<æÄ”Òöö¯:R¯Çêùß)©þ)íÚçÁÅ<ö_¢I<ÿKχç¼ÉD:žà²I>Ëç²BeÿèÝí÷1q˜,ëã›™eËØ5Ö>9hi’a¡à©Wv¶••2¾aPˆ²8ÅÌÜýÊú Û_æ~Ûþï=øÜM']üá­Ïnë]pÜ‚SÏþáMßÍLÿâÆÇæÌo\{ʶ ¢]wfÏyiù`Û·‹÷¿™}êÃÿúÍ×_à¿>´{á{4Ûyg|õÝßx=ò•çý©¿é¿lùŸ÷8ûÂâÎ3ïÝá—>üÜÓï}.Ñöäƒ?=iß› µNš¿´'uõ×>ó³îÚ˜?u£öÂ’}W7ýÌà¾cö·õ íIÿâƒWìß=öìöÓþùý™³?õÄ‚¿cÉOîÉüàªW·?òÆãw¬¿nþí‹So¼h¢ë´ÉÄÊÜ¿ºå…·;?~Ö Çu_zÊOºÿ´gù5ûã ¾µêw®úû²æÚgþóº[Ž?a×ãm'|úK/xøgŸ½ÿÑÞ½û_zÞ>cãß­;wãSç¼õrç÷7]qÏS»§¤µk~Î??Ü~óÈ–ë¯ÛrÿÍÃO¿ruqçÈmןÿ?ïܲ{û¹Ÿü×ûÕË©¯^’,.üñ£'ÿòåß:¶óÜ/›Ù½vàÌ+÷^jv¿æÜc/ø“Ž™Û¿“ý·OÍýèû§·}'VØñü]üæÁϬ>þîþ+~uÇÃW,?qÛ“Ç?þ¯ÊmÆ=2ºà——?tÃå/½wÓÂÏwõäÀüÖþÅìi7ŽÜñ1¿íÊ?P>{ïŸï<ñ¬õùñø¢·_Ü“~Fxí› v~×Ä Oþ°çÖ—ìº>¿e×égŸÊ¼øì'¯¹5¹úlñçϽ³{ì6ù‡»ïÿòæ/íþÁµg<4²ãý3>HîXÞóÍŸœðÈûûö~úõ×Óy³zã4›8öÕî?ùä'˜'îÛÕ³ö¯º÷ÎÏ?ùÈÂ'ö_sÕµŸ¿æÅý{.ynó®Ôùcþ¶ûøå·Îšw~í™+oÐf’¿¾*òô¯Oyçñý¿—»ù'¿øÉ©ý÷¯yû7ÿúƒŽÙ ï»ý¶»¾ò·oÏ™+‡7œöíÌio=:´PáöîüÌ+¯]ôŸÜwï_t~ï”W¢{Oïùñ¾0¨²[,|a+OØ­=‘âP¬Ô†fó2‹#2v­,)b>Cè!$ûÀÁÃfèiÂA,zB.Š}ÀöÙ•d2ƒ÷AÙa¡Ÿ_»„t½3æjëµNž·’¬Âsz0GAt,¶[Ót³0’¦±fÆX|_‘>ÐwâÙDG]¢ ¥šP² „½D‘ d„*ÃŒ<Œxád  JêÇ- Ãö¬%|W—1ˆHKÄØkv|”ÐíóŒÂq¨g½Î>äÅvC²áL_ƒ{M ;ˆ±±âì…9º.çÒB+°:11z!×ÿcÑhMbZ"¬K§Î3IZ£COhŠIùCS¥À± c³)D±Ê†°fñ¥ôžÌ¡eJŬl´÷Õ“zÁ´%©‡BЋ`Š®­ÄõWv ªZHð0eb¾V—ªÙwÈÚƒWÈFkÞ!ÃI-Û]Ä›<í£Ö=²Që"ÙR¼A`ªrûê¥n-ÎrŸD™Ò-R’ˆÇ£q’#6Œçhú4Dsaq˜ã`\:/ƒ%Sei1uy¼ò´<—Ê`±xy<õ”Á„x9,š.O<0ÓžBÒÅm<»Š7¶2:Ô?0xä>§K¾°}+ÉHû+ý䃯®ßþåïîíßÓsÂkCKË!c Õñ¢aÒÊæ“d'£¡kº Œÿ[çý¿ðý¯¦8?ÿ³­óþ_Èÿ¦¸ÿ[çý¿ðý‡¦¸ÿ[çý¿ðý·¦¸ÿ[çý¿ðý·¦¸ÿ[çý¿ðý·¦¸ÿúû|4¾ÿÖDWÆÿ ¦O¬ESjü$12¸Æþ„ogÿ'šŽá>‰ï‡û?GÞù,oÕæ=Þrì¿V5cÅG#8WEIFÎÉ^ìõ„ªÛÎæms\ #9qJÙ/o„†ùyfžÚ"BkBDѲjQ’ D´Ñ÷ hd×F⤨Iª¢MtŽæEƒiÄÒ Í ª5$´§E# é*j4kô›2ŠïÉ\1zöÜ|ŲD&Kæ)=–ÞS›“¤O‰ŠVžœaúì”’œ—UZvÖº#I+µÖ8¦rÊDÑçG.r-feѰ©íE§åi4”…ÖÙ(:ŠBÉFèiž …X"oŽÍIiVâ’ušn]gUÛV–‹=6 Kn¡ÆTÁÒ—µzÞ9†‹æd½l~QVÉ¢e‹F' 97œTM½S…°­4h9•ik³ ÈŸ#šlZ–ÝêÆZÔµˆÔ6;v™µòß9ÆEø:Qq#¡s ÷<ñ¨¡à¼¯EMáõkI)ØÖÑ%|®Í…Mêy´ï&šD1ÉV|me\ƛɹ¢z>˜d}ßÐEýÃC¤{ݲ¾;“é^7´áj“X‡PyZ¶òAƒº +Ƨà4sMÉ­íͬ¸âw÷ô­éÚ€FãVõ ­ë$«ú3¤› tg†úV ¯éÎáÌ@ÿ`o„PšiûÀ‹Úñ¢!U6WøðŠ­¦gp¥õ®!hÙÉqìÑyšÇ’r?ô¸Ñ4ææV‰ca ®ÚùQƒv²1UˆÔ’ÿýß2ïÿ†ï¿6Çøß:ïÿ†ö_šâüoû_áúS\€ÿ­³ÿ®ÿ7Åùù/µÎþ_Èÿ¦¸ÿ[gÿ/ÜÿiŠ ð¿uöÿÂýŸ¦¸ÿ[gÿ/ÜÿiŠ ð¿uöÿÂýŸ¦¸ÿúþ_¸þÓ\àë¬ÿ…ë?MqþÍõ?ëþ_4ò¿‰®Œÿtg*;4iÈ¢´Bפƒ²øäwÈàêûÿ|"Køù/ÞÿnŠk1ûOð_H&CûO¡ý§ÐþShÿ)´ÿÚ í?…öŸBûO¡ý§ÐþShÿ)´ÿÚ í?…öŸBûO¿ÍöŸÜ5 í?q`&ÿÿÏþS:U²ËßéDÉ*SºÂÛêcûéQÔ¶û”*=MìY`¦/Ùr1RÃLŒûвûSÇR2á)@2ј¤¨ïEï¬CZµç¼€œ¸—œxcäøÞqöTW…Ç´òêXÿ9l«/™8LH}¯-°R,F»ôhvÙcÊ•žÀöZé9¬aQ–cÊ}2¹ôó¡ÙÕ@h Ø!„wðöҬħ|û/kôì–&™°Šà´Ò$õ9ý>IËeû¯ç L*¢:Fg„dPÆ`%6 c¼?öÛØ5{5'pžrB#†ÖÀ'x÷FA£:ô• o«o$ÎGRCÖéø ½O½°°©P‹å}‹ZÙVeò¦a¼>ë.Uð5˜UÜ+2‡5µRf®¬ÀËʹF½2qȘ­Î×”\C7Ï´L,MxÁíâèCCð‡‹ã“ÿÇÞµ€GQdëUÄ…ö м|4V&éÇ,í+-ÿ¹0¾«%Ëøg@"úýe²àñ¯…´ ÿûÚêqc:P¿ôåä ¶åíú0ïô=öÝž¸òãu3×_ýü‡›÷®ÝhøôµO¾~г~íöež¥o¾Ííÿ÷Ûý™uz`p¶hpÃÇ»O]ÔT°â¿îÿÂùT׿¼ÖuáÁ9Ãî>ÔasýØ>ûÞ ®ºi}¿7î\c|uÒ¤3k~³l@Ù-u›îªÝûê·ï[X5ráÀ'>¬É»„Z~õ^|%µ‚|÷ÉnÏí]õÝ©íÍ5=;¾¸â‘Á7Q_NwÏú»ùC/újT§·ø'îyš[vÇo/˜J¼Õ)®;1þ‰®KvÏžv¢cÓ‰“v•÷½iã”Û.?vÑžOV®ÛyøÍ=œ÷/d›‹oø½õ›mÁÁï¿Ú³»ñ¹~s¸÷ã…ÔeË«¾óöi#zîÞºåÀáÇæ[¾¿sØmõÞ)–ý/¾ôç)ô:nÝûÄ©>¶/Þ3£ú½#ÍÓoyöϦ×÷Ýã[kø¹tÛK3&÷7K/Ÿ·vÕƒÓ·žî³g¢íàtñXùþvT±­êzhÌÒEkw÷°!8åúŽë± `õPÏàÜž·^pÏsw¿aåÝåÛž·b½±óÇûþ}õŽíçÍIöLË|n¤¬-a>¼jkæsRÉ|N¥d>ÿ%Qž·”aù—ÊÈ1žé5@KˆÎSP‹+‰ÇõI-n51é¨Å#§´¤§3P‹Ãš“i¿áëRuiÏ;hš‰N¢OI-n"“¨ÀIkrE2ÉTåVcršÍ’L‡š78…F|ÜÉK<Ëk}æ©.Ïÿp`i‰ùÉ)(8C’º,úÕâÿé‡ÿÇk"þúáÀñßšˆþ\ò?Džÿàyÿ‰ãÿ4‘$üÓ1Ó•ºkÝÀMnM8ì¥}þ§-’Nào”÷dH3~þ×Btÿž,&ÿƒãpüŽÿÁñ?8þÇÿàøÿƒãpüŽÿÁñ?8þÇÿàøÿó‹Žÿ‰¿Ê1þ©,žTÇ 7ŠàqášR+ˆOµÑÜœ¤XÙ…H%´M ¢À·DÚ¢Ñ)‰žŒmsgitý–¶ÐÊ~ sê·´É–Ù­ÐÒŸHšò¡FKAsG!¥™ŒÒ­©z3ßáRA·¿/ÕPíëM”­}ý ¨BM TÀ¥³iHDn&š.eáªÀÙöóWÚ*Ô eã·lxd´É‰FJþÜsÏ6ÔbAU$œàÀs-¶£Œò§ # MMLŸEœ¿³ˆcÌÉ~OZÅúG*›“A}Œ‰àõXõbQø´ò¨5ñþm ,CÏ0’„EP4h›økiŽ¢ŠRUEKN‘÷ I˜‘z1úÚ3—·èLO‹ Ë·˜ò Ç:Üi¨MR)HšÏ£í¥Ô‚p§´Ê]ƒå ž*ï“ÜR“¼’“Ǧ|0NâhIà«Ôˆ¸¶î€Ã%3Ò1ʪÄGY&⼺9Gd+;ËC&Ç Õ¢pm €¿à‡Ý¶{ôÂÔ •É_nn&­Ênsêæ&›)+—΋8û!›|׃†Xb¡ÒùŽ©,i#¿1½9*_;¶ø’¾A2Î?©5¨œå*y*OfJ¡Aé⪪…jPù¹)®œ¼,X”Êß-ŒƒIe) ´˜V¦,PåÙ–sä !]™&Záq¦˜Rª0ª<ÛöQ¡òlËäÙ¹L Ùû§ #E*\}#)?F06Fþ¸ûmð4¨Hx¤ xxî—Ä-sÖñ9ÐÁdŽÿ Uü/ ÅÀøÊLáø-ÄEYmþÈÂ^‹žÝ0ý†y·s/žpäü_Ùè˜uó‹+Ö}rò«kGìc.|÷‡ÙËŠìxhÑ®•½oFžpßù××îØÜðŸÓ¯~qæòMÏŸ;kDõðÇÌíúάüÅ”¦¬áËî¨úGÍ™^¿²iñs›—¼·èºÇ¯Y<³`ëøA}7{«G¬œÖ}˜`Øbýóý«?S°ïø~×Éó–]x×5ï+g• õ¼¶à³A¹¸ãîæÙï›|Ѫ½–.EŸ}ýÓãw®:-mîîï°g_£)Ôõ¢½ž­—ͺkãÕ³ŽlŸüóŸïoÛº¸qÁ§wÿIX¾¼wýß o­ìWøƒC]vOþûÑçKïXPñì’}ÏÜòÁÀGŸzrÁyßö-¼wvŸy§&XúÙwt\"N¸tΓ¡Ë†×ìyxx¨ïƵ;Ž>\ôüãÝ6üؽä›ÙFOíÏÛ˜íSN5¿Uì |ÞfÇý×ß>}ÿNí«»,qÙ¾Ù÷Z¿>>ÏÇØûf9?YÖkLÏíõ k¨¶¼\&-zç…Íûn1¿7óØç‹æw:nüböA—„ί­¿oÛÄqù¯~¾ÉniÿÆu[|[§åæ±2dK¸y"ŸÁµ 7¥äæ¡SróD¸f~Q=ü˜ÐFPF x’0e$éÉåÛ‹–õ$C3àɃ’ù@-tfÆ l Y Qò%³)ˆ}tÊd#éXƒ"§´d b2°QT ³99JÁdKÁò“Š5È–œFÑÉŒC”®Ú ùÌÉìBÆŒC&còµ&‹"-™IˆÉÂ$ļqAé+OÛÜíÐÚóBùÉ)(“ÕlÆLBg'ˆÿOé…ÿÅhÂüZ‚?­üÍ-ÁŸÑ þŒ¿‚àoÔ þ&Ìÿ¤‰¨ñgYàOÑÆ_ AÆ¿I'ø“&Œ¿&‚ŒÿàX1þZ2þÍ:ÁŸ4aü5dü;u‚?Ecþ_MÿàùŸ5düs:ÁŸ¢1ÿ³&‚Œýð¿cü5ýð¿ã÷ÿš2ÿó:ÁŸ¢1þš‚¿K7øãõMD¿ë\îÿ€×Ï øëgýMÁ_?ëÿxýWAð×Íú?^ÿÕFüõ³þ×ÿ45þ5úYÿÇë?š2þõ³þñ×Düõ³þ‹×4dþ×Ï÷MÁ_?ëÿxýGAæý¬ÿcü5düëgý¿ÿÕDñ¯ŸõŒ¿&‚௟õüþ_Aæý¬ÿcü5ý¬ÿãõMD¿S?ïñó¿&‚àÎßÿ0Füü¯¥$áŸD#3Òíá'³’³Žj AÆ–ë€gà§è8ÿ›™¤CÒ”™Äüošˆ½®ÉÏ‹  jy)”ûpÈ`ðòÞ!Ç^Ïe/€ù챜D ,‡¨â]¼÷t ìò&á\ºXØîöqüÌPºóÃÓž ‡ aC¥(4¸9>@/O¸‚>ÙàÈ–~V Àý¥:žhŒÙ­R€\ò‰@¤hÈä…„Á`Ù%‰°÷wûœž ÇyCó| öþsÂÿc¥Öåý1/l0”G¸Y¸±-Ü\[d½²%™Ûoˆ]æ© ¹ÜµA‘O=ÍMqòpËQØž<ÛÀ7Àí{ ö¨U2£Û˜*óÙ³YýÒ´g‘?êÊØâ(¥#(ž÷q ]ð jŠ¡Dð(1Ò@ç¦JÖ"ަ³UÉ Í¡>ö@°&Ú…*ƒ5·“Ç{kx‘ë;ᘩ%‚×Ï:¥r‰÷ºgÁ‹ÝàaÈ}9XŽ"9¿Çí«Ï!wæf GMp²>¸guž HyÈQ~‹ÆÔd@j9ÖÂö€—õxäzÚAUK@kHbÐ ./$¢© 1UW´¼M(Ð& nQ ²"÷¶WåÙÁðËËÚB-m *§¶(åslŠ\ªVʼnÉPÃÄ(ª-h:ò‹‚“à„$ õ¼´AFåQbÀÄÎDÍù@~MS æYžpû`"–çTyúœ\\]2ºtü(hVõø1eðÇèâŠÒ±eUáD¶ªÒ*x¢´¬º¸|lʼiÛ[‘£å•ò¤%ã z2·Hl{†Ñ‹L)D©à zcû‡[4Zh8ƒäp‹Ì4&úE{ˆCîÓ;L8¦"[Æ~­¶!:÷ÆÛh*Zö´´Ë,´!»w‚Ô»ýáé—¿' LNoø¬FU–{ÖÔ¤¶G §ƒaFS8ß^ý•‘… ¨<»·F˜šŽÎ‘Ãiáp¸… »»Fƒadäó nŸwIoÑÅe>Nu!¨¹ZmZUù¨ÑÕðGÉαS±—½.…ñ¹ùè={*hÖ+ïÛ>$îˆpÊ)!’-Ó´JAÞìn¸õƶi"{RGDÝ•€j–§#u¡0%jF²MU¼}À ….ndN€.K€ÉBlR|K¯ßÃ{eæÕlwP€ƒeÒ9pD€fª¶sÊyIžÿ¤:€Œ\(¨X€¨ås9Â% ^¹¾.ài pŽ„s_`H.Î’l*¨šÃ¦N‡^èpÄÎa­ ‡²ù×á–”çôû³–󤼃œë'´öäù_?ßàõ?MÁ_?ëÿxýGAð×Ïú^ÿÑDüu³þÇàøMD?§Ÿõ?¼þ£‰ øŸóõ?ìÿi+þúñÿ±ÿ§‰ øëÇÿÇþŸ&‚à¯ÿûÚ‚¿~üÿ­‰ üoúñÿ±ÿ§‰ øëÇÿÇþŸ&‚à¯ÿûš‚¿nüìÿi#þúñÿ±ÿ§‰ øëÇÿÇü/šÿ©ÿûš‚¿~üìÿi"þºñÿ±ÿ§ øëÇÿÇþŸ&‚à¯ÿûš‚¿~üÿ­‰(ðoßJËñ§ ~ÿ¯‰¨ðçHìÿ@[ÌØÿÓDüu²ÿÀûš‚¿NöøcÿOAð×Éþìÿi"þ:Ùÿà¿ÿÖDüuÂÿðÇþ¿&‚à¯þ€?^ÿÑDüuÂÿ ðÇë?š‚¿NøŸi‹?ÿk"þ:áøãçMD?¥Ÿ÷MÁ_?ïÿðûMÁ_?ïÿðûMÁ_?ïÿðûMÁ_?ïÿðûMÁ_?ïÿðûMÁÿ\¾ÿ“ùßM4¾ÿk)Iø'Xƒ’ÛpXëŽ÷C’p§§÷·¢ ÀéùÿM4idÔøÓ”‘¢0ÿ¿2 _å„‚bN¨á èBÒ0`@‰ÈCrÐ!'HD¨3d¥ ibà8ðcï'(š ™! øc&&V—4À0\9^5PnÇ|b,+@Zµ[òðCˆQàg%[Ë@ÐÙ|Ì?Bú8·¯v„0sÁ˜à3i#L N–ù¸Á+Ó›lóC^ÑJQ𵆢RA*u;%¨œààŽwb‰2©ÁPॠ,+¹}2xY±ÞPTæs Pë$rw´ÉL°¢È6ÉÈYÒ`(Ÿ0>RBìA‚‹LD-/É4­ ¬‡ðã¿ u‚à‚~‚!ÍDQqYüˆG¬3(ññ¤8Ý¢3èuyø™ñd#HæÜ¼ÈÜx" kEØ*±HÒxÀøåY,DQ‰“çÜK£€e*3¶EeÉfP ¸2Ô ˜Q¦2ƒf”«ËÕ.OQ0¦<©:ÊÁ$î>^‚ÙB ´ˆÀ2á_—ÛǹŸ$D¸Ì#ÓUdŠŠe²eÂu¢hdy)áãA ˜ˆpˆð ~ùo˜p»xO€_†ü̬ÇOˆOmè,&ÏlQqELª² `†çÜ>šhË‹ªÝ^>PP%€ÑC(ê¦8W.±pŸŒÔ'G.é4׎æ= `Bu²éÏŒ¯ñ¸gù 9RêVŸNWH‰úéÒÓ*O©Zy2MNÏŠ’ ß›ÂD;‰!v»‹1Ç! =¸Ÿò–& îYà6DŠœ‚ r¾ëu{š~²à6葲ä’K’»jr™ñ^l%NÖÃGz44³¨Ü×0&då®F’‘
9/aç§~¦vþ½(r\%g”¯R·h´&¥ 7ÆÆÔi ú@æB‘µ&ðrhñ=ò(L{© I‘K©T—šS$¦+Êík“H¨Èæ~ûY©N^˜.D¡žOJ­‰çÊte™5°ƒ…*ô€!+o‰£Ò µý?{WÞTµ­™¥qb=Àí£Úœ9‰–J‹e,E­iÁ´IiJÛ¤I -µ(\A*¢Â®Xð‰LVA&*2È$Ô'”AïÚ{ŸsrN‡¤ÍÐû½ï³$ÙÃÙ{íµ÷¿ÖÚk7@Y[c´ Ù^ÕbÑû|¹–l·6: ÓáG^ˆÕç#“v˜‹ÒésVù]ŒÒ2Ýi$¤.×fë3×¾2å:œRY,Â5¥z,W`jRÅaá”Ê¢pÈ­ Ó“ªÑ¦ÏRìêôö |¡¶â8éq†›ÆtØXl–†……ydcI ‘€N*Ç‚ÇB)‘îc;*“Jï&ÁˆžR|V•ø”H’€*êB:@ƒ 3\5P¤ µCæAªLV‰Ü›V—erxl. üF Ð>TšdÃB%5ß!« ¿¨A§—R`ʵBÛÂ)2-Ö, E÷pšŠ›(I$ù=2'I<-38 Cº€$¡Ge!<Ò”Ká/æKX˜Z*èäÇ1–ÈÃÄQètÙsp …é`=‚ô/’¾ Ýö‰6ª}BA< ¦ÙðS©’8‹ànƒ0‰ShÒ2OAõXM¦ôl‡Û†p®íN[v¶Ýé¶A)ˆzW‘šq®BuH“¤NÉ±Ï å~#!¿D°è ©"*ßeÉu£y¿. …ZˆÔÅÖÿÈ´¸ÒaÙä´„æZ È0ƒñO5N•H$GÈÙ–"› ƒ×mËÓ…™ë8J$Y€ÞGEQVÐ…Ð]hèe£·¾ÀoÔ¹ˆ4:ý‚Éh´þ‘¯ˆê€Q ¤êTD€Fi¨Q 3R„°b}Ž¥ü”y }K¥ Ó–¥d`(wA¥Ô˜ã°¢9£.Ì’í°XñPVI9$ž<‚Ts%RçªägÕ$µØÔ¦iúË‘+µÉC22±¢BèQºIÊèÆ£/§¨ÀéÔ´¢²4QJrRv¾&’1"Q3=U*XTòÒ²é“Ùð!!iÖ/E#Ñ´^ÓÅš,Y"êô3ÇžÞ_ ö`~ærL:›!µÉ±DÀ²„̱€Žv¸l”ÓšŒ3ô‚0þsÀ !zpøÈ(<çwºð{d(G~¦ ½.ì©~vw>Rº.^~z$Ú°Ö*¡Š‘+ àJ²^eRd|ä+¿DN÷˜˜îLi©î±±Ý)·%Æ^3|$5Ø6$8´·§#3)Û’;¶à—ûÏ <ºÅŠHd€&ÿ…€Moøš„@ºÓÙ@b@n‹Ä4AdqPâ ¢JA”YôC §:/#“tòtuý!‹àl­z¢þ"Á H0XÈ"%²ÀÀfˆH`=˜g–2 I‚DO•dHàAµ±Æƒlá Ï”tž1@z< ^µÑŽF{q«d‡øð‘P Ô/æ&Kº ­S@ÔàWÐàW T8øSxmƒÆígD[‘9´&Ð^\ÖTýn‹†tú='ÂPk<ÛXHÓ?œQòËåXE^~"Um¯Œ´m»ÞKð^6n8¥t¯]ORù€V°² Ä•Ïj·ßñ ZAæ1ë™Ûÿÿ_}œFߣm…J /àçcõVA=×wI‡†‚iþ3>OjÔn fÊ2„$ïÙLˆƒ‚LJ2 Þ5“Üê¼ ZoÒ‡D  ºcPî‘zLÔs~y %Ð<åç´•ED «}h÷1ríI­ÅÛ`ѶX1‘žàCëõ#$°ž‰ ˆwêÊÝK‹^s„¬ü:«ø`mŒÆ”x<”h'2þϱøð ÙÚI&¡Ê¹–Õ°Ê‹‰²òëî† Ö¹d '* mBçŒo˜„ð4‡'ĨÊNt˜D¢¾bFéÛ„w”‡²¯X‘ÆÓ¨ý¤¢ÊO*àã3þ÷•Ÿå׿¯Å ò` ‹{dBA¿£ËsÐÝ;êÀ::µáÙõq4MNÐÒ®:´"ŽÈxlYƒ†—<:ÚÈÚ†Ÿåû«@½TX}ƒ…ƒ'û4%ûùBÚhèz¥U]`@Ã> }ãgùõ½˜©ƒîrã #º²‹Ã¨¾bªó4Èç‚d´û^ˆ&´³B"£e¦ a&rü+¿îkA[žE'ŸXÑè1 xÍŸ…‰‡PZóÀˆëиì=àPj@*ÇÏòëß#Óâ9΃;ÃÄcó5‘“fÈG¦>i†n6D…áoìê µ-g¢TÍLÏ ²µXPgùU¾ÏÎ’îcÑɯè”rB’ËbGRÛ4È% èzN%Zº“A%é<Ïö6@÷Ÿ¾¢ôï¿þÕóþß«—2{¿ÿþxrÿ3ωHdtÿ/GsßÿÛV6ƒK7ñ6š˜´4KºÕj±²t:“fcÒE#Çÿ§éûû/´õĿӚQÿ:¼ãŸÁ—}W¹ÿ›Cïøÿ¡ÿ Þo@ÍéÂ+.Ì^¢(šr¤eébbôƒÉ=Yh)Q?Àžn½Õ@c¥5V[l,2Kl–]á¢]ÉC ­¶^*¯\šÿ~Â=ÛÊ›ÏhÒ|büóˆû¦¦™¯âóRÎ^šwiÎæ”Aæqk‡¶jùZÄžŸß×ÃO,X]<õ©[ßtÞ´ø›i·Ï¸+¾¹ýSÙ‘[]9z]bɬs¶-¾¸©8ÒžÃß^éT¾aÛå§’ìýØölá—å§Êþº!»ÿPÞŠ;cÏÅõy¾øÇÛ•ÏU~µ?uÒó'>?_~óVQ±ÍpiÃ$wåèæWo.üö‹¯{¬®¼5ÿÛ£3ŽO÷×–[«ÿ<·¾øÈ Ïï\ó¨åúDÿä„Ñ7·ìÂ}zø÷ÝÖv_<ýLdN¯«#ÌÝ7çì?¶¢×¨Õ·*ÿ›=÷_—7ÆÄ9¯\‹¸m\¿ûÖ¼o—¶;úáƒf·ufÚ]mC³£åˆËJGÝ*›Ù~ȼC¿eZãÓ×—Vn9‘º¬yNü’[çôüòµ‚!­f”L‰*ùrC“þx@ܤ+—û¬ù€YÕûÆÁæË÷WD?Â7]pmÞ¨«#/­Ëw¯èùåÄöMmwÝ<ö²±â¡EzPS¾Ñk'76Ü^±pGÓËÝçoO<­ýä9 ÅÇÞå÷T¼|eÌ”^×gü^öŒpŒZÏnϾrZYßÜe'í§£^<µ¢YÞ›Ô†¶-þùÙΩwñ«K_5w>4mzTßÙÛ¯ì<uþÃ&EyžkÕ>ùG±ñgv xî’®•›º´¿ÿÜnE—Ç-»Ùúä¢ãû>ÊX:~c÷]áöòO¯6ûeéÁ1³LÎÖ9ÏÞ±?¾yáWÎûã§TÎØ¶ï¢ÞÝõTóÓk~û#íÚÌG*ÆßÑç«ý–þ·psÕÎŽ{Mo|罋&=OJt$|ÿðÐ×þ¯ÑÑŽÓç¿4¿T`U¾×gMé¦ioÞÎÎI.¿5­ïϽé_¹žwý«ßÙ‚O–^wAž~Ń}§÷>þè㯟o½èõòÆ3õ£Iá¶­O¼ðȧOthqúâí;>joÙ;¹oÌòŽæöÎ寱º›æN_7«Ó!¶ßÞ¾ÍÂ;¶x!zçþÃ…kßúhÆ×ásÛž|uÿå ¿ÀUØÕcÄÌñ‘™Ôøé›^Z}+ãÆì~}ð Ñµ®ü¾eÏ6š•ø@—´³Ù·'. Þ™z}~ò÷‘±ó’†&v‹¸ÿXË­÷»™:ü<;)²Ï…ÉŸ¿tfàÒÕÃÌ‹uú.Ú8숟nõé›RŸh]6°YjÇ×—Þ)Øfe—.ÜÛç`G6}ÕÑ}îCÉS…”£ F/*Žº¿$·ç•~ËJ¯­ÛÊnŒÜãÜþÙM&S»Éz}ÛÇî¾9wùàÏÆtyÿÄ]»»ÆY:ÿÈž§œæ´N°÷ëÿÝ‹{·¼ízðý-’ÿx{qieòÔQ)»‹O¼3ýêëÖ¿Rãö Î]òEż=]s—ÙºÅ]]ò—5þ“sãßέŽë'<µûƒÑY‡ã+ÊJvü>·Ûƒá]ÛçÙ#®½u¥ÍÎU;W´™²×¼¡<ªË¬k»~8qróâÆï…ÿ2ñè=_ü²­ëƒ3£=ïLYóVï¥]ï”5Ä”œwîÕ>Mmñ…ÛŸNéòaüù&MÂÏsÅ{öÌɦ´ Ë×g|4/%ÑÙí´s”5oíªñ£-£:4­/rjäÃdùøTúŠc¦ò?VÜü¹ÓéWÍ-Ín~òM¯¦˜|Sw»U qpfÓüè‡mˆh´ý­‰g’;w\ð^ÙOË^“d²˜Wµ¼y ¬W·Ô]ëúlûñŸÿà»ç·û¤íTùÔÉz4ÍjÓã¤+~Uû±{»>ùJ»ðÄíüŽ„Ù‡L+G¥¶~§ËæWv8öb¯SCZòcWÞòç–}%aÉ3g>zã`Yß…c'ZòζkzbjÒòWvo7DÍúæûƒ‹uÓÖ5J¿‘šÙ®Ç¤sMï]=æ‰É›Þ¹½¤ô¶%éì×–¤¼#ÇÛyrJÒ³M:—6Úö̹7‹yvçWÖî­xnÕ¸¶×­ö6¥.é:ûüŽÇ{Í2®7­4Žwöé¯ÛD½w÷K~};²ÉqÃäÿ³£ùû/®HŠ,[Ò÷§²+v·Y±bþ±C™¶'c^JÎé½™=þÌþÜ]‹gœÊ¼»rÿ³])3’O$ßx¾ìBå#ì/ïóFæ/{˜¿Úõlq‹‡²«9:,ዉ‘½Ü9Í:o¶|¹ ûÌù‘Oþ×Ú?Ä•¥#÷>öÈdz~ûî§ =ÇÏœýÉÃ]&µŒ[`?¾®ä×ÃIƒ¾Hÿåá›¶—Ÿ\øØOâ—ðþ¬ŽO\Œ±ÛsêÝ.7Çͼ/c:÷dë´Ìµ»é¯þÃ||}ï;ǹuÇKß.?ÓRIÛÀ/¤¡DIS1"'Êq¼G{%9mz4©Õ±Yí–>ŽB ß *ݘªÓ'â«þ(ráëm9¤è ZZ±tC!Ã]Žô‘¶|³”$¥O²æÃsý óŽÄ²,ydºd—%σVÔÇåæ:òÝfŽ`hòÅ/òC23<ùÈ—H¾ äËH¾H),)…Å¥¤êûBèÕ” W*q€S8@aP˜nJŸ`·º)³ŽT˜J¡«ÉhFõ(£ed±ä[²cå"¸*Uª0[á‹N?løЉ•2šªdÄìÑI›?-þFðWÞ Ý÷ªƒçF%ªÃ…z:ýH”u´âüBpWÔJ Ï‹xißPÅÒ^)ñ}«—OZo´ÀdŒbLèv3t™ ã•–ZoòIë•| cA×Mp¾Hð~á‰OR8¯¤ð@ CnÀb8Á+)>îbðIHUR…†2ÍmX„ÔN†÷#ã>©¼÷ ºµ Ÿ/¼ÆçYWŸ„ˆ^ƒ6”ñFŠ,3z%¥®Gò|RTUìhYxÁg¯?œè}ÐÖí OzŒ^¥›‘¬7 ¥Tøí•Ÿg|’âUÐòÀäE'[‚½ƒ¨û¨}Ãz•µ Œ__­Æzn¾ömú$ë˜åoc!›£¼`Ÿ{Í|’òoö®>Š"ëÃ.—EDÀ ´‘ éîék"rÈ‘l¸Â1G'œÌ sä \@EQ„O\Å•Åå¨ê",x € ŠÈ!‡º Š+ˆ‚ ûªúžž ÉL&òû¾Ì0S¯ªëzõ^½ª®zºÎãés¸6›Ò: 8\°ÆXÝ ëgŠÈàÐüK C4­dD¢t¹kσMã ;Å@ꀹÄE¾`(è ¸ý!BèA±ÐŒÿåöyûÃLžÚ?“&)’dhŽ‚~b¬?ÔçŠ%C‡¥F"‡åW –ßíFN©ù|X¾„ÖÇ„B6Á³ûãR›:Ì9»wÉ‹Ž oaõÒå]Í”ñ¼me„ð@bhžþÿý–+bÿ—¿\ð_y²ÿ³>>ü.þS ü¯Oÿm— ÿéþ×ÇÇÈš¼\øÏ5ð¿^>ü§.þ7à×Ë'‚ÿôeæÿõñ‰à¿õ²á?ÛÀÿúøDðŸù ùÏÿXø_¯ÿµN§Ï ø<Â/^ñI0|Lô×®#ƒcŸÿbеùOÓ G5œÿªO玹#Òûº|1îAZ:w–7q3‰È]Üj7q»Â“ÑSÒ®´‹˜£ýÛLâí„y* 6¯ ¥7bÿa,?ùœaxé˜z–¯¸½ä¶`°?ûQF‚Ìèï õGçý‘§x|ð7*Dé†ò û1v;ETXð}ïŒltšå{ `/—PÒ#bI‹%{DŽ”ƒŠ®NâËJ…bã?–Ø=ìPùm±³PðåIŽÈè;@ Q2àÏ“4ºîn³' GâÙ#ôÁ¾<{’ ÂÉU V „Ü—–„'2²œ¢ËíñØÕ`¨ð6c€¹d7 ²Tc€¡T#Û˜4;;J~P™lS~ÐÖlC~V ü12 “Œ1†Bx(½>ðªI ûB1Pl÷ºõAZk7<È@kíæÚ1P¬=²X ±kOBÛ톺2,BÕ±€J8#:œ…*ˆ†*°PÑ\:\Œ¬ …ІBaf¸ùA5ÝQòƒÊ¸MùA;݆ü8(Áå øì!•5öUóÊä Ÿ¹Lªâ‹,“ƒöúŒeB|†x¨…/èA(Î ž yµ›Ëä¡*áÈ2yhCØP&e–óƒ*W$„;B  €À€ g‘=`w¢“°¢,å d`þðŠ!”LPE”'úS1¹Q@ÖT”’¼ò†”b‘10»?†æÅpÕ È9¡Bµ*ÏT"Z»Ç£TթŰf“?2(4®ƒ(Á»½¢¤aI£„¹¡/ ÓÊ=ØßëÙÐ#½€ÇAÄ)lDD)4åóQ_($=JE{”‹BŒ•Ƹ&*2е@¢B¾ûW)ˆKWùLÔ"_©Ѭ§ëót VAІ;†R%·5r]#†½QÉd{™¨.·½Ðçµ{‚F:0 Èç»[½†âCHÇH˜ã=l¹Ðܯ¿#Nj« )6÷Çqæ_S‘ã øÔî^ÖJb«<œ:‡Þ—€è ¹Cåõ8³Ê Q¦:«4l”>CAm‡'®f7¨3kW-F 9šÁi¥~­Õ*&<ÂCèaMH$ × ìʨö³ m=¢ÝÅ€]‡E‰œÍcE ~ x¹“Ô¹—¥Í}˜éškkm‹&²Î‰3ÿÒuµÔQ G‡É†—:È­òµÀ‚¶iûE,,Àm°Íë¼RH²>ó"ýbÄFi‹«.×J§ö™×”Az´p–·á>æ8*±•á!ÉSŸØÁJ+”©‹3¬8pP[bàÄ -pꦸjÆ$‹Ì’( O­`ƒõ/íâ²¾TINíK2­“d YŽ”¿%Ìï¤J+.C{“ÂKE*L± l|ù׿—Ô -g³áɈg©ÄÌ'„–ΈpÔõ›Bý)MS bYZoáà fÒàÄ—0¨ª‡ú«›ââ\;ñ$g0¶$>`×6!"Þ²Ç)Éh™(”¯¬ÝÝǃÁ 9˜}1¸'2¯>©¢Ì ’…¢TAæ¡Ê%¨ “L\œù×±;‰›Å—­Y•èÛ Ì* ÿ³ º³ jd¤u‰Æ*Dç¥1A’5ô H6;AÇÛ èR™¶änb²Èˆ¶i'bñK*Ý!XJÿ’*.‘‹+ÿš²RHî¹dV¿êäÖ°À@Am™‰×ð­A¬³ÉuQ\Ü/­†E®t -ÂHNj܄·«Tñ‹Î¼ÚŠŸöš­bÐùNþm¾“=]Qü5抩ŒcÙDg¬8ò¯ñIÅ:CBçõg²7tƒ¢z>ñ“l-†é'vmº@q‰©°Úg^k$zdW>©¢›CÏ3`^°ÉGv“Ë„g‹¶© Ñ6ã‘Z+6þãgBœù7àÈ6|ŒŸxüÕ¶zÿ_¤‚ÿŠýÿQVùÿ²Btƒÿ¯zø0V«“tŠ -¾€v8HÆê`­V–¦h—“rÙëú5|’û‰Gþk { ùç8Ž4ùÿkÿúùÔ þëŠÑƒ}G¶Øp~Ô7E¾Ýq~Jzîk©oöºÏv<ÉOò½™=ûµ‹~4÷–.ÇÇ®¾æþâÙ›çüqþM¶_wþeÅɽÎÝóúÄʳTiiN÷=%”vßwûòåÿêG>ufkhǼsáæÇšÏ¹ÐoâŸz] Kž[Z’qí{w\\ùÓþ³‹N¯ûÝ;÷ç4}óóûÆ7ê핽ÏÚ+³.:°âž¥—N»zÏ••c¿??´`{[æžGíúzšsû¹ÕËòN¾ïœ½ns‡ÞŸ,òU‰ÿ©¼iÚ›¿–ŸÙ|ìøæn{ŠÞX<ôšýGÅíÜ,G¿ïXN{„š»Ë>ûðÅqóþþÎyC×}Ã_ubÿõGþ6þâ§·=ê™sâí©{^»jÒš—òN¤íŸûÂáÁ›33Øïn½­ïäGѳŸtoreLJü¯W]5ót&÷hË©Oº=6ªû÷ÍWþ«êãÃË·,_H^KuœßwÛéÔ?97µûáÐ;ÿ¼fÐù6ÍoF¥å®ylK·;³Ý+úÌ}â‹œÊÆ½uÅ´W>»j÷ýûó;ç§ÿÈí*þ÷¡ îv˺Åw®Ê·yïN§Z´\‘wtiËN·®\µõçÕ9m;MÙ2¶ÅÁé©V[²Ú-lèå;„·FO¸Ÿ·vrξ¯F˜ã猯n9Þ¨ãOi%ý_µz¢CïÆÇ}KMûå¦ÜëÿùÍ‹ô°ÎGÚïês[æ7|h纫ãà›}ªæ½õ?ƒ[]}ä¥dú–ŽíîïÀ6ÎÛ@¿Ô2¯¯ÿ…g›s/ŸmÒì~²ý‘çæY±îêñ£V5É“6¦Ç¯­þ>`É5oãi[Žn¬<º÷­6O~õkáCMšYz•ìYÿû+‡{§]·î—¡k®?3ùüãrnl¶½ô¾…+W^¼Žn;~Væê 3¿;{Ö¼áVúÁ¼?]Û~J¿n­†tpŸ~͇›þ¼¯ÃÍ-[|´³uΈÛn<üù¶ñ»nè[òàîÆëÜÚ¤û ¦ {ú©Ð„á+Coß¼ñ`öô¾Dîö…?I9ÿÈ[âßO¹¾<}bÞðW \›š-{Ì1»œù]Û«mg×<žõÊ'ÂwÇZ- í².¬H{ç¾òµkÊ+ööî2dÅÔ¥ó×o9eÁïß{þáwu.{۴ΟòmüE˜Èà‹ÖtÚ{?æXÚzÒâF34ûÚ{ëtbôØ6çémÃnkéЃ§ÆL 7º‹X) ëXõ‡ç÷þ,Ê|²ç£ƒ\ù‘ðá¹”2¡é„g¶ì{pÿÁtiwZÕÇõj:eã¬*Ï÷#Š;®}ÆóþÜÓew>Puvðò '+úb^»¯·ïÍ.lÜoÕíM>Úõ·Ö_OÝx¸ïÌ##Ó;>9:²é²s¥[¦µWì]¶îøøÍ‡×íÞ'j7ýžfm|_/¾áú+N-[Ýöâ +ÖO9”¶ô®`·V%­Û¼ß¦u¡Ý Üg£›Þ»kÉóoT;½ÐߪÏý­®»×ßôÇ|!;¯ïÒÖñ w üôÝû >°òŠÒWG7÷{|«µ¸îczñ3똗2¬ðo»"õ—åÂмö³ÚÎÕ}nö²í}jöú}£3Éãïä®èxrä™ñ÷}þȸ9wX÷Þ}dØ•«ÒOx«Ö¼6õ¹×öýGû})ÅÇ.´êFôJ­Z4rEøæ¶g­v_qøý÷Gí»s瑼Yÿ›54ýdZïáÛ†e~?èªwóÏ=ùÈèÆÍvﬥ]~¾ý;:ÜvÕ36¿0+÷ߟ8g>»þjÁ—î¼!xêí!KZ^¸wÕOïžžÿô«+·îÜ=9=+ôúŒÖOžÞ0wÜ—›nʻظñòŽ  Ê0l-Tewu *ŸJª2üiªÿ—ðP‘WU þ¤£ýÕ£Vwi=1,TŠ· ð™GWÕÖáR7qÃAÅg~)ä,ÁzIäÏ]ZK •Q^:á#ëÕÃK^âŒbˆ¨è=$êéXSõýRÝ×ÄàPyô²ºC:pV}wD=³WT3d¢œô2…Läq|TÈD^{´~ )¾ÈDJ L´`†B„õ›2]'Š E…LD÷f"ig†Gäy\ e3CÒ$cʦxs~VÊTgšaÍéÐ FS](s¹¼¾ÑSˆ|[W S8óæ«ïéõô—­oé˜þÑlqÑÕL‰€)Dëâ$m¢šÖÿN=&–Žp‡=hlŽ’Á_{@¢øÊÀ‹ü˜ëší®®ÿ9íÿ‘0<ÖÿõñÉ/µ€.(C1y_YaÉŠøXvÄç§«)òÓ•4Dzš.Â|‹<9VZò±kÑŠK ¬Ê|ìúº"Z\Ÿ¨ÔÊJK¥´r‰Ûõ_ö®8ŽâL»*Ns6†˜1$çÆÈ¶D,íξWÅ`YX¼l, ZcfwFÒ˜ÙevV¶öŽ3N ŠgêLLÂ#$Î8á‘£ð’ãq¾‚€ÇHÄ6*€Éý÷¼µ+í®¤EUÙ)=¶ÿîéþ»ÿÿûûïÞ™þÁÈg(gÆù´¬0žc*3p1¡ÁÛñ\o®Ðu’8w²ò¢DšW4Ãܘؔhƒ;ñŸyOûPsgs‘ãz2C’&ëN‰äjBš6Tn:ô»£Â€<˜×¤bÿšœAIIx` Ž‹$ KÃiU”¸„Á=_NNåúéwL'ð‘`VßX0&ï²C‡r”»M›hP7}»!L|p«Tä¡jtªªcOâ1Ú#~‚ž¤€¿ º‘È哆*WX—Oâiâ§Ké$¸ݦ"M>W©é¬Ò{t) ¦È2|"\eJ¿Ið£ÞÓ² ¸%“”,7ŠEÒ2Qæri|ViN9½Y“r­ƒ Yâ<ÃpšœÓ‹‰\ZP:  X9Á²0'Z·ƒ £íº£ºAã+4¾>ƒ¶œô ‰¶5YrE(ÒG`¡ä šmbΈ¨£ a©WÍXóuw^QÈ…yA‘dI$){èñ¬[zX¸A§½ëY"úD²àÖAidiš$¨XBP²9v±y9U3NŠÆ©Kšf• B‡ó™;ÑZ†u~e½‡ÛÎȧ±‹LV¤Šž+ê©&éy-CÅœÉS¦Д5qMKÿCµõn[+ÕØÿPµý‡–¨ŽW7IUU*ìM¸X «-‰šè•m²z¢muFׯÐ$–j† o8 OÔZ+èØ‰hcSc‹fm%s©² Cç¬^÷[Um,$ð‘Bú {!¡a”ƒÜr¶Xðgu’Uò9N¥‹TÅÊ.Î:³Ù“)°‰Öp‹KÍiFèakb(ú üíA`€.•I"TG ýECóYrc±X¬Â£jU<)r\ßd¦AïU‹¥Z,9fÒ&\ˆxä¡kQëèX§f1-ßÚn¹(¨ßÂû× °.¦gúwXë]Ñ©ÿ¬˜{X7ž(ІïÅ$:z꼆ÙUÚ9$“îÆb°7ž×õÔF¡ÉQÔš“5)¥j" èzINg 19 ©é ưÄ qÐ^)<#µÃÝ‹•Ì¥±@é MŠXKe(¤NXyR?¨f§‹A]¯¢á{Í#ˆÀIœ¶)ãvd£`k7¶¥À´=‘^s\©š¹ ”28E¥ŒÖ®”àš ôÒV<[U'-9eöTX™.»¹ò:]ÂÓ.ë2 6çûbk5:EáWã}s\¯$AÉ©l¶°5ÊT6«&Ö»¢Di¹¬”’äÛùWeHðkJ˜|¤v²JÍŽ¡Ó‚%iD— xwÂ’* 35)-ÈÔ×B§ƒæ •9b#BŽFöã:õYÅL'’F<&]WIR2æÏš§ {c Žô9ïªMñÚÑD]x» +i#iÂRSF‘«ºiÅgõƒûdU #^2Œ¥ÐL`£U524É ýçuï ²Ž~¸iêˆ$–DÀ4*]¬v¥ëõæÞr&|Ò’SV¾Þ4á%6fĄǪPÔÞºšp|Ò‰†)o%(Ñ¡¨­UÆ:é¯7ÆÛ¾XYp%mÌLXjÊxqU7-Kh϶ é‰Üיּi´œLÁOâsÜ4míLliqUÈüª÷)!C¤QY_N4'£êµxâÐ}ìa®d‰U¢xV×Ù}uçÝ2Òq•O+§Ô ”‘4ÁZŸR[ "Pq鹎J¾×¥,ÛÏ»™ãº)6T,”ûª¿XY ©l¶l˜WrOíÓ~ÄcÂËóüOØ7màS>Ñp¸üû~ûý??¾ÿâ‘èRÝ[†5^åÏÿxä™-òúò¯Çå‘tÖÈŸoÈ¿—Gþ±Y#ÿ@Cþõ¸<òÏùò¯Çå–Ð?[äiÈ¿.—Gþü¬‘¨!ÿz\ùfüà ù×ãòÈ?8käiÈ¿—Gþ¡Y#ÿÆþO].ügÍþ_cÿ§>—Gþ³gÿ¯±ÿS—Ë#ÿÙ³ÿרÿ©Ëå‘ÿìÙÿk¬ÿëryä?{öÿëÿº\nù‡fÏþ_Cþu¹<òŸ=ûýŸº\ùÏžý¿ÆþO].ügÏþ_cÿ§.—Gþ³fÿ¯±ÿSŸË-¿0;äô‡û?u¹<øÿ4÷éùoaøLíÿu¹ÆÉßqœ¬ñ3}ìÙ8ú_ÊÖ0(à Îÿ‹úyü|(Ø8ÿ¯.×’cÖõ¶(ªI©-Ðîç–,1N$í Þ#I'<‘´îìÆ»Øi¤ì0R „‡‘v“íÈ@- lËŸ¤æ3ø†ÎIêh †éO,N¡( /´JMÓ78 Ì„åñÑÿušª¨ƒœ¯KÕ»0N4Î6‰ÒgYð&Η“ô|ö4<“‚'Ž÷­Î¤Tlõl‰¼Gˆ i­€xrý×Ó»–Õ`f?Ü&ƒ’N_5’Í[Ÿ9Î]Gˆ˜Ï’ ?B|'®¶R<¤„T^—,JãÞËZ*ŸP¤Q‹²(K€E9gý@ÔpTLJ(¡Î" ËŠh‰ߪ”$ÊŠ"˜4ØXíbdë[=ž ª[íeƒ6V»Øàw}Ðížõ3=ãꃾö¸ê å,o1PßW]D¡< 7cê%--dĤbÝ‚Þ ®CÐ[aF¤a¶ê7œ¢^\ÖclšRžiYÔæ´¬ãëüð̬Ï4uÄ6ÏZ3©ÌÀ„M ™`ŽÎáÑ}Yq3<œÿ´‚'|à<¸®·®ù³=(„¨ÆAàOuÉ9']ó™w@¦Dg­")àVuÀ­lŸÃ $L?òºåñì,[±b= bYgç2’$¢f€rš4 œÞ‡åºIŠÌüša·M\Åo5©Ë‹»–+ZaFÊ–~ößdÌS¬³³L1*e&@&2¶ Ô¬òÆg÷P„þX{@X`-8ÐÆ‘dªa¸ÅêæŒ=#Œ˜&=&Ôô¢8V¥mí˜}³œš¶rÑBÓ˜fœ¿Ýï‡,Ç_gâ\²˜*gD1çKÆg~˜«jžþµ€_¢Y;ÏŒüÍ“xØô,ø€SƬ‚) e&‰q!ÆË31] MV=é€Yw î8ㆳ¹ßŒ'i´rýáöp€Ð?ÑvãC¸Ý²nç#$fŸ’‚í _;Ó¾ÉÈ0iöXÌSd#7J½ƒI£Ò*•§¿=Š—‘g¹aÆ?>Ê[‘ÜÃ,iFrÇdÜNú]É ¤êeez››@¶é0 nY’g¾]û•6-‰ Ž Ù¦!½*dÆ“¶NR^xt! ¼F"Q* ÕŽÑݬ™Ö†Žo#Æç棄â€þqZeù¡0áC<Æî#|$Bø0üÆx;?#ìjÊáç8±ßÊŸ`dϼkXQñ ´´dŽ=‚ñ4¤J9ˆEËêÔŒÕotuRQg~A]³àÀcÊBØ@;%íTMЛjS5ÃŽ'± u¢"'=¨3`Æ;¡7Ô•–Yå¨d8f?¤…`÷ãq±ˆp!Õ!Þ0H$À-w -N€ø¤E\YPÉ Pc0#„!#B¢3ÂhÀ ¤¢6Fb؉©A°ÚÊ+Å_h&ñ‡Ó ®¼Áy È’&ë˜ ZIZØNÖ€Áéi®F¢6òkîm´a8­à+-°*¦<êßYƒNg0ò‘ ›ú`:Ã"3 Ö†ÍJ"° Ð ¸v¼ÔX¥ Ï(dbaÇ<#fÏ#˜²g,9¥)kêMÕ •€sÊr°ÚÔm¬޼ßZD^¦šÒ"«4ñ¨¥PA:ña6sEapf0Ø„­Ï ˜*MÙ@Þ”¼Z*¯*®Ÿñ„a¸Øœ ¸!VDaB·ÿÍ8¬“F\eÁ{ †fX\ì°XòA&#î0éìÄz¬›1è0ç;ñŒ3ÌÝžÉáËOº€/ _ÖISÜñ°0©°•Â’vª$|K³1}MÕ ßHˆ„ÂåWøC3µ¾¯ù‘é@~؉|pOù`”Da¾³ Î,òÃ~±l´[|(J"þ© ¿†Ê+E~Àï„~c‰ƒ1¢9x²5ƒ?è…˜ü¢Š§öÏè´¤I ‘AÚusx±°¬þÓÒ\Í&eáø8ÀäQ…°ÿX¤iñ’Aý¦ÃMvŸ„(òé/,éùPlƱí˜,PÛëøÈ‡Êû3Vå`ºvé˜2[Œ¢L·1üb»là¨Ììú>àÜÜd­ŽExpB4ÏXýÕËbª{7ÌÎØklðøpzu섚!{#&Fñ ‹®8ÝŠÁM×™•~vî—Ø_oСôOeÖ¬­úI%e|éΙ߮sVû®¬OÃh}šñ•)û¦ ŸÁ¶ÈÆ#Ø<ÖÄÙ÷®^Û=»)o\3vUùþGZ¬á¥œ‰ßÿ€+ÄÞÿÃ`¬éûÁ`¨ñþG=®°?âI)KùýñH4ˆ…S!1Løý¢?ùió׸föªÿ°Hª¾Ið „ùqïøþëq-Y×ÕÝÆ·¹%Oì¿ú6. Ël5¹™[±Âw{N ¼²Þ×-+øÖƒ¯u¥KÂøC°EÒÜè-·_ªú’îorDçã—Š·ý~áà¹{¶¥3»üzqûg÷fÒÞßwõ?žrß‚ç†þ稯§Oh¹ñ·k›ì¾kÞnÃØ¦÷ŸþÞ³»ÿïÛG-L/™·cç•g§ß½kÉ)wýòòKxÓ¾¯÷}ôØý¯üéñüŸó§ìÿþSïvÏ?çŸî~¸ýÏ|ïú¯Éßû»ïŠ7ÿX}1ýÊÇç¼<2œÿÙ§~oÿxà¹{ÞÚûÀ{wÿ´ÿ…cûŸïî÷Î~{ß›ŸíöïøýóÛµÔeü×[;_ò¸|Eàã_î_/[ü•мùO^yØ·³í¥5§ó]¯¾ã©eÂþ_%­/o=°@ød:½'ÞñÕ5ýC×pÔØÕ-}ûsǾøÂýÛ3\{ã™Ë>çÌÇËÞÜ~rtoäÅ 1ß![Fn}iû_:4—>pÞSGÎ]ÿÝ»wñ¢rÖú¯¥ç.lë}ïGÿ²ã‹ÃÜuÊ myäâÔœïþÃ-[vÎ{|±:goÇÄÑùoŸXJ½~Ã}ÏìßÙuèšÞÇ~ßüüÏž¹úå_¬>õœ .üÁ3÷Ž\·õ„=[6¿¶í×+v?3ÿܦS®óó?\6g©zÁ‡‹ÿ~õС[ß:²`ÃÐgžXZ²àâ]_¼sÕÿýÆm óߟºr]`Õî[_ØòNßæ•Ûk:ëÒÏ]¹è™ÛÞÉ_þÚѽ‹¯J\¹óÑG~²Ðÿ·ƒ¾] /{ö¡ç>ûʙ׬šûƒ®;þã/çÜq÷Úeoù§[æýè“/í8÷Ø–oÇž¯=ý^çí»öxõÇ­¿:lé±\#|tIóŠ^~鯾øöÖОÁC:ZWn=÷Õ;ÏïXª]Ö”Úšò}~l˳Û ¬[ñØ3±3¸¹×îÝÆŸ}Ï5ß"',z0uøC›>¹îÚ÷^þ›«þíË¿}w×1‹~õþ¡Ã÷mÿáyù-ûîæ¿rxëaÏ]›¿äçrüä–³;Nyò—‹ÈAËô/?úäÁç.:{Ãë7$69â5µðæï–ÿçý‹ÎÝv˾½}ß¾$õ›9=÷\ÿ›oæ¯[þëK×ÿóš;ÕwÖñÇôô7ýåªãÔA𸠴À'DXÄ@ZÌ2I!|}cYɇîºïtI”…“ÔQB€5vÛÈùÖÓ'ÕþŸ½+r¢Hÿ€ŠL<ðÀ EKaÜ™eg’>r ‡Ì ³ 3Š“aèI:“Æ$’ÎŒeAßê.ÏûA\AÑ¿úø£Oÿ(Þì"ëºâºâŠê*²Šþ«ª;¾’9€&o·¿§Cú«ª¯¾ª¯ªººŽß0>M¡~ ÙÒ €Bê⼿šì°{#Û)ÀtÕÂÄœ” Ä$5èŒ8AâØ©íåÑ(/$š¼˜A \ë›í•0v åLÇ“”¦d¥Ö`µÀ>™ $@.T½­ Ë0(ERB]^…˜0ß–Ai²rkêG.ŠÍ>­îR@Œ/Eôj"âÙ¤¥F´'¿Úðú·VHz‘Q:_l/‡©fÔ×öfÁfo@QQ¥I Šx=QÖW^vE\„ôAŒ>Ý©œªô°ªÙ£"Šª®w㊬WØT„zlu¨'XÁ$XÔZ2gÅb!^&gÄ"2éÂaƒ $ýl¼¨º¡L ñ Aô‚<¥„ß=æøhòÏ]UF:4;p4å!i~)È$][.ÒÞZöå¼¶ì+†IË“èòh‘O¼ºìï.£KkB˜-šX,×bgœ Ú€ lààr:)'‰G %?1$*ó\­ã9<^-ÏáuèÒ˜NÏ£OK^—Žçt;t<’rëxè6¥.-¡Oë¤niÁ(H}GÎ~þ"­°¿k€ƒ$i§Û:ÿgåþ;nþz-üw ÿÝ·ðß-üw ÿÝ·ðß-üw ÿÝ·ðß-üw ÿÝ·ðß-ü÷ÿdüwy ¨wøï¤ÇœðSö¿ÿÝEdf$.g¥qEàIÈh<0žâ©øï‡šQÜ¯Ž º£vµ¹ØÖ$B¡®R7©…2@€á\UC\(Eѵ)E!‰ †eý]^@(Ð)K@¤EZ)…ªKøåP+Y[ºÔ£­Sœ§µD‚3(FXpP¬©â¥Qi‘ö’ß?Yäè‘¶”bh·JL€ !c9š?:h.$rª¤ °†£‰ÅSWŸ Ö£UIʪ¤§—VÍÀyÚvéC³r[æ–t=l­Tä¢?ÊÊRt‘Ñ`AÚà_GV%/¡ÐhZŒT‰Ë£m F’Ü^…$øÂôǸaKe_¡1ÕÊH¾Ë­)lû:ÙíÖHSÙbÑ" œ´øyøYÝ–Œã÷’ØŠ%ù™†œ¾R^«ÁµÌôjÖe–М½Å¨H4eP¤xL8Ä‚h´ì³Z‘E-.ä³VY:¶z4 Ä[E)×sE¹ ´b#1¡ëÚ ^1í+E—{/|¥d0=x‡#ó»éþ#zñ¹$Ã}épž}Øp=sO‡ÄÂÈXâcQ*¢ô¨zȉº}¤²Êñ–ƒ¯CÚEd{¡=œó/iWÎTr¾¼a2и°¼Éœ…h:S¨‘pj‘ð3Ñ(Ϡ뫇|}óW÷¹ž”¤ÔJR½T’$rÌ/PÝÁ9†Þúþ Utxó]EÊëÎ512Ôñ0OŽz©¨G9LÕh]²5 Ìwz;^“¥.i&¤ñà" ä(YçH¼‡šÇÚ¹íØ¨ÀÉï¹¾kf4ÍÊñ¶ƒZÐ^-Bl§¸,}¨Š¤«(·÷«~¼…ÓX®ÆK½Çr…_¹%¿‹¼°Þ`ßC&$ÂþE†$\ýFj•3q(3ñÊ÷–œ¢Åy”cœF¾`E»aµ;cœ±¼qFâ/G‡‡ò[\*œŒ€ìÅé5·Y†n÷(ûƒ-~X²ë/¶8ü(sR™ž)a,_h~Ƨ=\á¡>3Ð(û]ºãöåméÆê¹ºü¢É9yÀ•‘i(²Ó‡Ü5Õ"Ô+>øX[Ž¥ƒ I+ŽÅ9Ô+?Ñd¤§uÈRJ ½êÕ´–MDfILª[• Íb:¤“M”fð5šÕ0´ÂÛ 4 íîÍr`O†¡]Ê­ØX Þ¹ªî€å:‰##—R¾ôdìvõK:©œ½•:ÉX^Ž×–¢Z©«g#Ùg¥¨iËP-°Aåá“[$&3JOùTJµHÆÇØ8‘ššç Yy2¼Œg#ãüTKi&ä§ZZKç7z\¿ó“’;[}:ù•ô+¿L©räG+[ÅÔdZE)Û@ 5hä=Îò° BiÜ>.äè-²,cQ¥ÝX&îõªëi®´rI¯Ò>•h#3×:®þí£èQ 6Š\é$*-®sf,ÖmÔ/±Ùö}jNåžš‹ØléY¹ÛIÁ¿XBc¯\¤b±–Dëm.X;¤þë<¤ÙyïTp+gXgÆ14ªR‘yõÍ gN*óèVN(u3Ô¼ÔÍ裤w†Œúü*G馪Ø$ëÿÖ˜åFÂ"cêÏý¯¾:È}ÿË‘öÿ€ïÂ}tÿ‹‚,ëþ— `[)'ÃÐ~Šuy‚ÁHW€v±~7 [ýôÑÖÏ¢#Kýéÿ}uÑCÿ§]nZ}ÿÝÿ$­þoÿºü]þtâÄ…O?½{ÔìÒ{—Žºcrü´Êá+§4u Þ½'´‘<öË'üc^Jý{þæ×®©{‚Nž÷μÏV¦:Îùú¤S?ø×¸ý/l{à­S§ðÐë“¶µÝtûØ3¿¼ãœó'¯ºfüõS/ºw×Ö}®?hû(9ú½GZO¿ãÉã.9¸74ü’sUܰøÂ! _ž°!qÆÐvÎÞ·â¥À¶Æøñïm ߉•Þ?åÏwN]žssÓåË ÜYsså䳃ýâ#ÇÆÖßÐ]Ï-ßÜ|Â??ú^ýºÛ'ž6²8~ÉÊ«ßN=|\;³ù±cϾeùÅ€ßx~Ô§ßè|+|ï‹Ã×ó{>;…<Ë ×}çÛ•¯Në0bJ˶)§Kmƒœ½ãfß°ñçvðE#~p./˜:aâÚ {V™·eí˜%í_\µmÝ«Z†}ûÙ;{ýc—O?eü/&Ü>g]Kù¿>kûÁúýÎ7ß:cá‡ïÀ;w•|°`ëòqÃfMô,§¸s™·Š™§Ò‘]·u>9¤bÞ Åç}W{vàèÏb{VÞzÖ¢kW úÄõbÈ÷×Yï¯~ô»9k®Üy݆_ûþùög¾þ}uó¬ ÞÝûwÓÌý¯¯›tðë^Ožwñˆ‚Í[ÖN¿ú¾çw.••c·ž3amý¤Ÿný¤~;¯nàm«“©'ÖÕož<ùüÑ%ïŒ~¥‚žu㎓'ßúŲ_V]¶ãþÇO¼©î~f‹í´E|yÙ÷†9ÿïÉ)ßV.ŒPÿ:ðеþW5¿;¤øŽU_]±bÙ´Tàãkvüü÷ë?ü÷û+Zlš·òÄMÌ —ê†lùRíÏ»o:«®ð¹é®8c÷ÏoœýåZážeÿ»jû§¯½°nþò½û¦¬'ìÿdììú¿uÒŠ*l/޼óí7®8†ºío¾¶!¡™ï[]|qðä?,þþ¸»Ž¯ú­ãÂc_;vÅÄš9lÓÌù`yÕ_ÀŒ÷ßç/Y´tòÜ[cø¤Ÿæ\óùy w=²ô¡»–R.¹zÑyO-y{Â#û’³çXX¿ëß3s:V ›Wí[Ñ’ùÓÊ×¼4 |æ™koÛ~Ëò l¿ýÁËÕ{®]òí×µožõSóœÝSö=7tÐu~üéɳëøºvñâGnêÜpà“‘OÝp×ïÎ.ùÛ›» Ù)ïÞýócwÜ:óO׿6‚wýÖ_Ú3ïªß¾~ï_;vܳ|Ì–Ë_±ÿ£]¿\9æâÔËÇ´^Ñ9?´÷±ÊÖOüìúöÓRÔO¼ü\ɲ틃 §ðôÚÀ‡›ö>(üîòŸøîæÐô}m©AK®ÞyAÓÝkŸ{å‰ß¯TÉŒ›½æ ï-Õ£ëßïújÍú¢M‡Lmÿæ/Ñ÷œýn`øk‡¬ú¦uÀÅÞ9>ì½öîeÞõ~ñ–?¿üðãÃ/¾}t¤äš;wnyªÂð`Ḻк%ûW%Wïiñ™áW®ûŸ{Ëg®9õ”ãvß·­Ürý–Á#6_Þù›åÃ>·péÓ¦6ÍîrÛ–FÌíØ4tßq_<üê »é«ë?Íêƒpx}pŠ!¶œb‚S ¼ìEP ÝΜž(zuçcÐ^ì-RÜEÊí#ËVܼC /áÍæC ʇ4©s`AxN(\zÈÕ¼†gäƒ@k]ZmàÔÂC9ºÐ;çp9õ<·Ç@¡àõÝ!Æ=žäó¯lÞuüÐn_üÕíK¯‹°4.1HÂá=Œ‹-êù?Áäþ“åÿÁ,Ò|ÿ9óÃþ–ÿ³Hcÿüñÿaáÿ›Bšñ?üÿXö7…4öÏÿ/þ¿)¤ÿóÇÿ‹eSHÓÿóÇÿ‹…ÿi iúþø±ìo iìÔý¿À®oá?›H:ûg| ûù¨çÃ--.áG('-,V ãö1dàû¿”CÿL‰ø¿„‹¶öÍ _¨+ÆÆa´±BwO¶OuÛ| _ŽAq}-¾ý#ÅG?Ó)Ja€¶@=dãÜ)eóa´±î^¶µ”ƒbb½P´t,ez§I*eKÙC,@x€‹úÃÉ› À[Ñ'H"@ˆ‰Â\´­Ìcâ6 Vd\Ù­Ûþ¨“TI"RÝ0ÐW"ûJ¤¾9J)°Ùº}‚|#%u€á‹Îñ]Ô2,Si(!…uê[zUôW–èy\ŸÜf«•RØ Íõw‰¨9¸r{e¤2>Ù±ØTÓ¤f›Äñ³k µ–igÛ˜‰Í'©Š3áü‰&|nuétÄ„ænä2 zlb--H  UÎä‚$%`Á|‰dkºÙW±Zå€*VܪÌÀ·´ ¿h%©îFø;ÕaºZYà#lF7—/‘{«ÅÚ"²¶ˆô[DGûeÑ$Íü/îXçM!Í÷þÜÿ°ìo iìŸ?÷?¬ó¿¦füÏŸû–ýM!MÿÏŸûÖþ¿)¤éÿùsÿò¿)¤éÿùsþÏ:ÿa iúÿQ¿ÿ#÷Ëþ¦¦ÿçÍùO§uþÇRÛß?ç?­þo iìŸ7ç?­óæÆþùsþÓ:ÿg iì4ÏâótúüÕÿM!ý3é\´ |¼«ÅjAŽßÅÍôR6ÖÇz@Î~þ‡t£;ß*û“$E:­ó?fPá…u %徕-!K¶ÂB 7´ hCsâ†Ô5(•ˆ*B†"§!2´ LÌx )‚-@ñ+ød4ÀEÛ*øÎ2@9Ñ´—‚â¼¢ë‘J>Aèº6äAÅGûþuq>Ì·ÙìU¼P…ªÀÌEÏ*6hK3E/+6{‚’±)ŒÀE ÐmÃíÕQ?rÉúa1étì( šP‡ÍVÛ0M”B€ÃN'hc!S`ãíLÄ’òo›M-Â@ ”ÃìåÕòŸR`e‰ÜNrq2 ³2›†ìÇ"w ™é€Ì¶8ª•4Ç 9È!©Ì  CàÂL7°WúÙ3iÕ¨V©mk¯Ö«L«µjPj•T£V-»Ö@T¦V'–µV%‚œÚh°™Øg©2qÃLÐÁ•¨Šocã&h Ë iXZF•†¥eôÚÑ0[F›- 3a2)aÙ•®4T‹Qš€†Jø5î„*°*œPV¯‚V8«UÁ 3eU™ÂvhçÔò šœ<¨ §“ËÉ©ä¹`œg™5Žª’ ªÆ«òtA9¼>OT…׿é‚ååÕyÂ2ðªÜP >f!™S%Õ6‡Z$õyº¡*ImžnX†¤*O7̳K-VPW:!6[!ëƒàð€À1~ä •z9dàû#Ê (Z7”&’‰þrÑ@A‰£‡°èQAá*½ÊÆç ½¦¶ DYÈãHuƒÃÿ§dà VN“B'v˜pXfÈC›vÃ#›Dþd!£cW(ÆEY¤¢-…#Ú¹›(©çaïв)Âj&Ìù³Vðá@Ž ,ieüìì!%ÓZÃܼ$›#†aÞêàlB*ùdZ??kæépì•Yø‘¿<Çï¦håD“ØÒ¯»4r}ö= ßgâùÊvn>BB·Ùý<” ó•™î*ûa-à&zˆ…%ᦪ—)·bHø™0+¶h¤¦½6ÚÞ€X5 njD©CUmÁqa§(@Ÿl§5þv M$ÀT8"N¥® ñ [JEŽê`ßhj†Å‡Y oy@Õ.ºÏC1¼@“K$ƽ0kR^Ĥ„QR—3›(8s†ƒH·ùªÝ’C:ܽ€]ô§ã†øÐú¹’¯”ÙŠX7 UNúT¹ŠŽ¤a%35dÇÑÜKÇ pLe 5 ÄóWЧ]aöc°·:`³Ë®naJ´ŠOJ¹²w»qp»î)R”IQÒÃ"ü_©©«È«è.(˜ ðSÂV`(Z›}®òS>@+!Ÿ}¢—w‘'%'@›€Útvìÿ-Èô¨6I!y*\øÁ§"_Q1À6æLàoOˆE¿’øs5|_±€2J»Ø+@ïUÏÀÝ g 5’{)*‡­ ÓSÓj¥ÒÖ Ä™Çá¶(lø”>:Û*ÍÇáN9TàÓ¯ XÕòj …ÀOF˜+,[!›"˜ ÖSÔ& R<Šñ3ŒtMŠ|Gº‚ °Ñb28’…ú£ÄåúÅõRP léäÿÏÞ³@IQ]7É -êžN\]µÄéz¯þ‚(ˆàA Bø„4Ó=ÌàÌô0Ó#ˆÇDYëÿèºQ³Gñ{eQü€¿DŸ¨ëFW³þ“¸’`ܽ÷¾ªW¯ºgzzªºpÎîô©~UÕïwß½ïÞûî‡æPNáê`™{::[Úh0‚žFàú¯ð¯=˜_Z[¡"°ÄŽVø*›ä€+à :ã'ƒDÈÓ­ð†Àê%‘—œ‘pZ[[:º ‹(%ÌA¶s…:q=j)òH}Ò–ƒ9ë à&J°~aÉ ïÑVh¥Î\{Êý™áP)´"¨.-[ÌV€œ`®³VQ!¨ ÚQ‘CQÕÏ"ÁSyéˆøEknE¡“·«°,3|>Ì:Ýò ÜìF·íp-{!€ —,µæ|Gàú¹?à£c]ø' ¦Z°Õ‚+ 3J'€ Ó"½‘ŒY€R¢c«²m¹ñ5˜[àè»;£·2ãuɘÖÕ½X“-¶ó(3f†çZ‹¹<-e…Ê!y i@æVûÀUègù#•lFŸEàUl÷Çö™LÚ¨{$˜ü»hõµ­èî舌nµ—GnÉ ƒG­¥ÈMQŸ‰Ã ›”¸(ßÕÖ„ÿ€ññ³ ©ßgŠf¡XŸq±7Î& ˆ"m[K %àdä³ÎârØL´ÜÆ (d[öè®î΂֑oBæ =€ùo6Dìƒ3fN2ÆÜ‚ù*–ša¥fà§&·t•pÓíÌdƒ_/‡‡ÚµVk«P•D ¸|œUØ@M¬î’äøýîŒ?~4ùŒž0a´Ö•k*hÅvè‡vRát à ú~zK#²I­¹ö%Ý€~­ô l[‹›ws½Ÿ¾¡û}½(Du*ŒÆŸ8ý© Æèéå°Xe“ék/«OsU–§aÉ6½*û ÌmŠ;ޮГXhÉè€giž<Ó¨Ò¤€í ‰„R©à·¥@* Ï(ƒ Û AW‚‡e¥J%kC4v-‹=“ŸD ¼êZé×Uú3á"“jÓ¤Ç&:gë<,ÊçJ¹]J$Ĥ…‘A)ÀYœÎÒ³’ˆ:4V@À‚÷xßô&7"% åoÔ…zÀ2LÎE@?òáXšëixX<#eA…,Y,¡-‚¥îj¼”.¬°Íè\2;œKNŠÆ$°ŠUí¬|ݨ%z`Jâ€0@tÒ‰q¥)]}+6M( ³Éä4a×’¨[ãTÞ/|ƒL`K‘OÄÉàìNŒÔ×é‹sE´8—·}ƒs†5eÂß;}Jæ‹¶º<Ÿþmù:æT÷ÿ€)üLÃbsÐÿƒëÆÿÇ®ø4Ú¼1×䱦¼m[†ÑÈÑùÖ‚ÇÙb½°ø‹îßÐ'ÝO üq`môƒÿ°ìÌrÿ/Žñ_†ð?ýÏ¡3&O9œ52‡n}ÿ¢3–¦kÅÅK3ãÇgOvR°ëk3³SZZÑë!;×ÊdØþó… p/äÚ2=?Ýtê´â+úˆM;ç¼Ý|Ð¥çþåΟ½wVî³xùM{Ä#Ûm?¼yá+¹G>ÿ뎆ï-Û£qÙ¼Ò°øÍ¨ÃO9ã¢é›ç¬<þ„7æ|xíÂ?¾nþü‰­S¦<ÿPá˜w7¼nÒÓçwZaÇÊûšïÝ÷ŒÅÍÙ¼}Ü_Ǽ÷°ï¯}ûÀ3?{¼ížY½ø‹?pÍ[Oœ|ÅìÒÒM§m^¿áºÓ²;V¾{ÒªG?ÝÚþúËïÝ^\þê¨mÃl·Ï+¿»î™¯¿üÌî=žýà€ù{¿ºåœÿžþâÖÓÇœ=纛?öŒyÎè=?ÙﱕùüÖý/›|çõõÝÝs÷çF=õêþŸL¼„÷nxîšK·ºßyqÃ[Ïo¼õÊç^Ÿºú~Æozû¦Lá¶öqG½øÔ{7|îˆeM­Çîßøƒ'^ºzev•sΫÛwûÁçÑü܃”½ÆÒ{Z¶rå­7m;ä_{|ýùÛïø|Ó~Ç5]pê˜m‹ÇoºÚiýÖmïý ¸äá¾Ó´çÌî öÿ kûvÏov»õ‰ë_høúâ/­Ÿýùó²_:ðèýæ.xfÕƒ¿çßß÷ºë^Ûy亗ÚÎyYŸù·×L»êå=_øóK=rˆýLëo÷9ú¹yçøÕ[Gí¶à¡c·œ§ý|þÄ~ïänXsçïã›´ý¬wÞÕùÔê£.y´ûåwîö‘Y:¤a™öšwÐÅGl¹ïæËJWÿá—kö¼|öÝÿs툓¾²v¯?®Ýûêcö=ïë[Ÿ¤ßüè²ywÙÅ£nxºù¥•ÿùO—o<ÔÙðë/9qïÆg¯ÍûOÿ×î“ÖþóaçܳåAwÌë³>wÆÜ÷éãŸtýú–¶5‡­ixÃùá‘7.¹ìGž{Æ]ï~|êÚ[öºÿ_ž_ûí}ZGîœpåšÛZ–^ß4jÄÄa·|ãîŽù·‰LÜ1cÛù›?ù{÷îe‹£?»ãùW /~ðʺ/mßkîQ/~vÖU£çýeîú·žýêœG&ÌxfåzúO«nútFûC;nxòþu¥+W4ë„ÎoošÜtØß\~ȶ9Sþôå‘à §­z`ï›÷Ý~åmS/x°ýáçož{í£GßÅOyó§‡]}Æî­ü'o~vwçç^ñË}Îøéß{jÛÒg8uöcçäšòGŽ^zý¸ ;o¹fÜóÿÞrù¸KŸºÿ=óÍÛw윻ﺾcéæþꃎËß\ó£qc6}§aý–©7LûjãüÍ~ók{ÿö+£.|rôGW]´áìƒç~ü³?ïÑøþÙ¯êc|CL´}ŒtM3¸e†H:{EG!‹ŒnvZ!ß’›TìÑÈPÖ7Š[˜ÉÎ$‹6M‡·ÈŠÛ@|†Û¾}eT2£³Ø8«PšŸZ egzJð»c{JSgÑO™)~2mÉ™E@þìÄööb©k¾G7˜..L\¸¸Pc ³˜£=95ùc$†‰FCÑh,]ZöÄ–|—6?#Z^¨¡' 6®ü”E'^É•r­Å%AFYSNÙ¤Éñe²ÓgLÓØ„ þ‹^Ù‹4ÌŒ¯ªe¶0•J æ)PÔúæÉÙ‰ð»ïÎ<¾s¯Lv¾ˆ3éëaI +ûA3ÚgG ./¦ WÛ¨Ú‘ZLKúí «ÚxìÚ°ê4)¨Ú™Ú²ûí¯ )ÓA ›;–fyýÁ©¦³µ~ûcTŸ"X5ˆ˜3½jjWã÷Û#…RÌtf*¤lö3ÝŒ}ê†'åº ˆü¡É«Þ [Æ[,ü½ /ùîÆBgñ³fhS›‹]%[_sÇ2 A.ç-Åv ãÞ0ùŒã®›Ü†åí2žO+æûzä{«7”;«/¨ê­¾` üT»oX <Ö—õ1è«Xj-4L#g±§³Ð”´·3a¼ Ͷ,ÃÒš4ÿã:Ð zÒÜã¨&,»ÇÐÖ®ìžî™nÅ=¡Sþ¯hƒq«¢ ®;Få{^E0‰fÅ= Õtµ9ÍÅ åR#4ô±Žé Ôå‘3Íb¡ŒkP1pâa¨>cJ±ª¯S´+õm.®ë#Ää’­mèZÑ•Åñ>àÈ)øã{9®NQï§/&(Š¿hýÞ{\3mXeL3=,'Rú$é8±Üwàê‹Å¼”]¡\q¥dT”QKX礘õ×ê*a¤‹fžf:¡¿6|5CïK*za_öj :Кգ¹¸hf8šé†1 ºJù–bˆcj”€:„êlq± }=,]saK°MÂ*œ·«l(»®5ÓÕÉwGš.Va!(XnH"ñ©Ó·÷ijõ׊UfšXÅ]\¹Ò M°xËHû˜\ð²RŒUõi.&Vqª×™ŠU­-‹ûD«ºàVïÀ n…±ÉÀè\À>™ŽÆ¡×¦âdËáUÓû°å›§pu–b·q„{ ¥[p…Vâÿ¤ãþ‡P ½Þ\ѤtÏÃb"dzxõ׊}VºØçRX ‰¢(ÑŠ¡Ë0½\Å7¹ì«Gs±±(¿m(؇J½2ì3ƽ8ÅÇÆ¾Þ70ìã’Zy@»0ªžå DÈg„ #G·}S×èj·tâ/ås ~o£Ý0<‡¦¹ƒ×tccPal‚©­DIq©GI/Výµ"Ÿ.C KÍtBÏ¥¢äð h‡E|ÙîÛM¹†²ÍÅf(M Û _w{ ì~eâ¶we;aläëxC¾Pû€ £ÛÑ>`x8A!_iЍtèÜNú0©žqh‡•|ŸM¦D’ï³ÉH( _«þZ‘+¢ Ø"î¢uºA–Dƒ8¾m?Hí$ H¸,ÂhqX4Âðpø²‘(4]}š«²81Hï%:Ý ‰S›4xTËa‹5@t–©0@ciG—4ÂðBRâÀ wzÉ0Ví5ão½dŒ`™ÊYdá–d@€§A!-äct!DÀ;–îøBDÊ¡+ˆÉgQ&߉2ù}Ë¥©Õ?`P%eHËA[:š2«a-¨,;*ÁrZÄ— †,]¦` (KèEYÂ$:̘õ× ªÞc¼Ô‰å´PãåIYÕ68ƒ# ëÅd_VŠ1XÎú4“å´0Ì“ünìÜq-´aÙcò ËW¸ t’x•42›(û8C݉ [;nï¨OÁ]ØQD9â̯P sd¯ˆ†›P%²Ý(¢T«Ä;ã”Ã2ü½©S8ÖŒn´–¿ÑšÄ؉ÖRtª"Î7±‘*aòß8wh£¥¥«kŠRDZv@“Q˜3ÝP‡Ô„\zSb =K¯7—xÔîò¯`õUíùQÿ߆rnÇ÷ yÇ!nÈáÿÏ~߈û õš+|¯¹êq¢ùUX|Uû_~Dú÷aa€”5Ä¥Þ'Ð/þÅÔÃõŸŒFÕ¦ rƒžK˜ƒèé×?bÈÜc.{þbA~ÃQÿšÜ|Uûýb%‰ù ó)G|±»·$¬ø~ñµðHÀÀOÉ’x Ò¦»®2°ëßJ_ÿ3‚ù±âñ²âÂDÇ%É ™ §Ã" ')ãÊ‚© :•B± Ðñæt„,@•ΠZÈx“þmþ”ôÏÒÈ?ò×ú-ÿ @ûÄÿ%(ãÿÊ… =ìÌ@,cxõYò^ ⦎ļ·²Â¹ŠãäPhì8‰z‰s@ÖŠ=¼…`BhÔu>DÀÄì,˜_Ê1¸ªy¦ÓïÕ±®™&ËséÅCX1#W,³ßD(ôª,iXöþþ›öU¶)w/cÇ J«Þ6×g{›þÓÒUÏÕ—¼zñ.¶óztì‡úNݣϿK¸[ý.k¹+èpuVPÇükß:ÒÞÞ ùP·¤íeÝw)—î7³ã+¸©W“ߟúîҨ; üxõ93Ü:#'Òî=Øý`bú†úÖŠ%çôêêE]]]mF¬uoÕ/.*]UÓD^•|µõbݹ¨„s5¢Âã7¶‹ò[ÚKÝ|Ã9c£Gï® ð=#¼5ÝgfÚDÒ±¨U'›,¦<Üü¡xˆãÞõõM¹šì¶Ç!eÙµ¬Ñ«q¸ücbä…ákçù­u«;{°«èpKÒ¤‚äÚ¨‡.kesžœÍ¶ ÚÉ+ºm}äòþcÕñÏÚ üÎ6Mo´ºoøäÂëÛ9ŒÃÆÛŸ]ž4ÜÖ¿×~¢vgîëvžY]¾zNÞ·—݆·Þ®™?»jwr0ï{å ±5iÊ\±züûq ˜ ¥†+L;ª´Ohéošãmíã­º w'É6ß6|ð¦Ã©6_4i~k˜}NŠˆÄј{qo†`Ñzõfž¥ ½Ìwâ;R™FIi§ùoS»å/^^ze°×Æ]tkxhrþ\Zwò¨Æ -uMáМUãi?L׋¥ç¶`U®ÓÅ«7öÒïÇV>5R»°h_£Úö”²ǘæýjMûK[Uë˯ŽwboüºõŽÊ“½*˜É‘¼üy$ÞÐ=éGš'Ð9/ kÕÂošÜTõ¨Ý­Â¸`Õ¹=ó´–‡KèŽGE§¿²LwéçtÝÿWò¼ ψg Õ°µùI> /¿Q3Ï‘ZÓ·:ÿ8¶#êíŸ!qûü*÷»Ÿ^Â~®²¥ø(Ïê‘ápOì€({ƒ1~‰&¹¹"ÔÇ·L«–:gÆ );–C{ž_¸û,+,ò2nXQ¡ê¯´ß׌ÎQÑ4cÁë¹ÇâO[cL\y–É©«^­~¨6R¯ºDgT¸/¯|ïØoiî….eä+)T…‘ܱCu‹J.V´Ú©“^>¶Š¦ËÁÕªg¬6uy“_rz[dÝŠÈk+"Ö§-ÜwìÄêïÙ>ÏfVi¿Ì¥ü”±ïÑž­¥»– ›¼ŒIœ´Ñ*s»ßO!)ã·gzwíð‡A»~ɳæåÚyí… n+²OìyxxÆÛ—¿Ð ·z{¨£+ª¦ ×'kèHF\ý…¶óAÜÜ5j¿½]šx~ÅãA‰IëèNš´â"ïQºLSRYÖà††vXlBÐR­†yÅ„¬|´cl±pYyr~1esóÃè½­®›×15kuè.–‰Ì5OkqÖ°§V8$j¨=>Ø´eWj¥ÎÁЩNÆi÷7'šÖæ›}ó½GQj%ÎîPÛS|ÜFãý¬±NëO5 Å.l¹n‘êyå›}S‡û“24rp[ïNR˜›—ãźn–º#`Ù-ã‡kžD«‡+oT]8%,×&Ùñ[¢U¼2TÌ€Ó¢qgÁëìÒYŒð…;²ð‡ÊÈùà…°E:a“M,¦E8“¼+F6*T3‡ÝæG¨uó Œ7¢V¤­š>äö‡I.EWTíSmW´wªß™â„¹Ìç×Ún=u‹}%jì˜óSìšøq„7Ý"_™6Ÿ­LØ7aÈÐ|“{ª2Õ‚oS=ïpŠÎæõ•Ù*e‡´*SÞ«GeÜòìòôŒÎSïª{~iLÔN=Þ1I[…¶ãÁ zýÐp1õ4ÿõ‹›ÛKw5ÜÚ·uñ¹ Ó±¬%ñv;ýU‚¿cMÒm3Ù4aƒW¬ú¸\?—£Q†¿Ÿ>¼/¼8Óiå·D“Yà9Âöˆuއ<žj=Y÷2í®ÅÏE„i[Ùç4ükÖ]`åäÜ 7±õ6w`K‚õþ¸Ñ w& tô¡èæ„æµgë0ç39:…aGWó²2¡Ù‹Í*{2±ÙKœ_§¤hànì‚Ålò3´ê¼W‚õæ¶?mײ.óϘ¼É›¼Û?óWÞŽ¨¦Ý,UµÞ6ÜßdÙlÛGÆË]öoÎ}L5¶(Í÷ÐO[=Üå,Xà íxzJy{=¶•ìnt¹rÝïÛ·¹3ëhã9Nîdn{-õQ%ß?µ/ö¿9âýèkí Ió'Ïšaësv­þöÛ~ûÿ8›¼¯ªÊzÓ’ñÓø¸ßKÚïcàì3¼ ^©nËmQ£2óC¹ÈQOTª39“i¨åº¤°¥ðЉò„ìókõ—›4*«JY¿èÉ¢BSÃ8ð—¦yi·(IGÜæ6ŸÉNÊS²{òÈè÷cj[­ü6¿<9?(½‡ý}„éîõºwÊbVk>Njyñ<ûð{o¢µÏËÄ«>žp6Fy~§:±þR꽼ꨳ›3ç>Y9`iœfe¹•‘ë–‚c-Qé;µvom^»ûHKâ¨ªŽ–ç éuœ×‡)ÙöÁŸ­"E²e$IàÇ4R÷6Ò;–᳜ÄdÑm¹1ÊS¶/ƒóDcîx¸g–ˆì8ádIH܈ŸËð‚„8x· ༡!\oVŒÐÑ ­ Zˆ«8 Ñn xôx{гáp¸BA€8§ƒ øA?Ä$ñƒ,~PÄsñƒŠ<qvpã0{€ü±}É`‰Ÿ  £Ðá ÜlS`ÄmH8p˜?°GU°÷<ÁEèB:›ú± ¢TWæRóúi 08w7´¶–´*ˆÎFbV "Ö¾¨!âGH§ò£I©$Æ*ήçãéÜÿîœR™l‰ù(j=ú‰tÒ?Ë¢ìÅH L.dÞ'Ö/ LÈTÔ¤¹”Ç\&_p½Q¿¬d±‚øŸ â›?dÏH?רôËQ朠† âûAúcäË/Kè—'é·FïÉA´ÔDªXEL¦ÊäéKܵûå†,› ±¹ó”=Cý»}öË E6/T‰–¹'‘ÔŸ Év6ë—éWPoVP[]P¬ãêgZdº¹ô˵_6ÈD” М(“ ™–ñý²Ñã=ëi޾ž=»ßÖ„/?O*†Ú;·ÇléùîêŽ)+’ÖÝ3’öh½»>üõÈŒd@|ãY^€cW 0ø,ž bA2<;øûñ°‡¿)Œí- x'( 9sƒóݸÌÏe¡U¹|c&WDA|âe@Àš±üÉ â!÷Óˆ–DøøxÛ!š>2m*\Õ&Rפ£Gk´©€+/€Ó½YB6dì8õÓ,Æð¡ ¢ŸÅ|ÒÀû2Ô7¤,Hð€ÑÎÇ4b¢ •F R‰}Ò($Št¸t9BŸr |Ÿ~Iæ$é4"žöICT‹ÒiˆCªt©ï8ˆˆm´tš9¡Ï؈TJŸr$>i ©Ï$Äå§ÏØÀ¾åH=ë %:ÔׄÁ¸ð^èÎ À9sB¸€x{…s¶ŒKF»GµÌ›£Ô±æäP›°©}S1èq"/D<Áx¥®OÔûüŸHÇý} +ÇœLþ¼þêÿàß Þœ¨‚‰ðšSþ¢ÚñËèÿüü_JÿCV ü ææJüåBRò¬øÃòOVâ/’’ŠbàË¿¹”ü3Xþ)JüåARòo®øÃò¯Ä_.$…?Uað7Wâ/’zÿ3øý¯Ä_.$…?¤(øÃÅ”øË¤ÞÿŠ‚?^‰¿\HJþC2¨Ä_Ô*^1ð‡÷Jù— Iá* þJù— IáOPü JüåARø¢yþ$…Á_©ÿ“ Iá¯8ú_¥þG.Ô’âØ(ñ— Iá¯8ú¥þG.$õþWý¿¹”ü+Žþ_©ÿ‘ IÉ¿âèÿ•øË…¤ðWý¿Rÿ#/’zÿ+Œþ_©ÿ•Iáÿ¯ëÿAÿ+ÏåB}ðÿŒ×$ƒÇÃÂ¥¾ª`÷¿ DB÷ýOd‚ žâ) òþ'y-,–ñá)…„ñŸÇ^¡ 4ÈRжf—C=£îÂ<¡ˆqCcÓƒ!v|¿«KDcq˜PLü‹æ gϔݭH„a¼Ã ñ kË"™  6] B¸| G ŒÎa²YœPKÎÇâI€Å£åç@Ñ^¬ˆH6RÖ¦»š(Π™}Ê¢™õÌÄLŸ#»ŸP™½Ðat~M?^Ô{žÅþþذîüÿ©z¯˜Ì_ßnŠ€8¯n®ËÆö­ŽÁ8Kj2!¯@#åÓya袑¹è,ièÝ®ñ!¬ÐH>$ p ÄHRpwYü= ŠŠà2! MÂ"Ú8‹!@ï€A4'ó„ñÈE Ì`ò!¾Œnf²»}äI÷ðPh‚ÈàRj ?M&`‰áDEÉ !\Áü³„PD€ØQØ2ñü aÄF,-Œ…ÄÃË-äZ²á¼h4k&ú&ÆŠ/¹…°H(B×A¿¥àå “&é¿/3¾b'gË@<ì§(â3mˆ¸L÷(çÆ<>†9€?2YˆôG a(X@ÆåAðº` h› CÌoH$Û€K~ÎÞNî>Þ€ÍÀÏÆÓÓfŽ·ÿt¸$øwŸ@ò™=O±ïk‡ÿöž<ªòJ¶Z%­Vkå $‹ÉÜ÷‰B0*$©Ú¦737ÉÀdn2¢®[ÁU|¬¢¢k}×ÅÕú ‚Eñ¹®Ve­+>ت â£*h—VÚsþûžgÌ‹|»s¿dfþóÿ÷œóÿç?ç?ÿ}œ“ûþ/ð ï•?ÏŠ|áþϰÅÇ×Ö•ÍéMZ_Ž1÷Ì€$5âc΀¥pfže{4b=b:/ŒõXAæ8ù¼J`²ECØ~¦žŒ†ÂÑ–™zWÁзF"qNጤ`³ô6¼äg0¶Ç °µ1=¢·0¾J=Q‰ÙÕ0¯M³Òš h¤\c|q-‘l?CM„£éaÚÔØbÆ7;Ô‘êO´ ^ææ%™àåÓnŠ€¤Ô² S]Wc`°ªFY•H‹À„ëT#¤=iÿf/ †P²Ã,ߌÙv‰ƒ’L&4Â$Ž“mÍ­Ë‹…µ˜Çm À–ŽŠ‘‚÷ˆl€€D8rš(Ä7+¨…‘ˆjÁ8`c¶‡ ­ov: ›ÊlÌö°ÁÕ^|Ðíê ø€™ê4|Ð×j> R›Á4ñë!¢¼ƒµ›ú-Ö¦FCMûDz«zN¡·j:w"USÉŠ@Du΄¾«^E`Ku‹@&‚). š‡ XÐÒY`ÀµT$ ªyˆÂ<ô…½ø€Íp|ÀL8 ô3ìÁ'…P0¦« G=IÖtMðèé4e`EO¥)Cu/Mèƒî¡ z<¢Æ[mœ•ôʸH¦ÓT€•d*MúôÐT€f· P·u"! S ¶.A  ¡€poªAÌ„¤™ZFÖ¨–Àf=€Í8'þ7‡£¡fŒJ…ˆ‘QÉ•ÒjÞ¸éío⫪®$Q `Hoi×Ûé/ 7k‘¸fŸÓ‹·NÔHÄئ-ÕŠQËfÁd ƒìS0_#Ô…£²ÈôÒ†¾³ÂmZ¼l¾ÚC\}sÕU'ÔH8˜¥r¦ å¨Êr®ø8{MYMS$Ü‘Ôr´ÈHÛ[ É,=égƒg%nÕg$í®Ì‚ ÑÔXB§kS/i "a¬åÎJ‚Pwå‚°ž÷¦;Ãça kÆÔõX¨ ÅWÖ¬¶…#ÝÄ#?Ê|¨ÉH"O+ЉNÕtœö,ö“xPhÆŒF6}ÕÑÎ:U©tªqå¬Xm¤mA)ŠpòsDë âäï$©'pmHÏòŽ…qÇ1X1‹*èF}tH„ÀFWS4Ú"@R¨´%#T ³žª'Æ©\¦Så Àl¨ÂÑN0"=>LÂJzÌL«T½ˆÏHœšmÕ—Ôs7ܳ 'Xá=d=T‘퀘ŒfÇÐ÷Jƒ†Âj‹U#q/Ъë‹g€|m Í"K_Teá¨k7%7^;ëlŽ6t^çkÕÛÍ&–Y„7§>jW1ß,é)*&a²ˆÐRœ)ò?\³Í·È]» %LàkŸ…&4™þ8üè²kºµdÀP‡1½Y[F  }+&ÆTTC‹aôhk4±ÊU4Ú;k$ 8k pEcˆÀ¨B#.ÔG–Äìñ¥ãRTä¶ Œu:C{{­i¢wµÇÂm´Ѓ® x`ý»Íï®86ïÆO@$‚ÖÁ¶#?m’<(@{7ü ÝfÌ É(y r†V·x9‰”=âÔ"‘p{\k¤™™a |±n÷ÀźÜ%O•»¦M…1ë²äf”`þ†…)ê"Ý$S£qÜ÷3E€¨V—N[ ㎞  Â,Ò,^FìΨªf~gžÚ@´#Ƶ[‹QåkLQ=Œ:™†€I|`”‘¬… .œz0ÕZð…k¦n€_°-÷ßQÝÙ]ðÛ…ÆÅ¸aÄÃí˜Y*e0ÖãkS»ŒŸÖØ‚GŸŒyAL‘—Ý€#ñd±)¶é!Ü32EjDWCt*»¬š'ÇZf®×®Ë~¦V¹Í¦·Î#/=jöÉáLºP¡öØb2ÆéìkëN¶·{ú  ˆ¾Ä²ZU‘„h h vÓ!ië¢Ý–µ\Øü[ޙܨõ›NQnë1]L&ÏÆ²ˆF®õ¶pŸZƒ/0{°?‹éKLas5 jɲm*¬ÑñdL#í¡ftÎðQ.pþÛÀ 1ÖÁÚº2ºçoi /=Ñ ]H´‚?UŽ'pÑ1>ëì%P©ÑU«—ôà¥$ê€ÛÕ>—HŒù‘LØ¿ÉΔiӦд¦LŸ>…ÄÕfèQàƒœ¡u‚ç€÷ÎpݤˆmI‚úEh…C›x*z{8›R3·/6w%Ó¦•Š%%õÆ·ÅXJ³éÓ³4£R6hˆÌ¸T¬ræoï5 ÿœk@Ø èh‚f/© µz ³O$cÅ0®áv‘ƒó,“jyQŒÒ±v†}³Z¶kÑBÓ\d [βPåútôŒáBÜ[kÊ1ÅEó@‹9ƒ?:Åœ½žá‡yPsôÓVü d:³GÀ#ìåÍe(ÀcÁ\T  ØÖõÛYk…œ ÃÁÍ8~"‹ÚëAïXˆ>L[ÊÔKåÐÂ¥Üü!•³°ú–s2ñƒ¡§ ¡$Jñå2VúýF3ûô¦‹.û¸¿µW~OÁÏÔ3eáDp`Sx¾‘4À,·Óºø°ôùZBÓŸ™yæ2>Œ4aB õ2º™OˆLŸŽ(ìó0™ã›1ožefòÏ.ïÌÉ&T«‡¦x^¤ES€´(ØEÚØ)fœC™Y\r9fS.má$`Œç2N¶ÖNµo1Á8R63-Sèvú!cž rE‘áSÄ^ïíÁ4ôÎì Ç 8áXü‡qÃ,W0²°ŽÕô#*pæ7 B¶ës ©ÁçÙcö‰?NàFÀæÊ>`KW@Ù Y'Óá7»šWN~—!à‰`Yžpôúmš|¡¦;] }ad˜³æh ²Kæèa ;n)*4uûaƒX?Íï‡iÃòifÀz¤Ï–Àù F€VÒ_b¹ÀÄ0øÁ0ŽZ°Ä‰ÔD€/Æ]RµGk_é ’¶µ’—eȾ‚ ö¾ª<Ǻ>@Ì¢¨É? ¥_r«|ÌÜÄŒ ¥7;i&ü„?k41³¦]–N©?kÿ€IõwÝÇ „”¾ì›‚è×Úïu.­ 6݇)8`å—m‡c9"ãÊÏâ€âê( ­ò# ÙÖN*HÙ+’ˆî÷yŸU߽ܣgÁÒü©<ÛÍÏ“&yÿê=í¡­‹˜×ÖVE {m{Q¼«Ô­ ¡~ë|€(i*o½¸Ú%ÞÑÖòAXâ%—ïÏíÙóQÅέsŠúMû¿Ÿún)_ºm¥ôæ1¯·åÐDMdéËc^Þ³uüý RluÏêÏ·¼¼ñ÷ŸôΉ³^éxtÓÝ+/Ÿ±dÃÞß/]Üß¶g˛ۼ`ÂÖÑ?}óÝŸL¾tû/ß~tûÊÑëÄ­³îüï§vÍ™º+øõ¼ ;·üëÄÏòwonjœñÕæçw|üÛx¸æùsÎÃ<¾¶!~ep×#Ϭºâµ²_¿fæµ]G^ûëÿ¬{¿¡| ?]먚rÐï§NÜXSî¿óñö“ê?:êëÇθü¯±Î«NønÑWo?ñÈÌ3ýËVUÉW¿?cß {/,9î‹ÿœxÿ{ÝW¾±yJé9ÑÃ^[Ó}hñ?ZüVeø9åœ;ǯ{ ¬øà“;zþ炟׻yß“OŒYYºyû’ùжi]ÞòôúÑNˆö›¦M¿9eùsó~vЙkžÿÞÌêEÏ>î‡1§WÞ¾wÌñù·ëv7ÿ´í¥÷ü×ÂW§ï;û®U½¶dìùs_Ü<ùË›úaåÔÄ!Üš8frðWLûê÷w”t_·æâîtü?Þ¸²üåçüÕ“Ïþë´Õ×m_°½èÚ¦MpÈ™Ko^¾fïŽ-ç.¾3x÷kWÖ|$üî–±ÜÊ'Œ]<~ܧ߹ñ’µ“Z´ç*^­š´zLù¨à½glšxÓ±›6Ê—Ùýá´{îºêü#¯XwøõîV×%'vi¾{ïØ7ªóÕÁ›3çüÂù&›óN’y $:Sñ,Ø4ûÐôÍÕBau¦ÞEèã æ­ßÆ7ŸÞ·%,´¢Ï* 8kl^÷‰’Ú˜¬Óõ>˜ñÄw–Ö•€ófw%æÔÑS9ó”*|bŠi¦¸oF4ª'âõ àXã‹3¾p»;¿Á7 NÁˆdevA°»@híDœøN‡â¤ž1¨4|P©ºNå¼½‡&jBè- !…”’2ZvÇ_Mí\ÂMŸn6 ¤4¤ýcÌ«!`•= ½;'ÁYÇo|3à¼ó«óÜçd|uØ ÇϼæA/yØLÐqÌÊ;•Þ¸ÇËXrN&òÜdÉË—s4˜bB/XòEî ¿yás3"ŽÐ‹(\N>ò\†ÊË…3a}ó:§æ»¦¤K#çû¿·ÖïTÎT㪑óˆ„Ñ'„9”Ä9ç»45” j±’ÙuµdN«O¬ˆ¿œ“ ô¥°ÅøK%•€‰y™?€ú¹z([•ùvSIêËM s¾Ý´°N5¢T•,4ÞpZh¼âTŠÏ¶'"ZÉœR{»bZ3†Ibœ÷‰,I ¾fbÁ<ÈŽÖD-'+B*ŒõË\L†Ýz*Œ­Mk'*i°(U]6c3À8‘OƒñJ:>1NÓñIŠ –0÷üô+>}‰/Í×ANÔØâCãÍ:á #]]IêKâï¬Ü6ïíg:Žiä¾i¨z÷ŸKÓ! õRÔX‚ …ó+RáêçðúÿÒÈÉÿQxÿwXŽùœü…øïÃr¤ìÿGNþ‚ü‡åHÑÿ“ÿ£ÿ}xŽý!ù? ù†ëHÑÿ‘“ÿ¡ÿoXŽý9ù_ ò–#Eÿ÷{þBü×á=RôäÄ.ÈXŽý9ñŸ ñ?‡åðÊ_ÞŸ×ÿèýI*\ÿÎ#MþiÙ=ðîfLÔhmø H« 'éë°} ˆÎÿO‘\ñÿ¨üyQ”äÂóÃqŒ¬ø\€#0 ñÿ ñÿ ñÿ ñÿ ñÿ ñÿ ñÿ ñÿ ñÿ ñÿ ñÿ ñÿ ñÿ ñÿ ñÿ ñÿ ñÿþÇÿs®õ-þ[^…çÿÿÄÿs¢bH¢b ø½›ÏUèWÀÉñ<çwò*É|¥¹”©·C5à¹\áSÂ5dˆÍ`„fqÅx°*ÝqÜ8l!ûíH:8£Àq¼{°hö6gœÃ€ÓÃIãÏ­8”¡,Qf,^ â9?޳233’…54P]Ö@N¿üñúÙ>õJv¸šJ2Kn!z®È¨bÈ.9•øáŒ¢$¹ø=¿ Ó_û“kQpqM/ÇkóC±Œëž>ná;lØøSˆœ‹Xgú®X Ús§'æ@¤ÍµL\:>•ÌÉFÀŒoMÀ=+“míÙgžWÛÜX¾]„PX¶ð•4à@€PÑ…¬÷Ù-`Pž @FgÜñe'ôŠÙE;Þ’»”c1ɶf ±† ƒ)\®%eHדœ–»ã½¥}•Å>[P¼[à^¢É¶lK€+r‘Å "¼«žL€[Öˆ3*"g RŠ9Âí"EÞ»ne'•'yð€WÞ¨oÁvz¥=+xÐ/‰Á6¡¶>Ý™ ئ֌û(§vO!Ö->ࢮ}K!òŠWˆÁD,’s,,wÀa8Ï€d›·¼Â»ç-û4oy)ÛMN!Íä#ƒ¢’Ç/v§ #›‚Û}™—Ìá[eô$?ô¾’á†Ö›\`hý $áW¼$ð å|L–!2¹" ‹¿bG`Ð3Eµ½dcI P ÈÑ/Øõõ7à™MBL%á8~ŽÖõ;ø›àöÛDäq£*e 1ƒ¾ §ûmó1¤øðølFGìhy-ÚAîYÅ€»ÔŸmˆå˜‚BVÉè³Á€Š¿–Uq\]TXO±˜'GNÙ [ú²ËOµ6Ìbñ+R þ ÌØÆp¨ïÒì¹9^n*²0pw ñ¤xªfä>ylN8í”ññÊ×M1ŵ Ç›cÉl¼si{íÁqãLq^áFãæSN´«Y¯T*.×¶ ¨´ëí8íqÜÍ3TIöñb¤ëwOs,öišK)‹+—Í‹¸Ê¦¯zȈ_!Œ(\6ß1'ƒä7fgÇãk[7M²HîXÖ)xœåùÔU‡úBÁíâzº•JÁãçftºúäe!*¿[¯Š%Óp¹*²‹ËŒ=žmu¨Ž„l8%Þåqf0IˆÏvhHx<ÛÙÔ:ׂiÈç¡§Øe¹\ô÷E ¢××¥1ˆúàí:ɈTú­ ’‘¸mº…Wñn±Õš E¡‰îk5ÙÖˆ~ì&„ÁJ_νȱ.W_dé6BôË/Æn"…„ã‘ÂnB,Ä/Îx èý>†ÎýþkÅÿ¥ï <‡ï|áýa9dUõ7Krˆåƒ<˳M!U‘?ï55 …B¡ýÍ_áÚc@úßÇÀyô_äe)íý//èÿpƒÿ÷ƒŸœ®oeÙ¸ëìÑo<ýæªy‡Ÿ|û®‡ï{ãäâ?n­øÁ쟕­ÃÞú¡öDïí'>ßyÃ7F–mj;£î„=ÕOþèÚ/&ÍLÿôÇk®~ä›Ëæ½yÑη¯}ÞÜïúóu›ÿtÛ w?ºè…ƒÇ}ÃüíÏ»käë}«äÀõOw,}k±ÿ®Ïb«çÝ6qY×Óä¨K˜ö—v¼?'ñBHlîØ=ê³ØUüŠtúm]Ú+?nmùSGÑgk§t=4jçå{ÎÚ}ÜeŸ¿7ùs÷<Ù½4x˦[ÆíhÙwý±;Þ±é课_ýÇ÷ÇÿîÝ£¤ ·¶{êò¹Ÿ<>vçÅÏ^?ì\ß3‹oÿߣ¯zâÖ ß™´ìñsn^þÊc+¬uÔÓÑSëFõ>õÐ{·ý娛æø;_ÚöÈÆ}GlÖWí«XUqàe?xéžõ_Ÿ9¡ªêü'Ÿ7ö+ÿ)ëþ­æðÏ\ºì¯›0êó {¾øUòÊÓjÃ¥û~~Ç© G—þBÚðÊÏk¿xê¾ðÁ{nç»øõ}÷žzÇ¥eWø;c×í=åo•Ñ2mÍ;úâÅž5ÿ´äÜ¿¬ýê¤×O:lýÄwX{õçw?°|²Z~ÒC%ËŽY3aéømý"òå˜õ-»?|t­úÉ‚þÎÞ“ÅFr\'@‰%ŽrøÃ9œÃ.ÅÜÕÒZ’sÃ#ŽLî.©h‚äJ‘whºÙ]ÃéÝžîqw¹Ôd”DH; Œ8ˆ…øCF.I@`år À‘D²,A2[¶G>ò!$‘œØJ;HÞ«ê»çèáÌ4B?ì1]wÕ{¯ê½WU¯þq§xòéç.|ôãù¹½ádá'~ìËÏüüÿò§ðöwT?öÛ/|òÑ/>ÿ~é‰Õ{çù'õÉߺšÓÿûÙ+³ß°þ­Û_ùé›xüçÎ~@~è×ßqkíÅZ˜ýâµ;ò¿ÿ¹ß¼qî†[Ÿzq,³~ÏkÜ1þõw¾ð¢¼ûÍ?¹çÉß}û-¾yüúï=2¿}Ë~ámÏßlœ/<º½ô//=5öýûßÈðeóµo^øÄ#¯ªUÞ¼ï[ýò•É›”¥ï|åü£åçÿáÛïy´õ™÷ÿ仿tå³úÆ?ìmŸ_ûø=qåGîÿ÷[_ŸŸxùëO¼ôùÇÔÇÿþ¥ùûßø4ýw½ö¥S'·æÞøßÇžýèãL_zæüÙënÝ?÷kO}ªù‡o¿òÕ§^mþtqrç¿&þgêo¾öå/üŸLåÏ¿ñð_\·õô_ÝxõÕ{¥÷޽ü·üÔ}<ó;ß5o»öÑ|å_ùÚ'³ßýU»ã¦¯=8µõÒ?}æàß~ìõ{¨^}¨qõ³×ŸÿÔ·ÿõ¹Ÿ½éÕïËÏn=yéøÞ}žyîòã¿÷wûüÓÉÅ×ßù½ë¿ó‰?û™Žžçsýx>¶½ ÇóqÎëù8ßÍóñ[Ê×qžäŠ ]æ»»:Žrbc@—ÇYÐWrìã¹>~{mCôãó¸“_Þ„:ù]ÈÎuròË£âtò[èâä7‡\Êc<ÎvgÂaÙ…6ŽzsÑœü·óæòÙ™°³Ýù6Î{gÂŽzÂyóá¼³³ž°°óÞBç½ Ï´Öž~ú]¯¾»¦-¼ðTv"rÞ;3Ÿ(Õù-ù?1þ_Sÿñ@ÿÉñÿ™ú‹øOŽÿÇÔÿW,Àrüÿ¥þ¿bþ“ãÿm&ÅàÇÿ\bÞHå¿x €ÿäÈÿ©ü ðŸù?•ÿbþ“#ÿ§ò_,ÀräÿTþ‹øOŽü?›â?ðã>9ò*ÿÅü'GþOå¿X €ÿäÈÿ©ü ðŸù?•ÿbþ“#ÿ§ò_,ÀräÿôýX ðþSräÿTþ‹øOŽüŸÊ±@ÿÉ‘ÿSù/à?9ò*ÿÅü'GþOå¿X €ÿäÈÿs)þã?þ…lRð?“Úÿcþs‰ÁªÿÅüçƒÿTÿ‹ø/$ÿ©þ ð?“ü§ú_,ÀÿlbðŸê±@ÿÅÄà?Õÿbþç’‚ÿôþG<Àÿ|bðŸêÿ±@ÿ ‰ÁªÿÇ~üï$Çþ—â?àÿÈí OõÿØ „ÿc©’ºGUøÿ` RªDpgÿ³9Œ³ý?sèÿ5”úŒÊÕƒ:Õav©ÙìŒûV3S6({ ¥ Ê“N’ò¤“ˆœÆüdV¨Žo9·2eö¸x³'iµÊ²*ÑkͶ‘Kíƒ[­L+ÃkdïÒóø~¹K±„d2™fÙ4Iù=²** ‰’ñ÷«Ðƒíò$dÁÿd'yuü¶ñV&Sâ^N|ŽZ’…]]¨±*:v|±ÌT7+ònC§­Ëg·2VˆHñ`*ìÑ=|·+S¶ZÂ|¨Ê¢q™9²þ¥ùùº¹Õ”ŠíÝ»9u°BÙT•ÜŠðÃjGæ´¦49R‹±+¹9Þ—ü´4× íÛÛ"´0BGÊFcÇ"¿÷6×;Š,’ó´¶Cu²ÚPY¸Ñ²zZ«ÕÑ,™´&߃™eøE2)}[È"±³ÄЬ^í•´ãH¶È‰n¥ØÃ%81d¼,æ¸N‰è¬„ʆâœl˜­²Q… FÆã4 ™©7DÈ3E¬Pq_Ž>.}àr1 ÜI²!”'ÏÖeˆ• É&Ñ%½¯ÑÌEÍÕ†¢7E®ÈT"¢;¸øŒ=>ºD]¢·Ç}Ù¬³JI]Ð H- ¦0,ä£ã ”8ð–$VsEÃ(˜Œùœ\ÑúBS>4>áá*#C³­– y@Þž¬›Ð@‰e¼ Ùx7Tö5’…H#y†{ö˜ñt¾¡ò® c.«fÔ‘€ü5ì-Ç+é§Ó3‘:½N͆®ºò)IÃêý,ôÞáˆÕÔ1#"v ¸è²,ëTÀÌý"~¶Ÿ1Q„Ú Ö0av4-2ùCú’³Ž¿¨*}S{±ŸNãdàVE*а;¬ŽÏ!õk²µã¾¤ŠåÉKu ß„™d^•ûíü\¤ÎC=:­¡oi^auÑhŒß£#H«]–!NÌöZulæ[ÍUÐ'Ú”ÓuQ;\£ø=eéLLvøÿuMŽ0ŒýpÃB«¹,%¬ßÐ ‚˦=e²®Ãb‹¼$èºp@ä ‘M"ê-&ˆ–¬e–-nÊ!ŽT$÷ j–'ÏÀ¢ãã #noשÈ$‰‰5b”ÎB‘ž®òG£ˆw}5=g5E&_Ó}r”ýѳQ¢Ñk–Έ2Ï& ä%E2ˆoºYIbOd1Â0µ„?gÊe'FÞ*,ç{‚Ò KŽiTÍ$ÚÕñÙm“ª=ÆÆ– ú#mùaLæôŽÒzÝtXX\Û/w†¥TˆÃ—H#8 ´„ËC ®)û†é7 `õ+º®é},ú9ÿng´`£»#A”÷Eg×J¤b©ÖÄhS"T{bb]š±ºÄŘ³0P=Ô+ÉÞ „¢ÑÕ¼>ñI°¤¡Nñåã*½fRxêà à)«ì÷€Ãç/vdÃ8k­ÖpØáÃáÙÇ¡ôZ4šÞ=½-Ož:°äßÃöZZwíÆŒ¦Û ž¡ Åi.ˆçQôêM?æ-ž_ÅU¦c/Ú°2kËå"¶â~v¯•ä0³‚]$a¥DZ_ñfwí2ÄVÁ#›lá04ƱtkTœŸÏz»Õ‘õcèÞH9=o }=°7’ÎmŒˆ$óywúê›óÛóó°»Î›×³÷¶ŒÚŸÙ ‡í¡ÓvÃ:)KݶvE±ÙAr&–ÚÉú»è pöT2Þ-@¢‰ï¿Hhdø@`ï½¹L ”À†9£‰ 4;¼¸èÛhK빡ØÁXz3p2.vKMëG«e—й¹ïÒ­,§Ï—­¢¶še|Ô–½¸×,ëònÕ4®ÊõV3[7I]idV¬µ|<ÖyoÑ‘„º @M¤ ”‚ZWAžÈ[­¾vNР˜‰*f2ô|Åà¦É¥$¢UXSЬ²DY˜Q§¢\‘E®­©qõ/:å·,­}ÀËk‚.Ô€§ucÑÙÚ”¼dË“¹ƒ³…ÿblË… IēȜ-eÒÀ$¢V?àœ&Ù­Gs)+·q•¿^ ±Zn6·@B›qx$,šÏ‚EG¼PÅΪ³}±ªÛû²,Œ]ÙuÐEÓ7ðŒý[•^®í•v8Üë+3³m«^œ ŸQì×r¦G ¤Ožg«òPwq¦~Ö‹-kÿœÑ¼+-ùC…‡&{†.è‹ÑEà¬JC9”¼˜„ôùÎ庤/5Ÿ.±·y;… ‡®=Û¯]v_9UÚ{°­v›°VèäD¹jÔ‘6³Sh;×MʵíZórË2ÁñÏ­V«?Ñ3ψ<ê>n&³Y…Hkµqfu<Ùa…u=<)éí>ˆX\\ÓêøMa½\svkÙ])ì@OO½Y` }©½Crh¶‚¼KH&³NåZ]aÇŠ`à*ºV‹0fmN #ñOEç˹Aø’ƒùãþv9³CüxÓ-m¸b£wó°“íývŒ¹Hv kG1‰ö 4M”lQwlìÈ#®5;Nº\ØZ?RÝh %‡‚e‰ð|‰»MŠ¡‘÷,¾Ý¥®nï0u7ç9ûLýêMù~õ&wãé­ 2ÍEP™|¸®¶ä wKvÚ¶6‚’D‚šOìçþU[Á 3þÑE 1~£V_âû.«»aÃ`n('W³ÝÓnÜŒû—‡Þ,åŒ[¦-kÏtdâdïPdzm·LÖ¬/^Y +S´Ý®Ô˜É”lÁ«;s‘«0¨È5?uâ¡é€f ré6Rê!Pt¨Ðhä=¾ ³´=Ÿ(ÃÂ<c—cñC6hܶaìÀ\®5ÔŒº{=Ä€ÖÙ]°l"¢Ö€…éŵ,(‡²-Ì ÂQ·S‘ÇŸ.5}Ÿ.'uM5ò8\‘/tvx(û¸=ÅC÷¨?6Øê}š˜gàrY¿ÚÕL$í*pÈx’äi­~€çz8kYçýÑú‡Ö¹ÿÀ D™D:mŸJ£:žá²s;Èè–ÖÁ`Ï×Lï‰oR½%ìÐ1É›™ß9Ò=îVj 1K7´ùf“`ÜpæhŒî1ä¾ÕÅvg‘½*ÅfÏYÆÕ==Í g'~¾_uu„3Lܺj‰7¤«ºTâSTŸÒ¼UDMuÓwÎÆÕ5ðf›¥´ö¥ÞÂ4¢Ëtöœ ¨†ãeÕ. bób¥m½nvX*4²_•Ūç¬÷âŒi]åìh§ÄTk `¼-Å&>ë·oZl?œ©Ñ*m“£s¬óM3ÛflßIësö)ôn|ÐÞjB;jÞÝ}.zØo],õJGÊ&ËÙ &NUKMë‡Ë ¡˜!°†UÔpö8Ä]/»h…€~y¸é|­x8ô† Ûò·Ü®âðZ1îù‘Ûçcôġ̛¹‰Ë=7Bbi›¸áØÄÒvb©_à;ü¡®\¿ÒÞÆ[GÚ+Fö6ÚK{Ã:ÄåœÜ2›'aO!7(Óq©Æúác9Ìp.º¤iFï&Ü &Ùä³yüÞ†)¢Xkk€+Ÿ ¾nø6,pD$ïe0K#BNdwÌöa8v©JuÁ9LÂf ¥2”Ùpn1l׆]ý²YC¥ûÛÛ°p¡¯EyóÕ†·÷ÙÆçMÛ2Äz½s)Ùö²Ý(ýü¿&çý§Ôÿo,ÀrÞJßÿ‰øOÎûOéû?±@ÿGþþS.WLù?Fáß•[DM5uMaRË¡}¿#t÷ÿž-äòEÇÿ{é$ŸÍç ©ÿ÷8À§¶Ç½×÷»_vµR¡äJVAÄ&\¿w¢*Ûí;Æb¤§¼¥ÎU1Çï\KR¨}Çõ"즒³¥ –`å#UP‡@.ß],×=ÓÕDpšg ìT¡NåËbUÐ?Tþ…f«}³«n‚kAÄü’Vd5œÔ󜭃Îc~@˜uÖëŽc7÷î3æÞ½0-ew: ÕQiuñéÅ…ÈQc¹šºÜ0«š¾¸uNÐ r5ï¡ >)P®ê´Òd)¦¶¨@Ü>‹ZbÓÆ¿p-Ý¥S*5ùYÞ©Æo'Ýuæ;! ÔâVv*×#é˜ä·òÙ\Ö“Ž]c©ë{~J2 ­¼Ó0Ý;[U­Žæ8ÁÄ£Lûè!{‡ho¥¡œ$’ÜUÚ<{ñÒ&Y¾p7¹ky}}ùÂæÝ¿È,ÄRÐnù>J­® ­n/©æšϯ¬Ÿ> é—O•Ε6ïFcàjióÂÊÆY½¸N–ÉÚòúféô¥sËëdíÒúÚÅ•)ÂÚ̈-vãÑÒ¡È@hè©»¡¢AQ §6ÎÃË„\¯É’ÌLš<vKP¯²}UN»›U`}ƒÜ!¨ê®L>BTf²SWKQž5ë(kçh +^ÇšLu· AÝÕ‚.…ª¨vÔ5´I“ŠU·‚N‘PüQ¯j)D…€ü—˜÷?Ó÷ãþ“óþgúþc,ÀrÞÿLßÿ‹øOÎûŸ…ÿq€ÿbrÞÿLñ ðäï¦ûñBÿÉÙÿMíÿ±@ÿÉÙÿM÷ÿbþ“³ÿ;—â?àÿÈ÷SûO¼Àrì©ý'à?9ö¿Ôþ ðŸû_ªÿÇü'Çþ—êÿ±€ÿRrì)þcþ“cÿKí?±@ÿɱÿ¥öŸX €ÿäØÿRûO,Àbì©ý'à?9ö¿Ôþ ðŸû_jÿ‰øOŽý/µÿÄü'Çþ—êÿ±@ÿGiÿ+²Åâ\1Çð_Lå¿X „÷:W¥Q“¿üy]ïûŸÙ¹¬sÿs?L•Ë¥÷?ã€÷?Üw¾ü‰IzÝülOOÁkŸvIÁ;Ÿvx§ Ÿž €˜´ŸÛ«>|õ…¶¹Ý9þ¾qÔdmª:~ÛxÛû›<…"ïôH¢Cóº&¡º®v¯g·k-ý^$˜¡b̬ è±î°… ³/ó`À›°6E åla6Ï®Áæ§¥ mGç#»;:ÂO/¼¦^#]x=êu+…á€_þ£G¹ÿËä¿Ù\žÉÿ…Ôþ „ðï®c0¼¦oo›0ÓUM‘¶ç«|I›¢õ~†¢»ü?“Ïr~üç¹þ—Êÿ£‡c7¯mL.KÚÌOe3ÇŽ±w[a½'’f’=¾Ü’üTžœ8?6häò$_X,ÀŸ"¹´yšä³ÙÙ È¹Š¹N°qœ (-@ئl*t‘Ü?ׄ]j@ 6UÂô§ðå XQNi×IaÿÌ-,@q ¹¢J§µ{¥*c€$†éq‰_Ó5EÛÍLŸÑÌ3²hbå°bÁ‰V2v 2™iƒšú9Á”Õifj‚~53½¢ŠÖz']°¸åg‹ÖÆX ÄfAºÜ¸ÈK°£H2ÍЗ˜ÇÍ=A!õ†ó;“ñ‘!DjÔ 4™^^q¾rð%ˆ v8!ye]lÔ* ½æÏ@°$ƒjeȆ˜…@öÜܳ‚º…P€SV$7É™>-R ÁËA3V|ÍÜN¯„›‘ƒâV‚ÍÈA3V|ÍÈA3Jþò Û¥6åAcJ¡ò ¯%_y¹Ld2}·¯’9¨eTÕIÅòÒŽâdœÞ ¾Œ3Ð[!ܺ¨VV;•nNè»àkë 4Kð¢`!|š@}M˜…&ÐpfaÀi° ³P)õU t8-û˃fÊmʃÆÈ¡ò Ÿ²¯¼"Ô ‰º&˜N´XõRš¦ùê,B9Z¸Î"4E ÖY„þjþ:¡š¯†9h…f€æRuB WÃshE#\ç4¥¬súÐðÕ9uøËƒ:°3ЄŽôÓ Q06AÝSñi/jq9L2°~€ò‚ÉšP,ÿVdUªhªÉ>¸sb>]ñ)ÊNÞ„²™M„L¯–Î€Ò !0‘V“Ôµ:ûÛ"r…*uò´P8Å p¦¶à,Æf6 Ć®Ã¤ÊÚó0ÆÉ*Å&fZ,áô¦\£ÆäºÜC<}óÄ•LÔ‘§@PèÕ!ïYªìÁ„* c&/î(ò‡´Kжuû£;rTQ| ¥CxÇÊíø¶U{#; *TÐM­M-²#s”dìånÝz«{õ>„3#Äž|,CÙÌ´¨iº4‰è›¬5Y9 >ü±VÀ?BC1{¤b%1R —éPñ<1DA¡œ¢±™Ó%uoƒVFj¹©,/šºÍÒSŒ!ñç½&"ñï‘`&¹XB–Ë?\§5 TM‘%àË[Ð}¨B‚9‚x’Nce)H –ZCa\Ø1«fšyxW`Öz4~íXò8ü¸æÄâÛw|Éà¯Zf¦­ŸyjBߎNŠ‚t…` Œ‹óŒ&Fy>yz7ÀIžµxŒÃQðÿì]|TEG9…¬A. ŠÉCZ"°ûz$´é1 RBÄMvS -$ˆ€ **H/&"UP!€¡‡"E¥Š‚ˆr4)Š‚RõfæÕÝ$›ÍnvÍïÜ÷ƒìNÙ™yóÍÿ+3ï}ŸX Û‚xÄ1‹2¿h^‚‚´\A'ÿÍ¡2…cåe’_T`ÉÎE7î (h€û–>‹¬ÙÏ™±Ñð/hˆ¨fGøªtI¢ˆ&à º 0ˆIT‚‹w¦fˆ¨Ît¨”ž“o5Cœ;’Óœ““]`5ƒ%p –ÑÚ‰³iSEÚ’\#˜³"™nb ¬_‘±è‚Š°Ñ˜Íb̳B»_½ˆ\-[ü‡š Ñ’V‘YnÀq y&dh‚ÑW-N•LÈGÄ_äG›-¼VóH]P ˜u”%1i‡ÇGXGÌd! \z90Œø‰ ‡†§ÂoÀÕóàŸ˜ µ V›à•DªN3 †a£Q3RâÀÆrEâWynFo·8fé‚ÛR*˜Õž†)=ææ› Í¨ 2æäMh)k¸dO*#•ÙÜX‰¸þé\¤e›ŽeôÊÏ“îIT2‘ ‚èQÈ$U´¢Õ—;Ú^Pàp¯ ºÒf) ÊE96‡L±‰L oSíRÁ¢R—U`üËŠ˜’¬~I)J‚f½˜‹i62GÔðkn¶ ž„€Àö€}fÉ/”ˆMˆ½É¹"ƒad™k2Új·˜±STÎàaPþssÌÒÁKBRGdóXPÔ ,ß–e†A)€>“mµA¡kÑä_‚B3’Zc±1p+ )àJ±A£bâú°Û_N»ÈÈvè ]tt;ÌjÌ0Ã˜Æ IXó(ÀÁ 0öQÙéPMÊ1æeÚürPÚ7æP0v ¡tAªIæ‹2ºðÈÈ ‘ò°ðñS˜SµèèJª!*‹I&nuC%¤ïŽ{@,ü§îÁ ý-Eýè„%ä[ã´%†´gÌOØ}2KO,TÖ¢tb“*·ù›¢$ ´R 9t¾ UÓã8(ÒüUq¦#`¦5Yä%§kÔ ˜LJ–˜jë‰z˜CÓú«¿‚nÕ2éŽàøÁÊ—äA³()É”¤”$®M¨Äå0j®+QÙ­p:xŒ ¹ñpùQiÏYÙrÖgEèR=Cbè§—¾0zHe=Áb<j–ZUMRz°Ð7RÏóÎyN?Cm:VNÕ!-šËŠ"áèNêR0C"têš‚<…¦‹ä 45©4†î@QL"C²LÌë&ÈŠŒÄ Iö4ÌØ0 ±§ø'¼µÉl0Tù]y>KŸeË͉À¢£a+ÊOûdçкõë'3.O×¢¼ä‘(Eò¤v ¤JyTÙ­5WÙò®™î\¬;BÀ]¬¼šXo¤ž¥=X=Ö1—QEãF¦/˜B–åÀäq þÒ”€)º:…š¤ \†AIòIøÉQèˆ]Tîb®Ä> “Ó½! >xe¼Ø¥L6TJTºJ|Ö¾t«U’‚r4`”´P ¯ P,X'šÎ2|%Õ%*» (Ç¡Ôlw.‰+T³é¶$ã“Ùc¬žsÆ‚—\WÆMÅTs7ˆ¹¨¸Ý0Éb6#Ð>ÇØ‡²®9Ôu-–zƒÛw7´FR„T3ŒÚœÀz.þHƒ‰Ò>Dh1ùQöI÷ Í ꀔ4;0%()XSMy ÷¼ïÊÅz¤H ·¨r"Ìe5äVòHÀ)@¥k¨Aй(3è`’ß} TxtJàÊ”:Ò„ÂyLༀ©G­» Òšâ—Ò²”—,Áaë4 'ŸÄh°X 1d"ÐhÆ@mÜÈkH?pSÆ‘ÛQÜŒÄ[nZíöÝ%£á¦p:ÁH€>o¸)c0ñÚG|àé°aiöŒ ³Ùªt3Ò´Á{Ryt‡2ç5½b«ÞwåbaÒ4][E“*Îi5Ø+bªŒžäåBÙTUÿPzB©ç9VðÏÔþyÈâa ²ø%ëStÃ.å’W‰) <Ï¡íIãîâšõ©uAhNžX&UÇH5EhSžØ^vä±EÁcœ9ñ]c’áùŽŠIä>4(žÖ° ¬$`’R@OápЀ"¡0¤n ®Œø)¨…k4Õ$2‰*Ä+C­|kÒr¬Ã‰!Jª'¨rç)¥f»óÐúáÖásй‘¡êõ>“³JˆVMœ©‡!pŸžG~iDó>FŒF’BzÐ{µ`:½‘DÕo¼J´Hoéä×½tJ‰øòF²ú3³Hïðˆ¯~@§ J¶ä„€-éÔ߯öÓýÕŽQþ&—gþrMÕñÍäÚÿt¤úÿ%i¶N’Ãüÿøã2¦¥³f2Íh2ý;!ÓÒ3ÒÍ4—nä:#'þêñ.ß^žá¿À”Q>ªÀ?KSt9ÿ_0þKÿ¾¿Ú$ÄÄu$ô”®ÍîKÓ–è ÇòÓ†ë"# }Ä÷dJ%â²s ×C\+1@·0™££¡‚`6æêŠÞ*Ô;¿y|ð¿~Zsléo˜ý»i#&,‰Ð¢Ñí§Š]rã¾Ayé+ž¼ýÓgÓÞ:þÊÖ««—}<}ç‚SS„;{¦½u÷Û÷ä5ùcßO¼ósôÆBCƒiNÍ kV:¤4jìæEC–fÝY¾y×ùÅL¾1æÏ_W}7àÍå¥Ñ=î&s|Öø­ËÇÏÇ ú6ßg*IÉí3flÖ¸ï#íyÖ ×,8~§çvÃɯr[lY+ØNðSºžy/úNìë‡"ï¾sbø†Íkzp‚Z%<¿l[ô¡ŸVŸ8›º?¢mŸ»#ïŽøõˆý×Õ‡öΡÎDvÚrlZã_ kð]ÊÓ‚ë—öºpiwüïkôÝ= öÚyipTa˯ÓãÂÚîNî(ø[N_RÜdæå÷vhŸ1o® âtALÐ[܆¶>ÃÈõZgPÇÇçÏí^œ4ñ~¡Sï-‰ù/_]rû#s»ïÎ’ߨAñÖ›´ßôãÁuŸµºŸøê㫂ا÷–™O.Ò¶Ýtýû}„ÁiÛìãZmÆòhØ96è`aâO{/Dßw}iòïæÎš‡-Ëy±]Âô¢ÊŽ_kÒ(3dÅÔºMŸÚÿi‹u½ƒÐaO.üíà:Í4ºÿRiðö_=2ýᇖGÄÏ~s™)“Ê˸õÖ¤_ÛOž´rìÛ6{Bã Ûõ176ïm\ïé)sz*åQÃÂG %1¡A×Î ì~¶Îøéë'ÄGÕm9¦ÉÁ‡Ô)ù}ãÌM¯¼7$$éöä×–.šoiy%jÆ*}ä…u—Ûäþ0içÑ®:=e=jiÜh|ÒˆFOEýKtó§¬G2cf¸Ú9¿5þÛºWnÍ8ùñÉßívšˆì¾+ºiÈØ×ú|PöökƒÍ}¬mdû”ägç&·}7ÆÖ2ñÈîµçuŸ]ºÓæóæöÐN§.DMéýÎcÝâ¢,Û^^0{Ëß‚BÃBøk!+?ÀOuZ¿+zí±ÜŸw·šj{õv³ÒV_§¼zcïÝ›—IþóÓS®9sæÝø›_žþ9áð©>¡‰Ÿ,žÜò‘ QëØ_ÞQ¼3vLÙôÚÇ÷]Ü“Y¶±Ý¦?¯÷žµø«í ç̹UøÈ¦_(é³wu2ìºÎ¹‚‡'%ÏÄŽm¸ïKÑ›¶Ñ ‹¶‡$Ûÿœ¨øDæÎ1;ûM6ø0(ëEÑò¥£ñƒ&÷ÜÚoÏÈÅ“Gv;»cÖðÓ½×¶8IL™½âXæÙËO”~ò#>豕G³‡3o4œG~TO¿-«õ×Ãg>ÅìîþE\³àY=ßáê-L{ãÈ®Ðkºœ7:ö‹ÙôÍaÝüc–îzåçд7–ôZ7ø£í+™v¸ÃkTÌ®£ã,ÝΜí¾ÙÚýë.ëΖmüþúÍQ} —6ïrãÊ…ÎsÇ¿üú÷³ŠòBF.tߤÒÏF û|RqÔ¥fÜú¡“ë]¸¯É ¿¬¾v6kàv`ÔH|ƒ\••¸+Œo&çÑ*ÇM]`6@“ÈÐ×lÊ6vÏ/Â× é ÷T!½žŽá rÉBAæ ²%g VÐH‚%?=ÉlK1ÆŽ’ÍE6ð»Ø"[|ú)Áˆ?‰ƒŽaÄÜu€“ºåååÛ¬)Ê@ö‚Bü ű381ÕÐ4½3bŒÜ†tC”rCº# Ý’3ôÎ6Y±tɺT zÇ‚cÐü”pœ PÅh3æägÊMPN]qNs§Ü¦ÎÐ?¡/FDGK§ŠènuÒÃO£gñåbL—ü`„ärÄÐ ün@bÏªßÆÖ’`E8¡ÒÃèYehb+EZsâ{5œËa¸z+®Ê1®ÆŸÞãà¦/UÕÜz—¤ÊÁ.#íqÂÝiÁå`ªxd·ÊaP®†O&Àœ \ω«Çתƒ3'pGˆ§#â&®i…ÏèTÙ½FõKä´5Èd5¥¼Žw,åÕÂîF«òÕ=†x30Oífêï5‹°/“=Ýl MJÀâ³ò­6Ñ>Æë ÜrO›Ÿ½»‡Çt‚îÝqšd šâ)”÷Í7UV$y¶ wvl;Ô¥gÛ¡à§¢üð¡¢wÛ¡¢{Ûè×ЖcPf±Èb΀Î08²¹c,@ƒe`RÁ‚Å$–äÉy$+PÎy|×Á9Æç<Ë”«GñåêY®É’ÔcÙryN–û-NÑåò€W.¾éœGÓåÛƒ‡åòMžMÚ8DO§A]Ðlb> '’Tб`F>&Š+CÏ,%üùâ…Ï´iظ‹ÿ˜¸¬N“S…åsRuÈ’1Zlˆx$/0£-H'û¿öÄÄÿõËåDÿÚÿ9àÿß/—ýkMüç@ü_ÿ\Nô¯=ñŸñýr9Òßh¬%ô'È@ü_¿\Nø¯=ñ¿ô÷Ëå„ÿ´ZB‚ ÄöËå„ÿÚÿ=@¿\NøO¯%ô'È@üo¿\Nøçj ýñßýt9áßôWǤi&€?^å诉cœc6¬ÐhKÏ2¡s¬aÃLæ"@BWþüÁBš;П¤¨ÀóŸþ¹jWüG4O<~ „ „ „ „ „ „ „ „ „ „ „ „ „ „ „ „ „ü? ÿ¨l¹ýnYfõ7 þ¨õxBP$¦†)JMi¾{øÑ»n\}$_]Š_Z´Ï,o3WËC­ê ÜÁ‡«Ýøáå‰×D„G‚ÎTHžñÊÙûÒ?—N;º`Ë{_&Ïø°þ¿[QÏß6gïÔ—ÎcïÎ^woʵ;dLÙ©3‡nï`l5XOPo îñ]XĹfÇßümu½ÂºïÏ_üû²WÃv=“½ïð™}/¼Y°áóC³ë—.™øÞ§Ž^=^¶sqÈÜÒ‡ÿ˜÷ÄÞk“z~×´Ó^ÿăZ_ùñöìë¯í1ž'7ÝúN½9{„pçNl¾²ƒ\r;²4d Õ¼ÿ]F¬²gÑ_m+œzñ›óãÐ:þž îûòf×Ó½#–\MÞV·lÍå.•ú˜¡x¼.fÄm´šñ0Ch=Ì®<Ìü_y‘hh£} ×¾JªØññ· ÁÁ=Nd”.Gá¶[28Ñøö¨¥ŽC8†«ÌqˆXäOÇ!ÿcïzÀ¤(®¼'&gÖ3Á‹FÅ´ˆÆ%²Û]]]Ýæ".Vàî* Cpv§wwdwv³3Ë ëª\üï4¾Ä¨øï0å¢`ÔO£P<£A#èyj”$&ÈaŒÿ5DE¯^õtwM÷ÌìL÷L3v}!cu÷Vu׫÷ê½WïWO.rpˆ¨"ï!!HòÂ!⽆5ïµ<‡ˆ˜x¯©ªäéWR<‡zˆšä9ÔCÔ±÷0Q÷ü­ÇäÛ×¼}È£ôñîßVm\¹«³üæ·ï[¸ï›;ë½W\}HÔÜØûí»ÑŠ ÿ¡Õ þC‰âÿÃ(.úë{ÿ!ÃùÏýC+úÛ¼‡»°%© ý‡DðùäП®ÀR„ÿ¥Ôþ© ]êå@"H‰ $€D@"H‰ $€D²@PiDmq]û´ @D>+æ³¹b.b^,-P¿PXqNŠ¢?¼ú¥á="5d–#‰òŽûûN4&DÞ?b˜·Ì'¹G¢Êe©†šNx|ŽSó踫b¡Þ².h²g ”Ý]( U†ìçÙ/ ßBÿ@£cD%š‰šì l‰v ê,Û»&±QÕª‹Ï RSÑ9¦uxSE ’:¸ì–}!3$M…‚¡©(vò1Œ º¤&S¡òª”rB9 '”r’‚â©wUŒWQ^<•9 e2œÿã0…V[¨˜Ëû­¨;ä1¯.Ô:W8öròrÓ; ¸å¶\*ãbžqE°‘¬‚Taº¶vðÉÄ’½F6õ,ä° ‘}ÙçX,%kÐ *ÐI”"ªvTŒuE-¢ÊRsD}ªìKrƒœË¿9×* ¥ÂÁ—l[HWa¤Ã’0ãq:´ö’mV퉿YΧƒ&åÕ³é’K*ç—Ûr¯ú”–RãÊÁ{¹Kñø1ÿ%1ü\‹âÂ( •RFJ´“ÜžèuÒ¡‰ŠÚÑŽ4%‘0´ö=ý~Q©n)•ÿËÁ{¹Ë(ü/«HöÄÿ‰jÄÿa”Êà¿V¯œ9s“8öÑ7þ~°N.yö'žøÓÄK…sž»[=hÅýw¾úú÷?|ouóü…ëÖõMÿ]ýɣϟrëÜ}ÏßýÂ’—Û_ß~vcKÛë§ï»}º0ã‹S&Ð2fÚ¡í­sÙ½‰ž¸ã[ßÿ—i“;ƒÎß½uÉÛëoL,sà¸Oûò̓ëwnyë¶žu Ç-§åÌí½çolÛ§û¥Ì‰xìá_<òú/ñfÓyé›^h}åGKXþê˜ßßúäòÿºóÈm«–ôÓÌK?}Õ¶gþðÓåëÞÑ/:ú-qÙèk/wžüÛ·ÖGmLHjþϱc`‹}S,=Øže“‰ÃM0ôˆõ>M}½ýñŽLsÆèM.ƒ‡“ô¿„º ÎbWO³’éÌH,Ýïéa}Åhwóè‡ÃA f¯0KÌoÿÑ dŸ£Ÿ”ÓwÁy}þ[§¦Øúµ£ šEqdM‘јÕ×å¸(Ď凱Pã}ôø#ʾô#Âq~;£,y¼ÐA¿9SêÑ& §¾Ù _RW¹çd?–QºŸ +vhS<å›êu<݇§ˆiJS 3X^¬ªŒÎ~1t—R ÌµÉ !0M˜gd–= šcÝFçp/}½LßäzoˆÝ:‰-à fT*”.£!edF˜õ)*æ6*Ùþ½/sº]7y¡áuE…`½É !V{މÄþ8±ÎI$a‰i„#É’)6¢ÝtÃ#!™†àh±vŽáèì9^ O óšÛfÌ9­M˜2ûLaÞ”––)³ÛÎ<>I‡‰Þ5–f;ÉÞþž$mvÎ=MѹÐ×)|{ZKÓ úü”“›g5· ²wzsÛìi­­Âô9-Âaî”–¶æ¦ÓfMiæžÖ2wNë´¡ÍÅìTëåã†Ð“¤R2Mû€SÆ„¸prëTó7ëVƒÐjìušúú—ÂÜd e¥t‚½5»M'rŠ® s›!(F˜ÖôÃ{²íAT*÷¦`u1`ÒÖtú{)è§…x"ÞcÚ9Ð×kŽFoÒ\d²ÁwÅS‹ÓpþP[w_/ý£™ñTª+iЩá™`öDÃbû‰“:;’ }½æÌ*|¦Ôܤ1@G«5žêêŒ$<­÷§­['é¾I££Ûi»ÐMÚréúŸËþ¯óߣøŸPŠ‹þ{òü÷\úGñ?¡—ý_;ñ¿ýC).ú×Lü¯Å…RréßQ;ñÑþ_(ÅEÿÚÙÿöB).ú×Îþo¤ÿ‡R\ôßãû‘þnqÑOêÿæù*Šø?Äâ¡¿ãsîèKeúz-ê3‚eÞÿ•ˆ""Žþäé4ˆöC(µ•ÿ ’;éJ”þ+Jÿ¥ÿŠÒEé¿¢ô_Qú¯(ýW”þ+Jÿ¥ÿŠÒEé¿¢ô_Qú¯(ýW”þk/Nÿe»€JËþÞ*¬>%Ù¿èÈÙ™x$D f¥‰€ì/Nûoù¿‚uS4"žÄ–Ÿ¹Ï(1˜sÉ•i‚OK!y’QT ‘1“éj $EzcB :ÚCÌuBròéŸ?ˆÖ¸üA$hª¢À]Ëw¢æMUÄÏ«òò˜Y{6;™"ÏNý"ÑA¡I °ÈH€¥ª&4aÝc^rÈ\º8oá?§‰ŸÆ}e"#p"6Òq „FJcB“8‡èv‡ÓCerÂåÒ.Ï­py† ˜Ð(`GE\ΓЈ ivD}&4ò0ó¨œ_ùÊ`º#Éas¶BK ýÑ$µêl.i<'"Äs"ÂÙ¼ÜÆ£ìE¾‹¿ýÿò²ßÿsóÿÈÊ>"B*£ýÿ0JBÁzG;QåN’ÐD]Ó:°ˆ;㪞èˆwÊXÛÓï•êü_^6 Qø_Æ ÊÿBæù/ÿW¿T(ÿOÛoÎ~XûÀ_¾þ~÷¸×NYÝÿž\ð²//¨ÿÆUl˜}õšüþŸ¯ýuýç’óÿí©Î!åÉÍksjóØw×<ø×ç~fãÛÚ¿ôþÌcãO¬Úç˜ýfŸõÍ®ŽýÌë>øþå×í|çî{μmüSWÌ~jå=÷\òègí¨ß"l›{á>Oyú®{Û”üóm»6ìÞ0sáÚû&-ûÎýW%ëïzä‚ù¿:§~ÚºƸÖq¤å·äÆMM‡46ò¯CÿuÆwwo{àÎ[.þöU¿˜Ò¸7ß{OäWŽ¿ëö÷ž?nëƒ/®YyÃ_ǽ6ñ¨„¸ê–¿ÛŒwÏ:÷²Ëe²röÿ\qøøä»_ÞpÆêÿ7ásOßUÿác7¿êÖ©û·4O¸pŶó…\|ÓÜ»›n|à‚ëþ(ýÃÕ¯l¼¡ó+]:ñìkø£_üò¢©éCWÌšÚrð˯^|||/ÿÕÝkŸÜ1gþ¡»WLŒÝ»kýG—(»®ùìõkõ¿»uÙA½Â'ßúÛô[ÎûüCÝ|ÍÛgÞ°ÓUç2ýšÇžýdþíÏœõŸ3ç½ôƒîLãMË>þ³[öçkn»«ïÝ¿~vÛÙG-þÚk‡ß}ç.¡p²I,#Ùéd«L²‰OöƒŠ%ûÙ«²ü3ɸ:Š'Ù)Ñ90çUÃ%ÙeÅSí”jÆ–“ù'Oª>Om¦ÚQ%¹PªóV˜©v䢩v”<)jɓކèÞt9ùRèäKµƒuï5Môô!Iš'ýލaäMµ£yú•¤<©{$…»æM«#’VgÕ;ÒÖqŸ?àÒIƒÉï]zóözïwZ¬È{…W¨¸ô¿ÚÁF翇Rr韨üg„ÿ ¥¸è_;øÏÿJqÑOâ?Íóá¹ÿZñÐßÑõ»©A6ïgZ¾/Ü—U€Àý?«äÒAËÈÿF©-ü—JdAÅ(€E°À"X‹`,€E°À"X‹`,€íÅ0ÇTLEš Šê§¦èÂCÒXÕŠ¦U"9U¾â ´«¢P0"bOLÖç\&^''`Ÿ=At’÷FùQû< |T#‘((2QÛóùÚ»C‚…X_’%F«f)Ȫ²]eË…£úGŸµ•é®Èt’¡ á™På KN{á•eC gCG[QuÁ)2ƒ-ÁÐYðU”eæ3VdÄÊð[Mxx£!$)ûŠ&5mÀ{TZµöKÅ‚)¿™Š)X_ù”|Tß UÒáq»õÙ!cŸƒl¥õuÙ*{A{V¦»"s“`Ú„ì…|²a-—×=p0ÑNØæp%0‡+l1µ×]ªýGßÅ^Íæ`‰A² Á0R6´' #d¨p´"ý%DÀ´kBÿY÷A*A¬ D§ÿ-¢œûÐQéúN…+!ôÕ§•4Õ” lJ(6Rœ`%wÂЪJê³ýR%ˆÊI6ÜX5‡•¾XÐx'Ÿ,“ì5èO÷€O„'I¬ï±†> ÛšŸõ•Öº“RTÐB’¤2Ý™£X£ì¢xQsxÍÑ-C 8²Ä¾ÄH³B…»V¥B­€RA$ÙQ*)°G°(`DЫÊò¬: –‚¤txÐ|€å}¶_*ËK9ÇD(Š€è!…þÓð<ÕâÇó‰¾Þx2³[bÍ EcU Ö UÍ1áa-³W¦»b8rº~!ÕËìæ¸ú²8ΗÜl^>#K•6$$`.ìš S=@³ª WXb¯­&™œƒ(“!] ‚÷×~é'A”È3ô-©HÌï»)ÄOЍ X±©£³š}YVUª˜S-ÊO¹¯RÙîŠL’bL­P}‡×úúT7äAÎa²|ÿÇŸ³PŽŸ¦R§+0o_}‰Ž . úQtEß…ÅD˜ÐÇE™-U®©@‚¥Ò¾¯Ñ{*ýG§%¦Š4ð#&Õ]MJ ¬Ú«£-§'±7²šúl¿T&ÄUeBÚªŒež+ Êq„8YUxØ©úaŠt€ !lÌfÂî¼&r¥ma›ó²\VÄ9¬ˆè’F-4Æ’nV¤ö+ÌCŒà8 ±" §ÃŠˆ…Â+BˆLcˆÀ«6+BœžE °"9RfGo˜ÏöKeET)·†IJÅ!%%!‰‘”’D†ÛŽ[C‘hf%Ò…(¦ý,Êœ[‚j5RÖ-.ærr¦Ø-]²¿ÔÎC¤ºn Ö‡}r˜•œÛ‹yPaQRµöË&uPs2/דkQ–k95V5FbLÅ"¡¦',ŽD®¶¹©²©Á›ƒ˜s$€Ÿ«°êUµöK67KÞbô³B‚k 9óL5VµÜ·PuD {¸ˆ}…¬Lw>WHBUT$;‡R¶Ægd•TÒ º-Á ši²•ËYδ¢ë¬ƒ U7AðƒÄ绥 4Ã6å:Yv„,MˆÅ'€;ÜRÊ¢ˆª¯ x‘™“Ìpç¾ÎœÐ)À/Œ”êÚ— >Ǩ—tÎô U%ˆ}é³ý’}ÕZOMW¨³ù0¸ñtÓߌ`WE©.)¹sc½Ûȱ·mÍ»()üµ_ºÏ®R#¢¯¾(Ëël¢kÀ†,b,gmØ[2ªÌ6blËP5ZЏû´)À¾@€eA:(q·¥cª¯ð‹Ù©"˜-žÖ}Ø g–&œŠ’ÅÉúPå\‹Ðf›à§ÏöËŸ AM²’› 0t€Œ(ÍàôK]忏³è=ú ›ôàž„¹áܧ"–@Uwæ gò€xÜ´ [|0dN¹’)—Ð^ÌÓ\¨®ˆ6ûÐrMœc’Ñ>Û/.^¯=“AÌ …1¯)ÆEDcGÁ/ Ùd$ŽØ ([“A`€ãSæ4e&0²}˜BdøªÁAtSpˆÄôÛìÉBåVd†¨Ãà:†Íî¾"ÉìïlÚà°É:§o`‰¡­DœÀ=Æ Š˜£/0}1á 0†£¯¬¡1=‚‰ Ѫ.b°Às{Áª˜»Þµí5ûk¿äÉZU‡5xª¸æ¬ãçcUg †=\âP~K 2Ýù´@fð›CéL¢'Ùžõ”ñn0÷ÑÁ>ö{ XõVQ £!V©Á~aIP«{0ëC³Cï]œó ‚œì³ý’9¨ªÞf©œq+ëˆ7nYÕ‘ìá@¶teºóÍAbŽ-mBw\ÄB\çnâ À [v›Ùâ 6¡Mî5ˆÏ?’ÁÁú9(]0ˆÕ=Wßì;U'âîÊ…ãõªÖ~ÉƇTÊpp¿ú‡FÿIþƒ#Hc¢“¸&¬`h„4jˆ~AžÏ~¢å¥¡j;T-[LÑ®Êl¯¢°:\øU*Û_žUO³uñœÃù}ÅMUh] ê^±¢Mì|Y3K±4kÌÙ‘ TÓm\„Ì&:;øBÖ«,XײÔ<¶ÿüz@˜RÁ_û%o7à`…Äâº12-ßR5&”NN*KŒTfÑ¢ž¾®‘ Ùµ÷F0«ZÌ U¤8c,ñU?²¡"Ýù• ’ÆN”qË“&”$eE\!º^4hù´†Jª¨"ê„–«Nè¦RÎü<ºIÇ$'ìp ¸gôÀÑ@ð[]€†ÄNï±s-Y³@4a"‡¿öK„¯Öéä§‚VõC  N IæGÚH¥ûjChXi9¼è#9AnP…O·}¡"_õ!4*ÓO¡u•öæU(LzøOçTQñðpd *#ÀiÏ™˜Êx'%kz(¹ÛlàæC „ªxˆ“!’æ„­@ˆ À?d:ˆ4S!…Žc²@4Ô± „¬‰ì·ªû¬Û_oN){³SÕI*â*ªZû%ËÃÁÆ\¦X &c$×iêYÃ`tö„ˆã°¾É?,òŠ8EäBïÉÁô:ƒ œ+PÀÄA¦©ðH&PgêÐk¢Ì®A’"&PdÎÏŠ)¹¨%Ce¥ Vi­ÊÒ„vÁé­ëÞ^~h-(ñÑxÉr¹Ü«Êÿ³wåáTmï_…L®1ê WΰÏhJÆdVêŽ1S†L (D„„dhR(%ež!MW ¡‘Jƒ©¨¾gí-ŽºÏ}2Ýß}žßÝÿ,ûØ{­½×»ßw­÷]ï糀燃PDì ¶5&¢©ú𪗅‡•õß\¯9í„àÓñh'òòtÑNºÓiWgÞÜ´ƒ«z¤ç¸1ù.‘)Ø’ v›¿àIš¥¸*4SdëqU­\° ó2F|CÓqUü;è&œNE Ì-þ&Ù¡Pèãž`Â:÷„à'šI\uZõÿ²Å€&ÅU E€³µ¦o/0hª5=Ï•§“ý¿ÃVŒ½àxŒ¤ÐN„8ñà­Ç#œº³iÅSgÚÔtáà£ÿÙB˜êÚì8Ø}š:K0ã”'š<¥ÀÓM)ˆcS ìä¤J8›&_ÀPÐÇN¢ i¯Ñ憀ZjŽ£Ô¼œMÌ7A‚¢S¯ü—ÍáGó[Ü ¬ƒÕ;ÎPíÿUÖaBci_Æ„ÂBt{Ѓëþf»û_´ 3hhÚ–[±þD„a?%Ë0á‰ÌŽe˜qÒKüèl@cÑ òÏ–a,ù¤b ÐxIŸ[k³D ÄKA¶4™Î! °4Ãö}…ukÎÍ™^±‰ôz=”Í”kþõ´¯YƒÃ)Mv ‡$Ûà!Pâáuúd4#Ž…éÕÿëK¨³g&áÁ ¢3a‡cÉ*C?¥ù„ l '1bþæ,s¨ ˜BŠŽ lAÈÂÙ’b‚LŒ3LHȰóMàæ–EnÿÜ`Æ‹‰Î­«ÈjzõO]V3§‚è÷Q"€‡À s„ƒ‘HL´–€¨.!0ò‘a‡p΋'Âú?Q{µ›û?ñ@ÿìaY)$¢¥•L XQm0––*„·$[Z[YÚü_?ßÇÜSÓWêt>ˆ¿×,ÍGôŸaðxè?GúOÿÿ‰cÅF5ÕXYˆmEÍëÈÓlåbéÀ¦ €^ì“K›â  ÐöŽÖn(´øVÔhsªµ’˜­X[8±y'UoÖq©á.ëËj–R>׹õÖ_Äñ?c Š¢ÿQªyXç¾_ËοM«yÜy˜AõÉy¯¢sùÅe¾¦ßvãIƒvïô¾•ï!>«Ù=:Ü Y¾[¡¹[o¡íál~÷bâèͧ‘ë!û 5­ýå­Ë¾~2.2•k‹û,”õäÄW¯×ÑÞÞÁýL\ä3Y0‹¬«êî ¹^ž¥”|­idpèQÝÖRûoß|‹8M×$74]%÷±nëÈÈã¯e)—.FÒHºÔžg»­µcÑ‰Ž®O>ý'~S}3в??ÛIpÙƒ[\+‹w¼Ø´Ê›€µí -q¯iþú9Á9<[¬“*çëQæm¸#Ô"É ãí—Wß]îz'÷Å:ü·×Õ‰K /xæ½¹†^‘¯ÿîì¹ƒÝææ|÷B˜äõe"^z*BZ£lÏã¥"µ§]ô¥Jk${^ò¯÷{ûP]ªurÃ0Á¢Ä…½m™ßþ÷!ºF^î§tÊDÅ õo ߸ðQ@9IEiå ~ËGä¾ L²'o¤‰+(š¶º¨]ëÖñuÞ;a­tiƈA&2q× ‘Œã"æ»—+¯O¢)š]&ŸYaU±u‰„†–«³¡T~öÂf©Üg*7Ž(.~ËH±GçêW›v×(ì[i²¬RóÚÑš‘¨ôÕnâþÕá÷SýÛ‚Ù +»X[Ç>(©Vl¾`wÃñ“™¼[PR§ªòö˜”mÐfs_üý\USEÑV]†•"ëƒÄÏŠß?Ø`qÄÞTgËþ<72Š%¯…9ÏÀ/s%‹Çê€ï÷qVÝö›“TÃÎàœ… VJšÂα[q©SnMC­“ æµçêÐ6ÚýX0BÊ“‡ƒ²+P¬Æ&¸_HuÑVǘÂò(ÎÐ2>åc¸òéjÁ*YÀ°‡û@g ϱè×Q‚÷Ö-Öl¿W¿\3¾¯†…;¼Þm×§àjsÇŠæZŽ‹}__g±\ÐôÚÑý±[Ím®Ç˵9 {Bç3’2o>ÜSÊmäÁWIB«äõ%™ådϯiSaÒ_Ì&~GaýÉ;‚|KµIÖ‰ÒâÒ[ÈO÷ì{;OÚØ™/|iÝ11,SÂu‘†ßë·Ä2J,¼-"z•ãQÓý9ui½7CµºÂ6ã¢@iVm’··E0¦±àÑ~¯¶¦¦É'÷²ÇŒÜ´¹]—œväjÍ«×UŒ‰ž:‹­ « Òj[²½dNJl|ž>Z¡@mðßT{Ù¦„;_ygí`§´úô¾¢º&ÝñT§‰¡èH˧‹w8|“„<ò1#w ‹E V1iî\%+»3œëÆ ŽbŸ]½OÎËÒÖ´ßþòeµG>|™>kÅ^ƒãOÅed^n”uõ¿±¤Öîà-㗥Ǔ#×Ù›p´¡ Óvóùñ(]dägÝÔTyáÑiÅÅ~ƯL$Ùò«µry¤(Ƽ=©vù©9µiEç ã4ºŠ:…U°M¬‡æ×]½d1pVñÒ)­ÛGWaÑG¨žÚßj¶CÖÊßÚ’ç…²ØpÿÙå¹>!†Ûs]׋Eš£—.í½Erƒsz¸ÕÊä»ÞHÝëÑA]‰JY{@|(±áQdkôòƒÔs¢ÒL±´æUêÌQ0X.`7àúöIž¸F¤™«Ì€šÒP®Ä®‡PAKe®ƒõ%eÛ5­}œö •rzÚÙ>†lz•SòmCÔùeé×5ÏÖmÐ|ÆŒ º}΂”©zïÏÎmlÙÍžº[_¾³ý’¾Tê’ô¸¨ÍEOø¾’;w±X97÷˧ғek ÝÊc «¤´&µÐŽÌæ– ÆÜÓMñz{.]¿u|iR´“kC•bïQÒr7¹Öê ¹¹ Ë\…—ŸZso Oƒ:Y/7“SâÈ娊Í/oKîX°'ýÖE¿CUWêr*Ò¾¶Úš–2ßhr8+´ µYµ¯"¯$xŽr\›ªu‡¬ÞÆo"a–³½¸òª_-_ Æ<‚z[½fžES–j¶\«‘¿s/_L C¢•ÎÝó¤«SU8ç5:™½¢ÙÒeü^1NÍóïȆW,fÜ£fûõyôÎó åÛ.=”¿lg²'må5qfIK{H%^Bûh›¯HfaŒðy5®8©°ßE.è6«äæ°þ¦A5‰«¬1Íš¥JèHš5Õ6ÛYWäë® (·U¶YÝ‚¦Âr£Ÿ+Š5ûcý¦Û÷Šç5wJÈDß|¼¹yØÃ×”ýBëÎ|¿aÌ«¾Æþãú‡»FŸÉ-µ‘[/—r¸8CvÝ哃lþÁ‡3‡¯r1çp“UúòÚWpw‰Ï;Qæ•¥çÄÅv7J¡Z^©hGÎùKíø"Ž7÷ĕڕË+&”dŽt™…m3{{Oôs-3óùRá:ßx¦?û Êã.ìÊО³ Í #زìáH·ß¤.WÊðRNùÖÕ5ªŸ¸^´<ß¿Ðòp`/!ì %lóï„5*´ÝÚ*„ªy·¤¨ß<$q%º^»èÁúί3¯¥Øò ’³®¯Ñ#¼ÙÊ›x ËÝ4 ×ÓÜ¢#ZP%?ÎPVÔ|»©ß'K”äwÜ”R:Ð}‡Y'×-f~Ð k.‚ñSmFɸ«ýýœxòWÜ|·\j× ÅÆF ‡ ª‹J®–~S×/¯sºFf³óI½§«|×¼ˆ/Rþ¤Ë¾5’2u1¸ « ³bD#éìHð‡Á=Åe.¥ÚL…*<ÙV‰O¿YÆùm!©?ÁÚ™:æÐþ~qÌŸ€0dÜ÷ßð>†‘«5D$ѺÖT{ o”9@ÀžÛÒV6´‹Íã@ahW¹Y;{  àŽÐ~¶vwñt³²v§U²ÑÍÅÊÐÚÃMsePh#koÚ}êÞš†ð­8r‹† ívr?ÍwA¯uv¦9¸æø,)°HÜ‚E.Æâ‘‚€D¤ !)ZpH-8¸–­hUZ‹´gvG¾7:ÖÐx à.@Á}àŽBëØSÝQælHƒ[Q´CÜÊE$3PTD´ )Zþ×xq "M¸E#8Ž$V´N¥²ÈùhŒ`3r(2¹Â2-0ëT–é´Á4b‡n("ùAˆ D$‹;nCÝXÕPœ‚ƒŸ8xvëÀssƒÇ–Q¬å Ŧ8›ÛªDBñƒ»Ñp£CQ2èâ•e‰p^†õ¤Á÷ò‡¡"u³ÓГrlï>?˜C/üEbð‹Wºâ`^+Šƒg˜])°ùs¥;Šž±o¥Èý±É:.5ŽôIªnQS©HV‹Ö­A‚§ôn~PjäV…ê «Ë䎚f˜FEWš&)¦„4bæ¼\9SùÄüŒÈ <ŸóB6Sä1þ”&÷‹bY5}BÖL²Eu¯hŠ)‘”&NÁÓ*m ~Ïdà_žœ]›#"ÏçJ“u¶eÖ gi‚­–—&É’¤_SL•NÜ1éRqG§U ¤sî&ÔÝT‰ ËäxÂYLÃåÐci–É‚èahÝ/ãy¡Gº|¸<ô+¬ÏL‡ÒM‡a… ‚óù ,Ë ¡tY!Â%‹‚0ú¢ÿEüþŸè‘„ÿã£ÿgþG<ü¿$s?†½ó_Ì’õÿH‚ÿ2ÏÇ£ÿ‹…|¢ÿEübÃÿDÿ‹$ø/Ɔÿ‰þIð?þ'ú_$!ÀÿlløŸKøEð?þ'ú$!Àÿ|løŸìÿDü/Ä…ÿ…dÿ'’à16üO¾ÿ# þOdžÿÉ÷$ÁÏ!>ë ÿ# þ_Îõ?fÿ1Ç’õßCˆÿá ÿ­^×Ð<ÄÆ†LK ´9:1ÁìæsbÆÏ1#âøŸØÿ¼ôáðMË«S³²V¦SbŠç¶o‡Ïàõð·Ã'!ç ÌeÝ ·.†£Ýq¼>CîèŸakȘþ¸ÖjÈJcó¸¶3CÐ׺{ÈtÎ2^>b‡Ös84ûŽÉÑàû²®©Ú&—ž×Ìy´u[æàeZå ežKÔl5—$Si¤Í1—Áé…FEÃJï¢h%s-éº´Ë XžãWÏX%8QÄr7¹IhR}KRI³å>sœ¿Ž¹Õd–HÒ³ î›oR¥eR"¢·dE¯´êU•î¸à,€e…êÔP ÈpSGª8@t¨Ôd`*ªÜMR é¹ •U•˜h,øÐÖ¦ÂhPÜB ÐXð¡!‹þò Ù‹=ÊdCåA[}åer6˜ ¤$}ÎWI*A³ 7 ¿IõºÔ˪›1 ­•|³ÐZ)Œ]ª•‚Õf¡©›Ú.ùpÍZ’—Y@¢ xP >r€ £‚Ó 9¨”ú*9L+þòM¥Gy€Œ*Ú©øÊËC rE×$Ó…Æ Ÿ å5ÍWgÊÑÂuæ-XgÚ«ùë„6h¾ €…f¨’Qs!«åç9`Ñ ×YTZÁ:aLI·|u Î]y@ ]'#!w†:“@ „D •š¤K4„Lí^ƒ L jb²6”f,ÿW•†\E»cø¢Z•=Þ+œäm(RÒ’>±8O 0‘N›4µ&ûß!J•ªuótHUÓ%UuîÐÅØÈf‡JKG3j ô+qJƒ"Š\‡%L¯)ujL­hÐ{ˆ§mž¸ESR•JŸÈãš*ˆê“×5’Ò?fêLYUîkÑ)zÖíîWÈœÖÒûýà}+wâ{VíìS@E¥’njlnê²b±„s¦;ÇÌÝ iêZæ3rܬm)÷£Ñ.]Ñ4]žBöMU¥º¢îÿð#µTsH*VÕp™®‰Q‘TjI4¢™^ll­"è„ÄDMHñVq€êK b …_ t§‚¿E‚™¬ÈŲ\~ZÑvUj@©èíúÆùuh>T!ÃA/ðáß~Lù»ö>sïoËOÈŸþØw>÷ÖGßÿùúÏ=¾ÔyíÙ­æ±w~ñÙç#K}{­ýÆS‡^½úÙüOWÞ<÷âWŸ=u=½âág^XšüÄUÛï}Z›:Ÿz¹üµù)ú{gï‘_™ýþ ·}ò³¥NùßßðñýÁ­/Í=þ®_þØ¡í\÷¤ø­góŸ¾þæ/}ëËÊÒHïºó«ï½ó‹wN™³×|÷žâÍW*×¼ïo¯»íoþá饣¿rÓ§~üñG^XyîOÞÔŸ™úõožyä­æus?õÀ¹ÝÿÏk~íÿíϼö›ïíCÊ+õÆóÿ"?ôÌÖ_¿úê;¿¿¡üðg?ýK?ú¥k…³O~üÏé_þïã?õ//ýãSÕ×oÿúùëÞ·uó±+›×þÇ+}½°ey~Nج¥µñÁfûU³|°ÙÞÕúø`û¿ä6M˜f«eù tY3â:Ðþ|§ Eø `'¨ÄÁÞ„Fþ`Ý‹µ°3¯G³¸:ÓÉ}é°¨é™ÎtøB6ä¨E³!ç2|¾rºÃ÷pÄÓË™z— Á Ó!§1‚P9—á‹™0.Ó…P½‚ „ò BÖ 9œÁÓ‰Îú×RãìϽôÓW®}íùC”ô‡&{ÁNg@CÉþoü¢Û[èñ±ÿÜÿ$øûÉýÿHB€ÿñ±ÿÜÿ$øûÉýÿHB€ÿ±±ÿÜÿ&øûÉýÏHB€ÿñ±ÿÜÿŽ$øû‰ý¿H‚Ÿÿb|ì?$ü$øû¯ÉúO$!Àÿø¬ÿ%ë?‘„ÿã³þ—¬ÿDüÏú_²þIð?6ëÉúO4!Àÿø¬ÿ%ë?‘„ÿ/ûúŸ“ñ?Ââ÷ÔOEk˜º¦nlàMúb-/ªdð óŸ¹\Á=ÿ‰ŽxQàÑÿ_rþóÒ‡Rm·Iu Á&5Ûýyßis%ƒ²{N˜ª´Qš‚tøÇN‰˜6U#'•’Z¥:Þèïp%fb¢=T¾:%f©í\éqâ­boVo§Ãu¸µ%xvŽà!å–L "‘Š*Ù—¶™I;#©I YU›3¥¦¤sÄ"îm³ §éöªRo©xºkÎÊ‚Ç;mˆ(M¹Q¥);²4Å¢S„ãÚ%Ó$¥Ú(šº§ts»³*•¦N6•T­ ê°Úûæð·Y—õ‹Îk7;œŸãí¬2mRà@£²kÝxf4Bõ™»;Ô®*›-vΟ\çlH…âýxd?•¶èV]“)W²±dÅ+ã<»ct[¦Xhšëm¹–%~€„XgÏ¡H@³[>¾ØÕCcÖjŠa£—{ ² Õ˜PDVtbu—@Ã@Øœ7‡v&æÅ”Ò*!ŸqZUÜ*÷Xý ¦•ŒVÙî‚?ÓžC¥FÇAkN«7¥Š¹hÒºr?&Và‰p–èhêZR ³S2ê’ª²ÚJPáœÛÕ «´'³æéuFŠØ‰¡e¾‚<·œ·ÑíyjâÉ?™ÌSëø&cÒãmÊ b6íÏ[§;gÖñP'¹›š÷S•Œ/ÕtZmס!¦6£BÜ6‹ºM/)ë@5 ¾IS UcßšjüØ8aô³ë#s—u2ufO C’âA×™u<çêIÇ:USGË}u4…!+h—§ÜB‹YJú %5­‰H2‰b’m´|U¦h%¢ÚRo%’ܽ¸vòÌÙ52{ú¹{veeöôÚ¹CJ ÄÒ-j•£Ô›ªÅn£YΆ ]µJN-¬Ì„ô³Ç—×Îaï=±¸vzau•œ8³BfÉòìÊÚâÜ٥ٲ|veùÌêBЬ9™Íp—tJT:˜u ,äåøê¼ec̉J‘UJ:sZs…Ø+b2ÚEŸÆôåÅ.Ið0Š4\µËàC×ÔåžîC! ÿÅgÿ7Ùÿ‰$øŸýßdÿ'’àç&>û¿ ÿ# þÇgÿ7Ùÿ‹$øŸýßdÿ/’à|ö“õßHB€ÿ±ÙÿMöÿ¢ þÇgÿ7Ùÿ‹$øÙ÷39!á„!ÄÿÐR芬_ôΟÁý÷ÿÄL./¸ûyà|þ’ý¿(‚oÿ¯ï½;Á…pˆ¶—ü{o÷õ'g£/¾=`;z³eÃD§+žE}ª•%SJ¡£–àþ×øÑñ›fãÇÆ;¸ÑU£ºbJhhà‚0Ø£]²”y¶ħåêtORà¶Ãicƒå´4§©@ZMg¦*"Á_ä-üt"Òÿ `5ò¾Ý«åV½Àœ¢õ2ÕɉVƒÁ‡îf •Õ ‰Gq°¯ã$êA±™˜Ó¶vÓ#¯CÆK’aŽëÔ¸•Ø[½¬äÒš&_‚vJ&Gé"ˆ$7ʆÍÔ[葤ïÎÚÈÄF!žpY‰ç‰[h˜Š¹[šZ–ÌFSöîIp\c{tD1JS'ô–'÷í ¾U…A‹¥'æhbDæ#1çîÝ×’T¥Š;Z•ƒä•¼ÚRtJ¸‘é$/Áp8Þ›s#6Z©Ñóôà™&#‹Ué–áT‚ÚºÙF%Jf$¢èÔlé ÜšÖ‰÷5qQ·«ôÄTu­Îâìíû}R1 Tôö:Í¢Œr? U²H•Š¦Ë˜itºd÷O¬ºæ¾ÛŸó¶ß7¢ŒÒ~ÈÉGoynß-õ†ÙÞoÃóÞ†;£á(m†Œ‹Ö 9z³óûm¶=L“-IW¤²ºÿ憌8 Xs@xüðΑhµ-ºÓÈèd+ì›ln¥û&XÆ&©­=X²ƒd³¦I2õŠ1¢Þôq³ôÔVÂtóê2£Ñ jógUà¦÷I2Y‚ÕŽB´Þ˜×ê’ÒS†ÛÓöp: Ì;y&&GhÙ k4Œù3ƒÏÍ:w¤mÃ7+hˆÞâh]ePGÀôef#:ÚVw*jšî|Œã²£ „ô_Œ“õQWa5©AVæWˆe¶Ñ™I÷ýuàU9[ Ãr4õt«îéÞ·ñ#*Ú£)vK­ú­îi?öR… Åò‹tš„ñ`KÇ6²Ì·êÍ!HKÚf¸/ x/Cö=Óm4½1³ÆAì h•µ®rÈe­‰T¢îXÅ¢ìîmýŽ"س²ÌðÄ'S³Ô¤¦Y‘*5º§¥þe]3á¤xöØûø¨Š¤q¼Íx.ˆ^­€%™wÏLD$ެ\&AÀLd'3/ÉÀ\Î C¼`uw]/ÏõXðVðýã«¨è ¬ú)*Þˆ(¢~UÝï½y3I&“™LÌ÷ûç)yÓÇ«î®êª®®®îŽjîŒ`ƒµkƒÈxÖÒ.v±,fäҿ̨{„23.Œ ú<)C@ y΂Æ'æ_­+®èJïöä<ý ñmO\Úà oà…N]à—ד!n2›Ûï›Ôu+—s{…¶'*íµWÐÚ‹ó† Û™™d¥‘Noi{ûèJíaFÔ0ÃÌCø‹Þ¯›Ž2“¢ 4¡·•°Ûö¼Qâ†A¸9$Èyà I­ÎäÚkº¤5fVð†Â [ÙÜ]Ÿ¯Õù\õ¤ˆ„|ª+¢ÂH ê‡/$‘êöÖyÝÌZíªE'oìD±^ J{úgãǹbG^{(•u”R™Â.§Í«™Ù¼ýÖaÃÇ<àò,˜–ý²ÝB‘v‰Å’"ÅhOÊ‚î˜_¿¤±9#-ŠÚ™Û^ja¡<…)Ð4Ýø‰Xg0ZM=%#ÈšB`´®ÚPwâ5Hô„¸3ŒÑFfzCÍq.…¾‹Ùío¦*Pk«/%&?ÊOâl²¥ Þ­iþZ¨ì`gCh«Æ¹bʦë^Äé¯ 6Æ«›5¥Œkš›3ë”H  oºiƒ¶£Ê¯F‚ÞÝ.z¡xm“—‘ Ø*’t½æ®Å­n¢™ä CçÇ VKŒõ+¹ë²lÉX¬e1Œ÷´Ïš 3Jã®æO«I¹XFFÊNÉ…¥Ý8Ã&–PQ š²Z,*njQ‘KØ~™t+ €µ¼ø“•RgJ‡þ’Á&jØnc SfJxU]Fhs+Ë“¼2o½7êò¥¨eÊ" úI{ Y®Ì`NTýéÁA†Ì UÒË8Òcy2ƒ‡cVzhtcZzXe^¿—šßZX` ¡oGÇð[GËo1¡o˳€‚á&Í,ÁHnL%»’ÂÅ+-a°´ŒŒd7Z´Æ","³d­ª$IÌš¨ ½-€F.€‰[ÓÒÁ⊺<È|rK€zbsq&£.×ÑQ—™Õ†ëæ5c¼M‰Ïr¤e_g6Ìv‚!±Õñ‡åAÓi†£%ÇÄyûÄVG3c„0}˜CÓÌÃQô—:J}tž°ß} •´,ûþ}® —§US¢|¨%çE‹Â“%­ ´)®9Ó>S;¯æh—7–¦|‡Zê[86à”²iNMTv¸ê Ív…ÑNÂÝûzg¬÷â†ZlqîšÅ[ͤD§Õ0œµ†‰¹Ý r%)I¸ÛcžK°ýÛˆ16-™íŠz5 †]¨EkäuAŸ/8[ߢ)ÉÄ|GÙ-`lÈdÒ#.-ýÆZYÊHùÎ µö%F·:!û½þRžÿÏßýüŸžý¿]û¤Ð¿ûìÿîÙÿÙ%O ý»ÏþïžýŸ]ò$Ó_ê>û¿{èß%O ý»Ïþïžý¿]ò¤Ð¿ûìÿîÙÿÛ%O ý»Íþïžý¿]ó¤Ð¿ûìÿîÙÿÙ%O2ý9W÷ ¿ÈI=÷?uÉ“ÂÿÝgÿý»äIáÿÚîA<º‡þ]ñ¤ðÿï~þCý·kŸþwwúÿ÷Ø»äIáÿî³þÓCÿ.yRøßó;ÒŸžÿ"‰JÿwáÓ‚þ‰åm\O‡ŸÌÑ ×¹ÙõÅj¨ƒx@·}þ"*ŸLAe±çüŸ®xž2©²¨Ô¬U‹„bÎ2p u\†Kˆ'%³Ø¹ñD(HáxøQ©†/A,á…L®Iޓףñ«BŠÇÁ½‡¸*oÔ§–1ðs’«^@èlæ[#¼úÁÆ"Êø¿·Ù†Õð ãˆF,×,ó£cǤpЬ·XË‚Ñ2¯;Š…þð¨u=’º€X,Öˆ…Æá-<‰[ü®ðL‹uTÀÄRÏSñŒ "È Á“æ›(’’ÊY,å•=‰pð‘LêÕ(õ‡™åò‘PÌøm±$ƒ°≅ˆÈ)ÄZ:Êñr¹cQÕˆ Æí »cþ:ŸÚhDKíñªa5â‘DÖ‡+zŒ 1¸kÀˆ!"êõyYlÄ:Ò­z¼>ŸKã¡£’ª´µŽjY ÀJ­Õ•T ªQž š]Þ <¨Ly xÐÖò$x"ÄLNÍÝÄ:-©‚—-Œ,¾^ û]O­ÏøP‚Öº’>” µ®–µ“ XWj±âJ| mw%ÕU‚j¹Ì$ î„ËP5© 2TAmY®¦VA†BÕ¤B¡Z½Éð šÞVàAe¼-àA;½Ið(Áã]Q#jHêH T-˜T¦p‚-ËT *ÁÔ2ho0¹LhC0©Ô"ñ¹" F |K¦9Ô"Ö²LT%–Z¦ ÚK*Óe6%Ã5éâ¹bAÖE $ TžàÕ9.7zÁ©—ƒñ# F1[ ±aâ¿:oÀS Di€972qÅD”ž=°©c%±Ž./#b@‘æ8 Cô_3ñÖ©¾ˆj|ÓŒr.ŸÏˆ0D[ª£’M{ܱp„*­º ²ÍšXEK3Íh­òúÕHQE¸‡˜ÚfJ+ºðø®ÖG}ž4Im|;VõÍêvµR4±Öç½0¦¦ÉÑjÙÉÉmŒ…úmÅ·Y¸žÞjÑæÄ6¸}ª+ Ò±©™ÔzI,úp§ï.Á LÜ0ž±«fyçÀ0ÄY¬î`0ì)BòÕ¹ü^_I¢­üqÅ|ÑvrQH´«¶„iôb;‰¸]>•õh¬¦µ<0«£F»hWã‹9ª:æ¦(ÀÎϵÑIýˆ%ÀW4#ý*ìr–@ ú¼àêh>áALY­¡Ò’RŠ?æ£\Øæ§Áh”}Ê·ö©ÒJd[ ¼Y DâÖ:¼Cé–SÊÑ .ÂÁ™j‹Ø†àlG>7Ç›aÖb‹ ôËÒú’JÅÒhÌ‘±@«ÑaÔ½ZÄ♂Á€ËIŽ4ƒ3µ‹Ô(½ÕÉ zX˜X¬ Ge¿ã˜Ö©e!3\ÕSßnÚ¯Ûˆ´,ºX„æšZ©\ áÓxÁ@â%3 E,VöÃÔÛ¬3̯9T" ßh[1iœö9Oê£Ø§ ê©ZZPPà¨6•¤ ÜIüAÜa®¡˜é,Å*·ú]ì§Ž[Ðècáä(KA2,#O"±Zb”èzpÎh)pù‚.íÊ&)‡â)!Hu1׬×$?S“Ìb39-‰^Á€Ö¦DýPɤrA&-c„ö>S,Jj+Dù‚³“¢ €z’/šÉ@ÔC$63Q¤Á‹F^NW}`ò¯+>,¤Íú5¥¨§õ˜.¶¦ÙèÑÂãO¿7ŠÛ6àbægáàlØ<+MeFÖ%¤ßct· ‡UÛ!?©²ˆÎùCaº‹†£ *îW}ªÌ‰â ¶Xõ¯Ù±q:ZÅÑ”Dp#ÙjR 뱨¡ñkÕ4tè ºégаaƒHÄUGÏc™TIÆ©³@‚óÚAGìæú°Ÿ&$Ê&I ÍqÞ(BªiÓ£v…C‡†)@ «Ù[¯XJ¶aÃÚÈF©ÌÈHÆŒ@%PU^ûlRðÿ„ 3LZÛTB&à ¸€–lÄ`6#Å.ÞºHwƒÕµ( ™vL¾J ©(¡ƒQš­˜ã Éô7ÁgcˆyÊ¢w9ËÀ‚ ÀÅ<«íb‰¹ÓÃ’@óô¯Áø­›HÓZ„Ö'ɦ«¼`§Am\¡AÅræ@bÄÁФ­FçÅ”ÝVÑŸË’¼0 ÝùKmÎÌäŒ[¨[ªåbè‹lÅÚ¹˜ƒ!¹˜Wˆ¤?ŠívEÿ$>¢y[ ÅŠÄ>KÎRci¤:NŽ µ!) QYÈ”Ê\±Mr´Aå¶P/ðP^Ôñ#(,¨!˜ÅDO ¦¡tjU:·¸4ÔN׳#²`¨Ë…Lã+n Äç4"‰Åb ÚjÔëÍxR4Œ´M<:½„º*ЗU6þJ¢ƒã¯0½ûëãj´+DQÄC×BüÁÈÆxÇaA$¼Ýoh-lFzı*ñI³¾ŒjHËy£†<+R§!­Ôf—É|­©íRJÌ/wÉD²ÉFÝe êuÇ #Ä̉`VÜÕÅeÍ]"‘`ˆÔ¹«Îˆú(s¥?³Íš¯Z'[Ö|Å"DQ ‘8å+Äœ™¯$;𛃃7|ÉÉô_¾Bú‰~ÏŠ4ú½Lk” _e?S¾’òËW<È¿„TTD4†ʉ f–3ÑOÚæ«Î(.[¾âm¥„ €ÖïÑF­ÄE,NJðT.ÜÕ:ñ²ç.èH" ¼<ã«]bì%Ú’ÙKR`زÃÛ]QÈ噽° )ÑýY‘F÷‡ ÔvŸÉüLÙKÎ'{)¢DW„µº+6Ô*Kƒ‰!—fN3·Ï^S\–ì¥H]ŸÖÙ«Þç­M0WЦŸKµN°°ò¶‰¥Ð9Â$xx‹Œãl&–v@Kä±ÖvÑ8@jbÄâ`IÞé6ŠNdIQLh’¤£†‰ иî#»pôtÔÈD‡Hd ¨„*™#9]ñC„o^¸Î­@ýp™ÝH´<áÀ?_QÌ/ËÓ®#“›fîX̅峄Ÿ)Ë+yey o3Ø@±s4¨×ƒŽD3'‚Ù°|§—-Ëà ·Ù –¯t y)Ï+ŶT@®ŠjëTë ß›¬#Xà'z’ŒÑIÊÌ÷2_ð‰€|Mñf¤Ë8+y!ËÔ¥ Ã<ðn"ÝAqÃÞ2•¼bJWxö ¼`(6”Dép5ˆJ&¨" ¼`i&ª<²:T‡—DÖSºÈŠBQÀ+"e'„Ÿ_‘€eÙ,+$õC@,Ö(‘üLE‚ÍRM¬x°S5u…*R(ùk,„XGÃ5 ©tQƒÅ•²S¡†%ÖÊX-=wÙ:¹¢œý)€î™²ÐÂ=“]TÜõû“aÃñõ8o`¦ÅZ:a‚nÄÎÖ.©£Mo‹†6I jxÒ[¨Åä`Zi”ÏâÒôOô€ÂQºU+$=ÿ)w$5\µ°8f#²l¢ýó íDÖȆoö¡î6!¯|ÍÊ0,!”f6Ã’HS¡&Ùóu–ð3åk»‰¯%@ªÃ²ijYóµdõ¸Å|‹z}]ÇØzc4¼ÉhpM¨ú4˜Ð˜$­ÅÙ3vç—¦ƒJ)iöÄØˆÚÎàìÖRs`o{Îì<уT#Qì÷Û“5T$;ežŠ‚ÄLA Ó=ŽH •ˆZ,mÔ=8Ÿâ•‘øvV¤Þ0•ËEe•ê„&;ä~àp¶j+™¸² Tôq~Bç!¦ù=/C~ø–½ÙD-‰™Ä¡QÞ0 •ä¼Ã‘_©€Š ghi¬8ÌÃÖ$©üŒ¥‚¤5ˆtÛ ófô…ÏE*ÈæÍZúA÷]©3°¦è¼Š–&ɦ4˜˜CÑÌi¦l™è Q\ZˆŽ–¢AÃlVò!Åý@KHZrËRp伂 #]’ºÀ3Ã¥¨.©&­˜ÄVy\ph†IŽ7&%ºåEVÁi•0ð_u˰'†sV¤1œ‹tÃM.êBVð3 ŠI0ð z¡Hp à¶g/VOÜæ.ήzsôeèÔ—Y0(Aš9ÌB8tNqiú(o¢Üú„BóWê”)EÞJY‰‹œíØ7eC3ã%žâÚ+%4—9¨Þ‘Ovgeš‘ÑX g©m;Aå ~Æìžlœñ¸¼ º–˜ƒõ@µzx³õ «]oˆÉF‡A“›gØèlæ`V&ÁÎ(®“ Ž…©ŒÞaÏ+çnìØ”—2Ð@.”Øžj¢Ã4¥¨häáö†ïEóÒ.ytISàÙÚ‚À™–F‘NÉpÊK¨Y ¸Mx!ðL¾Óå‘.[bòj§¤liˆÚ)ÌýJ¢ØÈÁN™üŒEÙP‰KÊÈ#hÚÈIÔ¸@Ôp-EÍt7»C§ët ­A:ò°]  7ÓÛrŽ"§sŠK§[P?¶DކÞÎ<­MKð+Ó—9NJr·aÚ“D“¢†GfÀuh‘‰)¿ÞteUUͼˆú/¶­ªæ ~ƬïHb}‰@Uð¤G+¼Õcç[aü¨qÝUò>m‘΋ǖXdÍ48Q"iÌB™ð}®E¥åy×âÛ`y±Ëõ Ä6 âS}°sÅ€¹Ì£âÂKÌ9ŠçÄüŠt´à”›šIÌãxÍåbZÈ|¦B@hݪÜY^¾Poc"ˆKJ ÷I}°ΔŠ)”oŽeíÙ Œo°f°aº·PýSlz·"Ðí²ftiEG^Ьš=ßd¨ÛN­ÜùõÇ«²H¶Ä~2HÊÅm¾ã 3væé,WQê°b3™Ña…#2.ÅØeê—…Ö¿„«&†mDáÙB¬"Hô\§¼ú] "=ªJ÷‹¢À†\R`†ˆ5ÉÁï*;ø&U®Ö.tì7{ytdŒ†)0%ŸìU+ð"õª`<¥.sŽüîïRD‘.S¨t$ûfb0—ý]YÂï0©r2èn`:©Ðº€Û@¯F»¯d³'­SägB1»³0ïCâHh»pä2eÈ~‡I‘ób´”â°gã©AU¢‹ÉÌYìuZHvŒ %!g×¶på—m$»ƒÖÁ´Ø‹k¿Æº¡B8—Åä¬àwœV¹®ÿµà;s÷Qx˜/² Šbž­lt-ac+¼ \ÙØÖ„×ï:?coÀÎR ¨Ã[¤0ˆŽÙô?Ÿg‡kZ†=i`N¹Xj.ó,áw˜¹üÌÑPžeô …ºkpLGCIlÞ.ƒNt2²9žEAÝcòëƒÈB¥^Geò. TArs‡É~æNrÆ6è–ðÛ‘½êËF¦¤™ö1àúH4Ú†ŽŠ`£/¿´’©Îž¤ïC5ª‰¹iYÂï8­ræ+êÉ— NEá*Îx(‚‚ëBö<+Ì´çrIý:±“šÕ '…9;ø™{‹tß0wˆ„“<ÇÖÿPìá’>Ú6Ó._Ü:‡'€à&9œ¾R§zÓ<]q”•x™ž[K·$Ú·ŒììlK¢èж$šÒé0Z»Âé[¡.B~ l›#—Ä7Ÿ4 ¹X#²„ßñ¾+_Ҿ؉òPÀ-Ÿœ¨½•¤µ\õW —„ÖX #Òš·›h-°íi(‹ÑjK{½-Ï´¤œ•<^ÙI|gˉ–ÙÁï8-s]×g|mZ¨ä)›S¢gòµ” î©Ð~I={lôÔlAÉ÷þÜ”¼?'±£K±&¹íÿÉ ~Çi•³c<%‰Xš5 ŽË$qÞ‚K xr:S5Ücšç•Pt¯5­T2oÓf*[Ž+¡YÂÏÜߪó¬ Ý]c²¿ ³ŒL8˜571–Â)ÔQEá9ºÎCEοTìÉBÊ4à°­»9 ÁŽÃï8­:Å…&Ú Ú pµƒŽXŽdj¢ì!AÛÐ_+;Zp•´á ±¯Õž´é%+TVð3÷.ê4)H½gœEO¾ Ê‘öF ä×òÁʰ'I¡ÄnC–š‹å#Kø™û{t1˜Sƒ^Q<¥-QH <5d1ÏçyÄÁ øäÁäj…K\.'d ¿]Zh§![ôc-F ;Ä´*ìòâq°ì,[v*^ŽcDkwãðÉ’øvÔÄÑ–<ßÿ“ÅýO~O/梷<µyÿ<’vÿ›"q²ÀãýO‚ ÷ÜÿÔ\ëµµ‚ਓT‰WÕ:» Ú9Yæ[—~ïúõ<ù}²àÿ§®ce¤çà|ÉÖâþ7‘ïáÿ®xN*]Ä‹–k¿¸ú‹L8¬a:Ô:Ž“Ž.XÖÑ^Þzd}¥ †U:lŒªËoi\ºòüñÁãW÷}oÇ”¯Ÿÿö@ëÙuOMZQ¸éÅø·þí­•×õªx}ñbrñš¡Û/~‹ô;gð¾ëŽÚ~íÈï–þ¼n¯òÄAgÛ÷>ºfâÚ÷N¾èÄ+v¯ùúí3ç6­ÙùüÚ›gÏ{aÝa|¾ø‰­¿=/ýz÷žƒ»æ]¼æ×¦É_Ý|Ö•¿¸ÏÞGÏž¸öƒ«¯Þõç>%'혿'T8ïNièI³/^óóŠ«g¿ºkg³uöo÷]|ñ¶mkW_ýóÜÙïn»ú‹¦-ÛâkùËðÇ6|°öž>ŠøçnÙÞýÌ>?ýùë[n½x诱Ý÷¬}Ïzæ·Ï¶níž>>v„û½É'\±sô{ß~ÛìY—ìj:{ÝýïóíÈå'ŸÔë?¿Þpί¬9âݾ¿èä“—îäß¹hØŠmÍâWÏÞðá‹ÿñΜiyc~l-wÃÒƒ]¿ê]ç5%_½°0p0¿Úµ|á±3žßîygÎÖŸþà_æŸ~Âùý•¿ù÷ûtÐ?Œ±ÞŸò™»$Øÿˆ·¬_._qò¢+{OŸÒoÌÜm½>UžùðÈ{n»äéßïÙÌWô:âçï'­¿þÉÏn\¼jÞ‘Ÿ¯»~Ï™sêo¼°þòiK/ñ|ÛàºsÃ[[/?îÎs&I[_ž·Ë]÷âl>cãþGýã’O窋_wɶû6>~øæC·¬=ü­ü¶³rå+E/kòØ—–~^yì½4-õVý|ÙŸ­é;⃸gáЩ/í7ñ]ÈÆÛ×xÅ›þǯ»w^àRn-·¿ÕâZyE¨Wß…’zþº‹¿>fÎc'ž<ä¡öë3 ÿ7ûÔxæï3à¢~¸_ÃþG¿1hìÑËo[[¼¬vØ~Ûf;vŒµÍyÛ´¾Cïyø°?üsôÛï/{å(î7®ZÄÕxôð“½ذwèÈ÷=ÐsBý¿ö_VÄŒ©¹õ ú¯×/-˜~Üýç/Ü{îFîù ?9Z~Îñï–ScëOòúÕßÖç¡’OOûuþïL¹þì¯ØýÙWÓ«¶OÚûÞôö}±ø¯ü¾ŸF‹n¸ãÜ‚ª}†÷;þƒë‡ÞvdeìÇ >8œ>¶ïµ–=So´Êy$Wúºkèž¡?öZ~i¼ÿK3Ï8¾oócÛ_?ð¶?Wè#n+&ëÿ2oÔþG.T/xùÚ+}æº3§.¸âª! ;âKù½ú?ÕÿÜ£,ºðÝ;÷\.ü(nÙ¸þ‘ ƒ†Rõê•g­î#¾yì£Åß|õå8‹ì¼ÿ­Û¯¸ï“þ·ÄwLþqëÐs©?ã¸õÊ5Gozë¿7}Ü{é¦S¯½ßíæÇT-ùù¼1>ÿË3ŽgFm8ïù3?¯?ô"}vå–狀†qÿ¶Áó«ïœ@®œzlóå}ôê)ÎcžØ÷¹©¯1nÈ®ú›§ß¹ìÑC=_Ù¶,>®÷9åûË'¬‰½öà ;N›Õ°è“9SùõÏ7>ÖïfçM¿­W•’<|,Wµõôñr¯»ûÏ™ÿqÁÁ|ÿƒ{ï}þßÿåͪ[æÌøeô‚¢Š{V aÃC³Î¯qëÎ3Æ^ã\þƸǯÝ÷¯Õþ?<Ýíÿªìü9‡y>èwìq½Ý½–½üÒ/W¼µäÉ»¯;wö·lôrí¿VÞtö‘çþÏ–K÷ïÿœ°ç¹—ˮ۳ðå{%÷¾Ï={ÍA_nŸ[vѼÍgÌëuêë{V?8ò­ý~hÇWƒj{jȨ¹Õ×5Θ¼àŒ·÷‘?›c- vV`rŸ3OßóéÍÇŽûSÕg.ë³ðœ×|c_rð_§©+ÞRž¾'zîÂ@ÿ#îŸ~ÓûÓ•”n{¾Ø{ý ŸúKìÒ36íŽìýÝ´?|~ÂîÇ ÇK6¸=úàu]°jÄôUüβº)Çõ~ö’©çÛ×Ýqâ^«ýÑó'÷ûÞ±uÙ˜»÷(çTÍ|ìÓÛòеÜpû}Ëw¾óŒþ-?íñѾc6\ù›m¿Wß½´îð¦Å½&NþöÓÍûlzÛ}ÔSùhÞÇ}6 —Ýu÷‡ÕC­v^³±v›çð˦8~þ­›çs3ÈãJ*Vì½nÁÛGñás®Ù|Ûû?ÿøñiWß?<£÷ ·.Úõ_§ö}⥲͗\\~ûÊ’]lÝøùûëÜ5÷íze¿[ú­´ÿaͰ§.xgÜ<þˆŸþþÍÜß~­éïû]è~møÎWŽ=öî…w,ûöö½o“]–-«N³s‡UO¹¤¦é¢¾ÜþÉ3Ç?pò„¹¿L~袳^<çä³o}Åvö/÷ |àÖóæKO­=oã=¿|ûð ÷>µ úÛÑùtô¨Þw7U‘%7”ÏûùŽMÞÞæ‹Æ¨3# œûòø¾µ·xÈ/õ½ÎRóã¾ËGÍ™päâ¿ß+îúöÆïŽ?ë¹+û,xø¾ƒŸ?zñIÍúà)'^}ã²í ÿ|Ñú9ŸS:äí‡ß˜±÷˜ý{97G߯u¼5jÇúÞ㇬÷¾Âòuç?L½qÚÛÂzõ]ùuÁ› ËZ?¶é¼ùÊØÏ¶^ûfÓCʱ}sæÃÇ\UùŸÓ"ã'Ï]qÓòÛVÜÖ÷Ú)5޲ •“®øðÜêÿöåæå“ßõIäQô™§î¿´ô¨º{Å‚ ÷J×ßðñU‹¯¾ï§Þýøú‡Ÿo¨Ø¹úKç7·lÔ¿®.Zõú__uݵ‡=-{×¶Á[ž,;ê®ÁïEžüWðÄ/Oxò±Ã*¶o¯8ÿÄ}WøÂ–¢) Ï^^wh¿Ó¦ø¯G¯º¿ß°íÇŸ½è¹Õ}~è;ôUëG+}¾¼(üæ=/½é™üëK#|3øåâ—ÞÄÒNœ<¬opérĹ›÷¬ùÇŽŸïÛ6à–—=5ä‘—_wœY´öµÏ·¿4Â{Ú~yÙQÿQÝrÿ=ƒû]°ìÑá»Æþ4âÄë‡÷9eÑ’º%‡Ž©©V~½µzÏý¥Û¿;zÙÿS¦Gý+®úñeç+%âs7ßtøŽWö>å~ú_Ò²»Ÿ?þÎo§Ÿ>òû~w®:ú‰>eŸLÝgÌ©sê×Îì]ºò¦cú¯¸ñ|Ëäw^žsˆ£ß…Kú9uÇÍ› ç Ú¸/'^Ñ ;_½á.nÀ–Wg˜zÕõuk–¾×keŸ¾K–>¹åAhÌû»¾ºb“Åz£ó‹ûtâ¥%W0ú¥ã§*»?ôNõêUdõ±K>vµÿË9ßr÷„Àhoæ6²ò™¢Ï¶¾ÈmîûèžÒwOÝöï3ŠÊŸ=üÚ“Ì_÷Ð [GüieìÜw_ùçÑO»ðËßl¨X9qûÊØAkߨ¼rðÝ¥}Ž»ïß;‹ï|{aí[V’»Ÿ}ìîMÏZ¾~ãÔÛN}Ó/òïO¦ßøÏÓîžqûO•n_tÜõ—¾¸eç-//©W7ží¾iÕ‹ÞÛ1võø›ø_ÞüÔc_5qç¦3÷H–¯\øYÚZðóŽŸ]¾tEÿïÏxêÝ"÷îóêûì'û‚óxë9.ÿõ'?[ùÐé•Áo—”‡};eÉk›ª'ïXüÒ=*öäwŸ»lãŽÞÍrðšýfÖ-,þïÍ»9µqêã^˜¸à¥‡T4î²®þmŸ[ÞZàWMç‚_¨§)š¾&H<§ÇI ®ª)¤ZѸ`¯z¼®ÁFBïQÒîL©±X+è…'„ƒ\ô’/Õ=ˆÖ½ˆIá »RV[AU$Ö*µ1 ßjŒŽ©¤Ÿò6öÉh¼jŒ·Óè†ÖÒ@ T;hϱÏ^{±Âx‰½dö¢ gu$€ÃÛ‰¬CÔš'Í#´}„60B¬çx=RmaÐjÞ¾ˆ52}Ê'c²¸¢._°^!¦eKÁ¤Ñh‹uâ¤ñ„6LËèHÉHÛnѶa¡™ Nð`iÁnäé›°´+­¬¥ðÝäŠòŒy´X+1/bXÛfEwYU¡˜n³.õo’™Ÿ“ §­KÓµ[>me̵ˆëħ­LºS°Ú­…%u dGȈíÕ"ý©;íVELWÞŽ«~m%ב¶*óÑnuReEJÇE“¯¬-©¤ï,íœCÐnEä´xQZ´P·W‘ w)·[!%}…dBÏ’ã‰#=Cg¾w²Ý™¤Q…ʦ “h³›Rí{rª)q„+¢¢¨NÜ_ÅÚ‡q‰’1ŠO|ob  <1·.U9‰ŒiF¢wØŠ{1/C#èýñÞ`  ÄdaY‰Àñ' /‰6™ƒôñAO[IÚÕó…©7Ï;Ó^=ï Ÿ–ÆððB'»~ÞÉG}já˜ÁÃjwgX ë3 ‡2^ VG´8ÁæìÒ”€'ášbJœ`í-âdìÊÉq×2NÀ;^RãìR‹8‰³q-óÙ•Ô8Jn‡|“‡.>©q¸Z’'ƒŠgã[æ³+-ð"q|‹2$ø/ÕV>è–c¼jƒ*t§ Þ\$LK°–—‘êÂ]—9·üñ˜š×^šðõOÿ©[´fp+Q5j”r…£”Ì’(*]³Šò÷I¶ÿJvkÊ@ªÛd¹íõN[ÿþÊÙÄ^/Ølr/ÒÁe¦ìžÿÏí¿)ôwtú+=ôïŠ'eýGíô9©‡þ]ò¤Ð¿®ÛÐßÖCÿ®x’é/s݃þ‚Méáÿ.yRèÏwú÷ð—<)ô~oúó6é\ý»âiAÿ6lÏ#ë2Àiüÿ$ˆ5ùÿ@?A³Nÿ_—<Ά¦Ô«Ñxë´oŽ[œ•ž‡9œÓE_˜ ßôö2B¤B­SÃjÀ­6[œ>W­ê‹§íWÍNoÀ£6Æ-n^ž®¬æfK³¥ªA%KÐ+-æQ#Ä ®ÚH4ìrG‰ÛçŠDH]0LB®pĨ'‘êöº| +ê"uá ŸD óQ«%Xâ„O,„¡Æç ÌŒS`ÔÙ•,c0Œm­ð„›ãé,2¢E˜à,¤bb±ÄÑ(qö×*H Àî±0l@3-$%ƒÓÝà ÿÉyj¼¹Òå,¢×ß%¢Úù¢ut±Ën²Bqí·Æ±ù©,–rí[Rüw©»B ”\iÈ^â¤æñ:o},¬6W­±h1n5UÃØçT×,u–?èQ-N­Š´×©¦Žèg¸ Ekâh™wsmtKæéà z ØЊ†FT5x#ZµÑï;BfC! ´EˆÇŽñ5hôp=¤#-Šß²®Ö -$m‘&p¶6[Èn¿YÎH¬VãõÓã#±×«‘f½J#ƒþ°VyTõ{ç`f/ü"Æi9rKJ㼑h³3âwù|´'4)œåE6¯‹h “ÙÙE™[k ÖµÆÝÅDƒÍN*Ía4ÑbÆH¼L¢ÝÚCÊT¶è‘ÿ'ä†\¬¶F¶j¶bRRƒ %dŠ£úP>9Âj]ÜÍŒK|6›& §Ã_1cihL½ZP£ÍT´› ¤¡ØÕÊoY™óØjOI WÌ·“JjpíÈ”òb(Æð/²`ß[‹­¼ŠÛ†`ùÎ%Þ(™íõùH­J ¾u1ß9É”òª±'W‘Ò ÓȔҊŠÒ UÓ΄œ€&HUg© Ž×òyìlW8ì D›°—U1r,ä/Q>®¼j2ýèòª £*+É艤”L*­¨*9y\i™4¹bÒÄÊQŤJ—Ð]þ¿=ôï’'…þÝÇÿ·Çÿ§Kžùß}ü{èß%O ýOÿ_Eä‚é/÷ÌÿºäiAÿ–KÌ1¿—Ń5ÍÊ œæü'ÙÆ+†ÿ—¡ÿô©Çÿ«+ž$ÿ¯ô´7ûµp7€ŒÎ"#+¡®#m8ƒµÛÉt§°63 o;‰z†4|.t \!‡lÄ­ç‹biÍA+ÅýÛoôÓ`n[–d™I±ZŸ×MÆ«þZ5LFëž)íùÌtíÓ]b>H‹ìí§™îIª%‘Ðöh8æ†ïÛô³É<``–7¹|éÝaZ|6À ”|ðá£LÍ::4GAgÑdo * UÁÀ™ócë1€p¤£H2BB…… Þs•{:" Ã@C i¡¬@]ÐYÔ!¼À1*|ZI™œEeÀý9`Iì–Ðkg–ËS#èYÄ\©HXuÃíá¬6ìwHÍñÊVZÙ>&ÝÞ@Ýà ZÐõPùÙ‰$—;›ä²Fò*Z~Î$—³'9Ã@~H®h$Oieç’\k@g“ÜÖÙ$·i$ϑԶîIj»F꼸³iëhIÛqÁz¯ÛåË•Èȸ©íÈžÚ>V…¼RçÒ’=R;B½)ô]O™ôz:ÔPÞÊbþ4"ÝWТ–ê.Fçiø\§s&ºd×|jõi  $öSìNwÏl’bI•2Ñ eAwÌY] hÇ´jT«3šk¥UžOAÄ gÄjÖá™âNɶ¶#Áh5B¬‰;ñjz>qÜöÖ7D#3½¡æ8Š’/!²ÛßL;\;ðKJ(ѳîa$ŽûY³ÖÑœ è jœ+¡tzIœþÚ`c¼ºYc¬innîðœ'–öúi«îþ“\a—_ªáH‰±ÅÄcîŽ,[¢=5¥OXDô]Àò´«'drÕïPÏã:§ç,BA7<®ýHô¿)Ú 5 ™uD*ÃÛ툆ÔîЦôBÉÝ<¸ã½ §ô––â<çþCëSÃÆ7¶!eè3uW’¾Sµ¬Z¡0¯VIa÷c¨À{¡¦ÁÙöF{Og̸3vr´ë]Pïz¸™Ê4д$ÜÓuÍTäÙûð¦ªöq>´q2EË(´@›»oÂè÷QfÙ–!ØH“Û6mšÔŒÒRŠ¢ ‘)(8V![@d8@E>d|ÈAüŸ÷ÜäÞ›´MÓ ~<ÏŸ<Ðäœ{îYïyßó®óƒƒ0‰—Ef "°\ÕëÓiƒƒBøFÓݰXÙ°-VIî—¦’ôZ¸å— ÷"VªûRV«8"½¤YÏ’öR}D`•ºë¿Ëˆ)¶õ)))ä•§$½Ögù¥Â½>•ªÃ¾>Õú˜H¯OÞ³>½ô4XŸwl³—v “ZÂr>e-¿†öLÑ*Ú p$T>p›a³XlÃ<ç'­1Ú`)AuÈÍî!0‰8T‚?óQq õóòüÖÏË”;+oÿó¶ÿòwOü§{þwäãÿ»&þÓ½ø?wæãÿÿóøO÷ÎÿÞÙüïžóß÷ÎÿÞ‘üïžóß÷ÎÞ‘7üé»çü÷=ÿÏ;òñÁÿ»çü÷=øß‘üïžóß÷ÎÿÝ‘ýÿ¿<ÿ-Åÿä)‰þßãÿîȧü”Ùš/Z6{¡úòg1¯ò“.×ÿŸ"FÿàOSCßóÿ¿ŸèF}úƵ7ÙÒÅ8:žÔDG»/ajMøÞÂä÷¦XôfgxKº€Iº åáû—Z]ÐO|Å*€›Õåm.«ÉlÍL´´&þ Œž=\Úc5u°å‚>סqòE(ºÙ>v›Å–©Ñv´9;šNhœ0Á“˜¡ñdb-®F£uˆNW^𬡈"M®Áž£Ñv²mÐê¼² šã ˆäWˆ+ |ž’MRßÞR žG‰^âˆLe:E{¾ÁBä¹äßw‚0¹ò†ä mûNrŠB)ƒÑåååÍv£+7Ã"ÈÙ,Ê6™E»è0;äLefÚaV<9ʱ£Få e8Í“RD ´Œ¢Él±ß¡(½ÉPÉïMŽt9¢ô*r¤S)½Ñrf7b%r£Ò`2£w“½$±‚¹á9LŽ@³ä†ò"7xwÝ9ât$)H‚ÐËPêj–åÑ—QJMp2g‹•‰nž Sy ”ˆÒ©…G1ÍIö iQºÖ”nRÑ"„0fçäy<ñHhSé-pRQTàªI"Ùœ_áE_¦ï4¯A /˜’¸•(:]ÈÌZGa_t*¥¾”Ûþæ¤ïHË/œNQ òR“²ÐIc„&¿QÀjˆp™7=Ò¶l\@˃9b97­eû 0z`Ûch }ë%ÓYPIm°J¥&½Ì‹¡€*Èú+ ªPMa¾ bÌ£ÓÂc„AT¤ÎTèú E*Gˆ™Âh…‘f¥&½LUú@Tý‚ªlº&u>d2š–X‰c´bÜÅIVah¡0Š¥9<Í©ÎošQøé¾†®yf¼uññ‚ïÖ¥lL•ÚŽd¼ u7ÂxÅ)‹Ê­päð·ÞmFV˜QìµÎU Â=½7hNa9<±] ØËæ‚‹¬p ô úàŽ¯î]èQ(òqõŠwe+OÂåáFĪÀ«—’²ËpØ*g¯d0ai.X´6Y^QœÙòDk–ó|xÂR,bhHªþËgs£‘´È Æ™æ‘äHK–/˜Fesãð@á¨6Ë?‚&2Â*o܆ Ú¥&= Ä=ÅrdýKeëÂe¬F€M™Çì†Æ IÙ ’´’„ÂtùbrÆê°4¬±ÕÁ d,Ëârš-ŽrÑL-Q<áíëXy\+’•D6V&4Zt~€Ö±˜|²1ŒŠ“÷ª,Nâ&9RÀˆQ31´A+ÞBJ&”RBѳYÀÈF©íKhî$ü±`¢'CPµðZS¯Rµ@Tèp*Z¨ }”»Éº‡èÑ[!ì`q’0p™”éÔÉ2ѿ쮄·¹`7Y8Ø£+­ hTJEìC‚Rù*D¡ìc=ÁïÀ°¿ˆ…µ»ÀJDA¥”. øž ö  jê"ìÈŒÛP¼gñ*PÙu¸G!ìÀÁÕ°Ñ™ñ2:3hÊÁêÌa1"h¢@kM\†Zÿ &‹!C,¶Ì»„4¸*[Šyœ”MÅ<¾<ÇŒ: iKsÁ’´£ÐBiõ’J©oýXBvЖé ¢Ê›ÑÖ40$…éL±ìÓ¦GTÊÀ3ƒcAѺ«¥`ru²:C]õDÜJ• Ê|TýÓ NmAÖ#‰T~HBb™lÈ¢ÖD1*ºá­›ýî žAz¸3þ(ʼn’ŠñfüëÊüÓŒð4¬4l¾4C‚G¥†5™”9 >$yƒÕóœfy/Ö‚cq\-îÁOFÿ!†–L"Å,þR‚^T‡o‘µJmÈ /!FÙˆðÓP,‡AÖ_i犰}ÄXð®À0Br…øP€•^-Åê =ƒ…XL°Fé#ìÖŒ"a²„J‹Dh]H0AT°û3å%¼"R§‡Cr0³¡iÂõj¥×0ƒÓ˜eº[T^žaÊT›ÆI™jKƒ—åIR J| GsAoAô¥µáˆTb‡àãõÞ{@iïèPG&d-9Kym ¬^Ú8)”‡´%¨H¾ ùÊam:¨úAT%9Õ–æ6AÚ`{€-CÅxÒzoI)Ÿqo´Ê4uó ‡<@æ÷I}díàд)‹šR“2ÉPìàAÖ0A¢U Å`gLhDá'©5‰êø¾Ô»‚y†(+·$ÿ{Y¹EáˆOZ ‚…§¹ uipˆºôÁO€FeMsò±ÏP]c˜P#|•bCI7ÍÑ•CsôØ’…Õcp†NR)4…Âl)þÆÏh¬‰÷¢9˜å!ñýð.„DS³©Ï,Ž"F¢íÒ‘!µ!‹"xÝ(ÇAñS?‡‹"VÀ4‡õ¥9”tê‚bBPŸµ&ô_ulÜ|WÑ%ä©¢Àò \MÿÚ´hNÈÍKsPQˆVê°¹¹R4GQŽ……æ„ìl,Í¡U4‡ó¦9:7Ÿ£só9‚šÏ“™ÄçM¡Ý±¼hVÙC<FÂWš‰<Í¡/š@3^4ÁOÈ¢ˆÕ¸ R¸‚žHî5rGYZŠ8¡=Íà_#GÁ.¯(¦±ŸŽ:"¨žÃª†#šu¢¸#vD>êˆì€£‚(®RTP,ÀAÖ_yX†êìŽa©W0d0 ᨘ̰³;¯àÏQXÕQkà4œ¢ÕÏYV“Hߤtê@u2¢=JNðSáB<ìþ£°i<„M¤yeHñÀYHFX‘8‚œV´V´„W”Êë Ø°é‚FûÝ£z [Ì!ˆg¦œˆ §“Ì@ø›—nçPÌ@>˜æ L>KÅ$Òá@è`ÎQ®çˆôí7,Žƒ¤ŽD©"p@2´Ûo‚ª¿ò° ÙçÃRÖ3ØFAâ°ð-™0"¬TÂm(¨ïî‚—™$$¥RpõW!ÇÂaeÞ¢-€‰ŒƒÛ¥XIäbUa,AÄ‚3b ãd)éÊ.Få²Áãˆßz‰6¢}µH¶e„»Š9†ÃšÔÈša¬ø’YYÖÛLÂb}t(f˜ ê¯Ö5žK‚5òéÊÏ~vƒ.O•n~•. E %ò‰jÒ(ïvêÝYSåÞ§r“ͨ…»O ´àíB—óXgÌ˃´ÑŸkâ*݉>qà›8§))-}X² E1ˆÛå(âª4ÅÓd‚ŒÀxK}\§ÁNU2m¶ŒB¿åD»ãNtèÎ~H=)èXQ ‚N@“oà™tѮӋ,iÒÑâÿuÿî}"û©,þç™2*݆ü§Xšg1þs ɲ<ø/Pü=ü¿Ÿè>;ÇQñŒ&úË_&¿§á’°¥gkÚ¶ÕöîIGü‘¬íl¶8E;¡í k¥#bLbBlõ¢!WSðÖš”ž¶g6ÔØ¼wù›ïŸ:öxê´]EÿËáuÄÀq'ÿÎ ›ŽYêüyýDQK~÷ú=s¿Ôh|‡×§ôŸ¼<¡ë?vvÝY¿õþçØÛ½xƒjøïÛÇ^ºüã—cÚLèxmí¿y³ÉÈO6lðíßEOßNù{ë–†ÿljq}À«?.ùR•Ûçæo¼ryò¥Ãuë87åhgl5æÚb¿vvûqÛ§omÛSü÷Ÿ·NYGf¿øb»ÍQÂüÞçÎŒ>ýИdžôZväæß§/ïÞÒ˶tß™9Åm6¿ðç™/îgµ*|õ¹í.ŸmxéöðßoÜþØ)Óôg÷P ÕÜ“ûèç/qì3û †/ù0çäôG×Å9·û¢+µõ¬ÃžµåÄm82B76Åhéš»³F15ô¥ÃÍsþÞÿïÞ1ë ¸`ù{ŸÖ^ÚèFrßSõžymÀ˯l]dy}çöQk÷4~buúîØš^Í7o.©·{õÚù¿ú_ÿôfn•é]»Œ|zÍÙç6\s¼ÿê†|Rñœû¾îðOìêÙü–5ÇÎw(ZzÖ¨[ôǪƒ™]ä‘“¦õ†mó¯Ïýv‡!ñÉø£Úýüí®,nR´1k[•ísÖÚŸžÓ'»MÿoY¶®s­Ö5§¯ÝÔ塆ëÞ¸°eF“_\hX´¥n-ÛÔáé?¿î÷ ÇŽ®ÁáÌôãìóf¯ŸúÚsÍ4BÃ-—]]˜Â´>û|VçW,5­üTóãá'Žò¶5O.¸Žr®í7lØË™Ÿu[zÙqÓ³ô¡M›Óë®s2ò_ŒÙþãë›÷l½Þòò÷³.}rë©%uÏäÐ}üÚóùÞ¼r貸¿áÿ¾_KÍÛõÉ¡k\qsÝ¿þ³êÀÒÙÙ®›šî…?Üà{¼’¼çXïšw¾ÐùçEs—^iúÎ#¹Pãѳo0­œ¿üWê»g¶Ÿ7ž¸F­O‰>QuòæQ]·®Þ˜o5¨Iú…1-«Ý`atã’òÆ”ßô­×óôÃÏoXÕmÊÁ] &vyÔæé3r6}ÚðöÑõz«KÑš¶üwýwß_"¯zsÓ¸ûºÜøöð?»7~hhµok<¹¿ê…½/­i=²ÚŠÄ”®]ªþ8s_ò¨.“özuÉÒª-ïËwä,Ñ™–&Ë K6¿ð­¦ãñÞï]Z~¥W!ñú»%Ä7­¯»¤ã…ÿÝ|¼Ù[Ÿ¿Uïþ.®mÏ^<ÖòÔSï%'ï F5}ÏÒe†uÄ+·†j/§õ¨Ö¶Á™¯IaDÎ}›vd¤|ÖùD×i®:µéòqU×NlÜ}ò}û¼à:zbé¤!'mYó㮽ZmÛÌ~ÂϽߡZ;&­¿ÿµuï_âºÖœÓbN³«|ß¶æÏþeDúÔߨkÍ®ù÷¬ÙW6ÕVmèøåÙè´*c«ìx²ù;ÕÅ4¥šj”Sõh·Æo:ý+öu'uhÐ'Ï$þ:yï™W®NXp¡_gŒƒqí~¤-ÜÜ×ï«ë.÷m0~ê•&”=cjÂæ˜5£ŠF /t=º²ÿÅÙ%]¿7e±¯Ú—\¿x®ç~RÓñƬñE[²ëÿzͳhÜ{uÆ‹£š¬ýxö¾A¿Q»ÉÀÙ‰›w¾±TŒª»3©ãc^ƒÅU«Ûÿù¤G§œøñ›&­«Öyë_צ¦,˜·?þ«¬i«lËÓ–¶]½$¿F·+ÕêÍ›tðÆ…·6glºfâàš¿¸ ×ÅOn»§Ñ¨G–í•Ê­<úzbÌËɺ><ö7>º¼ºkfô»·O½ÿÇâýëΈ%âù×Δ|’Ûûí~£õÆ™u ‡÷o¹ÚoKÏù?¿ô|›~Ö}S Ûg—ì^Ó¦îʤUMgœMzï·‡û5Ž;·yJÌ´'.ý\­õôÎ}÷¯˜ûñÀnm>iýÝqÞû¶ïF¥OÜoÏLïÕ ÁÒÝFM±sÎɼáä¾µë7ë÷©þÄ•i¿ßú55¥žÙùdÛ]DƒNM©’µœ~pï¶êÙõæå/žÛ*å¡ÏÇEýnÕŒQ ·Ô tm—”߃Ñ9·r?_´¤êÆ×ÎÿòÝé£ã/ݾoã¸&¯^=¹«Ñ·ÝNÿ¹æïA¯=öôð~Øõvî[õæ'\_F 1¯%>Ó⳪UNL8ž5âñFÇóŒ©Ýdö¢ù‡›»`f”yìûUØì´U·Î߈¯É¯Ô/;Zrîµñ³ô± §Ï`ÿ›³tƒmæ—Û7¸ýÚí™ýc_’ð}ö#ÛŠßï>ñ³3gMeÛ¤^ŒîèïÛ®÷ÿ²ù‹îm°ûÔÞ¸/ÛõzôÜé1Ÿt®ËüýÏ §f4î9¿É¢«;F]móÑäܩϿӹ٠٩Ú^/¶iu Ú²’)ÜúŽ'ÿ «u™õÆÊGk_üiЗ½{uò{û‘~ÚÛþÌèC\\_ëö s&v|¨ˆŸ߸oüú™Ùµ«¦,íý»¡ýͶ«¾2æ¬Z¶ˆú¬NIóNK—êk]9÷ľOÜ^ïÝW¦öOÛ[ïÒµ·Ï*9»îóÅ·¶˜¿øK·¦w{nñKrŸ¹ùÛÓK{0½úYÒe6åýS ¿¿õµçJ.p³[rÃÄœ §6ŸúðÞ&™gÚwÿßûóÄ~–ó-ÒžÙ?Ä/·–Õ]ß}Rbâ“cïŸMÝœXm¬ý×þÓŸª=`ÌðK_?×óbµG¼°ýƒÝ¦Ü7ÿùᮓӾªÕ{\ÕÇ_´nÂùþ/°ìâXQûáÜ_žY8ìí¹ =¾\3寂þÿÛ¨Ëìϲ[4n9ýÎÐ'È3ƒ§Lxð̯¿ö¨¹‚þ:¶þÒñ[[½|¦Å­÷/nYuÕôã–7kùû‚Qó&ˆ?¡6/dçýzféO?ìu´þà™Ï/Z÷EÎÅK«?»ääÆÑ1-ÏþÔæ¥+d–¥éfgIâµâ¾éõsIÎφ¦œÇf¾™=£A£õk3kßïòʦêß×o—ØxõåÝ×kÖbõƒgF§~•Hö?´îrÂKݘõu¦ï¢Þ»Úesß²«µ»õËÏ/¾{vç„«SóOœ÷ØâÌ1ÏÍd—w?佦̘1Þ¸k5H_½Êη㪠G?3uÊÓ1†#=“êSó¹Wn¥=ùǰü×§ÍZ8ªæ'¹Cbê¦nybëtû̓'=hçšÔ«óŸÂ*cç9£64üáwûÃ[‰/§NúíVvÇÞ‰×ú6˜UoÁàwne¼píD§êz‹/û÷˜’ýoa_“…çg,¬}‘½y¢]Íyþ¾bû¹‚êµÊzhïª|í/FeÚžÿ,ãF­ÅÉk—MzµéŒÿÔø¤m\âÜÁ~ÚŠK™[?ß`úuÌ”¬ºÝ|yÇ®>û›ÔŸÜ¡ÓáÏ7Æäïœ`n6䨢’ƒ‹Û޹ÕSü„lùý†Bê’ûM}Þ¡Ÿöñǧþõ•óåo'?xdÁsŸ?ÐW;ŸvßÊ-2LoF×™Ú7éØÍïþØÞ¬„6 ¨5"óúg}j|öîà5ÔLV½ÑwÂþeÏÕj¾©¨UÂÐqo&§;x{ãhÓ÷óß:w­Sìî·‡-ý˹sã/ôìpæÒþ–9±=—·jRåɧFv­õÁõ#מ¯}tú÷oçÁkÃMݻ߼«5&÷«}9fËg'ìÝôBugßšjé<¾Šã¡ÄÄÂ䊚N—ÜZ‘¤qtïón³ÇÚêLsÛq?íùaYÝeû&?Q”FýXráôÇ3þ÷ÈÈþûGGשiœ–Pow·ßæ´ÕÖ×µë~òÖk;æÖ³ŸÚU÷û‹Ÿê¹¥åÅû-MuÍZÛ|Ñýƒ#tìÓvBíó;o ü¸çS»O ä¬…_l{¹¨ð¹­ÄeeÅ4ûºÙO.ר13º™fiõöéŽë¦Ü{¶ÝΫG.~0×r홳­¾=ûßF‰ÇÓzY÷Nm™·lêÐu®^±ÚîQ›®>5qèñfo~~hü¯û»µM^µòûú£×:óÛtã¹Ó몧muüëäħ6@Kùz܃t§K›4UŽyðÔSñ{tæÍVǶKžÑáÑá,ú*&n”>{RSÇ[ckŽ^¶øïÇŽýðúÀ§nî¹4fñŸc«¥d ®¬Ÿ0ôï­_W/9tä£g¾5å:~¼ÐÐoس¿Ç~3:®ÍèFî4MÜã×Ô·÷uØþÕ?÷Õh}²Ú†•óZ­ß[Û§ó•iyß%ØÏŽšY½Ûç»Æ}—ó$õØ7Ó^ù׎—´ž’–xûüÖû«Œyó 1vÍ­¼ÚÓÆ!ZMn¹ýY‡wË< Íòž= *!Á]PïSÏ‹Æ}ÞB°e)äƒ&ÖsÖõCéöè½þÉI_«Ñö…‚0õîs}øXŸÜ ‚r;.û‚€ízÁo7*¾É²ÂžPþzg¸ÉÒËéýö$Ћî*ìíD<ÜLIV=å·G\wUaG¿ ‚c6à“Š#ûïˆß`Ðvׂø¬-WÁíÆî­~¶ÂÎp~ 8ÄÃÅs8 £ÿåRALË ;ÂûëÄi€[ìX¸íŽâüv$ðÈvöÉ— ù`„ÒK¾´¬ÿÉ $¶V…½ÑùEPè?øÈÓT…Ë×— »â—êÂáB¸VP 8àŸêúÝPQ7h¿4wƒâ¤n0þ׌ßãÜvCEp“¼u%+;­"É:Îû© ¦‰‡»¼¶«hÉf£Aä)-C¥ª]y1&—Q´ÇtêÛ‡è’es8F»9ÏIèâ) ¢âlàP{G´‹ÆtlM“I"*C±ŒŽÔ£ç=m¦òáWmö“ÍIä‹v§ãi"5¦'úÕWÌ#àÜ1ÓšAÿx¢¿¼€KE¯¶w9³Ð›©1X‹žKô0Ø(¿ŸÙicºÄʳX`34à”­‘p¦‘c8"ƒpç1<æ?±zò8Ž-•Ç€ŒoÕ*G’@ÿ|Ë1¥ëH}©vY´¡—*Ç‘¥òt:Þ7%i¶TÅëJåA¼ß<–-ÕËéJõ™¨ÒõéøR}áH²T9./ö̓CU¥æ€*]ŽU¿ët›æq ópÄÏ2âŠÑ:¼*¡M²f؉aÕ&u$RbÞ8r jtÕœ¿šhõù¸aNléœ4 ¶0ìN¼h8eîùÃþñ±ÿµh–‰ÀqåÛÿIlÿGëŒçF¨BR#¨*Då= ‚øünÿ+£Åàpô‡õ5çº,°tF¨$ß JVº °ÿ^ ÙþË àÿ6úžý÷N|R³«aGS):‹üþ¸H“êqÈœ"T(5N.–Sãä¢D¨‰H3D»h5ŠÅšT‹!]´´ÈŠSÍV“XPTnÿ”ÿ¨¸XS¬ALR¾Ù$:‡-W$2v6;‘‡8³5“pf‰„,ìîq¶ üÀ!Õ 9øÒ‚Ðh4E©N'‘ÚÜ \&‘hÚ¶)b%S‡¤Æ¡Òð%á[®5>«iBÓb&ÉúÿØûðHŽò@x'ø‚árãU‹wm ,Ít÷<•õ²òJÚ¬wIkcvô)­é–ÔÞ™éqOVbnHøžNÌûaâŒÍóbøÈgƒ är‰1ÇÃgÎ|ïrcÂÓÄs¸ÿ¯ê÷ôÌtÏ´Fs¦ë³WÓUÕUõ?믮¿þÚ”5EDRÄ M¬Ð¡ô@âT‘:6ו†&·Î_I9%¨ kˆTYÜ’·*ª$'ŠÆ¸ õÚ¦RªŸ¡Ž„—²5}¥)‰°¨Î÷@;.þé@WWi#Ð>Xmvgø`Œ%qT-AUáh€‚e…$õªC Q±ÞX3¸à…Í…ÆZY)‘ËåÊ,%æLj™c=ªVjbIŸ×å ˜;­À/’!L«b 剾P†uFê=PÛ"cÇ–J°è„!(Šuý@=‡?ì+áô„R×[ÅzE,—)¬E÷(`D×%ŒRLŒ\@¨ë>ðÂ^¶Moˆe?ðÚ"HâÞX .>fä€èÝ¢¤µ3 Ò†A ßjÖ4µ$×먞tõ¬\,tíÝøtí3³Ä‡&Ã:¯7n@뢾­ƒZ¦–*Óù“WÌž\>µxŽkùÔKgOâãÓ'gNÌ.¶ìz‹3‹X03»<=·nGŒ;2,iM8…½9#ë¸z‘~t) ™»1…$<ýz” ™QK ´%²„’uII³«dì7¸d•²È‘v¦i™ôª¸€QªØBÔoë+Í"úÊS÷´fQS66õúY¥Öj¦j:©•u’)UZ W¯IlÊ;¦¨Ä ø¤„ª5^ܬ×ÊÍÔ¤àP9 ÅÊšºÝ<Ó24{\iµZa5R°ûB™H,ᾦ*U(õp/ÏV%׋’ÎÞ>æzcqþØñeüqôô≫Z¦f’Ì8·Wœ™^žî }EÖ7U)(’†pG¡)‰rÒšTPóFÄ Š=ÀbcÊ2$§fbÕ,>YY@"‚£Ó Ž"çÀ`Ú$†U÷(+ Õî¦1ÇLûÈe½¡UaXŽE60Ñ!а¶ãhÌÞJ­,Wèc¯É X…NJ& k œJ’*c}J—çÄ:ÙÁàõ¬DÖ5µB¡^P=‡ q}*ˆ G‡êÙúqíÒµš=ÿV¨KµZï6±’ï”Ö÷úϽþÏæöúûO*'n0Aхꔡ kƒ(U˜n+tåäîžã4U‡ß 0Óº®)k ]Žx‚«áç¡ö¢\rOaP R³K“K­ÐвlAµâ@0™°mCèVÕ¤(g•׎"Ÿù4’8ITšú@S°ù„¶núU›Œñ‹ –z¤Ç(ü¦5¿ƒ~ëŽÓû~6=ÂTw¤iý´OPø–î°Ï¶£VÓÁÎLP3 ·e?å˜ù»LüÖYfjúÍÿF}€ã 'zà!°ÎæPhxú[ûdmÇÌëq¼,µ´ï“©©µ†Ï2˜‘œ`Ø]™–$x¨£”ZGlH¯¶]µ(éûL4 »¼ÿeÅôÿ7ñh6ßSFYk2¤0g¢fœ–0SÀaG^ä‚‹­“YjÓYjXômÅ0AE[¦e3»,¯ä¡îÆÐÀÂCÁqŠ=e¤nt‚ÀçZ,ŽÎEÇÑéè8ìfj|iš¿lÎö)‹œÃÍ–ƒq¹kÁ€Ûí5J—% cj\¨´º­TX5faíö4•F ¶âI$–d™ˆåºÊ&.›_MV¶Úpñ«×ä’²®”˜½ ÖÖ¦,b¸,vFõ¨ZÛ±O¶‚UqÕ$–rŒ)ëD„¹E¤¢ˆgªdi|ð)ŒâE4¤PWÉšlÎÊŽZ ý¾Õúž³Ï} x¡Á@Bž‰NÈ…è„|Éä¥6!÷)‹\È—vUÈ—BÞãSŒKÔ{}‘¦À ~éñ/ðÀ=¥ꌄ¨ûö–¨ïé)UÃJÂÀ†{µŸSõÝÄêzRÕ§UŸ³ª~íFZ5NQ'ÿOv¯ý?âó¿ÃMÿ½ÿ—IÇ熘Úèßq¹¯Ð4u÷ÿICVÖòÿÉr¹'¤øõÿýv?u_›ØÌ:Ýý}º0–Ÿ£YvÄ7·³kùé3 KY=¬9Hœ\òÓÇe-ÓK»ã¶) BJ @—ˆÝ º›Î.ÄX³ AO9ààvGºË-àªÃz_B°.Û¨‚ÙaªJýol×afŒ{¯¢¤jAǶ‰µ E@NÍðž¾6d\«9-Y€ ‚Ê Ž’ Ôè á[ÍEhhx@oê–˜`Š˜}Bî ·àæÍA¬ÓÙ‡PÌ­®] Ì–Ò¡°„+ú†Åa L‚’}† 2ËDÔÜwCÆPp²ŠèLÈô]ÆpbØ¢Ú¤í0HËBôáâ Ü|¥†Bl'{Ööa[¢×‡'€ œ*Ü‘JœiìpDÉQ\j?ØØr’­€ldaМ „æ ŠæFU¹¦aï³ ög+k;9“úƒ5CoYjç=#?ûå[M󽱎Ud—>áWE#Ï6·ýÅZM–"ÊBý/ (¼yJKôB0‡YO"áUøM¿öF+×ËËy–Þå´ ê›íÌÀÊŠ´48–°O÷«¡ðÅs3æì)"œ¡W³dƒ ¯Ì׋sZ#,´ý½ hçO“õ²¸¤|îÀkñ.k¬Ãú±;°¬8a”†@5üØ4"n„E a–Ñ#Cšàt<^wnTÃ4p\ŲsbÍöÛ …„`¶"`SÕëÐá1 ÒN ,¨çdͽ[ÐŒóå°8f陌PÞ"ÅBÆËóU wõÔþ°Í_²š‹Œ`œ‰ “)³»H“u"òÑjš¦Âa$K5…Ó·=J²aü%rN4^˜óR8äèTÊÞ 0kÓ„Ÿ}ÉPò¯vtžwyV‹5qM)+:¬¬ÂÁŸwNÎfÂ"#ß߬Qrtf ^µÑ?v ®‰dô„3RMõ=vø”Gw¤7ä&Ø—¥”“iBË Îþ´—)‰ï:”°$oá'æPŒMØ0›‹‡p–©íâlt6x'6.Sqá.ksŽžr‹‡> Îuv¤":kz}MrUí´±Ðã£c°/lÁ ÁLÖ¨::N<:ê~ÅÿШ‰¡€f«FJÔ1<8‡í«Tºãþƒ›¥²,VI£Ök½Îö9—ݳS}ÎÃf†Óžµš†` óî÷¨CåtCWáím]ƒÀûJEVºó«¨‘E·µØÏPÜÌRD=ëP—u”Ø0PЩPÀiüšh$:Ü:5xÙšÒI4§í•¦H…"A0;xPIðñWuÐÀÀ8:ì ©þ°ïQư0ßvÖÜýÌ8Jfo2˜Ñ= â»ãÝ>¡!ʹ>QÎ90¦Þ kuÁ,ø‘Zè­ÖÙè#Ä*ß'Vy7Vç«b_x ¶"TKøÄ›ñ"Ö BÔ }¢–}ÔfêaA-+¥ü"Q-Éå°Ø ¶P»ù®Èe7éݦ®6xÐñ‰LP—›’«„þ‘ëh§±Ú¡mÏöi€p}¯*„Œ¹cß-à ý¶dðóUEWÄ2^XÏî1 hŠ÷3ò,î>°ƒßDP]ÅêÁ {Ä‚®ÖkÛ7Êý+.û(Ð .ëc‚ÔÜ÷éÎQ¨;$€¾è¢,Z‘dÆ1¾†ÁR°iܽÑg,eq¿8DõÚ)áG]¼.™½ ¿jøv¬›¤Yû÷.ÿ£Aœ`9‚[0àVè-•ëZ# ÈÁfNãòNû“åU#UUæt_Vø…]•+a öm-ZÇšZ&Œ;#ÖfA˜÷üª¢ó˜yj•Ïd­«Áá¶å‹®Sè‡ÌÍz7ëd‚¨kuµ,ë/Ž%îm_· KY3¾¼ËDŸ]>!Á6|¡uc³Ó8U ð¹èÔùP¥2.ÐBé¶,äÚéêP³’\ÓäF™Y]µ³;7Ð;ÃÌi­²$’%çš­;…áa„nŵ€_]Í0Û¨SÛ¿Ò÷ÁÇüŠÓðZ9b9»ØÑ!½%3ªÑP$ÚÓô¶Û5Íȳ޽½z|Ù8õ”€ªô›ïóœ™MSwþà¥í#hß×»°ûÈmž§ Cç< öúp]w²;Ì+Ö`?r=À&Þk_”,¾«ƒr‡u %âYWÖ®¾mku˜Aeu#¥uŸH²JªNÁìtõeü°ù¥­d`®1\aô\puf8+œ@§H”Z’¢å‰wÑŸ¡ƒK}ÄÀ˜á(+´]ÇiýâµkÚOôïômÜø¬*Ùá÷~Öƒ¨?s«úˆ½im±µOÙÀŒm¶‰mc6¶‹Æ@5_‡úÝ2h:ÜM„ž‹r…j"öצ¥'`:²v"¡¢®eO¾ñ̨iá²Ë$¹,ë{ôù¨Clñ ìµ$ëæúшÂÎ WÐáî5fAOƒ‘Y>T]¨Ì«Ð" Çx ÞÝ«*ŠK#èÈVüÚwäUª®Qô‹¿‡oÍúÄ»µÔr÷ ·v >±m­6‡m=ñ_s{ÿÓŠÿš‹ã#yèŸ ú ˜ÓÉÿUúgbú%yè/ ýãøÏCIý_ú§bú%yä}TèŸácú#¹éŸOýÁþå(ÉCndèËÿP’‡þüÈÐ_ˆé?Œä¡¿02ôOÇôFòÐ?=2ôÏÄôFòÐ?³×ôʳõ_,ÿCImô§{5¥åM¼÷ñ„Z:‹‘ˆú¿ú‰&$pçûŸR|&Å[÷?e„ì°V–‹ïFjßöÐÞyõS©8Á Ѭt–…©êzïS†2¯|òdñfЋž–é­Ü¥³è=Hé¤$–Ëæµ¥%;†ujTYåªyKªäÎÿF(öhÞÕùê$_à#¹7)—¥×&e’Rš÷E×ܘԅ# w9W†_%_”ùDÝs¼Ûöº)"Aǃðs ÷‘¹’Q–1 ™ã*ã¶ÐnÚFäôÁ¯ Ù eÁv¬ÎŽüÈ g"*¶Hv‘ n"2÷‚àÞL-PSC<Þöþ1¹çÿ´¸×öŸùý7ßÿ:”ä¡ÿÚÈÐ?öÿJòØÿ£sÿsLÿ¡$üïùýϱÿÇp“GþGÄÿ/öÿVòÐtüÿâýß¡$þÿ¿˜þCIúŽÿ_¼ÿ?”äÑÿ£ãÿÓ(É#ÿ{îÿ˜üÇ߆’ÚèoŸ‰Â參« ])ÓSQýo"»ìÿ |:cíÿ¥ÓÜR| A¼ÿ7ŒäÚÀèH{ç& ûl Á±*ž#sÑa3°w™;‚XËi±Ùè‘ZÛ„X@ŒM¶:©«™lÊeíÈ,Þ_MÔêæ&„û÷èþ&ˆ3\ªzV®ÖYv·“È÷iOûqd,)NÐ2ÜÊhßÜ(+klÿ‘vÓ^¡®k0Þ®UÔMįQè\¯XÚµß/¾ Ùê‚ÏM»V¨FtŒ+ ×hdÙ¾›a!²û~½¬n´¿‹ÚØk’\“Ϫ¥B7S)?tg®H¶x…O÷x9ú­£¬®âëÝvxƒî»ýÿ >ǘ§ú¦ªM­œ€‘+eýr¹»¸©ÉëÍ Àª«Se(;G‹ŽP¥<ÉNç<òdUÖYœ‡žµ@HH÷SõWÀk€Ž©•Ô$ߣê L¡S+|ŠK9ê-ãædMS© ü””ºqó‚dîrnª5 !êDÑÉ9¥\6™­7Ê—¨I®œ_>~êô2™>y¹rzqqúäòU¿KwmU(•·dÖ^I¢@³çDM«ú†#¹|vñèq¨?}Ùü‰ùå«0æúÜüòÉÙ¥%2wj‘L“…éÅåù£§OL/’…Ó‹ §–f' 3eÜ’5/j2)+Àh­¤‘\¶4CêúNÙ*š$K2 †qT­í˜[®&JvЖS „Å ¼SÅB‰¹¡ €—ö(cÊZ¥>¹×“äã8¹í¿Âèœÿˆ×CIúÎùØÿ(ÉCÿÑ9ÿûÿ%yè?:ç?bÿÿ¡$ýGçüGüýo(ÉCÿ=?ÿûÿ 7¹éŸÿϘþCIúŒÿgìÿ5œäÑÿ#âÿû +yätü?cÿŸ¡$üŽÿgLÿ¡$üŽÿ_üýw(É#ÿ£ãÿÓ(É#ÿ£ãÿÿJòÈÿèøÆôJòÈÿ^ú2ÿ¿,‹ÿ’‰¿ÿ %µÑßöM*««ùMæ’4)×ú ÜÙÿ“ç3‡ÿg6‹þŸ\Zˆý?‡‘î_Xš˜–Ô5y‚ŸL%¤wAªÚ‘Tl1(ÂOòdìrø±$×Ç^˜à¿,9½|”ð©Tfޜ÷Æ(Ç :pAÞ²¢—å)r ~.ˆr*³U%¬™Ú¨JJuã2u{Šú_*G¸ …³Ué¨ZÁ`õD]Ü’±>z]-h*ðe"9£ê3JIÇΉ„?$y=afRÿ¬D"Y—õFíÞìÌ‘f¢"jgÉÙjIÅ^¯ià >“%è3µC žÒT"1¿tе`‘¼”!²N/qÙˤְ~'î&„H–%ÉéY뉃'±ÔÐe+‡‡œ’¢••õ²¼me§![Rd¼²£ne¦ sCC¬˜9ÈAQ+C€ ])Kv•I-É’R.‹fØu h›œmÍÍz‡ÁÁ0f]Ãà`óîöìyŸö`0ómí¬ó®öÈ9í­l’¼ÊÕI:A·ÁªUšßµŠX•ÖÊÖ‹i€Vt½˜hÅöÑ¥¡[ÑÛm:í7vÑ5Ö4 Kt’ ƒ(yž!È®!d`rû2€pÙ;„ t*»:>L*îö`˜ŠO{0¥­=€Sqµ—…¤’¦Šº•#®º) CS]}f¡µ½Ï, Eõö™xUwŸƒêê!£Pëe±¾iåÀ[ 7Íaö>s0”†·ÏÀÐpõ™ƒ>wÜí‚vÌ1RÔA‚·ð@(B5áú‹%¼ºI6¤” ÌUYÇjMh%lÿ_WªÒºZÕé»…ˆ©+¦¢ÌêMh›ú¿“äÜü ©Êúˆ´š¤¦Öèÿ-¢¬Ëåºl½ÓBI±\¶2,ÕæÕbT³©ÔÐ4Pªt  ‡±L©Ê8ÄD‹VL.+¹>±¨‚ôl޲y]ÄÀRþ…—©e©KQ‡wËå-P¨%±sÉÄ©µ²rMCîR÷owq§FŽª ¨ß)¿cçf¹o×Πà=¸š®Ò¹©EÖF’„9ÝYwP¡+n ƒ(QÇò-å0 ¥É’ªjÒ’ob]¬(åâ¢ü#6ÊzZ´%ʪímZ\œ'õ’X–Gã0“óÕ­%Ìš)«q“)Ö u•֡؇ÌÏy»„Ì¿E¼/±x‹V¤o¹qÁÜŒëЪZV$3+>t!Ž ŽªIÌiñôRi”©v|UÕuö*ç÷jÖ'³SSJu ”H3¹ŽÝxv¥&ê›T¼HïC>+·ånªçHåÜ™ïls ¬Ixì° "KϸzÅÞ(ÎÌFÕ7[CÛ«-ÃÝ©U±\wç6Uõ,;2Ýë¨cJ`‡i$‘¬ª’Ì~7±l³¾ÆžœíÊÒFÏ:”¯{Uªª5£Š©áçH“T¯ÖÀÔ$Í}‰B®&ô©žØ—d?Ü–¼Úù 8€Jìvð†å¯sdCGžÞ·AÍÒ}ûöÙ’æš2A: ^¨«ø4V'”Æ ¶IJ[uö8v‰‘µ'¿8Î °#˜“€á /œ\’AÅŒv #²¤áHì³%ÕVˤ¦¤‰çèaz5+=Ÿ…çÖ {~l[¥ºjN„ÞZ˜H%xÜp¼°ÌXQ”®&˜ Ø£elb‘ã‘Õ·3LL²ü”‰à}´FV„ǶPSD³ðKñ²oŸS+$Ì×)-¶L6Q·kšR¡Û%°Aûï·ëÊ+d²ƒÿBCi:Xv”á§Õ%PÛ  Ê$-I1Èì &Õ®J¥²Z—QÎÝä”Ëe¥V—W±qÔvœˆÓ¶O®"gIEœm›tcOÀ¿L±$öm“¢kbµŽëþÄ>hzaZ—²-ÿ£%(j%à"ÙlÀ=ЪĄŒ"˜þtÊ©•‰z„½Qwd o]¾&±ï `fŠ2x`L æB ²^ïk„ßH\ZjÁbt2ÿ±‡´ó!ë|È[+ Ç À #®ÑX†™)Rl`ÍdEÜf?MÜ‚EßÐÜY‰} ©7ÖˆÕcE•p͘Ø'–UQ¢¬ìÐr¨žlEjª¹–A\‡þô9Õ¦»ÌE/µjÀdL:Q¡ôXd2*Ö)÷Uvµš VÈ*«ç\YVƒfQYwe²&6 Á´»´dѪ›2MXü›†{2Vý†Q´„Ëú,ý,S#&8üYQt<¦@íÁúLSÏÄæXof.S0SCVD˜£ë M&5i3<¿Æ¥ŒBq\Xš kþšFoÝ$ª¾)c|øbR×e¼@va‰œ·@ƒs0ö-¥„fRY¬n4@üÊ´À ZMÎꂪËktc‡ÃŒT%cgØ_s`žj‡w¨F©ÌÈHÆ>MÁP9ã·ûP–þg} §À€6~N‘UÅ´d3ûfÄÃâãrÄTé%P¡¦•`MÚÚŽé7ËH ÏV)jhU§Õ&S)(rükËY‚Ãâ\²˜,—8¸ï$H1ÇÆGYÌ^ë1;ÌÕ4Gÿµß§[»Ì€F/äMË"ŸÆcR‡ŒõÀ9~Ûs ¡ë¢è„¸¾(È“tÆlvÌ<éMOìŽ'Îd&3<¡ÿä&™É̽“\–äAÍÓ,údWå'óyúk%±M§z\ÓZ³½ëÁ Ÿ8C’‹xeüÂñÉe —H!KV€¯“—-r|†Ðé†åMÓöäÐ!’\j¬Ñá“§çÙ?c0psŠOZc'7õJyœ>ŒïZ/œPªgÉé“'MÒ/“X4bƒ7ÐÉåÒødRž öÔ´Ÿº°CGž¸«.LÁñy’,¶0ƒíGXÄ%¤à¤zŸ¤çÈÄaÂxÀo tq øÈfs€‰€˜šL b;>˜#.äHV€¦x’Vâ€}9œdiY°Yoœk9¨sŽb¤-b0Ò˜è‡I1ÛYðw§qÈžè‚r< 1]è ;KCÚ¡³¸\Ê¡´ðÉ¡µøt0åèFt]ua‹nâÈ ¼SÖuIQ ÕIõ¤)-¶Ž@Fü©JFÒ¶ŒÐ.ÅþpôÏîÊ ž·Ù˜vè`cÀâ 2¾ñ 2’Þ]á쯨·SN%ΧœJÜ~êKBë¨_ù€™$g‰F¹Ðt§i‘J›ÿÐ)%ËÄcñ§V(œóÈ7Î#|Î#ÀX»+#ØÎNUï ôƒÈHøÆƒÊHf7e„‡ °`éXÔyÁg|â8ûª:û“(:ëSVx.OyÍ”–šÃîrO_¼)4þä .4Ôà´Õ/˜Ž0¿ pǧ¡¹]ì‚KYÚ’°`Q 0 s]ÿrÓWëA'»»‚ŠÕ’xlax2O9û jÚO}‰Í ]õ+4<ù–u<Ö¨*`ƒy¯†ñå1Èú–š…“–¼=ÃŒ“ƒÙ¥@Wp< 2·»“ ŸÊ ,v†y›Ó¸VDXÂ7ÞSVŒ/Û óvÂ*a¤–5Œ¸¥ß%Ùç,tt²² ?'[JØïΞšÅ«b‚úÿU¤þ½1»ûÿAJ;îÿã2èÿ—â²±ÿß0Ÿ+äd^ZÏæJëy™ç²bj-SZ!–3|z¯Ç§ÝMAå¿&­÷ÝGùÒ\Îíÿ VÏÇò?Œtpafn‚›?ÿý7þY"KuuíêÄ¡CÉlŸ ¦_²˜œSÊèõ–œC^™yX’ÆÉT+‰í?öö—ª÷§žúù=úo§^þÚ훟÷ý¹ O}ÖmGŸý­×ˆç}5}þÂígï¼iõn¾yìÔ—ªÂ³®ÿà­úÖ{¥÷ü䨫ÞûÕɧüä¡»¾øÈGŽ¿ÿayb¡úGOV^p÷ï¹ú}÷¾ýŽgœ÷ðŸ\ô¹{¿xÏ—ß)|ä;ò[®ßùÎù½m½p÷=—¶.ùñ‘SŸÿöüï|àÒ‹_÷£/¿ÿ_~Ã7søÓ÷~í³¾¡’ýðÙ'g~ª<ðª©S_ûOU¾þÔ›>uåÏŽýòtñ‘xùû.zígžòÐÏþþ+««÷\~ϹûÞó½ä÷Æ®ýòó~ùÍGÿÛg>xÃüW’ßýËKÿñyŸ|Ú…Wß|í݉‹žtê™ý[×ÿëo^_¼ðÆk_÷kÒÆß=ãáO^øÆ ¾ðã~ñ–Kq_á£ÏøÒç>ùÏ;òþôWg³?ºëÿëG/zý7ä›*·ßódÿðÛêóŸ½ïg½çÿž¼îçK¹[îšÃo^öüûŸuíoíûù-3w}þ¶ûÿø/_vÞ™'^ÇçoÊ<ðÅû_ví·¤/\°õo{ÎÜOÏ{ä­Ïœ~páž/=óþÿpâÅyÎO¾ñΧþó³K×þý»žþý'¿ä6á=ÊׯOé|óG¹ ?ðš;oxôî·<ñ{ï^ºp«ðÛ¯½øöŸþÃáÿ¹û?¿ÿ×ß÷ƒ­¯ßòO·gnÕŸùõOìŠæò'Ýý·û¿süü?Jj™x則¾tßùÿýI/¹î‚7½ñ%7>ío:ûŽ?®?øîÛ¾{üÀÉÿÕCç^§úÁ¼ù“oÖÿöæ{ß›xìã/ö·ï8\8ó¿=þ“÷¾mß»Þ.¾UxÍל_ñSýÍ×î=òòGßtÃO¿õÍw>vå[¿sÕ_¸xÝç}ú­?Éà ø…\—5¸/“Í›Yi›!—wjr­«ä岤ˆ—©Û„:€+‰ä"ݽ#)¨E=Vä]È6ö’ëÐÈ‚¦––dýLøž$—åmÞ›ÝÖ-ÑW¹{eýf8Ž>£'§«UU¯Ÿ)`ÆJò(”¢g:ɘŒÑ Öh .¡ã­“äK©NÎPh+=±Ç«œP¨"ê"¨`³ ÁÓU΃ †DòÔÂå„;|بXðT¤ $Œ-0гhBÓ55bÐÜþ2œ-’ÓðÖéÅùN›\‰ä#†Œ.ºÏeõMÑit¾˜£c^t€ì€y1ŸÈ»Kóváeb]FŠØ{® ̳{Æ,Î~Ÿ·ß¢K’¬Í.-c›j]gÑrI~’Ëỗ¢V1ŠëØÌ†qM¥ù,—ò\Ê/W¥NEÆq‰1ïi‰b×ãÅqx•ź+²#Evfbeõ²x6²Ê¸Ù#9£+±úõI õçsºûJp£6þ4`w¬ã½â›²¹£gáeÉØe/ôDr©x!Oï“’œê…Ptã¥C]]¥­t»cü¨ZZ©» |Áâó½Á*Á`Àä¸5ý…Í…Æ!¼\®¬É™kTi~ݺÙû¨Z©‰%}^—+Ê+dãŽo’#+«b Å¥Ë5é>õ{¡·Eƺµhú9¶7d•E±®Ðäú%dI,N¯)P*áíîD“4GæQ]ƒŽ©G¡Õ?ÖªcN[½ËžXŠt)ëzƒúJ]oë±\¦È/þá­º®50øÞ$1r®7ú!„ÚR4½z! Áà½EÐ-6¼%ã¸FÒ8×™tÙªãÊ6IΉu²!WeM´l`J;Œ´@ÊÔ§‚|v¡µ®vÑꪱ2^Ío¶š½w¢ZáÚ,ÕjZÅZ¾Ëý½Þ°ŒS¤É³ÿ?:þ¿±ÿçP’‡þ{éÿkød)ý³ñùÿ¡¤6úwš7—h¤×~{ÐK»ûÿfü?›þ|:‰ã %Öý¿þ6—ÉÅ÷ÿÆ÷ÿÆ÷ÿÆ÷ÿÆ÷ÿÆ÷ÿÆ÷ÿÆ÷ÿÆ÷ÿÆ÷ÿÆ÷ÿÆ÷ÿÆ÷ÿÆ÷ÿÆ÷ÿÆ÷ÿÆ÷ÿ>Žïÿµ¿»ÿ—ÃxþWåþ_‡aÁe7ëÁ^i<¦œ}Ü.Ø0_H*«š\rÝ´fåOÊ TȹÞ7ÎUøµÐvùT6Ýùò)®¼‹àùT ¨²ö¨^D:Ò²ˆæ,Ž5gܹ¸G”eYø×LÆÁ+ƒƒ@iÁ‡å î‹yOƒƒØ£²Ú÷t"pŽNL× ¶>èÐmÀlH<ÝùtàÐ /"Ç:u›ÌæûìÀɯèÚ™5Ýél%ÜãYøKöòéþ/O'¥´ÐqwnXwŽ3`L=—ùÚ7B› Z3…ó©Ÿ[Ç#謋òÒôËp—‰hW§ ®ÚÁ±/¤°fÓ2ÞLá\EµQé4MøÌyØ€àž©Ô†ÆÜ*rT¯†lx_)ÇÎy÷ÜÖ¹«ípW;`˯ÒɇÝ^èl>%¸š?§ÁâbL;þXª–2‰­•Úz7.ŒttÅÜDTåDäsn"–t­Ü¦É`¸B:ñ-ÞÆãà[>Ä<Âg ÝM‰am*˜Îõ°†n#øSp4']Œ/_K›àwß–Àn¸Ýµ&  ®°»öv‘Ϲ»Àkˆzõ๋¼sã¹ÌPìó¶Yÿ•kˆ ÍyÂe¬)ŸÒš™æèX+ö{Û¬Ù^_ëîÂ6 òYZÖ÷É‚Ãnì§y°„Ò)’ãSýÛm¥¤$dÛí6§Èl6®çÇ„Ž—63 -}¢–‰Å@7oÔM;Ÿ|í9ÿDÙYŸ7§A¥r¾¶Þ"F¦ˆÀÎë(pðs)øøØ{nìÈSÖóaÀ<'äë‚WûXy& Ø~.ãiͯ*RðÚæ—Î^²Âà& ¶ã±~媮è;t?%h˜jm]xhïìÑc.+õÕu­ÑiìœÉž)ÝÙ¦Ç V¤U¶ ÖµY{¨Œ9o/syz©g˜¡ãEDùP2àG&l*ï|X2…LÓ±“Õ2¸¨·Ï²8¼0"ÉqlU¿‘Dd§vŽË¶7·v:#¤«nòïÁeœ/R5/éÁiR»Àòöಫ}¼@V6岯çësZ£­-gƒ¹¬c”¾ º,éyi‰*‹NmfxïÇEñë"í²¤w§ —%=K5÷¨^+ÎÎN¦óAšvÛÖjETª¬kßF³»¿tÂn2Ü@‹DK;¿ uš?úX½æê…|õ’æRŽ¥E:E—-BA òé(V/ž.l+V/X~õb8c$L¯‹„UÂöP—[TÙV:ÛEß|+ÛpÍç°¥„ýî¯ä…¨¿bi ó?)ЭîçRÖùŸ´áSBÏÿB.>ÿ3Œ”ãòÙTZä5.“+”Öxn+‰r‰ÏeDŽç…½_œv7 $ÿ5i=H=ä?-p\Ûù?!Ëÿ0ÒÁ…™¹ nRHüü÷ßøg‰ I¼rþÐ¡ä æ'—ÅËÕ“sJO½$çWfdŒÁ@¯PGžHlßøí+®:uÿ‘§½ò[«_\ýÌÇÞòÃÿ]úù_LÌ~ìåËOÿÜÛ7xÒÍÅ7½ào^úÍŸýø‚§ßÿ*òÂÓ'¿ÿ“ÞøÍÔï¼æáϾï9É_>çË_ø—é¹[Ï®]ùÐÞvÞ+.Ò­ÿüÒÒãû¾ø íõ×ýü¶yî/¶Ï¿þöŸÿ¯“cŸþÏ­Ïø¦GÞòÝwàÞùÄwÿÍ?Ö~ížo}ôâíO>é{ïxdùŸ.x×Oäß+ÿÝ·?ðÎ#—¶¾òê·ÝqöÑ»¾{âwÿ]úÕ‰{ÿúÏ{Qá¿~áCò’±“ÎÜüú[7žö²û¶És~ø_vžøé=r÷]µçš»óÂÿqݽ·¼)ý˹‡o?ó©ûþê’öªëžõê|öê߻㠼ò=·|£ðèõŠúèÿcï:àšºÖ¸ÕŠµ8©­T#.pq÷P‹EQDqTÈ40Bp Z«UÄYµ.lµ…Š»ŠyŽ:Ÿ«Žº÷ÞµÖñι7ɽ™„„¤üúîý•ÆssrÖw¾uÆÿ«×[ÖnZÊ­é»¶¿QvÿóM…gn[BF¼ŸtÜÿ×Q]*ýþa•¥ÿ>¾ùäÙÏŸ «HÜabSF¯šÑû⣈/2žÍ;»2*ëš*ó¯³2rS¦¼—Ÿ-ù®ç©~ý«öŸŸ‰ÎÌí²"oîÒÑWnÒ}âò©ç½‰÷Í´çÇúZÒ ÉŠñŸWêÞj¾4zeϲUCº…̪`pÀ¯ò©!v%½ë½nÔâ:FvU_wõûv?~º5äÌ­*Æ5¼¾£Âõ³f5;óà«Ûùß}xêð§Ï†¸d7‹Lg®$û~9yu\ÿ¯ÛojTyù7ÉnßýÅ}ðÙCÇ?®pü½çvåMO¹»¬Ná^¤Tè¸&{{¥Û<>Ð%ÿòãþ˱ºQUvýV»ÛýЕÔwjÔßó‰Z:俥—Y_f«ê.#çú™m10ØóÚªnU{t$›ÕžÝp…qé"µ³ãæY•žÍ¾ßÜ%òõýŒ[Íßn°ã÷×ÃN3ëìš ÷ÇÆ¶ô~¼mZÝvÁ·¨…Uß\n9£OJ\þÛÁ¿oµ}û”6ݶ=Lÿ%~v»Ý5Œ¹g}zòß• ¾º/©»'qaÞß÷×Ý­ºxNÒÖýÞ]â ?±áVðãòêì~¬n 'Aî£4\Èà˜ö!0&\{ð&»OO¥"AÞI5RÆŽÖ„ŒpõéËb”! wr‡< ^k^Ò@!}RU1ÁJu˜à™O?åH5ø]—‘êŽEùŸt…÷PŒK†÷ñKNV©ÓÂXî kíá5¿Bjóië-ãZ-ãš&óé‘ H“…qêë!ƒ¥`=¢Ÿ¢úýYäjy¢*N[nPm0>º®¸úôîÓS†úúj2²¹¹jv}PŒ"ËíZá FD»ã£9|îã~Ö¿o •çq\}‚an8pšýn{G×nÍ6#wˆr{g4†ZlLI›L%6D4Ü}in0ûŠh‰¾e\ýoáËNò4%œ1ÂÙX¾[ðP3|… ¿&¥"=F™êÕ%¸, ^•¦æ‘‚dL[”àÖSTÉþiÓ¿† ÀzÀ(¸ó(¾ï©R˜ûJs­ÝËðV{¸Åkíp ÃÇ/^.ö 篶‡ówÛ½á¥Fu¢Ò+À[7Š#S•±Ü‰XWØBF‘på0V¦y‡¢p‚û&Y÷Ž¢ŒßŒ†ï7Êr’ÆùŒ ly¸^3ÎG•‡ˆñ;’0þ-I‹Þ©5Ë ÜÎ(¼N/‘÷Uñçd ¼«’ñ¢Å'Ð_æE^8†gÎøÖçF­ª-|;ÜùÈÛøM„+gvÈSÕÜ`ç…‘*ìy ìÿòÿ–ð_œñèÓŸý'ãÿqþA¡<ý%ü§üޱ‡µm)ÜZ¾¦º<ˆŠv‘)PØaBŽ€ùJ@f+aaÐΊl^ã1Ç%&D·¡t¡”ÌäPéYÃ4‰¬g ¢`é|%p 8/ ± -˜‹ðºù‡pÜp¦a¬ð%\ô“‘B/9”£` :€H7ë ¿Áí`§R—l-/ÑbÉÁ;ËHn±Ôví£ˆVˆt¤ÎyÚ‘ï†Veg× ˜À*aNSЕÖkG»«²¤¥GFÚ‘ÎR(F³h{6îÎ蘜.ý'Z†:`kÈ'à£C>&÷N ñöÁÈg©cFø–Ò‰gŽz„`éÐ2»–él)Üj£·¬üu§Ûp7x+Ün Bó»)(¡¿›‚jvSPÍn êXqË×Á깂¿Àí… ö]Ë·–RŒHô’ kŠFírO(‚ŠDo¢*ÎyrWÓíhÑbW¦çæ´Ë+±¿* ó‘„f†±WƲô{%fAL­çc¦ ø˜ñ1 S$ð,üp(“‚*X¬ƒä`âÀêíâP ·–=Y{ÒpÕH;šB¹=b{ÖÌGŸª”+Ê’3mG£ÖvM3†4…‰Ï'pIá@—¹„ã–ñ¨Ë¦:}F7‡àéÀqµleIÄ% w-û²v²¯FœiE°— ¦ ºExpkaëÕÀÅa!þ––‚:AƒÀ¼0wXùÖò1Š8r¹€F1‘&¢*h"˜tÌi¥Ò3½``U¶² †ˆbšZ‘ Ò¨Bƒ g¶¯èøÅ ¹JÇ0Œˆa¸Årp29XßÁ*•)!¨$®z{ô-…[Í'VŸ ´‰OVä)C9/xÊ0%øÆ0§•N¹>±»*;Ô‹Èa—§¥)SÕb›Q©ž•чo¶Yì¢1EÚ…æ• Åpº…ÂÎ,%–ü9 Z Ì/°:¦p«—ÍÊ̈«D¸°‚DBçŸóšä7«Dk $MËhð=E@ánÙ§ø£€¨£wÕq`Oìz‹ŽêuµÉ·©üRÑn ‘Ô#"Å‘6""EB¦‚þWQ`û_ŒL]×8Î:ç2»]þWé /5uìÝK€Ô!P1uà7D›c9êàŒÞ™aœ?2Œñk\`ö †ÁP™Ü´c¸y³ }ÑìçN< “Ÿ•ÙÅ[¶nµ)áàü¤H¿S$)Òï0%’òiŸ)aU6ïÒábS‚¿i`s› ñPz[BÇffˆVJ>6Càr=ÃIø´Á8ül½pÈ ÒƒÐ[«%ÌŸÝtLáRé1ý”ÿËJÀƒÇ2þ¢Åÿçðÿ0â£Jø_Îx$šÂ¢ÉXŒŽ¡qÂÄàŠ¹"‘Ó¤g”ÿtû¤Ç±OéøßJÀƒ§þ*ÏÿCq—øßOÙàÿ¯ 顺BÕÜqgàM¯/?~½ÙÝ+´îM9½¥^q4­’>» áí˜ {·ª}:²þÜ=Wgzª"¯nŠLRÿôл0çìý)_ç޹½yø_î©Ç]H814çæ²ìÛ5Æ4úi[ƒ‚}þT=-¾qåð´Œ+®zéR9sÿákß>š9ïHŠ_îqKFß3.ÿÞØF;f$o^õà·ø¬ÞOÿ&¾Ýrilõ¢á¦›Ø1*`vÖ¸®ËC>ˆùv¾.«c`†Çá 7 :DIoíØvì½±[oúªýF­ÛðüÝ»AIžIEÅoÖ}º-ÜCYsù—?μvI4ýî‹ÌOŠnMšóó ·ÂéYM¿~8ðôݳ¹_íÔ ç“Ys»‡ä­÷®r¸ ¾f/æ%­®ñbj|ÞHÿ*‡<›f„?ùé¡AÏ(—oj?­ª–Ÿ³økW,´É¦ÿ6õUí¹2æúš„ÜÃ+Èxº¤°0´ÓÁ¸_N=RyH¤cŸmCl¹n[Ä•:EW« À†E$„ `:.êUÿ·Kõ¹±‹h6 QìÆ àÌ!{¾ìÐhBáÂ[.¹_™Vœë9töï^Z”_¥hý–v—Œö™þãÑèü<ÿØ™Ok/éñG@^àûGãÎîmݧ7±Ýód3û¶uU­˜v󳆙G/ÌD>ò+÷úTÕ;~Goß;íÚàß"“‡v@‹_vW nº³WÃîÛ‘‘wO-8ßfs¨òË5a“ë}T-üHV•óIïÔ[=qãò¼õËÃÿÜUíÁð/ÉÝRθyX?mÚ£öí7›‘~¾øÚ˜uóO=òô\’º­øM“W‡Ø -èjß5k¶£`΋æK{Ýëòç¨ãs_JøHU›\ÐáÕ´Zá²#ãrFÉ·i}e~½ùþmä3Fû»ÄÆâ *]ž€¹žzzíâ³Ø­õVœ­’Ðsò··Ä}'1ÊÇ_V¼yoæ±ýKεhür®llýJîPØ­vûšªi_y>Ÿ]ôÎð~(°¯rP׫7/]l=aŸ¬F?rzý-íÛ¡UŸýµôèñ* 7ÍX%ûñ@dåfö°åu¾yîu âÐ2ߢýª5ÜtdÌô¢¿ŽlKù¾è`µ”Ü©þ•GúWìprÔçASîMh7eïçŠâÌQ½b5¯Õe¼{ŸAa+™yißÝõE÷âÆiÙMX¹`؆êagçFøNÄ—Êì!ùk_÷k}g÷Síò×õ¿YùêD²ûî ' ª»¬©_»6¡ÇûþYËýZÚ«÷/ºüÎ…›Ö)ñâûÛÎl>³`Þ·MŸî|Ò8cÑ”nÝ?ï_¥žWÜF—Ö~»‚ûE?_s dj¸ÛÃ]©9î ƒîvlö¸ëÇ«'ÝHKªûÃÜà•,«¾zêË'ûâ`ãŠçæ}ì™w«h@“€NëNNh¸¥ö±EÝ[th˜»øãÖ®÷‡Dú©Š/G„,vÉùÏ¢ÝYGF|yÂkàWSþ¾ü~Àã™®n]ªoyoúÐßâ”èP¿¡«R²'|ÒRÕfɤ ŸTx³)¦WzÖ‚·¾§rw}'ãiVpÝŽlí7Ì¿µ‘5S‡M¼øþøŽ»cÏùVÛØŒ%_\¾4yÒÒ‹í•?íÒ¡uŽï7!Ÿ`m“'e>¼¼ïAs´×ÞgAžÕo4Z?úyËdþ¨ë€3NÈCÓ×þÐëIÿ)²™©j·EŸí<ýsîÊ)ƒ|iT†2ŒÑ;3®ƒ Œ‚¢`pSŨ-˜Q[0ZÜ_ã`'t ÁNfîĽ>ß3¹è/÷W×ÿZîmâ•A¸à³e¼¨jàÿG—›ø„ÿÁýcÊ ýI‰þÎx è¯(7ô§$ú;ã1 ¿²ÜÐ_Šÿä”Ç€þå&þ%ÅrÊ£O9R^èO`ýñÐ-7ôÇ%ú;ã1 ?Vnè/ùNy èÿÓñ)„”ä¿#ú‘îšž”ÐIž<4**F•˜Å!¡—*$$°ùóEá¨>ý1'héü‡3žòÿ+Å”â?Jñ¥øRüG)þ£ÿQŠÿ(Å”â?Jñ¥øRüG)þ£ÿQŠÿ(Åü7ÇÖ€¬‹ÿW€(êÿ&þ#Ê –ʈ ºa"{€|¸…8"æQVY„æÖž´¦V›½]Ãt˜–ð\@s¸–Fˆy´æ ˜—Ë&ÄÔᙄ%u®½‰º“š>Zè˜=k#KŠâåè$‰ xÈzÊ4­×¼Ó6–I³&ÊŒJTÅØP®1*¨0°.!î!WðWÞ2]Y¨Bø…¸L’†+sÀ8‰æ 5À‘@ŇIqÉ®WrŒ*)%­¤AÑ{UÒ<ÀpJ<`Òºy€ -k%35Çá•a4hMS<ãù¼ðâ1b+ÙX«ÚÉýëŸh,ʲâ1MO2?„°l“E0´¨ —F…ÍÑGE3] €: Pªƒ9æ4Ñ2JxРË,j²" ×o¹¿\-/©í¢ª;A¢úèÇq}I0h°ø‹ÉŠpÖqÀhýNñb¦ä^ ¬ ÓÕ¡¤ãº‚ˆií§Pð“ª3nªd`Y¨†ûŸåÙ¥Ç$½·‚†,ªß6~®XÝ6Ë“ÆÎ¶Ñ¬~Û4S ÔM,qF8´”Œ2#R æVéE é$ÑEàΑ.8jRX[D7­±D-òOOJ±¬±ÌŽ Ø& 0žÉ‚¹cÐ){&¢ÁÑ\r„Û¥ƒQ°) ±•\î£`þJŒÜ—/¸ä|×´6 缾Ú$"NØ€InU6¢¼¢…XŒ^üÐw0²ZuÓNæ«Åã„nêÈ„¨gŽ1kK1Ÿu¦ªE  #ˆG&K6ðKKL߇âN˜˜óJH“ã§m4( Õwž’Ó“,¥Ñï} ®j[ðôP ià×Ârs‰¥£Ù"̓d19`Ò^r´X/ð“Û„Sci6 Çÿ±w-@ng:z﬷.ßøêwìþ»£§¤ô“Ϲ÷™Ó¦>ùŸ­¿=¾ù¡©¾kÑ÷/¸ä†5M;C3.·«åší/;}ÏeW¾òÛ\ש ;R·ß¹.Ù²ýþÕ­÷¯˜¿ê‹M›W,¿þÙõ7îÎÜrSÝÛ6ãIf?.Û,½éà\¶ÉØ/Ûdk^¶ùu“&ý;!ò¥A`'¼˜°Î±Ãþ\›YãjB[¯}z5a2­w5¡QäåÕ„ÜDW’Ã}£Äºª®êc¡êê?&‘¬ºæ¯ÖÕ„L"^}]![#gª¯?äØjYÈVåÅmyÕ×r“\xöÑ3½×.åŽ~öø+μðé»gWç¸. d!QOéòÿxßÜÿÜÿå ¹ðùÿàþ/OÈ…¿àücÁý_ž ÿ¸oðgü½ þ ßàÜÿã ¹ðOúÿàþ7Oȉÿ€î ð÷„\øûçþÇàþ?OÈ…¿î î÷„\øÎûƒøÏa þþ‰ÿñOÈ…¿oâAüÇráïŸø_ÿñ„\øû'þÄ^ûÒx(UÀi]RR)ÕŸjjäƒT¤ŸP5 5ÑBÈ@ÝxkXIãR(%‹XŸlv•R’’Á£TRN‹+L¿3I£¥R¨êÍbD ¤¤åb9iY,Рª¡¼¨$eˆæ’QFÔÅÖd‡1 ²¤¬§/,Å#=R®Š¡j¤C ¡~irS-f~ª…”ÀoRF¡ÐxJ×QêôróèŒ9gt Z gϘ{F‰6T]e0­èò„5ŠŠTÐ3V’¥ +ôˆ©–Ey©~T:+j«R3ÆKµGZËhá¬U©!­†™èËä“ ~ÀÝ(ê’Ü0 Ô¢–Æ3Ø p5K*cMS5è¡Pg¹Jç1è›’CCš˜ÏR ™XÉZSxHRÆ¥¡¢†K+õ…Ê9i¬èX#ªŽÅa<œS38”* C¹KéÂÊ)£gÏâ>¯÷Qk0€ë[ƒþ~ò:p!-ö$Qnº’**6iÖEàA p!­Iy’é‹P"ˆ/é8·²­¨gU­µo1´V`} – ^©¬†ÇsÐ ]m•¡l„}‡®:ac΀ÈC8¬`½Dñž´ÀŽè˜•Û¯æ\x Fªµ ³“T]>BkǰŒ­^oV* ¼¦È9‰X¼¢HH ׬šÇð êHÒш$Ëh#w°(Ÿ‰ &ZÑÙ»hÙò^Ô¶ô|´¢­»»miïù߆š0LPЇ±ÁGÊåe ØŽˆš&*úRÑ’ŽîöEP¿m~çâÎÞó@º°³wiGOZ¸¬µ¡®¶îÞÎöå‹ÛºQ×òî®e=aDe¦³BT2¦ð¢†‘,ÁL+@EÐ ‰h~ÏTÐÇd³(Œz0¦â´«ù12uìÓ+C¥¦ÅË@»ÀâvuZCãL't\.ó£sk¹Bøð­ÿ.ÿÏ7ßÿ üoȵÿ?œßÿ´ü²ÿ¾ÿá Uá?ÉšÆùý…‰÷B”å£þ\ö°ä‚ýŸÔ<½«§¥-£à.Ì„š›Û5L|™V”Qu4l8ˆ shÖxèÁyÄrˆ‹¶Fៀ–÷¶#Žab³áÍ…ä­Ytg#âß@^¯¤Ë¸ ]â.@˜lJ†ÔŸ¯ÂB kà|u´Ecä_‚I¢X2…J¦]ÍåÀõ+„ àU’úÄ)éÒTY E¨ú)­“Æa…‡  U2©û E X/拺¤°h<”µÕ¡H‡’VI«ç‚ëË1q)Æ(ä*eÀcîYfp¨!^Š!Ø/KÄ/e”/šÏ¡“E¡L1`AC‘¶3ÅBJLƒ£dæp“–´t17(ãQ3›‡ìŒ›é‚T03È·eØz;9d¯ifD!6*«JEÚÓ8.˜XÉcAŒ‡€m¤£Z Øu¸Å`AŒ‡,ˆÑéäÝî¬Á„é¬â}ítð‹BÎrw5˜&‘óÄ¡âU+f`?Žxx²ù"½/òÐ[±Z:šÝÍòЈh½ }²ò –h‡€!Ò®Ø!B DÀÕ"Ä`À±[„4ŠÂ<ŒHN~ ¦Tƒ#Uñƒ~J~´Ikª¨›9 ±â˜Hˆ¦:Ú€Zݦ¢¨î6è¯êlú :Zˆƒjv]Y3Þ*:1)ŠÕmÆA”¢»Í8ô¡èh3mŽ9ùÁU^D°wk[§#(€¨@,"ûn1 šŽpYËÁÈÀúÛ-Rm¸Dx’ŸAIÉ ªŠN2V†`ƒ±LT¥ú8ð¦ñ/Yع6âö•ÆQ^ÍÓŸ’±\Àæ;%²eÙÌ0M›ÛŠQËV¦tQÓÀ¨RÀ“2IÁDÄP‰VŒôJ9\héVA{­o¶²N]„ LÂùªœ™ ¨Î»‹°< 5-Ö/iY6 Kñ5j¶í,®Ç¤6Ï€~½üºWÊk6m/¬Ã -cQÓUº6•Ѐd@ª,wÝåxQ+Ù©¦a=3Â5ÃÒX†˜P$­ªZ¦…À×2(æ$y 9ð£RÀ/±(ë“Ô¢œèT­æiÎâ*¤E3šˆéT†{HÖB‘N56Ìì@Ô~Z”¢‰L~áÑ4™üÃÈý’QoÑŠô-çX»ðpUe)º±²ºMdÀF [ÕÉÀ´F¹ZÉeª…u_UuÝx•­õªP#³+I#2$ñ»Î‹z–ªs¡©«qUnVAãDÏíùvžd‚#Ž4(ƒÊÒxš£UÒí€=³¨ÔÌÖˆïU•›‘Ä!Uå‚3Ȫêj#hÍëÄÆ¤ÁÓP(¢¨l<“²laÀHÙùâÌФu輞¬’¢æËU*f~ì’F¨]̓«‰Æ›š‘„.B4U5EŒÛl‹\dOHö „À¿1øF^ùu édN7 Q·´©©ÉÒ›ZRÈíD9 JR³R³f#бDx¢ôpÁHÎ:³œ‘+?5Û( ÁšÚ"k€C3¨šÑ¦A"SKI?BM–¦VÄ*UÐÌhâ;<¤À ç3$\7PöÇáaÔ,ÕÕÊ’C Nn(R.-#´ }kFÆT3!’ £GËl£IŠlI£¾•QI#Ÿ© pec@`À /¢ ÒÌñ¥ãÒÔd· ¡Êët Í!,U¦‰:š×¤íô`4 Þ#Xÿ±òçhAZƒÑù ŒxÐ:ØvÈðh6ÉäÇàv„!:IK£gV†¡ÕCŽJiY-`¢çN8±,Kùî'%d "Ú˜}à´Q{ÊQd/ɉ0f£ÜŒÌ_ð„šFÑÒ5Q)}¨ ˜B+†Õ¥Ó–…â ŠZf®0p ªd %£Lízjf;b¼!‹cX£Ê[À‡šV¨Ӭ²!Ì"90D-(k!ÀE¦Lµ¬Ï\"ÓGž`3NÀ?#ÁÛ‚=‘0}!›à†!‡4¦cVQ)C°ñHN5+c }Qsf…šœ¼Ì ,*ÙbNÍ=c¨I”U1C§²ÍÊódÒŠ™+•ÁµÙOw‘Ýl:Ëx©J¹O–|Äɤ ѦrÅ}¹±b>ïè+dÉêˆ#ËdX)’uG¦Áb2I7­&M]4ë2×6ÿÇÇH•wýe§¨‡lëC°]¬åÙT,bˆ%9I'§8ðfögš:R›5Z«ä&V±9ÖèBQÃ(Ÿ$Î9Þç?nˆ±võ´Ð=^Ã:/UÏBô,øS ¤‚N]-©¼=…˜®Z%4NBIÔ7‹#67󣨛Yœ™sæÌ¤‡3çΉ â Fªr Åx,8 ²Kiâ&É¢2Tõ“iÕ6r”ÆY³ P+o_LéfÍ™3V$ÍZi|VsU›;·N5в ™jQÙò³3$V ˆTX´¢‹äø¤u©.ÀÒX1Œ˜Qö|1Ø”VLzLhÅ‹ ,-kgØ7ÓI i³”XhU§Õ E¶ß–ž…X’ƒì[–Ê” 57--f ùè³öz†æ`ÍÒߦâ×hÖ*+÷ˆØf†¯¸,› ÉòºB“œ™dì kÅ!‚L(ÆÁkÊpvkG‚†ŸÊÌgÕüÚÇìÐÊX8Æ!ú+.?Ä fa¦€í§Y\8‘0²è/ë%Z@ŸHÝr šÅðVµ¾Ð(uÈ~Øô‰2°Ü¾Ë„ã|²°õF›MDQŒ7‡„‹Éò˜Ò¤`&ie+9¸nQns<Ñdf“,´–0á¯|Q†"Ná¢áh}@÷3µÌEõÁ£;JUâd¨âüæ£Id.¹Ö€•g|Eˆ„É(JˆƒA‹ñtü`13Šc`Åx±ˆ°qÁc–O0p†H¬c£·oÒ6¢–„$É™;ÉÇëN™CÆ¿ÜÕI‘ŠZ혨5Ýš4§;$¹¨5Ý{²!í:Í5¬]€kî?g•¿cÊå2~v»Ù°^Õ†­q½ŠÇQ4Á dñDˆ^ÁÈ™z%‘}@^–ƒ9 cÇF±^‘6kÞ“¤µÒRæ€ôª!þûªWü¡Õ+ñBÌšèuÐ*!jJùð?«0€˜&A‹1RDZL ÔêP>¤œÊ(E ¶H ŠejWƒù›ï®6à Æ.h¥5#™Ü›Ïßÿ(g+?C1d8;?Q5ºqU>Œ74ù)Înšæê˜›ÀK‰bNjÁÔMÇ»B=’ïW¤Šà °1Ep…·´ì’Ã`œ-A ¶à¡„€í@ åQ’C¡¼( ¦4Èc#T!&PÝŠ® •7‹›'jè ¼+D4hYƒEßãI@µ‹I8#L4P#_4Lû0ýƒ¡ ÅǨb «üD•ã˜( š¦¹:CØ'ÄTn 4!RâcÞKÁ¦`Ï%‚|è«x?8‹¿œÅ`Sœ¥ø¾ )T8¹‚)|<_ø\ö]ð#P¾ êûÀˆg©†±ª·, ,MžßTŠÂ2 £˜˜ŽÃ- U8„àÏ:€2WH¸E«ú,}¤:1Ò´:]ÐU'LUÏaŸÆ¥4¾(°!m‹ìÖÖ@- ÈBv¶Ñl½S¯[¾åÏ{TÊ[úAQ4MËúO ¡‘CŽ*a Ö °^á0¯ ƒÎwŒ—NI°ôÁXz,ÿ`ŠTI>ŒQg¹ˆJý¹ˆ †\ç8)Äù®Uý§•à0¯è¢ Rp’Ax@AK1˜0§Ó8,À¨ªMM.¯Þšƒácâ°ÚÕßpˆFS 1œÑDc4€!`t DtxQ+’¥ ض‡}‹æTv”ç¶Ë ­+€ÜU¦ò}…(Œ~å ¤ r)„:V=@[jx$ÈÖHí£§jUã)-Ø¥„(I  Ø+ƒBá&rú[زú*…z¥Î¡Ö˜TäFÄAW;òè¬~-ˆ%Ôµ ‰¥†¹âR Á‚¯ ¬…éÖu˵¡ÓP¨÷wãî 1°´¬¿áX•¦‹˜h0…p0B±Ö+¨1:6vÁnG ¥¡ˆ1”Zcå*#h¯íêo<-šÀ®A ¤Åƒí ÐKÊYP|kúÉÙY¥”nœЭ¦Çyª )ƒ#šRFˆ¦§eýõK±Ÿ¯H¹q¯Hu‡Û†s|8_/H±+·‰'8ÞEõgÅé.(¨I¤~×~œƒè}ÄÍ¿¿:~>ÿi¦¬ÑÇr!Hçÿ"Á?ÿk†`(ýïù¿ÿÌOÊȆ#.õE ǽXc˜–I½Zæ‹0²ÿuÿþýéö×hþŸ-ómluó?Êþxç¿Áó¿1#þåÿâ××q„Ã@Ô õͨX·WDŠq ·¿ÈÆF2†Û'ÕEÄN¿pê‘ÄÌ•¬R"“ÛÚµBî5S¶ã”ÛØÀ>IÎߊ/ÝW,^&{ñÊD|¼ƒ¸•{JË¥EWó<šoèž_^Qؾðˆ÷¼u§²öå]?¾×Œ”¨Ê²Øê™AóU(\'YqqÁÔýow;cý®¦æÑ]í Æþ¶!ö\ü,Q\üî^•Î…5#kӳ߼|˜?wñÝ@ÏK[ÞÍ_°­¦:sªKÂóLÓƒ±Î±i+ž=y~+vjô‹âC‹[/5­~6$:éEq‰Ï…piAç¸sƒ ægüTRÓ¶@^yëë˜ùó&ÏOk^üß·{Ô,ªÊO-:{¬ùòšÔcíJÿuÔjóÓ`ý«3Ï›Ç=»eòàÛ€Âa‹§dE¾Úmº.é÷¸Sne7Ÿe¸¡»cÞf„•ìX÷ØÑ4½ðÕª;gÜlU¸ëá!‹SêÌN=Q´°ÜeYô½ÑC JïsŽŠõ~Úÿ¥ynnö¶ƒ2^/©é]tò£Š_|jk®K"[›Ï»»%¦3=ømè…Ÿ"%E•§æí°Iœ¦çÿ…iJ»SÄO‹Bö¾™•0ÕwmЋ?·6“¯žÚ*ñNeÏSQw,¢>óeº"僺÷ð¼?´5’úËÂQ]“£öÚY››üøîR…M¶å”>hÉ…/¬.<žíU|vg”÷r±Þˆà¶ñåU¿]Ø&®wò0¢Yçszé>Û6^‰˜0 ¤¨™qtÛòÂVÆÉG†Ù¥˜ÝÞá¦7èV¨¾KëÿL¿ªÉ<óçžÍ,7ô[õ•^ùíö öÅø÷ ¨µ;ç?ÄöË ÍMM‡67]i©ßçµÑÝ‹]* Œ1Ÿí=zÀ—Þ£{9o±Ñ&â ¬ÈöµÕ%Úiàì«-¦û·û!êAì/+“"«ž-u0¸°æF³~s×î51÷ÙŸ³wèÍ1Úv,zOäébÊŽ?#´ª[ÚÒÁ}‡ŸÏßÈ\wñ-Iþú¨Õ¯ôD1®7f¹dR©ïžln¹iµeÿ{‡»Þ?{ÜöÈä-¡åE™OsÌgÍ4:y¾Æð éäa¾e‹‹÷Ï=lZüâ5÷¥Û,òÎl¯­?ŠÓF8]LLÃgY/)›¸ñbÜ Ëofï|”yÝàô¯ñîë–>¦RÉ=½*7ÞºéÍ÷«žY_1c6ôyJÛÚû5J“"ræ¬.½oÛ»Æ2ðówÔÓwÑSW½Qm/Yt:¶¤õZ«€äåýÖMŽ™°AÞ}Á(í{œ·i²®¬€îüÛ£¾âïzV´©¼6øòJÛÛåÞNu̽êßëKëÓñ·—¯ À&wéõãÛ)/;­ý¯R;ÿó®»U˜ï*˜X²·Í¶òØß¦¸IõE{Ñ@+Gƒ¬Ãž^®4Šñ5Új.*i ó´ÔåÇâ¾Cg‰ÿòΜn•t`å¶Ëíâ²Ò1y¢ý³kÓ }Ƨ¿uu\}^nKök6.8ðÏÔ17;Zþ•_θ5$èÞó„âC‡øø¢GOOþòø\m¶4mèól½¾O _ÕnÐ×Ï|´FœM¼ ot'~™g¦4o[w$ÂqÀøi¼î°<Ûµó’M'É»&ëåŸý=ØðoGÑí<ëef¡QÆœîË; JsÛòóËþ'¾Ï|1῱"CqÂ}Yûì^±Q_Ù"Ùx÷kÓæÛe8ŽÉM³pç2ØgÁ†¶k"R[ÜšÓîhÀɇËÂÝb_ÿ\ñ{Às»¼¼²Á“-Ïc}úßó=Ðqä–ÌÞ¿¨´•LÍÁö?ÖgŒ™q€8o׿Xrí¾m©·oÌjâÐsÞåøù ã¢M‡VηˆuÎÍY*>ùB4j¤GZ/ìuß4ë7XëßlôòŽ4ßÚ1æÛ?°£Z^¼{;jG‰ÛSRr"qÓùû“æß,¨X5ÉCŸì¿õ¢ýúÚ"ûÍw’rÜ3ÎÌ3_ñFË\ì×1Õ·Æ®±²j¿úÂÞžµSZ-Úðó5ÃsG&ûU] »w6÷‹bçd‡DýJŸ½¹ }6[²1÷ÔµôÌM•Ç,-ß^^0R>è–}îjÚæl@¦é‹‰›šü_:nÖ¾·VóÇß<öµßþ˜ãk®Èæw³?íØ%÷ÒÑ= ôüµKs½‚#èg‰‰)=c]¾?Ö¡mÆÊÐV]d†®Ö¯[; ÎñôÖ»n8tŠÿ™·˜xoé<ÿP‡âÑmN²ünTT¬„Üz4É­tëme2Ú/áäÝô°*›ì^g‘¢ßÚ—´v­uÕ›ÔßàìŽe‡ .Cf¤Ñ‰AwÂK·É.{hÝ+ðM?ë¢.–?DLélOü2l¸×…V'\o½3ÞZ-__6âú2çÝòÕr¶×CÇ$ßx5ý[ƒ#%W–™&8¯cÒéÔñìŠékå_<© ·:ç^f–—²Æ v@^˜Û@S×G~ßlóAVlZg𙕵ýœCÒÕ^>Žš¹.š²c•Ç79W~~n7i›$)ŒœâwcK‡’ä×2³Ð»yaËæ˜wIuëx?"ڃطdÊ7Ö/,zû¬u͹jo÷ê Ã2ÔóáåSW÷÷îi§7|ûýýF3.zn+¨Ù»Ð¬‡]T€GRé食ìÝR‘nÐ+X¼Ê´L}Ô%^þ"Þ­8ìò3›\®¬~¸Šžö÷ÈÖs¯Ï!‰:êfÿ¨¡ÓòUá{îé-š`Zµét–ñü]%…ÝkZMtš”!Ÿ%S¨cìÿ€ G)T9ŒÀiåßµz7>|¶\¼6’±r™Ÿ×°À01‘Šx"YggêÌú¯·dÜw{!Yî‘ÖÛd×ÛJÝ'J'žáI'FÄhÞeÔ7‡yË$TŸÅ}ø›ºeð'Tý>oš²ÂVê#2³wvœìä7;DÌX¡ÿÇÞ•FQdmDQ3в.â*( +”0}ÏL`8¹‘ ;™é$“é0GHŒ#¸²€² ¸‚ â*?È© —‚("*¸´Ç²}?·O¤Œ²‘‰w0Lʳ4[¿ÎóßûÄÍÿæÙSÀÛ£C*_ÿ¡ÉúÀ3¢H;¸4ÃÁ? ¨/4%óü?Ÿÿ5Ë\R x$#V¨—]_ ºÞ\¿ö"_ë6½ÈÃ׺KÇ[w<[˜¸õ7áÛݦ²òP,·Q<ÂWáA2A€"H‰E Â¥ø"ÀT21…vh÷™óƒbú*È ãKȾÓgÊO^OPv‡5 ”8`jH"M6ñ!9‘§E‘ãyŠð½²™'|ƒlâà€RÈ!¿;T Qà­ˆYæPŠH"O%ÏÓß1ñtÏRs~PA¥ê‹e³µ[¦ E,ÅPžwÐíÁÐRLËÁÈ€ÿHaLV¹)æ‰ÿåùÞ<Üý‚¿²£ÚpÎLM^yCJ©„²÷Ì΢PÀQÑ2ªH."ÿE)_žäIÚ;Q*Oºý~ ™¶x+F,[ìñD‚¸™‡”O€Aœ/ amQ’Ð>ØW(…2Ê =”áÛ qÙa·ßç©$²›ì÷VUɻڒxå1ýsý¾q©Šò6GW–Iw9éWF¯”¹_!kcd%xü’;–‰oŠR¹>E$6ÕÝ©›­2©¢ ìFA;.*(öÝ…lv,½(¾Œ ÊãcÂfn*U10‚j! Ýà£C‘ ¤‚ÌPàСó_ÝÅ”AÆüEA)Œõ%‡ àÂПÊò…Âètƒ6»úöxˆ”ˆ×ŠRe8•D:àZ´ÝÐ ¤”ö k=þXqÚuêÔŽ‚!-Õ®K—vTÈ'QrÊAõ•ŠÁ‚3PöbŸ»I~w ?êç':oÊ-c4,H-6|ÑJ—Þ©S{ðH*}¤òW-X\².]*IF¤¬P™2 ” Eeb¿Ís@"þ«Ïa‚þЄɾÖLj€Ä=aåΛ2g„÷ú20îSMºL¨Ú‹²)YêÖN±oZ'„µX´ÐäÌC`ºžÙ¤PÆ!‹ÚäÔ+O’E$ª|m¼³ `VHPG ¢«‰TT,ŠuVU\±âü/Á(ªøÂðZžá9Ñt›,Ž7ƒÅ‘ÄÕ„žª~¦vØ% BÃó¼IäƒÜ·)€ubGG¼˜­âÑY‡šåwp1x‰qÂÜÁÅŠ©¿ƒ‹ðÐïÈâDÓY¬hõ®äò¯î½Oœ )–¡ð2&Ž¡\â9 s6€Xò vKéwûaÈ¥…0¥«ò{Ïnâ­³ª VpRN.Áðþ^(õ\m(ªÁK±r‰%Ã)—X2(O§öBQ¼ì“Ñá=Ì2ÁÛL]VÐ’ʽÚJZ[ö2Ö,Õ& ÞÇåRóðªq1ÿŽåt`YƳD©Æ¿C‚ÙÚq&kÇXÿK*ÿê Š7âòBuâùD'oÉš v¯“6XSœ.=:7’—'Õ¡Y}Œ†–Ël]ì UË)-™U묪h˜ˆ"YY%•ªÔiz´"þbj¤Ú}5bô1ZºäͰ¦ÿ|-è¿Ó ÿ4†Ð àô8©½<Y¸t`E‘0T…©8< :'‘yuõºâûIkkt"õÎ>«£Mb@Ç—Ät–`-­2JvD!ÐXË|¿/W×±8¸z ªa+Ê`èÍŸspäR‚³B`,5ØXpîGP"wND\0ƒ×d(Žâ\,ãì¦Ö_’”&SœvW2FYº­¾ÆYWæËè%ñ6'Ù::š´—̵{s§û¥@Ø.­Cÿ¨|†4ÁQúåñÒñ00eèÕð–YUå¡¯Ç þQ©Î¸Æ¸I}ž€ïÈYRsËÈÊ0ÍЕ0¢ù& :Â% NJýv@H­2#Þ…¨{0”¯÷u\†P2î1‰Ì«Ýí­­ñI¬§A 7Cðt¶›g•©N #/ög ÔZé¾§¶ £ŒF7Œ8®e¬ôb’Ì¿º’ ¦áH $ŒZ­ PD»—f ¦×/ç×Ý}ƒzÏ6m,`H`JKã묪h<[átÔeÆ#¦9õš[Y¾¶@´Põqâ_Aˆ§Éàƒg˜T3…>@qèCÂÞ’†&‘yuÕÓePOr_>X;j'ø­Ì Ь=\”ÜÞºÓLµøª¾¸LëR$¨¯ZÄÕ\3I%»*£À›—”ú$Ú©üõ W+j(¨j貊Ä@Ý©À8ˆ;rO.5cR +ˆ8¼Œû§JI•‡ŽÝ ¶O’ùW2•猊Á£@H÷!˜²šÎ«â¡¿uVIþÑÜàØBa¯O޹4Ó”™•9¡ö Kh£ßXåǧÚo! ݵ $t×BØ[BVJ"ójëIµ÷R$§'ŒaÄ‹¶Ü€!}Œ+œuKzb•U²z‚“IúÀÛ IÁ°±ï‡[ùñ3¢:°N^Y*–YÍ”Åaò.8DfÉTú1µKEÇQ¢`´üápP+ëDÉd^meIé^="§Y\ÑEq IPЃ˜X¨Üªœ]aj‡]’J#"Ò”ŽWž^dè”Åí(ªž™KS«3JT‡ZGbìn[­q#KZoÜ<ZYQž¤ò¯öL­ÍØâŠƒfþñ|¦€}&ð—ÊÖÃ|:v‹šq€Qõd.Æ;ˆPS;™‹û €Ì¦Ít8'gL&5™›Tþ5¢åé:¢`¢¨Ñ/DÎåÀŽÎåA¶þé½ÞÛt˜ŸóúöKÚ¿8õ³Y…¯ìÊXÿÝcýž5×Ìú1ï“QW~=ã`SÛŒ»•gœxdÈã?y‹nÀóYOÛÌG7íùáþòS9íîh>¢ÿîiw»ž½sÉçËÒ®öžº÷ü_–®n÷Çžóiqû…×¾éþxñä—Ùãó鬓mn|êÓ‹‡7þ¦äÎgN®>q~³C'^wY“YW¶ê½bÞ+'ïo¼±ÃɵÁ¹¯7+é¼xí—çïü|í®Uô’G{¾½aNƒÒc¯ ÖNM_vÕ‘ÖÞõ¿Ml²†™Ù=ëêž‹›ï÷\ÉSŸìR0ý@Ï­žÏ6­ñ}g_0dÚ…‹ìvýxæª]ó'ÏoüI—Öÿžrpé“Bó»­¹fÄß„½mß<¸³ïc3ÊÞz7ëõÏ—ìš2`ß_V-eߺ¹ûÌ+XÚ÷#¶üò~ GmKŽÎë?£Ç–~o§{/žÝäG)¶s· ·ô¼uÛ¡ÖWuΜ¶÷3ëñLx©É™…gtñŸÛ-ëFçWå?´¾fê+]YÏ“óïµÍ»¸¬í5×Ò½.”?ZµtÏËî[ܾÑ3[g/ ]ÙíªQ·,ëóü ’1é6yiÜÛmÓK†mµ¶áæÖK¼QyÚêW§½¸arqó¿µî¼¯`Éɯïê×h{qþ/þgvGZ6)ôŽï=qàØ­?<ûîm.ú™«F¿;}÷Í'"‡6LººßƼcå̶õ’Ê¥sÊ[ð2µr®oÜÐÆÍ¶ ž™>s~›yi7>êöÕ›ûØCØí9ä·>í¶<µ½ÅdߺæLäö/NÿúýÁ ÑëJæô¾®dÚ©¡ë÷¾}ý…c¿ö¿-︻äpñkËŸ*ZõÍ]“Ÿ;pË“«ö.hzcï±­Ç×}ºÑ~'¿eÕ]×}Õ§Y‹ÝoèÔtÿ¡7‹î‰n{`]Ïuï]1hÀŽm“v¶}2ø‘WO7üe³gæ¤Es»é {&óЬãAû½×|¨ÝE/¶¼ŸŸýç׿~‘õõܳ'¹I­þ³ýËu¹»þø×õ“'l—N˜ÞÞÄÕáÀÇ7ßtìO 'y„Ö_z÷—£ÿü~?ù¾Ÿ]ûÒ;;4ìÒý .³mán§«|ÔÁ‘«×îZ=óág ;9iVΩIO]ë¼Ð5vˇ''{me[Ù‡›‡šÞôi7¤øä‘£ãZgßÜlÅå‹w¤˜Ù*Òm“—ßÑñé¾ &n^ÕtØÈWv,N¿èäó-ºöÞ³vÞÛãŸ+(Ùxdóüg¾ ¥½ÖÌ}je‹6—N;ör«©G?Ø×ÿçA—ͽçÛwwÎXùåÐ6½ßÒïX¾å¯Cîw¿³fdäŸ+Ê?Ò¨iö˜ÖMÏ;òÞÖq Ú2ÿiÔ¯C£Æ¾+…=“ú¼Ð"}ðˆËVJk[¼ï\·uÍÚ;qÊß–¿N˜þØ?Ø}$=~ÞËΛr^hzéCo— .é¸ÿ®þé†^{®ûñØÃÌŽ­Û/ýuÜ÷âO=ƒÓÞ¿û—mKF{ý¾¹p_>3eî–æí{¼lù[oÝÞµó­¶n8°ËßÎ?ÓvA×JqXÖ×1vMBíà:òF\G Œ±Ú¸Žÿ—Ü;éP@:RWX%‚#n³vàŒp¶2TëП5G66ˆS¿UÞål…5GœöÇùfÜ©VuTµÏØv#"ÒœB²&[5Na…›)k‚ÖX2¡¡7wŽ":i®2dB%ª.‘ Å* —€ÔÅL@!dE5žÆ;ÒU„LÈð‰¨†ŒÃ™€ˆÈ ŸÎÉ&¾ëJDdñ4|‘‡8È:Yº~6¯¶ž¸ñÿï‰ÿ$òœÀˆŒ£ÿ¥Ÿùë~ÐëS{!Òpó?ljúüÍ‚ü,í¨Ÿÿ©‹'§¼zª _ —%È>ZfË IäFæŒÎÉ€hüƒ :P=ÁÜS%è=âåQ[¹M´¬²¶Í!·\—©Ç”\n©0ïhÔµ .(D±¦pö1â…^üÿ²wõÏiëèº?ç¯Ð¹›³Óî4ËBöÜÒ$=e¶M3@Ûé”N¯Á"xblÖ6ÉéÉpÿö«€øˆ$…3Íž-±eY~ŸWòcé• =;ÙƒdcÛw<׿9ëOíð°ÂnhÆ+tßu'3°ˆ œþ€ôO²cýz´ŽŽúq úKnúd·ïÿéÿ×ük÷OèfUù¡9½ÛÆ+VˆþK76S,„îÐÃ_{tÔN.sÐÓŒÂO¶W5Ð:»žõéŒâÃȽ™…hþíÝ÷£äÈ‘ ˆÈ¾Cw“ÀAGý¤Z´Lw}£3ÿm6Óøûƒc¼ršõUœÙh1. W)/–ü‘ÜW¼7v£¤ªd¦/÷¸ü1E;ÂȆØí¼Ÿ?v™ô¯ÔF1¹–ä,åa aÒ‡ià£5N‹ éãOÔfƒ¤­üã᜸Šæim΃ÉÔÆíM0-‡]ü 1WVtY®ì÷nÏûÑÄö>¨¹¡&N*˜ò#ûgß Ç_Pü'òÀñoÇ}ü=5z˜à ÇÁ™‡ÏÝÓS¯io^a¸‚7¨â£xN[⣹Žÿu ¨’û¯Væ3ûP9û^­d%ß=gßÉgÏB>Ú4¦!ÑI˜G—: fdr×ÇÞÀ8˜’f`ÇÀÁ=Ùg|€Èžœ£™÷àœàK»÷îã§h]}_ZNëª÷õŸ8'6>‹î+ÇL={ODPü7¸øpÙ9‡ó·Þ´ß·{_I|Ûî]]v»àíÇhëV§×>ÿô¾Õן:×»—ÐK›$Ý¢4­¼"๸½DødËñûÅ›îÛÑ==UÁrˆVç<˜þ$>ºèJ­5=ý÷q¸+¾nç&!„ÄÅðƒ{Iy¤Ü>'Qå©ß®ûŸ8þ·?úŸþ¯%qøïþçAÿQKâðßýO󀿎´Œ?Úýσþ·–Äáÿ”úŸýï'HþO9þ{àO8ü÷‡ÿøŸ–Äá¿?üÿÀÿ´$ÿýáÿµþ:Ò2þ£½áÿþ§'qøïÿ?ð?-‰ÃøÿÿiIþOÎÿaƒÅÿÔí_KZÁŸÎÅ{4õƒíúÅÃÿ©Fÿc™ÿΈÿÑ‘–âxìÆýv¢BN%¡ëCÖ¸Qù³pèõâ4Ú‡ÌB “h2=&t¥™ÿ g>˜ x8hðË…nláX"^M¦œÉd0WÙR¢Dê,H¤ùÊiš+GÂChU~ü —m 9 É…àí̧Ç vÙêj?ì*ñ6.&„ÏÀhžñcìÏF‚œbÐÿ;ûë%&8#=‘\¸GmÿîÍbR8-›®™ƒˆüóâ1Ï&;‰Å!5 gD;^*úfÙôaãßÈ‘¶þÆ3Ûwë€ã¾ÅÇ+!8‹O5Àæî̈‰_<\;m§Ì©ƒ°øiqnÐYh³%IõG\‘œÁE0œeO0Ä[Ô[×uiœ‡þ‚ÿ55ä<ÍŸùeë• òY…¿áK¾?ôÉ teîC?$êØÑ­;?T§¸x³XÃÉ|êi¾g9#¨<ÑGØèè¡Z1ñu4ü ô'ƒà‡os×'[w¼$¡<Ìå^‚¤`–ãû|>´m HÛ8ô޵]ÏB?:û¾ µPäjø\rŠQöÜóÊQsQ¦.%d¡j÷vnp׌]mêE#ÜG÷iXÒ™H/·Ô½ §¡dIò{­¿?ÑûŸãû3þ{ÿÓ’8ü÷gü×:à¯#-à¿“o’äñ‡fãÿ¡%-áïT«ûÑþa£~ÿÓ’8ü§Æâÿ}iÿ|ùK„ü()}-6øØøÙó-ÿ«’öß ‡ãÒ†õ Øo^È2‘Ošë·ø¿0/_˜ŸÙ´&ÐÏ?(óEGì2™eG]zÅêÂ£äøš5‚Ç¿'Ê3Çÿ:^»œå Ú´[³°L·dAaèo¿Oªí±%ËÍc™Øñxs† 2ʦ¼´1XõòTDTñòYìz‘òÕdòo*ò]h…fîé%-ld«4q+Dµõ­Pd¥¦Òê?}Mò/´Ð<¬|ÂÕ€l794Å ³ÚŽ=]ös§—­ï“¦­ó?†ÙhXyü·IŽuHð?Ìÿì>­ŸÿÙ<ïóèlçAÜ,?½³eR‡Á‘ñè‘=DdȦÈO]`Ü—dŒÙ]‰,$¹ßVPžÓqÊ(˜ @Æ[ø¿QY»~ÚÇG±³}*å‘ ›u eÏaO>”6å`6-:å`ÑÁ¤%WÜBñ:™M]`~tF®O†smϵ#àÛ%!œˆxDÙKÐQ4±M§#\Ù`ÜÓÜÄ+ÀÅ÷ù`Äãl 8½]†ø¢A1J`ñŸ£±Aí÷ì/¸P|QH¿/›Å6ªnl³×å Æ6ÒæàùïïìhÜ?éÙÜzØõ/ÁÌÜŸNÄ/ËîèDÕfh–f|ÈòŸ's éçÏï‘}»µm³ÚˆÄ¾·(`Å´1\ÄX3ÖC0b.­‘·~ƈÎdg_¼xñè³Aòl"52%à3Sø¨""®ñÂ…Åá0õÃQSƒãœ<¾5Q<, <¬\k%¸­— ‹¥–º,¿c+œ\ÈaSŦ!M#ÅÆq£ap‡BºrªSS6H ý ªt‘šã$í‘CëT­¦ZÍ­ˆµ¤(%aß,Ãõ$›jçÏÐ?i;ø=¶p†õOÞÐÈ üWiH7µ#mTÕî’æ˜¨gßHmT6$ˆal:ÂýgèÆ?Ðî&—⣅!6ôóC‘—pgVÂY”ªTÅ0ùW£GþßõGºìrò>¸Áçp%¶gC?ë1Y}½v±!™ ¤0¥?†ý1,®-3Œcw‚Ä1fkpy¤ËƒW?{2ÙS7ƒ·‡-(¯(ƒ2$”‘1(Ûqrx1>¡D½k|õ/C‘xµ'Á÷’˜P`QÒeH.£¹¶–xm'ÍžP8Ëêm å\“«ã„ëOã•ËŠ;¥~Ž9bþN‘wJ(J¡A„F>Æì¹¥¨7Fê§~P‘úSóPì¤@e{P‚íAs-ˆØVÒ=É› ðJAS?·ƒŠÜ.ùÓýCä %wP‚ÜÁ•±­2 -«‡…úi,2(¦Š¬(¯ƒ¼6Ö";´§QÁ·þ¹=µ®‡M¢2ÁÖÏñ "ÇËÁÎl!ùN%zP‚èÁŒè…h©ƒ&ã€#/¸×÷~ÕÏŒLEfÔ¡¦b`~Lì$¥)JL zd\ãe«¢¶¶ãú*C¥l=Tÿäj6Y¢ÃŠÞÆ¿YçV^£7õ31S‘‰%~ÙTRž"ÊÉL Nfò#p¹§í„¢qà9*þ£ÎÒËJ/ÓôS9³Ø0ÝŠ1¤G?µŠÌŸ'æW˜Á°Dù«%Á_->ˆP“ìÜ1,ý”Ö*yXÄ1D©¬%Ae-~ÌÓuè;H1ì°M‚FÖ,7ÑÒÏ\­"£›¹ ¤ %«–Yµx²š@n‡È&ÿQ– ~‹}ÒÃUâÈĆ §õ‡ŠzGëXÿ°ô³Y«›]5‚”C‰RYK‚ÊZ|Øã‚Ciw£Ò:ý¼Ô*&™HÊDɨ%AF­æf`j÷Šâî Ÿ€Ö (ç'o˜dÜ¢.ÊAë´žqP'YÚP~7Q*æuýܲ®È-/è¥. .J+ë´²¾VŽ\ä•Öú·Ñ„·äF%QŽ´¬â¥Ÿ´Ö “VöôR%ÊZ묵n­©”êQKp—Å$êúf]‘aæ¯ÔE©e]‚ZÖ7PKŠú¸DéØëg‘õÂ,21‚ o¥“u :Yç'ÜwÞò‹Ã®Ÿ-6ŠL·+6ù†(MlHÐÄÆš¨ƒ:”Júéc£0}TpQþØàŒ?Žƒ8º·§äç4ðÜáO:zM$ˆ…×8-nqàNP0‹KW?™k(’¹w‰ O®™OΩýä`%u R×àã+íY¸>ÑU!Å ­8—‰¦~’Ö(Ù†"ÊÔT™!¤åk ¾Öà#  è*L"‚¨HË-‹›5ôs³F‘@HùebL5ÌEùYC‚Ÿ5x~¶Ì‹ƒ­Ÿ‘ad%€}*ÊÎN%ØÙ)¹ð~VH~•?/|ªŸ| uÌ^Ñòó§¢ìT‚€ò!Ž%ã\`ýôë´Hèb€E©×©õ:µòŽÿ™¡ˆÙ¦QaŠ(g!eÅaÖÏËNyY'±cub)¬EYÙ©+;åYÙ4¸g»û©6åkZ@ù½¶~JvZ„’-™A fQ"v*AÄNy"V6ÌÅñÕÏšEX˜2¾MQîÕ”à^Mž{¹¾ãiu ¾•ÛYA¥7é¦~"Ö,BÄVL!»(kJP±&OÅv {q¼õó²f^V oQfÖ”`fÍŒ™-éNíp¢ÒãËʤcMýt¬©HDzH[j)TE9XS‚ƒ5y–m,¢Ú‚“í62pKë±õ“°f–n;"ßzEIXS‚„5×ìË\.ÎÅÖÎÂ`µà†ÌJ“»  %!`•ga÷v<;Á {5+…ÍI‹X]N‘Ÿ*«Cý*PUE‚6ðܲôPTTJˆJÀ*OÈþz ¤AUáŠnQ¤hPBÆVÏ8(ûâðjgiPU#éÛ3HA+ÈÓ „ ¬ò<Í'ª ßfDKà–ïã+]öÄkåfñ¯®ô_.…V`Rê~ÐP¿Tâ oƒ+ªR±d )§$}PBŒVùå·;s– K»ò ýLQUºƒM‘«z…¨r”Pr‡=¼} ¯(Qâê—ø€ª­ámW¥Œâ0÷Hâ˜wæ ;ê ô‹~@UÑȬ¿(_”Ðý€¹îGÓú—î ô³KU×ªî ¢üRB#+rOò‹}î¢?ÈÏ.ïÚQÜôSGU)‘”$6rQÆ(¡$• 9ýnPýôPUµ£«Ž¿¨h”í€EÍ&.u‡)* ÿ–\¾ ;;ÜÅe–½Ô/üU…?hã_0…ú¢tPBýB~yl†> ï\&íçRÛ”î É NÚ´xüŠ´c»L¯ÐÏUD½[%3‰”wˆ²E !ùU™wPÄËs‰7¶»æðnt@¡~¨ª@Ò]p fR)§å$0× ¹Ãõwlf}žQxý4QUäsjÛè‹ÒE =ùFÍ]Â’5Jgúi¤ªÄÉï…:Q}(¡oWôM–]ƒÅM¦¿"´¾?XW»zsv‹ó´’¥û—~aXHe¹±åv‘r5QÚ*!WRRWcekê…ØÉ²}D?o-¤–ÂLÑ£%Ë9†(c•ÐI&¿¥à²cú ¨_uªª®¬ú—j$ʃ%¤WàŠôJêj^pãmoÝ;ü>¹ÁŽ: ý$¹, g•žH”(K¨³@sQ^quJzŸÌ˜;ì†ôSmU˜-^¦Ø‰*Ã@ e˜+ÃD¸´%—ØÃÛÙ´ k†\¿è T}éR f4XO`QÒ+!öWÄ^rx}Õ„jÛ%˱šO®›°wÐOt I¾,rþ¡ä~ÇPTíJ¨½À\íeM“g>1 ¦?wî¥ÒéWuªª.\7AŒpŽí-ç¢ÜTBÓ.hºðŽáúø§²e•ŽZý",PY„eü6³ªò¢´SB®è¯dƒp±ÏT4|TFF>MoB›Líwé]KäúõW`!ý•d™AÆ;DÕW „ú ´6sD–5ÚÑ«¢0êúÅU ²¸Êb·ð™•¬ê•Ü}ŠJ¬@ ‰˜K¬l@ŸýØ®Êf+¥~)è×Tªš*›á>ù€-)º(G”Y¹È Û«rõë¦÷µÑë'‚ª‚(É6–ÜÛO {Q(¡‡­MC”dc¼0ð¼A²Àq#EÁàMŽPª<(Ô¯U5PÞúÔÂRŽ Ê %„P Åyêv„â Ÿ÷©Êžt z€¨æ ”Ð<õÍÌ/Åÿ©ßúúUN ªÊÉÒ[_ dQ‚'!vs±²iÞÝBhÖ“c«ŸÑ© Ž´RÓ1 H*Jà$ôF`}ó _Šòþu×ú¥F ªÔÈR[NÀ—ý\•’#0—zÈögÓ’ó®øº~‰¨*1ržT¡‰‹Ò3 aXçí7¬UÚÃãÂ]‹6;\òD®~…¨ª0B©ù‚dpU #°ÁGL¦¸Ç(R‰ØŠ{n »õdiN¡_qª*Ž,83‚¼kˆR9 ÝØà#]ƒ²vd;*õê>Ò!w,ÓIôsBUÝ’'!¶p}Éé‹J—@ éØXå‡OШ€ÓM¹?Û¡K†èˆö¤Ìù ýr)PY.…ÍÃHùŽ(Å”PI¹JJ>8¬ËyŠC¯ŸoªÊ¦¤ãê؋’N µØØD:Ó7ŒòŒqQrp±~]ç¡­U\êgþ&›õkµ@U­–•7””³¨N ”Ði+:-«D&šyñSøY‡Ý¹D‡Ñ/ö ‰½¬³†”ÇPê»Pí6®°û'Â×E³A„èN±ÿx¸ OŠ¢9gš<óãÏIšEÿoÔdh‹»álW—_ºí³ËÏ—W½÷§¿¯zöewþ¿t¦mëSU…0¼ÈÐÁ ;ÜayÁ ˆðm„s¡ŽM…-Û®‡\|4 Ý)•>9êáÃÀõ‡ÞÌAˆÇä…#{ˆ@ÐÁùã© ìûØ>pIïI6›±Ój’\CÏŽ¢EÒØ=2çÀ6\r–9.ÌQ0AàÝu´ð£™O+U@f,RåËo­Y<³ïïí0_Pü'òÀñoÇýqˆFüˆqpæás÷ôÔëY„¨ÂÚù(ÀøW|Ïúq Íuü/ÜÿË&÷_­Ìg|®ëÙ÷jÅx$ë…£³ï°jTòõÆn¦apƒ¹+À? &ë 5êÛÿ°càÆàÞõ<0@×w4ó^œ|i÷Þ}üÔ­«¯àK«Ói]õ¾þçÄfÂg‰û0L1d..öÞCÛÐ>\vÎßáü­7í÷íÞW„àm»wuÙí‚·; ®[^ûüÓûV\ê\ì^V­3õ‚]Zy;DÀsñË5Â÷˜ù Þt/@ÿô²SÐEˆV‡D3ºþÍ’ó9´ÖôôGìp¸_Åþ™„8Æ;¶+€=uUލ'ãæ2ßSo†A fµ{JL: ƒ 3Ætâ:nˆ›F’‹<–íßFÄáûS;<ÂÜ•þÛöýaÿXñ²˜æ¨Üf9^†neL˜{m>ýŠÝãÚE!¶[×öo‚™:+·˜Fé©×ø]…_lÃq~ƒM'³â[¾óœã·`´R°ÉñmÍc{|“gë“ _aЯH'hT_mÈW$UqjXù×hXUú·Q«Ñ“ôÌ0L«fÔëÕ†ù¬jà¯ó°vP—•4#_Ë<» ‚ÑÏ­ù°auTHoâð7öÿÚ‰Ãî þÖ‰Ãß|Büë–Y­YõÅ¿øëH+ø¯|¼Åœoa³¾?\L¶îüñSÉ鸂¦™…\gx¯ÁZ¦ÁáÕëÏ@U‡þŸãÿë/×Ý“– Ð ¬T~ý3Póp‚ܱ/&+<ÿ€tÑ@óÌÄÿ«ƒO½s«Uë¾ò-¹ê9µã @>øð±ž{è üŽ^Û7(°³ùÉÿ&À_ø£àMðÇ0-ò?Xµ@íÔÀ'/}!“Öè(²ïÉO¾Ò®Ã^½ºâ à›ãüÃA££ô ýžû?öžHŽâ:, ¢H lã9²› Ewà»ÙÙý‰“à¤;‰ úq' ÄÝYÌÍôÝŽ˜YÍΞ)¶ ‰dWˆƒq¡œÆ`~Ž ØUØ€ X(Pà8†vøÙ² NÞëùÏ~îiµ®š.Ýjúu÷ûôë~ýº{¦›ãø2µ*¥õ0ëÕ2Ë%óRŽÐe©nƒéL;’é Á9Ö C@"© ŽÞdcp“H ¥É$µØÄ{JÒH©â=s\GˆR)‘T"Cø¾/&@L’aæèA’‘US®'4:íE+0ñ eµì„Î7å—NÄ¢ KÕ?K–ðkdªÀœTra°1btËÔ²!º(°1bC6Ãø@ìÁ:ø€™Á| ë`_ [£Ù ™ðÛCD²@—t/  Ÿ„™&LyÇ5¯ ÒJ¡‚"H+Õr'Y)JV"’_d—B¼ŠÀ–TLÈ‘ O 4ÄBX µ,¤¡Âi”…4¥!¢Ðy5ŒØTëàfÔ| §— Šl’åA€c=Ô2À𢙠¸!'&üÚÁ~¢S€€="ÕYR2Jì¯JÔ ª•©W¦Šë+’¦yÏ´E­³lN+¦ F•ñvØ^|¦È"Wey¼Ù½Ü=d@ï!Ùiƒ–¤©rƒÄÕ†¦4IjPö<ªMA•¥Æ)Ý›Æ5uW…6ÉQ—v8¹’5FÅí7‚7$î¦×%Ll€_é3-ƒMU2®Ú*áÜáÎÝôXKw2Œg„9]Sêe0 %8^6 SéFõuOHEU›!!ý1.àGªhÖ¹&ÖTkqz­8Gʲ¤Q»E#›ü >5Œ µkjBOÂF¬î`y¡St`ã–±ñO‘h!;J±Œ¬T¸.ìeÉ2`54U¾12â l då@YŽ<‰Pw–õ†E ˲‹ õŠfê¡Rõ)0"³ü.ãÖDI² ¬{0¦q)­ŒÝdûyÄ9Ž l–$‘ ]v·ªXaªH Vôº`}¯¨¢J“†.iå0P0ŒKËlAÈ[hcdðÃLÂñº¡PûyÓ åq;ÄK•É9ó°v=W&Ý(9Y\³ANyfWKàj’ÙŽeD%; ‹•¹Þ~´6~g0¢# %þ .fƒ¬ æȤ…mºc’¹¥~϶™% ôNR4Àðëíì"LÇ*â$òTÙŽv~ÒïŒÀG»ì$c48 …c@¨g°nÆHG^/E9¸¿§ºlU]m*¦´·'uhl ÷/Ʀ½TËp‡ ¨jpr9ÞI)#PÙ–»)JÊN‚@¨=–¨ML Díü>À­Ižp+¸ƒ¡±U`'¡ÂöÇ1½úeõÒÑ´ œ[œÕ¡W…U·™Ó%S-2@‚i¼G°þ3ÎÿÓ¸}Gfð‰ÐëðãxôH& ž¨L `û$KIØ’ù»WO†2ÉšQ¦ØÏÃꤚ¦–Êt¦`ðæL°âÌé`,”L)JPgÓ®Þì´_Û°pÓd†X¦¤—qÞÏuR b[]ÖløCOP2ehEÔEfTWìNÆ*˜=û©D;b—Фj²Î[¦»¸Ž¨ur +àSQÒM A]Øô ©ðýT.²–Ã'˜ŒöäàŸƒ‘L0’ó"c\€ pÃHˆÏ1s»”ÍØ,_”¦íG·nÁ£¯˜aׯåeH¹2N<ŠECÁ9#×!i†¤°¦°rhž|Cêš¹ª£Ü€ýŒ&Íf8-¤/CwdòùC'“ TØ{<59ˬõg*¥RHVix}ä!t“4+´QLÅôIz}ÑË›p]˜ü»ŽsfýŽS4ŒÓz¦‹õ<×"r>U w·á?0{0?3ÝŽ²›š µ LÚµE ÆèrŤ¤¤L s†“àü5ÜŸÃqpóp7›ó—Lja}VD° àOõ«e ]“ãÝÒ»!‘²Q«Jfq)‰9à^2p‰Ý>*–çñ;ì,ïí]Îvq—¯Zµœ”¥ J ø ëéXpxÇ“ôËØÌõÉ t?%ø´I(¡:+x$’ 5gúâq×ÙÛÛ#’N:Gìÿ]Æ"ÙV­jiÙV ­2{h°*8Ïá5  þó×€0Ã&p V͆ † tiöš‘ÓEfç®I—Á„º^g£ô­mß<'ŽT´Ð†Å²õ$øõû' „§,n“ã–ul„^,Øü±&æÏõl?,„Z`¿^ǯCÖOs$"ÇBÈä!âŒ)RI7šFüÑ™hÊ‘!c;¹u«AÈAÈ»¸;›¬4wq#Y0õéžt’àC¦'›$É!Cr`ô˜Åœ§\Î~Jõ€Æ3v’ŸÎ ³§šŸ„ØÏ7Íœ){>„_E‚ VFªhR9’÷Åï&Å’®ï0© â2Öž„õ~X6ù9ẋXÌÏìÏáY¤‰ŠFÑOåFÒ=Y‡ïc­0ÿÇ­–ÉdÂ|úÝHÞÚQ¤t: ® À¨´Ã}êud¨i1¡§„%*öä¢-L]LÚ¯K] l)x…‹Íˆß¤çËH“ŸfµÉ\§}RB}ü[ÙŽó¡báþÍHÔáSÈ7ás‡lÀÐÉ>Q=ÚÜÖºmŸ‘ôõÒ¨Ò³udÑ¥"=Ü{µYC6dCg¬Nr#„ÂWËFMøK'HºÏø9üjv˜&$²é‡ ëc¯<’Þ^ÂWÆ­™%üÖ¡Aû§s)n¤f¤ú©CŠÙS°ŠZYµ Qyå׫ú¥ß·q£ëp¾WµüŽ0®í™0êŽâŽˆn4Œ5ñ9%G‚X“ [F&ÕÐg€J=¢¾‚‡iNeIg‚rctî6 äVô ðZ² Ìr»6ò<ö]Ö[À¤!6“UI\~¿š—pI1$Dç'œ 4q @_GÑqi¯Ö"wB>ßÌ#¨ÇÞöæÁc.[gˆµ¾Ïa>¬ÿw9ô#_ÙcèzÌmÍI÷*Òx ƶÀ eÀ%LôdÏD˜Êo}Åkû9†Ï aLÌ3 (°ÿ`Ò#WÌ©9z‚MO-Ùû$„( ßdær,­‘œ³RÁQ-϶õQQßû¨6Á+édýQm«¥j­Öli\£$ÚQwhqdt£¡Ø{ÖŽ±fÃZ\i¡á°†µzÄÇ5ßYßæö$ ØÑŽÎÃþƒXBx8*ËàµÒCRs§tîa øJ„ÙLÌ“ÍT¾Ù0…õ”Ç©°6ê\à±é\¼Mxl>Å®ËäQQçÃiý™3¶ÆíÛ%ßû–Á§dŽ8ÓÔ\x$¼,G}`/à¶#{)¡{0_Æ‹Üß+kÇÖŸR²,uÙòuØ(Ði{¯ðýrâV’_SÎÜ´ù wîAÙuN’ïß9Á÷}Ï!™O!0™K³ÿ èpNÂ$VH¢ñ¢oãzp6 9wwóRìµþ-&~óh:[>öN¾CêWHÄÄùe6­åŽõ{´¿«áý¿ÿ]TæzO¿ùûßDÿûTJÄ÷¿“i!~ÿ»!›©0‘¥yšL%'Òrf\ÉÊr&—¥)!›UòÇš¿8Ýðþû?Lìæ 1Gÿ‡É‚Póý$Çý¿aÙæþµÝBOŠ[öðÁ½7ri’ ÆøN®·—_o¿'nâ¡à[ÏüZl+ýà(fú0âS©ÈM_ÿô…çï}*qò}¿¹ð¢ÿ¿rèíóÿfчÈéç(þrá?^üíçïºñùŸëÛ»G½úØ¡'sÅ}‹wíŸÞpÍéößÀÿ|É©+ÿÔß/é~ä7¾¸qÛCê+ï\uÞŠ3†6¿ýVwï·¼uÝèM¯ŸrÙ þÅý·™;úþûøu»÷ï½°°öÄ÷_Q:áÔS½ñ•-Ÿ)•î$Ÿxö÷nÝÝËO9ðǹÌO«w½¸ýÑŸ{öž¿>¿pÿkë¹»¾rÃä—¿ûÒЊ5~’/ý×ï/š>窩‡îxn{qöÐèw—}ãLó¥}ñâ'ŽÿÂÍ‹^ÿcó@úÔGú¯ZŸì_;öG{._ôÍž~ä;{Ny'wÉù}û_ùêIß[¸ðñ{:Žûí¿~û¦ÇVÎ\'ýS᭿ܲiX9§ïpö‰ô®ç×þ3}ó a[ç=ßö“_œuá÷O»ä±Þÿè§öÿë®oo˜ztáãŸÝõ}æË?ºçÇ^±]_°º|÷0³÷à ö¼FO»¬´ ôéÞ׎?þÛ‚¾àÆÊ-ë©>{àZîæÄg2Õ{ÿdä®Å'í|éù;ª n=眓¤Þ³ûê›ùC÷¸±ÿ¸¯þG¯]pú•Ï}vßGþî<°üÅê•È ÷=xýëßüÃî›F¿zÑÖ ä{ÏÚvÍìI‡×OþjË¿ú—§ŸÿêÛ‹O|â °·ïýMõ¥«~¶ðÑ‚ügûÌ¢vÿœxÛEÚuùô)÷}cã#[Oÿ¼¸î6éš?ûë¿Ùwöò§Þü‡›Øûow,xձïžpùÐáϽtñ’ûÞäX÷ƒëS+¿¶håÞô©?Û˜>~Ÿ¼áÎ-·LÞýf×Ë{³çÿÇ÷Nî8éÉ%Ÿ»kÝ™¯&f_{ðì‘MÝ‹nþŸ¯­Û5z˳6ì¹äWï¤ûwo™ùÅŽï?úââ~:üÌÇ^¾üšý½ýOïù›On»ûW]›žÚþtþÞϼ¥÷-ü«•‹¶¸D~ö¹7nI¾C®¥n»úæ_þß·ö]ò•g>|ð´_õ5KÓàH:ž°ágœÉç]è÷‰-3%Ê£Êo Š*­6¦ {/ÍyeŒã‡Ø $$¹ØK“)ì>v^g*’Í0a¦Ö]ð[`r妭uì¨ ØEÖâ«›àucú6ذÊ#yêп2á7R$íæs˜NyLÆ5al— ¾ª”Éjˆ#øŽ:Ò ÂòBÉ’ðLE*B*©OŽß´yV­r2æ#™Dœ³N s:öEZ€ LjÄ]£tÞûãû ØÖ¡Áyî¯qü0æÆŠs#ÙZ¤Ç «À†Ì$ì›'ÜóÅtSfæµ,:'7:ʲ ($HÍq¹pjÎO\-•)6ÿÝ$[6„ù”$øåÈ¡e*™šÛɺ‚Q¶ìÃgH®GHƒìÛ@ÕÐñt”ÎþxÜZˆÂ’ÙZ˜(Ô–Åhf9Óf¶ ¯3ãG|CÔ?30øÆ„AlûÂö“‘Îÿ}ᦙO~éà­?9ðÚ…[÷}¼«2Ʊa_2-VÙBVLÄðßåñÿŶ9ÿ!ÿߊѺ]ôŸMÄúoEˆè?Ó6úbý·"DôŸmýÇç¿´$DôŸkýÇ翵$DôŸoýÇ翵$„õŸlŸócý·$Dôß>ç?Æçÿµ$Dôß>ç?fbý·"Dô,ό׎Aˆè¿mÖÿâõŸÖ„ˆþÛgý/^ÿiIˆè¿}ÖÿâõŸ–„ˆþùú_¦ÿØÿkI¨Ñ¿UÀ%Ù8=>4PÁÍÞÿa²ï½ÿ—Äó¿ÓÙd|þsKB讥€îñš%÷2"ÜP‚¯µ!:AM<¬+tR¸íTGÙy¦²çž«U®ÞmFì-jŸ¯dg&IW4UŸ\a_’½®HÞ²mT½:+vÛÑÑnhPdPW-–™=4ÅÀÙ<ãzC¾4ÄÌY¤¯b5ÅF»xÎÂC»ë`Ó‚k ] cV¯pbwÉŒžáh„ø—€9º+ø»P¤ÀÒÞ¥eKQžÂÒUKæ˜)ó–Z¤M3QÓÔƒh8nÐITh‰BÛÒåûT¦@sÁ¶µÂ¹ÎiB¬˜´:rÞ˜{Á^&HMl´Tš¢SEC¡Ü¨C’aRåòûf¥ fKÖØ¬’å™Û5¾þ,kUû²3!FzáÏÖØ-z®ÏêßÅÕ´qÏãj2Ìçö£Ý \Á¿ ̾9̬è¤H­‚¡Ìqó\þÂ=ia>UÒÔ˼›È$WsGÿ®´ØºkëÒ䂸£{ÐnÑ tàPUwíéÚL×|¯¥ÃÓçw-]BŒ¯¥;×Ò!BÏ%r¾*’ñcÍA#TÁ£{޵Ïv$CÄÿoŸýÿxÿ¯%!¢ÿöÙÿ÷ÿZÂúOµÏþ¬ÿ–„ˆþÛgÿ?^ÿkIˆè¿}öÿãýß–„ˆþÛfÿ?ÞÿmMˆè¿}öÿãýß–„ˆþÛgÿ?ÞÿmIˆè¿}öÿã÷ÿ["ú?æûÿñúOkCDÿí³þÏÿ["úoŸõ¿xþß’Ö¿Ø>ë±þ["úoŸõ¿xý§%!¢ÿ¶Yÿ‹×Z"úoŸõ¿xý§%!¢ÿöYÿ‹×ZÂúOHí¡ÿTBŒ×Z"ý¿}Öcý·$Dúÿx{èú¼þ×’éÿí³þë¿%!ÒÿåöÐ?~ë¿!ÒÿÛgÿ'ÖKB¤ÿ+ÇPÿìûÏL2a÷ÿxý§%¡Fÿ5'™S½Œ×~Ȇ¦¹w~ÐÒ»© TpãïSB2Ñ2…W‚Äßÿ¶ ,;}ópwŸbŒÓîdžåíÔ¾‚DOjozP{”\‹¥ìCÚí3Úñî.<£}Yç_ÞÕ MW0ÿj£¢+ª>¹Ú˜^ARiü'äò$—IÛ7€­1ŠìSE//Ãüø9ÔfÓÐŒIŽï7¬~¼Ë ˆÛ—š)t‚sög_¦V¥´^²T] ³»~”Ðe©n£2ˆÉîkÆ™fIMpÜàð&ƒ›Dð’ç4™¤´¨9%i¤Tñž9.Œ‚#D©”H*‘!|߀ &É‹z$ÞÀªšr¥8¡Ñi,XQ©IËjÙ&qÊ/Þ}çR°TMñ³d ¿F¦Šªi’ € [~ – <:~ ʆl „Ø€Á0>{°>`f°È:—ÈÖh6h&üö‘,Á¯u/  Ÿ¤fQÒ•qÍ+(‚´R¨ ÒJµÜ‰@VŠ’ˆä—Ù¥¯"°%U r¤ÂÓÀ ±h- i¨pe! Diˆ(´C^ ã6Õ:ø€µÈ©†ðe€‚"›†dyàX5¤ °f„hfQK3¬Qš×ÓŒ…,pa”a*x(U 븨ÔÒÌ+•(Í,ÈP ÑÌÍ™0>¨ · !· lE a€?~—d¼ ‰:½Œ Œ:µ0Û,`³âÄ¿ UW&ð"ŒhöJ;Ýì³€›—@øµƒýD§{Dª³¤d”Ø_•¨T+S¯L?d”4Íx¦-jŘes‚\1ñ^Æ^ÎiªN‘E®Ê2ò[þŸ½g’¢º2ÆUÓE•cÄøÛ2ËŒdººú߈£ÌÁ™ô€¿Äšîš™‚ꮡºz>ŒcLŒkü¬ññƒGÄ5'.Á`P1«¢®¿¬Ä_rDFQVÜ#Ñ]]Ù{_}ºªºª‡6}Îö;ÐSï¾÷î½ïÝwïûU½+f„\}Rí!–ºYÒÚT^S‰²”.‘äQÖtXâRßÞ#‰ËòB‰®´íÉ^Hšä¼Ò÷‚{7Ò]I[=¤$WT™ŽMc¤GÔDÂÃá7h&us ã™våÁ ¸Ñ0lJ–•t=Н¾—ψÒ±Ér?|^RÇÉE1Ñ®ZŒÓìÅq’Kñ’ õhd“mËv"¨•§] ?a¦è€ÕÅ4/(…;?G„ávþAâ,¤%@)š‘–²·…öýo°¢ÏRЮEP} ‘A,YY4G‚8¨Àt–j¡gQYUµ¢œ[Ѩ Ð •˜#2Ê¢£q2ªûT¥êEXÍKj´_"£¨çV¸gv°Q´ùkµQÕ¼¨C+0Ÿu+8÷*‚¦E¾OÎòRÎôËòRíæ ¯¢¡.i Ú^Ó¡ ¤õçz´˜¯é¶DÚ¯ÇË”•ô,†Y„ÿVNYjWѹ,õÕ‘,!4–c|¬ö`émìkD´F@Jè.Ws(¬ÁôâéS±Oû¨O]øë+h°M-)ÑQ”î=bµÝµu„ÊXDœ$5˜Ó¢µ?ÐáKðî:- žn}8Ø4ƒª% ™ZŠõ`|M5Ø3¤™Vø!v¸/ ]€Þàƒôèóqx6SUÙ2 ©Et#¥§ Sjhc´²Öùô‚@h=šfiML²Dµü€Ñ’<`4°¢ÑD %¡Àêc€(fûÒvñù¬V1ŠÓ64›pÌè&òð€"fh Ã)˜=‚õÑÿçÐaÒþ¢0h,;$x4IAFàV˜ÑÝ!£ä)¨Ð´ºÏ–©à5Ù&NA’Äœ°˜ú`†6`•kÃ)ÃÖ˜-Éš’á¡Í† ¹i1迚aa|Ãd„¨ ŸÍẟñR ¢Y]ÚmÑ=Îy%½H0ØÕ\9£ªêΜmzjÑŽh%$~DP¨òæ„eŒ¯ Z‚tCÀ<^)EêIÆBv= ïb€g®îz ž`1êÃ?-¶F¢ÖHÜŒ,b,LÀ4ŒØ¸1'f†JiŒ²~X{4ÚfôyÅb|v\fŽäò=Ĥ˜‘Ó¸fd|¼$óiÚ•-VÍSÁfnL®Å~:“¬fÓžf“—œÕëTà'™t Bí1ŤgÌÑÞ—É Øê I²L„F’¤Ú€Š>b5 $M]4óŒ©,þ‰î \[õë“¢N\Ö3°\t›ÙQólžU¼¦þ€Ùƒõ™"éÂæ4jT30ÃBfx£syE é^œœáÅ*0ùÏÀ4D;:ëéš@ðR"«ýÞ+ó©f1§â «0¬Qz:j‘QÜJ¢p3™µL‰Ö?òª9ã×Ù™>kÖtz]Êô††é$Ç÷ DÎdž0œÞÅN“$>Û—õ“hB6±%Œr&‰ HM_¾˜ÜÕΚU#R–Ôvi ÆÙ<²Q)kÔD¦mÍV9ýپŅ= ÌÐhý2™¤CVЫªù³gô=#XÆÆCb˜ô˜PcÅh( ÖN³oæ$ÆÍT´ÐÔ}'ðdù-èÃ!„X—,F—cj|gs´‹ÖzÚ<Ì†š£¿¦â»-¤é5"–‰AWœú˜‚‘p"hDÖHa´A&J²ðõÑ&¹®ÍLp,aà®-Þi®cºb`á#þHàCÔ«ÿ Ÿ‹’8Øz ¦1ý)מB~4ÍK£úO \H]Ä ÓÙ.{Í A¡¾a(j©1Fõz•¨Mœ„#…ÊœD2‹sÚv¹í©¤¡.6Mö l¹pé|rI5*ÄÃ1q!Ë÷@'ó"[üShIbP,âA܉ úã6ôT<}á ²q@oàËÁ`6À¾µÍ"îÝÀñ‚ùâ°På8U¼1NQgøÜÒ’J µtL§Øá¹PÂÞyÒžÜÒñXqû¦y•ßëÆuÛ*DÜh+êF%¨xw¡Ò”îU "ÛžX‡>ˆ¸-lí{û2k'õ Äû¼—¾«C¡€?üüáP‚˜/s˜Ãîræ c8üƒ'¬©¼28Î`¥ÑãlïH„œ$ ³Üx€¦yÍy½ÛA ˆ1ÞöaÌíì~‚~™ýíä¿ 1Áú'!bb e[Ú[™ý]Ìÿ—°oßeÒ{óm^éï¿ „µï¿Â¡H?ü ƒ±X¬úýW9„ÞžTçø@8H$‚B,ÖŽFø8OÇ4Õð͆}Óÿtï^ÐGÿÃ\¬èûÏ@¬êÿµ,¡¦£¹µžó‡˜š§?úùj&BDîYÂÌšÅÎÓÞ“„i I²­¢„_=±­ØWšaþ’p† ðfxåïÎ9/÷Ràˆ‹?»ïßežwå´7ïûCò¹ŽU÷Üÿ'_Û­é3¶n¨Qÿg³ÜwΊÿ~¹²á†'Ïþ—7äÃwÌÝûé Ë6ï¼ëÍ'.ûìá;®}ööé}Ïîxòô{ËZwwÈÕ?½å’Ö]vÃgë–O<íËOÛ?|Æ¿ëäo½ñÖÌ‹?]ú ‘•#Vü¹yâð’ëÈšðñm»¯`~4¯i÷‰ÛWl˜üß¡c¿˜ðÇ3¿Œüþ…·_üÖöõÿ<´ûØÖ&×6¾{þæ¯ù[ã¦OOÚýÖíïn?dɤ$ýoR»íDí‡ÿšjÝ|îšÏ¿½îЧÿu×KϬ]xºÿùƒü‡Ï8ó¤cW_Ü}í—w­xtmKtUÿ.vÇA+_z䟻§îÚ|üþ×Í 2Cç.}úôëŽþí;ï­ý´ýOÓ'Õl8D¾ðµ{wϽèúÆëÏ¿ÿÍý?>N|bâw»–î:c÷97_zûà]G>Ý,ÑíùËð¦Ÿýýês[>šqë’Û'®¼à«¡Å ÷œõÀÔ^øÚiÇœºæô£~=òå¹·t¾0i÷Awž3³£ëƒöŽ»nýÕÈ„I¿8¨ûÎy''¦¢üjÍiSg|kvåöóžhzë™S×_ñÃc.zUüóú]×ñϹôW¯%oÛ}媥o>xZý'¿Z0z½OLkxå‡C5·Ü´hÓß_={ëÐa/Œf~Ÿü‡É½›ž[¶¹ä‹)O­}xCãsÏ-ëÛ~l¸óÔG·mé?æšcÞiܖɼÿŸ¯¯ücÓû k¯^yÿçÛ>j­Ûù×Ã/ý·Á‡š°Sâzå“Vo¹£ëÒmÃ|ä”Üñ5+åîU_{åÞ/\5ñÝuþ×]6áÊ[/ÜzÓA ï?´ý¨æþë>ûªs&Löà²ÉŸïÅ'×?{Ňó[>~úS“|ÃÈ=vó'¥/ûÉŽ¦úÇïζ\òØß¦½poscòķ̽ñÅ«7_{ÿæºÎ–óŽøà“GÖ®_³zê”¶£cÑ£^Þtè]·½~§É)]—¿÷ë&ÿ‹Ûžz9¹ñäWoœqÓ+S7®<>tÜɇÿò/çnQî>%sHÓàŸÖtïî'¾aÍÖ_Üxåµ[™#–Çwgó§ìŒŸLû`þ±Þ3¦ÍZ?eÊÓ§\þwO®ßøÆE‡­ÙòÆ}¯Þ¾F:ò½ ²/LŽ}õ݉>¼ËIæù/~³zÊŠî¹Bžì_ðËÇŸ6qçôË×­Xš¹ÿGwÎZÓ»|è¡ËOÜØòЖwž}¾á³÷2›®_°|ÕŽcîùÿõ#Ÿ‡%ÌÊÃs/ Ï¿ð¨CÅ£ç _3m`]s÷ K¾óêÝÇî<”?ú±¾=§}ÒÙu—=rwò×}ïo?êgþGvÿfùüäZWPxB¥ŽêÊà(\ÐwÜZ`qFÎÎÒ"ß(úνþ~í"†MÒ—cIrÑBðµÐ$€õ}• éPäT§ v±`V»@V¡\˰:‡¾+Z¤?Ká8;ÂÎÎfe5ו@À"¶ R©Úˆ‘Aç6drK(»„ò›#ì™b:Gºhm’Ì"‚Þ!KQÎ^QÈ«¼$÷(BR1GØu`ØöŽù„khÐ3&iUý4‡KÀB+A8XªÆƒ h ã$Gÿ˜ Å&Ûö༆a;1'¶–~fClL>hÓêŒ$c”ÿ¤¥ú–ú'ãLÜž/$6ò9¥Sx½Y« ”ÄÊ å¡¤ó)A©méì sú圪ùä…µ<JЭ Q΢'ÓÚæ™Á€`”ƒ•q8 éóå´W’~3A­ób‚î’7àv«y™­íÖn'èÖ®'¨ÃïRUI¨Sg¶â°"ô2ÐçƒLánÜäöÆáZJÖ„E‘"—ˆÁ`nã„´¸,ºuÂB.°H˜+Î.ÆŽç‹p˜ª¯Êé"~ý„W$ehkª¦øÑf¯L‚šþ¶5“®Ú‘k'\5sáÕ7ï:ù¯z{ÖÔºbÈ"†ÎxE¥ Ëűêú¾¢‚ãþ§ÊñÿP½ÿ½,Á!ÿÊñÿP½ÿ½,Á±þ*Cþ0ÒUå_–ào¥È?R½ÿ­,Á.ÿHåø©êY‚Cþãÿ¥êÿ£<Á!ÿÊñÿRõÿQ–àåø©úÿ(KpÈ¿rü¿Tý?”%ØåÏUŽÿ—êýÿe ý¯ÿ/Uù—%8ä_9þ?ª÷ÿ—%8ìåøÿ©Ê¿,Á!ÿÊñÿR=ÿ)KpØÿÊñÿR•Y‚Cÿ¤ÿ—êùÏý¯œóÿªüËò¯óÿ‚ªò/CpØÿŠ9ÿ¯žÿ–'8ä_9çÿÕ󟲻ü£sþ_=ÿ-OpÈ¿rÎÿ«ú_–àåœÿWÏËò¯œóÿêùoY‚Cþ•sþ_=ÿ+K°Ë?X9çÿÕ󟲇þWÎùUþe ùWÎùõü§,Áaÿ+çü¿*ÿ²‡ü+çü¿zþS–à°ÿ•sþ_•Y‚Cÿ+æü¿zþSžàÐÿ 9ÿ¯žÿ–+8ô¿rΫûÿe ý¯œ÷?ªò/KpèåœÿWÏÊìòUÎùUÿËò?çÿôþ×H,ZÝÿ+c(’Ñ „­¢„®ì {Ñ(`ïûƒLölò†¸W½ÿ·¡fJGgýì´Ü#Ôý¦¦F¿eq&q^³Xò–Å:(ÙŠ¥´µ ñ®¼`q&™S¸ì¿:[6ùå|=>6ÊÃ3I(‚ÿ¸h‚€ì5Mr&ƒ×€2èì󣛃E–ä>†m–Õfô}Ä5'i¡—1€šC†Í j~`¯ŠYŽŒ2Ô©Û’MÉHõl!Õ$x—#¯(üE@©†iël×0I$…"¤O *(ƒ¼Dòæ3ÃØQ0„¤ó$ˆvv‹ã Ƨòª`B‚èÒMTRùL¯$ ›à0€Ó¢ 91g=,”Ž£˜€TQJ²ÄÛ”Ò¢$ñŒ6Zllà¥-Ålp€®ÅÉl´ØØà€6;>¨v› >`¦­Ե͆/…ÎlÐMØólDb@ï÷ÌšY}Ÿ dølºG2 †¡¶¼­`jËs²¼“lˆð…’PwÞÆkØâ­")GƒG€ÁÆBXŠYˆ@ƒ N"@T°…~ÈŠv|À¦è‚˜‹ðA=E¾(PH§™WMpœµu¤(°&ÛhF\L3 ¬ÈNšQ¨¯l§ umbÀ…œƒq¨ß„@©¼]æÀE¾˜f XÉ;iÆ yÍбãƒ1 Â05覓@B-áHªŸWøÞ„.èZFƬ b¶QÀ¦ĉÿ{Ålº/;ƈ¤Ý¨nñÙbdÜS&lk[3É {DÆFÉ€<@ÿ±Wr‚YfŒôÊ /I&À4mN+F-›Ryïn¦< 3H³²ÈŒÑŒì1#äê“2h±ÔÍ’Ö¦ò’˜òHl”¥t‰$²æmÃÞ)õí=’¸,/”ÈáJÛžì…¤IÎ+ }/¸'q#Ý•´5ÑAJxE•éØ4FzDM$Œ1ÜwkÏ$Šœ‚ñŒÐù× ¸/fØ”,+éz_}/Ÿ¥b“å~ø¼¤Ž“‹b¢]µ§Ù‹ã$—â%AëÑÈ&Û–ìDP+O»çhè€ÕÅ4/(…;?G„ávþAâ,¤%@)š‘–²·4Úˆ$ä+ú8ÝèZÕi°Ä’•E€@s$ˆƒ Lg©z•UU+ʹº½P‰ÙA0"£,º(%£º&ª^„Õ¼*Aûå!2Šzn…[qö`%A›'UÍ7+ä±óYW°‚s¯"hZäûä,/åìp@¿,/Í¡ÁAò*ÚêŠ0¬éÊ@Z®G‹Yñš.¯Jä¡ýz¼LYy@Ïb˜Eøo唥vQ‘Q_ ÉBc9ÆÇj–ÞÆ.±FDk¤„—ÕkÞ/5˜^œ#}*öiõÁ}Ͷ©% ÞÆ®{Û‚Xmwm¡2þ?ö®HŽâ:;P²Ù1„ 7˜ã™™=޳Ngˆ$t`Nâ˜Ý»ivç˜Ý½Ûå|*0lŒÁ!à€ã"vb~d0¿ÆQA€Wád~bâ”q"c'¯»çî˜JM—´»ýº§ûu¿~¯_wÏõ§á2Qn²D£§Yô-ú¦Nš€+²‘±xðiQ3R5päh)n“p5ÕfkÆ–fÞT¦Øá±" ]ɪ:Ì>(kùãð£ê¤– {Ê€®ÖððV ,¡Vh[¢CQÉoA˜½GÒ<½‰“©å°›¤+ű ¨ŸNܺ‘/afšsªàAjÖòÅᮣ··f¤"ê¦ß6cl}}M²)SR‘ÑM `•³~û÷€DüÏÝÂÖ‚],È´Î01LE™â_2ÖžQ ì³$#Û¤çÀ„Ú^C‹t­µoŽ“@âN*¶Ðâ¦ð³«g ‡)È»d±‡œ Ú”úa¾¢ƒˆõ­ð¦m$OcÁ¥0‡dÏC…Œ'븳 f¢% KSM ˜RNF¼ÝÍÌð‚!¡E”×N÷AÚ¶Äg‘,{[,Ës—‘äGLÏ«³#¾7Æt—‘@¼'}Ñë~­J‹ÞV¥ç{.#¡°¹%£¥Ão-±zT^ù@¬·Í…¹ÅÁŒÏŸC*6^·Ãœ¥9R†¯ÇzÈÔ äíÃõ`qxº½0Ç ¸’0µ8†æ\ùìPÊÌ0² ³ðä `Õ9°ê"Ú “ƒšE¬Ki«rxN@®ˆ¢R!ŒE?:NÊ’Û¬žfm„Ù™‚j¡¾>\–SFÔb’«Ö¬±§ý…Zr[ÿhc¤QÇ”Ò&ÚQo¤…Ån61,¾ªVV;ƒxyjÔ£Kn·½ ë\k3Ç‘sOÛù9:h”à·¹° *°™÷ ÿÀǬ¶¸Jù™LÍ‘I¾•9Æ}¿ÌöØ/‰zý9.ê,r™L«‰£!Ë0sÌQ¹¡©V«åletTm4¿ÍÕ^°{^¦4÷Y«ÎÉÒtrî<O¹S ¸ƒ„V®-˜³€Óf O¶mÄEškÀŸZ¥›Y‹eÄî"·ŸÈ³î8[è,ŒºúPó Ù|‡©H%˜„$`žíRäìN8–NɪÌêãÓ„ÈIä – °èŸœÅðÑú8߆·[E*X…;ÛI,Ik6¿5ïkW‹±·¯'….F7X‰tO‚.eñKÙzÇÃ%1î³<\àû?…ü<^ÎjýþÁ}ÿ/%PüoVŠßÿ #ä)ŸådA)Çò² ªRF.›‘3§|ÐüÅayÃõ–Gs¯cýO¥RRÝûœë¡m]ÿ@×bÚv¿}ýíLÚEr>—î“cÐðõIø­—ä+ý0ÝçU‚ìKàÅ«·íÝ8|ÎÙ•ÛþõîÃþûƎ탗sñŠ£ûWÜðŽ¿óàGÿéMQ=øSã×·´Yº@yóä³÷½¾Óc·½þÔÀ†ïžt´üþm7çïßþÜ﮼°ëø__sÇ™'®xbäï'öíxôglXóøe‡ù¥÷”¯ ï>aÏaïÈïÿÕÍåäæŸ}ìþÒÀ)G¤OÚ||Í÷²S½Ù¡[Nï½úå/·ÿãþUO^ü©áïßþÑÿJyÇ%×£ëj°óÐîoTúO¸ÿ„ƒû†ïÞù‰{Cj×í×íh»A9°ëïßuížg_8óÇ—ïzá{¸K¹æ¾{þãùÃ_ùÜY^xÊßÿý!îɬqù±w¦néØväèÊÌ-§oúÍåoý¢ó¡ü{OŸñîe·VöN}Y©ÝûúÐÏ>ÿ#óO¸›_õø£ý`1]ùíô]WQûÜ/ÞtþS[?ÙóËökoüÁó?:ê™™­?ùÌךÜûÚïýÅ)×켯tõdßŧ?Ö¾qûþOÿî™ó®ºé[¿_:tZ¿µðÆCÞ{ä×>ÿÚÚíÿýc×¾û‘Ž®êøÙôØEÿ|`Ó‰ów¼ôê×_ZùÄÍköô¼Ô~Þ·…éÕ7=µíÐïÚ{Å%Ÿ}êà®÷w_»÷¦õ÷?3hx÷­·í{lûà#íÇ]½÷žÉÿý©þÝ+¹õƒè¨³{^èYÑÉÜ7˜}ø¹W;ùª¶ú¦Ã¶¬øæ#è'Éž|ëä=··_|åŠÁo¼øGù­ÛhÛÊ×úšB̧Yq>ót ?†˜_Ä<ž/>ʼn$µD˜ŸÓŽØÿ˜y^l 3O’¢3ÏÊBT<Çeê çYI®ƒ…gE,§­Ì<›ÎÔÁ³r=#g@|™zÇJõ4ŽõÐæ3ÿ/ßLiOÿÃy\ÞuøÃ?Èoí¬§aæS9Ú«®è„€ÿûãûÿB ùGçþÇøþ¿PB@þѹÿ1¾ÿ-”à—*:÷?ÆÿJètîŒåJètîÿ‹ïÿ %ô?:÷Æò%ô?2÷?Æ÷¿…ú‘ûãûß ùGçþ¿øþŸPBÀþGçþÏXþ¡„€ü£sÿc|ÿ[(!`ÿ£sÿc,ÿPB@ÿ£sÿc|þJðË_ŽÎý±þ‡òþc¬ÿ¡„€ü£sþŸÿ†òÎù|þJÈ?:çÿñù_(! ÿèœÿÆç?¡¿ü…è¼ÿË?”dÎÿãó¿pBÀþGäü?>ÿ +ô?:çÿñùO(! ÿÑ9ÿåJÈ?:çÿñþo(!`ÿ£sþË?”tÎÿãýÿPBÀþGçü?–(! ÿÑ9ÿÏB ~ùg¢sþë(! ÿèœÿÇúJÈ?:çÿñùo(! ÿèœÿÇç¿¡„€ü£sþŸÿ…òÈù|þVðË?™óÿøü7œtÎÿãóŸPBÀþGçü?–(! ÿÑ9ÿÏB ýÎù,ÿPB@ÿ£sþïÿ†ú÷?bù‡úóÿxÿ?”ÐÿòüŸâ?ðb¬ÿ!†:ùÕ©‘‘’V™Rʹñ¼16"``Ó‘­˜Ó»Õ‰ùvpsü^¸”_þ<Í@ŒÿBh;aÝPת¼‘U»øn–ik³®¿ïAÁûï[^ß Oà§èÕ÷ôæ{ …o¾ïAg¹ØX0ØŠyœßýL°œÓ,Åe(ÀÖ™F¡€1öla[HàÉ~£Ü¡Â rІ»m"Å#Ps•²VäÐ4Cð<“«‹9×z¾šƒf HÅ4•)RY†ZKK°“ ¥1–;ÁÿžTt vmÿf BùÊJ±"J®ZíÄ8ˆ)¹JYu(<†4ÕÌ\¥0ª«U‡,9¯©¦ZÒJ‘☉{Ŧ¤‚¡åB eMÏ»Y$”<3§æ5]Wll¬ö±oã_]ÏÅ­²Á«}lpÀÆ ¿«Úr£1¿Ô°0‰*ª¡²©KxÝÏ$ P¨…Z]2l1ö3£Hµ ð3J‘’±ªZXÉ>=uˆØŽÐ't¥¦šDyKê¥Lbz,CÄ øT*êBy˜ A\xèÁP/Ão,\ Ð~Áb´[†4"x#¢7";‘ÍŒ‡ pÃÇ1³UŠ26,(UúÓî[ðè+¦ŸÄ$üe98Tªd‘ScÁÈã5#“PtCÉ“¡ì±rØ<¹†Ô6s3–p=ö3˜ä5›þ4Ÿ¼Œ¢Õ&—?ìd’‰ k#&+c‰Œ¾B­21ák+tcÊGr ´“ô²H‹"n¦[¥£‹N^Öv}`ño;>Ö6]õ[NÑ^Ö3°\läÙØ‘‡4pÖu ¾ÀìÁúÌ4¦,as´6›J LÚ¶æèRÅTÑD~;g&tpþ à†ÐypÝPYóO˜j÷—Q‡&”ÇÁŸê×Je<éšLÒ~z U2kÍ i¼•Dp'9éq•²ãñ[ì´÷ö¶#XÒ¢ö¾¾vTRFUdt®: œÞ'µv“t¥8VõÓI‚[7ò%ÌLsN]=c8LAÞ%‹=䘶ÄÐb®!œ=õÃ|EsäÓQüÕºi6ð=‹$Ñö,8ŽÇ1kVÁ±Œc=¿ÝÙ3Ñ’…¥©†:¹ »AFrÊ.¸o6ã½f{«¹{¼“Nw§yD>¤nëGº›…I¸›‘ öžÄn¨˜üâ»e™æpŸt?¬Ô4¿™©g¯zÀ±ÄÇ3ÃÈWE\¸Q†AÆ£Í0öˆUD¦$J[•ÃCXKŠ^Š0Ž*ýè8)Ÿ‚¥‰ìÙ\σ®kÅyœÂ®¢¾>\Šó(Æ\e’«Ö¬±íÏìCŠ›uH5“µÝHK*¼˜!QKª$*9Q’Ù6ZYYÚêZ ±VjÄI)¨-S7©<æ1þ܇D2,pÐq¨«ÑÑרIdá E š$6²ÝB*ƒÏÀí]zžuT C+s ^^B\ þ 2ém˜tiz÷G„¥eK8'½E7Sž8ß‚tŽ,òPë5/y&ÙtÓñµ\Å[ Ý:HóJAU| ièe!µpóMæÅtó·ÜÄÄ’™ˆÖfÀnŒÕoµzŠD'J2»Ñ3L³‰liªk1>S0:¸Û|²®]®éÆ›º -ÖpÊÈŽ@·b…àÀ¦ØÐ[ÇyÈÍqiÄËT"T2ÒòÚÌaÚá|>¯ŽbÆ-Æ,¤ô9[Ùë ¤‰o„»ªX°þKɼš÷è?´TõÀGÁM Mµ§mpã\§Ç<]œægó>gq]ÕBݘúø§D pR‰5 $×7XfïÕ5"ò¢= ðmÜE@ŠÄ8~¥É×r{ ®(ð,.»R‡´ »Ha¾…ÏÙ>d¼ØSp©1…kX°}È$ó©T û¢—@dÏÚ¢€cö¤ 1·qNy.kЦ¢«jéÀw6MŸ‡°Tº¾H×!³X­Ç@\ÍÈ ¼XEàu8¢ëð¬„Dñ¤A¤%/¯I€¾n,Þ`‚÷ìJ`¶¥ÅX„ù—=Wƒ xý!ƒ_ ’ÁÛbn„džÍyÌAY+¨&|›ª’ÓÐæ8ó4t¯;M‹¸‰vB>¾¹ÁžÝ,¶¢ÑK‹Hª3´Ki.Ð8¤Tw*¸1à¡-±–`AÌx÷ð,ðNHv6hÔêsüÅ-óάÞE©É¾$LÛ-ö¥–§ð9ûK¶´ã%¼]–rU#Q^èF¥åœÙRHYë=ü"'ˆ`¥éBÚIçÓħKñúMÚܲJ‘—ðëßt¶dh›û ËVþÜ×K6Ùòð[œIË bømK™%ó©Ì.¯  zIö.³dw³&,F (|VXçÎŒ}ÀÌ8)ô¸hƒ©høàžÒÃ&ü²C¶ÞBæpIŒûìêµÌý*öæÿþ!?ß¿Ëhýþ?þý‡Jsøâ'–ç$Qˆßÿ#Œ²¹ +geI‘2œ4ÊŽªù\J€é “vôƒæ/Ëæ¯ÿ°r˜g³èšçÒuÿƒÿþ?Öÿåmëúº¸îÓ¶ûíëogÒ°®2²[˜ÞÞä¹ô=¼ÒZŸÐtüÖ{r•~˜éó*,-aºV•S½íÛçŸc¼Âþè[8æã7^sÙ[=—Ã^ò—â÷Žøáºjá¢??î­W?>xïÎï{Ío>µã–“µ¡ý»¯ÿå#â©Ï^µÍ|gêÍçµç^9뉋~{ÏÆw¯´o|뺙»ºÏþŸ/îûŦVž,tÿÙ=g¼üóö›·ÝùIƒÝtò~õ‚ë<ðö¯FïÜvZ±ç1y÷¯~üòɇû&Ïyì7š}±ë·>{ÔuôVÎa¿ðµuÿç{Ò]Û†7*þÝ{o¼~ëÁçµ3'¾ÃËÿvíqc»NßÑòñûÖ¯,ïýê­+Oºû„ÿcïÊ㛨öýd ¨àˆÀZ43Y&)B[ÚÒVèBÚ²5¥¦É¤‰$™03¡Ô’Ëö@åVÏõ©O\áÁEÜ@ä‰ *‹Ê¢¸²È¦(¢¨Àã>yçœÉ2If¦i©i?šóG›9sæü–ó;gÎùÍ9¿ïók”¥.=zxgÏóK™îß¾žÿ=sÀ}5ýĺ*~,ÿÙFÝݦËFõ#vž9Q¡Ä=çnKîMÿR8·ËuÕï¤/û铽+R˦fžO²LíöíêŒÁë*4ÖÊ~9LmúpëÞ¿œWTù\ÞÒqI—«Þrãþ'Î[÷ŠeVïYûo8ûù{ß¹õ†Ûׯ\üÑü™‡Þo_a|àЮª¾^ͽ¦¹ã+Ù]G¼o²Œë:|ÁÙeO5olÛY W:v]Æ‹Ó.ŒÝûü¬ÚÁÛîƨ,Ïoüh-6ëÓêïq§÷ÕÞ0øòjvßôiVík?0kÍÙ…—öÜT÷òÄ ì¼2ßÙ³ÍÀŸéô9ßLZñäÛs®»:àºî¶ ä•÷w›ætÍí^wã¦ïÙÇn¯Ï}àþüï ¿<ò®ÉêúùÇAçîP°mT6;þkï@ǨÙ§o¹óäú{´|3²WÿYÖQåóËë¨7äš^;NÙÒ/>²¥$ûtéúS_LþêØ¤g“õIŸ¬¼ºÌ¼óß §ÎYÂ-ëîµ×p23=ã÷=Ãwº¸Ê7oÂ…£>ÝôÝñÌK NÌ_ÑÞ4ÛVð›éà˜ÇŸê`r‘øbñÆn‡6ö_´{à»¶¡>Ê\¸ÔeY=q]ŸâÏß’÷é3\ßÚOfô¦=vÏ´›º\æe—Ú-|{ð°šÙG‹:}™³¦÷Šo¶×¥öÔ±#.Èã2Úvòy¦ŸÇ½08ÿ¾ßÕ/é ÞcÑÌgo;gÂ$L'ý½ü‚=HçïI$I²4¡ÎUZë¡Rá\4µ€²:Ì£é™ÚàèßÌT¡H5¢H˜ ”B»oÕ°‚lÿ¾8TRÌЖŠ+O}K-¥fr๜™\n z×ðŒ{€q-º65Óí¦9¶Ü€2pÿçÿü?D¬"5 < OàaÁ‡ý’¨ƒ’`H ÉÂb©cV+Wð”+0x<Ї+1sf']¨BAŠŒPZP>EjQq†å/hˆ(ˆÄTøýn8X® e2Ú]¢z ¸ÝüÛJS3ÁseÆü†·ê(RK`A¨I¿_ ¹Õ‚| J2¢VCgŠã¿okd‰aS@ƒÌà²Z!I }Q#eY‰ñûdƒì²ºzí„\ûòìÄü9¤A†Ôòú»‘ƒ—å'Vlƒì†#‰lß(è:‚·³Q¯Ð‡ßÕ‡nŽ6³ìõ¡=мp0/Dfá¡çM«×B1É9%ÅX®f9ÖÂ8<¦WâZ :#ì ÝÙ &g§*¬á®Që5:p¿€¶JÝò/NŽ<]l’=^lJfzá!ÏdÄØÄŸ1N‡Ë8'•œ›ÔâL†²)@Ë願N«Uk1æÏÃáf(þŽ;fúÈ<\EFå©ôÐí‘§‚­YNEÇõQåpƒA•GQ4pxz22O«RGåé4ÑÏ‚å]4]u4]ƒNÇùý&èC<ÏóiÐvè}OrÙhŒi¤ægcåÉyo¨•'½¿,»åÈ’ÊKóR7¥DçT(ÐÔÑÌp¨¡€ ª¿²¦eSDü—Öƒÿˆÿ—ÞþºÿªÖ¨xü×Dü︤¨ö·8Í,[HÕ”8\^'|Uƒ¥?e´2JP¦‰4`ËøHØÙƒþúTà]ðÿÄ#™ì`ÈTS\TÛûê&–B{êÀmÓð`ÓpXÄ4²àÓ˜‘²Q <ÉçS˜ÐÑÒº ËgB‘êDneˆeú| ŸÌPg8¬`¹hóº_ü¡,˜Â¬œÂÌc…ç ù­´ e²|e0®”0Òƒ¢ÎÄq˜i ônz­–tW˜É›*MÃAiø–„ÿA}J{Ò¨$ŸB‘ï¶SŒƒ3ËðÔ4cv!$µ“fBßêêlŽj/CùÊó*þ ‘AmQæÔ m¥&?/èԑÖ£oz#5„ÊÃUÔÁå —T(ôÓ"î*+Ñó j01Ñ~6Y´4Íð*‰Ÿ$z X)'ˆ°ƒ&Ö[åoè;늽U0ÂD媋µ1ûð¸Ì¢]³…Ëç(˜Ñ‚lø…)bê•fì ¨¨,Üä JªÐ‡%ç–XÌnxÔ8Édf¹$–¿J‰µÓÀús°œÏĺÌN'’ÉÄÊ’sŒ,Pbþ\ ¸°'%?äŸá`8¯Ù‰Å¤ð@’ t¤$9m4Bn<&¹³©Å®¢é!|u0Ųþ±þãèi”0ƒvXSbàËH™­`d2f#Só4‹:ÆfAƒydK 6àí06U¨ÃTÐ,]¿ÛR„xàŽŸ†bSFªb·uLö`®öîa.гÓVî  GvôR°ØN+ ¼àuZÑ;„BùðýöÍyÝptt€µ.ãâGJ‰6d„Æ—°Á‰¡9ð›²b™Ç8ª¼ÕL#“ŽL7S ÂÂèÕf¥<œÝ³¶=±:y0V Ô  LºÇ4 Î‡….2Yðþ]¾\±dóÂev×BíƒÞŽ¢0Ÿí¡Ü)ÍÒGÑ ¨@_û0Œ¥]f§œ0èDÈÐáPb1£nì•°søÙr#úŸ›M«`½¨M jõ4¾”BQ z‚Uhبópv@©«1³X5&qf8¼ÛÚ…z Laé(ì]t¾°˜œÁjE£ï…TDaJ"Be0`ÜÌ€üÃ1W%:$ÌùEFL!iDÂJE–`[á¡(؈T D9ZPÑþlÉT§i=AðdHž€fÅ)‰‡BTiÐ9.À%!uè2ãºcC1«3Á©7ŒõHúniä‹À?5kñ?“4jƒ@š¿7Fô«UÊ$ã†byàµí¤à&NÉö«7L01"¸V@$ÛëòH×>šDÔ£vŽ,‰jäj0í}B‚{JE«‰ÍBCLÕ`ýDH¡™äRopÇ*˜AˆÐÒé­.ßÖ²Í %´Ž ç'h¦lƒÌÄlZè†m­°åKdi‡$o&Úáo±S–iAêÌN/åç 4æG…¼F—àOì¼è”DTo–j5É_^-Ëñ®ýF2ÈÛEà*d«ûy‚5‚OÜÉg 02昆ѥBïoYòÂI˜Â˜Ùi2tÃ_Þ!¢*n¾¨¾Å^I H“b«R­*ɽ ­;ƒ—30qÑiÑeãJ‹¤Æ^5=£ˆ5?Cƒc¤`hŠn‹?lR/;m„RjôBÀˆçr¢? $ê@0Ûe‘ˆ`>o&.Úq$^C’£a0/ &¤OBÔ)·¹ ت]±åƒpˆÖŒãá5Ï€û0"@€7ƒ2|} w Ï‚Î`c­‘X¯ÇC3œ8’«$IÔJ~”’Õ“adÁxB1\¥ Œ²z Œ†aõFL¼‚¥„ôÈp ²R±RlÚ:u´Š­fÎÜhýF4xxCjElI†Œ´É“’ê÷:FØïáå5÷{Z~ù¯UWÔ»ò†Z/o*R~¡×õ‡Zƒp^]èuÉ/¨D«Ð S0ÈšˆTa}V|‚«"…v–{NXYUÓL­ø,_¤ßùðåG ñY¤®ZRü³8Æ)³ÀØ!¨XhZ*JMCFÉ*ILBÎXȨµ‘dP4I‰e“!¿êõÑj•R$!´ˆl0ôAÉ¥mK8â‘ÂiA¸÷L”.´™àÂ,›²¹£E”žpˆ4¢X‹ ®1M¦ˆë>:Á»I´ýî9TH¡4Þå«s)òN/±›ÝÕ2®Æ¹@îI’ï^)så<Ì}ØT¿¬(Ìs÷Çø} "ÂÓÒ²žÈQ˜ç pÄ7|£Y £&J(Ì5 A«â©5ìf’Âd„–ÇÔa^¾/ÐoÐdND ÒäÃü%’:ôw5Zçê0Ç^I:#׌:tôÉèr÷$ÝÅÿ¹¼bÓÏCLW.ž¿ëÄ–=é'—¦ŸÞòÅÛó÷öz«ë±Ú]uÆK=2*.L]¢>¾†ÝèžYôXI¯Çö¥§|=xû]›znÅ??òÊ⯠OõyúÝ»ßqÛ¡×ýÒÕùݽŠIê¼åüñû®æ–uÖ´=±ïw}ÖÀÕ“~Û±kêæõ{²þãþ¾ož4Þìx”øo&ó£±e/-Q?ñÌëOL´>ϾôÖ±—þN,ýmñ¬'G÷¼tåRåþµëöÓOÿþæTszÁ?‹ß˜v±æöÛ{Yžër¼Lë¾î‹4óÖnrÞüFûC‡ Ó–}ì~¤Íîú.{ã3 ‡xåúúôdÿqø¡Ÿ2×9–=±8›×óvç¶×Þt_÷ÃÕ/òvZ=ólòÑ.Ÿ·1tîx®ëÎ)mñŸú.Á ºÞŸzv RÓ¯Ýãûo Ø0èè­¦}«êw÷µ]x¹øÒîîsþÝðôà½ÝïhûBIY©-;Ñ놂é;”ŸÜ¼üð”õúú哞¼2:ï…C›WjÖÝ›½¶d 9Þzfòg‹ÖíºãøÖ䫊#×Ôé:ý£|Ó„s_[½à»ï3”{û¥íXõB·Wo»ºý?_>Kï²NîwàKo·Á ØgzÔ­§G÷>ï\>åjÙîÌêÿTú¼jž´ê3Ky‡%5'h=>Ì6ýù¬eÛ³_Z¶}üÓË7Ͼoîûg.§-_ÙnÕäïOß;d߇·n«ýu“iêØ»ï£Ùº´¨|eí†Ï¦M9øÐ/–-ŸSñAÛ§‰ÝwL-¯àhq§M¹ÞM[_qñ¢í?Öv{´ÿkC²>ÞsÛÊ‚¯ïØb™Â}}Ûáÿ{vÁ´¢'‡ÔìZvfvïžÚVßc˸õ[Csíä¡ÃWg¼bœ½®ëñóçŒç{jÿøyϵ©¸|zû}JÏ\çö}­=:oCùãºæ¤¼©è‘qêÿ¸êÖ½ó¯A7&oK·~’}E}ªjzÿ_uϦî+½³óC‹ó—$áÅiyû’·-Të ûÐ’j%ª$;¼¶8å@c|jɾ!‚²Ã»æÓ* G›Hq÷QNh©&;CÙê€Ý99:Í îÕ [hÈUòßœ¿Õ”ÒMq>Ôú –v ð{D˜™ÀVH«P)ñŠÂ¯ið#… \)„þñ04BÌ?­Öè†àå öö@$93‡98¬¬¢`à›×9 %±‰ù¥yEe¥Xfádlb¦Ñ˜YX:y( Ôî£R¨‡Ëãt€jk`¤b7W ‘¹ rŒYy |æèüqù¥“1ОcòK sJJ°1EF,+Î4–æg•Ë4bÅeÆâ¢’%†xF㘇àHN02Ѐq`&£K²ù°‹[J¬„âqñ²hOmÐ(`YVÄ5º]:•ix^q~H%¸$ ¸Ó_‚£«léWà_:EÌÿZÿ7áÿ‹KŠhÿ÷ÿâj2áÿ‰cŠjÿЄÄB»9†v‚+´¹¤Rooâ°¡õŸŽá?¨I¸ÿ×àxbý$±þ‹n{é5 ¿,ÊA¥•vÙ• ¼E®%UG.E¨Ç°,ä‹bþ‡3ÿÍâ)ADÏý·A_@d•ZøÑh›¼ÂA M|Ö/ú5.D´ß<‹$_IY{‰e¡„¦½¼ðhëÇ~F€œ`’ʳvÖbhE¼ è L™›E.œÔ#¹´©V›¡¹€ú. ]: ëÿ³wÞQmW±bÅNôì…·}׎T °DñàŽ€¤[4ÁØb×W#j VD£± "5Š]!¶Ø[>õ}5–˜oçŽã¶ÞwÇzÑ™?€Ù;fž™gú>óü,¥ ÝÀܽ©ëåã„Ùõ^/Œw8ñ؉Ƹ†»agÜ ÖÎóþ®ÿ ý;ÏûøþO‘ пӼÿ'ÕPÿJ¾þ™wþþžÿ)ú—翆ûŸjÐ?ìÿŠ‘þå_øù²›诖ÎÿP’D¾þQ aáùŸÁÉø¯(¦") ò_!ÿò_!ÿò_!ÿò_!ÿò_!ÿò_!ÿò_!ÿò_!ÿò_ßgþkÁ•üWà<£?þ+‚rɬ8—ÌŠë†L`'N̬½™ñ ŒïÈÒ XÞi³=°¨ü¨˜LüBŸ,ß=½%ª JóêD-Se€Sh’~Õ€3õHF«‹“¦¤Š ÝP|lD”n„Ö’•[£\÷äÜ4qLœfh” RÖLªÜ¨Å*ÇH^•cÖ€_°¨ù•×ÖÇű¯åIûGä€Cÿž2 Œ,åÕ|!ìcEIx„› A?b$ˆO6f·gÚ® ?ú‰i¹8%‡®)Ù?ͳ^ø b¿x@ãŒ!&™J#ÁÚàr"Œ MÉÜx¤ÐNºëGMi‚@‰ràYàŸÞÛ•]G4Q}ÝJtDÚõÍN²ò%ÅâQG|µ¥â3'ŠF& $ßt¼ 1HËÅ¥'˜è©ýXß^¬–0éÌ.ƒtz ¥ø%"FÓ#;IJæ*ä–”%x‡•À%!‚Xº¾Eôakë‹´7«š™õÉã˜DòÇIŽ\Vd‘ÿ%}‹2WiZPî§WK½Þ¼¼3jß ÷*“ÒÃð£>§–ÜÆÖt:H|›;Z¯Ë“€aƒ™´“YŸ$u<4톪tÝì6Ù{üKNmTµÑŸ•¢®x1¢íTª‡OúÙ€³a¹Ñ/îjÎ=[é\ªYüÄrËæ^ÚüwFLæÉ]52^ÜØ?mØÙŒóº[%jôͪðó¹Ç¿w›wî·ÖÑ&ÎxT¿Œæ 2›,¶ëÑGÃúõÓþð´Å¯A9 –xü9¯×æi—2§§ü8ec+oRb¾ºçîôŒo™c·2ºk¾ømòGÙ'w*öAîó*jXÃ1ÞË\}Vîôy¹¤þ»gÎÛ[©m–{@HÏÞu½N§TmÑðÌÕ§ÉY/]#ÿŒk–“û÷µî³uá=ú®z>0Õ­ã'ÊM™ñ6pJƒpjÂÊÛOO§Ìºàï»ýÚï¾™‹Æ×fž¢9W;-¢£Š—wϬsPí‘·â×ÝA®kŽo›òÏ¡Õåw…îý%©AÕ]+¯®OÐ-$*ôâ½ìVÍoÿºOߥ ZçÄ.Kßø¬v›Ã³zÔ¿øó€/;<ŠÖ}×rCñå[WžžárÞUûUå>7›S¥ÚMjܰ9s7=ðØ·ü¸FDÐÚý˜ûßò?v¼åZÊU7#õεñÉ3+§ÅŽ_¼XëÜíôœO4½>{p6`Ìú¬Ôâ %¾óo=Éót´çæ¬M¨.OëCðÂÐú fOÖg ­Ý€0*Ã!;eÖ'óŽâýôaò€>Ì©}À Áð v'ï!jFÊS3m f1ðOâ[Ab.–\=c8Ï èkºhÒ•­A¿~ڼ݆?C™·{7—x$ô‘ }v¬ÿß¹ÿWèÿI٠пóøÿ‚þŸ ý;ÿ/èÿI™ пóøÿB þ•|ýkÔ΢ò_ ý#N£èÿM‘ Ð?ê4ú‡üWE‚@ÿ˜Óèîÿ ýãN£¸ÿS$ôO8‹þ¡ÿOe‚@ÿ¤Óèîÿ ýSN£ê_‰ Ð?í4ú‡ûE‚@ÿŒÓèîÿ |ý‡9ÏùÔ¿"A ç9ÿƒç?Šþçüžÿ(úwžó?xþ£HèßiÎÿàù2A ç9ÿƒç?Šþçüžÿ(úwžó?xþ£HèßyÎÿàþ_‘ пóœÿÁý¿"¯ÿpç9ÿƒúW$ôÿ.Ïÿô÷¿ úW0ˆô­5ÜôNˆ‹ªŠ”ƒP:’èF…†̽µôOK÷ÿA§7ñ?1J îÿ«1ÞÿW"8ÿÀâ?!þâ?!þâ?!þâ?!þâ?!þâ?!þâ?!þâ?!þâ?ßcügÁuôO S«ØÁêráB®‰1l cLÀÓß6 ?íËÆŒstZ…ÀWš“fpÐlÁDÀŠá:˜—"M©zÜÀ%½M\$„¢T+J©Úv.R˜–`̟Çå0X’ ¬¡Lù:ÃPZeräb„‰YDQœ˜™V'K¶µ;+3-¡qNXn{l;ëÖÇMÔêvˆ1¨*Ú›$)•Ñï?@ˆ=þ#Û« pÁ- $ ]è5„ÛCA°2{œ;ø˜ÈWà3\i\4‰KQ ¤€q8ñ§ß¨Úöq€ðÑÒÜ÷ql1u¦Ñ@É1@_c¿D( DP €¬ANËŽvfd®ÿ3”gìþú*ͯÑBu}DB¯´8&8¤›cèæ&P`È"ŒžJ‹Ðz5°õ]ÔÝ¡¹=E¹=Åíìæ…MÜb7ϸÆ`Çû+é…ã ðÿQ|ÿ¯HˆˆP‡E ¨†Šׄ3D8Nk(Tƒ¢aLxxXØ»–†¢ vô+éû?†S¸Èþ¡`ÿW"8†ÿ±¼ï‘a¿ª+ýrÏ+a[…ϸ·=ÈmjÝ…ûWŒ&7_úxê›IŸ5ê2wß*¿Êé«.¬÷è„£^¾Ì\|GÛqKe´[8tõt¢rB’kÆ·ð˜7ë×…rÆ–xäÕ†¾}ªfÖS;Nxv«{ŸK§•ž™<$¡wàêÕ½¯ÎôY3³q›¦MfU\2oC߃ß~ÿãg«Ý¿­ÞòÚæ½9õ‚݆xöP¦O™ÄšO„õ>\Áµ¾¶Ú¹MŠ[j5W“jä™_«ò¹Øvί^£×¡´ðM}Þ,viã·µ©hÈ볋_¤]}pWP“+Ò]‹WÜœT¾SÞ绎]Ç6MÃÐîG\t2vf'5¾U+}ÛœëSïÝß;&±ñ¦/:ºÝ­üÓç'÷ûŸ=Yç£ÍËß»µéþÇ%Ók¸5/¶Q•Üeì¦~žæßªïþeã.vñŠn½èAhý¤¹nw\¦v|åW­çΖˆYW'J•26©Jpb±3ux¾aÉ6Ïÿ69½tÏØ­;›"{>î7±dZ®ÁÿõѸgVÚóUÊ÷¿¤ÕÖ¦ÿ+µï|Çù×k½,UnL©²à Å ž0œ¸9†;p¹¨$wÂÀRx¿ð”~7­?Ó`Ìâ' sT&…„L4»ü×[f¡ˆY‘¬Ý•Z‡ Á#28 'EdP*‡È0|¤$"3ƒÈPS¸ ”á+Ô”š=#Pñ3)D¡£4hç«–Àk¢glUŠp‚‹¿¶¬ÏÄØ Ì6#ûÄñì«CÇUËÑ$÷º7¸¹ø‰šSȻ߶9,ˆÖ"þ;õë:Ç.ýÍAöß(Û5êð M×ìÈψ3òc†¨#?[*Œ?Ňk¢£u2s‘hÅ'ZÅY’åK‰Z+%bn~µ_Ä”àÊ´x¤¥T8Ã8¿Œ4en&•²¦Rk$¥$ç-v“6:"B'5ã[;y‰7“Ü6ŒHÈÄã,Q<Þ¡«Q<]tBTÂ8›E,hî$Åà£ňÔ5ØEØ+ Js>~9`Óªs”;v‘€£(gÉ€#˜þ¡š¿À¦Ê«A¦Y]‘à¨ü ®¿»;îÉý #õ÷ÿIÞÿP"DЭÃ)5¦ÕbÚpR˄ѤN‹è˜‚Š àýÿ÷<ØÑÿuÿŸ`Iáý/=ÿ öÿ¢޹ÿ¶ÿ•˜ÓêJ_¾Õ|ó]ÍEa­nfN.æZü·‹÷¿I–0xPîOWÜjg>Þg^“Ô˹#ü*û'}zòÎî¼Ó¼^Ù£OâN™™éy;!½ñ´":甪¼ìf·¨]‹Ä¶ÏΜž;ïñÁáy7"ãV&ß­~èIܼ#3÷´Ø·¬kW×W÷UÕJ-v£½ò˜W´¸®EÆô;3Fm:`[XlÝ¿‹=¬2ÄûÆËå'wžü°ÿ²Î1ßWêZéPìóáK欤‚ÓkzL=¹½ÚAmC¾ø£—ßÉJ+{V é¼nnþÙ?ß-ž™p=üL ;é2®üš&?;gÜúùÞµÅö•õ;VqÕWN¤ß¼4§²Ûö÷§¯Ÿ]ìáÉj¯Ó*xìsÏš†LSó¾ÿ!—yešlI3tZô˜¡ ?ß;Dý hùñG?Î*{Í»æå¤CC_ºŸiïrfÊ–'ëÏ__óvÆñ‘—‹=™ã]2gH‡˜îsCÞ” ¥ÎýP{.êhH…×ÚÚõdÏ+7¿È};;4£×ÿÒ:»omçýbË3µ(ï¿ÒÊL~㱦âÇ¿ûÎoõjÀ…GcRÚ~ßfóÞí+GMþ( ½?°öÓ¹7°þëòî'«]îíÎ^º ûÇU/dúí«zÖë·1÷çÆ]oã¹ëÍ(»uÓåȉŒßŠKþÍ<¯¬©âöÕ÷Ì’SÆ%wXùàD…kËlo‘8 ô—•Öû{­[¯ËíºÎ/°ßî=;Ö¶ZQëö¢æâ'BÏ 4B½GžþA°þG†ÿIAþ£A ÌYôÏ~ ê_ Ð?î4úG þ•ýN£ê_‰ Ð?é4úÇ þ•ýSN£ê_‰ Ð?ý®ùï8ŽÂù_Á ҿгç脨¶‚ßóP°üûWã$_ÿ(ŠÐÿ³"Á¹üÿá ¬ ÿ?èÿúÿƒþÿ ÿ?èÿúÿƒþÿ ÿ?èÿúÿƒþÿ ÿ?èÿúÿƒþÿ ÿ¿÷ØÿŸé È:ÿ8F«pvýøÿCT¨ÚgW£ú¨ñŽ.ˆ¢¦(7bƒ@û³²àÔן9Ö›::‚Å+þÔNÂ;©0xdÛÚ¶3é£ …gít¤Ã®”#Û—¬Ò󋘯ô ºÀý#ˆ‚‚Ðt1nT²I‹âØìÌ´3s} aW9-…¶³¾9ŽàÎöR”ƒpÇY¹h8?g§;\‚6ÞšDp”ã*§Øßd¾B袥?#ìxÁ± Æ5©wjÚ¶ô­u5sFpæ ªWSöÿÏÞ•À7Q|AùEA-—­Z²÷nP£ "X@ŽJHÒ6˜&%IRÊ9å~ÐR@ä” ‚Ü €€Š€Ü¢å¾Áÿ¼Ù»I›¤Ù4öã§ûù”°³»3oæÍ|çÍ{oæ1߸z ò³ÍXR”D¸•„E×2t„%ó`á— ,‹ ¢á—C‡=Þâmœ‡Ã‘ʇÔଧkwÞº¦qgíÝG£)nC‘ÂR\¨RŒ%†+^vµÁž!õ¢«×¦*¤ ^­4pà9—¢ ¡Ôi‹ñ‚ñÈõR×—ô¢S>‘iBiX'"¹Ë)´¨õ½@Ã@iå ¢@€u´  i€€–Õ&@†@H¿,^ZÈ!„¡°Ùblª…<\Ïaà ܃Ž–'˜Õ4W¦$hq‹¸”¤"DJ~…’yÐð#zé> úTÙ æóEìF‹=–©:î¥Gxb/9ë(SCª n¥¾(¿òGÈ‚[)`GjÕ2Qwz ‰j¸Ìq›“ªP0úñ Mb¸d‘Q0’€ VŒ(/7¢ g‹í³midHß‚zå ô5æqÙúzA)¤[‘ K+ÏØDµ0BæÁÂM*`„"Àga4§Â‹C«10ŒŒ Ñ9ôkzdWȽÀg)Ïú‚†ZºG7%» HÔå×T Þßʼn«]Ã%|3mÉÞ_¾Ëu ‚:ŸJPá $ˆ×KJ¿TX¨PNP¡%P1„e ‚žó”*`ÁÐá¼@‡•GÐbÌdÂaаå†po`ËV™JîÍe“yУð5gà„c0 Ó* +zM+áP—È¡T—·Ô»†\.Á Ö1ZÏàE|K£%+üJn»e«¹Â$xü®ñ†­gbÕ°"ÄüƒvÞ +8JnÜ¥1Xì§'Ñ`ç%Ù6 ìr†ª…=Aܬ =äfp$Jޱr/ZÖ£V†™‡+Y‹]fù—šUj5A`ì¥=áÞhÐ ‰Ò)O s¹Fœl³"pþ¥f…Z· BÎ ð]‹‡=Lf-ÓËAЕa€ƒ3xîèábFøY8ÿR³Jµw…D(ïá)™LŠIžTŒª ÁÁ“À”ØV,–ŸÕò¢Ôù—žjMؘ—>Lü4 Ñ–lçÅã†bd³ zF_ÐwS¤ÓÄ]¶2Ú/{Ü–ŒL<çTzñ‡˜éy¥Ö¼ˆ§šóŒ"hžÅ¶à%[>CŒl ÜŽÀ5ZˆŒù‘vîS´%¥è÷´šEtˆù—žWa d¼)l‚¾j Ì+†•+kf]öÉNS¶.êxò¦•å `^…–éy¥VŽ%n¯`¼€- +¦$1N¶eDpèCZIpËÿp;Ò~Û±d'õ2Ë¿Ô|R­š”øäjÉE‹‰¥Hó‰ð—ˆ;á !.ëñ$úmGF5ŸBÊÿq¸â*OW(çøÙyù?ÿ›tÅæY†gâ?Ó ËWœÿ‰+ÍÈH$‚8R$µ;@à i´‘Ôéu‚ŽÔG„×ßw…2þƒüì¼ü ýWð9ÿŸ©8ÿ?"Wxâ?¯ï½ÓÒ¨ýƒëÏ?ûGÌnH¹ÿJ•Ïú㣈j³®|}ßÍ‚ü~¿s0× ™ÒçâêYÕÞº`«S¸£iêäe ÷Îþ|õìM“î­Ï=:üVó!Ö/-⑼œÂå?Ý™ÀÌ^±Íñý!~à+k&¯0-oçÜ=]ptB³5KZž®õç¯n¿xçÈÇŸö?µ:3f\ßÌÂ3oº¶ûææfæã+÷~ÍÝ%wï®+Œ:r«peÞѾÆ=G/--8y°íVuW?üËÞõï½vï–åÑëïš®m.:ûݶmý›§¾ñÔ‚e Ï>òõÒã ÓÿqbîªKÆ©™wÞ³{®ß}~¸–ßöÖÎ;;þÚœœÿZ·ÅÙ«c3?Úýg>jÃÁG~µÚ»×¶:&5h`kpºh`Ù·õ>·xÃõ¾É7ëmçDµëÜgvÒò×VÒ#·W~¸eRþëæ¸·o[×ÇÅ ©MnX¢[§Öï½`rƒ†LáˆkŽÌùåVå—>õFVÍ/ZvÌ«Öc`gâÒ§›è®x`A§Z ½f ¹üdê>èÝâ™{N¼2~ÌÓŘ¢ÓS¿ËªÚjnÜ|­†-5ZÍÜ:õÐ õZ^øU½Iõo¯©\û:»rÉë÷Çe×™~ö…ÑŸ7^U§W¯G~¼ÔC¯l»ð¾vóŠÊšæ[¾ºígþ=(a‡][}d­˜ÔÁ=GÜÙ~æxwj¼F¼0fÎÔÍÇ^žrûÀ°‰5G¬Û^¸jA~aç=‹v¿°`Öö¶÷gÌ¿9ªÃøßï³ÏÍ~ϵÊé³Ò{êüòŸ–{?:zis5ñ±y3÷œ¯öKêÛ‡†ïþÉ¡í±1äÿ»öÛMÿ/µè-›V6ø¯XP÷Í>“›8nQLþ¦“6iUµýÎ&uÇ.\õÑ’FãÖî>ŠhôT‡hêõóù•®²ù£·:tÕ§äk‡mY½’¬;¦Íâi›LÎÛ{eÆû©_Óªì‰mØôª=z_ç‘×ý+½ò‚éß$kµ©=âú6çöS×GnüD÷åƒÕßSPs$µgÀO§&Ç£&Û ^Þñx³ Sw¿s>þßBüò«Ù¤ñ:²7ngtTµkâØQ1m*Ï:PÿµkÏ5ʯ#Ví\4?å‹^Q Æ}»éÕÓ_þtÒvtó±œîí.?<Ïq}CÝúÕž5÷+±f¯/ŸàGMé5ú›þš´Ê/‰ñ¯Ì}wWóiÅVÿ]©òwm{æî¨Ô±¿¾ÉåÝ/t<ûÀž„w–ÏhóÎŽ Æ¢zÑýÚ)OgeÕoV³eúÉ¢®76ÄîÜX`˜³.¹^õ±³k>²¦½þƒéÍÆô[Öþû½í†ô;Q0¶á5†=±yÏ{E©Ï§7µ½=߸«ûÒ”c÷ÜÞµ{ܸøÕ&“¥kR;þ\ÿ“s¬×výi4çäæaÆÏ†?³¶êÆÏöm:×®ÙgÏ¥­`£ü<‘¼ß>cì__-9Ó}ÿÎöxsþwg^ß°ÇÔQÔ¶Ëk–L9tnÓ®Ùyº¿ýÌõJ3z&w8úé–¥UÆŒŽkӮŜ¤i‡_•3üñ©äÅø/Ö^.¸ºÿëÎûÔ›=±Eç¶7&ï[·rʈzy_n‹»p_Á©·NÞýl•ÿ {2þl~2oéèN'/ž¯Vð¹£m“þËì#/øzàmcó¦µF¼pˬ·îtKÞ•õXÒŸ­bn͈žy=¿ÞâˆFxqø´ëŸ©Ò¥ÓÐWW¼=2ú›é;ˆgšWÚ‹šzèÆñýS?½v•qþjßÂw›Uù`õÌçžê;¿ú¤9ïÚÂ/êmí²æç>Ÿ{rîÕ11û×}2aÐcÕçÎ%vÝ3àbùÿÍMª¯kñù“¯|1¦ö A£Öî{cI½*)Ó‡W½òë†u‡.ÎL~ó=ó¹êdþº1B-í¯?^ɈÍqÔ‘£WËX=d﹕š÷w&oݗبÃ-;¿ZsÝßÚøñÒ #+¯{zá䜵½6©ß¢-›Ÿ96•[õЬWÅ E‹&ÖüÐ?í÷Ý=§ MüåМ'íóÖë~64ì»ãÄPí©]m¿÷[¿F ?eÔ¹Üò§3ñ™?Õ~EòºNW¹ÍXût›ùe«·.üáÕÉ¿ ûühß:39ºÉêœ"#«Ý_ÿÞØ}zkò§Ogoï±nÒ¼ø!õ²W ÚT;ÿv‹.I?½?e˜pqúVþHꉚõLg:L2¤Õ9qÓñb,÷ÛôvâòßÞµ?A7¾”}êÑ[4óz÷[ßz饷íYÂÐÞ}ŽÎíqøðø+ûª¥6âNmmr¥S×ú’º_íx¤ ±½g‡î¦S -×ÝY{²Æ¬Ö‹´85Ðz䳃“3ÿ÷aãcÙïë,ÿ¦ý•™=_f÷›l[¾æ¡IkWv]613yz}ûÈÃí¬ï>Õé‰ {ó‡s WDN]Uu—;ø÷ÚõwзKÇÎmQcÿŒ¹sÂO|µóæ#/E7ëŸr¼ÎŒûéÔKE}¢«ö˼WeRãîÏ–ém)B½;/ K¨wZêöê=ÊÞž’ £¤0î”ýâ¥Aú¥)ú0|fQÚôÊ’”ß(í~ïT+æÒxþÉpb`iÂÄÓ,‡·ƒ¹‹fµ~ |6Y@Zh´€E|&X8ø…÷ß(¥9) UŒ_ªà˜ð>ÅLj~© öà”€yCвó€ŸGIÛ¬ÿíÔ Éáü“Ã`c †HŠ Ô…oìHïŸ_ öŒnJðONð;OÒä O^M$à=E,{ƒ¸@ ¸ÿ- 5b -¸Ck¿´¹& 9~!ŒiŒ–À.âþ(h·ú@Ñ~Á™‚C­$Û¥ÿÁ”Óm@Zdøœ$ài.É3ëÑ2ÄL£DåS›ÛèìF<ç•K5ƒ4OÉDÉr÷|„C¶Þh‹IèÖ•hŸaµ;ìz›)ËAˆÍ(UÇ 4Y-ñhƉoN“I¢D!°æXô¼³ÕPÒ#g¨ÁïHƒ)~C ¦Ä¢O[gCÀ·˜)Ü`Šo0M9ÌÆ˜ö±îVj3¦EÁ¹Qnm3IðÇpDáL£¥¤'W [ü¼Òh4D½Ó(Qôù¥óïóM³´O¹$WÌ{"ã“áÆó-ï[7Zd}Ó´ZÒ;ï4L[^i,í“Ãñ¾ï ¤Ö'Mô¥™ÑÃR^†Ãi´Ân徭f$A£~„åZˆ0•f%$áV“O$ÇL[z¤é·–ä[®§ÄnI={.=¶˜¤¾QX©¥³9p·AÈCþÓ `^ú_m¹‰ÿÌWÄÿÄ¥ä¿,/üg+ø‘Ë‹ÿT¹á¿PÁÿH\^ü§Ë ÿÑküÀåŦÜðŸªà$./þ³å†ÿtÿ#qyñŸ+7üg*ø‰Ë‹ÿ|¹á?[ÁÿH\^üÊ ÿ¹ þGâòâ¿Xnø_±þÈåÅÿ¿Sÿ‡ý?ªÀÿ^>ü÷X­\æéT«1{cç_cV©[\²ÿ/ËR ¥ä?M“(©Âÿ7W“è®ÝâZ¬Œqt3°v8rÍ o«œ_£\,ú²|%ä${ì.{\s¢½g{Q êl¼¯ŒýŒc9 p.$+H{”ÚZ33Á¹( {vÆþvF×Ä[ñ°Ù ÎÈû¾ p·+QÚ†C¹gg½¤s˜,‘…2Ò$XôV(õU£U“ 9žÐÙlºœáõ”ŒŠJìÖEÊÁõˆN†H7:püïÁ:3»vý?*J™EA²³ðFPMë÷…îtúl‡ÑBÃYN&›>;3ÍlêNfQ²Ád´í&»;‘D‰é6hW ‡Rl¨Pwƒ&³ÁóŠ@hÚê“Ù¬s¥QˆŒˆ·š_2(”]‚7"#AA…ÈHT懪XL~ˆ˜DŸüP]ù1(¥‡÷k¨›hz+ P!`¶¸_AÙ§m™:‹a€Ùý!‹j«S|È¢Úê|©cQ±:ïbYTˆÎó%ª»NA+ËA$y XD„Þ«Á9D‚QA‡H0ú’À¡7z“À¡BŠBQ?Ô˜”ù!2MÅ䇈1ùä‡êiRäÇ£ z›Uçp§ Š-ŠŽÄ#Ò¬Š2y”Õ·L‘bõ.“Gõµ*ËDu°*JV»YgÏp§ ¯²•¥Šû”/&±¤¬L–ÁDr5°'œÈunüÆÃ‹ÐHû¸}R3¬Cˆ\çòtyž ƒå´bC»¢TéߌËLuwªºëÔ9uNÕéÿO71Ñß sÂY¤D×k¾å<®/tQaQ±~‰aÑô¦c» ¯¿3cSZ1yÌp—‚©)éä5ÚÒ‡Ó…<º€¤xè žÓÿœc††`L§`ÐôbiºmlIÑAÖ‚¡D¥Ö´nÃ`çALöÈ )¶n§vü6ä4d¼‹Ÿs€M3°šá¦Ñ™Z Ï‘šbiªq[ã iæ|£d‡‡¢!ïËòç£Ù‡ÉÒýqô£Ì<*2¦ ÔÕy2¨ŸA!#j=[+† E_Îp¢ÞÃç¨Þ„ST‘\o0z’gNÁÕS p¨ ô‘efÿâ~II¡­Bªñç¸Í.g “¢²â@^~ôeÙÈ{DÖ´þ]„¤²ÑðT‘ˆ´…ùè§Ù$ x4úÝŒؒLJ¬D«‡Ú.²plâôçççýC0PêƒôÀhºãetÉvŠ>SàC}VfÈ”Ðø%†%5¥ŒÍ„¾Â Äý©)¨RÔ ±ºxØB x‚¾@6E~£û° PUn¦§æA°#ä/ò}£ý¬¼AIjÊ ÔëønHÐÁRäSù™öL𠑏`è¡¡6,„~ƒpõ4[ô £Tô/)ˆtA¦ ªYøk*uÈ clwc:f†J‘›^à+#?¾E}iÀ~(5Å^—yÇK³³Å‚¢ˆSS|ùE¾<”)+æÉ2¤†™§ —²Ÿá§h³i?g“WQ¡þLÖý“‰'*ÐSLú…A<ú F—ÛžÊ/e;dVhœÊÙ’*†¢ƒð˜V“¦.š×²†ëƒ‚ÃñÑáJHÔ¯;E} ¬‡w!*ól ‹H _ ò³žŸ‡¾ÙCñY h”.lŽ´f%F2,dÍÑÁÒ€ß@@fÐ„Žœÿä†y°wŸö8æ/øCÐ_E¡aèBÃ?u[^0“n 5ÝøëQè¤ÏZ㘱°”„pót:å2d|”†L_¿´ŒŒ4…´LZçÎiLЗëgŠ Ñ}0wûG" Ρ{™— nR¾¯ph)R¿||Âj›±7–3›à‘Ôôðż»ÖmÐŒTÈ´D¾ »¬sç*.ÃR&$"#‹@Ñ­rúoû0uSk@pA/ä@†p†yG¦wQ2Cð'U_3Žg “žL¨áE¥’*-kGì›é$à²y,4~ ¯¨iKÏR98ÂÐ!‹1ä Ðe§pÙ1!\3!@ŒY€ªP’­õ; v•ˆÝ®š‰‚ˤ2R$혱Ô\ä/è0,fí¸ŒÃµ ñ N;3ˆvåÐÙ•È“í ˆZò¬ª£%U¤hVdP“JJ± \#£‹ý6×T¹F»’ÆÓl/}|Ý‹ó°œåJ¸œiÈsG@çnqÎyûÐC̵$òÒO¤hËYc^1 (ð /s*,)IàÙâk’П ;‘dŽQ8FRDFñ–ÌIRÀiן ³OBm+¼ D3'•Ç ;'ØHX4 C/ǯ9'EàÓsz§‹~Uµ˜WÈSðw*‹‹‰-^$Y5„í…ç‹Ä4•Ê Héä›ìq±ÛòÊ)âœ×l°d~3 º-YÂ}ÁÃ\žâj¬M`@ýÆR”DWøÒÎêUa5šÂ™DH²yèQÇꪤçhr%ÓÕ¦²ús˜àÊ<åég¸C¶’×ME£0A“QÕÞWb=/ìD4X¢4¦_ÌO„Q{yøò”Œš°ØceÜ !48犹ÕAå1ϵ‰ò¡ð¬Â™(þ‚F]E`¯DÖó–²–Ã#"HCƒ Jã±7ä1/4¡ñ´Ã¢R *Uíe{Sy¬)ãjÁJ˜åϱ.€S°”y…uÓ!C²JssýÕècô<•Euk<¤^ c¾u`gÓ\”Á ïDWƬ‹{—tn;E˜C[?©ªá±­Ð3¯sîF ‰â¿!ž¥eÅÐ̉Ý[vÒ†EaÊ‘& ¡b¿Õ ;„ÃúcFÜötÙ¼@‹)JHÑ\ `i p¸8áx K iÎñòƒŠÙœ UšŸ—eé^ › •©\`q¨Œ¬âèËP…BC~X¬Q‚E~#‚çŠÄÔ²FLšj‘R‹2¡#”DÓÙK˜ñÚ[ðtÒ†ÙÕ’N«m.+±˜CÎÅäê¬þXUŽ&®‘±Å0Ù!Q8ž_³Òs²hH*a(/4ºgVýAŒ>ãɰ1ú sZV‹W颓™5!ÍE›Y‘Ÿäá3+é׸¢˜ÊÑ/±ƒàʸe1VeLÿØ%¢è³FBeë$àmCÚ¢èÁU\4&t§®â‡õÇìH'*Ô1Gc´‹u$ B4º ¦HG$€k(E#m)xlS)t0¢qV0"P%G‘Nü•Ç* ‰²ÄšÜ e‰séÈé9, ×à`Õe†§0\ Éqà¢bà‹]8‰i.ʘ”À-©$ÀAW`cÛ¥‹ßèššì–– k2Oi2‡‹’ÄêßšçTN¤ k'E&MBÂg])¬³úcÕYŽ¥”VV5<)"çÎ}’Òòé¡a¿/'‘ÚÊ]p ¾*M6MïFv--—_|‡ªò[Ilsc'Y“mΑVpkÂZúu£É’Éæ–aʰn†í“%LB-£Ù8«ep¯DÅSU–â¡· ËДºAÑ ²ÃúcVå˜sXœ,>ÈšÍiR•ž›pÑšŒðÅ1N…•/>$¦9‡ ¤°¶u°ÖÁPN^‘>AÚVòÜ,AH #uŪÃSªCв¢«¼ç³ iÜ¥°@¬YŠœu3 :¬?fÕñ4]ÝÊáãoåð@ÉÊÚ+]¥ ¹oÊÅœC¥ ù‚A Dû”xó‘53d#~w®6nÃ@ý¦g⇕ȌÃzËÙ*7)+Ð3%!E…PÍÒ8¨=æe·„Eãx±É Iy ¯H¼†¡¿±‹O-œH†Ýf$4UrœPi´.’h]0öõ<Ö%: VÍý¨U7»N*[€®ƒ0,@É.@Q )@QžÒ`ƒ_†%rÕ[!ÉèEÎDQ‘´¤â!åBNÎê[Tnw+°¨dÍ&*È/QAR£@âKTp\!+c*Ñ5ز” vWXV€40™š·‹˜8Ñš9Å‘M** –£7©©œ£úceå„É ËK–è¨S$[€E+ÌÄǸkPUnr"šs¼A(Ø‚\òÎY˜“Žƒ\×ËU¦ú¹e»&êgm³@Ù@’þ¬=|{=]q²5¼UÒ¤9§mw3–ƒúcÎTL”×ÁËtN–€æ!HÂ`y ÓÀ?^[1œTDOìÖtçÜ™°ø+[nSvõÄH#iR…UG†GÆù4$e×[ 99$¶™Ìóš=¥VÀοs!8¬?Ižü\è7þW¼äßµbæÿÆøè«Ë£ÉMâUÇGrý¹~Í—-ˆY¹’9ô*ÇK~ô+q¼/ÉÿýÿÄ­ÿñ’׺ þ˲,DàÿñBRÿ«ã“þïeýï*:tG½µçú}7¬éÑŠs%í{¯h½cSa íÔ¬¹\úQkzL]ñÛÚ_»Ïh™Öué¾K7É[to1þ«nÙ¾w䟛_÷éòñgç¬Ù¿µáˆ5“÷ÏþáX¿ŠPó9«‡uÚ}Ü;« Ø}óîïŠNoùöЇÁÜFïT~yôÚ³ß}±gí¹“³nè·ðí—ÏmûÏ~k†­yÿü÷g~z¶óÒå‡Ï}¶æ§§ÛW´ñ—µ½ŽŒ[·méª ß´MaÇ}¯ì]Úì—éC÷̨ç;uÿñO½yþ•ÂíW-=þˉ­_//_С_³¾¯ï˜”ÿzJ÷7™š²jlûû+>XÕ{ÝÎ_®_|¼iùñ;g*ë¾SJοzù ìW2¦Û¬e%çG¥ß°ïÇ5™C6ä÷\¶wÀê¦=¶<;áë?>µÿ¥©Îß¼cæ-Ëê˜T>{Ë- ?~ýáÐüµò·žh|úµÒ‘¼“ós»õšØÆÇfu½qâœïîyn-·éöŒ²“?×ÞÖ‹Û=1¸¥ö–•-u¿k÷O. ~öUáuÅŸÙ¾Ýù«;ݾ²¹ØiüÉñ_þ϶ÐÜŒÍí¦¦pß5íìôºë?ÚºoÛÔ&_qÕÇ ¶]Ô«a‹’Íë}ñ°z¢Áæ‡[ôUÑö½ÙÇúÕ9;èð_êNêåKõË<ñ· ¾s¢eê³?è2&eZǶgÏnÔ¶dLwZ üP õkòÄ¡Áõµk/îÇ}4äÕ¡%¾µ/ø|ð¯ßNzõþã¢Ð¨Ó›þ^¾ºø«SwVL_0ëùÎ¥Ý }Ný²pʤçºÿöS›‰õÊYÅõÜÅWÍ›ÝãOîn·ïÅï˺¼}Ë_HK¹i­ÿŸõŠ—Ì[·9• Úº½Gq·—V4kѨVƒN_ œi°3µïÕm'ñîëŸ!ïíÖ¾õÅ‹û¥=}Ãó0&f6~cçâÙŸ¬Gkþ¬Š/&žzý² ×|5rG~·7ÖxoË­­Ö«ݤÎÎ^ÑóÎ;ß¾*}ï®{¾•ƒŸ¾lÁŸú^Ò`ñðkøGÞ•ËÝúá¢Ã÷ê^»Wû>«ºúË‘´/w¾9õú£gÒBOœ9znRá§/¾×róº-ß´)Ù8ùígVôÙõôþ^MÞhqóü+_<;~ÊžK¿xkûey%ÿš÷B¨>óÉ>nô CV¨ .iwLÒ2·llsMÏÌÑ3§þ­Û KJ¦Ÿk¾ñþã×]³uÙào/jvÅÙQ·œS±êÕ3v–Þ<Øì0£ÔŸ÷µ8"óO3gÕžÝuVíýµ{¤f?[û@¨|ÉÁ«2Z=}Oó:fËlh¢dÞ{qņÙÆd.ZrI£ãZlmÚ2÷¶Ï¬òâE÷«]–çµ’‹þxàsö¹¥jϾM&7œÜ¨mý¯Þ±dÁ™Ç¦œ›þ_å›?~YaË‚ô—›–¯-ï}®¤¼¤à“ÇGLì•Sðà®M#Þÿ¾çÞgö¦?ýMÏÂí2‡µ]pù¢‹N¿±[=ƒÓøÃ{2Ĺ}™?¸rY«› K÷iOô^E§7¯F#mÿ½“^ïûÎËÿÜÖ¼ÁÛ'ß•ߤñ†–cGÔ™rô߇˜æ· 8²ÿÖ½ÏíÊ=öüøë~î¶ô¡™wmê1©[Ë´Í7zwý???yÛµ]·ºèÖ&—ר¿‰píüÖC³ë~Ïä²®¿ÿdNç]%{¤™+?}²yæÊ WÎ7®é['vYú¿—ÔÙøÒ ªI«EQƒ´ZGÜHiµN6MH«uÊi¤Õ$*jÀwåÐ#“|6*Óh´7ÙÝ1Qs²À€œeXÍŠzz=×5NæàNႹ1½É掋Z4v¢p»õv.øïŽ~6'¡_H®Sô~‰–÷êŽrZ†- Ô$ -zwTšÈÅt$ .Íø\SYp9¡J\|ªYp9% .§ã0>•)–SäÖZU ®É(Ë©r+,¯¨l´œÆEãQÀÉÒ«DÖ'ð÷Ì‹Räu°q/|d»(ŒÂF ðÖQÙh¯¯{OèâQOùé”Њ»>jœÑ&òH-0bz±²jÿý5‡ÿ3ÉÿX-Ÿ0ù×þÏ$ÿcõ|Âä_sø?“üÕò “ÍáÿLò?VË'Lþ¿'ÿ'^ÿ—X}þOò¿UË'BþV”ô‹PÜœ]\ìœû > à(üO’¾ÿkÉŸçxVIîÿTǧfñ?Á«ý¢"%ùŸ’üOIþ§$ÿS’ÿ)Éÿ”äJò?%ùŸ’üOIþ§$ÿS’ÿ)Éÿ”äJò?%ùŸþÀüOÖPlüO"Ë2"ŠÇÿŸð?©ù¦*¤‰ñÖ›`¸hÑwØ 8 Ü7•Н„4„¬9wÈ..vÊE`ilú’šÁûH½Ôi¼ÓÇ+¸h¼ÓEÁ,â‹­¢ƒ÷«ÓœÃ÷«9UcD^¢Þ¯ö)q PúÐ6¾Âá0UdJàåjQÆ=g’@I~6LÜœOèrHô”aÚÌw¿‰¸Ì@ɸ¡0pXìœNê•À‹xÕ’ц¢~³¸¨ZE¸X­LêÂz•˜æê• ð4œÒ+ Ú÷Э4ª ^ ¹‡B,†ÅH¤_§’¥HÕÛp 7¡ZNGÁâsnb%'•;¢©F½¹ Ö ŠŽ©J„ôŸJeÐçøò ki‰ñ†¢!ÇІ¦AÑÂÖÄËnHKÓœSÕFž— F2Äy8bˆ«„°è÷d¸Û¢U¼HÂÁÔÉ’xR”=Õ|Ñ&`"os>ƒ;‚4lÊï¬þXõŸ—)€šxHj ^ rlüé9œPÉ+45ÁI‘ ò£.R3/\¬DŸ×£€Ä4çÔ F.0o!†o/;&º¯|sÙÑ&eB‚R‹Å7xpþaCÌJºßkØ[ÞZ##·ö”›Ur³‘á°þ˜‰Zì>˜PÔ¬E»0Þ³½ºñÈCš“2‡‹æ¤ÌáG7'e•.:òÑœc…“J¤ øÝYbMÀ%Ú ÀhxÍ \Y¼"ÓÛ- .o…ÈC‚oo½²?kÎâ`ö9Kæ°›ë†Íaý1{ m"À«T±uE͸ riªÒP^~°†Øò„†¾‚e™[òØæŠK•œØ×M9¶ Hs¥³€¥¯U  Ž Xw>[ò¶ðÅ d¼hù`$Õf$bÀX k,y¼F-Ñ4 X¬VNÜ…«j•Çì(¨´s xÖ©é…‘ê~_[€ŸÓÐO€ü2Õ“<»Ù¹2Urb \6äÔ Ñ®D˜,"†¸HŒð£¯†™êBμ.á—èuEØ¥@:¢ °bd©¼·,Z "Xó¶M¶8©Ë …–“Ê«Ÿ´¨èF‘pæ ¯É8S çiÉÕ‰&Û3Ådsª…¼Av‰ýq‹ÂmVY´6ÄÑ, ,><^F°±‡¥(CÀ,ƒ7ÚTtœŠ'†ç}ŽsfÎç¢äy««œ2eË+r“ì°þø¹˜Ü®‹YJvYŠUËRU°ì°ú± ~<–«§ë&šˆ“Téu +A¯z¸âlrXìë&‰Ó;X°ˆ›$’k>pÿxþWe›ÞÈtë¦w¬LôŽÕóYoç12ò9»^P»¼"gq›/wýñËÒíŽ>–¥ÂÙd©°D–󲤦3,_‰äƒò‚.OÊF‚\á!xv÷Š3¼•¥†³¢íØ»á³sX’Æ+ùñìþ›î/ø À+þ/Y$N1ÿÇJIü·êø¨ŠêS”\Ö'‰Y~UÔüjîÿ±÷,ÐQÙòTÐiÁ/€ ¡ž“Éüg’€@ AÂ/yI1 ±3Ó3i˜™fzò‡ß²øžò\>úvõ{@>®ÈÐ(‘¨°²"ˆ ˆ(J\ƒ°ê»U=¿î™$*ÚÌÙ×÷@ÒuësoÕ½uëVU§¯NoÓ UY6£QŸ}­ùSà×…Ÿ4ÿFì/ Ì“Áh~ÿQkV¾ÿ( üRñ¿Æÿîï¦Û^þ Çÿ:œòÈñ#òç\w_ÿ¯6¦=zøýc7<Àýþ@ö‡À·óG|3ÀdÖuÝgÈ^=¿%‹›ßòÒä²c>U;ëì̺ž—¯¨û¶~Sغò‹a¾ÿ±zé9cò; ·ëÛ°ó“*/öücí°Œ½//ÿhÇ»ö›NÜ3ìÊÈlË+{z~ßÍËv==qÄÎÁüNWòÛ_:pü¹ë3ßgû·†KèU%·æ%öÇžÙ/Ùúº¶=¨µu×ñã5Ãj‡}±mëÊÇW7¬/™yéýeïšþ¶Öq¶Òôç—×\h*­xË”ÏFÕ§_dÖo¸Òâ^Ò˜Þt›¹ßüÍïìX¹±øhÃû÷\žõÁ‚£Ï>aøt‡Ã•ßýž¯ï½÷Â\·‡Æn}ûÓ…­ÃÓ·ZŠ^ž1åzçoÓ³ö)k>ø¬ÛƒÚ­š¦ªËÉÛïkÕ­X~·óãÐ,9þ=úîßß~eúâËYÃÏ/ŸtÄb0]ߘÅv{èõ'wLÍé2Èr‘þëYÚ½ëà¿m?zÙkœûfa§]–<=°5çRŸÖüQš}ÿ°Û#uýxñ‘!·h©Þ/®2÷Ú¢ImH>óÂÊ ú\85¯×ð%{FNz­ÿ Ï[^Ëb8׈¿«Ò›Õ–ÜF%×íиbauKº_7¾4Ùw.)ÕJ7oë>âý»¾>9oH7óücw|;¿þäWÃWþpãV>¹—Å,çì Þ¤ s'ïég¬X«šwâ‰gV¡ þ¤ý'&öÞ=é5ß–›“ôS¶áÔ¦ ¹ow~`þµ›;wk¼3É0fVÓ†Üsó »—Ý·}ïôK<Ýœ3´[ýov¹Ðóµ ÷Ïî<és[:ÿKQSºy®¹ûÜ»æð]/Þݼm鹎&ݱ^ßoueÓßò5Öfì²Í6ufþæ=ãP~™ûÄ©>·|ýðytdF¯Í7=¤KJ©¥) ÷ežs²ê@¡Å¢ð*»ðí—ú¾À¶ì÷èžýz—˽n(ÝøÉZ¿fyçI¹½P™õ^ÃÈÿ]üNzï‰7œ¾ðÄú¡S[çœ_ÒÒåÀ[«§íÒ5ZµeãáÁ¥c7Ïúrïëÿuÿ_F÷]Ò'íÑ]Més³^ytî‘Óóêÿ:nÁ¦•Ýÿ9 9)QŽjRËà ½vî=ÐzåÍ…{Ý8Í:·ÿâ‡wâÔÂÍ×U,ú&eÕÀoÆuš{LJ'ûäåÌÈZ2û“>ß7j^yëØÃ·ÜÔ¸ûX§\þÅÇ.žôÑ~ÕGgTëèÒïíí· ÓŸ~t^ÚþôÎÙ•- êúYO4f¥§¦Žyйi ·øFmÉAsU+v¬ßT?å\¯ÊÕ¹÷&¹*g×Òu}·­Ûú½×wg:¯nÙ1ïÌÔ”d]àäœNo,Ÿùú¡5·šü¼eaE߯—îÙ\8ys¿^‡—èúÜÄî{ÆÞ½çìŒi7¿ÒúØÙŒ®Ï8øÒÐÆ.¯žÉÕß–¹ï??øçàco¥-3aׇ§ý+d§¦g,›u$׬²¦­Ëë2YûŽé2:³6åp—©I'4–+çf÷Ì›ÝoɶôAãÒ¶¸ß[P¼*Z·­Žž¹n÷þiú¡KoXfOžè~kìø +nÑÛgúšò”Œ{vŽßN˜¿êÖò·IO–¸ÆŽš‘4ÇÛí‹5nDÆ#+÷oxë6»o¾æÈw;ÞW;ìc²Ö´†7lüó¢ÃÍ™ÛgôÝôú«Å-´ºs½µê±IǾ¼îÝ3O—m¼è^{úý }š4G—Þñß:GsÕdã ë©÷6MÛpݺÒÏ÷.{橦¯KŸ+™9õt¶Úøiruó}gŸÝ^8±V½Í[±~Ù–7ôI{²¥ÇMO~õغµ OÍݳmÉâÇŽ7ÿ¶ëã{·™Gç¶n=öƒuÕ÷Ú‰f2ý„ˆ`Áo°ü2Á ÑÁÂѼ~tD°¥P`ø’ŠœZ’÷eÛ¯ÔÁËÇW sXg4#á½=s»ŒtðäÕ…Ó…—V„£Ãö¹Úø[íÃëøš ß-gw$˜v^ø¸º(`ø_K^uÔiee âãŠÕ•˜Á¸²tæ¶‚q Yrã2µŒK°Ê¬‹ Xû¤Ø€ZFsL ¯øÁ¸Œ1å´Y±·t&SlÝì8ÁÂ4` ¤8mvL1þðgˆ¥¡3iâàôQ¸ØÀ[¦o>_°»Ë'cŸ5VS/ÛNOÅHoé²õÚá³PñþŸ¦$þ‹VgPâÈ’óc‚È_cTä/ HæU‚È_«SâÿÈ’ùoJùkŒŠüeÉü·\Ëø_øþ\qeý—bäu€À:Yrû“ ÙWC ¸û½Æ‰ÿe]À¥ôZåþG(¯†m¶†ÀÎðþ8²ø©r/CÞfÇÙå•åPÿÂEð‡zÑ(؃¡bÆÆxðÜT9‰(ào[Ÿå$Ö?ügÙÁ–†·A! Ti5ƒl˜¾‰ôY/¢‘ÅA¿Æ‹¢jÚeu°.{N¹›öPHè ¦ûIÁ Lm ëô9ð?Êü€)ÏãÊ36Q”¿œçQù=AR¨ÿþÁOÖöÚ?@Z[‚|l¥Ý"ÂþÚ)üÎX;%ìíR)Ç!Š*¿ÛŒeðOß#ù?­:ÅÕT&¿ižþÙ„þnOZ¢ ‚5­Œ›½rYê…¯uň¯Q9åäU1¿µû½Qçæ+üV3è¹.žž ·æÐ°i'‚tùr¯¯*4¿òŸgXQ#hRfÅŽfXeyÆY&œkåTàã,4™áVÃòjcóƒR9x.Çyµ$k8±“™Âi?0hg2]  Bî°(5"ã¤ËÌ$áL.§B“©í (>âË©À'|QåJ«Y/¥¢tâOú[Y<'«|8òëB<Œu5çfðwüyÄò¨Gð©bð×îm>Ç %Ñä‚ÒÑ…KQî„)hrnqqî„Ò)ƒ¡$ ä25ŒÐët;Xh¶‡tñõˆ³¡ñùÅ#GCùÜã J§ à¨‚Ò ù%%hTa1ÊEE¹Å¥#'ŽË-FE‹‹ Kò3á™hþøˆyÚà  Zå8˜ôbDIž+)”•‰J†°3’s×ãà.Ѫd%\“ìB˜;壋 "C‚Ï>±ŠAÇÁöp ÅNoæµ^·øe@²ÿ3'ÌþϤøÿr€Äÿ·&ˆüµ:³"9@2ÿ³Dþ£"Y@"ÿìD‘¿I£È_Ø&Aä È_Èß–0ò×*ò—Äò·iDþ£2ÿe‰üµ #eþËùëFþ:Eþr€Dþú„‘¿^‘¿ ‘¿!aä¯ÜÿËbùW%ÎûŸÊû?²€dþ'ÎûŸŠüe‰üçý?åþGØÿÄyÿW‘¿, ‘ÿµ|ÿS¹ÿ» ±ÿ‰sÿ¯È_Ìÿ„¹ÿWîäÉüO˜ûåþWÈ?qîÿ•óY@bÿçþ_‘¿, ‘âÜÿ+÷?²€Xþ–Ä9ÿUöÿ²€Dþ‰sþ£ìÿd‰üæüGÙÿÉù'Îþ_ñÿd‰üÇÿWü?Y@"ÿÄñÿ•÷d±ü­‰ãÿ+þŸ, ‘ÂøÿŠÿ'HäŸ8þ¿âÿÉù'Žÿ¯ø²€Dþ‰ãÿ+þŸ, ‘âøÿÊûß²€äï¿ÆÿWü?y@"ÿÄñÿÿOÈ?qüÅÿ“$òOÿ_ñÿd‰üÇÿWü?Y@"ÿÄñÿ•¿ÿ’$ï&Žÿ¯ø²€Dþ‰ãÿ+þŸ, ‘âøÿŠÿ' Hä-ýòý“ά¬ÿ2BŒücH^u,àöâ?è4‘øß è‰NƒCB(ñd€¶â?DdßN!¦@1 ÚÒ©˜(áÖbâ@„sÚˆ?`NWyymá‘PZøDþù >)ç“ø>~4ˆ¢4Ä‹að³p¡?»6¨« šþ_$l‚Îd&ahµUÃÄW_+p¯¬'Jð%x ž@ÝÕGaEBn‡„€‡•¶Òn<¤6çÃíd­¬üJánÑ®é Ð4·´ÔЋÆÒ.—e@?b´Œ'%2§‡K ·YØL çÔ«ílÐ+F fA%´ËÎùh5†„ÛÊÎx¹ ž±TG´• Í_ë5ðÿ3Äø1†o2Í[ª­œ½²ÒÂ9••Äœg2îï µïÿ´øeO‘ÿ¯Ó5zÅÿ“Rþ£¨$#×ÊU1ºL •’Œ€ƒ¤!°Û€5GáZBôk!ø5àHðët?<ÑvÆ @Ù\V\~–Œâ®.éä_¶eI¼e—u$çtÂÚ良àRàòx•*òpÎN©ó8>ƒÄÁèâ圱Q!$YÏ(JíexŸ{ͳ.-òSNÚ3Rç»,¦: Ì)˜]Ñ„ðSO@’\ 8J%…B ¡,¤JFþ2‹“Úܾð3E‰› ²úÜH¯1!un~8¥…m•3ŒÑÆÂz,>§ÍÁÔ…Ñ@[Áð2^ÖFj Ó°&RÛ[,ŒÐGk¤ˆ©GZ+¬Ét§6òEl€lÕù±lh¡¹|)Z`#_ĆØ(·Ý.ˆÓ0SÓôµ@Ôž0¥Å@MÔSDDÌ@»Y®phÞ+-,ùUŽpEô–U4@oéXî @––’5:RúN‹x5[t´ À„E2àF`±`˜XŒ0àŒ”#eDDAÕ¬¸=`“Ó0ÃÆ´ýdE홀‚Õâáh>ŒŽ]"E2kœˆ¦ Úábiš€NJÓýåÄ4¡œˆ‚¸à¼°U‡1PË'–9pá‹¥iV|RšfèƒODÓ 4ëÅíÁÕ‡*"pæSÀÖñ²À bámìÀ½b‚³Œ ¬àãb~hMÜ&þoƒ=®sñ$á`\vð­*Én©Gäg°G(àGnÎMþkc^&\'€ýKÚá#¦Mjňe ‚Å>œ‹'<€Æy¬‹Á,RRP]Ê:oF1¸ƒ.Õ·¨¼ž¶ÌœÃÚNVuG3Ž0¨ºíœŒÂ*;ÃÇ´S".mqv[Œ„ÝH¿-|›ÄCùqIGg¶Ñ€6Ìž#kSU±‚H¨ÐrWÌÛ¼¼u±Àz&ìÒkØX†4”ÚÂqk_†v²Žz$’á~Ð>ßA)ÒQÕØ6ÃZœ…¼ÚÁÙT¸jJ0jMTM›©šV+IY˜*¬üZÄÔY°ò× i%!j‘‚¤–x,„m™Z嬿FYtHXÁF ¨¢jŒ`H‰l$¡î,™…mVåx^¨ªWÕÙVS¬«Œˆ_mÃ`|˜å¦ùj2½˜ 7‰ÁVsµÈçy4>ºÍ*¬`~¤Ã0eÉaŠˆ*¦F:ô¹â¢=Ø÷ŠÁZYÚιh‡WŒTsÜt!à$ç±Í¤(µ‹³2³çU{«„Tt»ŒÕÞa¢×rqî`‘Y„ÿÑœª‰]uƒ«‰üªÄ¢iˆ¤¼”J- Ávñ4>OÏAEœ ÈRX1‚gF°¥ÌÖšPȤ[À„†¼(Jh2bíûvH:œ‹-4Ç“b™ dEýŒÌ3J‹1(zËR9*E5f±Và¨Xd¯'øa¢¦µägxâÇ!É öeEy:ÁE't†pÊE¥"ë f£]&~)B‚£w(²³Ng5žï´9*3ƒ7fu?˜2Í:¤Ë9gÅ'h’ >ee OúL=.J34ÁâTñð68ì Dõ^§õ'ƒl§k@O§‰t-9+k­|¥‡ù?ö®¾‰jëÊbP@«¬£ˆ”­™}2X* Ý€–šRi)i’BJÛ”4ÝPôU}²>vQy~Êã)Š B¡²(¸‚@…*‚âú„÷ß½“eîLf&i’†ê—á÷k¸³œsî=wùŸ;wîß r$X'ØäÍ„7“²<¸­Äi•à*Á3>‚-&§)`Éâï9T¼’ˆ‡‘ªSY¶P¤¨Å®Pa!æ´$ŒŒcé€üC€ûÿÀd@þ!Ñ´þ˜Råˆð[7މãܶ6vUtÝ ÿ EHñ ;‘¦Ü›¡Âÿ®µƒ–jY‘z!BCEà"b´UIkЖÁ£uPxçb5Zж ýÚ>DC½ äZ8´ /+*Ñάj¡±¨‡“­N_S‹óí™w·óÀœEÊïS±…Aý—éÇ¡V5ž-4Zd­Q/hQiƒLRRO‰•¨6Æa›8Ñê*,‰ñª—Èuw¾«(Ü]VžÎXvŸbCà‘>^I¿ØÛ7Š~tœÍÃDb9ÀŠ>ªÅ: þÎÑq¹Ï}´HI öHÝ8Lo„k3ÆÁ7ƒìa€Ýà7àdý0»®.×à?ᜫˆ°øxLŸY–ç¬*±bú,cªëOì]³ÞB±¾/âAÿ7ÉYTØKH€b¼Ï޲OÖ釦§{‚ÿø“ð‹?Õ`¡+îr‡Y…I÷¸ëɹ;‰£ EªlFøTi-¬M€zÁ2Šø8!h*é²5È#Ém`Ѳ‚ÉаIÐÚ¢ûJ›SÒï €•4x 0!ƱÒhÃQV\¬ °²¯«Ñ4/ÖNà{™ÊŒ»8š©$É”ô Dð3ùê^£$5&Ãà5 T©»áÃÈ ¬É¾c`³XNÔèÐðtX,—"ÖL§Ýw¤qš?YÌ*Ì„<ª,EÃsc™ïŒ&"NÕ* ¹#=AêHB!:¦Ä¸’¤Hau> šÉkq*,…¤IaͼG è¿‘¤!p¡pB!PÜ$ð(Sž ƒG(„ÞB»Š¶Ç°ámÌá±ßëNHzŠ $a®<ØŽaѤƻzµEáQ§Q/‰ñ¸ØÆ…²ÚŒª¤½‘æØ•xµ&ýðõ®AÒ˸FLåQÝw¸ôo'µŠ Ø*µJ(åÐ_±×F{ A͇SÅ…SÉ„S!™‘³;ŠL…¶©“>îw¿èà(›(UÖƒK"o•€VÛV΀zÅ^buÀ>^!÷¾Ã†Ò.ÎÚøhâ8%MƒCS¥¡eô%4FÎ$3°^M—3ÉL«GßàÆÓG*Õ‘;‚×'Ee}„RMéßxùÕjJãécy¥ú20(}èU}¥úÒˆú$ó²ÉVgZ©Õì5…t W˜Ä„K¦dïƒËK»=5ë+P2›Zš©€ðщVÉ4¬²DJÚÿWhGv Çל6¾v}+¤ó@kØ=áq`¼Â ð!¾“‚ÖPM°Æðø%„÷Ï€M0ð´k.™cz(<09,)XìÁ|ÂUJL²ZW9Ü÷ªú”X“´M)èlJB4º™F 8‘Ôô‰feC­¢$E£U”¤i¡J’ øQ ÊN46f„q§$ ®bÄ(„Bé±Wíª\åÄ$b¼¶…£ ’Àu Ï7Jtãó|¬£ó^q-½〛*9Ü_`¸îÃ-¼§Ý;:P’N|6qt’îZok=<‚Ýÿ¥ÈøîŒ~öÿÃqÚµÿ#M1$A’pÿŠa£û¿Dâ ‹7à ŘyšË3 Š!óL$g5Yˆ¼|óµ¶/z4îlû/±ä¬ÃOûgqš–ïÿÐs´ýGâè1^?Êõ$V˜QŸd+„»žè“`]À‰ÅšŽÕT¤«\vpìwö/Ø¿¯Û6lGMJÿesoM½ûÞYwæµòÉyzÍksnç Ͼhëñý[í¯|QQ±úâ³±KÓ¿]ûXÌÒ5{Þ©ß:½â—ÿl9j®š­¿ð¶áÚãöóË’Þ¸t°Ÿù’mÍØõ+;dHly!ùÈ”VTÏ“?·½øÞá«oœÙ|Ý…Î)[ßx‘ìùÔ…Ëóøg¢õ£Çwl)*=P–pï‡ã;éGŽ¿}Áê‹mV¶þzÔY·Õo1 Ìš2þÀ’SW,_àøgц[wÝ1í¾×ö;Q{æ•ewõ|ỉ˫—Í=u}MÜÉžþ1âçò«#ÿå\±õÎKüã/ü¥Ô¶{bɬ1{™”ñ]öNÜ3¸Ïš»Î®<}ëûé ;&ÓióVUŽ˜ßî%SüÊß—ìßväI]úÛõ(ÿfÉê)ÕS_ë‹κŸ—e’3­u–·ü¤rdKrï=-úm8¹òôõ‡>Øj|ëç™§Òfö¯›¿ªÍ±ñ{?j—;¾óÊ ¿t¨º¾sß”ÕS´Ý7sËÿ7oðúóŸËº«÷Þ­UWžr$éñ»jnh1uóÂÝ£kœ‹f–÷zueË[¦¶õñÁÒ©Îæ/˜_=³áØGíßT·I—øÓ_{×,§Þœ»Ã™\ÑîÛ‚A½V}ñV¼p‚¬«oÞéî¢_úÄoH˜w*~Ëåyïî¼xuñ‚–¼´)¦¿vÿ•Œóû.¼Ü>ÖØnø¶‡SòGeUåŒ}óÅ]þgú„fVŒû*mÿßÖîÉ8eÓ²Q#§wüé¾½ÝwÌ{p_ÇÌAæê.+/µè³cjÜì›?½ôÌìŽÝ¾þêùØ/Šî}Oè–ÿUÝqðMKjß8iþl×'µy³†ü}ñ¶)¿YmUéþu¹ùš¿nÚØ½Sv«ÓÖ/ì\¼í®œH[_W|ìàÊ;ò»õí´nûßýedÌÙEIõ’[}þÃ=³2ªËÚt­ûøŽY·.}múäö=ZYusê–îÍ/¼úÁ€G§õ¨^øæ•ú”³«¬oϲhÞ•Œ±Ûjz±qWn‡ò¤ÝžzáÔömN¸÷ÍÌs‰–¯Ö~yúšÓ†tß;µþt«ÓÎWʓ޹©¼ð®å'H™Þº'õÐþeµå=#¶îžºgÑ—51ï8¾Ÿô㾫Ù_î;0·¾hmn·áéç÷¦_=ŒY±¦WjcËìë×/ªN3ÞÎ.®}¾ÏÔœ)›ëNˆíZ?xÒk t·Äg¶ÿakËê/vï7èŒñ†“[[•Uã'lÏaÕmÏ]ºþïm×ožC<sߪÉÞèwrh×N›ZÔMذöÆŽËk§=uÁœÒk±±Y9ÜRPÔa«ªiµµÝ§¦ç|Sdû6eJÌÓç7¯?TTÁ=4™:qºøÙ™í6ôÈi×nÉÆê;émöç Ïèuó)]Šmø'åW¹GÆ/´àÎ_]¼-§òrLÒ#ïní}èu[–57ãèä« V®®yclß¡OÞóéôÛKŽ”è7÷^ÔçžøÚy­ùÚúÖ'ÏßVt´÷ãÉíO/wÜ|KÛ=¯›j®o5¯âœ'>ï_0âá¹}[~j¬ëb/žµòž…;÷ÿççÇ«ûôNÐÒ¼ÿûÉ3’/?ÒvÓë³6y«Ysõ££Ïßv£³÷üC³öU>¶æ¡Š—æl[ÜwÀu‹åŽ8n¯]º³¼¼yç¤Ãö‹_tÍjάÛytû7M®4ÍÑÌj¶çUvÚ‡ÿ®ú¸zéÅi;æ\ æ|Zþͱ–¿ÎûOÎÓ×åµ-^·<æ¯;:cËÂC3²SÌâ¦Ì²vMÎÚóJ*ÑaÁì¤Ù[î^Ûïß}’”õt]IÍ®ªãÕß=1³|è•é­†­ügLç=óc¯ûð·Íó·çÿpTþ# ®´5®¯c„Å=€ÿÁƒu Cžs´8¨Àu±z7êÓ¬›i˜½6vpÄ£Ó…/°1Ü%ì:BÁñœv/ .B2vs¦Õ9NÆ.L?ÆZéÏ%V:“3…G ÒõHÜû„p=+ýÐâb»³t/œ p×Ü옣¿Ü ÷ÄÏínÛ)¯í˜`<&X_ŠéGÚ,¥Ø8!oF]÷z‚êG i¶Á-&§©Ð>Ñ#‚’©âdÅäÍ‘N?:# #Ü7ò²…ŒéܯΠŒäàâDc8”‹ç¥¹{û ýPðT–15€ÏŒtúLx',:÷‹rá=¹× ¡Uí qFØïεàÓ´$Ðe„~-"4K†s…æzÎhZ¤¼lÀ¯~RÔo䇑ú@!W :ƒôªA¼8ÌTj…•WÜbÀ•xNÔ OâóˆjÐ>,ef«#613Kžd/uºvÅÆ q2!,>¶Ù‹á&ϱÃÁ]žqšd šâ\O³[Ô.¹w•oš­¹;(œÖ×»¶ÂŽÍvíšíÚ"´/ÜÎYhMîë-ÅJ‡5_‡c­ù!0–!*–¹Ï(MáJ±çÉ€*';Gàβs,0Mvœõ}NÊÏñá£~ÒásGúÜËÏ‘Œo>àb*rÎéž‚V½ÀŠàÖ™F;ð‰ÐÁ Öò혻LŽ‹-l{冧ôòîGNŽë=õ§ö}}ÏäèDor8ÎE'óþô‡,þo:üQþ—ˆ2ÿ7þ?6êÿHˆÿ¥íãáþ'i<Êÿ‘Câ Ž7öOrl”ÿ-"‡ÌÿD“ñ”ÿ7"‡Ìÿd“ñÿEäùŸj2þ⿈2ÿÓ×’ÿ“¦XŠ¢8Áÿ\”ÿ7"‡ÿEB>Hv–›k±ÙBä…Öâÿd8Väÿ$YÈÿÉ0Qþ§ˆ*üŸ2ß«s€Â’Hp«&¨ŸÚ%g.{„Ê AåJ5hA…)|aÃæ“C àƒapÛÔHaf†ƒû}iá•ìÂ5eŠP×FLê¡à–|s±³Pó޲b[©Ó¢yËÄB[žæ ™¦ì)%¶†±•¢¥ì€/„B õz*X!!?,ü‡œ ÈÅ´ÏfkÁ ÀÀáöIðf«Ãaw No嫼……ø•ÆIø•Ð[V½'hLò×õQ"Ø(l@D°×zô÷ÁLS‰ÿ¸èüoD™ÿÙ&ã"êÿH2ÿs×2þw­ÿ¦£í?‚‡ÿµVaAh6Éê°9Æ­ÿS,MÐRÿ“4C’Ñø?Gã¦xŒã©(ÿs”ÿ9ÊÿåŽò?GùŸ£üÏQþç(ÿs”ÿ9ÊÿåŽò?GùŸ£üÏQþç(ÿóŸ™ÿÙ; ÿ3·5üáæH¡sößòBÒKÍÌcŒ¸q܃‘Ðæ²ÐÞÆ:Ê´x !ýȆ¬2Fò,Z0å0ŽÑ†0ÐQ@9\£°Q@ÉLcQ@Át£rQ@§Ð’JÓñtËÈ?Û4™ø#’M@ÃñðpMQFª ( ‘iÊ`›4Ñ%ᨅŸÖ“ÉXH½…±ú¾*L±;3+L%âX@Bl˜!o«÷äÎK ‹$‚àVM&§‚ðFiôsdX˜fÅÆÅÆñ ¿ '„UH¶a2€^#‘Ö »{[1À‰NSƒâX"Vnqt§mu.ƒ°× ª„üp‚^C:À¢¬ªòÑGS+®1Í ¼KDe‰Cº‚´ éISr#ÕI[eYg}rLIÝ ê‹ qÚO#II#Éë¡F¡ên7@£ªÖŠ”¨ žoÚö85¡f`˜è_d%‡bà‰(á&í’mö…=•üí³/C#D”@CH5$ºz¡1. *íIÁ¤h[Ñ&Š—.ÐA©²êÊòêí}ƒgÛ%$Ðÿî¢(õÇ×ê'£Ê|ƒa;0›­…öB›¹J Êð!ÁJøaeì2*Š¥¸Öê„È©\¥ˆU].è¡ãÔ i%hI-6¤Ç‡®"`ßäª4+«S~LÒ.òð˜Ä0ܵÐhõr¡r#œ)/UͯJÐ ¯ö¾UBA;E\莣æp«'ëlˆ (SŽ_Ä[|JÀÃíß,ûed“Xn-vúX#V?ñpÎÛê4j–߈ŽððFP¡’“¶Z‚tQü ìæ‚âšÉIBXýäUá3‰B’:–PBr{aEi ƒqóô’Vß;bD‚BnwçÀSX¼+é),w¾‡L1˜½ .Ü,Î>¨4  -¡XÔl˜  o$Ñ~¬(×)Z$v“4¦Ô#+›(%¤Ë&ŠL¶be‘¾Ð•Ãò¼DŽ×* ׂò`y‰Ãa2°’c9)q¸ÚRMÇ*ô¬P4Ë5šhÉÚtuÙ¤ZºòÄ5O€+ ¤P4õ Éæ+È MYê³ÔR£ë埱®Â<žß±*Â9‰¢4Ð4´( pE± /›U]4#m Ú)±DC"Y;•X‰øÍk:4ýÆ0hG Ët0¹ô?js7WLÁˆ“×TJˆÈW…’’Ò¨D¢’ !SD†ÈðˆBÉœÒD¯R2¤ER¿³Ï­{oÝÊíÞò}¿÷½ÇÇ>ç¶÷>{íµöZkïõYźçÕõB"–—*º,@jëÌîs׿ç×VÈœ±ºÄùcwV•胃rTú^û§yQ™âÇ0r»þsÿâji¾aŠú¸rWüõï¦9 ÷Ÿi7Žžÿfx3 ¿šôqq3Ê ÍüÎçõ\UåóØCOËCÎÆí ñÊ÷ô’;X†¥y¥`£2^|~aÉ»ÒH·i9ÏÓÕ }UR×ö¾Óv&)ÌÙ#Yr)’Ɉ}•\ûBõ½CÇ|ûåwæØ®3rø9ýRM•{œË ¥1W3̯z±¦úú«#_^”û¼¼è{ÙEIŸóUýýîM8tÀ<1Ž˜ø˜T½;=¥¿ÆÑÝw§?ñHUÝ÷ù£Ó§²QIÏ^=—ŸÖ[ií-«‹‚mkj· ©’ Œ|«¯âXž±RþXWÇàÚfËN>ÅwU<ØŒmvÓ± öѼé¹$ãñt‹èÌg3r{È™$ºËÆ^õV8óá¨ê蓇_u<9åû´ ÙYˆgßü‚‚‡;1Õs«ªZª³«é²çãÞ½Èu}4 X\»©ÝßLo¶´çýiQaQ÷óîÈWéî(±fÉ,ßR1°Xv`~Xøû‚É÷ðOOΕުJË8­3ÖzJ¾´ú×ëS«nÇÙI†né²üËÍŽ~®ƒ>l”îk~êÕÕ¨³éã}Ÿ–¤Uy¤8˜Ue=Ü¥÷aQ±½Þ}O'S­ëq:d»Ù­Í±}ÿêá—¶wéG‰‰GKYÏ;‹‹“w†ÍL=‘8$ñ›éíÀ.{ªû™eÏ8áPW¢ªòhâ6ßh/ÿª‡áf›ïœ9ûlþÍÞÒzÕÃÜË6V ^ýåµêº ³®UZÏ6LBÖ=¶æaf¾"ùXåØð‘/g Ù®scØ‚“CäΟN±3ôº¬³Êuõ.òOwµÐã;Ÿˆ:1ªÛNõ¨+hO½B¥9ý¥Ë"oʆû 9ÙËDnÝ飧{-’x$ä=mèåÏrdœ7á’%§¾lRžÑc‰ÔÎ÷h'fOtïeæs¡ ÀPiýû¾[¯L­ÐIW<k§0åô§'›=Îx®[³Ó%ì¦Ö—y¡îžëÕ)sºËÆÑ7Œý3®üÄ÷n9±oÖ RÒñd}ÅD “̧‚´GHåËa‰½‡ïÞ8'·¿éù²åA‡C¿>ýä}c™{„ßš˜÷Ð¥¬¨Ã+¾–*ôP qË|R›üÜästŠFŒùçîG %g*| reÌzîß÷¨zS°éÊþ‡³ï'^eè¿$7?Àgd‘üåÑW´:»8›t× =!57³\wä$YékÁŽžißõöûç¿Õ]sm_¿èõïvÕ:)xõÌÕû`55õýÅ›'2s?ïYgEÊç¨ôš´ Çá^ÁÓ¤ýv%˜—”Ÿ ‰é=ÈxS`™”Qö¦ÀI›ûT+Ë»ä&-½©56¢Ë c¦a¿Azý ©cŠþþ¸lF åmè”Ý\·Lÿ ¬œmäÔíòîä1³MSSíÓ/¤÷>²ûõ6-›+’y=Ê¡U&Ùº/Ù]e2'"`ÀÝ—ãÞl± ÛøsÁW·¢ ³‘[ÓìM]Æ•lý~ûÃ{8ôéøc2"‹9‡Å¾9 6!¥âƒ{€G¢®ç¸È ¿è¿Kß @ÏfZ!yg%¦\=~Äh€²ÝÉÌ’¨[Ž[Bîf¬~VlnS+¹b@wƒæÓd"Úš4™ìX7qšÌ6H“IýC!·œRHÑeB óM0‰´Øޤˆ˜$“zabAÔLk9mgs~øšL”l6M&ýê“&ÇùRXÂ0Iò§ºäOMIqK 4™‹ïwñ¥Ý„á&RqX);Yü©3™}ÞÄ3ϳ֧ɼ~½Ôܨ´ÒtYl—U&R«þ'Ód¢,æÿg÷Q#ûüoã¢H]þBŒÿù;.>ú7Æe·s»èή«,H[64»€¨ŸÜ«eûŸ’›p#úS’‡Äöÿï¸þYøŸ8nŒCbüO1þ§ÿSŒÿ)ÆÿãŠñ?ÅøŸbüO1þ§ÿSŒÿ)ÆÿãŠñ?ÅøŸbüÏ1þ'×$þ'NGÆàÿ+øŸÔ_qC$ ˜¤‹œ8zªˆ"\H2ž‚蟢7Õ"Œ„pT$åi9.guÛúÕ C¹G´›€¤lt¾®Hu·‰ø.ÎqTi"2Z€ð&)ÍT'PV3”nnøq„úH.z&N°‹uƒLqniPl1Ú¨aWÚ¶¹(ÞÒìÆQjø1˜2;«1÷8}º¶žNœ¨¼¦ ÖŠÓó ôŽQA "l!0 ªþô<ý#Øïp˜¶,A´tý{:rÆi§&L}JÉ2˜ 8ï1bÀ$8+²ï¬†ïqph€ d µÂU Æh„aOï 28Õ_ÐVý<¡gÆ™”ˆ€ñæ£ÞÚ­~A#›Li+–¥èÏ ‰ÁI&(Õ÷œ*œ*·¼Ea¶ –] Ρ‘²¡aœâWnt-„‹Â³"CÜ0ñ àY˜ÉæYJ× yByx–zF­/Š3X(Ͳ$7eô 0#½ÂÃî(ÐHJq$Õ`VŒû—8Dñ'Ê7¡‰GbÜ—0 ´bËH‚º! ²¹˜j‰iˆ£ïä¡>ƒ‰……¨\(¨j x¨àô£—0¼u¨T„BHúÞž|Ïnƒ#ÌÙ€cŠÓoñ&õæ{!ëx9o+-§ê žFx‹B‰¶hNh±AuŒ'5Ç£WG¡Üz-g€E`ˆŠgÜXÿz?Ðÿ1öÞ6­D²Ú×*f·Áõ±ÐÔçzl „—úB ¡ê\“h3½ rÍw&“^qJ0ÓmKaíìô£ÛÀzP®­ƒÑIºD±¥„ª¿õ´ÙEA6ÈÚŒQ3Fê=e,ÑBˆbÞ$àŸj*ƪ3ªÚÛ›özP¡ÛÓàÀ‘h´¢þÿ) raðCýæ^-ãÿ0àc ðêµÿç7\0j½x1JPCnc³ˆE ÖÅ1Lr!¾·²^üßîŸøjßKþ õ›{ý‚ÿq‡øð¿01þ×o¹Úÿ;àOîžðnn±²BöÊ—¦‡lÿsÈÿv‚œîsò’lâ>4(»øº†ævE»E«~ì{×s +«»ÿï!GÒããÎÅß÷~Vzuˆù›šû{kR¼–ü9€Å»KÔn)90ô»ãJéŵ“‡TÇ׬2þ8û¸ÝÉôY‰áÞOJ 9k{Kò†œšò¯÷Ñ—þðÃëéW¸kBБAO3*s–õó“Y4°â¥ú…WN&·"¤«´úÍ®®!¯ÀÕãÇÜš}úK »ffqJ¬ÛªoKôÇZþ€ª—}µ¯|d\5}ÂöïëÓz=xq­h؎ѯjJÖ¥%TeDV…ôwúªÝ5a%´eȇû6cžùBç‡Ox2û8ì‰ÙÓè ;nÑè4GÊbéŸY1¬.~<ÝÉHBò 3ª¡ÅÑpâ€þ‡Ç¶ßÓ™*Uþ481ÎÁó£Þ#ݪ]­ã,'xšÞ•ódøåNv?h d©¤ð]ßð¾Õ“ÚÏß«ÊâoÞT¼­¤,¯z|ë§'JÑ•)ä í ߬T«UÓ÷û&¤ÿäSó:6àÖ×þ½-Þ—¥ÛZÛË×dÍÒÑë/%ûn—Ìgä>””ˆeôb0µ&dbKåwn5‘NZ¨[¶ctff|Ì ÿ}ê xÜöanÏí:Nò†MÛü™IeÆŒøt”øKG»¨„]VôáõÇ£,ï×Ò ¾µÿá‹{’'Î*Û|XÛþd]÷šÏ¯óK—<Ô \OÈ÷ÛyÚ@Ïàõ4¯¯ÙòÖ~·ublëÈøf0LÙÅlsJÖ¼<ŸÝzssT£“ËC•ƒ3Çh¥^fœ›-731UÑÊ퀋á³tå5þVÃÑiÝ ‡F/fÙ*xa°D±ÿÊ€ð“]·ïl\8ü/¡ûMŒzyϨyc÷þ¬Rå…ÞJÝ·Ž¯v¾ýtŽ‚ãúù1²+ ;K&Æõ޽l+á¤ô)y©º±•²tù¨¹{”ífùjdt“9×7|Ô²­R–AŸ{õÖ÷cµ/jä´MÖ½ðÌꥸÿöFWý×LTeºç œ£ÇCâðµÓ,óòv»8™LTkwçé ÷wžKoœ1XjÞñ~2³_–OÄÔ9_“UÖ~;Ÿ½ítæü°¯Wß3ê™Øýœo—¹‹ Íh×ܤa:dg÷ò—YƒÇYÀ‡º <½¯šVŸØÅËf¨MF(>_=s™ý1ù7nRóo­9òY%5È>uì<Ø^î’Ì¡Q+ä.'çYù>|;WYïÔÞÁ“ÇQ¸(æero“o–%/SÛÓÉqº¤¶ëÐ{sk5ç½EO3'?¸YšÔeI¬Á­Îw|žÜ±:ÉmC`‘LtŸ…ãc³ý†äìuÔÉ vüû¤ÌŸf³VÞNÍŽ‰ô<³Þ*Urk^Å„3w‚?™ÆoðטX !Ãôš®0KS¾´sÈYïK ÖF˜­ý–'!ñ#ÔmxÜŠŸ{~îzûbá°õÃM½K.¿‰±É¿`¾¡oJñ©ï|NZîŠý1Åâ`ìKéÛæzÉŽçŽõ[y/ÏnÙ£q# ûFû:¾› mã!kZðÍxoÀ:WÙk÷‰´^óÏ|Ó=“8ï¾ÜÇùgñÔ2r¹ çÌ[ƒdÎß”Åv8°pþg¾Ùð¿ìÒb/èM+VsŽõ+D÷_mÿý²3ÅC£Î ´[–í‡~ ½ßâ–Â/»Â£Í633þé8óJ4‡3Ï~õ;q扖pæI~w˜ÅlïŇGMëFϚęÇp~Œzák—D™ü¿Cù±â™$?Î<ØYkü iCcòµƒÃŸ$ÿïHˆÙF=ñ Œúy©f* SÔÞ§ÿ¡S£¦ðC¥‰GPꈉ7í`ä³ÿù²KP¦ßb°tº:;¨S¿ÂƤü쌉r쌀(ûBP±ýÿ[.³ÿcïY›ÛÆ‘ülþ ÌMR“Ü®%Qõðͦâ±Dµ™Äe;“šŠR>Z„mN(RKR~¬JûÛ¯à Á‡lGÑU‰5ãˆØÝèn4 } vË\ÑpQ&ûåB”í/ Éx7i4ÞÅfãݨ!9@(ä„^ROt[jcvÄࢆ‚-ÇìÜEAõ뢊åR[j`gol œ®À›Rr9w±ü´®7<Ú0¼¦dÑõ†x—¬8àp±§½¬-ÆaHÆ?cØknQòì×g0ÏÇ»ÐÿÁ–øo³qýìÕ³¥¦xš<´ÃC5}sÊÈ(eÜÞ˜í§,.í«¹O—_Þ}Õ¢’ œƑԼ¡7SÏ¢Ú8¢‰LeO‚/lßåÃö,üºÀ‰üò²”ÕÙ\~ ~Š o"J´Ïz>çÎ鞉^Ñ¡ Y£7ã`~Éþ¿Çó <øw:½/äM¬4˘Òo:3'á(¤S°ÎPlÃ/¢Õ6çf Gkî€sRݸ”¥KòâíéÄtñÊgc3Ÿüîå*à ñh™¾·ƒp9¦¦ã°>Ž¡›Ð–ƒs<î¶A¢R`¤ôÄÊüÐ7¶ÎM‡Ôæ <ôl cîYwVäƒ^‹‡´&êôëÄòóBÆÂH õ™Ò^.ðThh‚Bïu¥¸#ZA@\QÎöËœU}@‰í`x™eóàㇳ“³ÿ<ú€?Þí8|t²L[ž`ÅáÑÙþHݶÛBA225q`/iˆŽ•…²cÞ6>ý¡e°fÌ9ô&ói|~ár•QÒF«Q=–Œ…Ÿ"Ý8gŠñ:¯*ËAUßHAdjö|ÉBþºãKl£a1öñ°×à›=[.Z°:š9ó€“éòQƒ©|‚ÚËRôTÃ4F ¢åËñuzJ­F:Ã4ŸŒ§ÞÝâË2²üöër¹\ÍzµQë¿÷Ô´C:Ã÷@Ÿoab¾NF{‘ÏØÈ‘PX‚‚ñ»¦ÎŒL),/­€˜>Œ&_âkS\°S¤ñ©•ˆ8r-éA`KÈŸ~+=q2zûî |:yÿç2¸•,i$ÓÚ‹hšÿ¬5§ìx×½Äu±D{›%²þzì±3a‘Uˆ6ŽXD|‹œ@41Ì”É0±$¢"OÒ ç¾ ô¨L<Ö05þ½<ÑéÌ¡,Nå¼ÎÍN‘‚ƒ ¸t¤[¢Uc¶3¼¹0 äÖ ÈÄÄÓô/}oʺ{ ¾™w‹ö-g°Wǽb¤fƒQßÎ×ËE…/¾\Úd6«‚‡M”3Ï^Ã=æÊ¬ÿ‡?0ÿ›ÑÕ{½VŸçëw·ùßÖqÉò×[›"ÿÞVþk¹2ò×7FþÆVþë¸2òooŒü{[ù¯ãÊÈ¿ó£åßîôùü¯o忎+'ÿÔC¨xlúaÛ>ÉU±ÿÓéwŒtÿ§z¢÷»Û÷¿×sI!)…ìÅmyyÄ›4® ® ¶{ÔúïòÄ_¦Å^``»;¸ðÄYºŠ6aå{„˜1Z{òüdø¹6] V|W{ã™ék¥kßSöD~Ý•c$³ 4Æ<ÿ;þ¯ÅòÔï²£ÏÓ¢%ÃXø„ÜEvÌVöYÜ?âY,òl½ç HXÕLz’Í–ŽÑc»-zÓ2Û*Ññ7ÀËvW0D`¹ø…LE?غŸX¶ÚäÜèhA|ó‰°åÓtGï²î š–UÐàpuŸ¤#¶½I+wˆ¸F>BïjDß÷ꅨݫh$ODÿ¡#Qão²ì}ÅXÈgþ›:¸Q;¾öéåb ½=ênYÕkfÈ<0d^цKC—­lõìÕ3RŸûƒ¿…³÷µÕèT4Å—zö¾â;=B;6xf¾ÇvXm/˜ïbŽÁ4›G¯½3$vHn1ÅäÅtL—sçïZ’Ï£³w?‘ý’Ïû''ûÎþüh l‚ZzC9{:sl{‹ù¯Ýðƒ¥¿¼ƒöû¿ÞÎþÄQúftöáèô”¼ùxBöÉñþÉÙèàÓûýrüéäøãéQƒœÅƒ–e§Š‰ÇȯcÃxÂØ0f›ô‰I~;=äÉ<ãª9¥BÇÛÀ¡þ4ˆB•M ·@ÈVÓ2gR|ÒžMmn¢VØ-Óý`º³koj䟦ë^Ù4À½×Œ~…¬Eã[ÒâõåÄnL¼(à_\ulS˜ujºWÞÜô­ôYW½¦·ÒÉu »¨ טÿ3þ_÷GûÿIü¯µõÿ×qeäolŒü·ë¿µ\ù÷6Fþí­ü×qeäßßùw¶ò_Ç•‘ÿ`cä¿ÝÿYË•‘ÿæìÿn÷ÖrÉòooÎþïVþk¹2òßœýßíþßZ®Œü7gÿ·¿•ÿ:®Œüøþï6þ³Þ+#ÿ͉ÿmã?k¹2òßœøß6þ³–+#ÿ͉ÿmã?k¹2òßœøß6þ³–+#ÿ͉ÿm×ÿk¹2òßœøßvý¿–K–gsâ[ù¯åÊÈsâÛøÏZ®Œü7&þ·ÿ¬çÊÈsâÛøÏZ®ŒüdüÿÑmoíÿ¯œüs/eKç*5èlu& €‹¿ÿ1º(ìTþìü·^{þÛZ®ç?Ÿîî[ÞÝm7ZÚóçÑ‘’{${¦dé‘’/áÉ7ø?N’Ÿ&‰9Oð4É=ò6Mzò”͵°ýoÞܵl÷ê7ïnt ü¯ÛÅüOràMÙÉ&Áðúcßs¼+­yè…‡˜ƒ³¿±d4½ÔâBž˜Fk4œÏÞãç:Yh,ËXóÈxˆöŠ:‘¶Ñ#øü=@2µ-M~äâ*Òb€®hÈNà¸12›'¿5M¡bÍg¤Óê‘æþQr§Ã9™‡4)ic’5̧۟—½KŠ»PlÙÔ§$…-(„ñx“>m@‰H“‚„¶c¥Mú¤y0¡–í8f\¦G ÜæQž ÀeÉÐŒ#‰ ÈÉð Û#< f”ƒ}Ið:Pò)Û ô¤ù§„¤Hð7i௨?5]ëÂIìBoMéÁ.ôÖÌS×´fm˜é“ÐwS¢T·iŠ"è“ à J$@Í“`Ãi–R )èaÓ–á™¶cçàA?m ^0Xß3ä(v%Eêiž„³p¼<Îâeqö ¿žŒúàIú@…ÀDt”ÀSsYæ@Å<³¤Ì³8ûЇ¹„³8ïexÀ ûøA<ûñ9»@Â,Ñ ~©gNðÜr020¸4Äf €Æ/„‰ÿ_Ú®u‰'—ã ?éJÌ7_löQ$i¾—B Ø#²\™7cÿ/‰}I€&Ï,ñãÓq’‚Ä´e­³lÑ5™ûx;£Ou‚:Û¥H¢¶d ›gö”»'Œ"ôM¨…&š¨®üÍs¬’ª‚g“³•‹kv?^8ö¿æ´¤…·\]äÀ›û ý¢òBäq½µXY`âPÓ=67-É…ÍE¢ÅÓ]|°Ø~W5ùŒYycÿÏËÖšÏó­]ßî¥9µ{"ÉQ̹V´b˜ªæa&Z< ÁÄt(×h$³9roN±èÉTMo´88 õœµ…A±ƒÊ¯z7Aå¿!Ù‡x<Ų§d^ðoÆ€Š¹æ`l|ù ÝØ"4mbe-†$ƒüY6 õÂ?ª«í) ‹@Ùî ‘ESÕ‘E”Ž /Òäéår¥×Þ-Yà8ËE˜¨` Ò–òìIXy²Th#Î]e±ÎW®võ\Ó ärÀµç}‹?ë Ùç¥,×ÑšIæQxꮃ ~'ÂMró•´az]ÕÈõfQ“Ø,Âÿ"¥MfW1+Yì<'6ù‹°»@Ûiò‚¶5ÿolñ¤„iñKCè++‹×ÉUˆ:½Ãr!¿;éȲ™%…B<Ï>J<w/Æ/^²¯¡"=¹ øí‹¿GåeÊÇ/y"ŠSîà 6Ìj (¥Øm'©1YËXš–oÞ°ÃW.¨û\?.½ˆrøq—Ô†^¼ý—¶ó¸ÎŠ"C…s;!”xá5Å“0ÁŸ:´ƒ']_kÆOßB%e³Ö’,0–Äð¤º)¸„ëÇ1í¾ÂªTSmOBŒ.«|”>ä³S‚jt§‚KÇ«@› Æßµ|ß²ÞÍlõD˜v_Zº&ᨲ  1J<ùPág©U mF‹Ié‹z).qŠý½n±Æ¯âÚv;qzÔEƒ}lQ¹ŽØr3vVõ-3½ °üŒ/`{c§‘±<>É7P¹?¢V[aQ‡36¦Â‰]ÈtQW8G§¶‚+ÊŸ‘–rÒMEik_H”8˜-ñº í¶À¢ÁŸ¯!Iö`‚ülŸçÞbUyr^‚i‚ùžW¸«ÈxèMMÛå™…É«W)yÓ kÍýâh`uxG¯ ï”Å\°§Éb¶Ån“¸KÔ!ð"Þ+ƒ¹!+Tbõ«G°l¡‡Œ²Ä1¿j¹UÐ*çÈ¡wo±ÛÇÏCÉëåNÀÈ*^1Õ[¥H,“¦àñ³"ûùØ@šP¸ù,Â-#Ê çƒhöÑŠ©ŒÇ…F¬‚Ó)xÿÎ N¸aùl©–â⊥5û3ŒhaG¥ Šÿ صGÀž”Í‚ši3ãAÅLXeM\Ÿ CI€’ +SP› ÒÀ 5­÷`óêèœø'öÕ(¤ˆ>¢øä:5‘È¡Ÿ:ØúR<þ³o‡TÙ£aC—£ü=…“PŽI £3L+Äõ€îIár¶[YK`©_·wR(üÃ<š”l½†¨Þ·J"%ƇÄI¤¸óCMw>+DœÝ@Ìÿy-RØù„NKéH˜ù(”Rpùmº{¶Bìmu¤RDy}1±žV^#ÞÂ2÷Œž.’\æP©I+3Ðö¸`óêJ‘è‘k—¹wi B KŠ3Gcýc\ \ +ÿA}ûò¾Ä€µE…)-¯®k’ç‘a©÷µ((ÙŸpŽˆ'zZWƘ+ú—ßüoŽ;Ú{8«%÷+U'5’óÍ Øwݹ;±•;4+r@âÅŠ7ý¼~6ÃɵååßÐ('k ÇtrAép0Œ¼øªe4ÔuLn^í•Ñ%c¿['¯#7(=?ÿ¾I9ÊèWÉ›†¸T-ö¼Œöú·g }sög»’ÿÝ·óº’ÿÝ÷*»’¿>—¥+ùó‡ó©zž”§òì’ÝW¤ø…kö¹ Öj —Òjôs«Ñ‡=ùž"dõ;¤ÛMöÀØm§Ã‹Û:ÿ·5À'n*B[§.}¦' iåФ[mz¿Ïj‹vÖ*Ù16La- ëÀfÉo{ß0²Ä0lÃtrvíG‹ö'Û)-ß »s¬Ýæ÷1Ëð{ïVö¥Û’WÞ‹Þ®*„%*‚8ˆïË \e#§ti¨ø‘¹X°2HË(ì÷¤á}u”¶ƒtfäŠQÓedè2jÓ%ùâ Ž•ù™·D ¥ä¡ÿ§g¿÷„ˆ%Ÿ¼a]X’Û]«(B°ºäQŸù÷Å¢HÜ‘Z4WÛ¼ò)€®ÅÖ¿otàï0åç–zºÔî‚ÝÔ{@ xŒu³ÛJæÔ×VÏ+Š.~‡ÊW8oÀÔ†ï& HüuÌC§ZÔ%»Å¨èñhêðÖHn£®Ô"(˜‹ÄÛAñgDI›jʬ·•’’ë zùàçÑŸùÔWíöcU{ˆï²ô ‡\µñÕL¦ÛÉK=ßSC‡I †mI’î$ç˜bu­Žƒ>H^ƉA?\EqO¡£\„=]ÐÒ¢·‰~Ô;D•zÞÝVV"Cn.‡­G¼æ7hZ¦‘Í/ðŽýër`£Ŷ¯5d·±ý‚[ìfìMñö!îë“ +þm0̓úm½”¹yc¯|¡¾cšË9jbl+!û¬ÔsÏXT _&¥ˆ‚­ÔE¼ˆõBŠÌÒHW†$˾#+8" yËüm„â ¬oU ¬j¿YzÐWôN‰ºfë£îŠ^Ü 4ÝêÝÒ"ô™7“ÔKÁB’¤ÝiI59ò8’ä-üÙ ,bE0Võ§N0–¡“6ïßøÞô”6¤^ϧCJúV•¯Òi>6ûǃmBfè fys>Æ÷¥2?=_†÷+ÅúOÀCQ{ƒôûˆ!¨ŸF!££³ùY\ú·A‡»üþ{Hºí!‰OÊøžK«{;!!±èzƒdõ‚Ç·ö`’ÜòþÕÂt’.fbÈ_YýÚžbaÕ6ZL|Âê_:Ùâ{œg‘½aÔÄgiiIÍÿ±÷äqMßk=*‹w= ê¢ „Íæ A9ÅO ¸$ ’,l  xCoQ[Q¿ŠWý"Ö³žU[/Zlk½Z©à}V¿¨UÚþfvsm"Øþ>ß/åæ#fçÍÌ{oæÍ¼™Ùy5ŒC hcˆ5ÄÚÕ&—M`ƒÅebBÌeƒG… &ûÏ×þ·Jþ÷­²×oÿkÿ]$ ø¸Úÿ Mö¿"àB‘<‰óEIBØ â‚I%rR*#DY’ìŸæ¯)üoÃßÿéò¤¿Mãã_€\ÿ肦ñßÁ%2(Ä÷".§.,Aà× *1ñõņ³fò ý¯(,D¡„F¯±ØW‚À )'ýüà4K*D¿êºÃúš÷Óø„¯F&”g®ê\ÙʯÚIµ ÿÒ ó˼;Œ ©ZLV”)}2®;c¿¿H\1Þ±‹>âœÌ±¢c³Ç_^wyæôqŸíh^ŸšÉYƒß<ÞׯëI’ÔaÊ¡U;*SOÞìÛþ“ÚòŒE'½¶&u§¾r¾”ðMÂ+ŸÜÛ7ô%]¶wxÚ¶ö3ÿŠ•oö¹MJôr[Ø<"kQQÿÈšÕyŸ÷ë½­DTëüçš Ð+³¤I«òÇîýQhh°»ä=úÅÚÁËó’Ÿ]ëóc§ÂceŽSç-Xòòy÷]®Ï¯Ï=T”‘>¸Êm\Õ|çí’øöK¬Q9Ý wêi_ îšÑéž¿ö°;¼%ÌmÆÎÀʼùÎÞªxu°¶ÙÍncÉÏ©‘Çú…«{õo?½4â7ûáØÙˆ[×C¦ÿ÷KÜ„)Ùß÷0²EÿÂWاݾh?YìäZÐI0ï}û ~ã?xÖ!ê÷´àMÝ^}ëºúi|›˜Ã…]N…¯Ì-Úµíaù¶°™ºË^çï„$v—þôáÖ%îíª7–±o†Gĉ-—ïžY’7¤õû1‹{´}¼™¶ªý¨'—´ûùý—Ž¥§RŸõÝöùî1ßÜö*è⼄Naa›}¶gä/‘ï_¾ýŲ¼©¯í(ð+¥ÛY4øò¬ªIIÙþȽÿÜÚo6ïÈõù'_ŸÎÿ ™çÓyòùW†ztN§czÖ~ý[váýõÛôh6bíÊ}a´¿^·á~¿õ½{ù–¿vYçói¿Å%ª]_%Ð"q…êTå® [ö,­-î|&sÑØ/6¬ÛTôýYr­ùògEßÛ—|vjÇÝæ).ßÍ?tðçæ-Îÿ¼ÚÕC|^p¥hCƢ¢¹§ó¶lºz=£d˜hÿÐK©_ •k¾P\øûùqŸäªúEoùìnê”Ú¼Ûm¯µŸ¼¤ÛØ öó+•­ócÚÏ;Q²Ã¯Ÿß[·qJ7¥–XíY¶E¾pØãIåßô8²üFZ/Qä­ Ï» Yw¼bw­ÌŸ“Vã®Rͨî1Ë¿46¥â즽sçåÜŒ²o=œð/M¼*.yæ‰øã–=ûRü† 0BÖüDZ;ÒÎ).uQ9ޝn;vkÿnskòï¹q>èê}‹¶yÜ(ú!åpÜÞÀRþÊÈ‚°î“.í|a—[õPçøåu¯÷+V¿÷KÁ,—=#>ùpá‚™·Ônè½qÏÈÒ㯧¼<ýañ’!C)¿–ÛÜñYtàÒ°u-<Žd¸í´ß}?6}_/äàŽó®¼òË1´ƒýì-Ó_ÆT8v¬<µšÏ¡¥9[ÊÞ_rþÈõ[[¬ïµ¶æ«„õ"ÜÕqÒÁôŠ{nß>n™Û»Æ­6ö«»²['ûkûžñ+Ûöë™>£ûÍÚ­ÚüÅ·ãÉ9—òMY›!W„:Öɇ-©¿º5ÙAþ¦ÊélNqnr®ïÔæ‰}í>£"®&âNøË?ïÆõþlsæôÇ7~Ur*óß7 –ŽŸîõí’Œþ®> :ÎqÜXÀ{ÞÖcWßù³Džk¥'Ï䕆¬:Çó"Zë…Œ½ÖnõÁùŽöâ#Ÿ–=òè7¤ÂÞ«oQÏ¢LíþÀSÿhçzì`®¢7ßë쿽‚š'öÚ³`ë=ø¿.Þ ¤õ£ñò^ ª[M{ovõÜŽÔõGв åB‡,ïÖY+/–V­{v7Úcè}¼ë6ûŒÊ‹ÉÀ÷«s—¬Ní³¹ùåÇC+h¿êeË¢$v?yº»Ó>3VÚ7Y};å<ÎëìUÀ_^uݱy6­s\¾_9—½à¹ã˜âŒ=ss÷¬"ïæÑùÓBÃ튑Š>±å‹¶-=Q”W9i¤¢ ÊñÔʘɇ³»ý”-ûêJØ¥ÁcúJ[þ§fÃÉiQ­[Å—¦Ù½áõŽï¶Iƒ®¹¼xeߥe¡,JR}vov»H·CidjõÄþ!#{ôYVÛvØä5'^Í ¨ôhÝ¢|ìµ€££Îu)ŸwItçEÔ”']S®ï®U$ýdßþÂî »<–ºÅ+Þù´,;ëÂvþÍ33?Æf¿Ù4lÌĘï.¿¼}1?úœ$àt¯NÕ+hçä…ÅÎ[\ôGÆÕ[åí9pç·I m¦lv1q~þª(_ì½ÅºO˜ãÎk1ë‡Ã_lNypâh uàÂúÚ‹ƒž`ðAZ‘êò©Ã¤óo ç,Q/ŽY6¯Ö}×¶ö<ºÙö9º“xx|Rü4;øQò&l‘ºeÖèËN_Oâ×OŸ6ÿÚR?²m¿”÷Ÿ,sàUÒÿ#ç×ËWèzžû)íª6âyµ?êÙgGæyb{ð¯m ü1žx#çn¥Z•+Û¸qÜ=§æoüÏ÷‰Nç0ù‡C’Ðvá+fý¶¦÷š¶—ó³Eó~½'ò­í~æiW/]eŸUW]Ì>~ñóÎ;ýúûK»ˆzÆÝX€ZMi5±> ç³?Ðÿ'ã^•¿@è ºDÓù¿.N‘Ñžr*‘ôxñǸ¨õ—¸z?Ĺ’!°ûŽý£ÃopÑPóitèlj9ÌÏuýÊxr…×þq¡gÏ´¥T*øa|½|ÿ<cA”6äÔÙýÐq¯Èžîg\9ëÒ‡Z…Gsæ6/¬–QìXRïçA‹#MY Ô*• áÑ£X Æ$” ‰¡/gÆÿo&¡„ÎnÏÂE ¨\—Ž ùÞ(lŠá FÈtZÒÀ+Í Z¦S%)I½ ,`¹‚¤IBcò ÃLsi1€À›K&€´ ¥ÜœE‚bCe¤\¡TFØæ°„‹Û²tÁÖlà€`8`#œ‹T;ü-ø3á6ø@]Ã9ø„2Æ:è'Ø ¿«MYúd’Vjy¢ÒTPjKp Š@m [îD€,aMVˆæ’ î‡W‘z’¶0!³jp1`ä° ,¶,ˆAƒ“Ö,ˆQ’CôCLÁÅØT¼`FaƒÔSÁÁç (Èe4EhMÀ±šÓ‘¼k‡¦7ÀCÙÒô¬PÖ4½A}).MPŠCA¸ 4`"J1A@)Wæ€ -M `EgMSê ãДšY\| ²ŒQú&µ(H e4Š£²šj‡þÏ £(0¨I-ÌÆ:Іâ„I µ:†f"F7ófeÌžpƒœ¤ÅBƒ×쌻ù©9Œ£xøgrÕm,3º!'”JÀ¤Ú¬µ£Ù A¦£áQ(†’u¯P“ŒïjÖ;íÐk<£À´¯F-êf‘®%” Y‰”R^ORe-\iוâ9*Q©ÈБõäx+mnr]H†R:H¿.xÄéo%m™X Çï@‰ V$ˆqº3Uˆ¦Ó” Ìg¬òLE6J›Ú—i;;K­€‹3mhj©ÆnBéÓi…Š©¨^V@ûg~õxú- þ‰À¨Û%x4‘€ž˜jf —¡äÀŽêdN&ó]eŽ8I¥R‘®!3° 0:˲áh½eŒ“d™¢"@›ércc ÿ²Š±Ó£Y¨–&Ô¸ñGìR@…ÕºL·…gýàJ e ‘F\FÙËÉp¨®'sÆ© õ[BId‘43x5db Z êÀšŠD=Q9˜ ¸`×]-E ž¡p §kÁØzIÁ?6"²Œx[F¤¦HU–.=SWRBÙ Bc’R˲(’VÓLÒ4MyùÆ¥O°ÙL±áz;»ë7,Š¢á¶ÛÅ·­lŒ‘5£ R€ÅºR~€Úû3ššl6ÎR3BY#6jHæhŽ&fÀP0¡ƒÅ¿ ,CØy02Ú“Ùó§Ó¤¶¥MUЦ€õTB£…“.`ÆÒ“A"ÉÌZSÑø.‰Y€›’1‹e ÊöÖ´â7°ãêë늂--êêççŠjˆ$¥Ô€t8™ 48xÏTÈà2II¨“u`ø)™3m”“057‘©¶/&îx¾¾n`FR£¼Xö×ȘU6?¿:²1RfÈŠŒ} 4°Šž¹/¼á?‹—@0Ç(°‚Vk™såÑHІg”µ¬5ÄðÖH݃ý¹Q©Ë€5®£©Yß±δL`â¦T¨£™;#o1 ai!¨å¦ÅØé ÆGÞnsä/Xû+&ÞD¨ÔØh6W(e¢FÛƒÐÚ(.0qbõØ“«Ë|݃X}6Ê E 35Ã÷+ã¢UjYk&þn“k¸àÝÞR‘sWוê?îÛU`ëõÿçÚUð¯¬Ó³«ÀÖ×êÿ̱«ÀÖ§jCûuü{W×Äñö+-T«¶*V­ñ@E³³9oT( *Z¢HÈ‘pjÀ¯ªxVñ+ xV¤X­­Š^¼ž- Ô£¢ ¥õ@í»»²W’ø´™?ÄÙÍÎ<3ÏÏ<3óýR¹T›‰ÖP™V›ŠÕPhV›ŽÓ¨$Xm"JW@aV5 £+ rªÐP(UÇç (,¬ºÑ¹"éR;1›+ É™‰ŸôøZ±£@å N× H„©Ædk$¢Ôf k Õ¦áj*©RBÕ H`µÍÁÔ Tò¤‡¨`d›…§Ðp¨–¦@`›”¥ÐQ§6I+ ¼ƒ£P\›Š¢ Yu`h$¸Uc´æj3ò³kÓÓ³ «1ØYAó¤Gªñ²å¨ÂWo^jV@">mi̬€D¦ª1+ Q§’—Ðó¡™–Ð’¥ž•У…”ÐR¢“П¶JV@Ë„jtFV@ËÚT„¬€–!µ‰øX‰µéX‰Õl¬€D€ÚŒd¬€DŽÚ´\¬€ÄÚ´T¬€Äˆj4…E0Û›ŒˆÆQ8¡0fØN“§;}4DÄ…©·ŒDÚÄbàa(DZÃŽ+VÆ.¢Y“~Ù¨cÈä3`>ý®šûi¼‡0‡/ ÕÊ{s‰f–=ZŽ%ÝøöЬpÐsMù#¹(}cT—4qðÂ'†ëZvʽúäèþ!Žø”q e;™y@mêzsàô ‚>‘¨vú$˜Ì˜G ­g­]*ªžv|ƒ –1–™êaœ>;ÝÆs@tIKÆ¢‡Aè—0”)‹£ÉcØYâ*FjZMâxñ)ÛÀä´ †®³Ä]&¦®•ÿ('?õö! ˜©Î’1è8¥6]U˜4ilOg JŸDkщ­¬}- "5ë¨Ø o€ Õ®Tj6浜ÏU6zˆÍÃKéÙ™$¤. è¡önMüV¨D¤J"/d<@†/ƒ‹¥øŠR»¤ÑN\ˆÏ'‹;jv”T‹%:yIQÒÿ ³ ñ(]À=m‡º6¦ÔSÁJ6+UC^.›\{ZÉB©6CÈÂÉõâ†ÌG¨©ÓȺ!¤ønL]©7NH6¥wh-$e©ÓdBÂ|rM"]XÕÈZ¤é¼Êrh- àÒ 'šeÑ<è Dlí §”‡0‚ºBœ躵RkÊæ½Pµi|øFñ<øÍê 8õñ«ÃùÕé7T¹Î ì4§÷÷7€U™³ÙüUí• m5© „à¦ojïÔ,ûA\ܺ ¢…ÂÐz{Q¹nS9)+‡ˆº¶Cg¾hôÅ@õ̇°’Aæ`t몞¿…ŒýTæ>n‘¡¢Dh °±‡û£©a}H=²P/F¬ ôVì~tõp>)”‘ä!:Ï!Yèì—CDL:Dwl|”É?¥(Nýê-¯wÕ—Rgb:ø© “:¯ù7<ÐU­Þ”âªæ¡†ÔúCÐRb qÍ´hÞSä/” ý‚BÑ0(¨ÜQžq&Ž„Åe’Äej). tº00û¶FÍPGATL‚u0_+9õ›®õ–C´hǺb+‰T³5‹Íy*V*4ö>S6ÉGåꥵ è—¹ZYÍhÖÄíýºòj™5µÀˆ¨¥Fõ:šÔ6h3„ø¤ 3ž8’#—C¶Ûµ&SGsfÒ´*-sVQËZæ ‘ÝŸ®è¹ - ø]Yš.CɇGnGîÑâIˆ4FûâÜC”»*¨,´ùrÉ©Ù1B™:çŸÊŠ¥ñ<7Þ¬ê ­eÖ!kZ¼ÑA,NÝc˜[÷Ä´£dÃÁwØÛÆ[wFáEþ¯ñßA­ÿIäFŸ˜Å†LøoÆ,>à²`‡Çgrý`1ä'\¶ËßÏ_"d²D¼æ–Ïš6èÜÿA­¡ÿ³a6LÆd³Ù¦þoŒ`þçâiO#°Úÿóüäi86sæD›k{×|ùcM»ÃmkÌÎÞ[bãfvéÁׅᾯîÞÞ4%«âN5¼SVˆ}Þ<›“s$¶æõÖ*þüÇy÷æúú^~{iq¿¤7/»¹¿òR6¿ûOk¿ñ{îîõ긯œ»«ô}¿9ÿ´)xušz?s}›ŒT~˜0hÿ†}ጟtzôÎÄò멹÷Íã¯h¹ô… âÞÕp±ƒ]í!ûµ]c‡ø&ï-1?wC>n×w…ì;ŸÓOvy‰¬{Xjý·KÔû¶¤íUŽl“¶wÊ'ÅVµ›e^¯ofˆŠWwÑ{Ð óó«&?¹SÅìx¬‡ÇÐj¹óÖãk"GýÁN;x·:éüÙáüƒa[‚;/-´™$ëTxq(ðZ|íÛ´È©Ñ>w,Héí"uöšØõòÖ’Ý+½mÆÙMY^;«|z+îMûû¼V¹3†c}^Áþ,_tkLéŒ ïœžÎë’ÍÖl›{Âùer€ÍæåûF=M¹¼ôd¯pñG½ž\xvayÿô±©%-‡žÇJaûö5;²s–ΜÏöÒ¹6ãì•ÇgNÃ~—¯1ûÇÉ*&„û&H‘'uKvëµlæ²È”ëý¯ç[T .8Þö·Z”æ> (pˆéþ0»‡ÓŸï^ºätóÉÉŒ£ -^JòúÝzxjÙ§îûz¦ìoWÜfÀÉ ‡N½°qK­'g·¹î–ºÿúg‘_ÄܼgZ\RÀôH«¯Ya}ûßÎk3æïãÙ…g÷xøë’œÃçBÏïp~ñ$Þ)¹Û5'V²ÊÅë§dJ÷·¾¶·ó¡eOÜØXyÂv¨Y‡—SŒŠµ³øåú¼×k_“ØÑçÈMë3ïiqŸcÅ&ßcøCwÛ9Üãÿ}æ¾)“ÒÛ¾Š¼¶¤ŸãÀ]çf^èXÑ­o´eæØu³™½H³ýÕíüð©WÝ]E{ŸEº}énÁÃýZ¹"}ãßVypH5°cQæË— §/•½ŸSÑv×J×1vÖÏ$߉ofr«œ –oú5ÍöቚNµg_\¨ô¿¾ãÜ×Dýe]8£Ø³“½xÍÙ¢9‰+ÄÜ:õƒ÷ÉyKʶu ¸ï{&æ· î•ù>µî~ƒzœù<ø«¾fSç§ïº’|º}W›=ž¼R©äf×”/®O´â´cŸKë žl`÷>+§&äíÛõûžV–°îÉÏÎ[Ë8pþPXØ9Ñë•—s¦[AÉÝg5»K<º 2lº· ûäõáôu]ï•–Vy_¨œzÎ}îümNÑ?ïX’:Ò'âçÐí‡ZC¢¯¿—\±‘—Õ*;¸u©ó¥«Å=¾\T¶}DÚã9¢âÉSžzôrô³^Øþ…ëÏõÚ3iíè‚ÏÜÝ~ô(š|fΣwæ±AU’ãB0ÙrÜz¬ÃãBxr\ Ž÷ßÄŠËFñk°š|µä¯j°êG…‹­¥QäÕ&[/¯æ‹ÆPâÒ0Ðâùi[&-{OË@ËW~j$ZX -ÄT¶YQ˜[!ÌÑCzÆâQØféh!‡úŒË¥²Ò" R~Ç£IÏ¢²Ü2y”oážQÙfa l³›9§Ì"f“à°ä(¨‹-õ ‰m° ÖÕ·£M ñ´þWÿƒQiýï×2ô:Lú7F õÿæäÿÅü?&TÇÿgâÿ4J èŸb'ŽCæèÉQA!º3À  Víÿ‘ôXˆucòÿ#´,þYϰ€‰þÅDÿb¢1Ñ¿˜è_Lô/&úý‹‰þÅDÿb¢1Ñ¿˜è_Lô/&úý‹‰þåßLÿ¢ôiÇþ3y ˜÷Ÿ!á#³»—€º¨bbA£0¯áP=ŸÓüÅ™©»õ‡?Ñßú«w;ëuëwk®!ü•bˆþö®ø°òÚ#V^Ž6Wè & ñG&ذ0J½¤8ü:4füÝr²ˆr²´–Vuׯ^¼ë§Y4—ª™dD©–*$S%j€J)õ¼Ž¨«¨Dì*Ôµ€Lk¾¨Áì7["¡¹þOºœNR¢kp€G$úEèWL2üU ”p9¬^¾:”6e#Ý)ÕˆbÄ$cnÕË(žS·jÒWÀýP-¨ºº§ýM6ÂÅ|dúa#‰"iês)ŸÏ¢ßº4Ú…|%’#›‹CrD"hÑ®Æã":]Ä×'u€‘HƒÃÍkѳ°¦kë|¾ˆhT«Kë<"²£’òGyþAV­Y}t¹DGM¢¤—” ›ˆèˆ,U$CÃ¥ÂâR‰eQZáM6è—æM, ©Ü°H5e#V]ø¡IŸ€GÐ'ДGB]"·Ç&œîé. ˜(3{SÏê4hµ‚mä–êÕAç«A5¤Ižzà†´yJÒ4 –&6¾©ÖÏsþÒ0IPÀìluX×|)H;ÚÏx„¹tIœ” Ý[µÝ„¦D,˜¦D²(=ËA²±RÁ ©‚”H†J $®ëñéE¬šèdÓXM\¡Ä¡²ãO—öÇ”áV?ô' 'L#fK  "Á,^ƒÅžÀ¬ }aP¨?XÃx'eAºƒ@áÉ!.R¿,ì0ĺ››¢!"ÍMYt.˜(2D9¤ÑI¤ÊUTQ¥hy•H õ¥¯¯`䧸(­MJ/ˆ!3SÓxԙŠ6_¥ÙŠhÃàþ£†×jí¬¤Ê΃ÕKülµÅå¡È˜$Z[… ¨”_kK"qMŠT¸¨ˆ#¦æ²CLBÙ!m˜$5•¯ŠkI¡ë&v©s ðPòDuF"xMàýÑ #—ίBžNï/Ðk:EåâÐùSô“Iëü‡§ñø„•ÏÇfP€¤ñп|ltÔ{FEZ":gÖgƒFq3*2f5ð|&àÿRÐãü¿Ö@êÏÿ3‰ø? ÿ‡ ÓùcàÇáúÁ~@s¢#.ð0àöçŠEL¡Q®à˜Bó=ú¿Ö@ú?‹Å„H÷`d5õcÃàÿ\šê"ý j_Py$㌸í„*ÿ‚};|ú±§ÇvÙžôx–Û€ ËrG–]+¹œÓýÈ]·,gŸô=a’g™¶¿xµÝ¹hëc—¾UcJ’çþýv·ß·.®ÍZåÜ÷vÐÄ™…§R:¿ò`—¿¶·:õ¯8Õs~»ß^é¾®UHÌšUUc|“ùr¨urgóeâaçSn¸z¯lûèvÚÛaÞ¯·tyÝ)öÓ9E5K×Mø=-ÿâ£|ïßGÃ~q+á¯|k™ÿ®t˜mõ‡N]òÓþ¼)˜päËÙɵ¾‡¦mJZ.=êýSHIíw.s.©ñfãítYXÒþ}¿™«æýòy‡üÕ3Ö¯­Z$+z,u]èÕ}¬ÙøLËvn¼]á.¼¼±ÙŸdFYeæ¶ÉYúïü Áb9ÿ0¿¼|kk^eVÙõñfý—F´½v²ð{f—l»wxÈ9X) Î.ƒºWŸ±Æá£?><žž[Ó©oûÊý’–07wxûµ×ïoy>ái§Í?¥ñC}¶Wï•o.÷Ï(óÿô£àÓÒiq§½90ÀíÃÖ¶.ÖWÞ°.!%ÓF:fÜg—ªyÏÛô{ÂÇ™ã­zó£×Ã@Ÿ×Rªÿ»)«‹ì©ÿŒk}:%1gŸÙû´Ë™Œù–ÃwzÎêsjÒà6Ÿýn·Øö‚[~Á³}7ïÝ^tä®SõŒ„TÉpY^Z¯%Á9¾ÕÛöø‡O/-vûsÖ³vrnÖ·á¥Ó­–ÈnTù¯üê›Þïª­ÒÆ^î:ëÿòlv>_s©èìÁßæ}êg¹sµç´{I[0ÒÇ?ÙûêÜ=¤'[>JÙ “ʺsÇ"e´÷¾ÿcÝ ›Xdnqa!ÇÉâC§ýŽ?êãš±sJçË#‡,ÿ8`ÓÅâ÷ £Ï;UH>É)ŸxëÊ©!–N3¦¤Zµ>ê ‹mNû;äz޽m“à!iºnÜ5Ÿ«·ª»?‰sûÙzµYFäŽÇãÿvë¾yviNºÓ.öôÊŠÌâW'&¹3­lWȯWíêXYøë輘*ÏÂǽ ‡Ö>®øJœöđ׸œýfÛÇ^^èöÇîÃ×Î{rêᮉֵgzw¬)Ü;þü¸aû\·2­m“ìRí¬«hó—ÄcèîÛñž;§‚ýãoy º¬ÚpúÛ¬ŠÏìˆÜ°Âsç/áŸYÍQkÙFžj¦†Ço (Œâ• FwL=Ô†mÂr5±¨ß©Ö†ËF÷JУ(V+‰6NÌ?* à«D…Á^µTÔõÞ€œ¢xÆTT´ž1ù|Ê·t¨0L>õ[Y P‘gØTTÀT”6¡†Í§~Ëz¡Â .Yúbò›n¡§&Šì¶ØRŸPa >0¡Â`„ÿáßbð?LøF ¤õ·eè`ë?“þ›>ú¿¨eèéÿ\“þHýŸ×2ôô“þHúç· ýÃè#“þH㿸¥èŸmÒ¿QIÿ’£Ȥc¢þÙÌ–¡dþ7õ£’þ¡£Sÿ7J é´ý“þHú‡[Œþa“þHúg5«þ9,&¦ñ߈¢ÿ0qŒ¯odP¨¯o 4*2F(óåùËdƒ‘_蜪`5ç‡Ëm8ÿÃBÛ @~Ç4ÿ1FΕ‰#*GÉéu'·Dб+1è/¾;ä7èů#?b ûÆŒ‰b‰8…qг`¸brµ­*N€^bù¢/qéTU\œEœÅ¤@1½ŠË ó™-G2„ l/çQüšá'FIgGØ d F]iC‚‚å”o'i”òMœy(°kx,°C^ qôÕ`†……\ÅôVdË  3Öò8zy•?ˆÃdÐòûÙQA!‘:-Â8ûtþ<*(Tý'0B,QÓ±°pV$!ËĈÃüçÖAä`Õ¯Ruöìøº»¶)Žóqšn¡xâ/FÁ”Ðf#F‹£ÑëÑ…œXÂAþ‘>Ø1÷a0’EM—‹ü†ˆDþ*ZzXÑ?IN™6QdA9Û¯¾];Š£Ð]gÃQ\wtyØŒLQ)¨0ˆØAQâPŸºÓöÓÑC oqÔ±{JŸ”ô 39%½_RZ•Ü?•J¤$¦¦§ôÔ'1•0(u@ÿ´¤xŠÌ™¼ ƒK|v‰›*ðà7¬95Kð;Ò=­§’²T½O¥¹Ýd:=ŠŠÇCŽEãkå"³&·ÉO¹;ö¢/ DœÀ놼ÀÛt€ßèÑ¥ñ–忯þGÙ±aÿÛøÑ*~ö_ìàÿØôJñ£ÿµÄ±ã?®Añ“ÿ±ƒÿdÓ?*Åþ±ÿgÇD¥øÉÿ؉ÿ³é•âÇÿ1ÿgÇD§øñŒÄÿÙñ_Ñ*~ôø?ûü'*ÅOþÇNüŸMÿ¨?úÇNüŸÿ•âK!vâÿlþJñ£ìÄÿÙü•âGÿ؉ÿ³ã¿¢Rüè-ãÿHü+ØüÍ@=ž"·¨°¬¤¨ ++»ògdIùJTEèÀïÞ®9þ‹ãÏèÏ\G3 ÇrvüW4Jlá¿‹$A¦hã¿Ûøï6þ»ÿnã¿Ûøï6þ»ÿnã¿Ûøï6þ»ÿnã¿Ûøï6þ»ÿnã¿ÿã¿ë{@¡á¿‹ØeóŸ‚ÿŽ(#Vš5 *M ½føÛò»µa‚"{òše§þðSÝjVvšã5<+_X#§Õ8ÝâÊAÑXÝd¬ŒC$1/rrÑÛx™£D Wà¨y×j:".´”CÃöFø†2 ç%Ð e@ìMËî]ì!t'X¾t7"a×FaBôåjˆå(Ž¡oèMˆg)ÜZã? n¦Þ„}I@d—h[<þšÀk7yü<^DþÇK˜.¼i$¨PžŠÇË/jмäEÐyy ËÕš1#Ó¹DG–Æ‹ÿ³Xi2žqV6~&š”%ðpõ)TÀ<™&UCªŒ^¥ecÕˆxx† &ŽñOó%W>dÙn”ãgEXÆmSTž*°\xä&Óä,ÑæaPCN|ŒCȇ`X”Bµyn5Ù¨ +û@°2 =üWÔ4»ŠN—,TsV5–õ>‡wÅ¥æ]!ïÃi˜§Lh¦XŸå¡‚¼“+£š ²ðZb8Xóæ¡Ê>>"ÉÀd ¼ÈÄëDƒ{´î5ÓyȺ6\6Ñ*HääˆL‘({ñ =9k Z7x8 Q2~Y0¡d†XCXÁGÖâ`$ƒÁ" \«ÙÊŽLç¡Rˆ3W²Šˆ#¦%ا¦Å+ïtI´A¼ÂVjVVÎØ¼•htFd¤;#¬¡fÊÓ©{硈7Hb^”É ²æéN ’Xù¡C”İúªê|<RÕ] ÒØ’ƒžá‚¼“<˜%Õ88u;Ó³|8§q2Nf œŒH•hï§L>#Ê­d ý$ET†T‰DîZbXsý‡Ê³ˆ60­ ËD‰<²f>ñ˜i§’œ6œÜŠj=•¯Ñwò>šwEü§ÁÂ!Uݤ!k1¨ªŸJx‡3é;‰´àcl©I‚1ƒë›úÖ¯NæUNÆï‘5VV¥›*ûDl0â†Ö¾bÁ¼âĈ²² )Š:/ 5*á r5‹÷ˆõ2+‡ÖbfóA¤}Œ&‘“Œº‰TueD‡¨ «ß|ÏpfùìƒÅ•–¹”cÊ.-u—”mJrøHk‘‚ê¿›g«n j^5v‰Æ¡yEãàgŒ,Û rroÐ á¥Á®š¦1Ñ{ÈÛnaóÆÉf“î’²<Ù5àI”–÷¨Ì°qÂãDgá{±Õzëœâ­³ê¹^ĽuÞçèP;?‡Z²rZa¦ó:вFÈûó $ n –qÒ8 l‘K‘%’ˆ§È!'ÊàI y¥,ÐÉ\ÿu&•ÕÓ B*Aö!^~B*jä¿D'\•1Iá58Ò™ _—!;"SŽì&&F´¬GÄ’C*C,2R™b9Sý‡JJ)²qɼÑë8ÞÇÁ€ªîf’Æ!žÔ›ŽáL²>N®ò34?#8¹–·«4ö«žxue?ý˜¼ˆÿ¼ŸXÚÃg¤Õ]¥(Cj:E9¦±¦±Lôr¤b¸¬ˆËÓHçAÛË¢Íi)F‚ŠŒŠ]WpÏš«{çu&€Õ]o`¤4‰µ‡ˆ™ _üO Ù,Ø}¡µURC®½ ùYÀø7O“ý×Jï;ê/8Úå÷Xé%€“UâýYžòk.Èó£]ö¦ùAГCÿnRÿdǵÎud—Àb&ÿ×hWÝ2³Ïÿ)Àôüˆá ÿ‹ìü_Q)¹¬œ‹\°Ý!Š"Ëñ²‹¦sròÄ<Ù…8Y`®õüìÙb†ÿ‹]yu£þõÍÿÈ0ÃØüÒv@ÏäŽ(žu´Ýu~ÎOÑTQÎHG—.Î>Êïä± B¥:“=õÊ™ ïJOl‹¸Ü `M¸³G;ʾ3´ïœ/“oÞznÈ™ü;,úaΨǖ$=ÖòÙ£ÃÞöQ»Ã~ãÓvI_LÎJx¶õG›X¶®~¥ÀWÎ}sü7­§·š¸fÃÖm½~+šs´±³tò•·¾þë¯'Þ]S5étŸVS¾}gΟÆM›vì‘:ú—“»ú‡I?ŽÿçOÏ~±nÏÞÙ 9 þ5nâùÉ[^ÛuûÍG>¯r­^9imÕ§ï]t%ûÆÍ.U1G_úÍSáØ|õ®ïž®tjî°§~Iª—Þµñç[N»ï³R§î¹oÑ£¯ç.ؼô‡Wök|bÎËY›nj–¹ÂU¾çOs /¿’·¸ºëJÿ†N¿ÎÜ4‘»¿ðëúï¼Òv÷Õ¬ÆCnÉûaöû¿´Å)ëw=öøùÊ}Cè‰iËÇÎ/ì•úãë9þ`ß[.]IÝ™r3»eÊôg’*¾+ØÞfëÓ³¹ic^öÔ{iâ+ –eì._|æä{÷¶í“Ü¡÷²&ìýŽcCW%u_5º¾gqÎkN;ê»G¥tù<®ãôëÕs :Yuä»-;†o´³ß›ÂÔ¦§W.n¼pË…Ïõú¬aú]Û&šðÍŽ1Y£ff_rï¿ûÊØhÌ•ióZMKG¿»gEÒ-fÔoœØÅ•øÑõï:Î?U9ëäèCå¹c—?½vt¿“õgWŽïÓ¤|}þ"jû+;žÎÿäÖî³~A¹fe.¿ò{ó“ÏÜÛþô‚ä=\YþÂ,j–#ãÖ¹õŸ}⛤CSÄ5{?íÀØFw®«wðmǪ‹Ï£±Ÿ;¦´n˜¹jàÖ{$zê‰æŸøÛÈ‹ÎlšÐö#·»6^ȽÔtöÿÌØØðç'?žyu÷šÃ·½<ÿ—'nnäH¸|`ãï§þÊ”üô\O~öòïOo›pñ™‡=[ïãΜý>kÅñÉ_Û³6k_Õ¯-V~5wåÌ>KnouC¯…s Òv-˜p|G }ü‘é3êW®Y»c_zç5Ó+Ö_ü|çljsÒ¹G¶»ê=øøá…Ï5k–9Þ}GWÞxa\j¯&7Î+i~òà¬ýÛÏþÚº(ÃÙ%Cªê´ìo+Zd\H|ûõ9-gwÛÑsÏÖŽ§šps&ÊÛ]O-ÜñÌäû“ûÕ;£¼üÙMiç*öí>òêØß/|ÿí3N?qhøK]ïázœ½åH³i§¾|.õÖ‘wW‰ËnNíÚù“§¹|uÅÙëOÍ­ìP±÷áWRžœÖüãN7ч‡å}r|ãü´=Ç–4l¾qEî©6íú%{º¶ëwõHEæÉ³w-™ðvïÁÅîUëW•¬˜3|@ò+ûÅÝÏýxtÓÇ3sîLÝ÷ñ’ÜŽ{Ÿ:Wø¹sñ¯ç¿ÖúêÌóÇ6lû´_Û¤ëo¸§ñüÜÕ}ë%®ZÛþrÒ°{ÏîÜò‹òʸ©çáæÿ8!Mß-ÌhzÚùÚ·{Ö[û ÒsáÓŒ-‹UÝÿäßÛy÷_Úüü瓹MýoÜ——ö7-ÙuxÚùwô¿iàåGgXºµhîöžÚ²±âÌÝÝάÛuüŸ—ÞÜ>žÍ³rÛ˜ø¦ýÞË/¹wizû÷në–Ÿ_Ýêþá»2+s2Ïyî(žõA×úO¾1*þ¿g\¾ÿГ“—MÙRr¼ÃKã›<Òô¶Ý·Ýz›Ô´÷€WsÝ0ußÒ%›&ž¼4¯¸I·iMš(“¿°ÍòWÓ¶½ÿÀˆÖ#¿î¾¦¨çÁK:·¾˜}WWÅ!fx~‹=Ÿ±Ã_Úû‹øßˆŠ¢7?éÐõuþ˜rט>ðÝ«ëxjÂÒ·åpèx»½—»ñÖÙÍŽu+Gõ]ïfO›>sô‘o³¿\ý}»9ó;ç­yø‚ÜÎè¡]§:f4~ò|ÛA£í^6ä§¡=&1÷¯¶,óÜÚ’7ßz}Ñw½žÜ‘ôÂí?œ·¼eÚ×+njPøË…;ÿ«Q2ýÑáNéÏ7áiÐæùõü¹¡gõÚðüt!aÜÕÛ;Rß\<4óÂ…K þüÆÇGÜó÷}“ü£É¯ü¾Á˜‘M¸ CÓZ,ŽÛŠýö—üá•‹/ìÿjAÂÞÒ|Ʀ‡ÞqÏxwð€œç¾:¸©iË_–\muºÙ²¹Ø#óJlüHyÁ+í±2–Ôkœ®ÒÇ»àÏ9ûº]žìîEåÉÂã͸‘ép¦’t[‘Q,( |Ù›¼¥w2 ¤(7Í]6̉ åLw——áï%•—õJ#_E¼ò•dHT…ˆ²q`ÍâL,,,*+&“ ˆV>òÁ(Ê`&œšéì;€l±¯öá} V{ Š<E©”r>èq•RÃȧ:2)ÈÖs0|ù®n’]¦Úë7”è·vÚc:œýô¥PB‚·¡ì×<­Ã'‰Uþ¯÷Óx¹Ô)o $g"þÞ Ô”Z~¶îp¦A+XMoP‰‰Ò&AVµÆY ‘¥8Lg¶®‚Ρ¶ßâÖ:l$êAºȹÀIH?[«u:LÐé¨ÇN$h :Z¢ükl"p ë¢6_—`A®µÎÂ_ øÌB„ã¼JÈYðå¨6j¯Öá iªH8,ÕÀ ‚á®ä|ïJúÍîÙ¥n1zÖåaàš>2\Bú÷ /–b®±¹î’¸¤´T¯ü¢Ò2&ž’â‚dÍöÚy\ÏNwNsŒ€8V¤|¿o‘«¦[Þ„Ûqþù¶‡M¸=¼=þª‚ 7\Iº=\ɺÝÒ­–¸ãzµ×V±¼Äç€ß¬8´=šx8 Ë£¼×Ä`F$w ÕkŒ„E€ß5$â7ÎÿîÊÿ\ lÇ´C’ Œ+â·Û¿Œ®1Øa ¸†ÄÀþX&`ΠǶãåÀþD&p\ìÆê×ʼ›Ÿ$^BzëÔ"LO¢° ßi^¥h-gJOjX\n¯ñISÞ_ýÔwÇ¿[1bê-í¯d:ˆƒ•]RFˆˆ¸‘ØFõóÿ¹˜Áÿ°ñ¿£R|éÏdÇýmüçh?þçcƒþ6þ{´Šý…˜¡¿ÿ•â'ÿsbƒþ6þ{´Šýsc…þ6þwtŠŸüc…þ6þwtŠÿ»b…þ6þstŠÿK±BÚ¦TŠÿÇþ»ÿ•âÇÿr¬ÐŸ¶é•âÇÿy±BÞÆŽJñ¥¿HÇýmüçh?ú£˜¡¿ÍÿQ)~ôg®5þ;¡¿`ŸÿE¥Ð_)u–•deAÄFi~Q+KÊ-.6®9þ[äƒ|éϰ,ÇÛñßÑ(1†ÿ.°”H³6þ»ÿnã¿Ûøï6þ»ÿnã¿Ûøï6þ»ÿnã¿Ûøï6þ»ÿnã¿Ûøï6þû¿3þ»¶"þ;#Q‚ ýç࿵ öÈK¤êÕ+¤j4VLaÀ[*(<âqG½{ÎÚ–s|nq±YRc>`Ö?¶O‚z?äR¿¤ÛÆ»uˆ7€T³x¦ø-å$šb8É<îrº$|‡>jÕÞgRÁxàÑ ÔR}R54Ö«f «Ã2\0ÈjvµùÚ_HÓˆ¸ázÍÀçZMgPSȈŸ«@Ü#ȱ I\Á'³$@ÎAX†¯Hæðß:º+ƒ¿Ï –bå“e€ºÆÐ&cèHzÞJ}eW-ah›ëß CcÅ'QŒ¹$ÿŸByŸAÍÏÉTµÅ‚¯×hÞP3!;¬ä}dCqb#ʈG(\0sª–W]’j3xHë‰HêsÍ nE>D’Ƙ,‚ ’±©§ „ZZîW2 +ð)f:‰´Ì¬ÄrÍr, 5U3⚨ՠ¥XsÊÿ𧾡L¦cfe2èF1…+3¤§÷±œyRÄ2^3hKÐå>‘W["= :ƒ¯Ä‘Œ¶ »X²°êM8fyrN‡ïÃù—ˆ"«Ga„ÌZžY¸'Ô,ª#ÓyÈ ,¬A…C³`5Ê"ÅÑ´y%Ê:]Ù’A‰º°ï)ŒžUDKt,‘ªªÐp•ÓóCcCÕ„. ÏpÁô)ßbI P¨ÊºšBr­FÍZÈjfjÕsV—ÛŒ 9|hÙ*N·#ªG%DM¨ŠédCäÌÜ‚*5×Èœ\=}ØÔ)kÄ%çXH¨€È¡±5ôð gZ­"t¬Wu ô@Ūžzua ÖÇõJ. Šæ%üÅÔ+¯¨^@gÔ«ÀÔ+þô+¤kD!òÊS—%Ì otd•,KìQM²„LMx(Vô¬©þc#.Çú€_’ªB[‚! Ïp¦”Ž òá@Nÿ žìuŒ Ñ\ðL‘e Æ…BÈ"LIÆnŠLõ_ØÜHâø`iÈAT”ª†¤ƒ«’^å}ªfp|Â2œIâžä°Th„®ß«լÔ"Þ縅„Š MW pœ¤À™iØXŒ@FNTöyxÁTÛ‘"À¤f)û‰Œa4CÒñ‡xeH•²d–`ÐÌõ*Ó±Õß…‰éÀÆ×ý&LÕkÂF¯ávŒƒÒê@&íÍÜ%%…E:Ÿ å mÙj ”ùmN€®” Ê ƒØ@dhÃ.'p]d8²@À—‘…B`Ìêþ!Cé? o?ËDß!³a{…Ç ¤’€¥”¥O·Ó…ØÀϘÀ|WRŧcD㉩ꇤq-G Á1ßÃ3œY5ÊòAŽGÃq(ÊÄ œ ™À„ 0Œœ!ëÇDœÌ*O Ê'’ÈgDõ'ŒÁéúQ†TIJf`Išë?TÑ]Û2¯COcÁÂé6©êPÔ¤±h è:,ÙŞÄ6§ƒ×Å¥eÿ{WWÓÖþ¥TBèçfˆ$"S³§sŽ×‹Pz 2•¡4GI¥25ë†äJ†—Jƒ©R¨Ð`¨+S®D¥’ˆê·×Ú§sv¹Ü:»ó¾þ¸ûóI­³µöÞÏ~¾Ï³žïó¬¥ëbuŒÐàtÔ1¾ ÛU½AÛô†i4†ÃA€€öÞ#ÃÉßµé ‡…Â*3A@*s ÃÄ«W9Àpá%òe+›¼&“Aûïòö¼Ly)Hv ^+P­G^%J¾ÿ2/„x£Îpᎅ\ 0ztr‡É~ˆ¢tÞyæ¨Û¶åó%m—Iê (KDx¤²^' t s êW…¡¿ö¹R0OåIƒbë¿ë²`¼C()‡vT VB‘/ ¨ÈEi\*Š °ÞÜ(ö÷‰Ò¦ (9»p‚ò[xã´01 €lfÍ&åM‚œ°cÂ(ÎæÀ¶ð7·Ýyñ8<oï`œv#`±ÿ®¿ LXG½$?PÕŠs hÄèïAðàî,)GŒ”D|LH94jÐ|åÐ@ˆÕÈqÕ ;Áko„¸ÀÌ~?õClýw]–Œù¡ŽÂÄ1¨´ T„¥˜l:¿ƒÁUPÈ qøÜˆ˜A˜ŒÙŽ!„ö …L3~G„þEVw[DRëP˜J¢ Ê¡È8ÒNX î…EþP‘vñºëf RWÀdZ&bÿ.V2Ä y‚” ¥švŒCš#Ö®) ×-ÉJÆqI™ÅÌËœ]¬ìø3³9'þq’FÓ³¿b×ô £!é­`ÀóHKEúÍ@ÏÀƒê ox<8‹ÔIr «ž1ØÂKäPC¶ ^#P­ÿNë™Xék‡“‹CO¼MZ¦ørgó¼¾ÃÙuËp¢›MËs¶[é¶Þ~ëw jËc‰J¤iS~Z5^{«F61õ1ŽR¿ÅêÛÃ1H *Ì+‚g¹LüAûï´6Ñ ÀR2`)$àSƒ: &%6ô­ É»µþ9È„¶[l3l¤V‚f›aMDhØÀ—‘ÛÑ“ Ý3œ¨v”ƒÂµ§:’ @]ªšè õ¢‘ŠB­gZ<ÑÑ—… e¡(•X£ÐÆR¼Õä,¬Ý‚rbµ±89[’e ŒuŒËD뿳¨€àtTÀÙäì› CåÊ€dD4­pú>¬Öw{=làßh›²’Ö4Û”4…4ü2Ê„hìžáDÅræƒ!ß”LºVV…k€¢[ î_%tC¾œ0*ÜÝÎ9äÍã06±† ²Íƒ ‚!TCÄëNPcÉ vD˜öˆ!0Æ8Dë¿ÓÀAw'@ˆ• '89]$Hð8xšVœNNnN–ö`ýÌŸ9ÚîT@Îqa³ÍMBЄ_&~¼`Àߤ(tËp¢ÎHÓJàß.)@ŠHå#ßüÓöÝoE¤Œ0ö?8:Œ€ú` \,„ •‹±iþ𨠮FŠ!<Èx`ñ 'LjµÙÁ…~ FOŒ"›€0…“º öØÅiŒ Ò¡«ê”qcKÈ1¢ùz}“ÀÁì›|!Ä˃ccmðÆÚ¨+`”b!Zÿ†1^»$+>Ot:ãtXøÙÞ [çuž? ˆñïS€*TS€*ÔÝ ŸÚ5EʳêŽáDγb©ìoAL ’®W•ÿÀB5H ×@z?<ưÅý>lqù°Eƒ G—‚Àí°‚´ŠX.›|„ *ŸT6­¤ˆØâÎܯ褆X:Ðd–¹%RÿNÝd·ƒ6ù<É×EIØfPKhZñèÓ*w‹õ–vV?ˤªí6jŽÂ¦@Í©›¨9›Þ Uºc8‘]#T‘ލÒ&‘.€ ¡ÁûþêHÝ4ŸBÿz-†ˆ‚Ât ŒÅá# ÍÑ!çRJå¥AG F# ;*üˆ<˜Âsľ…cë5¤@ãÙP LE¤þ;(ôõ¯pðv“â9ào‘…¥ie½Š¾us´ÿIЄ‹‚äl6ÛÔ4…k§Á/£Œ|”nNT4ÁH£Š|ë£it5|+(ÐgÌ¢Œ3¸h;Ð|  c¨M‡ FÀœ. ”Ð@hn 9µÅ14x^R3h ”¤Û”á ­ h2 Ñúï4h`@$ÐÉÕ"ƒ†¥¦ù# +ûŸ 4hIæðNi)Uü§iñßå´ÿ=h0NdÐ`·Ëio ®†e1 ƹf +Ž4H‚EÀm_0z®›MEtáoîyâšÂó úM‚ ðHø! ¡G¨´ ˜¾ñÓ60ÚyFÇHSŽ‘ó  ’G¼”5—  (• ØêïÅÖç‰æîJ"…¬©Ð(ã,.UéÀfC9Ã$RZ—m⑟p¾KÀ  ´óüäQA2)þS$‘2YßIÄþ».KÆ„‰‘s5HËpØßÕbt.t  c`æ0JÅE¹BaÁiX< dƒua~„˜³»a††0hðWŒ²»Eë_a2­­§„Éj'L¢$Œ&a²„ÂÄxü¨ÇOÙ'àšôÚ{P‡Ü:PE@Už‹Y˜¨}g$LÑúï›+°Ý¤ÒU9ò¡üBN.&^Å¥”Üö/>§ý‹Ïe" ûï<{×}²¤”  K@f•€®$Á¢@δ'ÝKSìYu†é>YP?Oe·”N°¡¬ ¬-ãÀE{PH:) -~Y±þöY2YRÄþ;lî¾bv- B$\*§†[)½ÂiT$Á¯Ž€Î Úp Çïê0”îâß}– Éd…ûï|Œ¯ûdņ¥+4½M§>†WJˆ·b…zí ÿ‰öÏêùTbëÿoeÁß½K®m›.9ÁjÓ“uö`û"jï%j˰™³àcþ^ÎlГœðÿjèÈý¯7´þçèÒ!êþïŽVx§Ç`±~´ÿ;y`,¸ÿ;9#Ïc`ÿwcÿ³ÿûã°&œcƒ¢, ÅP Ž•µ`˜5ÁcYZq1ô}}ÿâ=DÕ+›Nñcýg£dê?N¾„8› ôEXÿèÿãP3œ­3™­Ê©e¿ Ž”ÃUX*Ϋä¦NÕÔ§öI$½cMû5`×sMð®Ì&Ý+ëiÓ€£amá(çq8ÙôŽÓÄ‹Ÿ¼˜”¤¸áó:%Ý*»†>]> ¯“÷JÉGéõ¹*›GY ½AÏÁ,©I:Àqç™j›‡±Ù±‘›Ê Üm¦?ŸÓ:}jUËŸ’Í-nÙ›5ºÛ´¾ÌŸïõÒ»ùÿ ’RD´^ø’„¶_úÜ´ëhMë¥ îçî4,šþRákÅÕÀ“ÍGŸËØè_9ÍÙŸåóXÉùcÍ‘ ­W<§} nh öMû|¼¥µÁå­ó¦©7ÂO^w×ç»;‡ûx½~RvéÑÓV§C•#\GDT¨š—fºï9eR¸kÓÔâ ¬… –Ü7JËP<vi•ÇoòW?Üò¯^ÿ§¼{¬åJ›„³é— w&œH·aæ7ºf݉T#sM\ÕÔ*ýƒE~úØ'ßà‘Ë–æ[=ZzmÍÍ· z’à´6 oXA$‡œŸ=΢¹¥á‰É©Ù%óåí~k!“øÀò«½nå‚–*“ÁËBo9åm{pà\üÈÕ”9#ÍûìžÞøÛeµ:Ïá%†Ø$;ô¦ô§¬¦D¿þ9ZÑ=Í"ûZÏX²¯¯Ž!³Bn—§ÂBi©òZ*—Õ×ù…ÝÑ:²é]­û­×·^>>)é·5tuµíî§Êýv–>|8úÐlýà ³­uÞŸöcK¼é÷Þoè‘^R#®Ÿª8ÕsöâóyoŽØîöX‘6H.>ö¶äê&mÕ-g+펚¿HxÑ_",ÞNÆgïµ­ùsÆÌZy]Rå¯a³ƒî©UåþÞôòR®Ì»¸ñè•b5ÛÜ«j—r½žSgÖûÖîu® _æÃáh¿Áù¬õ:·wÁ›±;“_x)Ö/jvQyCÛâLŒ“Ìü]ÔÄÁŽ®Æf5a+k ²åûæÜ¹zÕ¨ ï¦,*H͵àt¯L•³Já‹Oì°œ³qíòe½ò ÝOÛž®76x¿"WAzǽ™ãô-åõߨVßZ[Ýb¿sõ4凌7z‰®y¢Ù¨Ï’‹v὆T|Èí©;Eâ³ëݘ§=6ìÕŸ²—RÒ4:tyJOÙ-ÙækoŸ9b2Ùèú‰f K4ôFd*˜;(žÉ ¾ž¸ñ¾â’™»‹¤eÔ-U_]¼!'áóó…CÏó¶ÆŸ`æþî ºê69#N¿¬)°z³Àr»ÄÁÚÉ ùkzç?«ðZˆ°&Ä GumUG7éåºm Sÿ´Gw„ëBé/ÿâP½sۈǫu#Pµf{£ô©zCûwxÂK¹© •IJ?œtÍåBF¥bí <ÀbÑpÉ]ɲ/nìsØ5LêA©Ø]ªÙNÒ¾‘ 3›_\±÷qóÙ7§øöú¥•7n¯:Ö¨?±Á³åʉÃÎ.ÆQ7×ù»|>cÙò^wððÀñÉ!ã§ [§1×k­RéYï"χ‡WϨ”M– ldMöÛ«Õhšf×g?;ʰè™Çæ ý掑Èz:å€_›©³©/¹ë0qÊé ;ïj» Q¬£^àw£×èà&ý݆é^nô5Ô´ZNá¥8å·^hÊÖ‰îÚëâ/6¯vHbJ¿?˜l´ãœ·nZÅv )¹‘žóü ü|KNª7ú(TûëÚ"›{ò³RŽç¦É\­ø·ßƒãC~Ý›Š7?Vô¾;ªÿ­ x=/æi¨ldÂóÃ<ËŒù<|ÜÀž*ïMЈ­¯Îû«O‰”WzO&>c&²JŲ÷Ø·¼ >Íé—†äh-¹~÷üeÐßµG7ùˆ´ïÞÅÀ´lýð(‹¬Äø«úfwb$m½úk²pH}æé%¥l9Èiþ…ÍÕRéM3Š\P3& 2ô½û¶MZ•kœ c-Svg½Z´lÌÃF ã½®´>SUµs@â³£µj6j¸-›úëoZ×kûe]/Ñß8|u@¢Âv[¢¾0qA¼zÅUÝÕÃŒ–^|wbݶž½å¿}>Y~vöh»êé[êtO,=ãà–‰*ÖÛFLà¨;–ÛÇ.ÿ|ª~š(k©\žìô-¯ÔÏ1Úî%3Ʀ:ÌW¡¹lz3!ðÇ”Åj}V|øè7Qc±¢F¶ò‡ó™É÷4´O)œ½ÀÿÖÜ?ÏÄ Œµ ‹š—étéYDÂÙ³ÎugM[y–ç*Ó#jhJ4ÖÆשë" :6'Zl}λçµeþå/sôríd¤ý¢3eNÙÌ2(¸œ$Ÿ»¥ˆù,ª,þüUù7qcõgÅZ8ÔÊÎöÍã´ò½‰– )Ëë¿ñFCò9ŸtårE󭡯µú¿¯?am'óNvÄ0Õ–2Bµ¢êXi\’áâ e ñ>g‰lÝ–¢µ[Ôj}²MµŒ)XöË£Aó{Ü-1uHxþùëiõ_îŸ ä•çmðIÝöÒôCå½|ÂÍŽ¾1£4©:‚ó¢bIÝ+J9ÇçKW§±\Êg¤`µÇbírÞ—ÄYg®Ú[²¤G¢üæm,»ì±&uŽÿž“œÉM8±ÖÂ<|@À yn•òÃÒðVåU.ýºèÎDMÓ2“K¯z×%+˜žvìÀÀÈáÏŸcc‡ 2r7øæç¹ÌòWK_d]u{N'íø:åCƒºÒž7ÏšÝ<”AÜ9fšbªº\'<ðã“ýýÓ.Žª=<«&Y¾qAõ½ÕKƒ×¿4¬³Múx£q¤ö–RAt/oÝ(oãhÿñ%^Eågß't<ûˆä;Î9÷p$jB~½ö~»ÍߪæâòªOêùJM“¤¤š£¥fÛßÚ¶áØøkù»_óFÞOU2CO2n½Á¿\–†mSÒ^ý®”B¶SJni@Ë–"^Ó» ò¯ªM'ß–ÞKu-ü°ñÃôáùŠçV'š¦ìv{¾ÑJŸUjÚ;ßÈ n½ÑËðZ Û©/çvKGp=½ÞHWz¹gÜ™âhæ!oU<×{ØC“Kë¿z:||ôç“ks5t3ç>ÚlÙ`üêDÁ°\÷ô”¤å“TêÂÇowIß2f¨§ÂøZÍs8ŸMQÏcÉ‹L½¬k”=õ&Z%/y‹¶6H½íeoÞt³51d–NnÝ®ÿ¬)ºöK’“óä…ŸËWœza¦ç6Ã!Áýü£/ÑĨ¾¾^G/¸¯&Ó»°Héºìl^ƒ¤‰ò2¤"~Áï¿9Öœ阒Ö_wmþÚº˜iý‚÷íúÕóZ©üä¢2ÿÑ… =ï˜ÏIx®¾}ò×ÃÃ9,eyû/LÂkæÙ…x ñÍÏÚ²±xfž“{ÜbïÊЄZÞYF5ZÙš%½ÓÞ¸ïJ9zßééÃ!!×Êb9ã½N%½gåTZ¾Š'S¬lY7s´ýñ3w•CöÚžŸ”³n@ÖÌq±G³c-â²ú§ý+£6Êö“\kMZæÒ¨Š^ÒŠ‘…i½¢M«÷ÜH®ÞóÄÀÉl¾ö€=«¦•„{VŦTU%j¼©šQ08ÒÛUâÌJÙ……f¿Œú¸)þSÏ33^ØnÈ|*Ë£Ådw}‘÷óÄýïú5…ÎÂ+÷¼Rr&'»èȬGòå›YË£œï¦Oò·Ýœúed™A¡µ“ßw%ÿþ.Á÷{Êmû úÂ&ž.Öš è¥9ÏÚÊÞb¦óÿ³÷,0’WYo£È’…”GqrÜžì»é®þŸ/ëÜgÏ^aûŽÛ³ƒ³wœzgzwç<;½×3s·{ëå$$0Š1v$àŒ?X@À†Bˆ ¶c'°c büË™HbŽÛűxïUÿgwv§{f¼R¦µw=õéªWõê½zU¯ê½EFþèßÓG¥Ò!rÍdÈå»õ&SQl†èÀy 9è{åI·9U‘›•»‹Møn|±yÅ$}ÊeñÉ~>ç @Æ.í®×½fcʦEdRD²ÂÅKT¦h⥋—!^¦xYâE¥-í…:ÊÓÃj‚6«Q›5šQ«¬ôóÕJƒMI¢Š£ Jh˜JâS%Ý]Åi:5o6,BÍTefº7ê ©tààÕL 2Ú™ŒÔ!RpNTE;³Ü&×lèÑðŒ(…ðnøîÚC]¹O–J“ø vp4”N†F Ö„‰ãÉ?[˜[í Q'¬ë t‚ͽáM(qlYéÅ:>ìÖ„wD'ÿfv`'¸sw¬cí}]@ÔŽ#Å@ܺ8 Äõõ𲶘uÁÈ2Ž4:gÈŽBçþØ€aŠuÑ;"GA¾8›hZG`6rÙ}]hŒÎCEeªÓT¼+Òšõאַ K–e`ázÍ€v¦Ÿu/º­ ŠÕÒµŽÎÝÒñ†Ìº`tä´†¸S Ø4;‚ÑñÌýz`ðs=dÒ]¬´ÕÛþ­Šþ²qh3‡ä‘CEp6΄)9g·Ã§ÉF;|8«gãÔUú•çÙ8¼‡œ3õö|fòÛf n¥›-ÕÓ !rr&Œ’þXi¢>ã1!–&ö±©Ñ§ŸùôÜé_yø[7ì~î–›ÿêÎ#£ÛV‰:*Ñέã7iˆè²¥ U·?²OFÿ£–úPhíkëeÒÿêšb²©ž'+Ü4õóØÆ5ÌžqýOÿÚ¦Á¿1Äÿ ž4þUgsà_…©pˆÿA<ú×7þþ‡øÈ“¡ÿéÍU†lCüàÉп±Yð/ñ?'CÿåÍ‚]âO†þÍÍ‚yˆÿ<ü[›ÿ|ˆÿA<þ_Ù,ø×‡øÈ“Á¿»ið¯ñ?ˆ'ÃÿíÍ‚yˆÿ<úŸÙ,ø×µ!þñ¤ñoÉ›ÿÜ4‡ô?'ƒeÓàHÿy2øç›ÿCýï@ž þ7þ¨ÿÈ“ÁÿæÑÿõy2øß$úß¡þgPOÿÚ¦9ÿ1ÔÿæÉàóèÿ‡úŸ<þÿNêÿÉþ‡¦ å¿A>møÏ\zJ\f‰¿¸ ]õ"xmû/º!«<Îushÿe Ï–œÜ¾»âM»ÛùYÚ²%¸›²“e/§t¼›² ¾Ü_‰{)âZ šŒÃk);ٱ͸Qlõ æßãµê•j}v·¸“©:þ™è¨JåÂðÜ^o~/©Jh²ó£±¾ƒ¾Wóf¥Ò>¯¹-øAå”_Å‘ÂHaÖO*5Üfká*§Y­+lY"w¥ñzÙÃZ¯sËÐLÆuƒ9¾ï,Q,“*KÒÄäQB˜ÄdøHg³.D6]ÿ¤Sc ­è·$¥‹«´ÈDi÷xR ä”[M7Šáèɤê—[ó35w1ŠÖ ºRu}·QmD‘2DÎúØ+aŒ1>TE¨ѬÖ*q“•ö–ÝJµVsÂ8ÀO¸-·ƒ¡@qãY0c<†`L¤ËƒfO¬R3ÑV´u"Už 1×f³Á0)]ŸªÄ„JðVT=ÊÅϺþ¼S¯L×¢5h­“úPƒÖ:íÐiP­“­VƒJœøKh»“‚U°œ$ 4¢œép@pS è‚Û‚îfAСR7U)ŒÃR5]€Y]¥<¦ÚV´³š*Ï€*eßsšQ @\O $@óRuPŽ×^§ xÙ: h¯—®Úà¥j0 ¯QssQ |ÕJã hµ×i(­l&´¡•ªÓ„:—ÒåA-…2&I[€×5$`ĘÂÊsŽï”Ñ–P90˜?ên³-CiâÁ2ñßLµ^™Á ý¨ ‹Z Ë£aöe(rº‹¬´b«»üˆ­,³oþ­°êŒ[k¸Ñ7+lÆóZ-ŠˆX[–‹g žrËGûÚ…´jÝE¥ÊX:\wÛy@=,ѶDÚDÓ©UËk$îñj•Ik|ÝÑ\;eûéZõDËícÕºÓÉk²×kù€ýµâ׬Ê^m±•ª3ëÕZ#˜ó¼Èp°ú&ò²T̤Räâ ¾´¹Æ´%Ë,wÈCãz½Luo!ȲEø—„´D|m³å‘-¬ÊŽ3 5¤‘’ø‘m¥ãÉ@5,¡‘hxa[).ø\a³MÓ#dIÞ#1åØÄI!ï°f›!4zdt#W±LV>ÙÁÑKƒøã™ø#ÛDVXÁ9 EDfT5@Q)¶C‰)5k%ÄfÅwN1àóu5gÚ­Áìæy~,F©M/œ2 ««xs>H%#Ô mÛÂÄPt*ÇFBïQZ¢71)ù㈰'E¼vð#P ’áXÒ£Ìü¨©_FF’\A ?§>Œºp%&Þâ‚_§@ Ë =÷_ Þ‹ ¼o½„ÿCAP,;jð3ª’,,ÁjXáFÌST!¨z6•)6ÖB§[«Uî1²þ }Pò—’ç/&C©¤dʼ}¶âM„`ü Æ",²%Öôz×ýÒ µ®KÃo—£$èøeEnX@PaAI5°!ž¢Ó(ùˆø¢æ,¹>oÃ=!LA¯STÀH ²2•˶³ Ì…€.z0Ôæšð‘X™€_°ÝaÁŸhÉ€‘ XQਔÄ0–‚&ÌB’€-—æEñ3ì[è[~:JI—ePX£5Í¢ç½ ®¥§æ9Ê .‡ì)f¤!›[ ›àŸÙ¤$ÛL§¥ðåÕƒ6Åð¡IRO„¦ cƒFßüRka!ÕVˆªy§RQQaR­™ŠEÌB$63®2¢Å(¯Š>°øŸÀ½XõBÑ$.ëÑÌÎj’MÈ…=ÿù*ëµ*¼€íÁúÌ÷NÈVDma¬`0zÈ!瘣-ß ý€2˜ÐAøŸ1D̃'·ÓšÁw›Ø_^sšÐœyj_µÑÄI×—Já×§ Ñ¥Yk…-ãV àQr)!21>ZÍHâÀÙºk×VKZ¶ull+k83.óê»Ê= \ØOVË(&Õœúl ȯF qÝ,•°²¬DUpÀZ°|‰ ݵkÌHu6:%Þ!`™lcckd#,  ”‰M ªüNïøïa† @×›dhe';èùh£)¼8HbψœÚ& YzXh(EI¢È˜Û þ ŽR‘C“·U<™Æt&)Ã’K–pÈ…žëÖw»ºcØNTCŸhæ,rü£hœ‚Á¼BÁØm·’ ¬ê0¶³ÚâUupºa1®GîÇcҸ繥//,tçN:p« o±]z¬O¦nØ£ìê¾§WÁ¸¼ÃÔì.Ýs´fFY¸!‚AgSÐŽƒJ*ØëYPz[]N7Áœ›äA'Bú ÎIêµ Ë9¼‡ŽhŠ:I!ì0(GU9SÐǯl3Å´R>xË ½ Zæƒß=QZf_ÕP¶ƒ(ª ‘HhÕä,ÃNƒúJ^hÏLч>œÔv êq3ëaªk’WOªËK^ªÌ4-f»3åz³FÔ•á~Inš›°VG[nÂRl›c+/]",ÕL–IN±Q%„F¹"(÷•°°ŽØ¡1áK³cîÈ ¢„•¯üÖê>¸z6o¡ïÊÈ™Go»v ;ú„SM±’Á\óV/ªË=oäð=$¬VÖ•Œcû`Ê §±¢óVQjYò™U6™¢ª V[D^Ø©y š¨€¬ó—­”oûþÌ[XG<ü kJ<¯ mÛµ™qßÊß(yéý$/Y]Âÿ%‚‘/uá³: j©`òêMu9ÉË€¥7#<ÎÖªÓ1qe¤þ$µ:º ).§H H ¢ ð]&7ÚI9ݦ·-Éq;NG;êŒQK¬¢ckXêb8ò‡¬©¤FCµ¨úDã¹ÉtC1I›>zñ‚¡É©òÑ,éÝúrô_‰pÚ}ö_‰CÃŽýK"Â’ƒ…üWæ+£$½ºGìž‘´Lì7r±Ì)ÂŽA=bf}m÷’!é^T——¤5˜b´HI2:é\¹P%š6v˜Ùõ~QI´¨sæˆä^Ù2W ~ ]4UÓ5Þ…©è’s¤kË Ix—Q‚z“Õà-'Òqšñ Ô"[°b¯³T3=GgêDó ÷À×™¶¢!O@ñ(/ÇHEÐ@é ׉ZÞg/©TWìTxyr˜i6AT„âs•¿QŠ7¥)˜À&FÌ90b|Ã>*1™Áf¤¡q»Ë¸cÉÈt¯°4ÍÐæµøOÈÖyÛYK¿›RgccXPô5šÈ–J»¯¹&ܑλÉv[Ø– Û´ ôSØÂ ¨¦ƒ™M?«ë0>Qe…D¸ê–"ôlFϵ—H;OAC+‘Ì^¡Lî/`nÓá­ÓÑ6®õw&uD.p Ï”ª™És–¿Qº¶t­Á:¥Yß -ä¦k­T)«mtÝjVkƒ#ì°1!?”唤ŽÁX Ò‚ç'ìÞT×a€ê0%…ÿac×ö‚²WK-@ÞVOÖæ‘tÄqÆ`oâNˆ°ÜÔúJÞ¢Ž˜aۢʑ”ª ïœåo”¼9Aß:îÃ#–-Üçùé›—*ª ïÎØa+‚ÓqÅÁ ‹(hÆAÙNsvoªëDØ@cŠn·vw“uïæd2E—ÿi•)È78)H½(xSV¼L€ì*t#°KÎÃå@baBŸÂR—¸;‡ëÅŠ—÷8éãRCÃ%¾„°Ì¾rª#š” 톒d¶˜Ø·ò7ÌxjÖ×醅ý§Bÿá z%É‚Ã+ƒœóES¢IX£`4 kÔÀ¨õd0לߋê:Îùœ®§´±† gsñ‡Œê?HH©¼r2ŽÂ*dÕLïÚ¤ýà ¤+f º˜ƒ‹}EÜ7Lì+Ò*ÀVi{ñ‚.iT¹¿š0ªCáñt®Ó ¡h:×i²ˆ¸«ü 3†är@0^™ú Õù¹ƒYª¸•W*ÅÂ…K)(ƒáR ‚<îKÌœæ`½©®Ã(E]ê¡:êÁ² ËÃC¹˜GOÖ ©ƒöA,’¬8Gé¤ Eï+ñ£ä‡Ê³„4JC(ãóÎò7LüvrO3˜‰§0,fØ X×)`ÿ7øDC¢ 7 CÑ~µ.ÚK1¡<›{…«ê´±§k¸ý¥õd>j¶ «ì5Ãú€ã7ªêàŸP5$DCì£*Pp¼†H¤[r¼†´úЧ#gPdN‡°8VA$²úË+¨ŠhчãÁŠÎRZF‘§ðr ¾úò°g§eÔøÊ7ÑmkttEGçÐÑÉ5ÊuN¦XE¹OÈ(,ž°½¹c®ï{Ùu~F8ïÝÒ~ Üåžd‰lLtl¶"ð„þÎÂE?C/—(ëÀò²Ï§Ðp€Ç°©,Z"cR¡h]½a½Z¯]Ý‘¯ 4ÚmÑu¡³ÅÕ(×ÍÄ¡ £CjÜS…IöVûËó ôRnDò‹8Ku¤A«¿"l/gù]£ª¨P¥Æ¨Âc=x$U7„w˜ ðoñ;‰ÖbˆÊäžoA*Äó-¸‰FÚm½¿´fà†žíL —ÙÔ) !¸œåwÊ¢«AuF •@m„Jz[¤Á Q¡¡¯“çhxãQ&ÜÚPû¼%a%5SBQçÃóê¨b)²%‘«ü®QUx_ZÒ™ì¸i›ãí…`ß9*®À¢t¢qU©ÙÉ•:Š5FÉNǽn3VFÈb›8êk‹@~\æ,¿{\Ý*t§¥éN_›î,™x¿†GŽ€uâµ n[ýß ”•ÔVœèKq±àV`÷åoø`@¯Ò}ÇËb gAhѳÏg¯°KN ñÒ\@°ö¾•ß5*Š âTB|FLê¨ùA–M2¢‘9«‚x‹lÀ†tUí»f ;K1âÓ˜éó–$âÒ¬å,ãúö^‘ i–*@ܽ@á.˜eHLÌF(Ýâ]:׫0›¤<éó!f’¨õô°—c!”,r–ß=®ŠÒ•8Š«ET$˜ƒäj v»ÏW°ÄÈå©qßSÈó•¿qÅS¯èϵã®x¸VšÀõ:ªÅp»B¨]â™_UÅé•N)pÚÃM®“5Y̲Wɲ]>Pc‰]§o4qù@.$ÒqšS9¬¯ypù@µè’Cg ]`HÒ¥¦¦#«È}¡œåw?ŠÒe¨r‹4p°0Æí]Ü•¢·Fïh,w¡~Iâ×’¸VHGM¼Xµºî3.©Žô|ÿ¤Tµ.ó•ß=.‹õ õ¥!.iSOXØt¹@ÅË;}>¶3y|Ä^ ¶q"HO¼ˆ™³üîqQX=“%,Üq2T²hŠªoƒÈýÝÖÀÎR⻦i*9¹È¹Ì|Åo\ÕÚ»½D‹Y©ÍÔÀ†ÙPFLÜM5`(0‡œÓ!=šÓym."§øKâZŠ*.àä_Ý—ß=¢z°ýDàShû/®ãî’*ä ”¯R»K4¡ ©‰z÷çiG·R»?ñbˆö·ô"ûó9Ë_W6)´·&E)ÂzÒaß©¢*aDKØ^B«ÜQt`”[Á’¤øÛñû¥wÚ2ùðÄ“Ëþÿ|¥+× íÿãþ?€‡éÜDûÿšn íÿâqL[á¶^®˜åŠjÙ.ð!}†Ïز*ÏÓ•Ê; ßðéï“‹þ*3ÝÔÑ™þ w¹Íÿ‡jéÏ–ƒûöoWv¨Ò–Ç^¾õ$< äM—ví*]%ìd‚PÕöWkhõ¾´ÇÊ>n*îØÊ'®3/-Þõ™ëŸ¨Ÿ{ôÂ^¿äþ§.ýÔ÷ï|á?yäÜÍç]ÿáÞqþoT.}î]¾ìÄ…o¾1ùÒaýñϽï=[Þÿ·s§¼¹rêîÉo+^rùηž{ãUçÍWî­ÞøÆKóÜ«¯ñ+·^ük/>zÛŸ^´ò÷ù™Ëν‡¿ý3O\þï>sù½ÉWžÿo_wæÅ ßzî™W·ž¼e×_Lÿûþú}7—/ÚûµÿøÇ¿ûÞë<¶÷Áûûɳ{ï_üÙožùàŽ¯?rÓÞ­#×ÜõÀeGN?ö'Ëÿ÷Ñÿ½å«go>æ~ï½go½ÿå‡ßºñ’{¼¶´õžO»ÿõÆ]þås7^þÖ3ož8ÿÙïøÄEŸŸºûÙ£Wûi·Üúnë‡O?óÇ×ßs탻àCO)ÿrß/>þ?Ú=œýäÖ·ïÛú€ÿµ{§_Zúæ™'o:ñ±?×/~èÜuûõ§?±rï/N=þìÙ¿ð×S?þ…›vêÜûþðªÅÒœô›üŽ;îþoëÍßÿs¿;û#Ož÷û‡/yú³÷üòø¥?šzñë{¾üÚ¿~ç†G߬Ÿ}êúöÜö‘'&¿uìô»¦/zïÃÒçþóÛ×=úÂõØÅ³·ýÔW~°÷KÇ?óïÏ´ñ—¯ÿúw—?0ºç#ÒÇÿLúéçßw×Ëæ'oìù¹‹ç~ëé ,ñÄìO|÷¡§¶Í}ðο¥ñìÏ?=þYõó¯˜ÛæÎѰOÏÐ>;{9Ü|²cthâÙêHÌfÒù%dÈ$»)v Í™ÆÎz™Fßn¾ð©¿Âú Zz·ë{λ@};à𺨥ÏùjäºC'SÆüg!óü… ¥D•A:oK¹XÉêÈìrphMúë—\ðú¥×{¯žI™9f³ÚÀuÚ&êçÏ $¡Û7¸=L!5Eo60޶YáÓ¸M©Ìì`CA¯„ëZ³Ò·Õd—(o\Ls^÷Ì ÊŸÊiú~~JÈ'-xòèOçæ—†Mã¼ Ûð€Nж{´ž:ÄõU˜wúªWÛý ^lA’ÇÒ©Þ]eqÜÊÂìú¼ÎXóSOŸîµüƒ£©|ÇÌÃ(¢x;û]˜‘®šGµâîWq÷Âýœî÷TóP~ w¼)×êC¡×ó­K6òª¸¯ÔÍO.mUÿP;µ$¿.K+X󨟺¢'÷üU¥˜*ÅYá§úÚWõ>2»k=ÇèÆ5/còÑÐD7^X7ÅïÙ§J]ï­¹µ@yüxÝá3›¯4Æÿ:¬ÁthÕÙ_ǬàLj0B!Ûˆ««—©™W]–º/<\mæðî1½oƽ¿rÞv­GyŸÃ ¯ZÑ¿^ÇÚ~KeiIðØ=“Wm-Q®WÝÒǾ ïè)çô_ÿ°v‹{ÜՓânÿe>§âeáÍiƒ]Œ¼¹«œžì2çÇi Ó¬<öÓF£Tny ?É`i~È“w%yÎ '`Û·ÜÞüCøˆÊŠìô+ÞxæMÓœ’ù¿­ÇsVlHª7)z“¢Ù0ìoÍ´ÌŸõþj.28Q{âñzËŒª¬éL¾ÑØ÷oS›(OlbF&Ì\ÒàW¦šk£BîÝ",uüügƒ,&½=MšÒ×¶­©ºŽ)y5+“ƒóÔÆÔ.¦"=’J¯Úò.ÅG>Ž¿íÄ-[´ww^ú5ž‡öÇÓÈø±…‡c1<ºêD‹ü—œ’m½9ñ–+üã(em¨ÍX;rû²èA2ÖÆ>íwâØö¤›Ï|ÒÏŸY¾üSÁ(g†ãŸyùŽY« )éo¼ôºM[“ºÂƒ¢Ñ‡}…¹-}¢¦#½H4&ß¹³Ï·Û±Š.Ve+_5y^˜ýrú³Ÿ^„Þƒ¾ªôûYcyŠ¹Ç£ÉŒ«o^âíó,Âì÷ª×<Ç}Ù‚ç¿T1V ¨[²s6wÒ¤[é¿;4%_‹zöÛr··5#JÞ$üœÝcèÔð>õñ­\™C¨¥k×hwr½oPßé ?'¤þ1"Ô58ì!ÿP°»µ–¾«Ñ›•?˜óbîdÏ7,ÞMQ-ÎqÙ¦¿öÆŠí#K¶ò­ Ó°¼k–nž“ú}êV²{Ý5žW¨uàÿM…)ÔXhÊÅ1ÄZÌì`?¬rP¬y\¾›©ï D’¢F»¨Pì ä3‰Š§‚4À;Úž4 À3™éïënÏ t¢àʉ2›·"ÎlEàt{ø(‚ ™È¨0©àÚÅÄÇÇ70À‰ #ªà‚.4ÁEP*lçB™‚gÏH¨(aƒè- "Á‘`“HK>7€äl§âBŒ3 „G‘ÖïOâèæå»H”½MQX›w×ÒLŠíLkbl,LÈn“¶VExŠX \Ë€.]¢34BŠ þÜ»ÂÂQ¡Øƒ´à ËÀÓ2-Uïö«uA©T¡“€¢ÀÚ­Kð;¾Y¤ÝÊ · Áñyz»•ilà›µ µW °Æ \¦'uÑoÕ¢ýÃÍ߬ ½½ª¨ Â].¤Ýªtð8å7+ÔV>´þt Žtl»ýå›G¼¾Y‚¹e‡Á¡gG¹LÂ]– «õ]–ø¦©[È1$½ Y N\2ˆBÄϾ\¼qƒÜyþd3û™¤é‹}Üýù~$ÖŠ7RBò}}¦âR€<Õ€†›ìT‰0è î[ûr¿vKÈ&InK&éÜ.›¤ó8üQ“ ÀéGv0J: (%Ç.±@/yú¸–·¸ÂŸç¡F“JË‚".ßQ”Ž’‹þ¹mãcÛ8  ?‹câ…{ð #`ÅÜv¾x™ yyø’ÓeÆT’9)½—Fùƒ·•.ÍÏF¾xœûzÜç1.*põÀÍ?vÃØò]‡å×ÎúŸ;.>ü}½\]¹|\ðÄ—ˆ|J__ÿc0L¼þGg‚õ:.äëßã÷_Æÿˆg¶äü¿rþ_9ÿ¯œÿWÎÿ+çÿ•óÿÊùåü¿rþ_9ÿ¯œÿWÎÿ+çÿ•óÿ¶º%çÿ•óÿþãÿmYêÿ/Úÿþ_*I|f Ác´ù!fKˆø¿Ü¿ÒÓ.ï/*&ýaù‰–šE+ÍÀôkâ'&ˆ%Rî}ÎÀÿ´Á“ûO¦ä¿(›E@Vdâ€‡ÄG³@Ê‚8~Nú¢$¥‚¢2‰2e‚’©%Ž :Bàf£Á±ÎÅHà8 ¨S$ÀéD36ÀSvLÈcŠçˆ2˜$Š?‚×Åpé†P¼±˜lÏ?¡,Œ$¦b€‚øt‹Mj‡G@6™wœ˜Ü /SÙø;§C>¨ÿ$¢VˆŽ_B Áš¤‰ƒ”¹µKŠk½ðŸ!ÌÏDþ¿Eò =)1œòD® â… !ezú—ÊhÕa¿UÜC€ •*ÕQlÉòïè€e·‚YÜ×B,$©@ÖÙ_Ú·þŽèêLœ@„Z0U™ i’Y]Ú¢ÚEUg´£œu­N&Å–aÁ(A¹eƒ˜¬Á€Éöø>,BŒïŒÁEîI$Iæžk»J‡‚³Š˜Ü’JC"f”ž p°@ƒàÞp¥Å;ŠMƒÚKÆXƒxlQaaˆ: 6ÔùÌ;NçN ·oa@Õ¡KAnƒR¸,*A¼‚eUWWN‡ï;ªE¢æˆÞhÒÂ)#j¤B#HEpÓ%ŵóq2Cís‚øv/·SüÐ|¥±ÚÒ˵‘Öf®Dj½«Èçš%A€9û:à«eÐZóÖÊô–!Æ¥  Šu*Ô[¥á¯”0ÿÿ&j ² à" "ƒ ä óo@ôÄÆ|…‰ºKŠ“tù€cÈdº˜\žÞe˜^€)ž’8p±;[ }àˆ¢ðۀ早,ˆ›¿?x6ƒEƒL(@¥l/$¥–éÌÊ”Eà £‰­ Á]i°‹$Ì_*hÄÇ…+!¥$‡Âå5ð|ùÁßqf6D4ÕÑÑV4 (^¡‰¥b•ìšâÚ›Yá÷X%ïµSVÌ—xaöt©Ô€pìV„ç ¿pã ‚÷(h:µ5 ’ÀR|¥Á#H2[éœzQa§‹)œ®TvŽ„ùwX‘î*SG¤8оv&š:(“ YwP\³ÅëE(n€³Q<–I»Z 2–Ç,pȉhŒ°±1‚BY:ϼ£„É}! ƒÄd¢ÒY:L —Š$±×÷dëµB4u1[Y0(61`b© œ®)®=O –|ÁÀñê$1_›ý»Î ]F—¡Rƒ‘Ld…A”É\ 'MÆ£–!ÞIa Šu¼+Õ€•,‰¹1ˆw>ŠJ§>¡ø ¥Qûóܸ]9Z‘oîÐm$‹š&|Ê$j80(Vi`âo(T_®J×'¡í„ÁãÌbeKÐp€‹!ˆ ¼’d´Ëð(EÒM$û[)5f1 ͂˔-ÐPD&ìC‘ø˜Œ¯‹w™åßá¡ÜaI0j+¥ Ã+N˜›`P<ÁÄœ ¿¼øÐ5ÅI<€Z­ƒ‘¹|_áÙj%Oš%ñÐùr¿urèÐCGd²„W6Sæ³   –øÓfg)Á]ifA óï½L‡àĿ؇„Ä^; ¥TîBÒ%ÅœCpr àùuJ‘{—pòaŠìwɇ´f H½&Î8¸gý.d § û©t⌠î&›L5i¹wšˆ¶î@†°éŸw ®™Mixc@_=Ùi(ä‘ QK£ÁOJ#M¢ü¿;Õ'ì*1ãì*Àº 852˜­Xœàʆ VÆX‚±†ØbÀ(0ApY¸‘É–í"& ”h1p½`“Šà‹7©$Ú­(ÿ“§ÉÖ/™Ýš‰ÝÊÀA±™ wp×àk¾É]QœÄþÉX+#Wp$­’\©—«ºŒžU0üÄÛ,ÀŠÁƒP>€+‹ ¯²ž®1=*ì1 1¼‹J;cI‡=»Jë~yb¥@1' üCâxüÈXбˆ<)pb',ìâ!©D˜™wº¤uÙ:F¶ð¢áo´¸ðLXTTö„=`õ…À¨#t¹¾€Ì”É;AÂüåì"òŸ„ø_#iÿ‹*æÿÀ¥9B§üü9þ×÷ø¹¹±w6E§SݦGÃ8,•ë΢²¹ìß®Ÿü'ÛŸdã¿s ßÿL&³-þ Ãäãÿ»üºˆÿÃÁÒ·bšÚÙ7ó^“G%Öy6.ÕŸ™H¾>…s/*Áoä¹nãø/û|Zù4c¬6¢£ÝsýÕuWý— ~¹Ê»èâÉõ‚³gý«ý›2'U‡|jðý»ÆÓTëPÄ&ÿüáI“©AQ‡æ¨”>ðô›{H;>ùîÆyoæø;]ÚLÊZçÙÿnÁåuv·Œ®_f?øL Ùik-Oá£ISŸ þÜ“l– Jo,æP‚·5—‡0rt3ôoÍÏŒb\üti6ùõñÆÒ˜Bε?§±kÖ-Ô#Æ98,·ÜY±ñC,w‰ær_U3×n¯b—ýÏåÛ±{&é2.Ï]|@uÊŸßSÇ2÷¬å$$®Z£|5—öhõt­RZžÒH0ÃÉ GÍòÚ¡ìúxìùü“±ÈÚ§ ìÕÊCs ¼5Ù\ÍG—Gô\3h¢Â¥Êî3'8¤ ;/ÙÈR}ÞßëŽ>2Nª;Îh^ýªx^q©÷}[ƒÒGÍ÷ô¼ðqC¬mïAû ´~sgRiîíó,…^ 7ÕöÛ#g#œ ž;kŸ Ê®N_ãÙ?ÞDÝ4æÄ„Ëï,oæi6θï´yv]q敦+° C£}ZYçUûKó=;=³~ÿDï¾c¼KÃ?ë“ÿaïic$)®#Nd´Mdˆe²À)¸3·3Óó=Ëåä½½=nâûXïîqÆ»§uïtÍlßõt==ûÁd±Aà?ȆÈANq!ò‰íüˆŒíXƉc'QbLjˆ8Dv¢Ƕ°òªú³ª?föö®i%ýt7ÛõÑェ÷êÕ«×ÝUÏÕO®L çV>?øàßù™rOÿúC‡í§Þ2ó½?»îëÞyà‘rý¯¾xøÛèw~ù/¾¹°÷7¯ºü+g¿ð•Oÿ wýÆÕ÷o=ýrý[÷^öÅ?øêãŸzß3Wkçžûö‡^œ~úúW<ñ¾~îªõw¼cqÿž}¯¾MK¯Í£ß~×Õßxé½o¿bøé«ÞòüuWž)üÂ÷_»·yÿwKþZýºÃ¿uÍ5ؾ;wóÿÜó3þäwýÖ«ßvî¾+žýüï¸ïþ™áßËÂÞú±—ë/^{çGŸ¿ûK__{òã{êøúÏûž¼ú¥Ïý÷>òØT”áKO=öúÖÓÓ"¿õ¥ï³ÿyâÊÿÄbí]ùìÊ—¿ñÉo>üPCùÕwßÒ{á…Ëg_ðíOÎ*÷=ø£öß_øó/_³ôÑ©¯ zž}í7ŒÇ¾ê³¯=’¿òÙï*Ëݽ¯v×OîþèOßxí+ꉒ>Ðk?yí㟸þ/uW@¿òÚë¥å{xï'î}âòÏ”ÿºrã-?÷èOžõm7<ñ/÷\ö‘+îùÎÏ÷¼qÍ+ÚW?þ÷s¯Öÿë¦÷KÿýÐ#O=Ý4ž:ýÌÏþÛm7Ÿ_}èsÏlå~ô½ÿ뇴Çw>òà˜‰+;88ÁÞn#;8ᜠZ'×Zoó.Ýù±G&H<ùè¢FbU£¶äýøvw§%Ð×|E²?9^9þœ‚±¾SÛå± Îs&ú–züá #^ëßÝ¡ äÑ#=Ϙ¾Éß/qoµîy`Ýa½cß¡¯éýß?A#ÏG Ei9A¬‡œ?Pžgë·À9 b¥83!ì|P•@=±^ œIV'pîØ(ÏB(”ƒg5Ožù¼’à™0<«¡ÄWƒtkåÚnÎGx?:|ô¿ÿG¿íâÒÖæŸzc0‡?ÖÅ—(nÊ®ÿË­üÅ&p™µþ¯U*Ññ¿‚ÿ+ÔJ—`â«/C;:døBáÿùúŸ‹ÿÔÒ"ÿB&ÿD€“=5ò/eòO8û/§Eþ•Lþ‰'œù—3ù'œýo¤Eþ…Lþ‰7þÛi‘?TÏ䟰òoÒ!ÿb­–ÿD€“¿˜ùgã?àä_Lü«™ü“Nþ¥ÔÈ¿–É? àä_N‡üK$+“ÀÉ¿’ù‹™ü“Vþ)-ò¯dòO8ù¯¦FþÙóŸD€³ÿÕ´È?{þ— pã?=Ïÿ³ç?‰7þÓóü?“"Àÿô<ÿÍ⿉7þÓóþG&ÿD€ÿéyþŸÅÿnü§çù&ÿD€ÿéyþŸ=ÿIXùWÓÿËÖÿ‰'ÿôÄÿ²õ_"ÀÉ?=ñŸÌÿO8ù§gýŸù‰'ÿô¬ÿ2ÿ/àäŸÿ?{ÿ'`å_KÿŸù‰'ÿôøÿ™ÿ—pòOÿŸù‰'ÿôøÿ™ÿ—pòOÿŸù‰'ÿÔøÿÕìýïD€ûþ7=þæÿ%œüÓãÿgþ_"ÀÉ?=þæÿ%œüÓãÿgþ_"ÀÉ?5þæÿ%œüÓãÿgß%Üûoºÿ/ÖÄÌÿOò÷6 n+*¶7•nõz9¨s4ˆ€cÎÿ(‰ÅŠ{þG¹ùÅBÌ@vþG°¼¶ÕÃtA›Ã(Ùo…å>n‘=ŽIå•åI¨Eþzä/ÔÌAEtÒh·±µÞ–Ui«Ãºµ½¬h2Þ¤ôI1-µQ¾'žâö¶°-,®aDò9œf ã>’4$­öMCj™¨¥Jý>jëêIF_Ñ:È„úýn)’Š’%SšZ†RYý¡*Úù!½ï$ÞXPº•ìÒL7/ÛCÈ\žt³—'IÁò$)Ê!A.›&Z¾Ñæí9¸Ç90rÏ¡=Û”L°J»¥™jl¦ôM9¶JGUVc+,HË“ÇzJtåÖšd|pù‡Ûѽ¾æUº SQG"fõ5R†nø„¦]EÆ= j£µ¶PÇzkTıÊ2µLOò¶•ÎÀÀÛKÇÎ vN k&6ˆ¾bi¯wu Ë6/¹Òê/Ñÿ~©X©÷̳CYÊËåb¤J[%B`ÑÃN6qhÈr°ê «#Ø$ûHËè¶6‡Ì´)¶ÝW„Ch‹bâî’µ ùÔY²÷8:ƒÍ;±JD·¼fàö° -2õ)Ê6hÑ{¨ÍYçCߜӰ¹ME?²h¢hÓ2s›µúÔÙBNQ•ìÇ>u–lÇî«·¸¦ôQÏÐAà]—²BîêÀ±(íÜ5½‡áB2‘b¢ EUÑ*FÀo{ @Pi.;uzMŸ¼™žŸŸ>¹xû-Pº Jñ:¶ð(ÝžªÚ É0$ÍÜBz˜Ÿ9õ§77oG ×£ÍÅ“³ èè©y4æ¦ç›3§OÏ£¹Óós§fsˆòLUDÒd—yÉÀHU@íú@c ‘=ù%txáê›[ª[”C SvfôÞÑ¿®É”kZ| ޹¦×%d£z¢yÐpÕÆGÝ~îÍžÔ28ÿ/=ñß,þ—pòOOü7‹ÿ%œüSÿÍâÉ'ÿôijø_"ÀÉ?=ñßìû¿D€•¿”’ýŸI 0“ÀÉ?%û?ƒü³÷?Nþ)Ùÿ䟭ÿNþ)Ùÿ䟭ÿNþ©Ùÿ¹’­ÿNþ©Ùÿ9Ûÿ7à䟚ý_³ý_’Nþ©Ùÿ3ûþ7à䟚ý³÷¿’Nþ©Ùÿ/ûþ#`忚žø_&ÿD€“zâYü'à䟞ø_ÿI8ù§&þ—Å’Nþé‰ÿeñŸD€“zâYü'à䟞ø_ÿI8ù§'þ—ÅNþé‰ÿeëÿD€“zâÙú?`åßz3ãôûßJ©–­ÿ„€ü’/×°¡˜++ôKÈîí°ˆ€£¿ÿ.ƒ¯_aå_,–Iü/ûþûÒÃÞæ&§e}OsaïÞ©O!Y7ѺõE%*æŠhß ¸XÀ=$Q±4U‚Utzq …Ê~¸ó(¹kíÇýˆ| y‹Š©â)t+\ÎI܇  lšLêÖš¬hÃúæ*UÈ?±&"Q¬V tV“gônkf_èKë˜Ü@>ãœ3tUïù#ºyDi™„:’É…ŒÛ‚“I?ø„|›ƒÞqÉT4 …®dœò³ZK'doÃ-h'*Vªˆ|„¹E ®´ Í…S§ঠê`È4±±.©¨7p¯E! $z¨T¨¢üô¬›!%µ&vsŠÓRŒÖ ÛVñ¦›]†lYÁî+}7³™0×½»+C>2w3Ja*ªìU©¡üL ËŠªJNžlÌ2l€pó³A6D@7˳!³ "°ÑdñA³›!ø€™f´µÉà+AÎi¾èIþv†H ˆï5·  ï`£+iòªêÞX†ÖJÌeh­ä® d%žlˆHÞÐv‰áµ lI~”‰×á`3,T€d¡Žy*@3DAó ‹ØTBð3J´SaðU‚Ü2tÉts€cQ¤*°¦34«€GÒ¬+:O³ íÕYšÐ¡P.ô>LDknÜ5`e\ ‚4kÀÊ€§ V%?`hÖ€æ‹:h˹!AØ ÆÎDPQ €DD6-Z0Ò¶G9˜@4l’jCÀfÁIþ·MnëšI*Ö:æše®,åTnºÊmA†°Gh{ˆzzþßFJ«}ìÞ³M>À–TÕÍpMoŨe³¡50 0ª”0ĤLÑ0aQئó‹J÷'çu=È×6_YÓ”T¥QxXW嘢ˆ{au jKŠ.™<µª*w pLPÚlq’}`€ô£ò#‰;塤ý…Z*– S§sÓ6ZU,‘Ît7­}¦È·ý-˜Ï¬½.Ö•;a*ù–®ò$ßd[ê*êbäG¹€i š#jQLTUƒ8]-®£~KR±¥Ñ„Í|S[_ YG%ªjb®`¡VWh]DùE„7[DùדUwÑŠô.¶/¬} ú€UWÆÆÒYh>ÁF _Õ<ÉÀ´FqTÀŸ¥£0òVÝ4­[Ű[«!™Q¨mŒÈ0ß&;D lz’¹F‡saèçq wMß@C2Îýù~œ«DÁ†¨Hª0dén$ UB6ÀŸ9ÐB³ â|reEê蚤öÙ|Àš®Ÿ·öò&±1-ðà $ä5]ÆÖõ”­õW­”/–;#ëP½UIÓ{vÇ,Â?§yjW{àk¢áÄ^¤ sˆ¦úÂDÞºði[þœ?¡ø %þµs•gß.¢ŽItz¢CÝÒ‰‰ oäÛÔ’B&ŒNÔÕÁðè$µoyß~De¬œ¨µÞ·’ûØùç¸üåýV!s(Ð"s32è0£¤#w”’vÞHuØÚv¤)Ò;ÜÑ@èMdƒ“UÛ!‡‹M·ÔÔ)ºœ\!o—Àš¨BÛö"K%ù"™Ð{´Ì×›¤È—´ê{NOZù§ƒ'(KV8ÁEÆcnÿÒ~™˜ð[Á¹ö¡Û…ÛŽšè›=CéÒ@ 6[à=‚õß²ÿnö•;1Ú"¿€¨ £–*\º$‹0z[pA›Ì1IK V˼ kTw˜J-Uïc2ÎYqbUUz}¼BJHä-Ç›þSä/éJÐg›ŽÜ¬è¯eX„‰M´…LCÒúdá/LR bY]ª¶"ü'ž d´@‹°ƒ€eT“­AF;˜^úÇ©›Iìˆu‡*maƒÞ>¾C˜X‚^§Y¶!ÌÙ3 M"æBQ=Pµ5®‰p k…³ä V£¹:ü³e¢êOÔÝÄYÁǸaˆáÆuÌœ!e16Ìw¥MëÒé[ðè›%L°¸Ü "êV‘K±«ËdÍ(LHª.ÉT•}VŽ˜'Ï:fnÛ®Ï~òE~³É–1òÒ5»MÄɤ=®˜ìŠ}ª}Ý­A¯Ç´²T}ƒÉr:EªÉdZ(:Išé‘tÇ¢[·à¸>°øw+e¯úm§h,ëX.†y6ŽEDrÙUL²ëü³ë3Cß°…-ZÔœ\ËÀT Ù•`Žî Œzr›8gdC(pþ»à†XóàÜÂ$]ó÷ l’þÒÍ5h‚¹þÔ¥o’I×òÎÝPˆé¬µ†$–Dp·8ïs‘¥Óõømvn:xð&ºÍÓM‡Ý„úR#]>Ðq¼\Þוq“TIë `ø©´À£˜‚í¡è’(‚Ôìå‹Ëݾƒ÷ÃŒ¤¡}KÖ_‡1®Ú¡CÕ¨”-Z"³¢@SÀªh_³A *ùç ‘§ÀƒÖL‰ì85…æt,Óš2쨹I,cÔ[`D?J°zöβp®›@Ón)±ÑºI«å (òýz#MIò/Z¥öNœ„q,Z R%óV{–'Æ é¯;ôCÈzev‹Ïµ¡ùdÏ*$Q.ÔdÁŸðæÂD, ‡Œåæ†v‘Z£âàÞç6ï–j`Ý+¹J‘‹jVþÅœXEu°ó4›¦ì«zݺ*åJÕ³Â&ëÉ¢Öî½¶” ®¯5$ióÃiF FoFݲƒ›¹¢ê­óÀj%W«Z\¸ÜUrÅ:*çêNŠaÓc½’+”éÃuÆUJ“@©+u”!mãˆø¨yX\‘ÁFIsŽ-ìÇãÔßµ€¸Ô`Cg(æÖŠ¡ëæ(ä4Ÿâµ;¤Pö(põFɲTdd ɱd)6|²œYíó'H'/gÛ/MWYYEõ»Õ®£ 5žÖ1KcSãób £[løõµÙž%ST€¤÷C˜»Z»^bp'{eÆàö3ïa¨k"ƒšî8¹–«Öù¾ ÃZi0XgˆuŠE2F#P—k ê[±9KLÃXL{=b)ˆ•X¡‚Ñ‚¤áøHýñÚä(Vˆ4|ºV(óêÏ ×öb‘Õ ˜íޥΘêÇ…‘lÄK^£Zn€Ñºè\Ùwú–³y!ÜŠÏíôÀÔ›¸X& Ôéƒ8ÅâØå’Ü•_«mLUn†­b= ýsÄõ_ ®ÓN†@¹îÍõ^Ù³¾Ç|À2ùX©Uø¾‹•@§]Vª%¾Wšàܶˆc³Ãžáì§ŸñX Œ±yäºìÒñXjðýƒ›;ìÃaë5c\Vе;2š•Ñd笈¬¢ÏÀrVÅs°&aþÃÆ³'2Oói±aÔ ~Ýž–åc=%|ÂóšÎ'›ØØ“^蘒Áã°¸ñ¡ÂEK”SÛ(Fj~mô/V¢=¹.]¨VýŠwW,Yzu1iWüš*å¹Fkùøk¹Ä‰9ÒKŽÜãÓ*ùUj–.]æaå2ª]Ü5¤ø9ÝGë¨â´‚ÔŸÓ?dâý0Uõ-ÎÈœ,R×q½ÅYä,ìYKm¼fIÆ$ìÐGQXBùy ë®%Xª•Ëe°çð_¿è¬€Pþ°nýÈ—h|¡`åMÓMðÑÁƒ(¿0X5·zåOÏ7­Ÿ}{äb^.·ƒ¯¦Ñ»’¢åÖÌ®º:D0¹·W´óB~úäI'€7:"#ŽŒÈD‡JH;Ý%i™&Ýp‰Ýz7^âO…Æe¹˜ÄbÖÉq(‘LCbxèÆÆ.8žÞ«Žˆb¡îk*™òlìGÑS‘ÔÙ^~Å„üm«>3•<§ðåYà®@ô\Še6 >ýìøô7"ëHÊ‚#v ž‰å¤Mðø–ð¬ÈáhÂõ…`ð­Ô)ª§+¦Ô‰A¡†¼Úò¤|ëô© ÈnÅ´VpQÍ‹7T‘ßCq:(b…æçÀ·'àMzTH< Tœ äqtŒˆ¬üõ Íîù˜^™ÔGØp¬‚ءΕX=‰÷"IÕYM2š¦h• 9¢c¹Èf˜.ñ>²¿µJ(½ö «ìŽ 'Sr+©á£ZeU¨+ÓûMàp²!ÊìqÂ[²B™cÉGºÂ*MWÑÆ!͵ðÂH—X5rMûèë7Ã"§"N„n´¼F¼FLbÁ?’än'Àöæ÷¦½êo­áuVUŽvE™É°êÌl9kYÉ(Úör Î>^LÄÛ^õÄõn¤¹Šïc&~LêÏ[F䌶ˆö¯;b ÓŸ†ÏXF4’‰’{Ô‚Û5yz'kÂX(q‹Ù˜ØÉzvÜ`"ãùÐØ1ý1»€ †ÏcI>ÖmMóÿ8n_h„¤Á8­©c’`C5cÐbBÏg ÅÄ¡­iäD6þ^ qâè0qeJ'¢Q‘”vÜ4&~LŸŽ%(Ï!¯eLøä >d,z&@;-ÇÄ6"‚;l0ØKÚ I–üÙ'Lvwc¹p»q \ˆ,†à¨ø˜$«Lð5©èUµöfÄ̪L¤5ѸxQÞ8G)Œ1& {לí.¼Sö˜ÈmSSâœ6/º†‰‰ËÚcûÆtj& {6”öVŒ±*úÕ$:ì»S cüh› 9,œ>ýȨ=ãN[d°ÖybO‰3Ú!mã)3Þ´EÙ~-3þø%~¨VfœòKü´°Ì¸ãI¹#eÆ;?2è†Ï„ìD}OéÐä!ý¦2ýÎN(äˆsTÈÕ€r!W¯ßýÁ>Kzv»×ÞÃ/ŸÝ/YøÒïnö²’ý¿òOv4·}J†_MMZÚÜÿn1jï5Ïeñߺփ¬ÍüQ8²Å~FÏÙÏv7~ÿ—Kïõz'í9s}o‰i“­áù‹soç¸a6J£Û„™ö;Û&ýÀ MëB½WxŽ6ž¾$Û®µÎÂÍî [ÌÊÛ2åê¦òqä›¶!Ól~º'ˆ,\YQ4c²AäZæÌ¦q7›ýW¯"/hë'§-¼wx±Ércû9ÃòÖvöÙ“\¾wÂÓù§¼ÎÛî6f½ÑÆÛ6Ó£Òߎ¹â]j6Û‰™œ}?g!a‘@ÝLÑMshÝö#O޼ýœÆÜš<ùÒÄѾKñüÔôæš•äÙÅŒ±÷îð–{§­êÔ×eÀªbý[›¦¯ˆýzæe~Ô4ÏŠ¶Â²EA#ó¿f•xÌKtÝs¹WF«¿†¿1ÿORAHî¶Ì‹oÎNûz@÷½‚n'£c¨/M Ûgx%(É;8-ð {K+«ãÞÆq÷î¯i»ô_o5} Q¶µù óÞÔIâ„£»ÓQ1÷‰Ä©ÍÓí¤£ÞµÛ^ä8°ìÒÇžâ{û8ômHº•¸eMN±9}ëÝ_Nùê ÒŸºYeº;dc;jã˜ç¹H²{܃]tëq»õðJ-î“èãt@§8¶àe¨kÜyDϤrÿ!»ŠçꮬØ,€ˆæŒ20Ϙ±mÁ»ýöìû;=zí–Cþ–çmún˜3il‚‡ngÃ~;âw|·£Cæó [ãK8-8éÞ_ïîºÄ—b׿\~*pÝÉÉ„…7nÌ’Yz+hÇÛDýŸ¯èLN³Ôa_:â–TЉþk ²oå€Òg¿ï/Xmµîü‚²”9Hˆù¹”gÝ&Í÷Êx‘h~kg`¢·û0²mÆ÷;oVü‘ž‹ÎÛuµ[¬î±É…©SG“ó®Íu³¶ë|ÃÅÆÝÓvoÉéœé+êm™³²çÕ-GÚåæn^àš™`° 4Žô;\bîrÓ=-y̧۬ñ7“|Rô?mv_2azáA¯[ ¶ÌºÞ.òDSŸkw™˜Áœg_Ybøò©Û¨Ô;I뇤{ït+Ÿ¸qsaß²9®3ü†¤„·Ïœ51¾s“v+S×núñÉ(»>ÎCÜËžfäÍíÛ]7ì•ßÙ™/¶<ïÞ”LŬº’'X2ÿ夤ËýÌõvø¾iú㸃Ø%×GRnÌ|³äà]ÇŽÿs;"íˆxBoÏ˦½ºŠ~n¦³ô&]:3!ɵoAðáíî¸ÐâÎWO<&>[÷1{yóî¹zyúwV,ÛÛÍÁqøÀÖÉ’¶Ûë+trŠõê˜AK-Ïö~³+›L˜g½©oØ·¥ÙÇc7dK£Êl}^5Òõ‡‚È<p¦yq”}^gŸ1àjŠ ‘2VôbL„4D’b%a'˜`… ”]CYãMÈÝ U\£i¬Ê5‚±W¾†1Tåk Ǫω«<‡’bºj¹hÕk`& ò51Yõ91Í»%íÃÀdÀèñ€w rd8"£€0!Æ©ðh ¡§ÑÖ4¯“s£§ŸñØ¿¡oiWãj.y  ñä»ChâŸòT²ÿÿ=ûÿhù_å¨$ÿÍþ?Úý_ç¨$ÿrÿnü`œþk÷ÿh”£ŠüC¥S||"ƒ&ù(bW}è@‰48‚üCêNÿü9þg1%«ÊÃX#EëÿiŒãßÅÿLÐŒÀÅZúg-ý³–þYKÿ¬¥ÖÒ?k韵ôÏZúg-ý³–þYKÿ¬¥ÖÒ?k韵ôÏZúçÿÃôÏJPíØŸ vK Øÿòg¶ïåJ¶”³ÿ°I U&ù 5 5/ªF:^”Q®^gàt–ûœMå„ Õ„Ó«®g«-‡‚bQƒZLV(8£ÈûJ ˆúTV”H@ñ¼ì€LJüXÉ›(“ FÐ0)*H‚†ËN‘ü¤4VõSœºDVböý «¾@ux÷ªá.Rã=Cåk10 ×b ¨˜ÕC%É1Š2„Ç!JP°‡åË1(N“B”¤!:'Fí嵫![%åêÊ(Â~Ó1ìÓ/UƒåÿÙÕ"2IÑ|D )ˆ`”¡6"ø‹$$V|"$ÿXµS®§²¤\Oe­—÷°jRX¨—âÔ…Ѝö³EÂJDCh¨ô½‚LÀ­)\°ªæÏ´AL¢ÁAç"HÃâ†ð;ê+õa«YÝU{

&ð­Ùº££!:ÐÀ–P¬ºd8ËEHö öç» J[`ÁÅFc€ò•`ÓÏÖ`»ìñ¨½1±Ú"[‚â>MÀm<0S­P´dÃbÍð· Óü/ ¾+b €GÌk‹:(ʇ‡ÁZs˜°CŠ$4Zvü9‡F…Y‹äÀ¾J¸³aRiÃÁ‡k0k9õR\MÃ>ÏßFrdý[_p£2®Ž>£^ ÕtÑ8ÔÅêzA¡B ¬Â@pÁØz²` .`ÑûŠcì ‚I*îÕûÞ€mR06k¡aäŒü>Ä|ÀÜÀæÏq2ÓàÂp¹þ3*úЀÒ\ÔɼÖà‚«€ ›7 Vø“¶Õ©H‚UÀE4)¨q‘…kŽ\ÕÁÇŠT1LŠÅJUgøIµ¥>Š«YØ,(¢zd[VŒ*KýÀ®!Œ@=PÀCAƒ…C°D ÜUº3äƒÀ_ÎÁ¾E|”èCA¶zLæ.Ápœ‡2@|‡2ÀYL!ž‰Ð¤A F¡0È £0Þ}¦•gFå~ƒ Ê ZÅ1X#R#óZ£©‚Bœù5×ÌÓ@WA!@§Ü¸(Dó;¶JÙsòF*`æ'ÕB¡ú(îs(„~¾[?(T•³ºžPˆÔÔ‚€ö+w$”¹ Q; Up„‡CB‘p8„a' oX7 ¨"¨ ¥Ò *ÄVX/‹ZÙ× Ä*^°‡ÎwÀF±¸F^L\ ‚äüaëcáÚ¤P0©p-U8=h~R-K}W£…Í‚BªE×*ÀägˆÛ¼Zæ<5ÐB\hÒ4-PšC ”Æ!Z 4ÊC ö?°PŠæ„GQ Œ$¬“Rù¿ þì§_´P'ûÚ¢†TrŽ»8G€]§6Zˆ$dU´ˆ„ìšíA•^9Ø.”Pê.×Lž³­Ž­N¾Í‹«ÑvÃ}´z¨àº·A\#ü°€úr¸²ož†^Š¿±&Ú4ÎÜx_Å´ÊpÌbCà 83l@©®°×pv‚ƒ3 `+(åpƒiåW¹ß W6Eî·PQ|¶á¼”:W52¯5¨`*&ˆXÈfOb!‹]jC #’àxH™"ã‡m\û6H¡ä€‰^©ã`G¥5 æ¥Ô²=4-ªF»ƒò˜ˆU°DÞ¯õƒ&” £:só :ÞúÁMÃB fˆùß[`h w.1©Š+”Œ¢…BàLJ༙’cÀ×qŒÃn ìÐôI3éžÆ!TÔȼ¶ Bª„—!Bœ†þ%Rƒ}‘„ÅÞnI£Z'²V(B7@Œ•2r6MÏ…ðRj‰æEÕð.C› « © |Té¡hì¬f$Q‚á4™­V™Iž.“l×±@’Bƒ]ÞÀS²À7‹ÒŸŒ9^[Z#G…zù×V£)¾F€m c‘T“IYÖH ¥Õr24¢VÖÈ5¬irE£€ßGÑ}`Ž_O¥¦Õ¤Ñìk\C´±zZ]«xcÍÔªuWú&IVÝqD„Šeó¨ü ˜½ œÜ©aµ¨IežM´]­ük Z_‘6H0Ê7ŸK—LbÉÎ*M$çA¤‚®£,Ah ˜¨Áà2N–@•²Ë&€qÞ/ÑÀ²WíkRÙׄƲT+ÿºËRS»–{éŸxŒ5q1¨S(Dn´a'Ù¸*ª}E©˜05DÆ7Xþu—…¦S *ü~Y²òY©W8dcÀÿ)¦¡^)¥^ÐÓ p‘;O(ÚÀ²Tñ™p«xß#1?©–,ÕÊ¿Î²ÔØ' +ªÜ KÖ K妫X9‚±%”%N¨|ï€×|ï€!Ú^g€R¼7®¯IÕ¾Ödšù×]–šú«•%úIYìD)~PŒûÞ1”ŠZ2$´ZÀ3à®mh|Å«ö³ þi*Gµòÿß½ÓPÝùë¼ýOöÿ¡p%ÿ#B¢ZþÇÆ8p_„BQ?1îOûáÊ`hÂþï" NùúûþÓõÓ {Ô]ÿë¼ýÏgôE(1U™ÿüßZýoø£~öÿ9än¦'îp¸|gþ/¯¾]†Çù´Ñm.¨Xœ¿?ÝH`Øtüè—/Í,\Q´Økôã'­ÛŽÜz9ºÝëé«[¾÷%®#_}ø£ü½ïߥ= ã¾*yú÷óßuŠo}ñ{«|w÷¸|éíõcÃE‡^–WYvÄäQA þå_³²ž­ñ´}ñÅý„ïÝnû‰oƒzâ “OÞ:öìTYAÉä_FçøT¼:‘µß9¿×†­Fafvn®.‡µöytkØ‘¢  Η͈˜yçõ.Â4»»°~ÓâeSŸäñú‡¹ìýó«}Ã<¯7»|%ÆÓ5zR[ÉÅr÷ß)†y‘/•쌴›058ØÓóukàŽ±⇷X¼4°Ì:yqKÑÀ9mš6y4|ëúæ~£^í ±i’¹Iï×>9ýÎíí÷'nSa¤·ôËý…qÓ°þË…Wˆ¡=tÎUÄW”ŽÔ}º$ïýj‡?ýýW»ÏùÞ±(+<£ù°Yi…'wøŠ›N¾í-ø›u)þÉúßÌ~9înZÇ ½· 6&þd|z©{܉0ïÇ­¾ ><>¾š™ñåéÜUåEçG­5Õ5ìàºmÀâU‰~×ßf¶M2+\özZJ¾ÍæÓM¯|·fÞçÛ-l¶Êœv|ààq<ë=~fã¦þ£’)ï±ÑëÎòœù?yÓ-DTÌÒ$^š‹ÌÌyžåà5»øCÒ4æyßÑÞ-_ô¼ºæøÏá-Û·5˜Öå‹kaº® >ÿ»þš„aÝ_†Ž»·qN>Úw¾üböü}«ÇŽŸÜgZn —}CIpË?½ñ+·v#±´A¹«6Åy83¥K,‹lÄy¸dþ`Ÿt!m¦‰Ù_áQ˜ËÇX»´§³¬Vö¼ÖËxÚò^¹M—V¤ÏŸIߪiŠs.Q&uß³^è]´ôÙ9W»Û¢ûô·ít#!†êŸ*u4õÕ¶¶lmÞ¶¸àkèb|v×æÕžÎÌsßkSˆÐ£ó{eb¨>®S—{Ý»ÕÙ»K÷¢•]|®]ûmºîNƒlãìc:ÎnA[øôˆõ¿é€§•ôIžëwfe^Š]rÿļ;»nœË ðZJXžRtà×ò¦Ù«§Ò.¯°kzã­Ó½¾×m2߆ ’L? ç ?»°ïâ#…Œ´•þ ¶EM»¦lÒÊý—.s2Súšgô§Íöë¬~µ7jë>nÈÅðãÁMÌîöJÕ5yÑÎz䟑h‰óÅðÔ.‡êLÝâµäk»uzÝÖènLÎI›¸cPëÁá7õG§1¯ÒÑ3¤6›>4K8ù³Ë¢Œ.ÆÁ]ûõ?Õcë ¯ˆíÓÓÆæ^Õþd¨oñ¸lO7æ9yU8µ]ª÷ï#ÞZ®9¹ḛ̀n ÷^ºõ³)G¾ÿæb|@óüUgÞ#Nsí¶ŒïÕf™¥eò’# Çuèv|‘ŽGü¬Èõ:my쬕{¾zsÃø/B+¿óëq+ŸÞº}ɹß?©é„u?o¾äÜ–®o5-{òÖ³ºÞ;ôo{ÿ{ÿM±ëÇß»ìÀ§Ÿ\yô­ý—¶ü©ëß?ûІmYþÁ¶-o%n¸è¶–@ï-Oœ°÷ø'–?±ð¿vÔ¯ª:rzßïn;fÖ“îÝÝÕñ³›/ÞüñÜ]Oôܶõ”»Wùϸ;¸àä öÞúBý]çnûÃç¿©)Û¶»¦êÈc«o}}ý¢Ÿ¾ô½öíŸu}¸ãùÿØ›é8vñ1óè´ûp=¶ýþªC3®¿ì=·G¬ymÍS¯._óâC›÷úvMøêo_Z†FJÔº ¬SÁHƒtêG ¯_y£áÅ_«£xÔ•¢²Ð…d!«:, ƒÓƒ£h”e0ŠJÅ”ŠfÉ;q峿ÂR•úAxQ‰<%Â18¼åã.  D%}EZT³G1uòá>K¶ÎBÅ?'+*Ž·ð(ªBxïÞlJûÙb£¨Ä/ZŠÊä+6†ðF–ìô”©Ä}óE2»)S'£‚P•¿ 8%ï¹-*P °;¤t¦ï-ŒqWxÃ^Q) ;eèZ]Å,Ö+Å6“„)´Çüí1¾öH’…@{L! =†ì ")YÐ:ߟnWÅæíùªü%íùüyù7›–çñç_˸y²0xÙÜÌÃ@fž—Îçù¼ùåÜyÀ‚L›' xϼò<Œ'¿ž@~>/×ÐE>/ ãå2Å?ÜÜ7Êê1k^yø_+ò9&¸@OU€1¸@Óû?Ö6øoþ—%dÒ¿×6ú÷8ú·‚Lú÷ÙFÿ¬£+Ȥ¿môïuôo™ô°þ}Žþ­ “þ«l£ÿÙ2ê?â>Úú÷°´‚ÿëøK(Oÿá'Iò=ÍÑx*†ßxÌ‚Úf%dJXÁöùXOÿ×cÁÍÐ $;û?, `g_’¡ :x9]@÷™4”xòµbr+³y‚•80H>TƒË@M|;/b<§ $céâÃ+$˜éþSÏ€ŸÉPªQº£^B’çQ{*AU€z’œ(aT3¹“GÊ‹g¤6 í W)sþ†ÿ¤ÒAYFÁ3ñ–§T„G“Λ”€f·+!7þÁ9É©b“¦OÊPTC¢“£2‡‘¬0šžÈʼn…º¬:H6Ʀۣ)‘Ï´Ìn¥TN˜ÇC¸ y®›ïŽ ž ª@šhXj!h§Uy“rkš¬x u2^ "¶µ‘ p>ÉÕ„OTA¨!ºD¥kŽFsXW$ÄnN„,¡-A)RÕ>%ݘ aÒy|<Ä‹h–6\2š 5B<É…å™G/ÅGáQ¥ÚJçÆæBrÇ¢‰eEóêÎ *¯os K7)ÈIò$I9«„iáZ(SëæF%9”â\,FÚ„&Ö@/Èb ã[NE*:ÑpÅ`û‚†¾èŽŠrŠ‹¡Rû®™C›T¤g×tI}PË—Ø¥4ª)"æ«3U]–Ü#L&`yIÂNG–ñ hÁªÕUœ~ê×RT!D^ª(¡cÁ‘ò(šÀÓ¿I\dsÝ…Íó›°P ç_Pw!>˜=ãÂÚ¹uM™\¦¦Z’£¶nጆ¹ýæ°¯uŒ¬=RzsN×ò2~éÁš#«=Àñ[eªÔä;P­NÅ5¤²Ì ̃Á®¢èo`#˜¨‹62&ÎÏ%­øb'©~Õµf{¦Å\nk:ˆ?õ »IÓA#:JË¢ÉLÚ”Q2–’7Ï Ëˆ ÞŽªÍ”ÙÀЫãÉT;% |Ú=Õm!Cã!¡7Ý’QÝ„rÚšÉdå³<ÚGÙò(ª–OâOV`÷ÀM¸S3 P"*{û’øn^‡×ÉÇ’(ÎËBDBœÈ£0‡ƒILEÍxŠÀÄâ«%C]"b¸úDV®®7\ÑÔP?{!>¨YÔ4wIF³×b25ëù±“Pïè-Я\œÀ7Vg')½Q²eõÜÚ(ÌGÜQ¸Vm¡\í5u*#éü q_Æ"1G"_¢&^N‰ GW‡Ñ ŒwþEìÓóÍx2ÆÇÉ&²bw( ó 4ÙÀæ´$è]ñ—r'h…Šz8 uð0ýà0Xv»(ÄIkÛa&ô`ŸŠÝ¥T]ÊDŠˆ:ÐÖÎLºð|;SzYád²Hi8G¿wš£ýx6êdzþ§öûŸìû?·óþÇ 2韱þiGÿVIÿÛèßÙÿa ™ôoŸý?ÎþKȤûìÿqöXB&ýÛgÿ³þg ™ôoŸý?ÎþKȤûìÿqöXB&ýÛfÿÏyþ·„Œúçæþ²ÿÃãSôÏ:þßÊÓî%ªö¥g—À_›ÂÀðÉ’{+¸@üü“QÿŒ‡qöÿX@“'66WΈ!¾’™ê¦&OV¿s«FæÝ ~çVWÎÂW)߸)Ÿ¸á fø·jTŸ‹bVƒ-Áùg ©D$šè˜)ôV#WùëEU^%Z' Ž!‡³ã…FBåªäZRÃc‘Ør¾Ò˜Jœ9Ê%ñr*9—“£ ¥) ÝU— ¸Ò‹x¼ÂO`*8QäúHȔꦨ†æùJ ZêRvð2Y éæb(™ÊS”± ¡H*IBWºfÔeÏh8ãÂ)™Ïr >*†Sñöß›e³ÀŽDy‘—¢R–éf‡ˆ{Eãx#B¥Y†r4Éeñ#WM˜Dc1NãÑ FA P­«._ Š«3‹Aƒu1h£ÁX4»¡Ÿò@˜†¼ò ­ †ò<ÀYdΣĵÄP‰*ÁX&²Y ø^Œs‰H(–½…Ör† Yh-—/ ÕræjY¨„Ë] mç ²² §W B„Mîxƒ^ÏÁ ΛEðB¥¼¡R‡®¨±<3ÚOy L4¯M0Ôéƒr„ü:} Š`®ÓíŒuBC ~BbœÔ™åÀU)£ÎAŠT~~%e®ÓmHêôC}Æò ƒú´ ñþ¿ÉàêdIàñˆFáNNäÂxY–W­œ Ü>¼Œ³¥¡4…p™ø_{4iÇ‘Dð‰²B SËž†²É äšÕP‹&ñÙk2xe–‹Å²Œ¬k3{1âÙT §D…È€Wü!-šà±ˆT†dt-ŒÆy©²IëAº¶éÒdïžë?q¦‹HàÚìçÞ§TÎÅ¢ËS|ýÖmL¨!%‚öâX¹–ÞoÕúÄ ÇxN”roÊ PTQ ¥Ýî´-'Õobû"»£—âø)WXÄH%V_e;ÆúAD øKÅä"¹HId¨æ—™Å$…¹¯Œh,¦«!ÑÝŒY³82Ôè©n¥8µä£(ßF|oþnd¾HI€«HFr•±/ Óúb¼¥âб`-­Ð|¨">鲺0ƒ'9ª©–x*F¬pÀKYV.¥û»Ô×s ¢¢‰np"iŽ<‹ÒjxYb^È¥D‹Íãv =(í\Ï×—Â,CØ\C­ ¢ äÑ3S‰~Ù"žzåqñ_æú’‘ è„eÊÖ9¨^Æ>†„ÎE”+‹â×@Z§RÎôåfCíÈCÆu±L !©fÑÜ"üÓKê"~ÙEé²É(Šº9“¨2—r m®.ýITZÂQ‹á·•ðÔËiÔ!ã1]FBÃoYÎr@lâIéÎÙÀYy°¼Gq™(Ü-)§åçªü.?X¡$àŠ´ˆ¿eø`° bf¤j(k¥¸TYÎR5±2š6#"׃Àw$`­hp÷A!u:½ÙTYÐnˆlÏ¢\j <1B­Ð¶ÉHŠ\¤ a&ôIÓõ&NÒ*ùs ­'¾[ëà2RŒ¢% +—…íÑÄlÿ’~)+Ó{J»œôa¶ 3Ú0z“b4N-è Ã켟úÛ+áÐ }ø(ˆ«ƒÇŽf«dÀ’}p@š¨a¡±æ +ÇP¬ºÃ)=Ú N>‹&%¾„£†>p‰}úŽ{õg†$}Jœƒ>ëÕô¦œÁøU UÖ‹ú,r ?öSeP(Ô¢x]2lq  <äÄ0Œ"^+À(¨Ò›ªÔÚ`§Y&ö#Ê1®‰ñJürª¬z°TGÌþ\U¢Ü A]xèÅðfQ8ÆÊUÃÖÀ<‹N À_å„ÕŸøô'ìI+¥¦aÈ Mvb¦™”"XÚçz•C­oaFŸ,ªÌXV6¤TekŒ üÌH•q1‹¡¬órØ=婿æ2ªruþÓœ¤w›Æ4ƒ¾„„Ú¦œ|x’InTØz²jR3JdôÅûRɤ¡­ÀŠ =V¶@-)&˜JÀÄÍÌU™µÅl^·6õ‡mâ£EWžúÕIQ3~¬Ça¼ú›ÙhQ 0Êxo ü€Ûƒç3QèQ•M+µi\ÅÁx5çà-¥D^ÃPÃÛRaò‡iˆrll®$ÏüI‘ìE‚ÜÉã’0ŸªJ2¾éŠ”K»ºyr×Ê 4~“D&àÙd—nˆ”ñ‘’³3~Uœ³Ï;ïl´èìéÓÏF×ÎãÍ¡Íh.ß œÙ»£aÜý¸šFÛ`Gt¼ z¸¸,ر? éÅ=áã!7îëQ†$Õ³zãÉ­à4v88YC)¼T0ÞôdªŒ‘‡ðZj”ÕÑ·{Òœ¬-ºsè«øD‡¾Šãü æu˜´ù@?0¯¤KÕü÷<Áˆ˜ùp ¤+3óAvõaàS¢Ú?êfNô–È0zKd†×4”Âÿº±šFƒ†¼þ?¨Âëÿn ÿ‰ìÿ¡/^ÿ÷àý?Îúÿèvû¸ö0ËÐ!ŸŸóy8¸Ÿ¹á,öù}a·ƒÿô §!Ûÿ ` ŠØ¿‡õÑæý?,ÞÿëØÿèÓÈà?­iž·ì?ÝÇ=üÅâCÎXõâµ§½ü£Žëî¼íå ~þãl~oÝe—­z³ú׺ø_ÂuóoºçÓ·¦]=óŠuã^¨{òôM㟯¿3y±§¬eÓ1åÏ¿i“çø ¶‡š~]öÌâÛÙMO‡¹-W‡ÖO{oݸ›ëÆþÌ{úÁÇ„wÌ ¿yàß½áplÅ‘=‹þ|ùáëV¿üÑ”e}‰+;f¬=픓>ÿTñÀwž~òõ.÷u¡wÆ­­?ƒ[v{ݘג_.}ä¾_Ü:ï–­ò웓eoùÖ_M}ÞÿÏO_zwâžÆê²;.ÙP±³gÖ/æŒøÁ¾…Â_®Y”>nû¦9ë·6,ùü˜#|õÕž³Îºô‡Óî”»jw}vÕ‡þþª–NYÁ¯{ÎÁs/Ù!ïb.Ÿ¿~úÙëøg^ÿÄœ±ûö³{vüžCÛæî¿aâ e«ç0Ë}knnb÷¯¹ìªØ?=\±†º»áíú«Î¸üž=p寮[sñÇï|÷ÃÅwpw}æo.ûòÀ¤g^¹æñ5kW¬?u÷=;íê}¡ò÷þö9Ï•ºzÕMÓï”_ß÷eÍ^:ù¹f¾iþêËýÂÌÙ¯—}ñ­;—ýÈ€(+,ÍdEyÑ6"+*nŠ‚±¢¢§ €±òIñ“ÇkŒ0Q ô·AÃÄK 0ˆ&;¹¬‚ÑäÁè¡Kl àwû‚ P’,„  =`Ü~o^øz㬘xn_U>ÏKçóú p³Uy¡ùÝw>œÆÍÍËhf^UU>dFÎãùt¼¼ûx·bÁûõíëîú½{˼Ð?„.ZQu÷îŠ|Ž)ä>ñœïÿ-!“þíÿÁùþß2éß>ñœïÿ-!£þ9Î&úǯý[@&û·OüGÿ–ÉþC6Ñ?Í8ßÿZB&û·OüGÿ–ÉþÃ6Ñ?Í8ñ?,!“ýÛ'þ£KÈdÿ›èF€£+Èdÿ¶‰ÿäÄÿ±†Lú·Oü'çý¿%dòÿ¼Môý[A&ý·ÛFÿÎú%dÔûQÇtÖ­%“þí³þïØ¿%dÒ¿}Öÿõ_KȤû¬ÿ;ë¿–IÿöYÿwÖÿ,!£þCöYÿwÖ,!“ýÛgýßÑ¿%dÒ¿}ÖõKÈäÿí³ÿÃÑ¿%dÒ¿mÖÿõ?kÈäÿm³þï¬ÿYC&û·Ïú¿óþ×2Ù¿}Öÿý[B&ýÛgýßyÿo ™ü¿}Öÿý[B&ýÛgýßYÿ±„ŒúÛçý¯óüo ™ôo›÷?Îó¿5dÒ¿}Þÿ8óKȤû<ÿ;ó?KȤûÌÿùŸ%dÒÿÑœÿ“ø,íuîÿRžþsAÞøn>!·µ ú—Vp!ü_Ö«×?ðÆË:ñ-!›áÿÒ´ƒÿëàÿ:ø¿þ¯ƒÿëàÿ:ø¿þ¯ƒÿëàÿ:ø¿þ¯ƒÿëàÿ:ø¿þ¯ƒÿû ÇÿÕ^•†ÿËÀÓÿÿSü_°0/œþï «,þ¯òžy°Ð¿L±SýáøŽ0À¯ÆØ¨ŒÏ3,€_<›t/×#`ìÑD[ sÄÐ=颣j@u+MTõÂøX />ÓÁðBÎ"ˆ¿ý‹1rU]…,ˆöúCVÔ0¨§ý§C ¥}Ci#è˰z@_¦›f«0Ú-îJ–]¤O\=«÷:Ì]H ï /ЗñëmÝ‹'¿Œß3,D_·+âõ °Žf!œ¯W‡²ËøÙÊ.>Ñ¡ìz‡ ç;ÌŠ ÁùzûƒóÍÝ/Þ=è;Æ0!ºý#`Ò:ð^•42Æð…Τ£nÒ:|]°:¾.mXà½C(ÜïÊúÿ   ^ÿwkø¿>Öã¥á?¼þÏâý¿Îúÿèjç çö†¼ßÛîkçàæå÷p¼'p{ôіϡѥ¡Øÿ   ±ÞóeØÿÅ0^ÆÙÿc þoÓ¼ùÿ÷àâÏþpêEo°ÑÎùÞÌ™oÜwÿ§'NÙpÛþ\{¾šÞ} ì¼ðÜ]u¯ÙùéÎco<³|é3¾‡Z½hßûuWïÞ|ò˜sî8¹sãßÜ?áö3wŽ]˜\÷î™ñ¥[¾hæÜ²qVËWW.fçð ·õ` ±ù‘‰ÿÇÞÓÆHr\Š¦Èˆ(ˆ(©‹÷Ì®ãݛٽµÏ¹½Ý½»ÏwËΞÍéfµé®™i_O÷¸»gï6£–ˆÀð b ‘#óEÁ?b”Dð#6ÁÒa@Ž"ò!$Rø(Rñ^uOOwÍLOÏÞlm+©§“n¶úÕ«ª÷UU¯¾~îýîÛ;g>õÊú+oÿÞo¼ùÖýo}éþÀ8ýúŸ½øüÃëïÙþâwŸxæÝÿþ?ª\Ýz®zé¹[¯Ìï±õï>öO|ã³ï©|üô—>ÿýþá^úòƒ÷½þ•>v÷Âþú?ýÜçþ磯Ýÿëßþȧ_}_ãÞºù_ÿø•ûßñ—/ó#_ûz·ñ¶ŸÍÿ~îýÍê·_ë¾yùßx÷ß]ÿÖ'¿üƒ»?ó­¯ý‚ý™—~ñ×v”w<ñÌwj÷m½ô7?ÿà;Ÿö³ïúÝ«ÿ¦­ýŠöâ:k/t;û{§_ÿÏû>ýo¼Yûê'úÌÝÿþÐ ¯¼ÿë×ßõKŸüð3¿÷rþS_ü“¿ÿÕ×þ÷ÅýwþóŸoþÕW›Í3Ÿ¸ú«+k Ï«|ïÛýÑî>ûì›Ï½÷w¾ðý«wÿøCêw^þÆ/¿þ[ß\ùÂoqy’~ýPš|á÷^ø-pÚÍÉ/üŽ Ýã³¾%|֗;’ŸõM5SýñÓ·Xù¦/û”7} CÞô;­[.¾ß»¸œòMßòà›¾KKCÞô-åð–óCÞôÄËçÎ¦å ‘´Éßô}õFuö_¾ÛüíG«öçúÕjõ}Oÿ‡§¼í›/ÿ˜Oò >þÓ2sþSîÿœü³sþSžÿœü³sþSžÿœü³sþSžÿœü³sþSÞÿ-8ùgçþyÿ·àÞÿÊÎø_Žÿ„'ÿìŒÿåøOpòÏÎø_Žÿ„'ÿìŒÿåøOpòÏÎø_Žÿ„'ÿìŒÿåûB€»ÿ7;ã9þœü³3þ—ã?!ÀÉ?;ã9þœü³3þ—ã?!ÀÉ?;ã9þœü³3þ—÷ ˆüEö“Ë¿°˜“ñ!“¿–ËeÃþ Ke9þœüó™‘¿ÿ Nþ…“–±\bò_’ñ!0 ÿš¡:ÎUz»¢·:n{¯PÓ±ì¦M¦eh €;a(àÑ翊ùB±þ«\`÷?äýÏb Ú¼P’ÝÈ«šxfOJÞÖÝ&4‰’¶j;€ÜŸ®Ž@GtÛ… ‘‰t2ÎT¡ã™I£±G`g!;×éñ˜n1–K×&ã 侬šš xc,v¬´× =°VÿüíøXLÅÇ ë+d­Ik½« ñGøÅ.Ô]¼]Ò¤T£Ú6g‹^w½ÓjaÖ«1È)L$Õ‡4È>çI£:€ÎlË6Ý„aC‹ $Æ4rœÆd+yÝ5Ö6¿vãóŽê°Na‚V¦,Ù¹¶~ QU³AñKÛ¶°’‡DëPtM0Ödþ‡øã””º09»ÊÀ.<ÒLY¿lëwSmè6L×>D¯]}È:µÁž ¾iö\ ­b§×or$¸’<ô¾ì"USEÏÂcM6lÛò«1I»—¼î%êô»Q é’Aó“;ePü™†—·6I=agd¡PËÙ¹ccÃrÀ†~Ï>Œñ~¿úëùï½Q²ÇÛ̳^·2ÐLß°O¢±•ÄÆF‰†§tש‹gâ5ì“ÙŘ~~«pÔ¸ÙY·jVïª]oÒ#ñt³õ1c™SàÇÏ3gîõ(†)§î‘v0ï ™pˆîv«x1»ê¦[µñ¾qç–Þöº¹6¸h£ãR­å1;~Æ»§Ó‘.*—Sð‚®¨Út@5h7·P„ê°@©¶ö­;Ý›^Ðøîzž7ù ¦„Êv¼]Ї\¤Ò´: —ûßÒìZ/vÛÖðþ˜ÕÖq¢à(Š^'³„‹¿è¦îÆâ09uޏó3όǜ#6…:™¤®}4¹„æ¡ã)!‚™PB‹Qé´Û–íÆIGI ¶Í÷j5¼¢´§æ‹#çD ÎHËSœ‘²PÙ¶fŸï†?#³Óa_§?S푞ò|µLú“Ñ^(Ð P ésÇùcô4ýBR¬¤úþƒM¦¼¹#ø„åñ>aÈ*ëq¹…^îÐ-ôçÆÇì|îö7G&Q#k6Ô=L×–'4¿³Ó3¿Jܰ*ÃÍ/kêæW9~ó«ðæ—r…ÿ^ðìdFX9>#Üiâb*­ÝÛÕ×,“é?fô'¶Ð©´U[IÃMF'’R mxvnR —û‹˜G%q _­€¾~öx]‹0Ïà{Œ¾m„¦Ýç£Ø´è® ¶‹ÃÅÓ>r[uHƒšñ‚Y S (ŽPüÎJš]êl8ÑæÃþìí…žzo¹éuSvð&¤Zk·ÓÐE´¡;`NúpÌOp翊'}þ/<ÿ)Ïÿ Nþ‹Y‘ÿ’|ÿCpò/eFþòþ!ÀÉ¿œùËóßB€“ÿRfä/ïÿœü—3#yÿ‹àä63ò—÷¿¸üóÙ¹ÿIÊ_pòÏÎýOòþG!ÀÉÿÄï’ñ±ÀÉ?3ñ?ÿœü³ÿ“ñ!ÀÉ?;ñ?ÿœü³ÿ“ñ!ÀÉ?;ñ?ÿœü³ÿ“ó!ÀÉ?;ñ?9ÿqù²ÿ“òœü³ÿ“ñ!ÀÉ?3ñ?ÿœü³ÿ“ñ!ÀÉ?;ñ?ÿœü³ÿ“ñ!ÀÉ?;ñ?ÿœü³ÿ“ñ!ÀÉ?;ñ?9ÿœü³ÿ“ó!—1;ñ?)!ÀÉ?3ñ?ÿœü³ÿ“ñ!ÀÉ?;ñ?ÿœü³ÿ“ñ!ÀÉ?;ñ?ÿœü³ÿ“ñ!ÀÉ?;ñ?ÿœü³ÿ“ó!ÀÉ?#ñ¿"&Iù €¸ü3ÿ“ñ1ÀÉ?;ñ?ÿœü³ÿ“ñ!ÀÉ?;ñ?ÿœü³ÿ“ñ!ÀÝÿ£fCþÅÜ¢ŒÿÎþ³ÿ•òœýïgCþ`ÿ2þ'8ûÏNü_Ê_pö_ˆüÁþeüWpöŸõ)!ÀÙ¿– ùs%ÿœýgdýO®ÿˆNþÙYÿ“ñ!Àùšù—¤ü…'ÿzfä/ׄ@\þ¥ì¬ÿKûœü³³þ/í_pò?ñõÿâbAÊ_ ÈàéÓ‹ºA¯»º±HG+\öå=DþùÅR±€ò/—0ìÿ\!W.Âü/7ݦ‡Ÿpù'?XÜ“=>S<ê;ð0âT独±‡K·iÚÔ¬ÑØ«ºIªå y¹÷íüÐTÏS „}À˜!Þ(*Ðô=ß–Î1Z¯G|<ꩉË6äÉÍ¢»]»`l ·Ù­Úz£é:·ô¶×͵]Ò6:)ÕZ3ï„QãÊÝD_Dº¨G葼¹ ôD"é 4¬‚îéq-¦FÐ_Nf|å¾ñŻϻóQÀOƒ™PÍ­cV¦NÎ=+~„»ð[‡nŠøìG+À&úE¢³èK"W»‹CÔA´ÃvMh˜|´MÑ\'ej‹Ó0µþXõüˆ¡ñ€±Ï2]sëž¾½õi'Î|+BäÉLh1jBÑi¢-ìZ0ÌÉF^˜ ø`&J¬›L«Lâ¼)uËÆ ÆŠc‡ŠI£DèY»Õý:Ù4Û×#ôŽÚjtÅÿ²®º`Ð;ÐÐsE?åŠj6:jƒž+”¢(W˜z;ÛO;WÅ!ÄG«ìzkM`p2ßOšÎ5P—¸ ŠˆüvS¯5Q†|¯Z· úݳŽÍžZ/;Ô5) ÊX‹ÎÙÓmBÍ|]º­:¤AATœ÷‡Ú¯&*¨³’&ÀÒ¤·÷ö@¿÷ö0ãÞ†ï÷–›^7)ºï¥¥Sk·)á÷¡só“^ÙIÜú_vÎÿÊóŸB€“vÎÿÊóB€{ÿ/;çåù/!ÀÙvÎÿJù NþÙ9ÿ)Ï Îÿgçü·”¿à䟙ó¿òüŸàüÿ‰ŸÿÍËó_Ba@þ|Ä¡¦cÙ,rÔÀÉûsÅ¥òb¸ÿw±Xþ©\!Ÿ/åþ_[JH}tððh˜Œñ0‚ñêQÛ€5¬·Qƒ!ô Ÿ[4ÛŒHäöÖ:‘@vd»‹gY‰¦ºj·E¨ÂrŒÚÈ|Å€üàvã`¹—m-f… ¢Ôk¦k$btLÝqµD”†¡ï'"+W£qúÁëá·5{¡ÙG:@j÷JÆç‘ˆM«c×èÑ Ü#î‘~vüUc›¦@ÈmCš–¡¥Jd5Ù^%ÛÆ6„Š„[æ}¶)X³Y;$ls:³½q<•ÝóÅÒ2Û=_c7Z$øÜ?_3’vͧÙa—3dÍfµã6-{e÷ Ô€KzËnÐp# Ç4Ú-g!Úÿsó¿ìÜÿ"ÇÿB€ÿgçþ)!ÀÉ?;÷¿Èó¿B€óÿÙ¹ÿEÊ_pòÏÎý/òþw!—9;÷¿Hûœü³sÿ‹´!ÀÉÿÄï‘ûÿÄ'ÿììÿ”ûÿ„'ÿììÿ”û¿„@\þ…ììÿ”û„gÿÙÙÿ)å/8ùgdÿ§¼ÿ[pþ?3û?åþ?1ÀÉ?;û?åúàüÿ‰ïÿ”ëb³ÿ“\ÿ÷ï-äù/0 ÿ=Hþ£ÞÎ0þÊÑÚÇðèý¿Åü"8û˜ü ¥R¾ ÷ÿŠ€Ó§¶*ó«šµOç 9åôé5›¢ÔWˆf¹äÀß²E 2û$ü¨Ð6ÉH¡¸R„er}gr¹Ò伈¹fçî8ƒ´Ý5è ¹?·Ôu”ÍÔÿ‚Õ1ñ¼ ÖR,á¿B¾H–s%ø¸ajx%5]GqÔŠø¸Ml˶ «¡œY·Üu½æbáDí+½D¶¡LQÎ8Ôí´¯¨®næIWi©ö-å̆Y³°Ô§(»ý´P*ÜäuÈîkNQ6+×| ½O$™J¤A]v_ßjv'ü­(q !Z§Mй29³ºþ•‡¿ÔZÇ¥aJRjº]ë´ê½&/B²¦S0>Ý sÆwÐÏ]‚Ü[&!ÁÕ ­²Dάը¦†ÚKËC56bÕÙžÙ¬ˆåÌ_3ž*Øû°(”Ãä•‚&4l09€9do4d<ˆ»…O[§(@¨ ,Á5Ñ| 4ˆº–ƒ‘ñ#'ªXmZÓ.lÿ÷¤sB”SiBßWM(™(£ú0´M¿| æ–&’!ì)“¼”§ÿ‹$Ý#fÑ|¦ˆ <ùLÆÌ0M›ÓŠQ˦_©‚,ƒQ¥8€ƲtND™"­XžÎŠÊ̤ÚC,´YÊZT7w/œ>B…"g‰™~0¨)Þ»dæ²îLzmA¬Pö½Ø«‘F© §qW"÷|OàF¹+hk¡G©ŒÈ˪DǦ"éNk]ÂÃ]Rÿ>a®NÁx¦-¥ïOŸ ÃP ¤$Ifb÷Íìá³é̱õÅ~øBF­R‹¶DEµ¼MSŠã¸{SFÔ$Ñ ´äúÛ0«™§¢ÆúƒZs€j­ JáCág‰8˜Báï'·´xŠV¤OÙy¡­‹V U)“@7Ú;|!€ –ªÌiq@w–j¡ç£’ªj²nÆ\2½šJçúÁˆ p'&‚ß,ÑíE©Fƒ¹¥5bYnŸ4@†QÏ­ùÖ6»QÀ†If@eé—6¨ú¾OöÌBÎ5[Fß«,8r|F±çCôIÒíc¯¢I&&“Q»Ʋ>¥[KYÛ…Þªu¨\W«”“òzÃ,Â+¦jWóàj’aßT’&« M)Œ/ ÝX¤-°ÚšH[ÐKü}[Kš§?Î’^eÚ×KÝRŸÏWÒ@›ZRÈí$Y „©ºŽºzBû8m’T¿¢%ëNÖóW;ò;êµcnËÆøp °iU3 02µé`|%M5Ð*½)Èü;Ü› ßæáݺ?7ƒf©*C†¶A5ÐKpç1౸¬‰"/¬¦Û‘÷h™…›XdIjõK'µü Á`mFë­;ÛB} Ùä/å‹Ïgµ Œñ8å¡É¢!&Ò`^Ng)@Á` ¼G°þCúßA%}®H†ðŠ€ÖAØ‘[d ?7” @u’–5ÊJšV÷Ú*¥2’"¢žÛ»SÌdÒyEìÂäA@²2N´¦lEÖ’,<4úMKüj†…ñ ’!¢Ê|NÁ¸ŸñA£E³ºTlYøž /§@ŠD£;¢9AS2Ê`zkÕS3íˆöD†eª¼Š¸–ñµ×i–nH ³€‹’™D€±PÔöˆÍàŽp‹¨;ñ‚Qþi‰ˆ5³&âf¢“± n±ac:f†Jiˆ ²ü vkð<ú‚lÏb|ö¶Ì ,Q ÝÄ„˜•ŒŸ‘xвÅÊ¡y*RÃÌõεØOg‘ÕlÚËlý%åtšJø¡“I*Ô³›ôŠ •¾ìP!Ÿ·Ñ YiÀ–e6heT[¦ÖD/d"™%¦.šuƒ†ëÁ¿áøh)=ê×¢6 ëÝ<Ã"2,ÞfÓ*~[ÀìA|&Kzg³4#W30QÃBfy£ÜÁ5/ô s†œóŸÍˆúG}­m3iÌŸ—éþDÛvVíª)­¨8èÊLÀxz E:jÉ0N%QÜ,XÜ@¢ÉîO©{ü::ÓçÌ™N?#›ÞÐ0(|Ý9³µ,ûÁ‚³€{:…nRFß·2C J°‰­ 8Ìš BÐkzøbbW7gN=ŒH9R×®ý5sTkhð¨F{Yë@­Ë´I Y€*«ßÛç€bø¯4„–­ï#9‹´J2.èKmÄÐæŒX.N8 “žjxQŒÖdÉÚiöÍthÚ,E -©´š?„"ËoIÏsˆ5d1DŽ™ê[ ZÌjøQ+Åzšfkš¥¿¦â»€-•é‹cÁr1Hèc &B3´&J£ "Q…Ñ£9¹®l`ã$⌶ë*Ì4×3í˜ú¨?"xós!ò³1£O³iJ¿‹Çµ»°zœÖ¥Iý'±–Zîåöf;™Aê@`¤lú%…B6&aRgEýÁý3I¶ wêíRu’)R”“J+ž¶ŸÑîhÇ ›ˆÚ@ È`+ÁBFëÙ,þÄ"#ƒÛàÑÊÝ!9zÌì‡*¦˜*U‘©Y´h 쨵çÛ*Â.Q>J°#VŸêSkLègÒ“74 J6ßAOÂOí¸Äü¡2möê—0ëÄoÑ¢jSû#DP“ #U’UÆ:NHÑðdN<—É‚(—„¹&A°*U¿+‚·:!àÂ.á•5àÚïe ÛÆm[BwCL; $EœÛé»důÒ ¡E`¾„\€Bñkyó´SqæÌ!¶B·:”I`E²Eû©›"B°Çkí‚¿OÍfêIC¶d>¾8[Ãæ-]j„xÕ½v¶ª×îåNëtŽK,J“†O I¤ÞH†¬)WßÝ‘ÑVÁ™ª¥DXÂYLSy_|mN}E·©ŒÄ­Ádu¿±©àìsá©'·«ï,$C Y 6ØKq<†!Okhæd"ôPØ]ÌñÝ «^pÝ«‰°¶Ì²ö–ûqF5!üöøÀÍrÕ†B,‘°¡@c$¥ÏK²êŽ€g”ä‰AدY9+Ø8g öD”Õ®,ØÆŠ|5¬¡­]‡ãeÖ²Âãì$ˆµBرp9‹qcªó×ÑáöŽŒºÈR0ÞrT”—ÞÇ"«Þcò+ë},\9ü«¨«lìEÜØÄÞ‹[«èi|ç†a4aõ«—²•*×&âÖ` r¡Ê¦³î6ÅYåljN#DV½’<äîå»è‰¯c.Ç´î^BZ%i5þªœ©`¸vD€V+¹¥®Ð"\­žÀ<è¬L8êÓ†S¾a“ ]ãñr¶z12d•œ7ØmL\&¼ÁÛæÿÚ §Ø ÛÍñ!1fY>eÅXˆǤ Ư=w}uýÏ =U`TÑÿÞ;¾ÿŒpã翌É5µµ©y&ë3SŸ|ýL”‰Ô½š™3' rMpíW2МÎàWOf”•&p±¡d‘Ï2ƒ×¾´r›ôbðó~ÛÅ_rõäÿêžýÜ+3^›<]ºsÓ¾“þukÿ¶{ûÿúýçÍ8âÉ–3¹–—_ðû)GìúëÆe»î|´ûÆÀ??¶~èòwÞxmÞ–›¹ã.»ç½[§¿zëôý~-ã»ùÞóß¼d`ÝEŸ7îÄ÷'nôßß>pîYñõÇ2ù7¯nœ´ij|Äsžž¹ò´•±Ïþý‹yè¿§wìúì£9o=úü©o_qê»þî?.záÈG&½9ôìpòó#æv~rΆðŽÛ”sƒË®n;òê­§Ö¿1móœË;&?ƾò‡_­cé;ÇÞðŸ§=žýðéxìÏ“2\ͬž<ñÄØôã÷mN>ñȉ÷LÝ~xÇÖ[Öm9®ç“_¶~¾åÐóÿJ¾aÚ ‡³ÏMm+–÷Ìê»›Ì>òà%k÷ŸØþöÆë·­º;¾îú•×îš¿è¦×7Þ¹suÓím·qg;Ï~éÒ;Ÿ™ñôŽÇê¾dÞ:å¶áØ?jèÌ;ÞwëÅ|®î ÇŸ:cÿî›™}Ö­›¾Üü“_¾'=+œ}ü˯™ööv<Ñpø»óþ(sýª/W¼|è“ß;ả·_zì½üÊ[^JµOÜ0ðà™‘«vœÜ³öç×lnºëšÍgÜpýÆóνà‰_̺þæ}o9ûýwWOßú”oóÒMCy¨ãœÓOûÛ±‘Ç®XÖ~óÐ=/­YõÚeß¾cÅõçw>¹Ï‰ï†žÊsNû¯—lo=àƒ«êÊIÂýw¬¿t󟆹ê„û¦7>÷üwð/yæþ§M­RßøÎ¶ÿ½ñâ5Ë®>ðì5;Ï;úÇïlZwÄ£‹ï~,3ca÷ú¶/Ï;eWò¼;'íøèÃäGŸ^÷âþlBçïn>ן¿ óò~ÇN½}û…÷´ÿSìƒóg½öwË®\þŸ“n9üÿbêa¡ŽÂŸþÛ¦]áwº×žð—Ø­Ë¿ë»Ì×Ú²a Û:kÑÖºM?œvACç‚?/<ô þÄ•KhìÛ™i~~ß©g\þraýA[vn™=áæ}ÿôíÛW^gU×D¸CíéZOÄŒ¬HI±qJ:€žn`‰(¤ùùÒ ¡‹ëõ…´L IWÁ’ Ô¢_~„Ñ@¶¾&[FZe)Ñh{ì ,UxnÁ ºÎ¦b$@iÆïOX–&À`æår’ª´'0£3Ð¥øf‘D :¶a[BÑ%_…NO i§Ô$™N‚_Ø!Ë£¬P¨Â«|Fê5š;@qƘ40e­KÛРWL8*RR}!††#ÚËõ°ÂXÄ µ˜­H¶Ô¶T ´aed˜¾\®V0Q¡ÜÕqIr”„¤…$ãLÜ^/Îç;¨´”Y£ óJ1‹-=*=2 R¢\· ­•,ì“U;‡Äýlˆ ói)‡§¹Ô5ÍÂã\‚‘PŒ… 3ƒò%’àU¤ïBPçÜ„ £â.\´3oê:´:´­êñT5#Ö-¬7¹8(‹= ˆ}ˆ)íCBbQ|CÐCô<6¡%93/ Á«3å"eyôí¡=Ÿ.ËKÄÙ²gC.yÑPy^8*Ë‹ÄÊëE–\kÎõÖp0c£öH“ÖBùáŒzyÇL£†Ë°¥6ÍãX÷À!¤:ñåÏè O·£<!z”g" ˆBe±©å0Oz£F¾$RÈÀê£2‚JÊ ß™!<Ú$ÐHT³G…0– SÂÂ!Ú]0èêÔY*ýîp#J¬¨˜§k6JÙ<ŸR[T1 ¿~Î&a4eUIw@\œVÔb‡’å3 ³À6š*¨h ÑM6ìÚ¨ø‰^H´µeÉ0ÉÙ½cZ÷¤1?­uü´ÖŸÖ:ú—#þÛ{Î÷ÿÇärøÿ{òü¿X8ãØ¨ÿŸÿ0&WYÿ»žAÞ\Ȧw/öëJü GJûÿF9ȹàxü7&—-þóì{kìç~=ÖÒý: ¯‚hŸ[Ù\×\ݵÊRý8EÊ‚kWÈQ5wœ6m E§qÓÑGßó ÇG^hÓ[~:C&ð½ìQÖ¤QúÀ‡*bDWCð¸w"àÍ¦Ñ ‚ ¸€JysÖ¹Z£RüÐ(e »$YãÊ %ˆX‰–`X!¶@¨µÐŽ.³Ýà¸5BR-0ªM/ºø ªF…ØÀVÓ›ER·°-Åçpó¹)¼¢NQ´T}ÍJ„˜Z‚/ ^• ¸‡¥gˆ52°Àƒþ´¬ |ªðÄ”Pª)92ÚÙšh‡Ð¤6Òk!')Èå]Š™zÖÈ‹Pq÷vM‹*­s@{EÀú{xèF‰ŽÝ|§:[ZÁXb¨¢¤-„¡†°yÅ’Diù²Ó,ň§š/HKU’MI,hZ°|^Ëb׺£ŪÑg V‚4I©BÖØ¬X³B„Ð(TÒ¼Äþ]º¨$Ì-—¢ÑtµŠ'Œ¶n:M~´;ÛìîÀÕÜteØp‡Œ»3*kÒùâp0¯’|¦ h*[üJJSa¬™åDg´Ô„´”¥Xßѧ€HŠÃA(¡BN:²ÝÒàp{Q7 Z²³X,ŽÀ>…Pº¿V=c˜&:O‹›j³šÆTÝïgc¼JÑ/Ê`ÛúÄLždEµO:É‘âq¯ ?i×øt·W|jDH,È ¶!ªöôBÛÉ–…‹–ãMãŠäⳋ†‚Væ‡ßuÖ ˜Êg錳LçC°Z ­šÙÅ­ݸù„0e]t¦™“ƒ¦‘ºWƒ:Pƒeo·â¤XRT rp²€ãqÖœ€´°)ò¥ð#³ùŒHÏ»¨:n@]|ØË@eò3t¶S°š/j!é¶6é9À+¤WƒÇ)¹YÊj$ƒ% óWʬZÜ$Šji „_”{|mTɇ.ÖÚN*Ÿ¯Ø–»Ž){:ÀÚË/{üÏ÷Žù¿ñóßÇêrô?»×ôÿøùïcr9ú?´×ôÿøùïcr9ú?¼×ôÿøùcr9ú?²ÇßÿpìxÿáUÖÿåÇWz÷ƒWå÷?‘H0•¾ÿ âú¿`0Ä¿ÿ‹«Ê”Vµw?ÕÞúx ”ëŸò·=Æ›×CT0k{o³;ïkFëíFB{¹ Ý!wf|M/iFíõ ¤DB"èEÁÞój¦¶×2ž¯d´W£7ý^“:Œù»ó½Mu&±_?“N&ú X:{Õ1s9‘¹VÎÕöæ§—V­-ð™t.K•‰ç уÚþ½g‘ä¸ ÂlË ¤rðÚ»’wgú;3—ËÊçû˜ü¹Üžmœ»³é™î™k_ïôx>{»^Ö…”€ˆäˆ‘C"‚!‘0Ë–Lˆä r™¶ÀrØr¼WÕŸêžž™îùô¶í.Ýít}ºêU½O½ª×UOo»[}Á·ZîŽ)ÞV9‡ñ–’ÚɼÒ#ldqÖ±Ñã#Í×2–¤£2×ÑA»Ç<‰á®ðä^ã¶æ`»ÇpDöRNÔK¶)KgŽók›Æ„®Ö' ¢”ƒý-³~ /öÀ}Rf­œ1HÐM/’ćžGéÖ3»I8 ý%„UuaÅ~ðnuXÌC{ã8Ó-bvÑÉ”¢ °^ci‹Æ¹ò7:øÉ+°r?|Md‡ôûmxC"ãæÖyÍíüzûôÄ•BcžˆÅãe «ÊduxNÚK×äÀ÷çpÕΧϕPŸÏR¶=¤>3™‘AŸ«¡>ßì´¬†nR§mÖú:ï Ô„ƒP;Øg÷1ºæÕ€×Ït`lNR°çùk=Øð, y0'èé1œ° ›AÐiûŒÚæ?{NÀÆØüÉn×amOVL@}» ñˆ­I"íüµ(Ô’ô¿Ïö>. ½Ñu+«sî—èö‹‰Ø˜>’Áç¯eRxæFXD/%—K}9Ì”oñòe¨ ™£L¼iJ š°Út1Ú¡ì÷än&R¬Q Çþùz“ÜÚ§A92AŸ«¿Tó™ŠÇ@©P3Žµæ‡ˆ$ô–j,"h§±J§Wô¦ì¿+:7 Ìk@-£òÎ_Ûj9®á`ð`bHŒquzŒk.Æ}E ÆY‰ä~·5+¾idi"¬Wa=Ý:Ö+Óc½Â:¯E€t3‚k¿î!½–é±C0+†ýÎŒêZ€êDû 娮Óϸ•KƒNš ƒrÊæÅøæq˜©C«¤,v»ÕîËÒYÒqo›IbJX¥XXñÈž§ã'ƒ5”g˜½~bˆ¥”Çë›í^8o.*„$§IÍjxuÖ —nb¹½Óêê†é½ìjô9q””]ˆW î0»Vs/ÑÔ25%dZÈίݢ[í4<­¥„"~ =ŽfÛÇØ|¨’´êhê;ãØväP–­·B๻Q°¤Å2‰«¦.~ÚJ\:ÐRÎrü,áA•‚˜ä”„?A O¿X¥i9¥¸—ãÅ=×òl§•š”¢\ŽåÇmSoÓzvf’9Qîmí8–‘dç¤:º™°QZÎð&kðº·oŸÄæÅéÞЩȞïÜŒ±Ï÷ˆ·õ{ü#þø=ôá»N¹aß NzÄæ^°î¡C~ÉNsÐýÆXãònƒqÌþ¢º‚­²ã¶Ý"Ы`Œæ ””Bâ=J÷–v2‹±s¤¾ç¥M8àÂvVb¹9rÚé`܉7—Ó lH/3 ˆôð…œ!è)ÿ q¨4?$Sq€ ÌÐa†3¦ågðÎL³C3=ËH´*éyÅÏ LäùœÆ¥MÍ_øv2Ö¢’9žµ¨lœZ3~Bq|àÊãE°•ŒJ·0FŠÏLá´<½Ò3ENk,¥&>KÃÈ.æ Mb²ÅôdŠ*ÛV¿aß 06wjRô«HF!Ý$ž.9ÃD»#Hf8XMJ`"ª{Â4– AÀÛxt»ç0ÁŠGE~Üq<4YM«Áìs -\4u¼î‡õîõ¡Wá·MmT®ÐŸx¬XM¢ô Š†ŽG¨LcuvïŽØ=ÌcÆÛûf ïàmJl†›Z°ãÐwÙ7xå?ÿVî˜B(£s7:Qúw7æyîÎ…;XóåVç(mž¢Uúƒ&Vº×m¤àe"Ï„,oV¡cz¡= ê;@Žq^õÁQäùˆûƒÓ•òÀ6åéØ0‚”ÃXÄY'¶ÄLìãV2gòíëÍù.ƒ@j )Oäaÿ…KèP˜N‚aÏÑ¢MÅ l›”º»—Ë3Âpî,LÀª˜/ °:§˜C¢†;V¶ßm¥àmÄZðrÂ!hñ*÷Äøï¯ð&XcXÖët‰`&ùDŒ~H8ú+±ç°ÊŸ4¯!nC |i–³y­:+»ÆUŽg= î0c.;;›»5-‚Û} rr³ü4Ü]ÄÝã õo"6“ðyd´æÀðQ†Žù„4_Œ=_o™}CŸSÃñ€§'”›šŸÃõ̼>ü¹ñü¾6æfûÄLNy<õçÇsšª:ü…7³BôLÎè.Íkÿ: ÍO¡–º4çm`„¢C_jVzO³Ý‘ŒÜ½ÍŽÃ¤vÍ£öD§*^T>Ü•,©»25u{K«PtˆºãKÍJÝibɨÛ[†&uW<ê~ÉðÕÝSlKÃøãæ:¥XzΧèpÎ,TŒ̇~©)`ÄYDŠç¦—’œñÝðÙÄ™É.ç‚«W=™‰8ÈJ£A³íì­¦$u*Ra›¬îCˆTÂ9³Jòm×I¤’`£5Ø:L~ ”·_Å eŸ#°³¡ÉIP ‘àð1Ñ9íº´MåUxéÊ7c§ã_ä‹êuôX¢7›€@ÓÀë­¾«[þÓ w,.4m½EpÕ;è;øzƒ}¨7.¹~Tô:~Ž‚>˜œþl¼‘vgÔŶãÙÓec´ÝáÜYØbν­) zÃÇÔ¦1åIIMy[¹Ú›ÉƔׇ!&u:Â˜sÔGoŒî «ƒø»U“ïTŒºMuPÜ¢ú& áû¿d=÷ÿÉe(VÜÿ–AˆÜÿ¦6þá_áÿ+Ã0„ÿväúmÏå´Î¿m²ÿßJ9ðÿ«HÌÿ“ZøÊ$ŒðÿÅýhç¿Þ-ì¾ÙqžÇÒWÔí/Í÷«úüjw„Ã_ôr"ÕḚ̀›Ï?ÝcðÕ3ë$$ÿOì°ëãsÔ¥ü^vŒàkŽ^Ó²­:»Ÿp¼çÞYý{cë/8•¿ß¡ÑŸËMƒ’Æœý¢'ÊÆJyyúÕÊÞ ¦9¶W‡èæ7 'q(”ÐIÇ“üôÌù8ØëAJþ ÿÀøެÿꇭÿûë?±Ðÿ³ý_Ë þËþ3 þoäÿªTà?‹áÿJ^ð_.ðŸIˆà¿šüû™„ˆü7ò‚µÀ&!‚37ø/ü¿e"ò¿–ü— üg"üßÌ þÕÂÿ_&!Œÿj~ü¿üŸIˆà??þ_ þÏ$DðŸÿ¯…ÿÇLBÿùñÿZ)ðŸEˆàÿ0ý¿†õÿâû¿LBÿ‡þý_aÿÉ6„ñ¯äçûßÿ™„þócÿ/ì?™„ˆüÏý¿À&!Âÿù±ÿöŸLB„ÿócÿ/ðŸIˆà??öÿbÿ7“‘ÿù±ÿøÏ$DðŸû±ÿŸIˆÈÿüØÿ üg"üŸûaÿÉ$„ñ_Ëý¿àÿLBÿù±ÿüŸIˆà??öÿÂþ›Iˆà?'öÿÂþ›Uˆà??öÿÂþ—Iˆà??öÿÂþ“Iã_Íý¿À&!‚ÿüØÿ ûO&!"ÿócÿ/ðŸIˆð~ìÿ…ý'“áÿüØÿ üg"üŸûo±ÿ›Iˆð~¾ÿ(ðŸIˆð~ìÿÅþ&!Âÿù±ÿøÏ$Dø??öÿÂþ“Iã_ËÏþ_±þÏ$DðŸŸý¿bý—Iˆàÿ0÷‚ûÿ‹ó™…!üOºu}Ýì¤Dðhÿ²,IbÄÿƒ$jráÿ!‹°|õé­µc†S7פõ²°¼|¼kâ•äGˆáôÉ»ä›HëY¹¶Ì%"ÉGdø§‘ÛÏ',ÖWáÍSøÖ ÇU‚w”CÚY«o›GÈMðxZo™=(ÄÖ6°üΠ>»ntvYŪ¤©ªBæÉ¶qÜÙF×Z=¡§ï˜X/? ´è´„Ò §Âjô±qbàƒa6/‘^A.¥žÙtnÖûV[$û¶޽$”N¶¶z‡Ù€nIÕ^ ¾G+ ‘ܲ lnÝÆjð²H^Rѧé8úÿ€XMÓî™þ;è@·m?ÁmQ)F%›ƒn„*…ä0æYmAhÁÒYkÛì­q€{×7.o³¯ÛVcDæŽmŒÉñî›öÔ†>:gí¶ºmÝ70Ç”ˆm;œ=ª’ãΠ Ø•>²q/?¶i>sD ÛÔ»èçæ¦R·Joº;c2ÏGÐÛDæ3æÒfǺ¦¡²Pj8N×XCô­5õmËÞ#!üQ(à>°ûJÑš(©×éSq•ôºm2ŠF0K›í-L:¥SR×ˬ:õZ˜b ‰_$æn‰‡D_bð-Hß ó¤ÑƒZÛ2€7Î]€îCÈÂ-a‚IKÔH¤•íM¹pä«N¿Ï^ã^ÕbGUeµw@ˆì—šè³ýVuôþEÊ^ÄE×¹d¥^t.“}äs>¯³Ž¶O$lЖ¥¾…B­bk´|â ›ÜEÝk(Õ°ô–ÓÖí^8pÑq.1·8Ð|Ÿ¹Å±!&”ÚŽa²ç}̻ث³_¯i´&–¡t=©PÛé¸E<±ÿyHKT®v@Õ$ûKËÄ"÷ë K%öÀQ[é^>bñÀýý¯@_išûºHZ}¤é¥UK—––ΰ©$…DàN²í€àq0¶r~e•º¡ˆ°êÆNEW®wÓ蘭_eØÌI@pÐÎ!ΠlF›ˆ|.Å~K§z`xØ4ºúer¸Õ ÞÙÐåNÝÕÇáa×Ïí;Þ”C J®Prs¨ûÝ}èÛ2a¤¨÷L„Ñ£yÜhbeåƒo$YzÙà%Z CËB„c]ÈeÒõÇ—ŽËÒ/ïu:†þxdâìvºÖ6íô`·Ú#Hÿ=÷w·gÝo’=ü )Àuè‚ý&%êNh7äIšSf= W·B…¶Ó3‘ÏÃè4mÛêôÌ{0Ç ÔÝã®»ËÇBY|ζc¶ëáÅ€~™`–vÉéwõv×ýÂT ­0©KÉV„ÿ¨ êÝP‘éU´m0&£Ly>õQް7l}ÏìRæí™÷ Kç`Ôi’+H q€îÉ1`.t!éÙ蹞¹Zù>Ábt½ ÿXDá#©ú‘ ¨a$¯˜y,ÅÛ/më»ìÑ[ÐèÝp’°®Ë/ ’Þ Nü·׌’n;ºAI™“r(žAꉹ¹œüŒfñb3œ—ÓvûÀ‡J&¨{|4¹{”ú¶÷N¨¯„N¾ù$¿B/Ëî‡Y-HÄnMú¼è—-{ª,þ=ŇÅÜU¿«má²^€åbœfãIDAÄÇm«þØàĬϺÎeÙ"kÍKeFõ$ä¶stoÐ5IÇh¢r†.Ê@ùß5„̓§·Ö蚿ӥN͉ӿh¢÷oЧNX½>Nº]¡ä½}2M:k}ÜJ¢ ¸Ÿ]âÔ@ÂècÐ÷5~œë޽Ž:»ncã:ÒÓ›&qÚ¹ÙÜ .ì;VÕ$[o·À~6ÍÚ&¡Œƒ}ÑoB¬¹Ëº•£GWaFj“•sì×,RlccD1Še†@†2¶ t@Ýçð†ÿ‚= ,p(Ю{õ#ä´ÓÁ¸d3Û3Rj¸!S&žHo€õ´(UH;&ß|%Æý\”ÐNŸ[/—!‹ûð™ b á—,É ËK·‹ >JbÁZéa¡ªEú×gü˜fƒ<·G?P¾;‰b•FÝy…Fe?Zæ#ÁŒƒ€Œc~M1e7v8àuIô*_‰÷ùº*œS×U‰Ð?•u÷A]/ÃŒ¼.j¤ Ÿ&IëÕ*K¢‚—hÙ JËÉë²æEé†Ñ Â.ÕpYì+ ¡ˆ‹_))~Ëë¥6¿£]Q$"lîÈ(Uu‡–F+AT EÇà8 Ê|›ƒçq4­ÛŠjͧæ×ÃzŸéñ$’µ 2at1 ðiZ‡§¢Á_E®¶õÉ#vj¤Ô'Ve"kUœZi¾ •Heîâa¥ÎWÊP]M#ФÀûð+C¼äM³Z&ê‚¢€Ð­úkE©„+cTIG «ßíêDTÊ e9”•€ªó9 J*A J±iØm榦e5E!šOÁ+[:õ# ¬¦­W¢vJ±è³[<²Ò°›žyT7 ˆH”7¯Ç.ÈŽ5‘rš¦RfTÅ/*2ÝgW4ʉ\¦"B!C¬`UEܨ‹åBl¢ê£Ÿƒ‡p©BÔÑ¢|1•'å?E8GJgLs úz$ü©xôÁÒNßž#t™ÆÒŽ1§ÎG’ÒÖ Þß똤tû™Mögå£Q2TiÈàÜ5º÷T/®_ìoÛ«dc+òß¾Ùj_JÇn½ÕS˧մ|RSC¤&¹Qwœ¼z:O8:–ýÙÜÊ5i´^EݾϮSñú“¦Ì"(”yÌËR (€È1*ª€þ‚ÌÃßEr4kÃç:Š3)@!Íg`ê)ëOÌ×óR‘$¥Ì«H’(2Á…™ˆê ڣ‡ ©¢0J«b 2ªÊ‹m•šöQn‹@_T…ªò’»LÕ EBU(ü•+¼e™¶å«8Ød9˜¯E>:üž®þÔ¨žuz–P™ã„˜‚S2 4[Šê²BuM¢˜†JÑÐg–d8i»3pmá3°&ñ“¤&†&ImÆ8måIѧr3°Tc‘Œ¿³ÌÀJÉhÈC3ð oÙóœ‚ʼn›£¦g¯£îˆÊ°hâæK &HÉqÓs<(ómnJ ?9u#Jæ³2œ›~÷E‰:«(q§3O”h,*UØ.UÕ…Oଠ‚¥X &X–;Ë>eýIÅB… ø@"C@ªS ©dÈ5N(ÌY!Ÿ^¸ý󸳪aÌcNˆÕ‚XYåbSH‚Ù›šV À’´* tªû̺Ïà•y08§+€ªGuTÿÊLíƒÁóUÐj¸„—ٌ삙¯ùÛ1•/ßk3qþ•'eûZHéž­\«Ñ=·Y_5xÆwmpùà~¯›žv…E¹jŒV¸ñ'nŒOÒæÑÜ”R@ªUCã¾p12•,ˆØBÜŒ2¯2L'$jóÜÚ^e ÁâBB#„²Øíq©ŠèƒYZä±-D•Y¶Ç§¬?ñâ`^Ëx¦ãÊ\¡Q*ZC”ìe…[†+U¸ƒŠË{º„…%ÿb—á8vrh™¬ú •"ãFÃè-ú…ÕŸU³.ÃÙêD ¡JTªà—¢JäQU¡ËrE¬â¬ª€JZ]ô~I™T5~5ÌY7`¥\m³$}å‰uê¹q@X­qÎG¼‚ƒøáTº‘…¶BÀ¨(¡ÍBY¸Ð£›fPb”®”£Ì´2]ý©Ñ43'¡zÏ¡©†´¤ˆ2e(ÒÒ¢÷¥ ·Ö ¤,ò¤<Û¦â•OD€ûõŸà}æ'ø9죳]ÝÂÏŸØ·[ì“< æ'»gÁD¬IÞ=yÛ)á°ĽÉBúóŸÛFÚs¹ãÏBPÜóßšRVË<ÿIï*Î.>” ±rºZkhõ†\7k Õ+µZ]ÔÍZµ®6|EXlHÏÿ°ÔOÙÆþWeU:ÿçÿ þ_|X>}âÔš¸. ËO¼øáO*)§~¯pôhéfö4¨äLé”eã©ÇÒ)¤• cæÆ* ¦¾-ìþêïÞùÔ§ß^¹êž¹óé¿ùÌ#¿}å7¾ò–•÷}ç_½ó÷/Ÿ|¯ò_¨\ñé‡+/¿öüÕË¿økWýÓ£÷ýäßþÖê{Ž¿ü¯ù¯×¾øâ‹_úÔsO|饧žR6~ê'ÞõÀî[_|¥ùHó³ÚWìá/¾íÙç¾çþú|þkß|ü…çÿóC;¯ýñÓ7}á箸û/ìþȃï~é;ä¼rãô?!½ïkÿ¹õJïëÏxø]<ø+ÿ/η¾Uݶ¾ÞüàÃ_úì-ŸxôãøìÏÿû/=÷Èþû»ÿäs×õ§o«¿¬åþ÷>Ö¾îS_þÿìjßÜyëÝWøõÿè+ïú®4?¶òö÷üóç¾ýÊÏÿ‘uÏGŸxáݺtü“úèO½ÿÁÓ­Ëÿì;–ÿâÎßyõÙÁgäßü‰Ö«ß÷Ð<ó¶»ù™åïú™¿|ËÆßÉåO>öÐU~õûígÎ\ûðvê‰Ç.‘'aã´úNù÷>úØ]øò“WüÛUOÿ˜qðNõ‡N|ïk×þÿÙ»¸³÷!i—e~ÂVdæ}ç}ß™…­¬”RnÛ]&¥Ñ½\Š"rk•KˆuÊ–»ÅʆÅJŠ%÷°¤uÉuýØß9ç™÷)5Ímûüÿs>¦ó^ÎyÏyÎsÎs9çùþgŽpAÕkQNóò–oge”TTýæôÀV‡-ʦ¿1U–Ô59m®ÙÓWÅ”ôÃꔢª“áVu¶7éÜ¡¡O—Þ²°9n1¤ì»ÕÒÒöö.KÆDuØqÌ®m{÷Z‡HÊüsz‡[yë—YYnúeÕè1ü½|rÐoÝ¿HË<ÖMb»HÔüúËl/îy‘2ï6¹|÷•‡L·ÙórbNß27õ³®ZõÖËãpدDÖ_x8?·ûbBë'.ÿ±ý{DRØÄA_ä3uööXägzÏìÑÀ© Ä®¡MÜÚË»q½'ñiS ÜËfðœU(Ùì‚ñ ‘üÁÌ8#§EJxP5à¹I‚BýGLå¢S?²þ~ž'ÚžÏ僧Б4œœÀe™Y4âè%‰õá‰Ë)™ Þsš;Ä ½ŠÉ^q†ã0eÀLÆã#F0>ýƒÑ?8üñã}^ñ(¸¤ü-YŠ&pQ¸¨1\ްР®‡®Å ÏÃZY¯bÊ­øÇúK#&Ê‹¨T%Té-EÃ8a­ŸR›“´ÎoÀkïÙiƒ ®¯¨ÝcSç§0c—ç)DÃË“5:YÌé)∔›ƒýc$£˜C1tÃà5¦fx cÞgõ`Ú ¸@I´•“—wHHDLlL`thd,WÔ#A#PPšÐˆpG0Ò­ûá| (8…!Á÷Ý"‚>vKÏÆJ5œo­ñl|­Á«ƒâ`T+_:¦/ÔÆF3ˆ•J¬†X+zqj´$!9LD+.EÁ–Ì•]Ã>è]t'\~ ‡[ßT®aBTí*×ÀU²ús‚jÏaYí9«þ-Põ%¨^²6©\ó«}3Î'ª·—/d]‹•™ƒ?ž·…ác<#м ÃGpqz¾êÈõ±ºJU=p1–¼æi§·Ï{½èh]ýŠÉ¥þѱˆ(¸@(0–jI*ú_ÉÿmŒÿj¤Bÿ†ÿÙÿÕ I…þ &þ/eÄÿ3HR¦¿°áÄÿ5Æ5HR¡ÉÿkÄ0HR¡ÃÁ2ÊI*ôo8ò¿Qþ3HR¡ƒ‘ÿòŸa’ ýŽüoŒÿn¤LQÑÿòŸA’ ýŽüo”ÿ ’Tèßpä£üg¤Bÿ#ÿå?Ã$ú7ùß(ÿ$©Ð¿áÈÿ¸‘þ†H*øŸ Gþ7ÊI*ôo8ò¿Qþ3HR¡ƒ‘ÿòŸa’ ýŽüo”ÿ ’Tèßpä£üg¤Bÿ†#ÿñŸ ’”éïÏo(ô'Œöƒ$úcÿ6þ3‰SFú0U£?s˜dŠl`HPÄDm ŸQ‚þøù_@u!΢?'8†”ñü¯!RÃÂRb#þ³ÿÙˆÿlÄ6â?ñŸøÏFüg#þ³ÿÙˆÿlÄ6â?ñŸøÏFüg#þóÿqügƤþ³P@üÿÂfÂùbÎÂ%9‰„_J]ØÏÚTS+îs ð&rSs=p ¨¾be``%p°£ï,„Ø¿ ÙðQVÖƒ0 qLåšÁì¬&x³:©NSÌYÅÅý‚Îj«‚È2#žÆ8è9¾ÁÔÀ!ñ™Xú l. ÔŽþ"„T¡À±ÏƒÆãˆt74•â,HÿÑ “cÆAlCõ–uýTTËh€µMX‰QGÖƒkF¡äkÅÐ`¼h¹Äl¡t,B¡CˆÙY°´p'iàeˆk xg`i¡Ë4<Ž#§¥~!ê` ˆ §@ÞÑŸ®Þ%«ÍØ8{±†ð¾4â)Òœ³Å€³Ù‘NcC'K¢ÁOH´Ä?È€‹6Ýœ!sò5”n¢š[ÄÊi²`k]Um‹5X¦²›Ó½JwªFp³5®ã2ŽW‚¢Ó\=cæmE~™^«XáI4N§(„jFáú]¾ $VQ½1°¶Ñ£ŸÂÕ–Åu…&\¼„C‰ÈW¸PçJ¨€  èB@ë½€B!ÀT@ã)>RA æT7£ZU7†#[ÃhˆK ¥Ž(É ±¥0èˆ?> .8Xb@ýJÞyÏÁV±ù §#%×µ5çmíÔ´DÌl¹„« ÃH¨ºIMÌBýj×tBöÊ€±L Ð¾'ÔF»Ö°|µù§f \GüC Ñ:)ûv!˜û™US( wqÉG7l'öqkbÝÜ£‹Ê4äJÄGŽœw"UÝúºÝ( i«A!yUñåÐÖÅ.Ö$ÐyÐ5ÄúÝW«€²“¼~HC…6C>k³«N£ÒÕfšÅf±& ¶Bç¡bÕ„9¡Ì+§ãh[•ÆlCp)…ôc ä5;D ÛÙ´âmuÈ/"fDH(ü‚T@ Èmz^nàÌj€è3í¯Ó†]ê_¸Úþ™q¡Û17@Á„¾i ß4²±|ÓܸN‚û²–Õnæ…÷AybžÍ¼@&fö;ÓfX–çKéàˆFf^ʯ7)µ¶Þ!¦LJ\FJAuR Äh›²îà>Ü6ªçmôß0ÛäZ…õÔr›†å×›TÚú±iߟP‰T`bF¤·©X[ô‘sn#hÓä:1Åb: .½p$VCn`=i…$K6D[XG±®v^ W—€bý³ý»$.fûwQ–q袇Õt'쀜.ªÓø€œPÉÕLÇ:P1 !á\kéj&^}—:Æÿ. =«„̧Œ–*=;é:X{"Ålç.}W‘CÃòÕ–ÑÕ>¬ÿ¸¬óž$—uÚ“dÏ©yåcœ£]Eó Æ:Ÿ3-†7­3<ÃüÇX‚jØ­^¿-ç|…¨^3íêÃ>ð()³KšðÁŠ$D?H3Ô3ë€*æEN¶ïöã*›^ÊVÿD‰®ÜBpsÁœz!€ BîLhÚ‚ë´ÜQ"d¸ƒö;н›íp®²UMÈ2JÚéQš^òh}FKvÎE¾5 ˆ`𠀞·’£föbÌÂà”@òCg–ôë–€ñ-q…Y ž˜ÂFOôÚø$4)¼NúÈÂôpäñx8Š;tt‘Ñþ¡0N d…ŽÍ£¶*.Ë‚¶b°$ó®“»3çߎ\kLºHõŠÿ<9H£Ü`¯%þ3H„,þ;Eð)Œ‚ñŸùÌÿÙ)@@RA$ $ˆ¡Pi‘P"ú·¿Ï˜ô›êÅÿ‘AÁšÔQÿ )‚RŽÿƒœÐÈÿ†H==m±¾NÏÂÇK7p 0‰Ó¿?Ï•Ž“$®'Ï9T £óœáXq¢KÄÞÊÿÉœ©kò¿q‹è<¤Í‘Š1G$äØÝìv¹‰Sj“=^í´âæ.o4:sw÷sGyÝNÿáwÚ'¬Ï&~Å÷ïøÆþù³¨Qü•ñü7Å¿_»~þÊiS«¦øéÄag»Ãׯ Ê¥&ak?[³þá¡sz½ø(âÅ/7˺|vWlFø‹voŠ—^»þô.9ÓïxyÝÝ|~¿t¾ïêhÄÍ¥þ CvïþñÚ‡¡YY…©93…›+ßêÿUïЄ¯æòî&“×|,oúv|qoú‘õ—{òŠw»|4|ÖÁ‡¯$ù>Lµ™9Ù×~Ù³ëW-›_Øtúþ’Ô]—ÜóìÅÙ¯Å_Ž=Ú}étrœcÿS›°Ÿ¯Vò~ü1mgÔ;ÿô!³þkvÿâ¥Ik7½+ÚúÆ3çö­aní:o?Ù&ãÖ•¢Yý?Ééõôþì´B«‹¯¨Ò@iâa¥í±þͲíöÚæý5óÛÔ°ÛIIqYRç/úDv´ôæl^1Æ="ÃwsiÇï%v¯?—°èÉ¡ì}-ÏÏòÄmâÄ̕ƽôö뫾-*Ê–êÌ ³Å\×·žúÕÕYŸóºŒv-_õžØ¼0Ct×vÞõ­‚Ž]ÓÓ! ‡W_ÌŸ“TÖ8ô¬m“ö‡6¾¸Ý«ôüó}¹‚Û-2_ÿm{lgá¤O…Oº¿;œN^=ÚýØÙ‡ôV˜ÓÝðÏ_®ýšhÿaÐ{×_gTn•Z-|Ü|÷sAñ?zFØxýåܧûË9£’û÷ì»Ë1ü—RËPËn6µ½f>Ãá]ã?Ä4yT\ñ.ô”Ýà²y™óÂ*¶lô?[`wdÓ\ÓlVNû¾z嬯/VÎ4“LÛûójçÝ[оi•}êD·6¢§®®Ê{mtß½‹ç»ã's£Kß^œ÷ºÐ­ÑÆÀŽ™Çw.·îõÙñûMS²Ä嘙>³­¶®K¶>)yTÛO—TíëRºðŸmæ§zõúÕg}ƨ¹^«Nz’ëìÖœ¶ïÜy£YÙâ]Òs“nK«þ…Ç\Ð\²îõÛ~ÖV_†´H,•¸&qï˳"Ž8fA£ÅÇbKv„<õ3áç豕»#¾µEŠ{››<ë»±c+u]Âoq/ó'Çq/—¯I¶˜iÑ!±Ã°€‹ÓòmÜßËu:†yhÞ%x‚IáÂø¾¼§|r{#³dåflàÕA4÷õë—x÷̲œË»íµ’qkëòmq³”MùwŽî™åùV˜ð]eAµ•7¾kRÙÞ–o®Ü‡IÎ6yAMìíì<.}¤4t~ھɗÆÜyУÓуVß5Åœ÷Q½ZtYå`òy— ‚ý&ìm–søòÛ+Æ~ž›²®¥oIPÁûŒñ#û<ÙË9:± Lµ‰,˜”ÕÞÓã†ÕŽÛùg žš,}=i¶ ÇûÐn¯°×_¯<[5i˜´èêØµþ{×Emµ± Ùc7£Ù†¦Q½çGµÌ]paĘ¿RÉÞŸùØ—¾51¿¤«c»ãML–ìh¹Ó6«‘Gvü{CËr³-³<Û6:TT•ô C\ù­¥ŸœZÏI3ó KìžµbÕðo‡´È˘µx݇ï>_¸)%kÙÀæ_6™€÷÷m’ö2ØuNùÊ‘~âµ½|¢ç {)­ZÛÛ‹Íü-ÖuÅö¯°aë'Û5õ°,}»®…p†§i€Ÿ£oÈS©M‹ïm^æ¥åLïÔ.©pçý# û®ÊzÕµí«®‹^íÛ¾nrÓnò?P9}Vž½ì‚(´è諱ç–¿þjü×óïKŽD¹Ô+Ï­*ìÜÒ>ßüþéa©cüðï._Í\ðmÁÆÓû{µøb_ÑΓòÊzwZûú„ËÿØ»𦪴­ˆKŠƒàz*é¯%¹kn ²”R™Bm(Å4½´)iÒf¡-¥¨lþÈÏê ˆ0‚ÂHÅ D‘q¡ «Bu@ôáGç|çîIJÒ”ÎLîÍ=Ë=ßwÎwÏzÏyß+Ö}â϶t~ë—‹¥ƒvÍiýðŽÀèg6ìx+-ù,—_˜ôõ#{ž]±Ú¹eèÌÝ{m¨ê=vkë‘3»ØZß¹«Õó<é9¦ëzÏž·í«[§oߟ¶Ç\üjaÂ˯·ìmêúMŸUôÈ*©6¾[hM ¿í÷ä¢õ›–õ›O¤»ú×a«ÏäÞóóÜ«•Õ}knCowß I·oI-®éµýe˜;ô—;È×þnqëw~ïÙ™³÷lwü®mýpzàc=›õœyAè6¿uúÅŸ'>¾Åۯ͞Ÿ~[kXs&÷ŒyC–w¡)±Ô¢;è49©ó$­<-û1j‡:¨¼X0Äڜ.ä9í½Øù²¡ñ¸xQ\€‰‡æ`?š‘A±d¨ ޳„øñ–м٘x´Å’_š´…èGS”ÆÏ/­ãófÀ€”BÝ7²1îTâd”‡{VsZb¸i!?"íØº•r\&§{*œ‰¡>#ŒxNm÷ú±Ai–bc¾Ö´þC5þÏ8ÿ{£\Aö§›ŠýÙ8ÿ{£\AögšŒýãüïrÙŸm2öó¿7Êd®ÉØ?ÎÿÞ(Wý­MÆþLÜþqÙŸo2öó¿7Êd[“±?·c\zûçZ® ýñþÆÊÄçÿx…Ø?ø«‡´õG(Ž<ó`àº÷ÿ0ÖjÕÛŸBÁ\|ÿOc\ ÷dd%õÌóä IT‹1!AZ¯îJ/X‡]¯NDOö…§Äµjq©vÃRuW"UÝJlB/›;âë¹ÿ0—f±YÄýȽ=EEðíшÉþ$îG‰ ÒÜÇãï[ºŒïíâFÙSÜç©<Ř»$*ŒÐËÄN±a÷zíå"KzP¨ÅhLË(¦ °«[ÐC,pybþÇ1vÊ÷F£> ™_ÞÂæž)Š‹D.ÿ¼… ³>{ ƒ¼ƒùìQ–Í=u|öùÀÙ1ŃF~§+Ob%̽BžÓå²Ë~$R#E§²­9%T %—¬‰ÔHÑ©A"5Òôé¡l§Õ’R&-$=”×4]z4òy$8zMÌCuB¬H|)q+QPòù‚·ÈîÎËu)2(·v݃ Ê­=T;‰µ‹e»ú$Ê»]§+ RÂTà,RAЩÀ"„PXTàB° ,*è„¢÷ÐìÔ§‡ÔtÖ’RÆ’ʧS—‡$ä9¼»_ñA»u/‡Tóèdr(O¨L©â –É¡üzô2Q<: V¤…ÇçgÙ=ÐÛi•iEª‚eZQ:™V$³\Ÿ* rùA‚Ø,ÁO  Ô¸ HÂQ`÷Ú°Rj9jdPÿáüM$P… Ò„ÿ '78dšaµ‰’£W ´QL¡Œ0÷M냩y1Ýpe…LrN(T­ò3•@Ckw¹¥i nÅpË&])4ÖAénACnä,|I™T{MÞ4ai~»Ëé¨#°ðÔ×Tdz2ÕºB’溜%!LŒZeëƒëJ¤·'àE֯˿Nárx­¢µu$ !þÕ16Kݼõ§+Qìõ8P&ÑŽqŽ…ïïF3æž×ñë쇵¨%94–Êbš¦òó„Ê*/’7§¹ÇdW_;~ÕÈ.‰\ðÄqH^~R¢ŒvŽ!‚R¹¤!¢ÈD®+ Thå. 6ÆG·PÝÐ2½ëˆÇÁCÀ1lD ‡ôë|Ôã÷‹’µ=ÊÕâYWR˜ãš¨0Ãá/¢B:áU)ˆ‹g¶B| <¥"E³Ö_›f.¼`¥;¶¦“* Æ”ëªgÀ]«·Æ^!¾yN{¾ÇmwùôþÈÏh‘÷‰÷C#r޵´åZBs]ºþò:ãh‰ÌëŒ$3œ‹E%ý×+ÔÎD…!p…vù€`ßhÉÌ µ§Ö¬§Åù¢Ÿô8IäS¶Á rP µæ µqKŠ<-êÙhä2e› lc'¤I8ÆøD§éÉ¿0È?;Q Aò¹;ƒD›®É®L= )µòa4¨5UV«R¶fž×^J v8ß^—=Wp¡Þ‡È•ÆãÀ¤­„ú=r—ŠÚ »i¤Øz…ÊØ€JY|íy…x¢ÒÃašÒ„ SŒ¯zÈ%)ú[ä6àdDˆA`pH ꣅð*å‹ËÅ`ж Fùq\†JÊœó2Y8då ÌF¨õ/—~Ë|°§£þ¢„TëдÅn‘ªÅåèg)#ÎËc/ÕC¬ÕùºHêN9—ËYìF⡨ ÌÞrmÁyË´.]6¤ÈŽÊ¬L¶›èBï¯D‰n(#Ê5Œè”(’"¶º‘Ý‚G‚v¯½E‚œ€^Qñ`)TUéh©®ž*žÐŽˆO¸ìå‚W^ŸPb4 G¥Ž½¤†yИJ ’ˆ<Ô"sÁ«‡^µ?ºãJ;ÎКŒváÑ?ÑÁhœÖÁ+ŽFhFè´Qfr•«0ÙËÄ[¹lш>àÕ{ ú´”$á äŠÄ"OÌ»ËcÏﲦ•ƒæImHåf®R2®¦ý Ò6›ú0½hò/|¤£Éâ¬_eÁ´vOÖ6²‘[Dñ€w‘ Ö]Nôƒš=4?ózJ%c“¢4ÙWl`X¹…,²£>Úð 28:t4ø/BñÌÈJÂsþb¯à‡òòø Püh<ÕÇéóC§ë5šå§KQ €{­J¢–’ð\ 6k†„ø~üʈ_R§srrgMi‰ÎÝ»w&|öQáq#=ˆ? cP N"ÝÇ80LrÙÝùTý\8@•Mè*+HE…¬&M_íLÉɉ¨Gr¦á⯬XP´îÝ눆­,P4™¸Ô©JJ÷ú5 þ©k@a @»ýxóeW"Ãã…w~ñX¿QZ3b­Š%ä&ÝšPye“T[;±}S Ø­„B wà×@¢Ö3# >„vÊ"¿r2B¤°ñõ¢ÕÀ"ò”‘§4ˆdýÐë¤9BHä^‹¬è¾2üà:nZ’ˆDŠf¢åh|‡Rfdä ZËz&åP¶Š×@ô¢ÂQÓRœ–kàß„æl((I¨aJîm˜£Úf#¬,†®³r18Á""le•4ÖbÅ"8‰$ñúÓ˜ÆQ‹â9-D  *Dvª˜p8rTˆt #.Bt-Ìñ§A¤Ë²÷+vâúÆu±×7•Ñ,²ª-Ò:oÑ ñ¸7‚¿<®C*'€-C1¡›·]ZöB€jêg ì8Ðÿ©ØÖ3,ƒV°)µÅDSÕ"L¿þ”Z±¬m6J]:¡iJ…•‡ $ñ¢Â¯‹VP„5 ¾Þ©øu LJ6 .ªJômÁrPµà/ªû¬®jaì:X1ÀU‹²ij꺊ä7 =[p.@ÒZà0›ÚHRD4Ð\—Ÿt$DWPa¯˜¢€œýß–Tʆ\X¨¡•n\ZzK8Žûz C£nJ[ † †^qP²¡áÍU:zÔí °Å ÅD¢æŽñHD¨ƒA0‚(âiFx}k,­©±@œŠÔ€õÑL¯(™¤”¹dµS9pÙ4Ã2ºYcô¢Â¼‰ ûBgÌ!©à`FK³h^a£>¹à„,ü jËÇx€ŠDØÔñ£ ”â£Fx}«'ÕPs iC¡H tY@¤@§`Ò –§dp LΊp²&¤M7È'ÕþVQɨ'—Ÿ~D\èÀ0\è€Ð ú•aù”ÕWHœ%9Ãè(É!rt è ".º×-Äî³Á8Í¥Dî\€lÕWØ8x4Œà-1FæÁ,*‚¯d%Ù<´QG–~“ u mŒ¦ëg‹¦ë—ÚÙCÌzŽ2jŸÖG/*R`z ¥Ä„å“n(¨.¼¦º`ìž„ž‰õø‚ùH”W™Ñ °øh:®H¯7Òyíøæ VMHÍ„ZruB .u 1ë9w®«šD+*Òõ/¯WÇŽÑ“n0Lziª¢é[Ððºt=KŒÉÜiÈµí¾Æ8<žêFSY.?ñ&Btý¡ÊéÌ¢¶]ÃéŒêDGŽŠBºaÄELzÂë(¤cÎåÉ7á ªŒ',éÕ0åð©Y¡XÙm‘˜£M!ç†zŽÂ o‘סÓ¯?»Fl«£! cçM%‘Ç‹ú¬úV3QÒá6„°H«ÒÑáÆØS­×+tL°²­™èG´’Qú—mÄh?:ƒRkD4ä#X-g(ªIL V—c5ÄPØv€oË,#þzcò˜âNó˜ÔìÐ!‰è¬Aâõ5]í ¬ ¶oʪ™b¡\uŠ .u¢1£šÍF/*âýR¬v6CO®¡Xsq-S¿š£*†\ÐÈÃjíbL^ "XJm‹°@ÍG…¨˜‹#Iü¿›D­¾øRá+<þ‡Eåÿ"9Ž¢0þ‡…Œã4Ê•›ç y¹ŒEpŒ¢x›•´rC³¹šsð¹û•Ö/~Åöªoýú _—¨ÿ,ÇR!ø?¯ÿq5 ÿ׊?÷÷îÛòé1Ýy|ë…’¤•»=ØzÝæ¦§ª·´XùÕþôv{»pºcêœï–nߘÓ|FM‡­/|2óîÍÛ . ¼ñÓùëzŸùdÓîd“÷Œw´ÿ—íwž_¼gñ#£o™~€yçÆÍ Nßzþ›“‡/\»â *mï¸Ïšýÿ³›~üò·²ôÏYŠÓ÷nΛ·÷›½ÿì}fôÙÝë~œÒýàØ¯.ØöÚøÃï=ÙÝÿäø¶åGúTµä“ö]˜>xåÉñë~{·¼tÿ¸‚U[_Ÿ>{ÍÎo?÷’·Ìy飹3rF¿ÍU¥ÿµú‡c9ëVdîyz~Úþe?ZËçùžšúÈo‹· 9¿ïWŸzl‘ÿ¬çð§vN>µ»ð ouß§Ë;%ÌËì´ùëg6¯öÏû~Ç€ÕOÞ÷•mѦ_kŽ“šîúz}ë7OLüüqoæî~Éi þ8õ¡5}³–/Ýw÷¦ÿMû¿k;ÙBæì­™ã=w*ëê‡ßYUSØì×-sîXœóËí/’k×^˜šqqG‹…ùëî0°8º÷TÛoÞ7{Éâ×OœÕvÀ §’~r-îYÔæív]§½qSÕ²IV­˜ò‡C.ß÷|IÖ—olŸ{Í Iëv-{.§Ë»Í“ßðÏkþÞº›VWžìÙżö‰ìáßÿÙþœ¥zá5ÎYØ1«ò–šsi¯ýdŸ´uI³;_S³üæ#“ŠV”´ÚXþ•1ù¶ûiß´½íol5oÂî§>k™Ô·zNÑ—ÙŸÏhñÕ±N©ó†ÝZøtÇQwÛÒ&d¿pó÷»/ö=üÉ÷¿—z µñ¾kúµù[Áú7ÿç`O[?j¢çñ³9}/Î:Y=è¨j߷І5Ôy¾åUúû¦ËŠzfÀÇí—RR^“ÿ±§«7¾î;³ *Ç{û§¦·ïs¸è¦«½¾%7cëœù¹Cßy~;³x%û‡«6´ªnHésÿ ›Oö_Ø~À;K-Ýöllu¢YÖÐN÷•“ïuJeÒ_NpzÛ-XR½kõ¨ªÜ·;üm_îʶ.¸)‰;¶ìü·ÝstÊ´>%%ŒwU/±oÒÇ?ª¾wýùí'¹Å‡J¿¸k0ã°½¸ó¾Ôy»¯~®ôö—«^+ù¬ªÓç·­hûQÅ=¯´ØÉ9·$¤lIìF[¶jÚÜ÷fO9Ö¢Uëɯäšel•²ª¤Íœ7ó;ÝßbÿnC/ë×n¼aùÒ÷[VÜòJùŽ7×þþÝÜic‹6f¬ÿËà6Þ1u‰õà 7L¸åèK†”—L7ìÍ?´Ü3aÅä ïwØÐ¾¦û´ýŸ¸Ù4xШ þ/3‹†LýôТikg™zØ’ ÆÝÖmò…C•·˜n]2çyc·5m…Ÿ\_8è¥3ŽŽÇ3>_Í>úNR¾oöÀ?ÌJÜóbiÛß;•í-9úöà—mïºþúFÏ{ÉI+Þ½áe—s£±ëÈ%Ïw{hàï ÞÿðšäaÙŸ Ã;|¸ÿØÒÌ×ïŸzøÜ½Ë'òó‡–¼oþ®ß7Cw:ÐlW§m…×e˜yŸ=7$a_YÙ‡§:dwh“±ÏøÄ‰ëæ’{š'YþdG»E3K Ž?98?E 6¥=·þ%Þz½áªT²ËCÓǯnqè×Aw˜Gd˜öÿR`þqðHÕуÓw£‡ðWÍõL_¹ç©78ÚÌ™g¥vŸ»ºý‰„Ï„³ÉÙ^7mvËi‰ã§½jbÙº¿zOsŸ¥~ž²÷§ s¿8 Lªò§yúÖ|âÈá³ß×t˜ÿÀ´›ýêìk7NþbõÉ„9Ïœ˜¸vCzzU‹Þ_¾ôªI­·<öèD¾'Še/ƒïI:°Ú0|O´–?ßÓµiƒ ÍÖƒ£¦øƒÂ2<‘Òz,H†'WŠ–=(,Ç%Ò½ãmQáË$*î ðÌN6q-UüžJ)2ö “S-ìAšºØTÙƒ(KìA8¨1ÙƒØ0ìA$G†°äPä‡ÚµPV :”§Vö :”VB™‚lÖxÖP¶’gBýlÖPö øÞ"ƒ‘AQœÆ/”ˆ½ÐÈ1¿Ÿîüé Ü% N­©ÌÎ&kñ â¢XŽŽéRQÐü¼Òø¿¨sñãøïr…Øßá²û|„Ò,gQÀmjÒn‡na- @ð:QŸ‰ñ0ê‰ ®{þOq+¥·?Åpqü߯¹šþ/ÉÛŽ#ãø¿qüß8þoÿ7ŽÿÇÿãÿÆñãø¿qüß8þoÿ7ŽÿÇÿãÿÆñãø¿ÿÁø¿êPýðI4å(î¿ÿW3°€†ÊIpP¼²ÛÕ¢uD€˜p¸Z<> c¥9Ñ8\êŒ>YXOÐáG©2äŒøSËcÿbïZÀœ(²u'™ 3–i* y' 0¼”á¨d2Ý=“vò2é0°1Šè**(>v•U÷ꇫ«»¬ ì.¸Â²>®DïŠâç_°Â½~ ^tyÌ­êd’îJg¦fоûõÑ éNwÕ9ç?UuêTõiÅØmXn©>àaJêvó[3 Mê½Á`}„c€x©]စTaÒì´™Ç9Íö6&ÝbZ=iÁ`xá”KÍ.^RŠÍ‚²ÅäMÆL&MLZJžÅ2IG dÒ_ˆ X¬X X*3ì¤sXœºÜpÛ¾+Å1aûË|dôjq»þŸ2.iá#éq9¿©}§Mª÷X ·Ž![J%8,’®s&vjPˆ¬œÉf嬰J%Ëð™‘'õIÖ£©JÛ¤¶> x€pKÐ8×R²+GLiG‰™ì Y½Jæ9„«Ô€'±0#¯»À¬X¤&)®rqóYåÖƒÓÙÓ®C Ù6ËD„‡{Ä`²ìŒ&CÇI…[dùd^º‚´Ô©smÌÂò%cJ²|XlrR€YAÖ ŒÌ`-’ñÖíV¹‚”Ž¥ÌKË‘ °œÔN\¨dåâžJú"³ò%h’NÖÈGë#±\¼[$J–ôh™69¦<[Ÿ ž·[,â$+?¯,­™ë…Cahö9&ŸJ c{GfîLü`6¬‰`Öžsæ—ËõË¿Éf÷ö‘œ39Ҍ䞙)q’ߌ ƒÙL«-è›[!íö?Ê5ÈfbóÅ~Ha¦PƒôUS9ýrXƒlÊ·‰+¨1ÛïP,J6_š‰e•%-Ðå”p©X lÖ3“] v¹Êt¤áÍ‘¶@± Ù”ç¬Ta“Í}¦Š½ó\Ð5täó!ý²³ÂŽætR®N6!ª ¼|ÃËË¢X¨l.tv柰Ù¼¦ó¡ X„lBÒU$›OÌM   µÁÒîÑ/:ˆ+ßס8Åí‰mïCqŠ;.!ÿ•.ñw×sf¤«°¡Ud·õ‚ïxË©{ëÀŸoôí»©ô£ÝÎEó&ï½î§ë¶<óõî3Ç÷o°]QRóÆ“wPwo¿ç?Þ9trÿÀÞãß(ZúýÅï<úÁ-kj?¸{wbÁôÍK¦›nûÛ® fñ=÷>]wÿ=Ç~Ð_,>k˜ò/ÓmG[úý…ï|øqÑ'ü#3v-=~ï==œ}㓟þçÆ/߬]ùYâÖëã7ÇwOiy{Çë‰Uö?Õÿï'/;ñDøAó ‡~óÍÎI7žzùäÍŸ2GXçñÊ÷¾{ßþÓÎË=²÷•í5ë/_k|xœõðÞÅ_ûºú¯n·~:ÅþÖ*ÛCÏîú`ͱÏ\ùSEe“f¼zß=³ÿwóÒý=ʾ+ β.°ùá?îcw¬uæµµÖïV.|¢¾ÆøÚÀCjÎÿåbÏý'9úäK®ª*‘òÏnêñD/\kÏ,ý³‹™4 —óà /ùÛ±¡h÷›ýO¼7äÍõ«'öÝ>gÍáª7Lû}“ç &0鎥רüÂÛïM®åß}|ø¥«°çÔ¸5Ënܼeüú ¿ÕݰaëGÆûuüÑoŠúÜudБ;¿¨¼}úã‰yO_ô¨§eÁ„ÇGýç3\žùìHÃ%·MoYÿèM¿Ý_ï ×?uü-z¼zõ©›{}ݽû½û§õøvë‘3‡Þg~ðŒ=Ð{Ù¢zcuOë­÷–½·µzGͦ]Ͼò#ë=ƒž/k>óé‘W¾ºcô½¦.+ùG/ß'¿([ôÊê‡–í ¾î;áí»º×²ó›Æ}Á6¼õkÿÚM=m·4?=÷Ôù†kèYÿ\úíü¿Îê™·ï|ünýï_ìóå÷µ- ë—¼Ú|åÐ ÅÞÛU·ÿ÷äi{ß}cëö¦kç}õìð/§Î~½ŠZ©/z¯Ü«/ª7dÖ*ßjj‰<·ü©ñ×ÙÿæÖ ýÝÇs¦;}è²Ü]÷Uÿóî+¦o¼f‚­ùóß\?ñõ-Û׿ÚbùÜCþÝ÷Ñ_n<½a÷¶þز÷åwß}yÍì# î|á3ÇG*L#¯|¸ÄÞwݵÅ}Æ—¿6æïº™ßݹ¯|í¿vÞý2Uj¾sÕñ'¼ýl}ªoqÏ}þÉ›o;Ï~Û½Ø}ß›sïý•}\4X}øÝŸ •_7¯Í™3ÂUÙ™”©=N…Ia–¦Œ°(¦Œø·ÊQ ¦R1ɸÓÚ~‚ŽVH:“B!D~µæ#p¸sæ#"™ÀÚ^>˜Q}¶&^GÏ™]Y9ÌîÊJœ|f·;;EáœÝ’ÀjÍæ>…—uÎÝnNk9Z×Ì4ÍðØùÖg¦®¾.ö¬aDö$£€Åé–f@ü?ë9|þ_œÿ¼ÄçÿÁeÚóÿÁߦü-þ$Áß®ü­þ$Áß¡ümþ$Áß©üµü?DÁߥüþ$Áß­üþ$Á¿R5ø»4üIƬüíþDÁÿ\æÔâ?ç€üÕÿÓâ?DÁ_=ñ?-þC„üÕÿÓâ?DÁ_=ñ?-þC„üÕÿÓâ?DÁ_=ñ?-þC„üÕÿÓæÿDÁ_5ñ?§6ÿ'BrüYÕÄÿ´øBðWOüO‹ÿ!õÄÿ´øBðWOüO‹ÿ!õÄÿ´øBðWOüO‹ÿ!õÄÿ´øBðWOüO‹ÿ!ÕÄÿ´øBðWOüO›ÿ!9þœzâþDÁ_=ñ?-þC„üÕÿÓâ?DÁ_=ñ?-þC„üÕÿÓâ?DHŽ¿×«ü-V-þC„ö¯žø¯†?BÚƒJð·XµøBÚ¿zâÿþDiÿŒJð áO‚ö¯šõ-þO†öϪðŸ†? BÚ¿zÖÿ4ü‰‚¿zÖÿ´ø?BúN%ø[lþDÁ¿Q5økë?DHŽ£zÖÿµöO„üÕ³þ¯µ"„௞õmý—!ø«gý_[ÿ%BþêYÿ×Öÿˆ’ÿS=ëÿÚúBÚ¿zÖÿ5ü‰‚¿jÖµõ2„ôÿªÙÿ¡­ÿ’!õ¬ÿkë?DéÿÕ³þ¯áO„ö¯žõ-þK„ö¯žõ "„àÎ×ÿmðw­ÿ'FYøg½ývV¨©üžGàÜï·Ykúýïð;¸Êeuhï'AßÊ0*hℸö‰¸Éåø¾à8øÉ3:ý£g4ø™žï¡çs\„ 2\Âäñ{8¼sJxø Ë­ˆ#§«Ñ‰„)aJ–ߊЂ£}Þ ëçƒMt¨‘ö‡šy?­ i“É÷íÊŒåèaU€ÛzÏè(€ÿ€«+|Ã& K˜LSB~Àc("¾™fyoSÄ«Pp¬§kâƒñF¾)áKfÔ™Rg.(p(0ç]Î-„XÎäIÕJ ûx&º¤…gßx—3,ÔÅÙÊ1¬Õ®¨’úz0U_/ÞŠä‚l¦|xª`kHÁqy|n¬ÁÏ3t-hà"ô´XP<M´q8%{a¦ÀøŸÃ›yð6uˆy½× a/ÚnÎ}‘‚Âôð8Vï7!œÎâ£B xý~‘W`w HˆÄpW: "»[. k9b^?Ý¡|àâa`>Ãò’Ò‚%e ‡)dC(„Áº5Ÿæ‚€K>(ÐáH*†ç¢£hª“f| ÓæñF…a° ½n¼ž\æOd¾¢áýïŠT‚ÿˆn¼e†T‡¶v:<:"ül¿Ïv¬på(ÊáeÃ3GXhAe²cË®œbšñE²c‰´€h/‰iÎ_¶0àÊEA§Äq`‰³(ÅSg">ƒ[ØÛž[14UÇþfÇ$ÙwÑ~oSþv ãuàÊ™QÏè$ï˜*va©xf49§„¢„Ñ´;_ȸ6U ]P´î/¦+±5 ®\Ì >Ïè÷˜Ê®ìŒ²Ó‚LÛ0€Ïç˜X$Ê/Oë<Ò9uGÚî/Î-l¥ÃK¡}KEÀ“ñ唿å2b¨GNkÇV÷Ês)†n@ñṗ'€+ þo÷WEV,͉ á˜@·ÕE³\#äEÇ:Ô^Z¬t¹×ã  4ÛÙUšMAi±`”o rlÒebpµ‡çLt¨=yí…R£ýìªÑ® FèFò¸ÊÃs[:T¬³P*sœ]•9Ú³¼NéÏGÂ7¼B*Ñyv•èTP¢?l¢ý¸ÊsFyb¥…Ršëì*Í¥ 46kðs4‹«6<§±Cµ¥ª-”âÜgWqnÅeM®Á¤W‰îÂ(ÔÈ áˆUbÏäà¥ÉHvp! Œª¨¨ÀÕžC¼8¾E¬ ¸ÆÏ âtœæ‚BdeAüb«¹m—”G>'c½‚7‰ò?Çš¢¤¸†s&È*—…`xÁ“aÝŠæ—Œ*D}`ćëZo¤ZU² p”g9Ñ+N…@ò·4«ÛÒà¥Sƒ,¾£oÅóbA™ù y6z« [ ]Ñâ;azÞ`²‘€/,˜Ô±HœdÙ€z¨á: œ²JNd"ʲpt$$€ï ¡>"Ý`Æ5xåP”€m% xh±P©UÐ-@¯w¶x\ƒfœìÛs #¸8‹†’ÃË…St˜u‹g|â áÚÇvëIèÌbÀÀòG9¬´îÀ,ôE8/+F>ãŒgtò6";ìH±°ÈÔ¸ËÂxöä£0qÓ0 {ÀѤCq,qà¿L(0å‹zˆ%&ؘæhÞ’Yq%³¦$¾M°³’áuóiÉ`´¸Ž‘·x6Üx¼R”x˜RáÄ ß(z¢ïœlÞ°s€˜ù hÇОF*1%Ä›é·I(†@£¾PÌÏÒ …“Ð-¡#%a:"ˆ)&Þ¤\3lÌW,'¶XΔXQ` ·ÙáÍ—ÛàK JÁ ª§ó–{Q^)••‹D0eÅ›äv +¨.oYÝØ²ºS²ý˜2âÍAEál3ȵ€Úó·T8Õœ6sÖÔ”·Ó±`•)ÁYLÁð&–¢S'n1ár¤ä™¤¾Q¼†¼  ®é3> Oâíc1!%!n4]bbàÍy“EâÌ­ _ÑÎv›¬YÉ`q.YšR&ÚURÊaLK³D¼¹.î~§Ÿ 6 ¾¸'Â7ù„h3NÄÍaûcQÚÁ¢Ë¬´g¬Xˆ‚‡LÇ!€©ª ÞäpÚ›g4PyŒpÚ¶ â)wwÉ\oT&p‘èØô–!VjÉËd|×5uC›h«MrÈzü”\ š£¼Tx&ņ}Ø:kâl´:5)MÛ‡ìlíC¼Ï>º<áV´)±âœ6%N™ñmúl¦NN¸ó¶Ÿ$uÉØ_Þ6aî¬MÌàVT‹³´=¤ÏtÑÀ­ùö ˆöxIpa/µÉ)Ùa޵Y‚µ,®—7 "_uá·BßAâÜKû Ènü„æÔÈs~6_ôÿ>à‹N’¨'8å¢ÇÓâQ¸¥$1Âã‹‚!œ‹›+l  ñÚh­ˆ/IðAèÕ$ê Lk€¾°IiÃOÞÆ¹¯Ë¬£Ó£aè†^ÉEÇCy7öΠ·ôU'7¦—œë"äð^<ÌE=(b.n6žnÊ™M¹Ý¶½iãPÚ)ívB¦ïµàwÐT²öFæm'‰ë2ßi!çÐd$צ%—v2Éñƒná_úéMJÒדi¶]kL€t4Æ0`üÃùvÚwMP«Û©û”ŸïªŠwçÛ3¥ðrz°B¤ýÎ)ÜxídÿÔ`IV‹çïÜ‘¬,i–á<Ÿ÷¨eé´Ï’Þ5V-Ù—¶Å_»h7éò5tAÒ¡­séÚXf1Ë3t—_Þ69k𻳆·lV'·¦á—œë"èðÞ|ñ†eH¡κã–Ã.ÙK›7âB×7™‚Ί•>RA>J‹BÐ-Þ(ÝÄá†àâ7FB±ƒk ùý¡ØÓˆCÓXœµ)qFäZêë£| ¾ kõn_žAŸ$RXúEîcÂa¥;áiÅ Ò¹yþ yþ[=ùµüDÁ_=ùµüDHŽ?£šüoZþ2„௞üOÚóÿDÁ_=ùŸ´üDÁ_=ù4ÿ!ø«Çÿ×ü?"„à¯ÿ_ËÿM„äø³êñÿ5ÿ!ø«Çÿ×ü?"„à¯ÿ_óÿˆ‚¿züÍÿ#Bþêñÿ5ÿ!ø«Çÿ×ÞÿB„÷¿ªÇÿ×ü?"„à¯ÿ_óÿˆ‚¿züÍÿ#Bþêñÿ5ÿ!ø«Çÿ×ü?"„à¯ÿ_{ÿBòÿ«Çÿ×ü?"„à¯ÿ_óÿˆ‚¿züÍÿ#Bþêñÿ5ÿ!ø«Çÿ×ü?"„à¯ÿß®íÿ&BügpþåœÀ3Þ Ah,hàÜïÿr2§ßÿe þè°kïÿ"B:ð׋ZE¨ðœc¬akä48s ü]żá=ß>¾ \´ü]Ñ䆩~T)Eé¿—5ùW6²•:+8~Ž¢ðq^v~ËÉþÅÕ€ß>pâg'‹ïÇ7€ãa¾€°â¡mCáïà~݈ñRå£ÖPTÓpp¼¶™‹[ßoJQ¾­ Ì«ÞaCsÉMÕÜÜ/fÀyt÷çÁñ(p¼:Š ¶¾ã.Ç ~ê4³\ ãõP”×4†›-—>ýEEÜàø¹p„ G_Ú·‹¢ZSTI/JgX£[OÁo¿6Ú%ÿ5üƒjÔŸWbÔw/.ÒC*¥¤J«3{UMÑÔ&ãÞ3ót¶nt›SºL’>õ½¸|Ó]þŠ3èôâ5YHŠŒÅÝJJMÝ{ôüY¯²òóz÷é{þýú_xÑ€¢:ì’K/>âò‘£FWŒ1[¬6»ÃérWŽW5~ÂÄêI“§ÔL6}ÆÌ+®œU;{ÎÜyó,\tÕ⫯¹v‰§niý2¯¼>EžŠ(بKÀPú©Ç¨M­­àüÖz •ie$zLò ¯.§tàJ¥‡?!hª5y«^w°¸Û6ý†êÞ”±è 2u+:¨£ú—ê /ê-T©nƒ®‚ê7²ìxÕéªÙeßWÕž®¢&‚ïe§À‡Å<¸|pù%àC˜;Evª6R')ºhDØ‘îã  ºRjñóŒÛôÏV_ZRU¬§ŠMÝwJÇÝEU”»x¬ÎP¥×Ó:n·ÉÔýæÁ?ÔoäHPY]UmÙ‘²ƒO3»{e¯í]ÓIÚ“t§†z=!ÐÑ;ˆ.d$¤uѱ…mŠ16؉{w°-ªvb\bÇ-vânÇ% ® 6É—ØF§ÿ›Ý“„Áø›üþÿÿï¤Û™ò™÷Þ¼7óv„!5ËXšS‘Z¥Z£Ây­R°ë JÁ¦7)Œ6½™±ØôVfÓ;H˜]ç$aἋ±„óŒÅ®‹Tíº(…1œçÃÃ=HmAH­³Û=6½ÅfÓ‡…a ôø°?O¯×éx^Âív› ña‹Q©W* ‰ì¿ÔÙ~©óèýFß ýN=Ñ·¹ù_†« åx‡Œ>H²“Üs@ÜSC ©,éÄqáxïùÅKCÊ¡ÐP}©næR’Ö ÏoN±Ó“áœ@\VÖd3ÇdgšÝÙns&C̰ÆæfbÌnÆì6»—Ìßóâäà·8uþÍóñðù·ÌßûÊl ¾:ÿæyÁæ·áü)Áß8ðÃ7áe7á½ÁÙô¸)xÓMÁyøáàfµ²;WkŽõÄx¢=ŒÂäÕt¢ÈugÏÀ™ñ 3§Ì@iZr¬ˆ¶”•®ótYuw¶,^™J…÷Êî—;ANh dEÊÄJ?¿Ã±ÃIjTÎððNr»ß`wXìv‡=<Ìàp¦'™ž";A’–ìôk§ÃÁ``eO<½×SÈÎýë)r;J‚"Ü~ úÑlýß P¤šrq[Öü Ã0 §¥±<Ñu¢—g!Þ+ø6K,+â,œ™™…2Åô(œì…Xj,ÄtÄ…llX6ò3« –…3Ü ‹K‰Bi1è±6 [9) Y” ¤Ð÷D6à2sVNf††'&Ú‹£0>™90< ÎTã!ÒVÞ}óÖCOlÚ¸ûÆ”,=&úÆ3ŸÝ} $l†„|zq\ÉvÁ]üÍÓG_zÿ¦õŽëZZo¿¾åû…ú»áëïþ&¼ˆŸo½c[+MiQÜý1ã…†¡<ÂÿÛ5aÍÖfÛš”5©›¬¦~„T7GÜg%פ^•C®r]í&­¸ÜVá&Ö0¿u)bŽüÀJZ\-¤ÍÙNÚÐZ+Ùj»*œì {ÌJ®ŠÜ*’­üU.òŠøByÍúl89ê|ÁBjsŽZI­-I©x^fiŸ¹ ŠL³Ž'iN_ñ†ÇŠ%'G&§ð< ·Z#ÂD«UòÉžOö&8+!2ŸÑ„oŠˆ¹¬ÜÜhÞefRÍ~31ÿ1b»Û;É¿Ë12²YŒÀyy —íÒaÝ®ôËD%V.Ímº5D!eT?u¢ N?Ž Ÿ(àƒBgÇDÇy³³rr)SÊCÉáœ\›B œéÅÆHãjSc‰7a|™×Jþ°æOW/{ü±ÊѯßuóÓÁ¿be²ãÉ´YöÕ˃‘mãM˜Tƒ§ßX}ý•3÷î­¬¼uÝm[>œÝ|ý諟ëÜðû_÷·Æ[·iáöñÌÆq5…S]66zJbW6¾mþM“JŽ€-Àd'i^âÌ}C³AÄ;0ÁKTW ˆ³`Y'‚-)’`úç?ƒß@)ë‚3I9Ћ€Føù8F‚I©„NœyíÔ«àì7*wê/CŒÀˆ Ãs~~Ò©}Zó„™„ .!Bˆ¿î>‰”0À*8«»Oú‘¼ R(^v9-.—SårÍ©œ.F)€`†;±ý.öÈNò¤ß€‰–o±½ í¡ã‰Ÿ$À’@¿Ö’E¤\AXr”Ă޶}Ÿ< TïJ¢D*á }ÉŠ3îÑžéÔ*ó+êå<zm³'ÌíÍDz&JÊÈÒ, HÁ?«<“Klžûnÿv÷mk¯¼1ÿû÷ožžøÐ³÷–FîÝ;ª òØåÏV½ìwn5¿þþ×{‹~êþ-é€ä¼îÏY+ ™„ÞôÇs:«nœn“Žgœo\ÎÌ²Ö K-UÖ6ÝjË&ÝVË5áèxNd¨¤¡Ë4¬Çè´˜ä‡ÂžÄv”€t`Æhµa¬Z<Rã ‹tqld‚ÎÔ²Hl‰Ø®lñJ<àÅÈ+x‰wG²½çíw¼‰©éƒ€r4g™aX'¾q_?œ qÄ©2™)º?_ê Ù‘q*ä€p“97Ëz"pD®µ'B/S‰HCZ弃Q7-»âñ{×gNµ˜4-›–Ön³týت——UW]¹#øå;Ïtã«ì·mî¸rÝ=–»Éªõ•W^}µxèÅ%û«Ý™ù«ëÿù9´Ø Ô)€>Á#:åÏ1kk´·k÷h_ÒrS™©º_²Œ h iŒ’ã5Œiµ:ÝË F;ËèÑê`6|’&:ÙǰTQ/d!ߢõk|Úö"ŸÖïõi£]pNöIª|‰f:œiÞÈ1¹¹ëjr×/^xá`0/z€9|fòÁ{€5nêZDCå°›{xùkÄçꈭ7›2?§}Gûa¸Jm¶ëŒ:KÓve€ô3f2›_Ö,z³lJ ?¿YÏG†ùõ»@³Ñüa8,Ìe6}ÂÀâ7)móúcØH—θH æðv€íÚ1² vbß!šžÂÙÈ€o*ÎÛ¯?4=Fõ§Ç³I'] ÃÂ@‘eF8èê×fUJà"‰«%†ÆMe} ¨ÑL—:@–ƒ¯¤ÎÜ_…ÝVwåÁ½Ûæo‹ßs=y¿ë‰Wßp «Z¯;õÛ.Ü.l½öù{oß?£ÐJþþhpEiðôï_¼aÿ§tV›h†?G D´ß·ÌÇ*ýaccŦ9â2¦JY¥Zjª[Um®ªM®wToYJ`èƒqbŒè¦œmŒôëŠtH)¿¹HZý©ñ«¹Èp.:Ò¢ƒù6ÔäCžAÂtLAˆ°cOÁŠÄ>?_h[dk°]acm$ö@Rh6;уTˆu%–M-;Ñ eYPÓ(¯‚H£j¢ò-&…\j3`KÔ˜؇MZ6oÔÜÅdÔSKv­|ãê?ßuÍ—{?êÊqýôæûï]»æav¶~iÚ´´‘ßü±²<ø¯?l=q9ž‚×á=Ïì~öÌGe—tÞ}ëãÓ9¥¸ÖÊ=<Ûè×?¯Ã,ü«ޤâ>`V­Õµ0 ¡Ýž! x†8 ªõ_Ñ ¼/"L!œð0Á:ô!*¡º`SÁ´S'¦ §élGµ*û}FŸ,è)5€¥@ŒB“ãĹÌ¡mÁSr G˜+ÿçöû½Ûn š‚?t~¸_¼“®ýΆQvÀ(ÛP JCŸøs³­8Á:É:Éû¹ö«4N†×£õxÛªjÒ4kÛtkl×¢­x»IµAsµv“î:Û«Æ̦hîý.ÑIO¢˜JOÉ¢—Ò@d‚¨E‘v¤ LÙ•‚SLîHiÒE¶<­ÆêN²Ä/$µü"˜:Á@ ø†Ãö–ÐO!}lKX¯Væ#a;Ò{µÙ¸ì#ÆM¾²Ô!i"™$š›@Í—ÏÏãü!þϼRÃë•´NeBÁéYÍ#<µ±b¸VjÆ„8…²€åó4ù\*[È‘Åì=†ž&€‰%­ŒÒ¶ ]òšj$^¢,š›zÚkt½2»zZÝc|AÑŸÙáìsHøµÛ™vP¯9£"Ü“d\dÈ‚ýį8Š‹@!(áû~Dd‰SÅH*w›2´®W@¥ r¤:§€ÝjUÈ"ÎÆajÖȼr&Ȳa7¾ý@ðùà3èØ4ã{À¾UHc3ÁÇ)0«T#ƒ= QzXVḓ¼6îÓrª±C%[ºÇesFŠbP UèáFÙ˜Ú»p°ùgò˜ßÒƒ¹lw×»ô¸lgAÀ ÚcŒXè1çÇ´ÇœÜcÅ#"Ã(S%r˜ õøó2èoÁ´´ËƒôX³á³ÃÏd3øL7ó Ù¬8€ qÁ`5íõùZ°9#Q4ºÚŸ üNÖ9×…“ÅÎ@8Y¦­Ð“`LýX= w¨”,âŒF¤K°àHD÷ÃbÜÑî‚(>ª :Z,p»#Ñe‘õüe¶¥±Âe"˜ KczV\¥õVJ'B—dœŸ.xó¸QÒXC«eØ+-YSæ<«§²”†ôDI© ¿‡#­é±OæÝ¿²åvûÇ¿^y£Wç8Içk¸6Ö´tZþð¤ç×îÜq›õµ¾~°üÞÖé“Ëë‚·H|Òœ©|›{M@óÑ¿üóY· ZÝnO¶.S?N?É>Ö=>vü¤ óæè×$è­žìU'Fx²9¾1žyö’ˆ…îy ó&•Ì Øžê„Î5ͱíW;·E\ëÞìuè…"=bfÓ “7Ä¥iŠ4D£´>I&¢1h yòà˜|†¢jY>““HÒQ< Å‘'§NŒ5(±²“\å7E#Q¬i—!6Mh”¶-ö pr÷Á¼ÄXȯF1än¿ZÌÆÙŽâùÛzv/º¨*Vvâ”´q¥ž8QËq ‡Â²ãth¶¥Æ”´Içj>[m¹™Œ,ïrsLÙY$6&š%a›)Ææfê1= ÓµË\rg°tILÒÑ⼘Þ*=a¯uÏ̒ݵ÷ý£yþݾè;""²ç5o|$¸÷µ¯ƒëß~ÿâŸXÊüwðῼ&øï1sªÖàg°ÿßøÚæŠW¿7n®E´^9'o]ÓÄÍþ¦¥þû¦,¬yoÃN\¸kaÙ]Û áq#аnûC8ú±ƒK¾þgðî=—×~pEóg7ýêÃSa_yiï+ÁÿôrbœO½æÖ1W¿R½åæQ;~ßÝ­l%ÈIƒ3q C7غ:ÆÌß“âéºãž÷ñßoíÊäŽ~??Kà›¬¼îZ7Ï|%%sƒ¿ˆeÇÇÌ‹©ŽiQ_­VÔ:Û¸F5ˆ_î*"Ϊfìq‰‘ÖµÚlŠLLLH@®ˆH‚ITd¤©ì^ÅWë)J‚¬,ix©,Èènõéi'z e8€W莔/ÕH7(°lèÏdÝ},9=‰Áî ÉLNÁ1 ~2$f¢ñ›‰w÷+-ÕK6nŸßþ̶à/ðˆ y“§Œ¿òîà‡xùeÞ1 òçÜ´-¸—;Zr$pÙƒ™qOµ/ÙWžÎÌ2Z«§MjHøa—R›·lü¬ÕéT~UwÁ­É:ýå•diÌ[ºJk­íèêˆèvîæÝæ îEÝèxÄÿDõ¦cD“¨ˆ7&ºÄ¨ ºy–ùaó5ܲˆµ¦kM·3·éowíÆ÷“ÝÆ·õfdANÁ"8Yº ¶?Þ‡éœï ³áæH-ɪ¯a2òÒÍwg”Í+ª°ÊYYÚÃbÙ´…[–4IIet 7c›h;Ð1Å‚¡d r(éÓ¹Ÿ=øìˆàsŸ¾{Çãx̳ÄÆ?ùì/öü¥tùç›îû3!éßþð ®ÿÃgxî¾O_IÞuã½Áoox2øÕÖ§@ÊÜ T¶hÄø\í÷ŠQxŒJx£i@*h(h‘Ψ!4î‘gÇ]^j zzÚ˜Õþ&\©R¨8«b»ÓN^Ëëxà[«Åj¶2ŠpÆæÆ&=v•Ë­¼Ñ¤Í¥DølÀ‘ج6+HÄãÎÈ‘—RÀÚpß¿{dÁå%­-Ó×ÜðÚÆà>ì»áôqÓn©›¾7ø*w4,bêâàëÏ? î©ÈØ›“>î«?ÿWb$¥‚{¾„~jÐB˜‚‹T©”Jİ´£¼:RƒTJ:f.Á”¥œÃLyQGx§ŽU‡z­¾Ðr”è½lÚ©ãIç|zš¼d,÷²±gîf’μÍ\ÍÝ,|4¨£.J&Uv#´D¦ø¥–lqÚÓhÈ"5„85½µóÃKÏ©ý¸lšPñÜšw3ùŒttÑZó÷vUC ËŽxÐ{þqá–ð0R‡/S™±‰‰En“xÔŽ¶H=„coœ'æqhK\9XOÍíq8.Â+ò˜wx+öPí4¡ì4ué* bÈ@ žðU^åñQY¤1– w9]£ÐzO˜7Ê«ò°Þ]áFVƒÙ ™-fQ ߢ9»4@##‘j·Å2 ÐF¤´§Üó¡T\’í1öãºL@Üc¥Bš#€ŽŒÌT²|{ð]ïw<€‹>܉ñÞÇÝ‹7l|v¥;o3&7\~r$)|w}ÚÜr_öÞ;¸åà’Î_¦5¶O›yõŒ-;Ÿþ»½"éHÞ¼%ÑT ]‡–7‡e±L¤šßÅ¿Áž#D£f•JEY»ëˆFPÉÕò]‰:,‚ _®kÔ±ÃKìIeMÂiÉÉ€-€€ÂÀä’8 'eÒ] 8b ¼çYòý³Ïv)¸£]’ß'º¦AáOCÓ6@«ôËC”ž]ß=7BZç=™%Ÿ“Óäs|‚|ŽñÈçˆHùlwÊë©:!Kävps@ ¡íhê@l*ò£"ô :‰8“w@u÷²ï”H¢aLiñþv0ÑÊJšš ºÊzƉ.fQBÍ4>ý,­ ­¹Ý_0Ò 5Í/ÈE+iSlÑm1*Ô,(§ßÍFÔj/Ï«¼š2ÑŒE³ß\d.7³fìESL‡¥ OeM§OHZþ‰…ò–’d8ál¨LZ—ð\ÙX9iiü³%Ï\ùÌkx—}÷º1-—3ÿ8ãè|yéÇt4a¶äfÑÑÄýéLt®O¥Îã³9ü~>³‰y—Q®àßgÞç™xn»•{˜ýZÅñ,Îfßa©÷Ò§~µÉň4€ià€Ög¢WÀwUèÌÒs„t>vÀd¥×?öp@MÏ•Úá¡;‹W«xŽaY‘ã-߀€ !žGa1QjTHÅ3DÚw'É÷Ò8¼‹ëàŽqŸr,7YE¯iÒ”XT¶+;” ¨j›üd»%Û,ΦÔj£¬T@ɬ €À½t;†®nÃÙ.­6*UBªOé°ÏžÒ>sAñÄv¿—W"MQÒ‡®2ÕÑГaKèpÐÏLJ­µú´£“Omñ±~‹vü¢a¾¤³ŸÊÞ¸©¹ 5ÑPBÁn5vc¥ñægÉ{XÙu¹²u> Ÿ@ÞízìÌ­äó¯ƒlhôØDig8ӯŸC*j v’‡üz%aB¢TÑgúú¼L–à2QºÃ –?aþÏ^Èx+B ”'à6ÿˆT®bWh7i«eÔÚIÚI&õè†é‹™…ì Ý*ýfJC8•O—£ŸA¦0c•~Õ4Ýh=+¹¹Yy³j7óRa"½>#0°D¥ÕéÒ8DUÚY†YØ QQ¯JN§× H¥&å¦v1%»‘§ïçDU'N÷óZ5/úµWh°æ(™‡ôX)¤küjF¢¡QÀB'™÷„È•síÃu’ÝŒT¶8è¦cYº~Âéè:¨³÷Ëñ2d‡9¥ŸØh'(5l^/¹„Á ˜kJ‡È ÈàWHÛýRu¿Úê;yyy%@"ZH‹—HD×ýï}zž^ ­S¿uØíÓsKkÕ‡s}úŒ\)z(®†Ö£“Jš›èèKj¶Úrr±dŽÁÆ[q,^˜fudãE˜{28ïñ`1wô‡Ü0±èæÌ÷ãÙW~Èf?ýA¤´pgH.«Ñ×ûL*ŲAتH0¥ I£R³„¨•*– ®LÔ`l rM£¦]ÃiT0õJbZ w†æ`Y¸%I²¹éT¯p– Ÿo3›"„)7TùÇû@ ;<Þ§ògÈÑ ŸX„ꈇÍ£ôjŒ¼ª‰ñ)õ8Ìôû©ÃfˆFÈш†Ñè¿÷õòLˆû¤I±HÓ‰ï|‘!G_<x6°W4í?´ƒ¦W :ÀGÜ[`M„£+üåN¶K¸-<œeÖ¢±iÂÙ=¶ÃúôŒÍf'b„ß8Ã<ÃæwsÅêùÂ\ã"óÛ"û<çüðkm·ÁÉ0¦H:ÌKýQœí8Âà¥X9\}ÕÚ2ª×öÝ¥Ö,PªxÒŒ+ Ì dÌ"`ž¡J¼缂Ç?r0xøé׃GwÿG¼û!_ýÕ ¿ ¾K^ÆËñ]Ïøã'Á]‡~‹ü:ø¯àë8 ‡Àš_?C²NËvÁøëÍ÷gŒË,dŠ0ŲPXha5ÚH`Ad³ËÚ–É«rŠN ÿN».$#}M›¦²ÓÓNôj[ò4²e$5’€`Çäôh¨$áÆiu7–||)¸¯}êéW¯áŽêMÃËŸ vu=ÊàmW”^¦ƒ–w_Ï}c†â±Éã"ïN/qØsÈÆÅFQ…Ée‰Q$rɶ$ïp®À–ïÊMµMò–qscн ÜZf ·ÙÆÝ„ngîG0o£·­Ÿ¡ÏlŸÙ.. %rÃ9¶Œ»Ñ~³÷m/ë±&z³¬>ï$û$׸¨q1S¼óTÅÆ¹a \ "æEÍçG×rÕa˼k½×»®÷~hÿ£×ü¹?܇èîÒˆpa¬ñŒ2Þk·rHƨ“#ô âb## QÅF*ÕN¯y2qЉí‰$Ñí¶Ò8ú“Ã4ÙÈ‘¬œŠhó!c¦ð’´"Vj¦" ©Ù#;ƒôQê(ÉÀÕœ­)áäzãØnnöÝ}×}¿y1øÔãxÜK”~ê»>ß½ü ›÷ƒÆá¬)]¸«,i³oíÂc¸ôƒ÷qÕÑg‚|p(øÉu©ewbß~Ìÿ"øn27Ü£Cõ;02Š¢ñT¿Á¤ÑcSŽkATµjykêìþó“3 Î'DÇeé÷ˆ¸,!t6„ÎþÞ¯œù…Й¦û[ âÑOvMgkJ]Ë]ÍêUúÕ†üÃ-º=†N×ú/ ‚^«‹Ñh0´jS8q;­¼ÂdtZήV[mNG¤Í†ÜÑEÛíƒ^éÕß©(ccÛc™Øh{ˆ²cèìßcHÀP8ŽÛOôúKN—K}©ÒF·¼ÏÍõ:f„>òž"¯ò|!ßhʧÒ7IB^BÌéðAÌ™àÐû]>¦|!: Ž^¹Urv!€º{šc˜çM’øHÞ5wßC¶>ÿêš—ßœ?wj÷©gçÖÏOvOù¾gãÍÓo¹/˜ÆñÛÕw¾á‰ÞlÂéWoËÓ(»Ú˜ÌÜÕj$¿ˆÒî/Ø¿‚Å“†‚þ;+™J¶…ieYO\6ãsa&)§FŒ‹;>n6S¢,˜Y¯óÆ’X&ΓcÈŠë—º@œ3×S§Yª[¦¯¶ì«5ktk ë…¶ØÏ&f«æÝVÃuÂÆØ«<7ên6Üé‰Õë4œìçp•RÁ2D=±Ñp ̼ðäí cNXQ²€E\„Ëq#Þ åvø=É‘‘V†‹LV‡{“Õ^”€œn¯ {Ms$‰šÞkrÑu²~ktCŽSt)Õh“\BqhUµ ˜Ta’™² c%O[yG=´Šf±YY›´ _c½¥Oèýv}Ãó‹J‡ëfÖ.¹ü¿¼ï»MÜQÃÞ=÷øòðûÅík6ýp׋Áÿ¹ ¿+Ô_7tËØqKblI¹÷ž©ª}uƒþÚë7,œ‘™¹,~ø¡m¯·´~}H©|TZÏšá×q$àcWÁ±êNÒr@RÕ0~B!b’J÷¥0>„ec RU‡o“%²äöÜu¼ìsAòœ*ìy4"[rÕ2#Ø­ÁpN·wï÷ÿ#Yh0çECÔä罆b¶Xõ’ŠµÒ‰Ý {;\5ž¬ZaxûÒ Ô"b¤ë¡.…Úâ%e¢‹Ö"+)·6ZÛ­ŒU'Y¿ô^5ÜË—…Q€ú¸•Q3Lyš“&à ¦‡<½IVˆ´éedËŸ­ þðÖï‚ß7>;aïúwsGÏìû(xæ¾ë±î+fÆ™ýOZü¬ä7EŸ_âÆK¾ ÿôOLåp"Šg<|ª6M[®½Fuz‡ö˜ö¤V#j‹´„C“ðjµ¨â,`q‚í%ÎB§Æ„ûJäA— ¨p€¨hë5ñ¾"nWíPÁwŒý:â÷-"x;ÙI¡WŒ"WÄ‘4Ðw€Qq’ã@‡Ür@S¾[Ö!›¨O=ì‚ìÂåtœ°žóð–õD è‚û‘`ûû~µ Ó¨ÒÝßÈÛ†TeŒ‡l9’ʈºIVE(enœ)k€™˜Œêúíðú”¨èd¼í….°x·½qÕ*6A²")WP9·ùÇ& ¯1ÁäµûPŽÑgʱOBŒ“LìÅh¾±Ø4ß.ܪºÕ@p…°â5Z­Z§7´³ÉDŸc²Ã¬Wp€Cv‘žµ&#=û„NöÅЂ1²s*Ud˜Ýf7iÕêÈ0DMF­Á F‹ Mj­ÊƌЦå»`cV¥" §í&“шTN›Í)ŒRã™HDZÃàð#Ï<,Ò…B‡£_»/$³Ži] ¯w9]öéãc?ïÿüQ±ò —ÐJ§õÕÞûŸ@Sàç!(x¾'Ö7€±1ÀØéšx{g÷iyÀîrÿö?×d%¶l›˜ðÃ}=œ1 ÆÛLæû@H:°UCL æ<œËä©òÔyº|}¶)×Ì›ÌÔ7Ñ@²Áu¡s_ÛÜÿ[jœ‹=æûJ¼RC¼l‚2^“¨÷šrØ|U¾†–8Q5‡-S•jè瘖à»TµLS«˜ÚØ5*:9¬4­4ob·*·ò7±ª'L/°/©ÞeßS½¯Çôû¥êKýç¦aôÉ95¹Ç0A0ô:Ñd6ƒA¯&: £5ó¬ˆY͛͢üÐCt:QËX´Za1ëtZ-R¥†á0 "Që×m'^ô„Èïàñ ߉;- ñt§ŸWô EÂë#@&?/"‡%ìY7åé¤é§(m•Ù?sœ(;Q‰¼ÊúÑ×f®)Q'ø ”z TÏ÷=ÉÔó¼¬(÷>6 )jå8|˜*öpŸ‰®—‡ûÌò‰íìþòp¸Oî£OƒíwQûð˜?Êå3ƒ"ÁÀ¡Ó[mf“Õ6BzOÃBLC-§P$£M>6Â=£w†§1BcZ³ ®™mpÆÄ’ú}pŸ8h2 ~2Õ½ÂGÝCµj’Ô~ùÙ1écpÜ›]]$édp{”;=,¸ƒœ!¿ni+,š7vM;óÑ$gEé#•H’ãZœuX¥ÎgØáй/˜l”ô¾ðë!Â: `h ¦Ú¢]¢Ê÷üã!ÂÆC`bT%ò©z¶×(j4+XJ> •R­P¨ŒZä5ž×(…š ÉZË5ÄáWóSd”Îæ”$H|Ž’lÖƒ ˜ÒaÁàÁpP¥Uk٣ݧÓ}Jrp(‘wø¨.©–VŽàøxŸƒª‰%½â6žŒdx×+Ãî¢q£/î?w=A–3Ó‚ã×­kÙ?s ëïÐ3:(Þèó}&=% |1k"ž š¨fx•FMaŒY5ϪxÞáΊçñw0·‹˜ÑÎòñW¦†pfép˜éU¸…‹T*ˆ†ÞãŸÄ‡è8 Ž”i*?L©“µ…`ô8õqŠ™È¡£ª ˆïi§€‰¨âV0íTSp\8Ó»}P`ôI$(ùA7QîÒ ! Ü,yIëkjíöa»›òÆÇ‡>-!Út6ÎÉ¥VºÃÈ·EÏüŽužy©„Ù}y¤jòÞ½g”KèšÖµÁZb—4°<Ë$a"pŠ$¤4e(±œGR¸UÝUÓcÿö<-سÇc6ºÃbŒ™a×âëÞ?X«œyÓwïßÔß'|ª?cPú·‚&‚v ]`L­`ˆ…J­wðN¼ç ò% ò—7Ïuç$gðàüðnÙ£¸`->(õ"Ëïb¹$¥B`HÂ&ÇaòËx”èQõt3ÿÔ =ÀîìLcL¶ ¶¼ÿ>¾.X{“"î&(7‡ìg®…(P…4±ùà~‹ÏK@‘'À>V€¾ðÛWÀ¢LËTå±dêÈq­RõÎ@nü4Þ€(Óœ:}ê¸Ñ4—*«I©'N´þ¦¦¤$³¼Ÿûí\q®<ô/¨Ú}æ2ìþS°”Ø¿LN¿R¯~ä`ÇŒê㑞ÆÀpG±{‚µW^IÑ/aƿ瞅{Êý&ÏæÈ"~ƒ1‹®`€/tõÉï´:²ŠpCüL" 0Á›!ÒIfïÇ›˜NR~€8ئ#8É4+ J}ÒPr|„e “‰Ã‡*ítµer÷—¬‹‰âQ.Žð_¯Ö©:gb‚.1Ñ§Ë Ë ÏOœ”X¦+K\ª«M,OÛªÛ”p»õç]ØƒŽ‡ã;žŒÞñzüÂ>ŠWµâ([”=iXb–õ ›ÄN6OU’T­ªMZ¡Ý¬}Iûî»$cn–³Bjl–-Ãm±/JhH ®T}¡~»~§¾[ÏíÔ?®ÿVÏèõ.ÆÖIö[í7Y\.%Çg¸MB…P<îØN²Ð/Äù©[³èMó>îå¼é>i¾‰ŒÉJóó‘]>ì³yìÑ©±O+^W(E¡‚(Òó¨×õV¥O_t}öÕû÷¸8Cj“¼ýåëõoÁtYSòfðRû+7‡þegÅ…\GˆdY#°Åj‹ñ2Ô‡Döë‚LLAÕ‘¥?5¡ebö²–àÌq[®XÑa¯ãš- j[ôS.ÛâçJ3–×ÖÜë¸jîøG6Nß0Ý¢×9c=|}òˆ’&{ÓµSü“SVüaãˆ<üQ¼KˆŸ–:±|áŒ+a7ÁÒõRú|Å;þG1§5ÄrÙÜ8Ž+Œêˆ"QQÑ®L×hWcÔŽ(E¾¹ÀZàœjê,S•éŠ eÖËœKUuºC½µÞy,ê}í¶6ÿÍö7Ç_">êŽrˆ\ª!Õ’ÆüÜTCWÍ}ñOö{A+„éYAá.˜]ù0—^c}Cƒ_S®i×°šVlÌD™Œ‡clå]¸ŸÄl.Ä30ƒ‘rCN›Ít’úzI^hti©Pr=§˜¦fÔä¡e¤`0ÅDÇ1`õžuBL~è`ó¾Å7ùƒÿøÕSËHÖÜV<ú@ÛŠG¹£]ÿÜ>cûË-ÁoƒïÜ…o~z½òÆ ¯ÇuÉœªw¢×üÔZåcc›mžm+7—Ûî w0·ëîîwjU:¿”Ô2K¹6m£®]÷ öú0H«µj7iÿB}ô"Cƒá cÀ”X'¥I;kå¨Q’›Ÿ¢“ î ˜ÔL.Òîb5.6Äê£Ã¡±š¤(°`)Lr…ž®ÄQÊB%Q¦‡g=/Ið&êbØ?O·D÷™â ë÷ø”^ÀaŒ^#€²4J#Òb4öLŒÐ'ýå g¦ñX¦jÆYêGÄ0×2,ƧɱLÖŒ·ÌSkj4ßóÿ Ó§Ä ‹32njÜŽa»†)sÜ9 …ÃÆkÆ»Ç%ÌqÏI¨UVº+ʇµû îK÷71߯mVEX'Ùw0ÞeVJLQš$¿ÚÑ1ô¢ÔµÞ?Šs¹ ü¸h—–·†ez2yÝþ† 6¿­ÜÖncm­ìAÑQ±O^7|bè6°Q†BÃ ŠŽ¤a­nÊ`¥R†¦ÆêéÒ¤-+'«ÃzÒJ­»¬Ön+k%OÈi2Ÿ¤Ú¶È~ŠX4=lB‘=ôxž´/™tJ~ ±@ž©y&‘›^¡Wzô m8Ö©€Ð5z7Ð1HûìÒÉaÆ£ä ±Í/?¶â±)Û–]WÓà?n,»ÿήEäžÍkg_¿¾ëI ±-Àb’Ÿ‰­÷—ÍPïPïRw¨©?QŸT+‘:JݨnWï ]úTÝ­æ£Ô0W)Y€Íz9XÆœ‚åJ‡Øì.¶ƒ=Æ~Ê*ޱ'Y‚X‘}¾±ìtUO›¥W¿Ðžõ}éKYÈz±åàÁƒì__ý‡0ÖûÃÔ‡òÞàLœ/µÑ„nóO ‡Îfr›8Φâ8%Ë–3#¬ÓÆ¢eœFIÛ¥Q(]FÃà{›Í©Õê<<¿Cƒ£4…šFã0[öº'ô¤äû4] ë%M¨pš´­e mkÉ‹p™™›•ì§W ¯JàñZ¯ Gò ÐGs3ðüÌ])¦>«›k¢s¢rsfŽºeûÕïÿÝÚÛô“ndKØõü´**Ýæß’¿Ê«~§R1O±@ÍtÿÃV0s™•<1)D³´pò€)Ž.,œ<g']Ö¿Nú¯†+ –åXE®z £Hæ‹ù•Lÿó…òAŽQx••O‘§.ÔÍЕ°%Šbe‰z=»š»Mý‚âì;ŠãН”ÿR|§ 3ñ<Ç0,¡.,j°«9µJå‘W–õÈÎ,<Œ<«Â0¾ô R*ñl'6ìç¢UpòLj’þâÜSƃˆô>6Ð  7‡V÷'÷„곸K!M=;!¡¥*˜žm>jC²=,Ò;`TŒÊÎùyõ°ŸZQ@SöGP•·ö‹ÒiŸ;ôxœä‹Ð„B‹WŠîcûÝÒVþ~+=}¼_<[à$}ÓJ§}š_òŒ1}Äb•Å µY,RwÞo§7ÿm_¸œ—•Hʪäö"­:) ñÃ_—â§?ÞswôÌS¸#¸¢«ŠD­ Ò'Á¯2È•¨{ÛÄÁ¤”›';oeeËç´tù,¿…é˜ßRÉÀEq;¹O8v'9&ŠkäÚ¹nŽ©ÂF4´$Ià8aÚ‰ð1PCI©ÃöòdR’Ì•’ðm–zB{pÕÁ‡HF…f¢ô¤î~Ï?J£Éxœ=®þ“í3‘{›;-›JŒQÛÃE5ÃÄDºa. ° VÄ8ÿ†ïðìòð¢Þ³Cz¸·ìݳ#‡CÌï@$3ƃß@XZgˆB”ZäˆõtâUÎ2*Ø]ÇéúÕ©².iyÌÉé©P&%£­¯·¢^k1{-Zc86éÂzÄ¥ôÈ3}XRz ×&=çDe¦¬#÷•ž÷d<¸tÅ-Q—¿|÷ÃbJG6þò`qÕÔ ù¬÷¦é‹}üpW¹«nQþM÷wÝBö¯ZUtû ]ï‡æ‘Ï-+zÕoæ…™ì:…¿0_˜O2§Í –òl:¸ZÀ· oØ?µwÛYQeÑ[¬&˜P°Âªãuz­>V#Í* ÿšévi é¬b?i'ö]öû1;kgHf˜54±˜L,¶žIåTlé´"¯¤P×;¯XF5¯â•<£¼F…>xS0ê˜ Ì#ÑtXŽlâöló½m•ßS$ð—MlyˆõÞòø¸Æië»ZȦúå£n|µ‹z(}80Ñ!zÆ_fRòíÅDÕ²ä|3ò¸åxä§b·ha“„¤°l6_ÏNŸiþ4F=XÔXWXÁXGzGì<x?_ηó,ߊ͙$ÓäAhPs= Ìu<˜½.û‚øúšëæ“ÑmiéY·8#ÓªÍ÷çßX³å¥mŸ¬]°=ÅøàŠU<ÔÚ²/XËýjë̙ۺo½/øÃµSó»~`îíùWÞ~ååw¯‰ÁZæSÀK@.ôkÿ­’DíÃɲZ«( +tLqìˆÜÉe™³Â #ǚdžƒ1^i® /l|Kñ¶ésÅWÚ¯íB‰Ö&…ùH¶v¯]@jÉûÚí±~åø<ü 1`Vgq‚Ý©WXÀœBz›>Q«Ó€ƒßPnh7°†Vã VgDd?=WVrO Ä5acÈH—lƒìsLÎa‰·ÌýUðÛ†7/ÿMÓ½]îGWµ<øøŠ¶û‚µD5|:NÁÊ]Á«¼þû1ÌÞ×^{îÅ·Þy‘jA]zÐ1¢«üÃSÍX`q ›ÅŽag³Õl+«PUj•Zg6ªuˆQaDˆWÇïPaU´hÆfmRK5Mx¾WK=.”j¦þë´S¾žÛ‘ð}íb3õþ“Ç_¶{” +6Þ;²¶páe#G~™%’õÞÓ41ÿ¡¸ …åÍ]oÑövÉìƒö§á÷ýkÙhKt¾z²zlì¼è@ô:õõê«c4?2ìYF§¶9í¶´)ÃÞ±qád.!Bæí¥ªRu)_ª)Õ–ê–ª–ª—òK5KµKu½ã Ôk"6!'v_¢©òVŷƴƶÇþ‚¿S{cü-ÃnJ»Ÿß£½/îþøÞßx­t3Êé[ ŠóhyÖ)zÃXMJ„“F®(G¡c†c‘ãqÇë…Áåhp|â`£ÛÄñ$™ ?¢ö“@=AühIÒ --Ö,é¡’H½1 ã”Òˆºá S²®M”;c~³=ËÑIîWÆ&BÎ'\¾7q¢3ƒÞåk¾<ãX)ÌhÏ Æ8‰±†èOz•«ô¾i}/KótIèSþTRh¹¨ Ìø$æÍã6ïuñ·ÉS?.92 M¯Q0 fQDëÄp¤ŽW†c.‚H |uëcÂQtŒN«J58>NÍ+’Øp%DÐI#éì›ãBoŒÛ°Z)MTÍ?û(~œ7.…ÐWT ðd±É¯“ ½Âý†kÖ®[•íùÅ ·Í•—xÃìõ¿Z`ìжԮ[jµ¦†_ýô-ój_Xÿúûx„kYs`숻'cÒ†éVÇG%M\»Ä>«tVnŒ+ÂÌÇfŽZWº`çüG)¥Åvÿƒ$r·!j?‚xê:ïÍ’^^9 "í°p´:3È*¨“ <ˆJFc¢Q4Ö™ !Ñl¥îi'ý &KV’ǪÌV-6[5ÀðFèÊ´zì6IŰác6l›î”ØžªΓNÒèÜåìpv;Y'Ø·½¾EGT¿– «žîè5[Oôh]Ò[aAÏ€@RNVÐë :ê©AŸ*ƒÕ†#Ê(O‰‰ä æÐ"\œW2 lgÿ™Âuo_vß AsPc¬Ÿ9óúáï<8qùŒìrc×ëÒ'Ìœ½} ñ±ˆé»@˜/ _öD6˜èÑFO¹Ygô©A½ÊRÑ€tv}Î8tæéÆ :Ò…â!€o_úÕ m#+ðíÿ¡ø”,$B`Ð& xµ—÷¡l~"šÀÏÃóH‰ªX]«I­ªV½ ­Ä+ÉjÕ*õJ~3ÞL61×(·¨¶ªïB·ªoàE÷ò¿BO(÷ñ/¡ßð ·ù¿¡¿ð? Sü0q¼YùxDžžÀ²áü&kçE‘#Ë£æ-j5ö”ä»vâeG…’W3s©Z¬Vùý~ù]¬8üÌÂA̯‰Gk¾þƒô°…ÓÑUÖUæ´Ÿ8^zÔ»×ø2úx‹S‡þ³¾ƒ’û`_ˆ9ãÇ‚u¿>'ýíH°žõv]½¤aÎ ²…ZïòÎù0"&²Ï/,8‘MàÉdãBãõFÆHéSåÎ\²uëß›Å*´j³"\í0q,bµF¯2 ÈÌX”.U¸&”72Q•¤ÏBÙÊ|ÕpýXf‚¯œ¦š¢c˜`œlZh˜eZ¦¬R-1­V¬Q¶ªŽ(Ž›þ©øA¯1Æ£x]œ>ÞgJµä¡\ÓJÕ&Õ­Ì-Ú‡ðn²[ó ö:¬8ªÿ-XÅï«¿d¿4|a:¥ø^í21’³‘’Só¼J£Õò‚Ñü5å‡Lbg÷$5oЋÏ•*Qi4™’8%˜ÊJ=¯Õztz‹N§W †$^eÛ©RhÁJ«2µzoäYƤÓjésmtXMêåÌ[N :L.j×1ºNüŸg𸿂îý“¹~õ #n0^a¤ŽosýÃå’=ÈÀÀ?tŸ6Ÿ®–¦Ç´SeevûðO  Ì>¸÷Qˆ"ŒRxÎGô­„ôØÚñžÒ5»ø NÔŠä©îO†CßýÆA”fMÝŸö¾n¢dJGÖl0ÉUÝoìSÒ7&À÷ì)™Ò>‡ªûÓ}JQ¾j =¬@Sß8liÙªÎî7ö+Óh‰ûQ9*×Ô[xï}6é>c÷§x‘‘ìµ€Cž®o6ùÐ0“ä½Ï,9-Ȱôü%r‰ÆÍ6Éó‰‰cð”à“G÷²™{ŽìÌqøñàÁ'÷$¼ DÇqãˤ¾ëÖW^#Õ?|@Ö:ó:P¿äÑßú¼ò ƒ ¢òc4‡¾†›Ù›U·éo7ãŽ)Ž)_1¨ ~«ÏɘÕa:§ó5ðõUªi>[¢,ÑëoÁ·ò·jž Úßj^Ö¿*|À¼­þ½îCá3ÞdR(Ù%I¡–œ’ ú$ :¡×!Iàbà…Ð j"xz]’^Ða§¯W’B¼’ø&lš¤»\Í*êËý<’'üŠ"E»‚Qt’1~½È\N¢g@G'×=zå–$[@´Ÿ §N p@JI* PYè5=ÔÿHr:z^á$½ç²g•ç Þá“„4>m´ÍÇÀA¿ïwûiù>̇£Ý>µßÕû R‰d³Òê EN¡´ÃÄa¾:xÛŸîKq óx7x¾ö£òƒ_‘xünBÚè̂ڮßáÉ%Á2*½ÜÁ™Ì70~N¼ù€Á… ´÷»|ñ–y†ÇyƯó b|Z–@¥Vm²êì¦8Mœ6N—£ÍÑeëo3jâMñæ‰ÖS‰¹$¬ÖTk® [­X¡[m\cY¶Q·Õ¸Í´Í|åV~·æ)áIãQË×ü–꺄ï,Ý®HZä H~‡Ålö˜x |1hA`x4¼E£áÍ&“V«Q0.‡¹Iu=í"®NRxÈ`ö›ü–N2ǯ)4ùMd‘éi1uâч 8 çi’É jü~Q›¦¡eŠ´Ý’ÿÙè©è,)<.®áát]M V¨ÒÇŒì©ãúR¹N»pBŠ!;Unz†XÕwÝŽŽqȳlJ‡8Òù$Òv‰4Ý_â>ühéþøp®Îõéa>æ3†üÍKèûëèe¸Ì'o äJ>‰¡)H¡¤Êâ–áà &ÚŒ^N\þìGIÑQI9¬›¶n^VpÉ!>6|™!‚ﺭmúdÙ¿}|tÉl:ÎñÀ§oÁ8ëñ¿ÎÔI^RÎÝ»~çWCŒ”bŸõO†H‰W§ >ìã'áñd¼j’z†PŠç9ªê"¡W’J0AÖâVÕZõµx£êõwø}¥…'¨’Ô>Õªw±’RïBX ¤¦gÄ*NòÕ÷Xb\¾÷±ÄÄEh;ØSµI5=ëÇé—ô&š3’¼÷~B^D“ûlIL¹#InÎpFm¾X‹.€2+]‹‡€†ë›V!N>1Ï;//ªf¬Æ4¿¬¾’UZ•·x˜ŽƒˆÓH™±OÏžS=BàïšreðûqËZ“S~õîsž±9w ¶%wãš­EÔ=œ‰K$¿­Œ#ˆÁ—ûí ÞCHÏ;<uC¾Gzhèw¨;Ð7t«ƒzƒeŸº+8Syå¿/‡²RÉf É ô½ ß :峆ï lðß[¼ %`¬=n£Þ£3»EQ¯{ÌäÌwyâ,ù&".?þ1Ìæ+CE¸ˆ¹vØ×I®œEôøD=ˆ†é ¡¯bQ$álÉh¤ïd¤ûôq)Xº†¢)“æsU åÅ-—qʾ€’ªûHÑ5ÁýÙs#Í]S®ú~LÃFOî¡wŸóŽÉ¾K°Öܼõú^¨ù$™Ç´!+šëËZÃ5+«“´ÃA8bÑ@=ô ¢ú--zË"2¤Ø¯Õê´N@Þak’_“B_:ƒRéËsékR©‘tB~1äd ™Á¹aòËQ€Zæ/}´àê5ãÆÅŒº6ÇÕ¬‚å'fø›Hòk«b²"LÓ‡¿UãZš+ÿ¬iG·Z÷ä,2ü9TÒWÜû—¸Dzîx¿"žî˜)ßVŒ‚¯jÈ/ÿ„ʑÁéhŒ*ªûÞî#Ê·Ïùå „+B—ˆ¯÷è ï¢ËØÇ$eZÉÍCÅx3Z@FëèÁD ?û(j†¼Ã÷Qp>Jï…üsáøŽ8æÁá ]›G³éwÈ{„Þ e4Òr¤s Z ŠB ܼî.¨ïfîET ÇÝ¿—ý Ú­ð¡åðý~¸ïi¡\šî¹Yñ0º®ß é•pín8Ã÷{ ^ ÷¥…âjåuÈAÏp(àz”sm¨¿qÌ3(‡méþô¥Êœ Ç&¨£Îãá˜yÌp Çfü"Ú‚_ì¾Òጮ‚ú7ÓëpŒ 'B9!½î‹…ïWAÜ íPÀÙ‡Žxò(ñ‡ž‚s*ô~h<êÎ9þƒx;ÌS`Q= £¹†wp»—¿!Í*8>EH[ ÇÝp€ ¦›Œ¾ªKL(BÈx?B¦? d [€®Ûà>ûS9ìp¼M„û¿E(|:B.?B‘ô¸¡¨- K„f_P4äÞ†PÌŸŠ…û=±pt WǯJXƒPâ0ñá< Ò’¡Í©—#”.Àq5BPf&ô!ÚDìƒ2òo„ㄆCýᬂ<8 ï_"4òa€ñc„Fd£áúhÏØuûBã¡Ï Ì‰åM^ŒÐèÓÔ,„¦MDh:\›í(z ¡™Ð¶Ùï!40˜ åÏÐhG)À[u,ÚP9ô¯°®8EgHæ2‡¾±·ƒ5ûHÙØîíæva„Ð\jP,ˆËíæJqŸæw„°@Š—@ÎX´@ K!L@†îRHËL…BHKH•JH…hX …¥š y>„Ðü7„F)Œ…Ôl©=Ùp ó¥¶-WÊŸ+Õ•‹¨%Wª1EHa¤ÒrQ†”s¬te¼N”©Po.š%ÅçJñyR¼XŠ/Ê,…еŒ…PâF)y|P i->(Ÿ†¥È@#Q!òC{G£1h,‡Æ£ h"ŒÆd4(a 7¡™Ð¿ÙhŒÌ<¬Å0* ÐBƒ2tZ„ÊQ—RßVW'Ô7Ô/¯h^V[¿¤9ÐÚÖ\Oùé(ÌGA^?„Òú*êþŽ/é9XÛM}…ôL¾†Ìôè†ÚöâZ´=žÅ'á®ÇÑtýz?݉֡_¢Íô=|påhÛ,@n,ú%vHœ`yz òÎG—££ÈŠíÝ_¡+ÐFæM¸k#  =.¥þ:<µ» úñ {åPTq{wq÷õÝ7vß@G˜ßvwÁH8Q%ü½Öý ÷^÷ÕRtº }‚oTôæ£vÈyŒùíL‹»—t-p£•Ð0| #IPz}íx3J¹¯»£ûyÈå kÐíè(ÎÆˆ›+ížÖýŒr2Z¥Þ†ö£Ãð׉~…>ÀZîd÷ýÝ'aô‡Á]xüc‚]‚…ÒOlÑYû ¥ý½ˆÞÀ1øÒÀi¹ ÎÏ­é~ è'Fp>zîüÿ‹\W0/°ã»GÓ7P¢(Úè7èO؉Sñ <$r7Ó 9 îMGU@Õ× [¡ôAuööEDðÓn=ŒˆÝîBÏ`ôTÄ-øJüþ C‘;ÈŸ™_²{Ø?(+ ×—¡åè:ôú6á<</Ä5xÞŒoÀ·á×ðøK2ŠÌ!ËÈ·L ÓÄüŠ  ë°Wq›¸k_‹ƒÏüWwF÷& Îuh´þ&t7ôìz½Ÿ ?ck°þDìÆsñZø»_‡ïÅ»ñ|jyÿ…ÿÿ‰ À¨DA‰›DÃ_ i&+É/Éäuø{ƒü|ÇØ˜h&‰Éf ˜¦Zµ™Ù‡˜?±Nöu¶pÎànævr»¹G¸g¹“ ­òJR½z澮Įƒ(¸%xspð`÷Ÿ€)»€w  õð·Æûf ¸ÇÑ›X Ø9q"‰§2‹ðRÜ„W’WãÛñRÛÃOJïâo¡Í:â’ÚœB²Éh2þ.#ÒDvÉAòùžQ2ÆÀ„1‰Ì¦Œ 0­Ìjæf¦ƒy•ùˆù3sš9Ý,ÏF±Ñ¬—Mb'°‹Ø6önö ö ®”{…ûLÁ+–+6):Wæ(G*‹”3•eÊíÊÃÊ·Tå@Ï¡C艾" Êl`Æ1‡Ðõ$“uß‘ß=/BUÌ4”Jvã-d=>Hb¹UŠád8žŽN²^Àú²“œ&Ùix ž–’ô·° µ€ü:Á>}û”¼J¡Å—“oZ´Kz6þ “Æ&1¯ ˜O°’½}Èò؆O‡˜" ‚_±#¹bäfîD1Mx=:Dƶ÷ƒjÐñt :'šƒ3ð¿0óÉt ¢\æ/è*´Œ¼‡NoA·à*v ºeâuè ô pEW¯HT„á—H-»•˜ñADØ=Tÿű˜á,èj\ÆÜ®ø–¼³Âë,>f…Ö¿Nc¦±'¹Y¸8`=Ú„šº7 Õ\1û¼ÌÎyÈÃ~ Òm“Áºá|H•Ri‡»‚ÅLƒ+v œ©@sABÜ·‚œ`‚jÇçƒû:¨˜C:ÑNAêÀ$÷ŠÔ(áÈÃó}y¹ÙY™éi©)ÉÃ’â㼞ؘh·á w:èoœX¤9Ñë´^-=šÎŒ†‹_.vxË;XoÌĉÉô{L\¨ès¡¼C„KãûçéË¥lbÿœ~ÈY}NN¿œÓß› b*H&Ž‹;^#vâ3‹!~ÝØ˜±ã„Ÿ&ÅwHqÄÝn¸Ag¯+vàrq\Çø5[Ç•…âöiø11c|ò0´×@T±[Lã>l‰¥±ËßGJêpÆŒ×áˆK[ÐÁxÆUTuÍ,76Üí.IÖÇTÆ,î@1£; IR4Fª¦C1¦C)U#ÖÒÞ kÅ}ÃŽmÝÖ) ÅåIÚª˜ªŠÒ⦢„ÖaL‚zÇvØÖ·Ÿý …›Æoî›Îlg¯é×­[7‹»f÷MuÓ°¤Ê€{‰g|ùÖñPõ6qÊlj#KŠ;ðF¨R¤=¡½’ûˆG¯”/;Ô1£cj¶.-‡¡qní@³V»÷;þ#ÝŸ"ç8qëœâwGaxLIÅX×> Ú:kõ‡_tôOI¶O0ÊÀîÓB­®o$Л&Ťì46eV/²˜¶(fD‡X)BKŠc Oy4ä¡­•y >%îꨂ©íP)ß*äÓëôþÎ#Ĉ[ÿ‰€bNü­ÿ•ŠÐ…Gø'¢QJ'½¤é=ñޤ¤ŽÄDJ"Ê10¦ÐÆ‘Ò÷ìäa+:ILL£  àCE€mEI~*ÀïvÓ¾¶Ó׎ö™Åòw-ßü©I%¤œ¦ëI ›KSÚ{Rzo/J>(©ªa*oï¿A°šÇÕäw`ëy’rzè©qÜÖò¶Sæôû&§çõ¦…bæ1ÅL8 ÅH8#¥Q–öf¦_е¬þQWu*U@•Ò,ŽïÊ'Êa ïv_àMÝ'é]Òéìm¡fvä'õÿ>¼ß÷~ÍÓne Á0¹L™³`ëV¾_š\á¤Ð (Í)v‹c:Ð\àLüwvË£GIx‡ C3ýÉ—B_ûe ÅKàC©3yØxt[·ŽÇo-ßZÑÙݾ8Fb¶!Ï’g·6Ž+ï!œÎî£×†wŒßVXÕàüäNòÌXST÷(#yÆ7 ÂT8 á˜Ç"8¶Ã¡ O“èýUQ¦Qò$zY… ç~ô•t~Ý«Bþ¥Q~ï˜I~‘Þüƒ`§¸ÓKüÞ›oƒ¯4ð^#Ähà½zÄhà]³b4ðÖ­€ ¼UK!Fï‚E£wƈAÐIî~"6.*wÆ2,Ž2•( ?Ep° OÁúŽ¥m»cbbýÝÀ¤„Ĩö£¸ý)Ü> ·ß‹Û¸ýrܾ·àöËp{nwáöHÜîÇíOâ<€¢ûöûêóÛqû˸}/noÁí^ÜîÁí±¸]ĹþNâÞ?)S:“NFÎÎ#Ff n@Ô®€ƒAOCø:ÝÒ7?d£åÌŽHzŽ>X(OÉÏh5‘<7>Ãðúè9TÇëp0Èa!‹à8Ç·ptúúðOH44|» L…£ŽEp\Ç·p(¤æ| A ¡&>.5,5Ôèôyþ¨Âê&n„à’„‰Ìv6Dâ‘Ý‘$Y­ LF•±ëÿK÷ïéz”š\O¶ƒùj¢|Þ¾ÿ»ˆ¨N|ë~ï“Q£Âð-(’ªÃ>äÅ8ç¡é{6r©è9 ¹È#pÎØïšEýֽâŽb=½ëpÔw®ãQ_¹: D¿t=õ®ØÉâýQoÕGG½åº&ê¥ÔN\yÊÛ‰átT”²qåEí}Yʺnßu9=ŽZïšµÌ%%ä„ËZà›ß5Ë» j"”7Öµ8ÊßeŽ*t]U çʦ÷ŽJƒ&$ÉÑDhl‚Kª4&R*pnn'®ñSÞ¬,VÎí6C9LéVF)#”áJ‹Ê¤Tz•VÅ«T*…ŠUÐç-tå:‰®$X‚äœ!½v‘•â‚´•@B ^XEÀî03SȔ٣ñ”Žc•hÊb±ãôì˜Ñ¬âbFãÓ4eÎ莼¤)ÊîY¹IS:”E ‹÷a|} \í [:1šNÜM/m §ZÁ„±qãuáô¿ñº’d·®(´šF}ãÇ”‡Â>þ'ö~ñˆŽ›§Ì.îx8¢¤#ƒFº#J¦tü‚ª GÀ@:9nìüwz*)>ÂŒÄÿ7‹^gFŽ-)™Ò‰çIùˆÿù€bþ.åSE"‘æC¢*RÎw»œÏ÷C¾Xz‚|j5òHù#k0´úõògì|dÕ×ÓÕ¬j+p^°.¶Àð ´~œ¸ä|H]ræKBL.â¼…² ˜Ø²}ƒcÖ·«?lç'±hBcÿEÈÒÀÌ‚ÌÎvóÒk 4ÈÏA ²\uA¾K@iF`ùy¢©ôÅô´Á°éíÑÏÌùˆˆÂòãôó%§jHP.•V@ Tü(¹È¹.ˆb䬗€Ïl©€ó@Ê0`õ¢r0»_¨ÎG@! ~œ†þK0U¥VåUž¦K¥§ÖÀªÁ—}ú€Dó\-ÑŒ—Ѹý<IÉÌ”ŒÁÌ”>Ýú9à9Iàü8ýüÇ¡©hÕ¼{ºô“€©ª]^;(¹Ð„ Ô–×^ c!ÿÀžKW°JE_V9ÛÔKè逑—úy!*ËÿR/aX«öòRFsQUEkÅc*!Ã…-Í}±]Ÿh„¼i ¥í–si&̬sAèÓKcÐaï…bè]‚s h…¦ÿ/C‘ZUŠŸJ Ë+jë§)é¼›E½ËUr^’ é»”}žË×ðzu_«o“/©Ï^îñÐC^¨®­¯í»ïõ¿„€\À¹ëyƒÀð²Õ¶®tàå¤óïöß¼’&=¸,ß)®l®h„/ŒqÒmE­5‘ÓJ“¥ÔëM¹} £o—. “„B„ÆXJý$ÀÿBÏèšô`=û©c½‚nû,j-VJ¦‘ó-Ã2êt;½ßª£(•$ÒµÇ äŸš}ê` RJiòÔkŒ`¡gg¦ݵKÆgàØ÷EçBfƒAq¸&¸x02Œê!Àø‰¤B;6(‘ЄóÇYñ'¡ým¹°‰úk ì´tU¾¹×Oà¬@ÀžU×.ikî%È ³++êëAöœ+;§§ÖËKi¥H M!ÿ{»YQ3 ¯—B?ºñKs]èp^ Ð3–’ÁDõ™ Då¼[Ÿ4Ãù6@ÓA»®:¨Ÿi[x²%— Û$® ÔõN§þÀõM¬nnX.AÙ"£ MÍPÒͬsV›Eà°<ßÖr’?¶Åü³ÒÞ›¬2Rƒoµ‚Ÿ7@ý [Îç”3$­ú?Dg? ¹êsÜôøpr¡£¶ó.x NU½æñ‚2ø¢€ŒÈ KÔª´¬p\â2HßB†$¡ó,Šô¥ŸÁÁ¸TÒ¹H”`.ôeÒ%QLuÛP Íðä½íb¨f|ÛÐxHi”ªóàq¶3—ŒÈT#áqÑR§ŽK¥›‹Ä &3_Æ8]ÝÔÖS½¡ypû¬Þ\IA½÷] Mê¹i(|Îf ?õ[t´‡?VC’ÕY¤.R"õ‡êRÉë'c†IÞ@կ痀`sÕùõuH¿Hw¼¾²ª¥1š]¥\ ½ÍªR»¤I¦9_Å|zûu©Ø IW™‹qÒëÁå\L.•°. ,îÙ¥V¨£—UK ¾åG,?9ËO˜ðä/†~fKw …J(u€î˜=PRõíÖπδÂæ¢'¿>Ð\*ýÌ| * Ô·Ïvökk­=¿G3 IKÒJÐy`¥>ŸÓ° zraàÍ…Ö ”6€ ³ªw¶Ï— Ü„&Á68™ýŸu8öô÷ [YÑZYS5ÄÂwp=™~‚üê¹õb$ØüÐ=CáÓ›>€#3bÔ¿ƒ? RCX/N-ËúÁt©Òì'â—›Z¸Þ×·Û? ½!MÁó™€}7N$+ç"vއ0fš1‹S«ªú­É]¢¡7„‰7´i÷éeŒëâ½¼”ÑÚK‚&_”—ÄY ö"»>º¢~ÙàÝ/M–Ò~´úØjCý OŽÉÅœÍ0`[)-í\@/Õã¢o!ƒ’Ð…z\ú»€¶‡*{ºòÿ"˜sÀö óO¤Þš†Ö–•ƒ’n(íŸê”òŠ‹5+jÚ.dÿrbCël¸g ßiÒÛ.»ïf¿Æ_Z÷XOç\Lõtý:¤SR¶sW÷sÖ£Ÿ8œç_-úñU¢¾ý:»àqržu¡V4¨k_‹ýçX:ßJЭý70M#7cp .™†ž›zó\ÔuÎBØOfTs â<à”&K.¬¬ñµºªó&çøÜÆà€_ê´5 ¤¡ ð"'°³ÀW<Ò,VM»öÿÞ!H_|¾!ø‰”?”ÓÒ…>2Úƒ¦„?õÈ¡Y/Ä)mPWœ>8`•¥õ][º4O¤Á]ÎïyÔÇ)Qr?êÓy¸QÊ$uÝå%-ýÜnÿÄ!j™úâ—§é²k+Ôp!ã;èÒêÀEÕ´sl¨K[{|ÕùbW›/bÅý{ *æ€^þÔá ´€ÆX9¸YOâÅñnÏ]-ç÷'œÊ6H{R0ov_¼Ó/±÷‡¹§ïCi*ýÝ‹û"ÑsëÅpòE£AÝ «Eã'RÂy6~dÃ`pº­ˆ_C-|ºä]uŽL»ä ‚!·λ%ð_é;c陃ôýÒF~Øå˼@Î";%ÑL$ä¬?Œ1ÒíCA"™ê4}€ègÑ Ö·Ÿ¤!ȤD?nâü7ª8çÉàýº$xZk@Ñ÷Lýõæ»°Ç{rÿd¬æô”04\g³ ØîH˱sºúsÁvÂ: Ú<Öøß„,ýÏÉA»ù““ž‘\´¸­º:0ø\E3гœåÿ¬9‹j0}Ø™Ÿ“ôs"C‘N¿ç€$4fW”&Ol¬•b-M-Ýß.z‡œ 4}KÄã6mH€~*ÉÔ.„h¯bp±$åèa°ŠIsh~qeMmeØÜVß9€ À¾“ù®¢êB ¢…Ì‘r‚‘Ô¢äPò@yÔŠöïçÀi ƒÒ…<š_ÑÜ*½pP”n–pú ä;ç!Ä=ûIøÐ î–AéGJ9¿DÏÓ0½ìlh^&¿Ë”¶N\QQ×&‰¥*qü¬¹¹Ö@ËæÈèköõiÏ¥ôgÀ8˽RÝ•ºCó€íjq¿y‡ö¦G€Êc\ ªˆ”~®7]uÚÀîüÄÁ9¯ëÀº ôí@ïî÷EÌCor±½½8µ*§¯ÃÎÏàp—€qø÷žzzWÚû‹ý~ýGDwßÅ\9ëõ°R-Ó¤'+{$Miò´³ü¸eR}m«”YŠœ·Ü>ež?ãÔ†Êeý ]øÑ[Fµµ6 ¸­4Yºü£7ÏZ9È­pñ¼7Ži¨¯êw›ta‡Þª$_äŸ8_õ™žÎ;ýäÿÿñÀdK–Î9Ód ¾ªÿKµÚû¿Ï¾ÿ}ZŲ«Ÿ÷ýâôsþ÷¿CZnî¹ïÏÊIÿ¿ïÿO|è»Ü+ëõù"ÐÚòŠú”ƪjž?ï½4«á‚D-ý..Ê©­¯:{µ¶jˆ¬¼Zº´¨²¡­¾uD¶8\,åÕ °ƒ„,i4ŠÉ-bܬ(ïbüÔŠ9âu­ â’Ø‚Í --ÉPpD}%ÈæÚ%5­ q=…ÓM)¯W\(ÆÆö©AL^Ò*¦‰eâp¨F„OUƒЉb ²¦AŒ–*«§Ê°t_ |¢{³‹â è“Ú·3åUÍçV/¦—÷©»>Àó¼ 6¯n^.&W‹‰)-T­¨…°¢m„­ •„4-º%Ò.&¦4´µö¨Kÿ³ü_Õ°jõ’@}JKëùØà§|~„ÿ3s3ÓÎáÿ¬ ¸ôùÿ?ð)Tµ§—Þ6¿V⺌L0EÍ +jaÊ.ª¨\3ÑÚ}@ʬ@S[ms '¡²¢®ràUé×à2Å€¤êk«+ê+W7ÖQ=/-“.mÂÔ¿¶”²Ds`ycëꪆ¶Åuz Ì…ÆÖö)BÊ´^¾¡O^(ÄBßk*[Íôǃ×/L/[[Jc‹ZkÖÆ¤Ãì9 H£éŸ_1kKÁ* %—Šp7Ü[WñÂÒ³ýY ­]\ –Í/5ªŒCŸµCe•j*¥-:o©uj9çÛÓZhuCCë…Ê?ÓÑR»& N<š+èÏy€1< ŽQ Í2rÄô¬üÌœü¬\1#-=MÒÚ¦÷û¡Å«Å±2aˆë˨^R'ÕX6dã~æ:¡ÆJZãZ™¦õ+j›a AWí¯­ ý ý  €µ€"Œzk] ~ PE¼K¨Q‘–’]¹|ý9¨Üƒ&­±õÜ4ê =DRkCc¿¤þdG'κŠÅ:J“´T©“Z8do&A;;ÈL‹“ûTÛsmˆ&'g^R›ûßÕ/µ§Í=-8‡±‹FÏ–Ù©.ÐZJ¥eDiiLºô­t„tA¾¡·fúnØý9‹aô›ÇÐò ïýÚ{ö®_P+eemUkMj|LzBrikÅâʆ:hvbFr©$˜šÛêä‰#)=Aʺ_¤Ý AÛ*W›¸¾O¡ë{9P®.Q*ëFJý-m®X²$P%qviM Y@‚j}£$Iú4výº³øõVC«>Dè}ój™J(–¼ÔCȶ¸aÕÂÅ[š$5,9 *’©Š&Bµe ë ]®]\M[¹¾´tý ´56ÐR9€E "©2‰Z¤úÖ¶~mVˆB†f¥¾Ùd<‡‡"Þ¬Þä!™§/Fõ,®CðÒ$PVë¥RÏ ç— ½B[·°¬´vI}Cs@ä¹´¶ú–eµýêîßãZ¹êµiTÄœ‹ÜJ«ÊÒ*ªª@¤zd ™šÜõmË«÷tzg]Ccãj¾Ô’FyÆ]8¨£Z²Ó+/Ü<«ÿI³ìá÷¿ÒÒ²ÒÎê9òïedý_ýï?ñâ÷¿f꤉¹ˆÅP¿ÖÊÔó[`òCH ý³_âkIsÀ8“ò]ùh…kÒjÇùohlTJM9§€ªÞ”P1?ÓªÉÿw>gù_zmãÿûÿÿ§çä¦g\ÿù¿¿ÿ÷ùÈk“Á’@ëZée˜µôm@À-½’a½PÕ&3›<£÷ÍÉÏ—vËú?‰ØX×ìß"Ö¶R±ÑØÐÒR Æý8º¶ÓÚç'ñª*ÔÙ¦®ÌȺÕÒÖ]ã ÏÌÔÓíŽæª•`ÊÞÞôWѤ›Ô·¤æÆª”ž'lëé¯íALõB×hcZú&}Œ²¢g‘º¥•.Hƒx U/ÕØVpèWUa²»0½µ²¢^\ Wk*êAãëm9}Œª¶×[:TE5ÌâБª–Pƒ'ÕÓŒ‹kë嶬ìÁ´5è|c-7ÐTZÏz±²®–>•µº¡MªsIÈl¢šÅ†•õ:µ¸¢E6ª*ÄžÕ­–Õ-T‚R–¤È¯Û¥¨SG ¥¶f#°ÎÎ1(d±ÛÈ¿»×g!["©ykg÷¯}}¨‡sÎöH`esm+ˆn:€c’’äíÉ*0ÒC/Ål\^[U ¢ºµçiŸºÏ0†˜B‹Éj—„ÇÊZ˜‡ªé2(…«¥W64/—·@ZW Jj÷÷d?rÑ]Y »´J¬oh¥äY"v™êj7WP³Uö%õmb]`U-ªØzG"-¡Â}žGÁ¥A©èá†ÞÜòxÀ!^¨J¡í/M]/‘cŠ8ꜙUz].ÐSuˆ«)ˆ­Ô¯—Nz5­­ù©©rÛW§€Žº<Òм$µ*°"P—ºRAè?Jñä©r’Co}L©i]NujJ‡?GI2âcêã @@`9ðÐbà‰Bý“X¢ƒ@×I©‰ßË !tÖƒ¾A•˜Â¿Ö††ºà¢^Ž•‘ò÷,Tƒ5•C2IDÔ“íœ×_J‚@*†.1Ðoëûã’@Ò‹(e’¥Ÿ„Þd,SYOù}ÇdO ®š6)TÀÙŠ £„TJë’5ëé¨ÃTTÕ÷GT{»G;ý#£¾råÊ’Êe)õu©—Ó·ty÷¬í¦J«ô¸ßM±¥@¹±ç¹SÐ~f??p©h®„ÁtÚš}'“¢<ì›ÜwNé—À•³Žn{­CdB‡¾¿”§l×+f$™B‡¼çéø’¥¯(3ú‚Û#ÇDjjRæ T´ÔR_¢(²¢gÆé©=4® uu`,S‘K=2è¬d›vŒîêC½KjWêSúnö…NrÏ‘0k[ÜÛè¶Úº*±­±‡ÐÎ.ý ”ïç) ö«}5D™ø¬*h¤ç)DQêéGU[ïÏÖ.¯m‘ÄÙòÚÊæ†ž×Öõy=AüòÊ„q4psmµ$›u•=Óåòåmõ ¤fÖU¬†CÍ(ïC ß½þ¯5èÝ%–%ñ9°Ò¡¯T4×É¥´T,½að í\ˆ aDêP[QG&¥ºÍòSÑPSÈú8¯Å¢Š¬sÝ,òó'UËEÇ'¬µ#F¼4w÷´„ʶÐ(Ç ç6Œ¾‹!?Œ4S·QI“ ß&u°ü±·<,ªÈüùù¡†Ñ>^x™ò›Õ¡ÔAЕӠ׀#í1úû34¸Ï8Ñ·J/T‘†JZP’eê˜ÓÇOš@læÌ˜2n:L5}ìÔq³Ö‹?Þ’‹èæE EæP=£?¤Õ°"мþB1úÑ’hʆ~- LÀ”%ÅPÒ<%ÌfͰ‘õîç¬óÔÞOXÉ÷-è©^1@ç MìÿO{ÏÚã6’\>ûW#§ 챤‘æ±É0ÖÉù€ìÝÂö]6XJ¤,f5’ RÞ1óßSîf?ù”g}8ñÃîX,vWUWWWw×ÖJº½f]´O×éçìä:CŒÔ )I&ÞÇÊûûûh€ÿÉr©ËDnv/ÍÁÔ… KœŸñ¢QeÛùÿ„¦WW à ëx¾Ïð ØÂ{Xа¸àb»']È¡‡À†µ ¿Úõ´1©žÙ¹F‘ D†/£9ì©~Q*þÝ›wÑ ë;?+ísæÂn›aÁé€õ$q”ód·ß.Ò<§X®9@Ó œùU37þ( Wõñ—ÂýÉ{<Q[.f‹1è›w ”†C„‘yÁ¶§0^É„EÚ°·&:eä,¥Ny$e`YP‡Ö³(Ù7dQª1H£ú<úOš41B±¡Óuµ¤SPʵúä´Å§i 3#ˆÐ9÷;à$Ý¡5¿Y]¢á§ÀùÐÄä Æ¶´\ ^Ê>EgÊv.?BaÆv[ Þ%ûàEA¡#ñh¥Ë&^–TkmK`ò¹¸($~H‹Õ–¤x®•£àÁ#ÄVhkâ Õz½KÁß°74Ÿ“Î@ƒ§H·àYÖ›úæ°ºHkúbr˜j’UÏ9…`¶…7åtKör¦U,q°ÿ”®âÖB÷½÷8zû㟔?¹±Æé?S3K€)tãXla·+±ÇóóóîÚäÑ'ªÅ,çpØ4ѱpï$¬îõ6N`y¥0ål{n“//m½Eƒ¹^T;P+q¹Ò: »¨M4PØý-ÝgKL«(rÁ¸Ÿ~úéŒf²ÑÎK¬š»r!$H¨‰W.½ûa˜"¶œa7É ò&MQ…è ÌL‘—ù#ò3lŽiãö–Ù>/¼X \ÊylkÑYïü(gÓK…ƪ„í¤W›IxÓ˜=É aµ J¬u0Î ïÁY·ót+Óäøiöÿ;ûÝÃ#5O¶Mù›÷p„P&ò››¥—y÷´,°’8•$ËóûpRŸ—ôí“[M19yÐ\™)„;[VÁt#ϲ„5¯€F3VºIob’_b¨gâŠ~¥iBK¦çôP?¥Ëø°.Êvéx Os–çˆú€Pö¦sÊUqfYš–|¢®N½ÈÓ{» :ïQ4JrØËµ0†â—h·Šù€íÛ4&‹ÃB¾)Xá‘-qæ4r™´ÇðyôkJ;À2*yÃv:ªž(].KmñþŽ<_ÅG’çˆòšú1Ýœ8bÑ-îø,]ÝM”›5¦â¨×<±ÄMKÝ!¿š¨|þ7' ð¼ãçƒp¡B>z.„>5V±švìYC~€¶åU„+ü榄äMì ·O|QÍ%Á³è·—KñÇó{.¥üù¿?×ïÄ}±².-Hqç‹,‡=$wÛ„ô& "Âä°išdxظEY£Sd<÷Ù$!RÅv< +…"&!Âò”Ф`q!}LªŽV=”S]£#¦9vù9ÞgxÐ.o0Ô¥[z¿HÕ)1Ÿe—›±’é¡û`þ‚Mdk¢}Ľ7Á¾Cn‰ýêÒÖEÄÊ÷ñ’ÂPÏWBˆP9¡#2ƒDT{Ã^v:DÛñZûh•ÞËO5UGlD–íˆw¤Ï['©pËÃP¡ÜÙçt½Ýá2†~»‡ø¿¾<;lûq‡Æ2†üg!£ë-º;Üíœk3ê_ðÐÄå.#¶Æ…È*Z´ÀñÑä.žcÞaK)¿ÃÅ´D¤ÌR°`q5Ây)T7ÂäNª›ëWzk-âÜ|…Ñ@IkEEt›a9J^im´îÙ †‹¯ÍŒ ¨6»¨>CîªKúEÑðG°Eƒ·ÛµZù Ý$ã-¢Û6|å4Ú!ì_4xÏüÈE»Å/ˆ›>2™BŸöÀ£* ##i×÷ù)Ûâ$×uåC3ë°a`a‘§ê¥6ÿzêA=ö $Ü þšsb±˜OßÐǃ©Êüo7^ÐDG¬üÁ¿Ñÿ'N,šrO+N&¹mwj:%¯œ.Ú£ûF ÿàQ¦½ÏLa^’SÌR®;cËäê•Öx[”ªw² ¸ä­‚0ú䩘0&Wb 6û ôLŽÃfAäž|o£Á÷ZzaV/:€qm«ûÉÂEÜh½'áŠF­G¹[b*$ˆgðç^ÌU›}–TÅí•ÅÂ\8¸ËËÄ#(²Ñ#`üz¯}i Äkä:Žo+°Ÿ± †7Ù§¬ˆÃÌÇR|  "á×2p%ð½ÕùQèã.-< 5BH€ù>LÊ…gØý–¿¤wdàÛA÷ /ò˜Tù*ˆ<6y¼ß°bU¡.ØóÛ@@˜û¢á#Ѐ٧*( ×üñ]{Ðýñ4ˆ=5Úw%M®¡’õ»ÌÙĉ‹"5Ò·iîa*¾AŽæAŽR©Q0Q½~•ŒÇ~T©µ^èÒxèj\˜RâÆ]8@Èsõåaà éê/ðγÎ)§IjWåÊ!Ò>ã••ôh§OÚE©“ v²ô°‹)êìÿ‚‹/?Æ f#Ïïf/ém4øo'}\JèY²r†×7Y´ÎzáŒ78ÞÄØôFäÇÖä‘ßÑɾç´ãêšÑ©µâC\öØm¼KÔû’³…À„ot„‹0iø’xË 9 ÇE±§ÜQŒËÙ¾{˰k´ïà],rOG=|ìkÚ49ñ»*3äâé±0Uk}­Kö_sÁ6—{p;ôL³#XT튄ø™lT(qgÖÒcðÝöÇ¿] ?v- wÖ =¶¡ÝZš×Cð¤…ê08ç»—žõFë¹-rñÞ£Û\^º¦dqK.ëP6…bŸ}Bß¼X‹LÀìQz¿Ëöž V˜*ž;µ>$6IcÞÀ‰Kɵ­‚±Çôílš—\@×K•#ƒF…~a'™œ½¡É=³ôòã…àž k° ‰²ºéºôÿÃdK¿IþŸÉôbjçÿšŽNù_Ÿä1Ä)ß–³œXNfÖÓ·] ^<’…nÚ_‡ios·'dÞ쟩ôÍÓI| AªÇft”±q"Iµ±ùqûkúuÇEï᛫êñ¸:ÊxL+ưÆÿ}Åñ=”Úå›jM?:ަúä=ñéPlQ±`h7ïK¶‡âqPî øddÁ‰‘5n%m˜xYÍÄË£01Eèýo¿|Ãâ=®™ñQFÆÉù ÌÓëÿÓh|‹£! ð"ò±ûRyÚ¼Ãoù ŽÌÚ¢ÿÀìý.zƒ c àæ¹{€ÒOfêÉSøªÌÃМÍ×Õl¾> ›/+ØüØ0ß°RùGŽ÷)g6Beb tNÑÔKNS•r>[ŒnÌÙáM%gáõ8{SÍXb þÝk‹/_‡½²uâlúù›óaµ˜"æ×ãCüéXãü|¾,a˜"þôMŽÈ¸z¹a¹•îóži¢ûê÷]ßÇýrëô×lS\ˆ6ìHãsùåìåßD&:‹ïò’ï;ü7-­q’˜žO1¦08±Êa•Ë$tŒÁœœˆ|h l¬1ç&Õœ›s 3šVÏù*gxf:O(e€–#Q9cÆÊ¢O᯿þþ¼9ª`Çu°ˆ¤?ÿT‹Õïâ/saÝ«ÛĘï}3å·¾Üið”÷e…Ëc÷Qsÿ7½Ùõ_'ÃÑÅéþï)ž™LSO“ýçx²‹aŠ||˜o·¿<êå¥âɯY’š¿Qå×äÞü‘ ÿ­’½ùë§}¼[e ”H‘-¶k«…õ6.ÌŸ0úRZ8­×… ˜ÝaÅ¢Y¶¼Ÿí’åöPìÅì°9ŒŒŠY»| /ŒznxÍŽåE`:ü¡ØRó- º%’{^âïð‡ùúê¯>>æ6Mdwù.©îgé:OMì’%PýÔØ-3òꧪòKeËda²b»Ðª’™Ú°.£*´‡…ͨ”›ÔÑBîÔEVˆržÏfŸ©¦Ú¿<\Q%4~¿Àÿ+»ý®VMÈw²4pôC¼9ÄëÙìçQzÿÖ„žßD³YÙð~oÿ¨'i–•%Gç“ó‰ñ¨ ù0Ë)w\¨`%}ƒKD˜+üiÔùêr¡T6M²Í§‡=,œÈuª®±]J¯“fƒ¥2ϰ&«¨ƒj%÷yÕE>꣱ºòO³lÓçËͽ•iø1E÷ŸèÃgâ;Uz ø1;†™_©LTÁ¯h57?"·ÍàXÇÌú`Ç¥Í*ñz£×ðP_z2á+ GõäøÑÞyRïho¹p4ˆ@– ¢"ŒLÈb¶äˉ¢A8ÉIÌwÞt!H“ÄVo5Ù0LNWe¡° k3>X®O­`~Ð$9<5Y4àFú&ÛëbâMi†§k`u¡áhuX´ÙfM<²Ùje ° Œ¾5ùÚ$JUû¢A¬§]:©ÖE"šÂVɧÁׄǙÔÕÄ™™WÆu™òXe¶ R2guexɲúPS~ªâ]4ÈÚXsÎ×Çu˜‹Eƒ “q¡ KYâ ,¨*o~“® Gz“ Z¿u“œ&Þá¦*«ñÄ6Ñ®sj6ºÒ}ØœöïÝJc'`‰€’º(ËáíõÊšØÃ›W#‹»9ë.õ×¶2i/oõP§%T§Ó ðÊbÓ$5A¥ušSçj‚µ[ë"Lßi8séƒ[YRF  %à´ ŠfQ o´~A‚â霜æQõ§•ؼ˜ÞøÁÙÌp:’¢¬übeËhèƒß¦®”ðe^Y¹ðâmNŒÓtBfXüÊû±oìoñ\ÁiQï˜2´=Ïb<þõ5˜¸@6ýDˈoiÊ4jã¶ÔÙϧ±N{hé\{ÀV–œ_émq§-œŒ>°•%sÓ ׬Û[ßôÂÅvµg¬µ% îÖ`r// £Øf$‰ R©©&Öœó|±²†ïÚÁ4¨µ––´ –Ñ8°^‰¼¤ te‰îòÚÄØf#nÆP›ÇÆübÀ²„G@¯]d5x› 7±½OÜ‘[•ê…\Yc0uñå 5ŸÎ[º&mÞN–è dï2ã²€Amý|áš—–9âŠ{ n¯.‰!é>)€ÉÎ g³6´Aüºäô: €Ú£>Õe_­û”çÕÜgkÎk]†Â² ¼û!mwé‡óŽûy¼=êC]B}ªX9Ù06ŽÆøúæ ŒÝ…cã2Õ‡Lºeyu{ât,YïÀ¼]xÀlÜŒq@·Pë³’ cÇ·WÈáØ¬Â\æGÖJàùÂá¬nF9r;§Í‹OЯ‡A`s£]Üå0±‹õeUXÐöZ7Ö¥VîÓïË¡ eëžK]­5®lK/ -U°HœÒPêU+û·f"T®ÏÝ>]ˆCíÝ>³ˆïRèÒXÝ…<ùý_yÿ[bxì;àêûßápz1¶â?'—§ûß'yŒ[MHµ(Ð7êW#Ôhû'X¤Ôß|Ëÿø,Е´·»KYÐñéÔ ~ó»Piºf/ÿ|¸ÓÜ…´_Ñ hs@ïþ$Š#~+œ‰þN?þIŸÿê®î‰ë¿Œ..®Fný—Sü÷“<•õ_Þ–×·T-۬Ї6Ækö5¨òëÚR¶ýöðiµþò‚j¥a"tÖX§EŠ¿ÅëÝ D7Äë/á0Q »‚[ì¥Y9—&í9Ú!Ù7ì¡-!=Ô:MŽ“á¡ŽX.WÓ¤ ME#2ËH}!™ÃkòhQ˜£)¯ÍT(’—ôì2ëZ‡ÌiM;)S¥´ÌlâJTk3*î4,¬ÓCP¸ôP³:B½h{ZVÙiÜ8×iS(§ªa*>Ó¤vLSy2ë³t,©Ò´3--}—œóM»1ò£wË~Þ¸«2±yÛlå}ÕŒ{n•¾_§‹õU66­Z"Ú¶™eû²™â[&voG% l—ÎøT™Yâ{$ooשÊÙÞ-ƒz»Î8qz‡dæíºáÔ¼òŠ·ëFË•Ú5±w»eÚÅN©¨Ûuå3lgT>º¾)“wÉGÜ®- q×äÁM;´³ÓvN:Û¡C‘k¶s~ئ]Zkq“Ä®·s¦¢®KÌÚWIÔs›šqM»ò(å&EÞúR¨r„Ézo]«´µîPgë\P­C—²ŽZ÷Êg­;¥‚gŠ•µîJÖ(ëZY¬u‡\P¬})°~kƒmR4ªîÕfEh¯¿µ2î–,½i7®ÑÐ Ór_Mb%Uîš,¹mwZŽänYûÉâOƒZµéy“»%Bu¥÷Âyu¿RVÜÓszNÏé9=§çôœžÓszNÏé9=§çôœžÓszNÏéùûþÏx0¸âopenhpi-3.6.1/plugins/simulator/0000755000175100017510000000000012605014575015660 5ustar mohanmohanopenhpi-3.6.1/plugins/simulator/sim_annunciators.h0000755000175100017510000000370412575647265021432 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Christina Hernandez * W. David Ashley * Renier Morales */ #ifndef __SIM_ANNUNCIATORS_H #define __SIM_ANNUNCIATORS_H /******************* Annunciator Definitions *********************/ #define ANNOUN_MAX 5 struct simAnnunciatorInfo { SaHpiAnnunciatorModeT mode; oh_announcement *announs; }; struct sim_annunciator { int index; SaHpiAnnunciatorRecT annun; SaHpiAnnouncementT announs[ANNOUN_MAX + 1]; const char *comment; }; extern struct sim_annunciator sim_chassis_annunciators[]; extern struct sim_annunciator sim_cpu_annunciators[]; extern struct sim_annunciator sim_dasd_annunciators[]; extern struct sim_annunciator sim_hs_dasd_annunciators[]; extern struct sim_annunciator sim_fan_annunciators[]; SaErrorT sim_discover_chassis_annunciators(struct oh_handler_state *state, struct oh_event *e); SaErrorT sim_discover_cpu_annunciators(struct oh_handler_state *state, struct oh_event *e); SaErrorT sim_discover_dasd_annunciators(struct oh_handler_state *state, struct oh_event *e); SaErrorT sim_discover_hs_dasd_annunciators(struct oh_handler_state *state, struct oh_event *e); SaErrorT sim_discover_fan_annunciators(struct oh_handler_state *state, struct oh_event *e); #endif openhpi-3.6.1/plugins/simulator/sim_resources.h0000644000175100017510000000403412575647265020732 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Christina Hernandez * W. David Ashley */ #ifndef __SIM_RESOURCES_H #define __SIM_RESOURCES_H #include #include /* Start HPI location numbers from 0 */ #define SIM_HPI_LOCATION_BASE 1 /* IBM Manufacturing Number */ /* Corresponding to change made in snmp_bc_resources.h */ #define IBM_MANUFACTURING_ID 20944 /* Resource Ids for SIM resources if the sim_rpt_array order changes this will need to change also */ typedef enum { SIM_RPT_ENTRY_CHASSIS = 1, SIM_RPT_ENTRY_CPU, SIM_RPT_ENTRY_DASD, SIM_RPT_ENTRY_HS_DASD, SIM_RPT_ENTRY_FAN } SimRptEntryT; /* Maximum number of SIM resources */ #define SIM_MAX_CPU 8 #define SIM_MAX_FAN 8 #define SIM_MAX_DASD 4 /* Maximum entries in eventlog */ #define SIM_EL_MAX_SIZE 256 /********************** * Resource Definitions **********************/ #define SIM_MAX_EVENTS_PER_RESOURCE 10 #define SIM_MAX_RESOURCE_EVENT_ARRAY_SIZE (SIM_MAX_EVENTS_PER_RESOURCE + 1) /* Includes an ending NULL entry */ struct simResourceInfo { SaHpiHsStateT cur_hsstate; SaHpiHsIndicatorStateT cur_indicator_hsstate; SaHpiPowerStateT cur_powerstate; SaHpiTimeoutT ae_timeout; }; struct sim_rpt { SaHpiRptEntryT rpt; const char *comment; }; extern struct sim_rpt sim_rpt_array[]; extern struct sim_sensor sim_chassis_sensors[]; extern struct sim_sensor sim_cpu_sensors[]; extern struct sim_sensor sim_dasd_sensors[]; extern struct sim_sensor sim_hs_dasd_sensors[]; extern struct sim_sensor sim_fan_sensors[]; #endif openhpi-3.6.1/plugins/simulator/sim_fumi.h0000644000175100017510000000167612575647265017671 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2008 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Suntrupth S Yadav */ #ifndef __SIM_FUMI_H #define __SIM_FUMI_H struct sim_fumi_info { SaHpiFumiSourceInfoT srcinfo; SaHpiFumiBankInfoT info; }; struct sim_fumi { SaHpiFumiRecT fumirec; SaHpiFumiSourceInfoT srcinfo; SaHpiFumiBankInfoT info; const char *comment; }; extern struct sim_fumi sim_chassis_fumis[]; SaErrorT sim_discover_chassis_fumis(struct oh_handler_state *state, struct oh_event *e); #endif openhpi-3.6.1/plugins/simulator/sim_reset.c0000644000175100017510000000411612575647265020036 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include SaErrorT sim_get_reset_state(void *hnd, SaHpiResourceIdT rid, SaHpiResetActionT *act) { if (!hnd || !act) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } struct oh_handler_state *state = (struct oh_handler_state *)hnd; /* Check if resource exists and has reset capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(state->rptcache, rid); if (!rpt) { return SA_ERR_HPI_INVALID_RESOURCE; } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_RESET)) { return SA_ERR_HPI_CAPABILITY; } *act = SAHPI_RESET_DEASSERT; return SA_OK; } SaErrorT sim_set_reset_state(void *hnd, SaHpiResourceIdT rid, SaHpiResetActionT act) { if (!hnd || NULL == oh_lookup_resetaction(act)){ err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } if (act == SAHPI_RESET_ASSERT || act == SAHPI_RESET_DEASSERT) return SA_ERR_HPI_INVALID_CMD; struct oh_handler_state *state = (struct oh_handler_state *)hnd; /* Check if resource exists and has reset capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(state->rptcache, rid); if (!rpt) { return SA_ERR_HPI_INVALID_RESOURCE; } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_RESET)) { return SA_ERR_HPI_CAPABILITY; } return SA_OK; } void * oh_get_reset_state (void *, SaHpiResourceIdT, SaHpiResetActionT *) __attribute__ ((weak, alias("sim_get_reset_state"))); void * oh_set_reset_state (void *, SaHpiResourceIdT, SaHpiResetActionT) __attribute__ ((weak, alias("sim_set_reset_state"))); openhpi-3.6.1/plugins/simulator/sim_injector.h0000644000175100017510000000241612575647265020537 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley * Renier Morales * */ #ifndef __SIM_INJECTOR_H #define __SIM_INJECTOR_H #include #include struct oh_handler_state *sim_get_handler_by_name(char *name); SaErrorT sim_inject_resource(struct oh_handler_state *state, struct sim_rpt *rpt_tmpl, void *data, struct oh_event **ohe); SaErrorT sim_inject_rdr(struct oh_handler_state *state, struct oh_event *ohe, SaHpiRdrT *rdr, void *data); SaErrorT sim_inject_event(struct oh_handler_state *state, struct oh_event *ohe); SaErrorT sim_inject_ext_event(void *hnd, SaHpiEventT *event, SaHpiRptEntryT *rpte, SaHpiRdrT *rdr); #endif /*__SIM_INJECTOR_H*/ openhpi-3.6.1/plugins/simulator/sim_power.c0000644000175100017510000000447512575647265020060 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include SaErrorT sim_get_power_state(void *hnd, SaHpiResourceIdT rid, SaHpiPowerStateT *pwrstate) { if (!hnd || !pwrstate) { err("Invalid parameter"); return SA_ERR_HPI_INVALID_PARAMS; } struct oh_handler_state *state = (struct oh_handler_state *)hnd; /* Check if resource exists and has power capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(state->rptcache, rid); if (!rpt) { return SA_ERR_HPI_INVALID_RESOURCE; } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_POWER)) { return SA_ERR_HPI_CAPABILITY; } struct simResourceInfo *sim_rinfo = oh_get_resource_data(state->rptcache, rid); if (!sim_rinfo) return SA_ERR_HPI_NOT_PRESENT; *pwrstate = sim_rinfo->cur_powerstate; return SA_OK; } SaErrorT sim_set_power_state(void *hnd, SaHpiResourceIdT rid, SaHpiPowerStateT pwrstate) { if (!hnd || NULL == oh_lookup_powerstate(pwrstate)) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } struct oh_handler_state *state = (struct oh_handler_state *)hnd; /* Check if resource exists and has power capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(state->rptcache, rid); if (!rpt) { return SA_ERR_HPI_INVALID_RESOURCE; } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_POWER)) { return SA_ERR_HPI_CAPABILITY; } struct simResourceInfo *sim_rinfo = oh_get_resource_data(state->rptcache, rid); if (!sim_rinfo) return SA_ERR_HPI_NOT_PRESENT; sim_rinfo->cur_powerstate = pwrstate; return SA_OK; } void * oh_get_power_state (void *, SaHpiResourceIdT, SaHpiPowerStateT *) __attribute__ ((weak, alias("sim_get_power_state"))); void * oh_set_power_state (void *, SaHpiResourceIdT, SaHpiPowerStateT) __attribute__ ((weak, alias("sim_set_power_state"))); openhpi-3.6.1/plugins/simulator/sim_controls.c0000644000175100017510000001332212575647265020556 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Christina Hernandez * W. David Ashley * Renier Morales */ #include #include static SaErrorT new_control(struct oh_handler_state *state, struct oh_event *e, struct sim_control *mycontrol) { SaHpiRdrT *rdr = NULL; struct sim_control_info *info; SaErrorT error = SA_OK; if (!state || !e || !mycontrol) return SA_ERR_HPI_INVALID_PARAMS; rdr = (SaHpiRdrT *)g_malloc0(sizeof(SaHpiRdrT)); // Copy information from rdr array to res_rdr rdr->RdrType = SAHPI_CTRL_RDR; memcpy(&rdr->RdrTypeUnion.CtrlRec, &mycontrol->control, sizeof(SaHpiCtrlRecT)); oh_init_textbuffer(&rdr->IdString); oh_append_textbuffer(&rdr->IdString, mycontrol->comment); rdr->RecordId = oh_get_rdr_uid(SAHPI_CTRL_RDR, rdr->RdrTypeUnion.CtrlRec.Num); rdr->Entity = e->resource.ResourceEntity; //set up our private data info = (struct sim_control_info *)g_malloc(sizeof(struct sim_control_info)); info->mode = mycontrol->mode; info->state.Type = rdr->RdrTypeUnion.CtrlRec.Type; switch (info->state.Type) { case SAHPI_CTRL_TYPE_DIGITAL: info->state.StateUnion.Digital = rdr->RdrTypeUnion.CtrlRec.TypeUnion.Digital.Default; break; case SAHPI_CTRL_TYPE_DISCRETE: info->state.StateUnion.Discrete = rdr->RdrTypeUnion.CtrlRec.TypeUnion.Discrete.Default; break; case SAHPI_CTRL_TYPE_ANALOG: info->state.StateUnion.Analog = rdr->RdrTypeUnion.CtrlRec.TypeUnion.Analog.Default; break; case SAHPI_CTRL_TYPE_STREAM: memcpy(&info->state.StateUnion.Stream, &rdr->RdrTypeUnion.CtrlRec.TypeUnion.Stream.Default, sizeof(SaHpiCtrlStateStreamT)); break; case SAHPI_CTRL_TYPE_TEXT: memcpy(&info->state.StateUnion.Text, &rdr->RdrTypeUnion.CtrlRec.TypeUnion.Text.Default, sizeof(SaHpiCtrlStateTextT)); break; case SAHPI_CTRL_TYPE_OEM: memcpy(&info->state.StateUnion.Oem, &rdr->RdrTypeUnion.CtrlRec.TypeUnion.Oem.Default, sizeof(SaHpiCtrlStateOemT)); break; default: err("Bad Error: Unrecognized control type."); } // everything ready so add the rdr and extra info to the rptcache error = sim_inject_rdr(state, e, rdr, info); if (error) { g_free(rdr); g_free(info); } return error; } SaErrorT sim_discover_chassis_controls(struct oh_handler_state *state, struct oh_event *e) { SaErrorT rc; int i = 0; int j = 0; while (sim_chassis_controls[i].index != 0) { rc = new_control(state, e, &sim_chassis_controls[i]); if (rc) { err("Error %d returned when adding chassis control", rc); } else { j++; } i++; } dbg("%d of %d chassis controls injected", j, i); return 0; } SaErrorT sim_discover_cpu_controls(struct oh_handler_state *state, struct oh_event *e) { SaErrorT rc; int i = 0; int j = 0; while (sim_cpu_controls[i].index != 0) { rc = new_control(state, e, &sim_cpu_controls[i]); if (rc) { err("Error %d returned when adding cpu control", rc); } else { j++; } i++; } dbg("%d of %d cpu controls injected", j, i); return 0; } SaErrorT sim_discover_dasd_controls(struct oh_handler_state *state, struct oh_event *e) { SaErrorT rc; int i = 0; int j = 0; while (sim_dasd_controls[i].index != 0) { rc = new_control(state, e, &sim_dasd_controls[i]); if (rc) { err("Error %d returned when adding dasd control", rc); } else { j++; } i++; } dbg("%d of %d dasd controls injected", j, i); return 0; } SaErrorT sim_discover_hs_dasd_controls(struct oh_handler_state *state, struct oh_event *e) { SaErrorT rc; int i = 0; int j = 0; while (sim_hs_dasd_controls[i].index != 0) { rc = new_control(state, e, &sim_hs_dasd_controls[i]); if (rc) { err("Error %d returned when adding hs dasd control", rc); } else { j++; } i++; } dbg("%d of %d hs dasd controls injected", j, i); return 0; } SaErrorT sim_discover_fan_controls(struct oh_handler_state *state, struct oh_event *e) { SaErrorT rc; int i = 0; int j = 0; while (sim_fan_controls[i].index != 0) { rc = new_control(state, e, &sim_fan_controls[i]); if (rc) { err("Error %d returned when adding fan control", rc); } else { j++; } i++; } dbg("%d of %d fan controls injected", j, i); return 0; } openhpi-3.6.1/plugins/simulator/sim_control_func.h0000644000175100017510000000160412575647265021413 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Christina Hernandez * W. David Ashley */ #ifndef __SIM_CONTROL_H #define __SIM_CONTROL_H SaErrorT sim_get_control_state(void *hnd, SaHpiResourceIdT rid, SaHpiCtrlNumT cid, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state); SaErrorT sim_set_control_state(void *hnd, SaHpiResourceIdT rid, SaHpiCtrlNumT cid, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state); #endif openhpi-3.6.1/plugins/simulator/sim_watchdog.c0000644000175100017510000002201712575647265020514 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley * Renier Morales */ #include static SaErrorT new_watchdog(struct oh_handler_state *state, struct oh_event *e, struct sim_watchdog *mywatchdog) { SaHpiRdrT *rdr = NULL; struct simWatchdogInfo *info = NULL; SaErrorT error = SA_OK; rdr = (SaHpiRdrT *)g_malloc0(sizeof(SaHpiRdrT)); // set up rdr rdr->RdrType = SAHPI_WATCHDOG_RDR; memcpy(&rdr->RdrTypeUnion.WatchdogRec, &mywatchdog->watchdogrec, sizeof(SaHpiWatchdogRecT)); oh_init_textbuffer(&rdr->IdString); oh_append_textbuffer(&rdr->IdString, mywatchdog->comment); // get the RptEntry rdr->Entity = e->resource.ResourceEntity; // set up our private info info = (struct simWatchdogInfo *)g_malloc0(sizeof(struct simWatchdogInfo)); memcpy(&info->watchdog,&mywatchdog->wd, sizeof(SaHpiWatchdogT)); /* everything ready so inject the rdr */ error = sim_inject_rdr(state, e, rdr, info); if (error) { g_free(rdr); g_free(info); } return error; } SaErrorT sim_discover_chassis_watchdogs(struct oh_handler_state *state, struct oh_event *e) { SaErrorT rc; int i = 0; int j = 0; while (sim_chassis_watchdogs[i].watchdogrec.WatchdogNum != 0) { rc = new_watchdog(state, e, &sim_chassis_watchdogs[i]); if (rc) { err("Error %d returned when adding chassis watchdog", rc); } else { j++; } i++; } dbg("%d of %d chassis watchdogs injected", j, i); return 0; } SaErrorT sim_discover_cpu_watchdogs(struct oh_handler_state *state, struct oh_event *e) { SaErrorT rc; int i = 0; int j = 0; while (sim_cpu_watchdogs[i].watchdogrec.WatchdogNum != 0) { rc = new_watchdog(state, e, &sim_cpu_watchdogs[i]); if (rc) { err("Error %d returned when adding cpu watchdog", rc); } else { j++; } i++; } dbg("%d of %d cpu watchdogs injected", j, i); return 0; } SaErrorT sim_discover_dasd_watchdogs(struct oh_handler_state *state, struct oh_event *e) { SaErrorT rc; int i = 0; int j = 0; while (sim_dasd_watchdogs[i].watchdogrec.WatchdogNum != 0) { rc = new_watchdog(state, e, &sim_dasd_watchdogs[i]); if (rc) { err("Error %d returned when adding dasd watchdog", rc); } else { j++; } i++; } dbg("%d of %d dasd watchdogs injected", j, i); return 0; } SaErrorT sim_discover_hs_dasd_watchdogs(struct oh_handler_state *state, struct oh_event *e) { SaErrorT rc; int i = 0; int j = 0; while (sim_hs_dasd_watchdogs[i].watchdogrec.WatchdogNum != 0) { rc = new_watchdog(state, e, &sim_hs_dasd_watchdogs[i]); if (rc) { err("Error %d returned when adding hs dasd watchdog", rc); } else { j++; } i++; } dbg("%d of %d hs dasd watchdogs injected", j, i); return 0; } SaErrorT sim_discover_fan_watchdogs(struct oh_handler_state *state, struct oh_event *e) { SaErrorT rc; int i = 0; int j = 0; while (sim_fan_watchdogs[i].watchdogrec.WatchdogNum != 0) { rc = new_watchdog(state, e, &sim_fan_watchdogs[i]); if (rc) { err("Error %d returned when adding fan watchdog", rc); } else { j++; } i++; } dbg("%d of %d fan watchdogs injected", j, i); return 0; } SaErrorT sim_get_watchdog_info(void *hnd, SaHpiResourceIdT rid, SaHpiWatchdogNumT num, SaHpiWatchdogT *wdt) { struct simWatchdogInfo *info; if (!hnd) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } struct oh_handler_state *state = (struct oh_handler_state *)hnd; /* Check if resource exists and has managed hotswap capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(state->rptcache, rid); if (!rpt) { return SA_ERR_HPI_INVALID_RESOURCE; } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_WATCHDOG)) { return SA_ERR_HPI_CAPABILITY; } /* get our private info */ SaHpiRdrT *rdr = oh_get_rdr_by_type(state->rptcache, rid, SAHPI_WATCHDOG_RDR, num); if (rdr == NULL) return SA_ERR_HPI_NOT_PRESENT; info = (struct simWatchdogInfo *)oh_get_rdr_data(state->rptcache, rid, rdr->RecordId); if (info == NULL) { err("No watchdog data. Watchdog=%s", rdr->IdString.Data); return SA_ERR_HPI_NOT_PRESENT; } memcpy(wdt, &info->watchdog, sizeof(SaHpiWatchdogT)); return SA_OK; } SaErrorT sim_set_watchdog_info(void *hnd, SaHpiResourceIdT rid, SaHpiWatchdogNumT num, SaHpiWatchdogT *wdt) { struct simWatchdogInfo *info; if (!hnd) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } struct oh_handler_state *state = (struct oh_handler_state *)hnd; /* Check if resource exists and has managed hotswap capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(state->rptcache, rid); if (!rpt) { return SA_ERR_HPI_INVALID_RESOURCE; } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_WATCHDOG)) { return SA_ERR_HPI_CAPABILITY; } /* get our private info */ SaHpiRdrT *rdr = oh_get_rdr_by_type(state->rptcache, rid, SAHPI_WATCHDOG_RDR, num); if (rdr == NULL) return SA_ERR_HPI_NOT_PRESENT; info = (struct simWatchdogInfo *)oh_get_rdr_data(state->rptcache, rid, rdr->RecordId); if (info == NULL) { err("No watchdog data. Watchdog=%s", rdr->IdString.Data); return SA_ERR_HPI_NOT_PRESENT; } memcpy(&info->watchdog, wdt, sizeof(SaHpiWatchdogT)); return SA_OK; } SaErrorT sim_reset_watchdog(void *hnd, SaHpiResourceIdT rid, SaHpiWatchdogNumT num) { SaHpiRdrT *rdr; if (!hnd) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } struct oh_handler_state *state = (struct oh_handler_state *)hnd; /* Check if resource exists and has managed hotswap capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(state->rptcache, rid); if (!rpt) { return SA_ERR_HPI_INVALID_RESOURCE; } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_WATCHDOG)) { return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(state->rptcache, rid, SAHPI_WATCHDOG_RDR, num); if (rdr == NULL) return SA_ERR_HPI_NOT_PRESENT; // since no timer is actually running we can just do nothing here return SA_OK; } void * oh_get_watchdog_info (void *, SaHpiResourceIdT, SaHpiWatchdogNumT, SaHpiWatchdogT *) __attribute__ ((weak, alias("sim_get_watchdog_info"))); void * oh_set_watchdog_info (void *, SaHpiResourceIdT, SaHpiWatchdogNumT, SaHpiWatchdogT *) __attribute__ ((weak, alias("sim_set_watchdog_info"))); void * oh_reset_watchdog (void *, SaHpiResourceIdT, SaHpiWatchdogNumT) __attribute__ ((weak, alias("sim_reset_watchdog"))); openhpi-3.6.1/plugins/simulator/sim_annunciators.c0000644000175100017510000001267712575647265021433 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Christina Hernandez * W. David Ashley * Renier Morales */ #include #include static SaErrorT new_annunciator(struct oh_handler_state *state, struct oh_event *e, struct sim_annunciator * myannun) { SaHpiRdrT *rdr; struct simAnnunciatorInfo *info = NULL; int i; SaErrorT error = SA_OK; rdr = (SaHpiRdrT *)g_malloc0(sizeof(SaHpiRdrT)); // set up res_rdr rdr->RdrType = SAHPI_ANNUNCIATOR_RDR; memcpy(&rdr->RdrTypeUnion.AnnunciatorRec, &myannun->annun, sizeof(SaHpiAnnunciatorRecT)); oh_init_textbuffer(&rdr->IdString); oh_append_textbuffer(&rdr->IdString, myannun->comment); // get the entity path rdr->Entity = e->resource.ResourceEntity; // save the announcements for the annunciator for (i = 0; myannun->announs[i].EntryId != 0; i++) { if (info == NULL) { info = (struct simAnnunciatorInfo *)g_malloc0(sizeof(struct simAnnunciatorInfo)); // set the default mode value info->mode = SAHPI_ANNUNCIATOR_MODE_SHARED; // set up the announcement list info->announs = oh_announcement_create(); if (info->announs == NULL) { return SA_ERR_HPI_OUT_OF_SPACE; } } /* fix the resource id for the announcement */ myannun->announs[i].StatusCond.ResourceId = e->resource.ResourceId; oh_announcement_append(info->announs, &myannun->announs[i]); } /* everything ready so inject the rdr */ error = sim_inject_rdr(state, e, rdr, info); if (error) { g_free(rdr); g_free(info); } return error; } SaErrorT sim_discover_chassis_annunciators(struct oh_handler_state *state, struct oh_event *e) { SaErrorT rc; int i = 0; int j = 0; while (sim_chassis_annunciators[i].index != 0) { rc = new_annunciator(state, e, &sim_chassis_annunciators[i]); if (rc) { err("Error %d returned when adding chassis annunciator", rc); } else { j++; } i++; } dbg("%d of %d chassis annunciators injected", j, i); return 0; } SaErrorT sim_discover_cpu_annunciators(struct oh_handler_state *state, struct oh_event *e) { SaErrorT rc; int i = 0; int j = 0; while (sim_cpu_annunciators[i].index != 0) { rc = new_annunciator(state, e, &sim_cpu_annunciators[i]); if (rc) { err("Error %d returned when adding cpu annunciator", rc); } else { j++; } i++; } dbg("%d of %d cpu annunciators injected", j, i); return 0; } SaErrorT sim_discover_dasd_annunciators(struct oh_handler_state *state, struct oh_event *e) { SaErrorT rc; int i = 0; int j = 0; while (sim_dasd_annunciators[i].index != 0) { rc = new_annunciator(state, e, &sim_dasd_annunciators[i]); if (rc) { err("Error %d returned when adding dasd annunciator", rc); } else { j++; } i++; } dbg("%d of %d dasd annunciators injected", j, i); return 0; } SaErrorT sim_discover_hs_dasd_annunciators(struct oh_handler_state *state, struct oh_event *e) { SaErrorT rc; int i = 0; int j = 0; while (sim_hs_dasd_annunciators[i].index != 0) { rc = new_annunciator(state, e, &sim_hs_dasd_annunciators[i]); if (rc) { err("Error %d returned when adding hs dasd annunciator", rc); } else { j++; } i++; } dbg("%d of %d hs dasd annunciators injected", j, i); return 0; } SaErrorT sim_discover_fan_annunciators(struct oh_handler_state *state, struct oh_event *e) { SaErrorT rc; int i = 0; int j = 0; while (sim_fan_annunciators[i].index != 0) { rc = new_annunciator(state, e, &sim_fan_annunciators[i]); if (rc) { err("Error %d returned when adding fan annunciator", rc); } else { j++; } i++; } dbg("%d of %d fan annunciators injected", j, i); return 0; } openhpi-3.6.1/plugins/simulator/sim_annunciator_func.h0000644000175100017510000000321312575647265022252 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef __SIM_ANNUNCIATOR_FUNC_H #define __SIM_ANNUNCIATOR_FUNC_H SaErrorT sim_get_next_announce(void *hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT aid, SaHpiSeverityT sev, SaHpiBoolT unackonly, SaHpiAnnouncementT *announcement); SaErrorT sim_get_announce(void *hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT aid, SaHpiEntryIdT entry, SaHpiAnnouncementT *announcement); SaErrorT sim_ack_announce(void *hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT aid, SaHpiEntryIdT entry, SaHpiSeverityT sev); SaErrorT sim_add_announce(void *hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT aid, SaHpiAnnouncementT *announcement); SaErrorT sim_del_announce(void *hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT aid, SaHpiEntryIdT entry, SaHpiSeverityT sev); SaErrorT sim_get_annunc_mode(void *hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT aid, SaHpiAnnunciatorModeT *mode); SaErrorT sim_set_annunc_mode(void *hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT aid, SaHpiAnnunciatorModeT mode); #endif openhpi-3.6.1/plugins/simulator/sim_sensors.h0000755000175100017510000000702412575647265020421 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Christina Hernandez * W. David Ashley * Renier Morales */ #ifndef __SIM_SENSORS_H #define __SIM_SENSORS_H #include #include #define SIM_MAX_EVENTS_PER_SENSOR 24 #define SIM_MAX_READING_MAPS_PER_SENSOR 3 /* Includes an ending NULL entry */ #define SIM_MAX_SENSOR_EVENT_ARRAY_SIZE (SIM_MAX_EVENTS_PER_SENSOR + 1) #define SIM_MAX_SENSOR_READING_MAP_ARRAY_SIZE (SIM_MAX_READING_MAPS_PER_SENSOR + 1) /******************** * Sensor Definitions ********************/ struct SimSensorThresholdOids { const char *LowMinor; const char *LowMajor; const char *LowCritical; const char *UpMinor; const char *UpMajor; const char *UpCritical; const char *PosThdHysteresis; const char *NegThdHysteresis; const char *TotalPosThdHysteresis; const char *TotalNegThdHysteresis; }; struct SimSensorWritableThresholdOids { const char *LowMinor; const char *LowMajor; const char *LowCritical; const char *UpMinor; const char *UpMajor; const char *UpCritical; const char *PosThdHysteresis; const char *NegThdHysteresis; }; struct sensor_event_map { char *event; SaHpiBoolT event_assertion; SaHpiBoolT event_res_failure; SaHpiBoolT event_res_failure_unexpected; SaHpiEventStateT event_state; SaHpiEventStateT recovery_state; }; struct sensor_reading_map { int num; SaHpiSensorRangeT rangemap; SaHpiEventStateT state; }; struct SensorInfo { SaHpiEventStateT cur_state; /* This really records the last state read from the SEL */ /* Which probably isn't the current state of the sensor */ SaHpiBoolT sensor_enabled; SaHpiBoolT events_enabled; SaHpiEventStateT assert_mask; SaHpiEventStateT deassert_mask; struct sensor_event_map event_array[SIM_MAX_SENSOR_EVENT_ARRAY_SIZE]; struct sensor_reading_map reading2event[SIM_MAX_SENSOR_READING_MAP_ARRAY_SIZE]; SaHpiSensorReadingT reading; SaHpiSensorThresholdsT thres; }; /* struct SensorMoreInfo { SaHpiSensorReadingT reading; SaHpiSensorThresholdsT thres; }; */ struct sim_sensor { /* Usually sensor.Num = index; index is used to search thru sensor arrays. It allows sensor.Num to be independent from array index (e.g. for aggregate sensors) */ int index; SaHpiSensorRecT sensor; struct SensorInfo sensor_info; const char *comment; }; SaErrorT sim_discover_chassis_sensors(struct oh_handler_state *state, struct oh_event *e); SaErrorT sim_discover_cpu_sensors(struct oh_handler_state *state, struct oh_event *e); SaErrorT sim_discover_dasd_sensors(struct oh_handler_state *state, struct oh_event *e); SaErrorT sim_discover_hs_dasd_sensors(struct oh_handler_state *state, struct oh_event *e); SaErrorT sim_discover_fan_sensors(struct oh_handler_state *state, struct oh_event *e); #endif openhpi-3.6.1/plugins/simulator/sim_inventory.h0000644000175100017510000001001312575647265020747 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley * Renier Morales */ #ifndef __SIM_INVENTORY_H #define __SIM_INVENTORY_H #define SIM_INVENTORY_FIELDS 10 #define SIM_INVENTORY_AREAS 10 /************************************************************************/ /* Resource one inventory data */ /************************************************************************/ struct sim_idr_area { SaHpiEntryIdT nextfieldid; SaHpiIdrAreaHeaderT idrareahead; SaHpiIdrFieldT field[SIM_INVENTORY_FIELDS]; }; struct sim_inventory_info { SaHpiEntryIdT nextareaid; SaHpiIdrInfoT idrinfo; struct sim_idr_area area[SIM_INVENTORY_AREAS]; }; struct sim_inventory { SaHpiInventoryRecT invrec; struct sim_inventory_info info; const char *comment; }; SaErrorT sim_discover_chassis_inventory(struct oh_handler_state *state, struct oh_event *e); SaErrorT sim_discover_cpu_inventory(struct oh_handler_state *state, struct oh_event *e); SaErrorT sim_discover_dasd_inventory(struct oh_handler_state *state, struct oh_event *e); SaErrorT sim_discover_hs_dasd_inventory(struct oh_handler_state *state, struct oh_event *e); SaErrorT sim_discover_fan_inventory(struct oh_handler_state *state, struct oh_event *e); SaErrorT sim_get_idr_info(void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, SaHpiIdrInfoT *IdrInfo); SaErrorT sim_get_idr_area_header(void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, SaHpiIdrAreaTypeT AreaType, SaHpiEntryIdT AreaId, SaHpiEntryIdT *NextAreaId, SaHpiIdrAreaHeaderT *Header); SaErrorT sim_add_idr_area(void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, SaHpiIdrAreaTypeT AreaType, SaHpiEntryIdT *AreaId); SaErrorT sim_del_idr_area(void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, SaHpiEntryIdT AreaId); SaErrorT sim_get_idr_field(void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, SaHpiEntryIdT AreaId, SaHpiIdrFieldTypeT FieldType, SaHpiEntryIdT FieldId, SaHpiEntryIdT *NextFieldId, SaHpiIdrFieldT *Field); SaErrorT sim_add_idr_field(void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, SaHpiIdrFieldT *Field); SaErrorT sim_set_idr_field(void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, SaHpiIdrFieldT *Field); SaErrorT sim_del_idr_field(void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, SaHpiEntryIdT AreaId, SaHpiEntryIdT FieldId); extern struct sim_inventory sim_chassis_inventory[]; extern struct sim_inventory sim_cpu_inventory[]; extern struct sim_inventory sim_dasd_inventory[]; extern struct sim_inventory sim_hs_dasd_inventory[]; extern struct sim_inventory sim_fan_inventory[]; #endif openhpi-3.6.1/plugins/simulator/sim_inventory.c0000644000175100017510000007264612575647265020766 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley * Renier Morales * */ #include static SaErrorT new_inventory(struct oh_handler_state *state, struct oh_event *e, struct sim_inventory *myinv) { SaHpiRdrT *rdr; struct sim_inventory_info *info; SaErrorT error = SA_OK; rdr = (SaHpiRdrT *)g_malloc0(sizeof(SaHpiRdrT)); // Copy information from rdr array to res_rdr rdr->RdrType = SAHPI_INVENTORY_RDR; memcpy(&rdr->RdrTypeUnion.InventoryRec, &myinv->invrec, sizeof(SaHpiInventoryRecT)); oh_init_textbuffer(&rdr->IdString); oh_append_textbuffer(&rdr->IdString, myinv->comment); rdr->RecordId = oh_get_rdr_uid(SAHPI_INVENTORY_RDR, rdr->RdrTypeUnion.InventoryRec.IdrId); rdr->Entity = e->resource.ResourceEntity; //set up our private data info = (struct sim_inventory_info *)g_malloc(sizeof(struct sim_inventory_info)); memcpy(info, &myinv->info, sizeof(struct sim_inventory_info)); // everything ready so add the rdr and extra info to the rptcache error = sim_inject_rdr(state, e, rdr, info); if (error) { g_free(rdr); g_free(info); } return error; } SaErrorT sim_discover_chassis_inventory(struct oh_handler_state *state, struct oh_event *e) { SaErrorT rc; int i = 0; int j = 0; while (sim_chassis_inventory[i].invrec.IdrId != 0) { rc = new_inventory(state, e, &sim_chassis_inventory[i]); if (rc) { err("Error %d returned when adding chassis inventory", rc); } else { j++; } i++; } dbg("%d of %d chassis inventory injected", j, i); return 0; } SaErrorT sim_discover_cpu_inventory(struct oh_handler_state *state, struct oh_event *e) { SaErrorT rc; int i = 0; int j = 0; while (sim_cpu_inventory[i].invrec.IdrId != 0) { rc = new_inventory(state, e, &sim_cpu_inventory[i]); if (rc) { err("Error %d returned when adding cpu inventory", rc); } else { j++; } i++; } dbg("%d of %d cpu inventory injected", j, i); return 0; } SaErrorT sim_discover_dasd_inventory(struct oh_handler_state *state, struct oh_event *e) { SaErrorT rc; int i = 0; int j = 0; while (sim_dasd_inventory[i].invrec.IdrId != 0) { rc = new_inventory(state, e, &sim_dasd_inventory[i]); if (rc) { err("Error %d returned when adding dasd inventory", rc); } else { j++; } i++; } dbg("%d of %d dasd inventory injected", j, i); return 0; } SaErrorT sim_discover_hs_dasd_inventory(struct oh_handler_state *state, struct oh_event *e) { SaErrorT rc; int i = 0; int j = 0; while (sim_hs_dasd_inventory[i].invrec.IdrId != 0) { rc = new_inventory(state, e, &sim_hs_dasd_inventory[i]); if (rc) { err("Error %d returned when adding hs dasd inventory", rc); } else { j++; } i++; } dbg("%d of %d hs dasd inventory injected", j, i); return 0; } SaErrorT sim_discover_fan_inventory(struct oh_handler_state *state, struct oh_event *e) { SaErrorT rc; int i = 0; int j = 0; while (sim_fan_inventory[i].invrec.IdrId != 0) { rc = new_inventory(state, e, &sim_fan_inventory[i]); if (rc) { err("Error %d returned when adding fan inventory", rc); } else { j++; } i++; } dbg("%d of %d fan inventory injected", j, i); return 0; } SaErrorT sim_get_idr_info(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT IdrId, SaHpiIdrInfoT *IdrInfo) { struct sim_inventory_info *info; if (!hnd || !IdrInfo) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } struct oh_handler_state *state = (struct oh_handler_state *)hnd; /* Check if resource exists and has inventory capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(state->rptcache, rid); if (!rpt) { return SA_ERR_HPI_INVALID_RESOURCE; } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)) { return SA_ERR_HPI_CAPABILITY; } /* Find inventory and its data - see if it accessable */ SaHpiRdrT *rdr = oh_get_rdr_by_type(state->rptcache, rid, SAHPI_INVENTORY_RDR, IdrId); if (rdr == NULL) { return SA_ERR_HPI_NOT_PRESENT; } info = (struct sim_inventory_info *)oh_get_rdr_data(state->rptcache, rid, rdr->RecordId); if (info == NULL) { err("No inventory data. IdrId=%s", rdr->IdString.Data); return SA_ERR_HPI_NOT_PRESENT; } /* return the data */ memcpy(IdrInfo, &info->idrinfo, sizeof(SaHpiIdrInfoT)); return SA_OK; } SaErrorT sim_get_idr_area_header(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT IdrId, SaHpiIdrAreaTypeT AreaType, SaHpiEntryIdT AreaId, SaHpiEntryIdT *NextAreaId, SaHpiIdrAreaHeaderT *Header) { struct sim_inventory_info *info; int i; int found = SAHPI_FALSE; if (!hnd || !NextAreaId || !Header) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } struct oh_handler_state *state = (struct oh_handler_state *)hnd; /* Check if resource exists and has inventory capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(state->rptcache, rid); if (!rpt) { return SA_ERR_HPI_INVALID_RESOURCE; } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)) { return SA_ERR_HPI_CAPABILITY; } /* Find inventory and its data - see if it accessable */ SaHpiRdrT *rdr = oh_get_rdr_by_type(state->rptcache, rid, SAHPI_INVENTORY_RDR, IdrId); if (rdr == NULL) { return SA_ERR_HPI_NOT_PRESENT; } info = (struct sim_inventory_info *)oh_get_rdr_data(state->rptcache, rid, rdr->RecordId); if (info == NULL) { err("No inventory data. IdrId=%s", rdr->IdString.Data); return SA_ERR_HPI_NOT_PRESENT; } /* find the corresponding area */ if (info->idrinfo.NumAreas == 0) { return SA_ERR_HPI_NOT_PRESENT; } if (AreaId == SAHPI_FIRST_ENTRY) { for (i = 0; i < SIM_INVENTORY_AREAS && i < info->idrinfo.NumAreas; i++) { if (AreaType == SAHPI_IDR_AREATYPE_UNSPECIFIED || AreaType == info->area[i].idrareahead.Type) { /* found the next entry */ if (found == TRUE) { *NextAreaId = info->area[i].idrareahead.AreaId; break; } /* found what we are looking for */ memcpy(Header, &info->area[i].idrareahead, sizeof(SaHpiIdrAreaHeaderT)); found = SAHPI_TRUE; *NextAreaId = SAHPI_LAST_ENTRY; } } } else for (i = 0; i < SIM_INVENTORY_AREAS && i < info->idrinfo.NumAreas; i++) { if (AreaType == SAHPI_IDR_AREATYPE_UNSPECIFIED || AreaType == info->area[i].idrareahead.Type) { /* found the next entry */ if (found == TRUE) { *NextAreaId = info->area[i].idrareahead.AreaId; break; } if (AreaId != info->area[i].idrareahead.AreaId) { continue; } /* found what we are looking for */ memcpy(Header, &info->area[i].idrareahead, sizeof(SaHpiIdrAreaHeaderT)); found = SAHPI_TRUE; *NextAreaId = SAHPI_LAST_ENTRY; } } if (found == SAHPI_TRUE) { return SA_OK; } return SA_ERR_HPI_NOT_PRESENT; } SaErrorT sim_add_idr_area(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT IdrId, SaHpiIdrAreaTypeT AreaType, SaHpiEntryIdT *AreaId) { struct sim_inventory_info *info; if (!hnd || !AreaId) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } struct oh_handler_state *state = (struct oh_handler_state *)hnd; /* Check if resource exists and has inventory capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(state->rptcache, rid); if (!rpt) { return SA_ERR_HPI_INVALID_RESOURCE; } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)) { return SA_ERR_HPI_CAPABILITY; } /* Find inventory and its data - see if it accessable */ SaHpiRdrT *rdr = oh_get_rdr_by_type(state->rptcache, rid, SAHPI_INVENTORY_RDR, IdrId); if (rdr == NULL) { return SA_ERR_HPI_NOT_PRESENT; } info = (struct sim_inventory_info *)oh_get_rdr_data(state->rptcache, rid, rdr->RecordId); if (info == NULL) { err("No inventory data. IdrId=%s", rdr->IdString.Data); return SA_ERR_HPI_NOT_PRESENT; } /* check to see if space is available for the new area */ if (info->idrinfo.NumAreas == SIM_INVENTORY_AREAS) { return SA_ERR_HPI_OUT_OF_SPACE; } else if (info->idrinfo.ReadOnly) { return SA_ERR_HPI_READ_ONLY; } /* add the area */ info->area[info->idrinfo.NumAreas].idrareahead.AreaId = info->nextareaid; info->area[info->idrinfo.NumAreas].idrareahead.Type = AreaType; info->area[info->idrinfo.NumAreas].idrareahead.ReadOnly = SAHPI_FALSE; info->area[info->idrinfo.NumAreas].idrareahead.NumFields = 0; /* increment our counters and set return info */ info->idrinfo.NumAreas++; *AreaId = info->nextareaid; info->nextareaid++; return SA_OK; } SaErrorT sim_del_idr_area(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT IdrId, SaHpiEntryIdT AreaId) { struct sim_inventory_info *info; int i; int found = SAHPI_FALSE; if (!hnd) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } struct oh_handler_state *state = (struct oh_handler_state *)hnd; /* Check if resource exists and has inventory capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(state->rptcache, rid); if (!rpt) { return SA_ERR_HPI_INVALID_RESOURCE; } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)) { return SA_ERR_HPI_CAPABILITY ; } /* Find inventory and its data - see if it accessable */ SaHpiRdrT *rdr = oh_get_rdr_by_type(state->rptcache, rid, SAHPI_INVENTORY_RDR, IdrId); if (rdr == NULL) { return SA_ERR_HPI_NOT_PRESENT; } info = (struct sim_inventory_info *)oh_get_rdr_data(state->rptcache, rid, rdr->RecordId); if (info == NULL) { err("No inventory data. IdrId=%s", rdr->IdString.Data); return SA_ERR_HPI_NOT_PRESENT; } /* find the entry to delete */ for (i = 0; i < info->idrinfo.NumAreas; i++) { if (AreaId != info->area[i].idrareahead.AreaId) { continue; } /* found what we are looking for */ found = SAHPI_TRUE; break; } if (found == SAHPI_FALSE) { err("Went through the list and could not find it"); return SA_ERR_HPI_NOT_PRESENT; } /* can we delete the area? */ if (info->area[i].idrareahead.ReadOnly == SAHPI_TRUE) { return SA_ERR_HPI_READ_ONLY; } /* delete the area entry by moving the remaining array members up */ if (i < info->idrinfo.NumAreas - 2) { for (i++; i < info->idrinfo.NumAreas; i++) { memcpy(&info->area[i - 1], &info->area[i], sizeof(struct sim_idr_area)); } } info->idrinfo.NumAreas--; return SA_OK; } SaErrorT sim_get_idr_field(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT IdrId, SaHpiEntryIdT AreaId, SaHpiIdrFieldTypeT FieldType, SaHpiEntryIdT FieldId, SaHpiEntryIdT *NextFieldId, SaHpiIdrFieldT *Field) { struct sim_inventory_info *info; int i, j; int found = SAHPI_FALSE; if (!hnd || !NextFieldId || !Field) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } struct oh_handler_state *state = (struct oh_handler_state *)hnd; /* Check if resource exists and has inventory capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(state->rptcache, rid); if (!rpt) { return SA_ERR_HPI_INVALID_RESOURCE; } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)) { return SA_ERR_HPI_CAPABILITY; } /* Find inventory and its data - see if it accessable */ SaHpiRdrT *rdr = oh_get_rdr_by_type(state->rptcache, rid, SAHPI_INVENTORY_RDR, IdrId); if (rdr == NULL) { return SA_ERR_HPI_NOT_PRESENT; } info = (struct sim_inventory_info *)oh_get_rdr_data(state->rptcache, rid, rdr->RecordId); if (info == NULL) { err("No inventory data. IdrId=%s", rdr->IdString.Data); return SA_ERR_HPI_NOT_PRESENT; } /* find the corresponding area */ if (info->idrinfo.NumAreas == 0) { return SA_ERR_HPI_NOT_PRESENT; } for (i = 0; i < info->idrinfo.NumAreas; i++) { if (AreaId != info->area[i].idrareahead.AreaId) { continue; } /* found the area we are looking for */ found = SAHPI_TRUE; break; } if (found == SAHPI_FALSE) { return SA_ERR_HPI_NOT_PRESENT; } /* find the corresponding field */ found = SAHPI_FALSE; if (info->area[i].idrareahead.NumFields == 0) { return SA_ERR_HPI_NOT_PRESENT; } for (j = 0; j < info->area[i].idrareahead.NumFields; j++) { if ( ((info->area[i].field[j].FieldId == FieldId) || (SAHPI_FIRST_ENTRY == FieldId)) && ((info->area[i].field[j].Type == FieldType) || (SAHPI_IDR_FIELDTYPE_UNSPECIFIED == FieldType)) ) { memcpy(Field, &info->area[i].field[j], sizeof(SaHpiIdrFieldT)); found = SAHPI_TRUE; *NextFieldId = SAHPI_LAST_ENTRY; break; } } j++; if (found) { if (j < info->area[i].idrareahead.NumFields) { do { if ((info->area[i].field[j].Type == FieldType) || (SAHPI_IDR_FIELDTYPE_UNSPECIFIED == FieldType)) { *NextFieldId = info->area[i].field[j].FieldId; break; } j++; } while (j < info->area[i].idrareahead.NumFields); } } #if 0 /* found the next field entry */ if (found == TRUE) { *NextFieldId = info->area[i].field[j].FieldId; break; } /* found the field we are looking for */ memcpy(Field, &info->area[i].field[j], sizeof(SaHpiIdrFieldT)); found = SAHPI_TRUE; *NextFieldId = SAHPI_LAST_ENTRY; } } #endif if (found == SAHPI_FALSE) { return SA_ERR_HPI_NOT_PRESENT; } return SA_OK; } SaErrorT sim_add_idr_field(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT IdrId, SaHpiIdrFieldT *Field) { struct sim_inventory_info *info; int i; int found = SAHPI_FALSE; if (!hnd || !Field) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } struct oh_handler_state *state = (struct oh_handler_state *)hnd; /* Check if resource exists and has inventory capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(state->rptcache, rid); if (!rpt) { return SA_ERR_HPI_INVALID_RESOURCE; } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)) { return SA_ERR_HPI_CAPABILITY; } /* Find inventory and its data - see if it accessable */ SaHpiRdrT *rdr = oh_get_rdr_by_type(state->rptcache, rid, SAHPI_INVENTORY_RDR, IdrId); if (rdr == NULL) { err("Inventory RDR %d for resource %d was not found", IdrId, rid); return SA_ERR_HPI_NOT_PRESENT; } info = (struct sim_inventory_info *)oh_get_rdr_data(state->rptcache, rid, rdr->RecordId); if (info == NULL) { err("No inventory data. IdrId=%s", rdr->IdString.Data); return SA_ERR_HPI_NOT_PRESENT; } if (info->idrinfo.ReadOnly) { return SA_ERR_HPI_READ_ONLY; } /* find the corresponding area */ if (info->idrinfo.NumAreas == 0) { err("No areas in the specified IDR"); return SA_ERR_HPI_NOT_PRESENT; } for (i = 0; i < info->idrinfo.NumAreas; i++) { if (Field->AreaId == info->area[i].idrareahead.AreaId) { /* found the area we are looking for */ found = SAHPI_TRUE; break; } } if (found == SAHPI_FALSE) { err("Specified area was not found in IDR"); return SA_ERR_HPI_NOT_PRESENT; } /* can we add a new field? */ if (info->area[i].idrareahead.ReadOnly == SAHPI_TRUE) { return SA_ERR_HPI_READ_ONLY; } /* try to add the new field */ if (info->area[i].idrareahead.NumFields == SIM_INVENTORY_FIELDS) { return SA_ERR_HPI_OUT_OF_SPACE; } memcpy(&info->area[i].field[info->area[i].idrareahead.NumFields], Field, sizeof(SaHpiIdrFieldT)); info->area[i].field[info->area[i].idrareahead.NumFields].AreaId = info->area[i].idrareahead.AreaId; info->area[i].field[info->area[i].idrareahead.NumFields].FieldId = info->area[i].nextfieldid; Field->FieldId = info->area[i].nextfieldid; info->area[i].nextfieldid++; info->area[i].field[info->area[i].idrareahead.NumFields].ReadOnly = SAHPI_FALSE; info->area[i].idrareahead.NumFields++; return SA_OK; } SaErrorT sim_set_idr_field(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT IdrId, SaHpiIdrFieldT *Field) { struct sim_inventory_info *info; int i, j; int found = SAHPI_FALSE; char * type; if (!hnd || !Field) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } type = oh_lookup_idrfieldtype(Field->Type); if (type == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } if (strcmp(type, "UNSPECIFIED") == 0) { return SA_ERR_HPI_INVALID_DATA; } struct oh_handler_state *state = (struct oh_handler_state *)hnd; /* Check if resource exists and has inventory capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(state->rptcache, rid); if (!rpt) { return SA_ERR_HPI_INVALID_RESOURCE; } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)) { return SA_ERR_HPI_CAPABILITY; } /* Find inventory and its data - see if it accessable */ SaHpiRdrT *rdr = oh_get_rdr_by_type(state->rptcache, rid, SAHPI_INVENTORY_RDR, IdrId); if (rdr == NULL) { return SA_ERR_HPI_NOT_PRESENT; } info = (struct sim_inventory_info *)oh_get_rdr_data(state->rptcache, rid, rdr->RecordId); if (info == NULL) { err("No inventory data. IdrId=%s", rdr->IdString.Data); return SA_ERR_HPI_NOT_PRESENT; } /* find the corresponding area */ if (info->idrinfo.NumAreas == 0) { return SA_ERR_HPI_NOT_PRESENT; } for (i = 0; i < info->idrinfo.NumAreas; i++) { if (Field->AreaId != info->area[i].idrareahead.AreaId) { continue; } /* found the area we are looking for */ found = SAHPI_TRUE; break; } if (found == SAHPI_FALSE) { return SA_ERR_HPI_NOT_PRESENT; } /* can we set a field? */ if (info->area[i].idrareahead.ReadOnly == SAHPI_TRUE) { return SA_ERR_HPI_READ_ONLY; } /* find the corresponding field */ if (info->area[i].idrareahead.NumFields == 0) { return SA_ERR_HPI_NOT_PRESENT; } for (j = 0; j < info->area[i].idrareahead.NumFields; j++) { if (Field->FieldId == info->area[i].field[j].FieldId) { /* found the field we are looking for */ if (info->area[i].field[j].ReadOnly == SAHPI_TRUE) { return SA_ERR_HPI_READ_ONLY; } info->area[i].field[j].Type = Field->Type; memcpy(&info->area[i].field[j].Field, &Field->Field, sizeof(SaHpiTextBufferT)); return SA_OK; } } return SA_ERR_HPI_NOT_PRESENT; } SaErrorT sim_del_idr_field(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT IdrId, SaHpiEntryIdT AreaId, SaHpiEntryIdT FieldId) { struct sim_inventory_info *info; int i, j; int found = SAHPI_FALSE; if (!hnd) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } struct oh_handler_state *state = (struct oh_handler_state *)hnd; /* Check if resource exists and has inventory capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(state->rptcache, rid); if (!rpt) { return SA_ERR_HPI_INVALID_RESOURCE; } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)) { return SA_ERR_HPI_CAPABILITY; } /* Find inventory and its data - see if it accessable */ SaHpiRdrT *rdr = oh_get_rdr_by_type(state->rptcache, rid, SAHPI_INVENTORY_RDR, IdrId); if (rdr == NULL) { return SA_ERR_HPI_NOT_PRESENT; } info = (struct sim_inventory_info *)oh_get_rdr_data(state->rptcache, rid, rdr->RecordId); if (info == NULL) { err("No inventory data. IdrId=%s", rdr->IdString.Data); return SA_ERR_HPI_NOT_PRESENT; } /* find the corresponding area */ if (info->idrinfo.NumAreas == 0) { return SA_ERR_HPI_NOT_PRESENT; } for (i = 0; i < info->idrinfo.NumAreas; i++) { if (AreaId != info->area[i].idrareahead.AreaId) { continue; } /* found the area we are looking for */ found = SAHPI_TRUE; break; } if (found == SAHPI_FALSE) { return SA_ERR_HPI_NOT_PRESENT; } /* can we delete a field? */ if (info->area[i].idrareahead.ReadOnly == SAHPI_TRUE) { return SA_ERR_HPI_READ_ONLY; } /* find the corresponding field */ if (info->area[i].idrareahead.NumFields == 0) { return SA_ERR_HPI_NOT_PRESENT; } found = SAHPI_FALSE; for (j = 0; j < info->area[i].idrareahead.NumFields; j++) { if (FieldId == info->area[i].field[j].FieldId) { /* found the field we are looking for */ found = SAHPI_TRUE; break; } } if (found == SAHPI_FALSE) { return SA_ERR_HPI_NOT_PRESENT; } /* can we delete the field? */ if (info->area[i].field[j].ReadOnly == SAHPI_TRUE) { return SA_ERR_HPI_READ_ONLY; } /* delete the area entry by moving the remaining array members up */ if (j < info->area[i].idrareahead.NumFields - 2) { for (j++; j < SIM_INVENTORY_AREAS && j < info->area[i].idrareahead.NumFields; j++) { memcpy(&info->area[i].field[j - 1], &info->area[i].field[j], sizeof(SaHpiIdrFieldT)); } } info->area[i].idrareahead.NumFields--; return SA_OK; } void * oh_get_idr_info (void *hnd, SaHpiResourceIdT, SaHpiIdrIdT,SaHpiIdrInfoT) __attribute__ ((weak, alias("sim_get_idr_info"))); void * oh_get_idr_area_header (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrAreaTypeT, SaHpiEntryIdT, SaHpiEntryIdT, SaHpiIdrAreaHeaderT) __attribute__ ((weak, alias("sim_get_idr_area_header"))); void * oh_add_idr_area (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrAreaTypeT, SaHpiEntryIdT) __attribute__ ((weak, alias("sim_add_idr_area"))); void * oh_del_idr_area (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT) __attribute__ ((weak, alias("sim_del_idr_area"))); void * oh_get_idr_field (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT, SaHpiIdrFieldTypeT, SaHpiEntryIdT, SaHpiEntryIdT, SaHpiIdrFieldT) __attribute__ ((weak, alias("sim_get_idr_field"))); void * oh_add_idr_field (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrFieldT) __attribute__ ((weak, alias("sim_add_idr_field"))); void * oh_set_idr_field (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrFieldT) __attribute__ ((weak, alias("sim_set_idr_field"))); void * oh_del_idr_field (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT, SaHpiEntryIdT) __attribute__ ((weak, alias("sim_del_idr_field"))); openhpi-3.6.1/plugins/simulator/sim_el.h0000644000175100017510000000275712575647265017332 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005,2006, 2007, 2008 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley * Suntrupth S Yadav */ SaErrorT sim_el_get_info(void *hnd, SaHpiResourceIdT id, SaHpiEventLogInfoT *info); SaErrorT sim_el_set_state(void *hnd, SaHpiResourceIdT id, SaHpiBoolT state); SaErrorT sim_el_get_state(void *hnd, SaHpiResourceIdT id, SaHpiBoolT *state); SaErrorT sim_el_set_time(void *hnd, SaHpiResourceIdT id, SaHpiTimeT time); SaErrorT sim_el_add_entry(void *hnd, SaHpiResourceIdT id, const SaHpiEventT *Event); SaErrorT sim_el_get_entry(void *hnd, SaHpiResourceIdT id, SaHpiEventLogEntryIdT current, SaHpiEventLogEntryIdT *prev, SaHpiEventLogEntryIdT *next, SaHpiEventLogEntryT *entry, SaHpiRdrT *rdr, SaHpiRptEntryT *rptentry); SaErrorT sim_el_clear(void *hnd, SaHpiResourceIdT id); SaErrorT sim_el_overflow(void *hnd, SaHpiResourceIdT id); SaErrorT sim_el_get_caps(void *hnd, SaHpiResourceIdT id, SaHpiEventLogCapabilitiesT *caps); openhpi-3.6.1/plugins/simulator/Makefile.am0000644000175100017510000000312312575647265017731 0ustar mohanmohan# -*- linux-c -*- # # (C) Copyright IBM Corp. 2005, 2006 # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # # Author(s): # Christina Hernandez # W. David Ashley # Renier Morales # SUBDIRS = t MAINTAINERCLEANFILES = Makefile.in AM_CPPFLAGS = -DG_LOG_DOMAIN=\"sim\" AM_CPPFLAGS += @OPENHPI_INCLUDES@ pkglib_LTLIBRARIES = libsimulator.la libsimulator_la_LIBADD = $(top_builddir)/utils/libopenhpiutils.la libsimulator_la_SOURCES = sim_init.c sim_init.h \ sim_resources2.c sim_resources.h \ sim_sensors.c sim_sensors.h \ sim_sensor_func.c sim_sensor_func.h \ sim_controls.c sim_controls.h \ sim_control_func.c sim_control_func.h \ sim_injector.c sim_injector.h \ sim_el.c sim_el.h \ sim_annunciators.c sim_annunciators.h \ sim_annunciator_func.c sim_annunciator_func.h \ sim_dimi.h sim_dimi.c \ sim_dimi_func.h sim_dimi_func.c \ sim_fumi.h sim_fumi.c \ sim_fumi_func.h sim_fumi_func.c \ sim_power.c sim_power.h \ sim_inventory.c sim_inventory.h \ sim_watchdog.c sim_watchdog.h \ sim_hotswap.c sim_hotswap.h \ sim_reset.c sim_reset.h libsimulator_la_LDFLAGS = -module -version-info @HPI_LIB_VERSION@ openhpi-3.6.1/plugins/simulator/sim_sensor_func.h0000644000175100017510000000436012575647265021246 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef SIM_SENSOR_FUNC_H #define SIM_SENSOR_FUNC_H SaErrorT sim_get_sensor_reading(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiSensorReadingT *data, SaHpiEventStateT *state); SaErrorT sim_get_sensor_thresholds(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiSensorThresholdsT *thres); SaErrorT sim_set_sensor_thresholds(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, const SaHpiSensorThresholdsT *thres); SaErrorT sim_get_sensor_enable(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiBoolT *enable); SaErrorT sim_set_sensor_enable(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, const SaHpiBoolT enable); SaErrorT sim_get_sensor_event_enable(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiBoolT *enable); SaErrorT sim_set_sensor_event_enable(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, const SaHpiBoolT enable); SaErrorT sim_get_sensor_event_masks(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiEventStateT *AssertEventMask, SaHpiEventStateT *DeassertEventMask); SaErrorT sim_set_sensor_event_masks(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiSensorEventMaskActionT act, const SaHpiEventStateT AssertEventMask, const SaHpiEventStateT DeassertEventMask); SaErrorT sim_get_sensor_eventstate(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiSensorReadingT *reading, SaHpiEventStateT *state); SaErrorT sim_set_threshold_reading(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, const SaHpiSensorReadingT *reading); #endif openhpi-3.6.1/plugins/simulator/sim_resources2.c0000644000175100017510000024750612575647265021024 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include /************************************************************************** * Resource Definitions * * These are patterned after an RSA type machine **************************************************************************/ /*------------------------------------------------------------------------- NOTE!!!!!!!!! The order is important here! Changing the order of these resources or adding additional resources means the code in the function sim_discovery() also needs to change! ------------------------------------------------------------------------*/ struct sim_rpt sim_rpt_array[] = { /* Chassis */ { .rpt = { .ResourceInfo = { .ManufacturerId = IBM_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .ResourceCapabilities = SAHPI_CAPABILITY_EVENT_LOG | SAHPI_CAPABILITY_EVT_DEASSERTS | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR | SAHPI_CAPABILITY_ANNUNCIATOR | SAHPI_CAPABILITY_POWER | SAHPI_CAPABILITY_RESET | SAHPI_CAPABILITY_WATCHDOG | SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_DIMI | SAHPI_CAPABILITY_FUMI, .ResourceSeverity = SAHPI_CRITICAL, .ResourceFailed = SAHPI_FALSE, }, .comment = "Chassis" }, /* CPUs */ { .rpt = { .ResourceInfo = { .ManufacturerId = IBM_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_PROCESSOR, .EntityLocation = SIM_HPI_LOCATION_BASE }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .ResourceCapabilities = SAHPI_CAPABILITY_EVT_DEASSERTS | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_MAJOR, .ResourceFailed = SAHPI_FALSE, }, .comment = "CPU" }, /* DASD */ { .rpt = { .ResourceInfo = { .ManufacturerId = IBM_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_DISK_DRIVE, .EntityLocation = SIM_HPI_LOCATION_BASE }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .ResourceCapabilities = SAHPI_CAPABILITY_EVT_DEASSERTS | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_MAJOR, .ResourceFailed = SAHPI_FALSE, }, .comment = "DASD 1" }, /* HS DASD */ { .rpt = { .ResourceInfo = { .ManufacturerId = IBM_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_DISK_DRIVE, .EntityLocation = SIM_HPI_LOCATION_BASE + 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .ResourceCapabilities = SAHPI_CAPABILITY_EVT_DEASSERTS | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_MANAGED_HOTSWAP | SAHPI_HS_CAPABILITY_AUTOEXTRACT_READ_ONLY | SAHPI_CAPABILITY_WATCHDOG | SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_ANNUNCIATOR | SAHPI_CAPABILITY_POWER | SAHPI_CAPABILITY_RESET | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_EVENT_LOG | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_MAJOR, .ResourceFailed = SAHPI_FALSE, }, .comment = "HS DASD 1" }, /* Fans */ { .rpt = { .ResourceInfo = { .ManufacturerId = IBM_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_FAN, .EntityLocation = SIM_HPI_LOCATION_BASE }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, } }, .ResourceCapabilities = SAHPI_CAPABILITY_EVT_DEASSERTS | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_SENSOR | SAHPI_CAPABILITY_CONTROL, .ResourceSeverity = SAHPI_MAJOR, .ResourceFailed = SAHPI_FALSE, }, .comment = "Fan" }, {} /* Terminate array with a null element */ }; /****************************************************************************** * Sensor Definitions * * These are patterned after an RSA type machine ******************************************************************************/ /***************** * Chassis Sensors *****************/ struct sim_sensor sim_chassis_sensors[] = { /* Thermal sensor on planar */ { .index = 1, .sensor = { .Num = 1, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_F, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NORMAL_MAX | SAHPI_SRF_NORMAL_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 40, }, }, .NormalMax = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 110, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 100, }, }, .NormalMin = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 90, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT | SAHPI_STM_LOW_MAJOR | SAHPI_STM_LOW_CRIT | SAHPI_STM_UP_CRIT | SAHPI_STM_UP_HYSTERESIS, .WriteThold = SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT | SAHPI_STM_LOW_MAJOR | SAHPI_STM_LOW_CRIT | SAHPI_STM_UP_CRIT | SAHPI_STM_UP_HYSTERESIS, .Nonlinear = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_UPPER_MINOR, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "0501C480", /* EN_CUTOFF_HI_OVER_TEMP_PLANAR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "0501C080", /* EN_OVER_TEMP_PLANAR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "0501D500", /* EN_PFA_HI_OVER_TEMP_PLANAR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 35, }, }, .thres = { .LowCritical = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 40, }, }, .LowMajor = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 50, }, }, .LowMinor = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 60, }, }, .UpCritical = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .UpMajor = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 120, }, }, .UpMinor = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 110, }, }, .PosThdHysteresis = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 2, }, }, .NegThdHysteresis = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 2, }, }, }, }, .comment = "Planar temperature sensor" }, /* CPU area thermal sensor on planar */ { .index = 2, .sensor = { .Num = 2, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_F, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NORMAL_MAX | SAHPI_SRF_NORMAL_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 40, }, }, .NormalMax = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 110, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 100, }, }, .NormalMin = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 90, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_UPPER_MINOR, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "0601C480", /* EN_CUTOFF_HI_OVER_TEMP_PLANAR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "0601C080", /* EN_OVER_TEMP_PLANAR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "0601D500", /* EN_PFA_HI_OVER_TEMP_PLANAR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 35, }, }, .thres = { .LowCritical = { .IsSupported = SAHPI_FALSE, }, .LowMajor = { .IsSupported = SAHPI_FALSE, }, .LowMinor = { .IsSupported = SAHPI_FALSE, }, .UpCritical = { .IsSupported = SAHPI_FALSE, }, .UpMajor = { .IsSupported = SAHPI_FALSE, }, .UpMinor = { .IsSupported = SAHPI_FALSE, }, .PosThdHysteresis = { .IsSupported = SAHPI_FALSE, }, .NegThdHysteresis = { .IsSupported = SAHPI_FALSE, }, }, }, .comment = "Planar CPU area temperature sensor" }, {} /* Terminate array with a null element */ }; /************* * CPU Sensors *************/ struct sim_sensor sim_cpu_sensors[] = { /* CPU thermal sensor */ { .index = 1, .sensor = { .Num = 1, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT | SAHPI_STM_UP_HYSTERESIS, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_UPPER_MINOR, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "0421C40x", /* EN_PROC_HOT_CPUx */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "0421C48x", /* EN_CUTOFF_HI_OVER_TEMP_CPUx */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "0421D08x", /* EN_THERM_TRIP_CPUx */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "0421D50x", /* EN_PFA_HI_OVER_TEMP_CPUx */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 50, }, }, .thres = { .LowCritical = { .IsSupported = SAHPI_FALSE, }, .LowMajor = { .IsSupported = SAHPI_FALSE, }, .LowMinor = { .IsSupported = SAHPI_FALSE, }, .UpCritical = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 80, }, }, .UpMajor = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 60, }, }, .UpMinor = { .IsSupported = SAHPI_FALSE, }, .PosThdHysteresis = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 2, }, }, .NegThdHysteresis = { .IsSupported = SAHPI_FALSE, }, }, }, .comment = "CPU temperature sensor" }, {} /* Terminate array with a null element */ }; /************** * DASD Sensors **************/ struct sim_sensor sim_dasd_sensors[] = { /* DASD thermal sensor */ { .index = 1, .sensor = { .Num = 1, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT | SAHPI_STM_UP_HYSTERESIS, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_UPPER_MINOR, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "0681C08x", /* EN_CUTOFF_HI_OVER_TEMP_DASD1 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "0681C40x", /* EN_PFA_HI_OVER_TEMP_DASD1 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 50, }, }, .thres = { .LowCritical = { .IsSupported = SAHPI_FALSE, }, .LowMajor = { .IsSupported = SAHPI_FALSE, }, .LowMinor = { .IsSupported = SAHPI_FALSE, }, .UpCritical = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 80, }, }, .UpMajor = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 60, }, }, .UpMinor = { .IsSupported = SAHPI_FALSE, }, .PosThdHysteresis = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 2, }, }, .NegThdHysteresis = { .IsSupported = SAHPI_FALSE, }, }, }, .comment = "DASD temperature sensor" }, {} /* Terminate array with a null element */ }; /*********************** * Hot Swap DASD Sensors **********************/ struct sim_sensor sim_hs_dasd_sensors[] = { /* Hot Swap DASD thermal sensor 1 */ { .index = 1, .sensor = { .Num = 1, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_F, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NORMAL_MAX | SAHPI_SRF_NORMAL_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 40, }, }, .NormalMax = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 110, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 100, }, }, .NormalMin = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 90, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT | SAHPI_STM_LOW_MAJOR | SAHPI_STM_LOW_CRIT | SAHPI_STM_UP_CRIT | SAHPI_STM_UP_HYSTERESIS, .WriteThold = SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT | SAHPI_STM_LOW_MAJOR | SAHPI_STM_LOW_CRIT | SAHPI_STM_UP_CRIT | SAHPI_STM_UP_HYSTERESIS, .Nonlinear = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_UPPER_MINOR, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "0511C480", /* EN_CUTOFF_HI_OVER_TEMP_PLANAR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "0511C080", /* EN_OVER_TEMP_PLANAR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "0511D500", /* EN_PFA_HI_OVER_TEMP_PLANAR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 35, }, }, .thres = { .LowCritical = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 40, }, }, .LowMajor = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 50, }, }, .LowMinor = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 60, }, }, .UpCritical = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .UpMajor = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 120, }, }, .UpMinor = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 110, }, }, .PosThdHysteresis = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 2, }, }, .NegThdHysteresis = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 2, }, }, }, }, .comment = "HS DASD temperature sensor 1" }, /* Hot Swap DASD thermal sensor 2 */ { .index = 2, .sensor = { .Num = 2, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_F, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NORMAL_MAX | SAHPI_SRF_NORMAL_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 40, }, }, .NormalMax = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 110, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 100, }, }, .NormalMin = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 90, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_UPPER_MINOR, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "0611C480", /* EN_CUTOFF_HI_OVER_TEMP_PLANAR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "0611C080", /* EN_OVER_TEMP_PLANAR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "0611D500", /* EN_PFA_HI_OVER_TEMP_PLANAR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 35, }, }, .thres = { .LowCritical = { .IsSupported = SAHPI_FALSE, }, .LowMajor = { .IsSupported = SAHPI_FALSE, }, .LowMinor = { .IsSupported = SAHPI_FALSE, }, .UpCritical = { .IsSupported = SAHPI_FALSE, }, .UpMajor = { .IsSupported = SAHPI_FALSE, }, .UpMinor = { .IsSupported = SAHPI_FALSE, }, .PosThdHysteresis = { .IsSupported = SAHPI_FALSE, }, .NegThdHysteresis = { .IsSupported = SAHPI_FALSE, }, }, }, .comment = "HS DASD temperature sensor 2" }, {} /* Terminate array with a null element */ }; /************* * Fan Sensors *************/ struct sim_sensor sim_fan_sensors[] = { /* Fan speed */ { .index = 1, .sensor = { .Num = 1, .Type = SAHPI_FAN, .Category = SAHPI_EC_PRED_FAIL, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_PRED_FAILURE_ASSERT | SAHPI_ES_PRED_FAILURE_DEASSERT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_RPM, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_TRUE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 100, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_PRED_FAILURE_DEASSERT, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_PRED_FAILURE_ASSERT, .deassert_mask = SAHPI_ES_PRED_FAILURE_ASSERT, .event_array = { { .event = "000A600x", /* EN_FANx_PFA */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_PRED_FAILURE_ASSERT, .recovery_state = SAHPI_ES_PRED_FAILURE_DEASSERT, }, {}, }, .reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 60, }, }, }, .comment = "Blower fan speed - percent of maximum RPM" }, {} /* Terminate array with a null element */ }; /****************************************************************************** * Control Definitions * * These are patterned after an RSA type machine ******************************************************************************/ struct sim_control sim_chassis_controls[] = { /* Digital Control */ { .index = 1, .control = { .Num = 1, .OutputType = SAHPI_CTRL_LED, .Type = SAHPI_CTRL_TYPE_DIGITAL, .TypeUnion.Digital.Default = SAHPI_CTRL_STATE_ON, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_AUTO, .ReadOnly = SAHPI_TRUE, }, .WriteOnly = SAHPI_FALSE, .Oem = 0, }, .mode = SAHPI_CTRL_MODE_AUTO, .comment = "Digital Control" }, /* Discrete Control */ { .index = 2, .control = { .Num = 2, .OutputType = SAHPI_CTRL_LED, .Type = SAHPI_CTRL_TYPE_DISCRETE, .TypeUnion.Discrete.Default = 1, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_AUTO, .ReadOnly = SAHPI_TRUE, }, .WriteOnly = SAHPI_FALSE, .Oem = 0, }, .mode = SAHPI_CTRL_MODE_AUTO, .comment = "Discrete Control" }, /* Analog Control */ { .index = 3, .control = { .Num = 3, .OutputType = SAHPI_CTRL_AUDIBLE, .Type = SAHPI_CTRL_TYPE_ANALOG, .TypeUnion.Analog.Min = 0, .TypeUnion.Analog.Max = 10, .TypeUnion.Analog.Default = 0, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_AUTO, .ReadOnly = SAHPI_TRUE, }, .WriteOnly = SAHPI_FALSE, .Oem = 0, }, .mode = SAHPI_CTRL_MODE_AUTO, .comment = "Analog Control" }, /* Stream Control */ { .index = 4, .control = { .Num = 4, .OutputType = SAHPI_CTRL_LED, .Type = SAHPI_CTRL_TYPE_STREAM, .TypeUnion.Stream.Default = { .Stream[0] = 'O', .Stream[1] = 'k', }, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_AUTO, .ReadOnly = SAHPI_TRUE, }, .WriteOnly = SAHPI_FALSE, .Oem = 0, }, .mode = SAHPI_CTRL_MODE_AUTO, .comment = "Stream Control" }, /* Text Control */ { .index = 5, .control = { .Num = 5, .OutputType = SAHPI_CTRL_LCD_DISPLAY, .Type = SAHPI_CTRL_TYPE_TEXT, .TypeUnion.Text.MaxChars = 10, .TypeUnion.Text.MaxLines = 2, .TypeUnion.Text.Language = SAHPI_LANG_ENGLISH, .TypeUnion.Text.DataType = SAHPI_TL_TYPE_TEXT, .TypeUnion.Text.Default = { .Line = 0, .Text = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 7, .Data[0] = 'U', .Data[1] = 'n', .Data[2] = 'k', .Data[3] = 'n', .Data[4] = 'w', .Data[5] = 'o', .Data[6] = 'n', }, }, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_AUTO, .ReadOnly = SAHPI_TRUE, }, .WriteOnly = SAHPI_FALSE, .Oem = 0, }, .mode = SAHPI_CTRL_MODE_AUTO, .comment = "Text Control" }, /* Oem Control */ { .index = 6, .control = { .Num = 6, .OutputType = SAHPI_CTRL_LED, .Type = SAHPI_CTRL_TYPE_OEM, .TypeUnion.Oem.MId = 123, .TypeUnion.Oem.ConfigData[0] = 0, .TypeUnion.Oem.ConfigData[1] = 0, .TypeUnion.Oem.ConfigData[2] = 0, .TypeUnion.Oem.ConfigData[3] = 0, .TypeUnion.Oem.ConfigData[4] = 0, .TypeUnion.Oem.ConfigData[5] = 0, .TypeUnion.Oem.ConfigData[6] = 0, .TypeUnion.Oem.ConfigData[7] = 0, .TypeUnion.Oem.ConfigData[8] = 0, .TypeUnion.Oem.ConfigData[9] = 0, .TypeUnion.Oem.Default = { .MId = 123, .BodyLength = 2, .Body[0] = 'O', .Body[1] = 'k', }, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_AUTO, .ReadOnly = SAHPI_TRUE, }, .WriteOnly = SAHPI_FALSE, .Oem = 0, }, .mode = SAHPI_CTRL_MODE_AUTO, .comment = "Oem Control" }, {} /* Terminate array with a null element */ }; struct sim_control sim_cpu_controls[] = { {} /* Terminate array with a null element */ }; struct sim_control sim_dasd_controls[] = { {} /* Terminate array with a null element */ }; struct sim_control sim_hs_dasd_controls[] = { /* Digital Control */ { .index = 1, .control = { .Num = 1, .OutputType = SAHPI_CTRL_LED, .Type = SAHPI_CTRL_TYPE_DIGITAL, .TypeUnion.Digital.Default = SAHPI_CTRL_STATE_ON, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_AUTO, .ReadOnly = SAHPI_TRUE, }, .WriteOnly = SAHPI_FALSE, .Oem = 0, }, .mode = SAHPI_CTRL_MODE_AUTO, .comment = "Digital Control" }, /* Discrete Control */ { .index = 2, .control = { .Num = 2, .OutputType = SAHPI_CTRL_LED, .Type = SAHPI_CTRL_TYPE_DISCRETE, .TypeUnion.Discrete.Default = 1, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_AUTO, .ReadOnly = SAHPI_TRUE, }, .WriteOnly = SAHPI_FALSE, .Oem = 0, }, .mode = SAHPI_CTRL_MODE_AUTO, .comment = "Discrete Control" }, /* Analog Control */ { .index = 3, .control = { .Num = 3, .OutputType = SAHPI_CTRL_AUDIBLE, .Type = SAHPI_CTRL_TYPE_ANALOG, .TypeUnion.Analog.Min = 0, .TypeUnion.Analog.Max = 10, .TypeUnion.Analog.Default = 0, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_AUTO, .ReadOnly = SAHPI_TRUE, }, .WriteOnly = SAHPI_FALSE, .Oem = 0, }, .mode = SAHPI_CTRL_MODE_AUTO, .comment = "Analog Control" }, /* Stream Control */ { .index = 4, .control = { .Num = 4, .OutputType = SAHPI_CTRL_LED, .Type = SAHPI_CTRL_TYPE_STREAM, .TypeUnion.Stream.Default = { .Stream[0] = 'O', .Stream[1] = 'k', }, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_AUTO, .ReadOnly = SAHPI_TRUE, }, .WriteOnly = SAHPI_FALSE, .Oem = 0, }, .mode = SAHPI_CTRL_MODE_AUTO, .comment = "Stream Control" }, /* Text Control */ { .index = 5, .control = { .Num = 5, .OutputType = SAHPI_CTRL_LCD_DISPLAY, .Type = SAHPI_CTRL_TYPE_TEXT, .TypeUnion.Text.MaxChars = 10, .TypeUnion.Text.MaxLines = 2, .TypeUnion.Text.Language = SAHPI_LANG_ENGLISH, .TypeUnion.Text.DataType = SAHPI_TL_TYPE_TEXT, .TypeUnion.Text.Default = { .Line = 0, .Text = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 7, .Data[0] = 'U', .Data[1] = 'n', .Data[2] = 'k', .Data[3] = 'n', .Data[4] = 'w', .Data[5] = 'o', .Data[6] = 'n', }, }, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_AUTO, .ReadOnly = SAHPI_TRUE, }, .WriteOnly = SAHPI_FALSE, .Oem = 0, }, .mode = SAHPI_CTRL_MODE_AUTO, .comment = "Text Control" }, /* Oem Control */ { .index = 6, .control = { .Num = 6, .OutputType = SAHPI_CTRL_LED, .Type = SAHPI_CTRL_TYPE_OEM, .TypeUnion.Oem.MId = 123, .TypeUnion.Oem.ConfigData[0] = 0, .TypeUnion.Oem.ConfigData[1] = 0, .TypeUnion.Oem.ConfigData[2] = 0, .TypeUnion.Oem.ConfigData[3] = 0, .TypeUnion.Oem.ConfigData[4] = 0, .TypeUnion.Oem.ConfigData[5] = 0, .TypeUnion.Oem.ConfigData[6] = 0, .TypeUnion.Oem.ConfigData[7] = 0, .TypeUnion.Oem.ConfigData[8] = 0, .TypeUnion.Oem.ConfigData[9] = 0, .TypeUnion.Oem.Default = { .MId = 123, .BodyLength = 2, .Body[0] = 'O', .Body[1] = 'k', }, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_AUTO, .ReadOnly = SAHPI_TRUE, }, .WriteOnly = SAHPI_FALSE, .Oem = 0, }, .mode = SAHPI_CTRL_MODE_AUTO, .comment = "Oem Control" }, {} /* Terminate array with a null element */ }; struct sim_control sim_fan_controls[] = { { .index = 1, .control = { .Num = 1, .OutputType = SAHPI_CTRL_FAN_SPEED, .Type = SAHPI_CTRL_TYPE_ANALOG, .TypeUnion = { .Analog = { .Min = 0, .Max = 100, .Default = 80 } }, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_MANUAL, .ReadOnly = SAHPI_FALSE }, .WriteOnly = SAHPI_FALSE, .Oem = 0 }, .mode = SAHPI_CTRL_MODE_MANUAL, .comment = "Fan Analog Control" }, {} /* Terminate array with a null element */ }; /****************************************************************************** * Annunciator Definitions * * These are completely made up as RSA has no annunciators ******************************************************************************/ struct sim_annunciator sim_chassis_annunciators[] = { { .index = 1, .annun = { .AnnunciatorNum = 1, .AnnunciatorType = SAHPI_ANNUNCIATOR_TYPE_AUDIBLE, .ModeReadOnly = SAHPI_FALSE, .MaxConditions = 2, .Oem = 0, }, .announs[0] = { .EntryId = 1, .Timestamp = 0, .AddedByUser = SAHPI_FALSE, .Severity = SAHPI_MAJOR, .Acknowledged = SAHPI_FALSE, .StatusCond = { .Type = SAHPI_STATUS_COND_TYPE_SENSOR, .Entity = { .Entry = { {SAHPI_ENT_SYSTEM_BOARD, 1}, {SAHPI_ENT_ROOT, 0} }, }, .DomainId = 1, .ResourceId = 1, .SensorNum = 1, .EventState = SAHPI_ES_UNSPECIFIED, .Name = { .Length = 5, .Value = "announ" }, .Mid = 123, }, }, .announs[1] = { .EntryId = 2, .Timestamp = 0, .AddedByUser = SAHPI_FALSE, .Severity = SAHPI_MINOR, .Acknowledged = SAHPI_FALSE, .StatusCond = { .Type = SAHPI_STATUS_COND_TYPE_SENSOR, .Entity = { .Entry = { {SAHPI_ENT_SYSTEM_BOARD, 1}, {SAHPI_ENT_ROOT, 0} }, }, .DomainId = 1, .ResourceId = 1, .SensorNum = 1, .EventState = SAHPI_ES_UNSPECIFIED, .Name = { .Length = 5, .Value = "announ" }, .Mid = 123, }, }, .announs[2] = { .EntryId = 3, .Timestamp = 0, .AddedByUser = SAHPI_FALSE, .Severity = SAHPI_INFORMATIONAL, .Acknowledged = SAHPI_FALSE, .StatusCond = { .Type = SAHPI_STATUS_COND_TYPE_SENSOR, .Entity = { .Entry = { {SAHPI_ENT_SYSTEM_BOARD, 1}, {SAHPI_ENT_ROOT, 0} }, }, .DomainId = 1, .ResourceId = 1, .SensorNum = 1, .EventState = SAHPI_ES_UNSPECIFIED, .Name = { .Length = 5, .Value = "announ" }, .Mid = 123, }, }, .comment = "Annunciator 1" }, {} /* Terminate array with a null element */ }; struct sim_annunciator sim_cpu_annunciators[] = { {} /* Terminate array with a null element */ }; struct sim_annunciator sim_dasd_annunciators[] = { {} /* Terminate array with a null element */ }; struct sim_annunciator sim_hs_dasd_annunciators[] = { { .index = 1, .annun = { .AnnunciatorNum = 1, .AnnunciatorType = SAHPI_ANNUNCIATOR_TYPE_AUDIBLE, .ModeReadOnly = SAHPI_FALSE, .MaxConditions = 2, .Oem = 0, }, .announs[0] = { .EntryId = 1, .Timestamp = 0, .AddedByUser = SAHPI_FALSE, .Severity = SAHPI_MAJOR, .Acknowledged = SAHPI_FALSE, .StatusCond = { .Type = SAHPI_STATUS_COND_TYPE_SENSOR, .Entity = { .Entry = { {SAHPI_ENT_DISK_DRIVE, 2}, {SAHPI_ENT_ROOT, 0} }, }, .DomainId = 1, .ResourceId = 1, .SensorNum = 1, .EventState = SAHPI_ES_UNSPECIFIED, .Name = { .Length = 5, .Value = "announ" }, .Mid = 123, }, }, .announs[1] = { .EntryId = 2, .Timestamp = 0, .AddedByUser = SAHPI_FALSE, .Severity = SAHPI_MINOR, .Acknowledged = SAHPI_FALSE, .StatusCond = { .Type = SAHPI_STATUS_COND_TYPE_SENSOR, .Entity = { .Entry = { {SAHPI_ENT_DISK_DRIVE, 2}, {SAHPI_ENT_ROOT, 0} }, }, .DomainId = 1, .ResourceId = 1, .SensorNum = 1, .EventState = SAHPI_ES_UNSPECIFIED, .Name = { .Length = 5, .Value = "announ" }, .Mid = 123, }, }, .announs[2] = { .EntryId = 3, .Timestamp = 0, .AddedByUser = SAHPI_FALSE, .Severity = SAHPI_INFORMATIONAL, .Acknowledged = SAHPI_FALSE, .StatusCond = { .Type = SAHPI_STATUS_COND_TYPE_SENSOR, .Entity = { .Entry = { {SAHPI_ENT_DISK_DRIVE, 2}, {SAHPI_ENT_ROOT, 0} }, }, .DomainId = 1, .ResourceId = 1, .SensorNum = 1, .EventState = SAHPI_ES_UNSPECIFIED, .Name = { .Length = 5, .Value = "announ" }, .Mid = 123, }, }, .comment = "Annunciator 2" }, {} /* Terminate array with a null element */ }; struct sim_annunciator sim_fan_annunciators[] = { {} /* Terminate array with a null element */ }; /****************************************************************************** * Watchdog Definitions * * These are completely made up as RSA has no watchdogs ******************************************************************************/ struct sim_watchdog sim_chassis_watchdogs[] = { { .watchdogrec = { .WatchdogNum = 1, .Oem = 0, }, .wd = { .Log = SAHPI_TRUE, .Running = SAHPI_FALSE, .TimerUse = SAHPI_WTU_NONE, .TimerAction = SAHPI_WA_NO_ACTION, .PretimerInterrupt = SAHPI_WPI_NONE, .PreTimeoutInterval = 0, .TimerUseExpFlags = SAHPI_WTU_NONE, .InitialCount = 0, .PresentCount = 0, }, .comment = "Watchdog 1" }, {} /* Terminate array with a null element */ }; struct sim_watchdog sim_cpu_watchdogs[] = { {} /* Terminate array with a null element */ }; struct sim_watchdog sim_dasd_watchdogs[] = { {} /* Terminate array with a null element */ }; struct sim_watchdog sim_hs_dasd_watchdogs[] = { { .watchdogrec = { .WatchdogNum = 1, .Oem = 0, }, .wd = { .Log = SAHPI_TRUE, .Running = SAHPI_FALSE, .TimerUse = SAHPI_WTU_NONE, .TimerAction = SAHPI_WA_NO_ACTION, .PretimerInterrupt = SAHPI_WPI_NONE, .PreTimeoutInterval = 0, .TimerUseExpFlags = SAHPI_WTU_NONE, .InitialCount = 0, .PresentCount = 0, }, .comment = "Watchdog 2" }, {} /* Terminate array with a null element */ }; struct sim_watchdog sim_fan_watchdogs[] = { {} /* Terminate array with a null element */ }; /************************************************************************* * Inventory Definitions *************************************************************************/ struct sim_inventory sim_chassis_inventory[] = { { .invrec = { .IdrId = 1, .Persistent = SAHPI_FALSE, .Oem = 0, }, .info = { .nextareaid = 2, // change if you add more areas below .idrinfo = { .IdrId = 1, .UpdateCount = 0, .ReadOnly = SAHPI_TRUE, .NumAreas = 1, // change if you want more areas below }, .area[0] = { .nextfieldid = 2, // change if you add more fields below .idrareahead = { .AreaId = 1, .Type = SAHPI_IDR_AREATYPE_CHASSIS_INFO, .ReadOnly = SAHPI_TRUE, .NumFields = 1, //change if you add more fields below }, .field[0] = { .AreaId = 1, .FieldId = 1, .Type = SAHPI_IDR_FIELDTYPE_MANUFACTURER, .ReadOnly = SAHPI_TRUE, .Field = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 6, .Data[0] = 'I', .Data[1] = 'B', .Data[2] = 'M', .Data[3] = 'X', .Data[4] = 'X', .Data[5] = 'X', .Data[6] = '\0', }, }, }, }, .comment = "Simulator Inv 1", }, {} /* Terminate array with a null element */ }; struct sim_inventory sim_cpu_inventory[] = { {} /* Terminate array with a null element */ }; struct sim_inventory sim_dasd_inventory[] = { {} /* Terminate array with a null element */ }; struct sim_inventory sim_hs_dasd_inventory[] = { { .invrec = { .IdrId = 1, .Persistent = SAHPI_FALSE, .Oem = 0, }, .info = { .nextareaid = 2, // change if you add more areas below .idrinfo = { .IdrId = 1, .UpdateCount = 0, .ReadOnly = SAHPI_TRUE, .NumAreas = 1, // change if you want more areas below }, .area[0] = { .nextfieldid = 2, // change if you add more fields below .idrareahead = { .AreaId = 1, .Type = SAHPI_IDR_AREATYPE_CHASSIS_INFO, .ReadOnly = SAHPI_TRUE, .NumFields = 1, //change if you add more fields below }, .field[0] = { .AreaId = 1, .FieldId = 1, .Type = SAHPI_IDR_FIELDTYPE_MANUFACTURER, .ReadOnly = SAHPI_TRUE, .Field = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 6, .Data[0] = 'I', .Data[1] = 'B', .Data[2] = 'M', .Data[3] = 'X', .Data[4] = 'X', .Data[5] = 'X', .Data[6] = '\0', }, }, }, }, .comment = "Simulator HS DASD Inv 1", }, {} /* Terminate array with a null element */ }; struct sim_inventory sim_fan_inventory[] = { {} /* Terminate array with a null element */ }; struct sim_dimi sim_chassis_dimis[] = { { .dimirec = { .DimiNum = 1, .Oem = 0, }, .info = { .NumberOfTests =1, .TestNumUpdateCounter=0, }, .test = { .TestName={ .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 7, .Data = "unknown" }, .ServiceImpact=SAHPI_DIMITEST_NONDEGRADING, .EntitiesImpacted= { { .EntityImpacted.Entry= { { .EntityType = SAHPI_ENT_PROCESSOR, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_POWER_SUPPLY, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ADD_IN_CARD, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_POWER_UNIT, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 }, }, .ServiceImpact=SAHPI_DIMITEST_NONDEGRADING, } }, .NeedServiceOS= SAHPI_FALSE, .ExpectedRunDuration=1000000000, .TestCapabilities=SAHPI_DIMITEST_CAPABILITY_TESTCANCEL, .TestParameters = { { .ParamName = "Some Test Param Name", .ParamInfo = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 7, .Data = "Unknown" }, .ParamType = SAHPI_DIMITEST_PARAM_TYPE_BOOLEAN, .DefaultParam.parambool = SAHPI_TRUE } } }, .comment = "Dimi 1 simulator", }, {} /* Terminate array with a null element */ }; struct sim_fumi sim_chassis_fumis[] = { { .fumirec = { .Num = 1, .AccessProt = SAHPI_FUMI_PROT_FTP, .Capability = SAHPI_FUMI_CAP_BANKCOPY, .NumBanks = 1, .Oem = 0, }, .srcinfo = { .SourceUri = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 7, .Data = "unknown" }, .SourceStatus = SAHPI_FUMI_SRC_VALID, .Identifier = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 3, .Data = "abc" }, .Description = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 3, .Data = "xyz" }, .DateTime = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 3, .Data = "09/05/2008" }, .MajorVersion = 0, .MinorVersion = 0, .AuxVersion = 0 }, .info = { .BankId = 0, .BankSize = 250, .Position = 1, .BankState = SAHPI_FUMI_BANK_ACTIVE, .Identifier = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 3, .Data = "abc" }, .Description = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 3, .Data = "xyz" }, .DateTime = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 3, .Data = "09/05/2008" }, .MajorVersion = 0, .MinorVersion = 0, .AuxVersion = 0 }, .comment = "Fumi 1 simulator", }, {} /* Terminate array with a null element */ }; openhpi-3.6.1/plugins/simulator/sim_hotswap.h0000644000175100017510000000243312575647265020406 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef __SIM_HOTSWAP_H #define __SIM_HOTSWAP_H SaErrorT sim_get_hotswap_state(void *hnd, SaHpiResourceIdT rid, SaHpiHsStateT *state); SaErrorT sim_set_hotswap_state(void *hnd, SaHpiResourceIdT rid, SaHpiHsStateT state); SaErrorT sim_request_hotswap_action(void *hnd, SaHpiResourceIdT rid, SaHpiHsActionT act); SaErrorT sim_get_indicator_state(void *hnd, SaHpiResourceIdT rid, SaHpiHsIndicatorStateT *state); SaErrorT sim_set_indicator_state(void *hnd, SaHpiResourceIdT rid, SaHpiHsIndicatorStateT state); SaErrorT sim_get_autoextract_timeout(void *hnd, SaHpiResourceIdT rid, SaHpiTimeoutT *timeout); SaErrorT sim_set_autoextract_timeout(void *hnd, SaHpiResourceIdT rid, SaHpiTimeoutT timeout); #endif openhpi-3.6.1/plugins/simulator/sim_dimi_func.c0000644000175100017510000000150412575647265020647 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2007 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales */ #include SaErrorT sim_get_dimi_info(void *hnd, SaHpiResourceIdT rid, SaHpiDimiNumT num, SaHpiDimiInfoT *info) { return SA_ERR_HPI_INVALID_CMD; } void * oh_get_dimi_info (void *, SaHpiResourceIdT, SaHpiDimiNumT, SaHpiDimiInfoT *) __attribute__ ((weak, alias("sim_get_dimi_info"))); openhpi-3.6.1/plugins/simulator/sim_sensor_func.c0000755000175100017510000005041712575647265021250 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Christina Hernandez * W. David Ashley */ #include /************************************************************************/ /* Sensor functions */ /************************************************************************/ SaErrorT sim_get_sensor_reading(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiSensorReadingT *data, SaHpiEventStateT *state) { struct SensorInfo *sinfo; struct oh_handler_state *handle = (struct oh_handler_state *)hnd; if (!hnd) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } /* Check if resource exists and has sensor capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(handle->rptcache, id); if (!rpt) return(SA_ERR_HPI_INVALID_RESOURCE); if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) return(SA_ERR_HPI_CAPABILITY); /* Check if sensor exist and is enabled */ SaHpiRdrT *rdr = oh_get_rdr_by_type(handle->rptcache, id, SAHPI_SENSOR_RDR, num); if (rdr == NULL) return(SA_ERR_HPI_NOT_PRESENT); sinfo = (struct SensorInfo *)oh_get_rdr_data(handle->rptcache, id, rdr->RecordId); if (sinfo == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); return(SA_ERR_HPI_NOT_PRESENT); } /*If sensor is enabled, get sensor reading*/ if (sinfo->sensor_enabled == SAHPI_FALSE) { return(SA_ERR_HPI_INVALID_REQUEST); } else { if (data) { *data = sinfo->reading; } if (state) { *state = sinfo->cur_state; } } return(SA_OK); } SaErrorT sim_get_sensor_eventstate(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiSensorReadingT *reading, SaHpiEventStateT *state) { struct SensorInfo *sinfo; struct oh_handler_state *handle = (struct oh_handler_state *)hnd; if (!hnd || !reading || !state) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } /* Check if resource exists and has sensor capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) return(SA_ERR_HPI_INVALID_RESOURCE); if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) return(SA_ERR_HPI_CAPABILITY); /* Check if sensor exist and is enabled */ SaHpiRdrT *rdr = oh_get_rdr_by_type(handle->rptcache, rid, SAHPI_SENSOR_RDR, sid); if (rdr == NULL) return(SA_ERR_HPI_NOT_PRESENT); sinfo = (struct SensorInfo *)oh_get_rdr_data(handle->rptcache, rid, rdr->RecordId); if (sinfo == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); return(SA_ERR_HPI_NOT_PRESENT); } /*If sensor is enabled, set event state to cur_state*/ if (sinfo->sensor_enabled == SAHPI_FALSE){ return(SA_ERR_HPI_INVALID_REQUEST); } else { *state = sinfo->cur_state; } return(SA_OK); } SaErrorT sim_get_sensor_thresholds(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiSensorThresholdsT *thres) { struct SensorInfo *sinfo; struct oh_handler_state *handle = (struct oh_handler_state *)hnd; if (!hnd || !thres) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } if (!rid) return SA_ERR_HPI_INVALID_RESOURCE; if (!sid) return SA_ERR_HPI_NOT_PRESENT; /* Check if resource exists and has sensor capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) return(SA_ERR_HPI_INVALID_RESOURCE); if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) return(SA_ERR_HPI_CAPABILITY); /* Check if sensor exist and is enabled */ SaHpiRdrT *rdr = oh_get_rdr_by_type(handle->rptcache, rid, SAHPI_SENSOR_RDR, sid); if (rdr == NULL) return(SA_ERR_HPI_NOT_PRESENT); sinfo = (struct SensorInfo *)oh_get_rdr_data(handle->rptcache, rid, rdr->RecordId); if (sinfo == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); return(SA_ERR_HPI_NOT_PRESENT); } /* If sensor is enabled, set thresholds */ if (sinfo->sensor_enabled == SAHPI_FALSE){ return(SA_ERR_HPI_INVALID_REQUEST); } else { *thres = sinfo->thres; } return(SA_OK); } SaErrorT sim_set_sensor_thresholds(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, const SaHpiSensorThresholdsT *thres) { struct oh_handler_state *handle = (struct oh_handler_state *)hnd; struct SensorInfo *sinfo; if (!hnd || !thres) { err("Invalid parameter"); return(SA_ERR_HPI_INVALID_PARAMS); } /* Check if resource exists and has sensor capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) return(SA_ERR_HPI_INVALID_RESOURCE); if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) return(SA_ERR_HPI_CAPABILITY); /* Check if sensor exist and is enabled */ SaHpiRdrT *rdr = oh_get_rdr_by_type(handle->rptcache, rid, SAHPI_SENSOR_RDR, sid); if (rdr == NULL) return(SA_ERR_HPI_NOT_PRESENT); sinfo = (struct SensorInfo *)oh_get_rdr_data(handle->rptcache, rid, rdr->RecordId); if (sinfo == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); return(SA_ERR_HPI_NOT_PRESENT); } if (rdr->RdrTypeUnion.SensorRec.Category != SAHPI_EC_THRESHOLD || rdr->RdrTypeUnion.SensorRec.ThresholdDefn.IsAccessible == SAHPI_FALSE || rdr->RdrTypeUnion.SensorRec.ThresholdDefn.WriteThold == 0) { return(SA_ERR_HPI_INVALID_CMD); } if (sinfo->sensor_enabled == SAHPI_FALSE){ return(SA_ERR_HPI_INVALID_REQUEST); } else{ memcpy(&sinfo->thres, thres, sizeof(SaHpiSensorThresholdsT)); } return(SA_OK); } /* Do we want this functionality??? SaErrorT sim_set_threshold_reading(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, const SaHpiSensorReadingT *reading) */ SaErrorT sim_get_sensor_enable(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiBoolT *enable) { struct oh_handler_state *handle = (struct oh_handler_state *)hnd; struct SensorInfo *sinfo; if (!hnd || !rid || !sid) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } /* Check if resource exists and has sensor capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) return(SA_ERR_HPI_INVALID_RESOURCE); if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) return(SA_ERR_HPI_CAPABILITY); /* Check if sensor exist and is enabled */ SaHpiRdrT *rdr = oh_get_rdr_by_type(handle->rptcache, rid, SAHPI_SENSOR_RDR, sid); if (rdr == NULL) return(SA_ERR_HPI_NOT_PRESENT); sinfo = (struct SensorInfo *)oh_get_rdr_data(handle->rptcache, rid, rdr->RecordId); if (sinfo == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); return(SA_ERR_HPI_NOT_PRESENT); } /*If sensor is enabled, get sensor enable */ if (sinfo->sensor_enabled == SAHPI_FALSE){ return(SA_ERR_HPI_INVALID_REQUEST); } else { *enable = sinfo->sensor_enabled; } return(SA_OK); } SaErrorT sim_set_sensor_enable(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, const SaHpiBoolT enable) { struct oh_handler_state *handle = (struct oh_handler_state *)hnd; struct SensorInfo *sinfo; if (!hnd || !rid || !sid || !enable) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } /* Check if resource exists and has sensor capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) return(SA_ERR_HPI_INVALID_RESOURCE); if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) return(SA_ERR_HPI_CAPABILITY); /* Check if sensor exist and is enabled */ SaHpiRdrT *rdr = oh_get_rdr_by_type(handle->rptcache, rid, SAHPI_SENSOR_RDR, sid); if (rdr == NULL) return(SA_ERR_HPI_NOT_PRESENT); sinfo = (struct SensorInfo *)oh_get_rdr_data(handle->rptcache, rid, rdr->RecordId); if (sinfo == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); return(SA_ERR_HPI_NOT_PRESENT); } /* set sensor flag */ sinfo->sensor_enabled = enable; return(SA_OK); } SaErrorT sim_get_sensor_event_enable(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiBoolT *enable) { struct oh_handler_state *handle = (struct oh_handler_state *)hnd; struct SensorInfo *sinfo; if (!hnd || !rid || !sid || !enable) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } /* Check if resource exists and has sensor capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) return(SA_ERR_HPI_INVALID_RESOURCE); if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) return(SA_ERR_HPI_CAPABILITY); /* Check if sensor exist and is enabled */ SaHpiRdrT *rdr = oh_get_rdr_by_type(handle->rptcache, rid, SAHPI_SENSOR_RDR, sid); if (rdr == NULL) return(SA_ERR_HPI_NOT_PRESENT); sinfo = (struct SensorInfo *)oh_get_rdr_data(handle->rptcache, rid, rdr->RecordId); if (sinfo == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); return(SA_ERR_HPI_NOT_PRESENT); } /* ge sensor event enable flag */ if (sinfo->sensor_enabled == SAHPI_FALSE){ return(SA_ERR_HPI_INVALID_REQUEST); } else { *enable = sinfo->events_enabled; } return(SA_OK); } SaErrorT sim_set_sensor_event_enable(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, const SaHpiBoolT enable) { struct oh_handler_state *handle = (struct oh_handler_state *)hnd; if (!hnd ) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } /* Check if resource exists and has sensor capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) return(SA_ERR_HPI_INVALID_RESOURCE); if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) return(SA_ERR_HPI_CAPABILITY); /* Check if sensor exists and if it supports setting of sensor event enablement */ SaHpiRdrT *rdr = oh_get_rdr_by_type(handle->rptcache, rid, SAHPI_SENSOR_RDR, sid); if (rdr == NULL) return(SA_ERR_HPI_NOT_PRESENT); if (rdr->RdrTypeUnion.SensorRec.EventCtrl == SAHPI_SEC_PER_EVENT || rdr->RdrTypeUnion.SensorRec.EventCtrl == SAHPI_SEC_READ_ONLY_MASKS) { err("BladeCenter/RSA do not support sim_set_sensor_event_enable\n"); struct SensorInfo *sinfo; sinfo = (struct SensorInfo *)oh_get_rdr_data(handle->rptcache, rid, rdr->RecordId); if (sinfo == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); return(SA_ERR_HPI_NOT_PRESENT); } sinfo->events_enabled = enable; } else { return(SA_ERR_HPI_READ_ONLY); } return(SA_OK); } SaErrorT sim_get_sensor_event_masks(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiEventStateT *AssertEventMask, SaHpiEventStateT *DeassertEventMask) { struct oh_handler_state *handle = (struct oh_handler_state *)hnd; struct SensorInfo *sinfo; if (!hnd ) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } /* Check if resource exists and has sensor capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) return(SA_ERR_HPI_INVALID_RESOURCE); if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) return(SA_ERR_HPI_CAPABILITY); /* Check if sensor exists and return enablement status */ SaHpiRdrT *rdr = oh_get_rdr_by_type(handle->rptcache, rid, SAHPI_SENSOR_RDR, sid); if (rdr == NULL) return(SA_ERR_HPI_NOT_PRESENT); if (!AssertEventMask && !DeassertEventMask) { return SA_OK; } sinfo = (struct SensorInfo *)oh_get_rdr_data(handle->rptcache, rid, rdr->RecordId); if (sinfo == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); return(SA_ERR_HPI_NOT_PRESENT); } if (AssertEventMask) *AssertEventMask = sinfo->assert_mask; if (DeassertEventMask) { if (rpt->ResourceCapabilities & SAHPI_CAPABILITY_EVT_DEASSERTS) { *DeassertEventMask = sinfo->assert_mask; } else { *DeassertEventMask = sinfo->deassert_mask; } } return(SA_OK); } SaErrorT sim_set_sensor_event_masks(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiSensorEventMaskActionT act, const SaHpiEventStateT AssertEventMask, const SaHpiEventStateT DeassertEventMask) { struct oh_handler_state *handle = (struct oh_handler_state *)hnd; if (!hnd ) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } if (oh_lookup_sensoreventmaskaction(act) == NULL) return(SA_ERR_HPI_INVALID_DATA); /* Check if resource exists and has sensor capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) return(SA_ERR_HPI_INVALID_RESOURCE); if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) return(SA_ERR_HPI_CAPABILITY); /* Check if sensor exists and if it supports setting of sensor event masks */ SaHpiRdrT *rdr = oh_get_rdr_by_type(handle->rptcache, rid, SAHPI_SENSOR_RDR, sid); if (rdr == NULL) return(SA_ERR_HPI_NOT_PRESENT); if (rdr->RdrTypeUnion.SensorRec.EventCtrl == SAHPI_SEC_PER_EVENT) { err("BladeCenter/RSA do not support sim_set_sensor_event_masks"); /* Probably need to drive an OID, if hardware supported it */ struct SensorInfo *sinfo; sinfo = (struct SensorInfo *)oh_get_rdr_data(handle->rptcache, rid, rdr->RecordId); if (sinfo == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); return(SA_ERR_HPI_NOT_PRESENT); } SaHpiEventStateT orig_assert_mask = sinfo->assert_mask; SaHpiEventStateT orig_deassert_mask = sinfo->deassert_mask; /* Check for invalid data in user masks */ if ( (AssertEventMask != SAHPI_ALL_EVENT_STATES) && (AssertEventMask & ~(rdr->RdrTypeUnion.SensorRec.Events)) ) { return(SA_ERR_HPI_INVALID_DATA); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_EVT_DEASSERTS)) { if ( (DeassertEventMask != SAHPI_ALL_EVENT_STATES) && (DeassertEventMask & ~(rdr->RdrTypeUnion.SensorRec.Events)) ) { return(SA_ERR_HPI_INVALID_DATA); } } /* Add to event masks */ if (act == SAHPI_SENS_ADD_EVENTS_TO_MASKS) { if (AssertEventMask == SAHPI_ALL_EVENT_STATES) { sinfo->assert_mask = rdr->RdrTypeUnion.SensorRec.Events; } else { sinfo->assert_mask = sinfo->assert_mask | AssertEventMask; } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_EVT_DEASSERTS)) { if (DeassertEventMask == SAHPI_ALL_EVENT_STATES) { sinfo->deassert_mask = rdr->RdrTypeUnion.SensorRec.Events; } else { sinfo->deassert_mask = sinfo->deassert_mask | DeassertEventMask; } } } else { /* Remove from event masks */ if (AssertEventMask == SAHPI_ALL_EVENT_STATES) { sinfo->assert_mask = 0; } else { sinfo->assert_mask = sinfo->assert_mask & ~AssertEventMask; } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_EVT_DEASSERTS)) { if (DeassertEventMask == SAHPI_ALL_EVENT_STATES) { sinfo->deassert_mask = 0; } else { sinfo->deassert_mask = sinfo->deassert_mask & ~DeassertEventMask; } } } if (sinfo->assert_mask != orig_assert_mask) { // nop? } else { if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_EVT_DEASSERTS) && sinfo->deassert_mask != orig_deassert_mask) { } } } else { return(SA_ERR_HPI_READ_ONLY); } return(SA_OK); } /* * Simulator plugin interface * */ void * oh_get_sensor_reading (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiSensorReadingT *, SaHpiEventStateT *) __attribute__ ((weak, alias("sim_get_sensor_reading"))); void * oh_get_sensor_thresholds (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiSensorThresholdsT *) __attribute__ ((weak, alias("sim_get_sensor_thresholds"))); void * oh_set_sensor_thresholds (void *, SaHpiResourceIdT, SaHpiSensorNumT, const SaHpiSensorThresholdsT *) __attribute__ ((weak, alias("sim_set_sensor_thresholds"))); void * oh_get_sensor_enable (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT *) __attribute__ ((weak, alias("sim_get_sensor_enable"))); void * oh_set_sensor_enable (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT) __attribute__ ((weak, alias("sim_set_sensor_enable"))); void * oh_get_sensor_event_enables (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT *) __attribute__ ((weak, alias("sim_get_sensor_event_enable"))); void * oh_set_sensor_event_enables (void *, SaHpiResourceIdT id, SaHpiSensorNumT, SaHpiBoolT *) __attribute__ ((weak, alias("sim_set_sensor_event_enable"))); void * oh_get_sensor_event_masks (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiEventStateT *, SaHpiEventStateT *) __attribute__ ((weak, alias("sim_get_sensor_event_masks"))); void * oh_set_sensor_event_masks (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiSensorEventMaskActionT, SaHpiEventStateT, SaHpiEventStateT) __attribute__ ((weak, alias("sim_set_sensor_event_masks"))); openhpi-3.6.1/plugins/simulator/sim_sensors.c0000755000175100017510000001112012575647265020404 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Christina Hernandez * W. David Ashley * Renier Morales */ #include #include static SaErrorT new_sensor(struct oh_handler_state *state, struct oh_event *e, struct sim_sensor *mysensor) { SaHpiRdrT *rdr = NULL; struct SensorInfo *info = NULL; SaErrorT error = SA_OK; rdr = (SaHpiRdrT *)g_malloc0(sizeof(SaHpiRdrT)); info = (struct SensorInfo *)g_malloc0(sizeof(struct SensorInfo)); // set up rdr rdr->RdrType = SAHPI_SENSOR_RDR; rdr->RdrTypeUnion.SensorRec = mysensor->sensor; rdr->IsFru = 1; rdr->RecordId = oh_get_rdr_uid(rdr->RdrType, rdr->RdrTypeUnion.SensorRec.Num); oh_init_textbuffer(&rdr->IdString); oh_append_textbuffer(&rdr->IdString, mysensor->comment); rdr->Entity = e->resource.ResourceEntity; // now set up our extra info for the sensor *info = mysensor->sensor_info; // everything ready so add the rdr and extra info to the rptcache error = sim_inject_rdr(state, e, rdr, info); if (error) { g_free(rdr); g_free(info); } return error; } SaErrorT sim_discover_chassis_sensors(struct oh_handler_state *state, struct oh_event *e) { SaErrorT rc; int i = 0; int j = 0; while (sim_chassis_sensors[i].index != 0) { rc = new_sensor(state, e, &sim_chassis_sensors[i]); if (rc) { err("Error %s returned when adding chassis sensor", oh_lookup_error(rc)); } else { j++; } i++; } dbg("%d of %d chassis sensors injected", j, i); return 0; } SaErrorT sim_discover_cpu_sensors(struct oh_handler_state *state, struct oh_event *e) { SaErrorT rc; int i = 0; int j = 0; while (sim_cpu_sensors[i].index != 0) { rc = new_sensor(state, e, &sim_cpu_sensors[i]); if (rc) { err("Error %d returned when adding cpu sensor", rc); } else { j++; } i++; } dbg("%d of %d cpu sensors injected", j, i); return 0; } SaErrorT sim_discover_dasd_sensors(struct oh_handler_state *state, struct oh_event *e) { SaErrorT rc; int i = 0; int j = 0; while (sim_dasd_sensors[i].index != 0) { rc = new_sensor(state, e, &sim_dasd_sensors[i]); if (rc) { err("Error %d returned when adding dasd sensor", rc); } else { j++; } i++; } dbg("%d of %d dasd sensors injected", j, i); return 0; } SaErrorT sim_discover_hs_dasd_sensors(struct oh_handler_state *state, struct oh_event *e) { SaErrorT rc; int i = 0; int j = 0; while (sim_hs_dasd_sensors[i].index != 0) { rc = new_sensor(state, e, &sim_hs_dasd_sensors[i]); if (rc) { err("Error %d returned when adding hs dasd sensor", rc); } else { j++; } i++; } dbg("%d of %d hs dasd sensors injected", j, i); return 0; } SaErrorT sim_discover_fan_sensors(struct oh_handler_state *state, struct oh_event *e) { SaErrorT rc; int i = 0; int j = 0; while (sim_fan_sensors[i].index != 0) { rc = new_sensor(state, e, &sim_fan_sensors[i]); if (rc) { err("Error %d returned when adding fan sensor", rc); } else { j++; } i++; } dbg("%d of %d fan sensors injected", j, i); return 0; } openhpi-3.6.1/plugins/simulator/sim_reset.h0000644000175100017510000000133712575647265020045 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef __SIM_RESET_H #define __SIM_RESET_H SaErrorT sim_get_reset_state(void *hnd, SaHpiResourceIdT rid, SaHpiResetActionT *act); SaErrorT sim_set_reset_state(void *hnd, SaHpiResourceIdT rid, SaHpiResetActionT act); #endif openhpi-3.6.1/plugins/simulator/sim_el.c0000644000175100017510000001426112575647265017316 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005, 2006, 2007, 2008 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley * Suntrupth S Yadav */ #include SaErrorT sim_el_get_info(void *hnd, SaHpiResourceIdT id, SaHpiEventLogInfoT *info) { SaErrorT err; struct oh_handler_state *state; if (!hnd || !info) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } state = (struct oh_handler_state *)hnd; err = oh_el_info(state->elcache, info); return err; } SaErrorT sim_el_set_state(void *hnd, SaHpiResourceIdT id, SaHpiBoolT state) { struct oh_handler_state *h = (struct oh_handler_state *)hnd; if (!hnd || !id) return SA_ERR_HPI_INVALID_PARAMS; return oh_el_enableset(h->elcache, state); } SaErrorT sim_el_get_state(void *hnd, SaHpiResourceIdT id, SaHpiBoolT *state) { struct oh_handler_state *h = (struct oh_handler_state *)hnd; SaHpiEventLogInfoT elinfo; if (!hnd || !id) return SA_ERR_HPI_INVALID_PARAMS; oh_el_info(h->elcache, &elinfo); *state = elinfo.Enabled; return SA_OK; } SaErrorT sim_el_set_time(void *hnd, SaHpiResourceIdT id, SaHpiTimeT time) { struct oh_handler_state *state; SaErrorT err; if (!hnd) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } state = (struct oh_handler_state *)hnd; err = oh_el_timeset(state->elcache, time); if (err) { err("Cannot set time. Error=%s.", oh_lookup_error(err)); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } SaErrorT sim_el_add_entry(void *hnd, SaHpiResourceIdT id, const SaHpiEventT *Event) { struct oh_handler_state *state; if (!hnd) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } state = (struct oh_handler_state *)hnd; return oh_el_append(state->elcache, Event, NULL, NULL); } SaErrorT sim_el_get_entry(void *hnd, SaHpiResourceIdT id, SaHpiEventLogEntryIdT current, SaHpiEventLogEntryIdT *prev, SaHpiEventLogEntryIdT *next, SaHpiEventLogEntryT *entry, SaHpiRdrT *rdr, SaHpiRptEntryT *rptentry) { SaErrorT err = SA_OK; oh_el_entry tmpentry, *tmpentryptr; tmpentryptr = &tmpentry; struct oh_handler_state *state; if (!hnd || !prev || !next || !entry) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } state = (struct oh_handler_state *)hnd; err = oh_el_get(state->elcache, current, prev, next, &tmpentryptr); if (err) { err("Getting Event Log entry=%d from cache failed. Error=%s.", current, oh_lookup_error(err)); return err; } else { memcpy(entry, &(tmpentryptr->event), sizeof(SaHpiEventLogEntryT)); if (rdr) memcpy(rdr, &tmpentryptr->rdr, sizeof(SaHpiRdrT)); if (rptentry) memcpy(rptentry, &(tmpentryptr->res), sizeof(SaHpiRptEntryT)); } return SA_OK; } SaErrorT sim_el_clear(void *hnd, SaHpiResourceIdT id) { struct oh_handler_state *state; SaErrorT err; if (!hnd) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } state = (struct oh_handler_state *)hnd; err = oh_el_clear(state->elcache); if (err) { err("Cannot clear system Event Log. Error=%s.", oh_lookup_error(err)); return err; } return SA_OK; } SaErrorT sim_el_overflow(void *hnd, SaHpiResourceIdT id) { struct oh_handler_state *state; if (!hnd) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } state = (struct oh_handler_state *)hnd; return oh_el_overflowreset(state->elcache); } SaErrorT sim_el_get_caps(void *hnd, SaHpiResourceIdT id, SaHpiEventLogCapabilitiesT *caps) { struct oh_handler_state *state; if (!hnd || !caps) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } *caps = SAHPI_EVTLOG_CAPABILITY_ENTRY_ADD | SAHPI_EVTLOG_CAPABILITY_CLEAR | SAHPI_EVTLOG_CAPABILITY_TIME_SET | SAHPI_EVTLOG_CAPABILITY_STATE_SET; state = (struct oh_handler_state *)hnd; if (state->elcache->info.OverflowResetable) { *caps |= SAHPI_EVTLOG_CAPABILITY_OVERFLOW_RESET; } return SA_OK; } void * oh_get_el_info (void *, SaHpiResourceIdT, SaHpiEventLogInfoT *) __attribute__ ((weak, alias("sim_el_get_info"))); void * oh_set_el_state (void *, SaHpiResourceIdT, SaHpiBoolT) __attribute__ ((weak, alias("sim_el_set_state"))); void * oh_get_el_state (void *, SaHpiResourceIdT, SaHpiBoolT *) __attribute__ ((weak, alias("sim_el_get_state"))); void * oh_set_el_time (void *, SaHpiResourceIdT, const SaHpiEventT *) __attribute__ ((weak, alias("sim_el_set_time"))); void * oh_add_el_entry (void *, SaHpiResourceIdT, const SaHpiEventT *) __attribute__ ((weak, alias("sim_el_add_entry"))); void * oh_get_el_entry (void *, SaHpiResourceIdT, SaHpiEventLogEntryIdT, SaHpiEventLogEntryIdT *, SaHpiEventLogEntryIdT *, SaHpiEventLogEntryT *, SaHpiRdrT *, SaHpiRptEntryT *) __attribute__ ((weak, alias("sim_el_get_entry"))); void * oh_clear_el (void *, SaHpiResourceIdT) __attribute__ ((weak, alias("sim_el_clear"))); void * oh_reset_el_overflow (void *, SaHpiResourceIdT) __attribute__ ((weak, alias("sim_el_overflow"))); void * oh_get_el_caps (void *, SaHpiResourceIdT, SaHpiEventLogCapabilitiesT *) __attribute__ ((weak, alias("sim_el_get_caps"))); openhpi-3.6.1/plugins/simulator/t/0000755000175100017510000000000012605014574016122 5ustar mohanmohanopenhpi-3.6.1/plugins/simulator/t/sim_sanity_022.c0000644000175100017510000000657112575647265021060 0ustar mohanmohan/* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiAnnouncementT announ; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } /* add an announcement */ announ.EntryId = 0; // modified by oh_announcement_append announ.Timestamp = 0; // modified by oh_announcement_append announ.AddedByUser = FALSE; // modified by oh_announcement_append announ.Severity = SAHPI_CRITICAL; announ.Acknowledged = FALSE; announ.StatusCond.Type= SAHPI_STATUS_COND_TYPE_SENSOR; announ.StatusCond.Entity.Entry[0].EntityType = SAHPI_ENT_SYSTEM_BOARD; announ.StatusCond.Entity.Entry[0].EntityLocation = 1; announ.StatusCond.Entity.Entry[1].EntityType = SAHPI_ENT_ROOT; announ.StatusCond.Entity.Entry[1].EntityLocation = 0; announ.StatusCond.DomainId = 1; announ.StatusCond.ResourceId = 1; announ.StatusCond.SensorNum = 1; announ.StatusCond.EventState = SAHPI_ES_UNSPECIFIED; announ.StatusCond.Name.Length = 6; memcpy(&announ.StatusCond.Name.Value,"announ", 6); announ.StatusCond.Mid = 123; announ.StatusCond.Data.DataType = SAHPI_TL_TYPE_TEXT; announ.StatusCond.Data.Language = SAHPI_LANG_ENGLISH; announ.StatusCond.Data.DataLength = 6; memcpy(&announ.StatusCond.Data.Data,"announ", 6); rc = saHpiAnnunciatorAdd(sid, resid, 1, &announ); if (rc != SA_OK) { err("Couldn't add announcement"); err("Error %s",oh_lookup_error(rc)); return -1; } rc = saHpiAnnunciatorDelete(sid, resid, 1, SAHPI_ENTRY_UNSPECIFIED, SAHPI_CRITICAL); if (rc != SA_OK) { err("Couldn't delete announcement"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-3.6.1/plugins/simulator/t/sim_sanity_006.c0000644000175100017510000000366112575647265021057 0ustar mohanmohan/* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiSensorTypeT type; SaHpiEventCategoryT category; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } /* get sensor type */ rc = saHpiSensorTypeGet(sid, resid, 1, &type, &category); if (rc != SA_OK) { err("Couldn't get a sensor reading"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-3.6.1/plugins/simulator/t/sim_sanity_024.c0000644000175100017510000000361412575647265021055 0ustar mohanmohan/* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } rc = saHpiAnnunciatorModeSet(sid, resid, 1, SAHPI_ANNUNCIATOR_MODE_AUTO); if (rc != SA_OK) { err("Couldn't set annunciator mode"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-3.6.1/plugins/simulator/t/sim_sanity_004.c0000644000175100017510000000367112575647265021056 0ustar mohanmohan/* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiSensorReadingT reading; SaHpiEventStateT state; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } /* get a sensor reading */ rc = saHpiSensorReadingGet(sid, resid, 1, &reading, &state); if (rc != SA_OK) { err("Couldn't get a sensor reading"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-3.6.1/plugins/simulator/t/sim_sanity_000.c0000644000175100017510000000160112575647265021041 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) return -1; return 0; } openhpi-3.6.1/plugins/simulator/t/openhpi.conf0000644000175100017510000000016512575647265020454 0ustar mohanmohanplugin libsimulator handler libsimulator { entity_root = "{SYSTEM_CHASSIS,1}" name = "simulator" } openhpi-3.6.1/plugins/simulator/t/sim_sanity_027.c0000644000175100017510000000544612575647265021065 0ustar mohanmohan/* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiAnnouncementT announ; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } announ.EntryId = SAHPI_FIRST_ENTRY; rc = saHpiAnnunciatorGetNext(sid, resid, 1, SAHPI_ALL_SEVERITIES, FALSE, &announ); if (rc != SA_OK) { err("Couldn't get next annunciator"); err("Error %s",oh_lookup_error(rc)); return -1; } rc = saHpiAnnunciatorGetNext(sid, resid, 1, SAHPI_ALL_SEVERITIES, FALSE, &announ); if (rc != SA_OK) { err("Couldn't get next annunciator"); err("Error %s",oh_lookup_error(rc)); return -1; } rc = saHpiAnnunciatorGetNext(sid, resid, 1, SAHPI_ALL_SEVERITIES, FALSE, &announ); if (rc != SA_OK) { err("Couldn't get next annunciator"); err("Error %s",oh_lookup_error(rc)); return -1; } rc = saHpiAnnunciatorGetNext(sid, resid, 1, SAHPI_ALL_SEVERITIES, FALSE, &announ); if (rc == SA_OK) { err("Invalid number of announcements"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-3.6.1/plugins/simulator/t/sim_sanity_040.c0000644000175100017510000000425412575647265021054 0ustar mohanmohan/* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiEntryIdT newid; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } rc = saHpiIdrAreaAdd(sid, resid, 1, SAHPI_IDR_AREATYPE_PRODUCT_INFO, &newid); if (rc == SA_ERR_HPI_READ_ONLY) { return 0; } else if (rc != SA_OK) { err("Couldn't add new area"); err("Error %s",oh_lookup_error(rc)); return -1; } rc = saHpiIdrAreaDelete(sid, resid, 1, newid); if (rc != SA_OK) { err("Couldn't delete new area"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-3.6.1/plugins/simulator/t/sim_sanity_008.c0000644000175100017510000000434012575647265021054 0ustar mohanmohan/* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiBoolT enable; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } /* get sensor event enable */ rc = saHpiSensorEventEnableGet(sid, resid, 1, &enable); if (rc != SA_OK) { err("Couldn't get sensor event enable"); err("Error %s",oh_lookup_error(rc)); return -1; } /* set sensor event enable */ rc = saHpiSensorEventEnableSet(sid, resid, 1, enable); if (rc == SA_OK) { /* all our sensors are read-only so if we can change the sensor it is an error */ err("Error: able to write to a read-only sensor"); return -1; } return 0; } openhpi-3.6.1/plugins/simulator/t/sim_sanity_021.c0000644000175100017510000000615712575647265021057 0ustar mohanmohan/* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiAnnouncementT announ; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } /* add an announcement */ announ.EntryId = 0; // modified by oh_announcement_append announ.Timestamp = 0; // modified by oh_announcement_append announ.AddedByUser = FALSE; // modified by oh_announcement_append announ.Severity = SAHPI_CRITICAL; announ.Acknowledged = FALSE; announ.StatusCond.Type= SAHPI_STATUS_COND_TYPE_SENSOR; announ.StatusCond.Entity.Entry[0].EntityType = SAHPI_ENT_SYSTEM_BOARD; announ.StatusCond.Entity.Entry[0].EntityLocation = 1; announ.StatusCond.Entity.Entry[1].EntityType = SAHPI_ENT_ROOT; announ.StatusCond.Entity.Entry[1].EntityLocation = 0; announ.StatusCond.DomainId = 1; announ.StatusCond.ResourceId = 1; announ.StatusCond.SensorNum = 1; announ.StatusCond.EventState = SAHPI_ES_UNSPECIFIED; announ.StatusCond.Name.Length = 6; memcpy(&announ.StatusCond.Name.Value,"announ", 6); announ.StatusCond.Mid = 123; announ.StatusCond.Data.DataType = SAHPI_TL_TYPE_TEXT; announ.StatusCond.Data.Language = SAHPI_LANG_ENGLISH; announ.StatusCond.Data.DataLength = 6; memcpy(&announ.StatusCond.Data.Data,"announ", 6); rc = saHpiAnnunciatorAdd(sid, resid, 1, &announ); if (rc != SA_OK) { err("Couldn't add announcement"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-3.6.1/plugins/simulator/t/sim_sanity_043.c0000644000175100017510000000615412575647265021060 0ustar mohanmohan/* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiEntryIdT newid; SaHpiIdrFieldT field; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } rc = saHpiIdrAreaAdd(sid, resid, 1, SAHPI_IDR_AREATYPE_PRODUCT_INFO, &newid); if (rc == SA_ERR_HPI_READ_ONLY) { return 0; } else if (rc != SA_OK) { err("Couldn't add new area"); err("Error %s",oh_lookup_error(rc)); return -1; } field.AreaId = newid; field.Type = SAHPI_IDR_FIELDTYPE_PART_NUMBER; field.Field.DataType = SAHPI_TL_TYPE_TEXT; field.Field.Language = SAHPI_LANG_ENGLISH; field.Field.DataLength = 6; field.Field.Data[0] = '1'; field.Field.Data[1] = '2'; field.Field.Data[2] = '3'; field.Field.Data[3] = '4'; field.Field.Data[4] = '5'; field.Field.Data[5] = '6'; field.Field.Data[6] = '\0'; rc = saHpiIdrFieldAdd(sid, resid, 1, &field); if (rc != SA_OK) { err("Couldn't add field"); err("Error %s",oh_lookup_error(rc)); return -1; } field.Type = SAHPI_IDR_FIELDTYPE_CUSTOM; rc = saHpiIdrFieldSet(sid, resid, 1, &field); if (rc != SA_OK) { err("Couldn't set field"); err("Error %s",oh_lookup_error(rc)); return -1; } field.AreaId = 1; field.FieldId = 1; rc = saHpiIdrFieldAdd(sid, resid, 1, &field); if (rc == SA_OK) { err("Able to set field to a read only area"); return -1; } return 0; } openhpi-3.6.1/plugins/simulator/t/sim_sanity_020.c0000644000175100017510000000363212575647265021051 0ustar mohanmohan/* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } /* reset event log overflow */ rc = saHpiEventLogOverflowReset(sid, resid); if (rc != SA_OK) { err("Couldn't reset event log overflow"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-3.6.1/plugins/simulator/t/sim_sanity_019.c0000644000175100017510000000365012575647265021061 0ustar mohanmohan/* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiBoolT enable; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } /* get event log state */ rc = saHpiEventLogStateGet(sid, resid, &enable); if (rc != SA_OK) { err("Couldn't get event log state"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-3.6.1/plugins/simulator/t/sim_sanity_005.c0000644000175100017510000000436112575647265021054 0ustar mohanmohan/* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiSensorThresholdsT thresholds; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } /* get sensor thresholds */ rc = saHpiSensorThresholdsGet(sid, resid, 1, &thresholds); if (rc != SA_OK) { err("Couldn't get sensor thresholds"); err("Error %s",oh_lookup_error(rc)); return -1; } /* set sensor thresholds */ rc = saHpiSensorThresholdsSet(sid, resid, 1, &thresholds); if (rc == SA_OK) { /* all our sensors are read-only so if we can change the sensor it is an error */ err("Error: able to write to a read-only sensor"); return -1; } return 0; } openhpi-3.6.1/plugins/simulator/t/sim_sanity_013.c0000644000175100017510000000360312575647265021051 0ustar mohanmohan/* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiEventLogInfoT info; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } /* get log info */ rc = saHpiEventLogInfoGet(sid, resid, &info); if (rc != SA_OK) { err("Couldn't get event log info"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-3.6.1/plugins/simulator/t/sim_sanity_025.c0000644000175100017510000000367512575647265021065 0ustar mohanmohan/* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } rc = saHpiAnnunciatorAcknowledge(sid, resid, 1, SAHPI_ENTRY_UNSPECIFIED, SAHPI_MINOR); if (rc != SA_OK) { err("Couldn't ack annunciator"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-3.6.1/plugins/simulator/t/sim_sanity_031.c0000644000175100017510000000357412575647265021060 0ustar mohanmohan/* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } rc = saHpiResourceResetStateSet(sid, resid, SAHPI_COLD_RESET); if (rc != SA_OK) { err("Couldn't set reset state"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-3.6.1/plugins/simulator/t/sim_sanity_026.c0000644000175100017510000000362512575647265021061 0ustar mohanmohan/* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiAnnouncementT announ; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } rc = saHpiAnnunciatorGet(sid, resid, 1, 1, &announ); if (rc != SA_OK) { err("Couldn't get annunciator"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-3.6.1/plugins/simulator/t/sim_sanity_014.c0000644000175100017510000000451012575647265021050 0ustar mohanmohan/* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiEventT entry; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } /* initialize the new event log entry */ entry.Source = SAHPI_UNSPECIFIED_RESOURCE_ID; entry.EventType = SAHPI_ET_USER; entry.Timestamp = 0; entry.Severity = SAHPI_INFORMATIONAL; oh_init_textbuffer(&entry.EventDataUnion.UserEvent.UserEventData); oh_append_textbuffer(&entry.EventDataUnion.UserEvent.UserEventData, "My user data"); /* add event log entry */ rc = saHpiEventLogEntryAdd(sid, resid, &entry); if (rc != SA_OK) { err("Couldn't add event log entry"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-3.6.1/plugins/simulator/t/sim_sanity_030.c0000644000175100017510000000362312575647265021052 0ustar mohanmohan/* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiResetActionT reset; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } rc = saHpiResourceResetStateGet(sid, resid, &reset); if (rc != SA_OK) { err("Couldn't get reset state"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-3.6.1/plugins/simulator/t/Makefile.am0000644000175100017510000001632512575647265020204 0ustar mohanmohan# (C) Copyright IBM Corp 2005 # All rights reserved. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. MOSTLYCLEANFILES = @TEST_CLEAN@ uid_map EXTRA_DIST = openhpi.conf AM_CPPFLAGS = -DG_LOG_DOMAIN=\"t\" AM_CPPFLAGS += @OPENHPI_INCLUDES@ MAINTAINERCLEANFILES = Makefile.in TDEPLIB = $(top_builddir)/openhpid/libopenhpidaemon.la \ $(top_builddir)/utils/libopenhpiutils.la TESTS_ENVIRONMENT = OPENHPI_PATH=$(top_builddir)/plugins/simulator TESTS_ENVIRONMENT += OPENHPI_UID_MAP=$(top_builddir)/plugins/simulator/t/uid_map TESTS_ENVIRONMENT += OPENHPI_CONF=$(top_srcdir)/plugins/simulator/t/openhpi.conf TESTS_ENVIRONMENT += LD_LIBRARY_PATH=$(top_srcdir)/openhpid/.libs:$(top_srcdir)/ssl/.libs:$(top_srcdir)/utils/.libs TESTS = \ setup_conf \ sim_sanity_000 \ sim_sanity_001 \ sim_sanity_002 \ sim_sanity_003 \ sim_sanity_004 \ sim_sanity_005 \ sim_sanity_006 \ sim_sanity_007 \ sim_sanity_008 \ sim_sanity_009 \ sim_sanity_010 \ sim_sanity_011 \ sim_sanity_012 \ sim_sanity_013 \ sim_sanity_014 \ sim_sanity_015 \ sim_sanity_016 \ sim_sanity_017 \ sim_sanity_018 \ sim_sanity_019 \ sim_sanity_020 \ sim_sanity_021 \ sim_sanity_022 \ sim_sanity_023 \ sim_sanity_024 \ sim_sanity_025 \ sim_sanity_026 \ sim_sanity_027 \ sim_sanity_028 \ sim_sanity_029 \ sim_sanity_030 \ sim_sanity_031 \ sim_sanity_032 \ sim_sanity_033 \ sim_sanity_034 \ sim_sanity_035 \ sim_sanity_036 \ sim_sanity_037 \ sim_sanity_038 \ sim_sanity_039 \ sim_sanity_040 \ sim_sanity_041 \ sim_sanity_042 \ sim_sanity_043 \ sim_sanity_044 \ sim_sanity_045 check_PROGRAMS = $(TESTS) setup_conf_SOURCES = setup_conf.c sim_sanity_000_SOURCES = sim_sanity_000.c sim_sanity_000_LDADD = $(TDEPLIB) sim_sanity_000_LDFLAGS = -export-dynamic sim_sanity_001_SOURCES = sim_sanity_001.c sim_sanity_001_LDADD = $(TDEPLIB) sim_sanity_001_LDFLAGS = -export-dynamic sim_sanity_002_SOURCES = sim_sanity_002.c sim_sanity_002_LDADD = $(TDEPLIB) sim_sanity_002_LDFLAGS = -export-dynamic sim_sanity_003_SOURCES = sim_sanity_003.c sim_sanity_003_LDADD = $(TDEPLIB) sim_sanity_003_LDFLAGS = -export-dynamic sim_sanity_004_SOURCES = sim_sanity_004.c sim_sanity_004_LDADD = $(TDEPLIB) sim_sanity_004_LDFLAGS = -export-dynamic sim_sanity_005_SOURCES = sim_sanity_005.c sim_sanity_005_LDADD = $(TDEPLIB) sim_sanity_005_LDFLAGS = -export-dynamic sim_sanity_006_SOURCES = sim_sanity_006.c sim_sanity_006_LDADD = $(TDEPLIB) sim_sanity_006_LDFLAGS = -export-dynamic sim_sanity_007_SOURCES = sim_sanity_007.c sim_sanity_007_LDADD = $(TDEPLIB) sim_sanity_007_LDFLAGS = -export-dynamic sim_sanity_008_SOURCES = sim_sanity_008.c sim_sanity_008_LDADD = $(TDEPLIB) sim_sanity_008_LDFLAGS = -export-dynamic sim_sanity_009_SOURCES = sim_sanity_009.c sim_sanity_009_LDADD = $(TDEPLIB) sim_sanity_009_LDFLAGS = -export-dynamic sim_sanity_010_SOURCES = sim_sanity_010.c sim_sanity_010_LDADD = $(TDEPLIB) sim_sanity_010_LDFLAGS = -export-dynamic sim_sanity_011_SOURCES = sim_sanity_011.c sim_sanity_011_LDADD = $(TDEPLIB) sim_sanity_011_LDFLAGS = -export-dynamic sim_sanity_012_SOURCES = sim_sanity_012.c sim_sanity_012_LDADD = $(TDEPLIB) sim_sanity_012_LDFLAGS = -export-dynamic sim_sanity_013_SOURCES = sim_sanity_013.c sim_sanity_013_LDADD = $(TDEPLIB) sim_sanity_013_LDFLAGS = -export-dynamic sim_sanity_014_SOURCES = sim_sanity_014.c sim_sanity_014_LDADD = $(TDEPLIB) sim_sanity_014_LDFLAGS = -export-dynamic sim_sanity_015_SOURCES = sim_sanity_015.c sim_sanity_015_LDADD = $(TDEPLIB) sim_sanity_015_LDFLAGS = -export-dynamic sim_sanity_016_SOURCES = sim_sanity_016.c sim_sanity_016_LDADD = $(TDEPLIB) sim_sanity_016_LDFLAGS = -export-dynamic sim_sanity_017_SOURCES = sim_sanity_017.c sim_sanity_017_LDADD = $(TDEPLIB) sim_sanity_017_LDFLAGS = -export-dynamic sim_sanity_018_SOURCES = sim_sanity_018.c sim_sanity_018_LDADD = $(TDEPLIB) sim_sanity_018_LDFLAGS = -export-dynamic sim_sanity_019_SOURCES = sim_sanity_019.c sim_sanity_019_LDADD = $(TDEPLIB) sim_sanity_019_LDFLAGS = -export-dynamic sim_sanity_020_SOURCES = sim_sanity_020.c sim_sanity_020_LDADD = $(TDEPLIB) sim_sanity_020_LDFLAGS = -export-dynamic sim_sanity_021_SOURCES = sim_sanity_021.c sim_sanity_021_LDADD = $(TDEPLIB) sim_sanity_021_LDFLAGS = -export-dynamic sim_sanity_022_SOURCES = sim_sanity_022.c sim_sanity_022_LDADD = $(TDEPLIB) sim_sanity_022_LDFLAGS = -export-dynamic sim_sanity_023_SOURCES = sim_sanity_023.c sim_sanity_023_LDADD = $(TDEPLIB) sim_sanity_023_LDFLAGS = -export-dynamic sim_sanity_024_SOURCES = sim_sanity_024.c sim_sanity_024_LDADD = $(TDEPLIB) sim_sanity_024_LDFLAGS = -export-dynamic sim_sanity_025_SOURCES = sim_sanity_025.c sim_sanity_025_LDADD = $(TDEPLIB) sim_sanity_025_LDFLAGS = -export-dynamic sim_sanity_026_SOURCES = sim_sanity_026.c sim_sanity_026_LDADD = $(TDEPLIB) sim_sanity_026_LDFLAGS = -export-dynamic sim_sanity_027_SOURCES = sim_sanity_027.c sim_sanity_027_LDADD = $(TDEPLIB) sim_sanity_027_LDFLAGS = -export-dynamic sim_sanity_028_SOURCES = sim_sanity_028.c sim_sanity_028_LDADD = $(TDEPLIB) sim_sanity_028_LDFLAGS = -export-dynamic sim_sanity_029_SOURCES = sim_sanity_029.c sim_sanity_029_LDADD = $(TDEPLIB) sim_sanity_029_LDFLAGS = -export-dynamic sim_sanity_030_SOURCES = sim_sanity_030.c sim_sanity_030_LDADD = $(TDEPLIB) sim_sanity_030_LDFLAGS = -export-dynamic sim_sanity_031_SOURCES = sim_sanity_031.c sim_sanity_031_LDADD = $(TDEPLIB) sim_sanity_031_LDFLAGS = -export-dynamic sim_sanity_032_SOURCES = sim_sanity_032.c sim_sanity_032_LDADD = $(TDEPLIB) sim_sanity_032_LDFLAGS = -export-dynamic sim_sanity_033_SOURCES = sim_sanity_033.c sim_sanity_033_LDADD = $(TDEPLIB) sim_sanity_033_LDFLAGS = -export-dynamic sim_sanity_034_SOURCES = sim_sanity_034.c sim_sanity_034_LDADD = $(TDEPLIB) sim_sanity_034_LDFLAGS = -export-dynamic sim_sanity_035_SOURCES = sim_sanity_035.c sim_sanity_035_LDADD = $(TDEPLIB) sim_sanity_035_LDFLAGS = -export-dynamic sim_sanity_036_SOURCES = sim_sanity_036.c sim_sanity_036_LDADD = $(TDEPLIB) sim_sanity_036_LDFLAGS = -export-dynamic sim_sanity_037_SOURCES = sim_sanity_037.c sim_sanity_037_LDADD = $(TDEPLIB) sim_sanity_037_LDFLAGS = -export-dynamic sim_sanity_038_SOURCES = sim_sanity_038.c sim_sanity_038_LDADD = $(TDEPLIB) sim_sanity_038_LDFLAGS = -export-dynamic sim_sanity_039_SOURCES = sim_sanity_039.c sim_sanity_039_LDADD = $(TDEPLIB) sim_sanity_039_LDFLAGS = -export-dynamic sim_sanity_040_SOURCES = sim_sanity_040.c sim_sanity_040_LDADD = $(TDEPLIB) sim_sanity_040_LDFLAGS = -export-dynamic sim_sanity_041_SOURCES = sim_sanity_041.c sim_sanity_041_LDADD = $(TDEPLIB) sim_sanity_041_LDFLAGS = -export-dynamic sim_sanity_042_SOURCES = sim_sanity_042.c sim_sanity_042_LDADD = $(TDEPLIB) sim_sanity_042_LDFLAGS = -export-dynamic sim_sanity_043_SOURCES = sim_sanity_043.c sim_sanity_043_LDADD = $(TDEPLIB) sim_sanity_043_LDFLAGS = -export-dynamic sim_sanity_044_SOURCES = sim_sanity_044.c sim_sanity_044_LDADD = $(TDEPLIB) sim_sanity_044_LDFLAGS = -export-dynamic sim_sanity_045_SOURCES = sim_sanity_045.c sim_sanity_045_LDADD = $(TDEPLIB) sim_sanity_045_LDFLAGS = -export-dynamic openhpi-3.6.1/plugins/simulator/t/sim_sanity_007.c0000644000175100017510000000430412575647265021053 0ustar mohanmohan/* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiBoolT enable; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } /* get sensor enable */ rc = saHpiSensorEnableGet(sid, resid, 1, &enable); if (rc != SA_OK) { err("Couldn't get sensor enable"); err("Error %s",oh_lookup_error(rc)); return -1; } /* set sensor enable */ rc = saHpiSensorEnableSet(sid, resid, 1, enable); if (rc == SA_OK) { /* all our sensors are read-only so if we can change the sensor it is an error */ err("Error: able to write to a read-only sensor"); return -1; } return 0; } openhpi-3.6.1/plugins/simulator/t/sim_sanity_023.c0000644000175100017510000000363212575647265021054 0ustar mohanmohan/* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiAnnunciatorModeT mode; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } rc = saHpiAnnunciatorModeGet(sid, resid, 1, &mode); if (rc != SA_OK) { err("Couldn't get annunciator mode"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-3.6.1/plugins/simulator/t/sim_sanity_038.c0000644000175100017510000000440312575647265021057 0ustar mohanmohan/* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiIdrAreaHeaderT header; SaHpiEntryIdT next; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } rc = saHpiIdrAreaHeaderGet(sid, resid, 1, SAHPI_IDR_AREATYPE_CHASSIS_INFO, SAHPI_FIRST_ENTRY, &next, &header); if (rc != SA_OK) { err("Couldn't get first area header"); err("Error %s",oh_lookup_error(rc)); return -1; } rc = saHpiIdrAreaHeaderGet(sid, resid, 1, SAHPI_IDR_AREATYPE_CHASSIS_INFO, next, &next, &header); if (rc == SA_OK) { err("Invalid area header returned"); return -1; } return 0; } openhpi-3.6.1/plugins/simulator/t/sim_sanity_036.c0000644000175100017510000000355712575647265021066 0ustar mohanmohan/* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } rc = saHpiWatchdogTimerReset(sid, resid, 1); if (rc != SA_OK) { err("Couldn't reset watchdog timer"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-3.6.1/plugins/simulator/t/sim_sanity_032.c0000644000175100017510000000400012575647265021042 0ustar mohanmohan/* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntityTypeT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { oh_print_ep(&res.ResourceEntity, 0); if (srchid == res.ResourceEntity.Entry[0].EntityType && res.ResourceEntity.Entry[0].EntityLocation == 2) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiHsStateT state; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the hs drive */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_DISK_DRIVE); if (resid == 0) { err("Couldn't find the resource id of the hs drive"); return -1; } rc = saHpiHotSwapStateGet(sid, resid, &state); if (rc != SA_OK) { err("Couldn't get state"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-3.6.1/plugins/simulator/t/sim_sanity_003.c0000644000175100017510000000507612575647265021056 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; SaHpiEntryIdT rdrid; SaHpiRdrT rdr; SaErrorT rc = SA_OK; int rptctr = 0; int rdrctr; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if(rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if(rc != SA_OK) { err("Failed to run discover"); return -1; } /* loop over all resources, ensure that ResourceTag and * ManufacturerId have been set */ while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { /* verify we have a valid rptentry */ if(!res.ResourceTag.DataLength) { err("Resource Tag has zero length"); return -1; } if(!res.ResourceInfo.ManufacturerId) { err("Resource has no Manufacturer Id"); return -1; } /* just check for the first rdr */ rdrid = SAHPI_FIRST_ENTRY; rdrctr = 0; while (saHpiRdrGet(sid, res.ResourceId, rdrid, &rdrid, &rdr) == SA_OK) { if (rdr.RecordId == 0) { err("Invalid rdr entry found"); return -1; } rdrctr++; } // note that the hot swap resource has no rdrs if (rdrctr == 0 && res.ResourceEntity.Entry[0].EntityType != SAHPI_ENT_DISK_DRIVE_BAY) { err("No rdr entries found"); return -1; } err("%d rdrs found for resource %d", rdrctr, res.ResourceId); rptctr++; } if (rptctr == 0) { err("No rpt entries found"); return -1; } return 0; } openhpi-3.6.1/plugins/simulator/t/sim_sanity_029.c0000644000175100017510000000412112575647265021054 0ustar mohanmohan/* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } rc = saHpiResourcePowerStateSet(sid, resid, SAHPI_POWER_ON); if (rc != SA_OK) { err("Couldn't set power state to on"); err("Error %s",oh_lookup_error(rc)); return -1; } rc = saHpiResourcePowerStateSet(sid, resid, SAHPI_POWER_OFF); if (rc != SA_OK) { err("Couldn't set power state to off"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-3.6.1/plugins/simulator/t/sim_sanity_002.c0000644000175100017510000000237112575647265021050 0ustar mohanmohan/* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiRptEntryT res; SaHpiEntryIdT id = SAHPI_FIRST_ENTRY; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } rc = saHpiRptEntryGet(sid, id, &id, &res); if (rc != SA_OK) { err("Couldn't get the first rpt entry"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-3.6.1/plugins/simulator/t/sim_sanity_041.c0000644000175100017510000000373612575647265021061 0ustar mohanmohan/* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiIdrFieldT field; SaHpiEntryIdT next; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } rc = saHpiIdrFieldGet(sid, resid, 1, 1, SAHPI_IDR_FIELDTYPE_MANUFACTURER, SAHPI_FIRST_ENTRY, &next, &field); if (rc != SA_OK) { err("Couldn't get field"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-3.6.1/plugins/simulator/t/sim_sanity_018.c0000644000175100017510000000365412575647265021064 0ustar mohanmohan/* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiTimeT cur_time = 0; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } /* set event log time */ rc = saHpiEventLogTimeSet(sid, resid, cur_time); if (rc != SA_OK) { err("Couldn't set event log time"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-3.6.1/plugins/simulator/t/sim_sanity_015.c0000644000175100017510000000530012575647265021047 0ustar mohanmohan/* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiEventT entry; SaHpiEventLogEntryT logentry; SaHpiEventLogEntryIdT prev, next; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } /* initialize the new event log entry */ entry.Source = SAHPI_UNSPECIFIED_RESOURCE_ID; entry.EventType = SAHPI_ET_USER; entry.Timestamp = 0; entry.Severity = SAHPI_INFORMATIONAL; oh_init_textbuffer(&entry.EventDataUnion.UserEvent.UserEventData); oh_append_textbuffer(&entry.EventDataUnion.UserEvent.UserEventData, "My user data"); /* add event log entry */ rc = saHpiEventLogEntryAdd(sid, resid, &entry); if (rc != SA_OK) { err("Couldn't add event log entry"); err("Error %s",oh_lookup_error(rc)); return -1; } /* get event log entry */ rc = saHpiEventLogEntryGet(sid, resid, SAHPI_NEWEST_ENTRY, &prev, &next, &logentry, NULL, NULL); if (rc != SA_OK) { err("Couldn't get event log entry"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-3.6.1/plugins/simulator/t/sim_sanity_037.c0000644000175100017510000000360212575647265021056 0ustar mohanmohan/* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiIdrInfoT info; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } rc = saHpiIdrInfoGet(sid, resid, 1, &info); if (rc != SA_OK) { err("Couldn't get Idr info"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-3.6.1/plugins/simulator/t/sim_sanity_034.c0000644000175100017510000000361312575647265021055 0ustar mohanmohan/* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiWatchdogT wd; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } rc = saHpiWatchdogTimerGet(sid, resid, 1, &wd); if (rc != SA_OK) { err("Couldn't get watchdog timer"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-3.6.1/plugins/simulator/t/sim_sanity_033.c0000644000175100017510000000371212575647265021054 0ustar mohanmohan/* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntityTypeT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType && res.ResourceEntity.Entry[0].EntityLocation == 2) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the hs disk */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_DISK_DRIVE); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } rc = saHpiHotSwapActionRequest(sid, resid, SAHPI_HS_ACTION_EXTRACTION); if (rc != SA_OK) { err("Couldn't request action"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-3.6.1/plugins/simulator/t/sim_sanity_039.c0000644000175100017510000000374012575647265021063 0ustar mohanmohan/* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiEntryIdT newid; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } rc = saHpiIdrAreaAdd(sid, resid, 1, SAHPI_IDR_AREATYPE_PRODUCT_INFO, &newid); if (rc != SA_OK && rc != SA_ERR_HPI_READ_ONLY) { err("Couldn't add new area"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-3.6.1/plugins/simulator/t/sim_sanity_035.c0000644000175100017510000000411212575647265021051 0ustar mohanmohan/* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiWatchdogT wd; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } rc = saHpiWatchdogTimerGet(sid, resid, 1, &wd); if (rc != SA_OK) { err("Couldn't get watchdog timer"); err("Error %s",oh_lookup_error(rc)); return -1; } rc = saHpiWatchdogTimerSet(sid, resid, 1, &wd); if (rc != SA_OK) { err("Couldn't set watchdog timer"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-3.6.1/plugins/simulator/t/sim_sanity_010.c0000644000175100017510000000360312575647265021046 0ustar mohanmohan/* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiCtrlTypeT type; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } /* get control type */ rc = saHpiControlTypeGet(sid, resid, 1, &type); if (rc != SA_OK) { err("Couldn't get control type"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-3.6.1/plugins/simulator/t/sim_sanity_044.c0000644000175100017510000000611112575647265021052 0ustar mohanmohan/* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiEntryIdT newid; SaHpiIdrFieldT field; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } rc = saHpiIdrAreaAdd(sid, resid, 1, SAHPI_IDR_AREATYPE_PRODUCT_INFO, &newid); if (rc == SA_ERR_HPI_READ_ONLY) { return 0; } else if (rc != SA_OK) { err("Couldn't add new area"); err("Error %s",oh_lookup_error(rc)); return -1; } field.AreaId = newid; field.Type = SAHPI_IDR_FIELDTYPE_PART_NUMBER; field.Field.DataType = SAHPI_TL_TYPE_TEXT; field.Field.Language = SAHPI_LANG_ENGLISH; field.Field.DataLength = 6; field.Field.Data[0] = '1'; field.Field.Data[1] = '2'; field.Field.Data[2] = '3'; field.Field.Data[3] = '4'; field.Field.Data[4] = '5'; field.Field.Data[5] = '6'; field.Field.Data[6] = '\0'; rc = saHpiIdrFieldAdd(sid, resid, 1, &field); if (rc != SA_OK) { err("Couldn't add field"); err("Error %s",oh_lookup_error(rc)); return -1; } rc = saHpiIdrFieldDelete(sid, resid, 1, newid, field.FieldId); if (rc != SA_OK) { err("Couldn't delete field"); err("Error %s",oh_lookup_error(rc)); return -1; } field.AreaId = 1; field.FieldId = 1; rc = saHpiIdrFieldDelete(sid, resid, 1, 1, 1); if (rc == SA_OK) { err("Able to delete read only field"); return -1; } return 0; } openhpi-3.6.1/plugins/simulator/t/sim_sanity_012.c0000644000175100017510000000415712575647265021055 0ustar mohanmohan/* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiCtrlModeT mode; SaHpiCtrlStateT state; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } /* get control */ rc = saHpiControlGet(sid, resid, 1, &mode, &state); if (rc != SA_OK) { err("Couldn't get control type"); err("Error %s",oh_lookup_error(rc)); return -1; } /* set control */ rc = saHpiControlSet(sid, resid, 1, mode, &state); if (rc != SA_OK) { err("Couldn't set control"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-3.6.1/plugins/simulator/t/sim_sanity_042.c0000644000175100017510000000552712575647265021062 0ustar mohanmohan/* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiEntryIdT newid; SaHpiIdrFieldT field; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } rc = saHpiIdrAreaAdd(sid, resid, 1, SAHPI_IDR_AREATYPE_PRODUCT_INFO, &newid); if (rc == SA_ERR_HPI_READ_ONLY) { return 0; } else if (rc != SA_OK) { err("Couldn't add new area"); err("Error %s",oh_lookup_error(rc)); return -1; } field.AreaId = newid; field.Type = SAHPI_IDR_FIELDTYPE_PART_NUMBER; field.Field.DataType = SAHPI_TL_TYPE_TEXT; field.Field.Language = SAHPI_LANG_ENGLISH; field.Field.DataLength = 6; field.Field.Data[0] = '1'; field.Field.Data[1] = '2'; field.Field.Data[2] = '3'; field.Field.Data[3] = '4'; field.Field.Data[4] = '5'; field.Field.Data[5] = '6'; field.Field.Data[6] = '\0'; rc = saHpiIdrFieldAdd(sid, resid, 1, &field); if (rc != SA_OK) { err("Couldn't add field"); err("Error %s",oh_lookup_error(rc)); return -1; } field.AreaId = 1; rc = saHpiIdrFieldAdd(sid, resid, 1, &field); if (rc == SA_OK) { err("Able to add field to a read only area"); return -1; } return 0; } openhpi-3.6.1/plugins/simulator/t/sim_sanity_045.c0000644000175100017510000000354312575647265021061 0ustar mohanmohan/* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005-2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaErrorT rc = SA_OK; int event_ctr = 0; SaHpiEventLogEntryT ele; SaHpiRdrT rdr; SaHpiRptEntryT rpte; SaHpiEventLogEntryIdT eleid, neleid, peleid; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if(rc != SA_OK) return -1; rc = saHpiSubscribe(sid); if(rc != SA_OK) return -1; rc = saHpiDiscover(sid); if (rc != SA_OK) return -1; /* count discovery events */ eleid = neleid = SAHPI_OLDEST_ENTRY; while (rc == SA_OK && neleid != SAHPI_NO_MORE_ENTRIES) { rc = saHpiEventLogEntryGet(sid, SAHPI_UNSPECIFIED_RESOURCE_ID, eleid, &peleid, &neleid, &ele, &rdr, &rpte); if (ele.Event.EventType == SAHPI_ET_RESOURCE) event_ctr++; eleid = neleid; } if (rc != SA_OK) { printf("SaHpiEventLogEntryGet returned %d.\n", rc); return -1; } /* A FRU device does NOT generate an ADD event. So our Hot Swap Disk * Drive Bay resource will not generate an ADD event since it is marked * as a FRU. If you change this, this test will see an additional event. */ if (event_ctr != 4) { printf("Incorrect number of events returned. Found %d events.\n", event_ctr); return -1; } return 0; } openhpi-3.6.1/plugins/simulator/t/sim_sanity_016.c0000644000175100017510000000502712575647265021056 0ustar mohanmohan/* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiEventT entry; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } /* initialize the new event log entry */ entry.Source = SAHPI_UNSPECIFIED_RESOURCE_ID; entry.EventType = SAHPI_ET_USER; entry.Timestamp = 0; entry.Severity = SAHPI_INFORMATIONAL; oh_init_textbuffer(&entry.EventDataUnion.UserEvent.UserEventData); oh_append_textbuffer(&entry.EventDataUnion.UserEvent.UserEventData, "My user data"); /* add event log entry */ rc = saHpiEventLogEntryAdd(sid, resid, &entry); if (rc != SA_OK) { err("Couldn't add event log entry"); err("Error %s",oh_lookup_error(rc)); return -1; } /* clear event log */ rc = saHpiEventLogClear(sid, resid); if (rc != SA_OK) { err("Couldn't clear event log"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-3.6.1/plugins/simulator/t/sim_sanity_028.c0000644000175100017510000000363012575647265021057 0ustar mohanmohan/* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiPowerStateT pwrstate; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } rc = saHpiResourcePowerStateGet(sid, resid, &pwrstate); if (rc != SA_OK) { err("Couldn't get power state"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-3.6.1/plugins/simulator/t/sim_sanity_009.c0000644000175100017510000000451412575647265021060 0ustar mohanmohan/* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiEventStateT amask; SaHpiEventStateT dmask; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } /* get sensor event masks */ rc = saHpiSensorEventMasksGet(sid, resid, 1, &amask, &dmask); if (rc != SA_OK) { err("Couldn't get sensor event masks"); err("Error %s",oh_lookup_error(rc)); return -1; } /* set sensor event masks */ rc = saHpiSensorEventMasksSet(sid, resid, 1, SAHPI_SENS_ADD_EVENTS_TO_MASKS, amask, dmask); if (rc == SA_OK) { /* all our sensors are read-only so if we can change the sensor it is an error */ err("Error: able to write to a read-only sensor"); return -1; } return 0; } openhpi-3.6.1/plugins/simulator/t/sim_sanity_017.c0000644000175100017510000000365112575647265021060 0ustar mohanmohan/* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiTimeT cur_time; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } /* get event log time */ rc = saHpiEventLogTimeGet(sid, resid, &cur_time); if (rc != SA_OK) { err("Couldn't get event log time"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-3.6.1/plugins/simulator/t/sim_sanity_011.c0000644000175100017510000000362512575647265021053 0ustar mohanmohan/* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiCtrlModeT mode; SaHpiCtrlStateT state; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } /* get control */ rc = saHpiControlGet(sid, resid, 1, &mode, &state); if (rc != SA_OK) { err("Couldn't get control"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-3.6.1/plugins/simulator/t/setup_conf.c0000644000175100017510000000562312575647265020460 0ustar mohanmohan/* * Copyright (C) 2013, Hewlett-Packard Development Company, LLP * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Mohanasundaram Devarajulu (mohanasundaram.devarajulu@hp.com) * */ #include #include #include #include #include #include #include #include #include #include #include /** * openhpi.conf in this directory needs to have 600 or 400 permissions * SVN does not allow to remove read permissions, so set it up now **/ int main(int argc, char **argv) { struct stat fst; char filename[30] = "./openhpi.conf"; char modestr[] = "0600"; int mode = 0; mode = strtol(modestr, 0 ,8); if (stat (filename, &fst) == -1) { printf("stat of %s failed. Error is %s \n", filename, strerror(errno)); if (errno == ENOENT) { #ifdef OPENHPI_CONF if(stat (OPENHPI_CONF, &fst) == -1) { printf("stat of %s failed. Quitingi. \n", OPENHPI_CONF); if (errno == ENOENT) return 0; else return -1; } if (chmod(filename,mode) < 0) { printf("chmod (%s, %s) failed as %s\n", filename, modestr, strerror(errno)); return -1; } #endif return 0; } else return -1; } if (chmod(filename,mode) < 0) { printf("chmod (%s, %s) failed with %d(%s)\n", filename, modestr, errno, strerror(errno)); return -1; } return 0; } openhpi-3.6.1/plugins/simulator/t/sim_sanity_001.c0000644000175100017510000000161012575647265021042 0ustar mohanmohan/* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if(rc != SA_OK) return -1; rc = saHpiDiscover(sid); if (rc != SA_OK) return -1; return 0; } openhpi-3.6.1/plugins/simulator/sim_fumi_func.c0000644000175100017510000000160612575647265020670 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2008 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Suntrupth S Yadav */ #include SaErrorT sim_set_fumi_source(void *hnd, SaHpiResourceIdT rid, SaHpiFumiNumT fnum, SaHpiBankNumT bnum, SaHpiTextBufferT *sourceuri) { return SA_ERR_HPI_INVALID_CMD; } void* oh_set_fumi_source (void *, SaHpiResourceIdT,SaHpiFumiNumT, SaHpiBankNumT, SaHpiTextBufferT *) __attribute__ ((weak, alias("sim_set_fumi_source"))); openhpi-3.6.1/plugins/simulator/sim_init.h0000644000175100017510000000347712575647265017675 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Christina Hernandez * W. David Ashley */ #ifndef _SIM_INIT_H #define _SIM_INIT_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* handler state list */ extern GSList *sim_handler_states; void *sim_open(GHashTable *handler_config, unsigned int hid, oh_evt_queue *eventq); SaErrorT sim_discover(void *hnd); SaErrorT sim_get_event(void *hnd); SaErrorT sim_close(void *hnd); SaErrorT sim_set_resource_tag(void *hnd, SaHpiResourceIdT id, SaHpiTextBufferT *tag); SaErrorT sim_set_resource_severity(void *hnd, SaHpiResourceIdT rid, SaHpiSeverityT sev); SaErrorT sim_resource_failed_remove(void *hnd, SaHpiResourceIdT rid); #endif openhpi-3.6.1/plugins/simulator/sim_fumi_func.h0000644000175100017510000000132612575647265020674 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2008 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Suntrupth S Yadav */ #ifndef __SIM_FUMI_FUNC_H #define __SIM_FUMI_FUNC_H SaErrorT sim_set_fumi_source(void *hnd, SaHpiResourceIdT rid, SaHpiFumiNumT fnum, SaHpiBankNumT bnum, SaHpiTextBufferT *sourceuri); #endif openhpi-3.6.1/plugins/simulator/sim_watchdog.h0000644000175100017510000000375512575647265020531 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley * Renier Morales */ #ifndef __SIM_WATCHDOG_H #define __SIM_WATCHDOG_H struct simWatchdogInfo { SaHpiWatchdogT watchdog; }; struct sim_watchdog { SaHpiWatchdogRecT watchdogrec; SaHpiWatchdogT wd; const char *comment; }; SaErrorT sim_get_watchdog_info(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num, SaHpiWatchdogT *wdt); SaErrorT sim_set_watchdog_info(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num, SaHpiWatchdogT *wdt); SaErrorT sim_reset_watchdog(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num); extern struct sim_watchdog sim_chassis_watchdogs[]; extern struct sim_watchdog sim_cpu_watchdogs[]; extern struct sim_watchdog sim_dasd_watchdogs[]; extern struct sim_watchdog sim_hs_dasd_watchdogs[]; extern struct sim_watchdog sim_fan_watchdogs[]; SaErrorT sim_discover_chassis_watchdogs(struct oh_handler_state *state, struct oh_event *e); SaErrorT sim_discover_cpu_watchdogs(struct oh_handler_state *state, struct oh_event *e); SaErrorT sim_discover_dasd_watchdogs(struct oh_handler_state *state, struct oh_event *e); SaErrorT sim_discover_hs_dasd_watchdogs(struct oh_handler_state *state, struct oh_event *e); SaErrorT sim_discover_fan_watchdogs(struct oh_handler_state *state, struct oh_event *e); #endif openhpi-3.6.1/plugins/simulator/sim_init.c0000644000175100017510000002501112575647265017654 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Christina Hernandez * W. David Ashley * Renier Morales */ #include /* This list maintains a list of all handler state structs. It is used by to determine the name of a handler so that the pointer to the handler state can be returned to an injector API. */ GSList *sim_handler_states = NULL; void *sim_open(GHashTable *handler_config, unsigned int hid, oh_evt_queue *eventq) { struct oh_handler_state *state = NULL; char *tok = NULL; if (!handler_config) { err("GHashTable *handler_config is NULL!"); return NULL; } else if (!hid) { err("Bad handler id passed."); return NULL; } else if (!eventq) { err("No event queue was passed."); return NULL; } /* check for required hash table entries */ tok = g_hash_table_lookup(handler_config, "entity_root"); if (!tok) { err("entity_root is needed and not present in conf"); return NULL; } state = g_malloc0(sizeof(struct oh_handler_state)); if (!state) { err("out of memory"); return NULL; } /* initialize rpt hashtable pointer */ state->rptcache = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(state->rptcache); /* initialize the event log */ state->elcache = oh_el_create(256); if (!state->elcache) { err("Event log creation failed"); g_free(state->rptcache); g_free(state); return NULL; } /* save the handler config hash table, it holds */ /* the openhpi.conf file config info */ state->config = handler_config; /* Store reference to event queue */ state->eventq = eventq; /* Store id of this handler */ state->hid = hid; /* save the handler state to our list */ sim_handler_states = g_slist_append(sim_handler_states, state); return (void *)state; } SaErrorT sim_discover(void *hnd) { /* NOTE!!!!!!!!!!!!!!!!!!!!!!!!!!!! Since the simulator uses the full managed hot swap model and we do not have any latency issues, discovery only needs to be performed one time for each handler instance. Subsequent calls should just return SA_OK for that instance. */ struct oh_handler_state *inst = (struct oh_handler_state *)hnd; int i; struct oh_event *e = NULL; SaErrorT error = SA_OK; /* We use the inst->data variable to store the initial discovery state for an instance of the handler. */ if (inst->data) { return SA_OK; } /* --------------------------------------------------------------- The following assumes that the resource array is in a specific order. Changing this order means changing some of this code. ------------------------------------------------------------ */ /* discover chassis resources and RDRs */ i = SIM_RPT_ENTRY_CHASSIS - 1; error = sim_inject_resource(inst, &sim_rpt_array[i], NULL, &e); if (!error) { sim_discover_chassis_sensors(inst, e); sim_discover_chassis_controls(inst, e); sim_discover_chassis_annunciators(inst, e); sim_discover_chassis_watchdogs(inst, e); sim_discover_chassis_inventory(inst, e); sim_discover_chassis_dimis(inst,e); sim_discover_chassis_fumis(inst,e); sim_inject_event(inst, e); e = NULL; } else err("Error discovering chassis"); /* discover cpu resources and RDRs */ i = SIM_RPT_ENTRY_CPU - 1; error = sim_inject_resource(inst, &sim_rpt_array[i], NULL, &e); if (!error) { sim_discover_cpu_sensors(inst, e); sim_discover_cpu_controls(inst, e); sim_discover_cpu_annunciators(inst, e); sim_discover_cpu_watchdogs(inst, e); sim_discover_cpu_inventory(inst, e); sim_inject_event(inst, e); e = NULL; } else err("Error discovering CPU"); /* discover dasd resources and RDRs */ i = SIM_RPT_ENTRY_DASD - 1; error = sim_inject_resource(inst, &sim_rpt_array[i], NULL, &e); if (!error) { sim_discover_dasd_sensors(inst, e); sim_discover_dasd_controls(inst, e); sim_discover_dasd_annunciators(inst, e); sim_discover_dasd_watchdogs(inst, e); sim_discover_dasd_inventory(inst, e); sim_inject_event(inst, e); e = NULL; } else err("Error discovering DASD"); /* discover hot swap dasd resources and RDRs */ i = SIM_RPT_ENTRY_HS_DASD - 1; error = sim_inject_resource(inst, &sim_rpt_array[i], NULL, &e); if (!error) { sim_discover_hs_dasd_sensors(inst, e); sim_discover_hs_dasd_controls(inst, e); sim_discover_hs_dasd_annunciators(inst, e); sim_discover_hs_dasd_watchdogs(inst, e); sim_discover_hs_dasd_inventory(inst, e); sim_inject_event(inst, e); e = NULL; } else err("Error discovering HS DASD"); /* discover fan resources and RDRs */ i = SIM_RPT_ENTRY_FAN - 1; error = sim_inject_resource(inst, &sim_rpt_array[i], NULL, &e); if (!error) { sim_discover_fan_sensors(inst, e); sim_discover_fan_controls(inst, e); sim_discover_fan_annunciators(inst, e); sim_discover_fan_watchdogs(inst, e); sim_discover_fan_inventory(inst, e); sim_inject_event(inst, e); e = NULL; } else err("Error discovering FAN"); /* Let subsequent discovery invocations know that discovery has already been performed. */ inst->data = (void *)1; return SA_OK; } /* * Return values: * 1 - events to be processed. * SA_OK - No events to be processed. * SA_ERR_HPI_INVALID_PARAMS - @hnd is NULL. */ SaErrorT sim_get_event(void *hnd) { if (!hnd) return SA_ERR_HPI_INVALID_PARAMS; return SA_OK; } SaErrorT sim_close(void *hnd) { struct oh_handler_state *state = hnd; SaHpiEntryIdT rid; SaHpiRptEntryT *rpte; GSList *events = 0; rid = SAHPI_FIRST_ENTRY; while ((rpte = oh_get_resource_next(state->rptcache, rid)) != 0) { struct oh_event *e = g_new0(struct oh_event, 1); e->hid = state->hid; e->resource = *rpte; e->rdrs = 0; e->rdrs_to_remove = 0; e->event.Source = rpte->ResourceId; e->event.EventType = SAHPI_ET_RESOURCE; oh_gettimeofday(&e->event.Timestamp); e->event.Severity = SAHPI_MAJOR; e->event.EventDataUnion.ResourceEvent.ResourceEventType = SAHPI_RESE_RESOURCE_REMOVED; events = g_slist_prepend(events, e); rid = rpte->ResourceId; } GSList *iter = events; while (iter) { oh_evt_queue_push(state->eventq, iter->data ); iter = g_slist_next(iter); } g_slist_free(events); oh_el_close(state->elcache); oh_flush_rpt(state->rptcache); g_free(state->rptcache); g_free(state); return 0; } SaErrorT sim_set_resource_tag(void *hnd, SaHpiResourceIdT id, SaHpiTextBufferT *tag) { struct oh_handler_state *inst = hnd; SaHpiRptEntryT *resource = NULL; if (!tag) return SA_ERR_HPI_INVALID_PARAMS; resource = oh_get_resource_by_id(inst->rptcache, id); if (!resource) { return SA_ERR_HPI_NOT_PRESENT; } memcpy(&resource->ResourceTag, tag, sizeof(SaHpiTextBufferT)); return SA_OK; } SaErrorT sim_set_resource_severity(void *hnd, SaHpiResourceIdT rid, SaHpiSeverityT sev) { struct oh_handler_state *h = hnd; SaHpiRptEntryT *resource = NULL; resource = oh_get_resource_by_id(h->rptcache, rid); if (!resource) { return SA_ERR_HPI_NOT_PRESENT; } resource->ResourceSeverity = sev; return SA_OK; } SaErrorT sim_resource_failed_remove(void *hnd, SaHpiResourceIdT rid) { struct oh_handler_state *h; SaHpiRptEntryT *resource = NULL; struct oh_event e; SaHpiHsStateT hsstate = SAHPI_HS_STATE_ACTIVE; SaErrorT rv; if (hnd == NULL) { err("Invalid parameter"); return SA_ERR_HPI_INVALID_PARAMS; } h = (struct oh_handler_state *) hnd; resource = oh_get_resource_by_id(h->rptcache, rid); if (resource == NULL) { err("Failed to get the RPT entry"); return SA_ERR_HPI_NOT_PRESENT; } if (resource->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP) { rv = sim_get_hotswap_state(hnd, rid, &hsstate); if (rv != SA_OK) { err("Failed to get the hotswap state"); return rv; } } /* Raise the resource removal hotswap event */ memset(&e, 0, sizeof(struct oh_event)); e.hid = h->hid; e.resource = *resource; e.rdrs = NULL; e.event.Source = rid; e.event.Severity = resource->ResourceSeverity; oh_gettimeofday(&e.event.Timestamp); e.event.EventType = SAHPI_ET_HOTSWAP; e.event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = hsstate; e.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_NOT_PRESENT; e.event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_USER_UPDATE; oh_evt_queue_push(h->eventq, oh_dup_event(&e)); /* Remove the failed resource from plugin rptcache */ rv = oh_remove_resource(h->rptcache, rid); if (rv != SA_OK) { err("Resource removal from RPTable failed"); return rv; } return SA_OK; } /* * Simulator plugin interface * */ void * oh_open (GHashTable *, unsigned int, oh_evt_queue *) __attribute__ ((weak, alias("sim_open"))); void * oh_close (void *) __attribute__ ((weak, alias("sim_close"))); void * oh_get_event (void *) __attribute__ ((weak, alias("sim_get_event"))); void * oh_discover_resources (void *) __attribute__ ((weak, alias("sim_discover"))); void * oh_set_resource_tag (void *, SaHpiResourceIdT, SaHpiTextBufferT *) __attribute__ ((weak, alias("sim_set_resource_tag"))); void * oh_set_resource_severity (void *, SaHpiResourceIdT, SaHpiSeverityT) __attribute__ ((weak, alias("sim_set_resource_severity"))); void * oh_resource_failed_remove (void *, SaHpiResourceIdT) __attribute__ ((weak, alias("sim_resource_failed_remove"))); openhpi-3.6.1/plugins/simulator/sim_dimi.c0000644000175100017510000000460612575647265017642 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2008 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Suntrupth S Yadav */ #include #include static SaErrorT new_dimi(struct oh_handler_state *state, struct oh_event *e, struct sim_dimi *mydimi) { SaHpiRdrT *rdr = NULL; struct sim_dimi_info *info; SaErrorT error = SA_OK; rdr = (SaHpiRdrT *)g_malloc0(sizeof(SaHpiRdrT)); // Copy information from rdr array to res_rdr rdr->RdrType = SAHPI_DIMI_RDR; memcpy(&rdr->RdrTypeUnion.DimiRec, &mydimi->dimirec, sizeof(SaHpiDimiRecT)); oh_init_textbuffer(&rdr->IdString); oh_append_textbuffer(&rdr->IdString, mydimi->comment); rdr->RecordId = oh_get_rdr_uid(SAHPI_DIMI_RDR, rdr->RdrTypeUnion.DimiRec.DimiNum); // get the entity path rdr->Entity = e->resource.ResourceEntity; //set up our private data info = (struct sim_dimi_info *)g_malloc(sizeof(struct sim_dimi_info)); memcpy(&info->info, &mydimi->info, sizeof(SaHpiDimiInfoT)); memcpy(&info->test, &mydimi->test, sizeof(SaHpiDimiTestT)); /* everything ready so inject the rdr */ error = sim_inject_rdr(state, e, rdr, info); if (error) { g_free(rdr); g_free(info); } return error; } SaErrorT sim_discover_chassis_dimis(struct oh_handler_state *state, struct oh_event *e) { SaErrorT rc; int i = 0; int j = 0; while (sim_chassis_dimis[i].dimirec.DimiNum != 0) { rc = new_dimi(state, e, &sim_chassis_dimis[i]); if (rc) { err("Error %d returned when adding chassis dimi", rc); } else { j++; } i++; } dbg("%d of %d chassis dimis injected", j, i); return 0; } openhpi-3.6.1/plugins/simulator/sim_dimi_func.h0000644000175100017510000000123212575647265020652 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2007 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales */ #ifndef __SIM_DIMI_FUNC_H #define __SIM_DIMI_FUNC_H SaErrorT sim_get_dimi_info(void *hnd, SaHpiResourceIdT rid, SaHpiDimiNumT num, SaHpiDimiInfoT *info); #endif openhpi-3.6.1/plugins/simulator/sim_injector.c0000644000175100017510000002356612575647265020543 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley * Renier Morales * */ #include #include #include #include #include static SaErrorT sim_create_resourcetag(SaHpiTextBufferT *buffer, const char *str, SaHpiEntityLocationT loc) { char *locstr; SaErrorT err = SA_OK; SaHpiTextBufferT working; if (!buffer || loc < SIM_HPI_LOCATION_BASE || loc > (pow(10, OH_MAX_LOCATION_DIGITS) - 1)) { return(SA_ERR_HPI_INVALID_PARAMS); } err = oh_init_textbuffer(&working); if (err) { return(err); } locstr = (gchar *)g_malloc0(OH_MAX_LOCATION_DIGITS + 1); snprintf(locstr, OH_MAX_LOCATION_DIGITS + 1, " %d", loc); if (str) { oh_append_textbuffer(&working, str); } err = oh_append_textbuffer(&working, locstr); if (!err) { err = oh_copy_textbuffer(buffer, &working); } g_free(locstr); return(err); } /* return a handler state pointer by looking for its handler_name */ struct oh_handler_state *sim_get_handler_by_name(char *name) { struct oh_handler_state *state = NULL; int i = 0; char *handler_name; state = (struct oh_handler_state *)g_slist_nth_data(sim_handler_states, i); while (state != NULL) { handler_name = (char *)g_hash_table_lookup(state->config, "name"); if (strcmp(handler_name, name) == 0) { return state; } i++; state = (struct oh_handler_state *)g_slist_nth_data(sim_handler_states, i); } return NULL; } /* Sets entitypath based on entity_root, and assigns ResourceId */ static void setup_rpte(struct oh_handler_state *state, SaHpiRptEntryT *rpte) { SaHpiEntityPathT root_ep; char *entity_root = NULL; if (!state || !rpte) return; entity_root = (char *)g_hash_table_lookup(state->config,"entity_root"); oh_encode_entitypath (entity_root, &root_ep); /* set up the rpt entry */ oh_concat_ep(&rpte->ResourceEntity, &root_ep); rpte->ResourceId = oh_uid_from_entity_path(&rpte->ResourceEntity); } /* inject a resource */ // assumptions about the input SaHpiRptEntryT *data entry // - all fields are assumed to have valid values except // o EntryId (filled in by oh_add_resource function) // o ResourceId // o ResourceEntity (assumed to have only partial data) SaErrorT sim_inject_resource(struct oh_handler_state *state, struct sim_rpt *rpt_tmpl, void *data, struct oh_event **ohe) { struct oh_event *e = NULL; struct simResourceInfo *privinfo = NULL; SaErrorT rc = SA_OK; /* check arguments */ if (state == NULL || rpt_tmpl == NULL || ohe == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } /* set up the rpt entry */ e = g_malloc0(sizeof(struct oh_event)); e->resource = rpt_tmpl->rpt; setup_rpte(state, &e->resource); sim_create_resourcetag(&e->resource.ResourceTag, rpt_tmpl->comment, e->resource.ResourceEntity.Entry[0].EntityLocation); /* set up our private data store for resource state info */ if (!data) { privinfo = (struct simResourceInfo *)g_malloc0(sizeof(struct simResourceInfo)); if (e->resource.ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP) { privinfo->cur_hsstate = SAHPI_HS_STATE_ACTIVE; privinfo->cur_indicator_hsstate = SAHPI_HS_INDICATOR_ON; } if (e->resource.ResourceCapabilities & SAHPI_CAPABILITY_POWER) { privinfo->cur_powerstate = SAHPI_POWER_ON; } if (e->resource.ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP) { privinfo->ae_timeout = SAHPI_TIMEOUT_IMMEDIATE; } data = (void *)privinfo; } /* perform the injection */ dbg("Injecting ResourceId %d", e->resource.ResourceId); rc = oh_add_resource(state->rptcache, &e->resource, data, FREE_RPT_DATA); if (rc) { err("Error %s injecting ResourceId %d", oh_lookup_error(rc), e->resource.ResourceId); g_free(e); return rc; } /* now add an event for the resource add */ e->event.Source = e->resource.ResourceId; oh_gettimeofday(&e->event.Timestamp); e->event.Severity = e->resource.ResourceSeverity; if (e->resource.ResourceCapabilities & SAHPI_CAPABILITY_FRU) { e->event.EventType = SAHPI_ET_HOTSWAP; e->event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_ACTIVE; e->event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_ACTIVE; } else { e->event.EventType = SAHPI_ET_RESOURCE; e->event.EventDataUnion.ResourceEvent.ResourceEventType = SAHPI_RESE_RESOURCE_ADDED; } *ohe = e; return SA_OK; } /* inject an rdr */ // assumptions about the input SaHpiRdrT *data entry // - all fields are assumed to have valid values // - no checking of the data is performed // assuptions about the input *privdata entry // - no checking of the data is performed SaErrorT sim_inject_rdr(struct oh_handler_state *state, struct oh_event *ohe, SaHpiRdrT *rdr, void *data) { SaErrorT rc; SaHpiResourceIdT rid; /* check arguments */ if (state == NULL || ohe == NULL || rdr == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } rid = ohe->resource.ResourceId; /* perform the injection */ dbg("Injecting rdr for ResourceId %d", rid); rc = oh_add_rdr(state->rptcache, rid, rdr, data, 0); if (rc) { err("Error %s injecting rdr for ResourceId %d", oh_lookup_error(rc), rid); return rc; } /* now add rdr to event */ ohe->rdrs = g_slist_append(ohe->rdrs, (void *)rdr); return SA_OK; } /* inject an event */ // assumptions about the input oh_event *data entry // - all fields are assumed to have valid values // - no checking of the data is performed SaErrorT sim_inject_event(struct oh_handler_state *state, struct oh_event *ohe) { /* check arguments */ if (state == NULL || ohe == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } /* perform the injection */ dbg("Injecting event"); ohe->hid = state->hid; oh_evt_queue_push(state->eventq, ohe); return SA_OK; } SaErrorT sim_inject_ext_event(void *hnd, SaHpiEventT *event, SaHpiRptEntryT *rpte, SaHpiRdrT *rdre) { struct oh_handler_state *state = hnd; GSList *node = NULL; GSList *rdrs = NULL; struct oh_event e; /* * Nums assigned through this call start at 1000. * This assumes that no amount of RDRs within a * specific type defined elsewhere in this plugin will * be greater than 999. This, of course, is not an ideal * solution here, but it suffices for now. */ static unsigned int ctrl_num = 1000; static unsigned int sensor_num = 1000; static unsigned int inv_num = 1000; static unsigned int watchdog_num = 1000; static unsigned int ann_num = 1000; if (!hnd || !event || !rpte || !rdre) return SA_ERR_HPI_INVALID_PARAMS; dbg("Injecting external event"); memset(&e, 0, sizeof(struct oh_event)); if (rpte) { setup_rpte(state, rpte); event->Source = rpte->ResourceId; } else { event->Source = SAHPI_UNSPECIFIED_RESOURCE_ID; } rdrs = g_slist_append(rdrs, rdre); for (node = rdrs; node; node = node->next) { SaHpiRdrT *rdr = (SaHpiRdrT *)node->data; switch (rdr->RdrType) { case SAHPI_CTRL_RDR: rdr->RdrTypeUnion.CtrlRec.Num = ctrl_num++; rdr->RecordId = oh_get_rdr_uid(rdr->RdrType, rdr->RdrTypeUnion.CtrlRec.Num); break; case SAHPI_SENSOR_RDR: rdr->RdrTypeUnion.SensorRec.Num = sensor_num++; rdr->RecordId = oh_get_rdr_uid(rdr->RdrType, rdr->RdrTypeUnion.SensorRec.Num); break; case SAHPI_INVENTORY_RDR: rdr->RdrTypeUnion.InventoryRec.IdrId = inv_num++; rdr->RecordId = oh_get_rdr_uid(rdr->RdrType, rdr->RdrTypeUnion.InventoryRec.IdrId); break; case SAHPI_WATCHDOG_RDR: rdr->RdrTypeUnion.WatchdogRec.WatchdogNum = watchdog_num++; rdr->RecordId = oh_get_rdr_uid(rdr->RdrType, rdr->RdrTypeUnion.WatchdogRec.WatchdogNum); break; case SAHPI_ANNUNCIATOR_RDR: rdr->RdrTypeUnion.AnnunciatorRec.AnnunciatorNum = ann_num++; rdr->RecordId = oh_get_rdr_uid(rdr->RdrType, rdr->RdrTypeUnion.AnnunciatorRec.AnnunciatorNum); break; default: err("Invalid record type"); return SA_ERR_HPI_INVALID_PARAMS; } if (rpte) { rdr->Entity = rpte->ResourceEntity; } } e.event = *event; if (rpte) e.resource = *rpte; e.rdrs = rdrs; e.hid = state->hid; oh_evt_queue_push(state->eventq, oh_dup_event(&e)); return SA_OK; } void * oh_inject_event (void *, SaHpiEventT *, SaHpiRptEntryT *, SaHpiRdrT *) __attribute__ ((weak, alias("sim_inject_ext_event"))); openhpi-3.6.1/plugins/simulator/sim_annunciator_func.c0000644000175100017510000002652512575647265022260 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include SaErrorT sim_get_next_announce(void *hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT aid, SaHpiSeverityT sev, SaHpiBoolT unackonly, SaHpiAnnouncementT *announcement) { struct oh_handler_state *state = (struct oh_handler_state *)hnd; struct simAnnunciatorInfo *info; if (!hnd || !announcement || oh_lookup_severity(sev) == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } /* Check if resource exists and has annunciator capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(state->rptcache, rid); if (!rpt) { return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_ANNUNCIATOR)) { return(SA_ERR_HPI_CAPABILITY); } SaHpiRdrT *rdr = oh_get_rdr_by_type(state->rptcache, rid, SAHPI_ANNUNCIATOR_RDR, aid); if (rdr == NULL) return(SA_ERR_HPI_NOT_PRESENT); /* get our announcement info */ info = (struct simAnnunciatorInfo *)oh_get_rdr_data(state->rptcache, rid, rdr->RecordId); if (info == NULL) { err("No annunciator data."); return(SA_ERR_HPI_NOT_PRESENT); } /* perform function */ return oh_announcement_get_next(info->announs, sev, unackonly, announcement); } SaErrorT sim_get_announce(void *hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT aid, SaHpiEntryIdT entry, SaHpiAnnouncementT *announcement) { struct oh_handler_state *state = (struct oh_handler_state *)hnd; struct simAnnunciatorInfo *info; if (!hnd || !announcement) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } /* Check if resource exists and has annunciator capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(state->rptcache, rid); if (!rpt) { return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_ANNUNCIATOR)) { return(SA_ERR_HPI_CAPABILITY); } SaHpiRdrT *rdr = oh_get_rdr_by_type(state->rptcache, rid, SAHPI_ANNUNCIATOR_RDR, aid); if (rdr == NULL) return(SA_ERR_HPI_NOT_PRESENT); /* get our announcement info */ info = (struct simAnnunciatorInfo *)oh_get_rdr_data(state->rptcache, rid, rdr->RecordId); if (info == NULL) { err("No annunciator data."); return(SA_ERR_HPI_NOT_PRESENT); } /* perform function */ return oh_announcement_get(info->announs, entry, announcement); } SaErrorT sim_ack_announce(void *hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT aid, SaHpiEntryIdT entry, SaHpiSeverityT sev) { struct oh_handler_state *state = (struct oh_handler_state *)hnd; struct simAnnunciatorInfo *info; if (!hnd || oh_lookup_severity(sev) == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } /* Check if resource exists and has annunciator capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(state->rptcache, rid); if (!rpt) { return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_ANNUNCIATOR)) { return(SA_ERR_HPI_CAPABILITY); } SaHpiRdrT *rdr = oh_get_rdr_by_type(state->rptcache, rid, SAHPI_ANNUNCIATOR_RDR, aid); if (rdr == NULL) return(SA_ERR_HPI_NOT_PRESENT); /* get our announcement info */ info = (struct simAnnunciatorInfo *)oh_get_rdr_data(state->rptcache, rid, rdr->RecordId); if (info == NULL) { err("No annunciator data."); return(SA_ERR_HPI_NOT_PRESENT); } /* perform function */ return oh_announcement_ack(info->announs, entry, sev); } SaErrorT sim_add_announce(void *hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT aid, SaHpiAnnouncementT *announcement) { struct oh_handler_state *state = (struct oh_handler_state *)hnd; struct simAnnunciatorInfo *info; if (!hnd || !announcement) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } /* Check if resource exists and has annunciator capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(state->rptcache, rid); if (!rpt) { return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_ANNUNCIATOR)) { return(SA_ERR_HPI_CAPABILITY); } SaHpiRdrT *rdr = oh_get_rdr_by_type(state->rptcache, rid, SAHPI_ANNUNCIATOR_RDR, aid); if (rdr == NULL) return(SA_ERR_HPI_NOT_PRESENT); /* get our announcement info */ info = (struct simAnnunciatorInfo *)oh_get_rdr_data(state->rptcache, rid, rdr->RecordId); if (info == NULL) { err("No annunciator data."); return(SA_ERR_HPI_NOT_PRESENT); } /* perform function */ return oh_announcement_append(info->announs, announcement); } SaErrorT sim_del_announce(void *hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT aid, SaHpiEntryIdT entry, SaHpiSeverityT sev) { struct oh_handler_state *state = (struct oh_handler_state *)hnd; struct simAnnunciatorInfo *info; if (!hnd || oh_lookup_severity(sev) == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } /* Check if resource exists and has annunciator capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(state->rptcache, rid); if (!rpt) { return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_ANNUNCIATOR)) { return(SA_ERR_HPI_CAPABILITY); } SaHpiRdrT *rdr = oh_get_rdr_by_type(state->rptcache, rid, SAHPI_ANNUNCIATOR_RDR, aid); if (rdr == NULL) return(SA_ERR_HPI_NOT_PRESENT); /* get our announcement info */ info = (struct simAnnunciatorInfo *)oh_get_rdr_data(state->rptcache, rid, rdr->RecordId); if (info == NULL) { err("No annunciator data."); return(SA_ERR_HPI_NOT_PRESENT); } /* perform function */ return oh_announcement_del(info->announs, entry, sev); } SaErrorT sim_get_annunc_mode(void *hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT aid, SaHpiAnnunciatorModeT *mode) { struct oh_handler_state *state = (struct oh_handler_state *)hnd; struct simAnnunciatorInfo *info; if (!hnd || !mode) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } /* Check if resource exists and has annunciator capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(state->rptcache, rid); if (!rpt) { return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_ANNUNCIATOR)) { return(SA_ERR_HPI_CAPABILITY); } SaHpiRdrT *rdr = oh_get_rdr_by_type(state->rptcache, rid, SAHPI_ANNUNCIATOR_RDR, aid); if (rdr == NULL) return(SA_ERR_HPI_NOT_PRESENT); /* get our announcement info */ info = (struct simAnnunciatorInfo *)oh_get_rdr_data(state->rptcache, rid, rdr->RecordId); if (info == NULL) { err("No annunciator data."); return(SA_ERR_HPI_NOT_PRESENT); } *mode = info->mode; return(SA_OK); } SaErrorT sim_set_annunc_mode(void *hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT aid, SaHpiAnnunciatorModeT mode) { struct oh_handler_state *state = (struct oh_handler_state *)hnd; struct simAnnunciatorInfo *info; if (!hnd || oh_lookup_annunciatormode(mode) == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } /* Check if resource exists and has annunciator capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(state->rptcache, rid); if (!rpt) { return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_ANNUNCIATOR)) { return(SA_ERR_HPI_CAPABILITY); } SaHpiRdrT *rdr = oh_get_rdr_by_type(state->rptcache, rid, SAHPI_ANNUNCIATOR_RDR, aid); if (rdr == NULL) return(SA_ERR_HPI_NOT_PRESENT); /* get our announcement info */ info = (struct simAnnunciatorInfo *)oh_get_rdr_data(state->rptcache, rid, rdr->RecordId); if (info == NULL) { err("No annunciator data."); return(SA_ERR_HPI_NOT_PRESENT); } info->mode = mode; return SA_OK; } void * oh_get_next_announce (void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiSeverityT, SaHpiBoolT, SaHpiAnnouncementT) __attribute__ ((weak, alias("sim_get_next_announce"))); void * oh_get_announce (void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiEntryIdT, SaHpiAnnouncementT *) __attribute__ ((weak, alias("sim_get_announce"))); void * oh_ack_announce (void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiEntryIdT, SaHpiSeverityT) __attribute__ ((weak, alias("sim_ack_announce"))); void * oh_add_announce (void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiAnnouncementT *) __attribute__ ((weak, alias("sim_add_announce"))); void * oh_del_announce (void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiEntryIdT, SaHpiSeverityT) __attribute__ ((weak, alias("sim_del_announce"))); void * oh_get_annunc_mode (void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiAnnunciatorModeT *) __attribute__ ((weak, alias("sim_get_annunc_mode"))); void * oh_set_annunc_mode (void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiAnnunciatorModeT) __attribute__ ((weak, alias("sim_set_annunc_mode"))); openhpi-3.6.1/plugins/simulator/sim_power.h0000644000175100017510000000135112575647265020053 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef __SIM_POWER_H #define __SIM_POWER_H SaErrorT sim_get_power_state(void *hnd, SaHpiResourceIdT rid, SaHpiPowerStateT *state); SaErrorT sim_set_power_state(void *hnd, SaHpiResourceIdT rid, SaHpiPowerStateT state); #endif openhpi-3.6.1/plugins/simulator/sim_control_func.c0000644000175100017510000001275112575647265021413 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Christina Hernandez * W. David Ashley */ #include SaErrorT sim_get_control_state(void *hnd, SaHpiResourceIdT rid, SaHpiCtrlNumT cid, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state) { struct sim_control_info *info; if (!hnd) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } struct oh_handler_state *handle = (struct oh_handler_state *)hnd; /* Check if resource exists and has control capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_CONTROL)) { return(SA_ERR_HPI_CAPABILITY); } /* Find control and its mapping data - see if it accessable */ SaHpiRdrT *rdr = oh_get_rdr_by_type(handle->rptcache, rid, SAHPI_CTRL_RDR, cid); if (rdr == NULL) { return(SA_ERR_HPI_NOT_PRESENT); } info = (struct sim_control_info *)oh_get_rdr_data(handle->rptcache, rid, rdr->RecordId); if (info == NULL) { err("No control data. Control=%s", rdr->IdString.Data); return(SA_ERR_HPI_NOT_PRESENT); } if (rdr->RdrTypeUnion.CtrlRec.WriteOnly) { return(SA_ERR_HPI_INVALID_CMD); } if (!mode && !state) { return(SA_OK); } if (state) { if (rdr->RdrTypeUnion.CtrlRec.Type == SAHPI_CTRL_TYPE_TEXT) { if (state->StateUnion.Text.Line != SAHPI_TLN_ALL_LINES && state->StateUnion.Text.Line > rdr->RdrTypeUnion.CtrlRec.TypeUnion.Text.MaxLines) { return(SA_ERR_HPI_INVALID_DATA); } } } if (state) memcpy(state, &info->state, sizeof(SaHpiCtrlStateT)); if (mode) *mode = info->mode; return(SA_OK); } /** * sim_set_control_state: * @hnd: Handler data pointer. * @rid: Resource ID. * @cid: Control ID. * @mode: Control's operational mode to set. * @state: Pointer to control's state to set. * * Sets a control's operational mode and/or state. Both @mode and @state * may be NULL (e.g. check for presence). * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_CONTROL. * SA_ERR_HPI_INVALID_DATA - @state contains bad text control data. * SA_ERR_HPI_INVALID_RESOURCE - Resource doesn't exist. * SA_ERR_HPI_NOT_PRESENT - Control doesn't exist. **/ SaErrorT sim_set_control_state(void *hnd, SaHpiResourceIdT rid, SaHpiCtrlNumT cid, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state) { SaErrorT err; struct sim_control_info *info; struct oh_handler_state *handle = (struct oh_handler_state *)hnd; if (!hnd) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } /* Check if resource exists and has control capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_CONTROL)) { return(SA_ERR_HPI_CAPABILITY); } /* Find control and its mapping data - see if it accessable */ SaHpiRdrT *rdr = oh_get_rdr_by_type(handle->rptcache, rid, SAHPI_CTRL_RDR, cid); if (rdr == NULL) { return(SA_ERR_HPI_NOT_PRESENT); } info = (struct sim_control_info *)oh_get_rdr_data(handle->rptcache, rid, rdr->RecordId); if (info == NULL) { err("No control data. Control=%s", rdr->IdString.Data); return(SA_ERR_HPI_NOT_PRESENT); } /* Validate static control state and mode data */ err = oh_valid_ctrl_state_mode(&(rdr->RdrTypeUnion.CtrlRec), mode, state); if (err) { return(err); } /* Write control state */ if (mode != SAHPI_CTRL_MODE_AUTO && state) { info->state = *state; } /* Write control mode, if changed */ if (mode != info->mode) { info->mode = mode; } return(SA_OK); } /* * Simulator plugin interface * */ void * oh_get_control_state (void *, SaHpiResourceIdT, SaHpiCtrlNumT, SaHpiCtrlModeT *, SaHpiCtrlStateT *) __attribute__ ((weak, alias("sim_get_control_state"))); void * oh_set_control_state (void *, SaHpiResourceIdT,SaHpiCtrlNumT, SaHpiCtrlModeT, SaHpiCtrlStateT *) __attribute__ ((weak, alias("sim_set_control_state"))); openhpi-3.6.1/plugins/simulator/sim_hotswap.c0000644000175100017510000003045512575647265020406 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include /*---------------------------------------------------------------------- Note: we use the full HS model for the simulator. ----------------------------------------------------------------------*/ SaErrorT sim_get_hotswap_state(void *hnd, SaHpiResourceIdT rid, SaHpiHsStateT *hsstate) { struct simResourceInfo *privinfo; if (!hnd || !hsstate) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } struct oh_handler_state *state = (struct oh_handler_state *)hnd; /* Check if resource exists and has managed hotswap capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(state->rptcache, rid); if (!rpt) { return SA_ERR_HPI_INVALID_RESOURCE; } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP)) { err("No hs capability"); return SA_ERR_HPI_CAPABILITY; } /* get our private state data */ privinfo = (struct simResourceInfo *)oh_get_resource_data(state->rptcache, rid); if (privinfo == NULL) { err("No resource data. ResourceId=%d", rid); return SA_ERR_HPI_INVALID_RESOURCE; } /* It is possible that this API can return the NOT_PRESENT state in violation of the spec. See the note attached to the sim_set_hotswap_state() API to understand why this can happen. */ *hsstate = privinfo->cur_hsstate; return SA_OK; } /* Note: When the hot swap state goes to NOT_PRESENT we really should remove the RPT entry and all its associated RDRs. However, if we do then the simulator has no way of knowing when the resource becomes active again. If this was real hardware we could query it on rediscovery to find out if it has returned or not but since we are virtual we have no way of figuring this out. So, the simulator does NOT remove RPT entries in this case. */ SaErrorT sim_set_hotswap_state(void *hnd, SaHpiResourceIdT rid, SaHpiHsStateT hsstate) { struct simResourceInfo *privinfo; if (!hnd) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } if (NULL == oh_lookup_hsstate(hsstate)) { err("Invalid hotswap state."); return SA_ERR_HPI_INVALID_REQUEST; } struct oh_handler_state *state = (struct oh_handler_state *)hnd; /* Check if resource exists and has managed hotswap capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(state->rptcache, rid); if (!rpt) { return SA_ERR_HPI_INVALID_RESOURCE; } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP)) { return SA_ERR_HPI_CAPABILITY; } /* get our private state data */ privinfo = (struct simResourceInfo *)oh_get_resource_data(state->rptcache, rid); if (privinfo == NULL) { err("No resource data. ResourceId=%d", rid); return SA_ERR_HPI_INVALID_RESOURCE; } /* check that the state transition is correct */ switch (privinfo->cur_hsstate) { case SAHPI_HS_STATE_INACTIVE: if (hsstate == SAHPI_HS_STATE_NOT_PRESENT) { privinfo->cur_hsstate = hsstate; return SA_OK; } if (hsstate == SAHPI_HS_STATE_INSERTION_PENDING) { privinfo->cur_hsstate = hsstate; return SA_OK; } break; case SAHPI_HS_STATE_INSERTION_PENDING: if (hsstate == SAHPI_HS_STATE_NOT_PRESENT) { privinfo->cur_hsstate = hsstate; return SA_OK; } if (hsstate == SAHPI_HS_STATE_INACTIVE) { privinfo->cur_hsstate = hsstate; return SA_OK; } if (hsstate == SAHPI_HS_STATE_ACTIVE) { privinfo->cur_hsstate = hsstate; return SA_OK; } break; case SAHPI_HS_STATE_ACTIVE: if (hsstate == SAHPI_HS_STATE_NOT_PRESENT) { privinfo->cur_hsstate = hsstate; return SA_OK; } if (hsstate == SAHPI_HS_STATE_EXTRACTION_PENDING) { privinfo->cur_hsstate = hsstate; return SA_OK; } break; case SAHPI_HS_STATE_EXTRACTION_PENDING: if (hsstate == SAHPI_HS_STATE_NOT_PRESENT) { privinfo->cur_hsstate = hsstate; return SA_OK; } if (hsstate == SAHPI_HS_STATE_ACTIVE) { privinfo->cur_hsstate = hsstate; return SA_OK; } if (hsstate == SAHPI_HS_STATE_INACTIVE) { privinfo->cur_hsstate = hsstate; return SA_OK; } break; case SAHPI_HS_STATE_NOT_PRESENT: if (hsstate == SAHPI_HS_STATE_INSERTION_PENDING) { privinfo->cur_hsstate = hsstate; return SA_OK; } break; default: break; } return SA_ERR_HPI_INVALID_REQUEST; } SaErrorT sim_request_hotswap_action(void *hnd, SaHpiResourceIdT rid, SaHpiHsActionT act) { struct simResourceInfo *privinfo; if (!hnd) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } if (NULL == oh_lookup_hsaction(act)) { err("Invalid hotswap action."); return SA_ERR_HPI_INVALID_REQUEST; } struct oh_handler_state *state = (struct oh_handler_state *)hnd; /* Check if resource exists and has managed hotswap capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(state->rptcache, rid); if (!rpt) { return SA_ERR_HPI_INVALID_RESOURCE; } /* if not simplified HS then return an error */ if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_FRU)) { return SA_ERR_HPI_CAPABILITY; } /* get our private state data */ privinfo = (struct simResourceInfo *)oh_get_resource_data(state->rptcache, rid); if (privinfo == NULL) { err("No resource data. ResourceId=%d", rid); return SA_ERR_HPI_INVALID_RESOURCE; } /* check that the action corresponds to a valid state */ if (act == SAHPI_HS_ACTION_INSERTION && privinfo ->cur_hsstate == SAHPI_HS_STATE_INACTIVE) { privinfo->cur_hsstate = SAHPI_HS_STATE_INSERTION_PENDING; return SA_OK; } if (act == SAHPI_HS_ACTION_EXTRACTION && privinfo ->cur_hsstate == SAHPI_HS_STATE_ACTIVE) { privinfo->cur_hsstate = SAHPI_HS_STATE_EXTRACTION_PENDING; return SA_OK; } return SA_ERR_HPI_INVALID_REQUEST; } SaErrorT sim_get_indicator_state(void *hnd, SaHpiResourceIdT rid, SaHpiHsIndicatorStateT *ind_state) { struct simResourceInfo *privinfo; if (!hnd || !ind_state) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } struct oh_handler_state *state = (struct oh_handler_state *)hnd; /* Check if resource exists and has managed hotswap capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(state->rptcache, rid); if (!rpt) { return SA_ERR_HPI_INVALID_RESOURCE; } /* if not simplified HS then return an error */ if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_FRU)) { return SA_ERR_HPI_CAPABILITY; } /* get our private state data */ privinfo = (struct simResourceInfo *)oh_get_resource_data(state->rptcache, rid); if (privinfo == NULL) { err("No resource data. ResourceId=%d", rid); return SA_ERR_HPI_INVALID_RESOURCE; } *ind_state = privinfo->cur_indicator_hsstate; return SA_OK; } SaErrorT sim_set_indicator_state(void *hnd, SaHpiResourceIdT rid, SaHpiHsIndicatorStateT ind_state) { struct simResourceInfo *privinfo; if (!hnd) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } if (NULL == oh_lookup_hsindicatorstate(ind_state)) { err("Invalid hotswap indicator state."); return(SA_ERR_HPI_INVALID_REQUEST); } struct oh_handler_state *state = (struct oh_handler_state *)hnd; /* Check if resource exists and has managed hotswap capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(state->rptcache, rid); if (!rpt) { return SA_ERR_HPI_INVALID_RESOURCE; } /* if not simplified HS then return an error */ if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_FRU)) { return SA_ERR_HPI_CAPABILITY; } /* get our private state data */ privinfo = (struct simResourceInfo *)oh_get_resource_data(state->rptcache, rid); if (privinfo == NULL) { err("No resource data. ResourceId=%d", rid); return SA_ERR_HPI_INVALID_RESOURCE; } privinfo->cur_indicator_hsstate = ind_state; return SA_OK; } SaErrorT sim_get_autoextract_timeout(void *hnd, SaHpiResourceIdT rid, SaHpiTimeoutT *timeout) { struct simResourceInfo *privinfo; if (!hnd) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } struct oh_handler_state *state = (struct oh_handler_state *)hnd; /* Check if resource exists and has managed hotswap capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(state->rptcache, rid); if (!rpt) { return SA_ERR_HPI_INVALID_RESOURCE; } /* if not simplified HS then return an error */ if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP)) { return SA_ERR_HPI_CAPABILITY; } /* get our private state data */ privinfo = (struct simResourceInfo *)oh_get_resource_data(state->rptcache, rid); if (privinfo == NULL) { err("No resource data. ResourceId=%d", rid); return SA_ERR_HPI_INVALID_RESOURCE; } *timeout = privinfo->ae_timeout; return SA_OK; } SaErrorT sim_set_autoextract_timeout(void *hnd, SaHpiResourceIdT rid, SaHpiTimeoutT timeout) { struct simResourceInfo *privinfo; if (!hnd) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } struct oh_handler_state *state = (struct oh_handler_state *)hnd; /* Check if resource exists and has managed hotswap capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(state->rptcache, rid); if (!rpt) { return SA_ERR_HPI_INVALID_RESOURCE; } /* if not simplified HS then return an error */ if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP)) { return SA_ERR_HPI_CAPABILITY; } if (rpt->HotSwapCapabilities & SAHPI_HS_CAPABILITY_AUTOEXTRACT_READ_ONLY) { return SA_ERR_HPI_READ_ONLY; } /* get our private state data */ privinfo = (struct simResourceInfo *)oh_get_resource_data(state->rptcache, rid); if (privinfo == NULL) { err("No resource data. ResourceId=%d", rid); return SA_ERR_HPI_INVALID_RESOURCE; } privinfo->ae_timeout = timeout; return SA_OK; } void * oh_get_hotswap_state (void *, SaHpiResourceIdT, SaHpiHsStateT *) __attribute__ ((weak, alias("sim_get_hotswap_state"))); void * oh_set_hotswap_state (void *, SaHpiResourceIdT, SaHpiHsStateT) __attribute__ ((weak, alias("sim_set_hotswap_state"))); void * oh_request_hotswap_action (void *, SaHpiResourceIdT, SaHpiHsActionT) __attribute__ ((weak, alias("sim_request_hotswap_action"))); void * oh_set_indicator_state (void *, SaHpiResourceIdT, SaHpiHsIndicatorStateT) __attribute__ ((weak, alias("sim_set_indicator_state"))); void * oh_get_indicator_state (void *, SaHpiResourceIdT, SaHpiHsIndicatorStateT) __attribute__ ((weak, alias("sim_get_indicator_state"))); void * oh_get_autoextract_timeout (void *, SaHpiResourceIdT, SaHpiTimeoutT *) __attribute__ ((weak, alias("sim_get_autoextract_timeout"))); void * oh_set_autoextract_timeout (void *, SaHpiResourceIdT, SaHpiTimeoutT) __attribute__ ((weak, alias("sim_set_autoextract_timeout"))); openhpi-3.6.1/plugins/simulator/sim_controls.h0000755000175100017510000000334012575647265020565 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Christina Hernandez * W. David Ashley * Renier Morales */ #ifndef __SIM_CONTROLS_H #define __SIM_CONTROLS_H /******************* Control Definitions *********************/ struct sim_control_info { SaHpiCtrlModeT mode; SaHpiCtrlStateT state; }; struct sim_control { int index; SaHpiCtrlRecT control; SaHpiCtrlModeT mode; const char *comment; }; extern struct sim_control sim_chassis_controls[]; extern struct sim_control sim_cpu_controls[]; extern struct sim_control sim_dasd_controls[]; extern struct sim_control sim_hs_dasd_controls[]; extern struct sim_control sim_fan_controls[]; SaErrorT sim_discover_chassis_controls(struct oh_handler_state *state, struct oh_event *e); SaErrorT sim_discover_cpu_controls(struct oh_handler_state *state, struct oh_event *e); SaErrorT sim_discover_dasd_controls(struct oh_handler_state *state, struct oh_event *e); SaErrorT sim_discover_hs_dasd_controls(struct oh_handler_state *state, struct oh_event *e); SaErrorT sim_discover_fan_controls(struct oh_handler_state *state, struct oh_event *e); #endif openhpi-3.6.1/plugins/simulator/sim_dimi.h0000644000175100017510000000164712575647265017651 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2008 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Suntrupth S Yadav */ #ifndef __SIM_DIMI_H #define __SIM_DIMI_H struct sim_dimi_info { SaHpiDimiInfoT info; SaHpiDimiTestT test; }; struct sim_dimi { SaHpiDimiRecT dimirec; SaHpiDimiInfoT info; SaHpiDimiTestT test; const char *comment; }; extern struct sim_dimi sim_chassis_dimis[]; SaErrorT sim_discover_chassis_dimis(struct oh_handler_state *state, struct oh_event *e); #endif openhpi-3.6.1/plugins/simulator/sim_fumi.c0000644000175100017510000000460512575647265017657 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2008 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Suntrupth S Yadav */ #include #include static SaErrorT new_fumi(struct oh_handler_state *state, struct oh_event *e, struct sim_fumi *myfumi) { SaHpiRdrT *rdr = NULL; struct sim_fumi_info *info; SaErrorT error = SA_OK; rdr = (SaHpiRdrT *)g_malloc0(sizeof(SaHpiRdrT)); // Copy information from rdr array to res_rdr rdr->RdrType = SAHPI_FUMI_RDR; memcpy(&rdr->RdrTypeUnion.FumiRec, &myfumi->fumirec, sizeof(SaHpiFumiRecT)); oh_init_textbuffer(&rdr->IdString); oh_append_textbuffer(&rdr->IdString, myfumi->comment); rdr->RecordId = oh_get_rdr_uid(SAHPI_FUMI_RDR, rdr->RdrTypeUnion.FumiRec.Num); // get the entity path rdr->Entity = e->resource.ResourceEntity; //set up our private data info = (struct sim_fumi_info *)g_malloc(sizeof(struct sim_fumi_info)); memcpy(&info->srcinfo, &myfumi->srcinfo, sizeof(SaHpiFumiSourceInfoT)); memcpy(&info->info, &myfumi->info, sizeof(SaHpiFumiBankInfoT)); /* everything ready so inject the rdr */ error = sim_inject_rdr(state, e, rdr, info); if (error) { g_free(rdr); g_free(info); } return error; } SaErrorT sim_discover_chassis_fumis(struct oh_handler_state *state, struct oh_event *e) { SaErrorT rc; int i = 0; int j = 0; while (sim_chassis_fumis[i].fumirec.Num != 0) { rc = new_fumi(state, e, &sim_chassis_fumis[i]); if (rc) { err("Error %d returned when adding chassis fumi", rc); } else { j++; } i++; } dbg("%d of %d chassis fumis injected", j, i); return 0; } openhpi-3.6.1/README0000644000175100017510000002135412575650126013051 0ustar mohanmohanThis is an implementation of the Service Availability Forum's Hardware Platform Interface B.03 specification. The following components are supported: * OpenHPI base library * OpenHPI utility functions * OpenHPI Daemon * HPI Client programs and HPI shell * Simulator Plugin * Dynamic Simulator Plugin * Slave Plugin * Test Agent Plugin * IMPI Direct Plugin * SNMP BladeCenter/RSA Plugin * iLO2 RIBCL Plugin * SOAP/XML BladeSystem c-Class Plugin * rtas Plugin * sysfs Plugin * watchdog Plugin NOTE: The ipmi plugin is still provided with this release, but will not be maintained any longer. Please use ipmidirect instead. Feedback, as always, is welcome and encouraged: openhpi-devel@lists.sourceforge.net --------------------------------------------------------- PREREQUISITES --------------------------------------------------------- The following software is required to build openhpi autoconf >= 2.57 automake >= 1.8 gcc >= 3.2.0 glib2 >= 2.12 gcrypt >= 1.4 pkgconfig (may be called pkg-config depending on distro) The follow libraries are needed to build certain plugins sysfs plugin libsysfs =< 1.3 snmp_bc plugin net-snmp >= 5.07 libuuid (may be found in e2fsprogs or libuuid depending on distro) oa_soap plugin libssl >= 0.9.7 libxml2 ipmi plugin OpenIPMI >= 1.4.20 (http://openipmi.sf.net) --------------------------------------------------------- RPM BUILD NOTE --------------------------------------------------------- The library libuuid.so can be provided with e2fsprogs RPM or with libuuid RPM. And the header file uuid.h can be provided with e2fsprogs-devel RPM or with libuuid-devel RPM correspondingly. The default RPM spec for openhpi is configured for the first case libuuid/libuuid-devel. If your distribution falls into the second case just change uuid_provider in openhpi.spec.in before running ./configure script. --------------------------------------------------------- BUILD / INSTALLATION --------------------------------------------------------- FOR RELEASED TARBALLS Use standard UNIX mechanisms: ./configure && make && make install Note: by default all plugins that *can* be built, will be built, all other plugins will be silently disabled. If you wish to disable a plugin, any flags you pass to configure will be passed to the configure program. ("./configure --help" for more info on the options) i.e. ./configure --disable-simulator will disable the simulator plugin Note that for a production-type installation you will want to pass the following options at the least: ./configure --prefix=/usr --sysconfdir=/etc --with-varpath=/var/lib/openhpi then make (or make rpm, but you will need to be root on some distros.) and then (as root or with proper system install permissions) make install (or install from the rpm). It will install the openhpi library, enabled plug-ins and sample applications that uses the library and plug-ins. NOTE: Modify the configuration file, openhpi.conf, for your needs. This will be in ${sysconfdir}/openhpi/openhpi.conf, where $sysconfdir is ${prefix}/etc by default (and ${prefix} is /usr/local by default) unless you set $sysconfdir when you ran ./configure as shown above. FOR SUBVERSION EXTRACTS svn export https://svn.code.sf.net/p/openhpi/code/openhpi/trunk mydir It will extract OpenHPI trunk to mydir. First time after extracting the code: run ./bootstrap This will generate the configure script and all files needed by it. Then, use the instructions provided for RELEASED TARBALLS --------------------------------------------------------- CLEANUP --------------------------------------------------------- To remove the temporary build files, type: make clean If you are a maintainer, and need to remove all autogenerated files, type: make clean make maintainer-clean (will neeed to run bootstrap and configure again after that) If bootstrap is not present (tarball does not contain it), download it using svn export http://svn.code.sf.net/p/openhpi/code/openhpi/tags/$rtag/bootstrap . ($rtag is release version, for example 3.6.0) --------------------------------------------------------- Active Plug-ins --------------------------------------------------------- simulator - plugin for simple testing. It uses a static database for hardware configuration. dynamic_simulator - plugin for advanced testing. It uses a configuration file to simulate any hardware. slave - allows to aggregate resources from different domains (slave domains) and to provide aggregated resources as part of the one domain (master domain). test_agent - plugin for advanced testing. Provides console for runtime configuration. ipmidirect - IPMI plugin that directly uses ipmi protocol to ipmi infrastructure, e.g. chassis managers. snmp_bc - IBM BladeCenter/RSA plugin (uses snmp) ilo2_ribcl - HP ProLiant Rack Mount Server plug-in oa_soap - HP BladeSystem c-Class plugin rtas - Run-Time Abstraction Services (RTAS) plug-in sysfs - Linux sysfs plugin (LM sensors and I2C devices exported in sysfs requires kernel 2.6 or >= 2.5.72) watchdog - Linux watchdog device interface For information on recent changes, see the changelogs at http://openhpi.org http://openhpi.sf.net --------------------------------------------------------- CLIENT PROGRAMS --------------------------------------------------------- Openhpi provides a set of client programs, that can be use as examples for typical HPI usage. They also help testing when invoked from a command line, or could even be called by applications. The hpi_shell provides are command shell for calling HPI functions interactively. The following client programs are provided: hpialarms - show Alarm Control management instruments. hpicrypt - Encrypt or decrypt a file. Back up the file to a secure location before encrypting the file. hpidomain - show information about domains or set the domain tag. hpiel - displays HPI event log entries hpievents - polls for events hpifan - show Fan Control management instruments hpigensimdata - generate data file for dynamic simulator plugin hpiinv - show inventory records for hardware resources hpionIBMblade - display and manage resources of an IBM Blade with Basedboard Management Controller (BMC) hpipower - Invoke HPI Power Management APIs hpireset - Invoke HPI Reset Management APIs hpisensor - display sensor info for all resources with Sensor Capability hpisettime - Invoke Event Log clock APIs. hpithres - display sensor thresholds and sensor info. hpitop - display highlevel topology for a managed openHPI complex. hpitree - show in details the resources (rpt's) and resources' management instruments (rdr's) data structures hpiwdt - read and enables the watchdog timer. hpixml - display system view in XML ohdomainlist - show information about domains on the level of the openhpi base library ohhandler - uses the openhpi additional interfaces to control openhpi configuration. That is plugins can be loaded, plugin instances (handlers) created, unloaded or their configuration displayed. ohparam - control openhpi configuration parameters hpi_shell - allows a user to interactively perform a number of HPI operations in a command shell with prompting. --------------------------------------------------------- HPI EXTENSIONS --------------------------------------------------------- OpenHPI provides a small set of functions in addition to the SAF standard. Mainly they are needed because of the OpenHPI architecture: - manage plugins - manage OpenHPI configuration dynamically * oHpiVersionGet * oHpiHandlerCreate * oHpiHandlerDestroy * oHpiHandlerInfo * oHpiHandlerGetNext * oHpiHandlerFind * oHpiHandlerRetry * oHpiGlobalParamGet * oHpiGlobalParamSet * oHpiInjectEvent * oHpiDomainAdd * oHpiDomainAddById * oHpiDomainEntryGet * oHpiDomainEntryGetByDomainId Please find more information in the inline documentation in files: include/oHpi.h - function declarations baselib/ohpi.c - function implementation in Base Library openhpid/ohpi.c - function implementation in OpenHPI Daemon --------------------------------------------------------- FOR MORE INFO --------------------------------------------------------- Please refer also to README.daemon and README.windows. Please find more documentation in the docs subdirectory and in the man pages (openhpi, openhpid, clients). For more information please see the project webiste at: http://openhpi.org http://openhpi.sourceforge.net Also visit SAForum's website at http://www.saforum.org openhpi-3.6.1/README.python0000644000175100017510000000006112575647265014373 0ustar mohanmohanSee baselibs/README and baselibs/python/README. openhpi-3.6.1/transport/0000755000175100017510000000000012605014576014215 5ustar mohanmohanopenhpi-3.6.1/transport/strmsock.cpp0000644000175100017510000003364312575647300016602 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * (C) Copyright Pigeon Point Systems. 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley * Anton Pak * */ #include #include #include #include #ifdef _WIN32 #include #include #include #else #include #include #include #include #include #include #include #endif #include #include #include "strmsock.h" /*************************************************************** * Initialization/Finalization **************************************************************/ static void Initialize( void )__attribute__ ((constructor)); static void Initialize( void ) { #ifdef _WIN32 WSADATA wsa_data; WSAStartup( MAKEWORD( 2, 2), &wsa_data ); #endif } static void Finalize( void )__attribute__ ((destructor)); static void Finalize( void ) { #ifdef _WIN32 WSACleanup(); #endif } /*************************************************************** * Helper functions **************************************************************/ static uint32_t DecodeUint32( const uint8_t * bytes, int byte_order ) { uint32_t x; memcpy( &x, bytes, sizeof( x ) ); return ( byte_order == G_BYTE_ORDER ) ? x : GUINT32_SWAP_LE_BE( x ); } static void EncodeUint32( uint8_t * bytes, uint32_t x, int byte_order ) { uint32_t x2 = ( byte_order == G_BYTE_ORDER ) ? x : GUINT32_SWAP_LE_BE( x ); memcpy( bytes, &x2, sizeof( x ) ); } static void SelectAddresses( int ipvflags, int hintflags, const char * node, uint16_t port, std::list& selected ) { struct addrinfo hints; memset( &hints, 0, sizeof(hints) ); hints.ai_flags = hintflags; hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; char service[32]; snprintf( service, sizeof(service), "%u", port ); struct addrinfo * items; int cc = getaddrinfo( node, service, &hints, &items ); if ( cc != 0 ) { CRIT( "getaddrinfo failed." ); return; } for ( struct addrinfo * item = items; item != 0; ) { struct addrinfo * next = item->ai_next; item->ai_next = 0; if ( ( ipvflags & FlagIPv4 ) && ( item->ai_family == AF_INET ) ) { selected.push_back( item ); } else if ( ( ipvflags & FlagIPv6 ) && ( item->ai_family == AF_INET6 ) ) { selected.push_back( item ); } else { freeaddrinfo( item ); } item = next; } } /*************************************************************** * Base Stream Socket class **************************************************************/ cStreamSock::cStreamSock( SockFdT sockfd ) : m_sockfd( sockfd ) { // empty } cStreamSock::~cStreamSock() { Close(); } bool cStreamSock::GetPeerAddress( SockAddrStorageT& storage ) const { SockAddrLenT len = sizeof(storage); int cc = getpeername( m_sockfd, reinterpret_cast( &storage ), &len ); return ( cc == 0 ); } bool cStreamSock::Close() { if ( m_sockfd == InvalidSockFd ) { return true; } int cc; #ifdef _WIN32 cc = shutdown( m_sockfd, SD_BOTH ); cc = closesocket( m_sockfd ); #else cc = shutdown( m_sockfd, SHUT_RDWR ); cc = close( m_sockfd ); #endif if ( cc != 0 ) { CRIT( "cannot close stream socket." ); return false; } m_sockfd = InvalidSockFd; return true; } bool cStreamSock::ReadMsg( uint8_t& type, uint32_t& id, void * payload, uint32_t& payload_len, int& payload_byte_order ) { // Windows recv() takes char * so we need the workaround below. union { MessageHeader hdr; char rawhdr[sizeof(MessageHeader)]; }; char * dst = rawhdr; size_t got = 0; size_t need = dMhSize; while ( got < need ) { ssize_t len = recv( m_sockfd, dst + got, need - got, 0 ); if ( len < 0 ) { CRIT( "error while reading message in thread %p.", g_thread_self() ); return false; } else if ( len == 0 ) { //CRIT( "peer closed connection." ); return false; } got += len; if ( ( got == need ) && ( dst == rawhdr ) ) { // we got header uint8_t ver = hdr[dMhOffFlags] >> 4; if ( ver != dMhRpcVersion ) { CRIT( "unsupported version 0x%x != 0x%x.", ver, dMhRpcVersion ); return false; } type = hdr[dMhOffType]; payload_byte_order = ( ( hdr[dMhOffFlags] & dMhEndianBit ) != 0 ) ? G_LITTLE_ENDIAN : G_BIG_ENDIAN; id = DecodeUint32( &hdr[dMhOffId], payload_byte_order ); payload_len = DecodeUint32( &hdr[dMhOffLen], payload_byte_order ); // now prepare to get payload dst = reinterpret_cast(payload); got = 0; need = payload_len; } } payload_len = got; /* printf( "Transport: got message of %u bytes in buffer %p:\n", sizeof(MessageHeader) + got, payload ); for ( size_t i = 0; i < dMhSize; ++i ) { union { char c; unsigned char uc; }; c = rawhdr[i]; printf( "%02x ", uc ); } for ( size_t i = 0; i < got; ++i ) { union { char c; unsigned char uc; }; c = (reinterpret_cast(payload))[i]; printf( "%02x ", uc ); } printf( "\n" ); */ return true; } bool cStreamSock::WriteMsg( uint8_t type, uint32_t id, const void * payload, uint32_t payload_len ) { if ( ( payload_len > 0 ) && ( payload == 0 ) ) { return false; } if ( payload_len > dMaxPayloadLength ) { CRIT("message payload too large."); return false; } // Windows send() takes char * so we need the workaround below. union { MessageHeader hdr; char msg[dMaxMessageLength]; }; hdr[dMhOffType] = type; hdr[dMhOffFlags] = dMhRpcVersion << 4; if ( G_BYTE_ORDER == G_LITTLE_ENDIAN ) { hdr[dMhOffFlags] |= dMhEndianBit; } hdr[dMhOffReserved1] = 0; hdr[dMhOffReserved2] = 0; EncodeUint32( &hdr[dMhOffId], id, G_BYTE_ORDER ); EncodeUint32( &hdr[dMhOffLen], payload_len, G_BYTE_ORDER ); if ( payload ) { memcpy( &msg[dMhSize], payload, payload_len ); } size_t msg_len = dMhSize + payload_len; /* printf("Transport: sending message of %d bytes:\n", msg_len ); for ( size_t i = 0; i < msg_len; ++i ) { union { char c; unsigned char uc; }; c = msg[i]; printf( "%02x ", uc ); } printf( "\n" ); */ ssize_t cc = send( m_sockfd, &msg[0], msg_len, 0 ); if ( cc != (ssize_t)msg_len ) { CRIT( "error while sending message." ); return false; } return true; } cStreamSock::eWaitCc cStreamSock::Wait() { fd_set fds; struct timeval tv; FD_ZERO( &fds ); FD_SET( m_sockfd, &fds ); tv.tv_sec = 5; // TODO tv.tv_usec = 0; #ifdef _WIN32 int cc = select( 0, &fds, 0, 0, &tv ); #else int cc = select( m_sockfd + 1, &fds, 0, 0, &tv ); #endif if ( cc == 0 ) { // timeout return eWaitTimeout; } else if ( cc != 1 ) { // CRIT( "select failed" ); return eWaitError; } else if ( FD_ISSET( m_sockfd, &fds ) == 0 ) { CRIT( "unexpected select behaviour" ); return eWaitError; } return eWaitSuccess; } bool cStreamSock::CreateAttempt( const struct addrinfo * info, bool last_attempt ) { bool rc = Close(); if ( !rc ) { return false; } SockFdT new_sock; new_sock = socket( info->ai_family, info->ai_socktype, info->ai_protocol ); if ( new_sock == InvalidSockFd ) { if ( last_attempt ) { #ifdef _WIN32 bool noaif = ( WSAGetLastError() == WSAEAFNOSUPPORT ); #else bool noaif = ( errno == EAFNOSUPPORT ); #endif if ( noaif ) { const char * aif; switch ( info->ai_family ) { case AF_INET: aif = "IPv4"; break; case AF_INET6: aif = "IPv6"; break; default: aif = ""; } CRIT( "cannot create %s stream socket, address family is not supported on this platform", aif ); } else { CRIT( "cannot create stream socket." ); } } return false; } m_sockfd = new_sock; return true; } /*************************************************************** * Client Stream Socket class **************************************************************/ cClientStreamSock::cClientStreamSock() : cStreamSock() { // empty } cClientStreamSock::~cClientStreamSock() { // empty } bool cClientStreamSock::Create( const char * host, uint16_t port ) { bool connected = false; struct addrinfo * info; std::list infos; SelectAddresses( FlagIPv4 | FlagIPv6, 0, host, port, infos ); while ( !infos.empty() ) { info = *infos.begin(); if ( !connected ) { connected = CreateAttempt( info, infos.size() == 1 ); } freeaddrinfo( info ); infos.pop_front(); } return connected; } bool cClientStreamSock::EnableKeepAliveProbes( int keepalive_time, int keepalive_intvl, int keepalive_probes ) { #ifdef __linux__ int rc; int val; val = 1; rc = setsockopt( SockFd(), SOL_SOCKET, SO_KEEPALIVE, &val, sizeof(val) ); if ( rc != 0 ) { CRIT( "failed to set SO_KEEPALIVE option." ); return false; } val = keepalive_time; rc = setsockopt( SockFd(), SOL_TCP, TCP_KEEPIDLE, &val, sizeof(val) ); if ( rc != 0 ) { CRIT( "failed to set TCP_KEEPIDLE option." ); return false; } val = keepalive_intvl; rc = setsockopt( SockFd(), SOL_TCP, TCP_KEEPINTVL, &val, sizeof(val) ); if ( rc != 0 ) { CRIT( "failed to set TCP_KEEPINTVL option." ); return false; } val = keepalive_probes; rc = setsockopt( SockFd(), SOL_TCP, TCP_KEEPCNT, &val, sizeof(val) ); if ( rc != 0 ) { CRIT( "failed to set TCP_KEEPCNT option." ); return false; } return true; #else WARN( "TCP Keep-Alive Probes are not supported." ); return false; #endif /* __linux__ */ } bool cClientStreamSock::CreateAttempt( const struct addrinfo * info, bool last_attempt ) { bool rc = cStreamSock::CreateAttempt( info, last_attempt ); if ( !rc ) { return false; } int cc = connect( SockFd(), info->ai_addr, info->ai_addrlen ); if ( cc != 0 ) { Close(); if ( last_attempt ) { CRIT( "connect failed." ); } return false; } return true; } /*************************************************************** * Server Stream Socket class **************************************************************/ cServerStreamSock::cServerStreamSock() : cStreamSock() { // empty } cServerStreamSock::~cServerStreamSock() { // empty } bool cServerStreamSock::Create( int ipvflags, const char * bindaddr, uint16_t port ) { bool bound = false; struct addrinfo * info; std::list infos; SelectAddresses( ipvflags, AI_PASSIVE, bindaddr, port, infos ); while ( !infos.empty() ) { info = *infos.begin(); if ( !bound ) { bound = CreateAttempt( info, infos.size() == 1 ); } freeaddrinfo( info ); infos.pop_front(); } return bound; } bool cServerStreamSock::CreateAttempt( const struct addrinfo * info, bool last_attempt ) { bool rc = cStreamSock::CreateAttempt( info, last_attempt ); if ( !rc ) { return false; } int cc; int val = 1; #ifdef _WIN32 cc = setsockopt( SockFd(), SOL_SOCKET, SO_REUSEADDR, (const char *)&val, sizeof(val) ); #else cc = setsockopt( SockFd(), SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val) ); #endif if ( cc != 0 ) { Close(); if ( last_attempt ) { CRIT( "failed to set SO_REUSEADDR option." ); } return false; } cc = bind( SockFd(), info->ai_addr, info->ai_addrlen ); if ( cc != 0 ) { Close(); if ( last_attempt ) { CRIT( "bind failed." ); } return false; } cc = listen( SockFd(), 5 /* TODO */ ); if ( cc != 0 ) { Close(); if ( last_attempt ) { CRIT( "listen failed." ); } return false; } return true; } cStreamSock * cServerStreamSock::Accept() { SockFdT sock = accept( SockFd(), 0, 0 ); if ( sock == InvalidSockFd ) { CRIT( "accept failed." ); return 0; } return new cStreamSock( sock ); } openhpi-3.6.1/transport/Makefile.am0000644000175100017510000000164612575647300016263 0ustar mohanmohan# # Copyright (c) 2004 by FORCE Computers. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # # Authors: # Thomas Kanngieser # .NOTPARALLEL: MAINTAINERCLEANFILES = Makefile.in *~ EXTRA_DIST = Makefile.mingw32 version.rc AM_CPPFLAGS = -DG_LOG_DOMAIN=\"transport\" AM_CPPFLAGS += @OPENHPI_INCLUDES@ # just to clear LIBS LIBS = # marshal and connection used by the daemon and client library lib_LTLIBRARIES = libopenhpitransport.la libopenhpitransport_la_SOURCES = \ strmsock.cpp \ strmsock.h libopenhpitransport_la_LDFLAGS= -version-info @HPI_LIB_VERSION@ clean-local: rm -f *~ core core.* openhpi-3.6.1/transport/strmsock.h0000644000175100017510000001163312575647300016242 0ustar mohanmohan/* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * (C) Copyright Pigeon Point Systems. 2010 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley * Anton Pak * */ #ifndef STRMSOCK_H_INCLUDED #define STRMSOCK_H_INCLUDED #include #include #ifdef _WIN32 #include #include #else #include #include #include #include #endif /*************************************************************** * IPv4 / IPv6 **************************************************************/ typedef enum { FlagIPv4 = 1, FlagIPv6 = 2 } IPvFlags; /*************************************************************** * Message Header **************************************************************/ const size_t dMhSize = 12; typedef uint8_t MessageHeader[dMhSize]; const size_t dMhOffType = 0; const size_t dMhOffFlags = 1; const size_t dMhOffReserved1 = 2; const size_t dMhOffReserved2 = 3; const size_t dMhOffId = 4; const size_t dMhOffLen = 8; const uint8_t eMhMsg = 1; const uint8_t eMhError = 2; // message flags // bits 0-3 : flags, bit 4-7 : OpenHPI RPC version // if endian bit is set the byte order is Little Endian const uint8_t dMhEndianBit = 1; const uint8_t dMhRpcVersion = 1; const size_t dMaxMessageLength = 0xFFFF; const size_t dMaxPayloadLength = dMaxMessageLength - sizeof(MessageHeader); /*************************************************************** * Base Stream Socket class **************************************************************/ class cStreamSock { public: #ifdef _WIN32 typedef SOCKADDR_STORAGE SockAddrStorageT; typedef int SockAddrLenT; typedef SOCKET SockFdT; static const SockFdT InvalidSockFd = INVALID_SOCKET; #else typedef sockaddr_storage SockAddrStorageT; typedef socklen_t SockAddrLenT; typedef int SockFdT; static const SockFdT InvalidSockFd = -1; #endif explicit cStreamSock( SockFdT sockfd = InvalidSockFd ); virtual ~cStreamSock(); bool Close(); bool GetPeerAddress( SockAddrStorageT& storage ) const; bool ReadMsg( uint8_t& type, uint32_t& id, void * payload, uint32_t& payload_len, int& payload_byte_order ); bool WriteMsg( uint8_t type, uint32_t id, const void * payload, uint32_t payload_len ); enum eWaitCc { eWaitSuccess, eWaitTimeout, eWaitError, }; eWaitCc Wait(); protected: SockFdT SockFd() const { return m_sockfd; } bool CreateAttempt( const struct addrinfo * ainfo, bool last_attempt ); private: cStreamSock( const cStreamSock& ); cStreamSock& operator =( const cStreamSock& ); private: SockFdT m_sockfd; }; /*************************************************************** * Client Stream Socket class **************************************************************/ class cClientStreamSock : public cStreamSock { public: explicit cClientStreamSock(); ~cClientStreamSock(); bool Create( const char * host, uint16_t port ); /*********************** * TCP Keep-Alive * * keepalive_time - interval(sec) between the last data packet sent and * the first keepalive probe * keepalive_intvl - interval(sec) between subsequential keepalive probes * keepalive_probes - number of unacknowledged probes to send before * considering the connection dead **********************/ bool EnableKeepAliveProbes( int keepalive_time, int keepalive_intvl, int keepalive_probes ); private: cClientStreamSock( const cClientStreamSock& ); cClientStreamSock& operator =( const cClientStreamSock& ); bool CreateAttempt( const struct addrinfo * ainfo, bool last_attempt ); }; /*************************************************************** * Server Stream Socket class **************************************************************/ class cServerStreamSock : public cStreamSock { public: explicit cServerStreamSock(); ~cServerStreamSock(); bool Create( int ipvflags, const char * bindaddr, uint16_t port ); cStreamSock * Accept(); private: cServerStreamSock( const cServerStreamSock& ); cServerStreamSock& operator =( const cServerStreamSock& ); bool CreateAttempt( const struct addrinfo * ainfo, bool last_attempt ); }; #endif // STRMSOCK_H_INCLUDED__ openhpi-3.6.1/transport/Makefile.mingw320000644000175100017510000000075312575647300017152 0ustar mohanmohaninclude ../Makefile.mingw32.def TARGET := libopenhpitransport.dll SRC := strmsock.cpp version.rc OBJ := $(patsubst %.rc, %.o, $(patsubst %.cpp, %.o, ${SRC})) DEFS := -DG_LOG_DOMAIN=\"transport\" INCLUDES := ${GLIB_INCLUDES} -I ../mingw32 -I ../include LIBS := ${GLIB_LIBS} -lws2_32 CPPFLAGS += ${DEFS} ${INCLUDES} .PHONY: all clean .SUFFIXES: .rc all : ${TARGET} ${TARGET} : ${OBJ} ${CXX} -shared -o $@ $^ ${LIBS} .rc.o: ${RC} ${RCFLAGS} $< $@ clean: rm -f ${OBJ} ${TARGET} openhpi-3.6.1/transport/version.rc0000644000175100017510000000164312575647300016237 0ustar mohanmohan#include LANGUAGE 0x09,0x01 // English(US) VS_VERSION_INFO VERSIONINFO FILEVERSION BINARY_VERSION PRODUCTVERSION BINARY_VERSION FILEFLAGSMASK 0 FILEFLAGS 0 FILEOS VOS_NT_WINDOWS32 FILETYPE VFT_DLL FILESUBTYPE VFT2_UNKNOWN BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904E4" // English(US), Multilingual BEGIN VALUE "Comments", "" VALUE "CompanyName", "OpenHPI Community (http://openhpi.org/)" VALUE "FileDescription", "OpenHPI Transport Library" VALUE "FileVersion", VERSION VALUE "InternalName", "libopenhpitransport" VALUE "LegalCopyright", "OpenHPI is distributed under BSD license" VALUE "OriginalFilename", "libopenhpitransport.dll" VALUE "ProductName", "OpenHPI" VALUE "ProductVersion", VERSION END END END openhpi-3.6.1/Makefile.mingw32.def0000644000175100017510000000213212575647300015644 0ustar mohanmohan############################################################################ ARCH := x86 #ARCH := amd64 VERSION := 3.6.1 # This is for resource compiler BINARY_VERSION := 3,6,1,0 ############################################################################ TOOLCHAIN_PATH := /home/avpak/usr/cross/mingw32 CC := ${TOOLCHAIN_PATH}/bin/i386-mingw32-gcc CXX := ${TOOLCHAIN_PATH}/bin/i386-mingw32-g++ AS := ${TOOLCHAIN_PATH}/bin/i386-mingw32-as RC := ${TOOLCHAIN_PATH}/bin/i386-mingw32-windres GLIB_DIR := /home/avpak/usr/cross/mingw32/i386-mingw32/glib-2.0 GLIB_INCLUDES := -I ${GLIB_DIR}/include/glib-2.0 -I ${GLIB_DIR}/lib/glib-2.0/include GLIB_LIBS := -L ${GLIB_DIR}/lib -lglib-2.0 GTHREAD_LIBS := -L ${GLIB_DIR}/lib -lgthread-2.0 GMODULE_LIBS := -L ${GLIB_DIR}/lib -lgmodule-2.0 ############################################################################ CPPFLAGS := -DVERSION=\"${VERSION}\" -D_WIN32_WINNT=0x0501 -DOH_DBG_MSGS RCFLAGS := -DVERSION=\"${VERSION}\" -DBINARY_VERSION=${BINARY_VERSION} --use-temp-file CFLAGS := -Wall CXXFLAGS := -Wall LDFLAGS := -no-undefined --enable-runtime-pseudo-reloc openhpi-3.6.1/docs/0000755000175100017510000000000012605014577013112 5ustar mohanmohanopenhpi-3.6.1/docs/man/0000755000175100017510000000000012605014577013665 5ustar mohanmohanopenhpi-3.6.1/docs/man/hpitop.1.pod0000644000175100017510000000477612575647264016064 0ustar mohanmohan=head1 NAME hpitop - A openhpi sample application that displays highlevel topology for a managed openHPI complex. =head1 SYNOPSIS hpitop [-D nn] [-N host[:port]] [-C ] [-rscwiafd] [-n nn] [-X] [-h] hpitop [--domain=nn] [--host=host[:port]] [--cfgfile=file] [--rpts] [--sensors] [--controls] [--watchdogs] [--inventories] [--annunciators] [--fumis] [--dimis] [--resource=nn] [--debug] [--help] =head1 DESCRIPTION hpitop walks the Resource Present Table (RPT) of the managed openHPI complex and displays all the resources and resources' management instruments. If no domain or host is selected, hpitop uses the default domain as specified in the openhpiclient.conf file. =head1 OPTIONS (No Option) Display system topology via default domain: rpt & rdr headers =head2 Help Options: =over 2 =item B<-h>, B<--help> Show help options =back =head2 Application Options: =over 2 =item B<-r>, B<--rpts> Display only rpts =item B<-s>, B<--sensors> Display only sensors =item B<-c>, B<--controls> Display only controls =item B<-w>, B<--watchdogs> Display only watchdogs =item B<-i>, B<--inventories> Display only inventories =item B<-a>, B<--annunciators> Display only annunciators =item B<-f>, B<--fumis> Display only fumis =item B<-d>, B<--dimis> Display only dimis =item B<-n> I, B<--resource>=I Display only resource I and its topology =item B<-D> I, B<--domain>=I Select domain id I =item B<-X>, B<--debug> Display debug messages =item B<-N> I<"host[:port]">, B<--host>=I<"host[:port]"> Open session to the domain served by the daemon at the specified URL (host:port). This option overrides the OPENHPI_DAEMON_HOST and OPENHPI_DAEMON_PORT environment variables. If host contains ':' (for example IPv6 address) then enclose it in square brackets. For example: I<"[::1]"> or I<"[::1]:4743">. =item B<-C> I<"file">, B<--cfgfile>=I<"file"> Use passed file as client configuration file. This option overrides the OPENHPICLIENT_CONF environment variable. =back =head1 SEE ALSO hpi_shell hpialarms hpifan hpipower hpithres hpidomain hpigensimdata hpireset hpitree hpiel hpiiinv hpisensor hpiwdt hpievents hpionIBMblade hpisettime hpixml ohdomainlist ohhandler ohparam =head1 AUTHORS Authors of this man page: Peter D Phan (pdphan@users.sourceforge.net) Ulrich Kleber (ulikleber@users.sourceforge.net) Anton Pak (avpak@users.sourceforge.net) openhpi-3.6.1/docs/man/hpithres.1.pod0000644000175100017510000000345112575647264016374 0ustar mohanmohan=head1 NAME hpithres - This sample openhpi application interactively displays sensors and sensor info. =head1 SYNOPSIS hpithres [-D nn] [-N host[:port]] [-C ] [-X] [-h] hpithres [--domain=nn] [--host=host[:port]] [--cfgfile=file] [--debug] [--help] =head1 DESCRIPTION hpithres interactively displays sensor info for resources with Sensor Capability. Resources, sensors,and sensor info can be individually selected. If no domain or host is selected, hpithres uses the default domain as specified in the openhpiclient.conf file. =head1 OPTIONS =head2 Help Options: =over 2 =item B<-h>, B<--help> Show help options =back =head2 Application Options: =over 2 =item B<-D> I, B<--domain>=I Select domain id I =item B<-X>, B<--debug> Display debug messages =item B<-N> I<"host[:port]">, B<--host>=I<"host[:port]"> Open session to the domain served by the daemon at the specified URL (host:port). This option overrides the OPENHPI_DAEMON_HOST and OPENHPI_DAEMON_PORT environment variables. If host contains ':' (for example IPv6 address) then enclose it in square brackets. For example: I<"[::1]"> or I<"[::1]:4743">. =item B<-C> I<"file">, B<--cfgfile>=I<"file"> Use passed file as client configuration file. This option overrides the OPENHPICLIENT_CONF environment variable. =back =head1 SEE ALSO hpi_shell hpialarms hpifan hpipower hpitop hpidomain hpigensimdata hpireset hpitree hpiel hpiiinv hpisensor hpiwdt hpievents hpionIBMblade hpisettime hpixml ohdomainlist ohhandler ohparam =head1 AUTHORS Authors of this man page: Peter D Phan (pdphan@users.sourceforge.net) Ulrich Kleber (ulikleber@users.sourceforge.net) Anton Pak (avpak@users.sourceforge.net) openhpi-3.6.1/docs/man/hpialarms.1.pod0000644000175100017510000000605512575647264016531 0ustar mohanmohan=head1 NAME hpialarms - A openhpi sample application that shows "Alarm Control" management instruments =head1 SYNOPSIS hpialarms [-D id] [-N host[:port]] [-C ] [-a 1|0][-b 1|0][-c 1|0][-m 1|0][-n 1|0][-p 1|0][-i n][-o][-X][-h] hpialarms [--domain=id] [--host=host[:port]] [--cfgfile=file] [--diska=1|0] [--diskb=1|0] [--critical=1|0] [--major=1|0] [--minor=1|0] [--power=1|0] [--chassisid=n] [--all] [--debug] [--help] =head1 DESCRIPTION hpialarms walks the RPT (Resource Presence Table) for resources that have "Alarm Control" management instruments (SAHPI_CTRL_LED). If no domain or host is selected, hpialarms uses the default domain as specified in the openhpiclient.conf file. =head1 OPTIONS (No Option) Display alarm states =head2 Help Options: =over 2 =item B<-h>, B<--help> Show help options =back =head2 Application Options: =over 2 =item B<-c> I<1|0>, -B<-critical>=I<1|0> Set critical alarm on|off =item B<-m> I<1|0>, -B<-major>=I<1|0> Set major alarm on|off =item B<-n> I<1|0>, -B<-minor>=I<1|0> Set minor alarm on|off =item B<-a> I<1|0>, -B<-diska>=I<1|0> Set diska alarm on|off =item B<-b> I<1|0>, -B<-diskb>=I<1|0> Set diskb alarm on|off =item B<-p> I<1|0>, -B<-power>=I<1|0> Set power alarm on|off =item B<-i> I, -B<-chassisid>=I Set chassis id on for I seconds =item B<-o>, -B<-all> Set all alarms off =item B<-D> I, B<--domain>=I Select domain id I =item B<-X>, B<--debug> Display debug messages =item B<-N> I<"host[:port]">, B<--host>=I<"host[:port]"> Open session to the domain served by the daemon at the specified URL (host:port). This option overrides the OPENHPI_DAEMON_HOST and OPENHPI_DAEMON_PORT environment variables. If host contains ':' (for example IPv6 address) then enclose it in square brackets. For example: I<"[::1]"> or I<"[::1]:4743">. =item B<-C> I<"file">, B<--cfgfile>=I<"file"> Use passed file as client configuration file. This option overrides the OPENHPICLIENT_CONF environment variable. =back =head1 SAMPLE OUTPUT =over 2 hpialarmpanel ver 0.6 RptInfo: UpdateCount = 5, UpdateTime = 8a2dc6c0 rptentry[0] resourceid=1 tag: Mullins RDR[45]: ctltype=2:1 oem=0 Chassis Identify Control RDR[48]: ctltype=0:1 oem=10 Front Panel Power Alarm LED state = off RDR[51]: ctltype=0:1 oem=13 Front Panel Minor Alarm LED state = ON RDR[46]: ctltype=0:0 oem=0 Cold Reset Control RDR[49]: ctltype=0:1 oem=11 Front Panel Critical Alarm LED state = off RDR[50]: ctltype=0:1 oem=12 Front Panel Major Alarm LED state = off =back =head1 SEE ALSO hpi_shell hpidomain hpigensimdata hpireset hpitop hpiel hpiinv hpisensor hpitree hpievents hpionIBMblade hpisettime hpiwdt hpifan hpipower hpithres hpixml ohdomainlist ohhandler ohparam =head1 AUTHORS Authors of this man page: Peter D Phan (pdphan@users.sourceforge.net) Ulrich Kleber (ulikleber@users.sourceforge.net) Anton Pak (avpak@users.sourceforge.net) openhpi-3.6.1/docs/man/hpievents.1.pod0000644000175100017510000000527112575647264016555 0ustar mohanmohan=head1 NAME hpievents - An openhpi sample application that polls for events. =head1 SYNOPSIS hpievents [ -D ] [-N host[:port]] [-C ] [ -t BLOCK|SAHPI_TIMEOUT_BLOCK|n ] [ -d -X -h ] hpievents [--domain=nn] [--host=host[:port]] [--cfgfile=file] [--timeout=BLOCK|SAHPI_TIMEOUT_BLOCK|n ] [--discover] [--debug] [--help] =head1 DESCRIPTION hpievents polls for events in an opened HPI session. User can specify wait time for the event. User can also select the order between hpi resource (resource event) discovery and hpi event subscription. If no domain or host is selected, hpievents polls for events in the default domain as specified in the openhpiclient.conf file. =head1 OPTIONS =head2 Help Options: =over 2 =item B<-h>, B<--help> Show help options =back =head2 Application Options: =over 2 =item B<-t> I, B<--timeout>=I Wait I seconds for event or infinite wait (I) =item B<-d>, B<--discover> Call saHpiDiscover() after saHpiSubscribe() =item B<-D> I, B<--domain>=I Select domain id I =item B<-X>, B<--debug> Display debug messages =item B<-N> I<"host[:port]">, B<--host>=I<"host[:port]"> Open session to the domain served by the daemon at the specified URL (host:port). This option overrides the OPENHPI_DAEMON_HOST and OPENHPI_DAEMON_PORT environment variables. If host contains ':' (for example IPv6 address) then enclose it in square brackets. For example: I<"[::1]"> or I<"[::1]:4743">. =item B<-C> I<"file">, B<--cfgfile>=I<"file"> Use passed file as client configuration file. This option overrides the OPENHPICLIENT_CONF environment variable. =back =head1 HPI APIs uniquely used in this application =over 2 SaErrorT SAHPI_API saHpiSubscribe ( SAHPI_IN SaHpiSessionIdT SessionId ); SaErrorT SAHPI_API saHpiUnsubscribe ( SAHPI_IN SaHpiSessionIdT SessionId ); SaErrorT SAHPI_API saHpiEventGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiTimeoutT Timeout, SAHPI_OUT SaHpiEventT *Event, SAHPI_INOUT SaHpiRdrT *Rdr, SAHPI_INOUT SaHpiRptEntryT *RptEntry, SAHPI_INOUT SaHpiEvtQueueStatusT *EventQueueStatus ); =back =head1 SEE ALSO hpi_shell hpialarms hpigensimdata hpireset hpitop hpidomain hpiinv hpisensor hpitree hpiel hpionIBMblade hpisettime hpiwdt hpifan hpipower hpithres hpixml ohdomainlist ohhandler ohparam =head1 AUTHORS Authors of this man page: Peter D Phan (pdphan@users.sourceforge.net) Ulrich Kleber (ulikleber@users.sourceforge.net) Anton Pak (avpak@users.sourceforge.net) openhpi-3.6.1/docs/man/hpicrypt.1.pod0000644000175100017510000000171012575647264016404 0ustar mohanmohan=head1 NAME hpigcrypt - An openhpi helper application that encrypts and decrypts a config file. =head1 SYNOPSIS hpicrypt [-d ] -c config_file =head1 DESCRIPTION hpicrypt is an optional helper application that encrypts or decrypts config_file. The encryption key is machine specific. File encrypted on one machine may not decrypt on some other machine. Please have a backup copy of the file before encrypting. =head1 OPTIONS =head2 Application Options: =over 2 =item B<-d> Decrypt the config_file and output the text to screen with helpful message =back =head1 SEE ALSO hpi_shell hpialarms hpigensimdata hpireset hpitop hpidomain hpiinv hpisensor hpitree hpievents hpionIBMblade hpisettime hpiwdt hpifan hpipower hpithres ohdomainlist ohhandler ohparam =head1 AUTHORS Authors of this man page: Mohan Devarajulu (mohan@fc.hp..com) openhpi-3.6.1/docs/man/hpionIBMblade.1.pod0000644000175100017510000000532512575647264017205 0ustar mohanmohan=head1 NAME hpionIBMblade - An openhpi sample application that shows how two (2) openhpi plugins can be used to display and manage resources of an IBM Blade with Basedboard Management Controller (BMC). =head1 SYNOPSIS hpionIBMblade [-D nn] [-N host[:port]] [-C ] [ -X ] [ -h ] hpionIBMblade [--domain nn] [--host=host[:port]] [--cfgfile=file] [--debug] [--help] =head1 DESCRIPTION hpionIBMblade shows how two (2) openhpi plugins can be used to display and manage resources of an IBM Blade with Basedboard Management Controller (BMC). Both the ipmi and snmp_bc plugin have the same IBM Blade target. Resources from both plugins are combined to show a complete view of the IBM Blade. @@ WARNING @@ RESTRICTIONS @@ WARNING @@ RESTRICTIONS @@ WARNING @@ RESTRICTIONS @@ This client application is designed to run **only** inband on an IBM Blade with Basedboard Management Controller (BMC) If no domain or host is selected, hpionIBMblade uses the default domain as specified in the openhpiclient.conf file. =head1 OPTIONS =head2 Help Options: =over 2 =item B<-h>, B<--help> Show help options =back =head2 Application Options: =over 2 =item B<-D> I, B<--domain>=I Select domain id I =item B<-X>, B<--debug> Display debug messages =item B<-N> I<"host[:port]">, B<--host>=I<"host[:port]"> Open session to the domain served by the daemon at the specified URL (host:port). This option overrides the OPENHPI_DAEMON_HOST and OPENHPI_DAEMON_PORT environment variables. If host contains ':' (for example IPv6 address) then enclose it in square brackets. For example: I<"[::1]"> or I<"[::1]:4743">. =item B<-C> I<"file">, B<--cfgfile>=I<"file"> Use passed file as client configuration file. This option overrides the OPENHPICLIENT_CONF environment variable. =back =head1 SAMPLE CONFIGURATION FILE handler libipmi { entity_root = "{SYSTEM_CHASSIS,2}" name = "smi" addr = 0 } handler libsnmp_bc { host = "bc.mm.ip.address" version = "3" community = "bc_community" entity_root = "{SYSTEM_CHASSIS,1}" security_name = "myid" passphrase = "mypassword" security_level = "authNoPriv" auth_type = "MD5" } =head1 SEE ALSO hpi_shell hpialarms hpifan hpireset hpitop hpidomain hpigensimdata hpisensor hpitree hpiel hpiiinv hpisettime hpiwdt hpievents hpipower hpithres hpixml ohdomainlist ohhandler ohparam =head1 AUTHORS Authors of this man page: Peter D Phan (pdphan@users.sourceforge.net) Ulrich Kleber (ulikleber@users.sourceforge.net) Anton Pak (avpak@users.sourceforge.net) openhpi-3.6.1/docs/man/hpisettime.1.pod0000644000175100017510000000373012575647264016721 0ustar mohanmohan=head1 NAME hpisettime - This sample openhpi application excercises Event Log clock APIs. =head1 SYNOPSIS hpisettime [-D nn] [-N host[:port]] [-C ] -d mm/dd/yyyy -t HH:MM:SS [-X] [-h] hpisettime [--domain=nn] [--host=host[:port]] [--cfgfile=file] --date=mm/dd/yyyy --time=HH:MM:SS [--debug] [--help] =head1 DESCRIPTION hpisettime sets new date and time for the Event Log clock. If no domain is selected, hpisettime uses a session with the default domain. The selected domain id must be configured via the openhpidclient.conf file specified in the environment. =head1 OPTIONS =head2 Help Options: =over 2 =item B<-h>, B<--help> Show help options =back =head2 Application Options: =over 2 =item B<-d> I, B<--date>=I New date =item B<-t> I<24:12:60>, B<--time>=I<24:12:60> New time of day in 24-hr format =item B<-D> I, B<--domain>=I Select domain id I =item B<-X>, B<--debug> Display debug messages =item B<-N> I<"host[:port]">, B<--host>=I<"host[:port]"> Open session to the domain served by the daemon at the specified URL (host:port). This option overrides the OPENHPI_DAEMON_HOST and OPENHPI_DAEMON_PORT environment variables. If host contains ':' (for example IPv6 address) then enclose it in square brackets. For example: I<"[::1]"> or I<"[::1]:4743">. =item B<-C> I<"file">, B<--cfgfile>=I<"file"> Use passed file as client configuration file. This option overrides the OPENHPICLIENT_CONF environment variable. =back =head1 SEE ALSO hpi_shell hpialarms hpifan hpipower hpitop hpidomain hpigensimdata hpireset hpitree hpiel hpiiinv hpisensor hpiwdt hpievents hpionIBMblade hpithres hpixml ohdomainlist ohhandler ohparam =head1 AUTHORS Authors of this man page: Peter D Phan (pdphan@users.sourceforge.net) Ulrich Kleber (ulikleber@users.sourceforge.net) Anton Pak (avpak@users.sourceforge.net) openhpi-3.6.1/docs/man/hpireset.1.pod0000644000175100017510000000375312575647264016376 0ustar mohanmohan=head1 NAME hpireset - This sample openhpi application exercises HPI Reset Management APIs. =head1 SYNOPSIS hpireset [-D nn] [-N host[:port]] [-C ] [-r -w -h -X] hpireset [--domain nn] [--host=host[:port]] [--cfgfile=file] [--hard --warm --help --debug] =head1 DESCRIPTION hpireset searches the Resource Presence Table (RPT) for resources with Reset Capability. It sends the requested reset action to all resources with SAHPI_CAPABILITY_RESET. If no domain is selected, hpireset uses a session with the default domain. The selected domain id must be configured via the openhpidclient.conf file specified in the environment. =head1 OPTIONS =head2 Help Options: =over 2 =item B<-h>, B<--help> Show help options =back =head2 Application Options: =over 2 =item B<-r>, B<--hard> Hard resets the system =item B<-w>, B<--warm> Warm resets the system =item B<-D> I, B<--domain>=I Select domain id I =item B<-X>, B<--debug> Display debug messages =item B<-N> I<"host[:port]">, B<--host>=I<"host[:port]"> Open session to the domain served by the daemon at the specified URL (host:port). This option overrides the OPENHPI_DAEMON_HOST and OPENHPI_DAEMON_PORT environment variables. If host contains ':' (for example IPv6 address) then enclose it in square brackets. For example: I<"[::1]"> or I<"[::1]:4743">. =item B<-C> I<"file">, B<--cfgfile>=I<"file"> Use passed file as client configuration file. This option overrides the OPENHPICLIENT_CONF environment variable. =back =head1 SEE ALSO hpi_shell hpialarms hpifan hpipower hpitop hpidomain hpigensimdata hpisensor hpitree hpiel hpiiinv hpisettime hpiwdt hpievents hpionIBMblade hpithres hpixml ohdomainlist ohhandler ohparam =head1 AUTHORS Authors of this man page: Peter D Phan (pdphan@users.sourceforge.net) Ulrich Kleber (ulikleber@users.sourceforge.net) Anton Pak (avpak@users.sourceforge.net) openhpi-3.6.1/docs/man/hpidomain.1.pod0000644000175100017510000000374412575647264016523 0ustar mohanmohan=head1 NAME hpidomain - A openhpi sample application that shows information about domains. It can also set the domain tag. =head1 SYNOPSIS hpidomain [-D id] [-N host[:port]] [-C ] [-t tttt] [-V -X -h] hpidomain [--domain=id] [--host=host[:port]] [--cfgfile=file] [--tag=tttt] [--verbose] [--debug] [--help] =head1 DESCRIPTION hpidomain displays the domain info for the specified domain. If no domain or host is selected, ohparam uses the default domain as specified in the openhpiclient.conf file. In verbose mode, it walks the DRT and displays domaininfo for all directly related domains. Option -t allows to change the domain tag. (No Option) Display domain info =head1 OPTIONS =head2 Help Options: =over 2 =item B<-h>, B<--help> Show help options =back =head2 Application Options: =over 2 =item B<-t> I, B<--tag>=I Set domain tag to the specified string =item B<-D> I, B<--domain>=I Select domain id I =item B<-X>, B<--debug> Display debug messages =item B<-N> I<"host[:port]">, B<--host>=I<"host[:port]"> Open session to the domain served by the daemon at the specified URL (host:port). This option overrides the OPENHPI_DAEMON_HOST and OPENHPI_DAEMON_PORT environment variables. If host contains ':' (for example IPv6 address) then enclose it in square brackets. For example: I<"[::1]"> or I<"[::1]:4743">. =item B<-C> I<"file">, B<--cfgfile>=I<"file"> Use passed file as client configuration file. This option overrides the OPENHPICLIENT_CONF environment variable. =back =head1 SEE ALSO hpi_shell hpialarms hpigensimdata hpireset hpitop hpiel hpiinv hpisensor hpitree hpievents hpionIBMblade hpisettime hpiwdt hpifan hpipower hpithres hpixml ohdomainlist ohhandler ohparam =head1 AUTHORS Authors of this man page: Ulrich Kleber (ulikleber@users.sourceforge.net) Anton Pak (avpak@users.sourceforge.net) openhpi-3.6.1/docs/man/hpixml.1.pod0000644000175100017510000000335112575647264016046 0ustar mohanmohan=head1 NAME hpxml - An openhpi sample application that displays system view in XML. =head1 SYNOPSIS hpixml [-D nn] [-s] [-i -t ] [-N host[:port]] [-C=file] [-h] hpixml [--domain=nn] [--xsd] [--indent --text ] [--host=host[:port]] [--cfgfile=file] [--help] =head1 DESCRIPTION hpixml displays system view in XML. If no domain or host is selected, hpixml uses the default domain as specified in the openhpiclient.conf file. =head1 OPTIONS =head2 Help Options: =over 2 =item B<-h>, B<--help> Show help options =back =head2 Application Options: =over 2 =item B<-i>, B<--indent> Use indentation =item B<-t>, B<--text> Use enum and flag text names instead of raw values =item B<-s>, B<--xsd> Show XML schema =item B<-D> I, B<--domain>=I Select domain id I =item B<-N> I<"host[:port]">, B<--host>=I<"host[:port]"> Open session to the domain served by the daemon at the specified URL (host:port). This option overrides the OPENHPI_DAEMON_HOST and OPENHPI_DAEMON_PORT environment variables. If host contains ':' (for example IPv6 address) then enclose it in square brackets. For example: I<"[::1]"> or I<"[::1]:4743">. =item B<-C> I<"file">, B<--cfgfile>=I<"file"> Use passed file as client configuration file. This option overrides the OPENHPICLIENT_CONF environment variable. =back =head1 SEE ALSO hpi_shell hpialarms hpigensimdata hpireset hpitop hpidomain hpiinv hpisensor hpitree hpievents hpionIBMblade hpisettime hpiwdt hpifan hpipower hpithres ohdomainlist ohhandler ohparam =head1 AUTHORS Authors of this man page: Anton Pak (anton.pak@pigeonpoint.com) Ulrich Kleber (ulikleber@users.sourceforge.net) openhpi-3.6.1/docs/man/hpigensimdata.1.pod0000644000175100017510000000517012575647264017363 0ustar mohanmohan=head1 NAME hpigensimdata - A openhpi client application supplementing the dynamic simulator plugin. =head1 SYNOPSIS hpigensimdata [-D nn] [-N host[:port]] [-C ] [-r res_id] [-f filename] [-m UPD|INIT] [-h] hpigensimdata [--domain=nn] [--host=host[:port]] [--cfgfile=file] [--resource=res_id] [--file=filename] [--mode=UPD|INIT] [--help] =head1 DESCRIPTION hpigensimdata generates data for the dynamic simulator plugin by reading the current configuration. It will print all HPI information in a format that can be parsed by Dynamic Simulator plugin. To spare some encoding/decoding function, values of enums are printed as int values instead of encode them to ASCII values and decode them afterwards. Since this client is primarily for the Dynamic Simulator, the output functions don't depend on the oh_.. - output function. Therefore they can be easily changed without influence on other clients. Please refer to README and detailed documentation with the plugin. If no domain or host is selected, ohparam uses the default domain as specified in the openhpiclient.conf file. If no file name is specified, the data is displayed on console. =head1 OPTIONS =head2 Help Options: =over 2 =item B<-h>, B<--help> Show help options =back =head2 Application Options: =over 2 =item B<-r> I, B<--resource>=I Select particular resource id for an update file =item B<-f> I, B<--file>=I Name of the file to be generated =item B<-m> I, B<--mode>=I Write update or initial file =item B<-D> I, B<--domain>=I Select domain id I =item B<-N> I<"host[:port]">, B<--host>=I<"host[:port]"> Open session to the domain served by the daemon at the specified URL (host:port). This option overrides the OPENHPI_DAEMON_HOST and OPENHPI_DAEMON_PORT environment variables. If host contains ':' (for example IPv6 address) then enclose it in square brackets. For example: I<"[::1]"> or I<"[::1]:4743">. =item B<-C> I<"file">, B<--cfgfile>=I<"file"> Use passed file as client configuration file. This option overrides the OPENHPICLIENT_CONF environment variable. =back =head1 SEE ALSO hpi_shell hpialarms hpifan hpireset hpitop hpidomain hpiinv hpisensor hpitree hpiel hpionIBMblade hpisettime hpiwdt hpievents hpipower hpithres hpixml ohdomainlist ohhandler ohparam =head1 AUTHORS Authors of this man page: Ulrich Kleber (ulikleber@users.sourceforge.net) Lars Wetzel (larswetzel@users.sourceforge.net) Anton Pak (avpak@users.sourceforge.net) openhpi-3.6.1/docs/man/Makefile.am0000644000175100017510000000565712575650124015736 0ustar mohanmohan# # Copyright IBM 2005 # # Redistribution and use in source and binary forms, with or # without modification, are permitted provided that the following # conditions are met: # # Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the distribution. # # Neither the name of Intel Corporation nor the names # of its contributors may be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, # OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. MAINTAINERCLEANFILES = Makefile.in EXTRA_DIST = openhpi.7.pod openhpid.8.pod \ hpialarms.1.pod hpifan.1.pod \ hpipower.1.pod hpisettime.1.pod \ hpitree.1.pod hpiel.1.pod \ hpiinv.1.pod hpireset.1.pod \ hpithres.1.pod hpiwdt.1.pod \ hpievents.1.pod hpionIBMblade.1.pod \ hpisensor.1.pod hpitop.1.pod \ hpidomain.1.pod hpigensimdata.1.pod \ hpixml.1.pod hpicrypt.1.pod \ ohhandler.1.pod ohparam.1.pod \ ohdomainlist.1.pod \ hpi_shell.1.pod SUFFIXES=.pod .pod: pod2man --release=$(VERSION) --name=`echo $@ | sed 's/\..*//'` \ -s `echo $@ | sed 's/.*\.//'` -c "OpenHPI" $< $@ #mandir = $(datadir)/man man_MANS = openhpi.7 openhpid.8 \ hpialarms.1 hpifan.1 \ hpipower.1 hpisettime.1 \ hpitree.1 hpiel.1 \ hpiinv.1 hpireset.1 \ hpithres.1 hpiwdt.1 \ hpievents.1 hpionIBMblade.1 \ hpisensor.1 hpitop.1 \ hpidomain.1 hpigensimdata.1 \ hpixml.1 $(HPICRYPT_MAN) \ ohhandler.1 ohparam.1 \ ohdomainlist.1 \ hpi_shell.1 clean-local: am_config_clean-local am_config_clean-local: rm -f *~ find . -name \*\.[13578] | grep -v pod | xargs rm -f .PHONY: FORCE openhpi-3.6.1/docs/man/openhpi.7.pod0000644000175100017510000001123012575647264016210 0ustar mohanmohan=head1 NAME openhpi - an implementation of the SA Forum's Hardware Platform Interface =head1 DESCRIPTION OpenHPI is an implementation of the SA Forum's Hardware Platform Interface, which provides a standard C library interface to manage, monitor, and control hardware (both local and remote). Starting with release 2.14.0 OpenHPI implements the HPI B.03.02 specification. The OpenHPI client library (libopenhpi) provides all the connection functionality needed by the client application to connect to the OpenHPI daemon running on the local or remote server. The OpenHPI daemon runs as a background process and executes the requests. It loads plugins to adapt to the different hardware types. The plugins can be defined in the openhpi.conf file or can be loaded dynamically. =head1 ENVIRONMENTAL VARIABLES Some of OpenHPI's functioning can be changed by setting environment variables. This documents all client environmental settings. Client environmental settings are evaluated in the openhpi library that is linked to the client. There are other environmental settings for the openhpi daemon. =over 2 =item B="filename" Location for the client's configuration file that specifies the HPI domains and addresses of daemons serving the domains. If the variable is not set, OpenHPI will look for a file openhpiclient.conf in the directory specified during the build process (default /etc/openhpi). =item B=URL URL for the host running the daemon which the client wants to connect to. This can be an ip address or "localhost" (default) if the daemon is running on the same host as the client. The variable is only used if no default domain is defined via the client conf file. =item B=PORT_NUMBER The port number used by the daemon which the client wants to connect to. Default port is 4743. The variable is only used if no default domain is defined via the client conf file. =back =head1 HARDWARE SUPPORT OpenHPI provides a number of plugins that talk to different hardware types. The following is a list of plugins provided by the OpenHPI project. =over 4 =item B An IPMI plugin designed specifically for ATCA chassis. It implements IPMI commands directly in the plugin. =item B An SNMP based plugin that can communicate with IBM BladeCenter, as well as IBM xSeries servers with RSA 1 adapters. SNMP_BC plugin depends on net-snmp > 5.0.7. =item B OpenHPI plugin supporting HP ProLiant Rack Mount Servers. This plug-in connects to iLO2 on HP ProLiant Rack Mount Server using a SSL connection and exchanges information via Remote Insight Board Command Language (RIBCL). =item B OpenHPI plug-in supporting HP BladeSystems c-Class. This plug-in connects to the OA of a c-Class chassis using an SSL connection and manages the system using an XML-encoded SOAP interface. =item B Run-Time Abstraction Services (RTAS) plug-in =item B OpenHPI plugin that reads system information from sysfs. (LM sensors and I2C devices exported in sysfs requires kernel 2.6 or >= 2.5.72) =item B Linux watchdog device interface =back The following plugins are provided to ease testing or support complex hardware architectures: =over 4 =item B OpenHPI plugin that reports fakes hardware used for testing the core library. =item B OpenHPI plugin that reports fakes hardware defined in the file simulation.data used for testing the core library. =item B OpenHPI plug-in that allows to aggregate resources from different domains (slave domains) and to provide aggregated resources as part of the one domain (master domain). =item B OpenHPI plug-in for advanced testing. Provides console for runtime configuration. =back =head1 OTHER DOCUMENTATION The definitive guide to HPI is the SA Forum specification at http://saforum.org. More info on OpenHPI can be found at our webpage (http://openhpi.org) and in inline documentation. =head1 SEE ALSO The following man pages may also be of interest =over 1 =item B The openhpi daemon, providing OpenHPI data as a system service. =item B hpialarms hpigensimdata hpireset hpitop hpidomain hpiinv hpisensor hpitree hpiel hpionIBMblade hpisettime hpiwdt hpievents hpipower hpithres hpixml ohdomainlist ohhandler ohparam hpi_shell =back =head1 AUTHORS Authors of this man page: Sean Dague (http://dague.net/sean) Renier Morales (renier@openhpi.org) Ulrich Kleber (ulikleber@users.sourceforge.net) Anton Pak (avpak@users.sourceforge.net) openhpi-3.6.1/docs/man/hpiwdt.1.pod0000644000175100017510000000373612575647264016053 0ustar mohanmohan=head1 NAME hpiwdt - This sample openhpi application reads and enables the watchdog timer. =head1 SYNOPSIS hpiwdt [-D nn] [-N host[:port]] [-C ] [-t sec] [-X] [-h] hpiwdt [--domain=nn] [--host=host[:port]] [--cfgfile=file] [--disable][--enable][--reset][--timeout n] [--debug] [--help] =head1 DESCRIPTION hpiwdt reads and enables the watchdog timer. If no domain or host is selected, hpiwdt uses the default domain as specified in the openhpiclient.conf file. =head1 OPTIONS =head2 Help Options: =over 2 =item B<-h>, B<--help> Show help options =back =head2 Application Options: =over 2 =item B<-e>, B<--enable> Enables the watchdog timer =item B<-d>, B<--disable> Disables the watchdog timer =item B<-r>, B<--reset> Resets the watchdog timer =item B<-t> I, B<--timeout>=I Sets timeout to I seconds =item B<-D> I, B<--domain>=I Select domain id I =item B<-X>, B<--debug> Display debug messages =item B<-N> I<"host[:port]">, B<--host>=I<"host[:port]"> Open session to the domain served by the daemon at the specified URL (host:port). This option overrides the OPENHPI_DAEMON_HOST and OPENHPI_DAEMON_PORT environment variables. If host contains ':' (for example IPv6 address) then enclose it in square brackets. For example: I<"[::1]"> or I<"[::1]:4743">. =item B<-C> I<"file">, B<--cfgfile>=I<"file"> Use passed file as client configuration file. This option overrides the OPENHPICLIENT_CONF environment variable. =back =head1 SEE ALSO hpi_shell hpialarms hpifan hpipower hpithres hpidomain hpigensimdata hpireset hpitop hpiel hpiiinv hpisensor hpitree hpievents hpionIBMblade hpisettime hpixml ohdomainlist ohhandler ohparam =head1 AUTHORS Authors of this man page: Peter D Phan (pdphan@users.sourceforge.net) Ulrich Kleber (ulikleber@users.sourceforge.net) Anton Pak (avpak@users.sourceforge.net) openhpi-3.6.1/docs/man/hpisensor.1.pod0000644000175100017510000000417012575647264016557 0ustar mohanmohan=head1 NAME hpisensor - This sample openhpi application displays sensor info for all resources with Sensor Capability =head1 SYNOPSIS hpisensor [-D nn] [-N host[:port]] [-C ] [-t -r -s -X -h] [-E epath] hpisensor [--domain=nn] [--host=host[:port]] [--cfgfile=file] [--threshold --range --eventstate --debug --help] [--entity-path="epath"] =head1 DESCRIPTION hpisensor displays sensor info for all resources with Sensor Capability. Option -E (entity-path) restricts the output on the specified entity-path. If no domain or host is selected, hpisensor uses the default domain as specified in the openhpiclient.conf file. =head1 OPTIONS =head2 Help Options: =over 2 =item B<-h>, B<--help> Show help options =back =head2 Application Options: =over 2 =item B<-t>, B<--threshold> Show Thresholds also =item B<-r>, B<--range> Show Range values also =item B<-s>, B<--eventstate> Show EventState also =item B<-E> I<"epath">, B<--entity-path>=I<"epath"> Use entity path I =item B<-D> I, B<--domain>=I Select domain id I =item B<-X>, B<--debug> Display debug messages =item B<-N> I<"host[:port]">, B<--host>=I<"host[:port]"> Open session to the domain served by the daemon at the specified URL (host:port). This option overrides the OPENHPI_DAEMON_HOST and OPENHPI_DAEMON_PORT environment variables. If host contains ':' (for example IPv6 address) then enclose it in square brackets. For example: I<"[::1]"> or I<"[::1]:4743">. =item B<-C> I<"file">, B<--cfgfile>=I<"file"> Use passed file as client configuration file. This option overrides the OPENHPICLIENT_CONF environment variable. =back =head1 SEE ALSO hpi_shell hpialarms hpifan hpipower hpitop hpidomain hpigensimdata hpireset hpitree hpiel hpiiinv hpisettime hpiwdt hpievents hpionIBMblade hpithres hpixml ohdomainlist ohhandler ohparam =head1 AUTHORS Authors of this man page: Peter D Phan (pdphan@users.sourceforge.net) Ulrich Kleber (ulikleber@users.sourceforge.net) Anton Pak (avpak@users.sourceforge.net) openhpi-3.6.1/docs/man/ohhandler.1.pod0000644000175100017510000000655012575647264016515 0ustar mohanmohan=head1 NAME ohhandler - An openhpi sample application that uses the openhpi additional interfaces to control openhpi configuration. That is plugins can be loaded, plugin instances (handlers) created, unloaded or their configuration displayed. =head1 SYNOPSIS ohhandler [-D nn] [-N host[:port]] [-C ] [-X] command ohhandler [--domain nn] [--host=host[:port]] [--cfgfile=file] [--debug] command ohhandler [-D nn] [-X] list ohhandler [-D nn] [-X] info ohhandler [-D nn] [-X] destroy ohhandler [-D nn] [-X] getnext ohhandler [-D nn] [-X] find ohhandler [-D nn] [-X] retry ohhandler [-D nn] [-X] create plugin =head1 DESCRIPTION ohhandler list will display a list of all plugin instances (handlers) currently defined in the openhpi daemon for the specified domain. Part of the output is the handler-id that can be used in subsequent commands. ohhandler info will display specific info for the handler with the specified id. This information includes all configuration parameters of the handler as specified in the openhpi.conf file or as dynamically defined during a "ohhandler create" call. ohhandler destroy will unload the specified handler and delete all its configuration information. ohhandler getnext will allows to walk through all hanlers currently defined in the openhpi daemon for the specified domain. ohhandler find will find the handler that is managing the specified resource. ohhandler retry allows to try again to load and initialize the specified handler. ohhandler create allows to dynamically create a new handler with configuration parameters like they are specified in the openhpi.conf file. - The type of plugin is specified with the keyword plugin - Configuration parameters should follow as name value pairs - Complex strings like entity paths must be enclosed with "" Example: ohhandler create plugin libsimulator entity_root "{SYSTEM_CHASSIS,1}" name sim If no domain or host is selected, ohhandler uses the default domain as specified in the openhpiclient.conf file. =head1 OPTIONS =head2 Help Options: =over 2 =item B<-h>, B<--help> Show help options =back =head2 Application Options: =over 2 =item B<-D> I, B<--domain>=I Select domain id I =item B<-X>, B<--debug> Display debug messages =item B<-N> I<"host[:port]">, B<--host>=I<"host[:port]"> Open session to the domain served by the daemon at the specified URL (host:port). This option overrides the OPENHPI_DAEMON_HOST and OPENHPI_DAEMON_PORT environment variables. If host contains ':' (for example IPv6 address) then enclose it in square brackets. For example: I<"[::1]"> or I<"[::1]:4743">. =item B<-C> I<"file">, B<--cfgfile>=I<"file"> Use passed file as client configuration file. This option overrides the OPENHPICLIENT_CONF environment variable. =back =head1 SEE ALSO hpi_shell hpialarms hpifan hpipower hpithres hpidomain hpigensimdata hpireset hpitop hpiel hpiiinv hpisensor hpitree hpievents hpionIBMblade hpisettime hpiwdt hpixml ohdomainlist ohparam =head1 AUTHORS Authors of this man page: Ulrich Kleber (ulikleber@users.sourceforge.net) Anton Pak (avpak@users.sourceforge.net) openhpi-3.6.1/docs/man/hpi_shell.1.pod0000644000175100017510000000421312575647264016512 0ustar mohanmohan=head1 NAME hpi_shell - An openhpi sample application that allows a user to interactively perform a number of HPI operations. =head1 SYNOPSIS hpi_shell [-D nn] [-N host[:port]] [-C ] [-e] [-f ] [-X] [-h] hpi_shell [--domain=nn] [--host=host[:port]] [--cfgfile=file] [--events] [--cmdfile=filename] [--debug] [--help] =head1 DESCRIPTION hpi_shell reads commands and performs HPI operations based on those commands. This allows it to exercise HPI-managed hardware and do manual operations on that hardware. Once in hpi_shell, use the "help" command for a list of commands, or "help command" for details on a particular command. If no domain or host is selected, ohparam uses the default domain as specified in the openhpiclient.conf file. =head1 OPTIONS =head2 Help Options: =over 2 -h, --help Show help options =back =head2 Application Options: =over 2 =item B<-f> I, B<--cmdfile>=I Execute command file =item B<-e>, B<--events> Show short events, discover after subscribe =item B<-D> I, B<--domain>=I Select domain id I =item B<-X>, B<--debug> Display debug messages =item B<-N> I<"host[:port]">, B<--host>=I<"host[:port]"> Open session to the domain served by the daemon at the specified URL (host:port). This option overrides the OPENHPI_DAEMON_HOST and OPENHPI_DAEMON_PORT environment variables. If host contains ':' (for example IPv6 address) then enclose it in square brackets. For example: I<"[::1]"> or I<"[::1]:4743">. =item B<-C> I<"file">, B<--cfgfile>=I<"file"> Use passed file as client configuration file. This option overrides the OPENHPICLIENT_CONF environment variable. =back =head1 SEE ALSO hpialarms hpifan hpipower hpithres hpidomain hpigensimdata hpireset hpitop hpiel hpiinv hpisensor hpitree hpievents hpionIBMblade hpisettime hpiwdt hpixml ohdomainlist ohhandler ohparam =head1 AUTHORS Author(s) of this man page: Bryan Sutula (sutula@users.sourceforge.net) Ulrich Kleber (ulikleber@users.sourceforge.net) Anton Pak (avpak@users.sourceforge.net) openhpi-3.6.1/docs/man/hpiinv.1.pod0000644000175100017510000000436112575647264016044 0ustar mohanmohan=head1 NAME hpiinv - An openhpi sample application that shows resources' inventory records. =head1 SYNOPSIS hpiinv [-D nn] [-N host[:port]] [-C ] [-V] [ -X] [-a tag] [-h] hpiinv [--domain=nn] [--host=host[:port]] [--cfgfile=file] [--verbose] [--debug] [--asset-tag=tag] [--help] =head1 DESCRIPTION hpiinv walks the RPT (Resource Present Table) looking for resources that have Inventory Capability. It displays all inventory records found. If no domain is selected, hpiinv uses a session with the default domain. The selected domain id must be configured via the openhpidclient.conf file specified in the environment. =head1 OPTIONS =head2 Help Options: =over 2 =item B<-h>, B<--help> Show help options =back =head2 Application Options: =over 2 =item B<-a> I, B<--asset-tag>=I Set the asset tag to the specified string =item B<-D> I, B<--domain>=I Select domain id I =item B<-X>, B<--debug> Display debug messages =item B<-V>, B<--verbose> Verbose mode =item B<-N> I<"host[:port]">, B<--host>=I<"host[:port]"> Open session to the domain served by the daemon at the specified URL (host:port). This option overrides the OPENHPI_DAEMON_HOST and OPENHPI_DAEMON_PORT environment variables. If host contains ':' (for example IPv6 address) then enclose it in square brackets. For example: I<"[::1]"> or I<"[::1]:4743">. =item B<-C> I<"file">, B<--cfgfile>=I<"file"> Use passed file as client configuration file. This option overrides the OPENHPICLIENT_CONF environment variable. =back =head1 ENVIRONMENT VARIABLES For generic OpenHPI, there is *no* additional environment variable required. For some devices; sahalee, mBMC; BMCONLY flag needs to be set for additional device characterization based on rdr.IdString.Data. =head1 SEE ALSO hpi_shell hpialarms hpifan hpireset hpitop hpidomain hpigensimdata hpisensor hpitree hpiel hpionIBMblade hpisettime hpiwdt hpievents hpipower hpithres hpixml ohdomainlist ohhandler ohparam =head1 AUTHORS Authors of this man page: Peter D Phan (pdphan@users.sourceforge.net) Ulrich Kleber (ulikleber@users.sourceforge.net) Anton Pak (avpak@users.sourceforge.net) openhpi-3.6.1/docs/man/ohdomainlist.1.pod0000644000175100017510000000367312575647264017246 0ustar mohanmohan=head1 NAME ohdomainlist - A openhpi sample application that shows information about domains on the level of the openhpi base library. =head1 SYNOPSIS hpidomain [-h -V -X] hpidomain [--help] [--verbose] [--debug] =head1 DESCRIPTION ohdomainlist displays the list of domains known to the openhpi base library. In verbose mode, it displays more information about those domains. Clients can only access domains known to the library. Please note that ohdomainlist can only display the domains defined in the openhpiclient.conf file as specified in the OPENHPICLIEN_CONF environment variable. Dynamic changes of the domain list done using the oHpiDomainAdd and oHpiDomainAddById API are valid only for the life-time of the client library. If no domain or host is selected, ohdomainlist lists the domains as specified in the openhpiclient.conf file. =head1 OPTIONS =head2 Help Options: =over 2 =item B<-h>, B<--help> Show help options =back =head2 Application Options: =over 2 =item B<-D>, B<--domain>=I Select domain id nn =item B<-X>, B<--debug> Display debug messages =item B<-V>, B<--verbose> Verbose mode =item B<-N>, B<--host>=I<"host[:port]"> Open session to the domain served by the daemon at the specified URL (host:port). This option overrides the OPENHPI_DAEMON_HOST and OPENHPI_DAEMON_PORT environment variables. =item B<-C>, B<--cfgfile>=I<"file"> Use passed file as client configuration file. This option overrides the OPENHPICLIENT_CONF environment variable. =back =head1 SEE ALSO hpi_shell hpialarms hpifan hpipower hpithres hpidomain hpigensimdata hpireset hpitop hpiel hpiiinv hpisensor hpitree hpievents hpionIBMblade hpisettime hpiwdt hpixml ohhandler ohparam =head1 AUTHORS Authors of this man page: Ulrich Kleber (ulikleber@users.sourceforge.net) Anton Pak (avpak@users.sourceforge.net) openhpi-3.6.1/docs/man/hpifan.1.pod0000644000175100017510000000366012575647264016015 0ustar mohanmohan=head1 NAME hpifan - An openhpi sample application that shows "Fan Control" management instruments =head1 SYNOPSIS hpifan [-D nn] [-N host[:port]] [-C ] [-h] [-s auto|nn] [-X] hpifan [--domain=nn] [--host=host[:port]] [--cfgfile=file] [--help] [--speed=auto|nn] [--debug] =head1 DESCRIPTION hpifan walks the RPT (Resource Present Table) for resouces that have "Fan Control" management instruments (SAHPI_CTRL_FAN_SPEED). If no domain or host is selected, hpifan uses the default domain as specified in the openhpiclient.conf file. =head1 OPTIONS =head2 Help Options: =over 2 =item B<-h>, B<--help> Show help options =back =head2 Application Options: =over 2 =item B<-s>, B<--speed>=I Set fan speed for ALL fans in domain speed is a number or "auto" for setting fan in auto mode =item B<-D> I, B<--domain>=I Select domain id I =item B<-X>, B<--debug> Display debug messages =item B<-N> I<"host[:port]">, B<--host>=I<"host[:port]"> Open session to the domain served by the daemon at the specified URL (host:port). This option overrides the OPENHPI_DAEMON_HOST and OPENHPI_DAEMON_PORT environment variables. If host contains ':' (for example IPv6 address) then enclose it in square brackets. For example: I<"[::1]"> or I<"[::1]:4743">. =item B<-C> I<"file">, B<--cfgfile>=I<"file"> Use passed file as client configuration file. This option overrides the OPENHPICLIENT_CONF environment variable. =back =head1 SEE ALSO hpi_shell hpialarms hpigensimdata hpireset hpitop hpidomain hpiinv hpisensor hpitree hpiel hpionIBMblade hpisettime hpiwdt hpievents hpipower hpithres hpixml ohdomainlist ohhandler ohparam =head1 AUTHORS Authors of this man page: Peter D Phan (pdphan@users.sourceforge.net) Ulrich Kleber (ulikleber@users.sourceforge.net) Anton Pak (avpak@users.sourceforge.net) openhpi-3.6.1/docs/man/ohparam.1.pod0000644000175100017510000000525712575647264016203 0ustar mohanmohan=head1 NAME ohparam - An openhpi sample application that uses the openhpi additional interface to control openhpi configuration parameters =head1 SYNOPSIS ohparam [-D nn] [-N host[:port]] [-C ] [-X] get ohparam [-D nn] [-N host[:port]] [-C ] [-X] set ohparam [--domain nn] [--host=host[:port]] [--cfgfile=file] [--debug] get ohparam [--domain nn] [--host=host[:port]] [--cfgfile=file] [--debug] set =head1 DESCRIPTION ohparam get will display all global configuration parameters of the openhpi daemon for the specified domain. ohparam set will change the given global configuration parameters of the openhpi daemon for the specified domain to the new value. If no domain or host is selected, ohparam uses the default domain as specified in the openhpiclient.conf file. =head1 COMMANDS =over 2 Command get: display info about all global parameters no specific arguments Command set: one of the daemon's global parameters: (without the OPENHPI prefix) LOG_ON_SEV, EVT_QUEUE_LIMIT, DEL_SIZE_LIMIT, DEL_SAVE DAT_SIZE_LIMIT, DAT_USER_LIMIT, DAT_SAVE PATH, VARPATH, CONF and the desired new value. Example: ohparam set DEL_SIZE_LIMIT 20000 =back =head1 OPTIONS =head2 Help Options: =over 2 =item B<-h>, B<--help> Show help options =back =head2 Application Options: =over 2 =item B<-D> I, B<--domain>=I Select domain id I =item B<-X>, B<--debug> Display debug messages =item B<-N> I<"host[:port]">, B<--host>=I<"host[:port]"> Open session to the domain served by the daemon at the specified URL (host:port). This option overrides the OPENHPI_DAEMON_HOST and OPENHPI_DAEMON_PORT environment variables. If host contains ':' (for example IPv6 address) then enclose it in square brackets. For example: I<"[::1]"> or I<"[::1]:4743">. =item B<-C> I<"file">, B<--cfgfile>=I<"file"> Use passed file as client configuration file. This option overrides the OPENHPICLIENT_CONF environment variable. =back =head1 SEE ALSO hpi_shell hpialarms hpifan hpipower hpithres hpidomain hpigensimdata hpireset hpitop hpiel hpiiinv hpisensor hpitree hpievents hpionIBMblade hpisettime hpiwdt hpixml ohdomainlist ohhandler =head1 AUTHORS Authors of this man page: Ulrich Kleber (ulikleber@users.sourceforge.net) Anton Pak (avpak@users.sourceforge.net) openhpi-3.6.1/docs/man/hpipower.1.pod0000644000175100017510000000417312575647264016405 0ustar mohanmohan=head1 NAME hpipower - This sample openhpi application exercises HPI Power Management APIs. =head1 SYNOPSIS hpipower [ -D nn ] [-N host[:port]] [-C ] [ -d -p -r -u -X -h] [ -b n ] hpipower [--domain=nn] [--host=host[:port]] [--cfgfile=file] [--power-down --power-up --reset --unattended --debug --help] [--blade=n ] =head1 DESCRIPTION hpipower searches the Resource Presence Table (RPT) for resources with Power Capability. It sends the requested power action to the selected target. If no domain or host is selected, hpipower uses the default domain as specified in the openhpiclient.conf file. =head1 OPTIONS =head2 Help Options: =over 2 =item B<-h>, B<--help> Show help options =back =head2 Application Options: =over 2 =item B<-d>, B<--power-down> Power down target object =item B<-p>, B<--power-up> Power on target object =item B<-r>, B<--reset> Reset target object =item B<-u>, B<--unattended> Unattended =item B<-b> I, B<--blade>=I Specify blade I (1...n) =item B<-D> I, B<--domain>=I Select domain id I =item B<-X>, B<--debug> Display debug messages =item B<-N> I<"host[:port]">, B<--host>=I<"host[:port]"> Open session to the domain served by the daemon at the specified URL (host:port). This option overrides the OPENHPI_DAEMON_HOST and OPENHPI_DAEMON_PORT environment variables. If host contains ':' (for example IPv6 address) then enclose it in square brackets. For example: I<"[::1]"> or I<"[::1]:4743">. =item B<-C> I<"file">, B<--cfgfile>=I<"file"> Use passed file as client configuration file. This option overrides the OPENHPICLIENT_CONF environment variable. =back =head1 SEE ALSO hpi_shell hpialarms hpifan hpireset hpitop hpidomain hpigensimdata hpisensor hpitree hpiel hpiiinv hpisettime hpiwdt hpievents hpionIBMblade hpithres hpixml ohdomainlist ohhandler ohparam =head1 AUTHORS Authors of this man page: Peter D Phan (pdphan@users.sourceforge.net) Ulrich Kleber (ulikleber@users.sourceforge.net) Anton Pak (avpak@users.sourceforge.net) openhpi-3.6.1/docs/man/openhpid.8.pod0000644000175100017510000001210412575647264016356 0ustar mohanmohan=head1 NAME openhpid - HPI instance to which multiple clients can connect. =head1 SYNOPSIS openhpid -c config_file [OPTION] =head1 DESCRIPTION The OpenHPI daemon runs as a background process and accepts connections from remote clients that invoke HPI function calls. The daemon wraps the OpenHPI library with a sockets-based API that is archicture neutral for all types of clients. When you run the daemon, the standard method for locating the OpenHPI configuration file is used. However, the daemon will accept a configuration file as a command line option (-c) to override the default file. A command option (-p) or environment variable determines the port number the daemon will listen on for client connections. The default port is 4743. The daemon creates a PID file in the /var/run subdirectory. This directory is only writable by the root user. Thus the daemon will fail when run as a normal user if the PID file location is not overridden. To override the PID file location you can use the -f command line option. The client and the daemon do not have to be on the same hardware architecture. The daemon could be running on a P-series processor and the client running on an x86-series processor. The client library and daemon use a marshaling technique to resolve architecture and structure padding conflicts. The user does not need to concern themselves with architectureal differences between the client and daemon. The one exception to this rule is 64-bit architectures. The client and daemon currently cannot resolve differences between 32-bit and 64-bit architectures. =head1 OPTIONS =over 4 =item B<-c>, B<--cfg>=I Sets path/name of the configuration file. This option is required unless the environment variable OPENHPI_CONF has been set to a valid configuration file. =item B<-v>, B<--verbose> This option causes the daemon to display verbose messages. This option is optional. =item B<-b>, B<--bind>=I Bind address for the daemon socket. Also bind address can be specified with OPENHPI_DAEMON_BIND_ADDRESS environment variable. No bind address is used by default. =item B<-p>, B<--port>=I Overrides the default listening port (4743) of the daemon. The option is optional. =item B<-f>, B<--pidfile>=I Overrides the default path/name for the daemon pid file. The option is optional. =item B<-s>, B<--timeout>=I Overrides the default socket read timeout of 30 minutes. The option is optional. =item B<-t>, B<--threads>=I Sets the maximum number of connection threads. The default is umlimited. The option is optional. =item B<-n>, B<--nondaemon> Forces the code to run as a foreground process and NOT as a daemon. The default is to run as a daemon. The option is optional. =item B<-6>, B<--ipv6> The daemon will try to bind IPv6 socket. =item B<-4>, B<--ipv4> The daemon will try to bind IPv4 socket (default). IPv6 option takes precedence over IPv4 option. =item B<-4 -6> The daemon will try to bind IPv4 or IPv6 socket. =back =head1 ENVIRONMENTAL VARIABLES All of these environment variables can instead be set in the openhpi.conf configuration file, except for OPENHPI_DAEMON_PORT and OPENHPI_CONF. =over 4 =item B=PORT_NUMBER The port number the host will listen on for clent connections. Default port is 4743. =item B Valus can be one of: CRITICAL,MAJOR,MINOR,INFORMATIONAL,OK,DEBUG. Events of this severity or higher will be logged to the domain event log. The default is MINOR. =item B=NUMBER Maximum number of events allowed in a subscribed session's queue. Default is 10000. =item B=NUMBER Maximum number of events allowed in the domain event log. Default is 10000 =item B Set to YES to persist the domain event logs to disk. They will be loaded in case the daemon restarts. Default is NO. =item B=NUMBER Maximum number of alarms allowed in the domain alarm table. Default is unlimited. =item B=NUMBER Maximum number of user alarms allowed in the domain alarm table. Default is unlimited. =item B Set to YES to persist the domain alarm tables to disk. They will be loaded in case the daemon restarts. Default is NO. =item B="/path/to/plugins:/another/path/to/plugins" This is a colon delimited list of directories used when searching for an OpenHPI plugin to load. The default is $prefix/lib/openhpi. =item B="/path/to/dir" This sets the directory used to store openhpi internal data. The domain event logs and alarm tables are saved there (if configured to) along with resource ID to entity path mappings. Default is $prefix/var/lib/openhpi. =item B="/path/to/configurationg/file" This is another way of telling the daemon where to find the configuration file. =back =head1 SEE ALSO The following man pages may also be of interest =over 4 =item B General information about OpenHPI =back =head1 AUTHORS Authors of this man page: Renier Morales (renier@openhpi.org) Anton Pak (avpak@users.sourceforge.net) openhpi-3.6.1/docs/man/hpitree.1.pod0000644000175100017510000000514112575647264016204 0ustar mohanmohan=head1 NAME hpitree - A openhpi sample application that shows in details the resources (rpt's) and resources' manamegement instruments (rdr's) data structures of the managed openHPI complex. =head1 SYNOPSIS hpitree [-D nn] [-N host[:port]] [-C ] [-acdiorsw ] [-n nn] [-X] [-h] hpitree [--domain=nn] [--host=host[:port]] [--cfgfile=file] [--all] [--controls] [--rdrs] [--inventories] [--rpts] [--sensors] [--watchdogs] [--overview] [--resource=nn] [--debug] [--help] =head1 DESCRIPTION hpitree walks the Resource Presence Table (RPT) of the managed openHPI complex, and displays in details the resources (rpt's) and resources' management instruments (rdr's) data structures. If no domain or host is selected, hpitree uses the default domain as specified in the openhpiclient.conf file. =head1 OPTIONS (No Option) Display all rpts and rdrs =head2 Help Options: =over 2 =item B<-h>, B<--help> Show help options =back =head2 Application Options: =over 2 =item B<-a>, B<--all> Display all rpts and rdrs (default) =item B<-r>, B<--rpts> Display only rpts =item B<-d>, B<--rdrs> Display rdr records =item B<-o>, B<--overview> Display system overview: rpt & rdr headers =item B<-s>, B<--sensors> Display only sensors =item B<-c>, B<--controls> Display only controls =item B<-w>, B<--watchdogs> Display only watchdogs =item B<-i>, B<--inventories> Display only inventories =item B<-n> I, B<--resource>=I Display only resource I and its topology =item B<-D> I, B<--domain>=I Select domain id I =item B<-X>, B<--debug> Display debug messages =item B<-N> I<"host[:port]">, B<--host>=I<"host[:port]"> Open session to the domain served by the daemon at the specified URL (host:port). This option overrides the OPENHPI_DAEMON_HOST and OPENHPI_DAEMON_PORT environment variables. If host contains ':' (for example IPv6 address) then enclose it in square brackets. For example: I<"[::1]"> or I<"[::1]:4743">. =item B<-C> I<"file">, B<--cfgfile>=I<"file"> Use passed file as client configuration file. This option overrides the OPENHPICLIENT_CONF environment variable. =back =head1 SEE ALSO hpi_shell hpialarms hpifan hpipower hpithres hpidomain hpigensimdata hpireset hpitop hpiel hpiiinv hpisensor hpiwdt hpievents hpionIBMblade hpisettime hpixml ohdomainlist ohhandler ohparam =head1 AUTHORS Authors of this man page: Peter D Phan (pdphan@users.sourceforge.net) Ulrich Kleber (ulikleber@users.sourceforge.net) Anton Pak (avpak@users.sourceforge.net) openhpi-3.6.1/docs/man/hpiel.1.pod0000644000175100017510000000634012575647264015647 0ustar mohanmohan=head1 NAME hpiel - An openhpi sample application that displays HPI event log entries. =head1 SYNOPSIS hpiel [-D nn] [-N host[:port]] [-C ] [-d] [-E entity-path] [-c -p -r -X -h ] hpiel [--domain=nn] [--host=host[:port]] [--cfgfile=file] [--del] [--entity-path="entitypath"] [--clear --resource --rdr --debug --help] =head1 DESCRIPTION hpiel searches the RPT (Resource Present Table) for resources with SAHPI_CAPABILITY_EVENT_LOG and displays event log entries for resources found. If no domain is selected, hpiel uses a session with the default domain. The selected domain id must be configured via the openhpidclient.conf file specified in the environment. =head1 OPTIONS =head2 Help Options: =over 2 =item B<-h>, B<--help> Show help options =back =head2 Application Options: =over 2 =item B<-d>, B<--del> Display domain event log entries =item B<-c>, B<--clear> Clear log before reading event log entries =item B<-p>, B<--resource> Pull resource info along with log entry =item B<-r>, B<--rdr> Pull RDR info along with log entry =item B<-E> I<"epath">, B<--entity-path>=I<"epath"> Use entity path epath and display resource =item B<-D> I, B<--domain>=I Select domain id I =item B<-X>, B<--debug> Display debug messages =item B<-N> I<"host[:port]">, B<--host>=I<"host[:port]"> Open session to the domain served by the daemon at the specified URL (host:port). This option overrides the OPENHPI_DAEMON_HOST and OPENHPI_DAEMON_PORT environment variables. If host contains ':' (for example IPv6 address) then enclose it in square brackets. For example: I<"[::1]"> or I<"[::1]:4743">. =item B<-C> I<"file">, B<--cfgfile>=I<"file"> Use passed file as client configuration file. This option overrides the OPENHPICLIENT_CONF environment variable. =back If neither B<-d> or B<-E> I<"epath"> are specified, event log entries will be shown for all supporting resources by default. =head1 HPI APIs uniquely used in this application =over 2 SaErrorT SAHPI_API saHpiEventLogInfoGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiEventLogInfoT *Info ); SaErrorT SAHPI_API saHpiEventLogEntryGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiEventLogEntryIdT EntryId, SAHPI_OUT SaHpiEventLogEntryIdT *PrevEntryId, SAHPI_OUT SaHpiEventLogEntryIdT *NextEntryId, SAHPI_OUT SaHpiEventLogEntryT *EventLogEntry, SAHPI_INOUT SaHpiRdrT *Rdr, SAHPI_INOUT SaHpiRptEntryT *RptEntry ); SaErrorT SAHPI_API saHpiEventLogClear ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId ); =back =head1 SEE ALSO hpi_shell hpialarms hpigensimdata hpireset hpitop hpidomain hpiinv hpisensor hpitree hpievents hpionIBMblade hpisettime hpiwdt hpifan hpipower hpithres hpixml ohdomainlist ohhandler ohparam =head1 AUTHORS Authors of this man page: Peter D Phan (pdphan@users.sourceforge.net) Ulrich Kleber (ulikleber@users.sourceforge.net) Anton Pak (avpak@users.sourceforge.net) openhpi-3.6.1/docs/Makefile.am0000644000175100017510000000313012575647264015156 0ustar mohanmohan# # Copyright (c) 2003, Intel Corporation # All rights reserved. # # Redistribution and use in source and binary forms, with or # without modification, are permitted provided that the following # conditions are met: # # Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the distribution. # # Neither the name of Intel Corporation nor the names # of its contributors may be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, # OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # MAINTAINERCLEANFILES = Makefile.in SUBDIRS = @MAN@ DIST_SUBDIRS = man openhpi-3.6.1/scripts/0000755000175100017510000000000012605014600013634 5ustar mohanmohanopenhpi-3.6.1/scripts/test/0000755000175100017510000000000012605014600014613 5ustar mohanmohanopenhpi-3.6.1/scripts/test/Makefile.am0000644000175100017510000000566312575647264016711 0ustar mohanmohan# # Copyright (c) 2003, Intel Corporation # All rights reserved. # # Redistribution and use in source and binary forms, with or # without modification, are permitted provided that the following # conditions are met: # # Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the distribution. # # Neither the name of Intel Corporation nor the names # of its contributors may be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, # OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # REPORTDIR = report_html CONFORMDIR = conform_html SERVER = shell1.sf.net RDIR = /home/groups/o/op/openhpi/htdocs/coverage_report CONFORMRDIR = /home/groups/o/op/openhpi/htdocs/conform_report SFUSER = $(shell if test $(SFUID) != "" > /dev/null 2>&1; then echo $(SFUID); else echo $(USER); fi;) MAINTAINERCLEANFILES = Makefile.in MOSTLYCLEANFILES = @TEST_CLEAN@ # we want all the local perl programs EXTRA_DIST = $(shell ls *pl) clean-local: rm -rf $(REPORTDIR) $(CONFORMDIR) report: ./testcoverage.pl ./coverage_report.pl conform: ./testconformance.pl ./conformance_report.pl pconform: -chmod a+x $(shell echo $(CONFORMDIR)/*html) -echo "XBitHack on" > $(CONFORMDIR)/.htaccess -echo "Options +Indexes" >> $(CONFORMDIR)/.htaccess -rsync -e ssh -rP --delete $(CONFORMDIR)/ $(SERVER):$(CONFORMRDIR) -ssh $(SERVER) "find $(CONFORMRDIR) -user `whoami` -exec chmod g+w {} \;" -ssh $(SERVER) "find $(CONFORMRDIR) -user `whoami` -type d -exec chmod g+s {} \;" preport: -chmod a+x $(shell echo $(REPORTDIR)/*html) -echo "XBitHack on" > $(REPORTDIR)/.htaccess -echo "Options +Indexes" >> $(REPORTDIR)/.htaccess -rsync -e ssh -rP --delete $(REPORTDIR)/ $(SFUSER)@$(SERVER):$(RDIR) -ssh $(SFUSER)@$(SERVER) "find $(RDIR) -user $(SFUSER) -exec chmod g+w {} \;" -ssh $(SFUSER)@$(SERVER) "find $(RDIR) -user $(SFUSER) -type d -exec chmod g+s {} \;" publish-conform:: conform pconform publish-report:: report preport openhpi-3.6.1/scripts/test/coverage_report.pl0000755000175100017510000000225112575647264020371 0ustar mohanmohan#!/usr/bin/perl # $Id: coverage_report.pl 2657 2005-01-17 04:37:20Z renierm $ # (C) Copyright IBM Corp. 2004 # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # Authors: # Sean Dague use strict; #my @dirs = qw(src utils plugins/snmp_bc plugins/snmp_bc/t); my @dirs = qw(src utils); my $outdir = "report_html"; mkdir $outdir, 0755; foreach my $dir (@dirs) { opendir(DIR,"../$dir"); while(my $file = readdir(DIR)) { my $safename = $dir; $safename =~ s{/}{_}g; $safename .= "_"; if($file =~ /\.gcov$/) { system("./gcov2html.pl ../$dir/$file > $outdir/$safename$file.html"); } elsif ($file =~ /\.summary$/) { system("./gsum2html.pl ../$dir/$file > $outdir/$safename$file.html"); } } closedir(DIR); } system("./generate_index.pl $outdir > $outdir/index.html"); openhpi-3.6.1/scripts/test/gsum2html.pl0000755000175100017510000000572612575647264017137 0ustar mohanmohan#!/usr/bin/perl # $Id: gsum2html.pl 2657 2005-01-17 04:37:20Z renierm $ # (C) Copyright IBM Corp. 2004 # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # Authors: # Sean Dague use strict; use HTML::Entities; foreach my $file (@ARGV) { # my $outfile = $file . ".html"; open(IN,"$file"); my @lines = ; close(IN); my $html = make_html_head($file); $html .= make_html_body(@lines); $html .= make_html_tail(); if(scalar(@lines) > 5) { print $html; } # open(OUT,">$outfile"); # print OUT $html; # close(OUT); } sub make_html_head { my $title = shift; $title =~ s/.*\/(.*)\.summary$/$1/; return < GCOV Report for $title

GCOV Summary for $title

END } sub make_html_tail { return <
END } sub set_status { my $exec = shift; if($exec eq "-") { return "na"; } elsif($exec eq "#####") { return "notexec"; } elsif($exec < 10) { return "low"; } else { return "good"; } } sub make_html_body { my @lines = @_; my $html; my $count = 0; foreach my $line (@lines) { if ($line =~ /^No/) { $html .= "$line\n"; if (($count%4) == 3) { # close the last table $html .= "\n"; } if ($line =~ /^No branches/) { $count = $count + 1; } $count = $count + 1; } elsif ($line =~ /(\d+\.\d{2})%/) { my $per = $1; my $status = "bad"; my $boundary; if ($line =~ /(in function )(.+)$/) { $boundary .= "

$2

\n\n"; } elsif ($line =~ /(in file )(.+)$/) { $boundary .= "

$2

\n
\n" } $line =~ s/$1$2//; if (($count%4) == 0) { $html .= $boundary; } if($per >= 100) { $status = "great"; } elsif($per > 80) { $status = "good"; } elsif($per > 50) { $status = "ok"; } $html .= "\n"; if (($count%4) == 3) { # close the last table $html .= "
$line
\n"; } $count = $count + 1; } } return $html; } openhpi-3.6.1/scripts/test/testconformance.pl0000755000175100017510000000457512575647264020410 0ustar mohanmohan#!/usr/bin/perl # $Id: testconformance.pl 7043 2010-02-16 21:31:59Z avpak $ # (C) Copyright IBM Corp. 2004 # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # Authors: # Sean Dague use strict; use Cwd; use File::Basename; chdir("../../"); my $start = cwd(); # set up env my $plugroot = "$start/plugins"; $ENV{OPENHPI_CONF} = "$start/openhpi.conf"; $ENV{OPENHPI_UID_MAP} = "$start/uid_map"; $ENV{LD_LIBRARY_PATH} .= "$start/baselib/.libs:$start/utils/.libs"; $ENV{LIBRARY_PATH} .= "$start/baselib/.libs:$start/utils/.libs"; $ENV{OPENHPI_PATH} .= "$plugroot/dummy:$plugroot/ipmi:$plugroot/ipmidirect:$plugroot/watchdog:$plugroot/sysfs:$plugroot/text_remote:$plugroot/snmp_bc"; # first we have to rebuild the library with --enable-testcover system("./bootstrap && ./configure --enable-testcover @ARGV && make clean && make"); chdir("../hpitest"); system("./hpitest --clean --hpiversion B.1.01 openhpi"); foreach my $dir (qw(src utils)) { chdir($start); my $report = ""; chdir($dir); my @files = (); # We are only testing files in openhpi/src for conformance coverage opendir(IN,"."); while(my $file = readdir(IN)) { if($file =~ /\.c$/) { push @files, "$file"; } } close(IN); foreach my $file (@files) { print STDERR "Cwd is now" . cwd() . "\n"; my $cmd = "gcov -blf -o .libs $file"; my $report = "Coverage Report for $dir/$file\n\n"; my $body = ""; my $header = ""; open(GCOV,"$cmd |"); while() { if(s{^(File.*)($file)}{$1$dir/$file}) { $header .= $_; # File $header .= ; # Lines $header .= ; # Branches $header .= ; # Taken $header .= ; # Calls $header .= "\n"; last; # and now we are *done* } else { $body .= $_; } } close(GCOV); open(OUT,">$file.summary"); print OUT $report, $header, $body; close(OUT); } } openhpi-3.6.1/scripts/test/generate_index.pl0000755000175100017510000000452612575647264020173 0ustar mohanmohan#!/usr/bin/perl # $Id: generate_index.pl 2267 2004-11-01 20:15:18Z sdague $ # (C) Copyright IBM Corp. 2004 # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # Authors: # Sean Dague use strict; use HTML::Entities; my $dir = shift; opendir(IN,"$dir"); my @files = (); while(my $file = readdir(IN)) { push @files, $file; } closedir(IN); my $html = make_html_head(); $html .= make_html_body($dir, @files); $html .= make_html_tail(); print $html; sub make_html_head { return < Test Coverage Analysis

Test Coverage Analysis

END } sub make_html_tail { return <
END } # ok, here is a set of assumptions, which should hold true # # 1. .c.summary.html files will exist for everything we care about # 2. a .c.gcov.html file will exist for each # 3. my regex skills are honed enough to pull up the table from .c.summary.html file sub make_html_body { my $dir = shift; my @files = @_; my $html; foreach my $file (sort @files) { if($file =~ /\.c\.summary\.html$/) { next if(-z "$dir/$file"); my $name = $file; $name =~ s/.summary.html//; $html .= slurp_summary_table($name, "$dir/$file"); $html .= "Full Coverage Report
\n"; $html .= "Detailed Execution Report
\n"; } } return $html; } sub slurp_summary_table { my ($name, $file) = @_; open(IN,"$file"); local $/ = undef; my $content = ; close(IN); my $snip = ""; if($content =~ m{(

.*?

\s*)}igs) { $snip = $1; } return $snip; } openhpi-3.6.1/scripts/test/gcov2html.pl0000755000175100017510000000550312575647264017113 0ustar mohanmohan#!/usr/bin/perl # $Id: gcov2html.pl 2268 2004-11-01 21:30:21Z sdague $ # (C) Copyright IBM Corp. 2004 # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # Authors: # Sean Dague use strict; use HTML::Entities; foreach my $file (@ARGV) { # my $outfile = $file . ".html"; open(IN,"$file"); my @lines = ; close(IN); my $html = make_html_head($file); $html .= make_html_body(parse_gcov(@lines)); $html .= make_html_tail(); print $html; # open(OUT,">$outfile"); # print OUT $html; # close(OUT); } sub make_html_head { my $title = shift; $title =~ s/.*\/(.*)\.gcov$/$1/; return < GCOV execution analyis for $title \n"; $linecount++; } return $html; } sub parse_gcov { my @in = @_; my $lines = []; foreach my $line (@in) { if($line =~ /^\s+(.*?):\s+(.*?):(.*)/) { my $hash = { exec => $1, line => $2, data => $3, }; push @$lines, $hash; } } return $lines; } openhpi-3.6.1/scripts/test/conformance_report.pl0000755000175100017510000000215312575647264021071 0ustar mohanmohan#!/usr/bin/perl # $Id: conformance_report.pl 2269 2004-11-01 22:19:44Z sdague $ # (C) Copyright IBM Corp. 2004 # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # Authors: # Sean Dague use strict; my @dirs = qw(src utils); my $outdir = "conform_html"; mkdir $outdir, 0755; foreach my $dir (@dirs) { opendir(DIR,"../$dir"); while(my $file = readdir(DIR)) { my $safename = $dir; $safename =~ s{/}{_}g; $safename .= "_"; if($file =~ /\.gcov$/) { system("./gcov2html.pl ../$dir/$file > $outdir/$safename$file.html"); } elsif ($file =~ /\.summary$/) { system("./gsum2html.pl ../$dir/$file > $outdir/$safename$file.html"); } } closedir(DIR); } system("./generate_index.pl $outdir > $outdir/index.html"); openhpi-3.6.1/scripts/test/testcoverage.pl0000755000175100017510000000737412575647264017711 0ustar mohanmohan#!/usr/bin/perl # $Id: testcoverage.pl 5778 2006-05-17 00:27:15Z renierm $ # (C) Copyright IBM Corp. 2004-2006 # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # Authors: # Sean Dague use strict; use Cwd; use File::Basename; chdir("../../"); my $start = cwd(); my $report = ""; # this needs to be made more generic over time my %files = ( "src/ohpi.c" => ".libs", "utils/el_utils.c" => "t/el", "utils/epath_utils.c" => "t/epath", "utils/rpt_utils.c" => "t/rpt", "utils/uid_utils.c" => "t/uid", "utils/sahpi_enum_utils.c" => "t/sahpi", "utils/sahpi_event_encode.c" => "t/sahpi", "utils/sahpi_event_utils.c" => "t/sahpi", "utils/sahpi_struct_utils.c" => "t/sahpi", "utils/sahpi_time_utils.c" => "t/sahpi", # now for the blade center stuff # "plugins/snmp_bc/snmp_bc.c" => "t", # "plugins/snmp_bc/snmp_bc_control.c" => "t", # "plugins/snmp_bc/snmp_bc_discover.c" => "t", # "plugins/snmp_bc/snmp_bc_event.c" => "t", # "plugins/snmp_bc/snmp_bc_hotswap.c" => "t", # "plugins/snmp_bc/snmp_bc_inventory.c" => "t", # "plugins/snmp_bc/snmp_bc_sel.c" => "t", # "plugins/snmp_bc/snmp_bc_sensor.c" => "t", # "plugins/snmp_bc/snmp_bc_session.c" => "t", # "plugins/snmp_bc/snmp_bc_time.c" => "t", # "plugins/snmp_bc/snmp_bc_utils.c" => "t", # "plugins/snmp_bc/snmp_bc_watchdog.c" => "t", # "plugins/snmp_bc/t/bc_str2event.c" => ".libs", # "plugins/snmp_bc/t/snmp_bc.c" => ".libs", # "plugins/snmp_bc/t/snmp_bc_control.c" => ".libs", # "plugins/snmp_bc/t/snmp_bc_discover.c" => ".libs", # "plugins/snmp_bc/t/snmp_bc_event.c" => ".libs", # "plugins/snmp_bc/t/snmp_bc_hotswap.c" => ".libs", # "plugins/snmp_bc/t/snmp_bc_inventory.c" => ".libs", # "plugins/snmp_bc/t/snmp_bc_sel.c" => ".libs", # "plugins/snmp_bc/t/snmp_bc_sensor.c" => ".libs", # "plugins/snmp_bc/t/snmp_bc_session.c" => ".libs", # "plugins/snmp_bc/t/snmp_bc_time.c" => ".libs", # "plugins/snmp_bc/t/snmp_bc_utils.c" => ".libs", # "plugins/snmp_bc/t/snmp_bc_watchdog.c" => ".libs", # "plugins/snmp_bc/t/snmp_util.c" => ".libs", ); # we must ensure that we have coverage created system("./bootstrap && ./configure --enable-testcover @ARGV && make clean && make && make -sk check"); #system("make -ks clean check"); foreach my $fullfile (sort keys %files) { chdir($start); my $file = basename($fullfile); my $dir = dirname($fullfile); chdir($dir); print STDERR "Cwd is now" . cwd() . "\n"; my $cmd = "gcov -blf -o $files{$fullfile} $file"; my $report = "Coverage Report for $fullfile\n\n"; my $body = ""; my $header = ""; open(GCOV,"$cmd |"); while() { if(s{^(File.*)($file)}{$1$dir/$file}) { $header .= $_; # File $header .= ; # Lines $header .= ; # Branches $header .= ; # Taken $header .= ; # Calls $header .= "\n"; last; # and now we are *done* } else { $body .= $_; } } close(GCOV); open(OUT,">$file.summary"); print OUT $report, $header, $body; close(OUT); } openhpi-3.6.1/scripts/SaHpi2code.pl0000755000175100017510000010074412575647264016153 0ustar mohanmohan#!/usr/bin/perl ####################################################################### # (C) COPYRIGHT IBM Corp 2004 # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # # Author(s): # Steve Sherman ######################################################################## ######################################################################## # Script Description: # # This script reads SaHpi.h and generates the C code necessary to # print the string definitions of the SaHpi.h's enum typedefs (and some # #defines). The idea is to automatically generate and centralize these # utility functions for use in OpenHPI client and testing programs. # # These utility functions can also be used to determine if an arbitrary # value is valid for a given enum typedef (a NULL return code indicates # an invalid value). # # Script also generates code to support SaHpi_event_utils.c routines. # # This script is run as part of the OpenHPI build process. # # Script Input: # # --debug (optional) Turn on debug info. # Default is no. # --ifile (optional) Full path name to header file, including the # header's filename. # Default is "current_directory/SaHpi.h". # --atca (optional) Auto-generating should take account of additional # ATCA spec (SaHpiAtac.h). # --odir (optional) Directory for generated output files. # Default is current directory. # --tdir (optional) Directory for generated testcase files. # If not defined; no testcase files are generated; # Exit codes # - 0 successful # - 1 error occurred ######################################################################### use strict; use Getopt::Long; GetOptions( "debug" => \my $debug, "atca" => \my $atca, "ifile=s" => \my $ifile, "odir=s" => \my $odir, "tdir=s" => \my $tdir, ); sub normalize_file(*); sub parse_category_events(*$); sub print_copywrite(*); sub print_hfile_header(*$); sub print_cfile_header; sub print_xfile_header; sub print_xhfile_header; sub print_testfile_header; sub print_xtestfile_header; sub beautify_type_name($); sub print_hfile_func($$); sub print_cfile_func($); sub beautify_enum_name($$); sub print_cfile_case($$); sub print_cfile_encode_array_header($); sub print_cfile_encode_array($$); sub print_cfile_encode_func($); sub print_testfile_case($$); sub print_xtestfile_case($$$); sub print_xtestfile_badevent($); sub print_cfile_endfunc; sub print_testfile_endfunc($); sub print_hfile_ending(*); sub print_testfile_ending; sub print_xtestfile_ending; ###################################### # Main Code - Set directory/file names ###################################### my $cur_dir = `pwd`; chomp $cur_dir; if ($ifile eq "") { $ifile = $cur_dir . "/SaHpi.h"; } if ($odir eq "") { $odir = $cur_dir; } #if ($oname eq "") { my ($dir, $base, $ext) = ($ifile =~ m:(.*)/([^/]+)\.([^\./]+)$:); ($base, $ext) = ($ifile =~ m:^([^/]+)\.([^\./]+)$:) unless $base; die "cannot find base for file $ifile" unless $base; $base = lc($base); my $ocfile = $base . "_enum_utils.c"; my $ohfile = $base . "_enum_utils.h"; my $oxcfile = $base . "_event_encode.c"; my $oxhfile = $base . "_event_encode.h"; #} #else { # $ocfile = $oname . ".c"; # $ohfile = $oname . ".h"; #} my $file_c = $odir . "/$ocfile"; my $file_h = $odir . "/$ohfile"; my $file_x = $odir . "/$oxcfile"; my $file_xh = $odir . "/$oxhfile"; my ($atca_base) = "sahpiatca"; my ($atca_header) = 0; if ($base eq $atca_base) { $atca_header = 1; } unlink $file_c; unlink $file_h; if (!$atca_header) { unlink $file_x; unlink $file_xh; } open(INPUT_HEADER, $ifile) or die "$0 Error! Cannot open $ifile. $! Stopped"; open(FILE_C, ">>$file_c") or die "$0 Error! Cannot open file $file_c. $! Stopped"; open(FILE_H, ">>$file_h") or die "$0 Error! Cannot open file $file_h. $! Stopped"; if (!$atca_header) { open(FILE_X, ">>$file_x") or die "$0 Error! Cannot open file $file_x. $! Stopped"; open(FILE_XH, ">>$file_xh") or die "$0 Error! Cannot open file $file_xh. $! Stopped"; } my $tbase_name = "$ocfile"; my $txbase_name = "$oxcfile"; $tbase_name =~ s/\.c$/_test\.c/; $txbase_name =~ s/\.c$/_test\.c/; my $tfile = "$tdir/$tbase_name"; my $txfile = "$tdir/$txbase_name"; if ($tdir) { unlink $tfile; open(FILE_TEST, ">>$tfile") or die "$0 Error! Cannot open file $tfile. $! Stopped"; if (!$atca_header) { unlink $txfile; open(XFILE_TEST, ">>$txfile") or die "$0 Error! Cannot open file $txfile. $! Stopped"; } } ######################### # Parse input header file ######################### my $rtn_code = 0; my $cat_type = "SaHpiEventCategoryT"; my $err_type = "SaErrorT"; my $entity_type = "SaHpiEntityTypeT"; my $atca_entity_type = "AtcaHpiEntityTypeT"; my $atca_pretty_type = beautify_type_name($atca_entity_type); my $atca_entity_encode_name = "oh_encode_" . "$atca_pretty_type"; my $atca_entity_lookup_name = "oh_lookup_" . "$atca_pretty_type"; my @cat_array = (); my @err_array = (); my @atca_entity_array = (); my @enum_array = (); my @normalized_array = (); my %category = (); my %global_category = (); if (normalize_file INPUT_HEADER) { $rtn_code = 1; goto CLEANUP; } print_copywrite *FILE_C; print_copywrite *FILE_H; if (!$atca_header) { print_copywrite *FILE_X; print_copywrite *FILE_XH; } if ($tdir) { print_copywrite *FILE_TEST; if (!$atca_header) { print_copywrite *XFILE_TEST; } } print_hfile_header *FILE_H, $ohfile; print_cfile_header(); if (!$atca_header) { print_hfile_header *FILE_XH, $oxhfile; print_xfile_header(); print_xhfile_header(); } if ($tdir) { print_testfile_header(); if (!$atca_header) { print_xtestfile_header(); } } my $in_enum = 0; my $line_count = 0; my $max_global_events = 0; my $max_events = 0; for ( my ($i) = 0; $i < @normalized_array; ++$i ) { $_ = $normalized_array[ $i ]; # Handle SaErrorT definitions my ($err_code) = /^\s*\#define\s+(\w+)\s*\($err_type\).*$/; if ($err_code) { push(@err_array, $err_code); next; } if (/^\s*\($atca_entity_type\).*$/) { $_ = @normalized_array[ $i - 1 ]; my ($atca_entity_code) = /^\s*\#define\s+(\w+).*$/; push(@atca_entity_array, $atca_entity_code); next; } # Handle SaHpiEventCategoryT definitions my ($cat_code) = /^\s*\#define\s+(\w*)\s*\($cat_type\).*$/; if ($cat_code) { push(@cat_array, $cat_code); next; } if ( /^\s*typedef\s+enum.*$/ ) { $in_enum = 1; next; } if ($in_enum) { # Check for end of enum definition - Assumming all on one line my ($enum_end, $enum_type) = /^\s*(\}+)\s*(\w*)\s*\;\s*$/; if ( $enum_end ne "" ) { $in_enum = 0; $line_count++; print_cfile_func($enum_type); my $max_enums = 0; foreach my $case (@enum_array) { $max_enums++; print_cfile_case($enum_type, $case); if ($tdir) { print_testfile_case($enum_type, $case); } } print_cfile_endfunc($enum_type); # Create encoding code print_cfile_encode_array_header($enum_type); foreach my $case (@enum_array) { print_cfile_encode_array($enum_type, $case); } print FILE_C "};\n\n"; print_cfile_encode_func($enum_type); if ($tdir) { print_testfile_endfunc($enum_type); } print_hfile_func($enum_type, $max_enums); @enum_array = (); next; } # Find enum definition - sometimes "{" is on the next line my ($enum_def) = /^\s*\{*\s*(\w+).*$/; if ($enum_def) { push(@enum_array, $enum_def); } } } if ($in_enum) { die "$0 Error! Open enum definition. $! Stopped"; } if ($#err_array > 0) { my $max_enums = 0; $line_count++; print_cfile_func($err_type); foreach my $case (@err_array) { $max_enums++; print_cfile_case($err_type, $case); if ($tdir) { print_testfile_case($err_type, $case); } } print_cfile_endfunc(); # Create encode function print_cfile_encode_array_header($err_type); foreach my $case (@err_array) { print_cfile_encode_array($err_type, $case); } print FILE_C "};\n\n"; print_cfile_encode_func($err_type); if ($tdir) { print_testfile_endfunc($err_type); } print_hfile_func($err_type, $max_enums); } if (($#cat_array > 0) && (!$atca_header)) { my $max_enums = 0; $line_count++; print_cfile_func($cat_type); foreach my $case (@cat_array) { $max_enums++; print_cfile_case($cat_type, $case); if ($tdir) { print_testfile_case($cat_type, $case); } } print_cfile_endfunc(); # Create encode function print_cfile_encode_array_header($cat_type); foreach my $case (@cat_array) { print_cfile_encode_array($cat_type, $case); } print FILE_C "};\n\n"; print_cfile_encode_func($cat_type); if ($tdir) { print_testfile_endfunc($cat_type); } print_hfile_func($cat_type, $max_enums); } if ($#atca_entity_array > 0) { my $max_enums = 0; $line_count++; print_cfile_func($atca_entity_type); foreach my $case (@atca_entity_array) { $max_enums++; print_cfile_case($atca_entity_type, $case); if ($tdir) { print_testfile_case($atca_entity_type, $case); } } print_cfile_endfunc(); # Create encode function print_cfile_encode_array_header($atca_entity_type); foreach my $case (@atca_entity_array) { print_cfile_encode_array($atca_entity_type, $case); } print FILE_C "};\n\n"; print_cfile_encode_func($atca_entity_type); if ($tdir) { print_testfile_endfunc($atca_entity_type); } print_hfile_func($atca_entity_type, $max_enums); } #################################### # Handle event states and categories #################################### if (!$atca_header) { print FILE_X "oh_categorystate_map state_global_strings[] = {\n"; foreach my $gc (keys %global_category) { foreach my $gevt (sort {$global_category{$gc}->{$a}->{value} <=> $global_category{$gc}->{$b}->{value}} keys %{$global_category{$gc}}) { $max_global_events++; if ($debug) { print("CAT=$gc; EVENT=$gevt; STR=$global_category{$gc}->{$gevt}->{string}\n"); } print FILE_X "{SAHPI_EC_UNSPECIFIED, $gevt, \"$global_category{$gc}->{$gevt}->{string}\"},\n"; if ($tdir) { print_xtestfile_case($gevt, "SAHPI_EC_UNSPECIFIED", $global_category{$gc}->{$gevt}->{string}); } } print_xtestfile_badevent("SAHPI_EC_UNSPECIFIED"); } print FILE_X "};\n\n"; print FILE_XH "\#define OH_MAX_STATE_GLOBAL_STRINGS $max_global_events\n"; print FILE_XH "extern oh_categorystate_map state_global_strings[OH_MAX_STATE_GLOBAL_STRINGS];\n\n"; print FILE_X "oh_categorystate_map state_strings[] = {\n"; foreach my $c (keys %category) { foreach my $evt (sort {$category{$c}->{$a}->{value} <=> $category{$c}->{$b}->{value}} keys %{$category{$c}}) { $max_events++; if ($debug) { print("CAT=$c; EVENT=$evt; STR=$category{$c}->{$evt}->{string}\n"); } print FILE_X "{$c, $evt, \"$category{$c}->{$evt}->{string}\"},\n"; if ($tdir) { print_xtestfile_case($evt, $c, $category{$c}->{$evt}->{string}); } } print_xtestfile_badevent($c); } print FILE_X "};\n\n"; print FILE_XH "\#define OH_MAX_STATE_STRINGS $max_events\n"; print FILE_XH "extern oh_categorystate_map state_strings[OH_MAX_STATE_STRINGS];\n\n"; print_hfile_ending *FILE_XH; } print_hfile_ending *FILE_H; if ($tdir) { print_testfile_ending(); if (!$atca_header) { print_xtestfile_ending(); } } CLEANUP: close INPUT_HEADER; close FILE_C; close FILE_H; if (!$atca_header) { close FILE_X; close FILE_XH; } if ($tdir) { close FILE_TEST; if (!$atca_header) { close XFILE_TEST; } } if ($line_count == 0) { print "$0 Warning! No code can be generated from header file - $ifile\n"; unlink $file_c; unlink $file_h; if ($tdir) { unlink $tfile; } } if (($max_events == 0) && (!$atca_header)) { print "$0 Warning! No Events found in header file - $ifile\n"; if ($tdir) { rm $txfile; } } exit ($rtn_code); ############# # Subroutines ############# sub normalize_file(*) { my( $input_handle ) = @_; my $in_comments = 0; my $in_cat = 0; while ( <$input_handle> ) { chomp; # Handle special case for Event Categories and their states if (/^.*\s+SaHpiEventCategoryT\s*==.*$/ ) { parse_category_events($input_handle, $_); } next if /^\s*$/; # Skip blank lines next if /^\s*\/\/.*$/; # Skip // lines next if /^\s*\/\*.*\*\/\s*$/; # Skip /* ... */ lines my $line = $_; ($line) =~ s/^(.*?)\s*$/$1/; # Strip blanks from end of line ($line) =~ s/^(.*?)\/\/.*$/$1/; # Strip trailing C++ comments # Multi-line C comments if ( ( /^.*\/\*.*$/ ) && !( /^.*\*\/.*$/ ) ) { $in_comments = 1; ($line) =~ s/^(.*?)\/\*.*$/$1/; # Get part of line before comment chomp $line; if ($line ne "") { push(@normalized_array, $line); } if ($debug) { print "In multi-line comment section\n"; print "Characters before first comment = $line\n"; } next; } # End C comment if ( !( /^.*\/\*.*$/ ) && ( /^.*\*\/.*$/ ) ) { $in_comments = 0; ($line) =~ s/^.*\*\/(.*?)$/$1/; # Get part of line after comment if ($debug) { print "Out of multi-line comment section\n"; print "Characters after last comment = $line\n"; } } # Embedded single line comment after C code if ( ( /^.*\/\*.*$/ ) && ( /^.*\*\/.*$/ ) ) { my ($token1, $comment, $token2) = /^(.*)(\/\*.*\*\/)+(.*)$/; $line = $token1 . "\n$token2"; if ($debug) { print "Embedded single line comment\n"; print "Line without comment = $line\n"; } } next if ($in_comments); chomp $line; next if ($line eq ""); # Change commas to NLs $line =~ s/,/\n/g; my @fields = split/\n/,$line; foreach my $field (@fields) { chomp $field; push(@normalized_array, $field); } } return 0; } sub parse_category_events(*$) { my ($file_handle, $line) = @_; my $in_global_cat = 0; my @global_events = (); my @cat_list = (); if (/\/) { $in_global_cat = 1; } else { my ($cat, $rest_of_line) = /^.*SaHpiEventCategoryT\s*==\s*(\w+)\s+(.*)$/; if ($debug) { print("CAT=$cat\n"); } push(@cat_list, $cat); # Handle multiple categories || together while ($rest_of_line =~ /\|\|/) { $rest_of_line =~ s/^\|\|//; # Strip off beginning || my ($cat, $rol) = ($rest_of_line =~ /\s*(\w+)\s+(.*)$/); $rest_of_line = $rol; if ($debug) { print("CAT=$cat\n"); } push(@cat_list, $cat); } } # Find events - assume blank lines end #define section; but support # line continuation characters while (($line = <$file_handle>) !~ /^\s*$/) { my ($event_state, $event_hex) = ($line =~ /^\s*\#define\s+(\w+)\s+.*?(0x\w+)\s*$/); if ($event_state eq "") { ($event_state) = ($line =~ /^\s*\#define\s+(\w+)\s+\\\s*$/); if ($event_state) { $line = <$file_handle>; ($event_hex) = ($line =~ /^\s*.*?(0x\w+)\s*$/); die "Cannot parse continuation event line" unless ($event_hex); } } # Push event state definition to global hashes if ($event_state && $event_hex) { my $str = $event_state; $str =~ s/SAHPI_ES_//; if ($in_global_cat) { $global_category{"ANY"}->{$event_state}->{value} = hex($event_hex); $global_category{"ANY"}->{$event_state}->{string} = $str; } else { foreach my $cat (@cat_list) { if ($debug) { print("CAT=$cat; EVENT STATE=$event_state; HEX=$event_hex; STR=$str x\n"); } $category{$cat}->{$event_state}->{value} = hex($event_hex); $category{$cat}->{$event_state}->{string} = $str; } } } } return 0; } #################################### # Print h file's static leading text #################################### sub print_copywrite(*) { my ( $file_handle ) = @_; print $file_handle < */ /******************************************************************* * WARNING! This file is auto-magically generated by: * $0. * Do not change this file manually. Update script instead *******************************************************************/ EOF return 0; } ####################################### # Print header file static leading text ####################################### sub print_hfile_header(*$) { my ( $filehandle, $filename ) = @_; my $hdef_name = $filename; $hdef_name =~ tr/a-z/A-Z/; $hdef_name =~ s/\./_/g; print $filehandle < #include #include EOF return 0; } #################################### # Print xfile's static leading text #################################### sub print_xfile_header { print FILE_X < #include EOF return 0; } ########################################## # Print xfile header's static leading text ########################################## sub print_xhfile_header { print FILE_XH < #include #include #include #define BAD_ENUM_VALUE -1 int main(int argc, char **argv) { char *expected_str; char *str; EOF return 0; } ############################################ # Print xtestcase file's static leading text ############################################ sub print_xtestfile_header { print XFILE_TEST < #include #include #include int main(int argc, char **argv) { char *expected_str; SaErrorT err; SaHpiEventStateT event_state, expected_state; SaHpiEventCategoryT event_cat, expected_cat; SaHpiTextBufferT buffer; #define BAD_EVENT 0xFFFF EOF return 0; } ############################## # Beautify SaHpi typedef names ############################## sub beautify_type_name($) { my ($name) = @_; $name =~ s/^Sa//; # Strip off beginning Sa - for SaErrorT $name =~ s/^Hpi//; # Strip off beginning Hpi - for rest of SaHpi types $name =~ s/T$//; # Strip off trailing T $name = lc($name); # Lower case name return $name; } ############################### # Print h file's func prototype ############################### sub print_hfile_func($$) { my( $type, $max ) = @_; my $pretty_type = beautify_type_name($type); my $lookup_name = "oh_lookup_" . "$pretty_type"; my $encode_name = "oh_encode_" . "$pretty_type"; my $map_name = "oh_" . "$pretty_type" . "_map"; my $upper_pretty_type = uc($pretty_type); my $max_name = "OH_MAX_" . "$upper_pretty_type"; my $array_name = "$pretty_type" . "_strings[$max_name]"; print FILE_H <Data string, generated by $lookup_name(), back * into an $type type. * * Returns: * $type value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if \@buffer or \@type is NULL or \@buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if \@buffer->Data is invalid. **/ SaErrorT $encode_name(SaHpiTextBufferT *buffer, $type *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == \'\\0\') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; i<$max_name; i++) { if (strcasecmp((char *)buffer->Data, $array_member.str) == 0) { found++; break; } } if (found) { *type = $array_member.entity_type; } else { return($ret); } return(SA_OK); } EOF return 0; } ################################ # Print testcase file's testcase ################################ sub print_testfile_case($$) { my( $type, $case ) = @_; my $pretty_type = beautify_type_name($type); my $lookup_name = "oh_lookup_" . "$pretty_type"; my $encode_name = "oh_encode_" . "$pretty_type"; my $casestr = beautify_enum_name($type, $case); print FILE_TEST < ################################################################# use strict; #eval "exec /usr/bin/perl -S $0 $*" # if $Shell_cannot_understand; #! $0 =~ /[^\/]+$/ ; # get the name of this program my $program = $&; my $sflag = 0; my $strname = "eventxml"; while($_ = $ARGV[0], /^-/){ # get options shift; if (/^-s$/) { $sflag = 1; $strname = $ARGV[0]; shift; } elsif (/^-s(.*)/) { $sflag = 1; $strname = $1; } else { print stderr "$program: convert text to C program string...\n"; print stderr " Usage: $program -s strname ] { textfile }\n"; exit 0; } } print <){ chop; s/\\/\\\\/g; s/\t/\\t/g; s/\"/\\"/g; print "\t\"$_\\n\"\n"; } print "\t\"\\0\"\n"; print "};\n"; print "\n"; openhpi-3.6.1/scripts/Makefile.am0000644000175100017510000000321312575647264015717 0ustar mohanmohan# # Copyright (c) 2003, Intel Corporation # (C) Copyright IBM Corp 2003-2006 # All rights reserved. # # Redistribution and use in source and binary forms, with or # without modification, are permitted provided that the following # conditions are met: # # Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the distribution. # # Neither the name of Intel Corporation nor the names # of its contributors may be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, # OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # EXTRA_DIST = SaHpi2code.pl text2cstr.pl SUBDIRS = test MAINTAINERCLEANFILES = Makefile.in

GCOV Execution Analysis for $title

The left column is the number of times the code was executed during the unit test suites.

END } sub make_html_tail { return <
Exec CodeLine #
END } sub set_status { my $exec = shift; if($exec eq "-") { return "na"; } elsif($exec eq "#####") { return "notexec"; } elsif($exec < 10) { return "low"; } else { return "good"; } } sub make_html_body { my $lines = shift; my $html; my $linecount = 1; foreach my $line (@$lines) { my $status = set_status($line->{exec}); my $exec = ($status eq "na") ? " " : $line->{exec} + 0; my $data = $line->{data}; $data =~ s{<(\S+)\@(.*?)\.(net|com)>}{< address removed >}ig; $data = encode_entities($data); $html .= "

$exec 
$data
$linecount